ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8uY3ZzaWdub3JlCmluZGV4IGRhNjNhOGYuLmNiMDg3ODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5jdnNpZ25vcmUKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLmN2c2lnbm9yZQpAQCAtMSwyICsxLDMgQEAKIGJpbgotYW50YmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorYW50YmluCitqZHRDb21waWxlckFkYXB0ZXIuamFyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucwppbmRleCA5YzRlZmJkLi4yMTFhMGYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucwpAQCAtMSw3MiArMSw4NCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNpbmcgZm9yIG9yZy5lY2xpcHNlLmpkdC5jb3JlIHBsdWdpbgotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWc9dHJ1ZQotCi0jIFJlcG9ydHMgYnVmZmVyIG1hbmFnZXIgYWN0aXZpdHkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1ZmZlcm1hbmFnZXI9ZmFsc2UKLQotIyBSZXBvcnRzIGluY3JlbWVudGFsIGJ1aWxkZXIgYWN0aXZpdHkgOiBuYXR1cmUgb2YgYnVpbGQsIGJ1aWx0IHN0YXRlIHJlYWRpbmcsIGluZGljdG1lbnQgcHJvY2Vzcwotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlcj1mYWxzZQotIAotIyBSZXBvcnRzIGNvbXBpbGVyIGFjdGl2aXR5Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlcj1mYWxzZQotCi0jIFJlcG9ydHMgY29kZWFzc2lzdCBjb21wbGV0aW9uIGFjdGl2aXR5IDogcmVjb3ZlcmVkIHVuaXQsIGluZmVycmVkIGNvbXBsZXRpb25zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uPWZhbHNlCi0KLSMgUmVwb3J0cyBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6YXRpb24sIGFuZCBjbGFzc3BhdGggY29udGFpbmVyIHJlc29sdXRpb24KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbj1mYWxzZQotCi0jIFJlcG9ydHMgaW50ZXJuYWxzIG9mIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiwgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgcmVzb2x1dGlvbiAodG8gYmUgdXNlZCBvbiB0aGUgSkRUL0NvcmUgdGVhbSByZXF1ZXN0IG9ubHkpCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb24vYWR2YW5jZWQ9ZmFsc2UKLQotIyBSZXBvcnQgdHlwZSBoaWVyYXJjaHkgY29ubmVjdGlvbnMsIHJlZnJlc2hlcyBhbmQgZGVsdGFzCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9oaWVyYXJjaHk9ZmFsc2UKLQotIyBSZXBvcnRzIGJhY2tncm91bmQgaW5kZXhlciBhY3Rpdml0eTogaW5kZXhpbmcsIHNhdmluZyBpbmRleCBmaWxlLCBpbmRleCBxdWVyaWVzCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9pbmRleG1hbmFnZXI9ZmFsc2UKLQotIyBQcmludCBub3RpZmllZCBKYXZhIGVsZW1lbnQgZGVsdGFzCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGE9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlPWZhbHNlCi0KLSMgUmVwb3J0cyB2YXJpb3VzIEphdmEgbW9kZWwgYWN0aXZpdGllcwotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsPWZhbHNlCi0KLSMgUmVwb3J0cyBKYXZhIG1vZGVsIGVsZW1lbnRzIG9wZW5pbmcvY2xvc2luZwotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsL2NhY2hlPWZhbHNlCi0KLSMgUmVwb3J0cyBwb3N0IGFjdGlvbnMgYWRkaXRpb24vcnVuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uPWZhbHNlCi0KLSMgUmVwb3J0cyBuYW1lIHJlc29sdXRpb24gYWN0aXZpdHkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3Jlc29sdXRpb249ZmFsc2UKLQotIyBSZXBvcnRzIGphdmEgc2VhcmNoIGFjdGl2aXR5Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2g9ZmFsc2UKLQotIyBSZXBvcnRzIHNvdXJjZSBtYXBwZXIgYWN0aXZpdHkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NvdXJjZW1hcHBlcj1mYWxzZQotCi0jIFJlcG9ydHMgb3BlbiBvbiBzZWxlY3Rpb24gYWN0aXZpdHkgOiByZWNvdmVyZWQgdW5pdCwgaW5mZXJyZWQgc2VsZWN0aW9uCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWxlY3Rpb249ZmFsc2UKLQotIyBSZXBvcnRzIGFjY2VzcyB0byB6aXAgYW5kIGphciBmaWxlcyB0aHJvdWdoIHRoZSBKYXZhIG1vZGVsCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3M9ZmFsc2UKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIHBlcmZvcm0gY29kZSBjb21wbGV0aW9uLgotb3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9jb21wbGV0aW9uPTMwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gcGVyZm9ybSBjb2RlIHNlbGVjdGlvbi4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvc2VsZWN0aW9uPTMwMAotCi0jIFJlcG9ydHMgdGhlIHRpbWUgdG8gcHJvY2VzcyBhIGphdmEgZWxlbWVudCBkZWx0YS4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvamF2YWRlbHRhbGlzdGVuZXI9NTAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBwZXJmb3JtIGFuIGluaXRpYWxpemF0aW9uIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgotb3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi92YXJpYWJsZWluaXRpYWxpemVyPTUwMDAKLQotIyBSZXBvcnRzIHRoZSB0aW1lIHRvIHBlcmZvcm0gYW4gaW5pdGlhbGl6YXRpb24gb2YgYSBjbGFzc3BhdGggY29udGFpbmVyLgotb3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9jb250YWluZXJpbml0aWFsaXplcj01MDAwCi0KLSMgUmVwb3J0cyB0aGUgdGltZSB0byBwZXJmb3JtIGEgcmVjb25jaWxlIG9wZXJhdGlvbi4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvcmVjb25jaWxlPTEwMDAKKyMgVHVybiBvbiBkZWJ1ZyB0cmFjaW5nIGZvciBvcmcuZWNsaXBzZS5qZHQuY29yZSBwbHVnaW4NCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zz10cnVlDQorDQorIyBSZXBvcnRzIGJ1ZmZlciBtYW5hZ2VyIGFjdGl2aXR5DQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVmZmVybWFuYWdlcj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBqYXZhICBidWlsZGVyIGFjdGl2aXR5IDogbmF0dXJlIG9mIGJ1aWxkLCBidWlsdCBzdGF0ZSByZWFkaW5nLCBpbmRpY3RtZW50IHByb2Nlc3MNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWlsZGVyPWZhbHNlDQorDQorIyBSZXBvcnRzIGphdmEgYnVpbGRlciBzdGF0cw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXIvc3RhdHM9ZmFsc2UNCisNCisjIFJlcG9ydHMgY29tcGlsZXIgYWN0aXZpdHkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlcj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBjb2RlYXNzaXN0IGNvbXBsZXRpb24gYWN0aXZpdHkgOiByZWNvdmVyZWQgdW5pdCwgaW5mZXJyZWQgY29tcGxldGlvbnMNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uPWZhbHNlDQorDQorIyBSZXBvcnRzIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiwgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgcmVzb2x1dGlvbg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBpbnRlcm5hbHMgb2YgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLCBhbmQgY2xhc3NwYXRoIGNvbnRhaW5lciByZXNvbHV0aW9uICh0byBiZSB1c2VkIG9uIHRoZSBKRFQvQ29yZSB0ZWFtIHJlcXVlc3Qgb25seSkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb24vYWR2YW5jZWQ9ZmFsc2UNCisNCisjIFJlcG9ydHMgZmFpbHVyZXMgZHVyaW5nIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiwgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgcmVzb2x1dGlvbg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbi9mYWlsdXJlPWZhbHNlDQorDQorIyBSZXBvcnQgdHlwZSBoaWVyYXJjaHkgY29ubmVjdGlvbnMsIHJlZnJlc2hlcyBhbmQgZGVsdGFzDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5PWZhbHNlDQorDQorIyBSZXBvcnRzIGJhY2tncm91bmQgaW5kZXhlciBhY3Rpdml0eTogaW5kZXhpbmcsIHNhdmluZyBpbmRleCBmaWxlLCBpbmRleCBxdWVyaWVzDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyPWZhbHNlDQorDQorIyBSZXBvcnRzIGludGVybmFscyBvZiBpbmRleGVyIGFjdGl2aXR5ICh0byBiZSB1c2VkIG9uIHRoZSBKRFQvQ29yZSB0ZWFtIHJlcXVlc3Qgb25seSkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9pbmRleG1hbmFnZXIvYWR2YW5jZWQ9ZmFsc2UNCisNCisjIFByaW50IG5vdGlmaWVkIEphdmEgZWxlbWVudCBkZWx0YXMNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGE9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEvdmVyYm9zZT1mYWxzZQ0KKw0KKyMgUmVwb3J0cyB2YXJpb3VzIEphdmEgbW9kZWwgYWN0aXZpdGllcw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbD1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBKYXZhIG1vZGVsIGVsZW1lbnRzIG9wZW5pbmcvY2xvc2luZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbC9jYWNoZT1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBwb3N0IGFjdGlvbnMgYWRkaXRpb24vcnVuDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcG9zdGFjdGlvbj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBuYW1lIHJlc29sdXRpb24gYWN0aXZpdHkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9yZXNvbHV0aW9uPWZhbHNlDQorDQorIyBSZXBvcnRzIGphdmEgc2VhcmNoIGFjdGl2aXR5DQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoPWZhbHNlDQorDQorIyBSZXBvcnRzIHNvdXJjZSBtYXBwZXIgYWN0aXZpdHkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zb3VyY2VtYXBwZXI9ZmFsc2UNCisNCisjIFJlcG9ydHMgY29kZSBmb3JtYXR0ZXIgYWN0aXZpdHkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9mb3JtYXR0ZXI9ZmFsc2UNCisNCisjIFJlcG9ydHMgb3BlbiBvbiBzZWxlY3Rpb24gYWN0aXZpdHkgOiByZWNvdmVyZWQgdW5pdCwgaW5mZXJyZWQgc2VsZWN0aW9uDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VsZWN0aW9uPWZhbHNlDQorDQorIyBSZXBvcnRzIGFjY2VzcyB0byB6aXAgYW5kIGphciBmaWxlcyB0aHJvdWdoIHRoZSBKYXZhIG1vZGVsDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzPWZhbHNlDQorDQorIyBSZXBvcnRzIHRoZSB0aW1lIHRvIHBlcmZvcm0gY29kZSBjb21wbGV0aW9uLg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvY29tcGxldGlvbj0zMDANCisNCisjIFJlcG9ydHMgdGhlIHRpbWUgdG8gcGVyZm9ybSBjb2RlIHNlbGVjdGlvbi4NCitvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL3NlbGVjdGlvbj0zMDANCisNCisjIFJlcG9ydHMgdGhlIHRpbWUgdG8gcHJvY2VzcyBhIGphdmEgZWxlbWVudCBkZWx0YS4NCitvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL2phdmFkZWx0YWxpc3RlbmVyPTUwMA0KKw0KKyMgUmVwb3J0cyB0aGUgdGltZSB0byBwZXJmb3JtIGFuIGluaXRpYWxpemF0aW9uIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvdmFyaWFibGVpbml0aWFsaXplcj01MDAwDQorDQorIyBSZXBvcnRzIHRoZSB0aW1lIHRvIHBlcmZvcm0gYW4gaW5pdGlhbGl6YXRpb24gb2YgYSBjbGFzc3BhdGggY29udGFpbmVyLg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvY29udGFpbmVyaW5pdGlhbGl6ZXI9NTAwMA0KKw0KKyMgUmVwb3J0cyB0aGUgdGltZSB0byBwZXJmb3JtIGEgcmVjb25jaWxlIG9wZXJhdGlvbi4NCitvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL3JlY29uY2lsZT0xMDAwDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ucHJvamVjdAppbmRleCAyMGQ5OWRhLi42MzEyMWYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8ucHJvamVjdAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ucHJvamVjdApAQCAtMSw3ICsxLDkgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlX3NoYWRvd3NfSEVBRDwvbmFtZT4KKwk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KIAk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CiAJPGJ1aWxkU3BlYz4KIAkJPGJ1aWxkQ29tbWFuZD4KIAkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgpAQCAtMTgsOSArMjAsMTUgQEAKIAkJCTxhcmd1bWVudHM+CiAJCQk8L2FyZ3VtZW50cz4KIAkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CiAJPC9idWlsZFNwZWM+CiAJPG5hdHVyZXM+CiAJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgogCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+CiAJPC9uYXR1cmVzPgogPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg4ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiB2ZXJzaW9uPSIyIj4KKyAgICA8cmVzb3VyY2UgcGF0aD0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9Im5ldyBBUElzIGFkZGVkIGZvciBidWcgMjg3MTY0IiBpZD0iOTI0ODQ0MDM5Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iMy43LjIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iMy43LjEiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9Im1vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlciI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0ibmV3IEFQSXMgYWRkZWQgZm9yIGJ1ZyAyODcxNjQgcG9zdCAzLjcuMSIgaWQ9IjEyMTAwNTY3MDciPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSIzLjYuNCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJPVVRQVVRfT1ZFUkxBUFBJTkdfU09VUkNFIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJtb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMiPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9Im5ldyBBUElzIGFkZGVkIGZvciBidWcgMjg3MTY0IHBvc3QgMy43LjEiIGlkPSIxMjEwMDU2NzA3Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iMy42LjQiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJtb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0ibmV3IEFQSXMgYWRkZWQgZm9yIGJ1ZyAyODcxNjQgcG9zdCAzLjcuMSIgaWQ9IjExNDI5NDc4NDMiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSIzLjYuNCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJDT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCAyZmY0MzkzLi40NjVlODYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDggKzEsOSBAQAotI1R1ZSBBcHIgMjQgMDY6Mjk6MzYgQ0VTVCAyMDA3CisjV2VkIEZlYiAwMiAxMToyNTowOCBFU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwuc3ZuLwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCkBAIC0xNiwxNyArMTcsMjYgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZApAQCAtMzUsMzYgKzQ1LDMxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb249ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMworb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5wcmVmcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2Q3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNXZWQgRmViIDAyIDExOjI1OjA4IEVTVCAyMDExCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUkVGX1NUUklDVExZX0NPTVBBVElCTEVfSlJFX05PVF9BVkFJTEFCTEU9ZXJyb3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDJlOTZjNzEuLjAyMGYwYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw0ICsxLDQgQEAKLSNNb24gTWFyIDA1IDAxOjE5OjE0IENFVCAyMDA3CisjVHVlIEphbiAwNSAxMjoyOTozNSBFU1QgMjAxMAogY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCiBjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKIGNsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQpAQCAtNDcsMyArNDcsNTkgQEAKIGNsZWFudXBfcHJvZmlsZT1fTnVtYmF0CiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQorZm9ybWF0dGVyX3Byb2ZpbGU9X0pkdGNvcmUgW2J1aWx0LWluICsgSW5kZW50IHN3aXRjaCBib2R5ICsgTGluZVdpZHRoXDoxMjBdCitmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQorc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitzcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz1mYWxzZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT1mYWxzZQorc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorc3BfY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK3NwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKK3NwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPWZhbHNlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK3NwX2NsZWFudXAudXBkYXRlX2libV9jb3B5cmlnaHRfdG9fY3VycmVudF95ZWFyPXRydWUKK3NwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc1MzZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMucHJlZnMKQEAgLTAsMCArMSw5NCBAQAorI0ZyaSBNYXkgMjEgMTA6MjQ6MDcgRURUIDIwMTAKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRF9XSVRIT1VUX0RFRkFVTFRfVkFMVUU9RXJyb3IKK0FOTk9UQVRJT05fRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitBTk5PVEFUSU9OX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQU5OT1RBVElPTl9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9BUElfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9SRUVYUE9SVEVEX0FQSV9UWVBFPUVycm9yCitBUElfQ09NUE9ORU5UX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1JFRVhQT1JURURfVFlQRT1FcnJvcgorQVBJX0NPTVBPTkVOVF9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfTUVUSE9EPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfUkVTVFJJQ1RJT05TPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfREVDUkVBU0VfQUNDRVNTPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfQ0hBTkdFRF9OT05fQUJTVFJBQ1RfVE9fQUJTVFJBQ1Q9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX0NIQU5HRURfVFlQRV9DT05WRVJTSU9OPUVycm9yCitDTEFTU19FTEVNRU5UX1RZUEVfUkVNT1ZFRF9DT05TVFJVQ1RPUj1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfRklFTEQ9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfU1VQRVJDTEFTUz1FcnJvcgorQ0xBU1NfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0NMQVNTX0VMRU1FTlRfVFlQRV9SRU1PVkVEX1RZUEVfUEFSQU1FVEVSPUVycm9yCitDT05TVFJVQ1RPUl9FTEVNRU5UX1RZUEVfQURERURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0NPTlNUUlVDVE9SX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX0NIQU5HRURfVkFSQVJHU19UT19BUlJBWT1FcnJvcgorQ09OU1RSVUNUT1JfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK0VOVU1fRUxFTUVOVF9UWVBFX0NIQU5HRURfQ09OVFJBQ1RFRF9TVVBFUklOVEVSRkFDRVNfU0VUPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9FTlVNX0NPTlNUQU5UPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitFTlVNX0VMRU1FTlRfVFlQRV9SRU1PVkVEX01FVEhPRD1FcnJvcgorRU5VTV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX01FTUJFUj1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0FEREVEX1ZBTFVFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9ERUNSRUFTRV9BQ0NFU1M9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0ZJTkFMX1RPX05PTl9GSU5BTF9TVEFUSUNfQ09OU1RBTlQ9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX0NIQU5HRURfTk9OX1NUQVRJQ19UT19TVEFUSUM9RXJyb3IKK0ZJRUxEX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1NUQVRJQ19UT19OT05fU1RBVElDPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9UWVBFPUVycm9yCitGSUVMRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQUxVRT1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9BUkdVTUVOVD1FcnJvcgorRklFTERfRUxFTUVOVF9UWVBFX1JFTU9WRURfVkFMVUU9RXJyb3IKK0lMTEVHQUxfRVhURU5EPVdhcm5pbmcKK0lMTEVHQUxfSU1QTEVNRU5UPVdhcm5pbmcKK0lMTEVHQUxfSU5TVEFOVElBVEU9V2FybmluZworSUxMRUdBTF9PVkVSUklERT1XYXJuaW5nCitJTExFR0FMX1JFRkVSRU5DRT1XYXJuaW5nCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX0FEREVEX01FVEhPRD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9SRVNUUklDVElPTlM9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfQURERURfU1VQRVJfSU5URVJGQUNFX1dJVEhfTUVUSE9EUz1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0NPTlRSQUNURURfU1VQRVJJTlRFUkZBQ0VTX1NFVD1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9DSEFOR0VEX1RZUEVfQ09OVkVSU0lPTj1FcnJvcgorSU5URVJGQUNFX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0ZJRUxEPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfTUVUSE9EPUVycm9yCitJTlRFUkZBQ0VfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9NRU1CRVI9RXJyb3IKK0lOVEVSRkFDRV9FTEVNRU5UX1RZUEVfUkVNT1ZFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorSU5WQUxJRF9KQVZBRE9DX1RBRz1XYXJuaW5nCitJTlZBTElEX1JFRkVSRU5DRV9JTl9TWVNURU1fTElCUkFSSUVTPVdhcm5pbmcKK0xFQUtfRVhURU5EPVdhcm5pbmcKK0xFQUtfRklFTERfREVDTD1XYXJuaW5nCitMRUFLX0lNUExFTUVOVD1XYXJuaW5nCitMRUFLX01FVEhPRF9QQVJBTT1XYXJuaW5nCitMRUFLX01FVEhPRF9SRVRVUk5fVFlQRT1XYXJuaW5nCitNRVRIT0RfRUxFTUVOVF9UWVBFX0FEREVEX1JFU1RSSUNUSU9OUz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9BRERFRF9UWVBFX1BBUkFNRVRFUj1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0RFQ1JFQVNFX0FDQ0VTUz1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9BQlNUUkFDVF9UT19BQlNUUkFDVD1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9GSU5BTF9UT19GSU5BTD1FcnJvcgorTUVUSE9EX0VMRU1FTlRfVFlQRV9DSEFOR0VEX05PTl9TVEFUSUNfVE9fU1RBVElDPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX0NIQU5HRURfU1RBVElDX1RPX05PTl9TVEFUSUM9RXJyb3IKK01FVEhPRF9FTEVNRU5UX1RZUEVfQ0hBTkdFRF9WQVJBUkdTX1RPX0FSUkFZPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX1JFTU9WRURfQU5OT1RBVElPTl9ERUZBVUxUX1ZBTFVFPUVycm9yCitNRVRIT0RfRUxFTUVOVF9UWVBFX1JFTU9WRURfVFlQRV9QQVJBTUVURVI9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9BRERFRF9DTEFTU19CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0FEREVEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX0NIQU5HRURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9DSEFOR0VEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVFlQRV9QQVJBTUVURVJfRUxFTUVOVF9UWVBFX1JFTU9WRURfQ0xBU1NfQk9VTkQ9RXJyb3IKK1RZUEVfUEFSQU1FVEVSX0VMRU1FTlRfVFlQRV9SRU1PVkVEX0lOVEVSRkFDRV9CT1VORD1FcnJvcgorVU5VU0VEX1BST0JMRU1fRklMVEVSUz1XYXJuaW5nCithdXRvbWF0aWNhbGx5X3JlbW92ZWRfdW51c2VkX3Byb2JsZW1fZmlsdGVycz1mYWxzZQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb249RXJyb3IKK2luY29tcGF0aWJsZV9hcGlfY29tcG9uZW50X3ZlcnNpb25faW5jbHVkZV9tYWpvcl93aXRob3V0X2JyZWFraW5nX2NoYW5nZT1EaXNhYmxlZAoraW5jb21wYXRpYmxlX2FwaV9jb21wb25lbnRfdmVyc2lvbl9pbmNsdWRlX21pbm9yX3dpdGhvdXRfYXBpX2NoYW5nZT1EaXNhYmxlZAoraW52YWxpZF9zaW5jZV90YWdfdmVyc2lvbj1FcnJvcgorbWFsZm9ybWVkX3NpbmNlX3RhZz1FcnJvcgorbWlzc2luZ19zaW5jZV90YWc9RXJyb3IKK3JlcG9ydF9hcGlfYnJlYWthZ2Vfd2hlbl9tYWpvcl92ZXJzaW9uX2luY3JlbWVudGVkPURpc2FibGVkCityZXBvcnRfcmVzb2x1dGlvbl9lcnJvcnNfYXBpX2NvbXBvbmVudD1XYXJuaW5nCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJiNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDM1IEBACisjRnJpIE1heSAyMSAxMDoyNDowOCBFRFQgMjAxMAorY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCitjb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCitjb21waWxlcnMucC5idWlsZD0xCitjb21waWxlcnMucC5idWlsZC5iaW4uaW5jbHVkZXM9MQorY29tcGlsZXJzLnAuYnVpbGQuZW5jb2RpbmdzPTIKK2NvbXBpbGVycy5wLmJ1aWxkLmphdmEuY29tcGlsZXI9MgorY29tcGlsZXJzLnAuYnVpbGQuamF2YS5jb21wbGlhbmNlPTIKK2NvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTIKK2NvbXBpbGVycy5wLmJ1aWxkLm91dHB1dC5saWJyYXJ5PTIKK2NvbXBpbGVycy5wLmJ1aWxkLnNvdXJjZS5saWJyYXJ5PTIKK2NvbXBpbGVycy5wLmJ1aWxkLnNyYy5pbmNsdWRlcz0xCitjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKK2NvbXBpbGVycy5wLmludGVybmFsPTEKK2NvbXBpbGVycy5wLm1pc3NpbmctYnVuZGxlLWNsYXNzcGF0aC1lbnRyaWVzPTIKK2NvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTIKK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0yCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tcmVxdWlyZS1idW5kbGU9MgorY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKK2NvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKK2NvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKK2NvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQorY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKK2NvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKK2NvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCitjb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYworY29tcGlsZXJzLnMub3Blbi10YWdzPTEKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBiMDA4Y2RiLi4wZDlhYTBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMiArMywxMyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZHQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4zLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogMy43LjIucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZQogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamR0LmNvcmUsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIsCisgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYmF0Y2gsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLAogIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLAogIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwsCkBAIC0yMyw4ICsyNCw4IEBACiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sLG9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUiLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sLG9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKKyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSxvcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzIiwKKyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlLG9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMiLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIsCkBAIC0zMiw5ICszMywxMCBAQAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5kaWFnbm9zZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUiLAorIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUsb3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLnRvb2wsb3JnLmVjbGlwc2UucGRlLmFwaS50b29scyIsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSxvcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzIiwKKyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUsb3JnLmVjbGlwc2UucGRlLmFwaS50b29scyIsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGU7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5ldmFsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5O3gtaW50ZXJuYWw6PXRydWUsCkBAIC00NCw3ICs0Niw3IEBACiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3Npbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlLG9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMiLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlcjt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuYWxpZ247eC1pbnRlcm5hbDo9dHJ1ZSwKQEAgLTU1LDYgKzU3LDYgQEAKICBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjEuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLnRlYW0uY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMS4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKIEVjbGlwc2UtRXh0ZW5zaWJsZUFQSTogdHJ1ZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hYm91dC5odG1sCmluZGV4IGRkNGExMzMuLmM1ZWFiMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Fib3V0Lmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYWJvdXQuaHRtbApAQCAtOCw3ICs4LDcgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+TWF5IDExLCAyMDA2PC9wPgkKKzxwPk1hcmNoIDE3LCAyMDExPC9wPgogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2hlY2tEZWJ1Z0F0dHJpYnV0ZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2hlY2tEZWJ1Z0F0dHJpYnV0ZXMuamF2YQppbmRleCBjZDBmNDVlLi44NWRiMDcxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NoZWNrRGVidWdBdHRyaWJ1dGVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9DaGVja0RlYnVnQXR0cmlidXRlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMjUsMTQgKzI2LDE0IEBACiAvKioKICAqIDxwPkFuIEFudCB0YXNrIHRvIGZpbmQgb3V0IGlmIGEgY2xhc3MgZmlsZSBvciBhIGphciBjb250YWlucyBkZWJ1ZyBhdHRyaWJ1dGVzLiBJZiB0aGlzIGlzIHRoZSBjYXNlLAogICogdGhlIHByb3BlcnR5IGNvbnRhaW5zIHRoZSB2YWx1ZSAiaGFzIGRlYnVnIiBhZnRlciB0aGUgY2FsbC4KLSAqIDwvcD4gCisgKiA8L3A+CiAgKiA8cD4KICAqIDxjb2RlPiZsdDtlY2xpcHNlLmNoZWNrRGVidWdBdHRyaWJ1dGVzIHByb3BlcnR5PSJoYXNEZWJ1ZyIgZmlsZT0iJHtiYXNlZGlyfS9iaW4vcC9BLmNsYXNzIi8mZ3Q7PC9jb2RlPgogICogPC9wPgogICogPHA+CiAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBBbnQgY2hlY2sgb3V0IHRoZSB3ZWJzaXRlIGF0IGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50LyAuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IHVzZXJzLgogICogQHNpbmNlIDIuMAogICovCkBAIC00MCw3ICs0MSw3IEBACiAKIAlwcml2YXRlIFN0cmluZyBmaWxlOwogCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCQorCiAJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAJCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEFudEFkYXB0ZXJNZXNzYWdlcy5nZXRTdHJpbmcoImNoZWNrRGVidWdBdHRyaWJ1dGVzLmZpbGUuYXJndW1lbnQuY2Fubm90LmJlLm51bGwiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTUwLDggKzUxLDE2IEBACiAJCX0KIAkJdHJ5IHsKIAkJCWJvb2xlYW4gaGFzRGVidWdBdHRyaWJ1dGVzID0gZmFsc2U7Ci0JCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZSh0aGlzLmZpbGUpKSB7Ci0JCQkJWmlwRmlsZSBqYXJGaWxlID0gbmV3IFppcEZpbGUodGhpcy5maWxlKTsKKwkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZSh0aGlzLmZpbGUpKSB7CisJCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKHRoaXMuZmlsZSwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOworCQkJCWhhc0RlYnVnQXR0cmlidXRlcyA9IGNoZWNrQ2xhc3NGaWxlKGNsYXNzRmlsZVJlYWRlcik7CisJCQl9IGVsc2UgeworCQkJCVppcEZpbGUgamFyRmlsZSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJamFyRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuZmlsZSk7CisJCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEFudEFkYXB0ZXJNZXNzYWdlcy5nZXRTdHJpbmcoImNoZWNrRGVidWdBdHRyaWJ1dGVzLmZpbGUuYXJndW1lbnQubXVzdC5iZS5hLmNsYXNzZmlsZS5vci5hLmphcmZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CiAJCQkJZm9yIChFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7ICFoYXNEZWJ1Z0F0dHJpYnV0ZXMgJiYgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKTsgKSB7CiAJCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CiAJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShlbnRyeS5nZXROYW1lKCkpKSB7CkBAIC01OSwxMSArNjgsNiBAQAogCQkJCQkJaGFzRGVidWdBdHRyaWJ1dGVzID0gY2hlY2tDbGFzc0ZpbGUoY2xhc3NGaWxlUmVhZGVyKTsKIAkJCQkJfQogCQkJCX0KLQkJCX0gZWxzZSBpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUodGhpcy5maWxlKSkgewotCQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcih0aGlzLmZpbGUsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCQloYXNEZWJ1Z0F0dHJpYnV0ZXMgPSBjaGVja0NsYXNzRmlsZShjbGFzc0ZpbGVSZWFkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oQW50QWRhcHRlck1lc3NhZ2VzLmdldFN0cmluZygiY2hlY2tEZWJ1Z0F0dHJpYnV0ZXMuZmlsZS5hcmd1bWVudC5tdXN0LmJlLmEuY2xhc3NmaWxlLm9yLmEuamFyZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJaWYgKGhhc0RlYnVnQXR0cmlidXRlcykgewogCQkJCWdldFByb2plY3QoKS5zZXRVc2VyUHJvcGVydHkodGhpcy5wcm9wZXJ0eSwgImhhcyBkZWJ1ZyIpOyAvLyROT04tTkxTLTEkCkBAIC03MiwxNCArNzYsMTQgQEAKIAkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihBbnRBZGFwdGVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJjaGVja0RlYnVnQXR0cmlidXRlcy5pb2V4Y2VwdGlvbi5vY2N1cmVkIikgKyB0aGlzLmZpbGUpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gY2hlY2tDbGFzc0ZpbGUoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIpIHsKIAkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kSW5mb3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvc1tpXS5nZXRDb2RlQXR0cmlidXRlKCk7CiAJCQlpZiAoY29kZUF0dHJpYnV0ZSAhPSBudWxsICYmIGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCisJCQl9CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTg3LDcgKzkxLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyB2YWx1ZSkgewogCQl0aGlzLmZpbGUgPSB2YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgdmFsdWUpIHsKIAkJdGhpcy5wcm9wZXJ0eSA9IHZhbHVlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvSkRUQ29tcGlsZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0pEVENvbXBpbGVyQWRhcHRlci5qYXZhCmluZGV4IDRkOTNlOWUuLjk2NmUxNzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvSkRUQ29tcGlsZXJBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9KRFRDb21waWxlckFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00Nyw3ICs0Nyw3IEBACiAgKiA8cD4KICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEFudCBjaGVjayBvdXQgdGhlIHdlYnNpdGUgYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvIC4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGNsYXNzIEpEVENvbXBpbGVyQWRhcHRlciBleHRlbmRzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgewpAQCAtNjEsNyArNjEsNyBAQAogCXByaXZhdGUgTWFwIGZpbGVFbmNvZGluZ3MgPSBudWxsOwogCXByaXZhdGUgTWFwIGRpckVuY29kaW5ncyA9IG51bGw7CiAJcHJpdmF0ZSBMaXN0IGFjY2Vzc1J1bGVzID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFBlcmZvcm1zIGEgY29tcGlsZSB1c2luZyB0aGUgSkRUIGJhdGNoIGNvbXBpbGVyCiAJICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnl0aGluZyB3cm9uZyBoYXBwZW4gZHVyaW5nIHRoZSBjb21waWxhdGlvbgpAQCAtODgsMTQgKzg4LDE0IEBACiAJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogCQl9CiAJfQotCQotCQorCisKIAlwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBKYXZhY0NvbW1hbmQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogCQlDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKIAkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKS5nZXRNYXAoKTsKLQkJCisKIAkJQ2xhc3MgamF2YWNDbGFzcyA9IEphdmFjLmNsYXNzOwotCQkKKwogCQkvKgogCQkgKiBSZWFkIGluIHRoZSBjb21waWxlciBhcmd1bWVudHMgZmlyc3Qgc2luY2Ugd2UgbWlnaHQgbmVlZCB0byBtb2RpZnkKIAkJICogdGhlIGNsYXNzcGF0aCBpZiBhbnkgYWNjZXNzIHJ1bGVzIHdlcmUgc3BlY2lmaWVkCkBAIC0xMDMsMTA2ICsxMDMsMTA2IEBACiAJCVN0cmluZyBbXSBjb21waWxlckFyZ3MgPSBwcm9jZXNzQ29tcGlsZXJBcmd1bWVudHMoamF2YWNDbGFzcyk7CiAKIAkJLyoKLQkJICogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBuZXZlciBleGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFudCB0YXNrLiAKKwkJICogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBuZXZlciBleGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFudCB0YXNrLgogCQkgKi8KIAkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ub0V4aXQiKTsgLy8kTk9OLU5MUy0xJAogCi0gICAgICAgIGlmICh0aGlzLmJvb3RjbGFzc3BhdGggIT0gbnVsbCkgeworCQlpZiAodGhpcy5ib290Y2xhc3NwYXRoICE9IG51bGwpIHsKIAkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAlpZiAodGhpcy5ib290Y2xhc3NwYXRoLnNpemUoKSAhPSAwKSB7Ci0gICAgCQkJLyoKLSAgICAJCQkgKiBTZXQgdGhlIGJvb3RjbGFzc3BhdGggZm9yIHRoZSBFY2xpcHNlIGNvbXBpbGVyLgotICAgIAkJCSAqLwotICAgIAkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgodGhpcy5ib290Y2xhc3NwYXRoKTsKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoVXRpbC5FTVBUWV9TVFJJTkcpOwotICAgICAgICAJfQotICAgICAgICB9CisJCQlpZiAodGhpcy5ib290Y2xhc3NwYXRoLnNpemUoKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGJvb3RjbGFzc3BhdGggZm9yIHRoZSBFY2xpcHNlIGNvbXBpbGVyLgorCQkJCSAqLworCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgodGhpcy5ib290Y2xhc3NwYXRoKTsKKwkJCX0gZWxzZSB7CisJCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoVXRpbC5FTVBUWV9TVFJJTkcpOworCQkJfQorCQl9CiAKLSAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBuZXcgUGF0aCh0aGlzLnByb2plY3QpOwotCi0gICAgICAgLyoKLSAgICAgICAgICogRWNsaXBzZSBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgLWV4dGRpcnMuCi0gICAgICAgICAqIEl0IGlzIGVtdWxhdGVkIHVzaW5nIHRoZSBjbGFzc3BhdGguIFdlIGFkZCBleHRkaXJzIGVudHJpZXMgYWZ0ZXIgdGhlIAotICAgICAgICAgKiBib290Y2xhc3NwYXRoLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRoaXMuZXh0ZGlycyAhPSBudWxsKSB7CisJCS8qCisJCSAqIEVjbGlwc2UgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IC1leHRkaXJzLgorCQkgKiBJdCBpcyBlbXVsYXRlZCB1c2luZyB0aGUgY2xhc3NwYXRoLiBXZSBhZGQgZXh0ZGlycyBlbnRyaWVzIGFmdGVyIHRoZQorCQkgKiBib290Y2xhc3NwYXRoLgorCQkgKi8KKwkJaWYgKHRoaXMuZXh0ZGlycyAhPSBudWxsKSB7CiAJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWV4dGRpcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aCh0aGlzLmV4dGRpcnMpOyAgICAgICAgCQotICAgICAgICB9CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKHRoaXMuZXh0ZGlycyk7CisJCX0KIAorCQlQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHRoaXMucHJvamVjdCk7CiAJCS8qCiAJCSAqIFRoZSBqYXZhIHJ1bnRpbWUgaXMgYWxyZWFkeSBoYW5kbGVkLCBzbyB3ZSBzaW1wbHkgd2FudCB0byByZXRyaWV2ZSB0aGUKIAkJICogYW50IHJ1bnRpbWUgYW5kIHRoZSBjb21waWxlIGNsYXNzcGF0aC4KIAkJICovCi0gICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoZ2V0Q29tcGlsZUNsYXNzcGF0aCgpKTsKLQotICAgICAgICAvLyBGb3IgLXNvdXJjZXBhdGgsIHVzZSB0aGUgInNvdXJjZXBhdGgiIHZhbHVlIGlmIHByZXNlbnQuCi0gICAgICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSAic3JjZGlyIiB2YWx1ZS4KLSAgICAgICAgUGF0aCBzb3VyY2VwYXRoID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIHJldHJpZXZlIHRoZSBtZXRob2QgZ2V0U291cmNlcGF0aCgpIHVzaW5nIHJlZmxlY3QKLSAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIGltcHJvdmUgdGhlIGNvbXBhdGliaWxpdHkgdG8gYW50IDEuNQotICAgICAgICBNZXRob2QgZ2V0U291cmNlcGF0aE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0JICAgICAgICBnZXRTb3VyY2VwYXRoTWV0aG9kID0gamF2YWNDbGFzcy5nZXRNZXRob2QoImdldFNvdXJjZXBhdGgiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvLyBpZiBub3QgZm91bmQsIHRoZW4gd2UgY2Fubm90IHVzZSB0aGlzIG1ldGhvZCAoYW50IDEuNSkKLSAgICAgICAgfQotICAgICAgICBQYXRoIGNvbXBpbGVTb3VyY2VQYXRoID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFNvdXJjZXBhdGhNZXRob2QgIT0gbnVsbCkgewotCSAJCXRyeSB7Ci0JCQkJY29tcGlsZVNvdXJjZVBhdGggPSAoUGF0aCkgZ2V0U291cmNlcGF0aE1ldGhvZC5pbnZva2UodGhpcy5hdHRyaWJ1dGVzLCBudWxsKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcGlsZVNvdXJjZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgc291cmNlcGF0aCA9IGNvbXBpbGVTb3VyY2VQYXRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc291cmNlcGF0aCA9IHRoaXMuc3JjOwotICAgICAgICB9Ci0JCWNsYXNzcGF0aC5hcHBlbmQoc291cmNlcGF0aCk7CisJCWNsYXNzcGF0aC5hcHBlbmQoZ2V0Q29tcGlsZUNsYXNzcGF0aCgpKTsKIAkJLyoKIAkJICogU2V0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBFY2xpcHNlIGNvbXBpbGVyLgogCQkgKi8KIAkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAogCQljcmVhdGVDbGFzc3BhdGhBcmd1bWVudChjbWQsIGNsYXNzcGF0aCk7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGphdmFWZXJzaW9uID0gSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uKCk7CisJCS8vIEZvciAtc291cmNlcGF0aCwgdXNlIHRoZSAic291cmNlcGF0aCIgdmFsdWUgaWYgcHJlc2VudC4KKwkJLy8gT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlICJzcmNkaXIiIHZhbHVlLgorCQlQYXRoIHNvdXJjZXBhdGggPSBudWxsOworCisJCS8vIHJldHJpZXZlIHRoZSBtZXRob2QgZ2V0U291cmNlcGF0aCgpIHVzaW5nIHJlZmxlY3QKKwkJLy8gVGhpcyBpcyBkb25lIHRvIGltcHJvdmUgdGhlIGNvbXBhdGliaWxpdHkgdG8gYW50IDEuNQorCQlNZXRob2QgZ2V0U291cmNlcGF0aE1ldGhvZCA9IG51bGw7CisJCXRyeSB7CisJCQlnZXRTb3VyY2VwYXRoTWV0aG9kID0gamF2YWNDbGFzcy5nZXRNZXRob2QoImdldFNvdXJjZXBhdGgiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZiBub3QgZm91bmQsIHRoZW4gd2UgY2Fubm90IHVzZSB0aGlzIG1ldGhvZCAoYW50IDEuNSkKKwkJfQorCQlQYXRoIGNvbXBpbGVTb3VyY2VQYXRoID0gbnVsbDsKKwkJaWYgKGdldFNvdXJjZXBhdGhNZXRob2QgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQljb21waWxlU291cmNlUGF0aCA9IChQYXRoKSBnZXRTb3VyY2VwYXRoTWV0aG9kLmludm9rZSh0aGlzLmF0dHJpYnV0ZXMsIG51bGwpOworCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJfQorCQl9CisJCWlmIChjb21waWxlU291cmNlUGF0aCAhPSBudWxsKSB7CisJCQlzb3VyY2VwYXRoID0gY29tcGlsZVNvdXJjZVBhdGg7CisJCX0gZWxzZSB7CisJCQlzb3VyY2VwYXRoID0gdGhpcy5zcmM7CisJCX0KKwkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zb3VyY2VwYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJY3JlYXRlQ2xhc3NwYXRoQXJndW1lbnQoY21kLCBzb3VyY2VwYXRoKTsKKworCQlmaW5hbCBTdHJpbmcgamF2YVZlcnNpb24gPSBKYXZhRW52VXRpbHMuZ2V0SmF2YVZlcnNpb24oKTsKIAkJU3RyaW5nIG1lbW9yeVBhcmFtZXRlclByZWZpeCA9IGphdmFWZXJzaW9uLmVxdWFscyhKYXZhRW52VXRpbHMuSkFWQV8xXzEpID8gIi1KLSIgOiAiLUotWCI7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKHRoaXMubWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCF0aGlzLmF0dHJpYnV0ZXMuaXNGb3JrZWRKYXZhYygpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmxvZyhBbnRBZGFwdGVyTWVzc2FnZXMuZ2V0U3RyaW5nKCJhbnQuamR0YWRhcHRlci5pbmZvLmlnbm9yaW5nTWVtb3J5SW5pdGlhbFNpemUiKSwgUHJvamVjdC5NU0dfV0FSTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobWVtb3J5UGFyYW1ldGVyUHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXMiICsgdGhpcy5tZW1vcnlJbml0aWFsU2l6ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlpZiAodGhpcy5tZW1vcnlJbml0aWFsU2l6ZSAhPSBudWxsKSB7CisJCQlpZiAoIXRoaXMuYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKKwkJCQl0aGlzLmF0dHJpYnV0ZXMubG9nKEFudEFkYXB0ZXJNZXNzYWdlcy5nZXRTdHJpbmcoImFudC5qZHRhZGFwdGVyLmluZm8uaWdub3JpbmdNZW1vcnlJbml0aWFsU2l6ZSIpLCBQcm9qZWN0Lk1TR19XQVJOKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShtZW1vcnlQYXJhbWV0ZXJQcmVmaXgKKwkJCQkJCSsgIm1zIiArIHRoaXMubWVtb3J5SW5pdGlhbFNpemUpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KIAotICAgICAgICBpZiAodGhpcy5tZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMubG9nKEFudEFkYXB0ZXJNZXNzYWdlcy5nZXRTdHJpbmcoImFudC5qZHRhZGFwdGVyLmluZm8uaWdub3JpbmdNZW1vcnlNYXhpbXVtU2l6ZSIpLCBQcm9qZWN0Lk1TR19XQVJOKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShtZW1vcnlQYXJhbWV0ZXJQcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJteCIgKyB0aGlzLm1lbW9yeU1heGltdW1TaXplKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmICh0aGlzLm1lbW9yeU1heGltdW1TaXplICE9IG51bGwpIHsKKwkJCWlmICghdGhpcy5hdHRyaWJ1dGVzLmlzRm9ya2VkSmF2YWMoKSkgeworCQkJCXRoaXMuYXR0cmlidXRlcy5sb2coQW50QWRhcHRlck1lc3NhZ2VzLmdldFN0cmluZygiYW50LmpkdGFkYXB0ZXIuaW5mby5pZ25vcmluZ01lbW9yeU1heGltdW1TaXplIiksIFByb2plY3QuTVNHX1dBUk4pOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG1lbW9yeVBhcmFtZXRlclByZWZpeAorCQkJCQkJKyAibXgiICsgdGhpcy5tZW1vcnlNYXhpbXVtU2l6ZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQogCi0gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7Ci0JICAgICAgIC8vIHJldHJpZXZlIHRoZSBtZXRob2QgZ2V0U291cmNlcGF0aCgpIHVzaW5nIHJlZmxlY3QKLQkgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBpbXByb3ZlIHRoZSBjb21wYXRpYmlsaXR5IHRvIGFudCAxLjUKLQkgICAgICAgIE1ldGhvZCBnZXREZWJ1Z0xldmVsTWV0aG9kID0gbnVsbDsKLQkgICAgICAgIHRyeSB7Ci0JCSAgICAgICAgZ2V0RGVidWdMZXZlbE1ldGhvZCA9IGphdmFjQ2xhc3MuZ2V0TWV0aG9kKCJnZXREZWJ1Z0xldmVsIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIH0gY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIAkvLyBpZiBub3QgZm91bmQsIHRoZW4gd2UgY2Fubm90IHVzZSB0aGlzIG1ldGhvZCAoYW50IDEuNSkKLQkgICAgICAgIAkvLyBkZWJ1ZyBsZXZlbCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIGFudCAxLjUueAotCSAgICAgICAgfQotICAgICAJICAgIFN0cmluZyBkZWJ1Z0xldmVsID0gbnVsbDsKLQkgICAgICAgIGlmIChnZXREZWJ1Z0xldmVsTWV0aG9kICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuZGVidWcpIHsKKwkJCS8vIHJldHJpZXZlIHRoZSBtZXRob2QgZ2V0U291cmNlcGF0aCgpIHVzaW5nIHJlZmxlY3QKKwkJCS8vIFRoaXMgaXMgZG9uZSB0byBpbXByb3ZlIHRoZSBjb21wYXRpYmlsaXR5IHRvIGFudCAxLjUKKwkJCU1ldGhvZCBnZXREZWJ1Z0xldmVsTWV0aG9kID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZ2V0RGVidWdMZXZlbE1ldGhvZCA9IGphdmFjQ2xhc3MuZ2V0TWV0aG9kKCJnZXREZWJ1Z0xldmVsIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZiBub3QgZm91bmQsIHRoZW4gd2UgY2Fubm90IHVzZSB0aGlzIG1ldGhvZCAoYW50IDEuNSkKKwkJCQkvLyBkZWJ1ZyBsZXZlbCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIGFudCAxLjUueAorCQkJfQorCQkJU3RyaW5nIGRlYnVnTGV2ZWwgPSBudWxsOworCQkJaWYgKGdldERlYnVnTGV2ZWxNZXRob2QgIT0gbnVsbCkgewogCQkJCXRyeSB7CiAJCQkJCWRlYnVnTGV2ZWwgPSAoU3RyaW5nKSBnZXREZWJ1Z0xldmVsTWV0aG9kLmludm9rZSh0aGlzLmF0dHJpYnV0ZXMsIG51bGwpOwogCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CiAJCQkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KIAkJCQl9Ci0gICAgICAgIAl9CisJCQl9CiAJCQlpZiAoZGVidWdMZXZlbCAhPSBudWxsKSB7CiAJCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLCBDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKIAkJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsIENvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwpAQCAtMjMwLDE4ICsyMzAsMTggQEAKIAkJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CiAJCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLCBDb21waWxlck9wdGlvbnMuR0VORVJBVEUpOwogCQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSAsIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisJCQl9CisJCX0gZWxzZSB7CiAJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsIENvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwogCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLCBDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKIAkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSAsIENvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwotICAgICAgICB9Ci0gICAgCQorCQl9CisKIAkJLyoKIAkJICogSGFuZGxlIHRoZSBub3dhcm4gb3B0aW9uLiBJZiBub25lLCB0aGVuIHdlIGdlbmVyYXRlIGFsbCB3YXJuaW5ncy4KIAkJICovCiAJCWlmICh0aGlzLmF0dHJpYnV0ZXMuZ2V0Tm93YXJuKCkpIHsKLQkgICAgICAgIC8vIGRpc2FibGUgYWxsIHdhcm5pbmdzCisJCQkvLyBkaXNhYmxlIGFsbCB3YXJuaW5ncwogCQkJT2JqZWN0W10gZW50cmllcyA9IHRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMuZW50cnlTZXQoKS50b0FycmF5KCk7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW50cmllcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVudHJpZXNbaV07CkBAIC0yNTUsMjMgKzI1NSwyMyBAQAogCQkJfQogCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXNrVGFncywgVXRpbC5FTVBUWV9TVFJJTkcpOwogCQkJaWYgKHRoaXMuZGVwcmVjYXRpb24pIHsKLQkJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCBDb21waWxlck9wdGlvbnMuV0FSTklORyk7IAotCQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLCBDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7IAotCQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsIENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEKTsgCisJCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLCBDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwgQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOwogCQkJfQogCQl9IGVsc2UgaWYgKHRoaXMuZGVwcmVjYXRpb24pIHsKLQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sIENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsgCi0JCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwgQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOyAKLQkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsIENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEKTsgCisJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCBDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwgQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOworCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwgQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOwogCQl9IGVsc2UgewotCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7IAotCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGUsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7IAotCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsgCisJCQl0aGlzLmN1c3RvbURlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCXRoaXMuY3VzdG9tRGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKIAkJfQogCi0JICAgCS8qCisJCS8qCiAJCSAqIGRlc3REaXIgb3B0aW9uLgotCQkgKi8JCQorCQkgKi8KIAkJaWYgKHRoaXMuZGVzdERpciAhPSBudWxsKSB7CiAJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWQiKTsgLy8kTk9OLU5MUy0xJAogCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZSh0aGlzLmRlc3REaXIuZ2V0QWJzb2x1dGVGaWxlKCkpOwpAQCAtMzAyLDIwICszMDIsMTIgQEAKIAkJICogc291cmNlIG9wdGlvbgogCQkgKi8KIAkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuYXR0cmlidXRlcy5nZXRTb3VyY2UoKTsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisJCWlmIChzb3VyY2UgIT0gbnVsbCkgewogCQkJdGhpcy5jdXN0b21EZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsIHNvdXJjZSk7Ci0gICAgICAgIH0KLQotCQkvKgotCQkgKiBlbmNvZGluZyBvcHRpb24KLQkJICovCi0gICAgICAgIGlmICh0aGlzLmVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGhpcy5lbmNvZGluZyk7Ci0gICAgICAgIH0KKwkJfQogCiAJCWlmIChjb21waWxlckFyZ3MgIT0gbnVsbCkgewotCSAgICAgICAgLyoKKwkJCS8qCiAJCQkgKiBBZGQgZXh0cmEgYXJndW1lbnQgb24gdGhlIGNvbW1hbmQgbGluZQogCQkJICovCiAJCQlmaW5hbCBpbnQgbGVuZ3RoID0gY29tcGlsZXJBcmdzLmxlbmd0aDsKQEAgLTMyNSwxOSArMzE3LDI4IEBACiAJCQkJCWlmICh0aGlzLmxvZ0ZpbGVOYW1lID09IG51bGwgJiYgIi1sb2ciLmVxdWFscyhhcmcpICYmICgoaSArIDEpIDwgbWF4KSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCQl0aGlzLmxvZ0ZpbGVOYW1lID0gY29tcGlsZXJBcmdzW2kgKyAxXTsKIAkJCQkJfQotCQkJICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOworCQkJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOwogCQkJCX0KIAkJCX0KLQkgICAJfQotICAgICAJLyoKKwkJfQorCQkvKgorCQkgKiBlbmNvZGluZyBvcHRpb24uIGphdmFjIHRhc2sgZW5jb2RpbmcgcHJvcGVydHkgbXVzdCBiZSB0aGUgbGFzdCBlbmNvZGluZyBvbiB0aGUgY29tbWFuZAorCQkgKiBsaW5lIGFzIGNvbXBpbGVyIGFyZyBtaWdodCBhbHNvIHNwZWNpZnkgYW4gZW5jb2RpbmcuCisJCSAqLworCQlpZiAodGhpcy5lbmNvZGluZyAhPSBudWxsKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRoaXMuZW5jb2RpbmcpOworCQl9CisKKwkJLyoKIAkJICogRWNsaXBzZSBjb21waWxlciBkb2Vzbid0IGhhdmUgYSAtc291cmNlcGF0aCBvcHRpb24uIFRoaXMgaXMKIAkJICogaGFuZGxlZCB0aHJvdWdoIHRoZSBqYXZhYyB0YXNrIHRoYXQgY29sbGVjdHMgYWxsIHNvdXJjZSBmaWxlcyBpbgogCQkgKiBzcmNkaXIgb3B0aW9uLgotCQkgKi8gICAgICAgIAotICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOwotICAgICAgICByZXR1cm4gY21kOworCQkgKi8KKwkJbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKwkJcmV0dXJuIGNtZDsKIAl9Ci0JCisKIAkvKioKIAkgKiBHZXQgdGhlIGNvbXBpbGVyIGFyZ3VtZW50cwogCSAqIEBwYXJhbSBqYXZhY0NsYXNzCkBAIC0zODgsOCArMzg5LDggQEAKIAkJCQkJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShjb250ZW50W2VuZF0pKSB7CiAJCQkJCQkJZW5kLS07CiAJCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIGVuZCBpcyBpbmNsdXNpdmUsIGJ1dCBpbiB0aGUgQVBJIGVuZCBpcyBleGNsdXNpdmUgCisKKwkJCQkJCS8vIGVuZCBpcyBpbmNsdXNpdmUsIGJ1dCBpbiB0aGUgQVBJIGVuZCBpcyBleGNsdXNpdmUKIAkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhBREFQVEVSX0VOQ09ESU5HLCBjb250ZW50LCBzdGFydCwgc3RhcnQgKyBBREFQVEVSX0VOQ09ESU5HLmxlbmd0aCkpIHsKIAkJCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoY29udGVudCwgU0VQQVJBVE9SX0NIQVJTLCBGaWxlLnNlcGFyYXRvckNoYXIsIHN0YXJ0LCBlbmQgKyAxKTsKIAkJCQkJCQkvLyBmaWxlIG9yIGZvbGRlciBsZXZlbCBjdXN0b20gZW5jb2RpbmcKQEAgLTQwMSwxNCArNDAyLDE0IEBACiAJCQkJCQkJCVN0cmluZyBzdHIgPSBTdHJpbmcudmFsdWVPZihjb250ZW50LCBzdGFydCwgZW5jb2RlU3RhcnQgLSBzdGFydCk7CiAJCQkJCQkJCVN0cmluZyBlbmMgPSBTdHJpbmcudmFsdWVPZihjb250ZW50LCBlbmNvZGVTdGFydCwgZW5kIC0gZW5jb2RlU3RhcnQgKyAxKTsKIAkJCQkJCQkJaWYgKGlzRmlsZSkgewotCQkJCQkJCQkJaWYgKGZpbGVFbmNvZGluZ3MgPT0gbnVsbCkKLQkJCQkJCQkJCQlmaWxlRW5jb2RpbmdzID0gbmV3IEhhc2hNYXAoKTsKKwkJCQkJCQkJCWlmICh0aGlzLmZpbGVFbmNvZGluZ3MgPT0gbnVsbCkKKwkJCQkJCQkJCQl0aGlzLmZpbGVFbmNvZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwogCQkJCQkJCQkJLy91c2UgRmlsZSB0byB0cmFuc2xhdGUgdGhlIHN0cmluZyBpbnRvIGEgcGF0aCB3aXRoIHRoZSBjb3JyZWN0IEZpbGUuc2VwZXJhdG9yCi0JCQkJCQkJCQlmaWxlRW5jb2RpbmdzLnB1dChzdHIsIGVuYyk7CisJCQkJCQkJCQl0aGlzLmZpbGVFbmNvZGluZ3MucHV0KHN0ciwgZW5jKTsKIAkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChkaXJFbmNvZGluZ3MgPT0gbnVsbCkKLQkJCQkJCQkJCQlkaXJFbmNvZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJCQkJZGlyRW5jb2RpbmdzLnB1dChzdHIsIGVuYyk7CisJCQkJCQkJCQlpZiAodGhpcy5kaXJFbmNvZGluZ3MgPT0gbnVsbCkKKwkJCQkJCQkJCQl0aGlzLmRpckVuY29kaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisJCQkJCQkJCQl0aGlzLmRpckVuY29kaW5ncy5wdXQoc3RyLCBlbmMpOwogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhBREFQVEVSX0FDQ0VTUywgY29udGVudCwgc3RhcnQsIHN0YXJ0ICsgQURBUFRFUl9BQ0NFU1MubGVuZ3RoKSkgewpAQCAtNDE5LDEwICs0MjAsMTAgQEAKIAkJCQkJCQlpZiAoc3RhcnQgPCBhY2Nlc3NTdGFydCAmJiBhY2Nlc3NTdGFydCA8IGVuZCkgewogCQkJCQkJCQlTdHJpbmcgcGF0aCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQsIHN0YXJ0LCBhY2Nlc3NTdGFydCAtIHN0YXJ0KTsKIAkJCQkJCQkJU3RyaW5nIGFjY2VzcyA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQsIGFjY2Vzc1N0YXJ0LCBlbmQgLSBhY2Nlc3NTdGFydCArIDEpOwotCQkJCQkJCQlpZiAoYWNjZXNzUnVsZXMgPT0gbnVsbCkKLQkJCQkJCQkJCWFjY2Vzc1J1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlhY2Nlc3NSdWxlcy5hZGQocGF0aCk7Ci0JCQkJCQkJCWFjY2Vzc1J1bGVzLmFkZChhY2Nlc3MpOworCQkJCQkJCQlpZiAodGhpcy5hY2Nlc3NSdWxlcyA9PSBudWxsKQorCQkJCQkJCQkJdGhpcy5hY2Nlc3NSdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJCQkJdGhpcy5hY2Nlc3NSdWxlcy5hZGQocGF0aCk7CisJCQkJCQkJCXRoaXMuYWNjZXNzUnVsZXMuYWRkKGFjY2Vzcyk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJb2Zmc2V0ID0gZW5kOwpAQCAtNDM0LDcgKzQzNSw3IEBACiAJCX0KIAogCX0KLQkKKwogCS8qKgogCSAqIENvcHkgdGhlIGNsYXNzcGF0aCB0byB0aGUgY29tbWFuZCBsaW5lIHdpdGggYWNjZXNzIHJ1bGVzIGluY2x1ZGVkLgogCSAqIEBwYXJhbSBjbWQgdGhlIGdpdmVuIGNvbW1hbmQgbGluZQpAQCAtNDUxLDEzICs0NTIsMTMgQEAKIAkJfQogCiAJCS8vIG5vIGFjY2VzcyBydWxlcywgY2FuIHNldCB0aGUgcGF0aCBkaXJlY3RseQotCQlpZiAoYWNjZXNzUnVsZXMgPT0gbnVsbCkgeworCQlpZiAodGhpcy5hY2Nlc3NSdWxlcyA9PSBudWxsKSB7CiAJCQlhcmcuc2V0UGF0aChjbGFzc3BhdGgpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJaW50IHJ1bGVzTGVuZ3RoID0gYWNjZXNzUnVsZXMuc2l6ZSgpOwotCQlTdHJpbmdbXSBydWxlcyA9IChTdHJpbmdbXSkgYWNjZXNzUnVsZXMudG9BcnJheShuZXcgU3RyaW5nW3J1bGVzTGVuZ3RoXSk7CisJCWludCBydWxlc0xlbmd0aCA9IHRoaXMuYWNjZXNzUnVsZXMuc2l6ZSgpOworCQlTdHJpbmdbXSBydWxlcyA9IChTdHJpbmdbXSkgdGhpcy5hY2Nlc3NSdWxlcy50b0FycmF5KG5ldyBTdHJpbmdbcnVsZXNMZW5ndGhdKTsKIAkJaW50IG5leHRSdWxlID0gMDsKIAkJZmluYWwgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIApAQCAtNTAxLDE4ICs1MDIsMTggQEAKIAkJYXJnLnNldFZhbHVlKHJlc3VsdC50b1N0cmluZygpKTsKIAl9CiAJLyoqCi0JICogTW9kaWZpZWQgZnJvbSBiYXNlIGNsYXNzLCBMb2dzIHRoZSBjb21waWxhdGlvbiBwYXJhbWV0ZXJzLCBhZGRzIHRoZSBmaWxlcyAKKwkgKiBNb2RpZmllZCBmcm9tIGJhc2UgY2xhc3MsIExvZ3MgdGhlIGNvbXBpbGF0aW9uIHBhcmFtZXRlcnMsIGFkZHMgdGhlIGZpbGVzCiAJICogdG8gY29tcGlsZSBhbmQgbG9ncyB0aGUgJnF1b3Q7bmljZVNvdXJjZUxpc3QmcXVvdDsKIAkgKiBBcHBlbmRzIGVuY29kaW5nIGluZm9ybWF0aW9uIGF0IHRoZSBlbmQgb2YgYXJndW1lbnRzCi0JICogCisJICoKIAkgKiBAcGFyYW0gY21kIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShDb21tYW5kbGluZSBjbWQpIHsKLQkJYXR0cmlidXRlcy5sb2coIkNvbXBpbGF0aW9uICIgKyBjbWQuZGVzY3JpYmVBcmd1bWVudHMoKSwgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmF0dHJpYnV0ZXMubG9nKCJDb21waWxhdGlvbiAiICsgY21kLmRlc2NyaWJlQXJndW1lbnRzKCksIC8vJE5PTi1OTFMtMSQKIAkJCQlQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAogCQlTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbXBpbGVMaXN0Lmxlbmd0aCAhPSAxKSB7CisJCWlmICh0aGlzLmNvbXBpbGVMaXN0Lmxlbmd0aCAhPSAxKSB7CiAJCQluaWNlU291cmNlTGlzdC5hcHBlbmQoInMiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCW5pY2VTb3VyY2VMaXN0LmFwcGVuZCgiIHRvIGJlIGNvbXBpbGVkOiIpOyAvLyROT04tTkxTLTEkCkBAIC01MjAsMTUgKzUyMSwxNSBAQAogCiAJCVN0cmluZ1tdIGVuY29kZWRGaWxlcyA9IG51bGwsIGVuY29kZWREaXJzID0gbnVsbDsKIAkJaW50IGVuY29kZWRGaWxlc0xlbmd0aCA9IDAsIGVuY29kZWREaXJzTGVuZ3RoID0gMDsKLQkJaWYgKGZpbGVFbmNvZGluZ3MgIT0gbnVsbCkgewotCQkJZW5jb2RlZEZpbGVzTGVuZ3RoID0gZmlsZUVuY29kaW5ncy5zaXplKCk7CisJCWlmICh0aGlzLmZpbGVFbmNvZGluZ3MgIT0gbnVsbCkgeworCQkJZW5jb2RlZEZpbGVzTGVuZ3RoID0gdGhpcy5maWxlRW5jb2RpbmdzLnNpemUoKTsKIAkJCWVuY29kZWRGaWxlcyA9IG5ldyBTdHJpbmdbZW5jb2RlZEZpbGVzTGVuZ3RoXTsKLQkJCWZpbGVFbmNvZGluZ3Mua2V5U2V0KCkudG9BcnJheShlbmNvZGVkRmlsZXMpOworCQkJdGhpcy5maWxlRW5jb2RpbmdzLmtleVNldCgpLnRvQXJyYXkoZW5jb2RlZEZpbGVzKTsKIAkJfQotCQlpZiAoZGlyRW5jb2RpbmdzICE9IG51bGwpIHsKLQkJCWVuY29kZWREaXJzTGVuZ3RoID0gZGlyRW5jb2RpbmdzLnNpemUoKTsKKwkJaWYgKHRoaXMuZGlyRW5jb2RpbmdzICE9IG51bGwpIHsKKwkJCWVuY29kZWREaXJzTGVuZ3RoID0gdGhpcy5kaXJFbmNvZGluZ3Muc2l6ZSgpOwogCQkJZW5jb2RlZERpcnMgPSBuZXcgU3RyaW5nW2VuY29kZWREaXJzTGVuZ3RoXTsKLQkJCWRpckVuY29kaW5ncy5rZXlTZXQoKS50b0FycmF5KGVuY29kZWREaXJzKTsKKwkJCXRoaXMuZGlyRW5jb2RpbmdzLmtleVNldCgpLnRvQXJyYXkoZW5jb2RlZERpcnMpOwogCQkJLy93ZSBuZWVkIHRoZSBkaXJlY3RvcmllcyBzb3J0ZWQsIGxvbmdlc3QgZmlyc3Qsc2luY2Ugc3ViIGRpcmVjdG9yaWVzIGNhbgogCQkJLy9vdmVycmlkZSBlbmNvZGluZ3MgZm9yIHRoZWlyIHBhcmVudCBkaXJlY3RvcmllcwogCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7CkBAIC01MzksMTUgKzU0MCwxNSBAQAogCQkJQXJyYXlzLnNvcnQoZW5jb2RlZERpcnMsIGNvbXBhcmF0b3IpOwogCQl9CiAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21waWxlTGlzdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGNvbXBpbGVMaXN0W2ldLmdldEFic29sdXRlUGF0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY29tcGlsZUxpc3QubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBhcmcgPSB0aGlzLmNvbXBpbGVMaXN0W2ldLmdldEFic29sdXRlUGF0aCgpOwogCQkJYm9vbGVhbiBlbmNvZGVkID0gZmFsc2U7CiAJCQlpZiAoZW5jb2RlZEZpbGVzICE9IG51bGwpIHsKIAkJCQkvL2NoZWNrIGZvciBmaWxlIGxldmVsIGN1c3RvbSBlbmNvZGluZwogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW5jb2RlZEZpbGVzTGVuZ3RoOyBqKyspIHsKIAkJCQkJaWYgKGFyZy5lbmRzV2l0aChlbmNvZGVkRmlsZXNbal0pKSB7CiAJCQkJCQkvL2ZvdW5kIGVuY29kaW5nLCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCB0byBzcGVlZCB0aGluZ3MgdXAgbmV4dCB0aW1lIGFyb3VuZAotCQkJCQkJYXJnID0gYXJnICsgKFN0cmluZykgZmlsZUVuY29kaW5ncy5nZXQoZW5jb2RlZEZpbGVzW2pdKTsKKwkJCQkJCWFyZyA9IGFyZyArIChTdHJpbmcpIHRoaXMuZmlsZUVuY29kaW5ncy5nZXQoZW5jb2RlZEZpbGVzW2pdKTsKIAkJCQkJCWlmIChqIDwgZW5jb2RlZEZpbGVzTGVuZ3RoIC0gMSkgewogCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZW5jb2RlZEZpbGVzLCBqICsgMSwgZW5jb2RlZEZpbGVzLCBqLCBlbmNvZGVkRmlsZXNMZW5ndGggLSBqIC0gMSk7CiAJCQkJCQl9CkBAIC01NjEsNyArNTYyLDcgQEAKIAkJCQkvL2NoZWNrIGZvbGRlciBsZXZlbCBjdXN0b20gZW5jb2RpbmcKIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVuY29kZWREaXJzTGVuZ3RoOyBqKyspIHsKIAkJCQkJaWYgKGFyZy5sYXN0SW5kZXhPZihlbmNvZGVkRGlyc1tqXSkgIT0gLTEpIHsKLQkJCQkJCWFyZyA9IGFyZyArIChTdHJpbmcpIGRpckVuY29kaW5ncy5nZXQoZW5jb2RlZERpcnNbal0pOworCQkJCQkJYXJnID0gYXJnICsgKFN0cmluZykgdGhpcy5kaXJFbmNvZGluZ3MuZ2V0KGVuY29kZWREaXJzW2pdKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQpAQCAtNTcwLDYgKzU3MSw2IEBACiAJCQluaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiICsgYXJnICsgbFNlcCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCi0JCWF0dHJpYnV0ZXMubG9nKG5pY2VTb3VyY2VMaXN0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCQl0aGlzLmF0dHJpYnV0ZXMubG9nKG5pY2VTb3VyY2VMaXN0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2FudGFkYXB0ZXIvQW50QWRhcHRlck1lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9hbnRhZGFwdGVyL0FudEFkYXB0ZXJNZXNzYWdlcy5qYXZhCmluZGV4IGM5MjllOWUuLmJhZDlkMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2FudGFkYXB0ZXIvQW50QWRhcHRlck1lc3NhZ2VzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvYW50YWRhcHRlci9BbnRBZGFwdGVyTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw3ICsyMCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5hbnRhZGFwdGVyLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAogCiAJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFOwotCQorCiAJc3RhdGljIHsKIAkJdHJ5IHsKIAkJUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL2JhdGNoL0JhdGNoQ29tcGlsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL2JhdGNoL0JhdGNoQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQwMmNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvYmF0Y2gvQmF0Y2hDb21waWxlci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5Db21waWxhdGlvblByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluOworCisvKioKKyAqIEEgcHVibGljIEFQSSBmb3IgaW52b2tpbmcgdGhlIEVjbGlwc2UgQ29tcGlsZXIgZm9yIEphdmEuIEUuZy4KKyAqIDxwcmU+CisgKiBCYXRjaENvbXBpbGVyLmNvbXBpbGUoIkM6XFxteVNvdXJjZXNcXFguamF2YSAtZCBDOlxcbXlPdXRwdXQiLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSwgbnVsbCk7CisgKiA8L3ByZT4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJhdGNoQ29tcGlsZXIgeworCisJLyoqCisJICogSW52b2tlcyB0aGUgRWNsaXBzZSBDb21waWxlciBmb3IgSmF2YSB3aXRoIHRoZSBnaXZlbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB1c2luZyB0aGUgZ2l2ZW4gd3JpdGVycworCSAqIHRvIHByaW50IG1lc3NhZ2VzLCBhbmQgcmVwb3J0aW5nIHByb2dyZXNzIHRvIHRoZSBnaXZlbiBjb21waWxhdGlvbiBwcm9ncmVzcy4gUmV0dXJucyB3aGV0aGVyCisJICogdGhlIGNvbXBpbGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICogPHA+CisJICogUmVhc29ucyBmb3IgYSBjb21waWxhdGlvbiBmYWlsaW5nIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSBpbmNsdWRlOjwvcD4KKwkgKiA8dWw+CisJICogPGxpPmFuIGVycm9yIHdhcyByZXBvcnRlZDwvbGk+CisJICogPGxpPmEgcnVudGltZSBleGNlcHRpb24gb2NjdXJyZWQ8L2xpPgorCSAqIDxsaT50aGUgY29tcGlsYXRpb24gd2FzIGNhbmNlbGVkIHVzaW5nIHRoZSBjb21waWxhdGlvbiBwcm9ncmVzczwvbGk+CisJICogPC91bD4KKwkgKiA8cD4KKwkgKiBUaGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpcyBkZWZpbmVkIGJ5IHJ1bm5pbmcgdGhlIGJhdGNoIGNvbXBpbGVyJ3MgaGVscAorCSAqIDxwcmU+QmF0Y2hDb21waWxlci5jb21waWxlKCItaGVscCIsIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpLCBudWxsKTs8L3ByZT4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gY29tbWFuZExpbmUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorCSAqIEBwYXJhbSBvdXRXcml0ZXIgdGhlIHdyaXRlciB1c2VkIHRvIHByaW50IHN0YW5kYXJkIG1lc3NhZ2VzCisJICogQHBhcmFtIGVycldyaXRlciB0aGUgd3JpdGVyIHVzZWQgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMKKwkgKiBAcGFyYW0gcHJvZ3Jlc3MgdGhlIG9iamVjdCB0byByZXBvcnQgcHJvZ3Jlc3MgdG8gYW5kIHRvIHByb3ZpZGUgY2FuY2VsbGF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBpcyBuZWVkZWQKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbXBpbGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShTdHJpbmcgY29tbWFuZExpbmUsIFByaW50V3JpdGVyIG91dFdyaXRlciwgUHJpbnRXcml0ZXIgZXJyV3JpdGVyLCBDb21waWxhdGlvblByb2dyZXNzIHByb2dyZXNzKSB7CisJCXJldHVybiBjb21waWxlKE1haW4udG9rZW5pemUoY29tbWFuZExpbmUpLCBvdXRXcml0ZXIsIGVycldyaXRlciwgcHJvZ3Jlc3MpOworCX0KKworCS8qKgorCSAqIEludm9rZXMgdGhlIEVjbGlwc2UgQ29tcGlsZXIgZm9yIEphdmEgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgdXNpbmcgdGhlIGdpdmVuIHdyaXRlcnMKKwkgKiB0byBwcmludCBtZXNzYWdlcywgYW5kIHJlcG9ydGluZyBwcm9ncmVzcyB0byB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gcHJvZ3Jlc3MuIFJldHVybnMgd2hldGhlcgorCSAqIHRoZSBjb21waWxhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqIDxwPgorCSAqIFJlYXNvbnMgZm9yIGEgY29tcGlsYXRpb24gZmFpbGluZyB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgaW5jbHVkZTo8L3A+CisJICogPHVsPgorCSAqIDxsaT5hbiBlcnJvciB3YXMgcmVwb3J0ZWQ8L2xpPgorCSAqIDxsaT5hIHJ1bnRpbWUgZXhjZXB0aW9uIG9jY3VycmVkPC9saT4KKwkgKiA8bGk+dGhlIGNvbXBpbGF0aW9uIHdhcyBjYW5jZWxlZCB1c2luZyB0aGUgY29tcGlsYXRpb24gcHJvZ3Jlc3M8L2xpPgorCSAqIDwvdWw+CisJICogPHA+CisJICogVGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaXMgZGVmaW5lZCBieSBydW5uaW5nIHRoZSBiYXRjaCBjb21waWxlcidzIGhlbHAKKwkgKiA8cHJlPkJhdGNoQ29tcGlsZXIuY29tcGlsZSgiLWhlbHAiLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSwgbnVsbCk7PC9wcmU+CisJICogPC9wPgorCSAqIE5vdGUgdGhhdCBhIDxjb2RlPnRydWU8L2NvZGU+IHJldHVybmVkIHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIGVycm9ycyB3ZXJlIHJlcG9ydGVkLCBubyBydW50aW1lIGV4Y2VwdGlvbnMKKwkgKiBvY2N1cnJlZCBhbmQgdGhhdCB0aGUgY29tcGlsYXRpb24gd2FzIG5vdCBjYW5jZWxlZC4KKwkgKgorCSAqIEBwYXJhbSBjb21tYW5kTGluZUFyZ3VtZW50cyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCisJICogQHBhcmFtIG91dFdyaXRlciB0aGUgd3JpdGVyIHVzZWQgdG8gcHJpbnQgc3RhbmRhcmQgbWVzc2FnZXMKKwkgKiBAcGFyYW0gZXJyV3JpdGVyIHRoZSB3cml0ZXIgdXNlZCB0byBwcmludCBlcnJvciBtZXNzYWdlcworCSAqIEBwYXJhbSBwcm9ncmVzcyB0aGUgb2JqZWN0IHRvIHJlcG9ydCBwcm9ncmVzcyB0byBhbmQgdG8gcHJvdmlkZSBjYW5jZWxsYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIGlzIG5lZWRlZAorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tcGlsYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFN0cmluZ1tdIGNvbW1hbmRMaW5lQXJndW1lbnRzLCBQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlciwgQ29tcGlsYXRpb25Qcm9ncmVzcyBwcm9ncmVzcykgeworCQlyZXR1cm4gTWFpbi5jb21waWxlKGNvbW1hbmRMaW5lQXJndW1lbnRzLCBvdXRXcml0ZXIsIGVycldyaXRlciwgcHJvZ3Jlc3MpOworCX0KKworCXByaXZhdGUgQmF0Y2hDb21waWxlcigpIHsKKwkJLy8gcHJldmVudCBpbnN0YW50aWF0aW9uCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCmluZGV4IDA5M2VlYjkuLmI3YjM2OGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsOSArMTQsMTEgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKQEAgLTI0LDE4ICsyNiwyMSBAQAogCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGlyZWN0b3J5IGV4dGVuZHMgQ2xhc3NwYXRoTG9jYXRpb24gewogCi1wcml2YXRlIGNoYXJbXSBub3JtYWxpemVkUGF0aDsKLXByaXZhdGUgU3RyaW5nIHBhdGg7CiBwcml2YXRlIEhhc2h0YWJsZSBkaXJlY3RvcnlDYWNoZTsKIHByaXZhdGUgU3RyaW5nW10gbWlzc2luZ1BhY2thZ2VIb2xkZXIgPSBuZXcgU3RyaW5nWzFdOwogcHJpdmF0ZSBpbnQgbW9kZTsgLy8gYWJpbGl0eSB0byBvbmx5IGNvbnNpZGVyIG9uZSBraW5kIG9mIGZpbGVzIChzb3VyY2UgdnMuIGJpbmFyaWVzKSwgYnkgZGVmYXVsdCB1c2UgYm90aAogcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7IC8vIG9ubHkgdXNlZnVsIGlmIHJlZmVyZW5jZWQgaW4gdGhlIHNvdXJjZSBwYXRoCiAKLUNsYXNzcGF0aERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgbW9kZSwgCitDbGFzc3BhdGhEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBlbmNvZGluZywgaW50IG1vZGUsCiAJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzUnVsZVNldCwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgewogCXN1cGVyKGFjY2Vzc1J1bGVTZXQsIGRlc3RpbmF0aW9uUGF0aCk7CiAJdGhpcy5tb2RlID0gbW9kZTsKLQl0aGlzLnBhdGggPSBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCk7CisJdHJ5IHsKKwkJdGhpcy5wYXRoID0gZGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCS8vIHNob3VsZCBub3QgaGFwcGVuIGFzIHdlIGtub3cgdGhhdCB0aGUgZmlsZSBleGlzdHMKKwkJdGhpcy5wYXRoID0gZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOworCX0KIAlpZiAoIXRoaXMucGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCiAJCXRoaXMucGF0aCArPSBGaWxlLnNlcGFyYXRvcjsKIAl0aGlzLmRpcmVjdG9yeUNhY2hlID0gbmV3IEhhc2h0YWJsZSgxMSk7CkBAIC04MSw2ICs4Niw5IEBACiAJCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CitwdWJsaWMgTGlzdCBmZXRjaExpbmtlZEphcnMoRmlsZVN5c3RlbS5DbGFzc3BhdGhTZWN0aW9uUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgeworCXJldHVybiBudWxsOworfQogcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoY2hhcltdIHR5cGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSkgewogCXJldHVybiBmaW5kQ2xhc3ModHlwZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSwgZmFsc2UpOwogfQpAQCAtOTQsMjQgKzEwMiwzMyBAQAogCQlTdHJpbmcgZnVsbFNvdXJjZVBhdGggPSB0aGlzLnBhdGggKyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUubGVuZ3RoKCkgLSA2KSAgKyBTVUZGSVhfU1RSSU5HX2phdmE7CiAJCWlmICghYmluYXJ5RXhpc3RzKQogCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIobmV3IENvbXBpbGF0aW9uVW5pdChudWxsLAotCQkJCQlmdWxsU291cmNlUGF0aCwgdGhpcy5lbmNvZGluZywgZGVzdGluYXRpb25QYXRoKSwKKwkJCQkJZnVsbFNvdXJjZVBhdGgsIHRoaXMuZW5jb2RpbmcsIHRoaXMuZGVzdGluYXRpb25QYXRoKSwKIAkJCQkJZmV0Y2hBY2Nlc3NSZXN0cmljdGlvbihxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSkpOwogCQlTdHJpbmcgZnVsbEJpbmFyeVBhdGggPSB0aGlzLnBhdGggKyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZTsKIAkJbG9uZyBiaW5hcnlNb2RpZmllZCA9IG5ldyBGaWxlKGZ1bGxCaW5hcnlQYXRoKS5sYXN0TW9kaWZpZWQoKTsKIAkJbG9uZyBzb3VyY2VNb2RpZmllZCA9IG5ldyBGaWxlKGZ1bGxTb3VyY2VQYXRoKS5sYXN0TW9kaWZpZWQoKTsKIAkJaWYgKHNvdXJjZU1vZGlmaWVkID4gYmluYXJ5TW9kaWZpZWQpCiAJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihuZXcgQ29tcGlsYXRpb25Vbml0KG51bGwsCi0JCQkJCWZ1bGxTb3VyY2VQYXRoLCB0aGlzLmVuY29kaW5nLCBkZXN0aW5hdGlvblBhdGgpLAorCQkJCQlmdWxsU291cmNlUGF0aCwgdGhpcy5lbmNvZGluZywgdGhpcy5kZXN0aW5hdGlvblBhdGgpLAogCQkJCQlmZXRjaEFjY2Vzc1Jlc3RyaWN0aW9uKHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKSk7CiAJfQogCWlmIChiaW5hcnlFeGlzdHMpIHsKIAkJdHJ5IHsKIAkJCUNsYXNzRmlsZVJlYWRlciByZWFkZXIgPSBDbGFzc0ZpbGVSZWFkZXIucmVhZCh0aGlzLnBhdGggKyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxMTE1LCBwYWNrYWdlIG5hbWVzIGFyZSB0byBiZSB0cmVhdGVkIGNhc2Ugc2Vuc2l0aXZlLgorCQkJU3RyaW5nIHR5cGVTZWFyY2hlZCA9IHF1YWxpZmllZFBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCA/IAorCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSArICIvIiArIGZpbGVOYW1lIC8vJE5PTi1OTFMtMSQKKwkJCQkJOiBmaWxlTmFtZTsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSwgdHlwZVNlYXJjaGVkLnRvQ2hhckFycmF5KCkpKSB7CisJCQkJcmVhZGVyID0gbnVsbDsKKwkJCX0KIAkJCWlmIChyZWFkZXIgIT0gbnVsbCkKIAkJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcigKIAkJCQkJCXJlYWRlciwKIAkJCQkJCWZldGNoQWNjZXNzUmVzdHJpY3Rpb24ocXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gdHJlYXQgYXMgaWYgZmlsZSBpcyBtaXNzaW5nCisJCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKIAkJCS8vIHRyZWF0IGFzIGlmIGZpbGUgaXMgbWlzc2luZwogCQl9CiAJfQpAQCAtMTY4LDQgKzE4NSw3IEBACiBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAJcmV0dXJuIHRoaXMucGF0aDsKIH0KK3B1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKKwlyZXR1cm4gdGhpcy5tb2RlOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhCmluZGV4IDU0ZTE0ZDMuLjMzMmNjY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhKYXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoSmFyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsOSArMTIsMTIgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKQEAgLTIzLDI3ICsyNiw3MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuTWFuaWZlc3RBbmFseXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoSmFyIGV4dGVuZHMgQ2xhc3NwYXRoTG9jYXRpb24gewotCQorCiBwcm90ZWN0ZWQgRmlsZSBmaWxlOwogcHJvdGVjdGVkIFppcEZpbGUgemlwRmlsZTsKIHByb3RlY3RlZCBib29sZWFuIGNsb3NlWmlwRmlsZUF0RW5kOwogcHJvdGVjdGVkIEhhc2h0YWJsZSBwYWNrYWdlQ2FjaGU7Ci1wcm90ZWN0ZWQgY2hhcltdIG5vcm1hbGl6ZWRQYXRoOwogCi1wdWJsaWMgQ2xhc3NwYXRoSmFyKEZpbGUgZmlsZSwgYm9vbGVhbiBjbG9zZVppcEZpbGVBdEVuZCwgCitwdWJsaWMgQ2xhc3NwYXRoSmFyKEZpbGUgZmlsZSwgYm9vbGVhbiBjbG9zZVppcEZpbGVBdEVuZCwKIAkJQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0LCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB7CiAJc3VwZXIoYWNjZXNzUnVsZVNldCwgZGVzdGluYXRpb25QYXRoKTsKIAl0aGlzLmZpbGUgPSBmaWxlOwogCXRoaXMuY2xvc2VaaXBGaWxlQXRFbmQgPSBjbG9zZVppcEZpbGVBdEVuZDsKIH0KKworcHVibGljIExpc3QgZmV0Y2hMaW5rZWRKYXJzKEZpbGVTeXN0ZW0uQ2xhc3NwYXRoU2VjdGlvblByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsKKwkvLyBleHBlY3RlZCB0byBiZSBjYWxsZWQgb25jZSBvbmx5IC0gaWYgbXVsdGlwbGUgY2FsbHMgZGVzaXJlZCwgY29uc2lkZXIKKwkvLyB1c2luZyBhIGNhY2hlCisJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworCXRyeSB7CisJCWluaXRpYWxpemUoKTsKKwkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJWmlwRW50cnkgbWFuaWZlc3QgPSB0aGlzLnppcEZpbGUuZ2V0RW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsgLy8gbm9uLW51bGwgaW1wbGllcyByZWd1bGFyIGZpbGUKKwkJCWlucHV0U3RyZWFtID0gdGhpcy56aXBGaWxlLmdldElucHV0U3RyZWFtKG1hbmlmZXN0KTsKKwkJCU1hbmlmZXN0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgTWFuaWZlc3RBbmFseXplcigpOworCQkJYm9vbGVhbiBzdWNjZXNzID0gYW5hbHl6ZXIuYW5hbHl6ZU1hbmlmZXN0Q29udGVudHMoaW5wdXRTdHJlYW0pOworCQkJTGlzdCBjYWxsZWRGaWxlTmFtZXMgPSBhbmFseXplci5nZXRDYWxsZWRGaWxlTmFtZXMoKTsKKwkJCWlmIChwcm9ibGVtUmVwb3J0ZXIgIT0gbnVsbCkgeworCQkJCWlmICghc3VjY2VzcyB8fCBhbmFseXplci5nZXRDbGFzc3BhdGhTZWN0aW9uc0NvdW50KCkgPT0gMSAmJiAgY2FsbGVkRmlsZU5hbWVzID09IG51bGwpIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyLmludmFsaWRDbGFzc3BhdGhTZWN0aW9uKGdldFBhdGgoKSk7CisJCQkJfSBlbHNlIGlmIChhbmFseXplci5nZXRDbGFzc3BhdGhTZWN0aW9uc0NvdW50KCkgPiAxKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlci5tdWx0aXBsZUNsYXNzcGF0aFNlY3Rpb25zKGdldFBhdGgoKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGNhbGxlZEZpbGVOYW1lcyAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3IgY2FsbGVkRmlsZXNJdGVyYXRvciA9IGNhbGxlZEZpbGVOYW1lcy5pdGVyYXRvcigpOworCQkJCVN0cmluZyBkaXJlY3RvcnlQYXRoID0gZ2V0UGF0aCgpOworCQkJCWludCBsYXN0U2VwYXJhdG9yID0gZGlyZWN0b3J5UGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworCQkJCWRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9yICsgMSk7IC8vIHBvdGVudGlhbGx5IGVtcHR5IChzZWUgYnVnIDIxNDczMSkKKwkJCQl3aGlsZSAoY2FsbGVkRmlsZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJcmVzdWx0LmFkZChuZXcgQ2xhc3NwYXRoSmFyKG5ldyBGaWxlKGRpcmVjdG9yeVBhdGggKyAoU3RyaW5nKSBjYWxsZWRGaWxlc0l0ZXJhdG9yLm5leHQoKSksIHRoaXMuY2xvc2VaaXBGaWxlQXRFbmQsIHRoaXMuYWNjZXNzUnVsZVNldCwgdGhpcy5kZXN0aW5hdGlvblBhdGgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCXJldHVybiBudWxsOworCX0gZmluYWxseSB7CisJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gYmVzdCBlZmZvcnQKKwkJCX0KKwkJfQorCX0KK30KIHB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKGNoYXJbXSB0eXBlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKIAlyZXR1cm4gZmluZENsYXNzKHR5cGVOYW1lLCBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUsIGZhbHNlKTsKIH0KIHB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKGNoYXJbXSB0eXBlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUsIGJvb2xlYW4gYXNCaW5hcnlPbmx5KSB7Ci0JaWYgKCFpc1BhY2thZ2UocXVhbGlmaWVkUGFja2FnZU5hbWUpKSAKKwlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCiAJCXJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCiAKIAl0cnkgewpAQCAtNTgsNyArMTA1LDcgQEAKIAlyZXR1cm4gbnVsbDsKIH0KIHB1YmxpYyBjaGFyW11bXVtdIGZpbmRUeXBlTmFtZXMoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7Ci0JaWYgKCFpc1BhY2thZ2UocXVhbGlmaWVkUGFja2FnZU5hbWUpKSAKKwlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCiAJCXJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCiAKIAlBcnJheUxpc3QgYW5zd2VycyA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTkyLDcgKzEzOSw5IEBACiAJcmV0dXJuIG51bGw7CiB9CiBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl0aGlzLnppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmZpbGUpOworCWlmICh0aGlzLnppcEZpbGUgPT0gbnVsbCkgeworCQl0aGlzLnppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmZpbGUpOworCX0KIH0KIHB1YmxpYyBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKIAlpZiAodGhpcy5wYWNrYWdlQ2FjaGUgIT0gbnVsbCkKQEAgLTExOSw3ICsxNjgsNyBAQAogfQogcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJaWYgKHRoaXMuemlwRmlsZSAhPSBudWxsICYmIHRoaXMuY2xvc2VaaXBGaWxlQXRFbmQpIHsKLQkJdHJ5IHsgCisJCXRyeSB7CiAJCQl0aGlzLnppcEZpbGUuY2xvc2UoKTsKIAkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBpZ25vcmUKQEAgLTEzMyw3ICsxODIsOCBAQAogfQogcHVibGljIGNoYXJbXSBub3JtYWxpemVkUGF0aCgpIHsKIAlpZiAodGhpcy5ub3JtYWxpemVkUGF0aCA9PSBudWxsKSB7Ci0JCWNoYXJbXSByYXdOYW1lID0gdGhpcy5maWxlLmdldFBhdGgoKS50b0NoYXJBcnJheSgpOworCQlTdHJpbmcgcGF0aDIgPSB0aGlzLmdldFBhdGgoKTsKKwkJY2hhcltdIHJhd05hbWUgPSBwYXRoMi50b0NoYXJBcnJheSgpOwogCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpIHsKIAkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShyYXdOYW1lLCAnXFwnLCAnLycpOwogCQl9CkBAIC0xNDEsNyArMTkxLDE4IEBACiAJfQogCXJldHVybiB0aGlzLm5vcm1hbGl6ZWRQYXRoOwogfQotcHVibGljIFN0cmluZyBnZXRQYXRoKCl7Ci0JcmV0dXJuIHRoaXMuZmlsZS5nZXRQYXRoKCk7CitwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisJaWYgKHRoaXMucGF0aCA9PSBudWxsKSB7CisJCXRyeSB7CisJCQl0aGlzLnBhdGggPSB0aGlzLmZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBpbiBjYXNlIG9mIGVycm9yLCBzaW1wbHkgcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoCisJCQl0aGlzLnBhdGggPSB0aGlzLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCX0KKwl9CisJcmV0dXJuIHRoaXMucGF0aDsKK30KK3B1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKKwlyZXR1cm4gQklOQVJZOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aExvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoTG9jYXRpb24uamF2YQppbmRleCA1ODQ2ZWQwLi5mMGM1YzA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoTG9jYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoTG9jYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiwyMSArMjIsMjMgQEAKIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVJDRSA9IDE7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gMjsKLQkKKworCVN0cmluZyBwYXRoOworCWNoYXJbXSBub3JtYWxpemVkUGF0aDsKIAlwdWJsaWMgQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0OwogCiAJcHVibGljIFN0cmluZyBkZXN0aW5hdGlvblBhdGg7CiAJCS8vIGRlc3RpbmF0aW9uIHBhdGggZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHRoYXQgYXJlIHJlYWNoZWQgdGhyb3VnaCB0aGlzCiAJCS8vIGNsYXNzcGF0aCBsb2NhdGlvbjsgdGhlIGNvZGluZyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9uZSBvZgogCQkvLyBNYWluLmRlc3RpbmF0aW9uUGF0aDoKLQkJLy8gPT0gbnVsbDogdW5zcGVjaWZpZWQsIHVzZSB3aGF0ZXZlciB2YWx1ZSBpcyBzZXQgYnkgdGhlIGVuY2xvc2luZyAKKwkJLy8gPT0gbnVsbDogdW5zcGVjaWZpZWQsIHVzZSB3aGF0ZXZlciB2YWx1ZSBpcyBzZXQgYnkgdGhlIGVuY2xvc2luZwogCQkvLyAgICAgICAgICBjb250ZXh0LCBpZCBlc3QgTWFpbjsKIAkJLy8gPT0gTWFpbi5OT05FOiBhYnNvcmJlbnQgZWxlbWVudCwgZG8gbm90IG91dHB1dCBjbGFzcyBmaWxlczsKIAkJLy8gZWxzZTogdXNlIGFzIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCBjbGFzcyBmaWxlcyBtdXN0CiAJCS8vICAgICAgIGJlIHdyaXR0ZW4uCi0JCS8vIHBvdGVudGlhbGx5IGNhcnJpZWQgYnkgYW55IGVudHJ5IHRoYXQgY29udGFpbnMgdG8gYmUgY29tcGlsZWQgZmlsZXMgCi0JCQotCXByb3RlY3RlZCBDbGFzc3BhdGhMb2NhdGlvbihBY2Nlc3NSdWxlU2V0IGFjY2Vzc1J1bGVTZXQsIAorCQkvLyBwb3RlbnRpYWxseSBjYXJyaWVkIGJ5IGFueSBlbnRyeSB0aGF0IGNvbnRhaW5zIHRvIGJlIGNvbXBpbGVkIGZpbGVzCisKKwlwcm90ZWN0ZWQgQ2xhc3NwYXRoTG9jYXRpb24oQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0LAogCQkJU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgewogCQl0aGlzLmFjY2Vzc1J1bGVTZXQgPSBhY2Nlc3NSdWxlU2V0OwogCQl0aGlzLmRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aDsKQEAgLTQ1LDExICs0NywxMSBAQAogCS8qKgogCSAqIFJldHVybiB0aGUgZmlyc3QgYWNjZXNzIHJ1bGUgd2hpY2ggaXMgdmlvbGF0ZWQgd2hlbiBhY2Nlc3NpbmcgYSBnaXZlbgogCSAqIHR5cGUsIG9yIG51bGwgaWYgbm8gJ25vbiBhY2Nlc3NpYmxlJyBhY2Nlc3MgcnVsZSBhcHBsaWVzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lCiAJICogICAgICAgICAgICB0ZXN0ZWQgdHlwZSBzcGVjaWZpY2F0aW9uLCBmb3JtZWQgYXM6CiAJICogICAgICAgICAgICAib3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuY2xhc3MiOyBvbiBzeXN0ZW1zIHRoYXQKLQkgKiAgICAgICAgICAgIHVzZSBcIGFzIEZpbGUuc2VwYXJhdG9yLCB0aGUgCisJICogICAgICAgICAgICB1c2UgXCBhcyBGaWxlLnNlcGFyYXRvciwgdGhlCiAJICogICAgICAgICAgICAib3JnXGVjbGlwc2VcamR0XGNvcmVcSmF2YUNvcmUuY2xhc3MiIGlzIGFjY2VwdGVkIGFzIHdlbGwKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBhY2Nlc3MgcnVsZSB3aGljaCBpcyB2aW9sYXRlZCB3aGVuIGFjY2Vzc2luZyBhIGdpdmVuCiAJICogICAgICAgICB0eXBlLCBvciBudWxsIGlmIG5vbmUgYXBwbGllcwpAQCAtNTksMTAgKzYxLDQzIEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJY2hhciBbXSBxdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLgogCQkJc3Vic3RyaW5nKDAsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gU1VGRklYX0NMQVNTLmxlbmd0aCkKLQkJCS50b0NoYXJBcnJheSgpOyAKKwkJCS50b0NoYXJBcnJheSgpOwogCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpIHsKIAkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShxdWFsaWZpZWRUeXBlTmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwogCQl9CiAJCXJldHVybiB0aGlzLmFjY2Vzc1J1bGVTZXQuZ2V0VmlvbGF0ZWRSZXN0cmljdGlvbihxdWFsaWZpZWRUeXBlTmFtZSk7CiAJfQorCQorCXB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKKwkJcmV0dXJuIFNPVVJDRSB8IEJJTkFSWTsKKwl9CisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHRoaXMuZ2V0TW9kZSgpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGhpcy5wYXRoID09IG51bGwpID8gMCA6IHRoaXMucGF0aC5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUNsYXNzcGF0aExvY2F0aW9uIG90aGVyID0gKENsYXNzcGF0aExvY2F0aW9uKSBvYmo7CisJCVN0cmluZyBsb2NhbFBhdGggPSB0aGlzLmdldFBhdGgoKTsKKwkJU3RyaW5nIG90aGVyUGF0aCA9IG90aGVyLmdldFBhdGgoKTsKKwkJaWYgKGxvY2FsUGF0aCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXJQYXRoICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFsb2NhbFBhdGguZXF1YWxzKG90aGVyUGF0aCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh0aGlzLmdldE1vZGUoKSAhPSBvdGhlci5nZXRNb2RlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisJCXJldHVybiB0aGlzLnBhdGg7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aFNvdXJjZUphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aFNvdXJjZUphci5qYXZhCmluZGV4IDJhYTJjOWEuLmZjOTRhYTEgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhTb3VyY2VKYXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoU291cmNlSmFyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNiArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiAKQEAgLTIxLDI3ICsyMiwzNiBAQAogcHVibGljIGNsYXNzIENsYXNzcGF0aFNvdXJjZUphciBleHRlbmRzIENsYXNzcGF0aEphciB7CiAJcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CiAKLQlwdWJsaWMgQ2xhc3NwYXRoU291cmNlSmFyKEZpbGUgZmlsZSwgYm9vbGVhbiBjbG9zZVppcEZpbGVBdEVuZCwgCi0JCQlBY2Nlc3NSdWxlU2V0IGFjY2Vzc1J1bGVTZXQsIFN0cmluZyBlbmNvZGluZywgCisJcHVibGljIENsYXNzcGF0aFNvdXJjZUphcihGaWxlIGZpbGUsIGJvb2xlYW4gY2xvc2VaaXBGaWxlQXRFbmQsCisJCQlBY2Nlc3NSdWxlU2V0IGFjY2Vzc1J1bGVTZXQsIFN0cmluZyBlbmNvZGluZywKIAkJCVN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHsKIAkJc3VwZXIoZmlsZSwgY2xvc2VaaXBGaWxlQXRFbmQsIGFjY2Vzc1J1bGVTZXQsIGRlc3RpbmF0aW9uUGF0aCk7CiAJCXRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKIAl9CiAKIAlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhjaGFyW10gdHlwZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLCBib29sZWFuIGFzQmluYXJ5T25seSkgewotCQlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpIAorCQlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCiAJCQlyZXR1cm4gbnVsbDsgLy8gbW9zdCBjb21tb24gY2FzZQogCiAJCVppcEVudHJ5IHNvdXJjZUVudHJ5ID0gdGhpcy56aXBGaWxlLmdldEVudHJ5KHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZygwLCBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZS5sZW5ndGgoKSAtIDYpICArIFNVRkZJWF9TVFJJTkdfamF2YSk7CiAJCWlmIChzb3VyY2VFbnRyeSAhPSBudWxsKSB7CiAJCQl0cnkgeworCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisJCQkJY2hhcltdIGNvbnRlbnRzID0gbnVsbDsgCisJCQkJdHJ5IHsKKwkJCQkJc3RyZWFtID0gdGhpcy56aXBGaWxlLmdldElucHV0U3RyZWFtKHNvdXJjZUVudHJ5KTsKKwkJCQkJY29udGVudHMgPSBVdGlsLmdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoc3RyZWFtLCAtMSwgdGhpcy5lbmNvZGluZyk7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaWYgKHN0cmVhbSAhPSBudWxsKQorCQkJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQkJfQogCQkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKAotCQkJCQkJbmV3IENvbXBpbGF0aW9uVW5pdCgKLQkJCQkJCQkJVXRpbC5nZXRJbnB1dFN0cmVhbUFzQ2hhckFycmF5KHRoaXMuemlwRmlsZS5nZXRJbnB1dFN0cmVhbShzb3VyY2VFbnRyeSksCi0JCQkJCQkJCQkJLTEsIHRoaXMuZW5jb2RpbmcpLAotCQkJCQkJcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gNikgICsgU1VGRklYX1NUUklOR19qYXZhLCAKLQkJCQkJCXRoaXMuZW5jb2RpbmcsIHRoaXMuZGVzdGluYXRpb25QYXRoKSwKLQkJCQkJCWZldGNoQWNjZXNzUmVzdHJpY3Rpb24ocXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpKTsKKwkJCQkJbmV3IENvbXBpbGF0aW9uVW5pdCgKKwkJCQkJCWNvbnRlbnRzLAorCQkJCQkJcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gNikgKyBTVUZGSVhfU1RSSU5HX2phdmEsCisJCQkJCQl0aGlzLmVuY29kaW5nLAorCQkJCQkJdGhpcy5kZXN0aW5hdGlvblBhdGgpLAorCQkJCQlmZXRjaEFjY2Vzc1Jlc3RyaWN0aW9uKHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gdHJlYXQgYXMgaWYgc291cmNlIGZpbGUgaXMgbWlzc2luZwogCQkJfQpAQCAtNTEsNCArNjEsNyBAQAogCXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKGNoYXJbXSB0eXBlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKIAkJcmV0dXJuIGZpbmRDbGFzcyh0eXBlTmFtZSwgcXVhbGlmaWVkUGFja2FnZU5hbWUsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLCBmYWxzZSk7CiAJfQorCXB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKKwkJcmV0dXJuIFNPVVJDRTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggMDkyYWM5Yy4uMDE2NmU4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw3ICsyNiw3IEBACiAJcHVibGljIFN0cmluZyBkZXN0aW5hdGlvblBhdGg7CiAJCS8vIGEgc3BlY2lmaWMgZGVzdGluYXRpb24gcGF0aCBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0OyBjb2RpbmcgaXMKIAkJLy8gYWxpZ25lZCB3aXRoIE1haW4uZGVzdGluYXRpb25QYXRoOgotCQkvLyA9PSBudWxsOiB1bnNwZWNpZmllZCwgdXNlIHdoYXRldmVyIHZhbHVlIGlzIHNldCBieSB0aGUgZW5jbG9zaW5nIAorCQkvLyA9PSBudWxsOiB1bnNwZWNpZmllZCwgdXNlIHdoYXRldmVyIHZhbHVlIGlzIHNldCBieSB0aGUgZW5jbG9zaW5nCiAJCS8vICAgICAgICAgIGNvbnRleHQsIGlkIGVzdCBNYWluOwogCQkvLyA9PSBNYWluLk5PTkU6IGFic29yYmVudCBlbGVtZW50LCBkbyBub3Qgb3V0cHV0IGNsYXNzIGZpbGVzOwogCQkvLyBlbHNlOiB1c2UgYXMgdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGNsYXNzIGZpbGVzIG11c3QKQEAgLTUxLDcgKzUxLDcgQEAKIAkJCX0KIAl9CiAJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lQ2hhckFycmF5OwotCWludCBzdGFydCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyLCBmaWxlTmFtZUNoYXJBcnJheSkgKyAxOyAKKwlpbnQgc3RhcnQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgZmlsZU5hbWVDaGFyQXJyYXkpICsgMTsKIAogCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcuJywgZmlsZU5hbWVDaGFyQXJyYXkpOwogCWlmIChlbmQgPT0gLTEpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlRmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhCmluZGV4IGJlZDhkNzMuLjBmYjdhODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlRmluZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVGaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogcHVibGljIGNsYXNzIEZpbGVGaW5kZXIgewotCQorCiBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGZpbmQoRmlsZSBmLCBTdHJpbmcgcGF0dGVybikgewogCUFycmF5TGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAlmaW5kMChmLCBwYXR0ZXJuLCBmaWxlcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVTeXN0ZW0uamF2YQppbmRleCA2ODU0NGY4Li4wYjAwODZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlU3lzdGVtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwpAQCAtMzEsMTQgKzMyLDI3IEBACiAJCU5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoY2hhcltdIHR5cGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSwgYm9vbGVhbiBhc0JpbmFyeU9ubHkpOwogCQlib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpOwogCQkvKioKKwkJICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgamFyIGZpbGUgbmFtZXMgZGVmaW5lZCBpbiB0aGUgQ2xhc3MtUGF0aCBzZWN0aW9uCisJCSAqIG9mIHRoZSBqYXIgZmlsZSBtYW5pZmVzdCBpZiBhbnksIG51bGwgZWxzZS4gT25seSBDbGFzc3BhdGhKYXIgKGFuZAorCQkgKiBleHRlbmRpbmcgY2xhc3NlcykgaW5zdGFuY2VzIG1heSByZXR1cm4gYSBub24tbnVsbCByZXN1bHQuCisJCSAqIEBwYXJhbSAgcHJvYmxlbVJlcG9ydGVyIHByb2JsZW0gcmVwb3J0ZXIgd2l0aCB3aGljaCBwb3RlbnRpYWwKKwkJICogICAgICAgICBtaXNjb25maWd1cmF0aW9uIGlzc3VlcyBhcmUgcmFpc2VkCisJCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBqYXIgZmlsZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBDbGFzcy1QYXRoCisJCSAqICAgICAgICAgc2VjdGlvbiBvZiB0aGUgamFyIGZpbGUgbWFuaWZlc3QgaWYgYW55CisJCSAqLworCQlMaXN0IGZldGNoTGlua2VkSmFycyhDbGFzc3BhdGhTZWN0aW9uUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcik7CisJCS8qKgogCQkgKiBUaGlzIG1ldGhvZCByZXNldHMgdGhlIGVudmlyb25tZW50LiBUaGUgcmVzdWx0aW5nIHN0YXRlIGlzIGVxdWl2YWxlbnQgdG8KIAkJICogYSBuZXcgbmFtZSBlbnZpcm9ubWVudCB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IG9iamVjdC4KIAkJICovCiAJCXZvaWQgcmVzZXQoKTsKIAkJLyoqCi0JCSAqIFJldHVybiBhIG5vcm1hbGl6ZWQgcGF0aCBmb3IgZmlsZSBiYXNlZCBjbGFzc3BhdGggZW50cmllcy4gVGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCSAqIGVuZGluZyB3aXRoIGEgZmlsZSBzZXBhcmF0b3IgZm9yIGRpcmVjdG9yaWVzLCBhbiBhYnNvbHV0ZSBwYXRoIGRlcHJpdmVkIGZyb20gdGhlICcuamFyJwotCQkgKiAocmVzcC4gJy56aXAnKSBleHRlbnNpb24gZm9yIGphciAocmVzcC4gemlwKSBmaWxlcy4KKwkJICogUmV0dXJuIGEgbm9ybWFsaXplZCBwYXRoIGZvciBmaWxlIGJhc2VkIGNsYXNzcGF0aCBlbnRyaWVzLiBUaGlzIGlzIGFuCisJCSAqIGFic29sdXRlIHBhdGggaW4gd2hpY2ggZmlsZSBzZXBhcmF0b3JzIGFyZSB0cmFuc2Zvcm1lZCB0byB0aGUKKwkJICogcGxhdGZvcm0tYWdub3N0aWMgJy8nLCBlbmRpbmcgd2l0aCBhICcvJyBmb3IgZGlyZWN0b3JpZXMuIFRoaXMgaXMgYW4KKwkJICogYWJzb2x1dGUgcGF0aCBpbiB3aGljaCBmaWxlIHNlcGFyYXRvcnMgYXJlIHRyYW5zZm9ybWVkIHRvIHRoZQorCQkgKiBwbGF0Zm9ybS1hZ25vc3RpYyAnLycsIGRlcHJpdmVkIGZyb20gdGhlICcuamFyJyAocmVzcC4gJy56aXAnKQorCQkgKiBleHRlbnNpb24gZm9yIGphciAocmVzcC4gemlwKSBmaWxlcy4KIAkJICogQHJldHVybiBhIG5vcm1hbGl6ZWQgcGF0aCBmb3IgZmlsZSBiYXNlZCBjbGFzc3BhdGggZW50cmllcwogCQkgKi8KIAkJY2hhcltdIG5vcm1hbGl6ZWRQYXRoKCk7CkBAIC01NCw2ICs2OCwxMCBAQAogCQkgKi8KIAkJdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCX0KKwlwdWJsaWMgaW50ZXJmYWNlIENsYXNzcGF0aFNlY3Rpb25Qcm9ibGVtUmVwb3J0ZXIgeworCQl2b2lkIGludmFsaWRDbGFzc3BhdGhTZWN0aW9uKFN0cmluZyBqYXJGaWxlUGF0aCk7CisJCXZvaWQgbXVsdGlwbGVDbGFzc3BhdGhTZWN0aW9ucyhTdHJpbmcgamFyRmlsZVBhdGgpOworCX0KIAogCS8qKgogCSAqIFRoaXMgY2xhc3MgaXMgZGVmaW5lZCBob3cgdG8gbm9ybWFsaXplIHRoZSBjbGFzc3BhdGggZW50cmllcy4KQEAgLTczLDEwICs5MSw5IEBACiAJCQlIYXNoU2V0IGNhY2hlID0gbmV3IEhhc2hTZXQoKTsKIAkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjbGFzc3BhdGhzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7CiAJCQkJRmlsZVN5c3RlbS5DbGFzc3BhdGggY2xhc3NwYXRoID0gKEZpbGVTeXN0ZW0uQ2xhc3NwYXRoKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nIHBhdGggPSBjbGFzc3BhdGguZ2V0UGF0aCgpOwotCQkJCWlmICghY2FjaGUuY29udGFpbnMocGF0aCkpIHsKKwkJCQlpZiAoIWNhY2hlLmNvbnRhaW5zKGNsYXNzcGF0aCkpIHsKIAkJCQkJbm9ybWFsaXplZENsYXNzcGF0aC5hZGQoY2xhc3NwYXRoKTsKLQkJCQkJY2FjaGUuYWRkKHBhdGgpOworCQkJCQljYWNoZS5hZGQoY2xhc3NwYXRoKTsKIAkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gbm9ybWFsaXplZENsYXNzcGF0aDsKQEAgLTEwOCw3ICsxMjUsNyBAQAogCX0KIAlpbml0aWFsaXplS25vd25GaWxlTmFtZXMoaW5pdGlhbEZpbGVOYW1lcyk7CiB9Ci1GaWxlU3lzdGVtKENsYXNzcGF0aFtdIHBhdGhzLCBTdHJpbmdbXSBpbml0aWFsRmlsZU5hbWVzKSB7Citwcm90ZWN0ZWQgRmlsZVN5c3RlbShDbGFzc3BhdGhbXSBwYXRocywgU3RyaW5nW10gaW5pdGlhbEZpbGVOYW1lcykgewogCWZpbmFsIGludCBsZW5ndGggPSBwYXRocy5sZW5ndGg7CiAJaW50IGNvdW50ZXIgPSAwOwogCXRoaXMuY2xhc3NwYXRocyA9IG5ldyBGaWxlU3lzdGVtLkNsYXNzcGF0aFtsZW5ndGhdOwpAQCAtMTQ2LDkgKzE2Myw3IEBACiAJCQkJCQljb252ZXJ0UGF0aFNlcGFyYXRvcnMoZGVzdGluYXRpb25QYXRoKSk7CiAJCX0KIAl9IGVsc2UgewotCQlTdHJpbmcgbG93ZXJjYXNlQ2xhc3NwYXRoTmFtZSA9IGNsYXNzcGF0aE5hbWUudG9Mb3dlckNhc2UoKTsKLQkJaWYgKGxvd2VyY2FzZUNsYXNzcGF0aE5hbWUuZW5kc1dpdGgoU1VGRklYX1NUUklOR19qYXIpCi0JCQkJfHwgbG93ZXJjYXNlQ2xhc3NwYXRoTmFtZS5lbmRzV2l0aChTVUZGSVhfU1RSSU5HX3ppcCkpIHsKKwkJaWYgKFV0aWwuaXNQb3RlbnRpYWxaaXBBcmNoaXZlKGNsYXNzcGF0aE5hbWUpKSB7CiAJCQlpZiAoaXNTb3VyY2VPbmx5KSB7CiAJCQkJLy8gc291cmNlIG9ubHkgbW9kZQogCQkJCXJlc3VsdCA9IG5ldyBDbGFzc3BhdGhTb3VyY2VKYXIoZmlsZSwgdHJ1ZSwgYWNjZXNzUnVsZVNldCwKQEAgLTE3MSwyMCArMTg2LDQ4IEBACiAJfQogCXRoaXMua25vd25GaWxlTmFtZXMgPSBuZXcgSGFzaFNldChpbml0aWFsRmlsZU5hbWVzLmxlbmd0aCAqIDIpOwogCWZvciAoaW50IGkgPSBpbml0aWFsRmlsZU5hbWVzLmxlbmd0aDsgLS1pID49IDA7KSB7Ci0JCWNoYXJbXSBmaWxlTmFtZSA9IGluaXRpYWxGaWxlTmFtZXNbaV0udG9DaGFyQXJyYXkoKTsKKwkJRmlsZSBjb21waWxhdGlvblVuaXRGaWxlID0gbmV3IEZpbGUoaW5pdGlhbEZpbGVOYW1lc1tpXSk7CisJCWNoYXJbXSBmaWxlTmFtZSA9IG51bGw7CisJCXRyeSB7CisJCQlmaWxlTmFtZSA9IGNvbXBpbGF0aW9uVW5pdEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpLnRvQ2hhckFycmF5KCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXMgdGhlIGZpbGUgZXhpc3RzCisJCQljb250aW51ZTsKKwkJfQogCQljaGFyW10gbWF0Y2hpbmdQYXRoTmFtZSA9IG51bGw7CiAJCWZpbmFsIGludCBsYXN0SW5kZXhPZiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBmaWxlTmFtZSk7CiAJCWlmIChsYXN0SW5kZXhPZiAhPSAtMSkgewogCQkJZmlsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGZpbGVOYW1lLCAwLCBsYXN0SW5kZXhPZik7CiAJCX0KIAkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKGZpbGVOYW1lLCAnXFwnLCAnLycpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aHMubGVuZ3RoOyBqKyspeworCQlib29sZWFuIGdsb2JhbFBhdGhNYXRjaGVzID0gZmFsc2U7CisJCS8vIHRoZSBtb3N0IG5lc3RlZCBwYXRoIHNob3VsZCBiZSB0aGUgc2VsZWN0ZWQgb25lCisJCWZvciAoaW50IGogPSAwLCBtYXggPSB0aGlzLmNsYXNzcGF0aHMubGVuZ3RoOyBqIDwgbWF4OyBqKyspIHsKIAkJCWNoYXJbXSBtYXRjaENhbmRpZGF0ZSA9IHRoaXMuY2xhc3NwYXRoc1tqXS5ub3JtYWxpemVkUGF0aCgpOwotCQkJaWYgKHRoaXMuY2xhc3NwYXRoc1tqXSBpbnN0YW5jZW9mICBDbGFzc3BhdGhEaXJlY3RvcnkgJiYKLQkJCQkJQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWF0Y2hDYW5kaWRhdGUsIGZpbGVOYW1lKSAmJgotCQkJCQkobWF0Y2hpbmdQYXRoTmFtZSA9PSBudWxsIHx8Ci0JCQkJCQkJbWF0Y2hDYW5kaWRhdGUubGVuZ3RoIDwgbWF0Y2hpbmdQYXRoTmFtZS5sZW5ndGgpKQotCQkJCW1hdGNoaW5nUGF0aE5hbWUgPSBtYXRjaENhbmRpZGF0ZTsKKwkJCWJvb2xlYW4gY3VycmVudFBhdGhNYXRjaCA9IGZhbHNlOworCQkJaWYgKHRoaXMuY2xhc3NwYXRoc1tqXSBpbnN0YW5jZW9mIENsYXNzcGF0aERpcmVjdG9yeQorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtYXRjaENhbmRpZGF0ZSwgZmlsZU5hbWUpKSB7CisJCQkJY3VycmVudFBhdGhNYXRjaCA9IHRydWU7CisJCQkJaWYgKG1hdGNoaW5nUGF0aE5hbWUgPT0gbnVsbCkgeworCQkJCQltYXRjaGluZ1BhdGhOYW1lID0gbWF0Y2hDYW5kaWRhdGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGN1cnJlbnRQYXRoTWF0Y2gpIHsKKwkJCQkJCS8vIHdlIGhhdmUgYSBzZWNvbmQgc291cmNlIGZvbGRlciB0aGF0IG1hdGNoZXMgdGhlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlCisJCQkJCQlpZiAobWF0Y2hDYW5kaWRhdGUubGVuZ3RoID4gbWF0Y2hpbmdQYXRoTmFtZS5sZW5ndGgpIHsKKwkJCQkJCQkvLyB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSBwYXRoCisJCQkJCQkJbWF0Y2hpbmdQYXRoTmFtZSA9IG1hdGNoQ2FuZGlkYXRlOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGUgc2hvcnRlc3QgcG9zc2libGUgcGF0aAorCQkJCQkJaWYgKCFnbG9iYWxQYXRoTWF0Y2hlcyAmJiBtYXRjaENhbmRpZGF0ZS5sZW5ndGggPCBtYXRjaGluZ1BhdGhOYW1lLmxlbmd0aCkgeworCQkJCQkJCW1hdGNoaW5nUGF0aE5hbWUgPSBtYXRjaENhbmRpZGF0ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoY3VycmVudFBhdGhNYXRjaCkgeworCQkJCQlnbG9iYWxQYXRoTWF0Y2hlcyA9IHRydWU7CisJCQkJfQorCQkJfQogCQl9CiAJCWlmIChtYXRjaGluZ1BhdGhOYW1lID09IG51bGwpIHsKIAkJCXRoaXMua25vd25GaWxlTmFtZXMuYWRkKG5ldyBTdHJpbmcoZmlsZU5hbWUpKTsgLy8gbGVhdmUgYXMgaXMuLi4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCmluZGV4IGZkMThkYmMuLjNjZmRmMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL01haW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05LDE3ICs5LDIzIEBACiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgVG9tIFRyb21leSAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDEyNTk2MQogICogICAgIFRvbSBUcm9tZXkgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxNTk2NDEKKyAqICAgICBCZW5qYW1pbiBNdXNrYWxsYSAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDIzOTA2NgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjM2Mzg1CisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAyOTU1NTEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7CiAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwpAQCAtMzIsMTggKzM4LDIyIEBACiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DYXRlZ29yaXplZFByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ29tcGlsYXRpb25Qcm9ncmVzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaC5CYXRjaENvbXBpbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwpAQCAtNTEsMTIgKzYxLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5GaWxlU3lzdGVtLkNsYXNzcGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUmVzdHJpY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUnVsZVNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyU3RhdHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb29rdXBFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwpAQCAtNjQsMjggKzc2LDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuR2VuZXJpY1hNTFdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZkludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIE1haW4gaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgU3VmZml4Q29uc3RhbnRzIHsKLQkvKioKLQkgKiBSZXNvdXJjZSBidW5kbGUgZmFjdG9yeSB0byBzaGFyZSBidW5kbGVzIGZvciB0aGUgc2FtZSBsb2NhbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQnVuZGxlRmFjdG9yeSB7Ci0JCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBDYWNoZS5nZXQobG9jYWxlKTsKLQkJCWlmIChidW5kbGUgPT0gbnVsbCkgewotCQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShNYWluLmJ1bmRsZU5hbWUsIGxvY2FsZSk7Ci0JCQkJQ2FjaGUucHV0KGxvY2FsZSwgYnVuZGxlKTsKLQkJCX0KLQkJCXJldHVybiBidW5kbGU7Ci0JCX0KLQl9Ci0KIAlwdWJsaWMgc3RhdGljIGNsYXNzIExvZ2dlciB7CisJCXByaXZhdGUgUHJpbnRXcml0ZXIgZXJyOworCQlwcml2YXRlIFByaW50V3JpdGVyIGxvZzsKKwkJcHJpdmF0ZSBNYWluIG1haW47CisJCXByaXZhdGUgUHJpbnRXcml0ZXIgb3V0OworCQlwcml2YXRlIEhhc2hNYXAgcGFyYW1ldGVyczsKKwkJaW50IHRhZ0JpdHM7CiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0ZJTEUgPSAiY2xhc3NmaWxlIjsgLy8kTk9OLU5MUy0xJAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKQEAgLTEwMyw2ICsxMDYsNyBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTUFDUyA9IDI7CiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJFUlJPUiI7IC8vJE5PTi1OTFMtMSQKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RBRyA9ICJlcnJvciI7IC8vJE5PTi1OTFMtMSQKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfVEFHID0gIndhcm5pbmciOyAvLyROT04tTkxTLTEkCiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT04gPSAiZXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJPQkxFTV9UQUcgPSAiZXh0cmFfcHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BST0JMRU1TID0gImV4dHJhX3Byb2JsZW1zIjsgLy8kTk9OLU5MUy0xJApAQCAtMTQwLDE2ICsxNDQsMTYgQEAKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9FTkQgPSAic291cmNlRW5kIjsgLy8kTk9OLU5MUy0xJAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1NUQVJUID0gInNvdXJjZVN0YXJ0IjsgLy8kTk9OLU5MUy0xJAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFUyA9ICJzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAorCiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUUyA9ICJzdGF0cyI7IC8vJE5PTi1OTFMtMSQKKwogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9ICJ0YXNrIjsgLy8kTk9OLU5MUy0xJAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1MgPSAidGFza3MiOyAvLyROT04tTkxTLTEkCiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FID0gInRpbWUiOyAvLyROT04tTkxTLTEkCiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkcgPSAiV0FSTklORyI7IC8vJE5PTi1OTFMtMSQKLQogCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUwgPSAxOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFREX0RFQ0xBUkFUSU9OID0gIjwhRE9DVFlQRSBjb21waWxlciBQVUJMSUMgXCItLy9FY2xpcHNlLm9yZy8vRFREIEVjbGlwc2UgSkRUIDMuMi4wMDMgQ29tcGlsZXIvL0VOXCIgXCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL2NvbXBpbGVyXzMyXzAwMy5kdGRcIj4iOyAvLyROT04tTkxTLTEkCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFREX0RFQ0xBUkFUSU9OID0gIjwhRE9DVFlQRSBjb21waWxlciBQVUJMSUMgXCItLy9FY2xpcHNlLm9yZy8vRFREIEVjbGlwc2UgSkRUIDMuMi4wMDQgQ29tcGlsZXIvL0VOXCIgXCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL2NvbXBpbGVyXzMyXzAwNC5kdGRcIj4iOyAvLyROT04tTkxTLTEkCiAJCXN0YXRpYyB7CiAJCQl0cnkgewogCQkJCUNsYXNzIGMgPSBJUHJvYmxlbS5jbGFzczsKQEAgLTE1OCw3ICsxNjIsMTEgQEAKIAkJCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07CiAJCQkJCWlmIChmaWVsZC5nZXRUeXBlKCkuZXF1YWxzKEludGVnZXIuVFlQRSkpIHsKIAkJCQkJCUludGVnZXIgdmFsdWUgPSAoSW50ZWdlcikgZmllbGQuZ2V0KG51bGwpOwotCQkJCQkJTG9nZ2VyLkZJRUxEX1RBQkxFLnB1dCh2YWx1ZS5pbnRWYWx1ZSgpICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2ssIGZpZWxkLmdldE5hbWUoKSk7CisJCQkJCQlpbnQga2V5MiA9IHZhbHVlLmludFZhbHVlKCkgJiBJUHJvYmxlbS5JZ25vcmVDYXRlZ29yaWVzTWFzazsKKwkJCQkJCWlmIChrZXkyID09IDApIHsKKwkJCQkJCQlrZXkyID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCQkJCQl9CisJCQkJCQlMb2dnZXIuRklFTERfVEFCTEUucHV0KGtleTIsIGZpZWxkLmdldE5hbWUoKSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CkBAIC0xNjksMTIgKzE3Nyw2IEBACiAJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCX0KIAkJfQotCQlwcml2YXRlIFByaW50V3JpdGVyIGVycjsKLQkJcHJpdmF0ZSBQcmludFdyaXRlciBsb2c7Ci0JCXByaXZhdGUgTWFpbiBtYWluOwotCQlwcml2YXRlIFByaW50V3JpdGVyIG91dDsKLQkJcHJpdmF0ZSBIYXNoTWFwIHBhcmFtZXRlcnM7Ci0JCWludCB0YWdCaXRzOwogCQlwdWJsaWMgTG9nZ2VyKE1haW4gbWFpbiwgUHJpbnRXcml0ZXIgb3V0LCBQcmludFdyaXRlciBlcnIpIHsKIAkJCXRoaXMub3V0ID0gb3V0OwogCQkJdGhpcy5lcnIgPSBlcnI7CkBAIC0yMDgsOCArMjEwLDggQEAKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkgewogCQkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewotCQkJCQl0aGlzLmVuZFRhZyhMb2dnZXIuQ09NUElMRVIpOwotCQkJCQl0aGlzLmZsdXNoKCk7CisJCQkJCWVuZFRhZyhMb2dnZXIuQ09NUElMRVIpOworCQkJCQlmbHVzaCgpOwogCQkJCX0KIAkJCQl0aGlzLmxvZy5jbG9zZSgpOwogCQkJfQpAQCAtMjE5LDM5ICsyMjEsMTEwIEBACiAJCSAqCiAJCSAqLwogCQlwdWJsaWMgdm9pZCBjb21waWxpbmcoKSB7Ci0JCQl0aGlzLnByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoInByb2dyZXNzLmNvbXBpbGluZyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJcHJpbnRsbk91dCh0aGlzLm1haW4uYmluZCgicHJvZ3Jlc3MuY29tcGlsaW5nIikpOyAvLyROT04tTkxTLTEkCiAJCX0KLQorCQlwcml2YXRlIHZvaWQgZW5kTG9nZ2luZ0V4dHJhUHJvYmxlbXMoKSB7CisJCQllbmRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1TKTsKKwkJfQogCQkvKioKIAkJICogVXNlZCB0byBzdG9wIGxvZ2dpbmcgcHJvYmxlbXMuCiAJCSAqIE9ubHkgdXNlIGluIHhtbCBtb2RlLgogCQkgKi8KIAkJcHJpdmF0ZSB2b2lkIGVuZExvZ2dpbmdQcm9ibGVtcygpIHsKLQkJCXRoaXMuZW5kVGFnKExvZ2dlci5QUk9CTEVNUyk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIGVuZExvZ2dpbmdFeHRyYVByb2JsZW1zKCkgewotCQkJdGhpcy5lbmRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1TKTsKKwkJCWVuZFRhZyhMb2dnZXIuUFJPQkxFTVMpOwogCQl9CiAJCXB1YmxpYyB2b2lkIGVuZExvZ2dpbmdTb3VyY2UoKSB7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLmVuZFRhZyhMb2dnZXIuU09VUkNFKTsKKwkJCQllbmRUYWcoTG9nZ2VyLlNPVVJDRSk7CiAJCQl9CiAJCX0KIAogCQlwdWJsaWMgdm9pZCBlbmRMb2dnaW5nU291cmNlcygpIHsKIAkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewotCQkJCXRoaXMuZW5kVGFnKExvZ2dlci5TT1VSQ0VTKTsKKwkJCQllbmRUYWcoTG9nZ2VyLlNPVVJDRVMpOwogCQkJfQogCQl9CiAKIAkJcHVibGljIHZvaWQgZW5kTG9nZ2luZ1Rhc2tzKCkgewogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7Ci0JCQkJdGhpcy5lbmRUYWcoTG9nZ2VyLlRBU0tTKTsKKwkJCQllbmRUYWcoTG9nZ2VyLlRBU0tTKTsKIAkJCX0KIAkJfQogCQlwcml2YXRlIHZvaWQgZW5kVGFnKFN0cmluZyBuYW1lKSB7Ci0JCQkoKEdlbmVyaWNYTUxXcml0ZXIpIHRoaXMubG9nKS5lbmRUYWcobmFtZSwgdHJ1ZSwgdHJ1ZSk7CisJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkgeworCQkJCSgoR2VuZXJpY1hNTFdyaXRlcikgdGhpcy5sb2cpLmVuZFRhZyhuYW1lLCB0cnVlLCB0cnVlKTsKKwkJCX0KIAkJfQorCQlwcml2YXRlIFN0cmluZyBlcnJvclJlcG9ydFNvdXJjZShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSwgY2hhcltdIHVuaXRTb3VyY2UsIGludCBiaXRzKSB7CisJCQkvL2V4dHJhIGZyb20gdGhlIHNvdXJjZSB0aGUgaW5uYWN1cmF0ZSAgICAgdG9rZW4KKwkJCS8vYW5kICJoaWdobGlnaHQiIGl0IHVzaW5nIHNvbWUgdW5kZXJuZWF0aCBeXl5eXgorCQkJLy9wdXQgc29tZSBjb250ZXh0IGFyb3VuZCB0b28uCisKKwkJCS8vdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgZm9udCB1c2VkIGluIHRoZSBjb25zb2xlIGlzIGZpeGVkIHNpemUKKworCQkJLy9zYW5pdHkgLi4uLi4KKwkJCWludCBzdGFydFBvc2l0aW9uID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOworCQkJaW50IGVuZFBvc2l0aW9uID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKKwkJCWlmICh1bml0U291cmNlID09IG51bGwpIHsKKwkJCQlpZiAocHJvYmxlbS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJdW5pdFNvdXJjZSA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KG5ldyBGaWxlKG5ldyBTdHJpbmcocHJvYmxlbS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpKSwgbnVsbCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIGlnbm9yZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWludCBsZW5ndGg7CisJCQlpZiAoKHN0YXJ0UG9zaXRpb24gPiBlbmRQb3NpdGlvbikKKwkJCQl8fCAoKHN0YXJ0UG9zaXRpb24gPCAwKSAmJiAoZW5kUG9zaXRpb24gPCAwKSkKKwkJCQl8fCAodW5pdFNvdXJjZSA9PSBudWxsKQorCQkJCXx8IChsZW5ndGggPSB1bml0U291cmNlLmxlbmd0aCkgPT0gMCkKKwkJCQlyZXR1cm4gTWVzc2FnZXMucHJvYmxlbV9ub1NvdXJjZUluZm9ybWF0aW9uOworCisJCQlTdHJpbmdCdWZmZXIgZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlpZiAoKGJpdHMgJiBNYWluLkxvZ2dlci5FTUFDUykgPT0gMCkgeworCQkJCWVycm9yQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnByb2JsZW1fYXRMaW5lLCBTdHJpbmcudmFsdWVPZihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSkpKTsKKwkJCQllcnJvckJ1ZmZlci5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCQl9CisJCQllcnJvckJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisKKwkJCWNoYXIgYzsKKwkJCWZpbmFsIGNoYXIgU1BBQ0UgPSAnXHUwMDIwJzsKKwkJCWZpbmFsIGNoYXIgTUFSSyA9ICdeJzsKKwkJCWZpbmFsIGNoYXIgVEFCID0gJ1x0JzsKKwkJCS8vdGhlIG5leHQgY29kZSB0cmllcyB0byB1bmRlcmxpbmUgdGhlIHRva2VuLi4uLi4KKwkJCS8vaXQgYXNzdW1lcyAoZm9yIGEgZ29vZCBkaXNwbGF5KSB0aGF0IHRva2VuIHNvdXJjZSBkb2VzIG5vdAorCQkJLy9jb250YWluIGFueSBcciBcbi4gVGhpcyBpcyBmYWxzZSBvbiBzdGF0ZW1lbnRzICEKKwkJCS8vKHRoZSBjb2RlIHN0aWxsIHdvcmtzIGJ1dCB0aGUgZGlzcGxheSBpcyBub3Qgb3B0aW1hbCAhKQorCisJCQkvLyBleHBhbmQgdG8gbGluZSBsaW1pdHMKKwkJCWludCBiZWdpbjsKKwkJCWludCBlbmQ7CisJCQlmb3IgKGJlZ2luID0gc3RhcnRQb3NpdGlvbiA+PSBsZW5ndGggPyBsZW5ndGggLSAxIDogc3RhcnRQb3NpdGlvbjsgYmVnaW4gPiAwOyBiZWdpbi0tKSB7CisJCQkJaWYgKChjID0gdW5pdFNvdXJjZVtiZWdpbiAtIDFdKSA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgYnJlYWs7CisJCQl9CisJCQlmb3IgKGVuZCA9IGVuZFBvc2l0aW9uID49IGxlbmd0aCA/IGxlbmd0aCAtIDEgOiBlbmRQb3NpdGlvbiA7IGVuZCsxIDwgbGVuZ3RoOyBlbmQrKykgeworCQkJCWlmICgoYyA9IHVuaXRTb3VyY2VbZW5kICsgMV0pID09ICdccicgfHwgYyA9PSAnXG4nKSBicmVhazsKKwkJCX0KKworCQkJLy8gdHJpbSBsZWZ0IGFuZCByaWdodCBzcGFjZXMvdGFicworCQkJd2hpbGUgKChjID0gdW5pdFNvdXJjZVtiZWdpbl0pID09ICcgJyB8fCBjID09ICdcdCcpIGJlZ2luKys7CisJCQkvL3doaWxlICgoYyA9IHVuaXRTb3VyY2VbZW5kXSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykgZW5kLS07IFRPRE8gKHBoaWxpcHBlKSBzaG91bGQgYWxzbyB0cmltIHJpZ2h0LCBidXQgYWxsIHRlc3RzIGFyZSB0byBiZSB1cGRhdGVkCisKKwkJCS8vIGNvcHkgc291cmNlCisJCQllcnJvckJ1ZmZlci5hcHBlbmQodW5pdFNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbisxKTsKKwkJCWVycm9yQnVmZmVyLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKS5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gY29tcHV0ZSB1bmRlcmxpbmUKKwkJCWZvciAoaW50IGkgPSBiZWdpbjsgaSA8c3RhcnRQb3NpdGlvbjsgaSsrKSB7CisJCQkJZXJyb3JCdWZmZXIuYXBwZW5kKCh1bml0U291cmNlW2ldID09IFRBQikgPyBUQUIgOiBTUEFDRSk7CisJCQl9CisJCQlmb3IgKGludCBpID0gc3RhcnRQb3NpdGlvbjsgaSA8PSAoZW5kUG9zaXRpb24gPj0gbGVuZ3RoID8gbGVuZ3RoIC0gMSA6IGVuZFBvc2l0aW9uKTsgaSsrKSB7CisJCQkJZXJyb3JCdWZmZXIuYXBwZW5kKE1BUkspOworCQkJfQorCQkJcmV0dXJuIGVycm9yQnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKwogCQlwcml2YXRlIHZvaWQgZXh0cmFjdENvbnRleHQoQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0sIGNoYXJbXSB1bml0U291cmNlKSB7CiAJCQkvL3Nhbml0eSAuLi4uLgogCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7CkBAIC0yNjUsMTUgKzMzOCwxNiBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaW50IGxlbmd0aCA9IHVuaXRTb3VyY2U9PSBudWxsID8gMCA6IHVuaXRTb3VyY2UubGVuZ3RoOworCQkJaW50IGxlbmd0aDsKIAkJCWlmICgoc3RhcnRQb3NpdGlvbiA+IGVuZFBvc2l0aW9uKQogCQkJCQl8fCAoKHN0YXJ0UG9zaXRpb24gPCAwKSAmJiAoZW5kUG9zaXRpb24gPCAwKSkKLQkJCQkJfHwgKGxlbmd0aCA8PSAwKQorCQkJCQl8fCAodW5pdFNvdXJjZSA9PSBudWxsKQorCQkJCQl8fCAoKGxlbmd0aCA9IHVuaXRTb3VyY2UubGVuZ3RoKSA8PSAwKQogCQkJCQl8fCAoZW5kUG9zaXRpb24gPiBsZW5ndGgpKSB7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuVkFMVUUsIE1lc3NhZ2VzLnByb2JsZW1fbm9Tb3VyY2VJbmZvcm1hdGlvbik7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuU09VUkNFX1NUQVJULCAiLTEiKTsgLy8kTk9OLU5MUy0xJAogCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlNPVVJDRV9FTkQsICItMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuU09VUkNFX0NPTlRFWFQsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLlNPVVJDRV9DT05URVhULCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQkJCXJldHVybjsKIAkJCX0KIApAQCAtMzAzLDkgKzM3Nyw4IEBACiAJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5WQUxVRSwgU3RyaW5nLnZhbHVlT2YoYnVmZmVyKSk7CiAJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5TT1VSQ0VfU1RBUlQsIEludGVnZXIudG9TdHJpbmcoc3RhcnRQb3NpdGlvbiAtIGJlZ2luKSk7CiAJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5TT1VSQ0VfRU5ELCBJbnRlZ2VyLnRvU3RyaW5nKGVuZFBvc2l0aW9uIC0gYmVnaW4pKTsKLQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlNPVVJDRV9DT05URVhULCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJcHJpbnRUYWcoTG9nZ2VyLlNPVVJDRV9DT05URVhULCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQl9Ci0KIAkJcHVibGljIHZvaWQgZmx1c2goKSB7CiAJCQl0aGlzLm91dC5mbHVzaCgpOwogCQkJdGhpcy5lcnIuZmx1c2goKTsKQEAgLTMxMywzMiArMzg2LDYyIEBACiAJCQkJdGhpcy5sb2cuZmx1c2goKTsKIAkJCX0KIAkJfQorCiAJCXByaXZhdGUgU3RyaW5nIGdldEZpZWxkTmFtZShpbnQgaWQpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBMb2dnZXIuRklFTERfVEFCTEUuZ2V0KGlkICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2spOworCQkJaW50IGtleTIgPSBpZCAmIElQcm9ibGVtLklnbm9yZUNhdGVnb3JpZXNNYXNrOworCQkJaWYgKGtleTIgPT0gMCkgeworCQkJCWtleTIgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJCX0KKwkJCXJldHVybiAoU3RyaW5nKSBMb2dnZXIuRklFTERfVEFCTEUuZ2V0KGtleTIpOwogCQl9CiAKIAkJLy8gZmluZCBvdXQgYW4gb3B0aW9uIG5hbWUgY29udHJvbGxpbmcgYSBnaXZlbiBwcm9ibGVtSUQKIAkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvYmxlbU9wdGlvbktleShpbnQgcHJvYmxlbUlEKSB7Ci0JCQlsb25nIGlycml0YW50ID0gUHJvYmxlbVJlcG9ydGVyLmdldElycml0YW50KHByb2JsZW1JRCk7CisJCQlpbnQgaXJyaXRhbnQgPSBQcm9ibGVtUmVwb3J0ZXIuZ2V0SXJyaXRhbnQocHJvYmxlbUlEKTsKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMub3B0aW9uS2V5RnJvbUlycml0YW50KGlycml0YW50KTsKIAkJfQogCi0JCXB1YmxpYyB2b2lkIGxvZ0F2ZXJhZ2UobG9uZ1tdIHRpbWVzLCBsb25nIGxpbmVDb3VudCkgewotCQkJQXJyYXlzLnNvcnQodGltZXMpOwotCQkJZmluYWwgaW50IGxlbmd0aCA9IHRpbWVzLmxlbmd0aDsKKwkJcHVibGljIHZvaWQgbG9nQXZlcmFnZSgpIHsKKwkJCUFycmF5cy5zb3J0KHRoaXMubWFpbi5jb21waWxlclN0YXRzKTsKKwkJCWxvbmcgbGluZUNvdW50ID0gdGhpcy5tYWluLmNvbXBpbGVyU3RhdHNbMF0ubGluZUNvdW50OworCQkJZmluYWwgaW50IGxlbmd0aCA9IHRoaXMubWFpbi5tYXhSZXBldGl0aW9uOwogCQkJbG9uZyBzdW0gPSAwOworCQkJbG9uZyBwYXJzZVN1bSA9IDAsIHJlc29sdmVTdW0gPSAwLCBhbmFseXplU3VtID0gMCwgZ2VuZXJhdGVTdW0gPSAwOwogCQkJZm9yIChpbnQgaSA9IDEsIG1heCA9IGxlbmd0aCAtIDE7IGkgPCBtYXg7IGkrKykgewotCQkJCXN1bSArPSB0aW1lc1tpXTsKKwkJCQlDb21waWxlclN0YXRzIHN0YXRzID0gdGhpcy5tYWluLmNvbXBpbGVyU3RhdHNbaV07CisJCQkJc3VtICs9IHN0YXRzLmVsYXBzZWRUaW1lKCk7CisJCQkJcGFyc2VTdW0gKz0gc3RhdHMucGFyc2VUaW1lOworCQkJCXJlc29sdmVTdW0gKz0gc3RhdHMucmVzb2x2ZVRpbWU7CisJCQkJYW5hbHl6ZVN1bSArPSBzdGF0cy5hbmFseXplVGltZTsKKwkJCQlnZW5lcmF0ZVN1bSArPSBzdGF0cy5nZW5lcmF0ZVRpbWU7CiAJCQl9CiAJCQlsb25nIHRpbWUgPSBzdW0gLyAobGVuZ3RoIC0gMik7Ci0JCQl0aGlzLnByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoCisJCQlsb25nIHBhcnNlVGltZSA9IHBhcnNlU3VtLyhsZW5ndGggLSAyKTsKKwkJCWxvbmcgcmVzb2x2ZVRpbWUgPSByZXNvbHZlU3VtLyhsZW5ndGggLSAyKTsKKwkJCWxvbmcgYW5hbHl6ZVRpbWUgPSBhbmFseXplU3VtLyhsZW5ndGggLSAyKTsKKwkJCWxvbmcgZ2VuZXJhdGVUaW1lID0gZ2VuZXJhdGVTdW0vKGxlbmd0aCAtIDIpOworCQkJcHJpbnRsbk91dCh0aGlzLm1haW4uYmluZCgKIAkJCQkiY29tcGlsZS5hdmVyYWdlVGltZSIsIC8vJE5PTi1OTFMtMSQKIAkJCQluZXcgU3RyaW5nW10gewogCQkJCQlTdHJpbmcudmFsdWVPZihsaW5lQ291bnQpLAogCQkJCQlTdHJpbmcudmFsdWVPZih0aW1lKSwKLQkJCQkJU3RyaW5nLnZhbHVlT2YoKChpbnQpIChsaW5lQ291bnQgKiAxMDAwMC4wIC8gdGltZSkpIC8gMTAuMCkgfSkpOworCQkJCQlTdHJpbmcudmFsdWVPZigoKGludCkgKGxpbmVDb3VudCAqIDEwMDAwLjAgLyB0aW1lKSkgLyAxMC4wKSwKKwkJCQl9KSk7CisJCQlpZiAoKHRoaXMubWFpbi50aW1pbmcgJiBNYWluLlRJTUlOR19ERVRBSUxFRCkgIT0gMCkgeworCQkJCXByaW50bG5PdXQoCisJCQkJCQl0aGlzLm1haW4uYmluZCgiY29tcGlsZS5kZXRhaWxlZFRpbWUiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YocGFyc2VUaW1lKSwKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoKChpbnQpIChwYXJzZVRpbWUgKiAxMDAwLjAgLyB0aW1lKSkgLyAxMC4wKSwKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YocmVzb2x2ZVRpbWUpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZigoKGludCkgKHJlc29sdmVUaW1lICogMTAwMC4wIC8gdGltZSkpIC8gMTAuMCksCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKGFuYWx5emVUaW1lKSwKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoKChpbnQpIChhbmFseXplVGltZSAqIDEwMDAuMCAvIHRpbWUpKSAvIDEwLjApLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZihnZW5lcmF0ZVRpbWUpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZigoKGludCkgKGdlbmVyYXRlVGltZSAqIDEwMDAuMCAvIHRpbWUpKSAvIDEwLjApLAorCQkJCQkJCX0pKTsKKwkJCX0KIAkJfQotCiAJCXB1YmxpYyB2b2lkIGxvZ0NsYXNzRmlsZShib29sZWFuIGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsIFN0cmluZyBvdXRwdXRQYXRoLCBTdHJpbmcgcmVsYXRpdmVGaWxlTmFtZSkgewogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7CiAJCQkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKQEAgLTM2OSw5ICs0NzIsOSBAQAogCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKIAkJCQl0cnkgewogCQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QQVRILCBmLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkNMQVNTX0ZJTEUsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCQkJCXByaW50VGFnKExvZ2dlci5DTEFTU19GSUxFLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhpcy5sb2dOb0NsYXNzRmlsZUNyZWF0ZWQob3V0cHV0UGF0aCwgcmVsYXRpdmVGaWxlTmFtZSwgZSk7CisJCQkJCWxvZ05vQ2xhc3NGaWxlQ3JlYXRlZChvdXRwdXRQYXRoLCByZWxhdGl2ZUZpbGVOYW1lLCBlKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4MSwxNCArNDg0LDE0IEBACiAJCQkJZmluYWwgaW50IGxlbmd0aCA9IGNsYXNzcGF0aHMubGVuZ3RoOwogCQkJCWlmIChsZW5ndGggIT0gMCkgewogCQkJCQkvLyBnZW5lcmF0ZSB4bWwgb3V0cHV0Ci0JCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkNMQVNTUEFUSFMsIG51bGwsIHRydWUsIGZhbHNlKTsKKwkJCQkJcHJpbnRUYWcoTG9nZ2VyLkNMQVNTUEFUSFMsIG51bGwsIHRydWUsIGZhbHNlKTsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJU3RyaW5nIGNsYXNzcGF0aCA9IGNsYXNzcGF0aHNbaV0uZ2V0UGF0aCgpOwogCQkJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuUEFUSCwgY2xhc3NwYXRoKTsKIAkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGNsYXNzcGF0aCk7CiAJCQkJCQlTdHJpbmcgaWQgPSBudWxsOwogCQkJCQkJaWYgKGYuaXNGaWxlKCkpIHsKLQkJCQkJCQlpZiAoVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShjbGFzc3BhdGgpKSB7CisJCQkJCQkJaWYgKFV0aWwuaXNQb3RlbnRpYWxaaXBBcmNoaXZlKGNsYXNzcGF0aCkpIHsKIAkJCQkJCQkJaWQgPSBMb2dnZXIuQ0xBU1NQQVRIX0pBUjsKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlpZCA9IExvZ2dlci5DTEFTU1BBVEhfRklMRTsKQEAgLTM5OCwyNiArNTAxLDI3IEBACiAJCQkJCQl9CiAJCQkJCQlpZiAoaWQgIT0gbnVsbCkgewogCQkJCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLkNMQVNTUEFUSF9JRCwgaWQpOwotCQkJCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkNMQVNTUEFUSCwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCQkJCQlwcmludFRhZyhMb2dnZXIuQ0xBU1NQQVRILCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCXRoaXMuZW5kVGFnKExvZ2dlci5DTEFTU1BBVEhTKTsKKwkJCQkJZW5kVGFnKExvZ2dlci5DTEFTU1BBVEhTKTsKIAkJCQl9CiAJCQl9CiAKIAkJfQorCiAJCXB1YmxpYyB2b2lkIGxvZ0NvbW1hbmRMaW5lQXJndW1lbnRzKFN0cmluZ1tdIGNvbW1hbmRMaW5lQXJndW1lbnRzKSB7CiAJCQlpZiAoY29tbWFuZExpbmVBcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuOwogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7CiAJCQkJZmluYWwgaW50IGxlbmd0aCA9IGNvbW1hbmRMaW5lQXJndW1lbnRzLmxlbmd0aDsKIAkJCQlpZiAobGVuZ3RoICE9IDApIHsKIAkJCQkJLy8gZ2VuZXJhdGUgeG1sIG91dHB1dAotCQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5DT01NQU5EX0xJTkVfQVJHVU1FTlRTLCBudWxsLCB0cnVlLCBmYWxzZSk7CisJCQkJCXByaW50VGFnKExvZ2dlci5DT01NQU5EX0xJTkVfQVJHVU1FTlRTLCBudWxsLCB0cnVlLCBmYWxzZSk7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlZBTFVFLCBjb21tYW5kTGluZUFyZ3VtZW50c1tpXSk7Ci0JCQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5DT01NQU5EX0xJTkVfQVJHVU1FTlQsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCQkJCQlwcmludFRhZyhMb2dnZXIuQ09NTUFORF9MSU5FX0FSR1VNRU5ULCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQkJCQl9Ci0JCQkJCXRoaXMuZW5kVGFnKExvZ2dlci5DT01NQU5EX0xJTkVfQVJHVU1FTlRTKTsKKwkJCQkJZW5kVGFnKExvZ2dlci5DT01NQU5EX0xJTkVfQVJHVU1FTlRTKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTQzMSw3ICs1MzUsNyBAQAogCQkJZS5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOwogCQkJcHJpbnRXcml0ZXIuZmx1c2goKTsKIAkJCXByaW50V3JpdGVyLmNsb3NlKCk7Ci0JCQlmaW5hbCBTdHJpbmcgc3RhY2tUcmFjZSA9IHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOworCQkJZmluYWwgU3RyaW5nIHN0YWNrVHJhY2UgPSB3cml0ZXIudG9TdHJpbmcoKTsKIAkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewogCQkJCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihzdGFja1RyYWNlKSk7CiAJCQkJU3RyaW5nIGxpbmU7CkBAIC00NTMsNyArNTU3LDcgQEAKIAkJCQltZXNzYWdlID0gYnVmZmVyLnRvU3RyaW5nKCk7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTUVTU0FHRSwgbWVzc2FnZSk7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuQ0xBU1MsIGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuRVhDRVBUSU9OLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCXByaW50VGFnKExvZ2dlci5FWENFUFRJT04sIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CiAJCQl9CiAJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwogCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewpAQCAtNDYzLDQ5ICs1NjcsOTkgQEAKIAkJCX0KIAkJfQogCi0JCS8qKgotCQkgKiBAcGFyYW0gd3JvbmdDbGFzc3BhdGgKLQkJICogICAgICAgICAgICB0aGUgZ2l2ZW4gd3JvbmcgY2xhc3NwYXRoIGVudHJ5Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBsb2dJbmNvcnJlY3RDbGFzc3BhdGgoU3RyaW5nIHdyb25nQ2xhc3NwYXRoKSB7Ci0JCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5NRVNTQUdFLCB0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLmluY29ycmVjdENsYXNzcGF0aCIsIHdyb25nQ2xhc3NwYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5FUlJPUl9UQUcsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCXByaXZhdGUgdm9pZCBsb2dFeHRyYVByb2JsZW0oQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0sIGludCBsb2NhbEVycm9yQ291bnQsIGludCBnbG9iYWxFcnJvckNvdW50KSB7CisJCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSA9IHByb2JsZW0uZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpOworCQkJaWYgKG9yaWdpbmF0aW5nRmlsZU5hbWUgPT0gbnVsbCkgeworCQkJCS8vIHNpbXBsaWZpZWQgbWVzc2FnZSBvdXRwdXQKKwkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKKwkJCQkJcHJpbnRFcnIodGhpcy5tYWluLmJpbmQoCisJCQkJCQkJCSJyZXF1ZXN0b3IuZXh0cmFlcnJvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJSW50ZWdlci50b1N0cmluZyhnbG9iYWxFcnJvckNvdW50KSkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHdhcm5pbmcgLyBtYW5kYXRvcnkgd2FybmluZyAvIG90aGVyCisJCQkJCXByaW50RXJyKHRoaXMubWFpbi5iaW5kKAorCQkJCQkJCSJyZXF1ZXN0b3IuZXh0cmF3YXJuaW5nIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZ2xvYmFsRXJyb3JDb3VudCkpKTsKKwkJCQl9CisJCQkJcHJpbnRFcnIoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMucHJpbnRsbkVycihwcm9ibGVtLmdldE1lc3NhZ2UoKSk7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ldyBTdHJpbmcob3JpZ2luYXRpbmdGaWxlTmFtZSk7CisJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuRU1BQ1MpICE9IDApIHsKKwkJCQkJU3RyaW5nIHJlc3VsdCA9IGZpbGVOYW1lCisJCQkJCQkJKyAiOiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkKKwkJCQkJCQkrICI6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgKHByb2JsZW0uaXNFcnJvcigpID8gdGhpcy5tYWluLmJpbmQoIm91dHB1dC5lbWFjcy5lcnJvciIpIDogdGhpcy5tYWluLmJpbmQoIm91dHB1dC5lbWFjcy53YXJuaW5nIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgIjogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJKyBwcm9ibGVtLmdldE1lc3NhZ2UoKTsKKwkJCQkJdGhpcy5wcmludGxuRXJyKHJlc3VsdCk7CisJCQkJCWZpbmFsIFN0cmluZyBlcnJvclJlcG9ydFNvdXJjZSA9IGVycm9yUmVwb3J0U291cmNlKHByb2JsZW0sIG51bGwsIHRoaXMudGFnQml0cyk7CisJCQkJCXRoaXMucHJpbnRsbkVycihlcnJvclJlcG9ydFNvdXJjZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGxvY2FsRXJyb3JDb3VudCA9PSAwKSB7CisJCQkJCQl0aGlzLnByaW50bG5FcnIoIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCXByaW50RXJyKHByb2JsZW0uaXNFcnJvcigpID8KKwkJCQkJCQl0aGlzLm1haW4uYmluZCgKKwkJCQkJCQkJCSJyZXF1ZXN0b3IuZXJyb3IiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGdsb2JhbEVycm9yQ291bnQpLAorCQkJCQkJCQkJbmV3IFN0cmluZyhmaWxlTmFtZSkpCisJCQkJCQkJCQk6IHRoaXMubWFpbi5iaW5kKAorCQkJCQkJCQkJCQkicmVxdWVzdG9yLndhcm5pbmciLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZ2xvYmFsRXJyb3JDb3VudCksCisJCQkJCQkJCQkJCW5ldyBTdHJpbmcoZmlsZU5hbWUpKSk7CisJCQkJCWZpbmFsIFN0cmluZyBlcnJvclJlcG9ydFNvdXJjZSA9IGVycm9yUmVwb3J0U291cmNlKHByb2JsZW0sIG51bGwsIDApOworCQkJCQl0aGlzLnByaW50bG5FcnIoZXJyb3JSZXBvcnRTb3VyY2UpOworCQkJCQl0aGlzLnByaW50bG5FcnIocHJvYmxlbS5nZXRNZXNzYWdlKCkpOworCQkJCQl0aGlzLnByaW50bG5FcnIoIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KIAkJCX0KLQkJCXRoaXMucHJpbnRsbkVycih0aGlzLm1haW4uYmluZCgKLQkJCQkiY29uZmlndXJlLmluY29ycmVjdENsYXNzcGF0aCIsIHdyb25nQ2xhc3NwYXRoKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCi0JCS8qKgotCQkgKiBAcGFyYW0gd3JvbmdQYXRoCi0JCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHdyb25nIHBhdGggZW50cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGxvZ0luY29ycmVjdEVuZG9yc2VkRGlyc0VudHJ5KFN0cmluZyB3cm9uZ1BhdGgpIHsKLQkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewotCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLk1FU1NBR0UsIHRoaXMubWFpbi5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0RW5kb3JzZWREaXJzRW50cnkiLCB3cm9uZ1BhdGgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkVSUk9SX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJcHVibGljIHZvaWQgbG9nZ2luZ0V4dHJhUHJvYmxlbXMoTWFpbiBjdXJyZW50TWFpbikgeworCQkJQXJyYXlMaXN0IHByb2JsZW1zID0gY3VycmVudE1haW4uZXh0cmFQcm9ibGVtczsKKwkJCWZpbmFsIGludCBjb3VudCA9IHByb2JsZW1zLnNpemUoKTsKKwkJCWludCBsb2NhbFByb2JsZW1Db3VudCA9IDA7CisJCQlpZiAoY291bnQgIT0gMCkgeworCQkJCWludCBlcnJvcnMgPSAwOworCQkJCWludCB3YXJuaW5ncyA9IDA7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCUNhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtID0gKENhdGVnb3JpemVkUHJvYmxlbSkgcHJvYmxlbXMuZ2V0KGkpOworCQkJCQlpZiAocHJvYmxlbSAhPSBudWxsKSB7CisJCQkJCQljdXJyZW50TWFpbi5nbG9iYWxQcm9ibGVtc0NvdW50Kys7CisJCQkJCQlsb2dFeHRyYVByb2JsZW0ocHJvYmxlbSwgbG9jYWxQcm9ibGVtQ291bnQsIGN1cnJlbnRNYWluLmdsb2JhbFByb2JsZW1zQ291bnQpOworCQkJCQkJbG9jYWxQcm9ibGVtQ291bnQrKzsKKwkJCQkJCWlmIChwcm9ibGVtLmlzRXJyb3IoKSkgeworCQkJCQkJCWVycm9ycysrOworCQkJCQkJCWN1cnJlbnRNYWluLmdsb2JhbEVycm9yc0NvdW50Kys7CisJCQkJCQl9IGVsc2UgaWYgKHByb2JsZW0uaXNXYXJuaW5nKCkpIHsKKwkJCQkJCQljdXJyZW50TWFpbi5nbG9iYWxXYXJuaW5nc0NvdW50Kys7CisJCQkJCQkJd2FybmluZ3MrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKKwkJCQkJaWYgKChlcnJvcnMgKyB3YXJuaW5ncykgIT0gMCkgeworCQkJCQkJc3RhcnRMb2dnaW5nRXh0cmFQcm9ibGVtcyhjb3VudCk7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJCQlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IChDYXRlZ29yaXplZFByb2JsZW0pIHByb2JsZW1zLmdldChpKTsKKwkJCQkJCQlpZiAocHJvYmxlbSE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKHByb2JsZW0uZ2V0SUQoKSAhPSBJUHJvYmxlbS5UYXNrKSB7CisJCQkJCQkJCQlsb2dYbWxFeHRyYVByb2JsZW0ocHJvYmxlbSwgbG9jYWxQcm9ibGVtQ291bnQsIGN1cnJlbnRNYWluLmdsb2JhbFByb2JsZW1zQ291bnQpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZW5kTG9nZ2luZ0V4dHJhUHJvYmxlbXMoKTsKKwkJCQkJfQorCQkJCX0KIAkJCX0KLQkJCXRoaXMucHJpbnRsbkVycih0aGlzLm1haW4uYmluZCgKLQkJCQkiY29uZmlndXJlLmluY29ycmVjdEVuZG9yc2VkRGlyc0VudHJ5Iiwgd3JvbmdQYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gd3JvbmdQYXRoCi0JCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHdyb25nIHBhdGggZW50cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGxvZ0luY29ycmVjdEV4dERpcnNFbnRyeShTdHJpbmcgd3JvbmdQYXRoKSB7Ci0JCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5NRVNTQUdFLCB0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLmluY29ycmVjdEV4dERpcnNFbnRyeSIsIHdyb25nUGF0aCkpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuRVJST1JfVEFHLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwotCQkJfQotCQkJdGhpcy5wcmludGxuRXJyKHRoaXMubWFpbi5iaW5kKAotCQkJCSJjb25maWd1cmUuaW5jb3JyZWN0RXh0RGlyc0VudHJ5Iiwgd3JvbmdQYXRoKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJCXB1YmxpYyB2b2lkIGxvZ0luY29ycmVjdFZNVmVyc2lvbkZvckFubm90YXRpb25Qcm9jZXNzaW5nKCkgewogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTUVTU0FHRSwgdGhpcy5tYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3RWTVZlcnNpb25mb3JBUFQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5FUlJPUl9UQUcsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLkVSUk9SX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCX0KIAkJCXRoaXMucHJpbnRsbkVycih0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLmluY29ycmVjdFZNVmVyc2lvbmZvckFQVCIpKTsgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC01MjEsNyArNjc1LDcgQEAKIAkJCQkJCXJlbGF0aXZlRmlsZU5hbWUsCiAJCQkJCQllLmdldE1lc3NhZ2UoKQogCQkJCQl9KSk7Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuRVJST1JfVEFHLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCXByaW50VGFnKExvZ2dlci5FUlJPUl9UQUcsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CiAJCQl9CiAJCQl0aGlzLnByaW50bG5FcnIodGhpcy5tYWluLmJpbmQoIm91dHB1dC5ub0NsYXNzRmlsZUNyZWF0ZWQiLCAvLyROT04tTkxTLTEkCiAJCQkJbmV3IFN0cmluZ1tdIHsKQEAgLTUzMSwyNiArNjg1LDE4IEBACiAJCQkJfSkpOwogCQl9CiAKLQkJcHVibGljIHZvaWQgbG9nTm9DbGFzc3BhdGgoKSB7Ci0JCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5NRVNTQUdFLCB0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLm5vQ2xhc3NwYXRoIikpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuRVJST1JfVEFHLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwotCQkJfQotCQkJdGhpcy5wcmludGxuRXJyKHRoaXMubWFpbi5iaW5kKCJjb25maWd1cmUubm9DbGFzc3BhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCiAJCS8qKgogCQkgKiBAcGFyYW0gZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlcgogCQkgKi8KIAkJcHVibGljIHZvaWQgbG9nTnVtYmVyT2ZDbGFzc0ZpbGVzR2VuZXJhdGVkKGludCBleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyKSB7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKIAkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5WQUxVRSwgbmV3IEludGVnZXIoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlcikpOwotCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLk5VTUJFUl9PRl9DTEFTU0ZJTEVTLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCXByaW50VGFnKExvZ2dlci5OVU1CRVJfT0ZfQ0xBU1NGSUxFUywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCX0KIAkJCWlmIChleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyID09IDEpIHsKLQkJCQl0aGlzLnByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoImNvbXBpbGUub25lQ2xhc3NGaWxlR2VuZXJhdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJcHJpbnRsbk91dCh0aGlzLm1haW4uYmluZCgiY29tcGlsZS5vbmVDbGFzc0ZpbGVHZW5lcmF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludGxuT3V0KHRoaXMubWFpbi5iaW5kKCJjb21waWxlLnNldmVyYWxDbGFzc0ZpbGVzR2VuZXJhdGVkIiwgLy8kTk9OLU5MUy0xJAorCQkJCXByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbENsYXNzRmlsZXNHZW5lcmF0ZWQiLCAvLyROT04tTkxTLTEkCiAJCQkJCVN0cmluZy52YWx1ZU9mKGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIpKSk7CiAJCQl9CiAJCX0KQEAgLTU2MCw3ICs3MDYsNyBAQAogCQkgKi8KIAkJcHVibGljIHZvaWQgbG9nT3B0aW9ucyhNYXAgb3B0aW9ucykgewogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuT1BUSU9OUywgbnVsbCwgdHJ1ZSwgZmFsc2UpOworCQkJCXByaW50VGFnKExvZ2dlci5PUFRJT05TLCBudWxsLCB0cnVlLCBmYWxzZSk7CiAJCQkJZmluYWwgU2V0IGVudHJpZXNTZXQgPSBvcHRpb25zLmVudHJ5U2V0KCk7CiAJCQkJT2JqZWN0W10gZW50cmllcyA9IGVudHJpZXNTZXQudG9BcnJheSgpOwogCQkJCUFycmF5cy5zb3J0KGVudHJpZXMsIG5ldyBDb21wYXJhdG9yKCkgewpAQCAtNTc1LDEyICs3MjEsMzQgQEAKIAkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwogCQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5LRVksIGtleSk7CiAJCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlZBTFVFLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuT1BUSU9OLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCQlwcmludFRhZyhMb2dnZXIuT1BUSU9OLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwogCQkJCX0KLQkJCQl0aGlzLmVuZFRhZyhMb2dnZXIuT1BUSU9OUyk7CisJCQkJZW5kVGFnKExvZ2dlci5PUFRJT05TKTsKIAkJCX0KIAkJfQogCisJCS8qKgorCQkgKiBAcGFyYW0gZXJyb3IgdGhlIGdpdmVuIGVycm9yCisJCSAqLworCQlwdWJsaWMgdm9pZCBsb2dQZW5kaW5nRXJyb3IoU3RyaW5nIGVycm9yKSB7CisJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKKwkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5NRVNTQUdFLCBlcnJvcik7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLkVSUk9SX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCX0KKwkJCXRoaXMucHJpbnRsbkVycihlcnJvcik7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIG1lc3NhZ2UgdGhlIGdpdmVuIG1lc3NhZ2UKKwkJICovCisJCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgeworCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLk1FU1NBR0UsIG1lc3NhZ2UpOworCQkJCXByaW50VGFnKExvZ2dlci5XQVJOSU5HX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCX0KKwkJCXRoaXMucHJpbnRsbk91dChtZXNzYWdlKTsKKwkJfQorCiAJCXByaXZhdGUgdm9pZCBsb2dQcm9ibGVtKENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtLCBpbnQgbG9jYWxFcnJvckNvdW50LAogCQkJaW50IGdsb2JhbEVycm9yQ291bnQsIGNoYXJbXSB1bml0U291cmNlKSB7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5FTUFDUykgIT0gMCkgewpAQCAtNTk4LDcgKzc2Niw3IEBACiAJCQkJaWYgKGxvY2FsRXJyb3JDb3VudCA9PSAwKSB7CiAJCQkJCXRoaXMucHJpbnRsbkVycigiLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQotCQkJCXRoaXMucHJpbnRFcnIocHJvYmxlbS5pc0Vycm9yKCkgPworCQkJCXByaW50RXJyKHByb2JsZW0uaXNFcnJvcigpID8KIAkJCQkJCXRoaXMubWFpbi5iaW5kKAogCQkJCQkJCQkicmVxdWVzdG9yLmVycm9yIiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGdsb2JhbEVycm9yQ291bnQpLApAQCAtNjMxLDcgKzc5OSw3IEBACiAJCQkJCUNhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07CiAJCQkJCWlmIChwcm9ibGVtICE9IG51bGwpIHsKIAkJCQkJCWN1cnJlbnRNYWluLmdsb2JhbFByb2JsZW1zQ291bnQrKzsKLQkJCQkJCXRoaXMubG9nUHJvYmxlbShwcm9ibGVtLCBsb2NhbFByb2JsZW1Db3VudCwgY3VycmVudE1haW4uZ2xvYmFsUHJvYmxlbXNDb3VudCwgdW5pdFNvdXJjZSk7CisJCQkJCQlsb2dQcm9ibGVtKHByb2JsZW0sIGxvY2FsUHJvYmxlbUNvdW50LCBjdXJyZW50TWFpbi5nbG9iYWxQcm9ibGVtc0NvdW50LCB1bml0U291cmNlKTsKIAkJCQkJCWxvY2FsUHJvYmxlbUNvdW50Kys7CiAJCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKIAkJCQkJCQlsb2NhbEVycm9yQ291bnQrKzsKQEAgLTY0OCwyOCArODE2LDI4IEBACiAJCQkJfQogCQkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewogCQkJCQlpZiAoKGVycm9ycyArIHdhcm5pbmdzKSAhPSAwKSB7Ci0JCQkJCQl0aGlzLnN0YXJ0TG9nZ2luZ1Byb2JsZW1zKGVycm9ycywgd2FybmluZ3MpOworCQkJCQkJc3RhcnRMb2dnaW5nUHJvYmxlbXMoZXJyb3JzLCB3YXJuaW5ncyk7CiAJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQkJCQlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOwogCQkJCQkJCWlmIChwcm9ibGVtIT0gbnVsbCkgewogCQkJCQkJCQlpZiAocHJvYmxlbS5nZXRJRCgpICE9IElQcm9ibGVtLlRhc2spIHsKLQkJCQkJCQkJCXRoaXMubG9nWG1sUHJvYmxlbShwcm9ibGVtLCB1bml0U291cmNlKTsKKwkJCQkJCQkJCWxvZ1htbFByb2JsZW0ocHJvYmxlbSwgdW5pdFNvdXJjZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCQl0aGlzLmVuZExvZ2dpbmdQcm9ibGVtcygpOworCQkJCQkJZW5kTG9nZ2luZ1Byb2JsZW1zKCk7CiAJCQkJCX0KIAkJCQkJaWYgKHRhc2tzICE9IDApIHsKLQkJCQkJCXRoaXMuc3RhcnRMb2dnaW5nVGFza3ModGFza3MpOworCQkJCQkJc3RhcnRMb2dnaW5nVGFza3ModGFza3MpOwogCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKIAkJCQkJCQlpZiAocHJvYmxlbSE9IG51bGwpIHsKIAkJCQkJCQkJaWYgKHByb2JsZW0uZ2V0SUQoKSA9PSBJUHJvYmxlbS5UYXNrKSB7Ci0JCQkJCQkJCQl0aGlzLmxvZ1htbFRhc2socHJvYmxlbSwgdW5pdFNvdXJjZSk7CisJCQkJCQkJCQlsb2dYbWxUYXNrKHByb2JsZW0sIHVuaXRTb3VyY2UpOwogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJdGhpcy5lbmRMb2dnaW5nVGFza3MoKTsKKwkJCQkJCWVuZExvZ2dpbmdUYXNrcygpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNjg5LDcgKzg1Nyw3IEBACiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTlVNQkVSX09GX0VSUk9SUywgbmV3IEludGVnZXIoZ2xvYmFsRXJyb3JzQ291bnQpKTsKIAkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5OVU1CRVJfT0ZfV0FSTklOR1MsIG5ldyBJbnRlZ2VyKGdsb2JhbFdhcm5pbmdzQ291bnQpKTsKIAkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5OVU1CRVJfT0ZfVEFTS1MsIG5ldyBJbnRlZ2VyKGdsb2JhbFRhc2tzQ291bnQpKTsKLQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5QUk9CTEVNX1NVTU1BUlksIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLlBST0JMRU1fU1VNTUFSWSwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCX0KIAkJCWlmIChnbG9iYWxQcm9ibGVtc0NvdW50ID09IDEpIHsKIAkJCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CkBAIC02OTgsNyArODY2LDcgQEAKIAkJCQl9IGVsc2UgewogCQkJCQltZXNzYWdlID0gdGhpcy5tYWluLmJpbmQoImNvbXBpbGUub25lV2FybmluZyIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQotCQkJCXRoaXMucHJpbnRFcnIodGhpcy5tYWluLmJpbmQoImNvbXBpbGUub25lUHJvYmxlbSIsIG1lc3NhZ2UpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXByaW50RXJyKHRoaXMubWFpbi5iaW5kKCJjb21waWxlLm9uZVByb2JsZW0iLCBtZXNzYWdlKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0gZWxzZSB7CiAJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7CiAJCQkJU3RyaW5nIHdhcm5pbmdNZXNzYWdlID0gbnVsbDsKQEAgLTcxOSwxOCArODg3LDE4IEBACiAJCQkJfQogCQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCB3YXJuaW5nTWVzc2FnZSA9PSBudWxsKSB7CiAJCQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCQkJdGhpcy5wcmludEVycih0aGlzLm1haW4uYmluZCgKKwkJCQkJCXByaW50RXJyKHRoaXMubWFpbi5iaW5kKAogCQkJCQkJCSJjb21waWxlLnNldmVyYWxQcm9ibGVtc0Vycm9yc09yV2FybmluZ3MiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJU3RyaW5nLnZhbHVlT2YoZ2xvYmFsUHJvYmxlbXNDb3VudCksCiAJCQkJCQkJd2FybmluZ01lc3NhZ2UpKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMucHJpbnRFcnIodGhpcy5tYWluLmJpbmQoCisJCQkJCQlwcmludEVycih0aGlzLm1haW4uYmluZCgKIAkJCQkJCQkiY29tcGlsZS5zZXZlcmFsUHJvYmxlbXNFcnJvcnNPcldhcm5pbmdzIiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJCVN0cmluZy52YWx1ZU9mKGdsb2JhbFByb2JsZW1zQ291bnQpLAogCQkJCQkJCWVycm9yTWVzc2FnZSkpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5wcmludEVycih0aGlzLm1haW4uYmluZCgKKwkJCQkJcHJpbnRFcnIodGhpcy5tYWluLmJpbmQoCiAJCQkJCQkiY29tcGlsZS5zZXZlcmFsUHJvYmxlbXNFcnJvcnNBbmRXYXJuaW5ncyIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCQkJU3RyaW5nLnZhbHVlT2YoZ2xvYmFsUHJvYmxlbXNDb3VudCksCkBAIC03NDgsNyArOTE2LDcgQEAKIAkJICoKIAkJICovCiAJCXB1YmxpYyB2b2lkIGxvZ1Byb2dyZXNzKCkgewotCQkJdGhpcy5wcmludE91dCgnLicpOworCQkJcHJpbnRPdXQoJy4nKTsKIAkJfQogCiAJCS8qKgpAQCAtNzU4LDMwICs5MjYsNDkgQEAKIAkJICogICAgICAgICAgICB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHJlcGV0aXRpb25zCiAJCSAqLwogCQlwdWJsaWMgdm9pZCBsb2dSZXBldGl0aW9uKGludCBpLCBpbnQgcmVwZXRpdGlvbnMpIHsKLQkJCXRoaXMucHJpbnRsbk91dCh0aGlzLm1haW4uYmluZCgiY29tcGlsZS5yZXBldGl0aW9uIiwgLy8kTk9OLU5MUy0xJAorCQkJcHJpbnRsbk91dCh0aGlzLm1haW4uYmluZCgiY29tcGlsZS5yZXBldGl0aW9uIiwgLy8kTk9OLU5MUy0xJAogCQkJCVN0cmluZy52YWx1ZU9mKGkgKyAxKSwgU3RyaW5nLnZhbHVlT2YocmVwZXRpdGlvbnMpKSk7CiAJCX0KLQogCQkvKioKLQkJICogQHBhcmFtIHRpbWUKLQkJICogQHBhcmFtIGxpbmVDb3VudAorCQkgKiBAcGFyYW0gY29tcGlsZXJTdGF0cwogCQkgKi8KLQkJcHVibGljIHZvaWQgbG9nVGltaW5nKGxvbmcgdGltZSwgbG9uZyBsaW5lQ291bnQpIHsKKwkJcHVibGljIHZvaWQgbG9nVGltaW5nKENvbXBpbGVyU3RhdHMgY29tcGlsZXJTdGF0cykgeworCQkJbG9uZyB0aW1lID0gY29tcGlsZXJTdGF0cy5lbGFwc2VkVGltZSgpOworCQkJbG9uZyBsaW5lQ291bnQgPSBjb21waWxlclN0YXRzLmxpbmVDb3VudDsKIAkJCWlmICgodGhpcy50YWdCaXRzICYgTG9nZ2VyLlhNTCkgIT0gMCkgewogCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlZBTFVFLCBuZXcgTG9uZyh0aW1lKSk7Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuVElNRSwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCQlwcmludFRhZyhMb2dnZXIuVElNRSwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5WQUxVRSwgbmV3IExvbmcobGluZUNvdW50KSk7Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuTlVNQkVSX09GX0xJTkVTLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCXByaW50VGFnKExvZ2dlci5OVU1CRVJfT0ZfTElORVMsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CiAJCQl9CiAJCQlpZiAobGluZUNvdW50ICE9IDApIHsKLQkJCQl0aGlzLnByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoCi0JCQkJCSJjb21waWxlLmluc3RhbnRUaW1lIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJU3RyaW5nLnZhbHVlT2YobGluZUNvdW50KSwKLQkJCQkJCVN0cmluZy52YWx1ZU9mKHRpbWUpLAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoKChpbnQpIChsaW5lQ291bnQgKiAxMDAwMC4wIC8gdGltZSkpIC8gMTAuMCkgfSkpOworCQkJCXByaW50bG5PdXQoCisJCQkJCXRoaXMubWFpbi5iaW5kKCJjb21waWxlLmluc3RhbnRUaW1lIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQlTdHJpbmcudmFsdWVPZihsaW5lQ291bnQpLAorCQkJCQkJCVN0cmluZy52YWx1ZU9mKHRpbWUpLAorCQkJCQkJCVN0cmluZy52YWx1ZU9mKCgoaW50KSAobGluZUNvdW50ICogMTAwMDAuMCAvIHRpbWUpKSAvIDEwLjApLAorCQkJCQkJfSkpOwogCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW50bG5PdXQodGhpcy5tYWluLmJpbmQoImNvbXBpbGUudG90YWxUaW1lIiwgU3RyaW5nLnZhbHVlT2YodGltZSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXByaW50bG5PdXQoCisJCQkJCXRoaXMubWFpbi5iaW5kKCJjb21waWxlLnRvdGFsVGltZSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQkJU3RyaW5nLnZhbHVlT2YodGltZSksCisJCQkJCQl9KSk7CisJCQl9CisJCQlpZiAoKHRoaXMubWFpbi50aW1pbmcgJiBNYWluLlRJTUlOR19ERVRBSUxFRCkgIT0gMCkgeworCQkJCXByaW50bG5PdXQoCisJCQkJCQl0aGlzLm1haW4uYmluZCgiY29tcGlsZS5kZXRhaWxlZFRpbWUiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoY29tcGlsZXJTdGF0cy5wYXJzZVRpbWUpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZigoKGludCkgKGNvbXBpbGVyU3RhdHMucGFyc2VUaW1lICogMTAwMC4wIC8gdGltZSkpIC8gMTAuMCksCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKGNvbXBpbGVyU3RhdHMucmVzb2x2ZVRpbWUpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZigoKGludCkgKGNvbXBpbGVyU3RhdHMucmVzb2x2ZVRpbWUgKiAxMDAwLjAgLyB0aW1lKSkgLyAxMC4wKSwKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoY29tcGlsZXJTdGF0cy5hbmFseXplVGltZSksCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKCgoaW50KSAoY29tcGlsZXJTdGF0cy5hbmFseXplVGltZSAqIDEwMDAuMCAvIHRpbWUpKSAvIDEwLjApLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZihjb21waWxlclN0YXRzLmdlbmVyYXRlVGltZSksCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKCgoaW50KSAoY29tcGlsZXJTdGF0cy5nZW5lcmF0ZVRpbWUgKiAxMDAwLjAgLyB0aW1lKSkgLyAxMC4wKSwKKwkJCQkJCQl9KSk7CiAJCQl9CiAJCX0KIApAQCAtNzkwLDcgKzk3Nyw3IEBACiAJCSAqIEBwYXJhbSB1c2FnZQogCQkgKi8KIAkJcHVibGljIHZvaWQgbG9nVXNhZ2UoU3RyaW5nIHVzYWdlKSB7Ci0JCQl0aGlzLnByaW50bG5PdXQodXNhZ2UpOworCQkJcHJpbnRsbk91dCh1c2FnZSk7CiAJCX0KIAogCQkvKioKQEAgLTgyMiwxNyArMTAwOSwzMiBAQAogCQkJCXRoaXMub3V0LmZsdXNoKCk7CiAJCQl9CiAJCX0KKwogCQkvKioKIAkJICogUHJpbnQgdGhlIHVzYWdlIG9mIHdyb25nIEpESwogCQkgKi8KIAkJcHVibGljIHZvaWQgbG9nV3JvbmdKREsoKSB7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKIAkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5NRVNTQUdFLCB0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLnJlcXVpcmVzSkRLMS4yb3JBYm92ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkVSUk9SLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCXByaW50VGFnKExvZ2dlci5FUlJPUiwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCX0KIAkJCXRoaXMucHJpbnRsbkVycih0aGlzLm1haW4uYmluZCgiY29uZmlndXJlLnJlcXVpcmVzSkRLMS4yb3JBYm92ZSIpKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKKwkJcHJpdmF0ZSB2b2lkIGxvZ1htbEV4dHJhUHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSwgaW50IGdsb2JhbEVycm9yQ291bnQsIGludCBsb2NhbEVycm9yQ291bnQpIHsKKwkJCWZpbmFsIGludCBzb3VyY2VTdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKKwkJCWZpbmFsIGludCBzb3VyY2VFbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOworCQkJYm9vbGVhbiBpc0Vycm9yID0gcHJvYmxlbS5pc0Vycm9yKCk7CisJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX1NFVkVSSVRZLCBpc0Vycm9yID8gTG9nZ2VyLkVSUk9SIDogTG9nZ2VyLldBUk5JTkcpOworCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuUFJPQkxFTV9MSU5FLCBuZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSkpOworCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuUFJPQkxFTV9TT1VSQ0VfU1RBUlQsIG5ldyBJbnRlZ2VyKHNvdXJjZVN0YXJ0KSk7CisJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX1NPVVJDRV9FTkQsIG5ldyBJbnRlZ2VyKHNvdXJjZUVuZCkpOworCQkJcHJpbnRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1fVEFHLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKKwkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlZBTFVFLCBwcm9ibGVtLmdldE1lc3NhZ2UoKSk7CisJCQlwcmludFRhZyhMb2dnZXIuUFJPQkxFTV9NRVNTQUdFLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJZXh0cmFjdENvbnRleHQocHJvYmxlbSwgbnVsbCk7CisJCQllbmRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1fVEFHKTsKKwkJfQogCQkvKioKIAkJICogQHBhcmFtIHByb2JsZW0KIAkJICogICAgICAgICAgICB0aGUgZ2l2ZW4gcHJvYmxlbSB0byBsb2cKQEAgLTg1NywyMyArMTA1OSwyMiBAQAogCQkJfQogCQkJaW50IGNhdGVnb3J5SUQgPSBQcm9ibGVtUmVwb3J0ZXIuZ2V0UHJvYmxlbUNhdGVnb3J5KHNldmVyaXR5LCBpZCk7CiAJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX0NBVEVHT1JZX0lELCBuZXcgSW50ZWdlcihjYXRlZ29yeUlEKSk7Ci0JCQl0aGlzLnByaW50VGFnKExvZ2dlci5QUk9CTEVNX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCBmYWxzZSk7CisJCQlwcmludFRhZyhMb2dnZXIuUFJPQkxFTV9UQUcsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOwogCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuVkFMVUUsIHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsKLQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlBST0JMRU1fTUVTU0FHRSwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCXByaW50VGFnKExvZ2dlci5QUk9CTEVNX01FU1NBR0UsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CiAJCQlleHRyYWN0Q29udGV4dChwcm9ibGVtLCB1bml0U291cmNlKTsKIAkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IHByb2JsZW0uZ2V0QXJndW1lbnRzKCk7CiAJCQlmaW5hbCBpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJCWlmIChsZW5ndGggIT0gMCkgewotCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlBST0JMRU1fQVJHVU1FTlRTLCBudWxsLCB0cnVlLCBmYWxzZSk7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLlBST0JMRU1fQVJHVU1FTlRTLCBudWxsLCB0cnVlLCBmYWxzZSk7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX0FSR1VNRU5UX1ZBTFVFLCBhcmd1bWVudHNbaV0pOwotCQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5QUk9CTEVNX0FSR1VNRU5ULCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOworCQkJCQlwcmludFRhZyhMb2dnZXIuUFJPQkxFTV9BUkdVTUVOVCwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKIAkJCQl9Ci0JCQkJdGhpcy5lbmRUYWcoTG9nZ2VyLlBST0JMRU1fQVJHVU1FTlRTKTsKKwkJCQllbmRUYWcoTG9nZ2VyLlBST0JMRU1fQVJHVU1FTlRTKTsKIAkJCX0KLQkJCXRoaXMuZW5kVGFnKExvZ2dlci5QUk9CTEVNX1RBRyk7CisJCQllbmRUYWcoTG9nZ2VyLlBST0JMRU1fVEFHKTsKIAkJfQotCiAJCS8qKgogCQkgKiBAcGFyYW0gcHJvYmxlbQogCQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBwcm9ibGVtIHRvIGxvZwpAQCAtODg4LDExICsxMDg5LDExIEBACiAJCQlpZiAocHJvYmxlbU9wdGlvbktleSAhPSBudWxsKSB7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuUFJPQkxFTV9PUFRJT05fS0VZLCBwcm9ibGVtT3B0aW9uS2V5KTsKIAkJCX0KLQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlRBU0ssIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOworCQkJcHJpbnRUYWcoTG9nZ2VyLlRBU0ssIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOwogCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuVkFMVUUsIHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsKLQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlBST0JMRU1fTUVTU0FHRSwgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCB0cnVlKTsKKwkJCXByaW50VGFnKExvZ2dlci5QUk9CTEVNX01FU1NBR0UsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7CiAJCQlleHRyYWN0Q29udGV4dChwcm9ibGVtLCB1bml0U291cmNlKTsKLQkJCXRoaXMuZW5kVGFnKExvZ2dlci5UQVNLKTsKKwkJCWVuZFRhZyhMb2dnZXIuVEFTSyk7CiAJCX0KIAogCQlwcml2YXRlIHZvaWQgcHJpbnRFcnIoU3RyaW5nIHMpIHsKQEAgLTkwOCwxMiArMTEwOSwxNCBAQAogCQkJCXRoaXMubG9nLnByaW50bG4oKTsKIAkJCX0KIAkJfQorCiAJCXByaXZhdGUgdm9pZCBwcmludGxuRXJyKFN0cmluZyBzKSB7CiAJCQl0aGlzLmVyci5wcmludGxuKHMpOwogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSA9PSAwICYmIHRoaXMubG9nICE9IG51bGwpIHsKIAkJCQl0aGlzLmxvZy5wcmludGxuKHMpOwogCQkJfQogCQl9CisKIAkJcHJpdmF0ZSB2b2lkIHByaW50bG5PdXQoU3RyaW5nIHMpIHsKIAkJCXRoaXMub3V0LnByaW50bG4ocyk7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpID09IDAgJiYgdGhpcy5sb2cgIT0gbnVsbCkgewpAQCAtOTMzLDU4ICsxMTM2LDU0IEBACiAJCX0KIAogCQlwdWJsaWMgdm9pZCBwcmludFN0YXRzKCkgewotCQkJZmluYWwgYm9vbGVhbiBpc1RpbWVkID0gdGhpcy5tYWluLnRpbWluZzsKKwkJCWZpbmFsIGJvb2xlYW4gaXNUaW1lZCA9ICh0aGlzLm1haW4udGltaW5nICYgVElNSU5HX0VOQUJMRUQpICE9IDA7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5TVEFUUywgbnVsbCwgdHJ1ZSwgZmFsc2UpOworCQkJCXByaW50VGFnKExvZ2dlci5TVEFUUywgbnVsbCwgdHJ1ZSwgZmFsc2UpOwogCQkJfQogCQkJaWYgKGlzVGltZWQpIHsKLQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRoaXMubWFpbi5zdGFydFRpbWU7Ci0JCQkJdGhpcy5sb2dUaW1pbmcodGltZSwgdGhpcy5tYWluLmxpbmVDb3VudCk7Ci0JCQkJaWYgKHRoaXMubWFpbi50aW1lcyAhPSBudWxsKSB7Ci0JCQkJCXRoaXMubWFpbi50aW1lc1t0aGlzLm1haW4udGltZXNDb3VudGVyKytdID0gdGltZTsKLQkJCQl9CisJCQkJQ29tcGlsZXJTdGF0cyBjb21waWxlclN0YXRzID0gdGhpcy5tYWluLmJhdGNoQ29tcGlsZXIuc3RhdHM7CisJCQkJY29tcGlsZXJTdGF0cy5zdGFydFRpbWUgPSB0aGlzLm1haW4uc3RhcnRUaW1lOyAvLyBhbHNvIGluY2x1ZGUgYmF0Y2ggaW5pdGlhbGl6YXRpb24gdGltZXMKKwkJCQljb21waWxlclN0YXRzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gYWxzbyBpbmNsdWRlIGJhdGNoIG91dHB1dCB0aW1lcworCQkJCWxvZ1RpbWluZyhjb21waWxlclN0YXRzKTsKIAkJCX0KIAkJCWlmICh0aGlzLm1haW4uZ2xvYmFsUHJvYmxlbXNDb3VudCA+IDApIHsKLQkJCQl0aGlzLmxvZ1Byb2JsZW1zU3VtbWFyeSh0aGlzLm1haW4uZ2xvYmFsUHJvYmxlbXNDb3VudCwgdGhpcy5tYWluLmdsb2JhbEVycm9yc0NvdW50LCB0aGlzLm1haW4uZ2xvYmFsV2FybmluZ3NDb3VudCwgbWFpbi5nbG9iYWxUYXNrc0NvdW50KTsKKwkJCQlsb2dQcm9ibGVtc1N1bW1hcnkodGhpcy5tYWluLmdsb2JhbFByb2JsZW1zQ291bnQsIHRoaXMubWFpbi5nbG9iYWxFcnJvcnNDb3VudCwgdGhpcy5tYWluLmdsb2JhbFdhcm5pbmdzQ291bnQsIHRoaXMubWFpbi5nbG9iYWxUYXNrc0NvdW50KTsKIAkJCX0KIAkJCWlmICh0aGlzLm1haW4uZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciAhPSAwCiAJCQkJCSYmICh0aGlzLm1haW4uc2hvd1Byb2dyZXNzIHx8IGlzVGltZWQgfHwgdGhpcy5tYWluLnZlcmJvc2UpKSB7Ci0JCQkJdGhpcy5sb2dOdW1iZXJPZkNsYXNzRmlsZXNHZW5lcmF0ZWQodGhpcy5tYWluLmV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIpOworCQkJCWxvZ051bWJlck9mQ2xhc3NGaWxlc0dlbmVyYXRlZCh0aGlzLm1haW4uZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlcik7CiAJCQl9CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLmVuZFRhZyhMb2dnZXIuU1RBVFMpOworCQkJCWVuZFRhZyhMb2dnZXIuU1RBVFMpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSB2b2lkIHByaW50VGFnKFN0cmluZyBuYW1lLCBIYXNoTWFwIHBhcmFtcywgYm9vbGVhbiBpbnNlcnROZXdMaW5lLCBib29sZWFuIGNsb3NlVGFnKSB7Ci0JCQkoKEdlbmVyaWNYTUxXcml0ZXIpIHRoaXMubG9nKS5wcmludFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlLCBpbnNlcnROZXdMaW5lLCBjbG9zZVRhZyk7CisJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkgeworCQkJCSgoR2VuZXJpY1hNTFdyaXRlcikgdGhpcy5sb2cpLnByaW50VGFnKG5hbWUsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgaW5zZXJ0TmV3TGluZSwgY2xvc2VUYWcpOworCQkJfQogCQkJdGhpcy5wYXJhbWV0ZXJzLmNsZWFyKCk7CiAJCX0KIAogCQlwdWJsaWMgdm9pZCBzZXRFbWFjcygpIHsKIAkJCXRoaXMudGFnQml0cyB8PSBMb2dnZXIuRU1BQ1M7CiAJCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRMb2coU3RyaW5nIGxvZ0ZpbGVOYW1lKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkJcHVibGljIHZvaWQgc2V0TG9nKFN0cmluZyBsb2dGaWxlTmFtZSkgewogCQkJZmluYWwgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKIAkJCWZpbmFsIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JULCBEYXRlRm9ybWF0LkxPTkcsIExvY2FsZS5nZXREZWZhdWx0KCkpOwogCQkJdHJ5IHsKIAkJCQlpbnQgaW5kZXggPSBsb2dGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwogCQkJCWlmIChpbmRleCAhPSAtMSkgewogCQkJCQlpZiAobG9nRmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4KS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRoaXMubG9nID0gbmV3IEdlbmVyaWNYTUxXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nRmlsZU5hbWUsIGZhbHNlKSwgVXRpbC5MSU5FX1NFUEFSQVRPUiwgdHJ1ZSk7CisJCQkJCQl0aGlzLmxvZyA9IG5ldyBHZW5lcmljWE1MV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nRmlsZU5hbWUsIGZhbHNlKSwgVXRpbC5VVEZfOCksIFV0aWwuTElORV9TRVBBUkFUT1IsIHRydWUpOwogCQkJCQkJdGhpcy50YWdCaXRzIHw9IExvZ2dlci5YTUw7CiAJCQkJCQkvLyBpbnNlcnQgdGltZSBzdGFtcCBhcyBjb21tZW50Ci0JCQkJCQl0cnkgewotCQkJCQkJCXRoaXMubG9nLnByaW50bG4oIjwhLS0gIiArIG5ldyBTdHJpbmcoZGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkuZ2V0Qnl0ZXMoKSwgIlVURi04IikgKyAiIC0tPiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KKwkJCQkJCXRoaXMubG9nLnByaW50bG4oIjwhLS0gIiArIGRhdGVGb3JtYXQuZm9ybWF0KGRhdGUpICsgIiAtLT4iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQkJCQkJdGhpcy5sb2cucHJpbnRsbihMb2dnZXIuWE1MX0RURF9ERUNMQVJBVElPTik7CiAJCQkJCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5DT01QSUxFUl9OQU1FLCB0aGlzLm1haW4uYmluZCgiY29tcGlsZXIubmFtZSIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuQ09NUElMRVJfVkVSU0lPTiwgdGhpcy5tYWluLmJpbmQoImNvbXBpbGVyLnZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLkNPTVBJTEVSX0NPUFlSSUdIVCwgdGhpcy5tYWluLmJpbmQoImNvbXBpbGVyLmNvcHlyaWdodCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuQ09NUElMRVIsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOworCQkJCQkJcHJpbnRUYWcoTG9nZ2VyLkNPTVBJTEVSLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXRoaXMubG9nID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZ0ZpbGVOYW1lLCBmYWxzZSkpOwogCQkJCQkJdGhpcy5sb2cucHJpbnRsbigiIyAiICsgZGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOy8vJE5PTi1OTFMtMSQKQEAgLTk5NCw5ICsxMTkzLDE1IEBACiAJCQkJCXRoaXMubG9nLnByaW50bG4oIiMgIiArIGRhdGVGb3JtYXQuZm9ybWF0KGRhdGUpKTsvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMubWFpbi5iaW5kKCJjb25maWd1cmUuY2Fubm90T3BlbkxvZyIsIGxvZ0ZpbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMubWFpbi5iaW5kKCJjb25maWd1cmUuY2Fubm90T3BlbkxvZyIsIGxvZ0ZpbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5tYWluLmJpbmQoImNvbmZpZ3VyZS5jYW5ub3RPcGVuTG9nSW52YWxpZEVuY29kaW5nIiwgbG9nRmlsZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CisJCXByaXZhdGUgdm9pZCBzdGFydExvZ2dpbmdFeHRyYVByb2JsZW1zKGludCBjb3VudCkgeworCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTlVNQkVSX09GX1BST0JMRU1TLCBuZXcgSW50ZWdlcihjb3VudCkpOworCQkJcHJpbnRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1TLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKKwkJfQogCiAJCS8qKgogCQkgKiBVc2VkIHRvIHN0YXJ0IGxvZ2dpbmcgcHJvYmxlbXMuCkBAIC0xMDA2LDEyICsxMjExLDcgQEAKIAkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLk5VTUJFUl9PRl9QUk9CTEVNUywgbmV3IEludGVnZXIoZXJyb3JzICsgd2FybmluZ3MpKTsKIAkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLk5VTUJFUl9PRl9FUlJPUlMsIG5ldyBJbnRlZ2VyKGVycm9ycykpOwogCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTlVNQkVSX09GX1dBUk5JTkdTLCBuZXcgSW50ZWdlcih3YXJuaW5ncykpOwotCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuUFJPQkxFTVMsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc3RhcnRMb2dnaW5nRXh0cmFQcm9ibGVtcyhpbnQgY291bnQpIHsKLQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLk5VTUJFUl9PRl9QUk9CTEVNUywgbmV3IEludGVnZXIoY291bnQpKTsKLQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLkVYVFJBX1BST0JMRU1TLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKKwkJCXByaW50VGFnKExvZ2dlci5QUk9CTEVNUywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCBmYWxzZSk7CiAJCX0KIAogCQlwdWJsaWMgdm9pZCBzdGFydExvZ2dpbmdTb3VyY2UoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKQEAgLTEwNDIsMjg2ICsxMjQyLDUyIEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuU09VUkNFLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKKwkJCQlwcmludFRhZyhMb2dnZXIuU09VUkNFLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKIAkJCX0KIAkJfQorCiAJCXB1YmxpYyB2b2lkIHN0YXJ0TG9nZ2luZ1NvdXJjZXMoKSB7CiAJCQlpZiAoKHRoaXMudGFnQml0cyAmIExvZ2dlci5YTUwpICE9IDApIHsKLQkJCQl0aGlzLnByaW50VGFnKExvZ2dlci5TT1VSQ0VTLCBudWxsLCB0cnVlLCBmYWxzZSk7CisJCQkJcHJpbnRUYWcoTG9nZ2VyLlNPVVJDRVMsIG51bGwsIHRydWUsIGZhbHNlKTsKIAkJCX0KIAkJfQorCiAJCXB1YmxpYyB2b2lkIHN0YXJ0TG9nZ2luZ1Rhc2tzKGludCB0YXNrcykgewogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7CiAJCQkJdGhpcy5wYXJhbWV0ZXJzLnB1dChMb2dnZXIuTlVNQkVSX09GX1RBU0tTLCBuZXcgSW50ZWdlcih0YXNrcykpOwotCQkJCXRoaXMucHJpbnRUYWcoTG9nZ2VyLlRBU0tTLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIGZhbHNlKTsKKwkJCQlwcmludFRhZyhMb2dnZXIuVEFTS1MsIHRoaXMucGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOwogCQkJfQogCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9nZ2luZ0V4dHJhUHJvYmxlbXMoTWFpbiBjdXJyZW50TWFpbikgewotCQkJQXJyYXlMaXN0IHByb2JsZW1zID0gY3VycmVudE1haW4uZXh0cmFQcm9ibGVtczsKLQkJCWZpbmFsIGludCBjb3VudCA9IHByb2JsZW1zLnNpemUoKTsKLQkJCWludCBsb2NhbEVycm9yQ291bnQgPSAwOwotCQkJaW50IGxvY2FsUHJvYmxlbUNvdW50ID0gMDsKLQkJCWlmIChjb3VudCAhPSAwKSB7Ci0JCQkJaW50IGVycm9ycyA9IDA7Ci0JCQkJaW50IHdhcm5pbmdzID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0gPSAoQ2F0ZWdvcml6ZWRQcm9ibGVtKSBwcm9ibGVtcy5nZXQoaSk7Ci0JCQkJCWlmIChwcm9ibGVtICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRNYWluLmdsb2JhbFByb2JsZW1zQ291bnQrKzsKLQkJCQkJCXRoaXMubG9nRXh0cmFQcm9ibGVtKHByb2JsZW0sIGxvY2FsUHJvYmxlbUNvdW50LCBjdXJyZW50TWFpbi5nbG9iYWxQcm9ibGVtc0NvdW50KTsKLQkJCQkJCWxvY2FsUHJvYmxlbUNvdW50Kys7Ci0JCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKLQkJCQkJCQlsb2NhbEVycm9yQ291bnQrKzsKLQkJCQkJCQllcnJvcnMrKzsKLQkJCQkJCQljdXJyZW50TWFpbi5nbG9iYWxFcnJvcnNDb3VudCsrOwotCQkJCQkJfSBlbHNlIGlmIChwcm9ibGVtLmlzV2FybmluZygpKSB7Ci0JCQkJCQkJY3VycmVudE1haW4uZ2xvYmFsV2FybmluZ3NDb3VudCsrOwotCQkJCQkJCXdhcm5pbmdzKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuWE1MKSAhPSAwKSB7Ci0JCQkJCWlmICgoZXJyb3JzICsgd2FybmluZ3MpICE9IDApIHsKLQkJCQkJCXRoaXMuc3RhcnRMb2dnaW5nRXh0cmFQcm9ibGVtcyhjb3VudCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCQlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IChDYXRlZ29yaXplZFByb2JsZW0pIHByb2JsZW1zLmdldChpKTsKLQkJCQkJCQlpZiAocHJvYmxlbSE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHByb2JsZW0uZ2V0SUQoKSAhPSBJUHJvYmxlbS5UYXNrKSB7Ci0JCQkJCQkJCQl0aGlzLmxvZ1htbEV4dHJhUHJvYmxlbShwcm9ibGVtLCBsb2NhbFByb2JsZW1Db3VudCwgY3VycmVudE1haW4uZ2xvYmFsUHJvYmxlbXNDb3VudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLmVuZExvZ2dpbmdFeHRyYVByb2JsZW1zKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbG9nWG1sRXh0cmFQcm9ibGVtKENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtLCBpbnQgZ2xvYmFsRXJyb3JDb3VudCwgaW50IGxvY2FsRXJyb3JDb3VudCkgewotCQkJZmluYWwgaW50IHNvdXJjZVN0YXJ0ID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOwotCQkJZmluYWwgaW50IHNvdXJjZUVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCk7Ci0JCQlib29sZWFuIGlzRXJyb3IgPSBwcm9ibGVtLmlzRXJyb3IoKTsKLQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlBST0JMRU1fU0VWRVJJVFksIGlzRXJyb3IgPyBMb2dnZXIuRVJST1IgOiBMb2dnZXIuV0FSTklORyk7Ci0JCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX0xJTkUsIG5ldyBJbnRlZ2VyKHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpKSk7Ci0JCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5QUk9CTEVNX1NPVVJDRV9TVEFSVCwgbmV3IEludGVnZXIoc291cmNlU3RhcnQpKTsKLQkJCXRoaXMucGFyYW1ldGVycy5wdXQoTG9nZ2VyLlBST0JMRU1fU09VUkNFX0VORCwgbmV3IEludGVnZXIoc291cmNlRW5kKSk7Ci0JCQl0aGlzLnByaW50VGFnKExvZ2dlci5FWFRSQV9QUk9CTEVNX1RBRywgdGhpcy5wYXJhbWV0ZXJzLCB0cnVlLCBmYWxzZSk7Ci0JCQl0aGlzLnBhcmFtZXRlcnMucHV0KExvZ2dlci5WQUxVRSwgcHJvYmxlbS5nZXRNZXNzYWdlKCkpOwotCQkJdGhpcy5wcmludFRhZyhMb2dnZXIuUFJPQkxFTV9NRVNTQUdFLCB0aGlzLnBhcmFtZXRlcnMsIHRydWUsIHRydWUpOwotCQkJZXh0cmFjdENvbnRleHQocHJvYmxlbSwgbnVsbCk7Ci0JCQl0aGlzLmVuZFRhZyhMb2dnZXIuRVhUUkFfUFJPQkxFTV9UQUcpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGxvZ0V4dHJhUHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSwgaW50IGxvY2FsRXJyb3JDb3VudCwgaW50IGdsb2JhbEVycm9yQ291bnQpIHsKLQkJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lID0gcHJvYmxlbS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPQotCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUgPT0gbnVsbAotCQkJCT8gdGhpcy5tYWluLmJpbmQoInJlcXVlc3Rvci5ub0ZpbGVOYW1lU3BlY2lmaWVkIikvLyROT04tTkxTLTEkCi0JCQkJOiBuZXcgU3RyaW5nKG9yaWdpbmF0aW5nRmlsZU5hbWUpOwotCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBMb2dnZXIuRU1BQ1MpICE9IDApIHsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gZmlsZU5hbWUKLQkJCQkJCSsgIjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkKLQkJCQkJCSsgIjogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIChwcm9ibGVtLmlzRXJyb3IoKSA/IHRoaXMubWFpbi5iaW5kKCJvdXRwdXQuZW1hY3MuZXJyb3IiKSA6IHRoaXMubWFpbi5iaW5kKCJvdXRwdXQuZW1hY3Mud2FybmluZyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCSsgIjogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHByb2JsZW0uZ2V0TWVzc2FnZSgpOwotCQkJCXRoaXMucHJpbnRsbkVycihyZXN1bHQpOwotCQkJCWZpbmFsIFN0cmluZyBlcnJvclJlcG9ydFNvdXJjZSA9IGVycm9yUmVwb3J0U291cmNlKHByb2JsZW0sIG51bGwsIHRoaXMudGFnQml0cyk7Ci0JCQkJdGhpcy5wcmludGxuRXJyKGVycm9yUmVwb3J0U291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxvY2FsRXJyb3JDb3VudCA9PSAwKSB7Ci0JCQkJCXRoaXMucHJpbnRsbkVycigiLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRoaXMucHJpbnRFcnIocHJvYmxlbS5pc0Vycm9yKCkgPwotCQkJCQkJdGhpcy5tYWluLmJpbmQoCi0JCQkJCQkJCSJyZXF1ZXN0b3IuZXJyb3IiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZ2xvYmFsRXJyb3JDb3VudCksCi0JCQkJCQkJCW5ldyBTdHJpbmcoZmlsZU5hbWUpKQotCQkJCQkJCQk6IHRoaXMubWFpbi5iaW5kKAotCQkJCQkJCQkJCSJyZXF1ZXN0b3Iud2FybmluZyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGdsb2JhbEVycm9yQ291bnQpLAotCQkJCQkJCQkJCW5ldyBTdHJpbmcoZmlsZU5hbWUpKSk7Ci0JCQkJZmluYWwgU3RyaW5nIGVycm9yUmVwb3J0U291cmNlID0gZXJyb3JSZXBvcnRTb3VyY2UocHJvYmxlbSwgbnVsbCwgMCk7Ci0JCQkJdGhpcy5wcmludGxuRXJyKGVycm9yUmVwb3J0U291cmNlKTsKLQkJCQl0aGlzLnByaW50bG5FcnIocHJvYmxlbS5nZXRNZXNzYWdlKCkpOwotCQkJCXRoaXMucHJpbnRsbkVycigiLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBlcnJvclJlcG9ydFNvdXJjZShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSwgY2hhcltdIHVuaXRTb3VyY2UsIGludCBiaXRzKSB7Ci0JCQkvL2V4dHJhIGZyb20gdGhlIHNvdXJjZSB0aGUgaW5uYWN1cmF0ZSAgICAgdG9rZW4KLQkJCS8vYW5kICJoaWdobGlnaHQiIGl0IHVzaW5nIHNvbWUgdW5kZXJuZWF0aCBeXl5eXgotCQkJLy9wdXQgc29tZSBjb250ZXh0IGFyb3VuZCB0b28uCi0KLQkJCS8vdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgZm9udCB1c2VkIGluIHRoZSBjb25zb2xlIGlzIGZpeGVkIHNpemUKLQotCQkJLy9zYW5pdHkgLi4uLi4KLQkJCWludCBzdGFydFBvc2l0aW9uID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOwotCQkJaW50IGVuZFBvc2l0aW9uID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKLQkJCWlmICh1bml0U291cmNlID09IG51bGwpIHsKLQkJCQlpZiAocHJvYmxlbS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJdW5pdFNvdXJjZSA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KG5ldyBGaWxlKG5ldyBTdHJpbmcocHJvYmxlbS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpKSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBsZW5ndGggPSB1bml0U291cmNlID09IG51bGwgPyAwIDogdW5pdFNvdXJjZS5sZW5ndGg7Ci0JCQlpZiAoKHN0YXJ0UG9zaXRpb24gPiBlbmRQb3NpdGlvbikKLQkJCQl8fCAoKHN0YXJ0UG9zaXRpb24gPCAwKSAmJiAoZW5kUG9zaXRpb24gPCAwKSkKLQkJCQl8fCBsZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMucHJvYmxlbV9ub1NvdXJjZUluZm9ybWF0aW9uOyAKLQotCQkJU3RyaW5nQnVmZmVyIGVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKChiaXRzICYgTWFpbi5Mb2dnZXIuRU1BQ1MpID09IDApIHsKLQkJCQllcnJvckJ1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5wcm9ibGVtX2F0TGluZSwgU3RyaW5nLnZhbHVlT2YocHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpKSk7IAotCQkJCWVycm9yQnVmZmVyLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWVycm9yQnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJCQotCQkJY2hhciBjOwotCQkJZmluYWwgY2hhciBTUEFDRSA9ICdcdTAwMjAnOwotCQkJZmluYWwgY2hhciBNQVJLID0gJ14nOwotCQkJZmluYWwgY2hhciBUQUIgPSAnXHQnOwotCQkJLy90aGUgbmV4dCBjb2RlIHRyaWVzIHRvIHVuZGVybGluZSB0aGUgdG9rZW4uLi4uLgotCQkJLy9pdCBhc3N1bWVzIChmb3IgYSBnb29kIGRpc3BsYXkpIHRoYXQgdG9rZW4gc291cmNlIGRvZXMgbm90Ci0JCQkvL2NvbnRhaW4gYW55IFxyIFxuLiBUaGlzIGlzIGZhbHNlIG9uIHN0YXRlbWVudHMgISAKLQkJCS8vKHRoZSBjb2RlIHN0aWxsIHdvcmtzIGJ1dCB0aGUgZGlzcGxheSBpcyBub3Qgb3B0aW1hbCAhKQotCi0JCQkvLyBleHBhbmQgdG8gbGluZSBsaW1pdHMKLQkJCWludCBiZWdpbjsKLQkJCWludCBlbmQ7Ci0JCQlmb3IgKGJlZ2luID0gc3RhcnRQb3NpdGlvbiA+PSBsZW5ndGggPyBsZW5ndGggLSAxIDogc3RhcnRQb3NpdGlvbjsgYmVnaW4gPiAwOyBiZWdpbi0tKSB7Ci0JCQkJaWYgKChjID0gdW5pdFNvdXJjZVtiZWdpbiAtIDFdKSA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgYnJlYWs7Ci0JCQl9Ci0JCQlmb3IgKGVuZCA9IGVuZFBvc2l0aW9uID49IGxlbmd0aCA/IGxlbmd0aCAtIDEgOiBlbmRQb3NpdGlvbiA7IGVuZCsxIDwgbGVuZ3RoOyBlbmQrKykgewotCQkJCWlmICgoYyA9IHVuaXRTb3VyY2VbZW5kICsgMV0pID09ICdccicgfHwgYyA9PSAnXG4nKSBicmVhazsKLQkJCX0KLQkJCQotCQkJLy8gdHJpbSBsZWZ0IGFuZCByaWdodCBzcGFjZXMvdGFicwotCQkJd2hpbGUgKChjID0gdW5pdFNvdXJjZVtiZWdpbl0pID09ICcgJyB8fCBjID09ICdcdCcpIGJlZ2luKys7Ci0JCQkvL3doaWxlICgoYyA9IHVuaXRTb3VyY2VbZW5kXSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykgZW5kLS07IFRPRE8gKHBoaWxpcHBlKSBzaG91bGQgYWxzbyB0cmltIHJpZ2h0LCBidXQgYWxsIHRlc3RzIGFyZSB0byBiZSB1cGRhdGVkCi0JCQkKLQkJCS8vIGNvcHkgc291cmNlCi0JCQllcnJvckJ1ZmZlci5hcHBlbmQodW5pdFNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbisxKTsKLQkJCWVycm9yQnVmZmVyLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKS5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gY29tcHV0ZSB1bmRlcmxpbmUKLQkJCWZvciAoaW50IGkgPSBiZWdpbjsgaSA8c3RhcnRQb3NpdGlvbjsgaSsrKSB7Ci0JCQkJZXJyb3JCdWZmZXIuYXBwZW5kKCh1bml0U291cmNlW2ldID09IFRBQikgPyBUQUIgOiBTUEFDRSk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gc3RhcnRQb3NpdGlvbjsgaSA8PSAoZW5kUG9zaXRpb24gPj0gbGVuZ3RoID8gbGVuZ3RoIC0gMSA6IGVuZFBvc2l0aW9uKTsgaSsrKSB7Ci0JCQkJZXJyb3JCdWZmZXIuYXBwZW5kKE1BUkspOwotCQkJfQotCQkJcmV0dXJuIGVycm9yQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KIAl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2gubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCiAKLQkvLyB0d28gdXNlczogcmVjb2duaXplICdub25lJyBpbiBvcHRpb25zOyBjb2RlIHRoZSBzaW5nbGV0b24gbm9uZQotCS8vIGZvciB0aGUgJy1kIG5vbmUnIG9wdGlvbiAod2hlcmV2ZXIgaXQgbWF5IGJlIGZvdW5kKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRV9DTEFTU1BBVEggPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogSW50ZXJuYWwgSURFIEFQSQorCS8qKgorCSAqIFJlc291cmNlIGJ1bmRsZSBmYWN0b3J5IHRvIHNoYXJlIGJ1bmRsZXMgZm9yIHRoZSBzYW1lIGxvY2FsZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFN0cmluZyBjb21tYW5kTGluZSkgewotCi0JCXJldHVybiBjb21waWxlKGNvbW1hbmRMaW5lLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSk7Ci0JfQotCQkvKgotCSAqIEludGVybmFsIElERSBBUEkgZm9yIHRlc3QgaGFybmVzcyBwdXJwb3NlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nIGNvbW1hbmRMaW5lLCBQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlcikgewotCi0JCXJldHVybiBuZXcgTWFpbihvdXRXcml0ZXIsIGVycldyaXRlciwgZmFsc2UpLmNvbXBpbGUodG9rZW5pemUoY29tbWFuZExpbmUpKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBGaWxlW11bXSBnZXRMaWJyYXJpZXNGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotCQkJCVN0cmluZyBsb3dlckNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChsb3dlckNhc2VOYW1lLmVuZHNXaXRoKFN1ZmZpeENvbnN0YW50cy5TVUZGSVhfU1RSSU5HX2phcikgfHwgbG93ZXJDYXNlTmFtZS5lbmRzV2l0aChTdWZmaXhDb25zdGFudHMuU1VGRklYX1NUUklOR196aXApKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7CisJcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUJ1bmRsZUZhY3RvcnkgeworCQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIENhY2hlID0gbmV3IEhhc2hNYXAoKTsKKwkJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKKwkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgQ2FjaGUuZ2V0KGxvY2FsZSk7CisJCQlpZiAoYnVuZGxlID09IG51bGwpIHsKKwkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoTWFpbi5idW5kbGVOYW1lLCBsb2NhbGUpOworCQkJCUNhY2hlLnB1dChsb2NhbGUsIGJ1bmRsZSk7CiAJCQl9Ci0JCX07Ci0JCWZpbmFsIGludCBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aDsKLQkJRmlsZVtdW10gcmVzdWx0ID0gbmV3IEZpbGVbZmlsZXNMZW5ndGhdW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkrKykgewotCQkJRmlsZSBjdXJyZW50RmlsZSA9IGZpbGVzW2ldOwotCQkJaWYgKGN1cnJlbnRGaWxlLmV4aXN0cygpICYmIGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlyZXN1bHRbaV0gPSBjdXJyZW50RmlsZS5saXN0RmlsZXMoZmlsdGVyKTsKLQkJCX0KKwkJCXJldHVybiBidW5kbGU7CiAJCX0KLQkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQluZXcgTWFpbihuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSwgdHJ1ZSkuY29tcGlsZShhcmd2KTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b2tlbml6ZShTdHJpbmcgY29tbWFuZExpbmUpIHsKKwkvLyBqYXZhZG9jIGFuYWx5c2lzIHR1bmluZworCWJvb2xlYW4gZW5hYmxlSmF2YWRvY09uOwogCi0JCWludCBjb3VudCA9IDA7Ci0JCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbMTBdOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21tYW5kTGluZSwgIiBcIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2tlbiA9IFV0aWwuRU1QVFlfU1RSSU5HOwotCQlib29sZWFuIGluc2lkZVF1b3RlcyA9IGZhbHNlOwotCQlib29sZWFuIHN0YXJ0TmV3VG9rZW4gPSB0cnVlOworCWJvb2xlYW4gd2FybkphdmFkb2NPbjsKKwlib29sZWFuIHdhcm5BbGxKYXZhZG9jT247CiAKLQkJLy8gdGFrZSBjYXJlIHRvIHF1b3RlcyBvbiB0aGUgY29tbWFuZCBsaW5lCi0JCS8vICd4eHggImFhYSBiYmIiO2NjYyB5eXknIC0tLT4gIHsieHh4IiwgImFhYSBiYmI7Y2NjIiwgInl5eSIgfQotCQkvLyAneHh4ICJhYWEgYmJiO2NjYyIgeXl5JyAtLS0+ICB7Inh4eCIsICJhYWEgYmJiO2NjYyIsICJ5eXkiIH0KLQkJLy8gJ3h4eCAiYWFhIGJiYiI7ImNjYyIgeXl5JyAtLS0+ICB7Inh4eCIsICJhYWEgYmJiO2NjYyIsICJ5eXkiIH0KLQkJLy8gJ3h4eC8iYWFhIGJiYiI7ImNjYyIgeXl5JyAtLS0+ICB7Inh4eC9hYWEgYmJiO2NjYyIsICJ5eXkiIH0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0JCQlpZiAodG9rZW4uZXF1YWxzKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbnNpZGVRdW90ZXMpIHsKLQkJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47Ci0JCQkJCXN0YXJ0TmV3VG9rZW4gPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdGFydE5ld1Rva2VuID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiXCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFpbnNpZGVRdW90ZXMgJiYgc3RhcnROZXdUb2tlbikgewotCQkJCQlpZiAoY291bnQgPT0gYXJndW1lbnRzLmxlbmd0aCkKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCAoYXJndW1lbnRzID0gbmV3IFN0cmluZ1tjb3VudCAqIDJdKSwgMCwgY291bnQpOwotCQkJCQlhcmd1bWVudHNbY291bnQrK10gPSBVdGlsLkVNUFRZX1NUUklORzsKLQkJCQl9Ci0JCQkJaW5zaWRlUXVvdGVzID0gIWluc2lkZVF1b3RlczsKLQkJCQlzdGFydE5ld1Rva2VuID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpbnNpZGVRdW90ZXMpIHsKLQkJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHRva2VuLmxlbmd0aCgpID4gMCAmJiAhc3RhcnROZXdUb2tlbikgewotCQkJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY291bnQgPT0gYXJndW1lbnRzLmxlbmd0aCkKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgKGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbY291bnQgKiAyXSksIDAsIGNvdW50KTsKLQkJCQkJCVN0cmluZyB0cmltbWVkVG9rZW4gPSB0b2tlbi50cmltKCk7Ci0JCQkJCQlpZiAodHJpbW1lZFRva2VuLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCQlhcmd1bWVudHNbY291bnQrK10gPSB0cmltbWVkVG9rZW47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RhcnROZXdUb2tlbiA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW2NvdW50XSwgMCwgY291bnQpOwotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KIAlwdWJsaWMgQ29tcGlsZXIgYmF0Y2hDb21waWxlcjsKIAkvKiBCdW5kbGUgY29udGFpbmluZyBtZXNzYWdlcyAqLwogCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CiAJcHJvdGVjdGVkIEZpbGVTeXN0ZW0uQ2xhc3NwYXRoW10gY2hlY2tlZENsYXNzcGF0aHM7CisKIAlwdWJsaWMgTG9jYWxlIGNvbXBpbGVyTG9jYWxlOwogCXB1YmxpYyBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zOyAvLyByZWFkLW9ubHkKKwlwdWJsaWMgQ29tcGlsYXRpb25Qcm9ncmVzcyBwcm9ncmVzczsKIAlwdWJsaWMgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aDsKIAlwdWJsaWMgU3RyaW5nW10gZGVzdGluYXRpb25QYXRoczsKIAkvLyBkZXN0aW5hdGlvbiBwYXRoIGZvciBjb21waWxhdGlvbiB1bml0cyB0aGF0IGdldCBubyBtb3JlIHNwZWNpZmljCkBAIC0xMzM0LDYwICsxMzAwLDE3MyBAQAogCS8vICAgICAgIGJlIHdyaXR0ZW4uCiAJcHJpdmF0ZSBib29sZWFuIGRpZFNwZWNpZnlTb3VyY2U7CiAJcHJpdmF0ZSBib29sZWFuIGRpZFNwZWNpZnlUYXJnZXQ7Ci0KIAlwdWJsaWMgU3RyaW5nW10gZW5jb2RpbmdzOwotCiAJcHVibGljIGludCBleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyOwogCXB1YmxpYyBTdHJpbmdbXSBmaWxlbmFtZXM7Ci0KIAlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lczsKLQogCS8vIG92ZXJyaWRlcyBvZiBkZXN0aW5hdGlvblBhdGggb24gYSBkaXJlY3RvcnkgYXJndW1lbnQgYmFzaXMKIAlwdWJsaWMgaW50IGdsb2JhbEVycm9yc0NvdW50OwogCXB1YmxpYyBpbnQgZ2xvYmFsUHJvYmxlbXNDb3VudDsKIAlwdWJsaWMgaW50IGdsb2JhbFRhc2tzQ291bnQ7CiAJcHVibGljIGludCBnbG9iYWxXYXJuaW5nc0NvdW50OworCiAJcHJpdmF0ZSBGaWxlIGphdmFIb21lQ2FjaGU7CisKIAlwcml2YXRlIGJvb2xlYW4gamF2YUhvbWVDaGVja2VkID0gZmFsc2U7Ci0JcHVibGljIGxvbmcgbGluZUNvdW50OworCXB1YmxpYyBsb25nIGxpbmVDb3VudDA7CisKIAlwdWJsaWMgU3RyaW5nIGxvZzsKKwogCXB1YmxpYyBMb2dnZXIgbG9nZ2VyOwogCXB1YmxpYyBpbnQgbWF4UHJvYmxlbXM7Ci0JcHVibGljIGJvb2xlYW4gbm9XYXJuID0gZmFsc2U7CiAJcHVibGljIE1hcCBvcHRpb25zOwogCXByb3RlY3RlZCBQcmludFdyaXRlciBvdXQ7CiAJcHVibGljIGJvb2xlYW4gcHJvY2VlZCA9IHRydWU7CiAJcHVibGljIGJvb2xlYW4gcHJvY2VlZE9uRXJyb3IgPSBmYWxzZTsKIAlwdWJsaWMgYm9vbGVhbiBwcm9kdWNlUmVmSW5mbyA9IGZhbHNlOwotCXB1YmxpYyBpbnQgcmVwZXRpdGlvbnM7Ci0KKwlwdWJsaWMgaW50IGN1cnJlbnRSZXBldGl0aW9uLCBtYXhSZXBldGl0aW9uOwogCXB1YmxpYyBib29sZWFuIHNob3dQcm9ncmVzcyA9IGZhbHNlOwogCXB1YmxpYyBsb25nIHN0YXJ0VGltZTsKKwlwdWJsaWMgQXJyYXlMaXN0IHBlbmRpbmdFcnJvcnM7CisJcHVibGljIGJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IHRydWU7CiAKLXB1YmxpYyBib29sZWFuIHN5c3RlbUV4aXRXaGVuRmluaXNoZWQgPSB0cnVlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUlOR19ESVNBQkxFRCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNSU5HX0VOQUJMRUQgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUlOR19ERVRBSUxFRCA9IDI7CiAKLXB1YmxpYyBsb25nW10gdGltZXM7CisJcHVibGljIGludCB0aW1pbmcgPSBUSU1JTkdfRElTQUJMRUQ7CisJcHVibGljIENvbXBpbGVyU3RhdHNbXSBjb21waWxlclN0YXRzOworCXB1YmxpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKwlwcml2YXRlIFN0cmluZ1tdIGV4cGFuZGVkQ29tbWFuZExpbmU7CiAKLXB1YmxpYyBpbnQgdGltZXNDb3VudGVyOworCXByaXZhdGUgUHJpbnRXcml0ZXIgZXJyOwogCi1wdWJsaWMgYm9vbGVhbiB0aW1pbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IGV4dHJhUHJvYmxlbXM7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2gubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJLy8gdHdvIHVzZXM6IHJlY29nbml6ZSAnbm9uZScgaW4gb3B0aW9uczsgY29kZSB0aGUgc2luZ2xldG9uIG5vbmUKKwkvLyBmb3IgdGhlICctZCBub25lJyBvcHRpb24gKHdoZXJldmVyIGl0IG1heSBiZSBmb3VuZCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkVfQ0xBU1NQQVRIID0gNDsKIAotcHVibGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKIAotcHJpdmF0ZSBTdHJpbmdbXSBleHBhbmRlZENvbW1hbmRMaW5lOwotCi1wcml2YXRlIFByaW50V3JpdGVyIGVycjsKLQotQXJyYXlMaXN0IGV4dHJhUHJvYmxlbXM7Ci0KLXB1YmxpYyBNYWluKFByaW50V3JpdGVyIG91dFdyaXRlciwgUHJpbnRXcml0ZXIgZXJyV3JpdGVyLCBib29sZWFuIHN5c3RlbUV4aXRXaGVuRmluaXNoZWQpIHsKLQl0aGlzKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkLCBudWxsKTsKKy8qKgorICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BsaW5rIEJhdGNoQ29tcGlsZXIjY29tcGlsZShTdHJpbmcsIFByaW50V3JpdGVyLCBQcmludFdyaXRlciwgQ29tcGlsYXRpb25Qcm9ncmVzcyl9IGluc3RlYWQKKyAqIAkJCQkJCSAgZS5nLiBCYXRjaENvbXBpbGVyLmNvbXBpbGUoY29tbWFuZExpbmUsIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpLCBudWxsKTsKKyAqLworcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nIGNvbW1hbmRMaW5lKSB7CisJcmV0dXJuIG5ldyBNYWluKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpLCBmYWxzZSAvKiBzeXN0ZW1FeGl0ICovLCBudWxsIC8qIG9wdGlvbnMgKi8sIG51bGwgLyogcHJvZ3Jlc3MgKi8pLmNvbXBpbGUodG9rZW5pemUoY29tbWFuZExpbmUpKTsKIH0KIAorLyoqCisgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgQmF0Y2hDb21waWxlciNjb21waWxlKFN0cmluZywgUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBDb21waWxhdGlvblByb2dyZXNzKX0gaW5zdGVhZAorICogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gQmF0Y2hDb21waWxlci5jb21waWxlKGNvbW1hbmRMaW5lLCBvdXRXcml0ZXIsIGVycldyaXRlciwgbnVsbCk7CisgKi8KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFN0cmluZyBjb21tYW5kTGluZSwgUHJpbnRXcml0ZXIgb3V0V3JpdGVyLCBQcmludFdyaXRlciBlcnJXcml0ZXIpIHsKKwlyZXR1cm4gbmV3IE1haW4ob3V0V3JpdGVyLCBlcnJXcml0ZXIsIGZhbHNlIC8qIHN5c3RlbUV4aXQgKi8sIG51bGwgLyogb3B0aW9ucyAqLywgbnVsbCAvKiBwcm9ncmVzcyAqLykuY29tcGlsZSh0b2tlbml6ZShjb21tYW5kTGluZSkpOworfQorCisvKgorICogSW50ZXJuYWwgQVBJIGZvciBwdWJsaWMgQVBJIEJhdGNoQ29tcGlsZXIjY29tcGlsZShTdHJpbmdbXSwgUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBDb21waWxhdGlvblByb2dyZXNzKQorICovCitwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShTdHJpbmdbXSBjb21tYW5kTGluZUFyZ3VtZW50cywgUHJpbnRXcml0ZXIgb3V0V3JpdGVyLCBQcmludFdyaXRlciBlcnJXcml0ZXIsIENvbXBpbGF0aW9uUHJvZ3Jlc3MgcHJvZ3Jlc3MpIHsKKwlyZXR1cm4gbmV3IE1haW4ob3V0V3JpdGVyLCBlcnJXcml0ZXIsIGZhbHNlIC8qIHN5c3RlbUV4aXQgKi8sIG51bGwgLyogb3B0aW9ucyAqLywgcHJvZ3Jlc3MpLmNvbXBpbGUoY29tbWFuZExpbmVBcmd1bWVudHMpOworfQorcHVibGljIHN0YXRpYyBGaWxlW11bXSBnZXRMaWJyYXJpZXNGaWxlcyhGaWxlW10gZmlsZXMpIHsKKwlGaWxlbmFtZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKwkJCXJldHVybiBVdGlsLmlzUG90ZW50aWFsWmlwQXJjaGl2ZShuYW1lKTsKKwkJfQorCX07CisJZmluYWwgaW50IGZpbGVzTGVuZ3RoID0gZmlsZXMubGVuZ3RoOworCUZpbGVbXVtdIHJlc3VsdCA9IG5ldyBGaWxlW2ZpbGVzTGVuZ3RoXVtdOworCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkrKykgeworCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07CisJCWlmIChjdXJyZW50RmlsZS5leGlzdHMoKSAmJiBjdXJyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQlyZXN1bHRbaV0gPSBjdXJyZW50RmlsZS5saXN0RmlsZXMoZmlsdGVyKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CisJbmV3IE1haW4obmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVyciksIHRydWUvKnN5c3RlbUV4aXQqLywgbnVsbC8qb3B0aW9ucyovLCBudWxsLypwcm9ncmVzcyovKS5jb21waWxlKGFyZ3YpOworfQorCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKFN0cmluZyBjb21tYW5kTGluZSkgeworCisJaW50IGNvdW50ID0gMDsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nWzEwXTsKKwlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21tYW5kTGluZSwgIiBcIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIHRva2VuID0gVXRpbC5FTVBUWV9TVFJJTkc7CisJYm9vbGVhbiBpbnNpZGVRdW90ZXMgPSBmYWxzZTsKKwlib29sZWFuIHN0YXJ0TmV3VG9rZW4gPSB0cnVlOworCisJLy8gdGFrZSBjYXJlIHRvIHF1b3RlcyBvbiB0aGUgY29tbWFuZCBsaW5lCisJLy8gJ3h4eCAiYWFhIGJiYiI7Y2NjIHl5eScgLS0tPiAgeyJ4eHgiLCAiYWFhIGJiYjtjY2MiLCAieXl5IiB9CisJLy8gJ3h4eCAiYWFhIGJiYjtjY2MiIHl5eScgLS0tPiAgeyJ4eHgiLCAiYWFhIGJiYjtjY2MiLCAieXl5IiB9CisJLy8gJ3h4eCAiYWFhIGJiYiI7ImNjYyIgeXl5JyAtLS0+ICB7Inh4eCIsICJhYWEgYmJiO2NjYyIsICJ5eXkiIH0KKwkvLyAneHh4LyJhYWEgYmJiIjsiY2NjIiB5eXknIC0tLT4gIHsieHh4L2FhYSBiYmI7Y2NjIiwgInl5eSIgfQorCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCisJCWlmICh0b2tlbi5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQlpZiAoaW5zaWRlUXVvdGVzKSB7CisJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47CisJCQkJc3RhcnROZXdUb2tlbiA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlzdGFydE5ld1Rva2VuID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIlwiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKCFpbnNpZGVRdW90ZXMgJiYgc3RhcnROZXdUb2tlbikgeworCQkJCWlmIChjb3VudCA9PSBhcmd1bWVudHMubGVuZ3RoKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgKGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbY291bnQgKiAyXSksIDAsIGNvdW50KTsKKwkJCQlhcmd1bWVudHNbY291bnQrK10gPSBVdGlsLkVNUFRZX1NUUklORzsKKwkJCX0KKwkJCWluc2lkZVF1b3RlcyA9ICFpbnNpZGVRdW90ZXM7CisJCQlzdGFydE5ld1Rva2VuID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5zaWRlUXVvdGVzKSB7CisJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47CisJCQl9IGVsc2UgeworCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA+IDAgJiYgIXN0YXJ0TmV3VG9rZW4pIHsKKwkJCQkJYXJndW1lbnRzW2NvdW50IC0gMV0gKz0gdG9rZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNvdW50ID09IGFyZ3VtZW50cy5sZW5ndGgpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgKGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbY291bnQgKiAyXSksIDAsIGNvdW50KTsKKwkJCQkJU3RyaW5nIHRyaW1tZWRUb2tlbiA9IHRva2VuLnRyaW0oKTsKKwkJCQkJaWYgKHRyaW1tZWRUb2tlbi5sZW5ndGgoKSAhPSAwKSB7CisJCQkJCQlhcmd1bWVudHNbY291bnQrK10gPSB0cmltbWVkVG9rZW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzdGFydE5ld1Rva2VuID0gZmFsc2U7CisJCX0KKwl9CisJU3lzdGVtLmFycmF5Y29weShhcmd1bWVudHMsIDAsIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbY291bnRdLCAwLCBjb3VudCk7CisJcmV0dXJuIGFyZ3VtZW50czsKK30KKworLyoqCisgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgI01haW4oUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBib29sZWFuLCBNYXAsIENvbXBpbGF0aW9uUHJvZ3Jlc3MpfSBpbnN0ZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBNYWluKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkLCBudWxsLCBudWxsKQorICovCitwdWJsaWMgTWFpbihQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlciwgYm9vbGVhbiBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkKSB7CisJdGhpcyhvdXRXcml0ZXIsIGVycldyaXRlciwgc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCwgbnVsbCAvKiBvcHRpb25zICovLCBudWxsIC8qIHByb2dyZXNzICovKTsKK30KKworLyoqCisgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgI01haW4oUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBib29sZWFuLCBNYXAsIENvbXBpbGF0aW9uUHJvZ3Jlc3MpfSBpbnN0ZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBNYWluKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkLCBjdXN0b21EZWZhdWx0T3B0aW9ucywgbnVsbCkKKyAqLwogcHVibGljIE1haW4oUHJpbnRXcml0ZXIgb3V0V3JpdGVyLCBQcmludFdyaXRlciBlcnJXcml0ZXIsIGJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCwgTWFwIGN1c3RvbURlZmF1bHRPcHRpb25zKSB7Ci0JdGhpcy5pbml0aWFsaXplKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkLCBjdXN0b21EZWZhdWx0T3B0aW9ucyk7CisJdGhpcyhvdXRXcml0ZXIsIGVycldyaXRlciwgc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCwgY3VzdG9tRGVmYXVsdE9wdGlvbnMsIG51bGwgLyogcHJvZ3Jlc3MgKi8pOworfQorCitwdWJsaWMgTWFpbihQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlciwgYm9vbGVhbiBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkLCBNYXAgY3VzdG9tRGVmYXVsdE9wdGlvbnMsIENvbXBpbGF0aW9uUHJvZ3Jlc3MgY29tcGlsYXRpb25Qcm9ncmVzcykgeworCXRoaXMuaW5pdGlhbGl6ZShvdXRXcml0ZXIsIGVycldyaXRlciwgc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCwgY3VzdG9tRGVmYXVsdE9wdGlvbnMsIGNvbXBpbGF0aW9uUHJvZ3Jlc3MpOwogCXRoaXMucmVsb2NhbGl6ZSgpOwogfQorCiBwdWJsaWMgdm9pZCBhZGRFeHRyYVByb2JsZW1zKENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtKSB7CiAJaWYgKHRoaXMuZXh0cmFQcm9ibGVtcyA9PSBudWxsKSB7CiAJCXRoaXMuZXh0cmFQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTEzOTcsNyArMTQ3Niw3IEBACiBwcm90ZWN0ZWQgdm9pZCBhZGROZXdFbnRyeShBcnJheUxpc3QgcGF0aHMsIFN0cmluZyBjdXJyZW50Q2xhc3NwYXRoTmFtZSwKIAkJQXJyYXlMaXN0IGN1cnJlbnRSdWxlU3BlY3MsIFN0cmluZyBjdXN0b21FbmNvZGluZywKIAkJU3RyaW5nIGRlc3RQYXRoLCBib29sZWFuIGlzU291cmNlT25seSwKLQkJYm9vbGVhbiByZWplY3REZXN0aW5hdGlvblBhdGhPbkphcnMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCQlib29sZWFuIHJlamVjdERlc3RpbmF0aW9uUGF0aE9uSmFycykgewogCiAJaW50IHJ1bGVzU3BlY3NTaXplID0gY3VycmVudFJ1bGVTcGVjcy5zaXplKCk7CiAJQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0ID0gbnVsbDsKQEAgLTE0MzksMjQgKzE1MTgsMTEgQEAKIAkJCX0KIAkJfQogCQlpZiAocnVsZXNPSykgewotCQkJU3RyaW5nIHRlbXBsYXRlc1tdID0gbmV3IFN0cmluZ1tBY2Nlc3NSdWxlU2V0Lk1FU1NBR0VfVEVNUExBVEVTX0xFTkdUSF07Ci0JCQl0ZW1wbGF0ZXNbMF0gPSB0aGlzLmJpbmQoCi0JCQkJCSJ0ZW1wbGF0ZS5yZXN0cmljdGVkQWNjZXNzLnR5cGUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsIGN1cnJlbnRDbGFzc3BhdGhOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBsYXRlc1sxXSA9IHRoaXMuYmluZCgKLQkJCQkJInRlbXBsYXRlLnJlc3RyaWN0ZWRBY2Nlc3MuY29uc3RydWN0b3IiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsIGN1cnJlbnRDbGFzc3BhdGhOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBsYXRlc1syXSA9IHRoaXMuYmluZCgKLQkJCQkJInRlbXBsYXRlLnJlc3RyaWN0ZWRBY2Nlc3MubWV0aG9kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCAiezF9IiwgY3VycmVudENsYXNzcGF0aE5hbWV9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZW1wbGF0ZXNbM10gPSB0aGlzLmJpbmQoCi0JCQkJCSJ0ZW1wbGF0ZS5yZXN0cmljdGVkQWNjZXNzLmZpZWxkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCAiezF9IiwgY3VycmVudENsYXNzcGF0aE5hbWV9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhY2Nlc3NSdWxlU2V0ID0gbmV3IEFjY2Vzc1J1bGVTZXQoYWNjZXNzUnVsZXMsIHRlbXBsYXRlcyk7CisgICAgCQlhY2Nlc3NSdWxlU2V0ID0gbmV3IEFjY2Vzc1J1bGVTZXQoYWNjZXNzUnVsZXMsIEFjY2Vzc1Jlc3RyaWN0aW9uLkNPTU1BTkRfTElORSwgY3VycmVudENsYXNzcGF0aE5hbWUpOwogCQl9IGVsc2UgewogCQkJaWYgKGN1cnJlbnRDbGFzc3BhdGhOYW1lLmxlbmd0aCgpICE9IDApIHsKIAkJCQkvLyB3ZSBnbyBvbiBhbnl3YXkKLQkJCQl0aGlzLmxvZ2dlci5sb2dJbmNvcnJlY3RDbGFzc3BhdGgoY3VycmVudENsYXNzcGF0aE5hbWUpOworCQkJCWFkZFBlbmRpbmdFcnJvcnModGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0Q2xhc3NwYXRoIiwgY3VycmVudENsYXNzcGF0aE5hbWUpKTsvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlyZXR1cm47CiAJCX0KQEAgLTE0NjUsOSArMTUzMSw4IEBACiAJCWRlc3RQYXRoID0gTk9ORTsgLy8ga2VlcCA9PSBjb21wYXJpc29uIHZhbGlkCiAJfQogCWlmIChyZWplY3REZXN0aW5hdGlvblBhdGhPbkphcnMgJiYgZGVzdFBhdGggIT0gbnVsbCAmJgotCQkJKGN1cnJlbnRDbGFzc3BhdGhOYW1lLmVuZHNXaXRoKCIuamFyIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCWN1cnJlbnRDbGFzc3BhdGhOYW1lLmVuZHNXaXRoKCIuemlwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCVV0aWwuaXNQb3RlbnRpYWxaaXBBcmNoaXZlKGN1cnJlbnRDbGFzc3BhdGhOYW1lKSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJdGhpcy5iaW5kKCJjb25maWd1cmUudW5leHBlY3RlZERlc3RpbmF0aW9uUGF0aEVudHJ5RmlsZSIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCWN1cnJlbnRDbGFzc3BhdGhOYW1lKSk7CiAJfQpAQCAtMTQ4MSw5ICsxNTQ2LDE1IEBACiAJCXBhdGhzLmFkZChjdXJyZW50Q2xhc3NwYXRoKTsKIAl9IGVsc2UgaWYgKGN1cnJlbnRDbGFzc3BhdGhOYW1lLmxlbmd0aCgpICE9IDApIHsKIAkJLy8gd2UgZ28gb24gYW55d2F5Ci0JCXRoaXMubG9nZ2VyLmxvZ0luY29ycmVjdENsYXNzcGF0aChjdXJyZW50Q2xhc3NwYXRoTmFtZSk7CisJCWFkZFBlbmRpbmdFcnJvcnModGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0Q2xhc3NwYXRoIiwgY3VycmVudENsYXNzcGF0aE5hbWUpKTsvLyROT04tTkxTLTEkCiAJfQogfQordm9pZCBhZGRQZW5kaW5nRXJyb3JzKFN0cmluZyBtZXNzYWdlKSB7CisJaWYgKHRoaXMucGVuZGluZ0Vycm9ycyA9PSBudWxsKSB7CisJCXRoaXMucGVuZGluZ0Vycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisJdGhpcy5wZW5kaW5nRXJyb3JzLmFkZChtZXNzYWdlKTsKK30KIC8qCiAgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nCiAgKi8KQEAgLTE1MjUsNyArMTU5Niw3IEBACiB9CiAvKioKICAqIFJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBydW5uaW5nIFZNIHN1cHBvcnRzIHRoZSBnaXZlbiBtaW5pbWFsIHZlcnNpb24uCi0gKiAKKyAqCiAgKiA8cD5UaGlzIG9ubHkgY2hlY2tzIHRoZSBtYWpvciB2ZXJzaW9uLCBzaW5jZSB0aGUgbWlub3IgdmVyc2lvbiBpcyBhbHdheXMgMCAoYXQgbGVhc3QgZm9yIHRoZSB1c2VmdWwgY2FzZXMpLjwvcD4KICAqIDxwPlRoZSBnaXZlbiBtaW5pbWFsU3VwcG9ydGVkVmVyc2lvbiBpcyBvbmUgb2YgdGhlIGNvbnN0YW50czo8L3A+CiAgKiA8dWw+CkBAIC0xNTg2LDI4ICsxNjU3LDI5IEBACiAJLy8gZGVjb2RlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKIAl0cnkgewogCQljb25maWd1cmUoYXJndik7CisJCWlmICh0aGlzLnByb2dyZXNzICE9IG51bGwpCisJCQl0aGlzLnByb2dyZXNzLmJlZ2luKHRoaXMuZmlsZW5hbWVzID09IG51bGwgPyAwIDogdGhpcy5maWxlbmFtZXMubGVuZ3RoICogdGhpcy5tYXhSZXBldGl0aW9uKTsKIAkJaWYgKHRoaXMucHJvY2VlZCkgewogLy8JCQkJaWYgKHRoaXMudmVyYm9zZSkgewogLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ29tcGlsZXJPcHRpb25zKHRoaXMub3B0aW9ucykpOwogLy8JCQkJfQogCQkJaWYgKHRoaXMuc2hvd1Byb2dyZXNzKSB0aGlzLmxvZ2dlci5jb21waWxpbmcoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5yZXBldGl0aW9uczsgaSsrKSB7CisJCQlmb3IgKHRoaXMuY3VycmVudFJlcGV0aXRpb24gPSAwOyB0aGlzLmN1cnJlbnRSZXBldGl0aW9uIDwgdGhpcy5tYXhSZXBldGl0aW9uOyB0aGlzLmN1cnJlbnRSZXBldGl0aW9uKyspIHsKIAkJCQl0aGlzLmdsb2JhbFByb2JsZW1zQ291bnQgPSAwOwogCQkJCXRoaXMuZ2xvYmFsRXJyb3JzQ291bnQgPSAwOwogCQkJCXRoaXMuZ2xvYmFsV2FybmluZ3NDb3VudCA9IDA7CiAJCQkJdGhpcy5nbG9iYWxUYXNrc0NvdW50ID0gMDsKLQkJCQl0aGlzLmxpbmVDb3VudCA9IDA7CiAJCQkJdGhpcy5leHBvcnRlZENsYXNzRmlsZXNDb3VudGVyID0gMDsKIAotCQkJCWlmICh0aGlzLnJlcGV0aXRpb25zID4gMSkgeworCQkJCWlmICh0aGlzLm1heFJlcGV0aXRpb24gPiAxKSB7CiAJCQkJCXRoaXMubG9nZ2VyLmZsdXNoKCk7Ci0JCQkJCXRoaXMubG9nZ2VyLmxvZ1JlcGV0aXRpb24oaSwgdGhpcy5yZXBldGl0aW9ucyk7CisJCQkJCXRoaXMubG9nZ2VyLmxvZ1JlcGV0aXRpb24odGhpcy5jdXJyZW50UmVwZXRpdGlvbiwgdGhpcy5tYXhSZXBldGl0aW9uKTsKIAkJCQl9CiAJCQkJLy8gcmVxdWVzdCBjb21waWxhdGlvbgogCQkJCXBlcmZvcm1Db21waWxhdGlvbigpOwogCQkJfQotCQkJaWYgKHRoaXMudGltZXMgIT0gbnVsbCkgewotCQkJCXRoaXMubG9nZ2VyLmxvZ0F2ZXJhZ2UodGhpcy50aW1lcywgdGhpcy5saW5lQ291bnQpOworCQkJaWYgKHRoaXMuY29tcGlsZXJTdGF0cyAhPSBudWxsKSB7CisJCQkJdGhpcy5sb2dnZXIubG9nQXZlcmFnZSgpOwogCQkJfQogCQkJaWYgKHRoaXMuc2hvd1Byb2dyZXNzKSB0aGlzLmxvZ2dlci5wcmludE5ld0xpbmUoKTsKIAkJfQpAQCAtMTYxNiw3ICsxNjg4LDcgQEAKIAkJCXRoaXMubG9nZ2VyLmNsb3NlKCk7CiAJCQlTeXN0ZW0uZXhpdCh0aGlzLmdsb2JhbEVycm9yc0NvdW50ID4gMCA/IC0xIDogMCk7CiAJCX0KLQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJCXRoaXMubG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKIAkJaWYgKHRoaXMuc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgewogCQkJdGhpcy5sb2dnZXIuZmx1c2goKTsKQEAgLTE2MzUsNjA4ICsxNzA3LDE4IEBACiAJfSBmaW5hbGx5IHsKIAkJdGhpcy5sb2dnZXIuZmx1c2goKTsKIAkJdGhpcy5sb2dnZXIuY2xvc2UoKTsKKwkJaWYgKHRoaXMucHJvZ3Jlc3MgIT0gbnVsbCkKKwkJCXRoaXMucHJvZ3Jlc3MuZG9uZSgpOwogCX0KLQlpZiAodGhpcy5nbG9iYWxFcnJvcnNDb3VudCA9PSAwKQorCWlmICh0aGlzLmdsb2JhbEVycm9yc0NvdW50ID09IDAgJiYgKHRoaXMucHJvZ3Jlc3MgPT0gbnVsbCB8fCAhdGhpcy5wcm9ncmVzcy5pc0NhbmNlbGVkKCkpKQogCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCi0gKiBFeHRlcm5hbCBBUEkKLSAqIEhhbmRsZSBhIHNpbmdsZSB3YXJuaW5nIHRva2VuLgotKi8KLXByb3RlY3RlZCB2b2lkIGhhbmRsZVdhcm5pbmdUb2tlbihTdHJpbmcgdG9rZW4sIGJvb2xlYW4gaXNFbmFibGluZywgYm9vbGVhbiB1c2VFbmFibGVKYXZhZG9jKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQlpZiAodG9rZW4uZXF1YWxzKCJjb25zdHJ1Y3Rvck5hbWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygicGtnRGVmYXVsdE1ldGhvZCIpIHx8IHRva2VuLmVxdWFscygicGFja2FnZURlZmF1bHRNZXRob2QiKS8qYmFja3dhcmQgY29tcGF0aWJsZSovICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm1hc2tlZENhdGNoQmxvY2siKSB8fCB0b2tlbi5lcXVhbHMoIm1hc2tlZENhdGNoQmxvY2tzIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJkZXByZWNhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLAotCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsCi0JCQlDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJhbGxEZXByZWNhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQgOiBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRMb2NhbCIpIHx8IHRva2VuLmVxdWFscygidW51c2VkTG9jYWxzIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkQXJndW1lbnQiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZEFyZ3VtZW50cyIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRJbXBvcnQiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZEltcG9ydHMiKS8qYmFja3dhcmQgY29tcGF0aWJsZSovKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkUHJpdmF0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUHJpdmF0ZU1lbWJlciwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRMYWJlbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTGFiZWwsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibG9jYWxIaWRpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydExvY2FsVmFyaWFibGVIaWRpbmcsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZmllbGRIaWRpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZpZWxkSGlkaW5nLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInNwZWNpYWxQYXJhbUhpZGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0U3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiY29uZGl0aW9uQXNzaWduIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRQb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudCwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3ludGhldGljQWNjZXNzIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHRva2VuLmVxdWFscygic3ludGhldGljLWFjY2VzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm5scyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzdGF0aWNSZWNlaXZlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uU3RhdGljQWNjZXNzVG9TdGF0aWMsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiaW5kaXJlY3RTdGF0aWMiKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm5vRWZmZWN0QXNzaWduIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0VmZmVjdEFzc2lnbm1lbnQsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiaW50Zk5vbkluaGVyaXRlZCIpIHx8IHRva2VuLmVxdWFscygiaW50ZXJmYWNlTm9uSW5oZXJpdGVkIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImNoYXJDb25jYXQiKSB8fCB0b2tlbi5lcXVhbHMoIm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgey8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzZW1pY29sb24iKSkgey8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RW1wdHlTdGF0ZW1lbnQsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic2VyaWFsIikpIHsvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdTZXJpYWxWZXJzaW9uLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImVtcHR5QmxvY2siKSkgey8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5kb2N1bWVudGVkRW1wdHlCbG9jaywKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1c2VsZXNzVHlwZUNoZWNrIikpIHsvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5VHlwZUNoZWNrLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVuY2hlY2tlZCIpIHx8IHRva2VuLmVxdWFscygidW5zYWZlIikpIHsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5jaGVja2VkVHlwZU9wZXJhdGlvbiwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJyYXciKSkgey8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UmF3VHlwZVJlZmVyZW5jZSwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJmaW5hbEJvdW5kIikpIHsvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZpbmFsUGFyYW1ldGVyQm91bmQsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3VwcHJlc3MiKSkgey8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU3VwcHJlc3NXYXJuaW5ncywKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuRU5BQkxFRCA6IENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIndhcm5pbmdUb2tlbiIpKSB7Ly8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW4sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW5uZWNlc3NhcnlFbHNlIikpIHsvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5RWxzZSwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJqYXZhZG9jIikpIHsvLyROT04tTkxTLTEkCi0JCWlmICghdXNlRW5hYmxlSmF2YWRvYykgewotCQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0RvY0NvbW1lbnRTdXBwb3J0LAotCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuRU5BQkxFRDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKLQkJfQotCQkvLyBpZiBkaXNhYmxpbmcgdGhlbiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IG90aGVyIGphdmFkb2Mgb3B0aW9ucwotCQlpZiAoaXNFbmFibGluZykgewotCQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jLAotCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3MsCi0JCQkJQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOwotCQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWYsCi0JCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmLAotCQkJCUNvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSwKLQkJCQlDb21waWxlck9wdGlvbnMuUFJJVkFURSk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzLAotCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5LAotCQkJCUNvbXBpbGVyT3B0aW9ucy5QUklWQVRFKTsKLQkJfQotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJhbGxKYXZhZG9jIikpIHsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXVzZUVuYWJsZUphdmFkb2MpIHsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Eb2NDb21tZW50U3VwcG9ydCwKLQkJCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQ6IENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7Ci0JCX0KLQkJLy8gaWYgZGlzYWJsaW5nIHRoZW4gaXQncyBub3QgbmVjZXNzYXJ5IHRvIHNldCBvdGhlciBqYXZhZG9jIG9wdGlvbnMKLQkJaWYgKGlzRW5hYmxpbmcpIHsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jLAotCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFncywKLQkJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSwKLQkJCQlDb21waWxlck9wdGlvbnMuUFJJVkFURSk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzLAotCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5LAotCQkJCUNvbXBpbGVyT3B0aW9ucy5QUklWQVRFKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzLAotCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJfQotCX0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidGFza3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YXNrVGFncyA9IFV0aWwuRU1QVFlfU1RSSU5HOwotCQlpbnQgc3RhcnQgPSB0b2tlbi5pbmRleE9mKCcoJyk7Ci0JCWludCBlbmQgPSB0b2tlbi5pbmRleE9mKCcpJyk7Ci0JCWlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwICYmIHN0YXJ0IDwgZW5kKXsKLQkJCXRhc2tUYWdzID0gdG9rZW4uc3Vic3RyaW5nKHN0YXJ0KzEsIGVuZCkudHJpbSgpOwotCQkJdGFza1RhZ3MgPSB0YXNrVGFncy5yZXBsYWNlKCd8JywnLCcpOwotCQl9Ci0JCWlmICh0YXNrVGFncy5sZW5ndGgoKSA9PSAwKXsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZFRhc2tUYWciLCB0b2tlbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1RhZ3MsCi0JCQlpc0VuYWJsaW5nID8gdGFza1RhZ3MgOiBVdGlsLkVNUFRZX1NUUklORyk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImFzc2VydElkZW50aWZpZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZW51bUlkZW50aWZpZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRFbnVtSWRlbnRpZmllciwKLQkJCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZmluYWxseSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5LAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZFRocm93biIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW5xdWFsaWZpZWRGaWVsZCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHRva2VuLmVxdWFscygidW5xdWFsaWZpZWQtZmllbGQtYWNjZXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnF1YWxpZmllZEZpZWxkQWNjZXNzLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInR5cGVIaWRpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFR5cGVQYXJhbWV0ZXJIaWRpbmcsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidmFyYXJnc0Nhc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0LAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm51bGwiKSkgeyAvLyROT04tTkxTLTEkCi0JCWlmIChpc0VuYWJsaW5nKSB7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TnVsbFJlZmVyZW5jZSwKLQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQkJdGhpcy5vcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFBvdGVudGlhbE51bGxSZWZlcmVuY2UsCi0JCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRSZWR1bmRhbnROdWxsQ2hlY2ssCi0JCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROdWxsUmVmZXJlbmNlLAotCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRQb3RlbnRpYWxOdWxsUmVmZXJlbmNlLAotCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRSZWR1bmRhbnROdWxsQ2hlY2ssCi0JCQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQl9Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm51bGxEZXJlZmVyZW5jZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzRW5hYmxpbmcpIHsKLQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROdWxsUmVmZXJlbmNlLAotCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TnVsbFJlZmVyZW5jZSwKLQkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UG90ZW50aWFsTnVsbFJlZmVyZW5jZSwKLQkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UmVkdW5kYW50TnVsbENoZWNrLAotCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJfQotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJib3hpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEF1dG9ib3hpbmcsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygib3Zlci1hbm4iKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZGVwLWFubiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImludGZBbm5vdGF0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZW51bVN3aXRjaCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHRva2VuLmVxdWFscygiaW5jb21wbGV0ZS1zd2l0Y2giKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluY29tcGxldGVFbnVtU3dpdGNoLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImhpZGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRMb2NhbFZhcmlhYmxlSGlkaW5nLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZpZWxkSGlkaW5nLAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFR5cGVQYXJhbWV0ZXJIaWRpbmcsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3RhdGljLWFjY2VzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uU3RhdGljQWNjZXNzVG9TdGF0aWMsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW5kaXJlY3RTdGF0aWNBY2Nlc3MsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0LAotCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HIDogQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFByaXZhdGVNZW1iZXIsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24sCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExhYmVsLAotCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJwYXJhbUFzc2lnbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UGFyYW1ldGVyQXNzaWdubWVudCwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJkaXNjb3VyYWdlZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGlzY291cmFnZWRSZWZlcmVuY2UsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZm9yYmlkZGVuIikpIHsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRGb3JiaWRkZW5SZWZlcmVuY2UsCi0JCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLldBUk5JTkcgOiBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZmFsbHRocm91Z2giKSkgeyAvLyROT04tTkxTLTEkCi0JCXRoaXMub3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZhbGx0aHJvdWdoQ2FzZSwKLQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzdXBlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uLAotCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuV0FSTklORyA6IENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmciLCB0b2tlbikpOyAvLyROT04tTkxTLTEkCi0JfQotfQotLyoKLSAqIEV4dGVybmFsIEFQSQotICovCi1wcm90ZWN0ZWQgQXJyYXlMaXN0IGhhbmRsZUJvb3RjbGFzc3BhdGgoQXJyYXlMaXN0IGJvb3RjbGFzc3BhdGhzLCBTdHJpbmcgY3VzdG9tRW5jb2RpbmcpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotIAlmaW5hbCBpbnQgYm9vdGNsYXNzcGF0aHNTaXplID0gYm9vdGNsYXNzcGF0aHMgPT0gbnVsbCA/IDAgOiBib290Y2xhc3NwYXRocy5zaXplKCk7Ci0JaWYgKGJvb3RjbGFzc3BhdGhzU2l6ZSAhPSAwKSB7Ci0JCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tib290Y2xhc3NwYXRoc1NpemVdOwotCQlib290Y2xhc3NwYXRocy50b0FycmF5KHBhdGhzKTsKLQkJYm9vdGNsYXNzcGF0aHMuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib290Y2xhc3NwYXRoc1NpemU7IGkrKykgewotCQkJcHJvY2Vzc1BhdGhFbnRyaWVzKERFRkFVTFRfU0laRV9DTEFTU1BBVEgsIGJvb3RjbGFzc3BhdGhzLAotCQkJCXBhdGhzW2ldLCBjdXN0b21FbmNvZGluZywgZmFsc2UsIHRydWUpOwotCQl9Ci0JfSBlbHNlIHsKLQkgCWJvb3RjbGFzc3BhdGhzID0gbmV3IEFycmF5TGlzdChERUZBVUxUX1NJWkVfQ0xBU1NQQVRIKTsKLQkJLyogbm8gYm9vdGNsYXNzcGF0aCBzcGVjaWZpZWQKLQkJICogd2UgY2FuIHRyeSB0byByZXRyaWV2ZSB0aGUgZGVmYXVsdCBsaWJyYWlyaWVzIG9mIHRoZSBWTSB1c2VkIHRvIHJ1bgotCQkgKiB0aGUgYmF0Y2ggY29tcGlsZXIKLQkJICovCi0JCSBTdHJpbmcgamF2YXZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOy8vJE5PTi1OTFMtMSQKLQkJIGlmIChqYXZhdmVyc2lvbiAhPSBudWxsICYmIGphdmF2ZXJzaW9uLmVxdWFsc0lnbm9yZUNhc2UoIjEuMS44IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5sb2dnZXIubG9nV3JvbmdKREsoKTsKLQkJCXRoaXMucHJvY2VlZCA9IGZhbHNlOwotCQkJcmV0dXJuIG51bGw7Ci0JCSB9Ci0KLQkgCS8qCi0JIAkgKiBIYW5kbGUgPj0gSkRLIDEuMi4yIHNldHRpbmdzOiByZXRyaWV2ZSB0aGUgYm9vdGNsYXNzcGF0aAotCSAJICovCi0JCS8vIGNoZWNrIGJvb3RjbGFzc3BhdGggcHJvcGVydGllcyBmb3IgU3VuLCBKUm9ja2l0IGFuZCBIYXJtb255IFZNcwotCQlTdHJpbmcgYm9vdGNsYXNzcGF0aFByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgPT0gbnVsbCkgfHwgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gSUJNIEo5IFZNcwotCQkJYm9vdGNsYXNzcGF0aFByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ2bS5ib290LmNsYXNzLnBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgPT0gbnVsbCkgfHwgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCS8vIEhhcm1vbnkgdXNpbmcgSUJNIFZNRQotCQkJCWJvb3RjbGFzc3BhdGhQcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5oYXJtb255LmJvb3QuY2xhc3MucGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgIT0gbnVsbCkgJiYgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSAhPSAwKSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYm9vdGNsYXNzcGF0aFByb3BlcnR5LCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQkJU3RyaW5nIHRva2VuOwotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjdXJyZW50Q2xhc3NwYXRoID0gRmlsZVN5c3RlbQotCQkJCQkJLmdldENsYXNzcGF0aCh0b2tlbiwgY3VzdG9tRW5jb2RpbmcsIG51bGwpOwotCQkJCWlmIChjdXJyZW50Q2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQkJYm9vdGNsYXNzcGF0aHMuYWRkKGN1cnJlbnRDbGFzc3BhdGgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHRyeSB0byBnZXQgYWxsIGphcnMgaW5zaWRlIHRoZSBsaWIgZm9sZGVyIG9mIHRoZSBqYXZhIGhvbWUKLQkJCWZpbmFsIEZpbGUgamF2YUhvbWUgPSBnZXRKYXZhSG9tZSgpOwotCQkJaWYgKGphdmFIb21lICE9IG51bGwpIHsKLQkJCQlGaWxlW10gZGlyZWN0b3JpZXNUb0NoZWNrID0gbnVsbDsKLQkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiTWFjIikpIHsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQlkaXJlY3Rvcmllc1RvQ2hlY2sgPSBuZXcgRmlsZVtdIHsKLQkJCQkJCW5ldyBGaWxlKGphdmFIb21lLCAiLi4vQ2xhc3NlcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZmFsbCBiYWNrIHRvIHRyeSB0byByZXRyaWV2ZSB0aGVtIG91dCBvZiB0aGUgbGliIGRpcmVjdG9yeQotCQkJCQlkaXJlY3Rvcmllc1RvQ2hlY2sgPSBuZXcgRmlsZVtdIHsKLQkJCQkJCW5ldyBGaWxlKGphdmFIb21lLCAibGliIikgLy8kTk9OLU5MUy0xJAotCQkJCQl9OwotCQkJCX0KLQkJCQlGaWxlW11bXSBzeXN0ZW1MaWJyYXJpZXNKYXJzID0gZ2V0TGlicmFyaWVzRmlsZXMoZGlyZWN0b3JpZXNUb0NoZWNrKTsKLQkJCQlpZiAoc3lzdGVtTGlicmFyaWVzSmFycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeXN0ZW1MaWJyYXJpZXNKYXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQlGaWxlW10gY3VycmVudCA9IHN5c3RlbUxpYnJhcmllc0phcnNbaV07Ci0JCQkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDAsIG1heDIgPSBjdXJyZW50Lmxlbmd0aDsgaiA8IG1heDI7IGorKykgewotCQkJCQkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjbGFzc3BhdGggPQotCQkJCQkJCQkJRmlsZVN5c3RlbS5nZXRDbGFzc3BhdGgoY3VycmVudFtqXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJCQludWxsLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQkJCWlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotCQkJCQkJCQkJYm9vdGNsYXNzcGF0aHMuYWRkKGNsYXNzcGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGJvb3RjbGFzc3BhdGhzOwotfQotLyoKLSAqIEV4dGVybmFsIEFQSQotICovCi1wcm90ZWN0ZWQgQXJyYXlMaXN0IGhhbmRsZUNsYXNzcGF0aChBcnJheUxpc3QgY2xhc3NwYXRocywgU3RyaW5nIGN1c3RvbUVuY29kaW5nKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQlmaW5hbCBpbnQgY2xhc3NwYXRoc1NpemUgPSBjbGFzc3BhdGhzID09IG51bGwgPyAwIDogY2xhc3NwYXRocy5zaXplKCk7Ci0JaWYgKGNsYXNzcGF0aHNTaXplICE9IDApIHsKLQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2NsYXNzcGF0aHNTaXplXTsKLQkJY2xhc3NwYXRocy50b0FycmF5KHBhdGhzKTsKLQkJY2xhc3NwYXRocy5jbGVhcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aHNTaXplOyBpKyspIHsKLQkJCXByb2Nlc3NQYXRoRW50cmllcyhERUZBVUxUX1NJWkVfQ0xBU1NQQVRILCBjbGFzc3BhdGhzLCBwYXRoc1tpXSwKLQkJCQkJY3VzdG9tRW5jb2RpbmcsIGZhbHNlLCB0cnVlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vIG5vIHVzZXIgY2xhc3NwYXRoIHNwZWNpZmllZC4KLQkJY2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7Ci0JCVN0cmluZyBjbGFzc1Byb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgoY2xhc3NQcm9wID09IG51bGwpIHx8IChjbGFzc1Byb3AubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXRoaXMubG9nZ2VyLmxvZ05vQ2xhc3NwYXRoKCk7Ci0JCQljbGFzc3BhdGhzLmFkZChGaWxlU3lzdGVtLmdldENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksIGN1c3RvbUVuY29kaW5nLCBudWxsKSk7Ly8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQcm9wLCBGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQkJU3RyaW5nIHRva2VuOwotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjdXJyZW50Q2xhc3NwYXRoID0gRmlsZVN5c3RlbQotCQkJCQkJLmdldENsYXNzcGF0aCh0b2tlbiwgY3VzdG9tRW5jb2RpbmcsIG51bGwpOwotCQkJCWlmIChjdXJyZW50Q2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQkJY2xhc3NwYXRocy5hZGQoY3VycmVudENsYXNzcGF0aCk7Ci0JCQkJfSBlbHNlIGlmICh0b2tlbi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCXRoaXMubG9nZ2VyLmxvZ0luY29ycmVjdENsYXNzcGF0aCh0b2tlbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBjbGFzc3BhdGhzOwotfQotLyoKLSAqIEV4dGVybmFsIEFQSQotICogSGFuZGxlIGV4dGRpcnMgcHJvY2Vzc2luZwotICovCi1wcm90ZWN0ZWQgQXJyYXlMaXN0IGhhbmRsZUV4dGRpcnMoQXJyYXlMaXN0IGV4dGRpcnNDbGFzc3BhdGhzKSB7Ci0gCWZpbmFsIEZpbGUgamF2YUhvbWUgPSBnZXRKYXZhSG9tZSgpOwotCi0JLyoKLQkgKiBGZWVkIGV4dERpckNsYXNzcGF0aCBhY2NvcmRpbmcgdG86Ci0JICogLSAtZXh0ZGlycyBmaXJzdCBpZiBwcmVzZW50OwotCSAqIC0gZWxzZSBqYXZhLmV4dC5kaXJzIGlmIGRlZmluZWQ7Ci0JICogLSBlbHNlIGRlZmF1bHQgZXh0ZW5zaW9ucyBkaXJlY3RvcnkgZm9yIHRoZSBwbGF0Zm9ybS4KLQkgKi8KLQlpZiAoZXh0ZGlyc0NsYXNzcGF0aHMgPT0gbnVsbCkgewotCQlleHRkaXJzQ2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7Ci0JCVN0cmluZyBleHRkaXJzU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dGRpcnNTdHIgPT0gbnVsbCkgewotCQkJZXh0ZGlyc0NsYXNzcGF0aHMuYWRkKGphdmFIb21lLmdldEFic29sdXRlUGF0aCgpICsgIi9saWIvZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4dGRpcnNTdHIsIEZpbGUucGF0aFNlcGFyYXRvcik7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQkJCQlleHRkaXJzQ2xhc3NwYXRocy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJfQotCX0KLQotCS8qCi0JICogRmVlZCBleHRkaXJzQ2xhc3NwYXRoIHdpdGggdGhlIGVudHJpZXMgZm91bmQgaW50byB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGJ5Ci0JICogZXh0ZGlyc05hbWVzLgotCSAqLwotCWlmIChleHRkaXJzQ2xhc3NwYXRocy5zaXplKCkgIT0gMCkgewotCQlGaWxlW10gZGlyZWN0b3JpZXNUb0NoZWNrID0gbmV3IEZpbGVbZXh0ZGlyc0NsYXNzcGF0aHMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rvcmllc1RvQ2hlY2subGVuZ3RoOyBpKyspCi0JCQlkaXJlY3Rvcmllc1RvQ2hlY2tbaV0gPSBuZXcgRmlsZSgoU3RyaW5nKSBleHRkaXJzQ2xhc3NwYXRocy5nZXQoaSkpOwotCQlleHRkaXJzQ2xhc3NwYXRocy5jbGVhcigpOwotCQlGaWxlW11bXSBleHRkaXJzSmFycyA9IGdldExpYnJhcmllc0ZpbGVzKGRpcmVjdG9yaWVzVG9DaGVjayk7Ci0JCWlmIChleHRkaXJzSmFycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZXh0ZGlyc0phcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlGaWxlW10gY3VycmVudCA9IGV4dGRpcnNKYXJzW2ldOwotCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDAsIG1heDIgPSBjdXJyZW50Lmxlbmd0aDsgaiA8IG1heDI7IGorKykgewotCQkJCQkJRmlsZVN5c3RlbS5DbGFzc3BhdGggY2xhc3NwYXRoID0KLQkJCQkJCQlGaWxlU3lzdGVtLmdldENsYXNzcGF0aCgKLQkJCQkJCQkJCWN1cnJlbnRbal0uZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQkJCQludWxsLCBudWxsKTsKLQkJCQkJCWlmIChjbGFzc3BhdGggIT0gbnVsbCkgewotCQkJCQkJCWV4dGRpcnNDbGFzc3BhdGhzLmFkZChjbGFzc3BhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rvcmllc1RvQ2hlY2tbaV0uaXNGaWxlKCkpIHsKLQkJCQkJdGhpcy5sb2dnZXIubG9nSW5jb3JyZWN0RXh0RGlyc0VudHJ5KGRpcmVjdG9yaWVzVG9DaGVja1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIGV4dGRpcnNDbGFzc3BhdGhzOwotfQotLyoKLSAqIEV4dGVybmFsIEFQSQotICovCi1wcm90ZWN0ZWQgQXJyYXlMaXN0IGhhbmRsZUVuZG9yc2VkZGlycyhBcnJheUxpc3QgZW5kb3JzZWREaXJDbGFzc3BhdGhzKSB7Ci0gCWZpbmFsIEZpbGUgamF2YUhvbWUgPSBnZXRKYXZhSG9tZSgpOwotCS8qCi0JICogRmVlZCBlbmRvcnNlZERpckNsYXNzcGF0aCBhY2NvcmRpbmcgdG86Ci0JICogLSAtZW5kb3JzZWRkaXJzIGZpcnN0IGlmIHByZXNlbnQ7Ci0JICogLSBlbHNlIGphdmEuZW5kb3JzZWQuZGlycyBpZiBkZWZpbmVkOwotCSAqIC0gZWxzZSBkZWZhdWx0IGV4dGVuc2lvbnMgZGlyZWN0b3J5IGZvciB0aGUgcGxhdGZvcm0uICgvbGliL2VuZG9yc2VkKQotCSAqLwotCWlmIChlbmRvcnNlZERpckNsYXNzcGF0aHMgPT0gbnVsbCkgewotCQllbmRvcnNlZERpckNsYXNzcGF0aHMgPSBuZXcgQXJyYXlMaXN0KERFRkFVTFRfU0laRV9DTEFTU1BBVEgpOwotCQlTdHJpbmcgZW5kb3JzZWREaXJzU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmVuZG9yc2VkLmRpcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW5kb3JzZWREaXJzU3RyID09IG51bGwpIHsKLQkJCWlmIChqYXZhSG9tZSAhPSBudWxsKSB7Ci0JCQkJZW5kb3JzZWREaXJDbGFzc3BhdGhzLmFkZChqYXZhSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvbGliL2VuZG9yc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVuZG9yc2VkRGlyc1N0ciwgRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJZW5kb3JzZWREaXJDbGFzc3BhdGhzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBGZWVkIGV4dGRpcnNDbGFzc3BhdGggd2l0aCB0aGUgZW50cmllcyBmb3VuZCBpbnRvIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgYnkKLQkgKiBleHRkaXJzTmFtZXMuCi0JICovCi0JaWYgKGVuZG9yc2VkRGlyQ2xhc3NwYXRocy5zaXplKCkgIT0gMCkgewotCQlGaWxlW10gZGlyZWN0b3JpZXNUb0NoZWNrID0gbmV3IEZpbGVbZW5kb3JzZWREaXJDbGFzc3BhdGhzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3JpZXNUb0NoZWNrLmxlbmd0aDsgaSsrKQotCQkJZGlyZWN0b3JpZXNUb0NoZWNrW2ldID0gbmV3IEZpbGUoKFN0cmluZykgZW5kb3JzZWREaXJDbGFzc3BhdGhzLmdldChpKSk7Ci0JCWVuZG9yc2VkRGlyQ2xhc3NwYXRocy5jbGVhcigpOwotCQlGaWxlW11bXSBlbmRvcnNlZERpcnNKYXJzID0gZ2V0TGlicmFyaWVzRmlsZXMoZGlyZWN0b3JpZXNUb0NoZWNrKTsKLQkJaWYgKGVuZG9yc2VkRGlyc0phcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVuZG9yc2VkRGlyc0phcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlGaWxlW10gY3VycmVudCA9IGVuZG9yc2VkRGlyc0phcnNbaV07Ci0JCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMCwgbWF4MiA9IGN1cnJlbnQubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7Ci0JCQkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjbGFzc3BhdGggPQotCQkJCQkJCUZpbGVTeXN0ZW0uZ2V0Q2xhc3NwYXRoKAotCQkJCQkJCQkJY3VycmVudFtqXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJCW51bGwsIG51bGwpOwotCQkJCQkJaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJZW5kb3JzZWREaXJDbGFzc3BhdGhzLmFkZChjbGFzc3BhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rvcmllc1RvQ2hlY2tbaV0uaXNGaWxlKCkpIHsKLQkJCQkJdGhpcy5sb2dnZXIubG9nSW5jb3JyZWN0RW5kb3JzZWREaXJzRW50cnkoZGlyZWN0b3JpZXNUb0NoZWNrW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGVuZG9yc2VkRGlyQ2xhc3NwYXRoczsKLX0KLQotLyoKIERlY29kZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICovCi1wdWJsaWMgdm9pZCBjb25maWd1cmUoU3RyaW5nW10gYXJndikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CitwdWJsaWMgdm9pZCBjb25maWd1cmUoU3RyaW5nW10gYXJndikgewogCiAJaWYgKChhcmd2ID09IG51bGwpIHx8IChhcmd2Lmxlbmd0aCA9PSAwKSkgewogCQlwcmludFVzYWdlKCk7CkBAIC0yMjYwLDYgKzE3NDIsNyBAQAogCWZpbmFsIGludCBJTlNJREVfUFJPQ0VTU09SX3N0YXJ0ID0gMTg7CiAJZmluYWwgaW50IElOU0lERV9TX3N0YXJ0ID0gMTk7CiAJZmluYWwgaW50IElOU0lERV9DTEFTU19OQU1FUyA9IDIwOworCWZpbmFsIGludCBJTlNJREVfV0FSTklOR1NfUFJPUEVSVElFUyA9IDIxOwogCiAJZmluYWwgaW50IERFRkFVTFQgPSAwOwogCUFycmF5TGlzdCBib290Y2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7CkBAIC0yMjc0LDE1ICsxNzU3LDEyIEBACiAJaW50IGNsYXNzQ291bnQgPSAwOwogCWludCBhcmdDb3VudCA9IGFyZ3YubGVuZ3RoOwogCWludCBtb2RlID0gREVGQVVMVDsKLQl0aGlzLnJlcGV0aXRpb25zID0gMDsKKwl0aGlzLm1heFJlcGV0aXRpb24gPSAwOwogCWJvb2xlYW4gcHJpbnRVc2FnZVJlcXVpcmVkID0gZmFsc2U7CiAJU3RyaW5nIHVzYWdlU2VjdGlvbiA9IG51bGw7CiAJYm9vbGVhbiBwcmludFZlcnNpb25SZXF1aXJlZCA9IGZhbHNlOwogCi0JYm9vbGVhbiBkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nID0gZmFsc2U7CiAJYm9vbGVhbiBkaWRTcGVjaWZ5RGVwcmVjYXRpb24gPSBmYWxzZTsKLQlib29sZWFuIGRpZFNwZWNpZnlXYXJuaW5ncyA9IGZhbHNlOwotCWJvb2xlYW4gdXNlRW5hYmxlSmF2YWRvYyA9IGZhbHNlOwogCWJvb2xlYW4gZGlkU3BlY2lmeUNvbXBsaWFuY2UgPSBmYWxzZTsKIAlib29sZWFuIGRpZFNwZWNpZnlEaXNhYmxlZEFubm90YXRpb25Qcm9jZXNzaW5nID0gZmFsc2U7CiAKQEAgLTIyOTAsNiArMTc3MCw4IEBACiAJU3RyaW5nIGN1c3RvbURlc3RpbmF0aW9uUGF0aCA9IG51bGw7CiAJU3RyaW5nIGN1cnJlbnRTb3VyY2VEaXJlY3RvcnkgPSBudWxsOwogCVN0cmluZyBjdXJyZW50QXJnID0gVXRpbC5FTVBUWV9TVFJJTkc7CisJCisJU2V0IHNwZWNpZmllZEVuY29kaW5ncyA9IG51bGw7CiAKIAkvLyBleHBhbmQgdGhlIGNvbW1hbmQgbGluZSBpZiBuZWNlc3NhcnkKIAlib29sZWFuIG5lZWRFeHBhbnNpb24gPSBmYWxzZTsKQEAgLTIzMjAsNyArMTgwMiw3IEBACiAJCQkJCX0KIAkJCQkJbmV3QXJncyA9IHRva2VuaXplKGJ1ZmZlci50b1N0cmluZygpKTsKIAkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmludmFsaWRleHBhbnNpb25hcmd1bWVudG5hbWUiLCBhcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCX0KQEAgLTIzNDYsNyArMTgyOCw3IEBACiAJd2hpbGUgKCsraW5kZXggPCBhcmdDb3VudCkgewogCiAJCWlmIChjdXN0b21FbmNvZGluZyAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQ3VzdG9tRW5jb2RpbmciLCBjdXJyZW50QXJnLCBjdXN0b21FbmNvZGluZykpOyAvLyROT04tTkxTLTEkCiAJCX0KIApAQCAtMjM1NSw3ICsxODM3LDcgQEAKIAkJc3dpdGNoKG1vZGUpIHsKIAkJCWNhc2UgREVGQVVMVCA6CiAJCQkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLnVuZXhwZWN0ZWRCcmFja2V0IiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQkJY3VycmVudEFyZykpOwogCQkJCX0KQEAgLTIzNjQsNyArMTg0Niw3IEBACiAJCQkJCS8vIGxvb2sgZm9yIGVuY29kaW5nIHNwZWNpZmljYXRpb24KIAkJCQkJaW50IGVuY29kaW5nU3RhcnQgPSBjdXJyZW50QXJnLmluZGV4T2YoJ1snKSArIDE7CiAJCQkJCWlmIChlbmNvZGluZ1N0YXJ0IDw9IDEpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCWludCBlbmNvZGluZ0VuZCA9IGN1cnJlbnRBcmcubGVuZ3RoKCkgLSAxOwpAQCAtMjM3NCw3ICsxODU2LDcgQEAKIAkJCQkJCQl0cnkgeyAvLyBlbnN1cmUgZW5jb2RpbmcgaXMgc3VwcG9ydGVkCiAJCQkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCBjdXN0b21FbmNvZGluZyk7CiAJCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bnN1cHBvcnRlZEVuY29kaW5nIiwgY3VzdG9tRW5jb2RpbmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTI0MTcsMjEgKzE4OTksMjEgQEAKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItbG9nIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUxvZyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQltb2RlID0gSU5TSURFX0xPRzsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXJlcGVhdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHRoaXMucmVwZXRpdGlvbnMgPiAwKQotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJaWYgKHRoaXMubWF4UmVwZXRpdGlvbiA+IDApCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZVJlcGVhdCIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQltb2RlID0gSU5TSURFX1JFUEVUSVRJT047CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1tYXhQcm9ibGVtcyIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaWYgKHRoaXMubWF4UHJvYmxlbXMgPiAwKQotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlTWF4UHJvYmxlbXMiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJbW9kZSA9IElOU0lERV9NQVhfUFJPQkxFTVM7CiAJCQkJCWNvbnRpbnVlOwpAQCAtMjQ0Niw3ICsxOTI4LDcgQEAKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItMS4zIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQlpZiAoZGlkU3BlY2lmeUNvbXBsaWFuY2UpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUNvbXBsaWFuY2UiLCBjdXJyZW50QXJnKSk7Ly8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCWRpZFNwZWNpZnlDb21wbGlhbmNlID0gdHJ1ZTsKQEAgLTI0NTYsNyArMTkzOCw3IEBACiAJCQkJfQogCQkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLTEuNCIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaWYgKGRpZFNwZWNpZnlDb21wbGlhbmNlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVDb21wbGlhbmNlIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJZGlkU3BlY2lmeUNvbXBsaWFuY2UgPSB0cnVlOwpAQCAtMjQ2Niw3ICsxOTQ4LDcgQEAKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItMS41IikgfHwgY3VycmVudEFyZy5lcXVhbHMoIi01IikgfHwgY3VycmVudEFyZy5lcXVhbHMoIi01LjAiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQkJCQlpZiAoZGlkU3BlY2lmeUNvbXBsaWFuY2UpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUNvbXBsaWFuY2UiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQlkaWRTcGVjaWZ5Q29tcGxpYW5jZSA9IHRydWU7CkBAIC0yNDc2LDcgKzE5NTgsNyBAQAogCQkJCX0KIAkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi0xLjYiKSB8fCBjdXJyZW50QXJnLmVxdWFscygiLTYiKSB8fCBjdXJyZW50QXJnLmVxdWFscygiLTYuMCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCQkJCWlmIChkaWRTcGVjaWZ5Q29tcGxpYW5jZSkgewotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlQ29tcGxpYW5jZSIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCWRpZFNwZWNpZnlDb21wbGlhbmNlID0gdHJ1ZTsKQEAgLTI0ODYsNyArMTk2OCw3IEBACiAJCQkJfQogCQkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLTEuNyIpIHx8IGN1cnJlbnRBcmcuZXF1YWxzKCItNyIpIHx8IGN1cnJlbnRBcmcuZXF1YWxzKCItNy4wIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJCQkJaWYgKGRpZFNwZWNpZnlDb21wbGlhbmNlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVDb21wbGlhbmNlIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJZGlkU3BlY2lmeUNvbXBsaWFuY2UgPSB0cnVlOwpAQCAtMjUwMiw3ICsxOTg0LDcgQEAKIAkJCQkJCQllcnJvck1lc3NhZ2UuYXBwZW5kKCcgJyk7CiAJCQkJCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChuZXdDb21tYW5kTGluZUFyZ3NbaW5kZXggKyAxXSk7CiAJCQkJCQl9Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVPdXRwdXRQYXRoIiwgZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCW1vZGUgPSBJTlNJREVfREVTVElOQVRJT05fUEFUSDsKQEAgLTI1MjEsNyArMjAwMyw3IEBACiAJCQkJCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgnICcpOwogCQkJCQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobmV3Q29tbWFuZExpbmVBcmdzW2luZGV4ICsgMV0pOwogCQkJCQkJfQotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlQm9vdENsYXNzcGF0aCIsIGVycm9yTWVzc2FnZS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQltb2RlID0gSU5TSURFX0JPT1RDTEFTU1BBVEhfc3RhcnQ7CkBAIC0yNTM1LDcgKzIwMTcsNyBAQAogCQkJCQkJCWVycm9yTWVzc2FnZS5hcHBlbmQoJyAnKTsKIAkJCQkJCQllcnJvck1lc3NhZ2UuYXBwZW5kKG5ld0NvbW1hbmRMaW5lQXJnc1tpbmRleCArIDFdKTsKIAkJCQkJCX0KLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZVNvdXJjZXBhdGgiLCBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJbW9kZSA9IElOU0lERV9TT1VSQ0VfUEFUSF9zdGFydDsKQEAgLTI1NDksNyArMjAzMSw3IEBACiAJCQkJCQkJZXJyb3JNZXNzYWdlLmFwcGVuZCgnICcpOwogCQkJCQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobmV3Q29tbWFuZExpbmVBcmdzW2luZGV4ICsgMV0pOwogCQkJCQkJfQotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlRXh0RGlycyIsIGVycm9yTWVzc2FnZS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQltb2RlID0gSU5TSURFX0VYVF9ESVJTOwpAQCAtMjU2Myw3ICsyMDQ1LDcgQEAKIAkJCQkJCQllcnJvck1lc3NhZ2UuYXBwZW5kKCcgJyk7CiAJCQkJCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChuZXdDb21tYW5kTGluZUFyZ3NbaW5kZXggKyAxXSk7CiAJCQkJCQl9Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVFbmRvcnNlZERpcnMiLCBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJbW9kZSA9IElOU0lERV9FTkRPUlNFRF9ESVJTOwpAQCAtMjU3NCwxNCArMjA1NiwzMCBAQAogCQkJCQl0aGlzLnNob3dQcm9ncmVzcyA9IHRydWU7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KLQkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcm9jZWVkT25FcnJvciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoY3VycmVudEFyZy5zdGFydHNXaXRoKCItcHJvY2VlZE9uRXJyb3IiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCW1vZGUgPSBERUZBVUxUOworCQkJCQlpbnQgbGVuZ3RoID0gY3VycmVudEFyZy5sZW5ndGgoKTsKKwkJCQkJaWYgKGxlbmd0aCA+IDE1KSB7CisJCQkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcm9jZWVkT25FcnJvcjpGYXRhbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fRmF0YWxPcHRpb25hbEVycm9yLCBDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ0NvbmZpZ3VyYXRpb24iLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9GYXRhbE9wdGlvbmFsRXJyb3IsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQkJCX0KIAkJCQkJdGhpcy5wcm9jZWVkT25FcnJvciA9IHRydWU7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi10aW1lIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQltb2RlID0gREVGQVVMVDsKLQkJCQkJdGhpcy50aW1pbmcgPSB0cnVlOworCQkJCQl0aGlzLnRpbWluZyA9IFRJTUlOR19FTkFCTEVEOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGltZTpkZXRhaWwiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW1vZGUgPSBERUZBVUxUOworCQkJCQl0aGlzLnRpbWluZyA9IFRJTUlOR19FTkFCTEVEfFRJTUlOR19ERVRBSUxFRDsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXZlcnNpb24iKSAvLyROT04tTkxTLTEkCkBAIC0yNjI4LDExICsyMTI2LDExIEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1pbmxpbmVKU1IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJICAgIG1vZGUgPSBERUZBVUxUOworCQkJCQltb2RlID0gREVGQVVMVDsKIAkJCQkJdGhpcy5vcHRpb25zLnB1dCgKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0lubGluZUpzciwKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7Ci0JCQkJICAgIGNvbnRpbnVlOworCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiLWciKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCW1vZGUgPSBERUZBVUxUOwpAQCAtMjY3OSwxMyArMjE3NywxMyBAQAogCQkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlLAogCQkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKIAkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uIiwgZGVidWdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkRGVidWdPcHRpb24iLCBkZWJ1Z09wdGlvbikpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi1ub3dhcm4iKSkgeyAvLyROT04tTkxTLTEkCkBAIC0yNzAyLDI2ICsyMjAwLDI3IEBACiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQogCQkJCQlpZiAobGVuZ3RoIDw9IDYpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmludmFsaWRXYXJuaW5nQ29uZmlndXJhdGlvbiIsIHdhcm5pbmdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCWludCB3YXJuVG9rZW5TdGFydDsKLQkJCQkJYm9vbGVhbiBpc0VuYWJsaW5nOworCQkJCQlib29sZWFuIGlzRW5hYmxpbmcsIGFsbG93UGx1c09yTWludXM7CiAJCQkJCXN3aXRjaCAod2FybmluZ09wdGlvbi5jaGFyQXQoNikpIHsKIAkJCQkJCWNhc2UgJysnIDoKIAkJCQkJCQl3YXJuVG9rZW5TdGFydCA9IDc7CiAJCQkJCQkJaXNFbmFibGluZyA9IHRydWU7CisJCQkJCQkJYWxsb3dQbHVzT3JNaW51cyA9IHRydWU7CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlICctJyA6CiAJCQkJCQkJd2FyblRva2VuU3RhcnQgPSA3OwotCQkJCQkJCWlzRW5hYmxpbmcgPSBmYWxzZTsgLy8gbWVudGlvbm5lZCB3YXJuaW5ncyBhcmUgZGlzYWJsZWQKKwkJCQkJCQlpc0VuYWJsaW5nID0gZmFsc2U7IC8vIHNwZWNpZmllZCB3YXJuaW5ncyBhcmUgZGlzYWJsZWQKKwkJCQkJCQlhbGxvd1BsdXNPck1pbnVzID0gdHJ1ZTsKIAkJCQkJCQlicmVhazsKIAkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJZGlzYWJsZVdhcm5pbmdzKCk7CiAJCQkJCQkJd2FyblRva2VuU3RhcnQgPSA2OwotCQkJCQkJCS8vIGNsZWFyIGRlZmF1bHQgd2FybmluZyBsZXZlbAotCQkJCQkJCS8vIGJ1dCBhbGxvdyBtdWx0aXBsZSB3YXJuaW5nIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lCi0JCQkJCQkJaWYgKCFkaWRTcGVjaWZ5V2FybmluZ3MpIGRpc2FibGVXYXJuaW5ncygpOwogCQkJCQkJCWlzRW5hYmxpbmcgPSB0cnVlOworCQkJCQkJCWFsbG93UGx1c09yTWludXMgPSBmYWxzZTsKIAkJCQkJfQogCiAJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPQpAQCAtMjczNSwxMiArMjIzNCw5NCBAQAogCQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewogCQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwogCQkJCQkJdG9rZW5Db3VudGVyKys7Ci0JCQkJCQloYW5kbGVXYXJuaW5nVG9rZW4odG9rZW4sIGlzRW5hYmxpbmcsIHVzZUVuYWJsZUphdmFkb2MpOworCQkJCQkJc3dpdGNoKHRva2VuLmNoYXJBdCgwKSkgeworCQkJCQkJCWNhc2UgJysnIDoKKwkJCQkJCQkJaWYgKGFsbG93UGx1c09yTWludXMpIHsKKwkJCQkJCQkJCWlzRW5hYmxpbmcgPSB0cnVlOworCQkJCQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkVXNhZ2VPZlBsdXNPcHRpb24iLCB0b2tlbikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnLScgOgorCQkJCQkJCQlpZiAoYWxsb3dQbHVzT3JNaW51cykgeworCQkJCQkJCQkJaXNFbmFibGluZyA9IGZhbHNlOworCQkJCQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkVXNhZ2VPZk1pbnVzT3B0aW9uIiwgdG9rZW4pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQloYW5kbGVXYXJuaW5nVG9rZW4odG9rZW4sIGlzRW5hYmxpbmcpOwogCQkJCQl9Ci0JCQkJCWlmICh0b2tlbkNvdW50ZXIgPT0gMCkKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCWlmICh0b2tlbkNvdW50ZXIgPT0gMCkgeworCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ09wdGlvbiIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkaWRTcGVjaWZ5V2FybmluZ3MgPSB0cnVlOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoY3VycmVudEFyZy5zdGFydHNXaXRoKCItZXJyIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQltb2RlID0gREVGQVVMVDsKKwkJCQkJU3RyaW5nIGVycm9yT3B0aW9uID0gY3VycmVudEFyZzsKKwkJCQkJaW50IGxlbmd0aCA9IGN1cnJlbnRBcmcubGVuZ3RoKCk7CisJCQkJCWlmIChsZW5ndGggPD0gNSkgeworCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkRXJyb3JDb25maWd1cmF0aW9uIiwgZXJyb3JPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWludCBlcnJvclRva2VuU3RhcnQ7CisJCQkJCWJvb2xlYW4gaXNFbmFibGluZywgYWxsb3dQbHVzT3JNaW51czsKKwkJCQkJc3dpdGNoIChlcnJvck9wdGlvbi5jaGFyQXQoNSkpIHsKKwkJCQkJCWNhc2UgJysnIDoKKwkJCQkJCQllcnJvclRva2VuU3RhcnQgPSA2OworCQkJCQkJCWlzRW5hYmxpbmcgPSB0cnVlOworCQkJCQkJCWFsbG93UGx1c09yTWludXMgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnLScgOgorCQkJCQkJCWVycm9yVG9rZW5TdGFydCA9IDY7CisJCQkJCQkJaXNFbmFibGluZyA9IGZhbHNlOyAvLyBzcGVjaWZpZWQgZXJyb3JzIGFyZSBkaXNhYmxlZAorCQkJCQkJCWFsbG93UGx1c09yTWludXMgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlkaXNhYmxlRXJyb3JzKCk7CisJCQkJCQkJZXJyb3JUb2tlblN0YXJ0ID0gNTsKKwkJCQkJCQlpc0VuYWJsaW5nID0gdHJ1ZTsKKwkJCQkJCQlhbGxvd1BsdXNPck1pbnVzID0gZmFsc2U7CisJCQkJCX0KKworCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KKwkJCQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoZXJyb3JPcHRpb24uc3Vic3RyaW5nKGVycm9yVG9rZW5TdGFydCwgZXJyb3JPcHRpb24ubGVuZ3RoKCkpLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWludCB0b2tlbkNvdW50ZXIgPSAwOworCisJCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCQl0b2tlbkNvdW50ZXIrKzsKKwkJCQkJCXN3aXRjaCh0b2tlbi5jaGFyQXQoMCkpIHsKKwkJCQkJCQljYXNlICcrJyA6CisJCQkJCQkJCWlmIChhbGxvd1BsdXNPck1pbnVzKSB7CisJCQkJCQkJCQlpc0VuYWJsaW5nID0gdHJ1ZTsKKwkJCQkJCQkJCXRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDEpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZFVzYWdlT2ZQbHVzT3B0aW9uIiwgdG9rZW4pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJy0nIDoKKwkJCQkJCQkJaWYgKGFsbG93UGx1c09yTWludXMpIHsKKwkJCQkJCQkJCWlzRW5hYmxpbmcgPSBmYWxzZTsKKwkJCQkJCQkJCXRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDEpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZFVzYWdlT2ZNaW51c09wdGlvbiIsIHRva2VuKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWhhbmRsZUVycm9yVG9rZW4odG9rZW4sIGlzRW5hYmxpbmcpOworCQkJCQl9CisJCQkJCWlmICh0b2tlbkNvdW50ZXIgPT0gMCkgeworCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkRXJyb3JPcHRpb24iLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGFyZ2V0IikpIHsgLy8kTk9OLU5MUy0xJApAQCAtMjc1MSwxNSArMjMzMiwxMiBAQAogCQkJCQl0aGlzLm9wdGlvbnMucHV0KAogCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9QcmVzZXJ2ZVVudXNlZExvY2FsLAogCQkJCQkJQ29tcGlsZXJPcHRpb25zLlBSRVNFUlZFKTsKLQkJCQkgICAgbW9kZSA9IERFRkFVTFQ7CisJCQkJCW1vZGUgPSBERUZBVUxUOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItZW5hYmxlSmF2YWRvYyIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCSAgICBtb2RlID0gREVGQVVMVDsKLQkJCQkJdGhpcy5vcHRpb25zLnB1dCgKLQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fRG9jQ29tbWVudFN1cHBvcnQsCi0JCQkJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7Ci0JCQkJCXVzZUVuYWJsZUphdmFkb2MgPSB0cnVlOworCQkJCQltb2RlID0gREVGQVVMVDsKKwkJCQkJdGhpcy5lbmFibGVKYXZhZG9jT24gPSB0cnVlOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItWGVtYWNzIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtMjgyMSwxMCArMjM5OSwxNCBAQAogCQkJCQltb2RlID0gSU5TSURFX0NMQVNTX05BTUVTOwogCQkJCQljb250aW51ZTsKIAkJCQl9CisJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbW9kZSA9IElOU0lERV9XQVJOSU5HU19QUk9QRVJUSUVTOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOU0lERV9UQVJHRVQgOgogCQkJCWlmICh0aGlzLmRpZFNwZWNpZnlUYXJnZXQpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZVRhcmdldCIsIGN1cnJlbnRBcmcpKTsvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCXRoaXMuZGlkU3BlY2lmeVRhcmdldCA9IHRydWU7CkBAIC0yODQ0LDggKzI0MjYsMTEgQEAKIAkJCQkJdGhpcy5vcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzcpOwogCQkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoImpzcjE0IikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OX0pTUjE0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLnRhcmdldEpESyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoImNsZGMxLjEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fQ0xEQzFfMSk7CisJCQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9JbmxpbmVKc3IsIENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEKTsKKwkJCQl9ZWxzZSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUudGFyZ2V0SkRLIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCW1vZGUgPSBERUZBVUxUOwogCQkJCWNvbnRpbnVlOwpAQCAtMjg1NSwxMiArMjQ0MCwxMiBAQAogCQkJCWNvbnRpbnVlOwogCQkJY2FzZSBJTlNJREVfUkVQRVRJVElPTiA6CiAJCQkJdHJ5IHsKLQkJCQkJdGhpcy5yZXBldGl0aW9ucyA9IEludGVnZXIucGFyc2VJbnQoY3VycmVudEFyZyk7Ci0JCQkJCWlmICh0aGlzLnJlcGV0aXRpb25zIDw9IDApIHsKLQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUucmVwZXRpdGlvbiIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0aGlzLm1heFJlcGV0aXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGN1cnJlbnRBcmcpOworCQkJCQlpZiAodGhpcy5tYXhSZXBldGl0aW9uIDw9IDApIHsKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUucmVwZXRpdGlvbiIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5yZXBldGl0aW9uIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUucmVwZXRpdGlvbiIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQltb2RlID0gREVGQVVMVDsKIAkJCQljb250aW51ZTsKQEAgLTI4NjgsMTcgKzI0NTMsMTcgQEAKIAkJCQl0cnkgewogCQkJCQl0aGlzLm1heFByb2JsZW1zID0gSW50ZWdlci5wYXJzZUludChjdXJyZW50QXJnKTsKIAkJCQkJaWYgKHRoaXMubWF4UHJvYmxlbXMgPD0gMCkgewotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5tYXhQcm9ibGVtcyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5tYXhQcm9ibGVtcyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCXRoaXMub3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9NYXhQcm9ibGVtUGVyVW5pdCwgY3VycmVudEFyZyk7CiAJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5tYXhQcm9ibGVtcyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLm1heFByb2JsZW1zIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCW1vZGUgPSBERUZBVUxUOwogCQkJCWNvbnRpbnVlOwogCQkJY2FzZSBJTlNJREVfU09VUkNFIDoKIAkJCQlpZiAodGhpcy5kaWRTcGVjaWZ5U291cmNlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVTb3VyY2UiLCBjdXJyZW50QXJnKSk7Ly8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQl0aGlzLmRpZFNwZWNpZnlTb3VyY2UgPSB0cnVlOwpAQCAtMjg5MywyNyArMjQ3OCw0MSBAQAogCQkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuNyIpIHx8IGN1cnJlbnRBcmcuZXF1YWxzKCI3IikgfHwgY3VycmVudEFyZy5lcXVhbHMoIjcuMCIpKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJCQkJdGhpcy5vcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV83KTsKIAkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLnNvdXJjZSIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLnNvdXJjZSIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQltb2RlID0gREVGQVVMVDsKIAkJCQljb250aW51ZTsKIAkJCWNhc2UgSU5TSURFX0RFRkFVTFRfRU5DT0RJTkcgOgotCQkJCWlmIChkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCi0JCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVEZWZhdWx0RW5jb2RpbmciLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoc3BlY2lmaWVkRW5jb2RpbmdzICE9IG51bGwpIHsKKwkJCQkJLy8gY2hlY2sgYWxyZWFkeSBkZWZpbmVkIGVuY29kaW5nCisJCQkJCWlmICghc3BlY2lmaWVkRW5jb2RpbmdzLmNvbnRhaW5zKGN1cnJlbnRBcmcpKSB7CisJCQkJCQlpZiAoc3BlY2lmaWVkRW5jb2RpbmdzLnNpemUoKSA+IDEpIHsKKwkJCQkJCQl0aGlzLmxvZ2dlci5sb2dXYXJuaW5nKAorCQkJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZGlmZmVyZW50ZW5jb2RpbmdzIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJY3VycmVudEFyZywKKwkJCQkJCQkJCWdldEFsbEVuY29kaW5ncyhzcGVjaWZpZWRFbmNvZGluZ3MpKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMubG9nZ2VyLmxvZ1dhcm5pbmcoCisJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5kaWZmZXJlbnRlbmNvZGluZyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCWN1cnJlbnRBcmcsCisJCQkJCQkJCQlnZXRBbGxFbmNvZGluZ3Moc3BlY2lmaWVkRW5jb2RpbmdzKSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc3BlY2lmaWVkRW5jb2RpbmdzID0gbmV3IEhhc2hTZXQoKTsKIAkJCQl9CiAJCQkJdHJ5IHsgLy8gZW5zdXJlIGVuY29kaW5nIGlzIHN1cHBvcnRlZAogCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSwgY3VycmVudEFyZyk7CiAJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bnN1cHBvcnRlZEVuY29kaW5nIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCiAJCQkJfQorCQkJCXNwZWNpZmllZEVuY29kaW5ncy5hZGQoY3VycmVudEFyZyk7CiAJCQkJdGhpcy5vcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0VuY29kaW5nLCBjdXJyZW50QXJnKTsKLQkJCQlkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nID0gdHJ1ZTsKIAkJCQltb2RlID0gREVGQVVMVDsKIAkJCQljb250aW51ZTsKIAkJCWNhc2UgSU5TSURFX0RFU1RJTkFUSU9OX1BBVEggOgotCQkJCXRoaXMuc2V0RGVzdGluYXRpb25QYXRoKGN1cnJlbnRBcmcuZXF1YWxzKE5PTkUpID8gTk9ORSA6IGN1cnJlbnRBcmcpOworCQkJCXNldERlc3RpbmF0aW9uUGF0aChjdXJyZW50QXJnLmVxdWFscyhOT05FKSA/IE5PTkUgOiBjdXJyZW50QXJnKTsKIAkJCQltb2RlID0gREVGQVVMVDsKIAkJCQljb250aW51ZTsKIAkJCWNhc2UgSU5TSURFX0NMQVNTUEFUSF9zdGFydDoKQEAgLTI5MzIsNyArMjUzMSw3IEBACiAJCQkJY29udGludWU7CiAJCQljYXNlIElOU0lERV9FWFRfRElSUzoKIAkJCQlpZiAoY3VycmVudEFyZy5pbmRleE9mKCJbLWQiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkRGVzdGluYXRpb25QYXRoRW50cnkiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJIi1leHRkaXIiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CkBAIC0yOTQ0LDcgKzI1NDMsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJY2FzZSBJTlNJREVfRU5ET1JTRURfRElSUzoKIAkJCQlpZiAoY3VycmVudEFyZy5pbmRleE9mKCJbLWQiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkRGVzdGluYXRpb25QYXRoRW50cnkiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJIi1lbmRvcnNlZGRpcnMiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CQkJCXRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudEFyZywJRmlsZS5wYXRoU2VwYXJhdG9yLCBmYWxzZSk7CkBAIC0yOTU4LDcgKzI1NTcsNyBAQAogCQkJCQljdXN0b21EZXN0aW5hdGlvblBhdGggPSBjdXJyZW50QXJnLnN1YnN0cmluZygwLAogCQkJCQkJY3VycmVudEFyZy5sZW5ndGgoKSAtIDEpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3REZXN0aW5hdGlvblBhdGhFbnRyeSIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkiWy1kICIgKyBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CkBAIC0yOTk0LDYgKzI1OTMsMTAgQEAKIAkJCQl9CiAJCQkJbW9kZSA9IERFRkFVTFQ7CiAJCQkJY29udGludWU7CisJCQljYXNlIElOU0lERV9XQVJOSU5HU19QUk9QRVJUSUVTIDoKKwkJCQlpbml0aWFsaXplV2FybmluZ3MoY3VycmVudEFyZyk7CisJCQkJbW9kZSA9IERFRkFVTFQ7CisJCQkJY29udGludWU7CiAJCX0KIAogCQkvLyBkZWZhdWx0IGlzIGlucHV0IGRpcmVjdG9yeSwgaWYgbm8gY3VzdG9tIGRlc3RpbmF0aW9uIHBhdGggZXhpc3RzCkBAIC0zMDA2LDEzICsyNjA5LDEyIEBACiAJCQkJCWN1cnJlbnRBcmcubGVuZ3RoKCkgLSAzKTsKIAkJCQltb2RlID0gSU5TSURFX1NPVVJDRV9ESVJFQ1RPUllfREVTVElOQVRJT05fUEFUSDsKIAkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3VycmVudFNvdXJjZURpcmVjdG9yeSA9IGN1cnJlbnRBcmc7CiAJCQl9CisJCQljdXJyZW50U291cmNlRGlyZWN0b3J5ID0gY3VycmVudEFyZzsKIAkJfQogCQlGaWxlIGRpciA9IG5ldyBGaWxlKGN1cnJlbnRTb3VyY2VEaXJlY3RvcnkpOwogCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bnJlY29nbml6ZWRPcHRpb24iLCBjdXJyZW50U291cmNlRGlyZWN0b3J5KSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlTdHJpbmdbXSByZXN1bHQgPSBGaWxlRmluZGVyLmZpbmQoZGlyLCBTdWZmaXhDb25zdGFudHMuU1VGRklYX1NUUklOR19KQVZBKTsKQEAgLTMwNjYsNiArMjY2OCw0MSBAQAogCQljb250aW51ZTsKIAl9CiAKKwkvLyBzZXQgRG9jQ29tbWVudFN1cHBvcnQsIHdpdGggYXBwcm9wcmlhdGUgc2lkZSBlZmZlY3RzIG9uIGRlZmF1bHRzIGlmCisJLy8gamF2YWRvYyBpcyBub3QgZW5hYmxlZAorCWlmICh0aGlzLmVuYWJsZUphdmFkb2NPbikgeworCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Eb2NDb21tZW50U3VwcG9ydCwKKwkJCUNvbXBpbGVyT3B0aW9ucy5FTkFCTEVEKTsKKwl9IGVsc2UgaWYgKHRoaXMud2FybkphdmFkb2NPbiB8fCB0aGlzLndhcm5BbGxKYXZhZG9jT24pIHsKKwkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fRG9jQ29tbWVudFN1cHBvcnQsCisJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCS8vIG92ZXJyaWRlIGRlZmF1bHRzOiByZWZlcmVuY2VzIHRoYXQgYXJlIGVtYmVkZGVkIGluIGphdmFkb2MgYXJlIGlnbm9yZWQKKwkJLy8gZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgcGFyYW1ldGVycyBhbmQgdGhyb3duIGV4Y2VwdGlvbnMgdXNhZ2UKKwkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UsCisJCQlDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlLAorCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwl9CisJLy8gY29uZmlndXJlIHdhcm5pbmdzIGZvciBqYXZhZG9jIGNvbnRlbnRzCisJaWYgKHRoaXMud2FybkphdmFkb2NPbikgeworCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3MsCisJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCXRoaXMub3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWYsCisJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCXRoaXMub3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWYsCisJCQlDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CisJCXRoaXMub3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHksCisJCQlDb21waWxlck9wdGlvbnMuUFJJVkFURSk7CisJfQorCiAJaWYgKHByaW50VXNhZ2VSZXF1aXJlZCB8fCAoZmlsZXNDb3VudCA9PSAwICYmIGNsYXNzQ291bnQgPT0gMCkpIHsKIAkJaWYgKHVzYWdlU2VjdGlvbiA9PSAgbnVsbCkgewogCQkJcHJpbnRVc2FnZSgpOyAvLyBkZWZhdWx0CkBAIC0zMDg0LDcgKzI3MjEsNyBAQAogCXRoaXMubG9nZ2VyLmxvZ1ZlcnNpb24ocHJpbnRWZXJzaW9uUmVxdWlyZWQpOwogCiAJdmFsaWRhdGVPcHRpb25zKGRpZFNwZWNpZnlDb21wbGlhbmNlKTsKLQkKKwogCS8vIEVuYWJsZSBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgYnkgZGVmYXVsdCBpbiBiYXRjaCBtb2RlIHdoZW4gY29tcGxpYW5jZSBpcyBhdCBsZWFzdCAxLjYKIAkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3NjgKIAlpZiAoIWRpZFNwZWNpZnlEaXNhYmxlZEFubm90YXRpb25Qcm9jZXNzaW5nCkBAIC0zMDk0LDEyICsyNzMxLDEyIEBACiAKIAl0aGlzLmxvZ2dlci5sb2dDb21tYW5kTGluZUFyZ3VtZW50cyhuZXdDb21tYW5kTGluZUFyZ3MpOwogCXRoaXMubG9nZ2VyLmxvZ09wdGlvbnModGhpcy5vcHRpb25zKTsKLQlpZiAodGhpcy5yZXBldGl0aW9ucyA9PSAwKSB7Ci0JCXRoaXMucmVwZXRpdGlvbnMgPSAxOworCisJaWYgKHRoaXMubWF4UmVwZXRpdGlvbiA9PSAwKSB7CisJCXRoaXMubWF4UmVwZXRpdGlvbiA9IDE7CiAJfQotCWlmICh0aGlzLnJlcGV0aXRpb25zID49IDMgJiYgdGhpcy50aW1pbmcpIHsKLQkJdGhpcy50aW1lcyA9IG5ldyBsb25nW3RoaXMucmVwZXRpdGlvbnNdOwotCQl0aGlzLnRpbWVzQ291bnRlciA9IDA7CisJaWYgKHRoaXMubWF4UmVwZXRpdGlvbiA+PSAzICYmICh0aGlzLnRpbWluZyAmIFRJTUlOR19FTkFCTEVEKSAhPSAwKSB7CisJCXRoaXMuY29tcGlsZXJTdGF0cyA9IG5ldyBDb21waWxlclN0YXRzW3RoaXMubWF4UmVwZXRpdGlvbl07CiAJfQogCiAJaWYgKGZpbGVzQ291bnQgIT0gMCkgewpAQCAtMzExOSw3ICsyNzU2LDcgQEAKIAkJCTAsCiAJCQljbGFzc0NvdW50KTsKIAl9Ci0JCisKIAlzZXRQYXRocyhib290Y2xhc3NwYXRocywKIAkJCXNvdXJjZXBhdGhDbGFzc3BhdGhBcmcsCiAJCQlzb3VyY2VwYXRoQ2xhc3NwYXRocywKQEAgLTMxMjcsOCArMjc2NCw2NiBAQAogCQkJZXh0ZGlyc0NsYXNzcGF0aHMsCiAJCQllbmRvcnNlZERpckNsYXNzcGF0aHMsCiAJCQljdXN0b21FbmNvZGluZyk7CisKKwlpZiAoc3BlY2lmaWVkRW5jb2RpbmdzICE9IG51bGwgJiYgc3BlY2lmaWVkRW5jb2RpbmdzLnNpemUoKSA+IDEpIHsKKwkJdGhpcy5sb2dnZXIubG9nV2FybmluZyh0aGlzLmJpbmQoImNvbmZpZ3VyZS5tdWx0aXBsZWVuY29kaW5ncyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkoU3RyaW5nKSB0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fRW5jb2RpbmcpLAorCQkJCWdldEFsbEVuY29kaW5ncyhzcGVjaWZpZWRFbmNvZGluZ3MpKSk7CisJfQorCWlmICh0aGlzLnBlbmRpbmdFcnJvcnMgIT0gbnVsbCkgeworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5wZW5kaW5nRXJyb3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7CisJCQlTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXRoaXMubG9nZ2VyLmxvZ1BlbmRpbmdFcnJvcihtZXNzYWdlKTsKKwkJfQorCQl0aGlzLnBlbmRpbmdFcnJvcnMgPSBudWxsOworCX0KK30KK3ByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBbGxFbmNvZGluZ3MoU2V0IGVuY29kaW5ncykgeworCWludCBzaXplID0gZW5jb2RpbmdzLnNpemUoKTsKKwlTdHJpbmdbXSBhbGxFbmNvZGluZ3MgPSBuZXcgU3RyaW5nW3NpemVdOworCWVuY29kaW5ncy50b0FycmF5KGFsbEVuY29kaW5ncyk7CisJQXJyYXlzLnNvcnQoYWxsRW5jb2RpbmdzKTsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChpID4gMCkgeworCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWJ1ZmZlci5hcHBlbmQoYWxsRW5jb2RpbmdzW2ldKTsKKwl9CisJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7CiB9CiAKK3ByaXZhdGUgdm9pZCBpbml0aWFsaXplV2FybmluZ3MoU3RyaW5nIHByb3BlcnRpZXNGaWxlKSB7CisJRmlsZSBmaWxlID0gbmV3IEZpbGUocHJvcGVydGllc0ZpbGUpOworCWlmICghZmlsZS5leGlzdHMoKSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLm1pc3Npbmd3YXJuaW5nc3Byb3BlcnRpZXNmaWxlIiwgcHJvcGVydGllc0ZpbGUpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlCdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKKwl0cnkgeworCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlKSk7CisJCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCQlwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKKwl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pb2V4Y2VwdGlvbndhcm5pbmdzcHJvcGVydGllc2ZpbGUiLCBwcm9wZXJ0aWVzRmlsZSkpOyAvLyROT04tTkxTLTEkCisJfSBmaW5hbGx5IHsKKwkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwl9CisJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgeworCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7CisJCWZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKwkJaWYgKGtleS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhpcy5vcHRpb25zLnB1dChrZXksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJfQorfQogcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVdhcm5pbmdzKCkgewogCU9iamVjdFtdIGVudHJpZXMgPSB0aGlzLm9wdGlvbnMuZW50cnlTZXQoKS50b0FycmF5KCk7CiAJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKQEAgLTMxNDMsNyArMjgzOCwxOSBAQAogCX0KIAl0aGlzLm9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1RhZ3MsIFV0aWwuRU1QVFlfU1RSSU5HKTsKIH0KLQorcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUVycm9ycygpIHsKKwlPYmplY3RbXSBlbnRyaWVzID0gdGhpcy5vcHRpb25zLmVudHJ5U2V0KCkudG9BcnJheSgpOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVudHJpZXNbaV07CisJCWlmICghKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgU3RyaW5nKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpLmVxdWFscyhDb21waWxlck9wdGlvbnMuRVJST1IpKSB7CisJCQl0aGlzLm9wdGlvbnMucHV0KGVudHJ5LmdldEtleSgpLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJfQorCX0KK30KIHB1YmxpYyBTdHJpbmcgZXh0cmFjdERlc3RpbmF0aW9uUGF0aEZyb21Tb3VyY2VGaWxlKENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgewogCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcmVzdWx0LmNvbXBpbGF0aW9uVW5pdDsKIAlpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKQEAgLTMxNTksNyArMjg2Niw2IEBACiAJfQogCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKIH0KLQogLyoKICAqIEFuc3dlciB0aGUgY29tcG9uZW50IHRvIHdoaWNoIHdpbGwgYmUgaGFuZGVkIGJhY2sgY29tcGlsYXRpb24gcmVzdWx0cyBmcm9tIHRoZSBjb21waWxlcgogICovCkBAIC0zMTY5LDcgKzI4NzUsNiBAQAogCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXN1bHQoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKIAkJCWlmIChjb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zICE9IG51bGwpIHsKIAkJCQlpbnQgdW5pdExpbmVDb3VudCA9IGNvbXBpbGF0aW9uUmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMubGVuZ3RoOwotCQkJCU1haW4udGhpcy5saW5lQ291bnQgKz0gdW5pdExpbmVDb3VudDsKIAkJCQl0aGlzLmxpbmVEZWx0YSArPSB1bml0TGluZUNvdW50OwogCQkJCWlmIChNYWluLnRoaXMuc2hvd1Byb2dyZXNzICYmIHRoaXMubGluZURlbHRhID4gMjAwMCkgewogCQkJCQkvLyBpbiAtbG9nIG1vZGUsIGR1bXAgYSBkb3QgZXZlcnkgMjAwMCBsaW5lcyBjb21waWxlZApAQCAtMzE3OSwzOCArMjg4NCwxNyBAQAogCQkJfQogCQkJTWFpbi50aGlzLmxvZ2dlci5zdGFydExvZ2dpbmdTb3VyY2UoY29tcGlsYXRpb25SZXN1bHQpOwogCQkJaWYgKGNvbXBpbGF0aW9uUmVzdWx0Lmhhc1Byb2JsZW1zKCkgfHwgY29tcGlsYXRpb25SZXN1bHQuaGFzVGFza3MoKSkgewotCQkJCWludCBsb2NhbEVycm9yQ291bnQgPSBNYWluLnRoaXMubG9nZ2VyLmxvZ1Byb2JsZW1zKGNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCksIGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRDb250ZW50cygpLCBNYWluLnRoaXMpOwotCQkJCS8vIGV4aXQ/Ci0JCQkJaWYgKE1haW4udGhpcy5zeXN0ZW1FeGl0V2hlbkZpbmlzaGVkICYmICFNYWluLnRoaXMucHJvY2VlZE9uRXJyb3IgJiYgKGxvY2FsRXJyb3JDb3VudCA+IDApKSB7Ci0JCQkJCS8vIGVuc3VyZSBkdW1waW5nIHByb2JsZW1zIGZvciBlbnF1ZXVlZCB1bml0cyBhcyB3ZWxsLCBzaW5jZSBtYXkgY29udGFpbiBwcmltYXJ5IGVycm9ycyAoMTIzNDc2KQotCQkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHF1ZXVlZFVuaXRzID0gTWFpbi50aGlzLmJhdGNoQ29tcGlsZXIudW5pdHNUb1Byb2Nlc3M7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBNYWluLnRoaXMuYmF0Y2hDb21waWxlci50b3RhbFVuaXRzOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHF1ZXVlZFVuaXQgPSBxdWV1ZWRVbml0c1tpXTsKLQkJCQkJCWlmIChxdWV1ZWRVbml0ID09IG51bGwpIGNvbnRpbnVlOwotCQkJCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gcXVldWVkVW5pdC5jb21waWxhdGlvblJlc3VsdDsKLQkJCQkJCWlmIChyZXN1bHQuaGFzUHJvYmxlbXMoKSAmJiAhcmVzdWx0Lmhhc0JlZW5BY2NlcHRlZCkgewotCQkJCQkJCU1haW4udGhpcy5sb2dnZXIubG9nUHJvYmxlbXMocmVzdWx0LmdldEFsbFByb2JsZW1zKCksIHJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSwgTWFpbi50aGlzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlNYWluLnRoaXMubG9nZ2VyLmVuZExvZ2dpbmdTb3VyY2UoKTsKLQkJCQkJTWFpbi50aGlzLmxvZ2dlci5lbmRMb2dnaW5nU291cmNlcygpOwotCQkJCQlNYWluLnRoaXMubG9nZ2VyLnByaW50U3RhdHMoKTsKLQkJCQkJTWFpbi50aGlzLmxvZ2dlci5mbHVzaCgpOwotCQkJCQlNYWluLnRoaXMubG9nZ2VyLmNsb3NlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KC0xKTsKLQkJCQl9CisJCQkJTWFpbi50aGlzLmxvZ2dlci5sb2dQcm9ibGVtcyhjb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpLCBjb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSwgTWFpbi50aGlzKTsKIAkJCX0KIAkJCW91dHB1dENsYXNzRmlsZXMoY29tcGlsYXRpb25SZXN1bHQpOwogCQkJTWFpbi50aGlzLmxvZ2dlci5lbmRMb2dnaW5nU291cmNlKCk7CiAJCX0KIAl9OwogfQotCiAvKgogICogIEJ1aWxkIHRoZSBzZXQgb2YgY29tcGlsYXRpb24gc291cmNlIHVuaXRzCiAgKi8KLXB1YmxpYyBDb21waWxhdGlvblVuaXRbXSBnZXRDb21waWxhdGlvblVuaXRzKCkKLQl0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKK3B1YmxpYyBDb21waWxhdGlvblVuaXRbXSBnZXRDb21waWxhdGlvblVuaXRzKCkgewogCWludCBmaWxlQ291bnQgPSB0aGlzLmZpbGVuYW1lcy5sZW5ndGg7CiAJQ29tcGlsYXRpb25Vbml0W10gdW5pdHMgPSBuZXcgQ29tcGlsYXRpb25Vbml0W2ZpbGVDb3VudF07CiAJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25GaWxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoZmlsZUNvdW50KTsKQEAgLTMyMjIsMTEgKzI5MDYsMTEgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7CiAJCWNoYXJbXSBjaGFyTmFtZSA9IHRoaXMuZmlsZW5hbWVzW2ldLnRvQ2hhckFycmF5KCk7CiAJCWlmIChrbm93bkZpbGVOYW1lcy5nZXQoY2hhck5hbWUpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgidW5pdC5tb3JlIiwgdGhpcy5maWxlbmFtZXNbaV0pKTsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoInVuaXQubW9yZSIsIHRoaXMuZmlsZW5hbWVzW2ldKSk7IC8vJE5PTi1OTFMtMSQKIAkJa25vd25GaWxlTmFtZXMucHV0KGNoYXJOYW1lLCBjaGFyTmFtZSk7CiAJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZmlsZW5hbWVzW2ldKTsKIAkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoInVuaXQubWlzc2luZyIsIHRoaXMuZmlsZW5hbWVzW2ldKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJ1bml0Lm1pc3NpbmciLCB0aGlzLmZpbGVuYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCiAJCVN0cmluZyBlbmNvZGluZyA9IHRoaXMuZW5jb2RpbmdzW2ldOwogCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKIAkJCWVuY29kaW5nID0gZGVmYXVsdEVuY29kaW5nOwpAQCAtMzI1MSwxOCArMjkzNSwxNCBAQAogCQl9CiAJfTsKIH0KKwogLyoKICAqIEV4dGVybmFsIEFQSQogICovCiBwdWJsaWMgRmlsZSBnZXRKYXZhSG9tZSgpIHsKLQlpZiAoIWphdmFIb21lQ2hlY2tlZCkgewotCQlqYXZhSG9tZUNoZWNrZWQgPSB0cnVlOwotCQlTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGphdmFIb21lICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YUhvbWVDYWNoZSA9IG5ldyBGaWxlKGphdmFIb21lKTsKLQkJCWlmICghdGhpcy5qYXZhSG9tZUNhY2hlLmV4aXN0cygpKQotCQkJCXRoaXMuamF2YUhvbWVDYWNoZSA9IG51bGw7Ci0JCX0KKwlpZiAoIXRoaXMuamF2YUhvbWVDaGVja2VkKSB7CisJCXRoaXMuamF2YUhvbWVDaGVja2VkID0gdHJ1ZTsKKwkJdGhpcy5qYXZhSG9tZUNhY2hlID0gVXRpbC5nZXRKYXZhSG9tZSgpOwogCX0KIAlyZXR1cm4gdGhpcy5qYXZhSG9tZUNhY2hlOwogfQpAQCAtMzI3NywyNCArMjk1Nyw2NjEgQEAKIHB1YmxpYyBJUHJvYmxlbUZhY3RvcnkgZ2V0UHJvYmxlbUZhY3RvcnkoKSB7CiAJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkodGhpcy5jb21waWxlckxvY2FsZSk7CiB9CisKIC8qCiAgKiBFeHRlcm5hbCBBUEkKICAqLwotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcmludFdyaXRlciBvdXRXcml0ZXIsCi0JCVByaW50V3JpdGVyIGVycldyaXRlciwKLQkJYm9vbGVhbiBzeXN0ZW1FeGl0KSB7Ci0JdGhpcy5pbml0aWFsaXplKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0LCBudWxsKTsKK3Byb3RlY3RlZCBBcnJheUxpc3QgaGFuZGxlQm9vdGNsYXNzcGF0aChBcnJheUxpc3QgYm9vdGNsYXNzcGF0aHMsIFN0cmluZyBjdXN0b21FbmNvZGluZykgeworIAlmaW5hbCBpbnQgYm9vdGNsYXNzcGF0aHNTaXplOworCWlmICgoYm9vdGNsYXNzcGF0aHMgIT0gbnVsbCkKKwkJJiYgKChib290Y2xhc3NwYXRoc1NpemUgPSBib290Y2xhc3NwYXRocy5zaXplKCkpICE9IDApKQorCXsKKwkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2Jvb3RjbGFzc3BhdGhzU2l6ZV07CisJCWJvb3RjbGFzc3BhdGhzLnRvQXJyYXkocGF0aHMpOworCQlib290Y2xhc3NwYXRocy5jbGVhcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGJvb3RjbGFzc3BhdGhzU2l6ZTsgaSsrKSB7CisJCQlwcm9jZXNzUGF0aEVudHJpZXMoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCwgYm9vdGNsYXNzcGF0aHMsCisJCQkJcGF0aHNbaV0sIGN1c3RvbUVuY29kaW5nLCBmYWxzZSwgdHJ1ZSk7CisJCX0KKwl9IGVsc2UgeworCQlib290Y2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7CisJCXRyeSB7CisJCQlVdGlsLmNvbGxlY3RSdW5uaW5nVk1Cb290Y2xhc3NwYXRoKGJvb3RjbGFzc3BhdGhzKTsKKwkJfSBjYXRjaChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworCQkJdGhpcy5sb2dnZXIubG9nV3JvbmdKREsoKTsKKwkJCXRoaXMucHJvY2VlZCA9IGZhbHNlOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJcmV0dXJuIGJvb3RjbGFzc3BhdGhzOwogfQotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcmludFdyaXRlciBvdXRXcml0ZXIsCi0JCVByaW50V3JpdGVyIGVycldyaXRlciwKLQkJYm9vbGVhbiBzeXN0ZW1FeGl0LAotCQlNYXAgY3VzdG9tRGVmYXVsdE9wdGlvbnMpIHsKKworLyoKKyAqIEV4dGVybmFsIEFQSQorICovCitwcm90ZWN0ZWQgQXJyYXlMaXN0IGhhbmRsZUNsYXNzcGF0aChBcnJheUxpc3QgY2xhc3NwYXRocywgU3RyaW5nIGN1c3RvbUVuY29kaW5nKSB7CisJZmluYWwgaW50IGNsYXNzcGF0aHNTaXplOworCWlmICgoY2xhc3NwYXRocyAhPSBudWxsKQorCQkmJiAoKGNsYXNzcGF0aHNTaXplID0gY2xhc3NwYXRocy5zaXplKCkpICE9IDApKQorCXsKKwkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2NsYXNzcGF0aHNTaXplXTsKKwkJY2xhc3NwYXRocy50b0FycmF5KHBhdGhzKTsKKwkJY2xhc3NwYXRocy5jbGVhcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aHNTaXplOyBpKyspIHsKKwkJCXByb2Nlc3NQYXRoRW50cmllcyhERUZBVUxUX1NJWkVfQ0xBU1NQQVRILCBjbGFzc3BhdGhzLCBwYXRoc1tpXSwKKwkJCQkJY3VzdG9tRW5jb2RpbmcsIGZhbHNlLCB0cnVlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIG5vIHVzZXIgY2xhc3NwYXRoIHNwZWNpZmllZC4KKwkJY2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7CisJCVN0cmluZyBjbGFzc1Byb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOyAvLyROT04tTkxTLTEkCisJCWlmICgoY2xhc3NQcm9wID09IG51bGwpIHx8IChjbGFzc1Byb3AubGVuZ3RoKCkgPT0gMCkpIHsKKwkJCWFkZFBlbmRpbmdFcnJvcnModGhpcy5iaW5kKCJjb25maWd1cmUubm9DbGFzc3BhdGgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIENsYXNzcGF0aCBjbGFzc3BhdGggPSBGaWxlU3lzdGVtLmdldENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksIGN1c3RvbUVuY29kaW5nLCBudWxsKTsvLyROT04tTkxTLTEkCisJCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQljbGFzc3BhdGhzLmFkZChjbGFzc3BhdGgpOworCQkJfQorCQl9IGVsc2UgeworCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQcm9wLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworCQkJU3RyaW5nIHRva2VuOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjdXJyZW50Q2xhc3NwYXRoID0gRmlsZVN5c3RlbQorCQkJCQkJLmdldENsYXNzcGF0aCh0b2tlbiwgY3VzdG9tRW5jb2RpbmcsIG51bGwpOworCQkJCWlmIChjdXJyZW50Q2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQkJY2xhc3NwYXRocy5hZGQoY3VycmVudENsYXNzcGF0aCk7CisJCQkJfSBlbHNlIGlmICh0b2tlbi5sZW5ndGgoKSAhPSAwKSB7CisJCQkJCWFkZFBlbmRpbmdFcnJvcnModGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0Q2xhc3NwYXRoIiwgdG9rZW4pKTsvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9CisJfQorCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJSGFzaE1hcCBrbm93bk5hbWVzID0gbmV3IEhhc2hNYXAoKTsKKwlGaWxlU3lzdGVtLkNsYXNzcGF0aFNlY3Rpb25Qcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0KKwkJbmV3IEZpbGVTeXN0ZW0uQ2xhc3NwYXRoU2VjdGlvblByb2JsZW1SZXBvcnRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGludmFsaWRDbGFzc3BhdGhTZWN0aW9uKFN0cmluZyBqYXJGaWxlUGF0aCkgeworCQkJCWFkZFBlbmRpbmdFcnJvcnMoYmluZCgiY29uZmlndXJlLmludmFsaWRDbGFzc3BhdGhTZWN0aW9uIiwgamFyRmlsZVBhdGgpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcHVibGljIHZvaWQgbXVsdGlwbGVDbGFzc3BhdGhTZWN0aW9ucyhTdHJpbmcgamFyRmlsZVBhdGgpIHsKKwkJCQlhZGRQZW5kaW5nRXJyb3JzKGJpbmQoImNvbmZpZ3VyZS5tdWx0aXBsZUNsYXNzcGF0aFNlY3Rpb25zIiwgamFyRmlsZVBhdGgpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCXdoaWxlICghIGNsYXNzcGF0aHMuaXNFbXB0eSgpKSB7CisJCUNsYXNzcGF0aCBjdXJyZW50ID0gKENsYXNzcGF0aCkgY2xhc3NwYXRocy5yZW1vdmUoMCk7CisJCVN0cmluZyBjdXJyZW50UGF0aCA9IGN1cnJlbnQuZ2V0UGF0aCgpOworCQlpZiAoa25vd25OYW1lcy5nZXQoY3VycmVudFBhdGgpID09IG51bGwpIHsKKwkJCWtub3duTmFtZXMucHV0KGN1cnJlbnRQYXRoLCBjdXJyZW50KTsKKwkJCXJlc3VsdC5hZGQoY3VycmVudCk7CisJCQlMaXN0IGxpbmtlZEphcnMgPSBjdXJyZW50LmZldGNoTGlua2VkSmFycyhwcm9ibGVtUmVwb3J0ZXIpOworCQkJaWYgKGxpbmtlZEphcnMgIT0gbnVsbCkgeworCQkJCWNsYXNzcGF0aHMuYWRkQWxsKDAsIGxpbmtlZEphcnMpOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKgorICogRXh0ZXJuYWwgQVBJCisgKi8KK3Byb3RlY3RlZCBBcnJheUxpc3QgaGFuZGxlRW5kb3JzZWRkaXJzKEFycmF5TGlzdCBlbmRvcnNlZERpckNsYXNzcGF0aHMpIHsKKyAJZmluYWwgRmlsZSBqYXZhSG9tZSA9IGdldEphdmFIb21lKCk7CisJLyoKKwkgKiBGZWVkIGVuZG9yc2VkRGlyQ2xhc3NwYXRoIGFjY29yZGluZyB0bzoKKwkgKiAtIC1lbmRvcnNlZGRpcnMgZmlyc3QgaWYgcHJlc2VudDsKKwkgKiAtIGVsc2UgamF2YS5lbmRvcnNlZC5kaXJzIGlmIGRlZmluZWQ7CisJICogLSBlbHNlIGRlZmF1bHQgZXh0ZW5zaW9ucyBkaXJlY3RvcnkgZm9yIHRoZSBwbGF0Zm9ybS4gKC9saWIvZW5kb3JzZWQpCisJICovCisJaWYgKGVuZG9yc2VkRGlyQ2xhc3NwYXRocyA9PSBudWxsKSB7CisJCWVuZG9yc2VkRGlyQ2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoREVGQVVMVF9TSVpFX0NMQVNTUEFUSCk7CisJCVN0cmluZyBlbmRvcnNlZERpcnNTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZW5kb3JzZWQuZGlycyIpOyAvLyROT04tTkxTLTEkCisJCWlmIChlbmRvcnNlZERpcnNTdHIgPT0gbnVsbCkgeworCQkJaWYgKGphdmFIb21lICE9IG51bGwpIHsKKwkJCQllbmRvcnNlZERpckNsYXNzcGF0aHMuYWRkKGphdmFIb21lLmdldEFic29sdXRlUGF0aCgpICsgIi9saWIvZW5kb3JzZWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGVsc2UgeworCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZW5kb3JzZWREaXJzU3RyLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQllbmRvcnNlZERpckNsYXNzcGF0aHMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEZlZWQgZXh0ZGlyc0NsYXNzcGF0aCB3aXRoIHRoZSBlbnRyaWVzIGZvdW5kIGludG8gdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBieQorCSAqIGV4dGRpcnNOYW1lcy4KKwkgKi8KKwlpZiAoZW5kb3JzZWREaXJDbGFzc3BhdGhzLnNpemUoKSAhPSAwKSB7CisJCUZpbGVbXSBkaXJlY3Rvcmllc1RvQ2hlY2sgPSBuZXcgRmlsZVtlbmRvcnNlZERpckNsYXNzcGF0aHMuc2l6ZSgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rvcmllc1RvQ2hlY2subGVuZ3RoOyBpKyspCisJCQlkaXJlY3Rvcmllc1RvQ2hlY2tbaV0gPSBuZXcgRmlsZSgoU3RyaW5nKSBlbmRvcnNlZERpckNsYXNzcGF0aHMuZ2V0KGkpKTsKKwkJZW5kb3JzZWREaXJDbGFzc3BhdGhzLmNsZWFyKCk7CisJCUZpbGVbXVtdIGVuZG9yc2VkRGlyc0phcnMgPSBnZXRMaWJyYXJpZXNGaWxlcyhkaXJlY3Rvcmllc1RvQ2hlY2spOworCQlpZiAoZW5kb3JzZWREaXJzSmFycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW5kb3JzZWREaXJzSmFycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpbGVbXSBjdXJyZW50ID0gZW5kb3JzZWREaXJzSmFyc1tpXTsKKwkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7CisJCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gY3VycmVudC5sZW5ndGg7IGogPCBtYXgyOyBqKyspIHsKKwkJCQkJCUZpbGVTeXN0ZW0uQ2xhc3NwYXRoIGNsYXNzcGF0aCA9CisJCQkJCQkJRmlsZVN5c3RlbS5nZXRDbGFzc3BhdGgoCisJCQkJCQkJCQljdXJyZW50W2pdLmdldEFic29sdXRlUGF0aCgpLAorCQkJCQkJCQkJbnVsbCwgbnVsbCk7CisJCQkJCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQkJCQllbmRvcnNlZERpckNsYXNzcGF0aHMuYWRkKGNsYXNzcGF0aCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGRpcmVjdG9yaWVzVG9DaGVja1tpXS5pc0ZpbGUoKSkgeworCQkJCQlhZGRQZW5kaW5nRXJyb3JzKAorCQkJCQkJdGhpcy5iaW5kKAorCQkJCQkJCSJjb25maWd1cmUuaW5jb3JyZWN0RW5kb3JzZWREaXJzRW50cnkiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJZGlyZWN0b3JpZXNUb0NoZWNrW2ldLmdldEFic29sdXRlUGF0aCgpKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBlbmRvcnNlZERpckNsYXNzcGF0aHM7Cit9CisKKy8qCisgKiBFeHRlcm5hbCBBUEkKKyAqIEhhbmRsZSBleHRkaXJzIHByb2Nlc3NpbmcKKyAqLworcHJvdGVjdGVkIEFycmF5TGlzdCBoYW5kbGVFeHRkaXJzKEFycmF5TGlzdCBleHRkaXJzQ2xhc3NwYXRocykgeworIAlmaW5hbCBGaWxlIGphdmFIb21lID0gZ2V0SmF2YUhvbWUoKTsKKworCS8qCisJICogRmVlZCBleHREaXJDbGFzc3BhdGggYWNjb3JkaW5nIHRvOgorCSAqIC0gLWV4dGRpcnMgZmlyc3QgaWYgcHJlc2VudDsKKwkgKiAtIGVsc2UgamF2YS5leHQuZGlycyBpZiBkZWZpbmVkOworCSAqIC0gZWxzZSBkZWZhdWx0IGV4dGVuc2lvbnMgZGlyZWN0b3J5IGZvciB0aGUgcGxhdGZvcm0uCisJICovCisJaWYgKGV4dGRpcnNDbGFzc3BhdGhzID09IG51bGwpIHsKKwkJZXh0ZGlyc0NsYXNzcGF0aHMgPSBuZXcgQXJyYXlMaXN0KERFRkFVTFRfU0laRV9DTEFTU1BBVEgpOworCQlTdHJpbmcgZXh0ZGlyc1N0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5leHQuZGlycyIpOyAvLyROT04tTkxTLTEkCisJCWlmIChleHRkaXJzU3RyID09IG51bGwpIHsKKwkJCWV4dGRpcnNDbGFzc3BhdGhzLmFkZChqYXZhSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvbGliL2V4dCIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRkaXJzU3RyLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCisJCQkJZXh0ZGlyc0NsYXNzcGF0aHMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEZlZWQgZXh0ZGlyc0NsYXNzcGF0aCB3aXRoIHRoZSBlbnRyaWVzIGZvdW5kIGludG8gdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBieQorCSAqIGV4dGRpcnNOYW1lcy4KKwkgKi8KKwlpZiAoZXh0ZGlyc0NsYXNzcGF0aHMuc2l6ZSgpICE9IDApIHsKKwkJRmlsZVtdIGRpcmVjdG9yaWVzVG9DaGVjayA9IG5ldyBGaWxlW2V4dGRpcnNDbGFzc3BhdGhzLnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3JpZXNUb0NoZWNrLmxlbmd0aDsgaSsrKQorCQkJZGlyZWN0b3JpZXNUb0NoZWNrW2ldID0gbmV3IEZpbGUoKFN0cmluZykgZXh0ZGlyc0NsYXNzcGF0aHMuZ2V0KGkpKTsKKwkJZXh0ZGlyc0NsYXNzcGF0aHMuY2xlYXIoKTsKKwkJRmlsZVtdW10gZXh0ZGlyc0phcnMgPSBnZXRMaWJyYXJpZXNGaWxlcyhkaXJlY3Rvcmllc1RvQ2hlY2spOworCQlpZiAoZXh0ZGlyc0phcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGV4dGRpcnNKYXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJRmlsZVtdIGN1cnJlbnQgPSBleHRkaXJzSmFyc1tpXTsKKwkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7CisJCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gY3VycmVudC5sZW5ndGg7IGogPCBtYXgyOyBqKyspIHsKKwkJCQkJCUZpbGVTeXN0ZW0uQ2xhc3NwYXRoIGNsYXNzcGF0aCA9CisJCQkJCQkJRmlsZVN5c3RlbS5nZXRDbGFzc3BhdGgoCisJCQkJCQkJCQljdXJyZW50W2pdLmdldEFic29sdXRlUGF0aCgpLAorCQkJCQkJCQkJbnVsbCwgbnVsbCk7CisJCQkJCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQkJCQlleHRkaXJzQ2xhc3NwYXRocy5hZGQoY2xhc3NwYXRoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZGlyZWN0b3JpZXNUb0NoZWNrW2ldLmlzRmlsZSgpKSB7CisJCQkJCWFkZFBlbmRpbmdFcnJvcnModGhpcy5iaW5kKAorCQkJCQkJCSJjb25maWd1cmUuaW5jb3JyZWN0RXh0RGlyc0VudHJ5IiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWRpcmVjdG9yaWVzVG9DaGVja1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBleHRkaXJzQ2xhc3NwYXRoczsKK30KKworLyoKKyAqIEV4dGVybmFsIEFQSQorICogSGFuZGxlIGEgc2luZ2xlIHdhcm5pbmcgdG9rZW4uCisqLworcHJvdGVjdGVkIHZvaWQgaGFuZGxlV2FybmluZ1Rva2VuKFN0cmluZyB0b2tlbiwgYm9vbGVhbiBpc0VuYWJsaW5nKSB7CisJaGFuZGxlRXJyb3JPcldhcm5pbmdUb2tlbih0b2tlbiwgaXNFbmFibGluZywgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZyk7Cit9Citwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvclRva2VuKFN0cmluZyB0b2tlbiwgYm9vbGVhbiBpc0VuYWJsaW5nKSB7CisJaGFuZGxlRXJyb3JPcldhcm5pbmdUb2tlbih0b2tlbiwgaXNFbmFibGluZywgUHJvYmxlbVNldmVyaXRpZXMuRXJyb3IpOworfQorcHJpdmF0ZSB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBjb21waWxlck9wdGlvbnMsIGludCBzZXZlcml0eSwgYm9vbGVhbiBpc0VuYWJsaW5nKSB7CisJaWYgKGlzRW5hYmxpbmcpIHsKKwkJc3dpdGNoKHNldmVyaXR5KSB7CisJCQljYXNlIFByb2JsZW1TZXZlcml0aWVzLkVycm9yIDoKKwkJCQl0aGlzLm9wdGlvbnMucHV0KGNvbXBpbGVyT3B0aW9ucywgQ29tcGlsZXJPcHRpb25zLkVSUk9SKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZyA6CisJCQkJdGhpcy5vcHRpb25zLnB1dChjb21waWxlck9wdGlvbnMsIENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdGhpcy5vcHRpb25zLnB1dChjb21waWxlck9wdGlvbnMsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoKHNldmVyaXR5KSB7CisJCQljYXNlIFByb2JsZW1TZXZlcml0aWVzLkVycm9yIDoKKwkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgdGhpcy5vcHRpb25zLmdldChjb21waWxlck9wdGlvbnMpOworCQkJCWlmIChDb21waWxlck9wdGlvbnMuRVJST1IuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpIHsKKwkJCQkJdGhpcy5vcHRpb25zLnB1dChjb21waWxlck9wdGlvbnMsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZyA6CisJCQkJY3VycmVudFZhbHVlID0gKFN0cmluZykgdGhpcy5vcHRpb25zLmdldChjb21waWxlck9wdGlvbnMpOworCQkJCWlmIChDb21waWxlck9wdGlvbnMuV0FSTklORy5lcXVhbHMoY3VycmVudFZhbHVlKSkgeworCQkJCQl0aGlzLm9wdGlvbnMucHV0KGNvbXBpbGVyT3B0aW9ucywgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aGlzLm9wdGlvbnMucHV0KGNvbXBpbGVyT3B0aW9ucywgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCX0KKwl9Cit9Citwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3JPcldhcm5pbmdUb2tlbihTdHJpbmcgdG9rZW4sIGJvb2xlYW4gaXNFbmFibGluZywgaW50IHNldmVyaXR5KSB7CisJaWYgKHRva2VuLmxlbmd0aCgpID09IDApIHJldHVybjsKKwlzd2l0Y2godG9rZW4uY2hhckF0KDApKSB7CisJCWNhc2UgJ2EnIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoImFsbERlcHJlY2F0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwKKwkJCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kLAorCQkJCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQgOiBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJhbGxKYXZhZG9jIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMud2FybkFsbEphdmFkb2NPbiA9IHRoaXMud2FybkphdmFkb2NPbiA9IGlzRW5hYmxpbmc7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvYywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImFzc2VydElkZW50aWZpZXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRBc3NlcnRJZGVudGlmaWVyLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImFsbERlYWRDb2RlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVhZENvZGUsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlYWRDb2RlSW5Ucml2aWFsSWZTdGF0ZW1lbnQsCisJCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuRU5BQkxFRCA6IENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImFsbE92ZXItYW5uIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uLAorCQkJCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQgOiBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJhbGwtc3RhdGljLW1ldGhvZCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlU3RhdGljLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2InIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoImJveGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEF1dG9ib3hpbmcsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYycgOgorCQkJaWYgKHRva2VuLmVxdWFscygiY29uc3RydWN0b3JOYW1lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJjb25kaXRpb25Bc3NpZ24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRQb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJjb21wYXJlSWRlbnRpY2FsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Q29tcGFyaW5nSWRlbnRpY2FsLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImNoYXJDb25jYXQiKSAvKnx8IHRva2VuLmVxdWFscygibm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24iKS8qYmFja3dhcmQgY29tcGF0aWJsZSovKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnZCcgOgorCQkJaWYgKHRva2VuLmVxdWFscygiZGVwcmVjYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLAorCQkJCQlDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImRlcC1hbm4iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZGlzY291cmFnZWQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREaXNjb3VyYWdlZFJlZmVyZW5jZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJkZWFkQ29kZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlYWRDb2RlLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50LAorCQkJCQlDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdlJyA6CisJCQlpZiAodG9rZW4uZXF1YWxzKCJlbnVtU3dpdGNoIikgLy8kTk9OLU5MUy0xJAorCQkJCQl8fCB0b2tlbi5lcXVhbHMoImluY29tcGxldGUtc3dpdGNoIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW5jb21wbGV0ZUVudW1Td2l0Y2gsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZW1wdHlCbG9jayIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5kb2N1bWVudGVkRW1wdHlCbG9jaywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJlbnVtSWRlbnRpZmllciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEVudW1JZGVudGlmaWVyLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2YnIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoImZpZWxkSGlkaW5nIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RmllbGRIaWRpbmcsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZmluYWxCb3VuZCIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RmluYWxQYXJhbWV0ZXJCb3VuZCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJmaW5hbGx5IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5LCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImZvcmJpZGRlbiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZvcmJpZGRlblJlZmVyZW5jZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJmYWxsdGhyb3VnaCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZhbGx0aHJvdWdoQ2FzZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdoJyA6CisJCQlpZiAodG9rZW4uZXF1YWxzKCJoaWRpbmciKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRMb2NhbFZhcmlhYmxlSGlkaW5nLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRGaWVsZEhpZGluZywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VHlwZVBhcmFtZXRlckhpZGluZywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJoYXNoQ29kZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdIYXNoQ29kZU1ldGhvZCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdpJyA6CisJCQlpZiAodG9rZW4uZXF1YWxzKCJpbmRpcmVjdFN0YXRpYyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImludGZOb25Jbmhlcml0ZWQiKSB8fCB0b2tlbi5lcXVhbHMoImludGVyZmFjZU5vbkluaGVyaXRlZCIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiaW50ZkFubm90YXRpb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiaW50ZlJlZHVuZGFudCIpIC8qfHwgdG9rZW4uZXF1YWxzKCJyZWR1bmRhbnRTdXBlcmludGVyZmFjZSIpKi8pIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UmVkdW5kYW50U3VwZXJpbnRlcmZhY2UsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiaW5jbHVkZUFzc2VydE51bGwiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fSW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMsCisJCQkJCQlpc0VuYWJsaW5nID8gQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQgOiBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCXJldHVybjsKKwkJCX0gCisJCQlicmVhazsKKwkJY2FzZSAnaicgOgorCQkJaWYgKHRva2VuLmVxdWFscygiamF2YWRvYyIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXRoaXMud2FybkphdmFkb2NPbiA9IGlzRW5hYmxpbmc7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvYywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2wnIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoImxvY2FsSGlkaW5nIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TG9jYWxWYXJpYWJsZUhpZGluZywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdtJyA6CisJCQlpZiAodG9rZW4uZXF1YWxzKCJtYXNrZWRDYXRjaEJsb2NrIikgfHwgdG9rZW4uZXF1YWxzKCJtYXNrZWRDYXRjaEJsb2NrcyIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ24nIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoIm5scyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibm9FZmZlY3RBc3NpZ24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0VmZmVjdEFzc2lnbm1lbnQsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKC8qdG9rZW4uZXF1YWxzKCJjaGFyQ29uY2F0IikgfHwqLyB0b2tlbi5lcXVhbHMoIm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgey8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIm51bGwiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROdWxsUmVmZXJlbmNlLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRQb3RlbnRpYWxOdWxsUmVmZXJlbmNlLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRSZWR1bmRhbnROdWxsQ2hlY2ssIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibnVsbERlcmVmZXJlbmNlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TnVsbFJlZmVyZW5jZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCWlmICghaXNFbmFibGluZykgeworCQkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFBvdGVudGlhbE51bGxSZWZlcmVuY2UsIFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSwgaXNFbmFibGluZyk7CisJCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UmVkdW5kYW50TnVsbENoZWNrLCBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUsIGlzRW5hYmxpbmcpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbycgOgorCQkJaWYgKHRva2VuLmVxdWFscygib3Zlci1zeW5jIikgLyp8fCB0b2tlbi5lcXVhbHMoInN5bmNPdmVycmlkZSIpKi8pIHsgLy8kTk9OLU5MUy0xJCAKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJvdmVyLWFubiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbiwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncCcgOgorCQkJaWYgKHRva2VuLmVxdWFscygicGtnRGVmYXVsdE1ldGhvZCIpIHx8IHRva2VuLmVxdWFscygicGFja2FnZURlZmF1bHRNZXRob2QiKS8qYmFja3dhcmQgY29tcGF0aWJsZSovICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJwYXJhbUFzc2lnbiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFBhcmFtZXRlckFzc2lnbm1lbnQsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncicgOgorCQkJaWYgKHRva2VuLmVxdWFscygicmF3IikpIHsvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRSYXdUeXBlUmVmZXJlbmNlLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICgvKnRva2VuLmVxdWFscygiaW50ZlJlZHVuZGFudCIpIHx8Ki8gdG9rZW4uZXF1YWxzKCJyZWR1bmRhbnRTdXBlcmludGVyZmFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFJlZHVuZGFudFN1cGVyaW50ZXJmYWNlLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3MnIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoInNwZWNpYWxQYXJhbUhpZGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLm9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCwKKwkJCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3ludGhldGljQWNjZXNzIikgfHwgdG9rZW4uZXF1YWxzKCJzeW50aGV0aWMtYWNjZXNzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3RhdGljUmVjZWl2ZXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb25TdGF0aWNBY2Nlc3NUb1N0YXRpYywgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSAJaWYgKC8qdG9rZW4uZXF1YWxzKCJvdmVyLXN5bmMiKSB8fCovIHRva2VuLmVxdWFscygic3luY092ZXJyaWRlIikpIHsgLy8kTk9OLU5MUy0xJCAKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzZW1pY29sb24iKSkgey8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEVtcHR5U3RhdGVtZW50LCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInNlcmlhbCIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ1NlcmlhbFZlcnNpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3VwcHJlc3MiKSkgey8vJE5PTi1OTFMtMSQKKwkJCQlzd2l0Y2goc2V2ZXJpdHkpIHsKKwkJCQkJY2FzZSBQcm9ibGVtU2V2ZXJpdGllcy5XYXJuaW5nIDoKKwkJCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU3VwcHJlc3NXYXJuaW5ncywKKwkJCQkJCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU3VwcHJlc3NPcHRpb25hbEVycm9ycywKKwkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFByb2JsZW1TZXZlcml0aWVzLkVycm9yIDoKKwkJCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU3VwcHJlc3NXYXJuaW5ncywKKwkJCQkJCQkJaXNFbmFibGluZyA/IENvbXBpbGVyT3B0aW9ucy5FTkFCTEVEIDogQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCQkJCXRoaXMub3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9TdXBwcmVzc09wdGlvbmFsRXJyb3JzLAorCQkJCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuRU5BQkxFRCA6IENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzdGF0aWMtYWNjZXNzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uU3RhdGljQWNjZXNzVG9TdGF0aWMsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInN1cGVyIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3RhdGljLW1ldGhvZCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlU3RhdGljLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3QnIDoKKwkJCWlmICh0b2tlbi5zdGFydHNXaXRoKCJ0YXNrcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgdGFza1RhZ3MgPSBVdGlsLkVNUFRZX1NUUklORzsKKwkJCQlpbnQgc3RhcnQgPSB0b2tlbi5pbmRleE9mKCcoJyk7CisJCQkJaW50IGVuZCA9IHRva2VuLmluZGV4T2YoJyknKTsKKwkJCQlpZiAoc3RhcnQgPj0gMCAmJiBlbmQgPj0gMCAmJiBzdGFydCA8IGVuZCl7CisJCQkJCXRhc2tUYWdzID0gdG9rZW4uc3Vic3RyaW5nKHN0YXJ0KzEsIGVuZCkudHJpbSgpOworCQkJCQl0YXNrVGFncyA9IHRhc2tUYWdzLnJlcGxhY2UoJ3wnLCcsJyk7CisJCQkJfQorCQkJCWlmICh0YXNrVGFncy5sZW5ndGgoKSA9PSAwKXsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkVGFza1RhZyIsIHRva2VuKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXNrVGFncywKKwkJCQkJaXNFbmFibGluZyA/IHRhc2tUYWdzIDogVXRpbC5FTVBUWV9TVFJJTkcpOworCQkJCQorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VGFza3MsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidHlwZUhpZGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFR5cGVQYXJhbWV0ZXJIaWRpbmcsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndScgOgorCQkJaWYgKHRva2VuLmVxdWFscygidW51c2VkTG9jYWwiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZExvY2FscyIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRBcmd1bWVudCIpIHx8IHRva2VuLmVxdWFscygidW51c2VkQXJndW1lbnRzIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRJbXBvcnQiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZEltcG9ydHMiKS8qYmFja3dhcmQgY29tcGF0aWJsZSovKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0LCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZEFsbG9jYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRPYmplY3RBbGxvY2F0aW9uLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZFByaXZhdGUiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZExhYmVsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTGFiZWwsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidXNlbGVzc1R5cGVDaGVjayIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5uZWNlc3NhcnlUeXBlQ2hlY2ssIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW5jaGVja2VkIikgfHwgdG9rZW4uZXF1YWxzKCJ1bnNhZmUiKSkgey8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5jaGVja2VkVHlwZU9wZXJhdGlvbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bm5lY2Vzc2FyeUVsc2UiKSkgey8vJE5PTi1OTFMtMSQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5RWxzZSwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRUaHJvd24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnF1YWxpZmllZEZpZWxkIikgfHwgdG9rZW4uZXF1YWxzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVucXVhbGlmaWVkRmllbGRBY2Nlc3MsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0LCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTGFiZWwsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRSZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzLCBzZXZlcml0eSwgaXNFbmFibGluZyk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZFR5cGVBcmdzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkVHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb24sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW5hdm9pZGFibGVHZW5lcmljUHJvYmxlbXMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMsCisJCQkJCWlzRW5hYmxpbmcgPyBDb21waWxlck9wdGlvbnMuRU5BQkxFRCA6IENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3YnIDoKKwkJCWlmICh0b2tlbi5lcXVhbHMoInZhcmFyZ3NDYXN0IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VmFyYXJnc0FyZ3VtZW50TmVlZENhc3QsIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndycgOgorCQkJaWYgKHRva2VuLmVxdWFscygid2FybmluZ1Rva2VuIikpIHsvLyROT04tTkxTLTEkCisJCQkJc2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW4sIHNldmVyaXR5LCBpc0VuYWJsaW5nKTsKKwkJCQlzZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFdhcm5pbmdUb2tlbiwgc2V2ZXJpdHksIGlzRW5hYmxpbmcpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJc3dpdGNoKHNldmVyaXR5KSB7CisJCWNhc2UgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZyA6CisJCQltZXNzYWdlID0gdGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmciLCB0b2tlbik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFByb2JsZW1TZXZlcml0aWVzLkVycm9yIDoKKwkJCW1lc3NhZ2UgPSB0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkRXJyb3IiLCB0b2tlbik7IC8vJE5PTi1OTFMtMSQKKwl9CisJYWRkUGVuZGluZ0Vycm9ycyhtZXNzYWdlKTsKK30KKy8qKgorICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BsaW5rICNpbml0aWFsaXplKFByaW50V3JpdGVyLCBQcmludFdyaXRlciwgYm9vbGVhbiwgTWFwLCBDb21waWxhdGlvblByb2dyZXNzKX0gaW5zdGVhZAorICogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gaW5pdGlhbGl6ZShvdXRXcml0ZXIsIGVycldyaXRlciwgc3lzdGVtRXhpdCwgbnVsbCwgbnVsbCkKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlciwgYm9vbGVhbiBzeXN0ZW1FeGl0KSB7CisJdGhpcy5pbml0aWFsaXplKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0LCBudWxsIC8qIG9wdGlvbnMgKi8sIG51bGwgLyogcHJvZ3Jlc3MgKi8pOworfQorLyoqCisgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgI2luaXRpYWxpemUoUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBib29sZWFuLCBNYXAsIENvbXBpbGF0aW9uUHJvZ3Jlc3MpfSBpbnN0ZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBpbml0aWFsaXplKG91dFdyaXRlciwgZXJyV3JpdGVyLCBzeXN0ZW1FeGl0LCBjdXN0b21EZWZhdWx0T3B0aW9ucywgbnVsbCkKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcmludFdyaXRlciBvdXRXcml0ZXIsIFByaW50V3JpdGVyIGVycldyaXRlciwgYm9vbGVhbiBzeXN0ZW1FeGl0LCBNYXAgY3VzdG9tRGVmYXVsdE9wdGlvbnMpIHsKKwl0aGlzLmluaXRpYWxpemUob3V0V3JpdGVyLCBlcnJXcml0ZXIsIHN5c3RlbUV4aXQsIGN1c3RvbURlZmF1bHRPcHRpb25zLCBudWxsIC8qIHByb2dyZXNzICovKTsKK30KK3Byb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJpbnRXcml0ZXIgb3V0V3JpdGVyLCBQcmludFdyaXRlciBlcnJXcml0ZXIsIGJvb2xlYW4gc3lzdGVtRXhpdCwgTWFwIGN1c3RvbURlZmF1bHRPcHRpb25zLCBDb21waWxhdGlvblByb2dyZXNzIGNvbXBpbGF0aW9uUHJvZ3Jlc3MpIHsKIAl0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcywgb3V0V3JpdGVyLCBlcnJXcml0ZXIpOwogCXRoaXMucHJvY2VlZCA9IHRydWU7CiAJdGhpcy5vdXQgPSBvdXRXcml0ZXI7CiAJdGhpcy5lcnIgPSBlcnJXcml0ZXI7CiAJdGhpcy5zeXN0ZW1FeGl0V2hlbkZpbmlzaGVkID0gc3lzdGVtRXhpdDsKIAl0aGlzLm9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKCkuZ2V0TWFwKCk7CisKKwl0aGlzLnByb2dyZXNzID0gY29tcGlsYXRpb25Qcm9ncmVzczsKIAlpZiAoY3VzdG9tRGVmYXVsdE9wdGlvbnMgIT0gbnVsbCkgewogCQl0aGlzLmRpZFNwZWNpZnlTb3VyY2UgPSBjdXN0b21EZWZhdWx0T3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UpICE9IG51bGw7CiAJCXRoaXMuZGlkU3BlY2lmeVRhcmdldCA9IGN1c3RvbURlZmF1bHRPcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKSAhPSBudWxsOwpAQCAtMzMwOCw2ICszNjI1LDI4IEBACiAJfQogCXRoaXMuY2xhc3NOYW1lcyA9IG51bGw7CiB9Citwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIoKSB7CisJdHJ5IHsKKwkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcHQuZGlzcGF0Y2guQmF0Y2hBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlciIpOyAvLyROT04tTkxTLTEkCisJCUFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIgYW5ub3RhdGlvbk1hbmFnZXIgPSAoQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlcikgYy5uZXdJbnN0YW5jZSgpOworCQlhbm5vdGF0aW9uTWFuYWdlci5jb25maWd1cmUodGhpcywgdGhpcy5leHBhbmRlZENvbW1hbmRMaW5lKTsKKwkJYW5ub3RhdGlvbk1hbmFnZXIuc2V0RXJyKHRoaXMuZXJyKTsKKwkJYW5ub3RhdGlvbk1hbmFnZXIuc2V0T3V0KHRoaXMub3V0KTsKKwkJdGhpcy5iYXRjaENvbXBpbGVyLmFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyID0gYW5ub3RhdGlvbk1hbmFnZXI7CisJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCS8vIGlnbm9yZQorCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQl0aHJvdyBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbigpOworCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQl0aHJvdyBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbigpOworCX0gY2F0Y2goVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvciBlKSB7CisJCS8vIHJlcG9ydCBhIHdhcm5pbmcKKwkJdGhpcy5sb2dnZXIubG9nSW5jb3JyZWN0Vk1WZXJzaW9uRm9yQW5ub3RhdGlvblByb2Nlc3NpbmcoKTsKKwl9Cit9CisKIC8vIER1bXAgY2xhc3NmaWxlcyBvbnRvIGRpc2sgZm9yIGFsbCBjb21waWxhdGlvbiB1bml0cyB0aGF0IHdoZXJlIHN1Y2Nlc3NmdWwKIC8vIGFuZCBkbyBub3QgY2FycnkgYSAtZCBub25lIHNwZWMsIGVpdGhlciBkaXJlY3RseSBvciBpbmhlcml0ZWQgZnJvbSBNYWluLgogcHVibGljIHZvaWQgb3V0cHV0Q2xhc3NGaWxlcyhDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CkBAIC0zMzQ5LDEzICszNjg4LDExIEBACiAJCQkJCQkJCQlTdHJpbmcudmFsdWVPZih0aGlzLmV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIrMSksCiAJCQkJCQkJCQlyZWxhdGl2ZVN0cmluZ05hbWUKIAkJCQkJCQkJfSkpOwotCQkJCQlDbGFzc0ZpbGUud3JpdGVUb0Rpc2soCisJCQkJCVV0aWwud3JpdGVUb0Rpc2soCiAJCQkJCQlnZW5lcmF0ZUNsYXNzcGF0aFN0cnVjdHVyZSwKIAkJCQkJCWN1cnJlbnREZXN0aW5hdGlvblBhdGgsCiAJCQkJCQlyZWxhdGl2ZVN0cmluZ05hbWUsCiAJCQkJCQljbGFzc0ZpbGUpOwotCQkJCQlMb29rdXBFbnZpcm9ubWVudCBlbnYgPSB0aGlzLmJhdGNoQ29tcGlsZXIubG9va3VwRW52aXJvbm1lbnQ7Ci0JCQkJCWlmIChjbGFzc0ZpbGUuaXNTaGFyZWQpIGVudi5jbGFzc0ZpbGVQb29sLnJlbGVhc2UoY2xhc3NGaWxlKTsKIAkJCQkJdGhpcy5sb2dnZXIubG9nQ2xhc3NGaWxlKAogCQkJCQkJZ2VuZXJhdGVDbGFzc3BhdGhTdHJ1Y3R1cmUsCiAJCQkJCQljdXJyZW50RGVzdGluYXRpb25QYXRoLApAQCAtMzM2NSwxNCArMzcwMiwxNCBAQAogCQkJCQl0aGlzLmxvZ2dlci5sb2dOb0NsYXNzRmlsZUNyZWF0ZWQoY3VycmVudERlc3RpbmF0aW9uUGF0aCwgcmVsYXRpdmVTdHJpbmdOYW1lLCBlKTsKIAkJCQl9CiAJCQl9CisJCQl0aGlzLmJhdGNoQ29tcGlsZXIubG9va3VwRW52aXJvbm1lbnQucmVsZWFzZUNsYXNzRmlsZXMoY2xhc3NGaWxlcyk7CiAJCX0KIAl9CiB9Ci0KIC8qCiAgKiAgTG93LWxldmVsIEFQSSBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgY29tcGlsYXRpb24KICAqLwotcHVibGljIHZvaWQgcGVyZm9ybUNvbXBpbGF0aW9uKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CitwdWJsaWMgdm9pZCBwZXJmb3JtQ29tcGlsYXRpb24oKSB7CiAKIAl0aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCkBAIC0zMzg3LDcgKzM3MjQsMTIgQEAKIAkJCXRoaXMuY29tcGlsZXJPcHRpb25zLAogCQkJZ2V0QmF0Y2hSZXF1ZXN0b3IoKSwKIAkJCWdldFByb2JsZW1GYWN0b3J5KCksCi0JCQl0aGlzLm91dCk7CisJCQl0aGlzLm91dCwKKwkJCXRoaXMucHJvZ3Jlc3MpOworCXRoaXMuYmF0Y2hDb21waWxlci5yZW1haW5pbmdJdGVyYXRpb25zID0gdGhpcy5tYXhSZXBldGl0aW9uLXRoaXMuY3VycmVudFJlcGV0aXRpb24vKnJlbWFpbmluZyBpdGVyYXRpb25zIGluY2x1ZGluZyB0aGlzIG9uZSovOworCS8vIHRlbXBvcmFyeSBjb2RlIHRvIGFsbG93IHRoZSBjb21waWxlciB0byByZXZlcnQgdG8gYSBzaW5nbGUgdGhyZWFkCisJU3RyaW5nIHNldHRpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImpkdC5jb21waWxlci51c2VTaW5nbGVUaHJlYWQiKTsgLy8kTk9OLU5MUy0xJAorCXRoaXMuYmF0Y2hDb21waWxlci51c2VTaW5nbGVUaHJlYWQgPSBzZXR0aW5nICE9IG51bGwgJiYgc2V0dGluZy5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAogCiAJaWYgKHRoaXMuY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82CiAJCQkmJiB0aGlzLmNvbXBpbGVyT3B0aW9ucy5wcm9jZXNzQW5ub3RhdGlvbnMpIHsKQEAgLTM0MTMsMTUgKzM3NTUsMzYgQEAKIAl9CiAKIAlpZiAodGhpcy5leHRyYVByb2JsZW1zICE9IG51bGwpIHsKLQkJdGhpcy5sb2dnZXIubG9nZ2luZ0V4dHJhUHJvYmxlbXModGhpcyk7CisJCWxvZ2dpbmdFeHRyYVByb2JsZW1zKCk7CiAJCXRoaXMuZXh0cmFQcm9ibGVtcyA9IG51bGw7CiAJfQorCWlmICh0aGlzLmNvbXBpbGVyU3RhdHMgIT0gbnVsbCkgeworCQl0aGlzLmNvbXBpbGVyU3RhdHNbdGhpcy5jdXJyZW50UmVwZXRpdGlvbl0gPSB0aGlzLmJhdGNoQ29tcGlsZXIuc3RhdHM7CisJfQogCXRoaXMubG9nZ2VyLnByaW50U3RhdHMoKTsKIAogCS8vIGNsZWFudXAKIAllbnZpcm9ubWVudC5jbGVhbnVwKCk7CiB9Ci1wcml2YXRlIFJlZmVyZW5jZUJpbmRpbmdbXSBwcm9jZXNzQ2xhc3NOYW1lcyhMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCBsb2dnaW5nRXh0cmFQcm9ibGVtcygpIHsKKwl0aGlzLmxvZ2dlci5sb2dnaW5nRXh0cmFQcm9ibGVtcyh0aGlzKTsKK30KK3B1YmxpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisJcHJpbnRVc2FnZSgibWlzYy51c2FnZSIpOyAvLyROT04tTkxTLTEkCit9Citwcml2YXRlIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgc2VjdGlvbklEKSB7CisJdGhpcy5sb2dnZXIubG9nVXNhZ2UoCisJCXRoaXMuYmluZCgKKwkJCXNlY3Rpb25JRCwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpLCAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5iaW5kKCJjb21waWxlci5uYW1lIiksIC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLmJpbmQoImNvbXBpbGVyLnZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuYmluZCgiY29tcGlsZXIuY29weXJpZ2h0IikgLy8kTk9OLU5MUy0xJAorCQkJfSkpOworCXRoaXMubG9nZ2VyLmZsdXNoKCk7Cit9Citwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmdbXSBwcm9jZXNzQ2xhc3NOYW1lcyhMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogCS8vIGNoZWNrIGZvciAuY2xhc3MgZmlsZSBwcmVzZW5jZSBpbiBjYXNlIG9mIGFwdCBwcm9jZXNzaW5nCiAJaW50IGxlbmd0aCA9IHRoaXMuY2xhc3NOYW1lcy5sZW5ndGg7CiAJUmVmZXJlbmNlQmluZGluZ1tdIHJlZmVyZW5jZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsKQEAgLTM0NDEsNTUgKzM4MDQsMTggQEAKIAkJCQlyZWZlcmVuY2VCaW5kaW5nc1tpXSA9IHR5cGU7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuaW52YWxpZENsYXNzTmFtZSIsIGN1cnJlbnROYW1lKSk7Ly8kTk9OLU5MUy0xJAogCQl9CiAJfQogCXJldHVybiByZWZlcmVuY2VCaW5kaW5nczsKIH0KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlcigpIHsKLQl0cnkgewotCQlDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwdC5kaXNwYXRjaC5CYXRjaEFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlciBhbm5vdGF0aW9uTWFuYWdlciA9IChBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyKSBjLm5ld0luc3RhbmNlKCk7Ci0JCWFubm90YXRpb25NYW5hZ2VyLmNvbmZpZ3VyZSh0aGlzLCB0aGlzLmV4cGFuZGVkQ29tbWFuZExpbmUpOwotCQlhbm5vdGF0aW9uTWFuYWdlci5zZXRFcnIodGhpcy5lcnIpOwotCQlhbm5vdGF0aW9uTWFuYWdlci5zZXRPdXQodGhpcy5vdXQpOwotCQl0aGlzLmJhdGNoQ29tcGlsZXIuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIgPSBhbm5vdGF0aW9uTWFuYWdlcjsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gaWdub3JlCi0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCXRocm93IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCXRocm93IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uKCk7Ci0JfSBjYXRjaChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpIHsKLQkJLy8gcmVwb3J0IGEgd2FybmluZwotCQl0aGlzLmxvZ2dlci5sb2dJbmNvcnJlY3RWTVZlcnNpb25Gb3JBbm5vdGF0aW9uUHJvY2Vzc2luZygpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0JcHJpbnRVc2FnZSgibWlzYy51c2FnZSIpOyAvLyROT04tTkxTLTEkCi19Ci1wcml2YXRlIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgc2VjdGlvbklEKSB7Ci0JdGhpcy5sb2dnZXIubG9nVXNhZ2UoCi0JCXRoaXMuYmluZCgKLQkJCXNlY3Rpb25JRCwKLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpLCAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5iaW5kKCJjb21waWxlci5uYW1lIiksIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLmJpbmQoImNvbXBpbGVyLnZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuYmluZCgiY29tcGlsZXIuY29weXJpZ2h0IikgLy8kTk9OLU5MUy0xJAotCQkJfSkpOwotCXRoaXMubG9nZ2VyLmZsdXNoKCk7Ci19CiAvKgogICogRXh0ZXJuYWwgQVBJCiAgKi8KIHB1YmxpYyB2b2lkIHByb2Nlc3NQYXRoRW50cmllcyhmaW5hbCBpbnQgZGVmYXVsdFNpemUsIGZpbmFsIEFycmF5TGlzdCBwYXRocywKIAkJCWZpbmFsIFN0cmluZyBjdXJyZW50UGF0aCwgU3RyaW5nIGN1c3RvbUVuY29kaW5nLCBib29sZWFuIGlzU291cmNlT25seSwKLQkJCWJvb2xlYW4gcmVqZWN0RGVzdGluYXRpb25QYXRoT25KYXJzKQotCQl0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkJCWJvb2xlYW4gcmVqZWN0RGVzdGluYXRpb25QYXRoT25KYXJzKSB7CiAJU3RyaW5nIGN1cnJlbnRDbGFzc3BhdGhOYW1lID0gbnVsbDsKIAlTdHJpbmcgY3VycmVudERlc3RpbmF0aW9uUGF0aCA9IG51bGw7CiAJQXJyYXlMaXN0IGN1cnJlbnRSdWxlU3BlY3MgPSBuZXcgQXJyYXlMaXN0KGRlZmF1bHRTaXplKTsKQEAgLTM1NDksNyArMzg3NSw3IEBACiAJCQkJc3RhdGUgPSBydWxlc05lZWRBbm90aGVyUnVsZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgZGVzdGluYXRpb25QYXRoUmVhZHlUb0Nsb3NlOgotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0RGVzdGluYXRpb25QYXRoRW50cnkiLCAvLyROT04tTkxTLTEkCiAJCQkJCQljdXJyZW50UGF0aCkpOwogCQkJY2FzZSBicmFja2V0Q2xvc2VkOgpAQCAtMzU2Myw5ICszODg5LDExIEBACiAJCQlzd2l0Y2ggKHN0YXRlKSB7CiAJCQljYXNlIHN0YXJ0OgogCQkJCWN1cnJlbnRDbGFzc3BhdGhOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgcmVhZHlUb0Nsb3NlOgorCQkJCS8vJEZBTEwtVEhST1VHSCQKKwkJCQljYXNlIHJlYWR5VG9DbG9zZToKIAkJCQlicmFja2V0ID0gY3Vyc29yIC0gMTsKLQkJCWNhc2UgYnJhY2tldENsb3NlZDoKKwkJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQkJY2FzZSBicmFja2V0Q2xvc2VkOgogCQkJCXN0YXRlID0gYnJhY2tldE9wZW5lZDsKIAkJCQlicmVhazsKIAkJCWNhc2UgcmVhZHlUb0Nsb3NlRW5kaW5nV2l0aFJ1bGVzOgpAQCAtMzYwNCw3ICszOTMyLDcgQEAKIAkJCWNhc2UgcnVsZXNTdGFydDoKIAkJCQlpZiAodG9rZW4uc3RhcnRzV2l0aCgiLWQgIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQlpZiAoY3VycmVudERlc3RpbmF0aW9uUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlRGVzdGluYXRpb25QYXRoRW50cnkiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQkJY3VycmVudFBhdGgpKTsKIAkJCQkJfQpAQCAtMzYxMiw5ICszOTQwLDEwIEBACiAJCQkJCXN0YXRlID0gZGVzdGluYXRpb25QYXRoUmVhZHlUb0Nsb3NlOwogCQkJCQlicmVhazsKIAkJCQl9IC8vIGVsc2Ugd2UgcHJvY2VlZCB3aXRoIGEgcnVsZQorCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCWNhc2UgcnVsZXNOZWVkQW5vdGhlclJ1bGU6CiAJCQkJaWYgKGN1cnJlbnREZXN0aW5hdGlvblBhdGggIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLmFjY2Vzc1J1bGVBZnRlckRlc3RpbmF0aW9uUGF0aCIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJY3VycmVudFBhdGgpKTsKIAkJCQl9CkBAIC0zNjYxLDEyICszOTkwLDEyIEBACiAJCWRlZmF1bHQgOgogCQkJLy8gd2UgZ28gb24gYW55d2F5CiAJCQlpZiAoY3VycmVudFBhdGgubGVuZ3RoKCkgIT0gMCkgewotCQkJCXRoaXMubG9nZ2VyLmxvZ0luY29ycmVjdENsYXNzcGF0aChjdXJyZW50UGF0aCk7CisJCQkJYWRkUGVuZGluZ0Vycm9ycyh0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGgiLCBjdXJyZW50UGF0aCkpOy8vJE5PTi1OTFMtMSQKIAkJCX0KIAl9CiB9CiAKLXByaXZhdGUgaW50IHByb2Nlc3NQYXRocyhTdHJpbmdbXSBhcmdzLCBpbnQgaW5kZXgsIFN0cmluZyBjdXJyZW50QXJnLCBBcnJheUxpc3QgcGF0aHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworcHJpdmF0ZSBpbnQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIGFyZ3MsIGludCBpbmRleCwgU3RyaW5nIGN1cnJlbnRBcmcsIEFycmF5TGlzdCBwYXRocykgewogCWludCBsb2NhbEluZGV4ID0gaW5kZXg7CiAJaW50IGNvdW50ID0gMDsKIAlmb3IgKGludCBpID0gMCwgbWF4ID0gY3VycmVudEFyZy5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKSB7CkBAIC0zNjgyLDQxICs0MDExLDQxIEBACiAJaWYgKGNvdW50ID09IDApIHsKIAkJcGF0aHMuYWRkKGN1cnJlbnRBcmcpOwogCX0gZWxzZSBpZiAoY291bnQgPiAxKSB7Ci0JCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUudW5leHBlY3RlZEJyYWNrZXQiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJY3VycmVudEFyZykpOwogCX0gZWxzZSB7CiAJCVN0cmluZ0J1ZmZlciBjdXJyZW50UGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoY3VycmVudEFyZyk7CiAJCXdoaWxlICh0cnVlKSB7Ci0gICAgCQlpZiAobG9jYWxJbmRleCA+PSBhcmdzLmxlbmd0aCkgewotICAgIAkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCi0gICAgCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJCQkJCWN1cnJlbnRBcmcpKTsKLSAgICAJCX0KLSAgICAJCWxvY2FsSW5kZXgrKzsKLSAgICAJCVN0cmluZyBuZXh0QXJnID0gYXJnc1tsb2NhbEluZGV4XTsKLSAgICAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBuZXh0QXJnLmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsKLSAgICAJCQlzd2l0Y2gobmV4dEFyZy5jaGFyQXQoaSkpIHsKLSAgICAJCQkJY2FzZSAnWycgOgotICAgIAkJCQkJaWYgKGNvdW50ID4gMSkgewotICAgIAkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCi0gICAgCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIC8vJE5PTi1OTFMtMSQKLSAgICAJCQkJCQkJCQkJCW5leHRBcmcpKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJCWNvdW50Kys7Ci0gICAgCQkJCQlicmVhazsKLSAgICAJCQkJY2FzZSAnXScgOgotICAgIAkJCQkJY291bnQtLTsKLSAgICAJCQkJCWJyZWFrOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCWlmIChjb3VudCA9PSAwKSB7Ci0gICAgCQkJY3VycmVudFBhdGguYXBwZW5kKCcgJyk7Ci0gICAgCQkJY3VycmVudFBhdGguYXBwZW5kKG5leHRBcmcpOwotICAgIAkJCXBhdGhzLmFkZChjdXJyZW50UGF0aC50b1N0cmluZygpKTsKLSAgICAJCQlyZXR1cm4gbG9jYWxJbmRleCAtIGluZGV4OwotICAgIAkJfSBlbHNlIGlmIChjb3VudCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJaWYgKGxvY2FsSW5kZXggPj0gYXJncy5sZW5ndGgpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkJdGhpcy5iaW5kKCJjb25maWd1cmUudW5leHBlY3RlZEJyYWNrZXQiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCWN1cnJlbnRBcmcpKTsKKwkJCX0KKwkJCWxvY2FsSW5kZXgrKzsKKwkJCVN0cmluZyBuZXh0QXJnID0gYXJnc1tsb2NhbEluZGV4XTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBuZXh0QXJnLmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlzd2l0Y2gobmV4dEFyZy5jaGFyQXQoaSkpIHsKKwkJCQkJY2FzZSAnWycgOgorCQkJCQkJaWYgKGNvdW50ID4gMSkgeworCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJbmV4dEFyZykpOworCQkJCQkJfQorCQkJCQkJY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICddJyA6CisJCQkJCQljb3VudC0tOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQljdXJyZW50UGF0aC5hcHBlbmQoJyAnKTsKKwkJCQljdXJyZW50UGF0aC5hcHBlbmQobmV4dEFyZyk7CisJCQkJcGF0aHMuYWRkKGN1cnJlbnRQYXRoLnRvU3RyaW5nKCkpOworCQkJCXJldHVybiBsb2NhbEluZGV4IC0gaW5kZXg7CisJCQl9IGVsc2UgaWYgKGNvdW50IDwgMCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJCW5leHRBcmcpKTsKIAkJCX0gZWxzZSB7CkBAIC0zNzI4LDcgKzQwNTcsNyBAQAogCX0KIAlyZXR1cm4gbG9jYWxJbmRleCAtIGluZGV4OwogfQotcHJpdmF0ZSBpbnQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIGFyZ3MsIGludCBpbmRleCwgU3RyaW5nIGN1cnJlbnRBcmcsIFN0cmluZ1tdIHBhdGhzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKK3ByaXZhdGUgaW50IHByb2Nlc3NQYXRocyhTdHJpbmdbXSBhcmdzLCBpbnQgaW5kZXgsIFN0cmluZyBjdXJyZW50QXJnLCBTdHJpbmdbXSBwYXRocykgewogCWludCBsb2NhbEluZGV4ID0gaW5kZXg7CiAJaW50IGNvdW50ID0gMDsKIAlmb3IgKGludCBpID0gMCwgbWF4ID0gY3VycmVudEFyZy5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKSB7CkBAIC0zNzQ2LDM1ICs0MDc1LDM1IEBACiAJfSBlbHNlIHsKIAkJU3RyaW5nQnVmZmVyIGN1cnJlbnRQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihjdXJyZW50QXJnKTsKIAkJd2hpbGUgKHRydWUpIHsKLSAgICAJCWxvY2FsSW5kZXgrKzsKLSAgICAJCWlmIChsb2NhbEluZGV4ID49IGFyZ3MubGVuZ3RoKSB7Ci0gICAgCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKLSAgICAJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLnVuZXhwZWN0ZWRCcmFja2V0IiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJCQkJY3VycmVudEFyZykpOwotICAgIAkJfQotICAgIAkJU3RyaW5nIG5leHRBcmcgPSBhcmdzW2xvY2FsSW5kZXhdOwotICAgIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5leHRBcmcubGVuZ3RoKCk7IGkgPCBtYXg7IGkrKykgewotICAgIAkJCXN3aXRjaChuZXh0QXJnLmNoYXJBdChpKSkgewotICAgIAkJCQljYXNlICdbJyA6Ci0gICAgCQkJCQlpZiAoY291bnQgPiAxKSB7Ci0gICAgCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKLSAgICAJCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLnVuZXhwZWN0ZWRCcmFja2V0IiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJCQkJCQkJY3VycmVudEFyZykpOwotICAgIAkJCQkJfQotICAgIAkJCQkJY291bnQrKzsKLSAgICAJCQkJCWJyZWFrOwotICAgIAkJCQljYXNlICddJyA6Ci0gICAgCQkJCQljb3VudC0tOwotICAgIAkJCQkJYnJlYWs7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAkJaWYgKGNvdW50ID09IDApIHsKLSAgICAJCQljdXJyZW50UGF0aC5hcHBlbmQoJyAnKTsKLSAgICAJCQljdXJyZW50UGF0aC5hcHBlbmQobmV4dEFyZyk7Ci0gICAgCQkJcGF0aHNbMF0gPSBjdXJyZW50UGF0aC50b1N0cmluZygpOwotICAgIAkJCXJldHVybiBsb2NhbEluZGV4IC0gaW5kZXg7Ci0gICAgCQl9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQlsb2NhbEluZGV4Kys7CisJCQlpZiAobG9jYWxJbmRleCA+PSBhcmdzLmxlbmd0aCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCQl0aGlzLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQnJhY2tldCIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJY3VycmVudEFyZykpOworCQkJfQorCQkJU3RyaW5nIG5leHRBcmcgPSBhcmdzW2xvY2FsSW5kZXhdOworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5leHRBcmcubGVuZ3RoKCk7IGkgPCBtYXg7IGkrKykgeworCQkJCXN3aXRjaChuZXh0QXJnLmNoYXJBdChpKSkgeworCQkJCQljYXNlICdbJyA6CisJCQkJCQlpZiAoY291bnQgPiAxKSB7CisJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLnVuZXhwZWN0ZWRCcmFja2V0IiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQljdXJyZW50QXJnKSk7CisJCQkJCQl9CisJCQkJCQljb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ10nIDoKKwkJCQkJCWNvdW50LS07CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCWN1cnJlbnRQYXRoLmFwcGVuZCgnICcpOworCQkJCWN1cnJlbnRQYXRoLmFwcGVuZChuZXh0QXJnKTsKKwkJCQlwYXRoc1swXSA9IGN1cnJlbnRQYXRoLnRvU3RyaW5nKCk7CisJCQkJcmV0dXJuIGxvY2FsSW5kZXggLSBpbmRleDsKKwkJCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJCXRoaXMuYmluZCgiY29uZmlndXJlLnVuZXhwZWN0ZWRCcmFja2V0IiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQkJY3VycmVudEFyZykpOwogCQkJfSBlbHNlIHsKQEAgLTM4MDUsMTQgKzQxMzQsMTQgQEAKIC8qCiAgKiBFeHRlcm5hbCBBUEkKICAqLwotcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKLQlyZWxvY2FsaXplKGxvY2FsZSk7CitwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblBhdGgoU3RyaW5nIGRlc3QpIHsKKwl0aGlzLmRlc3RpbmF0aW9uUGF0aCA9IGRlc3Q7CiB9CiAvKgogICogRXh0ZXJuYWwgQVBJCiAgKi8KLXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uUGF0aChTdHJpbmcgZGVzdCkgewotCXRoaXMuZGVzdGluYXRpb25QYXRoID0gZGVzdDsKK3B1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisJcmVsb2NhbGl6ZShsb2NhbGUpOwogfQogLyoKICAqIEV4dGVybmFsIEFQSQpAQCAtMzgyMyw3ICs0MTUyLDcgQEAKIAkJQXJyYXlMaXN0IGNsYXNzcGF0aHMsCiAJCUFycmF5TGlzdCBleHRkaXJzQ2xhc3NwYXRocywKIAkJQXJyYXlMaXN0IGVuZG9yc2VkRGlyQ2xhc3NwYXRocywKLQkJU3RyaW5nIGN1c3RvbUVuY29kaW5nKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIGN1c3RvbUVuY29kaW5nKSB7CiAKIAkvLyBwcm9jZXNzIGJvb3RjbGFzc3BhdGgsIGNsYXNzcGF0aCBhbmQgc291cmNlcGF0aHMKICAJYm9vdGNsYXNzcGF0aHMgPSBoYW5kbGVCb290Y2xhc3NwYXRoKGJvb3RjbGFzc3BhdGhzLCBjdXN0b21FbmNvZGluZyk7CkBAIC0zODYzLDcgKzQxOTIsNyBAQAogCWNsYXNzcGF0aHMudG9BcnJheSh0aGlzLmNoZWNrZWRDbGFzc3BhdGhzKTsKIAl0aGlzLmxvZ2dlci5sb2dDbGFzc3BhdGgodGhpcy5jaGVja2VkQ2xhc3NwYXRocyk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wdGlvbnMoYm9vbGVhbiBkaWRTcGVjaWZ5Q29tcGxpYW5jZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wdGlvbnMoYm9vbGVhbiBkaWRTcGVjaWZ5Q29tcGxpYW5jZSkgewogCWlmIChkaWRTcGVjaWZ5Q29tcGxpYW5jZSkgewogCQlPYmplY3QgdmVyc2lvbiA9IHRoaXMub3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKTsKIAkJaWYgKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMy5lcXVhbHModmVyc2lvbikpIHsKQEAgLTM5NDgsMTkgKzQyNzcsMTkgQEAKIAlpZiAoc291cmNlVmVyc2lvbi5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV83KQogCQkJJiYgQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2UpIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgewogCQkvLyBjb21wbGlhbmNlIG11c3QgYmUgMS43IGlmIHNvdXJjZSBpcyAxLjcKLQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlIiwgKFN0cmluZyl0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSksIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNykpOyAvLyROT04tTkxTLTEkCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclNvdXJjZSIsIChTdHJpbmcpdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzcpKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSBpZiAoc291cmNlVmVyc2lvbi5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV82KQogCQkJJiYgQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2UpIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNikgewogCQkvLyBjb21wbGlhbmNlIG11c3QgYmUgMS42IGlmIHNvdXJjZSBpcyAxLjYKLQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlIiwgKFN0cmluZyl0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSksIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNikpOyAvLyROT04tTkxTLTEkCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclNvdXJjZSIsIChTdHJpbmcpdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzYpKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSBpZiAoc291cmNlVmVyc2lvbi5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV81KQogCQkJJiYgQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2UpIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogCQkvLyBjb21wbGlhbmNlIG11c3QgYmUgMS41IGlmIHNvdXJjZSBpcyAxLjUKLQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlIiwgKFN0cmluZyl0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSksIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSkpOyAvLyROT04tTkxTLTEkCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclNvdXJjZSIsIChTdHJpbmcpdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzUpKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSBpZiAoc291cmNlVmVyc2lvbi5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQogCQkJJiYgQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2UpIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgewogCQkvLyBjb21wbGlhbmNlIG11c3QgYmUgMS40IGlmIHNvdXJjZSBpcyAxLjQKLQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlIiwgKFN0cmluZyl0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSksIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkpOyAvLyROT04tTkxTLTEkCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclNvdXJjZSIsIChTdHJpbmcpdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCS8vIGNoZWNrIGFuZCBzZXQgY29tcGxpYW5jZS9zb3VyY2UvdGFyZ2V0IGNvbXBhdGliaWxpdGllcwpAQCAtMzk3MCwzMiArNDI5OSwzOSBAQAogCQlpZiAoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fSlNSMTQuZXF1YWxzKHRhcmdldFZlcnNpb24pKSB7CiAJCQkvLyBleHBlY3Rpbmcgc291cmNlID49IDEuNQogCQkJaWYgKENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChzb3VyY2VWZXJzaW9uKSA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvckdlbmVyaWNTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCAoU3RyaW5nKSBzb3VyY2VWZXJzaW9uKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvckdlbmVyaWNTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCAoU3RyaW5nKSBzb3VyY2VWZXJzaW9uKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfSBlbHNlIGlmIChDb21waWxlck9wdGlvbnMuVkVSU0lPTl9DTERDMV8xLmVxdWFscyh0YXJnZXRWZXJzaW9uKSkgeworCQkJaWYgKHRoaXMuZGlkU3BlY2lmeVNvdXJjZSAmJiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlVmVyc2lvbikgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlU291cmNlRm9yQ2xkY1RhcmdldCIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIChTdHJpbmcpIHNvdXJjZVZlcnNpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjb21wbGlhbmNlKSA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yQ2xkY1RhcmdldCIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIChTdHJpbmcpIHNvdXJjZVZlcnNpb24pKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9IGVsc2UgewogCQkJLy8gdGFyZ2V0IG11c3QgYmUgMS43IGlmIHNvdXJjZSBpcyAxLjcKIAkJCWlmIChDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlVmVyc2lvbikgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNwogCQkJCQkmJiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwodGFyZ2V0VmVyc2lvbikgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KXsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZSIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNykpOyAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzcpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJLy8gdGFyZ2V0IG11c3QgYmUgMS42IGlmIHNvdXJjZSBpcyAxLjYKIAkJCWlmIChDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlVmVyc2lvbikgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNgogCQkJCQkmJiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwodGFyZ2V0VmVyc2lvbikgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82KXsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZSIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNikpOyAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzYpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJLy8gdGFyZ2V0IG11c3QgYmUgMS41IGlmIHNvdXJjZSBpcyAxLjUKIAkJCWlmIChDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlVmVyc2lvbikgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNQogCQkJCQkmJiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwodGFyZ2V0VmVyc2lvbikgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KXsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZSIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSkpOyAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzUpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJLy8gdGFyZ2V0IG11c3QgYmUgMS40IGlmIHNvdXJjZSBpcyAxLjQKIAkJCWlmIChDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlVmVyc2lvbikgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNAogCQkJCQkmJiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwodGFyZ2V0VmVyc2lvbikgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KXsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHRoaXMuYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZSIsIChTdHJpbmcpIHRhcmdldFZlcnNpb24sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkpOyAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UiLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJLy8gdGFyZ2V0IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gY29tcGxpYW5jZSBsZXZlbAogCQkJaWYgKENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjb21wbGlhbmNlKSA8IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbCh0YXJnZXRWZXJzaW9uKSl7Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbih0aGlzLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yVGFyZ2V0IiwgKFN0cmluZyl0aGlzLm9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSksIChTdHJpbmcpIHRhcmdldFZlcnNpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odGhpcy5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclRhcmdldCIsIChTdHJpbmcpdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLCAoU3RyaW5nKSB0YXJnZXRWZXJzaW9uKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggZjZmYjllYS4uM2MwYWZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywxNSArNywxNiBAQAogIwogIyBDb250cmlidXRvcnM6CiAjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMJCUJlbmphbWluIE11c2thbGxhIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjM5MDY2CiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMgSmF2YUJhdGNoQ29tcGlsZXIgbWVzc2FnZXMuCiAKICMjIyBjb21waWxlcgogI0Zvcm1hdDogY29tcGlsZXIubmFtZSA9IHdvcmQxIHdvcmQyIHdvcmQzCi1jb21waWxlci5uYW1lID0gRWNsaXBzZSBKYXZhIENvbXBpbGVyCitjb21waWxlci5uYW1lID0gRWNsaXBzZSBDb21waWxlciBmb3IgSmF2YShUTSkKICNGb3JtYXQ6IGNvbXBpbGVyLnZlcnNpb24gPSAwLlhYWFssIG90aGVyIHdvcmRzIChkb24ndCBmb3JnZXQgdGhlIGNvbW1hIGlmIGFkZGluZyBvdGhlciB3b3JkcyldCi1jb21waWxlci52ZXJzaW9uID0gMC43ODVfUjMzeCwgMy4zLjIKLWNvbXBpbGVyLmNvcHlyaWdodCA9IENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLCAyMDA3LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorY29tcGlsZXIudmVyc2lvbiA9IDAuQjc5X1IzN3gsIDMuNy4yCitjb21waWxlci5jb3B5cmlnaHQgPSBDb3B5cmlnaHQgSUJNIENvcnAgMjAwMCwgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIyMjIHByb2dyZXNzCiBwcm9ncmVzcy5jb21waWxpbmcgPSBDb21waWxpbmcKQEAgLTIzLDYgKzI0LDggQEAKICMjIyBjb21waWxlCiBjb21waWxlLnJlcGV0aXRpb24gPSBbcmVwZXRpdGlvbiB7MH0vezF9XQogY29tcGlsZS5pbnN0YW50VGltZSA9IFtjb21waWxlZCB7MH0gbGluZXMgaW4gezF9IG1zOiB7Mn0gbGluZXMvc10KK2NvbXBpbGUuZGV0YWlsZWRUaW1lID0gW3BhcnNlOiB7MH0gbXMgKHsxfSUpLCByZXNvbHZlOiB7Mn0gbXMgKHszfSUpLCBhbmFseXplOiB7NH0gbXMgKHs1fSUpLCBnZW5lcmF0ZTogezZ9IG1zICh7N30lKSBdCitjb21waWxlLmlvVGltZSA9IFtpL286IHJlYWQ6IHswfSBtcyAoezF9JSksIHdyaXRlOiB7Mn0gbXMgKHszfSUpXQogY29tcGlsZS5hdmVyYWdlVGltZSA9IFthdmVyYWdlLCBleGNsdWRpbmcgbWluLW1heCB7MH0gbGluZXMgaW4gezF9IG1zOiB7Mn0gbGluZXMvc10KIGNvbXBpbGUudG90YWxUaW1lID0gW3RvdGFsIGNvbXBpbGF0aW9uIHRpbWU6IHswfV0KIGNvbXBpbGUub25lUHJvYmxlbSA9IDEgcHJvYmxlbSAoezB9KQpAQCAtNDksMjIgKzUyLDMwIEBACiBjb25maWd1cmUuZHVwbGljYXRlRXh0RGlycyA9IGR1cGxpY2F0ZSBleHRkaXJzIHNwZWNpZmljYXRpb246IHswfQogY29uZmlndXJlLmR1cGxpY2F0ZVNvdXJjZXBhdGggPSBkdXBsaWNhdGUgc291cmNlcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0KIGNvbmZpZ3VyZS5pbnZhbGlkRGVidWdPcHRpb24gPSBpbnZhbGlkIGRlYnVnIG9wdGlvbjogezB9Ci1jb25maWd1cmUuaW52YWxpZFdhcm5pbmdDb25maWd1cmF0aW9uID0gaW52YWxpZCB3YXJuaW5nIGNvbmZpZ3VyYXRpb246IHswfQotY29uZmlndXJlLmludmFsaWRXYXJuaW5nID0gaW52YWxpZCB3YXJuaW5nOiB7MH0KLWNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ09wdGlvbiA9IGludmFsaWQgd2FybmluZyBvcHRpb246IHswfQotY29uZmlndXJlLnRhcmdldEpESyA9IHRhcmdldCBsZXZlbCBzaG91bGQgYmUgY29tcHJpc2VkIGluIGJldHdlZW4gJycxLjEnJyBhbmQgJycxLjcnJyAob3IgJyc1JycsICcnNS4wJycsIC4uLiwgJyc3Jycgb3IgJyc3LjAnJyk6IHswfQorY29uZmlndXJlLmludmFsaWRXYXJuaW5nQ29uZmlndXJhdGlvbiA9IGludmFsaWQgd2FybmluZyBjb25maWd1cmF0aW9uOiAnJ3swfScnCitjb25maWd1cmUuaW52YWxpZFdhcm5pbmcgPSBpbnZhbGlkIHdhcm5pbmcgdG9rZW46ICcnezB9JycuIElnbm9yaW5nIHdhcm5pbmcgYW5kIGNvbXBpbGluZworY29uZmlndXJlLmludmFsaWRXYXJuaW5nT3B0aW9uID0gaW52YWxpZCB3YXJuaW5nIG9wdGlvbjogJyd7MH0nJy4gTXVzdCBzcGVjaWZ5IGEgd2FybmluZyB0b2tlbgorY29uZmlndXJlLnRhcmdldEpESyA9IHRhcmdldCBsZXZlbCBzaG91bGQgYmUgY29tcHJpc2VkIGluIGJldHdlZW4gJycxLjEnJyBhbmQgJycxLjcnJyAob3IgJyc1JycsICcnNS4wJycsIC4uLiwgJyc3Jycgb3IgJyc3LjAnJykgb3IgY2xkYzEuMTogezB9CiBjb25maWd1cmUuaW5jb21wYXRpYmxlVGFyZ2V0Rm9yU291cmNlID0gVGFyZ2V0IGxldmVsICcnezB9JycgaXMgaW5jb21wYXRpYmxlIHdpdGggc291cmNlIGxldmVsICcnezF9JycuIEEgdGFyZ2V0IGxldmVsICcnezF9Jycgb3IgYmV0dGVyIGlzIHJlcXVpcmVkCiBjb25maWd1cmUuaW5jb21wYXRpYmxlVGFyZ2V0Rm9yR2VuZXJpY1NvdXJjZSA9IFRhcmdldCBsZXZlbCAnJ3swfScnIGlzIGluY29tcGF0aWJsZSB3aXRoIHNvdXJjZSBsZXZlbCAnJ3sxfScnLiBBIHNvdXJjZSBsZXZlbCAnJzEuNScnIG9yIGJldHRlciBpcyByZXF1aXJlZAogY29uZmlndXJlLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JTb3VyY2UgPSBDb21wbGlhbmNlIGxldmVsICcnezB9JycgaXMgaW5jb21wYXRpYmxlIHdpdGggc291cmNlIGxldmVsICcnezF9JycuIEEgY29tcGxpYW5jZSBsZXZlbCAnJ3sxfScnIG9yIGJldHRlciBpcyByZXF1aXJlZAogY29uZmlndXJlLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JUYXJnZXQgPSBDb21wbGlhbmNlIGxldmVsICcnezB9JycgaXMgaW5jb21wYXRpYmxlIHdpdGggdGFyZ2V0IGxldmVsICcnezF9JycuIEEgY29tcGxpYW5jZSBsZXZlbCAnJ3sxfScnIG9yIGJldHRlciBpcyByZXF1aXJlZAogY29uZmlndXJlLnJlcGV0aXRpb24gPSByZXBldGl0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyOiB7MH0KIGNvbmZpZ3VyZS5tYXhQcm9ibGVtcyA9IG1heCBwcm9ibGVtcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcjogezB9CisKK2NvbmZpZ3VyZS5pbnZhbGlkRXJyb3JDb25maWd1cmF0aW9uID0gaW52YWxpZCBlcnJvciBjb25maWd1cmF0aW9uOiAnJ3swfScnCitjb25maWd1cmUuaW52YWxpZEVycm9yID0gaW52YWxpZCBlcnJvciB0b2tlbjogJyd7MH0nJy4gSWdub3JpbmcgdGhpcyBlcnJvciB0b2tlbiBhbmQgY29tcGlsaW5nCitjb25maWd1cmUuaW52YWxpZEVycm9yT3B0aW9uID0gaW52YWxpZCBlcnJvciBvcHRpb246ICcnezB9JycuIE11c3Qgc3BlY2lmeSBhbiBlcnJvciB0b2tlbgorY29uZmlndXJlLmludmFsaWRVc2FnZU9mUGx1c09wdGlvbj11c2FnZSBvZiAnJysnJyBmb3IgJyd7MH0nJyBpcyBpbGxlZ2FsIHRoZXJlCitjb25maWd1cmUuaW52YWxpZFVzYWdlT2ZNaW51c09wdGlvbj11c2FnZSBvZiAnJy0nJyBmb3IgJyd7MH0nJyBpcyBpbGxlZ2FsIHRoZXJlCisKICMjIGNvbmZpZ3VyZS5kaXJlY3RvcnlOb3RFeGlzdCA9IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogezB9CiBjb25maWd1cmUudW5yZWNvZ25pemVkT3B0aW9uID0gVW5yZWNvZ25pemVkIG9wdGlvbiA6IHswfQogY29uZmlndXJlLm5vQ2xhc3NwYXRoID0gbm8gY2xhc3NwYXRoIGRlZmluZWQsIHVzaW5nIGRlZmF1bHQgZGlyZWN0b3J5IGluc3RlYWQKIGNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGggPSBpbmNvcnJlY3QgY2xhc3NwYXRoOiB7MH0KIGNvbmZpZ3VyZS5pbnZhbGlkZXhwYW5zaW9uYXJndW1lbnRuYW1lID0gZXhwYW5zaW9uIGFyZ3VtZW50IGZpbGUgezB9IGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSByZWFkCiBjb25maWd1cmUuY2Fubm90T3BlbkxvZyA9IGNhbm5vdCBvcGVuIC5sb2cgZmlsZTogezB9Citjb25maWd1cmUuY2Fubm90T3BlbkxvZ0ludmFsaWRFbmNvZGluZyA9IGNhbm5vdCBvcGVuIC5sb2cgZmlsZTogezB9OyBiZWNhdXNlIFVURi04IGlzIG5vdCBzdXBwb3J0ZWQKIGNvbmZpZ3VyZS51bmV4cGVjdGVkQ3VzdG9tRW5jb2RpbmcgPSB1bmV4cGVjdGVkIGN1c3RvbSBlbmNvZGluZyBzcGVjaWZpY2F0aW9uOiB7MH1bezF9XQogY29uZmlndXJlLnVuc3VwcG9ydGVkRW5jb2RpbmcgPSB1bnN1cHBvcnRlZCBlbmNvZGluZyBmb3JtYXQ6IHswfQogY29uZmlndXJlLmR1cGxpY2F0ZURlZmF1bHRFbmNvZGluZyA9IGR1cGxpY2F0ZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9uOiB7MH0KQEAgLTgwLDEwICs5MSwyMSBAQAogY29uZmlndXJlLmR1cGxpY2F0ZURlc3RpbmF0aW9uUGF0aEVudHJ5ID0gZHVwbGljYXRlIGRlc3RpbmF0aW9uIHBhdGggZW50cnkgaW4gezB9IG9wdGlvbgogY29uZmlndXJlLmludmFsaWRDbGFzc05hbWUgPSBpbnZhbGlkIGNsYXNzIG5hbWU6IHswfQogY29uZmlndXJlLmluY29ycmVjdFZNVmVyc2lvbmZvckFQVCA9IEFubm90YXRpb24gcHJvY2Vzc2luZyBnb3QgZGlzYWJsZWQsIHNpbmNlIGl0IHJlcXVpcmVzIGEgMS42IGNvbXBsaWFudCBKVk0KK2NvbmZpZ3VyZS5pbmNvbXBhdGlibGVTb3VyY2VGb3JDbGRjVGFyZ2V0PVRhcmdldCBsZXZlbCAnJ3swfScnIGlzIGluY29tcGF0aWJsZSB3aXRoIHNvdXJjZSBsZXZlbCAnJ3sxfScnLiBBIHNvdXJjZSBsZXZlbCAnJzEuMycnIG9yIGxvd2VyIGlzIHJlcXVpcmVkCitjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvckNsZGNUYXJnZXQ9VGFyZ2V0IGxldmVsICcnezB9JycgaXMgaW5jb21wYXRpYmxlIHdpdGggY29tcGxpYW5jZSBsZXZlbCAnJ3sxfScnLiBBIGNvbXBsaWFuY2UgbGV2ZWwgJycxLjQnJ29yIGxvd2VyIGlzIHJlcXVpcmVkCitjb25maWd1cmUuaW52YWxpZENsYXNzcGF0aFNlY3Rpb24gPSBpbnZhbGlkIENsYXNzLVBhdGggaGVhZGVyIGluIG1hbmlmZXN0IG9mIGphciBmaWxlOiB7MH0KK2NvbmZpZ3VyZS5tdWx0aXBsZUNsYXNzcGF0aFNlY3Rpb25zID0gbXVsdGlwbGUgQ2xhc3MtUGF0aCBoZWFkZXJzIGluIG1hbmlmZXN0IG9mIGphciBmaWxlOiB7MH0KK2NvbmZpZ3VyZS5taXNzaW5nd2FybmluZ3Nwcm9wZXJ0aWVzZmlsZT1wcm9wZXJ0aWVzIGZpbGUgezB9IGRvZXMgbm90IGV4aXN0Citjb25maWd1cmUuaW9leGNlcHRpb253YXJuaW5nc3Byb3BlcnRpZXNmaWxlPUFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHByb3BlcnRpZXMgZmlsZSB7MH0KK2NvbmZpZ3VyZS5tdWx0aXBsZWVuY29kaW5ncz1NdWx0aXBsZSBlbmNvZGluZyBzcGVjaWZpZWQ6IHsxfS4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaGFzIGJlZW4gc2V0IHRvIHswfQorY29uZmlndXJlLmRpZmZlcmVudGVuY29kaW5ncz1Gb3VuZCBlbmNvZGluZyB7MH0uIERpZmZlcmVudCBlbmNvZGluZ3Mgd2VyZSBzcGVjaWZpZWQ6IHsxfQorY29uZmlndXJlLmRpZmZlcmVudGVuY29kaW5nPUZvdW5kIGVuY29kaW5nIHswfS4gQSBkaWZmZXJlbnQgZW5jb2Rpbmcgd2FzIHNwZWNpZmllZDogezF9CiAKICMjIyByZXF1ZXN0b3IKIHJlcXVlc3Rvci5lcnJvciA9IHswfS4gRVJST1IgaW4gezF9CiByZXF1ZXN0b3Iud2FybmluZyA9IHswfS4gV0FSTklORyBpbiB7MX0KK3JlcXVlc3Rvci5leHRyYWVycm9yID0gezB9LiBFUlJPUjoKK3JlcXVlc3Rvci5leHRyYXdhcm5pbmcgPSB7MH0uIFdBUk5JTkc6CiByZXF1ZXN0b3Iubm90UmV0cmlldmVFcnJvck1lc3NhZ2UgPSBDYW5ub3QgcmV0cmlldmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHswfQogcmVxdWVzdG9yLm5vRmlsZU5hbWVTcGVjaWZpZWQgPSAob3JpZ2luYWwgZmlsZSBuYW1lIGlzIG5vdCBhdmFpbGFibGUpCiAKQEAgLTEwOSwxOCArMTMxLDE4IEBACiBcIHdpdGggJycrJycuXG5cCiBcIFxuXAogXCBDbGFzc3BhdGggb3B0aW9uczpcblwKLVwgICAgLWNwIC1jbGFzc3BhdGggPGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzIHNlcGFyYXRlZCBieSB7MH0+XG5cCitcICAgIC1jcCAtY2xhc3NwYXRoIDxkaXJlY3RvcmllcyBhbmQgWklQIGFyY2hpdmVzIHNlcGFyYXRlZCBieSB7MH0+XG5cCiBcICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxvY2F0aW9uIGZvciBhcHBsaWNhdGlvbiBjbGFzc2VzIGFuZCBzb3VyY2VzLlxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBkaXJlY3Rvcnkgb3IgZmlsZSBjYW4gc3BlY2lmeSBhY2Nlc3MgcnVsZXMgZm9yXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBiZXR3ZWVuICcnWycnIGFuZCAnJ10nJyAoZS5nLiBbLVhdIHRvIGZvcmJpZFxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHRvIHR5cGUgWCwgW35YXSB0byBkaXNjb3VyYWdlIGFjY2VzcyB0byB0eXBlIFgsXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICBbK3AvWHswfS1wLypdIHRvIGZvcmJpZCBhY2Nlc3MgdG8gYWxsIHR5cGVzIGluIHBhY2thZ2UgcFxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgYnV0IGFsbG93IGFjY2VzcyB0byBwL1gpXG5cCi1cICAgIC1ib290Y2xhc3NwYXRoIDxkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAorXCAgICAtYm9vdGNsYXNzcGF0aCA8ZGlyZWN0b3JpZXMgYW5kIFpJUCBhcmNoaXZlcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3Igc3lzdGVtIGNsYXNzZXMuIEVhY2ggZGlyZWN0b3J5IG9yXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNhbiBzcGVjaWZ5IGFjY2VzcyBydWxlcyBmb3IgdHlwZXMgYmV0d2VlbiAnJ1snJ1xuXAogXCAgICAgICAgICAgICAgICAgICAgICAgYW5kICcnXScnXG5cCi1cICAgIC1zb3VyY2VwYXRoIDxkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAorXCAgICAtc291cmNlcGF0aCA8ZGlyZWN0b3JpZXMgYW5kIFpJUCBhcmNoaXZlcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3IgYXBwbGljYXRpb24gc291cmNlcy4gRWFjaCBkaXJlY3RvcnlcblwKIFwgICAgICAgICAgICAgICAgICAgICAgIG9yIGZpbGUgY2FuIHNwZWNpZnkgYWNjZXNzIHJ1bGVzIGZvciB0eXBlcyBiZXR3ZWVuICcnWycnXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICBhbmQgJyddJycuIEVhY2ggZGlyZWN0b3J5IGNhbiBmdXJ0aGVyIHNwZWNpZnkgYSBzcGVjaWZpY1xuXApAQCAtMTI4LDE5ICsxNTAsMjEgQEAKIFwgICAgICAgICAgICAgICAgICAgICAgIGFuZCAnJ10nJzsgdGhpcyBvdmVycmlkZXMgdGhlIGdlbmVyYWwgJyctZCcnIG9wdGlvbi5cblwKIFwgICAgICAgICAgICAgICAgICAgICAgIC5jbGFzcyBmaWxlcyBjcmVhdGVkIGZyb20gc291cmNlIGZpbGVzIGNvbnRhaW5lZCBpbiBhXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZSBhcmUgcHV0IGluIHRoZSB1c2VyLmRpciBmb2xkZXIgaW4gY2FzZSBub1xuXAotXCAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhbCAnJy1kJycgb3B0aW9uIGlzIHNwZWNpZmllZC4gemlwL2phciBmaWxlcyBjYW5ub3RcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYWwgJyctZCcnIG9wdGlvbiBpcyBzcGVjaWZpZWQuIFpJUCBhcmNoaXZlcyBjYW5ub3RcblwKIFwgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZSBnZW5lcmFsICcnLWQnJyBvcHRpb25cblwKIFwgICAgLWV4dGRpcnMgPGRpcmVjdG9yaWVzIHNlcGFyYXRlZCBieSB7MH0+XG5cCi1cICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxvY2F0aW9uIGZvciBleHRlbnNpb24gemlwL2phciBmaWxlc1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3IgZXh0ZW5zaW9uIFpJUCBhcmNoaXZlc1xuXAogXCAgICAtZW5kb3JzZWRkaXJzIDxkaXJlY3RvcmllcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAotXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3IgZW5kb3JzZWQgemlwL2phciBmaWxlc1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3IgZW5kb3JzZWQgWklQIGFyY2hpdmVzXG5cCiBcICAgIC1kIDxkaXI+ICAgICAgICAgICBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGlmIG9taXR0ZWQsIG5vIGRpcmVjdG9yeSBpc1xuXAogXCAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCk7IHRoaXMgb3B0aW9uIGNhbiBiZSBvdmVycmlkZGVuIHBlciBzb3VyY2VcblwKIFwgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeVxuXAogXCAgICAtZCBub25lICAgICAgICAgICAgZ2VuZXJhdGUgbm8gLmNsYXNzIGZpbGVzXG5cCi1cICAgIC1lbmNvZGluZyA8ZW5jPiAgICBzcGVjaWZ5IGN1c3RvbSBlbmNvZGluZyBmb3IgYWxsIHNvdXJjZXMuIEVhY2hcblwKK1wgICAgLWVuY29kaW5nIDxlbmM+ICAgIHNwZWNpZnkgZGVmYXVsdCBlbmNvZGluZyBmb3IgYWxsIHNvdXJjZSBmaWxlcy4gRWFjaFxuXAogXCAgICAgICAgICAgICAgICAgICAgICAgZmlsZS9kaXJlY3RvcnkgY2FuIG92ZXJyaWRlIGl0IHdoZW4gc3VmZml4ZWQgd2l0aFxuXAotXCAgICAgICAgICAgICAgICAgICAgICAgJydbJyc8ZW5jPicnXScnIChlLmcuIFguamF2YVt1dGY4XSlcblwKK1wgICAgICAgICAgICAgICAgICAgICAgICcnWycnPGVuYz4nJ10nJyAoZS5nLiBYLmphdmFbdXRmOF0pLlxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgSWYgbXVsdGlwbGUgZGVmYXVsdCBlbmNvZGluZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGxhc3RcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIG9uZSB3aWxsIGJlIHVzZWQuXG5cCiBcIFxuXAogXCBDb21wbGlhbmNlIG9wdGlvbnM6XG5cCiBcICAgIC0xLjMgICAgICAgICAgICAgICB1c2UgMS4zIGNvbXBsaWFuY2UgKC1zb3VyY2UgMS4zIC10YXJnZXQgMS4xKVxuXApAQCAtMTUwLDYgKzE3NCw4IEBACiBcICAgIC0xLjcgLTcgLTcuMCAgICAgICB1c2UgMS43IGNvbXBsaWFuY2UgKC1zb3VyY2UgMS43IC10YXJnZXQgMS43KVxuXAogXCAgICAtc291cmNlIDx2ZXJzaW9uPiAgc2V0IHNvdXJjZSBsZXZlbDogMS4zIHRvIDEuNyAob3IgNSwgNS4wLCBldGMpXG5cCiBcICAgIC10YXJnZXQgPHZlcnNpb24+ICBzZXQgY2xhc3NmaWxlIHRhcmdldDogMS4xIHRvIDEuNyAob3IgNSwgNS4wLCBldGMpXG5cCitcICAgICAgICAgICAgICAgICAgICAgICBjbGRjMS4xIGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIFN0YWNrTWFwXG5cCitcICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVcblwKIFwgXG5cCiBcIFdhcm5pbmcgb3B0aW9uczpcblwKIFwgICAgLWRlcHJlY2F0aW9uICAgICArIGRlcHJlY2F0aW9uIG91dHNpZGUgZGVwcmVjYXRlZCBjb2RlIChlcXVpdmFsZW50IHRvXG5cCkBAIC0xNTcsNiArMTgzLDIwIEBACiBcICAgIC1ub3dhcm4gLXdhcm46bm9uZSBkaXNhYmxlIGFsbCB3YXJuaW5nc1xuXAogXCAgICAtPzp3YXJuIC1oZWxwOndhcm4gZGlzcGxheSBhZHZhbmNlZCB3YXJuaW5nIG9wdGlvbnNcblwKIFwgXG5cCitcIEVycm9yIG9wdGlvbnM6XG5cCitcICAgIC1lcnI6PHdhcm5pbmdzIHNlcGFyYXRlZCBieSAsPiAgICBjb252ZXJ0IGV4YWN0bHkgdGhlIGxpc3RlZCB3YXJuaW5nc1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVwb3J0ZWQgYXMgZXJyb3JzXG5cCitcICAgIC1lcnI6Kzx3YXJuaW5ncyBzZXBhcmF0ZWQgYnkgLD4gICBlbmFibGUgYWRkaXRpb25hbCB3YXJuaW5ncyB0byBiZVxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgZXJyb3JzXG5cCitcICAgIC1lcnI6LTx3YXJuaW5ncyBzZXBhcmF0ZWQgYnkgLD4gICBkaXNhYmxlIHNwZWNpZmljIHdhcm5pbmdzIHRvIGJlXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBhcyBlcnJvcnNcblwKK1wgXG5cCitcIFNldHRpbmcgd2FybmluZyBvciBlcnJvciBvcHRpb25zIHVzaW5nIHByb3BlcnRpZXMgZmlsZTpcblwKK1wgICAgLXByb3BlcnRpZXM6IDxmaWxlPiAgIHNldCB3YXJuaW5ncy9lcnJvcnMgb3B0aW9uIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNvbnRlbnRzLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB3aXRoIC1ub3dhcm4sXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAtZXJyOi4uIG9yIC13YXJuOi4uIG9wdGlvbnMsIGJ1dCB0aGUgbGFzdCBvbmUgb24gdGhlXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGxpbmUgc2V0cyB0aGUgb3B0aW9ucyB0byBiZSB1c2VkLlxuXAorXCBcblwKIFwgRGVidWcgb3B0aW9uczpcblwKIFwgICAgLWdbOmxpbmVzLHZhcnMsc291cmNlXSBjdXN0b20gZGVidWcgaW5mb1xuXAogXCAgICAtZzpsaW5lcyxzb3VyY2UgICsgYm90aCBsaW5lcyB0YWJsZSBhbmQgc291cmNlIGRlYnVnIGluZm9cblwKQEAgLTE2NiwyNyArMjA2LDIzIEBACiBcIFxuXAogXCBBbm5vdGF0aW9uIHByb2Nlc3Npbmcgb3B0aW9uczpcblwKIFwgICBUaGVzZSBvcHRpb25zIGFyZSBtZWFuaW5nZnVsIG9ubHkgaW4gYSAxLjYgZW52aXJvbm1lbnQuXG5cCi1cICAgIC1Ba2V5Wz12YWx1ZV0gICAgICAgIGFubm90YXRpb24gcHJvY2Vzc29ycyBvcHRpb25zIHRoYXQgYXJlIG1hZGUgdG9cblwKLVwgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiBwcm9jZXNzb3JzLiBrZXkgYXJlIGlkZW50aWZpZXJzIHNlcGFyYXRlZFxuXAotXCAgICAgICAgICAgICAgICAgICAgICAgICBieSAnJy4nJy5cblwKLVwgICAgLXByb2Nlc3NvcnBhdGggPGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzIHNlcGFyYXRlZCBieSB7MH0+XG5cCi1cICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbG9jYXRpb25zIHdoZXJlIHRvIGZpbmQgYW5ub3RhdGlvbiBwcm9jZXNzb3JzXG5cCitcICAgIC1Ba2V5Wz12YWx1ZV0gICAgICAgIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFubm90YXRpb24gcHJvY2Vzc29yc1xuXAorXCAgICAtcHJvY2Vzc29ycGF0aCA8ZGlyZWN0b3JpZXMgYW5kIFpJUCBhcmNoaXZlcyBzZXBhcmF0ZWQgYnkgezB9PlxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxvY2F0aW9ucyB3aGVyZSB0byBmaW5kIGFubm90YXRpb24gcHJvY2Vzc29ycy5cblwKIFwgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQsIHRoZSBjbGFzc3BhdGggd2lsbCBiZVxuXAotXCAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgcHJvY2Vzc29ycy5cblwKK1wgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHByb2Nlc3NvcnNcblwKIFwgICAgLXByb2Nlc3NvciA8Y2xhc3MxWyxjbGFzczIsLi4uXT5cblwKLVwgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkIG5hbWVzIG9mIHRoZSBhbm5vdGF0aW9uIHByb2Nlc3NvcnMgdG8gcnVuLlxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgbmFtZXMgb2YgdGhlIGFubm90YXRpb24gcHJvY2Vzc29ycyB0byBydW4uXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYnlwYXNzZXMgdGhlIGRlZmF1bHQgYW5ub3RhdGlvbiBkaXNjb3ZlcnkgcHJvY2Vzc1xuXAogXCAgICAtcHJvYzpvbmx5ICAgICAgICAgICBydW4gYW5ub3RhdGlvbiBwcm9jZXNzb3JzLCBidXQgZG8gbm90IGNvbXBpbGVcblwKIFwgICAgLXByb2M6bm9uZSAgICAgICAgICAgcGVyZm9ybSBjb21waWxhdGlvbiBidXQgZG8gbm90IHJ1biBhbm5vdGF0aW9uXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvcnNcblwKLVwgICAgLXMgPGRpcj4gICAgICAgICAgICAgc3BlY2lmeSBhIGRpcmVjdG9yeSB3aGVyZSB0byBwdXQgdGhlIGdlbmVyYXRlZCBzb3VyY2VcblwKLVwgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNcblwKLVwgICAgLVhwcmludFByb2Nlc3NvckluZm8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggYW5ub3RhdGlvbnMgYW5kIHdoaWNoXG5cCi1cICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGEgcHJvY2Vzc29yIGlzIGFza2VkIHRvIHByb2Nlc3NcblwKLVwgICAgLVhwcmludFJvdW5kcyAgICAgICAgcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIHJvdW5kcy5cblwKK1wgICAgLXMgPGRpcj4gICAgICAgICAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgc291cmNlIGZpbGVzXG5cCitcICAgIC1YcHJpbnRQcm9jZXNzb3JJbmZvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGFubm90YXRpb25zIGFuZCBlbGVtZW50c1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICBhIHByb2Nlc3NvciBpcyBhc2tlZCB0byBwcm9jZXNzXG5cCitcICAgIC1YcHJpbnRSb3VuZHMgICAgICAgIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGFubm90YXRpb24gcHJvY2Vzc2luZyByb3VuZHNcblwKIFwgICAgLWNsYXNzTmFtZXMgPGNsYXNzTmFtZTFbLGNsYXNzTmFtZTIsLi4uXT5cblwKLVwgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkIG5hbWVzIG9mIHRoZSBjbGFzc2VzIHRoYXQgbmVlZFxuXAotXCAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm9jZXNzZWRcblwKK1wgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWVzIG9mIGJpbmFyeSBjbGFzc2VzIHRvIHByb2Nlc3NcblwKIFwgXG5cCiBcIEFkdmFuY2VkIG9wdGlvbnM6XG5cCiBcICAgIEA8ZmlsZT4gICAgICAgICAgICByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZnJvbSBmaWxlXG5cCkBAIC0xOTQsOCArMjMwLDEwIEBACiBcICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0KVxuXAogXCAgICAtbG9nIDxmaWxlPiAgICAgICAgbG9nIHRvIGEgZmlsZS4gSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzICcnLnhtbCcnLCB0aGVuXG5cCiBcICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9nIHdpbGwgYmUgYSB4bWwgZmlsZS5cblwKLVwgICAgLXByb2NlZWRPbkVycm9yICAgIGRvIG5vdCBzdG9wIGF0IGZpcnN0IGVycm9yLCBkdW1waW5nIGNsYXNzIGZpbGVzIHdpdGhcblwKK1wgICAgLXByb2NlZWRPbkVycm9yWzpGYXRhbF1cblwKK1wgICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBzdG9wIGF0IGZpcnN0IGVycm9yLCBkdW1waW5nIGNsYXNzIGZpbGVzIHdpdGhcblwKIFwgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0gbWV0aG9kc1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgV2l0aCAiOkZhdGFsIiwgYWxsIG9wdGlvbmFsIGVycm9ycyBhcmUgdHJlYXRlZCBhcyBmYXRhbFxuXAogXCAgICAtdmVyYm9zZSAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugb3V0cHV0XG5cCiBcICAgIC1yZWZlcmVuY2VJbmZvICAgICBjb21wdXRlIHJlZmVyZW5jZSBpbmZvXG5cCiBcICAgIC1wcm9ncmVzcyAgICAgICAgICBzaG93IHByb2dyZXNzIChvbmx5IGluIC1sb2cgbW9kZSlcblwKQEAgLTIyMiw3OCArMjYwLDg0IEBACiB7M31cblwKIFwgXG5cCiBcIFdhcm5pbmcgb3B0aW9uczpcblwKLVwgICAgLWRlcHJlY2F0aW9uICAgICArIGRlcHJlY2F0aW9uIG91dHNpZGUgZGVwcmVjYXRlZCBjb2RlXG5cCitcICAgIC1kZXByZWNhdGlvbiAgICAgICAgICsgZGVwcmVjYXRpb24gb3V0c2lkZSBkZXByZWNhdGVkIGNvZGVcblwKIFwgICAgLW5vd2FybiAtd2Fybjpub25lIGRpc2FibGUgYWxsIHdhcm5pbmdzXG5cCiBcICAgIC13YXJuOjx3YXJuaW5ncyBzZXBhcmF0ZWQgYnkgLD4gICAgZW5hYmxlIGV4YWN0bHkgdGhlIGxpc3RlZCB3YXJuaW5nc1xuXAogXCAgICAtd2FybjorPHdhcm5pbmdzIHNlcGFyYXRlZCBieSAsPiAgIGVuYWJsZSBhZGRpdGlvbmFsIHdhcm5pbmdzXG5cCiBcICAgIC13YXJuOi08d2FybmluZ3Mgc2VwYXJhdGVkIGJ5ICw+ICAgZGlzYWJsZSBzcGVjaWZpYyB3YXJuaW5nc1xuXAorXCAgICAgIGFsbERlYWRDb2RlICAgICAgICAgIGRlYWQgY29kZSBpbmNsdWRpbmcgdHJpdmlhbCBpZihERUJVRykgY2hlY2tcblwKIFwgICAgICBhbGxEZXByZWNhdGlvbiAgICAgICBkZXByZWNhdGlvbiBpbmNsdWRpbmcgaW5zaWRlIGRlcHJlY2F0ZWQgY29kZVxuXAogXCAgICAgIGFsbEphdmFkb2MgICAgICAgICAgIGludmFsaWQgb3IgbWlzc2luZyBqYXZhZG9jXG5cCitcICAgICAgYWxsT3Zlci1hbm4gICAgICAgICAgYWxsIG1pc3NpbmcgQE92ZXJyaWRlIGFubm90YXRpb25zXG5cCitcICAgICAgYWxsLXN0YXRpYy1tZXRob2QgICAgYWxsIG1ldGhvZCBjYW4gYmUgZGVjbGFyZWQgYXMgc3RhdGljIHdhcm5pbmdzXG5cCiBcICAgICAgYXNzZXJ0SWRlbnRpZmllciAgICsgJydhc3NlcnQnJyB1c2VkIGFzIGlkZW50aWZpZXJcblwKIFwgICAgICBib3hpbmcgICAgICAgICAgICAgICBhdXRvYm94aW5nIGNvbnZlcnNpb25cblwKIFwgICAgICBjaGFyQ29uY2F0ICAgICAgICAgKyBjaGFyW10gaW4gU3RyaW5nIGNvbmNhdFxuXAorXCAgICAgIGNvbXBhcmVJZGVudGljYWwgICArIGNvbXBhcmluZyBpZGVudGljYWwgZXhwcmVzc2lvbnNcblwKIFwgICAgICBjb25kaXRpb25Bc3NpZ24gICAgICBwb3NzaWJsZSBhY2NpZGVudGFsIGJvb2xlYW4gYXNzaWdubWVudFxuXAogXCAgICAgIGNvbnN0cnVjdG9yTmFtZSAgICArIG1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWVcblwKK1wgICAgICBkZWFkQ29kZSAgICAgICAgICAgKyBkZWFkIGNvZGUgZXhjbHVkaW5nIHRyaXZpYWwgaWYgKERFQlVHKSBjaGVja1xuXAogXCAgICAgIGRlcC1hbm4gICAgICAgICAgICAgIG1pc3NpbmcgQERlcHJlY2F0ZWQgYW5ub3RhdGlvblxuXAogXCAgICAgIGRlcHJlY2F0aW9uICAgICAgICArIGRlcHJlY2F0aW9uIG91dHNpZGUgZGVwcmVjYXRlZCBjb2RlXG5cCiBcICAgICAgZGlzY291cmFnZWQgICAgICAgICsgdXNlIG9mIHR5cGVzIG1hdGNoaW5nIGEgZGlzY291cmFnZWQgYWNjZXNzIHJ1bGVcblwKIFwgICAgICBlbXB0eUJsb2NrICAgICAgICAgICB1bmRvY3VtZW50ZWQgZW1wdHkgYmxvY2tcblwKK1wgICAgICBlbnVtSWRlbnRpZmllciAgICAgICAnJ2VudW0nJyB1c2VkIGFzIGlkZW50aWZpZXJcblwKIFwgICAgICBlbnVtU3dpdGNoICAgICAgICAgICBpbmNvbXBsZXRlIGVudW0gc3dpdGNoXG5cCiBcICAgICAgZmFsbHRocm91Z2ggICAgICAgICAgcG9zc2libGUgZmFsbC10aHJvdWdoIGNhc2VcblwKIFwgICAgICBmaWVsZEhpZGluZyAgICAgICAgICBmaWVsZCBoaWRpbmcgYW5vdGhlciB2YXJpYWJsZVxuXAogXCAgICAgIGZpbmFsQm91bmQgICAgICAgICAgIHR5cGUgcGFyYW1ldGVyIHdpdGggZmluYWwgYm91bmRcblwKIFwgICAgICBmaW5hbGx5ICAgICAgICAgICAgKyBmaW5hbGx5IGJsb2NrIG5vdCBjb21wbGV0aW5nIG5vcm1hbGx5XG5cCiBcICAgICAgZm9yYmlkZGVuICAgICAgICAgICsgdXNlIG9mIHR5cGVzIG1hdGNoaW5nIGEgZm9yYmlkZGVuIGFjY2VzcyBydWxlXG5cCitcICAgICAgaGFzaENvZGUgICAgICAgICAgICAgIG1pc3NpbmcgaGFzaENvZGUoKSBtZXRob2Qgd2hlbiBvdmVycmlkaW5nIGVxdWFscygpXG5cCiBcICAgICAgaGlkaW5nICAgICAgICAgICAgICAgbWFjcm8gZm9yIGZpZWxkSGlkaW5nLCBsb2NhbEhpZGluZywgdHlwZUhpZGluZyBhbmRcblwKIFwgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrZWRDYXRjaEJsb2NrXG5cCi1cICAgICAgaW5jb21wbGV0ZS1zd2l0Y2ggICAgc2FtZSBhcyBlbnVtU3dpdGNoXG5cCitcICAgICAgaW5jbHVkZUFzc2VydE51bGwgICAgcmFpc2UgbnVsbCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBnb3QgdGFpbnRlZCBpbiBhbiBhc3NlcnQgZXhwcmVzc2lvblxuXAogXCAgICAgIGluZGlyZWN0U3RhdGljICAgICAgIGluZGlyZWN0IHJlZmVyZW5jZSB0byBzdGF0aWMgbWVtYmVyXG5cCiBcICAgICAgaW50ZkFubm90YXRpb24gICAgICsgYW5ub3RhdGlvbiB0eXBlIHVzZWQgYXMgc3VwZXIgaW50ZXJmYWNlXG5cCiBcICAgICAgaW50Zk5vbkluaGVyaXRlZCAgICsgaW50ZXJmYWNlIG5vbi1pbmhlcml0ZWQgbWV0aG9kIGNvbXBhdGliaWxpdHlcblwKK1wgICAgICBpbnRmUmVkdW5kYW50ICAgICAgICBmaW5kIHJlZHVuZGFudCBzdXBlcmludGVyZmFjZXNcblwKIFwgICAgICBqYXZhZG9jICAgICAgICAgICAgICBpbnZhbGlkIGphdmFkb2NcblwKIFwgICAgICBsb2NhbEhpZGluZyAgICAgICAgICBsb2NhbCB2YXJpYWJsZSBoaWRpbmcgYW5vdGhlciB2YXJpYWJsZVxuXAogXCAgICAgIG1hc2tlZENhdGNoQmxvY2sgICArIGhpZGRlbiBjYXRjaCBibG9ja1xuXAogXCAgICAgIG5scyAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXRlcmFsIGxhY2tpbmcgbm9uLW5scyB0YWcgLy8kTk9OLU5MUy08bj4kXG5cCiBcICAgICAgbm9FZmZlY3RBc3NpZ24gICAgICsgYXNzaWdubWVudCB3aXRob3V0IGVmZmVjdFxuXAogXCAgICAgIG51bGwgICAgICAgICAgICAgICAgIHBvdGVudGlhbCBtaXNzaW5nIG9yIHJlZHVuZGFudCBudWxsIGNoZWNrXG5cCi1cICAgICAgbnVsbERlcmVmZXJlbmNlICAgICAgbWlzc2luZyBudWxsIGNoZWNrXG5cCi1cICAgICAgb3Zlci1hbm4gICAgICAgICAgICAgbWlzc2luZyBAT3ZlcnJpZGUgYW5ub3RhdGlvblxuXAorXCAgICAgIG51bGxEZXJlZmVyZW5jZSAgICArIG1pc3NpbmcgbnVsbCBjaGVja1xuXAorXCAgICAgIG92ZXItYW5uICAgICAgICAgICAgIG1pc3NpbmcgQE92ZXJyaWRlIGFubm90YXRpb24gKHN1cGVyY2xhc3MpXG5cCiBcICAgICAgcGFyYW1Bc3NpZ24gICAgICAgICAgYXNzaWdubWVudCB0byBhIHBhcmFtZXRlclxuXAogXCAgICAgIHBrZ0RlZmF1bHRNZXRob2QgICArIGF0dGVtcHQgdG8gb3ZlcnJpZGUgcGFja2FnZS1kZWZhdWx0IG1ldGhvZFxuXAogXCAgICAgIHJhdyAgICAgICAgICAgICAgICArIHVzYWdlIG9mIHJhdyB0eXBlXG5cCiBcICAgICAgc2VtaWNvbG9uICAgICAgICAgICAgdW5uZWNlc3Nhcnkgc2VtaWNvbG9uLCBlbXB0eSBzdGF0ZW1lbnRcblwKIFwgICAgICBzZXJpYWwgICAgICAgICAgICAgKyBtaXNzaW5nIHNlcmlhbFZlcnNpb25VSURcblwKLVwgICAgICBzcGVjaWFsUGFyYW1IaWRpbmcgICBjb25zdHJ1Y3RvciBvciBzZXR0ZXIgcGFyYW1ldGVyIGhpZGluZyBhbm90aGVyIGZpZWxkXG5cCitcICAgICAgc3BlY2lhbFBhcmFtSGlkaW5nICAgY29uc3RydWN0b3Igb3Igc2V0dGVyIHBhcmFtZXRlciBoaWRpbmcgYSBmaWVsZFxuXAorXCAgICAgIHN0YXRpYy1tZXRob2QgICAgICAgIG1ldGhvZCBjYW4gYmUgZGVjbGFyZWQgYXMgc3RhdGljXG5cCiBcICAgICAgc3RhdGljLWFjY2VzcyAgICAgICAgbWFjcm8gZm9yIGluZGlyZWN0U3RhdGljIGFuZCBzdGF0aWNSZWNlaXZlclxuXAogXCAgICAgIHN0YXRpY1JlY2VpdmVyICAgICArIG5vbi1zdGF0aWMgcmVmZXJlbmNlIHRvIHN0YXRpYyBtZW1iZXJcblwKIFwgICAgICBzdXBlciAgICAgICAgICAgICAgICBvdmVycmlkaW5nIGEgbWV0aG9kIHdpdGhvdXQgbWFraW5nIGEgc3VwZXIgaW52b2NhdGlvblxuXAogXCAgICAgIHN1cHByZXNzICAgICAgICAgICArIGVuYWJsZSBAU3VwcHJlc3NXYXJuaW5nc1xuXAotXCAgICAgIHN5bnRoZXRpYy1hY2Nlc3MgICAgIHNhbWUgYXMgc3ludGhldGljQWNjZXNzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2VkIHdpdGggLWVycjosIGl0IGNhbiBhbHNvIHNpbGVudCBvcHRpb25hbFxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyBhbmQgd2FybmluZ3NcblwKK1wgICAgICBzeW5jT3ZlcnJpZGUgICAgICAgICBtaXNzaW5nIHN5bmNocm9uaXplZCBpbiBzeW5jaHIuIG1ldGhvZCBvdmVycmlkZVxuXAogXCAgICAgIHN5bnRoZXRpY0FjY2VzcyAgICAgIHN5bnRoZXRpYyBhY2Nlc3MgZm9yIGlubmVyY2xhc3NcblwKIFwgICAgICB0YXNrcyg8dGFncyBzZXBhcmF0ZWQgYnkgfD4pIHRhc2tzIGlkZW50aWZpZWQgYnkgdGFncyBpbnNpZGUgY29tbWVudHNcblwKIFwgICAgICB0eXBlSGlkaW5nICAgICAgICAgKyB0eXBlIHBhcmFtZXRlciBoaWRpbmcgYW5vdGhlciB0eXBlXG5cCitcICAgICAgdW5hdm9pZGFibGVHZW5lcmljUHJvYmxlbXMgKyBpZ25vcmUgdW5hdm9pZGFibGUgdHlwZSBzYWZldHkgcHJvYmxlbXNcblwKK1wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byByYXcgQVBJc1xuXAogXCAgICAgIHVuY2hlY2tlZCAgICAgICAgICArIHVuY2hlY2tlZCB0eXBlIG9wZXJhdGlvblxuXAogXCAgICAgIHVubmVjZXNzYXJ5RWxzZSAgICAgIHVubmVjZXNzYXJ5IGVsc2UgY2xhdXNlXG5cCi1cICAgICAgdW5xdWFsaWZpZWQtZmllbGQtYWNjZXNzIHNhbWUgYXMgdW5xdWFsaWZpZWRGaWVsZFxuXAogXCAgICAgIHVucXVhbGlmaWVkRmllbGQgICAgIHVucXVhbGlmaWVkIHJlZmVyZW5jZSB0byBmaWVsZFxuXAotXCAgICAgIHVudXNlZCAgICAgICAgICAgICAgIG1hY3JvIGZvciB1bnVzZWRBcmd1bWVudCwgdW51c2VkSW1wb3J0LCB1bnVzZWRMYWJlbCxcblwKLVwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkTG9jYWwsIHVudXNlZFByaXZhdGUgYW5kIHVudXNlZFRocm93blxuXAorXCAgICAgIHVudXNlZCAgICAgICAgICAgICAgIG1hY3JvIGZvciB1bnVzZWRBbGxvY2F0aW9uLCB1bnVzZWRBcmd1bWVudCxcblwKK1wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkSW1wb3J0LCB1bnVzZWRMYWJlbCwgdW51c2VkTG9jYWwsXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZFByaXZhdGUsIHVudXNlZFRocm93biwgYW5kIHVudXNlZFR5cGVBcmdzXG5cCitcICAgICAgdW51c2VkQWxsb2NhdGlvbiAgICAgYWxsb2NhdGluZyBhbiBvYmplY3QgdGhhdCBpcyBub3QgdXNlZFxuXAogXCAgICAgIHVudXNlZEFyZ3VtZW50ICAgICAgIHVucmVhZCBtZXRob2QgcGFyYW1ldGVyXG5cCiBcICAgICAgdW51c2VkSW1wb3J0ICAgICAgICsgdW51c2VkIGltcG9ydCBkZWNsYXJhdGlvblxuXAogXCAgICAgIHVudXNlZExhYmVsICAgICAgICArIHVudXNlZCBsYWJlbFxuXAogXCAgICAgIHVudXNlZExvY2FsICAgICAgICArIHVucmVhZCBsb2NhbCB2YXJpYWJsZVxuXAogXCAgICAgIHVudXNlZFByaXZhdGUgICAgICArIHVudXNlZCBwcml2YXRlIG1lbWJlciBkZWNsYXJhdGlvblxuXAogXCAgICAgIHVudXNlZFRocm93biAgICAgICAgIHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uXG5cCitcICAgICAgdW51c2VkVHlwZUFyZ3MgICAgICsgdW51c2VkIHR5cGUgYXJndW1lbnRzIGZvciBtZXRob2QgYW5kIGNvbnN0cnVjdG9yXG5cCiBcICAgICAgdXNlbGVzc1R5cGVDaGVjayAgICAgdW5uZWNlc3NhcnkgY2FzdC9pbnN0YW5jZW9mIG9wZXJhdGlvblxuXAogXCAgICAgIHZhcmFyZ3NDYXN0ICAgICAgICArIHZhcmFyZ3MgYXJndW1lbnQgbmVlZCBleHBsaWNpdCBjYXN0XG5cCi1cICAgICAgd2FybmluZ1Rva2VuICAgICAgICsgdW5oYW5kbGVkIHdhcm5pbmcgdG9rZW4gaW4gQFN1cHByZXNzV2FybmluZ3NcblwKLVwgXG5cCi1cIEFkdmFuY2VkIG9wdGlvbnM6XG5cCi1cICAgIC0/IC1oZWxwICAgICAgICAgICBwcmludCB0aGUgaGVscCBtZXNzYWdlXG5cCi0KLSMgdGVtcGxhdGVzCi0jIyMgYWNjZXNzIHJlc3RyaWN0aW9ucwotdGVtcGxhdGUucmVzdHJpY3RlZEFjY2Vzcy50eXBlID0gVGhlIHR5cGUgezB9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiBjbGFzc3BhdGggZW50cnkgezF9Ci10ZW1wbGF0ZS5yZXN0cmljdGVkQWNjZXNzLmNvbnN0cnVjdG9yID0gVGhlIGNvbnN0cnVjdG9yIHswfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gY2xhc3NwYXRoIGVudHJ5IHsxfQotdGVtcGxhdGUucmVzdHJpY3RlZEFjY2Vzcy5maWVsZCA9IFRoZSBmaWVsZCB7MH0gZnJvbSB0aGUgdHlwZSB7MX0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIGNsYXNzcGF0aCBlbnRyeSB7Mn0KLXRlbXBsYXRlLnJlc3RyaWN0ZWRBY2Nlc3MubWV0aG9kID0gVGhlIG1ldGhvZCB7MH0gZnJvbSB0aGUgdHlwZSB7MX0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIGNsYXNzcGF0aCBlbnRyeSB7Mn0KK1wgICAgICB3YXJuaW5nVG9rZW4gICAgICAgKyB1bnN1cHBvcnRlZCBvciB1bm5lY2Vzc2FyeSBAU3VwcHJlc3NXYXJuaW5nc1xuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZC5hanByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZC5hanByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmZiMDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGQuYWpwcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc3JjLmluY2x1ZGVzID0gYW50YWRhcHRlci8sXAotICAgICAgICAgICAgICAgYXNwZWN0ai8sXAotICAgICAgICAgICAgICAgYmF0Y2gvLFwKLSAgICAgICAgICAgICAgIGNvZGVhc3Npc3QvLFwKLSAgICAgICAgICAgICAgIGNvbXBpbGVyLyxcCi0gICAgICAgICAgICAgICBkb20vLFwKLSAgICAgICAgICAgICAgIGV2YWwvLFwKLSAgICAgICAgICAgICAgIGZvcm1hdHRlci8sXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHNlYXJjaC8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDhmYTk4MjQuLmZmNTIwZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGQucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05LDYgKzksNyBAQAogIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBjdXN0b21CdWlsZENhbGxiYWNrcz1jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKK2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLmluaGVyaXRhbGw9dHJ1ZQogYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCiAgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCiAgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKQEAgLTI0LDE2ICsyNSwxOSBAQAogICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qLFwKICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS4qLFwKICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKgotc291cmNlLi4gPSAJIGJhdGNoLyxcCitzb3VyY2UuLiA9ICAgYmF0Y2gvLFwKIAkgICAgICAgICBjb2RlYXNzaXN0LyxcCiAJICAgICAgICAgY29tcGlsZXIvLFwKIAkgICAgICAgICBldmFsLyxcCiAJICAgICAgICAgZm9ybWF0dGVyLyxcCiAJICAgICAgICAgZG9tLyxcCi0JICAgICAgICAgbW9kZWwvLFwKLQkgICAgICAgICBzZWFyY2gvCisJICAgICAgICAgc2VhcmNoLyxcCisJICAgICAgICAgbW9kZWwvCitvdXRwdXQuLiA9IGJpbi8KK291dHB1dC5qZHRDb21waWxlckFkYXB0ZXIuamFyID0gYW50YmluLwogc291cmNlLmpkdENvbXBpbGVyQWRhcHRlci5qYXIgPSBhbnRhZGFwdGVyLwogamFycy5jb21waWxlLm9yZGVyPS4samR0Q29tcGlsZXJBZGFwdGVyLmphcgogamFycy5leHRyYS5jbGFzc3BhdGg9cGxhdGZvcm06L3BsdWdpbi9vcmcuYXBhY2hlLmFudC9saWIvYW50Lmphcgogc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCiAgICAgICAgICAgICAgICBzY2hlbWEvCitnZW5lcmF0ZVNvdXJjZVJlZmVyZW5jZXM9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCmluZGV4IDE1ZGU2YjkuLjBlOTJiNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTMsMzQ4NCArMywyMjQxIEBACiA8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgogICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPHRpdGxlPkpEVC9Db3JlIFJlbGVhc2UgTm90ZXMgMy4zPC90aXRsZT4KKyAgIDx0aXRsZT5KRFQvQ29yZSBSZWxlYXNlIE5vdGVzIDMuNzwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImpkdF9jb3JlX3N0eWxlLmNzcyIgY2hhcnNldD0iaXNvLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgogPC9oZWFkPgogPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+CiA8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CiAgIDx0cj4KICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI3MiUiIGNsYXNzPSJ0aXRsZTEiPgotICAgICAgPGZvbnQgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMy4zIHN0cmVhbTwvYj48L2ZvbnQ+CisgICAgICA8Zm9udCBzaXplPSIrMyI+PGI+amR0IGNvcmUgLSBidWlsZCBub3RlcyAzLjcgc3RyZWFtPC9iPjwvZm9udD4KICAgICA8L3RkPgogICA8L3RyPgotICA8dHI+PHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj48Zm9udCBzaXplPSItMiI+amF2YSBkZXZlbG9wbWVudCB0b29saW5nIGNvcmU8L2ZvbnQ+PC90ZD48L3RyPgorICA8dHI+PHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj48Zm9udCBzaXplPSItMiI+SmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9mb250PjwvdGQ+PC90cj4KICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CiAgIDx0cj4KICAgCTx0ZCBjbGFzcz0idGl0bGUzIj4KIAkgIDxmb250IHNpemU9Ii0xIj4KIAkgIEhlcmUgYXJlIHRoZSBidWlsZCBub3RlcyBmb3IgdGhlIEVjbGlwc2UgSkRUL0NvcmUgcGx1Zy1pbiBwcm9qZWN0CiAJICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL2luZGV4LnBocCI+PGI+b3JnLmVjbGlwc2UuamR0LmNvcmU8L2I+PC9hPiwKLQkgIGRlc2NyaWJpbmcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncyIgdGFyZ2V0PW5ldz5idWc8L2E+IHJlc29sdXRpb24gYW5kIHN1YnN0YW50aWFsIGNoYW5nZXMgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfM19tYWludGVuYW5jZSI+PGI+UjNfM19tYWludGVuYW5jZTwvYj48L2E+IGJyYW5jaC4KLSAgICAgPCEtLQotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gMy4zIHBsYW5uaW5nLCBwbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9yMy4zL2luZGV4LnBocCNyZWxlYXNlLXBsYW4iPkpEVC9Db3JlIHJlbGVhc2UgcGxhbjwvYT4sCi0JICB0aGUgbmV4dCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjMvaW5kZXgucGhwI21pbGVzdG9uZS1wbGFuIj5taWxlc3RvbmUgcGxhbjwvYT4sCi0JICB0aGUgb3ZlcmFsbCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvZGV2ZWxvcG1lbnQvZWNsaXBzZV9wcm9qZWN0X3BsYW5fM18yLmh0bWwiPm9mZmljaWFsIHBsYW48L2E+LAorCSAgZGVzY3JpYmluZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncyIgdGFyZ2V0PW5ldz5idWc8L2E+IHJlc29sdXRpb24gYW5kIHN1YnN0YW50aWFsIGNoYW5nZXMgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUiPjxiPkhFQUQ8L2I+PC9hPiBicmFuY2guCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAzLjcgcGxhbm5pbmcsIHBsZWFzZSByZWZlciB0byA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjcvcGxhbi5waHAiPkpEVC9Db3JlIHJlbGVhc2UgcGxhbjwvYT4sCisJICB0aGUgbmV4dCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjcvcGxhbi5waHAjY3VycmVudC1taWxlc3RvbmUiPm1pbGVzdG9uZSBwbGFuPC9hPiwKKwkgIHRoZSBvdmVyYWxsIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHJvamVjdHMvcHJvamVjdC1wbGFuLnBocD9wbGFudXJsPWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9kZXZlbG9wbWVudC9wbGFucy9lY2xpcHNlX3Byb2plY3RfcGxhbl8zXzcueG1sIj5vZmZpY2lhbCBwbGFuPC9hPiwKIAkgIG9yIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvcGxhdGZvcm0tcmVsZW5nL2J1aWxkU2NoZWR1bGUuaHRtbCI+YnVpbGQgc2NoZWR1bGU8L2E+LgotICAgICAtLT4KLQkgIDwhLS0KLQkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgc2luY2UgUmVsZWFzZSAzLjAgKGFsc28gc2VlIGEgc3VtbWFyeSBvZiA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwiPkFQSSBjaGFuZ2VzPC9hPikuCi0JICBPbGRlciBjaGFuZ2VzIHdoaWNoIG9jY3VycmVkIHVwIHRvIFJlbGVhc2UgMy4wIGNhbiBiZSBmb3VuZCBpbiAKLQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIxX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCI+YnVpbGQgbm90ZXMgUjIuMTwvYT4uCi0JICAtLT4KLQkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgc2luY2UgUmVsZWFzZSAzLjMgKGFsc28gc2VlIGEgc3VtbWFyeSBvZiA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwiPkFQSSBjaGFuZ2VzPC9hPikuCi0JICA8YnI+TWFpbnRlbmFuY2Ugb2YgcHJldmlvdXMgcmVsZWFzZXMgb2YgSkRUL0NvcmUgaXMgcGVyZm9ybWVkIGluIHBhcmFsbGVsIGJyYW5jaGVzOiAKKwkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgc2luY2UgUmVsZWFzZSAzLjYgKGFsc28gc2VlIGEgc3VtbWFyeSBvZiA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwiPkFQSSBjaGFuZ2VzPC9hPikuCisJICA8YnI+TWFpbnRlbmFuY2Ugb2YgcHJldmlvdXMgcmVsZWFzZXMgb2YgSkRUL0NvcmUgaXMgcGVyZm9ybWVkIGluIHBhcmFsbGVsIGJyYW5jaGVzOgorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfNl9tYWludGVuYW5jZSI+UjMuNi54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzVfbWFpbnRlbmFuY2UiPlIzLjUueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM180X21haW50ZW5hbmNlIj5SMy40Lng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfM19tYWludGVuYW5jZSI+UjMuMy54PC9hPiwKIAkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzJfbWFpbnRlbmFuY2UiPlIzLjIueDwvYT4sCiAJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18xX21haW50ZW5hbmNlIj5SMy4xLng8L2E+LAogCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfMF9tYWludGVuYW5jZSI+UjMuMC54PC9hPiwKIAkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIyXzFfbWFpbnRlbmFuY2UiPlIyLjEueDwvYT4sCi0JCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SMl8wXzEiPlIyLjAueDwvYT4sIAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjJfMF8xIj5SMi4wLng8L2E+LAogCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9RUNMSVBTRV8xXzAiPlIxLjAueDwvYT4uCiAJICA8L2ZvbnQ+CiAJPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08YSBuYW1lPSJ2Xzc4NV9SMzN4Ij48L2E+Cis8YSBuYW1lPSJ2X0I3OV9SMzd4Ij48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuMy4yIC0gTm92ZW1iZXIgMTQsIDIwMDcgLSAzLjMuMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83ODVfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83ODVfUjMzeCI+Y3ZzPC9hPikuCitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43LjIgLSBOb3ZlbWJlciAyMywgMjAxMSAtIDMuNy4yCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I3OV9SMzd4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I3OV9SMzd4Ij5jdnM8L2E+KS4KIDxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NTk2Ij4xNzg1OTY8L2E+Ci1bc2VhcmNoXSBTZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIGRvZXMgbm90IGZpbmQgcmVmZXJlbmNlcyB0byBpbnRlcmZhY2UgbWV0aG9kCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5MTUwIj4yMDkxNTA8L2E+Ci1bZG9tXSBSZWNvdmVyZWQgdHlwZSBiaW5kaW5nIGZvciAmcXVvdDtqYXZhLmxhbmcuT2JqZWN0JnF1b3Q7IGluZm9ybWF0aW9uIGFyZSBub3QgY29tcGxldGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY0MTAiPjE4NjQxMDwvYT4KLVtkb21dIFN0YWNrT3ZlcmZsb3dFcnJvciBkdWUgdG8gZW5kbGVzcyBzdXBlcmNsYXNzIGJpbmRpbmdzIGhpZXJhcmNoeQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTE1MyI+MjA5MTUzPC9hPgotWzEuNV1bY29tcGlsZXJdIFZlcmlmeUVycm9yIGR1ZSB0byBnZW5lcmljIGNhc3QgdG8gYSBub24gdmlzaWJsZSB0eXBlCis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYxMDUzIj4zNjEwNTM8L2E+CitqYXZhLmxhbmcuVmVyaWZ5RXJyb3Igb24gdHJ5LXdpdGgtcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NzExMCI+MzU3MTEwPC9hPgorUHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgcmVmZXJlbmNlZCBmcm9tIGphcnMgb3IgY2xhc3MgZm9sZGVyczogJnF1b3Q7VGhlIHR5cGUgLi4uIGNhbm5vdCBiZSByZXNvbHZlZCZxdW90OworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjI1OTEiPjM2MjU5MTwvYT4KK1ZlcmlmeUVycm9yOiBJbmNvbnNpc3RlbnQgc3RhY2ttYXAgZnJhbWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzA2MCI+MzQzMDYwPC9hPgorTWV0aG9kLmdldE1ldGhvZHMoKSByZXR1cm5zIGRpZmZlcmVudCBtZXRob2RzIChjb21wYXJlZCB0byBzdGFuZGFyZCBjb21waWxlcikgZm9yIHB1YmxpYy9ub24tcHVibGljIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2MTQ0MSI+MzYxNDQxPC9hPgorRXJyb3IgaW4gSkRUIENvcmUgZHVyaW5nIEFTVCBjcmVhdGlvbgogCi08YSBuYW1lPSJ2Xzc4NF9SMzN4Ij48L2E+Cis8YSBuYW1lPSJ2X0I3OF9SMzd4Ij48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuMy4yIC0gTm92ZW1iZXIgNywgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83ODRfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83ODRfUjMzeCI+Y3ZzPC9hPikuCitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43LjIgLSBOb3ZlbWJlciAxNiwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNzhfUjM3eAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNzhfUjM3eCI+Y3ZzPC9hPikuCiA8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzU3MyI+MjA3NTczPC9hPgotWzEuNV1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yOiBDbGFzc0Nhc3RFeGNlcHRpb24gLyBBcnJheUJpbmRpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDgyNjMiPjIwODI2MzwvYT4KLVthc3QgcmV3cml0ZV0gcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2l0aCBsb3RzIG9mIGNoYW5nZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDc0NDEiPjIwNzQ0MTwvYT4KLVdyb25nIGRlbHRhIGZvciBmaWxlcyBjcmVhdGVkIGluIGZvbGRlcnMgdGhhdCBhcmUgb24gYSBqYXZhIHByb2plY3QgYXMgY2xhc3NlcyBmb2xkZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTMyMTAiPjE5MzIxMDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbnRlcm5hbCBjb21waWxlciBlcnJvciBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjE5MzgiPjM2MTkzODwvYT4KK0Zvcm1lcmx5IHdvcmtpbmcgSkxTMyBwYXJzZXIgbm90IHdvcmtpbmcgLS0gU2Nhbm5lciByZXBvcnRzIGNvbS5zdW4uamRpLkludm9jYXRpb25FeGNlcHRpb24gb2NjdXJyZWQgaW52b2tpbmcgbWV0aG9kLgogCi08YSBuYW1lPSJ2Xzc4M19SMzN4Ij48L2E+Cis8YSBuYW1lPSJ2X0I3N19SMzd4Ij48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuMy4yIC0gT2N0b2JlciAyNCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83ODNfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83ODNfUjMzeCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTg2MCI+MjA1ODYwPC9hPgotQVNUUGFyc2VyLmNyZWF0ZUJpbmRpbmdzKCkgcmV0dXJucyBbbnVsbF0KLQotPGEgbmFtZT0idl83ODJfUjMzeCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMuMiAtIE9jdG9iZXIgMTcsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzgyX1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzgyX1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQ4NDUiPjIwNDg0NTwvYT4KLUJhdGNoQ29tcGlsZXJUZXN0IHRlc3RzIGZhaWwgd2hlbiB0aGUgcnVudGltZSBKUkUgcG9pbnRzIHRvIGEgcGF0aCBjb250YWluaW5nIHdoaXRlIHNwYWNlcwotCi0KLTxhIG5hbWU9InZfNzgxX1IzM3giPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zLjIgLSBPY3RvYmVyIDEwLCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc4MV9SMzN4Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc4MV9SMzN4Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNDA0Ij4yMDI0MDQ8L2E+Ci1bMS41XVtjb21waWxlcl0gSW5jb3JyZWN0IGhhbmRsaW5nIG9mIHR5cGUgdmFyaWFibGUgYm91bmRzIGlzc3VlZCBieSBjYXB0dXJlIGNvbnZlcnNpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkyMTQiPjE1OTIxNDwvYT4KLVsxLjVdIFtjb21waWxlcl0gRWNsaXBzZSBjb21waWxlciB3aWxkY2FyZCBidWcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMzMTgiPjIwMzMxODwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbXByb3BlciBjYXB0dXJlIG9mIHdpbGRjYXJkIHdpdGggbGVzc2VyIGJvdW5kIHRoYW4gcGFyYW1ldGVyIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTA0OSI+MTY5MDQ5PC9hPgotWzEuNV1bY29tcGlsZXJdIEJvZ3VzIGJvdW5kIG1pc21hdGNoIGVycm9ycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzkwNSI+MjAzOTA1PC9hPgotWzEuNV1bY29tcGlsZXJdIHNob3dzIHdyb25nIGVycm9yIHdpdGggZ2VuZXJpY3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMwNjEiPjIwMzA2MTwvYT4KLVtjb21waWxlcl0gVW5pbml0aWFsaXplZCBtZW1iZXIgdmFyaWFibGVzIHVzZWQgaW4gbm9uc3RhdGljIGluaXRpYWxpemVycyBvZiBwZWVyIG1lbWJlcnMgZG9uJ3QgdHJpZ2dlciBjb21waWxhdGlvbiBlcnJvciAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQ2MjQiPjIwNDYyNDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBObyBlcnJvciBvbiBhYnN0cmFjdCBtZXRob2QgaW1wbGVtZW50YXRpb24gd2l0aCBtaXNzaW5nIHBhcmFtZXRlciBnZW5lcmljcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzY2MiI+MjAzNjYyPC9hPgotUGVyZjogVW5uZWNlc3NhcnkgY29tcGlsYXRpb24gd2hlbiBwYWNrYWdlIGFkZGVkIHRvIHNlY29uZCBzb3VyY2Ugcm9vdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDY1MiI+MjA0NjUyPC9hPgotJnF1b3Q7T3BlbiBUeXBlJnF1b3Q7OiBDbGFzc0Nhc3RFeGNlcHRpb24gaW4gY29uanVuY3Rpb24gd2l0aCBhIGNsYXNzIGZvbGRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDE1OCI+MjAwMTU4PC9hPgotW2NvbXBpbGVyXSBpbmNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgdW5yZWFjaGFibGUgY29kZQotCi08YSBuYW1lPSJ2Xzc4MF9SMzN4Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuMy4xIC0gU2VwdGVtYmVyIDE1LCAyMDA3IC0gMy4zLjEgUkVMRUFTRSAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzgwX1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzgwX1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM0NTQiPjIwMzQ1NDwvYT4KLU5QRSBpbiBjb21waWxlciB3aGVuIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMKLQotPGEgbmFtZT0idl83NzlfUjMzeCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMuMSAtIEF1Z3VzdCAzMSwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NzlfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NzlfUjMzeCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTY2OCI+MTk5NjY4PC9hPgotSUFFIGluIEFTVE5vZGUuc2V0U291cmNlUmFuZ2Ugd2hpbGUgZWRpdGluZyBhIGNsYXNzCi0KLTxhIG5hbWU9InZfNzc4X1IzM3giPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zLjEgLSBBdWd1c3QgMjksIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzc4X1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzc4X1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTA2MjIiPjE5MDYyMjwvYT4KLXR5cGUgYmluZGluZyBtYXJrZWQgYXMgcmVjb3ZlcmVkIGJ1dCBhbGwgaXMgY29tcGlsaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMTA0Ij4yMDExMDQ8L2E+Ci1KYXZhRWxlbWVudCBvZiBhIHJlY292ZXJlZCB0eXBlIGJpbmRpbmcgc2hvdWxkIG5vdCByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0IHdpdGggbm8gcGFyZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MDUxIj4xOTgwNTE8L2E+Ci1bMS41XVtjb21waWxlcl0gSW1wcm9wZXIgUG9seW1vcnBoaWMgRXhjZXB0aW9uIEhhbmRsaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkxNzM5Ij4xOTE3Mzk8L2E+Ci0iRHVwbGljYXRlIG5lc3RlZCB0eXBlIiBib2d1cyBlcnJvciBvbiBzdGF0aWMgY2xhc3Mgb2YgYWJzdHJhY3QgY2xhc3Mgb3IgaW50ZXJmYWNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMTE3Ij4xODMxMTc8L2E+Ci1Vc2VyIExpYnJhcnkgTG9zdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODA4NSI+MTk4MDg1PC9hPgotSW52YWxpZCBhbm5vdGF0aW9uIGNyYWNrcyB0aGUgYW5ub3RhdGlvbiBwYXJzaW5nCi0KLTxhIG5hbWU9InZfNzc3X1IzM3giPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zLjEgLSBBdWd1c3QgMjIsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzc3X1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzc3X1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA1NDciPjIwMDU0NzwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbnZhbGlkIGFtYmlndW91cyBlcnJvciB3aGVuIGNhbGxpbmcgYW4gb3ZlcnJpZGVuIGdlbmVyaWMgbWV0aG9kIHdpdGggTVVMVElQTEUgYm91bmRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MTIwIj4xOTgxMjA8L2E+Ci1bMS41XVtjb21waWxlcl0gQ2Fubm90IGRpcmVjdGx5IGludm9rZSB0aGUgYWJzdHJhY3QgbWV0aG9kIGh1Y2goSTEpIGZvciB0aGUgdHlwZSBJMQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NjI1NCI+MTk2MjU0PC9hPgotT3ZlcnJpZGVzIHdyb25nIGZvciB3aWxkY2FyZCBwYXJhbWV0ZXJpemVkIG1ldGhvZHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTMyNjUiPjE5MzI2NTwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbmNvcnJlY3QgYW1iaWd1b3VzIG1ldGhvZCBlcnJvciBpbnZvbHZpbmcgYWJzdHJhY3QgY2xhc3NlcyBhbmQgZW51bXMKLQotPGEgbmFtZT0idl83NzZfUjMzeCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMuMSAtIEF1Z3VzdCAxNSwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NzZfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NzZfUjMzeCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODM2MiI+MTk4MzYyPC9hPgotRm9ybWF0dGVyIHN0b3BzIHdvcmtpbmcgd2hlbiBzb3VyY2UgY29kZSBjb250YWlucyBmb2xsb3dpbmcgbGluZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTYzNiI+MTA5NjM2PC9hPgotQ29tbWVudCBmb3JtYXR0ZXIgZG9lc24ndCBzdXBwb3J0ICZxdW90OyZhbXA7IzQyOy8mcXVvdDsKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgxNTMiPjE5ODE1MzwvYT4KLVtmb3JtYXR0ZXJdIGFkZHMgZXh0cmEgc3BhY2UgYmVmb3JlIGV4cGFuZGVkIG51bWVyaWNhbCBlbnRpdHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTcxNjkiPjE5NzE2OTwvYT4KLUZvcm1hdHRlciBleHBhbmRzICZhbXA7IzY0OyBpbiBhbm5vdGF0aW9uIGluIGphdmFkb2MsIGNyZWF0aW5nIGludmFsaWQgdGFnCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2MTE0Ij4xODYxMTQ8L2E+Ci1JTWV0aG9kQmluZGluZy5vdmVycmlkZXMoLi4pIHNob3VsZCBjb25zaWRlciBzdGF0aWMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTIyODUiPjE5MjI4NTwvYT4KLVtmb3JtYXR0ZXJdIEphdmEgc291cmNlIGZvcm1hdHRlciBub3Qgd29ya2luZyBpZiBjbGFzcyBoYXMgYW5ub3RhdGlvbiBvbiBzaW5nbGUgbGluZSBtdWx0aXBsZSBmaWVsZHMgZGVjbGFyYXRpb24uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MzU0Ij4xOTYzNTQ8L2E+Ci1DbGFzc0Nhc3RFeGNlcHRpb24gaW4gcGFja2FnZSBiaW5kaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2MDkzIj4xNjYwOTM8L2E+Ci1bc2VhcmNoXSBOUEUgc2VhcmNoaW5nIGZvciByZWZlcmVuY2VzIHRvIHByaXZhdGUgc3RhdGljIG1ldGhvZCBpbiBjbGFzcyBmaWxlCi0KLTxhIG5hbWU9InZfNzc1X1IzM3giPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zLjEgLSBBdWd1c3QgMiwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NzVfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NzVfUjMzeCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODQ4MyI+MTk4NDgzPC9hPgotQnVpbGRlclRlc3RzOiBuZWVkIGV4cGVjdGluZ1VuaXF1ZUNvbXBpbGVkQ2xhc3NlcyBtZXRob2QKLQotPGEgbmFtZT0idl83NzRfUjMzeCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMuMSAtIEp1bHkgMzEsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzc0X1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzc0X1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MDQ3Ij4xOTgwNDc8L2E+Ci1UZXN0aW5nRW52aXJvbm1lbnQuYWRkUHJvamVjdCBzaG91bGQgc3VwcG9ydCAxLjYgY29tcGxpYW5jZQotCi08YnI+PGEgbmFtZT0idl83NzNfUjMzeCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMuMSAtIEp1bHkgMTcsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzczX1IzM3gKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzczX1IzM3giPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1ODAyIj4xOTU4MDI8L2E+Ci1OYW1lIGNsYXNoIGNvbXBpbGUgZXJyb3IgZ2VuZXJhdGVkIGlmIHN1cGVyY2xhc3MgaXMgYWJzdHJhY3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU0NjgiPjE5NTQ2ODwvYT4KLVsxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIGNvbXBpbGVyIGRpZmZlcnMgZnJvbSBqYXZhYyB3aXRoIGdlbmVyaWNzIChuYW1lIGNsYXNoKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDAzNCI+MTk0MDM0PC9hPgotWzEuNV1bQ29tcGlsZXJdIEluY29uc2lzdGVuY3kgd2l0aCBqYXZhYzogc3ViY2xhc3MgZG9lcyBub3QgcHJvcGVybHkgaW5oZXJpdCBnZW5lcmljIG1ldGhvZAotCi08YSBuYW1lPSJ2Xzc3Ml9SMzN4Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuMy4xIC0gSnVseSAxMCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NzJfUjMzeAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NzJfUjMzeCI+Y3ZzPC9hPikuCitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43LjIgLSBOb3ZlbWJlciAyLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I3N19SMzd4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I3N19SMzd4Ij5jdnM8L2E+KS4KIDxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08bGk+SW5jcmVtZW50ZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUgcGx1Zy1pbiBJRCB0byAiMy4zLjEiPC9saT4KLTwvdWw+Ci08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTEyNSI+MTkxMTI1PC9hPgotWzEuNV0gW2Fzc2lzdF0gTlBFIGluIENvbXBsZXRpb25FbmdpbmUucHJvcG9zZVR5cGUoKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTMxNyI+MTk1MzE3PC9hPgotW2NvbXBpbGVyXSBqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvcjogSW52YWxpZCBwYyBpbiBMaW5lTnVtYmVyVGFibGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU1MDkiPjE5NTUwOTwvYT4KLU5lZWQgdG8gaW1wcm92ZSBjbGFzc3BhdGggcmVzb2x1dGlvbiBmb3IgQXBhY2hlIEhhcm1vbnkgaW4gb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU1MjYiPjE5NTUyNjwvYT4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb24uR2VuZXJpY1R5cGVUZXN0LnRlc3QwNzQ0IGRlcGVuZHMgb24gbm9uLXNwZWNpZmllZCBwYWNrYWdlLXByaXZhdGUgY2xhc3MgSGFzaE1hcC5FbnRyeSBpbXBsZW1lbnRhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTA4MiI+MTkxMDgyPC9hPgotQW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpIHJldHVybnMgd3JvbmcgdmFsdWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk3OTkiPjE4OTc5OTwvYT4KLVtqc3IyNjldIE1ha2UgZ2V0RG9jQ29tbWVudCgpIGJlaGF2ZSBtb3JlIGxpa2UgamF2YWMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI3NzQiPjE5Mjc3NDwvYT4KLUFubm90YXRpb24gQVNUIG5vZGVzIHNob3VsZCBoYXZlIHVuaXF1ZSBJQW5ub3RhdGlvbkJpbmRpbmdzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxNzAzIj4xNzE3MDM8L2E+Ci1FY2xpcHNlIGNhbm5vdCBmaW5kIHNvdXJjZSBmb3IgKi5jbGFzcyBmaWxlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTkwOCI+MTkxOTA4PC9hPgotWzEuNV1bY29tcGlsZXJdIE1pc3Npbmcgc3RyaWtlIHRocm91Z2ggZm9yIGRlcHJlY2F0ZWQgZGVjbGFyYXRpb24gZnJhZ21lbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI0OTciPjE5MjQ5NzwvYT4KLUNhbm5vdCBhbHdheXMgZmluZCBtZXRob2QgZGVmaW5pdGlvbiwgZGVwZW5kaW5nIG9uIGN1cnNvciBwb3NpdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDE4NSI+MTk0MTg1PC9hPgotW3NlYXJjaF0gZm9yIHBhY2thZ2UgZGVjbGFyYXRpb25zIGZpbmRzIGFsc28gc3VicGFja2FnZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQ0MzUiPjE5NDQzNTwvYT4KLUpEVCBDb3JlIG1hbmlmZXN0IGNvbnRhaW5zIGludmFsaWQgcHJlcmVxZWQgdmVyc2lvbgotCi08YSBuYW1lPSJ2Xzc3MSI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjMgLSBKdW5lIDIxLCAyMDA3IC0gMy4zIFJFTEVBU0UKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzcxCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc3MSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MzU3MCI+MTkzNTcwPC9hPgotYWRkIGVjbGlwc2UuaW5mIHRvIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgamR0LmNvcmUKLQotPGEgbmFtZT0idl83NzAiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkM0IC0gSnVuZSA1LCAyMDA3IC0gMy4zIFJFTEVBU0UgQ0FORElEQVRFIDQKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzcwCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc3MCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDc0OCI+MTkwNzQ4PC9hPgotWzEuNV1bY29tcGlsZXJdIEFic3RyYWN0TWV0aG9kRXJyb3Igb24gZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBkZXJpdmVkIEludGVyZmFjZSBkZWNsYXJhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTkzMyI+MTg5OTMzPC9hPgotW2NvbXBpbGVyXVsxLjVdIGV4dHJhbmVvdXMgYW1iaWd1b3VzIGNvbnN0cnVjdG9yIGVycm9yIG9uIGdlbmVyaWNzCi0KLTxhIG5hbWU9InZfNzY5Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM1JDNCAtIEp1bmUgNCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjkKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzY5Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNDkzIj4xOTA0OTM8L2E+Ci1bMS42XVtjb21waWxlcl0gQ29tcGlsaW5nIGZvciAxLjYgc2hvdWxkIG5vdCByZXF1aXJlIGNvbXBpbGVyIHRvIHJ1biBvbiAxLjYgaXRzZWxmCi0KLQotPGEgbmFtZT0idl83NjgiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkMzIC0gTWF5IDMwLCAyMDA3IC0gMy4zIFJFTEVBU0UgQ0FORElEQVRFIDMKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzY4Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2OCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTU0NyI+MTg5NTQ3PC9hPgotUG9zc2libGUgcmVzb3VyY2UgbGVhayBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTg1MiI+MTg5ODUyPC9hPgotW3BlcmZzXSBUb28gbWFueSBKRFQvQ29yZSBwZXJmb3JtYW5jZSB0ZXN0cyBpbiBmaW5nZXJwcmludHMKLQotPGEgbmFtZT0idl83NjciPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkMzIC0gTWF5IDI5LCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2NwotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjciPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk0NTYiPjE4OTQ1NjwvYT4KLUZvcm1hdHRlciBpcyBzbG93IG9uICBiaWcgZmlsZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgxMDUiPjE4ODEwNTwvYT4KLW9yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUgaW1wb3J0ZWQgYXMgc291cmNlIGRvZXMgbm90IGNvbXBpbGUKLQotPGEgbmFtZT0idl83NjYiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkMyIC0gTWF5IDI1LCAyMDA3IC0gMy4zIFJFTEVBU0UgQ0FORElEQVRFIDIKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzY2Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2NiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPlRoZSBuZXcgQVBJIDxjb2RlPlRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoTWFwIG9wdGlvbnMsIGludCBtb2RlKTwvY29kZT4gYWxsb3dzIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgY29kZQotICAgICAgZm9ybWF0dGVyIGlzIGdvaW5nIHRvIGZvcm1hdCBuZXcgY29kZSBvciBleGlzdGluZyBjb2RlLjwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODk2MCI+MTg4OTYwPC9hPgotWzEuNV1bY29tcGlsZXJdRG8gbm90IGRldGVjdCBkdXBsaWNhdGUgY29uc3RydWN0b3JzIGluIGEgUGFyYW1ldGVyaXplZFR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU5MjgiPjE4NTkyODwvYT4KLU5ldyBGb3JtYXR0ZXIgT3B0aW9uICZxdW90O05ldmVyIGluZGVudCBjb21tZW50cyBvbiBmaXJzdCBjb2x1bW4mcXVvdDsgYnJlYWtzIGZvcm1hdHRpbmcgb2YgYXV0byBnZW5lcmF0ZWQgYm9kaWVzCi0KLTxhIG5hbWU9InZfNzY1Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM1JDMiAtIE1heSAyNCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjUKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzY1Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyODIwIj4xNzI4MjA8L2E+Ci1IYXJkLWNvZGVkIGNsYXNzIGxpYnJhcmllcyBuYW1lcyBpbiBvcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy91dGlsL1V0aWwuamF2YQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODc0MSI+MTg4NzQxPC9hPgotWzEuNV1bY29tcGlsZXJdIEluY29ycmVjdCBhbWJpZ3VvdXMgbWV0aG9kIGVycm9yIHdpdGggaW5oZXJpdGVkIHJhdyB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MjQ3Ij4xODgyNDc8L2E+Ci1bY29udGVudCBhc3Npc3RdIENvZGUgQ29tcGxldGlvbiBmb3Igc3RhdGljIGltcG9ydGluZyBmaWVsZHMgbm90IHdvcmtpbmcKLQotCi08YSBuYW1lPSJ2Xzc2NCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNSQzIgLSBNYXkgMjMsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzY0Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2NCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODY0OCI+MTg4NjQ4PC9hPgotRUNKIGNvbXBpbGVyIGZhaWxzIHRvIGZpbmQgYm9vdCBjbGFzc2VzIG9uIEhhcm1vbnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODg2NTYiPjE4ODY1NjwvYT4KLVtwZXJmc10gMiUgcmVncmVzc2lvbiBvbiBzb21lIEJhdGNoIENvbXBpbGVyIHRlc3RzIHNpbmNlIHZfNzU2Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MTM2Ij4xODgxMzY8L2E+Ci1bamF2YWRvY11bYXNzaXN0XSBFcnJvcnMgaW4gb3JnLmVjbGlwc2UuamR0LnVpLkphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgxMjciPjE4ODEyNzwvYT4KLVt0ZXN0XSBTb21lIHRlc3RzIGZhaWwgb24gSGFybW9ueQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjA1NCI+MTYyMDU0PC9hPgotW2J1aWxkXSBHb3QgYSBmYWlsdXJlIG9uIE11bHRpUHJvamVjdFRlc3RzLnRlc3RDeWNsZTUgb24gbXkgc3BlZWR5IHRlc3QgYm94Li4uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MTAzIj4xODgxMDM8L2E+Ci1bMS41XVtjb21waWxlcl0gSW5hcHByb3ByaWF0ZSB1c2FnZSBvZiBIYXNoU2V0Ci0KLTxhIG5hbWU9InZfNzYzIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM1JDMSAtIE1heSAxNiwgMjAwNyAtIDMuMyBSRUxFQVNFIENBTkRJREFURSAxCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2MwotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjMiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODczMjkiPjE4NzMyOTwvYT4KLWNvbXBpbGF0aW9uIGVycm9yIGNvbnN0YW50cyBjcmVhdGVkIHdpdGggc3RhdGljIG1ldGhvZHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODcyMjMiPjE4NzIyMzwvYT4KLUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvcjIuZ2V0UmV2ZXJzZWRSZXN1bHRzIGhhcyBpbmNvcnJlY3QgY29tcGFyYXRvcgotCi08YSBuYW1lPSJ2Xzc2MiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgMTYsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzYyCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2MiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzE0MSI+MTMzMTQxPC9hPgotTXVzdCBKYXZhQ29yZS5jcmVhdGUoSUZpbGUpIGFsd2F5cyBkbyBmdWxsIGNoZWNrcz8KLQotPGEgbmFtZT0idl83NjEiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkMxIC0gTWF5IDE1LCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2MQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjEiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMzMzgiPjE4MzMzODwvYT4KLVtwZXJmc10gVG9vIG1hbnkgSkRUL0NvcmUgcGVyZm9ybWFuY2UgdGVzdHMgYXJlIHllbGxvdwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjgzMyI+MTg2ODMzPC9hPgotWzEuNV1bY29tcGlsZXJdIFNob3VsZCBkZXRlY3QgbWVtYmVyIHN1cGVydHlwZSBjeWNsZSB3aGVuIHJlc29sdmVkIHRocnUgc3RhdGljIGltcG9ydAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjM4MiI+MTg2MzgyPC9hPgotWzEuNV1bY29tcGlsZXJdIEFtYmlndW91cyBtZXRob2QgY2FsbCBlcnJvciByZXBvcnRlZCBvbiBhIGRlbW9uc3RyYWJseSB1bmFtYmlndW91cyBjYWxsCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NzQ5Ij4xODY3NDk8L2E+Ci1DQ0UgaW4gU2NvcGUuZmluZE1lbWJlclR5cGUKLQotPGEgbmFtZT0idl83NjAiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zUkMxIC0gTWF5IDE1LCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2MAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjAiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc5MjIiPjE3NzkyMjwvYT4KLUZsZXhpYmxlUHJvamVjdENvbnRhaW5lciByZWZyZXNoIGxvZ2ljIHNwb3JhZGljYWxseSBsZWF2ZXMgcHJvamVjdCB3aXRoICZxdW90O21pc3NpbmcgbGlicmFyeSZxdW90OyBlcnJvciBvbiByZW5hbWUvZGVsZXRlCi0KLTxhIG5hbWU9InZfNzU5Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM1JDMSAtIE1heSAxNCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NTkKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzU5Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NTc2Ij4xODU1NzY8L2E+Ci1bamF2YWRvY11bYXNzaXN0XSBUeXBlIHBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSBwcm9wb3NlZCB3aGlsZSBjb21wbGV0aW5nIGluIEBsaW5rIG9yIEBzZWUgcmVmZXJlbmNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMDI2Ij4xNDMwMjY8L2E+Ci1bYXN0IHJld3JpdGVdIENsZWFuIHVwIHBhcmFudGhlc2VzIGFyZSBub3QgcmVjb2duaXppbmcgY29tbWVudCAvLwotCi08YSBuYW1lPSJ2Xzc1OCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgMTEsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzU4Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1OCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODIwOCI+MTY4MjA4PC9hPgotUmVuYW1pbmcgY2xhc3NlcyBmcm9tIGxvd2VyY2FzZSB0byB1cHBlcmNhc2UgcmVzdWx0cyBpbiBhbiBlcnJvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjE4MSI+MTg2MTgxPC9hPgotMS41IGNvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgY2xhc3MgZmlsZXMgYnVpbHQgYnkgLXRhcmdldCBqc3IxNAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjQxNSI+MTg2NDE1PC9hPgotW3NlYXJjaF0gU2VhcmNoIGZvciBwYWNrYWdlIGRlY2xhcmF0aW9ucyBzaG91bGQgbm90IHJldHVybiBkdXBsaWNhdGUgZWxlbWVudHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUxMjkiPjE4NTEyOTwvYT4KLU5QRSBpbiBMb2NhbFZhcmlhYmxlQmluZGluZy5jb21wdXRlVW5pcXVlS2V5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MTE5Ij4xODUxMTk8L2E+Ci1bc2VhcmNoXSBUeXBlTmFtZU1hdGNoIG11c3Qgc3BlY2lmeSB0aGF0IGl0IGNvdWxkIG5vdCBiZSBvdmVycmlkZGVuIGJ5IGNsaWVudHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ1NDYiPjE4NDU0NjwvYT4KLVtjb21waWxlcl1bbnVsbF0gU3B1cmlvdXMgcmVkdW5kYW50IG51bGwgY2hlY2sgd2FybmluZyBpbiBmaW5hbGx5IHdoZW4gdGhlIGNsYXNzIGhhcyBhIHN0YXRpYyBmaWVsZAotCi08YSBuYW1lPSJ2Xzc1NyI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgMTAsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzU3Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1NyI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTMwNiI+MTg1MzA2PC9hPgotSGVscCB3aXRoIGZpZWxkcyBhbmQgbWV0aG9kcyBvbiBiaW5hcnkgc3VwZXIgdHlwZXMgd2l0aCB1bnJlc29sdmVkIHJlZmVyZW5jZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU5NTAiPjE4NTk1MDwvYT4KLVtwZXJmb3JtYW5jZV0gb3BlbmluZyBjbGFzcyBmaWxlIHdpdGhvdXQgc291cmNlIGF0dGFjaGVtZW50IGlzIHRvbyBzbG93Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2MTg5Ij4xODYxODk8L2E+Ci1OUEUgdHJ5aW5nIHRvIG9wZW4gdGhlIGZvbGxvd2luZyBjbGFzcyB1c2luZyB0aGUgQVNUVmlldwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Mzk0NCI+MTczOTQ0PC9hPgotY2Fubm90IGNhbmNlbCBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTE4MiI+MTg1MTgyPC9hPgotRnVwIG9mIDEyNjcxMiwgdGhlIHR3byByZWdyZXNzaW9ucyB0ZXN0cyBpbiBSdW50aW1lVGVzdHMgc2hvdWxkIGJlIHJld3JpdHRlbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTczMyI+MTg1NzMzPC9hPgotUmVmcmVzaGluZyBleHRlcm5hbCBqYXIgZG9lc24ndCB1cGRhdGUgcHJvYmxlbSBtYXJrZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMwMjUiPjE0MzAyNTwvYT4KLVtidWlsZCBwYXRoXSBEZXJpdmVkIGF0dHJpYnV0ZSBvbiBkZWZhdWx0IG91dHB1dCBmb2xkZXIgb2YgSmF2YSBwcm9qZWN0IGRvZXNuJ3Qgd29yawotCi08YSBuYW1lPSJ2Xzc1NiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgNywgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NTYKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzU2Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1Nzg3Ij4xODU3ODc8L2E+Ci1bMS41XVtjb21waWxlcl0gTWlzc2luZyB1bm5lY2Vzc2FyeSBjYXN0IGRpYWdub3NpcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDY5MyI+MTU0NjkzPC9hPgotcHJvamVjdCBjbGVhbiAmYW1wOyBidWlsZCBzb21ldGltZXMgY29waWVzIHN1YnZlcnNpb24gLnN2biBmb2xkZXJzIHRvIGJpbiB0cmVlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ4ODYiPjg0ODg2PC9hPgotW2NvbXBpbGVyXSBjb21waWxlZCBjb2RlIHdyb25nIHdpdGggYW1iaWd1b3VzIGlubmVyIGNsYXNzZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3NjgiPjE4NTc2ODwvYT4KLVsxLjZdW2NvbXBpbGVyXSBFbmFibGluZyBhcHQgYnkgZGVmYXVsdCBpbiBiYXRjaCBtb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NTY3Ij4xODU1Njc8L2E+Ci1bY29tcGlsZXJdIGRlYWQgYnl0ZWNvZGVzIGFyZSBnZW5lcmF0ZWQgaW5zaWRlIG9wdGltaXplZCBib29sZWFuIGNvbmRpdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk2NSI+MTYyOTY1PC9hPgotW2NvbXBpbGVyXSBkZWFkIGJ5dGVjb2RlcyBhcmUgZ2VuZXJhdGVkIGluc2lkZSBjb25kaXRpb25hbCBleHByZXNzaW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTMxMCI+MTg1MzEwPC9hPgotUmVtb3ZpbmcgaW50ZXJuYWwgamFyIHJlZmVyZW5jZWQgZnJvbSBhbm90aGVyIHByb2plY3QgZG9lc24ndCB1cGRhdGUgUGFja2FnZSBFeHBsb3JlcgotCi08YSBuYW1lPSJ2Xzc1NSI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNyAtIE1heSAyLCAyMDA3IC0gMy4zIE1JTEVTVE9ORSA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1NQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTUiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY3MzEiPjE1NjczMTwvYT4KLVtjb21waWxlcl0gSW1wcm92ZSBjb21waWxlciBmYXVsdC10b2xlcmFuY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ5NTciPjE4NDk1NzwvYT4KLVsxLjVdW2NvbXBpbGVyXSBDb21waWxlciBjcmFzaAotCi08YSBuYW1lPSJ2Xzc1NCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNyAtIEFwcmlsIDMwLCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1NAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTQiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQyOTMiPjE4NDI5MzwvYT4KLVVubmVjZXNzYXJ5IGluaGVyaXRlZCBtZXRob2QgZXJyb3JzIHJlcG9ydGVkIGFnYWluc3Qgc3VidHlwZXMKLQotPGEgbmFtZT0idl83NTMiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTcgLSBBcHJpbCAyOCwgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NTMKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzUzIj5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NzgzIj4xNjU3ODM8L2E+Ci1bYXN0IHJld3JpdGVdIEltcG9ydCBkZWNsYXJhdGlvbiBzdGF0aWMgcHJvcGVydHkgY2FuIG5vdCBiZSBzZXQgY29ycmVjdGx5Ci0KLTxhIG5hbWU9InZfNzUyIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMjcsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzUyCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1MiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTQwOSI+MTc1NDA5PC9hPgotbWV0aG9kIHJlZmVyZW5jZSBjb250YWlucyBnZW5lcmljIG1ldGhvZCBiaW5kaW5nCi0KLTxhIG5hbWU9InZfNzUxIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMjYsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzUxCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1MSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDcxMyI+MTgwNzEzPC9hPgotQW5vbnltb3VzIHR5cGUgcmVuZGVyZWQgYXMgbnVtYmVyIGluIGhvdmVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyMTU0Ij4xODIxNTQ8L2E+Ci1KYXZhIHNlYXJjaCBnaXZlcyBubyByZXN1bHRzIG9uIHdvcmtzcGFjZSB3aXRoIG11bHRpcGxlIHByb2plY3RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0Nzc2Ij4xNDQ3NzY8L2E+Ci1KYXZhUHJvamVjdC5yZXNldENhY2hlcygpIG5lZWRzIHRvIHJlc2V0IGRlcGVuZGVudCBwcm9qZWN0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTAxMSI+MTc5MDExPC9hPgotSVR5cGUjZ2V0TWV0aG9kKC4uKSBzaG91bGQgbm90IHRocm93IEFGRSB3aGVuIG5hbWUgY29udGFpbnMgZG90Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTA0Ij4xNjIxMDQ8L2E+Ci1OUEUgaW4gUGFja2FnZUV4cGxvcmVyQ29udGVudFByb3ZpZGVyLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg5ODUiPjE1ODk4NTwvYT4KLUNvZGUgY29tcGxldGlvbiBlbmdpbmUgaGludHMgYW5ub3RhdGlvbnMgb24gd3JvbmcgcGxhY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzODMzIj4xODM4MzM8L2E+Ci1OUEUgaW4gbGF0ZXN0IGJ1aWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzNDEzIj4xODM0MTM8L2E+Ci1QREUgY2FuJ3QgZmluZCB0aGUgc291cmNlIGZvciBwbHVnLWlucyBpbiB0aGUgdGFyZ2V0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MTAyIj4xODQxMDI8L2E+Ci1bMS42XVtjb21waWxlcl0gSW5jb25zaXN0ZW50IHN0YWNrbWFwIGZyYW1lIGdlbmVyYXRlZCBmb3Igc3RhdGljIGluaXRpYWxpemVyIG9mIGVudW1zIGNvbnRhaW5pbmcgb3ZlcnJpZGRlbiBtZXRob2RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NTU2Ij4xNDY1NTY8L2E+Ci1TaG91bGQgcmVmYWN0b3IgYm9vbGVhbiBmaWVsZHMgaW50byBiaXRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkzMTQiPjQ5MzE0PC9hPgotY29tbWVudHMgZm9ybWF0dGVkIGV2ZW4gaWYgJnF1b3Q7RW5hYmxlIGNvbW1lbnQgZm9ybWF0dGluZyZxdW90OyBpcyBkaXNhYmxlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzkzIj4yMDc5MzwvYT4KLVtmb3JtYXR0ZXJdIFRoZSBjb2RlIGZvcm1hdHRlciBpbmRlbnQgbGVmdCBhbGlnbmVkIGNvbW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwOTA1Ij4xODA5MDU8L2E+Ci1Ud2Vha3MgdG8gcmVjb3ZlcmVkIGJpbmRpbmdzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMjE2Ij4xODMyMTY8L2E+Ci1bMS41XVtjb21waWxlcl0gQ2Fubm90IHJlZmVyIHRvIGEgZ2VuZXJpYyBtZW1iZXIgdHlwZSB1c2luZyBhIG5vbiBzdGF0aWMgc3ViY2xhc3Mgb2YgdGhlIGVuY2xvc2luZyB0eXBlCi0KLTxhIG5hbWU9InZfNzUwIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMjQsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzUwCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1MCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjkzMCI+MTgyOTMwPC9hPgotSmF2YU1vZGVsQ2FjaGUncyBzaXplICBncm93cyB3aGVuIGRpc3BsYXlpbmcgdHlwZSBoaWVyYXJjaHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMwNjIiPjE4MzA2MjwvYT4KLVtzZWFyY2hdIE91dE9mTWVtb3J5RXJyb3IgZHVyaW5nIHJlbmFtZSByZWZhY3RvcmluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MDY4Ij43OTA2ODwvYT4KLVtmb3JtYXR0ZXJdIE5lZWQgb3B0aW9uIHRvIGNvbnRyb2wgbGluZSB3cmFwcGluZyBiZWZvcmUvYWZ0ZXIgb3BlcmF0b3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNzg5Ij4xODA3ODk8L2E+Ci1bMS41XVtjb21waWxlcl0gaW52YWxpZCBpbmNvbXBhdGlibGUgcmV0dXJuIHR5cGUgZXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM1MzgiPjE4MzUzODwvYT4KLU5vdCBnZXR0aW5nIEBJbmhlcml0ZWQgYW5ub3RhdGlvbiBvbiBhbm5vdGF0aW9uIHR5cGVzIGZyb20gYmluYXJ5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzNDY4Ij4xODM0Njg8L2E+Ci1OUEUgdHJ5aW5nIHRvIGNhbGwgaXNEZWZhdWx0KCkgb24gdGhlIE1lbWJlclZhbHVlUGFpckJpbmRpbmcgY29ycmVzcG9uZGluZyB0byBhcnJheT0xCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMzk1Ij4xODMzOTU8L2E+Ci1GdXAgb2YgYnVnIDE0NDg1OCwgaW50ZXJuYWwgZXJyb3IgaXMgdGhyb3duIGZvciB3cm9uZyBleGNlcHRpb24gdHlwZSBpbiBjYXRjaCBjbGF1c2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzNDkiPjE4MTM0OTwvYT4KLUFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGlsZSBlZGl0aW5nIEphdmEgY29kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjQ4NSI+MTgyNDg1PC9hPgotTWlzc2luZyB0cmFuc2xhdGlvbiBmaWxlcyBpbiBKRFQgcGx1Zy1pbnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjExNzUiPjE2MTE3NTwvYT4KLUphclBhY2thZ2VGcmFnbWVudFJvb3Qgc2xvdyB0byBpbml0aWFsaXplCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyMjA0Ij4xODIyMDQ8L2E+Ci1EZWxldGluZyBhIEpSRSByZWZlcmVuY2VkIGJ5IGNvbnRhaW5lciBkb2VzIG5vdCByZXN1bHQgaW4gdW5ib3VuZCBjb250YWluZXIgcHJvYmxlbQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjM3MCI+MTYyMzcwPC9hPgotTWV0aG9kVmVyaWZpZXIjYXJlUmV0dXJuVHlwZXNFcXVhbCBpcyBhIG1pc25vbWVyCi0KLTxhIG5hbWU9InZfNzQ5Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMTcsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ5Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0OSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODIxNyI+MTE4MjE3PC9hPgotQ29tcGlsZXIgZXJyb3Ivd2FybmluZyBvcHRpb24gJ1BhcmFtZXRlciBpcyBuZXZlciByZWFkJyBwcm9kdWNlcyBhIGxvdCBvZiBmYWxzZS1wb3NpdGl2ZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzOTMiPjE4MTM5MzwvYT4KLURlZmF1bHRBU1RWaXNpdG9yIGRvZXNuJ3Qgb3ZlcnJpZGUgYWxsIG1ldGhvZHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUzMjkiPjE0NTMyOTwvYT4KLVtzY2FsaW5nXSBVbmFibGUgdG8gbG9jYXRlIHNvdXJjZSBpbiBtb25zdGVyIHdvcmtzcGFjZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzE3NCI+MTc3MTc0PC9hPgotW2Fzc2lzdF0gV3JvbmcgbmFtZXMgYXJlIHByb3Bvc2VkIGFzIHVucmVzb2x2ZWQgbG9jYWwgdmFyaWFibGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE3MjciPjE4MTcyNzwvYT4KLVtwZXJmc10gSkRUL0NvcmUgcGVyZm9ybWFuY2VzIHRlc3RzIGxhc3QgdG9vIGxvbmcgb24gc2xvd2VzdCByZWxlbmcgdGVzdCBib3hlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDEwOSI+MTgwMTA5PC9hPgotW2NvbXBpbGVyXSBKRFQgVGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBvbiBpbmNyZW1lbnRhbCBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzgxOSI+MTc3ODE5PC9hPgotSmFyIGZpbGVzIGFkZGVkIHRvIGEgcGx1Z2luIGFyZSBpZ25vcmVkCi0KLTxhIG5hbWU9InZfNzQ4Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMTAsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ4Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0OCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTI2OSI+MTgxMjY5PC9hPgotRGVsZXRpbmcgc2Vjb25kYXJ5IHR5cGUgaXMgbm90IGRldGVjdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5Njg0Ij4xNzk2ODQ8L2E+Ci0mcXVvdDtSZWNvbmNpbGUgZWRpdG9yIGNoYW5nZSZxdW90OyBwZXJmIHRlc3QgaXMgZ2V0dGluZyBzbG93ZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA2ODMiPjE4MDY4MzwvYT4KLWNvZGVTZWxlY3QgZG9lcyBub3Qgd29yayBpbiB1bmljb2RlIG5hbWVzIGxpa2UgXHUwMDQyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMjcwIj4xODEyNzA8L2E+Ci1bMS41XVtjb21waWxlcl0gQ2xhc3MgbGl0ZXJhbCBvZiBhcnJheSBvZiB0eXBlIHBhcmFtZXRlciBzaG91bGQgYmUgcmVqZWN0ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg1NTEiPjE3ODU1MTwvYT4KLVtpbmRleF0gRGVhZGxvY2sgd2hlbiBkb2luZyBUeXBlIEhpZXJhcmNoeSB3aGlsZSB1cGRhdGluZyBhIGxhcmdlIHdvcmtzcGFjZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDUyNCI+MTgwNTI0PC9hPgotTlBFIGluIElUeXBlQmluZGluZyNjcmVhdGVBcnJheVR5cGUoLi4pIG9uIGFub255bW91cyB0eXBlCi0KLTxhIG5hbWU9InZfNzQ3Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMywgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NDcKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzQ3Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MjEzIj4xNzgyMTM8L2E+Ci1Db21waWxhdGlvbiBVbml0IG5vdCBzaG93biBpbiBQYWNrYWdlIEV4cGxvcmVyIGFmdGVyIGEgcmVuYW1lCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNDcxIj4xODA0NzE8L2E+Ci1bY29tcGlsZXJdIFVub3B0aW1hbCBjb2RlIGdlbmVyYXRpb24gZm9yIGZvci1sb29wcyB3aGVuIG5vIGNvbnRpbnVhdGlvbiBwb2ludAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjMyMCI+MTc2MzIwPC9hPgotTm9uIGxpbmVhciBwcm9ncmVzcyBpbiBvcGVuIHR5cGUgZGlhbG9nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NDcyIj4xNzY0NzI8L2E+Ci1bY29tcGlsZXJdW251bGxdIGV4dHJhbmVvdXMgZXJyb3IgaW4gY2FzZSBvZiBhIGxhYmVsZWQgd2hpbGUodHJ1ZSkgc3RhdGVtZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2OTYzIj4xNjY5NjM8L2E+Ci1bY29tcGlsZXJdIHJlc29sdmUgYmluZGluZyBmb3IgbG9jYWwgdmFyaWFibGUgaW4gQ29uc3RydWN0b3JJbnZvY2F0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NjMwIj4xNzk2MzA8L2E+Ci1Db21waWxlciBwYXJzaW5nIHRlc3RzIGZhaWwgd2l0aCBJQk0gSjJTRSAxLjQuMiwgNS4wLCBhbmQgNi4wIChlYXJseSBhY2Nlc3MpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNzg3Ij4xNTE3ODc8L2E+Ci1bY29tcGlsZXJdIGNvbXBpbGVyIGFsbG93cyBhc3NpZ25tZW50IHRvIGZpbmFsIGZpZWxkIGluIGNvbnN0cnVjdG9yIG90aGVyIHRoYW4gdGhyb3VnaCAndGhpcycKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg0OTkiPjE3ODQ5OTwvYT4KLVtwZXJmc10gSkRUL0NvcmUgbW9kZWwgcGVyZm9ybWFuY2VzIHRlc3RzIG11c3QgYmUgaW1wcm92ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODAxNjkiPjE4MDE2OTwvYT4KLUFkZCBwcm90ZWN0aW9uIGFnYWluc3QgbWlzc2JlaGF2aW5nIGNvbnRhaW5lciAocmV0dXJuaW5nIG51bGwgZW50cmllcykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODAwNDYiPjE4MDA0NjwvYT4KLXBhdGNoIHRvIGFudGFkYXB0ZXIgZWNsaXBzZS5pbmYKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY0NDkiPjE2NjQ0OTwvYT4KLURvbid0IGFib3J0IGJ1aWxkIHdoZW4gQ29tcGlsYXRpb25QYXJ0aWNpcGFudHMgZml4IGNsYXNzcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTUyOSI+MTc5NTI5PC9hPgotU3RvcCBFY2xpcHNlIHRha2VzIGEgbG90IG9mIHRpbWUgaW4gY2FzZSBvZiBiaWcgd29ya3NwYWNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDAwIj4xNzkwMDA8L2E+Ci1bY29kZSBhc3Npc3RdIHJ1bigpIHNob3VsZCBub3QgYmUgYSB2YWxpZCBwcm9wb3NhbCBpbnNpZGUgdGhlIHNjcmFwYm9vayBwYWdlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NzI4Ij4xNjk3Mjg8L2E+Ci1bMS41XVtjb21waWxlcl0gV2lsZGNhcmRCaW5kaW5nLmJvdW5kQ2hlY2sgY29kaW5nIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDU2Ij4xNzkwNTY8L2E+Ci1bY29tcGlsZXJdIENvbXBpbGVyIGdpdmVzIG1pc2xlYWRpbmcgUmFuZ2UgZm9yIGludmlzaWJsZSBmaWVsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTY5OSI+MTc5Njk5PC9hPgotdHlwZS5uZXdUeXBlSGllcmFyY2h5IGRvZXNuJ3QgY2FuY2VsCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NjcyIj4xNzk2NzI8L2E+Ci1bYXNzaXN0XSBPbmx5IG9uZSBhc3NlcnRpb24gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgY29tcGxldGlvbiBwYXJzZXIgdGVzdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDQ0NSI+MTc0NDQ1PC9hPgotWzEuNV1bY29tcGlsZXJdIG1pc3NpbmcgdW5jaGVja2VkIGNvbnZlcnNpb24gd2FybmluZyB1cG9uIHBhcmFtZXRyaXplZCBtZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkyNTgiPjE3OTI1ODwvYT4KLXNpbXBsZSByZWNvbmNpbGUgc3RhcnRzIHByb2JsZW0gZmluZGVyIC0gbWFpbiB0aHJlYWQgd2FpdGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTQ3NyI+MTc5NDc3PC9hPgotW2NvbXBpbGVyXSBwcm9ibGVtIGluIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkgaW5pdGlhbGl6ZXIgc3VwcHJlc3NlcyBmdXJ0aGVyIHByb2JsZW1zCi0KLTxhIG5hbWU9InZfNzQ2Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM003IC0gTWFyY2ggMjcsIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ2Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0NiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTE5OSI+MTc5MTk5PC9hPgotW3NlYXJjaF0gT3BlbiB0eXBlIHRocm93cyBOUEUgZHVyaW5nIEl0ZW1zIGZpbHRlcmluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODg5NSI+MTc4ODk1PC9hPgotW2NvbXBpbGVyXVtudWxsXSBBIGZvci1lYWNoIGxvb3AgY2hhbmdlcyBpdHMgdmFsdWUgb24gZWFjaCBpdGVyYXRvciBidXQgdGhlIG51bGwgcG9pbnRlciBhbmFseXNpcyBpcyBub3QgdGFraW5nIHRoYXQgaW50byBjb25zaWRlcmF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODYzIj4xNzc4NjM8L2E+Ci1bY29tcGlsZXJdW251bGxdIFNwdXJpb3VzIG51bGwgcG9pbnRlciB3YXJuaW5nIGluIGZpbmFsbHkgYmxvY2sgKGludm9sdmluZyBkZWYuIHVua25vd24pCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDY1Ij4xNzkwNjU8L2E+Ci1bRE9NXSBUZXN0IGNvdmVyYWdlIGZvciBJTWVtYmVyVmFsdWVQYWlyQmluZGluZyBtZXRob2RzIG11c3QgYmUgaW1wcm92ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwNDIiPjE3OTA0MjwvYT4KLVtET01dIEltcGxlbWVudGF0aW9uIG9mIElCaW5kaW5nLmdldE1vZGlmaWVycygpIHNob3VsZCByZXR1cm4gTW9kaWZpZXIuTk9ORSB3aGVuIG5vIG1vZGlmaWVycyBhcmUgYXZhaWxhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4ODYxIj4xNzg4NjE8L2E+Ci1FeGVjdXRpbmcgcnVuKCkgaW4gYSBzY3JhcGJvb2sgcGFnZSBsZWFkcyB0byBhIE5QRQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODAzOSI+MTc4MDM5PC9hPgotU2VwYXJhdGUgYWR2YW5jZWQgdmVyYm9zZSBmb3IgY29udGFpbmVyIGFuZCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmcm9tIHJlZ3VsYXIgdmVyYm9zZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODg0NyI+MTc4ODQ3PC9hPgotW3NlYXJjaF0gUG90ZW50aWFsIG1hdGNoZXMgZm91bmQgd2hlbiBzZWFyY2hpbmcgcmVmZXJlbmNlcyB0byBJSmF2YUVsZW1lbnQjZ2V0UmVzb3VyY2UoKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDkyMCI+MTc0OTIwPC9hPgotW21vZGVsXSBjbG9zaW5nIGEgc2luZ2xlIHByb2plY3QgY2F1c2VzIGFsbCB2YXJpYWJsZXMgYW5kIGNvbnRhaW5lcnMgdG8gYmUgc2F2ZWQKLQotPGEgbmFtZT0idl83NDUiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTYgLSBNYXJjaCAyMSwgMjAwNyAtIDMuMyBNSUxFU1RPTkUgNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NDUKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzQ1Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjc2V0Q29tcGlsYW5jZU9wdGlvbnMoU3RyaW5nLCBNYXApPC9jb2RlPiBoYXMgYmVlbiByZW5hbWVkIHRvIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLnNldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKTwvY29kZT4uPC9saT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUmVjb3ZlcmVkVHlwZUJpbmRpbmc8L2NvZGU+LCA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUmVjb3ZlcmVkVmFyaWFibGVCaW5kaW5nPC9jb2RlPiBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSS4gVGhleSBoYXZlIGJlZW4KLWNoYW5nZWQgdG8gcGFja2FnZSBkZWZhdWx0IHZpc2liaWxpdHkuPC9saT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guTWV0aG9kUmVmZXJlbmNlTWF0Y2gjaXNQb2x5bW9ycGhpYygpPC9jb2RlPiBoYXMgYmVlbiByZW1vdmVkLjwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODYxNiI+MTc4NjE2PC9hPgotW0FQSV0gRml4IHR5cG8gZm9yIEphdmFDb3JlI3NldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODYwNyI+MTc4NjA3PC9hPgotW0FQSV1bZG9tXSBSZWNvdmVyZWRUeXBlQmluZGluZyBhbmQgUmVjb3ZlcmVkVmFyaWFibGVCaW5kaW5nIHNob3VsZCBub3QgYmUgcHVibGljCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NTk0Ij4xNzg1OTQ8L2E+Ci1bc2VhcmNoXSBEZXByZWNhdGVkIE1ldGhvZFJlZmVyZW5jZU1hdGNoLmlzUG9seW1vcnBoaWMoKSBzaG91bGQgYmUgcmVtb3ZlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjExOCI+MTc2MTE4PC9hPgotTWlzc2luZyBsaWJyYXJ5IGNsYXNzZXMga2lsbCBJbnRlbGxpc2Vuc2Ugd2l0aG91dCBFcnJvcgotCi08YSBuYW1lPSJ2Xzc0NCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNiAtIE1hcmNoIDIwLCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0NAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDQiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5UaGlzIGRyb3Agb25seSBmaXhlcyB0ZXN0cyBmYWlsdXJlcyByZXBvcnRlZCBpbiBJMjAwNzAzMTktMTgwMC48L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci0KLTxhIG5hbWU9InZfNzQzIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM002IC0gTWFyY2ggMTksIDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQzCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0MyI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPk5ldyBjb25zdGFudCBBUEkgaGF2ZSBiZWVuIGFkZGVkIGluIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50czwvY29kZT4gaW4gb3JkZXIgdG8gZml4IGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3OTMiPjIwNzkzPC9hPi4KLVRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGFmdGVyIDMuM002Ljxicj4KKzxsaT5BZGRlZCBhIG5ldyBBUEkgT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFKHNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NzE2NCI+Mjg3MTY0PC9hPiBmb3IgZGV0YWlscyk6CiA8cHJlPgotCS8qKgotCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbmRlbnQgYmxvY2sgY29tbWVudHMgdGhhdCBzdGFydCBvbiB0aGUgZmlyc3QgY29sdW1uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW4iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCi0JICogQHNlZSAjVFJVRQotCSAqIEBzZWUgI0ZBTFNFCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfQkxPQ0tfQ09NTUVOVFNfT05fRklSU1RfQ09MVU1OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiI7IC8vJE5PTi1OTFMtMSQJCi0JLyoqCi0JICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluZGVudCBsaW5lIGNvbW1lbnRzIHRoYXQgc3RhcnQgb24gdGhlIGZpcnN0IGNvbHVtbgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCi0JICogQHNlZSAjVFJVRQotCSAqIEBzZWUgI0ZBTFNFCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfTElORV9DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iOyAvLyROT04tTkxTLTEkCQorLyoqCisgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWZhdWx0IG9yIHNwZWNpZmljIG91dHB1dCBmb2xkZXIgaXMgb3ZlcmxhcHBpbmcKKyAqIHdpdGggYW5vdGhlciBzb3VyY2UgbG9jYXRpb24uCisgKiBAc2luY2UgMy42LjQKKyAqLworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFID0gMTAxMzsKIDwvcHJlPgogPC9saT4KLTxsaT5OZXcgY29uc3RhbnQgQVBJIGhhdmUgYmVlbiBhZGRlZCBpbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHM8L2NvZGU+IGluIG9yZGVyIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MDY4Ij43OTA2ODwvYT4uCi1UaGUgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBwcm92aWRlZCBhZnRlciAzLjNNNi48YnI+CisKKzxsaT5BZGRlZCBhIG5ldyBvcHRpb24gQ09SRV9PVVRQVVRfTE9DQVRJT05fT1ZFUkxBUFBJTkdfQU5PVEhFUl9TT1VSQ0UgdG8gcmVwb3J0IGFuIG91dHB1dCBsb2NhdGlvbiBvdmVybGFwcGluZyBhbm90aGVyIHNvdXJjZSBsb2NhdGlvbihzZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODcxNjQiPjI4NzE2NDwvYT4gZm9yIGRldGFpbHMpOgorPHByZT4KKy8qKgorICogQ29yZSBvcHRpb24gSUQ6IFJlcG9ydGluZyBhbiBvdXRwdXQgbG9jYXRpb24gb3ZlcmxhcHBpbmcgYW5vdGhlciBzb3VyY2UgbG9jYXRpb24uCisgKiBJbmRpY2F0ZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gcmVwb3J0ZWQgd2hlbiBhIHNvdXJjZSBlbnRyeSdzIG91dHB1dCBsb2NhdGlvbiBvdmVybGFwcyBhbm90aGVyCisgKiBzb3VyY2UgZW50cnkuCisgKiAKKyAqIE9wdGlvbiBpZDoib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm91dHB1dE92ZXJsYXBwaW5nQW5vdGhlclNvdXJjZSIKKyAqIFBvc3NpYmxlIHZhbHVlczp7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICogRGVmYXVsdDoiZXJyb3IiCisgKiAKKyAqIEBzaW5jZSAzLjYuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSA9IFBMVUdJTl9JRCArICIuY2xhc3NwYXRoLm91dHB1dE92ZXJsYXBwaW5nQW5vdGhlclNvdXJjZSI7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzU0NzY2Ij4zNTQ3NjY8L2E+CitKYXZhZG9jIGNvbnRlbnQgZG9lcyBub3QgYXBwZWFyIGluIGNvbnRlbnQgYXNzaXN0IGluZm8gd2luZG93IGZvciBub24tc3RhdGljIGlubmVyIGNsYXNzIGNvbnN0cnVjdG9ycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODcxNjQiPjI4NzE2NDwvYT4KK1JlcG9ydCBidWlsZCBwYXRoIGVycm9yIGlmIHNvdXJjZSBmb2xkZXIgaGFzIG90aGVyIHNvdXJjZSBmb2xkZXIgYXMgb3V0cHV0IGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTk2NDYiPjM1OTY0NjwvYT4KK0Zvcm1hdHRlciBmYWlscyBzaWxlbnRseSBpZiBKYXZhIHNvdXJjZSBjb250YWlucyAweDgwMDAwMDAwMDAwMDAwMDBMCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1OTQ5NSI+MzU5NDk1PC9hPgorWzEuN11bY29tcGlsZXJdIFZlcmlmeUVycm9yIGluIHRyeS1maW5hbGx5IGJsb2NrIHdpdGggbG9jayBlbmNvbXBhc3NpbmcgZm9yLWVhY2ggYmxvY2sgYW5kIHVubG9jayBpbiBmaW5hbGx5IGNsYXVzZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTg4MjciPjM1ODgyNzwvYT4KK1sxLjddIGV4Y2VwdGlvbiBhbmFseXNpcyBmb3IgdC13LXIgc3BvaWxzIG51bGwgYW5hbHlzaXMKKworPGEgbmFtZT0idl9CNzZfUjM3eCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43LjEgLSBBdWd1c3QgMzAsIDIwMTEgLSAzLjcuMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNzZfUjM3eAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNzZfUjM3eCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTYwMDIiPjM1NjAwMjwvYT4KK1ZlcmlmeUVycm9yICZxdW90O0luY29uc2lzdGVudCBzdGFja21hcCBmcmFtZXMmcXVvdDsgZm9yIHN3aXRjaC1zdHJpbmcgc3RhdGVtZW50IHdpdGggbmVzdGVkIGZvci1sb29wCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDA5NSI+MzUwMDk1PC9hPgorVGhlIDIwMDB0aCAoMC1iYXNlZCkgZW51bSBjb25zdGFudCBpcyBudWxsCisKKzxhIG5hbWU9InZfQjc1X1IzN3giPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNy4xIC0gQXVndXN0IDI0LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I3NV9SMzd4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I3NV9SMzd4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NDUzNiI+MzU0NTM2PC9hPgorY29tcGlsaW5nIHBhY2thZ2UtaW5mby5qYXZhIHN0aWxsIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIGNvbXBpbGF0aW9uIHVuaXRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODAyNCI+MzQ4MDI0PC9hPgorRW1wdHkgQVNUIGZvciBjbGFzcyB3aXRoIHN0YXRpYyBpbm5lciBjbGFzcyBpbiBhIHBhY2thZ2Ugd2l0aCBwYWNrYWdlLWluZm8uamF2YQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTM2NDAiPjM1MzY0MDwvYT4KK0FJT09CRSBpbiBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcuc3Vic3RpdHV0ZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTM1MzUiPjM1MzUzNTwvYT4KK0VjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzIHdyb25nIGJ5dGVjb2RlIGZvciBuZXN0ZWQgdHJ5LXdpdGgtcmVzb3VyY2VzIHN0YXRlbWVudHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzU0NTc5Ij4zNTQ1Nzk8L2E+CitGdXAgb2YgYnVnIDI4OTI0NzogSW52ZXN0aWdhdGUgdmFsaWRpdHkgb2YgdGhlIGZpeCB2aXMtYS12aXMgSkxTLgorCis8YSBuYW1lPSJ2X0I3NF9SMzd4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcuMSAtIEF1Z3VzdCAxMCwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNzRfUjM3eAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNzRfUjM3eCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgbmV3IEFQSSBpbiBCaW5kaW5nS2V5IHRvIHJldHVybiBpdCdzIGRlY2xhcmluZyB0eXBlKHNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MTE2NSI+MzUxMTY1PC9hPiBmb3IgZGV0YWlscyk6Cis8cHJlPgorLyoqCisgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGtleSBvZiB0aGUgZGVjbGFyaW5nIHR5cGUgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nIGtleS4gSWYgdGhlIGJpbmRpbmcga2V5CisgKiBkb2VzIG5vdCByZXByZXNlbnQgYSBtZW1iZXIgb3IgaWYgdGhlIG1lbWJlciBkb2Vzbid0IGhhdmUgYSBkZWNsYXJpbmcgdHlwZSwgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAqIAorICogPHA+CisgKiBOb3RlIHRoYXQgb25seSBiaW5kaW5nIGtleXMgZm9yIHJlZmVyZW5jZXMgdG8gbWV0aG9kcyBhbmQgZmllbGRzCisgKiBhcmUgZnVsbHkgc3VwcG9ydGVkLiBUaGUgYmluZGluZyBrZXlzIGZvciBkZWNsYXJhdGlvbnMgd2lsbCBub3QgaGF2ZSB0eXBlIHBhcmFtZXRlcnMuCisgKiAKKyAqIEByZXR1cm4gdGhlIHR5cGUgYmluZGluZyBrZXkgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEBzaW5jZSAzLjcuMQorICovCitwdWJsaWMgQmluZGluZ0tleSBnZXREZWNsYXJpbmdUeXBlKCk7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc3MTkiPjMxNzcxOTwvYT4KK01ldGhvZCBpbmNvcnJlY3RseSBmbGFnZ2VkIGFzIGhhdmluZyBzYW1lIGVyYXN1cmUgb3V0cHV0IHdoZW4gcmV0dXJuIHR5cGUgZGlmZmVycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTQwNTIiPjM1NDA1MjwvYT4KK1sxLjddIE5QRSBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlLnRyYXZlcnNlKENsYXNzRmlsZS5qYXZhOjQ1MDcpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MzIzOCI+MzUzMjM4PC9hPgorWzEuN10gdXBkYXRlIHVudXNlZFR5cGVBcmdzIG9wdGlvbiBkZXNjcmlwdGlvbiBmb3IgdGhlIGJhdGNoIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MzA4OSI+MzUzMDg5PC9hPgorWzEuN11bY29tcGlsZXJdIEluY29ycmVjdCBuYW1lIGNsYXNoIGVycm9yIHdpdGggZWNqCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MTE2NSI+MzUxMTY1PC9hPgorWzEuN10gQVBJIHRvIGdldCB0aGUgdHlwZSBhcmd1bWVudHMgb2YgdGhlIGRlY2xhcmluZyB0eXBlIGZvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucworCis8YSBuYW1lPSJ2X0I3M19SMzd4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcuMSAtIEF1Z3VzdCAzLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I3M19SMzd4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I3M19SMzd4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTM1NTMiPjM1MzU1MzwvYT4KK1JlbmFtZSByZWFkYWJsZU5hbWVzLnByb3BlcnRpZXMgdG8gYXZvaWQgdHJhbnNsYXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUzMDg1Ij4zNTMwODU8L2E+CitbMS43XSBDYW5ub3QgY2FzdCBmcm9tIE9iamVjdCB0byBib29sZWFuCisKKzxhIG5hbWU9InZfQjcyX1IzN3giPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNy4xIC0gSnVseSAyOCwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNzJfUjM3eAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNzIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5QbHVnaW4gdmVyc2lvbiBoYXMgYmVlbiBpbmNyZW1lbnQgdG8gMy43LjE8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUzMjUxIj4zNTMyNTE8L2E+CitbMS43XSBtZXJnaW5nIEphdmEgNyB3b3JrIHRvIFIzXzdfbWFpbnRlbmFuY2UgYnJhbmNoCisKKzxhIG5hbWU9InZfQjcxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcuMSAtIEp1bHkgMjcsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjcxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I3MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTE0MjYiPjM1MTQyNjwvYT4KK1sxLjddW2NvZGUgYXNzaXN0XSBDb21wbGV0aW9uQ29udGV4dC5nZXRFeHBlY3RlZFR5cGVzS2V5cygpIHJldHVybnMgd3JvbmcgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTMxMzciPjM1MzEzNzwvYT4KK1sxLjddIE1ha2Ugc3VyZSBUYWdCaXRzLkFubm90YXRpb25TYWZlVmFyYXJncyBhbmQgQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlIGFyZSBoYW5kbGVkIGV2ZXJ5d2hlcmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUzMDkzIj4zNTMwOTM8L2E+CitJTWV0aG9kI2dldEFubm90YXRpb25zKCkgZG9lc24ndCByZXR1cm4gQFNhZmVWYXJhcmdzIG9mIGphdmEudXRpbC5BcnJheXMjYXNMaXN0KFQuLi4pCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MjQ2NCI+MzUyNDY0PC9hPgorWzEuN10gSW5jb3JyZWN0IEphdmFkb2Mgc2hvd24gZm9yIHJlZmVyZW5jZSBvZiBpbnZva2VFeGFjdAorCis8YSBuYW1lPSJ2X0I3MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43LjEgLSBKdWx5IDIxLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I3MAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNzAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUxNDk4Ij4zNTE0OTg8L2E+CitbbW9kZWxdamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gdXBvbiBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MjY5OSI+MzUyNjk5PC9hPgorWzEuN11bY29tcGlsZXJdIEltcHJvdmUgZXJyb3IgcmFuZ2UgZm9yIHJlZHVuZGFudCB0eXBlIHBhcmFtZXRlciB3YXJuaW5nCisKKzxhIG5hbWU9InZfQjY5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcuMSAtIEp1bHkgMjAsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjY5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I2OSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTI2NjUiPjM1MjY2NTwvYT4KK1sxLjZdW2NvbXBpbGVyXSBJbnRlcm5hbCBjb21waWxlciBFcnJvcjogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIGNlcnRhaW4gY2xhc3NlcyB3aXRoIG91dGVyIGFjY2VzcyBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTI1NTMiPjM1MjU1MzwvYT4KK1sxLjddICdjaGFyIGFcdTIwMGInIGlzIGJlaW5nIGFjY2VwdGVkIGluIDEuNiBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MjQ5NiI+MzUyNDk2PC9hPgordGVzdHMgdXNpbmcgd3JvbmcgdmVyc2lvbiBvZiBKQ0wKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwNTc2Ij4zMDA1NzY8L2E+CitOUEUgQ29tcHV0aW5nIHR5cGUgaGllcmFyY2h5IHdoZW4gY29tcGxpYW5jZSBkb2Vzbid0IG1hdGNoIGxpYnJhcmllcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTIxNDUiPjM1MjE0NTwvYT4KK1sxLjddW2NvbXBpbGVyXSBWZXJpZnlFcnJvciB3aXRoIGFsb2FkMCBiZWluZyBpbnZvbHZlZCBpbnRvIENvbmRpdGlvbmFsRXhwcmVzc2lvbgorCisKKzxhIG5hbWU9InZfQjY4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcuMSAtIEp1bHkgMTQsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjY4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I2OCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgbmV3IEFQSSBpbiBDb21wbGV0aW9uUHJvcG9zYWwgdG8gdGVsbCB3aGV0aGVyIGl0IGRpYW1vbmQgb3BlcmF0b3IgY2FuIGJlIHVzZWQgKHNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MTQ0NCI+MzUxNDQ0PC9hPiBmb3IgZGV0YWlscyk6Cis8cHJlPgorLyoqIAorICogUmV0dXJucyB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gdXNlIHRoZSAnPD4nIChkaWFtb25kKSBvcGVyYXRvciBpbiBwbGFjZSBvZiBleHBsaWNpdGx5IHNwZWNpZnlpbmcKKyAqIHR5cGUgYXJndW1lbnRzIGZvciB0aGlzIHByb3Bvc2FsLiAKKyAqIAorICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBzb3VyY2UgbGV2ZWwgMS43IG9yIGdyZWF0ZXIuCisgKiAKKyAqIEBwYXJhbSBjb3JlQ29udGV4dCB0aGUgY29tcGxldGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zYWwKKyAqIEBzaW5jZSAzLjcKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgc2FmZSB0byB1c2UgdGhlIGRpYW1vbmQgb3BlcmF0b3IgZm9yIHRoZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCAKKyAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIEFsc28gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIHNvdXJjZSBsZXZlbHMgYmVsb3cgMS43CisgKi8KK3B1YmxpYyBib29sZWFuIGNhblVzZURpYW1vbmQoQ29tcGxldGlvbkNvbnRleHQgY29yZUNvbnRleHQpOworPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUxOTY1Ij4zNTE5NjU8L2E+CitbMS43XSBDQ0Ugd2hlbiB1c2luZyBkaWFtb25kIGluIDEuNAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTE0NDQiPjM1MTQ0NDwvYT4KK1sxLjddW2NvbnRlbnQgYXNzaXN0XSBOZWVkIHRvIGtub3cgd2hldGhlciBJIGNhbiB1c2UgZGlhbW9uZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTIwMTQiPjM1MjAxNDwvYT4KK1x1MTM2OSBubyBsb25nZXIgYWNjZXB0ZWQgYXMgYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgcGFydAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTE2NTMiPjM1MTY1MzwvYT4KK1sxLjddW2NvbXBpbGVyXTogVmVyaWZ5RXJyb3IgaW4gdHJ5IHN0YXRlbWVudCB3aXRoIGZpbmFsbHkgYW5kIHJldHVybiBzdGF0ZW1lbnRzCisKKzxhIG5hbWU9InZfQjY3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcgLSBKdWx5IDEzLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I2NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNjciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgSmF2YWNvcmUgb3B0aW9uIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLkNPTVBJTEVSX1BCX1JFRFVOREFOVF9UWVBFX0FSR1VNRU5UUyBhZGRlZCB0byByYWlzZSB3YXJuaW5nIG9yIGVycm9yIGZvciByZWR1bmRhbnQKK3VzYWdlIG9mIHR5cGUgYXJndW1lbnRzIHdoZW4gZGlhbW9uZCBvcGVyYXRvciBjYW4gYmUgdXNlZCBpbnN0ZWFkLiAoc2VlIGRldGFpbHMgaW4gYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA3NDciPjM0MDc0NzwvYT4pOgogPHByZT4KIAkvKioKLQkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gd3JhcCBiZWZvcmUgdGhlIGJpbmFyeSBvcGVyYXRvcgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciIKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyByZWR1bmRhbnQgc3BlY2lmaWNhdGlvbiBvZiB0eXBlIGFyZ3VtZW50cyBpbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9ucy4KKwkgKiBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiB0eXBlIGFyZ3VtZW50cyBhcmUgdXNlZCBpbiBhIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLAorCSAqIHdoZW4gdGhlICc8Picgb3BlcmF0b3IgY2FuIGJlIHVzZWQgaW5zdGVhZC4KKwkgKgorCSAqIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSBpcyAxLjcgb3IgZ3JlYXRlci4KKwkgKiAKKwkgKiBPcHRpb24gaWQ6PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyI8L2NvZGU+CisJICogUG9zc2libGUgdmFsdWVzOjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPgorCSAqIERlZmF1bHQ6PGNvZGU+Imlnbm9yZSI8L2NvZGU+CisJICogCisJICogQHNpbmNlIDMuNworCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfUkVEVU5EQU5UX1RZUEVfQVJHVU1FTlRTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMiOworCTwvcHJlPgorPC9saT4KKzxsaT5BZGRlZCBhIG5ldyBBUEkgaW4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHRvIHRlbGwgd2hldGhlciB0aGUgcmVzb2x2ZWQgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBhc3NpZ25tZW50IGNvbnRleHQ6Cis8YnI+KHNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDg5NyI+MzUwODk3PC9hPiBmb3IgZGV0YWlscyk6Cis8cHJlPgorCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc29sdmVkIGNsYXNzIHR5cGUgaGFzIGJlZW4gaW5mZXJyZWQKKwkgKiBmcm9tIHRoZSBhc3NpZ25tZW50IGNvbnRleHQgKEpMUzQgMTUuMTIuMi44KSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKgorCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBiaW5kaW5ncyBhcmUgcmVxdWVzdGVkIHdoZW4gdGhlIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc29sdmVkIGNsYXNzIHR5cGUgaGFzIGJlZW4gaW5mZXJyZWQKKwkgKiAJZnJvbSB0aGUgYXNzaWdubWVudCBjb250ZXh0IChKTFMzIDE1LjEyLjIuOCksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZFR5cGVJbmZlcnJlZEZyb21FeHBlY3RlZFR5cGUoKTsKKzwvcHJlPgorPC9saT4KKzwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA3NDciPjM0MDc0NzwvYT4KK1sxLjddW2NvbXBpbGVyXSBjb21waWxlciBvcHRpb24gdG8gd2FybiB3aGVuIGRpYW1vbmQgY2FuIGJlIHVzZWQsIGJ1dCB0eXBlIGFyZ3MgYXJlIHVzZWQgaW5zdGVhZC4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwODk1Ij4zNTA4OTU8L2E+CitbMS43XVtmb3JtYXR0ZXJdIE5ldyBvcHRpb24gdG8gd3JhcCBiZWZvcmUvYWZ0ZXIgJ3wnIGluIG11bHRpLWNhdGNoCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDY1MiI+MzUwNjUyPC9hPgorWzEuN11bYXNzaXN0XSBDb21wbGV0aW9uIGlzc3VlcyB3aXRoIG11bHRpY2F0Y2ggKEZVUCBvZiAzNDM2MzcpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NzUwMyI+MzQ3NTAzPC9hPgorW0RPTV0gQVNUUGFyc2VyLnNldEVudmlyb25tZW50KCkgaWdub3JlcyBpbmNsdWRlUnVubmluZ1ZNQm9vdGNsYXNzcGF0aCBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwODk3Ij4zNTA4OTc8L2E+CitbMS43XVthcGldIENsYXNzSW5zdGFuY2VDcmVhdGlvbiNpc1Jlc29sdmVkVHlwZUluZmVycmVkRnJvbUV4cGVjdGVkVHlwZSgpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MTE3MCI+MzUxMTcwPC9hPgorWzEuN10gQVNUUmV3cml0ZSBpc3N1ZXMgaW4gVHJ5IHdpdGggcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODQ5MyI+MzQ4NDkzPC9hPgorWzEuN10gSW1wcm92ZSBlcnJvciBtc2cgZm9yIERpYW1vbmQgb3BlcmF0b3IgaW4gMS41IG1vZGUKKworPGEgbmFtZT0idl9CNjYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNyAtIEp1bHkgNSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNjYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjY2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDg4NSI+MzUwODg1PC9hPgorW1NlYXJjaF0gVGhlIHB1bGwgdXAgcmVmYWN0b3JpbmcgdGhyb3dzIGFuIE5QRSB3aGVuIHB1bGxpbmcgdXAgYSBtZW1iZXIgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3VwZXJjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTA2MTEiPjM1MDYxMTwvYT4KK1sxLjddIEluY29uc2lzdGVudCBlcnJvciBtc2cgYW5kIGVycm9yIGxvY2F0aW9uIGZvciBpbGxlZ2FsIGRpYW1vbmQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwNTc5Ij4zNTA1Nzk8L2E+CitbMS43XVtjb21waWxlcl0gVmVyaWZ5RXJyb3IgcnVubmluZyBleGFtcGxlIGZyb20gYnVnIDMzODQwMiBjb21tZW50IDUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwNzY3Ij4zNTA3Njc8L2E+CitbMS43XVthc3Npc3RdIENDRSB3aGlsZSBpbnZva2luZyBhc3Npc3Qgb24gYSBtdWx0aS1jYXRjaCBibG9jaworCis8YSBuYW1lPSJ2X0I2NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43IC0gSnVuZSAzMCwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNjUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjY1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTMxMiI+MzQ5MzEyPC9hPgorWzEuN11bY29tcGlsZXJdIGltcHJvdmVkIHByb2JsZW0gbWVzc2FnZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwMDAzIj4zNTAwMDM8L2E+CitbMS43XSBbY29tcGlsZXJdIEFubm90YXRpb25Qb2x5bW9ycGhpY1NpZ25hdHVyZSB0YWcgaXMgbm90IGJlaW5nIHNldCB0byBpbnZva2VFeGFjdCB3aGlsZSBjb21waWxpbmcgTWV0aG9kSGFuZGxlIHNvdXJjZSBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDQ5NiI+MzUwNDk2PC9hPgorWzEuN10gQFBvbHltb3JwaGljU2lnbmF0dXJlIElNZXRob2RzIGFyZSBtaXNzaW5nIHRoZSBhbm5vdGF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTMxNCI+MzQ5MzE0PC9hPgorWzEuN11bZm9ybWF0dGVyXSBMaW5lIHdyYXBwaW5nIGZvciBtdWx0aS1jYXRjaCBhcmd1bWVudHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwMDM5Ij4zNTAwMzk8L2E+CitbMS43XSBBU1RQYXJzZXIjY3JlYXRlQVNUcyguLikgZG9lc24ndCByZXNvbHZlIElNZXRob2RCaW5kaW5nIGZvciBAUG9seW1vcnBoaWNTaWduYXR1cmUgbWV0aG9kIHJlZmVyZW5jZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDkzOTYiPjM0OTM5NjwvYT4KK1sxLjddW2Zvcm1hdHRlcl0gTGluZSB3cmFwcGluZyBhbmQgaW5kZW50YXRpb24gb3B0aW9ucyBmb3IgdHJ5IHdpdGggcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDM2MSI+MzUwMzYxPC9hPgorWzEuN10gVW5oYW5kbGVkIGV4Y2VwdGlvbiB0eXBlIEV4Y2VwdGlvbgorCis8YSBuYW1lPSJ2X0I2NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43IC0gSnVuZSAyMywgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNjQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjY0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTQ4OCI+MzQ5NDg4PC9hPgorWzEuN10gSU1ldGhvZEJpbmRpbmcjZ2V0TWV0aG9kRGVjbGFyYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBvZiBAUG9seW1vcnBoaWNTaWduYXR1cmUgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDk0ODciPjM0OTQ4NzwvYT4KK1sxLjddIElNZXRob2RCaW5kaW5nI2dldEphdmFFbGVtZW50KCkgcmV0dXJucyBpbmV4aXN0ZW50IGVsZW1lbnQgZm9yIEBQb2x5bW9ycGhpY1NpZ25hdHVyZSBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTg2MiI+MzQ5ODYyPC9hPgorWzEuN10gTlBFIHdoZW4gdHJ5aW5nIHRvIHVzZSBVbmlvblR5cGUgYXMgVHJ5U3RhdGVtZW50IHJlc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTg2NCI+MzQ5ODY0PC9hPgorWzEuN11bY29tcGlsZXJdIEVycm9yIG1lc3NhZ2UgY29uc2lkZXJzIEF1dG9DbG9zZWFibGUgYXMgY2xhc3MKKworPGEgbmFtZT0idl9CNjMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNyAtIEp1bmUgMTcsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjYzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I2MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDg5NTYiPjM0ODk1NjwvYT4KK1sxLjddIElUeXBlQmluZGluZyNpc0Fzc2lnbm1lbnRDb21wYXRpYmxlKElUeXBlQmluZGluZykgcmV0dXJucyBkaWZmZXJlbnQgcmVzdWx0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTMxMiI+MzQ5MzEyPC9hPgorWzEuN11bY29tcGlsZXJdIGltcHJvdmVkIHByb2JsZW0gbWVzc2FnZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MDA4Ij4zNDkwMDg8L2E+CitbMS43XSBVZ2x5IGZvcm1hdHRpbmcgZm9yIHRyeSB3aXRoIHJlc291cmNlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDkwNzIiPjM0OTA3MjwvYT4KK1sxLjddICZxdW90O0Nhbm5vdCBpbmZlciBlbGlkZWQgdHlwZShzKSZxdW90OyBzb3VuZHMgdG9vIGVsaXRlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODcwNSI+MzQ4NzA1PC9hPgorWzEuN11bY29tcGlsZXJdIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3IgdW5oYW5kbGVkIElPRXhjZXB0aW9uIGdlbmVyYXRlZCBkdWUgdG8gY29tcGlsZXItZ2VuZXJhdGVkIGNsb3NlKCkKKworPGEgbmFtZT0idl9CNjIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNyAtIEp1bmUgNywgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNjIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjYyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODA1MCI+MzQ4MDUwPC9hPgorWzEuN10gRXJyb3IgaW4gSkRUIENvcmUgZHVyaW5nIEFTVCBjcmVhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDg0MDYiPjM0ODQwNjwvYT4KK1sxLjddIEluY29ycmVjdCBlcnJvciBtc2cgb24gdHJ5IHdpdGggcmVzb3VyY2VzIGluIDEuNSBtb2RlIAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDg0OTIiPjM0ODQ5MjwvYT4KK1sxLjddIEltcHJvdmUgZXJyb3IgbXNnIG9uIHN0cmluZ3MgaW4gc3dpdGNoIGluIDEuNSBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODQ5MSI+MzQ4NDkxPC9hPgorWzEuN10gUmVuYW1lIElQcm9ibGVtLklsbGVnYWxCaW5hcnlMaXRlcmFsIHRvIEJpbmFyeUxpdGVyYWxOb3RCZWxvdzE3IGFuZCBJUHJvYmxlbS5JbGxlZ2FsVXNhZ2VPZlVuZGVyc2NvcmUgdG8gVW5kZXJzY29yZUluTGl0ZXJhbHNOb3RCZWxvdzE3Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODM2OSI+MzQ4MzY5PC9hPgorWzEuN10gTWlzc2luZyBlcnJvciAmcXVvdDtObyBleGNlcHRpb24gb2YgdHlwZSBFeGNlcHRpb25bXSBjYW4gYmUgdGhyb3duJnF1b3Q7Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODM3OSI+MzQ4Mzc5PC9hPgorWzEuN11bY29tcGlsZXJdIE51bGwgcG9pbnRlciBhY2Nlc3Mgd2FybmluZyBmb3Igc3RyaW5ncyBpbiBzd2l0Y2gKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ2NDE1Ij4zNDY0MTU8L2E+CitbMS43XVthc3Npc3RdIE5vIHByb3Bvc2FsIGluc2lkZSBjYXRjaCBzdGF0ZW1lbnQgZnJvbSAzcmQgY2F0Y2ggYmxvY2sgb253YXJkcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDY0NTQiPjM0NjQ1NDwvYT4KK1sxLjddW2NvbnRlbnQgYXNzaXN0XUdldHRpbmcgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIGNvbnRlbnQgYXNzaXN0IGFmdGVyIGRpYW1vbmQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3NjAwIj4zNDc2MDA8L2E+CitbMS43XVtjb21waWxlcl0gU3VzcGVjdCBib3VuZHMgY2hlY2sgZmFpbHVyZSBhZnRlciBpbmZlcmVuY2UuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Nzc0NiI+MzQ3NzQ2PC9hPgorWzEuN11bY29tcGlsZXJdIEJvdW5kcyBjaGVjayBmYWlsdXJlIGR1cmluZyBtZXRob2QgaW5mZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MzM1MyI+MjgzMzUzPC9hPgorWzEuNV1bY29tcGlsZXJdIEVjbGlwc2UgY29tcGlsZXIgc2hvd3MgZXJyb3Igb24gamF2YWMtdmFsaWQgY29uc3RydWN0OiBCb3VuZCBtaXNtYXRjaAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDcxNDUiPjM0NzE0NTwvYT4KK1sxLjddW2NvbXBpbGVyXSBCb3VuZHMgY2hlY2sgaXNzdWUgd2l0aCByYXcgdHlwZXMgaW4gbWV0aG9kIGluZmVyZW5jZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDc0MjYiPjM0NzQyNjwvYT4KK1sxLjddW2NvbXBpbGVyXSBlY2ogYmVoYXZpb3IgZGlmZmVycyBmcm9tIGphdmFjCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDUyMiI+MzQ0NTIyPC9hPgorWzEuN10gSW5jb3JyZWN0IHNvdXJjZSByYW5nZSBmb3IgUGFyYW1ldGVyaXplZFR5cGUgaW4gY2FzZSBvZiBEaWFtb25kCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTc5NSI+MzQxNzk1PC9hPgorWzEuN11bY29tcGlsZXJdIENhbm5vdCBhc3NpZ24gYSBnZW5lcmljIG1ldGhvZCB3aXRoIG11bHRpcGxlIGJvdW5kcyByZXR1cm4gdmFsdWUgdG8gYW55IHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjE1OSI+MjQyMTU5PC9hPgorWzEuN11bY29tcGlsZXJdIHR5cGUgaW5mZXJlbmNlIHdpdGggdW5ib3VuZGVkIHdpbGRjYXJkIGluIHJlc3VsdCB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzY5MyI+MzQzNjkzPC9hPgorWzEuN10gQWRqdXN0IHN1YmNsYXNzZXMgb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24gZm9yICZsdDsmZ3Q7IHN1cHBvcnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNjM3Ij4zNDM2Mzc8L2E+CitbMS43XSBBbHJlYWR5IHVzZWQgZXhjZXB0aW9uIG9mZmVyZWQgYWdhaW4gaW4gYSBNdWxpY2F0Y2ggYmxvY2sKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1OTY4Ij4zNDU5Njg8L2E+CitbMS43XVtjb21waWxlcl0gTlBFIHdoaWxlIHVzaW5nIGRpYW1vbmQgZm9yIGlubmVyIGNsYXNzIGFsbG9jYXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MzEzIj4zMzQzMTM8L2E+CitbMS41XVtjb21waWxlcl0gQnVnIGluIHRoZSB3YXkgZWNsaXBzZSBoYW5kbGVzIG92ZXJyaWRpbmcgb2YgZ2VuZXJpYyBhYnN0cmFjdCBtZXRob2QgYnkgYSBub24tYWJzdHJhY3QgbWV0aG9kCisKKzxhIG5hbWU9InZfQjYxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjcgLSBKdW5lIDcsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjYxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I2MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlVwZGF0ZSBiYXRjaCBjb21waWxlciB2ZXJzaW9uIHRvIHJlZmVyIHRvIDMuNy4wIGFuZCBub3QgMy43LjAgUkMyPC9saT4KKzwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGEgbmFtZT0idl9CNjAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN1JDMiAtIE1heSAxOSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNjAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjYwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NjAwMiI+MzQ2MDAyPC9hPgorSW1wb3J0IG9mIFVzZXIgTGlicmFyeSB3aXRoIGludmFsaWQgcGF0aCBob3NlcyBVc2VyIExpYnJhcnkgRGlhbG9nIC0tIGNhbiBub3QgZml4Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDE4MSI+MzQwMTgxPC9hPgorRm9ybWF0dGVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSBicmVha3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ2MDI5Ij4zNDYwMjk8L2E+CitbMS43XVtjb21waWxlcl0gRWNsaXBzZSBjb21waWxlcyBjb2RlIHJlamVjdGVkIGJ5IEpESzcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1NjI4Ij4zNDU2Mjg8L2E+CitbMS43XSBSZW5hbWUgZGlzanVuY3RpdmUgdHlwZSB0byB1bmlvbiB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NTU1OSI+MzQ1NTU5PC9hPgorWzEuN11bY29tcGlsZXJdIFR5cGUgaW5mZXJlbmNlIGZvciBnZW5lcmljIGFsbG9jYXRpb24gY2FuIGJlIGF2b2lkZWQgZm9yIGludmFsaWQgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQyODE5Ij4zNDI4MTk8L2E+CitDb2RlIHJlamVjdGVkIGJ5IGphdmFjIHdpdGggbmFtZSBjbGFzaCBlcnJvciBjb21waWxlcyB1bmRlciBlY2xpcHNlLgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQzMDYiPjMzNDMwNjwvYT4KK1sxLjddW2NvbXBpbGVyXSBuYW1lIGNsYXNoIHJlcG9ydGVkIGluIGphdmFjIDEuNyBhbmQgbm90IGluIGphdmFjIDEuNgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDU1NzkiPjM0NTU3OTwvYT4KK1sxLjddW2NvbXBpbGVyXSBXZWlyZCBlcnJvciBtZXNzYWdlIGluIHJldGhyb3cgc2l0ZQorCis8YSBuYW1lPSJ2X0I1OSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43UkMxIC0gTWF5IDEyLCAyMDExIC0gMy43LjAgUkMxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I1OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1NTY5Ij4zNDU1Njk8L2E+CitGVVAgb2YgYnVnIDM0NTMzNDogQ29kZVNuaXBwZXRUZXN0IGhhcyBsb3Qgb2YgZmFpbHVyZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1NTIyIj4zNDU1MjI8L2E+CitbMS43XVtjb21waWxlcl0gQ29tcGlsZXJzIGZhaWxzIHRvIGNvbXB1dGUgcHJlY2lzZWx5IHJldGhyb3duIHR5cGVzCisKKzxhIG5hbWU9InZfQjU4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdSQzEgLSBNYXkgMTEsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjU4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I1OCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUzMzQiPjM0NTMzNDwvYT4KK0NvZGVTbmlwcGV0J3MgcnVuIG1ldGhvZCBpcyBtaXNzaW5nIEBPdmVycmlkZSBhbm5vdGF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDgyNCI+MzQ0ODI0PC9hPgorWzEuN11bY29tcGlsZXJdIEluY29ycmVjdCBlcnJvciByYW5nZSBmb3IgdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2sgZXJyb3IgaW4gbXVsdGktY2F0Y2gKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNDg2Ij4zNDA0ODY8L2E+CitbMS43XVtjb21waWxlcl0gTWlzc2luZyBlcnJvciBpbiBtdWx0aSBjYXRjaCBzY2VuYXJpbworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUzNTkiPjM0NTM1OTwvYT4KK1sxLjddW2NvbXBpbGVyXSBBSU9PQiBvbiBkaWFtb25kIGNvbnN0cnVjdCB3aXRoIGFyZ3VtZW50IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NTIzOSI+MzQ1MjM5PC9hPgorWzEuN11bY29tcGlsZXJdIENvbXBpbGVyIHNob3VsZCBpc3N1ZSBiZXR0ZXIgZGlhZ25vc3RpY3MgZm9yIHVzZSBvZiAmbHQ7Jmd0OyB3aXRoIGFub255bW91cyBjbGFzc2VzCisKKzxhIG5hbWU9InZfQjU3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdSQzEgLSBNYXkgMTAsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjU3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I1NyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY0NTEiPjMzNjQ1MTwvYT4KKyZxdW90O0NvbnRlbnQgQXNzaXN0JnF1b3Q7IGRvZXMgbm90IGNvbXBsZXRlIG5vcm1hbGx5IG9uIGNlcnRhaW4gdHlwZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0OTg3Ij4zMjQ5ODc8L2E+CitbZm9ybWF0dGVyXSBBUEkgY29tcGF0aWJpbGl0eSBwcm9ibGVtIHdpdGggQW5ub3RhdGlvbiBOZXdsaW5lIG9wdGlvbnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0NjU1Ij4zNDQ2NTU8L2E+CitbMS43XVtjb21waWxlcl0gUHJvaGliaXQgdXNlIG9mICZsdDsmZ3Q7IHdpdGggZXhwbGljaXQgdHlwZSBhcmd1bWVudHMgdG8gZ2VuZXJpYyBjb25zdHJ1Y3RvcgorCis8YSBuYW1lPSJ2X0I1NiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43UkMxIC0gTWF5IDYsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjU2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I1NiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlJldmVydGluZyBmaXggZm9yIGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NjQ4Ij4zMzY2NDg8L2E+PC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODU3NSI+MzI4NTc1PC9hPgorSW5oZXJpdGFuY2Ugb2YgYW5ub3RhdGlvbiBmYWlscyB3aXRoIGdlbmVyaWMgY2xhc3NlcworCis8YSBuYW1lPSJ2X0I1NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43UkMxIC0gTWF5IDUsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjU1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I1NSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDQ4NiI+OTA0ODY8L2E+CitHaXZlIG1vcmUgaW5mbyB3aGVuIGEgZGVwZW5kZW5jeSBjeWNsZSBpcyBkZXRlY3RlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM4NjUiPjM0Mzg2NTwvYT4KK1thc3Npc3RdIENvbXBsZXRpb25Db250ZXh0IHRva2VuIHN0YXJ0IGFuZCBlbmQgaW5jb3JyZWN0bHkgcmV0dXJuaW5nIDAKKworPGEgbmFtZT0idl9CNTQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN1JDMSAtIE1heSA0LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I1NAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNTQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0MzAxIj4yNjQzMDE8L2E+CitBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gcmVzb2x2aW5nIEphdmFQcm9qZWN0IGNsYXNzcGF0aAorCis8YSBuYW1lPSJ2X0I1MyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAyNywgMjAxMSAtIDMuNy4wIE03Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I1MworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNTMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5SZXZlcnRpbmcgZml4IGZvciBidWcgMjkyMDg3OiBhbm9ueW1vdXMgY2xhc3MgaW4gYXJyYXkgbWVtYmVyIGluaXRpYWxpemVyIGNvbmZ1c2VzIGNvbnRlbnQgYXNzaXN0PC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8YSBuYW1lPSJ2X0I1MiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAyNywgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNTIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjUyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+VXBkYXRlIGNvcHlyaWdodHM8L2xpPgorPC91bD4KKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Mzc4NSI+MzQzNzg1PC9hPgorWzEuN10gSW5jb3JyZWN0IGxpbmUgbnVtYmVycyBpbiBzdGFjayB0cmFjZSB3aXRoIHRyeSB3aXRoIHJlc291cmNlcworCis8YSBuYW1lPSJ2X0I1MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAyNSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNTEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjUxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTIyNiI+MzM5MjI2PC9hPgorRG9jdW1lbnQgYXNzdW1wdGlvbnMgYWJvdXQgRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5uZXdBc3RUb09sZEFzdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM3MTMiPjM0MzcxMzwvYT4KK1tjb21waWxlcl0gYm9ndXMgbGluZSBudW1iZXIgaW4gY29uc3RydWN0b3Igb2YgaW5uZXIgY2xhc3MgaW4gMS41IGNvbXBsaWFuY2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNjg3Ij4zNDM2ODc8L2E+CitbMS43XSBJQUUgaW4gTnVtYmVyTGl0ZXJhbCNzZXRUb2tlbihTdHJpbmcpIGZvciBiaW5hcnkgdG9rZW5zIGFuZCB0b2tlbnMgd2l0aCB1bmRlcnNjb3JlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQ3OCI+MzM5NDc4PC9hPgorWzEuN11bY29tcGlsZXJdIHN1cHBvcnQgZm9yIGRpYW1vbmQgY2FzZQorCis8YSBuYW1lPSJ2X0I1MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAyMSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNTAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjUwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzYwNyI+MzQzNjA3PC9hPgorW0FQVF0gSW1wcm92ZSBvdXRwdXQgZm9yIGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5NZXNzYWdlciBwcm9ibGVtcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM0NzYiPjM0MzQ3NjwvYT4KK1sxLjddW2Fzc2lzdF0gcHJvcG9zZSBTdHJpbmcgdmFyaWFibGVzIGFuZCBmaWVsZHMgaW5zaWRlIGNhdGNoIGV4cHJlc3Npb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMDg3Ij4yOTIwODc8L2E+Cithbm9ueW1vdXMgY2xhc3MgaW4gYXJyYXkgbWVtYmVyIGluaXRpYWxpemVyIGNvbmZ1c2VzIGNvbnRlbnQgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzQ3NSI+MzQzNDc1PC9hPgorWzEuN10gQ29tcGlsZXIgd2FybmluZyBmb3IgaW52YWxpZCB0eXBlIGluc2lkZSBzd2l0Y2ggbmVlZHMgdG8gYmUgaW1wcm92ZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzMzQyIj4zNDMzNDI8L2E+CitbYXNzaXN0XSBOb24gY29uc3RhbnQgdmFyaWFibGVzLCBzdHJpbmdzIGFuZCBtZXRob2RzIGFyZSBwcm9wb3NlZCBpbnNpZGUgY2FzZSBzdGF0ZW1lbnRzCisKKzxhIG5hbWU9InZfQjQ5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNyAtIEFwcmlsIDIxLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I0OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNDkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MjgxIj4zMjgyODE8L2E+Cit2aXNpYmlsaXR5IGxlYWtzIG5vdCBkZXRlY3RlZCB3aGVuIGFuYWx5emluZyB1bnVzZWQgZmllbGQgaW4gcHJpdmF0ZSBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU5ODYiPjMzNTk4NjwvYT4KK05vIGV4cGVjdGVkIGV2ZW50IGZpcmVkIHdoZW4gcmVtb3ZpbmcgYSBKQVIgZmlsZSBmcm9tIGEgY2xhc3NwYXRoIGNvbnRhaW5lcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDI2NzEiPjM0MjY3MTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbjogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZyBjYW5ub3QgYmUgY2FzdCB0byBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZworCis8YSBuYW1lPSJ2X0I0OCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAxOSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNDgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjQ4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzQxNSI+MzM3NDE1PC9hPgorRXh0ZXJuYWwgZm9sZGVycyBwcm9qZWN0IGlzIG5vdCBjcmVhdGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjQ1NSI+MzQyNDU1PC9hPgorQVNUIHN3YWxsb3dzIHN0YXJzICgnKicpIGF0IGVuZCBvZiB7QGNvZGV9IGFuZCB7QGxpdGVyYWx9IEphdmFkb2MgZnJhZ21lbnRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Mjc1NyI+MzQyNzU3PC9hPgorQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIE1ldGhvZEluZm9XaXRoUGFyYW1ldGVyQW5ub3RhdGlvbnMuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMgd2hlbiBnZW5lcmF0aW5nIG1ldGhvZCBpbmZvIGZvciBhbiBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvciB3aXRoIGFubm90YXRlZCBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNjkxIj4zNDA2OTE8L2E+CitTeW50YXggZXJyb3IgbGVhZHMgdG8gQ2xhc3NDYXN0RXhjZXB0aW9uIGluIEFTVENvbnZlcnRlcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDI2NzEiPjM0MjY3MTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbjogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZyBjYW5ub3QgYmUgY2FzdCB0byBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZworCis8YSBuYW1lPSJ2X0I0NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBBcHJpbCAxMywgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNDcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjQ3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjMwMCI+MzQyMzAwPC9hPgorW251bGxdU3B1cmlvdXMgJnF1b3Q7bnVsbCBwb2ludGVyIGFjY2VzcyZxdW90OyB3YXJuaW5nIG9uIHVuYm94aW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjQxNiI+MzQyNDE2PC9hPgorWzEuN10gU2lnbmF0dXJlI2NyZWF0ZUludGVyc2VjdGlvblR5cGVTaWduYXR1cmUoLi4pIHNob3VsZCB0YWtlIGFycmF5IG9mIHNpZ25hdHVyZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMDU5Ij4zNDAwNTk8L2E+CitbMS43XSBJQUUgd2hlbiBkZWFsaW5nIHdpdGggU2lnbmF0dXJlIG9mIGRpc2p1bmN0aXZlIHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNzU5Ij4zNDE3NTk8L2E+CitOUEUgaW4gSVR5cGVCaW5kaW5nI2dldE5hbWUoKSBmb3IgaW50ZXJzZWN0aW9uIHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNDk5Ij4zNDE0OTk8L2E+CitbY29tcGlsZXJdW251bGxdIGFsbG9jYXRlIGV4dHJhIGJpdHMgaW4gYWxsIG1ldGhvZHMgb2YgVW5jb25kaXRpb25hbEZsb3dJbmZvCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjA1NCI+MzQyMDU0PC9hPgorSUxvY2FsVmFyaWFibGUjaXNQYXJhbWV0ZXIoKSByZXR1cm5zIHRydWUgZm9yIGV4Y2VwdGlvbiBvZiBjYXRjaCBjbGF1c2UKKworPGEgbmFtZT0idl9CNDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN003IC0gQXByaWwgNiwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNDYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjQ2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTQ3NSI+MzQxNDc1PC9hPgorRWNsaXBzZSBkb2Vzbid0IHNob3cgYSAmcXVvdDtuZXZlciByZWFkIGxvY2FsbHkmcXVvdDsgd2FybmluZyBpZiBhIHByaXZhdGUgZmllbGQgc2VyaWFsVmVyc2lvblVJRCBleGlzdHMgYnV0IHRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgU2VyaWFsaXphYmxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDQ5MyI+MzM0NDkzPC9hPgorWzEuN11bY29tcGlsZXJdIERpZmZlcmVuY2UgaW4gYmVoYXZpb3Igd2l0aCBKYXZhYzcKKworPGEgbmFtZT0idl9CNDUiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN003IC0gQXByaWwgNiwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNDUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjQ1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODc4OSI+MzM4Nzg5PC9hPgorWzEuN11bYXNzaXN0XSBObyBwcm9wb3NhbCBpbnNpZGUgYSBtdWx0aSBjYXRjaCBzdGF0ZW1lbnQgYWZ0ZXIgJ3wnCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTMzMyI+MzQxMzMzPC9hPgorWzEuN11bY29tcGlsZXJdIERpc2p1bmN0aXZlVHlwZVJlZmVyZW5jZSNyZXNvbHZlVHlwZSguLikgZG9lcyBub3Qgc2V0IHRoZSB2YWx1ZSBmb3IgRGlzanVuY3RpdmVUeXBlUmVmZXJlbmNlJHJlc29sdmVkVHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA2MzQiPjM0MDYzNDwvYT4KK1sxLjddW2NvbXBpbGVyXVttdWx0aWNhdGNoXSBDb21waWxlciBhY2NlcHRzIHR5cGUgdmFyaWFibGVzIGFzIGNhdGNoIHBhcmFtZXRlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDgyNyI+MjAwODI3PC9hPgorW3NwZWNdIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHNob3VsZCBtZW50aW9uIHdoZXJlIHRvIHJlZ2lzdGVyCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDYyNiI+MzQwNjI2PC9hPgorWzEuN11bY29tcGlsZXJdIEluY29uc2lzdGVudCBzb3VyY2UgcGlucG9pbnRpbmcgaW4gbXVsdGktY2F0Y2ggYmxvY2tzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDUxMyI+MzQwNTEzPC9hPgorWzEuN11bY29tcGlsZXJdIFVuaWNvZGUgNi4wIGNoYXJhY3RlcnMgd29yayBhdCBjb21waWxlciBjb21wbGlhbmNlIGxldmVsIDEuNSBhbmQgMS42Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDQ0NSI+MzQwNDQ1PC9hPgorWzEuN10gQVNUUmV3cml0ZUFuYWx5emVyIGFuZCBBU1RSZXdyaXRlRmxhdHRlbmVyIG5lZWQgdXBkYXRlcworCis8YSBuYW1lPSJ2X0I0NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTcgLSBNYXJjaCAyMiwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CNDQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjQ0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQ0NyI+MzM5NDQ3PC9hPgorc3luY2hyb25pemVkIGFjY2VzcyBtb2RpZmllciByZXRhaW5lZCBvbiBjbG9uZSgpIGJyaWRnZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAzNzIiPjM0MDM3MjwvYT4KK1sxLjddIE5haXZlQVNURmxhdHRlbmVyIG5lZWRzIHRvIHN1cHBvcnQgdGhlIG5ldyBBU1Qgbm9kZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMzY1Ij4zNDAzNjU8L2E+CitbMS43XSBQcm9ibGVtcyBpbiBuZXcgQVBJcyAoVHJ5U3RhdGVtZW50V2l0aFJlc291cmNlcywgRGlzanVuY3RpdmVUeXBlKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAzNzUiPjM0MDM3NTwvYT4KK1sxLjddIE1lcmdlIFRyeVN0YXRlbWVudFdpdGhSZXNvdXJjZXMgaW50byBUcnlTdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5ODkxIj4zMzk4OTE8L2E+CitOUEUgd2hlbiBzZWFyY2hpbmcgZm9yIG1ldGhvZCAod2l0aCAnKicgd2lsZGNhcmQgY2hhcmFjdGVyKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAwMjIiPjM0MDAyMjwvYT4KK1sxLjddW2NvbXBpbGVyXSBTdXBwb3J0IGZvciBwcmVjaXNlIHJldGhyb3cKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMDI5Ij4zNDAwMjk8L2E+CitbMS41XVtjb21waWxlcl0gRW51bSBjb25zdHJ1Y3RvciB0aGF0IHRocm93cyBFeGNlcHRpb24gcmVwb3J0cyBhIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlCisKKzxhIG5hbWU9InZfQjQzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNyAtIE1hcmNoIDE1LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I0MworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNDMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5MzM3Ij4zMzkzMzc8L2E+Citpc0xvY2FsKCkgaW4gSVR5cGUgcmV0dXJucyB0cnVlIGZvciBhbm9ueW1vdXMgdHlwZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5ODM3Ij4zMzk4Mzc8L2E+CitbMS43XVtjb21waWxlcl0gTXVsdGljYXRjaCBzeW50YXggbm90IHJlamVjdGVkIGF0IDEuNi0KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3OTYyIj4zMzc5NjI8L2E+CitDT01QSUxFUl9QQl9VTkFWT0lEQUJMRV9HRU5FUklDX1RZUEVfUFJPQkxFTVMgbWlzc2VzIHJlZmVyZW5jZSB0byBmaWVsZCBmcm9tIHN1cGVydHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgwMTEiPjMzODAxMTwvYT4KK0NPTVBJTEVSX1BCX1VOQVZPSURBQkxFX0dFTkVSSUNfVFlQRV9QUk9CTEVNUyB3cm9uZ2x5IHN1cHByZXNzZXMgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NzUxIj4zMzc3NTE8L2E+CitDT01QSUxFUl9QQl9VTkFWT0lEQUJMRV9HRU5FUklDX1RZUEVfUFJPQkxFTVMgbWlzc2VzIHJlZmVyZW5jZXMgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk4NzAiPjMzOTg3MDwvYT4KK1sxLjddIEJhZCBsaXN0IG9mIHN1YmNsYXNzZXMgaW4gU3RhdGVtZW50IEFTVCBub2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTkxMyI+MzM5OTEzPC9hPgorW2NvbXBpbGVyXSBNaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UgZm9yIGFubm90YXRpb25zIGluc2lkZSBhIG1ldGhvZCBib2R5Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTg2NCI+MzM5ODY0PC9hPgorWzEuN10gQWRkIHJlY292ZXJ5IGluIEFTVENvbnZlcnRlciBmb3IgYWxsIG5ldyBjb25zdHJ1Y3RzIGluIEpMUzMgbW9kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg0MDIiPjMzODQwMjwvYT4KK1sxLjddW2NvbXBpbGVyXVtlbmhdIE9wZW4gaXNzdWVzIGluIHRyeSB3aXRoIHJlc291cmNlcyBpbXBsZW1lbnRhdGlvbgorCis8YSBuYW1lPSJ2X0I0MiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTYgLSBNYXJjaCA5LCAyMDExIC0gMy43LjAgTTYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjQyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I0MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyNTAiPjMzOTI1MDwvYT4KK1tudWxsXSBJbmNvcnJlY3QgcmVkdW5kYW50IG51bGwgY2hlY2sgd2FybmluZyBvbiBhIFN0cmluZworCis8YSBuYW1lPSJ2X0I0MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTYgLSBNYXJjaCA4LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0I0MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CNDEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5MTM5Ij4zMzkxMzk8L2E+CitbY29tcGlsZXJdIEhFQUQgY29udGVudHMgb2Ygb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZSBkb2Vzbid0IGNvbXBpbGUgYW55bW9yZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg2NDkiPjMzODY0OTwvYT4KK1twZXJmc10gUmVncmVzc2lvbiBvbiBGdWxsU291cmNlV29ya3NwYWNlTW9kZWxUZXN0cyN0ZXN0SW5pdEpEVFBsdWdpbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkxMjgiPjMzOTEyODwvYT4KK1tEb2NdIFNvcnQgc3RhdGVtZW50cyBhbmQgZXhwcmVzc2lvbnMgaW5zaWRlIERPTSBkb2N1bWVudGF0aW9uIGZvciBib3RoIGFic3RyYWN0IGNsYXNzZXMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb25uIGFuZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RhdGVtZW50CisKKzxhIG5hbWU9InZfQjQwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNiAtIE1hcmNoIDYsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjQwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0I0MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY5NTAiPjMyNjk1MDwvYT4KK1tjb21waWxlcl1bbnVsbF1EbyBub3Qgb3B0aW1pemUgY29kZSBnZW5lcmF0aW9uIGJhc2VkIG9uIHN0YXRpYyBhbmFseXNpcyAoZGVhZCBjb2RlKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQxNzgiPjMyNDE3ODwvYT4KK1tudWxsXSBDb25kaXRpb25hbEV4cHJlc3Npb24ubnVsbFN0YXR1cyguLikgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgYW5hbHlzaXMgb2YgY29uZGl0aW9uIGl0c2VsZgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgwMDYiPjMzODAwNjwvYT4KK0lKYXZhUHJvamVjdCNnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpIHNob3VsZCByZXR1cm4gcm9vdHMgaW4gb3JkZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MjM0Ij4zMzgyMzQ8L2E+CitbY29tcGlsZXJdIE1pc3Npbmcgd2FybmluZyBmb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpbiBkZWFkIGNvZGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NDI4Ij4zMzY0Mjg8L2E+CitbY29tcGlsZXJdW251bGxdIGJvZ3VzIHdhcm5pbmcgJnF1b3Q7cmVkdW5kYW50IG51bGwgY2hlY2smcXVvdDsgaW4gY29uZGl0aW9uIG9mIGRvIHt9IHdoaWxlKCkgbG9vcAorCis8YSBuYW1lPSJ2X0IzOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTYgLSBNYXJjaCAxLCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IzOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMzkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBuZXcgY29uc3RhbnQgb24gb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IHRvIHByb3ZpZGUgdGhlIHZhbHVlIG9mIHRoZSBjbGFzc3BhdGggZmlsZSBwYXRoLiBTZWUgZGV0YWlscyBpbiBidWcKKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDE1OTgiPjI0MTU5ODwvYT4uCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MTE4Ij4zMzgxMTg8L2E+CitbY29tcGlsZXJdIENhc3RFeHByZXNzaW9uIHR5cGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gYmUgYSB0eXBlIHJlZmVyZW5jZSBhbmQgbm90IGFuIGV4cHJlc3Npb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDE5Ij4xNzEwMTk8L2E+CitbamF2YWRvY11bc2VsZWN0XSBGMyBvbiB7QGluaGVyaXREb2N9IHRhZyBzaG91bGQgbmF2aWdhdGUgdG8gdGFyZ2V0IGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyMTg4Ij4yMjIxODg8L2E+CitbamF2YWRvY10gSW5jb3JyZWN0IHVzYWdlIG9mIGlubmVyIHR5cGUgbm90IHJlcG9ydGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODMwMyI+MzM4MzAzPC9hPgorW2NvbXBpbGVyXVtudWxsXSBXYXJuaW5nIGFib3V0IFJlZHVuZGFudCBhc3NpZ25tZW50IGNvbmZsaWN0cyB3aXRoIGRlZmluaXRlIGFzc2lnbm1lbnQgYW5hbHlzaXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3ODY4Ij4zMzc4Njg8L2E+CitbY29tcGlsZXJdW21vZGVsXSBpbmNvbXBsZXRlIHN1cHBvcnQgZm9yIHBhY2thZ2UtaW5mby5qYXZhIHdoZW4gdXNpbmcgU2VhcmNoYWJsZUVudmlyb25tZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzk2NCI+MzM3OTY0PC9hPgorW0RPTV0gY29kZSB0aGF0IHdvdWxkIGRlZmluaXRlbHkgY2F1c2UgTlBFIGlmIGV4ZWN1dGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTU5OCI+MjQxNTk4PC9hPgorW0FQSV0gQ29uc3RhbnQgbmVlZGVkIGZvciAuY2xhc3NwYXRoCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzc5NSI+MzM3Nzk1PC9hPgorWzEuN11bY29tcGlsZXJdIE1pc3NpbmcgdW5jaGVja2VkIHdhcm5pbmcgYXQgdmFyYXJncyBtZXRob2QvY3RvciBkZWNsYXJhdGlvbiBzaXRlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzgwMiI+MzM3ODAyPC9hPgorWzEuN11bY29tcGlsZXJdIFVzYWdlIG9mIDB4MGZmZmZmZmZmIGlzIGJlaW5nIHJlcG9ydGVkIGFzIG91dCBvZiByYW5nZS4KKworPGEgbmFtZT0idl9CMzgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN002IC0gRmVicnVhcnkgMjIsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjM4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IzOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgbmV3IEFQSSB0byBlYXNlIHRoZSByZXRyaWV2YWwgb2YgbWV0aG9kIHBhcmFtZXRlcidzIGFubm90YXRpb25zIChzZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ3ODMiPjMzNDc4MzwvYT4gZm9yIGRldGFpbHMpOgorPHByZT4KKy8qKgorICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZC4KKyAqIEFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLCBpZiB0aGUgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzLgorICogRm9yIGJpbmFyeSB0eXBlcywgYXNzb2NpYXRlZCBzb3VyY2UgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmFtZSByYW5nZSwKKyAqIHNvdXJjZSByYW5nZSBhbmQgdGhlIGZsYWdzLgorICogVGhlc2UgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMuCisgKiAKKyAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QKKyAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKyAqIEBzaW5jZSAzLjcKKyAqLworSUxvY2FsVmFyaWFibGVbXSBnZXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzc5OSI+MzM3Nzk5PC9hPgorWzEuN11bY29tcGlsZXJdW3ZhcmFyZ3NdIEVjbGlwc2UgZmFpbHMgdG8gcmVwb3J0IGVycm9yIG9uIGluY29ycmVjdCBTYWZlVmFyYXJncyB1c2FnZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc3MzgiPjMzNzczODwvYT4KK1sxLjddW2NvbnRlbnQgYXNzaXN0XVRlc3QgQ29tcGxldGlvblBhcnNlclRlc3QjdGVzdEVBXzEgZmFpbHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NzgzIj4zMzQ3ODM8L2E+CitbQVBJXSBBZGQgbmV3IEFQSSB0byBlYXNlIHRoZSByZXRyaWV2YWwgb2YgdGhlIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBmb3IgYW4gSU1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzYwNDYiPjMzNjA0NjwvYT4KK1NvdXJjZSBhdHRhY2htZW50IG5vdCByZWNvdmVyZWQgd2hlbiBpbXBvcnRpbmcgUHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NzgyIj4zMzY3ODI8L2E+CitbMS43XVtyZWNvdmVyeV1FeHRyYSBlcnJvciB0b2tlbnMgd2l0aCBpbnZhbGlkIHVuYXJ5IG9wZXJhdG9yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzg3MCI+MzEzODcwPC9hPgorV3Jvbmcgd2FybmluZ3Mgb24gSmF2YS5Db21waWxlci5FcnJvcnMvV2FybmluZ3MgJnF1b3Q7UmVkdW5kYW50IG51bGwgY2hlY2smcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3Mjc1Ij4zMzcyNzU8L2E+CitJbmNvcnJlY3Qvb3V0ZGF0ZWQgamF2YWRvYyBmb3Igb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MDkzIj4zMzcwOTM8L2E+CitbY29tcGlsZXJdW2dlbmVyaWNzXSBKYXZhYy13YXJuaW5nIG9uIHZhcmFyZyBtaXNzaW5nIGluIEVjbGlwc2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2OTM0Ij4zMzY5MzQ8L2E+CitbY29tcGlsZXJdIE5QRSBpbiBTY29wZS5nZXRUeXBlT3JQYWNrYWdlCisKKzxhIG5hbWU9InZfQjM3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNiAtIEZlYnJ1YXJ5IDE1LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IzNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMzciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRpbmcgYSBuZXcgdG9rZW4gImphdmFkb2MiIGZvciBAc3VwcHJlc3NXYXJuaW5ncyB0byByZW1vdmUgYWxsIHdhcm5pbmdzIHJlbGF0ZWQgdG8gamF2YWRvYy48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NzUxIj4zMzU3NTE8L2E+CitbMS43XVtjb21waWxlcl0gQ3ljbGUgaW5oZXJpdGFuY2UgaW4gdHlwZSBhcmd1bWVudHMgaXMgbm90IGRldGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTMwOSI+MzM1MzA5PC9hPgorW2Zvcm1hdHRlcl0gRlVQIG9mIGJ1ZyAzMzI4NDM6IGFkZCByZWdyZXNzaW9uIHRlc3QKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NjIyIj4zMzQ2MjI8L2E+CitFY2xpcHNlIGNvbXBpbGVyIGFsbG93cyBhY2Nlc3MgdG8gcHJpdmF0ZSBmaWVsZHMgZm9yIHR5cGVkIHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ3MzciPjI3NDczNzwvYT4KK1JlbGF0aXZlIENsYXNzcGF0aCBlbnRyaWVzIHNob3VsZCBub3QgYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk1NjYiPjE3OTU2NjwvYT4KK1tjb21waWxlcl0gU3VwcG9ydCBvZiBAU3VwcHJlc3NXYXJuaW5ncyBmb3IgSmF2YURvYyBXYXJuaW5ncworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4MjEiPjMzNjgyMTwvYT4KK0phdmFkb2MgcmVmZXJlbmNlIHRvIGNvbnN0cnVjdG9yIGRvZXMgbm90IHdvcmsgd2l0aG91dCBwYXJhbWV0ZXIgbGlzdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzExMzgiPjMzMTEzODwvYT4KK0FTVFJld3JpdGUjcmVwbGFjZSguLikgZG9lcyBub3QgY29uc2lkZXIgdGhlIFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIKKworPGEgbmFtZT0idl9CMzYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN002IC0gRmVicnVhcnkgMTEsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjM2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IzNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFsbCBKRFQvQ29yZSBwcm9qZWN0cyAodGVzdHMgaW5jbHVkZWQpIGhhdmUgYmVlbiBzZXQgdG8gZm9yY2Ugc3RyaWN0IGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgSlJFIHVzZWQgZm9yIHRoZSBwcm9qZWN0CithbmQgdGhlIEJSRUUgZGVmaW5lZCBmb3IgdGhlIHByb2plY3QuPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjU0NCI+MzM2NTQ0PC9hPgorW3JlZ3Jlc3Npb25dW2NvbXBpbGVyXSBTb3VyY2UgZmxhZ2dlZCBhcyBkZWFkIGNvZGUgaW5jb3JyZWN0bHkuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTQ1OSI+MTg5NDU5PC9hPgorWzEuNl1bY29tcGlsZXJdIERvYyBjb21tZW50IHN1cHBvcnQgc2hvdWxkIG5vdCBiZSBzeXN0ZW1hdGljYWxseSBhY3RpdmF0ZWQgd2hpbGUgcHJvY2Vzc2luZyBhbm5vdGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI4MzgiPjMzMjgzODwvYT4KK0JvZ3VzIHBvdGVudGlhbCBudWxsIHBvaW50ZXIgYWNjZXNzIHdhcm5pbmcgKHJlZ3Jlc3Npb247IHdvcmtzIHdpdGggMy42KQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQzNzciPjMzNDM3NzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbnZhbGlkICd0eXBlIG1pc21hdGNoJyBlcnJvciBpbiBjb25kaXRpb25hbCBleHByZXNzaW9uIChpZi1lbHNlIGNvbnN0cnVjdCBiZWhhdmVzIGNvcnJlY3QpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjMyMiI+MzM2MzIyPC9hPgorWzEuN11bc2VhcmNoXUNDRSB3aGlsZSBzZWFyY2hpbmcgZm9yIGEgdHlwZSByZWZlcmVuY2UgaW4gbXVsdGlwbGUgY2F0Y2ggcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU3ODAiPjMzNTc4MDwvYT4KK0NvbXBpbGVyIHNheXMgYSBtZXRob2QgY2FuIGJlIHBvdGVudGlhbGx5IHN0YXRpYyBidXQgdGhpcyBtZXRob2QgY29udGFpbnMgJ3RoaXMnCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMDc0NyI+MzEwNzQ3PC9hPgorW2NvbnRlbnQgYXNzaXN0XSBJcnJlbGV2YW50IHByb3Bvc2FscyB3aGlsZSBjb21wbGV0aW5nIGluc2lkZSBhcnJheSBpbml0aWFsaXplci4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1ODQ1Ij4zMzU4NDU8L2E+CitbY29tcGlsZXJdIGNvbXBpbGVyIHdyb25nbHkgc3VnZ2VzdHMgdG8gYWRkIGEgc3RhdGljIHF1YWxpZmllciB0byBhIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU2MDIiPjMzNTYwMjwvYT4KK1tzZWFyY2hdIEphdmEgaW5kZXhpbmcgdGhyZWFkIGNhbiBpbmRleCBkYXRhIG91dHNpZGUgb2Ygd29ya3NwYWNlCisKKzxhIG5hbWU9InZfQjM1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNSAtIEphbnVhcnkgMjUsIDIwMTEgLSAzLjcuMCBNNQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMzUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjM1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDE4OSI+MzI0MTg5PC9hPgorIFtzZWFyY2hdIE1ldGhvZCBkZWNsYXJhdGlvbiBzZWFyY2ggcmV0dXJucyBmYWxzZSByZXN1bHRzIChzdWZmaXggbWF0Y2ggb24gdHlwZSBuYW1lKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcxNDMiPjMyNzE0MzwvYT4KK0luZGV4TWFuYWdlciBzaG91bGQgbm90IGFjY2VwdCBuZXcgam9icyBpZiB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgaXMgbnVsbAorCis8YSBuYW1lPSJ2X0IzNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTUgLSBKYW51YXJ5IDI0LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IzNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMzQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgY29kZSBmb3JtYXR0ZXIgb3B0aW9uIHRvIHByZXNlcnZlIGV4aXN0aW5nIHdoaXRlIHNwYWNlIGJldHdlZW4gY29kZSBhbmQgbGluZSBjb21tZW50cy4KKzxicj5TZWUgZGV0YWlscyBpbiBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjk4OCI+MjgyOTg4PC9hPjoKKzxwcmU+CisJLyoqCisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgd2hpdGUgc3BhY2UgYmV0d2VlbiBjb2RlIGFuZCBsaW5lIGNvbW1lbnRzIHNob3VsZCBiZSBwcmVzZXJ2ZWQgb3IgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZQorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KIAkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRkFMU0UKLQkgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIG9ubHkgaWYgdGhlIG9wdGlvbiB7QGxpbmsgI0ZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0JJTkFSWV9FWFBSRVNTSU9OfSBpcyBzZXQuCisJICoKIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKLQkgKiBAc2luY2UgMy4zCisJICogQHNpbmNlIDMuNwogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9XUkFQX0JFRk9SRV9CSU5BUllfT1BFUkFUT1IgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUVEVSX0NPTU1FTlRfUFJFU0VSVkVfV0hJVEVfU1BBQ0VfQkVUV0VFTl9DT0RFX0FORF9MSU5FX0NPTU1FTlQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzIjsKKzwvcHJlPgorPC9saT4KKzwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUwOTMiPjMzNTA5MzwvYT4KK1tjb21waWxlcl1bbnVsbF0gbWluaW1hbCBob29rIGZvciBmdXR1cmUgbnVsbCBhbm5vdGF0aW9uIHN1cHBvcnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MTE5Ij4zMzQxMTk8L2E+CitBSU9PQkUgaW4gQmluZGluZ0tleVBhcnNlci5wYXJzZUlubmVyVHlwZSAod2FzOiBDb3B5IFF1YWxpZmllZCBOYW1lIHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjk4OCI+MjgyOTg4PC9hPgorW2Zvcm1hdHRlcl0gT3B0aW9uIHRvIGFsaWduIHNpbmdsZS1saW5lIGNvbW1lbnRzIGluIGEgY29sdW1uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDY1MiI+MzM0NjUyPC9hPgorSmF2YWRvYyBjb250ZW50IG5vdCBmb3VuZCBmb3Igbm9uLXN0YXRpYyBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MDkxIj4xMzYwOTE8L2E+CitDYW5ub3QgYWNjZXNzIEphdmFkb2MgbG9jYXRpb24gb3ZlciBodHRwCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzA4OSI+MzMzMDg5PC9hPgorW2NvbXBpbGVyXVtudWxsXUFJT09CRSB3aGlsZSBhc3NpZ25pbmcgdmFyaWFibGUgYSBwb3RlbnRpYWxseSBudWxsIHZhbHVlIGluIHRyeS9maW5hbGx5CisKKzxhIG5hbWU9InZfQjMzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNSAtIEphbnVhcnkgMTgsIDIwMTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjMzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IzMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU0MTgiPjMyNTQxODwvYT4KK1tzZWFyY2hdIFNlYXJjaCBmb3IgbWV0aG9kIGRlY2xhcmF0aW9ucyByZXR1cm5zIHNwdXJpb3VzIHBvdGVudGlhbCBtYXRjaGVzIGZvciBhbm9ueW1vdXMgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI3NDQiPjMzMjc0NDwvYT4KK0dlbmVyYXRlZCBtb2RlbCBjb2RlIGRvZXNuJ3QgY29tcGlsZSB3aXRoIEoyU0UtMS40IGV4ZWN1dGlvbiBlbnZpcm9ubWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQzMTUiPjMzNDMxNTwvYT4KK1tjb21waWxlcl0gUHJvYmxlbSB0eXBlcyB3aXRoIG1pc3Npbmcgc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZXMgc2hvdWxkIHVzZSBPYmplY3QgZm9yIG1pc3NpbmcgdHlwZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzOTU2Ij4zMzM5NTY8L2E+CitDb21waWxlck9wdGlvbnMjd2FybmluZ09wdGlvbk5hbWVzKCk6IE9QVElPTl9SZXBvcnRSYXdUeXBlUmVmZXJlbmNlIG1pc3NpbmcKKworPGEgbmFtZT0idl9CMzIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN001IC0gSmFudWFyeSAxMSwgMjAxMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMzIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjMyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzY1NCI+MzI3NjU0PC9hPgorRlVQIG9mIGJ1ZyAzMTcyNjQ6IFJlZmFjdG9yaW5nIGlzIG5vdCBwb3NzaWJsZSBpZiB0aGUgY29tbW9ucy1sYW5nLmphciBpcyBpbiB0aGUgcGF0aAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM3MTAiPjMzMzcxMDwvYT4KK1tET01dIHdyb25nIEphdmFFbGVtZW50IGZvciByZWNvdmVyZWQgSVR5cGVCaW5kaW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzY2OSI+MzMzNjY5PC9hPgorW0RPTV0gSW5jb3JyZWN0IHNpZ25hdHVyZSBmb3IgdHlwZSBhcmd1bWVudHMgaW4gdGVzdCBjYXNlIGZyb20gYnVnIDMzMzM2MAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzMzNjAiPjMzMzM2MDwvYT4KK1tET01dIGVjbGlwc2UgZmFpbHMgdG8gY3JlYXRlIGFycmF5IGJpbmRpbmcgaW4gdGhpcyBzaXR1YXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNDIzIj4zMzI0MjM8L2E+CitbMS41XVtjb21waWxlcl0gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIGFnYWluc3Qgc2NhbGEtbGliYXJ5LmphcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIyNjgiPjMzMjI2ODwvYT4KK1thc3Npc3RdIEFsbG93IHByb3Bvc2FscyBmb3Igc3RhdGljIGZpZWxkcyBpbiBpbml0aWFsaXplcnMgb2YgZmllbGRzIGJlaW5nIGRlY2xhcmVkIHRleHR1YWxseSBpbiBhZHZhbmNlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTMzNCI+MzMxMzM0PC9hPgorWzEuNV1bY29tcGlsZXJdICZxdW90O1RoZSBjb2RlIGZvciB0aGUgc3RhdGljIGluaXRpYWxpemVyIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQmcXVvdDsgaW4gZW51bQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM0ODciPjMzMzQ4NzwvYT4KK1tmb3JtYXR0ZXJdIEluY29ycmVjdGx5IG9yZGVyZWQgbWV0aG9kIGFyZ3VtZW50cyBpbiBTY3JpYmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyODQzIj4zMzI4NDM8L2E+CitbZm9ybWF0dGVyXSBmb3JtYXQgc2F2ZSBhY3Rpb24gZmFpbHMgd2l0aCBTSU9PQkUKKworPGEgbmFtZT0idl9CMzEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN001IC0gSmFudWFyeSA0LCAyMDExCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IzMQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMzEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MDM5Ij4zMTcwMzk8L2E+CitbZm9ybWF0dGVyXSBDb2RlIEZvcm1hdHRlciBmYWlscyBvbiBpbm5lciBjbGFzcyBzb3VyY2UgaW5kZW50YXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMzEzIj4zMzAzMTM8L2E+CitbZm9ybWF0dGVyXSAnTmV2ZXIgam9pbiBhbHJlYWR5IHdyYXBwZWQgbGluZXMnIGZvcm1hdHRlciBvcHRpb24gZG9lcyBjb3JyZWN0bHkgaW5kZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTIyNyI+MzI5MjI3PC9hPgorVXNhZ2Ugb2YgYnJva2VuIHF1aWNrc29ydCBhbGdvcml0aG0gaW4gamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIzNTkiPjMzMjM1OTwvYT4KK29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyBzaG91bGQgcmV0dXJuIG51bWJlciBvZiBmaWVsZHMgZGlyZWN0bHkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyODE4Ij4zMzI4MTg8L2E+CitbZm9ybWF0dGVyXSBKYXZhIGZvcm1hdHRlciwgQmxhbmsgTGluZXMgdGFiLCBvbmx5IDFzdCBsaW5lIGluZGVudGVkIHdoZW4gbXVsdGlwbGUgbGluZXMgaXMgc2V0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjg3NyI+MzMyODc3PC9hPgorW2Zvcm1hdHRlcl0gbGluZSBjb21tZW50IHdyb25nbHkgcHV0IG9uIGEgbmV3IGxpbmUKKworPGEgbmFtZT0idl9CMzAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN001IC0gRGVjZW1iZXIgMjEsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjMwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IzMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBKYXZhY29yZSBvcHRpb24gb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUuQ09NUElMRVJfUEJfTUlTU0lOR19TVEFUSUNfT05fTUVUSE9EIGFkZGVkIHRvIHJhaXNlIHdhcm5pbmcgb3IgZXJyb3IgZm9yIGEgbWV0aG9kCisgICAgd2hpY2ggcXVhbGlmaWVzIHRvIGJlIGRlY2xhcmVkIGFzIDxjb2RlPnN0YXRpYzwvY29kZT4sIGJ1dCBub3QgYmVlbiBkZWNsYXJlZCBhcyBvbmUuKHNlZSBkZXRhaWxzIGluIGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNTgxIj4zMTg2ODI8L2E+KToKKzxwcmU+CisJLyoqCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgYSBtZXRob2QgdGhhdCBxdWFsaWZpZXMgYXMgc3RhdGljLCBidXQgbm90IGRlY2xhcmVkIHN0YXRpYy4KKwkgKiBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIG1ldGhvZCBoYXMKKwkgKiBub3QgYmVlbiBkZWNsYXJlZCBhcyA8Y29kZT5zdGF0aWM8L2NvZGU+LCBldmVuIHRob3VnaCBpdCBxdWFsaWZpZXMgYXMgb25lLgorCSAqIAorCSAqIE9wdGlvbiBpZDo8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYyI8L2NvZGU+CisJICogUG9zc2libGUgdmFsdWVzOjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPgorCSAqIERlZmF1bHQ6PGNvZGU+Imlnbm9yZSI8L2NvZGU+CisJICogCisJICogQHNpbmNlIDMuNworCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19TVEFUSUNfT05fTUVUSE9EID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlU3RhdGljIjsKKwk8L3ByZT4KKzwvbGk+Cis8bGk+TmV3IEphdmFjb3JlIG9wdGlvbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5DT01QSUxFUl9QQl9QT1RFTlRJQUxMWV9NSVNTSU5HX1NUQVRJQ19PTl9NRVRIT0QgYWRkZWQgdG8gcmFpc2Ugd2FybmluZyBvciBlcnJvciBmb3IgYSBtZXRob2QKKyAgICB3aGljaCBtYXkgcXVhbGlmeSB0byBiZSBkZWNsYXJlZCBhcyA8Y29kZT5zdGF0aWM8L2NvZGU+IHdoZW4gYW5vdGhlciBtZXRob2QgZG9lc24ndCBvdmVycmlkZSBpdCwKKyAgICBidXQgbm90IGJlZW4gZGVjbGFyZWQgYXMgb25lLihzZWUgZGV0YWlscyBpbiBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjU4MSI+MzE4NjgyPC9hPik6Cis8cHJlPgorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIGEgbWV0aG9kIHRoYXQgbWF5IHF1YWxpZnkgYXMgc3RhdGljLCBidXQgbm90IGRlY2xhcmVkIHN0YXRpYy4KKwkgKiBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIG1ldGhvZCBoYXMKKwkgKiBub3QgYmVlbiBkZWNsYXJlZCBhcyA8Y29kZT5zdGF0aWM8L2NvZGU+LCBldmVuIHRob3VnaCBpdCBtYXkgcXVhbGlmeSBhcyBvbmUsCisJICogd2hlbiBhbm90aGVyIG1ldGhvZCBkb2Vzbid0IG92ZXJyaWRlIGl0LgorCSAqIAorCSAqIE9wdGlvbiBpZDo8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljIjwvY29kZT4KKwkgKiBQb3NzaWJsZSB2YWx1ZXM6PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+CisJICogRGVmYXVsdDo8Y29kZT4iaWdub3JlIjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMy43CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9QT1RFTlRJQUxMWV9NSVNTSU5HX1NUQVRJQ19PTl9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ucmVwb3J0TWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYyI7Cis8L3ByZT4KKzwvbGk+Cis8bGk+TmV3IEphdmFjb3JlIG9wdGlvbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5DT01QSUxFUl9QQl9VTkFWT0lEQUJMRV9HRU5FUklDX1RZUEVfUFJPQkxFTVMgYWRkZWQgdG8gZ2l2ZSB0aGUgdXNlciBjb250cm9sIG92ZXIgd2hldGhlciBmb3JjZWQgYW5kIHVuYXZvaWRhYmxlIGdlbmVyaWMgdHlwZSBwcm9ibGVtcyBzaG91bGQgYmUgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIG9yIG5vdCAoc2VlIGRldGFpbHMgaW4gPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjgxNyI+YnVnIDMyMjgxNzwvYT4pOgorPHByZT4KKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBvZiBVbmF2b2lkYWJsZSBHZW5lcmljIFR5cGUgUHJvYmxlbXMuCisJICogV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciB3YXJuaW5nIGV2ZW4gd2hlbiBpdCBkZXRlY3RzIGEgZ2VuZXJpYyB0eXBlIHByb2JsZW0KKwkgKiB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gYXZvaWRlZCBieSB0aGUgcHJvZ3JhbW1lci4gQXMgYW4gZXhhbXBsZSwgYSB0eXBlIG1heSBiZSBmb3JjZWQgdG8gdXNlIHJhdyB0eXBlcworCSAqIGluIGl0cyBtZXRob2Qgc2lnbmF0dXJlcyBhbmQgcmV0dXJuIHR5cGVzIGJlY2F1c2UgdGhlIG1ldGhvZHMgaXQgb3ZlcnJpZGVzIGZyb20gYSBzdXBlciB0eXBlIGFyZSBkZWNsYXJlZCB0bworCSAqIHVzZSByYXcgdHlwZXMgaW4gdGhlIGZpcnN0IHBsYWNlLgorCSAqCisJICogT3B0aW9uIGlkOjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcyI8L2NvZGU+CisJICogUG9zc2libGUgdmFsdWVzOjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+CisJICogRGVmYXVsdDo8Y29kZT4iZW5hYmxlZCI8L2NvZGU+CisJICoKKwkgKiBAc2luY2UgMy43CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTkFWT0lEQUJMRV9HRU5FUklDX1RZUEVfUFJPQkxFTVMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zIjsKIDwvcHJlPgogPC9saT4KIDwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0OTg0Ij4xNTQ5ODQ8L2E+Ci1KYXJzIGluIGxpYnJhcnkgbm90IHJlY29nbml6ZWQgc29tZXRpbWVzLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjQ3MyI+MTAyNDczPC9hPgotY29kZSBhc3Npc3Q6IHBhcmFtZXRlciBuYW1lcyBub3QgaGFydmVzdGVkIGZyb20gZGVidWcgaW5mbyBpbiBjbGFzcyBmaWxlcworPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzQ3MSI+MzI3NDcxPC9hPgoramF2YS5pby5FT0ZFeGNlcHRpb24gYXQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0ucmVhZEludChVbmtub3duIFNvdXJjZSkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNjE5Ij4zMzI2MTk8L2E+CitTbWFsbCBlcnJvciBpbiBJVHlwZSNjb2RlQ29tcGxldGUgSmF2YWRvYyBleGFtcGxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODY4MiI+MzE4NjgyPC9hPgorRW5oYW5jZW1lbnQgcmVxdWVzdDogV2FybmluZyBpZiBubyBmaWVsZHMgYXJlIHVzZWQgYW5kIHRoZSBtZXRob2QgaXMgc3RpbGwgbm90IHN0YXRpYworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI4MTciPjMyMjgxNzwvYT4KK0NvbXBpbGVyIG9wdGlvbiB0byBpZ25vcmUgdW5hdm9pZGFibGUgdHlwZSBzYWZldHkgcHJvYmxlbXMgZHVlIHRvIHJhdyBBUElzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjQ1MSI+MzMyNDUxPC9hPgorSmF2YWRvYyBjbGVhbnVwIGluIFNlYXJjaEVuZ2luZSNjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10sIGludCkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNjM3Ij4zMzI2Mzc8L2E+CitEZWFkIENvZGUgZGV0ZWN0aW9uIHJlbW92aW5nIGNvZGUgdGhhdCBpc24ndCBkZWFkCiAKLTxhIG5hbWU9InZfNzQyIj48L2E+Cis8YSBuYW1lPSJ2X0IyOSI+PC9hPgogPGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNiAtIE1hcmNoIDE4LCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0MgotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDIiPmN2czwvYT4pLgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN001IC0gRGVjZW1iZXIgMTQsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjI5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IyOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE3MzYiPjMzMTczNjwvYT4KK1tkb21dIHRlc3RzIHNob3VsZCBjaGVjayBmb3IgbWFsZm9ybWVkIG5vZGVzIC0gbWF5IGNhdGNoIGEgcGFyc2VyIGJ1ZworCis8YSBuYW1lPSJ2X0IyOCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTQgLSBEZWNlbWJlciA2LCAyMDEwIC0gMy43LjAgTTQKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjI4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IyOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE4NzIiPjMzMTg3MjwvYT4KK1tjb21waWxlcl0gTlBFIGluIFNjb3BlLmNyZWF0ZUFycmF5VHlwZSB3aGVuIGF0dGVtcHRpbmcgcXVhbGlmaWVkIGFjY2VzcyBmcm9tIHR5cGUgcGFyYW1ldGVyCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTc3MCI+MzMxNzcwPC9hPgorb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuSmF2YVNlYXJjaEJ1Z3NUZXN0cy50ZXN0QnVnMzIzNTE0YSgpIGlzIGZhaWxpbmcgaW4gIE4yMDEwMTIwMi0yMDAwCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTYzMiI+MzMxNjMyPC9hPgorRlVQIG9mIDMyMzUxNDogQWRkIHBlcmZvcm1hbmNlIHRyYWNraW5nIHRlc3QgZm9yIHNjZW5hcmlvCisKKzxhIG5hbWU9InZfQjI3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNCAtIERlY2VtYmVyIDQsIDIwMTAgLSAzLjcuMCBNNAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMjcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjI3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDM2NyI+MzI0MzY3PC9hPgorSUphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgY3BlKSByZXR1cm5zIGVtcHR5IGxpc3QKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3ODk5Ij4zMjc4OTk8L2E+CitpbmNsdWRlIHRoZSBBbnQgY29tcGlsZXIgYWRhcHRlciBpbiBlY2ogSkFSCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTQ0NiI+MzMxNDQ2PC9hPgorWzEuNC8xLjVdIFVuZXhwZWN0ZWQgYW1iaWd1b3VzIGVycm9yIGZvciAxLjQgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM1MTQiPjMyMzUxNDwvYT4KK1tpbmRleGluZ10gVGhlIEphdmEgSW5kZXhlciBpcyB0YWtpbmcgbG9uZ2VyIHRvIHJ1biBpbiBlY2xpcHNlIDMuNiB3aGVuIG9wZW5pbmcgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NjcxIj4zMjk2NzE8L2E+CitSZWdyZXNzaW9uOiBhcmcwLDEsMi4uLiBwYXJhbWV0ZXIgbmFtZXMgYXJlIGNhY2hlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUxNzIiPjMwNTE3MjwvYT4KK1tjb21tb24gbmF2aWdhdG9yXSBQcm9qZWN0IEV4cGxvcmVyIG5vdCBmdWxseSB1cGRhdGluZyB3aXRoIGphciBjbGFzc3BhdGggY29udGFpbmVyIGNoYW5nZXMuCisKKzxhIG5hbWU9InZfQjI2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNCAtIE5vdmVtYmVyIDMwLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IyNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMjYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMjcxIj4zMzEyNzE8L2E+CitbYXNzaXN0XSBSZWNvbnNpZGVyIGFzc3VtcHRpb24gdG8gZmlsdGVyIG5vdCB5ZXQgZGVjbGFyZWQgZmllbGRzIGZyb20gYmVpbmcgcHJvcG9zZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NjYzIj4zMjk2NjM8L2E+CitbdHlwZSBoaWVyYXJjaHldIEludGVyZmFjZXMgZHVwbGljYXRlZCBpbiB0eXBlIGhpZXJhcmNoeSBvbiB0d28gcGFja2FnZXMgZnJvbSBtdWx0aXBsZSBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjgzNjIiPjMyODM2MjwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdCByZWdpb25zIGRvZXMgbm90IGZvcm1hdCBhcyBleHBlY3RlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzExMjAiPjMzMTEyMDwvYT4KK0ltcHJvdmVtZW50cyB0byBTaWduYXR1cmUgQVBJCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5OTM4NCI+Mjk5Mzg0PC9hPgorY29kZVNlbGVjdCBkb2VzIG5vdCBmaW5kIGRlY2xhcmF0aW9uIG9mIGNvbnN0cnVjdG9yIHdpdGggZ2VuZXJpYyBwYXJhbWV0ZXIgdHlwZSB3aGVuIHJlZmVyZW5jZWQgZnJvbSAxLjQgY29kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk4MjIiPjMyOTgyMjwvYT4KK1sxLjddW2NvbXBpbGVyXSBTdGFja292ZXJmbG93ICBlcnJvciBpZiBjb21waWxlZCBpbiAxLjcgY29tcGxpYW5jZSBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDg2OSI+MzMwODY5PC9hPgorQm9ndXMgZXJyb3IgcmVwb3J0ZWQgZm9yIEluY29tcGF0aWJsZSBvcGVyYW5kIHR5cGVzIENsYXNzJmx0O2NhcHR1cmUjMi1vZiA/IGV4dGVuZHMgVCZndDsgYW5kIENsYXNzJmx0O0J1Zy5CYXImZ3Q7Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDg0NSI+MzMwODQ1PC9hPgorW01vZGVsXSBQb3NzaWJsZSBidWcgaW4gTWVtYmVyIGNsYXNzCisKKzxhIG5hbWU9InZfQjI1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNCAtIE5vdmVtYmVyIDIzLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IyNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMjUiPmN2czwvYT4pLgogPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLTxsaT5BcyBzb21lIGNsaWVudHMgbmVlZCB0byBrbm93IGlmIHNvbWUgY2xhc3NwYXRoIGNvbnRhaW5lciBjaGlsZHJlbiBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgb3IKLWNhbiBiZSBtb2RpZmlhYmxlLCB0aGUgZm9sbG93aW5nIEFQSSBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCBpbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gY2xhc3M6Ci08dWw+Ci08bGk+PGNvZGU+I2dldEFjY2Vzc1J1bGVzU3RhdHVzKElQYXRoLCBJSmF2YVByb2plY3QpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+I2dldEF0dHJpYnV0ZVN0YXR1cyhJUGF0aCwgSUphdmFQcm9qZWN0LCBTdHJpbmcpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+I2dldFNvdXJjZUF0dGFjaG1lbnRTdGF0dXMoSVBhdGgsIElKYXZhUHJvamVjdCk8L2NvZGU+PC9saT4KLTwvdWw+Ci1Gb3IgZWFjaCBvZiB0aGVzZSBtZXRob2RzLCB0aGUgcmV0dXJuZWQgc3RhdHVzIGNhbiBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNldmVyaXRpZXM6Ci08dWw+Ci08bGk+PGNvZGU+SVN0YXR1cyNPSzwvY29kZT46IG1lYW5zIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdXBwb3J0ZWQgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gaXMgbW9kaWZpYWJsZTwvbGk+Ci08bGk+PGNvZGU+SVN0YXR1cyNFUlJPUjwvY29kZT46IG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBvciBpcyBub3QgbW9kaWZpYWJsZS48YnI+Ci0JSW4gdGhpcyBjYXNlLCB0aGUgPGNvZGU+SVN0YXR1cyNnZXRDb2RlKCk8L2NvZGU+IHdpbGwgaGF2ZSByZXNwZWN0aXZlbHkgdGhlIDxjb2RlPiNBVFRSSUJVVEVfTk9UX1NVUFBPUlRFRDwvY29kZT4gdmFsdWUKLQlvciB0aGUgPGNvZGU+I0FUVFJJQlVURV9SRUFEX09OTFk8L2NvZGU+IHZhbHVlLjwvbGk+Ci08L3VsPgotTm90ZSB0aGF0IGlmIHRoZSBzdWJjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgdGhlbiB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcwotdG8gcmV0dXJuIDxjb2RlPklTdGF0dXMjT0s8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbgotYmUgdXBkYXRlZCAoc2VlIDxjb2RlPiNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCk8L2NvZGU+KS4KKzxsaT4gQWRkZWQgYSBuZXcgQVBJIGluIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb24gdG8gZmluZCBpZiBhIGdpdmVuIGNoYXJhY3RlciBhcnJheSBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeCwgYXQgdGhlIGdpdmVuIGluZGV4LiAoc2VlIGRldGFpbHMgaW4gYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjkyODgiPjMyOTI4ODwvYT4pOgorPHByZT4KKyAgICAvKioKKyAgICAgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIGluZGV4LCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4gaXNDYXNlU2Vuc2l0aXZlIGlzIHVzZWQgdG8gZmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIGNvbXBhcmlzb24gc2hvdWxkIGJlCisgICAgICogY2FzZSBzZW5zaXRpdmUuCisgICAgICogCisgICAgICogCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogCisgICAgICogMS4gICBwcmVmaXggPSB7ICdhJyAsICdCJyB9CisgICAgICogICAgICBuYW1lID0geyAnYycsICdkJywgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorICAgICAqICAgICAgc3RhcnRJbmRleCA9IDIKKyAgICAgKiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlCisgICAgICogICAgICByZXN1bHQgPT4gdHJ1ZQorICAgICAqCisgICAgICogMi4gICBwcmVmaXggPSB7ICdhJyAsICdCJyB9CisgICAgICogICAgICBuYW1lID0geyAnYycsICdkJywgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorICAgICAqICAgICAgc3RhcnRJbmRleCA9IDIKKyAgICAgKiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWUKKyAgICAgKiAgICAgIHJlc3VsdCA9PiBmYWxzZQorICAgICAqIAorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgZ2l2ZW4gcHJlZml4CisgICAgICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHRvIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSBjb21wYXJpc29uIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQorICAgICAqIEBwYXJhbSBzdGFydEluZGV4IGluZGV4IGZyb20gd2hpY2ggdGhlIHByZWZpeCBzaG91bGQgYmUgc2VhcmNoZWQgaW4gdGhlIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBudWxsIG9yIGlmIHRoZSBnaXZlbiBwcmVmaXggaXMgbnVsbAorICAgICAqIEBzaW5jZSAzLjcKKyAgICAgKi8KKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHByZWZpeEVxdWFscyhjaGFyW10gcHJlZml4LAljaGFyW10gbmFtZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGludCBzdGFydEluZGV4KQorPC9wcmU+CiA8L2xpPgotPGxpPkFQSSBhZGRpdGlvbiB0byBmaXggYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDAwMSI+MTMwMDAxPC9hPi4gSXQgaXMgYmVpbmcgYWJsZSBmb3IgYSB1c2VyCi10byBxdWVyeSB3aGF0IG9wdGlvbnMgd2VyZSBlbmFibGVkIHdoZW4gdGhlIERPTS9BU1QgdHJlZSBoYXMgYmVlbiBjcmVhdGVkLiBUaGUgZm9sbG93aW5nIEFQSSBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZDoKLTx1bD4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUI2hhc1Jlc29sdmVkQmluZGluZ3MoKTwvY29kZT48L2xpPgotPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QjaGFzU3RhdGVtZW50c1JlY292ZXJ5KCk8L2NvZGU+PC9saT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUI2hhc0JpbmRpbmdzUmVjb3ZlcnkoKTwvY29kZT48L2xpPgogPC91bD4KLTwvbGk+Ci08bGk+QVBJIGFkZGl0aW9uIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTY3Ij4xNDk1Njc8L2E+LiBJdCBpcyBhYm91dAotdGhlIGluY29tcGxldGUgYmluZGluZyBoYW5kbGluZy4gVGhlIGZvbGxvd2luZyBBUEkgbWV0aG9kcyBvciBmaWVsZHMgaGF2ZSBiZWVuIGFkZGVkOgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU0ODEiPjMyNTQ4MTwvYT4KK1thc3Npc3RdIGZpZWxkcyBkZWNsYXJlZCBhZnRlciBhIHBhcnRpY3VsYXIgZmllbGQgYXJlIHByb3Bvc2VkIGluIGl0cyBpbml0aWFsaXphdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk3MjciPjMyOTcyNzwvYT4KK0ludmFsaWQgY2hlY2sgaW4gdGhlIGlzQ29uc3RydWN0b3IoKSBtZXRob2Qgb2YgdGhlIElNZXRob2QgaW1wbGVtZW50YXRpb24uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTI4OCI+MzI5Mjg4PC9hPgorRmV0Y2hpbmcgcGFyYW1ldGVyIG5hbWVzIGxpdGVyYWxseSBoYW5ncyBvbiBhIGNsYXNzIHdpdGggYSBsb3Qgb2YgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA0MzUiPjMzMDQzNTwvYT4KK1sxLjRdWzEuNV1bY29tcGlsZXJdIFdyb25nIGhhbmRsaW5nIG9mIHBhcmFtZXRlcml6ZWQgbWV0aG9kcyBpbiAxLjQgbW9kZSB3aXRoIGdlbmVyaWZpZWQgSkRLCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDQ0NSI+MzMwNDQ1PC9hPgorWzEuNF1bMS41XVtjb21waWxlcl0gUHJvcGVydGllcyBkb2Vzbid0IG1hdGNoIE1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsgaW4gMS40IGNvbXBsaWFuY2UgbW9kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzAzNDciPjMzMDM0NzwvYT4KK1sxLjRdWzEuNV1bY29tcGlsZXJdIFRoZSBwZXJmb3JtYW5jZSB0ZXN0IEZ1bGxTb3VyY2VXb3Jrc3BhY2VCdWlsZFRlc3RzI3Rlc3RGdWxsQnVpbGREZWZhdWx0KCkgZmFpbHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MTU2Ij4zMjkxNTY8L2E+CitbY29tcGlsZXJdW0FQVF0gU291cmNlIGdlbmVyYXRlZCBpbiBsYXN0IHJvdW5kIG5vdCBjb21waWxlZAorCis8YSBuYW1lPSJ2X0IyNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTQgLSBOb3ZlbWJlciAxNiwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMjQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjI0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTk5OCI+MzI5OTk4PC9hPgorW2NvbnRlbnQgYXNzaXN0XSBvdmVycmlkZSBtZXRob2QgcHJvcG9zYWwgaW4gYW5vbnltb3VzIGNsYXNzIGluc2VydHMgYmFkIHN0dWIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMDgxIj4zMzAwODE8L2E+CitbY29tcGlsZXJdIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIFN3aXRjaGVkIGZyb20gQy9DKysgUGVyc3BlY3RpdmUgdG8gSmF2YSBQZXJzcGVjdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg1MTkiPjMyODUxOTwvYT4KK1tjb21waWxlcl0gbG9jYWwgdmFyaWFibGUgY2Fubm90IGJlIG9wdGltaXplZCBvdXQgZGVzcGl0ZSB3YXJuaW5nICZxdW90O25vdCB1c2VkJnF1b3Q7Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTcwOSI+MzI5NzA5PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIGZhaWxzIHRvIGZvcm1hdCBlbnVtIHdpdGggZXh0cmEgc2VtaWNvbG9uIGFuZCBib2R5CisKKzxhIG5hbWU9InZfQjIzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNNCAtIE5vdmVtYmVyIDksIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjIzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IyMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1OTMiPjMyOTU5MzwvYT4KK1sxLjQvMS41XSBbY29tcGlsZXJdIGluY29ycmVjdCBlcnJvciBhYm91dCBpbmNvbXBhdGlibGUgb3BlcmFuZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1ODgiPjMyOTU4ODwvYT4KK1sxLjQvMS41XVtjb21waWxlcl0gQ2xhc3MgY2FzdCBpc3N1ZSB3aXRoIGphdmEubGFuZy5DbGFzcyBhbmQgdGhlIDEuNC8xLjUgbWl4ZWQgbW9kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1ODQiPjMyOTU4NDwvYT4KK1sxLjQvMS41XVtjb21waWxlcl0gQ29tcGlsZXIgaXMgY29uZnVzZWQgYWJvdXQgbmFtZSBjbGFzaGVzIGluIDEuNCBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODY3NCI+MzI4Njc0PC9hPgorW2Fzc2lzdF0gbG9jYWwgYmVpbmcgZGVjbGFyZWQgcHJvcG9zZWQgaW5zaWRlIGl0cyBpbml0aWFsaXphdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjkzNDQiPjMyOTM0NDwvYT4KK1tjb21waWxlcl0gQmF0Y2ggY29tcGlsZXIgc2hvdWxkIG5vdCByZW1vdmVkIHNvbWUgZHVwbGljYXRlZCBlbnRyaWVzIG9uIHRoZSBjbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NTY1Ij4xODY1NjU8L2E+CitbMS41XVtjb21waWxlcl0gMS40LzEuNSAuY2xhc3MgZmlsZSBpbnRlcmFjdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg2ODkiPjMyODY4OTwvYT4KK1sxLjRdW2NvbXBpbGVyXSAmcXVvdDtJbmNvbXBhdGlibGUgY29uZGl0aW9uYWwgb3BlcmFuZCB0eXBlcyBDbGFzcyBhbmQgQ2xhc3MmcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4Nzc1Ij4zMjg3NzU8L2E+CitbY29tcGlsZXJdIENvbXBpbGVyIGZhaWxzIHRvIHdhcm4gYWJvdXQgaW52YWxpZCBjYXN0IHdoZW4gdXNpbmcgSjJTRSAxLjQgY29tcGlsZXIgc2V0dGluZ3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4ODI3Ij4zMjg4Mjc8L2E+CitDb21waWxlciBmYWlscyB0byByZWNvZ25pemUgYSBNYXAgd2hlbiB1c2luZyBKMlNFIDEuNCBjb21waWxlciBzZXR0aW5ncworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAiPjMyNDg1MDwvYT4KK0NvbXBpbGUgZXJyb3IgY2xhaW1zIG1ldGhvZCBpcyBtaXNzaW5nIGJ1dCBpcyBpbmhlcml0ZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4OTY5Ij4zMjg5Njk8L2E+CitbRE9NXSBOUEUgcmV0cmlldmluZyBhIGphdmEgZWxlbWVudCBmb3IgYW4gYW5ub3RhdGlvbiBiaW5kaW5nCisKKzxhIG5hbWU9InZfQjIyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMyAtIE9jdG9iZXIgMjgsIDIwMTAgLSAzLjcuMCBNMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMjIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjIyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CitUaGlzIGJ1aWxkIGlucHV0IHNpbXBseSByZXZlcnRzIHRoZSBjaGFuZ2UgbWFkZSBmb3IgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAiPjMyNDg1MDwvYT4uCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8YSBuYW1lPSJ2X0IyMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTMgLSBPY3RvYmVyIDI3LCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IyMQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMjEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4Nzg2Ij4zMjg3ODY8L2E+Citbc2VhcmNoXSBOUEUgaW4gZmllbGQgbWF0Y2ggbG9jYXRvcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg3NDQiPjMyODc0NDwvYT4KK1JlbW92ZWQgd2FybmluZ3MgcmVsYXRlZCB0byBmaXggZm9yIDE4NTY4MgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkwNDIiPjIyOTA0MjwvYT4KK1tidWlsZHBhdGhdIGNvdWxkIGNyZWF0ZSBidWlsZCBwYXRoIGVycm9yIGluIGNhc2Ugb2YgaW52YWxpZCBleHRlcm5hbCBKQVIgZm9ybWF0CisKKzxhIG5hbWU9InZfQjIwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMyAtIE9jdG9iZXIgMjUsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjIwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IyMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyMTUyIj4yODIxNTI8L2E+CitbMS41XVtjb21waWxlcl0gR2VuZXJpY3MgY29kZSByZWplY3RlZCBieSBFY2xpcHNlIGJ1dCBhY2NlcHRlZCBieSBqYXZhYworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjgyNDAiPjMyODI0MDwvYT4KK29yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjogT3ZlcmxhcHBpbmcgdGV4dCBlZGl0cworCis8YSBuYW1lPSJ2X0IxOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTMgLSBPY3RvYmVyIDI0LCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IxOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NjgyIj4xODU2ODI8L2E+CitJbmNyZW1lbnQvZGVjcmVtZW50IG9wZXJhdG9ycyBtYXJrIGxvY2FsIHZhcmlhYmxlcyBhcyByZWFkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODQwMCI+MzI4NDAwPC9hPgorVGV4dEVkaXQgY29tcHV0ZWQgaW5jb3JyZWN0bHkgZm9yIGluc2VydGluZyBhbm5vdGF0aW9uIGJlZm9yZSBwYWNrYWdlIGRlY2xhcmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzUxMSI+MzAzNTExPC9hPgorQWxsb3cgdG8gc3BlY2lmeSBlbmNvZGluZyBmb3Igc291cmNlIGF0dGFjaG1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjM1NCI+MzI2MzU0PC9hPgorWzMuNl1bY29tcGlsZXJdW3JlZ3Jlc3Npb25dIENvbXBpbGVyIGluIDMuNiBhbmQgMy42LjEgZ2VuZXJhdGVzIGJhZCBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODM2MSI+MzI4MzYxPC9hPgorWzEuNF1bY29tcGlsZXJdIHZhcmlhYmxlIGluaXRpYWxpemVkIHdpdGhpbiBhbiBhc3NlcnQgZXhwcmVzc2lvbiBhcmUgbm8gbG9uZ2VyIHJlcG9ydGVkIGFzIHBvdGVudGlhbCBub24gaW5pdGlhbGl6ZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MjQ3Ij4zMjgyNDc8L2E+CitEaXNhc3NlbWJsZSBmYWlscyB0byBkaXNhc3NlbWJsZSBzeW50aGV0aWMgY29uc3RydWN0b3Igd2l0aCB2YXJhcmdzIGFyZ3VtZW50cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjgxMTUiPjMyODExNTwvYT4KK1tET01dIEFsbCBBU1ROb2RlIEFQSXMgc2hvdWxkIHNwZWNpZnkgdHlwZXMgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMKKworPGEgbmFtZT0idl9CMTgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00zIC0gT2N0b2JlciAxOSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMTgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjE4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzQyOSI+MzI3NDI5PC9hPgorVXNlIENoYXJzZXQubmFtZSgpIGluc3RlYWQgb2YgQ2hhcnNldC50b1N0cmluZygpIHRvIGdldCB0aGUgZW5jb2RpbmcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3ODE3Ij4zMjc4MTc8L2E+CitlY2pzcmMuemlwIHNob3VsZCBiZSBlY2pzcmMuamFyCisKKzxhIG5hbWU9InZfQjE3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMyAtIE9jdG9iZXIgMTIsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjE3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IxNyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXIjc2V0QmluZGluZ3NSZWNvdmVyeShib29sZWFuKTwvY29kZT48L2xpPgotPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZyNpc1JlY292ZXJlZCgpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCNyZWNvbmNpbGUoaW50LCBpbnQsIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCNGT1JDRV9QUk9CTEVNX0RFVEVDVElPTjwvY29kZT48L2xpPgotPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQjRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlk8L2NvZGU+PC9saT4KLTxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0I0VOQUJMRV9CSU5ESU5HU19SRUNPVkVSWTwvY29kZT48L2xpPgotPC91bD4KKzxsaT5OZXcgSmF2YWNvcmUgb3B0aW9uIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdTX01FVEhPRF9UWVBFX1BBUkFNRVRFUlMgYWRkZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIG1pc3NpbmcgSmF2YWRvYyB0YWcgd2FybmluZyBvciBlcnJvciBmb3IgYSBtZXRob2QKKyAgICBwYXJhbWF0ZXIgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+QHBhcmFtPC9jb2RlPiB0YWcuIChzZWUgZGV0YWlscyBpbiBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjU4MSI+MzIyNTgxPC9hPik6Cis8cHJlPgorICAgIC8qKgorICAgICAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBUYWdzIGZvciBNZXRob2QgVHlwZSBQYXJhbWV0ZXJzLgorICAgICAqIFNwZWNpZnkgd2hldGhlciBhIG1pc3NpbmcgPGNvZGU+QHBhcmFtPC9jb2RlPiBmb3IgYSB0eXBlIHBhcmFtZXRlciBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQuCisgICAgICogV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhIG1pc3NpbmcgSmF2YWRvYyB0YWcgZXJyb3Igb3Igd2FybmluZyBmb3IgYSB0eXBlIHBhcmFtZXRlciB3aXRob3V0IGEgCisgICAgICogY29ycmVzcG9uZGluZyA8Y29kZT5AcGFyYW08L2NvZGU+IHRhZy4KKyAgICAgKgkKKyAgICAgKiBUaGlzIG9wdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlIGNvbXBpbGVyIGNvbXBsaWFuY2UgaXMgMS41IG9yIGdyZWF0ZXIuCisgICAgICogCisgICAgICogT3B0aW9uIGlkOjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc01ldGhvZFR5cGVQYXJhbWV0ZXJzIjwvY29kZT4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT4KKyAgICAgKiBEZWZhdWx0Ojxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+CisgICAgICogCisgICAgICogQHNpbmNlIDMuNworICAgICAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisgICAgICovCisgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdTX01FVEhPRF9UWVBFX1BBUkFNRVRFUlMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMiOworPC9wcmU+CiA8L2xpPgotPGxpPlRoZSB3b3JraW5nIGNvcHkgb3duZXIgKDxjb2RlPldvcmtpbmdDb3B5T3duZXI8L2NvZGU+KSBub3cgc3BlY2lmaWVzIHRoZSBwcm9ibGVtIHJlcXVlc3RvcgotKDxjb2RlPklQcm9ibGVtcmVxdWVzdG9yPC9jb2RlPikgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMgb24gd29ya2luZyBjb3BpZXMgaXQgb3ducyAKLShzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTI0MyI+MTc1MjQzPC9hPikuPGJyPgotVG8gaW1wbGVtZW50IHRoaXMgbmV3IHJlc3BvbnNpYmlsaXR5LCBhIG5ldyBBUEkgbWV0aG9kIGhhcyBiZWVuIGFkZGVkIG9uIDxjb2RlPldvcmtpbmdDb3B5T3duZXI8L2NvZGU+IGNsYXNzOgorPGxpPkFkZGVkIG5ldyBBUEkgb24gb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZSB0byBzdG9yZSBwcm9wZXJ0aWVzIChTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUxMzEiPjMyNTEzMTwvYT4pLgorPHByZT4KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkgb2YgdGhpcyByZXdyaXRlLCBvciBudWxsIGlmIG5vbmUuCisJICoKKwkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCisJICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsT2JqZWN0KQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGlzIG51bGwKKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKKzwvcHJlPgorPHByZT4KKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lZCBwcm9wZXJ0eSBvZiB0aGlzIHJld3JpdGUgdG8gdGhlIGdpdmVuIHZhbHVlLAorCSAqIG9yIHRvIG51bGwgdG8gY2xlYXIgaXQuCisJICogCisJICogQ2xpZW50cyBzaG91bGQgZW1wbG95IHByb3BlcnR5IG5hbWVzIHRoYXQgYXJlIHN1ZmZpY2llbnRseSB1bmlxdWUKKwkgKiB0byBhdm9pZCBpbmFkdmVydGVudCBjb25mbGljdHMgd2l0aCBvdGhlciBjbGllbnRzIHRoYXQgbWlnaHQgYWxzbyBiZQorCSAqIHNldHRpbmcgcHJvcGVydGllcyBvbiB0aGUgc2FtZSByZXdyaXRlLgorCSAqIAorCSAqIAorCSAqIE5vdGUgdGhhdCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBpcyBub3QgY29uc2lkZXJlZCBhIG1vZGlmaWNhdGlvbiB0byB0aGUKKwkgKiBBU1QgaXRzZWxmLiBUaGlzIGlzIHRvIGFsbG93IGNsaWVudHMgdG8gZGVjb3JhdGUgZXhpc3RpbmcgcmV3cml0ZXMgd2l0aAorCSAqIHRoZWlyIG93biBwcm9wZXJ0aWVzIHdpdGhvdXQgamVvcGFyZGl6aW5nIGNlcnRhaW4gdGhpbmdzIChsaWtlIHRoZQorCSAqIHZhbGlkaXR5IG9mIGJpbmRpbmdzKSwgd2hpY2ggcmVseSBvbiB0aGUgdW5kZXJseWluZyB0cmVlIHJlbWFpbmluZyBzdGF0aWMuCisJICogCisJICoKKwkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCisJICogQHBhcmFtIGRhdGEgdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZSwgb3IgbnVsbCBpZiBub25lCisJICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGlzIG51bGwKKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpOworPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MzY3Ij4zMjQzNjc8L2E+CitJSmF2YVByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKElDbGFzc3BhdGhFbnRyeSBjcGUpIHJldHVybnMgZW1wdHkgbGlzdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTEwMjIiPjMxMTAyMjwvYT4KK05QRSBpbiBJbnRlcm5hbEV4dGVuZGVkQ29tcGxldGlvbkNvbnRleHQuZ2V0VmlzaWJsZUVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MTMxIj4zMjUxMzE8L2E+CitBU1RSZXdyaXRlIHNob3VsZCBvZmZlciBnZXQvc2V0UHJvcGVydHkoKSBsaWtlIEFTVE5vZGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNzg5Ij4zMjI3ODk8L2E+CitwYWNrYWdlLWluZm8uamF2YSBXb24ndCBCdWlsZCBPbiBGaXJzdCBDb21waWxlIFBhc3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNTgxIj4zMjI1ODE8L2E+CitbNS4wXSBBZGQgSmF2YWRvYyBjb21waWxlciBvcHRpb24gdG8gKG5vdCkgcmVwb3J0IG1pc3NpbmcgdGFncyBmb3IgbWV0aG9kIHR5cGUgcGFyYW1ldGVycworCis8YSBuYW1lPSJ2X0IxNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTMgLSBPY3RvYmVyIDUsIDIwMTAgLSAzLjcuMCBNMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMTYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjE2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+TmV3IEphdmFjb3JlIG9wdGlvbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5DT01QSUxFUl9QQl9JTkNMVURFX0FTU0VSVFNfSU5fTlVMTF9BTkFMWVNJUyBhZGRlZCB0byBnaXZlIHRoZSB1c2VyIGZsZXhpYmlsaXR5IHRvIHNlZSBudWxsIHJlbGF0ZWQgd2FybmluZyBhcmlzaW5nIGJlY2F1c2Ugb2YgYXNzZXJ0IHN0YXRlbWVudHMgKHNlZSBkZXRhaWxzIGluIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUzNDIiPmJ1ZyAzMjUzNDI8L2E+KToKKzxwcmU+CisgICAgLyoqCisgICAgICogQ29tcGlsZXIgb3B0aW9uIElEOiBSYWlzZSBudWxsIHJlbGF0ZWQgZXJyb3JzIG9yIHdhcm5pbmdzIGFyaXNpbmcgYmVjYXVzZSBvZiBhc3NlcnQgc3RhdGVtZW50cy4KKyAgICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGZsYWcgYWxsIG51bGwgcmVsYXRlZCBlcnJvcnMgb3Igd2FybmluZ3MgdGhhdCBoYXZlIGJlZW4gZW5hYmxlZCBieSB0aGUgdXNlciwKKyAgICAgKiBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBhIHZhcmlhYmxlIG9jY3VycmVkIGluIGFuIGFzc2VydCBzdGF0ZW1lbnQuCisgICAgICogV2hlbiBkaXNhYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGZsYWcgbnVsbCByZWxhdGVkIGVycm9ycyBvciB3YXJuaW5ncyBvbiB2YXJpYWJsZXMgdGhhdCBnb3QgbWFya2VkIGFzIG1heWJlIG9yIGRlZmluaXRlbHkKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpbiBhbiBhc3NlcnQgc3RhdGVtZW50IHVwc3RyZWFtLgorICAgICAqCisgICAgICogT3B0aW9uIGlkOjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzIjwvY29kZT4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT4KKyAgICAgKiBEZWZhdWx0Ojxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2luY2UgMy43CisgICAgICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKyAgICAgKi8KKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5DTFVERV9BU1NFUlRTX0lOX05VTExfQU5BTFlTSVMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMiOworPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMDEyIj4zMjMwMTI8L2E+CitbanNyMTRdW2NvbXBpbGVyXSBDbGFzcyBsaXRlcmFsIHZhbHVlIGlzIG5vdCBjYWNoZWQgd2hlbiB0YXJnZXQgaXMganNyMTQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MzQyIj4zMjUzNDI8L2E+CitBZGQgbmV3IG9wdGlvbiBmb3IgbnVsbCBhbmFseXNpcyBiYXNlZCBvbiBhc3NlcnQgcmVzdWx0LgorCis8YSBuYW1lPSJ2X0IxNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTMgLSBTZXB0ZW1iZXIgMjgsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjE1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IxNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTI2MDMiPjMxMjYwMzwvYT4KK1tjb250ZW50IGFzc2lzdF0gZmllbGQgYmVpbmcgZGVjbGFyZWQgaXMgcHJvcG9zZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgaW5zaWRlIGluaXRpYWxpemF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTM0MiI+MzI1MzQyPC9hPgorQWRkIG5ldyBvcHRpb24gZm9yIG51bGwgYW5hbHlzaXMgYmFzZWQgb24gYXNzZXJ0IHJlc3VsdC4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NDgxIj4zMjU0ODE8L2E+CitbYXNzaXN0XSBmaWVsZHMgZGVjbGFyZWQgYWZ0ZXIgYSBwYXJ0aWN1bGFyIGZpZWxkIGFyZSBwcm9wb3NlZCBpbiBpdHMgaW5pdGlhbGl6YXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NjMzIj4zMjU2MzM8L2E+CisxLjQgcHJvamVjdCBjb25mdXNlZCB3aGVuIHJlZmVyZW5jaW5nIGEgcmV0dXJuIHR5cGUgb2YgZ2VuZXJpYyBhcnJheSBmcm9tIDEuNSBwcm9qZWN0CisKKzxhIG5hbWU9InZfQjE0YSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTMgLSBTZXB0ZW1iZXIgMjEsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjE0YQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMTRhIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTU2NyI+MzI1NTY3PC9hPgorQSBibG9ja2luZyAmcXVvdDtqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiBpbmZvIGNhbm5vdCBiZSBudWxsJnF1b3Q7IGV4Y2VwdGlvbgorCis8YSBuYW1lPSJ2X0IxM2EiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00yIC0gU2VwdGVtYmVyIDIxLCAyMDEwIC0gMy43LjAgTTIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjEzYQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMTNhIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTc1NSI+MzI1NzU1PC9hPgorW2NvbXBpbGVyXSB3cm9uZyBpbml0aWFsaXphdGlvbiBzdGF0ZSBhZnRlciBjb25kaXRpb25hbCBleHByZXNzaW9uCisKKzxhIG5hbWU9InZfQjEzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMiAtIFNlcHRlbWJlciAxNSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMTMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjEzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTIyOSI+MzI1MjI5PC9hPgorW2NvbXBpbGVyXSBlY2xpcHNlIGNvbXBpbGVyIGRpZmZlcnMgZnJvbSBqYXZhYyB3aGVuIGFzc2VydCBpcyBwcmVzZW50ICAoRlVQIG9mIGJ1ZyAzMTk1MTApCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTI3MCI+MzI1MjcwPC9hPgorW2NvbnRlbnQgYXNzaXN0XSBQYXJhbWV0ZXIgbmFtZXMgYXJlIG5vdCBkaXNwbGF5ZWQgZm9yIHN0YXRpYyBpbm5lciBjbGFzcyBvZiBhbiBleHRlcm5hbCBqYXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MzIxIj4zMjUzMjE8L2E+CitbY29tcGlsZXJdIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcnMgZm9yIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3NlcyBjYW4gZXhjZWVkIDI1NSBwYXJhbWV0ZXJzIC0mZ3Q7IENsYXNzRm9ybWF0RXJyb3IKKworPGEgbmFtZT0idl9CMTJhIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMiAtIFNlcHRlbWJlciAxMywgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMTJhCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IxMmEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODQwIj4zMjQ4NDA8L2E+CitbY29tcGlsZXJdIEltcHJvdmluZyBkZWJ1ZyBzdHJpbmdzIGZvciBCcmVhayBzdGF0ZW1lbnQsIEludExpdGVyYWwgYW5kIENhc2VTdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODQ4Ij4zMjQ4NDg8L2E+CitbMS42XVtjb21waWxlcl0gTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gc3luY2hyb25pemUgb24gbm9uLWV4aXN0aW5nIG91dGVyIGNsYXNzIGluc3RhbmNlCisKKzxhIG5hbWU9InZfQjExIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMiAtIFNlcHRlbWJlciA5LCAyMDEwIC0gMy43LjAgTTIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjExCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IxMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGluZyBtaXNzaW5nIEFQSSBtZXRob2RzIG9uIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlIChzZWUgZGV0YWlscyBpbiA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00ODQyMCI+YnVnIDQ4NDIwPC9hPik6Cis8cHJlPgorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxvY2FsIHZhcmlhYmxlIGlzIGEgbWV0aG9kIHBhcmFtZXRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGxvY2FsIHZhcmlhYmxlIGlzIGEgbWV0aG9kIHBhcmFtZXRlciwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHNpbmNlIDMuNworICAgICAqLworICAgIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIGxvY2FsIHZhcmlhYmxlLiBUaGUgZmxhZ3MgY2FuIGJlIGV4YW1pbmVkIHVzaW5nIGNsYXNzLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCBvbmx5IGZsYWdzIGFzIGluZGljYXRlZCBpbiB0aGUgc291cmNlIGFyZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIGxvY2FsIHZhcmlhYmxlCisgICAgICogQHNlZSBGbGFncworICAgICAqIEBzaW5jZSAzLjcKKyAgICAgKi8KKyAgICBpbnQgZ2V0RmxhZ3MoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlY2xhcmluZyBtZW1iZXIgb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNsYXJpbmcgbWVtYmVyIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUKKyAgICAgKiBAc2luY2UgMy43CisgICAgICovCisgICAgSU1lbWJlciBnZXREZWNsYXJpbmdNZW1iZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSByb290IGluIHdoaWNoIHRoaXMgbG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlIHJvb3QgaW4gd2hpY2ggdGhpcyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZAorICAgICAqIEBzaW5jZSAzLjcKKyAgICAgKi8KKyAgICBJVHlwZVJvb3QgZ2V0VHlwZVJvb3QoKTsKKzwvcHJlPgorPC9saT4KKzxsaT5BZGRpbmcgbWlzc2luZyBBUEkgbWV0aG9kIG9uIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyIChzZWUgZGV0YWlscyBpbiA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00ODQyMCI+YnVnIDQ4NDIwPC9hPik6Cis8cHJlPgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSByb290IGluIHdoaWNoIHRoaXMgdHlwZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlIHJvb3QgaW4gd2hpY2ggdGhpcyB0eXBlIHBhcmFtZXRlciBpcyBkZWNsYXJlZAorICAgICAqIEBzaW5jZSAzLjcKKyAgICAgKi8KKyAgICBJVHlwZVJvb3QgZ2V0VHlwZVJvb3QoKTsKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDc2MiI+MzI0NzYyPC9hPgorQ29tcGlsZXIgdGhpbmtzIHRoZXJlIGlzIGRlYWRjb2RlIGFuZCByZW1vdmVzIGl0IQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI0NzgiPjI5MjQ3ODwvYT4KK1JlcG9ydCBwb3RlbnRpYWxseSBudWxsIGFjcm9zcyB2YXJpYWJsZSBhc3NpZ25tZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDc0OCI+MzI0NzQ4PC9hPgorSkRUIGNvcmUgdGVzdHMgaGF2ZSByZXN0cmljdGl2ZSByYW5nZSBvbiBjb20uaWJtLmljdQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM2MzMiPjMyMzYzMzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBSZWNvbmNpbGVyIGlzc3VlcyBtaXhpbmcgMS40IHByb2plY3RzIHdpdGggJmFtcDsgMS41IHByb2plY3Qgd2l0aCBnZW5lcmljcy4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MDQ2Ij4zMTcwNDY8L2E+CitFeGNlcHRpb24gZHVyaW5nIGRlYnVnZ2luZyB3aGVuIGhvdmVyIG1vdXNlIG92ZXIgYSBmaWVsZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00ODQyMCI+NDg0MjA8L2E+CitbQVBJXSBJTG9jYWxWYXJpYWJsZSBhbmQgSVR5cGVQYXJhbWV0ZXIgc2hvdWxkIHByb3ZpZGUgbW9yZSBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTQxNCI+MzIxNDE0PC9hPgorU3ludGhldGljIGNvbnN0cnVjdG9ycyBjYW4gZXhjZWVkIDI1NSBwYXJhbWV0ZXJzIC0mZ3Q7IENsYXNzRm9ybWF0RXJyb3IKKworPGEgbmFtZT0idl9CMTAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00yIC0gU2VwdGVtYmVyIDcsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjEwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IxMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkNvZGUgZm9ybWF0dGVyOiA0IG5ldyBvcHRpb25zIHdlcmUgYWRkZWQgdG8gYmV0dGVyIGhhbmRsZSB0aGUgYWRkaXRpb24gb2YKK25ldyBsaW5lcyBhZnRlciBhbm5vdGF0aW9ucy4KKzxwcmU+CisgKiBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fRklFTEQKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgZmllbGQgZGVjbGFyYXRpb24KKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkIgorICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKyAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKKyAqIAorICogRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX01FVEhPRAorICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSBtZXRob2QgZGVjbGFyYXRpb24KKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZCIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgSU5TRVJUCisgKgorICogRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX1BBQ0tBR0UKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgcGFja2FnZSBkZWNsYXJhdGlvbgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZSIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgSU5TRVJUCisgKgorICogRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX1RZUEUKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgdHlwZSBkZWNsYXJhdGlvbgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZSIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgSU5TRVJUCis8L3ByZT4KK1RoZSBhZGRpdGlvbiBvZiBuZXcgbGluZXMgYWZ0ZXIgYW5ub3RhdGlvbnMgaGFzIGJlZW4gZGlzY3Vzc2VkIGluIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODAwMCI+YnVnIDMwODAwMDwvYT48YnI+CitBbHNvIG5vdGUgdGhhdCBwcmV2aW91c2x5IGF2YWlsYWJsZSBjb2RlIGZvcm1hdHRlciBjb25zdGFudCBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTUVNQkVSIGhhcyBiZWVuIGRlcHJlY2F0ZWQuPGJyPgorQWxsIG5ldyBvcHRpb25zIG11c3QgYmUgZW5hYmxlZCB0byBhY3RpdmF0ZSBvbGQgc3RyYXRlZ3kuCis8L2xpPgorPGxpPgorVGhlIHByZXZpb3VzbHkgYWRkZWQgbmV3IEFQSXM6Cis8YmxvY2txdW90ZT4KKzxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbiNnZXROYW1lUmFuZ2UoKTwvY29kZT4sPGJyPgorPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbiNnZXROYW1lUmFuZ2UoKTwvY29kZT4KKzwvYmxvY2txdW90ZT4KK2hhdmUgYmVlbiBtb3ZlZCB0byB0aGUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZSBpbnRlcmZhY2UuIFNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTc2NCI+MzIxNzY0PC9hPiBmb3IgZGV0YWlsczoKIDxwcmU+CiAvKioKLSAqIFJldHVybnMgdGhlIHByb2JsZW0gcmVxdWVzdG9yIHVzZWQgYnkgYSB3b3JraW5nIGNvcHkgb2YgdGhpcyB3b3JraW5nIGNvcHkgb3duZXIuCisgKiBSZXR1cm5zIHRoZSBuYW1lIHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuCisgKiAKKyAqIElmIHRoZSBlbGVtZW50IGlzIGFuIElNZW1iZXIsIGl0IHJldHVybnMKKyAqIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBtZW1iZXIncyBzaW1wbGUgbmFtZSwKKyAqIG9yIG51bGwgaWYgdGhpcyBtZW1iZXIgZG9lcyBub3QgaGF2ZSBhIG5hbWUKKyAqIChmb3IgZXhhbXBsZSwgYW4gaW5pdGlhbGl6ZXIpLCBvciBpZiB0aGlzIG1lbWJlciBkb2VzIG5vdCBoYXZlCisgKiBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkuCisgKiAKKyAqIElmIHRoaXMgZWxlbWVudCBpcyBhbiBJSW1wb3J0RGVjbGFyYXRpb24sIHRoZSBzb3VyY2UgcmFuZ2UKKyAqIG9mIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uJ3MgbmFtZSwgb3IgbnVsbCBpZiB0aGlzIGltcG9ydAorICogZGVjbGFyYXRpb24gZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkuCisgKiBUaGUgc291cmNlIHJhbmdlIGZvciB0aGUgbmFtZSBpbmNsdWRlcyB0aGUgdHJhaWxpbmcgJyonIGlmIHRoZSBjYWxsIHRvCisgKiBJSW1wb3J0RGVjbGFyYXRpb24jaXNPbkRlbWFuZCgpIHJldHVybnMgdHJ1ZS4KICAqCi0gKiBCeSBkZWZhdWx0LCBubyBwcm9ibGVtIHJlcXVlc3RvciBpcyBjb25maWd1cmVkLiBDbGllbnRzIGNhbiBvdmVycmlkZSB0aGlzIAotICogbWV0aG9kIHRvIHByb3ZpZGUgYSByZXF1ZXN0b3IuCisgKiBJZiB0aGlzIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VEZWNsYXJhdGlvbiwgdGhlIHNvdXJjZSByYW5nZSBvZgorICogdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uJ3MgbmFtZSwgb3IgbnVsbCBpZiB0aGlzIHBhY2thZ2UgCisgKiBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KKyAqCisgKiBJZiB0aGlzIGVsZW1lbnQgaXMgYW4gSUFubm90YXRpb24sIHRoZSBzb3VyY2UgcmFuZ2Ugb2YKKyAqIHRoaXMgYW5ub3RhdGlvbidzIG5hbWUsIG9yIG51bGwgaWYgdGhpcyBhbm5vdGF0aW9uIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBpbiBhIGJpbmFyeSB0eXBlKS4KICAqIAotICogQHBhcmFtIHdvcmtpbmdDb3B5IFRoZSBwcm9ibGVtIHJlcXVlc3RvciB1c2VkIGZvciB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5LgotICogSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciB1c2VkIGZvciBhbGwgd29ya2luZyAKLSAqIGNvcGllcyBvZiB0aGUgd29ya2luZyBjb3B5IG93bmVyLgotICogQHJldHVybiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgdG8gYmUgdXNlZCBieSB3b3JraW5nIGNvcGllcyBvZiB0aGlzIHdvcmtpbmcgCi0gKiBjb3B5IG93bmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2JsZW0gcmVxdWVzdG9yIGlzIGNvbmZpZ3VyZWQuCisgKiBJZiB0aGlzIGVsZW1lbnQgaXMgYW4gSVR5cGVQYXJhbWV0ZXIsIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyAKKyAqIHR5cGUgcGFyYW1ldGVyJ3MgbmFtZSwgb3IgbnVsbCBpZiB0aGlzIHR5cGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBpbiBhIGJpbmFyeSB0eXBlKS4KICAqIAotICogQHNpbmNlIDMuMworICogSWYgdGhpcyBlbGVtZW50IGlzIGFuIElUeXBlUm9vdCBvciBJSW1wb3J0Q29udGFpbmVyLCBpdAorICogcmV0dXJucyBudWxsLgorICoKKyAqIEByZXR1cm4gdGhlIG5hbWUgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgb3IgbnVsbCBpZgorICogbm90IGF2YWlsYWJsZQorICoKKyAqIEBzaW5jZSAzLjcKICAqLwotcHVibGljIElQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewotCXJldHVybiBudWxsOwotfQorSVNvdXJjZVJhbmdlIGdldE5hbWVSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiA8L3ByZT4KLUFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyBhZGRpdGlvbiwgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+IHBhcmFtZXRlcgotb2YgPGNvZGU+KldvcmtpbmdDb3B5PC9jb2RlPiBtZXRob2RzIGJlY29tZXMgdW5uZWNlc3NhcnkgYW5kIGNvcnJlc3BvbmRpbmcKLW1ldGhvZHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQ6Ci08b2w+Ci08bGk+PGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KLTxsaT48Y29kZT5JQ29tcGlsYXRpb25Vbml0I2dldFdvcmtpbmdDb3B5KFdvcmtpbmdDb3B5T3duZXIsIElQcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgotPGxpPjxjb2RlPklDbGFzc0ZpbGUjYmVjb21lV29ya2luZ0NvcHkoSVByb2JsZW1SZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+V29ya2luZ0NvcHlPd25lciNuZXdXb3JraW5nQ29weShTdHJpbmcsIElDbGFzc3BhdGhFbnRyeVtdLCBJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KLTwvb2w+Ci1BbmQgYXJlIG9idmlvdXNseSByZXBsYWNlZCBieSBmb2xsb3dpbmcgbWV0aG9kczoKLTxvbD4KLTxsaT48Y29kZT5JQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Ci08bGk+PGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNnZXRXb3JraW5nQ29weShXb3JraW5nQ29weU93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgotPGxpPjxjb2RlPklDbGFzc0ZpbGUjYmVjb21lV29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KLTxsaT48Y29kZT5Xb3JraW5nQ29weU93bmVyI25ld1dvcmtpbmdDb3B5KFN0cmluZywgSUNsYXNzcGF0aEVudHJ5W10sIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Ci08L29sPgotPC9saT4KLTxsaT5BZGRlZCBBUEkgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjZ2V0R2VuZXJhdGVkUmVzb3VyY2VzKElSZWdpb24sIGJvb2xlYW4pIHRvIGJlIGFibGUgdG8gZ2V0IHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2VzIGZvciBhbGwKLWVsZW1lbnRzIG9mIGEgSVJlZ2lvbi4gU2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg0Ij42NTg0PC9hPiBmb3IgZGV0YWlscy48L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc2MjMiPjE3NzYyMzwvYT4KLVsxLjZdW2NvbXBpbGVyXSBTdGFja21hcCBmcmFtZXMgZ2VuZXJhdGlvbiBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3QgaW52YWxpZCBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NjIxIj4xNzc2MjE8L2E+Ci1YTUwgbG9nIG1pZ2h0IGJlIGNvcnJ1cHRlZCBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGV4dHJhY3RpbmcgcHJvYmxlbSBjb250ZXh0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NzI1Ij4xNzY3MjU8L2E+Ci1bcmVjb3ZlcnldIG1lbWJlciB2YWx1ZSBhcnJheSBpbml0aWFsaXplciBhcmVuO3QgY29ycmVjdGx5IHJlY292ZXJlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODA3NyI+MTY4MDc3PC9hPgotW2NsYXNzcGF0aF0gTGV0IGNsYXNzcGF0aCBjb250YWluZXJzIGRlZmluZSB3aGF0IGlzIGNvbmZpZ3VyYWJsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzQ3OCI+MTc3NDc4PC9hPgotW2Zvcm1hdHRlcl0gSW5kZW50IG5ldyBsaW5lcyBvcHRpb24gYWRkcyBleHRyYSBlbXB0eSBsaW5lcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDAwMSI+MTMwMDAxPC9hPgotW2FwaV1bQVNUXSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOiBzaG91bGQgaGF2ZSBBUEkgaGFzUmVzb2x2ZWRCaW5kaW5ncywgaGFzU3RhdGVtZW50UmVjb3ZlcnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1NjciPjE0OTU2NzwvYT4KLUFTVCBEQ1I6IEFsbG93IGluY29tcGxldGUgdmFyaWFibGUgYmluZGluZ3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzcwMDkiPjE3NzAwOTwvYT4KLVtqYXZhZG9jXSBNaXNzaW5nIEphdmFkb2MgdGFnIG5vdCByZXBvcnRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzMxOSI+MTc3MzE5PC9hPgotQW5ub3RhdGlvbiBQcm9jZXNzaW5nIChBUFQpIGFmZmVjdHMgZWNsaXBzZSBzcGVlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzE5NCI+MTc3MTk0PC9hPgotWzEuNV1bY29tcGlsZXJdIHByZXNlcnZlQWxsTG9jYWxzIG9wdGlvbiBoYXMgdW5kZXNpcmFibGUgc2lkZS1lZmZlY3Qgd2hlbiBpbnZva2luZyBnZW5lcmljIG1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzM3MiI+MTc3MzcyPC9hPgotWzEuNV1bY29tcGlsZXJdIE1pc3NpbmcgdW5ib3hpbmcgY29udmVyc2lvbiB3aGVuIG5vIHZhbHVlIHJlcXVpcmVkIGZyb20gbWVzc2FnZSBzZW5kCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2ODI1Ij4xNzY4MjU8L2E+Ci1GdWxsU291cmNlV29ya3NwYWNlQ29tcGxldGlvblRlc3RzIGRvZXNuJ3QgcnVuIGNvcnJlY3RseQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzM4NiI+MTc3Mzg2PC9hPgotV29yZGluZyBpbiBKYXZhZG9jIG9mIFR5cGVOYW1lTWF0Y2ggYW5kIC1SZXF1ZXN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzcxMTUiPjE3NzExNTwvYT4KLU51bGxQb2ludGVyRXhjZXB0aW9uIGluIEJpbmRpbmdLZXlSZXNvbHZlci5jb25zdW1lVHlwZVZhcmlhYmxlKC4uLikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUyNDMiPjE3NTI0MzwvYT4KLVttb2RlbF0gTGV0IHdvcmtpbmcgY29weSBvd25lciBjb250cm9sIHRoZSBwcm9ibGVtIHJlcXVlc3RvciB1c2VkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzMzIj4xNjM3MzM8L2E+Ci1JbmNyZW1lbnRhbEltYWdlQnVpbGRlci5kZWxldGVHZW5lcmF0ZWRGaWxlcygpIGlzIGJyb2tlbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzA3OSI+MTc3MDc5PC9hPgotQWRkIGpkdC5hcHQucGx1Z2dhYmxlLmNvcmUgYXMgeC1mcmllbmQgdG8gamR0LmNvcmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg0Ij42NTg0PC9hPgotTmVlZCBhIHdheSB0byBnZXQgY2xhc3MgZmlsZXMgZm9yIGEgamF2YSBmaWxlIChvciBDVSkKLQotPGEgbmFtZT0idl83NDEiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTYgLSBNYXJjaCAxMywgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NDEKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzQxIj5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+VGhlIG5vbi1KYXZhIHJlc291cmNlcyBpbiBqYXIgZmlsZXMgcmV0dXJuZWQgYnkgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3QjZ2V0Tm9uSmF2YVJlc291cmNlcygpPC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQjZ2V0Tm9uSmF2YVJlc291cmNlcygpPC9jb2RlPiBhcmUgbm93IG9mIHR5cGUgPGNvZGU+SUphckVudHJ5UmVzb3VyY2U8L2NvZGU+IChhIHN1YmludGVyZmFjZQotICAgICAgb2YgPGNvZGU+SVN0b3JhZ2U8L2NvZGU+KS4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIHRvIG5hdmlnYXRlIHRoZSB0cmVlIG9mIG5vbi1KYXZhIHJlc291cmNlcyB1c2luZyB0aGUKLSAgICAgIDxjb2RlPmdldENoaWxkcmVuKCk8L2NvZGU+IGFuZCA8Y29kZT5nZXRQYXJlbnQoKTwvY29kZT4gbWV0aG9kcy48L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYyNjkiPjE3NjI2OTwvYT4KLVtpbmRleF0gTnVsbFBvaW50ZXJFeGNlcHRpb24gZmlsdGVyaW5nIGZvciBleGNlcHRpb24gYnJlYWtwb2ludAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjAyNyI+MTc2MDI3PC9hPgotW2phdmFkb2NdIHtAbGlua30gdG8gbWVtYmVyIHR5cGUgaGFuZGxlZCBpbmNvcnJlY3RseQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzA0NCI+MTUzMDQ0PC9hPgotSmFyRW50cnlGaWxlIGRvZXMgbm90IHJldHVybiBmdWxseSBxdWFsaWZpZWQgcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDU5NSI+MTcwNTk1PC9hPgotW2JhdGNoXVtjb21waWxlcl0gQmF0Y2hDb21waWxlclRlc3QjdGVzdDAyNCBpcyBubyBtb3JlIHNpZ25pZmljYW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2OTcxIj4xNzY5NzE8L2E+Ci1bYXNzaXN0XSB0eXBlcyBhcmUgY29tcHV0ZWQgaWYgVFlQRV9SRUYgYXJlIGZpbHRlcnJlZCBhbmQgSkFWQURPQ19UWVBFX1JFRiBhcmVuJ3QgZmlsdGVyZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU5ODciPjE3NTk4NzwvYT4KLVsxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIGVycm9yIHdoZW4gaW1wbGVtZW50aW5nIGEgbWV0aG9kIHdpdGggYSBtaXggb2YgcGFyYW1ldGVyaXplZCBhbmQgcmF3IGdlbmVyaWNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4OTQ0Ij4xNDg5NDQ8L2E+Ci1uZWVkIHRvIHJlbmRlciByZXNvdXJjZSBmb2xkZXJzIGluIEpBUnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYxOTAiPjE3NjE5MDwvYT4KLVthc3Npc3RdIEluZmVycmVkIHZhcmlhYmxlIG5hbWVzIGFyZSBub3QgZ29vZCB3aGVuIHRoZSBkZWNsYXJlZCB0eXBlIGlzIGEgYmFzZSB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MDU3Ij4xNzYwNTc8L2E+Ci1JQUUgaW4gQVNUQ29udmVydGVyIGZvciBpbnZhbGlkIHNvdXJjZSByYW5nZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDQzNiI+MTc0NDM2PC9hPgotQVBJIHJlcXVlc3Q6IE1ldGhvZEludm9jYXRpb24vU3VwZXJNZXRob2RJbnZvY2F0aW9uI2lzUmVzb2x2ZWRUeXBlSW5mZXJyZWRGcm9tRXhwZWN0ZWRUeXBlKCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzNjQiPjE3NjM2NDwvYT4KLVthc3Npc3RdIG1pc3NpbmcgcmV0dXJuIGFuZCBjb250aW51ZSBwcm9wb3NhbHMgd2l0aGluIHN3aXRjaCBzdGF0ZW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzA0Ij4xNjE3MDQ8L2E+Ci1bbW9kZWxdIEltcHJvdmUgcHJvZ3Jlc3MgZm9yIEphdmEgaW5pdGlhbGl6YXRpb24gdGFzayBqb2IKLQotPGEgbmFtZT0idl83NDAiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTYgLSBNYXJjaCA2LCAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0MAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDAiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5SZWZpbmVkIHRoZSBwcm9ibGVtIElEcyBhbmQgbWVzc2FnZXMgYXNzb2NpYXRlZCB0byBudWxsLXJlbGF0ZWQgaXNzdWVzCi0gICAgZGV0ZWN0aW9uLCBmb3Igd2hpY2ggdHlwaWNhbCBleGFtcGxlcyB3b3VsZCBub3cgYmU6Ci0gICAgPHVsPgotICAgICAgPGxpPjxjb2RlPk51bGxMb2NhbFZhcmlhYmxlUmVmZXJlbmNlPC9jb2RlPiAtIE51bGwgcG9pbnRlciBhY2Nlc3M6IFRoZSB2YXJpYWJsZSBvIGNhbiBvbmx5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+UG90ZW50aWFsTnVsbExvY2FsVmFyaWFibGVSZWZlcmVuY2U8L2NvZGU+IC0gUG90ZW50aWFsIG51bGwgcG9pbnRlciBhY2Nlc3M6IFRoZSB2YXJpYWJsZSBvIG1heSBiZSBudWxsIGF0IHRoaXMgbG9jYXRpb248L2xpPgotICAgICAgPGxpPjxjb2RlPlJlZHVuZGFudE51bGxDaGVja09uTnVsbExvY2FsVmFyaWFibGU8L2NvZGU+IC0gUmVkdW5kYW50IG51bGwgY2hlY2s6IFRoZSB2YXJpYWJsZSBvIGNhbiBvbmx5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+TnVsbExvY2FsVmFyaWFibGVDb21wYXJpc29uWWllbGRzRmFsc2U8L2NvZGU+IC0gTnVsbCBjb21wYXJpc29uIGFsd2F5cyB5aWVsZHMgZmFsc2U6IFRoZSB2YXJpYWJsZSB4IGNhbiBvbmx5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+UmVkdW5kYW50TG9jYWxWYXJpYWJsZU51bGxBc3NpZ25tZW50PC9jb2RlPiAtIFJlZHVuZGFudCBhc3NpZ25tZW50OiBUaGUgdmFyaWFibGUgeCBjYW4gb25seSBiZSBudWxsIGF0IHRoaXMgbG9jYXRpb248L2xpPgotICAgICAgPGxpPjxjb2RlPk51bGxMb2NhbFZhcmlhYmxlSW5zdGFuY2VvZllpZWxkc0ZhbHNlPC9jb2RlPiAtIGluc3RhbmNlb2YgYWx3YXlzIHlpZWxkcyBmYWxzZTogVGhlIHZhcmlhYmxlIG8gY2FuIG9ubHkgYmUgbnVsbCBhdCB0aGlzIGxvY2F0aW9uPC9saT4KLSAgICAgIDxsaT48Y29kZT5SZWR1bmRhbnROdWxsQ2hlY2tPbk5vbk51bGxMb2NhbFZhcmlhYmxlPC9jb2RlPiAtIFJlZHVuZGFudCBudWxsIGNoZWNrOiBUaGUgdmFyaWFibGUgbzIgY2Fubm90IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+Tm9uTnVsbExvY2FsVmFyaWFibGVDb21wYXJpc29uWWllbGRzRmFsc2U8L2NvZGU+IC0gTnVsbCBjb21wYXJpc29uIGFsd2F5cyB5aWVsZHMgZmFsc2U6IFRoZSB2YXJpYWJsZSBpIGNhbm5vdCBiZSBudWxsIGF0IHRoaXMgbG9jYXRpb248L2xpPgotICAgIDwvdWw+Ci0gICAgTm90ZSB0aGF0IHByb2JsZW0gSURzIDxjb2RlPkxvY2FsVmFyaWFibGVDYW5ub3RCZU51bGw8L2NvZGU+LAotICAgIDxjb2RlPkxvY2FsVmFyaWFibGVDYW5Pbmx5QmVOdWxsPC9jb2RlPiwgYW5kCi0gICAgPGNvZGU+TG9jYWxWYXJpYWJsZU1heUJlTnVsbDwvY29kZT4gaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuPGJyPgotICAgIFNlZSBidWdzIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTU3MCI+MTc1NTcwPC9hPgotICAgIGFuZCA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU1NzEiPjE3NTU3MTwvYT4KLSAgICBmb3IgZGV0YWlscy4KLTwvbGk+Ci08bGk+VGhlIEFQSSBtZXRob2QgPGNvZGU+SUNsYXNzRmlsZSNnZXRUeXBlKCk8L2NvZGU+IGRvZXMgbm90IGxvbmdlciB0aHJvdyA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+Ci0oc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ2NjciPjE1NDY2NzwvYT4pLjwvbGk+Ci08bGk+Q29kZSBBc3Npc3Q6IHVucmVzb2x2ZWQgc2ltcGxlIG5hbWVzIGFyZSBwcm9wb3NlZCB3aGVuIGNvbXBsZXRpbmcgYSBzaW1wbGUgbmFtZSByZWZlcmVuY2U8YnI+Ci08cHJlPgotcGFja2FnZSB0ZXN0OwotcHVibGljIGNsYXNzIEUxIHsKLSAgICAgICAgdm9pZCBtKCkgewotICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gMTA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHYpOyAvLyBkbyBjb21wbGV0aW9uIGFmdGVyICd2JwotICAgICAgICB9Ci19Ci08L3ByZT4KLVdoZW4gPGk+djwvaT4gaXMgY29tcGxldGVkLCA8aT52YXJpYWJsZTwvaT4gaXMgcHJvcG9zZWQgYXMgYSBwb3NzaWJsZSBsb2NhbCB2YXJpYWJsZSB3aGljaCBhcmUgbm90IHlldCBkZWNsYXJlZC48YnI+Ci1VbnJlc29sdmVkIHNpbXBsZSBuYW1lcyBhcmUgc2VhcmNoZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgY29tcGxldGlvbiBsb2NhdGlvbi4KIDwvbGk+CiA8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDU4OCI+MTc0NTg4PC9hPgotW2NvbXBpbGVyXSBDb2RlIGluIGFic3RyYWN0IGNsYXNzIGNhbGxzIHdyb25nIG92ZXJsb2FkZWQgbWV0aG9kLiBDb3JyZWN0IG1ldGhvZCBpcyBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2UuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzIxIj4xNzYzMjE8L2E+Ci1UZXN0IGZhaWx1cmVzIGluIE1ldGhvZFBhcmFtZXRlckd1ZXNzaW5nQ29tcGxldGlvblRlc3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzNjEiPjE3NjM2MTwvYT4KLVtzZWFyY2hdIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3JXcmFwcGVyIGNyZWF0ZXMgaW52YWxpZCBoYW5kbGUgZm9yIG1lbWJlciB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzU4Ij4xNzYzNTg8L2E+Ci1bc2VhcmNoXSBGYWlsdXJlIGluIEphdmFTZWFyY2hCdWdzVGVzdCB3aGlsZSBydW5uaW5nIHJhbmRvbSB0ZXN0cyBvcmRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzQ2MSI+MTQ3NDYxPC9hPgotW2NvbXBpbGVyXVtiYXRjaF1bb3B0aW9uc10gdGlnaHRlbiB0aGUgdXNlIG9mIDogYW5kIDsgd2l0aGluIGFjY2VzcyByZXN0cmljdGlvbiBzcGVjaWZpY2F0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjg2NSI+MTYyODY1PC9hPgotQ29udGVudCBhc3Npc3QgZm9yIHVuZGVjbGFyZWQgbG9jYWxzIHdoZW4gdXNpbmcgbG9jYWwKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ2NjciPjE1NDY2NzwvYT4KLUlDbGFzc0ZpbGUjZ2V0VHlwZSgpIHNob3VsZCBub3QgdGhyb3cgSmF2YU1vZGVsRXhjZXB0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NTcxIj4xNzU1NzE8L2E+Ci1bY29tcGlsZXJdW251bGxdIEJldHRlciBjb21waWxlciBtZXNzYWdlIGZvciAnUmVkdW5kYW50IG51bGwgY2hlY2snCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NTcwIj4xNzU1NzA8L2E+Ci1bY29tcGlsZXJdW251bGxdIEltcHJvdmUgY29tcGlsZXIgbWVzc2FnZSBmb3IgJ051bGwgcmVmZXJlbmNlJwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTg0OSI+MTc1ODQ5PC9hPgotUHJvamVjdCBpcyB0b3VjaGVkIG9uIHJlc3RhcnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU4MzIiPjE3NTgzMjwvYT4KLVtyZWNvdmVyeV0gJG1pc3NpbmckIHNob3VsZCBub3QgYmUgc2hvd24gaW5zaWRlIGEgbWVzc2FnZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTgzNCI+MTc1ODM0PC9hPgotW2Fzc2lzdF0gYWxyZWFkeSBkZWZpbmVkIG5hbWUgaXMgcHJvcG9zZWQgYXMgdmFyaWFibGUgbmFtZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTUzMSI+MTc1NTMxPC9hPgotTGl2ZWxvY2sgaW4gT3ZlcmZsb3dpbmdMUlVDYWNoZS5wcml2YXRlUmVtb3ZlRW50cnkKKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI5NzkiPjMyMjk3OTwvYT4KK1tzZWFyY2hdIHVzZSBvZiBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMgeWllbGRzIHN1cnByaXNpbmcgcmVzdWx0cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTY5MzciPjMxNjkzNzwvYT4KK0phdmFFbGVtZW50LmdldEVsZW1lbnRJbmZvKC4uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGdldCBpbmZvIGZvciBhbiBpbm5lciBjbGFzcyBpbiBhbiBleHRlcm5hbCBqYXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNTMxIj4zMjI1MzE8L2E+CitbMS41XVtHZW5lcmljc10gZWNsaXBzZSBjb21waWxlcyBjb2RlIHJlamVjdGVkIGJ5IGphdmFjIHdpdGggaW5jb21wYXJhYmxlIHR5cGVzIGVycm9yLgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDgwMDAiPjMwODAwMDwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdHRlciBpcyBtaXNzaW5nIG9wdGlvbnMgcmVnYXJkaW5nIEFubm90YXRpb24gTmV3bGluZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxMjc2Ij4zMjEyNzY8L2E+CitKRFQgY29yZSBhcGlzIGRvbnQgcmVjb2duaXplIElubmVyQ2xhc3MgY29uc3RydWN0b3IgaW5zaWRlIC5jbGFzcyBmaWxlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1NTYiPjI1MjU1NjwvYT4KK1tmb3JtYXR0ZXJdIFNwYWNlcyByZW1vdmVkIGJlZm9yZSBmb3JtYXR0ZWQgcmVnaW9uIG9mIGEgY29tcGlsYXRpb24gdW5pdC4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNzg1Ij4zMjM3ODU8L2E+CitbYnVpbGRlcl0gTlBFIHdoZW4gYWRkaW5nICdwYWNrYWdlLWluZm8uamF2YScgdG8gZGVmYXVsdCBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTM1OCI+MzIxMzU4PC9hPgorTlBFIHJlZnJlc2hpbmcgZXh0ZXJuYWwgZm9sZGVycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI1OTYiPjMyMjU5NjwvYT4KK1tET01dIEFTVE5vZGUgQVBJcyBzaG91bGQgc3BlY2lmeSB0eXBlcyBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQxMDkiPjMyNDEwOTwvYT4KK1tzZWFyY2hdIEphdmEgc2VhcmNoIHNob3dzIGluY29ycmVjdCByZXN1bHRzIGFzIGFjY3VyYXRlIG1hdGNoZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MTU0Ij4zMjQxNTQ8L2E+CitOUEUgaW4gRmxvd0NvbnRleHQgd2hpbGUgYnVpbGRpbmcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMTI1Ij4xMzMxMjU8L2E+CitbY29tcGlsZXJdW251bGxdIG5lZWQgdG8gcmVwb3J0IHRoZSBudWxsIHN0YXR1cyBvZiBleHByZXNzaW9ucyBhbmQgYW5hbHl6ZSB0aGVtIHNpbXVsdGFuZW91c2x5Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTY5NSI+MzIxNjk1PC9hPgorVGVzdCBhZGRlZCBmb3IgYnVnIDMxOTQyNSBkb2Vzbid0IGRldGVjdCB0aGUgYnVnCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODkwNSI+MjU4OTA1PC9hPgorbWFraW5nIGphdmEubGFuZy5Bc3NlcnRpb25FcnJvciBhY2Nlc3NpYmxlIHRocnUgcmVzb2x2ZVdlbGxLbm93blR5cGUgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTc2NCI+MzIxNzY0PC9hPgorQWRkIGdldE5hbWVSYW5nZSgpIHRvIElTb3VyY2VSZWZlcmVuY2UKIAotPGEgbmFtZT0idl83MzkiPjwvYT4KKzxhIG5hbWU9InZfQjA5Ij48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM002IC0gMjd0aCBGZWJydWFyeSAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczOQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzkiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5SZWZpbmVkIHRoZSBvcHRpb25zIHRoYXQgY29udHJvbCBudWxsLXJlbGF0ZWQgaXNzdWVzIGRldGVjdGlvbi4gVGhlIGV4aXN0aW5nCi08Y29kZT5udWxsUmVmZXJlbmNlPC9jb2RlPiBvcHRpb24gaGFzIGJlZW4gcmVwdXJwb3NlZCBhbmQgc3BsaXQgaW50byB0aHJlZQotb3B0aW9uczoKLTxwcmU+Ci1DT01QSUxFUiAvIFJlcG9ydGluZyBOdWxsIERlcmVmZXJlbmNlCi0gICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhCi0gICB2YXJpYWJsZSB0aGF0IGlzIHN0YXRpY2FsbHkga25vd24gdG8gaG9sZCBhIG51bGwgdmFsdWUgaXMgdXNlZCB0bwotICAgYWNjZXNzIGEgZmllbGQgb3IgbWV0aG9kLgotICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2UiCi0gICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLSAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotQ09NUElMRVIgLyBSZXBvcnRpbmcgUG90ZW50aWFsIE51bGwgRGVyZWZlcmVuY2UKLSAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEKLSAgIHZhcmlhYmxlIHRoYXQgaGFzIGZvcm1lcmx5IGJlZW4gdGVzdGVkIGFnYWluc3QgbnVsbCBidXQgaXMgbm90IChubyBtb3JlKQotICAgc3RhdGljYWxseSBrbm93biB0byBob2xkIGEgbm9uLW51bGwgdmFsdWUgaXMgdXNlZCB0byBhY2Nlc3MgYSBmaWVsZCBvcgotICAgbWV0aG9kLgotICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2UiCi0gICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLSAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotQ09NUElMRVIgLyBSZXBvcnRpbmcgUmVkdW5kYW50IE51bGwgQ2hlY2sKLSAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEKLSAgIHZhcmlhYmxlIHRoYXQgaXMgc3RhdGljYWxseSBrbm93biB0byBob2xkIGEgbnVsbCBvciBhIG5vbi1udWxsIHZhbHVlCi0gICBpcyB0ZXN0ZWQgYWdhaW5zdCBudWxsLgotICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjayIKLSAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi08L3ByZT4KLVNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwNzA0Ij4xNzA3MDQ8L2E+Ci1mb3IgZGV0YWlscy4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDcwNCI+MTcwNzA0PC9hPgotW2NvbXBpbGVyXVtudWxsXVtlbmhdIHNlcGFyYXRlICJudWxsIGRlcmVmZXJlbmNlIiBhbmQgIm51bGwgcmVmZXJlbmNlIiBjb21waWxlciBvcHRpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyNjY2Ij4xNzI2NjY8L2E+Ci1JbXBvcnRpbmcgcGRlLnVpIGFuZCBkZXBlbmRlbmNpZXMgYXMgYmluYXJ5IGdpdmVzIGNvbXBpbGUgZXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQ5NzEiPjE3NDk3MTwvYT4KLVtpbmRleF0gTWFueSBleGNlcHRpb25zIGZyb20gYmFja2dyb3VuZCBpbmRleGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyOTEzIj4xNzI5MTM8L2E+Ci1bY29tcGlsZXJdWzEuNV0gYW4gZXh0cmEgY2hlY2tjYXN0IGJ5dGVjb2RlIGluc3RydWN0aW9uIGdlbmVyYXRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDg3OSI+MTc0ODc5PC9hPgotWzEuNV1bY29tcGlsZXJdIE9wdGltaXNhdGlvbiBmb3IgZW1wdHkgaWYgYmxvY2tzIHJlc3VsdHMgaW4gbm90IGV2YWx1YXRpbmcgdGhlIHRlc3QgZXhwcmVzc2lvbgotCi08YSBuYW1lPSJ2XzczOCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNiAtIDIxc3QgRmVicnVhcnkgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzgKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzM4Ij5jdnM8L2E+KS4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMiAtIEF1Z3VzdCAzMSwgMjAxMCAtIDMuNy4wIE0yCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IwOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMDkiPmN2czwvYT4pLgogPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE4MDIiPjE3MTgwMjwvYT4KLVtqYXZhZG9jXVtzZWxlY3RdIEYzIGRvZXMgbm90IHdvcmsgb24gbWV0aG9kIHdoaWNoIGhhdmUgZGVwcmVjYXRlZCB0eXBlIGFzIGFyZ3VtZW50Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExNTc4Ij4zMTE1Nzg8L2E+CitbZm9ybWF0dGVyXSBFbmFibGUvZGlzYWJsZSB0YWcgZGV0ZWN0aW9uIHNob3VsZCBpbmNsdWRlIGNvbW1lbnQgc3RhcnQvZW5kIHRva2VucworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA2MTgiPjMyMDYxODwvYT4KK2luY29uc2lzdGVudCBpbml0aWFsaXphdGlvbiBvZiBjbGFzc3BhdGggY29udGFpbmVyIGJhY2tlZCBieSBleHRlcm5hbCBjbGFzcyBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNjkzIj4zMjM2OTM8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgZmFpbHMgdG8gZGlhZ25vc2UgbmFtZSBjbGFzaAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM1NTgiPjMyMzU1ODwvYT4KK1Rlc3RzIHRlc3QwMzA3YSBhbmQgdGVzdDAzMDdlIHVuZGVyIEJhdGNoQ29tcGlsZXJUZXN0IGZhaWxpbmcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4NDAyIj4zMDg0MDI8L2E+CitbaW5kZXhdIFBhdHRlcm5TZWFyY2hKb2IgaWdub3JlcyBwYXJ0aWNpcGFudCBpbmRleCBlbnRyaWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzI2NCI+MzE3MjY0PC9hPgorW3NlYXJjaF0gUmVmYWN0b3JpbmcgaXMgaW1wb3NzaWJsZSB3aXRoIGNvbW1vbnMubGFuZyBhZGRlZCB0byBwcm9qZWN0CiAKLTxhIG5hbWU9InZfNzM3Ij48L2E+Cis8YSBuYW1lPSJ2X0IwOCI+PC9hPgogPGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNiAtIDIwdGggRmVicnVhcnkgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzcKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzM3Ij5jdnM8L2E+KS4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMSAtIEF1Z3VzdCAyNCwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMDgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjA4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTkyNiI+MzIxOTI2PC9hPgorRXJyb25lb3VzbHkgZGVlbXMgbnVsbCBjaGVjayBjb25kaXRpb25hbCBicmFuY2ggdG8gYmUgZGVhZCBjb2RlLCBhbmQgcHJvZHVjZXMgaW5jb3JyZWN0IGJ5dGVjb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDE3MCI+MzIwMTcwPC9hPgorW2NvbXBpbGVyXSBbbnVsbF0gV2hpdGVib3ggaXNzdWVzIGluIG51bGwgYW5hbHlzaXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjU5Ij4zMDUyNTk8L2E+CitTdHJhbmdlIGVycm9yIHdoZW4gcmVmZXJlbmNpbmcgY29kZSBwcm9kdWNlZCB3aXRoIGpzcjE0IHRhcmdldAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjExMTUiPjMyMTExNTwvYT4KK0NvbXBpbGVyIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSB3aXRoIHBhY2thZ2UgbmFtZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwNDI3Ij4zMTA0Mjc8L2E+CitbY29udGVudCBhc3Npc3RdIEZVUCBvZiAyMzYzMDY6IFZhcmlhYmxlIHByb3Bvc2VkIGJlZm9yZSBkZWZpbml0aW9uLgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA5MTEiPjMyMDkxMTwvYT4KK05vdCBhbGwgcmVkdW5kYW50IHN1cGVyaW50ZXJmYWNlIHByb2JsZW1zIHJlcG9ydGVkCisKKzxhIG5hbWU9InZfQjA3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMSAtIEF1Z3VzdCAxNywgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMDcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjA3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTIwMSI+MzE5MjAxPC9hPgorW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyMTU0Ij4zMjIxNTQ8L2E+CitDb21waWxlciBidWcgdGhhdCBkb2VzIG5vdCBvY2N1ciBpbiBHYWxpbGVvIDMuNS4yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDc1NCI+MzIwNzU0PC9hPgorW2Zvcm1hdHRlcl0gZm9ybWF0dGVyOm9mZi9vbiB0YWdzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjAwMSI+MzIyMDAxPC9hPgorWzEuNV1bY29tcGlsZXJdIE5hbWUgQ2xhc2ggZXJyb3Igb2NjdXJzCisKKzxhIG5hbWU9InZfQjA2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMSAtIEF1Z3VzdCAxMCwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMDYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjA2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDE2NyI+MzIwMTY3PC9hPgorQXV0by1BY3RpdmF0aW9uIHdvcmtzIG9ubHkgb25jZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA4MDkiPjMyMDgwOTwvYT4KK0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBJbmRleE1hbmFnZXIud3JpdGVTYXZlZEluZGV4TmFtZXNGaWxlIC0gY29uY3VycmVuY3kgaXNzdWU/Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTA4NSI+MzIxMDg1PC9hPgorRW5oYW5jZWQgZm9yIGxvb3BzIG5lZWQgdG8gaW1wbGVtZW50IHR5cGUgc2FmZXR5IGNoZWNrcyBvbiBhcnJheSBpbml0aWFsaXplcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5NjI2Ij4zMTk2MjY8L2E+CitQcmVmZXJlbmNlcy0mZ3Q7SmF2YSBDb21waWxlci0mZ3Q7IEVycm9ycy9XYXJuaW5ncyAtJmd0OyBVbmRvY3VtZW50ZWQgRW1wdHkgQmxvY2sKKworPGEgbmFtZT0idl9CMDUiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00xIC0gSnVseSAzMCwgMjAxMCAtIDMuNy4wIE0xCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IwNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMDUiPmN2czwvYT4pLgogPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLTxsaT5BUEkgYWRkZWQgb24gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTwvY29kZT46Cis8bGk+CitOZXcgQVBJIGFkZGVkIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgdGhlIG5hbWUgcmFuZ2UgZm9yIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjwvY29kZT46CiA8cHJlPgogLyoqCi0gKiBSZXR1cm5zIHRoZSBieXRlcyBjb250YWluZWQgaW4gdGhpcyBjbGFzcyBmaWxlLgotICoKLSAqIEByZXR1cm4gdGhlIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzIGZpbGUKKyAqIFJldHVybnMgdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbidzIG5hbWUsCisgKiBvciBudWxsIGlmIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KKyAqIAorICogVGhlIHNvdXJjZSByYW5nZSBmb3IgdGhlIG5hbWUgaW5jbHVkZXMgdGhlIHRyYWlsaW5nICcqJyBpZiB0aGUgY2FsbCB0bworICogaXNPbkRlbWFuZCgpIHJldHVybnMgdHJ1ZS4KKyAqIAogICoKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgotICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQotICogQHNpbmNlIDMuMworICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKyAqIEByZXR1cm4gdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbidzIG5hbWUsCisgKiBvciBudWxsIGlmIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKQorICogQHNpbmNlIDMuNwogICovCi1ieXRlW10gZ2V0Qnl0ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotPC9wcmU+Ci1TZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDI0NCI+MTUwMjQ0PC9hPiBmb3IgZGV0YWlscy4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTY1MyI+MTcxNjUzPC9hPgotW2luZGV4XSBKYXZhIFRvb2xpbmcgaW5pdGlhbGl6YXRpb24gcGVyZm9ybWFuY2UgaXNzdWUgYWZ0ZXIgc3RhcnR1cAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDM0OCI+MTc0MzQ4PC9hPgotW2NsYXNzcGF0aF0gQ2xhc3NwYXRoIHZhbGlkYXRpb24gbWVzc2FnZXMgYXJlIG5vbi1zdGFuZGFyZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM0NSI+MTcyMzQ1PC9hPgotW21vZGVsXVtkZWx0YV0gcGF0aCBlcnJvciBtYXJrZXJzIGFyZSBub3QgcmVnZW5lcmF0ZWQgb24gcHJvamVjdCByZWJ1aWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTcxOTkiPjk3MTk5PC9hPgotW2Zvcm1hdHRpbmddIENvZGUgZm9ybWF0dGluZyBhY3RpdmF0aW9uIGluIGNvbW1lbnRzICh1c2luZyAmbHQ7UFJFJmd0OykgaXMgY2FzZSBzZW5zaXRpdmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAyNDQiPjE1MDI0NDwvYT4KLVtBUEldIEFkZCBnZXRCeXRlcygpIG9uIElDbGFzc0ZpbGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQ0MzQiPjE3NDQzNDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBQYXJhbWV0ZXJpemVkIGNvbnN0cnVjdG9yIGxlYWRzIHRvIEludGVybmFsIEVycnJvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mjg1MCI+MTUyODUwPC9hPgotW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIG1hcmtzIHVuY2hhbmdlZCBmaWxlIGRpcnR5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0MzcxIj4xMDQzNzE8L2E+Ci1bSkRPTV0gSkRPTSBzaG91bGQgbm90IGNyYXNoIG9uIDEuNSBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4OTEwIj4xNjg5MTA8L2E+Ci1TaG91bGQgZGVmYXVsdCBjb21wbGlhbmNlIGJlIDYuMCBpbiBKU1IxOTkgYmF0Y2ggY29tcGlsYXRpb24/Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MzE3Ij4xNjczMTc8L2E+Ci1lY2pzcmMuemlwIHNob3VsZCBjb250YWluIGEgYnVpbGQgc3lzdGVtCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczOTkyIj4xNzM5OTI8L2E+Ci1EdXBsaWNhdGUgbG9jYWwgdmFyaWFibGUgIGZvciBleGNlcHRpb24gaW4gZGlmZmVyZW50IGNhdGNoIGJsb2NrcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDI5OCI+MTc0Mjk4PC9hPgotV3JvbmcgTkFNRV9QUk9QRVJUWSBjaGlsZCB0eXBlIGZvciBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFuZCBFbnVtRGVjbGFyYXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQwMDIiPjE3NDAwMjwvYT4KLVthc3Npc3RdIEV4Y2VwdGlvbnMgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieSB0aGUgYW5vdGhlciBleGNlcHRpb24gYXJlIHByb3Bvc2VkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MDAxIj4xNzQwMDE8L2E+Ci1bYXNzaXN0XSBVbmV4cGVjdGVkIHR5cGVzIGFyZSBwcm9wb3NlZCBpbnNpZGUgY2F0Y2ggYmxvY2sKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkxNTQiPjE0OTE1NDwvYT4KLUJpbmFyeU1ldGhvZCNnZXRQYXJhbWV0ZXJOYW1lcygpIHNob3VsZCBub3QgdHJ5IHRvIGV4dHJhY3QgZnJvbSBhdHRhY2hlZCBqYXZhZG9jIGZvciBzeW50aGV0aWNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MTMxIj4xNzQxMzE8L2E+Ci1bYXNzaXN0XSBSZXN1bHQgb2YgdGVzdCBDb21wbGV0aW9uVGVzdHMjdGVzdENvbXBsZXRpb25JbnNpZGVFeHRlbmRzMTAgaXMgd3JvbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM3MyI+MzQzNzM8L2E+Ci1DbGFzcyBmaWxlIHZpZXcgZG9lc24ndCBzaG93IGFjdHVhbCBtb2RpZmllcnMgZm9yIG1lbWJlciB0eXBlcwotCi08YSBuYW1lPSJ2XzczNiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNiAtIDEzdGggRmVicnVhcnkgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzYKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzM2Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MDM5Ij4xNTgwMzk8L2E+Ci1bYXN0IHJld3JpdGVdIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHJld3JpdGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzkwNyI+MTczOTA3PC9hPgotW2NvZGUgYXNzaXN0XSBzZXZlcmUgTlBFIG9uIGV4Y2VwdGlvbiBjb21wbGV0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgwMCI+MTczODAwPC9hPgotW2NvbXBpbGVyXSBzdWJvcHRpbWFsIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZXMgZm9yIGNhc2NhZGluZyBmaWVsZCBhY2Nlc3NlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Mzg0OSI+MTczODQ5PC9hPgotSVR5cGVCaW5kaW5nI2dldEphdmFFbGVtZW50KCkgZmFpbHMgZm9yIGFycmF5IG9mIGlubmVyIHR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4NTMiPjE3Mzg1MzwvYT4KLVtyZWNvdmVyeV0gUmVjb3ZlcnkgYWRkIGFuIHVubmVjZXNzYXJ5IGRlZmF1bHQgY29udHJ1Y3RvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzAxMyI+MTczMDEzPC9hPgotW2Fzc2lzdF0gTlBFIHdoaWxlIGNvbXBsZXRpbmcgaW4gY2F0Y2ggZm9ybWFsIHBhcmFtZXRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjIzNCI+MTQyMjM0PC9hPgotcHJvYmxlbSByYW5nZSBpbmNsdWRlcyBwYXJlbnRoZXNpcyBmb3Igd2FybmluZyBvbiBleHByZXNzaW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MDAxIj4xMDcwMDE8L2E+Ci1JVHlwZUJpbmRpbmcjZ2V0QmluYXJ5TmFtZSgpIHJldHVybnMgamF2YS5sYW5nLk9iamVjdCBmb3IgdHlwZSB2YXJpYWJsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjMwNyI+MTU2MzA3PC9hPgotSmF2YUVsZW1lbnQuZ2V0VVJMQ29udGVudHMoKSBoYWNrIGJyZWFrcyAmcXVvdDtPcGVuIEV4dGVybmFsIEphdmFkb2MmcXVvdDsKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE1MjkiPjExMTUyOTwvYT4KLW5wZSB0cnlpbmcgdG8gZ2V0IElUeXBlQmluZGluZyBmb3IgcGFyYW1ldGVyaXplZCB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NzQyIj4xNDQ3NDI8L2E+Ci1TZXR0aW5nIHRoZSBib290Y2xhc3NwYXRoIGZvciBzb21lIFZNcyBmYWlscyB0aGUgZXZhbHVhdGlvbiB0ZXN0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Mjc0MyI+MTcyNzQzPC9hPgotW2pzcjI2OV0gQVBUIG5lZWRzIHRvIGNvbnZlcnQgSUZpbGUgaW50byBpbnRlcm5hbCBJQ29tcGlsYXRpb25Vbml0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4ODk3Ij4xMzg4OTc8L2E+Ci1FcnJvciByYW5nZXMgZm9yIHVucmVhY2hhYmxlIGNvZGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI4NDgiPjE3Mjg0ODwvYT4KLVtmb3JtYXR0ZXJdIGNvZGUgZm9ybWF0dGVyIHByb2R1Y2VzIHN5bnRheCBlcnJvciAodW5hcnkgb3BlcmF0b3IrIGZvbGxvd2VkIGJ5IHByZWZpeCBpbmNyZW1lbnQgb3BlcmF0b3IrKykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzMzNzYiPjE3MzM3NjwvYT4KLVtqc3IyNjldIE11bHRpcGxlIGFubm90YXRpb25zIG9uIGNsYXNzLCBvbmx5IGZpcnN0IGlzIHJlc29sdmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczNDE2Ij4xNzM0MTY8L2E+Ci1bY29tcGlsZXJdW2JhdGNoXVtvcHRpb25zXSBlY2ogZG9lc24ndCBzdXBwb3J0IGNsYXNzcGF0aCBlbnRyeSBzdGFydGluZyB3aXRoIFsKLQotPGEgbmFtZT0idl83MzUiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTUgLSA4dGggRmVicnVhcnkgMjAwNyAtIDMuMyBNSUxFU1RPTkUgNQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzUKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzM1Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyNjMzIj4xNzI2MzM8L2E+Ci1OUEVzIHdoaWxlIHN0YXJ0aW5nIG15IHdvcmtzcGFjZQotCi08YSBuYW1lPSJ2XzczNCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNSAtIDNyZCBGZWJydWFyeSAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczNAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzQiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5OZXcgZXh0ZW5zaW9uIHBvaW50IGhhcyBiZWVuIGFkZGVkIHRvIHJlZ2lzdGVyIGFuIGFubm90YXRpb24gcHJvY2Vzc29yIG1hbmFnZXIgaW5zaWRlIHRoZSBKYXZhIEJ1aWxkZXIuCi1TZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM2OSI+MTcyMzY5PC9hPiBmb3IgZGV0YWlscy48L2xpPgotPGxpPkluIG9yZGVyIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk0MTIiPjQ5NDEyPC9hPiwgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQ6Ci08dWw+Ci08bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0NMRUFSX0JMQU5LX0xJTkVTPC9saT4KLTxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUPC9saT4KLTwvdWw+Ci1UaGV5IGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGVzZSBjb25zdGFudHMgcmVzcGVjdGl2ZWx5OgotPHVsPgotPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9DTEVBUl9CTEFOS19MSU5FU19JTl9KQVZBRE9DX0NPTU1FTlQ8YnI+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfQ0xFQVJfQkxBTktfTElORVNfSU5fQkxPQ0tfQ09NTUVOVDwvbGk+Ci08bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9MSU5FX0NPTU1FTlQ8YnI+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0JMT0NLX0NPTU1FTlQ8YnI+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0pBVkFET0NfQ09NTUVOVDwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyNjQ4Ij4xNzI2NDg8L2E+Ci1bbW9kZWxdIFNvbWUgaW5jb25zaXN0ZW5jaWVzIHdoaWxlIGFkZGluZyBsaXN0ZW5lcnMgdG8gRGVsdGFQcm9jZXNzaW5nU3RhdGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTQxMiI+NDk0MTI8L2E+Ci1bZm9ybWF0dGluZ10gT2ZmZXIgY29tbWVudCBmb3JtYXR0aW5nIG9wdGlvbnMgcGVyIGNvbW1lbnQgdHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk5NiI+MTYxOTk2PC9hPgotW2NvbXBpbGVyXVtiYXRjaF1bb3B0aW9uc10gZWNqIGNhbid0IGNvcGUgd2l0aCBbXSBicmFja2V0cyBpbiBjbGFzc3BhdGggbmFtZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI0NDQiPjE3MjQ0NDwvYT4KLWJ1aWxkIHdvcmtzcGFjZSBvcGVyYXRpb24gbGF1bmNoZWQgYWZ0ZXIgZWFjaCBzdGFydHVwCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyMDI4Ij4xNzIwMjg8L2E+Ci1bY2xlYW4gdXBdIFNvcnQgbWVtYmVycyBjbGVhbiB1cCBsZWFrcyB3b3JraW5nIGNvcGllcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM2OSI+MTcyMzY5PC9hPgotQWRkaW5nIGFuIGV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBhbiBhbm5vdGF0aW9uIHByb2Nlc3NvciBpbnNpZGUgdGhlIGphdmEgYnVpbGRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjE4OSI+MTcyMTg5PC9hPgotWzEuNV1bY29tcGlsZXJdIE5QRSBpbiBDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3Mgd2l0aCBleHBsaWNpdCB3aWxkY2FyZCBpbnZvY2F0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyMjA3Ij4xNzIyMDc8L2E+Ci1bbW9kZWxdIE1hcmtlciBmb3IgZGVwcmVjYXRlZCBjbGFzc3BhdGggdmFyaWFibGUgc2hvdWxkIGFsd2F5cyBoYXZlIFdBUk5JTkcgc2V2ZXJpdHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzIzMjgiPjE3MjMyODwvYT4KLUphdmFkb2MgZm9yIFNlYXJjaEVuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMoLi4pIGhhcyB3cm9uZyBAcGFyYW0gb3JkZXJpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE2ODQiPjE3MTY4NDwvYT4KLVJlcGxhY2UgcmVmZXJlbmNlcyB0byBJTWFya2VyLkdFTkVSQVRFRF9CWSB3aXRoIElNYXJrZXIuU09VUkNFX0lECi0KLTxhIG5hbWU9InZfNzMzIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM001IC0gMzB0aCBKYW51YXJ5IDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzMzCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczMyI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPk5ldyBBUEkgYWRkZWQgaW4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjwvY29kZT46PGJyPgotPHByZT4KLS8qKgotICogQ29tcGFyZXMgdGhlIHR3byBjaGFyIGFycmF5cyBsZXhpY29ncmFwaGljYWxseS4KLSAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBhcnJheTEgbGV4aWNvZ3JhcGhpY2FsbHkgcHJlY2VkZXMgdGhlIGFycmF5MiwKLSAqIGEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIGFycmF5MSBsZXhpY29ncmFwaGljYWxseSBmb2xsb3dzIHRoZSBhcnJheTIsIG9yCi0gKiB6ZXJvIGlmIGJvdGggYXJyYXlzIGFyZSBlcXVhbC4KLSAqCi0gKiBAcGFyYW0gYXJyYXkxIHRoZSBmaXJzdCBhcnJheQotICogQHBhcmFtIGFycmF5MiB0aGUgc2Vjb25kIGFycmF5Ci0gKiBAcmV0dXJuIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIGFycmF5MSBhbmQgYXJyYXkyCi0gKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgYXJyYXlzIGlzIG51bGwKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi08L3ByZT4KLTwvbGk+Ci08bGk+TmV3IEFQSSBhZGRlZCBpbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNvbXBpbGF0aW9uVW5pdFNvcnRlcjwvY29kZT46PGJyPgotPHByZT4JLyoqCi0JICogUmVvcmRlcnMgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBhY2NvcmRpbmcgdG8gdGhlCi0JICogc3BlY2lmaWVkIGNvbXBhcmF0b3IuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFycmFuZ2luZyBpbiBhZHZhbmNlCi0JICogdGhhdCB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBpcyBhIHdvcmtpbmcgY29weSwgYW5kIGZvciBhcHBseWluZyB0aGUKLQkgKiByZXR1cm5lZCBUZXh0RWRpdCBhZnRlcndhcmRzLgotCSAqCi0JICogPGI+Tm90ZTo8L2I+IFJlb3JkZXJpbmcgdGhlIG1lbWJlcnMgd2l0aGluIGEgdHlwZSBkZWNsYXJhdGlvbiBtaWdodCBiZQotCSAqIG1vcmUgdGhhbiBhIGNvc21ldGljIGNoYW5nZSBhbmQgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBzZXJpb3VzCi0JICogcmVwZXJjdXNzaW9ucy4gRmlyc3RseSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgb2YgYSB0eXBlIGFyZQotCSAqIGluaXRpYWxpemVkIGlzIHNpZ25pZmljYW50IGluIHRoZSBKYXZhIGxhbmd1YWdlOyByZW9yZGVyaW5nIGZpZWxkcyBhbmQKLQkgKiBpbml0aWFsaXplcnMgbWF5IHJlc3VsdCBpbiBjb21waWxhdGlvbiBlcnJvcnMgb3IgY2hhbmdlIHRoZSBleGVjdXRpb24KLQkgKiBiZWhhdmlvciBvZiB0aGUgY29kZS4gU2Vjb25kbHksIHJlb3JkZXJpbmcgYSBjbGFzcydzIG1lbWJlcnMgbWF5IGFmZmVjdAotCSAqIGhvdyBpdHMgaW5zdGFuY2VzIGFyZSBzZXJpYWxpemVkLiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgdGhlcmVmb3JlIGJlIHVzZWQKLQkgKiB3aXRoIGNhdXRpb24gYW5kIGR1ZSBjb25jZXJuIGZvciBwb3RlbnRpYWwgbmVnYXRpdmUgc2lkZSBlZmZlY3RzLgotCSAqCi0JICoKLQkgKiBUaGUgPGNvZGU+Y29tcGFyZTwvY29kZT4gbWV0aG9kIG9mIHRoZSBnaXZlbiBjb21wYXJhdG9yIGlzIHBhc3NlZCBwYWlycwotCSAqIG9mIGJvZHkgZGVjbGFyYXRpb25zIChzdWJjbGFzc2VzIG9mIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT4pCi0JICogcmVwcmVzZW50aW5nIGJvZHkgZGVjbGFyYXRpb25zIGF0IHRoZSBzYW1lIGxldmVsLiBUaGUgbm9kZXMgYXJlIGZyb20gYW4KLQkgKiBBU1Qgb2YgdGhlIHNwZWNpZmllZCBsZXZlbCAoe0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXIjbmV3UGFyc2VyKGludCl9LgotCSAqIENsaWVudHMgd2lsbCBnZW5lcmFsbHkgdXNlIEFTVC5KTFMzIHNpbmNlIHRoYXQgd2lsbCBjb3ZlciBhbGwKLQkgKiBjb25zdHJ1Y3RzIGZvdW5kIGluIEphdmEgMS4wLCAxLjEsIDEuMiwgMS4zLCAxLjQsIGFuZCAxLjUgc291cmNlIGNvZGUuCi0JICogVGhlIGNvbXBhcmF0b3IgaXMgY2FsbGVkIG9uIGJvZHkgZGVjbGFyYXRpb25zIG9mIG5lc3RlZCBjbGFzc2VzLAotCSAqIGluY2x1ZGluZyBhbm9ueW1vdXMgYW5kIGxvY2FsIGNsYXNzZXMsIGJ1dCBhbHdheXMgYXQgdGhlIHNhbWUgbGV2ZWwuCi0JICogQ2xpZW50cyBuZWVkIHRvIHByb3ZpZGUgYSBjb21wYXJhdG9yIGltcGxlbWVudGF0aW9uICh0aGVyZSBpcyBubyBzdGFuZGFyZAotCSAqIGNvbXBhcmF0b3IpLiBUaGUgPGNvZGU+UkVMQVRJVkVfT1JERVI8L2NvZGU+IHByb3BlcnR5IGF0dGFjaGVkIHRvIHRoZXNlCi0JICogQVNUIG5vZGVzIGFmZm9yZHMgdGhlIGNvbXBhcmF0b3IgYSB3YXkgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIHJlbGF0aXZlCi0JICogb3JkZXIuCi0JICoKLQkgKgotCSAqIFRoZSBib2R5IGRlY2xhcmF0aW9ucyBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgY29tcGFyYXRvciBhbHdheXMgY2FycnkKLQkgKiBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc2lnbmF0dXJlIGluZm9ybWF0aW9uOgotCSAqCi0JICoKLQkgKiA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+Ci0JICogPGNvZGU+bW9kaWZpZXJzLCBpc0ludGVyZmFjZSwgbmFtZSwgc3VwZXJjbGFzcywKLQkgKiAgICAgICAgc3VwZXJJbnRlcmZhY2VzLCB0eXBlUGFyYW1ldGVycwotCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KLQkgKgotCSAqIDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+Ci0JICogPGNvZGU+bW9kaWZpZXJzLCB0eXBlLCBmcmFnbWVudHMKLQkgKiAgICAgICAgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMKLQkgKiAgICAgICAgd2l0aCBuYW1lIG9ubHkpCi0JICogICAgICAgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPgotCSAqCi0JICogPGNvZGU+TWV0aG9kRGVjbGFyYXRpb248L2NvZGU+Ci0JICogPGNvZGU+bW9kaWZpZXJzLCBpc0NvbnN0cnVjdG9yLCByZXR1cm5UeXBlLCBuYW1lLAotCSAqICAgICAgICB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycwotCSAqICAgICAgICAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMgd2l0aCBuYW1lLCB0eXBlLCBhbmQgbW9kaWZpZXJzIG9ubHkpLAotCSAqICAgICAgICB0aHJvd25FeGNlcHRpb25zCi0JICogICAgICAgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPgotCSAqCi0JICogPGNvZGU+SW5pdGlhbGl6ZXI8L2NvZGU+Ci0JICogPGNvZGU+bW9kaWZpZXJzCi0JICogICAgICAgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPgotCSAqCi0JICogPGNvZGU+QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjwvY29kZT4KLQkgKiA8Y29kZT5tb2RpZmllcnMsIG5hbWUKLQkgKiAgICAgICAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+Ci0JICoKLQkgKiA8Y29kZT5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uPC9jb2RlPgotCSAqIDxjb2RlPm1vZGlmaWVycywgbmFtZSwgdHlwZSwgZGVmYXVsdAotCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KLQkgKgotCSAqIDxjb2RlPkVudW1EZWNsYXJhdGlvbjwvY29kZT4KLQkgKiA8Y29kZT5tb2RpZmllcnMsIG5hbWUsIHN1cGVySW50ZXJmYWNlcwotCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KLQkgKgotCSAqIDxjb2RlPkVudW1Db25zdGFudERlY2xhcmF0aW9uPC9jb2RlPgotCSAqIDxjb2RlPm1vZGlmaWVycywgbmFtZSwgYXJndW1lbnRzCi0JICogICAgICAgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPgotCSAqCi0JICogQ2xpZW50cyBzaG91bGQgbm90IHJlbHkgb24gdGhlIEFTVCBub2RlcyBiZWluZyBwcm9wZXJseSBwYXJlbnRlZAotCSAqIG9yIG9uIGhhdmluZyBzb3VyY2UgcmFuZ2UgaW5mb3JtYXRpb24uIChGdXR1cmUgcmVsZWFzZXMgbWF5IHByb3ZpZGUKLQkgKiBvcHRpb25zIGZvciByZXF1ZXN0aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSBzb3VyY2UgcG9zaXRpb25zLCBmdWxsCi0JICogQVNUcywgbm9uLXJlY3Vyc2l2ZSBzb3J0aW5nLCBldGMuKQotCSAqCi0JICogQHBhcmFtIHVuaXQKLQkgKiAgICAgICAgICAgIHRoZSBDb21waWxhdGlvblVuaXQgdG8gc29ydAotCSAqIEBwYXJhbSBjb21wYXJhdG9yCi0JICogICAgICAgICAgICB0aGUgY29tcGFyYXRvciBjYXBhYmxlIG9mIG9yZGVyaW5nCi0JICogICAgICAgICAgICA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+czsgdGhpcyBjb21wYXJhdG9yIGlzIHBhc3NlZAotCSAqICAgICAgICAgICAgQVNUIG5vZGVzIGZyb20gYW4gQVNUIG9mIHRoZSBzcGVjaWZpZWQgQVNUIGxldmVsCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIGJpdHdpc2Utb3Igb2Ygb3B0aW9uIGZsYWdzOyA8Y29kZT4wPC9jb2RlPiBmb3IgZGVmYXVsdAotCSAqICAgICAgICAgICAgYmVoYXZpb3IgKHJlc2VydmVkIGZvciBmdXR1cmUgZ3Jvd3RoKQotCSAqIEBwYXJhbSBncm91cAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZWRpdCBncm91cCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRleHQgZWRpdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIG5vdGlmeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEByZXR1cm4gYSBUZXh0RWRpdCBkZXNjcmliaW5nIHRoZSByZXF1aXJlZCBlZGl0cyB0byBkbyB0aGUgc29ydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHNvcnRpbmcgaXMgbm90IHJlcXVpcmVkCi0JICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgY29tcGlsYXRpb24gdW5pdCBjb3VsZCBub3QgYmUgc29ydGVkLiBSZWFzb25zCi0JICogICAgICAgICAgICAgICAgaW5jbHVkZToKLQkgKiAgICAgICAgICAgICAgICAtIFRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGRvZXMgbm90IGV4aXN0Ci0JICogICAgICAgICAgICAgICAgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpCi0JICogICAgICAgICAgICAgICAgLSBUaGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYSB3b3JraW5nIGNvcHkKLQkgKiAgICAgICAgICAgICAgICAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQotCSAqICAgICAgICAgICAgICAgIC0gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZQotCSAqICAgICAgICAgICAgICAgIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQotCSAqICAgICAgICAgICAgICAgIC0gVGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZG9lc24ndCBjb21lIGZyb20gYW4gSUNvbXBpbGF0aW9uVW5pdCBhbmQgdGhpcyBJQ29tcGlsYXRpb25Vbml0IGlzCi0JICogICAgICAgICAgICAgICAgbm90IGEgd29ya2luZyBjb3B5IChOT19FTEVNRU5UU19UT19QUk9DRVNTKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgaXMgbnVsbCBvciBpZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgICAgICBjb21wYXJhdG9yIGlzIG51bGwsIG9yIGlmIDxjb2RlPm9wdGlvbnM8L2NvZGU+IGlzIG5vdCBvbmUKLQkgKiAgICAgICAgICAgICAgICBvZiB0aGUgc3VwcG9ydGVkIGxldmVscy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb24KLQkgKiBAc2VlICNSRUxBVElWRV9PUkRFUgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQkgcHVibGljIHN0YXRpYyBUZXh0RWRpdCBzb3J0KENvbXBpbGF0aW9uVW5pdCB1bml0LAotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yLAotCQkJaW50IG9wdGlvbnMsCi0JCQlUZXh0RWRpdEdyb3VwIGdyb3VwLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOzwvcHJlPgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2MzU0Ij4xNjYzNTQ8L2E+Ci1bMS41XVtjb21waWxlcl0gZXh0cmFuZW91cyBlcnJvciBjYXVzZWQgYnkgYSBub24gdmlzaWJsZSBtZXRob2Qgb2YgYW4gaW5oZXJpdGVkCi1jbGFzcyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIGEgdmlzaWJsZSBtZXRob2Qgb2YgYW4gZW5jbG9zaW5nIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MTkwIj4xNjcxOTA8L2E+Ci1bc2VhcmNoXSBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlciBjYXVzaW5nIENsYXNzQ2FzdEV4Y2VwdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTgzMCI+MTQxODMwPC9hPgotWzEuM11bY29tcGlsZXJdIFNldmVyZSBydW50aW1lIGVycm9ycyB3aXRoIGFub255bW91cyBjbGFzc2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxNjM0Ij4xNzE2MzQ8L2E+Ci1bZm9ybWF0dGVyXSBkb2Vzbid0IGFkZCBsaW5lIGZlZWQgYXQgZW5kIG9mIGZpbGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE0NzIiPjE3MTQ3MjwvYT4KLVsxLjZdW2NvbXBpbGVyXSBJbGxlZ2FsIHN0YWNrIG1hcCBmcmFtZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM1OTAiPjE2MzU5MDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbmNvbXBhdGlibGUgdHlwZSBib3VuZHMgbWVzc2FnZSBwb2ludHMgdG8gdGhlIGdlbmVyaWMgdHlwZSBpbnN0ZWFkIG9mIGl0cyB0eXBlIHBhcmFtZXRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTc3MSI+MTcxNzcxPC9hPgotW2Fzc2lzdF0gSkFWQURPQ19UWVBFX1JFRiBhcmVuJ3QgY29ycmVjdGx5IGZpbHRlcmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMTg0Ij4xNzExODQ8L2E+Ci1bY29tcGlsZXJdIEphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgSW5uZXJDbGFzcyBhdHRyaWJ1dGUgYXMgcGVyIEpWTVMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzMyNzkiPjE3MzI3OTwvYT4KLVtpbmRleGluZ10gQ2F0ZWdvcnkgdGFibGUgaXMgbm90IGNhY2hlZCBmb3IgcnQuamFyIHNpbmNlIDEuNSB2ZXJzaW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MzA5Ij4xMzgzMDk8L2E+Ci1baW5kZXhdIE9wdGltaXplIGluZGV4IGZpbGVzIHBhdGggc3RvcmFnZSBpbiBEaXNrSW5kZXggYW5kIEluZGV4TWFuYWdlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjU3MCI+MTY2NTcwPC9hPgotW2Fzc2lzdF0gUHJvcG9zYWwgY29tcHV0ZXIgZnJvbSB0aGUgJ29yZy5lY2xpcHNlLm15bGFyLmphdmEnIHBsdWctaW4gZGlkIG5vdCBjb21wbGV0ZSBub3JtYWxseQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjA3MyI+MTYyMDczPC9hPgotW2NvbXBpbGVyXSBleHRyYW5lb3VzIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDY2Ij4xNzEwNjY8L2E+Ci1Qcm92aWRlIFRleHRFZGl0IHdoZW4gc29ydGluZyBjb21waWxhdGlvbiB1bml0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwMzE4Ij4xNzAzMTg8L2E+Ci1bMS41XVtjb21waWxlcl0gaW1wcm92ZSBtZXNzYWdlIG9uIG5hbWVjbGFzaCB3aGVuIG92ZXJyaWRpbmcgbWV0aG9kIHdpdGggIndpbGRjYXJkIiBwYXJhbWV0ZXIKLQotPGEgbmFtZT0idl83MzIiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTUgLSAyM3JkIEphbnVhcnkgMjAwNwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzIKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzMyIj5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+Q29kZSBBc3Npc3Q6IEV4Y2VwdGlvbiB0aHJvd24gaW4gYSB0cnkgYmxvY2sgYXJlIG1vcmUgcmVsZXZhbnQgaWYgdGhlIGNvbXBsZXRpb24gb2NjdXJzIGluIGEgY2F0Y2ggY2xhdXNlLgotQWxyZWFkeSBjYXVnaHQgZXhjZXB0aW9ucyBhcmUgZmlsdGVyZWQuCi08cHJlPgotcHVibGljIGNsYXNzIFggewotICB2b2lkIGZvbygpIHRocm93cyBYQUV4Y2VwdGlvbiwgWEJFeGNlcHRpb24ge30KLSAgdm9pZCBiYXIoKSB7Ci0gICAgdHJ5IHsKLSAgICAJZm9vKCk7Ci0gICAgfSBjYXRjaChYQUV4Y2VwdGlvbiBlKSB7Ci0gICAgfSBjYXRjaChYfCAvL2RvIGN0cmwgKyBzcGFjZSBhdCB8Ci0gIH0KLTwvcHJlPgotSW4gdGhpcyBleGFtcGxlIFhCRXhjZXB0aW9uIHdpbGwgbW9yZSByZWxldmFudCB0aGFuIFhDRXhjZXB0aW9uIGFuZCBYQUV4Y2VwdGlvbiB3b24ndCBiZSBwcm9wb3NlZC4KLTwvbGk+Ci08bGk+Q2xhc3NwYXRoIHZhcmlhYmxlIG1heSBub3cgYmUgZmxhZ2dlZCBhcyBkZXByZWNhdGVkIG9yIHJlYWQtb25seSAoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg1OTkiPjEzODU5OTwvYT4KLWFuZCBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MjI2Ij4xNTYyMjY8L2E+KS48YnI+Ci1Ud28gbmV3IGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIGFkZGVkIG9uIDxjb2RlPkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L2NvZGU+IHNjaGVtYToKLTxwcmU+Ci0gICAmbHQ7ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIiZndDsKLSAgICAgICZsdDtjb21wbGV4VHlwZSZndDsKLSAgICAgICAgIC4uLgotICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJkZXByZWNhdGVkIiB0eXBlPSJzdHJpbmciJmd0OwotICAgICAgICAgICAgJmx0O2Fubm90YXRpb24mZ3Q7Ci0gICAgICAgICAgICAgICAmbHQ7ZG9jdW1lbnRhdGlvbiZndDsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBsYWluaW5nIHRoZSByZWFzb24gd2h5IHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgICAgICZsdDsvZG9jdW1lbnRhdGlvbiZndDsKLSAgICAgICAgICAgICAgICZsdDthcHBJbmZvJmd0OwotICAgICAgICAgICAgICAgICAgJmx0O21ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvJmd0OwotICAgICAgICAgICAgICAgJmx0Oy9hcHBJbmZvJmd0OwotICAgICAgICAgICAgJmx0Oy9hbm5vdGF0aW9uJmd0OwotICAgICAgICAgJmx0Oy9hdHRyaWJ1dGUmZ3Q7Ci0gICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InJlYWRPbmx5IiB0eXBlPSJib29sZWFuIiZndDsKLSAgICAgICAgICAgICZsdDthbm5vdGF0aW9uJmd0OwotICAgICAgICAgICAgICAgJmx0O2RvY3VtZW50YXRpb24mZ3Q7Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBjYW5ub3QgYmUgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICZsdDsvZG9jdW1lbnRhdGlvbiZndDsKLSAgICAgICAgICAgICZsdDsvYW5ub3RhdGlvbiZndDsKLSAgICAgICAgICZsdDsvYXR0cmlidXRlJmd0OwotICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsKLSAgICZsdDsvZWxlbWVudCZndDsKLTwvcHJlPgotV2hlbiBkZXByZWNhdGVkIGF0dHJpYnV0ZSBpcyBzZXQgb24gQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciBleHRlbnNpb24gcG9pbnQsIGNsYXNzcGF0aCBlbnRyeSB2YWxpZGF0aW9uCi1yZXR1cm5zIGEgd2FybmluZyBzdGF0dXMgaWYgbm8gb3RoZXIgZXJyb3Igd2FzIHByZXZpb3VzbHkgZGV0ZWN0ZWQuCi08YnI+Ci1Gb3IgZXhhbXBsZSwgZm9sbG93aW5nIDxjb2RlPiBjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgc2V0Ci10aGUgPGNvZGU+VEVTVDwvY29kZT4gY2xhc3NwYXRoIHZhcmlhYmxlIGFzIGRlcHJlY2F0ZWQgYW5kIHJlYWQtb25seToKLTxwcmU+Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciImZ3Q7Ci0gICAgICAmbHQ7Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC50ZXN0cy5tb2RlbC5UZXN0SW5pdGlhbGl6ZXIiCi0gICAgICAgICAgICBkZXByZWNhdGVkPSJUaGUgcmVhc29uIHdoeSB0aGlzIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQiCi0gICAgICAgICAgICByZWFkT25seT0idHJ1ZSIKLSAgICAgICAgICAgIHZhcmlhYmxlPSJURVNUIiZndDsKLSAgICAgICZsdDsvY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci1DYWxsaW5nIDxjb2RlPkphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5LCBib29sZWFuKTwvY29kZT4KLW1ldGhvZCBvbiB0aGlzIHZhcmlhYmxlIGVudHJ5IHdpbGwgcmV0dXJuIGEgPGNvZGU+SVN0YXR1cy5XQVJOSU5HPC9jb2RlPiBzdGF0dXMgd2l0aCBmb2xsb3dpbmcgbWVzc2FnZToKLS4KLTxicj4KLUNsYXNzcGF0aCB2YXJpYWJsZSBkZXByZWNhdGlvbiBtZXNzYWdlIGFuZCByZWFkLW9ubHkgaW5mb3JtYXRpb24gYXJlIGFjY2Vzc2libGUgdXNpbmcgdHdvIG5ldyBhZGRlZAotPGNvZGU+SmF2YUNvcmU8L2NvZGU+IEFQSSBtZXRob2RzOgotPHByZT4KLS8qKgotICogUmV0dXJucyBkZXByZWNhdGlvbiBtZXNzYWdlIG9mIGEgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLgotICoKLSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUKLSAqIEByZXR1cm4gQSBzdHJpbmcgaWYgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZSBpcyBkZXByZWNhdGVkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzcGF0aFZhcmlhYmxlRGVwcmVjYXRpb25NZXNzYWdlKFN0cmluZyB2YXJpYWJsZU5hbWUpCi0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlIGlzIHJlYWQtb25seSBvciBub3QuCi0gKgotICogQHBhcmFtIHZhcmlhYmxlTmFtZQotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGlzIHJlYWQtb25seSwKLSAqIAk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc3BhdGhWYXJpYWJsZVJlYWRPbmx5KFN0cmluZyB2YXJpYWJsZU5hbWUpCi08L3ByZT4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTAxNyI+MTY5MDE3PC9hPgotWzEuNl1bY29tcGlsZXJdIFZlcmlmeUVycm9yOiBJbmNvbnNpc3RlbnQgc3RhY2ttYXAgZnJhbWVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MjI2Ij4xNTYyMjY8L2E+Ci1bbW9kZWxdW2NsYXNzcGF0aF0gQWxsb3cgY2xhc3NwYXRoIHZhcmlhYmxlIHRvIGJlIG1hcmtlZCBhcyBub24gbW9kaWZpYWJsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODU5OSI+MTM4NTk5PC9hPgotW21vZGVsXVtjbGFzc3BhdGhdIE5lZWQgYSB3YXkgdG8gbWFyayBhIGNsYXNzcGF0aCB2YXJpYWJsZSBhcyBkZXByZWNhdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NTg0Ij4xNTc1ODQ8L2E+Ci1bY29udGVudCBhc3Npc3RdIFRoZXJlIGlzIG5vIGNvbnRlbnQgYXNzaXN0IGZvciBjYXRjaGluZyBleGNlcHRpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDE2Ij4xNzEwMTY8L2E+Ci1bamF2YWRvY11bYXNzaXN0XSBObyBjb21wbGV0aW9uIGZvciB0YWcgd2hlbiB1cHBlcmNhc2UgaXMgdXNlZAotCi0KLTxhIG5hbWU9InZfNzMxIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM001IC0gMTZ0aCBKYW51YXJ5IDIwMDcKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzMxCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczMSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPlRoZSBjb21waWxlciBjYW4gbm93IGRldGVjdCB1bnVzZWQgbG9jYWwgdHlwZXMgKGFzIG9wcG9zZWQgdG8gb25seSBwcml2YXRlIHR5cGVzIHVwIHVudGlsIG5vdykuIDwvbGk+Ci08bGk+VGhlIGNvbXBpbGVyIGlzIG5vdyBiZXR0ZXIgYWJsZSB0byBkZXRlY3QgdW51c2VkIHByaXZhdGUgY29uc3RydWN0b3JzLCBpdCBub3cgdG9sZXJhdGVzIG1vcmUgdGhhbiB0aGUKLXByaXZhdGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIgYXMgdGhlIGtub3duIHBhdHRlcm4gZm9yIGJsb2NraW5nIGluc3RhbnRpYXRpb24uIEJhc2ljYWxseSwgdW5sZXNzIGEKLW5vbiBwcml2YXRlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQgYXMgd2VsbCwgaXQgd2lsbCBpZ25vcmUgdW51c2VkIHByaXZhdGUgY29uc3RydWN0b3JzIGZyb20gbm93IG9uIChhbHNvIHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNDQzIj4xNjM0NDM8L2E+KS48L2xpPgotPGxpPkNvZGUgQXNzaXN0IGNhbiBwcm9wb3NlIGltcG9ydCBzdGF0ZW1lbnRzOgotPHByZT4KLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWwgewotCS4uLgotCS8qKgotCSAqIENvbXBsZXRpb24gaXMgYW4gaW1wb3J0IG9mIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBmaWVsZC4KLQkgKiAmbHQ7cCZndDsKLQkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLQkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6Ci0JICogJmx0O3VsJmd0OwotCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KLQkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQotCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3MgKGluY2x1ZGluZyBBQ0NfRU5VTSkgb2YgdGhlIGZpZWxkIHRoYXQgaXMgaW1wb3J0ZWQKLQkgKiAmbHQ7L2xpJmd0OwotCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldE5hbWUoKX0gLQotCSAqIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KLQkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkJ3MgdHlwZSAoYXMgb3Bwb3NlZCB0byB0aGUKLQkgKiBzaWduYXR1cmUgb2YgdGhlIHR5cGUgaW4gd2hpY2ggdGhlIHJlZmVyZW5jZWQgZmllbGQKLQkgKiBpcyBkZWNsYXJlZCkKLQkgKiAmbHQ7L2xpJmd0OwotCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldEFkZGl0aW9uYWxGbGFncygpfSAtCi0JICogdGhlIGNvbXBsZXRpb24gZmxhZ3MgKGluY2x1ZGluZyBDb21sZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpCi0JICogb2YgdGhlIHByb3Bvc2VkIGltcG9ydAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0Oy91bCZndDsKLQkgKiAmbHQ7L3AmZ3Q7Ci0JICoKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9JTVBPUlQ7Ci0KLQkvKioKLQkgKiBDb21wbGV0aW9uIGlzIGFuIGltcG9ydCBvZiByZWZlcmVuY2UgdG8gYSBzdGF0aWMgbWV0aG9kLgotCSAqICZsdDtwJmd0OwotCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQotCSAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKLQkgKiAmbHQ7dWwmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKX0gLQotCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQotCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3Mgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGltcG9ydGVkCi0JICogJmx0Oy9saSZndDsKLQkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXROYW1lKCl9IC0KLQkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGltcG9ydGVkCi0JICogJmx0Oy9saSZndDsKLQkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXRTaWduYXR1cmUoKX0gLQotCSAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0QWRkaXRpb25hbEZsYWdzKCl9IC0KLQkgKiB0aGUgY29tcGxldGlvbiBmbGFncyAoaW5jbHVkaW5nIENvbWxldGlvbkZsYWdzLlN0YXRpY0ltcG9ydCkKLQkgKiBvZiB0aGUgcHJvcG9zZWQgaW1wb3J0Ci0JICogJmx0Oy9saSZndDsKLQkgKiAmbHQ7L3VsJmd0OwotCSAqICZsdDsvcCZndDsKLQkgKgotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9JTVBPUlQ7Ci0KLQkvKioKLQkgKiBDb21wbGV0aW9uIGlzIGFuIGltcG9ydCBvZiByZWZlcmVuY2UgdG8gYSB0eXBlLgotCSAqIE9ubHkgcmVmZXJlbmNlIHRvIHJlZmVyZW5jZSB0eXBlcyBhcmUgYWxsb3dlZC4KLQkgKiAmbHQ7cCZndDsKLQkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLQkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6Ci0JICogJmx0O3VsJmd0OwotCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KLQkgKiB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IGNvbnRhaW5zCi0JICogdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KLQkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQotCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3MgKGluY2x1ZGluZyBGbGFncy5BY2NJbnRlcmZhY2UsIEFjY0VudW0sCi0JICogYW5kIEFjY0Fubm90YXRpb24pIG9mIHRoZSB0eXBlIHRoYXQgaXMgaW1wb3J0ZWQKLQkgKiAmbHQ7L2xpJmd0OwotCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldEFkZGl0aW9uYWxGbGFncygpfSAtCi0JICogdGhlIGNvbXBsZXRpb24gZmxhZ3MgKGluY2x1ZGluZyBDb21sZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpCi0JICogb2YgdGhlIHByb3Bvc2VkIGltcG9ydAotCSAqICZsdDsvbGkmZ3Q7Ci0JICogJmx0Oy91bCZndDsKLQkgKiAmbHQ7L3AmZ3Q7Ci0JICoKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lNUE9SVDsKLQkuLi4KLX0KLTwvcHJlPjwvbGk+Ci08bGk+Q29kZSBBc3Npc3QgcHJvcG9zZSBjb21wbGV0aW9ucyBjb21wdXRlZCBmcm9tIGEgbGlzdCBhIGZhdm9yaXRlIHJlZmVyZW5jZXMuCi08cHJlPgotcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3IgewotCS4uLgotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhdm9yaXRlIHJlZmVyZW5jZXMgd2hpY2ggYXJlIHVzZWQgdG8gY29tcHV0ZSBzb21lIGNvbXBsZXRpb24gcHJvcG9zYWxzLgotCSAqICZsdDtwJmd0OwotCSAqIEEgZmF2b3JpdGUgcmVmZXJlbmNlIGlzIGEgcXVhbGlmaWVkIHJlZmVyZW5jZSBhcyBpdCBjYW4gYmUgc2VlbiBpbiBhbiBpbXBvcnQgc3RhdGVtZW50LiZsdDticiZndDsKLQkgKiBlLmcuICZsdDtjb2RlJmd0O3siamF2YS51dGlsLkFycmF5cyJ9Jmx0Oy9jb2RlJmd0OyZsdDticiZndDsKLQkgKiBJdCBjYW4gYmUgYW4gb24gZGVtYW5kIHJlZmVyZW5jZS4mbHQ7YnImZ3Q7Ci0JICogZS5nLiAmbHQ7Y29kZSZndDt7ImphdmEudXRpbC5BcnJheXMuKiJ9Jmx0Oy9jb2RlJmd0OwotCSAqIEl0IGNhbiBiZSBhIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBtZXRob2Qgb3IgZmllbGQgKGFzIGluIGEgc3RhdGljIGltcG9ydCkmbHQ7YnImZ3Q7Ci0JICogZS5nLiAmbHQ7Y29kZSZndDt7ImphdmEudXRpbC5BcnJheXMuZXF1YWxzIn0mbHQ7L2NvZGUmZ3Q7Ci0JICogJmx0Oy9wJmd0OwotCSAqICZsdDtwJmd0OwotCSAqIEN1cnJlbnRseSBvbmx5IG9uIGRlbWFuZCB0eXBlIHJlZmVyZW5jZXMgKCZsdDtjb2RlJmd0OyJqYXZhLnV0aWwuQXJyYXlzLioiJmx0Oy9jb2RlJmd0OyksCi0JICogcmVmZXJlbmNlcyB0byBhIHN0YXRpYyBtZXRob2Qgb3IgYSBzdGF0aWMgZmllbGQgYXJlIHVzZWQgdG8gY29tcHV0ZSBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLQkgKiBPdGhlciBraW5kIG9mIHJlZmVyZW5jZSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmdXR1cmUuCi0JICogJmx0Oy9wJmd0OwotCSAqIEByZXR1cm4gZmF2b3JpdGUgaW1wb3J0cwotCSAqCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRGYXZvcml0ZVJlZmVyZW5jZXMoKSB7Li4ufQotCi0JLyoqCi0JICogU2V0IHRoZSBmYXZvcml0ZSByZWZlcmVuY2VzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjb21wdXRlIHNvbWUgY29tcGxldGlvbiBwcm9wb3NhbHMuCi0JICogQSBmYXZvcml0ZSByZWZlcmVuY2UgaXMgYSBxdWFsaWZpZWQgcmVmZXJlbmNlIGFzIGl0IGNhbiBiZSBzZWVuIGluIGFuIGltcG9ydCBzdGF0ZW1lbnQuJmx0O2JyJmd0OwotCSAqCi0JICogQHBhcmFtIGZhdm9yaXRlSW1wb3J0cwotCSAqCi0JICogQHNlZSAjZ2V0RmF2b3JpdGVSZWZlcmVuY2VzKCkKLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYXZvcml0ZVJlZmVyZW5jZXMoU3RyaW5nW10gZmF2b3JpdGVJbXBvcnRzKSB7Li4ufQotCS4uLgotfQotPC9wcmU+Ci1XaXRoIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpZiB0aGUgZmF2b3JpdGUgcmVmZXJlbmNlIGlzIDxiPiJqYXZhLnV0aWwuQXJyYXlzLioiPC9iPiB0aGVuIGEgcHJvcG9zYWwKLXdpbGwgYmUgdGhlIG1ldGhvZCA8Yj4ic29ydCgpIjwvYj4gd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsIG9mIGEgc3RhdGljIGltcG9ydCA8Yj4iaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLnNvcnQ7IjwvYj4uCi1JZiB0aGUgY29tcGxldGlvbiBsZXZlbCBpcyBsZXNzZXIgdGhhbiAxLjUgdGhlIHByb3Bvc2FsIHdpbGwgYmUgPGI+IkFycmF5cy5zb3J0KCkiPC9iPiB3aXRoIGEgcmVxdWlyZWQgcHJvcG9zYWwgb2YgYW4gaW1wb3J0Ci08Yj4iaW1wb3J0IGphdmEudXRpbC5BcnJheXM7IjwvYj4uCi08cD4KLVRoZSBvcHRpb24gPGNvZGU+SmF2YUNvcmUuQ09ERUFTU0lTVF9TVUdHRVNUX1NUQVRJQ19JTVBPUlRTPC9jb2RlPiBjYW4gYmUgZGlzYWJsZWQgdG8gYXZvaWQgdG8gcHJvcG9zZSBzdGF0aWMgaW1wb3J0Ci1ldmVuIGlmIGNvbXBsaWFuY2UgaXMgMS41IG9yIGdyZWF0ZXIuCi08L3A+Ci08L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjgzMzEiPjE2ODMzMTwvYT4KLVsxLjVdW2NvbXBpbGVyXSBBYnN0cmFjdE1ldGhvZEVycm9yIG9uIGludGVyZmFjZSBtZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzAxODEiPjE3MDE4MTwvYT4KLVtjb21waWxlcl0gQ291bGQgZGlhZ25vc2UgdW51c2VkIGxvY2FsIHR5cGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MDQ0Ij4xNDQwNDQ8L2E+Ci1bc2VhcmNoXSBOUEUgd2hlbiB0cnlpbmcgdG8gZmluZCByZWZlcmVuY2VzIHRvIGZpZWxkIHZhcmlhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyMTIzIj4xNTIxMjM8L2E+Ci1bMS41XVthc3Npc3RdIENvZGUgYXNzaXN0IGZvciByZWZlcmVuY2VzIHRoYXQgcmVxdWlyZSBzdGF0aWMgaW1wb3J0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDI0NyI+MTcwMjQ3PC9hPgotW21vZGVsXSBEb2N1bWVudCByZWFzb25zIHRvIHVzZSBvciBub3QgdXNlIENvbXBpbGF0aW9uUGFydGljaXBhbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAzNDAiPjE0MDM0MDwvYT4KLVs1LjBdW3RlbXBsYXRlc10gZm9yZWFjaCB0ZW1wbGF0ZSBkb2VzIG5vdCB3b3JrIHdoZW4gYW4gSXRlcmFibGUgb3ZlciBhIHN0YXRpYyBpbm5lciBjbGFzcyBleGlzdHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM0NDMiPjE2MzQ0MzwvYT4KLVtjbGVhbiB1cF0gcHJpdmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlciBmbGFnZ2VkIGFzIHVubmVjZXNzYXJ5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyOTYxIj4xNTI5NjE8L2E+Ci1bY29tcGlsZXJdIFByaXZhdGUgaW5uZXIgaW50ZXJmYWNlIGlzICJuZXZlciB1c2VkIGxvY2FsbHkiCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MDM1Ij4xNTcwMzU8L2E+Ci0mcXVvdDtPcGVuIFR5cGUgSGllcmFyY2h5JnF1b3Q7IGZhaWxzIGlmIHN1YnR5cGUgaXMgYW5vbnltb3VzIG9yIGxvY2FsIGNsYXNzIGFuZCBsb2NhdGlvbiBmb3IgdGhpcyBzdWJ0eXBlIGNvbnRhaW5zICZxdW90Oy5jbGFzcyZxdW90OwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzQ4OCI+MTY3NDg4PC9hPgotW2NvbXBpbGVyXSBGdXAgb2YgYnVnIDE2NTI5MSwgdGhlIHR3byB3YXJuaW5ncyAoYXNzaWdubWVudCBoYXMgbm8gZWZmZWN0KSBzaG91bGQgbm90IGJlIHJlcG9ydGVkCi0KLQotPGEgbmFtZT0idl83MzAiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTUgLSA5dGggSmFudWFyeSAyMDA3Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczMAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzAiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5UaGUgZ3JhbW1hciBmaWxlIGphdmFfMV81LmcgaXMgcmVuYW1lZCBqYXZhLmcuCi08L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjI0NzgiPjE2MjQ3ODwvYT4KLU5QRSBpbiBNZXRob2RCaW5kaW5nI3NpZ25hdHVyZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTc0NCI+MTY5NzQ0PC9hPgotW0FTVF0gY2hhcmFjdGVyIHBvc2l0aW9uIHJhbmdlIHdyb25nIGZvciBzdXBlciBtZXRob2QgY2FsbCB3aXRoIHR5cGUgYXJndW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyOTkxIj4xNjI5OTE8L2E+Ci1bMS41XVtjb21waWxlcl0gTmFtZSBjbGFzaCByZXBvcnRlZCBmb3IgKGNvcnJlY3QpIGVjbGlwc2UtZ2VuZXJhdGVkIGNvZGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTczMzYiPjE1NzMzNjwvYT4KLWJ1aWxkIG91dHB1dCBjb250YWlucyB1bm5lY2Vzc2FyeSBlbXB0eSBkaXJlY3RvcmllcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzAxOSI+MTU3MDE5PC9hPgotW2J1aWxkXSBpbmNyZW1lbnRhbCBidWlsZCBpbnZvbHZpbmcgYSByZXNvdXJjZSBmaWx0ZXIgZmFpbHMgdG8gcHJvZHVjZSBleHBlY3RlZCBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dCBmb2xkZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTczOCI+OTk3Mzg8L2E+Ci1bZm9ybWF0dGluZ10gZWFjaCBmb3JtYXQgc2hpZnRzIGNvZGUgaW5zaWRlICZsdDtwcmUmZ3Q7IG9uZSBzcGFjZSB0byB0aGUgcmlnaHQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjk1OTYiPjE2OTU5NjwvYT4KLWFuZXdhcnJheSBub3QgcHJvcGVydGx5IHN1cHBvcnRlZCBpbiAxLjYKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjk1NDUiPjE2OTU0NTwvYT4KLWphdmFfMV80Lmcgc2hvdWxkIGJlIHJlbW92ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg2NjUiPjE2ODY2NTwvYT4KLVsxLjZdW2NvbXBpbGVyXSBBSU9PQkUgZHVyaW5nIHN0YWNrIG1hcCBmcmFtZSBnZW5lcmF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNTUwIj4xNjA1NTA8L2E+Ci1JbmZpbml0ZSBidWlsZCB3aGVuIHByb2plY3RzIGhhdmUgY3ljbGUgYW5kIGJ1aWxkIHBhdGggZXJyb3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzQ5Ij4xMTQzNDk8L2E+Ci1bY29tcGlsZXJdIFByb2JsZW1zIGJ1aWxkaW5nIGN5Y2xpY2FsIHByb2plY3RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNTQxIj4xNjE1NDE8L2E+Ci1bY29tcGlsZXJdWzEuNV0gZWNsaXBzZSBmYWlscyB0byBjb21waWxlIHdoZW4gdHdvIG1ldGhvZHMgYXJlIGpvaW5lZCB0byBvbmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY5NzciPjE2Njk3NzwvYT4KLVt2aXN0YV0gVW5leHBlY3RlZCBlcnJvcnMgd2hpbGUgcnVubmluZyBKRFQvQ29yZSB0ZXN0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODY3MSI+MTY4NjcxPC9hPgotW21vZGVsXSBNb2RlbCB0ZXN0cyBzaG91bGQgbm90IHJ1biByZWFkLW9ubHkgdGVzdHMgd2hlbiBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGl0Ci0KLTxhIG5hbWU9InZfNzI5Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM001IC0gMTl0aCBEZWNlbWJlciAyMDA2Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyOQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjkiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg2MTAiPjE2ODYxMDwvYT4KLUNoa3BpaSBlcnJvciBpbiBidWlsZCBJMjAwNjEyMTgtMDgwMAotCi08YSBuYW1lPSJ2XzcyOCI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNSAtIDE5dGggRGVjZW1iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjgKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzI4Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NzQzIj4xNjc3NDM8L2E+Ci1bc2VhcmNoXSBPcGVuIFR5cGUgRGlhbG9nIGNhbm5vdCBmaW5kIHR5cGVzIGZyb20gcHJvamVjdHMgbWlncmF0ZWQgZnJvbSAzLjIuMSB3b3Jrc3BhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjgwODgiPjE2ODA4ODwvYT4KLVNvdXJjZVR5cGVDb252ZXJ0ZXIgTlBFIGluIGxvZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDc3MyI+MTYwNzczPC9hPgotW2pzcjI2OV0gTmVlZCBpbnRlcmZhY2VzIGJldHdlZW4gamR0IGNvbXBpbGVyIGFuZCBqc3IyNjkgaW1wbAotCi0KLTxhIG5hbWU9InZfNzI3Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM000IC0gOXRoIERlY2VtYmVyIDIwMDYgLSAzLjMgTUlMRVNUT05FIDQKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzI3Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyNyI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotICA8bGk+SU1hcmtlci1zIGdlbmVyYXRlZCBieSBKRFQgYW5kIGNvbXBpbGVyIHBhcnRpY2lwYW50cyBtYXkgbm93IGhhdmUgdGhlaXIKLSAgICAgIElNYXJrZXIjR0VORVJBVEVEX0JZIGF0dHJpYnV0ZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gICAgICA8dWw+Ci0gICAgICAgIDxsaT5JTWFya2VyLXMgZ2VuZXJhdGVkIGJ5IEpEVCBnZXQgSmF2YUJ1aWxkZXIjR0VORVJBVEVEX0JZLCBjdXJyZW50bHkKLSAgICAgICAgICAgIHZhbHVlZCB0byBKRFQsIGFzIHRoZWlyIEdFTkVSQVRFRF9CWSBhdHRyaWJ1dGU7IDxlbT50aGF0IHZhbHVlIGlzCi0gICAgICAgICAgICBub24gQVBJIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlczwvZW0+OzwvbGk+Ci0gICAgICAgIDxsaT5JTWFya2VyLXMgb3JpZ2luYXRpbmcgZnJvbSBjb21waWxlciBwYXJ0aWNpcGFudHMnIGNhdGVnb3JpemVkCi0gICAgICAgICAgICBwcm9ibGVtcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgSU1hcmtlciNHRU5FUkFURURfQlkgZXh0cmEgYXR0cmlidXRlCi0gICAgICAgICAgICBzZXQgZG8gbm90IGhhdmUgdGhlaXIgR0VORVJBVEVEX0JZIGF0dHJpYnV0ZSBzZXQ7PC9saT4KLSAgICAgICAgPGxpPklNYXJrZXItcyBvcmlnaW5hdGluZyBmcm9tIGNvbXBpbGVyIHBhcnRpY2lwYW50cycgY2F0ZWdvcml6ZWQKLSAgICAgICAgICAgIHByb2JsZW1zIHdoaWNoIGhhdmUgdGhlIElNYXJrZXIjR0VORVJBVEVEX0JZIHNldCB0byBhIGdpdmVuIHZhbHVlCi0gICAgICAgICAgICBnZXQgdGhlaXIgR0VORVJBVEVEX0JZIGF0dHJpYnV0ZSBzZXQgdG8gdGhlIHNhaWQgdmFsdWUuPC9saT4KLSAgICAgIDwvdWw+Ci0gICAgICBTZWUgYWxzbyBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NjExIj4xNTg2MTE8L2E+LgotICA8L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjcyMTciPjE2NzIxNzwvYT4KLVsxLjVdW2NvbXBpbGVyXSBDbGFzc0Nhc3RFeGNlcHRpb24gZHVyaW5nIGFubm90YXRpb24gY29kZSBnZW5lcmF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTAwIj4xNjU5MDA8L2E+Ci1bc2VsZWN0XSBJbmNvaGVyZW50IGJlaGF2aW9yIHdoZW4gdGhlcmUgaXMgYW1iaWd1b3VzIG1ldGhvZHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY1NzAiPjE2NjU3MDwvYT4KLVthc3Npc3RdIFByb3Bvc2FsIGNvbXB1dGVyIGZyb20gdGhlICdvcmcuZWNsaXBzZS5teWxhci5qYXZhJyBwbHVnLWluIGRpZCBub3QgY29tcGxldGUgbm9ybWFsbHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg2MTEiPjE1ODYxMTwvYT4KLVNldCAnZ2VuZXJhdGVkQnknIGF0dHJpYnV0ZSBvZiBJTWFya2VyIGFueXdoZXJlIG1hcmtlcnMgYXJlIGdlbmVyYXRlZCBpbiBKRFQvQ29yZSBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2MzQ4Ij4xNjYzNDg8L2E+Ci1bc2VhcmNoXSBTdGFjayB0cmFjZSBjb25zb2xlIHJlc29sdmVzIHdyb25nIHNvdXJjZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDc5MiI+MTY0NzkyPC9hPgotQ29kZUFzc2lzdCBzaG91bGQgdHJlYXQgI2Nsb25lKCkgc3BlY2lhbCBpbiAxLjUgbW9kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDExMSI+MTU0MTExPC9hPgotQ29tcGlsZXIgQVBJIChKU1IgMTk5KQotCi08YSBuYW1lPSJ2XzcyNiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNCAtIDV0aCBEZWNlbWJlciAyMDA2Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyNgotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjYiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY2NDEiPjE2NjY0MTwvYT4KLVtjb21waWxlcl0gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBub3QgcmVwb3J0ZWQgaW4gaWYgKGZhbHNlKSBibG9jawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDE5MSI+MTQwMTkxPC9hPgotTlBFIGluIENsYXNzRmlsZVJlYWRlci5nZXRTb3VyY2VOYW1lIGxvZ3MgZnVsbCBDVSBzb3VyY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY0MzYiPjE2NjQzNjwvYT4KLVtqYXZhZG9jXSBQb3RlbnRpYWxseSB3cm9uZyBqYXZhZG9jIHdhcm5pbmcgZm9yIHVuZXhwZWN0ZWQgZHVwbGljYXRlIHRhZyBAdmFsdWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjYzNjUiPjE2NjM2NTwvYT4KLVtqYXZhZG9jXSBzZXZlcml0eSBsZXZlbCBvZiBtYWxmb3JtZWQgamF2YWRvYyBjb21tZW50cyBkaWQgbm90IHdvcmsgcHJvcGVybHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjYwNzciPjE2NjA3NzwvYT4KLVtjb21waWxlcl0gZXh0cmFuZW91cyB0ZXN0cyBpbiBTY29wZSNmaW5kRXhhY3RNZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjU5NzYiPjE2NTk3NjwvYT4KLUVDSiBBbnQgYWRhcHRlciBkb2Vzbid0IGFsbG93IHNldHRpbmcgZW1wdHkgYm9vdGNsYXNzcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjIwNSI+MTQyMjA1PC9hPgotW2JhdGNoXVtvcHRpb25zXSAtZGVwcmVjYXRpb24gb3B0aW9uIGlzIG5vdCBvbiBieSBkZWZhdWx0LCB3aGVyZWFzIHRoZSBoZWxwIG1lc3NhZ2Ugc2F5cyBzbwotCi08YSBuYW1lPSJ2XzcyNSI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNNCAtIDI4dGggTm92ZW1iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjUKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzI1Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+QWRkZWQgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjVkVSU0lPTl8xXzc8L2NvZGU+LiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGNvbXBsaWFuY2UsIHRoZSBzb3VyY2Ugb3IgdGhlCi10YXJnZXQgcGxhdGZvcm0gdmFsdWVzLiBUaGlzIGhhcyBubyBpbXBhY3QgcmlnaHQgbm93IGJlc2lkZSBzZXR0aW5nIHRoZSBtYWpvciB2ZXJzaW9uIGluc2lkZSAuY2xhc3MgZmlsZSB0bwotPGNvZGU+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50cyNNQUpPUl9WRVJTSU9OXzFfNzwvY29kZT4uPC9saT4KLTxsaT5BZGRlZCBuZXcgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI3NldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKTwvY29kZT4gdG8gc2V0IHRoZSBjb21waWxlcidzCi1vcHRpb25zIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gY29tcGlsZXIncyBjb21wbGlhbmNlLjwvbGk+Ci08bGk+VHVuZWQgY29tcGlsZXIgc2VtYW50aWNzIGZvciB1bmNoZWNrZWQgY2FzdCBkZXRlY3Rpb24uIEFzIGEgY29uc2VxdWVuY2UsIG1vcmUgd2FybmluZ3Mgc2hvdWxkIGJlIGlzc3VlZAotKGFsc28gc2VlIGJ1Z3MgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NDUxIj4xMDY0NTE8L2E+IGFuZAotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1MTQzIj4xNjUxNDM8L2E+KS4gPC9saT4KLTxsaT5SYXcgdHlwZSB3YXJuaW5ncyBhcmUgbm93IGFsc28gZGlhZ25vc2VkIGZvciBjYXN0IHR5cGVzLiA8L2xpPgotPGxpPkltcHJvdmVkIGNvbXBpbGVyIGRpYWdub3NpcyBmb3IgdHlwZSBoaWRpbmcgdG8gbm93IHJlcG9ydDogbWVtYmVyIHR5cGUgaGlkaW5nIHR5cGUgcGFyYW1ldGVycywKLW5lc3RlZCB0eXBlcyBoaWRpbmcgb3RoZXIgYWNjZXNzaWJsZSB0eXBlcyBpbiBzY29wZSAoZGlyZWN0IGVuY2xvc2luZyBhcmUgYWxyZWFkeSByZXBvcnRlZCBhcyBlcnJvcnMpLiA8L2xpPgotPGxpPkNvbXBpbGVyIGlzIG5vdyBtb3JlIHJlc2lsaWVudCB3aXRoIGR1cGxpY2F0ZSBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uczsgdGh1cyBhbGxvd2luZyBmdXJ0aGVyCi1vcGVyYXRpb24gdG8gc3RpbGwgYmUgY2FycmllZCBvdXQgYWNjdXJhdGVseSAoY29kZXNlbGVjdCwgY29tcGxldGlvbiwgc2VhcmNoLCBET00gQVNUIG9wcykKLShjZi4gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTY2MiI+MTY1NjYyPC9hPikuPC9saT4KLTxsaT5OZXcgSmF2YSBNb2RlbCBlbGVtZW50IGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBjb21tb24gc3VwZXJ0eXBlIGZvciA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBhbmQgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT4KLShzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUwNCI+MTI1NTA0PC9hPikuCi08cHJlPgotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGVudGlyZSBKYXZhIHR5cGUgcm9vdCAoZWl0aGVyIGFuIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+Ci0gKiBvciBhbiA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPikuCi0gKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKgotICogQHNlZSBJQ29tcGlsYXRpb25Vbml0Ci0gKiBAc2VlIElDbGFzc0ZpbGUKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBJVHlwZVJvb3QgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElQYXJlbnQsIElPcGVuYWJsZSwgSVNvdXJjZVJlZmVyZW5jZSwgSUNvZGVBc3Npc3QgewotLi4uCi19Ci08L3ByZT4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTkxNyI+MTY1OTE3PC9hPgotRXJyb3IgcmFuZ2UgZm9yIElQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGUgc2hvdWxkIGJlIHByZWRpY3RhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjIwIj4xNjU2MjA8L2E+Ci1SZWdyZXNzaW9uIGluIDMuM00zIHdpdGggZ2VuZXJpY3MgLSBhbWJpZ3VvdXMgbWV0aG9kLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzM3MCI+MTYzMzcwPC9hPgotWzEuNV1bY29tcGlsZXJdIEluY29ycmVjdCBhbWJpZ3VvdXMgbWV0aG9kIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1Nzk0Ij4xNjU3OTQ8L2E+Ci1bamF2YWRvY10gU2hvdWxkIG5vdCByZXBvcnQgYW1iaWd1b3VzIG9uIG1ldGhvZCB3aXRoIHBhcmFtZXRlcml6ZWQgdHlwZXMgYXMgcGFyYW1ldGVycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTcwMSI+MTY1NzAxPC9hPgotW21vZGVsXSBOUEUgd2hpbGUgY29tcHV0aW5nIG1ldGhvZCB1bmlxdWUga2V5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjE5Ij4xNDIyMTk8L2E+Ci1bYmF0Y2hdW29wdGlvbnNdIGluY29uc2lzdGVudCBoZWxwIG1lc3NhZ2U6IC1YJmx0O29wdGlvbiZndDsgdnMgLVhlbWFjcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDUyMCI+MTYwNTIwPC9hPgotW2NvbXBpbGVyXSBTaG91bGQgYmV0dGVyIGxvY2F0ZSBvdmVycmlkaW5nIHJldHVybiB0eXBlIGNvbmZsaWN0IG9udG8gcmV0dXJuIHR5cGUgcmVmZXJlbmNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NTA0Ij4xMjU1MDQ8L2E+Ci1bQVBJXSBjb21tb24gc3VwZXJ0eXBlIGZvciBJQ29tcGlsYXRpb25Vbml0IGFuZCBJQ2xhc3NGaWxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NTI1Ij4xNjU1MjU8L2E+Ci1bY29tbWVudHNdIEFTVFBhcnNlciBleGNsdWRlcyB0cmFpbGluZyBsaW5lIGNvbW1lbnRzIGZyb20gZXh0ZW5kZWQgcmFuZ2Ugb2YgZmllbGRzIGluIGVudW1zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjU0Ij4xNjU2NTQ8L2E+Ci1bYXN0IHJld3JpdGVdIGFkZCBmaW5hbCB0byBwYXJhbWV0ZXIgZG9lcyBub3Qgd29yayB3aXRoIGFubm90YXRpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxOTgwIj4xNjE5ODA8L2E+Ci1NYWtlIHNvbWUgbWVtYmVyIGNsYXNzIHN0YXRpYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk3NSI+MTYxOTc1PC9hPgotU2hvdWxkIGZhY3Rvcml6ZWQgYWxsIGVtcHR5IHN0cmluZ3MgY29uc3RhbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNjgwIj4xNjM2ODA8L2E+Ci1bMS41XSBbY29tcGlsZXJdIEpEVCBJbnRlcm5hbCBFeGNlcHRpb24gdW5kZXIgaW1wb3J0IGNpcmN1bGFyaXR5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjQ1Ij4xNjU2NDU8L2E+Ci1bMS41XVtjb21waWxlcl0gTWVtYmVyIHR5cGUgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVuY2xvc2luZyB0eXBlIHBhcmFtZXRlcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjU2NjIiPjE2NTY2MjwvYT4KLVtjb21waWxlcl0gQmUgbW9yZSByZXNpbGllbnQgd2l0aCBkdXBsaWNhdGUgbG9jYWwgdHlwZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE2MTciPjE2MTYxNzwvYT4KLVthc3QgcmV3cml0ZV0gcmVwbGFjaW5nIEluc3RhbmNlb2ZFeHByZXNzaW9uLkxFRlRfT1BFUkFORF9QUk9QRVJUWSBzaG91bGQgZW5zdXJlIHdoaXRlc3BhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUyOTEiPjE2NTI5MTwvYT4KLVsxLjVdIE1pc3NpbmcgZGlhZ25vc2lzIGZvciBpbGxlZ2FsIGZvcndhcmQgZmllbGQgcmVmIGluIGdlbmVyaWNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NDUzIj4xNjU0NTM8L2E+Ci1bMS41XVtjb21waWxlcl0gSW1wcm92ZSB1bmNoZWNrZWQgY2FzdCBtZXNzYWdlIGluIGNvbXBpbGVyJ3Mgd2FybmluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTE0NSI+MTY1MTQ1PC9hPgotWzEuNV1bY29tcGlsZXJdIE1pc3NpbmcgcmF3IHR5cGUgd2FybmluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjQ1MSI+MTA2NDUxPC9hPgotWzEuNV1bY29tcGlsZXJdIEVycm9yIGFuZCB1bmNoZWNrZWQgd2FybmluZ3MgbWlzc2luZyBmb3IgY2FzdCB0byBwYXJhbWV0ZXJpemVkIHR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUxNDMiPjE2NTE0MzwvYT4KLVsxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIHVuY2hlY2tlZCBjYXN0IHdhcm5pbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUzNDYiPjE2NTM0NjwvYT4KLVtjb21waWxlcl1bbnVsbF0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvckV4cHJlc3Npb24ubnVsbFN0YXR1cyhGbG93SW5mbykgdG9vIGNvbnNlcnZhdGl2ZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTExOCI+MTQ5MTE4PC9hPgotW2JhdGNoXSBzaG9ydGVuIHRoZSBlcnJvciBtZXNzYWdlIGluIGNhc2UgYSAuamF2YSBkaXJlY3RvcnkgaXMgdXNlZCBhcyBhIHBhcmFtZXRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjMzOSI+MTU2MzM5PC9hPgotQWJvcnQgY29tcGlsYXRpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGUgVUkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ2NTciPjE2NDY1NzwvYT4KLVtjb21waWxlcl0gV3JvbmcgbGluZSBpcyBzaG93ZWQgZHVyaW5nIGRlYnVnCi0KLTxhIG5hbWU9InZfNzI0Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM000IC0gMjFzdCBOb3ZlbWJlciAyMDA2Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyNAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjQiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5BZGRlZCA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0JMQU5LX0xJTkVTX0JFVFdFRU5fSU1QT1JUX0dST1VQUzwvY29kZT4uIFNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0OTQ2Ij4xNjUyMTA8L2E+IGZvciBkZXRhaWxzLjwvbGk+Ci08bGk+QWRkZWQgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9JTl9USFJPVzwvY29kZT4uIFNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0OTQ2Ij4xNjQ5NDY8L2E+IGZvciBkZXRhaWxzLjwvbGk+Ci08bGk+amF2YWRvYyBjaGVja2VyIG5vdyBjb3JyZWN0bHkgYWxsb3cgdXNhZ2Ugb2Yge0B2YWx1ZX0gdGFncyBvbmx5IG9uIGZpZWxkIGRlY2xhcmF0aW9uIHdoZW4gc291cmNlIGxldmVsIGlzIGxlc3MgdGhhbiAxLjUKLShzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzM5OSI+MTUzMzk5PC9hPikuCi08L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ3MDciPjE2NDcwNzwvYT4KLUFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBKYXZhTW9kZWxNYW5hZ2VyIGlmIHNvdXJjZSBsZXZlbCA9PSA2LjAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUyMTAiPjE2NTIxMDwvYT4KLUZ1cCBvZiBidWcgNzQ5OTcsIGFkZCBuZXcgZm9ybWF0dGVyIG9wdGlvbiBmb3IgbnVtYmVyIG9mIGJsYW5rIGxpbmVzIGJldHdlZW4gaW1wb3J0IGdyb3VwcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTA2OSI+MTY1MDY5PC9hPgotWzEuNV1bY29tcGlsZXJdIGluY29ycmVjdCBmaWVsZCBoaWRpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUwODEiPjE2NTA4MTwvYT4KLVsxLjVdW2NvbXBpbGVyXSBGdXAgb2YgYnVnIDE2NTA2OSwgdW51c2VkIGltcG9ydHMgYXJlIG5vdCByZXBvcnRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDk5MyI+MTU0OTkzPC9hPgotb3JnLmVjbGlwc2UuamR0LnVpLkphdmFOb1R5cGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB0aHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiB3aGVuIHVzaW5nIGNvbnRlbnQgYXNzaXN0IG9uICd0aGlzLicgaW4gYW5ub250YXRpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NjIxIj4xMzk2MjE8L2E+Ci1bamF2YWRvY11bYXNzaXN0XSBObyBKYXZhZG9jIGNvbXBsZXRpb25zIGlmIHRoZXJlJ3Mgbm8gbWVtYmVyIGJlbG93Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0OTQ2Ij4xNjQ5NDY8L2E+Ci1TcGFjZXMgaW4gY29udHJvbCBzdGF0ZW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzODA3Ij4xNjM4MDc8L2E+Ci1KRFQgZmFpbHMgdG8gY29tcGlsZSBsZWdhbCBKYXZhIHNvdXJjZSBmaWxlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzM5OSI+MTUzMzk5PC9hPgotW2phdmFkb2NdIEpEVCBDb3JlIHNob3VsZCB3YXJuIGlmIHRoZSBAdmFsdWUgdGFnIGlzIG5vdCB1c2VkIGNvcnJlY3RseQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0MDQ5Ij44NDA0OTwvYT4KLVtqYXZhZG9jXVtkb21dIEV4dGVuZGVkIHJhbmdlcyB3cm9uZyBmb3IgbWV0aG9kIG5hbWUgd2l0aG91dCByZXR1cm4gdHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDc5MSI+MTY0NzkxPC9hPgotW3NlYXJjaF0gVHlwZSByZWZlcmVuY2UgcmVwb3J0cyBhbm9ueW1vdXMgdHlwZSBpbiBpbnZhbGlkIGNsYXNzIGZpbGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ0NTAiPjE2NDQ1MDwvYT4KLVtjb21tZW50c10gRGVmYXVsdENvbW1lbnRNYXBwZXIgc2hvdWxkIHJlbGVhc2Ugc2Nhbm5lciBhZnRlciB1c2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM5ODQiPjE2Mzk4NDwvYT4KLVtzZWFyY2hdIG5vIHJlc3VsdHMgZnJvbSBTZWFyY2hFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzIHdpdGggdHlwZXMgaW4gc2NvcGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDk5NyI+NzQ5OTc8L2E+Ci1pbXBvcnQgcmV3cml0ZTogbm8gZW1wdHkgbGluZSBiZXR3ZWVuIGdyb3VwcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDMxMSI+MTY0MzExPC9hPgotQ29kZSBjb21wbGV0aW9uIHVuYXZhaWxhYmxlIGZvciBzdGF0aWMgbWV0aG9kcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjM1MiI+MTU2MzUyPC9hPgotTlBFIHdoZW4gYWNjZXNzaW5nIGFubm90YXRpb25zIGZyb20gSVR5cGVCaW5kaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk5MjgiPjk5OTI4PC9hPgotQ29udGVudEFzc2lzdCBzaG91bGQgcHJvcG9zZSBtZXRob2RzIG9mIGludGVyc2VjdGlvbiB0eXBlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzU3MCI+MTU3NTcwPC9hPgotQnVnIGluIEFTVFBhcnNlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDY1NiI+MTY0NjU2PC9hPgotSVNjYW5uZXIuc2V0U291cmNlIHNob3VsZCBzcGVjIHRoYXQgJ251bGwnIGlzIGFsbG93ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjA2MzciPjE2MDYzNzwvYT4KLWdldEtleSguLi4pIGZvciBCaW5hcnlNZXRob2QgcmV0dXJucyBhIGtleSB3aXRoICcuJyBpbiB0aGUgcmV0dXJuIHR5cGUgaW5zdGVhZCBvZiAnLycKLTxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwNzcxIj4xMTA3NzE8L2E+Ci1hbGlnbiBhbGwgSUNvbXBpbGF0aW9uVW5pdCNnZXRDb250ZW50cyBpbXBsZW1lbnRhdGlvbnMgb24gYSAnbmV2ZXIgbnVsbCcgYmVoYXZpb3IKLQotPGEgbmFtZT0idl83MjMiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTQgLSAxNHRoIE5vdmVtYmVyIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzIzCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyMyI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPmphdmFkb2MgY2hlY2tlciBkaWQgaW5jb3JyZWN0bHkgYWxsb3cgY29tcGF0aWJsZSBtYXRjaGVzIGZvciBtZXRob2QgcmVmZXJlbmNlczsgd2hlcmUgb25seSBleGFjdCBtYXRjaGVzIGFyZSBtYW5kYXRlZAotKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNjU5Ij4xNjM2NTk8L2E+KS4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA5ODAiPjE0MDk4MDwvYT4KLVtyZWNvdmVyeV0gQ2xhc3NDYXN0RXhjZXB0aW9uIGZyb20gSkRUIGNvbXBpbGVyCi08YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjkxOCI+MTYyOTE4PC9hPgotW2NvbXBpbGVyXSBJbGxlZ2FsIHVzYWdlIG9mIGEgbG9jYWwgaW5zaWRlIGEgc3dpdGNoIHN0YXRlbWVudCBpcyBub3QgcmVqZWN0ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQxMjEiPjE2NDEyMTwvYT4KLVtzZWFyY2hdIE1pc3NlcyBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kIHBhcmFtZXRlcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQwODEiPjE2NDA4MTwvYT4KLVhNTCBsb2cgY291bGQgY29udGFpbiBwYWNrYWdlIGluZm9ybWF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMzAxIj4xNjAzMDE8L2E+Ci1bc2VhcmNoXSB0b28gbWFueSBtYXRjaGVzIGZvdW5kIGZvciBtZXRob2QgcmVmZXJlbmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzY1OSI+MTYzNjU5PC9hPgotW2phdmFkb2NdIENvbXBpbGVyIHNob3VsZCB3YXJuIHdoZW4gbWV0aG9kIHBhcmFtZXRlcnMgYXJlIG5vdCBpZGVudGljYWwKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQwOTIiPjE2NDA5MjwvYT4KLVttb2RlbF0gUG9zc2libGUgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQnVmZmVyLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDA5MSI+MTY0MDkxPC9hPgotW21vZGVsXSBQb3NzaWJsZSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBKYXZhUHJvamVjdEVsZW1lbnRJbmZvLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTkzOSI+MTU5OTM5PC9hPgotWzEuNV1bY29tcGlsZXJdIEVjbGlwc2UgYWxsb3dzIExpc3QmbHQ7dm9pZFtdJmd0OywgamF2YWMgZG9lc24ndAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjYyMSI+MTYyNjIxPC9hPgotW21vZGVsXVtkZWx0YV0gVmFsaWRhdGlvbiBlcnJvcnMgZG8gbm90IGNsZWFyIGFmdGVyIHJlcGxhY2luZyBqYXIgZmlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mzc4MiI+MTYzNzgyPC9hPgotUG9zc2libGUgcmVzb3VyY2UgbGVha3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIwMjYiPjE2MjAyNjwvYT4KLVsxLjVdW2NvbXBpbGVyXSBFcnJvbmVvdXMgUmVwb3J0IG9mIGFuIEFtYmlndW91cyBNZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM2MDAiPjE2MzYwMDwvYT4KLVtjb21waWxlcl0gSW50ZXJuYWwgcmVmZXJlbmNlcyB0byBzdGF0aWMgaW5uZXIgY2xhc3NlcyBmYWlsIGluIHByZXNlbmNlIG9mIGFzc2VydCBrZXl3b3JkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDA0Ij4xNDkwMDQ8L2E+Ci1zdGF0aWMgZmllbGRzIGZyb20gcGFja2FnZSBjbGFzc2VzIHdyb25nIHF1aWNrLWZpeCdlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTQ3NiI+MTAxNDc2PC9hPgotJnF1b3Q7U2VyaWFsaXphYmxlIGNsYXNzIHdpdGhvdXQgc2VyaWFsVmVyc2lvblVJRCZxdW90OyBzZXR0aW5nIGFuZCB3cml0ZVJlcGxhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM2NDciPjE2MzY0NzwvYT4KLVttb2RlbF0gVGhyb3duIGV4Y2VwdGlvbnMgYXJlIG5vdCBmb3VuZCBpbiBtZXRob2QgYmluZGluZyBrZXkgd2hpY2ggaGF2ZSBhIGNhcHR1cmUgYXMgZGVjbGFyaW5nIGNsYXNzCi0KLTxhIG5hbWU9InZfNzIyIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM000IC0gN3RoIE5vdmVtYmVyIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzIyCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyMiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPjxjb2RlPkphdmFDb252ZW50aW9uczwvY29kZT4gY2FuIG5vdyB2YWxpZGF0ZSBuYW1lcyB1c2luZyBzcGVjaWZpYyBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLiBOZXcgPGNvZGU+dmFsaWRhdGUqTmFtZTwvY29kZT4gQVBJIG1ldGhvZHMKLXdpdGggdGhlIHNvdXJjZSBhbmQgdGhlIGNvbXBsaWFuY2UgbGV2ZWwgYXMgZ2l2ZW4gcGFyYW1ldGVycyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBjbGFzcy4gQ2xpZW50cyBzaG91bGQgbm93IHVzZSB0aGVzZSBuZXcgbWV0aG9kcyBpbnN0ZWFkCi1vZiBkZXByZWNhdGVkIG9uZXMgd2hpY2ggb25seSB2ZXJpZnkgbmFtZXMgdXNpbmcgdGhlIDEuMyBkZWZhdWx0IGxldmVsLgotPC9saT4KLTxsaT5BZGRlZCBuZXcgQVBJIG1ldGhvZCBvbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5CaW5kaW5nS2V5PC9jb2RlPiBjbGFzcyB0byBnZXQgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IGEgbWV0aG9kCi0oc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwMDMiPjE1NTAwMzwvYT4pOgotPHByZT4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aHJvd24gZXhjZXB0aW9uIHNpZ25hdHVyZXMgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nIGtleS4KLQkgKiBJZiB0aGlzIGJpbmRpbmcga2V5IGRvZXMgbm90ICByZXByZXNlbnQgYSBtZXRob2Qgb3IgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbiwKLQkgKiByZXR1cm5zIGFuIGVtcHR5IGFycmF5LgotCSAqCi0JICogQHJldHVybiB0aGUgdGhyb3duIGV4Y2VwdGlvbnMgc2lnbmF0dXJlcwotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGhyb3duRXhjZXB0aW9ucygpCi08L3ByZT4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjkwMyI+MTYyOTAzPC9hPgotU3VwcHJlc3NXYXJuaW5ncyBhbmQgTk9OLU5MUydkIHN0cmluZ3MgYXMgZXJyb3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNDAwIj4xNjE0MDA8L2E+Ci1TY2FubmluZyBvZiBpZGVudGlmaWVycyBzaG91bGQgYmUgb3B0aW1pemVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzMzQ5Ij4xNjMzNDk8L2E+Ci1bYXNzaXN0XSBjb2RlIGFzc2lzdCBkb2Vzbid0IGNvcnJlY3RseSB1c2Ugc2Nhbm5lciBlb2ZQb3NpdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk2OCI+MTYyOTY4PC9hPgotQ29udGVudCBBc3Npc3QgZm9yIHVuZGVjbGFyZWQgbG9jYWwgdmFyaWFibGUgc2hvdWxkIHByaW9yaXRpemUgdW5ib3VuZCBuYW1lcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzU0OSI+MTYzNTQ5PC9hPgotRXhjbHVkZSBKRFQgYW50IHRhc2tzIGZyb20gc2lnbmluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzA3MiI+MTYzMDcyPC9hPgotW3NlYXJjaF0gbWV0aG9kIHJlZmVyZW5jZSByZXBvcnRzIHdyb25nIHBvdGVudGlhbCBtYXRjaGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDAzIj4xNTUwMDM8L2E+Ci1bbW9kZWxdIE1pc3NpbmcgZXhjZXB0aW9uIHR5cGVzIC8gd3Jvbmcgc2lnbmF0dXJlPwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTYyMSI+MTYxNjIxPC9hPgotZW51bSBpcyBhIEtleXdvcmQgZm9yIEphdmE1IGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIEVudW0gbmFtZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjc0MyI+MTYyNzQzPC9hPgotRHVwbGljYXRlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGNvZGUgYXNzaXN0IHByb3Bvc2FscwotCi08YSBuYW1lPSJ2XzcyMSI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMyAtIDMwdGggT2N0b2JlciAyMDA2IC0gMy4zIE1JTEVTVE9ORSAzCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyMQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjEiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5SZW1vdmVkIGZpeCBmb3IgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTI4OSI+MTQxMjg5PC9hPjwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLQotPGEgbmFtZT0idl83MjAiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTMgLSAzMHRoIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjAKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzIwIj5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MDQxIj4xNDgwNDE8L2E+Ci1bY29tcGlsZXJdWzEuNV0gc2hvdWxkIGlzc3VlIHVuY2hlY2tlZCB3YXJuaW5nIG9uIGNhc3QgdG8gU2V0Jmx0O1gmZ3Q7IG9mIEl0ZXJhdG9yI25leHQgKCkgcmV0dXJuaW5nIFgKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk2MzEiPjE1OTYzMTwvYT4KLVtkb21dIE5QRSB3aGlsZSB0cnlpbmcgdG8gY2xlYW51cCBzcGVjaWZpYyBwYWlyIG9mIGZpbGUKLQotPGEgbmFtZT0idl83MTkiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTMgLSAyOXRoIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTkKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE5Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxODQ2Ij4xNjE4NDY8L2E+Ci1FeHBhbmRpbmcgYSBqYXZhIHByb2plY3Qgd2l0aCBpbnZhbGlkIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcyBpbiBQcm9qZWN0IEV4cGxvcmVyIGNhdXNlcyBDUFUgdG8gc3RheSBhdCAxMDAlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NzM4Ij4xNTk3Mzg8L2E+Ci1bMS41XVtjb21waWxlcl0gTWlzc2luZyBjbGFzcyBjYXN0cyBpbiBnZW5lcmF0ZWQgYnl0ZSBjb2RlIGZvciBnZW5lcmljIG1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjI5NiI+MTYyMjk2PC9hPgotW2NvbXBpbGVyXSBBbm9ueW1vdXMgYW5kIGxvY2FsIGNsYXNzZXMgYXJlIHRhZ2dlZCBhcyBmaW5hbCBhbmQvb3IgcHJpdmF0ZSBpbiB0aGUgaW5uZXIgY2xhc3MgaW5mb3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIzOTAiPjE2MjM5MDwvYT4KLUphdmFDb2RlRm9ybWF0dGVyIEFubm90YXRpb24gQnVnCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNDAwIj4xNjI0MDA8L2E+Ci1bMS41XVtjb21waWxlcl0gUmV0dXJuIHR5cGUgaW5mZXJlbmNlIGRvZXMgbm90IHBlcmZvcm0gd2VsbCBpbiBhcnJheSBpbml0aWFsaXplcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTg5MyI+MTU5ODkzPC9hPgotW2NvbXBpbGVyXSBDb21waWxhdGlvbiBFcnJvciB3aXRoIG5lc3RlZCBjbGFzc2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMDU2Ij4xNjIwNTY8L2E+Ci1bcmVjb3ZlcnldIENvbmZ1c2luZyBlcnJvcnMgaW4gZWRpdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0ODExIj4xNTQ4MTE8L2E+Ci1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yIHdoaWxlIHBhcnNpbmcvZm9ybWF0dGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDgyMyI+MTYwODIzPC9hPgotW2Zvcm1hdHRlcl0gSmF2YSBDb252ZW50aW9ucyBbYnVpbHQtaW5dIGluc2VydHMgYmxhbmsgbGluZSBiZXR3ZWVuIGZpZWxkIGRlY2xhcmF0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTQxMiI+MTYxNDEyPC9hPgotb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTmFtZWRNZW1iZXIjZ2V0RnVsbHlRdWFsaWZpZWRQYXJhbWV0ZXJpemVkTmFtZSBwcm9iYWJseSBib2dndXMKLQotPGEgbmFtZT0idl83MTgiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTMgLSAyNHRoIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTgKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE4Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+TmV3IGNvbXBpbGVyIHdhcm5pbmcgdG8gZGV0ZWN0IG92ZXJyaWRpbmcgb2YgYSBtZXRob2Qgd2l0aG91dCBhIHN1cGVyIGludm9jYXRpb24gaGFzIGJlZW4gYWRkZWQuCi1TZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjczNiI+MTU2NzM2PC9hPiBmb3IgZnVydGhlciBkZXRhaWxzLjwvbGk+Ci08bGk+Q29kZSBBc3Npc3QgcHJvcG9zZSB1bnJlc29sdmVkIG5hbWVzIGFzIHBvc3NpYmxlIGxvY2FsIHZhcmlhYmxlIG5hbWU8YnI+Ci08cHJlPgotaW50IGYmbHQ7Y29kZSBhc3Npc3QmZ3Q7Ci1TeXN0ZW0ub3V0LnByaW50KGZvbyk7Ci08L3ByZT4KLUluIHRoaXMgZXhhbXBsZSBmb28gaXMgcHJvcG9zZWQgYXMgYSBwb3NzaWJsZSBjb21wbGV0aW9uLgotPC9saT4KLTxsaT5UaGUgY29tcGlsZXIgbm93IHRvbGVyYXRlcyB0aGF0IG1ldGhvZHMgaW1wbGVtZW50aW5nIGEgbWV0aG9kIGRlY2xhcmVkCi0gICAgaW4gYW4gaW1wbGVtZW50ZWQgaW50ZXJmYWNlIG9yIGFuIGV4dGVuZGVkIGFic3RyYWN0IGNsYXNzIGJlYXIgYW4gQE92ZXJyaWRlCi0gICAgYW5ub3RhdGlvbiAoMS42IG1vZGUgb25seSAtIHNlZSBhbHNvIGJ1ZwotICAgIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTkzMSI+MTQxOTMxPC9hPikuPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxOTY3Ij4xNjE5Njc8L2E+Ci1NYXAua2V5U2V0KCkgY2FuIGJlIHJlcGxhY2VkIHdpdGggTWFwLmVudHJ5U2V0KCkgd2hlbiB2YWx1ZSBpcyB1c2VkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMjE0Ij4xNjEyMTQ8L2E+Ci1bY29tcGlsZXJdIEZ1cCBvbiBidWcgMTU5NzA5OiBpbXByb3ZlIGRlcHJlY2F0aW9uIG1hcmtzIHByb3BhZ2F0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNTgxIj4xNjE1ODE8L2E+Ci1BZGRpbmcgYSBtaXNzaW5nIGZvbGRlciBkb2Vzbid0IHJlbW92ZSBjbGFzc3BhdGggbWFya2VyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3OTk2Ij4xNTc5OTY8L2E+Ci1bY29tcGlsZXJdIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIG1pc3NpbmcgYSBjbG9zZXN0TWF0Y2gKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMzciPjE2MDMzNzwvYT4KLUVtcHR5IGJsb2NrIG5vdCBkZXRlY3RlZCBpbnNpZGUgYW5vbnltb3VzIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNTU1Ij4xNjE1NTU8L2E+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5SZWNvbmNpbGVyVGVzdHMjdGVzdERlbGV0ZVR3b01ldGhvZHMgaXMgZmFpbGluZyBvbiBJQk0gMS41IFZNCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNTU3Ij4xNjE1NTc8L2E+Ci1bYXNzaXN0XSBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHdoZW4gdXNpbmcgY29udGVudCBhc3Npc3Qgb24gZ2VuZXJpY3MgdHlwZSBhcmd1bWVudCB3aXRoIGluc3RhbmNlIG1lbWJlciBhcnJheXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAyMjgiPjE1MDIyODwvYT4KLUNvZGUgYXNzaXN0IGZvciB1bnJlc29sdmVkIGxvY2FsIHZhcmlhYmxlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTIwNCI+MTYxMjA0PC9hPgotY29kZSBhc3Npc3Qgd2l0aCB1bnJlc29sdmVkIHR5cGVzIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyA1LjAgcnQuamFyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNTU0Ij4xNjE1NTQ8L2E+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uLkdlbmVyaWNUeXBlVGVzdCN0ZXN0MTA1MCBmYWlscyBvbiBJQk0gSkRLIDEuNSBWTQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTkzMSI+MTQxOTMxPC9hPgotWzEuNV1bY29tcGlsZXJdIEBPdmVycmlkZTogdXBjb21pbmcgY2hhbmdlcyBvZiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNDc2Ij4xNjE0NzY8L2E+Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uLkJhdGNoQ29tcGlsZXJUZXN0LnRlc3QwMjQgcGFzc2VzIHVuZXhwZWN0ZWRseSB3aXRoIElCTSBKYXZhMiA1LjAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE0NTkiPjE2MTQ1OTwvYT4KLTkgdGVzdHMgaW4gb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbiBmYWlsIG9uIElCTSBKYXZhMiA1LjAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY3MzYiPjE1NjczNjwvYT4KLVtjb21waWxlcl0gQWRkIGNvbXBpbGVyIG9wdGlvbiB0byB3YXJuIG92ZXJyaWRpbmcgbWV0aG9kcyB0aGF0IGRvIG5vdCBjYWxsIHN1cGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NzExIj4xNTk3MTE8L2E+Ci1bMS41XVtjb21waWxlcl0gd3JvbmdseSByZXBvcnRzIGFtYmlndW91cyBtZXRob2QgZXJyb3IKLQotPGEgbmFtZT0idl83MTciPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTMgLSAxN3RoIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTcKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE3Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+PGNvZGU+VHlwZU5hbWVNYXRjaDwvY29kZT4gQVBJIGhhcyBiZWVuIHBvbGlzaGVkIHdoaWxlIGltcGxlbWVudGluZyBuZXcgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzKGNoYXJbXVtdIGNoYXJbXVtdLC4uLik8L2NvZGU+Ci1BUEkgbWV0aG9kIChzZWUgbmV4dCBwb2ludCkuPGJyPgotVGhpcyBjbGFzcyBoYXMgYmVlbiBhYnN0cmFjdGVkIGFuZCBjbGllbnRzIG5vdyBuZWVkIHRvIHVzZSBhZGRlZCA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IGZvbGxvd2luZyBtZXRob2QKLXRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpdDoKLTxwcmU+Ci0vKioKLSAqIENyZWF0ZSBhIHR5cGUgbmFtZSBtYXRjaCBvbiBhIGdpdmVuIHR5cGUgd2l0aCBzcGVjaWZpYyBtb2RpZmllcnMuCi0gKgotICogQHBhcmFtIHR5cGUgVGhlIGphdmEgbW9kZWwgaGFuZGxlIG9mIHRoZSB0eXBlCi0gKiBAcGFyYW0gbW9kaWZpZXJzIE1vZGlmaWVycyBvZiB0aGUgdHlwZQotICogQHJldHVybiBBIG5vbi1udWxsIG1hdGNoIG9uIHRoZSBnaXZlbiB0eXBlLgotICovCi1wdWJsaWMgc3RhdGljIFR5cGVOYW1lTWF0Y2ggY3JlYXRlVHlwZU5hbWVNYXRjaChJVHlwZSB0eXBlLCBpbnQgbW9kaWZpZXJzKQotPC9wcmU+Ci1FYXJseSBwZXJmb3JtYW5jZSB0ZXN0cyB1c2luZyBhZGRlZCA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXM8L2NvZGU+IG1ldGhvZCB3aXRoIDxjb2RlPlR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3I8L2NvZGU+Ci1yZXF1ZXN0b3IgKGllLiBhIGxhIE9wZW4gVHlwZSBkaWFsb2cpIHNob3cgaW50ZXJlc3RpbmcgbWVtb3J5IGZvb3RwcmludCByZWR1Y3Rpb24gKGFyb3VuZCAzMCUpLiBNb3JlIHByZWNpc2UgbWVhc3VyZXMgb2YgdGhpcwotcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2lsbCBiZSBkb25lIGxhdGVyLi4uCi08L2xpPgotPGxpPkFkZGVkIG5ldyA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IEFQSSBtZXRob2QgZm9yIHNlYXJjaCBhbGwgdHlwZSBuYW1lcyB3aXRoIG11bHRpcGxlIHF1YWxpZmljYXRpb25zIGFuZCB0eXBlIG5hbWVzCi0oc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjQiPjE2MDMyNDwvYT4pLjxicj4KLU9ubHkgcmVxdWVzdG9yIGRpZmZlcnMgZnJvbSBhbHJlYWR5IGV4aXN0aW5nIGNvcnJlc3BvbmRpbmcgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzPC9jb2RlPiBtZXRob2Q6Ci08cHJlPgotLyoqCi0gKiBTZWFyY2hlcyBmb3IgYWxsIHRvcC1sZXZlbCB0eXBlcyBhbmQgbWVtYmVyIHR5cGVzIGluIHRoZSBnaXZlbiBzY29wZSBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIHF1YWxpZmljYXRpb25zCi0gKiBhbmQgdHlwZSBuYW1lcyBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4KLSAqCi0gKiBQcm92aWRlZCB7QGxpbmsgVHlwZU5hbWVNYXRjaFJlcXVlc3Rvcn0gcmVxdWVzdG9yIHdpbGwgY29sbGVjdCB7QGxpbmsgVHlwZU5hbWVNYXRjaH0KLSAqIG1hdGNoZXMgZm91bmQgZHVyaW5nIHRoZSBzZWFyY2guCi0uLi4KLSAqIEBwYXJhbSBuYW1lTWF0Y2hSZXF1ZXN0b3IgdGhlIHtAbGluayBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yIHJlcXVlc3Rvcn0gdGhhdCBjb2xsZWN0cwotICogCQkJCXtAbGluayBUeXBlTmFtZU1hdGNoIG1hdGNoZXN9IG9mIHRoZSBzZWFyY2guCi0uLi4KLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAotCWZpbmFsIGNoYXJbXVtdIHF1YWxpZmljYXRpb25zLAotCWZpbmFsIGNoYXJbXVtdIHR5cGVOYW1lcywKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAotCWZpbmFsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAotCWludCB3YWl0aW5nUG9saWN5LAotCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotPC9wcmU+Ci1TaW1pbGFyaWx5IHRvIHByZXZpb3VzIGFkZGVkIDxjb2RlPnNlYXJjaEFsbFR5cGVOYW1lczwvY29kZT4gbmV3IEFQSSBtZXRob2QsIGNsaWVudHMgaGF2ZSB0byBwcm92aWRlCi1hIG5ldyByZXF1ZXN0b3I6IDxjb2RlPlR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3I8L2NvZGU+IGluIG9yZGVyIHRvIGdldCBtYXRjaGVzIGNvbGxlY3RlZCBkdXJpbmcgdGhlIHNlYXJjaC48YnI+Ci08L2xpPgotPGxpPkNvZGUgQXNzaXN0IGNhbiByZXR1cm4gY29tcGxldGlvbiBwcm9wcm9zYWxzIHRoYXQgcmVxdWlyZWQgc29tZSBvdGhlciBjb21wbGV0aW9uIHByb3Bvc2Fsczo8YnI+Ci1UbyBhcHBseSBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdGhlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzIG11c3QgYmUgYXBwbGllZCBvdGhlcndpc2UgdGhlIHJlc3VsdGluZyBjb2RlIHdvbid0IGJlIGNvcnJlY3QuPGJyPgotVG8gbWFuYWdlIGNvbXBsZXRpb24gcHJvcG9zYWxzd2l0aCByZXF1aXJlZCBwcm9wb3NhbHMgdGhlIGZvbGxvd2luZyBBUEkgaGF2ZSBiZWVuIGFkZGVkOgotPHByZT4KLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWwgewotCi0JLi4uCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLQkgKiBUaGUgcHJvcG9zYWwgY2FuIGJlIGFwcGx5IG9ubHkgaWYgdGhlc2UgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMgYXJlIGFsc28gYXBwbGllZC4KLQkgKiBJZiB0aGUgcmVxdWlyZWQgcHJvcG9zYWwgYXJlbid0IGFwcGxpZWQgdGhlIGNvbXBsZXRpb24gY291bGQgY3JlYXRlIGNvbXBsYXRpb25zIHByb2JsZW1zLgotCSAqCi0JICogJmx0O3AmZ3Q7Ci0JICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKLQkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKLQkgKiAmbHQ7dWwmZ3Q7Ci0JICogCSZsdDtsaSZndDsmbHQ7Y29kZSZndDtGSUVMRF9SRUYmbHQ7L2NvZGUmZ3Q7IC0gVGhlIGFsbG93ZWQgcmVxdWlyZWQgcHJvcG9zYWxzIGZvciB0aGlzIGtpbmQgYXJlOgotCSAqICAgJmx0O3VsJmd0OwotCSAqICAgICZsdDtsaSZndDsmbHQ7Y29kZSZndDtUWVBFX1JFRiZsdDsvY29kZSZndDsmbHQ7L2xpJmd0OwotCSAqICAgJmx0Oy91bCZndDsKLQkgKiAmbHQ7L2xpJmd0OwotCSAqIAkmbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7TUVUSE9EX1JFRiZsdDsvY29kZSZndDsgLSBUaGUgYWxsb3dlZCByZXF1aXJlZCBwcm9wb3NhbHMgZm9yIHRoaXMga2luZCBhcmU6Ci0JICogICAmbHQ7dWwmZ3Q7Ci0JICogICAgJmx0O2xpJmd0OyZsdDtjb2RlJmd0O1RZUEVfUkVGJmx0Oy9jb2RlJmd0OyZsdDsvbGkmZ3Q7Ci0JICogICAmbHQ7L3VsJmd0OwotCSAqICAmbHQ7L2xpJmd0OwotCSAqICZsdDsvdWwmZ3Q7Ci0JICogJmx0Oy9wJmd0OwotCSAqICZsdDtwJmd0OwotCSAqIE90aGVyIGtpbmRzIG9mIHJlcXVpcmVkIHByb3Bvc2FscyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBmdXR1cmUsIHRoZXJlZm9yZSBjbGllbnRzIG9mIHRoaXMKLQkgKiBBUEkgbXVzdCBhbGxvdyB3aXRoIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKX0KLQkgKiBvbmx5IGtpbmRzIHdoaWNoIGFyZSBpbiB0aGlzIGxpc3QgdG8gYXZvaWQgdW5leHBlY3RlZCByZXN1bHRzIGluIHRoZSBmdXR1cmUuCi0JICogJmx0Oy9wJmd0OwotCSAqICZsdDtwJmd0OwotCSAqIEEgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbCBjYW5ub3QgaGF2ZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLQkgKiAmbHQ7L3AmZ3Q7Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscywgb3IgJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsgaWYgbm9uZS4KLQkgKgotCSAqIEBzZWUgQ29tcGxldGlvblJlcXVlc3RvciNzZXRBbGxvd3NSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCxib29sZWFuKQotCSAqCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRSZXF1aXJlZFByb3Bvc2FscygpIHsuLi59Ci0KLQkuLi4KLQotfQotPC9wcmU+Ci08cHJlPgotcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3IgewotCi0JLi4uCi0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCi0JICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZC4KLQkgKgotCSAqIEBwYXJhbSBwcm9wb3NhbEtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqIEBwYXJhbSByZXF1aXJlZFByb3Bvc2FsS2luZClvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogb24gJmx0O2NvZGUmZ3Q7Q29tcGxldGlvblByb3Bvc2FsJmx0Oy9jb2RlJmd0OwotCSAqIEByZXR1cm4gJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDsgaWYgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCi0JICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZCBieSB0aGlzIHJlcXVlc3RvciwgYW5kICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OwotCSAqIGlmIGl0IGlzbid0IG9mIGludGVyZXN0LgotCSAqICZsdDtwJmd0OwotCSAqIEJ5IGRlZmF1bHQsIGFsbCBraW5kcyBvZiByZXF1aXJlZCBwcm9wb3NhbHMgYXJlbid0IGFsbG93ZWQuCi0JICogJmx0Oy9wJmd0OwotCSAqIEBzZWUgI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQotCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldEtpbmQoKQotCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldFJlcXVpcmVkUHJvcG9zYWxzKCkKLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kKSB7Li4ufQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIGEgcHJvcG9zYWwgb2YgYSBnaXZlbiBraW5kIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbAotCSAqIG9mIHRoZSBnaXZlbiBraW5kIGlzIGFsbG93ZWQuCi0JICoKLQkgKiBDdXJyZW5sdHkgb25seSBhIHN1YnNldCBvZiBraW5kcyBzdXBwb3J0IHJlcXVpcmVkIHByb3Bvc2Fscy4gVG8gc2VlIHdoYXQgY29tYmluYXRpb25zCi0JICogYXJlIHN1cHBvcnRlZCB5b3UgbXVzdCBsb29rIGF0IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWwjZ2V0UmVxdWlyZWRQcm9wb3NhbHMoKX0KLQkgKiBkb2N1bWVudGF0aW9uLgotCSAqCi0JICogQHBhcmFtIHByb3Bvc2FsS2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogQHBhcmFtIHJlcXVpcmVkUHJvcG9zYWxLaW5kKW9uZSBvZiB0aGUga2luZCBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiBvbiAmbHQ7Y29kZSZndDtDb21wbGV0aW9uUHJvcG9zYWwmbHQ7L2NvZGUmZ3Q7Ci0JICogQHBhcmFtIGFsbG93ICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGlmIGEgcHJvcG9zYWwgb2YgYSBnaXZlbiBraW5kIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbAotCSAqIG9mIHRoZSBnaXZlbiBraW5kIGlzIGFsbG93ZWQgYnkgdGhpcyByZXF1ZXN0b3IsIGFuZCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsKLQkgKiBpZiBpdCBpc24ndCBvZiBpbnRlcmVzdAotCSAqIEBzZWUgI2lzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCkKLQkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRLaW5kKCkKLQkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRSZXF1aXJlZFByb3Bvc2FscygpCi0JICoKLQkgKiBAc2luY2UgMy4zCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dzUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kKWJvb2xlYW4gYWxsb3cpIHsuLi59Ci0KLQkuLi4KLQotfQotPC9wcmU+Ci08L2xpPgotPGxpPkNvZGUgQXNzaXN0IHByb3Bvc2UgY29tcGxldGlvbiBldmVuIGlmIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgb3IgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgaXMgbWlzc2luZy48YnI+Ci1lLmcuCi08cHJlPgotcGFja2FnZSBwOwotcHVibGljIGNsYXNzIFggewotICB2b2lkIGZvbygpIHsKLSAgICBWZWN0b3IgdiA9IG51bGw7Ci0gICAgdi5hZGRFbHwgLy8gY29tcGxldGUgYXQgfCBsb2NhdGlvbgotICB9Ci19Ci08L3ByZT4KLUEgY29tcGxldGlvbiBwcm9wb3NhbCB3aXRoIHJlcXVpcmVkIHByb3Bvc2FscyB3aWxsIGJlIHJldHVybmVkLiBUaGUgbWFpbiBwcm9wb3NhbCB3aWxsIGJlIHRoZSBtZXRob2QgPGNvZGU+YWRkRWxlbWVudCgpPC9jb2RlPgotYXQgPGNvZGU+YWRkRWw8L2NvZGU+IGxvY2F0aW9uIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbCBvZiB0aGUgdHlwZSA8Y29kZT5qYXZhLnV0aWwuVmVjdG9yPC9jb2RlPiBhdAotPGNvZGU+VmVjdG9yPC9jb2RlPiBsb2NhdGlvbi4KLVRoZSBzYW1lIGtpbmQgb2YgY29tcGxldGlvbiBjYW4gYmUgY29tcHV0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLgotPHByZT4KLXBhY2thZ2UgcDsKLXB1YmxpYyBjbGFzcyBYIHsKLSAgVmVjdG9yIHYgPSBudWxsOwotICB2b2lkIGZvbygpIHsKLSAgICB2LmFkZEVsfCAvLyBjb21wbGV0ZSBhdCB8IGxvY2F0aW9uCi0gIH0KLX0KLTwvcHJlPgotPHByZT4KLXBhY2thZ2UgcDsKLXB1YmxpYyBjbGFzcyBYIHsKLSAgVmVjdG9yIGJhcigpIHtyZXR1cm4gbnVsbDt9Ci0gIHZvaWQgZm9vKCkgewotICAgIGJhcigpLmFkZEVsfCAvLyBjb21wbGV0ZSBhdCB8IGxvY2F0aW9uCi0gIH0KLX0KLTwvcHJlPgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMTkwIj4xNjExOTA8L2E+Ci1bc2VhcmNoXSBBbGwgdHlwZSBzZWFyY2ggZG9lc24ndCBmaW5kIGFsbCB0eXBlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTc1NiI+MTUxNzU2PC9hPgotW2NvbXBpbGVyXSB1bnZlcmlmaWFibGUgYnl0ZWNvZGUgY3JlYXRlZCB3aXRoIGN2cyBoZWFkIGNvbXBpbGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDI4Ij4xNjEwMjg8L2E+Ci1bc2VhcmNoXSBOUEUgb24gb3JnYW5pemUgaW1wb3J0cyBpbiBUeXBlTmFtZU1hdGNoLmVxdWFscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDg1NCI+MTYwODU0PC9hPgotW3NlYXJjaF0gTm8gdHlwZSBpcyBmb3VuZCB1c2luZyBzZWFjaEFsbFR5cGVOYW1lcyhjaGFyW11bXSxjaGFyW11bXSwuLi4pIG1ldGhvZHMgd2hlbiBubyB0eXBlIG5hbWVzIGlzIHNwZWNpZmllZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwMzM5Ij44MDMzOTwvYT4KLVdyb25nIGVycm9yIG1lc3NhZ2UgIjsgZXhwZWN0ZWQiIHdoZW4gd3JpdGluZyBhbiBpbnRlcmZhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk3MDkiPjE1OTcwOTwvYT4KLVtjb21waWxlcl0gbWlzc2luZyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBtZW1iZXIgdHlwZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxNzAiPjE1NzE3MDwvYT4KLVtBU1QgdmlzaXRvcl0gVW52aXNpdGVkIGVsZW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5OTczIj4xNTk5NzM8L2E+Ci1bMS41XSBbY29tcGlsZXJdIFZlcmlmeUVycm9yIGR1ZSB0byBjb21waWxlciBnZW5lcmF0aW5nIGluY29ycmVjdCBzeW50aGV0aWMgbWV0aG9kcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDY1NSI+MTYwNjU1PC9hPgotW2Fzc2lzdF0gQnVnIHdpdGggY29kZSBhc3Npc3QgYW5kIGdlbmVyaWNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDQ5ODQiPjQ0OTg0PC9hPgotW3R5cGluZ10gQXV0b21hdGljYWxseSBvcHRpbWl6ZSBjbGFzcyBpbXBvcnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNDk0Ij4xNjA0OTQ8L2E+Ci1bc2VhcmNoXSBzZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdW10sIGNoYXJbXVtdLC4uLikgZmFpbHMgdG8gZmluZCB0eXBlcyBpbiBkZWZhdWx0IHBhY2thZ2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjgiPjE2MDMyODwvYT4KLVtzZWFyY2hdIFJlbW92ZSBjb25zdHJ1Y3RvciBUeXBlTmFtZU1hdGNoKElUeXBlKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDMyNyI+MTYwMzI3PC9hPgotW3NlYXJjaF0gQWRkIHNwZWNpZmljYXRpb24gZm9yIFR5cGVOYW1lTWF0Y2guZ2V0VHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDMyNCI+MTYwMzI0PC9hPgotW3NlYXJjaF0gU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyhjaGFyW11bXSwgY2hhcltdW10sIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjMiPjE2MDMyMzwvYT4KLVtzZWFyY2hdIFR5cGVOYW1lTWF0Y2g6IHN1cHBvcnQgaGFzaENvZGUvZXF1YWxzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMzUyIj4xNjAzNTI8L2E+Ci1DT01QQUNUIG1vZGUgZG9lc24ndCB3b3JrIGZvciBleGNlcHRpb24gdGFibGUgaW4gdGhlIGRpc2Fzc2VtYmxlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjAwIj45MDYwMDwvYT4KLVttb2RlbF0gQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uYXBwbHk6IHNob3VsZCB1c2UgcHJvamVjdCBvcHRpb25zIGZvciByZXdyaXRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDM1MiI+MTYwMzUyPC9hPgotQ09NUEFDVCBtb2RlIGRvZXNuJ3Qgd29yayBmb3IgZXhjZXB0aW9uIHRhYmxlIGluIHRoZSBkaXNhc3NlbWJsZXIKLQotPGEgbmFtZT0idl83MTYiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTMgLSAxMHRoIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTYKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE2Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+UmF3IHR5cGUgcmVmZXJlbmNlIGFyZSBub3cgcmVwb3J0ZWQgYnkgZGVmYXVsdC4gU2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk0NTYiPjE1OTQ1NjwvYT4uPC9saT4KLTxsaT5BUEkgb2YgPGNvZGU+VHlwZU5hbWVNYXRjaDwvY29kZT4gaGFzIGJlZW4gY2hhbmdlZCB0byBpbXByb3ZlIG1lbW9yeSBjb25zdW1wdGlvbiBwZXJmb3JtYW5jZS4KLUl0IG5vdyBjcmVhdGVzIElUeXBlIGhhbmRsZSB3aGlsZSBhY2NlcHRpbmcgdGhlIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBpbmRleGVzIGFuZCBzdG9yZXMgdGhlaXIgbW9kaWZpZXJzCi10byBhdm9pZCBqYXZhIGVsZW1lbnQgb3BlbmluZyB3aGlsZSBnZXR0aW5nIHRoaXMgcGllY2Ugb2YgaW5mb3JtYXRpb24uPGJyPgotTm90ZSB0aGF0IHRoZXJlJ3Mgbm8gSmF2YSBNb2RlbCBpbml0aWFsaXphdGlvbiBub3IgcG9wdWxhdGluZyB3aGlsZSBjcmVhdGluZyBoYW5kbGVzLi4uPGJyPgotTm90ZSBhbHNvIHRoYXQgcHJldmlvdXNseSBhZGRlZCBBUEkgbWV0aG9kIG9uIElKYXZhUHJvamVjdCBoYXMgYmVlbiByZW1vdmVkOgotPHByZT4KLUlUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwKLQlTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUsCi0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwKLQlJQ29tcGlsYXRpb25Vbml0W10gdW5pdHMsCi0JSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci08L3ByZT4KLTwvbGk+Ci08bGk+V2hpbGUgZml4aW5nIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc4MTQiPjE1NzgxNDwvYT4sIG5ldyA8Y29kZT5NZXRob2RSZWZlcmVuY2VNYXRjaC5pc1BvbHltb3JwaGljKCk8L2NvZGU+IEFQSSBtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0bzoKLTxwcmU+Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIG9uIGEgbWVzc2FnZSBzZW50IGZyb20gYSB0eXBlCi0gKiB3aGljaCBpcyBhIHN1cGVyIHR5cGUgb2YgdGhlIHNlYXJjaGVkIG1ldGhvZCBkZWNsYXJpbmcgdHlwZS4KLSAqIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgbWV0aG9kIGNhbGxlZCBhdCBydW4tdGltZSBtYXkgb3IgbWF5IG5vdCBiZQotICogdGhlIHNlYXJjaCB0YXJnZXQsIGRlcGVuZGluZyBvbiB0aGUgcnVuLXRpbWUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICoKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlZmVyZW5jZSBpcyBvbiBhIG1lc3NhZ2Ugc2VudCBmcm9tCi0gKiBhIHN1cGVyLXR5cGUgb2YgdGhlIHNlYXJjaCBtZXRob2QgZGVjbGFyaW5nIGNsYXNzLCA8Y29kZT5mYWxzZSA8L2NvZGU+IG90aGVyd2lzZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc1N1cGVySW52b2NhdGlvbigpCi08L3ByZT4KLTwvbGk+Ci08bGk+QWRkZWQgbmV3IEFQSSA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNnZXRGYWlsdXJlQ29udGFpbmVyKC4uLik8L2NvZGU+IHRoYXQgcmV0dXJucyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciB0aGF0Ci0gICAgIHNob3VsZCBiZSB1c2VkIGlmIGEgY29udGFpbmVyIGluaXRpYWxpemVyIGZhaWxzIHRvIGluaXRpYWxpemUgYSBjb250YWluZXIuPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUwMDgiPjk1MDA4PC9hPgotW2Fzc2lzdF0gTWlzc2luZyBjb21wbGV0aW9uIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbiBpbiBib29sZWFuIGNhc2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAwMTUiPjE2MDAxNTwvYT4KLVsxLjVdW2phdmFkb2NdIE1pc3Npbmcgd2FybmluZyBvbiBhdXRvYm94aW5nIGNvbXBhdGlibGUgbWV0aG9kcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDEzMiI+MTYwMTMyPC9hPgotWzEuNV1bY29tcGlsZXJdIENvbXBpbGVyIGZhaWxzIHdpdGggaW5kaXJlY3QgcmVmZXJlbmNlIGVycm9yIG1lc3NhZ2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAwMDUiPjE2MDAwNTwvYT4KLUFkZCBwcm90ZWN0aW9uIGFib3V0IG1pc2JlaGF2aW5nIGNvbnRhaW5lciBpbml0aWFsaXplcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NDgyIj44NjQ4MjwvYT4KLUlTb3VyY2VSYW5nZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnRzIHZhbHVlIGVxdWFscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzgxNCI+MTU3ODE0PC9hPgotW3NlYXJjaF0gcG9seW1vcnBoaWMgbWF0Y2hlcyBpbiBzdXBlcnR5cGUgaGllcmFyY2h5IHNob3VsZCBiZSBtYXJrZWQgYXMgcG90ZW50aWFsCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzgwIj4xNDgzODA8L2E+Ci1bc2VhcmNoXSBnZXQgSVR5cGUgZnJvbSBUeXBlTmFtZVJlcXVlc3RvciByZXN1bHQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAwMjUiPjE2MDAyNTwvYT4KLUNoYXJPcGVyYXRpb24gZmFpbHMgd2l0aCBBSU9PQkUgd2hlbiByZXBsYWNlZCBhcnJheSBjb250YWlucyB0aGUgc2FtZSBjaGFycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTY0MSI+MTU5NjQxPC9hPgotcGF0Y2ggdG8gcmVmYWN0b3IgTWFpbiBhbmQgYWRkIG5ldyAmcXVvdDtHQ0NNYWluJnF1b3Q7IGRyaXZlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDg0OCI+MTM0ODQ4PC9hPgotW2NvbXBpbGVyXVtudWxsXSBmYWxzZSBwb3NpdGl2ZSBhZnRlciBuZXN0ZWQgbG9vcCB3aXRoIGJyZWFrIHRvIGV4cGxpY2l0IGxhYmVsCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NjU0Ij4xNTk2NTQ8L2E+Ci1bY29tcGlsZXJdIHVudmVyaWZpYWJsZSBieXRlY29kZSBjcmVhdGVkIGJ5IGN1cnJlbnQgY3ZzIGhlYWQgY29tcGlsZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg1MTgiPjE1ODUxODwvYT4KLVJlbW92ZSBkZXBlbmRlbmN5IG9mIEdlbmVyaWNUeXBlVGVzdCN0ZXN0MzcwIG9uIFNVTiBpbnRlcm5hbCBBUElzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NjA3Ij4xNTk2MDc8L2E+Ci1bMS41XVtjb21waWxlcl0gTTI6IFVubmVjZXNzYXJ5IGNhc3QgaXMgbmVjZXNzYXJ5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MjY3Ij4xNTgyNjc8L2E+Ci1CcmFjZSBwb3NpdGlvbnMgbGluZSBhZnRlciBhbm5vdGF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MjU4Ij4xNTgyNTg8L2E+Ci1Eb3VibGUgY2hlY2sgc29ydGluZyBhbGdvcml0aG1zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NDU2Ij4xNTk0NTY8L2E+Ci1bMS41XVtjb21waWxlcl0gRW5hYmxlIGNvbXBpbGVyIHdhcm5pbmcgZm9yIHJhdyB0eXBlIHJlZmVyZW5jZSBieSBkZWZhdWx0Ci0KLTxhIG5hbWU9InZfNzE1Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00zIC0gM3JkIE9jdG9iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTUKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE1Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+QWRkZWQgbmV3IDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gQVBJIG1ldGhvZCBmb3Igc2VhcmNoIGFsbCB0eXBlIG5hbWVzIChzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODM4MCI+MTQ4MzgwPC9hPikuPGJyPgotT25seSByZXF1ZXN0b3IgZGlmZmVycyBmcm9tIGFscmVhZHkgZXhpc3RpbmcgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzPC9jb2RlPiBtZXRob2Q6Ci08cHJlPgotLyoqCi0gKiBTZWFyY2hlcyBmb3IgYWxsIHRvcC1sZXZlbCB0eXBlcyBhbmQgbWVtYmVyIHR5cGVzIGluIHRoZSBnaXZlbiBzY29wZS4KLSAqIFRoZSBzZWFyY2ggY2FuIGJlIHNlbGVjdGluZyBzcGVjaWZpYyB0eXBlcyAoZ2l2ZW4gYSBwYWNrYWdlIG5hbWUgdXNpbmcgc3BlY2lmaWMgbWF0Y2ggbW9kZQotICogYW5kL29yIGEgdHlwZSBuYW1lIHVzaW5nIGFub3RoZXIgc3BlY2lmaWMgbWF0Y2ggbW9kZSkuCi0gKgotICogUHJvdmlkZWQge0BsaW5rIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3J9IHJlcXVlc3RvciB3aWxsIGNvbGxlY3Qge0BsaW5rIFR5cGVOYW1lTWF0Y2h9Ci0gKiBtYXRjaGVzIGZvdW5kIGR1cmluZyB0aGUgc2VhcmNoLgotLi4uCi0gKiBAcGFyYW0gbmFtZU1hdGNoUmVxdWVzdG9yIHRoZSB7QGxpbmsgVHlwZU5hbWVNYXRjaFJlcXVlc3RvciByZXF1ZXN0b3J9IHRoYXQgY29sbGVjdHMKLSAqIAkJCQl7QGxpbmsgVHlwZU5hbWVNYXRjaCBtYXRjaGVzfSBvZiB0aGUgc2VhcmNoLgotLi4uCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKLQlmaW5hbCBjaGFyW10gcGFja2FnZU5hbWUsCi0JZmluYWwgaW50IHBhY2thZ2VNYXRjaFJ1bGUsCi0JZmluYWwgY2hhcltdIHR5cGVOYW1lLAotCWZpbmFsIGludCB0eXBlTWF0Y2hSdWxlLAotCWludCBzZWFyY2hGb3IsCi0JSUphdmFTZWFyY2hTY29wZSBzY29wZSwKLQlmaW5hbCBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yIG5hbWVNYXRjaFJlcXVlc3RvciwKLQlpbnQgd2FpdGluZ1BvbGljeSwKLQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLTwvcHJlPgotQ2xpZW50cyBoYXZlIHRvIHByb3ZpZGUgYSBuZXcgcmVxdWVzdG9yOiA8Y29kZT5UeXBlTmFtZU1hdGNoUmVxdWVzdG9yPC9jb2RlPiBpbiBvcmRlciB0bwotZ2V0IG1hdGNoZXMgY29sbGVjdGVkIGR1cmluZyB0aGUgc2VhcmNoLjxicj4KLU5vdGUgdGhhdCB0aGlzIG1hdGNoICg8Y29kZT5UeXBlTmFtZU1hdGNoPC9jb2RlPikgY2FuIHJlc29sdmUgdHlwZSBhbmQgdGhlbiBwcm92aWRlIGNvcnJlc3BvbmRpbmcgamF2YSBtb2RlbCA8Y29kZT5JVHlwZTwvY29kZT46Ci08cHJlPgotLyoqCi0gKiBSZXR1cm5zIHRoZSBqYXZhIG1vZGVsIHR5cGUgY29ycmVzcG9uZGluZyB0byBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gKiAoYmFzZWQgb24gcGFja2FnZSwgZW5jbG9zaW5nIHR5cGVzIGFuZCBzaW1wbGUgbmFtZSkuCi0gKgotICogQHJldHVybiB0aGUgamF2YSBtb2RlbCB0eXBlCi0gKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBoYXBwZW5zIHdoZW4gdHlwZSBzdG9yZWQgaW5mb3JtYXRpb24gYXJlIG5vdCB2YWxpZAotICovCi1wdWJsaWMgSVR5cGUgcmVzb2x2ZWRUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorSVNvdXJjZVJhbmdlIGdldE5hbWVSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiA8L3ByZT4KIDwvbGk+CiA8bGk+Ci1EZXByZWNhdGVkIGV4aXN0aW5nIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gQVBJIGhlbHBlciBtZXRob2Q6Ci08cHJlPgotCXB1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKLQkJZmluYWwgY2hhcltdIHBhY2thZ2VFeGFjdE5hbWUsCi0JCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKLQkJZmluYWwgaW50IG1hdGNoUnVsZSwKLQkJaW50IHNlYXJjaEZvciwKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKLQkJZmluYWwgVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKLQkJaW50IHdhaXRpbmdQb2xpY3ksCi0JCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotPC9wcmU+Ci1UaGlzIHNob3VsZCBhdm9pZCB0byBoYXZlIHRvbyBtYW55IHNpbWlsYXIgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzPC9jb2RlPiBhdmFpbGFibGUgbWV0aG9kcy4uLgotPC9saT4KLTxsaT4KLUFkZGVkIG5ldyA8Y29kZT5KYXZhQ29yZTwvY29kZT4gQVBJIG1ldGhvZCB0byBjcmVhdGUgYSBqYXZhIGVsZW1lbnQgZnJvbSBhbiA8Y29kZT5JRmlsZTwvY29kZT4KLXVzaW5nIGEgc3BlY2lmaWMgcHJvamVjdDoKK05ldyBBUEkgYWRkZWQgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSB0aGUgbmFtZSByYW5nZSBmb3IgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjwvY29kZT46CiA8cHJlPgogLyoqCi0gKiBSZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmlsZSwgaXRzIHByb2plY3QgYmVpbmcgdGhlIGdpdmVuCi0gKiBwcm9qZWN0LgotICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBmaWxlCi0gKiB3aXRoIGEgSmF2YSBlbGVtZW50LgorICogUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIG9mIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbidzIG5hbWUsCisgKiBvciBudWxsIGlmIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlCisgKiBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkuCiAgKgotICogVGhlIGZpbGUgbXVzdCBiZSBvbmUgb2Y6Ci0gKiAgLiBhIGZpbGUgd2l0aCBvbmUgb2YgdGhlIHtAbGluayBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKQotICogICAgICBKYXZhLWxpa2UgZXh0ZW5zaW9uc30gLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPgotICogIC4gYSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPgotICogIC4gYSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+Ci0gKgotICogQ3JlYXRpbmcgYSBKYXZhIGVsZW1lbnQgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhbmQgb3BlbmluZyBhbGwgb2YgdGhlCi0gKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uCi0gKgotICogQHBhcmFtIGZpbGUgdGhlIGdpdmVuIGZpbGUKLSAqIEByZXR1cm4gdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWxlLCBvcgotICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgZ2l2ZW4gZmlsZQotICogd2l0aCBhIEphdmEgZWxlbWVudAotICogQHNpbmNlIDMuMworICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHJldHVybiB0aGUgc291cmNlIHJhbmdlIG9mIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbidzIG5hbWUsCisgKiBvciBudWxsIGlmIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlCisgKiBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkKKyAqIEBzaW5jZSAzLjcKICAqLwotcHVibGljIHN0YXRpYyBJSmF2YUVsZW1lbnQgY3JlYXRlKElGaWxlIGZpbGUsIElKYXZhUHJvamVjdCBwcm9qZWN0KQotPC9wcmU+Ci1FeGlzdGluZyBBUEkgbWV0aG9kIDxjb2RlPkphdmFDb3JlLmNyZWF0ZShJRmlsZSk8L2NvZGU+IGFzc3VtZWQgdGhhdCBwcm9qZWN0IHRvIHVzZSB3YXMgdGhlIGZpbGUgb25lCi1idXQgaXQgd2FzIG5vdCBhbHdheXMgdGhlIGNhc2UsIGVzcGVjaWFsbHkgZm9yIGNsYXNzIGZpbGVzIGJlbG9uZ2luZyB0byBhbiBleHRlcm5hbCBjbGFzcyBmb2xkZXIuLi48YnI+Ci1Ob3RlIHRoYXQgbm8gb3RoZXIgbWV0aG9kcyB3YXMgYWRkZWQgZm9yIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gYW5kIDxjb2RlPklGb2xkZXI8L2NvZGU+IGFzIGRlZmF1bHQgcHJvamVjdCB3YXMKLWFsd2F5cyB3ZWxsIGNvbXB1dGVkIGZvciB0aGlzIGtpbmQgb2YgcmVzb3VyY2VzLgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTA2Ij4xNTg1MDY8L2E+Ci1bc2VhcmNoXSBTZWFyY2hFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzIHNob3VsZCBzcGVjIHRoYXQgbnVsbCBpcyB2YWxpZCBmb3IgcGFja2FnZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTMyNSI+MTU5MzI1PC9hPgotQW55IGlkZWEgd2h5IENsYXNzcGF0aEVudHJ5IGNoZWNrcyBmb3Igc3RyaW5nIG9iamVjdCByZWZlcmVuY2UgaW5zdGVhZCBvZiBlcXVhbHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU4MjQiPjE1NTgyNDwvYT4KLVtqYXZhZG9jXSBDb250ZW50IGFzc2lzdCAgZG9lc24ndCBzdWdnZXN0IFZhcmFyZ3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAyODkiPjE1MDI4OTwvYT4KLVtoaWVyYXJjaHldIE5QRSBpbiBoaWVyYXJjaHkgYnVpbGRlciB3aGVuIHJlZ2lvbiBpcyBlbXB0eQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTI1MCI+MTU5MjUwPC9hPgotWzEuNV1bY29tcGlsZXJdIFNob3VsZCBiZXR0ZXIgbG9jYXRlIHJhdyB0eXBlIHVzYWdlIGZvciBhcnJheSBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjQ1Ij4xNTkyNDU8L2E+Ci1bMS41XVtjb21waWxlcl0gTWlzc2luZyByYXcgdHlwZSB1c2FnZSB3YXJuaW5nIGZvciBhcnJheSB0eXBlIHJlZgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTI0MyI+MTU5MjQzPC9hPgotW2NvbXBpbGVyXSBTaG91bGQgYmV0dGVyIGxvY2F0ZSBkZXByZWNhdGlvbiBpc3N1ZSBmb3IgcXVhbGlmaWVkIHR5cGUgcmVmCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4OTUxIj4xNTg5NTE8L2E+Ci1bbW9kZWxdIElXb3JraW5nQ29weSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgaW4gYW55IGphdmFkb2MgY29tbWVudCBvZiBKYXZhTW9kZWwgbWV0aG9kcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzEzMyI+MTUzMTMzPC9hPgotW21vZGVsXSB0b2dnbGUgYnJlYWtwb2ludCBpbiBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgY2xhc3MgbG9hZCBicmVha3BvaW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MDIxIj4xNTkwMjE8L2E+Ci1bY29tcGlsZXJdIFVudXNlZCBsb2NhbHMgaW5pdGlhbGlzYXRpb24gaXMgb3B0aW1pemVkIG91dCB3aGVuIGl0IGlzIGEgc2luZ2xlIG5hbWUgcmVmZXJlbmNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTQ4Ij4xNTg1NDg8L2E+Ci1bMS41XVtjb21waWxlcl0gQ29tcGlsZXIgc2hvdWxkIGJlIG1vcmUgcmVzaWxpZW50IHdpdGggdW5yZXNvbHZlZCBwYXJhbWV0ZXJpemVkIHR5cGUgcmVmZXJlbmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDk5NSI+MTU0OTk1PC9hPgotW2NvbXBpbGVyXVtudWxsXSBmYWxzZSBwb3NpdGl2ZSBpbiBlbWJlZGRlZCB3aGlsZS93aGlsZS9icmVhayBjb2RlCi0KLTxhIG5hbWU9InZfNzE0Ij48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00zIC0gMjZ0aCBTZXB0ZW1iZXIgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTQKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE0Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NjY3Ij4xNDc2Njc8L2E+Ci1bMS41XVtjb21waWxlcl0gSWxsZWdhbCBjb21waWxlIGVycm9yOiAidGhlIG1ldGhvZCBYWFggaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZSBZWVkiCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MDAwIj4xNTgwMDA8L2E+Ci1bY29tcGlsZXJdW251bGxdIFNlY29uZCBkaWFnbm9zdGljIGFic29yYmVkIHdpdGhpbiBmaW5hbGx5IGJsb2NrcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDA4MiI+MTUwMDgyPC9hPgotW2NvbXBpbGVyXVtudWxsXSBOdWxsIHJlZmVyZW5jZSB3YXJuaW5nIGlnbm9yZXMgdHJ5IGJsb2NrcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTY2NSI+MTQ5NjY1PC9hPgotW2NvbXBpbGVyXVtudWxsXSBVbmV4cGVjdGVkIHZhcmlhYmxlIG1pZ2h0IGJlIG51bGwgd2FybmluZyBpbiBmaW5hbGx5IGJsb2NrCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MTE4Ij4xNDcxMTg8L2E+Ci1bY29tcGlsZXJdW251bGxdIEluY29ycmVjdCBudWxsIGFuYWx5c2lzIGludm9sdmluZyBkb193aGlsZSBsb29wCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMzAzIj4xNDIzMDM8L2E+Ci1SaWdodC1jbGljaywgIk9wZW4gRGVjbGFyYXRpb24iIGZhaWxzIHVuZGVyIDMuMlJDNAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxOCI+MTQxNTE4PC9hPgotSUV2YWx1YXRpb25Db250ZXh0Lm5ld1ZhcmlhYmxlIGlzIG5vdCBjb25zaWRlcmVkIHdoZW4gZG9pbmcgY29kZWNvbXBsZXRlLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzAwMSI+MTQzMDAxPC9hPgotU3RhdGVtZW50IHJlY292ZXJ5IGRvZXNuJ3QgcmVjb3ZlciBicm9rZW4gdHJ5IHN0YXRlbWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzIyNSI+MTIzMjI1PC9hPgotQ29kZSBhc3Npc3Qgc3VnZ2VzdHMgb3ZlcnJpZGRlbiBtZXRob2QKLQotPGEgbmFtZT0idl83MTMiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTIgLSAxNXRoIFNlcHRlbWJlciAyMDA2IC0gMy4zIE1JTEVTVE9ORSAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcxMwotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MTMiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5BZGRlZCA8Y29kZT5pc1BvbHltb3JwaGljKCk8L2NvZGU+IGdldHRlciB0byA8Y29kZT5NZXRob2RSZWZlcmVuY2VNYXRjaDwvY29kZT4gKHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzQwMSI+YnVnIDczNDAxPC9hPgotYW5kIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjQ5MSI+YnVnIDE1NjQ5MTwvYT4pLgotPGJyPgotV2hlbiBhIHNlYXJjaCByZXF1ZXN0b3IgKDxjb2RlPlNlYXJjaFJlcXVlc3RvcjwvY29kZT4pIGFjY2VwdHMgdGhpcyBraW5kIG9mIG1hdGNoLAotaXQga25vd3MgaWYgYSBtZXRob2QgcmVmZXJlbmNlIG1hdGNoIGlzIGEgcG9seW1vcnBoaWMgbWV0aG9kIChpZS4gaW1wbGVtZW50ZWQgaW4gYSBzdXBlciBvciBzdWIgdHlwZSkgb3Igbm90LgotPHA+Ci1Gb3IgZXhhbXBsZSwgaW4gZXhhbXBsZSBiZWxvdzo8L3A+Ci08cHJlPgotY2xhc3MgQSB7IHB1YmxpYyB2b2lkIGZvbygpIHt9IH0KLWNsYXNzIEIgZXh0ZW5kcyBBIHt9Ci1jbGFzcyBDIGV4dGVuZHMgQiB7IHB1YmxpYyB2b2lkIGZvbygpIHt9IH0KLWNsYXNzIEQgZXh0ZW5kcyBDIHt9Ci1wdWJsaWMgY2xhc3MgWCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCW5ldyBCKCkuZm9vKCk7Ci0JCW5ldyBDKCkuZm9vKCk7Ci0JCW5ldyBEKCkuZm9vKCk7Ci0JfQotfQotPC9wcmU+Ci08cD4KLVNlYXJjaGluZyBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gPGNvZGU+Qy5mb28oKTwvY29kZT4gbWV0aG9kIGdldCAzIG1hdGNoZXMKLShpbnN0YW5jZSBvZiA8Y29kZT5NZXRob2RSZWZlcmVuY2VNYXRjaDwvY29kZT4pLiBUd28gb2YgdGhlbSwgPGNvZGU+bmV3IEIoKS5mb28oKTwvY29kZT4gYW5kCi08Y29kZT5uZXcgRCgpLmZvbygpPC9jb2RlPiBhcmUgZmxhZ2dlZCBhcyBwb2x5bW9ycGhpYyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGVzZSBhcmUgbWV0aG9kcwotcmVzcGVjdGl2ZWx5IG9mIGEgc3VwZXJjbGFzcyBhbmQgb2YgYSBzdWJjbGFzcy4uLgotPC9wPgotPHA+Ci1TZWFyY2ggdmlldyBoYXMgYmVlbiBtb2RpZmllZCB0byBmaWx0ZXIgdGhpcyBraW5kIG9mIG1hdGNoZXMgd2hlbiB1c2VyIHdhbnRzIHRvIGZvY3VzIG9ubHkKLW9uIGV4YWN0IHJlZmVyZW5jZXMgb2YgdGhlIHNlYXJjaGVkIG1ldGhvZC48L3A+Ci08L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTczODkiPjE1NzM4OTwvYT4KLVsxLjRdW2NvbXBpbGVyXSBhc3NlcnRpb25TdGF0dXMgaXMgbm90IHNldCBwcm9wZXJseSBmb3IgbmVzdGVkIHR5cGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MzMzIj4xNTczMzM8L2E+Ci1jYWxsaW5nIGRlbGV0ZSBvbiBlbnVtIGNvbnN0YW50IGRlbGV0ZXMgZW50aXJlIEVudW0KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc0MDMiPjE1NzQwMzwvYT4KLU5QRSB3aGVuIHRyeWluZyB0byBnZXQgdGhlIGFzdCBmb3IgYSBjbGFzcyB3aXRoIGJvZ2d1cyBhbm5vdGF0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjQ5MSI+MTU2NDkxPC9hPgotW3NlYXJjaF0gUmVmZXJlbmNlIHNlYXJjaCB1bnVzYWJsZSBpbiBzb21lIHNpdHVhdGlvbnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzQwMSI+NzM0MDE8L2E+Ci1bc2VhcmNoXSBVbmFibGUgdG8gc2VhcmNoIGp1c3QgZm9yIHJlZmVyZW5jZXMgdG8gb3ZlcnJpZGRlbiBtZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcyNDciPjE1NzI0NzwvYT4KLVsxLjZdIFtjb21waWxlcl0gVmVyaWZ5RXJyb3Igd2l0aCBTdGFja01hcCBmcmFtZXMgd2hlbiBubyBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzIGFyZSBnZW5lcmF0ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcwODYiPjE1NzA4NjwvYT4KLXNob3VsZCBhZG9wdCBJQ1UgQ29sbGF0b3IgYW5kIHVzZSBuZXcgQVBJcyBvbiBTdHJ1Y3R1cmVkVmlld2VyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NzUxIj4xNDk3NTE8L2E+Ci1FbnVtLXZhbHVlZCBhbm5vdGF0aW9uIGVsZW1lbnQgaGFuZGxlcyBub24tZW51bSBjb25zdGFudCBiYWRseQotCi08YSBuYW1lPSJ2XzcxMiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMiAtIDEydGggU2VwdGVtYmVyIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzEyCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxMiI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPkNvZGUgQXNzaXN0OiBBbm5vdGF0aW9uIHR5cGVzIGFyZSBwcm9wb3NlZCBldmVuIHRoZXJlIGlzIG5vIHByZWZpeC4KLTxwcmU+Ci0gICBwdWJsaWMgQGludGVyZmFjZSBNeUFubm90IHsKLSAgICAgIGludCBmb28oKTsKLSAgIH0KLSAgIEB8Ci0gICBwdWJsaWMgY2xhc3MgQUNsYXNzIHt9Ci08L3ByZT4KLSdNeUFubm90JyBpcyBwcm9wb3NlZCBpZiB5b3UgZG8gY29kZSBhc3Npc3QgYXQgJ3wnIGxvY2F0aW9uLgotPC9saT4KLTxsaT4KLUFkZGVkIG5ldyBmbGFnIG9uIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50IHRvIHNwZWNpZnkgYm90aCBpbnRlcmZhY2VzIGFuZCBhbm5vdGF0aW9ucyAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjE3NyI+YnVnIDE1NjE3NzwvYT4pLgotVGhpcyBmbGFnIGlzIGRlZmluZWQgb24gSUphdmFTZWFyY2hDb25zdGFudHMgaW50ZXJmYWNlOgotPHByZT4KLQkvKioKLQkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhbiBpbnRlcmZhY2Ugb3IgYW5ub3RhdGlvbiB0eXBlLgotCSAqIE1vcmUgc2VsZWN0aXZlIHRoYW4gdXNpbmcge0BsaW5rICNUWVBFfS4KLQkgKiBAc2luY2UgMy4zCi0JICovCi0JaW50IElOVEVSRkFDRV9BTkRfQU5OT1RBVElPTj0gMTE7CitJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIDwvcHJlPgogPC9saT4KIDwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4ODU5Ij4xNDg4NTk8L2E+Ci1bbW9kZWxdW2RlbHRhXSBQYWNrYWdlIEV4cGxvcmVyIG9ubHkgc2hvd3MgZGVmYXVsdCBwYWNrYWdlIGFmdGVyIGltcG9ydAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjU5MSI+MTU2NTkxPC9hPgotWzEuNV1bY29tcGlsZXJdIGNvbnN0YW50LXNwZWNpZmljIG1ldGhvZHMgaW4gZW51bSBjYW5ub3QgYmUgYWJzdHJhY3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY1NDAiPjE1NjU0MDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBDb21waWxlciBwcm9kdWNlcyBpbnZhbGlkIGJ5dGVjb2RlIGZvciBjZXJ0YWluIGVudW0gZGVjbGFyYXRpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MTc3Ij4xNTYxNzc8L2E+Ci1bc2VhcmNoXSBpbnRlcmZhY2VzIGFuZCBhbm5vdGF0aW9ucyBjb3VsZCBiZSBmb3VuZCB3aXRoIG9ubHkgb25lIHJlcXVldHMgb2Ygc2VhcmNoQWxsVHlwZU5hbWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYzNDAiPjE1NjM0MDwvYT4KLVtzZWFyY2hdIHNlYXJjaEFsbFR5cGVOYW1lcyByZXR1cm4gbm90aGluZyBmb3IgZW1wdHkgcHJlZml4Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTg5Ij4xNTExODk8L2E+Ci1bc2VhcmNoXSBEZWNsYXJhdGlvbiBzZWFyY2ggZG9lcyBub3QgZmluZCBhbGwgbWF0Y2hlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mzg3NCI+MTUzODc0PC9hPgotWzEuNV1bY29tcGlsZXJdIENvbXBpbGVyIGZhaWxzIHRvIGNvbnNpZGVyIGJyaWRnZSBtZXRob2Qgd2l0aCAtc291cmNlIDEuNAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTk4MyI+MTI5OTgzPC9hPgotWzEuNV1bYXNzaXN0XSBOZWVkIHBhcnRpYWwgd29yZCBmb3IgYW5ub3RhdGlvbiBhdXRvY29tcGxldGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjE5NCI+MTU2MTk0PC9hPgotW2NvZGVhc3Npc3RdIFBST1BPU0VfTUVNQkVSX1RZUEVTIGNhbiBiZSByZW1vdmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MTE1Ij4xNTUxMTU8L2E+Ci1VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZ3Mgc3VyZmFjaW5nIHRocm91Z2ggRE9NIEFTVAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzEyOCI+MTUzMTI4PC9hPgotW2NvbXBpbGVyXSBEdXBsaWNhdGUgbWV0aG9kcyBnZW5lcmF0ZWQgKGZyb20gaW52YWxpZCBzb3VyY2UsIGJ1dCBzdGlsbCA6LSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYxMTkiPjE1NjExOTwvYT4KLU5vIHdhcm5pbmcgZm9yIHVubmVjZXNzYXJ5IHNlbWljb2xvbiBpbiBpbnRlcmZhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUyNTUiPjE1NTI1NTwvYT4KLVsxLjVdW2NvbXBpbGVyXSB0ZXJuYXJ5IGNvbmRpdGlvbmFsIG9wZXJhdG9yIHJldHVybnMgd3JvbmcgdHlwZQorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjUyNCI+MzA2NTI0PC9hPgorQVNUUmV3cml0ZUFuYWx5emVyIHVzZXMgd3Jvbmcgc3RhcnRpbmcgb2Zmc2V0IGluIGNhc2Ugb2YgY29tbWVudHMgYmVmb3JlIGEgbm9kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA5ODAiPjE1MDk4MDwvYT4KK1tBUEldIFNlbGVjdGluZyBpbXBvcnQgZGVjbGFyYXRpb24gd2l0aCBzcGFjZSBpbiBvdXRsaW5lIGhpZ2hsaWdodHMgd3JvbmcgcmFuZ2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwODQxIj4zMjA4NDE8L2E+CitUeXBlQ29udmVydGVycyBkb24ndCBzZXQgZW5jbG9zaW5nVHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA4MDIiPjMyMDgwMjwvYT4KK0FTVFBhcnNlci5jcmVhdGVBU1RzKC4uKSBmYWlscyBzaWxlbnRseSBvbiBtdWx0aXBsZSBtaXNzaW5nIHBhcmFtZXRlciB0eXBlcy4KIAotCi08YSBuYW1lPSJ2XzcxMSI+PC9hPgorPGEgbmFtZT0idl9CMDQiPjwvYT4KIDxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTIgLSA1dGggU2VwdGVtYmVyIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzExCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxMSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPkFkZGVkIHRvIHRoZSBiYXRjaCBjb21waWxlciB0aGUgYWJpbGl0eSB0byByZWRlZmluZSB0aGUgZGVzdGluYXRpb24gcGF0aAotICAgIG9uIGEgc291cmNlIGZvbGRlciBiYXNpcy4gRGlyZWN0b3JpZXMgY2l0ZWQgYXMgc291cmNlcywgZGlyZWN0bHkgb3IgYXMKLSAgICBhcmd1bWVudHMgdG8gdGhlIDxjb2RlPi1jbGFzc3BhdGg8L2NvZGU+IGFuZCBvdGhlciBjbGFzc3BhdGggcmVsYXRlZAotICAgIG9wdGlvbnMsIGNhbiBiZWFyIGEgPGNvZGU+Wy1kIGRpcl08L2NvZGU+IHNwZWNpZmljYXRpb24gdGhhdCBkaXJlY3RzIHRoZQotICAgIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyB0byA8Y29kZT5kaXI8L2NvZGU+IGZvciBzb3VyY2UgZmlsZXMgZmV0Y2hlZCBmcm9tIHRoZQotICAgIHNhaWQgZGlyZWN0b3JpZXMuCi0gICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBzb3VyY2UgZmlsZXMgPGNvZGU+c3JjL1guamF2YTwvY29kZT4gYW5kCi0gICAgPGNvZGU+WS5qYXZhPC9jb2RlPiwgWCBkZXBlbmRpbmcgZnJvbSBZLCB0aGUgY29tbWFuZCA8Y29kZT5lY2ogc3JjWy1kIGJpbjFdCi0gICAgLWQgYmluMjwvY29kZT4gd2lsbCBwcm9kdWNlIHRoZSBmaWxlcyA8Y29kZT5iaW4xL1guY2xhc3M8L2NvZGU+IGFuZAotICAgIDxjb2RlPmJpbjIvWS5jbGFzczwvY29kZT4sIHdoaWxlIHRoZSBjb21tYW5kIDxjb2RlPmVjaiBzcmNbLWQgYmluXSAtZAotICAgIG5vbmU8L2NvZGU+IHdpbGwgb25seSBwcm9kdWNlIHRoZSBmaWxlIDxjb2RlPmJpbi9YLmNsYXNzPC9jb2RlPi4KLTwvbGk+Ci08bGk+Q29kZSBBc3Npc3Q6IEFubm90YXRpb24gYXJndW1lbnRzIG5hbWVzIGFyZSBwcm9wb3NlZCBldmVuIHRoZXJlIGlzIG5vIHByZWZpeC4KLTxwcmU+Ci0gICBwdWJsaWMgQGludGVyZmFjZSBNeUFubm90IHsKLSAgICAgIGludCBmb28oKTsKLSAgIH0KLSAgIEBNeUFubm90KHwKLSAgIHB1YmxpYyBjbGFzcyBBQ2xhc3Mge30KLTwvcHJlPgotJ2ZvbycgaXMgcHJvcG9zZWQgaWYgeW91IGRvIGNvZGUgYXNzaXN0IGF0ICd8JyBsb2NhdGlvbi4KLTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODUyMSI+MTQ4NTIxPC9hPgotWzUuMF1bY29udGVudCBhc3Npc3RdIENvbnRlbnQgYXNzaXN0IHNob3cgYWxsIG1lbWJlcnMgb2YgYSBmdWxsIGFubm90YXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYxMDgiPjE1NjEwODwvYT4KLVsxLjVdW2NvbXBpbGVyXSBBdXRvYm94aW5nIGRvZXNudCB3b3JrdCBpbiBzd2l0Y2gtc3RhdGVtZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMTIzIj4xNDAxMjM8L2E+Ci1NaXNzaW5nIGNhbGxiYWNrIGluIENvZGVTbmlwcGV0VG9DdU1hcHBlciNnZXRDb21wbGV0aW9uUmVxdWVzdG9yKCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMzAiPjE1MzEzMDwvYT4KLVthc3Npc3RdIElPQiBkdXJpbmcgY29udGVudCBhc3Npc3QgaW4gc2NyYXBib29rCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MTcwIj4xNTQxNzA8L2E+Ci1QcmludGluZyB3YXJuaW5ncyBicmVha3MgaW4tZWRpdG9yIHF1aWNrIGZpeGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NTU0Ij4xNDY1NTQ8L2E+Ci1bYmF0Y2hdW2NvbXBpbGVyXVtvcHRpb25zXSBBbGxvdyB0aGUgYmF0Y2ggY29tcGlsZXIgdG8gb3V0cHV0IGNvbXBpbGVkIGZpbGVzCi1pbnRvIG11bHRpcGxlIG91dHB1dCBmb2xkZXJzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1ODg3Ij4xNTU4ODc8L2E+Ci1CcmVha3BvaW50IGluICdmaW5hbGx5JyBub3QgaGl0IC0gdGVzdCBzdWl0ZSBmYWlsaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1Nzk1Ij4xNTU3OTU8L2E+Ci1QYXRjaCB0byBmaXggamZhY2UudGV4dC5Bc3NlcnQgZGVwcmVjYXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ4ODAiPjE1NDg4MDwvYT4KLURlbHRhUHJvY2Vzc29yIGRvZXMgbm90IHNldCBwcm9qZWN0IHJlZmVyZW5jZXMgaWYgZmlyc3QgYnVpbGQgaXMgYSBwcm9qZWN0IGJ1aWxkCi0KLTxhIG5hbWU9InZfNzEwIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00yIC0gMjl0aCBBdWd1c3QgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTAKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzEwIj5jdnM8L2E+KS4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMSAtIEp1bHkgMjcsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjA0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IwNCI+Y3ZzPC9hPikuCiA8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTQyMyI+MTU1NDIzPC9hPgotW2NvbXBpbGVyXSBVbm9wdGltYWwgY29kZSBnZW5lcmF0aW9uIHdoZW4gYW4gaW5pdGlhbGl6ZXIgY29udGFpbnMgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTUzIj4xNTExNTM8L2E+Ci1bMS42XVtjb21waWxlcl0gSW52YWxpZCBTdGFja21hcCBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciB0ZXJuYXJ5IG9wZXJhdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1Mzk3Ij4xNDUzOTc8L2E+Ci1bMS42XVtjb21waWxlcl0gSW52YWxpZCBTdGFja01hcCBhdHRyaWJ1dGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgyMjQiPjE0ODIyNDwvYT4KLUFTVCBBUEkgcmVxdWVzdDogaGF2ZSBiaW5kaW5nIGZvciBpbnQsIG5lZWQgaW50W10sIGludFtdW10gLi4uLgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTQyNSI+MzE5NDI1PC9hPgorW2NvbXBpbGVyXSBKRFQgb3V0cHV0cyBjb3JydXB0IC5jbGFzcyBmaWxlIGZvciBwcm9ibGVtIHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5ODg1Ij4zMTk4ODU8L2E+CitTcHVyaW91cyAnY3ljbGUgZGV0ZWN0ZWQnLydoaWVyYXJjaHkgaW5jb25zaXN0ZW50JyBlcnJvcnMgaWYgYSB0eXBlIHRoYXQgV09VTEQgYmUgY3ljbGljIGlzIHN0YXRpYy1pbXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTIwNzYiPjMxMjA3NjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIGNvbXBpbGVyIGJlaGF2ZXMgZGlmZmVyZW50bHkgZnJvbSBqYXZhYworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA0MTQiPjMyMDQxNDwvYT4KK0NvbXBpbGVyIHByb2R1Y2VzIGluY29ycmVjdCBieXRlY29kZSBmb3IgbnVsbCBwb2ludGVyIGNoZWNrCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzIyNSI+MjIzMjI1PC9hPgorW0RPTV0gSU1lbWJlclZhbHVlUGFpckJpbmRpbmcgZG9lcyBub3QgZGVzdWdhciBzaW5nbGUgdmFsdWVzIGludG8gb25lLWVsZW1lbnQgYXJyYXlzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTYwMyI+MzE5NjAzPC9hPgorWzEuNV1bY29tcGlsZXJdIGVjbGlwc2UgZmFpbHMgd2l0aCAyIGdlbmVyaWNzIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWxlIGphdmFjIHN1Y2NlZWRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODAyMCI+MzE4MDIwPC9hPgorW2NvbXBpbGVyXSB3cm9uZyBpbml0aWFsaXphdGlvbiBmbG93IGluZm8gd2l0aCBpZiAodHJ1ZSkgdGhyb3cuLi4gcGF0dGVybiBpbiBlbHNlIGJsb2NrCiAKLTxhIG5hbWU9InZfNzA5Ij48L2E+Cis8YSBuYW1lPSJ2X0IwMyI+PC9hPgogPGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMiAtIDE1dGggQXVndXN0IDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzA5Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwOSI+Y3ZzPC9hPikuCitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy43TTEgLSBKdWx5IDIwLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0IwMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9CMDMiPmN2czwvYT4pLgogPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE3NTYiPjE1MTc1NjwvYT4KLVtjb21waWxlcl0gdW52ZXJpZmlhYmxlIGJ5dGVjb2RlIGNyZWF0ZWQgd2l0aCBjdnMgaGVhZCBjb21waWxlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzMwMyI+MTUzMzAzPC9hPgotSUJpbmRpbmcuZ2V0QW5ub3RhdGlvbnMoKSByZXR1cm5zIGFycmF5IHdpdGggbnVsbCBlbGVtZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NjYxIj4xNDg2NjE8L2E+Ci1bZm9ybWF0dGVyXSBsZXZlcmFnZSBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gaW4gQmluYXJ5RXhwcmVzc2lvbkZyYWdtZW50QnVpbGRlciN2aXNpdChCaW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlKQorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDM0MCI+MzIwMzQwPC9hPgorVGVzdCBmYWlsdXJlcyBpbiBkZWJ1ZyBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzUyMyI+MzA3NTIzPC9hPgorRGlmZmVyZW5jZXMgYmV0d2VlbiBwYXRjaCBvZiBidWcgMjEwNDIyIGFuZCBzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTkwMCI+MzE5OTAwPC9hPgorU3RyaW5nTGl0ZXJhbCNzZXRMaXRlcmFsVmFsdWUgbmVlZGxlc3NseSBlc2NhcGVzIGFwb3N0cm9waGVzICgnKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTAyNjQiPjMxMDI2NDwvYT4KK1dyb25nIHdhcm5pbmc6IFRoZSBhc3NpZ25tZW50IHRvIHZhcmlhYmxlIGhhcyBubyBlZmZlY3QKIAotPGEgbmFtZT0idl83MDgiPjwvYT4KKzxhIG5hbWU9InZfQjAyIj48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00xIC0gNnRoIEF1Z3VzdCAyMDA2IC0gMy4zIE1JTEVTVE9ORSAxCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcwOAotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MDgiPmN2czwvYT4pLgotPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5OZXcgZml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTE1MiI+YnVnIDk1MTUyPC9hPiByZXF1aXJlZCB0aGUgaW5kZXggdmVyc2lvbiB0byBiZSBpbmNyZW1lbnRlZC4KLSAgICAgSW5kZXhlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZWQgdXBvbiBzdWJzZXF1ZW50IHNlYXJjaCBxdWVyaWVzIChhY2NvdW50aW5nIGZvciBpbmRleGluZyBub3RpZmljYXRpb24gaW4gc2VhcmNoIHByb2dyZXNzIGRpYWxvZ3MpLgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUxNTIiPjk1MTUyPC9hPgotW3NlYXJjaF0gRjMgY2FuJ3QgZmluZCBzeW50aGV0aWMgY29uc3RydWN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI3MjUiPjE1MjcyNTwvYT4KLVsxLjZdW2Zvcm1hdHRlcl0gQ29kZSBmb3JtYXR0ZXIgZG9lcyBub3QgZm9ybWF0IDEuNSBjb2RlIHdoZW4gc291cmNlIGxldmVsIGlzIDEuNgotCi08YSBuYW1lPSJ2XzcwNyI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMSAtIDNyZCBBdWd1c3QgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDcKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzA3Ij5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+Ci1TZWFyY2hQYXR0ZXJuIEFQSSBtZXRob2QgPGNvZGU+Y3JlYXRlUGF0dGVybihJSmF2YUVsZW1lbnQsIGludCwgaW50KTwvY29kZT4gYmVoYXZpb3IgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIGdlbmVyaWMgc2VhcmNoZXMuPGJyPgotSXQgbm93IHJldHVybnMgZXJhc3VyZSBtYXRjaGVzIGluc3RlYWQgb2YgZXhhY3Qgb25lcyAgKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDg5Ij4xMjQ0ODk8L2E+IGZvciBkZXRhaWxlZCBkaXNjdXNzaW9uIG9uIHRoaXMgdG9waWMpLgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDU5Ij4xMTY0NTk8L2E+Ci1bMS41XVtzZWFyY2hdIEdlbmVyaWMgdHlwZSByZWZlcmVuY2Ugc2hvdWxkIHJldHVybiBleGFjdCBtYXRjaCBvbiBwYXJhbWV0ZXJpemVkIHR5cGUgd2l0aCBpdHMgb3duIHZhcmlhYmxlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4OSI+MTI0NDg5PC9hPgotWzEuNV1bc2VhcmNoXSAmcXVvdDtGaW5kIHVudXNlZCBkZXBlbmRlbmNpZXMmcXVvdDsgbWlzc2VzIHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlcwotCi08YSBuYW1lPSJ2XzcwNiI+PC9hPgotPGhyPjxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMSAtIDFzdCBBdWd1c3QgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDYKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzA2Ij5jdnM8L2E+KS4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjdNMSAtIEp1bHkgMTMsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjAyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IwMiI+Y3ZzPC9hPikuCiA8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzAyNCI+MTMzMDI0PC9hPgotW2FzdCByZXdyaXRlXSBBU1RSZXdyaXRlIGRvZXMgbm90IGhvbm9yIGZvcmNlZCBsaW5lIHNwbGl0cworPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDU1NiI+MzE0NTU2PC9hPgorWzEuNV1bY29tcGlsZXJdIGNvbXBpbGVyIGZhaWxzIHRvIHJlcG9ydCBhdHRlbXB0IHRvIGFzc2lnbiB3ZWFrZXIgYWNjZXNzIHByaXZpbGVnZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2OTU2Ij4zMTY5NTY8L2E+CitbY29tcGlsZXJdIFByaXZhdGUgc3VwZXJjbGFzcyBhbmQgZW5jbG9zaW5nIHNjb3BlIGZpZWxkIG5hbWVzIGluY29ycmVjdGx5IHJlcG9ydGVkIGFzIGNvbmZsaWN0aW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTUwMCI+MTUxNTAwPC9hPgorW2Fzc2lzdF0gTWV0aG9kIHBhcmFtZXRlciBuYW1lcyBhcmUgbm90IGRpc3BsYXllZCBmb3IgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQwMDYiPjMwNDAwNjwvYT4KK1tjb2RlIGFzc2lzdF0gQXV0b2Nhc3QgYWZ0ZXIgaW5zdGFuY2VvZiBmZWF0dXJlIGRvZXNudCB3b3JrIGluIHNvbWUgY2FzZXMuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDQxOSI+MjEwNDE5PC9hPgorW2NvbXBpbGVyXSBJbnZhbGlkIGZpZWxkIGluaXRpYWxpemVyIG5vdCBmbGFnZ2VkIGFzIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMjcxMyI+MjEyNzEzPC9hPgorQmFkIGVycm9yIG1lc3NhZ2UgZm9yIHN0YXRpYyBibG9jayBpbnNpZGUgYW4gaW50ZXJmYWNlCiAKLTxhIG5hbWU9InZfNzA1Ij48L2E+Cis8YSBuYW1lPSJ2X0IwMSI+PC9hPgogPGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyAzLjNNMSAtIDI1dGggSnVseSAyMDA2Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcwNQotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MDUiPmN2czwvYT4pLgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00xIC0gSnVseSA2LCAyMDEwIC0gMy43TTEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQjAxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0IwMSI+Y3ZzPC9hPikuCiA8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTExOCI+MTUxMTE4PC9hPgotdmVyaWZpZXIgZXJyb3JzIG9jY3VyIHdoZW4gcnVubmluZyBvc2dpIHRlc3RzCis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTUzIj4zMTMxNTM8L2E+CitUb28gbWFueSBibG9ja2VkICZxdW90O1JlZnJlc2hpbmcgZXh0ZXJuYWwgZm9sZGVycyZxdW90OyBqb2JzIChGVVAgb2YgYnVnIDMwMjI5NSkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2NjU0Ij4zMTY2NTQ8L2E+CitJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lciByZWNlaXZlIHNwdXJpb3VzIGNhbGxiYWNrcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc4NTgiPjMxNzg1ODwvYT4KK0VjbGlwc2UgaXNuJ3QgYWNjZXNzaW5nIHRoZSBjb3JyZWN0IGZpZWxkL2NsYXNzIC0gY2F1c2VzIGNvbXBpbGUgZXJyb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MTcxIj4zMTgxNzE8L2E+CitmaWVsZEhpZGluZy1XYXJuaW5nIGRvZXMgbm90IGFwcGVhciBpZiBjbGFzc2VzIGFyZSBpbiBkaWZmZXJlbnQgcGFja2FnZXMKIAotPGEgbmFtZT0idl83MDQiPjwvYT4KKzxhIG5hbWU9InZfQjAwIj48L2E+CiA8aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00xIC0gMTh0aCBKdWx5IDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzA0Ci0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwNCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPldpbGRjYXJkIGNhcHR1cmVzIGFyZSBub3cgaW5kaWNhdGluZyBzb21lIElEIHRvIGJldHRlciBhZGRyZXNzIGFtYmlndWl0aWVzIGluIGVycm9yIG1lc3NhZ2VzCi08YnI+ZS5nLiBub3cgdGVsbGluZzogPGNvZGU+Y2FwdHVyZSMyLW9mID8gZXh0ZW5kcyBOdW1iZXI8L2NvZGU+IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggPGNvZGU+Y2FwdHVyZSMxLW9mID8gZXh0ZW5kcyBOdW1iZXI8L2NvZGU+Ci08YnI+YXMgb3Bwb3NlZCB0bzogPGNvZGU+Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPC9jb2RlPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIDxjb2RlPmNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcjwvY29kZT4KLShhbHNvIHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTczIj4xNDk1NzM8L2E+KS48L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkzMTciPjEyOTMxNzwvYT4KLU91dGxpbmUgdmlldyBpbmNvbnNpc3RlbnQgd2l0aCBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyODc1Ij4xMDI4NzU8L2E+Ci1jb2RlIGFzc2lzdCBzaG91bGQgcHJvcG9zZSB0eXBlcyBldmVuIGlmIHRoZXJlJ3Mgbm8gaW5pdGlhbCBjaGFyYWN0ZXIocykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk1ODQiPjEyOTU4NDwvYT4KLUphdmEgbW9kZWwgZ2l2ZXMgZGlmZmVyZW50IHJlc3VsdHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA3NTgiPjE1MDc1ODwvYT4KLVsxLjVdW2NvbXBpbGVyXSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBpbnRlcm5hbCBjb21waWxlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDA3NCI+MTUwMDc0PC9hPgotW2NvbXBpbGVyXSBpbml0IHBhcnQgb2YgZm9yIGVhY2ggbG9vcCB3aXRoIGVtcHR5IGJvZHkgaXMgbm90IGV4ZWN1dGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDI4Ij4xNDkwMjg8L2E+Ci1MaW1pdGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIHdpdGggdGhlIGZpbGUgc2l6ZSBpcyBpbnZhbGlkLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTg5MyI+MTQ5ODkzPC9hPgotWzEuNV0gQ29tcGlsYXRpb24gZXJyb3I6IFRoZSBtZXRob2QgaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTM3NiI+MTQ5Mzc2PC9hPgotSW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igb24gImltcG9ydCBzdGF0aWMiCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTczIj4xNDk1NzM8L2E+Ci1bMS41XVtjb21waWxlcl0gSW1wcm92ZSByZWFkYWJsZSBuYW1lIG9mIHdpbGRjYXJkIGNhcHR1cmVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4MDczIj4xMjgwNzM8L2E+Ci1Db250ZW50IEFzc2lzdCBzaG91bGQgZ2l2ZSBzdGF0aWMgZmllbGRzIGFuZCBtZXRob2RzIGRlY2xhcmVkIGluIHRhcmdldCB0eXBlIGhpZ2hlciByZWxldmFuY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkwNDMiPjE0OTA0MzwvYT4KLVVucmVzb2x2YWJsZSBjbGFzc3BhdGggY29udGFpbmVyIGxlYWRzIHRvIGxvdHMgb2Ygc2NoZWR1bGVkIGpvYnMKLQotPGEgbmFtZT0idl83MDMiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTEgLSA0dGggSnVseSAyMDA2Ci08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcwMwotKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MDMiPmN2czwvYT4pLgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuN00xIC0gSnVuZSAyOSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9CMDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQjAwIj5jdnM8L2E+KS4KIDxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDEzIj4xNDkwMTM8L2E+Ci1bamF2YWRvY10gSW4gbGF0ZXN0IDMuMyBidWlsZCwgdGhlcmUgaXMgYSBqYXZhZG9jIGVycm9yIGluIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5ODU3Ij4xMTk4NTc8L2E+Ci1bamF2YWRvY10gU29tZSBpbm5lciBjbGFzcyByZWZlcmVuY2VzIHNob3VsZCBiZSBmbGFnZ2VkIGFzIHVucmVzb2x2ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMzMDQiPjEwMzMwNDwvYT4KLVtKYXZhZG9jXSBXcm9uZyByZWZlcmVuY2UgcHJvcG9zYWwgZm9yIGlubmVyIGNsYXNzZXMuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4Nzk3Ij4xNDg3OTc8L2E+Ci1TeW50YXggZXJyb3IgaW4gamF2YSBjbGFzcyByZXN1bHRzIGluIEFTVD1udWxsLWVycm9yIG9uICJvcmdhbml6ZSBpbXBvcnRzIgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODc0MiI+MTQ4NzQyPC9hPgotWzUuMF1bY29udGVudCBhc3Npc3RdIEFubm90YXRpb24gY29udGVudCBhc3Npc3Qgbm90IHdvcmtpbmcgaW4gYWxsIGNhc2VzIGZvciBwYXJhbWV0ZXJzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzAyIj4xMTczMDI8L2E+Ci1DbGVhbiBidWlsZCBvZiBsYXJnZSBwcm9qZWN0IGdpdmVzIHVucmVzb2x2ZWQgdHlwZSBlcnJvcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc4NzUiPjE0Nzg3NTwvYT4KLVsxLjVdW2NvbXBpbGVyXSBOUEUgd2hlbiBpbml0aWFsaXppbmcgYW5ub3RhdGlvbnMgb2YgYSBiaW5hcnkgZmllbGQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYwMTIiPjE0NjAxMjwvYT4KLU5vIEZfQ09OVEVOVCBmbGFnIG9uIGRlbHRhIHdoZW4gcmV2ZXJ0aW5nIHRvIG9sZCBhbm5vdGF0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODk3MCI+MTQ4OTcwPC9hPgotRXhjZXB0aW9ucyBvcGVuaW5nIGV4dGVybmFsIEphdmEgZmlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODk0OSI+MTQ4OTQ5PC9hPgotSmFyRW50cnlGaWxlIG5vdyByZXR1cm5pbmcgJ251bGwnCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwODY1Ij4xMjA4NjU8L2E+Ci1JQ29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSguLikgc2hvdWxkIG5vdCB0aHJvdyBpbnRlcm5hbCBBRkUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzNzAiPjE0ODM3MDwvYT4KLVtmb3JtYXR0ZXJdIG5ldyBDbGFzcyZsdDs/Jmd0O1tdIHt9IGtpbGxzIGZvcm1hdHRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODAxMCI+MTQ4MDEwPC9hPgotQ29kZSBzZWxlY3QgZG9lc24ndCBmaW5kIGJpbmFyeSBwYXJhbWV0ZXJpemVkIG1ldGhvZAorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzg0MSI+MzE3ODQxPC9hPgorW2luY3JlbWVudGFsIGJ1aWxkXSB1bm5lY2Vzc2FyeSAnc3RydWN0dXJhbCBjaGFuZ2VzJyBkdWUgdG8gYW5ub3RhdGlvbiBwYXJhbWV0ZXJzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzQ2OCI+MzE3NDY4PC9hPgorQWRkaW5nIGVsZW1lbnRzIHRvIGFuIGVudW0gYm9keSB3aXRoIHRyYWlsaW5nIGNvbW1hIGdlbmVyYXRlcyBiYWQgY29kZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTM2NjgiPjMxMzY2ODwvYT4KK1tzZWFyY2hdIENhbGwgaGllcmFyY2h5IGRvZXNuJ3Qgc2hvdyBhbGwgY2FsbHMgb2YgdGhlIG1ldGhvZCBpbiB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3OTcyIj4zMTc5NzI8L2E+CitGaXggZm9yIHdyb25nIHVzYWdlcyBvZiBhZmZlY3QqIGFuZCBlZmZlY3QqCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzY1MSI+MzEzNjUxPC9hPgorW2Zvcm1hdHRlcl0gZm9ybWF0IGNvbW1lbnRzIChkaWZmZXJzIGJldHdlZW4gcGFzdGUgYW5kIHNhdmUgYWN0aW9uKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTY4ODkiPjMxNjg4OTwvYT4KK0ludGVybmFsIGNvbXBpbGVyIGVycm9yOiBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gd2l0aCBhIHNwZWNpZmljIHVzZSBvZiByZWN1cnNpdmUgZ2VuZXJpY3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE1OTc4Ij4zMTU5Nzg8L2E+CitCaWcgcmVncmVzc2lvbiwgZWNsaXBzZSBjb21waWxlcyBteSB3b3Jrc3BhY2UgaW4gMyBtaW5zIGluc3RlYWQgb2YgZmV3IHNlY29uZHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE1NTc3Ij4zMTU1Nzc8L2E+CitbZm9ybWF0dGVyXSBObyBsaW5lIGJyZWFrIGFmdGVyICZsdDticiZndDsgaWYgZm9sbG93ZWQgYnkge0BsaW5rIHdoZW4gZm9ybWF0dGluZyBqYXZhIHNvdXJjZSBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjQ2NCI+MzA2NDY0PC9hPgorTlBFIGluIFByb2JsZW1SZXBvcnRlci5taXNzaW5nVHlwZUluTWV0aG9kKFByb2JsZW1SZXBvcnRlci5qYXZhOjUxMTMpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzIxMiI+MzE3MjEyPC9hPgorW2NvbXBpbGVyXSBJbGxlZ2FsIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBjb25zdHJ1Y3RvciBvZiBhIG1lbWJlciBjbGFzcyBvZiBhbiBpbmFjY2Vzc2libGUgdHlwZS4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MzQ2Ij4xOTUzNDY8L2E+CitbYXNzaXN0XSBBcnJheSB0eXBlIHNob3VsZCBiZSBmaWx0ZXJlZCB3aGlsZSBjb21wbGV0aW5nIGluIGNhc2Ugb2YgYSBzd2l0Y2gKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE1NzMyIj4zMTU3MzI8L2E+CitbZm9ybWF0dGVyXSBOdWxsUG9pbnRlckV4Y2VwdGlvbiAoYWx3YXlzKSBvbiBpbnNlcnRpbmcgYSBjdXN0b20gdGVtcGxhdGUgcHJvcG9zYWwgaW50byBqYXZhIGNvZGUgd2hlbiAmcXVvdDtVc2UgY29kZSBmb3JtYXR0ZXImcXVvdDsgaXMgb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2NDU2Ij4zMTY0NTY8L2E+CitbMS41XVtjb21waWxlcl0gQW5ub3RhdGlvbiB2YWx1ZXMgY2FuIGFjY2VzcyBwcml2YXRlIGNsYXNzIG1lbWJlcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEyOTg5Ij4zMTI5ODk8L2E+CitBY2NlcHRzIGlsbGVnYWwgbWV0aG9kLWxvY2FsIGNsYXNzZXMgaWYgaGlkZGVuIGJ5IGdlbmVyaWNzIHBhcmFtZXRlcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwNDIzIj4zMTA0MjM8L2E+CitbY29udGVudCBhc3Npc3RdIEFmdGVyICdpbXBsZW1lbnRzJyBhbm5vdGF0aW9uIHR5cGVzIHNob3VsZCBub3QgYmUgcHJvcG9zZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0ODMwIj4zMTQ4MzA8L2E+CitbY29tcGlsZXJdIFN3aXRjaGluZyBvbiBhIG51bGwgZXhwcmVzc2lvbiBkb2Vzbid0IGFsd2F5cyB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTM4MjUiPjMxMzgyNTwvYT4KK0Vycm9uZW91cyBsb2NhbCB2YXJpYWJsZSdzIHByb2JsZW1zIHJlcG9ydGVkIGF0IHN1cnJvdW5kaW5nIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDg5OCI+MzE0ODk4PC9hPgorVHlwbyBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZUVudmlyb21lbnRXaXRoUHJvZ3Jlc3MKIAotPGEgbmFtZT0idl83MDIiPjwvYT4KLTxocj48aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgMy4zTTEgLSAyN3RoIEp1bmUgMjAwNgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDIKLSg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzAyIj5jdnM8L2E+KS4KLTxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+QWRkIG5ldyBTZWFyY2ggQVBJIG1ldGhvZCB0byBzdXBwb3J0IHBhdHRlcm5zIGZvciBwYWNrYWdlL2VuY2xvc2luZyB0eXBlIG5hbWUgd2hpbGUgc2VhcmNoaW5nIGFsbCB0eXBlcyBuYW1lcwotKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIyNjQiPjkyMjY0PC9hPikuPGJyPgotPHByZT4KLS8qKgotICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCi0gKiBUaGUgc2VhcmNoIGNhbiBiZSBzZWxlY3Rpbmcgc3BlY2lmaWMgdHlwZXMgKGdpdmVuIGEgcGFja2FnZSBuYW1lIHVzaW5nIHNwZWNpZmljIG1hdGNoIG1vZGUKLSAqIGFuZC9vciBhIHR5cGUgbmFtZSB1c2luZyBhbm90aGVyIHNwZWNpZmljIG1hdGNoIG1vZGUpLgotICoKLSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBwYWNrYWdlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcywgb3IgYSBwcmVmaXggZm9yIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyBwYWNrYWdlLgotICogQHBhcmFtIHR5cGVOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWFyY2hlZCB0eXBlICh0aGUgcXVhbGlmaWNhdGlvbiBpbmNsdWRlCi0gKiAgICAgICAgICAgICAgICAgdGhlIGVuY2xvc2luZyB0eXBlcyBpZiB0aGUgc2VhcmNoZWQgdHlwZSBpcyBhIG1lbWJlciB0eXBlKSwgb3IgYSBwcmVmaXgKLSAqICAgICAgICAgICAgICAgICBmb3IgdGhpcyB0eXBlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyB0eXBlLgotICogQHBhcmFtIHBhY2thZ2VNYXRjaFJ1bGUgb25lIG9mCi0gKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzCi0gKiAgICAgICAgICAgIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KLSAqICAgICAgICAuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcwotICogICAgICAgICAgICBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCi0gKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuCi0gKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9NQVRDSH0gaWYgdHlwZSBuYW1lIGFyZSBjYW1lbCBjYXNlIG9mIHRoZSBuYW1lcyBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCi0gKiAgICBjb21iaW5lZCB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9LAotICogICAgICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsCi0gKiAgICAgICBvciB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZC4KLSAqIEBwYXJhbSB0eXBlTWF0Y2hSdWxlIG9uZSBvZgotICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSB0aGUgZnVsbCBuYW1lcwotICogICAgICAgICAgICBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCi0gKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSBwcmVmaXhlcyBvZiB0aGUgbmFtZXMKLSAqICAgICAgICAgICAgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLgotICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgY29udGFpbiB3aWxkLWNhcmRzLgotICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHR5cGUgbmFtZSBhcmUgY2FtZWwgY2FzZSBvZiB0aGUgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLgotICogICAgIGNvbWJpbmVkIHdpdGgge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0sCi0gKiAgICAgICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwKLSAqICAgICAgIG9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgotICogQHBhcmFtIHNlYXJjaEZvciBkZXRlcm1pbmVzIHRoZSBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnRzCi0gKiAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1N9OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMKLSAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGludGVyZmFjZXMKLSAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNFTlVNfTogb25seSBsb29rIGZvciBlbnVtZXJhdGlvbgotICogICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FOTk9UQVRJT05fVFlQRX06IG9ubHkgbG9vayBmb3IgYW5ub3RhdGlvbiB0eXBlCi0gKiAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0VOVU19OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGVudW1lcmF0aW9ucwotICogICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NMQVNTX0FORF9JTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKLSAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpZS4gY2xhc3NlcywgaW50ZXJmYWNlcywgZW51bSBhbmQgYW5ub3RhdGlvbiB0eXBlcykKLSAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgdG8gc2VhcmNoIGluCi0gKiBAcGFyYW0gbmFtZVJlcXVlc3RvciB0aGUgcmVxdWVzdG9yIHRoYXQgY29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaAotICogQHBhcmFtIHdhaXRpbmdQb2xpY3kgb25lIG9mCi0gKiAgICAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjRk9SQ0VfSU1NRURJQVRFX1NFQVJDSH0gaWYgdGhlIHNlYXJjaCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkKLSAqICAgICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSH0gaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FuY2VsbGVkIGlmIHRoZQotICogICAgICAgICAgICB1bmRlcmx5aW5nIGluZGV4ZXIgaGFzIG5vdCBmaW5pc2hlZCBpbmRleGluZyB0aGUgd29ya3NwYWNlCi0gKiAgICAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0h9IGlmIHRoZSBzZWFyY2ggc2hvdWxkIHdhaXQgZm9yIHRoZQotICogICAgICAgICAgICB1bmRlcmx5aW5nIGluZGV4ZXIgdG8gZmluaXNoIGluZGV4aW5nIHRoZSB3b3Jrc3BhY2UKLSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvLCBvciBudWxsIGlmIG5vIHByb2dyZXNzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgaXMgcHJvdmlkZWQKLSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6Ci0gKiAgICAgICAgLiB0aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldAotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JZmluYWwgY2hhcltdIHBhY2thZ2VOYW1lLAotCWZpbmFsIGludCBwYWNrYWdlTWF0Y2hSdWxlLAotCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKLQlmaW5hbCBpbnQgdHlwZU1hdGNoUnVsZSwKLQlpbnQgc2VhcmNoRm9yLAotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCi0JZmluYWwgVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKLQlpbnQgd2FpdGluZ1BvbGljeSwKLQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLTwvcHJlPgotTm90ZSB0aGF0IGFscmVhZHkgZXhpc3RpbmcgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzKGNoYXIgW10sIGNoYXJbXSwgaW50LCBpbnQsIElKYXZhU2VhcmNoU2NvcGUsIFR5cGVOYW1lUmVxdWVzdG9yLCBpbnQsIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPiBBUEkgbWV0aG9kIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0ZWQgdGhlIGZhY3QKLXRoYXQgcGFja2FnZSBuYW1lIGlzIGFuIGV4YWN0IG5hbWUgYW5kIGRvZXMgbm90IGFjY2VwdCB3aWxkY2FyZHMuCi08L2xpPgotPGxpPkluY3JlbWVudGVkIHBsdWctaW4gdmVyc2lvbiBJRCB0byAmcXVvdDszLjMuMCZxdW90OyBkdWUgdG8gbmV3bHkgYWRkZWQgQVBJIG1ldGhvZCAoc2VlIGRldGFpbHMgYWJvdmUpLjwvbGk+Ci08bGk+SHVnZSBTdHJpbmcgY29uY2F0ZW5hdGlvbnMgLSB0aG91c2FuZHMgb2YgdGVybXMgYW5kIGJleW9uZCAtIGFyZSBub3cKLSAgICBoYW5kbGVkIHNtb290aGx5IGJ5IHRoZSBjb21waWxlciBldmVuIHdoZW4gdGhleSBhcmUgbm90IHNvbGVseSBjb21wcmlzZWQgb2YKLSAgICBsaXRlcmFscyBhbmQgb3RoZXIgY29uc3RhbnRzIChjZi4gYnVnCi0gICAgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNzI4Ij4xMDI3Mjg8L2E+KS4KLSAgICA8L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgyNzgiPjE0ODI3ODwvYT4KLURlZmF1bHQtcGFja2FnZSBjbGFzc2VzIG1pc3NpbmcgaW4gUGFja2FnZSBFeHBsb3JlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODM1MiI+MTQ4MzUyPC9hPgotTkxTIHdhcm5pbmcgc2hvd3MgdXAgb24gaW5jb21wbGV0ZSBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNzI4Ij4xMDI3Mjg8L2E+Ci1bY29tcGlsZXJdIFJlZHVjZSB0aGUgc3RhY2sgZGVwdGggZGVtYW5kcyBvZiBleHRlbmRlZCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBBU1RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNTMwIj4xNDI1MzA8L2E+Ci1baGllcmFyY2hpY2FsIHBhY2thZ2VzXSAnLicgaW4gZm9sZGVyIG5hbWVzIGNvbmZ1c2VzIHBhY2thZ2UgZXhwbG9yZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg1MjMiPjE0ODUyMzwvYT4KLVtiYXRjaF0gQmF0Y2ggY29tcGlsZXIgb3V0cHV0IGNvbnRhaW5zIGV4dHJhIGxpbmVicmVhayBiZWZvcmUgbGluZSBwb3NpdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzQ4NSI+MTQ3NDg1PC9hPgotQW5vbnltb3VzIHR5cGUgbWlzc2luZyBmcm9tIGphdmEgbW9kZWwKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwODYiPjExMTA4NjwvYT4KLVsxLjVdW2NvbXBpbGVyXSBDb21waWxlciBhY2NlcHRzIGNhbGwgdG8gcGFyYW1ldGVyaXplZCBtZXRob2Qgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODIxNSI+MTQ4MjE1PC9hPgotW3NlYXJjaF0gRXhjZXB0aW9uIHdoaWxlIHNlYXJjaGluZyBmb3IgZGVjbGFyYXRpb25zIG9mIHJlZmVyZW5jZWQgdHlwZXMgaW4gYmluYXJ5IGphdmEgZWxlbWVudHMgcGFja2FnZWQgaW4gYSBqYXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYzMzEiPjE0NjMzMTwvYT4KLUphdmEgRWRpdG9yIHdvbid0IHNhdmUgZmlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTM2NyI+MTQ1MzY3PC9hPgotRmFpbGluZyB0byBvcGVuIGEgYmluYXJ5IG1lbWJlciBsZWF2ZXMgY2FjaGUgaW5jb25zaXN0ZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTYyMzciPjk2MjM3PC9hPgotW2phdmFkb2NdIElubmVyIHR5cGVzIG11c3QgYmUgcXVhbGlmaWVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIyNjQiPjkyMjY0PC9hPgotW3NlYXJjaF0gYWxsIHR5cGVzIG5hbWVzIHNob3VsZCBzdXBwb3J0IHBhdHRlcm5zIGZvciBwYWNrYWdlL2VuY2xvc2luZyB0eXBlIG5hbWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDI3MjAiPjEwMjcyMDwvYT4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZSBzcGVjIGluY29tcGxldGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgwMTUiPjE0ODAxNTwvYT4KLU5QRSBpbiBsb2cgZnJvbSBDbGFzc3BhdGhDaGFuZ2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMyMTIiPjE0MzIxMjwvYT4KLUlBRSBpbiBsb2cKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU1NDQiPjE0NTU0NDwvYT4KLUNvbW1lbnQgaW5kZW50YXRpb24gd3Jvbmcgd2hlbiB1c2luZyBzdW4gY29udmVudGlvbnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYyMTQiPjE0NjIxNDwvYT4KLVJlZmFjdG9yIFhtbFdyaXR0ZXIgYW5kIE1haW4uTG9nZ2VyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3ODc3Ij4xNDc4Nzc8L2E+Ci1zb3VyY2UgZW5kIG9mIGFycmF5IGFjY2VzcyBpc24ndCBjb3JyZWN0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1MDA3Ij4xNDUwMDc8L2E+Ci1bMS41XVtqYXZhZG9jXSBHZW5lcmljcyArIElubmVyIENsYXNzIC0mZ3Q7IEphdmFkb2MgJnF1b3Q7bWlzc2luZyBAdGhyb3dzJnF1b3Q7IHdhcm5pbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc2OTAiPjE0NzY5MDwvYT4KLVsxLjVdW2NvbXBpbGVyXSBJbmNvbXBhdGlibGUgc2VyaWFsdmVyc2lvbnVpZCB3aGVuIHVzaW5nIGNvdmFyaWFudCBpbiBKYXZhIDEuNQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Nzc0NyI+MTQ3NzQ3PC9hPgotbWF4IHN0YWNrIGZvciBjbGluaXQgb2YgZW51bSBvdmVyZXN0aW1hdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMDU5Ij4xNDIwNTk8L2E+Ci1bZWZzXSByZW5hbWluZyBwYWNrYWdlIGZhaWxzIHRvIHVwZGF0ZSByZWZlcmVuY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMDEzIj4xNDMwMTM8L2E+Ci1TV1RFeGNlcHRpb246IEZhaWxlZCB0byBleGVjdXRlIHJ1bm5hYmxlICguLi5BYm9ydENvbXBpbGF0aW9uKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzAyNCI+MTQ3MDI0PC9hPgotW2NvbXBpbGVyXSBDb21waWxlciBidWcgd2hlbiBhY2Nlc3Npbmcgc3RhdGljIGZpbmFsIGF0dHJpYnV0ZSBpbiBhIG5vbi1zdGF0aWMgd2F5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNjg0Ij4xNDM2ODQ8L2E+Ci1DcmVhdGluZyBvZiBzdGF0aWMgaW1wb3J0cyBpcyB1bmF2YWlsYWJsZS4uCi0KLTxhIG5hbWU9InZfNzAxIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00xIC0gMjB0aCBKdW5lIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzAxCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwMSI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPkZpeCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNjY3Ij5idWcgMTIwNjY3PC9hPiByZXF1aXJlZCB0aGUgaW5kZXggdmVyc2lvbiB0byBiZSBpbmNyZW1lbnRlZC4KLSAgICAgSW5kZXhlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVnZW5lcmF0ZWQgdXBvbiBzdWJzZXF1ZW50IHNlYXJjaCBxdWVyaWVzIChhY2NvdW50aW5nIGZvciBpbmRleGluZyBub3RpZmljYXRpb24gaW4gc2VhcmNoIHByb2dyZXNzIGRpYWxvZ3MpLgotPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NzM2Ij4xNDc3MzY8L2E+Ci1DbGFzc0Nhc3RFeGNlcHRpb24gaW4gVHlwZUhpZXJhcmNoeQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzA5Ij45MTcwOTwvYT4KLVsxLjVdW21vZGVsXSBRdWljayBGaXggRXJyb3IgYnV0IG5vIFByb2JsZW0gUmVwb3J0ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDczODEiPjE0NzM4MTwvYT4KLVsxLjVdW2NvbXBpbGVyXSBHZW5lcmljcyBkaXNjcmVwYW5jeSBiZXR3ZWVuIEVjbGlwc2UgY29tcGlsZXIgYW5kIFN1biBjb21waWxlci4KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk1NTUiPjEzOTU1NTwvYT4KLVtoaWVyYXJjaHldIE9wZW5pbmcgYSBjbGFzcyBmcm9tIFR5cGUgaGllcmFyY2h5IHdpbGwgZ2l2ZSB0aGUgd3Jvbmcgb25lIGlmIHNvdXJjZSBhbmQgY29tcGlsZWQgYXJlIGluIGRlZmluZWQgaW4gcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDU3MyI+MTQ0NTczPC9hPgotY29tcGlsYXRpb25QYXJ0aWNpcGFudCBleHRlbnNpb24gcG9pbnQgc2NoZW1hIGluY29tcGxldGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU4MzUiPjE0NTgzNTwvYT4KLWdldEphdmFDbGFzc0xpYnMgbmVlZHMgdG8gYWNjb3VudCBmb3IgSUJNIEoyU0UgMS41Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1MzMzIj4xNDUzMzM8L2E+Ci1baGllcmFyY2h5XSBSZXNvbHZpbmcgdG9vIG11Y2gKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI0NDQiPjEyMjQ0NDwvYT4KLVtoaWVyYXJjaHldIFR5cGUgaGllcmFyY2h5IG9mIGlubmVyIG1lbWJlciB0eXBlIG1pc3NlcyBhbm9ueW1vdXMgc3VidHlwZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ4OTQiPjExNDg5NDwvYT4KLVtjb21waWxlcl0gQ29tcGlsZXIgZ2VuZXJhdGUgZGVhZCBieXRlY29kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzA5NiI+MTQ3MDk2PC9hPgotZWNqLmphciBtYW5pZmVzdCBzaG91bGQgbm90IHVzZSB4LWZyaWVuZHMsIGJ1dCB1c2UgeC1pbnRlcm5hbD10cnVlIGluc3RlYWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYwMTUiPjE0NjAxNTwvYT4KLVNvbWUgSkRUL0NvcmUgdGVzdHMgcmVzdWx0cyBhcmUgc3RpbGwgVk0gZGVwZW5kZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNjY3Ij4xMjA2Njc8L2E+Ci1baGllcmFyY2h5XSBUeXBlIGhpZXJhcmNoeSBmb3IgZW51bSB0eXBlIGRvZXMgbm90IGluY2x1ZGUgYW5vbnltb3VzIHN1YnR5cGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2MzI0Ij4xNDYzMjQ8L2E+Ci1CYXRjaCBidWlsZHMgcHJvZHVjZSAiVGhlIHR5cGUgWCBpcyBhbHJlYWR5IGRlZmluZWQiIGVycm9ycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjYxNSI+MTQ2NjE1PC9hPgotW2hpZXJhcmNoeV0gVHlwZUhpZXJhcmNoeVRlc3RzIGlzIHRlc3RzIG9yZGVyIGRlcGVuZGVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjIwNyI+MTQyMjA3PC9hPgotW2JhdGNoXVtvcHRpb25zXSBTb3VyY2UvdGFyZ2V0IGxldmVsIG5hbWVzIDUgYW5kIDUuMCBtaXNzaW5nIGZyb20gYmF0Y2gKLWNvbXBpbGVyIGhlbHAgbWVzc2FnZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2NzM0Ij43NjczNDwvYT4KLVtjbGFzc3BhdGhdIEF0dGVtcCB0byBsb2NrIHdvcmtzcGFjZSBkdXJpbmcgY29udGFpbmVyIGluaXRpYWxpemF0aW9uCi0KLTxhIG5hbWU9InZfNzAwIj48L2E+Ci08aHI+PGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIDMuM00xIC0gMTN0aCBKdW5lIDIwMDYKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzAwCi0oPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwMCI+Y3ZzPC9hPikuCi08aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPlByb2dyZXNzaXZlIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGJhdGNoIGNvbXBpbGVyLjxicj4KLQlUaGUgbmV3IDx0dD4taGVscDp3YXJuPC90dD4gb3B0aW9uIGRpc3BsYXlzIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMKLSAgICBwYXJhbWV0ZXJzIGFwcGxpY2FibGUgdG8gdGhlIDx0dD4td2FybjwvdHQ+IG9wdGlvbjsgdGhlc2UgZGV0YWlscyBhcmUgbm8KLSAgICBtb3JlIHBhcnQgb2YgdGhlIGdlbmVyYWwgaGVscCBtZXNzYWdlLCB3aGljaCBpcyB0aHVzIG1vcmUgY29tcGFjdAotICAgIChjZi4gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDI0OCI+MTQ0MjQ4PC9hPikuCi0gICAgPC9saT4KLTxsaT5Db21waWxlciBpcyBub3cgYmV0dGVyIHJlc2lsaWVudCB0byBkdXBsaWNhdGUgbG9jYWwgdmFyaWFibGVzLCB0aHVzIGFsbG93aW5nIGZ1cnRoZXIKLW9wZXJhdGlvbiB0byBzdGlsbCBiZSBjYXJyaWVkIG91dCBhY2N1cmF0ZWx5IChjb2Rlc2VsZWN0LCBjb21wbGV0aW9uLCBzZWFyY2gsIERPTSBBU1Qgb3BzKQotKGNmLiBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0ODU4Ij4xNDQ4NTg8L2E+KS48L2xpPgotPC91bD4KLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYyMTUiPjE0NjIxNTwvYT4KLUpEVCBDb3JlIHRlc3RzIHNob3VsZCBub3QgYmUgZGVwZW5kZW50IG9uIEhhc2hNYXAgaW1wbGVtZW50YXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ4NTgiPjE0NDg1ODwvYT4KLVtjb21waWxlcl0gU2hvdWxkIGJlIG1vcmUgcmVzaWxpZW50IHdpdGggZHVwbGljYXRlIGxvY2FscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTc0NiI+MTQ1NzQ2PC9hPgotWzEuNV1bY29tcGlsZXJdIEVudW0gc3ludGhldGljIG1ldGhvZHMgc2hvdWxkIGJlIGltcHJvdmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzMyIj4xNDU3MzI8L2E+Ci1bMS41XVtjb21waWxlcl0gSW5jb25zaXN0ZW50IGJlaGF2aW9yIGluIEVDSiBjb2RlIGZvciBlbnVtIHR5cGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NTE2Ij4xNDU1MTY8L2E+Ci1CYWQgcGVyZm9ybWFuY2Ugd2hlbiBjb21waWxpbmcgYSBqYXZhIGZpbGUgd2l0aCBub24gamF2YSBjb250ZW50Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyODk3Ij4xNDI4OTc8L2E+Ci1bMS41XVtjb21waWxlcl0gQ29tcGlsZXIgY2Fubm90IHJlc29sdmUgdHlwZSBvZiBpbm5lciBjbGFzcyBvZiBhIGJvdW5kZWQgZ2VuZXJpYyB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0OTc2Ij4xNDQ5NzY8L2E+Ci1baGllcmFyY2h5XSBOUEUgaW4gUmVmZXJlbmNlQmluZGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTUwMCI+MTQ1NTAwPC9hPgotW2hpZXJhcmNoeV0gU3VwZXJjbGFzcyBjb3VsZCBiZSBtb3JlIHJlc2lsaWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDg2NiI+MTQ0ODY2PC9hPgotW2Fzc2lzdF1bamF2YWRvY10gV3JvbmcgY29tcGxldGlvbiBpbnNpZGUgQHZhbHVlIHRhZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDQxNCI+MTQ0NDE0PC9hPgotSkRUIENvbXBpbGVyIGZhaWxzIHdoaWxlIHN0YW5kYXJkIGphdmFjIGNvbXBpbGVyIGNhbiBwcm9jZWVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNzcyIj4xNDI3NzI8L2E+Ci1bMS41XVtjb21waWxlcl0gQ29tcGlsYXRpb24gc3VjY2VlZHMgd2l0aCBzdGF0aWMgaW1wb3J0cyB0aGF0IGZhaWwgd2l0aCBqYXZhYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzI1OSI+MTQzMjU5PC9hPgotWzEuNV1bY29tcGlsZXJdIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoICwgRWNsaXBzZSAzLjJSQzQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ0MjYiPjE0NDQyNjwvYT4KLVtjb21waWxlcl0gQ29tcGlsZXIgaW5jb3JyZWN0bHkgcmVwb3J0cyAiYXNzaWdubWVudCB0byB2YXJpYWJsZSBoYXMgbm8gZWZmZWN0IiB3aGVuIGl0IGlzIGEgZHVwbGljYXRlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MjQ4Ij4xNDQyNDg8L2E+Ci1bYmF0Y2hdIFByb2dyZXNzaXZlIGhlbHAgdGV4dAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxMiI+MTQxNTEyPC9hPgotW2JhdGNoXSByZS1mb3JtYXQgdGhlIGhlbHAgbWVzc2FnZSBzbyBhcyB0byBmaXQgaW50byA4MCBjb2x1bW5zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNTIyIj4xNDE1MjI8L2E+Ci1bY29tcGlsZXJdW2JhdGNoXSBDbGFzc0ZpbGUjYnVpbGRBbGxEaXJlY3Rvcmllc0ludG8gc2hvdWxkIHByb3RlY3QgaXRzZWxmCi1hZ2FpbnN0IGNvbmN1cnJlbnQgZGlyZWN0b3J5IGNyZWF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMzMwIj4xNDEzMzA8L2E+Ci1bMS41XVtjb21waWxlcl0gU3VzcGljaW91cyBlcnJvciBtZXNzYWdlIGZvciB0eXBlIG1pc21hdGNoCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMjUyIj4xNDEyNTI8L2E+Ci1bMS42XV1bY29tcGlsZXJdIENsYXNzRm9ybWF0RXJyb3I6IElsbGVnYWwgY2xhc3MgbmFtZSAiIiBpbiBjbGFzcyBmaWxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxODEwIj4xNDE4MTA8L2E+Ci1bMS41XVtjb21waWxlcl0gRW51bSBzd2l0Y2ggdGFibGVzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEzMjciPjE0MTMyNzwvYT4KLVN0YWNrRnJhbWUgYW5kIFZlcmlmaWNhdGlvblR5cGVJbmZvIG11c3QgY2FsbCBzdXBlci5jbG9uZSgpIGluIHRoZWlyIGNsb25lKCkgbWV0aG9kCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNDc2Ij4xNDA0NzY8L2E+Ci1KRE9NOiBJRE9NVHlwZS5zZXRTdXBlckludGVyZmFjZXMobmV3IFN0cmluZyBbMF0pIGZhaWxzIHRvIHJlbW92ZSBleGlzdGluZyBpbXBsZW1lbnRzIGNsYXVzZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjQzMCI+MTMyNDMwPC9hPgotWzEuNV1bamF2YWRvY10gVW53YW50ZWQgbWlzc2luZyB0YWcgd2FybmluZyBmb3Igb3ZlcnJpZGRlbiBtZXRob2Qgd2l0aCBwYXJhbWV0ZXIgY29udGFpbmluZyB0eXBlIHZhcmlhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNzUyIj4xMzA3NTI8L2E+Ci1bY29tbWVudHNdIGZpcnN0IEJsb2NrQ29tbWVudCBwYXJzZWQgYXMgTGluZUNvbW1lbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxNTYiPjE0MDE1NjwvYT4KLVsxLjVdW3NlYXJjaF0gSW52YWxpZCBtZXRob2QgaGFuZGxlIHdpdGggcGFyYW1ldGVyaXplZCBwYXJhbWV0ZXJzIHdoZW4gbm8gc291cmNlIGlzIGF0dGFjaGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjc5Ij4xMjM2Nzk8L2E+Ci1bc2VhcmNoXSBtaXNzaW5nIGljb24gb3IgYmFkIGhpdCBpbiBzZWFyY2ggcmVzdWx0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTU1MCI+MTQxNTUwPC9hPgotRW5hYmxlIG5vdyBwYXNzaW5nIHRlc3RzCiAKIDxocj4KLTxwPkZvciBlYXJsaWVyIGJ1aWxkIG5vdGVzLCBhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMl9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwiPmJ1aWxkIG5vdGVzIHVwIHRvIFJlbGVhc2UgMy4yPC9hPi48L3A+Cis8cD5Gb3IgZWFybGllciBidWlsZCBub3RlcywgYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzZfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIj5idWlsZCBub3RlcyB1cCB0byBSZWxlYXNlIDMuNjwvYT4uPC9wPgogPGJyPgogICA8cD4KICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjaz91cmk9cmVmZXJlciI+PGltZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRWxlbWVudE5vdGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25FbGVtZW50Tm90aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQyN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRWxlbWVudE5vdGlmaWVyLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uQXJndW1lbnROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25PbkZpZWxkTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25PbktleXdvcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uS2V5d29yZDI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uTWV0aG9kTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25NZXRob2RSZXR1cm5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25Pbk1ldGhvZFR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuU291cmNlRWxlbWVudE5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3RUb0ludDsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25FbGVtZW50Tm90aWZpZXIgZXh0ZW5kcyBTb3VyY2VFbGVtZW50Tm90aWZpZXIgeworCisJcHJpdmF0ZSBBU1ROb2RlIGFzc2lzdE5vZGU7CisKKwlwdWJsaWMgQ29tcGxldGlvbkVsZW1lbnROb3RpZmllcigKKwkJCUNvbXBsZXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJCWJvb2xlYW4gcmVwb3J0TG9jYWxEZWNsYXJhdGlvbnMsCisJCQlBU1ROb2RlIGFzc2lzdE5vZGUpIHsKKwkJc3VwZXIocmVxdWVzdG9yLCByZXBvcnRMb2NhbERlY2xhcmF0aW9ucyk7CisJCXRoaXMuYXNzaXN0Tm9kZSA9IGFzc2lzdE5vZGU7CisJfQorCisJcHJvdGVjdGVkIGNoYXJbXVtdW10gZ2V0QXJndW1lbnRzKEFyZ3VtZW50W10gYXJndW1lbnRzKSB7CisJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWNoYXJbXVtdIGFyZ3VtZW50VHlwZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKKwkJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IG5ldyBjaGFyW2FyZ3VtZW50TGVuZ3RoXVtdOworCQlpbnQgYXJndW1lbnRDb3VudCA9IDA7CisJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspIHsKKwkJCUFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOworCisJCQlpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Bcmd1bWVudE5hbWUgJiYgYXJndW1lbnQubmFtZS5sZW5ndGggPT0gMCkgY29udGludWUgbmV4dDsKKworCQkJYXJndW1lbnRUeXBlc1thcmd1bWVudENvdW50XSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChhcmd1bWVudC50eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQkJYXJndW1lbnROYW1lc1thcmd1bWVudENvdW50KytdID0gYXJndW1lbnQubmFtZTsKKwkJfQorCisJCWlmIChhcmd1bWVudENvdW50IDwgYXJndW1lbnRMZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRUeXBlcywgMCwgYXJndW1lbnRUeXBlcyA9IG5ldyBjaGFyW2FyZ3VtZW50Q291bnRdW10sIDAsIGFyZ3VtZW50Q291bnQpOworCQkJU3lzdGVtLmFycmF5Y29weShhcmd1bWVudE5hbWVzLCAwLCBhcmd1bWVudE5hbWVzID0gbmV3IGNoYXJbYXJndW1lbnRDb3VudF1bXSwgMCwgYXJndW1lbnRDb3VudCk7CisJCX0KKworCQlyZXR1cm4gbmV3IGNoYXJbXVtdW10ge2FyZ3VtZW50VHlwZXMsIGFyZ3VtZW50TmFtZXN9OworCX0KKworCXByb3RlY3RlZCBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCWNoYXJbXVtdIGludGVyZmFjZU5hbWVzID0gbnVsbDsKKwkJaW50IHN1cGVySW50ZXJmYWNlc0xlbmd0aCA9IDA7CisJCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzOworCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCXN1cGVySW50ZXJmYWNlc0xlbmd0aCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7CisJCQlpbnRlcmZhY2VOYW1lcyA9IG5ldyBjaGFyW3N1cGVySW50ZXJmYWNlc0xlbmd0aF1bXTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCkgeworCQkJCS8vIHNlZSBQUiAzNDQyCisJCQkJUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSB0eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbjsKKwkJCQlpZiAoYWxsb2MgIT0gbnVsbCAmJiBhbGxvYy50eXBlICE9IG51bGwpIHsKKwkJCQkJc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbXSB7IGFsbG9jLnR5cGV9OworCQkJCQlzdXBlckludGVyZmFjZXNMZW5ndGggPSAxOworCQkJCQlpbnRlcmZhY2VOYW1lcyA9IG5ldyBjaGFyWzFdW107CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJaW50IHN1cGVySW50ZXJmYWNlQ291bnQgPSAwOworCQkJbmV4dDogZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXNMZW5ndGg7IGkrKykgeworCQkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV07CisKKwkJCQlpZiAoc3VwZXJJbnRlcmZhY2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25LZXl3b3JkKSBjb250aW51ZSBuZXh0OworCQkJCWlmIChDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5oYXNFbXB0eU5hbWUoc3VwZXJJbnRlcmZhY2UsIHRoaXMuYXNzaXN0Tm9kZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQlpbnRlcmZhY2VOYW1lc1tzdXBlckludGVyZmFjZUNvdW50KytdID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVySW50ZXJmYWNlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQkJfQorCisJCQlpZiAoc3VwZXJJbnRlcmZhY2VDb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKKwkJCWlmIChzdXBlckludGVyZmFjZUNvdW50IDwgc3VwZXJJbnRlcmZhY2VzTGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VOYW1lcywgMCwgaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhcltzdXBlckludGVyZmFjZUNvdW50XVtdLCAwLCBzdXBlckludGVyZmFjZUNvdW50KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW50ZXJmYWNlTmFtZXM7CisJfQorCisJcHJvdGVjdGVkIGNoYXJbXSBnZXRTdXBlcmNsYXNzTmFtZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCVR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzOworCisJCWlmIChzdXBlcmNsYXNzIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uS2V5d29yZCkgcmV0dXJuIG51bGw7CisJCWlmIChDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5oYXNFbXB0eU5hbWUoc3VwZXJjbGFzcywgdGhpcy5hc3Npc3ROb2RlKSkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIHN1cGVyY2xhc3MgIT0gbnVsbCA/IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlcmNsYXNzLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpIDogbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgY2hhcltdW10gZ2V0VGhyb3duRXhjZXB0aW9ucyhBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7CisJCWNoYXJbXVtdIHRocm93bkV4Y2VwdGlvblR5cGVzID0gbnVsbDsKKwkJVHlwZVJlZmVyZW5jZVtdIHRocm93bkV4Y2VwdGlvbnMgPSBtZXRob2REZWNsYXJhdGlvbi50aHJvd25FeGNlcHRpb25zOworCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQlpbnQgdGhyb3duRXhjZXB0aW9uTGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7CisJCQlpbnQgdGhyb3duRXhjZXB0aW9uQ291bnQgPSAwOworCQkJdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBuZXcgY2hhclt0aHJvd25FeGNlcHRpb25MZW5ndGhdW107CisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd25FeGNlcHRpb25MZW5ndGg7IGkrKykgeworCQkJCVR5cGVSZWZlcmVuY2UgdGhyb3duRXhjZXB0aW9uID0gdGhyb3duRXhjZXB0aW9uc1tpXTsKKworCQkJCWlmICh0aHJvd25FeGNlcHRpb24gaW5zdGFuY2VvZiBDb21wbGV0aW9uT25LZXl3b3JkKSBjb250aW51ZSBuZXh0OworCQkJCWlmIChDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5oYXNFbXB0eU5hbWUodGhyb3duRXhjZXB0aW9uLCB0aGlzLmFzc2lzdE5vZGUpKSBjb250aW51ZSBuZXh0OworCisJCQkJdGhyb3duRXhjZXB0aW9uVHlwZXNbdGhyb3duRXhjZXB0aW9uQ291bnQrK10gPQorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhyb3duRXhjZXB0aW9uLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQkJfQorCisJCQlpZiAodGhyb3duRXhjZXB0aW9uQ291bnQgPT0gMCkgcmV0dXJuIG51bGw7CisJCQlpZiAodGhyb3duRXhjZXB0aW9uQ291bnQgPCB0aHJvd25FeGNlcHRpb25MZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRocm93bkV4Y2VwdGlvblR5cGVzLCAwLCB0aHJvd25FeGNlcHRpb25UeXBlcyA9IG5ldyBjaGFyW3Rocm93bkV4Y2VwdGlvbkNvdW50XVtdLCAwLCB0aHJvd25FeGNlcHRpb25Db3VudCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRocm93bkV4Y2VwdGlvblR5cGVzOworCX0KKworCXByb3RlY3RlZCBjaGFyW11bXSBnZXRUeXBlUGFyYW1ldGVyQm91bmRzKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgeworCQlUeXBlUmVmZXJlbmNlIGZpcnN0Qm91bmQgPSB0eXBlUGFyYW1ldGVyLnR5cGU7CisJCVR5cGVSZWZlcmVuY2VbXSBvdGhlckJvdW5kcyA9IHR5cGVQYXJhbWV0ZXIuYm91bmRzOworCQljaGFyW11bXSB0eXBlUGFyYW1ldGVyQm91bmRzID0gbnVsbDsKKwkJaWYgKGZpcnN0Qm91bmQgIT0gbnVsbCkgeworCQkJaWYgKG90aGVyQm91bmRzICE9IG51bGwpIHsKKwkJCQlpbnQgb3RoZXJCb3VuZHNMZW5ndGggPSBvdGhlckJvdW5kcy5sZW5ndGg7CisJCQkJY2hhcltdW10gYm91bmROYW1lcyA9IG5ldyBjaGFyW290aGVyQm91bmRzTGVuZ3RoKzFdW107CisJCQkJaW50IGJvdW5kQ291bnQgPSAwOworCQkJCWlmICghQ29tcGxldGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuaGFzRW1wdHlOYW1lKGZpcnN0Qm91bmQsIHRoaXMuYXNzaXN0Tm9kZSkpIHsKKwkJCQkJYm91bmROYW1lc1tib3VuZENvdW50KytdID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGZpcnN0Qm91bmQuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7CisJCQkJfQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3RoZXJCb3VuZHNMZW5ndGg7IGorKykgeworCQkJCQlUeXBlUmVmZXJlbmNlIG90aGVyQm91bmQgPSBvdGhlckJvdW5kc1tqXTsKKwkJCQkJaWYgKCFDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5oYXNFbXB0eU5hbWUob3RoZXJCb3VuZCwgdGhpcy5hc3Npc3ROb2RlKSkgeworCQkJCQkJYm91bmROYW1lc1tib3VuZENvdW50KytdID0KKwkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgob3RoZXJCb3VuZC5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChib3VuZENvdW50ID09IDApIHsKKwkJCQkJYm91bmROYW1lcyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCQkJCX0gZWxzZSBpZiAoYm91bmRDb3VudCA8IG90aGVyQm91bmRzTGVuZ3RoICsgMSl7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYm91bmROYW1lcywgMCwgYm91bmROYW1lcyA9IG5ldyBjaGFyW2JvdW5kQ291bnRdW10sIDAsIGJvdW5kQ291bnQpOworCQkJCX0KKwkJCQl0eXBlUGFyYW1ldGVyQm91bmRzID0gYm91bmROYW1lczsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5oYXNFbXB0eU5hbWUoZmlyc3RCb3VuZCwgdGhpcy5hc3Npc3ROb2RlKSkgeworCQkJCQl0eXBlUGFyYW1ldGVyQm91bmRzID0gbmV3IGNoYXJbXVtdIHsgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGZpcnN0Qm91bmQuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyl9OworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0eXBlUGFyYW1ldGVyQm91bmRzID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCX0KKworCQlyZXR1cm4gdHlwZVBhcmFtZXRlckJvdW5kczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlLCBJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UpIHsKKwkJaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgcmV0dXJuOworCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZXRob2RUeXBlUGFyYW1ldGVyKSByZXR1cm47CisJCWlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1ldGhvZE5hbWUpIHJldHVybjsKKwkJc3VwZXIubm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihtZXRob2REZWNsYXJhdGlvbiwgZGVjbGFyaW5nVHlwZSwgY3VycmVudFBhY2thZ2UpOworCX0KKworCXB1YmxpYyB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBib29sZWFuIHJlcG9ydFJlZmVyZW5jZSwgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCBzb3VyY2VFbmRzTWFwLCBNYXAgbm9kZXNUb0NhdGVnb3JpZXNNYXApIHsKKwkJc3VwZXIubm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihwYXJzZWRVbml0LCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCByZXBvcnRSZWZlcmVuY2UsIHNvdXJjZUVuZHNNYXAsIG5vZGVzVG9DYXRlZ29yaWVzTWFwKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUpIHsKKwkJaWYgKGZpZWxkRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDb21wbGV0aW9uT25GaWVsZFR5cGUpIHJldHVybjsKKwkJaWYgKGZpZWxkRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDb21wbGV0aW9uT25GaWVsZE5hbWUpIHJldHVybjsKKwkJc3VwZXIubm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihmaWVsZERlY2xhcmF0aW9uLCBkZWNsYXJpbmdUeXBlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIGJvb2xlYW4gaXNQYWNrYWdlKSB7CisJCWlmIChpbXBvcnRSZWZlcmVuY2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25LZXl3b3JkMikgcmV0dXJuOworCQlpZiAoaW1wb3J0UmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlIHx8CisJCQkJaW1wb3J0UmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSkgeworCQkJaWYgKGltcG9ydFJlZmVyZW5jZS50b2tlbnNbaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMCkgcmV0dXJuOworCQl9CisKKwkJc3VwZXIubm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihpbXBvcnRSZWZlcmVuY2UsIGlzUGFja2FnZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBib29sZWFuIG5vdGlmeVR5cGVQcmVzZW5jZSwgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUsIEltcG9ydFJlZmVyZW5jZSBjdXJyZW50UGFja2FnZSkgeworCQlpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uQW5ub3RhdGlvbk9mVHlwZSkgcmV0dXJuOworCQlzdXBlci5ub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKHR5cGVEZWNsYXJhdGlvbiwgbm90aWZ5VHlwZVByZXNlbmNlLCBkZWNsYXJpbmdUeXBlLCBjdXJyZW50UGFja2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25FbmdpbmUuamF2YQppbmRleCBkYzMzYmJmLi44YjdjNTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25FbmdpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25FbmdpbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw2ICsxNCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Db250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25GbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7CkBAIC0yMyw4ICsyNSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2F0ZWdvcml6ZWRQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CkBAIC0zNiwxMiArNDAsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLktleXdvcmRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRXh0cmFGbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuUmVmZXJlbmNlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNvdXJjZVR5cGVDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5KYXZhZG9jVGFnQ29uc3RhbnRzOwpAQCAtNTYsMTIgKzYwLDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmFzaWNDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSU5hbWluZ1JlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZUNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5TZWFyY2hhYmxlRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZUVsZW1lbnRJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZy5KYXZhU2VhcmNoTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNvdXJjZSBjb21wbGV0aW9ucy4KQEAgLTcyLDQ1ICs3OSwxMTMgQEAKIAlleHRlbmRzIEVuZ2luZQogCWltcGxlbWVudHMgSVNlYXJjaFJlcXVlc3RvciwgVHlwZUNvbnN0YW50cyAsIFRlcm1pbmFsVG9rZW5zICwgUmVsZXZhbmNlQ29uc3RhbnRzLCBTdWZmaXhDb25zdGFudHMgewogCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2VwdGVkQ29uc3RydWN0b3IgeworCQlwdWJsaWMgaW50IG1vZGlmaWVyczsKKwkJcHVibGljIGNoYXJbXSBzaW1wbGVUeXBlTmFtZTsKKwkJcHVibGljIGludCBwYXJhbWV0ZXJDb3VudDsKKwkJcHVibGljIGNoYXJbXSBzaWduYXR1cmU7CisJCXB1YmxpYyBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlczsKKwkJcHVibGljIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzOworCQlwdWJsaWMgaW50IHR5cGVNb2RpZmllcnM7CisJCXB1YmxpYyBjaGFyW10gcGFja2FnZU5hbWU7CisJCXB1YmxpYyBpbnQgZXh0cmFGbGFnczsKKwkJcHVibGljIGludCBhY2Nlc3NpYmlsaXR5OworCQlwdWJsaWMgYm9vbGVhbiBwcm9wb3NlVHlwZSA9IGZhbHNlOworCQlwdWJsaWMgYm9vbGVhbiBwcm9wb3NlQ29uc3RydWN0b3IgPSBmYWxzZTsKKwkJcHVibGljIGNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBudWxsOworCQkKKwkJcHVibGljIGJvb2xlYW4gbXVzdEJlUXVhbGlmaWVkID0gZmFsc2U7CisJCQorCQlwdWJsaWMgQWNjZXB0ZWRDb25zdHJ1Y3RvcigKKwkJCQlpbnQgbW9kaWZpZXJzLAorCQkJCWNoYXJbXSBzaW1wbGVUeXBlTmFtZSwKKwkJCQlpbnQgcGFyYW1ldGVyQ291bnQsCisJCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwkJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCQljaGFyW10gcGFja2FnZU5hbWUsCisJCQkJaW50IGV4dHJhRmxhZ3MsCisJCQkJaW50IGFjY2Vzc2liaWxpdHkpIHsKKwkJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCQkJdGhpcy5zaW1wbGVUeXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lOworCQkJdGhpcy5wYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlckNvdW50OworCQkJdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisJCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7CisJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gcGFyYW1ldGVyTmFtZXM7CisJCQl0aGlzLnR5cGVNb2RpZmllcnMgPSB0eXBlTW9kaWZpZXJzOworCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworCQkJdGhpcy5leHRyYUZsYWdzID0gZXh0cmFGbGFnczsKKwkJCXRoaXMuYWNjZXNzaWJpbGl0eSA9IGFjY2Vzc2liaWxpdHk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ3snKTsKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5wYWNrYWdlTmFtZSk7CisJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuc2ltcGxlVHlwZU5hbWUpOworCQkJYnVmZmVyLmFwcGVuZCgnfScpOworCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2VwdGVkVHlwZSB7CisJCXB1YmxpYyBjaGFyW10gcGFja2FnZU5hbWU7CisJCXB1YmxpYyBjaGFyW10gc2ltcGxlVHlwZU5hbWU7CisJCXB1YmxpYyBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXM7CisJCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCQlwdWJsaWMgaW50IGFjY2Vzc2liaWxpdHk7CisJCXB1YmxpYyBib29sZWFuIG11c3RCZVF1YWxpZmllZCA9IGZhbHNlOworCisJCXB1YmxpYyBjaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gbnVsbDsKKwkJcHVibGljIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSA9IG51bGw7CisJCXB1YmxpYyBBY2NlcHRlZFR5cGUoCisJCQljaGFyW10gcGFja2FnZU5hbWUsCisJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCisJCQlpbnQgbW9kaWZpZXJzLAorCQkJaW50IGFjY2Vzc2liaWxpdHkpIHsKKwkJCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKwkJCXRoaXMuc2ltcGxlVHlwZU5hbWUgPSBzaW1wbGVUeXBlTmFtZTsKKwkJCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzID0gZW5jbG9zaW5nVHlwZU5hbWVzOworCQkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQl0aGlzLmFjY2Vzc2liaWxpdHkgPSBhY2Nlc3NpYmlsaXR5OworCQl9CisKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIuYXBwZW5kKCd7Jyk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMucGFja2FnZU5hbWUpOworCQkJYnVmZmVyLmFwcGVuZCgnLCcpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnNpbXBsZVR5cGVOYW1lKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJCWJ1ZmZlci5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ30nKTsKKwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCX0KKwkKIAlwdWJsaWMgY2xhc3MgQ29tcGxldGlvblByb2JsZW1GYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFByb2JsZW1GYWN0b3J5IHsKIAkJcHJpdmF0ZSBpbnQgbGFzdEVycm9yU3RhcnQ7Ci0JCQorCiAJCXByaXZhdGUgYm9vbGVhbiBjaGVja1Byb2JsZW1zID0gZmFsc2U7CiAJCXB1YmxpYyBib29sZWFuIGhhc0ZvcmJpZGRlblByb2JsZW1zID0gZmFsc2U7CiAJCXB1YmxpYyBib29sZWFuIGhhc0FsbG93ZWRQcm9ibGVtcyA9IGZhbHNlOwotCQkKKwogCQlwdWJsaWMgQ29tcGxldGlvblByb2JsZW1GYWN0b3J5KExvY2FsZSBsb2MpIHsKIAkJCXN1cGVyKGxvYyk7CiAJCX0KIAotCQlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCi0JCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwKLQkJCWludCBwcm9ibGVtSWQsCi0JCQlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAotCQkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKLQkJCWludCBzZXZlcml0eSwKLQkJCWludCBzdGFydCwKLQkJCWludCBlbmQsCi0JCQlpbnQgbGluZU51bWJlciwKLQkJCWludCBjb2x1bW5OdW1iZXIpIHsKLQkJCQotCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHBiID0gc3VwZXIuY3JlYXRlUHJvYmxlbSgKLQkJCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLAotCQkJCXByb2JsZW1JZCwKLQkJCQlwcm9ibGVtQXJndW1lbnRzLAotCQkJCW1lc3NhZ2VBcmd1bWVudHMsCi0JCQkJc2V2ZXJpdHksCi0JCQkJc3RhcnQsCi0JCQkJZW5kLAotCQkJCWxpbmVOdW1iZXIsCi0JCQkJY29sdW1uTnVtYmVyKTsKKwkJcHJpdmF0ZSBDYXRlZ29yaXplZFByb2JsZW0gY2hlY2tQcm9ibGVtKENhdGVnb3JpemVkUHJvYmxlbSBwYiwKKwkJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAlpbnQgc2V2ZXJpdHksIGludCBzdGFydCkgewogCQkJaW50IGlkID0gcGIuZ2V0SUQoKTsKIAkJCWlmIChDb21wbGV0aW9uRW5naW5lLnRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uID4gc3RhcnQKIAkJCQkmJiB0aGlzLmxhc3RFcnJvclN0YXJ0IDwgc3RhcnQKIAkJCQkmJiBwYi5pc0Vycm9yKCkKIAkJCQkmJiAoaWQgJiBJUHJvYmxlbS5TeW50YXgpID09IDAKIAkJCQkmJiAoQ29tcGxldGlvbkVuZ2luZS50aGlzLmZpbGVOYW1lID09IG51bGwgfHwgQ2hhck9wZXJhdGlvbi5lcXVhbHMoQ29tcGxldGlvbkVuZ2luZS50aGlzLmZpbGVOYW1lLCBvcmlnaW5hdGluZ0ZpbGVOYW1lKSkpIHsKLQkJCQkJCisKIAkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMucHJvYmxlbSA9IHBiOwogCQkJCXRoaXMubGFzdEVycm9yU3RhcnQgPSBzdGFydDsKIAkJCX0KQEAgLTEzOCw3MyArMjEzLDI2NCBAQAogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQl0aGlzLmhhc0ZvcmJpZGRlblByb2JsZW1zID0gdHJ1ZTsKIAkJCQkJCX0KLQkJCQkJCQorCiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJcmV0dXJuIHBiOwogCQl9Ci0JCQorCisJCXB1YmxpYyBDYXRlZ29yaXplZFByb2JsZW0gY3JlYXRlUHJvYmxlbSgKKwkJCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJCQlpbnQgcHJvYmxlbUlkLAorCQkJCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJCQkJaW50IGVsYWJvcmF0aW9uSWQsCisJCQkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKKwkJCQlpbnQgc2V2ZXJpdHksCisJCQkJaW50IHN0YXJ0LAorCQkJCWludCBlbmQsCisJCQkJaW50IGxpbmVOdW1iZXIsCisJCQkJaW50IGNvbHVtbk51bWJlcikgeworCQkJCXJldHVybiBjaGVja1Byb2JsZW0oCisJCQkJCXN1cGVyLmNyZWF0ZVByb2JsZW0oCisJCQkJCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCQkJCQkJcHJvYmxlbUlkLAorCQkJCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJCWVsYWJvcmF0aW9uSWQsCisJCQkJCQltZXNzYWdlQXJndW1lbnRzLAorCQkJCQkJc2V2ZXJpdHksCisJCQkJCQlzdGFydCwKKwkJCQkJCWVuZCwKKwkJCQkJCWxpbmVOdW1iZXIsCisJCQkJCQljb2x1bW5OdW1iZXIpLCBvcmlnaW5hdGluZ0ZpbGVOYW1lLCBzZXZlcml0eSwgc3RhcnQpOworCQl9CisKKwkJcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAorCQkJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCQkJCWludCBwcm9ibGVtSWQsCisJCQkJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwkJCQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAorCQkJCWludCBzZXZlcml0eSwKKwkJCQlpbnQgc3RhcnQsCisJCQkJaW50IGVuZCwKKwkJCQlpbnQgbGluZU51bWJlciwKKwkJCQlpbnQgY29sdW1uTnVtYmVyKSB7CisJCQkJcmV0dXJuIGNoZWNrUHJvYmxlbSgKKwkJCQkJc3VwZXIuY3JlYXRlUHJvYmxlbSgKKwkJCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUsCisJCQkJCQlwcm9ibGVtSWQsCisJCQkJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJCQkJbWVzc2FnZUFyZ3VtZW50cywKKwkJCQkJCXNldmVyaXR5LAorCQkJCQkJc3RhcnQsCisJCQkJCQllbmQsCisJCQkJCQlsaW5lTnVtYmVyLAorCQkJCQkJY29sdW1uTnVtYmVyKSwgb3JpZ2luYXRpbmdGaWxlTmFtZSwgc2V2ZXJpdHksIHN0YXJ0KTsKKwkJfQorCiAJCXB1YmxpYyB2b2lkIHN0YXJ0Q2hlY2tpbmdQcm9ibGVtcygpIHsKIAkJCXRoaXMuY2hlY2tQcm9ibGVtcyA9IHRydWU7CiAJCQl0aGlzLmhhc0ZvcmJpZGRlblByb2JsZW1zID0gZmFsc2U7CiAJCQl0aGlzLmhhc0FsbG93ZWRQcm9ibGVtcyA9IGZhbHNlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyB2b2lkIHN0b3BDaGVja2luZ1Byb2JsZW1zKCkgewogCQkJdGhpcy5jaGVja1Byb2JsZW1zID0gZmFsc2U7CiAJCX0KIAl9CisJCisJcHVibGljIHN0YXRpYyBjaGFyW10gY3JlYXRlQmluZGluZ0tleShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSkgeworCQljaGFyW10gc2lnbmF0dXJlID0gY3JlYXRlVHlwZVNpZ25hdHVyZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uoc2lnbmF0dXJlLCAnLicsICcvJyk7CisJCXJldHVybiBzaWduYXR1cmU7CisJfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXB0ZWRUeXBlIHsKLQkJcHVibGljIEFjY2VwdGVkVHlwZSgKLQkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKLQkJCWNoYXJbXSBzaW1wbGVUeXBlTmFtZSwKLQkJCWNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywKLQkJCWludCBtb2RpZmllcnMsCi0JCQlpbnQgYWNjZXNzaWJpbGl0eSkgewotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5zaW1wbGVUeXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lOwotCQkJdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgPSBlbmNsb3NpbmdUeXBlTmFtZXM7Ci0JCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLQkJCXRoaXMuYWNjZXNzaWJpbGl0eSA9IGFjY2Vzc2liaWxpdHk7CisJcHVibGljIHN0YXRpYyBjaGFyW11bXSBjcmVhdGVEZWZhdWx0UGFyYW1ldGVyTmFtZXMoaW50IGxlbmd0aCkgeworCQljaGFyW11bXSBwYXJhbWV0ZXJzOworCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJY2FzZSAwIDoKKwkJCQlwYXJhbWV0ZXJzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQlwYXJhbWV0ZXJzID0gQVJHUzE7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXBhcmFtZXRlcnMgPSBBUkdTMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMyA6CisJCQkJcGFyYW1ldGVycyA9IEFSR1MzOworCQkJCWJyZWFrOworCQkJY2FzZSA0IDoKKwkJCQlwYXJhbWV0ZXJzID0gQVJHUzQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlwYXJhbWV0ZXJzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJcGFyYW1ldGVyc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFSRywgU3RyaW5nLnZhbHVlT2YoaSkudG9DaGFyQXJyYXkoKSk7CisJCQkJfQorCQkJCWJyZWFrOwogCQl9Ci0JCXB1YmxpYyBjaGFyW10gcGFja2FnZU5hbWU7Ci0JCXB1YmxpYyBjaGFyW10gc2ltcGxlVHlwZU5hbWU7Ci0JCXB1YmxpYyBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXM7Ci0JCXB1YmxpYyBpbnQgbW9kaWZpZXJzOwotCQlwdWJsaWMgaW50IGFjY2Vzc2liaWxpdHk7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBtdXN0QmVRdWFsaWZpZWQgPSBmYWxzZTsKLQkJcHVibGljIGNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBudWxsOwotCQlwdWJsaWMgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQkJYnVmZmVyLmFwcGVuZChwYWNrYWdlTmFtZSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHNpbXBsZVR5cGVOYW1lKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlU2lnbmF0dXJlKSB7CisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVTaWduYXR1cmUgPSBuZXcgY2hhcltwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVTaWduYXR1cmUubGVuZ3RoOyBpKyspIHsKKwkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVbaV0gPQorCQkJCVNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKAorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSwKKwkJCQkJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KHBhcmFtZXRlclR5cGVOYW1lc1tpXSwgJy4nLCAnJCcpLCAnLicpLCB0cnVlKTsKIAkJfQorCisJCXJldHVybiBTaWduYXR1cmUuY3JlYXRlTWV0aG9kU2lnbmF0dXJlKAorCQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmUsCisJCQkJcmV0dXJuVHlwZVNpZ25hdHVyZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBjaGFyW10gY3JlYXRlTWV0aG9kU2lnbmF0dXJlKGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBjaGFyW10gcmV0dXJuUGFja2FnZW5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSkgeworCQljaGFyW10gcmV0dXJuVHlwZVNpZ25hdHVyZSA9CisJCQlyZXR1cm5UeXBlTmFtZSA9PSBudWxsIHx8IHJldHVyblR5cGVOYW1lLmxlbmd0aCA9PSAwCisJCQk/IFNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKFZPSUQsIHRydWUpCisJCQk6IFNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQlyZXR1cm5QYWNrYWdlbmFtZSwKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkocmV0dXJuVHlwZU5hbWUsICcuJywgJyQnKSwgJy4nKSwgdHJ1ZSk7CisKKwkJcmV0dXJuIGNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKKwkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAorCQkJCXJldHVyblR5cGVTaWduYXR1cmUpOworCX0KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShjaGFyW10gcXVhbGlmaWVkUGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSkgeworCQlyZXR1cm4gU2lnbmF0dXJlLmNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUoCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZSwKKwkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShxdWFsaWZpZWRUeXBlTmFtZSwgJy4nLCAnJCcpLCAnLicpLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVUeXBlU2lnbmF0dXJlKGNoYXJbXSBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lKSB7CisJCWNoYXJbXSBuYW1lID0gbmV3IGNoYXJbcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weShxdWFsaWZpZWRUeXBlTmFtZSwgMCwgbmFtZSwgMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKTsKKworCQlpbnQgZGVwdGggPSAwOworCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7CisJCWZvciAoaW50IGkgPSBsZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7CisJCQlzd2l0Y2ggKG5hbWVbaV0pIHsKKwkJCQljYXNlICcuJzoKKwkJCQkJaWYgKGRlcHRoID09IDAgJiYgbmFtZVtpIC0gMV0gIT0gJz4nKSB7CisJCQkJCQluYW1lW2ldID0gJyQnOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzwnOgorCQkJCQlkZXB0aC0tOworCQkJCQlicmVhazsKKwkJCQljYXNlICc+JzoKKwkJCQkJZGVwdGgrKzsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKAorCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUsCisJCQkJCQluYW1lLCAnLicpLCB0cnVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gZ2V0UmVxdWlyZWRUeXBlU2lnbmF0dXJlKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCWNoYXJbXSByZXN1bHQgPSBudWxsOworCQlTdHJpbmdCdWZmZXIgc2lnID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisKKwkJc2lnLmFwcGVuZCh0eXBlQmluZGluZy5zaWduYXR1cmUoKSk7CisKKwkJaW50IHNpZ0xlbmd0aCA9IHNpZy5sZW5ndGgoKTsKKwkJcmVzdWx0ID0gbmV3IGNoYXJbc2lnTGVuZ3RoXTsKKwkJc2lnLmdldENoYXJzKDAsIHNpZ0xlbmd0aCwgcmVzdWx0LCAwKTsKKwkJcmVzdWx0ID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KHJlc3VsdCwgJy8nLCAnLicpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gZ2V0VHlwZU5hbWUoVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CisJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlUmVmZXJlbmNlLmdldFR5cGVOYW1lKCksICcuJyk7CisJCWludCBkaW1zID0gdHlwZVJlZmVyZW5jZS5kaW1lbnNpb25zKCk7CisJCWlmIChkaW1zID4gMCkgeworCQkJaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKKwkJCWludCBuZXdMZW5ndGggPSBsZW5ndGggKyAoZGltcyoyKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWUsIDAsIHR5cGVOYW1lID0gbmV3IGNoYXJbbmV3TGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCWZvciAoaW50IGsgPSBsZW5ndGg7IGsgPCBuZXdMZW5ndGg7IGsgKz0gMikgeworCQkJCXR5cGVOYW1lW2tdID0gJ1snOworCQkJCXR5cGVOYW1lW2srMV0gPSAnXSc7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0eXBlTmFtZTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNTdGF0aWNNZW1iZXJUeXBlcyhSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nLCBTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSwgQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlKSB7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcyA9IHR5cGVCaW5kaW5nLm1lbWJlclR5cGVzKCk7CisJCWludCBsZW5ndGggPSBtZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsKKwkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW2ldOworCQkJaWYgKGludm9jYXRpb25UeXBlICE9IG51bGwgJiYgIW1lbWJlclR5cGUuY2FuQmVTZWVuQnkodHlwZUJpbmRpbmcsIGludm9jYXRpb25UeXBlKSkgeworCQkJCWNvbnRpbnVlIG5leHQ7CisJCQl9IGVsc2UgaWYoaW52b2NhdGlvblR5cGUgPT0gbnVsbCAmJiAhbWVtYmVyVHlwZS5jYW5CZVNlZW5CeSh1bml0U2NvcGUuZlBhY2thZ2UpKSB7CisJCQkJY29udGludWUgbmV4dDsKKwkJCX0KKwkJCQorCQkJaWYgKChtZW1iZXJUeXBlLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTWVtYmVyVHlwZXNJbkVuY2xvc2luZ1Njb3BlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSB0eXBlQmluZGluZy5tZW1iZXJUeXBlcygpOworCQlpbnQgbGVuZ3RoID0gbWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBtZW1iZXJUeXBlcy5sZW5ndGg7CisJCQorCQlpZiAobGVuZ3RoID4gMCkgeworCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOworCQkJaWYgKG1ldGhvZFNjb3BlICE9IG51bGwgJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljKSB7CisJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gdHlwZUJpbmRpbmcuc2NvcGU7CisJCQkJU2NvcGUgY3VycmVudFNjb3BlID0gc2NvcGU7CisJCQkJd2hpbGUgKGN1cnJlbnRTY29wZSAhPSBudWxsKSB7CisJCQkJCWlmIChjdXJyZW50U2NvcGUgPT0gY2xhc3NTY29wZSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KIAkKIAlwdWJsaWMgSGFzaHRhYmxlT2ZPYmplY3QgdHlwZUNhY2hlOworCXB1YmxpYyBpbnQgb3BlbmVkQmluYXJ5VHlwZXM7IC8vIHVzZWQgZHVyaW5nIEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsI2ZpbmRDb25zdHJ1Y3RvclBhcmFtZXRlck5hbWVzKCkKIAkKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUEVSRiA9IGZhbHNlOwogCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBLTk9XTl9UWVBFX1dJVEhfVU5LTk9XTl9DT05TVFJVQ1RPUlMgPSBuZXcgY2hhcltde307CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEtOT1dOX1RZUEVfV0lUSF9LTk9XTl9DT05TVFJVQ1RPUlMgPSBuZXcgY2hhcltde307CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFSRyA9ICJhcmciLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFSRzAgPSAiYXJnMCIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQVJHMSA9ICJhcmcxIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBBUkcyID0gImFyZzIiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFSRzMgPSAiYXJnMyIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTMSA9IG5ldyBjaGFyW11bXXtBUkcwfTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTMiA9IG5ldyBjaGFyW11bXXtBUkcwLCBBUkcxfTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTMyA9IG5ldyBjaGFyW11bXXtBUkcwLCBBUkcxLCBBUkcyfTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTNCA9IG5ldyBjaGFyW11bXXtBUkcwLCBBUkcxLCBBUkcyLCBBUkczfTsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0hFQ0tfQ0FOQ0VMX0ZSRVFVRU5DWSA9IDUwOworCQogCS8vIHRlbXBvcmFyeSBjb25zdGFudHMgdG8gcXVpY2tseSBkaXNhYmxlZCBwb2xpc2ggZmVhdHVyZXMgaWYgbmVjZXNzYXJ5CiAJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIE5PX1RZUEVfQ09NUExFVElPTl9PTl9FTVBUWV9UT0tFTiA9IGZhbHNlOwogCQogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBFUlJPUl9QQVRURVJOID0gIiplcnJvcioiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIEVYQ0VQVElPTl9QQVRURVJOID0gIipleGNlcHRpb24qIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBTRU1JQ09MT04gPSBuZXcgY2hhcltdIHsgJzsnIH07Ci0JCisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gQ0xBU1MgPSAiQ2xhc3MiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFZPSUQgPSAidm9pZCIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gSU5UID0gImludCIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKQEAgLTIxMiwxNSArNDc4LDE4IEBACiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFZBTFVFID0gInZhbHVlIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBFWFRFTkRTID0gImV4dGVuZHMiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFNVUEVSID0gInN1cGVyIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBERUZBVUxUX0NPTlNUUlVDVE9SX1NJR05BVFVSRSA9ICIoKVYiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCiAJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIERPVCA9ICIuIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFZBUkFSR1MgPSAiLi4uIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCQogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBJTVBPUlQgPSAiaW1wb3J0Ii50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBTVEFUSUMgPSAic3RhdGljIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBPTl9ERU1BTkQgPSAiLioiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIElNUE9SVF9FTkQgPSAiO1xuIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBKQVZBX0xBTkdfT0JKRUNUX1NJR05BVFVSRSA9IAorCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFfTEFOR19PQkpFQ1RfU0lHTkFUVVJFID0KIAkJY3JlYXRlVHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpLCBPQkpFQ1QpOwogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBKQVZBX0xBTkdfTkFNRSA9CiAJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChKQVZBX0xBTkcsICcuJyk7CkBAIC0yMjksMTkgKzQ5OCwxOSBAQAogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVVBFUlRZUEUgPSAxOwogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVUJUWVBFID0gMjsKIAkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRklFTEQgPSAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBMT0NBTCA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFSR1VNRU5UID0gMjsKLQorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBET1RfRU5VTSA9ICIuZW51bSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQogCWludCBleHBlY3RlZFR5cGVzUHRyID0gLTE7CiAJVHlwZUJpbmRpbmdbXSBleHBlY3RlZFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nWzFdOwogCWludCBleHBlY3RlZFR5cGVzRmlsdGVyOwogCWJvb2xlYW4gaGFzSmF2YUxhbmdPYmplY3RBc0V4cGVjdGVkVHlwZSA9IGZhbHNlOworCWJvb2xlYW4gaGFzRXhwZWN0ZWRBcnJheVR5cGVzID0gZmFsc2U7CisJYm9vbGVhbiBoYXNDb21wdXRlZEV4cGVjdGVkQXJyYXlUeXBlcyA9IGZhbHNlOwogCWludCB1bmludGVyZXN0aW5nQmluZGluZ3NQdHIgPSAtMTsKIAlCaW5kaW5nW10gdW5pbnRlcmVzdGluZ0JpbmRpbmdzID0gbmV3IEJpbmRpbmdbMV07CiAJaW50IGZvcmJiaWRlbkJpbmRpbmdzUHRyID0gLTE7CiAJQmluZGluZ1tdIGZvcmJiaWRlbkJpbmRpbmdzID0gbmV3IEJpbmRpbmdbMV07Ci0JaW50IGZvcmJiaWRlbkJpbmRpbmdzRmlsdGVyOworCWludCB1bmludGVyZXN0aW5nQmluZGluZ3NGaWx0ZXI7ICAgICAvLyBvbmx5IHNldCB3aGVuIGNvbXBsZXRpbmcgb24gYW4gZXhjZXB0aW9uIHR5cGUKIAkKIAlJbXBvcnRCaW5kaW5nW10gZmF2b3JpdGVSZWZlcmVuY2VCaW5kaW5nczsKIAkKQEAgLTI1MiwxNiArNTIxLDI0IEBACiAJYm9vbGVhbiBhc3Npc3ROb2RlSXNBbm5vdGF0aW9uOwogCWJvb2xlYW4gYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3I7CiAJYm9vbGVhbiBhc3Npc3ROb2RlSXNTdXBlclR5cGU7CisJYm9vbGVhbiBhc3Npc3ROb2RlSXNFeHRlbmRlZFR5cGU7CisJYm9vbGVhbiBhc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwNDIzCiAJaW50ICBhc3Npc3ROb2RlSW5KYXZhZG9jID0gMDsKIAlib29sZWFuIGFzc2lzdE5vZGVDYW5CZVNpbmdsZU1lbWJlckFubm90YXRpb24gPSBmYWxzZTsKKwlib29sZWFuIGFzc2lzdE5vZGVJc0luc2lkZUNhc2UgPSBmYWxzZTsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTM0NgorCWJvb2xlYW4gYXNzaXN0Tm9kZUlzU3RyaW5nID0gZmFsc2U7CS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM0NzYKIAkKIAlsb25nIHRhcmdldGVkRWxlbWVudDsKIAkKKwlXb3JraW5nQ29weU93bmVyIG93bmVyOworCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKIAlJSmF2YVByb2plY3QgamF2YVByb2plY3Q7CisJSVR5cGVSb290IHR5cGVSb290OwogCUNvbXBsZXRpb25QYXJzZXIgcGFyc2VyOwogCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yOwogCUNvbXBsZXRpb25Qcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeTsKIAlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOworCXByaXZhdGUgSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudCBub0NhY2hlTmFtZUVudmlyb25tZW50OwogCWNoYXJbXSBzb3VyY2U7CiAJY2hhcltdIGNvbXBsZXRpb25Ub2tlbjsKIAljaGFyW10gcXVhbGlmaWVkQ29tcGxldGlvblRva2VuOwpAQCAtMjcyLDEyICs1NDksMTIgQEAKIAlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IG51bGw7CiAJY2hhcltdIGZpbGVOYW1lID0gbnVsbDsKIAlpbnQgc3RhcnRQb3NpdGlvbiwgYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgb2Zmc2V0OworCWludCB0b2tlblN0YXJ0LCB0b2tlbkVuZDsKIAlpbnQgamF2YWRvY1RhZ1Bvc2l0aW9uOyAvLyBQb3NpdGlvbiBvZiBwcmV2aW91cyB0YWcgd2hpbGUgY29tcGxldGluZyBpbiBqYXZhZG9jCiAJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25Qa2dzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKIAlIYXNodGFibGVPZk9iamVjdCBrbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKLQlTY2FubmVyIG5hbWVTY2FubmVyOwotCi0JLyoKKwkKKyAJLyoKIAkJc3RhdGljIGZpbmFsIGNoYXJbXVtdIG1haW5EZWNsYXJhdGlvbnMgPQogCQkJbmV3IGNoYXJbXVtdIHsKIAkJCQkicGFja2FnZSIudG9DaGFyQXJyYXkoKSwKQEAgLTI4Nyw3ICs1NjQsNyBAQAogCQkJCSJwdWJsaWMiLnRvQ2hhckFycmF5KCksCiAJCQkJImNsYXNzIi50b0NoYXJBcnJheSgpLAogCQkJCSJpbnRlcmZhY2UiLnRvQ2hhckFycmF5KCl9OwotCQorCiAJCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBtb2RpZmllcnMgPSAvLyBtYXkgd2FudCBmaWVsZCwgbWV0aG9kLCB0eXBlICYgbWVtYmVyIHR5cGUgbW9kaWZpZXJzCiAJCQluZXcgY2hhcltdW10gewogCQkJCSJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKSwKQEAgLTMxNSwxOCArNTkyLDIzIEBACiAJfTsKIAlzdGF0aWMgZmluYWwgaW50IEJBU0VfVFlQRVNfTEVOR1RIID0gQkFTRV9UWVBFUy5sZW5ndGg7CiAJc3RhdGljIGZpbmFsIGNoYXJbXVtdIEJBU0VfVFlQRV9OQU1FUyA9IG5ldyBjaGFyW0JBU0VfVFlQRVNfTEVOR1RIXVtdOwotCXN0YXRpYyB7IAotCQlmb3IgKGludCBpPTA7IGk8QkFTRV9UWVBFU19MRU5HVEg7IGkrKykgewotCQkJQkFTRV9UWVBFX05BTUVTW2ldID0gQkFTRV9UWVBFU1tpXS5zaW1wbGVOYW1lOworCXN0YXRpYyBmaW5hbCBpbnQgQkFTRV9UWVBFU19XSVRIT1VUX1ZPSURfTEVOR1RIID0gQkFTRV9UWVBFUy5sZW5ndGggLSAxOworCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBCQVNFX1RZUEVfTkFNRVNfV0lUSE9VVF9WT0lEID0gbmV3IGNoYXJbQkFTRV9UWVBFU19XSVRIT1VUX1ZPSURfTEVOR1RIXVtdOworCXN0YXRpYyB7CisgCQlmb3IgKGludCBpPTA7IGk8QkFTRV9UWVBFU19MRU5HVEg7IGkrKykgeworIAkJCUJBU0VfVFlQRV9OQU1FU1tpXSA9IEJBU0VfVFlQRVNbaV0uc2ltcGxlTmFtZTsKKyAJCX0KKwkJZm9yIChpbnQgaT0wOyBpPEJBU0VfVFlQRVNfV0lUSE9VVF9WT0lEX0xFTkdUSDsgaSsrKSB7CisJCQlCQVNFX1RZUEVfTkFNRVNfV0lUSE9VVF9WT0lEW2ldID0gQkFTRV9UWVBFU1tpXS5zaW1wbGVOYW1lOwogCQl9Ci0JfQotCQkKKyAJfQorCQogCXN0YXRpYyBmaW5hbCBjaGFyW10gY2xhc3NGaWVsZCA9ICJjbGFzcyIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKIAlzdGF0aWMgZmluYWwgY2hhcltdIGxlbmd0aEZpZWxkID0gImxlbmd0aCIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKIAlzdGF0aWMgZmluYWwgY2hhcltdIGNsb25lTWV0aG9kID0gImNsb25lIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXN0YXRpYyBmaW5hbCBjaGFyW10gVEhJUyA9ICJ0aGlzIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXN0YXRpYyBmaW5hbCBjaGFyW10gVEhST1dTID0gInRocm93cyIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKLQkKKwogCXN0YXRpYyBJbnZvY2F0aW9uU2l0ZSBGYWtlSW52b2NhdGlvblNpdGUgPSBuZXcgSW52b2NhdGlvblNpdGUoKXsKIAkJcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKSB7IHJldHVybiBudWxsOyB9CiAJCXB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKXsgcmV0dXJuIGZhbHNlOyB9CkBAIC0zMzQsMTIgKzYxNiwxNyBAQAogCQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxSZWNlaXZlclR5cGUoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsvKiBlbXB0eSAqL30KIAkJcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKXsvKiBlbXB0eSAqL30KIAkJcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpey8qIGVtcHR5ICovfQotCQlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0KCkgeyByZXR1cm4gMDsgCX0KIAkJcHVibGljIGludCBzb3VyY2VFbmQoKSB7IHJldHVybiAwOyAJfQorCQlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0KCkgeyByZXR1cm4gMDsgCX0KKwkJcHVibGljIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSgpIHsgcmV0dXJuIG51bGw7IH0KIAl9OwotCQorCisJcHJpdmF0ZSBpbnQgZm91bmRUeXBlc0NvdW50OwogCXByaXZhdGUgT2JqZWN0VmVjdG9yIGFjY2VwdGVkVHlwZXM7CiAJCisJcHJpdmF0ZSBpbnQgZm91bmRDb25zdHJ1Y3RvcnNDb3VudDsKKwlwcml2YXRlIE9iamVjdFZlY3RvciBhY2NlcHRlZENvbnN0cnVjdG9yczsKKwogCS8qKgogCSAqIFRoZSBDb21wbGV0aW9uRW5naW5lIGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgc291cmNlIGNvbXBsZXRpb25zLgogCSAqCkBAIC0zNTEsNyArNjM4LDcgQEAKIAkgKiAgICAgIGJhc2VkIG9uIHBhcnRpYWwgbmFtZXMuCiAJICoKIAkgKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JQ29tcGxldGlvblJlcXVlc3RvcgotCSAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZSAKKwkgKiAgICAgIHNpbmNlIHRoZSBlbmdpbmUgbWlnaHQgcHJvZHVjZSBhbnN3ZXJzIG9mIHZhcmlvdXMgZm9ybXMsIHRoZSBlbmdpbmUKIAkgKiAgICAgIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlcXVlc3RvciBhYmxlIHRvIGFjY2VwdCBhbGwgcG9zc2libGUgY29tcGxldGlvbnMuCiAJICoKIAkgKiAgQHBhcmFtIHNldHRpbmdzIGphdmEudXRpbC5NYXAKQEAgLTM2MSw1OSArNjQ4LDczIEBACiAJCQlTZWFyY2hhYmxlRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50LAogCQkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCiAJCQlNYXAgc2V0dGluZ3MsCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJc3VwZXIoc2V0dGluZ3MpOwogCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7CiAJCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwogCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IG5hbWVFbnZpcm9ubWVudDsKIAkJdGhpcy50eXBlQ2FjaGUgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoNSk7CisJCXRoaXMub3BlbmVkQmluYXJ5VHlwZXMgPSAwOwogCiAJCXRoaXMucHJvYmxlbUZhY3RvcnkgPSBuZXcgQ29tcGxldGlvblByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpOwogCQl0aGlzLnByb2JsZW1SZXBvcnRlciA9IG5ldyBQcm9ibGVtUmVwb3J0ZXIoCiAJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksCiAJCQkJdGhpcy5jb21waWxlck9wdGlvbnMsCi0JCQkJcHJvYmxlbUZhY3RvcnkpOworCQkJCXRoaXMucHJvYmxlbUZhY3RvcnkpOwogCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0KIAkJCW5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgdGhpcy5wcm9ibGVtUmVwb3J0ZXIsIG5hbWVFbnZpcm9ubWVudCk7CiAJCXRoaXMucGFyc2VyID0KLQkJCW5ldyBDb21wbGV0aW9uUGFyc2VyKHRoaXMucHJvYmxlbVJlcG9ydGVyKTsKLQkJdGhpcy5uYW1lU2Nhbm5lciA9Ci0JCQluZXcgU2Nhbm5lcigKLQkJCQlmYWxzZSAvKmNvbW1lbnQqLywgCi0JCQkJZmFsc2UgLyp3aGl0ZXNwYWNlKi8sIAotCQkJCWZhbHNlIC8qbmxzKi8sIAotCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsLCAKLQkJCQludWxsIC8qdGFza1RhZ3MqLywgCi0JCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKLQkJCQl0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKKwkJCW5ldyBDb21wbGV0aW9uUGFyc2VyKHRoaXMucHJvYmxlbVJlcG9ydGVyLCB0aGlzLnJlcXVlc3Rvci5pc0V4dGVuZGVkQ29udGV4dFJlcXVpcmVkKCkpOworCQl0aGlzLm93bmVyID0gb3duZXI7CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJfQotCi0JLyoqCi0JICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHR5cGUuCi0JICoKLQkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgotCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCi0JICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5JIi4KLQkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoCi0JCWNoYXJbXSBwYWNrYWdlTmFtZSwKLQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAotCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCWludCBtb2RpZmllcnMsCi0JCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7Ci0KLQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCkgIT0gMCkgcmV0dXJuOworCQorCXB1YmxpYyB2b2lkIGFjY2VwdChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7CisJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoc291cmNlVW5pdC5nZXRNYWluVHlwZU5hbWUoKSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkpIHsKKwkJCS8vIGRvIG5vdCBhY2NlcHQgcGFja2FnZS1pbmZvLmphdmEgYXMgYSB0eXBlIGZvciBjb21wbGV0aW9uIGVuZ2luZQorCQkJLy8gYmVjYXVzZSBpdCBjb250YWlucyBubyBleHRyYSBpbmZvIHRoYXQgd2lsbCBoZWxwIGluIGNvbXBsZXRpb24KKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM4NjUKKwkJCS8vIFJlcXVpcmVkIGFmdGVyIHRoZSBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc4NjgKKwkJCS8vIGJlY2F1c2Ugbm93IHdlIGdldCBhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZS1pbmZvLmphdmEgZnJvbSB0aGUgamF2YSBtb2RlbC4KKwkJCXN1cGVyLmFjY2VwdChzb3VyY2VVbml0LCBhY2Nlc3NSZXN0cmljdGlvbik7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3IoCisJCQlpbnQgbW9kaWZpZXJzLAorCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAorCQkJaW50IHBhcmFtZXRlckNvdW50LAorCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJCWludCBleHRyYUZsYWdzLAorCQkJU3RyaW5nIHBhdGgsCisJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbikgewogCQkKKwkJLy8gZG9lcyBub3QgY2hlY2sgY2FuY2VsbGF0aW9uIGZvciBldmVyeSB0eXBlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBsb3NzCisJCWlmICgodGhpcy5mb3VuZENvbnN0cnVjdG9yc0NvdW50ICUgKENIRUNLX0NBTkNFTF9GUkVRVUVOQ1kpKSA9PSAwKSBjaGVja0NhbmNlbCgpOworCQl0aGlzLmZvdW5kQ29uc3RydWN0b3JzQ291bnQrKzsKKwkJCisJCWlmICgodHlwZU1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKSAhPSAwKSByZXR1cm47CisJCQorCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYgKHR5cGVNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCkgIT0gMCkgcmV0dXJuOworCiAJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5KSB7Ci0JCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgPT0gMCkgewotCQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMCkgcmV0dXJuOworCQkJaWYoKHR5cGVNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSA9PSAwKSB7CisJCQkJaWYoKHR5cGVNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMCkgcmV0dXJuOworCisJCQkJaWYgKHRoaXMuY3VycmVudFBhY2thZ2VOYW1lID09IG51bGwpIHsKKwkJCQkJaW5pdGlhbGl6ZVBhY2thZ2VDYWNoZSgpOworCQkJCX0KIAkJCQkKLQkJCQljaGFyW10gY3VycmVudFBhY2thZ2UgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy51bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lLCAnLicpOwotCQkJCWlmKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhwYWNrYWdlTmFtZSwgY3VycmVudFBhY2thZ2UpKSByZXR1cm47CisJCQkJaWYoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCB0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSkpIHJldHVybjsKIAkJCX0KIAkJfQotCQkKKwogCQlpbnQgYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRTsKIAkJaWYoYWNjZXNzUmVzdHJpY3Rpb24gIT0gbnVsbCkgewogCQkJc3dpdGNoIChhY2Nlc3NSZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSkgewpAQCAtNDMyLDgxICs3MzMsNTQ2IEBACiAJCQl9CiAJCX0KIAkJCi0JCWlmKGFjY2VwdGVkVHlwZXMgPT0gbnVsbCkgewotCQkJYWNjZXB0ZWRUeXBlcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJaWYodGhpcy5hY2NlcHRlZENvbnN0cnVjdG9ycyA9PSBudWxsKSB7CisJCQl0aGlzLmFjY2VwdGVkQ29uc3RydWN0b3JzID0gbmV3IE9iamVjdFZlY3RvcigpOwogCQl9Ci0JCWFjY2VwdGVkVHlwZXMuYWRkKG5ldyBBY2NlcHRlZFR5cGUocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIG1vZGlmaWVycywgYWNjZXNzaWJpbGl0eSkpOworCQl0aGlzLmFjY2VwdGVkQ29uc3RydWN0b3JzLmFkZCgKKwkJCQluZXcgQWNjZXB0ZWRDb25zdHJ1Y3RvcigKKwkJCQkJCW1vZGlmaWVycywKKwkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJcGFyYW1ldGVyQ291bnQsCisJCQkJCQlzaWduYXR1cmUsCisJCQkJCQlwYXJhbWV0ZXJUeXBlcywKKwkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJdHlwZU1vZGlmaWVycywKKwkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJZXh0cmFGbGFncywKKwkJCQkJCWFjY2Vzc2liaWxpdHkpKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGFjY2VwdFR5cGVzKFNjb3BlIHNjb3BlKSB7Ci0JCWlmKHRoaXMuYWNjZXB0ZWRUeXBlcyA9PSBudWxsKSByZXR1cm47CisJcHJpdmF0ZSB2b2lkIGFjY2VwdENvbnN0cnVjdG9ycyhTY29wZSBzY29wZSkgeworCQlmaW5hbCBib29sZWFuIERFRkVSX1FVQUxJRklFRF9QUk9QT1NBTFMgPSBmYWxzZTsKIAkJCi0JCWludCBsZW5ndGggPSB0aGlzLmFjY2VwdGVkVHlwZXMuc2l6ZSgpOworCQl0aGlzLmNoZWNrQ2FuY2VsKCk7CiAJCQorCQlpZih0aGlzLmFjY2VwdGVkQ29uc3RydWN0b3JzID09IG51bGwpIHJldHVybjsKKworCQlpbnQgbGVuZ3RoID0gdGhpcy5hY2NlcHRlZENvbnN0cnVjdG9ycy5zaXplKCk7CisKIAkJaWYobGVuZ3RoID09IDApIHJldHVybjsKIAkJCiAJCUhhc2h0YWJsZU9mT2JqZWN0IG9uRGVtYW5kRm91bmQgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoKTsKIAkJCi0JCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBY2NlcHRlZFR5cGUgYWNjZXB0ZWRUeXBlID0gKEFjY2VwdGVkVHlwZSl0aGlzLmFjY2VwdGVkVHlwZXMuZWxlbWVudEF0KGkpOwotCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gYWNjZXB0ZWRUeXBlLnBhY2thZ2VOYW1lOwotCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lID0gYWNjZXB0ZWRUeXBlLnNpbXBsZVR5cGVOYW1lOwotCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzID0gYWNjZXB0ZWRUeXBlLmVuY2xvc2luZ1R5cGVOYW1lczsKLQkJCWludCBtb2RpZmllcnMgPSBhY2NlcHRlZFR5cGUubW9kaWZpZXJzOwotCQkJaW50IGFjY2Vzc2liaWxpdHkgPSBhY2NlcHRlZFR5cGUuYWNjZXNzaWJpbGl0eTsKLQkJCQotCQkJY2hhcltdIHR5cGVOYW1lOwotCQkJY2hhcltdIGZsYXRFbmNsb3NpbmdUeXBlTmFtZXM7Ci0JCQlpZihlbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCB8fCBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID09IDApIHsKLQkJCQlmbGF0RW5jbG9zaW5nVHlwZU5hbWVzID0gbnVsbDsKLQkJCQl0eXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlmbGF0RW5jbG9zaW5nVHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFjY2VwdGVkVHlwZS5lbmNsb3NpbmdUeXBlTmFtZXMsICcuJyk7Ci0JCQkJdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChmbGF0RW5jbG9zaW5nVHlwZU5hbWVzLCBzaW1wbGVUeXBlTmFtZSwgJy4nKTsKLQkJCX0KLQkJCWNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgdHlwZU5hbWUsICcuJyk7Ci0JCQkKLQkJCWlmICh0aGlzLmtub3duVHlwZXMuY29udGFpbnNLZXkoZnVsbHlRdWFsaWZpZWROYW1lKSkgY29udGludWUgbmV4dDsKLQkKLQkJCXRoaXMua25vd25UeXBlcy5wdXQoZnVsbHlRdWFsaWZpZWROYW1lLCB0aGlzKTsKLQkJCQotCQkJaWYgKHRoaXMucmVzb2x2aW5nSW1wb3J0cykgewotCQkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZTsKKwkJQXJyYXlMaXN0IGRlZmVycmVkUHJvcG9zYWxzID0gbnVsbDsKKwkJaWYgKERFRkVSX1FVQUxJRklFRF9QUk9QT1NBTFMpIHsKKwkJCWRlZmVycmVkUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOworCQl9CisJCQorCQl0cnkgeworCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkKLQkJCQlpZih0aGlzLnJlc29sdmluZ1N0YXRpY0ltcG9ydHMpIHsKLQkJCQkJaWYoZW5jbG9zaW5nVHlwZU5hbWVzID09IG51bGwgfHwgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgbmV3IGNoYXJbXSB7ICcuJyB9KTsKLQkJCQkJfSBlbHNlIGlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgPT0gMCkgeworCQkJCS8vIGRvZXMgbm90IGNoZWNrIGNhbmNlbGxhdGlvbiBmb3IgZXZlcnkgdHlwZXMgdG8gYXZvaWQgcGVyZm9ybWFuY2UgbG9zcworCQkJCWlmICgoaSAlIENIRUNLX0NBTkNFTF9GUkVRVUVOQ1kpID09IDApIGNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJQWNjZXB0ZWRDb25zdHJ1Y3RvciBhY2NlcHRlZENvbnN0cnVjdG9yID0gKEFjY2VwdGVkQ29uc3RydWN0b3IpdGhpcy5hY2NlcHRlZENvbnN0cnVjdG9ycy5lbGVtZW50QXQoaSk7CisJCQkJZmluYWwgaW50IHR5cGVNb2RpZmllcnMgPSBhY2NlcHRlZENvbnN0cnVjdG9yLnR5cGVNb2RpZmllcnM7CisJCQkJZmluYWwgY2hhcltdIHBhY2thZ2VOYW1lID0gYWNjZXB0ZWRDb25zdHJ1Y3Rvci5wYWNrYWdlTmFtZTsKKwkJCQlmaW5hbCBjaGFyW10gc2ltcGxlVHlwZU5hbWUgPSBhY2NlcHRlZENvbnN0cnVjdG9yLnNpbXBsZVR5cGVOYW1lOworCQkJCWZpbmFsIGludCBtb2RpZmllcnMgPSBhY2NlcHRlZENvbnN0cnVjdG9yLm1vZGlmaWVyczsKKwkJCQlmaW5hbCBpbnQgcGFyYW1ldGVyQ291bnQgPSBhY2NlcHRlZENvbnN0cnVjdG9yLnBhcmFtZXRlckNvdW50OworCQkJCWZpbmFsIGNoYXJbXSBzaWduYXR1cmUgPSBhY2NlcHRlZENvbnN0cnVjdG9yLnNpZ25hdHVyZTsKKwkJCQlmaW5hbCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcyA9IGFjY2VwdGVkQ29uc3RydWN0b3IucGFyYW1ldGVyVHlwZXM7CisJCQkJZmluYWwgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBhY2NlcHRlZENvbnN0cnVjdG9yLnBhcmFtZXRlck5hbWVzOworCQkJCWZpbmFsIGludCBleHRyYUZsYWdzID0gYWNjZXB0ZWRDb25zdHJ1Y3Rvci5leHRyYUZsYWdzOworCQkJCWZpbmFsIGludCBhY2Nlc3NpYmlsaXR5ID0gYWNjZXB0ZWRDb25zdHJ1Y3Rvci5hY2Nlc3NpYmlsaXR5OworCQkJCQorCQkJCWJvb2xlYW4gcHJvcG9zZVR5cGUgPSBoYXNBcnJheVR5cGVBc0V4cGVjdGVkU3VwZXJUeXBlcygpIHx8IChleHRyYUZsYWdzICYgRXh0cmFGbGFncy5IYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXMpICE9IDA7CisJCQkJCisJCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgJy4nKTsKKwkJCQkJCQorCQkJCU9iamVjdCBrbm93blR5cGVLaW5kID0gdGhpcy5rbm93blR5cGVzLmdldChmdWxseVF1YWxpZmllZE5hbWUpOworCQkJCWlmIChrbm93blR5cGVLaW5kICE9IG51bGwpIHsKKwkJCQkJaWYgKGtub3duVHlwZUtpbmQgPT0gS05PV05fVFlQRV9XSVRIX0tOT1dOX0NPTlNUUlVDVE9SUykgeworCQkJCQkJLy8gdGhlIHR5cGUgYW5kIGl0cyBjb25zdHJ1Y3RvcnMgYXJlIGFscmVhZHkgYWNjZXB0ZWQKIAkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgbmV3IGNoYXJbXSB7ICc7JyB9KTsKIAkJCQkJfQorCQkJCQkvLyB0aGlzIHR5cGUgaXMgYWxyZWFkeSBhY2NlcHRlZAorCQkJCQlwcm9wb3NlVHlwZSA9IGZhbHNlOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZnVsbHlRdWFsaWZpZWROYW1lLCBuZXcgY2hhcltdIHsgJzsnIH0pOworCQkJCQl0aGlzLmtub3duVHlwZXMucHV0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgS05PV05fVFlQRV9XSVRIX1VOS05PV05fQ09OU1RSVUNUT1JTKTsKIAkJCQl9CiAJCQkJCi0JCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7Ci0JCQkJaWYoaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRoaXMuY29tcGxldGlvblRva2VuLCBmdWxseVF1YWxpZmllZE5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRoaXMuY29tcGxldGlvblRva2VuLCBzaW1wbGVUeXBlTmFtZSk7CisJCQkJYm9vbGVhbiBwcm9wb3NlQ29uc3RydWN0b3IgPSB0cnVlOworCQkJCQkKKwkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eSkgeworCQkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgPT0gMCkgeworCQkJCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKSB7CisJCQkJCQkJaWYgKCFwcm9wb3NlVHlwZSkgY29udGludWUgbmV4dDsKKwkJCQkJCQlwcm9wb3NlQ29uc3RydWN0b3IgPSBmYWxzZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHRoaXMuY3VycmVudFBhY2thZ2VOYW1lID09IG51bGwpIHsKKwkJCQkJCQkJaW5pdGlhbGl6ZVBhY2thZ2VDYWNoZSgpOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQlpZighQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIHRoaXMuY3VycmVudFBhY2thZ2VOYW1lKSkgeworCQkJCQkJCQkKKwkJCQkJCQkJaWYoKHR5cGVNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpID09IDAgfHwKKwkJCQkJCQkJCQkobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgPT0gMCkgeworCQkJCQkJCQkJaWYgKCFwcm9wb3NlVHlwZSkgY29udGludWUgbmV4dDsKKwkJCQkJCQkJCXByb3Bvc2VDb25zdHJ1Y3RvciA9IGZhbHNlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CiAJCQkJfQogCQkJCQotCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJCQljcmVhdGVUeXBlUHJvcG9zYWwocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBtb2RpZmllcnMsIGFjY2Vzc2liaWxpdHksIGNvbXBsZXRpb25OYW1lLCByZWxldmFuY2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7CisJCQkJYWNjZXB0ZWRDb25zdHJ1Y3Rvci5mdWxseVF1YWxpZmllZE5hbWUgPSBmdWxseVF1YWxpZmllZE5hbWU7CisJCQkJYWNjZXB0ZWRDb25zdHJ1Y3Rvci5wcm9wb3NlVHlwZSA9IHByb3Bvc2VUeXBlOworCQkJCWFjY2VwdGVkQ29uc3RydWN0b3IucHJvcG9zZUNvbnN0cnVjdG9yID0gcHJvcG9zZUNvbnN0cnVjdG9yOworCQkJCQorCQkJCQogCQkJCWlmKCF0aGlzLmltcG9ydENhY2hlc0luaXRpYWxpemVkKSB7Ci0JCQkJCXRoaXMuaW5pdGlhbGl6ZUltcG9ydENhY2hlcygpOworCQkJCQlpbml0aWFsaXplSW1wb3J0Q2FjaGVzKCk7CiAJCQkJfQotCQkJCisJCQkJCiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLmltcG9ydENhY2hlQ291bnQ7IGorKykgewogCQkJCQljaGFyW11bXSBpbXBvcnROYW1lID0gdGhpcy5pbXBvcnRzQ2FjaGVbal07Ci0JCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBpbXBvcnROYW1lWzBdKSkgeworCQkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzaW1wbGVUeXBlTmFtZSwgaW1wb3J0TmFtZVswXSkpIHsKKwkJCQkJCWlmIChwcm9wb3NlVHlwZSkgeworCQkJCQkJCXByb3Bvc2VUeXBlKAorCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJCXR5cGVNb2RpZmllcnMsCisJCQkJCQkJCQlhY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQkJc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCQlmdWxseVF1YWxpZmllZE5hbWUsCisJCQkJCQkJCQkhQ2hhck9wZXJhdGlvbi5lcXVhbHMoZnVsbHlRdWFsaWZpZWROYW1lLCBpbXBvcnROYW1lWzFdKSwKKwkJCQkJCQkJCXNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKHByb3Bvc2VDb25zdHJ1Y3RvciAmJiAhRmxhZ3MuaXNFbnVtKHR5cGVNb2RpZmllcnMpKSB7CisJCQkJCQkJYm9vbGVhbiBpc1F1YWxpZmllZCA9ICFDaGFyT3BlcmF0aW9uLmVxdWFscyhmdWxseVF1YWxpZmllZE5hbWUsIGltcG9ydE5hbWVbMV0pOworCQkJCQkJCWlmICghaXNRdWFsaWZpZWQpIHsKKwkJCQkJCQkJcHJvcG9zZUNvbnN0cnVjdG9yKAorCQkJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQkJCXBhcmFtZXRlckNvdW50LAorCQkJCQkJCQkJCXNpZ25hdHVyZSwKKwkJCQkJCQkJCQlwYXJhbWV0ZXJUeXBlcywKKwkJCQkJCQkJCQlwYXJhbWV0ZXJOYW1lcywKKwkJCQkJCQkJCQltb2RpZmllcnMsCisJCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQkJdHlwZU1vZGlmaWVycywKKwkJCQkJCQkJCQlhY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJCQkJCQlpc1F1YWxpZmllZCwKKwkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQlleHRyYUZsYWdzKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlhY2NlcHRlZENvbnN0cnVjdG9yLm11c3RCZVF1YWxpZmllZCA9IHRydWU7CisJCQkJCQkJCWlmIChERUZFUl9RVUFMSUZJRURfUFJPUE9TQUxTKSB7CisJCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2Fscy5hZGQoYWNjZXB0ZWRDb25zdHJ1Y3Rvcik7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlwcm9wb3NlQ29uc3RydWN0b3IoYWNjZXB0ZWRDb25zdHJ1Y3Rvciwgc2NvcGUpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJfQorCQkJCX0KKworCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuY3VycmVudFBhY2thZ2VOYW1lLCBwYWNrYWdlTmFtZSkpIHsKKwkJCQkJaWYgKHByb3Bvc2VUeXBlKSB7CisJCQkJCQlwcm9wb3NlVHlwZSgKKwkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQl0eXBlTW9kaWZpZXJzLAorCQkJCQkJCQlhY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lLAorCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJc2NvcGUpOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAocHJvcG9zZUNvbnN0cnVjdG9yICYmICFGbGFncy5pc0VudW0odHlwZU1vZGlmaWVycykpIHsKKwkJCQkJCXByb3Bvc2VDb25zdHJ1Y3RvcigKKwkJCQkJCQkJc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCXBhcmFtZXRlckNvdW50LAorCQkJCQkJCQlzaWduYXR1cmUsCisJCQkJCQkJCXBhcmFtZXRlclR5cGVzLAorCQkJCQkJCQlwYXJhbWV0ZXJOYW1lcywKKwkJCQkJCQkJbW9kaWZpZXJzLAorCQkJCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJCQkJdHlwZU1vZGlmaWVycywKKwkJCQkJCQkJYWNjZXNzaWJpbGl0eSwKKwkJCQkJCQkJc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQlleHRyYUZsYWdzKTsKKwkJCQkJfQorCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXJbXSBmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lID0gbnVsbDsKKworCQkJCQlBY2NlcHRlZENvbnN0cnVjdG9yIGZvdW5kQ29uc3RydWN0b3IgPSBudWxsOworCQkJCQlpZigoZm91bmRDb25zdHJ1Y3RvciA9IChBY2NlcHRlZENvbnN0cnVjdG9yKW9uRGVtYW5kRm91bmQuZ2V0KHNpbXBsZVR5cGVOYW1lKSkgPT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLm9uRGVtYW5kSW1wb3J0Q2FjaGVDb3VudDsgaisrKSB7CisJCQkJCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy5vbkRlbWFuZEltcG9ydHNDYWNoZVtqXTsKKworCQkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSBpbXBvcnRCaW5kaW5nLmNvbXBvdW5kTmFtZTsKKwkJCQkJCQljaGFyW10gaW1wb3J0RmxhdE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0TmFtZSwgJy4nKTsKKworCQkJCQkJCWlmKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPT0gbnVsbCkgeworCQkJCQkJCQlmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJCQkJCQkJfQorCQkJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUsIGltcG9ydEZsYXROYW1lKSkgeworCQkJCQkJCQlpZihpbXBvcnRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCWlmKCh0eXBlTW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMCkgeworCQkJCQkJCQkJCW9uRGVtYW5kRm91bmQucHV0KAorCQkJCQkJCQkJCQkJc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCQkJCQlhY2NlcHRlZENvbnN0cnVjdG9yKTsKKwkJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJb25EZW1hbmRGb3VuZC5wdXQoCisJCQkJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQkJCQlhY2NlcHRlZENvbnN0cnVjdG9yKTsKKwkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZighZm91bmRDb25zdHJ1Y3Rvci5tdXN0QmVRdWFsaWZpZWQpeworCQkJCQkJZG9uZSA6IGZvciAoaW50IGogPSAwOyBqIDwgdGhpcy5vbkRlbWFuZEltcG9ydENhY2hlQ291bnQ7IGorKykgeworCQkJCQkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IHRoaXMub25EZW1hbmRJbXBvcnRzQ2FjaGVbal07CisKKwkJCQkJCQljaGFyW11bXSBpbXBvcnROYW1lID0gaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWU7CisJCQkJCQkJY2hhcltdIGltcG9ydEZsYXROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydE5hbWUsICcuJyk7CisKKwkJCQkJCQlpZihmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lID09IG51bGwpIHsKKwkJCQkJCQkJZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworCQkJCQkJCX0KKwkJCQkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lLCBpbXBvcnRGbGF0TmFtZSkpIHsKKwkJCQkJCQkJaWYoaW1wb3J0QmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJCQlpZigodHlwZU1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDApIHsKKwkJCQkJCQkJCQlmb3VuZENvbnN0cnVjdG9yLm11c3RCZVF1YWxpZmllZCA9IHRydWU7CisJCQkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWZvdW5kQ29uc3RydWN0b3IubXVzdEJlUXVhbGlmaWVkID0gdHJ1ZTsKKwkJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHByb3Bvc2VUeXBlKSB7CisJCQkJCQlwcm9wb3NlVHlwZSgKKwkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQl0eXBlTW9kaWZpZXJzLAorCQkJCQkJCQlhY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lLAorCQkJCQkJCQl0cnVlLAorCQkJCQkJCQlzY29wZSk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChwcm9wb3NlQ29uc3RydWN0b3IgJiYgIUZsYWdzLmlzRW51bSh0eXBlTW9kaWZpZXJzKSkgeworCQkJCQkJYWNjZXB0ZWRDb25zdHJ1Y3Rvci5tdXN0QmVRdWFsaWZpZWQgPSB0cnVlOworCQkJCQkJaWYgKERFRkVSX1FVQUxJRklFRF9QUk9QT1NBTFMpIHsKKwkJCQkJCQlkZWZlcnJlZFByb3Bvc2Fscy5hZGQoYWNjZXB0ZWRDb25zdHJ1Y3Rvcik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByb3Bvc2VDb25zdHJ1Y3RvcihhY2NlcHRlZENvbnN0cnVjdG9yLCBzY29wZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQorCQkJY2hhcltdW10ga2V5cyA9IG9uRGVtYW5kRm91bmQua2V5VGFibGU7CisJCQlPYmplY3RbXSB2YWx1ZXMgPSBvbkRlbWFuZEZvdW5kLnZhbHVlVGFibGU7CisJCQlpbnQgbWF4ID0ga2V5cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCisJCQkJLy8gZG9lcyBub3QgY2hlY2sgY2FuY2VsbGF0aW9uIGZvciBldmVyeSB0eXBlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBsb3NzCisJCQkJaWYgKChpICUgQ0hFQ0tfQ0FOQ0VMX0ZSRVFVRU5DWSkgPT0gMCkgY2hlY2tDYW5jZWwoKTsKKwkJCQkKKwkJCQlpZihrZXlzW2ldICE9IG51bGwpIHsKKwkJCQkJQWNjZXB0ZWRDb25zdHJ1Y3RvciB2YWx1ZSA9IChBY2NlcHRlZENvbnN0cnVjdG9yKSB2YWx1ZXNbaV07CisJCQkJCWlmKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJCWlmICh2YWx1ZS5wcm9wb3NlVHlwZSkgeworCQkJCQkJCXByb3Bvc2VUeXBlKAorCQkJCQkJCQkJdmFsdWUucGFja2FnZU5hbWUsCisJCQkJCQkJCQl2YWx1ZS5zaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJCXZhbHVlLnR5cGVNb2RpZmllcnMsCisJCQkJCQkJCQl2YWx1ZS5hY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQkJdmFsdWUuc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCQl2YWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsCisJCQkJCQkJCQl2YWx1ZS5tdXN0QmVRdWFsaWZpZWQsCisJCQkJCQkJCQlzY29wZSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmICh2YWx1ZS5wcm9wb3NlQ29uc3RydWN0b3IgJiYgIUZsYWdzLmlzRW51bSh2YWx1ZS5tb2RpZmllcnMpKSB7CisJCQkJCQkJaWYgKCF2YWx1ZS5tdXN0QmVRdWFsaWZpZWQpIHsKKwkJCQkJCQkJcHJvcG9zZUNvbnN0cnVjdG9yKAorCQkJCQkJCQkJCXZhbHVlLnNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQkJCXZhbHVlLnBhcmFtZXRlckNvdW50LAorCQkJCQkJCQkJCXZhbHVlLnNpZ25hdHVyZSwKKwkJCQkJCQkJCQl2YWx1ZS5wYXJhbWV0ZXJUeXBlcywKKwkJCQkJCQkJCQl2YWx1ZS5wYXJhbWV0ZXJOYW1lcywKKwkJCQkJCQkJCQl2YWx1ZS5tb2RpZmllcnMsCisJCQkJCQkJCQkJdmFsdWUucGFja2FnZU5hbWUsCisJCQkJCQkJCQkJdmFsdWUudHlwZU1vZGlmaWVycywKKwkJCQkJCQkJCQl2YWx1ZS5hY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQkJCXZhbHVlLnNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQkJCXZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJCQkJCQl2YWx1ZS5tdXN0QmVRdWFsaWZpZWQsCisJCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQkJdmFsdWUuZXh0cmFGbGFncyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKERFRkVSX1FVQUxJRklFRF9QUk9QT1NBTFMpIHsKKwkJCQkJCQkJCWRlZmVycmVkUHJvcG9zYWxzLmFkZCh2YWx1ZSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlwcm9wb3NlQ29uc3RydWN0b3IodmFsdWUsIHNjb3BlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKERFRkVSX1FVQUxJRklFRF9QUk9QT1NBTFMpIHsKKwkJCQlpbnQgc2l6ZSA9IGRlZmVycmVkUHJvcG9zYWxzLnNpemUoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkKKwkJCQkJLy8gZG9lcyBub3QgY2hlY2sgY2FuY2VsbGF0aW9uIGZvciBldmVyeSB0eXBlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBsb3NzCisJCQkJCWlmICgoaSAlIENIRUNLX0NBTkNFTF9GUkVRVUVOQ1kpID09IDApIGNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJCUFjY2VwdGVkQ29uc3RydWN0b3IgZGVmZXJyZWRQcm9wb3NhbCA9IChBY2NlcHRlZENvbnN0cnVjdG9yKWRlZmVycmVkUHJvcG9zYWxzLmdldChpKTsKKwkJCQkJCisJCQkJCWlmIChkZWZlcnJlZFByb3Bvc2FsLnByb3Bvc2VDb25zdHJ1Y3RvcikgeworCQkJCQkJcHJvcG9zZUNvbnN0cnVjdG9yKAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnBhcmFtZXRlckNvdW50LAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpZ25hdHVyZSwKKwkJCQkJCQkJZGVmZXJyZWRQcm9wb3NhbC5wYXJhbWV0ZXJUeXBlcywKKwkJCQkJCQkJZGVmZXJyZWRQcm9wb3NhbC5wYXJhbWV0ZXJOYW1lcywKKwkJCQkJCQkJZGVmZXJyZWRQcm9wb3NhbC5tb2RpZmllcnMsCisJCQkJCQkJCWRlZmVycmVkUHJvcG9zYWwucGFja2FnZU5hbWUsCisJCQkJCQkJCWRlZmVycmVkUHJvcG9zYWwudHlwZU1vZGlmaWVycywKKwkJCQkJCQkJZGVmZXJyZWRQcm9wb3NhbC5hY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpbXBsZVR5cGVOYW1lLAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLmZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJCQkJZGVmZXJyZWRQcm9wb3NhbC5tdXN0QmVRdWFsaWZpZWQsCisJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQlkZWZlcnJlZFByb3Bvc2FsLmV4dHJhRmxhZ3MpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJdGhpcy5hY2NlcHRlZFR5cGVzID0gbnVsbDsgLy8gcmVzZXQKKwkJfQorCX0KKworCS8qKgorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBwYWNrYWdlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpIHsKKworCQlpZiAodGhpcy5rbm93blBrZ3MuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSByZXR1cm47CisKKwkJdGhpcy5rbm93blBrZ3MucHV0KHBhY2thZ2VOYW1lLCB0aGlzKTsKKworCQljaGFyW10gY29tcGxldGlvbjsKKwkJaWYodGhpcy5yZXNvbHZpbmdJbXBvcnRzKSB7CisJCQlpZih0aGlzLnJlc29sdmluZ1N0YXRpY0ltcG9ydHMpIHsKKwkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIG5ldyBjaGFyW10geyAnLicgfSk7CisJCQl9IGVsc2UgeworCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgbmV3IGNoYXJbXSB7ICcuJywgJyonLCAnOycgfSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb21wbGV0aW9uID0gcGFja2FnZU5hbWU7CisJCX0KKworCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLnF1YWxpZmllZENvbXBsZXRpb25Ub2tlbiA9PSBudWxsID8gdGhpcy5jb21wbGV0aW9uVG9rZW4gOiB0aGlzLnF1YWxpZmllZENvbXBsZXRpb25Ub2tlbiwgcGFja2FnZU5hbWUpOworCQlpZighdGhpcy5yZXNvbHZpbmdJbXBvcnRzKSB7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24odHJ1ZSk7CisJCX0KKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKworCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuUEFDS0FHRV9SRUYpKSB7CisJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQlpZihERUJVRykgeworCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgdHlwZS4KKwkgKgorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLkkiLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0VHlwZSgKKwkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCWNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywKKwkJaW50IG1vZGlmaWVycywKKwkJQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKKwkJCisJCS8vIGRvZXMgbm90IGNoZWNrIGNhbmNlbGxhdGlvbiBmb3IgZXZlcnkgdHlwZXMgdG8gYXZvaWQgcGVyZm9ybWFuY2UgbG9zcworCQlpZiAoKHRoaXMuZm91bmRUeXBlc0NvdW50ICUgQ0hFQ0tfQ0FOQ0VMX0ZSRVFVRU5DWSkgPT0gMCkgY2hlY2tDYW5jZWwoKTsKKwkJdGhpcy5mb3VuZFR5cGVzQ291bnQrKzsKKwkJCisJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDApIHJldHVybjsKKwkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlICYmIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpICE9IDApIHJldHVybjsKKworCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eSkgeworCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMpID09IDApIHsKKwkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApIHJldHVybjsKKworCQkJCWNoYXJbXSBjdXJyZW50UGFja2FnZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUsICcuJyk7CisJCQkJaWYoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBjdXJyZW50UGFja2FnZSkpIHJldHVybjsKKwkJCX0KKwkJfQorCisJCWludCBhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFOworCQlpZihhY2Nlc3NSZXN0cmljdGlvbiAhPSBudWxsKSB7CisJCQlzd2l0Y2ggKGFjY2Vzc1Jlc3RyaWN0aW9uLmdldFByb2JsZW1JZCgpKSB7CisJCQkJY2FzZSBJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2U6CisJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tGb3JiaWRkZW5SZWZlcmVuY2UpIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQlhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19OT05fQUNDRVNTSUJMRTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUHJvYmxlbS5EaXNjb3VyYWdlZFJlZmVyZW5jZToKKwkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0Rpc2NvdXJhZ2VkUmVmZXJlbmNlKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfRElTQ09VUkFHRUQ7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQlpZiAoaXNGb3JiaWRkZW5UeXBlKHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYodGhpcy5hY2NlcHRlZFR5cGVzID09IG51bGwpIHsKKwkJCXRoaXMuYWNjZXB0ZWRUeXBlcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJfQorCQl0aGlzLmFjY2VwdGVkVHlwZXMuYWRkKG5ldyBBY2NlcHRlZFR5cGUocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIG1vZGlmaWVycywgYWNjZXNzaWJpbGl0eSkpOworCX0KKworCXByaXZhdGUgdm9pZCBhY2NlcHRUeXBlcyhTY29wZSBzY29wZSkgeworCQl0aGlzLmNoZWNrQ2FuY2VsKCk7CisJCQorCQlpZih0aGlzLmFjY2VwdGVkVHlwZXMgPT0gbnVsbCkgcmV0dXJuOworCisJCWludCBsZW5ndGggPSB0aGlzLmFjY2VwdGVkVHlwZXMuc2l6ZSgpOworCisJCWlmKGxlbmd0aCA9PSAwKSByZXR1cm47CisKKwkJSGFzaHRhYmxlT2ZPYmplY3Qgb25EZW1hbmRGb3VuZCA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgpOworCQkKKwkJdHJ5IHsKKwkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCisJCQkJLy8gZG9lcyBub3QgY2hlY2sgY2FuY2VsbGF0aW9uIGZvciBldmVyeSB0eXBlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBsb3NzCisJCQkJaWYgKChpICUgQ0hFQ0tfQ0FOQ0VMX0ZSRVFVRU5DWSkgPT0gMCkgY2hlY2tDYW5jZWwoKTsKKwkJCQkKKwkJCQlBY2NlcHRlZFR5cGUgYWNjZXB0ZWRUeXBlID0gKEFjY2VwdGVkVHlwZSl0aGlzLmFjY2VwdGVkVHlwZXMuZWxlbWVudEF0KGkpOworCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGFjY2VwdGVkVHlwZS5wYWNrYWdlTmFtZTsKKwkJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUgPSBhY2NlcHRlZFR5cGUuc2ltcGxlVHlwZU5hbWU7CisJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzID0gYWNjZXB0ZWRUeXBlLmVuY2xvc2luZ1R5cGVOYW1lczsKKwkJCQlpbnQgbW9kaWZpZXJzID0gYWNjZXB0ZWRUeXBlLm1vZGlmaWVyczsKKwkJCQlpbnQgYWNjZXNzaWJpbGl0eSA9IGFjY2VwdGVkVHlwZS5hY2Nlc3NpYmlsaXR5OworCQorCQkJCWNoYXJbXSB0eXBlTmFtZTsKKwkJCQljaGFyW10gZmxhdEVuY2xvc2luZ1R5cGVOYW1lczsKKwkJCQlpZihlbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCB8fCBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID09IDApIHsKKwkJCQkJZmxhdEVuY2xvc2luZ1R5cGVOYW1lcyA9IG51bGw7CisJCQkJCXR5cGVOYW1lID0gc2ltcGxlVHlwZU5hbWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmxhdEVuY2xvc2luZ1R5cGVOYW1lcyA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChhY2NlcHRlZFR5cGUuZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpOworCQkJCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGZsYXRFbmNsb3NpbmdUeXBlTmFtZXMsIHNpbXBsZVR5cGVOYW1lLCAnLicpOworCQkJCX0KKwkJCQljaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOworCQorCQkJCWlmICh0aGlzLmtub3duVHlwZXMuY29udGFpbnNLZXkoZnVsbHlRdWFsaWZpZWROYW1lKSkgY29udGludWUgbmV4dDsKKwkKKwkJCQl0aGlzLmtub3duVHlwZXMucHV0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgS05PV05fVFlQRV9XSVRIX1VOS05PV05fQ09OU1RSVUNUT1JTKTsKKwkKKwkJCQlpZiAodGhpcy5yZXNvbHZpbmdJbXBvcnRzKSB7CisJCQkJCWlmKHRoaXMuY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80ICYmIHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKSB7CisJCQkJCQljb250aW51ZSBuZXh0OyAvLyBpbXBvcnQgb2YgZGVmYXVsdCBwYWNrYWdlIGlzIGZvcmJpZGRlbiB3aGVuIGNvbXBsaWFuY2UgaXMgMS40IG9yIGhpZ2hlcgorCQkJCQl9CisJCisJCQkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IHRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID8gc2ltcGxlVHlwZU5hbWUgOiBmdWxseVF1YWxpZmllZE5hbWU7CisJCisJCQkJCWlmKHRoaXMucmVzb2x2aW5nU3RhdGljSW1wb3J0cykgeworCQkJCQkJaWYoZW5jbG9zaW5nVHlwZU5hbWVzID09IG51bGwgfHwgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA9PSAwKSB7CisJCQkJCQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7ICcuJyB9KTsKKwkJCQkJCX0gZWxzZSBpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpID09IDApIHsKKwkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNvbXBsZXRpb25OYW1lLCBuZXcgY2hhcltdIHsgJzsnIH0pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7ICc7JyB9KTsKKwkJCQkJfQorCQorCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChwYWNrYWdlTmFtZSwgZnVsbHlRdWFsaWZpZWROYW1lKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRoaXMuY29tcGxldGlvblRva2VuLCBzaW1wbGVUeXBlTmFtZSk7CisJCisJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCWNyZWF0ZVR5cGVQcm9wb3NhbChwYWNrYWdlTmFtZSwgdHlwZU5hbWUsIG1vZGlmaWVycywgYWNjZXNzaWJpbGl0eSwgY29tcGxldGlvbk5hbWUsIHJlbGV2YW5jZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZighdGhpcy5pbXBvcnRDYWNoZXNJbml0aWFsaXplZCkgeworCQkJCQkJaW5pdGlhbGl6ZUltcG9ydENhY2hlcygpOworCQkJCQl9CisJCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGhpcy5pbXBvcnRDYWNoZUNvdW50OyBqKyspIHsKKwkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSB0aGlzLmltcG9ydHNDYWNoZVtqXTsKKwkJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBpbXBvcnROYW1lWzBdKSkgeworCQkJCQkJCXByb3Bvc2VUeXBlKAorCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJCW1vZGlmaWVycywKKwkJCQkJCQkJCWFjY2Vzc2liaWxpdHksCisJCQkJCQkJCQl0eXBlTmFtZSwKKwkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJCQkJCSFDaGFyT3BlcmF0aW9uLmVxdWFscyhmdWxseVF1YWxpZmllZE5hbWUsIGltcG9ydE5hbWVbMV0pLAorCQkJCQkJCQkJc2NvcGUpOworCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQl9CisJCQkJCX0KKwkKKwkKKwkJCQkJaWYgKChlbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCB8fCBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID09IDAgKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSwgcGFja2FnZU5hbWUpKSB7CiAJCQkJCQlwcm9wb3NlVHlwZSgKIAkJCQkJCQkJcGFja2FnZU5hbWUsCiAJCQkJCQkJCXNpbXBsZVR5cGVOYW1lLApAQCAtNTE0LDUwICsxMjgwLDQzIEBACiAJCQkJCQkJCWFjY2Vzc2liaWxpdHksCiAJCQkJCQkJCXR5cGVOYW1lLAogCQkJCQkJCQlmdWxseVF1YWxpZmllZE5hbWUsCi0JCQkJCQkJCSFDaGFyT3BlcmF0aW9uLmVxdWFscyhmdWxseVF1YWxpZmllZE5hbWUsIGltcG9ydE5hbWVbMV0pLAorCQkJCQkJCQlmYWxzZSwKIAkJCQkJCQkJc2NvcGUpOwogCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkKLQkJCQlpZiAoKGVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsIHx8IGVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGggPT0gMCApICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuY3VycmVudFBhY2thZ2VOYW1lLCBwYWNrYWdlTmFtZSkpIHsKLQkJCQkJcHJvcG9zZVR5cGUoCi0JCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJc2ltcGxlVHlwZU5hbWUsCi0JCQkJCQkJbW9kaWZpZXJzLAotCQkJCQkJCWFjY2Vzc2liaWxpdHksCi0JCQkJCQkJdHlwZU5hbWUsCi0JCQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lLAotCQkJCQkJCWZhbHNlLAotCQkJCQkJCXNjb3BlKTsKLQkJCQkJY29udGludWUgbmV4dDsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyW10gZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSA9IG51bGw7Ci0JCQkKLQkJCQkJQWNjZXB0ZWRUeXBlIGZvdW5kVHlwZSA9IG51bGw7Ci0JCQkJCWlmKChmb3VuZFR5cGUgPSAoQWNjZXB0ZWRUeXBlKW9uRGVtYW5kRm91bmQuZ2V0KHNpbXBsZVR5cGVOYW1lKSkgPT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLm9uRGVtYW5kSW1wb3J0Q2FjaGVDb3VudDsgaisrKSB7Ci0JCQkJCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy5vbkRlbWFuZEltcG9ydHNDYWNoZVtqXTsKLQotCQkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSBpbXBvcnRCaW5kaW5nLmNvbXBvdW5kTmFtZTsKLQkJCQkJCQljaGFyW10gaW1wb3J0RmxhdE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0TmFtZSwgJy4nKTsKLQkJCQkJCQotCQkJCQkJCWlmKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJCQlpZihlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoICE9IDApIHsKLQkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPQotCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQkJCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJCQkJCQlmbGF0RW5jbG9zaW5nVHlwZU5hbWVzLAotCQkJCQkJCQkJCQkJJy4nKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPQotCQkJCQkJCQkJCXBhY2thZ2VOYW1lOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPSBudWxsOworCQorCQkJCQkJQWNjZXB0ZWRUeXBlIGZvdW5kVHlwZSA9IG51bGw7CisJCQkJCQlpZigoZm91bmRUeXBlID0gKEFjY2VwdGVkVHlwZSlvbkRlbWFuZEZvdW5kLmdldChzaW1wbGVUeXBlTmFtZSkpID09IG51bGwpIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRoaXMub25EZW1hbmRJbXBvcnRDYWNoZUNvdW50OyBqKyspIHsKKwkJCQkJCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy5vbkRlbWFuZEltcG9ydHNDYWNoZVtqXTsKKwkKKwkJCQkJCQkJY2hhcltdW10gaW1wb3J0TmFtZSA9IGltcG9ydEJpbmRpbmcuY29tcG91bmROYW1lOworCQkJCQkJCQljaGFyW10gaW1wb3J0RmxhdE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0TmFtZSwgJy4nKTsKKwkKKwkJCQkJCQkJaWYoZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisJCQkJCQkJCQlpZihlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoICE9IDApIHsKKwkJCQkJCQkJCQlmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lID0KKwkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQkJCQkJZmxhdEVuY2xvc2luZ1R5cGVOYW1lcywKKwkJCQkJCQkJCQkJCQknLicpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlmdWxseVF1YWxpZmllZEVuY2xvc2luZ1R5cGVPclBhY2thZ2VOYW1lID0KKwkJCQkJCQkJCQkJcGFja2FnZU5hbWU7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSwgaW1wb3J0RmxhdE5hbWUpKSB7Ci0JCQkJCQkJCWlmKGltcG9ydEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCQkJCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDApIHsKKwkJCQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSwgaW1wb3J0RmxhdE5hbWUpKSB7CisJCQkJCQkJCQlpZihpbXBvcnRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMCkgeworCQkJCQkJCQkJCQlhY2NlcHRlZFR5cGUucXVhbGlmaWVkVHlwZU5hbWUgPSB0eXBlTmFtZTsKKwkJCQkJCQkJCQkJYWNjZXB0ZWRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsKKwkJCQkJCQkJCQkJb25EZW1hbmRGb3VuZC5wdXQoCisJCQkJCQkJCQkJCQkJc2ltcGxlVHlwZU5hbWUsCisJCQkJCQkJCQkJCQkJYWNjZXB0ZWRUeXBlKTsKKwkJCQkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQkJCWFjY2VwdGVkVHlwZS5xdWFsaWZpZWRUeXBlTmFtZSA9IHR5cGVOYW1lOwogCQkJCQkJCQkJCWFjY2VwdGVkVHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPSBmdWxseVF1YWxpZmllZE5hbWU7CiAJCQkJCQkJCQkJb25EZW1hbmRGb3VuZC5wdXQoCkBAIC01NjUsOTkgKzEzMjQsOTYgQEAKIAkJCQkJCQkJCQkJCWFjY2VwdGVkVHlwZSk7CiAJCQkJCQkJCQkJY29udGludWUgbmV4dDsKIAkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWFjY2VwdGVkVHlwZS5xdWFsaWZpZWRUeXBlTmFtZSA9IHR5cGVOYW1lOwotCQkJCQkJCQkJYWNjZXB0ZWRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsKLQkJCQkJCQkJCW9uRGVtYW5kRm91bmQucHV0KAotCQkJCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKLQkJCQkJCQkJCQkJYWNjZXB0ZWRUeXBlKTsKLQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZighZm91bmRUeXBlLm11c3RCZVF1YWxpZmllZCl7Ci0JCQkJCQlkb25lIDogZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLm9uRGVtYW5kSW1wb3J0Q2FjaGVDb3VudDsgaisrKSB7Ci0JCQkJCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy5vbkRlbWFuZEltcG9ydHNDYWNoZVtqXTsKLQotCQkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSBpbXBvcnRCaW5kaW5nLmNvbXBvdW5kTmFtZTsKLQkJCQkJCQljaGFyW10gaW1wb3J0RmxhdE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0TmFtZSwgJy4nKTsKLQkJCQkJCQotCQkJCQkJCWlmKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJCQlpZihlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoICE9IDApIHsKLQkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPQotCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQkJCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJCQkJCQlmbGF0RW5jbG9zaW5nVHlwZU5hbWVzLAotCQkJCQkJCQkJCQkJJy4nKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPQotCQkJCQkJCQkJCXBhY2thZ2VOYW1lOworCQkJCQkJfSBlbHNlIGlmKCFmb3VuZFR5cGUubXVzdEJlUXVhbGlmaWVkKXsKKwkJCQkJCQlkb25lIDogZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLm9uRGVtYW5kSW1wb3J0Q2FjaGVDb3VudDsgaisrKSB7CisJCQkJCQkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IHRoaXMub25EZW1hbmRJbXBvcnRzQ2FjaGVbal07CisJCisJCQkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSBpbXBvcnRCaW5kaW5nLmNvbXBvdW5kTmFtZTsKKwkJCQkJCQkJY2hhcltdIGltcG9ydEZsYXROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydE5hbWUsICcuJyk7CisJCisJCQkJCQkJCWlmKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUgPT0gbnVsbCkgeworCQkJCQkJCQkJaWYoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCAhPSAwKSB7CisJCQkJCQkJCQkJZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSA9CisJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCQkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJCQkJCQkJCWZsYXRFbmNsb3NpbmdUeXBlTmFtZXMsCisJCQkJCQkJCQkJCQkJJy4nKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJZnVsbHlRdWFsaWZpZWRFbmNsb3NpbmdUeXBlT3JQYWNrYWdlTmFtZSA9CisJCQkJCQkJCQkJCXBhY2thZ2VOYW1lOworCQkJCQkJCQkJfQogCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUsIGltcG9ydEZsYXROYW1lKSkgewotCQkJCQkJCQlpZihpbXBvcnRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQkJCQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwKSB7CisJCQkJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGZ1bGx5UXVhbGlmaWVkRW5jbG9zaW5nVHlwZU9yUGFja2FnZU5hbWUsIGltcG9ydEZsYXROYW1lKSkgeworCQkJCQkJCQkJaWYoaW1wb3J0QmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDApIHsKKwkJCQkJCQkJCQkJZm91bmRUeXBlLm11c3RCZVF1YWxpZmllZCA9IHRydWU7CisJCQkJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQlmb3VuZFR5cGUubXVzdEJlUXVhbGlmaWVkID0gdHJ1ZTsKIAkJCQkJCQkJCQlicmVhayBkb25lOwogCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJZm91bmRUeXBlLm11c3RCZVF1YWxpZmllZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhayBkb25lOwogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQorCQkJCQkJcHJvcG9zZVR5cGUoCisJCQkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJbW9kaWZpZXJzLAorCQkJCQkJCQlhY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQl0eXBlTmFtZSwKKwkJCQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lLAorCQkJCQkJCQl0cnVlLAorCQkJCQkJCQlzY29wZSk7CiAJCQkJCX0KLQkJCQkJcHJvcG9zZVR5cGUoCi0JCQkJCQkJcGFja2FnZU5hbWUsCi0JCQkJCQkJc2ltcGxlVHlwZU5hbWUsCi0JCQkJCQkJbW9kaWZpZXJzLAotCQkJCQkJCWFjY2Vzc2liaWxpdHksCi0JCQkJCQkJdHlwZU5hbWUsCi0JCQkJCQkJZnVsbHlRdWFsaWZpZWROYW1lLAotCQkJCQkJCXRydWUsCi0JCQkJCQkJc2NvcGUpOwogCQkJCX0KIAkJCX0KLQkJfQotCQljaGFyW11bXSBrZXlzID0gb25EZW1hbmRGb3VuZC5rZXlUYWJsZTsKLQkJT2JqZWN0W10gdmFsdWVzID0gb25EZW1hbmRGb3VuZC52YWx1ZVRhYmxlOwotCQlpbnQgbWF4ID0ga2V5cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmKGtleXNbaV0gIT0gbnVsbCkgewotCQkJCUFjY2VwdGVkVHlwZSB2YWx1ZSA9IChBY2NlcHRlZFR5cGUpIHZhbHVlc1tpXTsKLQkJCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXByb3Bvc2VUeXBlKAotCQkJCQkJCXZhbHVlLnBhY2thZ2VOYW1lLAotCQkJCQkJCXZhbHVlLnNpbXBsZVR5cGVOYW1lLAotCQkJCQkJCXZhbHVlLm1vZGlmaWVycywKLQkJCQkJCQl2YWx1ZS5hY2Nlc3NpYmlsaXR5LAotCQkJCQkJCXZhbHVlLnF1YWxpZmllZFR5cGVOYW1lLAotCQkJCQkJCXZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwKLQkJCQkJCQl2YWx1ZS5tdXN0QmVRdWFsaWZpZWQsCi0JCQkJCQkJc2NvcGUpOworCQkKKwkJCWNoYXJbXVtdIGtleXMgPSBvbkRlbWFuZEZvdW5kLmtleVRhYmxlOworCQkJT2JqZWN0W10gdmFsdWVzID0gb25EZW1hbmRGb3VuZC52YWx1ZVRhYmxlOworCQkJaW50IG1heCA9IGtleXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmICgoaSAlIENIRUNLX0NBTkNFTF9GUkVRVUVOQ1kpID09IDApIGNoZWNrQ2FuY2VsKCk7CisJCQkJaWYoa2V5c1tpXSAhPSBudWxsKSB7CisJCQkJCUFjY2VwdGVkVHlwZSB2YWx1ZSA9IChBY2NlcHRlZFR5cGUpIHZhbHVlc1tpXTsKKwkJCQkJaWYodmFsdWUgIT0gbnVsbCkgeworCQkJCQkJcHJvcG9zZVR5cGUoCisJCQkJCQkJCXZhbHVlLnBhY2thZ2VOYW1lLAorCQkJCQkJCQl2YWx1ZS5zaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQkJdmFsdWUubW9kaWZpZXJzLAorCQkJCQkJCQl2YWx1ZS5hY2Nlc3NpYmlsaXR5LAorCQkJCQkJCQl2YWx1ZS5xdWFsaWZpZWRUeXBlTmFtZSwKKwkJCQkJCQkJdmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLAorCQkJCQkJCQl2YWx1ZS5tdXN0QmVRdWFsaWZpZWQsCisJCQkJCQkJCXNjb3BlKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuYWNjZXB0ZWRUeXBlcyA9IG51bGw7IC8vIHJlc2V0CiAJCX0KLQkJdGhpcy5hY2NlcHRlZFR5cGVzID0gbnVsbDsgLy8gcmVzZXQKIAl9CiAJCiAJcHVibGljIHZvaWQgYWNjZXB0VW5yZXNvbHZlZE5hbWUoY2hhcltdIG5hbWUpIHsKIAkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CiAJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbihmYWxzZSk7CiAJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhjb21wbGV0aW9uVG9rZW4sIG5hbWUpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbmFtZSk7CiAJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7CiAJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgbG9jYWwgdmFyaWFibGUKIAkJQ29tcGxldGlvbkVuZ2luZS50aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJaWYoIUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5MT0NBTF9WQVJJQUJMRV9SRUYpKSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBDb21wbGV0aW9uRW5naW5lLnRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRiwgQ29tcGxldGlvbkVuZ2luZS50aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IENvbXBsZXRpb25FbmdpbmUudGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTE9DQUxfVkFSSUFCTEVfUkVGLCBDb21wbGV0aW9uRW5naW5lLnRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKIAkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShKQVZBX0xBTkdfT0JKRUNUX1NJR05BVFVSRSk7CiAJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShKQVZBX0xBTkdfTkFNRSk7CiAJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShPQkpFQ1QpOwogCQkJcHJvcG9zYWwuc2V0TmFtZShuYW1lKTsKIAkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24obmFtZSk7CiAJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NEZWZhdWx0KTsKLQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShDb21wbGV0aW9uRW5naW5lLnRoaXMuc3RhcnRQb3NpdGlvbiAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQsIENvbXBsZXRpb25FbmdpbmUudGhpcy5lbmRQb3NpdGlvbiAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKIAkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwogCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwogCQkJaWYoREVCVUcpIHsKQEAgLTY2NSw2ICsxNDIxLDQxIEBACiAJCQl9CiAJCX0KIAl9CisJcHJpdmF0ZSB2b2lkIGFkZEV4cGVjdGVkVHlwZShUeXBlQmluZGluZyB0eXBlLCBTY29wZSBzY29wZSl7CisJCWlmICh0eXBlID09IG51bGwgfHwgIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSB8fCB0eXBlID09IFR5cGVCaW5kaW5nLk5VTEwpIHJldHVybjsKKworCQkvLyBkbyBub3QgYWRkIHR3aWNlIHRoZSBzYW1lIHR5cGUKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5leHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCWlmICh0aGlzLmV4cGVjdGVkVHlwZXNbaV0gPT0gdHlwZSkgcmV0dXJuOworCQl9CisKKwkJaW50IGxlbmd0aCA9IHRoaXMuZXhwZWN0ZWRUeXBlcy5sZW5ndGg7CisJCWlmICgrK3RoaXMuZXhwZWN0ZWRUeXBlc1B0ciA+PSBsZW5ndGgpCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXhwZWN0ZWRUeXBlcywgMCwgdGhpcy5leHBlY3RlZFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCQl0aGlzLmV4cGVjdGVkVHlwZXNbdGhpcy5leHBlY3RlZFR5cGVzUHRyXSA9IHR5cGU7CisKKwkJaWYodHlwZSA9PSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpKSB7CisJCQl0aGlzLmhhc0phdmFMYW5nT2JqZWN0QXNFeHBlY3RlZFR5cGUgPSB0cnVlOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEZvcmJpZGRlbkJpbmRpbmdzKEJpbmRpbmcgYmluZGluZyl7CisJCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybjsKKworCQlpbnQgbGVuZ3RoID0gdGhpcy5mb3JiYmlkZW5CaW5kaW5ncy5sZW5ndGg7CisJCWlmICgrK3RoaXMuZm9yYmJpZGVuQmluZGluZ3NQdHIgPj0gbGVuZ3RoKQorCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZvcmJiaWRlbkJpbmRpbmdzLCAwLCB0aGlzLmZvcmJiaWRlbkJpbmRpbmdzID0gbmV3IEJpbmRpbmdbbGVuZ3RoICogMl0sIDAsIGxlbmd0aCk7CisJCXRoaXMuZm9yYmJpZGVuQmluZGluZ3NbdGhpcy5mb3JiYmlkZW5CaW5kaW5nc1B0cl0gPSBiaW5kaW5nOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRVbmludGVyZXN0aW5nQmluZGluZ3MoQmluZGluZyBiaW5kaW5nKXsKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuOworCisJCWludCBsZW5ndGggPSB0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5ncy5sZW5ndGg7CisJCWlmICgrK3RoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzUHRyID49IGxlbmd0aCkKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy51bmludGVyZXN0aW5nQmluZGluZ3MsIDAsIHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzID0gbmV3IEJpbmRpbmdbbGVuZ3RoICogMl0sIDAsIGxlbmd0aCk7CisJCXRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzW3RoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzUHRyXSA9IGJpbmRpbmc7CisJfQogCiAJLy8gdGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBNZXRob2RCaW5kaW5nI2FyZVBhcmFtZXRlcnNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZ1tdKQogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBhcmVQYXJhbWV0ZXJzQ29tcGF0aWJsZVdpdGgoVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50cywgYm9vbGVhbiBpc1ZhcmFyZ3MpIHsKQEAgLTY5NiwxMzQgKzE0ODcsMjUgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvcG9zZVR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGludCBtb2RpZmllcnMsIGludCBhY2Nlc3NpYmlsaXR5LCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUsIGJvb2xlYW4gaXNRdWFsaWZpZWQsIFNjb3BlIHNjb3BlKSB7Ci0JCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsKLQkJaWYoaXNRdWFsaWZpZWQpIHsKLQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJCWlmICh0aGlzLnVuaXRTY29wZSAhPSBudWxsICYmIHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKLQkJCQkJcmV0dXJuOyAvLyBpZ25vcmUgdHlwZXMgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIGZyb20gb3V0c2lkZSBpdAotCQl9IGVsc2UgewotCQkJY29tcGxldGlvbk5hbWUgPSBzaW1wbGVUeXBlTmFtZTsKLQkJfQotCQkKLQkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUgPSBudWxsOwotCQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uKSAhPSAwICYmCi0JCQkJdGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uICYmCi0JCQkJKHRoaXMudGFyZ2V0ZWRFbGVtZW50ICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSykgIT0gMCkgewotCQkJY2hhcltdW10gY24gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZE5hbWUpOwotCQkJCi0JCQlUeXBlUmVmZXJlbmNlIHJlZjsKLQkJCWlmIChjbi5sZW5ndGggPT0gMSkgewotCQkJCXJlZiA9IG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKHNpbXBsZVR5cGVOYW1lLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoY24sbmV3IGxvbmdbY24ubGVuZ3RoXSk7Ci0JCQl9Ci0JCQkKLQkJCXN3aXRjaCAoc2NvcGUua2luZCkgewotCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKLQkJCQljYXNlIFNjb3BlLkJMT0NLX1NDT1BFIDoKLQkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKLQkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpc2NvcGUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJaWYgKGd1ZXNzZWRUeXBlID09IG51bGwgfHwgIWd1ZXNzZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybjsKLQkJCQotCQkJaWYgKCFoYXNQb3NzaWJsZUFubm90YXRpb25UYXJnZXQoZ3Vlc3NlZFR5cGUsIHNjb3BlKSkgcmV0dXJuOwotCQl9CiAKLQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRoaXMuY29tcGxldGlvblRva2VuLCBzaW1wbGVUeXBlTmFtZSk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oaXNRdWFsaWZpZWQpOwotCQkKLQkJaW50IGtpbmQgPSBtb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pOwotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb246Ci0JCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZToKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKTsKLQkJCQlpZiAoZ3Vlc3NlZFR5cGUgIT0gbnVsbCkgcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uVGFyZ2V0KGd1ZXNzZWRUeXBlKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bToKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW0oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZToKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oc2ltcGxlVHlwZU5hbWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQljcmVhdGVUeXBlUHJvcG9zYWwocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBtb2RpZmllcnMsIGFjY2Vzc2liaWxpdHksIGNvbXBsZXRpb25OYW1lLCByZWxldmFuY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHBhY2thZ2UuCi0JICoKLQkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgotCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCi0JICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSkgewotCi0JCWlmICh0aGlzLmtub3duUGtncy5jb250YWluc0tleShwYWNrYWdlTmFtZSkpIHJldHVybjsKLQotCQl0aGlzLmtub3duUGtncy5wdXQocGFja2FnZU5hbWUsIHRoaXMpOwotCQkKLQkJY2hhcltdIGNvbXBsZXRpb247Ci0JCWlmKHRoaXMucmVzb2x2aW5nSW1wb3J0cykgewotCQkJaWYodGhpcy5yZXNvbHZpbmdTdGF0aWNJbXBvcnRzKSB7Ci0JCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBuZXcgY2hhcltdIHsgJy4nIH0pOwotCQkJfSBlbHNlIHsKLQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIG5ldyBjaGFyW10geyAnLicsICcqJywgJzsnIH0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJY29tcGxldGlvbiA9IHBhY2thZ2VOYW1lOwotCQl9Ci0JCQkJCQkJCQotCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLnF1YWxpZmllZENvbXBsZXRpb25Ub2tlbiA9PSBudWxsID8gdGhpcy5jb21wbGV0aW9uVG9rZW4gOiB0aGlzLnF1YWxpZmllZENvbXBsZXRpb25Ub2tlbiwgcGFja2FnZU5hbWUpOwotCQlpZighdGhpcy5yZXNvbHZpbmdJbXBvcnRzKSB7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCi0JCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLlBBQ0tBR0VfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7Ci0JCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7Ci0JCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOwotCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJaWYoREVCVUcpIHsKLQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JfQotCQkKIAlwcml2YXRlIHZvaWQgYnVpbGRDb250ZXh0KAogCQkJQVNUTm9kZSBhc3ROb2RlLAogCQkJQVNUTm9kZSBhc3ROb2RlUGFyZW50LAorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sCiAJCQlCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsCiAJCQlTY29wZSBzY29wZSkgewotCQlDb21wbGV0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbXBsZXRpb25Db250ZXh0KCk7Ci0JCQorCQlJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCgpOworCQlpZiAodGhpcy5yZXF1ZXN0b3IuaXNFeHRlbmRlZENvbnRleHRSZXF1aXJlZCgpKSB7CisJCQljb250ZXh0LnNldEV4dGVuZGVkRGF0YSgKKwkJCQkJdGhpcy50eXBlUm9vdCwKKwkJCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sCisJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQsCisJCQkJCXNjb3BlLAorCQkJCQlhc3ROb2RlLAorCQkJCQl0aGlzLm93bmVyLAorCQkJCQl0aGlzLnBhcnNlcik7CisJCX0KKwogCQkvLyBidWlsZCBleHBlY3RlZCB0eXBlcyBjb250ZXh0CiAJCWlmICh0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPiAtMSkgewogCQkJaW50IGxlbmd0aCA9IHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciArIDE7CkBAIC04MzYsMTUgKzE1MTgsMTUgQEAKIAkJCWNvbnRleHQuc2V0RXhwZWN0ZWRUeXBlc1NpZ25hdHVyZXMoZXhwVHlwZXMpOwogCQkJY29udGV4dC5zZXRFeHBlY3RlZFR5cGVzS2V5cyhleHBLZXlzKTsKIAkJfQotCQkKKwogCQljb250ZXh0LnNldE9mZnNldCh0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiArIDEgLSB0aGlzLm9mZnNldCk7Ci0JCQorCiAJCS8vIFNldCBqYXZhZG9jIGluZm8KIAkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25KYXZhZG9jKSB7CiAJCQl0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPSAoKENvbXBsZXRpb25PbkphdmFkb2MpYXN0Tm9kZSkuZ2V0Q29tcGxldGlvbkZsYWdzKCk7CiAJCQljb250ZXh0LnNldEphdmFkb2ModGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jKTsKIAkJfQotCQkKKwogCQlpZiAoIShhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvYykpIHsKIAkJCUNvbXBsZXRpb25TY2FubmVyIHNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5wYXJzZXIuc2Nhbm5lcjsKIAkJCWNvbnRleHQuc2V0VG9rZW4oc2Nhbm5lci5jb21wbGV0aW9uSWRlbnRpZmllcik7CkBAIC04NjcsMTA3NSArMTU0OSwxNjUgQEAKIAkJCQkJc2Nhbm5lci5jb21wbGV0ZWRJZGVudGlmaWVyRW5kIC0gdGhpcy5vZmZzZXQsCiAJCQkJCXNjYW5uZXIuZW5kT2ZFbXB0eVRva2VuIC0gdGhpcy5vZmZzZXQpOwogCQl9Ci0JCQorCiAJCWlmKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TdHJpbmdMaXRlcmFsKSB7CiAJCQljb250ZXh0LnNldFRva2VuS2luZChDb21wbGV0aW9uQ29udGV4dC5UT0tFTl9LSU5EX1NUUklOR19MSVRFUkFMKTsKIAkJfSBlbHNlIHsKIAkJCWNvbnRleHQuc2V0VG9rZW5LaW5kKENvbXBsZXRpb25Db250ZXh0LlRPS0VOX0tJTkRfTkFNRSk7CiAJCX0KLQkJCisKKwkJYnVpbGRUb2tlbkxvY2F0aW9uQ29udGV4dChjb250ZXh0LCBzY29wZSwgYXN0Tm9kZSwgYXN0Tm9kZVBhcmVudCk7CisKIAkJaWYoREVCVUcpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbihjb250ZXh0LnRvU3RyaW5nKCkpOwogCQl9CiAJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnRleHQoY29udGV4dCk7CiAJfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZShBU1ROb2RlIGFzdE5vZGUsIEFTVE5vZGUgYXN0Tm9kZVBhcmVudCwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSwgYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbikgewogCi0JCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlRW5kKTsKKwlwcml2YXRlIHZvaWQgYnVpbGRUb2tlbkxvY2F0aW9uQ29udGV4dChJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IGNvbnRleHQsIFNjb3BlIHNjb3BlLCBBU1ROb2RlIGFzdE5vZGUsIEFTVE5vZGUgYXN0Tm9kZVBhcmVudCkgeworCQlpZiAoc2NvcGUgPT0gbnVsbCB8fCBjb250ZXh0LmlzSW5KYXZhZG9jKCkpIHJldHVybjsKKworCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkVHlwZSkgeworCQkJQ29tcGxldGlvbk9uRmllbGRUeXBlIGZpZWxkID0gKENvbXBsZXRpb25PbkZpZWxkVHlwZSkgYXN0Tm9kZTsKKwkJCWlmICghZmllbGQuaXNMb2NhbFZhcmlhYmxlICYmCisJCQkJCWZpZWxkLm1vZGlmaWVycyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCAmJgorCQkJCQkoZmllbGQuYW5ub3RhdGlvbnMgPT0gbnVsbCB8fCBmaWVsZC5hbm5vdGF0aW9ucy5sZW5ndGggPT0gMCkpIHsKKwkJCQljb250ZXh0LnNldFRva2VuTG9jYXRpb24oQ29tcGxldGlvbkNvbnRleHQuVExfTUVNQkVSX1NUQVJUKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgeworCQkJQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSBtZXRob2QgPSAoQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgYXN0Tm9kZTsKKwkJCWlmIChtZXRob2QubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0ICYmCisJCQkJCShtZXRob2QuYW5ub3RhdGlvbnMgPT0gbnVsbCB8fCBtZXRob2QuYW5ub3RhdGlvbnMubGVuZ3RoID09IDApKSB7CisJCQkJY29udGV4dC5zZXRUb2tlbkxvY2F0aW9uKENvbXBsZXRpb25Db250ZXh0LlRMX01FTUJFUl9TVEFSVCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7CisJCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pcmVmZXJlbmNlQ29udGV4dDsKKwkJCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0IDw9IGFzdE5vZGUuc291cmNlU3RhcnQgJiYKKwkJCQkJCWFzdE5vZGUuc291cmNlRW5kIDw9IG1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQpIHsKKwkJCQkJLy8gY29tcGxldGlvbiBpcyBpbnNpZGUgYSBtZXRob2QgYm9keQorCQkJCQlpZiAoYXN0Tm9kZVBhcmVudCA9PSBudWxsICYmCisJCQkJCQkJYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgJiYKKwkJCQkJCQkhKChDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKWFzdE5vZGUpLmlzUHJlY2VkZWRCeU1vZGlmaWVycykgeworCQkJCQkJY29udGV4dC5zZXRUb2tlbkxvY2F0aW9uKENvbXBsZXRpb25Db250ZXh0LlRMX1NUQVRFTUVOVF9TVEFSVCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKwkJCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoZmllbGRzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKKwkJCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgZmllbGRzW2ldOworCQkJCQkJCWlmIChpbml0aWFsaXplci5ibG9jay5zb3VyY2VTdGFydCA8PSBhc3ROb2RlLnNvdXJjZVN0YXJ0ICYmCisJCQkJCQkJCQlhc3ROb2RlLnNvdXJjZVN0YXJ0IDwgaW5pdGlhbGl6ZXIuYm9keUVuZCkgeworCQkJCQkJCQkvLyBjb21wbGV0aW9uIGlzIGluc2lkZSBhbiBpbml0aWFsaXplcgorCQkJCQkJCQlpZiAoYXN0Tm9kZVBhcmVudCA9PSBudWxsICYmCisJCQkJCQkJCQkJYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgJiYKKwkJCQkJCQkJCQkhKChDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKWFzdE5vZGUpLmlzUHJlY2VkZWRCeU1vZGlmaWVycykgeworCQkJCQkJCQkJY29udGV4dC5zZXRUb2tlbkxvY2F0aW9uKENvbXBsZXRpb25Db250ZXh0LlRMX1NUQVRFTUVOVF9TVEFSVCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIGNoZWNrQ2FuY2VsKCkgeworCQlpZiAodGhpcy5tb25pdG9yICE9IG51bGwgJiYgdGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29tcGxldGUoCisJCQlBU1ROb2RlIGFzdE5vZGUsCisJCQlBU1ROb2RlIGFzdE5vZGVQYXJlbnQsCisJCQlBU1ROb2RlIGVuY2xvc2luZ05vZGUsCisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwKKwkJCUJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywKKwkJCVNjb3BlIHNjb3BlLAorCQkJYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbikgeworCisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQpOwogCiAJCXNjb3BlID0gY29tcHV0ZUZvcmJpZGRlbkJpbmRpbmdzKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQsIHNjb3BlKTsKLQkJY29tcHV0ZVVuaW50ZXJlc3RpbmdCaW5kaW5ncyhhc3ROb2RlUGFyZW50LCBzY29wZSk7CisJCWNvbXB1dGVVbmludGVyZXN0aW5nQmluZGluZ3MoYXN0Tm9kZSwgYXN0Tm9kZVBhcmVudCwgc2NvcGUpOwogCQlpZihhc3ROb2RlUGFyZW50ICE9IG51bGwpIHsKIAkJCWlmKCFpc1ZhbGlkUGFyZW50KGFzdE5vZGVQYXJlbnQsIGFzdE5vZGUsIHNjb3BlKSkgcmV0dXJuIGZhbHNlOwogCQkJY29tcHV0ZUV4cGVjdGVkVHlwZXMoYXN0Tm9kZVBhcmVudCwgYXN0Tm9kZSwgc2NvcGUpOwogCQl9Ci0JCQotCQlidWlsZENvbnRleHQoYXN0Tm9kZSwgYXN0Tm9kZVBhcmVudCwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwotCQkKKworCQlidWlsZENvbnRleHQoYXN0Tm9kZSwgYXN0Tm9kZVBhcmVudCwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKKwogCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkVHlwZSkgewotCi0JCQlDb21wbGV0aW9uT25GaWVsZFR5cGUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGRUeXBlKSBhc3ROb2RlOwotCQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0gKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIGZpZWxkLnR5cGU7Ci0JCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHR5cGUudG9rZW47Ci0JCQlzZXRTb3VyY2VSYW5nZSh0eXBlLnNvdXJjZVN0YXJ0LCB0eXBlLnNvdXJjZUVuZCk7Ci0JCQkKLQkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZSwgbmV3IE9iamVjdFZlY3RvcigpKTsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgewotCQkJCWZpbmRLZXl3b3Jkc0Zvck1lbWJlcih0aGlzLmNvbXBsZXRpb25Ub2tlbiwgZmllbGQubW9kaWZpZXJzKTsKLQkJCX0KLQkJCQotCQkJaWYgKCFmaWVsZC5pc0xvY2FsVmFyaWFibGUgJiYgZmllbGQubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KSB7Ci0JCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJCQlpZiAoIWVuY2xvc2luZ1R5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSB7Ci0JCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04pKSB7Ci0JCQkJCQlmaW5kTWV0aG9kcyh0aGlzLmNvbXBsZXRpb25Ub2tlbixudWxsLG51bGwsZW5jbG9zaW5nVHlwZSxzY29wZSxuZXcgT2JqZWN0VmVjdG9yKCksZmFsc2UsZmFsc2UsdHJ1ZSxudWxsLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSxudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT04pKSB7Ci0JCQkJCQlwcm9wb3NlTmV3TWV0aG9kKHRoaXMuY29tcGxldGlvblRva2VuLCBlbmNsb3NpbmdUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KKwkJCWNvbXBsZXRpb25PbkZpZWxkVHlwZShhc3ROb2RlLCBzY29wZSk7CiAJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUpIHsKLQotCQkJQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSBtZXRob2QgPSAoQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgYXN0Tm9kZTsKLQkJCVNpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZSA9IChDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSBtZXRob2QucmV0dXJuVHlwZTsKLQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gdHlwZS50b2tlbjsKLQkJCXNldFNvdXJjZVJhbmdlKHR5cGUuc291cmNlU3RhcnQsIHR5cGUuc291cmNlRW5kKTsKLQkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZS5wYXJlbnQsIG5ldyBPYmplY3RWZWN0b3IoKSk7Ci0JCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKLQkJCQlmaW5kS2V5d29yZHNGb3JNZW1iZXIodGhpcy5jb21wbGV0aW9uVG9rZW4sIG1ldGhvZC5tb2RpZmllcnMpOwotCQkJfQotCi0JCQlpZiAobWV0aG9kLm1vZGlmaWVycyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCkgewotCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQkJaWYgKCFlbmNsb3NpbmdUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgewotCQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OKSkgewotCQkJCQkJZmluZE1ldGhvZHModGhpcy5jb21wbGV0aW9uVG9rZW4sbnVsbCxudWxsLHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSxzY29wZSxuZXcgT2JqZWN0VmVjdG9yKCksZmFsc2UsZmFsc2UsdHJ1ZSxudWxsLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSxudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT04pKSB7Ci0JCQkJCQlwcm9wb3NlTmV3TWV0aG9kKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQorCQkJY29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZShhc3ROb2RlLCBzY29wZSk7CiAJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKLQotCQkJQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSBzaW5nbGVOYW1lUmVmZXJlbmNlID0gKENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UpIGFzdE5vZGU7Ci0JCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHNpbmdsZU5hbWVSZWZlcmVuY2UudG9rZW47Ci0JCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFN3aXRjaFN0YXRlbWVudCA/IChTd2l0Y2hTdGF0ZW1lbnQpIGFzdE5vZGVQYXJlbnQgOiBudWxsOwotCQkJaWYgKHN3aXRjaFN0YXRlbWVudCAhPSBudWxsCi0JCQkJCSYmIHN3aXRjaFN0YXRlbWVudC5leHByZXNzaW9uLnJlc29sdmVkVHlwZSAhPSBudWxsCi0JCQkJCSYmIHN3aXRjaFN0YXRlbWVudC5leHByZXNzaW9uLnJlc29sdmVkVHlwZS5pc0VudW0oKSkgewotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYpKSB7Ci0JCQkJCXRoaXMuYXNzaXN0Tm9kZUlzRW51bSA9IHRydWU7Ci0JCQkJCXRoaXMuZmluZEVudW1Db25zdGFudCh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgKFN3aXRjaFN0YXRlbWVudCkgYXN0Tm9kZVBhcmVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPiAtMSAmJiB0aGlzLmV4cGVjdGVkVHlwZXNbMF0uaXNBbm5vdGF0aW9uVHlwZSgpKSB7Ci0JCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBCbG9ja1Njb3BlICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRikpIHsKLQkJCQkJY2hhcltdW10gYWxyZWFkeURlZmluZWROYW1lID0gY29tcHV0ZUFscmVhZHlEZWZpbmVkTmFtZSgoQmxvY2tTY29wZSlzY29wZSwgc2luZ2xlTmFtZVJlZmVyZW5jZSk7Ci0JCQkJCQotCQkJCQlmaW5kVW5yZXNvbHZlZFJlZmVyZW5jZSgKLQkJCQkJCQlzaW5nbGVOYW1lUmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAotCQkJCQkJCXNpbmdsZU5hbWVSZWZlcmVuY2Uuc291cmNlRW5kLAotCQkJCQkJCShCbG9ja1Njb3BlKXNjb3BlLAotCQkJCQkJCWFscmVhZHlEZWZpbmVkTmFtZSk7Ci0JCQkJfQotCQkJCWZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKAotCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJc2NvcGUsCi0JCQkJCXNpbmdsZU5hbWVSZWZlcmVuY2UsCi0JCQkJCXNjb3BlLAotCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbiwKLQkJCQkJc2luZ2xlTmFtZVJlZmVyZW5jZS5pc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUpOwotCQkJCS8vIGNhbiBiZSB0aGUgc3RhcnQgb2YgYSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0JCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOwotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgewotCQkJCQlpZiAodGhpcy5jb21wbGV0aW9uVG9rZW4gIT0gbnVsbCAmJiB0aGlzLmNvbXBsZXRpb25Ub2tlbi5sZW5ndGggIT0gMCkgewotCQkJCQkJZmluZEtleXdvcmRzKHRoaXMuY29tcGxldGlvblRva2VuLCBzaW5nbGVOYW1lUmVmZXJlbmNlLnBvc3NpYmxlS2V5d29yZHMsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmaW5kVHJ1ZU9yRmFsc2VLZXl3b3JkcyhzaW5nbGVOYW1lUmVmZXJlbmNlLnBvc3NpYmxlS2V5d29yZHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSl7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgS2V5d29yZHMuVEhJUywgZmFsc2UpKSB7Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZiA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJCQkJCWZpbmRFeHBsaWNpdENvbnN0cnVjdG9ycyhLZXl3b3Jkcy5USElTLCByZWYsIChNZXRob2RTY29wZSlzY29wZSwgc2luZ2xlTmFtZVJlZmVyZW5jZSk7Ci0JCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5jb21wbGV0aW9uVG9rZW4sIEtleXdvcmRzLlNVUEVSLCBmYWxzZSkpIHsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkJCQkJZmluZEV4cGxpY2l0Q29uc3RydWN0b3JzKEtleXdvcmRzLlNVUEVSLCByZWYuc3VwZXJjbGFzcygpLCAoTWV0aG9kU2NvcGUpc2NvcGUsIHNpbmdsZU5hbWVSZWZlcmVuY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCisJCQljb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQsIHNjb3BlLCBpbnNpZGVUeXBlQW5ub3RhdGlvbik7CiAJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKLQotCQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVSZWYgPSAoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZTsKLQkJCQotCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBzaW5nbGVSZWYudG9rZW47Ci0KLQkJCXRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MgPSBzaW5nbGVSZWYuaXNDbGFzcygpOwotCQkJdGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24gPSBzaW5nbGVSZWYuaXNFeGNlcHRpb24oKTsKLQkJCXRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlID0gc2luZ2xlUmVmLmlzSW50ZXJmYWNlKCk7Ci0JCQl0aGlzLmFzc2lzdE5vZGVJc0NvbnN0cnVjdG9yID0gc2luZ2xlUmVmLmlzQ29uc3RydWN0b3JUeXBlOwotCQkJdGhpcy5hc3Npc3ROb2RlSXNTdXBlclR5cGUgPSBzaW5nbGVSZWYuaXNTdXBlclR5cGUoKTsKLQkJCQotCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUKLQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nID09IG51bGwpIHsKLQkJCQlpZiAodGhpcy5jb21wbGV0aW9uVG9rZW4ubGVuZ3RoID09IDAgJiYKLQkJCQkJCShhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgfHwKLQkJCQkJCQkJYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSkgewotCQkJCQl0aGlzLnNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlU3RhcnQgLSAxLCBmYWxzZSk7Ci0JCQkJCQotCQkJCQlmaW5kUGFyYW1ldGVyaXplZFR5cGUoKFR5cGVSZWZlcmVuY2UpYXN0Tm9kZVBhcmVudCwgc2NvcGUpOwotCQkJCX0gZWxzZSB7IAotCQkJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKLQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uICYmIGFzdE5vZGVQYXJlbnQgaW5zdGFuY2VvZiBUcnlTdGF0ZW1lbnQpIHsKLQkJCQkJCWZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KAotCQkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAotCQkJCQkJCQkoQmxvY2tTY29wZSlzY29wZSwKLQkJCQkJCQkJdHlwZXNGb3VuZCk7Ci0JCQkJCX0KLQkJCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCB0eXBlc0ZvdW5kKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJCWZpbmRNZW1iZXJUeXBlcygKLQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAotCQkJCQlzY29wZSwKLQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAotCQkJCQlmYWxzZSwKLQkJCQkJZmFsc2UsCi0JCQkJCWZhbHNlLAotCQkJCQlmYWxzZSwKLQkJCQkJIXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IsCi0JCQkJCW51bGwsCi0JCQkJCW5ldyBPYmplY3RWZWN0b3IoKSk7Ci0JCQl9CisJCQljb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgewotCi0JCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7Ci0JCQlDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9Ci0JCQkJKENvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIGFzdE5vZGU7Ci0JCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHJlZi5jb21wbGV0aW9uSWRlbnRpZmllcjsKLQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdOwotCi0JCQlpZiAocXVhbGlmaWVkQmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCkgewotCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkvLyBjb21wbGV0ZSBmaWVsZCBtZW1iZXJzIHdpdGggbWlzc2luZyBmaWVsZHMgdHlwZQotCQkJCS8vIGNsYXNzIFggewotCQkJCS8vICAgTWlzc2luZyBmOwotCQkJCS8vICAgdm9pZCBmb28oKSB7Ci0JCQkJLy8gICAgIGYufAotCQkJCS8vICAgfQotCQkJCS8vIH0KLQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDAgJiYKLQkJCQkJCSh0aGlzLnJlcXVlc3Rvci5pc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fCAKLQkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgewotCQkJCQlpZihyZWYudG9rZW5zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21NaXNzaW5nRmllbGRUeXBlKHJlZi50b2tlbnNbMF0sIHNjb3BlLCByZWYsIGluc2lkZVR5cGVBbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykgewotCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZykgcXVhbGlmaWVkQmluZGluZykudHlwZTsKLQkJCQlpZiAocmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKLQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHModGhpcy5jb21wbGV0aW9uVG9rZW4sIHJlY2VpdmVyVHlwZS5jYXB0dXJlKHNjb3BlLCByZWYuc291cmNlRW5kKSwgc2NvcGUsIHJlZiwgc2NvcGUsZmFsc2UsZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwICYmCi0JCQkJCQkodGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikgfHwKLQkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgewotCQkJCQlib29sZWFuIHByb3Bvc2VGaWVsZCA9ICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRik7Ci0JCQkJCWJvb2xlYW4gcHJvcG9zZU1ldGhvZCA9ICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpOwotCQkJCQlpZiAocHJvcG9zZUZpZWxkIHx8IHByb3Bvc2VNZXRob2QpIHsKLQkJCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKLQkJCQkJCQkvLyBjb21wbGV0ZSBsb2NhbCB2YXJpYWJsZSBtZW1iZXJzIHdpdGggbWlzc2luZyB2YXJpYWJsZXMgdHlwZQotCQkJCQkJCS8vIGNsYXNzIFggewotCQkJCQkJCS8vICAgdm9pZCBmb28oKSB7Ci0JCQkJCQkJLy8gICAgIE1pc3NpbmcgZjsKLQkJCQkJCQkvLyAgICAgZi58Ci0JCQkJCQkJLy8gICB9Ci0JCQkJCQkJLy8gfQotCQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOwotCQkJCQkJCQotCQkJCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdUeXBlKAotCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5kZWNsYXJhdGlvbi50eXBlLAotCQkJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcuZGVjbGFyaW5nU2NvcGUsCi0JCQkJCQkJCQlyZWYsCi0JCQkJCQkJCQlzY29wZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgJiYgIShxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykpIHsKLQkJCQlib29sZWFuIGlzSW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSA9IHJlZi5pc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGU7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZzsKLQkJCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7Ci0KLQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJCWZpbmRNZW1iZXJUeXBlcygKLQkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJCQkJc2NvcGUsCi0JCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAotCQkJCQkJCWZhbHNlLAotCQkJCQkJCXRydWUsCi0JCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpKTsKLQkJCQl9Ci0JCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikpIHsKLQkJCQkJZmluZENsYXNzRmllbGQodGhpcy5jb21wbGV0aW9uVG9rZW4sIChUeXBlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwotCQkJCX0KLQkJCQkKLQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IG51bGw7Ci0JCQkJaWYgKCFpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUgJiYKLQkJCQkJCSF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpICYmCi0JCQkJCQkoKHNjb3BlIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUgJiYgISgoTWV0aG9kU2NvcGUpc2NvcGUpLmlzU3RhdGljKQotCQkJCQkJfHwgKChtZXRob2RTY29wZSA9IHNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkpICE9IG51bGwgJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljKSkpIHsKLQkJCQkJaWYgKHRoaXMuY29tcGxldGlvblRva2VuLmxlbmd0aCA+IDApIHsKLQkJCQkJCWZpbmRLZXl3b3Jkcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbmV3IGNoYXJbXVtde0tleXdvcmRzLlRISVN9LCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgS2V5d29yZHMuVEhJUyk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcmRzCi0JCQkJCQlyZWxldmFuY2UgKz0gUl9OT05fSU5IRVJJVEVEOwotCQkJCQkJCi0JCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgewotCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXROYW1lKEtleXdvcmRzLlRISVMpOwotCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oS2V5d29yZHMuVEhJUyk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikpIHsKLQkJCQkJZmluZEZpZWxkcygKLQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQkJc2NvcGUsCi0JCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCi0JCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCi0JCQkJCQl0cnVlLAotCQkJCQkJcmVmLAotCQkJCQkJc2NvcGUsCi0JCQkJCQlmYWxzZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJZmFsc2UpOwotCQkJCX0KLQotCQkJCWlmICghaXNJbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7Ci0JCQkJCWZpbmRNZXRob2RzKAotCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCXJlY2VpdmVyVHlwZSwKLQkJCQkJCXNjb3BlLAotCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAotCQkJCQkJdHJ1ZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJZmFsc2UsCi0JCQkJCQlyZWYsCi0JCQkJCQlzY29wZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJZmFsc2UsCi0JCQkJCQlmYWxzZSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCWZhbHNlKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7Ci0KLQkJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCS8vIHJlcGxhY2UgdG8gdGhlIGVuZCBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyCi0JCQkJZmluZFR5cGVzQW5kU3VicGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIChQYWNrYWdlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwotCQkJfQorCQkJY29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZShhc3ROb2RlLCBlbmNsb3NpbmdOb2RlLCBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSwgaW5zaWRlVHlwZUFubm90YXRpb24pOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7Ci0KLQkJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQotCQkJQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPQotCQkJCShDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBhc3ROb2RlOwotCQkJCi0JCQl0aGlzLmFzc2lzdE5vZGVJc0NsYXNzID0gcmVmLmlzQ2xhc3MoKTsKLQkJCXRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uID0gcmVmLmlzRXhjZXB0aW9uKCk7Ci0JCQl0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSA9IHJlZi5pc0ludGVyZmFjZSgpOwotCQkJdGhpcy5hc3Npc3ROb2RlSXNTdXBlclR5cGUgPSByZWYuaXNTdXBlclR5cGUoKTsKLQkJCQotCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSByZWYuY29tcGxldGlvbklkZW50aWZpZXI7Ci0JCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnRva2Vucy5sZW5ndGhdOwotCi0JCQkvLyBnZXQgdGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgotCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nICYmICEocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZUJpbmRpbmcpKSB7Ci0JCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCQotCQkJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKLQkJCQkJCi0JCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbiAmJiBhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7Ci0JCQkJCQlmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCgKLQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKXF1YWxpZmllZEJpbmRpbmcsCi0JCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKLQkJCQkJCQkJKEJsb2NrU2NvcGUpc2NvcGUsCi0JCQkJCQkJCXR5cGVzRm91bmQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kTWVtYmVyVHlwZXMoCi0JCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAotCQkJCQkJc2NvcGUsCi0JCQkJCQlzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksCi0JCQkJCQlmYWxzZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJdHlwZXNGb3VuZCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKLQotCQkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKLQkJCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7Ci0JCQl9CisJCQljb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSB7Ci0JCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7Ci0JCQlDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MgYWNjZXNzID0gKENvbXBsZXRpb25Pbk1lbWJlckFjY2VzcykgYXN0Tm9kZTsKLQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gYWNjZXNzLm5hbWVTb3VyY2VQb3NpdGlvbjsKLQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKLQotCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBhY2Nlc3MudG9rZW47Ci0JCQkKLQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSB7Ci0JCQkJLy8gY29tcGxldGUgbWV0aG9kIG1lbWJlcnMgd2l0aCBtaXNzaW5nIHJldHVybiB0eXBlCi0JCQkJLy8gY2xhc3MgWCB7Ci0JCQkJLy8gICBNaXNzaW5nIGYoKSB7cmV0dXJuIG51bGw7fQotCQkJCS8vICAgdm9pZCBmb28oKSB7Ci0JCQkJLy8gICAgIGYoKS58Ci0JCQkJLy8gICB9Ci0JCQkJLy8gfQotCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMCAmJgotCQkJCQkJKHRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8Ci0JCQkJCQkJCXRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkpIHsKLQkJCQkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbU1ldGhvZEJpbmRpbmcgPSAoUHJvYmxlbU1ldGhvZEJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmc7CQkJCQotCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21NaXNzaW5nUmV0dXJuVHlwZSgKLQkJCQkJCQlwcm9ibGVtTWV0aG9kQmluZGluZy5zZWxlY3RvciwKLQkJCQkJCQlwcm9ibGVtTWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAotCQkJCQkJCXNjb3BlLAotCQkJCQkJCWFjY2VzcywKLQkJCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWFjY2Vzcy5pc0luc2lkZUFubm90YXRpb24pIHsKLQkJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpKSB7Ci0JCQkJCQlmaW5kS2V5d29yZHModGhpcy5jb21wbGV0aW9uVG9rZW4sIG5ldyBjaGFyW11bXXtLZXl3b3Jkcy5ORVd9LCBmYWxzZSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcygKLQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJKChUeXBlQmluZGluZykgcXVhbGlmaWVkQmluZGluZykuY2FwdHVyZShzY29wZSwgYWNjZXNzLnJlY2VpdmVyLnNvdXJjZUVuZCksCi0JCQkJCQlzY29wZSwKLQkJCQkJCWFjY2VzcywKLQkJCQkJCXNjb3BlLAotCQkJCQkJZmFsc2UsCi0JCQkJCQlhY2Nlc3MucmVjZWl2ZXIgaW5zdGFuY2VvZiBTdXBlclJlZmVyZW5jZSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCWZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KKwkJCWNvbXBsZXRpb25Pbk1lbWJlckFjY2Vzcyhhc3ROb2RlLCBlbmNsb3NpbmdOb2RlLCBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSwgaW5zaWRlVHlwZUFubm90YXRpb24pOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZXNzYWdlU2VuZCkgewotCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKLQkJCQotCQkJQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQpIGFzdE5vZGU7Ci0JCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0gY29tcHV0ZVR5cGVzKG1lc3NhZ2VTZW5kLmFyZ3VtZW50cyk7Ci0JCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IG1lc3NhZ2VTZW5kLnNlbGVjdG9yOwotCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkgewotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSkgewotCQkJCQlmaW5kSW1wbGljaXRNZXNzYWdlU2VuZHModGhpcy5jb21wbGV0aW9uVG9rZW4sIGFyZ1R5cGVzLCBzY29wZSwgbWVzc2FnZVNlbmQsIHNjb3BlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgIGlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSkgewotCQkJCWZpbmRNZXRob2RzKAotCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJbnVsbCwKLQkJCQkJYXJnVHlwZXMsCi0JCQkJCShSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZykuY2FwdHVyZShzY29wZSwgbWVzc2FnZVNlbmQucmVjZWl2ZXIuc291cmNlRW5kKSwKLQkJCQkJc2NvcGUsCi0JCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKLQkJCQkJZmFsc2UsCi0JCQkJCXRydWUsCi0JCQkJCWZhbHNlLAotCQkJCQltZXNzYWdlU2VuZCwKLQkJCQkJc2NvcGUsCi0JCQkJCWZhbHNlLAotCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciBpbnN0YW5jZW9mIFN1cGVyUmVmZXJlbmNlLAotCQkJCQlmYWxzZSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJZmFsc2UpOwotCQkJfQorCQkJY29tcGxldGlvbk9uTWVzc2FnZVNlbmQoYXN0Tm9kZSwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgewotCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7Ci0JCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKLQkJCQkKLQkJCQlDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwgPQotCQkJCQkoQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGFzdE5vZGU7Ci0JCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IGNvbXB1dGVUeXBlcyhjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzKTsKLQkJCQlmaW5kQ29uc3RydWN0b3JzKAotCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKLQkJCQkJYXJnVHlwZXMsCi0JCQkJCXNjb3BlLAotCQkJCQljb25zdHJ1Y3RvckNhbGwsCi0JCQkJCWZhbHNlKTsKLQkJCQkJCQkJCX0KKwkJCWNvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKGFzdE5vZGUsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLQkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlRW5kLCBmYWxzZSk7Ci0JCQkKLQkJCUNvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwcmVzc2lvbiA9Ci0JCQkJKENvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSBhc3ROb2RlOwotCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IGNvbXB1dGVUeXBlcyhhbGxvY0V4cHJlc3Npb24uYXJndW1lbnRzKTsKLQkJCQotCQkJUmVmZXJlbmNlQmluZGluZyByZWYgPSAoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZzsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKQotCQkJCQkmJiByZWYuaXNDbGFzcygpCi0JCQkJCSYmICFyZWYuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJCWZpbmRDb25zdHJ1Y3RvcnMoCi0JCQkJCQlyZWYsCi0JCQkJCQlhcmdUeXBlcywKLQkJCQkJCXNjb3BlLAotCQkJCQkJYWxsb2NFeHByZXNzaW9uLAotCQkJCQkJZmFsc2UpOwotCQkJfQotCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTikKLQkJCQkJJiYgIXJlZi5pc0ZpbmFsKCkKLQkJCQkJJiYgIXJlZi5pc0VudW0oKSl7Ci0JCQkJZmluZEFub255bW91c1R5cGUoCi0JCQkJCXJlZiwKLQkJCQkJYXJnVHlwZXMsCi0JCQkJCXNjb3BlLAotCQkJCQlhbGxvY0V4cHJlc3Npb24pOwotCQkJfQorCQkJY29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oYXN0Tm9kZSwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MpIHsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYpKSB7Ci0JCQkJQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzIGFjY2VzcyA9IChDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MpIGFzdE5vZGU7Ci0JCQkJc2V0U291cmNlUmFuZ2UoYWNjZXNzLmNsYXNzU3RhcnQsIGFjY2Vzcy5zb3VyY2VFbmQpOwotCi0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBhY2Nlc3MuY29tcGxldGlvbklkZW50aWZpZXI7Ci0KLQkJCQlmaW5kQ2xhc3NGaWVsZCh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7Ci0JCQl9CisJCQljb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MoYXN0Tm9kZSwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZXRob2ROYW1lKSB7Ci0JCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04pKSB7Ci0JCQkJQ29tcGxldGlvbk9uTWV0aG9kTmFtZSBtZXRob2QgPSAoQ29tcGxldGlvbk9uTWV0aG9kTmFtZSkgYXN0Tm9kZTsKLQkJCQkJCi0JCQkJc2V0U291cmNlUmFuZ2UobWV0aG9kLnNvdXJjZVN0YXJ0LCBtZXRob2Quc2VsZWN0b3JFbmQpOwotCQkJCQkKLQkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZmllbGRzKCk7Ci0JCQkJY2hhcltdW10gZXhjbHVkZU5hbWVzID0gbmV3IGNoYXJbZmllbGRzLmxlbmd0aF1bXTsKLQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspewotCQkJCQlleGNsdWRlTmFtZXNbaV0gPSBmaWVsZHNbaV0ubmFtZTsKLQkJCQl9Ci0JCQkJCi0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBtZXRob2Quc2VsZWN0b3I7Ci0JCQkJCi0JCQkJZmluZFZhcmlhYmxlTmFtZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIG1ldGhvZC5yZXR1cm5UeXBlLCBleGNsdWRlTmFtZXMsIG51bGwsIEZJRUxELCBtZXRob2QubW9kaWZpZXJzKTsKLQkJCX0KKwkJCWNvbXBsZXRpb25Pbk1ldGhvZE5hbWUoYXN0Tm9kZSwgc2NvcGUpOwogCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25GaWVsZE5hbWUpIHsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5WQVJJQUJMRV9ERUNMQVJBVElPTikpIHsKLQkJCQlDb21wbGV0aW9uT25GaWVsZE5hbWUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGROYW1lKSBhc3ROb2RlOwotCQkJCQotCQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5maWVsZHMoKTsKLQkJCQljaGFyW11bXSBleGNsdWRlTmFtZXMgPSBuZXcgY2hhcltmaWVsZHMubGVuZ3RoXVtdOwotCQkJCWZvcihpbnQgaSA9IDAgOyBpIDwgZmllbGRzLmxlbmd0aCA7IGkrKyl7Ci0JCQkJCWV4Y2x1ZGVOYW1lc1tpXSA9IGZpZWxkc1tpXS5uYW1lOwotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IGZpZWxkLnJlYWxOYW1lOwotCQkJCQotCQkJCWZpbmRWYXJpYWJsZU5hbWVzKGZpZWxkLnJlYWxOYW1lLCBmaWVsZC50eXBlLCBleGNsdWRlTmFtZXMsIG51bGwsIEZJRUxELCBmaWVsZC5tb2RpZmllcnMpOwotCQkJfQotCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Mb2NhbE5hbWUgfHwgYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSkgewotCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlZBUklBQkxFX0RFQ0xBUkFUSU9OKSkgewotCQkJCUxvY2FsRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoTG9jYWxEZWNsYXJhdGlvbikgYXN0Tm9kZTsKLQkJCQkKLQkJCQlpbnQga2luZDsKLQkJCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Mb2NhbE5hbWUpewotCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9ICgoQ29tcGxldGlvbk9uTG9jYWxOYW1lKSB2YXJpYWJsZSkucmVhbE5hbWU7Ci0JCQkJCWtpbmQgPSBMT0NBTDsKLQkJCQl9IGVsc2UgewotCQkJCQlDb21wbGV0aW9uT25Bcmd1bWVudE5hbWUgYXJnID0gKENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSkgdmFyaWFibGU7Ci0JCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gYXJnLnJlYWxOYW1lOwotCQkJCQlraW5kID0gYXJnLmlzQ2F0Y2hBcmd1bWVudCA/IExPQ0FMIDogQVJHVU1FTlQ7Ci0JCQkJfQotCQkJCQotCQkJCWNoYXJbXVtdIGFscmVhZHlEZWZpbmVkTmFtZSA9IGNvbXB1dGVBbHJlYWR5RGVmaW5lZE5hbWUoKEJsb2NrU2NvcGUpc2NvcGUsIHZhcmlhYmxlKTsKLQkJCQkKLQkJCQljaGFyW11bXSBmb3JiaWRkZW5OYW1lcyA9IGZpbmRWYXJpYWJsZUZyb21VbnJlc29sdmVkUmVmZXJlbmNlKHZhcmlhYmxlLCAoQmxvY2tTY29wZSlzY29wZSwgYWxyZWFkeURlZmluZWROYW1lKTsKLQkJCQkKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZ1tdIGxvY2FscyA9ICgoQmxvY2tTY29wZSlzY29wZSkubG9jYWxzOwotCQkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMgPSBuZXcgY2hhcltsb2NhbHMubGVuZ3RoXVtdOwotCQkJCWludCBsb2NhbENvdW50ID0gMDsKLQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxvY2Fscy5sZW5ndGggOyBpKyspewotCQkJCQlpZiAobG9jYWxzW2ldICE9IG51bGwpIHsKLQkJCQkJCWRpc2NvdXJhZ2VkTmFtZXNbbG9jYWxDb3VudCsrXSA9IGxvY2Fsc1tpXS5uYW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGlzY291cmFnZWROYW1lcywgMCwgZGlzY291cmFnZWROYW1lcyA9IG5ldyBjaGFyW2xvY2FsQ291bnRdW10sIDAsIGxvY2FsQ291bnQpOwotCQkJCQotCQkJCWZpbmRWYXJpYWJsZU5hbWVzKHRoaXMuY29tcGxldGlvblRva2VuLCB2YXJpYWJsZS50eXBlLCBkaXNjb3VyYWdlZE5hbWVzLCBmb3JiaWRkZW5OYW1lcywga2luZCwgdmFyaWFibGUubW9kaWZpZXJzKTsKLQkJCX0KKwkJCWNvbXBsZXRpb25PbkZpZWxkTmFtZShhc3ROb2RlLCBzY29wZSk7CisJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkxvY2FsTmFtZSkgeworCQkJY29tcGxldGlvbk9uTG9jYWxPckFyZ3VtZW50TmFtZShhc3ROb2RlLCBzY29wZSk7CisJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSkgeworCQkJY29tcGxldGlvbk9uTG9jYWxPckFyZ3VtZW50TmFtZShhc3ROb2RlLCBzY29wZSk7CiAJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbktleXdvcmQpIHsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgewotCQkJCUNvbXBsZXRpb25PbktleXdvcmQga2V5d29yZCA9IChDb21wbGV0aW9uT25LZXl3b3JkKWFzdE5vZGU7Ci0JCQkJZmluZEtleXdvcmRzKGtleXdvcmQuZ2V0VG9rZW4oKSwga2V5d29yZC5nZXRQb3NzaWJsZUtleXdvcmRzKCksIGtleXdvcmQuY2FuQ29tcGxldGVFbXB0eVRva2VuKCksIGZhbHNlKTsKLQkJCX0KKwkJCWNvbXBsZXRpb25PbktleXdvcmQoYXN0Tm9kZSk7CiAJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7Ci0JCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcmVmID0gKENvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBhc3ROb2RlOwotCQkJCQotCQkJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKLQotCQkJCXRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MgPSByZWYuaXNDbGFzcygpOwotCQkJCXRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uID0gcmVmLmlzRXhjZXB0aW9uKCk7Ci0JCQkJdGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UgPSByZWYuaXNJbnRlcmZhY2UoKTsKLQkJCQl0aGlzLmFzc2lzdE5vZGVJc1N1cGVyVHlwZSA9IHJlZi5pc1N1cGVyVHlwZSgpOwotCQkJCQotCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gcmVmLmNvbXBsZXRpb25JZGVudGlmaWVyOwotCQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYudG9rZW5zLmxlbmd0aF07Ci0JCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQotCQkJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOwotCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbiAmJiBhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7Ci0JCQkJCWZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KAotCQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKXF1YWxpZmllZEJpbmRpbmcsCi0JCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAotCQkJCQkJCShCbG9ja1Njb3BlKXNjb3BlLAotCQkJCQkJCXR5cGVzRm91bmQpOwotCQkJCX0KLQkJCQkKLQkJCQlmaW5kTWVtYmVyVHlwZXMoCi0JCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKLQkJCQkJc2NvcGUsCi0JCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKLQkJCQkJZmFsc2UsCi0JCQkJCWZhbHNlLAotCQkJCQl0eXBlc0ZvdW5kKTsKLQkJCX0KKwkJCWNvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWFya2VyQW5ub3RhdGlvbk5hbWUpIHsKLQkJCUNvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lIGFubm90ID0gKENvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lKSBhc3ROb2RlOwotCQkJCi0JCQlDb21wbGV0aW9uT25Bbm5vdGF0aW9uT2ZUeXBlIGZha2VUeXBlID0gKENvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUpc2NvcGUucGFyZW50LnJlZmVyZW5jZUNvbnRleHQoKTsKLQkJCWlmIChmYWtlVHlwZS5hbm5vdGF0aW9uc1swXSA9PSBhbm5vdCkgewotCQkJCS8vIFdoZW4gdGhlIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgbWV0aG9kIGJvZHkgdGhlIGFubm90YXRpb24gY2Fubm90IGJlIGFjY3VyYXRseSBhdHRhY2hlZCB0byB0aGUgY29ycmVjdCBub2RlIGJ5IGNvbXBsZXRpb24gcmVjb3ZlcnkuCi0JCQkJLy8gU28gJ3RhcmdldGVkRWxlbWVudCcgaXMgbm90IGNvbXB1dGVkIGluIHRoaXMgY2FzZS4KLQkJCQlpZiAoc2NvcGUucGFyZW50LnBhcmVudCA9PSBudWxsIHx8ICEoc2NvcGUucGFyZW50LnBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFNjb3BlKSkgewotCQkJCQl0aGlzLnRhcmdldGVkRWxlbWVudCA9IGNvbXB1dGVUYXJnZXRlZEVsZW1lbnQoZmFrZVR5cGUpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQkJdGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uID0gdHJ1ZTsKLQkJCWlmIChhbm5vdC50eXBlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQkJCUNvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZSA9IChDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSBhbm5vdC50eXBlOwotCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gdHlwZS50b2tlbjsKLQkJCQlzZXRTb3VyY2VSYW5nZSh0eXBlLnNvdXJjZVN0YXJ0LCB0eXBlLnNvdXJjZUVuZCk7Ci0JCQkJCi0JCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOwotCQkJfSBlbHNlIGlmIChhbm5vdC50eXBlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewotCQkJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkKLQkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGUgPSAoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgYW5ub3QudHlwZTsKLQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHR5cGUuY29tcGxldGlvbklkZW50aWZpZXI7Ci0JCQkJbG9uZyBjb21wbGV0aW9uUG9zaXRpb24gPSB0eXBlLnNvdXJjZVBvc2l0aW9uc1t0eXBlLnRva2Vucy5sZW5ndGhdOwotCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKLQotCQkJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkvLyByZXBsYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgotCQkJCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCi0JCQkJCWZpbmRNZW1iZXJUeXBlcygKLQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsCi0JCQkJCQlzY29wZSwKLQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJZmFsc2UsCi0JCQkJCQluZXcgT2JqZWN0VmVjdG9yKCkpOwotCQkJCX0KLQkJCX0KKwkJCWNvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lKGFzdE5vZGUsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lKSB7Ci0JCQlDb21wbGV0aW9uT25NZW1iZXJWYWx1ZU5hbWUgbWVtYmVyVmFsdWVQYWlyID0gKENvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZSkgYXN0Tm9kZTsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBhc3ROb2RlUGFyZW50OwotCQkJCi0JCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IG1lbWJlclZhbHVlUGFpci5uYW1lOwotCQkJCi0JCQlSZWZlcmVuY2VCaW5kaW5nIGFubm90YXRpb25UeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpYW5ub3RhdGlvbi5yZXNvbHZlZFR5cGU7Ci0JCQkKLQkJCWlmIChhbm5vdGF0aW9uVHlwZSAhPSBudWxsICYmIGFubm90YXRpb25UeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgewotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5BTk5PVEFUSU9OX0FUVFJJQlVURV9SRUYpKSB7Ci0JCQkJCXRoaXMuZmluZEFubm90YXRpb25BdHRyaWJ1dGVzKHRoaXMuY29tcGxldGlvblRva2VuLCBhbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMoKSwgYW5ub3RhdGlvblR5cGUpOwotCQkJCX0KLQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlQ2FuQmVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCWlmICh0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPiAtMSAmJiB0aGlzLmV4cGVjdGVkVHlwZXNbMF0uaXNBbm5vdGF0aW9uVHlwZSgpKSB7Ci0JCQkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUsIG5ldyBPYmplY3RWZWN0b3IoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBCbG9ja1Njb3BlICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRikpIHsKLQkJCQkJCQljaGFyW11bXSBhbHJlYWR5RGVmaW5lZE5hbWUgPSBjb21wdXRlQWxyZWFkeURlZmluZWROYW1lKChCbG9ja1Njb3BlKXNjb3BlLCBGYWtlSW52b2NhdGlvblNpdGUpOwotCQkJCQkJCQotCQkJCQkJCWZpbmRVbnJlc29sdmVkUmVmZXJlbmNlKAotCQkJCQkJCQkJbWVtYmVyVmFsdWVQYWlyLnNvdXJjZVN0YXJ0LAotCQkJCQkJCQkJbWVtYmVyVmFsdWVQYWlyLnNvdXJjZUVuZCwKLQkJCQkJCQkJCShCbG9ja1Njb3BlKXNjb3BlLAotCQkJCQkJCQkJYWxyZWFkeURlZmluZWROYW1lKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKAotCQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJCXNjb3BlLAotCQkJCQkJCUZha2VJbnZvY2F0aW9uU2l0ZSwKLQkJCQkJCQlzY29wZSwKLQkJCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbiwKLQkJCQkJCQl0cnVlKTsKLQkJCQkJCS8vIGNhbiBiZSB0aGUgc3RhcnQgb2YgYSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0JCQkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUsIG5ldyBPYmplY3RWZWN0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZihhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbCkgewotCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxBQkVMX1JFRikpIHsKLQkJCQlDb21wbGV0aW9uT25CcmFua1N0YXRlbWVudExhYmVsIGxhYmVsID0gKENvbXBsZXRpb25PbkJyYW5rU3RhdGVtZW50TGFiZWwpIGFzdE5vZGU7Ci0JCQkJCi0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBsYWJlbC5sYWJlbDsKLQkJCQkKLQkJCQl0aGlzLmZpbmRMYWJlbHModGhpcy5jb21wbGV0aW9uVG9rZW4sIGxhYmVsLnBvc3NpYmxlTGFiZWxzKTsKLQkJCX0KKwkJCWNvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZShhc3ROb2RlLCBhc3ROb2RlUGFyZW50LCBzY29wZSwgaW5zaWRlVHlwZUFubm90YXRpb24pOworCQl9IGVsc2UgaWYoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsKSB7CisJCQljb21wbGV0aW9uT25CcmFuY2hTdGF0ZW1lbnRMYWJlbChhc3ROb2RlKTsKIAkJfSBlbHNlIGlmKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZXNzYWdlU2VuZE5hbWUpIHsKLQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSkgewotCQkJCUNvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kTmFtZSBtZXNzYWdlU2VuZCA9IChDb21wbGV0aW9uT25NZXNzYWdlU2VuZE5hbWUpIGFzdE5vZGU7Ci0JCQkJCi0JCQkJdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOwotCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gbWVzc2FnZVNlbmQuc2VsZWN0b3I7Ci0JCQkJYm9vbGVhbiBvbmx5U3RhdGljID0gZmFsc2U7Ci0JCQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gbnVsbDsKLQkJCQlpZihxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgVmFyaWFibGVCaW5kaW5nKSB7Ci0JCQkJCXJlY2VpdmVyVHlwZSA9ICgoVmFyaWFibGVCaW5kaW5nKXF1YWxpZmllZEJpbmRpbmcpLnR5cGU7Ci0JCQkJfSBlbHNlIGlmKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSB7Ci0JCQkJCXJlY2VpdmVyVHlwZSA9ICgoTWV0aG9kQmluZGluZylxdWFsaWZpZWRCaW5kaW5nKS5yZXR1cm5UeXBlOwotCQkJCX0gZWxzZSBpZihxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyAmJiAhKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKSkgewotCQkJCQlvbmx5U3RhdGljID0gdHJ1ZTsKLQkJCQkJcmVjZWl2ZXJUeXBlID0gKFR5cGVCaW5kaW5nKXF1YWxpZmllZEJpbmRpbmc7Ci0JCQkJfQotCQkJCWlmKHJlY2VpdmVyVHlwZSAhPSBudWxsICYmIHJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKLQkJCQkJVHlwZUJpbmRpbmdbXSB0eXBlQXJnVHlwZXMgPSBjb21wdXRlVHlwZXNJZkNvcnJlY3QobWVzc2FnZVNlbmQudHlwZUFyZ3VtZW50cyk7Ci0JCQkJCWlmKHR5cGVBcmdUeXBlcyAhPSBudWxsKSB7Ci0JCQkJCQl0aGlzLmZpbmRNZXRob2RzKAotCQkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCQkJdHlwZUFyZ1R5cGVzLAotCQkJCQkJCQludWxsLAotCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUuY2FwdHVyZShzY29wZSwgbWVzc2FnZVNlbmQucmVjZWl2ZXIuc291cmNlRW5kKSwKLQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKLQkJCQkJCQkJb25seVN0YXRpYywKLQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCWZhbHNlLAotCQkJCQkJCQltZXNzYWdlU2VuZCwKLQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCWZhbHNlLAotCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCWZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KKwkJCWNvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kTmFtZShhc3ROb2RlLCBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7CiAJCS8vIENvbXBsZXRpb24gb24gSmF2YWRvYyBub2RlcwogCQl9IGVsc2UgaWYgKChhc3ROb2RlLmJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpICE9IDApIHsKIAkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UpIHsKLQotCQkJCUNvbXBsZXRpb25PbkphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UpIGFzdE5vZGU7Ci0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSB0eXBlUmVmLnRva2VuOwotCQkJCXRoaXMuamF2YWRvY1RhZ1Bvc2l0aW9uID0gdHlwZVJlZi50YWdTb3VyY2VTdGFydDsKLQkJCQlzZXRTb3VyY2VSYW5nZSh0eXBlUmVmLnNvdXJjZVN0YXJ0LCB0eXBlUmVmLnNvdXJjZUVuZCk7Ci0JCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOwotCisJCQkJY29tcGxldGlvbk9uSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UoYXN0Tm9kZSwgc2NvcGUpOwogCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQotCQkJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKLQotCQkJCUNvbXBsZXRpb25PbkphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIGFzdE5vZGU7Ci0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSB0eXBlUmVmLmNvbXBsZXRpb25JZGVudGlmaWVyOwotCQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gdHlwZVJlZi5zb3VyY2VQb3NpdGlvbnNbdHlwZVJlZi50b2tlbnMubGVuZ3RoXTsKLQkJCQl0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA9IHR5cGVSZWYudGFnU291cmNlU3RhcnQ7Ci0KLQkJCQkvLyBnZXQgdGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgotCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyAmJiAhKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKSkgewotCQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8Ci0JCQkJCQkJKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRikpKSB7Ci0JCQkJCQlpbnQgcmFuZ2VTdGFydCA9IHR5cGVSZWYuY29tcGxldGVJblRleHQoKSA/IHR5cGVSZWYuc291cmNlU3RhcnQgOiAoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMik7Ci0JCQkJCQlzZXRTb3VyY2VSYW5nZShyYW5nZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJZmluZE1lbWJlclR5cGVzKHRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAotCQkJCQkJCXNjb3BlLAotCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKLQotCQkJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkvLyByZXBsYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgotCQkJCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7Ci0JCQkJfQorCQkJCWNvbXBsZXRpb25PbkphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGFzdE5vZGUsIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSkgewotCi0JCQkJdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOwotCQkJCUNvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UpIGFzdE5vZGU7Ci0JCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBmaWVsZFJlZi50b2tlbjsKLQkJCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IGZpZWxkUmVmLm5hbWVTb3VyY2VQb3NpdGlvbjsKLQkJCQl0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA9IGZpZWxkUmVmLnRhZ1NvdXJjZVN0YXJ0OwotCi0JCQkJaWYgKGZpZWxkUmVmLnJlY2VpdmVyVHlwZSAhPSBudWxsICYmIGZpZWxkUmVmLnJlY2VpdmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGZpZWxkUmVmLnJlY2VpdmVyVHlwZTsKLQkJCQkJaW50IHJhbmdlU3RhcnQgPSAoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMik7Ci0JCQkJCWlmIChmaWVsZFJlZi5yZWNlaXZlci5pc1RoaXMoKSkgewotCQkJCQkJaWYgKGZpZWxkUmVmLmNvbXBsZXRlSW5UZXh0KCkpIHsKLQkJCQkJCQlyYW5nZVN0YXJ0ID0gZmllbGRSZWYuc2VwYXJhdG9yUG9zaXRpb247Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZmllbGRSZWYuY29tcGxldGVJblRleHQoKSkgewotCQkJCQkJcmFuZ2VTdGFydCA9IGZpZWxkUmVmLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwotCQkJCQl9Ci0JCQkJCXNldFNvdXJjZVJhbmdlKHJhbmdlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7Ci0KLQkJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikKLQkJCQkJCQl8fCAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0ZJRUxEX1JFRikpIHsKLQkJCQkJCWZpbmRGaWVsZHModGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQkJCXNjb3BlLAotCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKLQkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCi0JCQkJCQkJZmFsc2UsIC8qbm90IG9ubHkgc3RhdGljICovCi0JCQkJCQkJZmllbGRSZWYsCi0JCQkJCQkJc2NvcGUsCi0JCQkJCQkJZmFsc2UsCi0JCQkJCQkJdHJ1ZSwKLQkJCQkJCQludWxsLAotCQkJCQkJCW51bGwsCi0JCQkJCQkJbnVsbCwKLQkJCQkJCQlmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikKLQkJCQkJCQl8fCAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX01FVEhPRF9SRUYpKSB7Ci0JCQkJCQlmaW5kTWV0aG9kcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCQludWxsLAotCQkJCQkJCW51bGwsCi0JCQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQkJCXNjb3BlLAotCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKLQkJCQkJCQlmYWxzZSwgLypub3Qgb25seSBzdGF0aWMgKi8KLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmaWVsZFJlZiwKLQkJCQkJCQlzY29wZSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQl0cnVlLAotCQkJCQkJCW51bGwsCi0JCQkJCQkJbnVsbCwKLQkJCQkJCQludWxsLAotCQkJCQkJCWZhbHNlKTsKLQkJCQkJCWlmIChmaWVsZFJlZi5yZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCQkJUmVmZXJlbmNlQmluZGluZyByZWZCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpZmllbGRSZWYucmVjZWl2ZXJUeXBlOwotCQkJCQkJCWlmICh0aGlzLmNvbXBsZXRpb25Ub2tlbiA9PSBudWxsCi0JCQkJCQkJCQl8fCBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgcmVmQmluZGluZy5zb3VyY2VOYW1lKQotCQkJCQkJCQkJfHwgKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRoaXMuY29tcGxldGlvblRva2VuLCByZWZCaW5kaW5nLnNvdXJjZU5hbWUpKSkgewotCQkJCQkJCQlmaW5kQ29uc3RydWN0b3JzKHJlZkJpbmRpbmcsIG51bGwsIHNjb3BlLCBmaWVsZFJlZiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKwkJCQljb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UoYXN0Tm9kZSwgc2NvcGUpOwogCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kKSB7Ci0KLQkJCQlDb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kKSBhc3ROb2RlOwotCQkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBudWxsOyAvL2NvbXB1dGVUeXBlcyhtZXNzYWdlU2VuZC5hcmd1bWVudHMpOwotCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gbWVzc2FnZVNlbmQuc2VsZWN0b3I7Ci0JCQkJdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gPSBtZXNzYWdlU2VuZC50YWdTb3VyY2VTdGFydDsKLQotCQkJCS8vIFNldCBzb3VyY2UgcmFuZ2UKLQkJCQlpbnQgcmFuZ2VTdGFydCA9IGFzdE5vZGUuc291cmNlU3RhcnQ7Ci0JCQkJaWYgKG1lc3NhZ2VTZW5kLnJlY2VpdmVyLmlzVGhpcygpKSB7Ci0JCQkJCWlmIChtZXNzYWdlU2VuZC5jb21wbGV0ZUluVGV4dCgpKSB7Ci0JCQkJCQlyYW5nZVN0YXJ0ID0gbWVzc2FnZVNlbmQuc2VwYXJhdG9yUG9zaXRpb247Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG1lc3NhZ2VTZW5kLmNvbXBsZXRlSW5UZXh0KCkpIHsKLQkJCQkJcmFuZ2VTdGFydCA9IG1lc3NhZ2VTZW5kLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwotCQkJCX0KLQkJCQlzZXRTb3VyY2VSYW5nZShyYW5nZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCwgZmFsc2UpOwotCi0JCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkgewotCQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKLQkJCQkJCWZpbmRJbXBsaWNpdE1lc3NhZ2VTZW5kcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgYXJnVHlwZXMsIHNjb3BlLCBtZXNzYWdlU2VuZCwgc2NvcGUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSkgewotCQkJCQlmaW5kTWV0aG9kcygKLQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJbnVsbCwKLQkJCQkJCWFyZ1R5cGVzLAotCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpICgoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZykuY2FwdHVyZShzY29wZSwgbWVzc2FnZVNlbmQucmVjZWl2ZXIuc291cmNlRW5kKSwKLQkJCQkJCXNjb3BlLAotCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAotCQkJCQkJZmFsc2UsCi0JCQkJCQlmYWxzZS8qIHByZWZpeCBtYXRjaCAqLywKLQkJCQkJCWZhbHNlLAotCQkJCQkJbWVzc2FnZVNlbmQsCi0JCQkJCQlzY29wZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgaW5zdGFuY2VvZiBTdXBlclJlZmVyZW5jZSwKLQkJCQkJCXRydWUsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQlmYWxzZSk7Ci0JCQkJfQorCQkJCWNvbXBsZXRpb25PbkphdmFkb2NNZXNzYWdlU2VuZChhc3ROb2RlLCBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7CiAJCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLS8vCQkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlRW5kLCBmYWxzZSk7Ci0KLQkJCQlDb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NFeHByZXNzaW9uID0gKENvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbikgYXN0Tm9kZTsKLQkJCQl0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA9IGFsbG9jRXhwcmVzc2lvbi50YWdTb3VyY2VTdGFydDsKLQkJCQlpbnQgcmFuZ2VTdGFydCA9IGFzdE5vZGUuc291cmNlU3RhcnQ7Ci0JCQkJaWYgKGFsbG9jRXhwcmVzc2lvbi50eXBlLmlzVGhpcygpKSB7Ci0JCQkJCWlmIChhbGxvY0V4cHJlc3Npb24uY29tcGxldGVJblRleHQoKSkgewotCQkJCQkJcmFuZ2VTdGFydCA9IGFsbG9jRXhwcmVzc2lvbi5zZXBhcmF0b3JQb3NpdGlvbjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYWxsb2NFeHByZXNzaW9uLmNvbXBsZXRlSW5UZXh0KCkpIHsKLQkJCQkJcmFuZ2VTdGFydCA9IGFsbG9jRXhwcmVzc2lvbi50eXBlLnNvdXJjZVN0YXJ0OwotCQkJCX0KLQkJCQlzZXRTb3VyY2VSYW5nZShyYW5nZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCwgZmFsc2UpOwotCQkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBjb21wdXRlVHlwZXMoYWxsb2NFeHByZXNzaW9uLmFyZ3VtZW50cyk7Ci0KLQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZiA9IChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOwotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSAmJiByZWYuaXNDbGFzcygpKSB7Ci0JCQkJCWZpbmRDb25zdHJ1Y3RvcnMocmVmLCBhcmdUeXBlcywgc2NvcGUsIGFsbG9jRXhwcmVzc2lvbiwgZmFsc2UpOwotCQkJCX0KKwkJCQljb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24oYXN0Tm9kZSwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY1BhcmFtTmFtZVJlZmVyZW5jZSkgewotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1BBUkFNX1JFRikpIHsKLQkJCQkJQ29tcGxldGlvbk9uSmF2YWRvY1BhcmFtTmFtZVJlZmVyZW5jZSBwYXJhbVJlZiA9IChDb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlKSBhc3ROb2RlOwotCQkJCQlzZXRTb3VyY2VSYW5nZShwYXJhbVJlZi50YWdTb3VyY2VTdGFydCwgcGFyYW1SZWYudGFnU291cmNlRW5kKTsKLQkJCQkJZmluZEphdmFkb2NQYXJhbU5hbWVzKHBhcmFtUmVmLnRva2VuLCBwYXJhbVJlZi5taXNzaW5nUGFyYW1zLCBmYWxzZSk7Ci0JCQkJCWZpbmRKYXZhZG9jUGFyYW1OYW1lcyhwYXJhbVJlZi50b2tlbiwgcGFyYW1SZWYubWlzc2luZ1R5cGVQYXJhbXMsIHRydWUpOwotCQkJCX0KKwkJCQljb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlKGFzdE5vZGUpOwogCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY1R5cGVQYXJhbVJlZmVyZW5jZSkgewotCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1BBUkFNX1JFRikpIHsKLQkJCQkJQ29tcGxldGlvbk9uSmF2YWRvY1R5cGVQYXJhbVJlZmVyZW5jZSBwYXJhbVJlZiA9IChDb21wbGV0aW9uT25KYXZhZG9jVHlwZVBhcmFtUmVmZXJlbmNlKSBhc3ROb2RlOwotCQkJCQlzZXRTb3VyY2VSYW5nZShwYXJhbVJlZi50YWdTb3VyY2VTdGFydCwgcGFyYW1SZWYudGFnU291cmNlRW5kKTsKLQkJCQkJZmluZEphdmFkb2NQYXJhbU5hbWVzKHBhcmFtUmVmLnRva2VuLCBwYXJhbVJlZi5taXNzaW5nUGFyYW1zLCB0cnVlKTsKLQkJCQl9CisJCQkJY29tcGxldGlvbk9uSmF2YWRvY1R5cGVQYXJhbVJlZmVyZW5jZShhc3ROb2RlKTsKIAkJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NUYWcpIHsKLQkJCQlDb21wbGV0aW9uT25KYXZhZG9jVGFnIGphdmFkb2NUYWcgPSAoQ29tcGxldGlvbk9uSmF2YWRvY1RhZykgYXN0Tm9kZTsKLQkJCQlzZXRTb3VyY2VSYW5nZShqYXZhZG9jVGFnLnRhZ1NvdXJjZVN0YXJ0LCBqYXZhZG9jVGFnLnNvdXJjZUVuZCk7Ci0JCQkJZmluZEphdmFkb2NCbG9ja1RhZ3MoamF2YWRvY1RhZyk7Ci0JCQkJZmluZEphdmFkb2NJbmxpbmVUYWdzKGphdmFkb2NUYWcpOworCQkJCWNvbXBsZXRpb25PbkphdmFkb2NUYWcoYXN0Tm9kZSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHVibGljIHZvaWQgY29tcGxldGUoSVR5cGUgdHlwZSwgY2hhcltdIHNuaXBwZXQsIGludCBwb3NpdGlvbiwgY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLCBpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBib29sZWFuIGlzU3RhdGljKXsJCi0JCWlmKHRoaXMucmVxdWVzdG9yICE9IG51bGwpewotCQkJdGhpcy5yZXF1ZXN0b3IuYmVnaW5SZXBvcnRpbmcoKTsKLQkJfQotCQlib29sZWFuIGNvbnRleHRBY2NlcHRlZCA9IGZhbHNlOwotCQlJVHlwZSB0b3BMZXZlbFR5cGUgPSB0eXBlOwotCQl3aGlsZSh0b3BMZXZlbFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwpIHsKLQkJCXRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCX0KLQkJCi0JCXRoaXMuZmlsZU5hbWUgPSB0b3BMZXZlbFR5cGUuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOwotCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh0aGlzLmZpbGVOYW1lLCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwotCQotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSBudWxsOwotCQotCQl0cnkgewotCQkJLy8gVHlwZUNvbnZlcnRlciBpcyB1c2VkIGluc3RlYWQgb2YgU291cmNlVHlwZUNvbnZlcnRlciBiZWNhdXNlIHRoZSB0eXBlCi0JCQkvLyB0byBjb252ZXJ0IGNhbiBiZSBhIGJpbmFyeSB0eXBlIG9yIGEgc291cmNlIHR5cGUKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBudWxsOwotCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlKSB7Ci0JCQkJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGUpIHR5cGU7Ci0JCQkJSVNvdXJjZVR5cGUgaW5mbyA9IChJU291cmNlVHlwZSkgc291cmNlVHlwZS5nZXRFbGVtZW50SW5mbygpOwotCQkJCWNvbXBpbGF0aW9uVW5pdCA9IFNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCi0JCQkJCW5ldyBJU291cmNlVHlwZVtdIHtpbmZvfSwvL3NvdXJjZVR5cGVzWzBdIGlzIGFsd2F5cyB0b3BsZXZlbCBoZXJlCi0JCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfQU5EX01FVEhPRCAvLyBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCi0JCQkJCXwgU291cmNlVHlwZUNvbnZlcnRlci5NRU1CRVJfVFlQRSwgLy8gbmVlZCBtZW1iZXIgdHlwZXMKLQkJCQkJLy8gbm8gbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KLQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIsCi0JCQkJCWNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJCQlpZiAoY29tcGlsYXRpb25Vbml0LnR5cGVzICE9IG51bGwpCi0JCQkJCXR5cGVEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC50eXBlc1swXTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tcGlsYXRpb25Vbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHRoaXMucHJvYmxlbVJlcG9ydGVyLCBjb21waWxhdGlvblJlc3VsdCwgMCk7Ci0JCQkJdHlwZURlY2xhcmF0aW9uID0gQmluYXJ5VHlwZUNvbnZlcnRlci5idWlsZFR5cGVEZWNsYXJhdGlvbih0eXBlLCBjb21waWxhdGlvblVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJCX0KLQkJCi0JCQlpZih0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgewkKLQkJCQkvLyBidWlsZCBBU1QgZnJvbSBzbmlwcGV0Ci0JCQkJSW5pdGlhbGl6ZXIgZmFrZUluaXRpYWxpemVyID0gcGFyc2VTbmlwcGVJbml0aWFsaXplcihzbmlwcGV0LCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYyk7Ci0JCQkJCi0JCQkJLy8gbWVyZ2UgQVNUCi0JCQkJRmllbGREZWNsYXJhdGlvbltdIG9sZEZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7Ci0JCQkJRmllbGREZWNsYXJhdGlvbltdIG5ld0ZpZWxkcyA9IG51bGw7Ci0JCQkJaWYgKG9sZEZpZWxkcyAhPSBudWxsKSB7Ci0JCQkJCW5ld0ZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW29sZEZpZWxkcy5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShvbGRGaWVsZHMsIDAsIG5ld0ZpZWxkcywgMCwgb2xkRmllbGRzLmxlbmd0aCk7Ci0JCQkJCW5ld0ZpZWxkc1tvbGRGaWVsZHMubGVuZ3RoXSA9IGZha2VJbml0aWFsaXplcjsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdGaWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltdIHtmYWtlSW5pdGlhbGl6ZXJ9OwotCQkJCX0KLQkJCQl0eXBlRGVjbGFyYXRpb24uZmllbGRzID0gbmV3RmllbGRzOwotCQkKLQkJCQlpZihERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNOSVBQRVQgQ09NUExFVElPTiBBU1QgOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjb21waWxhdGlvblVuaXQudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb21waWxhdGlvblVuaXQudHlwZXMgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhjb21waWxhdGlvblVuaXQsIG51bGwgLypubyBhY2Nlc3MgcmVzdHJpY3Rpb24qLyk7Ci0JCQkJCi0JCQkJCQlpZiAoKHRoaXMudW5pdFNjb3BlID0gY29tcGlsYXRpb25Vbml0LnNjb3BlKSAhPSBudWxsKSB7Ci0JCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhjb21waWxhdGlvblVuaXQsIHRydWUpOwotCQkJCQkJCWNvbXBpbGF0aW9uVW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKLQkJCQkJCQljb21waWxhdGlvblVuaXQucmVzb2x2ZSgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb21wbGV0aW9uTm9kZUZvdW5kIGUpIHsKLQkJCQkJCS8vCQkJCQljb21wbGV0aW9uTm9kZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCWlmIChlLmFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGlmIG51bGwgdGhlbiB3ZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIGNvbXBsZXRpb24gbm9kZQotCQkJCQkJCWNvbnRleHRBY2NlcHRlZCA9IGNvbXBsZXRlKGUuYXN0Tm9kZSwgdGhpcy5wYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCwgZS5xdWFsaWZpZWRCaW5kaW5nLCBlLnNjb3BlLCBlLmluc2lkZVR5cGVBbm5vdGF0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZih0aGlzLm5vUHJvcG9zYWwgJiYgdGhpcy5wcm9ibGVtICE9IG51bGwpIHsKLQkJCQkJaWYoIWNvbnRleHRBY2NlcHRlZCkgewotCQkJCQkJY29udGV4dEFjY2VwdGVkID0gdHJ1ZTsKLQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnRleHQobmV3IENvbXBsZXRpb25Db250ZXh0KCkpOwotCQkJCQl9Ci0JCQkJCXRoaXMucmVxdWVzdG9yLmNvbXBsZXRpb25GYWlsdXJlKHRoaXMucHJvYmxlbSk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQl0aGlzLnByaW50RGVidWcodGhpcy5wcm9ibGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeyAvLyB3b3JrLWFyb3VuZCBpbnRlcm5hbCBmYWlsdXJlIC0gMUdFTUY2RCAoYWRkZWQgd2l0aCBmaXggb2YgOTk2MjkpCi0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGNhdWdodCBieSBDb21wbGV0aW9uRW5naW5lOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKSB7IC8vIG1heSBldmVudHVhbGx5IHJlcG9ydCBhIHVzZWZ1bGwgZXJyb3IgKGFkZGVkIHRvIGZpeCA5OTYyOSkKLQkJCWlmKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gY2F1Z2h0IGJ5IENvbXBsZXRpb25FbmdpbmU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCX0KLQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7IC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBmb3Igbm93IHNpbmNlIGl0IHR5cGljYWxseSBtZWFucyB3ZSBjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0IChhZGRlZCB3aXRoIGZpeCBvZiA5OTYyOSkKLQkJCWlmKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gY2F1Z2h0IGJ5IENvbXBsZXRpb25FbmdpbmU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29tcGxldGlvbk5vZGVGb3VuZCBlKXsgLy8gaW50ZXJuYWwgZmFpbHVyZSAtIGJ1Z3MgNTYxOCAoYWRkZWQgd2l0aCBmaXggb2YgOTk2MjkpCi0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGNhdWdodCBieSBDb21wbGV0aW9uRW5naW5lOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCQl9Ci0JCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCQlpZighY29udGV4dEFjY2VwdGVkKSB7Ci0JCQljb250ZXh0QWNjZXB0ZWQgPSB0cnVlOwotCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29udGV4dChuZXcgQ29tcGxldGlvbkNvbnRleHQoKSk7Ci0JCX0KLQkJaWYodGhpcy5yZXF1ZXN0b3IgIT0gbnVsbCl7Ci0JCQl0aGlzLnJlcXVlc3Rvci5lbmRSZXBvcnRpbmcoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEluaXRpYWxpemVyIHBhcnNlU25pcHBlSW5pdGlhbGl6ZXIoY2hhcltdIHNuaXBwZXQsIGludCBwb3NpdGlvbiwgY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLCBpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBib29sZWFuIGlzU3RhdGljKXsKLQkJU3RyaW5nQnVmZmVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcHJlZml4LmFwcGVuZCgicHVibGljIGNsYXNzIEZha2VUeXBlIHtcbiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihpc1N0YXRpYykgewotCQkJcHJlZml4LmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJlZml4LmFwcGVuZCgie1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBU1ROb2RlLnByaW50TW9kaWZpZXJzKGxvY2FsVmFyaWFibGVNb2RpZmllcnNbaV0sIHByZWZpeCk7Ci0JCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0JCQlwcmVmaXguYXBwZW5kKGxvY2FsVmFyaWFibGVUeXBlTmFtZXNbaV0pOwotCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCQkJcHJlZml4LmFwcGVuZChsb2NhbFZhcmlhYmxlTmFtZXNbaV0pOwotCQkJcHJlZml4LmFwcGVuZCgnOycpOwotCQl9Ci0JCQotCQljaGFyW10gZmFrZVNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeC50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIHNuaXBwZXQsICJ9fSIudG9DaGFyQXJyYXkoKSk7Ly8kTk9OLU5MUy0xJCAKLQkJdGhpcy5vZmZzZXQgPSBwcmVmaXgubGVuZ3RoKCk7Ci0JCQotCQlTdHJpbmcgZW5jb2RpbmcgPSB0aGlzLmNvbXBpbGVyT3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmc7Ci0JCUJhc2ljQ29tcGlsYXRpb25Vbml0IGZha2VVbml0ID0gbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAotCQkJZmFrZVNvdXJjZSwgCi0JCQludWxsLAotCQkJIkZha2VUeXBlLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQllbmNvZGluZyk7IAotCQkJCi0JCXRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uID0gcHJlZml4Lmxlbmd0aCgpICsgcG9zaXRpb24gLSAxOwotCQkJCi0JCUNvbXBpbGF0aW9uUmVzdWx0IGZha2VSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoZmFrZVVuaXQsIDEsIDEsIHRoaXMuY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7Ci0JCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGZha2VBU1QgPSB0aGlzLnBhcnNlci5kaWV0UGFyc2UoZmFrZVVuaXQsIGZha2VSZXN1bHQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCi0JCXBhcnNlQmxvY2tTdGF0ZW1lbnRzKGZha2VBU1QsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCi0JCXJldHVybiAoSW5pdGlhbGl6ZXIpZmFrZUFTVC50eXBlc1swXS5maWVsZHNbMF07Ci0JfQotCiAJLyoqCiAJICogQXNrIHRoZSBlbmdpbmUgdG8gY29tcHV0ZSBhIGNvbXBsZXRpb24gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgogCSAqIG9mIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgpAQCAtMTk0NywxMCArMTcxOSwxMCBAQAogCSAqICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgogCSAqCiAJICogIEBwYXJhbSBjb21wbGV0aW9uUG9zaXRpb24gaW50Ci0JICogICAgICBhIHBvc2l0aW9uIGluIHRoZSBzb3VyY2Ugd2hlcmUgdGhlIGNvbXBsZXRpb24gaXMgdGFraW5nIHBsYWNlLiAKKwkgKiAgICAgIGEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgY29tcGxldGlvbiBpcyB0YWtpbmcgcGxhY2UuCiAJICogICAgICBUaGlzIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgcHJvdmlkZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29tcGxldGUoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCBpbnQgY29tcGxldGlvblBvc2l0aW9uLCBpbnQgcG9zKSB7CisJcHVibGljIHZvaWQgY29tcGxldGUoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCBpbnQgY29tcGxldGlvblBvc2l0aW9uLCBpbnQgcG9zLCBJVHlwZVJvb3Qgcm9vdCkgewogCiAJCWlmKERFQlVHKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50KCJDT01QTEVUSU9OIElOICIpOyAvLyROT04tTkxTLTEkCkBAIC0xOTYwLDEyICsxNzMyLDE3IEBACiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNPTVBMRVRJT04gLSBTb3VyY2UgOiIpOyAvLyROT04tTkxTLTEkCiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlVW5pdC5nZXRDb250ZW50cygpKTsKIAkJfQorCQlpZiAodGhpcy5tb25pdG9yICE9IG51bGwpIHRoaXMubW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX2NvbXBsZXRpbmcsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7CiAJCXRoaXMucmVxdWVzdG9yLmJlZ2luUmVwb3J0aW5nKCk7CiAJCWJvb2xlYW4gY29udGV4dEFjY2VwdGVkID0gZmFsc2U7CiAJCXRyeSB7CiAJCQl0aGlzLmZpbGVOYW1lID0gc291cmNlVW5pdC5nZXRGaWxlTmFtZSgpOwogCQkJdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gPSBjb21wbGV0aW9uUG9zaXRpb24gLSAxOwogCQkJdGhpcy5vZmZzZXQgPSBwb3M7CisJCQl0aGlzLnR5cGVSb290ID0gcm9vdDsKKwkJCQorCQkJdGhpcy5jaGVja0NhbmNlbCgpOworCQkJCiAJCQkvLyBmb3Igbm93IHVudGlsIHdlIGNhbiBjaGFuZ2UgdGhlIFVJLgogCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDEsIDEsIHRoaXMuY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHJlc3VsdCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwpAQCAtMTk4MCw3ICsxNzU3LDcgQEAKIAkJCQkvLyBzY2FuIHRoZSBwYWNrYWdlICYgaW1wb3J0IHN0YXRlbWVudHMgZmlyc3QKIAkJCQlpZiAocGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UpIHsKIAkJCQkJY29udGV4dEFjY2VwdGVkID0gdHJ1ZTsKLQkJCQkJdGhpcy5idWlsZENvbnRleHQocGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCQkJCWJ1aWxkQ29udGV4dChwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlLCBudWxsLCBwYXJzZWRVbml0LCBudWxsLCBudWxsKTsKIAkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuUEFDS0FHRV9SRUYpKSB7CiAJCQkJCQlmaW5kUGFja2FnZXMoKENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UpIHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UpOwogCQkJCQl9CkBAIC0yMDAxLDQ2ICsxNzc4LDQ0IEBACiAJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBudWxsIC8qbm8gYWNjZXNzIHJlc3RyaWN0aW9uKi8pOwogCQkJCQkJCWlmICgodGhpcy51bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAhPSBudWxsKSB7CiAJCQkJCQkJCWNvbnRleHRBY2NlcHRlZCA9IHRydWU7Ci0JCQkJCQkJCXRoaXMuYnVpbGRDb250ZXh0KGltcG9ydFJlZmVyZW5jZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlzZXRTb3VyY2VSYW5nZSgKLQkJCQkJCQkJCWltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCwKLQkJCQkJCQkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQkJCQkJCQorCQkJCQkJCQlidWlsZENvbnRleHQoaW1wb3J0UmVmZXJlbmNlLCBudWxsLCBwYXJzZWRVbml0LCBudWxsLCBudWxsKTsKKworCQkJCQkJCQlsb25nIHBvc2l0aW9ucyA9IGltcG9ydFJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnNbaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGggLSAxXTsKKwkJCQkJCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZSgoaW50KSAocG9zaXRpb25zID4+PiAzMiksIChpbnQpIHBvc2l0aW9ucyk7CisKIAkJCQkJCQkJY2hhcltdW10gb2xkVG9rZW5zID0gaW1wb3J0UmVmZXJlbmNlLnRva2VuczsKIAkJCQkJCQkJaW50IHRva2VuQ291bnQgPSBvbGRUb2tlbnMubGVuZ3RoOwogCQkJCQkJCQlpZiAodG9rZW5Db3VudCA9PSAxKSB7CiAJCQkJCQkJCQlmaW5kSW1wb3J0cygoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKWltcG9ydFJlZmVyZW5jZSwgdHJ1ZSk7CiAJCQkJCQkJCX0gZWxzZSBpZih0b2tlbkNvdW50ID4gMSl7CiAJCQkJCQkJCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCQkJCQkKKwogCQkJCQkJCQkJY2hhcltdIGxhc3RUb2tlbiA9IG9sZFRva2Vuc1t0b2tlbkNvdW50IC0gMV07CiAJCQkJCQkJCQljaGFyW11bXSBxdWFsaWZpZXJUb2tlbnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG9sZFRva2VucywgMCwgdG9rZW5Db3VudCAtIDEpOwotCQkJCQkJCQkJCisKIAkJCQkJCQkJCUJpbmRpbmcgYmluZGluZyA9IHRoaXMudW5pdFNjb3BlLmdldFR5cGVPclBhY2thZ2UocXVhbGlmaWVyVG9rZW5zKTsKIAkJCQkJCQkJCWlmKGJpbmRpbmcgIT0gbnVsbCkgewogCQkJCQkJCQkJCWlmKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgewogCQkJCQkJCQkJCQlmaW5kSW1wb3J0cygoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKWltcG9ydFJlZmVyZW5jZSwgZmFsc2UpOwogCQkJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7CisKIAkJCQkJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJCQkJCQkJCQl0aGlzLmZpbmRJbXBvcnRzT2ZNZW1iZXJUeXBlcyhsYXN0VG9rZW4sIHJlZiwgaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkpOworCQkJCQkJCQkJCQkJZmluZEltcG9ydHNPZk1lbWJlclR5cGVzKGxhc3RUb2tlbiwgcmVmLCBpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKSk7CiAJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJaWYoaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkpIHsKKwogCQkJCQkJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKSkgewotCQkJCQkJCQkJCQkJCWxvbmcgcG9zaXRpb25zID0gaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uc1tpbXBvcnRSZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdOwotCQkJCQkJCQkJCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChwb3NpdGlvbnMgPj4+IDMyKSwgKGludCkgcG9zaXRpb25zKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmZpbmRJbXBvcnRzT2ZTdGF0aWNGaWVsZHMobGFzdFRva2VuLCByZWYpOwotCQkJCQkJCQkJCQkJCXNldFNvdXJjZVJhbmdlKGltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCwgaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJCQkJCQkJCQkJCQlmaW5kSW1wb3J0c09mU3RhdGljRmllbGRzKGxhc3RUb2tlbiwgcmVmKTsKIAkJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9OQU1FX1JFRkVSRU5DRSkpIHsKLQkJCQkJCQkJCQkJCQl0aGlzLmZpbmRJbXBvcnRzT2ZTdGF0aWNNZXRob2RzKGxhc3RUb2tlbiwgcmVmKTsKKwkJCQkJCQkJCQkJCQlmaW5kSW1wb3J0c09mU3RhdGljTWV0aG9kcyhsYXN0VG9rZW4sIHJlZik7CiAJCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQl9CiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KLQkJCQkJCQkJCisKIAkJCQkJCQkJaWYodGhpcy5ub1Byb3Bvc2FsICYmIHRoaXMucHJvYmxlbSAhPSBudWxsKSB7CiAJCQkJCQkJCQl0aGlzLnJlcXVlc3Rvci5jb21wbGV0aW9uRmFpbHVyZSh0aGlzLnByb2JsZW0pOwogCQkJCQkJCQkJaWYoREVCVUcpIHsKQEAgLTIwNTEsOSArMTgyNiw5IEBACiAJCQkJCQkJcmV0dXJuOwogCQkJCQkJfSBlbHNlIGlmKGltcG9ydFJlZmVyZW5jZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbktleXdvcmQpIHsKIAkJCQkJCQljb250ZXh0QWNjZXB0ZWQgPSB0cnVlOwotCQkJCQkJCXRoaXMuYnVpbGRDb250ZXh0KGltcG9ydFJlZmVyZW5jZSwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCQkJCQkJYnVpbGRDb250ZXh0KGltcG9ydFJlZmVyZW5jZSwgbnVsbCwgcGFyc2VkVW5pdCwgbnVsbCwgbnVsbCk7CiAJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKLQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCBpbXBvcnRSZWZlcmVuY2Uuc291cmNlRW5kKTsKKwkJCQkJCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZShpbXBvcnRSZWZlcmVuY2Uuc291cmNlU3RhcnQsIGltcG9ydFJlZmVyZW5jZS5zb3VyY2VFbmQpOwogCQkJCQkJCQlDb21wbGV0aW9uT25LZXl3b3JkIGtleXdvcmQgPSAoQ29tcGxldGlvbk9uS2V5d29yZClpbXBvcnRSZWZlcmVuY2U7CiAJCQkJCQkJCWZpbmRLZXl3b3JkcyhrZXl3b3JkLmdldFRva2VuKCksIGtleXdvcmQuZ2V0UG9zc2libGVLZXl3b3JkcygpLCBmYWxzZSwgZmFsc2UpOwogCQkJCQkJCX0KQEAgLTIwODYsNiArMTg2MSw3IEBACiAJCQkJCX0gY2F0Y2ggKENvbXBsZXRpb25Ob2RlRm91bmQgZSkgewogCQkJCQkJLy8JCQkJCWNvbXBsZXRpb25Ob2RlRm91bmQgPSB0cnVlOwogCQkJCQkJaWYgKGUuYXN0Tm9kZSAhPSBudWxsKSB7CisJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCiAJCQkJCQkJaWYoREVCVUcpIHsKIAkJCQkJCQkJU3lzdGVtLm91dC5wcmludCgiQ09NUExFVElPTiAtIENvbXBsZXRpb24gbm9kZSA6ICIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmFzdE5vZGUudG9TdHJpbmcoKSk7CkBAIC0yMDk0LDE5ICsxODcwLDI4IEBACiAJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5wYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCi0JCQkJCQkJY29udGV4dEFjY2VwdGVkID0gY29tcGxldGUoZS5hc3ROb2RlLCB0aGlzLnBhcnNlci5hc3Npc3ROb2RlUGFyZW50LCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUsIGUuaW5zaWRlVHlwZUFubm90YXRpb24pOworCQkJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkID0gcGFyc2VkVW5pdDsgLy8gYmV0dGVyIHJlc2lsaWVudCB0byBmdXJ0aGVyIGVycm9yIHJlcG9ydGluZworCQkJCQkJCWNvbnRleHRBY2NlcHRlZCA9CisJCQkJCQkJCWNvbXBsZXRlKAorCQkJCQkJCQkJZS5hc3ROb2RlLAorCQkJCQkJCQkJdGhpcy5wYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCwKKwkJCQkJCQkJCXRoaXMucGFyc2VyLmVuY2xvc2luZ05vZGUsCisJCQkJCQkJCQlwYXJzZWRVbml0LAorCQkJCQkJCQkJZS5xdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCQkJZS5zY29wZSwKKwkJCQkJCQkJCWUuaW5zaWRlVHlwZUFubm90YXRpb24pOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmKHRoaXMubm9Qcm9wb3NhbCAmJiB0aGlzLnByb2JsZW0gIT0gbnVsbCkgewogCQkJCWlmKCFjb250ZXh0QWNjZXB0ZWQpIHsKIAkJCQkJY29udGV4dEFjY2VwdGVkID0gdHJ1ZTsKLQkJCQkJQ29tcGxldGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBDb21wbGV0aW9uQ29udGV4dCgpOworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCgpOwogCQkJCQljb250ZXh0LnNldE9mZnNldChjb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CiAJCQkJCWNvbnRleHQuc2V0VG9rZW5LaW5kKENvbXBsZXRpb25Db250ZXh0LlRPS0VOX0tJTkRfVU5LTk9XTik7CisJCQkJCWlmICh0aGlzLnJlcXVlc3Rvci5pc0V4dGVuZGVkQ29udGV4dFJlcXVpcmVkKCkpIGNvbnRleHQuc2V0RXh0ZW5kZWQoKTsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29udGV4dChjb250ZXh0KTsKIAkJCQl9CiAJCQkJdGhpcy5yZXF1ZXN0b3IuY29tcGxldGlvbkZhaWx1cmUodGhpcy5wcm9ibGVtKTsKQEAgLTIxNDYsMjAwOCArMTkzMSw1NDQgQEAKIAkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCXJlc2V0KCk7CiAJCQlpZighY29udGV4dEFjY2VwdGVkKSB7CiAJCQkJY29udGV4dEFjY2VwdGVkID0gdHJ1ZTsKLQkJCQlDb21wbGV0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbXBsZXRpb25Db250ZXh0KCk7CisJCQkJSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEludGVybmFsQ29tcGxldGlvbkNvbnRleHQoKTsKIAkJCQljb250ZXh0LnNldFRva2VuS2luZChDb21wbGV0aW9uQ29udGV4dC5UT0tFTl9LSU5EX1VOS05PV04pOwogCQkJCWNvbnRleHQuc2V0T2Zmc2V0KGNvbXBsZXRpb25Qb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQlpZiAodGhpcy5yZXF1ZXN0b3IuaXNFeHRlbmRlZENvbnRleHRSZXF1aXJlZCgpKSBjb250ZXh0LnNldEV4dGVuZGVkKCk7CiAJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29udGV4dChjb250ZXh0KTsKIAkJCX0KIAkJCXRoaXMucmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOworCQkJaWYgKHRoaXMubW9uaXRvciAhPSBudWxsKSB0aGlzLm1vbml0b3IuZG9uZSgpOworCQkJcmVzZXQoKTsKIAkJfQogCX0KIAotCXByaXZhdGUgbG9uZyBjb21wdXRlVGFyZ2V0ZWRFbGVtZW50KENvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUgZmFrZU5vZGUpIHsKLQkJQVNUTm9kZSBhbm5vdGF0ZWRFbGVtZW50ID0gZmFrZU5vZGUucG90ZW50aWFsQW5ub3RhdGVkTm9kZTsKLQkJCi0JCWlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gYW5ub3RhdGVkVHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgYW5ub3RhdGVkRWxlbWVudDsKLQkJCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZChhbm5vdGF0ZWRUeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKSA9PSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wpIHsKLQkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yQW5ub3RhdGlvblR5cGUgfCBUYWdCaXRzLkFubm90YXRpb25Gb3JUeXBlOwotCQkJfQotCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGU7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKLQkJCWlmIChmYWtlTm9kZS5pc1BhcmFtZXRlcikgewotCQkJCXJldHVybiBUYWdCaXRzLkFubm90YXRpb25Gb3JQYXJhbWV0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yRmllbGQ7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yTWV0aG9kOwotCQl9IGVsc2UgaWYgKGFubm90YXRlZEVsZW1lbnQgaW5zdGFuY2VvZiBBcmd1bWVudCkgewotCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhcmFtZXRlcjsKLQkJfSBlbHNlIGlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckNvbnN0cnVjdG9yOwotCQl9IGVsc2UgaWYgKGFubm90YXRlZEVsZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yTG9jYWxWYXJpYWJsZTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7Ci0JCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yUGFja2FnZTsKKwlwdWJsaWMgdm9pZCBjb21wbGV0ZShJVHlwZSB0eXBlLCBjaGFyW10gc25pcHBldCwgaW50IHBvc2l0aW9uLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsIGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIGJvb2xlYW4gaXNTdGF0aWMpeworCQlpZih0aGlzLnJlcXVlc3RvciAhPSBudWxsKXsKKwkJCXRoaXMucmVxdWVzdG9yLmJlZ2luUmVwb3J0aW5nKCk7CiAJCX0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCXByaXZhdGUgVHlwZUJpbmRpbmdbXSBjb21wdXRlVHlwZXMoRXhwcmVzc2lvbltdIGFyZ3VtZW50cykgewotCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHJldHVybiBudWxsOwotCQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7Ci0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbYXJnc0xlbmd0aF07Ci0JCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspIHsKLQkJCWFyZ1R5cGVzW2FdID0gYXJndW1lbnRzW2FdLnJlc29sdmVkVHlwZTsKKwkJYm9vbGVhbiBjb250ZXh0QWNjZXB0ZWQgPSBmYWxzZTsKKwkJSVR5cGUgdG9wTGV2ZWxUeXBlID0gdHlwZTsKKwkJd2hpbGUodG9wTGV2ZWxUeXBlLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsKSB7CisJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOwogCQl9Ci0JCXJldHVybiBhcmdUeXBlczsKLQl9Ci0JCi0JcHJpdmF0ZSBUeXBlQmluZGluZ1tdIGNvbXB1dGVUeXBlc0lmQ29ycmVjdChFeHByZXNzaW9uW10gYXJndW1lbnRzKSB7Ci0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKLQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1thcmdzTGVuZ3RoXTsKLQkJZm9yIChpbnQgYSA9IGFyZ3NMZW5ndGg7IC0tYSA+PSAwOykgewotCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcmd1bWVudHNbYV0ucmVzb2x2ZWRUeXBlOwotCQkJaWYodHlwZUJpbmRpbmcgPT0gbnVsbCB8fCAhdHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIG51bGw7Ci0JCQlhcmdUeXBlc1thXSA9IHR5cGVCaW5kaW5nOwotCQl9Ci0JCXJldHVybiBhcmdUeXBlczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRBbm5vdGF0aW9uQXR0cmlidXRlcyhjaGFyW10gdG9rZW4sIE1lbWJlclZhbHVlUGFpcltdIGF0dHJpYnV0ZXNGb3VuZCwgUmVmZXJlbmNlQmluZGluZyBhbm5vdGF0aW9uKSB7Ci0JCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gYW5ub3RhdGlvbi5hdmFpbGFibGVNZXRob2RzKCk7Ci0JCW5leHRBdHRyaWJ1dGU6IGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCi0JCQlpZighQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UpCi0JCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godG9rZW4sIG1ldGhvZC5zZWxlY3RvcikpKSBjb250aW51ZSBuZXh0QXR0cmlidXRlOwotCQkJCi0JCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlc0ZvdW5kID09IG51bGwgPyAwIDogYXR0cmlidXRlc0ZvdW5kLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIGF0dHJpYnV0ZXNGb3VuZFtqXS5uYW1lLCBmYWxzZSkpIGNvbnRpbnVlIG5leHRBdHRyaWJ1dGU7Ci0JCQl9Ci0JCQkKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwobWV0aG9kKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBtZXRob2Quc2VsZWN0b3IpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0JCQkKLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5OT1RBVElPTl9BVFRSSUJVVEVfUkVGKSkgewotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOTk9UQVRJT05fQVRUUklCVVRFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5yZXR1cm5UeXBlKSk7Ci0JCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24obWV0aG9kLnNlbGVjdG9yKTsKLQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgZmluZEFub255bW91c1R5cGUoCi0JCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsCi0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCi0JCVNjb3BlIHNjb3BlLAotCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgewogCi0JCWlmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0JCQkKLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OKSkgewotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KGN1cnJlbnRUeXBlLmNvbXB1dGVVbmlxdWVLZXkoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKAotCQkJCQkJY3JlYXRlTWV0aG9kU2lnbmF0dXJlKAotCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKLQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCi0JCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKLQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSKSk7Ci0JCQkJLy9wcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShudWxsKTsKLQkJCQkvL3Byb3Bvc2FsLnNldFVuaXF1ZUtleShudWxsKTsKLQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkvL3Byb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhudWxsKTsKLQkJCQkvL3Byb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhudWxsKTsKLQkJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7Ci0JCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOwotCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJdGhpcy5maWxlTmFtZSA9IHRvcExldmVsVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHRoaXMuZmlsZU5hbWUsIDEsIDEsIHRoaXMuY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gbnVsbDsKKworCQl0cnkgeworCQkJLy8gVHlwZUNvbnZlcnRlciBpcyB1c2VkIGluc3RlYWQgb2YgU291cmNlVHlwZUNvbnZlcnRlciBiZWNhdXNlIHRoZSB0eXBlCisJCQkvLyB0byBjb252ZXJ0IGNhbiBiZSBhIGJpbmFyeSB0eXBlIG9yIGEgc291cmNlIHR5cGUKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBudWxsOworCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlKSB7CisJCQkJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGUpIHR5cGU7CisJCQkJSVNvdXJjZVR5cGUgaW5mbyA9IChJU291cmNlVHlwZSkgc291cmNlVHlwZS5nZXRFbGVtZW50SW5mbygpOworCQkJCWNvbXBpbGF0aW9uVW5pdCA9IFNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQkJCW5ldyBJU291cmNlVHlwZVtdIHtpbmZvfSwvL3NvdXJjZVR5cGVzWzBdIGlzIGFsd2F5cyB0b3BsZXZlbCBoZXJlCisJCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfQU5EX01FVEhPRCAvLyBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCXwgU291cmNlVHlwZUNvbnZlcnRlci5NRU1CRVJfVFlQRSwgLy8gbmVlZCBtZW1iZXIgdHlwZXMKKwkJCQkJLy8gbm8gbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KKwkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIsCisJCQkJCWNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCQlpZiAoY29tcGlsYXRpb25Vbml0LnR5cGVzICE9IG51bGwpCisJCQkJCXR5cGVEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC50eXBlc1swXTsKKwkJCX0gZWxzZSB7CisJCQkJY29tcGlsYXRpb25Vbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHRoaXMucHJvYmxlbVJlcG9ydGVyLCBjb21waWxhdGlvblJlc3VsdCwgMCk7CisJCQkJdHlwZURlY2xhcmF0aW9uID0gbmV3IEJpbmFyeVR5cGVDb252ZXJ0ZXIodGhpcy5wYXJzZXIucHJvYmxlbVJlcG9ydGVyKCksIGNvbXBpbGF0aW9uUmVzdWx0LCBudWxsLypubyBuZWVkIHRvIHJlbWVtYmVyIHR5cGUgbmFtZXMqLykuYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZSwgY29tcGlsYXRpb25Vbml0KTsKKwkJCX0KKworCQkJaWYodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCQkvLyBidWlsZCBBU1QgZnJvbSBzbmlwcGV0CisJCQkJSW5pdGlhbGl6ZXIgZmFrZUluaXRpYWxpemVyID0gcGFyc2VTbmlwcGVJbml0aWFsaXplcihzbmlwcGV0LCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYyk7CisKKwkJCQkvLyBtZXJnZSBBU1QKKwkJCQlGaWVsZERlY2xhcmF0aW9uW10gb2xkRmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJCQlGaWVsZERlY2xhcmF0aW9uW10gbmV3RmllbGRzID0gbnVsbDsKKwkJCQlpZiAob2xkRmllbGRzICE9IG51bGwpIHsKKwkJCQkJbmV3RmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bb2xkRmllbGRzLmxlbmd0aCArIDFdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEZpZWxkcywgMCwgbmV3RmllbGRzLCAwLCBvbGRGaWVsZHMubGVuZ3RoKTsKKwkJCQkJbmV3RmllbGRzW29sZEZpZWxkcy5sZW5ndGhdID0gZmFrZUluaXRpYWxpemVyOworCQkJCX0gZWxzZSB7CisJCQkJCW5ld0ZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW10ge2Zha2VJbml0aWFsaXplcn07CisJCQkJfQorCQkJCXR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPSBuZXdGaWVsZHM7CisKIAkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNOSVBQRVQgQ09NUExFVElPTiBBU1QgOiIpOyAvLyROT04tTkxTLTEkCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjb21waWxhdGlvblVuaXQudG9TdHJpbmcoKSk7CisJCQkJfQorCisJCQkJaWYgKGNvbXBpbGF0aW9uVW5pdC50eXBlcyAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKGNvbXBpbGF0aW9uVW5pdCwgbnVsbCAvKm5vIGFjY2VzcyByZXN0cmljdGlvbiovKTsKKworCQkJCQkJaWYgKCh0aGlzLnVuaXRTY29wZSA9IGNvbXBpbGF0aW9uVW5pdC5zY29wZSkgIT0gbnVsbCkgeworCQkJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKKwkJCQkJCQljb21waWxhdGlvblVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJY29tcGlsYXRpb25Vbml0LnJlc29sdmUoKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29tcGxldGlvbk5vZGVGb3VuZCBlKSB7CisJCQkJCQkvLwkJCQkJY29tcGxldGlvbk5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQlpZiAoZS5hc3ROb2RlICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpZiBudWxsIHRoZW4gd2UgZm91bmQgYSBwcm9ibGVtIGluIHRoZSBjb21wbGV0aW9uIG5vZGUKKwkJCQkJCQljb250ZXh0QWNjZXB0ZWQgPQorCQkJCQkJCQljb21wbGV0ZSgKKwkJCQkJCQkJCWUuYXN0Tm9kZSwKKwkJCQkJCQkJCXRoaXMucGFyc2VyLmFzc2lzdE5vZGVQYXJlbnQsCisJCQkJCQkJCQl0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlLAorCQkJCQkJCQkJY29tcGlsYXRpb25Vbml0LAorCQkJCQkJCQkJZS5xdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCQkJZS5zY29wZSwKKwkJCQkJCQkJCWUuaW5zaWRlVHlwZUFubm90YXRpb24pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmKHRoaXMubm9Qcm9wb3NhbCAmJiB0aGlzLnByb2JsZW0gIT0gbnVsbCkgeworCQkJCQlpZighY29udGV4dEFjY2VwdGVkKSB7CisJCQkJCQljb250ZXh0QWNjZXB0ZWQgPSB0cnVlOworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEludGVybmFsQ29tcGxldGlvbkNvbnRleHQoKTsKKwkJCQkJCWlmICh0aGlzLnJlcXVlc3Rvci5pc0V4dGVuZGVkQ29udGV4dFJlcXVpcmVkKCkpIGNvbnRleHQuc2V0RXh0ZW5kZWQoKTsKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnRleHQoY29udGV4dCk7CisJCQkJCX0KKwkJCQkJdGhpcy5yZXF1ZXN0b3IuY29tcGxldGlvbkZhaWx1cmUodGhpcy5wcm9ibGVtKTsKKwkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCXRoaXMucHJpbnREZWJ1Zyh0aGlzLnByb2JsZW0pOworCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IGVsc2UgeworCQl9ICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vIHdvcmstYXJvdW5kIGludGVybmFsIGZhaWx1cmUgLSAxR0VNRjZEIChhZGRlZCB3aXRoIGZpeCBvZiA5OTYyOSkKKwkJCWlmKERFQlVHKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gY2F1Z2h0IGJ5IENvbXBsZXRpb25FbmdpbmU6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKwkJCX0KKwkJfSBjYXRjaCAoSW52YWxpZEN1cnNvckxvY2F0aW9uIGUpIHsgLy8gbWF5IGV2ZW50dWFsbHkgcmVwb3J0IGEgdXNlZnVsbCBlcnJvciAoYWRkZWQgdG8gZml4IDk5NjI5KQorCQkJaWYoREVCVUcpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBjYXVnaHQgYnkgQ29tcGxldGlvbkVuZ2luZToiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCQkJfQorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIGZvciBub3cgc2luY2UgaXQgdHlwaWNhbGx5IG1lYW5zIHdlIGNhbm5vdCBmaW5kIGphdmEubGFuZy5PYmplY3QgKGFkZGVkIHdpdGggZml4IG9mIDk5NjI5KQorCQkJaWYoREVCVUcpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBjYXVnaHQgYnkgQ29tcGxldGlvbkVuZ2luZToiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCQkJfQorCQl9IGNhdGNoIChDb21wbGV0aW9uTm9kZUZvdW5kIGUpeyAvLyBpbnRlcm5hbCBmYWlsdXJlIC0gYnVncyA1NjE4IChhZGRlZCB3aXRoIGZpeCBvZiA5OTYyOSkKKwkJCWlmKERFQlVHKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gY2F1Z2h0IGJ5IENvbXBsZXRpb25FbmdpbmU6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKwkJCX0KKwkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gRG8gbm90aGluZworCQl9CisJCWlmKCFjb250ZXh0QWNjZXB0ZWQpIHsKKwkJCWNvbnRleHRBY2NlcHRlZCA9IHRydWU7CisJCQlJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCgpOworCQkJaWYgKHRoaXMucmVxdWVzdG9yLmlzRXh0ZW5kZWRDb250ZXh0UmVxdWlyZWQoKSkgY29udGV4dC5zZXRFeHRlbmRlZCgpOworCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29udGV4dChjb250ZXh0KTsKKwkJfQorCQlpZih0aGlzLnJlcXVlc3RvciAhPSBudWxsKXsKKwkJCXRoaXMucmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25CcmFuY2hTdGF0ZW1lbnRMYWJlbChBU1ROb2RlIGFzdE5vZGUpIHsKKwkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxBQkVMX1JFRikpIHsKKwkJCUNvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsIGxhYmVsID0gKENvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsKSBhc3ROb2RlOworCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBsYWJlbC5sYWJlbDsKKwkJCWZpbmRMYWJlbHModGhpcy5jb21wbGV0aW9uVG9rZW4sIGxhYmVsLnBvc3NpYmxlTGFiZWxzKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKEFTVE5vZGUgYXN0Tm9kZSwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKSkgeworCQkJQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzIGFjY2VzcyA9IChDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MpIGFzdE5vZGU7CisJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKGFjY2Vzcy5jbGFzc1N0YXJ0LCBhY2Nlc3Muc291cmNlRW5kKTsKKwkJCXRoaXMuY29tcGxldGlvblRva2VuID0gYWNjZXNzLmNvbXBsZXRpb25JZGVudGlmaWVyOworCQkJZmluZENsYXNzRmllbGQoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkoVHlwZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsCisJCQkJCXNjb3BlLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlmYWxzZSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEFTVE5vZGUgYXN0Tm9kZSwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKKwkJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKKwkJCUNvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IChDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgYXN0Tm9kZTsKKwkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBjb21wdXRlVHlwZXMoY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyk7CiAJCQlmaW5kQ29uc3RydWN0b3JzKAotCQkJCWN1cnJlbnRUeXBlLAorCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAogCQkJCWFyZ1R5cGVzLAogCQkJCXNjb3BlLAotCQkJCWludm9jYXRpb25TaXRlLAotCQkJCXRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpZWxkKGNoYXJbXSB0b2tlbiwgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBTY29wZSBzY29wZSkgewotCi0JCWlmICh0b2tlbiA9PSBudWxsKSByZXR1cm47Ci0KLQkJaWYgKHRva2VuLmxlbmd0aCA8PSBjbGFzc0ZpZWxkLmxlbmd0aAotCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGNsYXNzRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCi0JCSkpIHsKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBjbGFzc0ZpZWxkKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShzY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCkpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy9ubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGNsYXNzIGZpZWxkIAotCQkJcmVsZXZhbmNlICs9IFJfTk9OX0lOSEVSSVRFRDsKLQkJCQotCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYpKSB7Ci0JCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJLy9wcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShudWxsKTsKLQkJCQljaGFyW10gc2lnbmF0dXJlID0gCi0JCQkJCWNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKAotCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKEpBVkFfTEFORywgJy4nKSwKLQkJCQkJCUNMQVNTKTsKLQkJCQlpZiAodGhpcy5jb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7Ci0JCQkJCS8vIGFkZCB0eXBlIGFyZ3VtZW50Ci0JCQkJCWNoYXJbXSB0eXBlQXJndW1lbnQgPSBnZXRUeXBlU2lnbmF0dXJlKHJlY2VpdmVyVHlwZSk7Ci0JCQkJCWludCBvbGRMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOwotCQkJCQlpbnQgYXJndW1lbnRMZW5ndGggPSB0eXBlQXJndW1lbnQubGVuZ3RoOwotCQkJCQlpbnQgbmV3TGVuZ3RoID0gb2xkTGVuZ3RoICsgYXJndW1lbnRMZW5ndGggKyAyOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNpZ25hdHVyZSwgMCwgc2lnbmF0dXJlID0gbmV3IGNoYXJbbmV3TGVuZ3RoXSwgMCwgb2xkTGVuZ3RoIC0gMSk7Ci0JCQkJCXNpZ25hdHVyZVtvbGRMZW5ndGggLSAxXSA9ICc8JzsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlQXJndW1lbnQsIDAsIHNpZ25hdHVyZSwgb2xkTGVuZ3RoICwgYXJndW1lbnRMZW5ndGgpOwotCQkJCQlzaWduYXR1cmVbbmV3TGVuZ3RoIC0gMl0gPSAnPic7Ci0JCQkJCXNpZ25hdHVyZVtuZXdMZW5ndGggLSAxXSA9ICc7JzsKLQkJCQl9Ci0JCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0JCQkJLy9wcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG51bGwpOwotCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShudWxsKTsKLQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpKTsKLQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShDTEFTUyk7Ci0JCQkJcHJvcG9zYWwuc2V0TmFtZShjbGFzc0ZpZWxkKTsKLQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNsYXNzRmllbGQpOwotCQkJCXByb3Bvc2FsLnNldEZsYWdzKEZsYWdzLkFjY1N0YXRpYyB8IEZsYWdzLkFjY1B1YmxpYyk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGZpbmRFbnVtQ29uc3RhbnQoY2hhcltdIGVudW1Db25zdGFudE5hbWUsIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKLQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7Ci0JCWlmKGV4cHJlc3Npb25UeXBlICE9IG51bGwgJiYgZXhwcmVzc2lvblR5cGUuaXNFbnVtKCkpIHsKLQkJCVJlZmVyZW5jZUJpbmRpbmcgZW51bVR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblR5cGU7Ci0JCQkKLQkJCUNhc2VTdGF0ZW1lbnRbXSBjYXNlcyA9IHN3aXRjaFN0YXRlbWVudC5jYXNlczsKLQkJCQotCQkJY2hhcltdW10gYWxyZWFkeVVzZWRDb25zdGFudHMgPSBuZXcgY2hhcltzd2l0Y2hTdGF0ZW1lbnQuY2FzZUNvdW50XVtdOwotCQkJaW50IGFscmVhZHlVc2VkQ29uc3RhbnRDb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN3aXRjaFN0YXRlbWVudC5jYXNlQ291bnQ7IGkrKykgewotCQkJCUV4cHJlc3Npb24gY2FzZUV4cHJlc3Npb24gPSBjYXNlc1tpXS5jb25zdGFudEV4cHJlc3Npb247Ci0JCQkJaWYoKGNhc2VFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkKLQkJCQkJCSYmIChjYXNlRXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiBjYXNlRXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUuaXNFbnVtKCkpKSB7Ci0JCQkJCWFscmVhZHlVc2VkQ29uc3RhbnRzW2FscmVhZHlVc2VkQ29uc3RhbnRDb3VudCsrXSA9ICgoU2luZ2xlTmFtZVJlZmVyZW5jZSljYXNlc1tpXS5jb25zdGFudEV4cHJlc3Npb24pLnRva2VuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gZW51bVR5cGUuZmllbGRzKCk7Ci0JCQkKLQkJCWludCBlbnVtQ29uc3RhbnRMZW5ndGggPSBlbnVtQ29uc3RhbnROYW1lLmxlbmd0aDsKLQkJCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7CQkJCi0JCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOwotCi0JCQkJaWYgKGZpZWxkLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAoKGZpZWxkLm1vZGlmaWVycyAmIEZsYWdzLkFjY0VudW0pID09IDApIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAoZW51bUNvbnN0YW50TGVuZ3RoID4gZmllbGQubmFtZS5sZW5ndGgpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGVudW1Db25zdGFudE5hbWUsIGZpZWxkLm5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKQotCQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChlbnVtQ29uc3RhbnROYW1lLCBmaWVsZC5uYW1lKSkpCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQkJY2hhcltdIGNvbXBsZXRpb24gPSBmaWVsZC5uYW1lOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxyZWFkeVVzZWRDb25zdGFudENvdW50OyBpKyspIHsKLQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYWxyZWFkeVVzZWRDb25zdGFudHNbaV0sIGNvbXBsZXRpb24pKSBjb250aW51ZSBuZXh0OwotCQkJCX0KLQotCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChmaWVsZCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoZW51bUNvbnN0YW50TmFtZSwgZmllbGQubmFtZSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGZpZWxkLnR5cGUpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCQkKLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYpKSB7Ci0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC50eXBlKSk7Ci0JCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQkJcHJvcG9zYWwuc2V0TmFtZShmaWVsZC5uYW1lKTsKLQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoZmllbGQubW9kaWZpZXJzKTsKLQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisJCQkJY29uc3RydWN0b3JDYWxsLAorCQkJCWZhbHNlLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQludWxsLAorCQkJCWZhbHNlKTsKIAkJfQogCX0KIAkKLQlwcml2YXRlIHZvaWQgZmluZEV4Y2VwdGlvbkZyb21UcnlTdGF0ZW1lbnQoCi0JCQljaGFyW10gdHlwZU5hbWUsCi0JCQlSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUsCi0JCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJCVNvdXJjZVR5cGVCaW5kaW5nIGludm9jYXRpb25UeXBlLCAKLQkJCUJsb2NrU2NvcGUgc2NvcGUsIAotCQkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQsCi0JCQlib29sZWFuIHNlYXJjaFN1cGVyQ2xhc3NlcykgewotCQkKLQkJaWYgKHNlYXJjaFN1cGVyQ2xhc3NlcykgewotCQkJUmVmZXJlbmNlQmluZGluZyBqYXZhTGFuZ1Rocm93YWJsZSA9IHNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCk7Ci0JCQlpZiAoZXhjZXB0aW9uVHlwZSAhPSBqYXZhTGFuZ1Rocm93YWJsZSkgewotCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJDbGFzcyA9IGV4Y2VwdGlvblR5cGUuc3VwZXJjbGFzcygpOwotCQkJCXdoaWxlKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzICE9IGphdmFMYW5nVGhyb3dhYmxlKSB7Ci0JCQkJCWZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KHR5cGVOYW1lLCBzdXBlckNsYXNzLCByZWNlaXZlclR5cGUsIGludm9jYXRpb25UeXBlLCBzY29wZSwgdHlwZXNGb3VuZCwgZmFsc2UpOwotCQkJCQlzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5zdXBlcmNsYXNzKCk7Ci0JCQkJfQorCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25GaWVsZE5hbWUoQVNUTm9kZSBhc3ROb2RlLCBTY29wZSBzY29wZSkgeworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04pKSB7CisJCQlDb21wbGV0aW9uT25GaWVsZE5hbWUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGROYW1lKSBhc3ROb2RlOworCisJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZmllbGRzKCk7CisJCQljaGFyW11bXSBleGNsdWRlTmFtZXMgPSBuZXcgY2hhcltmaWVsZHMubGVuZ3RoXVtdOworCQkJZm9yKGludCBpID0gMCA7IGkgPCBmaWVsZHMubGVuZ3RoIDsgaSsrKXsKKwkJCQlleGNsdWRlTmFtZXNbaV0gPSBmaWVsZHNbaV0ubmFtZTsKIAkJCX0KLQkJfQotCQkKLQkJaWYgKHR5cGVOYW1lLmxlbmd0aCA+IGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZS5sZW5ndGgpCi0JCQlyZXR1cm47CiAKLQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0eXBlTmFtZSwgZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lLCBmYWxzZS8qIGlnbm9yZSBjYXNlICovKQotCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSkpKQotCQkJcmV0dXJuOworCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBmaWVsZC5yZWFsTmFtZTsKIAotCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQlleGNlcHRpb25UeXBlLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChleGNlcHRpb25UeXBlKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5KSB7Ci0JCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gbnVsbCkgewotCQkJCWlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCkgewotCQkJCQlpZiAoIWV4Y2VwdGlvblR5cGUuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSkpIHJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWV4Y2VwdGlvblR5cGUuY2FuQmVTZWVuQnkoZXhjZXB0aW9uVHlwZSwgaW52b2NhdGlvblR5cGUpKSByZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIGlmKCFleGNlcHRpb25UeXBlLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGogPSB0eXBlc0ZvdW5kLnNpemU7IC0taiA+PSAwOykgewotCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZXNGb3VuZC5lbGVtZW50QXQoaik7Ci0KLQkJCWlmIChleGNlcHRpb25UeXBlID09IG90aGVyVHlwZSkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhleGNlcHRpb25UeXBlLnNvdXJjZU5hbWUsIG90aGVyVHlwZS5zb3VyY2VOYW1lLCB0cnVlKSkgewotCi0JCQkJaWYgKGV4Y2VwdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzU3VwZXJjbGFzc09mKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc0ludGVyZmFjZSgpKQotCQkJCQlpZiAoZXhjZXB0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCkKLQkJCQkJCS5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCksIHRydWUpKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKGV4Y2VwdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzSW50ZXJmYWNlKCkpCi0JCQkJCWlmIChvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpCi0JCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShleGNlcHRpb25UeXBlLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkpCi0JCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0eXBlc0ZvdW5kLmFkZChleGNlcHRpb25UeXBlKTsKLQkJCi0JCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpOwotCQkKLQkJYm9vbGVhbiBpc1F1YWxpZmllZCA9IGZhbHNlOwotCQkKLQkJaWYoIXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7Ci0JCQlpc1F1YWxpZmllZCA9IHRydWU7CiAJCQkKLQkJCWNoYXJbXSBtZW1iZXJQYWNrYWdlTmFtZSA9IGV4Y2VwdGlvblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKLQkJCWNoYXJbXSBtZW1iZXJUeXBlTmFtZSA9IGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpOwotCQkJY2hhcltdIG1lbWJlckVuY2xvc2luZ1R5cGVOYW1lcyA9IG51bGw7CisJCQlpbnQga2luZCA9CisJCQkJIChmaWVsZC5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSA9PSAwID8gCisJCQkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLlZLX0lOU1RBTkNFX0ZJRUxEIDoKKwkJCQkJCQkoZmllbGQubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSA9PSAwID8gCisJCQkJCQkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLlZLX1NUQVRJQ19GSUVMRCA6CisJCQkJCQkJCQkJSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5WS19TVEFUSUNfRklOQUxfRklFTEQ7CiAJCQkKLQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGV4Y2VwdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpOwotCQkJaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgewotCQkJCW1lbWJlckVuY2xvc2luZ1R5cGVOYW1lcyA9IGV4Y2VwdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKLQkJCX0KLQkJCQotCQkJU2NvcGUgY3VycmVudFNjb3BlID0gc2NvcGU7Ci0JCQlkb25lIDogd2hpbGUgKGN1cnJlbnRTY29wZSAhPSBudWxsKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKLQotCQkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKLQotCQkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6Ci0JCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgotCQkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIGN1cnJlbnRTY29wZTsKLQotCQkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGJsb2NrU2NvcGUuc3Vic2NvcGVDb3VudDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0KLQkJCQkJCQlpZiAoYmxvY2tTY29wZS5zdWJzY29wZXNbal0gaW5zdGFuY2VvZiBDbGFzc1Njb3BlKSB7Ci0JCQkJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGxvY2FsVHlwZSA9Ci0JCQkJCQkJCQkoKENsYXNzU2NvcGUpIGJsb2NrU2NvcGUuc3Vic2NvcGVzW2pdKS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAobG9jYWxUeXBlID09IGV4Y2VwdGlvblR5cGUpIHsKLQkJCQkJCQkJCWlzUXVhbGlmaWVkID0gZmFsc2U7Ci0JCQkJCQkJCQlicmVhayBkb25lOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6Ci0JCQkJCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlID0gKChDbGFzc1Njb3BlKWN1cnJlbnRTY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwotCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gdHlwZS5tZW1iZXJUeXBlcygpOwotCQkJCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChtZW1iZXJUeXBlc1tqXSA9PSBleGNlcHRpb25UeXBlKSB7Ci0JCQkJCQkJCQlpc1F1YWxpZmllZCA9IGZhbHNlOwotCQkJCQkJCQkJYnJlYWsgZG9uZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJCi0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgotCQkJCQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9ICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpY3VycmVudFNjb3BlKS50b3BMZXZlbFR5cGVzOwotCQkJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmICh0eXBlc1tqXSA9PSBleGNlcHRpb25UeXBlKSB7Ci0JCQkJCQkJCQlpc1F1YWxpZmllZCA9IGZhbHNlOwotCQkJCQkJCQkJYnJlYWsgZG9uZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrIGRvbmU7Ci0JCQkJfQotCQkJCWN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS5wYXJlbnQ7Ci0JCQl9Ci0JCQkKLQkJCWlmIChpc1F1YWxpZmllZCAmJiBtdXN0UXVhbGlmeVR5cGUobWVtYmVyUGFja2FnZU5hbWUsIG1lbWJlclR5cGVOYW1lLCBtZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMsIGV4Y2VwdGlvblR5cGUubW9kaWZpZXJzKSkgewotCQkJCWlmIChtZW1iZXJQYWNrYWdlTmFtZSA9PSBudWxsIHx8IG1lbWJlclBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJCQlpZiAodGhpcy51bml0U2NvcGUgIT0gbnVsbCAmJiB0aGlzLnVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpCi0JCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0Ci0JCQl9IGVsc2UgewotCQkJCWlzUXVhbGlmaWVkID0gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChpc1F1YWxpZmllZCkgewotCQkJCWNvbXBsZXRpb25OYW1lID0KLQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQkJbWVtYmVyUGFja2FnZU5hbWUsCi0JCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQkJCQltZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCQkJCQltZW1iZXJUeXBlTmFtZSwKLQkJCQkJCQkJCScuJyksCi0JCQkJCQkJJy4nKTsKLQkJCX0KLQkJfQotCQkKLQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodHlwZU5hbWUsIGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShleGNlcHRpb25UeXBlKTsKLQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJaWYoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgewotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGlzUXVhbGlmaWVkKTsKLQkJfQotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKCk7Ci0JCQkKLQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJY3JlYXRlVHlwZVByb3Bvc2FsKGV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsIGNvbXBsZXRpb25OYW1lLCByZWxldmFuY2UpOworCQkJZmluZFZhcmlhYmxlTmFtZXMoZmllbGQucmVhbE5hbWUsIGZpZWxkLnR5cGUsIGV4Y2x1ZGVOYW1lcywgbnVsbCwga2luZCk7CiAJCX0KIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KAotCQkJY2hhcltdIHR5cGVOYW1lLAotCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCQlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSwgCi0JCQlCbG9ja1Njb3BlIHNjb3BlLCAKLQkJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kKSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmV4cGVjdGVkVHlwZXNQdHI7IGkrKykgewotCQkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5leHBlY3RlZFR5cGVzW2ldOwotCQkJCi0JCQlmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCh0eXBlTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSwgc2NvcGUsIHR5cGVzRm91bmQsIHRydWUpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBmaW5kRXhwbGljaXRDb25zdHJ1Y3RvcnMoCi0JCWNoYXJbXSBuYW1lLAotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLAotCQlNZXRob2RTY29wZSBzY29wZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKLQkJCQotCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbilzY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQlNZXRob2RCaW5kaW5nIGVuY2xvc2luZ0NvbnN0cnVjdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5iaW5kaW5nOworCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25GaWVsZFR5cGUoQVNUTm9kZSBhc3ROb2RlLCBTY29wZSBzY29wZSkgeworCQlDb21wbGV0aW9uT25GaWVsZFR5cGUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGRUeXBlKSBhc3ROb2RlOworCQlDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGUgPSAoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgZmllbGQudHlwZTsKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSB0eXBlLnRva2VuOworCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKHR5cGUuc291cmNlU3RhcnQsIHR5cGUuc291cmNlRW5kKTsKIAotCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKLQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7Ci0JCWlmKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7Ci0JCQkJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IG1ldGhvZHNbZl07Ci0JCQkJaWYgKGNvbnN0cnVjdG9yICE9IGVuY2xvc2luZ0NvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQkKLQkJCQkJaWYgKGNvbnN0cnVjdG9yLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkKLQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCi0JCQkJCQkJY29uc3RydWN0b3IuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJgotCQkJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzKSkKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQotCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCQkJJiYgIWNvbnN0cnVjdG9yLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCBzY29wZSkpCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQotCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzOwotCQkJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKLQkKLQkJCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107Ci0JCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTGVuZ3RoOyBpKyspIHsKLQkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBwYXJhbWV0ZXJzW2ldOwotCQkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7Ci0JCQkJCX0KLQkJCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoY29uc3RydWN0b3IscGFyYW1ldGVyVHlwZU5hbWVzKTsKLQkJCQkJCi0JCQkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCQkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAotCQkJCQkJJiYgdGhpcy5zb3VyY2UubGVuZ3RoID4gdGhpcy5lbmRQb3NpdGlvbgotCQkJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5lbmRQb3NpdGlvbl0gPT0gJygnKQotCQkJCQkJY29tcGxldGlvbiA9IG5hbWU7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLCBuZXcgY2hhcltdIHsgJygnLCAnKScgfSk7Ci0JCQkJCQotCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbmFtZSk7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0JCQkJCQotCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKLQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOwotCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOwotCQkJCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IGNvbnN0cnVjdG9yLm9yaWdpbmFsKCk7Ci0JCQkJCQlpZihvcmlnaW5hbCAhPSBjb25zdHJ1Y3RvcikgewotCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOwotCQkJCQkJfQotCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOwotCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJCQkJLy9wcm9wb3NhbC5zZXRUeXBlTmFtZShudWxsKTsKLQkJCQkJCXByb3Bvc2FsLnNldE5hbWUobmFtZSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRJc0NvbnRydWN0b3IodHJ1ZSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOwotCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoY29uc3RydWN0b3IubW9kaWZpZXJzKTsKLQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQorCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUsIHRydWUsIHRydWUsIG5ldyBPYmplY3RWZWN0b3IoKSk7CisJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgeworCQkJZmluZEtleXdvcmRzRm9yTWVtYmVyKHRoaXMuY29tcGxldGlvblRva2VuLCBmaWVsZC5tb2RpZmllcnMpOworCQl9CisKKwkJaWYgKCFmaWVsZC5pc0xvY2FsVmFyaWFibGUgJiYgZmllbGQubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KSB7CisJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJaWYgKCFlbmNsb3NpbmdUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgeworCQkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04pKSB7CisJCQkJCWZpbmRNZXRob2REZWNsYXJhdGlvbnMoCisJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQkJZW5jbG9zaW5nVHlwZSwKKwkJCQkJCQlzY29wZSwKKwkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCQkJbnVsbCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTikpIHsKKwkJCQkJcHJvcG9zZU5ld01ldGhvZCh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgZW5jbG9zaW5nVHlwZSk7CiAJCQkJfQogCQkJfQogCQl9CiAJfQotCXByaXZhdGUgdm9pZCBmaW5kQ29uc3RydWN0b3JzKAotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLAotCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAotCQlTY29wZSBzY29wZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCWJvb2xlYW4gZm9yQW5vbnltb3VzVHlwZSkgewotCi0JCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQotCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKLQkJaWYobWV0aG9kcyAhPSBudWxsKSB7Ci0JCQlpbnQgbWluQXJnTGVuZ3RoID0gYXJnVHlwZXMgPT0gbnVsbCA/IDAgOiBhcmdUeXBlcy5sZW5ndGg7Ci0JCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKLQkJCQlNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yID0gbWV0aG9kc1tmXTsKLQkJCQlpZiAoY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCQotCQkJCQlpZiAoY29uc3RydWN0b3IuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKLQkJCQkJCQotCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJCQljb25zdHJ1Y3Rvci5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MpKQotCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJCi0JCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5Ci0JCQkJCQkmJiAhY29uc3RydWN0b3IuY2FuQmVTZWVuQnkoaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgewotCQkJCQkJaWYoIWZvckFub255bW91c1R5cGUgfHwgIWNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpCi0JCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQotCQkJCQkKLQkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IucGFyYW1ldGVyczsKLQkJCQkJaW50IHBhcmFtTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7Ci0JCQkJCWlmIChtaW5BcmdMZW5ndGggPiBwYXJhbUxlbmd0aCkKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOykKLQkJCQkJCWlmIChhcmdUeXBlc1thXSAhPSBudWxsKSB7IC8vIGNhbiBiZSBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBwcm9wZXJseQotCQkJCQkJCWlmICghYXJnVHlwZXNbYV0uaXNDb21wYXRpYmxlV2l0aChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2FdKSkKLQkJCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJCX0KLQkKLQkJCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107Ci0JCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTGVuZ3RoOyBpKyspIHsKLQkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBwYXJhbWV0ZXJzW2ldOwotCQkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7Ci0JCQkJCX0KLQkJCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoY29uc3RydWN0b3IscGFyYW1ldGVyVHlwZU5hbWVzKTsKLQkJCQkJCi0JCQkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCQkJCQlpZihmb3JBbm9ueW1vdXNUeXBlKXsKLQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0JCQkJCQkKLQkJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OKSkgewotCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KGN1cnJlbnRUeXBlLmNvbXB1dGVVbmlxdWVLZXkoKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOwotCQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBjb25zdHJ1Y3Rvci5vcmlnaW5hbCgpOwotCQkJCQkJCWlmKG9yaWdpbmFsICE9IGNvbnN0cnVjdG9yKSB7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm9wb3NhbC5zZXRLZXkoY29uc3RydWN0b3IuY29tcHV0ZVVuaXF1ZUtleSgpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKLQkJCQkJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhjb25zdHJ1Y3Rvci5tb2RpZmllcnMpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOwotCi0JCQkJCQkvLyBTcGVjaWFsIGNhc2UgZm9yIGNvbXBsZXRpb24gaW4gamF2YWRvYwotCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA+IDApIHsKLQkJCQkJCQlFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQkJCQkJCQljaGFyW10gc2VsZWN0b3IgPSBudWxsOwotCQkJCQkJCWlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbikgewotCQkJCQkJCQlDb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKSBpbnZvY2F0aW9uU2l0ZTsKLQkJCQkJCQkJcmVjZWl2ZXIgPSBhbGxvYy50eXBlOwotCQkJCQkJCX0gZWxzZSBpZiAoaW52b2NhdGlvblNpdGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UpIHsKLQkJCQkJCQkJQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmID0gKENvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSkgaW52b2NhdGlvblNpdGU7Ci0JCQkJCQkJCXJlY2VpdmVyID0gZmllbGRSZWYucmVjZWl2ZXI7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChyZWNlaXZlciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZ0J1ZmZlciBqYXZhZG9jQ29tcGxldGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQkJaWYgKHJlY2VpdmVyLmlzVGhpcygpKSB7Ci0JCQkJCQkJCQlzZWxlY3RvciA9ICgoKEphdmFkb2NJbXBsaWNpdFR5cGVSZWZlcmVuY2UpcmVjZWl2ZXIpLnRva2VuKTsKLQkJCQkJCQkJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwKSB7Ci0JCQkJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcjJyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQkJCQkJCQkJSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IChKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgcmVjZWl2ZXI7Ci0JCQkJCQkJCQlzZWxlY3RvciA9IHR5cGVSZWYudG9rZW47Ci0JCQkJCQkJCQlpZiAoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCkgewotCQkJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCh0eXBlUmVmLnRva2VuKTsKLQkJCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7Ci0JCQkJCQkJCQlKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByZWNlaXZlcjsKLQkJCQkJCQkJCXNlbGVjdG9yID0gdHlwZVJlZi50b2tlbnNbdHlwZVJlZi50b2tlbnMubGVuZ3RoLTFdOwotCQkJCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDApIHsKLQkJCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpKTsKLQkJCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBBcHBlbmQgcGFyYW1ldGVycyB0eXBlcwotCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoc2VsZWN0b3IpOwotCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJygnKTsKLQkJCQkJCQkJaWYgKGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMgIT0gbnVsbCkgewotCQkJCQkJCQkJYm9vbGVhbiBpc1ZhcmFyZ3MgPSBjb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKTsKLQkJCQkJCQkJCWZvciAoaW50IHA9MCwgbG49Y29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGg7IHA8bG47IHArKykgewotCQkJCQkJCQkJCWlmIChwPjApIGphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCVR5cGVCaW5kaW5nIGFyZ1R5cGVCaW5kaW5nID0gY29uc3RydWN0b3IucGFyYW1ldGVyc1twXTsKLQkJCQkJCQkJCQlpZiAoaXNWYXJhcmdzICYmIHAgPT0gbG4gLSAxKSAgewotCQkJCQkJCQkJCQljcmVhdGVWYXJnc1R5cGUoYXJnVHlwZUJpbmRpbmcuZXJhc3VyZSgpLCBqYXZhZG9jQ29tcGxldGlvbik7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJY3JlYXRlVHlwZShhcmdUeXBlQmluZGluZy5lcmFzdXJlKCksIGphdmFkb2NDb21wbGV0aW9uKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcpJyk7Ci0JCQkJCQkJCWNvbXBsZXRpb24gPSBqYXZhZG9jQ29tcGxldGlvbi50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7Ci0JCQkJCQkJfQotCQkJCQkJfSAKLQkJCQkJCQotCQkJCQkJLy8gQ3JlYXRlIHN0YW5kYXJkIHByb3Bvc2FsCi0JCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpICYmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLk9OTFlfSU5MSU5FX1RBRykgPT0gMCkgewotCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoY3VycmVudFR5cGUpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGNvbnN0cnVjdG9yKSk7Ci0JCQkJCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IGNvbnN0cnVjdG9yLm9yaWdpbmFsKCk7Ci0JCQkJCQkJaWYob3JpZ2luYWwgIT0gY29uc3RydWN0b3IpIHsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoY3VycmVudFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOwotCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOwotCQkJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7Ci0JCQkJCQkJLy9wcm9wb3NhbC5zZXRUeXBlTmFtZShudWxsKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXROYW1lKGN1cnJlbnRUeXBlLnNvdXJjZU5hbWUoKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0SXNDb250cnVjdG9yKHRydWUpOwotCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoY29uc3RydWN0b3IubW9kaWZpZXJzKTsKLQkJCQkJCQlpbnQgc3RhcnQgPSAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID4gMCkgPyB0aGlzLnN0YXJ0UG9zaXRpb24gOiB0aGlzLmVuZFBvc2l0aW9uOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKLQkJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGKSkgewotCQkJCQkJCWNoYXJbXSBqYXZhZG9jQ29tcGxldGlvbiA9IGlubGluZVRhZ0NvbXBsZXRpb24oY29tcGxldGlvbiwgSmF2YWRvY1RhZ0NvbnN0YW50cy5UQUdfTElOSyk7Ci0JCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGN1cnJlbnRUeXBlKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOwotCQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBjb25zdHJ1Y3Rvci5vcmlnaW5hbCgpOwotCQkJCQkJCWlmKG9yaWdpbmFsICE9IGNvbnN0cnVjdG9yKSB7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKLQkJCQkJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShjdXJyZW50VHlwZS5zb3VyY2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldElzQ29udHJ1Y3Rvcih0cnVlKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhjb25zdHJ1Y3Rvci5tb2RpZmllcnMpOwotCQkJCQkJCWludCBzdGFydCA9ICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPiAwKSA/IHRoaXMuc3RhcnRQb3NpdGlvbiA6IHRoaXMuZW5kUG9zaXRpb247Ci0JCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlJFUExBQ0VfVEFHKSAhPSAwKSBzdGFydCA9IHRoaXMuamF2YWRvY1RhZ1Bvc2l0aW9uOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UrUl9JTkxJTkVfVEFHKTsKLQkJCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7Ci0JCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKwkvL1RPRE8KKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKEFTVE5vZGUgYXN0Tm9kZSwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQkvLyBzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCwgZmFsc2UpOworCQkKKwkJQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwcmVzc2lvbiA9IChDb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7CisJCXRoaXMuamF2YWRvY1RhZ1Bvc2l0aW9uID0gYWxsb2NFeHByZXNzaW9uLnRhZ1NvdXJjZVN0YXJ0OworCQlpbnQgcmFuZ2VTdGFydCA9IGFzdE5vZGUuc291cmNlU3RhcnQ7CisJCWlmIChhbGxvY0V4cHJlc3Npb24udHlwZS5pc1RoaXMoKSkgeworCQkJaWYgKGFsbG9jRXhwcmVzc2lvbi5jb21wbGV0ZUluVGV4dCgpKSB7CisJCQkJcmFuZ2VTdGFydCA9IGFsbG9jRXhwcmVzc2lvbi5zZXBhcmF0b3JQb3NpdGlvbjsKIAkJCX0KKwkJfSBlbHNlIGlmIChhbGxvY0V4cHJlc3Npb24uY29tcGxldGVJblRleHQoKSkgeworCQkJcmFuZ2VTdGFydCA9IGFsbG9jRXhwcmVzc2lvbi50eXBlLnNvdXJjZVN0YXJ0OworCQl9CisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UocmFuZ2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IGNvbXB1dGVUeXBlcyhhbGxvY0V4cHJlc3Npb24uYXJndW1lbnRzKTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIHJlZiA9IChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikgJiYgcmVmLmlzQ2xhc3MoKSkgeworCQkJZmluZENvbnN0cnVjdG9ycyhyZWYsIGFyZ1R5cGVzLCBzY29wZSwgYWxsb2NFeHByZXNzaW9uLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwogCQl9CiAJfQotCQotCXByaXZhdGUgY2hhcltdW10gZmluZEVuY2xvc2luZ1R5cGVOYW1lcyhTY29wZSBzY29wZSl7Ci0JCWNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhclsxMF1bXTsKLQkJaW50IGV4Y2x1ZGVkTmFtZUNvdW50ID0gMDsKLQkJCi0JCVNjb3BlIGN1cnJlbnRTY29wZSA9IHNjb3BlOwotCQl3aGlsZShjdXJyZW50U2NvcGUgIT0gbnVsbCkgewotCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgewotCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgotCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgY3VycmVudFNjb3BlOwotCQkJCQkKLQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCQkJCi0JCQkJCWlmKGV4Y2x1ZGVkTmFtZUNvdW50ID09IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVkTmFtZXMsIDAsIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhcltleGNsdWRlZE5hbWVDb3VudCAqIDJdW10sIDAsIGV4Y2x1ZGVkTmFtZUNvdW50KTsKLQkJCQkJfQotCQkJCQlleGNsdWRlZE5hbWVzW2V4Y2x1ZGVkTmFtZUNvdW50KytdID0gdHlwZURlY2xhcmF0aW9uLm5hbWU7Ci0JCQkJCQotCQkJCQlUeXBlUGFyYW1ldGVyW10gY2xhc3NUeXBlUGFyYW1ldGVycyA9IHR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKLQkJCQkJaWYoY2xhc3NUeXBlUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzVHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBjbGFzc1R5cGVQYXJhbWV0ZXJzW2ldOwotCQkJCQkJCWlmKGV4Y2x1ZGVkTmFtZUNvdW50ID09IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhjbHVkZWROYW1lcywgMCwgZXhjbHVkZWROYW1lcyA9IG5ldyBjaGFyW2V4Y2x1ZGVkTmFtZUNvdW50ICogMl1bXSwgMCwgZXhjbHVkZWROYW1lQ291bnQpOwotCQkJCQkJCX0KLQkJCQkJCQlleGNsdWRlZE5hbWVzW2V4Y2x1ZGVkTmFtZUNvdW50KytdID0gdHlwZVBhcmFtZXRlci5uYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKLQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsKLQkJCQkJaWYobWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCQkJCVR5cGVQYXJhbWV0ZXJbXSBtZXRob2RUeXBlUGFyYW1ldGVycyA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiltZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0KS50eXBlUGFyYW1ldGVycygpOwotCQkJCQkJaWYobWV0aG9kVHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kVHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kVHlwZVBhcmFtZXRlcnNbaV07Ci0JCQkJCQkJCWlmKGV4Y2x1ZGVkTmFtZUNvdW50ID09IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVkTmFtZXMsIDAsIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhcltleGNsdWRlZE5hbWVDb3VudCAqIDJdW10sIDAsIGV4Y2x1ZGVkTmFtZUNvdW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlleGNsdWRlZE5hbWVzW2V4Y2x1ZGVkTmFtZUNvdW50KytdID0gdHlwZVBhcmFtZXRlci5uYW1lOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKLQkJfQotCQkKLQkJaWYoZXhjbHVkZWROYW1lQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoZXhjbHVkZWROYW1lcywgMCwgZXhjbHVkZWROYW1lcyA9IG5ldyBjaGFyW2V4Y2x1ZGVkTmFtZUNvdW50XVtdLCAwLCBleGNsdWRlZE5hbWVDb3VudCk7Ci0JCXJldHVybiBleGNsdWRlZE5hbWVzOwotCX0KLQkKLQkvLyBIZWxwZXIgbWV0aG9kIGZvciBmaW5kRmllbGRzKGNoYXJbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUsIE9iamVjdFZlY3RvciwgYm9vbGVhbikKLQlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygKLQkJY2hhcltdIGZpZWxkTmFtZSwKLQkJRmllbGRCaW5kaW5nW10gZmllbGRzLAotCQlTY29wZSBzY29wZSwKLQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAotCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQsCi0JCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKLQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAotCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCi0JCWJvb2xlYW4gaW1wbGljaXRDYWxsLAotCQlib29sZWFuIGNhbkJlUHJlZml4ZWQsCi0JCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCi0JCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpIHsKKwkvL1RPRE8KKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKEFTVE5vZGUgYXN0Tm9kZSwgU2NvcGUgc2NvcGUpIHsKKwkJdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOworCQlDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UgZmllbGRSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSBhc3ROb2RlOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IGZpZWxkUmVmLnRva2VuOworCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IGZpZWxkUmVmLm5hbWVTb3VyY2VQb3NpdGlvbjsKKwkJdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gPSBmaWVsZFJlZi50YWdTb3VyY2VTdGFydDsKIAotCQlPYmplY3RWZWN0b3IgbmV3RmllbGRzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7Ci0JCS8vIEluaGVyaXRlZCBmaWVsZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKLQkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCi0JCQotCQlpbnQgZmllbGRMZW5ndGggPSBmaWVsZE5hbWUubGVuZ3RoOwotCQluZXh0IDogZm9yIChpbnQgZiA9IGZpZWxkcy5sZW5ndGg7IC0tZiA+PSAwOykgewkJCQotCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOwotCi0JCQlpZiAoZmllbGQuaXNTeW50aGV0aWMoKSkJY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKG9ubHlTdGF0aWNGaWVsZHMgJiYgIWZpZWxkLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2goZmllbGROYW1lLCBmaWVsZC5uYW1lKSkpCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgotCQkJCQlmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGZpZWxkLmRlY2xhcmluZ0NsYXNzKSkKLQkJCQljb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCSYmICFmaWVsZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWJvb2xlYW4gcHJlZml4UmVxdWlyZWQgPSBmYWxzZTsKLQotCQkJZm9yIChpbnQgaSA9IGZpZWxkc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgewotCQkJCU9iamVjdFtdIG90aGVyID0gKE9iamVjdFtdKWZpZWxkc0ZvdW5kLmVsZW1lbnRBdChpKTsKLQkJCQlGaWVsZEJpbmRpbmcgb3RoZXJGaWVsZCA9IChGaWVsZEJpbmRpbmcpIG90aGVyWzBdOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3RoZXJbMV07Ci0JCQkJaWYgKGZpZWxkID09IG90aGVyRmllbGQgJiYgcmVjZWl2ZXJUeXBlID09IG90aGVyUmVjZWl2ZXJUeXBlKQotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZC5uYW1lLCBvdGhlckZpZWxkLm5hbWUsIHRydWUpKSB7Ci0JCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcy5pc1N1cGVyY2xhc3NPZihvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzKSkKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCWlmIChvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcyA9PSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpKQotCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzLCB0cnVlKSkKLQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQl9Ci0JCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQotCQkJCQkJaWYgKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShmaWVsZC5kZWNsYXJpbmdDbGFzcywgdHJ1ZSkpCi0JCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJaWYoY2FuQmVQcmVmaXhlZCkgewotCQkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQorCQlpZiAoZmllbGRSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwgJiYgZmllbGRSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBmaWVsZFJlZi5hY3R1YWxSZWNlaXZlclR5cGU7CisJCQlpbnQgcmFuZ2VTdGFydCA9IChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKTsKKwkJCWlmIChmaWVsZFJlZi5yZWNlaXZlci5pc1RoaXMoKSkgeworCQkJCWlmIChmaWVsZFJlZi5jb21wbGV0ZUluVGV4dCgpKSB7CisJCQkJCXJhbmdlU3RhcnQgPSBmaWVsZFJlZi5zZXBhcmF0b3JQb3NpdGlvbjsKIAkJCQl9CisJCQl9IGVsc2UgaWYgKGZpZWxkUmVmLmNvbXBsZXRlSW5UZXh0KCkpIHsKKwkJCQlyYW5nZVN0YXJ0ID0gZmllbGRSZWYucmVjZWl2ZXIuc291cmNlU3RhcnQ7CiAJCQl9CisJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKHJhbmdlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CiAKLQkJCWZvciAoaW50IGwgPSBsb2NhbHNGb3VuZC5zaXplOyAtLWwgPj0gMDspIHsKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgbG9jYWxzRm91bmQuZWxlbWVudEF0KGwpOwkKLQotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZC5uYW1lLCBsb2NhbC5uYW1lLCB0cnVlKSkgewotCQkJCQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJhdGlvblR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQkJCWlmIChkZWNsYXJhdGlvblR5cGUuaXNBbm9ueW1vdXNUeXBlKCkgJiYgZGVjbGFyYXRpb25UeXBlICE9IGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpIHsKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCX0KLQkJCQkJaWYoY2FuQmVQcmVmaXhlZCkgewotCQkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW5ld0ZpZWxkc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117ZmllbGQsIHJlY2VpdmVyVHlwZX0pOwotCQkJCi0JCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkLm5hbWU7Ci0JCQkKLQkJCWlmKHByZWZpeFJlcXVpcmVkIHx8IHRoaXMub3B0aW9ucy5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbil7Ci0JCQkJY2hhcltdIHByZWZpeCA9IGNvbXB1dGVQcmVmaXgoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBpbnZvY2F0aW9uU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBmaWVsZC5pc1N0YXRpYygpKTsKLQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4LGNvbXBsZXRpb24sJy4nKTsKLQkJCX0KLQotCQkJLy8gU3BlY2lhbCBjYXNlIGZvciBqYXZhZG9jIGNvbXBsZXRpb24KLQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPiAwKSB7Ci0JCQkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSB7Ci0JCQkJCUNvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UpIGludm9jYXRpb25TaXRlOwotCQkJCQlpZiAoZmllbGRSZWYucmVjZWl2ZXIuaXNUaGlzKCkpIHsKLQkJCQkJCWlmIChmaWVsZFJlZi5jb21wbGV0ZUluVGV4dCgpKSB7Ci0JCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG5ldyBjaGFyW10geyAnIycgfSwgZmllbGQubmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZmllbGRSZWYuY29tcGxldGVJblRleHQoKSkgewotCQkJCQkJaWYgKGZpZWxkUmVmLnJlY2VpdmVyIGluc3RhbmNlb2YgSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UpIHsKLQkJCQkJCQlKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSBmaWVsZFJlZi5yZWNlaXZlcjsKLQkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZVJlZi50b2tlbiwgZmllbGQubmFtZSwgJyMnKTsKLQkJCQkJCX0gZWxzZSBpZiAoZmllbGRSZWYucmVjZWl2ZXIgaW5zdGFuY2VvZiBKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewotCQkJCQkJCUphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIGZpZWxkUmVmLnJlY2VpdmVyOwotCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZVJlZi50b2tlbnMsICcuJyksIGZpZWxkLm5hbWUsICcjJyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoZmllbGQpOwotCQkJaWYgKGZpZWxkTmFtZSAhPSBudWxsKSByZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhmaWVsZE5hbWUsIGZpZWxkLm5hbWUpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGZpZWxkLnR5cGUpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JTdGF0aWMob25seVN0YXRpY0ZpZWxkcywgZmllbGQuaXNTdGF0aWMoKSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCWlmIChvbmx5U3RhdGljRmllbGRzICYmIHRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbmhlcml0YW5jZShyZWNlaXZlclR5cGUsIGZpZWxkLmRlY2xhcmluZ0NsYXNzKTsKLQkJCX0KLQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yTWlzc2luZ0VsZW1lbnRzKG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7Ci0JCQl9Ci0JCQkKLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJLy8gU3RhbmRhcmQgcHJvcG9zYWwKLQkJCWlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpICYmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLk9OTFlfSU5MSU5FX1RBRykgPT0gMCkgewotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOwotCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdWJQcm9wb3NhbHMgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW21pc3NpbmdFbGVtZW50cy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KLQkJCQkJCQljcmVhdGVSZXF1aXJlZFR5cGVQcm9wb3NhbCgKLQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1tpXSwKLQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKLQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHNbaV0sCi0JCQkJCQkJCQlyZWxldmFuY2UpOwotCQkJCQl9Ci0JCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKHN1YlByb3Bvc2Fscyk7Ci0JCQkJfQotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJcHJvcG9zYWwuc2V0RmxhZ3MoZmllbGQubW9kaWZpZXJzKTsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gSmF2YWRvYyBjb21wbGV0aW9ucwotCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19GSUVMRF9SRUYpKSB7Ci0JCQkJY2hhcltdIGphdmFkb2NDb21wbGV0aW9uID0gaW5saW5lVGFnQ29tcGxldGlvbihjb21wbGV0aW9uLCBKYXZhZG9jVGFnQ29uc3RhbnRzLlRBR19MSU5LKTsKLQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0ZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oamF2YWRvY0NvbXBsZXRpb24pOwotCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7Ci0JCQkJaW50IHN0YXJ0ID0gKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuUkVQTEFDRV9UQUcpICE9IDAgPyB0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCX0KLQkJCQkvLyBKYXZhZG9jIHZhbHVlIGNvbXBsZXRpb24gZm9yIHN0YXRpYyBmaWVsZHMKLQkJCQlpZiAoZmllbGQuaXNTdGF0aWMoKSAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1ZBTFVFX1JFRikpIHsKLQkJCQkJamF2YWRvY0NvbXBsZXRpb24gPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb24sIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX1ZBTFVFKTsKLQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHZhbHVlUHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1ZBTFVFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCXZhbHVlUHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCXZhbHVlUHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQkJdmFsdWVQcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldENvbXBsZXRpb24oamF2YWRvY0NvbXBsZXRpb24pOwotCQkJCQl2YWx1ZVByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7Ci0JCQkJCXZhbHVlUHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCXZhbHVlUHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZStSX1ZBTFVFX1RBRyk7Ci0JCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdCh2YWx1ZVByb3Bvc2FsKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCXRoaXMucHJpbnREZWJ1Zyh2YWx1ZVByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZmllbGRzRm91bmQuYWRkQWxsKG5ld0ZpZWxkc0ZvdW5kKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygKLQkJY2hhcltdIGZpZWxkTmFtZSwKLQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCVNjb3BlIHNjb3BlLAotCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQsCi0JCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwKLQkJYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzLAotCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKLQkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAotCQlib29sZWFuIGltcGxpY2l0Q2FsbCwKLQkJYm9vbGVhbiBjYW5CZVByZWZpeGVkLAotCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAotCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKSB7Ci0KLQkJYm9vbGVhbiBub3RJbkphdmFkb2MgPSB0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMDsKLQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsICYmIG5vdEluSmF2YWRvYykKLQkJCXJldHVybjsKLQotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOwotCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOwotCQlpbnQgbmV4dFBvc2l0aW9uID0gMDsKLQkJZG8gewotCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKLQkJCWlmIChub3RJbkphdmFkb2MgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewotCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKSB7Ci0JCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gaXRzSW50ZXJmYWNlczsKLQkJCQkJbmV4dFBvc2l0aW9uID0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKLQkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOwotCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgewotCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKLQkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCi0JCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7Ci0JCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVGaWVsZHMoKTsKLQkJCWlmKGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7Ci0JCQkJZmluZEZpZWxkcygKLQkJCQkJZmllbGROYW1lLAotCQkJCQlmaWVsZHMsCi0JCQkJCXNjb3BlLAotCQkJCQlmaWVsZHNGb3VuZCwKLQkJCQkJbG9jYWxzRm91bmQsCi0JCQkJCW9ubHlTdGF0aWNGaWVsZHMsCisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKQorCQkJCQl8fCAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0ZJRUxEX1JFRikpIHsKKwkJCQlmaW5kRmllbGRzKHRoaXMuY29tcGxldGlvblRva2VuLAogCQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCWltcGxpY2l0Q2FsbCwKLQkJCQkJY2FuQmVQcmVmaXhlZCwKLQkJCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQkJCXNjb3BlLAorCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQkJZmFsc2UsIC8qbm90IG9ubHkgc3RhdGljICovCisJCQkJCWZpZWxkUmVmLAorCQkJCQlzY29wZSwKKwkJCQkJZmFsc2UsCisJCQkJCXRydWUsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWZhbHNlLAorCQkJCQludWxsLAorCQkJCQktMSwKKwkJCQkJLTEpOwogCQkJfQotCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7Ci0JCX0gd2hpbGUgKG5vdEluSmF2YWRvYyAmJiBjdXJyZW50VHlwZSAhPSBudWxsKTsKIAotCQlpZiAobm90SW5KYXZhZG9jICYmIGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dFBvc2l0aW9uOyBpKyspIHsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07Ci0JCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gYW5JbnRlcmZhY2UuYXZhaWxhYmxlRmllbGRzKCk7Ci0JCQkJaWYoZmllbGRzICE9ICBudWxsKSB7Ci0JCQkJCWZpbmRGaWVsZHMoCi0JCQkJCQlmaWVsZE5hbWUsCi0JCQkJCQlmaWVsZHMsCi0JCQkJCQlzY29wZSwKLQkJCQkJCWZpZWxkc0ZvdW5kLAotCQkJCQkJbG9jYWxzRm91bmQsCi0JCQkJCQlvbmx5U3RhdGljRmllbGRzLAotCQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQlpbXBsaWNpdENhbGwsCi0JCQkJCQljYW5CZVByZWZpeGVkLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7Ci0JCQkJfQotCi0JCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsKLQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewotCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7Ci0JCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQotCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKLQkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07Ci0JCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQotCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOwotCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKKwkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKQorCQkJCQl8fCAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX01FVEhPRF9SRUYpKSB7CisJCQkJZmluZE1ldGhvZHMoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCXNjb3BlLAorCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCWZhbHNlLCAvKm5vdCBvbmx5IHN0YXRpYyAqLworCQkJCQlmYWxzZSwKKwkJCQkJZmllbGRSZWYsCisJCQkJCXNjb3BlLAorCQkJCQlmYWxzZSwKKwkJCQkJZmFsc2UsCisJCQkJCXRydWUsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWZhbHNlLAorCQkJCQludWxsLAorCQkJCQktMSwKKwkJCQkJLTEpOworCQkJCWlmIChmaWVsZFJlZi5hY3R1YWxSZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKWZpZWxkUmVmLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCQkJaWYgKHRoaXMuY29tcGxldGlvblRva2VuID09IG51bGwKKwkJCQkJCQl8fCBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgcmVmQmluZGluZy5zb3VyY2VOYW1lKQorCQkJCQkJCXx8ICh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgcmVmQmluZGluZy5zb3VyY2VOYW1lKSkpIHsKKwkJCQkJCWZpbmRDb25zdHJ1Y3RvcnMocmVmQmluZGluZywgbnVsbCwgc2NvcGUsIGZpZWxkUmVmLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAJfQorCS8vVE9ETworCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQoQVNUTm9kZSBhc3ROb2RlLCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7CisJCUNvbXBsZXRpb25PbkphdmFkb2NNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChDb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQpIGFzdE5vZGU7CisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBudWxsOyAvL2NvbXB1dGVUeXBlcyhtZXNzYWdlU2VuZC5hcmd1bWVudHMpOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IG1lc3NhZ2VTZW5kLnNlbGVjdG9yOworCQl0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA9IG1lc3NhZ2VTZW5kLnRhZ1NvdXJjZVN0YXJ0OwogCi0JcHJvdGVjdGVkIHZvaWQgZmluZEZpZWxkc0FuZE1ldGhvZHMoCi0JCWNoYXJbXSB0b2tlbiwKLQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAotCQlTY29wZSBzY29wZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCVNjb3BlIGludm9jYXRpb25TY29wZSwKLQkJYm9vbGVhbiBpbXBsaWNpdENhbGwsCi0JCWJvb2xlYW4gc3VwZXJDYWxsLAotCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAotCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKSB7Ci0KLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcgZWxzZSBpcyBwb3NzaWJsZSB3aXRoIGJhc2UgdHlwZXMKLQkJCi0JCWJvb2xlYW4gcHJvcG9zZUZpZWxkID0gIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKTsKLQkJYm9vbGVhbiBwcm9wb3NlTWV0aG9kID0gIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCk7Ci0JCQotCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOwotCQkKLQkJaWYgKHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKSB7Ci0JCQlpZiAocHJvcG9zZUZpZWxkCi0JCQkJJiYgdG9rZW4ubGVuZ3RoIDw9IGxlbmd0aEZpZWxkLmxlbmd0aAotCQkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBsZW5ndGhGaWVsZCwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KLQkJCSkpIHsKLQkJCQkKLQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbixsZW5ndGhGaWVsZCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKFR5cGVCaW5kaW5nLklOVCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBsZW5ndGggZmllbGQKLQkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKLQkJCQl9Ci0JCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkpIHsKLQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShyZWNlaXZlclR5cGUpKTsKLQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKElOVF9TSUdOQVRVUkUpOwotCQkJCQkvL3Byb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobnVsbCk7Ci0JCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShudWxsKTsKLQkJCQkJLy9wcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShudWxsKTsKLQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoSU5UKTsKLQkJCQkJcHJvcG9zYWwuc2V0TmFtZShsZW5ndGhGaWVsZCk7Ci0JCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KLQkJCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCi0JCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAotCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKLQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAotCQkJCQkJCQkJCXJlbGV2YW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOwotCQkJCQl9Ci0JCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24obGVuZ3RoRmllbGQpOwotCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOwotCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KKwkJLy8gU2V0IHNvdXJjZSByYW5nZQorCQlpbnQgcmFuZ2VTdGFydCA9IGFzdE5vZGUuc291cmNlU3RhcnQ7CisJCWlmIChtZXNzYWdlU2VuZC5yZWNlaXZlci5pc1RoaXMoKSkgeworCQkJaWYgKG1lc3NhZ2VTZW5kLmNvbXBsZXRlSW5UZXh0KCkpIHsKKwkJCQlyYW5nZVN0YXJ0ID0gbWVzc2FnZVNlbmQuc2VwYXJhdG9yUG9zaXRpb247CiAJCQl9Ci0JCQlpZiAocHJvcG9zZU1ldGhvZAotCQkJCSYmIHRva2VuLmxlbmd0aCA8PSBjbG9uZU1ldGhvZC5sZW5ndGgKLQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgY2xvbmVNZXRob2QsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKQotCQkJKSB7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyBvYmplY3RSZWYgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOwotCQkJCQotCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBjbG9uZU1ldGhvZCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG9iamVjdFJlZik7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JTdGF0aWMoZmFsc2UsIGZhbHNlKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgY2xvbmUoKSBtZXRob2QKLQkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKLQkJCQl9Ci0JCQkJY2hhcltdIGNvbXBsZXRpb247Ci0JCQkJaWYgKHRoaXMuc291cmNlICE9IG51bGwKLQkJCQkJJiYgdGhpcy5zb3VyY2UubGVuZ3RoID4gdGhpcy5lbmRQb3NpdGlvbgotCQkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmVuZFBvc2l0aW9uXSA9PSAnKCcpIHsKLQkJCQkJY29tcGxldGlvbiA9IGNsb25lTWV0aG9kOwotCQkJCQl9IGVsc2UgewotCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY2xvbmVNZXRob2QsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKLQkJCQl9Ci0JCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJaWYgKCF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpKSB7Ci0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOwotCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoCi0JCQkJCQkJdGhpcy5jb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80ICYmIHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpID8KLQkJCQkJCQkJCWNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCi0JCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAotCQkJCQkJCQkJCQlnZXRTaWduYXR1cmUocmVjZWl2ZXJUeXBlKSkgOgotCQkJCQkJCQkJY3JlYXRlTWV0aG9kU2lnbmF0dXJlKAotCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKLQkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCi0JCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChKQVZBX0xBTkcsICcuJyksCi0JCQkJCQkJCQkJCU9CSkVDVCkpOwotCQkJCQkvL3Byb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKG51bGwpOwotCQkJCQkvL3Byb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobnVsbCk7Ci0JCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShudWxsKTsKLQkJCQkJLy9wcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMobnVsbCk7Ci0JCQkJCS8vcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKG51bGwpOwotCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpKTsKLQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoT0JKRUNUKTsKLQkJCQkJcHJvcG9zYWwuc2V0TmFtZShjbG9uZU1ldGhvZCk7Ci0JCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KLQkJCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCi0JCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAotCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKLQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAotCQkJCQkJCQkJCXJlbGV2YW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOwotCQkJCQl9Ci0JCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJCXByb3Bvc2FsLnNldEZsYWdzKEZsYWdzLkFjY1B1YmxpYyk7Ci0JCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1ldGhvZHNGb3VuZC5hZGQobmV3IE9iamVjdFtde29iamVjdFJlZi5nZXRNZXRob2RzKGNsb25lTWV0aG9kKVswXSwgb2JqZWN0UmVmfSk7CisJCX0gZWxzZSBpZiAobWVzc2FnZVNlbmQuY29tcGxldGVJblRleHQoKSkgeworCQkJcmFuZ2VTdGFydCA9IG1lc3NhZ2VTZW5kLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OworCQl9CisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UocmFuZ2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKKworCQlpZiAocXVhbGlmaWVkQmluZGluZyA9PSBudWxsKSB7CisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKKwkJCQlmaW5kSW1wbGljaXRNZXNzYWdlU2VuZHModGhpcy5jb21wbGV0aW9uVG9rZW4sIGFyZ1R5cGVzLCBzY29wZSwgbWVzc2FnZVNlbmQsIHNjb3BlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOwogCQkJfQotCQkJCi0JCQlyZWNlaXZlclR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOwotCQl9Ci0KLQkJaWYocHJvcG9zZUZpZWxkKSB7Ci0JCQlmaW5kRmllbGRzKAotCQkJCXRva2VuLAotCQkJCShSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUsCi0JCQkJc2NvcGUsCi0JCQkJbmV3IE9iamVjdFZlY3RvcigpLAotCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKLQkJCQlmYWxzZSwKLQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJaW1wbGljaXRDYWxsLAotCQkJCWZhbHNlLAotCQkJCW1pc3NpbmdFbGVtZW50cywKLQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOwotCQl9Ci0KLQkJaWYocHJvcG9zZU1ldGhvZCkgeworCQl9IGVsc2UgaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7CiAJCQlmaW5kTWV0aG9kcygKLQkJCQl0b2tlbiwKKwkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKIAkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSwKKwkJCQlhcmdUeXBlcywKKwkJCQkoUmVmZXJlbmNlQmluZGluZykgKChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKS5jYXB0dXJlKHNjb3BlLCBtZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VFbmQpLAogCQkJCXNjb3BlLAotCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQluZXcgT2JqZWN0VmVjdG9yKCksCiAJCQkJZmFsc2UsCisJCQkJZmFsc2UvKiBwcmVmaXggbWF0Y2ggKi8sCisJCQkJbWVzc2FnZVNlbmQsCisJCQkJc2NvcGUsCiAJCQkJZmFsc2UsCisJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgaW5zdGFuY2VvZiBTdXBlclJlZmVyZW5jZSwKKwkJCQl0cnVlLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQludWxsLAogCQkJCWZhbHNlLAotCQkJCWludm9jYXRpb25TaXRlLAotCQkJCWludm9jYXRpb25TY29wZSwKLQkJCQlpbXBsaWNpdENhbGwsCi0JCQkJc3VwZXJDYWxsLAorCQkJCW51bGwsCisJCQkJLTEsCisJCQkJLTEpOworCQl9CisJfQorCS8vVE9ETworCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlKEFTVE5vZGUgYXN0Tm9kZSkgeworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19QQVJBTV9SRUYpKSB7CisJCQlDb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlIHBhcmFtUmVmID0gKENvbXBsZXRpb25PbkphdmFkb2NQYXJhbU5hbWVSZWZlcmVuY2UpIGFzdE5vZGU7CisJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKHBhcmFtUmVmLnRhZ1NvdXJjZVN0YXJ0LCBwYXJhbVJlZi50YWdTb3VyY2VFbmQpOworCQkJZmluZEphdmFkb2NQYXJhbU5hbWVzKHBhcmFtUmVmLnRva2VuLCBwYXJhbVJlZi5taXNzaW5nUGFyYW1zLCBmYWxzZSk7CisJCQlmaW5kSmF2YWRvY1BhcmFtTmFtZXMocGFyYW1SZWYudG9rZW4sIHBhcmFtUmVmLm1pc3NpbmdUeXBlUGFyYW1zLCB0cnVlKTsKKwkJfQorCX0KKwkvL1RPRE8KKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlLCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7CisJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKKworCQlDb21wbGV0aW9uT25KYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKENvbXBsZXRpb25PbkphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBhc3ROb2RlOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHR5cGVSZWYuY29tcGxldGlvbklkZW50aWZpZXI7CisJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gdHlwZVJlZi5zb3VyY2VQb3NpdGlvbnNbdHlwZVJlZi50b2tlbnMubGVuZ3RoXTsKKwkJdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gPSB0eXBlUmVmLnRhZ1NvdXJjZVN0YXJ0OworCisJCS8vIGdldCB0aGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyCisJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyAmJiAhKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKSkgeworCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fAorCQkJCQkoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSkpIHsKKwkJCQlpbnQgcmFuZ2VTdGFydCA9IHR5cGVSZWYuY29tcGxldGVJblRleHQoKSA/IHR5cGVSZWYuc291cmNlU3RhcnQgOiAoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMik7CisJCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZShyYW5nZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJCWZpbmRNZW1iZXJUeXBlcygKKwkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQlzY29wZSwKKwkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAorCQkJCQlmYWxzZSwKKwkJCQkJZmFsc2UsCisJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJZmFsc2UpOworCQkJfQorCQl9IGVsc2UgaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCisJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJaW50IHJhbmdlU3RhcnQgPSB0eXBlUmVmLmNvbXBsZXRlSW5UZXh0KCkgPyB0eXBlUmVmLnNvdXJjZVN0YXJ0IDogKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpOworCQkJc2V0VG9rZW5SYW5nZShyYW5nZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKKwkJCWZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCAoUGFja2FnZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKKwkJfQorCX0KKwkvL1RPRE8KKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlLCBTY29wZSBzY29wZSkgeworCQlDb21wbGV0aW9uT25KYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKENvbXBsZXRpb25PbkphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSBhc3ROb2RlOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHR5cGVSZWYudG9rZW47CisJCXRoaXMuamF2YWRvY1RhZ1Bvc2l0aW9uID0gdHlwZVJlZi50YWdTb3VyY2VTdGFydDsKKwkJc2V0U291cmNlQW5kVG9rZW5SYW5nZSh0eXBlUmVmLnNvdXJjZVN0YXJ0LCB0eXBlUmVmLnNvdXJjZUVuZCk7CisJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKAorCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCXNjb3BlLAorCQkJCSh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLkJBU0VfVFlQRVMpICE9IDAsCiAJCQkJZmFsc2UsCi0JCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAotCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQkJbmV3IE9iamVjdFZlY3RvcigpKTsKKwl9CisJLy9UT0RPCisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PbkphdmFkb2NUYWcoQVNUTm9kZSBhc3ROb2RlKSB7CisJCUNvbXBsZXRpb25PbkphdmFkb2NUYWcgamF2YWRvY1RhZyA9IChDb21wbGV0aW9uT25KYXZhZG9jVGFnKSBhc3ROb2RlOworCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKGphdmFkb2NUYWcudGFnU291cmNlU3RhcnQsIGphdmFkb2NUYWcuc291cmNlRW5kKTsKKwkJZmluZEphdmFkb2NCbG9ja1RhZ3MoamF2YWRvY1RhZyk7CisJCWZpbmRKYXZhZG9jSW5saW5lVGFncyhqYXZhZG9jVGFnKTsKKwl9CisJLy9UT0RPCisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PbkphdmFkb2NUeXBlUGFyYW1SZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlKSB7CisJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1BBUkFNX1JFRikpIHsKKwkJCUNvbXBsZXRpb25PbkphdmFkb2NUeXBlUGFyYW1SZWZlcmVuY2UgcGFyYW1SZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY1R5cGVQYXJhbVJlZmVyZW5jZSkgYXN0Tm9kZTsKKwkJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UocGFyYW1SZWYudGFnU291cmNlU3RhcnQsIHBhcmFtUmVmLnRhZ1NvdXJjZUVuZCk7CisJCQlmaW5kSmF2YWRvY1BhcmFtTmFtZXMocGFyYW1SZWYudG9rZW4sIHBhcmFtUmVmLm1pc3NpbmdQYXJhbXMsIHRydWUpOwogCQl9CiAJfQogCQotCXByaXZhdGUgdm9pZCBmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21GYXZvcml0ZXMoCi0JCQljaGFyW10gdG9rZW4sCi0JCQlTY29wZSBzY29wZSwKLQkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAotCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAotCQkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kLAotCQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAotCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCkgewotCQkKLQkJSW1wb3J0QmluZGluZ1tdIGZhdm9yaXRlQmluZGluZ3MgPSBnZXRGYXZvcml0ZVJlZmVyZW5jZUJpbmRpbmdzKGludm9jYXRpb25TY29wZSk7Ci0JCQotCQlpZiAoZmF2b3JpdGVCaW5kaW5ncyAhPSBudWxsICYmIGZhdm9yaXRlQmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYXZvcml0ZUJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSW1wb3J0QmluZGluZyBmYXZvcml0ZUJpbmRpbmcgPSBmYXZvcml0ZUJpbmRpbmdzW2ldOwotCQkJCXN3aXRjaCAoZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0LmtpbmQoKSkgewotCQkJCQljYXNlIEJpbmRpbmcuRklFTEQ6Ci0JCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0OwotCQkJCQkJZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCi0JCQkJCQkJCXRva2VuLAotCQkJCQkJCQluZXcgRmllbGRCaW5kaW5nW117ZmllbGRCaW5kaW5nfSwKLQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCWZpZWxkc0ZvdW5kLAotCQkJCQkJCQlsb2NhbHNGb3VuZCwKLQkJCQkJCQkJZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAotCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQkJCQkJaW52b2NhdGlvblNjb3BlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEJpbmRpbmcuTUVUSE9EOgotCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpIGZhdm9yaXRlQmluZGluZy5yZXNvbHZlZEltcG9ydDsKLQkJCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5hdmFpbGFibGVNZXRob2RzKCk7Ci0JCQkJCQlsb25nIHJhbmdlOwotCQkJCQkJaWYgKChyYW5nZSA9IFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIG1ldGhvZHMpKSA+PSAwKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgcmFuZ2UsIGVuZCA9IChpbnQpIChyYW5nZSA+PiAzMik7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIHN0YXJ0LCBtZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWV0aG9kcyA9IEJpbmRpbmcuTk9fTUVUSE9EUzsJCQkKLQkJCQkJCX0KLQkJCQkJCWZpbmRMb2NhbE1ldGhvZHNGcm9tRmF2b3JpdGVzKAotCQkJCQkJCQl0b2tlbiwKLQkJCQkJCQkJbWV0aG9kcywKLQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKLQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJCWludm9jYXRpb25TY29wZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBCaW5kaW5nLlRZUEU6Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0OwotCQkJCQkJaWYoZmF2b3JpdGVCaW5kaW5nLm9uRGVtYW5kKSB7Ci0JCQkJCQkJZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCi0JCQkJCQkJCQl0b2tlbiwKLQkJCQkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuYXZhaWxhYmxlRmllbGRzKCksCi0JCQkJCQkJCQlzY29wZSwKLQkJCQkJCQkJCWZpZWxkc0ZvdW5kLAotCQkJCQkJCQkJbG9jYWxzRm91bmQsCi0JCQkJCQkJCQlyZWZlcmVuY2VCaW5kaW5nLAotCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUpOwotCQkJCQkJCQotCQkJCQkJCWZpbmRMb2NhbE1ldGhvZHNGcm9tRmF2b3JpdGVzKAotCQkJCQkJCQkJdG9rZW4sCi0JCQkJCQkJCQlyZWZlcmVuY2VCaW5kaW5nLmF2YWlsYWJsZU1ldGhvZHMoKSwKLQkJCQkJCQkJCXNjb3BlLAotCQkJCQkJCQkJbWV0aG9kc0ZvdW5kLAotCQkJCQkJCQkJcmVmZXJlbmNlQmluZGluZywKLQkJCQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uS2V5d29yZChBU1ROb2RlIGFzdE5vZGUpIHsKKwkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpKSB7CisJCQlDb21wbGV0aW9uT25LZXl3b3JkIGtleXdvcmQgPSAoQ29tcGxldGlvbk9uS2V5d29yZClhc3ROb2RlOworCQkJZmluZEtleXdvcmRzKGtleXdvcmQuZ2V0VG9rZW4oKSwga2V5d29yZC5nZXRQb3NzaWJsZUtleXdvcmRzKCksIGtleXdvcmQuY2FuQ29tcGxldGVFbXB0eVRva2VuKCksIGZhbHNlKTsKIAkJfQogCX0KIAkKLQlwcml2YXRlIHZvaWQgZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ0ZpZWxkVHlwZSgKLQkJY2hhcltdIHRva2VuLAotCQlTY29wZSBzY29wZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCWJvb2xlYW4gaW5zaWRlVHlwZUFubm90YXRpb24pIHsKKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uTG9jYWxPckFyZ3VtZW50TmFtZShBU1ROb2RlIGFzdE5vZGUsIFNjb3BlIHNjb3BlKSB7CisJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5WQVJJQUJMRV9ERUNMQVJBVElPTikpIHsKKwkJCUxvY2FsRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoTG9jYWxEZWNsYXJhdGlvbikgYXN0Tm9kZTsKIAotCQlib29sZWFuIHN0YXRpY3NPbmx5ID0gZmFsc2U7Ci0JCVNjb3BlIGN1cnJlbnRTY29wZSA9IHNjb3BlOwotCi0JCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCi0KLQkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKLQotCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKLQkJCQkJLy8gaGFuZGxlIHRoZSBlcnJvciBjYXNlIGluc2lkZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIChzZWUgTWV0aG9kU2NvcGU+PmZpbmRGaWVsZCkKLQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsKLQkJCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKLQotCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgotCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgY3VycmVudFNjb3BlOwotCQkJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7Ci0JCQkJCWlmKCFpbnNpZGVUeXBlQW5ub3RhdGlvbikgewotCQkJCQkJCi0JCQkJCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmZpZWxkczsKLQkJCQkJCQotCQkJCQkJaW50IGZpZWxkc0NvdW50ID0gZmllbGRzID09IG51bGwgPyAwIDogZmllbGRzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzQ291bnQ7IGkrKykgewotCQkJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGZpZWxkc1tpXTsKLQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGREZWNsYXJhdGlvbi5uYW1lLCB0b2tlbikpIHsKLQkJCQkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uYmluZGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21NaXNzaW5nVHlwZSgKLQkJCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCQkJCWZpZWxkRGVjbGFyYXRpb24udHlwZSwgCi0JCQkJCQkJCQkJCWN1cnJlbnRTY29wZSwgCi0JCQkJCQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJCQkJCQlzY29wZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWsgZG9uZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3RhdGljc09ubHkgfD0gZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpOwotCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgotCQkJCQlicmVhayBkb25lOwotCQkJfQotCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ1JldHVyblR5cGUoCi0JCWNoYXJbXSB0b2tlbiwKLQkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMsCi0JCVNjb3BlIHNjb3BlLAotCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKLQkJYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbikgewotCi0JCWJvb2xlYW4gc3RhdGljc09ubHkgPSBmYWxzZTsKLQkJU2NvcGUgY3VycmVudFNjb3BlID0gc2NvcGU7Ci0KLQkJZG9uZSA6IHdoaWxlICh0cnVlKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKLQotCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgewotCi0JCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgotCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQotCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgY3VycmVudFNjb3BlOwotCQkJCQlzdGF0aWNzT25seSB8PSBtZXRob2RTY29wZS5pc1N0YXRpYyB8IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOwotCi0JCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6Ci0JCQkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBjdXJyZW50U2NvcGU7Ci0JCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKLQkJCQkJaWYoIWluc2lkZVR5cGVBbm5vdGF0aW9uKSB7Ci0JCQkJCQkKLQkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7Ci0JCQkJCQkKLQkJCQkJCWludCBtZXRob2RzQ291bnQgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHNDb3VudDsgaSsrKSB7Ci0JCQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZHNbaV07Ci0JCQkJCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYKLQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yLCB0b2tlbikpIHsKLQkJCQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKLQkJCQkJCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcgPT0gbnVsbCkgewotCQkJCQkJCQkJQXJndW1lbnRbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmFyZ3VtZW50czsKLQkJCQkJCQkJCWludCBwYXJhbWV0ZXJzTGVuZ3RoID0gcGFyYW1ldGVycyA9PSBudWxsID8gMCA6IHBhcmFtZXRlcnMubGVuZ3RoOwotCQkJCQkJCQkJaW50IGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmIChwYXJhbWV0ZXJzTGVuZ3RoID09IDApIHsKLQkJCQkJCQkJCQlpZiAoYXJndW1lbnRzTGVuZ3RoID09IDApIHsKLQkJCQkJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ1R5cGUoCi0JCQkJCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCQkJCQkJbWV0aG9kLnJldHVyblR5cGUsIAotCQkJCQkJCQkJCQkJCWN1cnJlbnRTY29wZSwgCi0JCQkJCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJCQkJCQkJc2NvcGUpOwotCQkJCQkJCQkJCQlicmVhayBkb25lOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzQmluZGluZ3MgPSBuZXcgVHlwZUJpbmRpbmdbcGFyYW1ldGVyc0xlbmd0aF07Ci0JCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJzTGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCQkJcGFyYW1ldGVyc0JpbmRpbmdzW2pdID0gcGFyYW1ldGVyc1tqXS50eXBlLnJlc29sdmVkVHlwZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYoYXJlUGFyYW1ldGVyc0NvbXBhdGlibGVXaXRoKHBhcmFtZXRlcnNCaW5kaW5ncywgYXJndW1lbnRzLCBwYXJhbWV0ZXJzW3BhcmFtZXRlcnNMZW5ndGggLSAxXS5pc1ZhckFyZ3MoKSkpIHsKLQkJCQkJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ1R5cGUoCi0JCQkJCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCQkJCQkJbWV0aG9kLnJldHVyblR5cGUsIAotCQkJCQkJCQkJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQkJCQkJCQkJCQlzY29wZSk7Ci0JCQkJCQkJCQkJCWJyZWFrIGRvbmU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7Ci0JCQkJCWluc2lkZVR5cGVBbm5vdGF0aW9uID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6Ci0JCQkJCWJyZWFrIGRvbmU7Ci0JCQl9Ci0JCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdUeXBlKAotCQkJZmluYWwgY2hhcltdIHRva2VuLAotCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmLAotCQkJZmluYWwgU2NvcGUgc2NvcGUsIAotCQkJZmluYWwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCQlmaW5hbCBTY29wZSBpbnZvY2F0aW9uU2NvcGUpIHsKLQkJTWlzc2luZ1R5cGVzR3Vlc3NlciBtaXNzaW5nVHlwZXNDb252ZXJ0ZXIgPSBuZXcgTWlzc2luZ1R5cGVzR3Vlc3Nlcih0aGlzKTsKLQkJTWlzc2luZ1R5cGVzR3Vlc3Nlci5HdWVzc2VkVHlwZVJlcXVlc3RvciBzdWJzdGl0dXRpb25SZXF1ZXN0b3IgPQotCQkJbmV3IE1pc3NpbmdUeXBlc0d1ZXNzZXIuR3Vlc3NlZFR5cGVSZXF1ZXN0b3IoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWNjZXB0KAotCQkJCQkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUsCi0JCQkJCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAotCQkJCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAotCQkJCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJCQkJCWJvb2xlYW4gaGFzUHJvYmxlbXMpIHsKLQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHMoCi0JCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMuY29tcGxldGlvblRva2VuLAotCQkJCQkJZ3Vlc3NlZFR5cGUsCi0JCQkJCQlzY29wZSwKLQkJCQkJCWludm9jYXRpb25TaXRlLCAKLQkJCQkJCWludm9jYXRpb25TY29wZSwgCi0JCQkJCQlmYWxzZSwKLQkJCQkJCWZhbHNlLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJCQkJCWhhc1Byb2JsZW1zKTsKLQkJCQkJCi0JCQkJfQotCQkJfTsKLQkJbWlzc2luZ1R5cGVzQ29udmVydGVyLmd1ZXNzKHR5cGVSZWYsIHNjb3BlLCBzdWJzdGl0dXRpb25SZXF1ZXN0b3IpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCi0JCQljaGFyW10gZmllbGROYW1lLAotCQkJRmllbGRCaW5kaW5nW10gZmllbGRzLAotCQkJU2NvcGUgc2NvcGUsCi0JCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQsCi0JCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQsCi0JCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAotCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlKSB7Ci0JCQotCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocmVjZWl2ZXJUeXBlLmNvbXBvdW5kTmFtZSwgJy4nKTsKLQotCQlpbnQgZmllbGRMZW5ndGggPSBmaWVsZE5hbWUubGVuZ3RoOwotCQluZXh0IDogZm9yIChpbnQgZiA9IGZpZWxkcy5sZW5ndGg7IC0tZiA+PSAwOykgewkJCQotCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOwotCi0JCQlpZiAoZmllbGQuaXNTeW50aGV0aWMoKSkJY29udGludWUgbmV4dDsKLQkJCQotCQkJLy8gb25seSBzdGF0aWMgZmllbGRzIG11c3QgYmUgcHJvcG9zZWQKLQkJCWlmICghZmllbGQuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKLQotCQkJaWYgKGZpZWxkTGVuZ3RoID4gZmllbGQubmFtZS5sZW5ndGgpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoZmllbGROYW1lLCBmaWVsZC5uYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykKLQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChmaWVsZE5hbWUsIGZpZWxkLm5hbWUpKSkJY29udGludWUgbmV4dDsKLQotCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCi0JCQkJCWZpZWxkLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQoZmllbGQuZGVjbGFyaW5nQ2xhc3MpKQotCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkKLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5Ci0JCQkJJiYgIWZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkJY29udGludWUgbmV4dDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IGZpZWxkc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgewotCQkJCU9iamVjdFtdIG90aGVyID0gKE9iamVjdFtdKWZpZWxkc0ZvdW5kLmVsZW1lbnRBdChpKTsKLQkJCQlGaWVsZEJpbmRpbmcgb3RoZXJGaWVsZCA9IChGaWVsZEJpbmRpbmcpIG90aGVyWzBdOwotCQkJCQotCQkJCWlmIChmaWVsZCA9PSBvdGhlckZpZWxkKSBjb250aW51ZSBuZXh0OwotCQkJfQotCQkJCi0JCQlmaWVsZHNGb3VuZC5hZGQobmV3IE9iamVjdFtde2ZpZWxkLCByZWNlaXZlclR5cGV9KTsKLQkJCQotCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChmaWVsZCk7Ci0JCQlpZiAoZmllbGROYW1lICE9IG51bGwpIHJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGZpZWxkTmFtZSwgZmllbGQubmFtZSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoZmllbGQudHlwZSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclN0YXRpYyh0cnVlLCB0cnVlKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0JCQkKLQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGN1ID0gdGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCWludCBpbXBvcnRTdGFydCA9IGN1LnR5cGVzWzBdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7Ci0JCQlpbnQgaW1wb3J0RW5kID0gaW1wb3J0U3RhcnQ7Ci0JCQkKLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJCi0JCQlpZiAodGhpcy5jb21waWxlck9wdGlvbnMuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSB8fAotCQkJCQkhdGhpcy5vcHRpb25zLnN1Z2dlc3RTdGF0aWNJbXBvcnQpIHsKLQkJCQlpZiAoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX0lNUE9SVCkpIHsKLQkJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZWNlaXZlclR5cGUuc291cmNlTmFtZSwgZmllbGQubmFtZSwgJy4nKTsKLQkJCQkJCi0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC50eXBlKSk7Ci0JCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQkJcHJvcG9zYWwuc2V0TmFtZShmaWVsZC5uYW1lKTsKLQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoZmllbGQubW9kaWZpZXJzKTsKLQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJCi0JCQkJCWNoYXJbXSB0eXBlSW1wb3J0Q29tcGxldGlvbiA9IGNyZWF0ZUltcG9ydENoYXJBcnJheSh0eXBlTmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCB0eXBlSW1wb3J0UHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX0lNUE9SVCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7Ci0JCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gcmVjZWl2ZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7Ci0JCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7Ci0JCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOwotCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0VHlwZU5hbWUocmVjZWl2ZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVJbXBvcnRDb21wbGV0aW9uKTsKLQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldEZsYWdzKHJlY2VpdmVyVHlwZS5tb2RpZmllcnMpOwotCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0QWRkaXRpb25hbEZsYWdzKENvbXBsZXRpb25GbGFncy5EZWZhdWx0KTsKLQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7Ci0JCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJCi0JCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlSW1wb3J0UHJvcG9zYWx9KTsKLQkJCQkJCi0JCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQorCQkJaW50IGtpbmQ7CisJCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Mb2NhbE5hbWUpeworCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gKChDb21wbGV0aW9uT25Mb2NhbE5hbWUpIHZhcmlhYmxlKS5yZWFsTmFtZTsKKwkJCQlraW5kID0gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5WS19MT0NBTDsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKCF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfSU1QT1JUKSkgewotCQkJCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkLm5hbWU7Ci0JCQkJCQotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKSk7Ci0JCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOwotCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsgCi0JCQkJCXByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7Ci0JCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7Ci0JCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQotCQkJCQljaGFyW10gZmllbGRJbXBvcnRDb21wbGV0aW9uID0gY3JlYXRlSW1wb3J0Q2hhckFycmF5KENoYXJPcGVyYXRpb24uY29uY2F0KHR5cGVOYW1lLCBmaWVsZC5uYW1lLCAnLicpLCB0cnVlLCBmYWxzZSk7CisJCQkJQ29tcGxldGlvbk9uQXJndW1lbnROYW1lIGFyZyA9IChDb21wbGV0aW9uT25Bcmd1bWVudE5hbWUpIHZhcmlhYmxlOworCQkJCXRoaXMuY29tcGxldGlvblRva2VuID0gYXJnLnJlYWxOYW1lOworCQkJCWtpbmQgPSBhcmcuaXNDYXRjaEFyZ3VtZW50ID8gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5WS19MT0NBTCA6IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuVktfUEFSQU1FVEVSOworCQkJfQogCi0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBmaWVsZEltcG9ydFByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfSU1QT1JULCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKSk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC50eXBlKSk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJZmllbGRJbXBvcnRQcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJZmllbGRJbXBvcnRQcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7IAotCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0Q29tcGxldGlvbihmaWVsZEltcG9ydENvbXBsZXRpb24pOwotCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0QWRkaXRpb25hbEZsYWdzKENvbXBsZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpOwotCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7Ci0JCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQotCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhuZXcgQ29tcGxldGlvblByb3Bvc2FsW117ZmllbGRJbXBvcnRQcm9wb3NhbH0pOwotCQkJCQkKLQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCX0KKwkJCWNoYXJbXVtdIGFscmVhZHlEZWZpbmVkTmFtZSA9IGNvbXB1dGVBbHJlYWR5RGVmaW5lZE5hbWUoKEJsb2NrU2NvcGUpc2NvcGUsIHZhcmlhYmxlKTsKKworCQkJY2hhcltdW10gZm9yYmlkZGVuTmFtZXMgPSBmaW5kVmFyaWFibGVGcm9tVW5yZXNvbHZlZFJlZmVyZW5jZSh2YXJpYWJsZSwgKEJsb2NrU2NvcGUpc2NvcGUsIGFscmVhZHlEZWZpbmVkTmFtZSk7CisKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nW10gbG9jYWxzID0gKChCbG9ja1Njb3BlKXNjb3BlKS5sb2NhbHM7CisJCQljaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzID0gbmV3IGNoYXJbbG9jYWxzLmxlbmd0aF1bXTsKKwkJCWludCBsb2NhbENvdW50ID0gMDsKKwkJCWZvcihpbnQgaSA9IDAgOyBpIDwgbG9jYWxzLmxlbmd0aCA7IGkrKyl7CisJCQkJaWYgKGxvY2Fsc1tpXSAhPSBudWxsKSB7CisJCQkJCWRpc2NvdXJhZ2VkTmFtZXNbbG9jYWxDb3VudCsrXSA9IGxvY2Fsc1tpXS5uYW1lOwogCQkJCX0KIAkJCX0KKworCQkJU3lzdGVtLmFycmF5Y29weShkaXNjb3VyYWdlZE5hbWVzLCAwLCBkaXNjb3VyYWdlZE5hbWVzID0gbmV3IGNoYXJbbG9jYWxDb3VudF1bXSwgMCwgbG9jYWxDb3VudCk7CisKKwkJCWZpbmRWYXJpYWJsZU5hbWVzKHRoaXMuY29tcGxldGlvblRva2VuLCB2YXJpYWJsZS50eXBlLCBkaXNjb3VyYWdlZE5hbWVzLCBmb3JiaWRkZW5OYW1lcywga2luZCk7CiAJCX0KIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzKENvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIGJvb2xlYW4gZmluZE1lbWJlcnMpIHsKLQkJY2hhcltdW10gdG9rZW5zID0gaW1wb3J0UmVmZXJlbmNlLnRva2VuczsKLQkJCQotCQljaGFyW10gaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJyk7Ci0JCQotCQlpZiAoaW1wb3J0TmFtZS5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJCQotCQljaGFyW10gbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTsKLQkJaWYobGFzdFRva2VuICE9IG51bGwgJiYgbGFzdFRva2VuLmxlbmd0aCA9PSAwKQotCQkJaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGltcG9ydE5hbWUsIG5ldyBjaGFyW117Jy4nfSk7CisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lKEFTVE5vZGUgYXN0Tm9kZSwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQlDb21wbGV0aW9uT25NYXJrZXJBbm5vdGF0aW9uTmFtZSBhbm5vdCA9IChDb21wbGV0aW9uT25NYXJrZXJBbm5vdGF0aW9uTmFtZSkgYXN0Tm9kZTsKIAotCQl0aGlzLnJlc29sdmluZ0ltcG9ydHMgPSB0cnVlOwotCQl0aGlzLnJlc29sdmluZ1N0YXRpY0ltcG9ydHMgPSBpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKTsKLQkJCQotCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9ICBpbXBvcnROYW1lOwotCQkvLyB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIC4qOwotCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKLQkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyhpbXBvcnROYW1lLCB0aGlzKTsKLQkJfQotCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKLQkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlcygKLQkJCQkJaW1wb3J0TmFtZSwKLQkJCQkJZmluZE1lbWJlcnMsIAotCQkJCQl0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2gsCi0JCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsCi0JCQkJCXRoaXMpOwotCQkJYWNjZXB0VHlwZXMobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzT2ZNZW1iZXJUeXBlcyhjaGFyW10gdHlwZU5hbWUsCVJlZmVyZW5jZUJpbmRpbmcgcmVmLCBib29sZWFuIG9ubHlTdGF0aWMpIHsKLQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gcmVmLm1lbWJlclR5cGVzKCk7Ci0JCQotCQlpbnQgdHlwZUxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKLQkJbmV4dCA6IGZvciAoaW50IG0gPSBtZW1iZXJUeXBlcy5sZW5ndGg7IC0tbSA+PSAwOykgewotCQkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbbV07Ci0JCQkvLwkJaWYgKCF3YW50Q2xhc3NlcyAmJiBtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgY29udGludWUgbmV4dDsKLQkJCS8vCQlpZiAoIXdhbnRJbnRlcmZhY2VzICYmIG1lbWJlclR5cGUuaXNJbnRlcmZhY2UoKSkgY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKG9ubHlTdGF0aWMgJiYgIW1lbWJlclR5cGUuaXNTdGF0aWMoKSkKLQkJCQljb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodHlwZUxlbmd0aCA+IG1lbWJlclR5cGUuc291cmNlTmFtZS5sZW5ndGgpCi0JCQkJY29udGludWUgbmV4dDsKLQotCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0eXBlTmFtZSwgbWVtYmVyVHlwZS5zb3VyY2VOYW1lLCBmYWxzZS8qIGlnbm9yZSBjYXNlICovKQotCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUpKSkKLQkJCQljb250aW51ZSBuZXh0OwotCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYgbWVtYmVyVHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCSYmICFtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkKLQkJCQljb250aW51ZSBuZXh0OwotCQkJCi0JCQljaGFyW10gY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKLQkJCQkJbWVtYmVyVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAotCQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKLQkJCQkJJy4nKTsKLQkJCQotCQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgU0VNSUNPTE9OKTsKLQkJCQotCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOwotCi0JCQlpZiAobWVtYmVyVHlwZS5pc0NsYXNzKCkpIHsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7Ci0JCQl9IGVsc2UgaWYobWVtYmVyVHlwZS5pc0VudW0oKSkgewotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bSgpOwotCQkJfSBlbHNlIGlmIChtZW1iZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQlDb21wbGV0aW9uT25Bbm5vdGF0aW9uT2ZUeXBlIGZha2VUeXBlID0gKENvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUpc2NvcGUucGFyZW50LnJlZmVyZW5jZUNvbnRleHQoKTsKKwkJaWYgKGZha2VUeXBlLmFubm90YXRpb25zWzBdID09IGFubm90KSB7CisJCQkvLyBXaGVuIHRoZSBjb21wbGV0aW9uIGlzIGluc2lkZSBhIG1ldGhvZCBib2R5IHRoZSBhbm5vdGF0aW9uIGNhbm5vdCBiZSBhY2N1cmF0bHkgYXR0YWNoZWQgdG8gdGhlIGNvcnJlY3Qgbm9kZSBieSBjb21wbGV0aW9uIHJlY292ZXJ5LgorCQkJLy8gU28gJ3RhcmdldGVkRWxlbWVudCcgaXMgbm90IGNvbXB1dGVkIGluIHRoaXMgY2FzZS4KKwkJCWlmIChzY29wZS5wYXJlbnQucGFyZW50ID09IG51bGwgfHwgIShzY29wZS5wYXJlbnQucGFyZW50IGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpKSB7CisJCQkJdGhpcy50YXJnZXRlZEVsZW1lbnQgPSBjb21wdXRlVGFyZ2V0ZWRFbGVtZW50KGZha2VUeXBlKTsKIAkJCX0KLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJY3JlYXRlVHlwZVByb3Bvc2FsKG1lbWJlclR5cGUsIG1lbWJlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsIGNvbXBsZXRpb25OYW1lLCByZWxldmFuY2UpOwotCQkJfQorCiAJCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzT2ZTdGF0aWNGaWVsZHMoY2hhcltdIGZpZWxkTmFtZSwgUmVmZXJlbmNlQmluZGluZyByZWYpIHsKLQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gcmVmLmZpZWxkcygpOwotCQkKLQkJaW50IGZpZWxkTGVuZ3RoID0gZmllbGROYW1lLmxlbmd0aDsKLQkJbmV4dCA6IGZvciAoaW50IG0gPSBmaWVsZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsKLQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1ttXTsKIAotCQkJaWYgKGZpZWxkTGVuZ3RoID4gZmllbGQubmFtZS5sZW5ndGgpCi0JCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKGZpZWxkLmlzU3ludGhldGljKCkpCi0JCQkJY29udGludWUgbmV4dDsKKwkJdGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uID0gdHJ1ZTsKKwkJaWYgKGFubm90LnR5cGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQlDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGUgPSAoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgYW5ub3QudHlwZTsKKwkJCXRoaXMuY29tcGxldGlvblRva2VuID0gdHlwZS50b2tlbjsKKwkJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UodHlwZS5zb3VyY2VTdGFydCwgdHlwZS5zb3VyY2VFbmQpOwogCi0JCQlpZiAoIWZpZWxkLmlzU3RhdGljKCkpCi0JCQkJY29udGludWUgbmV4dDsKKwkJCWlmIChzY29wZS5wYXJlbnQucGFyZW50ICE9IG51bGwgJiYKKwkJCQkJIShzY29wZS5wYXJlbnQucGFyZW50IGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpICYmCisJCQkJCSFmYWtlVHlwZS5pc1BhcmFtZXRlcikgewogCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UvKiBpZ25vcmUgY2FzZSAqLykKLQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKGZpZWxkTmFtZSwgZmllbGQubmFtZSkpKQotCQkJCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJiBmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCSYmICFmaWVsZC5jYW5CZVNlZW5CeSh0aGlzLnVuaXRTY29wZS5mUGFja2FnZSkpCi0JCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZmllbGQubmFtZSwgU0VNSUNPTE9OKTsKLQkJCQotCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoZmllbGROYW1lLCBmaWVsZC5uYW1lKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7Ci0KLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKSkgewotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOyAKLQkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOwotCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzT2ZTdGF0aWNNZXRob2RzKGNoYXJbXSBtZXRob2ROYW1lLCBSZWZlcmVuY2VCaW5kaW5nIHJlZikgewotCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHJlZi5tZXRob2RzKCk7Ci0JCQotCQlpbnQgbWV0aG9kTGVuZ3RoID0gbWV0aG9kTmFtZS5sZW5ndGg7Ci0JCW5leHQgOiBmb3IgKGludCBtID0gbWV0aG9kcy5sZW5ndGg7IC0tbSA+PSAwOykgewotCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOwotCi0JCQlpZiAobWV0aG9kLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmIChtZXRob2QuaXNEZWZhdWx0QWJzdHJhY3QoKSkJY29udGludWUgbmV4dDsKLQotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICghbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJiBtZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkgY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKLQkJCQkmJiAhbWV0aG9kLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKG1ldGhvZExlbmd0aCA+IG1ldGhvZC5zZWxlY3Rvci5sZW5ndGgpCi0JCQkJY29udGludWUgbmV4dDsKLQotCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKSkpCi0JCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJaW50IGxlbmd0aCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKLQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2Qub3JpZ2luYWwoKS5wYXJhbWV0ZXJzW2ldOwotCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKLQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKLQkJCX0KLQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOwotCi0JCQkKLQkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKLQkJCQkJJy4nLAotCQkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLAotCQkJCQknLicsCi0JCQkJCW1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkKLQkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY29tcGxldGlvbk5hbWUsIFNFTUlDT0xPTik7Ci0JCQkKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOwotCi0JCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9OQU1FX1JFRkVSRU5DRSkpIHsKLQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfTkFNRV9SRUZFUkVOQ0UsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7Ci0JCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKLQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOwotCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOwotCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOwotCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1ldGhvZC5tb2RpZmllcnMpOwotCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogRmluZCBqYXZhZG9jIGJsb2NrIHRhZ3MgZm9yIGEgZ2l2ZW4gY29tcGxldGlvbiBqYXZhZG9jIHRhZyBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbmRKYXZhZG9jQmxvY2tUYWdzKENvbXBsZXRpb25PbkphdmFkb2NUYWcgamF2YWRvY1RhZykgewotCQljaGFyW11bXSBwb3NzaWJsZVRhZ3MgPSBqYXZhZG9jVGFnLmdldFBvc3NpYmxlQmxvY2tUYWdzKCk7Ci0JCWlmIChwb3NzaWJsZVRhZ3MgPT0gbnVsbCkgcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gcG9zc2libGVUYWdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBrZXl3b3JzCi0JCQkKLQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwotCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfQkxPQ0tfVEFHKSkgewotCQkJCWNoYXJbXSBwb3NzaWJsZVRhZyA9IHBvc3NpYmxlVGFnc1tpXTsKLQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0JMT0NLX1RBRywgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldE5hbWUocG9zc2libGVUYWcpOwotCQkJCWludCB0YWdMZW5ndGggPSBwb3NzaWJsZVRhZy5sZW5ndGg7Ci0JCQkJY2hhcltdIGNvbXBsZXRpb24gPSBuZXcgY2hhclsxK3RhZ0xlbmd0aF07Ci0JCQkJY29tcGxldGlvblswXSA9ICdAJzsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3NpYmxlVGFnLCAwLCBjb21wbGV0aW9uLCAxLCB0YWdMZW5ndGgpOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBGaW5kIGphdmFkb2MgaW5saW5lIHRhZ3MgZm9yIGEgZ2l2ZW4gY29tcGxldGlvbiBqYXZhZG9jIHRhZyBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbmRKYXZhZG9jSW5saW5lVGFncyhDb21wbGV0aW9uT25KYXZhZG9jVGFnIGphdmFkb2NUYWcpIHsKLQkJY2hhcltdW10gcG9zc2libGVUYWdzID0gamF2YWRvY1RhZy5nZXRQb3NzaWJsZUlubGluZVRhZ3MoKTsKLQkJaWYgKHBvc3NpYmxlVGFncyA9PSBudWxsKSByZXR1cm47Ci0JCWludCBsZW5ndGggPSBwb3NzaWJsZVRhZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcnMKLQkJCQotCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19JTkxJTkVfVEFHKSkgewotCQkJCWNoYXJbXSBwb3NzaWJsZVRhZyA9IHBvc3NpYmxlVGFnc1tpXTsKLQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0lOTElORV9UQUcsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQlwcm9wb3NhbC5zZXROYW1lKHBvc3NpYmxlVGFnKTsKLQkJCQlpbnQgdGFnTGVuZ3RoID0gcG9zc2libGVUYWcubGVuZ3RoOwotLy8JCQkJYm9vbGVhbiBpbmxpbmVUYWdTdGFydGVkID0gamF2YWRvY1RhZy5jb21wbGV0ZUlubGluZVRhZ1N0YXJ0ZWQoKTsKLQkJCQljaGFyW10gY29tcGxldGlvbiA9IG5ldyBjaGFyWzIrdGFnTGVuZ3RoKzFdOwotCQkJCWNvbXBsZXRpb25bMF0gPSAneyc7Ci0JCQkJY29tcGxldGlvblsxXSA9ICdAJzsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3NpYmxlVGFnLCAwLCBjb21wbGV0aW9uLCAyLCB0YWdMZW5ndGgpOwotCQkJCS8vIGRvIG5vdCBhZGQgc3BhY2UgYXQgZW5kIG9mIGlubGluZSB0YWcgKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTAyNikKLQkJCQkvL2NvbXBsZXRpb25bdGFnTGVuZ3RoKzJdID0gJyAnOwotCQkJCWNvbXBsZXRpb25bdGFnTGVuZ3RoKzJdID0gJ30nOwotCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gd2hhdCBhYm91dCBvbkRlbWFuZCB0eXBlcz8gSWdub3JlIHRoZW0gc2luY2UgaXQgZG9lcyBub3QgaGFwcGVuIQotCS8vIGltcG9ydCBwMS5wMi5BLio7Ci0JcHJpdmF0ZSB2b2lkIGZpbmRLZXl3b3JkcyhjaGFyW10ga2V5d29yZCwgY2hhcltdW10gY2hvaWNlcywgYm9vbGVhbiBjYW5Db21wbGV0ZUVtcHR5VG9rZW4sIGJvb2xlYW4gc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSkgewotCQlpZihjaG9pY2VzID09IG51bGwgfHwgY2hvaWNlcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJaW50IGxlbmd0aCA9IGtleXdvcmQubGVuZ3RoOwotCQlpZiAoY2FuQ29tcGxldGVFbXB0eVRva2VuIHx8IGxlbmd0aCA+IDApCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGxlbmd0aCA8PSBjaG9pY2VzW2ldLmxlbmd0aAotCQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhrZXl3b3JkLCBjaG9pY2VzW2ldLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLworCQkJCWlmICh0aGlzLmNvbXBsZXRpb25Ub2tlbi5sZW5ndGggPD0gS2V5d29yZHMuSU5URVJGQUNFLmxlbmd0aAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgS2V5d29yZHMuSU5URVJGQUNFLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLwogCQkJCSkpewogCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKIAkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CiAJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhrZXl3b3JkLCBjaG9pY2VzW2ldKTsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBrZXl3b3JzCi0JCQkJCWlmIChzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5ICYmIHRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSByZWxldmFuY2UgKz0gUl9OT05fSU5IRVJJVEVEOwotCQkJCQkKLQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2hvaWNlc1tpXSwgS2V5d29yZHMuVFJVRSkgfHwgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2hvaWNlc1tpXSwgS2V5d29yZHMuRkFMU0UpKSB7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTik7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwotCQkJCQl9CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRoaXMuY29tcGxldGlvblRva2VuLCBLZXl3b3Jkcy5JTlRFUkZBQ0UpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcmRzCisJCQkJCXJlbGV2YW5jZSArPSBSX0FOTk9UQVRJT047IC8vIHRoaXMgcHJvcG9zYWwgaXMgbW9zdCByZWxldmFudCB0aGFuIGFubm90YXRpb24gcHJvcG9zYWxzCisKIAkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpKSB7Ci0JCQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JELCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCQlwcm9wb3NhbC5zZXROYW1lKGNob2ljZXNbaV0pOwotCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjaG9pY2VzW2ldKTsKKwkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JELCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKEtleXdvcmRzLklOVEVSRkFDRSk7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKEtleXdvcmRzLklOVEVSRkFDRSk7CiAJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOwogCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CiAJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwogCQkJCQkJaWYoREVCVUcpIHsKQEAgLTQxNTUsMzU2NyArMjQ3Niw4MDUgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGZpbmRUcnVlT3JGYWxzZUtleXdvcmRzKGNoYXJbXVtdIGNob2ljZXMpIHsKLQkJaWYoY2hvaWNlcyA9PSBudWxsIHx8IGNob2ljZXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCWlmKHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciAhPSAwIHx8IHRoaXMuZXhwZWN0ZWRUeXBlc1swXSAhPSBUeXBlQmluZGluZy5CT09MRUFOKSByZXR1cm47Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjaG9pY2VzW2ldLCBLZXl3b3Jkcy5UUlVFKSB8fAotCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhjaG9pY2VzW2ldLCBLZXl3b3Jkcy5GQUxTRSkKLQkJCSl7Ci0JCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSLCBjaG9pY2VzW2ldKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcnMKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTik7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKLQkJCQlyZWxldmFuY2UgKz0gUl9UUlVFX09SX0ZBTFNFOworCQkJfQogCi0JCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKLQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQlwcm9wb3NhbC5zZXROYW1lKGNob2ljZXNbaV0pOwotCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNob2ljZXNbaV0pOwotCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KKwkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZSwgZmFsc2UsIGZhbHNlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOworCQl9IGVsc2UgaWYgKGFubm90LnR5cGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7CisKKwkJCUNvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UgdHlwZSA9IChDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBhbm5vdC50eXBlOworCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSB0eXBlLmNvbXBsZXRpb25JZGVudGlmaWVyOworCQkJbG9uZyBjb21wbGV0aW9uUG9zaXRpb24gPSB0eXBlLnNvdXJjZVBvc2l0aW9uc1t0eXBlLnRva2Vucy5sZW5ndGhdOworCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCisJCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlzZXRUb2tlblJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkvLyByZXBsYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgorCQkJCWZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCAoUGFja2FnZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKKwkJCX0gZWxzZSB7CisJCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisKKwkJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKKwkJCQkJc2NvcGUsCisJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJZmFsc2UsCisJCQkJCWZhbHNlLAorCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWZhbHNlKTsKIAkJCX0KIAkJfQogCX0KIAkKLQlwcml2YXRlIHZvaWQgZmluZEtleXdvcmRzRm9yTWVtYmVyKGNoYXJbXSB0b2tlbiwgaW50IG1vZGlmaWVycykgewotCQljaGFyW11bXSBrZXl3b3JkcyA9IG5ldyBjaGFyW0tleXdvcmRzLkNPVU5UXVtdOwotCQlpbnQgY291bnQgPSAwOwotCQkJCQotCQkvLyB2aXNpYmlsaXR5Ci0JCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgPT0gMAotCQkJJiYgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQpID09IDAKLQkJCSYmIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSA9PSAwKSB7Ci0JCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlBST1RFQ1RFRDsKLQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFVCTElDOwotCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMCkgewotCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFJJVkFURTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMCkgewotCQkJLy8gYWJ0cmFjdAotCQkJaWYoKG1vZGlmaWVycyAmIH4oRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NWaXNpYmlsaXR5TUFTSyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpKSA9PSAwKSB7Ci0JCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5BQlNUUkFDVDsKLQkJCX0KLQkJCQotCQkJLy8gZmluYWwKLQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDApIHsKLQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkZJTkFMOwotCQkJfQotCQkJCi0JCQkvLyBzdGF0aWMKLQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSA9PSAwKSB7Ci0JCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5TVEFUSUM7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gY2FuQmVGaWVsZCA9IHRydWU7Ci0JCQlib29sZWFuIGNhbkJlTWV0aG9kID0gdHJ1ZTsKLQkJCWJvb2xlYW4gY2FuQmVUeXBlID0gdHJ1ZTsKLQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlKSAhPSAwCi0JCQkJfHwgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCkgIT0gMAotCQkJCXx8IChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3luY2hyb25pemVkKSAhPSAwKSB7Ci0JCQkJY2FuQmVGaWVsZCA9IGZhbHNlOwotCQkJCWNhbkJlVHlwZSA9IGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1RyYW5zaWVudCkgIT0gMAotCQkJCXx8IChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVm9sYXRpbGUpICE9IDApIHsKLQkJCQljYW5CZU1ldGhvZCA9IGZhbHNlOwotCQkJCWNhbkJlVHlwZSA9IGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZihjYW5CZUZpZWxkKSB7Ci0JCQkJLy8gdHJhbnNpZW50Ci0JCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NUcmFuc2llbnQpID09IDApIHsKLQkJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5UUkFOU0lFTlQ7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHZvbGF0aWxlCi0JCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NWb2xhdGlsZSkgPT0gMCkgewotCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlZPTEFUSUxFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoY2FuQmVNZXRob2QpIHsKLQkJCQkvLyBuYXRpdmUKLQkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSkgPT0gMCkgewotCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLk5BVElWRTsKLQkJCQl9Ci0JCi0JCQkJLy8gc3RyaWN0ZnAKLQkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKSA9PSAwKSB7Ci0JCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuU1RSSUNURlA7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHN5bmNocm9uaXplZAotCQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3luY2hyb25pemVkKSA9PSAwKSB7Ci0JCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuU1lOQ0hST05JWkVEOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoY2FuQmVUeXBlKSB7Ci0JCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5DTEFTUzsKLQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLklOVEVSRkFDRTsKKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKEFTVE5vZGUgYXN0Tm9kZSwgQVNUTm9kZSBlbmNsb3NpbmdOb2RlLCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsCisJCQlTY29wZSBzY29wZSwgYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbikgeworCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7CisJCUNvbXBsZXRpb25Pbk1lbWJlckFjY2VzcyBhY2Nlc3MgPSAoQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSBhc3ROb2RlOworCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IGFjY2Vzcy5uYW1lU291cmNlUG9zaXRpb247CisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCisJCXRoaXMuY29tcGxldGlvblRva2VuID0gYWNjZXNzLnRva2VuOworCisJCWlmIChxdWFsaWZpZWRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSB7CisJCQkvLyBjb21wbGV0ZSBtZXRob2QgbWVtYmVycyB3aXRoIG1pc3NpbmcgcmV0dXJuIHR5cGUKKwkJCS8vIGNsYXNzIFggeworCQkJLy8gICBNaXNzaW5nIGYoKSB7cmV0dXJuIG51bGw7fQorCQkJLy8gICB2b2lkIGZvbygpIHsKKwkJCS8vICAgICBmKCkufAorCQkJLy8gICB9CisJCQkvLyB9CisJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDAgJiYKKwkJCQkJKHRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8CisJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgeworCQkJCVByb2JsZW1NZXRob2RCaW5kaW5nIHByb2JsZW1NZXRob2RCaW5kaW5nID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOworCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdSZXR1cm5UeXBlKAorCQkJCQkJcHJvYmxlbU1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsCisJCQkJCQlwcm9ibGVtTWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAorCQkJCQkJc2NvcGUsCisJCQkJCQlhY2Nlc3MsCisJCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbik7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQkvLyBjbGFzcwotCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5DTEFTUzsKLQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuSU5URVJGQUNFOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoa2V5d29yZHMsIDAsIGtleXdvcmRzID0gbmV3IGNoYXJbY291bnRdW10sIDAsIGNvdW50KTsKLQkJCi0JCWZpbmRLZXl3b3Jkcyh0b2tlbiwga2V5d29yZHMsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1lbWJlclR5cGVzKGNoYXJbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUpCi0JcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygKLQkJY2hhcltdIHR5cGVOYW1lLAotCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMsCi0JCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kLAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsCi0JCWJvb2xlYW4gc3RhdGljT25seSwKLQkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAotCQlib29sZWFuIGZyb21TdGF0aWNJbXBvcnQsCi0JCWJvb2xlYW4gY2hlY2tRdWFsaWZpY2F0aW9uLAotCQlTY29wZSBzY29wZSkgewotCi0JCS8vIEluaGVyaXRlZCBtZW1iZXIgdHlwZXMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKLQkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCi0JCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOwotCQluZXh0IDogZm9yIChpbnQgbSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgLS1tID49IDA7KSB7Ci0JCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1ttXTsKLQkJCS8vCQlpZiAoIXdhbnRDbGFzc2VzICYmIG1lbWJlclR5cGUuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OwotCQkJLy8JCWlmICghd2FudEludGVyZmFjZXMgJiYgbWVtYmVyVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAoc3RhdGljT25seSAmJiAhbWVtYmVyVHlwZS5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAoaXNGb3JiaWRkZW4obWVtYmVyVHlwZSkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkKLQkJCWlmICh0eXBlTGVuZ3RoID4gbWVtYmVyVHlwZS5zb3VyY2VOYW1lLmxlbmd0aCkKLQkJCQljb250aW51ZSBuZXh0OwotCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUsIGZhbHNlLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSkpKQotCQkJCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgotCQkJCQltZW1iZXJUeXBlLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWVtYmVyVHlwZSkpCi0JCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkpIHsKLQkJCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gbnVsbCAmJiAhbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25UeXBlKSkgewotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0gZWxzZSBpZihpbnZvY2F0aW9uVHlwZSA9PSBudWxsICYmICFtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgewotCQkJCQljb250aW51ZSBuZXh0OworCQkJaWYgKCFhY2Nlc3MuaXNJbnNpZGVBbm5vdGF0aW9uKSB7CisJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpKSB7CisJCQkJCWZpbmRLZXl3b3Jkcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbmV3IGNoYXJbXVtde0tleXdvcmRzLk5FV30sIGZhbHNlLCBmYWxzZSk7CiAJCQkJfQotCQkJfQogCi0JCQlmb3IgKGludCBpID0gdHlwZXNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKIAotCQkJCWlmIChtZW1iZXJUeXBlID09IG90aGVyVHlwZSkKLQkJCQkJY29udGludWUgbmV4dDsKKwkJCQlib29sZWFuIHN1cGVyQ2FsbCA9IGFjY2Vzcy5yZWNlaXZlciBpbnN0YW5jZW9mIFN1cGVyUmVmZXJlbmNlOwogCi0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1lbWJlclR5cGUuc291cmNlTmFtZSwgb3RoZXJUeXBlLnNvdXJjZU5hbWUsIHRydWUpKSB7CisJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHMoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkoKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKS5jYXB0dXJlKHNjb3BlLCBhY2Nlc3MucmVjZWl2ZXIuc291cmNlRW5kKSwKKwkJCQkJc2NvcGUsCisJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQltZXRob2RzRm91bmQsCisJCQkJCWFjY2VzcywKKwkJCQkJc2NvcGUsCisJCQkJCWZhbHNlLAorCQkJCQlzdXBlckNhbGwsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWZhbHNlLAorCQkJCQludWxsLAorCQkJCQktMSwKKwkJCQkJLTEpOwogCi0JCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc1N1cGVyY2xhc3NPZihvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpKSkKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCQkJaWYgKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKQotCQkJCQkJCS5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCksIHRydWUpKQotCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCQkJaWYgKG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzSW50ZXJmYWNlKCkpCi0JCQkJCQlpZiAob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKQotCQkJCQkJCS5pbXBsZW1lbnRzSW50ZXJmYWNlKG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpLCB0cnVlKSkKLQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0KLQkJCX0KLQotCQkJdHlwZXNGb3VuZC5hZGQobWVtYmVyVHlwZSk7Ci0KLQkJCWlmKCF0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgewotCQkJCWlmKHRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MpIHsKLQkJCQkJaWYoIW1lbWJlclR5cGUuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OwotCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgewotCQkJCQlpZighbWVtYmVyVHlwZS5pc0ludGVyZmFjZSgpICYmICFtZW1iZXJUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKLQkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgewotCQkJCQlpZighbWVtYmVyVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQljaGFyW10gY29tcGxldGlvbk5hbWUgPSBtZW1iZXJUeXBlLnNvdXJjZU5hbWUoKTsKLQkJCQotCQkJYm9vbGVhbiBpc1F1YWxpZmllZCA9IGZhbHNlOwotCQkJaWYoY2hlY2tRdWFsaWZpY2F0aW9uICYmICFmcm9tU3RhdGljSW1wb3J0KSB7Ci0JCQkJY2hhcltdIG1lbWJlclBhY2thZ2VOYW1lID0gbWVtYmVyVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCWNoYXJbXSBtZW1iZXJUeXBlTmFtZSA9IG1lbWJlclR5cGUuc291cmNlTmFtZSgpOwotCQkJCWNoYXJbXSBtZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMgPSBtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7Ci0JCQkJaWYgKG11c3RRdWFsaWZ5VHlwZShtZW1iZXJQYWNrYWdlTmFtZSwgbWVtYmVyVHlwZU5hbWUsIG1lbWJlckVuY2xvc2luZ1R5cGVOYW1lcywgbWVtYmVyVHlwZS5tb2RpZmllcnMpKSB7Ci0JCQkJCWlmIChtZW1iZXJQYWNrYWdlTmFtZSA9PSBudWxsIHx8IG1lbWJlclBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJCQkJaWYgKHRoaXMudW5pdFNjb3BlICE9IG51bGwgJiYgdGhpcy51bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKQotCQkJCQkJCWJyZWFrIG5leHQ7IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0Ci0JCQkJCWlzUXVhbGlmaWVkID0gdHJ1ZTsKLQkJCQkJY29tcGxldGlvbk5hbWUgPQotCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQkJCW1lbWJlclBhY2thZ2VOYW1lLAotCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKLQkJCQkJCQkJCQltZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCQkJCQkJbWVtYmVyVHlwZU5hbWUsCi0JCQkJCQkJCQkJJy4nKSwKLQkJCQkJCQkJJy4nKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1lbWJlclR5cGUpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCWlmKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oaXNRdWFsaWZpZWQpOwotCQkJfQotCQkJaWYgKHN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHkgJiYgdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHJlbGV2YW5jZSArPSBSX05PTl9JTkhFUklURUQ7IC8vIFRoaXMgY3JpdGVyaW9uIGRvZXNuJ3QgY29uY2VybiB0eXBlcyBhbmQgaXMgYWRkZWQgdG8gYmUgYmFsYW5jZWQgd2l0aCBmaWVsZCBhbmQgbWV0aG9kIHJlbGV2YW5jZS4KLQotCQkJaWYgKG1lbWJlclR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSB7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uVGFyZ2V0KG1lbWJlclR5cGUpOwotCQkJfSBlbHNlIGlmIChtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgewotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihtZW1iZXJUeXBlLnNvdXJjZU5hbWUpOwotCQkJfSBlbHNlIGlmKG1lbWJlclR5cGUuaXNFbnVtKCkpIHsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW0oKTsKLQkJCX0gZWxzZSBpZihtZW1iZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOwotCQkJfQotCQkJCQotCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQljcmVhdGVUeXBlUHJvcG9zYWwobWVtYmVyVHlwZSwgbWVtYmVyVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksIElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSwgY29tcGxldGlvbk5hbWUsIHJlbGV2YW5jZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKAotCQljaGFyW10gdHlwZU5hbWUsCi0JCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAotCQlTY29wZSBzY29wZSwKLQkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUludm9jYXRpb24sCi0JCWJvb2xlYW4gc3RhdGljT25seSwKLQkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAotCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCkgIHsKLQkJZmluZE1lbWJlclR5cGVzKAotCQkJCXR5cGVOYW1lLAotCQkJCXJlY2VpdmVyVHlwZSwKLQkJCQlzY29wZSwKLQkJCQl0eXBlSW52b2NhdGlvbiwKLQkJCQlzdGF0aWNPbmx5LAotCQkJCXN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCi0JCQkJZmFsc2UsCi0JCQkJZmFsc2UsCi0JCQkJZmFsc2UsCi0JCQkJbnVsbCwKLQkJCQl0eXBlc0ZvdW5kKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygKLQkJY2hhcltdIHR5cGVOYW1lLAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJU2NvcGUgc2NvcGUsCi0JCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVJbnZvY2F0aW9uLAotCQlib29sZWFuIHN0YXRpY09ubHksCi0JCWJvb2xlYW4gc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKLQkJYm9vbGVhbiBmcm9tU3RhdGljSW1wb3J0LAotCQlib29sZWFuIGNoZWNrUXVhbGlmaWNhdGlvbiwKLQkJYm9vbGVhbiBwcm9wb3NlQWxsTWVtYmVyVHlwZXMsCi0JCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVUb0lnbm9yZSwKLQkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQpIHsKLQotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOwotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNTdXBlclR5cGUgJiYgIXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSByZXR1cm47IC8vIHdlJ3JlIHRyeWluZyB0byBmaW5kIGEgc3VwZXJ0eXBlCi0JCQkKLQkJaWYgKGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpID09IG51bGwpIHJldHVybjsKLQkJCi0JCWlmICh0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZQotCQkJfHwgdHlwZU5hbWUubGVuZ3RoID09IDApIHsgLy8gZG8gbm90IHNlYXJjaCB1cCB0aGUgaGllcmFyY2h5Ci0KLQkJCWZpbmRNZW1iZXJUeXBlcygKLQkJCQl0eXBlTmFtZSwKLQkJCQljdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpLAotCQkJCXR5cGVzRm91bmQsCi0JCQkJcmVjZWl2ZXJUeXBlLAotCQkJCXR5cGVJbnZvY2F0aW9uLAotCQkJCXN0YXRpY09ubHksCi0JCQkJc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKLQkJCQlmcm9tU3RhdGljSW1wb3J0LAotCQkJCWNoZWNrUXVhbGlmaWNhdGlvbiwKLQkJCQlzY29wZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOwotCQlpbnQgbmV4dFBvc2l0aW9uID0gMDsKLQotCQlkbyB7Ci0JCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOwotCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKLQkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgewotCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IGl0c0ludGVyZmFjZXM7Ci0JCQkJCW5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7Ci0JCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQotCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKLQkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07Ci0JCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQotCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOwotCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZmluZE1lbWJlclR5cGVzKAotCQkJCXR5cGVOYW1lLAotCQkJCWN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCksCi0JCQkJdHlwZXNGb3VuZCwKLQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJdHlwZUludm9jYXRpb24sCi0JCQkJc3RhdGljT25seSwKLQkJCQlzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAotCQkJCWZyb21TdGF0aWNJbXBvcnQsCi0JCQkJY2hlY2tRdWFsaWZpY2F0aW9uLAotCQkJCXNjb3BlKTsKLQkJCQotCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7Ci0JCX0gd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpOwotCi0JCWlmKHByb3Bvc2VBbGxNZW1iZXJUeXBlcykgewotCQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gcmVjZWl2ZXJUeXBlLm1lbWJlclR5cGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYobWVtYmVyVHlwZXNbaV0gIT0gdHlwZVRvSWdub3JlKSB7Ci0JCQkJCWZpbmRTdWJNZW1iZXJUeXBlcygKLQkJCQkJCXR5cGVOYW1lLAotCQkJCQkJbWVtYmVyVHlwZXNbaV0sCi0JCQkJCQlzY29wZSwKLQkJCQkJCXR5cGVJbnZvY2F0aW9uLAotCQkJCQkJc3RhdGljT25seSwKLQkJCQkJCXN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCi0JCQkJCQlmcm9tU3RhdGljSW1wb3J0LAotCQkJCQkJdHlwZXNGb3VuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dFBvc2l0aW9uOyBpKyspIHsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07Ci0JCQkJZmluZE1lbWJlclR5cGVzKAotCQkJCQl0eXBlTmFtZSwKLQkJCQkJYW5JbnRlcmZhY2UubWVtYmVyVHlwZXMoKSwKLQkJCQkJdHlwZXNGb3VuZCwKLQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQl0eXBlSW52b2NhdGlvbiwKLQkJCQkJc3RhdGljT25seSwKLQkJCQkJc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKLQkJCQkJZnJvbVN0YXRpY0ltcG9ydCwKLQkJCQkJY2hlY2tRdWFsaWZpY2F0aW9uLAotCQkJCQlzY29wZSk7Ci0JCQkJCQkKLQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOwotCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7Ci0JCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKLQkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOwotCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgewotCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKLQkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCi0JCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7Ci0JCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBGaW5kIGphdmFkb2MgcGFyYW1ldGVyIG5hbWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaW5kSmF2YWRvY1BhcmFtTmFtZXMoY2hhcltdIHRva2VuLCBjaGFyW11bXSBtaXNzaW5nUGFyYW1zLCBib29sZWFuIGlzVHlwZVBhcmFtKSB7Ci0KLQkJaWYgKG1pc3NpbmdQYXJhbXMgPT0gbnVsbCkgcmV0dXJuOwotCi0JCS8vIEdldCByZWxldmFuY2UKLQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIHBhcmFtIG5hbWUKLQkJaWYgKCFpc1R5cGVQYXJhbSkgcmVsZXZhbmNlICs9IFJfSU5URVJFU1RJTkc7Ci0KLQkJLy8gUHJvcG9zZSBtaXNzaW5nIHBhcmFtCi0JCWludCBsZW5ndGggPSBtaXNzaW5nUGFyYW1zLmxlbmd0aDsKLQkJcmVsZXZhbmNlICs9IGxlbmd0aDsKLQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyW10gYXJnTmFtZSA9IG1pc3NpbmdQYXJhbXNbaV07Ci0JCQlpZiAodG9rZW4gPT0gbnVsbCB8fCBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgYXJnTmFtZSkpIHsKLQkJCQkKLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19QQVJBTV9SRUYpKSB7Ci0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfUEFSQU1fUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCXByb3Bvc2FsLnNldE5hbWUoYXJnTmFtZSk7Ci0JCQkJCWNoYXJbXSBjb21wbGV0aW9uID0gaXNUeXBlUGFyYW0gPyBDaGFyT3BlcmF0aW9uLmNvbmNhdCgnPCcsIGFyZ05hbWUsICc+JykgOiBhcmdOYW1lOwotCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOwotCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZSgtLXJlbGV2YW5jZSk7Ci0JCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kU3ViTWVtYmVyVHlwZXMoCi0JCWNoYXJbXSB0eXBlTmFtZSwKLQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCVNjb3BlIHNjb3BlLAotCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlSW52b2NhdGlvbiwKLQkJYm9vbGVhbiBzdGF0aWNPbmx5LAotCQlib29sZWFuIHN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCi0JCWJvb2xlYW4gZnJvbVN0YXRpY0ltcG9ydCwKLQkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQpIHsKLQotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOwotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCB0eXBlTmFtZS5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNTdXBlclR5cGUgJiYgIXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSByZXR1cm47IC8vIHdlJ3JlIHRyeWluZyB0byBmaW5kIGEgc3VwZXJ0eXBlCi0JCQotCQlpZiAoY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCkgPT0gbnVsbCkgcmV0dXJuOwotCQkgCi0JCWZpbmRNZW1iZXJUeXBlcygKLQkJCQl0eXBlTmFtZSwKLQkJCQljdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpLAotCQkJCXR5cGVzRm91bmQsCi0JCQkJcmVjZWl2ZXJUeXBlLAotCQkJCXR5cGVJbnZvY2F0aW9uLAotCQkJCXN0YXRpY09ubHksCi0JCQkJc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKLQkJCQlmcm9tU3RhdGljSW1wb3J0LAotCQkJCXRydWUsCi0JCQkJc2NvcGUpOwotCQkKLQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gcmVjZWl2ZXJUeXBlLm1lbWJlclR5cGVzKCk7Ci0JCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eSkgewotCQkJCWlmICh0eXBlSW52b2NhdGlvbiAhPSBudWxsICYmICFtZW1iZXJUeXBlc1tpXS5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIHR5cGVJbnZvY2F0aW9uKSkgewotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0gZWxzZSBpZih0eXBlSW52b2NhdGlvbiA9PSBudWxsICYmICFtZW1iZXJUeXBlc1tpXS5jYW5CZVNlZW5CeSh0aGlzLnVuaXRTY29wZS5mUGFja2FnZSkpIHsKLQkJCQkJY29udGludWUgbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5kU3ViTWVtYmVyVHlwZXMoCi0JCQkJdHlwZU5hbWUsCi0JCQkJbWVtYmVyVHlwZXNbaV0sCi0JCQkJc2NvcGUsCi0JCQkJdHlwZUludm9jYXRpb24sCi0JCQkJc3RhdGljT25seSwKLQkJCQlzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAotCQkJCWZyb21TdGF0aWNJbXBvcnQsCi0JCQkJdHlwZXNGb3VuZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZEludGVyZmFjZXNNZXRob2RzKAotCQljaGFyW10gc2VsZWN0b3IsCi0JCVR5cGVCaW5kaW5nW10gdHlwZUFyZ1R5cGVzLAotCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMsCi0JCVNjb3BlIHNjb3BlLAotCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAotCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAotCQlib29sZWFuIGV4YWN0TWF0Y2gsCi0JCWJvb2xlYW4gaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCi0JCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAotCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCi0JCWJvb2xlYW4gaW1wbGljaXRDYWxsLAotCQlib29sZWFuIHN1cGVyQ2FsbCwKLQkJYm9vbGVhbiBjYW5CZVByZWZpeGVkLAotCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAotCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNzU3RhcnRzLAotCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAotCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgewotCi0JCWlmIChzZWxlY3RvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7Ci0JCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOwotCQkJaW50IG5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgewotCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKLQkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKLQkJCQlpZihtZXRob2RzICE9IG51bGwpIHsKLQkJCQkJaWYoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24pIHsKLQkJCQkJCWZpbmRMb2NhbE1ldGhvZERlY2xhcmF0aW9ucygKLQkJCQkJCQlzZWxlY3RvciwKLQkJCQkJCQltZXRob2RzLAorCQkJCWlmICghc3VwZXJDYWxsKSB7CisJCQkJCQorCQkJCQljaGVja0NhbmNlbCgpOworCQkJCQkKKwkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tQ2FzdGVkUmVjZWl2ZXIoCisJCQkJCQkJZW5jbG9zaW5nTm9kZSwKKwkJCQkJCQlxdWFsaWZpZWRCaW5kaW5nLAogCQkJCQkJCXNjb3BlLAorCQkJCQkJCWZpZWxkc0ZvdW5kLAogCQkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCQlleGFjdE1hdGNoLAotCQkJCQkJCXJlY2VpdmVyVHlwZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmaW5kTG9jYWxNZXRob2RzKAotCQkJCQkJCXNlbGVjdG9yLAotCQkJCQkJCXR5cGVBcmdUeXBlcywKLQkJCQkJCQlhcmdUeXBlcywKLQkJCQkJCQltZXRob2RzLAorCQkJCQkJCWFjY2VzcywKIAkJCQkJCQlzY29wZSwKLQkJCQkJCQltZXRob2RzRm91bmQsCi0JCQkJCQkJb25seVN0YXRpY01ldGhvZHMsCi0JCQkJCQkJZXhhY3RNYXRjaCwKLQkJCQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJCWltcGxpY2l0Q2FsbCwKLQkJCQkJCQlzdXBlckNhbGwsCi0JCQkJCQkJY2FuQmVQcmVmaXhlZCwKLQkJCQkJCQltaXNzaW5nRWxlbWVudHMsCi0JCQkJCQkJbWlzc2luZ0VsZW1lbnRzc1N0YXJ0cywKLQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAotCQkJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKSkgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKLQkJCQkJaW50IGl0c0xlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOwotCQkJCQlpZiAobmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoID49IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoICsgNV0sIDAsIG5leHRQb3NpdGlvbik7Ci0JCQkJCW5leHRJbnRlcmZhY2UgOiBmb3IgKGludCBhID0gMDsgYSA8IGl0c0xlbmd0aDsgYSsrKSB7Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG5leHQgPSBpdHNJbnRlcmZhY2VzW2FdOwotCQkJCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBuZXh0UG9zaXRpb247IGIrKykKLQkJCQkJCQlpZiAobmV4dCA9PSBpbnRlcmZhY2VzVG9WaXNpdFtiXSkgY29udGludWUgbmV4dEludGVyZmFjZTsKLQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W25leHRQb3NpdGlvbisrXSA9IG5leHQ7Ci0JCQkJCX0KKwkJCQkJCQlhY2Nlc3MucmVjZWl2ZXIpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KIAkKLQlwcml2YXRlIHZvaWQgZmluZEltcGxpY2l0TWVzc2FnZVNlbmRzKAotCQljaGFyW10gdG9rZW4sCi0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCi0JCVNjb3BlIHNjb3BlLAotCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKLQkJU2NvcGUgaW52b2NhdGlvblNjb3BlKSB7CisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZShBU1ROb2RlIGFzdE5vZGUsIEFTVE5vZGUgYXN0Tm9kZVBhcmVudCwgU2NvcGUgc2NvcGUsCisJCQlib29sZWFuIGluc2lkZVR5cGVBbm5vdGF0aW9uKSB7CisJCUNvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZSBtZW1iZXJWYWx1ZVBhaXIgPSAoQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lKSBhc3ROb2RlOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgYXN0Tm9kZVBhcmVudDsKIAotCQlpZiAodG9rZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBtZW1iZXJWYWx1ZVBhaXIubmFtZTsKIAotCQlib29sZWFuIHN0YXRpY3NPbmx5ID0gZmFsc2U7Ci0JCS8vIG5lZWQgdG8ga25vdyBpZiB3ZSdyZSBpbiBhIHN0YXRpYyBjb250ZXh0IChvciBpbnNpZGUgYSBjb25zdHJ1Y3RvcikKLQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJUmVmZXJlbmNlQmluZGluZyBhbm5vdGF0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKWFubm90YXRpb24ucmVzb2x2ZWRUeXBlOwogCi0JCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisJCWlmIChhbm5vdGF0aW9uVHlwZSAhPSBudWxsICYmIGFubm90YXRpb25UeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgeworCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOTk9UQVRJT05fQVRUUklCVVRFX1JFRikpIHsKKwkJCQlmaW5kQW5ub3RhdGlvbkF0dHJpYnV0ZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIGFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycygpLCBhbm5vdGF0aW9uVHlwZSk7CisJCQl9CisJCQlpZiAodGhpcy5hc3Npc3ROb2RlQ2FuQmVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7CisJCQkJaWYgKHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciA+IC0xICYmIHRoaXMuZXhwZWN0ZWRUeXBlc1swXS5pc0Fubm90YXRpb25UeXBlKCkpIHsKKwkJCQkJZmluZFR5cGVzQW5kUGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNjb3BlLCBmYWxzZSwgZmFsc2UsIG5ldyBPYmplY3RWZWN0b3IoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciA+IC0xKSB7CisJCQkJCQl0aGlzLmFzc2lzdE5vZGVJc0VudW0gPSB0cnVlOworCQkJCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZXhwZWN0ZWRUeXBlc1B0cjsgaSsrKSB7CisJCQkJCQkJaWYgKCF0aGlzLmV4cGVjdGVkVHlwZXNbaV0uaXNFbnVtKCkpIHsKKwkJCQkJCQkJdGhpcy5hc3Npc3ROb2RlSXNFbnVtID0gZmFsc2U7CisJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJfQorCQkJCQkJfQogCi0JCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsKKwkJCQkJfQorCQkJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBCbG9ja1Njb3BlICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRikpIHsKKwkJCQkJCWNoYXJbXVtdIGFscmVhZHlEZWZpbmVkTmFtZSA9IGNvbXB1dGVBbHJlYWR5RGVmaW5lZE5hbWUoKEJsb2NrU2NvcGUpc2NvcGUsIEZha2VJbnZvY2F0aW9uU2l0ZSk7CiAKLQkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6Ci0JCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpCi0JCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsKLQkJCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKLQkJCQkJYnJlYWs7CisJCQkJCQlmaW5kVW5yZXNvbHZlZFJlZmVyZW5jZSgKKwkJCQkJCQkJbWVtYmVyVmFsdWVQYWlyLnNvdXJjZVN0YXJ0LAorCQkJCQkJCQltZW1iZXJWYWx1ZVBhaXIuc291cmNlRW5kLAorCQkJCQkJCQkoQmxvY2tTY29wZSlzY29wZSwKKwkJCQkJCQkJYWxyZWFkeURlZmluZWROYW1lKTsKKwkJCQkJfQorCQkJCQlmaW5kVmFyaWFibGVzQW5kTWV0aG9kcygKKwkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJc2NvcGUsCisJCQkJCQlGYWtlSW52b2NhdGlvblNpdGUsCisJCQkJCQlzY29wZSwKKwkJCQkJCWluc2lkZVR5cGVBbm5vdGF0aW9uLAorCQkJCQkJdHJ1ZSk7CisJCQkJCS8vIGNhbiBiZSB0aGUgc3RhcnQgb2YgYSBxdWFsaWZpZWQgdHlwZSBuYW1lCisJCQkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZSwgZmFsc2UsIGZhbHNlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uTWVzc2FnZVNlbmQoQVNUTm9kZSBhc3ROb2RlLCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7CisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKIAotCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgotCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgc2NvcGU7Ci0JCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKLQkJCQkJZmluZE1ldGhvZHMoCi0JCQkJCQl0b2tlbiwKLQkJCQkJCW51bGwsCi0JCQkJCQlhcmdUeXBlcywKLQkJCQkJCWVuY2xvc2luZ1R5cGUsCi0JCQkJCQljbGFzc1Njb3BlLAorCQlDb21wbGV0aW9uT25NZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChDb21wbGV0aW9uT25NZXNzYWdlU2VuZCkgYXN0Tm9kZTsKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IGNvbXB1dGVUeXBlcyhtZXNzYWdlU2VuZC5hcmd1bWVudHMpOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IG1lc3NhZ2VTZW5kLnNlbGVjdG9yOworCQlpZiAocXVhbGlmaWVkQmluZGluZyA9PSBudWxsKSB7CisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKKwkJCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOworCisJCQkJZmluZEltcGxpY2l0TWVzc2FnZVNlbmRzKHRoaXMuY29tcGxldGlvblRva2VuLCBhcmdUeXBlcywgc2NvcGUsIG1lc3NhZ2VTZW5kLCBzY29wZSwgbWV0aG9kc0ZvdW5kKTsKKwkJCQkKKwkJCQljaGVja0NhbmNlbCgpOworCQkJCQorCQkJCWZpbmRMb2NhbE1ldGhvZHNGcm9tU3RhdGljSW1wb3J0cygKKwkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJc2NvcGUsCisJCQkJCQltZXNzYWdlU2VuZCwKKwkJCQkJCXNjb3BlLAorCQkJCQkJdHJ1ZSwKIAkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCXN0YXRpY3NPbmx5LAotCQkJCQkJdHJ1ZSwKKwkJCQkJCXRydWUpOworCQkJfQorCQl9IGVsc2UgIGlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSkgeworCQkJZmluZE1ldGhvZHMoCisJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJbnVsbCwKKwkJCQlhcmdUeXBlcywKKwkJCQkoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcpLmNhcHR1cmUoc2NvcGUsIG1lc3NhZ2VTZW5kLnJlY2VpdmVyLnNvdXJjZUVuZCksCisJCQkJc2NvcGUsCisJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCWZhbHNlLAorCQkJCXRydWUsCisJCQkJbWVzc2FnZVNlbmQsCisJCQkJc2NvcGUsCisJCQkJZmFsc2UsCisJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgaW5zdGFuY2VvZiBTdXBlclJlZmVyZW5jZSwKKwkJCQlmYWxzZSwKKwkJCQludWxsLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQlmYWxzZSwKKwkJCQludWxsLAorCQkJCS0xLAorCQkJCS0xKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY29tcGxldGlvbk9uTWVzc2FnZVNlbmROYW1lKEFTVE5vZGUgYXN0Tm9kZSwgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nLCBTY29wZSBzY29wZSkgeworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKKwkJCUNvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kTmFtZSBtZXNzYWdlU2VuZCA9IChDb21wbGV0aW9uT25NZXNzYWdlU2VuZE5hbWUpIGFzdE5vZGU7CisKKwkJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKKwkJCXRoaXMuY29tcGxldGlvblRva2VuID0gbWVzc2FnZVNlbmQuc2VsZWN0b3I7CisJCQlib29sZWFuIG9ubHlTdGF0aWMgPSBmYWxzZTsKKwkJCWlmIChtZXNzYWdlU2VuZC5yZWNlaXZlciBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKKwkJCQlvbmx5U3RhdGljID0gKChOYW1lUmVmZXJlbmNlKW1lc3NhZ2VTZW5kLnJlY2VpdmVyKS5pc1R5cGVSZWZlcmVuY2UoKTsKKwkJCX0gZWxzZSBpZiAoIShtZXNzYWdlU2VuZC5yZWNlaXZlciBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSAmJgorCQkJCQkhKG1lc3NhZ2VTZW5kLnJlY2VpdmVyIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpICYmCisJCQkJCSEobWVzc2FnZVNlbmQucmVjZWl2ZXIuaXNUaGlzKCkpKSB7CisJCQkJb25seVN0YXRpYyA9IHRydWU7CisJCQl9CisKKwkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IChUeXBlQmluZGluZylxdWFsaWZpZWRCaW5kaW5nOworCisJCQlpZihyZWNlaXZlclR5cGUgIT0gbnVsbCAmJiByZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJVHlwZUJpbmRpbmdbXSB0eXBlQXJnVHlwZXMgPSBjb21wdXRlVHlwZXNJZkNvcnJlY3QobWVzc2FnZVNlbmQudHlwZUFyZ3VtZW50cyk7CisJCQkJaWYodHlwZUFyZ1R5cGVzICE9IG51bGwpIHsKKwkJCQkJZmluZE1ldGhvZHMoCisJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQkJdHlwZUFyZ1R5cGVzLAorCQkJCQkJCW51bGwsCisJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpcmVjZWl2ZXJUeXBlLmNhcHR1cmUoc2NvcGUsIG1lc3NhZ2VTZW5kLnJlY2VpdmVyLnNvdXJjZUVuZCksCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQkJCW9ubHlTdGF0aWMsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJbWVzc2FnZVNlbmQsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJbnVsbCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJbnVsbCwKKwkJCQkJCQktMSwKKwkJCQkJCQktMSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25NZXRob2ROYW1lKEFTVE5vZGUgYXN0Tm9kZSwgU2NvcGUgc2NvcGUpIHsKKwkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlZBUklBQkxFX0RFQ0xBUkFUSU9OKSkgeworCQkJQ29tcGxldGlvbk9uTWV0aG9kTmFtZSBtZXRob2QgPSAoQ29tcGxldGlvbk9uTWV0aG9kTmFtZSkgYXN0Tm9kZTsKKworCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZShtZXRob2Quc291cmNlU3RhcnQsIG1ldGhvZC5zZWxlY3RvckVuZCk7CisKKwkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5maWVsZHMoKTsKKwkJCWNoYXJbXVtdIGV4Y2x1ZGVOYW1lcyA9IG5ldyBjaGFyW2ZpZWxkcy5sZW5ndGhdW107CisJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspeworCQkJCWV4Y2x1ZGVOYW1lc1tpXSA9IGZpZWxkc1tpXS5uYW1lOworCQkJfQorCisJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IG1ldGhvZC5zZWxlY3RvcjsKKworCQkJCisJCQlpbnQga2luZCA9CisJCQkJIChtZXRob2QubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgPT0gMCA/IAorCQkJCQkJSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5WS19JTlNUQU5DRV9GSUVMRCA6CisJCQkJCQkJKG1ldGhvZC5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDAgPyAKKwkJCQkJCQkJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuVktfU1RBVElDX0ZJRUxEIDoKKwkJCQkJCQkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLlZLX1NUQVRJQ19GSU5BTF9GSUVMRDsKKwkJCQkJCQorCQkJZmluZFZhcmlhYmxlTmFtZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIG1ldGhvZC5yZXR1cm5UeXBlLCBleGNsdWRlTmFtZXMsIG51bGwsIGtpbmQpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25NZXRob2RSZXR1cm5UeXBlKEFTVE5vZGUgYXN0Tm9kZSwgU2NvcGUgc2NvcGUpIHsKKwkJQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSBtZXRob2QgPSAoQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgYXN0Tm9kZTsKKwkJU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0gKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIG1ldGhvZC5yZXR1cm5UeXBlOworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IHR5cGUudG9rZW47CisJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UodHlwZS5zb3VyY2VTdGFydCwgdHlwZS5zb3VyY2VFbmQpOworCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUucGFyZW50LCB0cnVlLCB0cnVlLCBuZXcgT2JqZWN0VmVjdG9yKCkpOworCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKKwkJCWZpbmRLZXl3b3Jkc0Zvck1lbWJlcih0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbWV0aG9kLm1vZGlmaWVycyk7CisJCX0KKworCQlpZiAobWV0aG9kLm1vZGlmaWVycyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCkgeworCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCWlmICghZW5jbG9zaW5nVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIHsKKwkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OKSkgeworCQkJCQlmaW5kTWV0aG9kRGVjbGFyYXRpb25zKAorCQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQlzY29wZSwKKwkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCQkJbnVsbCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTikpIHsKKwkJCQkJcHJvcG9zZU5ld01ldGhvZCh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKEFTVE5vZGUgYXN0Tm9kZSwgQVNUTm9kZSBhc3ROb2RlUGFyZW50LCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7CisJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCUNvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHJlZiA9IChDb21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZTsKKworCQkJdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOworCisJCQl0aGlzLmFzc2lzdE5vZGVJc0NsYXNzID0gcmVmLmlzQ2xhc3MoKTsKKwkJCXRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uID0gcmVmLmlzRXhjZXB0aW9uKCk7CisJCQl0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSA9IHJlZi5pc0ludGVyZmFjZSgpOworCQkJdGhpcy5hc3Npc3ROb2RlSXNTdXBlclR5cGUgPSByZWYuaXNTdXBlclR5cGUoKTsKKwkJCXRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlID0gYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQpOworCQkJdGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uID0gYXNzaXN0Tm9kZUlzSW50ZXJmYWNlRXhjbHVkaW5nQW5ub3RhdGlvbihhc3ROb2RlLCBhc3ROb2RlUGFyZW50KTsKKworCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSByZWYuY29tcGxldGlvbklkZW50aWZpZXI7CisJCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnRva2Vucy5sZW5ndGhdOworCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisKKwkJCWlmIChxdWFsaWZpZWRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIHx8CisJCQkJCSgoKFJlZmVyZW5jZUJpbmRpbmcpcXVhbGlmaWVkQmluZGluZykudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDAgJiYKKwkJCQkJCSh0aGlzLnJlcXVlc3Rvci5pc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgeworCQkJCQlpZihyZWYudG9rZW5zLmxlbmd0aCA9PSAxKSB7CisJCQkJCQlmaW5kTWVtYmVyVHlwZXNGcm9tTWlzc2luZ1R5cGUoCisJCQkJCQkJCXJlZiwKKwkJCQkJCQkJcmVmLnNvdXJjZVBvc2l0aW9uc1swXSwKKwkJCQkJCQkJc2NvcGUpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24gJiYgYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgeworCQkJCQlmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCgKKwkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkJCQkoUmVmZXJlbmNlQmluZGluZylxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQkoQmxvY2tTY29wZSlzY29wZSwKKwkJCQkJCQl0eXBlc0ZvdW5kKTsKKwkJCQl9CisJCQkJCisJCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQkKKwkJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKKwkJCQkJc2NvcGUsCisJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJZmFsc2UsCisJCQkJCWZhbHNlLAorCQkJCQl0eXBlc0ZvdW5kLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlKEFTVE5vZGUgYXN0Tm9kZSwgQVNUTm9kZSBhc3ROb2RlUGFyZW50KSB7CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTM5OSwgZG9uJ3QgcHJvcG9zZSBmaW5hbCB0eXBlcyBmb3IgZXh0ZW5zaW9uLgorCQlpZiAoYXN0Tm9kZVBhcmVudCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGFzdE5vZGVQYXJlbnQ7CisJCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzID09IGFzdE5vZGUpOwkKKwkJfSBlbHNlIGlmIChhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgVHlwZVBhcmFtZXRlcikgeworCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKFR5cGVQYXJhbWV0ZXIpIGFzdE5vZGVQYXJlbnQ7CisJCQlyZXR1cm4gKHR5cGVQYXJhbWV0ZXIudHlwZSA9PSBhc3ROb2RlKTsKKwkJfSBlbHNlIGlmIChhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgV2lsZGNhcmQpIHsKKwkJCVdpbGRjYXJkIHdpbGRjYXJkID0gKFdpbGRjYXJkKSBhc3ROb2RlUGFyZW50OworCQkJcmV0dXJuICh3aWxkY2FyZC5ib3VuZCA9PSBhc3ROb2RlICYmIHdpbGRjYXJkLmtpbmQgPT0gV2lsZGNhcmQuRVhURU5EUyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gYXNzaXN0Tm9kZUlzSW50ZXJmYWNlRXhjbHVkaW5nQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIEFTVE5vZGUgYXN0Tm9kZVBhcmVudCkgeworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwNDIzLCBkb24ndCBwcm9wb3NlIGFubm90YXRpb25zIGZvciBpbXBsZW1lbnRzLgorCQlpZiAoYXN0Tm9kZVBhcmVudCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGFzdE5vZGVQYXJlbnQ7CisJCQlUeXBlUmVmZXJlbmNlIFtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXM7CisJCQlpbnQgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzID09IG51bGwgPyAwIDogc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoc3VwZXJJbnRlcmZhY2VzW2ldID09IGFzdE5vZGUpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGFzc2lzdE5vZGVJc0luc2lkZUNhc2UoQVNUTm9kZSBhc3ROb2RlLCBBU1ROb2RlIGFzdE5vZGVQYXJlbnQpIHsKKwkJLy8gVG8gZmluZCB3aGV0aGVyIHdlJ3JlIGNvbXBsZXRpbmcgaW5zaWRlIHRoZSBjYXNlIGV4cHJlc3Npb24gaW4gYSAKKwkJLy8gc3dpdGNoIGNhc2UgY29uc3RydWN0IChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MzQ2KQorCQlpZiAoYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFN3aXRjaFN0YXRlbWVudCkgeworCQkJQ2FzZVN0YXRlbWVudFtdIGNhc2VzID0gKChTd2l0Y2hTdGF0ZW1lbnQpIGFzdE5vZGVQYXJlbnQpLmNhc2VzOworCQkJZm9yIChpbnQgaSA9IDAsIGNhc2VDb3VudCA9ICgoU3dpdGNoU3RhdGVtZW50KSBhc3ROb2RlUGFyZW50KS5jYXNlQ291bnQ7IGkgPCBjYXNlQ291bnQ7IGkrKykgeworCQkJCUNvbXBsZXRpb25Ob2RlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgQ29tcGxldGlvbk5vZGVEZXRlY3Rvcihhc3ROb2RlLCBjYXNlc1tpXSk7CisJCQkJaWYgKGRldGVjdG9yLmNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihBU1ROb2RlIGFzdE5vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKKwkJc2V0U291cmNlQW5kVG9rZW5SYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCwgZmFsc2UpOworCisJCUNvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwcmVzc2lvbiA9CisJCQkoQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7CisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBjb21wdXRlVHlwZXMoYWxsb2NFeHByZXNzaW9uLmFyZ3VtZW50cyk7CisKKwkJUmVmZXJlbmNlQmluZGluZyByZWYgPSAoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZzsKKwkJCisJCWlmIChyZWYucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpIHsKKwkJCWZpbmRDb25zdHJ1Y3RvcnNGcm9tTWlzc2luZ1R5cGUoCisJCQkJCWFsbG9jRXhwcmVzc2lvbi50eXBlLAorCQkJCQlhcmdUeXBlcywKKwkJCQkJc2NvcGUsCisJCQkJCWFsbG9jRXhwcmVzc2lvbik7CisJCX0gZWxzZSB7CisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikKKwkJCQkJJiYgcmVmLmlzQ2xhc3MoKQorCQkJCQkmJiAhcmVmLmlzQWJzdHJhY3QoKSkgeworCQkJCQlmaW5kQ29uc3RydWN0b3JzKAorCQkJCQkJcmVmLAorCQkJCQkJYXJnVHlwZXMsCisJCQkJCQlzY29wZSwKKwkJCQkJCWFsbG9jRXhwcmVzc2lvbiwKIAkJCQkJCWZhbHNlLAotCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQl0cnVlLAotCQkJCQkJZmFsc2UsCi0JCQkJCQl0cnVlLAogCQkJCQkJbnVsbCwKIAkJCQkJCW51bGwsCiAJCQkJCQludWxsLAogCQkJCQkJZmFsc2UpOwotCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoKLQkJCQkJYnJlYWsgZG9uZTsKLQkJCX0KLQkJCXNjb3BlID0gc2NvcGUucGFyZW50OwotCQl9Ci0JfQotCi0JLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1ldGhvZHMoY2hhcltdLCBUeXBlQmluZGluZ1tdLCBSZWZlcmVuY2VCaW5kaW5nLCBTY29wZSwgT2JqZWN0VmVjdG9yLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuKQotCXByaXZhdGUgdm9pZCBmaW5kTG9jYWxNZXRob2RzKAotCQljaGFyW10gbWV0aG9kTmFtZSwKLQkJVHlwZUJpbmRpbmdbXSB0eXBlQXJnVHlwZXMsCi0JCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCi0JCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLAotCQlTY29wZSBzY29wZSwKLQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKLQkJYm9vbGVhbiBvbmx5U3RhdGljTWV0aG9kcywKLQkJYm9vbGVhbiBleGFjdE1hdGNoLAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCVNjb3BlIGludm9jYXRpb25TY29wZSwKLQkJYm9vbGVhbiBpbXBsaWNpdENhbGwsCi0JCWJvb2xlYW4gc3VwZXJDYWxsLAotCQlib29sZWFuIGNhbkJlUHJlZml4ZWQsCi0JCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCi0JCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpIHsKLQotCQlPYmplY3RWZWN0b3IgbmV3TWV0aG9kc0ZvdW5kID0gIG5ldyBPYmplY3RWZWN0b3IoKTsKLQkJLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKLQkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCi0KLQkJaW50IG1ldGhvZExlbmd0aCA9IG1ldGhvZE5hbWUubGVuZ3RoOwotCQlpbnQgbWluVHlwZUFyZ0xlbmd0aCA9IHR5cGVBcmdUeXBlcyA9PSBudWxsID8gMCA6IHR5cGVBcmdUeXBlcy5sZW5ndGg7Ci0JCWludCBtaW5BcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsKLQotCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKLQotCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJbWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKLQkJCQljb250aW51ZSBuZXh0OwotCi0JCQkvL1RPRE8gKGRhdmlkKSBwZXJoYXBzIHRoZSByZWxldmFuY2Ugb2YgYSB2b2lkIG1ldGhvZCBtdXN0IGJlIGxlc3NlciB0aGFuIG90aGVyIG1ldGhvZHMKLQkJCS8vaWYgKGV4cGVjdGVkVHlwZXNQdHIgPiAtMSAmJiBtZXRob2QucmV0dXJuVHlwZSA9PSBCYXNlVHlwZXMuVm9pZEJpbmRpbmcpIGNvbnRpbnVlIG5leHQ7Ci0JCQkKLQkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiAhbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5Ci0JCQkJJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmKHN1cGVyQ2FsbCAmJiBtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJbWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKLQkJCQljb250aW51ZSBuZXh0OwotCQkJfQotCi0JCQlpZiAoZXhhY3RNYXRjaCkgewotCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIHsKLQkJCQkJY29udGludWUgbmV4dDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtZXRob2RMZW5ndGggPiBtZXRob2Quc2VsZWN0b3IubGVuZ3RoKSBjb250aW51ZSBuZXh0OwotCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykKLQkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKSkpIHsKLQkJCQkJY29udGludWUgbmV4dDsKLQkJCQl9CiAJCQl9CiAJCQkKLQkJCWlmIChtaW5UeXBlQXJnTGVuZ3RoICE9IDAgJiYgbWluVHlwZUFyZ0xlbmd0aCAhPSBtZXRob2QudHlwZVZhcmlhYmxlcy5sZW5ndGgpCi0JCQkJY29udGludWUgbmV4dDsKKwkJCWNoZWNrQ2FuY2VsKCk7CiAJCQkKLQkJCWlmIChtaW5UeXBlQXJnTGVuZ3RoICE9IDApIHsKLQkJCQltZXRob2QgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKG1ldGhvZCwgdHlwZUFyZ1R5cGVzKTsKLQkJCX0KLQkJCQotCQkJaWYgKG1pbkFyZ0xlbmd0aCA+IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCkKLQkJCQljb250aW51ZSBuZXh0OwotCi0JCQlmb3IgKGludCBhID0gbWluQXJnTGVuZ3RoOyAtLWEgPj0gMDspewotCQkJCWlmIChhcmdUeXBlc1thXSAhPSBudWxsKSB7IC8vIGNhbiBiZSBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBwcm9wZXJseQotCQkJCQlpZiAoIWFyZ1R5cGVzW2FdLmlzQ29tcGF0aWJsZVdpdGgobWV0aG9kLnBhcmFtZXRlcnNbYV0pKSB7Ci0JCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlib29sZWFuIHByZWZpeFJlcXVpcmVkID0gZmFsc2U7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7Ci0JCQkJT2JqZWN0W10gb3RoZXIgPSAoT2JqZWN0W10pIG1ldGhvZHNGb3VuZC5lbGVtZW50QXQoaSk7Ci0JCQkJTWV0aG9kQmluZGluZyBvdGhlck1ldGhvZCA9IChNZXRob2RCaW5kaW5nKSBvdGhlclswXTsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyUmVjZWl2ZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIG90aGVyWzFdOwotCQkJCWlmIChtZXRob2QgPT0gb3RoZXJNZXRob2QgJiYgcmVjZWl2ZXJUeXBlID09IG90aGVyUmVjZWl2ZXJUeXBlKQotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIG90aGVyTWV0aG9kLnNlbGVjdG9yLCB0cnVlKSkgewotCQkJCQlpZiAocmVjZWl2ZXJUeXBlID09IG90aGVyUmVjZWl2ZXJUeXBlKSB7Ci0JCQkJCQlpZiAobG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5kb2VzTWV0aG9kT3ZlcnJpZGUob3RoZXJNZXRob2QsIG1ldGhvZCkpIHsKLQkJCQkJCQlpZiAoIXN1cGVyQ2FsbCB8fCAhb3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpLmRvZXNNZXRob2RPdmVycmlkZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgewotCQkJCQkJCWlmKHJlY2VpdmVyVHlwZS5pc0Fub255bW91c1R5cGUoKSkgY29udGludWUgbmV4dDsKLQkJCQkJCQkKLQkJCQkJCQlpZighc3VwZXJDYWxsKSB7Ci0JCQkJCQkJCWlmKCFjYW5CZVByZWZpeGVkKSBjb250aW51ZSBuZXh0OwotCQkJCQkJCQkKLQkJCQkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKLQkJCQotCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOwotCQkJaWYgKG1ldGhvZC5kZWNsYXJpbmdDbGFzcyAhPSBzdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUpIHsKLQkJCQlNZXRob2RCaW5kaW5nW10gb3RoZXJNZXRob2RzID0gc3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlLmdldE1ldGhvZHMobWV0aG9kLnNlbGVjdG9yKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZihvdGhlck1ldGhvZHNbaV0ub3JpZ2luYWwoKSA9PSBtZXRob2Qub3JpZ2luYWwoKSkgewotCQkJCQkJbWV0aG9kID0gb3RoZXJNZXRob2RzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpbnQgbGVuZ3RoID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOwotCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJVHlwZUJpbmRpbmcgdHlwZSA9IG1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV07Ci0JCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOwotCQkJfQotCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMobWV0aG9kLHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0KLQkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCQkJCi0JCQlpbnQgcHJldmlvdXNTdGFydFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOwotCi0JCQkvLyBTcGVjaWFsIGNhc2UgZm9yIGNvbXBsZXRpb24gaW4gamF2YWRvYwotCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA+IDApIHsKLQkJCQlFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQkJCQlpZiAoaW52b2NhdGlvblNpdGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQpIHsKLQkJCQkJQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kIG1zZyA9IChDb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQpIGludm9jYXRpb25TaXRlOwotCQkJCQlyZWNlaXZlciA9IG1zZy5yZWNlaXZlcjsKLQkJCQl9IGVsc2UgaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSB7Ci0JCQkJCUNvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UpIGludm9jYXRpb25TaXRlOwotCQkJCQlyZWNlaXZlciA9IGZpZWxkUmVmLnJlY2VpdmVyOwotCQkJCX0KLQkJCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdCdWZmZXIgamF2YWRvY0NvbXBsZXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWlmIChyZWNlaXZlci5pc1RoaXMoKSkgewotCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDApIHsKLQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwKSB7Ci0JCQkJCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQkJCQkJCUphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UpIHJlY2VpdmVyOwotCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCh0eXBlUmVmLnRva2VuKTsKLQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKLQkJCQkJCX0gZWxzZSBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewotCQkJCQkJCUphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHJlY2VpdmVyOwotCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZVJlZi50b2tlbnMsICcuJyksIG1ldGhvZC5zZWxlY3RvciwgJyMnKTsKLQkJCQkJCQlmb3IgKGludCB0PTAsbnQgPXR5cGVSZWYudG9rZW5zLmxlbmd0aDsgdDxudDsgdCsrKSB7Ci0JCQkJCQkJCWlmICh0PjApIGphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnLicpOwotCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQodHlwZVJlZi50b2tlbnNbdF0pOwotCQkJCQkJCX0KLQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQobWV0aG9kLnNlbGVjdG9yKTsKLQkJCQkJLy8gQXBwZW5kIHBhcmFtZXRlcnMgdHlwZXMKLQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcoJyk7Ci0JCQkJCWlmIChtZXRob2QucGFyYW1ldGVycyAhPSBudWxsKSB7Ci0JCQkJCQlib29sZWFuIGlzVmFyYXJncyA9IG1ldGhvZC5pc1ZhcmFyZ3MoKTsKLQkJCQkJCWZvciAoaW50IHA9MCwgbG49bWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyBwPGxuOyBwKyspIHsKLQkJCQkJCQlpZiAocD4wKSBqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlUeXBlQmluZGluZyBhcmdUeXBlQmluZGluZyA9IG1ldGhvZC5wYXJhbWV0ZXJzW3BdOwotCQkJCQkJCWlmIChpc1ZhcmFyZ3MgJiYgcCA9PSBsbiAtIDEpICB7Ci0JCQkJCQkJCWNyZWF0ZVZhcmdzVHlwZShhcmdUeXBlQmluZGluZy5lcmFzdXJlKCksIGphdmFkb2NDb21wbGV0aW9uKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljcmVhdGVUeXBlKGFyZ1R5cGVCaW5kaW5nLmVyYXN1cmUoKSwgamF2YWRvY0NvbXBsZXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyknKTsKLQkJCQkJY29tcGxldGlvbiA9IGphdmFkb2NDb21wbGV0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5vdGhpbmcgdG8gaW5zZXJ0IC0gZG8gbm90IHdhbnQgdG8gcmVwbGFjZSB0aGUgZXhpc3Rpbmcgc2VsZWN0b3IgJiBhcmd1bWVudHMKLQkJCQlpZiAoIWV4YWN0TWF0Y2gpIHsKLQkJCQkJaWYgKHRoaXMuc291cmNlICE9IG51bGwKLQkJCQkJCSYmIHRoaXMuc291cmNlLmxlbmd0aCA+IHRoaXMuZW5kUG9zaXRpb24KLQkJCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuZW5kUG9zaXRpb25dID09ICcoJykKLQkJCQkJCWNvbXBsZXRpb24gPSBtZXRob2Quc2VsZWN0b3I7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2Quc2VsZWN0b3IsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihwcmVmaXhSZXF1aXJlZCAmJiAodGhpcy5zb3VyY2UgIT0gbnVsbCkpIHsKLQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuc291cmNlLCB0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuZW5kUG9zaXRpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5lbmRQb3NpdGlvbjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZihwcmVmaXhSZXF1aXJlZCB8fCB0aGlzLm9wdGlvbnMuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24pewotCQkJCQljaGFyW10gcHJlZml4ID0gY29tcHV0ZVByZWZpeChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIG1ldGhvZC5pc1N0YXRpYygpKTsKLQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeCxjb21wbGV0aW9uLCcuJyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSByZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1ldGhvZC5yZXR1cm5UeXBlKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKG9ubHlTdGF0aWNNZXRob2RzLCBtZXRob2QuaXNTdGF0aWMoKSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiB0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgewotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW5oZXJpdGFuY2UocmVjZWl2ZXJUeXBlLCBtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOwotCQkJfQotCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKLQkJCX0KLQkJCQotCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkvLyBTdGFuZGFyZCBwcm9wb3NhbAotCQkJaWYoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgJiYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuT05MWV9JTkxJTkVfVEFHKSA9PSAwKSB7Ci0JCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOwotCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBtZXRob2Qub3JpZ2luYWwoKTsKLQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7Ci0JCQkJfQotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQotCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAotCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAotCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAotCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKLQkJCQkJCQkJCXJlbGV2YW5jZSk7Ci0JCQkJCX0KLQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEphdmFkb2MgcHJvcG9zYWwKLQkJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfTUVUSE9EX1JFRikpIHsKLQkJCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb24gPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb24sIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOwotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOwotCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBtZXRob2Qub3JpZ2luYWwoKTsKLQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7Ci0JCQkJfQotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihqYXZhZG9jQ29tcGxldGlvbik7Ci0JCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7Ci0JCQkJaW50IHN0YXJ0ID0gKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuUkVQTEFDRV9UQUcpICE9IDAgPyB0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7Ci0JCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBwcmV2aW91c1N0YXJ0UG9zaXRpb247Ci0JCX0KLQkJCi0JCW1ldGhvZHNGb3VuZC5hZGRBbGwobmV3TWV0aG9kc0ZvdW5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRMb2NhbE1ldGhvZHNGcm9tRmF2b3JpdGVzKAotCQkJY2hhcltdIG1ldGhvZE5hbWUsCi0JCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywKLQkJCVNjb3BlIHNjb3BlLAotCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKLQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAotCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUpIHsKLQkJCi0JCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocmVjZWl2ZXJUeXBlLmNvbXBvdW5kTmFtZSwgJy4nKTsKLQotCQkJaW50IG1ldGhvZExlbmd0aCA9IG1ldGhvZE5hbWUubGVuZ3RoOwotCi0JCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKLQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbZl07Ci0KLQkJCQlpZiAobWV0aG9kLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dDsKLQkJCQkKLQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJCW1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCQkhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKQotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQotCQkJCWlmICghbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCQkmJiAhbWV0aG9kLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dDsKLQotCQkJCWlmIChtZXRob2RMZW5ndGggPiBtZXRob2Quc2VsZWN0b3IubGVuZ3RoKSBjb250aW51ZSBuZXh0OwotCQkJCQkKLQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvcikpKSB7Ci0JCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJfQotCQkJCQotCQkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7Ci0JCQkJCU9iamVjdFtdIG90aGVyID0gKE9iamVjdFtdKSBtZXRob2RzRm91bmQuZWxlbWVudEF0KGkpOwotCQkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOwotCQkJCQkKLQkJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCkgY29udGludWUgbmV4dDsKLQkJCQkJCi0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIG90aGVyTWV0aG9kLnNlbGVjdG9yLCB0cnVlKSkgewotCQkJCQkJaWYgKGxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCkuZG9lc01ldGhvZE92ZXJyaWRlKG90aGVyTWV0aG9kLCBtZXRob2QpKSB7Ci0JCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlib29sZWFuIHByb3Bvc2VTdGF0aWNJbXBvcnQgPSAhKHRoaXMuY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpICYmCi0JCQkJCXRoaXMub3B0aW9ucy5zdWdnZXN0U3RhdGljSW1wb3J0OwotCQkJCQotCQkJCWJvb2xlYW4gaXNBbHJlYWR5SW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlpZiAoIXByb3Bvc2VTdGF0aWNJbXBvcnQpIHsKLQkJCQkJaWYoIXRoaXMuaW1wb3J0Q2FjaGVzSW5pdGlhbGl6ZWQpIHsKLQkJCQkJCXRoaXMuaW5pdGlhbGl6ZUltcG9ydENhY2hlcygpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGhpcy5pbXBvcnRDYWNoZUNvdW50OyBqKyspIHsKLQkJCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSB0aGlzLmltcG9ydHNDYWNoZVtqXTsKLQkJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHJlY2VpdmVyVHlwZS5zb3VyY2VOYW1lLCBpbXBvcnROYW1lWzBdKSkgewotCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIGltcG9ydE5hbWVbMV0pKSB7Ci0JCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaXNBbHJlYWR5SW1wb3J0ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQltZXRob2RzRm91bmQuYWRkKG5ldyBPYmplY3RbXXttZXRob2QsIHJlY2VpdmVyVHlwZX0pOwotCQkJCQotCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlID0gKFJlZmVyZW5jZUJpbmRpbmcpcmVjZWl2ZXJUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKTsKLQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IHN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZSkgewotCQkJCQlNZXRob2RCaW5kaW5nW10gb3RoZXJNZXRob2RzID0gc3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlLmdldE1ldGhvZHMobWV0aG9kLnNlbGVjdG9yKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlck1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmKG90aGVyTWV0aG9kc1tpXS5vcmlnaW5hbCgpID09IG1ldGhvZC5vcmlnaW5hbCgpKSB7Ci0JCQkJCQkJbWV0aG9kID0gb3RoZXJNZXRob2RzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWludCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7Ci0JCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IG1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV07Ci0JCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKLQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7Ci0JCQkJfQotCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOwotCi0JCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCQkJCi0JCQkJaW50IHByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJCQkKLQkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAotCQkJCQkmJiB0aGlzLnNvdXJjZS5sZW5ndGggPiB0aGlzLmVuZFBvc2l0aW9uCi0JCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuZW5kUG9zaXRpb25dID09ICcoJykgewotCQkJCQljb21wbGV0aW9uID0gbWV0aG9kLnNlbGVjdG9yOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2Quc2VsZWN0b3IsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobWV0aG9kLnJldHVyblR5cGUpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKHRydWUsIG1ldGhvZC5pc1N0YXRpYygpKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24odHJ1ZSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQotCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGN1ID0gdGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCQlpbnQgaW1wb3J0U3RhcnQgPSBjdS50eXBlc1swXS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwotCQkJCWludCBpbXBvcnRFbmQgPSBpbXBvcnRTdGFydDsKLQkJCQkKLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkKLQkJCQlpZiAoIXByb3Bvc2VTdGF0aWNJbXBvcnQpIHsKLQkJCQkJaWYgKGlzQWxyZWFkeUltcG9ydGVkKSB7Ci0JCQkJCQlpZiAoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikpIHsKLQkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocmVjZWl2ZXJUeXBlLnNvdXJjZU5hbWUsIGNvbXBsZXRpb24sICcuJyk7Ci0JCQkJCQkJCi0JCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOwotCQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBtZXRob2Qub3JpZ2luYWwoKTsKLQkJCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCQkJCQotCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQpKSB7Ci0JCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocmVjZWl2ZXJUeXBlLnNvdXJjZU5hbWUsIGNvbXBsZXRpb24sICcuJyk7Ci0JCQkJCQkKLQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kKSk7Ci0JCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7Ci0JCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJCQlwcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShnZXRTaWduYXR1cmUob3JpZ2luYWwpKTsKLQkJCQkJCX0KLQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOwotCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOwotCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKLQkJCQkJCQotCQkJCQkJY2hhcltdIHR5cGVJbXBvcnRDb21wbGV0aW9uID0gY3JlYXRlSW1wb3J0Q2hhckFycmF5KHR5cGVOYW1lLCBmYWxzZSwgZmFsc2UpOwotCQkJCQkJCi0JCQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgdHlwZUltcG9ydFByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IHJlY2VpdmVyVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOwotCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRUeXBlTmFtZShyZWNlaXZlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVJbXBvcnRDb21wbGV0aW9uKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRGbGFncyhyZWNlaXZlclR5cGUubW9kaWZpZXJzKTsKLQkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRBZGRpdGlvbmFsRmxhZ3MoQ29tcGxldGlvbkZsYWdzLkRlZmF1bHQpOwotCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7Ci0JCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQkKLQkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlSW1wb3J0UHJvcG9zYWx9KTsKLQkJCQkJCQotCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfSU1QT1JUKSkgewotCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKLQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBtZXRob2Qub3JpZ2luYWwoKTsKLQkJCQkJCWlmKG9yaWdpbmFsICE9IG1ldGhvZCkgewotCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOwotCQkJCQkJfQotCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKLQkJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCXByb3Bvc2FsLnNldE5hbWUobWV0aG9kLnNlbGVjdG9yKTsKLQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7Ci0JCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKLQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCQkJCi0JCQkJCQljaGFyW10gbWV0aG9kSW1wb3J0Q29tcGxldGlvbiA9IGNyZWF0ZUltcG9ydENoYXJBcnJheShDaGFyT3BlcmF0aW9uLmNvbmNhdCh0eXBlTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCAnLicpLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQkKLQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBtZXRob2RJbXBvcnRQcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9JTVBPUlQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kKSk7Ci0JCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJCQlwcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShnZXRTaWduYXR1cmUob3JpZ2luYWwpKTsKLQkJCQkJCX0KLQkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOwotCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKG1ldGhvZEltcG9ydENvbXBsZXRpb24pOwotCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7Ci0JCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRBZGRpdGlvbmFsRmxhZ3MoQ29tcGxldGlvbkZsYWdzLlN0YXRpY0ltcG9ydCk7Ci0JCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UoaW1wb3J0U3RhcnQgLSB0aGlzLm9mZnNldCwgaW1wb3J0RW5kIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBtZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7Ci0JCQkJCQkKLQkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXttZXRob2RJbXBvcnRQcm9wb3NhbH0pOwotCQkJCQkJCi0JCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHByZXZpb3VzU3RhcnRQb3NpdGlvbjsKLQkJCX0KLQkJfQotCQotCXByaXZhdGUgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKEJpbmRpbmcgYmluZGluZywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwotCQkJCi0JCQljaGFyW10gcGFja2FnZU5hbWUgPSB0eXBlQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJY2hhcltdIHR5cGVOYW1lID0gdHlwZUJpbmRpbmcucXVhbGlmaWVkU291cmNlTmFtZSgpOwotCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgJy4nKTsKLQkJCQotCQkJcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7Ci0JCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKLQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZUJpbmRpbmcpKTsKLQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCXByb3Bvc2FsLnNldEZsYWdzKHR5cGVCaW5kaW5nLm1vZGlmaWVycyk7Ci0JCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgZW5kIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7Ci0JCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKLQkJCQotCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgJy4nKTsKLQkJCQotCQkJcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOwotCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihwYWNrYWdlTmFtZSk7Ci0JCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgZW5kIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsOwotCX0KLQotCS8vIEhlbHBlciBtZXRob2QgZm9yIGZpbmRNZXRob2RzKGNoYXJbXSwgVHlwZUJpbmRpbmdbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUsIE9iamVjdFZlY3RvciwgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKLQlwcml2YXRlIHZvaWQgZmluZExvY2FsTWV0aG9kc09mU3RhdGljSW1wb3J0cygKLQkJY2hhcltdIG1ldGhvZE5hbWUsCi0JCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLAotCQlTY29wZSBzY29wZSwKLQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKLQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7Ci0JCQotCQlPYmplY3RWZWN0b3IgbmV3TWV0aG9kc0ZvdW5kID0gIG5ldyBPYmplY3RWZWN0b3IoKTsKLQotCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKLQotCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHQ7Ci0KLQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAoIW1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJbWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKLQkJCQljb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQotCQkJCSYmICFtZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKSkpCi0JCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IG1ldGhvZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKLQkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSkgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKLQkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3RoZXJbMV07Ci0JCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCAmJiByZWNlaXZlclR5cGUgPT0gb3RoZXJSZWNlaXZlclR5cGUpCi0JCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgb3RoZXJNZXRob2Quc2VsZWN0b3IsIHRydWUpKSB7Ci0JCQkJCWlmIChsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpLmRvZXNNZXRob2RPdmVycmlkZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgewotCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKLQotCQkJaW50IGxlbmd0aCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKLQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2Qub3JpZ2luYWwoKS5wYXJhbWV0ZXJzW2ldOwotCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKLQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKLQkJCX0KLQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOwotCi0JCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQkJCQotCQkJaW50IHByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJCQotCQkJLy8gbm90aGluZyB0byBpbnNlcnQgLSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBzZWxlY3RvciAmIGFyZ3VtZW50cwotCQkJaWYgKHRoaXMuc291cmNlICE9IG51bGwKLQkJCQkmJiB0aGlzLnNvdXJjZS5sZW5ndGggPiB0aGlzLmVuZFBvc2l0aW9uCi0JCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5lbmRQb3NpdGlvbl0gPT0gJygnKSB7Ci0JCQkJY29tcGxldGlvbiA9IG1ldGhvZC5zZWxlY3RvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG1ldGhvZC5zZWxlY3RvciwgbmV3IGNoYXJbXSB7ICcoJywgJyknIH0pOwotCQkJfQotCQkJCi0JCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1ldGhvZC5yZXR1cm5UeXBlKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKHRydWUsIG1ldGhvZC5pc1N0YXRpYygpKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOwotCQkJCi0JCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7Ci0JCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOwotCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBtZXRob2Qub3JpZ2luYWwoKTsKLQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKLQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7Ci0JCQkJfQotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKLQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKLQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKLQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOwotCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBwcmV2aW91c1N0YXJ0UG9zaXRpb247Ci0JCX0KLQkJCi0JCW1ldGhvZHNGb3VuZC5hZGRBbGwobmV3TWV0aG9kc0ZvdW5kKTsKLQl9Ci0JaW50IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoY2hhcltdIHRva2VuLCBjaGFyW10gcHJvcG9zYWxOYW1lKXsKLQkJaWYgKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCkgewotCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7Ci0JCQkJcmV0dXJuIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRTsKLQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7Ci0JCQkJcmV0dXJuIFJfQ0FTRTsKLQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0b2tlbiwgcHJvcG9zYWxOYW1lKSl7Ci0JCQkJcmV0dXJuIFJfQ0FNRUxfQ0FTRTsKLQkJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLmVxdWFscyh0b2tlbiwgcHJvcG9zYWxOYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIHsKLQkJCQlyZXR1cm4gUl9FWEFDVF9OQU1FOwotCQkJfQotCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBwcm9wb3NhbE5hbWUsIHRydWUgLyogZG8gbm90IGlnbm9yZSBjYXNlICovKSkgewotCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7Ci0JCQkJcmV0dXJuIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIFJfQ0FTRTsKLQkJCX0KLQkJfSBlbHNlIGlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHRva2VuLCBwcm9wb3NhbE5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKSkgewotCQkJcmV0dXJuIFJfRVhBQ1RfTkFNRTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKXsKLQkJaWYodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gUl9BTk5PVEFUSU9OOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQW5ub3RhdGlvblRhcmdldChUeXBlQmluZGluZyB0eXBlQmluZGluZyl7Ci0JCWlmICh0aGlzLmFzc2lzdE5vZGVJc0Fubm90YXRpb24gJiYKLQkJCQkodGhpcy50YXJnZXRlZEVsZW1lbnQgJiBUYWdCaXRzLkFubm90YXRpb25UYXJnZXRNQVNLKSAhPSAwKSB7Ci0JCQlsb25nIHRhcmdldCA9IHR5cGVCaW5kaW5nLmdldEFubm90YXRpb25UYWdCaXRzKCkgJiBUYWdCaXRzLkFubm90YXRpb25UYXJnZXRNQVNLOwotCQkJaWYodGFyZ2V0ID09IDAgfHwgKHRhcmdldCAmIHRoaXMudGFyZ2V0ZWRFbGVtZW50KSAhPSAwKSB7Ci0JCQkJcmV0dXJuIFJfVEFSR0VUOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKXsKLQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJcmV0dXJuIFJfQ0xBU1M7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtKCl7Ci0JCWlmKHRoaXMuYXNzaXN0Tm9kZUlzRW51bSkgewotCQkJcmV0dXJuIFJfRU5VTTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpewotCQlpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgewotCQkJcmV0dXJuIFJfSU5URVJGQUNFOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yTWlzc2luZ0VsZW1lbnRzKGJvb2xlYW4gaGFzUHJvYmxlbXMpIHsKLQkJaWYgKCFoYXNQcm9ibGVtcykgewotCQkJcmV0dXJuIFJfTk9fUFJPQkxFTVM7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWludCBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihib29sZWFuIHByZWZpeFJlcXVpcmVkKSB7Ci0JCWlmKCFwcmVmaXhSZXF1aXJlZCAmJiAhdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKLQkJCXJldHVybiBSX1VOUVVBTElGSUVEOwotCQl9Ci0JCQotCQlpZihwcmVmaXhSZXF1aXJlZCAmJiB0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgewotCQkJcmV0dXJuIFJfUVVBTElGSUVEOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpbnQgY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhpbnQgYWNjZXNzUnVsZUtpbmQpIHsKLQkJaWYoYWNjZXNzUnVsZUtpbmQgPT0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKSB7Ci0JCQlyZXR1cm4gUl9OT05fUkVTVFJJQ1RFRDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvclN0YXRpYyhib29sZWFuIG9ubHlTdGF0aWMsIGJvb2xlYW4gaXNTdGF0aWMpIHsKLQkJaWYodGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgJiYgIW9ubHlTdGF0aWMgJiYgIWlzU3RhdGljKSB7Ci0JCQlyZXR1cm4gUl9OT05fU1RBVElDOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKCl7Ci0JCWlmICh0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbikgewotCQkJcmV0dXJuIFJfRVhDRVBUSU9OOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKGNoYXJbXSBwcm9wb3NhbE5hbWUpewotCQkKLQkJaWYoKHRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uIHx8ICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLkVYQ0VQVElPTikgIT0gMCApJiYKLQkJCShDaGFyT3BlcmF0aW9uLm1hdGNoKEVYQ0VQVElPTl9QQVRURVJOLCBwcm9wb3NhbE5hbWUsIGZhbHNlKSB8fAotCQkJQ2hhck9wZXJhdGlvbi5tYXRjaChFUlJPUl9QQVRURVJOLCBwcm9wb3NhbE5hbWUsIGZhbHNlKSkpIHsgCi0JCQlyZXR1cm4gUl9FWENFUFRJT047Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKFR5cGVCaW5kaW5nIHByb3Bvc2FsVHlwZSl7Ci0JCWlmKHRoaXMuZXhwZWN0ZWRUeXBlcyAhPSBudWxsICYmIHByb3Bvc2FsVHlwZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmV4cGVjdGVkVHlwZXNQdHI7IGkrKykgewotICAgICAgICAgICAgICAgIGludCByZWxldmFuY2UgPSBSX0VYUEVDVEVEX1RZUEU7Ci0JCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5leHBlY3RlZFR5cGVzW2ldLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHByb3Bvc2FsVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKSAmJgotCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCBwcm9wb3NhbFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBSX0VYQUNUX0VYUEVDVEVEX1RZUEU7Ci0JCQkJfQotCQkJCWlmKCh0aGlzLmV4cGVjdGVkVHlwZXNGaWx0ZXIgJiBTVUJUWVBFKSAhPSAwCi0JCQkJCSYmIHByb3Bvc2FsVHlwZS5pc0NvbXBhdGlibGVXaXRoKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXSkpIHsKLQkJCQkJCXJldHVybiByZWxldmFuY2U7Ci0JCQkJfQotCQkJCWlmKCh0aGlzLmV4cGVjdGVkVHlwZXNGaWx0ZXIgJiBTVVBFUlRZUEUpICE9IDAKLQkJCQkJJiYgdGhpcy5leHBlY3RlZFR5cGVzW2ldLmlzQ29tcGF0aWJsZVdpdGgocHJvcG9zYWxUeXBlKSkgewotCQkJCQlyZXR1cm4gcmVsZXZhbmNlOwotCQkJCX0KLQkJCX0KLQkJfSAKLQkJcmV0dXJuIDA7Ci0JfQotCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKXsKLQkJaWYodGhpcy5leHBlY3RlZFR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZXhwZWN0ZWRUeXBlc1B0cjsgaSsrKSB7Ci0JCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5leHBlY3RlZFR5cGVzW2ldLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHBhY2thZ2VOYW1lKSAmJgotCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCB0eXBlTmFtZSkpIHsKLQkJCQkJcmV0dXJuIFJfRVhBQ1RfRVhQRUNURURfVFlQRTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZih0aGlzLmhhc0phdmFMYW5nT2JqZWN0QXNFeHBlY3RlZFR5cGUpIHsKLQkJCQlyZXR1cm4gUl9FWFBFQ1RFRF9UWVBFOwotCQkJfQotCQl9IAotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckluaGVyaXRhbmNlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7Ci0JCWlmIChyZWNlaXZlclR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiBSX05PTl9JTkhFUklURUQ7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKXsKLQkJcmV0dXJuIGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKG51bGwpOwotCX0KLQlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChCaW5kaW5nIGJpbmRpbmcpewotCQlpZih0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5nc1B0cjsgaSsrKSB7Ci0JCQkJaWYodGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NbaV0gPT0gYmluZGluZykgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFJfSU5URVJFU1RJTkc7Ci0JfQotCXByaXZhdGUgdm9pZCBjb21wdXRlVW5pbnRlcmVzdGluZ0JpbmRpbmdzKEFTVE5vZGUgcGFyZW50LCBTY29wZSBzY29wZSl7Ci0JCWlmKHBhcmVudCBpbnN0YW5jZW9mIExvY2FsRGVjbGFyYXRpb24pIHsKLQkJCWFkZFVuaW50ZXJlc3RpbmdCaW5kaW5ncygoKExvY2FsRGVjbGFyYXRpb24pcGFyZW50KS5iaW5kaW5nKTsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7Ci0JCQlhZGRVbmludGVyZXN0aW5nQmluZGluZ3MoKChGaWVsZERlY2xhcmF0aW9uKXBhcmVudCkuYmluZGluZyk7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBmaW5kTGFiZWxzKGNoYXJbXSBsYWJlbCwgY2hhcltdW10gY2hvaWNlcykgewotCQlpZihjaG9pY2VzID09IG51bGwgfHwgY2hvaWNlcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJaW50IGxlbmd0aCA9IGxhYmVsLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGVuZ3RoIDw9IGNob2ljZXNbaV0ubGVuZ3RoCi0JCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobGFiZWwsIGNob2ljZXNbaV0sIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCi0JCQkpKXsKLQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhsYWJlbCwgY2hvaWNlc1tpXSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBrZXl3b3JzCi0JCQkJCi0JCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTEFCRUxfUkVGKSkgewotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5MQUJFTF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJcHJvcG9zYWwuc2V0TmFtZShjaG9pY2VzW2ldKTsKLQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjaG9pY2VzW2ldKTsKLQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1ldGhvZHMoY2hhcltdLCBNZXRob2RCaW5kaW5nW10sIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIFR5cGVCaW5kaW5nKQotCXByaXZhdGUgdm9pZCBmaW5kTG9jYWxNZXRob2REZWNsYXJhdGlvbnMoCi0JCWNoYXJbXSBtZXRob2ROYW1lLAotCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywKLQkJU2NvcGUgc2NvcGUsCi0JCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCi0JCS8vCWJvb2xlYW4gbm9Wb2lkUmV0dXJuVHlwZSwgaG93IGRvIHlvdSBrbm93PwotCQlib29sZWFuIGV4YWN0TWF0Y2gsCi0JCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7Ci0KLQkJT2JqZWN0VmVjdG9yIG5ld01ldGhvZHNGb3VuZCA9ICBuZXcgT2JqZWN0VmVjdG9yKCk7Ci0JCS8vIEluaGVyaXRlZCBtZXRob2RzIHdoaWNoIGFyZSBoaWRkZW4gYnkgc3ViY2xhc3NlcyBhcmUgZmlsdGVyZWQgb3V0Ci0JCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQotCQlpbnQgbWV0aG9kTGVuZ3RoID0gbWV0aG9kTmFtZS5sZW5ndGg7Ci0JCW5leHQgOiBmb3IgKGludCBmID0gbWV0aG9kcy5sZW5ndGg7IC0tZiA+PSAwOykgewotCi0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbZl07Ci0JCQlpZiAobWV0aG9kLmlzU3ludGhldGljKCkpCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkKLQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OwotCQkJCQotCQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICBuZXdNZXRob2RzRm91bmQuYWRkKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgY29udGludWUgbmV4dDsKLSAgICAgICAgICAgIH0KLQkJCQotCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCi0JCQkJCW1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpCi0JCQkJY29udGludWUgbmV4dDsKLQotCQkJLy8JCWlmIChub1ZvaWRSZXR1cm5UeXBlICYmIG1ldGhvZC5yZXR1cm5UeXBlID09IEJhc2VUeXBlcy5Wb2lkQmluZGluZykgY29udGludWUgbmV4dDsKLQkJCWlmKG1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OwotCi0JCQlpZiAoIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIEZha2VJbnZvY2F0aW9uU2l0ZSAsIHNjb3BlKSkgY29udGludWUgbmV4dDsKLQotCQkJaWYgKGV4YWN0TWF0Y2gpIHsKLQkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KLQkJCQkJKSkKLQkJCQkJY29udGludWUgbmV4dDsKLQotCQkJfSBlbHNlIHsKLQotCQkJCWlmIChtZXRob2RMZW5ndGggPiBtZXRob2Quc2VsZWN0b3IubGVuZ3RoKQotCQkJCQljb250aW51ZSBuZXh0OwotCi0JCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlLyogaWdub3JlIGNhc2UgKi8pCi0JCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvcikpKQotCQkJCQljb250aW51ZSBuZXh0OwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gbWV0aG9kc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgewotCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKLQkJCQlpZiAobWV0aG9kID09IG90aGVyTWV0aG9kKQotCQkJCQljb250aW51ZSBuZXh0OwotCi0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgb3RoZXJNZXRob2Quc2VsZWN0b3IsIHRydWUpCi0JCQkJCQkmJiBsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpLmRvZXNNZXRob2RPdmVycmlkZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgewotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0KLQkJCX0KLQotCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChtZXRob2QpOwotCQkJCi0JCQlpbnQgbGVuZ3RoID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOwotCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJY2hhcltdW10gcGFyYW1ldGVyRnVsbFR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1tpXTsKLQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7Ci0JCQkJcGFyYW1ldGVyRnVsbFR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOwotCQkJfQotCi0JCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhtZXRob2QsIHBhcmFtZXRlckZ1bGxUeXBlTmFtZXMpOwotCQkJCi0JCQlpZihtZXRob2QudHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIG1ldGhvZC50eXBlVmFyaWFibGVzLmxlbmd0aCA+IDApIHsKLQkJCQljaGFyW11bXSBleGNsdWRlZE5hbWVzID0gZmluZEVuY2xvc2luZ1R5cGVOYW1lcyhzY29wZSk7Ci0JCQkJY2hhcltdW10gc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lcyhtZXRob2QudHlwZVZhcmlhYmxlcywgZXhjbHVkZWROYW1lcyk7Ci0JCQkJaWYoc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKLQkJCQkJbWV0aG9kID0gbmV3IFBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nKAotCQkJCQkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MsCi0JCQkJCQkJCW1ldGhvZCwKLQkJCQkJCQkJc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzLAotCQkJCQkJCQlzY29wZS5lbnZpcm9ubWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBjb21wbGV0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JCQlpZiAoIWV4YWN0TWF0Y2gpIHsKLQkJCQljcmVhdGVNZXRob2QobWV0aG9kLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlckZ1bGxUeXBlTmFtZXMsIHBhcmFtZXRlck5hbWVzLCBjb21wbGV0aW9uKTsKLQkJCX0KLQotCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKTsKLQkJCXJlbGV2YW5jZSArPSBSX01FVEhPRF9PVkVSSURFOwotCQkJaWYobWV0aG9kLmlzQWJzdHJhY3QoKSkgcmVsZXZhbmNlICs9IFJfQUJTVFJBQ1RfTUVUSE9EOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCQotCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04pKSB7Ci0JCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5jb21wdXRlVW5pcXVlS2V5KCkpOwotCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kKSk7Ci0JCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IG1ldGhvZC5vcmlnaW5hbCgpOwotCQkJCWlmKG9yaWdpbmFsICE9IG1ldGhvZCkgewotCQkJCQlwcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShnZXRTaWduYXR1cmUob3JpZ2luYWwpKTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWwuc2V0S2V5KG1ldGhvZC5jb21wdXRlVW5pcXVlS2V5KCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7Ci0JCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlckZ1bGxUeXBlTmFtZXMpOwotCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOwotCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSk7Ci0JCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOwotCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1ldGhvZC5tb2RpZmllcnMpOwotCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7Ci0JCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQlpZihERUJVRykgewotCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQltZXRob2RzRm91bmQuYWRkQWxsKG5ld01ldGhvZHNGb3VuZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUsIFN0cmluZ0J1ZmZlciBjb21wbGV0aW9uKSB7Ci0JCWNvbXBsZXRpb24uYXBwZW5kKHR5cGVWYXJpYWJsZS5zb3VyY2VOYW1lKTsKLQkJCi0JCWlmICh0eXBlVmFyaWFibGUuc3VwZXJjbGFzcyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzKSB7Ci0JCSAgICBjb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkgICAgY29tcGxldGlvbi5hcHBlbmQoRVhURU5EUyk7Ci0JCSAgICBjb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkgICAgY3JlYXRlVHlwZSh0eXBlVmFyaWFibGUuc3VwZXJjbGFzcywgY29tcGxldGlvbik7Ci0JCX0KLQkJaWYgKHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7Ci0JCSAgIGlmICh0eXBlVmFyaWFibGUuZmlyc3RCb3VuZCAhPSB0eXBlVmFyaWFibGUuc3VwZXJjbGFzcykgewotCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKLQkJCSAgIGNvbXBsZXRpb24uYXBwZW5kKEVYVEVORFMpOwotCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKLQkJICAgfQotCQkgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZVZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJICAgaWYgKGkgPiAwIHx8IHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzKSB7Ci0JCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKLQkJCQkgICBjb21wbGV0aW9uLmFwcGVuZChFWFRFTkRTKTsKLQkJCQkgICBjb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJICAgfQotCQkJICAgY3JlYXRlVHlwZSh0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzW2ldLCBjb21wbGV0aW9uKTsKLQkJICAgfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFN0cmluZ0J1ZmZlciBjb21wbGV0aW9uKSB7Ci0JCWlmICh0eXBlLmlzQmFzZVR5cGUoKSkgewotCQkJY29tcGxldGlvbi5hcHBlbmQodHlwZS5zb3VyY2VOYW1lKCkpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCQkJY29tcGxldGlvbi5hcHBlbmQodHlwZS5zb3VyY2VOYW1lKCkpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNXaWxkY2FyZCgpKSB7Ci0JCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgdHlwZTsKLQkJCWNvbXBsZXRpb24uYXBwZW5kKCc/Jyk7Ci0JCQlzd2l0Y2ggKHdpbGRjYXJkQmluZGluZy5ib3VuZEtpbmQpIHsKLQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6Ci0JCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCQkJCWNvbXBsZXRpb24uYXBwZW5kKEVYVEVORFMpOwotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJCQljcmVhdGVUeXBlKHdpbGRjYXJkQmluZGluZy5ib3VuZCwgY29tcGxldGlvbik7Ci0JCQkJCWlmKHdpbGRjYXJkQmluZGluZy5vdGhlckJvdW5kcyAhPSBudWxsKSB7Ci0JCQkJCQkKLQkJCQkJCWludCBsZW5ndGggPSB3aWxkY2FyZEJpbmRpbmcub3RoZXJCb3VuZHMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoJyYnKTsKLQkJCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJCQkJCWNyZWF0ZVR5cGUod2lsZGNhcmRCaW5kaW5nLm90aGVyQm91bmRzW2ldLCBjb21wbGV0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOgotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJCQljb21wbGV0aW9uLmFwcGVuZChTVVBFUik7Ci0JCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCQkJCWNyZWF0ZVR5cGUod2lsZGNhcmRCaW5kaW5nLmJvdW5kLCBjb21wbGV0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7Ci0JCQljcmVhdGVUeXBlKHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSwgY29tcGxldGlvbik7Ci0JCQlpbnQgZGltID0gdHlwZS5kaW1lbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbTsgaSsrKSB7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQoJ1snKTsKLQkJCQljb21wbGV0aW9uLmFwcGVuZCgnXScpOwotCQkJfQotCQl9IGVsc2UgaWYgKHR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0eXBlOwotCQkJaWYgKHR5cGUuaXNNZW1iZXJUeXBlKCkpIHsKLQkJCQljcmVhdGVUeXBlKHBhcmFtZXRlcml6ZWRUeXBlLmVuY2xvc2luZ1R5cGUoKSwgY29tcGxldGlvbik7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQoJy4nKTsKLQkJCQljb21wbGV0aW9uLmFwcGVuZChwYXJhbWV0ZXJpemVkVHlwZS5zb3VyY2VOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhcmFtZXRlcml6ZWRUeXBlLmdlbmVyaWNUeXBlKCkuY29tcG91bmROYW1lLCAnLicpKTsKLQkJCX0JICAgIAotCQkJaWYgKHBhcmFtZXRlcml6ZWRUeXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQoJzwnKTsKLQkJCSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1ldGVyaXplZFR5cGUuYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkgICAgICAgIGlmIChpICE9IDApIGNvbXBsZXRpb24uYXBwZW5kKCcsJyk7Ci0JCQkgICAgICAgIGNyZWF0ZVR5cGUocGFyYW1ldGVyaXplZFR5cGUuYXJndW1lbnRzW2ldLCBjb21wbGV0aW9uKTsKLQkJCSAgICB9Ci0JCQkgICAgY29tcGxldGlvbi5hcHBlbmQoJz4nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKLQkJCWNoYXJbXSB0eXBlTmFtZSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOwotCQkJaWYobXVzdFF1YWxpZnlUeXBlKAotCQkJCQlwYWNrYWdlTmFtZSwKLQkJCQkJdHlwZS5zb3VyY2VOYW1lKCksCi0JCQkJCXR5cGUuaXNNZW1iZXJUeXBlKCkgPyB0eXBlLmVuY2xvc2luZ1R5cGUoKS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkgOiBudWxsLAotCQkJCQkoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZSkubW9kaWZpZXJzKSkgewotCQkJCWNvbXBsZXRpb24uYXBwZW5kKENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwnLicpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQodHlwZS5zb3VyY2VOYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVWYXJnc1R5cGUoVHlwZUJpbmRpbmcgdHlwZSwgU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24pIHsKLQkJaWYgKHR5cGUuaXNBcnJheVR5cGUoKSkgewotCQkJY3JlYXRlVHlwZSh0eXBlLmxlYWZDb21wb25lbnRUeXBlKCksIGNvbXBsZXRpb24pOwotCQkJaW50IGRpbSA9IHR5cGUuZGltZW5zaW9ucygpIC0gMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltOyBpKyspIHsKLQkJCQljb21wbGV0aW9uLmFwcGVuZCgnWycpOwotCQkJCWNvbXBsZXRpb24uYXBwZW5kKCddJyk7Ci0JCQl9Ci0JCQljb21wbGV0aW9uLmFwcGVuZChWQVJBUkdTKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZVR5cGUodHlwZSwgY29tcGxldGlvbik7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBjaGFyW10gY3JlYXRlSW1wb3J0Q2hhckFycmF5KGNoYXJbXSBpbXBvcnRlZEVsZW1lbnQsIGJvb2xlYW4gaXNTdGF0aWMsIGJvb2xlYW4gb25EZW1hbmQpIHsKLQkJY2hhcltdIHJlc3VsdCA9IElNUE9SVDsKLQkJaWYgKGlzU3RhdGljKSB7Ci0JCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIFNUQVRJQywgJyAnKTsKLQkJfQotCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIGltcG9ydGVkRWxlbWVudCwgJyAnKTsKLQkJaWYgKG9uRGVtYW5kKSB7Ci0JCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIE9OX0RFTUFORCk7Ci0JCX0KLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KHJlc3VsdCwgSU1QT1JUX0VORCk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QsIGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24pIHsKLQkJLy8vLyBNb2RpZmllcnMKLQkJLy8gZmx1c2ggdW5pbnRlcmVzdGluZyBtb2RpZmllcnMKLQkJaW50IGluc2VydGVkTW9kaWZpZXJzID0gbWV0aG9kLm1vZGlmaWVycyAmIH4oQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCk7CQotCQlpZihpbnNlcnRlZE1vZGlmaWVycyAhPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCl7Ci0JCQlBU1ROb2RlLnByaW50TW9kaWZpZXJzKGluc2VydGVkTW9kaWZpZXJzLCBjb21wbGV0aW9uKTsKLQkJfQotCQkKLQkJLy8vLyBUeXBlIHBhcmFtZXRlcnMKLQkJCi0JCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVCaW5kaW5ncyA9IG1ldGhvZC50eXBlVmFyaWFibGVzOwotCQlpZih0eXBlVmFyaWFibGVCaW5kaW5ncyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZUJpbmRpbmdzLmxlbmd0aCAhPSAwKSB7Ci0JCQljb21wbGV0aW9uLmFwcGVuZCgnPCcpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlVmFyaWFibGVCaW5kaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGkgIT0gMCkgewotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnLCcpOwotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJCX0KLQkJCQljcmVhdGVUeXBlVmFyaWFibGUodHlwZVZhcmlhYmxlQmluZGluZ3NbaV0sIGNvbXBsZXRpb24pOwotCQkJfQotCQkJY29tcGxldGlvbi5hcHBlbmQoJz4nKTsKLQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCX0KLQkJCi0JCS8vLy8gUmV0dXJuIHR5cGUKLQkJY3JlYXRlVHlwZShtZXRob2QucmV0dXJuVHlwZSwgY29tcGxldGlvbik7Ci0JCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCQotCQkvLy8vIFNlbGVjdG9yCi0JCWNvbXBsZXRpb24uYXBwZW5kKG1ldGhvZC5zZWxlY3Rvcik7Ci0JCQotCQljb21wbGV0aW9uLmFwcGVuZCgnKCcpOwotCi0JCS8vLy9QYXJhbWV0ZXJzCi0JCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QucGFyYW1ldGVyczsKLQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYoaSAhPSAwKSB7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQoJywnKTsKLQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJfQotCQkJY3JlYXRlVHlwZShwYXJhbWV0ZXJUeXBlc1tpXSwgY29tcGxldGlvbik7Ci0JCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCl7Ci0JCQkJY29tcGxldGlvbi5hcHBlbmQocGFyYW1ldGVyTmFtZXNbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQljb21wbGV0aW9uLmFwcGVuZCgnJScpOwotCQkJfQotCQl9Ci0JCQotCQljb21wbGV0aW9uLmFwcGVuZCgnKScpOwotCQkKLQkJLy8vLyBFeGNlcHRpb25zCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zID0gbWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7Ci0JCQotCQlpZiAoZXhjZXB0aW9ucyAhPSBudWxsICYmIGV4Y2VwdGlvbnMubGVuZ3RoID4gMCl7Ci0JCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJY29tcGxldGlvbi5hcHBlbmQoVEhST1dTKTsKLQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGggOyBpKyspewotCQkJCWlmKGkgIT0gMCkgewotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOwotCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnLCcpOwotCQkJCX0KLQkJCQljcmVhdGVUeXBlKGV4Y2VwdGlvbnNbaV0sIGNvbXBsZXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSWdub3JlZChpbnQga2luZCwgYm9vbGVhbiBtaXNzaW5nVHlwZXMpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChraW5kKSB8fAotCQkJKG1pc3NpbmdUeXBlcyAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKGtpbmQsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmVkKGludCBraW5kKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoa2luZCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0lnbm9yZWQoaW50IGtpbmQsIGludCByZXF1aXJlZFByb3Bvc2FsS2luZCkgewotCQlyZXR1cm4gdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKGtpbmQpIHx8Ci0JCQkhdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKGtpbmQsIHJlcXVpcmVkUHJvcG9zYWxLaW5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRNZXRob2RzKAotCQljaGFyW10gc2VsZWN0b3IsCi0JCVR5cGVCaW5kaW5nW10gdHlwZUFyZ1R5cGVzLAotCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJU2NvcGUgc2NvcGUsCi0JCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCi0JCWJvb2xlYW4gb25seVN0YXRpY01ldGhvZHMsCi0JCWJvb2xlYW4gZXhhY3RNYXRjaCwKLQkJYm9vbGVhbiBpc0NvbXBsZXRpbmdEZWNsYXJhdGlvbiwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCVNjb3BlIGludm9jYXRpb25TY29wZSwKLQkJYm9vbGVhbiBpbXBsaWNpdENhbGwsCi0JCWJvb2xlYW4gc3VwZXJDYWxsLAotCQlib29sZWFuIGNhbkJlUHJlZml4ZWQsCi0JCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCi0JCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpIHsKLQotCQlib29sZWFuIG5vdEluSmF2YWRvYyA9IHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwOwotCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCAmJiBub3RJbkphdmFkb2MpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24pIHsKLQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gcmVjZWl2ZXJUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKLQkJCWlmIChtZXRob2RzICE9IG51bGwpewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZighbWV0aG9kc1tpXS5pc0RlZmF1bHRBYnN0cmFjdCgpKSB7Ci0JCQkJCQltZXRob2RzRm91bmQuYWRkKG1ldGhvZHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOwotCQlpZiAobm90SW5KYXZhZG9jKSB7Ci0JCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlpZiAoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24pIHsKLQkJCQkJZmluZEludGVyZmFjZXNNZXRob2RzKAotCQkJCQkJc2VsZWN0b3IsCi0JCQkJCQl0eXBlQXJnVHlwZXMsCi0JCQkJCQlhcmdUeXBlcywKLQkJCQkJCXJlY2VpdmVyVHlwZSwKLQkJCQkJCWN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpLAotCQkJCQkJc2NvcGUsCi0JCQkJCQltZXRob2RzRm91bmQsCi0JCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKLQkJCQkJCWV4YWN0TWF0Y2gsCi0JCQkJCQlpc0NvbXBsZXRpbmdEZWNsYXJhdGlvbiwKLQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJaW1wbGljaXRDYWxsLAotCQkJCQkJc3VwZXJDYWxsLAotCQkJCQkJY2FuQmVQcmVmaXhlZCwKLQkJCQkJCW1pc3NpbmdFbGVtZW50cywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCQkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbmRJbnRlcmZhY2VzTWV0aG9kcygKLQkJCQkJCXNlbGVjdG9yLAotCQkJCQkJdHlwZUFyZ1R5cGVzLAotCQkJCQkJYXJnVHlwZXMsCi0JCQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJCQluZXcgUmVmZXJlbmNlQmluZGluZ1tde2N1cnJlbnRUeXBlfSwKLQkJCQkJCXNjb3BlLAotCQkJCQkJbWV0aG9kc0ZvdW5kLAotCQkJCQkJb25seVN0YXRpY01ldGhvZHMsCi0JCQkJCQlleGFjdE1hdGNoLAotCQkJCQkJaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCi0JCQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQkJCWludm9jYXRpb25TY29wZSwKLQkJCQkJCWltcGxpY2l0Q2FsbCwKLQkJCQkJCXN1cGVyQ2FsbCwKLQkJCQkJCWNhbkJlUHJlZml4ZWQsCi0JCQkJCQltaXNzaW5nRWxlbWVudHMsCi0JCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKLQkJCQl9Ci0JCQkJCi0JCQkJY3VycmVudFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24pewotCQkJCQlmaW5kSW50ZXJmYWNlc01ldGhvZHMoCi0JCQkJCQlzZWxlY3RvciwKLQkJCQkJCXR5cGVBcmdUeXBlcywKLQkJCQkJCWFyZ1R5cGVzLAotCQkJCQkJcmVjZWl2ZXJUeXBlLAotCQkJCQkJY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCksCi0JCQkJCQlzY29wZSwKLQkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAotCQkJCQkJZXhhY3RNYXRjaCwKLQkJCQkJCWlzQ29tcGxldGluZ0RlY2xhcmF0aW9uLAotCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQlpbXBsaWNpdENhbGwsCi0JCQkJCQlzdXBlckNhbGwsCi0JCQkJCQljYW5CZVByZWZpeGVkLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAotCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7Ci0JCQkJCQotCQkJCQljdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZS5zdXBlcmNsYXNzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJvb2xlYW4gaGFzUG90ZW50aWFsRGVmYXVsdEFic3RyYWN0TWV0aG9kcyA9IHRydWU7Ci0JCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkKLQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOwotCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJCWlmIChpc0NvbXBsZXRpbmdEZWNsYXJhdGlvbil7Ci0JCQkJCWZpbmRMb2NhbE1ldGhvZERlY2xhcmF0aW9ucygKLQkJCQkJCXNlbGVjdG9yLAotCQkJCQkJbWV0aG9kcywKLQkJCQkJCXNjb3BlLAotCQkJCQkJbWV0aG9kc0ZvdW5kLAotCQkJCQkJZXhhY3RNYXRjaCwKLQkJCQkJCXJlY2VpdmVyVHlwZSk7Ci0JCQkJfSBlbHNlewotCQkJCQlmaW5kTG9jYWxNZXRob2RzKAotCQkJCQkJc2VsZWN0b3IsCi0JCQkJCQl0eXBlQXJnVHlwZXMsCi0JCQkJCQlhcmdUeXBlcywKLQkJCQkJCW1ldGhvZHMsCi0JCQkJCQlzY29wZSwKLQkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAotCQkJCQkJZXhhY3RNYXRjaCwKLQkJCQkJCXJlY2VpdmVyVHlwZSwKLQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJaW1wbGljaXRDYWxsLAotCQkJCQkJc3VwZXJDYWxsLAotCQkJCQkJY2FuQmVQcmVmaXhlZCwKLQkJCQkJCW1pc3NpbmdFbGVtZW50cywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKLQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCQkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG5vdEluSmF2YWRvYyAmJgotCQkJCQloYXNQb3RlbnRpYWxEZWZhdWx0QWJzdHJhY3RNZXRob2RzICYmCi0JCQkJCShjdXJyZW50VHlwZS5pc0Fic3RyYWN0KCkgfHwgY3VycmVudFR5cGUuaXNUeXBlVmFyaWFibGUoKSB8fCBjdXJyZW50VHlwZS5pc0ludGVyc2VjdGlvblR5cGUoKSkpewotCQkJCQotCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKLQkJCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwgJiYgY3VycmVudFR5cGUuaXNJbnRlcnNlY3Rpb25UeXBlKCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN1cGVySW50ZXJmYWNlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKXN1cGVySW50ZXJmYWNlc1tpXS5jYXB0dXJlKGludm9jYXRpb25TY29wZSwgaW52b2NhdGlvblNpdGUuc291cmNlRW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWZpbmRJbnRlcmZhY2VzTWV0aG9kcygKLQkJCQkJc2VsZWN0b3IsCi0JCQkJCXR5cGVBcmdUeXBlcywKKwkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04pCisJCQkJCSYmICFyZWYuaXNGaW5hbCgpCisJCQkJCSYmICFyZWYuaXNFbnVtKCkpeworCQkJCWZpbmRBbm9ueW1vdXNUeXBlKAorCQkJCQlyZWYsCiAJCQkJCWFyZ1R5cGVzLAotCQkJCQlyZWNlaXZlclR5cGUsCi0JCQkJCXN1cGVySW50ZXJmYWNlcywKIAkJCQkJc2NvcGUsCi0JCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJb25seVN0YXRpY01ldGhvZHMsCi0JCQkJCWV4YWN0TWF0Y2gsCi0JCQkJCWlzQ29tcGxldGluZ0RlY2xhcmF0aW9uLAotCQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQlpbXBsaWNpdENhbGwsCi0JCQkJCXN1cGVyQ2FsbCwKLQkJCQkJY2FuQmVQcmVmaXhlZCwKLQkJCQkJbWlzc2luZ0VsZW1lbnRzLAotCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCi0JCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCi0JCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWhhc1BvdGVudGlhbERlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBmYWxzZTsKLQkJCX0KLQkJCWlmKGN1cnJlbnRUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewotCQkJCWN1cnJlbnRUeXBlID0gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpY3VycmVudFR5cGUpLmdlbmVyaWNUeXBlKCkuc3VwZXJjbGFzcygpOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKKwkJCQkJYWxsb2NFeHByZXNzaW9uLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlmYWxzZSk7CiAJCQl9CiAJCX0KIAl9Ci0JcHJpdmF0ZSBjaGFyW11bXSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoTWV0aG9kQmluZGluZyBtZXRob2QsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyl7Ci0JCVR5cGVCaW5kaW5nIGVyYXN1cmUgPSAgbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKLQkJaWYoIShlcmFzdXJlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBudWxsOwotCi0JCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gbnVsbDsKLQkJCi0JCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoOwotCi0JCWlmIChsZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCX0KLQkJLy8gbG9vayBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgaWYgaXQgaXMgYXZhaWxhYmxlCi0JCWlmIChlcmFzdXJlIGluc3RhbmNlb2YgU291cmNlVHlwZUJpbmRpbmcpewotCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgZXJhc3VyZTsKLQotCQkJaWYgKHNvdXJjZVR5cGUuc2NvcGUgIT0gbnVsbCl7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHBhcnNlZFR5cGU7Ci0KLQkJCQlpZiAoKHBhcnNlZFR5cGUgPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQpICE9IG51bGwpewotCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBwYXJzZWRUeXBlLmRlY2xhcmF0aW9uT2YobWV0aG9kLm9yaWdpbmFsKCkpOwotCi0JCQkJCWlmIChtZXRob2REZWNsICE9IG51bGwpewotCQkJCQkJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZXRob2REZWNsLmFyZ3VtZW50czsKLQkJCQkJCXBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCi0JCQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKyl7Ci0JCQkJCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBhcmd1bWVudHNbaV0ubmFtZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBsb29rIGludG8gdGhlIG1vZGVsCQkKLQkJaWYocGFyYW1ldGVyTmFtZXMgPT0gbnVsbCl7Ci0JCQkKLQkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZ1R5cGUgPSAoUmVmZXJlbmNlQmluZGluZyllcmFzdXJlOwotCQkJCi0JCQljaGFyW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGJpbmRpbmdUeXBlLmNvbXBvdW5kTmFtZSwgJy4nKTsKLQkJCU9iamVjdCB0eXBlID0gdGhpcy50eXBlQ2FjaGUuZ2V0KGNvbXBvdW5kTmFtZSk7Ci0JCQkKLQkJCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUgPSBudWxsOwotCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYodHlwZSBpbnN0YW5jZW9mIElTb3VyY2VUeXBlKSB7Ci0JCQkJCXNvdXJjZVR5cGUgPSAoSVNvdXJjZVR5cGUpIHR5cGU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGUoYmluZGluZ1R5cGUuY29tcG91bmROYW1lKTsKLQkJCQlpZihhbnN3ZXIgIT0gbnVsbCAmJiBhbnN3ZXIuaXNTb3VyY2VUeXBlKCkpIHsKLQkJCQkJc291cmNlVHlwZSA9IGFuc3dlci5nZXRTb3VyY2VUeXBlcygpWzBdOwotCQkJCQl0aGlzLnR5cGVDYWNoZS5wdXQoY29tcG91bmROYW1lLCBzb3VyY2VUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKHNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlIHR5cGVIYW5kbGUgPSAoKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgc291cmNlVHlwZSkuZ2V0SGFuZGxlKCk7Ci0JCQkJCi0JCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKHBhcmFtZXRlclR5cGVOYW1lc1tpXSwgZmFsc2UpOwotCQkJCX0KLQkJCQlJTWV0aG9kIHNlYXJjaGVkTWV0aG9kID0gdHlwZUhhbmRsZS5nZXRNZXRob2QoU3RyaW5nLnZhbHVlT2YobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpOwotCQkJCUlNZXRob2RbXSBmb3VuZE1ldGhvZHMgPSB0eXBlSGFuZGxlLmZpbmRNZXRob2RzKHNlYXJjaGVkTWV0aG9kKTsKLQkJCQkKLQkJCQlpZihmb3VuZE1ldGhvZHMgIT0gbnVsbCkgewotCQkJCQlpbnQgbGVuID0gZm91bmRNZXRob2RzLmxlbmd0aDsKLQkJCQkJaWYobGVuID09IDEpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCA9IChTb3VyY2VNZXRob2QpIGZvdW5kTWV0aG9kc1swXTsKLQkJCQkJCQlwYXJhbWV0ZXJOYW1lcyA9ICgoU291cmNlTWV0aG9kRWxlbWVudEluZm8pIHNvdXJjZU1ldGhvZC5nZXRFbGVtZW50SW5mbygpKS5nZXRBcmd1bWVudE5hbWVzKCk7Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG1ldGhvZCBkb2Vzbid0IGV4aXN0OiBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyTmFtZXM7Ci0JfQogCQotCXByaXZhdGUgdm9pZCBmaW5kTmVzdGVkVHlwZXMoCi0JCWNoYXJbXSB0eXBlTmFtZSwKLQkJU291cmNlVHlwZUJpbmRpbmcgY3VycmVudFR5cGUsCi0JCVNjb3BlIHNjb3BlLAotCQlib29sZWFuIHByb3Bvc2VBbGxNZW1iZXJUeXBlcywKLQkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQpIHsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm47CisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlLCBBU1ROb2RlIGVuY2xvc2luZ05vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywKKwkJCVNjb3BlIHNjb3BlLCBib29sZWFuIGluc2lkZVR5cGVBbm5vdGF0aW9uKSB7CisJCXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKKwkJQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPQorCQkJKENvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIGFzdE5vZGU7CisJCXRoaXMuY29tcGxldGlvblRva2VuID0gcmVmLmNvbXBsZXRpb25JZGVudGlmaWVyOworCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLnNvdXJjZVBvc2l0aW9ucy5sZW5ndGggLSAxXTsKKwkJCisJCWlmIChxdWFsaWZpZWRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSB7CisJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKwkJCS8vIGNvbXBsZXRlIGZpZWxkIG1lbWJlcnMgd2l0aCBtaXNzaW5nIGZpZWxkcyB0eXBlCisJCQkvLyBjbGFzcyBYIHsKKwkJCS8vICAgTWlzc2luZyBmOworCQkJLy8gICB2b2lkIGZvbygpIHsKKwkJCS8vICAgICBmLnwKKwkJCS8vICAgfQorCQkJLy8gfQorCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwICYmCisJCQkJCSh0aGlzLnJlcXVlc3Rvci5pc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fAorCQkJCQkJCXRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fAorCQkJCQkJCXRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpKSB7CisJCQkJaWYocmVmLnRva2Vucy5sZW5ndGggPT0gMSkgeworCQkJCQlib29sZWFuIGZvdW5kU29tZUZpZWxkcyA9IGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdGaWVsZFR5cGUocmVmLnRva2Vuc1swXSwgc2NvcGUsIHJlZiwgaW5zaWRlVHlwZUFubm90YXRpb24pOwogCi0JCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQkJCQlpZiAoIWZvdW5kU29tZUZpZWxkcykgeworCQkJCQkJCisJCQkJCQljaGVja0NhbmNlbCgpOworCQkJCQkJCisJCQkJCQlmaW5kTWVtYmVyc0Zyb21NaXNzaW5nVHlwZSgKKwkJCQkJCQkJcmVmLnRva2Vuc1swXSwKKwkJCQkJCQkJcmVmLnNvdXJjZVBvc2l0aW9uc1swXSwKKwkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCXJlZiwKKwkJCQkJCQkJcmVmLmlzSW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykgeworCQkJc2V0U291cmNlQW5kVG9rZW5SYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisJCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZykgcXVhbGlmaWVkQmluZGluZykudHlwZTsKKwkJCWlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCAmJiAocmVjZWl2ZXJUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOworCQkJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CiAKLQkJU291cmNlVHlwZUJpbmRpbmcgbmV4dFR5cGVUb0lnbm9yZSA9IG51bGw7Ci0JCXdoaWxlIChzY29wZSAhPSBudWxsKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKKwkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcygKKwkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJcmVjZWl2ZXJUeXBlLmNhcHR1cmUoc2NvcGUsIHJlZi5zb3VyY2VFbmQpLAorCQkJCQkJc2NvcGUsCisJCQkJCQlmaWVsZHNGb3VuZCwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCXJlZiwKKwkJCQkJCXNjb3BlLAorCQkJCQkJZmFsc2UsCisJCQkJCQlmYWxzZSwKKwkJCQkJCW51bGwsCisJCQkJCQludWxsLAorCQkJCQkJbnVsbCwKKwkJCQkJCWZhbHNlLAorCQkJCQkJbnVsbCwKKwkJCQkJCS0xLAorCQkJCQkJLTEpOworCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CiAKLQkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbUNhc3RlZFJlY2VpdmVyKAorCQkJCQkJZW5jbG9zaW5nTm9kZSwKKwkJCQkJCXF1YWxpZmllZEJpbmRpbmcsCisJCQkJCQlzY29wZSwKKwkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQkJcmVmLAorCQkJCQkJc2NvcGUsCisJCQkJCQlyZWYpOwogCi0JCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgotCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgotCQkJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUgPSAoQmxvY2tTY29wZSkgc2NvcGU7Ci0KLQkJCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLnN1YnNjb3BlQ291bnQ7IGkgPCBsZW5ndGg7IGkrKykgewotCi0JCQkJCQlpZiAoYmxvY2tTY29wZS5zdWJzY29wZXNbaV0gaW5zdGFuY2VvZiBDbGFzc1Njb3BlKSB7Ci0JCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0KLQkJCQkJCQkJKChDbGFzc1Njb3BlKSBibG9ja1Njb3BlLnN1YnNjb3Blc1tpXSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwotCi0JCQkJCQkJaWYgKCFsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsKLQkJCQkJCQkJaWYgKHRoaXMuaXNGb3JiaWRkZW4obG9jYWxUeXBlKSkKLQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAodHlwZUxlbmd0aCA+IGxvY2FsVHlwZS5zb3VyY2VOYW1lLmxlbmd0aCkKLQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModHlwZU5hbWUsIGxvY2FsVHlwZS5zb3VyY2VOYW1lLCBmYWxzZS8qIGlnbm9yZSBjYXNlICovKQotCQkJCQkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIGxvY2FsVHlwZS5zb3VyY2VOYW1lKSkpCi0JCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQkJCQkKLQkJCQkJCQkJZm9yIChpbnQgaiA9IHR5cGVzRm91bmQuc2l6ZTsgLS1qID49IDA7KSB7Ci0JCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChqKTsKLQotCQkJCQkJCQkJaWYgKGxvY2FsVHlwZSA9PSBvdGhlclR5cGUpCi0JCQkJCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJCQkJCQkJaWYoIWxvY2FsVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgewotCQkJCQkJCQkJaWYoIWxvY2FsVHlwZS5pc0ludGVyZmFjZSgpICYmICFsb2NhbFR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OwotCQkJCQkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgewotCQkJCQkJCQkJaWYoIWxvY2FsVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0eXBlTmFtZSwgbG9jYWxUeXBlLnNvdXJjZU5hbWUpOwotCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobG9jYWxUeXBlKTsKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24obG9jYWxUeXBlLnNvdXJjZU5hbWUpOwotCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgbmVzdGVkIHR5cGUKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uVGFyZ2V0KGxvY2FsVHlwZSk7Ci0JCQkJCQkJCQotCQkJCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJCQkJCQljcmVhdGVUeXBlUHJvcG9zYWwobG9jYWxUeXBlLCBsb2NhbFR5cGUuc291cmNlTmFtZSwgSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFLCBsb2NhbFR5cGUuc291cmNlTmFtZSwgcmVsZXZhbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KKwkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDAgJiYKKwkJCQkJKHRoaXMucmVxdWVzdG9yLmlzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8CisJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgeworCQkJCWJvb2xlYW4gcHJvcG9zZUZpZWxkID0gIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKTsKKwkJCQlib29sZWFuIHByb3Bvc2VNZXRob2QgPSAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKTsKKwkJCQlpZiAocHJvcG9zZUZpZWxkIHx8IHByb3Bvc2VNZXRob2QpIHsKKwkJCQkJaWYocmVmLnRva2Vucy5sZW5ndGggPT0gMSkgeworCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJCQkJCS8vIGNvbXBsZXRlIGxvY2FsIHZhcmlhYmxlIG1lbWJlcnMgd2l0aCBtaXNzaW5nIHZhcmlhYmxlcyB0eXBlCisJCQkJCQkJLy8gY2xhc3MgWCB7CisJCQkJCQkJLy8gICB2b2lkIGZvbygpIHsKKwkJCQkJCQkvLyAgICAgTWlzc2luZyBmOworCQkJCQkJCS8vICAgICBmLnwKKwkJCQkJCQkvLyAgIH0KKwkJCQkJCQkvLyB9CisJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZUJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmc7CisJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ1R5cGUoCisJCQkJCQkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5kZWNsYXJhdGlvbi50eXBlLAorCQkJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcuZGVjbGFyaW5nU2NvcGUsCisJCQkJCQkJCQlyZWYsCisJCQkJCQkJCQlzY29wZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGNvbXBsZXRlIGZpZWxkIG1lbWJlcnMgd2l0aCBtaXNzaW5nIGZpZWxkcyB0eXBlCisJCQkJCQkJLy8gY2xhc3MgWCB7CisJCQkJCQkJLy8gICBNaXNzaW5nIGY7CisJCQkJCQkJLy8gICB2b2lkIGZvbygpIHsKKwkJCQkJCQkvLyAgICAgZi58CisJCQkJCQkJLy8gICB9CisJCQkJCQkJLy8gfQorCQkJCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdGaWVsZFR5cGUocmVmLnRva2Vuc1swXSwgc2NvcGUsIHJlZiwgaW5zaWRlVHlwZUFubm90YXRpb24pOwogCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6Ci0JCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQkJCWZpbmRNZW1iZXJUeXBlcyh0eXBlTmFtZSwgZW5jbG9zaW5nU291cmNlVHlwZSwgc2NvcGUsIGN1cnJlbnRUeXBlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgcHJvcG9zZUFsbE1lbWJlclR5cGVzLCBuZXh0VHlwZVRvSWdub3JlLCB0eXBlc0ZvdW5kKTsKLQkJCQkJbmV4dFR5cGVUb0lnbm9yZSA9IGVuY2xvc2luZ1NvdXJjZVR5cGU7Ci0JCQkJCWlmICh0eXBlTGVuZ3RoID09IDApCi0JCQkJCQlyZXR1cm47IC8vIGRvIG5vdCBzZWFyY2ggb3V0c2lkZSB0aGUgY2xhc3Mgc2NvcGUgaWYgbm8gcHJlZml4IHdhcyBwcm92aWRlZAotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6Ci0JCQkJCXJldHVybjsKLQkJCX0KLQkJCXNjb3BlID0gc2NvcGUucGFyZW50OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRQYWNrYWdlcyhDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlIHBhY2thZ2VTdGF0ZW1lbnQpIHsKLQotCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlU3RhdGVtZW50LnRva2VucywgJy4nKTsKLQkJaWYgKHRoaXMuY29tcGxldGlvblRva2VuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXNldFNvdXJjZVJhbmdlKHBhY2thZ2VTdGF0ZW1lbnQuc291cmNlU3RhcnQsIHBhY2thZ2VTdGF0ZW1lbnQuc291cmNlRW5kKTsKLQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UodGhpcy5jb21wbGV0aW9uVG9rZW4pLCB0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZFBhcmFtZXRlcml6ZWRUeXBlKFR5cGVSZWZlcmVuY2UgcmVmLCBTY29wZSBzY29wZSkgewotCQlSZWZlcmVuY2VCaW5kaW5nIHJlZkJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgcmVmLnJlc29sdmVkVHlwZTsKLQkJaWYocmVmQmluZGluZyAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJcmVmQmluZGluZy5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KHJlZkJpbmRpbmcpKQotCQkJCXJldHVybjsKLQkJCQotCQkJaW50IGFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEU7Ci0JCQlpZihyZWZCaW5kaW5nLmhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSkgewotCQkJCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uID0gbG9va3VwRW52aXJvbm1lbnQuZ2V0QWNjZXNzUmVzdHJpY3Rpb24ocmVmQmluZGluZyk7Ci0JCQkJaWYoYWNjZXNzUmVzdHJpY3Rpb24gIT0gbnVsbCkgewotCQkJCQlzd2l0Y2ggKGFjY2Vzc1Jlc3RyaWN0aW9uLmdldFByb2JsZW1JZCgpKSB7Ci0JCQkJCQljYXNlIElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZToKLQkJCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRm9yYmlkZGVuUmVmZXJlbmNlKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElQcm9ibGVtLkRpc2NvdXJhZ2VkUmVmZXJlbmNlOgotCQkJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEaXNjb3VyYWdlZFJlZmVyZW5jZSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0RJU0NPVVJBR0VEOwotCQkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCi0JCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhyZWZCaW5kaW5nLnNvdXJjZU5hbWUsIHJlZkJpbmRpbmcuc291cmNlTmFtZSk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUocmVmQmluZGluZyk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgdHlwZSBpbiB0aGUgY3VycmVudCB1bml0Ci0JCQkKLQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJCWNyZWF0ZVR5cGVQcm9wb3NhbChyZWZCaW5kaW5nLCByZWZCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIHJlbGV2YW5jZSk7Ci0JCQl9CisJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgJiYgIShxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykpIHsKKwkJCWJvb2xlYW4gaXNJbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlID0gcmVmLmlzSW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmc7CisJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKworCQkJZmluZE1lbWJlcnMoCisJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCXNjb3BlLAorCQkJCQlyZWYsCisJCQkJCWlzSW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJZmFsc2UpOworCisJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisKKwkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisJCQlzZXRUb2tlblJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKworCQkJLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKKwkJCWZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCAoUGFja2FnZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsIHNjb3BlKTsKIAkJfQogCX0KLQlwcml2YXRlIHZvaWQgZmluZFR5cGVQYXJhbWV0ZXJzKGNoYXJbXSB0b2tlbiwgU2NvcGUgc2NvcGUpIHsKLQkJaWYgKHRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOwotCQkKLQkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbnVsbDsKLQkJd2hpbGUgKHNjb3BlICE9IG51bGwpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAotCQkJdHlwZVBhcmFtZXRlcnMgPSBudWxsOwotCQkJc3dpdGNoIChzY29wZS5raW5kKSB7Ci0JCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgotCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7Ci0JCQkJCWlmKG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotCQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7Ci0JCQkJCQl0eXBlUGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzOwotCQkJCQl9IGVsc2UgaWYobWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKLQkJCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCQkJCXR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6Ci0JCQkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBzY29wZTsKLQkJCQkJdHlwZVBhcmFtZXRlcnMgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQudHlwZVBhcmFtZXRlcnM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6Ci0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCB0eXBlTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOwotCQkJCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKLQkJCQkJCi0JCQkJCWlmKHR5cGVQYXJhbWV0ZXIuYmluZGluZyA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCWlmICh0eXBlTGVuZ3RoID4gdHlwZVBhcmFtZXRlci5uYW1lLmxlbmd0aCkgY29udGludWU7Ci0JCQkJCQotCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCB0eXBlUGFyYW1ldGVyLm5hbWUsIGZhbHNlKQotCQkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godG9rZW4sIHR5cGVQYXJhbWV0ZXIubmFtZSkpKSBjb250aW51ZTsKIAkKLQkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIHR5cGVQYXJhbWV0ZXIubmFtZSk7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZSh0eXBlUGFyYW1ldGVyLnR5cGUgPT0gbnVsbCA/IG51bGwgOnR5cGVQYXJhbWV0ZXIudHlwZS5yZXNvbHZlZFR5cGUpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbih0eXBlUGFyYW1ldGVyLm5hbWUpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm90IHR5cGUgcGFyYW1ldGVyCi0JCQkJCQotCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJCQljcmVhdGVUeXBlUGFyYW1ldGVyUHJvcG9zYWwodHlwZVBhcmFtZXRlciwgcmVsZXZhbmNlKTsKLQkJCQkJfQorCXByaXZhdGUgdm9pZCBjb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKEFTVE5vZGUgYXN0Tm9kZSwgQVNUTm9kZSBhc3ROb2RlUGFyZW50LCBCaW5kaW5nIHF1YWxpZmllZEJpbmRpbmcsCisJCQlTY29wZSBzY29wZSkgeworCQl0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IHRydWU7CisKKwkJQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPQorCQkJKENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIGFzdE5vZGU7CisKKwkJdGhpcy5hc3Npc3ROb2RlSXNDbGFzcyA9IHJlZi5pc0NsYXNzKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uID0gcmVmLmlzRXhjZXB0aW9uKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlID0gcmVmLmlzSW50ZXJmYWNlKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgPSByZWYuaXNDb25zdHJ1Y3RvclR5cGU7CisJCXRoaXMuYXNzaXN0Tm9kZUlzU3VwZXJUeXBlID0gcmVmLmlzU3VwZXJUeXBlKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlID0gYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQpOworCQl0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZUV4Y2x1ZGluZ0Fubm90YXRpb24gPSBhc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQpOworCQkKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSByZWYuY29tcGxldGlvbklkZW50aWZpZXI7CisJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYudG9rZW5zLmxlbmd0aF07CisKKwkJLy8gZ2V0IHRoZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKKwkJaWYgKHF1YWxpZmllZEJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpIHsKKwkJCXNldFNvdXJjZUFuZFRva2VuUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwICYmCisJCQkJCSh0aGlzLnJlcXVlc3Rvci5pc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSkgeworCQkJCWlmKHJlZi50b2tlbnMubGVuZ3RoID09IDEpIHsKKwkJCQkJZmluZE1lbWJlclR5cGVzRnJvbU1pc3NpbmdUeXBlKAorCQkJCQkJCXJlZi50b2tlbnNbMF0sCisJCQkJCQkJcmVmLnNvdXJjZVBvc2l0aW9uc1swXSwKKwkJCQkJCQlzY29wZSk7CiAJCQkJfQogCQkJfQotCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGZpbmRUeXBlc0FuZFBhY2thZ2VzKGNoYXJbXSB0b2tlbiwgU2NvcGUgc2NvcGUsIE9iamVjdFZlY3RvciB0eXBlc0ZvdW5kKSB7CisJCX0gZWxzZSBpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgJiYgIShxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykpIHsKKwkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQlzZXRTb3VyY2VBbmRUb2tlblJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKIAotCQlpZiAodG9rZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRvIG5vdCBwcm9wb3NlIHR5cGUgaWYgY29tcGxldGlvbiB0b2tlbiBpcyBlbXB0eQotCQlib29sZWFuIHNraXAgPSBmYWxzZTsKLQkJaWYgKHRva2VuLmxlbmd0aCA9PSAwICYmIE5PX1RZUEVfQ09NUExFVElPTl9PTl9FTVBUWV9UT0tFTikgewotCQkJaWYoIWFzc2lzdE5vZGVJc0NvbnN0cnVjdG9yICYmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLkVYQ0VQVElPTikgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXNraXAgPSB0cnVlOwotCQl9Ci0JCQotCQlib29sZWFuIHByb3Bvc2VUeXBlID0KLQkJCSF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fAotCQkJKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRikpOwotCQkKLQkJYm9vbGVhbiBwcm9wb3NlQWxsTWVtYmVyVHlwZXMgPSAhdGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvcjsKLQkJCi0JCWlmICghc2tpcCAmJiBwcm9wb3NlVHlwZSAmJiBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gbnVsbCkgewotCQkJZmluZE5lc3RlZFR5cGVzKHRva2VuLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIHNjb3BlLCBwcm9wb3NlQWxsTWVtYmVyVHlwZXMsIHR5cGVzRm91bmQpOwotCQkJaWYoKCFhc3Npc3ROb2RlSXNDb25zdHJ1Y3RvciAmJiAhYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgJiYgdGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDApIHsKLQkJCQkvLyBkb24ndCBwcm9wb3NlIHR5cGUgcGFyYW1ldGVycyBpZiB0aGUgY29tcGxldGlvbiBpcyBhIGNvbnN0cnVjdG9yICgnbmV3IHwnKQotCQkJCWZpbmRUeXBlUGFyYW1ldGVycyh0b2tlbiwgc2NvcGUpOwotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIGlzRW1wdHlQcmVmaXggPSB0b2tlbi5sZW5ndGggPT0gMDsKKwkJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKIAotCQlpZiAoIXNraXAgJiYgcHJvcG9zZVR5cGUgJiYgdGhpcy51bml0U2NvcGUgIT0gbnVsbCkgewotCQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckludm9jYXRpb25UeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkJaWYob3V0ZXJJbnZvY2F0aW9uVHlwZSAhPSBudWxsKSB7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQkJd2hpbGUodGVtcCAhPSBudWxsKSB7Ci0JCQkJCW91dGVySW52b2NhdGlvblR5cGUgPSB0ZW1wOwotCQkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKLQkJCVNvdXJjZVR5cGVCaW5kaW5nW10gdHlwZXMgPSB0aGlzLnVuaXRTY29wZS50b3BMZXZlbFR5cGVzOwotCi0JCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHR5cGVzW2ldOyAKLQkJCQkKLQkJCQlpZihpc0ZvcmJpZGRlbihzb3VyY2VUeXBlKSkgY29udGludWUgbmV4dDsKLQkJCQkKLQkJCQlpZihwcm9wb3NlQWxsTWVtYmVyVHlwZXMgJiYKLQkJCQkJc291cmNlVHlwZSAhPSBvdXRlckludm9jYXRpb25UeXBlKSB7Ci0JCQkJCWZpbmRTdWJNZW1iZXJUeXBlcygKLQkJCQkJCQl0b2tlbiwKLQkJCQkJCQlzb3VyY2VUeXBlLAotCQkJCQkJCXNjb3BlLAorCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbiAmJiBhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7CisJCQkJCWZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KAorCQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKXF1YWxpZmllZEJpbmRpbmcsCiAJCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAotCQkJCQkJCWZhbHNlLAotCQkJCQkJCWZhbHNlLAotCQkJCQkJCWZhbHNlLAorCQkJCQkJCShCbG9ja1Njb3BlKXNjb3BlLAogCQkJCQkJCXR5cGVzRm91bmQpOwogCQkJCX0KIAkJCQkKLQkJCQlpZiAoc291cmNlVHlwZS5zb3VyY2VOYW1lID09IENvbXBsZXRpb25QYXJzZXIuRkFLRV9UWVBFX05BTUUpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJaWYgKHNvdXJjZVR5cGUuc291cmNlTmFtZSA9PSBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKSBjb250aW51ZSBuZXh0OworCQkJCWNoZWNrQ2FuY2VsKCk7CiAKLQkJCQlpZiAodHlwZUxlbmd0aCA+IHNvdXJjZVR5cGUuc291cmNlTmFtZS5sZW5ndGgpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgc291cmNlVHlwZS5zb3VyY2VOYW1lLCBmYWxzZSkKLQkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSkpKSBjb250aW51ZTsKLQkKLQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uICYmICFoYXNQb3NzaWJsZUFubm90YXRpb25UYXJnZXQoc291cmNlVHlwZSwgc2NvcGUpKSB7Ci0JCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaiA9IHR5cGVzRm91bmQuc2l6ZTsgLS1qID49IDA7KSB7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVzRm91bmQuZWxlbWVudEF0KGopOwotCQotCQkJCQlpZiAoc291cmNlVHlwZSA9PSBvdGhlclR5cGUpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJfQotCQkJCQotCQkJCXRoaXMua25vd25UeXBlcy5wdXQoQ2hhck9wZXJhdGlvbi5jb25jYXQoc291cmNlVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKSwgJy4nKSwgdGhpcyk7Ci0JCQkJCi0JCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJCQlpZighc291cmNlVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7Ci0JCQkJCWlmKCFzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIXNvdXJjZVR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OwotCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7Ci0JCQkJCWlmKCFzb3VyY2VUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKLQkJCQl9IGVsc2UgaWYgKGlzRW1wdHlQcmVmaXggJiYgdGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24pIHsKLQkJCQkJaWYgKHNvdXJjZVR5cGUuZmluZFN1cGVyVHlwZUVyYXNpbmdUbyhUeXBlSWRzLlRfSmF2YUxhbmdUaHJvd2FibGUsIHRydWUpID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHNvdXJjZVR5cGUpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciB0eXBlIGluIHRoZSBjdXJyZW50IHVuaXQKLQotCQkJCWlmIChzb3VyY2VUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgewotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKTsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uVGFyZ2V0KHNvdXJjZVR5cGUpOwotCQkJCX0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7Ci0JCQkJfSBlbHNlIGlmKHNvdXJjZVR5cGUuaXNDbGFzcygpKXsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihzb3VyY2VUeXBlLnNvdXJjZU5hbWUpOwotCQkJCX0KLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQlpZihwcm9wb3NlVHlwZSkgewotCQkJCQljaGFyW10gdHlwZU5hbWUgPSBzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKTsKLQkJCQkJY3JlYXRlVHlwZVByb3Bvc2FsKHNvdXJjZVR5cGUsIHR5cGVOYW1lLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsIHR5cGVOYW1lLCByZWxldmFuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYoIXNraXAgJiYgcHJvcG9zZVR5cGUpIHsKLQkJCXRoaXMuZmluZFR5cGVzRnJvbVN0YXRpY0ltcG9ydHModG9rZW4sIHNjb3BlLCBwcm9wb3NlQWxsTWVtYmVyVHlwZXMsIHR5cGVzRm91bmQpOwotCQl9Ci0JCQotCQlpZiAoaXNFbXB0eVByZWZpeCAmJiAhdGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7Ci0JCQlpZihwcm9wb3NlVHlwZSAmJiB0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPiAtMSkgewotCQkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmV4cGVjdGVkVHlwZXNQdHI7IGkrKykgewotCQkJCQlpZih0aGlzLmV4cGVjdGVkVHlwZXNbaV0gaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZkJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZyl0aGlzLmV4cGVjdGVkVHlwZXNbaV07Ci0JCQkJCQkKLQkJCQkJCWlmKHJlZkJpbmRpbmcuaXNUeXBlVmFyaWFibGUoKSAmJiBhc3Npc3ROb2RlSXNDb25zdHJ1Y3RvcikgewotCQkJCQkJCS8vIGRvbid0IHByb3Bvc2UgdHlwZSB2YXJpYWJsZSBpZiB0aGUgY29tcGxldGlvbiBpcyBhIGNvbnN0cnVjdG9yICgnbmV3IHwnKQotCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKLQkJCQkJCQkJcmVmQmluZGluZy5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCi0JCQkJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KHJlZkJpbmRpbmcpKQotCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkKLQkJCQkJCWludCBhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFOwotCQkJCQkJaWYocmVmQmluZGluZy5oYXNSZXN0cmljdGVkQWNjZXNzKCkpIHsKLQkJCQkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbiA9IGxvb2t1cEVudmlyb25tZW50LmdldEFjY2Vzc1Jlc3RyaWN0aW9uKHJlZkJpbmRpbmcpOwotCQkJCQkJCWlmKGFjY2Vzc1Jlc3RyaWN0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJc3dpdGNoIChhY2Nlc3NSZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSkgewotCQkJCQkJCQkJY2FzZSBJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2U6Ci0JCQkJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0ZvcmJpZGRlblJlZmVyZW5jZSkgewotCQkJCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19OT05fQUNDRVNTSUJMRTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgSVByb2JsZW0uRGlzY291cmFnZWRSZWZlcmVuY2U6Ci0JCQkJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0Rpc2NvdXJhZ2VkUmVmZXJlbmNlKSB7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0RJU0NPVVJBR0VEOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzRm91bmQuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVGb3VuZCA9IChSZWZlcmVuY2VCaW5kaW5nKXR5cGVzRm91bmQuZWxlbWVudEF0KGopOwotCQkJCQkJCWlmICh0eXBlRm91bmQgPT0gcmVmQmluZGluZykgewotCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJYm9vbGVhbiBpblNhbWVVbml0ID0gdGhpcy51bml0U2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZCaW5kaW5nKTsKLQkJCQkJCQotCQkJCQkJLy8gdG9wIGxldmVsIHR5cGVzIG9mIHRoZSBjdXJyZW50IHVuaXQgYXJlIGFscmVhZHkgcHJvcG9zZWQuCi0JCQkJCQlpZihza2lwIHx8ICFpblNhbWVVbml0IHx8IChpblNhbWVVbml0ICYmIHJlZkJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpKSB7Ci0JCQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gcmVmQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCQkJCWNoYXJbXSB0eXBlTmFtZSA9IHJlZkJpbmRpbmcuc291cmNlTmFtZSgpOwotCQkJCQkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IHR5cGVOYW1lOwotCQkJCQkJCQotCQkJCQkJCWJvb2xlYW4gaXNRdWFsaWZpZWQgPSBmYWxzZTsKLQkJCQkJCQlpZiAoIXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlICYmICFyZWZCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQkJCQkJCWlmIChtdXN0UXVhbGlmeVR5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBudWxsLCByZWZCaW5kaW5nLm1vZGlmaWVycykpIHsKLQkJCQkJCQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJCQkJCQkJCWlmICh0aGlzLnVuaXRTY29wZSAhPSBudWxsICYmIHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKLQkJCQkJCQkJCQkJY29udGludWUgbmV4dDsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQKLQkJCQkJCQkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOwotCQkJCQkJCQkJaXNRdWFsaWZpZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmKHRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MpIHsKLQkJCQkJCQkJaWYoIXJlZkJpbmRpbmcuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OwotCQkJCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgewotCQkJCQkJCQlpZighcmVmQmluZGluZy5pc0ludGVyZmFjZSgpICYmICFyZWZCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKLQkJCQkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgewotCQkJCQkJCQlpZighcmVmQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCB0eXBlTmFtZSk7Ci0JCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHJlZkJpbmRpbmcpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihpc1F1YWxpZmllZCk7Ci0JCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYocmVmQmluZGluZy5pc0NsYXNzKCkpIHsKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOwotCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbih0eXBlTmFtZSk7Ci0JCQkJCQkJfSBlbHNlIGlmKHJlZkJpbmRpbmcuaXNFbnVtKCkpIHsKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtKCk7Ci0JCQkJCQkJfSBlbHNlIGlmKHJlZkJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgewotCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7Ci0JCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHRoaXMuY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShyZWZCaW5kaW5nKSk7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOwotCQkJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb25OYW1lKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MocmVmQmluZGluZy5tb2RpZmllcnMpOwotCQkJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJCQlwcm9wb3NhbC5zZXRBY2Nlc3NpYmlsaXR5KGFjY2Vzc2liaWxpdHkpOwotCQkJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0gZWxzZSB7Ci0JCQlpZighaXNFbXB0eVByZWZpeCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgewotCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMCB8fCAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5CQVNFX1RZUEVTKSAhPSAwKSB7Ci0JCQkJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgQkFTRV9UWVBFX05BTUVTLCBmYWxzZSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCWlmKHByb3Bvc2VUeXBlKSB7Ci0JCQkJaW50IGwgPSB0eXBlc0ZvdW5kLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVGb3VuZCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChpKTsKLQkJCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPQotCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQkJCXR5cGVGb3VuZC5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCQl0eXBlRm91bmQucXVhbGlmaWVkU291cmNlTmFtZSgpLCAKLQkJCQkJCQkJJy4nKTsKLQkJCQkJdGhpcy5rbm93blR5cGVzLnB1dChmdWxseVF1YWxpZmllZFR5cGVOYW1lLCB0aGlzKTsKLQkJCQl9Ci0JCQkJaW50IHNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEU7Ci0JCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJCQlzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzsKLQkJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UpIHsKLQkJCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFX0FORF9BTk5PVEFUSU9OOwotCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0VudW0pIHsKLQkJCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuRU5VTTsKLQkJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7Ci0JCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkFOTk9UQVRJT05fVFlQRTsKLQkJCQl9Ci0JCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKAotCQkJCQkJdG9rZW4sCi0JCQkJCQlwcm9wb3NlQWxsTWVtYmVyVHlwZXMsCi0JCQkJCQl0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2gsCi0JCQkJCQlzZWFyY2hGb3IsCi0JCQkJCQl0aGlzKTsKLQkJCQlhY2NlcHRUeXBlcyhzY29wZSk7Ci0JCQl9Ci0JCQlpZighaXNFbXB0eVByZWZpeCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKLQkJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXModG9rZW4sIHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKAotCQljaGFyW10gdG9rZW4sCi0JCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLAotCQlTY29wZSBzY29wZSkgewotCi0JCWJvb2xlYW4gcHJvcG9zZVR5cGUgPQotCQkJIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8Ci0JCQkoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSk7Ci0JCQotCQljaGFyW10gcXVhbGlmaWVkTmFtZSA9Ci0JCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lLCB0b2tlbiwgJy4nKTsKLQotCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGggPT0gMCkgewotCQkJaW50IGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlxdWFsaWZpZWROYW1lLAotCQkJCTAsCi0JCQkJcXVhbGlmaWVkTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLAotCQkJCTAsCi0JCQkJbGVuZ3RoKTsKLQkJCXF1YWxpZmllZE5hbWVbbGVuZ3RoXSA9ICcuJzsKLQkJfQotCQkKLQkJdGhpcy5xdWFsaWZpZWRDb21wbGV0aW9uVG9rZW4gPSBxdWFsaWZpZWROYW1lOwotCQkKLQkJaWYgKHByb3Bvc2VUeXBlICYmIHRoaXMudW5pdFNjb3BlICE9IG51bGwpIHsKLQkJCWludCB0eXBlTGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7Ci0JCQlTb3VyY2VUeXBlQmluZGluZ1tdIHR5cGVzID0gdGhpcy51bml0U2NvcGUudG9wTGV2ZWxUeXBlczsKLQotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHR5cGVzW2ldOyAKLQkKLQkJCQljaGFyW10gcXVhbGlmaWVkU291cmNlVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoc291cmNlVHlwZS5jb21wb3VuZE5hbWUsICcuJyk7Ci0JCQkJCi0JCQkJaWYgKHNvdXJjZVR5cGUuc291cmNlTmFtZSA9PSBDb21wbGV0aW9uUGFyc2VyLkZBS0VfVFlQRV9OQU1FKSBjb250aW51ZTsKLQkJCQlpZiAoc291cmNlVHlwZS5zb3VyY2VOYW1lID09IFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUUpIGNvbnRpbnVlOwotCQkJCWlmICh0eXBlTGVuZ3RoID4gcXVhbGlmaWVkU291cmNlVHlwZU5hbWUubGVuZ3RoKSBjb250aW51ZTsKLQkJCQlpZiAoIShwYWNrYWdlQmluZGluZyA9PSBzb3VyY2VUeXBlLmdldFBhY2thZ2UoKSkpIGNvbnRpbnVlOwotCi0JCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWROYW1lLCBxdWFsaWZpZWRTb3VyY2VUeXBlTmFtZSwgZmFsc2UpCi0JCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUpKSkJY29udGludWU7Ci0JCQkJCi0JCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCi0JCQkJCQlzb3VyY2VUeXBlLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKLQkJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KHNvdXJjZVR5cGUpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlpbnQgYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRTsKLQkJCQlpZihzb3VyY2VUeXBlLmhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSkgewotCQkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbiA9IGxvb2t1cEVudmlyb25tZW50LmdldEFjY2Vzc1Jlc3RyaWN0aW9uKHNvdXJjZVR5cGUpOwotCQkJCQlpZihhY2Nlc3NSZXN0cmljdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2ggKGFjY2Vzc1Jlc3RyaWN0aW9uLmdldFByb2JsZW1JZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2U6Ci0JCQkJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tGb3JiaWRkZW5SZWZlcmVuY2UpIHsKLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX05PTl9BQ0NFU1NJQkxFOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElQcm9ibGVtLkRpc2NvdXJhZ2VkUmVmZXJlbmNlOgotCQkJCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGlzY291cmFnZWRSZWZlcmVuY2UpIHsKLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0RJU0NPVVJBR0VEOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmtub3duVHlwZXMucHV0KENoYXJPcGVyYXRpb24uY29uY2F0KHNvdXJjZVR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgc291cmNlVHlwZS5zb3VyY2VOYW1lKCksICcuJyksIHRoaXMpOwotCi0JCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcocXVhbGlmaWVkTmFtZSwgcXVhbGlmaWVkU291cmNlVHlwZU5hbWUpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShzb3VyY2VUeXBlKTsKLQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOwotCQkJCQotCQkJCWlmIChzb3VyY2VUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgewotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKTsKLQkJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOwotCQkJCX0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpIHsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihzb3VyY2VUeXBlLnNvdXJjZU5hbWUpOwotCQkJCX0KLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQlpZihwcm9wb3NlVHlwZSkgewotCQkJCQljaGFyW10gdHlwZU5hbWUgPSBzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKTsKLQkJCQkJY3JlYXRlVHlwZVByb3Bvc2FsKHNvdXJjZVR5cGUsIHR5cGVOYW1lLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsIHR5cGVOYW1lLCByZWxldmFuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYocHJvcG9zZVR5cGUpIHsKLQkJCWludCBzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFOwotCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTOwotCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7Ci0JCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFX0FORF9BTk5PVEFUSU9OOwotCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzRW51bSkgewotCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkVOVU07Ci0JCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7Ci0JCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFOwotCQkJfQotCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKAotCQkJCQlxdWFsaWZpZWROYW1lLAorCQkJCWZpbmRNZW1iZXJUeXBlcygKKwkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQlzY29wZSwKKwkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAogCQkJCQlmYWxzZSwKLQkJCQkJdGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoLAotCQkJCQlzZWFyY2hGb3IsCi0JCQkJCXRoaXMpOwotCQkJYWNjZXB0VHlwZXMoc2NvcGUpOwotCQl9Ci0JCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlBBQ0tBR0VfUkVGKSkgewotCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKHF1YWxpZmllZE5hbWUsIHRoaXMpOworCQkJCQlmYWxzZSwKKwkJCQkJdHlwZXNGb3VuZCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJZmFsc2UpOworCQkJfQorCQl9IGVsc2UgaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCisJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJc2V0VG9rZW5SYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkvLyByZXBsYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgorCQkJZmluZFR5cGVzQW5kU3VicGFja2FnZXModGhpcy5jb21wbGV0aW9uVG9rZW4sIChQYWNrYWdlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQl9CiAJfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRUeXBlc0Zyb21TdGF0aWNJbXBvcnRzKGNoYXJbXSB0b2tlbiwgU2NvcGUgc2NvcGUsIGJvb2xlYW4gcHJvcG9zZUFsbE1lbWJlclR5cGVzLCBPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCkgewotCQlJbXBvcnRCaW5kaW5nW10gaW1wb3J0QmluZGluZ3MgPSBzY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLmltcG9ydHM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0QmluZGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IGltcG9ydEJpbmRpbmdzW2ldOwotCQkJaWYoaW1wb3J0QmluZGluZy5pc1ZhbGlkQmluZGluZygpICYmIGltcG9ydEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCUJpbmRpbmcgYmluZGluZyA9IGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQ7Ci0JCQkJaWYoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQlpZihpbXBvcnRCaW5kaW5nLm9uRGVtYW5kKSB7Ci0JCQkJCQlpZigoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLlRZUEUpICE9IDApIHsKLQkJCQkJCQl0aGlzLmZpbmRNZW1iZXJUeXBlcygKLQkJCQkJCQkJCXRva2VuLAotCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcsCi0JCQkJCQkJCQlzY29wZSwKLQkJCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKLQkJCQkJCQkJCXRydWUsCi0JCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJCXRydWUsCi0JCQkJCQkJCQl0cnVlLAotCQkJCQkJCQkJcHJvcG9zZUFsbE1lbWJlclR5cGVzLAotCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCXR5cGVzRm91bmQpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKChiaW5kaW5nLmtpbmQoKSAmIEJpbmRpbmcuVFlQRSkgIT0gMCkgewotCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKLQkJCQkJCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKLQkJCQkJCQkKLQkJCQkJCQlpZiAoIXR5cGVCaW5kaW5nLmlzU3RhdGljKCkpIGNvbnRpbnVlOwotCQkJCQkJCQotCQkJCQkJCWlmICh0eXBlTGVuZ3RoID4gdHlwZUJpbmRpbmcuc291cmNlTmFtZS5sZW5ndGgpCWNvbnRpbnVlOwotCQkJCQkJCQotCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUsIGZhbHNlKQotCQkJCQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0b2tlbiwgdHlwZUJpbmRpbmcuc291cmNlTmFtZSkpKQljb250aW51ZTsKLQkJCQkJCQkKLQkJCQkJCQlpZiAodHlwZXNGb3VuZC5jb250YWlucyh0eXBlQmluZGluZykpICBjb250aW51ZTsKLQkJCQkJCQkKLQkJCQkJCQl0eXBlc0ZvdW5kLmFkZCh0eXBlQmluZGluZyk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgewotCQkJCQkJCQlpZighdHlwZUJpbmRpbmcuaXNDbGFzcygpKSBjb250aW51ZTsKLQkJCQkJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UpIHsKLQkJCQkJCQkJaWYoIXR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWU7Ci0JCQkJCQkJfSBlbHNlIGlmICh0aGlzLmFzc2lzdE5vZGVJc0Fubm90YXRpb24pIHsKLQkJCQkJCQkJaWYoIXR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCB0eXBlQmluZGluZy5zb3VyY2VOYW1lKTsKLQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUodHlwZUJpbmRpbmcpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKLQkJCQkJCQkKLQkJCQkJCQlpZiAodHlwZUJpbmRpbmcuaXNDbGFzcygpKSB7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKLQkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24odHlwZUJpbmRpbmcuc291cmNlTmFtZSk7Ci0JCQkJCQkJfSBlbHNlIGlmKHR5cGVCaW5kaW5nLmlzRW51bSgpKSB7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bSgpOwotCQkJCQkJCX0gZWxzZSBpZih0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKLQkJCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gdGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUodHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZUJpbmRpbmcpKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUodHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24odHlwZUJpbmRpbmcuc291cmNlTmFtZSgpKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3ModHlwZUJpbmRpbmcubW9kaWZpZXJzKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CisJCisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlLCBBU1ROb2RlIGFzdE5vZGVQYXJlbnQsIFNjb3BlIHNjb3BlLAorCQkJYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbikgeworCQlDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UgPSAoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgYXN0Tm9kZTsKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBzaW5nbGVOYW1lUmVmZXJlbmNlLnRva2VuOworCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFN3aXRjaFN0YXRlbWVudCA/IChTd2l0Y2hTdGF0ZW1lbnQpIGFzdE5vZGVQYXJlbnQgOiBudWxsOworCQlpZiAoc3dpdGNoU3RhdGVtZW50ICE9IG51bGwKKwkJCQkmJiBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgIT0gbnVsbAorCQkJCSYmIHN3aXRjaFN0YXRlbWVudC5leHByZXNzaW9uLnJlc29sdmVkVHlwZS5pc0VudW0oKSkgeworCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikpIHsKKwkJCQl0aGlzLmFzc2lzdE5vZGVJc0VudW0gPSB0cnVlOworCQkJCWZpbmRFbnVtQ29uc3RhbnRzRnJvbVN3aXRoU3RhdGVtZW50KHRoaXMuY29tcGxldGlvblRva2VuLCAoU3dpdGNoU3RhdGVtZW50KSBhc3ROb2RlUGFyZW50KTsKIAkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlc0FuZE1ldGhvZHMoCi0JCWNoYXJbXSB0b2tlbiwKLQkJU2NvcGUgc2NvcGUsCi0JCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAotCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCi0JCWJvb2xlYW4gaW5zaWRlVHlwZUFubm90YXRpb24sCi0JCWJvb2xlYW4gaW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSkgewotCi0JCWlmICh0b2tlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFNob3VsZCBsb2NhbCB2YXJpYWJsZXMgaGlkZSBmaWVsZHMgZnJvbSB0aGUgcmVjZWl2ZXIgdHlwZSBvciBhbnkgb2YgaXRzIGVuY2xvc2luZyB0eXBlcz8KLQkJLy8gd2Uga25vdyBpdHMgYW4gaW1wbGljaXQgZmllbGQvbWV0aG9kIGFjY2Vzcy4uLiBzZWUgQmxvY2tTY29wZSBnZXRCaW5kaW5nL2dldEltcGxpY2l0TWV0aG9kCi0KLQkJYm9vbGVhbiBzdGF0aWNzT25seSA9IGZhbHNlOwotCQkvLyBuZWVkIHRvIGtub3cgaWYgd2UncmUgaW4gYSBzdGF0aWMgY29udGV4dCAob3IgaW5zaWRlIGEgY29uc3RydWN0b3IpCi0JCWludCB0b2tlbkxlbmd0aCA9IHRva2VuLmxlbmd0aDsKLQotCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7Ci0JCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKLQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKLQotCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKLQotCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTE9DQUxfVkFSSUFCTEVfUkVGKSkgewotCQkJZG9uZTEgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCi0JCi0JCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgewotCQotCQkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6Ci0JCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQotCQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsKLQkJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7Ci0JCi0JCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgotCQkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIGN1cnJlbnRTY29wZTsKLQkKLQkJCQkJCW5leHQgOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmxvY2tTY29wZS5sb2NhbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IGJsb2NrU2NvcGUubG9jYWxzW2ldOwotCQotCQkJCQkJCWlmIChsb2NhbCA9PSBudWxsKQotCQkJCQkJCQlicmVhayBuZXh0OwotCQotCQkJCQkJCWlmICh0b2tlbkxlbmd0aCA+IGxvY2FsLm5hbWUubGVuZ3RoKQotCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQotCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGxvY2FsLm5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKQotCQkJCQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0b2tlbiwgbG9jYWwubmFtZSkpKQotCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQotCQkJCQkJCWlmIChsb2NhbC5pc1NlY3JldCgpKQotCQkJCQkJCQljb250aW51ZSBuZXh0OwotCQotCQkJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgbG9jYWxzRm91bmQuc2l6ZTsgZisrKSB7Ci0JCQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIG90aGVyTG9jYWwgPQotCQkJCQkJCQkJKExvY2FsVmFyaWFibGVCaW5kaW5nKSBsb2NhbHNGb3VuZC5lbGVtZW50QXQoZik7Ci0JCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhvdGhlckxvY2FsLm5hbWUsIGxvY2FsLm5hbWUsIHRydWUpKQotCQkJCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJCQl9Ci0JCQkJCQkJbG9jYWxzRm91bmQuYWRkKGxvY2FsKTsKLQkKLQkJCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKLQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwobG9jYWwpOwotCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBsb2NhbC5uYW1lKTsKLQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobG9jYWwudHlwZSk7Ci0JCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKLQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGxvY2FsIHZhcmlhYmxlCi0JCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTE9DQUxfVkFSSUFCTEVfUkVGKSkgewotCQkJCQkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5MT0NBTF9WQVJJQUJMRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKAotCQkJCQkJCQkJbG9jYWwudHlwZSA9PSBudWxsCi0JCQkJCQkJCQk/IGNyZWF0ZVR5cGVTaWduYXR1cmUoCi0JCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKLQkJCQkJCQkJCQkJbG9jYWwuZGVjbGFyYXRpb24udHlwZS50b1N0cmluZygpLnRvQ2hhckFycmF5KCkpCi0JCQkJCQkJCQk6IGdldFNpZ25hdHVyZShsb2NhbC50eXBlKSk7Ci0JCQkJCQkJCWlmKGxvY2FsLnR5cGUgPT0gbnVsbCkgewotCQkJCQkJCQkJLy9wcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShudWxsKTsKLQkJCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGxvY2FsLmRlY2xhcmF0aW9uLnR5cGUudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGxvY2FsLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQkJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShsb2NhbC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShsb2NhbC5uYW1lKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihsb2NhbC5uYW1lKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobG9jYWwubW9kaWZpZXJzKTsKLQkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKLQkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkKLQkJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoKLQkJCQkJCWJyZWFrIGRvbmUxOwotCQkJCX0KLQkJCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OwotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIHByb3Bvc2VGaWVsZCA9ICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRik7Ci0JCWJvb2xlYW4gcHJvcG9zZU1ldGhvZCA9ICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpOwotCQkKLQkJc3RhdGljc09ubHkgPSBmYWxzZTsKLQkJY3VycmVudFNjb3BlID0gc2NvcGU7Ci0KLQkJaWYocHJvcG9zZUZpZWxkIHx8IHByb3Bvc2VNZXRob2QpIHsKLQkJCWRvbmUyIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAotCQotCQkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKLQkJCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgotCQkJCQkJLy8gaGFuZGxlIHRoZSBlcnJvciBjYXNlIGluc2lkZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIChzZWUgTWV0aG9kU2NvcGU+PmZpbmRGaWVsZCkKLQkJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGU7Ci0JCQkJCQlzdGF0aWNzT25seSB8PSBtZXRob2RTY29wZS5pc1N0YXRpYyB8IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgotCQkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsKLQkJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKLQkJCQkJCS8qCQkJCWlmICh0b2tlbkxlbmd0aCA9PSAwKSB7IC8vIG9ubHkgc2VhcmNoIGluc2lkZSB0aGUgdHlwZSBpdHNlbGYgaWYgbm8gcHJlZml4IHdhcyBwcm92aWRlZAotCQkJCQkJCQkJCQlmaW5kRmllbGRzKHRva2VuLCBlbmNsb3NpbmdUeXBlLmZpZWxkcygpLCBjbGFzc1Njb3BlLCBmaWVsZHNGb3VuZCwgc3RhdGljc09ubHkpOwotCQkJCQkJCQkJCQlmaW5kTWV0aG9kcyh0b2tlbiwgZW5jbG9zaW5nVHlwZS5tZXRob2RzKCksIGNsYXNzU2NvcGUsIG1ldGhvZHNGb3VuZCwgc3RhdGljc09ubHksIGZhbHNlKTsKLQkJCQkJCQkJCQkJYnJlYWsgZG9uZTsKLQkJCQkJCQkJCQl9IGVsc2UgeyAqLwotCQkJCQkJaWYoIWluc2lkZVR5cGVBbm5vdGF0aW9uKSB7Ci0JCQkJCQkJaWYocHJvcG9zZUZpZWxkKSB7Ci0JCQkJCQkJCWZpbmRGaWVsZHMoCi0JCQkJCQkJCQl0b2tlbiwKLQkJCQkJCQkJCWVuY2xvc2luZ1R5cGUsCi0JCQkJCQkJCQljbGFzc1Njb3BlLAotCQkJCQkJCQkJZmllbGRzRm91bmQsCi0JCQkJCQkJCQlsb2NhbHNGb3VuZCwKLQkJCQkJCQkJCXN0YXRpY3NPbmx5LAotCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQkJCQl0cnVlLAotCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQludWxsLAotCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYocHJvcG9zZU1ldGhvZCAmJiAhaW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSkgewotCQkJCQkJCQlmaW5kTWV0aG9kcygKLQkJCQkJCQkJCXRva2VuLAotCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQllbmNsb3NpbmdUeXBlLAotCQkJCQkJCQkJY2xhc3NTY29wZSwKLQkJCQkJCQkJCW1ldGhvZHNGb3VuZCwKLQkJCQkJCQkJCXN0YXRpY3NPbmx5LAotCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCWZhbHNlLAotCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQludWxsLAotCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7Ci0JCQkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOwotCQkJCQkJLy8JCQkJfQotCQkJCQkJYnJlYWs7Ci0JCi0JCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6Ci0JCQkJCQlicmVhayBkb25lMjsKLQkJCQl9Ci0JCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKLQkJCX0KLQkJCQotCQkJLy8gc2VhcmNoIGluIHN0YXRpYyBpbXBvcnQKLQkJCUltcG9ydEJpbmRpbmdbXSBpbXBvcnRCaW5kaW5ncyA9IHNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuaW1wb3J0czsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0QmluZGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlJbXBvcnRCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBpbXBvcnRCaW5kaW5nc1tpXTsKLQkJCQlpZihpbXBvcnRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgJiYgaW1wb3J0QmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQkJCUJpbmRpbmcgYmluZGluZyA9IGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQ7Ci0JCQkJCWlmKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCQkJCWlmKGltcG9ydEJpbmRpbmcub25EZW1hbmQpIHsKLQkJCQkJCQlpZigoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLlRZUEUpICE9IDApIHsKLQkJCQkJCQkJaWYocHJvcG9zZUZpZWxkKSB7Ci0JCQkJCQkJCQlmaW5kRmllbGRzKAotCQkJCQkJCQkJCXRva2VuLAotCQkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcsCi0JCQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCQkJZmllbGRzRm91bmQsCi0JCQkJCQkJCQkJbG9jYWxzRm91bmQsCi0JCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKLQkJCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYocHJvcG9zZU1ldGhvZCAmJiAhaW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSkgewotCQkJCQkJCQkJZmluZE1ldGhvZHMoCi0JCQkJCQkJCQkJdG9rZW4sCi0JCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcsCi0JCQkJCQkJCQkJc2NvcGUsCi0JCQkJCQkJCQkJbWV0aG9kc0ZvdW5kLAotCQkJCQkJCQkJCXRydWUsCi0JCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJCQkJCXRydWUsCi0JCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoKGJpbmRpbmcua2luZCgpICYgQmluZGluZy5GSUVMRCkgIT0gMCkgewotCQkJCQkJCQlpZihwcm9wb3NlRmllbGQpIHsKLQkJCQkJCQkJCQlmaW5kRmllbGRzKAotCQkJCQkJCQkJCQkJdG9rZW4sCi0JCQkJCQkJCQkJCQluZXcgRmllbGRCaW5kaW5nW117KEZpZWxkQmluZGluZyliaW5kaW5nfSwKLQkJCQkJCQkJCQkJCXNjb3BlLAotCQkJCQkJCQkJCQkJZmllbGRzRm91bmQsCi0JCQkJCQkJCQkJCQlsb2NhbHNGb3VuZCwKLQkJCQkJCQkJCQkJCXRydWUsCi0JCQkJCQkJCQkJCQkoKEZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKLQkJCQkJCQkJCQkJCWludm9jYXRpb25TaXRlLAotCQkJCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlLAotCQkJCQkJCQkJCQkJdHJ1ZSwKLQkJCQkJCQkJCQkJCWZhbHNlLAotCQkJCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLk1FVEhPRCkgIT0gMCkgewotCQkJCQkJCQlpZihwcm9wb3NlTWV0aG9kICYmICFpbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlKSB7Ci0JCQkJCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZyliaW5kaW5nOwotCQkJCQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpKQotCQkJCQkJCQkJCQotCQkJCQkJCQkJZmluZExvY2FsTWV0aG9kc09mU3RhdGljSW1wb3J0cygKLQkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwKLQkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5tZXRob2RzKCksCi0JCQkJCQkJCQkJCXNjb3BlLAotCQkJCQkJCQkJCQltZXRob2RzRm91bmQsCi0JCQkJCQkJCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCi0JCQkJCQkJCQkJCWludm9jYXRpb25TaXRlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwKSB7Ci0JCQkJLy8gc2VhcmNoIGluIGZhdm9yaXRlcyBpbXBvcnQKLQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21GYXZvcml0ZXMoCi0JCQkJCQl0b2tlbiwKLQkJCQkJCXNjb3BlLAotCQkJCQkJaW52b2NhdGlvblNpdGUsCi0JCQkJCQlpbnZvY2F0aW9uU2NvcGUsCi0JCQkJCQlsb2NhbHNGb3VuZCwKLQkJCQkJCWZpZWxkc0ZvdW5kLAotCQkJCQkJbWV0aG9kc0ZvdW5kKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIGNoYXJbXVtdIGZpbmRWYXJpYWJsZUZyb21VbnJlc29sdmVkUmVmZXJlbmNlKExvY2FsRGVjbGFyYXRpb24gdmFyaWFibGUsIEJsb2NrU2NvcGUgc2NvcGUsIGZpbmFsIGNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMpIHsKLQkJZmluYWwgVHlwZVJlZmVyZW5jZSB0eXBlID0gdmFyaWFibGUudHlwZTsKLQkJaWYodHlwZSAhPSBudWxsICYmCi0JCQkJdHlwZS5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJgotCQkJCXR5cGUucmVzb2x2ZWRUeXBlLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vRXJyb3IpewotCQkJCi0JCQlmaW5hbCBBcnJheUxpc3QgcHJvcG9zZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciA9IAotCQkJCW5ldyBVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5VbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZShjaGFyW10gbmFtZSkgewotCQkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGNvbXBsZXRpb25Ub2tlbiwgbmFtZSk7Ci0JCQkJCQlyZWxldmFuY2UgKz0gUl9OQU1FX0ZJUlNUX1BSRUZJWDsKLQkJCQkJCXJlbGV2YW5jZSArPSBSX05BTUVfRklSU1RfU1VGRklYOwotCQkJCQkJcmVsZXZhbmNlICs9IFJfTkFNRV9MRVNTX05FV19DSEFSQUNURVJTOwotCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciB2YXJpYWJsZSBuYW1lCi0JCQkJCQkKLQkJCQkJCS8vIGFjY2VwdCByZXN1bHQKLQkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJCQlpZighQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlZBUklBQkxFX0RFQ0xBUkFUSU9OKSkgewotCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IENvbXBsZXRpb25FbmdpbmUudGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04sIENvbXBsZXRpb25FbmdpbmUudGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZS5yZXNvbHZlZFR5cGUpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZSh0eXBlLnJlc29sdmVkVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlLnJlc29sdmVkVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCQkJCXByb3Bvc2FsLnNldE5hbWUobmFtZSk7Ci0JCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihuYW1lKTsKLQkJCQkJCQkvL3Byb3Bvc2FsLnNldEZsYWdzKEZsYWdzLkFjY0RlZmF1bHQpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShDb21wbGV0aW9uRW5naW5lLnRoaXMuc3RhcnRQb3NpdGlvbiAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQsIENvbXBsZXRpb25FbmdpbmUudGhpcy5lbmRQb3NpdGlvbiAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQpOwotCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcHJvcG9zZWROYW1lcy5hZGQobmFtZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCi0JCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7Ci0JCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pcmVmZXJlbmNlQ29udGV4dDsKLQkJCQkKLQkJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOwotCQkJCW5hbWVGaW5kZXIuZmluZCgKLQkJCQkJCWNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCW1kLAotCQkJCQkJdmFyaWFibGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxLAotCQkJCQkJZGlzY291cmFnZWROYW1lcywKLQkJCQkJCW5hbWVSZXF1ZXN0b3IpOwotCQkJfSBlbHNlIGlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7Ci0JCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7Ci0JCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0JCQkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGZpZWxkc1tpXSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7Ci0JCQkJCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGZpZWxkc1tpXTsKLQkJCQkJCQlpZiAoaW5pdGlhbGl6ZXIuYm9keVN0YXJ0IDw9IHZhcmlhYmxlLnNvdXJjZVN0YXJ0ICYmCi0JCQkJCQkJCQl2YXJpYWJsZS5zb3VyY2VTdGFydCA8IGluaXRpYWxpemVyLmJvZHlFbmQpIHsKLQkJCQkJCQkJVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIgbmFtZUZpbmRlciA9IG5ldyBVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlcih0aGlzKTsKLQkJCQkJCQkJbmFtZUZpbmRlci5maW5kKAotCQkJCQkJCQkJCWNvbXBsZXRpb25Ub2tlbiwKLQkJCQkJCQkJCQlpbml0aWFsaXplciwKLQkJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUsCi0JCQkJCQkJCQkJdmFyaWFibGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxLAotCQkJCQkJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCi0JCQkJCQkJCQkJbmFtZVJlcXVlc3Rvcik7Ci0JCQkJCQkJCWJyZWFrIGRvbmU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpbnQgcHJvcG9zZWROYW1lc0NvdW50ID0gcHJvcG9zZWROYW1lcy5zaXplKCk7Ci0JCQlpZiAocHJvcG9zZWROYW1lc0NvdW50ID4gMCkgewotCQkJCXJldHVybiAoY2hhcltdW10pcHJvcG9zZWROYW1lcy50b0FycmF5KG5ldyBjaGFyW3Byb3Bvc2VkTmFtZXNDb3VudF1bXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGNoYXJbXVtdIGZpbmRVbnJlc29sdmVkUmVmZXJlbmNlQWZ0ZXIoaW50IGZyb20sIEJsb2NrU2NvcGUgc2NvcGUsIGZpbmFsIGNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMpIHsKLQkJZmluYWwgQXJyYXlMaXN0IHByb3Bvc2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5VbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yID0gCi0JCQluZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZShjaGFyW10gbmFtZSkgewotCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMuYWNjZXB0VW5yZXNvbHZlZE5hbWUobmFtZSk7Ci0JCQkJCXByb3Bvc2VkTmFtZXMuYWRkKG5hbWUpOwotCQkJCX0KLQkJCX07Ci0JCQotCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7Ci0JCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgewotCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXJlZmVyZW5jZUNvbnRleHQ7Ci0JCQkKLQkJCVVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyIG5hbWVGaW5kZXIgPSBuZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIodGhpcyk7Ci0JCQluYW1lRmluZGVyLmZpbmRBZnRlcigKLQkJCQkJY29tcGxldGlvblRva2VuLAotCQkJCQltZC5zY29wZSwKLQkJCQkJbWQuc2NvcGUuY2xhc3NTY29wZSgpLAotCQkJCQlmcm9tLAotCQkJCQltZC5ib2R5RW5kLAotCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAotCQkJCQluYW1lUmVxdWVzdG9yKTsKLQkJfSBlbHNlIGlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKLQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbGFyYXRpb24uZmllbGRzOwotCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0JCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmaWVsZHNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplcikgewotCQkJCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGZpZWxkc1tpXTsKLQkJCQkJCWlmIChpbml0aWFsaXplci5ibG9jay5zb3VyY2VTdGFydCA8PSBmcm9tICYmCi0JCQkJCQkJCWZyb20gPCBpbml0aWFsaXplci5ib2R5RW5kKSB7Ci0JCQkJCQkJVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIgbmFtZUZpbmRlciA9IG5ldyBVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlcih0aGlzKTsKLQkJCQkJCQluYW1lRmluZGVyLmZpbmRBZnRlcigKLQkJCQkJCQkJCQljb21wbGV0aW9uVG9rZW4sCi0JCQkJCQkJCQkJdHlwZURlY2xhcmF0aW9uLnNjb3BlLAotCQkJCQkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZSwKLQkJCQkJCQkJCQlmcm9tLAotCQkJCQkJCQkJCWluaXRpYWxpemVyLmJvZHlFbmQsCi0JCQkJCQkJCQkJZGlzY291cmFnZWROYW1lcywKLQkJCQkJCQkJCQluYW1lUmVxdWVzdG9yKTsKLQkJCQkJCQlicmVhayBkb25lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpbnQgcHJvcG9zZWROYW1lc0NvdW50ID0gcHJvcG9zZWROYW1lcy5zaXplKCk7Ci0JCWlmIChwcm9wb3NlZE5hbWVzQ291bnQgPiAwKSB7Ci0JCQlyZXR1cm4gKGNoYXJbXVtdKXByb3Bvc2VkTmFtZXMudG9BcnJheShuZXcgY2hhcltwcm9wb3NlZE5hbWVzQ291bnRdW10pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbmRVbnJlc29sdmVkUmVmZXJlbmNlKGludCBjb21wbGV0ZWROYW1lU3RhcnQsIGludCBjb21wbGV0ZWROYW1lRW5kLCBCbG9ja1Njb3BlIHNjb3BlLCBjaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzKSB7Ci0JCWNoYXJbXVtdIGZvdW5kTmFtZXMgPSBmaW5kVW5yZXNvbHZlZFJlZmVyZW5jZUJlZm9yZShjb21wbGV0ZWROYW1lU3RhcnQgLSAxLCBjb21wbGV0ZWROYW1lRW5kLCBzY29wZSwgZGlzY291cmFnZWROYW1lcyk7Ci0JCWlmIChmb3VuZE5hbWVzICE9IG51bGwgJiYgZm91bmROYW1lcy5sZW5ndGggPiAxKSB7Ci0JCQlpbnQgZGlzY291cmFnZWROYW1lc0xlbmd0aCA9IGRpc2NvdXJhZ2VkTmFtZXMubGVuZ3RoOwotCQkJaW50IGZvdW5kTmFtZXNMZW5ndGggPSBmb3VuZE5hbWVzLmxlbmd0aDsKLQkJCWludCBuZXdMZW5ndGggPSBkaXNjb3VyYWdlZE5hbWVzTGVuZ3RoICsgZm91bmROYW1lc0xlbmd0aDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGlzY291cmFnZWROYW1lcywgMCwgZGlzY291cmFnZWROYW1lcyA9IG5ldyBjaGFyW25ld0xlbmd0aF1bXSwgMCwgZGlzY291cmFnZWROYW1lc0xlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZvdW5kTmFtZXMsIDAsIGRpc2NvdXJhZ2VkTmFtZXMsIGRpc2NvdXJhZ2VkTmFtZXNMZW5ndGgsIGZvdW5kTmFtZXNMZW5ndGgpOwotCQl9Ci0JCWZpbmRVbnJlc29sdmVkUmVmZXJlbmNlQWZ0ZXIoY29tcGxldGVkTmFtZUVuZCArIDEsIHNjb3BlLCBkaXNjb3VyYWdlZE5hbWVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjaGFyW11bXSBmaW5kVW5yZXNvbHZlZFJlZmVyZW5jZUJlZm9yZShpbnQgcmVjb3JkVG8sIGludCBwYXJzZVRvLCBCbG9ja1Njb3BlIHNjb3BlLCBmaW5hbCBjaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzKSB7Ci0JCWZpbmFsIEFycmF5TGlzdCBwcm9wb3NlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciA9IAotCQkJbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyLlVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lUmVxdWVzdG9yKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWUoY2hhcltdIG5hbWUpIHsKLQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLmFjY2VwdFVucmVzb2x2ZWROYW1lKG5hbWUpOwotCQkJCQlwcm9wb3NlZE5hbWVzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCUJsb2NrU2NvcGUgdXBwZXJTY29wZSA9IHNjb3BlOwotCQl3aGlsZSAodXBwZXJTY29wZS5lbmNsb3NpbmdNZXRob2RTY29wZSgpICE9IG51bGwpIHsKLQkJCXVwcGVyU2NvcGUgPSB1cHBlclNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCk7Ci0JCX0KLQkJCi0JCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCA9IHVwcGVyU2NvcGUucmVmZXJlbmNlQ29udGV4dCgpOwotCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbilyZWZlcmVuY2VDb250ZXh0OwotCQkJCi0JCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOwotCQkJbmFtZUZpbmRlci5maW5kQmVmb3JlKAotCQkJCQljb21wbGV0aW9uVG9rZW4sCi0JCQkJCW1kLnNjb3BlLAotCQkJCQltZC5zY29wZS5jbGFzc1Njb3BlKCksCi0JCQkJCW1kLmJvZHlTdGFydCwKLQkJCQkJcmVjb3JkVG8sCi0JCQkJCXBhcnNlVG8sCi0JCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCi0JCQkJCW5hbWVSZXF1ZXN0b3IpOwotCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0OwotCQkJCi0JCQkKLQkJCWRvbmUgOiB7Ci0JCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7Ci0JCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoZmllbGRzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKLQkJCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgZmllbGRzW2ldOwotCQkJCQkJCWlmIChpbml0aWFsaXplci5ibG9jay5zb3VyY2VTdGFydCA8PSByZWNvcmRUbyAmJgotCQkJCQkJCQkJcmVjb3JkVG8gPCBpbml0aWFsaXplci5ib2R5RW5kKSB7Ci0JCQkJCQotCQkJCQkJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOwotCQkJCQkJCQluYW1lRmluZGVyLmZpbmRCZWZvcmUoCi0JCQkJCQkJCQkJY29tcGxldGlvblRva2VuLAotCQkJCQkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZSwKLQkJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUsCi0JCQkJCQkJCQkJaW5pdGlhbGl6ZXIuYmxvY2suc291cmNlU3RhcnQsCi0JCQkJCQkJCQkJcmVjb3JkVG8sCi0JCQkJCQkJCQkJcGFyc2VUbywKLQkJCQkJCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAotCQkJCQkJCQkJCW5hbWVSZXF1ZXN0b3IpOwotCQkJCQkJCQlicmVhayBkb25lOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaW50IHByb3Bvc2VkTmFtZXNDb3VudCA9IHByb3Bvc2VkTmFtZXMuc2l6ZSgpOwotCQlpZiAocHJvcG9zZWROYW1lc0NvdW50ID4gMCkgewotCQkJcmV0dXJuIChjaGFyW11bXSlwcm9wb3NlZE5hbWVzLnRvQXJyYXkobmV3IGNoYXJbcHJvcG9zZWROYW1lc0NvdW50XVtdKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkvLyBIZWxwZXIgbWV0aG9kIGZvciBwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZXMoY2hhcltdIG5hbWUsIFR5cGVSZWZlcmVuY2UgdHlwZSApCi0JcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWUoCi0JCWNoYXJbXSB0b2tlbiwKLQkJY2hhcltdIHF1YWxpZmllZFBhY2thZ2VOYW1lLAotCQljaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSwKLQkJY2hhcltdIHNvdXJjZU5hbWUsCi0JCWZpbmFsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLAotCQljaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzLAotCQlmaW5hbCBjaGFyW11bXSBmb3JiaWRkZW5OYW1lcywKLQkJaW50IGRpbSwKLQkJaW50IGtpbmQsCi0JCWludCBtb2RpZmllcnMpewotCQkJCi0JCWlmKHNvdXJjZU5hbWUgPT0gbnVsbCB8fCBzb3VyY2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCS8vIGNvbXB1dGUgdmFyaWFibGUgbmFtZSBmb3Igbm9uIGJhc2UgdHlwZQotCQlmaW5hbCBjaGFyW10gZGlzcGxheU5hbWU7Ci0JCWlmIChkaW0gPiAwKXsKLQkJCWludCBsID0gcXVhbGlmaWVkU291cmNlTmFtZS5sZW5ndGg7Ci0JCQlkaXNwbGF5TmFtZSA9IG5ldyBjaGFyW2wrKDIqZGltKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHF1YWxpZmllZFNvdXJjZU5hbWUsIDAsIGRpc3BsYXlOYW1lLCAwLCBsKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBkaW07IGkrKyl7Ci0JCQkJZGlzcGxheU5hbWVbbCsoaSoyKV0gPSAnWyc7Ci0JCQkJZGlzcGxheU5hbWVbbCsoaSoyKSsxXSA9ICddJzsKLQkJCX0KKwkJfSBlbHNlIGlmICh0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPiAtMSAmJiB0aGlzLmV4cGVjdGVkVHlwZXNbMF0uaXNBbm5vdGF0aW9uVHlwZSgpKSB7CisJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUsIGZhbHNlLCBmYWxzZSwgbmV3IE9iamVjdFZlY3RvcigpKTsKIAkJfSBlbHNlIHsKLQkJCWRpc3BsYXlOYW1lID0gcXVhbGlmaWVkU291cmNlTmFtZTsKLQkJfQotCQkKLQkJZmluYWwgY2hhcltdIHQgPSB0b2tlbjsKLQkJZmluYWwgY2hhcltdIHEgPSBxdWFsaWZpZWRQYWNrYWdlTmFtZTsKLQkJSU5hbWluZ1JlcXVlc3RvciBuYW1pbmdSZXF1ZXN0b3IgPSBuZXcgSU5hbWluZ1JlcXVlc3RvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGJvb2xlYW4gaXNGaXJzdFN1ZmZpeCwgaW50IHJldXNlZENoYXJhY3RlcnMpIHsKLQkJCQlhY2NlcHQoCi0JCQkJCQluYW1lLAotCQkJCQkJKGlzRmlyc3RQcmVmaXggPyBSX05BTUVfRklSU1RfUFJFRklYIDogUl9OQU1FX1BSRUZJWCkgKyAoaXNGaXJzdFN1ZmZpeCA/IFJfTkFNRV9GSVJTVF9TVUZGSVggOiBSX05BTUVfU1VGRklYKSwKLQkJCQkJCXJldXNlZENoYXJhY3RlcnMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aFByZWZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0UHJlZml4LCBpbnQgcmV1c2VkQ2hhcmFjdGVycykgewotCQkJCWFjY2VwdChuYW1lLCBpc0ZpcnN0UHJlZml4ID8gUl9OQU1FX0ZJUlNUX1BSRUZJWCA6ICBSX05BTUVfUFJFRklYLCByZXVzZWRDaGFyYWN0ZXJzKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZVdpdGhTdWZmaXgoY2hhcltdIG5hbWUsIGJvb2xlYW4gaXNGaXJzdFN1ZmZpeCwgaW50IHJldXNlZENoYXJhY3RlcnMpIHsKLQkJCQlhY2NlcHQobmFtZSwgaXNGaXJzdFN1ZmZpeCA/IFJfTkFNRV9GSVJTVF9TVUZGSVggOiBSX05BTUVfU1VGRklYLCByZXVzZWRDaGFyYWN0ZXJzKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZVdpdGhvdXRQcmVmaXhBbmRTdWZmaXgoY2hhcltdIG5hbWUsaW50IHJldXNlZENoYXJhY3RlcnMpIHsKLQkJCQlhY2NlcHQobmFtZSwgMCwgcmV1c2VkQ2hhcmFjdGVycyk7Ci0JCQl9Ci0JCQl2b2lkIGFjY2VwdChjaGFyW10gbmFtZSwgaW50IHByZWZpeEFuZFN1ZmZpeFJlbGV2YW5jZSwgaW50IHJldXNlZENoYXJhY3RlcnMpewotCQkJCWludCBsID0gZm9yYmlkZGVuTmFtZXMgPT0gbnVsbCA/IDAgOiBmb3JiaWRkZW5OYW1lcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZvcmJpZGRlbk5hbWVzW2ldLCBuYW1lLCBmYWxzZSkpIHJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHQsIG5hbWUsIGZhbHNlKSkgewotCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKLQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHQsIG5hbWUpOwotCQkJCQlyZWxldmFuY2UgKz0gcHJlZml4QW5kU3VmZml4UmVsZXZhbmNlOwotCQkJCQlpZihyZXVzZWRDaGFyYWN0ZXJzID4gMCkgcmVsZXZhbmNlICs9IFJfTkFNRV9MRVNTX05FV19DSEFSQUNURVJTOwotCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIHZhcmlhYmxlIG5hbWUKLQkJCQkJCi0JCQkJCS8vIGFjY2VwdCByZXN1bHQKLQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJaWYoIUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5WQVJJQUJMRV9ERUNMQVJBVElPTikpIHsKLQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IENvbXBsZXRpb25FbmdpbmUudGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04sIENvbXBsZXRpb25FbmdpbmUudGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOwotCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZSh0eXBlQmluZGluZykpOwotCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShkaXNwbGF5TmFtZSk7Ci0JCQkJCQlwcm9wb3NhbC5zZXROYW1lKG5hbWUpOwotCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihuYW1lKTsKLQkJCQkJCS8vcHJvcG9zYWwuc2V0RmxhZ3MoRmxhZ3MuQWNjRGVmYXVsdCk7Ci0JCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UoQ29tcGxldGlvbkVuZ2luZS50aGlzLnN0YXJ0UG9zaXRpb24gLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0LCBDb21wbGV0aW9uRW5naW5lLnRoaXMuZW5kUG9zaXRpb24gLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0KTsKLQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQkJCQl9CisJCQlpZiAodGhpcy5leHBlY3RlZFR5cGVzUHRyID4gLTEpIHsKKwkJCQl0aGlzLmFzc2lzdE5vZGVJc0VudW0gPSB0cnVlOworCQkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmV4cGVjdGVkVHlwZXNQdHI7IGkrKykgeworCQkJCQlpZiAoIXRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5pc0VudW0oKSkgeworCQkJCQkJdGhpcy5hc3Npc3ROb2RlSXNFbnVtID0gZmFsc2U7CisJCQkJCQlicmVhayBkb25lOwogCQkJCQl9CiAJCQkJfQotCQkJfQotCQl9OwotCQkKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIEZJRUxEIDoKLQkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQkJCQl0aGlzLmphdmFQcm9qZWN0LAotCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZSwKLQkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKLQkJCQkJZGltLAotCQkJCQltb2RpZmllcnMsCi0JCQkJCXRva2VuLAotCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAotCQkJCQluYW1pbmdSZXF1ZXN0b3IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMT0NBTCA6Ci0JCQkJSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0TG9jYWxWYXJpYWJsZU5hbWVzKAotCQkJCQl0aGlzLmphdmFQcm9qZWN0LAotCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZSwKLQkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKLQkJCQkJZGltLAotCQkJCQl0b2tlbiwKLQkJCQkJZGlzY291cmFnZWROYW1lcywKLQkJCQkJbmFtaW5nUmVxdWVzdG9yKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVJHVU1FTlQgOgotCQkJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEFyZ3VtZW50TmFtZXMoCi0JCQkJCXRoaXMuamF2YVByb2plY3QsCi0JCQkJCXF1YWxpZmllZFBhY2thZ2VOYW1lLAotCQkJCQlxdWFsaWZpZWRTb3VyY2VOYW1lLAotCQkJCQlkaW0sCi0JCQkJCXRva2VuLAotCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAotCQkJCQluYW1pbmdSZXF1ZXN0b3IpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQogCi0JcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWVzKGNoYXJbXSBuYW1lLCBUeXBlUmVmZXJlbmNlIHR5cGUgLCBjaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzLCBjaGFyW11bXSBmb3JiaWRkZW5OYW1lcywgaW50IGtpbmQsIGludCBtb2RpZmllcnMpeworCQkJfQorCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQmxvY2tTY29wZSAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5MT0NBTF9WQVJJQUJMRV9SRUYpKSB7CisJCQkJY2hhcltdW10gYWxyZWFkeURlZmluZWROYW1lID0gY29tcHV0ZUFscmVhZHlEZWZpbmVkTmFtZSgoQmxvY2tTY29wZSlzY29wZSwgc2luZ2xlTmFtZVJlZmVyZW5jZSk7CiAKLQkJaWYodHlwZSAhPSBudWxsICYmCi0JCQl0eXBlLnJlc29sdmVkVHlwZSAhPSBudWxsICYmCi0JCQl0eXBlLnJlc29sdmVkVHlwZS5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob0Vycm9yKXsKLQkJCVR5cGVCaW5kaW5nIHRiID0gdHlwZS5yZXNvbHZlZFR5cGU7Ci0JCQlmaW5kVmFyaWFibGVOYW1lKAotCQkJCW5hbWUsCi0JCQkJdGIubGVhZkNvbXBvbmVudFR5cGUoKS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAotCQkJCXRiLmxlYWZDb21wb25lbnRUeXBlKCkucXVhbGlmaWVkU291cmNlTmFtZSgpLAotCQkJCXRiLmxlYWZDb21wb25lbnRUeXBlKCkuc291cmNlTmFtZSgpLAotCQkJCXRiLAotCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCi0JCQkJZm9yYmlkZGVuTmFtZXMsCi0JCQkJdHlwZS5kaW1lbnNpb25zKCksCi0JCQkJa2luZCwKLQkJCQltb2RpZmllcnMpOwotCQl9LyoJZWxzZSB7Ci0JCQljaGFyW11bXSB0eXBlTmFtZSA9IHR5cGUuZ2V0VHlwZU5hbWUoKTsKLQkJCWZpbmRWYXJpYWJsZU5hbWUoCi0JCQkJbmFtZSwKLQkJCQlOb0NoYXIsCi0JCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVOYW1lLCAnLicpLAotCQkJCXR5cGVOYW1lW3R5cGVOYW1lLmxlbmd0aCAtIDFdLAotCQkJCWV4Y2x1ZGVOYW1lcywKLQkJCQl0eXBlLmRpbWVuc2lvbnMoKSk7Ci0JCX0qLwotCX0KLQkKLQlwcml2YXRlIEltcG9ydEJpbmRpbmdbXSBnZXRGYXZvcml0ZVJlZmVyZW5jZUJpbmRpbmdzKFNjb3BlIHNjb3BlKSB7Ci0JCWlmICh0aGlzLmZhdm9yaXRlUmVmZXJlbmNlQmluZGluZ3MgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZmF2b3JpdGVSZWZlcmVuY2VCaW5kaW5nczsKLQkJCi0JCVN0cmluZ1tdIGZhdm9yaXRlUmVmZXJlbmNlcyA9IHRoaXMucmVxdWVzdG9yLmdldEZhdm9yaXRlUmVmZXJlbmNlcygpOwotCQkKLQkJaWYgKGZhdm9yaXRlUmVmZXJlbmNlcyA9PSBudWxsIHx8IGZhdm9yaXRlUmVmZXJlbmNlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQotCQlJbXBvcnRCaW5kaW5nW10gcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbZmF2b3JpdGVSZWZlcmVuY2VzLmxlbmd0aF07Ci0JCQotCQlpbnQgY291bnQgPSAwOwotCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBmYXZvcml0ZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBmYXZvcml0ZVJlZmVyZW5jZSA9IGZhdm9yaXRlUmVmZXJlbmNlc1tpXTsKLQkJCQotCQkJaW50IGxlbmd0aDsKLQkJCWlmIChmYXZvcml0ZVJlZmVyZW5jZSA9PSBudWxsIHx8IChsZW5ndGggPSBmYXZvcml0ZVJlZmVyZW5jZS5sZW5ndGgoKSkgPT0gMCkgY29udGludWUgbmV4dDsKLQkJCQotCQkJYm9vbGVhbiBvbkRlbWFuZCA9IGZhdm9yaXRlUmVmZXJlbmNlLmNoYXJBdChsZW5ndGggLSAxKSA9PSAnKic7Ci0JCQkKLQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGZhdm9yaXRlUmVmZXJlbmNlLnRvQ2hhckFycmF5KCkpOwotCQkJaWYgKG9uRGVtYW5kKSB7Ci0JCQkJY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGNvbXBvdW5kTmFtZS5sZW5ndGggLSAxKTsKKwkJCQlmaW5kVW5yZXNvbHZlZFJlZmVyZW5jZSgKKwkJCQkJCXNpbmdsZU5hbWVSZWZlcmVuY2Uuc291cmNlU3RhcnQsCisJCQkJCQlzaW5nbGVOYW1lUmVmZXJlbmNlLnNvdXJjZUVuZCwKKwkJCQkJCShCbG9ja1Njb3BlKXNjb3BlLAorCQkJCQkJYWxyZWFkeURlZmluZWROYW1lKTsKIAkJCX0KIAkJCQotCQkJLy8gcmVtb3ZlIGR1cGxpY2F0ZSBhbmQgY29uZmxpY3RpbmcKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotCQkJCUltcG9ydFJlZmVyZW5jZSBmID0gcmVzb2x2ZWRJbXBvcnRzW2pdLnJlZmVyZW5jZTsKLQkJCQkKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZi50b2tlbnMsIGNvbXBvdW5kTmFtZSkpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQkJaWYgKCFvbkRlbWFuZCAmJiAoKGYuYml0cyAmIEFTVE5vZGUuT25EZW1hbmQpID09IDApKSB7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmLnRva2Vuc1tmLnRva2Vucy5sZW5ndGggLSAxXSwgY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSkpCi0JCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0KLQkJCX0KKwkJCWNoZWNrQ2FuY2VsKCk7CiAJCQkKLQkJCWJvb2xlYW4gaXNTdGF0aWMgPSB0cnVlOworCQkJZmluZFZhcmlhYmxlc0FuZE1ldGhvZHMoCisJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJc2NvcGUsCisJCQkJc2luZ2xlTmFtZVJlZmVyZW5jZSwKKwkJCQlzY29wZSwKKwkJCQlpbnNpZGVUeXBlQW5ub3RhdGlvbiwKKwkJCQlzaW5nbGVOYW1lUmVmZXJlbmNlLmlzSW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSk7CiAJCQkKLQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPQotCQkJCW5ldyBJbXBvcnRSZWZlcmVuY2UoCi0JCQkJCQljb21wb3VuZE5hbWUsCi0JCQkJCQluZXcgbG9uZ1tjb21wb3VuZE5hbWUubGVuZ3RoXSwKLQkJCQkJCW9uRGVtYW5kLAotCQkJCQkJaXNTdGF0aWMgPyBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljIDogQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpOworCQkJY2hlY2tDYW5jZWwoKTsKIAkJCQotCQkJQmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy51bml0U2NvcGUuZmluZEltcG9ydChjb21wb3VuZE5hbWUsIGlzU3RhdGljLCBvbkRlbWFuZCk7Ci0JCQkKLQkJCWlmICghaW1wb3J0QmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJY29udGludWUgbmV4dDsKLQkJCX0KLQkJCQotCQkJaWYgKGltcG9ydEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgewotCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQl9Ci0JCQkKLQkJCXJlc29sdmVkSW1wb3J0c1tjb3VudCsrXSA9Ci0JCQkJbmV3IEltcG9ydEJpbmRpbmcoY29tcG91bmROYW1lLCBvbkRlbWFuZCwgaW1wb3J0QmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKLQkJfQotCQkKLQkJaWYgKHJlc29sdmVkSW1wb3J0cy5sZW5ndGggPiBjb3VudCkKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzb2x2ZWRJbXBvcnRzLCAwLCByZXNvbHZlZEltcG9ydHMgPSBuZXcgSW1wb3J0QmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsKLQkJCi0JCXJldHVybiB0aGlzLmZhdm9yaXRlUmVmZXJlbmNlQmluZGluZ3MgPSByZXNvbHZlZEltcG9ydHM7Ci0JfQotCQotCXB1YmxpYyBBc3Npc3RQYXJzZXIgZ2V0UGFyc2VyKCkgewotCi0JCXJldHVybiB0aGlzLnBhcnNlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUG9zc2libGVBbm5vdGF0aW9uVGFyZ2V0KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTY29wZSBzY29wZSkgewotCQlpZiAodGhpcy50YXJnZXRlZEVsZW1lbnQgPT0gVGFnQml0cy5Bbm5vdGF0aW9uRm9yUGFja2FnZSkgewotCQkJbG9uZyB0YXJnZXQgPSB0eXBlQmluZGluZy5nZXRBbm5vdGF0aW9uVGFnQml0cygpICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSzsKLQkJCWlmKHRhcmdldCAhPSAwICYmICh0YXJnZXQgJiBUYWdCaXRzLkFubm90YXRpb25Gb3JQYWNrYWdlKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKCh0aGlzLnRhcmdldGVkRWxlbWVudCAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGUpICE9IDApIHsKLQkJCWlmIChzY29wZS5wYXJlbnQgIT0gbnVsbCAmJgotCQkJCQlzY29wZS5wYXJlbnQucGFyZW50ICE9IG51bGwgJiYKLQkJCQkJc2NvcGUucGFyZW50LnJlZmVyZW5jZUNvbnRleHQoKSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUgJiYKLQkJCQkJc2NvcGUucGFyZW50LnBhcmVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdFNjb3BlKSB7Ci0JCQkJbG9uZyB0YXJnZXQgPSB0eXBlQmluZGluZy5nZXRBbm5vdGF0aW9uVGFnQml0cygpICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSzsKLQkJCQlpZiAoKHRoaXMudGFyZ2V0ZWRFbGVtZW50ICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yQW5ub3RhdGlvblR5cGUpICE9IDApIHsKLQkJCQkJaWYodGFyZ2V0ICE9IDAgJiYgKHRhcmdldCAmKFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGUgfCBUYWdCaXRzLkFubm90YXRpb25Gb3JBbm5vdGF0aW9uVHlwZSkpID09IDApIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQorCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUKKwkJCWZpbmRUeXBlc0FuZFBhY2thZ2VzKHRoaXMuY29tcGxldGlvblRva2VuLCBzY29wZSwgdHJ1ZSwgZmFsc2UsIG5ldyBPYmplY3RWZWN0b3IoKSk7CisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKKwkJCQlpZiAodGhpcy5jb21wbGV0aW9uVG9rZW4gIT0gbnVsbCAmJiB0aGlzLmNvbXBsZXRpb25Ub2tlbi5sZW5ndGggIT0gMCkgeworCQkJCQlmaW5kS2V5d29yZHModGhpcy5jb21wbGV0aW9uVG9rZW4sIHNpbmdsZU5hbWVSZWZlcmVuY2UucG9zc2libGVLZXl3b3JkcywgZmFsc2UsIGZhbHNlKTsKIAkJCQl9IGVsc2UgewotCQkJCQlpZih0YXJnZXQgIT0gMCAmJiAodGFyZ2V0ICYoVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZSkpID09IDApIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQorCQkJCQlmaW5kVHJ1ZU9yRmFsc2VLZXl3b3JkcyhzaW5nbGVOYW1lUmVmZXJlbmNlLnBvc3NpYmxlS2V5d29yZHMpOworCQkJCX0KKwkJCX0KKwkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSl7CisJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMuY29tcGxldGlvblRva2VuLCBLZXl3b3Jkcy5USElTLCBmYWxzZSkpIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyByZWYgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkJCWZpbmRFeHBsaWNpdENvbnN0cnVjdG9ycyhLZXl3b3Jkcy5USElTLCByZWYsIChNZXRob2RTY29wZSlzY29wZSwgc2luZ2xlTmFtZVJlZmVyZW5jZSk7CisJCQkJfSBlbHNlIGlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgS2V5d29yZHMuU1VQRVIsIGZhbHNlKSkgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZiA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCQkJZmluZEV4cGxpY2l0Q29uc3RydWN0b3JzKEtleXdvcmRzLlNVUEVSLCByZWYuc3VwZXJjbGFzcygpLCAoTWV0aG9kU2NvcGUpc2NvcGUsIHNpbmdsZU5hbWVSZWZlcmVuY2UpOwogCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQotCQlzdXBlci5yZXNldCgpOwotCQl0aGlzLmtub3duUGtncyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7Ci0JCXRoaXMua25vd25UeXBlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhpcy5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kLCB0cnVlKTsKLQl9CisJcHJpdmF0ZSB2b2lkIGNvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UoQVNUTm9kZSBhc3ROb2RlLCBBU1ROb2RlIGFzdE5vZGVQYXJlbnQsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKKwkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVSZWYgPSAoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZTsKIAotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZW1wdHlUb2tlbkFkanN0bWVudCkgewkJCi0JCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0OwotCQlpZihlbXB0eVRva2VuQWRqc3RtZW50KSB7Ci0JCQlpbnQgZW5kT2ZFbXB0eVRva2VuID0gKChDb21wbGV0aW9uU2Nhbm5lcil0aGlzLnBhcnNlci5zY2FubmVyKS5lbmRPZkVtcHR5VG9rZW47Ci0JCQl0aGlzLmVuZFBvc2l0aW9uID0gZW5kT2ZFbXB0eVRva2VuID4gZW5kID8gZW5kT2ZFbXB0eVRva2VuICsgMSA6IGVuZCArIDE7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmVuZFBvc2l0aW9uID0gZW5kICsgMTsKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBzaW5nbGVSZWYudG9rZW47CisKKwkJdGhpcy5hc3Npc3ROb2RlSXNDbGFzcyA9IHNpbmdsZVJlZi5pc0NsYXNzKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uID0gc2luZ2xlUmVmLmlzRXhjZXB0aW9uKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlID0gc2luZ2xlUmVmLmlzSW50ZXJmYWNlKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgPSBzaW5nbGVSZWYuaXNDb25zdHJ1Y3RvclR5cGU7CisJCXRoaXMuYXNzaXN0Tm9kZUlzU3VwZXJUeXBlID0gc2luZ2xlUmVmLmlzU3VwZXJUeXBlKCk7CisJCXRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlID0gYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQpOworCQl0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZUV4Y2x1ZGluZ0Fubm90YXRpb24gPSBhc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uKGFzdE5vZGUsIGFzdE5vZGVQYXJlbnQpOworCQkKKwkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUKKwkJaWYgKHF1YWxpZmllZEJpbmRpbmcgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuY29tcGxldGlvblRva2VuLmxlbmd0aCA9PSAwICYmCisJCQkJCShhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgfHwKKwkJCQkJCQlhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpKSB7CisJCQkJdGhpcy5zZXRTb3VyY2VBbmRUb2tlblJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIGFzdE5vZGUuc291cmNlU3RhcnQgLSAxLCBmYWxzZSk7CisKKwkJCQlmaW5kUGFyYW1ldGVyaXplZFR5cGUoKFR5cGVSZWZlcmVuY2UpYXN0Tm9kZVBhcmVudCwgc2NvcGUpOworCQkJfSBlbHNlIHsKKwkJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24gJiYgYXN0Tm9kZVBhcmVudCBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgeworCQkJCQlmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCgKKwkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkJCQludWxsLAorCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQkoQmxvY2tTY29wZSlzY29wZSwKKwkJCQkJCQl0eXBlc0ZvdW5kKTsKKwkJCQl9CisJCQkJCisJCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQkKKwkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2NvcGUsIHRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IsIGZhbHNlLCB0eXBlc0ZvdW5kKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCWZpbmRNZW1iZXJUeXBlcygKKwkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKKwkJCQlzY29wZSwKKwkJCQlzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJIXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IsCisJCQkJbnVsbCwKKwkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJbnVsbCwKKwkJCQludWxsLAorCQkJCW51bGwsCisJCQkJZmFsc2UpOwogCQl9CiAJfQorCiAJcHJpdmF0ZSBjaGFyW11bXSBjb21wdXRlQWxyZWFkeURlZmluZWROYW1lKAogCQkJQmxvY2tTY29wZSBzY29wZSwKIAkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CiAJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQorCiAJCWJvb2xlYW4gc3RhdGljc09ubHkgPSBmYWxzZTsKIAogCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKQEAgLTc3MjksNiArMzI4OCw3IEBACiAJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGU7CiAJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CiAKKwkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6CiAJCQkJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSA9IChCbG9ja1Njb3BlKSBjdXJyZW50U2NvcGU7CiAKQEAgLTc3NTYsMTkgKzMzMTYsNDAgQEAKIAkJCQkJCQlyZXN1bHQpOwogCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7CiAJCQkJCWJyZWFrOwotCQkJCQkKKwogCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CiAJCQkJCWJyZWFrIGRvbmUxOwogCQkJfQogCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKIAkJfQotCQkKKwogCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCQorCiAJCXJldHVybiAoY2hhcltdW10pcmVzdWx0LnRvQXJyYXkobmV3IGNoYXJbcmVzdWx0LnNpemUoKV1bXSk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGNvbXB1dGVBbHJlYWR5RGVmaW5lZE5hbWUoCisJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMsCisJCQlTY29wZSBzY29wZSwKKwkJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlBcnJheUxpc3QgcmVzdWx0KSB7CisKKwkJbmV4dCA6IGZvciAoaW50IGYgPSBmaWVsZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKwkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tmXTsKKworCQkJaWYgKGZpZWxkLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChvbmx5U3RhdGljRmllbGRzICYmICFmaWVsZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoIWZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dDsKKworCQkJcmVzdWx0LmFkZChmaWVsZC5uYW1lKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlQWxyZWFkeURlZmluZWROYW1lKAogCQkJU291cmNlVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAogCQkJQ2xhc3NTY29wZSBzY29wZSwKIAkJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKQEAgLTc4MzksNTMgKzM0MjAsMjkgQEAKIAkJCX0KIAkJfQogCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcHV0ZUFscmVhZHlEZWZpbmVkTmFtZSgKLQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcywKLQkJCVNjb3BlIHNjb3BlLAotCQkJYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzLAotCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKLQkJCUFycmF5TGlzdCByZXN1bHQpIHsKLQkJCi0JCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7CQkJCi0JCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbZl07CiAKLQkJCWlmIChmaWVsZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OwotCQkJCi0JCQlpZiAob25seVN0YXRpY0ZpZWxkcyAmJiAhZmllbGQuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKLQkJCQotCQkJaWYgKCFmaWVsZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpIGNvbnRpbnVlIG5leHQ7Ci0KLQkJCXJlc3VsdC5hZGQoZmllbGQubmFtZSk7Ci0JCX0KLQl9Ci0JCiAJaW50IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCl7CiAJCXJldHVybiBSX0RFRkFVTFQ7CiAJfQotCWludCBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpewotCQlyZXR1cm4gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24odHJ1ZSk7Ci0JfQotCWludCBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbihib29sZWFuIGlzUmVzb2x2ZWQpewotCQlpZiAoaXNSZXNvbHZlZCkgewotCQkJcmV0dXJuIFJfUkVTT0xWRUQ7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorCiAJcHJpdmF0ZSB2b2lkIGNvbXB1dGVFeHBlY3RlZFR5cGVzKEFTVE5vZGUgcGFyZW50LCBBU1ROb2RlIG5vZGUsIFNjb3BlIHNjb3BlKXsKLQkJCisKIAkJLy8gZGVmYXVsdCBmaWx0ZXIKIAkJdGhpcy5leHBlY3RlZFR5cGVzRmlsdGVyID0gU1VCVFlQRTsKIAkJdGhpcy5oYXNKYXZhTGFuZ09iamVjdEFzRXhwZWN0ZWRUeXBlID0gZmFsc2U7Ci0JCQorCiAJCS8vIGZpbmQgdHlwZXMgZnJvbSBwYXJlbnQKLQkJaWYocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB7CisJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIFR5cGVQYXJhbWV0ZXIpKSB7CiAJCQlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmVudDsKIAkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB2YXJpYWJsZS50eXBlLnJlc29sdmVkVHlwZTsKIAkJCWlmKGJpbmRpbmcgIT0gbnVsbCkgewogCQkJCWlmKCEodmFyaWFibGUuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheUluaXRpYWxpemVyKSkgewogCQkJCQlhZGRFeHBlY3RlZFR5cGUoYmluZGluZywgc2NvcGUpOworCQkJCX0gZWxzZSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTA3NDcKKwkJCQkJLy8gSWYgdGhlIHZhcmlhYmxlIGlzIG9mIHR5cGUgWFtdLCBhbmQgd2UncmUgaW4gdGhlIGluaXRpYWxpemVyCisJCQkJCS8vIHdlIHNob3VsZCBoYXZlIFggYXMgdGhlIGV4cGVjdGVkIHR5cGUgZm9yIHRoZSB2YXJpYWJsZSBpbml0aWFsaXplcnMuCisJCQkJCWJpbmRpbmcgPSBiaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCk7CisJCQkJCWFkZEV4cGVjdGVkVHlwZShiaW5kaW5nLCBzY29wZSk7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgQXNzaWdubWVudCkgewpAQCAtNzkwMiw3ICszNDU5LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgewotCQkJRXhwcmVzc2lvbiBlID0gKChDYXN0RXhwcmVzc2lvbilwYXJlbnQpLnR5cGU7CisJCQlUeXBlUmVmZXJlbmNlIGUgPSAoKENhc3RFeHByZXNzaW9uKXBhcmVudCkudHlwZTsKIAkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBlLnJlc29sdmVkVHlwZTsKIAkJCWlmKGJpbmRpbmcgIT0gbnVsbCl7CiAJCQkJYWRkRXhwZWN0ZWRUeXBlKGJpbmRpbmcsIHNjb3BlKTsKQEAgLTc5MTQsOCArMzQ3MSw4IEBACiAJCQlpZihtZXNzYWdlU2VuZC5hY3R1YWxSZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CiAJCQkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpbWVzc2FnZVNlbmQuYWN0dWFsUmVjZWl2ZXJUeXBlOwogCQkJCWJvb2xlYW4gaXNTdGF0aWMgPSBtZXNzYWdlU2VuZC5yZWNlaXZlci5pc1R5cGVSZWZlcmVuY2UoKTsKLQkJCQkKLQkJCQl3aGlsZShiaW5kaW5nICE9IG51bGwpIHsJCisKKwkJCQl3aGlsZShiaW5kaW5nICE9IG51bGwpIHsKIAkJCQkJY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JNZXNzYWdlU2VuZCgKIAkJCQkJCWJpbmRpbmcsCiAJCQkJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKQEAgLTc5MzcsMTAgKzM0OTQsMTAgQEAKIAkJCX0KIAkJfSBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CiAJCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbikgcGFyZW50OwotCQkJCisKIAkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKWFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUucmVzb2x2ZWRUeXBlOwogCi0JCQlpZihiaW5kaW5nICE9IG51bGwpIHsJCisJCQlpZihiaW5kaW5nICE9IG51bGwpIHsKIAkJCQljb21wdXRlRXhwZWN0ZWRUeXBlc0ZvckFsbG9jYXRpb25FeHByZXNzaW9uKAogCQkJCQliaW5kaW5nLAogCQkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi5hcmd1bWVudHMsCkBAIC03OTU5LDcgKzM1MTYsMTYgQEAKIAkJCQkJdGhpcy5leHBlY3RlZFR5cGVzRmlsdGVyID0gU1VCVFlQRSB8IFNVUEVSVFlQRTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworCQkJCUJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiA9IChCaW5hcnlFeHByZXNzaW9uKSBwYXJlbnQ7CiAJCQkJc3dpdGNoKG9wZXJhdG9yKSB7CisJCQkJCWNhc2UgT3BlcmF0b3JJZHMuRVFVQUxfRVFVQUwgOgorCQkJCQkJLy8gZXhwZWN0ZWQgdHlwZSBpcyBub3QgcmVsZXZhbnQgaW4gdGhpcyBjYXNlCisJCQkJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gYmluYXJ5RXhwcmVzc2lvbi5sZWZ0LnJlc29sdmVkVHlwZTsKKwkJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCQlhZGRFeHBlY3RlZFR5cGUoYmluZGluZywgc2NvcGUpOworCQkJCQkJCXRoaXMuZXhwZWN0ZWRUeXBlc0ZpbHRlciA9IFNVQlRZUEUgfCBTVVBFUlRZUEU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKIAkJCQkJCWFkZEV4cGVjdGVkVHlwZShUeXBlQmluZGluZy5TSE9SVCwgc2NvcGUpOwogCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKFR5cGVCaW5kaW5nLklOVCwgc2NvcGUpOwpAQCAtNzk4NSw3ICszNTUxLDYgQEAKIAkJCQkJCWFkZEV4cGVjdGVkVHlwZShUeXBlQmluZGluZy5CWVRFLCBzY29wZSk7CiAJCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJQmluYXJ5RXhwcmVzc2lvbiBiaW5hcnlFeHByZXNzaW9uID0gKEJpbmFyeUV4cHJlc3Npb24pIHBhcmVudDsKIAkJCQlpZihvcGVyYXRvciA9PSBPcGVyYXRvcklkcy5MRVNTKSB7CiAJCQkJCWlmKGJpbmFyeUV4cHJlc3Npb24ubGVmdCBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpewogCQkJCQkJU2luZ2xlTmFtZVJlZmVyZW5jZSBuYW1lID0gKFNpbmdsZU5hbWVSZWZlcmVuY2UpIGJpbmFyeUV4cHJlc3Npb24ubGVmdDsKQEAgLTc5OTUsNyArMzU2MCw3IEBACiAJCQkJCQkJaWYodHlwZVZhcmlhYmxlQmluZGluZ3MgIT0gbnVsbCAmJiB0eXBlVmFyaWFibGVCaW5kaW5ncy5sZW5ndGggPiAwKSB7CiAJCQkJCQkJCWFkZEV4cGVjdGVkVHlwZSh0eXBlVmFyaWFibGVCaW5kaW5nc1swXS5maXJzdEJvdW5kLCBzY29wZSk7CiAJCQkJCQkJfQotCQkJCQkJCQorCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CkBAIC04MDMxLDI4ICszNTk2LDYwIEBACiAJCQlhZGRFeHBlY3RlZFR5cGUoVHlwZUJpbmRpbmcuTE9ORywgc2NvcGUpOwogCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKIAkJCVBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHJlZiA9IChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgcGFyZW50OwotCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpcmVmLnJlc29sdmVkVHlwZSkudHlwZVZhcmlhYmxlcygpOwotCQkJaW50IGxlbmd0aCA9IHJlZi50eXBlQXJndW1lbnRzID09IG51bGwgPyAwIDogcmVmLnR5cGVBcmd1bWVudHMubGVuZ3RoOwotCQkJaWYodHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZXMubGVuZ3RoID49IGxlbmd0aCkgewotCQkJCWludCBpbmRleCA9IGxlbmd0aCAtIDE7Ci0JCQkJd2hpbGUoaW5kZXggPiAtMSAmJiByZWYudHlwZUFyZ3VtZW50c1tpbmRleF0gIT0gbm9kZSkgaW5kZXgtLTsKLQkJCQkKLQkJCQlUeXBlQmluZGluZyBib3VuZCA9IHR5cGVWYXJpYWJsZXNbaW5kZXhdLmZpcnN0Qm91bmQ7Ci0JCQkJYWRkRXhwZWN0ZWRUeXBlKGJvdW5kID09IG51bGwgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogYm91bmQsIHNjb3BlKTsKKwkJCVR5cGVCaW5kaW5nIGV4cGVjdGVkID0gbnVsbDsKKwkJCWlmICh0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHx8CisJCQkJCXRoaXMucGFyc2VyLmVuY2xvc2luZ05vZGUgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpIHsKKwkJCQkvLyBjb21wbGV0aW5nIGluc2lkZSB0aGUgZGlhbW9uZAorCQkJCWlmICh0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB7CisJCQkJCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlOworCQkJCQlleHBlY3RlZCA9IGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsID8gYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLmV4cGVjdGVkVHlwZSgpIDogbnVsbDsJCQkJCQorCQkJCX0gZWxzZSB7CisJCQkJCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSB0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlOworCQkJCQlpZiAocmV0dXJuU3RhdGVtZW50LmV4cHJlc3Npb24gIT0gbnVsbCkgeworCQkJCQkJZXhwZWN0ZWQgPSByZXR1cm5TdGF0ZW1lbnQuZXhwcmVzc2lvbi5leHBlY3RlZFR5cGUoKTsKKwkJCQkJfQorCQkJCX0JCisJCQkJYWRkRXhwZWN0ZWRUeXBlKGV4cGVjdGVkLCBzY29wZSk7CisJCQl9IGVsc2UgeworCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gKChSZWZlcmVuY2VCaW5kaW5nKXJlZi5yZXNvbHZlZFR5cGUpLnR5cGVWYXJpYWJsZXMoKTsKKwkJCQlpbnQgbGVuZ3RoID0gcmVmLnR5cGVBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiByZWYudHlwZUFyZ3VtZW50cy5sZW5ndGg7CisJCQkJaWYodHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZXMubGVuZ3RoID49IGxlbmd0aCkgeworCQkJCQlpbnQgaW5kZXggPSBsZW5ndGggLSAxOworCQkJCQl3aGlsZShpbmRleCA+IC0xICYmIHJlZi50eXBlQXJndW1lbnRzW2luZGV4XSAhPSBub2RlKSBpbmRleC0tOworCQorCQkJCQlUeXBlQmluZGluZyBib3VuZCA9IHR5cGVWYXJpYWJsZXNbaW5kZXhdLmZpcnN0Qm91bmQ7CisJCQkJCWFkZEV4cGVjdGVkVHlwZShib3VuZCA9PSBudWxsID8gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSA6IGJvdW5kLCBzY29wZSk7CisJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKIAkJCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHJlZiA9IChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgcGFyZW50OwotCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpcmVmLnJlc29sdmVkVHlwZSkudHlwZVZhcmlhYmxlcygpOwogCQkJVHlwZVJlZmVyZW5jZVtdW10gYXJndW1lbnRzID0gcmVmLnR5cGVBcmd1bWVudHM7Ci0JCQlpZih0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKLQkJCQlpbnQgaUxlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7Ci0JCQkJZG9uZTogZm9yIChpbnQgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IGpMZW5ndGggPSBhcmd1bWVudHNbaV0gPT0gbnVsbCA/IDAgOiBhcmd1bWVudHNbaV0ubGVuZ3RoOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGpMZW5ndGg7IGorKykgewotCQkJCQkJaWYoYXJndW1lbnRzW2ldW2pdID09IG5vZGUgJiYgdHlwZVZhcmlhYmxlcy5sZW5ndGggPiBqKSB7Ci0JCQkJCQkJVHlwZUJpbmRpbmcgYm91bmQgPSB0eXBlVmFyaWFibGVzW2pdLmZpcnN0Qm91bmQ7Ci0JCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKGJvdW5kID09IG51bGwgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogYm91bmQsIHNjb3BlKTsKLQkJCQkJCQlicmVhayBkb25lOworCQkJVHlwZUJpbmRpbmcgZXhwZWN0ZWQgPSBudWxsOworCQkJaWYgKHRoaXMucGFyc2VyLmVuY2xvc2luZ05vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gfHwKKwkJCQkJdGhpcy5wYXJzZXIuZW5jbG9zaW5nTm9kZSBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCkgeworCQkJCS8vIGNvbXBsZXRpbmcgaW5zaWRlIHRoZSBkaWFtb25kCisJCQkJaWYgKHRoaXMucGFyc2VyLmVuY2xvc2luZ05vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKKwkJCQkJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIHRoaXMucGFyc2VyLmVuY2xvc2luZ05vZGU7CisJCQkJCWV4cGVjdGVkID0gYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGwgPyBhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24uZXhwZWN0ZWRUeXBlKCkgOiBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSB0aGlzLnBhcnNlci5lbmNsb3NpbmdOb2RlOworCQkJCQlpZiAocmV0dXJuU3RhdGVtZW50LmV4cHJlc3Npb24gIT0gbnVsbCkgeworCQkJCQkJZXhwZWN0ZWQgPSByZXR1cm5TdGF0ZW1lbnQuZXhwcmVzc2lvbi5leHBlY3RlZFR5cGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhZGRFeHBlY3RlZFR5cGUoZXhwZWN0ZWQsIHNjb3BlKTsKKwkJCX0gZWxzZSB7CisJCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpcmVmLnJlc29sdmVkVHlwZSkudHlwZVZhcmlhYmxlcygpOworCQkJCWlmKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgeworCQkJCQlpbnQgaUxlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7CisJCQkJCWRvbmU6IGZvciAoaW50IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7CisJCQkJCQlpbnQgakxlbmd0aCA9IGFyZ3VtZW50c1tpXSA9PSBudWxsID8gMCA6IGFyZ3VtZW50c1tpXS5sZW5ndGg7CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGpMZW5ndGg7IGorKykgeworCQkJCQkJCWlmKGFyZ3VtZW50c1tpXVtqXSA9PSBub2RlICYmIHR5cGVWYXJpYWJsZXMubGVuZ3RoID4gaikgeworCQkJCQkJCQlUeXBlQmluZGluZyBib3VuZCA9IHR5cGVWYXJpYWJsZXNbal0uZmlyc3RCb3VuZDsKKwkJCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKGJvdW5kID09IG51bGwgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogYm91bmQsIHNjb3BlKTsKKwkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CkBAIC04MDk3LDE1ICszNjk0LDYxIEBACiAJCQl9CiAJCQlpZiAoaXNFeGNlcHRpb24pIHsKIAkJCQlUaHJvd25FeGNlcHRpb25GaW5kZXIgdGhyb3duRXhjZXB0aW9uRmluZGVyID0gbmV3IFRocm93bkV4Y2VwdGlvbkZpbmRlcigpOwotCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBiaW5kaW5ncyA9IHRocm93bkV4Y2VwdGlvbkZpbmRlci5maW5kKChUcnlTdGF0ZW1lbnQpIHBhcmVudCwgKEJsb2NrU2NvcGUpc2NvcGUpOworCQkJCXRocm93bkV4Y2VwdGlvbkZpbmRlci5wcm9jZXNzVGhyb3duRXhjZXB0aW9ucygoVHJ5U3RhdGVtZW50KSBwYXJlbnQsIChCbG9ja1Njb3BlKXNjb3BlKTsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gYmluZGluZ3MgPSB0aHJvd25FeGNlcHRpb25GaW5kZXIuZ2V0VGhyb3duVW5jYXVnaHRFeGNlcHRpb25zKCk7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGFscmVhZHlDYXVnaHRFeGNlcHRpb25zID0gdGhyb3duRXhjZXB0aW9uRmluZGVyLmdldEFscmVhZHlDYXVnaHRFeGNlcHRpb25zKCk7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGRpc2NvdXJhZ2VkRXhjZXB0aW9ucyA9IHRocm93bkV4Y2VwdGlvbkZpbmRlci5nZXREaXNjb3VyYWdlZEV4Y2VwdGlvbnMoKTsKIAkJCQlpZiAoYmluZGluZ3MgIT0gbnVsbCAmJiBiaW5kaW5ncy5sZW5ndGggPiAwKSB7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHsKIAkJCQkJCWFkZEV4cGVjdGVkVHlwZShiaW5kaW5nc1tpXSwgc2NvcGUpOwogCQkJCQl9CiAJCQkJCXRoaXMuZXhwZWN0ZWRUeXBlc0ZpbHRlciA9IFNVUEVSVFlQRTsKIAkJCQl9CisJCQkJaWYgKGFscmVhZHlDYXVnaHRFeGNlcHRpb25zICE9IG51bGwgJiYgYWxyZWFkeUNhdWdodEV4Y2VwdGlvbnMubGVuZ3RoID4gMCkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFscmVhZHlDYXVnaHRFeGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlhZGRGb3JiaWRkZW5CaW5kaW5ncyhhbHJlYWR5Q2F1Z2h0RXhjZXB0aW9uc1tpXSk7CisJCQkJCQl0aGlzLmtub3duVHlwZXMucHV0KENoYXJPcGVyYXRpb24uY29uY2F0KGFscmVhZHlDYXVnaHRFeGNlcHRpb25zW2ldLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIGFscmVhZHlDYXVnaHRFeGNlcHRpb25zW2ldLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgJy4nKSwgS05PV05fVFlQRV9XSVRIX0tOT1dOX0NPTlNUUlVDVE9SUyk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGRpc2NvdXJhZ2VkRXhjZXB0aW9ucyAhPSBudWxsICYmIGRpc2NvdXJhZ2VkRXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlzY291cmFnZWRFeGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlhZGRVbmludGVyZXN0aW5nQmluZGluZ3MoZGlzY291cmFnZWRFeGNlcHRpb25zW2ldKTsKKwkJCQkJCS8vIGRvIG5vdCBpbnNlcnQgaW50byBrbm93biB0eXBlcy4gV2UgZG8gbmVlZCB0aGVzZSB0eXBlcyB0byBjb21lIGZyb20KKwkJCQkJCS8vIHNlYXJjaEFsbFR5cGVzKC4uKSBhbGJlaXQgd2l0aCBsb3dlciByZWxldmFuY2UKKwkJCQkJfQorCQkJCX0KIAkJCX0KLQkJCQorCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN3aXRjaFN0YXRlbWVudCkgeworCQkJU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCA9IChTd2l0Y2hTdGF0ZW1lbnQpIHBhcmVudDsKKwkJCXRoaXMuYXNzaXN0Tm9kZUlzSW5zaWRlQ2FzZSA9IGFzc2lzdE5vZGVJc0luc2lkZUNhc2Uobm9kZSwgcGFyZW50KTsKKwkJCWlmIChzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbiAhPSBudWxsICYmCisJCQkJCXN3aXRjaFN0YXRlbWVudC5leHByZXNzaW9uLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzSW5zaWRlQ2FzZSAmJgorCQkJCQkJc3dpdGNoU3RhdGVtZW50LmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyAmJgorCQkJCQkJdGhpcy5jb21waWxlck9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKKwkJCQkJLy8gc2V0IHRoZSBmaWVsZCB0byB0cnVlIGV2ZW4gdGhvdWdoIHRoZSBleHBlY3RlZCB0eXBlcyBhcnJheSB3aWxsIGNvbnRhaW4gU3RyaW5nIGFzCisJCQkJCS8vIGV4cGVjdGVkIHR5cGUgdG8gYXZvaWQgdHJhdmVyc2luZyB0aGUgYXJyYXkgaW4gZXZlcnkgY2FzZSBsYXRlciBvbi4KKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzQ3NgorCQkJCQl0aGlzLmFzc2lzdE5vZGVJc1N0cmluZyA9IHRydWU7CisJCQkJfQorCQkJCWFkZEV4cGVjdGVkVHlwZShzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUsIHNjb3BlKTsKKwkJCX0KKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MzAwOCwgZmxhZyBib29sZWFuIGFzIHRoZSBleHBlY3RlZAorCQkvLyB0eXBlIGlmIHdlIGFyZSBjb21wbGV0aW5nIGluc2lkZSBpZigpLCBmb3IgKDsgOyksIHdoaWxlKCkgYW5kIGRvIHdoaWxlKCkKKwkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBXaGlsZVN0YXRlbWVudCkgeyAgLy8gY292ZXJzIGJvdGggd2hpbGUgYW5kIGRvLXdoaWxlIGxvb3BzCisJCQlhZGRFeHBlY3RlZFR5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTiwgc2NvcGUpOworCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElmU3RhdGVtZW50KSB7ICAKKwkJCWFkZEV4cGVjdGVkVHlwZShUeXBlQmluZGluZy5CT09MRUFOLCBzY29wZSk7CisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQXNzZXJ0U3RhdGVtZW50KSB7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0NDY2CisJCQkvLyBJZiB0aGUgYXNzZXJ0RXhwcmVzc2lvbiBpcyBzYW1lIGFzIHRoZSBub2RlICwgdGhlbiB0aGUgYXNzaXN0Tm9kZSBpcyB0aGUgY29uZGl0aW9uYWwgcGFydCBvZiB0aGUgYXNzZXJ0IHN0YXRlbWVudAorCQkJQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIHBhcmVudDsKKwkJCWlmIChhc3NlcnRTdGF0ZW1lbnQuYXNzZXJ0RXhwcmVzc2lvbiA9PSBub2RlKSB7CisJCQkJYWRkRXhwZWN0ZWRUeXBlKFR5cGVCaW5kaW5nLkJPT0xFQU4sIHNjb3BlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGb3JTdGF0ZW1lbnQpIHsgICAvLyBhc3ROb2RlUGFyZW50IHNldCB0byBGb3JTdGF0ZW1lbnQgb25seSBmb3IgdGhlIGNvbmRpdGlvbiAgCisJCQlhZGRFeHBlY3RlZFR5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTiwgc2NvcGUpOworCiAJCS8vIEV4cGVjdGVkIHR5cGVzIGZvciBqYXZhZG9jCiAJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSmF2YWRvYykgewogCQkJaWYgKHNjb3BlLmtpbmQgPT0gU2NvcGUuTUVUSE9EX1NDT1BFKSB7CkBAIC04MTIxLDQ4ICszNzY0LDkxIEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCWlmKHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciArIDEgIT0gdGhpcy5leHBlY3RlZFR5cGVzLmxlbmd0aCkgewogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4cGVjdGVkVHlwZXMsIDAsIHRoaXMuZXhwZWN0ZWRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1t0aGlzLmV4cGVjdGVkVHlwZXNQdHIgKyAxXSwgMCwgdGhpcy5leHBlY3RlZFR5cGVzUHRyICsgMSk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JBbGxvY2F0aW9uRXhwcmVzc2lvbigKIAkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nLAogCQlFeHByZXNzaW9uW10gYXJndW1lbnRzLAogCQlTY29wZSBzY29wZSwKIAkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKLQkJCQorCiAJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gYmluZGluZy5hdmFpbGFibGVNZXRob2RzKCk7CiAJCW5leHRNZXRob2QgOiBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKIAkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCQorCiAJCQlpZiAoIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCQkKKwogCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCisKIAkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5ICYmICFtZXRob2QuY2FuQmVTZWVuQnkoaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dE1ldGhvZDsKLQkJCQorCiAJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsKIAkJCWlmKHBhcmFtZXRlcnMubGVuZ3RoIDwgYXJndW1lbnRzLmxlbmd0aCkKIAkJCQljb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCQorCiAJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7Ci0JCQkKKwogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewogCQkJCUV4cHJlc3Npb24gYXJndW1lbnQgPSBhcmd1bWVudHNbal07CiAJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZSA9IGFyZ3VtZW50LnJlc29sdmVkVHlwZTsKIAkJCQlpZihhcmdUeXBlICE9IG51bGwgJiYgIWFyZ1R5cGUuaXNDb21wYXRpYmxlV2l0aChwYXJhbWV0ZXJzW2pdKSkKIAkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKIAkJCX0KLQkJCQorCiAJCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1thcmd1bWVudHMubGVuZ3RoIC0gMV07CiAJCQlpZihleHBlY3RlZFR5cGUgIT0gbnVsbCkgewogCQkJCWFkZEV4cGVjdGVkVHlwZShleHBlY3RlZFR5cGUsIHNjb3BlKTsKIAkJCX0KIAkJfQogCX0KLQkKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JNZXNzYWdlU2VuZCgKKwkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nLAorCQljaGFyW10gc2VsZWN0b3IsCisJCUV4cHJlc3Npb25bXSBhcmd1bWVudHMsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gaXNTdGF0aWMpIHsKKworCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGJpbmRpbmcuYXZhaWxhYmxlTWV0aG9kcygpOworCQluZXh0TWV0aG9kIDogZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CisKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0TWV0aG9kOworCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaWYgKGlzU3RhdGljICYmICFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkgJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpIGNvbnRpbnVlIG5leHRNZXRob2Q7CisKKwkJCWlmKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJCQlpZihwYXJhbWV0ZXJzLmxlbmd0aCA8IGFyZ3VtZW50cy5sZW5ndGgpCisJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOworCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IGFyZ3VtZW50c1tqXTsKKwkJCQlUeXBlQmluZGluZyBhcmdUeXBlID0gYXJndW1lbnQucmVzb2x2ZWRUeXBlOworCQkJCWlmKGFyZ1R5cGUgIT0gbnVsbCAmJiAhYXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHBhcmFtZXRlcnNbal0pKQorCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJfQorCisJCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1thcmd1bWVudHMubGVuZ3RoIC0gMV07CisJCQlpZihleHBlY3RlZFR5cGUgIT0gbnVsbCkgeworCQkJCWFkZEV4cGVjdGVkVHlwZShleHBlY3RlZFR5cGUsIHNjb3BlKTsKKwkJCX0KKwkJfQorCX0KIAlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JNZXNzYWdlU2VuZEZvckludGVyZmFjZSgKIAkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nLAogCQljaGFyW10gc2VsZWN0b3IsCkBAIC04MjAyLDExOCArMzg4OCwzMiBAQAogCQkJfQogCQl9CiAJfQotCQotCXByaXZhdGUgdm9pZCBjb21wdXRlRXhwZWN0ZWRUeXBlc0Zvck1lc3NhZ2VTZW5kKAotCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcsCi0JCWNoYXJbXSBzZWxlY3RvciwKLQkJRXhwcmVzc2lvbltdIGFyZ3VtZW50cywKLQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCi0JCVNjb3BlIHNjb3BlLAotCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKLQkJYm9vbGVhbiBpc1N0YXRpYykgewotCQkJCi0JCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gYmluZGluZy5hdmFpbGFibGVNZXRob2RzKCk7Ci0JCW5leHRNZXRob2QgOiBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCQotCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCi0JCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0KLQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCi0JCQlpZiAoaXNTdGF0aWMgJiYgIW1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCi0JCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eSAmJiAhbWV0aG9kLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dE1ldGhvZDsKLQkJCQotCQkJaWYoIUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgc2VsZWN0b3IpKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCi0JCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsKLQkJCWlmKHBhcmFtZXRlcnMubGVuZ3RoIDwgYXJndW1lbnRzLmxlbmd0aCkKLQkJCQljb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCQotCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOwotCQkJCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IGFyZ3VtZW50c1tqXTsKLQkJCQlUeXBlQmluZGluZyBhcmdUeXBlID0gYXJndW1lbnQucmVzb2x2ZWRUeXBlOwotCQkJCWlmKGFyZ1R5cGUgIT0gbnVsbCAmJiAhYXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHBhcmFtZXRlcnNbal0pKQotCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOwotCQkJfQotCQkJCQotCQkJVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlID0gbWV0aG9kLnBhcmFtZXRlcnNbYXJndW1lbnRzLmxlbmd0aCAtIDFdOwotCQkJaWYoZXhwZWN0ZWRUeXBlICE9IG51bGwpIHsKLQkJCQlhZGRFeHBlY3RlZFR5cGUoZXhwZWN0ZWRUeXBlLCBzY29wZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEV4cGVjdGVkVHlwZShUeXBlQmluZGluZyB0eXBlLCBTY29wZSBzY29wZSl7Ci0JCWlmICh0eXBlID09IG51bGwgfHwgIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuOwotCi0JCWludCBsZW5ndGggPSB0aGlzLmV4cGVjdGVkVHlwZXMubGVuZ3RoOwotCQlpZiAoKyt0aGlzLmV4cGVjdGVkVHlwZXNQdHIgPj0gbGVuZ3RoKQotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4cGVjdGVkVHlwZXMsIDAsIHRoaXMuZXhwZWN0ZWRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGggKiAyXSwgMCwgbGVuZ3RoKTsKLQkJdGhpcy5leHBlY3RlZFR5cGVzW3RoaXMuZXhwZWN0ZWRUeXBlc1B0cl0gPSB0eXBlOwotCQkKLQkJaWYodHlwZSA9PSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpKSB7Ci0JCQl0aGlzLmhhc0phdmFMYW5nT2JqZWN0QXNFeHBlY3RlZFR5cGUgPSB0cnVlOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRGb3JiaWRkZW5CaW5kaW5ncyhCaW5kaW5nIGJpbmRpbmcpewotCQlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuZm9yYmJpZGVuQmluZGluZ3MubGVuZ3RoOwotCQlpZiAoKyt0aGlzLmZvcmJiaWRlbkJpbmRpbmdzUHRyID49IGxlbmd0aCkKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5mb3JiYmlkZW5CaW5kaW5ncywgMCwgdGhpcy5mb3JiYmlkZW5CaW5kaW5ncyA9IG5ldyBCaW5kaW5nW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOwotCQl0aGlzLmZvcmJiaWRlbkJpbmRpbmdzW3RoaXMuZm9yYmJpZGVuQmluZGluZ3NQdHJdID0gYmluZGluZzsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZFVuaW50ZXJlc3RpbmdCaW5kaW5ncyhCaW5kaW5nIGJpbmRpbmcpewotCQlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzLmxlbmd0aDsKLQkJaWYgKCsrdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NQdHIgPj0gbGVuZ3RoKQotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5ncywgMCwgdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3MgPSBuZXcgQmluZGluZ1tsZW5ndGggKiAyXSwgMCwgbGVuZ3RoKTsKLQkJdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NbdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NQdHJdID0gYmluZGluZzsKLQl9CiAKIAlwcml2YXRlIFNjb3BlIGNvbXB1dGVGb3JiaWRkZW5CaW5kaW5ncyhBU1ROb2RlIGFzdE5vZGUsIEFTVE5vZGUgYXN0Tm9kZVBhcmVudCwgU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5mb3JiYmlkZW5CaW5kaW5nc0ZpbHRlciA9IE5PTkU7CiAJCWlmKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9ICgoQ2xhc3NTY29wZSlzY29wZSkucmVmZXJlbmNlQ29udGV4dDsKIAkJCWlmKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzID09IGFzdE5vZGUpIHsKLQkJCQl0aGlzLmFkZEZvcmJpZGRlbkJpbmRpbmdzKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQlhZGRGb3JiaWRkZW5CaW5kaW5ncyh0eXBlRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQkJYWRkRm9yYmlkZGVuQmluZGluZ3NGb3JNZW1iZXJUeXBlcyh0eXBlRGVjbGFyYXRpb24pOwogCQkJCXJldHVybiBzY29wZS5wYXJlbnQ7CiAJCQl9CiAJCQlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKIAkJCWludCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMgPT0gbnVsbCA/IDAgOiBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQkJaW50IGFzdE5vZGVJbmRleCA9IC0xOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCWlmKHN1cGVySW50ZXJmYWNlc1tpXSA9PSBhc3ROb2RlKSB7Ci0JCQkJCXRoaXMuYWRkRm9yYmlkZGVuQmluZGluZ3ModHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOwotCQkJCQlyZXR1cm4gc2NvcGUucGFyZW50OworCQkJCQlhZGRGb3JiaWRkZW5CaW5kaW5ncyh0eXBlRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQkJCWFkZEZvcmJpZGRlbkJpbmRpbmdzRm9yTWVtYmVyVHlwZXModHlwZURlY2xhcmF0aW9uKTsKKwkJCQkJYXN0Tm9kZUluZGV4ID0gaTsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGFzdE5vZGVQYXJlbnQgIT0gbnVsbCAmJiBhc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBpc0V4Y2VwdGlvbiA9IGZhbHNlOwotCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQkJCQlpc0V4Y2VwdGlvbiA9ICgoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSlhc3ROb2RlKS5pc0V4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQkJCQkJaXNFeGNlcHRpb24gPSAoKENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpYXN0Tm9kZSkuaXNFeGNlcHRpb24oKTsKLQkJCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewotCQkJCQlpc0V4Y2VwdGlvbiA9ICgoQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpYXN0Tm9kZSkuaXNFeGNlcHRpb24oKTsKKwkJCWlmIChhc3ROb2RlSW5kZXggPj0gMCkgeworCQkJCS8vIE5lZWQgdG8gbG9vcCBvbmx5IHVwIHRvIGFzdE5vZGVJbmRleCBhcyB0aGUgcmVzdCB3aWxsIGJlIHVuZGVmaW5lZC4KKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFzdE5vZGVJbmRleDsgaSsrKSB7CisJCQkJCWFkZEZvcmJpZGRlbkJpbmRpbmdzKHN1cGVySW50ZXJmYWNlc1tpXS5yZXNvbHZlZFR5cGUpOwogCQkJCX0KLQkJCQlpZiAoaXNFeGNlcHRpb24pIHsKLQkJCQkJQXJndW1lbnRbXSBjYXRjaEFyZ3VtZW50cyA9ICgoVHJ5U3RhdGVtZW50KSBhc3ROb2RlUGFyZW50KS5jYXRjaEFyZ3VtZW50czsKLQkJCQkJaW50IGxlbmd0aCA9IGNhdGNoQXJndW1lbnRzID09IG51bGwgPyAwIDogY2F0Y2hBcmd1bWVudHMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUeXBlQmluZGluZyBjYXVnaHRFeGNlcHRpb24gPSBjYXRjaEFyZ3VtZW50c1tpXS50eXBlLnJlc29sdmVkVHlwZTsKLQkJCQkJCWlmIChjYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCXRoaXMuYWRkRm9yYmlkZGVuQmluZGluZ3MoY2F1Z2h0RXhjZXB0aW9uKTsKLQkJCQkJCQl0aGlzLmtub3duVHlwZXMucHV0KENoYXJPcGVyYXRpb24uY29uY2F0KGNhdWdodEV4Y2VwdGlvbi5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLCBjYXVnaHRFeGNlcHRpb24ucXVhbGlmaWVkU291cmNlTmFtZSgpLCAnLicpLCB0aGlzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0aGlzLmZvcmJiaWRlbkJpbmRpbmdzRmlsdGVyID0gU1VCVFlQRTsKLQkJCQl9CisJCQkJcmV0dXJuIHNjb3BlLnBhcmVudDsKIAkJCX0KIAkJfQogLy8JCWVsc2UgaWYoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSkgewpAQCAtODMyNCw4NyArMzkyNCw4MDkwIEBACiAvLwkJfQogCQlyZXR1cm4gc2NvcGU7CiAJfQorCisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDQzNworCXByaXZhdGUgdm9pZCBhZGRGb3JiaWRkZW5CaW5kaW5nc0Zvck1lbWJlclR5cGVzKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwkJVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZXMgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXM7CisJCWludCBtZW1iZXJUeXBlc0xlbiA9IG1lbWJlclR5cGVzID09IG51bGwgPyAwIDogbWVtYmVyVHlwZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzTGVuOyBpKyspIHsKKwkJCWFkZEZvcmJpZGRlbkJpbmRpbmdzKG1lbWJlclR5cGVzW2ldLmJpbmRpbmcpOworCQkJYWRkRm9yYmlkZGVuQmluZGluZ3NGb3JNZW1iZXJUeXBlcyhtZW1iZXJUeXBlc1tpXSk7CisJCX0KKwl9CisKIAlwcml2YXRlIGNoYXJbXSBjb21wdXRlUHJlZml4KFNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmF0aW9uVHlwZSwgU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpewotCQkKKwogCQlTdHJpbmdCdWZmZXIgY29tcGxldGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwogCiAJCWlmIChpc1N0YXRpYykgewogCQkJY29tcGxldGlvbi5hcHBlbmQoZGVjbGFyYXRpb25UeXBlLnNvdXJjZU5hbWUoKSk7Ci0JCQkKKwogCQl9IGVsc2UgaWYgKGRlY2xhcmF0aW9uVHlwZSA9PSBpbnZvY2F0aW9uVHlwZSkgewogCQkJY29tcGxldGlvbi5hcHBlbmQoVEhJUyk7Ci0JCQkKKwogCQl9IGVsc2UgewotCQkJCisKIAkJCWlmICghZGVjbGFyYXRpb25UeXBlLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkJCisKIAkJCQljb21wbGV0aW9uLmFwcGVuZChkZWNsYXJhdGlvblR5cGUuc291cmNlTmFtZSgpKTsKIAkJCQljb21wbGV0aW9uLmFwcGVuZCgnLicpOwogCQkJCWNvbXBsZXRpb24uYXBwZW5kKFRISVMpOwogCiAJCQl9IGVsc2UgaWYgKCFkZWNsYXJhdGlvblR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsKLQkJCQkKKwogCQkJCWNvbXBsZXRpb24uYXBwZW5kKGRlY2xhcmF0aW9uVHlwZS5zb3VyY2VOYW1lKCkpOwogCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcuJyk7CiAJCQkJY29tcGxldGlvbi5hcHBlbmQoVEhJUyk7CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBjb21wbGV0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwl9CisKKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQW5ub3RhdGlvbigpeworCQlpZih0aGlzLmFzc2lzdE5vZGVJc0Fubm90YXRpb24pIHsKKwkJCXJldHVybiBSX0FOTk9UQVRJT047CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb25UYXJnZXQoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpeworCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uICYmCisJCQkJKHRoaXMudGFyZ2V0ZWRFbGVtZW50ICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSykgIT0gMCkgeworCQkJbG9uZyB0YXJnZXQgPSB0eXBlQmluZGluZy5nZXRBbm5vdGF0aW9uVGFnQml0cygpICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSzsKKwkJCWlmKHRhcmdldCA9PSAwIHx8ICh0YXJnZXQgJiB0aGlzLnRhcmdldGVkRWxlbWVudCkgIT0gMCkgeworCQkJCXJldHVybiBSX1RBUkdFVDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaW50IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoY2hhcltdIHRva2VuLCBjaGFyW10gcHJvcG9zYWxOYW1lKXsKKwkJaWYgKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCkgeworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7CisJCQkJcmV0dXJuIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRTsKKwkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7CisJCQkJcmV0dXJuIFJfQ0FTRTsKKwkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0b2tlbiwgcHJvcG9zYWxOYW1lKSl7CisJCQkJcmV0dXJuIFJfQ0FNRUxfQ0FTRTsKKwkJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLmVxdWFscyh0b2tlbiwgcHJvcG9zYWxOYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIHsKKwkJCQlyZXR1cm4gUl9FWEFDVF9OQU1FOworCQkJfQorCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBwcm9wb3NhbE5hbWUsIHRydWUgLyogZG8gbm90IGlnbm9yZSBjYXNlICovKSkgeworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7CisJCQkJcmV0dXJuIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIFJfQ0FTRTsKKwkJCX0KKwkJfSBlbHNlIGlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHRva2VuLCBwcm9wb3NhbE5hbWUsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKSkgeworCQkJcmV0dXJuIFJfRVhBQ1RfTkFNRTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKXsKKwkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgeworCQkJcmV0dXJuIFJfQ0xBU1M7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckVudW0oKXsKKwkJaWYodGhpcy5hc3Npc3ROb2RlSXNFbnVtKSB7CisJCQlyZXR1cm4gUl9FTlVNOworCQl9CisJCXJldHVybiAwOworCX0KKworCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtQ29uc3RhbnQoVHlwZUJpbmRpbmcgcHJvcG9zYWxUeXBlKXsKKwkJaWYodGhpcy5hc3Npc3ROb2RlSXNFbnVtICYmCisJCQkJcHJvcG9zYWxUeXBlICE9IG51bGwgJiYKKwkJCQl0aGlzLmV4cGVjdGVkVHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5leHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQlpZiAocHJvcG9zYWxUeXBlLmlzRW51bSgpICYmCisJCQkJCQlwcm9wb3NhbFR5cGUgPT0gdGhpcy5leHBlY3RlZFR5cGVzW2ldKSB7CisJCQkJCXJldHVybiBSX0VOVU0gKyBSX0VOVU1fQ09OU1RBTlQ7CisJCQkJfQorCisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbigpeworCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24pIHsKKwkJCXJldHVybiBSX0VYQ0VQVElPTjsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKGNoYXJbXSBwcm9wb3NhbE5hbWUpeworCisJCWlmKCh0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbiB8fCAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5FWENFUFRJT04pICE9IDAgKSYmCisJCQkoQ2hhck9wZXJhdGlvbi5tYXRjaChFWENFUFRJT05fUEFUVEVSTiwgcHJvcG9zYWxOYW1lLCBmYWxzZSkgfHwKKwkJCUNoYXJPcGVyYXRpb24ubWF0Y2goRVJST1JfUEFUVEVSTiwgcHJvcG9zYWxOYW1lLCBmYWxzZSkpKSB7CisJCQlyZXR1cm4gUl9FWENFUFRJT047CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpeworCQlpZih0aGlzLmV4cGVjdGVkVHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5leHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgcGFja2FnZU5hbWUpICYmCisJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksIHR5cGVOYW1lKSkgeworCQkJCQlyZXR1cm4gUl9FWEFDVF9FWFBFQ1RFRF9UWVBFOworCQkJCX0KKwkJCX0KKwkJCWlmKHRoaXMuaGFzSmF2YUxhbmdPYmplY3RBc0V4cGVjdGVkVHlwZSkgeworCQkJCXJldHVybiBSX0VYUEVDVEVEX1RZUEU7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcgcHJvcG9zYWxUeXBlKXsKKwkJaWYodGhpcy5leHBlY3RlZFR5cGVzICE9IG51bGwgJiYgcHJvcG9zYWxUeXBlICE9IG51bGwpIHsKKwkJCWludCByZWxldmFuY2UgPSAwOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTI5NgorCQkJLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGV4cGVjdGVkIHR5cGUsIHRoZW4gdm9pZCBwcm9wb3NhbCB0eXBlcyBhdHRyYWN0IGEgZGVncmFkZWQgcmVsZXZhbmNlLiAgCisJCQlpZiAocHJvcG9zYWxUeXBlID09IFR5cGVCaW5kaW5nLlZPSUQgJiYgdGhpcy5leHBlY3RlZFR5cGVzUHRyID49MCkgeworCQkJCXJldHVybiBSX1ZPSUQ7CisJCQl9CQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5leHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQlpZigodGhpcy5leHBlY3RlZFR5cGVzRmlsdGVyICYgU1VCVFlQRSkgIT0gMAorCQkJCQkJJiYgcHJvcG9zYWxUeXBlLmlzQ29tcGF0aWJsZVdpdGgodGhpcy5leHBlY3RlZFR5cGVzW2ldKSkgeworCisJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLCBwcm9wb3NhbFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSkgJiYKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCBwcm9wb3NhbFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKSkgeworCQkJCQkJcmV0dXJuIFJfRVhBQ1RfRVhQRUNURURfVFlQRTsKKwkJCQkJfQorCisJCQkJCXJlbGV2YW5jZSA9IFJfRVhQRUNURURfVFlQRTsKKwkJCQl9CisJCQkJaWYoKHRoaXMuZXhwZWN0ZWRUeXBlc0ZpbHRlciAmIFNVUEVSVFlQRSkgIT0gMAorCQkJCQkJJiYgdGhpcy5leHBlY3RlZFR5cGVzW2ldLmlzQ29tcGF0aWJsZVdpdGgocHJvcG9zYWxUeXBlKSkgeworCisJCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLCBwcm9wb3NhbFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSkgJiYKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCBwcm9wb3NhbFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKSkgeworCQkJCQkJcmV0dXJuIFJfRVhBQ1RfRVhQRUNURURfVFlQRTsKKwkJCQkJfQorCisJCQkJCXJlbGV2YW5jZSA9IFJfRVhQRUNURURfVFlQRTsKKwkJCQl9CisJCQkJLy8gQnVnIDg0NzIwIC0gWzEuNV1bYXNzaXN0XSBwcm9wb3NhbCByYW5raW5nIGJ5IHJldHVybiB2YWx1ZSBzaG91bGQgY29uc2lkZXIgYXV0byh1bilib3hpbmcKKwkJCQkvLyBKdXN0IGVuc3VyaW5nIHRoYXQgdGhlIHVuaXRTY29wZSBpcyBub3QgbnVsbCwgZXZlbiB0aG91Z2ggaXQncyBhbiB1bmxpa2VseSBjYXNlLgorCQkJCWlmICh0aGlzLnVuaXRTY29wZSAhPSBudWxsICYmIHRoaXMudW5pdFNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgocHJvcG9zYWxUeXBlLCB0aGlzLmV4cGVjdGVkVHlwZXNbaV0pKSB7CisJCQkJCXJlbGV2YW5jZSA9IFJfRVhQRUNURURfVFlQRTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVsZXZhbmNlOworCQl9CisJCXJldHVybiAwOworCX0KKworCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JJbmhlcml0YW5jZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCQlpZiAocmVjZWl2ZXJUeXBlID09IGRlY2xhcmluZ0NsYXNzKSByZXR1cm4gUl9OT05fSU5IRVJJVEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKXsKKwkJcmV0dXJuIGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKG51bGwpOworCX0KKworCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKEJpbmRpbmcgYmluZGluZyl7CisJCWlmKHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzUHRyOyBpKyspIHsKKwkJCQlpZih0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5nc1tpXSA9PSBiaW5kaW5nKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZigodGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NGaWx0ZXIgJiBTVUJUWVBFKSAhPSAwKSB7CisJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcgJiYKKwkJCQkJCQl0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5nc1tpXSBpbnN0YW5jZW9mIFR5cGVCaW5kaW5nICYmCisJCQkJCQkJKChUeXBlQmluZGluZyliaW5kaW5nKS5pc0NvbXBhdGlibGVXaXRoKChUeXBlQmluZGluZyl0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5nc1tpXSkpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICgodGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NGaWx0ZXIgJiBTVVBFUlRZUEUpICE9IDApIHsKKwkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZyAmJgorCQkJCQkJCXRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzW2ldIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcgJiYKKwkJCQkJCQkoKFR5cGVCaW5kaW5nKXRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzW2ldKS5pc0NvbXBhdGlibGVXaXRoKChUeXBlQmluZGluZyliaW5kaW5nKSkgeworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFJfSU5URVJFU1RJTkc7CisJfQorCQorCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKGNoYXJbXSBnaXZlblBrZ05hbWUsIGNoYXJbXSBmdWxsVHlwZU5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NQdHI7IGkrKykgeworCQkJaWYgKHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzW2ldIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsKKwkJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IChUeXBlQmluZGluZykgdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NbaV07CisJCQkJY2hhcltdIGN1cnJQa2dOYW1lID0gdHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZ2l2ZW5Qa2dOYW1lLCBjdXJyUGtnTmFtZSkpCXsKKwkJCQkJY2hhcltdIGN1cnJUeXBlTmFtZSA9IHR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZ1bGxUeXBlTmFtZSwgY3VyclR5cGVOYW1lKSkgeworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFJfSU5URVJFU1RJTkc7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpeworCQlpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgeworCQkJcmV0dXJuIFJfSU5URVJGQUNFOworCQl9CisJCXJldHVybiAwOworCX0KKworCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMoYm9vbGVhbiBoYXNQcm9ibGVtcykgeworCQlpZiAoIWhhc1Byb2JsZW1zKSB7CisJCQlyZXR1cm4gUl9OT19QUk9CTEVNUzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaW50IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGJvb2xlYW4gcHJlZml4UmVxdWlyZWQpIHsKKwkJaWYoIXByZWZpeFJlcXVpcmVkICYmICF0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJcmV0dXJuIFJfVU5RVUFMSUZJRUQ7CisJCX0KKworCQlpZihwcmVmaXhSZXF1aXJlZCAmJiB0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJcmV0dXJuIFJfUVVBTElGSUVEOworCQl9CisJCXJldHVybiAwOworCX0KKworCWludCBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpeworCQlyZXR1cm4gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24odHJ1ZSk7CisJfQorCisJaW50IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKGJvb2xlYW4gaXNSZXNvbHZlZCl7CisJCWlmIChpc1Jlc29sdmVkKSB7CisJCQlyZXR1cm4gUl9SRVNPTFZFRDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpbnQgY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhpbnQgYWNjZXNzUnVsZUtpbmQpIHsKKwkJaWYoYWNjZXNzUnVsZUtpbmQgPT0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKSB7CisJCQlyZXR1cm4gUl9OT05fUkVTVFJJQ1RFRDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKGJvb2xlYW4gb25seVN0YXRpYywgYm9vbGVhbiBpc1N0YXRpYykgeworCQlpZih0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSAmJiAhb25seVN0YXRpYyAmJiAhaXNTdGF0aWMpIHsKKwkJCXJldHVybiBSX05PTl9TVEFUSUM7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCQorCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JGaW5hbChib29sZWFuIG9ubHlGaW5hbCwgYm9vbGVhbiBpc0ZpbmFsKSB7CisJCWlmIChvbmx5RmluYWwgJiYgaXNGaW5hbCkgeworCQkJcmV0dXJuIFJfRklOQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSBsb25nIGNvbXB1dGVUYXJnZXRlZEVsZW1lbnQoQ29tcGxldGlvbk9uQW5ub3RhdGlvbk9mVHlwZSBmYWtlTm9kZSkgeworCQlBU1ROb2RlIGFubm90YXRlZEVsZW1lbnQgPSBmYWtlTm9kZS5wb3RlbnRpYWxBbm5vdGF0ZWROb2RlOworCisJCWlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gYW5ub3RhdGVkVHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgYW5ub3RhdGVkRWxlbWVudDsKKwkJCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZChhbm5vdGF0ZWRUeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKSA9PSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wpIHsKKwkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yQW5ub3RhdGlvblR5cGUgfCBUYWdCaXRzLkFubm90YXRpb25Gb3JUeXBlOworCQkJfQorCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGU7CisJCX0gZWxzZSBpZiAoYW5ub3RhdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCWlmIChmYWtlTm9kZS5pc1BhcmFtZXRlcikgeworCQkJCXJldHVybiBUYWdCaXRzLkFubm90YXRpb25Gb3JQYXJhbWV0ZXI7CisJCQl9CisJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yRmllbGQ7CisJCX0gZWxzZSBpZiAoYW5ub3RhdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yTWV0aG9kOworCQl9IGVsc2UgaWYgKGFubm90YXRlZEVsZW1lbnQgaW5zdGFuY2VvZiBBcmd1bWVudCkgeworCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhcmFtZXRlcjsKKwkJfSBlbHNlIGlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgeworCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckNvbnN0cnVjdG9yOworCQl9IGVsc2UgaWYgKGFubm90YXRlZEVsZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yTG9jYWxWYXJpYWJsZTsKKwkJfSBlbHNlIGlmIChhbm5vdGF0ZWRFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcHJpdmF0ZSBUeXBlQmluZGluZ1tdIGNvbXB1dGVUeXBlcyhFeHByZXNzaW9uW10gYXJndW1lbnRzKSB7CisJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1thcmdzTGVuZ3RoXTsKKwkJZm9yIChpbnQgYSA9IGFyZ3NMZW5ndGg7IC0tYSA+PSAwOykgeworCQkJYXJnVHlwZXNbYV0gPSBhcmd1bWVudHNbYV0ucmVzb2x2ZWRUeXBlOworCQl9CisJCXJldHVybiBhcmdUeXBlczsKKwl9CisKKwlwcml2YXRlIFR5cGVCaW5kaW5nW10gY29tcHV0ZVR5cGVzSWZDb3JyZWN0KEV4cHJlc3Npb25bXSBhcmd1bWVudHMpIHsKKwkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJaW50IGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2FyZ3NMZW5ndGhdOworCQlmb3IgKGludCBhID0gYXJnc0xlbmd0aDsgLS1hID49IDA7KSB7CisJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFyZ3VtZW50c1thXS5yZXNvbHZlZFR5cGU7CisJCQlpZih0eXBlQmluZGluZyA9PSBudWxsIHx8ICF0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSByZXR1cm4gbnVsbDsKKwkJCWFyZ1R5cGVzW2FdID0gdHlwZUJpbmRpbmc7CisJCX0KKwkJcmV0dXJuIGFyZ1R5cGVzOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlVW5pbnRlcmVzdGluZ0JpbmRpbmdzKEFTVE5vZGUgYXN0Tm9kZSwgQVNUTm9kZSBwYXJlbnQsIFNjb3BlIHNjb3BlKXsKKwkJdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NGaWx0ZXIgPSBOT05FOworCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQlhZGRVbmludGVyZXN0aW5nQmluZGluZ3MoKChMb2NhbERlY2xhcmF0aW9uKXBhcmVudCkuYmluZGluZyk7CisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQkJYWRkVW5pbnRlcmVzdGluZ0JpbmRpbmdzKCgoRmllbGREZWNsYXJhdGlvbilwYXJlbnQpLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgeworCQkJYm9vbGVhbiBpc0V4Y2VwdGlvbiA9IGZhbHNlOworCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQkJaXNFeGNlcHRpb24gPSAoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpYXN0Tm9kZSkuaXNFeGNlcHRpb24oKTsKKwkJCX0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQlpc0V4Y2VwdGlvbiA9ICgoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSlhc3ROb2RlKS5pc0V4Y2VwdGlvbigpOworCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQlpc0V4Y2VwdGlvbiA9ICgoQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpYXN0Tm9kZSkuaXNFeGNlcHRpb24oKTsKKwkJCX0KKwkJCWlmIChpc0V4Y2VwdGlvbikgeworCQkJCXRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzRmlsdGVyIHw9IFNVQlRZUEU7CisJCQkJLy8gc3VwZXItdHlwZXMgYWxzbyBuZWVkIHRvIGJlIGRpc2NvdXJhZ2VkIGlmIHdlJ3JlIGluIGEgdW5pb24gdHlwZSAoYnVnIDM1MDY1MikKKwkJCQlBcmd1bWVudFtdIGFyZ3MgPSAoKFRyeVN0YXRlbWVudClwYXJlbnQpLmNhdGNoQXJndW1lbnRzOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoYXJnc1tpXS50eXBlIGluc3RhbmNlb2YgVW5pb25UeXBlUmVmZXJlbmNlKSB7CisJCQkJCQlDb21wbGV0aW9uTm9kZURldGVjdG9yIGRldGVjdG9yID0gbmV3IENvbXBsZXRpb25Ob2RlRGV0ZWN0b3IoYXN0Tm9kZSwgYXJnc1tpXSk7CisJCQkJCQlpZiAoZGV0ZWN0b3IuY29udGFpbnNDb21wbGV0aW9uTm9kZSgpKSB7CisJCQkJCQkJdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NGaWx0ZXIgfD0gU1VQRVJUWVBFOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQogCQkJCQogCQkJfQogCQl9Ci0JCQotCQlyZXR1cm4gY29tcGxldGlvbi50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CiAJfQotCQotCXByaXZhdGUgdm9pZCBwcm9wb3NlTmV3TWV0aG9kKGNoYXJbXSB0b2tlbiwgUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2UpIHsKLQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTikpIHsKLQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOwotCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7Ci0JCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKLQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgbmV3IG1ldGhvZAotCQkJCi0JCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7Ci0JCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVmZXJlbmNlKSk7Ci0JCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoCi0JCQkJCWNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKLQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKLQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCi0JCQkJCQkJVk9JRCkpOwotCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShyZWZlcmVuY2UucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHJlZmVyZW5jZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOwotCQkJCi0JCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoVk9JRCk7Ci0JCQlwcm9wb3NhbC5zZXROYW1lKHRva2VuKTsKLQkJCS8vcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKG51bGwpOwotCQkJLy9wcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMobnVsbCk7Ci0JCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOwotCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbih0b2tlbik7Ci0JCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOworCisJcHJpdmF0ZSBjaGFyW10gY3JlYXRlSW1wb3J0Q2hhckFycmF5KGNoYXJbXSBpbXBvcnRlZEVsZW1lbnQsIGJvb2xlYW4gaXNTdGF0aWMsIGJvb2xlYW4gb25EZW1hbmQpIHsKKwkJY2hhcltdIHJlc3VsdCA9IElNUE9SVDsKKwkJaWYgKGlzU3RhdGljKSB7CisJCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIFNUQVRJQywgJyAnKTsKKwkJfQorCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIGltcG9ydGVkRWxlbWVudCwgJyAnKTsKKwkJaWYgKG9uRGVtYW5kKSB7CisJCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXN1bHQsIE9OX0RFTUFORCk7CisJCX0KKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KHJlc3VsdCwgSU1QT1JUX0VORCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU1ldGhvZChNZXRob2RCaW5kaW5nIG1ldGhvZCwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBTY29wZSBzY29wZSwgU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24pIHsKKwkJLy8vLyBNb2RpZmllcnMKKwkJLy8gZmx1c2ggdW5pbnRlcmVzdGluZyBtb2RpZmllcnMKKwkJaW50IGluc2VydGVkTW9kaWZpZXJzID0gbWV0aG9kLm1vZGlmaWVycyAmIH4oQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCk7CisJCWlmKGluc2VydGVkTW9kaWZpZXJzICE9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KXsKKwkJCUFTVE5vZGUucHJpbnRNb2RpZmllcnMoaW5zZXJ0ZWRNb2RpZmllcnMsIGNvbXBsZXRpb24pOworCQl9CisKKwkJLy8vLyBUeXBlIHBhcmFtZXRlcnMKKworCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlQmluZGluZ3MgPSBtZXRob2QudHlwZVZhcmlhYmxlczsKKwkJaWYodHlwZVZhcmlhYmxlQmluZGluZ3MgIT0gbnVsbCAmJiB0eXBlVmFyaWFibGVCaW5kaW5ncy5sZW5ndGggIT0gMCkgeworCQkJY29tcGxldGlvbi5hcHBlbmQoJzwnKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlQmluZGluZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlpZihpICE9IDApIHsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoJywnKTsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCQl9CisJCQkJY3JlYXRlVHlwZVZhcmlhYmxlKHR5cGVWYXJpYWJsZUJpbmRpbmdzW2ldLCBzY29wZSwgY29tcGxldGlvbik7CisJCQl9CisJCQljb21wbGV0aW9uLmFwcGVuZCgnPicpOworCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJfQorCisJCS8vLy8gUmV0dXJuIHR5cGUKKwkJY3JlYXRlVHlwZShtZXRob2QucmV0dXJuVHlwZSwgc2NvcGUsIGNvbXBsZXRpb24pOworCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCisJCS8vLy8gU2VsZWN0b3IKKwkJY29tcGxldGlvbi5hcHBlbmQobWV0aG9kLnNlbGVjdG9yKTsKKworCQljb21wbGV0aW9uLmFwcGVuZCgnKCcpOworCisJCS8vLy9QYXJhbWV0ZXJzCisJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QucGFyYW1ldGVyczsKKwkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYoaSAhPSAwKSB7CisJCQkJY29tcGxldGlvbi5hcHBlbmQoJywnKTsKKwkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJfQorCQkJY3JlYXRlVHlwZShwYXJhbWV0ZXJUeXBlc1tpXSwgc2NvcGUsIGNvbXBsZXRpb24pOworCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpeworCQkJCWNvbXBsZXRpb24uYXBwZW5kKHBhcmFtZXRlck5hbWVzW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tcGxldGlvbi5hcHBlbmQoJyUnKTsKKwkJCX0KKwkJfQorCisJCWNvbXBsZXRpb24uYXBwZW5kKCcpJyk7CisKKwkJLy8vLyBFeGNlcHRpb25zCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zID0gbWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CisKKwkJaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCAmJiBleGNlcHRpb25zLmxlbmd0aCA+IDApeworCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCWNvbXBsZXRpb24uYXBwZW5kKFRIUk9XUyk7CisJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJZm9yKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoIDsgaSsrKXsKKwkJCQlpZihpICE9IDApIHsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoJywnKTsKKwkJCQl9CisJCQkJY3JlYXRlVHlwZShleGNlcHRpb25zW2ldLCBzY29wZSwgY29tcGxldGlvbik7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlUHJvcG9zYWwoaW50IGtpbmQsIGludCBjb21wbGV0aW9uT2Zmc2V0KSB7CisJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKGtpbmQsIGNvbXBsZXRpb25PZmZzZXQgLSB0aGlzLm9mZnNldCk7CisJCXByb3Bvc2FsLm5hbWVMb29rdXAgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwOworCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJcmV0dXJuIHByb3Bvc2FsOworCX0KKworCXByaXZhdGUgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKEJpbmRpbmcgYmluZGluZywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7CisKKwkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IHR5cGVCaW5kaW5nLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7CisJCQljaGFyW10gdHlwZU5hbWUgPSB0eXBlQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQljaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOworCisJCQlwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7CisJCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKKwkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRSZXF1aXJlZFR5cGVTaWduYXR1cmUodHlwZUJpbmRpbmcpKTsKKwkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oZnVsbHlRdWFsaWZpZWROYW1lKTsKKwkJCXByb3Bvc2FsLnNldEZsYWdzKHR5cGVCaW5kaW5nLm1vZGlmaWVycyk7CisJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgZW5kIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCBlbmQgLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCisJCQljaGFyW10gcGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lLCAnLicpOworCisJCQlwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihwYWNrYWdlTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgZW5kIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCBlbmQgLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJfQorCQlyZXR1cm4gcHJvcG9zYWw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGUoVHlwZUJpbmRpbmcgdHlwZSwgU2NvcGUgc2NvcGUsIFN0cmluZ0J1ZmZlciBjb21wbGV0aW9uKSB7CisJCXN3aXRjaCAodHlwZS5raW5kKCkpIHsKKwkJCWNhc2UgQmluZGluZy5CQVNFX1RZUEUgOgorCQkJCWNvbXBsZXRpb24uYXBwZW5kKHR5cGUuc291cmNlTmFtZSgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6IC8vIFRPRE8gKGRhdmlkKSBuZWVkIHRvIGhhbmRsZSBpbnRlcnNlY3Rpb24gdHlwZSBzcGVjaWZpY2FsbHkKKwkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgdHlwZTsKKwkJCQljb21wbGV0aW9uLmFwcGVuZCgnPycpOworCQkJCXN3aXRjaCAod2lsZGNhcmRCaW5kaW5nLmJvdW5kS2luZCkgeworCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6CisJCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoRVhURU5EUyk7CisJCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQkJY3JlYXRlVHlwZSh3aWxkY2FyZEJpbmRpbmcuYm91bmQsIHNjb3BlLCBjb21wbGV0aW9uKTsKKwkJCQkJCWlmKHdpbGRjYXJkQmluZGluZy5vdGhlckJvdW5kcyAhPSBudWxsKSB7CisKKwkJCQkJCQlpbnQgbGVuZ3RoID0gd2lsZGNhcmRCaW5kaW5nLm90aGVyQm91bmRzLmxlbmd0aDsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7CisJCQkJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcmJyk7CisJCQkJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7CisJCQkJCQkJCWNyZWF0ZVR5cGUod2lsZGNhcmRCaW5kaW5nLm90aGVyQm91bmRzW2ldLCBzY29wZSwgY29tcGxldGlvbik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CisJCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoU1VQRVIpOworCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCQkJCWNyZWF0ZVR5cGUod2lsZGNhcmRCaW5kaW5nLmJvdW5kLCBzY29wZSwgY29tcGxldGlvbik7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CisJCQkJY3JlYXRlVHlwZSh0eXBlLmxlYWZDb21wb25lbnRUeXBlKCksIHNjb3BlLCBjb21wbGV0aW9uKTsKKwkJCQlpbnQgZGltID0gdHlwZS5kaW1lbnNpb25zKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW07IGkrKykgeworCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnWycpOworCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnXScpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHR5cGU7CisJCQkJaWYgKHR5cGUuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCQkJY3JlYXRlVHlwZShwYXJhbWV0ZXJpemVkVHlwZS5lbmNsb3NpbmdUeXBlKCksIHNjb3BlLCBjb21wbGV0aW9uKTsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoJy4nKTsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQocGFyYW1ldGVyaXplZFR5cGUuc291cmNlTmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhcmFtZXRlcml6ZWRUeXBlLmdlbmVyaWNUeXBlKCkuY29tcG91bmROYW1lLCAnLicpKTsKKwkJCQl9CisJCQkJaWYgKHBhcmFtZXRlcml6ZWRUeXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCc8Jyk7CisJCQkJICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbWV0ZXJpemVkVHlwZS5hcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkgICAgICAgIGlmIChpICE9IDApIGNvbXBsZXRpb24uYXBwZW5kKCcsJyk7CisJCQkJICAgICAgICBjcmVhdGVUeXBlKHBhcmFtZXRlcml6ZWRUeXBlLmFyZ3VtZW50c1tpXSwgc2NvcGUsIGNvbXBsZXRpb24pOworCQkJCSAgICB9CisJCQkJICAgIGNvbXBsZXRpb24uYXBwZW5kKCc+Jyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJY2hhcltdIHR5cGVOYW1lID0gdHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQlpZihtdXN0UXVhbGlmeVR5cGUoCisJCQkJCShSZWZlcmVuY2VCaW5kaW5nKXR5cGUsCisJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQlzY29wZSkpIHsKKwkJCQljb21wbGV0aW9uLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgdHlwZU5hbWUsJy4nKSk7CisJCQl9IGVsc2UgeworCQkJCWNvbXBsZXRpb24uYXBwZW5kKHR5cGUuc291cmNlTmFtZSgpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBjb21wbGV0aW9uIHByb3Bvc2FsIGZvciBhIG1lbWJlciB0eXBlLgorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlUGFyYW1ldGVyUHJvcG9zYWwoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyLCBpbnQgcmVsZXZhbmNlKSB7CisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IHR5cGVQYXJhbWV0ZXIubmFtZTsKKworCQkvLyBDcmVhdGUgc3RhbmRhcmQgdHlwZSBwcm9wb3NhbAorCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCXByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOworCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZSh0eXBlUGFyYW1ldGVyLmJpbmRpbmcpKTsKKwkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGNvbXBsZXRpb25OYW1lKTsKKwkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOworCQkJcHJvcG9zYWwuc2V0RmxhZ3ModHlwZVBhcmFtZXRlci5tb2RpZmllcnMpOwogCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKIAkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwogCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKIAkJCWlmKERFQlVHKSB7CiAJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKIAkJCX0KIAkJfQorCisJCS8vIENyZWF0ZSBqYXZhZG9jIHRleHQgcHJvcG9zYWwgaWYgbmVjZXNzYXJ5CisJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfVFlQRV9SRUYpKSB7CisJCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb249IGlubGluZVRhZ0NvbXBsZXRpb24oY29tcGxldGlvbk5hbWUsIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOworCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwpIENvbXBsZXRpb25Qcm9wb3NhbC5jcmVhdGUoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7CisJCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZVBhcmFtZXRlci5iaW5kaW5nKSk7CisJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShqYXZhZG9jQ29tcGxldGlvbik7CisJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKKwkJCXByb3Bvc2FsLnNldEZsYWdzKHR5cGVQYXJhbWV0ZXIubW9kaWZpZXJzKTsKKwkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7CisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJaWYoREVCVUcpIHsKKwkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBjb21wbGV0aW9uIHByb3Bvc2FsIGZvciBhIHR5cGUuCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGVQcm9wb3NhbChjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGFjY2Vzc2liaWxpdHksIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IHJlbGV2YW5jZSkgeworCisJCS8vIENyZWF0ZSBzdGFuZGFyZCB0eXBlIHByb3Bvc2FsCisJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSAmJiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5PTkxZX0lOTElORV9UQUcpID09IDApIHsKKwkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCXByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOworCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOworCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOworCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRGbGFncyhtb2RpZmllcnMpOworCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJcHJvcG9zYWwuc2V0QWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5KTsKKwkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQlpZihERUJVRykgeworCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQl9CisJCX0KKworCQkvLyBDcmVhdGUgamF2YWRvYyB0ZXh0IHByb3Bvc2FsIGlmIG5lY2Vzc2FyeQorCQlpZiAoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSkgeworCQkJY2hhcltdIGphdmFkb2NDb21wbGV0aW9uPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb25OYW1lLCBKYXZhZG9jVGFnQ29uc3RhbnRzLlRBR19MSU5LKTsKKwkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLm5hbWVMb29rdXAgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwOworCQkJcHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7CisJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoY3JlYXRlTm9uR2VuZXJpY1R5cGVTaWduYXR1cmUocGFja2FnZU5hbWUsIHR5cGVOYW1lKSk7CisJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKKwkJCXByb3Bvc2FsLnNldEZsYWdzKG1vZGlmaWVycyk7CisJCQlpbnQgc3RhcnQgPSAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5SRVBMQUNFX1RBRykgIT0gMCA/IHRoaXMuamF2YWRvY1RhZ1Bvc2l0aW9uIDogdGhpcy5zdGFydFBvc2l0aW9uOworCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZStSX0lOTElORV9UQUcpOworCQkJcHJvcG9zYWwuc2V0QWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5KTsKKwkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQlpZihERUJVRykgeworCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIGNvbXBsZXRpb24gcHJvcG9zYWwgZm9yIGEgbWVtYmVyIHR5cGUuCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGVQcm9wb3NhbCgKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZywKKwkJCWNoYXJbXSB0eXBlTmFtZSwKKwkJCWludCBhY2Nlc3NpYmlsaXR5LAorCQkJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCQkJaW50IHJlbGV2YW5jZSwKKwkJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpIHsKKworCQkvLyBDcmVhdGUgc3RhbmRhcmQgdHlwZSBwcm9wb3NhbAorCQlpZighdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgJiYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuT05MWV9JTkxJTkVfVEFHKSA9PSAwKSB7CisJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCkgQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7CisJCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0Q29tcGxldGVkVHlwZVNpZ25hdHVyZShyZWZCaW5kaW5nKSk7CisJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShyZWZCaW5kaW5nLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOworCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCisJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1tpXSwKKwkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAorCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCX0KKwkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOworCQkJfQorCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRGbGFncyhyZWZCaW5kaW5nLm1vZGlmaWVycyk7CisJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJaWYoREVCVUcpIHsKKwkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJfQorCQl9CisKKwkJLy8gQ3JlYXRlIGphdmFkb2MgdGV4dCBwcm9wb3NhbCBpZiBuZWNlc3NhcnkKKwkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRikpIHsKKwkJCWNoYXJbXSBqYXZhZG9jQ29tcGxldGlvbj0gaW5saW5lVGFnQ29tcGxldGlvbihjb21wbGV0aW9uTmFtZSwgSmF2YWRvY1RhZ0NvbnN0YW50cy5UQUdfTElOSyk7CisJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCkgQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCXByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOworCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocmVmQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRDb21wbGV0ZWRUeXBlU2lnbmF0dXJlKHJlZkJpbmRpbmcpKTsKKwkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7CisJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKKwkJCXByb3Bvc2FsLnNldEZsYWdzKHJlZkJpbmRpbmcubW9kaWZpZXJzKTsKKwkJCWludCBzdGFydCA9ICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlJFUExBQ0VfVEFHKSAhPSAwID8gdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gOiB0aGlzLnN0YXJ0UG9zaXRpb247CisJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7CisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJaWYoREVCVUcpIHsKKwkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJfQorCQl9CisJfQorCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUsIFNjb3BlIHNjb3BlLCBTdHJpbmdCdWZmZXIgY29tcGxldGlvbikgeworCQljb21wbGV0aW9uLmFwcGVuZCh0eXBlVmFyaWFibGUuc291cmNlTmFtZSk7CisKKwkJaWYgKHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzICE9IG51bGwgJiYgdHlwZVZhcmlhYmxlLmZpcnN0Qm91bmQgPT0gdHlwZVZhcmlhYmxlLnN1cGVyY2xhc3MpIHsKKwkJICAgIGNvbXBsZXRpb24uYXBwZW5kKCcgJyk7CisJCSAgICBjb21wbGV0aW9uLmFwcGVuZChFWFRFTkRTKTsKKwkJICAgIGNvbXBsZXRpb24uYXBwZW5kKCcgJyk7CisJCSAgICBjcmVhdGVUeXBlKHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzLCBzY29wZSwgY29tcGxldGlvbik7CisJCX0KKwkJaWYgKHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCSAgIGlmICh0eXBlVmFyaWFibGUuZmlyc3RCb3VuZCAhPSB0eXBlVmFyaWFibGUuc3VwZXJjbGFzcykgeworCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCSAgIGNvbXBsZXRpb24uYXBwZW5kKEVYVEVORFMpOworCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJICAgfQorCQkgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZVZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJICAgaWYgKGkgPiAwIHx8IHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzKSB7CisJCQkJICAgY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCQkgICBjb21wbGV0aW9uLmFwcGVuZChFWFRFTkRTKTsKKwkJCQkgICBjb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJICAgfQorCQkJICAgY3JlYXRlVHlwZSh0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzW2ldLCBzY29wZSwgY29tcGxldGlvbik7CisJCSAgIH0KKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgY3JlYXRlVmFyZ3NUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlLCBTdHJpbmdCdWZmZXIgY29tcGxldGlvbikgeworCQlpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQljcmVhdGVUeXBlKHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSwgc2NvcGUsIGNvbXBsZXRpb24pOworCQkJaW50IGRpbSA9IHR5cGUuZGltZW5zaW9ucygpIC0gMTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltOyBpKyspIHsKKwkJCQljb21wbGV0aW9uLmFwcGVuZCgnWycpOworCQkJCWNvbXBsZXRpb24uYXBwZW5kKCddJyk7CisJCQl9CisJCQljb21wbGV0aW9uLmFwcGVuZChWQVJBUkdTKTsKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZVR5cGUodHlwZSwgc2NvcGUsIGNvbXBsZXRpb24pOworCQl9CisJfQorCXByaXZhdGUgdm9pZCBmaW5kQW5ub3RhdGlvbkF0dHJpYnV0ZXMoY2hhcltdIHRva2VuLCBNZW1iZXJWYWx1ZVBhaXJbXSBhdHRyaWJ1dGVzRm91bmQsIFJlZmVyZW5jZUJpbmRpbmcgYW5ub3RhdGlvbikgeworCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGFubm90YXRpb24uYXZhaWxhYmxlTWV0aG9kcygpOworCQluZXh0QXR0cmlidXRlOiBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKKworCQkJaWYoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlKQorCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCBtZXRob2Quc2VsZWN0b3IpKSkgY29udGludWUgbmV4dEF0dHJpYnV0ZTsKKworCQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXNGb3VuZCA9PSBudWxsID8gMCA6IGF0dHJpYnV0ZXNGb3VuZC5sZW5ndGg7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBhdHRyaWJ1dGVzRm91bmRbal0ubmFtZSwgZmFsc2UpKSBjb250aW51ZSBuZXh0QXR0cmlidXRlOworCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKG1ldGhvZCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgbWV0aG9kLnNlbGVjdG9yKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworCisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOTk9UQVRJT05fQVRUUklCVVRFX1JFRikpIHsKKwkJCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuQU5OT1RBVElPTl9BVFRSSUJVVEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLnJldHVyblR5cGUpKTsKKwkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihtZXRob2Quc2VsZWN0b3IpOworCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1ldGhvZC5tb2RpZmllcnMpOworCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJaWYoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJdm9pZCBmaW5kQW5vbnltb3VzVHlwZSgKKwkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsCisJCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQkJU2NvcGUgc2NvcGUsCisJCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpIHsKKwkJCisJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKGN1cnJlbnRUeXBlKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKwkJCisJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJfQorCQkKKwkJZmluZEFub255bW91c1R5cGUoCisJCQkJY3VycmVudFR5cGUsCisJCQkJYXJnVHlwZXMsCisJCQkJc2NvcGUsCisJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQl0cnVlLAorCQkJCWZhbHNlLAorCQkJCXJlbGV2YW5jZSk7CisJfQorCXByaXZhdGUgdm9pZCBmaW5kQW5vbnltb3VzVHlwZSgKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywKKwkJU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCWJvb2xlYW4gaXNRdWFsaWZpZWQsCisJCWludCByZWxldmFuY2UpIHsKKworCQlpZiAoY3VycmVudFR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCQljaGFyW10gdHlwZUNvbXBsZXRpb24gPSBudWxsOworCQkJaWYgKCFleGFjdE1hdGNoKSB7CisJCQkJdHlwZUNvbXBsZXRpb24gPSAKKwkJCQkJaXNRdWFsaWZpZWQgPworCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIGN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgJy4nKSA6CisJCQkJCQkJCWN1cnJlbnRUeXBlLnNvdXJjZU5hbWUoKTsKKwkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAorCQkJCQkJCSYmIHRoaXMuc291cmNlLmxlbmd0aCA+IHRoaXMuZW5kUG9zaXRpb24KKwkJCQkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmVuZFBvc2l0aW9uXSA9PSAnKCcpIHsKKwkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJCQl9IGVsc2UgeworCQkJCQljb21wbGV0aW9uID0gbmV3IGNoYXJbXSB7ICcoJywgJyknIH07CisJCQkJfQorCQkJfQorCisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmICghZXhhY3RNYXRjaCkgeworCQkJCWlmKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7CisJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGN1cnJlbnRUeXBlLmlzTG9jYWxUeXBlKCkgPyBudWxsIDogY3VycmVudFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJY2hhcltdIHR5cGVOYW1lID0gY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQkKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGN1cnJlbnRUeXBlKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KGN1cnJlbnRUeXBlLmNvbXB1dGVVbmlxdWVLZXkoKSk7CisJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZSgKKwkJCQkJCQljcmVhdGVNZXRob2RTaWduYXR1cmUoCisJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSLAorCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSKSk7CisJCQkJCS8vcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUobnVsbCk7CisJCQkJCS8vcHJvcG9zYWwuc2V0VW5pcXVlS2V5KG51bGwpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZSh0eXBlTmFtZSk7CisJCQkJCS8vcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKG51bGwpOworCQkJCQkvL3Byb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhudWxsKTsKKwkJCQkJLy9wcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShudWxsKTsKKwkJCQkJLy9wcm9wb3NhbC5zZXRUeXBlTmFtZShudWxsKTsKKwkJCQkJcHJvcG9zYWwuc2V0TmFtZShjdXJyZW50VHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCQkKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgdHlwZVByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXR5cGVQcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCQkJdHlwZVByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFJlcXVpcmVkVHlwZVNpZ25hdHVyZShjdXJyZW50VHlwZSkpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0Q29tcGxldGlvbih0eXBlQ29tcGxldGlvbik7CisJCQkJCXR5cGVQcm9wb3NhbC5zZXRGbGFncyhjdXJyZW50VHlwZS5tb2RpZmllcnMpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQl0eXBlUHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJdHlwZVByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyggbmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde3R5cGVQcm9wb3NhbH0pOworCQkJCQkJCQkKKwkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoRmxhZ3MuQWNjUHVibGljKTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCQkJfSAgZWxzZSB7CisJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkpIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvbktleShjdXJyZW50VHlwZS5jb21wdXRlVW5pcXVlS2V5KCkpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoCisJCQkJCQkJY3JlYXRlTWV0aG9kU2lnbmF0dXJlKAorCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCisJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUikpOworCQkJCQkvL3Byb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKG51bGwpOworCQkJCQkvL3Byb3Bvc2FsLnNldFVuaXF1ZUtleShudWxsKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkvL3Byb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhudWxsKTsKKwkJCQkJLy9wcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMobnVsbCk7CisJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7CisJCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7CisJCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KKwkJCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCisJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAorCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKKwkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAorCQkJCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJCQl9CisJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOworCQkJCQl9CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldEZsYWdzKEZsYWdzLkFjY1B1YmxpYyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmaW5kQ29uc3RydWN0b3JzKAorCQkJCWN1cnJlbnRUeXBlLAorCQkJCWFyZ1R5cGVzLAorCQkJCXNjb3BlLAorCQkJCWludm9jYXRpb25TaXRlLAorCQkJCXRydWUsCisJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQlleGFjdE1hdGNoLAorCQkJCWlzUXVhbGlmaWVkLAorCQkJCXJlbGV2YW5jZSk7CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRDbGFzc0ZpZWxkKAorCQkJY2hhcltdIHRva2VuLAorCQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQkJU2NvcGUgc2NvcGUsCisJCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKSB7CisKKwkJaWYgKHRva2VuID09IG51bGwpIHJldHVybjsKKworCQlpZiAodG9rZW4ubGVuZ3RoIDw9IGNsYXNzRmllbGQubGVuZ3RoCisJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgY2xhc3NGaWVsZCwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KKwkJKSkgeworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIGNsYXNzRmllbGQpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvL25vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgY2xhc3MgZmllbGQKKwkJCXJlbGV2YW5jZSArPSBSX05PTl9JTkhFUklURUQ7CisKKwkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yTWlzc2luZ0VsZW1lbnRzKG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQl9CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkpIHsKKwkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkvL3Byb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKG51bGwpOworCQkJCWNoYXJbXSBzaWduYXR1cmUgPQorCQkJCQljcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZSgKKwkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChKQVZBX0xBTkcsICcuJyksCisJCQkJCQlDTEFTUyk7CisJCQkJaWYgKHRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsID4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgeworCQkJCQkvLyBhZGQgdHlwZSBhcmd1bWVudAorCQkJCQljaGFyW10gdHlwZUFyZ3VtZW50ID0gZ2V0VHlwZVNpZ25hdHVyZShyZWNlaXZlclR5cGUpOworCQkJCQlpbnQgb2xkTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKwkJCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gdHlwZUFyZ3VtZW50Lmxlbmd0aDsKKwkJCQkJaW50IG5ld0xlbmd0aCA9IG9sZExlbmd0aCArIGFyZ3VtZW50TGVuZ3RoICsgMjsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShzaWduYXR1cmUsIDAsIHNpZ25hdHVyZSA9IG5ldyBjaGFyW25ld0xlbmd0aF0sIDAsIG9sZExlbmd0aCAtIDEpOworCQkJCQlzaWduYXR1cmVbb2xkTGVuZ3RoIC0gMV0gPSAnPCc7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZUFyZ3VtZW50LCAwLCBzaWduYXR1cmUsIG9sZExlbmd0aCAsIGFyZ3VtZW50TGVuZ3RoKTsKKwkJCQkJc2lnbmF0dXJlW25ld0xlbmd0aCAtIDJdID0gJz4nOworCQkJCQlzaWduYXR1cmVbbmV3TGVuZ3RoIC0gMV0gPSAnOyc7CisJCQkJfQorCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShzaWduYXR1cmUpOworCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShudWxsKTsKKwkJCQkvL3Byb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobnVsbCk7CisJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKEpBVkFfTEFORywgJy4nKSk7CisJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoQ0xBU1MpOworCQkJCXByb3Bvc2FsLnNldE5hbWUoY2xhc3NGaWVsZCk7CisJCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAorCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJCX0KKwkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQl9CisJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjbGFzc0ZpZWxkKTsKKwkJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NTdGF0aWMgfCBGbGFncy5BY2NQdWJsaWMpOworCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJaWYoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJdm9pZCBmaW5kQ29uc3RydWN0b3JzKAorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLAorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gZm9yQW5vbnltb3VzVHlwZSwKKwkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgeworCQkKKwkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKwkJCisJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJfQorCQkKKwkJZmluZENvbnN0cnVjdG9ycygKKwkJCQljdXJyZW50VHlwZSwKKwkJCQlhcmdUeXBlcywKKwkJCQlzY29wZSwKKwkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQlmb3JBbm9ueW1vdXNUeXBlLAorCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCQkJdHJ1ZSwKKwkJCQlmYWxzZSwKKwkJCQlyZWxldmFuY2UpOworCX0KKwkKKwkKKwlwcml2YXRlIHZvaWQgZmluZENvbnN0cnVjdG9yc0Zyb21NaXNzaW5nVHlwZSgKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiwKKwkJCWZpbmFsIFR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCisJCQlmaW5hbCBTY29wZSBzY29wZSwKKwkJCWZpbmFsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJCU1pc3NpbmdUeXBlc0d1ZXNzZXIgbWlzc2luZ1R5cGVzQ29udmVydGVyID0gbmV3IE1pc3NpbmdUeXBlc0d1ZXNzZXIodGhpcyk7CisJCU1pc3NpbmdUeXBlc0d1ZXNzZXIuR3Vlc3NlZFR5cGVSZXF1ZXN0b3Igc3Vic3RpdHV0aW9uUmVxdWVzdG9yID0KKwkJCW5ldyBNaXNzaW5nVHlwZXNHdWVzc2VyLkd1ZXNzZWRUeXBlUmVxdWVzdG9yKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjY2VwdCgKKwkJCQkJCVR5cGVCaW5kaW5nIGd1ZXNzZWRUeXBlLAorCQkJCQkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJCQkJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCQlib29sZWFuIGhhc1Byb2JsZW1zKSB7CisJCQkJCWlmIChndWVzc2VkVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gKFJlZmVyZW5jZUJpbmRpbmcpIGd1ZXNzZWRUeXBlOworCQkJCQkJaWYgKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKQorCQkJCQkJCQkmJiByZWYuaXNDbGFzcygpCisJCQkJCQkJCSYmICFyZWYuaXNBYnN0cmFjdCgpKSB7CisJCQkJCQkJCWZpbmRDb25zdHJ1Y3RvcnMoCisJCQkJCQkJCQlyZWYsCisJCQkJCQkJCQlhcmdUeXBlcywKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCQkJCQloYXNQcm9ibGVtcyk7CisJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQorCQkJCQkJaWYgKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpCisJCQkJCQkJCSYmICFyZWYuaXNGaW5hbCgpCisJCQkJCQkJCSYmICFyZWYuaXNFbnVtKCkpeworCQkJCQkJCWZpbmRBbm9ueW1vdXNUeXBlKAorCQkJCQkJCQlyZWYsCisJCQkJCQkJCWFyZ1R5cGVzLAorCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJCQloYXNQcm9ibGVtcyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQltaXNzaW5nVHlwZXNDb252ZXJ0ZXIuZ3Vlc3ModHlwZVJlZiwgc2NvcGUsIHN1YnN0aXR1dGlvblJlcXVlc3Rvcik7CisJfQorCQkKKwlwcml2YXRlIHZvaWQgZmluZENvbnN0cnVjdG9ycygKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywKKwkJU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlib29sZWFuIGZvckFub255bW91c1R5cGUsCisJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCWJvb2xlYW4gZXhhY3RNYXRjaCwKKwkJYm9vbGVhbiBpc1F1YWxpZmllZCwKKwkJaW50IHJlbGV2YW5jZSkgeworCisJCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IG51bGw7CisJCWlmIChjdXJyZW50VHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyAmJiBpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQlDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgaW52b2NhdGlvblNpdGU7CisJCQlpZiAoKGFsbG9jLmJpdHMgJiBBU1ROb2RlLklzRGlhbW9uZCkgIT0gMCkgeworCQkJCS8vIGluZmVyZW5jZSBmYWlsZWQuIFNvIGRvbid0IHN1YnN0aXR1dGUgdHlwZSBhcmd1bWVudHMuIEp1c3QgcmV0dXJuIHRoZSB1bnN1YnN0aXR1dGVkIG1ldGhvZHMKKwkJCQkvLyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZSB3aGF0IHRvIHN1YnN0aXR1dGUuCisJCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZTsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIG9yaWdpbmFsR2VuZXJpY1R5cGUgPSBiaW5kaW5nLmdlbmVyaWNUeXBlKCk7CisJCQkJaWYgKG9yaWdpbmFsR2VuZXJpY1R5cGUgIT0gbnVsbCkKKwkJCQkJbWV0aG9kcyA9IG9yaWdpbmFsR2VuZXJpY1R5cGUubWV0aG9kcygpOworCQkJfSBlbHNlIHsKKwkJCQltZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKKwkJfQorCQlpZihtZXRob2RzICE9IG51bGwpIHsKKwkJCWludCBtaW5BcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsKKwkJCW5leHQgOiBmb3IgKGludCBmID0gbWV0aG9kcy5sZW5ndGg7IC0tZiA+PSAwOykgeworCQkJCU1ldGhvZEJpbmRpbmcgY29uc3RydWN0b3IgPSBtZXRob2RzW2ZdOworCQkJCWlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0cnVjdG9yKCkpIHsKKworCQkJCQlpZiAoY29uc3RydWN0b3IuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKKwkJCQkJCQljb25zdHJ1Y3Rvci5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCisJCQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MpKQorCQkJCQkJY29udGludWUgbmV4dDsKKworCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCQkJJiYgIWNvbnN0cnVjdG9yLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCBzY29wZSkpIHsKKwkJCQkJCWlmKCFmb3JBbm9ueW1vdXNUeXBlIHx8ICFjb25zdHJ1Y3Rvci5pc1Byb3RlY3RlZCgpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKworCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzOworCQkJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQkJaWYgKG1pbkFyZ0xlbmd0aCA+IHBhcmFtTGVuZ3RoKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJZm9yIChpbnQgYSA9IG1pbkFyZ0xlbmd0aDsgLS1hID49IDA7KQorCQkJCQkJaWYgKGFyZ1R5cGVzW2FdICE9IG51bGwpIHsgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5CisJCQkJCQkJaWYgKCFhcmdUeXBlc1thXS5pc0NvbXBhdGlibGVXaXRoKGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbYV0pKQorCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJfQorCisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOworCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltwYXJhbUxlbmd0aF1bXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CisJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVyc1tpXTsKKwkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQl9CisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yLHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwkJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCQkJCQorCQkJCQlpZihmb3JBbm9ueW1vdXNUeXBlKXsKKwkJCQkJCWNoYXJbXSB0eXBlQ29tcGxldGlvbiA9IG51bGw7CisJCQkJCQlpZiAoIWV4YWN0TWF0Y2gpIHsKKwkJCQkJCQl0eXBlQ29tcGxldGlvbiA9IAorCQkJCQkJCQlpc1F1YWxpZmllZCA/CisJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoY3VycmVudFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLCAnLicpIDoKKwkJCQkJCQkJCQkJY3VycmVudFR5cGUuc291cmNlTmFtZSgpOworCQkJCQkJCWlmICh0aGlzLnNvdXJjZSAhPSBudWxsCisJCQkJCQkJCQkJJiYgdGhpcy5zb3VyY2UubGVuZ3RoID4gdGhpcy5lbmRQb3NpdGlvbgorCQkJCQkJCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuZW5kUG9zaXRpb25dID09ICcoJykgeworCQkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsgJygnLCAnKScgfTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQkJaWYgKCFleGFjdE1hdGNoKSB7CisJCQkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gY3VycmVudFR5cGUuaXNMb2NhbFR5cGUoKSA/IG51bGwgOiBjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCQkJCQljaGFyW10gdHlwZU5hbWUgPSBjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQkJCQkJCQorCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoY3VycmVudFR5cGUpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25LZXkoY3VycmVudFR5cGUuY29tcHV0ZVVuaXF1ZUtleSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOworCQkJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gY29uc3RydWN0b3Iub3JpZ2luYWwoKTsKKwkJCQkJCQkJaWYob3JpZ2luYWwgIT0gY29uc3RydWN0b3IpIHsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCQkJCQl9CisJCQkJCQkJCXByb3Bvc2FsLnNldEtleShjb25zdHJ1Y3Rvci5jb21wdXRlVW5pcXVlS2V5KCkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZSh0eXBlTmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKKwkJCQkJCQkJLy9wcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShudWxsKTsKKwkJCQkJCQkJLy9wcm9wb3NhbC5zZXRUeXBlTmFtZShudWxsKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShjdXJyZW50VHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCQkJCQkKKwkJCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgdHlwZVByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCQkJCQkJdHlwZVByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFJlcXVpcmVkVHlwZVNpZ25hdHVyZShjdXJyZW50VHlwZSkpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0Q29tcGxldGlvbih0eXBlQ29tcGxldGlvbik7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRGbGFncyhjdXJyZW50VHlwZS5tb2RpZmllcnMpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJdHlwZVByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyggbmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde3R5cGVQcm9wb3NhbH0pOworCQkJCQkJCQkKKwkJCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoY29uc3RydWN0b3IubW9kaWZpZXJzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpKSB7CisJCQkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoY3VycmVudFR5cGUpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25LZXkoY3VycmVudFR5cGUuY29tcHV0ZVVuaXF1ZUtleSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOworCQkJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gY29uc3RydWN0b3Iub3JpZ2luYWwoKTsKKwkJCQkJCQkJaWYob3JpZ2luYWwgIT0gY29uc3RydWN0b3IpIHsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCQkJCQl9CisJCQkJCQkJCXByb3Bvc2FsLnNldEtleShjb25zdHJ1Y3Rvci5jb21wdXRlVW5pcXVlS2V5KCkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKKwkJCQkJCQkJLy9wcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShudWxsKTsKKwkJCQkJCQkJLy9wcm9wb3NhbC5zZXRUeXBlTmFtZShudWxsKTsKKwkJCQkJCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdWJQcm9wb3NhbHMgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW21pc3NpbmdFbGVtZW50cy5sZW5ndGhdOworCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJCQkJCQljcmVhdGVSZXF1aXJlZFR5cGVQcm9wb3NhbCgKKwkJCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHNbaV0sCisJCQkJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKHN1YlByb3Bvc2Fscyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoY29uc3RydWN0b3IubW9kaWZpZXJzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7CisJCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhcltdIHR5cGVDb21wbGV0aW9uID0gbnVsbDsKKwkJCQkJCS8vIFNwZWNpYWwgY2FzZSBmb3IgY29tcGxldGlvbiBpbiBqYXZhZG9jCisJCQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID4gMCkgeworCQkJCQkJCUV4cHJlc3Npb24gcmVjZWl2ZXIgPSBudWxsOworCQkJCQkJCWNoYXJbXSBzZWxlY3RvciA9IG51bGw7CisJCQkJCQkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQkJCQkJCUNvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChDb21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pIGludm9jYXRpb25TaXRlOworCQkJCQkJCQlyZWNlaXZlciA9IGFsbG9jLnR5cGU7CisJCQkJCQkJfSBlbHNlIGlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSkgeworCQkJCQkJCQlDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UgZmllbGRSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSBpbnZvY2F0aW9uU2l0ZTsKKwkJCQkJCQkJcmVjZWl2ZXIgPSBmaWVsZFJlZi5yZWNlaXZlcjsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKKwkJCQkJCQkJU3RyaW5nQnVmZmVyIGphdmFkb2NDb21wbGV0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQkJCQlpZiAocmVjZWl2ZXIuaXNUaGlzKCkpIHsKKwkJCQkJCQkJCXNlbGVjdG9yID0gKCgoSmF2YWRvY0ltcGxpY2l0VHlwZVJlZmVyZW5jZSlyZWNlaXZlcikudG9rZW4pOworCQkJCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDApIHsKKwkJCQkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJyMnKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQkJCQkJCQlKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSByZWNlaXZlcjsKKwkJCQkJCQkJCXNlbGVjdG9yID0gdHlwZVJlZi50b2tlbjsKKwkJCQkJCQkJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwKSB7CisJCQkJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKHR5cGVSZWYudG9rZW4pOworCQkJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnIycpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQkJCQkJCUphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHJlY2VpdmVyOworCQkJCQkJCQkJc2VsZWN0b3IgPSB0eXBlUmVmLnRva2Vuc1t0eXBlUmVmLnRva2Vucy5sZW5ndGgtMV07CisJCQkJCQkJCQlpZiAoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCkgeworCQkJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZVJlZi50b2tlbnMsICcuJykpOworCQkJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnIycpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8vIEFwcGVuZCBwYXJhbWV0ZXJzIHR5cGVzCisJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZChzZWxlY3Rvcik7CisJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnKCcpOworCQkJCQkJCQlpZiAoY29uc3RydWN0b3IucGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQkJCQkJCQlib29sZWFuIGlzVmFyYXJncyA9IGNvbnN0cnVjdG9yLmlzVmFyYXJncygpOworCQkJCQkJCQkJZm9yIChpbnQgcD0wLCBsbj1jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aDsgcDxsbjsgcCsrKSB7CisJCQkJCQkJCQkJaWYgKHA+MCkgamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZUJpbmRpbmcgPSBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW3BdOworCQkJCQkJCQkJCWlmIChpc1ZhcmFyZ3MgJiYgcCA9PSBsbiAtIDEpICB7CisJCQkJCQkJCQkJCWNyZWF0ZVZhcmdzVHlwZShhcmdUeXBlQmluZGluZy5lcmFzdXJlKCksIHNjb3BlLCBqYXZhZG9jQ29tcGxldGlvbik7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJY3JlYXRlVHlwZShhcmdUeXBlQmluZGluZy5lcmFzdXJlKCksIHNjb3BlLCBqYXZhZG9jQ29tcGxldGlvbik7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnKScpOworCQkJCQkJCQljb21wbGV0aW9uID0gamF2YWRvY0NvbXBsZXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKCFleGFjdE1hdGNoKSB7CisJCQkJCQkJCXR5cGVDb21wbGV0aW9uID0gCisJCQkJCQkJCQlpc1F1YWxpZmllZCA/CisJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIGN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgJy4nKSA6CisJCQkJCQkJCQkJCQljdXJyZW50VHlwZS5zb3VyY2VOYW1lKCk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAorCQkJCQkJCQkJCQkmJiB0aGlzLnNvdXJjZS5sZW5ndGggPiB0aGlzLmVuZFBvc2l0aW9uCisJCQkJCQkJCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuZW5kUG9zaXRpb25dID09ICcoJykgeworCQkJCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsgJygnLCAnKScgfTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIHN0YW5kYXJkIHByb3Bvc2FsCisJCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJCWlmICghZXhhY3RNYXRjaCkgeworCQkJCQkJCWlmKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gY3VycmVudFR5cGUuaXNMb2NhbFR5cGUoKSA/IG51bGwgOiBjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCQkJCQljaGFyW10gdHlwZU5hbWUgPSBjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQkJCQkJCQorCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoY3VycmVudFR5cGUpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShjb25zdHJ1Y3RvcikpOworCQkJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gY29uc3RydWN0b3Iub3JpZ2luYWwoKTsKKwkJCQkJCQkJaWYob3JpZ2luYWwgIT0gY29uc3RydWN0b3IpIHsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCQkJCQl9CisJCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCQkJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOworCQkJCQkJCQkvL3Byb3Bvc2FsLnNldFR5cGVOYW1lKG51bGwpOworCQkJCQkJCQlwcm9wb3NhbC5zZXROYW1lKGN1cnJlbnRUeXBlLnNvdXJjZU5hbWUoKSk7CisJCQkJCQorCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCB0eXBlUHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQkJdHlwZVByb3Bvc2FsLm5hbWVMb29rdXAgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0UmVxdWlyZWRUeXBlU2lnbmF0dXJlKGN1cnJlbnRUeXBlKSk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVDb21wbGV0aW9uKTsKKwkJCQkJCQkJdHlwZVByb3Bvc2FsLnNldEZsYWdzKGN1cnJlbnRUeXBlLm1vZGlmaWVycyk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXR5cGVQcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQl0eXBlUHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKCBuZXcgQ29tcGxldGlvblByb3Bvc2FsW117dHlwZVByb3Bvc2FsfSk7CisJCQkJCQkJCQorCQkJCQkJCQlwcm9wb3NhbC5zZXRJc0NvbnRydWN0b3IodHJ1ZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGNvbnN0cnVjdG9yLm1vZGlmaWVycyk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7CisJCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZighaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgJiYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuT05MWV9JTkxJTkVfVEFHKSA9PSAwKSB7CisJCQkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGNvbnN0cnVjdG9yKSk7CisJCQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBjb25zdHJ1Y3Rvci5vcmlnaW5hbCgpOworCQkJCQkJCQlpZihvcmlnaW5hbCAhPSBjb25zdHJ1Y3RvcikgeworCQkJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7CisJCQkJCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldE5hbWUoY3VycmVudFR5cGUuc291cmNlTmFtZSgpKTsKKwkJCQkJCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdWJQcm9wb3NhbHMgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW21pc3NpbmdFbGVtZW50cy5sZW5ndGhdOworCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJCQkJCQljcmVhdGVSZXF1aXJlZFR5cGVQcm9wb3NhbCgKKwkJCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHNbaV0sCisJCQkJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKHN1YlByb3Bvc2Fscyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcHJvcG9zYWwuc2V0SXNDb250cnVjdG9yKHRydWUpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhjb25zdHJ1Y3Rvci5tb2RpZmllcnMpOworCQkJCQkJCQlpbnQgc3RhcnQgPSAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID4gMCkgPyB0aGlzLnN0YXJ0UG9zaXRpb24gOiB0aGlzLmVuZFBvc2l0aW9uOworCQkJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGKSkgeworCQkJCQkJCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb24gPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb24sIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOworCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShjdXJyZW50VHlwZSkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGNvbnN0cnVjdG9yKSk7CisJCQkJCQkJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWwgPSBjb25zdHJ1Y3Rvci5vcmlnaW5hbCgpOworCQkJCQkJCQlpZihvcmlnaW5hbCAhPSBjb25zdHJ1Y3RvcikgeworCQkJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7CisJCQkJCQkJCS8vcHJvcG9zYWwuc2V0VHlwZU5hbWUobnVsbCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldE5hbWUoY3VycmVudFR5cGUuc291cmNlTmFtZSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0SXNDb250cnVjdG9yKHRydWUpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoY29uc3RydWN0b3IubW9kaWZpZXJzKTsKKwkJCQkJCQkJaW50IHN0YXJ0ID0gKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuUkVQTEFDRV9UQUcpICE9IDAgPyB0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UrUl9JTkxJTkVfVEFHKTsKKwkJCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCQkJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIGNoYXJbXSBnZXRSZXNvbHZlZFNpZ25hdHVyZShjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCwgU2NvcGUgc2NvcGUpIHsKKwkJY2hhcltdW10gY24gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKworCQlUeXBlUmVmZXJlbmNlIHJlZjsKKwkJaWYgKGNuLmxlbmd0aCA9PSAxKSB7CisJCQlyZWYgPSBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShjblswXSwgMCk7CisJCX0gZWxzZSB7CisJCQlyZWYgPSBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjbixuZXcgbG9uZ1tjbi5sZW5ndGhdKTsKKwkJfQorCQkKKwkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUgPSBudWxsOworCQlJTmFtZUVudmlyb25tZW50IG9sZE5hbWVFbnZpcm9ubWVudCA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQubmFtZUVudmlyb25tZW50OworCQl0aGlzLmxvb2t1cEVudmlyb25tZW50Lm5hbWVFbnZpcm9ubWVudCA9IGdldE5vQ2FjaGVOYW1lRW52aXJvbm1lbnQoKTsKKwkJdHJ5IHsKKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQljYXNlIFNjb3BlLkJMT0NLX1NDT1BFIDoKKwkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpc2NvcGUpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCisKKwkJCWlmIChndWVzc2VkVHlwZSAhPSBudWxsICYmIGd1ZXNzZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkvLyB0aGUgZXJhc3VyZSBtdXN0IGJlIHVzZWQgYmVjYXVzZSBndWVzc2VkVHlwZSBjYW4gYmUgYSBSYXdUeXBlQmluZGluZyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njg5MCkKKwkJCQlndWVzc2VkVHlwZSA9IGd1ZXNzZWRUeXBlLmVyYXN1cmUoKTsKKwkJCQkKKwkJCQlpZiAoZ3Vlc3NlZFR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykgeworCQkJCQlTb3VyY2VUeXBlQmluZGluZyByZWZCaW5kaW5nID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBndWVzc2VkVHlwZTsKKwkJCQkJCisJCQkJCWlmIChyZWZCaW5kaW5nLnNjb3BlID09IG51bGwgfHwgcmVmQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb250ZXh0ID09IG51bGwpIHJldHVybiBudWxsOworCQkJCQkKKwkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHJlZkJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kczsKKwkJCQkJCisJCQkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCQkJCQorCQkJCQkJaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OworCQkJCQkJCisJCQkJCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZC5hcmd1bWVudHM7CisJCQkJCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKKwkJCQkJCQorCQkJCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50c0xlbmd0aCkgY29udGludWUgbmV4dDsKKwkJCQkJCQorCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmd1bWVudHNMZW5ndGg7IGorKykgeworCQkJCQkJCWNoYXJbXSBhcmd1bWVudFR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoYXJndW1lbnRzW2pdLnR5cGUpOworCQorCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXJndW1lbnRUeXBlTmFtZSwgcGFyYW1ldGVyVHlwZXNbal0pKSB7CisJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlyZWZCaW5kaW5nLnJlc29sdmVUeXBlc0ZvcihtZXRob2QuYmluZGluZyk7IC8vIGZvcmNlIHJlc29sdXRpb24KKwkJCQkJCWlmIChtZXRob2QuYmluZGluZyA9PSBudWxsKSBjb250aW51ZSBuZXh0OworCQkJCQkJcmV0dXJuIGdldFNpZ25hdHVyZShtZXRob2QuYmluZGluZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZmluYWxseSB7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50Lm5hbWVFbnZpcm9ubWVudCA9IG9sZE5hbWVFbnZpcm9ubWVudDsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgdm9pZCBmaW5kQ29uc3RydWN0b3JzT3JBbm9ueW1vdXNUeXBlcygKKwkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsCisJCQlTY29wZSBzY29wZSwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJYm9vbGVhbiBpc1F1YWxpZmllZCwKKwkJCWludCByZWxldmFuY2UpIHsKKwkJCisJCWlmICghaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpCisJCQkJJiYgY3VycmVudFR5cGUuaXNDbGFzcygpCisJCQkJJiYgIWN1cnJlbnRUeXBlLmlzQWJzdHJhY3QoKSkgeworCQkJCWZpbmRDb25zdHJ1Y3RvcnMoCisJCQkJCWN1cnJlbnRUeXBlLAorCQkJCQludWxsLAorCQkJCQlzY29wZSwKKwkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCWZhbHNlLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlmYWxzZSwKKwkJCQkJZmFsc2UsCisJCQkJCWlzUXVhbGlmaWVkLAorCQkJCQlyZWxldmFuY2UpOworCQl9CisJCQorCQkvLyBUaGlzIGNvZGUgaXMgZGlzYWJsZWQgYmVjYXVzZSB0aGVyZSBpcyB0b28gbXVjaCBwcm9wb3NhbHMgd2hlbiBjb25zdHJ1Y3RvcnMgYW5kIGFub255bW91cyBhcmUgcHJvcG9zZWQKKwkJaWYgKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpCisJCQkJJiYgIWN1cnJlbnRUeXBlLmlzRmluYWwoKQorCQkJCSYmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpIHx8IChjdXJyZW50VHlwZS5pc0NsYXNzKCkgJiYgY3VycmVudFR5cGUuaXNBYnN0cmFjdCgpKSkpeworCQkJZmluZEFub255bW91c1R5cGUoCisJCQkJY3VycmVudFR5cGUsCisJCQkJbnVsbCwKKwkJCQlzY29wZSwKKwkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQludWxsLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQlmYWxzZSwKKwkJCQlmYWxzZSwKKwkJCQlpc1F1YWxpZmllZCwKKwkJCQlyZWxldmFuY2UpOworCQl9CisJfQorCXByaXZhdGUgY2hhcltdW10gZmluZEVuY2xvc2luZ1R5cGVOYW1lcyhTY29wZSBzY29wZSl7CisJCWNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhclsxMF1bXTsKKwkJaW50IGV4Y2x1ZGVkTmFtZUNvdW50ID0gMDsKKworCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKKwkJd2hpbGUoY3VycmVudFNjb3BlICE9IG51bGwpIHsKKwkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsKKworCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0OworCisJCQkJCWlmKGV4Y2x1ZGVkTmFtZUNvdW50ID09IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVkTmFtZXMsIDAsIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhcltleGNsdWRlZE5hbWVDb3VudCAqIDJdW10sIDAsIGV4Y2x1ZGVkTmFtZUNvdW50KTsKKwkJCQkJfQorCQkJCQlleGNsdWRlZE5hbWVzW2V4Y2x1ZGVkTmFtZUNvdW50KytdID0gdHlwZURlY2xhcmF0aW9uLm5hbWU7CisKKwkJCQkJVHlwZVBhcmFtZXRlcltdIGNsYXNzVHlwZVBhcmFtZXRlcnMgPSB0eXBlRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM7CisJCQkJCWlmKGNsYXNzVHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1R5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gY2xhc3NUeXBlUGFyYW1ldGVyc1tpXTsKKwkJCQkJCQlpZihleGNsdWRlZE5hbWVDb3VudCA9PSBleGNsdWRlZE5hbWVzLmxlbmd0aCkgeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVkTmFtZXMsIDAsIGV4Y2x1ZGVkTmFtZXMgPSBuZXcgY2hhcltleGNsdWRlZE5hbWVDb3VudCAqIDJdW10sIDAsIGV4Y2x1ZGVkTmFtZUNvdW50KTsKKwkJCQkJCQl9CisJCQkJCQkJZXhjbHVkZWROYW1lc1tleGNsdWRlZE5hbWVDb3VudCsrXSA9IHR5cGVQYXJhbWV0ZXIubmFtZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6CisJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGU7CisJCQkJCWlmKG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkJCQlUeXBlUGFyYW1ldGVyW10gbWV0aG9kVHlwZVBhcmFtZXRlcnMgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCkudHlwZVBhcmFtZXRlcnMoKTsKKwkJCQkJCWlmKG1ldGhvZFR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZFR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZFR5cGVQYXJhbWV0ZXJzW2ldOworCQkJCQkJCQlpZihleGNsdWRlZE5hbWVDb3VudCA9PSBleGNsdWRlZE5hbWVzLmxlbmd0aCkgeworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShleGNsdWRlZE5hbWVzLCAwLCBleGNsdWRlZE5hbWVzID0gbmV3IGNoYXJbZXhjbHVkZWROYW1lQ291bnQgKiAyXVtdLCAwLCBleGNsdWRlZE5hbWVDb3VudCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZXhjbHVkZWROYW1lc1tleGNsdWRlZE5hbWVDb3VudCsrXSA9IHR5cGVQYXJhbWV0ZXIubmFtZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS5wYXJlbnQ7CisJCX0KKworCQlpZihleGNsdWRlZE5hbWVDb3VudCA9PSAwKSB7CisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShleGNsdWRlZE5hbWVzLCAwLCBleGNsdWRlZE5hbWVzID0gbmV3IGNoYXJbZXhjbHVkZWROYW1lQ291bnRdW10sIDAsIGV4Y2x1ZGVkTmFtZUNvdW50KTsKKwkJcmV0dXJuIGV4Y2x1ZGVkTmFtZXM7CisJfQorCXByaXZhdGUgdm9pZCBmaW5kRW51bUNvbnN0YW50cygKKwkJCWNoYXJbXSBlbnVtQ29uc3RhbnROYW1lLAorCQkJUmVmZXJlbmNlQmluZGluZyBlbnVtVHlwZSwKKwkJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwKKwkJCWNoYXJbXVtdIGFscmVhZHlVc2VkQ29uc3RhbnRzLAorCQkJaW50IGFscmVhZHlVc2VkQ29uc3RhbnRDb3VudCwKKwkJCWJvb2xlYW4gbmVlZFF1YWxpZmljYXRpb24pIHsKKworCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBlbnVtVHlwZS5maWVsZHMoKTsKKworCQlpbnQgZW51bUNvbnN0YW50TGVuZ3RoID0gZW51bUNvbnN0YW50TmFtZS5sZW5ndGg7CisJCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbZl07CisKKwkJCWlmIChmaWVsZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoKGZpZWxkLm1vZGlmaWVycyAmIEZsYWdzLkFjY0VudW0pID09IDApIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChlbnVtQ29uc3RhbnRMZW5ndGggPiBmaWVsZC5uYW1lLmxlbmd0aCkgY29udGludWUgbmV4dDsKKworCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhlbnVtQ29uc3RhbnROYW1lLCBmaWVsZC5uYW1lLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChlbnVtQ29uc3RhbnROYW1lLCBmaWVsZC5uYW1lKSkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWNoYXJbXSBmaWVsZE5hbWUgPSBmaWVsZC5uYW1lOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFscmVhZHlVc2VkQ29uc3RhbnRDb3VudDsgaSsrKSB7CisJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYWxyZWFkeVVzZWRDb25zdGFudHNbaV0sIGZpZWxkTmFtZSkpIGNvbnRpbnVlIG5leHQ7CisJCQl9CisKKwkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoZmllbGQpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoZW51bUNvbnN0YW50TmFtZSwgZmllbGQubmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoZmllbGQudHlwZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW1Db25zdGFudChmaWVsZC50eXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihuZWVkUXVhbGlmaWNhdGlvbik7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworCisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmICghbmVlZFF1YWxpZmljYXRpb24pIHsKKwkJCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkTmFtZTsKKworCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikpIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCVR5cGVCaW5kaW5nIHZpc2libGVUeXBlID0gaW52b2NhdGlvblNjb3BlLmdldFR5cGUoZmllbGQudHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCWJvb2xlYW4gbmVlZEltcG9ydCA9IHZpc2libGVUeXBlID09IG51bGwgfHwgIXZpc2libGVUeXBlLmlzVmFsaWRCaW5kaW5nKCk7CisKKwkJCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KGZpZWxkLnR5cGUuc291cmNlTmFtZSgpLCBmaWVsZC5uYW1lLCAnLicpOworCisJCQkJaWYgKCFuZWVkSW1wb3J0KSB7CisJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRikpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShmaWVsZC5uYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhmaWVsZC5tb2RpZmllcnMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfSU1QT1JUKSkgeworCQkJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY3UgPSB0aGlzLnVuaXRTY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQkJCQkJaW50IGltcG9ydFN0YXJ0ID0gY3UudHlwZXNbMF0uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJCWludCBpbXBvcnRFbmQgPSBpbXBvcnRTdGFydDsKKworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBmaWVsZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZylmaWVsZC50eXBlOworCisJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC50eXBlKSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJCXByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoZmllbGQubW9kaWZpZXJzKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKworCQkJCQkJY2hhcltdIHR5cGVJbXBvcnRDb21wbGV0aW9uID0gY3JlYXRlSW1wb3J0Q2hhckFycmF5KENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChmaWVsZFR5cGUuY29tcG91bmROYW1lLCAnLicpLCBmYWxzZSwgZmFsc2UpOworCisJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCB0eXBlSW1wb3J0UHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGZpZWxkVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkVHlwZSkpOworCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVJbXBvcnRDb21wbGV0aW9uKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRGbGFncyhmaWVsZFR5cGUubW9kaWZpZXJzKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRBZGRpdGlvbmFsRmxhZ3MoQ29tcGxldGlvbkZsYWdzLkRlZmF1bHQpOworCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0VG9rZW5SYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisKKwkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlSW1wb3J0UHJvcG9zYWx9KTsKKworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgZmluZEVudW1Db25zdGFudHNGcm9tRXhwZWN0ZWRUeXBlcygKKwkJCWNoYXJbXSB0b2tlbiwKKwkJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5leHBlY3RlZFR5cGVzUHRyICsgMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5pc0VudW0oKSkgeworCQkJCWZpbmRFbnVtQ29uc3RhbnRzKAorCQkJCQkJdG9rZW4sCisJCQkJCQkoUmVmZXJlbmNlQmluZGluZyl0aGlzLmV4cGVjdGVkVHlwZXNbaV0sCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlmaWVsZHNGb3VuZCwKKwkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJMCwKKwkJCQkJCXRydWUpOworCQkJfQorCQl9CisKKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRFbnVtQ29uc3RhbnRzRnJvbVN3aXRoU3RhdGVtZW50KGNoYXJbXSBlbnVtQ29uc3RhbnROYW1lLCBTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CisJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gc3dpdGNoU3RhdGVtZW50LmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOworCQlpZihleHByZXNzaW9uVHlwZSAhPSBudWxsICYmIGV4cHJlc3Npb25UeXBlLmlzRW51bSgpKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIGVudW1UeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlOworCisJCQlDYXNlU3RhdGVtZW50W10gY2FzZXMgPSBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXM7CisKKwkJCWNoYXJbXVtdIGFscmVhZHlVc2VkQ29uc3RhbnRzID0gbmV3IGNoYXJbc3dpdGNoU3RhdGVtZW50LmNhc2VDb3VudF1bXTsKKwkJCWludCBhbHJlYWR5VXNlZENvbnN0YW50Q291bnQgPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzd2l0Y2hTdGF0ZW1lbnQuY2FzZUNvdW50OyBpKyspIHsKKwkJCQlFeHByZXNzaW9uIGNhc2VFeHByZXNzaW9uID0gY2FzZXNbaV0uY29uc3RhbnRFeHByZXNzaW9uOworCQkJCWlmKChjYXNlRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpCisJCQkJCQkmJiAoY2FzZUV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgY2FzZUV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlzRW51bSgpKSkgeworCQkJCQlhbHJlYWR5VXNlZENvbnN0YW50c1thbHJlYWR5VXNlZENvbnN0YW50Q291bnQrK10gPSAoKFNpbmdsZU5hbWVSZWZlcmVuY2UpY2FzZXNbaV0uY29uc3RhbnRFeHByZXNzaW9uKS50b2tlbjsKKwkJCQl9CisJCQl9CisKKwkJCWZpbmRFbnVtQ29uc3RhbnRzKAorCQkJCQllbnVtQ29uc3RhbnROYW1lLAorCQkJCQllbnVtVHlwZSwKKwkJCQkJbnVsbCAvKiBkb2Vzbid0IG5lZWQgaW52b2NhdGlvbiBzY29wZSAqLywKKwkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQlhbHJlYWR5VXNlZENvbnN0YW50cywKKwkJCQkJYWxyZWFkeVVzZWRDb25zdGFudENvdW50LAorCQkJCQlmYWxzZSk7CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KAorCQkJY2hhcltdIHR5cGVOYW1lLAorCQkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlLAorCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCQlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSwKKwkJCUJsb2NrU2NvcGUgc2NvcGUsCisJCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCwKKwkJCWJvb2xlYW4gc2VhcmNoU3VwZXJDbGFzc2VzKSB7CisKKwkJaWYgKHNlYXJjaFN1cGVyQ2xhc3NlcykgeworCQkJUmVmZXJlbmNlQmluZGluZyBqYXZhTGFuZ1Rocm93YWJsZSA9IHNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCk7CisJCQlpZiAoZXhjZXB0aW9uVHlwZSAhPSBqYXZhTGFuZ1Rocm93YWJsZSkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJDbGFzcyA9IGV4Y2VwdGlvblR5cGUuc3VwZXJjbGFzcygpOworCQkJCXdoaWxlKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzICE9IGphdmFMYW5nVGhyb3dhYmxlKSB7CisJCQkJCWZpbmRFeGNlcHRpb25Gcm9tVHJ5U3RhdGVtZW50KHR5cGVOYW1lLCBzdXBlckNsYXNzLCByZWNlaXZlclR5cGUsIGludm9jYXRpb25UeXBlLCBzY29wZSwgdHlwZXNGb3VuZCwgZmFsc2UpOworCQkJCQlzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5zdXBlcmNsYXNzKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHR5cGVOYW1lLmxlbmd0aCA+IGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZS5sZW5ndGgpCisJCQlyZXR1cm47CisKKwkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0eXBlTmFtZSwgZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lLCBmYWxzZS8qIGlnbm9yZSBjYXNlICovKQorCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSkpKQorCQkJcmV0dXJuOworCisJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgorCQkJCWV4Y2VwdGlvblR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJgorCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGV4Y2VwdGlvblR5cGUpKQorCQkJcmV0dXJuOworCisJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5KSB7CisJCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gbnVsbCkgeworCQkJCWlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCkgeworCQkJCQlpZiAoIWV4Y2VwdGlvblR5cGUuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSkpIHJldHVybjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWV4Y2VwdGlvblR5cGUuY2FuQmVTZWVuQnkoZXhjZXB0aW9uVHlwZSwgaW52b2NhdGlvblR5cGUpKSByZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIGlmKCFleGNlcHRpb25UeXBlLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGlzRm9yYmlkZGVuKGV4Y2VwdGlvblR5cGUpKSByZXR1cm47CisKKwkJZm9yIChpbnQgaiA9IHR5cGVzRm91bmQuc2l6ZTsgLS1qID49IDA7KSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChqKTsKKworCQkJaWYgKGV4Y2VwdGlvblR5cGUgPT0gb3RoZXJUeXBlKQorCQkJCXJldHVybjsKKworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSwgb3RoZXJUeXBlLnNvdXJjZU5hbWUsIHRydWUpKSB7CisKKwkJCQlpZiAoZXhjZXB0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNTdXBlcmNsYXNzT2Yob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSkpCisJCQkJCXJldHVybjsKKworCQkJCWlmIChvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzSW50ZXJmYWNlKCkpCisJCQkJCWlmIChleGNlcHRpb25UeXBlLmVuY2xvc2luZ1R5cGUoKQorCQkJCQkJLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkpCisJCQkJCQlyZXR1cm47CisKKwkJCQlpZiAoZXhjZXB0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNJbnRlcmZhY2UoKSkKKwkJCQkJaWYgKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkKKwkJCQkJCS5pbXBsZW1lbnRzSW50ZXJmYWNlKGV4Y2VwdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpLCB0cnVlKSkKKwkJCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXR5cGVzRm91bmQuYWRkKGV4Y2VwdGlvblR5cGUpOworCisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpOworCisJCWJvb2xlYW4gaXNRdWFsaWZpZWQgPSBmYWxzZTsKKworCQlpZighdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKKwkJCWlzUXVhbGlmaWVkID0gdHJ1ZTsKKworCQkJY2hhcltdIG1lbWJlclBhY2thZ2VOYW1lID0gZXhjZXB0aW9uVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJY2hhcltdIG1lbWJlclR5cGVOYW1lID0gZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lKCk7CisJCQljaGFyW10gbWVtYmVyRW5jbG9zaW5nVHlwZU5hbWVzID0gbnVsbDsKKworCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gZXhjZXB0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQkJbWVtYmVyRW5jbG9zaW5nVHlwZU5hbWVzID0gZXhjZXB0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCkucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCisJCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKKwkJCWRvbmUgOiB3aGlsZSAoY3VycmVudFNjb3BlICE9IG51bGwpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgeworCisJCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6CisJCQkJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUgPSAoQmxvY2tTY29wZSkgY3VycmVudFNjb3BlOworCisJCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gYmxvY2tTY29wZS5zdWJzY29wZUNvdW50OyBqIDwgbGVuZ3RoOyBqKyspIHsKKworCQkJCQkJCWlmIChibG9ja1Njb3BlLnN1YnNjb3Blc1tqXSBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsKKwkJCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0KKwkJCQkJCQkJCSgoQ2xhc3NTY29wZSkgYmxvY2tTY29wZS5zdWJzY29wZXNbal0pLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKworCQkJCQkJCQlpZiAobG9jYWxUeXBlID09IGV4Y2VwdGlvblR5cGUpIHsKKwkJCQkJCQkJCWlzUXVhbGlmaWVkID0gZmFsc2U7CisJCQkJCQkJCQlicmVhayBkb25lOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlID0gKChDbGFzc1Njb3BlKWN1cnJlbnRTY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gdHlwZS5tZW1iZXJUeXBlcygpOworCQkJCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJCWlmIChtZW1iZXJUeXBlc1tqXSA9PSBleGNlcHRpb25UeXBlKSB7CisJCQkJCQkJCQlpc1F1YWxpZmllZCA9IGZhbHNlOworCQkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgorCQkJCQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9ICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpY3VycmVudFNjb3BlKS50b3BMZXZlbFR5cGVzOworCQkJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJCWlmICh0eXBlc1tqXSA9PSBleGNlcHRpb25UeXBlKSB7CisJCQkJCQkJCQlpc1F1YWxpZmllZCA9IGZhbHNlOworCQkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrIGRvbmU7CisJCQkJfQorCQkJCWN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS5wYXJlbnQ7CisJCQl9CisKKwkJCWlmIChpc1F1YWxpZmllZCAmJiBtdXN0UXVhbGlmeVR5cGUobWVtYmVyUGFja2FnZU5hbWUsIG1lbWJlclR5cGVOYW1lLCBtZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMsIGV4Y2VwdGlvblR5cGUubW9kaWZpZXJzKSkgeworCQkJCWlmIChtZW1iZXJQYWNrYWdlTmFtZSA9PSBudWxsIHx8IG1lbWJlclBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJCQlpZiAodGhpcy51bml0U2NvcGUgIT0gbnVsbCAmJiB0aGlzLnVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpCisJCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CisJCQl9IGVsc2UgeworCQkJCWlzUXVhbGlmaWVkID0gZmFsc2U7CisJCQl9CisKKwkJCWlmIChpc1F1YWxpZmllZCkgeworCQkJCWNvbXBsZXRpb25OYW1lID0KKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJbWVtYmVyUGFja2FnZU5hbWUsCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJCQltZW1iZXJFbmNsb3NpbmdUeXBlTmFtZXMsCisJCQkJCQkJCQltZW1iZXJUeXBlTmFtZSwKKwkJCQkJCQkJCScuJyksCisJCQkJCQkJJy4nKTsKKwkJCX0KKwkJfQorCisJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKGV4Y2VwdGlvblR5cGUpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0eXBlTmFtZSwgZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGV4Y2VwdGlvblR5cGUpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworCQlpZighdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihpc1F1YWxpZmllZCk7CisJCX0KKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbigpOworCisJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCWNyZWF0ZVR5cGVQcm9wb3NhbCgKKwkJCQkJZXhjZXB0aW9uVHlwZSwKKwkJCQkJZXhjZXB0aW9uVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCUlBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSwKKwkJCQkJY29tcGxldGlvbk5hbWUsCisJCQkJCXJlbGV2YW5jZSwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCwKKwkJCQkJZmFsc2UpOworCQl9CisJfQorCXByaXZhdGUgdm9pZCBmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCgKKwkJCWNoYXJbXSB0eXBlTmFtZSwKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQkJU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsCisJCQlCbG9ja1Njb3BlIHNjb3BlLAorCQkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQpIHsKKworCQlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmV4cGVjdGVkVHlwZXNQdHI7IGkrKykgeworCQkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5leHBlY3RlZFR5cGVzW2ldOworCisJCQlmaW5kRXhjZXB0aW9uRnJvbVRyeVN0YXRlbWVudCh0eXBlTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSwgc2NvcGUsIHR5cGVzRm91bmQsIHRydWUpOworCQl9CisJfQorCXByaXZhdGUgdm9pZCBmaW5kRXhwbGljaXRDb25zdHJ1Y3RvcnMoCisJCWNoYXJbXSBuYW1lLAorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLAorCQlNZXRob2RTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKworCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbilzY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQlNZXRob2RCaW5kaW5nIGVuY2xvc2luZ0NvbnN0cnVjdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5iaW5kaW5nOworCisJCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKKwkJaWYobWV0aG9kcyAhPSBudWxsKSB7CisJCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKwkJCQlNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yID0gbWV0aG9kc1tmXTsKKwkJCQlpZiAoY29uc3RydWN0b3IgIT0gZW5jbG9zaW5nQ29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcigpKSB7CisKKwkJCQkJaWYgKGNvbnN0cnVjdG9yLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCisJCQkJCQkJY29uc3RydWN0b3IuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJgorCQkJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKKwkJCQkJCSYmICFjb25zdHJ1Y3Rvci5jYW5CZVNlZW5CeShpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKQljb250aW51ZSBuZXh0OworCisJCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnM7CisJCQkJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOworCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltwYXJhbUxlbmd0aF1bXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CisJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVyc1tpXTsKKwkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQl9CisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yLHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwkJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCQkJCWlmICh0aGlzLnNvdXJjZSAhPSBudWxsCisJCQkJCQkmJiB0aGlzLnNvdXJjZS5sZW5ndGggPiB0aGlzLmVuZFBvc2l0aW9uCisJCQkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmVuZFBvc2l0aW9uXSA9PSAnKCcpCisJCQkJCQljb21wbGV0aW9uID0gbmFtZTsKKwkJCQkJZWxzZQorCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKKworCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgbmFtZSk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7CisJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGN1cnJlbnRUeXBlKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGNvbnN0cnVjdG9yKSk7CisJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gY29uc3RydWN0b3Iub3JpZ2luYWwoKTsKKwkJCQkJCWlmKG9yaWdpbmFsICE9IGNvbnN0cnVjdG9yKSB7CisJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCQl9CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShjdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKKwkJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7CisJCQkJCQkvL3Byb3Bvc2FsLnNldFR5cGVOYW1lKG51bGwpOworCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShuYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldElzQ29udHJ1Y3Rvcih0cnVlKTsKKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhjb25zdHJ1Y3Rvci5tb2RpZmllcnMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvLyBIZWxwZXIgbWV0aG9kIGZvciBmaW5kRmllbGRzKGNoYXJbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUsIE9iamVjdFZlY3RvciwgYm9vbGVhbikKKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygKKwkJY2hhcltdIGZpZWxkTmFtZSwKKwkJRmllbGRCaW5kaW5nW10gZmllbGRzLAorCQlTY29wZSBzY29wZSwKKwkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAorCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQsCisJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsLAorCQlib29sZWFuIGNhbkJlUHJlZml4ZWQsCisJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCWNoYXJbXSBjYXN0ZWRSZWNlaXZlciwKKwkJaW50IHJlY2VpdmVyU3RhcnQsCisJCWludCByZWNlaXZlckVuZCkgeworCisJCU9iamVjdFZlY3RvciBuZXdGaWVsZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJLy8gaWYgdGhlIHByb3Bvc2FsIGlzIGJlaW5nIGFza2VkIGluc2lkZSBhIGZpZWxkJ3MgaW5pdGlhbGl6YXRpb24sIHdlJ2xsIHJlY29yZCBpdHMgaWQKKwkJaW50IGZpZWxkQmVpbmdDb21wbGV0ZWRJZCA9IC0xOworCQlib29sZWFuIGlzRmllbGRCZWluZ0NvbXBsZXRlZFN0YXRpYyA9IGZhbHNlOworCQlmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49MDspIHsKKwkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tmXTsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGZpZWxkLnNvdXJjZUZpZWxkKCk7CisJCQkvLyBXZSBtYXliZSBhc2tpbmcgZm9yIGEgcHJvcG9zYWwgaW5zaWRlIHRoaXMgZmllbGQncyBpbml0aWFsaXphdGlvbi4gU28gcmVjb3JkIGl0cyBpZAorCQkJQVNUTm9kZSBhc3ROb2RlID0gdGhpcy5wYXJzZXIuYXNzaXN0Tm9kZTsKKwkJCWlmIChmaWVsZERlY2xhcmF0aW9uICE9IG51bGwgJiYgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsICYmIGFzdE5vZGUgIT0gbnVsbCkgeworCQkJCWlmIChmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCA+IDApIHsKKwkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24uc291cmNlU3RhcnQgPD0gYXN0Tm9kZS5zb3VyY2VTdGFydCAmJgorCQkJCQkJYXN0Tm9kZS5zb3VyY2VFbmQgPD0gZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQpIHsKKwkJCQkJCS8vIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIKKwkJCQkJCWZpZWxkQmVpbmdDb21wbGV0ZWRJZCA9IGZpZWxkLmlkOworCQkJCQkJaXNGaWVsZEJlaW5nQ29tcGxldGVkU3RhdGljID0gZmllbGQuaXNTdGF0aWMoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsgLy8gVGhlIHNvdXJjZUVuZCBtYXkgbm90IHlldCBiZSBzZXQKKwkJCQkJQ29tcGxldGlvbk5vZGVEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBDb21wbGV0aW9uTm9kZURldGVjdG9yKGFzdE5vZGUsIGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24pOworCQkJCQlpZiAoZGV0ZWN0b3IuY29udGFpbnNDb21wbGV0aW9uTm9kZSgpKSB7ICAvLyBjb21wbGV0aW9uIGlzIGluc2lkZSBhIGZpZWxkIGluaXRpYWxpemVyCisJCQkJCQlmaWVsZEJlaW5nQ29tcGxldGVkSWQgPSBmaWVsZC5pZDsKKwkJCQkJCWlzRmllbGRCZWluZ0NvbXBsZXRlZFN0YXRpYyA9IGZpZWxkLmlzU3RhdGljKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBJbmhlcml0ZWQgZmllbGRzIHdoaWNoIGFyZSBoaWRkZW4gYnkgc3ViY2xhc3NlcyBhcmUgZmlsdGVyZWQgb3V0CisJCS8vIE5vIHZpc2liaWxpdHkgY2hlY2tzIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgc2NvcGUgJiBpbnZvY2F0aW9uU2l0ZQorCisJCWludCBmaWVsZExlbmd0aCA9IGZpZWxkTmFtZS5sZW5ndGg7CisJCW5leHQgOiBmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbZl07CisJCQkKKwkJCS8vIENvbnRlbnQgYXNzaXN0IGludm9rZWQgaW5zaWRlIHNvbWUgZmllbGQncyBpbml0aWFsaXphdGlvbi4KKwkJCS8vIGJ1ZyAzMTA0MjcgYW5kIDMyNTQ4MQorCQkJaWYgKGZpZWxkQmVpbmdDb21wbGV0ZWRJZCA+PSAwICYmIGZpZWxkLmlkID49IGZpZWxkQmVpbmdDb21wbGV0ZWRJZCkgeworCQkJCS8vIERvbid0IHByb3Bvc2UgZmllbGQgd2hpY2ggaXMgYmVpbmcgZGVjbGFyZWQgY3VycmVudGx5CisJCQkJLy8gRG9uJ3QgcHJvcG9zZSBmaWVsZHMgZGVjbGFyZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgZmllbGQgZGVjbGFyYXRpb24gc3RhdGVtZW50CisJCQkJLy8gVGhvdWdoLCBpZiBmaWVsZCBpcyBzdGF0aWMsIHRoZW4gaXQgY2FuIGJlIHN0aWxsIGJlIHByb3Bvc2VkCisJCQkJaWYgKCFmaWVsZC5pc1N0YXRpYygpKSB7IAorCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0gZWxzZSBpZiAoaXNGaWVsZEJlaW5nQ29tcGxldGVkU3RhdGljKSB7CisJCQkJCS8vIHN0YXRpYyBmaWVsZHMgY2FuJ3QgYmUgcHJvcG9zZWQgYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGRlY2xhcmVkIGlmIHRoZSAKKwkJCQkJLy8gZmllbGQgY3VycmVudGx5IGJlaW5nIGRlY2xhcmVkIGlzIGFsc28gc3RhdGljCisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoZmllbGQuaXNTeW50aGV0aWMoKSkJY29udGludWUgbmV4dDsKKworCQkJaWYgKG9ubHlTdGF0aWNGaWVsZHMgJiYgIWZpZWxkLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCisJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2goZmllbGROYW1lLCBmaWVsZC5uYW1lKSkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgorCQkJCQlmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCisJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGZpZWxkLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCSYmICFmaWVsZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpCWNvbnRpbnVlIG5leHQ7CisJCQkKKwkJCS8vIGRvbid0IHByb3Bvc2Ugbm9uIGNvbnN0YW50IGZpZWxkcyBvciBzdHJpbmdzICgxLjYgb3IgYmVsb3cpIGluIGNhc2UgZXhwcmVzc2lvbgorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTM0NgorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzM0MgorCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzSW5zaWRlQ2FzZSkgeworCQkJCWlmIChmaWVsZC5pc0ZpbmFsKCkgJiYgZmllbGQuaXNTdGF0aWMoKSkgeworCQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNTdHJpbmcpeworCQkJCQkJaWYgKGZpZWxkLnR5cGUgPT0gbnVsbCB8fCBmaWVsZC50eXBlLmlkICE9IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykKKwkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQl9IGVsc2UgaWYgKCEoZmllbGQudHlwZSBpbnN0YW5jZW9mIEJhc2VUeXBlQmluZGluZykpCisJCQkJCQljb250aW51ZSBuZXh0OyAKKwkJCQl9IGVsc2UgeworCQkJCQljb250aW51ZSBuZXh0OyAvLyBub24tY29uc3RhbnRzIG5vdCBhbGxvd2VkIGluIGNhc2UuCQorCQkJCX0KKwkJCX0KKworCQkJYm9vbGVhbiBwcmVmaXhSZXF1aXJlZCA9IGZhbHNlOworCisJCQlmb3IgKGludCBpID0gZmllbGRzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJT2JqZWN0W10gb3RoZXIgPSAoT2JqZWN0W10pZmllbGRzRm91bmQuZWxlbWVudEF0KGkpOworCQkJCUZpZWxkQmluZGluZyBvdGhlckZpZWxkID0gKEZpZWxkQmluZGluZykgb3RoZXJbMF07CisJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclJlY2VpdmVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBvdGhlclsxXTsKKwkJCQlpZiAoZmllbGQgPT0gb3RoZXJGaWVsZCAmJiByZWNlaXZlclR5cGUgPT0gb3RoZXJSZWNlaXZlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkLm5hbWUsIG90aGVyRmllbGQubmFtZSwgdHJ1ZSkpIHsKKwkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MpKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJaWYgKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzID09IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCkpCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyRmllbGQuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCisJCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKGZpZWxkLmRlY2xhcmluZ0NsYXNzLCB0cnVlKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQlpZihjYW5CZVByZWZpeGVkKSB7CisJCQkJCQlwcmVmaXhSZXF1aXJlZCA9IHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmb3IgKGludCBsID0gbG9jYWxzRm91bmQuc2l6ZTsgLS1sID49IDA7KSB7CisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGxvY2Fsc0ZvdW5kLmVsZW1lbnRBdChsKTsKKworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZC5uYW1lLCBsb2NhbC5uYW1lLCB0cnVlKSkgeworCQkJCQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJhdGlvblR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkJCWlmIChkZWNsYXJhdGlvblR5cGUuaXNBbm9ueW1vdXNUeXBlKCkgJiYgZGVjbGFyYXRpb25UeXBlICE9IGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpIHsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQkJaWYoY2FuQmVQcmVmaXhlZCkgeworCQkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCW5ld0ZpZWxkc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117ZmllbGQsIHJlY2VpdmVyVHlwZX0pOworCisJCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkLm5hbWU7CisKKwkJCWlmKHByZWZpeFJlcXVpcmVkIHx8IHRoaXMub3B0aW9ucy5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbil7CisJCQkJY2hhcltdIHByZWZpeCA9IGNvbXB1dGVQcmVmaXgoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBpbnZvY2F0aW9uU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBmaWVsZC5pc1N0YXRpYygpKTsKKwkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4LGNvbXBsZXRpb24sJy4nKTsKKwkJCX0KKworCisJCQlpZiAoY2FzdGVkUmVjZWl2ZXIgIT0gbnVsbCkgeworCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjYXN0ZWRSZWNlaXZlciwgY29tcGxldGlvbik7CisJCQl9CisKKwkJCS8vIFNwZWNpYWwgY2FzZSBmb3IgamF2YWRvYyBjb21wbGV0aW9uCisJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID4gMCkgeworCQkJCWlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSkgeworCQkJCQlDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UgZmllbGRSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSBpbnZvY2F0aW9uU2l0ZTsKKwkJCQkJaWYgKGZpZWxkUmVmLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCQkJCQlpZiAoZmllbGRSZWYuY29tcGxldGVJblRleHQoKSkgeworCQkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuZXcgY2hhcltdIHsgJyMnIH0sIGZpZWxkLm5hbWUpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGZpZWxkUmVmLmNvbXBsZXRlSW5UZXh0KCkpIHsKKwkJCQkJCWlmIChmaWVsZFJlZi5yZWNlaXZlciBpbnN0YW5jZW9mIEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQkJCQkJSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IChKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgZmllbGRSZWYucmVjZWl2ZXI7CisJCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHR5cGVSZWYudG9rZW4sIGZpZWxkLm5hbWUsICcjJyk7CisJCQkJCQl9IGVsc2UgaWYgKGZpZWxkUmVmLnJlY2VpdmVyIGluc3RhbmNlb2YgSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQkJCQlKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBmaWVsZFJlZi5yZWNlaXZlcjsKKwkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpLCBmaWVsZC5uYW1lLCAnIycpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKGZpZWxkKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGZpZWxkTmFtZSwgZmllbGQubmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoZmllbGQudHlwZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW1Db25zdGFudChmaWVsZC50eXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKG9ubHlTdGF0aWNGaWVsZHMsIGZpZWxkLmlzU3RhdGljKCkpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JGaW5hbCh0aGlzLmFzc2lzdE5vZGVJc0luc2lkZUNhc2UsIGZpZWxkLmlzRmluYWwoKSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKwkJCWlmIChvbmx5U3RhdGljRmllbGRzICYmIHRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbmhlcml0YW5jZShyZWNlaXZlclR5cGUsIGZpZWxkLmRlY2xhcmluZ0NsYXNzKTsKKwkJCX0KKwkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yTWlzc2luZ0VsZW1lbnRzKG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQl9CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYgKGNhc3RlZFJlY2VpdmVyID09IG51bGwpIHsKKwkJCQkvLyBTdGFuZGFyZCBwcm9wb3NhbAorCQkJCWlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpICYmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLk9OTFlfSU5MSU5FX1RBRykgPT0gMCkgeworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KKwkJCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCisJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzW2ldLAorCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKKwkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAorCQkJCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJCQl9CisJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOworCQkJCQl9CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gSmF2YWRvYyBjb21wbGV0aW9ucworCQkJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfRklFTERfUkVGKSkgeworCQkJCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb24gPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb24sIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0TmFtZShmaWVsZC5uYW1lKTsKKwkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihqYXZhZG9jQ29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJCWludCBzdGFydCA9ICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlJFUExBQ0VfVEFHKSAhPSAwID8gdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gOiB0aGlzLnN0YXJ0UG9zaXRpb247CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJCS8vIEphdmFkb2MgdmFsdWUgY29tcGxldGlvbiBmb3Igc3RhdGljIGZpZWxkcworCQkJCQlpZiAoZmllbGQuaXNTdGF0aWMoKSAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1ZBTFVFX1JFRikpIHsKKwkJCQkJCWphdmFkb2NDb21wbGV0aW9uID0gaW5saW5lVGFnQ29tcGxldGlvbihjb21wbGV0aW9uLCBKYXZhZG9jVGFnQ29uc3RhbnRzLlRBR19WQUxVRSk7CisJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCB2YWx1ZVByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfVkFMVUVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQl2YWx1ZVByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQkJdmFsdWVQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQkJCXZhbHVlUHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCXZhbHVlUHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJdmFsdWVQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJdmFsdWVQcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQl2YWx1ZVByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCQl2YWx1ZVByb3Bvc2FsLnNldENvbXBsZXRpb24oamF2YWRvY0NvbXBsZXRpb24pOworCQkJCQkJdmFsdWVQcm9wb3NhbC5zZXRGbGFncyhmaWVsZC5tb2RpZmllcnMpOworCQkJCQkJdmFsdWVQcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXZhbHVlUHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXZhbHVlUHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZStSX1ZBTFVFX1RBRyk7CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQodmFsdWVQcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyh2YWx1ZVByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSkgeworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOworCQkJCQlwcm9wb3NhbC5zZXRSZWNlaXZlclNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVjZWl2ZXJUeXBlKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOworCQkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKKwkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJCXN1YlByb3Bvc2Fsc1tpXSA9CisJCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1tpXSwKKwkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHNbaV0sCisJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJfQorCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQkJfQorCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhmaWVsZC5tb2RpZmllcnMpOworCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFJlY2VpdmVyUmFuZ2UocmVjZWl2ZXJTdGFydCAtIHRoaXMub2Zmc2V0LCByZWNlaXZlckVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJZmllbGRzRm91bmQuYWRkQWxsKG5ld0ZpZWxkc0ZvdW5kKTsKKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHMoCisJCWNoYXJbXSBmaWVsZE5hbWUsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAorCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQsCisJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJYm9vbGVhbiBpbXBsaWNpdENhbGwsCisJCWJvb2xlYW4gY2FuQmVQcmVmaXhlZCwKKwkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJY2hhcltdIGNhc3RlZFJlY2VpdmVyLAorCQlpbnQgcmVjZWl2ZXJTdGFydCwKKwkJaW50IHJlY2VpdmVyRW5kKSB7CisKKwkJYm9vbGVhbiBub3RJbkphdmFkb2MgPSB0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMDsKKwkJaWYgKGZpZWxkTmFtZSA9PSBudWxsICYmIG5vdEluSmF2YWRvYykKKwkJCXJldHVybjsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOworCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOworCQlpbnQgbmV4dFBvc2l0aW9uID0gMDsKKwkJZG8geworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCWlmIChub3RJbkphdmFkb2MgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgeworCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKSB7CisJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gaXRzSW50ZXJmYWNlczsKKwkJCQkJbmV4dFBvc2l0aW9uID0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOworCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCisJCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVGaWVsZHMoKTsKKwkJCWlmKGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7CisJCQkJZmluZEZpZWxkcygKKwkJCQkJZmllbGROYW1lLAorCQkJCQlmaWVsZHMsCisJCQkJCXNjb3BlLAorCQkJCQlmaWVsZHNGb3VuZCwKKwkJCQkJbG9jYWxzRm91bmQsCisJCQkJCW9ubHlTdGF0aWNGaWVsZHMsCisJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJaW1wbGljaXRDYWxsLAorCQkJCQljYW5CZVByZWZpeGVkLAorCQkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQkJCQljYXN0ZWRSZWNlaXZlciwKKwkJCQkJcmVjZWl2ZXJTdGFydCwKKwkJCQkJcmVjZWl2ZXJFbmQpOworCQkJfQorCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisJCX0gd2hpbGUgKG5vdEluSmF2YWRvYyAmJiBjdXJyZW50VHlwZSAhPSBudWxsKTsKKworCQlpZiAobm90SW5KYXZhZG9jICYmIGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dFBvc2l0aW9uOyBpKyspIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gYW5JbnRlcmZhY2UuYXZhaWxhYmxlRmllbGRzKCk7CisJCQkJaWYoZmllbGRzICE9ICBudWxsKSB7CisJCQkJCWZpbmRGaWVsZHMoCisJCQkJCQlmaWVsZE5hbWUsCisJCQkJCQlmaWVsZHMsCisJCQkJCQlzY29wZSwKKwkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJbG9jYWxzRm91bmQsCisJCQkJCQlvbmx5U3RhdGljRmllbGRzLAorCQkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlpbXBsaWNpdENhbGwsCisJCQkJCQljYW5CZVByZWZpeGVkLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQkJCWNhc3RlZFJlY2VpdmVyLAorCQkJCQkJcmVjZWl2ZXJTdGFydCwKKwkJCQkJCXJlY2VpdmVyRW5kKTsKKwkJCQl9CisKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOworCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCisJCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmluZEZpZWxkc0FuZE1ldGhvZHMoCisJCWNoYXJbXSB0b2tlbiwKKwkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQlib29sZWFuIGltcGxpY2l0Q2FsbCwKKwkJYm9vbGVhbiBzdXBlckNhbGwsCisJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJYm9vbGVhbiBtaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCWNoYXJbXSBjYXN0ZWRSZWNlaXZlciwKKwkJaW50IHJlY2VpdmVyU3RhcnQsCisJCWludCByZWNlaXZlckVuZCkgeworCisJCWlmICh0b2tlbiA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQorCQkJcmV0dXJuOyAvLyBub3RoaW5nIGVsc2UgaXMgcG9zc2libGUgd2l0aCBiYXNlIHR5cGVzCisKKwkJYm9vbGVhbiBwcm9wb3NlRmllbGQgPQorCQkJY2FzdGVkUmVjZWl2ZXIgPT0gbnVsbCA/CisJCQkJCSF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgOgorCQkJCQkhdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIDsKKwkJYm9vbGVhbiBwcm9wb3NlTWV0aG9kID0KKwkJCWNhc3RlZFJlY2VpdmVyID09IG51bGwgPworCQkJCQkhdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSA6CisJCQkJCSF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpOworCisJCWlmIChyZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJaWYgKHByb3Bvc2VGaWVsZAorCQkJCSYmIHRva2VuLmxlbmd0aCA8PSBsZW5ndGhGaWVsZC5sZW5ndGgKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbGVuZ3RoRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCisJCQkpKSB7CisKKwkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbixsZW5ndGhGaWVsZCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKFR5cGVCaW5kaW5nLklOVCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBsZW5ndGggZmllbGQKKwkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJCQl9CisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYgKGNhc3RlZFJlY2VpdmVyID09IG51bGwpIHsKKwkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShyZWNlaXZlclR5cGUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShJTlRfU0lHTkFUVVJFKTsKKwkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKElOVCk7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKGxlbmd0aEZpZWxkKTsKKwkJCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KKwkJCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKKwkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCQl9CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24obGVuZ3RoRmllbGQpOworCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoRmxhZ3MuQWNjUHVibGljKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNhc3RlZFJlY2VpdmVyLCBsZW5ndGhGaWVsZCk7CisKKwkJCQkJaWYoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKElOVF9TSUdOQVRVUkUpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVjZWl2ZXJTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoSU5UKTsKKwkJCQkJCXByb3Bvc2FsLnNldE5hbWUobGVuZ3RoRmllbGQpOworCQkJCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsW10gc3ViUHJvcG9zYWxzID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFttaXNzaW5nRWxlbWVudHMubGVuZ3RoXTsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJCQkJY3JlYXRlUmVxdWlyZWRUeXBlUHJvcG9zYWwoCisJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1tpXSwKKwkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzW2ldLAorCQkJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJCX0KKwkJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhzdWJQcm9wb3NhbHMpOworCQkJCQkJfQorCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKEZsYWdzLkFjY1B1YmxpYyk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWNlaXZlclJhbmdlKHJlY2VpdmVyU3RhcnQgLSB0aGlzLm9mZnNldCwgcmVjZWl2ZXJFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHByb3Bvc2VNZXRob2QKKwkJCQkmJiB0b2tlbi5sZW5ndGggPD0gY2xvbmVNZXRob2QubGVuZ3RoCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGNsb25lTWV0aG9kLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykKKwkJCSkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgb2JqZWN0UmVmID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKworCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBjbG9uZU1ldGhvZCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG9iamVjdFJlZik7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JTdGF0aWMoZmFsc2UsIGZhbHNlKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgY2xvbmUoKSBtZXRob2QKKwkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJCQl9CisJCQkJY2hhcltdIGNvbXBsZXRpb247CisJCQkJaWYgKHRoaXMuc291cmNlICE9IG51bGwKKwkJCQkJJiYgdGhpcy5zb3VyY2UubGVuZ3RoID4gdGhpcy5lbmRQb3NpdGlvbgorCQkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmVuZFBvc2l0aW9uXSA9PSAnKCcpIHsKKwkJCQkJY29tcGxldGlvbiA9IGNsb25lTWV0aG9kOworCQkJCQl9IGVsc2UgeworCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY2xvbmVNZXRob2QsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKKwkJCQl9CisKKwkJCQlpZiAoY2FzdGVkUmVjZWl2ZXIgIT0gbnVsbCkgeworCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY2FzdGVkUmVjZWl2ZXIsIGNvbXBsZXRpb24pOworCQkJCX0KKworCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCWlmIChjYXN0ZWRSZWNlaXZlciA9PSBudWxsKSB7CisJCQkJCWlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShyZWNlaXZlclR5cGUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZSgKKwkJCQkJCQkJdGhpcy5jb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80ICYmIHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpID8KKwkJCQkJCQkJCQljcmVhdGVNZXRob2RTaWduYXR1cmUoCisJCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJCQkJCQkJZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpIDoKKwkJCQkJCQkJCQljcmVhdGVNZXRob2RTaWduYXR1cmUoCisJCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKEpBVkFfTEFORywgJy4nKSwKKwkJCQkJCQkJCQkJCU9CSkVDVCkpOworCQkJCQkJLy9wcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShudWxsKTsKKwkJCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShudWxsKTsKKwkJCQkJCS8vcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShudWxsKTsKKwkJCQkJCS8vcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKG51bGwpOworCQkJCQkJLy9wcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMobnVsbCk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKE9CSkVDVCk7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKGNsb25lTWV0aG9kKTsKKwkJCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KKwkJCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKKwkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCQl9CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQltZXRob2RzRm91bmQuYWRkKG5ldyBPYmplY3RbXXtvYmplY3RSZWYuZ2V0TWV0aG9kcyhjbG9uZU1ldGhvZClbMF0sIG9iamVjdFJlZn0pOworCQkJCX0gZWxzZSB7CisJCQkJCWlmKCF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiwgbWlzc2luZ0VsZW1lbnRzICE9IG51bGwpKSB7CisJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKAorCQkJCQkJCQl0aGlzLmNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCA+IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgJiYgcmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkgPworCQkJCQkJCQkJCWNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKKwkJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCisJCQkJCQkJCQkJCQlnZXRTaWduYXR1cmUocmVjZWl2ZXJUeXBlKSkgOgorCQkJCQkJCQkJCWNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKKwkJCQkJCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLAorCQkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCisJCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpLAorCQkJCQkJCQkJCQkJT0JKRUNUKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWNlaXZlclNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVjZWl2ZXJUeXBlKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoSkFWQV9MQU5HLCAnLicpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKE9CSkVDVCk7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKGNsb25lTWV0aG9kKTsKKwkJCQkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJc3ViUHJvcG9zYWxzW2ldID0KKwkJCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSwKKwkJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCQl9CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVjZWl2ZXJSYW5nZShyZWNlaXZlclN0YXJ0IC0gdGhpcy5vZmZzZXQsIHJlY2VpdmVyRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmVjZWl2ZXJUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJfQorCQkKKwkJY2hlY2tDYW5jZWwoKTsKKwkJCisJCWlmKHByb3Bvc2VGaWVsZCkgeworCQkJZmluZEZpZWxkcygKKwkJCQl0b2tlbiwKKwkJCQkoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlLAorCQkJCXNjb3BlLAorCQkJCWZpZWxkc0ZvdW5kLAorCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQlmYWxzZSwKKwkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJaW1wbGljaXRDYWxsLAorCQkJCWZhbHNlLAorCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCQkJY2FzdGVkUmVjZWl2ZXIsCisJCQkJcmVjZWl2ZXJTdGFydCwKKwkJCQlyZWNlaXZlckVuZCk7CisJCX0KKworCQlpZihwcm9wb3NlTWV0aG9kKSB7CisJCQlmaW5kTWV0aG9kcygKKwkJCQl0b2tlbiwKKwkJCQludWxsLAorCQkJCW51bGwsCisJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSwKKwkJCQlzY29wZSwKKwkJCQltZXRob2RzRm91bmQsCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCWltcGxpY2l0Q2FsbCwKKwkJCQlzdXBlckNhbGwsCisJCQkJZmFsc2UsCisJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQljYXN0ZWRSZWNlaXZlciwKKwkJCQlyZWNlaXZlclN0YXJ0LAorCQkJCXJlY2VpdmVyRW5kKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbUFub3RoZXJSZWNlaXZlcigKKwkJCWNoYXJbXSB0b2tlbiwKKwkJCVR5cGVSZWZlcmVuY2UgcmVjZWl2ZXJUeXBlLAorCQkJU2NvcGUgc2NvcGUsCisJCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQsCisJCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCQlib29sZWFuIGltcGxpY2l0Q2FsbCwKKwkJCWJvb2xlYW4gc3VwZXJDYWxsLAorCQkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCWNoYXJbXVtdIHJlY2VpdmVyTmFtZSwKKwkJCWludCByZWNlaXZlclN0YXJ0LAorCQkJaW50IHJlY2VpdmVyRW5kKSB7CisKKwkJaWYgKHJlY2VpdmVyVHlwZS5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgcmV0dXJuOworCisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZUJpbmRpbmcgPSByZWNlaXZlclR5cGUucmVzb2x2ZWRUeXBlOworCQljaGFyW10gY2FzdGVkUmVjZWl2ZXIgPSBudWxsOworCisJCWNoYXJbXSBjYXN0ZWRUeXBlQ2hhcnMgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocmVjZWl2ZXJUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7CisJCWlmKHRoaXMuc291cmNlICE9IG51bGwpIHsKKwkJCWludCBtZW1iZXJSZWZTdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKKworCQkJY2hhcltdIHJlY2VpdmVyQ2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuc291cmNlLCByZWNlaXZlclN0YXJ0LCByZWNlaXZlckVuZCk7CisJCQljaGFyW10gZG90Q2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuc291cmNlLCByZWNlaXZlckVuZCwgbWVtYmVyUmVmU3RhcnQpOworCisJCQljYXN0ZWRSZWNlaXZlciA9CisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJJygnLAorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoJygnLCBjYXN0ZWRUeXBlQ2hhcnMsICcpJyksCisJCQkJCQkJcmVjZWl2ZXJDaGFycyksCisJCQkJCQknKScpLAorCQkJCQlkb3RDaGFycyk7CisJCX0gZWxzZSB7CisJCQljYXN0ZWRSZWNlaXZlciA9CisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJJygnLAorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoJygnLCBjYXN0ZWRUeXBlQ2hhcnMsICcpJyksCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHJlY2VpdmVyTmFtZSwgJy4nKSksCisJCQkJCQknKScpLAorCQkJCQlET1QpOworCQl9CisKKwkJaWYgKGNhc3RlZFJlY2VpdmVyID09IG51bGwpIHJldHVybjsKKworCQlpbnQgb2xkU3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJdGhpcy5zdGFydFBvc2l0aW9uID0gcmVjZWl2ZXJTdGFydDsKKworCQlmaW5kRmllbGRzQW5kTWV0aG9kcygKKwkJCQl0b2tlbiwKKwkJCQlyZWNlaXZlclR5cGVCaW5kaW5nLAorCQkJCXNjb3BlLAorCQkJCWZpZWxkc0ZvdW5kLAorCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJaW1wbGljaXRDYWxsLAorCQkJCXN1cGVyQ2FsbCwKKwkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQkJCWNhc3RlZFJlY2VpdmVyLAorCQkJCXJlY2VpdmVyU3RhcnQsCisJCQkJcmVjZWl2ZXJFbmQpOworCisJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IG9sZFN0YXJ0UG9zaXRpb247CisJfQorCXByaXZhdGUgdm9pZCBmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21DYXN0ZWRSZWNlaXZlcigKKwkJCUFTVE5vZGUgZW5jbG9zaW5nTm9kZSwKKwkJCUJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywKKwkJCVNjb3BlIHNjb3BlLAorCQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kLAorCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQkJRXhwcmVzc2lvbiByZWNlaXZlcikgeworCisJCWlmIChlbmNsb3NpbmdOb2RlID09IG51bGwgfHwgIShlbmNsb3NpbmdOb2RlIGluc3RhbmNlb2YgSWZTdGF0ZW1lbnQpKSByZXR1cm47CisKKwkJSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQgPSAoSWZTdGF0ZW1lbnQpZW5jbG9zaW5nTm9kZTsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWlmICghKGlmU3RhdGVtZW50LmNvbmRpdGlvbiBpbnN0YW5jZW9mIEluc3RhbmNlT2ZFeHByZXNzaW9uKSkgcmV0dXJuOworCQorCQkJSW5zdGFuY2VPZkV4cHJlc3Npb24gaW5zdGFuY2VPZkV4cHJlc3Npb24gPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIGlmU3RhdGVtZW50LmNvbmRpdGlvbjsKKwkKKwkJCVR5cGVSZWZlcmVuY2UgaW5zdGFuY2VPZlR5cGUgPSBpbnN0YW5jZU9mRXhwcmVzc2lvbi50eXBlOworCQorCQkJaWYgKGluc3RhbmNlT2ZUeXBlLnJlc29sdmVkVHlwZSA9PSBudWxsKSByZXR1cm47CisJCisJCQlib29sZWFuIGZpbmRGcm9tQW5vdGhlclJlY2VpdmVyID0gZmFsc2U7CisJCisJCQljaGFyW11bXSByZWNlaXZlck5hbWUgPSBudWxsOworCQkJaW50IHJlY2VpdmVyU3RhcnQgPSAtMTsKKwkJCWludCByZWNlaXZlckVuZCA9IC0xOworCQorCQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWNlaXZlcjsKKwkKKwkJCQlyZWNlaXZlck5hbWUgPSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnRva2VuczsKKwkKKwkJCQlpZiAocmVjZWl2ZXJOYW1lLmxlbmd0aCAhPSAxKSByZXR1cm47CisJCisJCQkJcmVjZWl2ZXJTdGFydCA9IChpbnQpIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uc1swXSA+Pj4gMzIpOworCQkJCXJlY2VpdmVyRW5kID0gKGludCkgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnNbcXVhbGlmaWVkTmFtZVJlZmVyZW5jZS50b2tlbnMubGVuZ3RoIC0gMV0gKyAxOworCQorCQkJCS8vIGlmIChsb2NhbCBpbnN0YW5jZW9mIFgpIGxvY2FsLnwKKwkJCQkvLyBpZiAoZmllbGQgaW5zdGFuY2VvZiBYKSBmaWVsZC58CisJCQkJaWYgKGluc3RhbmNlT2ZFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlICYmCisJCQkJCQkoKFNpbmdsZU5hbWVSZWZlcmVuY2UpaW5zdGFuY2VPZkV4cHJlc3Npb24uZXhwcmVzc2lvbikuYmluZGluZyA9PSBxdWFsaWZpZWRCaW5kaW5nICYmCisJCQkJCQkocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nIHx8IHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpKSB7CisJCQkJCWZpbmRGcm9tQW5vdGhlclJlY2VpdmVyID0gdHJ1ZTsKKwkJCQl9CisJCisJCQkJLy8gaWYgKHRoaXMuZmllbGQgaW5zdGFuY2VvZiBYKSBmaWVsZC58CisJCQkJaWYgKGluc3RhbmNlT2ZFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgeworCQkJCQlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSA9IChGaWVsZFJlZmVyZW5jZSlpbnN0YW5jZU9mRXhwcmVzc2lvbi5leHByZXNzaW9uOworCQorCQkJCQlpZiAoZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIgaW5zdGFuY2VvZiBUaGlzUmVmZXJlbmNlICYmCisJCQkJCQkJcXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZyAmJgorCQkJCQkJCWZpZWxkUmVmZXJlbmNlLmJpbmRpbmcgPT0gcXVhbGlmaWVkQmluZGluZykgeworCQkJCQkJCQlmaW5kRnJvbUFub3RoZXJSZWNlaXZlciA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsKKwkJCQlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZTEgPSAoRmllbGRSZWZlcmVuY2UpIHJlY2VpdmVyOworCQorCQkJCXJlY2VpdmVyU3RhcnQgPSBmaWVsZFJlZmVyZW5jZTEuc291cmNlU3RhcnQ7CisJCQkJcmVjZWl2ZXJFbmQgPSBmaWVsZFJlZmVyZW5jZTEuc291cmNlRW5kICsgMTsKKwkKKwkJCQlpZiAoZmllbGRSZWZlcmVuY2UxLnJlY2VpdmVyIGluc3RhbmNlb2YgVGhpc1JlZmVyZW5jZSkgeworCQorCQkJCQlyZWNlaXZlck5hbWUgPSBuZXcgY2hhcltdW10ge1RISVMsIGZpZWxkUmVmZXJlbmNlMS50b2tlbn07CisJCisJCQkJCS8vIGlmIChmaWVsZCBpbnN0YW5jZW9mIFgpIHRoaXMuZmllbGQufAorCQkJCQlpZiAoaW5zdGFuY2VPZkV4cHJlc3Npb24uZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UgJiYKKwkJCQkJCQkoKFNpbmdsZU5hbWVSZWZlcmVuY2UpaW5zdGFuY2VPZkV4cHJlc3Npb24uZXhwcmVzc2lvbikuYmluZGluZyA9PSBmaWVsZFJlZmVyZW5jZTEuYmluZGluZykgeworCQkJCQkJZmluZEZyb21Bbm90aGVyUmVjZWl2ZXIgPSB0cnVlOworCQkJCQl9CisJCisJCQkJCS8vIGlmICh0aGlzLmZpZWxkIGluc3RhbmNlb2YgWCkgdGhpcy5maWVsZC58CisJCQkJCWlmIChpbnN0YW5jZU9mRXhwcmVzc2lvbi5leHByZXNzaW9uIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsKKwkJCQkJCUZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlMiA9IChGaWVsZFJlZmVyZW5jZSlpbnN0YW5jZU9mRXhwcmVzc2lvbi5leHByZXNzaW9uOworCQorCQkJCQkJaWYgKGZpZWxkUmVmZXJlbmNlMi5yZWNlaXZlciBpbnN0YW5jZW9mIFRoaXNSZWZlcmVuY2UgJiYKKwkJCQkJCQkJZmllbGRSZWZlcmVuY2UyLmJpbmRpbmcgPT0gZmllbGRSZWZlcmVuY2UxLmJpbmRpbmcpIHsKKwkJCQkJCQkJCWZpbmRGcm9tQW5vdGhlclJlY2VpdmVyID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkKKwkJCWlmIChmaW5kRnJvbUFub3RoZXJSZWNlaXZlcikgeworCQkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZUJpbmRpbmcgPSBpbnN0YW5jZU9mVHlwZS5yZXNvbHZlZFR5cGU7CisJCQkJY2hhcltdIGNhc3RlZFJlY2VpdmVyID0gbnVsbDsKKwkKKwkJCQljaGFyW10gY2FzdGVkVHlwZUNoYXJzID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGluc3RhbmNlT2ZUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7CisJCQkJaWYodGhpcy5zb3VyY2UgIT0gbnVsbCkgeworCQkJCQlpbnQgbWVtYmVyUmVmU3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CisJCisJCQkJCWNoYXJbXSByZWNlaXZlckNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0aGlzLnNvdXJjZSwgcmVjZWl2ZXJTdGFydCwgcmVjZWl2ZXJFbmQpOworCQkJCQljaGFyW10gZG90Q2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuc291cmNlLCByZWNlaXZlckVuZCwgbWVtYmVyUmVmU3RhcnQpOworCQorCQkJCQljYXN0ZWRSZWNlaXZlciA9CisJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQkJJygnLAorCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KCcoJywgY2FzdGVkVHlwZUNoYXJzLCAnKScpLAorCQkJCQkJCQkJcmVjZWl2ZXJDaGFycyksCisJCQkJCQkJCScpJyksCisJCQkJCQkJZG90Q2hhcnMpOworCQkJCX0gZWxzZSB7CisJCQkJCWNhc3RlZFJlY2VpdmVyID0KKwkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCQknKCcsCisJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoJygnLCBjYXN0ZWRUeXBlQ2hhcnMsICcpJyksCisJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocmVjZWl2ZXJOYW1lLCAnLicpKSwKKwkJCQkJCQkJJyknKSwKKwkJCQkJCQlET1QpOworCQkJCX0KKwkKKwkJCQlpZiAoY2FzdGVkUmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuOworCQorCQkJCWludCBvbGRTdGFydFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOworCQkJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHJlY2VpdmVyU3RhcnQ7CisJCisJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHMoCisJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkJCXJlY2VpdmVyVHlwZUJpbmRpbmcsCisJCQkJCQlzY29wZSwKKwkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlmYWxzZSwKKwkJCQkJCWZhbHNlLAorCQkJCQkJbnVsbCwKKwkJCQkJCW51bGwsCisJCQkJCQludWxsLAorCQkJCQkJZmFsc2UsCisJCQkJCQljYXN0ZWRSZWNlaXZlciwKKwkJCQkJCXJlY2VpdmVyU3RhcnQsCisJCQkJCQlyZWNlaXZlckVuZCk7CisJCisJCQkJdGhpcy5zdGFydFBvc2l0aW9uID0gb2xkU3RhcnRQb3NpdGlvbjsKKwkJCX0KKwkJCS8vIHRyYXZlcnNlIHRoZSBlbmNsb3Npbmcgbm9kZSB0byBmaW5kIHRoZSBpbnN0YW5jZW9mIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZworCQkJLy8gdG8gdGhlIGNvbXBsZXRpb24gbm9kZSAoaWYgYW55KQorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDAwNgorCQkJaWYgKGlmU3RhdGVtZW50LnRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBJZlN0YXRlbWVudCkgeworCQkJCWlmU3RhdGVtZW50ID0gKElmU3RhdGVtZW50KSBpZlN0YXRlbWVudC50aGVuU3RhdGVtZW50OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tRmF2b3JpdGVzKAorCQkJY2hhcltdIHRva2VuLAorCQkJU2NvcGUgc2NvcGUsCisJCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQpIHsKKworCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kRnJvbUZhdm9yaXRlcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKworCQlJbXBvcnRCaW5kaW5nW10gZmF2b3JpdGVCaW5kaW5ncyA9IGdldEZhdm9yaXRlUmVmZXJlbmNlQmluZGluZ3MoaW52b2NhdGlvblNjb3BlKTsKKworCQlpZiAoZmF2b3JpdGVCaW5kaW5ncyAhPSBudWxsICYmIGZhdm9yaXRlQmluZGluZ3MubGVuZ3RoID4gMCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYXZvcml0ZUJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7CisJCQkJSW1wb3J0QmluZGluZyBmYXZvcml0ZUJpbmRpbmcgPSBmYXZvcml0ZUJpbmRpbmdzW2ldOworCQkJCXN3aXRjaCAoZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0LmtpbmQoKSkgeworCQkJCQljYXNlIEJpbmRpbmcuRklFTEQ6CisJCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0OworCQkJCQkJZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCisJCQkJCQkJCXRva2VuLAorCQkJCQkJCQluZXcgRmllbGRCaW5kaW5nW117ZmllbGRCaW5kaW5nfSwKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJCQkJZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJaW52b2NhdGlvblNjb3BlKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEJpbmRpbmcuTUVUSE9EOgorCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpIGZhdm9yaXRlQmluZGluZy5yZXNvbHZlZEltcG9ydDsKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5hdmFpbGFibGVNZXRob2RzKCk7CisJCQkJCQlsb25nIHJhbmdlOworCQkJCQkJaWYgKChyYW5nZSA9IFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIG1ldGhvZHMpKSA+PSAwKSB7CisJCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgcmFuZ2UsIGVuZCA9IChpbnQpIChyYW5nZSA+PiAzMik7CisJCQkJCQkJaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIHN0YXJ0LCBtZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbWV0aG9kcyA9IEJpbmRpbmcuTk9fTUVUSE9EUzsKKwkJCQkJCX0KKwkJCQkJCWZpbmRMb2NhbE1ldGhvZHNGcm9tRmF2b3JpdGVzKAorCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJbWV0aG9kcywKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCQkJbWV0aG9kc0ZvdW5kRnJvbUZhdm9yaXRlcywKKwkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCWludm9jYXRpb25TY29wZSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBCaW5kaW5nLlRZUEU6CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgZmF2b3JpdGVCaW5kaW5nLnJlc29sdmVkSW1wb3J0OworCQkJCQkJaWYoZmF2b3JpdGVCaW5kaW5nLm9uRGVtYW5kKSB7CisJCQkJCQkJZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCisJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuYXZhaWxhYmxlRmllbGRzKCksCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJCQkJbG9jYWxzRm91bmQsCisJCQkJCQkJCQlyZWZlcmVuY2VCaW5kaW5nLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUpOworCisJCQkJCQkJZmluZExvY2FsTWV0aG9kc0Zyb21GYXZvcml0ZXMoCisJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuYXZhaWxhYmxlTWV0aG9kcygpLAorCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQltZXRob2RzRm91bmQsCisJCQkJCQkJCQltZXRob2RzRm91bmRGcm9tRmF2b3JpdGVzLAorCQkJCQkJCQkJcmVmZXJlbmNlQmluZGluZywKKwkJCQkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW1ldGhvZHNGb3VuZC5hZGRBbGwobWV0aG9kc0ZvdW5kRnJvbUZhdm9yaXRlcyk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdGaWVsZFR5cGUoCisJCWNoYXJbXSB0b2tlbiwKKwkJU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlib29sZWFuIGluc2lkZVR5cGVBbm5vdGF0aW9uKSB7CisKKwkJYm9vbGVhbiBmb3VuZFNvbWVGaWVsZHMgPSBmYWxzZTsKKworCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKKworCQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQlzd2l0Y2ggKGN1cnJlbnRTY29wZS5raW5kKSB7CisKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsKKwkJCQkJaWYoIWluc2lkZVR5cGVBbm5vdGF0aW9uKSB7CisKKwkJCQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOworCisJCQkJCQlpbnQgZmllbGRzQ291bnQgPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNDb3VudDsgaSsrKSB7CisJCQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gZmllbGRzW2ldOworCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZERlY2xhcmF0aW9uLm5hbWUsIHRva2VuKSkgeworCQkJCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nOworCQkJCQkJCQlpZiAoZmllbGRCaW5kaW5nID09IG51bGwgfHwgZmllbGRCaW5kaW5nLnR5cGUgPT0gbnVsbCAgfHwgKGZpZWxkQmluZGluZy50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQkJCQlmb3VuZFNvbWVGaWVsZHMgPSB0cnVlOworCQkJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tTWlzc2luZ1R5cGUoCisJCQkJCQkJCQkJCWZpZWxkRGVjbGFyYXRpb24udHlwZSwKKwkJCQkJCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCQkJc2NvcGUpOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWluc2lkZVR5cGVBbm5vdGF0aW9uID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmU7CisJCQl9CisJCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OworCQl9CisJCXJldHVybiBmb3VuZFNvbWVGaWVsZHM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdSZXR1cm5UeXBlKAorCQljaGFyW10gdG9rZW4sCisJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gaW5zaWRlVHlwZUFubm90YXRpb24pIHsKKworCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKKworCQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQlzd2l0Y2ggKGN1cnJlbnRTY29wZS5raW5kKSB7CisKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsKKwkJCQkJaWYoIWluc2lkZVR5cGVBbm5vdGF0aW9uKSB7CisKKwkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7CisKKwkJCQkJCWludCBtZXRob2RzQ291bnQgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHNDb3VudDsgaSsrKSB7CisJCQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZHNbaV07CisJCQkJCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yLCB0b2tlbikpIHsKKwkJCQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKKwkJCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kLmJpbmRpbmc7CisJCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwgfHwgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlID09IG51bGwgIHx8IChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJCQkJCUFyZ3VtZW50W10gcGFyYW1ldGVycyA9IG1ldGhvZC5hcmd1bWVudHM7CisJCQkJCQkJCQlpbnQgcGFyYW1ldGVyc0xlbmd0aCA9IHBhcmFtZXRlcnMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQkJCQkJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBhcmd1bWVudHMubGVuZ3RoOworCisJCQkJCQkJCQlpZiAocGFyYW1ldGVyc0xlbmd0aCA9PSAwKSB7CisJCQkJCQkJCQkJaWYgKGFyZ3VtZW50c0xlbmd0aCA9PSAwKSB7CisJCQkJCQkJCQkJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdUeXBlKAorCQkJCQkJCQkJCQkJCW1ldGhvZC5yZXR1cm5UeXBlLAorCQkJCQkJCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCQkJCQlzY29wZSk7CisJCQkJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnNCaW5kaW5nczsKKwkJCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7IC8vIHNpbmNlIG5vIGJpbmRpbmcsIGV4dHJhIHR5cGVzIGZyb20gdHlwZSByZWZlcmVuY2VzCisJCQkJCQkJCQkJCXBhcmFtZXRlcnNCaW5kaW5ncyA9IG5ldyBUeXBlQmluZGluZ1twYXJhbWV0ZXJzTGVuZ3RoXTsKKwkJCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJzTGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkJCQkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJzW2pdLnR5cGUucmVzb2x2ZWRUeXBlOworCQkJCQkJCQkJCQkJaWYgKCFwYXJhbWV0ZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkgJiYgcGFyYW1ldGVyVHlwZS5jbG9zZXN0TWF0Y2goKSAhPSBudWxsKSB7CisJCQkJCQkJCQkJCQkJcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGUuY2xvc2VzdE1hdGNoKCk7CisJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQlwYXJhbWV0ZXJzQmluZGluZ3Nbal0gPSBwYXJhbWV0ZXJUeXBlOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJcGFyYW1ldGVyc0JpbmRpbmdzID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZihhcmVQYXJhbWV0ZXJzQ29tcGF0aWJsZVdpdGgocGFyYW1ldGVyc0JpbmRpbmdzLCBhcmd1bWVudHMsIHBhcmFtZXRlcnNbcGFyYW1ldGVyc0xlbmd0aCAtIDFdLmlzVmFyQXJncygpKSkgeworCQkJCQkJCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21NaXNzaW5nVHlwZSgKKwkJCQkJCQkJCQkJCQltZXRob2QucmV0dXJuVHlwZSwKKwkJCQkJCQkJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQkJCQkJc2NvcGUpOworCQkJCQkJCQkJCQlicmVhayBkb25lOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWluc2lkZVR5cGVBbm5vdGF0aW9uID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmU7CisJCQl9CisJCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbU1pc3NpbmdUeXBlKAorCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmLAorCQkJZmluYWwgU2NvcGUgc2NvcGUsCisJCQlmaW5hbCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCWZpbmFsIFNjb3BlIGludm9jYXRpb25TY29wZSkgeworCQlNaXNzaW5nVHlwZXNHdWVzc2VyIG1pc3NpbmdUeXBlc0NvbnZlcnRlciA9IG5ldyBNaXNzaW5nVHlwZXNHdWVzc2VyKHRoaXMpOworCQlNaXNzaW5nVHlwZXNHdWVzc2VyLkd1ZXNzZWRUeXBlUmVxdWVzdG9yIHN1YnN0aXR1dGlvblJlcXVlc3RvciA9CisJCQluZXcgTWlzc2luZ1R5cGVzR3Vlc3Nlci5HdWVzc2VkVHlwZVJlcXVlc3RvcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY2NlcHQoCisJCQkJCQlUeXBlQmluZGluZyBndWVzc2VkVHlwZSwKKwkJCQkJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCQkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJYm9vbGVhbiBoYXNQcm9ibGVtcykgeworCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcygKKwkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQlndWVzc2VkVHlwZSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlmYWxzZSwKKwkJCQkJCWZhbHNlLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJCWhhc1Byb2JsZW1zLAorCQkJCQkJbnVsbCwKKwkJCQkJCS0xLAorCQkJCQkJLTEpOworCisJCQkJfQorCQkJfTsKKwkJbWlzc2luZ1R5cGVzQ29udmVydGVyLmd1ZXNzKHR5cGVSZWYsIHNjb3BlLCBzdWJzdGl0dXRpb25SZXF1ZXN0b3IpOworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21TdGF0aWNJbXBvcnRzKAorCQkJY2hhcltdIHRva2VuLAorCQkJU2NvcGUgc2NvcGUsCisJCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJCWJvb2xlYW4gZXhhY3RNYXRjaCwKKwkJCWJvb2xlYW4gaW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSwKKwkJCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCisJCQlib29sZWFuIHByb3Bvc2VGaWVsZCwKKwkJCWJvb2xlYW4gcHJvcG9zZU1ldGhvZCkgeworCQkvLyBzZWFyY2ggaW4gc3RhdGljIGltcG9ydAorCQlJbXBvcnRCaW5kaW5nW10gaW1wb3J0QmluZGluZ3MgPSBzY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLmltcG9ydHM7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0QmluZGluZ3MubGVuZ3RoOyBpKyspIHsKKwkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IGltcG9ydEJpbmRpbmdzW2ldOworCQkJaWYoaW1wb3J0QmluZGluZy5pc1ZhbGlkQmluZGluZygpICYmIGltcG9ydEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCUJpbmRpbmcgYmluZGluZyA9IGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQ7CisJCQkJaWYoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlpZihpbXBvcnRCaW5kaW5nLm9uRGVtYW5kKSB7CisJCQkJCQlpZigoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLlRZUEUpICE9IDApIHsKKwkJCQkJCQlpZihwcm9wb3NlRmllbGQpIHsKKwkJCQkJCQkJZmluZEZpZWxkcygKKwkJCQkJCQkJCXRva2VuLAorCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZywKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJZmllbGRzRm91bmQsCisJCQkJCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCS0xLAorCQkJCQkJCQkJLTEpOworCQkJCQkJCX0KKwkJCQkJCQlpZihwcm9wb3NlTWV0aG9kICYmICFpbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlKSB7CisJCQkJCQkJCWZpbmRNZXRob2RzKAorCQkJCQkJCQkJdG9rZW4sCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQlleGFjdE1hdGNoLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCS0xLAorCQkJCQkJCQkJLTEpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLkZJRUxEKSAhPSAwKSB7CisJCQkJCQkJaWYocHJvcG9zZUZpZWxkKSB7CisJCQkJCQkJCQlmaW5kRmllbGRzKAorCQkJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCQkJbmV3IEZpZWxkQmluZGluZ1tdeyhGaWVsZEJpbmRpbmcpYmluZGluZ30sCisJCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCQlmaWVsZHNGb3VuZCwKKwkJCQkJCQkJCQkJbG9jYWxzRm91bmQsCisJCQkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQkJCSgoRmllbGRCaW5kaW5nKWJpbmRpbmcpLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQkJCS0xLAorCQkJCQkJCQkJCQktMSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLk1FVEhPRCkgIT0gMCkgeworCQkJCQkJCWlmKHByb3Bvc2VNZXRob2QgJiYgIWluc2lkZUFubm90YXRpb25BdHRyaWJ1dGUpIHsKKwkJCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsKKwkJCQkJCQkJaWYgKChleGFjdE1hdGNoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHRva2VuLCBtZXRob2RCaW5kaW5nLnNlbGVjdG9yKSkgfHwKKwkJCQkJCQkJCQkhZXhhY3RNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbWV0aG9kQmluZGluZy5zZWxlY3RvcikgfHwKKwkJCQkJCQkJCQkodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godG9rZW4sIG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpKSkgeworCQkJCQkJCQkJZmluZExvY2FsTWV0aG9kc0Zyb21TdGF0aWNJbXBvcnRzKAorCQkJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRNZXRob2RzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpLAorCQkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJCQkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQkJCQkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkc0Zyb21GYXZvcml0ZXMoCisJCQljaGFyW10gZmllbGROYW1lLAorCQkJRmllbGRCaW5kaW5nW10gZmllbGRzLAorCQkJU2NvcGUgc2NvcGUsCisJCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQsCisJCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQsCisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlKSB7CisKKwkJY2hhcltdIHR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHJlY2VpdmVyVHlwZS5jb21wb3VuZE5hbWUsICcuJyk7CisKKwkJaW50IGZpZWxkTGVuZ3RoID0gZmllbGROYW1lLmxlbmd0aDsKKwkJbmV4dCA6IGZvciAoaW50IGYgPSBmaWVsZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKwkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tmXTsKKworCQkJaWYgKGZpZWxkLmlzU3ludGhldGljKCkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCS8vIG9ubHkgc3RhdGljIGZpZWxkcyBtdXN0IGJlIHByb3Bvc2VkCisJCQlpZiAoIWZpZWxkLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCisJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2goZmllbGROYW1lLCBmaWVsZC5uYW1lKSkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgorCQkJCQlmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCisJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGZpZWxkLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCSYmICFmaWVsZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWZvciAoaW50IGkgPSBmaWVsZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKKwkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSlmaWVsZHNGb3VuZC5lbGVtZW50QXQoaSk7CisJCQkJRmllbGRCaW5kaW5nIG90aGVyRmllbGQgPSAoRmllbGRCaW5kaW5nKSBvdGhlclswXTsKKworCQkJCWlmIChmaWVsZCA9PSBvdGhlckZpZWxkKSBjb250aW51ZSBuZXh0OworCQkJfQorCisJCQlmaWVsZHNGb3VuZC5hZGQobmV3IE9iamVjdFtde2ZpZWxkLCByZWNlaXZlclR5cGV9KTsKKworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChmaWVsZCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhmaWVsZE5hbWUsIGZpZWxkLm5hbWUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGZpZWxkLnR5cGUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtQ29uc3RhbnQoZmllbGQudHlwZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclN0YXRpYyh0cnVlLCB0cnVlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGN1ID0gdGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCWludCBpbXBvcnRTdGFydCA9IGN1LnR5cGVzWzBdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCQlpbnQgaW1wb3J0RW5kID0gaW1wb3J0U3RhcnQ7CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCisJCQlpZiAodGhpcy5jb21waWxlck9wdGlvbnMuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSB8fAorCQkJCQkhdGhpcy5vcHRpb25zLnN1Z2dlc3RTdGF0aWNJbXBvcnQpIHsKKwkJCQlpZiAoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX0lNUE9SVCkpIHsKKwkJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZWNlaXZlclR5cGUuc291cmNlTmFtZSwgZmllbGQubmFtZSwgJy4nKTsKKworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisKKwkJCQkJY2hhcltdIHR5cGVJbXBvcnRDb21wbGV0aW9uID0gY3JlYXRlSW1wb3J0Q2hhckFycmF5KHR5cGVOYW1lLCBmYWxzZSwgZmFsc2UpOworCisJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHR5cGVJbXBvcnRQcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX0lNUE9SVCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7CisJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKKwkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gcmVjZWl2ZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7CisJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOworCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0VHlwZU5hbWUocmVjZWl2ZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVJbXBvcnRDb21wbGV0aW9uKTsKKwkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldEZsYWdzKHJlY2VpdmVyVHlwZS5tb2RpZmllcnMpOworCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0QWRkaXRpb25hbEZsYWdzKENvbXBsZXRpb25GbGFncy5EZWZhdWx0KTsKKwkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRUb2tlblJhbmdlKGltcG9ydFN0YXJ0IC0gdGhpcy5vZmZzZXQsIGltcG9ydEVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCisJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlSW1wb3J0UHJvcG9zYWx9KTsKKworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQlpZihERUJVRykgeworCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCF0aGlzLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfSU1QT1JUKSkgeworCQkJCQljaGFyW10gY29tcGxldGlvbiA9IGZpZWxkLm5hbWU7CisKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQuZGVjbGFyaW5nQ2xhc3MpKTsKKwkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC50eXBlKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOworCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhmaWVsZC5tb2RpZmllcnMpOworCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCisJCQkJCWNoYXJbXSBmaWVsZEltcG9ydENvbXBsZXRpb24gPSBjcmVhdGVJbXBvcnRDaGFyQXJyYXkoQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsIGZpZWxkLm5hbWUsICcuJyksIHRydWUsIGZhbHNlKTsKKworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBmaWVsZEltcG9ydFByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX0lNUE9SVCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQudHlwZSkpOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0VHlwZU5hbWUoZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldE5hbWUoZmllbGQubmFtZSk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0Q29tcGxldGlvbihmaWVsZEltcG9ydENvbXBsZXRpb24pOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0QWRkaXRpb25hbEZsYWdzKENvbXBsZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpOworCQkJCQlmaWVsZEltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0VG9rZW5SYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCWZpZWxkSW1wb3J0UHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisKKwkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMobmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde2ZpZWxkSW1wb3J0UHJvcG9zYWx9KTsKKworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQlpZihERUJVRykgeworCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgZmluZEltcGxpY2l0TWVzc2FnZVNlbmRzKAorCQljaGFyW10gdG9rZW4sCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCisJCVNjb3BlIHNjb3BlLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kKSB7CisKKwkJaWYgKHRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJYm9vbGVhbiBzdGF0aWNzT25seSA9IGZhbHNlOworCQkvLyBuZWVkIHRvIGtub3cgaWYgd2UncmUgaW4gYSBzdGF0aWMgY29udGV4dCAob3IgaW5zaWRlIGEgY29uc3RydWN0b3IpCisKKwkJZG9uZSA6IHdoaWxlICh0cnVlKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKKworCQkJc3dpdGNoIChzY29wZS5raW5kKSB7CisKKwkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6CisJCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpCisJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsKKwkJCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIHNjb3BlOworCQkJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCQkJCWZpbmRNZXRob2RzKAorCQkJCQkJdG9rZW4sCisJCQkJCQludWxsLAorCQkJCQkJYXJnVHlwZXMsCisJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJY2xhc3NTY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCXN0YXRpY3NPbmx5LAorCQkJCQkJdHJ1ZSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCWZhbHNlLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCW51bGwsCisJCQkJCQludWxsLAorCQkJCQkJbnVsbCwKKwkJCQkJCWZhbHNlLAorCQkJCQkJbnVsbCwKKwkJCQkJCS0xLAorCQkJCQkJLTEpOworCQkJCQlzdGF0aWNzT25seSB8PSBlbmNsb3NpbmdUeXBlLmlzU3RhdGljKCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoKKwkJCQkJYnJlYWsgZG9uZTsKKwkJCX0KKwkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQl9CisJfQorCXByaXZhdGUgdm9pZCBmaW5kSW1wb3J0cyhDb21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlLCBib29sZWFuIGZpbmRNZW1iZXJzKSB7CisJCWNoYXJbXVtdIHRva2VucyA9IGltcG9ydFJlZmVyZW5jZS50b2tlbnM7CisKKwkJY2hhcltdIGltcG9ydE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpOworCisJCWlmIChpbXBvcnROYW1lLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCisJCWNoYXJbXSBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdOworCQlpZihsYXN0VG9rZW4gIT0gbnVsbCAmJiBsYXN0VG9rZW4ubGVuZ3RoID09IDApCisJCQlpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoaW1wb3J0TmFtZSwgbmV3IGNoYXJbXXsnLid9KTsKKworCQl0aGlzLnJlc29sdmluZ0ltcG9ydHMgPSB0cnVlOworCQl0aGlzLnJlc29sdmluZ1N0YXRpY0ltcG9ydHMgPSBpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKTsKKworCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiA9ICBsYXN0VG9rZW47CisJCXRoaXMucXVhbGlmaWVkQ29tcGxldGlvblRva2VuID0gaW1wb3J0TmFtZTsKKworCQkvLyB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIC4qOworCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKKwkJCWludCBvbGRTdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJCWludCBvbGRFbmQgPSB0aGlzLmVuZFBvc2l0aW9uOworCQkJc2V0U291cmNlUmFuZ2UoCisJCQkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAorCQkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMoaW1wb3J0TmFtZSwgdGhpcyk7CisJCQlzZXRTb3VyY2VSYW5nZSgKKwkJCQlvbGRTdGFydCwKKwkJCQlvbGRFbmQgLSAxLAorCQkJCWZhbHNlKTsKKwkJfQorCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCXRoaXMuZm91bmRUeXBlc0NvdW50ID0gMDsKKwkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlcygKKwkJCQkJaW1wb3J0TmFtZSwKKwkJCQkJZmluZE1lbWJlcnMsCisJCQkJCXRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCwKKwkJCQkJSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5tb25pdG9yKTsKKwkJCWFjY2VwdFR5cGVzKG51bGwpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzT2ZNZW1iZXJUeXBlcyhjaGFyW10gdHlwZU5hbWUsCVJlZmVyZW5jZUJpbmRpbmcgcmVmLCBib29sZWFuIG9ubHlTdGF0aWMpIHsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gcmVmLm1lbWJlclR5cGVzKCk7CisKKwkJaW50IHR5cGVMZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7CisJCW5leHQgOiBmb3IgKGludCBtID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW21dOworCQkJLy8JCWlmICghd2FudENsYXNzZXMgJiYgbWVtYmVyVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkvLwkJaWYgKCF3YW50SW50ZXJmYWNlcyAmJiBtZW1iZXJUeXBlLmlzSW50ZXJmYWNlKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChvbmx5U3RhdGljICYmICFtZW1iZXJUeXBlLmlzU3RhdGljKCkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKHR5cGVMZW5ndGggPiBtZW1iZXJUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSwgZmFsc2UvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0eXBlTmFtZSwgbWVtYmVyVHlwZS5zb3VyY2VOYW1lKSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmIG1lbWJlclR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKKwkJCQkmJiAhbWVtYmVyVHlwZS5jYW5CZVNlZW5CeSh0aGlzLnVuaXRTY29wZS5mUGFja2FnZSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobWVtYmVyVHlwZS5zb3VyY2VOYW1lLCBTRU1JQ09MT04pOworCisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0eXBlTmFtZSwgbWVtYmVyVHlwZS5zb3VyY2VOYW1lKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCWlmIChtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCX0gZWxzZSBpZihtZW1iZXJUeXBlLmlzRW51bSgpKSB7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtKCk7CisJCQl9IGVsc2UgaWYgKG1lbWJlclR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQl9CisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCWNyZWF0ZVR5cGVQcm9wb3NhbCgKKwkJCQkJCW1lbWJlclR5cGUsCisJCQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJCUlBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSwKKwkJCQkJCWNvbXBsZXRpb25OYW1lLAorCQkJCQkJcmVsZXZhbmNlLAorCQkJCQkJbnVsbCwKKwkJCQkJCW51bGwsCisJCQkJCQludWxsLAorCQkJCQkJZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRJbXBvcnRzT2ZTdGF0aWNGaWVsZHMoY2hhcltdIGZpZWxkTmFtZSwgUmVmZXJlbmNlQmluZGluZyByZWYpIHsKKwkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gcmVmLmF2YWlsYWJsZUZpZWxkcygpOworCisJCWludCBmaWVsZExlbmd0aCA9IGZpZWxkTmFtZS5sZW5ndGg7CisJCW5leHQgOiBmb3IgKGludCBtID0gZmllbGRzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbbV07CisKKwkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChmaWVsZC5pc1N5bnRoZXRpYygpKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICghZmllbGQuaXNTdGF0aWMoKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKGZpZWxkTmFtZSwgZmllbGQubmFtZSkpKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJiBmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCSYmICFmaWVsZC5jYW5CZVNlZW5CeSh0aGlzLnVuaXRTY29wZS5mUGFja2FnZSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZmllbGQubmFtZSwgU0VNSUNPTE9OKTsKKworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoZmllbGROYW1lLCBmaWVsZC5uYW1lKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKSkgeworCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUoZmllbGQuZGVjbGFyaW5nQ2xhc3MpKTsKKwkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKGZpZWxkLnR5cGUpKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUoZmllbGQuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShmaWVsZC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKGZpZWxkLnR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXROYW1lKGZpZWxkLm5hbWUpOworCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOworCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZpZWxkLm1vZGlmaWVycyk7CisJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQlpZihERUJVRykgeworCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kSW1wb3J0c09mU3RhdGljTWV0aG9kcyhjaGFyW10gbWV0aG9kTmFtZSwgUmVmZXJlbmNlQmluZGluZyByZWYpIHsKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSByZWYuYXZhaWxhYmxlTWV0aG9kcygpOworCisJCWludCBtZXRob2RMZW5ndGggPSBtZXRob2ROYW1lLmxlbmd0aDsKKwkJbmV4dCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbbV07CisKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKCFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmIG1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCSYmICFtZXRob2QuY2FuQmVTZWVuQnkodGhpcy51bml0U2NvcGUuZlBhY2thZ2UpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kTGVuZ3RoID4gbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpbnQgbGVuZ3RoID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IG1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV07CisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMobWV0aG9kLHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KG1ldGhvZC5zZWxlY3RvciwgU0VNSUNPTE9OKTsKKworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX05BTUVfUkVGRVJFTkNFKSkgeworCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfTkFNRV9SRUZFUkVOQ0UsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOworCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOworCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1ldGhvZC5tb2RpZmllcnMpOworCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCWlmKERFQlVHKSB7CisJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBmaW5kSW50ZXJmYWNlc01ldGhvZERlY2xhcmF0aW9ucygKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgeworCisJCWlmIChzZWxlY3RvciA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOworCQkJaW50IG5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKKwkJCQlpZihtZXRob2RzICE9IG51bGwpIHsKKwkJCQkJZmluZExvY2FsTWV0aG9kRGVjbGFyYXRpb25zKAorCQkJCQkJc2VsZWN0b3IsCisJCQkJCQltZXRob2RzLAorCQkJCQkJc2NvcGUsCisJCQkJCQltZXRob2RzRm91bmQsCisJCQkJCQlmYWxzZSwKKwkJCQkJCXJlY2VpdmVyVHlwZSk7CisJCQkJfQorCisJCQkJaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IG51bGwgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgeworCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKKwkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07CisJCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQorCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgZmluZEludGVyZmFjZXNNZXRob2RzKAorCQljaGFyW10gc2VsZWN0b3IsCisJCVR5cGVCaW5kaW5nW10gdHlwZUFyZ1R5cGVzLAorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsLAorCQlib29sZWFuIHN1cGVyQ2FsbCwKKwkJYm9vbGVhbiBjYW5CZVByZWZpeGVkLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJY2hhcltdIGNhc3RlZFJlY2VpdmVyLAorCQlpbnQgcmVjZWl2ZXJTdGFydCwKKwkJaW50IHJlY2VpdmVyRW5kKSB7CisKKwkJaWYgKHNlbGVjdG9yID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzVG9WaXNpdCA9IGl0c0ludGVyZmFjZXM7CisJCQlpbnQgbmV4dFBvc2l0aW9uID0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOworCQkJCWlmKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCQlmaW5kTG9jYWxNZXRob2RzKAorCQkJCQkJc2VsZWN0b3IsCisJCQkJCQl0eXBlQXJnVHlwZXMsCisJCQkJCQlhcmdUeXBlcywKKwkJCQkJCW1ldGhvZHMsCisJCQkJCQlzY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJaW1wbGljaXRDYWxsLAorCQkJCQkJc3VwZXJDYWxsLAorCQkJCQkJY2FuQmVQcmVmaXhlZCwKKwkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCW1pc3NpbmdFbGVtZW50c3NTdGFydHMsCisJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQkJCQkJY2FzdGVkUmVjZWl2ZXIsCisJCQkJCQlyZWNlaXZlclN0YXJ0LAorCQkJCQkJcmVjZWl2ZXJFbmQpOworCQkJCX0KKworCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBudWxsICYmIGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCQkJaW50IGl0c0xlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOworCQkJCQlpZiAobmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoID49IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoICsgNV0sIDAsIG5leHRQb3NpdGlvbik7CisJCQkJCW5leHRJbnRlcmZhY2UgOiBmb3IgKGludCBhID0gMDsgYSA8IGl0c0xlbmd0aDsgYSsrKSB7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG5leHQgPSBpdHNJbnRlcmZhY2VzW2FdOworCQkJCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBuZXh0UG9zaXRpb247IGIrKykKKwkJCQkJCQlpZiAobmV4dCA9PSBpbnRlcmZhY2VzVG9WaXNpdFtiXSkgY29udGludWUgbmV4dEludGVyZmFjZTsKKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W25leHRQb3NpdGlvbisrXSA9IG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBGaW5kIGphdmFkb2MgYmxvY2sgdGFncyBmb3IgYSBnaXZlbiBjb21wbGV0aW9uIGphdmFkb2MgdGFnIG5vZGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZmluZEphdmFkb2NCbG9ja1RhZ3MoQ29tcGxldGlvbk9uSmF2YWRvY1RhZyBqYXZhZG9jVGFnKSB7CisJCWNoYXJbXVtdIHBvc3NpYmxlVGFncyA9IGphdmFkb2NUYWcuZ2V0UG9zc2libGVCbG9ja1RhZ3MoKTsKKwkJaWYgKHBvc3NpYmxlVGFncyA9PSBudWxsKSByZXR1cm47CisJCWludCBsZW5ndGggPSBwb3NzaWJsZVRhZ3MubGVuZ3RoOworCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcnMKKworCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19CTE9DS19UQUcpKSB7CisJCQkJY2hhcltdIHBvc3NpYmxlVGFnID0gcG9zc2libGVUYWdzW2ldOworCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0JMT0NLX1RBRywgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCXByb3Bvc2FsLnNldE5hbWUocG9zc2libGVUYWcpOworCQkJCWludCB0YWdMZW5ndGggPSBwb3NzaWJsZVRhZy5sZW5ndGg7CisJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBuZXcgY2hhclsxK3RhZ0xlbmd0aF07CisJCQkJY29tcGxldGlvblswXSA9ICdAJzsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3NpYmxlVGFnLCAwLCBjb21wbGV0aW9uLCAxLCB0YWdMZW5ndGgpOworCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQlpZiAoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEZpbmQgamF2YWRvYyBpbmxpbmUgdGFncyBmb3IgYSBnaXZlbiBjb21wbGV0aW9uIGphdmFkb2MgdGFnIG5vZGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZmluZEphdmFkb2NJbmxpbmVUYWdzKENvbXBsZXRpb25PbkphdmFkb2NUYWcgamF2YWRvY1RhZykgeworCQljaGFyW11bXSBwb3NzaWJsZVRhZ3MgPSBqYXZhZG9jVGFnLmdldFBvc3NpYmxlSW5saW5lVGFncygpOworCQlpZiAocG9zc2libGVUYWdzID09IG51bGwpIHJldHVybjsKKwkJaW50IGxlbmd0aCA9IHBvc3NpYmxlVGFncy5sZW5ndGg7CisJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3Iga2V5d29ycworCisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0lOTElORV9UQUcpKSB7CisJCQkJY2hhcltdIHBvc3NpYmxlVGFnID0gcG9zc2libGVUYWdzW2ldOworCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0lOTElORV9UQUcsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlwcm9wb3NhbC5zZXROYW1lKHBvc3NpYmxlVGFnKTsKKwkJCQlpbnQgdGFnTGVuZ3RoID0gcG9zc2libGVUYWcubGVuZ3RoOworLy8JCQkJYm9vbGVhbiBpbmxpbmVUYWdTdGFydGVkID0gamF2YWRvY1RhZy5jb21wbGV0ZUlubGluZVRhZ1N0YXJ0ZWQoKTsKKwkJCQljaGFyW10gY29tcGxldGlvbiA9IG5ldyBjaGFyWzIrdGFnTGVuZ3RoKzFdOworCQkJCWNvbXBsZXRpb25bMF0gPSAneyc7CisJCQkJY29tcGxldGlvblsxXSA9ICdAJzsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3NpYmxlVGFnLCAwLCBjb21wbGV0aW9uLCAyLCB0YWdMZW5ndGgpOworCQkJCS8vIGRvIG5vdCBhZGQgc3BhY2UgYXQgZW5kIG9mIGlubGluZSB0YWcgKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTAyNikKKwkJCQkvL2NvbXBsZXRpb25bdGFnTGVuZ3RoKzJdID0gJyAnOworCQkJCWNvbXBsZXRpb25bdGFnTGVuZ3RoKzJdID0gJ30nOworCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQlpZiAoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEZpbmQgamF2YWRvYyBwYXJhbWV0ZXIgbmFtZXMuCisJICovCisJcHJpdmF0ZSB2b2lkIGZpbmRKYXZhZG9jUGFyYW1OYW1lcyhjaGFyW10gdG9rZW4sIGNoYXJbXVtdIG1pc3NpbmdQYXJhbXMsIGJvb2xlYW4gaXNUeXBlUGFyYW0pIHsKKworCQlpZiAobWlzc2luZ1BhcmFtcyA9PSBudWxsKSByZXR1cm47CisKKwkJLy8gR2V0IHJlbGV2YW5jZQorCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgcGFyYW0gbmFtZQorCQlpZiAoIWlzVHlwZVBhcmFtKSByZWxldmFuY2UgKz0gUl9JTlRFUkVTVElORzsKKworCQkvLyBQcm9wb3NlIG1pc3NpbmcgcGFyYW0KKwkJaW50IGxlbmd0aCA9IG1pc3NpbmdQYXJhbXMubGVuZ3RoOworCQlyZWxldmFuY2UgKz0gbGVuZ3RoOworCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCWNoYXJbXSBhcmdOYW1lID0gbWlzc2luZ1BhcmFtc1tpXTsKKwkJCWlmICh0b2tlbiA9PSBudWxsIHx8IENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBhcmdOYW1lKSkgeworCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfUEFSQU1fUkVGKSkgeworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19QQVJBTV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0TmFtZShhcmdOYW1lKTsKKwkJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBpc1R5cGVQYXJhbSA/IENoYXJPcGVyYXRpb24uY29uY2F0KCc8JywgYXJnTmFtZSwgJz4nKSA6IGFyZ05hbWU7CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKC0tcmVsZXZhbmNlKTsKKwkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJaWYgKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gd2hhdCBhYm91dCBvbkRlbWFuZCB0eXBlcz8gSWdub3JlIHRoZW0gc2luY2UgaXQgZG9lcyBub3QgaGFwcGVuIQorCS8vIGltcG9ydCBwMS5wMi5BLio7CisJcHJpdmF0ZSB2b2lkIGZpbmRLZXl3b3JkcyhjaGFyW10ga2V5d29yZCwgY2hhcltdW10gY2hvaWNlcywgYm9vbGVhbiBjYW5Db21wbGV0ZUVtcHR5VG9rZW4sIGJvb2xlYW4gc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSkgeworCQlpZihjaG9pY2VzID09IG51bGwgfHwgY2hvaWNlcy5sZW5ndGggPT0gMCkgcmV0dXJuOworCisJCWludCBsZW5ndGggPSBrZXl3b3JkLmxlbmd0aDsKKwkJaWYgKGNhbkNvbXBsZXRlRW1wdHlUb2tlbiB8fCBsZW5ndGggPiAwKQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQorCQkJCWlmIChsZW5ndGggPD0gY2hvaWNlc1tpXS5sZW5ndGgKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoa2V5d29yZCwgY2hvaWNlc1tpXSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KKwkJCQkpKXsKKwkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoa2V5d29yZCwgY2hvaWNlc1tpXSk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3Iga2V5d29yZHMKKwkJCQkJaWYgKHN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHkgJiYgdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHJlbGV2YW5jZSArPSBSX05PTl9JTkhFUklURUQ7CisKKwkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2hvaWNlc1tpXSwgS2V5d29yZHMuVFJVRSkgfHwgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2hvaWNlc1tpXSwgS2V5d29yZHMuRkFMU0UpKSB7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOworCQkJCQl9CisJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldE5hbWUoY2hvaWNlc1tpXSk7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNob2ljZXNbaV0pOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRLZXl3b3Jkc0Zvck1lbWJlcihjaGFyW10gdG9rZW4sIGludCBtb2RpZmllcnMpIHsKKwkJY2hhcltdW10ga2V5d29yZHMgPSBuZXcgY2hhcltLZXl3b3Jkcy5DT1VOVF1bXTsKKwkJaW50IGNvdW50ID0gMDsKKworCQkvLyB2aXNpYmlsaXR5CisJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgPT0gMAorCQkJJiYgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQpID09IDAKKwkJCSYmIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSA9PSAwKSB7CisJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlBST1RFQ1RFRDsKKwkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFVCTElDOworCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFJJVkFURTsKKwkJCX0KKwkJfQorCisJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpID09IDApIHsKKwkJCS8vIGFidHJhY3QKKwkJCWlmKChtb2RpZmllcnMgJiB+KEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0sgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSkgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuQUJTVFJBQ1Q7CisJCQl9CisKKwkJCS8vIGZpbmFsCisJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSA9PSAwKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5GSU5BTDsKKwkJCX0KKworCQkJLy8gc3RhdGljCisJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuU1RBVElDOworCQkJfQorCisJCQlib29sZWFuIGNhbkJlRmllbGQgPSB0cnVlOworCQkJYm9vbGVhbiBjYW5CZU1ldGhvZCA9IHRydWU7CisJCQlib29sZWFuIGNhbkJlVHlwZSA9IHRydWU7CisJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSkgIT0gMAorCQkJCXx8IChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnApICE9IDAKKwkJCQl8fCAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCkgIT0gMCkgeworCQkJCWNhbkJlRmllbGQgPSBmYWxzZTsKKwkJCQljYW5CZVR5cGUgPSBmYWxzZTsKKwkJCX0KKworCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NUcmFuc2llbnQpICE9IDAKKwkJCQl8fCAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ZvbGF0aWxlKSAhPSAwKSB7CisJCQkJY2FuQmVNZXRob2QgPSBmYWxzZTsKKwkJCQljYW5CZVR5cGUgPSBmYWxzZTsKKwkJCX0KKworCQkJaWYoY2FuQmVGaWVsZCkgeworCQkJCS8vIHRyYW5zaWVudAorCQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVHJhbnNpZW50KSA9PSAwKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuVFJBTlNJRU5UOworCQkJCX0KKworCQkJCS8vIHZvbGF0aWxlCisJCQkJaWYoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NWb2xhdGlsZSkgPT0gMCkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlZPTEFUSUxFOworCQkJCX0KKwkJCX0KKworCQkJaWYoY2FuQmVNZXRob2QpIHsKKwkJCQkvLyBuYXRpdmUKKwkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSkgPT0gMCkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLk5BVElWRTsKKwkJCQl9CisKKwkJCQkvLyBzdHJpY3RmcAorCQkJCWlmKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnApID09IDApIHsKKwkJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5TVFJJQ1RGUDsKKwkJCQl9CisKKwkJCQkvLyBzeW5jaHJvbml6ZWQKKwkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCkgPT0gMCkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlNZTkNIUk9OSVpFRDsKKwkJCQl9CisJCQl9CisKKwkJCWlmKGNhbkJlVHlwZSkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuQ0xBU1M7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5JTlRFUkZBQ0U7CisKKwkJCQlpZigobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSA9PSAwKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuRU5VTTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBjbGFzcworCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5DTEFTUzsKKwkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuSU5URVJGQUNFOworCQl9CisJCVN5c3RlbS5hcnJheWNvcHkoa2V5d29yZHMsIDAsIGtleXdvcmRzID0gbmV3IGNoYXJbY291bnRdW10sIDAsIGNvdW50KTsKKworCQlmaW5kS2V5d29yZHModG9rZW4sIGtleXdvcmRzLCBmYWxzZSwgZmFsc2UpOworCX0KKwlwcml2YXRlIHZvaWQgZmluZExhYmVscyhjaGFyW10gbGFiZWwsIGNoYXJbXVtdIGNob2ljZXMpIHsKKwkJaWYoY2hvaWNlcyA9PSBudWxsIHx8IGNob2ljZXMubGVuZ3RoID09IDApIHJldHVybjsKKworCQlpbnQgbGVuZ3RoID0gbGFiZWwubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChsZW5ndGggPD0gY2hvaWNlc1tpXS5sZW5ndGgKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhsYWJlbCwgY2hvaWNlc1tpXSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KKwkJCSkpeworCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGxhYmVsLCBjaG9pY2VzW2ldKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcnMKKworCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxBQkVMX1JFRikpIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkxBQkVMX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXROYW1lKGNob2ljZXNbaV0pOworCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNob2ljZXNbaV0pOworCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQlpZihERUJVRykgeworCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIEhlbHBlciBtZXRob2QgZm9yIGZpbmRNZXRob2RzKGNoYXJbXSwgTWV0aG9kQmluZGluZ1tdLCBTY29wZSwgT2JqZWN0VmVjdG9yLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuLCBUeXBlQmluZGluZykKKwlwcml2YXRlIHZvaWQgZmluZExvY2FsTWV0aG9kRGVjbGFyYXRpb25zKAorCQljaGFyW10gbWV0aG9kTmFtZSwKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQkvLwlib29sZWFuIG5vVm9pZFJldHVyblR5cGUsIGhvdyBkbyB5b3Uga25vdz8KKwkJYm9vbGVhbiBleGFjdE1hdGNoLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCisJCU9iamVjdFZlY3RvciBuZXdNZXRob2RzRm91bmQgPSAgbmV3IE9iamVjdFZlY3RvcigpOworCQkvLyBJbmhlcml0ZWQgbWV0aG9kcyB3aGljaCBhcmUgaGlkZGVuIGJ5IHN1YmNsYXNzZXMgYXJlIGZpbHRlcmVkIG91dAorCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKKwkJaW50IG1ldGhvZExlbmd0aCA9IG1ldGhvZE5hbWUubGVuZ3RoOworCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKworCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ZdOworCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKQljb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgeworICAgICAgICAgICAgICAgIG5ld01ldGhvZHNGb3VuZC5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZSBuZXh0OworICAgICAgICAgICAgfQorCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKKwkJCQkJbWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKKwkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQkvLwkJaWYgKG5vVm9pZFJldHVyblR5cGUgJiYgbWV0aG9kLnJldHVyblR5cGUgPT0gQmFzZVR5cGVzLlZvaWRCaW5kaW5nKSBjb250aW51ZSBuZXh0OworCQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICghbWV0aG9kLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgRmFrZUludm9jYXRpb25TaXRlICwgc2NvcGUpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoZXhhY3RNYXRjaCkgeworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLworCQkJCQkpKQorCQkJCQljb250aW51ZSBuZXh0OworCisJCQl9IGVsc2UgeworCisJCQkJaWYgKG1ldGhvZExlbmd0aCA+IG1ldGhvZC5zZWxlY3Rvci5sZW5ndGgpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3RvciwgZmFsc2UvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKSkpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQl9CisKKwkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJTWV0aG9kQmluZGluZyBvdGhlck1ldGhvZCA9IChNZXRob2RCaW5kaW5nKSBtZXRob2RzRm91bmQuZWxlbWVudEF0KGkpOworCQkJCWlmIChtZXRob2QgPT0gb3RoZXJNZXRob2QpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBvdGhlck1ldGhvZC5zZWxlY3RvciwgdHJ1ZSkKKwkJCQkJCSYmIHRoaXMubG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5pc01ldGhvZFN1YnNpZ25hdHVyZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKwkJCX0KKworCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChtZXRob2QpOworCisJCQlpbnQgbGVuZ3RoID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJY2hhcltdW10gcGFyYW1ldGVyRnVsbFR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1tpXTsKKwkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7CisJCQkJcGFyYW1ldGVyRnVsbFR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCisJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhtZXRob2QsIHBhcmFtZXRlckZ1bGxUeXBlTmFtZXMpOworCisJCQlpZihtZXRob2QudHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIG1ldGhvZC50eXBlVmFyaWFibGVzLmxlbmd0aCA+IDApIHsKKwkJCQljaGFyW11bXSBleGNsdWRlZE5hbWVzID0gZmluZEVuY2xvc2luZ1R5cGVOYW1lcyhzY29wZSk7CisJCQkJY2hhcltdW10gc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lcyhtZXRob2QudHlwZVZhcmlhYmxlcywgZXhjbHVkZWROYW1lcyk7CisJCQkJaWYoc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKKwkJCQkJbWV0aG9kID0gbmV3IFBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nKAorCQkJCQkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJCW1ldGhvZCwKKwkJCQkJCQkJc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzLAorCQkJCQkJCQlzY29wZS5lbnZpcm9ubWVudCgpKTsKKwkJCQl9CisJCQl9CisKKwkJCVN0cmluZ0J1ZmZlciBjb21wbGV0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJCQlpZiAoIWV4YWN0TWF0Y2gpIHsKKwkJCQljcmVhdGVNZXRob2QobWV0aG9kLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlckZ1bGxUeXBlTmFtZXMsIHBhcmFtZXRlck5hbWVzLCBzY29wZSwgY29tcGxldGlvbik7CisJCQl9CisKKwkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3Rvcik7CisJCQlyZWxldmFuY2UgKz0gUl9NRVRIT0RfT1ZFUklERTsKKwkJCWlmKG1ldGhvZC5pc0Fic3RyYWN0KCkpIHJlbGV2YW5jZSArPSBSX0FCU1RSQUNUX01FVEhPRDsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7CisKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OKSkgeworCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04sIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25LZXkobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmNvbXB1dGVVbmlxdWVLZXkoKSk7CisJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKKwkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJaWYob3JpZ2luYWwgIT0gbWV0aG9kKSB7CisJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCX0KKwkJCQlwcm9wb3NhbC5zZXRLZXkobWV0aG9kLmNvbXB1dGVVbmlxdWVLZXkoKSk7CisJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKKwkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyRnVsbFR5cGVOYW1lcyk7CisJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKTsKKwkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJaWYoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbWV0aG9kc0ZvdW5kLmFkZEFsbChuZXdNZXRob2RzRm91bmQpOworCX0KKworCS8vIEhlbHBlciBtZXRob2QgZm9yIGZpbmRNZXRob2RzKGNoYXJbXSwgVHlwZUJpbmRpbmdbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUsIE9iamVjdFZlY3RvciwgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKKwlwcml2YXRlIHZvaWQgZmluZExvY2FsTWV0aG9kcygKKwkJY2hhcltdIG1ldGhvZE5hbWUsCisJCVR5cGVCaW5kaW5nW10gdHlwZUFyZ1R5cGVzLAorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywKKwkJU2NvcGUgc2NvcGUsCisJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCisJCWJvb2xlYW4gb25seVN0YXRpY01ldGhvZHMsCisJCWJvb2xlYW4gZXhhY3RNYXRjaCwKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsLAorCQlib29sZWFuIHN1cGVyQ2FsbCwKKwkJYm9vbGVhbiBjYW5CZVByZWZpeGVkLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQljaGFyW10gY2FzdGVkUmVjZWl2ZXIsCisJCWludCByZWNlaXZlclN0YXJ0LAorCQlpbnQgcmVjZWl2ZXJFbmQpIHsKKworCQlPYmplY3RWZWN0b3IgbmV3TWV0aG9kc0ZvdW5kID0gIG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisKKwkJaW50IG1ldGhvZExlbmd0aCA9IG1ldGhvZE5hbWUubGVuZ3RoOworCQlpbnQgbWluVHlwZUFyZ0xlbmd0aCA9IHR5cGVBcmdUeXBlcyA9PSBudWxsID8gMCA6IHR5cGVBcmdUeXBlcy5sZW5ndGg7CisJCWludCBtaW5BcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsKKworCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKKworCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKKwkJCQkJbWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKKwkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQkvL1RPRE8gKGRhdmlkKSBwZXJoYXBzIHRoZSByZWxldmFuY2Ugb2YgYSB2b2lkIG1ldGhvZCBtdXN0IGJlIGxlc3NlciB0aGFuIG90aGVyIG1ldGhvZHMKKwkJCS8vaWYgKGV4cGVjdGVkVHlwZXNQdHIgPiAtMSAmJiBtZXRob2QucmV0dXJuVHlwZSA9PSBCYXNlVHlwZXMuVm9pZEJpbmRpbmcpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiAhbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5CisJCQkJJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmKHN1cGVyQ2FsbCAmJiBtZXRob2QuaXNBYnN0cmFjdCgpKSB7CisJCQkJbWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKKwkJCQljb250aW51ZSBuZXh0OworCQkJfQorCisJCQlpZiAoZXhhY3RNYXRjaCkgeworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykpIHsKKwkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChtZXRob2RMZW5ndGggPiBtZXRob2Quc2VsZWN0b3IubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLykKKwkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKSkpIHsKKwkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtaW5UeXBlQXJnTGVuZ3RoICE9IDAgJiYgbWluVHlwZUFyZ0xlbmd0aCAhPSBtZXRob2QudHlwZVZhcmlhYmxlcy5sZW5ndGgpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKG1pblR5cGVBcmdMZW5ndGggIT0gMCkgeworCQkJCW1ldGhvZCA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2QobWV0aG9kLCB0eXBlQXJnVHlwZXMpOworCQkJfQorCisJCQlpZiAobWluQXJnTGVuZ3RoID4gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOyl7CisJCQkJaWYgKGFyZ1R5cGVzW2FdICE9IG51bGwpIHsgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5CisJCQkJCWlmICghYXJnVHlwZXNbYV0uaXNDb21wYXRpYmxlV2l0aChtZXRob2QucGFyYW1ldGVyc1thXSkpIHsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJvb2xlYW4gcHJlZml4UmVxdWlyZWQgPSBmYWxzZTsKKworCQkJZm9yIChpbnQgaSA9IG1ldGhvZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKKwkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSkgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOworCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3RoZXJbMV07CisJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCAmJiByZWNlaXZlclR5cGUgPT0gb3RoZXJSZWNlaXZlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBvdGhlck1ldGhvZC5zZWxlY3RvciwgdHJ1ZSkpIHsKKwkJCQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBvdGhlclJlY2VpdmVyVHlwZSkgeworCQkJCQkJaWYgKHRoaXMubG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5pc01ldGhvZFN1YnNpZ25hdHVyZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgeworCQkJCQkJCWlmICghc3VwZXJDYWxsIHx8ICFvdGhlck1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRoaXMubG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5pc01ldGhvZFN1YnNpZ25hdHVyZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgeworCQkJCQkJCWlmKHJlY2VpdmVyVHlwZS5pc0Fub255bW91c1R5cGUoKSkgY29udGludWUgbmV4dDsKKworCQkJCQkJCWlmKCFzdXBlckNhbGwpIHsKKwkJCQkJCQkJaWYoIWNhbkJlUHJlZml4ZWQpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKKworCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCQkJaWYgKG1ldGhvZC5kZWNsYXJpbmdDbGFzcyAhPSBzdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUpIHsKKwkJCQlNZXRob2RCaW5kaW5nW10gb3RoZXJNZXRob2RzID0gc3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlLmdldE1ldGhvZHMobWV0aG9kLnNlbGVjdG9yKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyTWV0aG9kcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZihvdGhlck1ldGhvZHNbaV0ub3JpZ2luYWwoKSA9PSBtZXRob2Qub3JpZ2luYWwoKSkgeworCQkJCQkJbWV0aG9kID0gb3RoZXJNZXRob2RzW2ldOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGVuZ3RoID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IG1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV07CisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMobWV0aG9kLHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCisJCQlpbnQgcHJldmlvdXNTdGFydFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOworCQkJaW50IHByZXZpb3VzVG9rZW5TdGFydCA9IHRoaXMudG9rZW5TdGFydDsKKworCQkJLy8gU3BlY2lhbCBjYXNlIGZvciBjb21wbGV0aW9uIGluIGphdmFkb2MKKwkJCWlmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPiAwKSB7CisJCQkJRXhwcmVzc2lvbiByZWNlaXZlciA9IG51bGw7CisJCQkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kKSB7CisJCQkJCUNvbXBsZXRpb25PbkphdmFkb2NNZXNzYWdlU2VuZCBtc2cgPSAoQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kKSBpbnZvY2F0aW9uU2l0ZTsKKwkJCQkJcmVjZWl2ZXIgPSBtc2cucmVjZWl2ZXI7CisJCQkJfSBlbHNlIGlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZSkgeworCQkJCQlDb21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UgZmllbGRSZWYgPSAoQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSBpbnZvY2F0aW9uU2l0ZTsKKwkJCQkJcmVjZWl2ZXIgPSBmaWVsZFJlZi5yZWNlaXZlcjsKKwkJCQl9CisJCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nQnVmZmVyIGphdmFkb2NDb21wbGV0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQlpZiAocmVjZWl2ZXIuaXNUaGlzKCkpIHsKKwkJCQkJCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwKSB7CisJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcjJyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCkgeworCQkJCQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJCQkJCQlKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSByZWNlaXZlcjsKKwkJCQkJCQlqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQodHlwZVJlZi50b2tlbik7CisJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcjJyk7CisJCQkJCQl9IGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQkJCQlKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByZWNlaXZlcjsKKwkJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYudG9rZW5zLCAnLicpLCBtZXRob2Quc2VsZWN0b3IsICcjJyk7CisJCQkJCQkJZm9yIChpbnQgdD0wLG50ID10eXBlUmVmLnRva2Vucy5sZW5ndGg7IHQ8bnQ7IHQrKykgeworCQkJCQkJCQlpZiAodD4wKSBqYXZhZG9jQ29tcGxldGlvbi5hcHBlbmQoJy4nKTsKKwkJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKHR5cGVSZWYudG9rZW5zW3RdKTsKKwkJCQkJCQl9CisJCQkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCcjJyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCS8vIEFwcGVuZCBwYXJhbWV0ZXJzIHR5cGVzCisJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnKCcpOworCQkJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJCQkJYm9vbGVhbiBpc1ZhcmFyZ3MgPSBtZXRob2QuaXNWYXJhcmdzKCk7CisJCQkJCQlmb3IgKGludCBwPTAsIGxuPW1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsgcDxsbjsgcCsrKSB7CisJCQkJCQkJaWYgKHA+MCkgamF2YWRvY0NvbXBsZXRpb24uYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZUJpbmRpbmcgPSBtZXRob2QucGFyYW1ldGVyc1twXTsKKwkJCQkJCQlpZiAoaXNWYXJhcmdzICYmIHAgPT0gbG4gLSAxKSAgeworCQkJCQkJCQljcmVhdGVWYXJnc1R5cGUoYXJnVHlwZUJpbmRpbmcuZXJhc3VyZSgpLCBzY29wZSwgamF2YWRvY0NvbXBsZXRpb24pOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNyZWF0ZVR5cGUoYXJnVHlwZUJpbmRpbmcuZXJhc3VyZSgpLCBzY29wZSxqYXZhZG9jQ29tcGxldGlvbik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWphdmFkb2NDb21wbGV0aW9uLmFwcGVuZCgnKScpOworCQkJCQljb21wbGV0aW9uID0gamF2YWRvY0NvbXBsZXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gbm90aGluZyB0byBpbnNlcnQgLSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBzZWxlY3RvciAmIGFyZ3VtZW50cworCQkJCWlmICghZXhhY3RNYXRjaCkgeworCQkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAorCQkJCQkJJiYgdGhpcy5zb3VyY2UubGVuZ3RoID4gdGhpcy5lbmRQb3NpdGlvbgorCQkJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5lbmRQb3NpdGlvbl0gPT0gJygnKQorCQkJCQkJY29tcGxldGlvbiA9IG1ldGhvZC5zZWxlY3RvcjsKKwkJCQkJZWxzZQorCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG1ldGhvZC5zZWxlY3RvciwgbmV3IGNoYXJbXSB7ICcoJywgJyknIH0pOworCisJCQkJCWlmIChjYXN0ZWRSZWNlaXZlciAhPSBudWxsKSB7CisJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY2FzdGVkUmVjZWl2ZXIsIGNvbXBsZXRpb24pOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYocHJlZml4UmVxdWlyZWQgJiYgKHRoaXMuc291cmNlICE9IG51bGwpKSB7CisJCQkJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuZW5kUG9zaXRpb247CisJCQkJCX0KKwkJCQkJdGhpcy50b2tlblN0YXJ0ID0gdGhpcy50b2tlbkVuZDsKKwkJCQl9CisKKwkJCQlpZihwcmVmaXhSZXF1aXJlZCB8fCB0aGlzLm9wdGlvbnMuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24peworCQkJCQljaGFyW10gcHJlZml4ID0gY29tcHV0ZVByZWZpeChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIG1ldGhvZC5pc1N0YXRpYygpKTsKKwkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeCxjb21wbGV0aW9uLCcuJyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1ldGhvZC5yZXR1cm5UeXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bUNvbnN0YW50KG1ldGhvZC5yZXR1cm5UeXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKG9ubHlTdGF0aWNNZXRob2RzLCBtZXRob2QuaXNTdGF0aWMoKSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKwkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiB0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW5oZXJpdGFuY2UocmVjZWl2ZXJUeXBlLCBtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCQkJfQorCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JNaXNzaW5nRWxlbWVudHMobWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJCX0KKworCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisKKwkJCWlmIChjYXN0ZWRSZWNlaXZlciA9PSBudWxsKSB7CisJCQkJLy8gU3RhbmRhcmQgcHJvcG9zYWwKKwkJCQlpZighdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSAmJiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5PTkxZX0lOTElORV9UQUcpID09IDApIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOworCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJCWlmKG9yaWdpbmFsICE9IG1ldGhvZCkgeworCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCX0KKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVyVHlwZU5hbWVzKTsKKwkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCXByb3Bvc2FsLnNldE5hbWUobWV0aG9kLnNlbGVjdG9yKTsKKwkJCQkJaWYgKG1pc3NpbmdFbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdWJQcm9wb3NhbHMgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW21pc3NpbmdFbGVtZW50cy5sZW5ndGhdOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNzaW5nRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlzdWJQcm9wb3NhbHNbaV0gPQorCQkJCQkJCQljcmVhdGVSZXF1aXJlZFR5cGVQcm9wb3NhbCgKKwkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNbaV0sCisJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzW2ldLAorCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHNbaV0sCisJCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKHN1YlByb3Bvc2Fscyk7CisJCQkJCX0KKwkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBKYXZhZG9jIHByb3Bvc2FsCisJCQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGKSkgeworCQkJCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb24gPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb24sIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOworCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKKwkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKKwkJCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IG1ldGhvZC5vcmlnaW5hbCgpOworCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKKwkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCQl9CisJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKKwkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oamF2YWRvY0NvbXBsZXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKKwkJCQkJaW50IHN0YXJ0ID0gKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuUkVQTEFDRV9UQUcpICE9IDAgPyB0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UrUl9JTkxJTkVfVEFHKTsKKwkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQlpZihERUJVRykgeworCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSLCBtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkpIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpOworCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOworCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJCWlmKG9yaWdpbmFsICE9IG1ldGhvZCkgeworCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCX0KKwkJCQkJcHJvcG9zYWwuc2V0UmVjZWl2ZXJTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlY2VpdmVyVHlwZSkpOworCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKHBhcmFtZXRlclBhY2thZ2VOYW1lcyk7CisJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOworCQkJCQlpZiAobWlzc2luZ0VsZW1lbnRzICE9IG51bGwpIHsKKwkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1YlByb3Bvc2FscyA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbbWlzc2luZ0VsZW1lbnRzLmxlbmd0aF07CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJCXN1YlByb3Bvc2Fsc1tpXSA9CisJCQkJCQkJCWNyZWF0ZVJlcXVpcmVkVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCW1pc3NpbmdFbGVtZW50c1tpXSwKKwkJCQkJCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHNbaV0sCisJCQkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSwKKwkJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJfQorCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMoc3ViUHJvcG9zYWxzKTsKKwkJCQkJfQorCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtZXRob2QubW9kaWZpZXJzKTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRSZWNlaXZlclJhbmdlKHJlY2VpdmVyU3RhcnQgLSB0aGlzLm9mZnNldCwgcmVjZWl2ZXJFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJdGhpcy5zdGFydFBvc2l0aW9uID0gcHJldmlvdXNTdGFydFBvc2l0aW9uOworCQkJdGhpcy50b2tlblN0YXJ0ID0gcHJldmlvdXNUb2tlblN0YXJ0OworCQl9CisKKwkJbWV0aG9kc0ZvdW5kLmFkZEFsbChuZXdNZXRob2RzRm91bmQpOworCX0KKwlwcml2YXRlIHZvaWQgZmluZExvY2FsTWV0aG9kc0Zyb21GYXZvcml0ZXMoCisJCQljaGFyW10gbWV0aG9kTmFtZSwKKwkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLAorCQkJU2NvcGUgc2NvcGUsCisJCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZEZyb21GYXZvcml0ZXMsCisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlKSB7CisKKwkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChyZWNlaXZlclR5cGUuY29tcG91bmROYW1lLCAnLicpOworCisJCQlpbnQgbWV0aG9kTGVuZ3RoID0gbWV0aG9kTmFtZS5sZW5ndGg7CisKKwkJCW5leHQgOiBmb3IgKGludCBmID0gbWV0aG9kcy5sZW5ndGg7IC0tZiA+PSAwOykgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKKworCQkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJCWlmIChtZXRob2QuaXNEZWZhdWx0QWJzdHJhY3QoKSkJY29udGludWUgbmV4dDsKKworCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OworCisJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCisJCQkJCQltZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJgorCQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQkJY29udGludWUgbmV4dDsKKworCQkJCWlmICghbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCQkmJiAhbWV0aG9kLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dDsKKworCQkJCWlmIChtZXRob2RMZW5ndGggPiBtZXRob2Quc2VsZWN0b3IubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovKQorCQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKworCQkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmRGcm9tRmF2b3JpdGVzLnNpemU7IC0taSA+PSAwOykgeworCQkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSkgbWV0aG9kc0ZvdW5kRnJvbUZhdm9yaXRlcy5lbGVtZW50QXQoaSk7CisJCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgb3RoZXJbMF07CisKKwkJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCkgY29udGludWUgbmV4dDsKKworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBvdGhlck1ldGhvZC5zZWxlY3RvciwgdHJ1ZSkpIHsKKwkJCQkJCWlmIChvdGhlck1ldGhvZC5kZWNsYXJpbmdDbGFzcyA9PSBtZXRob2QuZGVjbGFyaW5nQ2xhc3MgJiYKKwkJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpLmlzTWV0aG9kU3Vic2lnbmF0dXJlKG90aGVyTWV0aG9kLCBtZXRob2QpKSB7CisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoaW50IGkgPSBtZXRob2RzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJCU9iamVjdFtdIG90aGVyID0gKE9iamVjdFtdKSBtZXRob2RzRm91bmQuZWxlbWVudEF0KGkpOworCQkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOworCisJCQkJCWlmIChtZXRob2QgPT0gb3RoZXJNZXRob2QpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgb3RoZXJNZXRob2Quc2VsZWN0b3IsIHRydWUpKSB7CisJCQkJCQlpZiAodGhpcy5sb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpLmlzTWV0aG9kU3Vic2lnbmF0dXJlKG90aGVyTWV0aG9kLCBtZXRob2QpKSB7CisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWJvb2xlYW4gcHJvcG9zZVN0YXRpY0ltcG9ydCA9ICEodGhpcy5jb21waWxlck9wdGlvbnMuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgJiYKKwkJCQkJdGhpcy5vcHRpb25zLnN1Z2dlc3RTdGF0aWNJbXBvcnQ7CisKKwkJCQlib29sZWFuIGlzQWxyZWFkeUltcG9ydGVkID0gZmFsc2U7CisJCQkJaWYgKCFwcm9wb3NlU3RhdGljSW1wb3J0KSB7CisJCQkJCWlmKCF0aGlzLmltcG9ydENhY2hlc0luaXRpYWxpemVkKSB7CisJCQkJCQlpbml0aWFsaXplSW1wb3J0Q2FjaGVzKCk7CisJCQkJCX0KKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzLmltcG9ydENhY2hlQ291bnQ7IGorKykgeworCQkJCQkJY2hhcltdW10gaW1wb3J0TmFtZSA9IHRoaXMuaW1wb3J0c0NhY2hlW2pdOworCQkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVjZWl2ZXJUeXBlLnNvdXJjZU5hbWUsIGltcG9ydE5hbWVbMF0pKSB7CisJCQkJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgaW1wb3J0TmFtZVsxXSkpIHsKKwkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpc0FscmVhZHlJbXBvcnRlZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJbWV0aG9kc0ZvdW5kRnJvbUZhdm9yaXRlcy5hZGQobmV3IE9iamVjdFtde21ldGhvZCwgcmVjZWl2ZXJUeXBlfSk7CisKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZSA9IChSZWZlcmVuY2VCaW5kaW5nKXJlY2VpdmVyVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKG1ldGhvZC5kZWNsYXJpbmdDbGFzcyk7CisJCQkJaWYgKG1ldGhvZC5kZWNsYXJpbmdDbGFzcyAhPSBzdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUpIHsKKwkJCQkJTWV0aG9kQmluZGluZ1tdIG90aGVyTWV0aG9kcyA9IHN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZS5nZXRNZXRob2RzKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJNZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZihvdGhlck1ldGhvZHNbaV0ub3JpZ2luYWwoKSA9PSBtZXRob2Qub3JpZ2luYWwoKSkgeworCQkJCQkJCW1ldGhvZCA9IG90aGVyTWV0aG9kc1tpXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWludCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7CisJCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IG1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV07CisJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQkJfQorCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOworCisJCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisKKwkJCQlpbnQgcHJldmlvdXNTdGFydFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOworCQkJCWludCBwcmV2aW91c1Rva2VuU3RhcnQgPSB0aGlzLnRva2VuU3RhcnQ7CisKKwkJCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbAorCQkJCQkmJiB0aGlzLnNvdXJjZS5sZW5ndGggPiB0aGlzLmVuZFBvc2l0aW9uCisJCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuZW5kUG9zaXRpb25dID09ICcoJykgeworCQkJCQljb21wbGV0aW9uID0gbWV0aG9kLnNlbGVjdG9yOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2Quc2VsZWN0b3IsIG5ldyBjaGFyW10geyAnKCcsICcpJyB9KTsKKwkJCQl9CisKKwkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShtZXRob2QucmV0dXJuVHlwZSk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtQ29uc3RhbnQobWV0aG9kLnJldHVyblR5cGUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKHRydWUsIG1ldGhvZC5pc1N0YXRpYygpKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24odHJ1ZSk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKworCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGN1ID0gdGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQlpbnQgaW1wb3J0U3RhcnQgPSBjdS50eXBlc1swXS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJCWludCBpbXBvcnRFbmQgPSBpbXBvcnRTdGFydDsKKworCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCisJCQkJaWYgKCFwcm9wb3NlU3RhdGljSW1wb3J0KSB7CisJCQkJCWlmIChpc0FscmVhZHlJbXBvcnRlZCkgeworCQkJCQkJaWYgKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7CisJCQkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHJlY2VpdmVyVHlwZS5zb3VyY2VOYW1lLCBjb21wbGV0aW9uLCAnLicpOworCisJCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKKwkJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJCQkJaWYob3JpZ2luYWwgIT0gbWV0aG9kKSB7CisJCQkJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCQkJCX0KKwkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOworCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCisJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmICghdGhpcy5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX0lNUE9SVCkpIHsKKwkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChyZWNlaXZlclR5cGUuc291cmNlTmFtZSwgY29tcGxldGlvbiwgJy4nKTsKKworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kKSk7CisJCQkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKKwkJCQkJCQlwcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShnZXRTaWduYXR1cmUob3JpZ2luYWwpKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQlpZihwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSBwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7CisKKwkJCQkJCWNoYXJbXSB0eXBlSW1wb3J0Q29tcGxldGlvbiA9IGNyZWF0ZUltcG9ydENoYXJBcnJheSh0eXBlTmFtZSwgZmFsc2UsIGZhbHNlKTsKKworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgdHlwZUltcG9ydFByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfSU1QT1JULCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7CisJCQkJCQljaGFyW10gcGFja2FnZU5hbWUgPSByZWNlaXZlclR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShyZWNlaXZlclR5cGUpKTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0VHlwZU5hbWUocmVjZWl2ZXJUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0Q29tcGxldGlvbih0eXBlSW1wb3J0Q29tcGxldGlvbik7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0RmxhZ3MocmVjZWl2ZXJUeXBlLm1vZGlmaWVycyk7CisJCQkJCQl0eXBlSW1wb3J0UHJvcG9zYWwuc2V0QWRkaXRpb25hbEZsYWdzKENvbXBsZXRpb25GbGFncy5EZWZhdWx0KTsKKwkJCQkJCXR5cGVJbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UoaW1wb3J0U3RhcnQgLSB0aGlzLm9mZnNldCwgaW1wb3J0RW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFRva2VuUmFuZ2UoaW1wb3J0U3RhcnQgLSB0aGlzLm9mZnNldCwgaW1wb3J0RW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJdHlwZUltcG9ydFByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCisJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhuZXcgQ29tcGxldGlvblByb3Bvc2FsW117dHlwZUltcG9ydFByb3Bvc2FsfSk7CisKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIXRoaXMuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0lNUE9SVCkpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG1ldGhvZCkpOworCQkJCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IG1ldGhvZC5vcmlnaW5hbCgpOworCQkJCQkJaWYob3JpZ2luYWwgIT0gbWV0aG9kKSB7CisJCQkJCQkJcHJvcG9zYWwuc2V0T3JpZ2luYWxTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKG9yaWdpbmFsKSk7CisJCQkJCQl9CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMocGFyYW1ldGVyUGFja2FnZU5hbWVzKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobWV0aG9kLnJldHVyblR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOworCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1ldGhvZC5tb2RpZmllcnMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCisJCQkJCQljaGFyW10gbWV0aG9kSW1wb3J0Q29tcGxldGlvbiA9IGNyZWF0ZUltcG9ydENoYXJBcnJheShDaGFyT3BlcmF0aW9uLmNvbmNhdCh0eXBlTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCAnLicpLCB0cnVlLCBmYWxzZSk7CisKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIG1ldGhvZEltcG9ydFByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9JTVBPUlQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKTsKKwkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kKSk7CisJCQkJCQlpZihvcmlnaW5hbCAhPSBtZXRob2QpIHsKKwkJCQkJCQlwcm9wb3NhbC5zZXRPcmlnaW5hbFNpZ25hdHVyZShnZXRTaWduYXR1cmUob3JpZ2luYWwpKTsKKwkJCQkJCX0KKwkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQkJCW1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXROYW1lKG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRDb21wbGV0aW9uKG1ldGhvZEltcG9ydENvbXBsZXRpb24pOworCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRBZGRpdGlvbmFsRmxhZ3MoQ29tcGxldGlvbkZsYWdzLlN0YXRpY0ltcG9ydCk7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UoaW1wb3J0U3RhcnQgLSB0aGlzLm9mZnNldCwgaW1wb3J0RW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJbWV0aG9kSW1wb3J0UHJvcG9zYWwuc2V0VG9rZW5SYW5nZShpbXBvcnRTdGFydCAtIHRoaXMub2Zmc2V0LCBpbXBvcnRFbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQltZXRob2RJbXBvcnRQcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIG1ldGhvZEltcG9ydFByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKworCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMobmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde21ldGhvZEltcG9ydFByb3Bvc2FsfSk7CisKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBwcmV2aW91c1N0YXJ0UG9zaXRpb247CisJCQkJdGhpcy50b2tlblN0YXJ0ID0gcHJldmlvdXNUb2tlblN0YXJ0OworCQkJfQorCQl9CisKKwkvKioKKwkgKiBIZWxwZXIgbWV0aG9kIGZvciBmaW5kTWV0aG9kcyhjaGFyW10sIFR5cGVCaW5kaW5nW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pCisJICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZG9lc24ndCBkbyBhIGNvbXBhcmlzb24gb2YgdGhlIG1ldGhvZCBuYW1lcyBhbmQgZXhwZWN0cyB0aGUgY2xpZW50IHRvIGhhbmRsZSB0aGUgc2FtZS4KKwkgKiAKKwkgKiBAbWV0aG9kTmFtZSBtZXRob2QgYXMgZW50ZXJlZCBieSB0aGUgdXNlciwgdGhlIG9uZSB0byBjb21wbGV0ZWQKKwkgKiBAcGFyYW0gbWV0aG9kcyBhIHJlc3VsdGFudCBhcnJheSBvZiBNZXRob2RCaW5kaW5nLCB3aG9zZSBuYW1lcyBzaG91bGQgbWF0Y2ggbWV0aG9kTmFtZS4gVGhlIGNhbGxpbmcgY2xpZW50IG11c3QgZW5zdXJlIHRoYXQgdGhpcyBjaGVjayBpcyBoYW5kbGVkLgorCSAqLworCXByaXZhdGUgdm9pZCBmaW5kTG9jYWxNZXRob2RzRnJvbVN0YXRpY0ltcG9ydHMoCisJCWNoYXJbXSBtZXRob2ROYW1lLAorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywKKwkJU2NvcGUgc2NvcGUsCisJCWJvb2xlYW4gZXhhY3RNYXRjaCwKKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisKKwkJT2JqZWN0VmVjdG9yIG5ld01ldGhvZHNGb3VuZCA9ICBuZXcgT2JqZWN0VmVjdG9yKCk7CisKKwkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbZl07CisKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKCFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0RlcHJlY2F0aW9uICYmCisJCQkJCW1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmCisJCQkJCSFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KG1ldGhvZC5kZWNsYXJpbmdDbGFzcykpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKKwkJCQkmJiAhbWV0aG9kLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dDsKKworCQkJZm9yIChpbnQgaSA9IG1ldGhvZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKKwkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSkgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOworCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3RoZXJbMV07CisJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCAmJiByZWNlaXZlclR5cGUgPT0gb3RoZXJSZWNlaXZlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBvdGhlck1ldGhvZC5zZWxlY3RvciwgdHJ1ZSkpIHsKKwkJCQkJaWYgKHRoaXMubG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5pc01ldGhvZFN1YnNpZ25hdHVyZShvdGhlck1ldGhvZCwgbWV0aG9kKSkgeworCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJbmV3TWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKKworCQkJaW50IGxlbmd0aCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBtZXRob2Qub3JpZ2luYWwoKS5wYXJhbWV0ZXJzW2ldOworCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJCX0KKwkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOworCisJCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKworCQkJaW50IHByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJCWludCBwcmV2aW91c1Rva2VuU3RhcnQgPSB0aGlzLnRva2VuU3RhcnQ7CisKKwkJCWlmICghZXhhY3RNYXRjaCkgeworCQkJCWlmICh0aGlzLnNvdXJjZSAhPSBudWxsCisJCQkJCSYmIHRoaXMuc291cmNlLmxlbmd0aCA+IHRoaXMuZW5kUG9zaXRpb24KKwkJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5lbmRQb3NpdGlvbl0gPT0gJygnKSB7CisJCQkJCWNvbXBsZXRpb24gPSBtZXRob2Quc2VsZWN0b3I7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG1ldGhvZC5zZWxlY3RvciwgbmV3IGNoYXJbXSB7ICcoJywgJyknIH0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5lbmRQb3NpdGlvbjsKKwkJCQl0aGlzLnRva2VuU3RhcnQgPSB0aGlzLnRva2VuRW5kOworCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1ldGhvZC5yZXR1cm5UeXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bUNvbnN0YW50KG1ldGhvZC5yZXR1cm5UeXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKHRydWUsIG1ldGhvZC5pc1N0YXRpYygpKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworCisJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7CisJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUobWV0aG9kLmRlY2xhcmluZ0NsYXNzKSk7CisJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZShtZXRob2QpKTsKKwkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJaWYob3JpZ2luYWwgIT0gbWV0aG9kKSB7CisJCQkJCXByb3Bvc2FsLnNldE9yaWdpbmFsU2lnbmF0dXJlKGdldFNpZ25hdHVyZShvcmlnaW5hbCkpOworCQkJCX0KKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKKwkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpOworCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJcHJvcG9zYWwuc2V0TmFtZShtZXRob2Quc2VsZWN0b3IpOworCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobWV0aG9kLm1vZGlmaWVycyk7CisJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMocGFyYW1ldGVyTmFtZXMpOworCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJaWYoREVCVUcpIHsKKwkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQl9CisJCQl9CisJCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBwcmV2aW91c1N0YXJ0UG9zaXRpb247CisJCQl0aGlzLnRva2VuU3RhcnQgPSBwcmV2aW91c1Rva2VuU3RhcnQ7CisJCX0KKworCQltZXRob2RzRm91bmQuYWRkQWxsKG5ld01ldGhvZHNGb3VuZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRMb2NhbE1ldGhvZHNGcm9tU3RhdGljSW1wb3J0cygKKwkJCWNoYXJbXSB0b2tlbiwKKwkJCVNjb3BlIHNjb3BlLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQkJYm9vbGVhbiBwcm9wb3NlTWV0aG9kKSB7CisJCWZpbmRGaWVsZHNBbmRNZXRob2RzRnJvbVN0YXRpY0ltcG9ydHMoCisJCQkJdG9rZW4sCisJCQkJc2NvcGUsCisJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCWV4YWN0TWF0Y2gsCisJCQkJZmFsc2UsCisJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQltZXRob2RzRm91bmQsCisJCQkJZmFsc2UsCisJCQkJcHJvcG9zZU1ldGhvZCk7CisJfQorCXByb3RlY3RlZCB2b2lkIGZpbmRNZW1iZXJzKAorCQkJY2hhcltdIHRva2VuLAorCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCQlTY29wZSBzY29wZSwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJYm9vbGVhbiBpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUsCisJCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKSB7CisKKwkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCQl0b2tlbiwKKwkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQlzY29wZSwKKwkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAorCQkJCQlmYWxzZSwKKwkJCQkJdHJ1ZSwKKwkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJfQorCQlpZiAoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKSkgeworCQkJZmluZENsYXNzRmllbGQoCisJCQkJCXRva2VuLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCXNjb3BlLAorCQkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJfQorCisJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gbnVsbDsKKwkJaWYgKCFpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUgJiYKKwkJCQkhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEKSAmJgorCQkJCSgoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSAmJiAhKChNZXRob2RTY29wZSlzY29wZSkuaXNTdGF0aWMpCisJCQkJfHwgKChtZXRob2RTY29wZSA9IHNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkpICE9IG51bGwgJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljKSkpIHsKKwkJCWlmICh0b2tlbi5sZW5ndGggPiAwKSB7CisJCQkJZmluZEtleXdvcmRzKHRva2VuLCBuZXcgY2hhcltdW117S2V5d29yZHMuVEhJU30sIGZhbHNlLCB0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodGhpcy5jb21wbGV0aW9uVG9rZW4sIEtleXdvcmRzLlRISVMpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3Iga2V5d29yZHMKKwkJCQlyZWxldmFuY2UgKz0gUl9OT05fSU5IRVJJVEVEOworCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQpKSB7CisJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JELCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCXByb3Bvc2FsLnNldE5hbWUoS2V5d29yZHMuVEhJUyk7CisJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oS2V5d29yZHMuVEhJUyk7CisJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCWlmIChERUJVRykgeworCQkJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYpKSB7CisJCQlmaW5kRmllbGRzKAorCQkJCXRva2VuLAorCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQlzY29wZSwKKwkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCXRydWUsCisJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJc2NvcGUsCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQludWxsLAorCQkJCS0xLAorCQkJCS0xKTsKKwkJfQorCisJCWlmICghaXNJbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpKSB7CisJCQlmaW5kTWV0aG9kcygKKwkJCQl0b2tlbiwKKwkJCQludWxsLAorCQkJCW51bGwsCisJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCXNjb3BlLAorCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQl0cnVlLAorCQkJCWZhbHNlLAorCQkJCWludm9jYXRpb25TaXRlLAorCQkJCXNjb3BlLAorCQkJCWZhbHNlLAorCQkJCWZhbHNlLAorCQkJCWZhbHNlLAorCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCQkJbnVsbCwKKwkJCQktMSwKKwkJCQktMSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZE1lbWJlcnNGcm9tTWlzc2luZ1R5cGUoCisJCQlmaW5hbCBjaGFyW10gdG9rZW4sCisJCQlmaW5hbCBsb25nIHBvcywKKwkJCVR5cGVCaW5kaW5nIHJlc29sdmVUeXBlLAorCQkJZmluYWwgU2NvcGUgc2NvcGUsCisJCQlmaW5hbCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCWZpbmFsIGJvb2xlYW4gaXNJbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlKSB7CisJCU1pc3NpbmdUeXBlc0d1ZXNzZXIgbWlzc2luZ1R5cGVzQ29udmVydGVyID0gbmV3IE1pc3NpbmdUeXBlc0d1ZXNzZXIodGhpcyk7CisJCU1pc3NpbmdUeXBlc0d1ZXNzZXIuR3Vlc3NlZFR5cGVSZXF1ZXN0b3Igc3Vic3RpdHV0aW9uUmVxdWVzdG9yID0KKwkJCW5ldyBNaXNzaW5nVHlwZXNHdWVzc2VyLkd1ZXNzZWRUeXBlUmVxdWVzdG9yKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjY2VwdCgKKwkJCQkJCVR5cGVCaW5kaW5nIGd1ZXNzZWRUeXBlLAorCQkJCQkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJCQkJCWludFtdIG1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCQlib29sZWFuIGhhc1Byb2JsZW1zKSB7CisJCQkJCWlmIChndWVzc2VkVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCWZpbmRNZW1iZXJzKAorCQkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZylndWVzc2VkVHlwZSwKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJCQlpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUsCisJCQkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJCQloYXNQcm9ibGVtcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZSh0b2tlbiwgcG9zKTsKKwkJdHlwZVJlZi5yZXNvbHZlZFR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtdeyB0b2tlbiB9LCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCW1pc3NpbmdUeXBlc0NvbnZlcnRlci5ndWVzcyh0eXBlUmVmLCBzY29wZSwgc3Vic3RpdHV0aW9uUmVxdWVzdG9yKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUludm9jYXRpb24sCisJCWJvb2xlYW4gc3RhdGljT25seSwKKwkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQlib29sZWFuIGZyb21TdGF0aWNJbXBvcnQsCisJCWJvb2xlYW4gY2hlY2tRdWFsaWZpY2F0aW9uLAorCQlib29sZWFuIHByb3Bvc2VBbGxNZW1iZXJUeXBlcywKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZVRvSWdub3JlLAorCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCwKKwkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgeworCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7CisJCWlmICh0eXBlTmFtZSA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWlmICh0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZQorCQkJfHwgdHlwZU5hbWUubGVuZ3RoID09IDApIHsgLy8gZG8gbm90IHNlYXJjaCB1cCB0aGUgaGllcmFyY2h5CisKKwkJCWZpbmRNZW1iZXJUeXBlcygKKwkJCQl0eXBlTmFtZSwKKwkJCQljdXJyZW50VHlwZS5tZW1iZXJUeXBlcygpLAorCQkJCXR5cGVzRm91bmQsCisJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCXR5cGVJbnZvY2F0aW9uLAorCQkJCXN0YXRpY09ubHksCisJCQkJc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKKwkJCQlmcm9tU3RhdGljSW1wb3J0LAorCQkJCWNoZWNrUXVhbGlmaWNhdGlvbiwKKwkJCQlzY29wZSwKKwkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CisJCWludCBuZXh0UG9zaXRpb24gPSAwOworCisJCWRvIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBudWxsICYmIGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgeworCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IGl0c0ludGVyZmFjZXM7CisJCQkJCW5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKKwkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07CisJCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQorCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCXR5cGVOYW1lLAorCQkJCWN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCksCisJCQkJdHlwZXNGb3VuZCwKKwkJCQlyZWNlaXZlclR5cGUsCisJCQkJdHlwZUludm9jYXRpb24sCisJCQkJc3RhdGljT25seSwKKwkJCQlzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQkJCWZyb21TdGF0aWNJbXBvcnQsCisJCQkJY2hlY2tRdWFsaWZpY2F0aW9uLAorCQkJCXNjb3BlLAorCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOworCisJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKKwkJfSB3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCk7CisKKwkJaWYocHJvcG9zZUFsbE1lbWJlclR5cGVzKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSByZWNlaXZlclR5cGUubWVtYmVyVHlwZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZihtZW1iZXJUeXBlc1tpXSAhPSB0eXBlVG9JZ25vcmUpIHsKKwkJCQkJZmluZFN1Yk1lbWJlclR5cGVzKAorCQkJCQkJdHlwZU5hbWUsCisJCQkJCQltZW1iZXJUeXBlc1tpXSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJdHlwZUludm9jYXRpb24sCisJCQkJCQlzdGF0aWNPbmx5LAorCQkJCQkJc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSwKKwkJCQkJCWZyb21TdGF0aWNJbXBvcnQsCisJCQkJCQl0eXBlc0ZvdW5kKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJCXR5cGVOYW1lLAorCQkJCQlhbkludGVyZmFjZS5tZW1iZXJUeXBlcygpLAorCQkJCQl0eXBlc0ZvdW5kLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCXR5cGVJbnZvY2F0aW9uLAorCQkJCQlzdGF0aWNPbmx5LAorCQkJCQlzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQkJCQlmcm9tU3RhdGljSW1wb3J0LAorCQkJCQljaGVja1F1YWxpZmljYXRpb24sCisJCQkJCXNjb3BlLAorCQkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKTsKKworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2Uuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gbnVsbCAmJiBpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOworCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCisJCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmluZE1lbWJlclR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUludm9jYXRpb24sCisJCWJvb2xlYW4gc3RhdGljT25seSwKKwkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQlPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCwKKwkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgIHsKKwkJZmluZE1lbWJlclR5cGVzKAorCQkJCXR5cGVOYW1lLAorCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQlzY29wZSwKKwkJCQl0eXBlSW52b2NhdGlvbiwKKwkJCQlzdGF0aWNPbmx5LAorCQkJCXN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJZmFsc2UsCisJCQkJbnVsbCwKKwkJCQl0eXBlc0ZvdW5kLAorCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOworCX0KKwkJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1lbWJlclR5cGVzKGNoYXJbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUpCisJcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygKKwkJY2hhcltdIHR5cGVOYW1lLAorCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMsCisJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsCisJCWJvb2xlYW4gc3RhdGljT25seSwKKwkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQlib29sZWFuIGZyb21TdGF0aWNJbXBvcnQsCisJCWJvb2xlYW4gY2hlY2tRdWFsaWZpY2F0aW9uLAorCQlTY29wZSBzY29wZSwKKwkJQmluZGluZ1tdIG1pc3NpbmdFbGVtZW50cywKKwkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQlib29sZWFuIG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcykgeworCisJCS8vIEluaGVyaXRlZCBtZW1iZXIgdHlwZXMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisJCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQluZXh0IDogZm9yIChpbnQgbSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1ttXTsKKwkJCS8vCQlpZiAoIXdhbnRDbGFzc2VzICYmIG1lbWJlclR5cGUuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OworCQkJLy8JCWlmICghd2FudEludGVyZmFjZXMgJiYgbWVtYmVyVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoc3RhdGljT25seSAmJiAhbWVtYmVyVHlwZS5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoaXNGb3JiaWRkZW4obWVtYmVyVHlwZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0eXBlTGVuZ3RoID4gbWVtYmVyVHlwZS5zb3VyY2VOYW1lLmxlbmd0aCkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUsIGZhbHNlLyogaWdub3JlIGNhc2UgKi8pCisJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSkpKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgorCQkJCQltZW1iZXJUeXBlLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKKwkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQobWVtYmVyVHlwZSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja1Zpc2liaWxpdHkpIHsKKwkJCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gbnVsbCAmJiAhbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25UeXBlKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0gZWxzZSBpZihpbnZvY2F0aW9uVHlwZSA9PSBudWxsICYmICFtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKwkJCX0KKworCQkJaWYgKHRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlICYmCisJCQkJCXJlY2VpdmVyVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgJiYKKwkJCQkJbWVtYmVyVHlwZS5pc1N0YXRpYygpKSB7CisJCQkJY29udGludWUgbmV4dDsKKwkJCX0KKworCQkJZm9yIChpbnQgaSA9IHR5cGVzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZXNGb3VuZC5lbGVtZW50QXQoaSk7CisKKwkJCQlpZiAobWVtYmVyVHlwZSA9PSBvdGhlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWVtYmVyVHlwZS5zb3VyY2VOYW1lLCBvdGhlclR5cGUuc291cmNlTmFtZSwgdHJ1ZSkpIHsKKworCQkJCQlpZiAobWVtYmVyVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNTdXBlcmNsYXNzT2Yob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSkpCisJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCWlmIChvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzSW50ZXJmYWNlKCkpCisJCQkJCQlpZiAobWVtYmVyVHlwZS5lbmNsb3NpbmdUeXBlKCkKKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpLCB0cnVlKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc0ludGVyZmFjZSgpKQorCQkJCQkJaWYgKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkKKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkpCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCXR5cGVzRm91bmQuYWRkKG1lbWJlclR5cGUpOworCisJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeHRlbmRlZFR5cGUgJiYgbWVtYmVyVHlwZS5pc0ZpbmFsKCkpIGNvbnRpbnVlIG5leHQ7CisJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uICYmIG1lbWJlclR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJaWYoIXRoaXMuaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7CisJCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcyB8fCB0aGlzLmFzc2lzdE5vZGVJc0V4Y2VwdGlvbikgeworCQkJCQlpZighbWVtYmVyVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7CisJCQkJCWlmKCFtZW1iZXJUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIW1lbWJlclR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7CisJCQkJCWlmKCFtZW1iZXJUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IG1lbWJlclR5cGUuc291cmNlTmFtZSgpOworCisJCQlib29sZWFuIGlzUXVhbGlmaWVkID0gZmFsc2U7CisJCQlpZihjaGVja1F1YWxpZmljYXRpb24gJiYgIWZyb21TdGF0aWNJbXBvcnQpIHsKKwkJCQljaGFyW10gbWVtYmVyUGFja2FnZU5hbWUgPSBtZW1iZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCk7CisJCQkJY2hhcltdIG1lbWJlclR5cGVOYW1lID0gbWVtYmVyVHlwZS5zb3VyY2VOYW1lKCk7CisJCQkJY2hhcltdIG1lbWJlckVuY2xvc2luZ1R5cGVOYW1lcyA9IG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKG1lbWJlclBhY2thZ2VOYW1lLCBtZW1iZXJUeXBlTmFtZSwgbWVtYmVyRW5jbG9zaW5nVHlwZU5hbWVzLCBtZW1iZXJUeXBlLm1vZGlmaWVycykpIHsKKwkJCQkJaWYgKG1lbWJlclBhY2thZ2VOYW1lID09IG51bGwgfHwgbWVtYmVyUGFja2FnZU5hbWUubGVuZ3RoID09IDApCisJCQkJCQlpZiAodGhpcy51bml0U2NvcGUgIT0gbnVsbCAmJiB0aGlzLnVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpCisJCQkJCQkJYnJlYWsgbmV4dDsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQKKwkJCQkJaXNRdWFsaWZpZWQgPSB0cnVlOworCQkJCQljb21wbGV0aW9uTmFtZSA9CisJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQkJbWVtYmVyUGFja2FnZU5hbWUsCisJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCQkJCW1lbWJlckVuY2xvc2luZ1R5cGVOYW1lcywKKwkJCQkJCQkJCQltZW1iZXJUeXBlTmFtZSwKKwkJCQkJCQkJCQknLicpLAorCQkJCQkJCQknLicpOworCQkJCX0KKwkJCX0KKworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChtZW1iZXJUeXBlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKG1lbWJlclR5cGUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsKKwkJCWlmKCF0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihpc1F1YWxpZmllZCk7CisJCQl9CisJCQlpZiAoc3RhdGljRmllbGRzQW5kTWV0aG9kT25seSAmJiB0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgcmVsZXZhbmNlICs9IFJfTk9OX0lOSEVSSVRFRDsgLy8gVGhpcyBjcml0ZXJpb24gZG9lc24ndCBjb25jZXJuIHR5cGVzIGFuZCBpcyBhZGRlZCB0byBiZSBiYWxhbmNlZCB3aXRoIGZpZWxkIGFuZCBtZXRob2QgcmVsZXZhbmNlLgorCisJCQlpZiAobWVtYmVyVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIHsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb25UYXJnZXQobWVtYmVyVHlwZSk7CisJCQl9IGVsc2UgaWYgKG1lbWJlclR5cGUuaXNDbGFzcygpKSB7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKG1lbWJlclR5cGUuc291cmNlTmFtZSk7CisJCQl9IGVsc2UgaWYobWVtYmVyVHlwZS5pc0VudW0oKSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bSgpOworCQkJfSBlbHNlIGlmKG1lbWJlclR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQl9CisKKwkJCWlmIChtaXNzaW5nRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yTWlzc2luZ0VsZW1lbnRzKG1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQl9CisKKwkJCWJvb2xlYW4gYWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMgPSBpc0FsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzKCk7CisJCQkKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJaWYgKCF0aGlzLmFzc2lzdE5vZGVJc0NvbnN0cnVjdG9yIHx8CisJCQkJCSFhbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscyB8fAorCQkJCQloYXNTdGF0aWNNZW1iZXJUeXBlcyhtZW1iZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSwgdGhpcy51bml0U2NvcGUpIHx8CisJCQkJCShtZW1iZXJUeXBlIGluc3RhbmNlb2YgU291cmNlVHlwZUJpbmRpbmcgJiYgaGFzTWVtYmVyVHlwZXNJbkVuY2xvc2luZ1Njb3BlKChTb3VyY2VUeXBlQmluZGluZyltZW1iZXJUeXBlLCBzY29wZSkpIHx8CisJCQkJCWhhc0FycmF5VHlwZUFzRXhwZWN0ZWRTdXBlclR5cGVzKCkpIHsKKwkJCQljcmVhdGVUeXBlUHJvcG9zYWwoCisJCQkJCQltZW1iZXJUeXBlLAorCQkJCQkJbWVtYmVyVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQlJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsCisJCQkJCQljb21wbGV0aW9uTmFtZSwKKwkJCQkJCXJlbGV2YW5jZSwKKwkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMpOworCQkJfQorCQkJCisJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvciAmJiBhbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscykgeworCQkJCWZpbmRDb25zdHJ1Y3RvcnNPckFub255bW91c1R5cGVzKAorCQkJCQkJbWVtYmVyVHlwZSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJRmFrZUludm9jYXRpb25TaXRlLAorCQkJCQkJaXNRdWFsaWZpZWQsCisJCQkJCQlyZWxldmFuY2UpOworCQkJfQorCQl9CisJfQorCXByaXZhdGUgdm9pZCBmaW5kTWVtYmVyVHlwZXNGcm9tTWlzc2luZ1R5cGUoCisJCQljaGFyW10gdHlwZU5hbWUsCisJCQlmaW5hbCBsb25nIHBvcywKKwkJCWZpbmFsIFNjb3BlIHNjb3BlKSAgeworCQlNaXNzaW5nVHlwZXNHdWVzc2VyIG1pc3NpbmdUeXBlc0NvbnZlcnRlciA9IG5ldyBNaXNzaW5nVHlwZXNHdWVzc2VyKHRoaXMpOworCQlNaXNzaW5nVHlwZXNHdWVzc2VyLkd1ZXNzZWRUeXBlUmVxdWVzdG9yIHN1YnN0aXR1dGlvblJlcXVlc3RvciA9CisJCQluZXcgTWlzc2luZ1R5cGVzR3Vlc3Nlci5HdWVzc2VkVHlwZVJlcXVlc3RvcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY2NlcHQoCisJCQkJCQlUeXBlQmluZGluZyBndWVzc2VkVHlwZSwKKwkJCQkJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMsCisJCQkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJYm9vbGVhbiBoYXNQcm9ibGVtcykgeworCQkJCQlpZiAoZ3Vlc3NlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKWd1ZXNzZWRUeXBlLAorCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLAorCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCQkJCWhhc1Byb2JsZW1zKTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCVNpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKHR5cGVOYW1lLCBwb3MpOworCQl0eXBlUmVmLnJlc29sdmVkVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117IHR5cGVOYW1lIH0sIG51bGwsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJbWlzc2luZ1R5cGVzQ29udmVydGVyLmd1ZXNzKHR5cGVSZWYsIHNjb3BlLCBzdWJzdGl0dXRpb25SZXF1ZXN0b3IpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzRnJvbU1pc3NpbmdUeXBlKAorCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmLAorCQkJZmluYWwgbG9uZyBwb3MsCisJCQlmaW5hbCBTY29wZSBzY29wZSkgIHsKKwkJTWlzc2luZ1R5cGVzR3Vlc3NlciBtaXNzaW5nVHlwZXNDb252ZXJ0ZXIgPSBuZXcgTWlzc2luZ1R5cGVzR3Vlc3Nlcih0aGlzKTsKKwkJTWlzc2luZ1R5cGVzR3Vlc3Nlci5HdWVzc2VkVHlwZVJlcXVlc3RvciBzdWJzdGl0dXRpb25SZXF1ZXN0b3IgPQorCQkJbmV3IE1pc3NpbmdUeXBlc0d1ZXNzZXIuR3Vlc3NlZFR5cGVSZXF1ZXN0b3IoKSB7CisJCQkJcHVibGljIHZvaWQgYWNjZXB0KAorCQkJCQkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUsCisJCQkJCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQkJCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJCWJvb2xlYW4gaGFzUHJvYmxlbXMpIHsKKwkJCQkJaWYgKGd1ZXNzZWRUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZylndWVzc2VkVHlwZSwKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQkJCQloYXNQcm9ibGVtcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQltaXNzaW5nVHlwZXNDb252ZXJ0ZXIuZ3Vlc3ModHlwZVJlZiwgc2NvcGUsIHN1YnN0aXR1dGlvblJlcXVlc3Rvcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRNZXRob2REZWNsYXJhdGlvbnMoCisJCWNoYXJbXSBzZWxlY3RvciwKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zKSB7CisKKwkJaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCU1ldGhvZEJpbmRpbmdbXSByZWNlaXZlclR5cGVNZXRob2RzID0gcmVjZWl2ZXJUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKKwkJaWYgKHJlY2VpdmVyVHlwZU1ldGhvZHMgIT0gbnVsbCl7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY2VpdmVyVHlwZU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZighcmVjZWl2ZXJUeXBlTWV0aG9kc1tpXS5pc0RlZmF1bHRBYnN0cmFjdCgpKSB7CisJCQkJCW1ldGhvZHNGb3VuZC5hZGQocmVjZWl2ZXJUeXBlTWV0aG9kc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJCisJCWZpbmRJbnRlcmZhY2VzTWV0aG9kRGVjbGFyYXRpb25zKAorCQkJc2VsZWN0b3IsCisJCQlyZWNlaXZlclR5cGUsCisJCQljdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKSwKKwkJCXNjb3BlLAorCQkJbWV0aG9kc0ZvdW5kLAorCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQorCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCWN1cnJlbnRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlLnN1cGVyY2xhc3MoKTsKKwkJfQorCQkKKwkJYm9vbGVhbiBoYXNQb3RlbnRpYWxEZWZhdWx0QWJzdHJhY3RNZXRob2RzID0gdHJ1ZTsKKwkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKKworCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJZmluZExvY2FsTWV0aG9kRGVjbGFyYXRpb25zKAorCQkJCQlzZWxlY3RvciwKKwkJCQkJbWV0aG9kcywKKwkJCQkJc2NvcGUsCisJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJZmFsc2UsCisJCQkJCXJlY2VpdmVyVHlwZSk7CisJCQl9CisKKwkJCWlmIChoYXNQb3RlbnRpYWxEZWZhdWx0QWJzdHJhY3RNZXRob2RzICYmCisJCQkJCShjdXJyZW50VHlwZS5pc0Fic3RyYWN0KCkgfHwKKwkJCQkJCQljdXJyZW50VHlwZS5pc1R5cGVWYXJpYWJsZSgpIHx8CisJCQkJCQkJY3VycmVudFR5cGUuaXNJbnRlcnNlY3Rpb25UeXBlKCkgfHwKKwkJCQkJCQljdXJyZW50VHlwZS5pc0VudW0oKSkpeworCisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCisJCQkJZmluZEludGVyZmFjZXNNZXRob2REZWNsYXJhdGlvbnMoCisJCQkJCXNlbGVjdG9yLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCXN1cGVySW50ZXJmYWNlcywKKwkJCQkJc2NvcGUsCisJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcyk7CisJCQl9IGVsc2UgeworCQkJCWhhc1BvdGVudGlhbERlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBmYWxzZTsKKwkJCX0KKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOworCQl9CisJfQorCQorCXByaXZhdGUgY2hhcltdW10gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMpeworCQlUeXBlQmluZGluZyBlcmFzdXJlID0gIG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CisJCWlmKCEoZXJhc3VyZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSByZXR1cm4gbnVsbDsKKworCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisKKwkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7CisKKwkJaWYgKGxlbmd0aCA9PSAwKXsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKwkJfQorCQkvLyBsb29rIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCBpZiBpdCBpcyBhdmFpbGFibGUKKwkJaWYgKGVyYXN1cmUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZyl7CisJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBlcmFzdXJlOworCisJCQlpZiAoc291cmNlVHlwZS5zY29wZSAhPSBudWxsKXsKKwkJCQlUeXBlRGVjbGFyYXRpb24gcGFyc2VkVHlwZTsKKworCQkJCWlmICgocGFyc2VkVHlwZSA9IHNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dCkgIT0gbnVsbCl7CisJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IHBhcnNlZFR5cGUuZGVjbGFyYXRpb25PZihtZXRob2Qub3JpZ2luYWwoKSk7CisKKwkJCQkJaWYgKG1ldGhvZERlY2wgIT0gbnVsbCl7CisJCQkJCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZERlY2wuYXJndW1lbnRzOworCQkJCQkJcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisKKwkJCQkJCWZvcihpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKXsKKwkJCQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IGFyZ3VtZW50c1tpXS5uYW1lOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIGxvb2sgaW50byB0aGUgbW9kZWwKKwkJaWYocGFyYW1ldGVyTmFtZXMgPT0gbnVsbCl7CisKKwkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZ1R5cGUgPSAoUmVmZXJlbmNlQmluZGluZyllcmFzdXJlOworCisJCQljaGFyW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGJpbmRpbmdUeXBlLmNvbXBvdW5kTmFtZSwgJy4nKTsKKwkJCU9iamVjdCB0eXBlID0gdGhpcy50eXBlQ2FjaGUuZ2V0KGNvbXBvdW5kTmFtZSk7CisKKwkJCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUgPSBudWxsOworCQkJaWYodHlwZSAhPSBudWxsKSB7CisJCQkJaWYodHlwZSBpbnN0YW5jZW9mIElTb3VyY2VUeXBlKSB7CisJCQkJCXNvdXJjZVR5cGUgPSAoSVNvdXJjZVR5cGUpIHR5cGU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGUoYmluZGluZ1R5cGUuY29tcG91bmROYW1lKTsKKwkJCQlpZihhbnN3ZXIgIT0gbnVsbCAmJiBhbnN3ZXIuaXNTb3VyY2VUeXBlKCkpIHsKKwkJCQkJc291cmNlVHlwZSA9IGFuc3dlci5nZXRTb3VyY2VUeXBlcygpWzBdOworCQkJCQl0aGlzLnR5cGVDYWNoZS5wdXQoY29tcG91bmROYW1lLCBzb3VyY2VUeXBlKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKHNvdXJjZVR5cGUgIT0gbnVsbCkgeworCQkJCUlUeXBlIHR5cGVIYW5kbGUgPSAoKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgc291cmNlVHlwZSkuZ2V0SGFuZGxlKCk7CisKKwkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUocGFyYW1ldGVyVHlwZU5hbWVzW2ldLCBmYWxzZSk7CisJCQkJfQorCQkJCUlNZXRob2Qgc2VhcmNoZWRNZXRob2QgPSB0eXBlSGFuZGxlLmdldE1ldGhvZChTdHJpbmcudmFsdWVPZihtZXRob2Quc2VsZWN0b3IpLCBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyk7CisJCQkJSU1ldGhvZFtdIGZvdW5kTWV0aG9kcyA9IHR5cGVIYW5kbGUuZmluZE1ldGhvZHMoc2VhcmNoZWRNZXRob2QpOworCisJCQkJaWYoZm91bmRNZXRob2RzICE9IG51bGwpIHsKKwkJCQkJaW50IGxlbiA9IGZvdW5kTWV0aG9kcy5sZW5ndGg7CisJCQkJCWlmKGxlbiA9PSAxKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCVNvdXJjZU1ldGhvZCBzb3VyY2VNZXRob2QgPSAoU291cmNlTWV0aG9kKSBmb3VuZE1ldGhvZHNbMF07CisJCQkJCQkJcGFyYW1ldGVyTmFtZXMgPSAoKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBzb3VyY2VNZXRob2QuZ2V0RWxlbWVudEluZm8oKSkuZ2V0QXJndW1lbnROYW1lcygpOworCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkvLyBtZXRob2QgZG9lc24ndCBleGlzdDogaWdub3JlCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHBhcmFtZXRlck5hbWVzOworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kTWV0aG9kcygKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIHR5cGVBcmdUeXBlcywKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsLAorCQlib29sZWFuIHN1cGVyQ2FsbCwKKwkJYm9vbGVhbiBjYW5CZVByZWZpeGVkLAorCQlCaW5kaW5nW10gbWlzc2luZ0VsZW1lbnRzLAorCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMsCisJCWJvb2xlYW4gbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQljaGFyW10gY2FzdGVkUmVjZWl2ZXIsCisJCWludCByZWNlaXZlclN0YXJ0LAorCQlpbnQgcmVjZWl2ZXJFbmQpIHsKKworCQlib29sZWFuIG5vdEluSmF2YWRvYyA9IHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyA9PSAwOworCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCAmJiBub3RJbkphdmFkb2MpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzSW5zaWRlQ2FzZSkKKwkJCXJldHVybjsJCS8vIG5vIG1ldGhvZHMgc2hvdWxkIGJlIHByb3Bvc2VkIGluc2lkZSBjYXNlIGV4cHJlc3Npb24KKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOworCQlpZiAobm90SW5KYXZhZG9jKSB7CisJCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQlmaW5kSW50ZXJmYWNlc01ldGhvZHMoCisJCQkJCXNlbGVjdG9yLAorCQkJCQl0eXBlQXJnVHlwZXMsCisJCQkJCWFyZ1R5cGVzLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCW5ldyBSZWZlcmVuY2VCaW5kaW5nW117Y3VycmVudFR5cGV9LAorCQkJCQlzY29wZSwKKwkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJaW1wbGljaXRDYWxsLAorCQkJCQlzdXBlckNhbGwsCisJCQkJCWNhbkJlUHJlZml4ZWQsCisJCQkJCW1pc3NpbmdFbGVtZW50cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzU3RhcnRzLAorCQkJCQltaXNzaW5nRWxlbWVudHNFbmRzLAorCQkJCQltaXNzaW5nRWxlbWVudHNIYXZlUHJvYmxlbXMsCisJCQkJCWNhc3RlZFJlY2VpdmVyLAorCQkJCQlyZWNlaXZlclN0YXJ0LAorCQkJCQlyZWNlaXZlckVuZCk7CisKKwkJCQljdXJyZW50VHlwZSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJCQl9CisJCX0KKwkJYm9vbGVhbiBoYXNQb3RlbnRpYWxEZWZhdWx0QWJzdHJhY3RNZXRob2RzID0gdHJ1ZTsKKwkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKKworCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJZmluZExvY2FsTWV0aG9kcygKKwkJCQkJc2VsZWN0b3IsCisJCQkJCXR5cGVBcmdUeXBlcywKKwkJCQkJYXJnVHlwZXMsCisJCQkJCW1ldGhvZHMsCisJCQkJCXNjb3BlLAorCQkJCQltZXRob2RzRm91bmQsCisJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQlleGFjdE1hdGNoLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCWltcGxpY2l0Q2FsbCwKKwkJCQkJc3VwZXJDYWxsLAorCQkJCQljYW5CZVByZWZpeGVkLAorCQkJCQltaXNzaW5nRWxlbWVudHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0cywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzRW5kcywKKwkJCQkJbWlzc2luZ0VsZW1lbnRzSGF2ZVByb2JsZW1zLAorCQkJCQljYXN0ZWRSZWNlaXZlciwKKwkJCQkJcmVjZWl2ZXJTdGFydCwKKwkJCQkJcmVjZWl2ZXJFbmQpOworCQkJfQorCisJCQlpZiAoaGFzUG90ZW50aWFsRGVmYXVsdEFic3RyYWN0TWV0aG9kcyAmJgorCQkJCQkoY3VycmVudFR5cGUuaXNBYnN0cmFjdCgpIHx8CisJCQkJCQkJY3VycmVudFR5cGUuaXNUeXBlVmFyaWFibGUoKSB8fAorCQkJCQkJCWN1cnJlbnRUeXBlLmlzSW50ZXJzZWN0aW9uVHlwZSgpIHx8CisJCQkJCQkJY3VycmVudFR5cGUuaXNFbnVtKCkpKXsKKworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwgJiYgY3VycmVudFR5cGUuaXNJbnRlcnNlY3Rpb25UeXBlKCkpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCXN1cGVySW50ZXJmYWNlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKXN1cGVySW50ZXJmYWNlc1tpXS5jYXB0dXJlKGludm9jYXRpb25TY29wZSwgaW52b2NhdGlvblNpdGUuc291cmNlRW5kKCkpOworCQkJCQl9CisJCQkJfQorCisJCQkJZmluZEludGVyZmFjZXNNZXRob2RzKAorCQkJCQlzZWxlY3RvciwKKwkJCQkJdHlwZUFyZ1R5cGVzLAorCQkJCQlhcmdUeXBlcywKKwkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQlzdXBlckludGVyZmFjZXMsCisJCQkJCXNjb3BlLAorCQkJCQltZXRob2RzRm91bmQsCisJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQlleGFjdE1hdGNoLAorCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQlpbXBsaWNpdENhbGwsCisJCQkJCXN1cGVyQ2FsbCwKKwkJCQkJY2FuQmVQcmVmaXhlZCwKKwkJCQkJbWlzc2luZ0VsZW1lbnRzLAorCQkJCQltaXNzaW5nRWxlbWVudHNTdGFydHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c0VuZHMsCisJCQkJCW1pc3NpbmdFbGVtZW50c0hhdmVQcm9ibGVtcywKKwkJCQkJY2FzdGVkUmVjZWl2ZXIsCisJCQkJCXJlY2VpdmVyU3RhcnQsCisJCQkJCXJlY2VpdmVyRW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJaGFzUG90ZW50aWFsRGVmYXVsdEFic3RyYWN0TWV0aG9kcyA9IGZhbHNlOworCQkJfQorCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZE5lc3RlZFR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJYm9vbGVhbiBwcm9wb3NlQWxsTWVtYmVyVHlwZXMsCisJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kKSB7CisJCQorCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlpbnQgdHlwZUxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKKworCQlTb3VyY2VUeXBlQmluZGluZyBuZXh0VHlwZVRvSWdub3JlID0gbnVsbDsKKwkJd2hpbGUgKHNjb3BlICE9IG51bGwpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsKKworCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQljYXNlIFNjb3BlLkJMT0NLX1NDT1BFIDoKKwkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHNjb3BlOworCisJCQkJCW5leHQgOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmxvY2tTY29wZS5zdWJzY29wZUNvdW50OyBpIDwgbGVuZ3RoOyBpKyspIHsKKworCQkJCQkJaWYgKGJsb2NrU2NvcGUuc3Vic2NvcGVzW2ldIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkgeworCQkJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGxvY2FsVHlwZSA9CisJCQkJCQkJCSgoQ2xhc3NTY29wZSkgYmxvY2tTY29wZS5zdWJzY29wZXNbaV0pLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKworCQkJCQkJCWlmICghbG9jYWxUeXBlLmlzQW5vbnltb3VzVHlwZSgpKSB7CisJCQkJCQkJCWlmIChpc0ZvcmJpZGRlbihsb2NhbFR5cGUpKQorCQkJCQkJCQkJY29udGludWUgbmV4dDsKKworCQkJCQkJCQlpZiAodHlwZUxlbmd0aCA+IGxvY2FsVHlwZS5zb3VyY2VOYW1lLmxlbmd0aCkKKwkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModHlwZU5hbWUsIGxvY2FsVHlwZS5zb3VyY2VOYW1lLCBmYWxzZS8qIGlnbm9yZSBjYXNlICovKQorCQkJCQkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godHlwZU5hbWUsIGxvY2FsVHlwZS5zb3VyY2VOYW1lKSkpCisJCQkJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCQkJCWZvciAoaW50IGogPSB0eXBlc0ZvdW5kLnNpemU7IC0taiA+PSAwOykgeworCQkJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZXNGb3VuZC5lbGVtZW50QXQoaik7CisKKwkJCQkJCQkJCWlmIChsb2NhbFR5cGUgPT0gb3RoZXJUeXBlKQorCQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeHRlbmRlZFR5cGUgJiYgbG9jYWxUeXBlLmlzRmluYWwoKSkgY29udGludWUgbmV4dDsKKwkJCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlRXhjbHVkaW5nQW5ub3RhdGlvbiAmJiBsb2NhbFR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJCQkJCQlpZih0aGlzLmFzc2lzdE5vZGVJc0NsYXNzKSB7CisJCQkJCQkJCQlpZighbG9jYWxUeXBlLmlzQ2xhc3MoKSkgY29udGludWUgbmV4dDsKKwkJCQkJCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7CisJCQkJCQkJCQlpZighbG9jYWxUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIWxvY2FsVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7CisJCQkJCQkJCQlpZighbG9jYWxUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKGxvY2FsVHlwZSk7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHR5cGVOYW1lLCBsb2NhbFR5cGUuc291cmNlTmFtZSk7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShsb2NhbFR5cGUpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihsb2NhbFR5cGUuc291cmNlTmFtZSk7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBuZXN0ZWQgdHlwZQorCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb25UYXJnZXQobG9jYWxUeXBlKTsKKworCQkJCQkJCQlib29sZWFuIGFsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzID0gaXNBbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscygpOworCQkJCQkJCQlpZiAoIXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgfHwgIWFsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzIHx8IGhhc0FycmF5VHlwZUFzRXhwZWN0ZWRTdXBlclR5cGVzKCkpIHsKKwkJCQkJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7CisJCQkJCQkJCQkJY3JlYXRlVHlwZVByb3Bvc2FsKAorCQkJCQkJCQkJCQkJbG9jYWxUeXBlLAorCQkJCQkJCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUsCisJCQkJCQkJCQkJCQlJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsCisJCQkJCQkJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSwKKwkJCQkJCQkJCQkJCXJlbGV2YW5jZSwKKwkJCQkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQkJCWZhbHNlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgJiYgYWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMpIHsKKwkJCQkJCQkJCWZpbmRDb25zdHJ1Y3RvcnNPckFub255bW91c1R5cGVzKAorCQkJCQkJCQkJCQlsb2NhbFR5cGUsCisJCQkJCQkJCQkJCWJsb2NrU2NvcGUsCisJCQkJCQkJCQkJCUZha2VJbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nU291cmNlVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCWVuY2xvc2luZ1NvdXJjZVR5cGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJY3VycmVudFR5cGUsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJcHJvcG9zZUFsbE1lbWJlclR5cGVzLAorCQkJCQkJCW5leHRUeXBlVG9JZ25vcmUsCisJCQkJCQkJdHlwZXNGb3VuZCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJbnVsbCwKKwkJCQkJCQlmYWxzZSk7CisJCQkJCW5leHRUeXBlVG9JZ25vcmUgPSBlbmNsb3NpbmdTb3VyY2VUeXBlOworCQkJCQlpZiAodHlwZUxlbmd0aCA9PSAwKQorCQkJCQkJcmV0dXJuOyAvLyBkbyBub3Qgc2VhcmNoIG91dHNpZGUgdGhlIGNsYXNzIHNjb3BlIGlmIG5vIHByZWZpeCB3YXMgcHJvdmlkZWQKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgorCQkJCQlyZXR1cm47CisJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kUGFja2FnZXMoQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSBwYWNrYWdlU3RhdGVtZW50KSB7CisKKwkJdGhpcy5jb21wbGV0aW9uVG9rZW4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZVN0YXRlbWVudC50b2tlbnMsICcuJyk7CisJCWlmICh0aGlzLmNvbXBsZXRpb25Ub2tlbi5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKworCQlzZXRTb3VyY2VSYW5nZShwYWNrYWdlU3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBwYWNrYWdlU3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcGFja2FnZVN0YXRlbWVudC5zb3VyY2VQb3NpdGlvbnNbcGFja2FnZVN0YXRlbWVudC5zb3VyY2VQb3NpdGlvbnMubGVuZ3RoIC0gMV07CisJCXNldFRva2VuUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMoQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0aGlzLmNvbXBsZXRpb25Ub2tlbiksIHRoaXMpOworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kUGFyYW1ldGVyaXplZFR5cGUoVHlwZVJlZmVyZW5jZSByZWYsIFNjb3BlIHNjb3BlKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWYucmVzb2x2ZWRUeXBlOworCQlpZihyZWZCaW5kaW5nICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEZXByZWNhdGlvbiAmJgorCQkJCQlyZWZCaW5kaW5nLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKKwkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQocmVmQmluZGluZykpCisJCQkJcmV0dXJuOworCisJCQlpbnQgYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRTsKKwkJCWlmKHJlZkJpbmRpbmcuaGFzUmVzdHJpY3RlZEFjY2VzcygpKSB7CisJCQkJQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24gPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmdldEFjY2Vzc1Jlc3RyaWN0aW9uKHJlZkJpbmRpbmcpOworCQkJCWlmKGFjY2Vzc1Jlc3RyaWN0aW9uICE9IG51bGwpIHsKKwkJCQkJc3dpdGNoIChhY2Nlc3NSZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSkgeworCQkJCQkJY2FzZSBJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2U6CisJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0ZvcmJpZGRlblJlZmVyZW5jZSkgeworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX05PTl9BQ0NFU1NJQkxFOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJUHJvYmxlbS5EaXNjb3VyYWdlZFJlZmVyZW5jZToKKwkJCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGlzY291cmFnZWRSZWZlcmVuY2UpIHsKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCQlhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19ESVNDT1VSQUdFRDsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcocmVmQmluZGluZy5zb3VyY2VOYW1lLCByZWZCaW5kaW5nLnNvdXJjZU5hbWUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHJlZkJpbmRpbmcpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIHR5cGUgaW4gdGhlIGN1cnJlbnQgdW5pdAorCisJCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQljcmVhdGVUeXBlUHJvcG9zYWwoCisJCQkJCQlyZWZCaW5kaW5nLAorCQkJCQkJcmVmQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQlJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUsCisJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCQkJCQlyZWxldmFuY2UsCisJCQkJCQludWxsLAorCQkJCQkJbnVsbCwKKwkJCQkJCW51bGwsCisJCQkJCQlmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFN1Yk1lbWJlclR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUludm9jYXRpb24sCisJCWJvb2xlYW4gc3RhdGljT25seSwKKwkJYm9vbGVhbiBzdGF0aWNGaWVsZHNBbmRNZXRob2RPbmx5LAorCQlib29sZWFuIGZyb21TdGF0aWNJbXBvcnQsCisJCU9iamVjdFZlY3RvciB0eXBlc0ZvdW5kKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzU3VwZXJUeXBlICYmICF0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSAmJiBpc0ZvcmJpZGRlbihjdXJyZW50VHlwZSkpIHJldHVybjsgLy8gd2UncmUgdHJ5aW5nIHRvIGZpbmQgYSBzdXBlcnR5cGUKKworCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJdHlwZU5hbWUsCisJCQkJY3VycmVudFR5cGUubWVtYmVyVHlwZXMoKSwKKwkJCQl0eXBlc0ZvdW5kLAorCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQl0eXBlSW52b2NhdGlvbiwKKwkJCQlzdGF0aWNPbmx5LAorCQkJCXN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCisJCQkJZnJvbVN0YXRpY0ltcG9ydCwKKwkJCQl0cnVlLAorCQkJCXNjb3BlLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQludWxsLAorCQkJCWZhbHNlKTsKKworCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSByZWNlaXZlclR5cGUubWVtYmVyVHlwZXMoKTsKKwkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5KSB7CisJCQkJaWYgKHR5cGVJbnZvY2F0aW9uICE9IG51bGwgJiYgIW1lbWJlclR5cGVzW2ldLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgdHlwZUludm9jYXRpb24pKSB7CisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfSBlbHNlIGlmKHR5cGVJbnZvY2F0aW9uID09IG51bGwgJiYgIW1lbWJlclR5cGVzW2ldLmNhbkJlU2VlbkJ5KHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWZpbmRTdWJNZW1iZXJUeXBlcygKKwkJCQl0eXBlTmFtZSwKKwkJCQltZW1iZXJUeXBlc1tpXSwKKwkJCQlzY29wZSwKKwkJCQl0eXBlSW52b2NhdGlvbiwKKwkJCQlzdGF0aWNPbmx5LAorCQkJCXN0YXRpY0ZpZWxkc0FuZE1ldGhvZE9ubHksCisJCQkJZnJvbVN0YXRpY0ltcG9ydCwKKwkJCQl0eXBlc0ZvdW5kKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kVHJ1ZU9yRmFsc2VLZXl3b3JkcyhjaGFyW11bXSBjaG9pY2VzKSB7CisJCWlmKGNob2ljZXMgPT0gbnVsbCB8fCBjaG9pY2VzLmxlbmd0aCA9PSAwKSByZXR1cm47CisKKwkJaWYodGhpcy5leHBlY3RlZFR5cGVzUHRyICE9IDAgfHwgdGhpcy5leHBlY3RlZFR5cGVzWzBdICE9IFR5cGVCaW5kaW5nLkJPT0xFQU4pIHJldHVybjsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjaG9pY2VzW2ldLCBLZXl3b3Jkcy5UUlVFKSB8fAorCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhjaG9pY2VzW2ldLCBLZXl3b3Jkcy5GQUxTRSkKKwkJCSl7CisJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSLCBjaG9pY2VzW2ldKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGtleXdvcnMKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKwkJCQlyZWxldmFuY2UgKz0gUl9UUlVFX09SX0ZBTFNFOworCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKKwkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLktFWVdPUkQsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJcHJvcG9zYWwuc2V0TmFtZShjaG9pY2VzW2ldKTsKKwkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjaG9pY2VzW2ldKTsKKwkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFR5cGVQYXJhbWV0ZXJzKGNoYXJbXSB0b2tlbiwgU2NvcGUgc2NvcGUpIHsKKwkJaWYgKHRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOworCisJCVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IG51bGw7CisJCXdoaWxlIChzY29wZSAhPSBudWxsKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKKwkJCXR5cGVQYXJhbWV0ZXJzID0gbnVsbDsKKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIHNjb3BlOworCQkJCQlpZihtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQkJCQkJdHlwZVBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKKwkJCQkJfSBlbHNlIGlmKG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CisJCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQkJCQl0eXBlUGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgorCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgc2NvcGU7CisJCQkJCXR5cGVQYXJhbWV0ZXJzID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LnR5cGVQYXJhbWV0ZXJzOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgorCQkJCQlyZXR1cm47CisJCQl9CisJCQlpZih0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworCQkJCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKKwkJCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CisKKwkJCQkJaWYodHlwZVBhcmFtZXRlci5iaW5kaW5nID09IG51bGwpIGNvbnRpbnVlOworCisJCQkJCWlmICh0eXBlTGVuZ3RoID4gdHlwZVBhcmFtZXRlci5uYW1lLmxlbmd0aCkgY29udGludWU7CisKKwkJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgdHlwZVBhcmFtZXRlci5uYW1lLCBmYWxzZSkKKwkJCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCB0eXBlUGFyYW1ldGVyLm5hbWUpKSkgY29udGludWU7CisKKwkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIHR5cGVQYXJhbWV0ZXIubmFtZSk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZSh0eXBlUGFyYW1ldGVyLnR5cGUgPT0gbnVsbCA/IG51bGwgOnR5cGVQYXJhbWV0ZXIudHlwZS5yZXNvbHZlZFR5cGUpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbih0eXBlUGFyYW1ldGVyLm5hbWUpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm90IHR5cGUgcGFyYW1ldGVyCisKKwkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCQkJY3JlYXRlVHlwZVBhcmFtZXRlclByb3Bvc2FsKHR5cGVQYXJhbWV0ZXIsIHJlbGV2YW5jZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kVHlwZXNBbmRQYWNrYWdlcyhjaGFyW10gdG9rZW4sIFNjb3BlIHNjb3BlLCBib29sZWFuIHByb3Bvc2VCYXNlVHlwZXMsIGJvb2xlYW4gcHJvcG9zZVZvaWRUeXBlLCBPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCkgeworCisJCWlmICh0b2tlbiA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJYm9vbGVhbiBhbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscyA9IGlzQWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMoKTsKKwkJCisJCWJvb2xlYW4gcHJvcG9zZVR5cGUgPQorCQkJIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8CisJCQkoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSk7CisKKwkJYm9vbGVhbiBwcm9wb3NlQWxsTWVtYmVyVHlwZXMgPSAhdGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvcjsKKwkJCisJCWJvb2xlYW4gcHJvcG9zZUNvbnN0cnVjdG9yID0KKwkJCWFsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzICYmCisJCQl0aGlzLmFzc2lzdE5vZGVJc0NvbnN0cnVjdG9yICYmCisJCQkoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB8fAorCQkJCQkhaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSk7CisJCQorCisJCWlmICgocHJvcG9zZVR5cGUgfHwgcHJvcG9zZUNvbnN0cnVjdG9yKSAmJiBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gbnVsbCkgeworCQkJCisJCQljaGVja0NhbmNlbCgpOworCQkJCisJCQlmaW5kTmVzdGVkVHlwZXModG9rZW4sIHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgc2NvcGUsIHByb3Bvc2VBbGxNZW1iZXJUeXBlcywgdHlwZXNGb3VuZCk7CisJCQlpZighdGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UgJiYKKwkJCQkJIXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgJiYKKwkJCQkJIXRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbiAmJgorCQkJCQl0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMCkgeworCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJLy8gZG9uJ3QgcHJvcG9zZSB0eXBlIHBhcmFtZXRlcnMgaWYgdGhlIGNvbXBsZXRpb24gaXMgYSBjb25zdHJ1Y3RvciAoJ25ldyB8JykKKwkJCQlmaW5kVHlwZVBhcmFtZXRlcnModG9rZW4sIHNjb3BlKTsKKwkJCX0KKwkJfQorCisJCWJvb2xlYW4gaXNFbXB0eVByZWZpeCA9IHRva2VuLmxlbmd0aCA9PSAwOworCisJCWlmICgocHJvcG9zZVR5cGUgfHwgcHJvcG9zZUNvbnN0cnVjdG9yKSAmJiB0aGlzLnVuaXRTY29wZSAhPSBudWxsKSB7CisJCQkKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCWlmKG91dGVySW52b2NhdGlvblR5cGUgIT0gbnVsbCkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGVtcCA9IG91dGVySW52b2NhdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJCXdoaWxlKHRlbXAgIT0gbnVsbCkgeworCQkJCQlvdXRlckludm9jYXRpb25UeXBlID0gdGVtcDsKKwkJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJCX0KKwkJCX0KKworCQkJaW50IHR5cGVMZW5ndGggPSB0b2tlbi5sZW5ndGg7CisJCQlTb3VyY2VUeXBlQmluZGluZ1tdIHR5cGVzID0gdGhpcy51bml0U2NvcGUudG9wTGV2ZWxUeXBlczsKKworCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHR5cGVzW2ldOworCisJCQkJaWYoaXNGb3JiaWRkZW4oc291cmNlVHlwZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZihwcm9wb3NlQWxsTWVtYmVyVHlwZXMgJiYKKwkJCQkJc291cmNlVHlwZSAhPSBvdXRlckludm9jYXRpb25UeXBlKSB7CisJCQkJCWZpbmRTdWJNZW1iZXJUeXBlcygKKwkJCQkJCQl0b2tlbiwKKwkJCQkJCQlzb3VyY2VUeXBlLAorCQkJCQkJCXNjb3BlLAorCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQlmYWxzZSwKKwkJCQkJCQlmYWxzZSwKKwkJCQkJCQlmYWxzZSwKKwkJCQkJCQl0eXBlc0ZvdW5kKTsKKwkJCQl9CisKKwkJCQlpZiAoc291cmNlVHlwZS5zb3VyY2VOYW1lID09IENvbXBsZXRpb25QYXJzZXIuRkFLRV9UWVBFX05BTUUpIGNvbnRpbnVlIG5leHQ7CisJCQkJaWYgKHNvdXJjZVR5cGUuc291cmNlTmFtZSA9PSBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKSBjb250aW51ZSBuZXh0OworCisJCQkJaWYgKHR5cGVMZW5ndGggPiBzb3VyY2VUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgc291cmNlVHlwZS5zb3VyY2VOYW1lLCBmYWxzZSkKKwkJCQkJCSYmICEodGhpcy5vcHRpb25zLmNhbWVsQ2FzZU1hdGNoICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSkpKSBjb250aW51ZSBuZXh0OworCisJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbiAmJiAhaGFzUG9zc2libGVBbm5vdGF0aW9uVGFyZ2V0KHNvdXJjZVR5cGUsIHNjb3BlKSkgeworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKworCQkJCWZvciAoaW50IGogPSB0eXBlc0ZvdW5kLnNpemU7IC0taiA+PSAwOykgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChqKTsKKworCQkJCQlpZiAoc291cmNlVHlwZSA9PSBvdGhlclR5cGUpIGNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJCQorCQkJCXR5cGVzRm91bmQuYWRkKHNvdXJjZVR5cGUpOworCisJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlICYmIHNvdXJjZVR5cGUuaXNGaW5hbCgpKSBjb250aW51ZSBuZXh0OworCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZUV4Y2x1ZGluZ0Fubm90YXRpb24gJiYgc291cmNlVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgeworCQkJCQlpZighc291cmNlVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7CisJCQkJCWlmKCFzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIXNvdXJjZVR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7CisJCQkJCWlmKCFzb3VyY2VUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkgY29udGludWUgbmV4dDsKKwkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uKSB7CisJCQkJCSBpZiAoIXNvdXJjZVR5cGUuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OworCQkJCQkgaWYgKGlzRW1wdHlQcmVmaXgpIHsKKwkJCQkJCSBpZiAoc291cmNlVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhTGFuZ1Rocm93YWJsZSwgdHJ1ZSkgPT0gbnVsbCkgeworCQkJCQkJCSBjb250aW51ZSBuZXh0OworCQkJCQkgICAgIH0KKwkJCQkJICB9CisJCQkJfQorCisJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKHNvdXJjZVR5cGUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShzb3VyY2VUeXBlKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgdHlwZSBpbiB0aGUgY3VycmVudCB1bml0CisKKwkJCQlpZiAoc291cmNlVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQW5ub3RhdGlvblRhcmdldChzb3VyY2VUeXBlKTsKKwkJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQkJCX0gZWxzZSBpZihzb3VyY2VUeXBlLmlzQ2xhc3MoKSl7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oc291cmNlVHlwZS5zb3VyY2VOYW1lKTsKKwkJCQl9CisJCQkJCisJCQkJCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYocHJvcG9zZVR5cGUgJiYKKwkJCQkJCSghdGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvciB8fAorCQkJCQkJCQkhYWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMgfHwKKwkJCQkJCQkJaGFzU3RhdGljTWVtYmVyVHlwZXMoc291cmNlVHlwZSwgbnVsbCwgdGhpcy51bml0U2NvcGUpIHx8CisJCQkJCQkJCWhhc01lbWJlclR5cGVzSW5FbmNsb3NpbmdTY29wZShzb3VyY2VUeXBlLCBzY29wZSkpIHx8CisJCQkJCQkJCWhhc0FycmF5VHlwZUFzRXhwZWN0ZWRTdXBlclR5cGVzKCkpIHsKKwkJCQkJY2hhcltdIHR5cGVOYW1lID0gc291cmNlVHlwZS5zb3VyY2VOYW1lKCk7CisJCQkJCWNyZWF0ZVR5cGVQcm9wb3NhbCgKKwkJCQkJCQlzb3VyY2VUeXBlLAorCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCUlBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSwKKwkJCQkJCQl0eXBlTmFtZSwKKwkJCQkJCQlyZWxldmFuY2UsCisJCQkJCQkJbnVsbCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAocHJvcG9zZUNvbnN0cnVjdG9yKSB7CisJCQkJCWZpbmRDb25zdHJ1Y3RvcnNPckFub255bW91c1R5cGVzKAorCQkJCQkJCXNvdXJjZVR5cGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJRmFrZUludm9jYXRpb25TaXRlLAorCQkJCQkJCWZhbHNlLAorCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHByb3Bvc2VDb25zdHJ1Y3RvciAmJiAhaXNFbXB0eVByZWZpeCkgeworCQkJCisJCQljaGVja0NhbmNlbCgpOworCQkJCisJCQlmaW5kVHlwZXNGcm9tSW1wb3J0cyh0b2tlbiwgc2NvcGUsIHByb3Bvc2VUeXBlLCB0eXBlc0ZvdW5kKTsKKwkJfSBlbHNlIGlmKHByb3Bvc2VUeXBlKSB7CisJCQkKKwkJCWNoZWNrQ2FuY2VsKCk7CisJCQkKKwkJCWZpbmRUeXBlc0Zyb21TdGF0aWNJbXBvcnRzKHRva2VuLCBzY29wZSwgcHJvcG9zZUFsbE1lbWJlclR5cGVzLCB0eXBlc0ZvdW5kKTsKKwkJfQorCQkKKwkJaWYgKHByb3Bvc2VDb25zdHJ1Y3RvcikgeworCQkJCisJCQljaGVja0NhbmNlbCgpOworCQkJCisJCQlmaW5kVHlwZXNGcm9tRXhwZWN0ZWRUeXBlcyh0b2tlbiwgc2NvcGUsIHR5cGVzRm91bmQsIHByb3Bvc2VUeXBlLCBwcm9wb3NlQ29uc3RydWN0b3IpOworCQl9CisKKwkJaWYgKGlzRW1wdHlQcmVmaXggJiYgIXRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgeworCQkJaWYgKCFwcm9wb3NlQ29uc3RydWN0b3IpIHsKKwkJCQlmaW5kVHlwZXNGcm9tRXhwZWN0ZWRUeXBlcyh0b2tlbiwgc2NvcGUsIHR5cGVzRm91bmQsIHByb3Bvc2VUeXBlLCBwcm9wb3NlQ29uc3RydWN0b3IpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYoIWlzRW1wdHlQcmVmaXggJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCkpIHsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jID09IDAgfHwgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuQkFTRV9UWVBFUykgIT0gMCkgeworCQkJCQlpZiAocHJvcG9zZUJhc2VUeXBlcykgeworCQkJCQkJaWYgKHByb3Bvc2VWb2lkVHlwZSkgeworCQkJCQkJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgQkFTRV9UWVBFX05BTUVTLCBmYWxzZSwgZmFsc2UpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmaW5kS2V5d29yZHModG9rZW4sIEJBU0VfVFlQRV9OQU1FU19XSVRIT1VUX1ZPSUQsIGZhbHNlLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChwcm9wb3NlQ29uc3RydWN0b3IpIHsKKwkJCQlpbnQgbCA9IHR5cGVzRm91bmQuc2l6ZSgpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUZvdW5kID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVzRm91bmQuZWxlbWVudEF0KGkpOworCQkJCQljaGFyW10gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9CisJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCQkJdHlwZUZvdW5kLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCQkJCXR5cGVGb3VuZC5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQkJCScuJyk7CisJCQkJCXRoaXMua25vd25UeXBlcy5wdXQoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSwgS05PV05fVFlQRV9XSVRIX0tOT1dOX0NPTlNUUlVDVE9SUyk7CisJCQkJfQorCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJdGhpcy5mb3VuZENvbnN0cnVjdG9yc0NvdW50ID0gMDsKKwkJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kQ29uc3RydWN0b3JEZWNsYXJhdGlvbnMoCisJCQkJCQl0b2tlbiwKKwkJCQkJCXRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLm1vbml0b3IpOworCQkJCWFjY2VwdENvbnN0cnVjdG9ycyhzY29wZSk7CisJCQl9IGVsc2UgaWYgKHByb3Bvc2VUeXBlKSB7CisJCQkJaW50IGwgPSB0eXBlc0ZvdW5kLnNpemUoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVGb3VuZCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPQorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJCXR5cGVGb3VuZC5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJCQl0eXBlRm91bmQucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQkJCQknLicpOworCQkJCQl0aGlzLmtub3duVHlwZXMucHV0KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUsIEtOT1dOX1RZUEVfV0lUSF9LTk9XTl9DT05TVFJVQ1RPUlMpOworCQkJCX0KKwkJCQlpbnQgc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRTsKKwkJCQlpZih0aGlzLmFzc2lzdE5vZGVJc0NsYXNzIHx8IHRoaXMuYXNzaXN0Tm9kZUlzRXhjZXB0aW9uKSB7CisJCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTOworCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uKSB7CisJCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTsKKwkJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UpIHsKKwkJCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFX0FORF9BTk5PVEFUSU9OOworCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0VudW0pIHsKKwkJCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuRU5VTTsKKwkJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7CisJCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkFOTk9UQVRJT05fVFlQRTsKKwkJCQl9CisJCQkJCisJCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQkKKwkJCQl0aGlzLmZvdW5kVHlwZXNDb3VudCA9IDA7CisJCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKAorCQkJCQkJdG9rZW4sCisJCQkJCQlwcm9wb3NlQWxsTWVtYmVyVHlwZXMsCisJCQkJCQl0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2gsCisJCQkJCQlzZWFyY2hGb3IsCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5tb25pdG9yKTsKKwkJCQlhY2NlcHRUeXBlcyhzY29wZSk7CisJCQl9CisJCQlpZighaXNFbXB0eVByZWZpeCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKKwkJCQkKKwkJCQljaGVja0NhbmNlbCgpOworCQkJCQorCQkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyh0b2tlbiwgdGhpcyk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFR5cGVzQW5kU3VicGFja2FnZXMoCisJCWNoYXJbXSB0b2tlbiwKKwkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcsCisJCVNjb3BlIHNjb3BlKSB7CisJCQorCQlib29sZWFuIGFsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzID0gaXNBbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscygpOworCisJCWJvb2xlYW4gcHJvcG9zZVR5cGUgPQorCQkJIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHx8CisJCQkoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSk7CisJCQorCQlib29sZWFuIHByb3Bvc2VDb25zdHJ1Y3RvciA9CisJCQlhbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscyAmJgorCQkJdGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvciAmJgorCQkJKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikgfHwKKwkJCQkJIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpOworCisJCWNoYXJbXSBxdWFsaWZpZWROYW1lID0KKwkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUsIHRva2VuLCAnLicpOworCisJCWlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmxlbmd0aCA9PSAwKSB7CisJCQlpbnQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXF1YWxpZmllZE5hbWUsCisJCQkJMCwKKwkJCQlxdWFsaWZpZWROYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOworCQkJcXVhbGlmaWVkTmFtZVtsZW5ndGhdID0gJy4nOworCQl9CisKKwkJdGhpcy5xdWFsaWZpZWRDb21wbGV0aW9uVG9rZW4gPSBxdWFsaWZpZWROYW1lOworCisJCWlmICgocHJvcG9zZVR5cGUgfHwgcHJvcG9zZUNvbnN0cnVjdG9yKSAmJiB0aGlzLnVuaXRTY29wZSAhPSBudWxsKSB7CisJCQlpbnQgdHlwZUxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOworCQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9IHRoaXMudW5pdFNjb3BlLnRvcExldmVsVHlwZXM7CisKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHR5cGVzW2ldOworCQkJCQorCQkJCWlmIChpc0ZvcmJpZGRlbihzb3VyY2VUeXBlKSkgY29udGludWU7CisJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MgJiYgc291cmNlVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZTsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UgJiYgc291cmNlVHlwZS5pc0NsYXNzKCkpIGNvbnRpbnVlOworCisJCQkJY2hhcltdIHF1YWxpZmllZFNvdXJjZVR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHNvdXJjZVR5cGUuY29tcG91bmROYW1lLCAnLicpOworCisJCQkJaWYgKHNvdXJjZVR5cGUuc291cmNlTmFtZSA9PSBDb21wbGV0aW9uUGFyc2VyLkZBS0VfVFlQRV9OQU1FKSBjb250aW51ZTsKKwkJCQlpZiAoc291cmNlVHlwZS5zb3VyY2VOYW1lID09IFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUUpIGNvbnRpbnVlOworCQkJCWlmICh0eXBlTGVuZ3RoID4gcXVhbGlmaWVkU291cmNlVHlwZU5hbWUubGVuZ3RoKSBjb250aW51ZTsKKwkJCQlpZiAoIShwYWNrYWdlQmluZGluZyA9PSBzb3VyY2VUeXBlLmdldFBhY2thZ2UoKSkpIGNvbnRpbnVlOworCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWROYW1lLCBxdWFsaWZpZWRTb3VyY2VUeXBlTmFtZSwgZmFsc2UpCisJCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUpKSkJY29udGludWU7CisKKwkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKKwkJCQkJCXNvdXJjZVR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJgorCQkJCQkJIXNjb3BlLmlzRGVmaW5lZEluU2FtZVVuaXQoc291cmNlVHlwZSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkgICAgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlICYmIHNvdXJjZVR5cGUuaXNGaW5hbCgpKSBjb250aW51ZTsKKwkJCSAgICBpZiAodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uICYmIHNvdXJjZVR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZTsKKwkJCQlpbnQgYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRTsKKwkJCQlpZihzb3VyY2VUeXBlLmhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSkgeworCQkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbiA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuZ2V0QWNjZXNzUmVzdHJpY3Rpb24oc291cmNlVHlwZSk7CisJCQkJCWlmKGFjY2Vzc1Jlc3RyaWN0aW9uICE9IG51bGwpIHsKKwkJCQkJCXN3aXRjaCAoYWNjZXNzUmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkpIHsKKwkJCQkJCQljYXNlIElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZToKKwkJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0ZvcmJpZGRlblJlZmVyZW5jZSkgeworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgSVByb2JsZW0uRGlzY291cmFnZWRSZWZlcmVuY2U6CisJCQkJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEaXNjb3VyYWdlZFJlZmVyZW5jZSkgeworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfRElTQ09VUkFHRUQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJdGhpcy5rbm93blR5cGVzLnB1dChDaGFyT3BlcmF0aW9uLmNvbmNhdChzb3VyY2VUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHNvdXJjZVR5cGUuc291cmNlTmFtZSgpLCAnLicpLCBLTk9XTl9UWVBFX1dJVEhfS05PV05fQ09OU1RSVUNUT1JTKTsKKworCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChzb3VyY2VUeXBlKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhxdWFsaWZpZWROYW1lLCBxdWFsaWZpZWRTb3VyY2VUeXBlTmFtZSk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHNvdXJjZVR5cGUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoYWNjZXNzaWJpbGl0eSk7CisKKwkJCQlpZiAoc291cmNlVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uKCk7CisJCQkJfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNDbGFzcygpKSB7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oc291cmNlVHlwZS5zb3VyY2VOYW1lKTsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYocHJvcG9zZVR5cGUgJiYKKwkJCQkJCSghdGhpcy5hc3Npc3ROb2RlSXNDb25zdHJ1Y3RvciB8fAorCQkJCQkJCQkhYWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMgfHwKKwkJCQkJCQkJaGFzU3RhdGljTWVtYmVyVHlwZXMoc291cmNlVHlwZSwgbnVsbCwgdGhpcy51bml0U2NvcGUpIHx8CisJCQkJCQkJCWhhc01lbWJlclR5cGVzSW5FbmNsb3NpbmdTY29wZShzb3VyY2VUeXBlLCBzY29wZSkpIHx8CisJCQkJCQkJCWhhc0FycmF5VHlwZUFzRXhwZWN0ZWRTdXBlclR5cGVzKCkpIHsKKwkJCQkJY2hhcltdIHR5cGVOYW1lID0gc291cmNlVHlwZS5zb3VyY2VOYW1lKCk7CisJCQkJCWNyZWF0ZVR5cGVQcm9wb3NhbCgKKwkJCQkJCQlzb3VyY2VUeXBlLAorCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCUlBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSwKKwkJCQkJCQl0eXBlTmFtZSwKKwkJCQkJCQlyZWxldmFuY2UsCisJCQkJCQkJbnVsbCwKKwkJCQkJCQludWxsLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAocHJvcG9zZUNvbnN0cnVjdG9yKSB7CisJCQkJCWZpbmRDb25zdHJ1Y3RvcnNPckFub255bW91c1R5cGVzKAorCQkJCQkJCXNvdXJjZVR5cGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJRmFrZUludm9jYXRpb25TaXRlLAorCQkJCQkJCWZhbHNlLAorCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHByb3Bvc2VDb25zdHJ1Y3RvcikgeworCisJCQkKKwkJCWNoZWNrQ2FuY2VsKCk7CisJCQkKKwkJCXRoaXMuZm91bmRDb25zdHJ1Y3RvcnNDb3VudCA9IDA7CisJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kQ29uc3RydWN0b3JEZWNsYXJhdGlvbnMoCisJCQkJCXF1YWxpZmllZE5hbWUsCisJCQkJCXRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCwKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5tb25pdG9yKTsKKwkJCWFjY2VwdENvbnN0cnVjdG9ycyhzY29wZSk7CisJCX0gaWYocHJvcG9zZVR5cGUpIHsKKwkJCWludCBzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFOworCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgeworCQkJCXNlYXJjaEZvciA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTOworCQkJfSBlbHNlIGlmICh0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZUV4Y2x1ZGluZ0Fubm90YXRpb24pIHsKKwkJCQlzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0U7CisJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2UpIHsKKwkJCQlzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0VfQU5EX0FOTk9UQVRJT047CisJCQl9IGVsc2UgaWYodGhpcy5hc3Npc3ROb2RlSXNFbnVtKSB7CisJCQkJc2VhcmNoRm9yID0gSUphdmFTZWFyY2hDb25zdGFudHMuRU5VTTsKKwkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0Fubm90YXRpb24pIHsKKwkJCQlzZWFyY2hGb3IgPSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEU7CisJCQl9CisJCQkKKwkJCWNoZWNrQ2FuY2VsKCk7CisJCQkKKwkJCXRoaXMuZm91bmRUeXBlc0NvdW50ID0gMDsKKwkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlcygKKwkJCQkJcXVhbGlmaWVkTmFtZSwKKwkJCQkJZmFsc2UsCisJCQkJCXRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCwKKwkJCQkJc2VhcmNoRm9yLAorCQkJCQl0aGlzLAorCQkJCQl0aGlzLm1vbml0b3IpOworCQkJYWNjZXB0VHlwZXMoc2NvcGUpOworCQl9CisJCQorCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRikpIHsKKwkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyhxdWFsaWZpZWROYW1lLCB0aGlzKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgZmluZFR5cGVzRnJvbUV4cGVjdGVkVHlwZXMoY2hhcltdIHRva2VuLCBTY29wZSBzY29wZSwgT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQsIGJvb2xlYW4gcHJvcG9zZVR5cGUsIGJvb2xlYW4gcHJvcG9zZUNvbnN0cnVjdG9yKSB7CisJCWlmKHRoaXMuZXhwZWN0ZWRUeXBlc1B0ciA+IC0xKSB7CisJCQlib29sZWFuIGFsbG93aW5nTG9uZ0NvbXB1dGF0aW9uUHJvcG9zYWxzID0gaXNBbGxvd2luZ0xvbmdDb21wdXRhdGlvblByb3Bvc2FscygpOworCQkJCisJCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuID09IG51bGwgPyAwIDogdG9rZW4ubGVuZ3RoOworCQkJCisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5leHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQkKKwkJCQljaGVja0NhbmNlbCgpOworCQkJCQorCQkJCWlmKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyByZWZCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5leHBlY3RlZFR5cGVzW2ldOworCQkJCQkKKwkJCQkJaWYgKHR5cGVMZW5ndGggPiAwKSB7CisJCQkJCQlpZiAodHlwZUxlbmd0aCA+IHJlZkJpbmRpbmcuc291cmNlTmFtZS5sZW5ndGgpIGNvbnRpbnVlIG5leHQ7CisJCisJCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCByZWZCaW5kaW5nLnNvdXJjZU5hbWUsIGZhbHNlKQorCQkJCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCByZWZCaW5kaW5nLnNvdXJjZU5hbWUpKSkgY29udGludWUgbmV4dDsKKwkJCQkJfQorCisKKwkJCQkJaWYocmVmQmluZGluZy5pc1R5cGVWYXJpYWJsZSgpICYmIHRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IpIHsKKwkJCQkJCS8vIGRvbid0IHByb3Bvc2UgdHlwZSB2YXJpYWJsZSBpZiB0aGUgY29tcGxldGlvbiBpcyBhIGNvbnN0cnVjdG9yICgnbmV3IHwnKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5vcHRpb25zLmNoZWNrRGVwcmVjYXRpb24gJiYKKwkJCQkJCQlyZWZCaW5kaW5nLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYKKwkJCQkJCQkhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZCaW5kaW5nKSkKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaW50IGFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEU7CisJCQkJCWlmKHJlZkJpbmRpbmcuaGFzUmVzdHJpY3RlZEFjY2VzcygpKSB7CisJCQkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbiA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuZ2V0QWNjZXNzUmVzdHJpY3Rpb24ocmVmQmluZGluZyk7CisJCQkJCQlpZihhY2Nlc3NSZXN0cmljdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJc3dpdGNoIChhY2Nlc3NSZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSkgeworCQkJCQkJCQljYXNlIElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZToKKwkJCQkJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tGb3JiaWRkZW5SZWZlcmVuY2UpIHsKKwkJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQkJfQorCQkJCQkJCQkJYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBJUHJvYmxlbS5EaXNjb3VyYWdlZFJlZmVyZW5jZToKKwkJCQkJCQkJCWlmICh0aGlzLm9wdGlvbnMuY2hlY2tEaXNjb3VyYWdlZFJlZmVyZW5jZSkgeworCQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19ESVNDT1VSQUdFRDsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZihpc0ZvcmJpZGRlbihyZWZCaW5kaW5nKSkgY29udGludWUgbmV4dDsKKworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzRm91bmQuc2l6ZSgpOyBqKyspIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUZvdW5kID0gKFJlZmVyZW5jZUJpbmRpbmcpdHlwZXNGb3VuZC5lbGVtZW50QXQoaik7CisJCQkJCQlpZiAodHlwZUZvdW5kID09IHJlZkJpbmRpbmcuZXJhc3VyZSgpKSB7CisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJdHlwZXNGb3VuZC5hZGQocmVmQmluZGluZyk7CisKKwkJCQkJYm9vbGVhbiBpblNhbWVVbml0ID0gdGhpcy51bml0U2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZCaW5kaW5nKTsKKworCQkJCQkvLyB0b3AgbGV2ZWwgdHlwZXMgb2YgdGhlIGN1cnJlbnQgdW5pdCBhcmUgYWxyZWFkeSBwcm9wb3NlZC4KKwkJCQkJaWYoIWluU2FtZVVuaXQgfHwgKGluU2FtZVVuaXQgJiYgcmVmQmluZGluZy5pc01lbWJlclR5cGUoKSkpIHsKKwkJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCWNoYXJbXSB0eXBlTmFtZSA9IHJlZkJpbmRpbmcuc291cmNlTmFtZSgpOworCQkJCQkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gdHlwZU5hbWU7CisKKwkJCQkJCWJvb2xlYW4gaXNRdWFsaWZpZWQgPSBmYWxzZTsKKwkJCQkJCWlmICghdGhpcy5pbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgJiYgIXJlZkJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCQkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgbnVsbCwgcmVmQmluZGluZy5tb2RpZmllcnMpKSB7CisJCQkJCQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJCQkJCQkJaWYgKHRoaXMudW5pdFNjb3BlICE9IG51bGwgJiYgdGhpcy51bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKQorCQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CisJCQkJCQkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOworCQkJCQkJCQlpc1F1YWxpZmllZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNFeHRlbmRlZFR5cGUgJiYgcmVmQmluZGluZy5pc0ZpbmFsKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQlpZiAodGhpcy5hc3Npc3ROb2RlSXNJbnRlcmZhY2VFeGNsdWRpbmdBbm5vdGF0aW9uICYmIHJlZkJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJCQkJaWYodGhpcy5hc3Npc3ROb2RlSXNDbGFzcykgeworCQkJCQkJCWlmKCFyZWZCaW5kaW5nLmlzQ2xhc3MoKSkgY29udGludWUgbmV4dDsKKwkJCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgeworCQkJCQkJCWlmKCFyZWZCaW5kaW5nLmlzSW50ZXJmYWNlKCkgJiYgIXJlZkJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZSBuZXh0OworCQkJCQkJfSBlbHNlIGlmICh0aGlzLmFzc2lzdE5vZGVJc0Fubm90YXRpb24pIHsKKwkJCQkJCQlpZighcmVmQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQl9CisKKwkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwocmVmQmluZGluZyk7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgdHlwZU5hbWUpOworCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHJlZkJpbmRpbmcpOworCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGlzUXVhbGlmaWVkKTsKKwkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOworCisJCQkJCQlpZihyZWZCaW5kaW5nLmlzQ2xhc3MoKSkgeworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbih0eXBlTmFtZSk7CisJCQkJCQl9IGVsc2UgaWYocmVmQmluZGluZy5pc0VudW0oKSkgeworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bSgpOworCQkJCQkJfSBlbHNlIGlmKHJlZkJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChwcm9wb3NlVHlwZSAmJgorCQkJCQkJCQkoIXRoaXMuYXNzaXN0Tm9kZUlzQ29uc3RydWN0b3IgfHwKKwkJCQkJCQkJCQkhYWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMgfHwKKwkJCQkJCQkJCQloYXNTdGF0aWNNZW1iZXJUeXBlcyhyZWZCaW5kaW5nLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgLHRoaXMudW5pdFNjb3BlKSkgfHwKKwkJCQkJCQkJCQloYXNBcnJheVR5cGVBc0V4cGVjdGVkU3VwZXJUeXBlcygpKSB7CisJCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7CisJCQkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVmQmluZGluZykpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uTmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKHJlZkJpbmRpbmcubW9kaWZpZXJzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0QWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5KTsKKwkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChwcm9wb3NlQ29uc3RydWN0b3IpIHsKKwkJCQkJCQlmaW5kQ29uc3RydWN0b3JzT3JBbm9ueW1vdXNUeXBlcygKKwkJCQkJCQkJCXJlZkJpbmRpbmcsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCUZha2VJbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCWlzUXVhbGlmaWVkLAorCQkJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kVHlwZXNGcm9tSW1wb3J0cyhjaGFyW10gdG9rZW4sIFNjb3BlIHNjb3BlLCBib29sZWFuIHByb3Bvc2VUeXBlLCBPYmplY3RWZWN0b3IgdHlwZXNGb3VuZCkgeworCQlJbXBvcnRCaW5kaW5nW10gaW1wb3J0QmluZGluZ3MgPSBzY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLmltcG9ydHM7CisJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7CisJCQlJbXBvcnRCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBpbXBvcnRCaW5kaW5nc1tpXTsKKwkJCWlmKGltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCUJpbmRpbmcgYmluZGluZyA9IGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQ7CisJCQkJaWYoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlpZihpbXBvcnRCaW5kaW5nLm9uRGVtYW5kKSB7CisJCQkJCQlpZiAoaW1wb3J0QmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJaWYoKGJpbmRpbmcua2luZCgpICYgQmluZGluZy5UWVBFKSAhPSAwKSB7CisJCQkJCQkJCXRoaXMuZmluZE1lbWJlclR5cGVzKAorCQkJCQkJCQkJCXRva2VuLAorCQkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nLAorCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwKKwkJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQkJdHJ1ZSwKKwkJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJCXR5cGVzRm91bmQsCisJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQkJZmFsc2UpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLlRZUEUpICE9IDApIHsKKwkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCQkJaW50IHR5cGVMZW5ndGggPSB0b2tlbi5sZW5ndGg7CisKKwkJCQkJCQlpZiAoIXR5cGVCaW5kaW5nLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCQkJCQlpZiAodHlwZUxlbmd0aCA+IHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUubGVuZ3RoKQljb250aW51ZSBuZXh0OworCisJCQkJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgdHlwZUJpbmRpbmcuc291cmNlTmFtZSwgZmFsc2UpCisJCQkJCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCB0eXBlQmluZGluZy5zb3VyY2VOYW1lKSkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCisJCQkJCQkJaW50IGFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEU7CisJCQkJCQkJaWYodHlwZUJpbmRpbmcuaGFzUmVzdHJpY3RlZEFjY2VzcygpKSB7CisJCQkJCQkJCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC5nZXRBY2Nlc3NSZXN0cmljdGlvbih0eXBlQmluZGluZyk7CisJCQkJCQkJCWlmKGFjY2Vzc1Jlc3RyaWN0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkJCXN3aXRjaCAoYWNjZXNzUmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkpIHsKKwkJCQkJCQkJCQljYXNlIElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZToKKwkJCQkJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0ZvcmJpZGRlblJlZmVyZW5jZSkgeworCQkJCQkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQlhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19OT05fQUNDRVNTSUJMRTsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBJUHJvYmxlbS5EaXNjb3VyYWdlZFJlZmVyZW5jZToKKwkJCQkJCQkJCQkJaWYgKHRoaXMub3B0aW9ucy5jaGVja0Rpc2NvdXJhZ2VkUmVmZXJlbmNlKSB7CisJCQkJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWFjY2Vzc2liaWxpdHkgPSBJQWNjZXNzUnVsZS5LX0RJU0NPVVJBR0VEOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQlpZiAodHlwZXNGb3VuZC5jb250YWlucyh0eXBlQmluZGluZykpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQkJCisJCQkJCQkJdHlwZXNGb3VuZC5hZGQodHlwZUJpbmRpbmcpOworCQkJCQkJCQorCQkJCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0V4dGVuZGVkVHlwZSAmJiB0eXBlQmluZGluZy5pc0ZpbmFsKCkpIGNvbnRpbnVlOworCQkJCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZUV4Y2x1ZGluZ0Fubm90YXRpb24gJiYgdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZTsKKwkJCQkJCQlpZih0aGlzLmFzc2lzdE5vZGVJc0NsYXNzKSB7CisJCQkJCQkJCWlmKCF0eXBlQmluZGluZy5pc0NsYXNzKCkpIGNvbnRpbnVlOworCQkJCQkJCX0gZWxzZSBpZih0aGlzLmFzc2lzdE5vZGVJc0ludGVyZmFjZSkgeworCQkJCQkJCQlpZighdHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSAmJiAhdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZUlzQW5ub3RhdGlvbikgeworCQkJCQkJCQlpZighdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSBjb250aW51ZTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXNvbHV0aW9uKCk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKHR5cGVCaW5kaW5nKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgdHlwZUJpbmRpbmcuc291cmNlTmFtZSk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHR5cGVCaW5kaW5nKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOworCQkJCisJCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkgeworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb24oKTsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JBbm5vdGF0aW9uVGFyZ2V0KHR5cGVCaW5kaW5nKTsKKwkJCQkJCQl9IGVsc2UgaWYgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQkJCQl9IGVsc2UgaWYodHlwZUJpbmRpbmcuaXNDbGFzcygpKXsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbih0eXBlQmluZGluZy5zb3VyY2VOYW1lKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJaWYgKHByb3Bvc2VUeXBlICYmIAorCQkJCQkJCQkJKGhhc1N0YXRpY01lbWJlclR5cGVzKHR5cGVCaW5kaW5nLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIHRoaXMudW5pdFNjb3BlKSB8fCBoYXNBcnJheVR5cGVBc0V4cGVjdGVkU3VwZXJUeXBlcygpKSkgeworCQkJCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7CisJCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHR5cGVCaW5kaW5nLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZSh0eXBlQmluZGluZykpOworCQkJCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUodHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbih0eXBlQmluZGluZy5zb3VyY2VOYW1lKCkpOworCQkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3ModHlwZUJpbmRpbmcubW9kaWZpZXJzKTsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJZmluZENvbnN0cnVjdG9yc09yQW5vbnltb3VzVHlwZXMoCisJCQkJCQkJCQl0eXBlQmluZGluZywKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJRmFrZUludm9jYXRpb25TaXRlLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBmaW5kVHlwZXNGcm9tU3RhdGljSW1wb3J0cyhjaGFyW10gdG9rZW4sIFNjb3BlIHNjb3BlLCBib29sZWFuIHByb3Bvc2VBbGxNZW1iZXJUeXBlcywgT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQpIHsKKwkJSW1wb3J0QmluZGluZ1tdIGltcG9ydEJpbmRpbmdzID0gc2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKS5pbXBvcnRzOworCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7CisJCQlJbXBvcnRCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBpbXBvcnRCaW5kaW5nc1tpXTsKKwkJCWlmKGltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSAmJiBpbXBvcnRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQlCaW5kaW5nIGJpbmRpbmcgPSBpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0OworCQkJCWlmKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJaWYoaW1wb3J0QmluZGluZy5vbkRlbWFuZCkgeworCQkJCQkJaWYoKGJpbmRpbmcua2luZCgpICYgQmluZGluZy5UWVBFKSAhPSAwKSB7CisJCQkJCQkJdGhpcy5maW5kTWVtYmVyVHlwZXMoCisJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nLAorCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQlzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJdHJ1ZSwKKwkJCQkJCQkJCXByb3Bvc2VBbGxNZW1iZXJUeXBlcywKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQl0eXBlc0ZvdW5kLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJZmFsc2UpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChiaW5kaW5nLmtpbmQoKSAmIEJpbmRpbmcuVFlQRSkgIT0gMCkgeworCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKKwkJCQkJCQlpbnQgdHlwZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKKworCQkJCQkJCWlmICghdHlwZUJpbmRpbmcuaXNTdGF0aWMoKSkgY29udGludWU7CisKKwkJCQkJCQlpZiAodHlwZUxlbmd0aCA+IHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUubGVuZ3RoKQljb250aW51ZTsKKworCQkJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUsIGZhbHNlKQorCQkJCQkJCQkJJiYgISh0aGlzLm9wdGlvbnMuY2FtZWxDYXNlTWF0Y2ggJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0b2tlbiwgdHlwZUJpbmRpbmcuc291cmNlTmFtZSkpKQljb250aW51ZTsKKworCQkJCQkJCWlmICh0eXBlc0ZvdW5kLmNvbnRhaW5zKHR5cGVCaW5kaW5nKSkgIGNvbnRpbnVlOworCisJCQkJCQkJdHlwZXNGb3VuZC5hZGQodHlwZUJpbmRpbmcpOworCisJCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzRXh0ZW5kZWRUeXBlICYmIHR5cGVCaW5kaW5nLmlzRmluYWwoKSkgY29udGludWU7CisJCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlRXhjbHVkaW5nQW5ub3RhdGlvbiAmJiB0eXBlQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlOworCQkJCQkJCWlmKHRoaXMuYXNzaXN0Tm9kZUlzQ2xhc3MgfHwgdGhpcy5hc3Npc3ROb2RlSXNFeGNlcHRpb24pIHsKKwkJCQkJCQkJaWYoIXR5cGVCaW5kaW5nLmlzQ2xhc3MoKSkgY29udGludWU7CisJCQkJCQkJfSBlbHNlIGlmKHRoaXMuYXNzaXN0Tm9kZUlzSW50ZXJmYWNlKSB7CisJCQkJCQkJCWlmKCF0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpICYmICF0eXBlQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlOworCQkJCQkJCX0gZWxzZSBpZiAodGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uKSB7CisJCQkJCQkJCWlmKCF0eXBlQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIGNvbnRpbnVlOworCQkJCQkJCX0KKworCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCh0eXBlQmluZGluZyk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZSh0eXBlQmluZGluZyk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworCisJCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSkgeworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKHR5cGVCaW5kaW5nLnNvdXJjZU5hbWUpOworCQkJCQkJCX0gZWxzZSBpZih0eXBlQmluZGluZy5pc0VudW0oKSkgeworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW0oKTsKKwkJCQkJCQl9IGVsc2UgaWYodHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQkJCQkJCX0KKworCQkJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQkJCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUodHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZUJpbmRpbmcpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUodHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24odHlwZUJpbmRpbmcuc291cmNlTmFtZSgpKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3ModHlwZUJpbmRpbmcubW9kaWZpZXJzKTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFVucmVzb2x2ZWRSZWZlcmVuY2UoaW50IGNvbXBsZXRlZE5hbWVTdGFydCwgaW50IGNvbXBsZXRlZE5hbWVFbmQsIEJsb2NrU2NvcGUgc2NvcGUsIGNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMpIHsKKwkJY2hhcltdW10gZm91bmROYW1lcyA9IGZpbmRVbnJlc29sdmVkUmVmZXJlbmNlQmVmb3JlKGNvbXBsZXRlZE5hbWVTdGFydCAtIDEsIGNvbXBsZXRlZE5hbWVFbmQsIHNjb3BlLCBkaXNjb3VyYWdlZE5hbWVzKTsKKwkJaWYgKGZvdW5kTmFtZXMgIT0gbnVsbCAmJiBmb3VuZE5hbWVzLmxlbmd0aCA+IDEpIHsKKwkJCWludCBkaXNjb3VyYWdlZE5hbWVzTGVuZ3RoID0gZGlzY291cmFnZWROYW1lcy5sZW5ndGg7CisJCQlpbnQgZm91bmROYW1lc0xlbmd0aCA9IGZvdW5kTmFtZXMubGVuZ3RoOworCQkJaW50IG5ld0xlbmd0aCA9IGRpc2NvdXJhZ2VkTmFtZXNMZW5ndGggKyBmb3VuZE5hbWVzTGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShkaXNjb3VyYWdlZE5hbWVzLCAwLCBkaXNjb3VyYWdlZE5hbWVzID0gbmV3IGNoYXJbbmV3TGVuZ3RoXVtdLCAwLCBkaXNjb3VyYWdlZE5hbWVzTGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZm91bmROYW1lcywgMCwgZGlzY291cmFnZWROYW1lcywgZGlzY291cmFnZWROYW1lc0xlbmd0aCwgZm91bmROYW1lc0xlbmd0aCk7CisJCX0KKwkJZmluZFVucmVzb2x2ZWRSZWZlcmVuY2VBZnRlcihjb21wbGV0ZWROYW1lRW5kICsgMSwgc2NvcGUsIGRpc2NvdXJhZ2VkTmFtZXMpOworCX0KKworCXByaXZhdGUgY2hhcltdW10gZmluZFVucmVzb2x2ZWRSZWZlcmVuY2VBZnRlcihpbnQgZnJvbSwgQmxvY2tTY29wZSBzY29wZSwgZmluYWwgY2hhcltdW10gZGlzY291cmFnZWROYW1lcykgeworCQlmaW5hbCBBcnJheUxpc3QgcHJvcG9zZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5VbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yID0KKwkJCW5ldyBVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5VbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lKGNoYXJbXSBuYW1lKSB7CisJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5hY2NlcHRVbnJlc29sdmVkTmFtZShuYW1lKTsKKwkJCQkJcHJvcG9zZWROYW1lcy5hZGQobmFtZSk7CisJCQkJfQorCQkJfTsKKworCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7CisJCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXJlZmVyZW5jZUNvbnRleHQ7CisKKwkJCVVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyIG5hbWVGaW5kZXIgPSBuZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIodGhpcyk7CisJCQluYW1lRmluZGVyLmZpbmRBZnRlcigKKwkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCW1kLnNjb3BlLAorCQkJCQltZC5zY29wZS5jbGFzc1Njb3BlKCksCisJCQkJCWZyb20sCisJCQkJCW1kLmJvZHlFbmQsCisJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJCW5hbWVSZXF1ZXN0b3IpOworCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0OworCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQlkb25lIDogZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKGZpZWxkc1tpXSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7CisJCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgZmllbGRzW2ldOworCQkJCQkJaWYgKGluaXRpYWxpemVyLmJsb2NrLnNvdXJjZVN0YXJ0IDw9IGZyb20gJiYKKwkJCQkJCQkJZnJvbSA8IGluaXRpYWxpemVyLmJvZHlFbmQpIHsKKwkJCQkJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOworCQkJCQkJCW5hbWVGaW5kZXIuZmluZEFmdGVyKAorCQkJCQkJCQkJCXRoaXMuY29tcGxldGlvblRva2VuLAorCQkJCQkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZSwKKwkJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUsCisJCQkJCQkJCQkJZnJvbSwKKwkJCQkJCQkJCQlpbml0aWFsaXplci5ib2R5RW5kLAorCQkJCQkJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJCQkJCQkJbmFtZVJlcXVlc3Rvcik7CisJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWludCBwcm9wb3NlZE5hbWVzQ291bnQgPSBwcm9wb3NlZE5hbWVzLnNpemUoKTsKKwkJaWYgKHByb3Bvc2VkTmFtZXNDb3VudCA+IDApIHsKKwkJCXJldHVybiAoY2hhcltdW10pcHJvcG9zZWROYW1lcy50b0FycmF5KG5ldyBjaGFyW3Byb3Bvc2VkTmFtZXNDb3VudF1bXSk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGNoYXJbXVtdIGZpbmRVbnJlc29sdmVkUmVmZXJlbmNlQmVmb3JlKGludCByZWNvcmRUbywgaW50IHBhcnNlVG8sIEJsb2NrU2NvcGUgc2NvcGUsIGZpbmFsIGNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMpIHsKKwkJZmluYWwgQXJyYXlMaXN0IHByb3Bvc2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciA9CisJCQluZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IoKSB7CisJCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZShjaGFyW10gbmFtZSkgeworCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMuYWNjZXB0VW5yZXNvbHZlZE5hbWUobmFtZSk7CisJCQkJCXByb3Bvc2VkTmFtZXMuYWRkKG5hbWUpOworCQkJCX0KKwkJCX07CisKKwkJQmxvY2tTY29wZSB1cHBlclNjb3BlID0gc2NvcGU7CisJCXdoaWxlICh1cHBlclNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkgIT0gbnVsbCkgeworCQkJdXBwZXJTY29wZSA9IHVwcGVyU2NvcGUuZW5jbG9zaW5nTWV0aG9kU2NvcGUoKTsKKwkJfQorCisJCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCA9IHVwcGVyU2NvcGUucmVmZXJlbmNlQ29udGV4dCgpOworCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbilyZWZlcmVuY2VDb250ZXh0OworCisJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOworCQkJbmFtZUZpbmRlci5maW5kQmVmb3JlKAorCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkJbWQuc2NvcGUsCisJCQkJCW1kLnNjb3BlLmNsYXNzU2NvcGUoKSwKKwkJCQkJbWQuYm9keVN0YXJ0LAorCQkJCQlyZWNvcmRUbywKKwkJCQkJcGFyc2VUbywKKwkJCQkJZGlzY291cmFnZWROYW1lcywKKwkJCQkJbmFtZVJlcXVlc3Rvcik7CisJCX0gZWxzZSBpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisKKworCQkJZG9uZSA6IHsKKwkJCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChmaWVsZHNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplcikgeworCQkJCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBmaWVsZHNbaV07CisJCQkJCQkJaWYgKGluaXRpYWxpemVyLmJsb2NrLnNvdXJjZVN0YXJ0IDw9IHJlY29yZFRvICYmCisJCQkJCQkJCQlyZWNvcmRUbyA8IGluaXRpYWxpemVyLmJvZHlFbmQpIHsKKworCQkJCQkJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlciBuYW1lRmluZGVyID0gbmV3IFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyKHRoaXMpOworCQkJCQkJCQluYW1lRmluZGVyLmZpbmRCZWZvcmUoCisJCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQkJCQkJdHlwZURlY2xhcmF0aW9uLnNjb3BlLAorCQkJCQkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZSwKKwkJCQkJCQkJCQlpbml0aWFsaXplci5ibG9jay5zb3VyY2VTdGFydCwKKwkJCQkJCQkJCQlyZWNvcmRUbywKKwkJCQkJCQkJCQlwYXJzZVRvLAorCQkJCQkJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJCQkJCQkJbmFtZVJlcXVlc3Rvcik7CisJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaW50IHByb3Bvc2VkTmFtZXNDb3VudCA9IHByb3Bvc2VkTmFtZXMuc2l6ZSgpOworCQlpZiAocHJvcG9zZWROYW1lc0NvdW50ID4gMCkgeworCQkJcmV0dXJuIChjaGFyW11bXSlwcm9wb3NlZE5hbWVzLnRvQXJyYXkobmV3IGNoYXJbcHJvcG9zZWROYW1lc0NvdW50XVtdKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgY2hhcltdW10gZmluZFZhcmlhYmxlRnJvbVVucmVzb2x2ZWRSZWZlcmVuY2UoTG9jYWxEZWNsYXJhdGlvbiB2YXJpYWJsZSwgQmxvY2tTY29wZSBzY29wZSwgZmluYWwgY2hhcltdW10gZGlzY291cmFnZWROYW1lcykgeworCQlmaW5hbCBUeXBlUmVmZXJlbmNlIHR5cGUgPSB2YXJpYWJsZS50eXBlOworCQlpZih0eXBlICE9IG51bGwgJiYKKwkJCQl0eXBlLnJlc29sdmVkVHlwZSAhPSBudWxsICYmCisJCQkJdHlwZS5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9FcnJvcil7CisKKwkJCWZpbmFsIEFycmF5TGlzdCBwcm9wb3NlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworCisJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5VbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yID0KKwkJCQluZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IoKSB7CisJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWUoY2hhcltdIG5hbWUpIHsKKwkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhDb21wbGV0aW9uRW5naW5lLnRoaXMuY29tcGxldGlvblRva2VuLCBuYW1lKTsKKwkJCQkJCXJlbGV2YW5jZSArPSBSX05BTUVfRklSU1RfUFJFRklYOworCQkJCQkJcmVsZXZhbmNlICs9IFJfTkFNRV9GSVJTVF9TVUZGSVg7CisJCQkJCQlyZWxldmFuY2UgKz0gUl9OQU1FX0xFU1NfTkVXX0NIQVJBQ1RFUlM7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIHZhcmlhYmxlIG5hbWUKKworCQkJCQkJLy8gYWNjZXB0IHJlc3VsdAorCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJCWlmKCFDb21wbGV0aW9uRW5naW5lLnRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04pKSB7CisJCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgQ29tcGxldGlvbkVuZ2luZS50aGlzLmNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5WQVJJQUJMRV9ERUNMQVJBVElPTiwgQ29tcGxldGlvbkVuZ2luZS50aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZSh0eXBlLnJlc29sdmVkVHlwZSkpOworCQkJCQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHR5cGUucmVzb2x2ZWRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGUucmVzb2x2ZWRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShuYW1lKTsKKwkJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKG5hbWUpOworCQkJCQkJCS8vcHJvcG9zYWwuc2V0RmxhZ3MoRmxhZ3MuQWNjRGVmYXVsdCk7CisJCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKENvbXBsZXRpb25FbmdpbmUudGhpcy5zdGFydFBvc2l0aW9uIC0gQ29tcGxldGlvbkVuZ2luZS50aGlzLm9mZnNldCwgQ29tcGxldGlvbkVuZ2luZS50aGlzLmVuZFBvc2l0aW9uIC0gQ29tcGxldGlvbkVuZ2luZS50aGlzLm9mZnNldCk7CisJCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZShDb21wbGV0aW9uRW5naW5lLnRoaXMudG9rZW5TdGFydCAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQsIENvbXBsZXRpb25FbmdpbmUudGhpcy50b2tlbkVuZCAtIENvbXBsZXRpb25FbmdpbmUudGhpcy5vZmZzZXQpOworCQkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcHJvcG9zZWROYW1lcy5hZGQobmFtZSk7CisJCQkJCX0KKwkJCQl9OworCisJCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7CisJCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pcmVmZXJlbmNlQ29udGV4dDsKKworCQkJCVVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyIG5hbWVGaW5kZXIgPSBuZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIodGhpcyk7CisJCQkJbmFtZUZpbmRlci5maW5kKAorCQkJCQkJdGhpcy5jb21wbGV0aW9uVG9rZW4sCisJCQkJCQltZCwKKwkJCQkJCXZhcmlhYmxlLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMSwKKwkJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJCQluYW1lUmVxdWVzdG9yKTsKKwkJCX0gZWxzZSBpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0OworCQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbGFyYXRpb24uZmllbGRzOworCQkJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJCQlkb25lIDogZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChmaWVsZHNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplcikgeworCQkJCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBmaWVsZHNbaV07CisJCQkJCQkJaWYgKGluaXRpYWxpemVyLmJvZHlTdGFydCA8PSB2YXJpYWJsZS5zb3VyY2VTdGFydCAmJgorCQkJCQkJCQkJdmFyaWFibGUuc291cmNlU3RhcnQgPCBpbml0aWFsaXplci5ib2R5RW5kKSB7CisJCQkJCQkJCVVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyIG5hbWVGaW5kZXIgPSBuZXcgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIodGhpcyk7CisJCQkJCQkJCW5hbWVGaW5kZXIuZmluZCgKKwkJCQkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ub2tlbiwKKwkJCQkJCQkJCQlpbml0aWFsaXplciwKKwkJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUsCisJCQkJCQkJCQkJdmFyaWFibGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxLAorCQkJCQkJCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJCQkJCQkJbmFtZVJlcXVlc3Rvcik7CisJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpbnQgcHJvcG9zZWROYW1lc0NvdW50ID0gcHJvcG9zZWROYW1lcy5zaXplKCk7CisJCQlpZiAocHJvcG9zZWROYW1lc0NvdW50ID4gMCkgeworCQkJCXJldHVybiAoY2hhcltdW10pcHJvcG9zZWROYW1lcy50b0FycmF5KG5ldyBjaGFyW3Byb3Bvc2VkTmFtZXNDb3VudF1bXSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZSgKKwkJCWNoYXJbXSB0b2tlbiwKKwkJCWNoYXJbXSBxdWFsaWZpZWRQYWNrYWdlTmFtZSwKKwkJCWNoYXJbXSBxdWFsaWZpZWRTb3VyY2VOYW1lLAorCQkJY2hhcltdIHNvdXJjZU5hbWUsCisJCQlmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZywKKwkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMsCisJCQlmaW5hbCBjaGFyW11bXSBmb3JiaWRkZW5OYW1lcywKKwkJCWJvb2xlYW4gZm9yQ29sbGVjdGlvbiwKKwkJCWludCBkaW0sCisJCQlpbnQga2luZCl7CisKKwkJaWYoc291cmNlTmFtZSA9PSBudWxsIHx8IHNvdXJjZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisKKwkJLy8gY29tcHV0ZSB2YXJpYWJsZSBuYW1lIGZvciBub24gYmFzZSB0eXBlCisJCWZpbmFsIGNoYXJbXSBkaXNwbGF5TmFtZTsKKwkJaWYgKCFmb3JDb2xsZWN0aW9uKSB7CisJCQlpZiAoZGltID4gMCl7CisJCQkJaW50IGwgPSBxdWFsaWZpZWRTb3VyY2VOYW1lLmxlbmd0aDsKKwkJCQlkaXNwbGF5TmFtZSA9IG5ldyBjaGFyW2wrKDIqZGltKV07CisJCQkJU3lzdGVtLmFycmF5Y29weShxdWFsaWZpZWRTb3VyY2VOYW1lLCAwLCBkaXNwbGF5TmFtZSwgMCwgbCk7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IGRpbTsgaSsrKXsKKwkJCQkJZGlzcGxheU5hbWVbbCsoaSoyKV0gPSAnWyc7CisJCQkJCWRpc3BsYXlOYW1lW2wrKGkqMikrMV0gPSAnXSc7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkaXNwbGF5TmFtZSA9IHF1YWxpZmllZFNvdXJjZU5hbWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkaXNwbGF5TmFtZSA9IHR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJfQorCisJCWZpbmFsIGNoYXJbXSB0ID0gdG9rZW47CisJCWZpbmFsIGNoYXJbXSBxID0gcXVhbGlmaWVkUGFja2FnZU5hbWU7CisJCUlOYW1pbmdSZXF1ZXN0b3IgbmFtaW5nUmVxdWVzdG9yID0gbmV3IElOYW1pbmdSZXF1ZXN0b3IoKSB7CisJCQl2b2lkIGFjY2VwdChjaGFyW10gbmFtZSwgaW50IHByZWZpeEFuZFN1ZmZpeFJlbGV2YW5jZSwgaW50IHJldXNlZENoYXJhY3RlcnMpeworCQkJCWludCBsID0gZm9yYmlkZGVuTmFtZXMgPT0gbnVsbCA/IDAgOiBmb3JiaWRkZW5OYW1lcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZvcmJpZGRlbk5hbWVzW2ldLCBuYW1lLCBmYWxzZSkpIHJldHVybjsKKwkJCQl9CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModCwgbmFtZSwgZmFsc2UpKSB7CisJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodCwgbmFtZSk7CisJCQkJCXJlbGV2YW5jZSArPSBwcmVmaXhBbmRTdWZmaXhSZWxldmFuY2U7CisJCQkJCWlmKHJldXNlZENoYXJhY3RlcnMgPiAwKSByZWxldmFuY2UgKz0gUl9OQU1FX0xFU1NfTkVXX0NIQVJBQ1RFUlM7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSk7IC8vIG5vIGFjY2VzcyByZXN0cmljdGlvbiBmb3IgdmFyaWFibGUgbmFtZQorCisJCQkJCS8vIGFjY2VwdCByZXN1bHQKKwkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJaWYoIUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5WQVJJQUJMRV9ERUNMQVJBVElPTikpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIENvbXBsZXRpb25FbmdpbmUudGhpcy5jcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT04sIENvbXBsZXRpb25FbmdpbmUudGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGdldFNpZ25hdHVyZSh0eXBlQmluZGluZykpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocSk7CisJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShkaXNwbGF5TmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKG5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihuYW1lKTsKKwkJCQkJCS8vcHJvcG9zYWwuc2V0RmxhZ3MoRmxhZ3MuQWNjRGVmYXVsdCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UoQ29tcGxldGlvbkVuZ2luZS50aGlzLnN0YXJ0UG9zaXRpb24gLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0LCBDb21wbGV0aW9uRW5naW5lLnRoaXMuZW5kUG9zaXRpb24gLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UoQ29tcGxldGlvbkVuZ2luZS50aGlzLnRva2VuU3RhcnQgLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0LCBDb21wbGV0aW9uRW5naW5lLnRoaXMudG9rZW5FbmQgLSBDb21wbGV0aW9uRW5naW5lLnRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQlDb21wbGV0aW9uRW5naW5lLnRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRob3V0UHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLGludCByZXVzZWRDaGFyYWN0ZXJzKSB7CisJCQkJYWNjZXB0KG5hbWUsIDAsIHJldXNlZENoYXJhY3RlcnMpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aFByZWZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0UHJlZml4LCBpbnQgcmV1c2VkQ2hhcmFjdGVycykgeworCQkJCWFjY2VwdChuYW1lLCBpc0ZpcnN0UHJlZml4ID8gUl9OQU1FX0ZJUlNUX1BSRUZJWCA6ICBSX05BTUVfUFJFRklYLCByZXVzZWRDaGFyYWN0ZXJzKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZVdpdGhQcmVmaXhBbmRTdWZmaXgoY2hhcltdIG5hbWUsIGJvb2xlYW4gaXNGaXJzdFByZWZpeCwgYm9vbGVhbiBpc0ZpcnN0U3VmZml4LCBpbnQgcmV1c2VkQ2hhcmFjdGVycykgeworCQkJCWFjY2VwdCgKKwkJCQkJCW5hbWUsCisJCQkJCQkoaXNGaXJzdFByZWZpeCA/IFJfTkFNRV9GSVJTVF9QUkVGSVggOiBSX05BTUVfUFJFRklYKSArIChpc0ZpcnN0U3VmZml4ID8gUl9OQU1FX0ZJUlNUX1NVRkZJWCA6IFJfTkFNRV9TVUZGSVgpLAorCQkJCQkJcmV1c2VkQ2hhcmFjdGVycyk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aFN1ZmZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0U3VmZml4LCBpbnQgcmV1c2VkQ2hhcmFjdGVycykgeworCQkJCWFjY2VwdChuYW1lLCBpc0ZpcnN0U3VmZml4ID8gUl9OQU1FX0ZJUlNUX1NVRkZJWCA6IFJfTkFNRV9TVUZGSVgsIHJldXNlZENoYXJhY3RlcnMpOworCQkJfQorCQl9OworCisJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQkJa2luZCwKKwkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLkJLX1NJTVBMRV9UWVBFX05BTUUsCisJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJCQl0aGlzLmphdmFQcm9qZWN0LAorCQkJCWRpbSwKKwkJCQl0b2tlbiwKKwkJCQlkaXNjb3VyYWdlZE5hbWVzLAorCQkJCXRydWUsCisJCQkJbmFtaW5nUmVxdWVzdG9yKTsKKwl9CisKKwkvLyBIZWxwZXIgbWV0aG9kIGZvciBwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZXMoY2hhcltdIG5hbWUsIFR5cGVSZWZlcmVuY2UgdHlwZSApCisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWUoCisJCQljaGFyW10gdG9rZW4sCisJCQljaGFyW10gcXVhbGlmaWVkUGFja2FnZU5hbWUsCisJCQljaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJCWNoYXJbXSBzb3VyY2VOYW1lLAorCQkJZmluYWwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsCisJCQljaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzLAorCQkJZmluYWwgY2hhcltdW10gZm9yYmlkZGVuTmFtZXMsCisJCQlpbnQgZGltLAorCQkJaW50IGtpbmQpeworCQlmaW5kVmFyaWFibGVOYW1lKAorCQkJCXRva2VuLAorCQkJCXF1YWxpZmllZFBhY2thZ2VOYW1lLAorCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUsCisJCQkJc291cmNlTmFtZSwKKwkJCQl0eXBlQmluZGluZywKKwkJCQlkaXNjb3VyYWdlZE5hbWVzLAorCQkJCWZvcmJpZGRlbk5hbWVzLAorCQkJCWZhbHNlLAorCQkJCWRpbSwKKwkJCQlraW5kKTsKKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWVGb3JDb2xsZWN0aW9uKAorCQkJY2hhcltdIHRva2VuLAorCQkJY2hhcltdIHF1YWxpZmllZFBhY2thZ2VOYW1lLAorCQkJY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUsCisJCQljaGFyW10gc291cmNlTmFtZSwKKwkJCWZpbmFsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLAorCQkJY2hhcltdW10gZGlzY291cmFnZWROYW1lcywKKwkJCWZpbmFsIGNoYXJbXVtdIGZvcmJpZGRlbk5hbWVzLAorCQkJaW50IGtpbmQpeworCisJCWZpbmRWYXJpYWJsZU5hbWUoCisJCQkJdG9rZW4sCisJCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUsCisJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJCQlzb3VyY2VOYW1lLAorCQkJCXR5cGVCaW5kaW5nLAorCQkJCWRpc2NvdXJhZ2VkTmFtZXMsCisJCQkJZm9yYmlkZGVuTmFtZXMsCisJCQkJZmFsc2UsCisJCQkJMSwKKwkJCQlraW5kKTsKKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWVzKGNoYXJbXSBuYW1lLCBUeXBlUmVmZXJlbmNlIHR5cGUgLCBjaGFyW11bXSBkaXNjb3VyYWdlZE5hbWVzLCBjaGFyW11bXSBmb3JiaWRkZW5OYW1lcywgaW50IGtpbmQpeworCQlpZih0eXBlICE9IG51bGwgJiYKKwkJCXR5cGUucmVzb2x2ZWRUeXBlICE9IG51bGwpIHsKKwkJCVR5cGVCaW5kaW5nIHRiID0gdHlwZS5yZXNvbHZlZFR5cGU7CisKKwkJCWlmICh0Yi5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob0Vycm9yICYmCisJCQkJCXRiICE9IFNjb3BlLmdldEJhc2VUeXBlKFZPSUQpKSB7CisJCQkJZmluZFZhcmlhYmxlTmFtZSgKKwkJCQkJbmFtZSwKKwkJCQkJdGIubGVhZkNvbXBvbmVudFR5cGUoKS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQl0Yi5sZWFmQ29tcG9uZW50VHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJdGIubGVhZkNvbXBvbmVudFR5cGUoKS5zb3VyY2VOYW1lKCksCisJCQkJCXRiLAorCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAorCQkJCQlmb3JiaWRkZW5OYW1lcywKKwkJCQkJdHlwZS5kaW1lbnNpb25zKCksCisJCQkJCWtpbmQpOworCQkJCQorCQkJCWlmICh0Yi5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgJiYKKwkJCQkJCXRiLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFVdGlsQ29sbGVjdGlvbiwgZmFsc2UpICE9IG51bGwpIHsKKwkJCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHB0YiA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0Yik7CisJCQkJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzID0gcHRiLmFyZ3VtZW50czsKKwkJCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQkJCQkJVHlwZUJpbmRpbmcgYXJndW1lbnQgPSBhcmd1bWVudHNbMF07CisJCQkJCQlmaW5kVmFyaWFibGVOYW1lRm9yQ29sbGVjdGlvbigKKwkJCQkJCQluYW1lLAorCQkJCQkJCWFyZ3VtZW50LmxlYWZDb21wb25lbnRUeXBlKCkucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJCQlhcmd1bWVudC5sZWFmQ29tcG9uZW50VHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJCQlhcmd1bWVudC5sZWFmQ29tcG9uZW50VHlwZSgpLnNvdXJjZU5hbWUoKSwKKwkJCQkJCQl0YiwKKwkJCQkJCQlkaXNjb3VyYWdlZE5hbWVzLAorCQkJCQkJCWZvcmJpZGRlbk5hbWVzLAorCQkJCQkJCWtpbmQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKAorCQljaGFyW10gdG9rZW4sCisJCVNjb3BlIHNjb3BlLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQlib29sZWFuIGluc2lkZVR5cGVBbm5vdGF0aW9uLAorCQlib29sZWFuIGluc2lkZUFubm90YXRpb25BdHRyaWJ1dGUpIHsKKworCQlpZiAodG9rZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBTaG91bGQgbG9jYWwgdmFyaWFibGVzIGhpZGUgZmllbGRzIGZyb20gdGhlIHJlY2VpdmVyIHR5cGUgb3IgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXM/CisJCS8vIHdlIGtub3cgaXRzIGFuIGltcGxpY2l0IGZpZWxkL21ldGhvZCBhY2Nlc3MuLi4gc2VlIEJsb2NrU2NvcGUgZ2V0QmluZGluZy9nZXRJbXBsaWNpdE1ldGhvZAorCisJCWJvb2xlYW4gc3RhdGljc09ubHkgPSBmYWxzZTsKKwkJLy8gbmVlZCB0byBrbm93IGlmIHdlJ3JlIGluIGEgc3RhdGljIGNvbnRleHQgKG9yIGluc2lkZSBhIGNvbnN0cnVjdG9yKQorCQlpbnQgdG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7CisKKwkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOworCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisKKwkJU2NvcGUgY3VycmVudFNjb3BlID0gc2NvcGU7CisKKwkJaWYgKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRikpIHsKKwkJCWRvbmUxIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgeworCisJCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpCisJCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgY3VycmVudFNjb3BlOworCQkJCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKKworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgorCQkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIGN1cnJlbnRTY29wZTsKKworCQkJCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLmxvY2Fscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gYmxvY2tTY29wZS5sb2NhbHNbaV07CisKKwkJCQkJCQlpZiAobG9jYWwgPT0gbnVsbCkKKwkJCQkJCQkJYnJlYWsgbmV4dDsKKworCQkJCQkJCWlmICh0b2tlbkxlbmd0aCA+IGxvY2FsLm5hbWUubGVuZ3RoKQorCQkJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbG9jYWwubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCisJCQkJCQkJCQkmJiAhKHRoaXMub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRva2VuLCBsb2NhbC5uYW1lKSkpCisJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJCQlpZiAobG9jYWwuaXNTZWNyZXQoKSkKKwkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQkKKwkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4Njc0CisJCQkJCQkJaWYgKGxvY2FsLmRlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkJLy8gcHJvcG9zYWwgYmVpbmcgYXNrZWQgaW5zaWRlIGZpZWxkJ3MgaW5pdGlhbGl6YXRpb24uIERvbid0IHByb3Bvc2UgdGhpcyBmaWVsZC4KKwkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQl9CisJCQkJCQkJCQkJCQkKKwkJCQkJCQkvLyBkb24ndCBwcm9wb3NlIG5vbiBjb25zdGFudCB2YXJpYWJsZXMgb3Igc3RyaW5ncyAoMS42IG9yIGJlbG93KSBpbiBjYXNlIGV4cHJlc3Npb24KKwkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MzQ2CisJCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzM0MgorCQkJCQkJCWlmICh0aGlzLmFzc2lzdE5vZGVJc0luc2lkZUNhc2UpIHsKKwkJCQkJCQkJaWYgKGxvY2FsLmlzRmluYWwoKSkgeworCQkJCQkJCQkJaWYgKHRoaXMuYXNzaXN0Tm9kZUlzU3RyaW5nKXsKKwkJCQkJCQkJCQlpZiAobG9jYWwudHlwZSA9PSBudWxsIHx8IGxvY2FsLnR5cGUuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKQorCQkJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQkJfSBlbHNlIGlmICghKGxvY2FsLnR5cGUgaW5zdGFuY2VvZiBCYXNlVHlwZUJpbmRpbmcpKQorCQkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7IAorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY29udGludWUgbmV4dDsgLy8gbm9uLWNvbnN0YW50cyBub3QgYWxsb3dlZCBpbiBjYXNlLgkKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQlpbnQgcHRyID0gdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NQdHI7CisJCQkJCQkJLy8gQ2FzZXMgd2hlcmUgdGhlIGJpbmRpbmcgaXMgdW5pbnRlcmVzdGluZyBlZy4gZm9yIGNvbXBsZXRpb24gb2NjdXJyaW5nIGluc2lkZSBhIGxvY2FsIHZhcgorCQkJCQkJCS8vIGRlY2xhcmF0aW9uLCB0aGUgbG9jYWwgdmFyIGJpbmRpbmcgaXMgdW5pbnRlcmVzdGluZyBhbmQgc2hvdWxkbid0IGJlIHByb3Bvc2VkLgorCQkJCQkJCXdoaWxlIChwdHIgPj0gMCkgeworCQkJCQkJCQlpZiAodGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NbcHRyXSA9PSBsb2NhbCkgeworCQkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQkJfQorCQkJCQkJCQlwdHItLTsKKwkJCQkJCQl9CisKKwkJCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGxvY2Fsc0ZvdW5kLnNpemU7IGYrKykgeworCQkJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBvdGhlckxvY2FsID0KKwkJCQkJCQkJCShMb2NhbFZhcmlhYmxlQmluZGluZykgbG9jYWxzRm91bmQuZWxlbWVudEF0KGYpOworCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMob3RoZXJMb2NhbC5uYW1lLCBsb2NhbC5uYW1lLCB0cnVlKSkKKwkJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkJfQorCQkJCQkJCWxvY2Fsc0ZvdW5kLmFkZChsb2NhbCk7CisKKwkJCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwobG9jYWwpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBsb2NhbC5uYW1lKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobG9jYWwudHlwZSk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFbnVtQ29uc3RhbnQobG9jYWwudHlwZSk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKwkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc3RyaWN0aW9ucyhJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOyAvLyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24gZm9yIGxvY2FsIHZhcmlhYmxlCisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JGaW5hbCh0aGlzLmFzc2lzdE5vZGVJc0luc2lkZUNhc2UsIGxvY2FsLmlzRmluYWwoKSk7CisJCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTE9DQUxfVkFSSUFCTEVfUkVGKSkgeworCQkJCQkJCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9ICBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuTE9DQUxfVkFSSUFCTEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZSgKKwkJCQkJCQkJCWxvY2FsLnR5cGUgPT0gbnVsbAorCQkJCQkJCQkJPyBjcmVhdGVUeXBlU2lnbmF0dXJlKAorCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCQkJCQkJCQkJCWxvY2FsLmRlY2xhcmF0aW9uLnR5cGUudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKQorCQkJCQkJCQkJOiBnZXRTaWduYXR1cmUobG9jYWwudHlwZSkpOworCQkJCQkJCQlpZihsb2NhbC50eXBlID09IG51bGwpIHsKKwkJCQkJCQkJCS8vcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUobnVsbCk7CisJCQkJCQkJCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShsb2NhbC5kZWNsYXJhdGlvbi50eXBlLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlwcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShsb2NhbC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCkpOworCQkJCQkJCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUobG9jYWwudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCQkJCQkJCQl9CisJCQkJCQkJCXByb3Bvc2FsLnNldE5hbWUobG9jYWwubmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24obG9jYWwubmFtZSk7CisJCQkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGxvY2FsLm1vZGlmaWVycyk7CisJCQkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoKKwkJCQkJCWJyZWFrIGRvbmUxOworCQkJCX0KKwkJCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OworCQkJfQorCQl9CisJCQorCQljaGVja0NhbmNlbCgpOworCisJCWJvb2xlYW4gcHJvcG9zZUZpZWxkID0gIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGKTsKKwkJYm9vbGVhbiBwcm9wb3NlTWV0aG9kID0gIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRik7CisKKwkJc3RhdGljc09ubHkgPSBmYWxzZTsKKwkJY3VycmVudFNjb3BlID0gc2NvcGU7CisKKwkJaWYocHJvcG9zZUZpZWxkIHx8IHByb3Bvc2VNZXRob2QpIHsKKwkJCWRvbmUyIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgeworCQkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6CisJCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQorCQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsKKwkJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgY3VycmVudFNjb3BlOworCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQkJLyoJCQkJaWYgKHRva2VuTGVuZ3RoID09IDApIHsgLy8gb25seSBzZWFyY2ggaW5zaWRlIHRoZSB0eXBlIGl0c2VsZiBpZiBubyBwcmVmaXggd2FzIHByb3ZpZGVkCisJCQkJCQkJCQkJCWZpbmRGaWVsZHModG9rZW4sIGVuY2xvc2luZ1R5cGUuZmllbGRzKCksIGNsYXNzU2NvcGUsIGZpZWxkc0ZvdW5kLCBzdGF0aWNzT25seSk7CisJCQkJCQkJCQkJCWZpbmRNZXRob2RzKHRva2VuLCBlbmNsb3NpbmdUeXBlLm1ldGhvZHMoKSwgY2xhc3NTY29wZSwgbWV0aG9kc0ZvdW5kLCBzdGF0aWNzT25seSwgZmFsc2UpOworCQkJCQkJCQkJCQlicmVhayBkb25lOworCQkJCQkJCQkJCX0gZWxzZSB7ICovCisJCQkJCQlpZighaW5zaWRlVHlwZUFubm90YXRpb24pIHsKKwkJCQkJCQlpZihwcm9wb3NlRmllbGQpIHsKKwkJCQkJCQkJZmluZEZpZWxkcygKKwkJCQkJCQkJCXRva2VuLAorCQkJCQkJCQkJZW5jbG9zaW5nVHlwZSwKKwkJCQkJCQkJCWNsYXNzU2NvcGUsCisJCQkJCQkJCQlmaWVsZHNGb3VuZCwKKwkJCQkJCQkJCWxvY2Fsc0ZvdW5kLAorCQkJCQkJCQkJc3RhdGljc09ubHksCisJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJLTEsCisJCQkJCQkJCQktMSk7CisJCQkJCQkJfQorCQkJCQkJCWlmKHByb3Bvc2VNZXRob2QgJiYgIWluc2lkZUFubm90YXRpb25BdHRyaWJ1dGUpIHsKKwkJCQkJCQkJZmluZE1ldGhvZHMoCisJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJZW5jbG9zaW5nVHlwZSwKKwkJCQkJCQkJCWNsYXNzU2NvcGUsCisJCQkJCQkJCQltZXRob2RzRm91bmQsCisJCQkJCQkJCQlzdGF0aWNzT25seSwKKwkJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJLTEsCisJCQkJCQkJCQktMSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJc3RhdGljc09ubHkgfD0gZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpOworCQkJCQkJaW5zaWRlVHlwZUFubm90YXRpb24gPSBmYWxzZTsKKwkJCQkJCS8vCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCQlicmVhayBkb25lMjsKKwkJCQl9CisJCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwkJCX0KKwkJCQorCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQorCQkJZmluZEZpZWxkc0FuZE1ldGhvZHNGcm9tU3RhdGljSW1wb3J0cygKKwkJCQkJdG9rZW4sCisJCQkJCXNjb3BlLAorCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQlmYWxzZSwKKwkJCQkJaW5zaWRlQW5ub3RhdGlvbkF0dHJpYnV0ZSwKKwkJCQkJbG9jYWxzRm91bmQsCisJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQltZXRob2RzRm91bmQsCisJCQkJCXByb3Bvc2VGaWVsZCwKKwkJCQkJcHJvcG9zZU1ldGhvZCk7CisKKwkJCWlmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgPT0gMCkgeworCQkJCQorCQkJCWNoZWNrQ2FuY2VsKCk7CisJCQkJCisJCQkJLy8gc2VhcmNoIGluIGZhdm9yaXRlcyBpbXBvcnQKKwkJCQlmaW5kRmllbGRzQW5kTWV0aG9kc0Zyb21GYXZvcml0ZXMoCisJCQkJCQl0b2tlbiwKKwkJCQkJCXNjb3BlLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJbWV0aG9kc0ZvdW5kKTsKKwkJCX0KKwkJCQorCQkJY2hlY2tDYW5jZWwoKTsKKwkJCQorCQkJZmluZEVudW1Db25zdGFudHNGcm9tRXhwZWN0ZWRUeXBlcygKKwkJCQkJdG9rZW4sCisJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJZmllbGRzRm91bmQpOworCQl9CisJfQorCisJcHJpdmF0ZSBjaGFyW10gZ2V0Q29tcGxldGVkVHlwZVNpZ25hdHVyZShSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJY2hhcltdIHJlc3VsdCA9IG51bGw7CisJCVN0cmluZ0J1ZmZlciBzaWcgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJaWYgKCFyZWZlcmVuY2VCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKSB7CisJCQljaGFyW10gdHlwZVNpZyA9IHJlZmVyZW5jZUJpbmRpbmcuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKKwkJCXNpZy5hcHBlbmQodHlwZVNpZywgMCwgdHlwZVNpZy5sZW5ndGgpOworCQl9IGVsc2UgaWYgKCF0aGlzLmluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWNoYXJbXSB0eXBlU2lnID0gcmVmZXJlbmNlQmluZGluZy5zaWduYXR1cmUoKTsKKwkJCQlzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCisKKwkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IHJlZmVyZW5jZUJpbmRpbmcudHlwZVZhcmlhYmxlcygpOworCQkJCWlmICh0eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJCQkgICAgc2lnLmFwcGVuZChTaWduYXR1cmUuQ19HRU5FUklDX1NUQVJUKTsKKwkJCQkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkgICAgICAgIHNpZy5hcHBlbmQodHlwZVZhcmlhYmxlc1tpXS5nZW5lcmljVHlwZVNpZ25hdHVyZSgpKTsKKwkJCQkgICAgfQorCQkJCSAgICBzaWcuYXBwZW5kKFNpZ25hdHVyZS5DX0dFTkVSSUNfRU5EKTsKKwkJCQl9CisJCQkJc2lnLmFwcGVuZChTaWduYXR1cmUuQ19TRU1JQ09MT04pOworCQkJfSBlbHNlIHsKKwkJCQljaGFyW10gdHlwZVNpZyA9IHJlZmVyZW5jZUJpbmRpbmcuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKKwkJCQlzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlZmVyZW5jZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOworCQkJaWYgKGVuY2xvc2luZ1R5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQkJY2hhcltdIHR5cGVTaWcgPSByZWZlcmVuY2VCaW5kaW5nLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCk7CisJCQkJc2lnLmFwcGVuZCh0eXBlU2lnLCAwLCB0eXBlU2lnLmxlbmd0aC0xKTsKKworCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gcmVmZXJlbmNlQmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJCQkJaWYgKHR5cGVWYXJpYWJsZXMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCQkJCSAgICBzaWcuYXBwZW5kKFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQpOworCQkJCSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCSAgICAgICAgc2lnLmFwcGVuZCh0eXBlVmFyaWFibGVzW2ldLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOworCQkJCSAgICB9CisJCQkJICAgIHNpZy5hcHBlbmQoU2lnbmF0dXJlLkNfR0VORVJJQ19FTkQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2hhcltdIHR5cGVTaWcgPSByZWZlcmVuY2VCaW5kaW5nLnNpZ25hdHVyZSgpOworCQkJCXNpZy5hcHBlbmQodHlwZVNpZywgMCwgdHlwZVNpZy5sZW5ndGgtMSk7IC8vIGNvcHkgYWxsIGJ1dCB0cmFpbGluZyBzZW1pY29sb24KKworCQkJCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSByZWZlcmVuY2VCaW5kaW5nLnR5cGVWYXJpYWJsZXMoKTsKKwkJCQkJaWYgKHR5cGVWYXJpYWJsZXMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCQkJCQkgICAgc2lnLmFwcGVuZChTaWduYXR1cmUuQ19HRU5FUklDX1NUQVJUKTsKKwkJCQkJICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCSAgICAgICAgc2lnLmFwcGVuZCh0eXBlVmFyaWFibGVzW2ldLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOworCQkJCQkgICAgfQorCQkJCQkgICAgc2lnLmFwcGVuZChTaWduYXR1cmUuQ19HRU5FUklDX0VORCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzaWcuYXBwZW5kKFNpZ25hdHVyZS5DX1NFTUlDT0xPTik7CisJCX0KKwkJaW50IHNpZ0xlbmd0aCA9IHNpZy5sZW5ndGgoKTsKKwkJcmVzdWx0ID0gbmV3IGNoYXJbc2lnTGVuZ3RoXTsKKwkJc2lnLmdldENoYXJzKDAsIHNpZ0xlbmd0aCwgcmVzdWx0LCAwKTsKKwkJcmVzdWx0ID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KHJlc3VsdCwgJy8nLCBTaWduYXR1cmUuQ19ET1QpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgSW1wb3J0QmluZGluZ1tdIGdldEZhdm9yaXRlUmVmZXJlbmNlQmluZGluZ3MoU2NvcGUgc2NvcGUpIHsKKwkJaWYgKHRoaXMuZmF2b3JpdGVSZWZlcmVuY2VCaW5kaW5ncyAhPSBudWxsKSByZXR1cm4gdGhpcy5mYXZvcml0ZVJlZmVyZW5jZUJpbmRpbmdzOworCisJCVN0cmluZ1tdIGZhdm9yaXRlUmVmZXJlbmNlcyA9IHRoaXMucmVxdWVzdG9yLmdldEZhdm9yaXRlUmVmZXJlbmNlcygpOworCisJCWlmIChmYXZvcml0ZVJlZmVyZW5jZXMgPT0gbnVsbCB8fCBmYXZvcml0ZVJlZmVyZW5jZXMubGVuZ3RoID09IDApIHJldHVybiBudWxsOworCisJCUltcG9ydEJpbmRpbmdbXSByZXNvbHZlZEltcG9ydHMgPSBuZXcgSW1wb3J0QmluZGluZ1tmYXZvcml0ZVJlZmVyZW5jZXMubGVuZ3RoXTsKKworCQlpbnQgY291bnQgPSAwOworCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBmYXZvcml0ZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBmYXZvcml0ZVJlZmVyZW5jZSA9IGZhdm9yaXRlUmVmZXJlbmNlc1tpXTsKKworCQkJaW50IGxlbmd0aDsKKwkJCWlmIChmYXZvcml0ZVJlZmVyZW5jZSA9PSBudWxsIHx8IChsZW5ndGggPSBmYXZvcml0ZVJlZmVyZW5jZS5sZW5ndGgoKSkgPT0gMCkgY29udGludWUgbmV4dDsKKworCQkJYm9vbGVhbiBvbkRlbWFuZCA9IGZhdm9yaXRlUmVmZXJlbmNlLmNoYXJBdChsZW5ndGggLSAxKSA9PSAnKic7CisKKwkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGZhdm9yaXRlUmVmZXJlbmNlLnRvQ2hhckFycmF5KCkpOworCQkJaWYgKG9uRGVtYW5kKSB7CisJCQkJY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGNvbXBvdW5kTmFtZS5sZW5ndGggLSAxKTsKKwkJCX0KKworCQkJLy8gcmVtb3ZlIGR1cGxpY2F0ZSBhbmQgY29uZmxpY3RpbmcKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworCQkJCUltcG9ydFJlZmVyZW5jZSBmID0gcmVzb2x2ZWRJbXBvcnRzW2pdLnJlZmVyZW5jZTsKKworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmLnRva2VucywgY29tcG91bmROYW1lKSkgY29udGludWUgbmV4dDsKKworCQkJCWlmICghb25EZW1hbmQgJiYgKChmLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSA9PSAwKSkgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZi50b2tlbnNbZi50b2tlbnMubGVuZ3RoIC0gMV0sIGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWJvb2xlYW4gaXNTdGF0aWMgPSB0cnVlOworCisJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0KKwkJCQluZXcgSW1wb3J0UmVmZXJlbmNlKAorCQkJCQkJY29tcG91bmROYW1lLAorCQkJCQkJbmV3IGxvbmdbY29tcG91bmROYW1lLmxlbmd0aF0sCisJCQkJCQlvbkRlbWFuZCwKKwkJCQkJCWlzU3RhdGljID8gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyA6IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KTsKKworCQkJQmluZGluZyBpbXBvcnRCaW5kaW5nID0gdGhpcy51bml0U2NvcGUuZmluZEltcG9ydChjb21wb3VuZE5hbWUsIGlzU3RhdGljLCBvbkRlbWFuZCk7CisKKwkJCWlmICghaW1wb3J0QmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJY29udGludWUgbmV4dDsKKwkJCX0KKworCQkJaWYgKGltcG9ydEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQkJCWNvbnRpbnVlIG5leHQ7CisJCQl9CisKKwkJCXJlc29sdmVkSW1wb3J0c1tjb3VudCsrXSA9CisJCQkJbmV3IEltcG9ydEJpbmRpbmcoY29tcG91bmROYW1lLCBvbkRlbWFuZCwgaW1wb3J0QmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJfQorCisJCWlmIChyZXNvbHZlZEltcG9ydHMubGVuZ3RoID4gY291bnQpCisJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc29sdmVkSW1wb3J0cywgMCwgcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisKKwkJcmV0dXJuIHRoaXMuZmF2b3JpdGVSZWZlcmVuY2VCaW5kaW5ncyA9IHJlc29sdmVkSW1wb3J0czsKKwl9CisJCisJcHJpdmF0ZSBJTmFtZUVudmlyb25tZW50IGdldE5vQ2FjaGVOYW1lRW52aXJvbm1lbnQoKSB7CisJCWlmICh0aGlzLm5vQ2FjaGVOYW1lRW52aXJvbm1lbnQgPT0gbnVsbCkgeworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2FjaGVaaXBGaWxlcyh0aGlzKTsKKwkJCXRoaXMubm9DYWNoZU5hbWVFbnZpcm9ubWVudCA9IG5ldyBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50KHRoaXMuamF2YVByb2plY3QsIHRoaXMub3duZXIgPT0gbnVsbCA/IG51bGwgOiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRXb3JraW5nQ29waWVzKHRoaXMub3duZXIsIHRydWUvKmFkZCBwcmltYXJ5IFdDcyovKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMubm9DYWNoZU5hbWVFbnZpcm9ubWVudDsKKwl9CisKKwlwdWJsaWMgQXNzaXN0UGFyc2VyIGdldFBhcnNlcigpIHsKKworCQlyZXR1cm4gdGhpcy5wYXJzZXI7CisJfQorCXByb3RlY3RlZCBib29sZWFuIGhhc0FycmF5VHlwZUFzRXhwZWN0ZWRTdXBlclR5cGVzKCkgeworCQlpZiAoKHRoaXMuZXhwZWN0ZWRUeXBlc0ZpbHRlciAmIH5TVUJUWVBFKSAhPSAwKSByZXR1cm4gZmFsc2U7CisJCQorCQlpZiAoIXRoaXMuaGFzQ29tcHV0ZWRFeHBlY3RlZEFycmF5VHlwZXMpIHsKKwkJCWlmKHRoaXMuZXhwZWN0ZWRUeXBlcyAhPSBudWxsKSB7CisJCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZXhwZWN0ZWRUeXBlc1B0cjsgaSsrKSB7CisJCQkJCWlmKHRoaXMuZXhwZWN0ZWRUeXBlc1tpXS5pc0FycmF5VHlwZSgpKSB7CisJCQkJCQl0aGlzLmhhc0V4cGVjdGVkQXJyYXlUeXBlcyA9IHRydWU7CisJCQkJCQlicmVhayBkb25lOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQl0aGlzLmhhc0NvbXB1dGVkRXhwZWN0ZWRBcnJheVR5cGVzID0gdHJ1ZTsKKwkJfQorCQkKKwkJcmV0dXJuIHRoaXMuaGFzRXhwZWN0ZWRBcnJheVR5cGVzOworCX0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQb3NzaWJsZUFubm90YXRpb25UYXJnZXQoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFNjb3BlIHNjb3BlKSB7CisJCWlmICh0aGlzLnRhcmdldGVkRWxlbWVudCA9PSBUYWdCaXRzLkFubm90YXRpb25Gb3JQYWNrYWdlKSB7CisJCQlsb25nIHRhcmdldCA9IHR5cGVCaW5kaW5nLmdldEFubm90YXRpb25UYWdCaXRzKCkgJiBUYWdCaXRzLkFubm90YXRpb25UYXJnZXRNQVNLOworCQkJaWYodGFyZ2V0ICE9IDAgJiYgKHRhcmdldCAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhY2thZ2UpID09IDApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoKHRoaXMudGFyZ2V0ZWRFbGVtZW50ICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZSkgIT0gMCkgeworCQkJaWYgKHNjb3BlLnBhcmVudCAhPSBudWxsICYmCisJCQkJCXNjb3BlLnBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJgorCQkJCQlzY29wZS5wYXJlbnQucmVmZXJlbmNlQ29udGV4dCgpIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uQW5ub3RhdGlvbk9mVHlwZSAmJgorCQkJCQlzY29wZS5wYXJlbnQucGFyZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0U2NvcGUpIHsKKwkJCQlsb25nIHRhcmdldCA9IHR5cGVCaW5kaW5nLmdldEFubm90YXRpb25UYWdCaXRzKCkgJiBUYWdCaXRzLkFubm90YXRpb25UYXJnZXRNQVNLOworCQkJCWlmICgodGhpcy50YXJnZXRlZEVsZW1lbnQgJiBUYWdCaXRzLkFubm90YXRpb25Gb3JBbm5vdGF0aW9uVHlwZSkgIT0gMCkgeworCQkJCQlpZih0YXJnZXQgIT0gMCAmJiAodGFyZ2V0ICYoVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZSB8IFRhZ0JpdHMuQW5ub3RhdGlvbkZvckFubm90YXRpb25UeXBlKSkgPT0gMCkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYodGFyZ2V0ICE9IDAgJiYgKHRhcmdldCAmKFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGUpKSA9PSAwKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIFJldHVybnMgY29tcGxldGlvbiBzdHJpbmcgaW5zZXJ0ZWQgaW5zaWRlIGEgc3BlY2lmaWVkIGlubGluZSB0YWcuCisJICogQHBhcmFtIGNvbXBsZXRpb25OYW1lCisJICogQHJldHVybiBjaGFyW10gQ29tcGxldGlvbiB0ZXh0IGluY2x1bmRpbmcgc3BlY2lmaWVkIGlubGluZSB0YWcKKwkgKi8KKwlwcml2YXRlIGNoYXJbXSBpbmxpbmVUYWdDb21wbGV0aW9uKGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgY2hhcltdIGlubGluZVRhZykgeworCQlpbnQgdGFnTGVuZ3RoPSBpbmxpbmVUYWcubGVuZ3RoOworCQlpbnQgY29tcGxldGlvbkxlbmd0aCA9IGNvbXBsZXRpb25OYW1lLmxlbmd0aDsKKwkJaW50IGlubGluZUxlbmd0aCA9IDIrdGFnTGVuZ3RoKzErY29tcGxldGlvbkxlbmd0aCsxOworCQljaGFyW10gaW5saW5lQ29tcGxldGlvbiA9IG5ldyBjaGFyW2lubGluZUxlbmd0aF07CisJCWlubGluZUNvbXBsZXRpb25bMF0gPSAneyc7CisJCWlubGluZUNvbXBsZXRpb25bMV0gPSAnQCc7CisJCVN5c3RlbS5hcnJheWNvcHkoaW5saW5lVGFnLCAwLCBpbmxpbmVDb21wbGV0aW9uLCAyLCB0YWdMZW5ndGgpOworCQlpbmxpbmVDb21wbGV0aW9uW3RhZ0xlbmd0aCsyXSA9ICcgJzsKKwkJU3lzdGVtLmFycmF5Y29weShjb21wbGV0aW9uTmFtZSwgMCwgaW5saW5lQ29tcGxldGlvbiwgdGFnTGVuZ3RoKzMsIGNvbXBsZXRpb25MZW5ndGgpOworCQkvLyBkbyBub3QgYWRkIHNwYWNlIGF0IGVuZCBvZiBpbmxpbmUgdGFnIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjEwMjYpCisJCS8vaW5saW5lQ29tcGxldGlvbltpbmxpbmVMZW5ndGgtMl0gPSAnICc7CisJCWlubGluZUNvbXBsZXRpb25baW5saW5lTGVuZ3RoLTFdID0gJ30nOworCQlyZXR1cm4gaW5saW5lQ29tcGxldGlvbjsKKwl9CisJcHJpdmF0ZSBib29sZWFuIGlzQWxsb3dpbmdMb25nQ29tcHV0YXRpb25Qcm9wb3NhbHMoKSB7CisJCXJldHVybiB0aGlzLm1vbml0b3IgIT0gbnVsbDsKIAl9CiAJcHJpdmF0ZSBib29sZWFuIGlzRm9yYmlkZGVuKEJpbmRpbmcgYmluZGluZykgewogCQlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmZvcmJiaWRlbkJpbmRpbmdzUHRyOyBpKyspIHsKIAkJCWlmKHRoaXMuZm9yYmJpZGVuQmluZGluZ3NbaV0gPT0gYmluZGluZykgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJaWYoKHRoaXMuZm9yYmJpZGVuQmluZGluZ3NGaWx0ZXIgJiBTVUJUWVBFKSAhPSAwKSB7Ci0JCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZyAmJiAKLQkJCQkJCXRoaXMuZm9yYmJpZGVuQmluZGluZ3NbaV0gaW5zdGFuY2VvZiBUeXBlQmluZGluZyAmJgotCQkJCQkJKChUeXBlQmluZGluZyliaW5kaW5nKS5pc0NvbXBhdGlibGVXaXRoKChUeXBlQmluZGluZyl0aGlzLmZvcmJiaWRlbkJpbmRpbmdzW2ldKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhcmVudChBU1ROb2RlIHBhcmVudCwgQVNUTm9kZSBub2RlLCBTY29wZSBzY29wZSl7CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGb3JiaWRkZW5UeXBlKGNoYXJbXSBnaXZlblBrZ05hbWUsIGNoYXJbXSBnaXZlblR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMpIHsKKwkJLy8gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKCkgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgaW5wdXQgYXJncyBhcmUgbnVsbC9lbXB0eQorCQljaGFyW10gZnVsbFR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGVuY2xvc2luZ1R5cGVOYW1lcywgZ2l2ZW5UeXBlTmFtZSwgJy4nKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5mb3JiYmlkZW5CaW5kaW5nc1B0cjsgaSsrKSB7CisJCQlpZiAodGhpcy5mb3JiYmlkZW5CaW5kaW5nc1tpXSBpbnN0YW5jZW9mIFR5cGVCaW5kaW5nKSB7CisJCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpIHRoaXMuZm9yYmJpZGVuQmluZGluZ3NbaV07CisJCQkJY2hhcltdIGN1cnJQa2dOYW1lID0gdHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZ2l2ZW5Qa2dOYW1lLCBjdXJyUGtnTmFtZSkpCXsKKwkJCQkJY2hhcltdIGN1cnJUeXBlTmFtZSA9IHR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZ1bGxUeXBlTmFtZSwgY3VyclR5cGVOYW1lKSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KIAkJCisJCS8vIGZpbHRlciBwYWNrYWdlcyBlbmRpbmcgd2l0aCBlbnVtIGZvciBwcm9qZWN0cyBhYm92ZSAxLjUgCisJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MjY0CisJCWlmICh0aGlzLmNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmCisJCQkJQ2hhck9wZXJhdGlvbi5lbmRzV2l0aChnaXZlblBrZ05hbWUsIERPVF9FTlVNKSkgeyAvL25vdGU6IGl0IHNob3VsZCBiZSAuZW51bSBhbmQgbm90IGp1c3QgZW51bQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzSWdub3JlZChpbnQga2luZCkgeworCQlyZXR1cm4gdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKGtpbmQpOworCX0KKwlib29sZWFuIGlzSWdub3JlZChpbnQga2luZCwgYm9vbGVhbiBtaXNzaW5nVHlwZXMpIHsKKwkJcmV0dXJuIHRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChraW5kKSB8fAorCQkJKG1pc3NpbmdUeXBlcyAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKGtpbmQsIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0lnbm9yZWQoaW50IGtpbmQsIGludCByZXF1aXJlZFByb3Bvc2FsS2luZCkgeworCQlyZXR1cm4gdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKGtpbmQpIHx8CisJCQkhdGhpcy5yZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKGtpbmQsIHJlcXVpcmVkUHJvcG9zYWxLaW5kKTsKKwl9CisJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYXJlbnQoQVNUTm9kZSBwYXJlbnQsIEFTVE5vZGUgbm9kZSwgU2NvcGUgc2NvcGUpeworCiAJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CiAJCQlQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSByZWYgPSAoUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHBhcmVudDsKIAkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gKChSZWZlcmVuY2VCaW5kaW5nKXJlZi5yZXNvbHZlZFR5cGUpLnR5cGVWYXJpYWJsZXMoKTsKQEAgLTg0MjMsNyArMTIwMjYsNyBAQAogCQkJCX0KIAkJCQl0eXBlQmluZGluZ3Nbbm9kZUluZGV4XSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CiAJCQkJaWYodHlwZVZhcmlhYmxlcyA9PSBudWxsIHx8IHR5cGVWYXJpYWJsZXMubGVuZ3RoID09IDApIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQocmVmLCByZWYucmVzb2x2ZWRUeXBlLCB0eXBlQmluZGluZ3MpOworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25HZW5lcmljVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZCgwLCByZWYsIHJlZi5yZXNvbHZlZFR5cGUsIHR5cGVCaW5kaW5ncyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZShyZWYsIHJlZi5yZXNvbHZlZFR5cGUsIHR5cGVCaW5kaW5ncyk7CiAJCQkJfQpAQCAtODQ0NCw3ICsxMjA0Nyw3IEBACiAJCQkJCQl9CiAJCQkJCQl0eXBlQmluZGluZ3Nbal0gPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOwogCQkJCQkJaWYodHlwZVZhcmlhYmxlcyA9PSBudWxsIHx8IHR5cGVWYXJpYWJsZXMubGVuZ3RoID09IDApIHsKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25HZW5lcmljVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZChyZWYsIHJlZi5yZXNvbHZlZFR5cGUsIHR5cGVCaW5kaW5ncyk7CisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQoMCwgcmVmLCByZWYucmVzb2x2ZWRUeXBlLCB0eXBlQmluZGluZ3MpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RBcml0eUZvclBhcmFtZXRlcml6ZWRUeXBlKHJlZiwgcmVmLnJlc29sdmVkVHlwZSwgdHlwZUJpbmRpbmdzKTsKIAkJCQkJCX0KQEAgLTg0NTUsMjM0ICsxMjA1OCw2OCBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShjaGFyW10gcXVhbGlmaWVkUGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSkgewotCQlyZXR1cm4gU2lnbmF0dXJlLmNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUoCi0JCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZSwKLQkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShxdWFsaWZpZWRUeXBlTmFtZSwgJy4nLCAnJCcpLCAnLicpLCB0cnVlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjaGFyW10gY3JlYXRlVHlwZVNpZ25hdHVyZShjaGFyW10gcXVhbGlmaWVkUGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSkgewotCQljaGFyW10gbmFtZSA9IG5ldyBjaGFyW3F1YWxpZmllZFR5cGVOYW1lLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocXVhbGlmaWVkVHlwZU5hbWUsIDAsIG5hbWUsIDAsIHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCk7Ci0JCQotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBsZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlzd2l0Y2ggKG5hbWVbaV0pIHsKLQkJCQljYXNlICcuJzoKLQkJCQkJaWYgKGRlcHRoID09IDAgJiYgbmFtZVtpIC0gMV0gIT0gJz4nKSB7Ci0JCQkJCQluYW1lW2ldID0gJyQnOworCXByaXZhdGUgYm9vbGVhbiBtdXN0UXVhbGlmeVR5cGUoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBjaGFyW10gcGFja2FnZU5hbWUsIFNjb3BlIHNjb3BlKSB7CisJCWlmKCFtdXN0UXVhbGlmeVR5cGUoCisJCQkJcGFja2FnZU5hbWUsCisJCQkJdHlwZS5zb3VyY2VOYW1lKCksCisJCQkJdHlwZS5pc01lbWJlclR5cGUoKSA/IHR5cGUuZW5jbG9zaW5nVHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKSA6IG51bGwsCisJCQkJdHlwZS5tb2RpZmllcnMpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQl3aGlsZSAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gZW5jbG9zaW5nVHlwZTsKKwkJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gY3VycmVudFR5cGUubWVtYmVyVHlwZXMoKTsKKwkJCQlpZihtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZW1iZXJUeXBlc1tpXS5zb3VyY2VOYW1lLCB0eXBlLnNvdXJjZU5hbWUoKSkgJiYKKwkJCQkJCQkJbWVtYmVyVHlwZXNbaV0uY2FuQmVTZWVuQnkoc2NvcGUpKSB7CisJCQkJCQkJcmV0dXJuIG1lbWJlclR5cGVzW2ldICE9IHR5cGU7CisJCQkJCQl9CiAJCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPCc6Ci0JCQkJCWRlcHRoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nOgotCQkJCQlkZXB0aCsrOwotCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CiAJCQl9CisJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCk7CiAJCX0KLQkJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKAotCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUsCi0JCQkJCQluYW1lLCAnLicpLCB0cnVlKTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZU1ldGhvZFNpZ25hdHVyZShjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdIHJldHVyblBhY2thZ2VuYW1lLCBjaGFyW10gcmV0dXJuVHlwZU5hbWUpIHsKLQkJY2hhcltdIHJldHVyblR5cGVTaWduYXR1cmUgPQotCQkJcmV0dXJuVHlwZU5hbWUgPT0gbnVsbCB8fCByZXR1cm5UeXBlTmFtZS5sZW5ndGggPT0gMAotCQkJPyBTaWduYXR1cmUuY3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZShWT0lELCB0cnVlKQotCQkJOiBTaWduYXR1cmUuY3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZSgKLQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQkJcmV0dXJuUGFja2FnZW5hbWUsCi0JCQkJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KHJldHVyblR5cGVOYW1lLCAnLicsICckJyksICcuJyksIHRydWUpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCi0JCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAotCQkJCXJldHVyblR5cGVTaWduYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlU2lnbmF0dXJlKSB7Ci0JCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVTaWduYXR1cmUgPSBuZXcgY2hhcltwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoXVtdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVTaWduYXR1cmUubGVuZ3RoOyBpKyspIHsKLQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVbaV0gPSAKLQkJCQlTaWduYXR1cmUuY3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZSgKLQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0sCi0JCQkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShwYXJhbWV0ZXJUeXBlTmFtZXNbaV0sICcuJywgJyQnKSwgJy4nKSwgdHJ1ZSk7CisJcHJpdmF0ZSBJbml0aWFsaXplciBwYXJzZVNuaXBwZUluaXRpYWxpemVyKGNoYXJbXSBzbmlwcGV0LCBpbnQgcG9zaXRpb24sIGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIGNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lcywgaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycywgYm9vbGVhbiBpc1N0YXRpYyl7CisJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXByZWZpeC5hcHBlbmQoInB1YmxpYyBjbGFzcyBGYWtlVHlwZSB7XG4gIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYoaXNTdGF0aWMpIHsKKwkJCXByZWZpeC5hcHBlbmQoInN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQkKLQkJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVNZXRob2RTaWduYXR1cmUoCi0JCQkJcGFyYW1ldGVyVHlwZVNpZ25hdHVyZSwKLQkJCQlyZXR1cm5UeXBlU2lnbmF0dXJlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChpbnQga2luZCwgaW50IGNvbXBsZXRpb25PZmZzZXQpIHsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShraW5kLCBjb21wbGV0aW9uT2Zmc2V0IC0gdGhpcy5vZmZzZXQpOwotCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKLQkJcHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7Ci0JCXJldHVybiBwcm9wb3NhbDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhIGNvbXBsZXRpb24gcHJvcG9zYWwgZm9yIGEgdHlwZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVHlwZVByb3Bvc2FsKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgYWNjZXNzaWJpbGl0eSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgcmVsZXZhbmNlKSB7Ci0KLQkJLy8gQ3JlYXRlIHN0YW5kYXJkIHR5cGUgcHJvcG9zYWwKLQkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpICYmICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLk9OTFlfSU5MSU5FX1RBRykgPT0gMCkgewotCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7Ci0JCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHBhY2thZ2VOYW1lKTsKLQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKTsKLQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOwotCQkJcHJvcG9zYWwuc2V0RmxhZ3MobW9kaWZpZXJzKTsKLQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJcHJvcG9zYWwuc2V0QWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5KTsKLQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CQotCQkJaWYoREVCVUcpIHsKLQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJfQorCQlwcmVmaXguYXBwZW5kKCJ7XG4iKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsVmFyaWFibGVUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCUFTVE5vZGUucHJpbnRNb2RpZmllcnMobG9jYWxWYXJpYWJsZU1vZGlmaWVyc1tpXSwgcHJlZml4KTsKKwkJCXByZWZpeC5hcHBlbmQoJyAnKTsKKwkJCXByZWZpeC5hcHBlbmQobG9jYWxWYXJpYWJsZVR5cGVOYW1lc1tpXSk7CisJCQlwcmVmaXguYXBwZW5kKCcgJyk7CisJCQlwcmVmaXguYXBwZW5kKGxvY2FsVmFyaWFibGVOYW1lc1tpXSk7CisJCQlwcmVmaXguYXBwZW5kKCc7Jyk7CiAJCX0KLQkJCi0JCS8vIENyZWF0ZSBqYXZhZG9jIHRleHQgcHJvcG9zYWwgaWYgbmVjZXNzYXJ5Ci0JCWlmICgodGhpcy5hc3Npc3ROb2RlSW5KYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5URVhUKSAhPSAwICYmICF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfVFlQRV9SRUYpKSB7Ci0JCQljaGFyW10gamF2YWRvY0NvbXBsZXRpb249IGlubGluZVRhZ0NvbXBsZXRpb24oY29tcGxldGlvbk5hbWUsIEphdmFkb2NUYWdDb25zdGFudHMuVEFHX0xJTkspOwotCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKLQkJCXByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOwotCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocGFja2FnZU5hbWUpOwotCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKGNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOwotCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUodHlwZU5hbWUpOwotCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihqYXZhZG9jQ29tcGxldGlvbik7Ci0JCQlwcm9wb3NhbC5zZXRGbGFncyhtb2RpZmllcnMpOwotCQkJaW50IHN0YXJ0ID0gKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuUkVQTEFDRV9UQUcpICE9IDAgPyB0aGlzLmphdmFkb2NUYWdQb3NpdGlvbiA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZShzdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZStSX0lOTElORV9UQUcpOwotCQkJcHJvcG9zYWwuc2V0QWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5KTsKLQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQlpZihERUJVRykgewotCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KKworCQljaGFyW10gZmFrZVNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeC50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIHNuaXBwZXQsICJ9fSIudG9DaGFyQXJyYXkoKSk7Ly8kTk9OLU5MUy0xJAorCQl0aGlzLm9mZnNldCA9IHByZWZpeC5sZW5ndGgoKTsKKworCQlTdHJpbmcgZW5jb2RpbmcgPSB0aGlzLmNvbXBpbGVyT3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmc7CisJCUJhc2ljQ29tcGlsYXRpb25Vbml0IGZha2VVbml0ID0gbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAorCQkJZmFrZVNvdXJjZSwKKwkJCW51bGwsCisJCQkiRmFrZVR5cGUuamF2YSIsIC8vJE5PTi1OTFMtMSQKKwkJCWVuY29kaW5nKTsKKworCQl0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiA9IHByZWZpeC5sZW5ndGgoKSArIHBvc2l0aW9uIC0gMTsKKworCQlDb21waWxhdGlvblJlc3VsdCBmYWtlUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KGZha2VVbml0LCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBmYWtlQVNUID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKGZha2VVbml0LCBmYWtlUmVzdWx0LCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisKKwkJcGFyc2VCbG9ja1N0YXRlbWVudHMoZmFrZUFTVCwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCisJCXJldHVybiAoSW5pdGlhbGl6ZXIpZmFrZUFTVC50eXBlc1swXS5maWVsZHNbMF07CiAJfQotCi0JLyoKLQkgKiBDcmVhdGUgYSBjb21wbGV0aW9uIHByb3Bvc2FsIGZvciBhIG1lbWJlciB0eXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlUHJvcG9zYWwoUmVmZXJlbmNlQmluZGluZyByZWZCaW5kaW5nLCBjaGFyW10gdHlwZU5hbWUsIGludCBhY2Nlc3NpYmlsaXR5LCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCByZWxldmFuY2UpIHsKLQotCQkvLyBDcmVhdGUgc3RhbmRhcmQgdHlwZSBwcm9wb3NhbAotCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikgJiYgKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuT05MWV9JTkxJTkVfVEFHKSA9PSAwKSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgdGhpcy5hY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQlwcm9wb3NhbC5uYW1lTG9va3VwID0gdGhpcy5uYW1lRW52aXJvbm1lbnQubmFtZUxvb2t1cDsKLQkJCXByb3Bvc2FsLmNvbXBsZXRpb25FbmdpbmUgPSB0aGlzOwotCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25TaWduYXR1cmUocmVmQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVmQmluZGluZykpOwotCQkJcHJvcG9zYWwuc2V0UGFja2FnZU5hbWUocmVmQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKTsKLQkJCXByb3Bvc2FsLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbk5hbWUpOwotCQkJcHJvcG9zYWwuc2V0RmxhZ3MocmVmQmluZGluZy5tb2RpZmllcnMpOwotCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7Ci0JCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJaWYoREVCVUcpIHsKLQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgamF2YWRvYyB0ZXh0IHByb3Bvc2FsIGlmIG5lY2Vzc2FyeQotCQlpZiAoKHRoaXMuYXNzaXN0Tm9kZUluSmF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMCAmJiAhdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGKSkgewotCQkJY2hhcltdIGphdmFkb2NDb21wbGV0aW9uPSBpbmxpbmVUYWdDb21wbGV0aW9uKGNvbXBsZXRpb25OYW1lLCBKYXZhZG9jVGFnQ29uc3RhbnRzLlRBR19MSU5LKTsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IENvbXBsZXRpb25Qcm9wb3NhbC5jcmVhdGUoQ29tcGxldGlvblByb3Bvc2FsLkpBVkFET0NfVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7Ci0JCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHJlZkJpbmRpbmcpKTsKLQkJCXByb3Bvc2FsLnNldFBhY2thZ2VOYW1lKHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7Ci0JCQlwcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0JCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGphdmFkb2NDb21wbGV0aW9uKTsKLQkJCXByb3Bvc2FsLnNldEZsYWdzKHJlZkJpbmRpbmcubW9kaWZpZXJzKTsKLQkJCWludCBzdGFydCA9ICh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlJFUExBQ0VfVEFHKSAhPSAwID8gdGhpcy5qYXZhZG9jVGFnUG9zaXRpb24gOiB0aGlzLnN0YXJ0UG9zaXRpb247Ci0JCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2Uoc3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UrUl9JTkxJTkVfVEFHKTsKLQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7Ci0JCQlpZihERUJVRykgewotCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhIGNvbXBsZXRpb24gcHJvcG9zYWwgZm9yIGEgbWVtYmVyIHR5cGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGVQYXJhbWV0ZXJQcm9wb3NhbChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIsIGludCByZWxldmFuY2UpIHsKLQkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gdHlwZVBhcmFtZXRlci5uYW1lOwotCi0JCS8vIENyZWF0ZSBzdGFuZGFyZCB0eXBlIHByb3Bvc2FsCi0JCWlmKCF0aGlzLnJlcXVlc3Rvci5pc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgewotCQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOwotCQkJcHJvcG9zYWwubmFtZUxvb2t1cCA9IHRoaXMubmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXA7Ci0JCQlwcm9wb3NhbC5jb21wbGV0aW9uRW5naW5lID0gdGhpczsKLQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShnZXRTaWduYXR1cmUodHlwZVBhcmFtZXRlci5iaW5kaW5nKSk7Ci0JCQlwcm9wb3NhbC5zZXRUeXBlTmFtZShjb21wbGV0aW9uTmFtZSk7Ci0JCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb25OYW1lKTsKLQkJCXByb3Bvc2FsLnNldEZsYWdzKHR5cGVQYXJhbWV0ZXIubW9kaWZpZXJzKTsKLQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOwotCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gQ3JlYXRlIGphdmFkb2MgdGV4dCBwcm9wb3NhbCBpZiBuZWNlc3NhcnkKLQkJaWYgKCh0aGlzLmFzc2lzdE5vZGVJbkphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDAgJiYgIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRikpIHsKLQkJCWNoYXJbXSBqYXZhZG9jQ29tcGxldGlvbj0gaW5saW5lVGFnQ29tcGxldGlvbihjb21wbGV0aW9uTmFtZSwgSmF2YWRvY1RhZ0NvbnN0YW50cy5UQUdfTElOSyk7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1RZUEVfUkVGLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKLQkJCXByb3Bvc2FsLm5hbWVMb29rdXAgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwOwotCQkJcHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7Ci0JCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoZ2V0U2lnbmF0dXJlKHR5cGVQYXJhbWV0ZXIuYmluZGluZykpOwotCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoamF2YWRvY0NvbXBsZXRpb24pOwotCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihqYXZhZG9jQ29tcGxldGlvbik7Ci0JCQlwcm9wb3NhbC5zZXRGbGFncyh0eXBlUGFyYW1ldGVyLm1vZGlmaWVycyk7Ci0JCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7Ci0JCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlK1JfSU5MSU5FX1RBRyk7Ci0JCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOwotCQkJaWYoREVCVUcpIHsKLQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21wbGV0aW9uIHN0cmluZyBpbnNlcnRlZCBpbnNpZGUgYSBzcGVjaWZpZWQgaW5saW5lIHRhZy4KLQkgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUKLQkgKiBAcmV0dXJuIGNoYXJbXSBDb21wbGV0aW9uIHRleHQgaW5jbHVuZGluZyBzcGVjaWZpZWQgaW5saW5lIHRhZwotCSAqLwotCXByaXZhdGUgY2hhcltdIGlubGluZVRhZ0NvbXBsZXRpb24oY2hhcltdIGNvbXBsZXRpb25OYW1lLCBjaGFyW10gaW5saW5lVGFnKSB7Ci0JCWludCB0YWdMZW5ndGg9IGlubGluZVRhZy5sZW5ndGg7Ci0JCWludCBjb21wbGV0aW9uTGVuZ3RoID0gY29tcGxldGlvbk5hbWUubGVuZ3RoOwotCQlpbnQgaW5saW5lTGVuZ3RoID0gMit0YWdMZW5ndGgrMStjb21wbGV0aW9uTGVuZ3RoKzE7Ci0JCWNoYXJbXSBpbmxpbmVDb21wbGV0aW9uID0gbmV3IGNoYXJbaW5saW5lTGVuZ3RoXTsKLQkJaW5saW5lQ29tcGxldGlvblswXSA9ICd7JzsKLQkJaW5saW5lQ29tcGxldGlvblsxXSA9ICdAJzsKLQkJU3lzdGVtLmFycmF5Y29weShpbmxpbmVUYWcsIDAsIGlubGluZUNvbXBsZXRpb24sIDIsIHRhZ0xlbmd0aCk7Ci0JCWlubGluZUNvbXBsZXRpb25bdGFnTGVuZ3RoKzJdID0gJyAnOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbXBsZXRpb25OYW1lLCAwLCBpbmxpbmVDb21wbGV0aW9uLCB0YWdMZW5ndGgrMywgY29tcGxldGlvbkxlbmd0aCk7Ci0JCS8vIGRvIG5vdCBhZGQgc3BhY2UgYXQgZW5kIG9mIGlubGluZSB0YWcgKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTAyNikKLQkJLy9pbmxpbmVDb21wbGV0aW9uW2lubGluZUxlbmd0aC0yXSA9ICcgJzsgCi0JCWlubGluZUNvbXBsZXRpb25baW5saW5lTGVuZ3RoLTFdID0gJ30nOwotCQlyZXR1cm4gaW5saW5lQ29tcGxldGlvbjsKLQl9Ci0KIAlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnKENhdGVnb3JpemVkUHJvYmxlbSBlcnJvcikgewogCQlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50KCJDT01QTEVUSU9OIC0gY29tcGxldGlvbkZhaWx1cmUoIik7IC8vJE5PTi1OTFMtMSQKQEAgLTg2OTAsMTggKzEyMTI3LDEyIEBACiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCQotCXByaXZhdGUgdm9pZCBwcmludERlYnVnVGFiKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWI7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJfQotCX0KLQkKIAlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCl7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCXByaW50RGVidWcocHJvcG9zYWwsIDAsIGJ1ZmZlcik7CiAJCVN5c3RlbS5vdXQucHJpbnRsbihidWZmZXIudG9TdHJpbmcoKSk7CiAJfQorCiAJcHJpdmF0ZSB2b2lkIHByaW50RGVidWcoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyKXsKIAkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CiAJCWJ1ZmZlci5hcHBlbmQoIkNPTVBMRVRJT04gLSAiKTsgLy8kTk9OLU5MUy0xJApAQCAtODcxMiw2ICsxMjE0Myw5IEBACiAJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUYgOgogCQkJCWJ1ZmZlci5hcHBlbmQoIkZJRUxEX1JFRiIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CiAJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5LRVlXT1JEIDoKIAkJCQlidWZmZXIuYXBwZW5kKCJLRVlXT1JEIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlicmVhazsKQEAgLTg3MjcsNiArMTIxNjEsOSBAQAogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiA6CiAJCQkJYnVmZmVyLmFwcGVuZCgiTUVUSE9EX1JFRiIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJNRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKIAkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLlBBQ0tBR0VfUkVGIDoKIAkJCQlidWZmZXIuYXBwZW5kKCJQQUNLQUdFX1JFRiIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CkBAIC04NzU0LDEyICsxMjE5MSwxOCBAQAogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQgOgogCQkJCWJ1ZmZlci5hcHBlbmQoIlRZUEVfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04gOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkNPTlNUUlVDVE9SX0lOVk9DQVRJT04iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04gOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQgOgogCQkJCWJ1ZmZlci5hcHBlbmQoIlBST1BPU0FMIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlicmVhazsKLQkJCQkKKwogCQl9Ci0JCQorCiAJCWJ1ZmZlci5hcHBlbmQoIntcbiIpOy8vJE5PTi1OTFMtMSQKIAkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CiAJCWJ1ZmZlci5hcHBlbmQoIlx0Q29tcGxldGlvblsiKS5hcHBlbmQocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpID09IG51bGwgPyAibnVsbCIudG9DaGFyQXJyYXkoKSA6IHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSkuYXBwZW5kKCJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKQEAgLTg3NzMsNyArMTIyMTYsNyBAQAogCQlidWZmZXIuYXBwZW5kKCJcdEtleVsiKS5hcHBlbmQocHJvcG9zYWwuZ2V0S2V5KCkgPT0gbnVsbCA/ICJudWxsIi50b0NoYXJBcnJheSgpIDogcHJvcG9zYWwuZ2V0S2V5KCkpLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXByaW50RGVidWdUYWIodGFiLCBidWZmZXIpOwogCQlidWZmZXIuYXBwZW5kKCJcdE5hbWVbIikuYXBwZW5kKHByb3Bvc2FsLmdldE5hbWUoKSA9PSBudWxsID8gIm51bGwiLnRvQ2hhckFycmF5KCkgOiBwcm9wb3NhbC5nZXROYW1lKCkpLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQorCiAJCXByaW50RGVidWdUYWIodGFiLCBidWZmZXIpOwogCQlidWZmZXIuYXBwZW5kKCJcdEZsYWdzWyIpOy8vJE5PTi1OTFMtMSQKIAkJaW50IGZsYWdzID0gcHJvcG9zYWwuZ2V0RmxhZ3MoKTsKQEAgLTg3ODEsNyArMTIyMjQsNyBAQAogCQlpZigoZmxhZ3MgJiBGbGFncy5BY2NJbnRlcmZhY2UpICE9IDApIGJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsvLyROT04tTkxTLTEkCiAJCWlmKChmbGFncyAmIEZsYWdzLkFjY0VudW0pICE9IDApIGJ1ZmZlci5hcHBlbmQoImVudW0gIik7Ly8kTk9OLU5MUy0xJAogCQlidWZmZXIuYXBwZW5kKCJdXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkKKwogCQlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9wb3NhbC5nZXRSZXF1aXJlZFByb3Bvc2FscygpOwogCQlpZihwcm9wb3NhbHMgIT0gbnVsbCkgewogCQkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CkBAIC04NzkzLDcgKzEyMjM2LDcgQEAKIAkJCXByaW50RGVidWdUYWIodGFiLCBidWZmZXIpOwogCQkJYnVmZmVyLmFwcGVuZCgiXG5cdF1cbiIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CiAJCWJ1ZmZlci5hcHBlbmQoIlx0Q29tcGxldGlvbkxvY2F0aW9uWyIpLmFwcGVuZChwcm9wb3NhbC5nZXRDb21wbGV0aW9uTG9jYXRpb24oKSkuYXBwZW5kKCJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWludCBzdGFydCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwpAQCAtODgwMSw2ICsxMjI0NCwxMSBAQAogCQlwcmludERlYnVnVGFiKHRhYiwgYnVmZmVyKTsKIAkJYnVmZmVyLmFwcGVuZCgiXHRSZXBsYWNlU3RhcnRbIikuYXBwZW5kKHN0YXJ0KS5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWJ1ZmZlci5hcHBlbmQoIi1SZXBsYWNlRW5kWyIpLmFwcGVuZChlbmQpLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlzdGFydCA9IHByb3Bvc2FsLmdldFRva2VuU3RhcnQoKTsKKwkJZW5kID0gcHJvcG9zYWwuZ2V0VG9rZW5FbmQoKTsKKwkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CisJCWJ1ZmZlci5hcHBlbmQoIlx0VG9rZW5TdGFydFsiKS5hcHBlbmQoc3RhcnQpLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJYnVmZmVyLmFwcGVuZCgiLVRva2VuRW5kWyIpLmFwcGVuZChlbmQpLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbCkgewogCQkJcHJpbnREZWJ1Z1RhYih0YWIsIGJ1ZmZlcik7CiAJCQlidWZmZXIuYXBwZW5kKCJcdFJlcGxhY2VkVGV4dFsiKS5hcHBlbmQodGhpcy5zb3VyY2UsIHN0YXJ0LCBlbmQtc3RhcnQpLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtODgxNCw0NSArMTIyNjIsNDYxIEBACiAJCXByaW50RGVidWdUYWIodGFiLCBidWZmZXIpOwogCQlidWZmZXIuYXBwZW5kKCJ9XG4iKTsvLyROT04tTkxTLTEkCiAJfQotCQotCXByaXZhdGUgY2hhcltdW10gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lcyhUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcywgY2hhcltdW10gZXhjbHVkZWROYW1lcykgewotCQljaGFyW11bXSBzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhclt0eXBlVmFyaWFibGVzLmxlbmd0aF1bXTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXNbaV0gPSB0eXBlVmFyaWFibGVzW2ldLnNvdXJjZU5hbWU7CisKKwlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z1RhYihpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiOyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CiAJCX0KLQkJCi0JCWJvb2xlYW4gZm91bmRDb25mbGljdHMgPSBmYWxzZTsKLQkJCi0JCW5leHRUeXBlUGFyYW1ldGVyIDogZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZUJpbmRpbmcgPSB0eXBlVmFyaWFibGVzW2ldOwotCQkJY2hhcltdIG1ldGhvZFBhcmFtZXRlck5hbWUgPSB0eXBlVmFyaWFibGVCaW5kaW5nLnNvdXJjZU5hbWU7Ci0JCQkKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhjbHVkZWROYW1lcy5sZW5ndGg7IGorKykgewotCQkJCWNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSA9IGV4Y2x1ZGVkTmFtZXNbal07Ci0JCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZVBhcmFtZXRlck5hbWUsIG1ldGhvZFBhcmFtZXRlck5hbWUsIGZhbHNlKSkgewotCQkJCQljaGFyW10gc3Vic3RpdHV0aW9uOwotCQkJCQlpZihtZXRob2RQYXJhbWV0ZXJOYW1lLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQlpZihTY2FubmVySGVscGVyLmlzVXBwZXJDYXNlKG1ldGhvZFBhcmFtZXRlck5hbWVbMF0pKSB7Ci0JCQkJCQkJc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lKG1ldGhvZFBhcmFtZXRlck5hbWVbMF0sICdBJywgJ1onLCBleGNsdWRlZE5hbWVzLCBzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRlTWV0aG9kVHlwZVBhcmFtZXRlck5hbWUobWV0aG9kUGFyYW1ldGVyTmFtZVswXSwgJ2EnLCAneicsIGV4Y2x1ZGVkTmFtZXMsIHN1YnN0aXR1ZWRQYXJhbWV0ZXJOYW1lcyk7CQkJCQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lKG1ldGhvZFBhcmFtZXRlck5hbWUsIGV4Y2x1ZGVkTmFtZXMsIHN1YnN0aXR1ZWRQYXJhbWV0ZXJOYW1lcyk7Ci0JCQkJCX0KLQkJCQkJc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzW2ldID0gc3Vic3RpdHV0aW9uOwotCQkJCQkKLQkJCQkJZm91bmRDb25mbGljdHMgPSB0cnVlOwotCQkJCQljb250aW51ZSBuZXh0VHlwZVBhcmFtZXRlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGZvdW5kQ29uZmxpY3RzKSByZXR1cm4gc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzOwotCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJcHJpdmF0ZSB2b2lkIHByb3Bvc2VDb25zdHJ1Y3RvcihBY2NlcHRlZENvbnN0cnVjdG9yIGRlZmVycmVkUHJvcG9zYWwsIFNjb3BlIHNjb3BlKSB7CisJCWlmIChkZWZlcnJlZFByb3Bvc2FsLnByb3Bvc2VDb25zdHJ1Y3RvcikgeworCQkJcHJvcG9zZUNvbnN0cnVjdG9yKAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpbXBsZVR5cGVOYW1lLAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnBhcmFtZXRlckNvdW50LAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpZ25hdHVyZSwKKwkJCQkJZGVmZXJyZWRQcm9wb3NhbC5wYXJhbWV0ZXJUeXBlcywKKwkJCQkJZGVmZXJyZWRQcm9wb3NhbC5wYXJhbWV0ZXJOYW1lcywKKwkJCQkJZGVmZXJyZWRQcm9wb3NhbC5tb2RpZmllcnMsCisJCQkJCWRlZmVycmVkUHJvcG9zYWwucGFja2FnZU5hbWUsCisJCQkJCWRlZmVycmVkUHJvcG9zYWwudHlwZU1vZGlmaWVycywKKwkJCQkJZGVmZXJyZWRQcm9wb3NhbC5hY2Nlc3NpYmlsaXR5LAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLnNpbXBsZVR5cGVOYW1lLAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLmZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCQkJZGVmZXJyZWRQcm9wb3NhbC5tdXN0QmVRdWFsaWZpZWQsCisJCQkJCXNjb3BlLAorCQkJCQlkZWZlcnJlZFByb3Bvc2FsLmV4dHJhRmxhZ3MpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBwcm9wb3NlQ29uc3RydWN0b3IoCisJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQlpbnQgcGFyYW1ldGVyQ291bnQsCisJCQljaGFyW10gc2lnbmF0dXJlLAorCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJCWludCBtb2RpZmllcnMsCisJCQljaGFyW10gcGFja2FnZU5hbWUsCisJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCWludCBhY2Nlc3NpYmlsaXR5LAorCQkJY2hhcltdIHR5cGVOYW1lLAorCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSwKKwkJCWJvb2xlYW4gaXNRdWFsaWZpZWQsCisJCQlTY29wZSBzY29wZSwKKwkJCWludCBleHRyYUZsYWdzKSB7CisJCWNoYXJbXSB0eXBlQ29tcGxldGlvbiA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsKKwkJaWYoaXNRdWFsaWZpZWQpIHsKKwkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJCWlmICh0aGlzLnVuaXRTY29wZSAhPSBudWxsICYmIHRoaXMudW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKKwkJCQkJcmV0dXJuOyAvLyBpZ25vcmUgdHlwZXMgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIGZyb20gb3V0c2lkZSBpdAorCQl9IGVsc2UgeworCQkJdHlwZUNvbXBsZXRpb24gPSBzaW1wbGVUeXBlTmFtZTsKKwkJfQorCisJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2ltcGxlVHlwZU5hbWUpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGlzUXVhbGlmaWVkKTsKKworCQlib29sZWFuIGlzSW50ZXJmYWNlID0gZmFsc2U7CisJCWludCBraW5kID0gdHlwZU1vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0gfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbik7CisJCXN3aXRjaCAoa2luZCkgeworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbjoKKwkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24gfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlOgorCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQW5ub3RhdGlvbigpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJaXNJbnRlcmZhY2UgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bToKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckVudW0oKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZToKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQkJCWlzSW50ZXJmYWNlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKHNpbXBsZVR5cGVOYW1lKTsKKwkJCQlicmVhazsKKwkJfQorCQkKKwkJY2hhcltdIGNvbXBsZXRpb247CisJCWlmICh0aGlzLnNvdXJjZSAhPSBudWxsCisJCQkJCSYmIHRoaXMuc291cmNlLmxlbmd0aCA+IHRoaXMuZW5kUG9zaXRpb24KKwkJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5lbmRQb3NpdGlvbl0gPT0gJygnKSB7CisJCQljb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQl9IGVsc2UgeworCQkJY29tcGxldGlvbiA9IG5ldyBjaGFyW10geyAnKCcsICcpJyB9OworCQl9CisJCQorCQlJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCB0eXBlUHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJdHlwZVByb3Bvc2FsLm5hbWVMb29rdXAgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwOworCQl0eXBlUHJvcG9zYWwuY29tcGxldGlvbkVuZ2luZSA9IHRoaXM7CisJCXR5cGVQcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShwYWNrYWdlTmFtZSk7CisJCXR5cGVQcm9wb3NhbC5zZXRTaWduYXR1cmUoY3JlYXRlTm9uR2VuZXJpY1R5cGVTaWduYXR1cmUocGFja2FnZU5hbWUsIHR5cGVOYW1lKSk7CisJCXR5cGVQcm9wb3NhbC5zZXRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCXR5cGVQcm9wb3NhbC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7CisJCXR5cGVQcm9wb3NhbC5zZXRDb21wbGV0aW9uKHR5cGVDb21wbGV0aW9uKTsKKwkJdHlwZVByb3Bvc2FsLnNldEZsYWdzKHR5cGVNb2RpZmllcnMpOworCQl0eXBlUHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQl0eXBlUHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJdHlwZVByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkKKwkJc3dpdGNoIChwYXJhbWV0ZXJDb3VudCkgeworCQkJY2FzZSAtMTogLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgorCQkJCWludCBmbGFncyA9IEZsYWdzLkFjY1B1YmxpYzsKKwkJCQlpZiAoRmxhZ3MuaXNEZXByZWNhdGVkKHR5cGVNb2RpZmllcnMpKSB7CisJCQkJCWZsYWdzIHw9IEZsYWdzLkFjY0RlcHJlY2F0ZWQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChpc0ludGVyZmFjZSB8fCAodHlwZU1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgIT0gMCkgeworCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KGNyZWF0ZUJpbmRpbmdLZXkocGFja2FnZU5hbWUsIHR5cGVOYW1lKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoREVGQVVMVF9DT05TVFJVQ1RPUl9TSUdOQVRVUkUpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShzaW1wbGVUeXBlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhuZXcgQ29tcGxldGlvblByb3Bvc2FsW117dHlwZVByb3Bvc2FsfSk7CisJCQkJCQlwcm9wb3NhbC5zZXRJc0NvbnRydWN0b3IodHJ1ZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MoZmxhZ3MpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04sIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKERFRkFVTFRfQ09OU1RSVUNUT1JfU0lHTkFUVVJFKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUocGFja2FnZU5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25UeXBlTmFtZSh0eXBlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyVHlwZU5hbWVzKENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKKwkJCQkJCXByb3Bvc2FsLnNldE5hbWUoc2ltcGxlVHlwZU5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMobmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde3R5cGVQcm9wb3NhbH0pOworCQkJCQkJcHJvcG9zYWwuc2V0SXNDb250cnVjdG9yKHRydWUpOworCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKGZsYWdzKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAwOiAvLyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcgorCQkJCQorCQkJCWlmICgodHlwZU1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgIT0gMCkgeworCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uS2V5KGNyZWF0ZUJpbmRpbmdLZXkocGFja2FnZU5hbWUsIHR5cGVOYW1lKSk7CisJCQkJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoREVGQVVMVF9DT05TVFJVQ1RPUl9TSUdOQVRVUkUpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJcHJvcG9zYWwuc2V0TmFtZShzaW1wbGVUeXBlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXF1aXJlZFByb3Bvc2FscyhuZXcgQ29tcGxldGlvblByb3Bvc2FsW117dHlwZVByb3Bvc2FsfSk7CisJCQkJCQlwcm9wb3NhbC5zZXRJc0NvbnRydWN0b3IodHJ1ZSk7CisJCQkJCQlwcm9wb3NhbC5zZXRDb21wbGV0aW9uKGNvbXBsZXRpb24pOworCQkJCQkJcHJvcG9zYWwuc2V0RmxhZ3MobW9kaWZpZXJzKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcGxhY2VSYW5nZSh0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQsIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRUb2tlblJhbmdlKHRoaXMudG9rZW5TdGFydCAtIHRoaXMub2Zmc2V0LCB0aGlzLnRva2VuRW5kIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVsZXZhbmNlKHJlbGV2YW5jZSk7CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCWlmKCFpc0lnbm9yZWQoQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04sIENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikpIHsKKwkJCQkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShjcmVhdGVOb25HZW5lcmljVHlwZVNpZ25hdHVyZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShERUZBVUxUX0NPTlNUUlVDVE9SX1NJR05BVFVSRSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUodHlwZU5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKHNpbXBsZVR5cGVOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlUHJvcG9zYWx9KTsKKwkJCQkJCXByb3Bvc2FsLnNldElzQ29udHJ1Y3Rvcih0cnVlKTsKKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtb2RpZmllcnMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcgorCQkJCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgeworCQkJCQkvLyByZXNvbHZlIHR5cGUgdG8gZm91bmQgcGFyYW1ldGVyIHR5cGVzCisJCQkJCXNpZ25hdHVyZSA9IGdldFJlc29sdmVkU2lnbmF0dXJlKHBhcmFtZXRlclR5cGVzLCBmdWxseVF1YWxpZmllZE5hbWUsIHBhcmFtZXRlckNvdW50LCBzY29wZSk7CisJCQkJCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCXNpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShzaWduYXR1cmUsICcvJywgJy4nKTsKKwkJCQl9CisJCQkJCisJCQkJaW50IHBhcmFtZXRlck5hbWVzTGVuZ3RoID0gcGFyYW1ldGVyTmFtZXMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7CisJCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IHBhcmFtZXRlck5hbWVzTGVuZ3RoKSB7CisJCQkJCXBhcmFtZXRlck5hbWVzID0gbnVsbDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKCh0eXBlTW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSAhPSAwKSB7CisJCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQlpZighaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25LZXkoY3JlYXRlQmluZGluZ0tleShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKTsKKwkJCQkJCXByb3Bvc2FsLnNldFNpZ25hdHVyZShzaWduYXR1cmUpOworCQkJCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOworCQkJCQkJaWYgKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKKwkJCQkJCQlwcm9wb3NhbC5zZXRQYXJhbWV0ZXJOYW1lcyhwYXJhbWV0ZXJOYW1lcyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByb3Bvc2FsLnNldEhhc05vUGFyYW1ldGVyTmFtZXNGcm9tSW5kZXgodHJ1ZSk7CisJCQkJCQl9CisJCQkJCQlwcm9wb3NhbC5zZXROYW1lKHNpbXBsZVR5cGVOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlcXVpcmVkUHJvcG9zYWxzKG5ldyBDb21wbGV0aW9uUHJvcG9zYWxbXXt0eXBlUHJvcG9zYWx9KTsKKwkJCQkJCXByb3Bvc2FsLnNldElzQ29udHJ1Y3Rvcih0cnVlKTsKKwkJCQkJCXByb3Bvc2FsLnNldENvbXBsZXRpb24oY29tcGxldGlvbik7CisJCQkJCQlwcm9wb3NhbC5zZXRGbGFncyhtb2RpZmllcnMpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLm9mZnNldCwgdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFRva2VuUmFuZ2UodGhpcy50b2tlblN0YXJ0IC0gdGhpcy5vZmZzZXQsIHRoaXMudG9rZW5FbmQgLSB0aGlzLm9mZnNldCk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZWxldmFuY2UocmVsZXZhbmNlKTsKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CisJCQkJCQlpZihERUJVRykgeworCQkJCQkJCXRoaXMucHJpbnREZWJ1Zyhwcm9wb3NhbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJaWYoIWlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwgQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSkgeworCQkJCQkJSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAgY3JlYXRlUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsLkNPTlNUUlVDVE9SX0lOVk9DQVRJT04sIHRoaXMuYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uU2lnbmF0dXJlKGNyZWF0ZU5vbkdlbmVyaWNUeXBlU2lnbmF0dXJlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOworCQkJCQkJcHJvcG9zYWwuc2V0U2lnbmF0dXJlKHNpZ25hdHVyZSk7CisJCQkJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKwkJCQkJCXByb3Bvc2FsLnNldERlY2xhcmF0aW9uVHlwZU5hbWUodHlwZU5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKKwkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlclR5cGVOYW1lcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7CisJCQkJCQlpZiAocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgeworCQkJCQkJCXByb3Bvc2FsLnNldFBhcmFtZXRlck5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcHJvcG9zYWwuc2V0SGFzTm9QYXJhbWV0ZXJOYW1lc0Zyb21JbmRleCh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJCXByb3Bvc2FsLnNldE5hbWUoc2ltcGxlVHlwZU5hbWUpOworCQkJCQkJcHJvcG9zYWwuc2V0UmVxdWlyZWRQcm9wb3NhbHMobmV3IENvbXBsZXRpb25Qcm9wb3NhbFtde3R5cGVQcm9wb3NhbH0pOworCQkJCQkJcHJvcG9zYWwuc2V0SXNDb250cnVjdG9yKHRydWUpOworCQkJCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbihjb21wbGV0aW9uKTsKKwkJCQkJCXByb3Bvc2FsLnNldEZsYWdzKG1vZGlmaWVycyk7CisJCQkJCQlwcm9wb3NhbC5zZXRSZXBsYWNlUmFuZ2UodGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCQkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJCQkJCisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHQocHJvcG9zYWwpOworCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQl0aGlzLnByaW50RGVidWcocHJvcG9zYWwpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb3Bvc2VOZXdNZXRob2QoY2hhcltdIHRva2VuLCBSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZSkgeworCQlpZighdGhpcy5yZXF1ZXN0b3IuaXNJZ25vcmVkKENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OKSkgeworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclJlc29sdXRpb24oKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JSZXN0cmljdGlvbnMoSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKTsgLy8gbm8gYWNjZXNzIHJlc3RyaWN0aW9uIGZvciBuZXcgbWV0aG9kCisKKwkJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gIGNyZWF0ZVByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OLCB0aGlzLmFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblNpZ25hdHVyZShnZXRTaWduYXR1cmUocmVmZXJlbmNlKSk7CisJCQlwcm9wb3NhbC5zZXRTaWduYXR1cmUoCisJCQkJCWNyZWF0ZU1ldGhvZFNpZ25hdHVyZSgKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCQkJCQkJVk9JRCkpOworCQkJcHJvcG9zYWwuc2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZShyZWZlcmVuY2UucXVhbGlmaWVkUGFja2FnZU5hbWUoKSk7CisJCQlwcm9wb3NhbC5zZXREZWNsYXJhdGlvblR5cGVOYW1lKHJlZmVyZW5jZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCkpOworCisJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOworCQkJcHJvcG9zYWwuc2V0VHlwZU5hbWUoVk9JRCk7CisJCQlwcm9wb3NhbC5zZXROYW1lKHRva2VuKTsKKwkJCS8vcHJvcG9zYWwuc2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKG51bGwpOworCQkJLy9wcm9wb3NhbC5zZXRQYXJhbWV0ZXJUeXBlTmFtZXMobnVsbCk7CisJCQkvL3Byb3Bvc2FsLnNldFBhY2thZ2VOYW1lKG51bGwpOworCQkJcHJvcG9zYWwuc2V0Q29tcGxldGlvbih0b2tlbik7CisJCQlwcm9wb3NhbC5zZXRGbGFncyhGbGFncy5BY2NQdWJsaWMpOworCQkJcHJvcG9zYWwuc2V0UmVwbGFjZVJhbmdlKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMub2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uIC0gdGhpcy5vZmZzZXQpOworCQkJcHJvcG9zYWwuc2V0VG9rZW5SYW5nZSh0aGlzLnRva2VuU3RhcnQgLSB0aGlzLm9mZnNldCwgdGhpcy50b2tlbkVuZCAtIHRoaXMub2Zmc2V0KTsKKwkJCXByb3Bvc2FsLnNldFJlbGV2YW5jZShyZWxldmFuY2UpOworCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0KHByb3Bvc2FsKTsKKwkJCWlmKERFQlVHKSB7CisJCQkJdGhpcy5wcmludERlYnVnKHByb3Bvc2FsKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9wb3NlVHlwZSgKKwkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJCWNoYXJbXSBzaW1wbGVUeXBlTmFtZSwKKwkJCWludCBtb2RpZmllcnMsCisJCQlpbnQgYWNjZXNzaWJpbGl0eSwKKwkJCWNoYXJbXSB0eXBlTmFtZSwKKwkJCWNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUsCisJCQlib29sZWFuIGlzUXVhbGlmaWVkLAorCQkJU2NvcGUgc2NvcGUpIHsKKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gZnVsbHlRdWFsaWZpZWROYW1lOworCQlpZihpc1F1YWxpZmllZCkgeworCQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoID09IDApCisJCQkJaWYgKHRoaXMudW5pdFNjb3BlICE9IG51bGwgJiYgdGhpcy51bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKQorCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CisJCX0gZWxzZSB7CisJCQljb21wbGV0aW9uTmFtZSA9IHNpbXBsZVR5cGVOYW1lOworCQl9CisKKwkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUgPSBudWxsOworCQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uKSAhPSAwICYmCisJCQkJdGhpcy5hc3Npc3ROb2RlSXNBbm5vdGF0aW9uICYmCisJCQkJKHRoaXMudGFyZ2V0ZWRFbGVtZW50ICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSykgIT0gMCkgeworCQkJY2hhcltdW10gY24gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZE5hbWUpOworCisJCQlUeXBlUmVmZXJlbmNlIHJlZjsKKwkJCWlmIChjbi5sZW5ndGggPT0gMSkgeworCQkJCXJlZiA9IG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKHNpbXBsZVR5cGVOYW1lLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoY24sbmV3IGxvbmdbY24ubGVuZ3RoXSk7CisJCQl9CisKKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQljYXNlIFNjb3BlLkJMT0NLX1NDT1BFIDoKKwkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpc2NvcGUpOworCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGd1ZXNzZWRUeXBlID09IG51bGwgfHwgIWd1ZXNzZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybjsKKworCQkJaWYgKCFoYXNQb3NzaWJsZUFubm90YXRpb25UYXJnZXQoZ3Vlc3NlZFR5cGUsIHNjb3BlKSkgcmV0dXJuOworCQl9CisKKwkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzb2x1dGlvbigpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwocGFja2FnZU5hbWUsIGZ1bGx5UXVhbGlmaWVkTmFtZSk7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUmVzdHJpY3Rpb25zKGFjY2Vzc2liaWxpdHkpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0aGlzLmNvbXBsZXRpb25Ub2tlbiwgc2ltcGxlVHlwZU5hbWUpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGlzUXVhbGlmaWVkKTsKKworCQlpbnQga2luZCA9IG1vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0gfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbik7CisJCXN3aXRjaCAoa2luZCkgeworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbjoKKwkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24gfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlOgorCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQW5ub3RhdGlvbigpOworCQkJCWlmIChndWVzc2VkVHlwZSAhPSBudWxsKSByZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckFubm90YXRpb25UYXJnZXQoZ3Vlc3NlZFR5cGUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtOgorCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRW51bSgpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlOgorCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihzaW1wbGVUeXBlTmFtZSk7CisJCQkJYnJlYWs7CisJCX0KKworCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJaWYoIXRoaXMucmVxdWVzdG9yLmlzSWdub3JlZChDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpKSB7CisJCQljcmVhdGVUeXBlUHJvcG9zYWwocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBtb2RpZmllcnMsIGFjY2Vzc2liaWxpdHksIGNvbXBsZXRpb25OYW1lLCByZWxldmFuY2UpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisKKwkJc3VwZXIucmVzZXQoZmFsc2UpOworCQl0aGlzLmtub3duUGtncyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7CisJCXRoaXMua25vd25UeXBlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgxMCk7CisJCWlmICh0aGlzLm5vQ2FjaGVOYW1lRW52aXJvbm1lbnQgIT0gbnVsbCkgeworCQkJdGhpcy5ub0NhY2hlTmFtZUVudmlyb25tZW50LmNsZWFudXAoKTsKKwkJCXRoaXMubm9DYWNoZU5hbWVFbnZpcm9ubWVudCA9IG51bGw7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5mbHVzaFppcEZpbGVzKHRoaXMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNvdXJjZUFuZFRva2VuUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXRoaXMuc2V0U291cmNlQW5kVG9rZW5SYW5nZShzdGFydCwgZW5kLCB0cnVlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U291cmNlQW5kVG9rZW5SYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZW1wdHlUb2tlbkFkanN0bWVudCkgeworCQl0aGlzLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQsIGVtcHR5VG9rZW5BZGpzdG1lbnQpOworCQl0aGlzLnNldFRva2VuUmFuZ2Uoc3RhcnQsIGVuZCwgZW1wdHlUb2tlbkFkanN0bWVudCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNvdXJjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgeworCQl0aGlzLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQsIHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZW1wdHlUb2tlbkFkanN0bWVudCkgeworCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBzdGFydDsKKwkJaWYoZW1wdHlUb2tlbkFkanN0bWVudCkgeworCQkJaW50IGVuZE9mRW1wdHlUb2tlbiA9ICgoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5wYXJzZXIuc2Nhbm5lcikuZW5kT2ZFbXB0eVRva2VuOworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IGVuZE9mRW1wdHlUb2tlbiA+IGVuZCA/IGVuZE9mRW1wdHlUb2tlbiArIDEgOiBlbmQgKyAxOworCQl9IGVsc2UgeworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IGVuZCArIDE7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VG9rZW5SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJdGhpcy5zZXRUb2tlblJhbmdlKHN0YXJ0LCBlbmQsIHRydWUpOworCX0KKwlwcml2YXRlIHZvaWQgc2V0VG9rZW5SYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZW1wdHlUb2tlbkFkanN0bWVudCkgeworCQl0aGlzLnRva2VuU3RhcnQgPSBzdGFydDsKKwkJaWYoZW1wdHlUb2tlbkFkanN0bWVudCkgeworCQkJaW50IGVuZE9mRW1wdHlUb2tlbiA9ICgoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5wYXJzZXIuc2Nhbm5lcikuZW5kT2ZFbXB0eVRva2VuOworCQkJdGhpcy50b2tlbkVuZCA9IGVuZE9mRW1wdHlUb2tlbiA+IGVuZCA/IGVuZE9mRW1wdHlUb2tlbiArIDEgOiBlbmQgKyAxOworCQl9IGVsc2UgeworCQkJdGhpcy50b2tlbkVuZCA9IGVuZCArIDE7CisJCX0KKwl9CisKIAlwcml2YXRlIGNoYXJbXSBzdWJzdGl0dXRlTWV0aG9kVHlwZVBhcmFtZXRlck5hbWUoY2hhciBmaXJzdE5hbWUsIGNoYXIgc3RhcnRDaGFyLCBjaGFyIGVuZENoYXIsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMsIGNoYXJbXVtdIG90aGVyUGFyYW1ldGVyTmFtZXMpIHsKIAkJY2hhciBuYW1lID0gZmlyc3ROYW1lOwogCQluZXh0IDogd2hpbGUgKHRydWUpIHsKQEAgLTg4NjYsNyArMTI3MzAsNyBAQAogCQkJCQljb250aW51ZSBuZXh0OwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyUGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHsKIAkJCQlpZihvdGhlclBhcmFtZXRlck5hbWVzW2ldLmxlbmd0aCA9PSAxICYmIFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2Uob3RoZXJQYXJhbWV0ZXJOYW1lc1tpXVswXSkgPT0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShuYW1lKSkgewogCQkJCQluYW1lKys7CkBAIC04ODgxLDcgKzEyNzQ1LDcgQEAKIAkJfQogCQlyZXR1cm4gbmV3IGNoYXJbXXtuYW1lfTsKIAl9Ci0JCisKIAlwcml2YXRlIGNoYXJbXSBzdWJzdGl0dXRlTWV0aG9kVHlwZVBhcmFtZXRlck5hbWUoY2hhcltdIGZpcnN0TmFtZSwgY2hhcltdW10gZXhjbHVkZWROYW1lcywgY2hhcltdW10gb3RoZXJQYXJhbWV0ZXJOYW1lcykgewogCQljaGFyW10gbmFtZSA9IGZpcnN0TmFtZTsKIAkJaW50IGNvdW50ID0gMjsKQEAgLTg5MDIsNCArMTI3NjYsNDIgQEAKIAkJfQogCQlyZXR1cm4gbmFtZTsKIAl9CisKKwlwcml2YXRlIGNoYXJbXVtdIHN1YnN0aXR1dGVNZXRob2RUeXBlUGFyYW1ldGVyTmFtZXMoVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpIHsKKwkJY2hhcltdW10gc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbdHlwZVZhcmlhYmxlcy5sZW5ndGhdW107CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCXN1YnN0aXR1ZWRQYXJhbWV0ZXJOYW1lc1tpXSA9IHR5cGVWYXJpYWJsZXNbaV0uc291cmNlTmFtZTsKKwkJfQorCisJCWJvb2xlYW4gZm91bmRDb25mbGljdHMgPSBmYWxzZTsKKworCQluZXh0VHlwZVBhcmFtZXRlciA6IGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykgeworCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGVCaW5kaW5nID0gdHlwZVZhcmlhYmxlc1tpXTsKKwkJCWNoYXJbXSBtZXRob2RQYXJhbWV0ZXJOYW1lID0gdHlwZVZhcmlhYmxlQmluZGluZy5zb3VyY2VOYW1lOworCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoOyBqKyspIHsKKwkJCQljaGFyW10gdHlwZVBhcmFtZXRlck5hbWUgPSBleGNsdWRlZE5hbWVzW2pdOworCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVQYXJhbWV0ZXJOYW1lLCBtZXRob2RQYXJhbWV0ZXJOYW1lLCBmYWxzZSkpIHsKKwkJCQkJY2hhcltdIHN1YnN0aXR1dGlvbjsKKwkJCQkJaWYobWV0aG9kUGFyYW1ldGVyTmFtZS5sZW5ndGggPT0gMSkgeworCQkJCQkJaWYoU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShtZXRob2RQYXJhbWV0ZXJOYW1lWzBdKSkgeworCQkJCQkJCXN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGVNZXRob2RUeXBlUGFyYW1ldGVyTmFtZShtZXRob2RQYXJhbWV0ZXJOYW1lWzBdLCAnQScsICdaJywgZXhjbHVkZWROYW1lcywgc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lKG1ldGhvZFBhcmFtZXRlck5hbWVbMF0sICdhJywgJ3onLCBleGNsdWRlZE5hbWVzLCBzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXMpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0ZU1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lKG1ldGhvZFBhcmFtZXRlck5hbWUsIGV4Y2x1ZGVkTmFtZXMsIHN1YnN0aXR1ZWRQYXJhbWV0ZXJOYW1lcyk7CisJCQkJCX0KKwkJCQkJc3Vic3RpdHVlZFBhcmFtZXRlck5hbWVzW2ldID0gc3Vic3RpdHV0aW9uOworCisJCQkJCWZvdW5kQ29uZmxpY3RzID0gdHJ1ZTsKKwkJCQkJY29udGludWUgbmV4dFR5cGVQYXJhbWV0ZXI7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoZm91bmRDb25mbGljdHMpIHJldHVybiBzdWJzdGl0dWVkUGFyYW1ldGVyTmFtZXM7CisJCXJldHVybiBudWxsOworCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0NvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyLmphdmEKaW5kZXggOWMxN2M5MC4uNjJhZjRhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwyNjIgKzI0LDI2MyBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIgZXh0ZW5kcyBDb21wbGV0aW9uUmVxdWVzdG9yIHsKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQ09ERV9TSUdOQVRVUkUgPSBmYWxzZTsKLQkKKwogCXByaXZhdGUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yOwogCXB1YmxpYyBDb21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHsKIAkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CiAJfQotCQorCiAJcHVibGljIHZvaWQgYWNjZXB0KENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQlzd2l0Y2gocHJvcG9zYWwuZ2V0S2luZCgpKSB7CisJCUludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsID0gKEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKSBwcm9wb3NhbDsKKwkJc3dpdGNoKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEtpbmQoKSkgewogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRDoKIAkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRLZXl3b3JkKAotCQkJCQkJcHJvcG9zYWwuZ2V0TmFtZSgpLAotCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKSk7CisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXROYW1lKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLlBBQ0tBR0VfUkVGOgogCQkJCWlmKERFQ09ERV9TSUdOQVRVUkUpIHsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKLQkJCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOworCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZWxldmFuY2UoKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKLQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOworCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZWxldmFuY2UoKSk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUY6Ci0JCQkJaWYoKHByb3Bvc2FsLmdldEZsYWdzKCkgJiBGbGFncy5BY2NFbnVtKSAhPSAwKSB7CisJCQkJaWYoKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCkgJiBGbGFncy5BY2NFbnVtKSAhPSAwKSB7CiAJCQkJCS8vIGRvZXMgbm90IGV4aXN0IGZvciBvbGQgcmVxdWVzdG9yCi0JCQkJfSBlbHNlIGlmKChwcm9wb3NhbC5nZXRGbGFncygpICYgRmxhZ3MuQWNjSW50ZXJmYWNlKSAhPSAwKSB7CisJCQkJfSBlbHNlIGlmKChpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRGbGFncygpICYgRmxhZ3MuQWNjSW50ZXJmYWNlKSAhPSAwKSB7CiAJCQkJCWlmKERFQ09ERV9TSUdOQVRVUkUpIHsKIAkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSwKLQkJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCkgJiB+RmxhZ3MuQWNjSW50ZXJmYWNlLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKSk7CisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCksCisJCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRGbGFncygpICYgfkZsYWdzLkFjY0ludGVyZmFjZSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAotCQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRUeXBlTmFtZSgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCkgJiB+RmxhZ3MuQWNjSW50ZXJmYWNlLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKSk7CisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFR5cGVOYW1lKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RmxhZ3MoKSAmIH5GbGFncy5BY2NJbnRlcmZhY2UsCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCWlmKERFQ09ERV9TSUdOQVRVUkUpIHsKIAkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENsYXNzKAotCQkJCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpLAotCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCi0JCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOworCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpLAorCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RmxhZ3MoKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCi0JCQkJCQkJCXByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IHByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldFR5cGVOYW1lKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkpOworCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRUeXBlTmFtZSgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpKTsKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX1JFRjoKIAkJCQlpZihERUNPREVfU0lHTkFUVVJFKSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEZpZWxkKAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0TmFtZSgpLAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwgCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXROYW1lKCksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUoaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRGbGFncygpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZWxldmFuY2UoKQogCQkJCQkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEZpZWxkKAotCQkJCQkJCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldE5hbWUoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFR5cGVOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IHByb3Bvc2FsLmdldFR5cGVOYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblR5cGVOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0TmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhY2thZ2VOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0VHlwZU5hbWUoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0VHlwZU5hbWUoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RmxhZ3MoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKIAkJCQkJKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGOgogCQkJCWlmKERFQ09ERV9TSUdOQVRVUkUpIHsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0TmFtZSgpLAotCQkJCQkJCWdldFBhcmFtZXRlclBhY2thZ2VzKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKLQkJCQkJCQlnZXRQYXJhbWV0ZXJUeXBlcyhwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKLQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSksCi0JCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUoU2lnbmF0dXJlLmdldFJldHVyblR5cGUocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAorCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldE5hbWUoKSwKKwkJCQkJCQlnZXRQYXJhbWV0ZXJQYWNrYWdlcyhpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJZ2V0UGFyYW1ldGVyVHlwZXMoaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSkpLAorCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCQkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdE1ldGhvZCgKLQkJCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IHByb3Bvc2FsLmdldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblR5cGVOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IHByb3Bvc2FsLmdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXROYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogcHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogcHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCksCi0JCQkJCQkJcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFR5cGVOYW1lKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IHByb3Bvc2FsLmdldFR5cGVOYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblR5cGVOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0TmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclBhY2thZ2VOYW1lcygpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclBhY2thZ2VOYW1lcygpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFja2FnZU5hbWUoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFja2FnZU5hbWUoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRUeXBlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRUeXBlTmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRGbGFncygpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZWxldmFuY2UoKQogCQkJCQkpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9ERUNMQVJBVElPTjoKIAkJCQlpZihERUNPREVfU0lHTkFUVVJFKSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0TmFtZSgpLAotCQkJCQkJCWdldFBhcmFtZXRlclBhY2thZ2VzKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKLQkJCQkJCQlnZXRQYXJhbWV0ZXJUeXBlcyhwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKLQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSksCi0JCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUoU2lnbmF0dXJlLmdldFJldHVyblR5cGUocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAorCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldE5hbWUoKSwKKwkJCQkJCQlnZXRQYXJhbWV0ZXJQYWNrYWdlcyhpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJZ2V0UGFyYW1ldGVyVHlwZXMoaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSkpLAorCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCi0JCQkJCQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXROYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogcHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogcHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCksCi0JCQkJCQkJcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFR5cGVOYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25QYWNrYWdlTmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXROYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFR5cGVOYW1lKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCSk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OOgogCQkJCWlmKERFQ09ERV9TSUdOQVRVUkUpIHsKIAkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0QW5vbnltb3VzVHlwZSgKLQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLCAKLQkJCQkJCQlnZXRQYXJhbWV0ZXJQYWNrYWdlcyhwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCi0JCQkJCQkJZ2V0UGFyYW1ldGVyVHlwZXMocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAotCQkJCQkJCXByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBwcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKKwkJCQkJCQlnZXRQYXJhbWV0ZXJQYWNrYWdlcyhpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJZ2V0UGFyYW1ldGVyVHlwZXMoaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCQkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEFub255bW91c1R5cGUoCi0JCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCksCi0JCQkJCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblR5cGVOYW1lKCksCi0JCQkJCQlwcm9wb3NhbC5nZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBwcm9wb3NhbC5nZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMoKSwKLQkJCQkJCXByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpLAotCQkJCQkJcHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKLQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKLQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblR5cGVOYW1lKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYXJhbWV0ZXJQYWNrYWdlTmFtZXMoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFBhcmFtZXRlclR5cGVOYW1lcygpLAorCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiA6IGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCSk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuTEFCRUxfUkVGIDoKIAkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRMYWJlbCgKLQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKQorCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLkxPQ0FMX1ZBUklBQkxFX1JFRjoKIAkJCQlpZihERUNPREVfU0lHTkFUVVJFKSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdExvY2FsVmFyaWFibGUoCi0JCQkJCQkJcHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpLAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAotCQkJCQkJCVNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRGbGFncygpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKQorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKKwkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RmxhZ3MoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKIAkJCQkJKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKAotCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCXByb3Bvc2FsLmdldFR5cGVOYW1lKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFja2FnZU5hbWUoKSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UGFja2FnZU5hbWUoKSwKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRUeXBlTmFtZSgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCSk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVkFSSUFCTEVfREVDTEFSQVRJT046CiAJCQkJaWYoREVDT0RFX1NJR05BVFVSRSkgewogCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKAotCQkJCQkJCXByb3Bvc2FsLmdldENvbXBsZXRpb24oKSwKLQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSwKLQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0RmxhZ3MoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJcHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCkKKwkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVF1YWxpZmllcihpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRTaWduYXR1cmUoKSksCisJCQkJCQkJU2lnbmF0dXJlLmdldFNpZ25hdHVyZVNpbXBsZU5hbWUoaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCksCisJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCQkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdExvY2FsVmFyaWFibGUoCi0JCQkJCQlwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCi0JCQkJCQlwcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAotCQkJCQkJcHJvcG9zYWwuZ2V0VHlwZU5hbWUoKSwKLQkJCQkJCXByb3Bvc2FsLmdldEZsYWdzKCksCi0JCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKLQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRDb21wbGV0aW9uKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRQYWNrYWdlTmFtZSgpLAorCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0VHlwZU5hbWUoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldEZsYWdzKCksCisJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSwKKwkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCSk7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjg4LDMzICsyODksMzMgQEAKIAkJCQkJSUV4dGVuZGVkQ29tcGxldGlvblJlcXVlc3RvciByID0gKElFeHRlbmRlZENvbXBsZXRpb25SZXF1ZXN0b3IpIHRoaXMucmVxdWVzdG9yOwogCQkJCQlpZihERUNPREVfU0lHTkFUVVJFKSB7CiAJCQkJCQlyLmFjY2VwdFBvdGVudGlhbE1ldGhvZERlY2xhcmF0aW9uKAotCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAotCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0TmFtZSgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZWxldmFuY2UoKQorCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpLAorCQkJCQkJCQlTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0TmFtZSgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZWxldmFuY2UoKQogCQkJCQkJKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXIuYWNjZXB0UG90ZW50aWFsTWV0aG9kRGVjbGFyYXRpb24oCi0JCQkJCQkJCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoKSwKLQkJCQkJCQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXROYW1lKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAotCQkJCQkJCQlwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCi0JCQkJCQkJCXByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoKSwKKwkJCQkJCQkJaW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXROYW1lKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpLAorCQkJCQkJCQlpbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCksCisJCQkJCQkJCWludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmdldFJlbGV2YW5jZSgpCiAJCQkJCQkpOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCQorCiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb21wbGV0aW9uRmFpbHVyZShJUHJvYmxlbSBwcm9ibGVtKSB7CiAJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEVycm9yKHByb2JsZW0pOwogCX0KLQkKKwogCXByaXZhdGUgY2hhcltdW10gZ2V0UGFyYW1ldGVyUGFja2FnZXMoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgewogCQljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpZWRUeXBlcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhtZXRob2RTaWduYXR1cmUpOwogCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyUXVhbGlmaWVkVHlwZXMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJRdWFsaWZpZWRUeXBlcy5sZW5ndGg7CkBAIC0zMjUsNyArMzI2LDcgQEAKIAogCQlyZXR1cm4gcGFyYW1ldGVyUGFja2FnZXM7CiAJfQotCQorCiAJcHJpdmF0ZSBjaGFyW11bXSBnZXRQYXJhbWV0ZXJUeXBlcyhjaGFyW10gbWV0aG9kU2lnbmF0dXJlKSB7CiAJCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmllZFR5cGVzID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG1ldGhvZFNpZ25hdHVyZSk7CiAJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJRdWFsaWZpZWRUeXBlcyA9PSBudWxsID8gMCA6IHBhcmFtZXRlclF1YWxpZmllZFR5cGVzLmxlbmd0aDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc3NTVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuQXNzaXN0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdEltcG9ydENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdEltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuQXNzaXN0SW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5Bc3Npc3RQYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5Bc3Npc3RTb3VyY2VGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdFNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdFNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5Bc3Npc3RUeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZW1iZXJWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Bbm5vdGF0YWJsZUluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkltcG9ydENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5UeXBlUGFyYW1ldGVyOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IgZXh0ZW5kcyBDb21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IgeworCXByaXZhdGUgQVNUTm9kZSBhc3Npc3ROb2RlOworCisJcHJpdmF0ZSBNYXAgYmluZGluZ0NhY2hlOworCXByaXZhdGUgTWFwIGVsZW1lbnRDYWNoZTsKKwlwcml2YXRlIE1hcCBlbGVtZW50V2l0aFByb2JsZW1DYWNoZTsKKworCXB1YmxpYyBDb21wbGV0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3RvcigKKwkJCUlDb21waWxhdGlvblVuaXQgdW5pdCwKKwkJCUNvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvIHVuaXRJbmZvLAorCQkJUGFyc2VyIHBhcnNlciwKKwkJCUFTVE5vZGUgYXNzaXN0Tm9kZSwKKwkJCU1hcCBiaW5kaW5nQ2FjaGUsCisJCQlNYXAgZWxlbWVudENhY2hlLAorCQkJTWFwIGVsZW1lbnRXaXRoUHJvYmxlbUNhY2hlLAorCQkJTWFwIG5ld0VsZW1lbnRzKSB7CisJCXN1cGVyKHVuaXQsIHVuaXRJbmZvLCBuZXdFbGVtZW50cyk7CisJCXRoaXMucGFyc2VyID0gcGFyc2VyOworCQl0aGlzLmFzc2lzdE5vZGUgPSBhc3Npc3ROb2RlOworCQl0aGlzLmJpbmRpbmdDYWNoZSA9IGJpbmRpbmdDYWNoZTsKKwkJdGhpcy5lbGVtZW50Q2FjaGUgPSBlbGVtZW50Q2FjaGU7CisJCXRoaXMuZWxlbWVudFdpdGhQcm9ibGVtQ2FjaGUgPSBlbGVtZW50V2l0aFByb2JsZW1DYWNoZTsKKwl9CisKKwlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBjcmVhdGVBbm5vdGF0aW9uKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RBbm5vdGF0aW9uKHBhcmVudCwgbmFtZSwgdGhpcy5uZXdFbGVtZW50cyk7CisJfQorCisJcHJvdGVjdGVkIFNvdXJjZUZpZWxkIGNyZWF0ZUZpZWxkKEphdmFFbGVtZW50IHBhcmVudCwgRmllbGRJbmZvIGZpZWxkSW5mbykgeworCQlTdHJpbmcgZmllbGROYW1lID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuaW50ZXJuKG5ldyBTdHJpbmcoZmllbGRJbmZvLm5hbWUpKTsKKwkJQXNzaXN0U291cmNlRmllbGQgZmllbGQgPSBuZXcgQXNzaXN0U291cmNlRmllbGQocGFyZW50LCBmaWVsZE5hbWUsIHRoaXMuYmluZGluZ0NhY2hlLCB0aGlzLm5ld0VsZW1lbnRzKTsKKwkJaWYgKGZpZWxkSW5mby5ub2RlLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJdGhpcy5iaW5kaW5nQ2FjaGUucHV0KGZpZWxkLCBmaWVsZEluZm8ubm9kZS5iaW5kaW5nKTsKKwkJCXRoaXMuZWxlbWVudENhY2hlLnB1dChmaWVsZEluZm8ubm9kZS5iaW5kaW5nLCBmaWVsZCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmVsZW1lbnRXaXRoUHJvYmxlbUNhY2hlLnB1dChmaWVsZEluZm8ubm9kZSwgZmllbGQpOworCQl9CisJCXJldHVybiBmaWVsZDsKKwl9CisKKwlwcm90ZWN0ZWQgSW1wb3J0Q29udGFpbmVyIGNyZWF0ZUltcG9ydENvbnRhaW5lcihJQ29tcGlsYXRpb25Vbml0IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEFzc2lzdEltcG9ydENvbnRhaW5lcigoQ29tcGlsYXRpb25Vbml0KXBhcmVudCwgdGhpcy5uZXdFbGVtZW50cyk7CisJfQorCisJcHJvdGVjdGVkIEltcG9ydERlY2xhcmF0aW9uIGNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKEltcG9ydENvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBuYW1lLCBib29sZWFuIG9uRGVtYW5kKSB7CisJCXJldHVybiBuZXcgQXNzaXN0SW1wb3J0RGVjbGFyYXRpb24ocGFyZW50LCBuYW1lLCBvbkRlbWFuZCwgdGhpcy5uZXdFbGVtZW50cyk7CisJfQorCisJcHJvdGVjdGVkIEluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKEphdmFFbGVtZW50IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEFzc2lzdEluaXRpYWxpemVyKHBhcmVudCwgMSwgdGhpcy5iaW5kaW5nQ2FjaGUsIHRoaXMubmV3RWxlbWVudHMpOworCX0KKworCXByb3RlY3RlZCBTb3VyY2VNZXRob2QgY3JlYXRlTWV0aG9kSGFuZGxlKEphdmFFbGVtZW50IHBhcmVudCwgTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7CisJCVN0cmluZyBzZWxlY3RvciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmludGVybihuZXcgU3RyaW5nKG1ldGhvZEluZm8ubmFtZSkpOworCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlU2lncyA9IGNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MobWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyk7CisJCUFzc2lzdFNvdXJjZU1ldGhvZCBtZXRob2QgPSBuZXcgQXNzaXN0U291cmNlTWV0aG9kKHBhcmVudCwgc2VsZWN0b3IsIHBhcmFtZXRlclR5cGVTaWdzLCB0aGlzLmJpbmRpbmdDYWNoZSwgdGhpcy5uZXdFbGVtZW50cyk7CisJCWlmIChtZXRob2RJbmZvLm5vZGUuYmluZGluZyAhPSBudWxsKSB7CisJCQl0aGlzLmJpbmRpbmdDYWNoZS5wdXQobWV0aG9kLCBtZXRob2RJbmZvLm5vZGUuYmluZGluZyk7CisJCQl0aGlzLmVsZW1lbnRDYWNoZS5wdXQobWV0aG9kSW5mby5ub2RlLmJpbmRpbmcsIG1ldGhvZCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmVsZW1lbnRXaXRoUHJvYmxlbUNhY2hlLnB1dChtZXRob2RJbmZvLm5vZGUsIG1ldGhvZCk7CisJCX0KKwkJcmV0dXJuIG1ldGhvZDsKKwl9CisKKwlwcm90ZWN0ZWQgUGFja2FnZURlY2xhcmF0aW9uIGNyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbihKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuZXcgQXNzaXN0UGFja2FnZURlY2xhcmF0aW9uKChDb21waWxhdGlvblVuaXQpIHBhcmVudCwgbmFtZSwgdGhpcy5uZXdFbGVtZW50cyk7CisJfQorCisJcHJvdGVjdGVkIFNvdXJjZVR5cGUgY3JlYXRlVHlwZUhhbmRsZShKYXZhRWxlbWVudCBwYXJlbnQsIFR5cGVJbmZvIHR5cGVJbmZvKSB7CisJCVN0cmluZyBuYW1lU3RyaW5nPSBuZXcgU3RyaW5nKHR5cGVJbmZvLm5hbWUpOworCQlBc3Npc3RTb3VyY2VUeXBlIHR5cGUgPSBuZXcgQXNzaXN0U291cmNlVHlwZShwYXJlbnQsIG5hbWVTdHJpbmcsIHRoaXMuYmluZGluZ0NhY2hlLCB0aGlzLm5ld0VsZW1lbnRzKTsKKwkJaWYgKHR5cGVJbmZvLm5vZGUuYmluZGluZyAhPSBudWxsKSB7CisJCQl0aGlzLmJpbmRpbmdDYWNoZS5wdXQodHlwZSwgdHlwZUluZm8ubm9kZS5iaW5kaW5nKTsKKwkJCXRoaXMuZWxlbWVudENhY2hlLnB1dCh0eXBlSW5mby5ub2RlLmJpbmRpbmcsIHR5cGUpOworCQl9IGVsc2UgeworCQkJdGhpcy5lbGVtZW50V2l0aFByb2JsZW1DYWNoZS5wdXQodHlwZUluZm8ubm9kZSwgdHlwZSk7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHJvdGVjdGVkIFR5cGVQYXJhbWV0ZXIgY3JlYXRlVHlwZVBhcmFtZXRlcihKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuZXcgQXNzaXN0VHlwZVBhcmFtZXRlcihwYXJlbnQsIG5hbWUsIHRoaXMubmV3RWxlbWVudHMpOworCX0KKworCXByb3RlY3RlZCBJQW5ub3RhdGlvbiBhY2NlcHRBbm5vdGF0aW9uKAorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24sCisJCQlBbm5vdGF0YWJsZUluZm8gcGFyZW50SW5mbywKKwkJCUphdmFFbGVtZW50IHBhcmVudEhhbmRsZSkgeworCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lKSB7CisJCQlpZiAoaGFzRW1wdHlOYW1lKGFubm90YXRpb24udHlwZSwgdGhpcy5hc3Npc3ROb2RlKSkgeworCQkJCXN1cGVyLmFjY2VwdEFubm90YXRpb24oYW5ub3RhdGlvbiwgbnVsbCwgcGFyZW50SGFuZGxlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuYWNjZXB0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBwYXJlbnRJbmZvLCBwYXJlbnRIYW5kbGUpOworCX0KKworCXByb3RlY3RlZCBPYmplY3QgZ2V0TWVtYmVyVmFsdWUoCisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5NZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLAorCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgZXhwcmVzc2lvbjsKKwkJCWlmIChyZWZlcmVuY2UudG9rZW4ubGVuZ3RoID09IDApIHJldHVybiBudWxsOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQlDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBleHByZXNzaW9uOworCQkJaWYgKHJlZmVyZW5jZS50b2tlbnNbcmVmZXJlbmNlLnRva2Vucy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldE1lbWJlclZhbHVlKG1lbWJlclZhbHVlUGFpciwgZXhwcmVzc2lvbik7CisJfQorCXByb3RlY3RlZCBJTWVtYmVyVmFsdWVQYWlyW10gZ2V0TWVtYmVyVmFsdWVQYWlycyhNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzKSB7CisJCWludCBtZW1iZXJzTGVuZ3RoID0gbWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7CisJCWludCBtZW1iZXJzQ291bnQgPSAwOworCQlJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVycyA9IG5ldyBJTWVtYmVyVmFsdWVQYWlyW21lbWJlcnNMZW5ndGhdOworCQluZXh0IDogZm9yIChpbnQgaiA9IDA7IGogPCBtZW1iZXJzTGVuZ3RoOyBqKyspIHsKKwkJCWlmIChtZW1iZXJWYWx1ZVBhaXJzW2pdIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lKSBjb250aW51ZSBuZXh0OworCisJCQltZW1iZXJzW21lbWJlcnNDb3VudCsrXSA9IGdldE1lbWJlclZhbHVlUGFpcihtZW1iZXJWYWx1ZVBhaXJzW2pdKTsKKwkJfQorCisJCWlmIChtZW1iZXJzQ291bnQgPiBtZW1iZXJzTGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG1lbWJlcnMsIDAsIG1lbWJlcnMsIDAsIG1lbWJlcnNDb3VudCk7CisJCX0KKwkJcmV0dXJuIG1lbWJlcnM7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0VtcHR5TmFtZShUeXBlUmVmZXJlbmNlIHJlZmVyZW5jZSwgQVNUTm9kZSBhc3Npc3ROb2RlKSB7CisJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisJCWlmIChyZWZlcmVuY2Uuc291cmNlU3RhcnQgPD0gYXNzaXN0Tm9kZS5zb3VyY2VTdGFydCAmJiBhc3Npc3ROb2RlLnNvdXJjZUVuZCA8PSByZWZlcmVuY2Uuc291cmNlRW5kKSByZXR1cm4gZmFsc2U7CisKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgfHwKKwkJCQlyZWZlcmVuY2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHx8CisJCQkJcmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCWNoYXJbXVtdIHR5cGVOYW1lID0gcmVmZXJlbmNlLmdldFR5cGVOYW1lKCk7CisJCQlpZiAodHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoIC0gMV0ubGVuZ3RoID09IDApIHJldHVybiB0cnVlOworCQl9CisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyaXplZFJlZmVyZW5jZSA9IChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgcmVmZXJlbmNlOworCQkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudHMgPSBwYXJhbWV0ZXJpemVkUmVmZXJlbmNlLnR5cGVBcmd1bWVudHM7CisJCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChoYXNFbXB0eU5hbWUodHlwZUFyZ3VtZW50c1tpXSwgYXNzaXN0Tm9kZSkpIHJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQkJUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyaXplZFJlZmVyZW5jZSA9IChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgcmVmZXJlbmNlOworCQkJVHlwZVJlZmVyZW5jZVtdW10gdHlwZUFyZ3VtZW50cyA9IHBhcmFtZXRlcml6ZWRSZWZlcmVuY2UudHlwZUFyZ3VtZW50czsKKwkJCWlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHR5cGVBcmd1bWVudHNbaV0gIT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlQXJndW1lbnRzW2ldLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJaWYgKGhhc0VtcHR5TmFtZSh0eXBlQXJndW1lbnRzW2ldW2pdLCBhc3Npc3ROb2RlKSkgcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKaW5kZXggMTRkNjRlNC4uMjNiZWNjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsNiArMjAsMTggQEAKICAqIHRvIHRoZSByYXcgbmFtZSBlbnZpcm9ubWVudCByZXN1bHRzIGJlZm9yZSBhbnN3ZXJpbmcgdGhlbSB0byB0aGUgVUkuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFJlcXVlc3RvciB7CisJcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3IoCisJCQkJCQlpbnQgbW9kaWZpZXJzLAorCQkJCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAorCQkJCQkJaW50IHBhcmFtZXRlckNvdW50LAorCQkJCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCQkJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJCQkJCWludCBleHRyYUZsYWdzLAorCQkJCQkJU3RyaW5nIHBhdGgsCisJCQkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3MpOwogCS8qKgogCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyB0eXBlLgogCSAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWxlY3Rpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IDNhMjEyMmYuLmNkMGI0YmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDIwICsyMCwyMCBAQAogCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGVudW0gc2VsZWN0aW9uLgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBjaGFyW10KIAkgKiAJCURlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIHR5cGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGlzRGVjbGFyYXRpb24gYm9vbGVhbgogCSAqICAJQW5zd2VyIGlmIHRoZSBzZWxlY3RlZCB0eXBlIGlzIGEgZGVjbGFyYXRpb24KLQkgKiAgCisJICoKIAkgKiBAcGFyYW0gZ2VuZXJpY1R5cGVTaWduYXR1cmUKIAkgKiAgCWdlbnJpYyB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgc2VsZWN0ZWQgdHlwZSBpZiBpdCBpcyBhCiAJICogIAlwYXJhbWV0ZXJpemVkIHR5cGUKLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGFydAogCSAqICAJU3RhcnQgb2YgdGhlIHNlbGVjdGlvbgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVuZAogCSAqICAJRW5kIG9mIHRoZSBzZWxlY3Rpb24KIAkgKgpAQCAtNjksMjIgKzY5LDIyIEBACiAJICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgZmllbGQgc2VsZWN0aW9uLgogCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZCBpcyBkZWNsYXJlZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlTmFtZSBjaGFyW10KIAkgKiAJCU5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbmV3IGZpZWxkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSBmaWVsZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBpc0RlY2xhcmF0aW9uIGJvb2xlYW4KIAkgKiAgCUFuc3dlciBpZiB0aGUgc2VsZWN0ZWQgZmllbGQgaXMgYSBkZWNsYXJhdGlvbgotCSAqIAorCSAqCiAJICogQHBhcmFtIHVuaXF1ZUtleQogCSAqICAJdW5pcXVlIGtleSBvZiB0aGlzIGZpZWxkCi0JICogIAorCSAqCiAJICogQHBhcmFtIHN0YXJ0CiAJICogIAlTdGFydCBvZiB0aGUgc2VsZWN0aW9uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZW5kCiAJICogIAlFbmQgb2YgdGhlIHNlbGVjdGlvbgogCSAqCkBAIC0xMDYsNDEgKzEwNiw0MSBAQAogCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBzZWxlY3Rpb24uCiAJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBjaGFyW10KIAkgKiAJCU5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmluZyB0aGlzIG5ldyBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZW5jbG9zaW5nRGVjbGFyaW5nVHlwZVNpZ25hdHVyZSBTdHJpbmcKIAkgKiAgCVR5cGUgc2lnbmF0dXJlIG9mIHRoZSBkZWNsYXJpbmcgdHlwZSBvZiB0aGUgZGVjbGFyaW5nIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgCWlmIGRlY2xhcmluZyB0eXBlIGlzIGEgdG9wIGxldmVsIHR5cGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc2VsZWN0b3IgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSBuZXcgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhcmFtZXRlclBhY2thZ2VOYW1lcyBjaGFyW11bXQogCSAqIAkJTmFtZXMgb2YgdGhlIHBhY2thZ2VzIGluIHdoaWNoIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGRlY2xhcmVkLgogCSAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclR5cGVOYW1lcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZXMgY2hhcltdW10KIAkgKiAJCU5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGVzLgogCSAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclBhY2thZ2VOYW1lcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYXJhbWV0ZXJTaWduYXR1cmVzIFN0cmluZ1tdCiAJICogCQlTaWduYXR1cmUgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZXMuCiAJICogICAgCVNob3VsZCBjb250YWluIGFzIG1hbnkgZWxlbWVudHMgYXMgcGFyYW1ldGVyUGFja2FnZU5hbWVzLgotCSAqIAorCSAqCiAJICogIEBwYXJhbSBpc0NvbnN0cnVjdG9yIGJvb2xlYW4KIAkgKiAJCUFuc3dlciBpZiB0aGUgbWV0aG9kIGlzIGEgY29uc3RydWN0b3IuCi0JICogCisJICoKIAkgKiBAcGFyYW0gaXNEZWNsYXJhdGlvbiBib29sZWFuCiAJICogIAlBbnN3ZXIgaWYgdGhlIHNlbGVjdGVkIG1ldGhvZCBpcyBhIGRlY2xhcmF0aW9uCi0JICogCisJICoKIAkgKiBAcGFyYW0gdW5pcXVlS2V5CiAJICogIAl1bmlxdWUga2V5IG9mIHRoZSBtZXRob2QKIAkgKgogCSAqIEBwYXJhbSBzdGFydAogCSAqICAJU3RhcnQgb2YgdGhlIHNlbGVjdGlvbgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVuZAogCSAqICAJRW5kIG9mIHRoZSBzZWxlY3Rpb24KIAkgKgpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCWNoYXJbXSB1bmlxdWVLZXksCiAJCWludCBzdGFydCwKIAkJaW50IGVuZCk7Ci0JCisKIAkvKioKIAkgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBwYWNrYWdlIHNlbGVjdGlvbi4KIAkgKiBAcGFyYW0gcGFja2FnZU5hbWUgY2hhcltdCkBAIC0xODAsMjIgKzE4MCwyMiBAQAogCXZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpOwogCS8qKgogCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIHR5cGUgcGFyYW1ldGVyIHNlbGVjdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBuZXcgbWV0aG9kIGlzIGRlY2xhcmVkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIGNoYXJbXQogCSAqIAkJTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGVQYXJhbWV0ZXJOYW1lIGNoYXJbXQogCSAqIAkJTmFtZSBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0JICogCisJICoKIAkgKiBAcGFyYW0gaXNEZWNsYXJhdGlvbiBib29sZWFuCiAJICogIAlBbnN3ZXIgaWYgdGhlIHNlbGVjdGVkIHR5cGUgcGFyYW1ldGVyIGlzIGEgZGVjbGFyYXRpb24KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGFydAogCSAqICAJU3RhcnQgb2YgdGhlIHNlbGVjdGlvbgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVuZAogCSAqICAJRW5kIG9mIHRoZSBzZWxlY3Rpb24KIAkgKgpAQCAtMjExLDM0ICsyMTEsMzQgQEAKIAkJYm9vbGVhbiBpc0RlY2xhcmF0aW9uLAogCQlpbnQgc3RhcnQsCiAJCWludCBlbmQpOwotCQorCiAJLyoqCiAJICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgdHlwZSBwYXJhbWV0ZXIgc2VsZWN0aW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBjaGFyW10KIAkgKiAJCU5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmluZyB0aGlzIG5ldyBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc2VsZWN0b3IgY2hhcltdCiAJICogCQlOYW1lIG9mIHRoZSBkZWNsYXJpbmcgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHNlbGVjdG9yU3RhcnQgaW50CiAJICogCQlTdGFydCBvZiB0aGUgc2VsZWN0b3IuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc2VsZWN0b3JFbmQgaW50CiAJICogCQlFbmQgb2YgdGhlIHNlbGVjdG9yLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGVQYXJhbWV0ZXJOYW1lIGNoYXJbXQogCSAqIAkJTmFtZSBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0JICogCisJICoKIAkgKiBAcGFyYW0gaXNEZWNsYXJhdGlvbiBib29sZWFuCiAJICogIAlBbnN3ZXIgaWYgdGhlIHNlbGVjdGVkIHR5cGUgcGFyYW1ldGVyIGlzIGEgZGVjbGFyYXRpb24KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGFydAogCSAqICAJU3RhcnQgb2YgdGhlIHNlbGVjdGlvbgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVuZAogCSAqICAJRW5kIG9mIHRoZSBzZWxlY3Rpb24KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JbnRlcm5hbENvbXBsZXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0ludGVybmFsQ29tcGxldGlvbkNvbnRleHQuamF2YQppbmRleCA5NjIwODIzLi5iYTMzZWExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0ludGVybmFsQ29tcGxldGlvbkNvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0ludGVybmFsQ29tcGxldGlvbkNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw0NSArMTAsMTA0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uT25KYXZhZG9jOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25QYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb29rdXBFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworCiAKIC8qKgogICogSW50ZXJuYWwgY29tcGxldGlvbiBjb250ZXh0CiAgKiBAc2luY2UgMy4xCiAgKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IHsKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0IGV4dGVuZHMgQ29tcGxldGlvbkNvbnRleHQgewogCXByb3RlY3RlZCBjaGFyW11bXSBleHBlY3RlZFR5cGVzU2lnbmF0dXJlczsKIAlwcm90ZWN0ZWQgY2hhcltdW10gZXhwZWN0ZWRUeXBlc0tleXM7CiAJcHJvdGVjdGVkIGludCBqYXZhZG9jOwotCQorCiAJcHJvdGVjdGVkIGludCBvZmZzZXQgPSAtMTsKIAlwcm90ZWN0ZWQgaW50IHRva2VuU3RhcnQgPSAtMTsKIAlwcm90ZWN0ZWQgaW50IHRva2VuRW5kID0gLTE7CiAJcHJvdGVjdGVkIGNoYXJbXSB0b2tlbiA9IG51bGw7CiAJcHJvdGVjdGVkIGludCB0b2tlbktpbmQ7Ci0JCisJcHJvdGVjdGVkIGludCB0b2tlbkxvY2F0aW9uOworCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlbmRlZDsKKwlwcm90ZWN0ZWQgSW50ZXJuYWxFeHRlbmRlZENvbXBsZXRpb25Db250ZXh0IGV4dGVuZGVkQ29udGV4dDsKKworCXByb3RlY3RlZCB2b2lkIHNldEV4cGVjdGVkVHlwZXNLZXlzKGNoYXJbXVtdIGV4cGVjdGVkVHlwZXNLZXlzKSB7CisJCXRoaXMuZXhwZWN0ZWRUeXBlc0tleXMgPSBleHBlY3RlZFR5cGVzS2V5czsKKwl9CisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBlY3RlZFR5cGVzU2lnbmF0dXJlcyhjaGFyW11bXSBleHBlY3RlZFR5cGVzU2lnbmF0dXJlcykgewogCQl0aGlzLmV4cGVjdGVkVHlwZXNTaWduYXR1cmVzID0gZXhwZWN0ZWRUeXBlc1NpZ25hdHVyZXM7CiAJfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEV4cGVjdGVkVHlwZXNLZXlzKGNoYXJbXVtdIGV4cGVjdGVkVHlwZXNLZXlzKSB7Ci0JCXRoaXMuZXhwZWN0ZWRUeXBlc0tleXMgPSBleHBlY3RlZFR5cGVzS2V5czsKKworCXByb3RlY3RlZCB2b2lkIHNldEV4dGVuZGVkKCkgeworCQl0aGlzLmlzRXh0ZW5kZWQgPSB0cnVlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEV4dGVuZGVkRGF0YSgKKwkJCUlUeXBlUm9vdCB0eXBlUm9vdCwKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLAorCQkJTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQsCisJCQlTY29wZSBzY29wZSwKKwkJCUFTVE5vZGUgYXN0Tm9kZSwKKwkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCQlDb21wbGV0aW9uUGFyc2VyIHBhcnNlcikgeworCQl0aGlzLmlzRXh0ZW5kZWQgPSB0cnVlOworCQl0aGlzLmV4dGVuZGVkQ29udGV4dCA9CisJCQluZXcgSW50ZXJuYWxFeHRlbmRlZENvbXBsZXRpb25Db250ZXh0KAorCQkJCQl0aGlzLAorCQkJCQl0eXBlUm9vdCwKKwkJCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sCisJCQkJCWxvb2t1cEVudmlyb25tZW50LAorCQkJCQlzY29wZSwKKwkJCQkJYXN0Tm9kZSwKKwkJCQkJb3duZXIsCisJCQkJCXBhcnNlcik7CiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgc2V0SmF2YWRvYyhpbnQgamF2YWRvYykgewogCQl0aGlzLmphdmFkb2MgPSBqYXZhZG9jOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7CiAJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogCX0KLQkKKworCXByb3RlY3RlZCB2b2lkIHNldFRva2VuKGNoYXJbXSB0b2tlbikgeworCQl0aGlzLnRva2VuID0gdG9rZW47CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5LaW5kKGludCB0b2tlbktpbmQpIHsKKwkJdGhpcy50b2tlbktpbmQgPSB0b2tlbktpbmQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5Mb2NhdGlvbihpbnQgdG9rZW5Mb2NhdGlvbikgeworCQl0aGlzLnRva2VuTG9jYXRpb24gPSB0b2tlbkxvY2F0aW9uOworCX0KKwogCXByb3RlY3RlZCB2b2lkIHNldFRva2VuUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCXRoaXMuc2V0VG9rZW5SYW5nZShzdGFydCwgZW5kLCAtMSk7CiAJfQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5SYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGludCBlbmRPZkVtcHR5VG9rZW4pIHsKIAkJdGhpcy50b2tlblN0YXJ0ID0gc3RhcnQ7CiAJCXRoaXMudG9rZW5FbmQgPSBlbmRPZkVtcHR5VG9rZW4gPiBlbmQgPyBlbmRPZkVtcHR5VG9rZW4gOiBlbmQ7Ci0JCQorCiAJCS8vIFdvcmsgYXJvdW5kIGZvciBidWcgMTMyNTU4IChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNTU4KS4KIAkJLy8gY29tcGxldGlvbkxvY2F0aW9uIGNhbiBiZSAtMSBpZiB0aGUgY29tcGxldGlvbiBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlIG9yCiAJCS8vIHRoZSBzdGFydCBvZiBhIGNvZGUgc25pcHBldCBidXQgdGhpcyBBUEkgaXNuJ3QgZGVzaWduIHRvIHN1cHBvcnQgbmVnYXRpdmUgcG9zaXRpb24uCkBAIC01NiwxMiArMTE1LDI1NyBAQAogCQkJdGhpcy50b2tlbkVuZCA9IDA7CiAJCX0KIAl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIEphdmEgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgY29tcGxldGlvbiBsb2NhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgY2Fubm90IGJlIGNvbXB1dGVkLgorCSAqIFRoZSByZXR1cm5lZCBKYXZhIGVsZW1lbnQgYW5kIGFsbCBKYXZhIGVsZW1lbnRzIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgd2hpY2ggY2FuIGJlIG5hdmlnYXRlZCB0byBmcm9tIHRoZSByZXR1cm5lZCBKYXZhIGVsZW1lbnQgYXJlIHNwZWNpYWwgSmF2YSBlbGVtZW50czoKKwkgKiA8dWw+CisJICogPGxpPnRoZXkgYXJlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBidWZmZXIsIHRoZXkgYXJlIG5vdCB0aGUgcmVzdWx0IG9mIGEgcmVjb25jaWxlIG9wZXJhdGlvbjwvbGk+CisJICogPGxpPnRoZXkgYXJlIG5vdCB1cGRhdGVkIGlmIHRoZSBidWZmZXIgY2hhbmdlcy48L2xpPgorCSAqIDxsaT50aGV5IGRvIG5vdCBjb250YWluIGxvY2FsIHR5cGVzIHdoaWNoIGFyZSBub3QgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLjwvbGk+CisJICogPGxpPnRoZXkgZG8gbm90IGdpdmUgaW5mb3JtYXRpb24gYWJvdXQgY2F0ZWdvcmllcy4ge0BsaW5rIElNZW1iZXIjZ2V0Q2F0ZWdvcmllcygpfSB3aWxsIHJldHVybiBhbiBlbXB0eSBhcnJheTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIFJlYXNvbnMgZm9yIHJldHVybmluZyA8Y29kZT5udWxsPC9jb2RlPiBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIGNvbXBpbGF0aW9uIHVuaXQgbm8gbG9uZ2VyIGV4aXN0czwvbGk+CisJICogPGxpPnRoZSBjb21wbGV0aW9uIG9jY3VycmVkIGluIGEgYmluYXJ5IHR5cGUuIEhvd2V2ZXIgdGhpcyByZXN0cmljdGlvbiBtaWdodCBiZSByZWxheGVkIGluIHRoZSBmdXR1cmUuPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBKYXZhIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGNvbXBsZXRpb24gbG9jYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGNhbm5vdCBiZSBjb21wdXRlZC4KKwkgKgorCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIGNvbnRleHQgaXMgbm90IGFuIGV4dGVuZGVkIGNvbnRleHQKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IGdldEVuY2xvc2luZ0VsZW1lbnQoKSB7CisJCWlmICghdGhpcy5pc0V4dGVuZGVkKSB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk9wZXJhdGlvbiBvbmx5IHN1cHBvcnRlZCBpbiBleHRlbmRlZCBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUb2tlbihjaGFyW10gdG9rZW4pIHsKLQkJdGhpcy50b2tlbiA9IHRva2VuOworCQlpZiAodGhpcy5leHRlbmRlZENvbnRleHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCisJCXJldHVybiB0aGlzLmV4dGVuZGVkQ29udGV4dC5nZXRFbmNsb3NpbmdFbGVtZW50KCk7CiAJfQorCisJLyoqCisJICogUmV0dXJuIGtleXMgb2YgZXhwZWN0ZWQgdHlwZXMgb2YgYSBwb3RlbnRpYWwgY29tcGxldGlvbiBwcm9wb3NhbCBhdCB0aGUgY29tcGxldGlvbiBwb3NpdGlvbi4KKwkgKgorCSAqIEl0J3Mgbm90IG1hbmRhdG9yeSB0byBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdG8gcmVzcGVjdCB0aGlzIGV4cGVjdGF0aW9uLgorCSAqCisJICogQHJldHVybiBrZXlzIG9mIGV4cGVjdGVkIHR5cGVzIG9mIGEgcG90ZW50aWFsIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgdGhlIGNvbXBsZXRpb24gcG9zaXRpb24gb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleHBlY3RlZCB0eXBlcy4KKwkgKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBjaGFyW11bXSBnZXRFeHBlY3RlZFR5cGVzS2V5cygpIHsKKwkJcmV0dXJuIHRoaXMuZXhwZWN0ZWRUeXBlc0tleXM7CisJfQorCisJLyoqCisJICogUmV0dXJuIHNpZ25hdHVyZXMgb2YgZXhwZWN0ZWQgdHlwZXMgb2YgYSBwb3RlbnRpYWwgY29tcGxldGlvbiBwcm9wb3NhbCBhdCB0aGUgY29tcGxldGlvbiBwb3NpdGlvbi4KKwkgKgorCSAqIEl0J3Mgbm90IG1hbmRhdG9yeSB0byBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdG8gcmVzcGVjdCB0aGlzIGV4cGVjdGF0aW9uLgorCSAqCisJICogQHJldHVybiBzaWduYXR1cmVzIGV4cGVjdGVkIHR5cGVzIG9mIGEgcG90ZW50aWFsIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgdGhlIGNvbXBsZXRpb24gcG9zaXRpb24gb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleHBlY3RlZCB0eXBlcy4KKwkgKgorCSAqIEBzZWUgU2lnbmF0dXJlCisJICovCisJcHVibGljIGNoYXJbXVtdIGdldEV4cGVjdGVkVHlwZXNTaWduYXR1cmVzKCkgeworCQlyZXR1cm4gdGhpcy5leHBlY3RlZFR5cGVzU2lnbmF0dXJlczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlcgorCSAqIGFmdGVyIHdoaWNoIGNvZGUgYXNzaXN0IGlzIHJlcXVlc3RlZC4KKwkgKgorCSAqIEByZXR1cm4gb2Zmc2V0IHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIKKwkgKiBAc2luY2UgMy4yCisJICovCisJcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisJCXJldHVybiB0aGlzLm9mZnNldDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZWQgdG9rZW4uCisJICogVGhpcyB0b2tlbiBpcyBlaXRoZXIgdGhlIGlkZW50aWZpZXIgb3IgSmF2YSBsYW5ndWFnZSBrZXl3b3JkCisJICogb3IgdGhlIHN0cmluZyBsaXRlcmFsIHVuZGVyLCBpbW1lZGlhdGVseSBwcmVjZWRpbmcsCisJICogdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0LiBJZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQKKwkgKiBpcyBub3Qgd2l0aGluIG9yIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGlkZW50aWZpZXIgb3Iga2V5d29yZCBvcgorCSAqIGEgc3RyaW5nIGxpdGVyYWwgdGhlbiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIGNvbXBsZXRlZCB0b2tlbiBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBzaW5jZSAzLjIKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldFRva2VuKCkgeworCQlyZXR1cm4gdGhpcy50b2tlbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGVuZCAoZXhjbHVzaXZlKSBvZiB0aGUgc3VicmFuZ2UKKwkgKiBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisJICogcmVsZXZhbnQgdG9rZW4uIFdoZW4gdGhlcmUgaXMgbm8gcmVsZXZhbnQgdG9rZW4sIHRoZQorCSAqIHJhbmdlIGlzIGVtcHR5CisJICogKDxjb2RlPmdldFRva2VuRW5kKCkgPT0gZ2V0VG9rZW5TdGFydCgpIC0gMTwvY29kZT4pLgorCSAqCisJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCisJICogQHNpbmNlIDMuMgorCSAqLworCS8vIFRPRE8gKGRhdmlkKSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNTU4CisJcHVibGljIGludCBnZXRUb2tlbkVuZCgpIHsKKwkJcmV0dXJuIHRoaXMudG9rZW5FbmQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUga2luZCBvZiBjb21wbGV0aW9uIHRva2VuIGJlaW5nIHByb3Bvc2VkLgorCSAqIDxwPgorCSAqIFRoZSBzZXQgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGNvbXBsZXRpb24gdG9rZW4gaXMKKwkgKiBleHBlY3RlZCB0byBjaGFuZ2Ugb3ZlciB0aW1lLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorCSAqIHRoYXQgY2xpZW50cyBkbyA8Yj5ub3Q8L2I+IGFzc3VtZSB0aGF0IHRoZSBraW5kIGlzIG9uZSBvZiB0aGUKKwkgKiBvbmVzIHRoZXkga25vdyBhYm91dCwgYW5kIGNvZGUgZGVmZW5zaXZlbHkgZm9yIHRoZQorCSAqIHBvc3NpYmlsaXR5IG9mIHVuZXhwZWN0ZWQgZnV0dXJlIGdyb3d0aC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBraW5kOyBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkIG9uCisJICogdGhpcyBjbGFzcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIDxjb2RlPlRPS0VOX0tJTkQ8L2NvZGU+LAorCSAqIG9yIHBvc3NpYmx5IGEga2luZCB1bmtub3duIHRvIHRoZSBjYWxsZXIKKwkgKiBAc2luY2UgMy4yCisJICovCisJcHVibGljIGludCBnZXRUb2tlbktpbmQoKSB7CisJCXJldHVybiB0aGlzLnRva2VuS2luZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiBjb21wbGV0aW9uIHRva2VuIGJlaW5nIHByb3Bvc2VkLgorCSAqIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBpcyBhIGJpdCBtYXNrIHdoaWNoIGNhbiBjb250YWluIHNvbWUgdmFsdWVzCisJICogb2YgdGhlIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB0aGlzIGNsYXNzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggPGNvZGU+VEw8L2NvZGU+LAorCSAqIG9yIHBvc3NpYmx5IHZhbHVlcyB1bmtub3duIHRvIHRoZSBjYWxsZXIuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgc2V0IG9mIGRpZmZlcmVudCBsb2NhdGlvbiB2YWx1ZXMgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIG92ZXIgdGltZS4KKwkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgZG8gPGI+bm90PC9iPiBhc3N1bWUgdGhhdAorCSAqIHRoZSBsb2NhdGlvbiBjb250YWlucyBvbmx5IGtub3duIHZhbHVlLCBhbmQgY29kZSBkZWZlbnNpdmVseSBmb3IKKwkgKiB0aGUgcG9zc2liaWxpdHkgb2YgdW5leHBlY3RlZCBmdXR1cmUgZ3Jvd3RoLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGludCBnZXRUb2tlbkxvY2F0aW9uKCkgeworCQlyZXR1cm4gdGhpcy50b2tlbkxvY2F0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlCisJICogc3VicmFuZ2UgaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorCSAqIHJlbGV2YW50IHRva2VuIGJlaW5nIGNvbXBsZXRlZC4gVGhpcworCSAqIHRva2VuIGlzIGVpdGhlciB0aGUgaWRlbnRpZmllciBvciBKYXZhIGxhbmd1YWdlIGtleXdvcmQKKwkgKiB1bmRlciwgb3IgaW1tZWRpYXRlbHkgcHJlY2VkaW5nLCB0aGUgb3JpZ2luYWwgcmVxdWVzdAorCSAqIG9mZnNldC4gSWYgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0IGlzIG5vdCB3aXRoaW4KKwkgKiBvciBpbW1lZGlhdGVseSBhZnRlciBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQsIHRoZW4gdGhlCisJICogcG9zaXRpb24gcmV0dXJuZWQgaXMgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQgYW5kIHRoZQorCSAqIHRva2VuIHJhbmdlIGlzIGVtcHR5LgorCSAqCisJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKKwkgKiBAc2luY2UgMy4yCisJICovCisJcHVibGljIGludCBnZXRUb2tlblN0YXJ0KCkgeworCQlyZXR1cm4gdGhpcy50b2tlblN0YXJ0OworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIHZpc2libGUgZnJvbSB0aGUgY29tcGxldGlvbiBsb2NhdGlvbiBhbmQgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiB0eXBlLgorCSAqIEFuIGVsZW1lbnQgaXMgYXNzaWduYWJsZSBpZiBpdHMgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZQorCSAqIG9mIHRoZSBnaXZlbiB0eXBlLCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA1LjIgb2YgPGVtPlRoZSBKYXZhIExhbmd1YWdlCisJICogU3BlY2lmaWNhdGlvbiwgVGhpcmQgRWRpdGlvbjwvZW0+IChKTFMzKS4KKwkgKiBBIHZpc2libGUgZWxlbWVudCBpcyBlaXRoZXI6CisJICogPHVsPgorCSAqIDxsaT5hIHtAbGluayBJTG9jYWxWYXJpYWJsZX0gLSB0aGUgZWxlbWVudCB0eXBlIGlzIHtAbGluayBJTG9jYWxWYXJpYWJsZSNnZXRUeXBlU2lnbmF0dXJlKCl9PC9saT4KKwkgKiA8bGk+YSB7QGxpbmsgSUZpZWxkfSAtIHRoZSBlbGVtZW50IHR5cGUgaXMge0BsaW5rIElGaWVsZCNnZXRUeXBlU2lnbmF0dXJlKCl9PC9saT4KKwkgKiA8bGk+YSB7QGxpbmsgSU1ldGhvZH0gLSB0aGUgZWxlbWVudCB0eXBlIGlzIHtAbGluayBJTWV0aG9kI2dldFJldHVyblR5cGUoKX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBSZXR1cm5lZCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjb21wbGV0ZWQgY29tcGlsYXRpb24gdW5pdCBhcmUgc3BlY2lhbCBKYXZhIGVsZW1lbnRzOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhleSBhcmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGJ1ZmZlciwgdGhleSBhcmUgbm90IHRoZSByZXN1bHQgb2YgYSByZWNvbmNpbGUgb3BlcmF0aW9uPC9saT4KKwkgKiA8bGk+dGhleSBhcmUgbm90IHVwZGF0ZWQgaWYgdGhlIGJ1ZmZlciBjaGFuZ2VzLjwvbGk+CisJICogPGxpPnRoZXkgZG8gbm90IGNvbnRhaW4gbG9jYWwgdHlwZXMgd2hpY2ggYXJlIG5vdCB2aXNpYmxlIGZyb20gdGhlIGNvbXBsZXRpb24gbG9jYXRpb24uPC9saT4KKwkgKiA8bGk+dGhleSBkbyBub3QgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCBjYXRlZ29yaWVzLiB7QGxpbmsgSU1lbWJlciNnZXRDYXRlZ29yaWVzKCl9IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogTm90ZSB0aGUgYXJyYXkgY2FuIGJlIGVtcHR5IGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIGNvbXBpbGF0aW9uIHVuaXQgbm8gbG9uZ2VyIGV4aXN0czwvbGk+CisJICogPGxpPnRoZSBjb21wbGV0aW9uIG9jY3VycmVkIGluIGEgYmluYXJ5IHR5cGUuIEhvd2V2ZXIgdGhpcyByZXN0cmljdGlvbiBtaWdodCBiZSByZWxheGVkIGluIHRoZSBmdXR1cmUuPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIHR5cGVTaWduYXR1cmUgZWxlbWVudHMgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIHRoaXMgdHlwZSBhcmUgcmV0dXJuZWQuCisJICogCQlJZiA8Y29kZT5udWxsPC9jb2RlPiB0aGVyZSBpcyBubyBjb25zdHJhaW50IG9uIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBlbGVtZW50cy4KKwkgKgorCSAqIEByZXR1cm4gZWxlbWVudHMgd2hpY2ggYXJlIHZpc2libGUgZnJvbSB0aGUgY29tcGxldGlvbiBsb2NhdGlvbiBhbmQgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiB0eXBlLgorCSAqCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY29udGV4dCBpcyBub3QgYW4gZXh0ZW5kZWQgY29udGV4dAorCSAqCisJICogQHNlZSAjaXNFeHRlbmRlZCgpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldFZpc2libGVFbGVtZW50cyhTdHJpbmcgdHlwZVNpZ25hdHVyZSkgeworCQlpZiAoIXRoaXMuaXNFeHRlbmRlZCkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gb25seSBzdXBwb3J0ZWQgaW4gZXh0ZW5kZWQgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCiAJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5LaW5kKGludCB0b2tlbktpbmQpIHsKLQkJdGhpcy50b2tlbktpbmQgPSB0b2tlbktpbmQ7CisJCWlmICh0aGlzLmV4dGVuZGVkQ29udGV4dCA9PSBudWxsKSByZXR1cm4gbmV3IElKYXZhRWxlbWVudFswXTsKKwkKKwkJcmV0dXJuIHRoaXMuZXh0ZW5kZWRDb250ZXh0LmdldFZpc2libGVFbGVtZW50cyh0eXBlU2lnbmF0dXJlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21wbGV0aW9uIGNvbnRleHQgaXMgYW4gZXh0ZW5kZWQgY29udGV4dC4KKwkgKiBTb21lIG1ldGhvZHMgb2YgdGhpcyBjb250ZXh0IGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhpcyBjb250ZXh0IGlzIGFuIGV4dGVuZGVkIGNvbnRleHQgYnV0IGFuIGV4dGVuZGVkIGNvbnRleHQgY29uc3VtZXMgbW9yZSBtZW1vcnkuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29tcGxldGlvbiBjb250ZXh0IGlzIGFuIGV4dGVuZGVkIGNvbnRleHQuCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKKwkJcmV0dXJuIHRoaXMuaXNFeHRlbmRlZDsKKwl9CisKKwkvKioKKwkgKiBUZWxsIHVzZXIgd2hldGhlciBjb21wbGV0aW9uIHRha2VzIHBsYWNlIGluIGEgamF2YWRvYyBjb21tZW50IG9yIG5vdC4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNvbXBsZXRpb24gdGFrZXMgcGxhY2UgaW4gYSBqYXZhZG9jIGNvbW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAc2luY2UgMy4yCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbkphdmFkb2MoKSB7CisJCXJldHVybiB0aGlzLmphdmFkb2MgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBUZWxsIHVzZXIgd2hldGhlciBjb21wbGV0aW9uIHRha2VzIHBsYWNlIGluIGEgZm9ybWFsIHJlZmVyZW5jZSBvZiBhIGphdmFkb2MgdGFnIG9yIG5vdC4KKwkgKiBUYWdzIHdpdGggZm9ybWFsIHJlZmVyZW5jZSBhcmU6CisJICogPHVsPgorCSAqIAk8bGk+JiM2NDtzZWU8L2xpPgorCSAqIAk8bGk+JiM2NDt0aHJvd3M8L2xpPgorCSAqIAk8bGk+JiM2NDtleGNlcHRpb248L2xpPgorCSAqIAk8bGk+eyYjNjQ7bGluayBPYmplY3R9PC9saT4KKwkgKiAJPGxpPnsmIzY0O2xpbmtwbGFpbiBPYmplY3R9PC9saT4KKwkgKiAJPGxpPnsmIzY0O3ZhbHVlfSB3aGVuIGNvbXBpbGVyIGNvbXBsaWFuY2UgaXMgc2V0IGF0IGxlYXRzIHRvIDEuNTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNvbXBsZXRpb24gdGFrZXMgcGxhY2UgaW4gZm9ybWFsIHJlZmVyZW5jZSBvZiBhIGphdmFkb2MgdGFnLCBmYWxzZSBvdGhlcndpc2UuCisJICogQHNpbmNlIDMuMgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5KYXZhZG9jRm9ybWFsUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKHRoaXMuamF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuRk9STUFMX1JFRkVSRU5DRSkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBUZWxsIHVzZXIgd2hldGhlciBjb21wbGV0aW9uIHRha2VzIHBsYWNlIGluIHRleHQgYXJlYSBvZiBhIGphdmFkb2MgY29tbWVudCBvciBub3QuCisJICoKKwkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb21wbGV0aW9uIHRha2VzIHBsYWNlIGluIGEgdGV4dCBhcmVhIG9mIGEgamF2YWRvYyBjb21tZW50LCBmYWxzZSBvdGhlcndpc2UuCisJICogQHNpbmNlIDMuMgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5KYXZhZG9jVGV4dCgpIHsKKwkJcmV0dXJuICh0aGlzLmphdmFkb2MgJiBDb21wbGV0aW9uT25KYXZhZG9jLlRFWFQpICE9IDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmluZGV4IDQ4YzZlZTMuLmYyMmFkMGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0ludGVybmFsQ29tcGxldGlvblByb3Bvc2FsLmphdmEKQEAgLTEsMTAwICsxLDIwMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQW5kcmVhcyBNYWdudXNzb24gPGFuZHJlYXMuY2gubWFnbnVzc29uQGdtYWlsLmNvbT4tIGNvbnRyaWJ1dGlvbiBmb3IgYnVnIDE1MTUwMAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkZsYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5OYW1lTG9va3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1hcHBlcjsKIAogLyoqCiAgKiBJbnRlcm5hbCBjb21wbGV0aW9uIHByb3Bvc2FsCiAgKiBAc2luY2UgMy4xCiAgKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbCB7CitwdWJsaWMgY2xhc3MgSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBDb21wbGV0aW9uUHJvcG9zYWwgewogCXByaXZhdGUgc3RhdGljIE9iamVjdCBOT19BVFRBQ0hFRF9TT1VSQ0UgPSBuZXcgT2JqZWN0KCk7CiAJCi0Jc3RhdGljIGZpbmFsIGNoYXJbXSBBUkcgPSAiYXJnIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBjaGFyW10gQVJHMCA9ICJhcmcwIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBjaGFyW10gQVJHMSA9ICJhcmcxIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBjaGFyW10gQVJHMiA9ICJhcmcyIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBjaGFyW10gQVJHMyA9ICJhcmczIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTMSA9IG5ldyBjaGFyW11bXXtBUkcwfTsKLQlzdGF0aWMgZmluYWwgY2hhcltdW10gQVJHUzIgPSBuZXcgY2hhcltdW117QVJHMCwgQVJHMX07Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXVtdIEFSR1MzID0gbmV3IGNoYXJbXVtde0FSRzAsIEFSRzEsIEFSRzJ9OwotCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBBUkdTNCA9IG5ldyBjaGFyW11bXXtBUkcwLCBBUkcxLCBBUkcyLCBBUkczfTsKLQkKIAlwcm90ZWN0ZWQgQ29tcGxldGlvbkVuZ2luZSBjb21wbGV0aW9uRW5naW5lOwogCXByb3RlY3RlZCBOYW1lTG9va3VwIG5hbWVMb29rdXA7Ci0JCisKIAlwcm90ZWN0ZWQgY2hhcltdIGRlY2xhcmF0aW9uUGFja2FnZU5hbWU7CiAJcHJvdGVjdGVkIGNoYXJbXSBkZWNsYXJhdGlvblR5cGVOYW1lOwogCXByb3RlY3RlZCBjaGFyW10gcGFja2FnZU5hbWU7CiAJcHJvdGVjdGVkIGNoYXJbXSB0eXBlTmFtZTsKIAlwcm90ZWN0ZWQgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzOwogCXByb3RlY3RlZCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXM7Ci0JCisKIAlwcm90ZWN0ZWQgY2hhcltdIG9yaWdpbmFsU2lnbmF0dXJlOwotCQorCisJcHJpdmF0ZSBib29sZWFuIGhhc05vUGFyYW1ldGVyTmFtZXNGcm9tSW5kZXggPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29tcGxldGlvbiA9IGZhbHNlOworCiAJcHJvdGVjdGVkIGludCBhY2Nlc3NpYmlsaXR5ID0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFOwotCQorCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25zdHJ1Y3RvciA9IGZhbHNlOworCisJLyoqCisJICogS2luZCBvZiBjb21wbGV0aW9uIHJlcXVlc3QuCisJICovCisJcHJpdmF0ZSBpbnQgY29tcGxldGlvbktpbmQ7CisKKwkvKioKKwkgKiBPZmZzZXQgaW4gb3JpZ2luYWwgYnVmZmVyIHdoZXJlIElDb2RlQXNzaXN0LmNvZGVDb21wbGV0ZSgpIHdhcworCSAqIHJlcXVlc3RlZC4KKwkgKi8KKwlwcml2YXRlIGludCBjb21wbGV0aW9uTG9jYXRpb247CisKKwkvKioKKwkgKiBTdGFydCBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiBzb3VyY2UgcmFuZ2UgaW4gb3JpZ2luYWwgYnVmZmVyCisJICogY29udGFpbmluZyB0aGUgcmVsZXZhbnQgdG9rZW4KKwkgKiBkZWZhdWx0cyB0byBlbXB0eSBzdWJyYW5nZSBhdCBbMCwwKS4KKwkgKi8KKwlwcml2YXRlIGludCB0b2tlblN0YXJ0ID0gMDsKKworCS8qKgorCSAqIEVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKSBvZiBzb3VyY2UgcmFuZ2UgaW4gb3JpZ2luYWwgYnVmZmVyCisJICogY29udGFpbmluZyB0aGUgcmVsZXZhbnQgdG9rZW47CisJICogZGVmYXVsdHMgdG8gZW1wdHkgc3VicmFuZ2UgYXQgWzAsMCkuCisJICovCisJcHJpdmF0ZSBpbnQgdG9rZW5FbmQgPSAwOworCisJLyoqCisJICogQ29tcGxldGlvbiBzdHJpbmc7IGRlZmF1bHRzIHRvIGVtcHR5IHN0cmluZy4KKwkgKi8KKwlwcml2YXRlIGNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCisJLyoqCisJICogU3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2Ygc291cmNlIHJhbmdlIGluIG9yaWdpbmFsIGJ1ZmZlcgorCSAqIHRvIGJlIHJlcGxhY2VkIGJ5IGNvbXBsZXRpb24gc3RyaW5nOworCSAqIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgorCSAqLworCXByaXZhdGUgaW50IHJlcGxhY2VTdGFydCA9IDA7CisKKwkvKioKKwkgKiBFbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkgb2Ygc291cmNlIHJhbmdlIGluIG9yaWdpbmFsIGJ1ZmZlcgorCSAqIHRvIGJlIHJlcGxhY2VkIGJ5IGNvbXBsZXRpb24gc3RyaW5nOworCSAqIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgorCSAqLworCXByaXZhdGUgaW50IHJlcGxhY2VFbmQgPSAwOworCisJLyoqCisJICogUmVsZXZhbmNlIHJhdGluZzsgcG9zaXRpdmU7IGhpZ2hlciBtZWFucyBiZXR0ZXI7CisJICogZGVmYXVsdHMgdG8gbWluaW11bSByYXRpbmcuCisJICovCisJcHJpdmF0ZSBpbnQgcmVsZXZhbmNlID0gMTsKKworCS8qKgorCSAqIFNpZ25hdHVyZSBvZiB0aGUgcmVsZXZhbnQgcGFja2FnZSBvciB0eXBlIGRlY2xhcmF0aW9uCisJICogaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogRGVmYXVsdHMgdG8gbnVsbC4KKwkgKi8KKwlwcml2YXRlIGNoYXJbXSBkZWNsYXJhdGlvblNpZ25hdHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBVbmlxdWUga2V5IG9mIHRoZSByZWxldmFudCBwYWNrYWdlIG9yIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBudWxsLgorCSAqLworCXByaXZhdGUgY2hhcltdIGRlY2xhcmF0aW9uS2V5ID0gbnVsbDsKKworCS8qKgorCSAqIFNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QsIGZpZWxkLAorCSAqIG1lbWJlciwgb3IgdmFyaWFibGUgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBudWxsLgorCSAqLworCXByaXZhdGUgY2hhcltdIG5hbWUgPSBudWxsOworCisJLyoqCisJICogU2lnbmF0dXJlIG9mIHRoZSBtZXRob2QsIGZpZWxkIHR5cGUsIG1lbWJlciB0eXBlLAorCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIERlZmF1bHRzIHRvIG51bGwuCisJICovCisJcHJpdmF0ZSBjaGFyW10gc2lnbmF0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIFVuaXF1ZSBvZiB0aGUgbWV0aG9kLCBmaWVsZCB0eXBlLCBtZW1iZXIgdHlwZSwKKwkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBudWxsLgorCSAqLworCXByaXZhdGUgY2hhcltdIGtleSA9IG51bGw7CisKKwkvKioKKwkgKiBBcnJheSBvZiByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBUaGUgcHJvcG9zYWwgY2FuIG5vdCBiZSBhcHBsaWVkIGlmIHRoZSByZXF1aXJlZCBwcm9wb3NhbHMgYXJlbid0IGFwcGxpZWQuCisJICogRGVmYXVsdHMgdG8gPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSBDb21wbGV0aW9uUHJvcG9zYWxbXSByZXF1aXJlZFByb3Bvc2FsczsKKworCS8qKgorCSAqIE1vZGlmaWVyIGZsYWdzIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvcgorCSAqIDxjb2RlPkZsYWdzLkFjY0RlZmF1bHQ8L2NvZGU+IGlmIG5vbmUuCisJICogRGVmYXVsdHMgdG8gPGNvZGU+RmxhZ3MuQWNjRGVmYXVsdDwvY29kZT4uCisJICovCisJcHJpdmF0ZSBpbnQgZmxhZ3MgPSBGbGFncy5BY2NEZWZhdWx0OworCisJLyoqCisJICogQ29tcGxldGlvbiBmbGFncyByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKKwkgKiA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuRGVmYXVsdDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuRGVmYXVsdDwvY29kZT4uCisJICovCisJcHJpdmF0ZSBpbnQgYWRkaXRpb25hbEZsYWdzID0gQ29tcGxldGlvbkZsYWdzLkRlZmF1bHQ7CisKKwkvKioKKwkgKiBQYXJhbWV0ZXIgbmFtZXMgKGZvciBtZXRob2QgY29tcGxldGlvbnMpLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIExhemlseSBjb21wdXRlZC4KKwkgKiBEZWZhdWx0cyB0byA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gbnVsbDsKKworCS8qKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHBhcmFtZXRlciBuYW1lcyBoYXZlIGJlZW4gY29tcHV0ZWQuCisJICovCisJcHJpdmF0ZSBib29sZWFuIHBhcmFtZXRlck5hbWVzQ29tcHV0ZWQgPSBmYWxzZTsKIAkKLQlwcm90ZWN0ZWQgY2hhcltdW10gY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKGludCBsZW5ndGgpIHsKLQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXM7Ci0JCXN3aXRjaCAobGVuZ3RoKSB7Ci0JCQljYXNlIDAgOgotCQkJCXBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxIDoKLQkJCQlwYXJhbWV0ZXJOYW1lcyA9IEFSR1MxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQlwYXJhbWV0ZXJOYW1lcyA9IEFSR1MyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlwYXJhbWV0ZXJOYW1lcyA9IEFSR1MzOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0IDoKLQkJCQlwYXJhbWV0ZXJOYW1lcyA9IEFSR1M0OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFSRywgU3RyaW5nLnZhbHVlT2YoaSkudG9DaGFyQXJyYXkoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJOYW1lczsKLQl9Ci0JcHJvdGVjdGVkIGNoYXJbXVtdIGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1UeXBlTmFtZXMpeworCXByb3RlY3RlZCBjaGFyW11bXSBmaW5kQ29uc3RydWN0b3JQYXJhbWV0ZXJOYW1lcyhjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1UeXBlTmFtZXMpewogCQlpZihwYXJhbVR5cGVOYW1lcyA9PSBudWxsIHx8IGRlY2xhcmluZ1R5cGVOYW1lID09IG51bGwpIHJldHVybiBudWxsOwotCQkKLQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBudWxsOworCisJCWNoYXJbXVtdIHBhcmFtZXRlcnMgPSBudWxsOwogCQlpbnQgbGVuZ3RoID0gcGFyYW1UeXBlTmFtZXMubGVuZ3RoOwotCQkKKwogCQljaGFyW10gdE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsZGVjbGFyaW5nVHlwZU5hbWUsJy4nKTsKIAkJT2JqZWN0IGNhY2hlZFR5cGUgPSB0aGlzLmNvbXBsZXRpb25FbmdpbmUudHlwZUNhY2hlLmdldCh0TmFtZSk7Ci0JCQorCiAJCUlUeXBlIHR5cGUgPSBudWxsOwogCQlpZihjYWNoZWRUeXBlICE9IG51bGwpIHsKIAkJCWlmKGNhY2hlZFR5cGUgIT0gTk9fQVRUQUNIRURfU09VUkNFICYmIGNhY2hlZFR5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7CiAJCQkJdHlwZSA9IChCaW5hcnlUeXBlKWNhY2hlZFR5cGU7CiAJCQl9Ci0JCX0gZWxzZSB7IAorCQl9IGVsc2UgewogCQkJLy8gVE9ETyAoZGF2aWQpIHNob3VsZG4ndCBpdCBiZSBOYW1lTG9va3VwLkFDQ0VQVF9BTEwgPwotCQkJTmFtZUxvb2t1cC5BbnN3ZXIgYW5zd2VyID0gdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKG5ldyBTdHJpbmcodE5hbWUpLAorCQkJTmFtZUxvb2t1cC5BbnN3ZXIgYW5zd2VyID0gdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKG5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZU5hbWUpLAorCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lKSwKIAkJCQlmYWxzZSwKIAkJCQlOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTICYgTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUywKIAkJCQl0cnVlLyogY29uc2lkZXIgc2Vjb25kYXJ5IHR5cGVzICovLApAQCAtMTA4LDg5ICsyMTEsMTYxMiBAQAogCQkJCXR5cGUgPSBudWxsOwogCQkJfQogCQl9Ci0JCQorCiAJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkJCWZvcihpbnQgaSA9IDA7CWk8IGxlbmd0aCA7IGkrKyl7Ci0JCQkJYXJnc1tpXSA9IG5ldyBTdHJpbmcocGFyYW1UeXBlTmFtZXNbaV0pOwotCQkJfQotCQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKHNlbGVjdG9yKSxhcmdzKTsKLQkJCXRyeXsKLQkJCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCQlmb3IoaW50IGkgPSAwOwlpPCBsZW5ndGggOyBpKyspewotCQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IHBhcmFtc1tpXS50b0NoYXJBcnJheSgpOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjkzNworCQkJLy8gQmluYXJ5VHlwZSNnZXRNZXRob2QoKSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJpbmFyeU1ldGhvZCwgd2hpY2ggaXMgYSBkdW1teS4KKwkJCS8vIEluc3RlYWQgd2UgaGF2ZSB0byB1c2UgSVR5cGUjZmluZE1ldGhvZHMoKSB0byBnZXQgYSBoYW5kbGUgdG8gdGhlIG1ldGhvZCBvZiBvdXIgaW50ZXJlc3QuCisJCQl0cnkgeworCQkJCUlNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZCh0eXBlLCBzZWxlY3RvciwgcGFyYW1UeXBlTmFtZXMpOworCQkJCWlmICh0aGlzLmhhc05vUGFyYW1ldGVyTmFtZXNGcm9tSW5kZXgpIHsKKworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXR5cGUuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CisJCQkJCWlmIChwYWNrYWdlRnJhZ21lbnRSb290LmlzQXJjaGl2ZSgpIHx8CisJCQkJCQkJdGhpcy5jb21wbGV0aW9uRW5naW5lLm9wZW5lZEJpbmFyeVR5cGVzIDwgZ2V0T3BlbmVkQmluYXJ5VHlwZXNUaHJlc2hvbGQoKSkgeworCQkJCQkJU291cmNlTWFwcGVyIG1hcHBlciA9ICgoSmF2YUVsZW1lbnQpbWV0aG9kKS5nZXRTb3VyY2VNYXBwZXIoKTsKKwkJCQkJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJCQkJCWNoYXJbXVtdIHBhcmFtTmFtZXMgPSBtYXBwZXIuZ2V0TWV0aG9kUGFyYW1ldGVyTmFtZXMobWV0aG9kKTsKKworCQkJCQkJCS8vIG1hcCBzb3VyY2UgYW5kIHRyeSB0byBmaW5kIHBhcmFtZXRlciBuYW1lcworCQkJCQkJCWlmKHBhcmFtTmFtZXMgPT0gbnVsbCkgeworCQkJCQkJCQlpZiAoIXBhY2thZ2VGcmFnbWVudFJvb3QuaXNBcmNoaXZlKCkpIHRoaXMuY29tcGxldGlvbkVuZ2luZS5vcGVuZWRCaW5hcnlUeXBlcysrOworCQkJCQkJCQlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSAoKEJpbmFyeVR5cGUpIHR5cGUpLmdldEVsZW1lbnRJbmZvKCk7CisJCQkJCQkJCWNoYXJbXSBzb3VyY2UgPSBtYXBwZXIuZmluZFNvdXJjZSh0eXBlLCBpbmZvKTsKKwkJCQkJCQkJaWYgKHNvdXJjZSAhPSBudWxsKXsKKwkJCQkJCQkJCW1hcHBlci5tYXBTb3VyY2UodHlwZSwgc291cmNlLCBpbmZvKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlwYXJhbU5hbWVzID0gbWFwcGVyLmdldE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYocGFyYW1OYW1lcyAhPSBudWxsKSB7CisJCQkJCQkJCXBhcmFtZXRlcnMgPSBwYXJhbU5hbWVzOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSAoKEphdmFFbGVtZW50KW1ldGhvZCkuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQkJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IGluZm8uZ2V0QXJndW1lbnROYW1lcygpOworCQkJCQlpZiAoYXJndW1lbnROYW1lcyAhPSBudWxsICYmIGFyZ3VtZW50TmFtZXMubGVuZ3RoID09IGxlbmd0aCkgeworCQkJCQkJcGFyYW1ldGVycyA9IGFyZ3VtZW50TmFtZXM7CisJCQkJCQlyZXR1cm4gcGFyYW1ldGVyczsKKwkJCQkJfQorCisJCQkJCXBhcmFtZXRlcnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOworCQkJCQlmb3IoaW50IGkgPSAwOwlpPCBsZW5ndGggOyBpKyspeworCQkJCQkJcGFyYW1ldGVyc1tpXSA9IHBhcmFtc1tpXS50b0NoYXJBcnJheSgpOworCQkJCQl9CiAJCQkJfQogCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7Ci0JCQkJcGFyYW1ldGVyTmFtZXMgPSBudWxsOworCQkJCXBhcmFtZXRlcnMgPSBudWxsOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIGRlZmF1bHQgcGFyYW1ldGVycyBuYW1lCi0JCWlmKHBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKLQkJCXBhcmFtZXRlck5hbWVzID0gY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKGxlbmd0aCk7CisJCWlmKHBhcmFtZXRlcnMgPT0gbnVsbCkgeworCQkJcGFyYW1ldGVycyA9IENvbXBsZXRpb25FbmdpbmUuY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKGxlbmd0aCk7CiAJCX0KLQkJCi0JCXJldHVybiBwYXJhbWV0ZXJOYW1lczsKKworCQlyZXR1cm4gcGFyYW1ldGVyczsKIAl9CiAJCisJcHJvdGVjdGVkIGNoYXJbXVtdIGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1UeXBlTmFtZXMpeworCQlpZihwYXJhbVR5cGVOYW1lcyA9PSBudWxsIHx8IGRlY2xhcmluZ1R5cGVOYW1lID09IG51bGwpIHJldHVybiBudWxsOworCisJCWNoYXJbXVtdIHBhcmFtZXRlcnMgPSBudWxsOworCQlpbnQgbGVuZ3RoID0gcGFyYW1UeXBlTmFtZXMubGVuZ3RoOworCisJCWNoYXJbXSB0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxkZWNsYXJpbmdUeXBlTmFtZSwnLicpOworCQlPYmplY3QgY2FjaGVkVHlwZSA9IHRoaXMuY29tcGxldGlvbkVuZ2luZS50eXBlQ2FjaGUuZ2V0KHROYW1lKTsKKworCQlJVHlwZSB0eXBlID0gbnVsbDsKKwkJaWYoY2FjaGVkVHlwZSAhPSBudWxsKSB7CisJCQlpZihjYWNoZWRUeXBlICE9IE5PX0FUVEFDSEVEX1NPVVJDRSAmJiBjYWNoZWRUeXBlIGluc3RhbmNlb2YgQmluYXJ5VHlwZSkgeworCQkJCXR5cGUgPSAoQmluYXJ5VHlwZSljYWNoZWRUeXBlOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gVE9ETyAoZGF2aWQpIHNob3VsZG4ndCBpdCBiZSBOYW1lTG9va3VwLkFDQ0VQVF9BTEwgPworCQkJTmFtZUxvb2t1cC5BbnN3ZXIgYW5zd2VyID0gdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKG5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZU5hbWUpLAorCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lKSwKKwkJCQlmYWxzZSwKKwkJCQlOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTICYgTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUywKKwkJCQl0cnVlLyogY29uc2lkZXIgc2Vjb25kYXJ5IHR5cGVzICovLAorCQkJCWZhbHNlLyogZG8gTk9UIHdhaXQgZm9yIGluZGV4ZXMgKi8sCisJCQkJZmFsc2UvKmRvbid0IGNoZWNrIHJlc3RyaWN0aW9ucyovLAorCQkJCW51bGwpOworCQkJdHlwZSA9IGFuc3dlciA9PSBudWxsID8gbnVsbCA6IGFuc3dlci50eXBlOworCQkJaWYodHlwZSBpbnN0YW5jZW9mIEJpbmFyeVR5cGUpeworCQkJCXRoaXMuY29tcGxldGlvbkVuZ2luZS50eXBlQ2FjaGUucHV0KHROYW1lLCB0eXBlKTsKKwkJCX0gZWxzZSB7CisJCQkJdHlwZSA9IG51bGw7CisJCQl9CisJCX0KKworCQlpZih0eXBlICE9IG51bGwpIHsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTY5MzcKKwkJCS8vIEJpbmFyeVR5cGUjZ2V0TWV0aG9kKCkgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBCaW5hcnlNZXRob2QsIHdoaWNoIGlzIGEgZHVtbXkuCisJCQkvLyBJbnN0ZWFkIHdlIGhhdmUgdG8gdXNlIElUeXBlI2ZpbmRNZXRob2RzKCkgdG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBtZXRob2Qgb2Ygb3VyIGludGVyZXN0LgorCQkJdHJ5eworCQkJCUlNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZCh0eXBlLCBzZWxlY3RvciwgcGFyYW1UeXBlTmFtZXMpOworCQkJCXBhcmFtZXRlcnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJU3RyaW5nW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7CisJCQkJZm9yKGludCBpID0gMDsJaTwgbGVuZ3RoIDsgaSsrKXsKKwkJCQkJcGFyYW1ldGVyc1tpXSA9IHBhcmFtc1tpXS50b0NoYXJBcnJheSgpOworCQkJCX0KKwkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkJCXBhcmFtZXRlcnMgPSBudWxsOworCQkJfQorCQl9CisKKwkJLy8gZGVmYXVsdCBwYXJhbWV0ZXJzIG5hbWUKKwkJaWYocGFyYW1ldGVycyA9PSBudWxsKSB7CisJCQlwYXJhbWV0ZXJzID0gQ29tcGxldGlvbkVuZ2luZS5jcmVhdGVEZWZhdWx0UGFyYW1ldGVyTmFtZXMobGVuZ3RoKTsKKwkJfQorCisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKworCXByaXZhdGUgSU1ldGhvZCBmaW5kTWV0aG9kKElUeXBlIHR5cGUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1UeXBlTmFtZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJTWV0aG9kIG1ldGhvZCA9IG51bGw7CisJCWludCBzdGFydGluZ0luZGV4ID0gMDsKKwkJU3RyaW5nW10gYXJnczsKKwkJSVR5cGUgZW5jbG9zaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkvLyBJZiB0aGUgbWV0aG9kIGlzIGEgY29uc3RydWN0b3Igb2YgYSBub24tc3RhdGljIGlubmVyIHR5cGUsIGFkZCB0aGUgZW5jbG9zaW5nIHR5cGUgYXMgYW4gCisJCS8vIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3RvcgorCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksIHNlbGVjdG9yKQorCQkJCSYmICFGbGFncy5pc1N0YXRpYyh0eXBlLmdldEZsYWdzKCkpKSB7CisJCQlhcmdzID0gbmV3IFN0cmluZ1twYXJhbVR5cGVOYW1lcy5sZW5ndGgrMV07CisJCQlzdGFydGluZ0luZGV4ID0gMTsKKwkJCWFyZ3NbMF0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShlbmNsb3NpbmdUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCWFyZ3MgPSBuZXcgU3RyaW5nW3BhcmFtVHlwZU5hbWVzLmxlbmd0aF07CisJCX0KKwkJaW50IGxlbmd0aCA9IGFyZ3MubGVuZ3RoOworCQlmb3IoaW50IGkgPSBzdGFydGluZ0luZGV4OwlpPCBsZW5ndGggOyBpKyspeworCQkJYXJnc1tpXSA9IG5ldyBTdHJpbmcocGFyYW1UeXBlTmFtZXNbaS1zdGFydGluZ0luZGV4XSk7CisJCX0KKwkJbWV0aG9kID0gdHlwZS5nZXRNZXRob2QobmV3IFN0cmluZyhzZWxlY3RvciksIGFyZ3MpOworCQkKKwkJSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmZpbmRNZXRob2RzKG1ldGhvZCk7CisJCWlmIChtZXRob2RzICE9IG51bGwgJiYgbWV0aG9kcy5sZW5ndGggPiAwKSB7CisJCQltZXRob2QgPSBtZXRob2RzWzBdOworCQl9CisJCXJldHVybiBtZXRob2Q7CisJfQorCiAJcHJvdGVjdGVkIGNoYXJbXSBnZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCkgewogCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvblBhY2thZ2VOYW1lOwogCX0KLQkKKwogCXByb3RlY3RlZCBjaGFyW10gZ2V0RGVjbGFyYXRpb25UeXBlTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZTsKIAl9CiAJCisJcHJpdmF0ZSBpbnQgZ2V0T3BlbmVkQmluYXJ5VHlwZXNUaHJlc2hvbGQoKSB7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRPcGVuYWJsZUNhY2hlU2l6ZSgpIC8gMTA7CisJfQorCiAJcHJvdGVjdGVkIGNoYXJbXSBnZXRQYWNrYWdlTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7CiAJfQotCQorCiAJcHJvdGVjdGVkIGNoYXJbXSBnZXRUeXBlTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMudHlwZU5hbWU7CiAJfQotCQorCiAJcHJvdGVjdGVkIGNoYXJbXVtdIGdldFBhcmFtZXRlclBhY2thZ2VOYW1lcygpIHsKIAkJcmV0dXJuIHRoaXMucGFyYW1ldGVyUGFja2FnZU5hbWVzOwogCX0KLQkKLQkKKworCiAJcHJvdGVjdGVkIGNoYXJbXVtdIGdldFBhcmFtZXRlclR5cGVOYW1lcygpIHsKIAkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIHNldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoY2hhcltdIGRlY2xhcmF0aW9uUGFja2FnZU5hbWUpIHsKIAkJdGhpcy5kZWNsYXJhdGlvblBhY2thZ2VOYW1lID0gZGVjbGFyYXRpb25QYWNrYWdlTmFtZTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJhdGlvblR5cGVOYW1lKGNoYXJbXSBkZWNsYXJhdGlvblR5cGVOYW1lKSB7CiAJCXRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZSA9IGRlY2xhcmF0aW9uVHlwZU5hbWU7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZU5hbWUoY2hhcltdIHBhY2thZ2VOYW1lKSB7CiAJCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlTmFtZShjaGFyW10gdHlwZU5hbWUpIHsKIAkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIHNldFBhcmFtZXRlclBhY2thZ2VOYW1lcyhjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpIHsKIAkJdGhpcy5wYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXM7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0UGFyYW1ldGVyVHlwZU5hbWVzKGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcykgewogCQl0aGlzLnBhcmFtZXRlclR5cGVOYW1lcyA9IHBhcmFtZXRlclR5cGVOYW1lczsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NpYmlsaXR5KGludCBraW5kKSB7CiAJCXRoaXMuYWNjZXNzaWJpbGl0eSA9IGtpbmQ7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0SXNDb250cnVjdG9yKGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgewogCQl0aGlzLmlzQ29uc3RydWN0b3IgPSBpc0NvbnN0cnVjdG9yOwogCX0KIAlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbFNpZ25hdHVyZShjaGFyW10gb3JpZ2luYWxTaWduYXR1cmUpIHsKIAkJdGhpcy5vcmlnaW5hbFNpZ25hdHVyZSA9IG9yaWdpbmFsU2lnbmF0dXJlOwogCX0KKwkvKioKKwkgKiBDcmVhdGVzIGEgYmFzaWMgY29tcGxldGlvbiBwcm9wb3NhbC4gQWxsIGluc3RhbmNlCisJICogZmllbGQgaGF2ZSBwbGF1c2libGUgZGVmYXVsdCB2YWx1ZXMgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBmb3IgdGhpcyBjbGFzcyBhcmUgaW50ZXJuYWwgdG8gdGhlCisJICogSmF2YSBtb2RlbCBpbXBsZW1lbnRhdGlvbi4gQ2xpZW50cyBjYW5ub3QgZGlyZWN0bHkgY3JlYXRlCisJICogQ29tcGxldGlvblByb3Bvc2FsIG9iamVjdHMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB0aGlzIGNsYXNzCisJICogQHBhcmFtIGNvbXBsZXRpb25Mb2NhdGlvbiBvcmlnaW5hbCBvZmZzZXQgb2YgY29kZSBjb21wbGV0aW9uIHJlcXVlc3QKKwkgKi8KKwlwdWJsaWMgSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWwoaW50IGtpbmQsIGludCBjb21wbGV0aW9uTG9jYXRpb24pIHsKKwkJaWYgKChraW5kIDwgRklSU1RfS0lORCkKKwkJCQl8fCAoa2luZCA+IExBU1RfS0lORCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAodGhpcy5jb21wbGV0aW9uID09IG51bGwgfHwgY29tcGxldGlvbkxvY2F0aW9uIDwgMCkgeworCQkJLy8gV29yayBhcm91bmQgZm9yIGJ1ZyAxMzI1NTggKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI1NTgpLgorCQkJLy8gY29tcGxldGlvbkxvY2F0aW9uIGNhbiBiZSAtMSBpZiB0aGUgY29tcGxldGlvbiBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlIG9yCisJCQkvLyB0aGUgc3RhcnQgb2YgYSBjb2RlIHNuaXBwZXQgYnV0IHRoaXMgQVBJIGlzbid0IGRlc2lnbiB0byBzdXBwb3J0IG5lZ2F0aXZlIHBvc2l0aW9uLgorCQkJaWYodGhpcy5jb21wbGV0aW9uID09IG51bGwgfHwgY29tcGxldGlvbkxvY2F0aW9uICE9IC0xKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJY29tcGxldGlvbkxvY2F0aW9uID0gMDsKKwkJfQorCQl0aGlzLmNvbXBsZXRpb25LaW5kID0ga2luZDsKKwkJdGhpcy5jb21wbGV0aW9uTG9jYXRpb24gPSBjb21wbGV0aW9uTG9jYXRpb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29tcGxldGlvbiBmbGFncyByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKKwkgKiA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuRGVmYXVsdDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorCSAqIDx1bD4KKwkgKiA8bGk+PGNvZGU+RklFTERfSU1QT1JUPC9jb2RlPiAtIGNvbXBsZXRpb24gZmxhZ3MKKwkgKiBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaXMgcmVmZXJlbmNlZC4gQ29tcGxldGlvbiBmbGFncyBmb3IKKwkgKiB0aGlzIHByb3Bvc2FsIGtpbmQgY2FuIG9ubHkgaW5jbHVkZSA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuU3RhdGljSW1wb3J0PC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPk1FVEhPRF9JTVBPUlQ8L2NvZGU+IC0gY29tcGxldGlvbiBmbGFncworCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyByZWZlcmVuY2VkLiBDb21wbGV0aW9uIGZsYWdzIGZvcgorCSAqIHRoaXMgcHJvcG9zYWwga2luZCBjYW4gb25seSBpbmNsdWRlIDxjb2RlPkNvbXBsZXRpb25GbGFncy5TdGF0aWNJbXBvcnQ8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+VFlQRV9JTVBPUlQ8L2NvZGU+IC0gY29tcGxldGlvbiBmbGFncworCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyByZWZlcmVuY2VkLiBDb21wbGV0aW9uIGZsYWdzIGZvcgorCSAqIHRoaXMgcHJvcG9zYWwga2luZCBjYW4gb25seSBpbmNsdWRlIDxjb2RlPkNvbXBsZXRpb25GbGFncy5TdGF0aWNJbXBvcnQ8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqIEZvciBvdGhlciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucworCSAqIDxjb2RlPkNvbXBsZXRpb25GbGFncy5EZWZhdWx0PC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb21wbGV0aW9uIGZsYWdzLCBvcgorCSAqIDxjb2RlPkNvbXBsZXRpb25GbGFncy5EZWZhdWx0PC9jb2RlPiBpZiBub25lCisJICogQHNlZSBDb21wbGV0aW9uRmxhZ3MKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgaW50IGdldEFkZGl0aW9uYWxGbGFncygpIHsKKwkJcmV0dXJuIHRoaXMuYWRkaXRpb25hbEZsYWdzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNvbXBsZXRpb24gZmxhZ3MgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQuCisJICogPHA+CisJICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gYWRkaXRpb25hbEZsYWdzIHRoZSBjb21wbGV0aW9uIGZsYWdzLCBvcgorCSAqIDxjb2RlPkNvbXBsZXRpb25GbGFncy5EZWZhdWx0PC9jb2RlPiBpZiBub25lCisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEZsYWdzKGludCBhZGRpdGlvbmFsRmxhZ3MpIHsKKwkJdGhpcy5hZGRpdGlvbmFsRmxhZ3MgPSBhZGRpdGlvbmFsRmxhZ3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUga2luZCBvZiBjb21wbGV0aW9uIGJlaW5nIHByb3Bvc2VkLgorCSAqIDxwPgorCSAqIFRoZSBzZXQgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGlzCisJICogZXhwZWN0ZWQgdG8gY2hhbmdlIG92ZXIgdGltZS4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKwkgKiB0aGF0IGNsaWVudHMgZG8gPGI+bm90PC9iPiBhc3N1bWUgdGhhdCB0aGUga2luZCBpcyBvbmUgb2YgdGhlCisJICogb25lcyB0aGV5IGtub3cgYWJvdXQsIGFuZCBjb2RlIGRlZmVuc2l2ZWx5IGZvciB0aGUKKwkgKiBwb3NzaWJpbGl0eSBvZiB1bmV4cGVjdGVkIGZ1dHVyZSBncm93dGguCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUga2luZDsgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cworCSAqIGRlY2xhcmVkIG9uIHRoaXMgY2xhc3MsIG9yIHBvc3NpYmx5IGEga2luZCB1bmtub3duCisJICogdG8gdGhlIGNhbGxlcgorCSAqLworCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKwkJcmV0dXJuIHRoaXMuY29tcGxldGlvbktpbmQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIKKwkgKiB3aGVyZSBzb3VyY2UgY29tcGxldGlvbiB3YXMgcmVxdWVzdGVkICh0aGUKKwkgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBhcmFtZXRlciB0bworCSAqIDxjb2RlPklDb2RlQXNzaXN0LmNvZGVDb21wbGV0ZTwvY29kZT4gbWludXMgb25lKS4KKwkgKgorCSAqIEByZXR1cm4gY2hhcmFjdGVyIGluZGV4IGluIHNvdXJjZSBmaWxlIGJ1ZmZlcgorCSAqIEBzZWUgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCxDb21wbGV0aW9uUmVxdWVzdG9yKQorCSAqLworCS8vIFRPRE8gKGRhdmlkKSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNTU4CisJcHVibGljIGludCBnZXRDb21wbGV0aW9uTG9jYXRpb24oKSB7CisJCXJldHVybiB0aGlzLmNvbXBsZXRpb25Mb2NhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHN1YnJhbmdlIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUKKwkgKiByZWxldmFudCB0b2tlbiBiZWluZyBjb21wbGV0ZWQuIFRoaXMKKwkgKiB0b2tlbiBpcyBlaXRoZXIgdGhlIGlkZW50aWZpZXIgb3IgSmF2YSBsYW5ndWFnZSBrZXl3b3JkCisJICogdW5kZXIsIG9yIGltbWVkaWF0ZWx5IHByZWNlZGluZywgdGhlIG9yaWdpbmFsIHJlcXVlc3QKKwkgKiBvZmZzZXQuIElmIHRoZSBvcmlnaW5hbCByZXF1ZXN0IG9mZnNldCBpcyBub3Qgd2l0aGluCisJICogb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkLCB0aGVuIHRoZQorCSAqIHBvc2l0aW9uIHJldHVybmVkIGlzIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0IGFuZCB0aGUKKwkgKiB0b2tlbiByYW5nZSBpcyBlbXB0eS4KKwkgKgorCSAqIEByZXR1cm4gY2hhcmFjdGVyIGluZGV4IG9mIHRva2VuIHN0YXJ0IHBvc2l0aW9uIChpbmNsdXNpdmUpCisJICovCisJcHVibGljIGludCBnZXRUb2tlblN0YXJ0KCkgeworCQlyZXR1cm4gdGhpcy50b2tlblN0YXJ0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBzdWJyYW5nZQorCSAqIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUKKwkgKiByZWxldmFudCB0b2tlbi4gV2hlbiB0aGVyZSBpcyBubyByZWxldmFudCB0b2tlbiwgdGhlCisJICogcmFuZ2UgaXMgZW1wdHkKKwkgKiAoPGNvZGU+Z2V0RW5kVG9rZW4oKSA9PSBnZXRTdGFydFRva2VuKCk8L2NvZGU+KS4KKwkgKgorCSAqIEByZXR1cm4gY2hhcmFjdGVyIGluZGV4IG9mIHRva2VuIGVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0VG9rZW5FbmQoKSB7CisJCXJldHVybiB0aGlzLnRva2VuRW5kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNoYXJhY3RlciBpbmRpY2VzIG9mIHRoZSBzdWJyYW5nZSBpbiB0aGUKKwkgKiBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUgcmVsZXZhbnQgdG9rZW4gYmVpbmcKKwkgKiBjb21wbGV0ZWQuIFRoaXMgdG9rZW4gaXMgZWl0aGVyIHRoZSBpZGVudGlmaWVyIG9yCisJICogSmF2YSBsYW5ndWFnZSBrZXl3b3JkIHVuZGVyLCBvciBpbW1lZGlhdGVseSBwcmVjZWRpbmcsCisJICogdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0LiBJZiB0aGUgb3JpZ2luYWwgcmVxdWVzdAorCSAqIG9mZnNldCBpcyBub3Qgd2l0aGluIG9yIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGlkZW50aWZpZXIKKwkgKiBvciBrZXl3b3JkLCB0aGVuIHRoZSBzb3VyY2UgcmFuZ2UgYmVnaW5zIGF0IG9yaWdpbmFsCisJICogcmVxdWVzdCBvZmZzZXQgYW5kIGlzIGVtcHR5LgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4IGNoYXJhY3RlciBpbmRleCBvZiB0b2tlbiBzdGFydCBwb3NpdGlvbiAoaW5jbHVzaXZlKQorCSAqIEBwYXJhbSBlbmRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCisJICovCisJcHVibGljIHZvaWQgc2V0VG9rZW5SYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7CisJCWlmIChzdGFydEluZGV4IDwgMCB8fCBlbmRJbmRleCA8IHN0YXJ0SW5kZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLnRva2VuU3RhcnQgPSBzdGFydEluZGV4OworCQl0aGlzLnRva2VuRW5kID0gZW5kSW5kZXg7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvcG9zZWQgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0byBpbnNlcnQgaW50byB0aGUKKwkgKiBzb3VyY2UgZmlsZSBidWZmZXIsIHJlcGxhY2luZyB0aGUgY2hhcmFjdGVycyBhdCB0aGUgc3BlY2lmaWVkCisJICogc291cmNlIHJhbmdlLiBUaGUgc3RyaW5nIGNhbiBiZSBhcmJpdHJhcnk7IGZvciBleGFtcGxlLCBpdCBtaWdodAorCSAqIGluY2x1ZGUgbm90IG9ubHkgdGhlIG5hbWUgb2YgYSBtZXRob2QgYnV0IGEgc2V0IG9mIHBhcmVudGhlc2VzLgorCSAqIDxwPgorCSAqIFRoZSBjbGllbnQgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheSByZXR1cm5lZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb21wbGV0aW9uIHN0cmluZworCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvbigpIHsKKwkJaWYodGhpcy5jb21wbGV0aW9uS2luZCA9PSBNRVRIT0RfREVDTEFSQVRJT04pIHsKKwkJCWZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKTsKKwkJCWlmKHRoaXMudXBkYXRlQ29tcGxldGlvbikgeworCQkJCXRoaXMudXBkYXRlQ29tcGxldGlvbiA9IGZhbHNlOworCisJCQkJaWYodGhpcy5wYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7CisJCQkJCWludCBsZW5ndGggPSB0aGlzLnBhcmFtZXRlck5hbWVzLmxlbmd0aDsKKwkJCQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRpb25CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuY29tcGxldGlvbi5sZW5ndGgpOworCisJCQkJCWludCBzdGFydCA9IDA7CisJCQkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyUnLCB0aGlzLmNvbXBsZXRpb24pOworCisJCQkJCWNvbXBsZXRpb25CdWZmZXIuYXBwZW5kKHRoaXMuY29tcGxldGlvbiwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworCQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKyl7CisJCQkJCQljb21wbGV0aW9uQnVmZmVyLmFwcGVuZCh0aGlzLnBhcmFtZXRlck5hbWVzW2ldKTsKKwkJCQkJCXN0YXJ0ID0gZW5kICsgMTsKKwkJCQkJCWVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignJScsIHRoaXMuY29tcGxldGlvbiwgc3RhcnQpOworCQkJCQkJaWYoZW5kID4gLTEpeworCQkJCQkJCWNvbXBsZXRpb25CdWZmZXIuYXBwZW5kKHRoaXMuY29tcGxldGlvbiwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29tcGxldGlvbkJ1ZmZlci5hcHBlbmQodGhpcy5jb21wbGV0aW9uLCBzdGFydCwgdGhpcy5jb21wbGV0aW9uLmxlbmd0aCAtIHN0YXJ0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpbnQgbmFtZUxlbmd0aCA9IGNvbXBsZXRpb25CdWZmZXIubGVuZ3RoKCk7CisJCQkJCXRoaXMuY29tcGxldGlvbiA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOworCQkJCQljb21wbGV0aW9uQnVmZmVyLmdldENoYXJzKDAsIG5hbWVMZW5ndGgsIHRoaXMuY29tcGxldGlvbiwgMCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmNvbXBsZXRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcHJvcG9zZWQgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0byBpbnNlcnQgaW50byB0aGUKKwkgKiBzb3VyY2UgZmlsZSBidWZmZXIsIHJlcGxhY2luZyB0aGUgY2hhcmFjdGVycyBhdCB0aGUgc3BlY2lmaWVkCisJICogc291cmNlIHJhbmdlLiBUaGUgc3RyaW5nIGNhbiBiZSBhcmJpdHJhcnk7IGZvciBleGFtcGxlLCBpdCBtaWdodAorCSAqIGluY2x1ZGUgbm90IG9ubHkgdGhlIG5hbWUgb2YgYSBtZXRob2QgYnV0IGEgc2V0IG9mIHBhcmVudGhlc2VzLgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGFuIGVtcHR5IGNoYXJhY3RlciBhcnJheS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gY29tcGxldGlvbiB0aGUgY29tcGxldGlvbiBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wbGV0aW9uKGNoYXJbXSBjb21wbGV0aW9uKSB7CisJCXRoaXMuY29tcGxldGlvbiA9IGNvbXBsZXRpb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBzdWJyYW5nZSBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIHRvIGJlIHJlcGxhY2VkCisJICogYnkgdGhlIGNvbXBsZXRpb24gc3RyaW5nLiBJZiB0aGUgc3VicmFuZ2UgaXMgZW1wdHkKKwkgKiAoPGNvZGU+Z2V0UmVwbGFjZUVuZCgpID09IGdldFJlcGxhY2VTdGFydCgpPC9jb2RlPiksCisJICogdGhlIGNvbXBsZXRpb24gc3RyaW5nIGlzIHRvIGJlIGluc2VydGVkIGF0IHRoaXMKKwkgKiBpbmRleC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIHRva2VuIHN1YnJhbmdlIGlzIHByZWNpc2VseQorCSAqIHNwZWNpZmllZCwgdGhlIHJlcGxhY2VtZW50IHJhbmdlIGlzIGxvb3NlbHkKKwkgKiBjb25zdHJhaW5lZCBhbmQgbWF5IG5vdCBiZWFyIGFueSBkaXJlY3QgcmVsYXRpb24KKwkgKiB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQuIEZvciBleGFtcGxlLAorCSAqIGl0IHdvdWxkIGJlIHBvc3NpYmxlIGZvciBhIHR5cGUgY29tcGxldGlvbiB0bworCSAqIHByb3Bvc2UgaW5zZXJ0aW5nIGFuIGltcG9ydCBkZWNsYXJhdGlvbiBhdCB0aGUKKwkgKiB0b3Agb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7IG9yIHRoZSBjb21wbGV0aW9uCisJICogbWlnaHQgaW5jbHVkZSB0cmFpbGluZyBwYXJlbnRoZXNlcyBhbmQKKwkgKiBwdW5jdHVhdGlvbiBmb3IgYSBtZXRob2QgY29tcGxldGlvbi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHJlcGxhY2VtZW50IHN0YXJ0IHBvc2l0aW9uIChpbmNsdXNpdmUpCisJICovCisJcHVibGljIGludCBnZXRSZXBsYWNlU3RhcnQoKSB7CisJCXJldHVybiB0aGlzLnJlcGxhY2VTdGFydDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGVuZCBvZiB0aGUKKwkgKiBzdWJyYW5nZSBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIHRvIGJlIHJlcGxhY2VkCisJICogYnkgdGhlIGNvbXBsZXRpb24gc3RyaW5nLiBJZiB0aGUgc3VicmFuZ2UgaXMgZW1wdHkKKwkgKiAoPGNvZGU+Z2V0UmVwbGFjZUVuZCgpID09IGdldFJlcGxhY2VTdGFydCgpPC9jb2RlPiksCisJICogdGhlIGNvbXBsZXRpb24gc3RyaW5nIGlzIHRvIGJlIGluc2VydGVkIGF0IHRoaXMKKwkgKiBpbmRleC4KKwkgKgorCSAqIEByZXR1cm4gcmVwbGFjZW1lbnQgZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCisJICovCisJcHVibGljIGludCBnZXRSZXBsYWNlRW5kKCkgeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlRW5kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNoYXJhY3RlciBpbmRpY2VzIG9mIHRoZSBzdWJyYW5nZSBpbiB0aGUKKwkgKiBzb3VyY2UgZmlsZSBidWZmZXIgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGNvbXBsZXRpb24KKwkgKiBzdHJpbmcuIElmIHRoZSBzdWJyYW5nZSBpcyBlbXB0eQorCSAqICg8Y29kZT5zdGFydEluZGV4ID09IGVuZEluZGV4PC9jb2RlPiksCisJICogdGhlIGNvbXBsZXRpb24gc3RyaW5nIGlzIHRvIGJlIGluc2VydGVkIGF0IHRoaXMKKwkgKiBpbmRleC4KKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBlbXB0eSBzdWJyYW5nZSBhdCBbMCwwKS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gc3RhcnRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgcmVwbGFjZW1lbnQgc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKKwkgKiBAcGFyYW0gZW5kSW5kZXggY2hhcmFjdGVyIGluZGV4IG9mIHJlcGxhY2VtZW50IGVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VSYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7CisJCWlmIChzdGFydEluZGV4IDwgMCB8fCBlbmRJbmRleCA8IHN0YXJ0SW5kZXgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLnJlcGxhY2VTdGFydCA9IHN0YXJ0SW5kZXg7CisJCXRoaXMucmVwbGFjZUVuZCA9IGVuZEluZGV4OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHJlbGV2YW5jZSByYXRpbmcgb2YgdGhpcyBwcm9wb3NhbC4KKwkgKgorCSAqIEByZXR1cm4gcmVsZXZhbmNlIHJhdGluZyBvZiB0aGlzIHByb3Bvc2FsOyByYXRpbmdzIGFyZSBwb3NpdGl2ZTsgaGlnaGVyIG1lYW5zIGJldHRlcgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVsZXZhbmNlKCkgeworCQlyZXR1cm4gdGhpcy5yZWxldmFuY2U7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmVsYXRpdmUgcmVsZXZhbmNlIHJhdGluZyBvZiB0aGlzIHByb3Bvc2FsLgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIHRoZSBsb3dlc3QgcG9zc2libGUgcmF0aW5nICgxKS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gcmF0aW5nIHJlbGV2YW5jZSByYXRpbmcgb2YgdGhpcyBwcm9wb3NhbDsgcmF0aW5ncyBhcmUgcG9zaXRpdmU7IGhpZ2hlciBtZWFucyBiZXR0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWxldmFuY2UoaW50IHJhdGluZykgeworCQlpZiAocmF0aW5nIDw9IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLnJlbGV2YW5jZSA9IHJhdGluZzsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBvciBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlbGV2YW50CisJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogIDxsaT48Y29kZT5BTk5PVEFUSU9OX0FUVFJJQlVUX1JFRjwvY29kZT4gLSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSBhbm5vdGF0aW9uIHRoYXQgZGVjbGFyZXMgdGhlIGF0dHJpYnV0ZSB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIHN1YmNsYXNzZWQgb3IgaW1wbGVtZW50ZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+RklFTERfSU1QT1JUPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZDwvbGk+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KKwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9JTVBPUlQ8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZDwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZworCSAqIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgorCSAqIAk8bGk+PGNvZGU+UEFDS0FHRV9SRUY8L2NvZGU+IC0gZG90LWJhc2VkIHBhY2thZ2UKKwkgKiBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogCTxsaT48Y29kZT5UWVBFX0lNUE9SVDwvY29kZT4gLSBkb3QtYmFzZWQgcGFja2FnZQorCSAqIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgdHlwZSB0aGF0IGlzIGltcG9ydGVkPC9saT4KKwkgKiAgPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIGRvdC1iYXNlZCBwYWNrYWdlCisJICogbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSB0eXBlIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogIDxsaT48Y29kZT5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5CisJICogcmV0dXJuZWQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBhIHR5cGUgc2lnbmF0dXJlIG9yIGEgcGFja2FnZSBuYW1lIChkZXBlbmRpbmcKKwkgKiBvbiB0aGUga2luZCBvZiBjb21wbGV0aW9uKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgU2lnbmF0dXJlCisJICovCisJcHVibGljIGNoYXJbXSBnZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25TaWduYXR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUga2V5IG9mIHRoZSByZWxldmFudAorCSAqIGRlY2xhcmF0aW9uIGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIDxwPgorCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisJICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0ga2V5CisJICogb2YgdGhlIHR5cGUgdGhhdCBpcyBiZWluZyBzdWJjbGFzc2VkIG9yIGltcGxlbWVudGVkPC9saT4KKwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSBrZXkKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZworCSAqIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgorCSAqIDwvdWw+CisJICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQorCSAqIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gYSBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXIjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKQorICAgICAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldERlY2xhcmF0aW9uS2V5KCkgeworCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbktleTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB0eXBlIG9yIHBhY2thZ2Ugc2lnbmF0dXJlIG9mIHRoZSByZWxldmFudAorCSAqIGRlY2xhcmF0aW9uIGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIG5vbmUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCisJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgdHlwZSBvciBwYWNrYWdlIHNpZ25hdHVyZSwgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb25TaWduYXR1cmUoY2hhcltdIHNpZ25hdHVyZSkgeworCQl0aGlzLmRlY2xhcmF0aW9uU2lnbmF0dXJlID0gc2lnbmF0dXJlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHR5cGUgb3IgcGFja2FnZSBrZXkgb2YgdGhlIHJlbGV2YW50CisJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0ga2V5IHRoZSB0eXBlIG9yIHBhY2thZ2Uga2V5LCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb25LZXkoY2hhcltdIGtleSkgeworCQl0aGlzLmRlY2xhcmF0aW9uS2V5ID0ga2V5OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QsIGZpZWxkLAorCSAqIG1lbWJlciwgb3IgdmFyaWFibGUgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorCSAqIDx1bD4KKwkgKiAgPGxpPjxjb2RlPkFOTk9UQVRJT05fQVRUUklCVVRfUkVGPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGU8L2xpPgorCSAqIAk8bGk+PGNvZGU+RklFTERfSU1QT1JUPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBmaWVsZDwvbGk+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIGZpZWxkPC9saT4KKwkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgZmllbGQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+S0VZV09SRDwvY29kZT4gLSB0aGUga2V5d29yZDwvbGk+CisJICogCTxsaT48Y29kZT5MQUJFTF9SRUY8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIGxhYmVsPC9saT4KKwkgKiAJPGxpPjxjb2RlPkxPQ0FMX1ZBUklBQkxFX1JFRjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGU8L2xpPgorCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0lNUE9SVDwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kPC9saT4KKwkgKiAgPGxpPjxjb2RlPk1FVEhPRF9SRUY8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCAodGhlIHR5cGUgc2ltcGxlIG5hbWUgZm9yIGNvbnN0cnVjdG9yKTwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Q8L2xpPgorCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgKHRoZSB0eXBlIHNpbXBsZSBuYW1lIGZvciBjb25zdHJ1Y3Rvcik8L2xpPgorCSAqIAk8bGk+PGNvZGU+VkFSSUFCTEVfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlPC9saT4KKwkgKiAgPGxpPjxjb2RlPlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZDwvbGk+CisJICogPC91bD4KKwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5CisJICogcmV0dXJuZWQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUga2V5d29yZCwgZmllbGQsIG1ldGhvZCwgbG9jYWwgdmFyaWFibGUsIG9yIG1lbWJlcgorCSAqIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisKKwkvKioKKwkgKiBTZXRzIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kICh0eXBlIHNpbXBsZSBuYW1lIGZvciBjb25zdHJ1Y3RvciksIGZpZWxkLAorCSAqIG1lbWJlciwgb3IgdmFyaWFibGUgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBub25lLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cworCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBrZXl3b3JkLCBmaWVsZCwgbWV0aG9kLCBsb2NhbCB2YXJpYWJsZSwKKwkgKiBvciBtZW1iZXIgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoY2hhcltdIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCBvciB0eXBlCisJICogcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPkFOTk9UQVRJT05fQVRUUklCVVRfUkVGPC9jb2RlPiAtIHRoZSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSdzIHR5cGU8L2xpPgorCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gbWV0aG9kIHNpZ25hdHVyZQorCSAqIG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIGJlaW5nIGludm9rZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+RklFTERfSU1QT1JUPC9jb2RlPiAtIHRoZSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSByZWZlcmVuY2VkIGZpZWxkJ3MgdHlwZTwvbGk+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHJlZmVyZW5jZWQgZmllbGQncyB0eXBlPC9saT4KKwkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSB0aGUgdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgcmVmZXJlbmNlZCBmaWVsZCdzIHR5cGU8L2xpPgorCSAqIAk8bGk+PGNvZGU+TE9DQUxfVkFSSUFCTEVfUkVGPC9jb2RlPiAtIHRoZSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSByZWZlcmVuY2VkIGxvY2FsIHZhcmlhYmxlJ3MgdHlwZTwvbGk+CisJICogCTxsaT48Y29kZT5NRVRIT0RfSU1QT1JUPC9jb2RlPiAtIG1ldGhvZCBzaWduYXR1cmUKKwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgaW1wb3J0ZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSBtZXRob2Qgc2lnbmF0dXJlCisJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSBtZXRob2Qgc2lnbmF0dXJlCisJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIG1ldGhvZCBzaWduYXR1cmUKKwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgaW1wbGVtZW50ZWQgb3Igb3ZlcnJpZGRlbjwvbGk+CisJICogCTxsaT48Y29kZT5UWVBFX0lNUE9SVDwvY29kZT4gLSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSB0eXBlIHRoYXQgaXMgaW1wb3J0ZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+VFlQRV9SRUY8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+VkFSSUFCTEVfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGRlY2xhcmVkPC9saT4KKwkgKiAgPGxpPjxjb2RlPlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gbWV0aG9kIHNpZ25hdHVyZQorCSAqIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucworCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKwkgKiByZXR1cm5lZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlIFNpZ25hdHVyZQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0U2lnbmF0dXJlKCkgeworCQlyZXR1cm4gdGhpcy5zaWduYXR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUga2V5IHJlbGV2YW50IGluIHRoZSBjb250ZXh0LAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjwvY29kZT4gLSBtZXRob2Qga2V5CisJICogb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgYmVpbmcgaW52b2tlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiB0aGUgZGVjbGFyaW5nIHR5cGUgaXMgYW4gaW50ZXJmYWNlPC9saT4KKwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSBtZXRob2Qga2V5CisJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgorCSAqIDwvdWw+CisJICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQorCSAqIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCisgICAgICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0S2V5KCkgeworCQlyZXR1cm4gdGhpcy5rZXk7CisJfQorCisvLwkvKioKKy8vCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVsZXZhbnQKKy8vCSAqIGRlY2xhcmF0aW9uIGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorLy8JICogPHA+CisvLwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorLy8JICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisvLwkgKiA8dWw+CisvLwkgKiA8bGk+PGNvZGU+QU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCisvLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIHN1YmNsYXNzZWQgb3IgaW1wbGVtZW50ZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKKy8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKKy8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKKy8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nCisvLwkgKiBpbXBsZW1lbnRlZCBvciBvdmVycmlkZGVuPC9saT4KKy8vCSAqIDwvdWw+CisvLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKy8vCSAqIHJldHVybmVkLgorLy8JICogPC9wPgorLy8JICoKKy8vCSAqIEByZXR1cm4gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUsIG9yCisvLwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisvLwkgKiBAc2VlICNnZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpCisvLwkgKiBAc2VlICNnZXRTaWduYXR1cmUoKQorLy8JICoKKy8vCSAqIEBzaW5jZSAzLjEKKy8vCSAqLworLy8JcHVibGljIGNoYXJbXSBnZXREZWNsYXJhdGlvblBhY2thZ2VOYW1lKCkgeworLy8JCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uUGFja2FnZU5hbWU7CisvLwl9CisvLworLy8JLyoqCisvLwkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIHJlbGV2YW50CisvLwkgKiBkZWNsYXJhdGlvbiBpbiB0aGUgY29udGV4dCB3aXRob3V0IHRoZSBwYWNrYWdlIGZyYWdtZW50LAorLy8JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKy8vCSAqIDxwPgorLy8JICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKy8vCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorLy8JICogPHVsPgorLy8JICogPGxpPjxjb2RlPkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQorLy8JICogb2YgdGhlIHR5cGUgdGhhdCBpcyBiZWluZyBzdWJjbGFzc2VkIG9yIGltcGxlbWVudGVkPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+RklFTERfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgdHlwZSBuYW1lCisvLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQKKy8vCSAqIG9yIGFuIGFub255bW91cyB0eXBlIGluc3RhbnRpYXRpb24gKCJuZXcgWCgpe30iKSBpZiBpdCBpcyBhbiBhbm9ueW1vdXMgdHlwZTwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKKy8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQKKy8vCSAqIG9yIGFuIGFub255bW91cyB0eXBlIGluc3RhbnRpYXRpb24gKCJuZXcgWCgpe30iKSBpZiBpdCBpcyBhbiBhbm9ueW1vdXMgdHlwZTwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQorLy8JICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcKKy8vCSAqIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgorLy8JICogPC91bD4KKy8vCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucworLy8JICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQorLy8JICogcmV0dXJuZWQuCisvLwkgKiA8L3A+CisvLwkgKgorLy8JICogQHJldHVybiB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZSwgb3IKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKy8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKKy8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCisvLwkgKgorLy8JICogQHNpbmNlIDMuMQorLy8JICovCisvLwlwdWJsaWMgY2hhcltdIGdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSB7CisvLwkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZTsKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWV0aG9kIG9yIHR5cGUKKy8vCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorLy8JICogPHA+CisvLwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorLy8JICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisvLwkgKiA8dWw+CisvLwkgKiAJPGxpPjxjb2RlPkZJRUxEX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQorLy8JICogb2YgdGhlIHJlZmVyZW5jZWQgZmllbGQncyB0eXBlPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+TE9DQUxfVkFSSUFCTEVfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCisvLwkgKiBvZiB0aGUgcmVmZXJlbmNlZCBsb2NhbCB2YXJpYWJsZSdzIHR5cGU8L2xpPgorLy8JICogCTxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtICB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQorLy8JICogb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCisvLwkgKiBvZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGltcGxlbWVudGVkCisvLwkgKiBvciBvdmVycmlkZGVuPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+UEFDS0FHRV9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKKy8vCSAqIG9mIHRoZSBwYWNrYWdlIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCisvLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5WQVJJQUJMRV9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQorLy8JICogb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGRlY2xhcmVkPC9saT4KKy8vCSAqIDwvdWw+CisvLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKy8vCSAqIHJldHVybmVkLgorLy8JICogPC9wPgorLy8JICoKKy8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorLy8JICoKKy8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKKy8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCisvLwkgKgorLy8JICogQHNpbmNlIDMuMQorLy8JICovCisvLwlwdWJsaWMgY2hhcltdIGdldFBhY2thZ2VOYW1lKCkgeworLy8JCXJldHVybiB0aGlzLnBhY2thZ2VOYW1lOworLy8JfQorLy8KKy8vCS8qKgorLy8JICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIHdpdGhvdXQgdGhlIHBhY2thZ2UgZnJhZ21lbnQgb2YgdGhlIG1ldGhvZCBvciB0eXBlCisvLwkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKy8vCSAqIDxwPgorLy8JICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKy8vCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorLy8JICogPHVsPgorLy8JICogCTxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKKy8vCSAqIG9mIHRoZSByZWZlcmVuY2VkIGZpZWxkJ3MgdHlwZTwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPkxPQ0FMX1ZBUklBQkxFX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQorLy8JICogb2YgdGhlIHJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGUncyB0eXBlPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSAgdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKKy8vCSAqIG9mIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQorLy8JICogb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBpbXBsZW1lbnRlZAorLy8JICogb3Igb3ZlcnJpZGRlbjwvbGk+CisvLwkgKiAJPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgdHlwZSBuYW1lCisvLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5WQVJJQUJMRV9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQorLy8JICogb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGRlY2xhcmVkPC9saT4KKy8vCSAqIDwvdWw+CisvLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKy8vCSAqIHJldHVybmVkLgorLy8JICogPC9wPgorLy8JICoKKy8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorLy8JICoKKy8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKKy8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCisvLwkgKgorLy8JICogQHNpbmNlIDMuMQorLy8JICovCisvLwlwdWJsaWMgY2hhcltdIGdldFR5cGVOYW1lKCkgeworLy8JCXJldHVybiB0aGlzLnR5cGVOYW1lOworLy8JfQorLy8KKy8vCS8qKgorLy8JICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHBhY2thZ2UgbmFtZXMgb2YgdGhlIG1ldGhvZAorLy8JICogcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisvLwkgKiA8cD4KKy8vCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisvLwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKy8vCSAqIDx1bD4KKy8vCSAqIAk8bGk+PGNvZGU+QU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHBhcmFtZXRlciBwYWNrYWdlIG5hbWVzCisvLwkgKiBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyBiZWluZyBpbnZva2VkPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSBwYXJhbWV0ZXIgcGFja2FnZSBuYW1lcworLy8JICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gcGFyYW1ldGVyIHBhY2thZ2UgbmFtZXMKKy8vCSAqIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBpbXBsZW1lbnRlZCBvciBvdmVycmlkZGVuPC9saT4KKy8vCSAqIDwvdWw+CisvLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKy8vCSAqIHJldHVybmVkLgorLy8JICogPC9wPgorLy8JICoKKy8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorLy8JICoKKy8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKKy8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCisvLwkgKgorLy8JICogQHNpbmNlIDMuMQorLy8JICovCisvLwlwdWJsaWMgY2hhcltdW10gZ2V0UGFyYW1ldGVyUGFja2FnZU5hbWVzKCkgeworLy8JCXJldHVybiB0aGlzLnBhcmFtZXRlclBhY2thZ2VOYW1lczsKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlIG5hbWVzIHdpdGhvdXQgdGhlIHBhY2thZ2UgZnJhZ21lbnQgb2YKKy8vCSAqIHRoZSBtZXRob2QgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisvLwkgKiA8cD4KKy8vCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisvLwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKy8vCSAqIDx1bD4KKy8vCSAqIAk8bGk+PGNvZGU+QU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHBhcmFtZXRlciB0eXBlIG5hbWVzCisvLwkgKiBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyBiZWluZyBpbnZva2VkPC9saT4KKy8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSBwYXJhbWV0ZXIgdHlwZSBuYW1lcworLy8JICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorLy8JICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gcGFyYW1ldGVyIHR5cGUgbmFtZXMKKy8vCSAqIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBpbXBsZW1lbnRlZCBvciBvdmVycmlkZGVuPC9saT4KKy8vCSAqIDwvdWw+CisvLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKy8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKKy8vCSAqIHJldHVybmVkLgorLy8JICogPC9wPgorLy8JICoKKy8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorLy8JICoKKy8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKKy8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCisvLwkgKgorLy8JICogQHNpbmNlIDMuMQorLy8JICovCisvLwlwdWJsaWMgY2hhcltdW10gZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgeworLy8JCXJldHVybiB0aGlzLnBhcmFtZXRlclR5cGVOYW1lczsKKy8vCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLCBmaWVsZCB0eXBlLCBtZW1iZXIgdHlwZSwKKwkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBub25lLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cworCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHNpZ25hdHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZShjaGFyW10gc2lnbmF0dXJlKSB7CisJCXRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGtleSBvZiB0aGUgbWV0aG9kLCBmaWVsZCB0eXBlLCBtZW1iZXIgdHlwZSwKKwkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBub25lLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cworCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXkoY2hhcltdIGtleSkgeworCQl0aGlzLmtleSA9IGtleTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtb2RpZmllciBmbGFncyByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKKwkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPiBpZiBub25lLgorCSAqIDxwPgorCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisJICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT5BTk5PVEFUSU9OX0FUVFJJQlVUX1JFRjwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyByZWZlcmVuY2VkOworCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KKwkgKiAJPGxpPjxjb2RlPkZJRUxEX0lNUE9SVDwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIG9mIHRoZSBmaWVsZCB0aGF0IGlzIGltcG9ydGVkLjwvbGk+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBvZiB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkOworCSAqIDxjb2RlPkZsYWdzLkFjY0VudW08L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZQorCSAqIHJlZmVyZW5jZXMgdG8gZW51bSBjb25zdGFudHMKKwkgKiA8L2xpPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCisJICogb2YgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZC4KKwkgKiA8L2xpPgorCSAqIAk8bGk+PGNvZGU+S0VZV09SRDwvY29kZT4gLSBtb2RpZmllciBmbGFnCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgbW9kaWZpZXIga2V5d29yZDwvbGk+CisJICogCTxsaT48Y29kZT5MT0NBTF9WQVJJQUJMRV9SRUY8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KKwkgKiAgPGxpPjxjb2RlPk1FVEhPRF9JTVBPUlQ8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgaW1wb3J0ZWQ7CisJICogIDwvbGk+CisJICogCTxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCisJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ7CisJICogPGNvZGU+RmxhZ3MuQWNjQW5ub3RhdGlvbjwvY29kZT4gY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplCisJICogcmVmZXJlbmNlcyB0byBhbm5vdGF0aW9uIHR5cGUgbWVtYmVycworCSAqIDwvbGk+CisJICogPGxpPjxjb2RlPk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZC4KKwkgKiA8L2xpPgorCSAqIDxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKKwkgKiBmb3IgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgorCSAqIDxsaT48Y29kZT5UWVBFX0lNUE9SVDwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIG9mIHRoZSB0eXBlIHRoYXQgaXMgaW1wb3J0ZWQ7IDxjb2RlPkZsYWdzLkFjY0ludGVyZmFjZTwvY29kZT4KKwkgKiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgcmVmZXJlbmNlcyB0byBpbnRlcmZhY2VzLAorCSAqIDxjb2RlPkZsYWdzLkFjY0VudW08L2NvZGU+IGVudW0gdHlwZXMsCisJICogYW5kIDxjb2RlPkZsYWdzLkFjY0Fubm90YXRpb248L2NvZGU+IGFubm90YXRpb24gdHlwZXM8L2xpPgorCSAqIDxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIG9mIHRoZSB0eXBlIHRoYXQgaXMgcmVmZXJlbmNlZDsgPGNvZGU+RmxhZ3MuQWNjSW50ZXJmYWNlPC9jb2RlPgorCSAqIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSByZWZlcmVuY2VzIHRvIGludGVyZmFjZXMsCisJICogPGNvZGU+RmxhZ3MuQWNjRW51bTwvY29kZT4gZW51bSB0eXBlcywKKwkgKiBhbmQgPGNvZGU+RmxhZ3MuQWNjQW5ub3RhdGlvbjwvY29kZT4gYW5ub3RhdGlvbiB0eXBlcworCSAqIDwvbGk+CisJICogCTxsaT48Y29kZT5WQVJJQUJMRV9ERUNMQVJBVElPTjwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIGZvciB0aGUgdmFyaWFibGUgYmVpbmcgZGVjbGFyZWQ8L2xpPgorCSAqIAk8bGk+PGNvZGU+UE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIGZvciB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKiBGb3Igb3RoZXIga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBmbGFncywgb3IKKwkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPiBpZiBub25lCisJICogQHNlZSBGbGFncworCSAqLworCXB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB7CisJCXJldHVybiB0aGlzLmZsYWdzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1vZGlmaWVyIGZsYWdzIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIG5vbmUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCisJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncywgb3IKKwkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7CisJCXRoaXMuZmxhZ3MgPSBmbGFnczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0SGFzTm9QYXJhbWV0ZXJOYW1lc0Zyb21JbmRleChib29sZWFuIGhhc05vUGFyYW1ldGVyTmFtZXNGcm9tSW5kZXgpIHsKKwkJdGhpcy5oYXNOb1BhcmFtZXRlck5hbWVzRnJvbUluZGV4ID0gaGFzTm9QYXJhbWV0ZXJOYW1lc0Zyb21JbmRleDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscy4KKwkgKiBUaGUgcHJvcG9zYWwgY2FuIGJlIGFwcGx5IG9ubHkgaWYgdGhlc2UgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMgYXJlIGFsc28gYXBwbGllZC4KKwkgKiBJZiB0aGUgcmVxdWlyZWQgcHJvcG9zYWwgYXJlbid0IGFwcGxpZWQgdGhlIGNvbXBsZXRpb24gY291bGQgY3JlYXRlIGNvbXBsZXRpb24gcHJvYmxlbXMuCisJICoKKwkgKiA8cD4KKwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorCSAqIDx1bD4KKwkgKiAJPGxpPjxjb2RlPkZJRUxEX1JFRjwvY29kZT4gLSBUaGUgYWxsb3dlZCByZXF1aXJlZCBwcm9wb3NhbHMgZm9yIHRoaXMga2luZCBhcmU6CisJICogICA8dWw+CisJICogICAgPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPjwvbGk+CisJICogICAgPGxpPjxjb2RlPlRZUEVfSU1QT1JUPC9jb2RlPjwvbGk+CisJICogICAgPGxpPjxjb2RlPkZJRUxEX0lNUE9SVDwvY29kZT48L2xpPgorCSAqICAgPC91bD4KKwkgKiA8L2xpPgorCSAqIAk8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSBUaGUgYWxsb3dlZCByZXF1aXJlZCBwcm9wb3NhbHMgZm9yIHRoaXMga2luZCBhcmU6CisJICogICA8dWw+CisJICogICAgPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPjwvbGk+CisJICogICAgPGxpPjxjb2RlPlRZUEVfSU1QT1JUPC9jb2RlPjwvbGk+CisJICogICAgPGxpPjxjb2RlPk1FVEhPRF9JTVBPUlQ8L2NvZGU+PC9saT4KKwkgKiAgIDwvdWw+CisJICogIDwvbGk+CisJICogPC9saT4KKwkgKiAJPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIFRoZSBhbGxvd2VkIHJlcXVpcmVkIHByb3Bvc2FscyBmb3IgdGhpcyBraW5kIGFyZToKKwkgKiAgIDx1bD4KKwkgKiAgICA8bGk+PGNvZGU+VFlQRV9SRUY8L2NvZGU+PC9saT4KKwkgKiAgIDwvdWw+CisJICogIDwvbGk+CisJICogPC91bD4KKwkgKiA8L3A+CisJICogPHA+CisJICogT3RoZXIga2luZHMgb2YgcmVxdWlyZWQgcHJvcG9zYWxzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGZ1dHVyZSwgdGhlcmVmb3JlIGNsaWVudHMgb2YgdGhpcworCSAqIEFQSSBtdXN0IGFsbG93IHdpdGgge0BsaW5rIENvbXBsZXRpb25SZXF1ZXN0b3Ijc2V0QWxsb3dzUmVxdWlyZWRQcm9wb3NhbHMoaW50LCBpbnQsIGJvb2xlYW4pfQorCSAqIG9ubHkga2luZHMgd2hpY2ggYXJlIGluIHRoaXMgbGlzdCB0byBhdm9pZCB1bmV4cGVjdGVkIHJlc3VsdHMgaW4gdGhlIGZ1dHVyZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogQSByZXF1aXJlZCBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgaXMgcHJvcG9zZWQgZXZlbiBpZiB7QGxpbmsgQ29tcGxldGlvblJlcXVlc3RvciNpc0lnbm9yZWQoaW50KX0KKwkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoYXQga2luZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogQSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2FsIGNhbm5vdCBoYXZlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqCisJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LGJvb2xlYW4pCisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIENvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFJlcXVpcmVkUHJvcG9zYWxzKCkgeworCQlyZXR1cm4gdGhpcy5yZXF1aXJlZFByb3Bvc2FsczsKKwl9CisKKworCS8qKgorCSAqIFNldHMgdGhlIGxpc3Qgb2YgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gcHJvcG9zYWxzIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZWRQcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzKSB7CisJCXRoaXMucmVxdWlyZWRQcm9wb3NhbHMgPSBwcm9wb3NhbHM7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgbmFtZXMuCisJICogVGhpcyBpbmZvcm1hdGlvbiBpcyByZWxldmFudCB0byBtZXRob2QgcmVmZXJlbmNlIChhbmQKKwkgKiBtZXRob2QgZGVjbGFyYXRpb24gcHJvcG9zYWxzKS4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIG5vdCBhdmFpbGFibGUgb3Igbm90IHJlbGV2YW50LgorCSAqIDxwPgorCSAqIFRoZSBjbGllbnQgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheSByZXR1cm5lZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogPGI+Tm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZW5zaXZlIHRoaW5nIHRvIGNvbXB1dGUsIHdoaWNoIG1heSByZXF1aXJlCisJICogcGFyc2luZyBKYXZhIHNvdXJjZSBmaWxlcywgZXRjLiBVc2Ugc3BhcmluZ2x5LjwvYj4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBuYW1lcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIG9yIG5vdCBhdmFpbGFibGUgb3Igbm90IHJlbGV2YW50CisJICovCisJcHVibGljIGNoYXJbXVtdIGZpbmRQYXJhbWV0ZXJOYW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKCF0aGlzLnBhcmFtZXRlck5hbWVzQ29tcHV0ZWQpIHsKKwkJCXRoaXMucGFyYW1ldGVyTmFtZXNDb21wdXRlZCA9IHRydWU7CisKKwkJCXN3aXRjaCh0aGlzLmNvbXBsZXRpb25LaW5kKSB7CisJCQkJY2FzZSBBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT046CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKAorCQkJCQkJCQl0aGlzLmRlY2xhcmF0aW9uUGFja2FnZU5hbWUsCisJCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZSwKKwkJCQkJCQkJQ2hhck9wZXJhdGlvbi5sYXN0U2VnbWVudCh0aGlzLmRlY2xhcmF0aW9uVHlwZU5hbWUsICcuJyksCisJCQkJCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyh0aGlzLm9yaWdpbmFsU2lnbmF0dXJlID09IG51bGwgPyB0aGlzLnNpZ25hdHVyZSA6IHRoaXMub3JpZ2luYWxTaWduYXR1cmUpKTsKKwkJCQkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gcHJvdGVjdGlvbiBmb3IgaW52YWxpZCBzaWduYXR1cmUKKwkJCQkJCWlmKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzICE9IG51bGwpIHsKKwkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gIENvbXBsZXRpb25FbmdpbmUuY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT046CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gZmluZENvbnN0cnVjdG9yUGFyYW1ldGVyTmFtZXMoCisJCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25QYWNrYWdlTmFtZSwKKwkJCQkJCQkJdGhpcy5kZWNsYXJhdGlvblR5cGVOYW1lLAorCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZSwgJy4nKSwKKwkJCQkJCQkJU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKHRoaXMub3JpZ2luYWxTaWduYXR1cmUgPT0gbnVsbCA/IHRoaXMuc2lnbmF0dXJlIDogdGhpcy5vcmlnaW5hbFNpZ25hdHVyZSkpOworCQkJCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBwcm90ZWN0aW9uIGZvciBpbnZhbGlkIHNpZ25hdHVyZQorCQkJCQkJaWYodGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMgIT0gbnVsbCkgeworCQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSAgQ29tcGxldGlvbkVuZ2luZS5jcmVhdGVEZWZhdWx0UGFyYW1ldGVyTmFtZXModGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNRVRIT0RfUkVGOgorCQkJCWNhc2UgTUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjoKKwkJCQkJdHJ5IHsKKwkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoCisJCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25QYWNrYWdlTmFtZSwKKwkJCQkJCQkJdGhpcy5kZWNsYXJhdGlvblR5cGVOYW1lLAorCQkJCQkJCQl0aGlzLm5hbWUsCisJCQkJCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyh0aGlzLm9yaWdpbmFsU2lnbmF0dXJlID09IG51bGwgPyB0aGlzLnNpZ25hdHVyZSA6IHRoaXMub3JpZ2luYWxTaWduYXR1cmUpKTsKKwkJCQkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gcHJvdGVjdGlvbiBmb3IgaW52YWxpZCBzaWduYXR1cmUKKwkJCQkJCWlmKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzICE9IG51bGwpIHsKKwkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gIENvbXBsZXRpb25FbmdpbmUuY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ09OU1RSVUNUT1JfSU5WT0NBVElPTjoKKwkJCQkJdHJ5IHsKKwkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBmaW5kQ29uc3RydWN0b3JQYXJhbWV0ZXJOYW1lcygKKwkJCQkJCQkJdGhpcy5kZWNsYXJhdGlvblBhY2thZ2VOYW1lLAorCQkJCQkJCQl0aGlzLmRlY2xhcmF0aW9uVHlwZU5hbWUsCisJCQkJCQkJCXRoaXMubmFtZSwKKwkJCQkJCQkJU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKHRoaXMub3JpZ2luYWxTaWduYXR1cmUgPT0gbnVsbCA/IHRoaXMuc2lnbmF0dXJlIDogdGhpcy5vcmlnaW5hbFNpZ25hdHVyZSkpOworCQkJCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBwcm90ZWN0aW9uIGZvciBpbnZhbGlkIHNpZ25hdHVyZQorCQkJCQkJaWYodGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMgIT0gbnVsbCkgeworCQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSAgQ29tcGxldGlvbkVuZ2luZS5jcmVhdGVEZWZhdWx0UGFyYW1ldGVyTmFtZXModGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNRVRIT0RfREVDTEFSQVRJT046CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKAorCQkJCQkJCQl0aGlzLmRlY2xhcmF0aW9uUGFja2FnZU5hbWUsCisJCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZSwKKwkJCQkJCQkJdGhpcy5uYW1lLAorCQkJCQkJCQlTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXModGhpcy5vcmlnaW5hbFNpZ25hdHVyZSA9PSBudWxsID8gdGhpcy5zaWduYXR1cmUgOiB0aGlzLm9yaWdpbmFsU2lnbmF0dXJlKSk7CisJCQkJCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIHByb3RlY3Rpb24gZm9yIGludmFsaWQgc2lnbmF0dXJlCisJCQkJCQlpZih0aGlzLnBhcmFtZXRlclR5cGVOYW1lcyAhPSBudWxsKSB7CisJCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9ICBDb21wbGV0aW9uRW5naW5lLmNyZWF0ZURlZmF1bHRQYXJhbWV0ZXJOYW1lcyh0aGlzLnBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZih0aGlzLnBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKKwkJCQkJCXRoaXMudXBkYXRlQ29tcGxldGlvbiA9IHRydWU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMucGFyYW1ldGVyTmFtZXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbWV0aG9kIHBhcmFtZXRlciBuYW1lcy4KKwkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHJlbGV2YW50IHRvIG1ldGhvZCByZWZlcmVuY2UgKGFuZAorCSAqIG1ldGhvZCBkZWNsYXJhdGlvbiBwcm9wb3NhbHMpLgorCSAqIDxwPgorCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCisJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJOYW1lcyhjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcykgeworCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gcGFyYW1ldGVyTmFtZXM7CisJCXRoaXMucGFyYW1ldGVyTmFtZXNDb21wdXRlZCA9IHRydWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgcHJvcG9zYWwuCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogCTxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT4gLSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIEZvciB0aGVzZSBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucworCSAqIHtAbGluayBJQWNjZXNzUnVsZSNLX0FDQ0VTU0lCTEV9IG9yIHtAbGluayBJQWNjZXNzUnVsZSNLX0RJU0NPVVJBR0VEfQorCSAqIG9yIHtAbGluayBJQWNjZXNzUnVsZSNLX05PTl9BQ0NFU1NJQkxFfS4KKwkgKiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIHJldHVybiB7QGxpbmsgSUFjY2Vzc1J1bGUjS19BQ0NFU1NJQkxFfS4KKwkgKiA8L3A+CisJICoKKwkgKiBAc2VlIElBY2Nlc3NSdWxlCisJICoKKwkgKiBAcmV0dXJuIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBwcm9wb3NhbAorCSAqCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJpbGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMuYWNjZXNzaWJpbGl0eTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwcm9wb3NhbCBpcyBhIGNvbnN0cnVjdG9yLgorCSAqIDxwPgorCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisJICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgorCSAqIGlmIHRoZSByZWZlcmVuY2VkIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yPC9saT4KKwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KKwkgKiBpZiB0aGUgZGVjbGFyZWQgbWV0aG9kIGlzIGEgY29uc3RydWN0b3I8L2xpPgorCSAqIDwvdWw+CisJICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3Bvc2FsIGlzIGEgY29uc3RydWN0b3IuCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CisJCXJldHVybiB0aGlzLmlzQ29uc3RydWN0b3I7CisJfQorCisJcHJpdmF0ZSBpbnQgcmVjZWl2ZXJTdGFydDsKKwlwcml2YXRlIGludCByZWNlaXZlckVuZDsKKwlwcml2YXRlIGNoYXJbXSByZWNlaXZlclNpZ25hdHVyZTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIG9yIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVsZXZhbnQKKwkgKiByZWNlaXZlciBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorCSAqIDx1bD4KKwkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSB0eXBlIHRoYXQgY2FzdCB0aGUgcmVjZWl2ZXIgb2YgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBjYXN0IHRoZSByZWNlaXZlciBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogPC91bD4KKwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5CisJICogcmV0dXJuZWQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBhIHR5cGUgc2lnbmF0dXJlIG9yIGEgcGFja2FnZSBuYW1lIChkZXBlbmRpbmcKKwkgKiBvbiB0aGUga2luZCBvZiBjb21wbGV0aW9uKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgU2lnbmF0dXJlCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGNoYXJbXSBnZXRSZWNlaXZlclNpZ25hdHVyZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVjZWl2ZXJTaWduYXR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBzdWJyYW5nZSBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisJICogcmVsZXZhbnQgcmVjZWl2ZXIgb2YgdGhlIG1lbWJlciBiZWluZyBjb21wbGV0ZWQuIFRoaXMKKwkgKiByZWNlaXZlciBpcyBhbiBleHByZXNzaW9uLgorCSAqCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+PC9saT4KKwkgKiAgPGxpPjxjb2RlPk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIGNoYXJhY3RlciBpbmRleCBvZiByZWNlaXZlciBzdGFydCBwb3NpdGlvbiAoaW5jbHVzaXZlKQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVjZWl2ZXJTdGFydCgpIHsKKwkJcmV0dXJuIHRoaXMucmVjZWl2ZXJTdGFydDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGVuZCAoZXhjbHVzaXZlKSBvZiB0aGUgc3VicmFuZ2UKKwkgKiBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisJICogcmVsZXZhbnQgcmVjZWl2ZXIgb2YgdGhlIG1lbWJlciBiZWluZyBjb21wbGV0ZWQuCisJICoKKwkgKiAqIDxwPgorCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCisJICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisJICogPHVsPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPjwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+MDwvY29kZT4uCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgcmVjZWl2ZXIgZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGludCBnZXRSZWNlaXZlckVuZCgpIHsKKwkJcmV0dXJuIHRoaXMucmVjZWl2ZXJFbmQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdHlwZSBvciBwYWNrYWdlIHNpZ25hdHVyZSBvZiB0aGUgcmVsZXZhbnQKKwkgKiByZWNlaXZlciBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBub25lLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cworCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHR5cGUgb3IgcGFja2FnZSBzaWduYXR1cmUsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyU2lnbmF0dXJlKGNoYXJbXSBzaWduYXR1cmUpIHsKKwkJdGhpcy5yZWNlaXZlclNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgaW5kaWNlcyBvZiB0aGUgc3VicmFuZ2UgaW4gdGhlCisJICogc291cmNlIGZpbGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHJlY2VpdmVyCisJICogb2YgdGhlIG1lbWJlciBiZWluZyBjb21wbGV0ZWQuCisJICoKKwkgKiA8cD4KKwkgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBlbXB0eSBzdWJyYW5nZSBhdCBbMCwwKS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gc3RhcnRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgcmVjZWl2ZXIgc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKKwkgKiBAcGFyYW0gZW5kSW5kZXggY2hhcmFjdGVyIGluZGV4IG9mIHJlY2VpdmVyIGVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyUmFuZ2UoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgeworCQl0aGlzLnJlY2VpdmVyU3RhcnQgPSBzdGFydEluZGV4OworCQl0aGlzLnJlY2VpdmVyRW5kID0gZW5kSW5kZXg7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZCgnWycpOworCQlzd2l0Y2godGhpcy5jb21wbGV0aW9uS2luZCkgeworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJGSUVMRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCA6CisJCQkJYnVmZmVyLmFwcGVuZCgiS0VZV09SRCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5MQUJFTF9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkxBQkVMX1JFRiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5MT0NBTF9WQVJJQUJMRV9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkxPQ0FMX1ZBUklBQkxFX1JFRiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04gOgorCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9ERUNMQVJBVElPTiIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYodGhpcy5pc0NvbnN0cnVjdG9yKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIjxDT05TVFJVQ1RPUj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmKHRoaXMuaXNDb25zdHJ1Y3RvcikgeworCQkJCQlidWZmZXIuYXBwZW5kKCI8Q09OU1RSVUNUT1I+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRiA6CisJCQkJYnVmZmVyLmFwcGVuZCgiUEFDS0FHRV9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlRZUEVfUkVGIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLlZBUklBQkxFX0RFQ0xBUkFUSU9OIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJWQVJJQUJMRV9ERUNMQVJBVElPTiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJQT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9OQU1FX1JFRkVSRU5DRSA6CisJCQkJYnVmZmVyLmFwcGVuZCgiTUVUSE9EX0lNUE9SVCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5BTk5PVEFUSU9OX0FUVFJJQlVURV9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkFOTk9UQVRJT05fQVRUUklCVVRFX1JFRiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0JMT0NLX1RBRyA6CisJCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19CTE9DS19UQUciKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19JTkxJTkVfVEFHIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJKQVZBRE9DX0lOTElORV9UQUciKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19GSUVMRF9SRUY6CisJCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19GSUVMRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJKQVZBRE9DX01FVEhPRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRiA6CisJCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19UWVBFX1JFRiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1BBUkFNX1JFRiA6CisJCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19QQVJBTV9SRUYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19WQUxVRV9SRUYgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkpBVkFET0NfVkFMVUVfUkVGIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX0lNUE9SVCA6CisJCQkJYnVmZmVyLmFwcGVuZCgiRklFTERfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9JTVBPUlQgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9JTVBPUlQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlRZUEVfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJGSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA6CisJCQkJYnVmZmVyLmFwcGVuZCgiQ09OU1RSVUNUT1JfSU5WT0NBVElPTiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA6CisJCQkJYnVmZmVyLmFwcGVuZCgiQU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJYnVmZmVyLmFwcGVuZCgiUFJPUE9TQUwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiXXtjb21wbGV0aW9uOiIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0aGlzLmNvbXBsZXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLmNvbXBsZXRpb24pOworCQlidWZmZXIuYXBwZW5kKCIsIGRlY2xTaWduOiIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0aGlzLmRlY2xhcmF0aW9uU2lnbmF0dXJlICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQodGhpcy5kZWNsYXJhdGlvblNpZ25hdHVyZSk7CisJCWJ1ZmZlci5hcHBlbmQoIiwgc2lnbjoiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5zaWduYXR1cmUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLnNpZ25hdHVyZSk7CisJCWJ1ZmZlci5hcHBlbmQoIiwgZGVjbEtleToiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5kZWNsYXJhdGlvbktleSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHRoaXMuZGVjbGFyYXRpb25LZXkpOworCQlidWZmZXIuYXBwZW5kKCIsIGtleToiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5rZXkgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLmtleSk7CisJCWJ1ZmZlci5hcHBlbmQoIiwgbmFtZToiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5uYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lKTsKKwkJYnVmZmVyLmFwcGVuZCgiLCByZXBsYWNlOlsiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHRoaXMucmVwbGFjZVN0YXJ0KTsKKwkJYnVmZmVyLmFwcGVuZCgnLCcpOworCQlidWZmZXIuYXBwZW5kKHRoaXMucmVwbGFjZUVuZCk7CisJCWJ1ZmZlci5hcHBlbmQoIl0sIHRva2VuOlsiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHRoaXMudG9rZW5TdGFydCk7CisJCWJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLnRva2VuRW5kKTsKKwkJYnVmZmVyLmFwcGVuZCgiXSwgcmVsZXZhbmNlOiIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQodGhpcy5yZWxldmFuY2UpOworCQlidWZmZXIuYXBwZW5kKCd9Jyk7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5Vc2VEaWFtb25kKENvbXBsZXRpb25Db250ZXh0IGNvcmVDb250ZXh0KSB7CisJCWlmICh0aGlzLmdldEtpbmQoKSAhPSBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKSByZXR1cm4gZmFsc2U7CisJCWlmIChjb3JlQ29udGV4dCBpbnN0YW5jZW9mIEludGVybmFsQ29tcGxldGlvbkNvbnRleHQpIHsKKwkJCUludGVybmFsQ29tcGxldGlvbkNvbnRleHQgaW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCA9IChJbnRlcm5hbENvbXBsZXRpb25Db250ZXh0KSBjb3JlQ29udGV4dDsKKwkJCWlmIChpbnRlcm5hbENvbXBsZXRpb25Db250ZXh0LmV4dGVuZGVkQ29udGV4dCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCQljaGFyW10gbmFtZTEgPSB0aGlzLmRlY2xhcmF0aW9uUGFja2FnZU5hbWU7CisJCQljaGFyW10gbmFtZTIgPSB0aGlzLmRlY2xhcmF0aW9uVHlwZU5hbWU7CisJCQljaGFyW10gZGVjbGFyYXRpb25UeXBlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZTEsIG5hbWUyLCAnLicpOyAgLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUKKwkJCS8vIGV2ZW4gaWYgdGhlIHR5cGUgYXJndW1lbnRzIHVzZWQgaW4gdGhlIG1ldGhvZCBoYXZlIGJlZW4gc3Vic3RpdHV0ZWQsCisJCQkvLyBleHRyYWN0IHRoZSBvcmlnaW5hbCB0eXBlIGFyZ3VtZW50cyBvbmx5LCBzaW5jZSB0aGF0cyB3aGF0IHdlIHdhbnQgdG8gY29tcGFyZSB3aXRoIHRoZSBjbGFzcworCQkJLy8gdHlwZSB2YXJpYWJsZXMgKFN1YnN0aXR1dGlvbiBtaWdodCBoYXZlIGhhcHBlbmVkIHdoZW4gdGhlIGNvbnN0cnVjdG9yIGlzIGNvbWluZyBmcm9tIGFub3RoZXIKKwkJCS8vIENVIGFuZCBub3QgdGhlIGN1cnJlbnQgb25lKS4KKwkJCWNoYXJbXSBzaWduID0gKHRoaXMub3JpZ2luYWxTaWduYXR1cmUgIT0gbnVsbCk/IHRoaXMub3JpZ2luYWxTaWduYXR1cmUgOiBnZXRTaWduYXR1cmUoKTsKKwkJCWlmICghKHNpZ24gPT0gbnVsbCB8fCBzaWduLmxlbmd0aCA8IDIpKSB7CisJCQkJc2lnbiA9IFNpZ25hdHVyZS5yZW1vdmVDYXB0dXJlKHNpZ24pOworCQkJfQorCQkJY2hhcltdW10gdHlwZXM9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhzaWduKTsKKwkJCVN0cmluZ1tdIHBhcmFtVHlwZU5hbWVzPSBuZXcgU3RyaW5nW3R5cGVzLmxlbmd0aF07CisJCQlmb3IgKGludCBpPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlwYXJhbVR5cGVOYW1lc1tpXT0gbmV3IFN0cmluZyhTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZXNbaV0pKTsKKwkJCX0KKwkJCXJldHVybiBpbnRlcm5hbENvbXBsZXRpb25Db250ZXh0LmV4dGVuZGVkQ29udGV4dC5jYW5Vc2VEaWFtb25kKHBhcmFtVHlwZU5hbWVzLGRlY2xhcmF0aW9uVHlwZSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0ludGVybmFsRXh0ZW5kZWRDb21wbGV0aW9uQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JbnRlcm5hbEV4dGVuZGVkQ29tcGxldGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTI5NzdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JbnRlcm5hbEV4dGVuZGVkQ29tcGxldGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDkzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZS5Db21wbGV0aW9uTm9kZURldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25QYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5Bc3Npc3RDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluYXJ5VHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbXBvcnRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW52b2NhdGlvblNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFZhcmlhYmxlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvb2t1cEVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2lnbmF0dXJlV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuT2JqZWN0VmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkxvY2FsVmFyaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOworCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxFeHRlbmRlZENvbXBsZXRpb25Db250ZXh0IHsKKwlwcml2YXRlIHN0YXRpYyBVdGlsLkJpbmRpbmdzVG9Ob2Rlc01hcCBFbXB0eU5vZGVNYXAgPSBuZXcgVXRpbC5CaW5kaW5nc1RvTm9kZXNNYXAoKSB7CisJCXB1YmxpYyBBU1ROb2RlIGdldChCaW5kaW5nIGJpbmRpbmcpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfTsKKworCXByaXZhdGUgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCBjb21wbGV0aW9uQ29udGV4dDsKKworCS8vIHN0YXRpYyBkYXRhCisJcHJpdmF0ZSBJVHlwZVJvb3QgdHlwZVJvb3Q7CisJcHJpdmF0ZSBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKKwlwcml2YXRlIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50OworCXByaXZhdGUgU2NvcGUgYXNzaXN0U2NvcGU7CisJcHJpdmF0ZSBBU1ROb2RlIGFzc2lzdE5vZGU7CisJcHJpdmF0ZSBXb3JraW5nQ29weU93bmVyIG93bmVyOworCisJcHJpdmF0ZSBDb21wbGV0aW9uUGFyc2VyIHBhcnNlcjsKKworCS8vIGNvbXB1dGVkIGRhdGEKKwlwcml2YXRlIGJvb2xlYW4gaGFzQ29tcHV0ZWRWaXNpYmxlRWxlbWVudEJpbmRpbmdzOworCXByaXZhdGUgT2JqZWN0VmVjdG9yIHZpc2libGVMb2NhbFZhcmlhYmxlczsKKwlwcml2YXRlIE9iamVjdFZlY3RvciB2aXNpYmxlRmllbGRzOworCXByaXZhdGUgT2JqZWN0VmVjdG9yIHZpc2libGVNZXRob2RzOworCisJcHJpdmF0ZSBib29sZWFuIGhhc0NvbXB1dGVkRW5jbG9zaW5nSmF2YUVsZW1lbnRzOworCXByaXZhdGUgTWFwIGJpbmRpbmdzVG9IYW5kbGVzOworCXByaXZhdGUgTWFwIG5vZGVzV2l0aFByb2JsZW1zVG9IYW5kbGVzOworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7CisKKwlwdWJsaWMgSW50ZXJuYWxFeHRlbmRlZENvbXBsZXRpb25Db250ZXh0KAorCQkJSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCBjb21wbGV0aW9uQ29udGV4dCwKKwkJCUlUeXBlUm9vdCB0eXBlUm9vdCwKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLAorCQkJTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQsCisJCQlTY29wZSBhc3Npc3RTY29wZSwKKwkJCUFTVE5vZGUgYXNzaXN0Tm9kZSwKKwkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCQlDb21wbGV0aW9uUGFyc2VyIHBhcnNlcikgeworCQl0aGlzLmNvbXBsZXRpb25Db250ZXh0ID0gY29tcGxldGlvbkNvbnRleHQ7CisJCXRoaXMudHlwZVJvb3QgPSB0eXBlUm9vdDsKKwkJdGhpcy5jb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0gbG9va3VwRW52aXJvbm1lbnQ7CisJCXRoaXMuYXNzaXN0U2NvcGUgPSBhc3Npc3RTY29wZTsKKwkJdGhpcy5hc3Npc3ROb2RlID0gYXNzaXN0Tm9kZTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLnBhcnNlciA9IHBhcnNlcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUVuY2xvc2luZ0phdmFFbGVtZW50cygpIHsKKwkJdGhpcy5oYXNDb21wdXRlZEVuY2xvc2luZ0phdmFFbGVtZW50cyA9IHRydWU7CisKKwkJaWYgKHRoaXMudHlwZVJvb3QgPT0gbnVsbCkgcmV0dXJuOworCisJCWlmICh0aGlzLnR5cGVSb290LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkgCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQpdGhpcy50eXBlUm9vdDsKKworCQkJSGFzaE1hcCBoYW5kbGVUb0JpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOworCQkJSGFzaE1hcCBiaW5kaW5nVG9IYW5kbGUgPSBuZXcgSGFzaE1hcCgpOworCQkJSGFzaE1hcCBub2RlV2l0aFByb2JsZW1Ub0hhbmRsZSA9IG5ldyBIYXNoTWFwKCk7CisJCQlIYXNoTWFwIGhhbmRsZVRvSW5mbyA9IG5ldyBIYXNoTWFwKCk7CisKKwkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgaGFuZGxlID0gbmV3IEFzc2lzdENvbXBpbGF0aW9uVW5pdChvcmlnaW5hbCwgdGhpcy5vd25lciwgaGFuZGxlVG9CaW5kaW5nLCBoYW5kbGVUb0luZm8pOworCQkJQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8gaW5mbyA9IG5ldyBDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbygpOworCisJCQloYW5kbGVUb0luZm8ucHV0KGhhbmRsZSwgaW5mbyk7CisKKwkJCUNvbXBsZXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yIHN0cnVjdHVyZVJlcXVlc3RvciA9CisJCQkJbmV3IENvbXBsZXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yKAorCQkJCQkJaGFuZGxlLAorCQkJCQkJaW5mbywKKwkJCQkJCXRoaXMucGFyc2VyLAorCQkJCQkJdGhpcy5hc3Npc3ROb2RlLAorCQkJCQkJaGFuZGxlVG9CaW5kaW5nLAorCQkJCQkJYmluZGluZ1RvSGFuZGxlLAorCQkJCQkJbm9kZVdpdGhQcm9ibGVtVG9IYW5kbGUsCisJCQkJCQloYW5kbGVUb0luZm8pOworCisJCQlDb21wbGV0aW9uRWxlbWVudE5vdGlmaWVyIG5vdGlmaWVyID0KKwkJCQluZXcgQ29tcGxldGlvbkVsZW1lbnROb3RpZmllcigKKwkJCQkJCXN0cnVjdHVyZVJlcXVlc3RvciwKKwkJCQkJCXRydWUsCisJCQkJCQl0aGlzLmFzc2lzdE5vZGUpOworCisJCQlub3RpZmllci5ub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKAorCQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLAorCQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNvdXJjZUVuZCwKKwkJCQkJZmFsc2UsCisJCQkJCXRoaXMucGFyc2VyLnNvdXJjZUVuZHMsCisJCQkJCW5ldyBIYXNoTWFwKCkpOworCisJCQl0aGlzLmJpbmRpbmdzVG9IYW5kbGVzID0gYmluZGluZ1RvSGFuZGxlOworCQkJdGhpcy5ub2Rlc1dpdGhQcm9ibGVtc1RvSGFuZGxlcyA9IG5vZGVXaXRoUHJvYmxlbVRvSGFuZGxlOworCQkJdGhpcy5jb21waWxhdGlvblVuaXQgPSBoYW5kbGU7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcHV0ZVZpc2libGVFbGVtZW50QmluZGluZ3MoKSB7CisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHByZXZpb3VzVW5pdEJlaW5nQ29tcGxldGVkID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQ7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkID0gdGhpcy5jb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKKwkJdHJ5IHsKKwkJCXRoaXMuaGFzQ29tcHV0ZWRWaXNpYmxlRWxlbWVudEJpbmRpbmdzID0gdHJ1ZTsKKwkKKwkJCVNjb3BlIHNjb3BlID0gdGhpcy5hc3Npc3RTY29wZTsKKwkJCUFTVE5vZGUgYXN0Tm9kZSA9IHRoaXMuYXNzaXN0Tm9kZTsKKwkJCWJvb2xlYW4gbm90SW5KYXZhZG9jID0gdGhpcy5jb21wbGV0aW9uQ29udGV4dC5qYXZhZG9jID09IDA7CisJCisJCQl0aGlzLnZpc2libGVMb2NhbFZhcmlhYmxlcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJCXRoaXMudmlzaWJsZUZpZWxkcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJCXRoaXMudmlzaWJsZU1ldGhvZHMgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCisJCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0KCk7CisJCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkvLyBjb21wbGV0aW9uIGlzIGluc2lkZSBhIG1ldGhvZCBib2R5CisJCQkJc2VhcmNoVmlzaWJsZVZhcmlhYmxlc0FuZE1ldGhvZHMoc2NvcGUsIHRoaXMudmlzaWJsZUxvY2FsVmFyaWFibGVzLCB0aGlzLnZpc2libGVGaWVsZHMsIHRoaXMudmlzaWJsZU1ldGhvZHMsIG5vdEluSmF2YWRvYyk7CisJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKwkJCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoZmllbGRzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKKwkJCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgZmllbGRzW2ldOworCQkJCQkJCWlmIChpbml0aWFsaXplci5ibG9jay5zb3VyY2VTdGFydCA8PSBhc3ROb2RlLnNvdXJjZVN0YXJ0ICYmCisJCQkJCQkJCQlhc3ROb2RlLnNvdXJjZVN0YXJ0IDwgaW5pdGlhbGl6ZXIuYm9keUVuZCkgeworCQkJCQkJCQkvLyBjb21wbGV0aW9uIGlzIGluc2lkZSBhbiBpbml0aWFsaXplcgorCQkJCQkJCQlzZWFyY2hWaXNpYmxlVmFyaWFibGVzQW5kTWV0aG9kcyhzY29wZSwgdGhpcy52aXNpYmxlTG9jYWxWYXJpYWJsZXMsIHRoaXMudmlzaWJsZUZpZWxkcywgdGhpcy52aXNpYmxlTWV0aG9kcywgbm90SW5KYXZhZG9jKTsKKwkJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGZpZWxkc1tpXTsJCQkJCQkJCisJCQkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJCQkJCQlib29sZWFuIGlzSW5zaWRlSW5pdGlhbGl6ZXIgPSBmYWxzZTsKKwkJCQkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24uc291cmNlRW5kID4gMCkgeworCQkJCQkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24uc291cmNlU3RhcnQgPD0gYXN0Tm9kZS5zb3VyY2VTdGFydCAmJgorCQkJCQkJCQkJCQlhc3ROb2RlLnNvdXJjZUVuZCA8PSBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCkgeworCQkJCQkJCQkJCS8vIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIKKwkJCQkJCQkJCQlpc0luc2lkZUluaXRpYWxpemVyID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsgLy8gVGhlIHNvdXJjZUVuZCBtYXkgbm90IHlldCBiZSBzZXQKKwkJCQkJCQkJCUNvbXBsZXRpb25Ob2RlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgQ29tcGxldGlvbk5vZGVEZXRlY3Rvcih0aGlzLmFzc2lzdE5vZGUsIGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24pOworCQkJCQkJCQkJaWYgKGRldGVjdG9yLmNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSkgeworCQkJCQkJCQkJCS8vIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIKKwkJCQkJCQkJCQlpc0luc2lkZUluaXRpYWxpemVyID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoaXNJbnNpZGVJbml0aWFsaXplcikgeworCQkJCQkJCQkJc2VhcmNoVmlzaWJsZVZhcmlhYmxlc0FuZE1ldGhvZHMoc2NvcGUsIHRoaXMudmlzaWJsZUxvY2FsVmFyaWFibGVzLCB0aGlzLnZpc2libGVGaWVsZHMsIHRoaXMudmlzaWJsZU1ldGhvZHMsIG5vdEluSmF2YWRvYyk7CisJCQkJCQkJCQkvLyByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHZpc2libGVGaWVsZHMgbGlzdCBiZWNhdXNlIGNvbXBsZXRpb24gaXMgYmVpbmcgYXNrZWQgaW4gaXRzCisJCQkJCQkJCQkvLyBpbnRpYWxpemF0aW9uIGFuZCBzbyB0aGlzIGhhcyBub3QgeWV0IGJlZW4gZGVjbGFyZWQgc3VjY2Vzc2Z1bGx5LgorCQkJCQkJCQkJaWYgKHRoaXMudmlzaWJsZUZpZWxkcy5zaXplID4gMCAmJiB0aGlzLnZpc2libGVGaWVsZHMuY29udGFpbnMoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKSkgeworCQkJCQkJCQkJCXRoaXMudmlzaWJsZUZpZWxkcy5yZW1vdmUoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWludCBjb3VudCA9IDA7CisJCQkJCQkJCQl3aGlsZSAoY291bnQgPCB0aGlzLnZpc2libGVGaWVsZHMuc2l6ZSkgeworCQkJCQkJCQkJCUZpZWxkQmluZGluZyB2aXNpYmxlRmllbGQgPSAoRmllbGRCaW5kaW5nKXRoaXMudmlzaWJsZUZpZWxkcy5lbGVtZW50QXQoY291bnQpOworCQkJCQkJCQkJCWlmICh2aXNpYmxlRmllbGQuaWQgPiBmaWVsZERlY2xhcmF0aW9uLmJpbmRpbmcuaWQpIHsKKwkJCQkJCQkJCQkJdGhpcy52aXNpYmxlRmllbGRzLnJlbW92ZSh2aXNpYmxlRmllbGQpOworCQkJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJY291bnQrKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZmluYWxseSB7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCA9IHByZXZpb3VzVW5pdEJlaW5nQ29tcGxldGVkOworCQl9CisJfQorCisJcHVibGljIElKYXZhRWxlbWVudCBnZXRFbmNsb3NpbmdFbGVtZW50KCkgeworCQl0cnkgeworCQkJaWYgKCF0aGlzLmhhc0NvbXB1dGVkRW5jbG9zaW5nSmF2YUVsZW1lbnRzKSB7CisJCQkJY29tcHV0ZUVuY2xvc2luZ0phdmFFbGVtZW50cygpOworCQkJfQorCQkJaWYgKHRoaXMuY29tcGlsYXRpb25Vbml0ID09IG51bGwpIHJldHVybiBudWxsOworCQkJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQodGhpcy5jb21wbGV0aW9uQ29udGV4dC5vZmZzZXQpOworCQkJcmV0dXJuIGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCA/IHRoaXMuY29tcGlsYXRpb25Vbml0IDogZW5jbG9zaW5nRWxlbWVudDsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWwubG9nKGUsICJDYW5ub3QgY29tcHV0ZSBlbmNsb3NpbmcgZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYmluZGluZykgeworCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsID0gYmluZGluZy5kZWNsYXJhdGlvbjsKKworCQlKYXZhRWxlbWVudCBwYXJlbnQgPSBudWxsOworCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQgPSBiaW5kaW5nLmRlY2xhcmluZ1Njb3BlLnJlZmVyZW5jZUNvbnRleHQoKTsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisJCQlwYXJlbnQgPSB0aGlzLmdldEphdmFFbGVtZW50T2ZDb21waWxhdGlvblVuaXQobWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24peworCQkJLy8gTG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQgaW5zaWRlIGFuIGluaXRpYWxpemVyCisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKworCQkJSmF2YUVsZW1lbnQgdHlwZSA9IHRoaXMuZ2V0SmF2YUVsZW1lbnRPZkNvbXBpbGF0aW9uVW5pdCh0eXBlRGVjbGFyYXRpb24sIHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCXBhcmVudCA9IFV0aWwuZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KGxvY2FsLnNvdXJjZVN0YXJ0LCBsb2NhbC5zb3VyY2VFbmQsIHR5cGUpOworCQl9CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIG5ldyBMb2NhbFZhcmlhYmxlKAorCQkJCXBhcmVudCwKKwkJCQluZXcgU3RyaW5nKGxvY2FsLm5hbWUpLAorCQkJCWxvY2FsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCisJCQkJbG9jYWwuZGVjbGFyYXRpb25Tb3VyY2VFbmQsCisJCQkJbG9jYWwuc291cmNlU3RhcnQsCisJCQkJbG9jYWwuc291cmNlRW5kLAorCQkJCVV0aWwudHlwZVNpZ25hdHVyZShsb2NhbC50eXBlKSwKKwkJCQliaW5kaW5nLmRlY2xhcmF0aW9uLmFubm90YXRpb25zLAorCQkJCWxvY2FsLm1vZGlmaWVycywKKwkJCQlsb2NhbC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLlBBUkFNRVRFUik7CisJfQorCisJcHJpdmF0ZSBKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudE9mQ29tcGlsYXRpb25Vbml0KEJpbmRpbmcgYmluZGluZykgeworCQlpZiAoIXRoaXMuaGFzQ29tcHV0ZWRFbmNsb3NpbmdKYXZhRWxlbWVudHMpIHsKKwkJCWNvbXB1dGVFbmNsb3NpbmdKYXZhRWxlbWVudHMoKTsKKwkJfQorCQlpZiAodGhpcy5iaW5kaW5nc1RvSGFuZGxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChKYXZhRWxlbWVudCl0aGlzLmJpbmRpbmdzVG9IYW5kbGVzLmdldChiaW5kaW5nKTsKKwl9CisKKwlwcml2YXRlIEphdmFFbGVtZW50IGdldEphdmFFbGVtZW50T2ZDb21waWxhdGlvblVuaXQoQVNUTm9kZSBub2RlLCBCaW5kaW5nIGJpbmRpbmcpIHsKKwkJaWYgKCF0aGlzLmhhc0NvbXB1dGVkRW5jbG9zaW5nSmF2YUVsZW1lbnRzKSB7CisJCQljb21wdXRlRW5jbG9zaW5nSmF2YUVsZW1lbnRzKCk7CisJCX0KKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuYmluZGluZ3NUb0hhbmRsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gKEphdmFFbGVtZW50KXRoaXMuYmluZGluZ3NUb0hhbmRsZXMuZ2V0KGJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMubm9kZXNXaXRoUHJvYmxlbXNUb0hhbmRsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gKEphdmFFbGVtZW50KXRoaXMubm9kZXNXaXRoUHJvYmxlbXNUb0hhbmRsZXMuZ2V0KG5vZGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBUeXBlQmluZGluZyBnZXRUeXBlRnJvbVNpZ25hdHVyZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgU2NvcGUgc2NvcGUpIHsKKwkJVHlwZUJpbmRpbmcgYXNzaWduYWJsZVR5cGVCaW5kaW5nID0gbnVsbDsKKworCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CisJCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCA9IHNjb3BlLnJlZmVyZW5jZUNvbnRleHQoKTsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisJCQlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycygpOworCQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgeworCQkJCWludCBsZW5ndGggPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CisJCQkJaW50IGNvdW50ID0gMDsKKwkJCQl0eXBlVmFyaWFibGVzID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWlmICh0eXBlUGFyYW1ldGVyc1tpXS5iaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCXR5cGVWYXJpYWJsZXNbY291bnQrK10gPSB0eXBlUGFyYW1ldGVyc1tpXS5iaW5kaW5nOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGNvdW50ICE9IGxlbmd0aCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVWYXJpYWJsZXMsIDAsIHR5cGVWYXJpYWJsZXMgPSBuZXcgVHlwZVZhcmlhYmxlQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwcmV2aW91c1VuaXRCZWluZ0NvbXBsZXRlZCA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkOworCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCA9IHRoaXMuY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CisJCXRyeSB7CisKKwkJCVNpZ25hdHVyZVdyYXBwZXIgd3JhcHBlciA9IG5ldyBTaWduYXR1cmVXcmFwcGVyKHJlcGxhY2VQYWNrYWdlc0RvdCh0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKKwkJCWFzc2lnbmFibGVUeXBlQmluZGluZyA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHR5cGVWYXJpYWJsZXMsIHRoaXMuYXNzaXN0U2NvcGUuZW5jbG9zaW5nQ2xhc3NTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZywgbnVsbCk7CisJCQlhc3NpZ25hYmxlVHlwZUJpbmRpbmcgPSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZShhc3NpZ25hYmxlVHlwZUJpbmRpbmcsIHRoaXMubG9va3VwRW52aXJvbm1lbnQsIHRydWUpOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCWFzc2lnbmFibGVUeXBlQmluZGluZyA9IG51bGw7CisJCX0gZmluYWxseSB7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCA9IHByZXZpb3VzVW5pdEJlaW5nQ29tcGxldGVkOworCQl9CisJCXJldHVybiBhc3NpZ25hYmxlVHlwZUJpbmRpbmc7CisJfQorCisJcHJpdmF0ZSBjaGFyW10gcmVwbGFjZVBhY2thZ2VzRG90KGNoYXJbXSBzaWduYXR1cmUpIHsKKwkJYm9vbGVhbiByZXBsYWNlID0gdHJ1ZTsKKwkJaW50IGxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXN3aXRjaCAoc2lnbmF0dXJlW2ldKSB7CisJCQkJY2FzZSAnLic6CisJCQkJCWlmIChyZXBsYWNlKSBzaWduYXR1cmVbaV0gPSAnLyc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzwnOgorCQkJCQlyZXBsYWNlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPic6CisJCQkJCXJlcGxhY2UgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNpZ25hdHVyZTsKKwl9CisKKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0VmlzaWJsZUVsZW1lbnRzKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CisJCWlmICh0aGlzLmFzc2lzdFNjb3BlID09IG51bGwpIHJldHVybiBuZXcgSUphdmFFbGVtZW50WzBdOworCisJCWlmICghdGhpcy5oYXNDb21wdXRlZFZpc2libGVFbGVtZW50QmluZGluZ3MpIHsKKwkJCWNvbXB1dGVWaXNpYmxlRWxlbWVudEJpbmRpbmdzKCk7CisJCX0KKworCQlUeXBlQmluZGluZyBhc3NpZ25hYmxlVHlwZUJpbmRpbmcgPSBudWxsOworCQlpZiAodHlwZVNpZ25hdHVyZSAhPSBudWxsKSB7CisJCQlhc3NpZ25hYmxlVHlwZUJpbmRpbmcgPSBnZXRUeXBlRnJvbVNpZ25hdHVyZSh0eXBlU2lnbmF0dXJlLCB0aGlzLmFzc2lzdFNjb3BlKTsKKwkJCWlmIChhc3NpZ25hYmxlVHlwZUJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIG5ldyBJSmF2YUVsZW1lbnRbMF07CisJCX0KKworCQlpbnQgbGVuZ3RoID0gdGhpcy52aXNpYmxlTG9jYWxWYXJpYWJsZXMuc2l6ZSgpICsgdGhpcy52aXNpYmxlRmllbGRzLnNpemUoKSArIHRoaXMudmlzaWJsZU1ldGhvZHMuc2l6ZSgpOworCQlpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgSUphdmFFbGVtZW50WzBdOworCisJCUlKYXZhRWxlbWVudFtdIHJlc3VsdCA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoXTsKKworCQlpbnQgZWxlbWVudENvdW50ID0gMDsKKworCQlpbnQgc2l6ZSA9IHRoaXMudmlzaWJsZUxvY2FsVmFyaWFibGVzLnNpemUoKTsKKwkJaWYgKHNpemUgPiAwKSB7CisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLnZpc2libGVMb2NhbFZhcmlhYmxlcy5lbGVtZW50QXQoaSk7CisJCQkJCWlmIChiaW5kaW5nLnR5cGUgPT0gbnVsbCB8fCAoYXNzaWduYWJsZVR5cGVCaW5kaW5nICE9IG51bGwgJiYgIWJpbmRpbmcudHlwZS5pc0NvbXBhdGlibGVXaXRoKGFzc2lnbmFibGVUeXBlQmluZGluZykpKSBjb250aW51ZSBuZXh0OworCQkJCQlKYXZhRWxlbWVudCBsb2NhbFZhcmlhYmxlID0gZ2V0SmF2YUVsZW1lbnQoYmluZGluZyk7CisJCQkJCWlmIChsb2NhbFZhcmlhYmxlICE9IG51bGwpIHJlc3VsdFtlbGVtZW50Q291bnQrK10gPSBsb2NhbFZhcmlhYmxlOworCQkJCX0gY2F0Y2goQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCS8vIGxvZyB0aGUgZXhjZXB0aW9uIGFuZCBwcm9jZWVkCisJCQkJCVV0aWwubG9nUmVwZWF0ZWRNZXNzYWdlKGUuZ2V0S2V5KCksIGUpOworCQkJCX0KKwkJCX0KKworCQl9CisJCXNpemUgPSB0aGlzLnZpc2libGVGaWVsZHMuc2l6ZSgpOworCQlpZiAoc2l6ZSA+IDApIHsKKwkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXRyeSB7CisJCQkJCUZpZWxkQmluZGluZyBiaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy52aXNpYmxlRmllbGRzLmVsZW1lbnRBdChpKTsKKwkJCQkJaWYgKGFzc2lnbmFibGVUeXBlQmluZGluZyAhPSBudWxsICYmICFiaW5kaW5nLnR5cGUuaXNDb21wYXRpYmxlV2l0aChhc3NpZ25hYmxlVHlwZUJpbmRpbmcpKSBjb250aW51ZSBuZXh0OworCQkJCQlpZiAodGhpcy5hc3Npc3RTY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpKSB7CisJCQkJCQlKYXZhRWxlbWVudCBmaWVsZCA9IGdldEphdmFFbGVtZW50T2ZDb21waWxhdGlvblVuaXQoYmluZGluZyk7CisJCQkJCQlpZiAoZmllbGQgIT0gbnVsbCkgcmVzdWx0W2VsZW1lbnRDb3VudCsrXSA9IGZpZWxkOworCQkJCQl9IGVsc2UgeworCQkJCQkJSmF2YUVsZW1lbnQgZmllbGQgPSBVdGlsLmdldFVucmVzb2x2ZWRKYXZhRWxlbWVudChiaW5kaW5nLCB0aGlzLm93bmVyLCBFbXB0eU5vZGVNYXApOworCQkJCQkJaWYgKGZpZWxkICE9IG51bGwpIHJlc3VsdFtlbGVtZW50Q291bnQrK10gPSBmaWVsZC5yZXNvbHZlZChiaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2goQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCS8vIGxvZyB0aGUgZXhjZXB0aW9uIGFuZCBwcm9jZWVkCisJCQkJCVV0aWwubG9nUmVwZWF0ZWRNZXNzYWdlKGUuZ2V0S2V5KCksIGUpOworCQkJCX0KKwkJCX0KKworCQl9CisJCXNpemUgPSB0aGlzLnZpc2libGVNZXRob2RzLnNpemUoKTsKKwkJaWYgKHNpemUgPiAwKSB7CisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgdGhpcy52aXNpYmxlTWV0aG9kcy5lbGVtZW50QXQoaSk7CisJCQkJCWlmIChhc3NpZ25hYmxlVHlwZUJpbmRpbmcgIT0gbnVsbCAmJiAhYmluZGluZy5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgoYXNzaWduYWJsZVR5cGVCaW5kaW5nKSkgY29udGludWUgbmV4dDsKKwkJCQkJaWYgKHRoaXMuYXNzaXN0U2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSkgeworCQkJCQkJSmF2YUVsZW1lbnQgbWV0aG9kID0gZ2V0SmF2YUVsZW1lbnRPZkNvbXBpbGF0aW9uVW5pdChiaW5kaW5nKTsKKwkJCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgcmVzdWx0W2VsZW1lbnRDb3VudCsrXSA9IG1ldGhvZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUphdmFFbGVtZW50IG1ldGhvZCA9IFV0aWwuZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KGJpbmRpbmcsIHRoaXMub3duZXIsIEVtcHR5Tm9kZU1hcCk7CisJCQkJCQlpZiAobWV0aG9kICE9IG51bGwpIHJlc3VsdFtlbGVtZW50Q291bnQrK10gPSBtZXRob2QucmVzb2x2ZWQoYmluZGluZyk7CisJCQkJCX0KKwkJCQl9IGNhdGNoKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCQkvLyBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcHJvY2VlZAorCQkJCQlVdGlsLmxvZ1JlcGVhdGVkTWVzc2FnZShlLmdldEtleSgpLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZWxlbWVudENvdW50ICE9IHJlc3VsdC5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByZXN1bHQgPSBuZXcgSUphdmFFbGVtZW50W2VsZW1lbnRDb3VudF0sIDAsIGVsZW1lbnRDb3VudCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgdm9pZCBzZWFyY2hWaXNpYmxlRmllbGRzKAorCQkJRmllbGRCaW5kaW5nW10gZmllbGRzLAorCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCQlTY29wZSBzY29wZSwKKwkJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQkJYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzLAorCQkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kLAorCQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kKSB7CisJCU9iamVjdFZlY3RvciBuZXdGaWVsZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJLy8gSW5oZXJpdGVkIGZpZWxkcyB3aGljaCBhcmUgaGlkZGVuIGJ5IHN1YmNsYXNzZXMgYXJlIGZpbHRlcmVkIG91dAorCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKKworCQluZXh0IDogZm9yIChpbnQgZiA9IGZpZWxkcy5sZW5ndGg7IC0tZiA+PSAwOykgeworCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOworCisJCQlpZiAoZmllbGQuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG9ubHlTdGF0aWNGaWVsZHMgJiYgIWZpZWxkLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICghZmllbGQuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0OworCisJCQlmb3IgKGludCBpID0gZmllbGRzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJRmllbGRCaW5kaW5nIG90aGVyRmllbGQgPSAoRmllbGRCaW5kaW5nKSBmaWVsZHNGb3VuZC5lbGVtZW50QXQoaSk7CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkLm5hbWUsIG90aGVyRmllbGQubmFtZSwgdHJ1ZSkpIHsKKwkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaW50IGwgPSBsb2NhbHNGb3VuZC5zaXplOyAtLWwgPj0gMDspIHsKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgbG9jYWxzRm91bmQuZWxlbWVudEF0KGwpOworCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkLm5hbWUsIGxvY2FsLm5hbWUsIHRydWUpKSB7CisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJfQorCisJCQluZXdGaWVsZHNGb3VuZC5hZGQoZmllbGQpOworCQl9CisKKwkJZmllbGRzRm91bmQuYWRkQWxsKG5ld0ZpZWxkc0ZvdW5kKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VhcmNoVmlzaWJsZUZpZWxkcygKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQkJU2NvcGUgc2NvcGUsCisJCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJCWJvb2xlYW4gb25seVN0YXRpY0ZpZWxkcywKKwkJCWJvb2xlYW4gbm90SW5KYXZhZG9jLAorCQkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kLAorCQkJT2JqZWN0VmVjdG9yIGZpZWxkc0ZvdW5kKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsKKwkJaW50IG5leHRQb3NpdGlvbiA9IDA7CisJCWRvIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAobm90SW5KYXZhZG9jICYmIGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgeworCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IGl0c0ludGVyZmFjZXM7CisJCQkJCW5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKKwkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07CisJCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQorCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlRmllbGRzKCk7CisJCQlpZihmaWVsZHMgIT0gbnVsbCAmJiBmaWVsZHMubGVuZ3RoID4gMCkgeworCisJCQkJc2VhcmNoVmlzaWJsZUZpZWxkcygKKwkJCQkJCWZpZWxkcywKKwkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlvbmx5U3RhdGljRmllbGRzLAorCQkJCQkJbG9jYWxzRm91bmQsCisJCQkJCQlmaWVsZHNGb3VuZCk7CisJCQl9CisJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKKwkJfSB3aGlsZSAobm90SW5KYXZhZG9jICYmIGN1cnJlbnRUeXBlICE9IG51bGwpOworCisJCWlmIChub3RJbkphdmFkb2MgJiYgaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBhbkludGVyZmFjZS5hdmFpbGFibGVGaWVsZHMoKTsKKwkJCQlpZihmaWVsZHMgIT0gIG51bGwpIHsKKwkJCQkJc2VhcmNoVmlzaWJsZUZpZWxkcygKKwkJCQkJCQlmaWVsZHMsCisJCQkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQkJCXNjb3BlLAorCQkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJCQlvbmx5U3RhdGljRmllbGRzLAorCQkJCQkJCWxvY2Fsc0ZvdW5kLAorCQkJCQkJCWZpZWxkc0ZvdW5kKTsKKwkJCQl9CisKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOworCQkJCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgbmV4dFBvc2l0aW9uOyBiKyspCisJCQkJCQkJaWYgKG5leHQgPT0gaW50ZXJmYWNlc1RvVmlzaXRbYl0pIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNlYXJjaFZpc2libGVJbnRlcmZhY2VNZXRob2RzKAorCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMsCisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJCVNjb3BlIHNjb3BlLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCkgeworCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXNUb1Zpc2l0ID0gaXRzSW50ZXJmYWNlczsKKwkJCWludCBuZXh0UG9zaXRpb24gPSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGg7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dFBvc2l0aW9uOyBpKyspIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCQkJaWYobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJCXNlYXJjaFZpc2libGVMb2NhbE1ldGhvZHMoCisJCQkJCQkJbWV0aG9kcywKKwkJCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJCW1ldGhvZHNGb3VuZCk7CisJCQkJfQorCisJCQkJaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IG51bGwgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgeworCQkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJCWlmIChuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggPj0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKKwkJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dCA9IGl0c0ludGVyZmFjZXNbYV07CisJCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQorCQkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbmV4dFBvc2l0aW9uKytdID0gbmV4dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZWFyY2hWaXNpYmxlTG9jYWxNZXRob2RzKAorCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsCisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJCVNjb3BlIHNjb3BlLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCkgeworCQlPYmplY3RWZWN0b3IgbmV3TWV0aG9kc0ZvdW5kID0gIG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisKKwkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbZl07CisKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG9ubHlTdGF0aWNNZXRob2RzICYmICFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKCFtZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0OworCisJCQlmb3IgKGludCBpID0gbWV0aG9kc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgeworCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlpZiAobWV0aG9kID09IG90aGVyTWV0aG9kKQorCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgb3RoZXJNZXRob2Quc2VsZWN0b3IsIHRydWUpKSB7CisJCQkJCWlmICh0aGlzLmxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCkuaXNNZXRob2RTdWJzaWduYXR1cmUob3RoZXJNZXRob2QsIG1ldGhvZCkpIHsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCW5ld01ldGhvZHNGb3VuZC5hZGQobWV0aG9kKTsKKwkJfQorCisJCW1ldGhvZHNGb3VuZC5hZGRBbGwobmV3TWV0aG9kc0ZvdW5kKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VhcmNoVmlzaWJsZU1ldGhvZHMoCisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJCVNjb3BlIHNjb3BlLAorCQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQkJYm9vbGVhbiBub3RJbkphdmFkb2MsCisJCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7CisJCWlmIChub3RJbkphdmFkb2MpIHsKKwkJCWlmIChyZWNlaXZlclR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCXNlYXJjaFZpc2libGVJbnRlcmZhY2VNZXRob2RzKAorCQkJCQkJbmV3IFJlZmVyZW5jZUJpbmRpbmdbXXtjdXJyZW50VHlwZX0sCisJCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCQlzY29wZSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJb25seVN0YXRpY01ldGhvZHMsCisJCQkJCQltZXRob2RzRm91bmQpOworCisJCQkJY3VycmVudFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOworCQkJfQorCQl9CisJCWJvb2xlYW4gaGFzUG90ZW50aWFsRGVmYXVsdEFic3RyYWN0TWV0aG9kcyA9IHRydWU7CisJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7CisKKwkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOworCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCXNlYXJjaFZpc2libGVMb2NhbE1ldGhvZHMoCisJCQkJCQltZXRob2RzLAorCQkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQkJc2NvcGUsCisJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJbWV0aG9kc0ZvdW5kKTsKKwkJCX0KKworCQkJaWYgKG5vdEluSmF2YWRvYyAmJgorCQkJCQloYXNQb3RlbnRpYWxEZWZhdWx0QWJzdHJhY3RNZXRob2RzICYmCisJCQkJCShjdXJyZW50VHlwZS5pc0Fic3RyYWN0KCkgfHwKKwkJCQkJCQljdXJyZW50VHlwZS5pc1R5cGVWYXJpYWJsZSgpIHx8CisJCQkJCQkJY3VycmVudFR5cGUuaXNJbnRlcnNlY3Rpb25UeXBlKCkgfHwKKwkJCQkJCQljdXJyZW50VHlwZS5pc0VudW0oKSkpeworCisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiBjdXJyZW50VHlwZS5pc0ludGVyc2VjdGlvblR5cGUoKSkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJc3VwZXJJbnRlcmZhY2VzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpc3VwZXJJbnRlcmZhY2VzW2ldLmNhcHR1cmUoaW52b2NhdGlvblNjb3BlLCBpbnZvY2F0aW9uU2l0ZS5zb3VyY2VFbmQoKSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlzZWFyY2hWaXNpYmxlSW50ZXJmYWNlTWV0aG9kcygKKwkJCQkJCXN1cGVySW50ZXJmYWNlcywKKwkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJCW1ldGhvZHNGb3VuZCk7CisJCQl9IGVsc2UgeworCQkJCWhhc1BvdGVudGlhbERlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBmYWxzZTsKKwkJCX0KKwkJCWlmKGN1cnJlbnRUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgeworCQkJCWN1cnJlbnRUeXBlID0gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpY3VycmVudFR5cGUpLmdlbmVyaWNUeXBlKCkuc3VwZXJjbGFzcygpOworCQkJfSBlbHNlIHsKKwkJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKKwkJCX0KKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgc2VhcmNoVmlzaWJsZVZhcmlhYmxlc0FuZE1ldGhvZHMoCisJCQlTY29wZSBzY29wZSwKKwkJCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwKKwkJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCisJCQlib29sZWFuIG5vdEluSmF2YWRvYykgeworCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlID0gQ29tcGxldGlvbkVuZ2luZS5GYWtlSW52b2NhdGlvblNpdGU7CisKKwkJYm9vbGVhbiBzdGF0aWNzT25seSA9IGZhbHNlOworCQkvLyBuZWVkIHRvIGtub3cgaWYgd2UncmUgaW4gYSBzdGF0aWMgY29udGV4dCAob3IgaW5zaWRlIGEgY29uc3RydWN0b3IpCisKKwkJU2NvcGUgY3VycmVudFNjb3BlID0gc2NvcGU7CisKKwkJZG9uZTEgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisKKwkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKKworCQkJCWNhc2UgU2NvcGUuTUVUSE9EX1NDT1BFIDoKKwkJCQkJLy8gaGFuZGxlIHRoZSBlcnJvciBjYXNlIGluc2lkZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIChzZWUgTWV0aG9kU2NvcGU+PmZpbmRGaWVsZCkKKwkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZTsKKwkJCQkJc3RhdGljc09ubHkgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWMgfCBtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKKwkJCQkJLy8kRkFMTC1USFJPVUdIJAorCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgorCQkJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUgPSAoQmxvY2tTY29wZSkgY3VycmVudFNjb3BlOworCisJCQkJCW5leHQgOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmxvY2tTY29wZS5sb2NhbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gYmxvY2tTY29wZS5sb2NhbHNbaV07CisKKwkJCQkJCWlmIChsb2NhbCA9PSBudWxsKQorCQkJCQkJCWJyZWFrIG5leHQ7CisKKwkJCQkJCWlmIChsb2NhbC5pc1NlY3JldCgpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQkvLyBJZiB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24ncyBpbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgaXRzZWxmIGhhcyB0aGUgY29tcGxldGlvbiwKKwkJCQkJCS8vIHRoZW4gZG9uJ3QgcHJvcG9zZSB0aGUgbG9jYWwgdmFyaWFibGUKKwkJCQkJCWlmIChsb2NhbC5kZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJLyoodXNlIHRoaXMgaWYtZWxzZSBibG9jayBpZiBpdCBpcyBmb3VuZCB0aGF0IGxvY2FsLmRlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGwgaXMgbm90IHN1ZmZpY2llbnQgdG8gCisJCQkJCQkJICBndWFyYW50ZWUgdGhhdCBwcm9wb3NhbCBpcyBiZWluZyBhc2tlZCBpbnNpZGUgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbidzIGluaXRpYWxpemVyKQorCQkJCQkJCSBpZihsb2NhbC5kZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQgPiAwKSB7CisJCQkJCQkJCWlmICh0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kIDw9IGxvY2FsLmRlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZAorCQkJCQkJCQkJCSYmIHRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VTdGFydCA+PSBsb2NhbC5kZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbi5zb3VyY2VTdGFydCkgeworCQkJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCUNvbXBsZXRpb25Ob2RlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgQ29tcGxldGlvbk5vZGVEZXRlY3RvcigKKwkJCQkJCQkJCQl0aGlzLmFzc2lzdE5vZGUsCisJCQkJCQkJCQkJbG9jYWwuZGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24pOworCQkJCQkJCQlpZiAoZGV0ZWN0b3IuY29udGFpbnNDb21wbGV0aW9uTm9kZSgpKSB7CisJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQl9CisJCQkJCQkJfSovCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJCX0KKwkJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgbG9jYWxzRm91bmQuc2l6ZTsgZisrKSB7CisJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgb3RoZXJMb2NhbCA9CisJCQkJCQkJCShMb2NhbFZhcmlhYmxlQmluZGluZykgbG9jYWxzRm91bmQuZWxlbWVudEF0KGYpOworCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhvdGhlckxvY2FsLm5hbWUsIGxvY2FsLm5hbWUsIHRydWUpKQorCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJfQorCisJCQkJCQlsb2NhbHNGb3VuZC5hZGQobG9jYWwpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFIDoKKwkJCQkJYnJlYWsgZG9uZTE7CisJCQl9CisJCQljdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OworCQl9CisKKwkJc3RhdGljc09ubHkgPSBmYWxzZTsKKwkJY3VycmVudFNjb3BlID0gc2NvcGU7CisKKwkJZG9uZTIgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisKKwkJCXN3aXRjaCAoY3VycmVudFNjb3BlLmtpbmQpIHsKKwkJCQljYXNlIFNjb3BlLk1FVEhPRF9TQ09QRSA6CisJCQkJCS8vIGhhbmRsZSB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoc2VlIE1ldGhvZFNjb3BlPj5maW5kRmllbGQpCisJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGU7CisJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgorCQkJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgY3VycmVudFNjb3BlOworCQkJCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisKKwkJCQkJc2VhcmNoVmlzaWJsZUZpZWxkcygKKwkJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJCWNsYXNzU2NvcGUsCisJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJc3RhdGljc09ubHksCisJCQkJCQkJbm90SW5KYXZhZG9jLAorCQkJCQkJCWxvY2Fsc0ZvdW5kLAorCQkJCQkJCWZpZWxkc0ZvdW5kKTsKKworCQkJCQlzZWFyY2hWaXNpYmxlTWV0aG9kcygKKwkJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJCWNsYXNzU2NvcGUsCisJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJc3RhdGljc09ubHksCisJCQkJCQkJbm90SW5KYXZhZG9jLAorCQkJCQkJCW1ldGhvZHNGb3VuZCk7CisKKwkJCQkJc3RhdGljc09ubHkgfD0gZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmUyOworCQkJfQorCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwkJfQorCisJCS8vIHNlYXJjaCBpbiBzdGF0aWMgaW1wb3J0CisJCUltcG9ydEJpbmRpbmdbXSBpbXBvcnRCaW5kaW5ncyA9IHNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuaW1wb3J0czsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRCaW5kaW5ncy5sZW5ndGg7IGkrKykgeworCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gaW1wb3J0QmluZGluZ3NbaV07CisJCQlpZihpbXBvcnRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgJiYgaW1wb3J0QmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJQmluZGluZyBiaW5kaW5nID0gaW1wb3J0QmluZGluZy5yZXNvbHZlZEltcG9ydDsKKwkJCQlpZihiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCWlmKGltcG9ydEJpbmRpbmcub25EZW1hbmQpIHsKKwkJCQkJCWlmKChiaW5kaW5nLmtpbmQoKSAmIEJpbmRpbmcuVFlQRSkgIT0gMCkgeworCQkJCQkJCXNlYXJjaFZpc2libGVGaWVsZHMoCisJCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nLAorCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJc3RhdGljc09ubHksCisJCQkJCQkJCQlub3RJbkphdmFkb2MsCisJCQkJCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJCQkJCWZpZWxkc0ZvdW5kKTsKKworCQkJCQkJCXNlYXJjaFZpc2libGVNZXRob2RzKAorCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZywKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCXN0YXRpY3NPbmx5LAorCQkJCQkJCQkJbm90SW5KYXZhZG9jLAorCQkJCQkJCQkJbWV0aG9kc0ZvdW5kKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLkZJRUxEKSAhPSAwKSB7CisJCQkJCQkJc2VhcmNoVmlzaWJsZUZpZWxkcygKKwkJCQkJCQkJCW5ldyBGaWVsZEJpbmRpbmdbXXsoRmllbGRCaW5kaW5nKWJpbmRpbmd9LAorCQkJCQkJCQkJKChGaWVsZEJpbmRpbmcpYmluZGluZykuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQlzdGF0aWNzT25seSwKKwkJCQkJCQkJCWxvY2Fsc0ZvdW5kLAorCQkJCQkJCQkJZmllbGRzRm91bmQpOworCQkJCQkJfSBlbHNlIGlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLk1FVEhPRCkgIT0gMCkgeworCQkJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChNZXRob2RCaW5kaW5nKWJpbmRpbmc7CisKKwkJCQkJCQlzZWFyY2hWaXNpYmxlTG9jYWxNZXRob2RzKAorCQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRNZXRob2RzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpLAorCQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCXRydWUsCisJCQkJCQkJCQltZXRob2RzRm91bmQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuVXNlRGlhbW9uZChTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcywgY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKKwkJVHlwZUJpbmRpbmcgZ3Vlc3NlZFR5cGUgPSBudWxsOworCQljaGFyW11bXSBjbiA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworCQlTY29wZSBzY29wZSA9IHRoaXMuYXNzaXN0U2NvcGU7CisJCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHJldHVybiBmYWxzZTsKKwkJLy8gSWYgbm8gTEhTIG9yIHJldHVybiB0eXBlIGV4cGVjdGVkLCB0aGVuIHdlIGNhbiBzYWZlbHkgdXNlIGRpYW1vbmQKKwkJY2hhcltdW10gZXhwZWN0ZWRUeXBla2V5cz0gdGhpcy5jb21wbGV0aW9uQ29udGV4dC5nZXRFeHBlY3RlZFR5cGVzS2V5cygpOworCQlpZiAoZXhwZWN0ZWRUeXBla2V5cyA9PSBudWxsIHx8IGV4cGVjdGVkVHlwZWtleXMubGVuZ3RoID09IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJLy8gTmV4dCwgZmluZCBvdXQgd2hldGhlciBhbnkgb2YgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgCisJCS8vIGNsYXNzIHR5cGUgdmFyaWFibGVzLiBJZiB5ZXMsIGRpYW1vbmQgY2Fubm90IGJlIHVzZWQuCisJCVR5cGVSZWZlcmVuY2UgcmVmOworCQlpZiAoY24ubGVuZ3RoID09IDEpIHsKKwkJCXJlZiA9IG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKGNuWzBdLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXJlZiA9IG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNuLG5ldyBsb25nW2NuLmxlbmd0aF0pOworCQl9CisJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgorCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6CisJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJZ3Vlc3NlZFR5cGUgPSByZWYucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpc2NvcGUpOworCQkJCWJyZWFrOworCQl9CisJCWlmIChndWVzc2VkVHlwZSAhPSBudWxsICYmIGd1ZXNzZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCS8vIHRoZSBlcmFzdXJlIG11c3QgYmUgdXNlZCBiZWNhdXNlIGd1ZXNzZWRUeXBlIGNhbiBiZSBhIFJhd1R5cGVCaW5kaW5nCisJCQlndWVzc2VkVHlwZSA9IGd1ZXNzZWRUeXBlLmVyYXN1cmUoKTsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFycyA9IGd1ZXNzZWRUeXBlLnR5cGVWYXJpYWJsZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVWYXJzLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXJhbWV0ZXJUeXBlc1tpXS50b0NoYXJBcnJheSgpLCB0eXBlVmFyc1tqXS5zb3VyY2VOYW1lKSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9NaXNzaW5nVHlwZXNHdWVzc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L01pc3NpbmdUeXBlc0d1ZXNzZXIuamF2YQppbmRleCBmNGZhMTA5Li4wN2ZjZjM2IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L01pc3NpbmdUeXBlc0d1ZXNzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L01pc3NpbmdUeXBlc0d1ZXNzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNywxNyArMzcsMTcgQEAKIAkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCiAJCQkJaW50W10gbWlzc2luZ0VsZW1lbnRzRW5kcywKIAkJCQlib29sZWFuIGhhc1Byb2JsZW1zKTsKLQkJCisKIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvbHV0aW9uQ2xlYW5lciBleHRlbmRzIEFTVFZpc2l0b3IgewogCQlwcml2YXRlIEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgYml0c01hcCA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50KCk7CiAJCXByaXZhdGUgYm9vbGVhbiBmaXJzdENhbGwgPSB0cnVlOwotCQkKKwogCQlwdWJsaWMgUmVzb2x1dGlvbkNsZWFuZXIoKXsKIAkJCXN1cGVyKCk7CiAJCX0KLQkJCisKIAkJcHJpdmF0ZSB2b2lkIGNsZWFuVXAoVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CiAJCQlpZiAodGhpcy5maXJzdENhbGwpIHsKIAkJCQl0aGlzLmJpdHNNYXAucHV0KHR5cGVSZWZlcmVuY2UsIHR5cGVSZWZlcmVuY2UuYml0cyk7CkBAIC01NiwxNyArNTYsMTcgQEAKIAkJCX0KIAkJCXR5cGVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlID0gbnVsbDsKIAkJfQotCQkKKwogCQlwcml2YXRlIHZvaWQgY2xlYW5VcChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CiAJCQl0aGlzLmNsZWFuVXAoKFR5cGVSZWZlcmVuY2UpdHlwZVJlZmVyZW5jZSk7CiAJCQl0eXBlUmVmZXJlbmNlLmJpdHMgJj0gfkFTVE5vZGUuRGlkUmVzb2x2ZTsKIAkJfQotCQkKKwogCQlwcml2YXRlIHZvaWQgY2xlYW5VcChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CiAJCQl0aGlzLmNsZWFuVXAoKFR5cGVSZWZlcmVuY2UpdHlwZVJlZmVyZW5jZSk7CiAJCQl0eXBlUmVmZXJlbmNlLmJpdHMgJj0gfkFTVE5vZGUuRGlkUmVzb2x2ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgdm9pZCBjbGVhblVwKFR5cGVSZWZlcmVuY2UgY29udmVydGVkVHlwZSwgQmxvY2tTY29wZSBzY29wZSkgewogCQkJY29udmVydGVkVHlwZS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQl0aGlzLmZpcnN0Q2FsbCA9IGZhbHNlOwpAQCAtNzYsOTEgKzc2LDkxIEBACiAJCQljb252ZXJ0ZWRUeXBlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCXRoaXMuZmlyc3RDYWxsID0gZmFsc2U7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCQl0aGlzLmNsZWFuVXAoc2luZ2xlVHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcChzaW5nbGVUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KFdpbGRjYXJkIHdpbGRjYXJkLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCQl0aGlzLmNsZWFuVXAod2lsZGNhcmQpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoV2lsZGNhcmQgd2lsZGNhcmQsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcCh3aWxkY2FyZCk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVR5cGVSZWZlcmVuY2UgYXJyYXlUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCQl0aGlzLmNsZWFuVXAoYXJyYXlUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZVJlZmVyZW5jZSBhcnJheVR5cGVSZWZlcmVuY2UsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcChhcnJheVR5cGVSZWZlcmVuY2UpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcChwYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBwYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgewogCQkJdGhpcy5jbGVhblVwKHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgewogCQkJdGhpcy5jbGVhblVwKHF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CiAJCQl0aGlzLmNsZWFuVXAocXVhbGlmaWVkVHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCQl0aGlzLmNsZWFuVXAoYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcChhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJCXRoaXMuY2xlYW5VcChwYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBwYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgewogCQkJdGhpcy5jbGVhblVwKHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKIAl9Ci0JCisKIAlwcml2YXRlIENvbXBsZXRpb25FbmdpbmUuQ29tcGxldGlvblByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5IDsKIAlwcml2YXRlICBTZWFyY2hhYmxlRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50OwotCQorCiAJcHJpdmF0ZSBIYXNoTWFwIHN1YnN0aXR1ZWRUeXBlczsKIAlwcml2YXRlIEhhc2hNYXAgb3JpZ2luYWxUeXBlczsKIAlwcml2YXRlIGludCBjb21iaW5hdGlvbnNDb3VudDsKLQkJCQorCiAJcHVibGljIE1pc3NpbmdUeXBlc0d1ZXNzZXIoQ29tcGxldGlvbkVuZ2luZSBjb21wbGV0aW9uRW5naW5lKSB7CiAJCXRoaXMucHJvYmxlbUZhY3RvcnkgPSBjb21wbGV0aW9uRW5naW5lLnByb2JsZW1GYWN0b3J5OwogCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IGNvbXBsZXRpb25FbmdpbmUubmFtZUVudmlyb25tZW50OwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBjb21wdXRlTWlzc2luZ0VsZW1lbnRzKAogCQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZVtdIHN1YnN0aXR1ZWRUeXBlTm9kZXMsCiAJCQljaGFyW11bXVtdIG9yaWdpbmFsVHlwZU5hbWVzLApAQCAtMTY4LDcgKzE2OCw3IEBACiAJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMsCiAJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNFbmRzKSB7CiAJCWludCBsZW5ndGggPSBzdWJzdGl0dWVkVHlwZU5vZGVzLmxlbmd0aDsKLQkJCisKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJVHlwZVJlZmVyZW5jZSBzdWJzdGl0dWVkVHlwZSA9IHN1YnN0aXR1ZWRUeXBlTm9kZXNbaV07CiAJCQlpZiAoc3Vic3RpdHVlZFR5cGUucmVzb2x2ZWRUeXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKQEAgLTE3OSw3ICsxNzksNyBAQAogCQkJCW1pc3NpbmdFbGVtZW50ID0gZXJhc3VyZTsKIAkJCX0gZWxzZSB7CiAJCQkJaW50IGRlcHRoID0gZXJhc3VyZS5kZXB0aCgpICsgMTsKLQkJCQkKKwogCQkJCWlmIChkZXB0aCA+IGRlcHRoVG9SZW1vdmUpIHsKIAkJCQkJbWlzc2luZ0VsZW1lbnQgPSBlcmFzdXJlLmVuY2xvc2luZ1R5cGVBdChkZXB0aFRvUmVtb3ZlKTsKIAkJCQl9IGVsc2UgewpAQCAtMTk2LDEzICsxOTYsMTMgQEAKIAkJCQkJLy9taXNzaW5nRWxlbWVudCA9IHBhY2thZ2VCaW5kaW5nOwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQltaXNzaW5nRWxlbWVudHNbaV0gPSBtaXNzaW5nRWxlbWVudDsKIAkJCW1pc3NpbmdFbGVtZW50c1N0YXJ0c1tpXSA9IHN1YnN0aXR1ZWRUeXBlLnNvdXJjZVN0YXJ0OwogCQkJbWlzc2luZ0VsZW1lbnRzRW5kc1tpXSA9IHN1YnN0aXR1ZWRUeXBlLnNvdXJjZUVuZCArIDE7Ci0JCQkKKwogCQl9Ci0JCQorCiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMjIwLDcgKzIyMCw3IEBACiAJCQl9IGVsc2UgaWYoKHR5cGVSZWYucmVzb2x2ZWRUeXBlLnByb2JsZW1JZCgpICYgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpICE9IDApIHsKIAkJCQkvLyBvbmx5IHRoZSBmaXJzdCB0b2tlbiBtdXN0IGJlIHJlc29sdmVkCiAJCQkJaWYoKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVSZWYucmVzb2x2ZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpLmNvbXBvdW5kTmFtZS5sZW5ndGggIT0gMSkgcmV0dXJuIG51bGw7Ci0JCQkJCisKIAkJCQljaGFyW11bXSB0eXBlTmFtZSA9IHR5cGVSZWYuZ2V0VHlwZU5hbWUoKTsKIAkJCQljaGFyW11bXVtdIHR5cGVOYW1lcyA9IGZpbmRUeXBlTmFtZXModHlwZU5hbWUpOwogCQkJCWlmKHR5cGVOYW1lcyA9PSBudWxsIHx8IHR5cGVOYW1lcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcml2YXRlIFR5cGVSZWZlcmVuY2UgY29udmVydChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmKSB7CiAJCWlmICh0eXBlUmVmLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CiAJCQlUeXBlUmVmZXJlbmNlW11bXSB0eXBlQXJndW1lbnRzID0gdHlwZVJlZi50eXBlQXJndW1lbnRzOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJCQkJCWlmIChjb252ZXJ0ZWRUeXBlQXJndW1lbnRzW2ldW2pdID09IG51bGwpIHJldHVybiBudWxsOwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlpZiAodHlwZVJlZi5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGNvbnZlcnRlZFR5cGUgPQogCQkJCQluZXcgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCkBAIC0yOTksMTggKzI5OSwxOCBAQAogCQkJfSBlbHNlIGlmKCh0eXBlUmVmLnJlc29sdmVkVHlwZS5wcm9ibGVtSWQoKSAmIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSAhPSAwKSB7CiAJCQkJLy8gb25seSB0aGUgZmlyc3QgdG9rZW4gbXVzdCBiZSByZXNvbHZlZAogCQkJCWlmKCgoUmVmZXJlbmNlQmluZGluZyl0eXBlUmVmLnJlc29sdmVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKS5jb21wb3VuZE5hbWUubGVuZ3RoICE9IDEpIHJldHVybiBudWxsOwotCQkJCQorCiAJCQkJY2hhcltdW10gdHlwZU5hbWUgPSB0eXBlUmVmLmdldFR5cGVOYW1lKCk7CiAJCQkJY2hhcltdW11bXSB0eXBlTmFtZXMgPSBmaW5kVHlwZU5hbWVzKHR5cGVOYW1lKTsKIAkJCQlpZih0eXBlTmFtZXMgPT0gbnVsbCB8fCB0eXBlTmFtZXMubGVuZ3RoID09IDApIHJldHVybiBudWxsOwotCQkJCQorCiAJCQkJVHlwZVJlZmVyZW5jZVtdW10gbmV3Q29udmVydGVkVHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW3R5cGVOYW1lc1swXS5sZW5ndGhdW107CiAJCQkJZm9yIChpbnQgayA9IG5ld0NvbnZlcnRlZFR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMSwgbCA9IGNvbnZlcnRlZFR5cGVBcmd1bWVudHMubGVuZ3RoIC0xOyBrID4gLTEgJiYgbCA+IC0xOykgewogCQkJCQluZXdDb252ZXJ0ZWRUeXBlQXJndW1lbnRzW2tdID0gY29udmVydGVkVHlwZUFyZ3VtZW50c1tsXTsKIAkJCQkJay0tOwogCQkJCQlsLS07CiAJCQkJfQotCQkJCQorCiAJCQkJUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgY29udmVydGVkVHlwZSA9CiAJCQkJCW5ldyBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKIAkJCQkJCQl0eXBlTmFtZXNbMF0sCkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcml2YXRlIFR5cGVSZWZlcmVuY2UgY29udmVydChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmKSB7CiAJCWlmICh0eXBlUmVmLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CiAJCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IHR5cGVSZWYudHlwZUFyZ3VtZW50czsKQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJCWNvbnZlcnRlZFR5cGVBcmd1bWVudHNbaV0gPSBjb252ZXJ0KHR5cGVBcmd1bWVudHNbaV0pOwogCQkJCWlmKGNvbnZlcnRlZFR5cGVBcmd1bWVudHNbaV0gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQl9Ci0JCQkKKwogCQkJaWYgKHR5cGVSZWYucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQlQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBjb252ZXJ0ZWRUeXBlID0KIAkJCQkJbmV3IFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKApAQCAtMzUyLDEwICszNTIsMTAgQEAKIAkJCQljaGFyW11bXSB0eXBlTmFtZSA9IHR5cGVSZWYuZ2V0VHlwZU5hbWUoKTsKIAkJCQljaGFyW11bXVtdIHR5cGVOYW1lcyA9IGZpbmRUeXBlTmFtZXModHlwZU5hbWUpOwogCQkJCWlmKHR5cGVOYW1lcyA9PSBudWxsIHx8IHR5cGVOYW1lcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQkJCisKIAkJCQlUeXBlUmVmZXJlbmNlW11bXSBhbGxDb252ZXJ0ZWRUeXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbdHlwZU5hbWVzWzBdLmxlbmd0aF1bXTsKIAkJCQlhbGxDb252ZXJ0ZWRUeXBlQXJndW1lbnRzW2FsbENvbnZlcnRlZFR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMV0gPSBjb252ZXJ0ZWRUeXBlQXJndW1lbnRzOwotCQkJCQorCiAJCQkJUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgY29udmVydGVkVHlwZSA9CiAJCQkJCW5ldyBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKIAkJCQkJCQl0eXBlTmFtZXNbMF0sCkBAIC0zNzIsNyArMzcyLDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcml2YXRlIFR5cGVSZWZlcmVuY2UgY29udmVydChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWYpIHsKIAkJaWYgKHR5cGVSZWYucmVzb2x2ZWRUeXBlICE9IG51bGwpIHsKIAkJCWlmICh0eXBlUmVmLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CkBAIC0zODMsNyArMzgzLDcgQEAKIAkJCX0gZWxzZSBpZigodHlwZVJlZi5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkgJiBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCkgIT0gMCkgewogCQkJCS8vIG9ubHkgdGhlIGZpcnN0IHRva2VuIG11c3QgYmUgcmVzb2x2ZWQKIAkJCQlpZigoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZVJlZi5yZXNvbHZlZFR5cGUpLmNvbXBvdW5kTmFtZS5sZW5ndGggIT0gMSkgcmV0dXJuIG51bGw7Ci0JCQkJCisKIAkJCQljaGFyW11bXSB0eXBlTmFtZSA9IHR5cGVSZWYuZ2V0VHlwZU5hbWUoKTsKIAkJCQljaGFyW11bXVtdIHR5cGVOYW1lcyA9IGZpbmRUeXBlTmFtZXModHlwZU5hbWUpOwogCQkJCWlmKHR5cGVOYW1lcyA9PSBudWxsIHx8IHR5cGVOYW1lcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CkBAIC0zOTgsNyArMzk4LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcml2YXRlIFR5cGVSZWZlcmVuY2UgY29udmVydChTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYpIHsKIAkJaWYgKHR5cGVSZWYucmVzb2x2ZWRUeXBlICE9IG51bGwpIHsKIAkJCWlmICh0eXBlUmVmLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CkBAIC00MjEsNyArNDIxLDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcml2YXRlIFR5cGVSZWZlcmVuY2UgY29udmVydChUeXBlUmVmZXJlbmNlIHR5cGVSZWYpIHsKIAkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgewogCQkJcmV0dXJuIGNvbnZlcnQoKFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKXR5cGVSZWYpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGNvbnZlcnQoV2lsZGNhcmQgdHlwZVJlZikgewogCQlUeXBlUmVmZXJlbmNlIGJvdW5kID0gdHlwZVJlZi5ib3VuZDsKIAkJVHlwZVJlZmVyZW5jZSBjb252ZXJ0ZWRCb3VuZCA9IG51bGw7CkBAIC00NTQsMTUgKzQ1NCwyOCBAQAogCQljb252ZXJ0ZWRUeXBlLnNvdXJjZUVuZCA9IHR5cGVSZWYuc291cmNlRW5kOwogCQlyZXR1cm4gY29udmVydGVkVHlwZTsKIAl9Ci0JCisKIAlwcml2YXRlIGNoYXJbXVtdW10gZmluZFR5cGVOYW1lcyhjaGFyW11bXSBtaXNzaW5nVHlwZU5hbWUpIHsKIAkJY2hhcltdIG1pc3NpbmdTaW1wbGVOYW1lID0gbWlzc2luZ1R5cGVOYW1lW21pc3NpbmdUeXBlTmFtZS5sZW5ndGggLSAxXTsKIAkJZmluYWwgYm9vbGVhbiBpc1F1YWxpZmllZCA9IG1pc3NpbmdUeXBlTmFtZS5sZW5ndGggPiAxOwotCQlmaW5hbCBjaGFyW10gbWlzc2luZ0Z1bGx5UXVhbGlmaWVkTmFtZSA9IAorCQlmaW5hbCBjaGFyW10gbWlzc2luZ0Z1bGx5UXVhbGlmaWVkTmFtZSA9CiAJCQlpc1F1YWxpZmllZCA/IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChtaXNzaW5nVHlwZU5hbWUsICcuJykgOiBudWxsOwogCQlmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlID0gbmV3IElTZWFyY2hSZXF1ZXN0b3IoKSB7Ci0JCQkKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yKAorCQkJCQlpbnQgbW9kaWZpZXJzLAorCQkJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQkJCWludCBwYXJhbWV0ZXJDb3VudCwKKwkJCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCQkJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQkJCQlpbnQgZXh0cmFGbGFncywKKwkJCQkJU3RyaW5nIHBhdGgsCisJCQkJCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2VzcykgeworCQkJCS8vIGNvbnN0cnVjdG9ycyBhcmVuJ3Qgc2VhcmNoZWQKKwkJCX0KIAkJCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKSB7CiAJCQkJLy8gcGFja2FnZSBhcmVuJ3Qgc2VhcmNoZWQKIAkJCX0KQEAgLTQ3Nyw1MiArNDkwLDUyIEBACiAJCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgZnVsbHlRdWFsaWZpZWROYW1lKTsKIAkJCQlyZXN1bHRzLmFkZChjb21wb3VuZE5hbWUpOwogCQkJfQotCQkKKwogCQl9OwotCQluYW1lRW52aXJvbm1lbnQuZmluZEV4YWN0VHlwZXMobWlzc2luZ1NpbXBsZU5hbWUsIHRydWUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIHN0b3JhZ2UpOworCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kRXhhY3RUeXBlcyhtaXNzaW5nU2ltcGxlTmFtZSwgdHJ1ZSwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgc3RvcmFnZSk7CiAJCWlmKHJlc3VsdHMuc2l6ZSgpID09IDApIHJldHVybiBudWxsOwogCQlyZXR1cm4gKGNoYXJbXVtdW10pcmVzdWx0cy50b0FycmF5KG5ldyBjaGFyW3Jlc3VsdHMuc2l6ZSgpXVswXVswXSk7CiAJfQotCQorCiAJcHJpdmF0ZSBjaGFyW11bXSBnZXRPcmlnaW5hbChUeXBlUmVmZXJlbmNlIHR5cGVSZWYpIHsKIAkJcmV0dXJuIChjaGFyW11bXSl0aGlzLm9yaWdpbmFsVHlwZXMuZ2V0KHR5cGVSZWYpOwogCX0KLQkKKwogCXByaXZhdGUgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZVtdIGdldFN1YnN0aXR1ZWRUeXBlcygpIHsKIAkJU2V0IHR5cGVzID0gdGhpcy5zdWJzdGl0dWVkVHlwZXMua2V5U2V0KCk7CiAJCXJldHVybiAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZVtdKSB0eXBlcy50b0FycmF5KG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlW3R5cGVzLnNpemUoKV0pOwogCX0KLQkKKwogCXByaXZhdGUgY2hhcltdW11bXSBnZXRTdWJzdGl0dXRpb24oVHlwZVJlZmVyZW5jZSB0eXBlUmVmKSB7CiAJCXJldHVybiAoY2hhcltdW11bXSl0aGlzLnN1YnN0aXR1ZWRUeXBlcy5nZXQodHlwZVJlZik7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZ3Vlc3MoVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBTY29wZSBzY29wZSwgR3Vlc3NlZFR5cGVSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CiAJCXRoaXMuc3Vic3RpdHVlZFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5vcmlnaW5hbFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5jb21iaW5hdGlvbnNDb3VudCA9IDE7Ci0JCQorCiAJCVR5cGVSZWZlcmVuY2UgY29udmVydGVkVHlwZSA9IGNvbnZlcnQodHlwZVJlZik7Ci0JCQorCiAJCWlmKGNvbnZlcnRlZFR5cGUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZVtdIHN1YnN0aXR1ZWRUeXBlTm9kZXMgPSB0aGlzLmdldFN1YnN0aXR1ZWRUeXBlcygpOworCisJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2VbXSBzdWJzdGl0dWVkVHlwZU5vZGVzID0gZ2V0U3Vic3RpdHVlZFR5cGVzKCk7CiAJCWludCBsZW5ndGggPSBzdWJzdGl0dWVkVHlwZU5vZGVzLmxlbmd0aDsKLQkJCisKIAkJaW50W10gc3Vic3RpdHV0aW9uc0luZGV4ZXMgPSBuZXcgaW50W3N1YnN0aXR1ZWRUeXBlTm9kZXMubGVuZ3RoXTsKIAkJY2hhcltdW11bXVtdIHN1YnRpdHV0aW9ucyA9IG5ldyBjaGFyW3N1YnN0aXR1ZWRUeXBlTm9kZXMubGVuZ3RoXVtdW11bXTsKIAkJY2hhcltdW11bXSBvcmlnaW5hbFR5cGVOYW1lcyA9IG5ldyBjaGFyW3N1YnN0aXR1ZWRUeXBlTm9kZXMubGVuZ3RoXVtdW107CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RpdHVlZFR5cGVOb2Rlcy5sZW5ndGg7IGkrKykgewotCQkJc3VidGl0dXRpb25zW2ldID0gdGhpcy5nZXRTdWJzdGl0dXRpb24oc3Vic3RpdHVlZFR5cGVOb2Rlc1tpXSk7Ci0JCQlvcmlnaW5hbFR5cGVOYW1lc1tpXSA9IHRoaXMuZ2V0T3JpZ2luYWwoc3Vic3RpdHVlZFR5cGVOb2Rlc1tpXSk7CisJCQlzdWJ0aXR1dGlvbnNbaV0gPSBnZXRTdWJzdGl0dXRpb24oc3Vic3RpdHVlZFR5cGVOb2Rlc1tpXSk7CisJCQlvcmlnaW5hbFR5cGVOYW1lc1tpXSA9IGdldE9yaWdpbmFsKHN1YnN0aXR1ZWRUeXBlTm9kZXNbaV0pOwogCQl9Ci0JCQorCiAJCVJlc29sdXRpb25DbGVhbmVyIHJlc29sdXRpb25DbGVhbmVyID0gbmV3IFJlc29sdXRpb25DbGVhbmVyKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb21iaW5hdGlvbnNDb3VudDsgaSsrKSB7Ci0JCQkKKwogCQkJbmV4dFN1YnN0aXR1dGlvbihzdWJzdGl0dWVkVHlwZU5vZGVzLCBzdWJ0aXR1dGlvbnMsIHN1YnN0aXR1dGlvbnNJbmRleGVzKTsKLQkJCQotCQkJCisKKwogCQkJdGhpcy5wcm9ibGVtRmFjdG9yeS5zdGFydENoZWNraW5nUHJvYmxlbXMoKTsKIAkJCVR5cGVCaW5kaW5nIGd1ZXNzZWRUeXBlID0gbnVsbDsKIAkJCXN3aXRjaCAoc2NvcGUua2luZCkgewpAQCAtNTQyLDcgKzU1NSw3IEBACiAJCQkJCUJpbmRpbmdbXSBtaXNzaW5nRWxlbWVudHMgPSBuZXcgQmluZGluZ1tsZW5ndGhdOwogCQkJCQlpbnRbXSBtaXNzaW5nRWxlbWVudHNTdGFydHMgPSBuZXcgaW50W2xlbmd0aF07CiAJCQkJCWludFtdIG1pc3NpbmdFbGVtZW50c0VuZHMgPSBuZXcgaW50W2xlbmd0aF07Ci0JCQkJCQorCiAJCQkJCWlmKGNvbXB1dGVNaXNzaW5nRWxlbWVudHMoCiAJCQkJCQkJc3Vic3RpdHVlZFR5cGVOb2RlcywKIAkJCQkJCQlvcmlnaW5hbFR5cGVOYW1lcywKQEAgLTU2NSw3ICs1NzgsNyBAQAogCQkJY2hhcltdW11bXVtdIHN1YnRpdHV0aW9ucywKIAkJCWludFtdIHN1YnN0aXR1dGlvbnNJbmRleGVzKSB7CiAJCWludCBsZW5ndGggPSBzdWJzdGl0dWVkVHlwZU5vZGVzLmxlbmd0aDsKLQkJCisKIAkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWlmKHN1YnN0aXR1dGlvbnNJbmRleGVzW2ldIDwgc3VidGl0dXRpb25zW2ldLmxlbmd0aCAtIDEpIHsKIAkJCQlzdWJzdGl0dXRpb25zSW5kZXhlc1tpXSsrOwpAQCAtNTc0LDcgKzU4Nyw3IEBACiAJCQkJc3Vic3RpdHV0aW9uc0luZGV4ZXNbaV0gPSAwOwogCQkJfQogCQl9Ci0JCQorCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IHN1YnN0aXR1ZWRUeXBlTm9kZXNbaV07CiAJCQlxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VucyA9IHN1YnRpdHV0aW9uc1tpXVtzdWJzdGl0dXRpb25zSW5kZXhlc1tpXV07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1JlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9SZWxldmFuY2VDb25zdGFudHMuamF2YQppbmRleCBmMzllYmRjLi5hNWQ2OWI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1JlbGV2YW5jZUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTIgKzExLDIyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0OwogCiBwdWJsaWMgaW50ZXJmYWNlIFJlbGV2YW5jZUNvbnN0YW50cyB7CisKIAkKLQlpbnQgUl9ERUZBVUxUID0gMDsKKwkvKgorCSAqIEltcG9ydGFudDogVGhlIGZvbGxvd2luZyBydWxlcyBtdXN0IGJlIHN0cmljdGx5IGFkaGVyZWQgdG8gd2hpbGUgZGVjbGFyaW5nIG5ldyByZWxldmFuY2UgY29uc3RhbnRzIG9yIG1vZGlmeWluZyB0aGUgZXhpc3Rpbmc6CisJICogMS4gT25lIG9yIG1vcmUgcmVsZXZhbmNlIGNvbnN0YW50cyBhcmUgdXNlZCBpbiBjb21iaW5hdGlvbiB0byBmb3JtIGEgcmVsZXZhbmNlLgorCSAqIDIuIEEgcGFydGljdWxhciByZWxldmFuY2UgY29uc3RhbnQgY2FuIGJlIGFkZGVkIG9ubHkgb25jZSB0byBmb3JtIGEgcmVsZXZhbmNlLgorCSAqIDMuIEEgcmVzdWx0YW50IHJlbGV2YW5jZSAoYWZ0ZXIgY29tYmluaW5nIGFsbCB0aGUgYXBwbGljYWJsZSByZWxldmFuY2UgY29uc3RhbnRzKSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgorCSAqIDQuIFRoZSB2YWx1ZSBvZiBSX0RFRkFVTFQgaXMgbWFpbnRhaW5lZCBhdCBhIHBvc2l0aXZlIHZhbHVlIHN1Y2ggdGhhdCB0aGUgc3VtIG9mIGFsbCB0aGUgbmVnYXRpdmUgcmVsZXZhbmNlIGNvbnN0YW50cworCSAqICAgIGFuZCBSX0RFRkFVTFQgbXVzdCBub3QgYmUgbmVnYXRpdmUuIAorCSAqLworCWludCBSX0RFRkFVTFQgPSA1OwogCWludCBSX0lOVEVSRVNUSU5HID0gNTsKIAlpbnQgUl9DQVNFID0gMTA7CiAJaW50IFJfQ0FNRUxfQ0FTRSA9IDU7CiAJaW50IFJfRVhBQ1RfTkFNRSA9IDQ7CisJaW50IFJfVk9JRCA9IC01OwogCWludCBSX0VYUEVDVEVEX1RZUEUgPSAyMDsKIAlpbnQgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFID0gMzA7CiAJaW50IFJfSU5URVJGQUNFID0gMjA7CkBAIC0yNCw3ICszNCw3IEBACiAJaW50IFJfRU5VTSA9IDIwOwogCWludCBSX0FOTk9UQVRJT04gPSAyMDsKIAlpbnQgUl9FWENFUFRJT04gPSAyMDsKLQlpbnQgUl9FTlVNX0NPTlNUQU5UID0gMjA7CisJaW50IFJfRU5VTV9DT05TVEFOVCA9IDU7CiAJaW50IFJfQUJTVFJBQ1RfTUVUSE9EID0gMjA7CiAJaW50IFJfTk9OX1NUQVRJQyA9IDExOwogCWludCBSX1VOUVVBTElGSUVEID0gMzsKQEAgLTQzLDQgKzUzLDUgQEAKIAlpbnQgUl9OT19QUk9CTEVNUyA9IDE7CiAJaW50IFJfUkVTT0xWRUQgPSAxOwogCWludCBSX1RBUkdFVCA9IDU7CisJaW50IFJfRklOQUwgPSAzOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MzQ2CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9TZWxlY3Rpb25FbmdpbmUuamF2YQppbmRleCBjOTI0ZGIxLi5hNTFkOWJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvU2VsZWN0aW9uRW5naW5lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMjYgKzEwLDUxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZU1hdGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZU1hdGNoUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuT2JqZWN0VmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJpbmFyeVR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU2VhcmNoYWJsZUVudmlyb25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNlbGVjdGlvblJlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGVFbGVtZW50SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guQmFzaWNTZWFyY2hFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLlR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3JXcmFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQVNUTm9kZUZpbmRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkhhc2hTZXRPZkNoYXJBcnJheUFycmF5OwogCiAvKioKICAqIFRoZSBzZWxlY3Rpb24gZW5naW5lIGlzIGludGVuZGVkIHRvIGluZmVyIHRoZSBuYXR1cmUgb2YgYSBzZWxlY3RlZCBuYW1lIGluIHNvbWUKQEAgLTQxLDE5ICs2NiwxMzMgQEAKICAqIHBlcmZvcm1lZCBpbnN0ZWFkLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2VsZWN0aW9uRW5naW5lIGV4dGVuZHMgRW5naW5lIGltcGxlbWVudHMgSVNlYXJjaFJlcXVlc3RvciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIgZXh0ZW5kcyBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlciB7CisJCQorCQljbGFzcyBBY2NlcHRlZFR5cGUgeworCQkJcHVibGljIGludCBtb2RpZmllcnM7CisJCQlwdWJsaWMgY2hhcltdIHBhY2thZ2VOYW1lOworCQkJcHVibGljIGNoYXJbXSBzaW1wbGVUeXBlTmFtZTsKKwkJCXB1YmxpYyBTdHJpbmcgcGF0aDsKKwkJCXB1YmxpYyBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3M7CisJCQkKKwkJCXB1YmxpYyBBY2NlcHRlZFR5cGUoaW50IG1vZGlmaWVycywgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIFN0cmluZyBwYXRoLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3MpIHsKKwkJCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwkJCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJCQkJdGhpcy5zaW1wbGVUeXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lOworCQkJCXRoaXMucGF0aCA9IHBhdGg7CisJCQkJdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7CisJCQl9CisJCX0KKwkJCisJCXByaXZhdGUgSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0UmVmZXJlbmNlczsKKwkJCisJCXByaXZhdGUgYm9vbGVhbiBpbXBvcnRDYWNoZXNOb2RlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwkJcHJpdmF0ZSBJbXBvcnRSZWZlcmVuY2VbXSBvbkRlbWFuZEltcG9ydHNOb2RlQ2FjaGU7CisJCXByaXZhdGUgaW50IG9uRGVtYW5kSW1wb3J0c05vZGVDYWNoZUNvdW50OworCQlwcml2YXRlIGNoYXJbXVtdW10gaW1wb3J0c05vZGVDYWNoZTsKKwkJcHJpdmF0ZSBpbnQgaW1wb3J0c05vZGVDYWNoZUNvdW50OworCQkKKwkJcHJpdmF0ZSBIYXNodGFibGVPZk9iamVjdCBvbkRlbWFuZEZvdW5kID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KCk7CisJCXByaXZhdGUgT2JqZWN0VmVjdG9yIG5vdEltcG9ydGVkRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCQorCQlwdWJsaWMgU2VsZWN0aW9uVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIoVHlwZU5hbWVNYXRjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIEltcG9ydFJlZmVyZW5jZVtdIGltcG9ydFJlZmVyZW5jZXMpIHsKKwkJCXN1cGVyKHJlcXVlc3Rvciwgc2NvcGUpOworCQkJdGhpcy5pbXBvcnRSZWZlcmVuY2VzID0gaW1wb3J0UmVmZXJlbmNlczsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgYWNjZXB0VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzKSB7CisJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA+IDApIHJldHVybjsKKwkJCQorCQkJaWYgKCF0aGlzLmltcG9ydENhY2hlc05vZGVJbml0aWFsaXplZCkgaW5pdGlhbGl6ZUltcG9ydE5vZGVDYWNoZXMoKTsKKwkJCQorCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUsICcuJyk7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbXBvcnRzTm9kZUNhY2hlQ291bnQ7IGkrKykgeworCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSB0aGlzLmltcG9ydHNOb2RlQ2FjaGVbaV07CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGltcG9ydE5hbWVbMF0sIHNpbXBsZVR5cGVOYW1lKSkgeworCQkJCQkKKwkJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW1wb3J0TmFtZVsxXSwgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKKwkJCQkJCXN1cGVyLmFjY2VwdFR5cGUobW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgcGF0aCwgYWNjZXNzKTsKKwkJCQkJfQorCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMub25EZW1hbmRJbXBvcnRzTm9kZUNhY2hlQ291bnQ7IGkrKykgeworCQkJCWNoYXJbXVtdIGltcG9ydE5hbWUgPSB0aGlzLm9uRGVtYW5kSW1wb3J0c05vZGVDYWNoZVtpXS50b2tlbnM7CisJCQkJY2hhcltdIGltcG9ydEZsYXROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydE5hbWUsICcuJyk7CisJCQkJCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGltcG9ydEZsYXROYW1lLCBwYWNrYWdlTmFtZSkpIHsKKwkJCQkJCisJCQkJCXRoaXMub25EZW1hbmRGb3VuZC5wdXQoc2ltcGxlVHlwZU5hbWUsIHNpbXBsZVR5cGVOYW1lKTsKKwkJCQkJc3VwZXIuYWNjZXB0VHlwZShtb2RpZmllcnMsIHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBwYXRoLCBhY2Nlc3MpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJCisJCQkKKwkJCXRoaXMubm90SW1wb3J0ZWRGb3VuZC5hZGQobmV3IEFjY2VwdGVkVHlwZShtb2RpZmllcnMsIHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgcGF0aCwgYWNjZXNzKSk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFjY2VwdE5vdEltcG9ydGVkKCkgeworCQkJaW50IHNpemUgPSB0aGlzLm5vdEltcG9ydGVkRm91bmQuc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlBY2NlcHRlZFR5cGUgYWNjZXB0ZWRUeXBlID0gKEFjY2VwdGVkVHlwZSl0aGlzLm5vdEltcG9ydGVkRm91bmQuZWxlbWVudEF0KGkpOworCQkJCQorCQkJCWlmICh0aGlzLm9uRGVtYW5kRm91bmQuZ2V0KGFjY2VwdGVkVHlwZS5zaW1wbGVUeXBlTmFtZSkgPT0gbnVsbCkgeworCQkJCQlzdXBlci5hY2NlcHRUeXBlKAorCQkJCQkJCWFjY2VwdGVkVHlwZS5tb2RpZmllcnMsCisJCQkJCQkJYWNjZXB0ZWRUeXBlLnBhY2thZ2VOYW1lLAorCQkJCQkJCWFjY2VwdGVkVHlwZS5zaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQludWxsLAorCQkJCQkJCWFjY2VwdGVkVHlwZS5wYXRoLAorCQkJCQkJCWFjY2VwdGVkVHlwZS5hY2Nlc3MpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUltcG9ydE5vZGVDYWNoZXMoKSB7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5pbXBvcnRSZWZlcmVuY2VzID09IG51bGwgPyAwIDogdGhpcy5pbXBvcnRSZWZlcmVuY2VzLmxlbmd0aDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSB0aGlzLmltcG9ydFJlZmVyZW5jZXNbaV07CisJCQkJaWYoKGltcG9ydFJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5PbkRlbWFuZCkgIT0gMCkgeworCQkJCQlpZih0aGlzLm9uRGVtYW5kSW1wb3J0c05vZGVDYWNoZSA9PSBudWxsKSB7CisJCQkJCQl0aGlzLm9uRGVtYW5kSW1wb3J0c05vZGVDYWNoZSA9IG5ldyBJbXBvcnRSZWZlcmVuY2VbbGVuZ3RoIC0gaV07CisJCQkJCX0KKwkJCQkJdGhpcy5vbkRlbWFuZEltcG9ydHNOb2RlQ2FjaGVbdGhpcy5vbkRlbWFuZEltcG9ydHNOb2RlQ2FjaGVDb3VudCsrXSA9CisJCQkJCQlpbXBvcnRSZWZlcmVuY2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYodGhpcy5pbXBvcnRzTm9kZUNhY2hlID09IG51bGwpIHsKKwkJCQkJCXRoaXMuaW1wb3J0c05vZGVDYWNoZSA9IG5ldyBjaGFyW2xlbmd0aCAtIGldW11bXTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJCisJCQkJCXRoaXMuaW1wb3J0c05vZGVDYWNoZVt0aGlzLmltcG9ydHNOb2RlQ2FjaGVDb3VudCsrXSA9IG5ldyBjaGFyW11bXXsKKwkJCQkJCQlpbXBvcnRSZWZlcmVuY2UudG9rZW5zW2ltcG9ydFJlZmVyZW5jZS50b2tlbnMubGVuZ3RoIC0gMV0sCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZmVyZW5jZS50b2tlbnMsICcuJykKKwkJCQkJCX07CisJCQkJfQorCQkJfQorCQkJCisJCQl0aGlzLmltcG9ydENhY2hlc05vZGVJbml0aWFsaXplZCA9IHRydWU7CisJCX0KKwl9CiAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUEVSRiA9IGZhbHNlOwotCQorCiAJU2VsZWN0aW9uUGFyc2VyIHBhcnNlcjsKIAlJU2VsZWN0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcjsKKwlXb3JraW5nQ29weU93bmVyIG93bmVyOwogCiAJYm9vbGVhbiBhY2NlcHRlZEFuc3dlcjsKIAogCXByaXZhdGUgaW50IGFjdHVhbFNlbGVjdGlvblN0YXJ0OwogCXByaXZhdGUgaW50IGFjdHVhbFNlbGVjdGlvbkVuZDsKIAlwcml2YXRlIGNoYXJbXSBzZWxlY3RlZElkZW50aWZpZXI7Ci0JCisKIAlwcml2YXRlIGNoYXJbXVtdW10gYWNjZXB0ZWRDbGFzc2VzOwogCXByaXZhdGUgaW50W10gYWNjZXB0ZWRDbGFzc2VzTW9kaWZpZXJzOwogCXByaXZhdGUgY2hhcltdW11bXSBhY2NlcHRlZEludGVyZmFjZXM7CkBAIC02Niw3ICsyMDUsNyBAQAogCWludCBhY2NlcHRlZEludGVyZmFjZXNDb3VudDsKIAlpbnQgYWNjZXB0ZWRFbnVtc0NvdW50OwogCWludCBhY2NlcHRlZEFubm90YXRpb25zQ291bnQ7Ci0JCisKIAlib29sZWFuIG5vUHJvcG9zYWwgPSB0cnVlOwogCUNhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtID0gbnVsbDsKIApAQCAtODEsNyArMjIwLDcgQEAKIAkgKiAgICAgIGJhc2VkIG9uIHBhcnRpYWwgbmFtZXMuCiAJICoKIAkgKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VsZWN0aW9uUmVxdWVzdG9yCi0JICogICAgICBzaW5jZSB0aGUgZW5naW5lIG1pZ2h0IHByb2R1Y2UgYW5zd2VycyBvZiB2YXJpb3VzIGZvcm1zLCB0aGUgZW5naW5lIAorCSAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZQogCSAqICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVxdWVzdG9yIGFibGUgdG8gYWNjZXB0IGFsbCBwb3NzaWJsZSBjb21wbGV0aW9ucy4KIAkgKgogCSAqICBAcGFyYW0gc2V0dGluZ3MgamF2YS51dGlsLk1hcApAQCAtOTAsNyArMjI5LDggQEAKIAlwdWJsaWMgU2VsZWN0aW9uRW5naW5lKAogCQlTZWFyY2hhYmxlRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50LAogCQlJU2VsZWN0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwKLQkJTWFwIHNldHRpbmdzKSB7CisJCU1hcCBzZXR0aW5ncywKKwkJV29ya2luZ0NvcHlPd25lciBvd25lcikgewogCiAJCXN1cGVyKHNldHRpbmdzKTsKIApAQCAtMTAyLDcgKzI0Miw3IEBACiAJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksCiAJCQkJdGhpcy5jb21waWxlck9wdGlvbnMsCiAJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSkgewotCQkJCQkKKwogCQkJcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAogCQkJCWNoYXJbXSBmaWxlTmFtZSwKIAkJCQlpbnQgcHJvYmxlbUlkLApAQCAtMTMzLDYgKzI3MywyMiBAQAogCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0KIAkJCW5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpOwogCQl0aGlzLnBhcnNlciA9IG5ldyBTZWxlY3Rpb25QYXJzZXIocHJvYmxlbVJlcG9ydGVyKTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvcigKKwkJCWludCBtb2RpZmllcnMsCisJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQlpbnQgcGFyYW1ldGVyQ291bnQsCisJCQljaGFyW10gc2lnbmF0dXJlLAorCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJCWludCB0eXBlTW9kaWZpZXJzLAorCQkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQkJaW50IGV4dHJhRmxhZ3MsCisJCQlTdHJpbmcgcGF0aCwKKwkJCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2VzcykgeworCQkvLyBjb25zdHJ1Y3RvcnMgYXJlbid0IHNlYXJjaGVkCiAJfQogCiAJcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBpbnQgbW9kaWZpZXJzLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbikgewpAQCAtMTQyLDcgKzI5OCw3IEBACiAJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpLAogCQkJCQkJc2ltcGxlVHlwZU5hbWUsCiAJCQkJCQknLicpOwotCQkKKwogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2ltcGxlVHlwZU5hbWUsIHRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyKSkgewogCQkJY2hhcltdIGZsYXRFbmNsb3NpbmdUeXBlTmFtZXMgPQogCQkJCWVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsIHx8IGVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGggPT0gMCA/CkBAIC0xNTcsNyArMzEzLDcgQEAKIAkJCQkJCWNoYXJbXVtdIGFjY2VwdGVkQW5ub3RhdGlvbiA9IG5ldyBjaGFyWzJdW107CiAJCQkJCQlhY2NlcHRlZEFubm90YXRpb25bMF0gPSBwYWNrYWdlTmFtZTsKIAkJCQkJCWFjY2VwdGVkQW5ub3RhdGlvblsxXSA9IHR5cGVOYW1lOwotCQkJCQkJCisKIAkJCQkJCWlmKHRoaXMuYWNjZXB0ZWRBbm5vdGF0aW9ucyA9PSBudWxsKSB7CiAJCQkJCQkJdGhpcy5hY2NlcHRlZEFubm90YXRpb25zID0gbmV3IGNoYXJbMTBdW11bXTsKIAkJCQkJCQl0aGlzLmFjY2VwdGVkQW5ub3RhdGlvbnNNb2RpZmllcnMgPSBuZXcgaW50WzEwXTsKQEAgLTE3Niw3ICszMzIsNyBAQAogCQkJCQkJY2hhcltdW10gYWNjZXB0ZWRFbnVtID0gbmV3IGNoYXJbMl1bXTsKIAkJCQkJCWFjY2VwdGVkRW51bVswXSA9IHBhY2thZ2VOYW1lOwogCQkJCQkJYWNjZXB0ZWRFbnVtWzFdID0gdHlwZU5hbWU7Ci0JCQkJCQkKKwogCQkJCQkJaWYodGhpcy5hY2NlcHRlZEVudW1zID09IG51bGwpIHsKIAkJCQkJCQl0aGlzLmFjY2VwdGVkRW51bXMgPSBuZXcgY2hhclsxMF1bXVtdOwogCQkJCQkJCXRoaXMuYWNjZXB0ZWRFbnVtc01vZGlmaWVycyA9IG5ldyBpbnRbMTBdOwpAQCAtMTk1LDcgKzM1MSw3IEBACiAJCQkJCQljaGFyW11bXSBhY2NlcHRlZEludGVyZmFjZT0gbmV3IGNoYXJbMl1bXTsKIAkJCQkJCWFjY2VwdGVkSW50ZXJmYWNlWzBdID0gcGFja2FnZU5hbWU7CiAJCQkJCQlhY2NlcHRlZEludGVyZmFjZVsxXSA9IHR5cGVOYW1lOwotCQkJCQkJCisKIAkJCQkJCWlmKHRoaXMuYWNjZXB0ZWRJbnRlcmZhY2VzID09IG51bGwpIHsKIAkJCQkJCQl0aGlzLmFjY2VwdGVkSW50ZXJmYWNlcyA9IG5ldyBjaGFyWzEwXVtdW107CiAJCQkJCQkJdGhpcy5hY2NlcHRlZEludGVyZmFjZXNNb2RpZmllcnMgPSBuZXcgaW50WzEwXTsKQEAgLTIxNCw3ICszNzAsNyBAQAogCQkJCQkJY2hhcltdW10gYWNjZXB0ZWRDbGFzcyA9IG5ldyBjaGFyWzJdW107CiAJCQkJCQlhY2NlcHRlZENsYXNzWzBdID0gcGFja2FnZU5hbWU7CiAJCQkJCQlhY2NlcHRlZENsYXNzWzFdID0gdHlwZU5hbWU7Ci0JCQkJCQkKKwogCQkJCQkJaWYodGhpcy5hY2NlcHRlZENsYXNzZXMgPT0gbnVsbCkgewogCQkJCQkJCXRoaXMuYWNjZXB0ZWRDbGFzc2VzID0gbmV3IGNoYXJbMTBdW11bXTsKIAkJCQkJCQl0aGlzLmFjY2VwdGVkQ2xhc3Nlc01vZGlmaWVycyA9IG5ldyBpbnRbMTBdOwpAQCAtMjQ4LDcgKzQwNCw3IEBACiAJLyoqCiAJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHBhY2thZ2UuCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIGNoYXJbXQotCSAqIAorCSAqCiAJICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKIAkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgogCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCkBAIC0zMjgsMzUgKzQ4NCw0NCBAQAogCQl9CiAJfQogCXByaXZhdGUgYm9vbGVhbiBjaGVja1NlbGVjdGlvbigKLQkJY2hhcltdIHNvdXJjZSwKLQkJaW50IHNlbGVjdGlvblN0YXJ0LAotCQlpbnQgc2VsZWN0aW9uRW5kKSB7CisJCQljaGFyW10gc291cmNlLAorCQkJaW50IHNlbGVjdGlvblN0YXJ0LAorCQkJaW50IHNlbGVjdGlvbkVuZCkgewogCi0JCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKCk7CisJCVNjYW5uZXIgc2Nhbm5lciA9CisJCQluZXcgU2Nhbm5lcigKKwkJCQlmYWxzZSAvKmNvbW1lbnQqLywKKwkJCQlmYWxzZSAvKndoaXRlc3BhY2UqLywKKwkJCQlmYWxzZSAvKm5scyovLAorCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsLAorCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCwKKwkJCQludWxsLyp0YXNrVGFnKi8sCisJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKKwkJCQl0cnVlIC8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiAJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7Ci0JCQorCiAJCWludCBsYXN0SWRlbnRpZmllclN0YXJ0ID0gLTE7CiAJCWludCBsYXN0SWRlbnRpZmllckVuZCA9IC0xOwogCQljaGFyW10gbGFzdElkZW50aWZpZXIgPSBudWxsOwogCQlpbnQgdG9rZW47Ci0JCQorCiAJCWlmKHNlbGVjdGlvblN0YXJ0ID4gc2VsZWN0aW9uRW5kKXsKIAkJCWludCBlbmQgPSBzb3VyY2UubGVuZ3RoIC0gMTsKLQkJCQorCiAJCQkvLyBjb21wdXRlIHN0YXJ0IHBvc2l0aW9uIG9mIGN1cnJlbnQgbGluZQogCQkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHNlbGVjdGlvblN0YXJ0IC0gMTsKIAkJCWludCBuZXh0Q2hhcmFjdGVyUG9zaXRpb24gPSBzZWxlY3Rpb25TdGFydDsKIAkJCWNoYXIgY3VycmVudENoYXJhY3RlciA9ICcgJzsKIAkJCXRyeSB7CiAJCQkJbGluZUxvb3A6IHdoaWxlKGN1cnJlbnRQb3NpdGlvbiA+IDApewotCQkJCQkKKwogCQkJCQlpZihzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnICYmIHNvdXJjZVtjdXJyZW50UG9zaXRpb24rMV0gPT0gJ3UnKSB7CiAJCQkJCQlpbnQgcG9zID0gY3VycmVudFBvc2l0aW9uICsgMjsKIAkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CiAJCQkJCQl3aGlsZSAoc291cmNlW3Bvc10gPT0gJ3UnKSB7CiAJCQkJCQkJcG9zKys7CiAJCQkJCQl9Ci0JCQkJCQkKKwogCQkJCQkJaW50IGVuZE9mVW5pY29kZSA9IHBvcyArIDM7CiAJCQkJCQlpZiAoZW5kIDwgZW5kT2ZVbmljb2RlKSB7CiAJCQkJCQkJaWYgKGVuZE9mVW5pY29kZSA8IHNvdXJjZS5sZW5ndGgpIHsKQEAgLTM4Myw3ICs1NDgsNyBAQAogCQkJCQkJY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb25dOwogCQkJCQkJbmV4dENoYXJhY3RlclBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uKzE7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJc3dpdGNoKGN1cnJlbnRDaGFyYWN0ZXIpIHsKIAkJCQkJCWNhc2UgJ1xyJzoKIAkJCQkJCWNhc2UgJ1xuJzoKQEAgLTM5NywxMCArNTYyLDEwIEBACiAJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJCQorCiAJCQkvLyBjb21wdXRlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGxhc3QgdG9rZW4KIAkJCXNjYW5uZXIucmVzZXRUbyhuZXh0Q2hhcmFjdGVyUG9zaXRpb24sIGVuZCk7Ci0JCQlkbyB7CisJCQlpc29sYXRlTGFzdE5hbWU6IGRvIHsKIAkJCQl0cnkgewogCQkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CiAJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKQEAgLTQyMCw1OCArNTg1LDU3IEBACiAJCQkJCQkJbGFzdElkZW50aWZpZXJTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKIAkJCQkJCQlsYXN0SWRlbnRpZmllckVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQkJCQlsYXN0SWRlbnRpZmllciA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQkJCQkJYnJlYWsgaXNvbGF0ZUxhc3ROYW1lOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKIAkJfSBlbHNlIHsKIAkJCXNjYW5uZXIucmVzZXRUbyhzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKLQkKLQkJCWJvb2xlYW4gZXhwZWN0aW5nSWRlbnRpZmllciA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWRvIHsKLQkJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCi0JCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhpcyA6Ci0JCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN1cGVyIDoKLQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciA6Ci0JCQkJCQkJaWYgKCFleHBlY3RpbmdJZGVudGlmaWVyKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJbGFzdElkZW50aWZpZXIgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQkJCQkJCWxhc3RJZGVudGlmaWVyU3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247Ci0JCQkJCQkJbGFzdElkZW50aWZpZXJFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7Ci0JCQkJCQkJaWYobGFzdElkZW50aWZpZXJFbmQgPiBzZWxlY3Rpb25FbmQpIHsKLQkJCQkJCQkJbGFzdElkZW50aWZpZXJFbmQgPSBzZWxlY3Rpb25FbmQ7Ci0JCQkJCQkJCWxhc3RJZGVudGlmaWVyID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShsYXN0SWRlbnRpZmllciwgMCxsYXN0SWRlbnRpZmllckVuZCAtIGxhc3RJZGVudGlmaWVyU3RhcnQgKyAxKTsKLQkJCQkJCQl9Ci0JCi0JCQkJCQkJZXhwZWN0aW5nSWRlbnRpZmllciA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QgOgotCQkJCQkJCWlmIChleHBlY3RpbmdJZGVudGlmaWVyKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJZXhwZWN0aW5nSWRlbnRpZmllciA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRiA6Ci0JCQkJCQkJaWYgKGV4cGVjdGluZ0lkZW50aWZpZXIpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUyA6Ci0JCQkJCQkJaWYoIWNoZWNrVHlwZUFyZ3VtZW50KHNjYW5uZXIpKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUFUOgotCQkJCQkJCWlmKHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAhPSBzY2FubmVyLmluaXRpYWxQb3NpdGlvbikKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6CisJCQlib29sZWFuIGV4cGVjdGluZ0lkZW50aWZpZXIgPSB0cnVlOworCQkJZG8geworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aGlzIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdXBlciA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciA6CisJCQkJCQlpZiAoIWV4cGVjdGluZ0lkZW50aWZpZXIpCiAJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKLQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCQkJCQkJbGFzdElkZW50aWZpZXIgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCQkJbGFzdElkZW50aWZpZXJTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCWxhc3RJZGVudGlmaWVyRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQkJaWYobGFzdElkZW50aWZpZXJFbmQgPiBzZWxlY3Rpb25FbmQpIHsKKwkJCQkJCQlsYXN0SWRlbnRpZmllckVuZCA9IHNlbGVjdGlvbkVuZDsKKwkJCQkJCQlsYXN0SWRlbnRpZmllciA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobGFzdElkZW50aWZpZXIsIDAsbGFzdElkZW50aWZpZXJFbmQgLSBsYXN0SWRlbnRpZmllclN0YXJ0ICsgMSk7CisJCQkJCQl9CisJCQkJCQlleHBlY3RpbmdJZGVudGlmaWVyID0gZmFsc2U7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QgOgorCQkJCQkJaWYgKGV4cGVjdGluZ0lkZW50aWZpZXIpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJZXhwZWN0aW5nSWRlbnRpZmllciA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YgOgorCQkJCQkJaWYgKGV4cGVjdGluZ0lkZW50aWZpZXIpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUyA6CisJCQkJCQlpZighY2hlY2tUeXBlQXJndW1lbnQoc2Nhbm5lcikpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQVQ6CisJCQkJCQlpZihzY2FubmVyLnN0YXJ0UG9zaXRpb24gIT0gc2Nhbm5lci5pbml0aWFsUG9zaXRpb24pCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRik7CiAJCX0KIAkJaWYgKGxhc3RJZGVudGlmaWVyU3RhcnQgPiAwKSB7CiAJCQl0aGlzLmFjdHVhbFNlbGVjdGlvblN0YXJ0ID0gbGFzdElkZW50aWZpZXJTdGFydDsKQEAgLTQ4MSwxMyArNjQ1LDE2IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tUeXBlQXJndW1lbnQoU2Nhbm5lciBzY2FubmVyKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tUeXBlQXJndW1lbnQoU2Nhbm5lciBzY2FubmVyKSB7CiAJCWludCBkZXB0aCA9IDE7CiAJCWludCB0b2tlbjsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJZG8gewotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQorCQkJdHJ5IHsKKwkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KIAkJCXN3aXRjaCh0b2tlbikgewogCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUyA6CiAJCQkJCWRlcHRoKys7CkBAIC01MjcsMTMgKzY5NCwxMyBAQAogCQkJCWRlZmF1bHQgOgogCQkJCQlidWZmZXIuYXBwZW5kKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwogCQkJCQlicmVhazsKLQkJCQkKKwogCQkJfQogCQkJaWYoZGVwdGggPCAwKSB7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9IHdoaWxlIChkZXB0aCAhPSAwICYmIHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRik7Ci0JCQorCiAJCWlmKGRlcHRoID09IDApIHsKIAkJCWludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCkgLSAxOwogCQkJY2hhcltdIHR5cGVSZWYgPSBuZXcgY2hhcltsZW5ndGhdOwpAQCAtNTQ1LDEwICs3MTIsODIgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KLQkJCisKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAkKKwkvKgorCSAqIGZpbmQgYWxsIHR5cGVzIG91dHNpZGUgdGhlIHByb2plY3Qgc2NvcGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZmluZEFsbFR5cGVzKGNoYXJbXSBwcmVmaXgpIHsKKwkJdHJ5IHsKKwkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisJCQkJYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7CisJCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7CisJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAorCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBkb25lKCkgeworCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKKwkJCQkJLy8gaW1wbGVtZW50cyBpbnRlcmZhY2UgbWV0aG9kCisJCQkJfQorCQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisJCQkJCXJldHVybiB0aGlzLmlzQ2FuY2VsZWQ7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJCQkJdGhpcy5pc0NhbmNlbGVkID0gdmFsdWU7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7CisJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAorCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7CisJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAorCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKKwkJCQkJLy8gaW1wbGVtZW50cyBpbnRlcmZhY2UgbWV0aG9kCisJCQkJfQorCQkJfTsKKwkJCQorCQkJVHlwZU5hbWVNYXRjaFJlcXVlc3RvciB0eXBlTmFtZU1hdGNoUmVxdWVzdG9yID0gbmV3IFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IoKSB7CisJCQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZU5hbWVNYXRjaChUeXBlTmFtZU1hdGNoIG1hdGNoKSB7CisJCQkJCWlmIChTZWxlY3Rpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IgaW5zdGFuY2VvZiBTZWxlY3Rpb25SZXF1ZXN0b3IpIHsKKwkJCQkJCVNlbGVjdGlvbkVuZ2luZS50aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJCSgoU2VsZWN0aW9uUmVxdWVzdG9yKVNlbGVjdGlvbkVuZ2luZS50aGlzLnJlcXVlc3RvcikuYWNjZXB0VHlwZShtYXRjaC5nZXRUeXBlKCkpOworCQkJCQl9CisJCQkJfQorCQkJfTsKKwkJCQorCQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IEJhc2ljU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCk7CisJCQkKKwkJCVNlbGVjdGlvblR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3JXcmFwcGVyIHJlcXVlc3RvcldyYXBwZXIgPQorCQkJCW5ldyBTZWxlY3Rpb25UeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlcigKKwkJCQkJCXR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IsIAorCQkJCQkJc2NvcGUsCisJCQkJCQl0aGlzLnVuaXRTY29wZSA9PSBudWxsID8gbnVsbCA6IHRoaXMudW5pdFNjb3BlLnJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cyk7CisJCQkKKwkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbXSB3b3JraW5nQ29waWVzID0gdGhpcy5vd25lciA9PSBudWxsID8gbnVsbCA6IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFdvcmtpbmdDb3BpZXModGhpcy5vd25lciwgdHJ1ZS8qYWRkIHByaW1hcnkgV0NzKi8pOworCQkJCisJCQl0cnkgeworCQkJCW5ldyBCYXNpY1NlYXJjaEVuZ2luZSh3b3JraW5nQ29waWVzKS5zZWFyY2hBbGxUeXBlTmFtZXMoCisJCQkJCW51bGwsCisJCQkJCVNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCwKKwkJCQkJcHJlZml4LAorCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUsCisJCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsCisJCQkJCXNjb3BlLAorCQkJCQlyZXF1ZXN0b3JXcmFwcGVyLAorCQkJCQlJSmF2YVNlYXJjaENvbnN0YW50cy5DQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSCwKKwkJCQkJcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9CisJCQlyZXF1ZXN0b3JXcmFwcGVyLmFjY2VwdE5vdEltcG9ydGVkKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwl9CisKIAlwdWJsaWMgQXNzaXN0UGFyc2VyIGdldFBhcnNlcigpIHsKIAkJcmV0dXJuIHRoaXMucGFyc2VyOwogCX0KQEAgLTU4Niw3ICs4MjUsNyBAQAogCQlpbnQgc2VsZWN0aW9uU291cmNlRW5kKSB7CiAKIAkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0Q29udGVudHMoKTsKLQkJCisKIAkJaWYoREVCVUcpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnQoIlNFTEVDVElPTiBJTiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJU3lzdGVtLm91dC5wcmludChzb3VyY2VVbml0LmdldEZpbGVOYW1lKCkpOwpAQCAtNjAyLDcgKzg0MSw3IEBACiAJCX0KIAkJaWYgKERFQlVHKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBDaGVja2VkIDogXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludChuZXcgU3RyaW5nKHNvdXJjZSwgYWN0dWFsU2VsZWN0aW9uU3RhcnQsIGFjdHVhbFNlbGVjdGlvbkVuZC1hY3R1YWxTZWxlY3Rpb25TdGFydCsxKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50KG5ldyBTdHJpbmcoc291cmNlLCB0aGlzLmFjdHVhbFNlbGVjdGlvblN0YXJ0LCB0aGlzLmFjdHVhbFNlbGVjdGlvbkVuZC10aGlzLmFjdHVhbFNlbGVjdGlvblN0YXJ0KzEpKTsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbignIicpOwogCQl9CiAJCXRyeSB7CkBAIC02MTYsNyArODU1LDcgQEAKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RJT04gLSBEaWV0IEFTVCA6Iik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKHBhcnNlZFVuaXQudG9TdHJpbmcoKSk7CiAJCQkJfQotCQkJCQorCiAJCQkJLy8gc2NhbiB0aGUgcGFja2FnZSAmIGltcG9ydCBzdGF0ZW1lbnRzIGZpcnN0CiAJCQkJaWYgKHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UgaW5zdGFuY2VvZiBTZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UpIHsKIAkJCQkJY2hhcltdW10gdG9rZW5zID0KQEAgLTYzNCwxMyArODczLDEzIEBACiAJCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpKTsKIAkJCQkJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kVHlwZXMoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKSwgZmFsc2UsIGZhbHNlLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCB0aGlzKTsKLQkJCQkJCQkKKwogCQkJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgbnVsbCAvKm5vIGFjY2VzcyByZXN0cmljdGlvbiovKTsKIAkJCQkJCQlpZiAoKHRoaXMudW5pdFNjb3BlID0gcGFyc2VkVW5pdC5zY29wZSkgIT0gbnVsbCkgewogCQkJCQkJCQlpbnQgdG9rZW5Db3VudCA9IHRva2Vucy5sZW5ndGg7CiAJCQkJCQkJCWNoYXJbXSBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5Db3VudCAtIDFdOwogCQkJCQkJCQljaGFyW11bXSBxdWFsaWZpZXJUb2tlbnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRva2VucywgMCwgdG9rZW5Db3VudCAtIDEpOwotCQkJCQkJCQkKKwogCQkJCQkJCQlpZihxdWFsaWZpZXJUb2tlbnMgIT0gbnVsbCAmJiBxdWFsaWZpZXJUb2tlbnMubGVuZ3RoID4gMCkgewogCQkJCQkJCQkJQmluZGluZyBiaW5kaW5nID0gdGhpcy51bml0U2NvcGUuZ2V0VHlwZU9yUGFja2FnZShxdWFsaWZpZXJUb2tlbnMpOwogCQkJCQkJCQkJaWYoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CkBAIC02NTMsNyArODkyLDcgQEAKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KLQkJCQkJCQkKKwogCQkJCQkJCS8vIGFjY2VwdCBxdWFsaWZpZWQgdHlwZXMgb25seSBpZiBubyB1bnF1YWxpZmllZCB0eXBlIHdhcyBhY2NlcHRlZAogCQkJCQkJCWlmKCF0aGlzLmFjY2VwdGVkQW5zd2VyKSB7CiAJCQkJCQkJCWFjY2VwdFF1YWxpZmllZFR5cGVzKCk7CkBAIC02NzksNyArOTE4LDExIEBACiAJCQkJCWlmICgodGhpcy51bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAgIT0gbnVsbCkgewogCQkJCQkJdHJ5IHsKIAkJCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOworCQkJCQkJCQorCQkJCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHByZXZpb3VzVW5pdEJlaW5nQ29tcGxldGVkID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQ7CisJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQgPSBwYXJzZWRVbml0OwogCQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQgPSBwcmV2aW91c1VuaXRCZWluZ0NvbXBsZXRlZDsKIAkJCQkJCQlBU1ROb2RlIG5vZGUgPSBudWxsOwogCQkJCQkJCWlmIChwYXJzZWRVbml0LnR5cGVzICE9IG51bGwpCiAJCQkJCQkJCW5vZGUgPSBwYXJzZUJsb2NrU3RhdGVtZW50cyhwYXJzZWRVbml0LCBzZWxlY3Rpb25Tb3VyY2VTdGFydCk7CkBAIC03MDgsMTYgKzk1MSwyMSBAQAogCQkJLy8gdGh1cyB1c2UgdGhlIHNlbGVjdGVkIHNvdXJjZSBhbmQgcGVyZm9ybSBhIHRleHR1YWwgdHlwZSBzZWFyY2gKIAkJCWlmICghdGhpcy5hY2NlcHRlZEFuc3dlcikgewogCQkJCXRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyh0aGlzLnNlbGVjdGVkSWRlbnRpZmllciwgZmFsc2UsIGZhbHNlLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCB0aGlzKTsKLQkJCQkKKwogCQkJCS8vIGFjY2VwdCBxdWFsaWZpZWQgdHlwZXMgb25seSBpZiBubyB1bnF1YWxpZmllZCB0eXBlIHdhcyBhY2NlcHRlZAogCQkJCWlmKCF0aGlzLmFjY2VwdGVkQW5zd2VyKSB7CiAJCQkJCWFjY2VwdFF1YWxpZmllZFR5cGVzKCk7CisJCQkJCQorCQkJCQkvLyBhY2NlcHQgdHlwZXMgZnJvbSBhbGwgdGhlIHdvcmtzcGFjZSBvbmx5IGlmIG5vIHR5cGUgd2FzIGZvdW5kIGluIHRoZSBwcm9qZWN0IHNjb3BlCisJCQkJCWlmICh0aGlzLm5vUHJvcG9zYWwpIHsKKwkJCQkJCWZpbmRBbGxUeXBlcyh0aGlzLnNlbGVjdGVkSWRlbnRpZmllcik7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQlpZih0aGlzLm5vUHJvcG9zYWwgJiYgdGhpcy5wcm9ibGVtICE9IG51bGwpIHsKIAkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRFcnJvcih0aGlzLnByb2JsZW0pOwogCQkJfQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gd29yay1hcm91bmQgaW50ZXJuYWwgZmFpbHVyZSAtIDFHRU1GNkQJCQorCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gd29yay1hcm91bmQgaW50ZXJuYWwgZmFpbHVyZSAtIDFHRU1GNkQKIAkJCWlmKERFQlVHKSB7CiAJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gY2F1Z2h0IGJ5IFNlbGVjdGlvbkVuZ2luZToiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwpAQCAtNzI4LDcgKzk3Niw3IEBACiAJCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CiAJCQl9CiAJCX0gZmluYWxseSB7Ci0JCQlyZXNldCgpOworCQkJcmVzZXQodHJ1ZSk7CiAJCX0KIAl9CiAKQEAgLTczNyw3ICs5ODUsNyBAQAogCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSByZWYubWVtYmVyVHlwZXMoKTsKIAkJbmV4dCA6IGZvciAoaW50IGogPSAwOyBqIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBqKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW2pdOwotCQkJCisKIAkJCWlmIChmaWVsZExlbmd0aCA+IG1lbWJlclR5cGUuc291cmNlTmFtZS5sZW5ndGgpCiAJCQkJY29udGludWUgbmV4dDsKIApAQCAtNzQ2LDIwICs5OTQsMjAgQEAKIAogCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhsYXN0VG9rZW4sIG1lbWJlclR5cGUuc291cmNlTmFtZSwgdHJ1ZSkpCiAJCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJdGhpcy5zZWxlY3RGcm9tKG1lbWJlclR5cGUsIHBhcnNlZFVuaXQsIGZhbHNlKTsKKworCQkJc2VsZWN0RnJvbShtZW1iZXJUeXBlLCBwYXJzZWRVbml0LCBmYWxzZSk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgc2VsZWN0U3RhdGljRmllbGRGcm9tU3RhdGljSW1wb3J0KENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQsIGNoYXJbXSBsYXN0VG9rZW4sIFJlZmVyZW5jZUJpbmRpbmcgcmVmKSB7CiAJCWludCBmaWVsZExlbmd0aCA9IGxhc3RUb2tlbi5sZW5ndGg7Ci0JCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHJlZi5maWVsZHMoKTsKKwkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gcmVmLmF2YWlsYWJsZUZpZWxkcygpOwogCQluZXh0IDogZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKIAkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tqXTsKLQkJCQorCiAJCQlpZiAoZmllbGRMZW5ndGggPiBmaWVsZC5uYW1lLmxlbmd0aCkKIAkJCQljb250aW51ZSBuZXh0OwotCQkJCisKIAkJCWlmIChmaWVsZC5pc1N5bnRoZXRpYygpKQogCQkJCWNvbnRpbnVlIG5leHQ7CiAKQEAgLTc2OCwxNyArMTAxNiwxNyBAQAogCiAJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGxhc3RUb2tlbiwgZmllbGQubmFtZSwgdHJ1ZSkpCiAJCQkJY29udGludWUgbmV4dDsKLQkJCQotCQkJdGhpcy5zZWxlY3RGcm9tKGZpZWxkLCBwYXJzZWRVbml0LCBmYWxzZSk7CisKKwkJCXNlbGVjdEZyb20oZmllbGQsIHBhcnNlZFVuaXQsIGZhbHNlKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBzZWxlY3RTdGF0aWNNZXRob2RGcm9tU3RhdGljSW1wb3J0KENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQsIGNoYXJbXSBsYXN0VG9rZW4sIFJlZmVyZW5jZUJpbmRpbmcgcmVmKSB7CiAJCWludCBtZXRob2RMZW5ndGggPSBsYXN0VG9rZW4ubGVuZ3RoOwotCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHJlZi5tZXRob2RzKCk7CisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gcmVmLmF2YWlsYWJsZU1ldGhvZHMoKTsKIAkJbmV4dCA6IGZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgewogCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2pdOwotCQkJCisKIAkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKIAogCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0OwpAQCAtNzkyLDggKzEwNDAsOCBAQAogCiAJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGxhc3RUb2tlbiwgbWV0aG9kLnNlbGVjdG9yLCB0cnVlKSkKIAkJCQljb250aW51ZSBuZXh0OwotCQkJCi0JCQl0aGlzLnNlbGVjdEZyb20obWV0aG9kLCBwYXJzZWRVbml0LCBmYWxzZSk7CisKKwkJCXNlbGVjdEZyb20obWV0aG9kLCBwYXJzZWRVbml0LCBmYWxzZSk7CiAJCX0KIAl9CiAKQEAgLTgwMiw3ICsxMDUwLDcgQEAKIAkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlQmluZGluZyA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwogCQkJQmluZGluZyBlbmNsb3NpbmdFbGVtZW50ID0gdHlwZVZhcmlhYmxlQmluZGluZy5kZWNsYXJpbmdFbGVtZW50OwogCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkKKwogCQkJaWYoZW5jbG9zaW5nRWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nKSB7CiAJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgZW5jbG9zaW5nRWxlbWVudDsKIAkJCQlpZiAoaXNMb2NhbChlbmNsb3NpbmdUeXBlKSAmJiB0aGlzLnJlcXVlc3RvciBpbnN0YW5jZW9mIFNlbGVjdGlvblJlcXVlc3RvcikgewpAQCAtODM5LDcgKzEwODcsMTIgQEAKIAkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwogCQkJaWYodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgewotCQkJCXR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuY2xvc2VzdE1hdGNoKCk7CisJCQkJVHlwZUJpbmRpbmcgY2xvc2VzdE1hdGNoID0gdHlwZUJpbmRpbmcuY2xvc2VzdE1hdGNoKCk7CisJCQkJaWYgKGNsb3Nlc3RNYXRjaCBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgY2xvc2VzdE1hdGNoOworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJCQl9CiAJCQl9CiAJCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuOwogCQkJaWYgKGlzTG9jYWwodHlwZUJpbmRpbmcpICYmIHRoaXMucmVxdWVzdG9yIGluc3RhbmNlb2YgU2VsZWN0aW9uUmVxdWVzdG9yKSB7CkBAIC04NTgsMTM1ICsxMTExLDE0OCBAQAogCQkJCQl0aGlzLmFjdHVhbFNlbGVjdGlvbkVuZCk7CiAJCQl9CiAJCQl0aGlzLmFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKLQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgYmluZGluZzsKLQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkKLQkJCQlib29sZWFuIGlzVmFsdWVzT3JWYWx1ZU9mID0gZmFsc2U7Ci0JCQkJaWYoYmluZGluZyBpbnN0YW5jZW9mIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcpIHsKLQkJCQkJU3ludGhldGljTWV0aG9kQmluZGluZyBzeW50aGV0aWNNZXRob2RCaW5kaW5nID0gKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJCWlmKHN5bnRoZXRpY01ldGhvZEJpbmRpbmcua2luZCAgPT0gU3ludGhldGljTWV0aG9kQmluZGluZy5FbnVtVmFsdWVzCi0JCQkJCQkJfHwgc3ludGhldGljTWV0aG9kQmluZGluZy5raW5kICA9PSBTeW50aGV0aWNNZXRob2RCaW5kaW5nLkVudW1WYWx1ZU9mKSB7Ci0JCQkJCQlpc1ZhbHVlc09yVmFsdWVPZiA9ICB0cnVlOwotCQkJCQl9CisJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGdldENvcnJlY3RNZXRob2RCaW5kaW5nKChNZXRob2RCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOworCisJCQlib29sZWFuIGlzVmFsdWVzT3JWYWx1ZU9mID0gZmFsc2U7CisJCQlpZihiaW5kaW5nIGluc3RhbmNlb2YgU3ludGhldGljTWV0aG9kQmluZGluZykgeworCQkJCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgc3ludGhldGljTWV0aG9kQmluZGluZyA9IChTeW50aGV0aWNNZXRob2RCaW5kaW5nKSBiaW5kaW5nOworCQkJCWlmKHN5bnRoZXRpY01ldGhvZEJpbmRpbmcucHVycG9zZSAgPT0gU3ludGhldGljTWV0aG9kQmluZGluZy5FbnVtVmFsdWVzCisJCQkJCQl8fCBzeW50aGV0aWNNZXRob2RCaW5kaW5nLnB1cnBvc2UgID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuRW51bVZhbHVlT2YpIHsKKwkJCQkJaXNWYWx1ZXNPclZhbHVlT2YgPSAgdHJ1ZTsKIAkJCQl9Ci0JCQkJCQkKLQkJCQlpZighaXNWYWx1ZXNPclZhbHVlT2YgJiYgIW1ldGhvZEJpbmRpbmcuaXNTeW50aGV0aWMoKSkgewotCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kQmluZGluZy5vcmlnaW5hbCgpLnBhcmFtZXRlcnM7Ci0JCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0gPSBwYXJhbWV0ZXJUeXBlc1tpXS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOwotCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpOwotCQkJCQkJcGFyYW1ldGVyU2lnbmF0dXJlc1tpXSA9IG5ldyBTdHJpbmcoZ2V0U2lnbmF0dXJlKHBhcmFtZXRlclR5cGVzW2ldKSkucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gbWV0aG9kQmluZGluZy5vcmlnaW5hbCgpLnR5cGVWYXJpYWJsZXM7Ci0JCQkJCWxlbmd0aCA9IHR5cGVWYXJpYWJsZXMgPT0gbnVsbCA/IDAgOiB0eXBlVmFyaWFibGVzLmxlbmd0aDsKLQkJCQkJY2hhcltdW10gdHlwZVBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJCQljaGFyW11bXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdW107Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlID0gdHlwZVZhcmlhYmxlc1tpXTsKLQkJCQkJCXR5cGVQYXJhbWV0ZXJOYW1lc1tpXSA9IHR5cGVWYXJpYWJsZS5zb3VyY2VOYW1lOwotCQkJCQkJaWYgKHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IG51bGwpIHsKLQkJCQkJCQl0eXBlUGFyYW1ldGVyQm91bmROYW1lc1tpXSA9IG5ldyBjaGFyWzBdW107Ci0JCQkJCQl9IGVsc2UgaWYgKHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzKSB7Ci0JCQkJCQkJaW50IGJvdW5kQ291bnQgPSAxICsgKHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgPT0gbnVsbCA/IDAgOiB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCk7Ci0JCQkJCQkJdHlwZVBhcmFtZXRlckJvdW5kTmFtZXNbaV0gPSBuZXcgY2hhcltib3VuZENvdW50XVtdOwotCQkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzW2ldWzBdID0gdHlwZVZhcmlhYmxlLnN1cGVyY2xhc3Muc291cmNlTmFtZTsKLQkJCQkJCQlmb3IgKGludCBqID0gMTsgaiA8IGJvdW5kQ291bnQ7IGorKykgewotCQkJCQkJCQl0eXBlUGFyYW1ldGVyQm91bmROYW1lc1tpXVtqXSA9IHR5cGVWYXJpYWJsZXNbaV0uc3VwZXJJbnRlcmZhY2VzW2ogLSAxXS5zb3VyY2VOYW1lOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGJvdW5kQ291bnQgPSB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzID09IG51bGwgPyAwIDogdHlwZVZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7Ci0JCQkJCQkJdHlwZVBhcmFtZXRlckJvdW5kTmFtZXNbaV0gPSBuZXcgY2hhcltib3VuZENvdW50XVtdOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYm91bmRDb3VudDsgaisrKSB7Ci0JCQkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzW2ldW2pdID0gdHlwZVZhcmlhYmxlc1tpXS5zdXBlckludGVyZmFjZXNbal0uc291cmNlTmFtZTsKLQkJCQkJCQl9CisJCQl9CisKKwkJCWlmKCFpc1ZhbHVlc09yVmFsdWVPZiAmJiAhbWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpKSB7CisJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZEJpbmRpbmcub3JpZ2luYWwoKS5wYXJhbWV0ZXJzOworCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CisJCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQlwYXJhbWV0ZXJTaWduYXR1cmVzW2ldID0gbmV3IFN0cmluZyhnZXRTaWduYXR1cmUocGFyYW1ldGVyVHlwZXNbaV0pKS5yZXBsYWNlKCcvJywgJy4nKTsKKwkJCQl9CisKKwkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IG1ldGhvZEJpbmRpbmcub3JpZ2luYWwoKS50eXBlVmFyaWFibGVzOworCQkJCWxlbmd0aCA9IHR5cGVWYXJpYWJsZXMgPT0gbnVsbCA/IDAgOiB0eXBlVmFyaWFibGVzLmxlbmd0aDsKKwkJCQljaGFyW11bXSB0eXBlUGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJY2hhcltdW11bXSB0eXBlUGFyYW1ldGVyQm91bmROYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUgPSB0eXBlVmFyaWFibGVzW2ldOworCQkJCQl0eXBlUGFyYW1ldGVyTmFtZXNbaV0gPSB0eXBlVmFyaWFibGUuc291cmNlTmFtZTsKKwkJCQkJaWYgKHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IG51bGwpIHsKKwkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzW2ldID0gbmV3IGNoYXJbMF1bXTsKKwkJCQkJfSBlbHNlIGlmICh0eXBlVmFyaWFibGUuZmlyc3RCb3VuZCA9PSB0eXBlVmFyaWFibGUuc3VwZXJjbGFzcykgeworCQkJCQkJaW50IGJvdW5kQ291bnQgPSAxICsgKHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgPT0gbnVsbCA/IDAgOiB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCk7CisJCQkJCQl0eXBlUGFyYW1ldGVyQm91bmROYW1lc1tpXSA9IG5ldyBjaGFyW2JvdW5kQ291bnRdW107CisJCQkJCQl0eXBlUGFyYW1ldGVyQm91bmROYW1lc1tpXVswXSA9IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzLnNvdXJjZU5hbWU7CisJCQkJCQlmb3IgKGludCBqID0gMTsgaiA8IGJvdW5kQ291bnQ7IGorKykgeworCQkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzW2ldW2pdID0gdHlwZVZhcmlhYmxlc1tpXS5zdXBlckludGVyZmFjZXNbaiAtIDFdLnNvdXJjZU5hbWU7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnQgYm91bmRDb3VudCA9IHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgPT0gbnVsbCA/IDAgOiB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzW2ldID0gbmV3IGNoYXJbYm91bmRDb3VudF1bXTsKKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYm91bmRDb3VudDsgaisrKSB7CisJCQkJCQkJdHlwZVBhcmFtZXRlckJvdW5kTmFtZXNbaV1bal0gPSB0eXBlVmFyaWFibGVzW2ldLnN1cGVySW50ZXJmYWNlc1tqXS5zb3VyY2VOYW1lOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCQotCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJCQkJaWYgKGlzTG9jYWwoZGVjbGFyaW5nQ2xhc3MpICYmIHRoaXMucmVxdWVzdG9yIGluc3RhbmNlb2YgU2VsZWN0aW9uUmVxdWVzdG9yKSB7Ci0JCQkJCQkoKFNlbGVjdGlvblJlcXVlc3Rvcil0aGlzLnJlcXVlc3RvcikuYWNjZXB0TG9jYWxNZXRob2QobWV0aG9kQmluZGluZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2QoCi0JCQkJCQkJZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKLQkJCQkJCQlkZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCi0JCQkJCQkJZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhnZXRTaWduYXR1cmUoZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpKSksCi0JCQkJCQkJbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkKLQkJCQkJCQkJPyBkZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkKLQkJCQkJCQkJOiBtZXRob2RCaW5kaW5nLnNlbGVjdG9yLAotCQkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lcywKLQkJCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMsCi0JCQkJCQkJcGFyYW1ldGVyU2lnbmF0dXJlcywKLQkJCQkJCQl0eXBlUGFyYW1ldGVyTmFtZXMsCi0JCQkJCQkJdHlwZVBhcmFtZXRlckJvdW5kTmFtZXMsCi0JCQkJCQkJbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCksIAotCQkJCQkJCWlzRGVjbGFyYXRpb24sCi0JCQkJCQkJbWV0aG9kQmluZGluZy5jb21wdXRlVW5pcXVlS2V5KCksCi0JCQkJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25TdGFydCwKLQkJCQkJCQl0aGlzLmFjdHVhbFNlbGVjdGlvbkVuZCk7CisJCQkJfQorCisJCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCQkJaWYgKGlzTG9jYWwoZGVjbGFyaW5nQ2xhc3MpICYmIHRoaXMucmVxdWVzdG9yIGluc3RhbmNlb2YgU2VsZWN0aW9uUmVxdWVzdG9yKSB7CisJCQkJCSgoU2VsZWN0aW9uUmVxdWVzdG9yKXRoaXMucmVxdWVzdG9yKS5hY2NlcHRMb2NhbE1ldGhvZChtZXRob2RCaW5kaW5nKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2QoCisJCQkJCQlkZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQkJZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhnZXRTaWduYXR1cmUoZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpKSksCisJCQkJCQltZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKQorCQkJCQkJCT8gZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpCisJCQkJCQkJOiBtZXRob2RCaW5kaW5nLnNlbGVjdG9yLAorCQkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAorCQkJCQkJcGFyYW1ldGVyU2lnbmF0dXJlcywKKwkJCQkJCXR5cGVQYXJhbWV0ZXJOYW1lcywKKwkJCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZE5hbWVzLAorCQkJCQkJbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCksCisJCQkJCQlpc0RlY2xhcmF0aW9uLAorCQkJCQkJbWV0aG9kQmluZGluZy5jb21wdXRlVW5pcXVlS2V5KCksCisJCQkJCQl0aGlzLmFjdHVhbFNlbGVjdGlvblN0YXJ0LAorCQkJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25FbmQpOworCQkJCX0KKwkJCX0KKwkJCXRoaXMuYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOworCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7IC8vIGFycmF5bGVuZ3RoCisJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJaWYgKGlzTG9jYWwoZGVjbGFyaW5nQ2xhc3MpICYmIHRoaXMucmVxdWVzdG9yIGluc3RhbmNlb2YgU2VsZWN0aW9uUmVxdWVzdG9yKSB7CisJCQkJCSgoU2VsZWN0aW9uUmVxdWVzdG9yKXRoaXMucmVxdWVzdG9yKS5hY2NlcHRMb2NhbEZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gaWYgdGhlIGJpbmRpbmcgaXMgYSBwcm9ibGVtIGZpZWxkIGJpbmRpbmcsIHdlIHdhbnQgdG8gbWFrZSBzdXJlCisJCQkJCS8vIHdlIGNhbiByZXRyaWV2ZSB0aGUgY2xvc2VzdE1hdGNoIGlmIHRoZSBwcm9ibGVtIHJlYXNvbiBpcyBOb3RWaXNpYmxlCisJCQkJCUZpZWxkQmluZGluZyBjdXJyZW50RmllbGRCaW5kaW5nID0gZmllbGRCaW5kaW5nOworCQkJCQl3aGlsZSAoY3VycmVudEZpZWxkQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCQkJCVByb2JsZW1GaWVsZEJpbmRpbmcgcHJvYmxlbUZpZWxkQmluZGluZyA9IChQcm9ibGVtRmllbGRCaW5kaW5nKSBjdXJyZW50RmllbGRCaW5kaW5nOworCQkJCQkJaWYgKHByb2JsZW1GaWVsZEJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkgeworCQkJCQkJCWN1cnJlbnRGaWVsZEJpbmRpbmcgPSBwcm9ibGVtRmllbGRCaW5kaW5nLmNsb3Nlc3RNYXRjaDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY3VycmVudEZpZWxkQmluZGluZyA9IG51bGw7CisJCQkJCQl9CiAJCQkJCX0KKwkJCQkJY2hhcltdIGZpZWxkTmFtZSA9IG51bGw7CisJCQkJCWNoYXJbXSBrZXkgPSBudWxsOworCQkJCQlpZiAoY3VycmVudEZpZWxkQmluZGluZyAhPSBudWxsKSB7CisJCQkJCQlmaWVsZE5hbWUgPSBjdXJyZW50RmllbGRCaW5kaW5nLm5hbWU7CisJCQkJCQlrZXkgPSBjdXJyZW50RmllbGRCaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZpZWxkTmFtZSA9IGZpZWxkQmluZGluZy5uYW1lOworCQkJCQkJa2V5ID0gZmllbGRCaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoKTsKKwkJCQkJfQorCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKKwkJCQkJCWRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCQlkZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQlmaWVsZE5hbWUsCisJCQkJCQlmYWxzZSwKKwkJCQkJCWtleSwKKwkJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uU3RhcnQsCisJCQkJCQl0aGlzLmFjdHVhbFNlbGVjdGlvbkVuZCk7CiAJCQkJfQogCQkJCXRoaXMuYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKLQkJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7IC8vIGFycmF5bGVuZ3RoCi0JCQkJCQl0aGlzLm5vUHJvcG9zYWwgPSBmYWxzZTsKLQkJCQkJCWlmIChpc0xvY2FsKGRlY2xhcmluZ0NsYXNzKSAmJiB0aGlzLnJlcXVlc3RvciBpbnN0YW5jZW9mIFNlbGVjdGlvblJlcXVlc3RvcikgewotCQkJCQkJCSgoU2VsZWN0aW9uUmVxdWVzdG9yKXRoaXMucmVxdWVzdG9yKS5hY2NlcHRMb2NhbEZpZWxkKGZpZWxkQmluZGluZyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEZpZWxkKAotCQkJCQkJCQlkZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAotCQkJCQkJCQlkZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCi0JCQkJCQkJCWZpZWxkQmluZGluZy5uYW1lLAotCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJZmllbGRCaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoKSwKLQkJCQkJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25TdGFydCwKLQkJCQkJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25FbmQpOwotCQkJCQkJfQotCQkJCQkJdGhpcy5hY2NlcHRlZEFuc3dlciA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgewotCQkJCQkJaWYgKHRoaXMucmVxdWVzdG9yIGluc3RhbmNlb2YgU2VsZWN0aW9uUmVxdWVzdG9yKSB7Ci0JCQkJCQkJKChTZWxlY3Rpb25SZXF1ZXN0b3IpdGhpcy5yZXF1ZXN0b3IpLmFjY2VwdExvY2FsVmFyaWFibGUoKExvY2FsVmFyaWFibGVCaW5kaW5nKWJpbmRpbmcpOwotCQkJCQkJCXRoaXMuYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBvcGVuIG9uIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZQotCQkJCQkJCXNlbGVjdEZyb20oKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykudHlwZSwgcGFyc2VkVW5pdCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKSB7Ci0JCQkJCQkJc2VsZWN0RnJvbSgoKEFycmF5QmluZGluZykgYmluZGluZykubGVhZkNvbXBvbmVudFR5cGUsIHBhcnNlZFVuaXQsIGZhbHNlKTsKLQkJCQkJCQkvLyBvcGVuIG9uIHRoZSB0eXBlIG9mIHRoZSBhcnJheQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgewotCQkJCQkJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKLQkJCQkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7Ci0JCQkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UocGFja2FnZUJpbmRpbmcucmVhZGFibGVOYW1lKCkpOwotCQkJCQkJCQl0aGlzLmFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJaWYoYmluZGluZyBpbnN0YW5jZW9mIEJhc2VUeXBlQmluZGluZykgewotCQkJCQkJCQkJdGhpcy5hY2NlcHRlZEFuc3dlciA9IHRydWU7Ci0JCQkJCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKKwkJCWlmICh0aGlzLnJlcXVlc3RvciBpbnN0YW5jZW9mIFNlbGVjdGlvblJlcXVlc3RvcikgeworCQkJCSgoU2VsZWN0aW9uUmVxdWVzdG9yKXRoaXMucmVxdWVzdG9yKS5hY2NlcHRMb2NhbFZhcmlhYmxlKChMb2NhbFZhcmlhYmxlQmluZGluZyliaW5kaW5nKTsKKwkJCQl0aGlzLmFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gb3BlbiBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUKKwkJCQlzZWxlY3RGcm9tKCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLnR5cGUsIHBhcnNlZFVuaXQsIGZhbHNlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKSB7CisJCQlzZWxlY3RGcm9tKCgoQXJyYXlCaW5kaW5nKSBiaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZSwgcGFyc2VkVW5pdCwgZmFsc2UpOworCQkJLy8gb3BlbiBvbiB0aGUgdHlwZSBvZiB0aGUgYXJyYXkKKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VCaW5kaW5nLnJlYWRhYmxlTmFtZSgpKTsKKwkJCXRoaXMuYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOworCQl9IGVsc2UgaWYoYmluZGluZyBpbnN0YW5jZW9mIEJhc2VUeXBlQmluZGluZykgeworCQkJdGhpcy5hY2NlcHRlZEFuc3dlciA9IHRydWU7CisJCX0KIAl9Ci0JCiAJLyoKIAkgKiBDaGVja3MgaWYgYSBsb2NhbCBkZWNsYXJhdGlvbiBnb3Qgc2VsZWN0ZWQgaW4gdGhpcyBtZXRob2QvaW5pdGlhbGl6ZXIvZmllbGQuCiAJICovCiAJcHJpdmF0ZSB2b2lkIHNlbGVjdExvY2FsRGVjbGFyYXRpb24oQVNUTm9kZSBub2RlKSB7CiAJCS8vIHRoZSBzZWxlY3RlZCBpZGVudGlmaWVyIGlzIG5vdCBpZGVudGljYWwgdG8gdGhlIHBhcnNlciBvbmUgKGVxdWFscyBidXQgbm90IGlkZW50aWNhbCksCiAJCS8vIGZvciB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLCB0aGUgcGFyc2VyIGFzc2lzdCBpZGVudGlmaWVyIGlzIG5lY2Vzc2FyeSBmb3IgaWRlbnRpdGl5IGNoZWNrcwotCQlmaW5hbCBjaGFyW10gYXNzaXN0SWRlbnRpZmllciA9IHRoaXMuZ2V0UGFyc2VyKCkuYXNzaXN0SWRlbnRpZmllcigpOworCQlmaW5hbCBjaGFyW10gYXNzaXN0SWRlbnRpZmllciA9IGdldFBhcnNlcigpLmFzc2lzdElkZW50aWZpZXIoKTsKIAkJaWYgKGFzc2lzdElkZW50aWZpZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkKKwogCQljbGFzcyBWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZWxlY3RvciA9PSBhc3Npc3RJZGVudGlmaWVyKXsKQEAgLTEwNDksNyArMTMxNSw3IEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCX0KLQkJCisKIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CiAJCQkoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pbm9kZSkudHJhdmVyc2UobmV3IFZpc2l0b3IoKSwgKENsYXNzU2NvcGUpbnVsbCk7CiAJCX0gZWxzZSB7CkBAIC0xMDU5LDI1ICsxMzI1LDE5IEBACiAKIAkvKioKIAkgKiBBc2tzIHRoZSBlbmdpbmUgdG8gY29tcHV0ZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSBnaXZlbiB0eXBlCi0JICogZnJvbSB0aGUgc291cmNlIHR5cGUuCi0JICoKLQkgKiAgQHBhcmFtIHNvdXJjZVR5cGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZQotCSAqICAgICAgYSBzb3VyY2UgZm9ybSBvZiB0aGUgY3VycmVudCB0eXBlIGluIHdoaWNoIGNvZGUgYXNzaXN0IGlzIGludm9rZWQuCisJICogZnJvbSB0aGUgZ2l2ZW4gY29udGV4dAogCSAqCiAJICogIEBwYXJhbSB0eXBlTmFtZSBjaGFyW10KIAkgKiAgICAgIGEgdHlwZSBuYW1lIHdoaWNoIGlzIHRvIGJlIHJlc29sdmVkIGluIHRoZSBjb250ZXh0IG9mIGEgY29tcGlsYXRpb24gdW5pdC4KIAkgKgkJTk9URTogdGhlIHR5cGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZSBjb3JyZWN0bHkgcmVkdWNlZCAobm8gd2hpdGVzcGFjZXMsIG5vIHVuaWNvZGVzIGxlZnQpCi0JICogCi0JICogQHBhcmFtIHRvcExldmVsVHlwZXMgU291cmNlVHlwZUVsZW1lbnRJbmZvW10KLQkgKiAgICAgIGEgc291cmNlIGZvcm0gb2YgdGhlIHRvcCBsZXZlbCB0eXBlcyBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBpbiB3aGljaCBjb2RlIGFzc2lzdCBpcyBpbnZva2VkLgotCi0JICogIEBwYXJhbSBzZWFyY2hJbkVudmlyb25tZW50Ci0JICogCWlmIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBubyBzZWxlY3Rpb24gY291bGQgYmUgZm91bmQgaW4gY29udGV4dCB0aGVuIHNlYXJjaCB0eXBlIGluIGVudmlyb25tZW50LgorCSAqCisJICogIEBwYXJhbSBjb250ZXh0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlCisJICogICAgICB0aGUgY29udGV4dCBpbiB3aGljaCBjb2RlIGFzc2lzdCBpcyBpbnZva2VkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdFR5cGUoSVNvdXJjZVR5cGUgc291cmNlVHlwZSwgY2hhcltdIHR5cGVOYW1lLCBTb3VyY2VUeXBlRWxlbWVudEluZm9bXSB0b3BMZXZlbFR5cGVzLCBib29sZWFuIHNlYXJjaEluRW52aXJvbm1lbnQpIHsKKwlwdWJsaWMgdm9pZCBzZWxlY3RUeXBlKGNoYXJbXSB0eXBlTmFtZSwgSVR5cGUgY29udGV4dCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQl0aGlzLmFjY2VwdGVkQW5zd2VyID0gZmFsc2U7Ci0JCQkKKwogCQkJLy8gb25seSB0aGUgdHlwZSBlcmFzdXJlIGFyZSByZXR1cm5lZCBieSBJVHlwZS5yZXNvbHZlZFR5cGUoLi4uKQogCQkJaWYgKENoYXJPcGVyYXRpb24uaW5kZXhPZignPCcsIHR5cGVOYW1lKSAhPSAtMSkgewogCQkJCWNoYXJbXSB0eXBlU2lnID0gU2lnbmF0dXJlLmNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGZhbHNlLypub3QgcmVzb2x2ZWQqLyk7CkBAIC0xMDg2LDkxICsxMzQ2LDk5IEBACiAJCQl9CiAKIAkJCS8vIGZpbmQgdGhlIG91dGVyIG1vc3QgdHlwZQotCQkJSVNvdXJjZVR5cGUgb3V0ZXJUeXBlID0gc291cmNlVHlwZTsKLQkJCUlTb3VyY2VUeXBlIHBhcmVudCA9IHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOworCQkJSVR5cGUgb3V0ZXJUeXBlID0gY29udGV4dDsKKwkJCUlUeXBlIHBhcmVudCA9IGNvbnRleHQuZ2V0RGVjbGFyaW5nVHlwZSgpOwogCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CiAJCQkJb3V0ZXJUeXBlID0gcGFyZW50OwotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRFbmNsb3NpbmdUeXBlKCk7CisJCQkJcGFyZW50ID0gcGFyZW50LmdldERlY2xhcmluZ1R5cGUoKTsKIAkJCX0KKwogCQkJLy8gY29tcHV0ZSBwYXJzZSB0cmVlIGZvciB0aGlzIG1vc3Qgb3V0ZXIgdHlwZQotCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KG91dGVyVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwotCQkJaWYgKCEoc291cmNlVHlwZSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVFbGVtZW50SW5mbykpIHJldHVybjsKLQkJCVNvdXJjZVR5cGUgdHlwZUhhbmRsZSA9IChTb3VyY2VUeXBlKSAoKFNvdXJjZVR5cGVFbGVtZW50SW5mbylzb3VyY2VUeXBlKS5nZXRIYW5kbGUoKTsKLQkJCWludCBmbGFncyA9IFNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfQU5EX01FVEhPRCB8IFNvdXJjZVR5cGVDb252ZXJ0ZXIuTUVNQkVSX1RZUEU7Ci0JCQlpZiAodHlwZUhhbmRsZS5pc0Fub255bW91cygpIHx8IHR5cGVIYW5kbGUuaXNMb2NhbCgpKSAKLQkJCQlmbGFncyB8PSBTb3VyY2VUeXBlQ29udmVydGVyLkxPQ0FMX1RZUEU7Ci0JCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0KLQkJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJdG9wTGV2ZWxUeXBlcywKLQkJCQkJCWZsYWdzLAotCQkJCQkJdGhpcy5wYXJzZXIucHJvYmxlbVJlcG9ydGVyKCksIAotCQkJCQkJcmVzdWx0KTsKLQotCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCAmJiBwYXJzZWRVbml0LnR5cGVzICE9IG51bGwpIHsKLQkJCQlpZihERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNFTEVDVElPTiAtIERpZXQgQVNUIDoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VkVW5pdC50b1N0cmluZygpKTsKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBudWxsOworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG51bGw7CisJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGN1ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJCWlmIChjdSAhPSBudWxsKSB7CisJCQkgCUlUeXBlW10gdG9wTGV2ZWxUeXBlcyA9IGN1LmdldFR5cGVzKCk7CisJCQkgCWludCBsZW5ndGggPSB0b3BMZXZlbFR5cGVzLmxlbmd0aDsKKwkJCSAJU291cmNlVHlwZUVsZW1lbnRJbmZvW10gdG9wTGV2ZWxJbmZvcyA9IG5ldyBTb3VyY2VUeXBlRWxlbWVudEluZm9bbGVuZ3RoXTsKKwkJCSAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQl0b3BMZXZlbEluZm9zW2ldID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgKChTb3VyY2VUeXBlKXRvcExldmVsVHlwZXNbaV0pLmdldEVsZW1lbnRJbmZvKCk7CiAJCQkJfQotCQkJCS8vIGZpbmQgdGhlIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgb3JpZ2luYWwgc291cmNlIHR5cGUKLQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBuZXcgQVNUTm9kZUZpbmRlcihwYXJzZWRVbml0KS5maW5kVHlwZSh0eXBlSGFuZGxlKTsKLQotCQkJCWlmICh0eXBlRGVjbCAhPSBudWxsKSB7Ci0KLQkJCQkJLy8gYWRkIGZha2UgZmllbGQgd2l0aCB0aGUgdHlwZSB3ZSdyZSBsb29raW5nIGZvcgotCQkJCQkvLyBub3RlOiBzaW5jZSB3ZSBkaWRuJ3QgYXNrIGZvciBmaWVsZHMgYWJvdmUsIHRoZXJlIGlzIG5vIGZpZWxkIGRlZmluZWQgeWV0Ci0JCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOwotCQkJCQlpbnQgZG90OwotCQkJCQlpZiAoKGRvdCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCB0eXBlTmFtZSkpID09IC0xKSB7Ci0JCQkJCQl0aGlzLnNlbGVjdGVkSWRlbnRpZmllciA9IHR5cGVOYW1lOwotCQkJCQkJZmllbGQudHlwZSA9IG5ldyBTZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UodHlwZU5hbWUsIC0xKTsKLQkJCQkJCS8vIHBvc2l0aW9uIG5vdCB1c2VkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZU5hbWUsIDAsIGRvdCk7Ci0JCQkJCQljaGFyW10gc2VsZWN0aW9uSWRlbnRpZmllciA9Ci0JCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0eXBlTmFtZSwgZG90ICsgMSwgdHlwZU5hbWUubGVuZ3RoKTsKLQkJCQkJCXRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyID0gc2VsZWN0aW9uSWRlbnRpZmllcjsKLQkJCQkJCWZpZWxkLnR5cGUgPQotCQkJCQkJCW5ldyBTZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCi0JCQkJCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsCi0JCQkJCQkJCXNlbGVjdGlvbklkZW50aWZpZXIsCi0JCQkJCQkJCW5ldyBsb25nW3ByZXZpb3VzSWRlbnRpZmllcnMubGVuZ3RoICsgMV0pOworCQkJCUlTb3VyY2VUeXBlIG91dGVyVHlwZUluZm8gPSAoSVNvdXJjZVR5cGUpICgoU291cmNlVHlwZSkgb3V0ZXJUeXBlKS5nZXRFbGVtZW50SW5mbygpOworCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChvdXRlclR5cGVJbmZvLmdldEZpbGVOYW1lKCksIDEsIDEsIHRoaXMuY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCQkJaW50IGZsYWdzID0gU291cmNlVHlwZUNvbnZlcnRlci5GSUVMRF9BTkRfTUVUSE9EIHwgU291cmNlVHlwZUNvbnZlcnRlci5NRU1CRVJfVFlQRTsKKwkJCQlpZiAoY29udGV4dC5pc0Fub255bW91cygpIHx8IGNvbnRleHQuaXNMb2NhbCgpKQorCQkJCQlmbGFncyB8PSBTb3VyY2VUeXBlQ29udmVydGVyLkxPQ0FMX1RZUEU7CisJCQkJcGFyc2VkVW5pdCA9CisJCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQkJCQkJdG9wTGV2ZWxJbmZvcywKKwkJCQkJCQlmbGFncywKKwkJCQkJCQl0aGlzLnBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKSwKKwkJCQkJCQlyZXN1bHQpOworCQkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwgJiYgcGFyc2VkVW5pdC50eXBlcyAhPSBudWxsKSB7CisJCQkJCWlmKERFQlVHKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNFTEVDVElPTiAtIERpZXQgQVNUIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHBhcnNlZFVuaXQudG9TdHJpbmcoKSk7CiAJCQkJCX0KLQkJCQkJZmllbGQubmFtZSA9ICI8ZmFrZUZpZWxkPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0eXBlRGVjbC5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltdIHsgZmllbGQgfTsKLQotCQkJCQkvLyBidWlsZCBiaW5kaW5ncwotCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIG51bGwgLypubyBhY2Nlc3MgcmVzdHJpY3Rpb24qLyk7Ci0JCQkJCWlmICgodGhpcy51bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIGJ1aWxkIGZpZWxkcwotCQkJCQkJCS8vIG5vdGU6IHRoaXMgYnVpbGRzIGZpZWxkcyBvbmx5IGluIHRoZSBwYXJzZWQgdW5pdCAodGhlIGJ1aWxkRmllbGRzQW5kTWV0aG9kcyBmbGFnIGlzIG5vdCBwYXNzZWQgYWxvbmcpCi0JCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCB0cnVlKTsKLQotCQkJCQkJCS8vIHJlc29sdmUKLQkJCQkJCQlwYXJzZWRVbml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOwotCQkJCQkJCXBhcnNlZFVuaXQucmVzb2x2ZSgpOwotCQkJCQkJfSBjYXRjaCAoU2VsZWN0aW9uTm9kZUZvdW5kIGUpIHsKLQkJCQkJCQlpZiAoZS5iaW5kaW5nICE9IG51bGwpIHsKLQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU0VMRUNUSU9OIC0gU2VsZWN0aW9uIGJpbmRpbmcgOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5iaW5kaW5nLnRvU3RyaW5nKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIGlmIG51bGwgdGhlbiB3ZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIHNlbGVjdGlvbiBub2RlCi0JCQkJCQkJCXNlbGVjdEZyb20oZS5iaW5kaW5nLCBwYXJzZWRVbml0LCBlLmlzRGVjbGFyYXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQorCQkJCQkvLyBmaW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSB0eXBlCisJCQkJCXR5cGVEZWNsYXJhdGlvbiA9IG5ldyBBU1ROb2RlRmluZGVyKHBhcnNlZFVuaXQpLmZpbmRUeXBlKGNvbnRleHQpOwogCQkJCX0KKwkJCX0gZWxzZSB7IC8vIGJpbmFyeSB0eXBlCisJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIGNvbnRleHQuZ2V0Q2xhc3NGaWxlKCk7CisJCQkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IChDbGFzc0ZpbGVSZWFkZXIpIGNsYXNzRmlsZS5nZXRCaW5hcnlUeXBlSW5mbygoSUZpbGUpIGNsYXNzRmlsZS5yZXNvdXJjZSgpLCBmYWxzZS8qZG9uJ3QgZnVsbHkgaW5pdGlhbGl6ZSBzbyBhcyB0byBrZWVwIGNvbnN0YW50IHBvb2wgKHVzZWQgYmVsb3cpKi8pOworCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChyZWFkZXIuZ2V0RmlsZU5hbWUoKSwgMSwgMSwgdGhpcy5jb21waWxlck9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCQlwYXJzZWRVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHRoaXMucGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLCByZXN1bHQsIDApOworCQkJCUhhc2hTZXRPZkNoYXJBcnJheUFycmF5IHR5cGVOYW1lcyA9IG5ldyBIYXNoU2V0T2ZDaGFyQXJyYXlBcnJheSgpOworCisJCQkJQmluYXJ5VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQmluYXJ5VHlwZUNvbnZlcnRlcih0aGlzLnBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKSwgcmVzdWx0LCB0eXBlTmFtZXMpOworCQkJCXR5cGVEZWNsYXJhdGlvbiA9IGNvbnZlcnRlci5idWlsZFR5cGVEZWNsYXJhdGlvbihjb250ZXh0LCBwYXJzZWRVbml0KTsKKwkJCQlwYXJzZWRVbml0LmltcG9ydHMgPSBjb252ZXJ0ZXIuYnVpbGRJbXBvcnRzKHJlYWRlcik7CiAJCQl9Ci0JCQkvLyBvbmx5IHJlYWNoZXMgaGVyZSBpZiBubyBzZWxlY3Rpb24gY291bGQgYmUgZGVyaXZlZCBmcm9tIHRoZSBwYXJzZWQgdHJlZQotCQkJLy8gdGh1cyB1c2UgdGhlIHNlbGVjdGVkIHNvdXJjZSBhbmQgcGVyZm9ybSBhIHRleHR1YWwgdHlwZSBzZWFyY2gKLQkJCWlmICghdGhpcy5hY2NlcHRlZEFuc3dlciAmJiBzZWFyY2hJbkVudmlyb25tZW50KSB7Ci0JCQkJaWYgKHRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyICE9IG51bGwpIHsKLQkJCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHR5cGVOYW1lLCBmYWxzZSwgZmFsc2UsIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIHRoaXMpOwotCQkJCQkKLQkJCQkJLy8gYWNjZXB0IHF1YWxpZmllZCB0eXBlcyBvbmx5IGlmIG5vIHVucXVhbGlmaWVkIHR5cGUgd2FzIGFjY2VwdGVkCi0JCQkJCWlmKCF0aGlzLmFjY2VwdGVkQW5zd2VyKSB7Ci0JCQkJCQlhY2NlcHRRdWFsaWZpZWRUeXBlcygpOworCisJCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKworCQkJCS8vIGFkZCBmYWtlIGZpZWxkIHdpdGggdGhlIHR5cGUgd2UncmUgbG9va2luZyBmb3IKKwkJCQkvLyBub3RlOiBzaW5jZSB3ZSBkaWRuJ3QgYXNrIGZvciBmaWVsZHMgYWJvdmUsIHRoZXJlIGlzIG5vIGZpZWxkIGRlZmluZWQgeWV0CisJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7CisJCQkJaW50IGRvdDsKKwkJCQlpZiAoKGRvdCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCB0eXBlTmFtZSkpID09IC0xKSB7CisJCQkJCXRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyID0gdHlwZU5hbWU7CisJCQkJCWZpZWxkLnR5cGUgPSBuZXcgU2VsZWN0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKHR5cGVOYW1lLCAtMSk7CisJCQkJCS8vIHBvc2l0aW9uIG5vdCB1c2VkCisJCQkJfSBlbHNlIHsKKwkJCQkJY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCAwLCBkb3QpOworCQkJCQljaGFyW10gc2VsZWN0aW9uSWRlbnRpZmllciA9CisJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVOYW1lLCBkb3QgKyAxLCB0eXBlTmFtZS5sZW5ndGgpOworCQkJCQl0aGlzLnNlbGVjdGVkSWRlbnRpZmllciA9IHNlbGVjdGlvbklkZW50aWZpZXI7CisJCQkJCWZpZWxkLnR5cGUgPQorCQkJCQkJbmV3IFNlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKKwkJCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLAorCQkJCQkJCXNlbGVjdGlvbklkZW50aWZpZXIsCisJCQkJCQkJbmV3IGxvbmdbcHJldmlvdXNJZGVudGlmaWVycy5sZW5ndGggKyAxXSk7CisJCQkJfQorCQkJCWZpZWxkLm5hbWUgPSAiPGZha2VGaWVsZD4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0eXBlRGVjbGFyYXRpb24uZmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bXSB7IGZpZWxkIH07CisKKwkJCQkvLyBidWlsZCBiaW5kaW5ncworCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgbnVsbCAvKm5vIGFjY2VzcyByZXN0cmljdGlvbiovKTsKKwkJCQlpZiAoKHRoaXMudW5pdFNjb3BlID0gcGFyc2VkVW5pdC5zY29wZSkgIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJLy8gYnVpbGQgZmllbGRzCisJCQkJCQkvLyBub3RlOiB0aGlzIGJ1aWxkcyBmaWVsZHMgb25seSBpbiB0aGUgcGFyc2VkIHVuaXQgKHRoZSBidWlsZEZpZWxkc0FuZE1ldGhvZHMgZmxhZyBpcyBub3QgcGFzc2VkIGFsb25nKQorCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCB0cnVlKTsKKworCQkJCQkJLy8gcmVzb2x2ZQorCQkJCQkJcGFyc2VkVW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKKwkJCQkJCXBhcnNlZFVuaXQucmVzb2x2ZSgpOworCQkJCQl9IGNhdGNoIChTZWxlY3Rpb25Ob2RlRm91bmQgZSkgeworCQkJCQkJaWYgKGUuYmluZGluZyAhPSBudWxsKSB7CisJCQkJCQkJaWYoREVCVUcpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RJT04gLSBTZWxlY3Rpb24gYmluZGluZyA6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuYmluZGluZy50b1N0cmluZygpKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgc2VsZWN0aW9uIG5vZGUKKwkJCQkJCQlzZWxlY3RGcm9tKGUuYmluZGluZywgcGFyc2VkVW5pdCwgZS5pc0RlY2xhcmF0aW9uKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTExNzksNyArMTQ0Nyw3IEBACiAJCQl9CiAJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeyAvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24gZm9yIG5vdyBzaW5jZSBpdCB0eXBpY2FsbHkgbWVhbnMgd2UgY2Fubm90IGZpbmQgamF2YS5sYW5nLk9iamVjdAogCQl9IGZpbmFsbHkgewotCQkJcmVzZXQoKTsKKwkJCXJlc2V0KHRydWUpOwogCQl9CiAJfQogCkBAIC0xMTg4LDkgKzE0NTYsOSBAQAogCiAJCS8vIHRoZSBzZWxlY3RlZCBpZGVudGlmaWVyIGlzIG5vdCBpZGVudGljYWwgdG8gdGhlIHBhcnNlciBvbmUgKGVxdWFscyBidXQgbm90IGlkZW50aWNhbCksCiAJCS8vIGZvciB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLCB0aGUgcGFyc2VyIGFzc2lzdCBpZGVudGlmaWVyIGlzIG5lY2Vzc2FyeSBmb3IgaWRlbnRpdGl5IGNoZWNrcwotCQljaGFyW10gYXNzaXN0SWRlbnRpZmllciA9IHRoaXMuZ2V0UGFyc2VyKCkuYXNzaXN0SWRlbnRpZmllcigpOworCQljaGFyW10gYXNzaXN0SWRlbnRpZmllciA9IGdldFBhcnNlcigpLmFzc2lzdElkZW50aWZpZXIoKTsKIAkJaWYgKGFzc2lzdElkZW50aWZpZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKKwogCQlJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UgPSBjb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2U7CiAJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGN1cnJlbnRQYWNrYWdlID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY3VycmVudFBhY2thZ2UudG9rZW5zLCAnLicpOwogCQkvLyBpdGVyYXRlIG92ZXIgdGhlIHR5cGVzCkBAIC0xMjA0LDE3ICsxNDcyLDE3IEBACiAKIAkvLyBDaGVjayBpZiBhIGRlY2xhcmF0aW9uIGdvdCBzZWxlY3RlZCBpbiB0aGlzIHR5cGUKIAlwcml2YXRlIGJvb2xlYW4gc2VsZWN0RGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgY2hhcltdIGFzc2lzdElkZW50aWZpZXIsIGNoYXJbXSBwYWNrYWdlTmFtZSl7Ci0JCisKIAkJaWYgKHR5cGVEZWNsYXJhdGlvbi5uYW1lID09IGFzc2lzdElkZW50aWZpZXIpewogCQkJY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUgPSBudWxsOwotCQkJCisKIAkJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlID0gdHlwZURlY2xhcmF0aW9uOwogCQkJd2hpbGUoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CiAJCQkJcXVhbGlmaWVkU291cmNlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUubmFtZSwgcXVhbGlmaWVkU291cmNlTmFtZSwgJy4nKTsKIAkJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlOwogCQkJfQogCQkJY2hhcltdIHVuaXF1ZUtleSA9IHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nICE9IG51bGwgPyB0eXBlRGVjbGFyYXRpb24uYmluZGluZy5jb21wdXRlVW5pcXVlS2V5KCkgOiBudWxsOwotCQkJCisKIAkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFR5cGUoCiAJCQkJcGFja2FnZU5hbWUsCiAJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKQEAgLTEyMjMsNyArMTQ5MSw3IEBACiAJCQkJdW5pcXVlS2V5LAogCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uU3RhcnQsCiAJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25FbmQpOwotCQkJCisKIAkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KQEAgLTEyMzYsNyArMTUwNCw3IEBACiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewogCQkJaWYgKGZpZWxkc1tpXS5uYW1lID09IGFzc2lzdElkZW50aWZpZXIpewogCQkJCWNoYXJbXSBxdWFsaWZpZWRTb3VyY2VOYW1lID0gbnVsbDsKLQkJCQkKKwogCQkJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlID0gdHlwZURlY2xhcmF0aW9uOwogCQkJCXdoaWxlKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgewogCQkJCQlxdWFsaWZpZWRTb3VyY2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZW5jbG9zaW5nVHlwZS5uYW1lLCBxdWFsaWZpZWRTb3VyY2VOYW1lLCAnLicpOwpAQCAtMTI1OSwxNiArMTUyNywxNiBAQAogCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kcyA9PSBudWxsID8gMCA6IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewogCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCisKIAkJCWlmIChtZXRob2Quc2VsZWN0b3IgPT0gYXNzaXN0SWRlbnRpZmllcil7CiAJCQkJY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUgPSBudWxsOwotCQkJCQorCiAJCQkJVHlwZURlY2xhcmF0aW9uIGVuY2xvc2luZ1R5cGUgPSB0eXBlRGVjbGFyYXRpb247CiAJCQkJd2hpbGUoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CiAJCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlLm5hbWUsIHF1YWxpZmllZFNvdXJjZU5hbWUsICcuJyk7CiAJCQkJCWVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLmVuY2xvc2luZ1R5cGU7CiAJCQkJfQotCQkJCQorCiAJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAogCQkJCQlwYWNrYWdlTmFtZSwKIAkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKQEAgLTEyODQsMjQgKzE1NTIsMjQgQEAKIAkJCQkJbWV0aG9kLmJpbmRpbmcgIT0gbnVsbCA/IG1ldGhvZC5iaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoKSA6IG51bGwsCiAJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uU3RhcnQsCiAJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uRW5kKTsKLQkJCQkKKwogCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJCisKIAkJCVR5cGVQYXJhbWV0ZXJbXSBtZXRob2RUeXBlUGFyYW1ldGVycyA9IG1ldGhvZC50eXBlUGFyYW1ldGVycygpOwogCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBtZXRob2RUeXBlUGFyYW1ldGVycyA9PSBudWxsID8gMCA6IG1ldGhvZFR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKyl7CiAJCQkJVHlwZVBhcmFtZXRlciBtZXRob2RUeXBlUGFyYW1ldGVyID0gbWV0aG9kVHlwZVBhcmFtZXRlcnNbal07Ci0JCQkJCisKIAkJCQlpZihtZXRob2RUeXBlUGFyYW1ldGVyLm5hbWUgPT0gYXNzaXN0SWRlbnRpZmllcikgewogCQkJCQljaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSA9IG51bGw7Ci0JCQkJCQorCiAJCQkJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlID0gdHlwZURlY2xhcmF0aW9uOwogCQkJCQl3aGlsZShlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKIAkJCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlLm5hbWUsIHF1YWxpZmllZFNvdXJjZU5hbWUsICcuJyk7CiAJCQkJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlOwogCQkJCQl9Ci0JCQkJCQorCiAJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdE1ldGhvZFR5cGVQYXJhbWV0ZXIoCiAJCQkJCQlwYWNrYWdlTmFtZSwKIAkJCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUsCkBAIC0xMzEyLDI1ICsxNTgwLDI1IEBACiAJCQkJCQl0cnVlLAogCQkJCQkJdGhpcy5hY3R1YWxTZWxlY3Rpb25TdGFydCwKIAkJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uRW5kKTsKLQkJCQkJCisKIAkJCQkJdGhpcy5ub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSB0eXBlRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlUGFyYW1ldGVycyA9PSBudWxsID8gMCA6IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKIAkJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2ldOwogCQkJaWYodHlwZVBhcmFtZXRlci5uYW1lID09IGFzc2lzdElkZW50aWZpZXIpIHsKIAkJCQljaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSA9IG51bGw7Ci0JCQkJCisKIAkJCQlUeXBlRGVjbGFyYXRpb24gZW5jbG9zaW5nVHlwZSA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJCQl3aGlsZShlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKIAkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUubmFtZSwgcXVhbGlmaWVkU291cmNlTmFtZSwgJy4nKTsKIAkJCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZTsKIAkJCQl9Ci0JCQkJCisKIAkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUGFyYW1ldGVyKAogCQkJCQlwYWNrYWdlTmFtZSwKIAkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKQEAgLTEzMzgsMTIgKzE2MDYsMjAwIEBACiAJCQkJCXRydWUsCiAJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uU3RhcnQsCiAJCQkJCXRoaXMuYWN0dWFsU2VsZWN0aW9uRW5kKTsKLQkJCQkKKwogCQkJCXRoaXMubm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9Ci0JCQorCiAJCXJldHVybiBmYWxzZTsKIAl9CisJCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IG1ldGhvZCBiaW5kaW5nIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgb24gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbgorCSAqIG9yIG9uIHRoZSBpbmhlcml0RG9jIHRhZyBpbiBpdHMgamF2YWRvYy4KKwkgKi8KKwlwcml2YXRlIE1ldGhvZEJpbmRpbmcgZ2V0Q29ycmVjdE1ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyBiaW5kaW5nKSB7CisJCWlmICh0aGlzLnBhcnNlci5qYXZhZG9jUGFyc2VyIGluc3RhbmNlb2YgU2VsZWN0aW9uSmF2YWRvY1BhcnNlcikgeworCQkJaWYgKCgoU2VsZWN0aW9uSmF2YWRvY1BhcnNlcil0aGlzLnBhcnNlci5qYXZhZG9jUGFyc2VyKS5pbmhlcml0RG9jVGFnU2VsZWN0ZWQpeworCQkJCXRyeSB7CisJCQkJCU9iamVjdCByZXMgPSBmaW5kTWV0aG9kV2l0aEF0dGFjaGVkRG9jSW5IaWVyYXJjaHkoYmluZGluZyk7CisJCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSB7CisJCQkJCQlyZXR1cm4gKE1ldGhvZEJpbmRpbmcpIHJlczsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gYmluZGluZzsKKwl9CisJCisJcHJvdGVjdGVkIE1ldGhvZEJpbmRpbmcgZmluZE92ZXJyaWRkZW5NZXRob2RJblR5cGUoUmVmZXJlbmNlQmluZGluZyBvdmVycmlkZGVuVHlwZSwgTWV0aG9kQmluZGluZyBvdmVycmlkaW5nKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKG92ZXJyaWRkZW5UeXBlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTWV0aG9kQmluZGluZ1tdIG92ZXJyaWRkZW5NZXRob2RzPSBvdmVycmlkZGVuVHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCUxvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudiA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQ7CisJCWlmIChsb29rdXBFbnYgIT0gbnVsbCAmJiBvdmVycmlkZGVuTWV0aG9kcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgb3ZlcnJpZGRlbk1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobG9va3VwRW52Lm1ldGhvZFZlcmlmaWVyKCkuaXNNZXRob2RTdWJzaWduYXR1cmUob3ZlcnJpZGluZywgb3ZlcnJpZGRlbk1ldGhvZHNbaV0pKSB7CisJCQkJCXJldHVybiBvdmVycmlkZGVuTWV0aG9kc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgT2JqZWN0IGZpbmRNZXRob2RXaXRoQXR0YWNoZWREb2NJbkhpZXJhcmNoeShmaW5hbCBNZXRob2RCaW5kaW5nIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZT0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzOworCQlmaW5hbCBTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yMSA9IChTZWxlY3Rpb25SZXF1ZXN0b3IpIHRoaXMucmVxdWVzdG9yOworCQlyZXR1cm4gbmV3IEluaGVyaXREb2NWaXNpdG9yKCkgeworCQkJcHVibGljIE9iamVjdCB2aXNpdChSZWZlcmVuY2VCaW5kaW5nIGN1cnJUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQlNZXRob2RCaW5kaW5nIG92ZXJyaWRkZW4gPSAgZmluZE92ZXJyaWRkZW5NZXRob2RJblR5cGUoY3VyclR5cGUsIG1ldGhvZCk7CisJCQkJaWYgKG92ZXJyaWRkZW4gPT0gbnVsbCkKKwkJCQkJcmV0dXJuIEluaGVyaXREb2NWaXNpdG9yLkNPTlRJTlVFOworCQkJCVR5cGVCaW5kaW5nIGFyZ3NbXSA9IG92ZXJyaWRkZW4ucGFyYW1ldGVyczsKKwkJCQlTdHJpbmcgbmFtZXNbXSA9IG5ldyBTdHJpbmdbYXJncy5sZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJCQluYW1lc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKGFyZ3NbaV0uc291cmNlTmFtZSgpLCBmYWxzZSk7CisJCQkJfQorCQkJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpIHJlcXVlc3RvcjEuZmluZE1ldGhvZEZyb21CaW5kaW5nKG92ZXJyaWRkZW4sIG5hbWVzLCBvdmVycmlkZGVuLmRlY2xhcmluZ0NsYXNzKTsKKwkJCQlpZiAobWVtYmVyID09IG51bGwpCisJCQkJCXJldHVybiBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRTsKKwkJCQlpZiAobWVtYmVyLmdldEF0dGFjaGVkSmF2YWRvYyhudWxsKSAhPSBudWxsICkgeyAgCisJCQkJCS8vIGZvciBiaW5hcnkgbWV0aG9kcyB3aXRoIGF0dGFjaGVkIGphdmFkb2MgYW5kIG5vIHNvdXJjZSBhdHRhY2hlZAorCQkJCQlyZXR1cm4gb3ZlcnJpZGRlbjsKKwkJCQl9CisJCQkJSU9wZW5hYmxlIG9wZW5hYmxlID0gbWVtYmVyLmdldE9wZW5hYmxlKCk7CisJCQkJaWYgKG9wZW5hYmxlID09IG51bGwpCisJCQkJCXJldHVybiBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRTsKKwkJCQlJQnVmZmVyIGJ1Zj0gb3BlbmFibGUuZ2V0QnVmZmVyKCk7CisJCQkJaWYgKGJ1ZiA9PSBudWxsKSB7CisJCQkJCS8vIG5vIHNvdXJjZSBhdHRhY2htZW50IGZvdW5kLiBUaGlzIG1ldGhvZCBtYXliZSB0aGUgb25lLiBTdG9wLgorCQkJCQlyZXR1cm4gSW5oZXJpdERvY1Zpc2l0b3IuU1RPUF9CUkFOQ0g7CisJCQkJfQorCisJCQkJSVNvdXJjZVJhbmdlIGphdmFkb2NSYW5nZT0gbWVtYmVyLmdldEphdmFkb2NSYW5nZSgpOworCQkJCWlmIChqYXZhZG9jUmFuZ2UgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIEluaGVyaXREb2NWaXNpdG9yLkNPTlRJTlVFOwkvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IGhhdmUgamF2YWRvYywgY29udGludWUgdG8gbG9vay4KKwkJCQlTdHJpbmcgcmF3SmF2YWRvYz0gYnVmLmdldFRleHQoamF2YWRvY1JhbmdlLmdldE9mZnNldCgpLCBqYXZhZG9jUmFuZ2UuZ2V0TGVuZ3RoKCkpOworCQkJCWlmIChyYXdKYXZhZG9jICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG92ZXJyaWRkZW47CisJCQkJfQorCQkJCXJldHVybiBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRTsKKwkJCX0KKwkJfS52aXNpdEluaGVyaXREb2ModHlwZSk7CisJfQorCQorCS8qKgorCSAqIEltcGxlbWVudHMgdGhlICJBbGdvcml0aG0gZm9yIEluaGVyaXRpbmcgTWV0aG9kIENvbW1lbnRzIiBhcyBzcGVjaWZpZWQgZm9yCisJICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvdG9vbGRvY3Mvc29sYXJpcy9qYXZhZG9jLmh0bWwjaW5oZXJpdGluZ2NvbW1lbnRzIj4xLjQuMjwvYT4sCisJICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvd2luZG93cy9qYXZhZG9jLmh0bWwjaW5oZXJpdGluZ2NvbW1lbnRzIj4xLjU8L2E+LCBhbmQKKwkgKiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL3Rvb2xzL3dpbmRvd3MvamF2YWRvYy5odG1sI2luaGVyaXRpbmdjb21tZW50cyI+MS42PC9hPi4KKwkgKgorCSAqIDxwPgorCSAqIFVuZm9ydHVuYXRlbHksIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4gaW4gSmF2YWRvYyBpbXBsZW1lbnRhdGlvbnMgc2luY2UgMS41LCBzZWUKKwkgKiA8YSBocmVmPSJodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD02Mzc2OTU5Ij5TdW4ncyBidWc8L2E+LgorCSAqIDwvcD4KKwkgKgorCSAqIDxwPgorCSAqIFdlIGFkaGVyZSB0byB0aGUgc3BlYy4KKwkgKiA8L3A+CisJICovCisJc3RhdGljIGFic3RyYWN0IGNsYXNzIEluaGVyaXREb2NWaXNpdG9yIHsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUF9CUkFOQ0g9IG5ldyBPYmplY3QoKSB7CisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIlNUT1BfQlJBTkNIIjsgfSAvLyROT04tTkxTLTEkCisJCX07CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IENPTlRJTlVFPSBuZXcgT2JqZWN0KCkgeworCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJDT05USU5VRSI7IH0gLy8kTk9OLU5MUy0xJAorCQl9OworCisJCS8qKgorCQkgKiBWaXNpdHMgYSB0eXBlIGFuZCBkZWNpZGVzIGhvdyB0aGUgdmlzaXRvciBzaG91bGQgcHJvY2VlZC4KKwkJICoKKwkJICogQHBhcmFtIGN1cnJUeXBlIHRoZSBjdXJyZW50IHR5cGUKKwkJICogQHJldHVybiA8dWw+CisJCSAqICAgICAgICAgPGxpPntAbGluayAjU1RPUF9CUkFOQ0h9IHRvIGluZGljYXRlIHRoYXQgbm8gSmF2YWRvYyBoYXMgYmVlbiBmb3VuZCBhbmQgdmlzaXRpbmcKKwkJICogICAgICAgICBzdXBlciB0eXBlcyBzaG91bGQgc3RvcCBoZXJlPC9saT4KKwkJICogICAgICAgICA8bGk+e0BsaW5rICNDT05USU5VRX0gdG8gaW5kaWNhdGUgdGhhdCBubyBKYXZhZG9jIGhhcyBiZWVuIGZvdW5kIGFuZCB2aXNpdGluZworCQkgKiAgICAgICAgIHN1cGVyIHR5cGVzIHNob3VsZCBjb250aW51ZTwvbGk+CisJCSAqICAgICAgICAgPGxpPmFuIHtAbGluayBPYmplY3R9IG9yIDxjb2RlPm51bGw8L2NvZGU+LCB0byBpbmRpY2F0ZSB0aGF0IHZpc2l0aW5nIHNob3VsZCBiZQorCQkgKiAgICAgICAgIGNhbmNlbGxlZCBpbW1lZGlhdGVseS4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YKKwkJICogICAgICAgICB7QGxpbmsgI3Zpc2l0SW5oZXJpdERvYyhSZWZlcmVuY2VCaW5kaW5nKX08L2xpPgorCQkgKiAgICAgICAgIDwvdWw+CisJCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHVuZXhwZWN0ZWQgcHJvYmxlbQorCQkgKiBAc2VlICN2aXNpdEluaGVyaXREb2MoUmVmZXJlbmNlQmluZGluZykKKwkJICovCisJCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgdmlzaXQoUmVmZXJlbmNlQmluZGluZyBjdXJyVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCQkvKioKKwkJICogVmlzaXRzIHRoZSBzdXBlciB0eXBlcyBvZiB0aGUgZ2l2ZW4gPGNvZGU+Y3VycmVudFR5cGU8L2NvZGU+LgorCQkgKgorCQkgKiBAcGFyYW0gY3VycmVudFR5cGUgdGhlIHN0YXJ0aW5nIHR5cGUKKwkJICogQHJldHVybiB0aGUgcmVzdWx0IGZyb20gYSBjYWxsIHRvIHtAbGluayAjdmlzaXQoUmVmZXJlbmNlQmluZGluZyl9LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIG9mCisJCSAqICAgICAgICAgdGhlIGNhbGxzIHJldHVybmVkIGEgcmVzdWx0CisJCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHVuZXhwZWN0ZWQgcHJvYmxlbQorCQkgKi8KKwkJcHVibGljIE9iamVjdCB2aXNpdEluaGVyaXREb2MoUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQlBcnJheUxpc3QgdmlzaXRlZD0gbmV3IEFycmF5TGlzdCgpOworCQkJdmlzaXRlZC5hZGQoY3VycmVudFR5cGUpOworCQkJT2JqZWN0IHJlc3VsdD0gdmlzaXRJbmhlcml0RG9jSW50ZXJmYWNlcyh2aXNpdGVkLCBjdXJyZW50VHlwZSk7CisJCQlpZiAocmVzdWx0ICE9IEluaGVyaXREb2NWaXNpdG9yLkNPTlRJTlVFKQorCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJDbGFzcz0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOworCisJCQl3aGlsZSAoc3VwZXJDbGFzcyAhPSBudWxsICYmICEgdmlzaXRlZC5jb250YWlucyhzdXBlckNsYXNzKSkgeworCQkJCXJlc3VsdD0gdmlzaXQoc3VwZXJDbGFzcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBJbmhlcml0RG9jVmlzaXRvci5TVE9QX0JSQU5DSCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRSkgeworCQkJCQl2aXNpdGVkLmFkZChzdXBlckNsYXNzKTsKKwkJCQkJcmVzdWx0PSB2aXNpdEluaGVyaXREb2NJbnRlcmZhY2VzKHZpc2l0ZWQsIHN1cGVyQ2xhc3MpOworCQkJCQlpZiAocmVzdWx0ICE9IEluaGVyaXREb2NWaXNpdG9yLkNPTlRJTlVFKQorCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJZWxzZQorCQkJCQkJc3VwZXJDbGFzcz0gc3VwZXJDbGFzcy5zdXBlcmNsYXNzKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIFZpc2l0cyB0aGUgc3VwZXIgaW50ZXJmYWNlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBpbiB0aGUgZ2l2ZW4gaGllcmFyY2h5LCB0aGVyZWJ5IHNraXBwaW5nIGFscmVhZHkgdmlzaXRlZCB0eXBlcy4KKwkJICogCisJCSAqIEBwYXJhbSB2aXNpdGVkIHNldCBvZiB2aXNpdGVkIHR5cGVzCisJCSAqIEBwYXJhbSBjdXJyZW50VHlwZSB0eXBlIHdob3NlIHN1cGVyIGludGVyZmFjZXMgc2hvdWxkIGJlIHZpc2l0ZWQKKwkJICogQHJldHVybiB0aGUgcmVzdWx0LCBvciB7QGxpbmsgI0NPTlRJTlVFfSBpZiBubyByZXN1bHQgaGFzIGJlZW4gZm91bmQKKwkJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gdW5leHBlY3RlZCBwcm9ibGVtCisJCSAqLworCQlwcml2YXRlIE9iamVjdCB2aXNpdEluaGVyaXREb2NJbnRlcmZhY2VzKEFycmF5TGlzdCB2aXNpdGVkLCBSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCUFycmF5TGlzdCB0b1Zpc2l0Q2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXM9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJZm9yIChpbnQgaT0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2U9IHN1cGVySW50ZXJmYWNlc1tpXTsKKwkJCQlpZiAodmlzaXRlZC5jb250YWlucyhzdXBlckludGVyZmFjZSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXZpc2l0ZWQuYWRkKHN1cGVySW50ZXJmYWNlKTsKKwkJCQlPYmplY3QgcmVzdWx0PSB2aXNpdChzdXBlckludGVyZmFjZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBJbmhlcml0RG9jVmlzaXRvci5TVE9QX0JSQU5DSCkgeworCQkJCQkvL3NraXAKKwkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRSkgeworCQkJCQl0b1Zpc2l0Q2hpbGRyZW4uYWRkKHN1cGVySW50ZXJmYWNlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJCWZvciAoSXRlcmF0b3IgaXRlcj0gdG9WaXNpdENoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGNoaWxkPSAoUmVmZXJlbmNlQmluZGluZykgaXRlci5uZXh0KCk7CisJCQkJT2JqZWN0IHJlc3VsdD0gdmlzaXRJbmhlcml0RG9jSW50ZXJmYWNlcyh2aXNpdGVkLCBjaGlsZCk7CisJCQkJaWYgKHJlc3VsdCAhPSBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRSkKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCXJldHVybiBJbmhlcml0RG9jVmlzaXRvci5DT05USU5VRTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvVGhyb3duRXhjZXB0aW9uRmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1Rocm93bkV4Y2VwdGlvbkZpbmRlci5qYXZhCmluZGV4IDkyNTk4ZTQuLjNmNDAwNGUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvVGhyb3duRXhjZXB0aW9uRmluZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9UaHJvd25FeGNlcHRpb25GaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaHJvd1N0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRyeVN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlVuaW9uVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsYXRpb25Vbml0U2NvcGU7CkBAIC0zMiwxNiArMzMsMjQgQEAKIAogCXByaXZhdGUgU2ltcGxlU2V0IHRocm93bkV4Y2VwdGlvbnM7CiAJcHJpdmF0ZSBTdGFjayBleGNlcHRpb25zU3RhY2s7Ci0JCi0JcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBmaW5kKFRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlwcml2YXRlIFNpbXBsZVNldCBjYXVnaHRFeGNlcHRpb25zOworCXByaXZhdGUgU2ltcGxlU2V0IGRpc2NvdXJhZ2VkRXhjZXB0aW9uczsKKworCS8qKgorCSAqIEZpbmRzIHRoZSB0aHJvd24gZXhjZXB0aW9ucyBtaW51cyB0aGUgb25lcyB0aGF0IGFyZSBhbHJlYWR5IGNhdWdodCBpbiBwcmV2aW91cyBjYXRjaCBibG9ja3MuCisJICogRXhjZXB0aW9uIGlzIGFscmVhZHkgY2F1Z2h0IGV2ZW4gaWYgaXRzIHN1cGVyIHR5cGUgaXMgYmVpbmcgY2F1Z2h0LiBBbHNvIGNvbXB1dGVzLCBzZXBhcmF0ZWx5LAorCSAqIGEgbGlzdCBjb21wcmlzaW5nIG9mIChhKXRob3NlIGV4Y2VwdGlvbnMgdGhhdCBoYXZlIGJlZW4gY2F1Z2h0IGFscmVhZHkgYW5kIChiKXRob3NlIGV4Y2VwdGlvbnMgdGhhdCBhcmUgdGhyb3duCisJICogYnkgdGhlIG1ldGhvZCBhbmQgd2hvc2Ugc3VwZXIgdHlwZSBoYXMgYmVlbiBjYXVnaHQgYWxyZWFkeS4gCisJICogQHBhcmFtIHRyeVN0YXRlbWVudAorCSAqIEBwYXJhbSBzY29wZQorCSAqLworCXB1YmxpYyB2b2lkIHByb2Nlc3NUaHJvd25FeGNlcHRpb25zKFRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gbmV3IFNpbXBsZVNldCgpOwogCQl0aGlzLmV4Y2VwdGlvbnNTdGFjayA9IG5ldyBTdGFjaygpOworCQl0aGlzLmNhdWdodEV4Y2VwdGlvbnMgPSBuZXcgU2ltcGxlU2V0KCk7CisJCXRoaXMuZGlzY291cmFnZWRFeGNlcHRpb25zID0gbmV3IFNpbXBsZVNldCgpOwogCQl0cnlTdGF0ZW1lbnQudHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQlyZW1vdmVDYXVnaHRFeGNlcHRpb25zKHRyeVN0YXRlbWVudCk7Ci0JCQotCQlSZWZlcmVuY2VCaW5kaW5nW10gcmVzdWx0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbdGhpcy50aHJvd25FeGNlcHRpb25zLmVsZW1lbnRTaXplXTsKLQkJdGhpcy50aHJvd25FeGNlcHRpb25zLmFzQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmVtb3ZlQ2F1Z2h0RXhjZXB0aW9ucyh0cnlTdGF0ZW1lbnQsIHRydWUgLypyZW1vdmUgdW5jaGVja2VkIGV4Y2VwdGlvbnMgdGhpcyB0aW1lKi8pOwogCX0KIAogCXByaXZhdGUgdm9pZCBhY2NlcHRFeGNlcHRpb24oUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nKSB7CkBAIC00OSw0NyArNTgsODMgQEAKIAkJCXRoaXMudGhyb3duRXhjZXB0aW9ucy5hZGQoYmluZGluZyk7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgQmxvY2tTY29wZSBzY29wZSkgewogCQlpZiAobWVzc2FnZVNlbmQuYmluZGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZFZpc2l0TWV0aG9kSW52b2NhdGlvbihtZXNzYWdlU2VuZC5iaW5kaW5nKTsKKwkJCWVuZFZpc2l0TWV0aG9kSW52b2NhdGlvbihtZXNzYWdlU2VuZC5iaW5kaW5nKTsKIAkJfQogCQlzdXBlci5lbmRWaXNpdChtZXNzYWdlU2VuZCwgc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWlmIChhbGxvY2F0aW9uRXhwcmVzc2lvbi5iaW5kaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuZW5kVmlzaXRNZXRob2RJbnZvY2F0aW9uKGFsbG9jYXRpb25FeHByZXNzaW9uLmJpbmRpbmcpOworCQkJZW5kVmlzaXRNZXRob2RJbnZvY2F0aW9uKGFsbG9jYXRpb25FeHByZXNzaW9uLmJpbmRpbmcpOwogCQl9CiAJCXN1cGVyLmVuZFZpc2l0KGFsbG9jYXRpb25FeHByZXNzaW9uLCBzY29wZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5hY2NlcHRFeGNlcHRpb24oKFJlZmVyZW5jZUJpbmRpbmcpdGhyb3dTdGF0ZW1lbnQuZXhjZXB0aW9uLnJlc29sdmVkVHlwZSk7CisJCWFjY2VwdEV4Y2VwdGlvbigoUmVmZXJlbmNlQmluZGluZyl0aHJvd1N0YXRlbWVudC5leGNlcHRpb24ucmVzb2x2ZWRUeXBlKTsKIAkJc3VwZXIuZW5kVmlzaXQodGhyb3dTdGF0ZW1lbnQsIHNjb3BlKTsKIAl9Ci0JCi0JCisKKwogCXByaXZhdGUgdm9pZCBlbmRWaXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25CaW5kaW5ncyA9IG1ldGhvZEJpbmRpbmcudGhyb3duRXhjZXB0aW9uczsKIAkJaW50IGxlbmd0aCA9IHRocm93bkV4Y2VwdGlvbkJpbmRpbmdzID09IG51bGwgPyAwIDogdGhyb3duRXhjZXB0aW9uQmluZGluZ3MubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmFjY2VwdEV4Y2VwdGlvbih0aHJvd25FeGNlcHRpb25CaW5kaW5nc1tpXSk7CisJCQlhY2NlcHRFeGNlcHRpb24odGhyb3duRXhjZXB0aW9uQmluZGluZ3NbaV0pOwogCQl9CiAJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB0aGUgYWxyZWFkeSBjYXVnaHQgZXhjZXB0aW9ucyBpbiBjYXRjaCBibG9ja3MsIGZvdW5kIGJ5IHRoZSBjYWxsIHRvCisJICoge0BsaW5rIFRocm93bkV4Y2VwdGlvbkZpbmRlciNwcm9jZXNzVGhyb3duRXhjZXB0aW9ucyhUcnlTdGF0ZW1lbnQsIEJsb2NrU2NvcGUpfQorCSAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiB0aG9zZSBleGNlcHRpb25zIHRoYXQgaGF2ZSBiZWVuIGNhdWdodCBhbHJlYWR5IGluIHByZXZpb3VzIGNhdGNoIG9yCisJICogbXVsdGktY2F0Y2ggYmxvY2tzIG9mIHRoZSBzYW1lIHRyeSBibG9jay4gKEV4Y2VwdGlvbnMgY2F1Z2h0IGluIGlubmVyIHRyeS1jYXRjaGVzIGFyZSBvYnRhaW5lZCB2aWEKKwkgKiB7QGxpbmsgVGhyb3duRXhjZXB0aW9uRmluZGVyI2dldERpc2NvdXJhZ2VkRXhjZXB0aW9ucygpfS4KKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIGdldEFscmVhZHlDYXVnaHRFeGNlcHRpb25zKCkgeworCQlSZWZlcmVuY2VCaW5kaW5nW10gYWxsQ2F1Z2h0RXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3RoaXMuY2F1Z2h0RXhjZXB0aW9ucy5lbGVtZW50U2l6ZV07CisJCXRoaXMuY2F1Z2h0RXhjZXB0aW9ucy5hc0FycmF5KGFsbENhdWdodEV4Y2VwdGlvbnMpOworCQlyZXR1cm4gYWxsQ2F1Z2h0RXhjZXB0aW9uczsKKwl9CiAJCisJLyoqCisJICogUmV0dXJucyBhbGwgdGhlIHRocm93biBleGNlcHRpb25zIG1pbnVzIHRoZSBvbmVzIHRoYXQgYXJlIGFscmVhZHkgY2F1Z2h0IGluIHByZXZpb3VzIGNhdGNoIGJsb2NrcworCSAqIChvZiB0aGUgc2FtZSB0cnkpLCBmb3VuZCBieSB0aGUgY2FsbCB0byAKKwkgKiB7QGxpbmsgVGhyb3duRXhjZXB0aW9uRmluZGVyI3Byb2Nlc3NUaHJvd25FeGNlcHRpb25zKFRyeVN0YXRlbWVudCwgQmxvY2tTY29wZSl9LgorCSAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiB0aHJvd24gZXhjZXB0aW9ucyB0aGF0IGFyZSBzdGlsbCBub3QgY2F1Z2h0IGluIGFueSBjYXRjaCBibG9jay4KKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIGdldFRocm93blVuY2F1Z2h0RXhjZXB0aW9ucygpIHsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIHJlc3VsdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3RoaXMudGhyb3duRXhjZXB0aW9ucy5lbGVtZW50U2l6ZV07CisJCXRoaXMudGhyb3duRXhjZXB0aW9ucy5hc0FycmF5KHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYWxsIGV4Y2VwdGlvbnMgdGhhdCBhcmUgZGlzY291cmFnZWQgdG8gdXNlIGJlY2F1c2UgKGEpIHRoZXkgYXJlIGFscmVhZHkgY2F1Z2h0IGluIHNvbWUgaW5uZXIgdHJ5LWNhdGNoLCAKKwkgKiBvciAoYikgdGhlaXIgc3VwZXIgZXhjZXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY2F1Z2h0LgorCSAqIEByZXR1cm4gYWxsIGRpc2NvdXJhZ2VkIGV4Y2VwdGlvbnMKKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIGdldERpc2NvdXJhZ2VkRXhjZXB0aW9ucygpIHsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGFsbERpc2NvdXJhZ2VkRXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3RoaXMuZGlzY291cmFnZWRFeGNlcHRpb25zLmVsZW1lbnRTaXplXTsKKwkJdGhpcy5kaXNjb3VyYWdlZEV4Y2VwdGlvbnMuYXNBcnJheShhbGxEaXNjb3VyYWdlZEV4Y2VwdGlvbnMpOworCQlyZXR1cm4gYWxsRGlzY291cmFnZWRFeGNlcHRpb25zOworCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSkgewotCQlyZXR1cm4gdGhpcy52aXNpdFR5cGUodHlwZURlY2xhcmF0aW9uKTsKKwkJcmV0dXJuIHZpc2l0VHlwZSh0eXBlRGVjbGFyYXRpb24pOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJcmV0dXJuIHRoaXMudmlzaXRUeXBlKG1lbWJlclR5cGVEZWNsYXJhdGlvbik7CisJCXJldHVybiB2aXNpdFR5cGUobWVtYmVyVHlwZURlY2xhcmF0aW9uKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbG9jYWxUeXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJcmV0dXJuIHRoaXMudmlzaXRUeXBlKGxvY2FsVHlwZURlY2xhcmF0aW9uKTsKKwkJcmV0dXJuIHZpc2l0VHlwZShsb2NhbFR5cGVEZWNsYXJhdGlvbik7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIHZpc2l0VHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05OSwxOCArMTQ0LDE4IEBACiAJCVNpbXBsZVNldCBleGNlcHRpb25TZXQgPSBuZXcgU2ltcGxlU2V0KCk7CiAJCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IGV4Y2VwdGlvblNldDsKIAkJdHJ5U3RhdGVtZW50LnRyeUJsb2NrLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCi0JCXRoaXMucmVtb3ZlQ2F1Z2h0RXhjZXB0aW9ucyh0cnlTdGF0ZW1lbnQpOworCisJCXJlbW92ZUNhdWdodEV4Y2VwdGlvbnModHJ5U3RhdGVtZW50LCBmYWxzZSk7CiAKIAkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gKFNpbXBsZVNldCl0aGlzLmV4Y2VwdGlvbnNTdGFjay5wb3AoKTsKLQkJCisKIAkJT2JqZWN0W10gdmFsdWVzID0gZXhjZXB0aW9uU2V0LnZhbHVlczsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKIAkJCWlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgewogCQkJCXRoaXMudGhyb3duRXhjZXB0aW9ucy5hZGQodmFsdWVzW2ldKTsKIAkJCX0KIAkJfQotCQkKKwogCQlCbG9ja1tdIGNhdGNoQmxvY2tzID0gdHJ5U3RhdGVtZW50LmNhdGNoQmxvY2tzOwogCQlpbnQgbGVuZ3RoID0gY2F0Y2hCbG9ja3MgPT0gbnVsbCA/IDAgOiBjYXRjaEJsb2Nrcy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTExOSwxNCArMTY0LDQ0IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNhdWdodEV4Y2VwdGlvbnMoVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCkgeworCXByaXZhdGUgdm9pZCByZW1vdmVDYXVnaHRFeGNlcHRpb25zKFRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQsIGJvb2xlYW4gcmVjb3JkVW5jaGVja2VkQ2F1Z2h0RXhjZXB0aW9ucykgewogCQlBcmd1bWVudFtdIGNhdGNoQXJndW1lbnRzID0gdHJ5U3RhdGVtZW50LmNhdGNoQXJndW1lbnRzOwogCQlpbnQgbGVuZ3RoID0gY2F0Y2hBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjYXRjaEFyZ3VtZW50cy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVR5cGVCaW5kaW5nIGV4Y2VwdGlvbiA9IGNhdGNoQXJndW1lbnRzW2ldLnR5cGUucmVzb2x2ZWRUeXBlOwotCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsICYmIGV4Y2VwdGlvbi5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJdGhpcy5yZW1vdmVDYXVnaHRFeGNlcHRpb24oKFJlZmVyZW5jZUJpbmRpbmcpZXhjZXB0aW9uKTsKLQkJCQkKKwkJCWlmIChjYXRjaEFyZ3VtZW50c1tpXS50eXBlIGluc3RhbmNlb2YgVW5pb25UeXBlUmVmZXJlbmNlKSB7CisJCQkJVW5pb25UeXBlUmVmZXJlbmNlIHVuaW9uVHlwZVJlZmVyZW5jZSA9IChVbmlvblR5cGVSZWZlcmVuY2UpIGNhdGNoQXJndW1lbnRzW2ldLnR5cGU7CisJCQkJVHlwZUJpbmRpbmcgY2F1Z2h0RXhjZXB0aW9uOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdW5pb25UeXBlUmVmZXJlbmNlLnR5cGVSZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7CisJCQkJCWNhdWdodEV4Y2VwdGlvbiA9IHVuaW9uVHlwZVJlZmVyZW5jZS50eXBlUmVmZXJlbmNlc1tqXS5yZXNvbHZlZFR5cGU7CisJCQkJCWlmICgoY2F1Z2h0RXhjZXB0aW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgJiYgY2F1Z2h0RXhjZXB0aW9uLmlzVmFsaWRCaW5kaW5nKCkpIHsJLy8gbWlnaHQgYmUgbnVsbCB3aGVuIGl0cyB0aGUgY29tcGxldGlvbiBub2RlCisJCQkJCQlpZiAocmVjb3JkVW5jaGVja2VkQ2F1Z2h0RXhjZXB0aW9ucykgeworCQkJCQkJCS8vIGlzIGluIG91dGVybW9zdCB0cnktY2F0Y2guIFJlbW92ZSBhbGwgY2F1Z2h0IGV4Y2VwdGlvbnMsIHVuY2hlY2tlZCBvciBjaGVja2VkCisJCQkJCQkJcmVtb3ZlQ2F1Z2h0RXhjZXB0aW9uKChSZWZlcmVuY2VCaW5kaW5nKWNhdWdodEV4Y2VwdGlvbik7CisJCQkJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25zLmFkZChjYXVnaHRFeGNlcHRpb24pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBpcyBpbiBzb21lIGlubmVyIHRyeS1jYXRjaC4gRGlzY291cmFnZSBhbHJlYWR5IGNhdWdodCBjaGVja2VkIGV4Y2VwdGlvbnMKKwkJCQkJCQkvLyBmcm9tIGJlaW5nIHByb3Bvc2VkIGluIGFuIG91dGVyIGNhdGNoLgorCQkJCQkJCWlmICghY2F1Z2h0RXhjZXB0aW9uLmlzVW5jaGVja2VkRXhjZXB0aW9uKHRydWUpKSB7CisJCQkJCQkJCXRoaXMuZGlzY291cmFnZWRFeGNlcHRpb25zLmFkZChjYXVnaHRFeGNlcHRpb24pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVHlwZUJpbmRpbmcgZXhjZXB0aW9uID0gY2F0Y2hBcmd1bWVudHNbaV0udHlwZS5yZXNvbHZlZFR5cGU7CisJCQkJaWYgKChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSAmJiBleGNlcHRpb24uaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlpZiAocmVjb3JkVW5jaGVja2VkQ2F1Z2h0RXhjZXB0aW9ucykgeworCQkJCQkJLy8gaXMgaW4gb3V0ZXJtb3N0IHRyeS1jYXRjaC4gUmVtb3ZlIGFsbCBjYXVnaHQgZXhjZXB0aW9ucywgdW5jaGVja2VkIG9yIGNoZWNrZWQKKwkJCQkJCXJlbW92ZUNhdWdodEV4Y2VwdGlvbigoUmVmZXJlbmNlQmluZGluZylleGNlcHRpb24pOworCQkJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25zLmFkZChleGNlcHRpb24pOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaXMgaW4gc29tZSBpbm5lciB0cnktY2F0Y2guIERpc2NvdXJhZ2UgYWxyZWFkeSBjYXVnaHQgY2hlY2tlZCBleGNlcHRpb25zCisJCQkJCQkvLyBmcm9tIGJlaW5nIHByb3Bvc2VkIGluIGFuIG91dGVyIGNhdGNoCisJCQkJCQlpZiAoIWV4Y2VwdGlvbi5pc1VuY2hlY2tlZEV4Y2VwdGlvbih0cnVlKSkgeworCQkJCQkJCXRoaXMuZGlzY291cmFnZWRFeGNlcHRpb25zLmFkZChleGNlcHRpb24pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMTM2LDggKzIxMSwxNCBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uID0gKFJlZmVyZW5jZUJpbmRpbmcpZXhjZXB0aW9uc1tpXTsKIAkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgewotCQkJCWlmIChleGNlcHRpb24gPT0gY2F1Z2h0RXhjZXB0aW9uIHx8IGNhdWdodEV4Y2VwdGlvbi5pc1N1cGVyY2xhc3NPZihleGNlcHRpb24pKSB7CisJCQkJaWYgKGV4Y2VwdGlvbiA9PSBjYXVnaHRFeGNlcHRpb24pIHsKIAkJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zLnJlbW92ZShleGNlcHRpb24pOworCQkJCX0gZWxzZSBpZiAoY2F1Z2h0RXhjZXB0aW9uLmlzU3VwZXJjbGFzc09mKGV4Y2VwdGlvbikpIHsKKwkJCQkJLy8gY2F0Y2hpbmcgdGhlIHN1Yi1leGNlcHRpb24gd2hlbiBzdXBlciBoYXMgYmVlbiBjYXVnaHQgYWxyZWFkeSB3aWxsIGdpdmUgYW4gZXJyb3IKKwkJCQkJLy8gc28gcmVtb3ZlIGl0IGZyb20gdGhyb3duIGxpc3QgYW5kIGxvd2VyIHRoZSByZWxldmFuY2UgZm9yIGNhc2VzIHdoZW4gaXQgaXMgZm91bmQKKwkJCQkJLy8gZnJvbSBzZWFyY2hBbGxUeXBlcyguLikKKwkJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zLnJlbW92ZShleGNlcHRpb24pOworCQkJCQl0aGlzLmRpc2NvdXJhZ2VkRXhjZXB0aW9ucy5hZGQoZXhjZXB0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIuamF2YQppbmRleCBlODU5YjY1Li5jOTZlZjNlIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1VucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9VbnJlc29sdmVkUmVmZXJlbmNlTmFtZUZpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM1LDQ3ICszNSw0NyBAQAogcHVibGljIGNsYXNzIFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lRmluZGVyIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MSU5FX0NPVU5UID0gMTAwOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUtFX0JMT0NLU19DT1VOVCA9IDIwOwotCQorCiAJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVSZXF1ZXN0b3IgewogCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lKGNoYXJbXSBuYW1lKTsKIAl9Ci0JCisKIAlwcml2YXRlIFVucmVzb2x2ZWRSZWZlcmVuY2VOYW1lUmVxdWVzdG9yIHJlcXVlc3RvcjsKLQkKKwogCXByaXZhdGUgQ29tcGxldGlvbkVuZ2luZSBjb21wbGV0aW9uRW5naW5lOwogCXByaXZhdGUgQ29tcGxldGlvblBhcnNlciBwYXJzZXI7CiAJcHJpdmF0ZSBDb21wbGV0aW9uU2Nhbm5lciBjb21wbGV0aW9uU2Nhbm5lcjsKLQkKKwogCXByaXZhdGUgaW50IHBhcmVudHNQdHI7CiAJcHJpdmF0ZSBBU1ROb2RlW10gcGFyZW50czsKLQkKKwogCXByaXZhdGUgaW50IHBvdGVudGlhbFZhcmlhYmxlTmFtZXNQdHI7CiAJcHJpdmF0ZSBjaGFyW11bXSBwb3RlbnRpYWxWYXJpYWJsZU5hbWVzOwogCXByaXZhdGUgaW50W10gcG90ZW50aWFsVmFyaWFibGVOYW1lU3RhcnRzOwotCQorCiAJcHJpdmF0ZSBTaW1wbGVTZXRPZkNoYXJBcnJheSBhY2NlcHRlZE5hbWVzID0gbmV3IFNpbXBsZVNldE9mQ2hhckFycmF5KCk7Ci0JCisKIAlwdWJsaWMgVW5yZXNvbHZlZFJlZmVyZW5jZU5hbWVGaW5kZXIoQ29tcGxldGlvbkVuZ2luZSBjb21wbGV0aW9uRW5naW5lKSB7CiAJCXRoaXMuY29tcGxldGlvbkVuZ2luZSA9IGNvbXBsZXRpb25FbmdpbmU7CiAJCXRoaXMucGFyc2VyID0gY29tcGxldGlvbkVuZ2luZS5wYXJzZXI7Ci0JCXRoaXMuY29tcGxldGlvblNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpIHBhcnNlci5zY2FubmVyOwotCX0gCi0JCisJCXRoaXMuY29tcGxldGlvblNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpIHRoaXMucGFyc2VyLnNjYW5uZXI7CisJfQorCiAJcHJpdmF0ZSB2b2lkIGFjY2VwdE5hbWUoY2hhcltdIG5hbWUpIHsKIAkJLy8gdGhlIG51bGwgY2hlY2sgaXMgYWRkZWQgdG8gZml4IGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2NTcwCiAJCWlmIChuYW1lID09IG51bGwpIHJldHVybjsKLQkJCQkJCQorCiAJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5jb21wbGV0aW9uRW5naW5lLmNvbXBsZXRpb25Ub2tlbiwgbmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pCiAJCQkJJiYgISh0aGlzLmNvbXBsZXRpb25FbmdpbmUub3B0aW9ucy5jYW1lbENhc2VNYXRjaCAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHRoaXMuY29tcGxldGlvbkVuZ2luZS5jb21wbGV0aW9uVG9rZW4sIG5hbWUpKSkgcmV0dXJuOwotCQkKLQkJaWYgKGFjY2VwdGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHJldHVybjsKLQkJCisKKwkJaWYgKHRoaXMuYWNjZXB0ZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkgcmV0dXJuOworCiAJCXRoaXMuYWNjZXB0ZWROYW1lcy5hZGQobmFtZSk7Ci0JCQorCiAJCS8vIGFjY2VwdCByZXN1bHQKIAkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TmFtZShuYW1lKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBmaW5kKAogCQkJY2hhcltdIHN0YXJ0V2l0aCwKIAkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyLApAQCAtODMsMjIgKzgzLDIyIEBACiAJCQlpbnQgZnJvbSwKIAkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMsCiAJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yKSB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIGZha2VNZXRob2QgPSAKKwkJTWV0aG9kRGVjbGFyYXRpb24gZmFrZU1ldGhvZCA9CiAJCQl0aGlzLmZpbmRBZnRlcihzdGFydFdpdGgsIHNjb3BlLCBmcm9tLCBpbml0aWFsaXplci5ib2R5RW5kLCBNQVhfTElORV9DT1VOVCwgZmFsc2UsIGRpc2NvdXJhZ2VkTmFtZXMsIG5hbWVSZXF1ZXN0b3IpOwogCQlpZiAoZmFrZU1ldGhvZCAhPSBudWxsKSBmYWtlTWV0aG9kLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBmaW5kKAogCQkJY2hhcltdIHN0YXJ0V2l0aCwKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sCiAJCQlpbnQgZnJvbSwKIAkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMsCiAJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yKSB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIGZha2VNZXRob2QgPSAKKwkJTWV0aG9kRGVjbGFyYXRpb24gZmFrZU1ldGhvZCA9CiAJCQl0aGlzLmZpbmRBZnRlcihzdGFydFdpdGgsIG1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLCBmcm9tLCBtZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kLCBNQVhfTElORV9DT1VOVCwgZmFsc2UsIGRpc2NvdXJhZ2VkTmFtZXMsIG5hbWVSZXF1ZXN0b3IpOwogCQlpZiAoZmFrZU1ldGhvZCAhPSBudWxsKSBmYWtlTWV0aG9kLnRyYXZlcnNlKHRoaXMsIG1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLmNsYXNzU2NvcGUoKSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZmluZEFmdGVyKAogCQkJY2hhcltdIHN0YXJ0V2l0aCwKIAkJCVNjb3BlIHNjb3BlLApAQCAtMTExLDcgKzExMSw3IEBACiAJCQl0aGlzLmZpbmRBZnRlcihzdGFydFdpdGgsIHNjb3BlLCBmcm9tLCB0bywgTUFYX0xJTkVfQ09VTlQgLyAyLCB0cnVlLCBkaXNjb3VyYWdlZE5hbWVzLCBuYW1lUmVxdWVzdG9yKTsKIAkJaWYgKGZha2VNZXRob2QgIT0gbnVsbCkgZmFrZU1ldGhvZC50cmF2ZXJzZSh0aGlzLCBjbGFzc1Njb3BlKTsKIAl9Ci0JCisKIAlwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGZpbmRBZnRlcigKIAkJCWNoYXJbXSBzdGFydFdpdGgsCiAJCQlTY29wZSBzLApAQCAtMTIyLDQ3ICsxMjIsNDcgQEAKIAkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMsCiAJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yKSB7CiAJCXRoaXMucmVxdWVzdG9yID0gbmFtZVJlcXVlc3RvcjsKLQkJCisKIAkJLy8gcmVpbml0aWFsaXplIGNvbXBsZXRpb24gc2Nhbm5lciB0byBiZSB1c2FibGUgYXMgYSBub3JtYWwgc2Nhbm5lcgogCQl0aGlzLmNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gMDsKLQkJCisKIAkJaWYgKCFvdXRzaWRlRW5jbG9zaW5nQmxvY2spIHsKIAkJCS8vIGNvbXB1dGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBibG9jawogCQkJdGhpcy5jb21wbGV0aW9uU2Nhbm5lci5yZXNldFRvKGZyb20gKyAxLCB0byk7CiAJCQl0aGlzLmNvbXBsZXRpb25TY2FubmVyLmp1bXBPdmVyQmxvY2soKTsKLQkJCQorCiAJCQl0byA9IHRoaXMuY29tcGxldGlvblNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CiAJCX0KLQkJCisKIAkJaW50IG1heEVuZCA9CiAJCQl0aGlzLmNvbXBsZXRpb25TY2FubmVyLmdldExpbmVFbmQoCiAJCQkJCVV0aWwuZ2V0TGluZU51bWJlcihmcm9tLCB0aGlzLmNvbXBsZXRpb25TY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLmNvbXBsZXRpb25TY2FubmVyLmxpbmVQdHIpICsgbWF4TGluZUNvdW50KTsKLQkJCisKIAkJaW50IGVuZDsKIAkJaWYgKG1heEVuZCA8IDApIHsKIAkJCWVuZCA9IHRvOwogCQl9IGVsc2UgewogCQkJZW5kID0gbWF4RW5kIDwgdG8gPyBtYXhFbmQgOiB0bzsKIAkJfQotCQkKKwogCQl0aGlzLnBhcnNlci5zdGFydFJlY29yZGluZ0lkZW50aWZpZXJzKGZyb20sIGVuZCk7Ci0JCQorCiAJCU1ldGhvZERlY2xhcmF0aW9uIGZha2VNZXRob2QgPSB0aGlzLnBhcnNlci5wYXJzZVNvbWVTdGF0ZW1lbnRzKAogCQkJCWZyb20sCiAJCQkJZW5kLAogCQkJCW91dHNpZGVFbmNsb3NpbmdCbG9jayA/IEZBS0VfQkxPQ0tTX0NPVU5UIDogMCwKIAkJCQlzLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCk7Ci0JCQorCiAJCXRoaXMucGFyc2VyLnN0b3BSZWNvcmRpbmdJZGVudGlmaWVycygpOwotCQkKLQkJaWYoIXRoaXMuaW5pdFBvdGVudGlhbE5hbWVzVGFibGVzKGRpc2NvdXJhZ2VkTmFtZXMpKSByZXR1cm4gbnVsbDsKLQkJCisKKwkJaWYoIWluaXRQb3RlbnRpYWxOYW1lc1RhYmxlcyhkaXNjb3VyYWdlZE5hbWVzKSkgcmV0dXJuIG51bGw7CisKIAkJdGhpcy5wYXJlbnRzUHRyID0gLTE7CiAJCXRoaXMucGFyZW50cyA9IG5ldyBBU1ROb2RlWzEwXTsKLQkJCisKIAkJcmV0dXJuIGZha2VNZXRob2Q7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZmluZEJlZm9yZSgKIAkJCWNoYXJbXSBzdGFydFdpdGgsCiAJCQlTY29wZSBzY29wZSwKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkJdGhpcy5maW5kQmVmb3JlKHN0YXJ0V2l0aCwgc2NvcGUsIGZyb20sIHJlY29yZFRvLCBwYXJzZVRvLCBNQVhfTElORV9DT1VOVCAvIDIsIGRpc2NvdXJhZ2VkTmFtZXMsIG5hbWVSZXF1ZXN0b3IpOwogCQlpZiAoZmFrZU1ldGhvZCAhPSBudWxsKSBmYWtlTWV0aG9kLnRyYXZlcnNlKHRoaXMsIGNsYXNzU2NvcGUpOwogCX0KLQkKKwogCXByaXZhdGUgTWV0aG9kRGVjbGFyYXRpb24gZmluZEJlZm9yZSgKIAkJCWNoYXJbXSBzdGFydFdpdGgsCiAJCQlTY29wZSBzLApAQCAtMTg3LDE0ICsxODcsMTQgQEAKIAkJCWNoYXJbXVtdIGRpc2NvdXJhZ2VkTmFtZXMsCiAJCQlVbnJlc29sdmVkUmVmZXJlbmNlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yKSB7CiAJCXRoaXMucmVxdWVzdG9yID0gbmFtZVJlcXVlc3RvcjsKLQkJCisKIAkJLy8gcmVpbml0aWFsaXplIGNvbXBsZXRpb24gc2Nhbm5lciB0byBiZSB1c2FibGUgYXMgYSBub3JtYWwgc2Nhbm5lcgogCQl0aGlzLmNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gMDsKLQkJCisKIAkJaW50IG1pblN0YXJ0ID0KIAkJCXRoaXMuY29tcGxldGlvblNjYW5uZXIuZ2V0TGluZVN0YXJ0KAogCQkJCQlVdGlsLmdldExpbmVOdW1iZXIocmVjb3JkVG8sIHRoaXMuY29tcGxldGlvblNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuY29tcGxldGlvblNjYW5uZXIubGluZVB0cikgLSBtYXhMaW5lQ291bnQpOwotCQkKKwogCQlpbnQgc3RhcnQ7CiAJCWludCBmYWtlQmxvY2tzQ291bnQ7CiAJCWlmIChtaW5TdGFydCA8PSBmcm9tKSB7CkBAIC0yMDQsNjEgKzIwNCw2MSBAQAogCQkJc3RhcnQgPSBtaW5TdGFydDsKIAkJCWZha2VCbG9ja3NDb3VudCA9IEZBS0VfQkxPQ0tTX0NPVU5UOwogCQl9Ci0JCQorCiAJCXRoaXMucGFyc2VyLnN0YXJ0UmVjb3JkaW5nSWRlbnRpZmllcnMoc3RhcnQsIHJlY29yZFRvKTsKLQkJCisKIAkJTWV0aG9kRGVjbGFyYXRpb24gZmFrZU1ldGhvZCA9IHRoaXMucGFyc2VyLnBhcnNlU29tZVN0YXRlbWVudHMoCiAJCQkJc3RhcnQsCiAJCQkJcGFyc2VUbywKIAkJCQlmYWtlQmxvY2tzQ291bnQsCiAJCQkJcy5jb21waWxhdGlvblVuaXRTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOwotCQkKKwogCQl0aGlzLnBhcnNlci5zdG9wUmVjb3JkaW5nSWRlbnRpZmllcnMoKTsKLQkJCi0JCWlmKCF0aGlzLmluaXRQb3RlbnRpYWxOYW1lc1RhYmxlcyhkaXNjb3VyYWdlZE5hbWVzKSkgcmV0dXJuIG51bGw7Ci0JCQorCisJCWlmKCFpbml0UG90ZW50aWFsTmFtZXNUYWJsZXMoZGlzY291cmFnZWROYW1lcykpIHJldHVybiBudWxsOworCiAJCXRoaXMucGFyZW50c1B0ciA9IC0xOwogCQl0aGlzLnBhcmVudHMgPSBuZXcgQVNUTm9kZVsxMF07Ci0JCQorCiAJCXJldHVybiBmYWtlTWV0aG9kOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBpbml0UG90ZW50aWFsTmFtZXNUYWJsZXMoY2hhcltdW10gZGlzY291cmFnZWROYW1lcykgewogCQljaGFyW11bXSBwdm5zID0gdGhpcy5wYXJzZXIucG90ZW50aWFsVmFyaWFibGVOYW1lczsKIAkJaW50W10gcHZuc3MgPSB0aGlzLnBhcnNlci5wb3RlbnRpYWxWYXJpYWJsZU5hbWVTdGFydHM7CiAJCWludCBwdm5zUHRyID0gdGhpcy5wYXJzZXIucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0cjsKLQkJCisKIAkJaWYgKHB2bnNQdHIgPCAwKSByZXR1cm4gZmFsc2U7IC8vIHRoZXJlIGlzIG5vIHBvdGVudGlhbCBuYW1lcwotCQkKKwogCQkvLyByZW1vdmUgbnVsbCBhbmQgZGlzY291cmFnZWROYW1lcwogCQlpbnQgZGlzY291cmFnZWROYW1lc0NvdW50ID0gZGlzY291cmFnZWROYW1lcyA9PSBudWxsID8gMCA6IGRpc2NvdXJhZ2VkTmFtZXMubGVuZ3RoOwogCQlpbnQgaiA9IC0xOwogCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPD0gcHZuc1B0cjsgaSsrKSB7CiAJCQljaGFyW10gdGVtcCA9IHB2bnNbaV07Ci0JCQkKKwogCQkJaWYgKHRlbXAgPT0gbnVsbCkgY29udGludWUgbmV4dDsKLQkJCQorCiAJCQlmb3IgKGludCBrID0gMDsgayA8IGRpc2NvdXJhZ2VkTmFtZXNDb3VudDsgaysrKSB7CiAJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRlbXAsIGRpc2NvdXJhZ2VkTmFtZXNba10sIGZhbHNlKSkgewogCQkJCQljb250aW51ZSBuZXh0OwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlwdm5zW2ldID0gbnVsbDsKIAkJCXB2bnNbKytqXSA9IHRlbXA7CiAJCQlwdm5zc1tqXSA9IHB2bnNzW2ldOwogCQl9CiAJCXB2bnNQdHIgPSBqOwotCQkKKwogCQlpZiAocHZuc1B0ciA8IDApIHJldHVybiBmYWxzZTsgLy8gdGhlcmUgaXMgbm8gcG90ZW50aWFsIG5hbWVzCi0JCQorCiAJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lcyA9IHB2bnM7CiAJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lU3RhcnRzID0gcHZuc3M7CiAJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0ciA9IHB2bnNQdHI7Ci0JCQorCiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBwb3BQYXJlbnQoKSB7CiAJCXRoaXMucGFyZW50c1B0ci0tOwogCX0KQEAgLTI2OSwxMSArMjY5LDExIEBACiAJCX0KIAkJdGhpcy5wYXJlbnRzWysrdGhpcy5wYXJlbnRzUHRyXSA9IHBhcmVudDsKIAl9Ci0JCisKIAlwcml2YXRlIEFTVE5vZGUgZ2V0RW5jbG9zaW5nRGVjbGFyYXRpb24oKSB7CiAJCWludCBpID0gdGhpcy5wYXJlbnRzUHRyOwogCQl3aGlsZSAoaSA+IC0xKSB7Ci0JCQlBU1ROb2RlIHBhcmVudCA9IHBhcmVudHNbaV07CisJCQlBU1ROb2RlIHBhcmVudCA9IHRoaXMucGFyZW50c1tpXTsKIAkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CiAJCQkJcmV0dXJuIHBhcmVudDsKIAkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKQEAgLTI4NiwxNSArMjg2LDE1IEBACiAJCQlpLS07CiAJCX0KIAkJcmV0dXJuIG51bGw7Ci0JfSAKLQkKKwl9CisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBibG9jaywgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJCUFTVE5vZGUgZW5jbG9zaW5nRGVjbGFyYXRpb24gPSBnZXRFbmNsb3NpbmdEZWNsYXJhdGlvbigpOwogCQlyZW1vdmVMb2NhbHMoYmxvY2suc3RhdGVtZW50cywgZW5jbG9zaW5nRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGJsb2NrLnNvdXJjZUVuZCk7CiAJCXB1c2hQYXJlbnQoYmxvY2spOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgewogCQlpZiAoKChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzRGVmYXVsdENvbnN0cnVjdG9yKSA9PSAwKSAmJiAhY29uc3RydWN0b3JEZWNsYXJhdGlvbi5pc0NsaW5pdCgpKSB7CiAJCQlyZW1vdmVMb2NhbHMoCkBAIC0zMDksMTcgKzMwOSwxNyBAQAogCQlwdXNoUGFyZW50KGNvbnN0cnVjdG9yRGVjbGFyYXRpb24pOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKSB7CiAJCXB1c2hQYXJlbnQoZmllbGREZWNsYXJhdGlvbik7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIGluaXRpYWxpemVyLCBNZXRob2RTY29wZSBtZXRob2RTY29wZSkgewogCQlwdXNoUGFyZW50KGluaXRpYWxpemVyKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgewogCQlyZW1vdmVMb2NhbHMoCiAJCQkJbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzLApAQCAtMzMyLDc3ICszMzIsNzcgQEAKIAkJcHVzaFBhcmVudChtZXRob2REZWNsYXJhdGlvbik7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBsb2NhbFR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJCXJlbW92ZUZpZWxkcyhsb2NhbFR5cGVEZWNsYXJhdGlvbik7CiAJCXB1c2hQYXJlbnQobG9jYWxUeXBlRGVjbGFyYXRpb24pOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKIAkJcmVtb3ZlRmllbGRzKG1lbWJlclR5cGVEZWNsYXJhdGlvbik7CiAJCXB1c2hQYXJlbnQobWVtYmVyVHlwZURlY2xhcmF0aW9uKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQmxvY2sgYmxvY2ssIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewogCQlwb3BQYXJlbnQoKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcmd1bWVudCBhcmd1bWVudCwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJCWVuZFZpc2l0UmVtb3ZlZChhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBhcmd1bWVudC5zb3VyY2VFbmQpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFyZ3VtZW50IGFyZ3VtZW50LCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKIAkJZW5kVmlzaXRSZW1vdmVkKGFyZ3VtZW50LmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGFyZ3VtZW50LnNvdXJjZUVuZCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKIAkJaWYgKCgoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0RlZmF1bHRDb25zdHJ1Y3RvcikgPT0gMCkgJiYgIWNvbnN0cnVjdG9yRGVjbGFyYXRpb24uaXNDbGluaXQoKSkgewogCQkJZW5kVmlzaXRQcmVzZXJ2ZWQoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5ib2R5U3RhcnQsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYm9keUVuZCk7CiAJCX0KIAkJcG9wUGFyZW50KCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBNZXRob2RTY29wZSBtZXRob2RTY29wZSkgewogCQllbmRWaXNpdFJlbW92ZWQoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCk7CiAJCWVuZFZpc2l0UHJlc2VydmVkKGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kLCBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kKTsKIAkJcG9wUGFyZW50KCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKSB7CiAJCWVuZFZpc2l0UHJlc2VydmVkKGluaXRpYWxpemVyLmJvZHlTdGFydCwgaW5pdGlhbGl6ZXIuYm9keUVuZCk7CiAJCXBvcFBhcmVudCgpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJCWVuZFZpc2l0UmVtb3ZlZChsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7CiAJCWVuZFZpc2l0UHJlc2VydmVkKAogCQkJCW1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCwKIAkJCQltZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kKTsKIAkJcG9wUGFyZW50KCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJCWVuZFZpc2l0UmVtb3ZlZCh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAJCXBvcFBhcmVudCgpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgewogCQllbmRWaXNpdFJlbW92ZWQodHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogCQlwb3BQYXJlbnQoKTsKIAl9Ci0JCisKIAlwcml2YXRlIGludCBpbmRleE9mRmlzcnROYW1lQWZ0ZXIoaW50IHBvc2l0aW9uKSB7CiAJCWludCBsZWZ0ID0gMDsKIAkJaW50IHJpZ2h0ID0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzUHRyOwotCQkKKwogCQluZXh0IDogd2hpbGUgKHRydWUpIHsKIAkJCWlmIChyaWdodCA8IGxlZnQpIHJldHVybiAtMTsKLQkJCQorCiAJCQlpbnQgbWlkID0gbGVmdCArIChyaWdodCAtIGxlZnQpIC8gMjsKIAkJCWludCBtaWRQb3NpdGlvbiA9IHRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lU3RhcnRzW21pZF07CiAJCQlpZiAobWlkUG9zaXRpb24gPCAwKSB7CkBAIC00MTMsMjEgKzQxMywyMSBAQAogCQkJCX0KIAkJCQltaWQgPSBuZXh0TWlkOwogCQkJCW1pZFBvc2l0aW9uID0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVTdGFydHNbbmV4dE1pZF07Ci0JCQkJCisKIAkJCQlpZiAobWlkID09IHJpZ2h0KSB7IC8vIG1pZCBhbmQgcmlnaHQgYXJlIGF0IHRoZSBzYW1lIGluZGV4LCB3ZSBtdXN0IG1vdmUgJ2xlZnQnCiAJCQkJCWludCBsZWZ0UG9zaXRpb24gPSB0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZVN0YXJ0c1tsZWZ0XTsKIAkJCQkJaWYgKGxlZnRQb3NpdGlvbiA8IDAgfHwgbGVmdFBvc2l0aW9uIDwgcG9zaXRpb24pIHsgLy8gJ2xlZnQnIGlzIGVtcHR5IG9yICdsZWZ0JyBpcyBiZWZvcmUgdGhlIHBvc2l0aW9uCiAJCQkJCQlpbnQgbmV4dExlZnQgPSBpbmRleE9mTmV4dE5hbWUobGVmdCk7CiAJCQkJCQlpZiAobmV4dExlZnQgPCAwKSByZXR1cm4gLSAxOwotCQkJCQkJCisKIAkJCQkJCWxlZnQgPSBuZXh0TGVmdDsKIAkJCQkJCWNvbnRpbnVlIG5leHQ7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJcmV0dXJuIGxlZnQ7CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmIChsZWZ0ICE9IHJpZ2h0KSB7CiAJCQkJaWYgKG1pZFBvc2l0aW9uIDwgcG9zaXRpb24pIHsKIAkJCQkJbGVmdCA9IG1pZCArIDE7CkBAIC00NDIsNyArNDQyLDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXByaXZhdGUgaW50IGluZGV4T2ZOZXh0TmFtZShpbnQgaW5kZXgpIHsKIAkJaW50IG5leHRJbmRleCA9IGluZGV4ICsgMTsKIAkJd2hpbGUgKG5leHRJbmRleCA8PSB0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZXNQdHIgJiYKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCQkJCW5leHRJbmRleCsrOwogCQkJfQogCQl9Ci0JCQorCiAJCWlmICh0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZXNQdHIgPCBuZXh0SW5kZXgpIHsKIAkJCWlmICAoaW5kZXggPCB0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZXNQdHIpIHsKIAkJCQl0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZXNQdHIgPSBpbmRleDsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCQl9CiAJCXJldHVybiBuZXh0SW5kZXg7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHJlbW92ZU5hbWVBdChpbnQgaW5kZXgpIHsKIAkJdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzW2luZGV4XSA9IG51bGw7CiAJCWludCBuZXh0SW5kZXggPSBpbmRleE9mTmV4dE5hbWUoaW5kZXgpOwpAQCAtNDc2LDE2ICs0NzYsMTYgQEAKIAkJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0ciA9IGluZGV4IC0gMTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBlbmRWaXNpdFByZXNlcnZlZChpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJaW50IGkgPSBpbmRleE9mRmlzcnROYW1lQWZ0ZXIoc3RhcnQpOwogCQlkb25lIDogd2hpbGUgKGkgIT0gLTEpIHsKIAkJCWludCBuYW1lU3RhcnQgPSB0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZVN0YXJ0c1tpXTsKIAkJCWlmIChzdGFydCA8IG5hbWVTdGFydCAmJiBuYW1lU3RhcnQgPCBlbmQpIHsKLQkJCQl0aGlzLmFjY2VwdE5hbWUodGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzW2ldKTsKLQkJCQl0aGlzLnJlbW92ZU5hbWVBdChpKTsKKwkJCQlhY2NlcHROYW1lKHRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1tpXSk7CisJCQkJcmVtb3ZlTmFtZUF0KGkpOwogCQkJfQotCQkJCisKIAkJCWlmIChlbmQgPCBuYW1lU3RhcnQpIGJyZWFrIGRvbmU7CiAJCQlpID0gaW5kZXhPZk5leHROYW1lKGkpOwogCQl9CkBAIC00OTYsNDEgKzQ5Niw0MSBAQAogCQlkb25lIDogd2hpbGUgKGkgIT0gLTEpIHsKIAkJCWludCBuYW1lU3RhcnQgPSB0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZVN0YXJ0c1tpXTsKIAkJCWlmIChzdGFydCA8IG5hbWVTdGFydCAmJiBuYW1lU3RhcnQgPCBlbmQpIHsKLQkJCQl0aGlzLnJlbW92ZU5hbWVBdChpKTsKKwkJCQlyZW1vdmVOYW1lQXQoaSk7CiAJCQl9Ci0JCQkKKwogCQkJaWYgKGVuZCA8IG5hbWVTdGFydCkgYnJlYWsgZG9uZTsKIAkJCWkgPSBpbmRleE9mTmV4dE5hbWUoaSk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcmVtb3ZlTG9jYWxzKFN0YXRlbWVudFtdIHN0YXRlbWVudHMsIGludCBzdGFydCwgaW50IGVuZCkgewogCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIExvY2FsRGVjbGFyYXRpb24pIHsKLQkJCQkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gKExvY2FsRGVjbGFyYXRpb24pIHN0YXRlbWVudHNbaV07CQkJCQkKKwkJCQkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gKExvY2FsRGVjbGFyYXRpb24pIHN0YXRlbWVudHNbaV07CiAJCQkJCWludCBqID0gaW5kZXhPZkZpc3J0TmFtZUFmdGVyKHN0YXJ0KTsKIAkJCQkJZG9uZSA6IHdoaWxlIChqICE9IC0xKSB7CiAJCQkJCQlpbnQgbmFtZVN0YXJ0ID0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVTdGFydHNbal07CiAJCQkJCQlpZiAoc3RhcnQgPD0gbmFtZVN0YXJ0ICYmIG5hbWVTdGFydCA8PSBlbmQpIHsKIAkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzW2pdLCBsb2NhbERlY2xhcmF0aW9uLm5hbWUsIGZhbHNlKSkgewotCQkJCQkJCQl0aGlzLnJlbW92ZU5hbWVBdChqKTsKKwkJCQkJCQkJcmVtb3ZlTmFtZUF0KGopOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJCQorCiAJCQkJCQlpZiAoZW5kIDwgbmFtZVN0YXJ0KSBicmVhayBkb25lOwogCQkJCQkJaiA9IGluZGV4T2ZOZXh0TmFtZShqKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCQorCiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRzKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKIAkJaW50IHN0YXJ0ID0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CiAJCWludCBlbmQgPSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci0JCQorCiAJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CiAJCWlmIChmaWVsZERlY2xhcmF0aW9ucyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7CkBAIC01MzksMTAgKzUzOSwxMCBAQAogCQkJCQlpbnQgbmFtZVN0YXJ0ID0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVTdGFydHNbal07CiAJCQkJCWlmIChzdGFydCA8PSBuYW1lU3RhcnQgJiYgbmFtZVN0YXJ0IDw9IGVuZCkgewogCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1tqXSwgZmllbGREZWNsYXJhdGlvbnNbaV0ubmFtZSwgZmFsc2UpKSB7Ci0JCQkJCQkJdGhpcy5yZW1vdmVOYW1lQXQoaik7CisJCQkJCQkJcmVtb3ZlTmFtZUF0KGopOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCQorCiAJCQkJCWlmIChlbmQgPCBuYW1lU3RhcnQpIGJyZWFrIGRvbmU7CiAJCQkJCWogPSBpbmRleE9mTmV4dE5hbWUoaik7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uSmF2YWRvYy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uSmF2YWRvYy5qYXZhCmluZGV4IDUyYzQ5MjAuLjVlMmZhMTEgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbkphdmFkb2MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25KYXZhZG9jLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzQsNyArMzQsNyBAQAogCS8qKgogCSAqIFJlc29sdmUgc2VsZWN0ZWQgbm9kZSBpZiBub3QgbnVsbCBhbmQgdGhyb3cgZXhjZXB0aW9uIHRvIGxldCBjbGllbnRzIGtub3cKIAkgKiB0aGF0IGl0IGhhcyBiZWVuIGZvdW5kLgotCSAqIAorCSAqCiAJICogQHRocm93cyBDb21wbGV0aW9uTm9kZUZvdW5kCiAJICovCiAJcHJpdmF0ZSB2b2lkIGludGVybmFsUmVzb2x2ZShTY29wZSBzY29wZSkgewpAQCAtODksNyArODksNyBAQAogCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcy5jb21wbGV0aW9uTm9kZSwgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOwogCQl9CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSNwcmludChpbnQsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCiAJICovCkBAIC05OCw3ICs5OCw3IEBACiAJCWJvb2xlYW4gbm9kZVByaW50ZWQgPSBmYWxzZTsKIAkJaWYgKHRoaXMucGFyYW1SZWZlcmVuY2VzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhcmFtUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIiAqIEBwYXJhbSAiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtICIpOyAvLyROT04tTkxTLTEkCiAJCQkJdGhpcy5wYXJhbVJlZmVyZW5jZXNbaV0ucHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnXG4nKTsKIAkJCQlpZiAoIW5vZGVQcmludGVkICYmIHRoaXMuY29tcGxldGlvbk5vZGUgIT0gbnVsbCkgewogCQkJCQlub2RlUHJpbnRlZCA9ICB0aGlzLmNvbXBsZXRpb25Ob2RlID09IHRoaXMucGFyYW1SZWZlcmVuY2VzW2ldOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCX0KIAkJaWYgKHRoaXMucGFyYW1UeXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXJhbVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtIDwiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtIDwiKTsgLy8kTk9OLU5MUy0xJAogCQkJCXRoaXMucGFyYW1UeXBlUGFyYW1ldGVyc1tpXS5wcmludChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCWlmICghbm9kZVByaW50ZWQgJiYgdGhpcy5jb21wbGV0aW9uTm9kZSAhPSBudWxsKSB7CiAJCQkJCW5vZGVQcmludGVkID0gIHRoaXMuY29tcGxldGlvbk5vZGUgPT0gdGhpcy5wYXJhbVR5cGVQYXJhbWV0ZXJzW2ldOwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCX0KIAkJaWYgKHRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlcyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5leGNlcHRpb25SZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCXRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlc1tpXS5wcmludChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCdcbicpOwogCQkJCWlmICghbm9kZVByaW50ZWQgJiYgdGhpcy5jb21wbGV0aW9uTm9kZSAhPSBudWxsKSB7CiAJCQkJCW5vZGVQcmludGVkID0gIHRoaXMuY29tcGxldGlvbk5vZGUgPT0gdGhpcy5leGNlcHRpb25SZWZlcmVuY2VzW2ldOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCX0KIAkJaWYgKHRoaXMuc2VlUmVmZXJlbmNlcyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zZWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHNlZSAiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICogQHNlZSAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCXRoaXMuc2VlUmVmZXJlbmNlc1tpXS5wcmludChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCdcbicpOwogCQkJCWlmICghbm9kZVByaW50ZWQgJiYgdGhpcy5jb21wbGV0aW9uTm9kZSAhPSBudWxsKSB7CiAJCQkJCW5vZGVQcmludGVkID0gIHRoaXMuY29tcGxldGlvbk5vZGUgPT0gdGhpcy5zZWVSZWZlcmVuY2VzW2ldOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCQl9CiAJCX0KIAkJaWYgKCFub2RlUHJpbnRlZCAmJiB0aGlzLmNvbXBsZXRpb25Ob2RlICE9IG51bGwpIHsKLQkJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIiAqICIpOyAvLyROT04tTkxTLTEkCQkKKwkJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIiAqICIpOyAvLyROT04tTkxTLTEkCiAJCQl0aGlzLmNvbXBsZXRpb25Ob2RlLnByaW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoJ1xuJyk7CiAJCX0KIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiICovXG4iKTsgLy8kTk9OLU5MUy0xJApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJLyoqCiAJICogUmVzb2x2ZSBjb21wbGV0aW9uIG5vZGUgaWYgbm90IG51bGwgYW5kIHRocm93IGV4Y2VwdGlvbiB0byBsZXQgY2xpZW50cyBrbm93CiAJICogdGhhdCBpdCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgQ29tcGxldGlvbk5vZGVGb3VuZAogCSAqLwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQ2xhc3NTY29wZSBzY29wZSkgewpAQCAtMTU4LDcgKzE1OCw3IEBACiAJLyoqCiAJICogUmVzb2x2ZSBjb21wbGV0aW9uIG5vZGUgaWYgbm90IG51bGwgYW5kIHRocm93IGV4Y2VwdGlvbiB0byBsZXQgY2xpZW50cyBrbm93CiAJICogdGhhdCBpdCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgQ29tcGxldGlvbk5vZGVGb3VuZAogCSAqLwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCS8qKgogCSAqIFJlc29sdmUgY29tcGxldGlvbiBub2RlIGlmIG5vdCBudWxsIGFuZCB0aHJvdyBleGNlcHRpb24gdG8gbGV0IGNsaWVudHMga25vdwogCSAqIHRoYXQgaXQgaGFzIGJlZW4gZm91bmQuCi0JICogCisJICoKIAkgKiBAdGhyb3dzIENvbXBsZXRpb25Ob2RlRm91bmQKIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNvbHZlKE1ldGhvZFNjb3BlIHNjb3BlKSB7CkBAIC0xODcsNyArMTg3LDcgQEAKIAkJaWYgKG1kID09IG51bGwpIHJldHVybiBudWxsOwogCQlpbnQgYXJndW1lbnRzU2l6ZSA9IG1kLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IG1kLmFyZ3VtZW50cy5sZW5ndGg7CiAJCWlmIChhcmd1bWVudHNTaXplID09IDApIHJldHVybiBudWxsOwotCQkKKwogCQkvLyBTdG9yZSBhbGwgbWV0aG9kIGFyZ3VtZW50cyBpZiB0aGVyZSdzIG5vIEBwYXJhbSBpbiBqYXZhZG9jCiAJCWlmIChwYXJhbVRhZ3NTaXplID09IDApIHsKIAkJCWNoYXJbXVtdIG1pc3NpbmdQYXJhbXMgPSBuZXcgY2hhclthcmd1bWVudHNTaXplXVtdOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHR5cGVWYXJpYWJsZXMgPT0gbnVsbCB8fCB0eXBlVmFyaWFibGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCisKIAkJLy8gU3RvcmUgYWxsIHR5cGUgcGFyYW1ldGVycyBpZiB0aGVyZSdzIG5vIEBwYXJhbSBpbiBqYXZhZG9jCiAJCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJCWludCB0eXBlUGFyYW1ldGVyc0xlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uSmF2YWRvY1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uSmF2YWRvY1BhcnNlci5qYXZhCmluZGV4IDlkZGU1YzYuLjdjYTA2YzAgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbkphdmFkb2NQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25KYXZhZG9jUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsNyArMjYsNyBAQAogICogUGFyc2VyIHNwZWNpYWxpemVkIGZvciBkZWNvZGluZyBqYXZhZG9jIGNvbW1lbnRzIHdoaWNoIGluY2x1ZGVzIGN1cnNvciBsb2NhdGlvbiBmb3IgY29kZSBjb21wbGV0aW9uLgogICovCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbkphdmFkb2NQYXJzZXIgZXh0ZW5kcyBKYXZhZG9jUGFyc2VyIHsKLQkKKwogCS8vIEluaXRpYWxpemUgbGVuZ3RoZXMgZm9yIGJsb2NrIGFuZCBpbmxpbmUgdGFncyB0YWJsZXMKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkxJTkVfQUxMX1RBR1NfTEVOR1RIOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX0FMTF9UQUdTX0xFTkdUSDsKQEAgLTQyLDExICs0MiwxMSBAQAogCQl9CiAJCUJMT0NLX0FMTF9UQUdTX0xFTkdUSCA9IGxlbmd0aDsKIAl9Ci0JCisKIAkvLyBMZXZlbCB0YWdzIGFyZSBhcnJheSBvZiBpbmxpbmUvYmxvY2sgdGFncyBkZXBlbmRpbmcgb24gY29tcGlsYXRpb24gc291cmNlIGxldmVsCiAJY2hhcltdW11bXSBsZXZlbFRhZ3MgPSBuZXcgY2hhclsyXVtdW107CiAJaW50W10gbGV2ZWxUYWdzTGVuZ3RoID0gbmV3IGludFsyXTsKLQkKKwogCS8vIENvbXBsZXRpb24gc3BlY2lmaWMgaW5mbwogCWludCBjdXJzb3JMb2NhdGlvbjsKIAlDb21wbGV0aW9uT25KYXZhZG9jIGNvbXBsZXRpb25Ob2RlID0gbnVsbDsKQEAgLTU3LDcgKzU3LDYgQEAKIAkJc3VwZXIoc291cmNlUGFyc2VyKTsKIAkJdGhpcy5zY2FubmVyID0gbmV3IENvbXBsZXRpb25TY2FubmVyKENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMpOwogCQl0aGlzLmtpbmQgPSBDT01QTEVUSU9OX1BBUlNFUiB8IFRFWFRfUEFSU0U7Ci0JCXRoaXMucmVwb3J0UHJvYmxlbXMgPSBmYWxzZTsKIAkJaW5pdExldmVsVGFncygpOwogCX0KIApAQCAtNjUsNyArNjQsOSBAQAogCSAqIERvIG5vdCBwYXJzZSBjb21tZW50IGlmIGNvbXBsZXRpb24gbG9jYXRpb24gaXMgbm90IGluY2x1ZGVkLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGNoZWNrRGVwcmVjYXRpb24oaW50IGNvbW1lbnRQdHIpIHsKLQkJdGhpcy5jdXJzb3JMb2NhdGlvbiA9ICgoQ29tcGxldGlvblBhcnNlcilzb3VyY2VQYXJzZXIpLmN1cnNvckxvY2F0aW9uOworCQlib29sZWFuIGlzRGVwcmVjYXRlZCA9IGZhbHNlOworCisJCXRoaXMuY3Vyc29yTG9jYXRpb24gPSAoKENvbXBsZXRpb25QYXJzZXIpdGhpcy5zb3VyY2VQYXJzZXIpLmN1cnNvckxvY2F0aW9uOwogCQlDb21wbGV0aW9uU2Nhbm5lciBjb21wbGV0aW9uU2Nhbm5lciA9IChDb21wbGV0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CiAJCWNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gdGhpcy5jdXJzb3JMb2NhdGlvbjsKIAkJdGhpcy5qYXZhZG9jU3RhcnQgPSB0aGlzLnNvdXJjZVBhcnNlci5zY2FubmVyLmNvbW1lbnRTdGFydHNbY29tbWVudFB0cl07CkBAIC03OCw5ICs3OSwxNSBAQAogCQkJdGhpcy5maXJzdFRhZ1Bvc2l0aW9uID0gMTsKIAkJCXN1cGVyLmNoZWNrRGVwcmVjYXRpb24oY29tbWVudFB0cik7CiAJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5zb3VyY2VQYXJzZXIuc2Nhbm5lci5jb21tZW50VGFnU3RhcnRzW2NvbW1lbnRQdHJdICE9IDApIHsKKwkJCQlib29sZWFuIHByZXZpb3VzVmFsdWUgPSB0aGlzLmNoZWNrRG9jQ29tbWVudDsKKwkJCQl0aGlzLmNoZWNrRG9jQ29tbWVudCA9IGZhbHNlOworCQkJCWlzRGVwcmVjYXRlZCA9IHN1cGVyLmNoZWNrRGVwcmVjYXRpb24oY29tbWVudFB0cik7CisJCQkJdGhpcy5jaGVja0RvY0NvbW1lbnQgPSBwcmV2aW91c1ZhbHVlOworCQkJfQogCQkJdGhpcy5kb2NDb21tZW50ID0gbnVsbDsKIAkJfQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBpc0RlcHJlY2F0ZWQ7CiAJfQogCiAJLyoKQEAgLTExMiw3ICsxMTksNyBAQAogCQkJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UoKEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBleHByZXNzaW9uVHlwZSk7CiAJCQl9CiAJCQlpZiAoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gYXJndW1lbnQ9Iitjb21wbGV0aW9uTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgljb21wbGV0aW9uIGFyZ3VtZW50PSIrdGhpcy5jb21wbGV0aW9uTm9kZSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCXJldHVybiB0aGlzLmNvbXBsZXRpb25Ob2RlOwogCQl9CkBAIC0xMzcsNyArMTQ0LDcgQEAKIAkJCX0KIAkJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKGZpZWxkUmVmLCB0aGlzLm1lbWJlclN0YXJ0LCBuYW1lKTsKIAkJCWlmIChDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBmaWVsZD0iK2NvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gZmllbGQ9Iit0aGlzLmNvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJcmV0dXJuIHRoaXMuY29tcGxldGlvbk5vZGU7CiAJCX0KQEAgLTE3MSw3ICsxNzgsNyBAQAogCQkJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKChKYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pbm9kZSwgdGhpcy5tZW1iZXJTdGFydCk7CiAJCQl9CiAJCQlpZiAoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gbWV0aG9kPSIrY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBtZXRob2Q9Iit0aGlzLmNvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJcmV0dXJuIHRoaXMuY29tcGxldGlvbk5vZGU7CiAJCX0KQEAgLTIzMCw3ICsyMzcsNyBAQAogCQl9CiAKIAkJaWYgKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gcGFydGlhbCBxdWFsaWZpZWQgdHlwZT0iK2NvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBwYXJ0aWFsIHF1YWxpZmllZCB0eXBlPSIrdGhpcy5jb21wbGV0aW9uTm9kZSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlyZXR1cm4gdGhpcy5jb21wbGV0aW9uTm9kZTsKIAl9CkBAIC0yNDcsNyArMjU0LDcgQEAKIAkJfQogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubGV2ZWxUYWdzW0lOTElORV9JRFhdLCAwLCBwb3NzaWJsZVRhZ3NbSU5MSU5FX0lEWF0gPSBuZXcgY2hhclt0aGlzLmxldmVsVGFnc0xlbmd0aFtJTkxJTkVfSURYXV1bXSwgMCwgdGhpcy5sZXZlbFRhZ3NMZW5ndGhbSU5MSU5FX0lEWF0pOwogCQlpZiAocHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCA9PSAwKSByZXR1cm4gcG9zc2libGVUYWdzOwotCQlpbnQga2luZHMgPSBsZXZlbFRhZ3MubGVuZ3RoOworCQlpbnQga2luZHMgPSB0aGlzLmxldmVsVGFncy5sZW5ndGg7CiAJCWZvciAoaW50IGs9MDsgazxraW5kczsgaysrKSB7CiAJCQlpbnQgbGVuZ3RoID0gcG9zc2libGVUYWdzW2tdLmxlbmd0aCwgc2l6ZSA9IDA7CiAJCQlpbnQgaW5kZXhlc1tdID0gbmV3IGludFtsZW5ndGhdOwpAQCAtMzA1LDcgKzMxMiw3IEBACiAJICogUGFyc2UgYXJndW1lbnQgaW4gQHNlZSB0YWcgbWV0aG9kIHJlZmVyZW5jZQogCSAqLwogCXByb3RlY3RlZCBPYmplY3QgcGFyc2VBcmd1bWVudHMoT2JqZWN0IHJlY2VpdmVyKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJCisKIAkJaWYgKHRoaXMudGFnU291cmNlU3RhcnQ+dGhpcy5jdXJzb3JMb2NhdGlvbikgewogCQkJcmV0dXJuIHN1cGVyLnBhcnNlQXJndW1lbnRzKHJlY2VpdmVyKTsKIAkJfQpAQCAtMzIxLDcgKzMyOCw3IEBACiAJCWxvbmdbXSBkaW1Qb3NpdGlvbnMgPSBuZXcgbG9uZ1syMF07IC8vIGFzc3VtZSB0aGF0IHRoZXJlIHdvbid0IGJlIG1vcmUgdGhhbiAyMCBkaW1lbnNpb25zLi4uCiAJCWNoYXJbXSBuYW1lID0gbnVsbDsKIAkJbG9uZyBhcmdOYW1lUG9zID0gLTE7Ci0JCQorCiAJCS8vIFBhcnNlIGFyZ3VtZW50cyBkZWNsYXJhdGlvbiBpZiBtZXRob2QgcmVmZXJlbmNlCiAJCW5leHRBcmcgOiB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbikgewogCkBAIC00MTMsNyArNDIwLDcgQEAKIAkJCX0gZWxzZSBpZiAoYXJnTmFtZSAhPSBudWxsKSB7IC8vIHZlcmlmeSB0aGF0IG5vIGFyZ3VtZW50IG5hbWUgaXMgZGVjbGFyZWQKIAkJCQlicmVhayBuZXh0QXJnOwogCQkJfQotCQkJCisKIAkJCS8vIFZlcmlmeSB0b2tlbiBwb3NpdGlvbgogCQkJaWYgKGZpcnN0QXJnKSB7CiAJCQkJbW9kdWxvID0gaVRva2VuICsgMTsKQEAgLTQ2OCw2ICs0NzUsNyBAQAogCQkJCQkJaWYgKCF2YWxpZCAmJiBjb21wbGV0aW9uU2Nhbm5lci5jb21wbGV0aW9uSWRlbnRpZmllciAhPSBudWxsICYmIGNvbXBsZXRpb25TY2FubmVyLmNvbXBsZXRpb25JZGVudGlmaWVyLmxlbmd0aCA9PSAwKSB7CiAJCQkJCQkJdmFsaWQgPSBwdXNoUGFyYW1OYW1lKHRydWUpOwogCQkJCQkJfQorCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggbmV4dCBjYXNlIHRvIHZlcmlmeSBhbmQgZ2V0IGlkZW50aWZpZXJzIHN0YWNrIGNvbnRlbnRzCiAJCQkJCWNhc2UgMToKIAkJCQkJCWlzVHlwZVBhcmFtID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbMF1bMF0gPT0gJzwnOwogCQkJCQkJaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllclN0YWNrWzFdOwpAQCAtNDc5LDcgKzQ4Nyw3IEBACiAJCQkJCQlpc1R5cGVQYXJhbSA9IGlkZW50aWZpZXIubGVuZ3RoID4gMCAmJiBpZGVudGlmaWVyWzBdID09ICc8JzsKIAkJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlpZiAoaWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIubGVuZ3RoID4gMCAmJiBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGlkZW50aWZpZXJbMF0pKSB7CisJCQkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLmxlbmd0aCA+IDAgJiYgU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgaWRlbnRpZmllclswXSkpIHsKIAkJCQkJbmFtZSA9IGlkZW50aWZpZXI7CiAJCQkJfQogCQkJCXN0YXJ0UG9zaXRpb24gPSAoaW50KSh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrWzBdPj4zMik7CkBAIC00OTUsNyArNTAzLDcgQEAKIAkJCQkJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY1BhcmFtTmFtZVJlZmVyZW5jZShuYW1lLCBuYW1lUG9zaXRpb24sIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKIAkJCQkJfQogCQkJCQlpZiAoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBwYXJhbT0iK2NvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBwYXJhbT0iK3RoaXMuY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKHRoaXMuY29tcGxldGlvbk5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlKSB7CiAJCQkJCUNvbXBsZXRpb25PbkphdmFkb2NQYXJhbU5hbWVSZWZlcmVuY2UgcGFyYW1OYW1lUmVmID0gKENvbXBsZXRpb25PbkphdmFkb2NQYXJhbU5hbWVSZWZlcmVuY2UpdGhpcy5jb21wbGV0aW9uTm9kZTsKQEAgLTU1Myw3ICs1NjEsNyBAQAogCQkJCWVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQl9CiAJCQlsb25nIHBvc2l0aW9uID0gKCgobG9uZylzdGFydFBvc2l0aW9uKTw8MzIpICsgZW5kOwotCQkJaW50IGxlbmd0aCA9IHRoaXMuY3Vyc29yTG9jYXRpb24rMS10YWdTb3VyY2VTdGFydDsKKwkJCWludCBsZW5ndGggPSB0aGlzLmN1cnNvckxvY2F0aW9uKzEtdGhpcy50YWdTb3VyY2VTdGFydDsKIAkJCWNoYXJbXSB0YWcgPSBuZXcgY2hhcltsZW5ndGhdOwogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy50YWdTb3VyY2VTdGFydCwgdGFnLCAwLCBsZW5ndGgpOwogCQkJY2hhcltdW11bXSB0YWdzID0gcG9zc2libGVUYWdzKHRhZywgbmV3TGluZSk7CkBAIC01ODUsNyArNTkzLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBwdXNoUGFyYW1OYW1lKGJvb2xlYW4gaXNUeXBlUGFyYW0pIHsKIAkJaWYgKHN1cGVyLnB1c2hQYXJhbU5hbWUoaXNUeXBlUGFyYW0pKSB7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJCS8vIFNlZSBpZiBleHByZXNzaW9uIGlzIGNvbmNlcm5lZCBieSBjb21wbGV0aW9uCiAJCQlpZiAoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCA8PSAodGhpcy5jdXJzb3JMb2NhdGlvbisxKSAmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDw9IGV4cHJlc3Npb24uc291cmNlRW5kKSB7CiAJCQkJaWYgKGlzVHlwZVBhcmFtKSB7CkBAIC01OTQsNyArNjAyLDcgQEAKIAkJCQkJdGhpcy5jb21wbGV0aW9uTm9kZSA9IG5ldyBDb21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlKChKYXZhZG9jU2luZ2xlTmFtZVJlZmVyZW5jZSlleHByZXNzaW9uKTsKIAkJCQl9CiAJCQkJaWYgKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJY29tcGxldGlvbiBwYXJhbT0iK2NvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgljb21wbGV0aW9uIHBhcmFtPSIrdGhpcy5jb21wbGV0aW9uTm9kZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTY0OCwxMyArNjU2LDEzIEBACiAJCQkJCQkJCQkJSmF2YWRvY01lc3NhZ2VTZW5kIG1zZ1NlbmQgPSAoSmF2YWRvY01lc3NhZ2VTZW5kKSBtZW1iZXI7CiAJCQkJCQkJCQkJdGhpcy5jb21wbGV0aW9uTm9kZSA9IG5ldyBDb21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQobXNnU2VuZCwgdGhpcy5tZW1iZXJTdGFydCwgZmxhZ3MpOwogCQkJCQkJCQkJCWlmIChDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7Ci0JCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCW5ldyBjb21wbGV0aW9uIG1ldGhvZD0iK2NvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgluZXcgY29tcGxldGlvbiBtZXRob2Q9Iit0aGlzLmNvbXBsZXRpb25Ob2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKSB7CiAJCQkJCQkJCQkJSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbikgbWVtYmVyOwogCQkJCQkJCQkJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKGFsbG9jLCB0aGlzLm1lbWJlclN0YXJ0LCBmbGFncyk7CiAJCQkJCQkJCQkJaWYgKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJbmV3IGNvbXBsZXRpb24gbWV0aG9kPSIrY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCW5ldyBjb21wbGV0aW9uIG1ldGhvZD0iK3RoaXMuY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQl0aGlzLmNvbXBsZXRpb25Ob2RlLmFkZENvbXBsZXRpb25GbGFncyhmbGFncyk7CkBAIC03NzksMTMgKzc4NywxMyBAQAogCXByb3RlY3RlZCBpbnQgcmVhZFRva2VuKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWludCB0b2tlbiA9IHN1cGVyLnJlYWRUb2tlbigpOwogCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciAmJiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID09IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKSB7Ci0JCQkvLyBTY2FubmVyIGlzIGxvb3Bpbmcgb24gZW1wdHkgdG9rZW4gPT4gcmVhZCBpdC4uLiAKKwkJCS8vIFNjYW5uZXIgaXMgbG9vcGluZyBvbiBlbXB0eSB0b2tlbiA9PiByZWFkIGl0Li4uCiAJCQl0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKIAkJfQogCQlyZXR1cm4gdG9rZW47CiAJfQogCi0JLyogCisJLyoKIAkgKiBSZWNvdmVyIHN5bnRheCBvbiBpbnZhbGlkIHF1YWxpZmllZCBuYW1lLgogCSAqLwogCXByb3RlY3RlZCBPYmplY3Qgc3ludGF4UmVjb3ZlclF1YWxpZmllZE5hbWUoaW50IHByaW1pdGl2ZVRva2VuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKQEAgLTgwMywxMiArODExLDEyIEBACiAJCXRoaXMuY29tcGxldGlvbk5vZGUgPSBuZXcgQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIHBvc2l0aW9ucywgdGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwogCiAJCWlmIChDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIgljb21wbGV0aW9uIHBhcnRpYWwgcXVhbGlmaWVkIHR5cGU9Iitjb21wbGV0aW9uTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gcGFydGlhbCBxdWFsaWZpZWQgdHlwZT0iK3RoaXMuY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJcmV0dXJuIHRoaXMuY29tcGxldGlvbk5vZGU7CiAJfQogCi0JLyogCisJLyoKIAkgKiBSZWNvdmVyIHN5bnRheCBvbiB0eXBlIGFyZ3VtZW50IGluIGludmFsaWQgbWV0aG9kL2NvbnN0cnVjdG9yIHJlZmVyZW5jZQogCSAqLwogCXByb3RlY3RlZCBPYmplY3Qgc3ludGF4UmVjb3ZlckFyZ3VtZW50VHlwZShPYmplY3QgcmVjZWl2ZXIsIExpc3QgYXJndW1lbnRzLCBPYmplY3QgYXJndW1lbnQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewpAQCAtODU4LDcgKzg2Niw3IEBACiAJCQl0aGlzLmNvbXBsZXRpb25Ob2RlID0gbmV3IENvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbihhbGxvY0V4cCwgdGhpcy5tZW1iZXJTdGFydCk7CiAJCX0KIAkJaWYgKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gbWV0aG9kPSIrY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgljb21wbGV0aW9uIG1ldGhvZD0iK3RoaXMuY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJcmV0dXJuIHRoaXMuY29tcGxldGlvbk5vZGU7CiAJfQpAQCAtODgxLDcgKzg4OSw3IEBACiAJCQl0aGlzLmNvbXBsZXRpb25Ob2RlID0gbmV3IENvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbihhbGxvY0V4cCwgdGhpcy5tZW1iZXJTdGFydCk7CiAJCX0KIAkJaWYgKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCWNvbXBsZXRpb24gbWV0aG9kPSIrY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgljb21wbGV0aW9uIG1ldGhvZD0iK3RoaXMuY29tcGxldGlvbk5vZGUpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJcmV0dXJuIHRoaXMuY29tcGxldGlvbk5vZGU7CiAJfQpAQCAtODkxLDEwICs4OTksMTAgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb2NDb21tZW50KCkgewogCQlzdXBlci51cGRhdGVEb2NDb21tZW50KCk7Ci0JCWlmIChjb21wbGV0aW9uTm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKKwkJaWYgKHRoaXMuY29tcGxldGlvbk5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQlnZXRDb21wbGV0aW9uUGFyc2VyKCkuYXNzaXN0Tm9kZVBhcmVudCA9IHRoaXMuZG9jQ29tbWVudDsKIAkJCWdldENvbXBsZXRpb25QYXJzZXIoKS5hc3Npc3ROb2RlID0gKEFTVE5vZGUpIHRoaXMuY29tcGxldGlvbk5vZGU7Ci0JCQlnZXRDb21wbGV0aW9uSmF2YWRvYygpLmNvbXBsZXRpb25Ob2RlID0gKEV4cHJlc3Npb24pIGNvbXBsZXRpb25Ob2RlOworCQkJZ2V0Q29tcGxldGlvbkphdmFkb2MoKS5jb21wbGV0aW9uTm9kZSA9IChFeHByZXNzaW9uKSB0aGlzLmNvbXBsZXRpb25Ob2RlOwogCQl9CiAJfQogCkBAIC05MDksNSArOTE3LDUgQEAKIAkJfQogCQlyZXR1cm4gc3VwZXIudmVyaWZ5U3BhY2VPckVuZENvbW1lbnQoKTsKIAl9Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk5vZGVEZXRlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZURldGVjdG9yLmphdmEKaW5kZXggYjI2ZGU3My4uNjE3YWNlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZURldGVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZURldGVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjAgKzIxLDIwIEBACiAJcHJpdmF0ZSBBU1ROb2RlIHNlYXJjaGVkTm9kZTsKIAlwcml2YXRlIEFTVE5vZGUgcGFyZW50OwogCXByaXZhdGUgYm9vbGVhbiByZXN1bHQ7Ci0JCisKIAlwdWJsaWMgQ29tcGxldGlvbk5vZGVEZXRlY3RvcihBU1ROb2RlIHNlYXJjaGVkTm9kZSwgQVNUTm9kZSB2aXNpdGVkQXN0KXsKIAkJdGhpcy5zZWFyY2hlZE5vZGUgPSBzZWFyY2hlZE5vZGU7CiAJCXRoaXMucmVzdWx0ID0gZmFsc2U7Ci0JCQorCiAJCWlmKHNlYXJjaGVkTm9kZSAhPSBudWxsICYmIHZpc2l0ZWRBc3QgIT0gbnVsbCkgewogCQkJdmlzaXRlZEFzdC50cmF2ZXJzZSh0aGlzLCBudWxsKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSB7CiAJCXJldHVybiB0aGlzLnJlc3VsdDsKIAl9Ci0JCisKIAlwdWJsaWMgQVNUTm9kZSBnZXRDb21wbGV0aW9uTm9kZVBhcmVudCgpIHsKIAkJcmV0dXJuIHRoaXMucGFyZW50OwogCX0KQEAgLTI4Niw3ICsyODYsNyBAQAogCQkJaWYoIShhc3ROb2RlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24gJiYgKChBbGxvY2F0aW9uRXhwcmVzc2lvbikgYXN0Tm9kZSkudHlwZSA9PSB0aGlzLnNlYXJjaGVkTm9kZSkKIAkJCQkmJiAhKGFzdE5vZGUgaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHJlc3Npb24gJiYgKChDb25kaXRpb25hbEV4cHJlc3Npb24pIGFzdE5vZGUpLnZhbHVlSWZUcnVlID09IHRoaXMuc2VhcmNoZWROb2RlKQogCQkJCSYmICEoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcmVzc2lvbiAmJiAoKENvbmRpdGlvbmFsRXhwcmVzc2lvbikgYXN0Tm9kZSkudmFsdWVJZkZhbHNlID09IHRoaXMuc2VhcmNoZWROb2RlKSkgewotCQkJCXRoaXMucGFyZW50ID0gYXN0Tm9kZTsJCisJCQkJdGhpcy5wYXJlbnQgPSBhc3ROb2RlOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZUZvdW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQppbmRleCA3MmVjZGU1Li5hMGY2NTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxNCArMTUsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk5vZGVGb3VuZCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQorCiAJcHVibGljIEFTVE5vZGUgYXN0Tm9kZTsKIAlwdWJsaWMgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nOwogCXB1YmxpYyBTY29wZSBzY29wZTsKIAlwdWJsaWMgYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjk4MTQzNzY4NDE4NDA5MTQ2Mkw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogcHVibGljIENvbXBsZXRpb25Ob2RlRm91bmQoKSB7CiAJdGhpcyhudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7IC8vIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpci5qYXZhCmluZGV4IGVhMTE5Y2UuLjY0OTZlZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDE3ICsyMywxNyBAQAogCQl0aGlzLm1lbWJlclZhbHVlUGFpcnMgPSBtZW1iZXJWYWx1ZVBhaXJzOwogCQl0aGlzLmNvbXBsZXRlZE1lbWJlclZhbHVlUGFpciA9IGNvbXBsZXRlZE1lbWJlclZhbHVlUGFpcjsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCQorCiAJCWlmICh0aGlzLnJlc29sdmVkVHlwZSA9PSBudWxsIHx8ICF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCgpOwogCQl9IGVsc2UgewogCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcy5jb21wbGV0ZWRNZW1iZXJWYWx1ZVBhaXIsIHNjb3BlKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJb3V0cHV0LmFwcGVuZCgnQCcpOwogCQl0aGlzLnR5cGUucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CkBAIC00OSw3ICs0OSw3IEBACiAJCX0KIAkJdGhpcy5jb21wbGV0ZWRNZW1iZXJWYWx1ZVBhaXIucHJpbnQoaW5kZW50LCBvdXRwdXQpOwogCQlvdXRwdXQuYXBwZW5kKCcpJyk7Ci0JCQorCiAJCXJldHVybiBvdXRwdXQ7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Bbm5vdGF0aW9uT2ZUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUuamF2YQppbmRleCA3ZjVhNDA2Li5jZmFlMDc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw3ICsyMCw3IEBACiAJLy8gRHVyaW5nIHJlY292ZXJ5IGEgcGFyYW1ldGVyIGNhbiBiZSBwYXJzZWQgYXMgYSBGaWVsZERlY2xhcmF0aW9uIGluc3RlYWQgb2YgQXJndW1lbnQuCiAJLy8gJ2lzUGFyYW1ldGVyJyBpcyBzZXQgdG8gdHJ1ZSBpbiB0aGlzIGNhc2UuCiAJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXI7Ci0JCisKIAlwdWJsaWMgQ29tcGxldGlvbk9uQW5ub3RhdGlvbk9mVHlwZShjaGFyW10gdHlwZU5hbWUsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBBbm5vdGF0aW9uIGFubm90YXRpb24pewogCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CiAJCXRoaXMuc291cmNlRW5kID0gYW5ub3RhdGlvbi5zb3VyY2VFbmQ7CkBAIC0yOCw3ICsyOCw3IEBACiAJCXRoaXMubmFtZSA9IHR5cGVOYW1lOwogCQl0aGlzLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXXthbm5vdGF0aW9ufTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnNbMF0ucHJpbnQoaW5kZW50LCBvdXRwdXQpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQXJndW1lbnROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFyZ3VtZW50TmFtZS5qYXZhCmluZGV4IDU1ZTM2ZmYuLjRhYmI4ZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQXJndW1lbnROYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Bcmd1bWVudE5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSwxNSArMjksMTUgQEAKIAkJc3VwZXIoQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZSwgRkFLRU5BTUVTVUZGSVgpLCBwb3NOb20sIHRyLCBtb2RpZmllcnMpOwogCQl0aGlzLnJlYWxOYW1lID0gbmFtZTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBiaW5kKE1ldGhvZFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyB0eXBlQmluZGluZywgYm9vbGVhbiB1c2VkKSB7CiAKIAkJc3VwZXIuYmluZChzY29wZSwgdHlwZUJpbmRpbmcsIHVzZWQpOwogCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCQorCiAJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KTsKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25Bcmd1bWVudE5hbWU6Iik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKHRoaXMudHlwZSAhPSBudWxsKSB0aGlzLnR5cGUucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoJyAnKTsKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJCXRoaXMuaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCX0KIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKLQl9CQorCX0KIAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkJyYW5rU3RhdGVtZW50TGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQnJhbmNoU3RhdGVtZW50TGFiZWwuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbC5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsLmphdmEKaW5kZXggZTc5MDgyNC4uMWM5NDBkNQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkJyYW5rU3RhdGVtZW50TGFiZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsMTQgKzE1LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbCBleHRlbmRzIEJyYW5jaFN0YXRlbWVudCB7CitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uQnJhbmNoU3RhdGVtZW50TGFiZWwgZXh0ZW5kcyBCcmFuY2hTdGF0ZW1lbnQgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJSRUFLID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5VRSA9IDI7Ci0JCisKIAlwcml2YXRlIGludCBraW5kOwogCXB1YmxpYyBjaGFyW11bXSBwb3NzaWJsZUxhYmVsczsKLQkKLQlwdWJsaWMgQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbChpbnQga2luZCwgY2hhcltdIGwsIGludCBzLCBpbnQgZSwgY2hhcltdW10gcG9zc2libGVMYWJlbHMpIHsKKworCXB1YmxpYyBDb21wbGV0aW9uT25CcmFuY2hTdGF0ZW1lbnRMYWJlbChpbnQga2luZCwgY2hhcltdIGwsIGludCBzLCBpbnQgZSwgY2hhcltdW10gcG9zc2libGVMYWJlbHMpIHsKIAkJc3VwZXIobCwgcywgZSk7CiAJCXRoaXMua2luZCA9IGtpbmQ7CiAJCXRoaXMucG9zc2libGVMYWJlbHMgPSBwb3NzaWJsZUxhYmVsczsKQEAgLTM5LDEzICszOSwxMyBAQAogCX0KIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOwotCQlpZihraW5kID09IENPTlRJTlVFKSB7CisJCWlmKHRoaXMua2luZCA9PSBDT05USU5VRSkgewogCQkJb3V0cHV0LmFwcGVuZCgiY29udGludWUgIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBlbHNlIHsKIAkJCW91dHB1dC5hcHBlbmQoImJyZWFrICIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25MYWJlbDoiKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKGxhYmVsKTsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLmxhYmVsKTsKIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoIj47Iik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCmluZGV4IDg0MzA2ZWYuLmU3YzEyNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNSwyNCArMzUsMjQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MgZXh0ZW5kcyBDbGFzc0xpdGVyYWxBY2Nlc3MgewotCQorCiAJcHVibGljIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllcjsKIAlwdWJsaWMgaW50IGNsYXNzU3RhcnQ7Ci0JCisKIAlwdWJsaWMgQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKGxvbmcgcG9zLCBUeXBlUmVmZXJlbmNlIHQpIHsKLQkJCisKIAkJc3VwZXIoKGludClwb3MsIHQpOwogCQl0aGlzLmNsYXNzU3RhcnQgPSAoaW50KSAocG9zID4+PiAzMik7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQkKKwogCQlvdXRwdXQuYXBwZW5kKCI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczoiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gdGhpcy50eXBlLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCcuJykuYXBwZW5kKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgnPicpOwogCX0KLQkKKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCWlmIChzdXBlci5yZXNvbHZlVHlwZShzY29wZSkgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQppbmRleCBjNTBjZmJjLi5mMmRmOWI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQwLDkgKzQwLDkgQEAKIAlwdWJsaWMgQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoaW50IGFjY2Vzc01vZGUpIHsKIAkJc3VwZXIoYWNjZXNzTW9kZSk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCQorCiAJCXByaW50SW5kZW50KHRhYiwgb3V0cHV0KTsKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDoiKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpIHRoaXMucXVhbGlmaWNhdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJy4nKTsKQEAgLTYzLDEzICs2MywxMyBAQAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkKKwogCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewogCQkJaW50IGFyZ3NMZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCQlmb3IgKGludCBhID0gYXJnc0xlbmd0aDsgLS1hID49IDA7KQogCQkJCXRoaXMuYXJndW1lbnRzW2FdLnJlc29sdmVUeXBlKHNjb3BlKTsKIAkJfQotCQorCiAJCWlmICh0aGlzLmFjY2Vzc01vZGUgIT0gVGhpcyAmJiByZWNlaXZlclR5cGUgIT0gbnVsbCkgewogCQkJaWYgKHJlY2VpdmVyVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKQogCQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25GaWVsZE5hbWUuamF2YQppbmRleCBhNjRiNWUzLi5lZDY4N2RhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGROYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjIgKzIxLDIyIEBACiAJCXN1cGVyKENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIEZBS0VOQU1FU1VGRklYKSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAJCXRoaXMucmVhbE5hbWUgPSBuYW1lOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQkKKwogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKCI8Q29tcGxldGVPbkZpZWxkTmFtZToiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHlwZSAhPSBudWxsKSB0eXBlLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCcgJyk7Ci0JCW91dHB1dC5hcHBlbmQocmVhbE5hbWUpOwotCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHRoaXMudHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOworCQlvdXRwdXQuYXBwZW5kKHRoaXMucmVhbE5hbWUpOworCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAJCQlvdXRwdXQuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7IAorCQkJdGhpcy5pbml0aWFsaXphdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAkJfQogCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPjsiKTsgLy8kTk9OLU5MUy0xJAotCX0JCisJfQogCiAJcHVibGljIHZvaWQgcmVzb2x2ZShNZXRob2RTY29wZSBpbml0aWFsaXphdGlvblNjb3BlKSB7CiAJCXN1cGVyLnJlc29sdmUoaW5pdGlhbGl6YXRpb25TY29wZSk7Ci0JCQorCiAJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIGluaXRpYWxpemF0aW9uU2NvcGUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkVHlwZS5qYXZhCmluZGV4IGI2ZjU5ZGUuLjgxMTEwNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGRUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25GaWVsZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMCwxMyArMzAsMTMgQEAKICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbiBhcmUgYWxsIHRoZSBhcmd1bWVudHMgZGVmaW5lZAogICogYmVmb3JlIHRoZSBjdXJzb3IuCiAgKi8KLSAKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uRmllbGRUeXBlIGV4dGVuZHMgRmllbGREZWNsYXJhdGlvbiB7CiAJcHVibGljIGJvb2xlYW4gaXNMb2NhbFZhcmlhYmxlOwotCQorCiBwdWJsaWMgQ29tcGxldGlvbk9uRmllbGRUeXBlKFR5cGVSZWZlcmVuY2UgdHlwZSwgYm9vbGVhbiBpc0xvY2FsVmFyaWFibGUpewogCXN1cGVyKCk7CiAJdGhpcy5zb3VyY2VTdGFydCA9IHR5cGUuc291cmNlU3RhcnQ7CkBAIC01MCw2ICs1MCw2IEBACiB9CiAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCXJldHVybiB0eXBlLnByaW50KHRhYiwgb3V0cHV0KS5hcHBlbmQoJzsnKTsgCisJcmV0dXJuIHRoaXMudHlwZS5wcmludCh0YWIsIG91dHB1dCkuYXBwZW5kKCc7Jyk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQppbmRleCA2OTA1Mzc0Li5lYTk0YmMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDIsOSArNDIsOSBAQAogcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0LCBib29sZWFuIHdpdGhPbkRlbWFuZCkgewogCiAJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiPENvbXBsZXRlT25JbXBvcnQ6Iik7IC8vJE5PTi1OTFMtMSQKLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHsKIAkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCcuJyk7Ci0JCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2Vuc1tpXSk7CiAJfQogCXJldHVybiBvdXRwdXQuYXBwZW5kKCc+Jyk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvYy5qYXZhCmluZGV4IGI1YTdkOTUuLjhjYzYwYjEgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvYy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvYy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0LDcgKzI0LDcgQEAKIAogCS8qKgogCSAqIEdldCBjb21wbGV0aW9uIG5vZGUgZmxhZ3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGludCBGbGFncyBvZiB0aGUgamF2YWRvYyBjb21wbGV0aW9uIG5vZGUuCiAJICovCiAJcHVibGljIGludCBnZXRDb21wbGV0aW9uRmxhZ3MoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCmluZGV4IDkwNTJhNzguLmMyYzFjNGQgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01Niw3ICs1Niw3IEBACiAKIAkvKioKIAkgKiBHZXQgY29tcGxldGlvbiBub2RlIGZsYWdzLgotCSAqIAorCSAqCiAJICogQHJldHVybiBpbnQgRmxhZ3Mgb2YgdGhlIGphdmFkb2MgY29tcGxldGlvbiBub2RlLgogCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q29tcGxldGlvbkZsYWdzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY0ZpZWxkUmVmZXJlbmNlLmphdmEKaW5kZXggOGRjZjgwYy4uNDU3Njk1OCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jRmllbGRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NGaWVsZFJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTc1LDcgKzc1LDcgQEAKIAogCS8qKgogCSAqIEdldCBjb21wbGV0aW9uIG5vZGUgZmxhZ3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGludCBGbGFncyBvZiB0aGUgamF2YWRvYyBjb21wbGV0aW9uIG5vZGUuCiAJICovCiAJcHVibGljIGludCBnZXRDb21wbGV0aW9uRmxhZ3MoKSB7CkBAIC05MCwxNCArOTAsMTQgQEAKIAkJaWYgKHRoaXMudG9rZW4gIT0gbnVsbCkgewogCQkJcmV0dXJuIHN1cGVyLmludGVybmFsUmVzb2x2ZVR5cGUoc2NvcGUpOwogCQl9Ci0JCQorCiAJCS8vIFJlc29sdmUgb25seSByZWNlaXZlcgogCQlpZiAodGhpcy5yZWNlaXZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlY2VpdmVyVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwogCQl9IGVsc2UgaWYgKHNjb3BlLmtpbmQgPT0gU2NvcGUuQ0xBU1NfU0NPUEUpIHsKLQkJCXRoaXMucmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZSgoQ2xhc3NTY29wZSkgc2NvcGUpOworCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKChDbGFzc1Njb3BlKSBzY29wZSk7CiAJCX0gZWxzZSB7Ci0JCQl0aGlzLnJlY2VpdmVyVHlwZSA9IHRoaXMucmVjZWl2ZXIucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUpOworCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKChCbG9ja1Njb3BlKXNjb3BlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NNZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jTWVzc2FnZVNlbmQuamF2YQppbmRleCBhYzFlNjc4Li4xMzNjMzRiIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NNZXNzYWdlU2VuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY01lc3NhZ2VTZW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTUsNyArNTUsNyBAQAogCiAJLyoqCiAJICogR2V0IGNvbXBsZXRpb24gbm9kZSBmbGFncy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gaW50IEZsYWdzIG9mIHRoZSBqYXZhZG9jIGNvbXBsZXRpb24gbm9kZS4KIAkgKi8KIAlwdWJsaWMgaW50IGdldENvbXBsZXRpb25GbGFncygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY1BhcmFtTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggNWZiMjdkMy4uZDU3MjNlZSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jUGFyYW1OYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzYsNyArMzYsNyBAQAogCiAJLyoqCiAJICogR2V0IGNvbXBsZXRpb24gbm9kZSBmbGFncy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gaW50IEZsYWdzIG9mIHRoZSBqYXZhZG9jIGNvbXBsZXRpb24gbm9kZS4KIAkgKi8KIAlwdWJsaWMgaW50IGdldENvbXBsZXRpb25GbGFncygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCA0NmFjOTZiLi5mNmU0YTMxIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTUyLDcgKzUyLDcgQEAKIAogCS8qKgogCSAqIEdldCBjb21wbGV0aW9uIG5vZGUgZmxhZ3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGludCBGbGFncyBvZiB0aGUgamF2YWRvYyBjb21wbGV0aW9uIG5vZGUuCiAJICovCiAJcHVibGljIGludCBnZXRDb21wbGV0aW9uRmxhZ3MoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggYjlhNmExZC4uMTEzYjQxOSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00OCw3ICs0OCw3IEBACiAKIAkvKioKIAkgKiBHZXQgY29tcGxldGlvbiBub2RlIGZsYWdzLgotCSAqIAorCSAqCiAJICogQHJldHVybiBpbnQgRmxhZ3Mgb2YgdGhlIGphdmFkb2MgY29tcGxldGlvbiBub2RlLgogCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q29tcGxldGlvbkZsYWdzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jVGFnLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUYWcuamF2YQppbmRleCA3MmU3YzA1Li5hZmFhMWQ5IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUYWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUYWcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw2ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CkBAIC0zOCw3ICszOSw3IEBACiAKIAkvKioKIAkgKiBHZXQgY29tcGxldGlvbiBub2RlIGZsYWdzLgotCSAqIAorCSAqCiAJICogQHJldHVybiBpbnQgRmxhZ3Mgb2YgdGhlIGphdmFkb2MgY29tcGxldGlvbiBub2RlLgogCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q29tcGxldGlvbkZsYWdzKCkgewpAQCAtODksNiArOTAsMTYgQEAKIAkJY2hhcltdW10gc3BlY2lmaWVkVGFncyA9IG51bGw7CiAJCXN3aXRjaCAoa2luZCkgewogCQkJY2FzZSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFOgorCQkJCS8vIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1NzUyCisJCQkJLy8gQ2hlY2sgZm9yIEZBS0VfVFlQRV9OQU1FIHRvIGFsbG93IHByb3Bvc2FscyAoQHNlZSBDb21wbGV0aW9uUGFyc2VyI2NvbnN1bWVDb21waWxhdGlvblVuaXQpCisJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCk7CisJCQkJaWYgKGNvbXBpbGF0aW9uVW5pdCAhPSBudWxsICYmCisJCQkJCQkoY29tcGlsYXRpb25Vbml0LnR5cGVzLmxlbmd0aCA+IDAgJiYgY29tcGlsYXRpb25Vbml0LnR5cGVzWzBdLm5hbWUgPT0gQ29tcGxldGlvblBhcnNlci5GQUtFX1RZUEVfTkFNRSkpIHsKKwkJCQkJc3BlY2lmaWVkVGFncyA9IENMQVNTX1RBR1M7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3BlY2lmaWVkVGFncyA9IENPTVBJTEFUSU9OX1VOSVRfVEFHUzsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFOgogCQkJCXNwZWNpZmllZFRhZ3MgPSBDTEFTU19UQUdTOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25KYXZhZG9jVHlwZVBhcmFtUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUeXBlUGFyYW1SZWZlcmVuY2UuamF2YQppbmRleCBmOTEzYmMzLi4yYWUyYWNmIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUeXBlUGFyYW1SZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkphdmFkb2NUeXBlUGFyYW1SZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNSw3ICszNSw3IEBACiAKIAkvKioKIAkgKiBHZXQgY29tcGxldGlvbiBub2RlIGZsYWdzLgotCSAqIAorCSAqCiAJICogQHJldHVybiBpbnQgRmxhZ3Mgb2YgdGhlIGphdmFkb2MgY29tcGxldGlvbiBub2RlLgogCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q29tcGxldGlvbkZsYWdzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQuamF2YQppbmRleCBhYTk1MTViLi5hMmFkZTc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw3ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiBwdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRpb25PbktleXdvcmQgewotCQorCiAJY2hhcltdIGdldFRva2VuKCk7CiAJY2hhcltdW10gZ2V0UG9zc2libGVLZXl3b3JkcygpOwogCWJvb2xlYW4gY2FuQ29tcGxldGVFbXB0eVRva2VuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQxLmphdmEKaW5kZXggZWMxMDlmYy4uMjljNGQ2ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkMS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw3ICsxNyw3IEBACiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uS2V5d29yZDEgZXh0ZW5kcyBTaW5nbGVUeXBlUmVmZXJlbmNlIGltcGxlbWVudHMgQ29tcGxldGlvbk9uS2V5d29yZCB7CiAJcHJpdmF0ZSBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzOwogCXB1YmxpYyBib29sZWFuIGNhbkNvbXBsZXRlRW1wdHlUb2tlbjsKLQkKKwogCXB1YmxpYyBDb21wbGV0aW9uT25LZXl3b3JkMShjaGFyW10gdG9rZW4sIGxvbmcgcG9zLCBjaGFyW10gcG9zc2libGVLZXl3b3JkKSB7CiAJCXRoaXModG9rZW4sIHBvcywgbmV3IGNoYXJbXVtde3Bvc3NpYmxlS2V5d29yZH0pOwogCX0KQEAgLTI5LDEwICsyOSwxMCBAQAogCQlyZXR1cm4gdGhpcy5jYW5Db21wbGV0ZUVtcHR5VG9rZW47CiAJfQogCXB1YmxpYyBjaGFyW10gZ2V0VG9rZW4oKSB7Ci0JCXJldHVybiB0b2tlbjsKKwkJcmV0dXJuIHRoaXMudG9rZW47CiAJfQogCXB1YmxpYyBjaGFyW11bXSBnZXRQb3NzaWJsZUtleXdvcmRzKCkgewotCQlyZXR1cm4gcG9zc2libGVLZXl3b3JkczsKKwkJcmV0dXJuIHRoaXMucG9zc2libGVLZXl3b3JkczsKIAl9CiAJcHVibGljIHZvaWQgYWJvdXRUb1Jlc29sdmUoU2NvcGUgc2NvcGUpIHsKIAkJZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOwpAQCAtNDEsNyArNDEsNyBAQAogCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CiAJfQogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewotCQkKLQkJcmV0dXJuIG91dHB1dC5hcHBlbmQoIjxDb21wbGV0ZU9uS2V5d29yZDoiKS5hcHBlbmQodG9rZW4pLmFwcGVuZCgnPicpOyAgLy8kTk9OLU5MUy0xJCAKKworCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25LZXl3b3JkOiIpLmFwcGVuZCh0aGlzLnRva2VuKS5hcHBlbmQoJz4nKTsgIC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQyLmphdmEKaW5kZXggNzMyZjQyZS4uODU3ODg0MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSwxMyArMjUsMTMgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlwdWJsaWMgY2hhcltdIGdldFRva2VuKCkgewotCQlyZXR1cm4gdG9rZW47CisJCXJldHVybiB0aGlzLnRva2VuOwogCX0KIAlwdWJsaWMgY2hhcltdW10gZ2V0UG9zc2libGVLZXl3b3JkcygpIHsKLQkJcmV0dXJuIHBvc3NpYmxlS2V5d29yZHM7CisJCXJldHVybiB0aGlzLnBvc3NpYmxlS2V5d29yZHM7CiAJfQogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsKLQkJCi0JCXJldHVybiBwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCI8Q29tcGxldGVPbktleXdvcmQ6IikuYXBwZW5kKHRva2VuKS5hcHBlbmQoJz4nKTsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiBwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCI8Q29tcGxldGVPbktleXdvcmQ6IikuYXBwZW5kKHRoaXMudG9rZW4pLmFwcGVuZCgnPicpOyAvLyROT04tTkxTLTEkCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkMy5qYXZhCmluZGV4IDUxYjIzNmIuLmU2ZTNhODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsMTQgKzI4LDE0IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcHVibGljIGNoYXJbXSBnZXRUb2tlbigpIHsKLQkJcmV0dXJuIHRva2VuOworCQlyZXR1cm4gdGhpcy50b2tlbjsKIAl9CiAJcHVibGljIGNoYXJbXVtdIGdldFBvc3NpYmxlS2V5d29yZHMoKSB7Ci0JCXJldHVybiBwb3NzaWJsZUtleXdvcmRzOworCQlyZXR1cm4gdGhpcy5wb3NzaWJsZUtleXdvcmRzOwogCX0KIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCQotCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25LZXl3b3JkOiIpLmFwcGVuZCh0b2tlbikuYXBwZW5kKCc+Jyk7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25LZXl3b3JkOiIpLmFwcGVuZCh0aGlzLnRva2VuKS5hcHBlbmQoJz4nKTsgLy8kTk9OLU5MUy0xJAogCX0KIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkxvY2FsTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Mb2NhbE5hbWUuamF2YQppbmRleCBiMmFlMmE3Li5mNTlmMDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkxvY2FsTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTG9jYWxOYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMjggKzI0LDI4IEBACiAJCXN1cGVyKENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIEZBS0VOQU1FU1VGRklYKSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAJCXRoaXMucmVhbE5hbWUgPSBuYW1lOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewotCQkKKwogCQlzdXBlci5yZXNvbHZlKHNjb3BlKTsKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRBc0V4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIjxDb21wbGV0ZU9uTG9jYWxOYW1lOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwpICB0eXBlLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCcgJyk7CisJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgIHRoaXMudHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOwogCQlvdXRwdXQuYXBwZW5kKHRoaXMucmVhbE5hbWUpOwotCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAJCQlvdXRwdXQuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7IAorCQkJdGhpcy5pbml0aWFsaXphdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAkJfQogCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnPicpOwogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQl0aGlzLnByaW50QXNFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KTsKKwkJcHJpbnRBc0V4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOwogCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnOycpOwotCX0JCisJfQogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1hcmtlckFubm90YXRpb25OYW1lLmphdmEKaW5kZXggM2Y0ZGEyMS4uYTgwMmQ5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NYXJrZXJBbm5vdGF0aW9uTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWFya2VyQW5ub3RhdGlvbk5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwxMCArMjEsMTAgQEAKIAlwdWJsaWMgQ29tcGxldGlvbk9uTWFya2VyQW5ub3RhdGlvbk5hbWUoVHlwZVJlZmVyZW5jZSB0eXBlLCBpbnQgc291cmNlU3RhcnQpewogCQlzdXBlcih0eXBlLCBzb3VyY2VTdGFydCk7CiAJfQotCQorCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJaWYodHlwZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB0eXBlOworCQlpZih0aGlzLnR5cGUgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgdGhpcy50eXBlOwogCQkJQmluZGluZyBiaW5kaW5nID0gc2NvcGUucGFyZW50LmdldFR5cGVPclBhY2thZ2UocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS50b2tlbnMpOyAvLyBzdGVwIHVwIGZyb20gdGhlIENsYXNzU2NvcGUKIAkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lbWJlckFjY2Vzcy5qYXZhCmluZGV4IDc4YWQyYTYuLjczZDRmYzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw3ICsxMiw3IEBACiAKIC8qCiAgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCi0gKiByZWR1Y2UgYW4gYWNjZXNzIHRvIGEgbWVtYmVyIChmaWVsZCByZWZlcmVuY2Ugb3IgbWVzc2FnZSBzZW5kKSAKKyAqIHJlZHVjZSBhbiBhY2Nlc3MgdG8gYSBtZW1iZXIgKGZpZWxkIHJlZmVyZW5jZSBvciBtZXNzYWdlIHNlbmQpCiAgKiBjb250YWluaW5nIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIuCiAgKiBlLmcuCiAgKgpAQCAtMzYsMjcgKzM2LDI3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzIGV4dGVuZHMgRmllbGRSZWZlcmVuY2UgewotCQorCiAJcHVibGljIGJvb2xlYW4gaXNJbnNpZGVBbm5vdGF0aW9uOwotCQorCiAJcHVibGljIENvbXBsZXRpb25Pbk1lbWJlckFjY2VzcyhjaGFyW10gc291cmNlLCBsb25nIHBvcywgYm9vbGVhbiBpc0luc2lkZUFubm90YXRpb24pIHsKLQkJCisKIAkJc3VwZXIoc291cmNlLCBwb3MpOwogCQl0aGlzLmlzSW5zaWRlQW5ub3RhdGlvbiA9IGlzSW5zaWRlQW5ub3RhdGlvbjsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnPicpOyAKKwkJcmV0dXJuIHN1cGVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnPicpOwogCX0KIAogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQotCQl0aGlzLnJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJCi0JCWlmICh0aGlzLnJlY2VpdmVyVHlwZSA9PSBudWxsICYmIHJlY2VpdmVyIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKLQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSByZWNlaXZlcjsKKworCQl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMucmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCisJCWlmICgodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPT0gbnVsbCB8fCAhdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgJiYgdGhpcy5yZWNlaXZlciBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgdGhpcy5yZWNlaXZlcjsKIAkJCWlmKG1lc3NhZ2VTZW5kLnJlY2VpdmVyIGluc3RhbmNlb2YgVGhpc1JlZmVyZW5jZSkgewogCQkJCUV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7CiAJCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7CkBAIC02NywxNiArNjcsMTYgQEAKIAkJCQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJCQorCiAJCQkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbU1ldGhvZEJpbmRpbmcgPSBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWVzc2FnZVNlbmQuc2VsZWN0b3IsIGFyZ0JpbmRpbmdzLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgcHJvYmxlbU1ldGhvZEJpbmRpbmcsIHNjb3BlKTsKIAkJCX0KIAkJfQotCQkKLQkJaWYgKHRoaXMucmVjZWl2ZXJUeXBlID09IG51bGwgfHwgdGhpcy5yZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQorCisJCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9PSBudWxsIHx8IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSB8fCAhdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAJCWVsc2UKLQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRoaXMucmVjZWl2ZXJUeXBlLCBzY29wZSk7CisJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgc2NvcGUpOwogCQkvLyBhcnJheSB0eXBlcyBhcmUgcGFzc2VkIGFsb25nIHRvIGZpbmQgdGhlIGxlbmd0aCBmaWVsZAogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZS5qYXZhCmluZGV4IDJiZWMxYzguLjkxM2FmZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJWYWx1ZU5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSwxMCArMjksMTAgQEAKIAlwdWJsaWMgQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lKGNoYXJbXSB0b2tlbiwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJCXN1cGVyKHRva2VuLCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCBudWxsKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25BdHRyaWJ1dGVOYW1lOiIpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQobmFtZSk7CisJCW91dHB1dC5hcHBlbmQodGhpcy5uYW1lKTsKIAkJb3V0cHV0LmFwcGVuZCgnPicpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YQppbmRleCBmYWI5MjEwLi45NTAxMTYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXNzYWdlU2VuZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDE2ICszOCwxNiBAQAogcHVibGljIGNsYXNzIENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kIGV4dGVuZHMgTWVzc2FnZVNlbmQgewogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlpbnQgYXJnc0xlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKIAkJCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspCi0JCQkJYXJndW1lbnRzW2FdLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCQl0aGlzLmFyZ3VtZW50c1thXS5yZXNvbHZlVHlwZShzY29wZSk7CiAJCX0KLQkJCi0JCWlmIChyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKQorCisJCWlmICh0aGlzLnJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpCiAJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBudWxsLCBzY29wZSk7CiAKLQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CiAJCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9PSBudWxsIHx8IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAKQEAgLTU5LDIyICs1OSwyMiBAQAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCQlvdXRwdXQuYXBwZW5kKCI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkgcmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJyk7CisJCWlmICghdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKSB0aGlzLnJlY2VpdmVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOwogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoJzwnKTsKLQkJCWludCBtYXggPSB0eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7CisJCQlpbnQgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7CiAJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heDsgaisrKSB7Ci0JCQkJdHlwZUFyZ3VtZW50c1tqXS5wcmludCgwLCBvdXRwdXQpOworCQkJCXRoaXMudHlwZUFyZ3VtZW50c1tqXS5wcmludCgwLCBvdXRwdXQpOwogCQkJCW91dHB1dC5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAogCQkJfQotCQkJdHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CisJCQl0aGlzLnR5cGVBcmd1bWVudHNbbWF4XS5wcmludCgwLCBvdXRwdXQpOwogCQkJb3V0cHV0LmFwcGVuZCgnPicpOwogCQl9Ci0JCW91dHB1dC5hcHBlbmQoc2VsZWN0b3IpLmFwcGVuZCgnKCcpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCW91dHB1dC5hcHBlbmQodGhpcy5zZWxlY3RvcikuYXBwZW5kKCcoJyk7CisJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQkJCXRoaXMuYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpPiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXNzYWdlU2VuZE5hbWUuamF2YQppbmRleCA4OGFlYzljLi5kZDY4NTcxIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmROYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNyArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCkBAIC0yNSwxNCArMjQsMTQgQEAKIAl9CiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQkKLQkJaWYgKHJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpCisKKwkJaWYgKHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAKLQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CiAJCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9PSBudWxsIHx8IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSB8fCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKQogCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsKLQkJCisKIAkJLy8gcmVzb2x2ZSB0eXBlIGFyZ3VtZW50cwogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOwpAQCAtNDEsMzAgKzQwLDI1IEBACiAJCQkJdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50c1tpXSA9IHRoaXMudHlwZUFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7CiAJCQl9CiAJCX0KLQkKLQkJaWYodGhpcy5yZWNlaXZlciBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKLQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsICgoTmFtZVJlZmVyZW5jZSl0aGlzLnJlY2VpdmVyKS5iaW5kaW5nLCBzY29wZSk7Ci0JCX0gZWxzZSBpZih0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKLQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsICgoTWVzc2FnZVNlbmQpdGhpcy5yZWNlaXZlcikuYmluZGluZywgc2NvcGUpOwotCQl9CisKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25NZXNzYWdlU2VuZE5hbWU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKSByZWNlaXZlci5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJy4nKTsKKwkJaWYgKCF0aGlzLnJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpIHRoaXMucmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJyk7CiAJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJb3V0cHV0LmFwcGVuZCgnPCcpOwotCQkJaW50IG1heCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMTsKKwkJCWludCBtYXggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMTsKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKLQkJCQl0eXBlQXJndW1lbnRzW2pdLnByaW50KDAsIG91dHB1dCk7CisJCQkJdGhpcy50eXBlQXJndW1lbnRzW2pdLnByaW50KDAsIG91dHB1dCk7CiAJCQkJb3V0cHV0LmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQl0eXBlQXJndW1lbnRzW21heF0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCXRoaXMudHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCQlvdXRwdXQuYXBwZW5kKCc+Jyk7CiAJCX0KLQkJb3V0cHV0LmFwcGVuZChzZWxlY3RvcikuYXBwZW5kKCcoJyk7CisJCW91dHB1dC5hcHBlbmQodGhpcy5zZWxlY3RvcikuYXBwZW5kKCcoJyk7CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpPiIpOyAvLyROT04tTkxTLTEkCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXRob2ROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZE5hbWUuamF2YQppbmRleCBjMDUyNjc0Li40M2FkODk2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZE5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZE5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCwzMyArMjAsMzMgQEAKIAlwdWJsaWMgQ29tcGxldGlvbk9uTWV0aG9kTmFtZShDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CiAJCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIjxDb21wbGV0aW9uT25NZXRob2ROYW1lOiIpOyAvLyROT04tTkxTLTEkCiAJCXByaW50TW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBvdXRwdXQpOwogCQlwcmludFJldHVyblR5cGUoMCwgb3V0cHV0KTsKLQkJb3V0cHV0LmFwcGVuZChzZWxlY3RvcikuYXBwZW5kKCcoJyk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnNlbGVjdG9yKS5hcHBlbmQoJygnKTsKKwkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcmd1bWVudHNbaV0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCQl0aGlzLmFyZ3VtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCW91dHB1dC5hcHBlbmQoJyknKTsKLQkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQlpZiAodGhpcy50aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoIiB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvd25FeGNlcHRpb25zW2ldLnByaW50KDAsIG91dHB1dCk7CisJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLnByaW50KDAsIG91dHB1dCk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlKENsYXNzU2NvcGUgdXBwZXJTY29wZSkgewotCQkKKwogCQlzdXBlci5yZXNvbHZlKHVwcGVyU2NvcGUpOwogCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB1cHBlclNjb3BlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCmluZGV4IGRkYmJkYjYuLjllNDUwOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDEzICsyMSwxMyBAQAogCQl0aGlzLnNvdXJjZVN0YXJ0ID0gcmV0dXJuVHlwZS5zb3VyY2VTdGFydDsKIAkJdGhpcy5zb3VyY2VFbmQgPSByZXR1cm5UeXBlLnNvdXJjZUVuZDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cygpIHsKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRoaXMuc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQlyZXR1cm4gcmV0dXJuVHlwZS5wcmludCh0YWIsIG91dHB1dCk7CisJCXJldHVybiB0aGlzLnJldHVyblR5cGUucHJpbnQodGFiLCBvdXRwdXQpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXRob2RUeXBlUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFR5cGVQYXJhbWV0ZXIuamF2YQppbmRleCA5NTdiYzUyLi43ZDBiMjg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFR5cGVQYXJhbWV0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFR5cGVQYXJhbWV0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywyMCArMjMsMjAgQEAKIAkJdGhpcy5zb3VyY2VTdGFydCA9IHR5cGVQYXJhbWV0ZXJzWzBdLnNvdXJjZVN0YXJ0OwogCQl0aGlzLnNvdXJjZUVuZCA9IHR5cGVQYXJhbWV0ZXJzW3R5cGVQYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnNvdXJjZUVuZDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cygpIHsKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRoaXMuc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoJzwnKTsKLQkJaW50IG1heCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAtIDE7CisJCWludCBtYXggPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAtIDE7CiAJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKLQkJCXR5cGVQYXJhbWV0ZXJzW2pdLnByaW50KDAsIG91dHB1dCk7CisJCQl0aGlzLnR5cGVQYXJhbWV0ZXJzW2pdLnByaW50KDAsIG91dHB1dCk7CiAJCQlvdXRwdXQuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKIAkJfQotCQl0eXBlUGFyYW1ldGVyc1ttYXhdLnByaW50KDAsIG91dHB1dCk7CisJCXRoaXMudHlwZVBhcmFtZXRlcnNbbWF4XS5wcmludCgwLCBvdXRwdXQpOwogCQlvdXRwdXQuYXBwZW5kKCc+Jyk7CiAJCXJldHVybiBvdXRwdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQppbmRleCBhMmY2N2U5Li4xMzY0Y2VkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSwyMSArMzEsMjEgQEAKICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbiBhcmUgYWxsIHRoZSBhcmd1bWVudHMgZGVmaW5lZAogICogYmVmb3JlIHRoZSBjdXJzb3IuCiAgKi8KLSAKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSBleHRlbmRzIEltcG9ydFJlZmVyZW5jZSB7CiBwdWJsaWMgQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMgLCBsb25nW10gcG9zaXRpb25zKSB7Ci0Jc3VwZXIodG9rZW5zLCBwb3NpdGlvbnMsIHRydWUsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KTsKKwlzdXBlcih0b2tlbnMsIHBvc2l0aW9ucywgZmFsc2UsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KTsKIH0KIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsKLQkKKwogCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIjxDb21wbGV0ZU9uUGFja2FnZToiKTsgLy8kTk9OLU5MUy0xJAotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykgewogCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoJy4nKTsKLQkJb3V0cHV0LmFwcGVuZCh0b2tlbnNbaV0pOworCQlvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW5zW2ldKTsKIAl9Ci0JcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsgCisJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCA2ZjEyZTMzLi40ODc4MTNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM2LDcgKzM2LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0NMQVNTID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0lOVEVSRkFDRSA9IDI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS19FWENFUFRJT04gPSAzOwotCQorCiAJcHJpdmF0ZSBpbnQga2luZCA9IEtfVFlQRTsKIAlwdWJsaWMgY2hhcltdIGNvbXBsZXRpb25JZGVudGlmaWVyOwogCS8qKgpAQCAtNDcsNyArNDcsNyBAQAogCXB1YmxpYyBDb21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsCVR5cGVSZWZlcmVuY2VbXVtdIHR5cGVBcmd1bWVudHMsIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllciwgbG9uZ1tdIHBvc2l0aW9ucykgewogCQl0aGlzKHRva2VucywgdHlwZUFyZ3VtZW50cywgY29tcGxldGlvbklkZW50aWZpZXIsIHBvc2l0aW9ucywgS19UWVBFKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcGFyYW0gdG9rZW5zCiAJICogQHBhcmFtIHR5cGVBcmd1bWVudHMKQEAgLTU5LDMzICs1OSwzMyBAQAogCQl0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gY29tcGxldGlvbklkZW50aWZpZXI7CiAJCXRoaXMua2luZCA9IGtpbmQ7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNDbGFzcygpewogCQlyZXR1cm4gdGhpcy5raW5kID09IEtfQ0xBU1M7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKXsKIAkJcmV0dXJuIHRoaXMua2luZCA9PSBLX0lOVEVSRkFDRTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvbigpewogCQlyZXR1cm4gdGhpcy5raW5kID09IEtfRVhDRVBUSU9OOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzU3VwZXJUeXBlKCl7CiAJCXJldHVybiB0aGlzLmtpbmQgPT0gS19DTEFTUyB8fCB0aGlzLmtpbmQgPT0gS19JTlRFUkZBQ0U7CiAJfQotCQorCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKIAkJc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUsIGNoZWNrQm91bmRzKTsKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBzY29wZSkgewogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CiAJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRoaXMucmVzb2x2ZWRUeXBlLCBzY29wZSk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlzd2l0Y2ggKHRoaXMua2luZCkgewogCQkJY2FzZSBLX0NMQVNTIDoKQEAgLTEwMSwxMCArMTAxLDEwIEBACiAJCQkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25UeXBlOiIpOy8vJE5PTi1OTFMtMSQKIAkJCQlicmVhazsKIAkJfQotCQlpbnQgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMudG9rZW5zLmxlbmd0aDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKLQkJCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKLQkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworCQkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2Vuc1tpXSk7CisJCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50ID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOwogCQkJaWYgKHR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgnPCcpOwogCQkJCWludCBtYXggPSB0eXBlQXJndW1lbnQubGVuZ3RoIC0gMTsKQEAgLTExNyw4ICsxMTcsOCBAQAogCQkJfQogCQkJb3V0cHV0LmFwcGVuZCgnLicpOwogCQl9Ci0JCW91dHB1dC5hcHBlbmQodG9rZW5zW2xlbmd0aCAtIDFdKTsKLQkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbbGVuZ3RoIC0gMV07CisJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbbGVuZ3RoIC0gMV0pOworCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50ID0gdGhpcy50eXBlQXJndW1lbnRzW2xlbmd0aCAtIDFdOwogCQlpZiAodHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoJzwnKTsKIAkJCWludCBtYXggPSB0eXBlQXJndW1lbnQubGVuZ3RoIC0gMTsKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJdHlwZUFyZ3VtZW50W21heF0ucHJpbnQoMCwgb3V0cHV0KTsKIAkJCW91dHB1dC5hcHBlbmQoJz4nKTsKIAkJfQotCQlvdXRwdXQuYXBwZW5kKCcuJykuYXBwZW5kKGNvbXBsZXRpb25JZGVudGlmaWVyKS5hcHBlbmQoJz4nKTsgCisJCW91dHB1dC5hcHBlbmQoJy4nKS5hcHBlbmQodGhpcy5jb21wbGV0aW9uSWRlbnRpZmllcikuYXBwZW5kKCc+Jyk7CiAJCXJldHVybiBvdXRwdXQ7Ci0JfQkKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggNDg0MjE5YS4uZjE1OWRlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM5LDI0ICszOSw1NiBAQAogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiB7CiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspCi0JCQlhcmd1bWVudHNbYV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUzsKKwlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeworCQlpbnQgYXJnc0xlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKKwkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCQlmb3IgKGludCBhID0gYXJnc0xlbmd0aDsgLS1hID49IDA7KSB7CisJCQlhcmd1bWVudFR5cGVzW2FdID0gdGhpcy5hcmd1bWVudHNbYV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQl9CiAJfQotCQotCWlmIChlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSk7CisJZmluYWwgYm9vbGVhbiBpc0RpYW1vbmQgPSB0aGlzLnR5cGUgIT0gbnVsbCAmJiAodGhpcy50eXBlLmJpdHMgJiBBU1ROb2RlLklzRGlhbW9uZCkgIT0gMDsKKwlpZiAodGhpcy5lbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7CisJCVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSB0aGlzLmVuY2xvc2luZ0luc3RhbmNlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgeworCQkJLy8gdHJ5IHRvIHByb3Bvc2Ugc29tZXRoaW5nIGV2ZW4gaWYgZW5jbG9zaW5nIHR5cGUgY2Fubm90IGJlIHJlc29sdmVkLgorCQkJLy8gRWcuOiBuZXcgVGVzdDw+KCkubmV3IFRlc3Q8PigjY3Vyc29yIworCQkJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgeworCQkJCVR5cGVSZWZlcmVuY2UgZW5jbG9zaW5nSW5zdGFuY2VUeXBlID0gKChBbGxvY2F0aW9uRXhwcmVzc2lvbikgdGhpcy5lbmNsb3NpbmdJbnN0YW5jZSkudHlwZTsKKwkJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VUeXBlICE9IG51bGwpIHsKKwkJCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ0luc3RhbmNlVHlwZS5yZXNvbHZlZFR5cGU7CisJCQkJfQorCQkJfQorCQl9CiAJCWlmIChlbmNsb3NpbmdUeXBlID09IG51bGwgfHwgIShlbmNsb3NpbmdUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHsKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAJCX0KLQkJdGhpcy5yZXNvbHZlZFR5cGUgPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGUpLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCAoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nVHlwZSk7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0aGlzLnR5cGUpLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCAoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nVHlwZSk7CisJCWlmIChpc0RpYW1vbmQgJiYgKHRoaXMucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSkgeworCQkJVHlwZUJpbmRpbmcgW10gaW5mZXJyZWRUeXBlcyA9IGluZmVyRWxpZGVkVHlwZXMoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpLCBudWxsLCBhcmd1bWVudFR5cGVzLCBzY29wZSk7CisJCQlpZiAoaW5mZXJyZWRUeXBlcyAhPSBudWxsKSB7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLnR5cGUucmVzb2x2ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUpLmdlbmVyaWNUeXBlKCksIGluZmVycmVkVHlwZXMsICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSkuZW5jbG9zaW5nVHlwZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gaW5mZXJlbmNlIGZhaWxlZC4gUmVzb2x2ZWQgdHlwZSB3aWxsIGJlIG9mIHRoZSBmb3JtIFRlc3Q8PgorCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzRGlhbW9uZDsKKwkJCX0KKwkgCX0KIAkJaWYgKCEodGhpcy5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7IC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgaXRzIGFuIGFycmF5IG9yIGJhc2UgdHlwZQogCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaXNJbnRlcmZhY2UoKSkgLy8gaGFuZGxlIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVmaW5pdGlvbiBjYXNlCiAJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CiAJfSBlbHNlIHsKLQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKKwkgCXRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKKwkgCWlmIChpc0RpYW1vbmQgJiYgKHRoaXMucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSkgeworCQkJVHlwZUJpbmRpbmcgW10gaW5mZXJyZWRUeXBlcyA9IGluZmVyRWxpZGVkVHlwZXMoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpLCBudWxsLCBhcmd1bWVudFR5cGVzLCBzY29wZSk7CisJCQlpZiAoaW5mZXJyZWRUeXBlcyAhPSBudWxsKSB7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLnR5cGUucmVzb2x2ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUpLmdlbmVyaWNUeXBlKCksIGluZmVycmVkVHlwZXMsICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSkuZW5jbG9zaW5nVHlwZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gaW5mZXJlbmNlIGZhaWxlZC4gUmVzb2x2ZWQgdHlwZSB3aWxsIGJlIG9mIHRoZSBmb3JtIFRlc3Q8PgorCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzRGlhbW9uZDsKKwkJCX0KKwkgCX0KIAkJaWYgKCEodGhpcy5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7IC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgaXRzIGFuIGFycmF5IG9yIGJhc2UgdHlwZQogCX0KQEAgLTY0LDEwICs5NiwxMCBAQAogCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHRoaXMucmVzb2x2ZWRUeXBlLCBzY29wZSk7CiB9CiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkgCisJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjoiICk7ICAvLyROT04tTkxTLTEkCi0JZWxzZSAKKwllbHNlCiAJCW91dHB1dC5hcHBlbmQoIjxDb21wbGV0ZU9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246Iik7ICAvLyROT04tTkxTLTEkCi0JcmV0dXJuIHN1cGVyLnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCc+Jyk7IAorCXJldHVybiBzdXBlci5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnPicpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQppbmRleCBmMWM1MmQzLi45Yzc5M2JkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00NywzMiArNDcsMzIgQEAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCW91dHB1dC5hcHBlbmQoIjxDb21wbGV0ZU9uTmFtZToiKTsgLy8kTk9OLU5MUy0xJAotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbaV0pOwogCQlvdXRwdXQuYXBwZW5kKCcuJyk7CiAJfQotCW91dHB1dC5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgnPicpOyAKKwlvdXRwdXQuYXBwZW5kKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgnPicpOwogCXJldHVybiBvdXRwdXQ7CiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCS8vIGl0IGNhbiBiZSBhIHBhY2thZ2UsIHR5cGUsIG1lbWJlciB0eXBlLCBsb2NhbCB2YXJpYWJsZSBvciBmaWVsZAotCWJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRva2VucywgdGhpcyk7Ci0JaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgYmluZGluZyk7Ci0JCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCXRoaXMuYmluZGluZyA9IHNjb3BlLmdldEJpbmRpbmcodGhpcy50b2tlbnMsIHRoaXMpOworCWlmICghdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHx8IHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZykgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOwogCQl9IGVsc2UgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZXNvbHZhYmxlUmVmZXJlbmNlKHRoaXMsIGJpbmRpbmcpOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZXNvbHZhYmxlUmVmZXJlbmNlKHRoaXMsIHRoaXMuYmluZGluZyk7CiAJCX0KLQkJCi0JCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSB7Ci0JCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBiaW5kaW5nLCBzY29wZSk7CisKKwkJaWYgKHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCkgeworCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdGhpcy5iaW5kaW5nLCBzY29wZSk7CiAJCX0KLQkJCisKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsKIAl9Ci0JCi0JdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgYmluZGluZywgc2NvcGUpOworCisJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdGhpcy5iaW5kaW5nLCBzY29wZSk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IGFmNWE5YjguLmY1ODQxOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIFRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGNvbXBsZXRpb24gbm9kZSBkZW5vdGVzIHRoZSBzb3VyY2UgcmFuZ2UKICAqIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgY29tcGxldGlvbi4KICAqLwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIApAQCAtMzIsOSArMzIsMTIgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0NMQVNTID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0lOVEVSRkFDRSA9IDI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS19FWENFUFRJT04gPSAzOwotCQorCiAJcHJpdmF0ZSBpbnQga2luZCA9IEtfVFlQRTsKIAlwdWJsaWMgY2hhcltdIGNvbXBsZXRpb25JZGVudGlmaWVyOworCQorCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3JUeXBlOworCQogcHVibGljIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIGNvbXBsZXRpb25JZGVudGlmaWVyLCBsb25nW10gcG9zaXRpb25zKSB7CiAJdGhpcyhwcmV2aW91c0lkZW50aWZpZXJzLCBjb21wbGV0aW9uSWRlbnRpZmllciwgcG9zaXRpb25zLCBLX1RZUEUpOwogfQpAQCAtNTQsOSArNTcsMTQgQEAKIH0KIHByb3RlY3RlZCBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewogCS8vIGl0IGNhbiBiZSBhIHBhY2thZ2UsIHR5cGUgb3IgbWVtYmVyIHR5cGUKLQlCaW5kaW5nIGJpbmRpbmcgPSBzY29wZS5wYXJlbnQuZ2V0VHlwZU9yUGFja2FnZSh0b2tlbnMpOyAvLyBzdGVwIHVwIGZyb20gdGhlIENsYXNzU2NvcGUKKwlCaW5kaW5nIGJpbmRpbmcgPSBzY29wZS5wYXJlbnQuZ2V0VHlwZU9yUGFja2FnZSh0aGlzLnRva2Vucyk7IC8vIHN0ZXAgdXAgZnJvbSB0aGUgQ2xhc3NTY29wZQogCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisKKwkJaWYgKGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpIHsKKwkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIGJpbmRpbmcsIHNjb3BlKTsKKwkJfQorCiAJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CiAJfQogCkBAIC03Nyw2ICs4NSw5IEBACiBwdWJsaWMgYm9vbGVhbiBpc1N1cGVyVHlwZSgpewogCXJldHVybiB0aGlzLmtpbmQgPT0gS19DTEFTUyB8fCB0aGlzLmtpbmQgPT0gS19JTlRFUkZBQ0U7CiB9CitwdWJsaWMgdm9pZCBzZXRLaW5kKGludCBraW5kKSB7CisJdGhpcy5raW5kID0ga2luZDsKK30KIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAlzd2l0Y2ggKHRoaXMua2luZCkgewogCQljYXNlIEtfQ0xBU1MgOgpAQCAtOTIsMTEgKzEwMywxMSBAQAogCQkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25UeXBlOiIpOy8vJE5PTi1OTFMtMSQKIAkJCWJyZWFrOwogCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQlvdXRwdXQuYXBwZW5kKHRva2Vuc1tpXSk7Ci0JCW91dHB1dC5hcHBlbmQoJy4nKTsgCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykgeworCQlvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW5zW2ldKTsKKwkJb3V0cHV0LmFwcGVuZCgnLicpOwogCX0KLQlvdXRwdXQuYXBwZW5kKGNvbXBsZXRpb25JZGVudGlmaWVyKS5hcHBlbmQoJz4nKTsKKwlvdXRwdXQuYXBwZW5kKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgnPicpOwogCXJldHVybiBvdXRwdXQ7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDI1MjY4MDYuLjZlYThlMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMzLDEyICszMywxMyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLSAKKwogcHVibGljIGNsYXNzIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVOYW1lUmVmZXJlbmNlIHsKIAogCXB1YmxpYyBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzOwogCXB1YmxpYyBib29sZWFuIGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvcjsKIAlwdWJsaWMgYm9vbGVhbiBpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGU7CisJcHVibGljIGJvb2xlYW4gaXNQcmVjZWRlZEJ5TW9kaWZpZXJzOwogCiAJcHVibGljIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MsIGJvb2xlYW4gaXNJbnNpZGVBbm5vdGF0aW9uQXR0cmlidXRlKSB7CiAJCXRoaXMoc291cmNlLCBwb3MsIG51bGwsIGZhbHNlLCBpc0luc2lkZUFubm90YXRpb25BdHRyaWJ1dGUpOwpAQCAtNTIsNyArNTMsNyBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCisKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRlT25OYW1lOiIpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzdXBlci5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJz4nKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDRkZWFhYzguLmFkNzY2NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIFRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGNvbXBsZXRpb24gbm9kZSBkZW5vdGVzIHRoZSBzb3VyY2UgcmFuZ2UKICAqIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgY29tcGxldGlvbi4KICAqLwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIApAQCAtNDMsNyArNDMsNyBAQAogfQogcHVibGljIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MsIGludCBraW5kKSB7CiAJc3VwZXIoc291cmNlLCBwb3MpOwotCWlzQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCXRoaXMuaXNDb21wbGV0aW9uTm9kZSA9IHRydWU7CiAJdGhpcy5raW5kID0ga2luZDsKIH0KIHB1YmxpYyB2b2lkIGFib3V0VG9SZXNvbHZlKFNjb3BlIHNjb3BlKSB7CkBAIC01OSw3ICs1OSw3IEBACiAgICAgaWYgKHRoaXMuZmllbGRUeXBlQ29tcGxldGlvbk5vZGUgIT0gbnVsbCkgewogCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLmZpZWxkVHlwZUNvbXBsZXRpb25Ob2RlLCBzY29wZSk7CiAgICAgfQotCWlmKGlzQ29tcGxldGlvbk5vZGUpIHsKKwlpZih0aGlzLmlzQ29tcGxldGlvbk5vZGUpIHsKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgc2NvcGUpOwogCX0gZWxzZSB7CiAJCXJldHVybiBzdXBlci5nZXRUeXBlQmluZGluZyhzY29wZSk7CkBAIC05MiwxNiArOTIsMTkgQEAKIAkJCW91dHB1dC5hcHBlbmQoIjxDb21wbGV0ZU9uVHlwZToiKTsvLyROT04tTkxTLTEkCiAJCQlicmVhazsKIAl9Ci0JcmV0dXJuIG91dHB1dC5hcHBlbmQodG9rZW4pLmFwcGVuZCgnPicpOworCXJldHVybiBvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW4pLmFwcGVuZCgnPicpOwogfQogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlRW5jbG9zaW5nKEJsb2NrU2NvcGUgc2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgewogICAgIGlmICh0aGlzLmZpZWxkVHlwZUNvbXBsZXRpb25Ob2RlICE9IG51bGwpIHsKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcy5maWVsZFR5cGVDb21wbGV0aW9uTm9kZSwgc2NvcGUpOwogICAgIH0KLQlpZihpc0NvbXBsZXRpb25Ob2RlKSB7CisJaWYodGhpcy5pc0NvbXBsZXRpb25Ob2RlKSB7CiAJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIGVuY2xvc2luZ1R5cGUsIHNjb3BlKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVR5cGVFbmNsb3Npbmcoc2NvcGUsIGVuY2xvc2luZ1R5cGUpOwogCX0KIH0KK3B1YmxpYyB2b2lkIHNldEtpbmQoaW50IGtpbmQpIHsKKwl0aGlzLmtpbmQgPSBraW5kOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TdHJpbmdMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblN0cmluZ0xpdGVyYWwuamF2YQppbmRleCAwYTA0NjliLi40Zjk4YjI1IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblN0cmluZ0xpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblN0cmluZ0xpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01Myw3ICs1Myw3IEBACiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgbnVsbCwgc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJb3V0cHV0LmFwcGVuZCgiPENvbXBsZXRpb25PblN0cmluZzoiKTsgLy8kTk9OLU5MUy0xJAogCQlvdXRwdXQgPSBzdXBlci5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQppbmRleCAzYzc1NmZkLi4yZjE1NTMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5LDYgKzE5LDkgQEAKICAqCTAgIG1lYW5zIGNvbXBsZXRpb24gYmVoaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAqICBuICBtZWFucyBjb21wbGV0aW9uIGJlaGluZCB0aGUgbi10aCBjaGFyYWN0ZXIKICAqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKQEAgLTI2LDYgKzI5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3RUb0ludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC4qOwpAQCAtNDMsNyArNDcsNyBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfTkVYVF9UWVBFUkVGX0lTX0NMQVNTID0gQ09NUExFVElPTl9QQVJTRVIgKyA1OyAvLyB3aGV0aGVyIHRoZSBuZXh0IHR5cGUgcmVmZXJlbmNlIGlzIGEgY2xhc3MKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX05FWFRfVFlQRVJFRl9JU19JTlRFUkZBQ0UgPSBDT01QTEVUSU9OX1BBUlNFUiArIDY7IC8vIHdoZXRoZXIgdGhlIG5leHQgdHlwZSByZWZlcmVuY2UgaXMgYW4gaW50ZXJmYWNlCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OID0gQ09NUExFVElPTl9QQVJTRVIgKyA3OyAvLyB3aGV0aGVyIHRoZSBuZXh0IHR5cGUgcmVmZXJlbmNlIGlzIGFuIGV4Y2VwdGlvbgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCA9IENPTVBMRVRJT05fUEFSU0VSICsgODsgLy8gd2hldGhlciB3ZSBhcmUgYmV0d2VlbiB0aGUga2V5d29yZCAnbmV3JyBhbmQgdGhlIGZvbGxvd2luZyBsZWZ0IGJyYWtldCwgaWUuICdbJywgJygnIG9yICd7JworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCA9IENPTVBMRVRJT05fUEFSU0VSICsgODsgLy8gd2hldGhlciB3ZSBhcmUgYmV0d2VlbiB0aGUga2V5d29yZCAnbmV3JyBhbmQgdGhlIGZvbGxvd2luZyBsZWZ0IGJyYWtldCwgaS5lLiAnWycsICcoJyBvciAneycKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0lOU0lERV9USFJPV19TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDk7IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ3Rocm93JyBhbmQgdGhlIGVuZCBvZiBhIHRocm93IHN0YXRlbWVudAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfSU5TSURFX1JFVFVSTl9TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDEwOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuIHRoZSBrZXl3b3JkICdyZXR1cm4nIGFuZCB0aGUgZW5kIG9mIGEgcmV0dXJuIHN0YXRlbWVudAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQ0FTVF9TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDExOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuICcpJyBhbmQgdGhlIGVuZCBvZiBhIGNhc3Qgc3RhdGVtZW50CkBAIC03Myw2ICs3NywxMiBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfSU5TSURFX0NPTlRJTlVFX1NUQVRFTUVOVCA9IENPTVBMRVRJT05fUEFSU0VSICsgMzU7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19MQUJFTCA9IENPTVBMRVRJT05fUEFSU0VSICsgMzY7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19NRU1CRVJfVkFMVUVfQVJSQVlfSU5JVElBTElaRVIgPSBDT01QTEVUSU9OX1BBUlNFUiArIDM3OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSID0gQ09NUExFVElPTl9QQVJTRVIgKyAzODsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0lOU0lERV9BU1NFUlRfRVhDRVBUSU9OID0gQ09NUExFVElPTl9QQVJTRVIgKyAzOTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0lOU0lERV9GT1JfQ09ORElUSU9OQUwgPSBDT01QTEVUSU9OX1BBUlNFUiArIDQwOworCS8vIGFkZGVkIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxNTM0CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19CRVRXRUVOX0lOU1RBTkNFT0ZfQU5EX1JQQVJFTiA9IENPTVBMRVRJT05fUEFSU0VSICsgNDE7CisKIAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIEZBS0VfVFlQRV9OQU1FID0gbmV3IGNoYXJbXXsnICd9OwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIEZBS0VfTUVUSE9EX05BTUUgPSBuZXcgY2hhcltdeycgJ307CkBAIC04Myw2ICs5Myw4IEBACiAKIAlwdWJsaWMgaW50IGN1cnNvckxvY2F0aW9uOwogCXB1YmxpYyBBU1ROb2RlIGFzc2lzdE5vZGVQYXJlbnQ7IC8vIHRoZSBwYXJlbnQgbm9kZSBvZiBhc3Npc3Qgbm9kZQorCXB1YmxpYyBBU1ROb2RlIGVuY2xvc2luZ05vZGU7IC8vIGFuIGVuY2xvc2luZyBub2RlIHVzZWQgYnkgcHJvcG9zYWxzIGluZmVyZW5jZQorCiAJLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGludGVybmFsIGZsYWdzICovCiAKIAkvLyBibG9jayBraW5kCkBAIC0xMjMsMTIgKzEzNSw4IEBACiAJLy8gYSBwb2ludGVyIGluIHRoZSBleHByZXNzaW9uIHN0YWNrIHRvIHRoZSBxdWFsaWZpZXIgb2YgYSBpbnZvY2F0aW9uCiAJaW50IHF1YWxpZmllcjsKIAotCS8vIGxhc3QgbW9kaWZpZXJzIGluZm8KLQlpbnQgbGFzdE1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OwotCWludCBsYXN0TW9kaWZpZXJzU3RhcnQgPSAtMTsKLQotCS8vIGRlcHRoIG9mICcoJywgJ3snIGFuZCAnW10nCi0JaW50IGJyYWNrZXREZXB0aDsKKwkvLyB1c2VkIHRvIGZpbmQgaWYgdGhlcmUgaXMgdW51c2VkIG1vZGlmaWVycyB3aGVuIGJ1aWxkaW5nIGNvbXBsZXRpb24gaW5zaWRlIGEgbWV0aG9kIG9yIGFuIGluaXRpYWxpemVyCisJYm9vbGVhbiBoYXNVbnVzZWRNb2RpZmllcnM7CiAKIAkvLyBzaG93IGlmIHRoZSBjdXJyZW50IHRva2VuIGNhbiBiZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvcgogCWludCBjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSBOTzsKQEAgLTE0MSwyOCArMTQ5LDM2IEBACiAJaW50IGxhYmVsUHRyID0gLTE7CiAKIAlib29sZWFuIGlzQWxyZWFkeUF0dGFjaGVkOwotCQorCiAJcHVibGljIGJvb2xlYW4gcmVjb3JkID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gc2tpcFJlY29yZCA9IGZhbHNlOwogCXB1YmxpYyBpbnQgcmVjb3JkRnJvbTsKIAlwdWJsaWMgaW50IHJlY29yZFRvOwotCXB1YmxpYyBpbnQgcG90ZW50aWFsVmFyaWFibGVOYW1lc1B0cjsgCisJcHVibGljIGludCBwb3RlbnRpYWxWYXJpYWJsZU5hbWVzUHRyOwogCXB1YmxpYyBjaGFyW11bXSBwb3RlbnRpYWxWYXJpYWJsZU5hbWVzOwogCXB1YmxpYyBpbnRbXSBwb3RlbnRpYWxWYXJpYWJsZU5hbWVTdGFydHM7CiAJcHVibGljIGludFtdIHBvdGVudGlhbFZhcmlhYmxlTmFtZUVuZHM7Ci0JCisKIAlDb21wbGV0aW9uT25Bbm5vdGF0aW9uT2ZUeXBlIHBlbmRpbmdBbm5vdGF0aW9uOwotCQotcHVibGljIENvbXBsZXRpb25QYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgeworCisJcHJpdmF0ZSBib29sZWFuIHN0b3JlU291cmNlRW5kczsKKwlwdWJsaWMgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCBzb3VyY2VFbmRzOworCitwdWJsaWMgQ29tcGxldGlvblBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIHN0b3JlRXh0cmFTb3VyY2VFbmRzKSB7CiAJc3VwZXIocHJvYmxlbVJlcG9ydGVyKTsKIAl0aGlzLnJlcG9ydFN5bnRheEVycm9ySXNSZXF1aXJlZCA9IGZhbHNlOwogCXRoaXMuamF2YWRvY1BhcnNlci5jaGVja0RvY0NvbW1lbnQgPSB0cnVlOworCXRoaXMuYW5ub3RhdGlvblJlY292ZXJ5QWN0aXZhdGVkID0gZmFsc2U7CisJaWYgKHN0b3JlRXh0cmFTb3VyY2VFbmRzKSB7CisJCXRoaXMuc3RvcmVTb3VyY2VFbmRzID0gdHJ1ZTsKKwkJdGhpcy5zb3VyY2VFbmRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQoKTsKKwl9CiB9CiBwcml2YXRlIHZvaWQgYWRkUG90ZW50aWFsTmFtZShjaGFyW10gcG90ZW50aWFsVmFyaWFibGVOYW1lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAlpbnQgbGVuZ3RoID0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzLmxlbmd0aDsKIAlpZiAodGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVzUHRyID49IGxlbmd0aCAtIDEpIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLnBvdGVudGlhbFZhcmlhYmxlTmFtZXMsIAorCQkJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lcywKIAkJCQkwLAogCQkJCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdW10sCiAJCQkJMCwKQEAgLTE4OSw4ICsyMDUsOCBAQAogCXRoaXMuc2tpcFJlY29yZCA9IGZhbHNlOwogCXRoaXMucmVjb3JkRnJvbSA9IGZyb207CiAJdGhpcy5yZWNvcmRUbyA9IHRvOwotCQotCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0ciA9IC0xOyAKKworCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0ciA9IC0xOwogCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lcyA9IG5ldyBjaGFyWzEwXVtdOwogCXRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lU3RhcnRzID0gbmV3IGludFsxMF07CiAJdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVFbmRzID0gbmV3IGludFsxMF07CkBAIC0yMDAsMTAgKzIxNiwxMCBAQAogCXRoaXMuc2tpcFJlY29yZCA9IGZhbHNlOwogfQogcHVibGljIGNoYXJbXSBhc3Npc3RJZGVudGlmaWVyKCl7Ci0JcmV0dXJuICgoQ29tcGxldGlvblNjYW5uZXIpc2Nhbm5lcikuY29tcGxldGlvbklkZW50aWZpZXI7CisJcmV0dXJuICgoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5zY2FubmVyKS5jb21wbGV0aW9uSWRlbnRpZmllcjsKIH0KIHByb3RlY3RlZCB2b2lkIGF0dGFjaE9ycGhhbkNvbXBsZXRpb25Ob2RlKCl7Ci0JaWYoYXNzaXN0Tm9kZSA9PSBudWxsIHx8IHRoaXMuaXNBbHJlYWR5QXR0YWNoZWQpIHJldHVybjsKKwlpZih0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbCB8fCB0aGlzLmlzQWxyZWFkeUF0dGFjaGVkKSByZXR1cm47CiAKIAl0aGlzLmlzQWxyZWFkeUF0dGFjaGVkID0gdHJ1ZTsKIApAQCAtMjExLDE1ICsyMjcsMTUgQEAKIAkJQVNUTm9kZSBvcnBoYW4gPSB0aGlzLmFzc2lzdE5vZGU7CiAJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IGZhbHNlOwogCi0JCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpeworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpewogCQkJaWYgKG9ycGhhbiBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSl7Ci0JCQkJY3VycmVudEVsZW1lbnQuYWRkKChJbXBvcnRSZWZlcmVuY2Upb3JwaGFuLCAwKTsKKwkJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCgoSW1wb3J0UmVmZXJlbmNlKW9ycGhhbiwgMCk7CiAJCQl9CiAJCX0KIAogCQkvKiBpZiBpbiBjb250ZXh0IG9mIGEgdHlwZSwgdGhlbiBwZXJzaXN0cyB0aGUgaWRlbnRpZmllciBpbnRvIGEgZmFrZSBmaWVsZCByZXR1cm4gdHlwZSAqLwotCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKLQkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKWN1cnJlbnRFbGVtZW50OworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KIAkJCWlmIChyZWNvdmVyZWRUeXBlLmZvdW5kT3BlbmluZ0JyYWNlKSB7CiAJCQkJLyogZ2VuZXJhdGUgYSBwc2V1ZG8gZmllbGQgd2l0aCBhIGNvbXBsZXRpb24gb24gdHlwZSByZWZlcmVuY2UgKi8KQEAgLTIzMCwxMCArMjQ2LDEwIEBACiAJCQkJCWludCBpbmZvID0gdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpOwogCQkJCQlpZihraW5kID09IEtfQklOQVJZX09QRVJBVE9SICYmIGluZm8gPT0gTEVTUyAmJiB0aGlzLmlkZW50aWZpZXJQdHIgPiAtMSkgewogCQkJCQkJaWYodGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdID4gMCkgewotCQkJCQkJCXRoaXMuY29uc3VtZVR5cGVBcmd1bWVudHMoKTsKKwkJCQkJCQljb25zdW1lVHlwZUFyZ3VtZW50cygpOwogCQkJCQkJfQotCQkJCQkJdGhpcy5wdXNoT25HZW5lcmljc1N0YWNrKG9ycGhhbik7Ci0JCQkJCQl0aGlzLmNvbnN1bWVUeXBlQXJndW1lbnRzKCk7CisJCQkJCQlwdXNoT25HZW5lcmljc1N0YWNrKG9ycGhhbik7CisJCQkJCQljb25zdW1lVHlwZUFyZ3VtZW50cygpOwogCQkJCQkJZmllbGRUeXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKIAkJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGZpZWxkVHlwZTsKIAkJCQkJfSBlbHNlIHsKQEAgLTI0MiwyNSArMjU4LDM3IEBACiAKIAkJCQkJQ29tcGxldGlvbk9uRmllbGRUeXBlIGZpZWxkRGVjbGFyYXRpb24gPSBuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKGZpZWxkVHlwZSwgZmFsc2UpOwogCi0JCQkJCS8vIHJldHJpZXZlIGF2YWlsYWJsZSBtb2RpZmllcnMgaWYgYW55Ci0JCQkJCWlmIChpbnRQdHIgPj0gMiAmJiBpbnRTdGFja1tpbnRQdHItMV0gPT0gdGhpcy5sYXN0TW9kaWZpZXJzU3RhcnQgJiYgaW50U3RhY2tbaW50UHRyLTJdID09IHRoaXMubGFzdE1vZGlmaWVycyl7Ci0JCQkJCQlmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLTFdOwotCQkJCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItMl07CisJCQkJCS8vIHJldHJpZXZlIGFubm90YXRpb25zIGlmIGFueQorCQkJCQlpbnQgbGVuZ3RoOworCQkJCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0cl0pICE9IDAgJiYKKwkJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgLSBsZW5ndGggKyAxLAorCQkJCQkJCWZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJCQkJCTAsCisJCQkJCQkJbGVuZ3RoKTsKIAkJCQkJfQogCi0JCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGZpZWxkRGVjbGFyYXRpb24sIDApOworCQkJCQkvLyByZXRyaWV2ZSBhdmFpbGFibGUgbW9kaWZpZXJzIGlmIGFueQorCQkJCQlpZiAodGhpcy5pbnRQdHIgPj0gMiAmJiB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLTFdID09IHRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ICYmIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItMl0gPT0gdGhpcy5sYXN0TW9kaWZpZXJzKXsKKwkJCQkJCWZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLTFdOworCQkJCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLTJdOworCQkJCQl9CisKKwkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGZpZWxkRGVjbGFyYXRpb24sIDApOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9CiAJCS8qIGlmIGluIGNvbnRleHQgb2YgYSBtZXRob2QsIHBlcnNpc3RzIGlmIGluc2lkZSBhcmd1bWVudHMgYXMgYSB0eXBlICovCi0JCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZE1ldGhvZCl7Ci0JCQlSZWNvdmVyZWRNZXRob2QgcmVjb3ZlcmVkTWV0aG9kID0gKFJlY292ZXJlZE1ldGhvZCljdXJyZW50RWxlbWVudDsKKwkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRNZXRob2QpeworCQkJUmVjb3ZlcmVkTWV0aG9kIHJlY292ZXJlZE1ldGhvZCA9IChSZWNvdmVyZWRNZXRob2QpdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJCS8qIG9ubHkgY29uc2lkZXIgaWYgaW5zaWRlIG1ldGhvZCBoZWFkZXIgKi8KIAkJCWlmICghcmVjb3ZlcmVkTWV0aG9kLmZvdW5kT3BlbmluZ0JyYWNlKSB7CiAJCQkJLy9pZiAoclBhcmVuUG9zIDwgbFBhcmVuUG9zKXsgLy8gaW5zaWRlIGFyZ3VtZW50cwogCQkJCWlmIChvcnBoYW4gaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKXsKLQkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnQuYWRkKAorCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5wYXJlbnQuYWRkKAogCQkJCQkJbmV3IENvbXBsZXRpb25PbkZpZWxkVHlwZSgoVHlwZVJlZmVyZW5jZSlvcnBoYW4sIHRydWUpLCAwKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KQEAgLTI3MSw3ICsyOTksOCBAQAogCQkJCQkJCQlGQUtFX1RZUEVfTkFNRSwKIAkJCQkJCQkJdGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQoKSwKIAkJCQkJCQkJKEFubm90YXRpb24pb3JwaGFuKTsKLQkJCQkJY3VycmVudEVsZW1lbnQucGFyZW50LmFkZChmYWtlVHlwZSwgMCk7CisJCQkJCWZha2VUeXBlLmlzUGFyYW1ldGVyID0gdHJ1ZTsKKwkJCQkJdGhpcy5jdXJyZW50RWxlbWVudC5wYXJlbnQuYWRkKGZha2VUeXBlLCAwKTsKIAkJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IGZha2VUeXBlOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtMjg1LDE4ICszMTQsMTggQEAKIAogCQlpZihvcnBoYW4gaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7CiAJCQlwb3BVbnRpbENvbXBsZXRlZEFubm90YXRpb25JZk5lY2Vzc2FyeSgpOwotCQkJCisKIAkJCUNvbXBsZXRpb25PbkFubm90YXRpb25PZlR5cGUgZmFrZVR5cGUgPQogCQkJCW5ldyBDb21wbGV0aW9uT25Bbm5vdGF0aW9uT2ZUeXBlKAogCQkJCQkJRkFLRV9UWVBFX05BTUUsCiAJCQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCgpLAogCQkJCQkJKEFubm90YXRpb24pb3JwaGFuKTsKLQkJCWN1cnJlbnRFbGVtZW50LmFkZChmYWtlVHlwZSwgMCk7Ci0JCQkKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGZha2VUeXBlLCAwKTsKKwogCQkJaWYgKCFpc0luc2lkZUFubm90YXRpb24oKSkgewogCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb24gPSBmYWtlVHlwZTsKIAkJCX0KLQkJCQorCiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMzIxLDMxICszNTAsMzEgQEAKIAkJCS8qIGNoZWNrIGZvciBjb21wbGV0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgbWV0aG9kIGJvZHkKIAkJCQliZWhpbmQgYW4gaW52YWxpZCBzaWduYXR1cmUKIAkJCSAqLwotCQkJUmVjb3ZlcmVkTWV0aG9kIG1ldGhvZCA9IGN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ01ldGhvZCgpOworCQkJUmVjb3ZlcmVkTWV0aG9kIG1ldGhvZCA9IHRoaXMuY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nTWV0aG9kKCk7CiAJCQlpZiAobWV0aG9kICE9IG51bGwpewogCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG1ldGhvZC5tZXRob2REZWNsYXJhdGlvbjsKIAkJCQlpZiAoKG1ldGhvZERlY2wuYm9keVN0YXJ0ID09IG1ldGhvZERlY2wuc291cmNlRW5kKzEpIC8vIHdhcyBtaXNzaW5nIG9wZW5pbmcgYnJhY2UKLQkJCQkJJiYgKFV0aWwuZ2V0TGluZU51bWJlcihvcnBoYW4uc291cmNlU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikgCi0JCQkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKG1ldGhvZERlY2wuc291cmNlRW5kLCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpKSl7CisJCQkJCSYmIChVdGlsLmdldExpbmVOdW1iZXIob3JwaGFuLnNvdXJjZVN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKQorCQkJCQkJCT09IFV0aWwuZ2V0TGluZU51bWJlcihtZXRob2REZWNsLnNvdXJjZUVuZCwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikpKXsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KIAkJCS8vIGFkZCB0aGUgY29tcGxldGlvbiBub2RlIGFzIGEgc3RhdGVtZW50IHRvIHRoZSBsaXN0IG9mIGJsb2NrIHN0YXRlbWVudHMKLQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKChTdGF0ZW1lbnQpb3JwaGFuLCAwKTsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KW9ycGhhbiwgMCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKLQlpZiAodGhpcy5pc0luc2lkZUFubm90YXRpb24oKSkgeworCWlmIChpc0luc2lkZUFubm90YXRpb24oKSkgewogCQkvLyBwdXNoIHRvcCBleHByZXNzaW9uIG9uIGFzdCBzdGFjayBpZiBpdCBjb250YWlucyB0aGUgY29tcGxldGlvbiBub2RlCiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKIAkJaWYgKHRoaXMuZXhwcmVzc2lvblB0ciA+IC0xKSB7CiAJCQlleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKLQkJCWlmKGV4cHJlc3Npb24gPT0gYXNzaXN0Tm9kZSkgeworCQkJaWYoZXhwcmVzc2lvbiA9PSB0aGlzLmFzc2lzdE5vZGUpIHsKIAkJCQlpZiAodGhpcy50b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19NRU1CRVJfVkFMVUVfQVJSQVlfSU5JVElBTElaRVIgKSB7CiAJCQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IG5ldyBBcnJheUluaXRpYWxpemVyKCk7CiAJCQkJCWFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltde2V4cHJlc3Npb259OwotCQkJCQorCiAJCQkJCU1lbWJlclZhbHVlUGFpciB2YWx1ZVBhaXIgPQogCQkJCQkJCW5ldyBNZW1iZXJWYWx1ZVBhaXIoVkFMVUUsIGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kLCBhcnJheUluaXRpYWxpemVyKTsKIAkJCQkJCWJ1aWxkTW9yZUFubm90YXRpb25Db21wbGV0aW9uQ29udGV4dCh2YWx1ZVBhaXIpOwpAQCAtMzU2LDcgKzM4NSw3IEBACiAKIAkJCQkJCWJ1aWxkTW9yZUFubm90YXRpb25Db21wbGV0aW9uQ29udGV4dChtZW1iZXJWYWx1ZU5hbWUpOwogCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQkJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKIAkJCQkJCU1lbWJlclZhbHVlUGFpciB2YWx1ZVBhaXIgPQogCQkJCQkJCW5ldyBNZW1iZXJWYWx1ZVBhaXIoVkFMVUUsIGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kLCBleHByZXNzaW9uKTsKIAkJCQkJCWJ1aWxkTW9yZUFubm90YXRpb25Db21wbGV0aW9uQ29udGV4dCh2YWx1ZVBhaXIpOwpAQCAtNDUwLDcgKzQ3OSw3IEBACiAJCQkJaW50IGtpbmQgPSB0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CiAJCQkJaW50IGluZm8gPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CiAJCQkJaWYoa2luZCA9PSBLX0JJTkFSWV9PUEVSQVRPUiAmJiBpbmZvID09IExFU1MpIHsKLQkJCQkJdGhpcy5jb25zdW1lVHlwZUFyZ3VtZW50cygpOworCQkJCQljb25zdW1lVHlwZUFyZ3VtZW50cygpOwogCQkJCX0KIAkJCQlpbnQgbnVtYmVyT2ZJZGVudGlmaWVycyA9IHRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0cl07CiAJCQkJaW50IGdlblB0ciA9IHRoaXMuZ2VuZXJpY3NQdHI7CkBAIC01MDIsNyArNTMxLDcgQEAKIAkJCWlmIChtZXRob2QgIT0gbnVsbCl7CiAJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uOwogCQkJCWlmICgobWV0aG9kRGVjbC5ib2R5U3RhcnQgPT0gbWV0aG9kRGVjbC5zb3VyY2VFbmQrMSkgLy8gd2FzIG1pc3Npbmcgb3BlbmluZyBicmFjZQotCQkJCQkmJiAoVXRpbC5nZXRMaW5lTnVtYmVyKG5vZGUuc291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpIAorCQkJCQkmJiAoVXRpbC5nZXRMaW5lTnVtYmVyKG5vZGUuc291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCiAJCQkJCQk9PSBVdGlsLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbC5zb3VyY2VFbmQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpKSl7CiAJCQkJCXJldHVybjsKIAkJCQl9CkBAIC01MTcsMzkgKzU0Niw3NiBAQAogCUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKIAlpZiAodGhpcy5leHByZXNzaW9uUHRyID4gLTEpIHsKIAkJZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07Ci0JCUNvbXBsZXRpb25Ob2RlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgQ29tcGxldGlvbk5vZGVEZXRlY3Rvcihhc3Npc3ROb2RlLCBleHByZXNzaW9uKTsKKwkJQ29tcGxldGlvbk5vZGVEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBDb21wbGV0aW9uTm9kZURldGVjdG9yKHRoaXMuYXNzaXN0Tm9kZSwgZXhwcmVzc2lvbik7CiAJCWlmKGRldGVjdG9yLmNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSkgewogCQkJLyogY2hlY2sgZm9yIGNvbXBsZXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBtZXRob2QgYm9keQogCQkJCWJlaGluZCBhbiBpbnZhbGlkIHNpZ25hdHVyZQogCQkJICovCi0JCQlSZWNvdmVyZWRNZXRob2QgbWV0aG9kID0gY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nTWV0aG9kKCk7CisJCQlSZWNvdmVyZWRNZXRob2QgbWV0aG9kID0gdGhpcy5jdXJyZW50RWxlbWVudC5lbmNsb3NpbmdNZXRob2QoKTsKIAkJCWlmIChtZXRob2QgIT0gbnVsbCl7CiAJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uOwogCQkJCWlmICgobWV0aG9kRGVjbC5ib2R5U3RhcnQgPT0gbWV0aG9kRGVjbC5zb3VyY2VFbmQrMSkgLy8gd2FzIG1pc3Npbmcgb3BlbmluZyBicmFjZQotCQkJCQkmJiAoVXRpbC5nZXRMaW5lTnVtYmVyKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikgCi0JCQkJCQk9PSBVdGlsLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbC5zb3VyY2VFbmQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikpKXsKKwkJCQkJJiYgKFV0aWwuZ2V0TGluZU51bWJlcihleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKQorCQkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKG1ldGhvZERlY2wuc291cmNlRW5kLCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKSkpewogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQotCQkJaWYoZXhwcmVzc2lvbiA9PSBhc3Npc3ROb2RlCisJCQlpZihleHByZXNzaW9uID09IHRoaXMuYXNzaXN0Tm9kZQorCQkJCXx8IChleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzaWdubWVudAkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3OTM5CisJCQkJCSYmICgoQXNzaWdubWVudClleHByZXNzaW9uKS5leHByZXNzaW9uID09IHRoaXMuYXNzaXN0Tm9kZQorCQkJCQkmJiAoKHRoaXMuZXhwcmVzc2lvblB0ciA+IDAgJiYgc3RhY2tIYXNJbnN0YW5jZU9mRXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb25TdGFjaywgdGhpcy5leHByZXNzaW9uUHRyIC0gMSkpCisJCQkJCQkJLy8gSW4gY2FzZSBvZiBlcnJvciBpbiBjb21waWxhdGlvbiB1bml0LCBleHByZXNzaW9uIHN0YWNrIG1pZ2h0IG5vdCBoYXZlIGluc3RhbmNlb2YgZXhwLCBzbyB0cnkgZWxlbWVudE9iamVjdEluZm9TdGFjaworCQkJCQkJfHwgKHRoaXMuZWxlbWVudFB0ciA+PSAwICYmIHN0YWNrSGFzSW5zdGFuY2VPZkV4cHJlc3Npb24odGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrLCB0aGlzLmVsZW1lbnRQdHIpKSkpCiAJCQkJfHwgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbgotCQkJCQkmJiAoKEFsbG9jYXRpb25FeHByZXNzaW9uKWV4cHJlc3Npb24pLnR5cGUgPT0gYXNzaXN0Tm9kZSkpeworCQkJCQkmJiAoKEFsbG9jYXRpb25FeHByZXNzaW9uKWV4cHJlc3Npb24pLnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKQorCQkJCXx8IChleHByZXNzaW9uIGluc3RhbmNlb2YgQU5EX0FORF9FeHByZXNzaW9uCisJCQkJCQkmJiAodGhpcy5lbGVtZW50UHRyID49IDAgJiYgdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW3RoaXMuZWxlbWVudFB0cl0gaW5zdGFuY2VvZiBJbnN0YW5jZU9mRXhwcmVzc2lvbikpKXsKIAkJCQlidWlsZE1vcmVDb21wbGV0aW9uQ29udGV4dChleHByZXNzaW9uKTsKKwkJCQlpZiAodGhpcy5hc3Npc3ROb2RlUGFyZW50ID09IG51bGwKKwkJCQkJJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKKwkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gZGV0ZWN0b3IuZ2V0Q29tcGxldGlvbk5vZGVQYXJlbnQoKTsKKwkJCQl9CisJCQkJcmV0dXJuOwogCQkJfSBlbHNlIHsKLQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gZGV0ZWN0b3IuZ2V0Q29tcGxldGlvbk5vZGVQYXJlbnQoKTsKLQkJCQlpZihhc3Npc3ROb2RlUGFyZW50ICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoKFN0YXRlbWVudClhc3Npc3ROb2RlUGFyZW50LCAwKTsKKwkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBkZXRlY3Rvci5nZXRDb21wbGV0aW9uTm9kZVBhcmVudCgpOworCQkJCWlmKHRoaXMuYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7CisJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KXRoaXMuYXNzaXN0Tm9kZVBhcmVudCwgMCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoZXhwcmVzc2lvbiwgMCk7CisJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChleHByZXNzaW9uLCAwKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCWlmICh0aGlzLmFzdFB0ciA+IC0xICYmIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3OTM5CisJCS8vIFRvIHRha2UgY2FyZSBvZjogIGlmIChhIGluc3RhbmNlIG9mIFgpICBpbnQgaSA9IGEufAorCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsID0gKExvY2FsRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQlpZiAobG9jYWwuaW5pdGlhbGl6YXRpb24gPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCQlTdGF0ZW1lbnQgZW5jbG9zaW5nID0gYnVpbGRNb3JlQ29tcGxldGlvbkVuY2xvc2luZ0NvbnRleHQobG9jYWwpOworCQkJaWYgKGVuY2xvc2luZyBpbnN0YW5jZW9mIElmU3RhdGVtZW50KSB7CisJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRCbG9jaykgeworCQkJCQkvLyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIG11c3QgYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYmVjYXVzZSB0aGUgSWZTdGF0ZW1lbnQgd2lsbCBiZSBhZGRlZCBpbnN0ZWFkCisJCQkJCVJlY292ZXJlZEJsb2NrIHJlY292ZXJlZEJsb2NrID0gKFJlY292ZXJlZEJsb2NrKSB0aGlzLmN1cnJlbnRFbGVtZW50OworCQkJCQlyZWNvdmVyZWRCbG9jay5zdGF0ZW1lbnRzWy0tcmVjb3ZlcmVkQmxvY2suc3RhdGVtZW50Q291bnRdID0gbnVsbDsKKwkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGVuY2xvc2luZywgMCk7CiAJCQkJfQogCQkJfQogCQl9CiAJfQogfQorcHVibGljIE9iamVjdCBiZWNvbWVTaW1wbGVQYXJzZXIoKSB7CisJQ29tcGxldGlvblNjYW5uZXIgY29tcGxldGlvblNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5zY2FubmVyOworCWludFtdIHBhcnNlclN0YXRlID0gbmV3IGludFtdIHt0aGlzLmN1cnNvckxvY2F0aW9uLCBjb21wbGV0aW9uU2Nhbm5lci5jdXJzb3JMb2NhdGlvbn07CisJCisJdGhpcy5jdXJzb3JMb2NhdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCWNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCisJcmV0dXJuIHBhcnNlclN0YXRlOworfQogcHJpdmF0ZSB2b2lkIGJ1aWxkTW9yZUFubm90YXRpb25Db21wbGV0aW9uQ29udGV4dChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7CiAJaWYodGhpcy5pZGVudGlmaWVyUHRyIDwgMCB8fCB0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgPCAwICkgcmV0dXJuOwogCi0JVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy5nZXRBbm5vdGF0aW9uVHlwZSgpOworCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldEFubm90YXRpb25UeXBlKCk7CiAKIAlpbnQgbm9kZXNUb1JlbW92ZSA9IHRoaXMuYXN0UHRyID4gLTEgJiYgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPT0gbWVtYmVyVmFsdWVQYWlyID8gMSA6IDA7CiAKQEAgLTU1Nyw3ICs2MjMsNyBAQAogCWlmIChtZW1iZXJWYWx1ZVBhaXIgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZW1iZXJWYWx1ZU5hbWUpIHsKIAkJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IG51bGw7CiAJCWludCBsZW5ndGg7Ci0JCWlmIChhc3RMZW5ndGhQdHIgPiAtMSAmJiAobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgPiBub2Rlc1RvUmVtb3ZlKSB7CisJCWlmICh0aGlzLmFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSA+IG5vZGVzVG9SZW1vdmUpIHsKIAkJCWlmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgewogCQkJCVN5c3RlbS5hcnJheWNvcHkoCiAJCQkJCXRoaXMuYXN0U3RhY2ssCkBAIC01ODMsNyArNjQ5LDcgQEAKIAl9IGVsc2UgewogCQlNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gbnVsbDsKIAkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmIChhc3RMZW5ndGhQdHIgPiAtMSAmJiAobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgPiBub2Rlc1RvUmVtb3ZlKSB7CisJCWlmICh0aGlzLmFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSA+IG5vZGVzVG9SZW1vdmUpIHsKIAkJCWlmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgewogCQkJCVN5c3RlbS5hcnJheWNvcHkoCiAJCQkJCXRoaXMuYXN0U3RhY2ssCkBAIC02MTQsNyArNjgwLDcgQEAKIAkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCgpLAogCQkJCWFubm90YXRpb24pOwogCi0JY3VycmVudEVsZW1lbnQuYWRkKGZha2VUeXBlLCAwKTsKKwl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChmYWtlVHlwZSwgMCk7CiAJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IGZha2VUeXBlOwogfQogcHJpdmF0ZSB2b2lkIGJ1aWxkTW9yZUNvbXBsZXRpb25Db250ZXh0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewpAQCAtNjM0LDE5ICs3MDAsMTkgQEAKIAkJCQkJY2FsbC5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltdIHtleHByZXNzaW9ufTsKIAkJCQkJY2FsbC5zb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CiAJCQkJCWNhbGwuc291cmNlRW5kID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQ7Ci0JCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBjYWxsOworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBjYWxsOwogCQkJCX0gZWxzZSB7CiAJCQkJCWludCBpbnZvY1R5cGUgPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwxKTsKIAkJCQkJaW50IHF1YWxpZmllckV4cHJQdHIgPSBpbmZvOwogCiAJCQkJCS8vIGZpbmQgYXJndW1lbnRzCi0JCQkJCWludCBsZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0cl07CisJCQkJCWludCBsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHJdOwogCiAJCQkJCS8vIHNlYXJjaCBwcmV2aW91cyBhcmd1bWVudHMgaWYgbWlzc2luZwogCQkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPiAwICYmIHRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciA+IDAgJiYgbGVuZ3RoID09IDEpIHsKLQkJCQkJCWludCBzdGFydCA9IChpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tzZWxlY3Rvcl0gPj4+IDMyKTsKLQkJCQkJCWlmKHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItMV0gIT0gbnVsbCAmJiB0aGlzLmV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLTFdLnNvdXJjZVN0YXJ0ID4gc3RhcnQpIHsKLQkJCQkJCQlsZW5ndGggKz0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItMV07CisJCQkJCQlpbnQgc3RhcnQgPSAoaW50KSAodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1tzZWxlY3Rvcl0gPj4+IDMyKTsKKwkJCQkJCWlmKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0xXSAhPSBudWxsICYmIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0xXS5zb3VyY2VTdGFydCA+IHN0YXJ0KSB7CisJCQkJCQkJbGVuZ3RoICs9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0xXTsKIAkJCQkJCX0KIAogCQkJCQl9CkBAIC02NTQsMTQgKzcyMCwxNCBAQAogCQkJCQlFeHByZXNzaW9uW10gYXJndW1lbnRzID0gbnVsbDsKIAkJCQkJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCQkJCQlhcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdOwotCQkJCQkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4cHJlc3Npb25TdGFjaywgZXhwcmVzc2lvblB0ciArIDEsIGFyZ3VtZW50cywgMCwgbGVuZ3RoLTEpOworCQkJCQkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHByZXNzaW9uU3RhY2ssIHRoaXMuZXhwcmVzc2lvblB0ciArIDEsIGFyZ3VtZW50cywgMCwgbGVuZ3RoLTEpOwogCQkJCQkJYXJndW1lbnRzW2xlbmd0aC0xXSA9IGV4cHJlc3Npb247CiAJCQkJCX0KIAogCQkJCQlpZihpbnZvY1R5cGUgIT0gQUxMT0NBVElPTiAmJiBpbnZvY1R5cGUgIT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsKIAkJCQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gbmV3IE1lc3NhZ2VTZW5kKCk7Ci0JCQkJCQltZXNzYWdlU2VuZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tzZWxlY3Rvcl07CisJCQkJCQltZXNzYWdlU2VuZC5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3NlbGVjdG9yXTsKIAkJCQkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKIAogCQkJCQkJLy8gZmluZCByZWNlaXZlcgpAQCAtNjg2LDcgKzc1Miw3IEBACiAJCQkJCQkJCS8vIGNvbnN1bWUgdGhlIHJlY2VpdmVyCiAJCQkJCQkJCWludCBpZGVudGlmaWVyTGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKIAkJCQkJCQkJaWYodGhpcy5pZGVudGlmaWVyUHRyID4gLTEgJiYgaWRlbnRpZmllckxlbmd0aCA+IDAgJiYgdGhpcy5pZGVudGlmaWVyUHRyICsgMSA+PSBpZGVudGlmaWVyTGVuZ3RoKSB7Ci0JCQkJCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciA9IHRoaXMuZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKKwkJCQkJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKIAkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCW1lc3NhZ2VTZW5kID0gbnVsbDsKIAkJCQkJCQkJfQpAQCAtNzAxLDQ3ICs3NjcsNDYgQEAKIAkJCQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLmltcGxpY2l0VGhpcygpOwogCQkJCQkJCQlicmVhazsKIAkJCQkJCX0KLQkJCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBtZXNzYWdlU2VuZDsKKwkJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IG1lc3NhZ2VTZW5kOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYoaW52b2NUeXBlID09IEFMTE9DQVRJT04pIHsKIAkJCQkJCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwciA9IG5ldyBBbGxvY2F0aW9uRXhwcmVzc2lvbigpOwogCQkJCQkJCWFsbG9jYXRpb25FeHByLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLQkJCQkJCQlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2soaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdKTsKKwkJCQkJCQlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2sodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSk7CiAJCQkJCQkJcHVzaE9uR2VuZXJpY3NMZW5ndGhTdGFjaygwKTsKIAkJCQkJCQlhbGxvY2F0aW9uRXhwci50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHI7CisJCQkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHI7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByID0gbmV3IFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKCk7CiAJCQkJCQkJYWxsb2NhdGlvbkV4cHIuZW5jbG9zaW5nSW5zdGFuY2UgPSB0aGlzLmV4cHJlc3Npb25TdGFja1txdWFsaWZpZXJFeHByUHRyXTsKIAkJCQkJCQlhbGxvY2F0aW9uRXhwci5hcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0JCQkJCQkJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSk7CisJCQkJCQkJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0pOwogCQkJCQkJCXB1c2hPbkdlbmVyaWNzTGVuZ3RoU3RhY2soMCk7CiAKIAkJCQkJCQlhbGxvY2F0aW9uRXhwci50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHI7CisJCQkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHI7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CiAJCQljYXNlIEtfSU5TSURFX1JFVFVSTl9TVEFURU1FTlQgOgotCQkJCWlmKGluZm8gPT0gYnJhY2tldERlcHRoKSB7CisJCQkJaWYoaW5mbyA9PSB0aGlzLmJyYWNrZXREZXB0aCkgewogCQkJCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gbmV3IFJldHVyblN0YXRlbWVudChleHByZXNzaW9uLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCk7Ci0JCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSByZXR1cm5TdGF0ZW1lbnQ7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHJldHVyblN0YXRlbWVudDsKIAkJCQl9CiAJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CiAJCQljYXNlIEtfQ0FTVF9TVEFURU1FTlQgOgogCQkJCUV4cHJlc3Npb24gY2FzdFR5cGU7CiAJCQkJaWYodGhpcy5leHByZXNzaW9uUHRyID4gMAotCQkJCQkmJiAoKGNhc3RUeXBlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLTFdKSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UKLQkJCQkJCXx8IGNhc3RUeXBlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkpIHsKLQkJCQkJQ2FzdEV4cHJlc3Npb24gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHByZXNzaW9uLCBnZXRUeXBlUmVmZXJlbmNlKGNhc3RUeXBlKSk7CisJCQkJCSYmICgoY2FzdFR5cGUgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItMV0pIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkpIHsKKwkJCQkJQ2FzdEV4cHJlc3Npb24gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHByZXNzaW9uLCAoVHlwZVJlZmVyZW5jZSkgY2FzdFR5cGUpOwogCQkJCQljYXN0LnNvdXJjZVN0YXJ0ID0gY2FzdFR5cGUuc291cmNlU3RhcnQ7CiAJCQkJCWNhc3Quc291cmNlRW5kPSBleHByZXNzaW9uLnNvdXJjZUVuZDsKLQkJCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGNhc3Q7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGNhc3Q7CiAJCQkJfQogCQkJCWJyZWFrIG5leHRFbGVtZW50OwogCQkJY2FzZSBLX1VOQVJZX09QRVJBVE9SIDoKLQkJCQlpZihleHByZXNzaW9uUHRyID4gLTEpIHsKKwkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPiAtMSkgewogCQkJCQlFeHByZXNzaW9uIG9wZXJhdG9yRXhwcmVzc2lvbiA9IG51bGw7CiAJCQkJCXN3aXRjaCAoaW5mbykgewogCQkJCQkJY2FzZSBQTFVTX1BMVVMgOgpAQCAtNzU0LDIzICs4MTksMjMgQEAKIAkJCQkJCQlvcGVyYXRvckV4cHJlc3Npb24gPSBuZXcgVW5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24sIGluZm8pOwogCQkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBvcGVyYXRvckV4cHJlc3Npb247CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IG9wZXJhdG9yRXhwcmVzc2lvbjsKIAkJCQl9CiAJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CiAJCQljYXNlIEtfQklOQVJZX09QRVJBVE9SIDoKLQkJCQlpZihleHByZXNzaW9uUHRyID4gLTEpIHsKKwkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPiAtMSkgewogCQkJCQlFeHByZXNzaW9uIG9wZXJhdG9yRXhwcmVzc2lvbiA9IG51bGw7CiAJCQkJCUV4cHJlc3Npb24gbGVmdCA9IG51bGw7Ci0JCQkJCWlmKGV4cHJlc3Npb25QdHIgPT0gMCkgeworCQkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPT0gMCkgewogCQkJCQkJLy8gaXQgaXMgIGEgKioqX05vdE5hbWUgcnVsZQogCQkJCQkJaWYodGhpcy5pZGVudGlmaWVyUHRyID4gLTEpIHsKIAkJCQkJCQlsZWZ0ID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWxlZnQgPSB0aGlzLmV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLTFdOworCQkJCQkJbGVmdCA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0xXTsKIAkJCQkJCS8vIGlzIGl0IGEgKioqX05vdE5hbWUgcnVsZSA/CiAJCQkJCQlpZih0aGlzLmlkZW50aWZpZXJQdHIgPiAtMSkgewotCQkJCQkJCWludCBzdGFydCA9IChpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdID4+PiAzMik7CisJCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA+Pj4gMzIpOwogCQkJCQkJCWlmKGxlZnQuc291cmNlU3RhcnQgPCBzdGFydCkgewogCQkJCQkJCQlsZWZ0ID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKTsKIAkJCQkJCQl9CkBAIC03OTUsNTAgKzg2MCw0OCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWlmKG9wZXJhdG9yRXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gb3BlcmF0b3JFeHByZXNzaW9uOworCQkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gb3BlcmF0b3JFeHByZXNzaW9uOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrIG5leHRFbGVtZW50OwogCQkJY2FzZSBLX0FSUkFZX0lOSVRJQUxJWkVSIDoKIAkJCQlBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBuZXcgQXJyYXlJbml0aWFsaXplcigpOwogCQkJCWFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltde2V4cHJlc3Npb259OwotCQkJCWV4cHJlc3Npb25QdHIgLT0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV07CisJCQkJdGhpcy5leHByZXNzaW9uUHRyIC09IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXTsKIAotCQkJCWlmKGV4cHJlc3Npb25MZW5ndGhQdHIgPiAtMQotCQkJCQkmJiBleHByZXNzaW9uUHRyID4gLTEKLQkJCQkJJiYgdGhpcy5leHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gIT0gbnVsbAotCQkJCQkmJiB0aGlzLmV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXS5zb3VyY2VTdGFydCA+IGluZm8pIHsKLQkJCQkJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCQkJCWlmKHRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciA+IC0xCisJCQkJCSYmIHRoaXMuZXhwcmVzc2lvblB0ciA+IC0xCisJCQkJCSYmIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gIT0gbnVsbAorCQkJCQkmJiB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLnNvdXJjZVN0YXJ0ID4gaW5mbykgeworCQkJCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAkJCQl9CiAKLQkJCQlsYXN0Q2hlY2tQb2ludCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCiAJCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIsIDEpID09IEtfQVJSQVlfQ1JFQVRJT04pIHsKIAkJCQkJQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiA9IG5ldyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKCk7CiAJCQkJCXB1c2hPbkdlbmVyaWNzTGVuZ3RoU3RhY2soMCk7Ci0JCQkJCXB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayhpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl0pOworCQkJCQlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2sodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSk7CiAJCQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOwogCQkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlLmJpdHMgfD0gQVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2s7IC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcmF3IHR5cGUgdXNhZ2UKLQkJCQkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyXTsKKwkJCQkJaW50IGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0cl07CiAJCQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLmRpbWVuc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdOwogCiAJCQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLmluaXRpYWxpemVyID0gYXJyYXlJbml0aWFsaXplcjsKLQkJCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGFsbG9jYXRpb25FeHByZXNzaW9uOwotCQkJCX0gZWxzZSBpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkICYmICEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcikpIHsKLQkJCQkJUmVjb3ZlcmVkRmllbGQgcmVjb3ZlcmVkRmllbGQgPSAoUmVjb3ZlcmVkRmllbGQpIGN1cnJlbnRFbGVtZW50OworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBhbGxvY2F0aW9uRXhwcmVzc2lvbjsKKwkJCQl9IGVsc2UgaWYodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkICYmICEodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEluaXRpYWxpemVyKSkgeworCQkJCQlSZWNvdmVyZWRGaWVsZCByZWNvdmVyZWRGaWVsZCA9IChSZWNvdmVyZWRGaWVsZCkgdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJCQkJaWYocmVjb3ZlcmVkRmllbGQuZmllbGREZWNsYXJhdGlvbi50eXBlLmRpbWVuc2lvbnMoKSA9PSAwKSB7CiAJCQkJCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKIAkJCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gaW5mbzsKLQkJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGJsb2NrLCAxKTsKKwkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChibG9jaywgMSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlzdGF0ZW1lbnQgPSBhcnJheUluaXRpYWxpemVyOwogCQkJCQl9Ci0JCQkJfSBlbHNlIGlmKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgewotCQkJCQlSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIHJlY292ZXJlZExvY2FsVmFyaWFibGUgPSAoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgY3VycmVudEVsZW1lbnQ7CisJCQkJfSBlbHNlIGlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB7CisJCQkJCVJlY292ZXJlZExvY2FsVmFyaWFibGUgcmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSA9IChSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB0aGlzLmN1cnJlbnRFbGVtZW50OwogCQkJCQlpZihyZWNvdmVyZWRMb2NhbFZhcmlhYmxlLmxvY2FsRGVjbGFyYXRpb24udHlwZS5kaW1lbnNpb25zKCkgPT0gMCkgewogCQkJCQkJQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soMCk7CiAJCQkJCQlibG9jay5zb3VyY2VTdGFydCA9IGluZm87Ci0JCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChibG9jaywgMSk7CisJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoYmxvY2ssIDEpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJc3RhdGVtZW50ID0gYXJyYXlJbml0aWFsaXplcjsKIAkJCQkJfQpAQCAtODUxLDQzICs5MTQsNDMgQEAKIAkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKIAkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi5kaW1lbnNpb25zID0gbmV3IEV4cHJlc3Npb25bXXtleHByZXNzaW9ufTsKIAotCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBhbGxvY2F0aW9uRXhwcmVzc2lvbjsKKwkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBhbGxvY2F0aW9uRXhwcmVzc2lvbjsKIAkJCQlicmVhayBuZXh0RWxlbWVudDsKIAkJCWNhc2UgS19BU1NJU0dOTUVOVF9PUEVSQVRPUiA6Ci0JCQkJaWYoZXhwcmVzc2lvblB0ciA+IDAgJiYgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIgLSAxXSAhPSBudWxsKSB7CisJCQkJaWYodGhpcy5leHByZXNzaW9uUHRyID4gMCAmJiB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHIgLSAxXSAhPSBudWxsKSB7CiAJCQkJCUFzc2lnbm1lbnQgYXNzaWdubWVudDsKIAkJCQkJaWYoaW5mbyA9PSBFUVVBTCkgewogCQkJCQkJYXNzaWdubWVudCA9IG5ldyBBc3NpZ25tZW50KAotCQkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyIC0gMV0sCisJCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyIC0gMV0sCiAJCQkJCQkJZXhwcmVzc2lvbiwKIAkJCQkJCQlleHByZXNzaW9uLnNvdXJjZUVuZAogCQkJCQkJKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWFzc2lnbm1lbnQgPSBuZXcgQ29tcG91bmRBc3NpZ25tZW50KAotCQkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyIC0gMV0sCisJCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyIC0gMV0sCiAJCQkJCQkJZXhwcmVzc2lvbiwKIAkJCQkJCQlpbmZvLAogCQkJCQkJCWV4cHJlc3Npb24uc291cmNlRW5kCiAJCQkJCQkpOwogCQkJCQl9Ci0JCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBhc3NpZ25tZW50OworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBhc3NpZ25tZW50OwogCQkJCX0KIAkJCQlicmVhayBuZXh0RWxlbWVudDsKIAkJCWNhc2UgS19DT05ESVRJT05BTF9PUEVSQVRPUiA6CiAJCQkJaWYoaW5mbyA9PSBRVUVTVElPTikgewotCQkJCQlpZihleHByZXNzaW9uUHRyID4gMCkgewotCQkJCQkJZXhwcmVzc2lvblB0ci0tOwotCQkJCQkJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwotCQkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIrMV07CisJCQkJCWlmKHRoaXMuZXhwcmVzc2lvblB0ciA+IDApIHsKKwkJCQkJCXRoaXMuZXhwcmVzc2lvblB0ci0tOworCQkJCQkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyKzFdOwogCQkJCQkJcG9wRWxlbWVudChLX0NPTkRJVElPTkFMX09QRVJBVE9SKTsKIAkJCQkJCWJ1aWxkTW9yZUNvbXBsZXRpb25Db250ZXh0KGV4cHJlc3Npb24pOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYoZXhwcmVzc2lvblB0ciA+IDEpIHsKLQkJCQkJCWV4cHJlc3Npb25QdHIgPSBleHByZXNzaW9uUHRyIC0gMjsKLQkJCQkJCWV4cHJlc3Npb25MZW5ndGhQdHIgPSBleHByZXNzaW9uTGVuZ3RoUHRyIC0gMjsKLQkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzJdOworCQkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPiAxKSB7CisJCQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgPSB0aGlzLmV4cHJlc3Npb25QdHIgLSAyOworCQkJCQkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyIC0gMjsKKwkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHIrMl07CiAJCQkJCQlwb3BFbGVtZW50KEtfQ09ORElUSU9OQUxfT1BFUkFUT1IpOwogCQkJCQkJYnVpbGRNb3JlQ29tcGxldGlvbkNvbnRleHQoZXhwcmVzc2lvbik7CiAJCQkJCQlyZXR1cm47CkBAIC04OTYsMTAgKzk1OSwxMCBAQAogCQkJCWJyZWFrIG5leHRFbGVtZW50OwogCQkJY2FzZSBLX0JFVFdFRU5fTEVGVF9BTkRfUklHSFRfQlJBQ0tFVCA6CiAJCQkJQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWZlcmVuY2U7Ci0JCQkJaWYoaWRlbnRpZmllclB0ciA8IDAgJiYgZXhwcmVzc2lvblB0ciA+IDAgJiYgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID09IGV4cHJlc3Npb24pIHsKKwkJCQlpZih0aGlzLmlkZW50aWZpZXJQdHIgPCAwICYmIHRoaXMuZXhwcmVzc2lvblB0ciA+IDAgJiYgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9PSBleHByZXNzaW9uKSB7CiAJCQkJCWFycmF5UmVmZXJlbmNlID0KIAkJCQkJCW5ldyBBcnJheVJlZmVyZW5jZSgKLQkJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0xXSwKKwkJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItMV0sCiAJCQkJCQkJZXhwcmVzc2lvbik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJYXJyYXlSZWZlcmVuY2UgPQpAQCAtOTA3LDcgKzk3MCw3IEBACiAJCQkJCQkJZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSwKIAkJCQkJCQlleHByZXNzaW9uKTsKIAkJCQl9Ci0JCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGFycmF5UmVmZXJlbmNlOworCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGFycmF5UmVmZXJlbmNlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04gOgogCQkJCWlmKHRoaXMuZXhwcmVzc2lvblB0ciA+IDApIHsKQEAgLTkzMywyOSArOTk2LDE0NCBAQAogCQkJCQl9IGVsc2UgewogCQkJCQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHNbc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMubGVuZ3RoIC0gMV0gPSBjYXNlU3RhdGVtZW50OwogCQkJCQl9Ci0JCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBzd2l0Y2hTdGF0ZW1lbnQ7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHN3aXRjaFN0YXRlbWVudDsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIEtfQkVUV0VFTl9JRl9BTkRfUklHSFRfUEFSRU4gOgorCQkJCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KGV4cHJlc3Npb24sIG5ldyBFbXB0eVN0YXRlbWVudChleHByZXNzaW9uLnNvdXJjZUVuZCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gaWZTdGF0ZW1lbnQ7CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfQkVUV0VFTl9XSElMRV9BTkRfUklHSFRfUEFSRU4gOgorCQkJCVdoaWxlU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50ID0gbmV3IFdoaWxlU3RhdGVtZW50KGV4cHJlc3Npb24sIG5ldyBFbXB0eVN0YXRlbWVudChleHByZXNzaW9uLnNvdXJjZUVuZCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gd2hpbGVTdGF0ZW1lbnQ7CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfSU5TSURFX0ZPUl9DT05ESVRJT05BTDogLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MzAwOAorCQkJCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSBuZXcgRm9yU3RhdGVtZW50KG5ldyBTdGF0ZW1lbnRbMF0sIGV4cHJlc3Npb24sIG5ldyBTdGF0ZW1lbnRbMF0sCisJCQkJCQkJCQkJCQkJCQkgbmV3IEVtcHR5U3RhdGVtZW50KGV4cHJlc3Npb24uc291cmNlRW5kLCBleHByZXNzaW9uLnNvdXJjZUVuZCksCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGZvclN0YXRlbWVudDsKKwkJCQlicmVhayBuZXh0RWxlbWVudDsKKwkJCWNhc2UgS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU46CisJCQkJU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnQoKTsKKwkJCQlzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJCQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50WzBdOworCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHN3aXRjaFN0YXRlbWVudDsKKwkJCQlicmVhayBuZXh0RWxlbWVudDsKKwkJCWNhc2UgS19CRVRXRUVOX1NZTkNIUk9OSVpFRF9BTkRfUklHSFRfUEFSRU4gOgorCQkJCVN5bmNocm9uaXplZFN0YXRlbWVudCBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQgPSBuZXcgU3luY2hyb25pemVkU3RhdGVtZW50KGV4cHJlc3Npb24sIG5ldyBCbG9jaygwKSwgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHN5bmNocm9uaXplZFN0YXRlbWVudDsKKwkJCQlicmVhayBuZXh0RWxlbWVudDsKKwkJCWNhc2UgS19JTlNJREVfVEhST1dfU1RBVEVNRU5UOgorCQkJCWlmKGluZm8gPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKKwkJCQkJVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQgPSBuZXcgVGhyb3dTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSB0aHJvd1N0YXRlbWVudDsKKwkJCQl9CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfSU5TSURFX0FTU0VSVF9TVEFURU1FTlQ6CisJCQkJaWYoaW5mbyA9PSB0aGlzLmJyYWNrZXREZXB0aCkgeworCQkJCQlBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50ID0gbmV3IEFzc2VydFN0YXRlbWVudChleHByZXNzaW9uLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gYXNzZXJ0U3RhdGVtZW50OworCQkJCX0KKwkJCQlicmVhayBuZXh0RWxlbWVudDsKKwkJCWNhc2UgS19JTlNJREVfQVNTRVJUX0VYQ0VQVElPTjoKKwkJCQlpZihpbmZvID09IHRoaXMuYnJhY2tldERlcHRoKSB7CisJCQkJCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSBuZXcgQXNzZXJ0U3RhdGVtZW50KGV4cHJlc3Npb24sIG5ldyBUcnVlTGl0ZXJhbChleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0KSwgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCk7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGFzc2VydFN0YXRlbWVudDsKKwkJCQl9CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CiAJCX0KIAl9Ci0JaWYoYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7Ci0JCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKChTdGF0ZW1lbnQpYXNzaXN0Tm9kZVBhcmVudCwgMCk7CisJaWYodGhpcy5hc3Npc3ROb2RlUGFyZW50ICE9IG51bGwpIHsKKwkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGJ1aWxkTW9yZUNvbXBsZXRpb25FbmNsb3NpbmdDb250ZXh0KChTdGF0ZW1lbnQpdGhpcy5hc3Npc3ROb2RlUGFyZW50KSwgMCk7CiAJfSBlbHNlIHsKLQkJaWYoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCAmJiAhKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpCi0JCQkmJiAoKFJlY292ZXJlZEZpZWxkKSBjdXJyZW50RWxlbWVudCkuZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiA9PSBudWxsKSB7CisJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCAmJiAhKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcikKKwkJCSYmICgoUmVjb3ZlcmVkRmllbGQpIHRoaXMuY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgewogCi0JCQlhc3Npc3ROb2RlUGFyZW50ID0gKChSZWNvdmVyZWRGaWVsZCkgY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb247Ci0JCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOwotCQl9IGVsc2UgaWYoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlCi0JCQkmJiAoKFJlY292ZXJlZExvY2FsVmFyaWFibGUpIGN1cnJlbnRFbGVtZW50KS5sb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9ICgoUmVjb3ZlcmVkRmllbGQpIHRoaXMuY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb247CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoYnVpbGRNb3JlQ29tcGxldGlvbkVuY2xvc2luZ0NvbnRleHQoc3RhdGVtZW50KSwgMCk7CisJCX0gZWxzZSBpZih0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZQorCQkJJiYgKChSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB0aGlzLmN1cnJlbnRFbGVtZW50KS5sb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKIAotCQkJYXNzaXN0Tm9kZVBhcmVudCA9ICgoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgY3VycmVudEVsZW1lbnQpLmxvY2FsRGVjbGFyYXRpb247Ci0JCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gKChSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB0aGlzLmN1cnJlbnRFbGVtZW50KS5sb2NhbERlY2xhcmF0aW9uOworCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGJ1aWxkTW9yZUNvbXBsZXRpb25FbmNsb3NpbmdDb250ZXh0KHN0YXRlbWVudCksIDApOwogCQl9IGVsc2UgewotCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoZXhwcmVzc2lvbiwgMCk7CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoYnVpbGRNb3JlQ29tcGxldGlvbkVuY2xvc2luZ0NvbnRleHQoZXhwcmVzc2lvbiksIDApOwogCQl9CiAJfQogfQorcHJpdmF0ZSBTdGF0ZW1lbnQgYnVpbGRNb3JlQ29tcGxldGlvbkVuY2xvc2luZ0NvbnRleHQoU3RhdGVtZW50IHN0YXRlbWVudCkgeworCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gbnVsbDsKKwlpbnQgYmxvY2tJbmRleCA9IGxhc3RJbmRleE9mRWxlbWVudChLX0JMT0NLX0RFTElNSVRFUik7CisJaW50IGNvbnRyb2xJbmRleCA9IGxhc3RJbmRleE9mRWxlbWVudChLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUik7CisJaW50IGluZGV4OworCWlmIChjb250cm9sSW5kZXggIT0gLTEpIHsKKwkJaW5kZXggPSBibG9ja0luZGV4ICE9IC0xICYmIGNvbnRyb2xJbmRleCA8IGJsb2NrSW5kZXggPyBibG9ja0luZGV4IDogY29udHJvbEluZGV4OworCX0gZWxzZSB7CisJCS8vIFRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBjb21wbGV0aW9uIGlzIHJlcXVlc3RlZCBiZWZvcmUgZW5jbG9zaW5nIFJfUEFSRU4KKwkJLy8gYW5kIGFuIGluc3RhbmNlb2YgZXhwcmVzc2lvbiBpcyBhbHNvIHByZXNlbnQKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTUzNAorCQlpbnQgaW5zdGFuY2VPZkluZGV4ID0gbGFzdEluZGV4T2ZFbGVtZW50KEtfQkVUV0VFTl9JTlNUQU5DRU9GX0FORF9SUEFSRU4pOworCQlpbmRleCA9IGJsb2NrSW5kZXggIT0gLTEgJiYgaW5zdGFuY2VPZkluZGV4IDwgYmxvY2tJbmRleCA/IGJsb2NrSW5kZXggOiBpbnN0YW5jZU9mSW5kZXg7CisJfQorCXdoaWxlIChpbmRleCA+PSAwKSB7CisJCS8vIFRyeSB0byBmaW5kIGFuIGVuY2xvc2luZyBpZiBzdGF0ZW1lbnQgZXZlbiBpZiBvbmUgaXMgbm90IGZvdW5kIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgY29tcGxldGlvbiBub2RlLgorCQlpZiAoaW5kZXggIT0gLTEgJiYgdGhpcy5lbGVtZW50SW5mb1N0YWNrW2luZGV4XSA9PSBJRiAmJiB0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbaW5kZXhdICE9IG51bGwpIHsKKwkJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gKEV4cHJlc3Npb24pdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW2luZGV4XTsKKwkKKwkJCS8vIElmIGN1cnJlbnRFbGVtZW50IGlzIGEgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSB0aGVuIGl0IGNhbiBiZSBjb250YWluZWQgaW4gdGhlIGlmIHN0YXRlbWVudAorCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlICYmCisJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQucGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQmxvY2spIHsKKwkJCQlSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIHJlY292ZXJlZExvY2FsVmFyaWFibGUgPSAoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgdGhpcy5jdXJyZW50RWxlbWVudDsKKwkJCQlpZiAocmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5sb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwgJiYKKwkJCQkJCXN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24gJiYKKwkJCQkJCWNvbmRpdGlvbi5zb3VyY2VTdGFydCA8IHJlY292ZXJlZExvY2FsVmFyaWFibGUubG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCkgeworCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQorCQkJCQlzdGF0ZW1lbnQgPSByZWNvdmVyZWRMb2NhbFZhcmlhYmxlLnVwZGF0ZWRTdGF0ZW1lbnQoMCwgbmV3IEhhc2hTZXQoKSk7CisJCisJCQkJCS8vIFJlY292ZXJlZExvY2FsVmFyaWFibGUgbXVzdCBiZSByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBiZWNhdXNlIHRoZSBJZlN0YXRlbWVudCB3aWxsIGJlIGFkZGVkIGluc3RlYWQKKwkJCQkJUmVjb3ZlcmVkQmxvY2sgcmVjb3ZlcmVkQmxvY2sgPSAgKFJlY292ZXJlZEJsb2NrKSByZWNvdmVyZWRMb2NhbFZhcmlhYmxlLnBhcmVudDsKKwkJCQkJcmVjb3ZlcmVkQmxvY2suc3RhdGVtZW50c1stLXJlY292ZXJlZEJsb2NrLnN0YXRlbWVudENvdW50XSA9IG51bGw7CisJCisJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSByZWNvdmVyZWRCbG9jazsKKwkKKwkJCQl9CisJCQl9CisJCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQU5EX0FORF9FeHByZXNzaW9uICYmIHRoaXMuYXNzaXN0Tm9kZSBpbnN0YW5jZW9mIFN0YXRlbWVudCkgeworCQkJCXN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHRoaXMuYXNzaXN0Tm9kZTsKKwkJCX0KKwkJCWlmU3RhdGVtZW50ID0KKwkJCQluZXcgSWZTdGF0ZW1lbnQoCisJCQkJCQljb25kaXRpb24sCisJCQkJCQlzdGF0ZW1lbnQsCisJCQkJCQljb25kaXRpb24uc291cmNlU3RhcnQsCisJCQkJCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKKwkJCWluZGV4LS07CisJCQlicmVhazsKKwkJfQorCQlpbmRleC0tOworCX0KKwlpZiAoaWZTdGF0ZW1lbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gc3RhdGVtZW50OworCX0KKwkvLyBjb2xsZWN0IGFsbCBpZiBzdGF0ZW1lbnRzIHdpdGggaW5zdGFuY2VvZiBleHByZXNzaW9ucyB0aGF0IGVuY2xvc2UgdGhlIGNvbXBsZXRpb24gbm9kZQorCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQwMDYKKwl3aGlsZSAoaW5kZXggPj0gMCkgeworCQlpZiAodGhpcy5lbGVtZW50SW5mb1N0YWNrW2luZGV4XSA9PSBJRiAmJiB0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbaW5kZXhdIGluc3RhbmNlb2YgSW5zdGFuY2VPZkV4cHJlc3Npb24pIHsKKwkJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGNvbmRpdGlvbiA9IChJbnN0YW5jZU9mRXhwcmVzc2lvbil0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbaW5kZXhdOworCQkJaWZTdGF0ZW1lbnQgPQorCQkJCW5ldyBJZlN0YXRlbWVudCgKKwkJCQkJCWNvbmRpdGlvbiwKKwkJCQkJCWlmU3RhdGVtZW50LAorCQkJCQkJY29uZGl0aW9uLnNvdXJjZVN0YXJ0LAorCQkJCQkJaWZTdGF0ZW1lbnQuc291cmNlRW5kKTsKKwkJfQorCQlpbmRleC0tOworCX0KKwl0aGlzLmVuY2xvc2luZ05vZGUgPSBpZlN0YXRlbWVudDsKKwlyZXR1cm4gaWZTdGF0ZW1lbnQ7Cit9CiBwcml2YXRlIHZvaWQgYnVpbGRNb3JlR2VuZXJpY3NDb21wbGV0aW9uQ29udGV4dChBU1ROb2RlIG5vZGUsIGJvb2xlYW4gY29uc3VtZVR5cGVBcmd1bWVudHMpIHsKIAlpbnQga2luZCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKTsKIAlpZihraW5kICE9IDApIHsKQEAgLTk2NiwyOSArMTE0NCw2MSBAQAogCQkJCXN3aXRjaCAocHJldktpbmQpIHsKIAkJCQkJY2FzZSBLX1BBUkFNRVRFUklaRURfQUxMT0NBVElPTiA6CiAJCQkJCQlpZih0aGlzLmludm9jYXRpb25UeXBlID09IEFMTE9DQVRJT04gfHwgdGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBRVUFMSUZJRURfQUxMT0NBVElPTikgewotCQkJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKChUeXBlUmVmZXJlbmNlKW5vZGUsIDApOworCQkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCgoVHlwZVJlZmVyZW5jZSlub2RlLCAwKTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrIG5leHRFbGVtZW50OwogCQkJCQljYXNlIEtfUEFSQU1FVEVSSVpFRF9NRVRIT0RfSU5WT0NBVElPTiA6CiAJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMSkgPT0gMCkgewotCQkJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKChUeXBlUmVmZXJlbmNlKW5vZGUsIDApOworCQkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCgoVHlwZVJlZmVyZW5jZSlub2RlLCAwKTsKIAkJCQkJCQlicmVhayBuZXh0RWxlbWVudDsKIAkJCQkJCX0KIAkJCQl9CiAJCQkJaWYoaW5mbyA9PSBMRVNTICYmIG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CiAJCQkJCWlmKHRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+IC0xICYmIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0hPSAwKSB7Ci0JCQkJCQlpZiAoY29uc3VtZVR5cGVBcmd1bWVudHMpIHRoaXMuY29uc3VtZVR5cGVBcmd1bWVudHMoKTsKKwkJCQkJCWlmIChjb25zdW1lVHlwZUFyZ3VtZW50cykgY29uc3VtZVR5cGVBcmd1bWVudHMoKTsKIAkJCQkJCVR5cGVSZWZlcmVuY2UgcmVmID0gdGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApOwogCQkJCQkJaWYocHJldktpbmQgPT0gS19QQVJBTUVURVJJWkVEX0NBU1QpIHsKIAkJCQkJCQlyZWYgPSBjb21wdXRlUXVhbGlmaWVkR2VuZXJpY3NGcm9tUmlnaHRTaWRlKHJlZiwgMCk7CiAJCQkJCQl9Ci0JCQkJCQlpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpIHsKLQkJCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKHJlZiwgZmFsc2UpLCAwKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQocmVmLCAwKTsKKwkJCQkJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKSB7CisJCQkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKG5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUocmVmLCBmYWxzZSksIDApOworCQkJCQkJfSBlbHNlIHsJCQkJCQkJCisJCQkJCQkJCisJCQkJCQkJaWYgKHByZXZLaW5kID09IEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCkgeworCQkJCQkJCQkKKwkJCQkJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gZXhwOworCQkJCQkJCQlpZiAodGhpcy5leHByZXNzaW9uUHRyID4gLTEgJiYgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQkJCQkJCQlleHAgPSBuZXcgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwkJCQkJCQkJCWV4cC50eXBlID0gcmVmOworCQkJCQkJCQkJKChRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbilleHApLmVuY2xvc2luZ0luc3RhbmNlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWV4cCA9IG5ldyBBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQkJCQkJCQkJZXhwLnR5cGUgPSByZWY7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzSW5zaWRlUmV0dXJuKCkpIHsKKwkJCQkJCQkJCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSBuZXcgUmV0dXJuU3RhdGVtZW50KGV4cCwgZXhwLnNvdXJjZVN0YXJ0LCBleHAuc291cmNlRW5kKTsKKwkJCQkJCQkJCXRoaXMuZW5jbG9zaW5nTm9kZSA9IHJldHVyblN0YXRlbWVudDsKKwkJCQkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQocmV0dXJuU3RhdGVtZW50LDApOworCQkJCQkJCQl9IGVsc2UgaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB7CisJCQkJCQkJCQlpZiAoKChSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKXRoaXMuY3VycmVudEVsZW1lbnQpLmxvY2FsRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgeworCQkJCQkJCQkJCXRoaXMuZW5jbG9zaW5nTm9kZSA9ICgoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgdGhpcy5jdXJyZW50RWxlbWVudCkubG9jYWxEZWNsYXJhdGlvbjsKKwkJCQkJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoZXhwLCAwKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQpIHsKKwkJCQkJCQkJCWlmICgoKFJlY292ZXJlZEZpZWxkKSB0aGlzLmN1cnJlbnRFbGVtZW50KS5maWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKKwkJCQkJCQkJCQl0aGlzLmVuY2xvc2luZ05vZGUgPSAoKFJlY292ZXJlZEZpZWxkKSB0aGlzLmN1cnJlbnRFbGVtZW50KS5maWVsZERlY2xhcmF0aW9uOworCQkJCQkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChleHAsIDApOworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKHJlZiwgMCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQocmVmLCAwKTsKKwkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nTWV0aG9kKCkubWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCgoVHlwZVJlZmVyZW5jZSlub2RlLCAwKTsKKwkJCQkJfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ01ldGhvZCgpICE9IG51bGwgJiYKKwkJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ01ldGhvZCgpLm1ldGhvZERlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKChUeXBlUmVmZXJlbmNlKW5vZGUsIDApOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtOTk2LDE1ICsxMjA2LDE1IEBACiAJfQogfQogcHJpdmF0ZSB2b2lkIGJ1aWxkTW9yZVRyeVN0YXRlbWVudENvbXBsZXRpb25Db250ZXh0KFR5cGVSZWZlcmVuY2UgZXhjZXB0aW9uUmVmKSB7Ci0JaWYgKHRoaXMuYXN0TGVuZ3RoUHRyID4gLTEgJiYKLQkJCXRoaXMuYXN0UHRyID4gMSAmJgotCQkJdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBCbG9jayAmJgotCQkJdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciAtIDFdIGluc3RhbmNlb2YgQXJndW1lbnQpIHsKKwlpZiAodGhpcy5hc3RMZW5ndGhQdHIgPiAwICYmCisJCQl0aGlzLmFzdFB0ciA+IDIgJiYKKwkJCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLTFdIGluc3RhbmNlb2YgQmxvY2sgJiYKKwkJCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLSAyXSBpbnN0YW5jZW9mIEFyZ3VtZW50KSB7CiAJCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSBuZXcgVHJ5U3RhdGVtZW50KCk7CiAKLQkJaW50IG5ld0FzdFB0ciA9IHRoaXMuYXN0UHRyOworCQlpbnQgbmV3QXN0UHRyID0gdGhpcy5hc3RQdHIgLSAxOwogCi0JCWludCBsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXTsKKwkJaW50IGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHIgLSAxXTsKIAkJQmxvY2tbXSBia3MgPSAodHJ5U3RhdGVtZW50LmNhdGNoQmxvY2tzID0gbmV3IEJsb2NrW2xlbmd0aCArIDFdKTsKIAkJQXJndW1lbnRbXSBhcmdzID0gKHRyeVN0YXRlbWVudC5jYXRjaEFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFtsZW5ndGggKyAxXSk7CiAJCWlmIChsZW5ndGggIT0gMCkgewpAQCAtMTAxNiw1NyArMTIyNiw1NyBAQAogCQl9CiAKIAkJYmtzW2Jrcy5sZW5ndGggLSAxXSA9IG5ldyBCbG9jaygwKTsKLQkJYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gbmV3IEFyZ3VtZW50KEZBS0VfQVJHVU1FTlRfTkFNRSwwLGV4Y2VwdGlvblJlZiwwKTsKKwkJaWYgKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdIGluc3RhbmNlb2YgVW5pb25UeXBlUmVmZXJlbmNlKSB7CisJCQlVbmlvblR5cGVSZWZlcmVuY2UgdW5pb25UeXBlUmVmZXJlbmNlID0gKFVuaW9uVHlwZVJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCQlhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBuZXcgQXJndW1lbnQoRkFLRV9BUkdVTUVOVF9OQU1FLDAsdW5pb25UeXBlUmVmZXJlbmNlLDApOworCQl9IGVsc2UgeworCQkJYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gbmV3IEFyZ3VtZW50KEZBS0VfQVJHVU1FTlRfTkFNRSwwLGV4Y2VwdGlvblJlZiwwKTsKKwkJfQogCiAJCXRyeVN0YXRlbWVudC50cnlCbG9jayA9IChCbG9jaykgdGhpcy5hc3RTdGFja1tuZXdBc3RQdHItLV07CiAKLQkJYXNzaXN0Tm9kZVBhcmVudCA9IHRyeVN0YXRlbWVudDsKKwkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gdHJ5U3RhdGVtZW50OwogCi0JCWN1cnJlbnRFbGVtZW50LmFkZCh0cnlTdGF0ZW1lbnQsIDApOworCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCh0cnlTdGF0ZW1lbnQsIDApOwogCX0gZWxzZSBpZiAodGhpcy5hc3RMZW5ndGhQdHIgPiAtMSAmJgotCQkJdGhpcy5hc3RQdHIgPiAtMSAmJgotCQkJdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBCbG9jaykgeworCQkJdGhpcy5hc3RQdHIgPiAwICYmCisJCQl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gMV0gaW5zdGFuY2VvZiBCbG9jaykgewogCQlUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gbmV3IFRyeVN0YXRlbWVudCgpOwogCi0JCWludCBuZXdBc3RQdHIgPSB0aGlzLmFzdFB0cjsKKwkJaW50IG5ld0FzdFB0ciA9IHRoaXMuYXN0UHRyIC0gMTsKIAogCQlCbG9ja1tdIGJrcyA9ICh0cnlTdGF0ZW1lbnQuY2F0Y2hCbG9ja3MgPSBuZXcgQmxvY2tbMV0pOwogCQlBcmd1bWVudFtdIGFyZ3MgPSAodHJ5U3RhdGVtZW50LmNhdGNoQXJndW1lbnRzID0gbmV3IEFyZ3VtZW50WzFdKTsKIAogCQlia3NbMF0gPSBuZXcgQmxvY2soMCk7Ci0JCWFyZ3NbMF0gPSBuZXcgQXJndW1lbnQoRkFLRV9BUkdVTUVOVF9OQU1FLDAsZXhjZXB0aW9uUmVmLDApOworCQlpZiAodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBVbmlvblR5cGVSZWZlcmVuY2UpIHsKKwkJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGVSZWZlcmVuY2UgPSAoVW5pb25UeXBlUmVmZXJlbmNlKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJCWFyZ3NbMF0gPSBuZXcgQXJndW1lbnQoRkFLRV9BUkdVTUVOVF9OQU1FLDAsdW5pb25UeXBlUmVmZXJlbmNlLDApOworCQl9IGVsc2UgeworCQkJYXJnc1swXSA9IG5ldyBBcmd1bWVudChGQUtFX0FSR1VNRU5UX05BTUUsMCxleGNlcHRpb25SZWYsMCk7CisJCX0KIAogCQl0cnlTdGF0ZW1lbnQudHJ5QmxvY2sgPSAoQmxvY2spIHRoaXMuYXN0U3RhY2tbbmV3QXN0UHRyLS1dOwogCi0JCWFzc2lzdE5vZGVQYXJlbnQgPSB0cnlTdGF0ZW1lbnQ7CisJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHRyeVN0YXRlbWVudDsKIAotCQljdXJyZW50RWxlbWVudC5hZGQodHJ5U3RhdGVtZW50LCAwKTsKKwkJdGhpcy5jdXJyZW50RWxlbWVudC5hZGQodHJ5U3RhdGVtZW50LCAwKTsKIAl9ZWxzZSB7Ci0JCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGV4Y2VwdGlvblJlZiwgMCk7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChleGNlcHRpb25SZWYsIDApOwogCX0KIH0KIHB1YmxpYyBpbnQgYm9keUVuZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCl7Ci0JcmV0dXJuIGN1cnNvckxvY2F0aW9uOworCXJldHVybiB0aGlzLmN1cnNvckxvY2F0aW9uOwogfQogcHVibGljIGludCBib2R5RW5kKEluaXRpYWxpemVyIGluaXRpYWxpemVyKXsKLQlyZXR1cm4gY3Vyc29yTG9jYXRpb247CisJcmV0dXJuIHRoaXMuY3Vyc29yTG9jYXRpb247CiB9Ci0vKioKLSAqIENoZWNrcyBpZiB0aGUgY29tcGxldGlvbiBpcyBvbiB0aGUgZXhjZXB0aW9uIHR5cGUgb2YgYSBjYXRjaCBjbGF1c2UuCi0gKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBjaGVja0NhdGNoQ2xhdXNlKCkgewotCWlmICgodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4pICYmIHRoaXMuaWRlbnRpZmllclB0ciA+IC0xKSB7Ci0JCS8vIE5COiBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSB2YXJpYWJsZSwgdGhlbiBpdCBoYXMgYmVlbiByZWR1Y2VkIChzbyBpZGVudGlmaWVyUHRyIGlzIC0xKSwKLQkJLy8gICAgIHRodXMgdGhpcyBjYW4gb25seSBiZSBhIGNvbXBsZXRpb24gb24gdGhlIHR5cGUgb2YgdGhlIGNhdGNoIGNsYXVzZQotCQlwdXNoT25FbGVtZW50U3RhY2soS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKLQkJdGhpcy5hc3Npc3ROb2RlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04pOwotCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7Ci0JCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7Ci0JCXJldHVybiB0cnVlOworcHJvdGVjdGVkIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnMoaW50IGZsYWcpIHsKKwlzdXBlci5jaGVja0FuZFNldE1vZGlmaWVycyhmbGFnKTsKKworCWlmIChpc0luc2lkZU1ldGhvZCgpKSB7CisJCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gdHJ1ZTsKIAl9Ci0JcmV0dXJuIGZhbHNlOwogfQogLyoqCiAgKiBDaGVja3MgaWYgdGhlIGNvbXBsZXRpb24gaXMgb24gdGhlIHR5cGUgZm9sbG93aW5nIGEgJ25ldycuCkBAIC0xMDc0LDcgKzEyODQsNyBAQAogICovCiBwcml2YXRlIGJvb2xlYW4gY2hlY2tDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7CiAJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQpIHsKLQkJaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwkJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJCWludCBudW1iZXJPZklkZW50aWZpZXJzID0gdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyXTsKIAkJaWYgKGxlbmd0aCAhPSBudW1iZXJPZklkZW50aWZpZXJzIHx8IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXSAhPSAwKSB7CiAJCQkvLyBubyBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiB3aXRoIGEgcGFyYW1ldGVyaXplZCB0eXBlCkBAIC0xMDk3LDYgKzEzMDcsOCBAQAogCQkJfQogCQkJaWYodHlwZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKIAkJCQkoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpdHlwZSkuaXNDb25zdHJ1Y3RvclR5cGUgPSB0cnVlOworCQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQkJCSgoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSl0eXBlKS5pc0NvbnN0cnVjdG9yVHlwZSA9IHRydWU7CiAJCQl9CiAJCQlhbGxvY0V4cHIudHlwZSA9IHR5cGU7CiAJCQlhbGxvY0V4cHIuc291cmNlU3RhcnQgPSB0eXBlLnNvdXJjZVN0YXJ0OwpAQCAtMTEwNiw3ICsxMzE4LDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8vIHF1YWxpZmllZCBhbGxvY2F0aW9uIGV4cHJlc3Npb24KIAkJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwciA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpOwotCQkJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSk7CisJCQlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2sodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSk7CiAJCQlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOwogCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSBLX0lOU0lERV9USFJPV19TVEFURU1FTlQKIAkJCQkmJiB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMSkgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKQEAgLTExMTYsNiArMTMyOCw5IEBACiAJCQl9IGVsc2UgewogCQkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOwogCQkJfQorCQkJaWYodHlwZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJCQkoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpdHlwZSkuaXNDb25zdHJ1Y3RvclR5cGUgPSB0cnVlOworCQkJfQogCQkJYWxsb2NFeHByLnR5cGUgPSB0eXBlOwogCQkJYWxsb2NFeHByLmVuY2xvc2luZ0luc3RhbmNlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5xdWFsaWZpZXJdOwogCQkJYWxsb2NFeHByLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKQEAgLTExNDMsNyArMTM1OCw3IEBACiAJCS8vIHRoZSBjb21wbGV0aW9uIGlzIGFmdGVyIGEgcHJpbWl0aXZlIHR5cGUgb3IgYSBwcmltaXRpdmUgYXJyYXkgdHlwZQogCQlpZiAoKGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0xXSkgPCAwKSB7CiAJCQkvLyBidWlsZCB0aGUgcHJpbWl0aXZlIHR5cGUgbm9kZQotCQkJaW50IGRpbSA9IHRoaXMuaXNBZnRlckFycmF5VHlwZSgpID8gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSA6IDA7CisJCQlpbnQgZGltID0gaXNBZnRlckFycmF5VHlwZSgpID8gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSA6IDA7CiAJCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoU2luZ2xlVHlwZVJlZmVyZW5jZSlUeXBlUmVmZXJlbmNlLmJhc2VUeXBlUmVmZXJlbmNlKC1sZW5ndGgsIGRpbSk7CiAJCQl0eXBlUmVmLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJCWlmIChkaW0gPT0gMCkgewpAQCAtMTE1NSw3ICsxMzcwLDcgQEAKIAkJCS8vdHlwZVJlZi5zb3VyY2VFbmQgPSB0eXBlUmVmLnNvdXJjZVN0YXJ0ICsgdHlwZVJlZi50b2tlbi5sZW5ndGg7IC8vIE5COiBJdCdzIG9rIHRvIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSB0b2tlbiBzaW5jZSBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IHVuaWNvZGUKIAogCQkJLy8gZmluZCB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyIGFuZCBpdHMgc291cmNlIHBvc2l0aW9ucwotCQkJY2hhcltdIHNvdXJjZSA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKKwkJCWNoYXJbXSBzb3VyY2UgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwogCQkJbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOyAvLyBpdCBjYW4gb25seSBiZSBhIHNpbXBsZSBpZGVudGlmaWVyIChzbyBpdHMgbGVuZ3RoIGlzIG9uZSkKIApAQCAtMTE3MSwxMiArMTM4NiwxMiBAQAogCQkvLyBpZiB0aGUgY29tcGxldGlvbiBpcyBhZnRlciBhIHJlZ3VsYXIgYXJyYXkgdHlwZQogCQlpZiAoaXNBZnRlckFycmF5VHlwZSgpKSB7CiAJCQkvLyBmaW5kIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgYW5kIGl0cyBzb3VyY2UgcG9zaXRpb25zCi0JCQljaGFyW10gc291cmNlID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCQkJY2hhcltdIHNvdXJjZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CiAJCQlsb25nIHBvcyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOwogCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07IC8vIGl0IGNhbiBvbmx5IGJlIGEgc2ltcGxlIGlkZW50aWZpZXIgKHNvIGl0cyBsZW5ndGggaXMgb25lKQogCiAJCQkvLyBnZXQgdGhlIHR5cGUgcmVmZXJlbmNlCi0JCQlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2soaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdKTsKKwkJCXB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayh0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdKTsKIAkJCXB1c2hPbkdlbmVyaWNzTGVuZ3RoU3RhY2soMCk7CiAKIAkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IGdldFR5cGVSZWZlcmVuY2UodGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CkBAIC0xMTkzLDI4ICsxNDA4LDI4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJpdmF0ZSBib29sZWFuIGNoZWNrS2V5d29yZCgpIHsKLQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRVbml0KSB7Ci0JCVJlY292ZXJlZFVuaXQgdW5pdCA9IChSZWNvdmVyZWRVbml0KSBjdXJyZW50RWxlbWVudDsKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpIHsKKwkJUmVjb3ZlcmVkVW5pdCB1bml0ID0gKFJlY292ZXJlZFVuaXQpIHRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCWludCBpbmRleCA9IC0xOwogCQlpZiAoKGluZGV4ID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpKSA+IC0xKSB7CiAJCQlpbnQgcHRyID0gdGhpcy5pZGVudGlmaWVyUHRyIC0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSArIGluZGV4ICsgMTsKIAotCQkJY2hhcltdIGlkZW50ID0gaWRlbnRpZmllclN0YWNrW3B0cl07Ci0JCQlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl07CisJCQljaGFyW10gaWRlbnQgPSB0aGlzLmlkZW50aWZpZXJTdGFja1twdHJdOworCQkJbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl07CiAKIAkJCWNoYXJbXVtdIGtleXdvcmRzID0gbmV3IGNoYXJbS2V5d29yZHMuQ09VTlRdW107CiAJCQlpbnQgY291bnQgPSAwOwogCQkJaWYodW5pdC50eXBlQ291bnQgPT0gMAotCQkJCSYmIGxhc3RNb2RpZmllcnMgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpIHsKKwkJCQkmJiB0aGlzLmxhc3RNb2RpZmllcnMgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpIHsKIAkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLklNUE9SVDsKIAkJCX0KIAkJCWlmKHVuaXQudHlwZUNvdW50ID09IDAKIAkJCQkmJiB1bml0LmltcG9ydENvdW50ID09IDAKLQkJCQkmJiBsYXN0TW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0Ci0JCQkJJiYgY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID09IG51bGwpIHsKKwkJCQkmJiB0aGlzLmxhc3RNb2RpZmllcnMgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQKKwkJCQkmJiB0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSA9PSBudWxsKSB7CiAJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5QQUNLQUdFOwogCQkJfQotCQkJaWYoKGxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSA9PSAwKSB7CisJCQlpZigodGhpcy5sYXN0TW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgPT0gMCkgewogCQkJCWJvb2xlYW4gaGFzTm9QdWJsaWNUeXBlID0gdHJ1ZTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXQudHlwZUNvdW50OyBpKyspIHsKIAkJCQkJaWYoKHVuaXQudHlwZXNbaV0udHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMpICE9IDApIHsKQEAgLTEyMjUsMjUgKzE0NDAsMjggQEAKIAkJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5QVUJMSUM7CiAJCQkJfQogCQkJfQotCQkJaWYoKGxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpID09IDAKLQkJCQkmJiAobGFzdE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgPT0gMCkgeworCQkJaWYoKHRoaXMubGFzdE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMAorCQkJCSYmICh0aGlzLmxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDApIHsKIAkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkFCU1RSQUNUOwogCQkJfQotCQkJaWYoKGxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpID09IDAKLQkJCQkmJiAobGFzdE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgPT0gMCkgeworCQkJaWYoKHRoaXMubGFzdE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMAorCQkJCSYmICh0aGlzLmxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDApIHsKIAkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkZJTkFMOwogCQkJfQogCiAJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkNMQVNTOworCQkJaWYgKHRoaXMub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuRU5VTTsKKwkJCX0KIAotCQkJaWYoKGxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDApIHsKKwkJCWlmKCh0aGlzLmxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpID09IDApIHsKIAkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLklOVEVSRkFDRTsKIAkJCX0KIAkJCWlmKGNvdW50ICE9IDApIHsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KGtleXdvcmRzLCAwLCBrZXl3b3JkcyA9IG5ldyBjaGFyW2NvdW50XVtdLCAwLCBjb3VudCk7CiAKIAkJCQl0aGlzLmFzc2lzdE5vZGUgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDIoaWRlbnQsIHBvcywga2V5d29yZHMpOwotCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CisJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxOwogCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CkBAIC0xMjU3LDE2ICsxNDc1LDE2IEBACiAJCWludCBpbmRleDsKIAkJaWYoa2luZCAhPSBLX0JMT0NLX0RFTElNSVRFUgogCQkJJiYgKGluZGV4ID0gaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMQotCQkJJiYgZXhwcmVzc2lvblB0ciA+IC0xCi0JCQkmJiBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvblB0cl0gPT0gMSkgeworCQkJJiYgdGhpcy5leHByZXNzaW9uUHRyID4gLTEKKwkJCSYmIHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPT0gMSkgewogCiAJCQlpbnQgcHRyID0gdGhpcy5pZGVudGlmaWVyUHRyIC0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSArIGluZGV4ICsgMTsKLQkJCWlmKGlkZW50aWZpZXJTdGFja1twdHJdLmxlbmd0aCA+IDAgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW3B0cl0sIEtleXdvcmRzLklOU1RBTkNFT0YpKSB7CisJCQlpZih0aGlzLmlkZW50aWZpZXJTdGFja1twdHJdLmxlbmd0aCA+IDAgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5pZGVudGlmaWVyU3RhY2tbcHRyXSwgS2V5d29yZHMuSU5TVEFOQ0VPRikpIHsKIAkJCQl0aGlzLmFzc2lzdE5vZGUgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDMoCi0JCQkJCQlpZGVudGlmaWVyU3RhY2tbcHRyXSwKLQkJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl0sCisJCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1twdHJdLAorCQkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHJdLAogCQkJCQkJS2V5d29yZHMuSU5TVEFOQ0VPRik7Ci0JCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGFzc2lzdE5vZGUuc291cmNlRW5kICsgMTsKKwkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CiAJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KQEAgLTEyODUsOCArMTUwMyw4IEBACiAJYm9vbGVhbiBpc0VtcHR5TmFtZUNvbXBsZXRpb24gPSBmYWxzZTsKIAlib29sZWFuIGlzRW1wdHlBc3Npc3RJZGVudGlmaWVyID0gZmFsc2U7CiAJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX1NFTEVDVE9SX1FVQUxJRklFUgotCQkmJiAoKGlzRW1wdHlOYW1lQ29tcGxldGlvbiA9IHRvcEV4cHJlc3Npb24gPT0gdGhpcy5hc3Npc3ROb2RlICYmIHRoaXMuaXNFbXB0eU5hbWVDb21wbGV0aW9uKCkpIC8vIGVnLiBpdCBpcyBzb21ldGhpbmcgbGlrZSAidGhpcy5mcmVkKFtjdXJzb3JdIiBidXQgaXQgaXMgbm90IHNvbWV0aGluZyBsaWtlICJ0aGlzLmZyZWQoMSArIFtjdXJzb3JdIgotCQkJfHwgKGlzRW1wdHlBc3Npc3RJZGVudGlmaWVyID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpID49IDAgJiYgdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXS5sZW5ndGggPT0gMCkpKSB7IC8vIGVnLiBpdCBpcyBzb21ldGhpbmcgbGlrZSAidGhpcy5mcmVkKDEgW2N1cnNvcl0iCisJCSYmICgoaXNFbXB0eU5hbWVDb21wbGV0aW9uID0gdG9wRXhwcmVzc2lvbiA9PSB0aGlzLmFzc2lzdE5vZGUgJiYgaXNFbXB0eU5hbWVDb21wbGV0aW9uKCkpIC8vIGUuZy4gaXQgaXMgc29tZXRoaW5nIGxpa2UgInRoaXMuZnJlZChbY3Vyc29yXSIgYnV0IGl0IGlzIG5vdCBzb21ldGhpbmcgbGlrZSAidGhpcy5mcmVkKDEgKyBbY3Vyc29yXSIKKwkJCXx8IChpc0VtcHR5QXNzaXN0SWRlbnRpZmllciA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA+PSAwICYmIHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0ubGVuZ3RoID09IDApKSkgeyAvLyBlLmcuIGl0IGlzIHNvbWV0aGluZyBsaWtlICJ0aGlzLmZyZWQoMSBbY3Vyc29yXSIKIAogCQkvLyBwb3AgZW1wdHkgbmFtZSBjb21wbGV0aW9uCiAJCWlmIChpc0VtcHR5TmFtZUNvbXBsZXRpb24pIHsKQEAgLTEzNDMsNyArMTU2MSw3IEBACiAJCQkJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdLS07CiAJCQkJCX0KIAkJCQkJLy8gY29uc3VtZSB0aGUgcmVjZWl2ZXIKLQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSB0aGlzLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CisJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBTVVBFUl9SRUNFSVZFUjoKIAkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoMCwgMCk7CkBAIC0xMzk2LDcgKzE2MTQsNyBAQAogCQkJCWFsbG9jRXhwci5hcmd1bWVudHMgPSBhcmd1bWVudHM7CiAJCQkJaWYodGhpcy5nZW5lcmljc0xlbmd0aFB0ciA8IDApIHsKIAkJCQkJcHVzaE9uR2VuZXJpY3NMZW5ndGhTdGFjaygwKTsKLQkJCQkJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSk7CisJCQkJCXB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayh0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdKTsKIAkJCQl9CiAJCQkJYWxsb2NFeHByLnR5cGUgPSBzdXBlci5nZXRUeXBlUmVmZXJlbmNlKDApOyAvLyB3ZSBkb24ndCB3YW50IGEgY29tcGxldGlvbiBub2RlIGhlcmUsIHNvIGNhbGwgc3VwZXIKIAkJCQlpZiAoaW52b2NUeXBlID09IFFVQUxJRklFRF9BTExPQ0FUSU9OKSB7CkBAIC0xNDQwLDkgKzE2NTgsOSBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KGxhYmVscywgMCwgbGFiZWxzID0gbmV3IGNoYXJbbGFiZWxDb3VudF1bXSwgMCwgbGFiZWxDb3VudCk7CiAKIAkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKLQkJQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbCBzdGF0ZW1lbnRMYWJlbCA9Ci0JCQluZXcgQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbCgKLQkJCQkJa2luZCA9PSBLX0lOU0lERV9CUkVBS19TVEFURU1FTlQgPyBDb21wbGV0aW9uT25CcmFua1N0YXRlbWVudExhYmVsLkJSRUFLIDogQ29tcGxldGlvbk9uQnJhbmtTdGF0ZW1lbnRMYWJlbC5DT05USU5VRSwKKwkJQ29tcGxldGlvbk9uQnJhbmNoU3RhdGVtZW50TGFiZWwgc3RhdGVtZW50TGFiZWwgPQorCQkJbmV3IENvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsKAorCQkJCQlraW5kID09IEtfSU5TSURFX0JSRUFLX1NUQVRFTUVOVCA/IENvbXBsZXRpb25PbkJyYW5jaFN0YXRlbWVudExhYmVsLkJSRUFLIDogQ29tcGxldGlvbk9uQnJhbmNoU3RhdGVtZW50TGFiZWwuQ09OVElOVUUsCiAJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSwKIAkJCQkJKGludCkgKHBvc2l0aW9uID4+PiAzMiksCiAJCQkJCShpbnQpcG9zaXRpb24sCkBAIC0xNDU2LDcgKzE2NzQsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIC8qKgotICogQ2hlY2tzIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9uIGEgbWVtYmVyIGFjY2VzcyAoaWUuIGluIGFuIGlkZW50aWZpZXIgZm9sbG93aW5nIGEgZG90KS4KKyAqIENoZWNrcyBpZiB0aGUgY29tcGxldGlvbiBpcyBvbiBhIG1lbWJlciBhY2Nlc3MgKGkuZS4gaW4gYW4gaWRlbnRpZmllciBmb2xsb3dpbmcgYSBkb3QpLgogICogUmV0dXJucyB3aGV0aGVyIHdlIGZvdW5kIGEgY29tcGxldGlvbiBub2RlLgogICovCiBwcml2YXRlIGJvb2xlYW4gY2hlY2tNZW1iZXJBY2Nlc3MoKSB7CkBAIC0xNDgwLDcgKzE2OTgsNyBAQAogCS8qCiAJCVdlIGRpZG4ndCBmaW5kIGFueSBvdGhlciBjb21wbGV0aW9uLCBidXQgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBpcyBvbiB0aGUgaWRlbnRpZmllciBzdGFjaywKIAkJc28gaXQgY2FuIG9ubHkgYmUgYSBjb21wbGV0aW9uIG9uIG5hbWUuCi0JCU5vdGUgdGhhdCB3ZSBhbGxvdyB0aGUgY29tcGxldGlvbiBvbiBhIG5hbWUgZXZlbiBpZiBub3RoaW5nIGlzIGV4cGVjdGVkIChlZy4gZm9vKCkgYltjdXJzb3JdIHdvdWxkCisJCU5vdGUgdGhhdCB3ZSBhbGxvdyB0aGUgY29tcGxldGlvbiBvbiBhIG5hbWUgZXZlbiBpZiBub3RoaW5nIGlzIGV4cGVjdGVkIChlLmcuIGZvbygpIGJbY3Vyc29yXSB3b3VsZAogCQliZSBhIGNvbXBsZXRpb24gb24gJ2InKS4gVGhpcyBwb2xpY3kgZ2l2ZXMgbW9yZSB0byB0aGUgdXNlciB0aGFuIGhlL3NoZSB3b3VsZCBleHBlY3QsIGJ1dCB0aGlzCiAJCXNpbXBsaWZpZXMgdGhlIHByb2JsZW0uIFRvIGZpeCB0aGlzLCB0aGUgcmVjb3ZlcnkgbXVzdCBiZSBjaGFuZ2VkIHRvIHdvcmsgYXQgYSAnc3RhdGVtZW50JyBncmFudWxhcml0eQogCQlpbnN0ZWFkIG9mIGF0IHRoZSAnZXhwcmVzc2lvbicgZ3JhbnVsYXJpdHkgYXMgaXQgZG9lcyByaWdodCBub3cuCkBAIC0xNDkwLDYgKzE3MDgsMTAgQEAKIAl0aGlzLmFzc2lzdE5vZGUgPSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kICsgMTsKIAl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCWlmICh0aGlzLmhhc1VudXNlZE1vZGlmaWVycyAmJgorCQkJdGhpcy5hc3Npc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkoKENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UpdGhpcy5hc3Npc3ROb2RlKS5pc1ByZWNlZGVkQnlNb2RpZmllcnMgPSB0cnVlOworCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIHByaXZhdGUgYm9vbGVhbiBjaGVja1BhcmVtZXRlcml6ZWRNZXRob2ROYW1lKCkgewpAQCAtMTUwMiw3ICsxNzI0LDcgQEAKIAkJCQljYXNlIE5PX1JFQ0VJVkVSOiAvLyB0aGlzIGNhc2Ugb2NjdXJzIHdpdGggJ2JhcigpLmZvbycKIAkJCQkJaWYodGhpcy5leHByZXNzaW9uUHRyID4gLTEgJiYgdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyXSA9PSAxKSB7CiAJCQkJCQljaGFyW10gc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwotCQkJCQkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJCQkJCWxvbmcgcG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAkJCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCQkJCQkJaW50IGVuZCA9IChpbnQpIHBvc2l0aW9uOwogCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgKHBvc2l0aW9uID4+PiAzMik7CkBAIC0xNTEyLDcgKzE3MzQsNyBAQAogCQkJCQkJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwogCQkJCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIG0udHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCQkJCQlpbnRQdHItLTsKKwkJCQkJCXRoaXMuaW50UHRyLS07CiAKIAkJCQkJCW0ucmVjZWl2ZXIgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07CiAJCQkJCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKQEAgLTE1MjEsNyArMTc0Myw3IEBACiAJCQkJY2FzZSBOQU1FX1JFQ0VJVkVSOgogCQkJCQlpZih0aGlzLmlkZW50aWZpZXJQdHIgPiAwKSB7CiAJCQkJCQljaGFyW10gc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwotCQkJCQkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJCQkJCWxvbmcgcG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAkJCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCQkJCQkJaW50IGVuZCA9IChpbnQpIHBvc2l0aW9uOwogCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgKHBvc2l0aW9uID4+PiAzMik7CkBAIC0xNTMxLDE0ICsxNzUzLDE0IEBACiAJCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHItLV07CiAJCQkJCQl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgbS50eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCWludFB0ci0tOworCQkJCQkJdGhpcy5pbnRQdHItLTsKIAogCQkJCQkJbS5yZWNlaXZlciA9IGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBTVVBFUl9SRUNFSVZFUjoKIAkJCQkJY2hhcltdIHNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKLQkJCQkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJCQkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOwogCQkJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIAkJCQkJaW50IGVuZCA9IChpbnQpIHBvc2l0aW9uOwogCQkJCQlpbnQgc3RhcnQgPSAoaW50KSAocG9zaXRpb24gPj4+IDMyKTsKQEAgLTE1NDgsNyArMTc3MCw3IEBACiAJCQkJCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgbS50eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCQkJaW50UHRyLS07CisJCQkJCXRoaXMuaW50UHRyLS07CiAKIAkJCQkJbS5yZWNlaXZlciA9IG5ldyBTdXBlclJlZmVyZW5jZShzdGFydCwgZW5kKTsKIAkJCQkJYnJlYWs7CkBAIC0xNTk4LDIxICsxODIwLDIxIEBACiAgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCiAgKi8KIHByaXZhdGUgYm9vbGVhbiBjaGVja1JlY292ZXJlZE1ldGhvZCgpIHsKLQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRNZXRob2QpeworCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKIAkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KIAkJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHJldHVybiBmYWxzZTsKIAogCQkvKiBjaGVjayBpZiBvbiBsaW5lIHdpdGggYW4gZXJyb3IgYWxyZWFkeSAtIHRvIGF2b2lkIGNvbXBsZXRpbmcgaW5zaWRlCiAJCQlpbGxlZ2FsIHR5cGUgbmFtZXMgZS5nLiAgaW50WzxjdXJzb3I+ICovCi0JCWlmIChsYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbisxCi0JCQkmJiBVdGlsLmdldExpbmVOdW1iZXIobGFzdEVycm9yRW5kUG9zaXRpb24sIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikKLQkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKCgoQ29tcGxldGlvblNjYW5uZXIpc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0LCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpKXsKKwkJaWYgKHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24gPD0gdGhpcy5jdXJzb3JMb2NhdGlvbgorCQkJJiYgVXRpbC5nZXRMaW5lTnVtYmVyKHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24sIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCisJCQkJCT09IFV0aWwuZ2V0TGluZU51bWJlcigoKENvbXBsZXRpb25TY2FubmVyKXRoaXMuc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKSl7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLSAJCVJlY292ZXJlZE1ldGhvZCByZWNvdmVyZWRNZXRob2QgPSAoUmVjb3ZlcmVkTWV0aG9kKWN1cnJlbnRFbGVtZW50OworIAkJUmVjb3ZlcmVkTWV0aG9kIHJlY292ZXJlZE1ldGhvZCA9IChSZWNvdmVyZWRNZXRob2QpdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJLyogb25seSBjb25zaWRlciBpZiBpbnNpZGUgbWV0aG9kIGhlYWRlciAqLwogCQlpZiAoIXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZQotCQkJJiYgbGFzdElnbm9yZWRUb2tlbiA9PSAtMSkgeworCQkJJiYgdGhpcy5sYXN0SWdub3JlZFRva2VuID09IC0xKSB7CiAJCQkvL2lmIChyUGFyZW5Qb3MgPCBsUGFyZW5Qb3MpeyAvLyBpbnNpZGUgYXJndW1lbnRzCiAJCQl0aGlzLmFzc2lzdE5vZGUgPSB0aGlzLmdldFR5cGVSZWZlcmVuY2UoMCk7CiAJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CkBAIC0xNjUxLDE4ICsxODczLDE5IEBACiAgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCiAgKi8KIHByaXZhdGUgYm9vbGVhbiBjaGVja1JlY292ZXJlZFR5cGUoKSB7Ci0JaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKIAkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KIAkJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHJldHVybiBmYWxzZTsKIAogCQkvKiBjaGVjayBpZiBvbiBsaW5lIHdpdGggYW4gZXJyb3IgYWxyZWFkeSAtIHRvIGF2b2lkIGNvbXBsZXRpbmcgaW5zaWRlCiAJCQlpbGxlZ2FsIHR5cGUgbmFtZXMgZS5nLiAgaW50WzxjdXJzb3I+ICovCi0JCWlmICgobGFzdEVycm9yRW5kUG9zaXRpb24gPD0gY3Vyc29yTG9jYXRpb24rMSkKLQkJCSYmIFV0aWwuZ2V0TGluZU51bWJlcihsYXN0RXJyb3JFbmRQb3NpdGlvbiwgc2Nhbm5lci5saW5lRW5kcywgMCwgc2Nhbm5lci5saW5lUHRyKQotCQkJCQk9PSBVdGlsLmdldExpbmVOdW1iZXIoKChDb21wbGV0aW9uU2Nhbm5lcilzY2FubmVyKS5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikpeworCQlpZiAodGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSB0aGlzLmN1cnNvckxvY2F0aW9uCisJCQkmJiAoKFJlY292ZXJlZFR5cGUpdGhpcy5jdXJyZW50RWxlbWVudCkubGFzdE1lbWJlckVuZCgpIDwgdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbgorCQkJJiYgVXRpbC5nZXRMaW5lTnVtYmVyKHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24sIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCisJCQkJCT09IFV0aWwuZ2V0TGluZU51bWJlcigoKENvbXBsZXRpb25TY2FubmVyKXRoaXMuc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKSl7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpY3VycmVudEVsZW1lbnQ7CisJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKXRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KIAkJaWYgKHJlY292ZXJlZFR5cGUuZm91bmRPcGVuaW5nQnJhY2UpIHsKIAkJCS8vIGNvbXBsZXRlIGdlbmVyaWNzIHN0YWNrIGlmIG5lY2Vzc2FyeQpAQCAtMTY3OCwxMCArMTkwMSwxMCBAQAogCQl9IGVsc2UgewogCQkJaWYocmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcyA9PSBudWxsICYmCiAJCQkJCXRoaXMudG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfRVhURU5EU19LRVlXT1JEKSB7Ci0JCQkJdGhpcy5jb25zdW1lQ2xhc3NPckludGVyZmFjZU5hbWUoKTsKKwkJCQljb25zdW1lQ2xhc3NPckludGVyZmFjZU5hbWUoKTsKIAkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CiAJCQkJdGhpcy5hc3Npc3ROb2RlID0gdGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApOwotCQkJCXRoaXMucG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CisJCQkJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CiAJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxOwogCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCQkJcmV0dXJuIHRydWU7CkBAIC0xNjkxLDE2ICsxOTE0LDE2IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJpdmF0ZSB2b2lkIGNsYXNzSGVhZGVyRXh0ZW5kc09ySW1wbGVtZW50cyhib29sZWFuIGlzSW50ZXJmYWNlKSB7Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwKLQkJCSYmIGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCi0JCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gc2Nhbm5lci5zdGFydFBvc2l0aW9uCi0JCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwKKwkJCSYmIHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIKKwkJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbgorCQkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pewogCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwogCQlpbnQgaW5kZXggPSAtMTsKIAkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KIAkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgewogCQkJaW50IHB0ciA9IHRoaXMuaWRlbnRpZmllclB0ciAtIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gKyBpbmRleCArIDE7Ci0JCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKXRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCiAJCQlpZiAoIXJlY292ZXJlZFR5cGUuZm91bmRPcGVuaW5nQnJhY2UpIHsKIAkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHJlY292ZXJlZFR5cGUudHlwZURlY2xhcmF0aW9uOwpAQCAtMTcyMCw4ICsxOTQzLDggQEAKIAogCQkJCQlpZihjb3VudCA+IDApIHsKIAkJCQkJCUNvbXBsZXRpb25PbktleXdvcmQxIGNvbXBsZXRpb25PbktleXdvcmQgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDEoCi0JCQkJCQkJaWRlbnRpZmllclN0YWNrW3B0cl0sCi0JCQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyXSwKKwkJCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1twdHJdLAorCQkJCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyXSwKIAkJCQkJCQlrZXl3b3Jkcyk7CiAJCQkJCQljb21wbGV0aW9uT25LZXl3b3JkLmNhbkNvbXBsZXRlRW1wdHlUb2tlbiA9IHRydWU7CiAJCQkJCQl0eXBlLnN1cGVyY2xhc3MgPSBjb21wbGV0aW9uT25LZXl3b3JkOwpAQCAtMTczMiw4ICsxOTU1LDggQEAKIAkJCQl9IGVsc2UgewogCQkJCQlpZih0eXBlLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKSB7CiAJCQkJCQlDb21wbGV0aW9uT25LZXl3b3JkMSBjb21wbGV0aW9uT25LZXl3b3JkID0gbmV3IENvbXBsZXRpb25PbktleXdvcmQxKAotCQkJCQkJCWlkZW50aWZpZXJTdGFja1twdHJdLAotCQkJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl0sCisJCQkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbcHRyXSwKKwkJCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl0sCiAJCQkJCQkJS2V5d29yZHMuRVhURU5EUyk7CiAJCQkJCQljb21wbGV0aW9uT25LZXl3b3JkLmNhbkNvbXBsZXRlRW1wdHlUb2tlbiA9IHRydWU7CiAJCQkJCQl0eXBlLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBUeXBlUmVmZXJlbmNlW117Y29tcGxldGlvbk9uS2V5d29yZH07CkBAIC0xNzczLDkgKzE5OTYsOSBAQAogCSAJKHRoYXQgaXMsIHB1c2hlZCkuCiAJICovCiAJaWYgKGFzc2lzdElkZW50aWZpZXIoKSA9PSBudWxsICYmIHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIpIHsgLy8gVGVzdCBiZWxvdyBjb3BpZWQgZnJvbSBDb21wbGV0aW9uU2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpCi0JCWlmIChjdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAorCQlpZiAodGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAogCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwotCQl9IGVsc2UgaWYgKGN1cnNvckxvY2F0aW9uKzEgPj0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgY3Vyc29yTG9jYXRpb24gPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKXsKKwkJfSBlbHNlIGlmICh0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pewogCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwogCQl9CiAJfQpAQCAtMTc5MywxMiArMjAxNiwxMSBAQAogCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSByZXR1cm47CiAKIAlpZiAoY2hlY2tDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSkgcmV0dXJuOwotCWlmIChjaGVja0NhdGNoQ2xhdXNlKCkpIHJldHVybjsKIAlpZiAoY2hlY2tNZW1iZXJBY2Nlc3MoKSkgcmV0dXJuOwogCWlmIChjaGVja0NsYXNzTGl0ZXJhbEFjY2VzcygpKSByZXR1cm47CiAJaWYgKGNoZWNrSW5zdGFuY2VvZktleXdvcmQoKSkgcmV0dXJuOwogCi0JLy8gaWYgdGhlIGNvbXBsZXRpb24gd2FzIG5vdCBvbiBhbiBlbXB0eSBuYW1lLCBpdCBjYW4gc3RpbGwgYmUgaW5zaWRlIGFuIGludm9jYXRpb24gKGVnLiB0aGlzLmZyZWQoImFiYyJbY3Vyc29yXSkKKwkvLyBpZiB0aGUgY29tcGxldGlvbiB3YXMgbm90IG9uIGFuIGVtcHR5IG5hbWUsIGl0IGNhbiBzdGlsbCBiZSBpbnNpZGUgYW4gaW52b2NhdGlvbiAoZS5nLiB0aGlzLmZyZWQoImFiYyJbY3Vyc29yXSkKIAkvLyAoTkI6IFB1dCB0aGlzIGNoZWNrIGJlZm9yZSBjaGVja05hbWVDb21wbGV0aW9uKCkgYmVjYXVzZSB0aGUgc2VsZWN0b3Igb2YgdGhlIGludm9jYXRpb24gY2FuIGJlIG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrKQogCWlmIChjaGVja0ludm9jYXRpb24oKSkgcmV0dXJuOwogCkBAIC0xODMwLDEwICsyMDUyLDEwIEBACiAJc3VwZXIuY29uc3VtZUJpbmFyeUV4cHJlc3Npb24ob3ApOwogCXBvcEVsZW1lbnQoS19CSU5BUllfT1BFUkFUT1IpOwogCi0JaWYoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgewotCQlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JCWlmKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAucmlnaHQgPT0gYXNzaXN0Tm9kZSkgewotCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwlpZih0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworCQlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQlpZih0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAucmlnaHQgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBleHA7CiAJCX0KIAl9CiB9CkBAIC0xODQxLDEwICsyMDYzLDEwIEBACiAJc3VwZXIuY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShvcCk7CiAJcG9wRWxlbWVudChLX0JJTkFSWV9PUEVSQVRPUik7CiAKLQlpZihleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7Ci0JCUJpbmFyeUV4cHJlc3Npb24gZXhwID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQkJaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5yaWdodCA9PSBhc3Npc3ROb2RlKSB7Ci0JCQlhc3Npc3ROb2RlUGFyZW50ID0gZXhwOworCWlmKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisJCUJpbmFyeUV4cHJlc3Npb24gZXhwID0gKEJpbmFyeUV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCWlmKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5yaWdodCA9PSB0aGlzLmFzc2lzdE5vZGUpIHsKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKIAkJfQogCX0KIH0KQEAgLTE4NTcsMjAgKzIwNzksMjQgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhQcmltaXRpdmVUeXBlKCkgewogCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CiAKLQlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7Ci0JZXhwcmVzc2lvblB0ci0tOwotCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBjYXN0ID0gbmV3IENhc3RFeHByZXNzaW9uKGV4cCA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzFdLCBjYXN0VHlwZSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSk7CisJRXhwcmVzc2lvbiBleHA7CisJRXhwcmVzc2lvbiBjYXN0OworCVR5cGVSZWZlcmVuY2UgY2FzdFR5cGU7CisJdGhpcy5leHByZXNzaW9uUHRyLS07CisJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyKzFdLCBjYXN0VHlwZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKIAljYXN0LnNvdXJjZVN0YXJ0ID0gY2FzdFR5cGUuc291cmNlU3RhcnQgLSAxOwogCWNhc3Quc291cmNlRW5kID0gZXhwLnNvdXJjZUVuZDsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhHZW5lcmljc0FycmF5KCkgewogCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CiAKLQlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7Ci0JZXhwcmVzc2lvblB0ci0tOwotCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHAgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHIgKyAxXSwgY2FzdFR5cGUgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKKwlFeHByZXNzaW9uIGV4cDsKKwlFeHByZXNzaW9uIGNhc3Q7CisJVHlwZVJlZmVyZW5jZSBjYXN0VHlwZTsKKwl0aGlzLmV4cHJlc3Npb25QdHItLTsKKwl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHAgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHIgKyAxXSwgY2FzdFR5cGUgPSAoVHlwZVJlZmVyZW5jZSkgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CiAJY2FzdC5zb3VyY2VTdGFydCA9IGNhc3RUeXBlLnNvdXJjZVN0YXJ0IC0gMTsKIAljYXN0LnNvdXJjZUVuZCA9IGV4cC5zb3VyY2VFbmQ7CiB9CkBAIC0xODc4LDEwICsyMTA0LDEyIEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoUXVhbGlmaWVkR2VuZXJpY3NBcnJheSgpIHsKIAlwb3BFbGVtZW50KEtfQ0FTVF9TVEFURU1FTlQpOwogCi0JRXhwcmVzc2lvbiBleHAsIGNhc3QsIGNhc3RUeXBlOwotCWV4cHJlc3Npb25QdHItLTsKLQlleHByZXNzaW9uTGVuZ3RoUHRyLS07Ci0JdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV0sIGNhc3RUeXBlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CisJRXhwcmVzc2lvbiBleHA7CisJRXhwcmVzc2lvbiBjYXN0OworCVR5cGVSZWZlcmVuY2UgY2FzdFR5cGU7CisJdGhpcy5leHByZXNzaW9uUHRyLS07CisJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV0sIGNhc3RUeXBlID0gKFR5cGVSZWZlcmVuY2UpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOwogCWNhc3Quc291cmNlU3RhcnQgPSBjYXN0VHlwZS5zb3VyY2VTdGFydCAtIDE7CiAJY2FzdC5zb3VyY2VFbmQgPSBleHAuc291cmNlRW5kOwogfQpAQCAtMTg4OSwxMSArMjExNywxMiBAQAogCS8vIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgRGltcyBQdXNoUlBBUkVOIEluc2lkZUNhc3RFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwogCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CiAKLQlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7Ci0KLQlleHByZXNzaW9uUHRyLS07Ci0JZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwotCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIrMV0sIGNhc3RUeXBlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CisJRXhwcmVzc2lvbiBleHA7CisJRXhwcmVzc2lvbiBjYXN0OworCVR5cGVSZWZlcmVuY2UgY2FzdFR5cGU7CisJdGhpcy5leHByZXNzaW9uUHRyLS07CisJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyKzFdLCBjYXN0VHlwZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKIAljYXN0LnNvdXJjZVN0YXJ0ID0gY2FzdFR5cGUuc291cmNlU3RhcnQgLSAxOwogCWNhc3Quc291cmNlRW5kID0gZXhwLnNvdXJjZUVuZDsKIH0KQEAgLTE5MDEsNiArMjEzMCw1MCBAQAogCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CiAJc3VwZXIuY29uc3VtZUNhc3RFeHByZXNzaW9uTEwxKCk7CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2F0Y2hGb3JtYWxQYXJhbWV0ZXIoKSB7CisJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwkJc3VwZXIuY29uc3VtZUNhdGNoRm9ybWFsUGFyYW1ldGVyKCk7CisJCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCXRoaXMucGVuZGluZ0Fubm90YXRpb24ucG90ZW50aWFsQW5ub3RhdGVkTm9kZSA9IHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJY2hhcltdIGlkZW50aWZpZXJOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwkJbG9uZyBuYW1lUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJCXRoaXMuaW50UHRyLS07IC8vIGRpbWVuc2lvbiBmcm9tIHRoZSB2YXJpYWJsZWRlY2xhcmF0b3JpZAorCQlUeXBlUmVmZXJlbmNlIHR5cGUgPSAoVHlwZVJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ci0tXTsKKwkJdGhpcy5pbnRQdHIgLT0gMjsKKwkJQ29tcGxldGlvbk9uQXJndW1lbnROYW1lIGFyZyA9CisJCQluZXcgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKAorCQkJCWlkZW50aWZpZXJOYW1lLAorCQkJCW5hbWVQb3NpdGlvbnMsCisJCQkJdHlwZSwKKwkJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyICsgMV0gJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOyAvLyBtb2RpZmllcnMKKwkJYXJnLmJpdHMgJj0gfkFTVE5vZGUuSXNBcmd1bWVudDsKKwkJLy8gY29uc3VtZSBhbm5vdGF0aW9ucworCQlpbnQgbGVuZ3RoOworCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJCWFyZy5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOworCQl9CisKKwkJYXJnLmlzQ2F0Y2hBcmd1bWVudCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOOworCQlwdXNoT25Bc3RTdGFjayhhcmcpOworCisJCXRoaXMuYXNzaXN0Tm9kZSA9IGFyZzsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IChpbnQpIG5hbWVQb3NpdGlvbnM7CisJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisKKwkJLyogaWYgaW5jb21wbGV0ZSBtZXRob2QgaGVhZGVyLCBsaXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAorCQkJaW5kaWNhdGluZyB0aGF0IHNvbWUgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrICovCisJCXRoaXMubGlzdExlbmd0aCsrOworCX0KK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpIHsKIAlwb3BFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKIAlzdXBlci5jb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsKQEAgLTE5MzIsNiArMjIwNSw3IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXJOYW1lMSgpIHsKIAlzdXBlci5jb25zdW1lQ2xhc3NIZWFkZXJOYW1lMSgpOworCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gZmFsc2U7CiAJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewogCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CkBAIC0xOTQyLDI3ICsyMjE2LDMyIEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXJFeHRlbmRzKCkgewogCXB1c2hPbkVsZW1lbnRTdGFjayhLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CiAJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOworCWlmICh0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiB0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPT0gbnVsbCkgeworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJaWYgKHR5cGVEZWNsICE9IG51bGwgJiYgdHlwZURlY2wuc3VwZXJjbGFzcyA9PSB0aGlzLmFzc2lzdE5vZGUpCisJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSB0eXBlRGVjbDsKKwl9CiAJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CiAJcG9wRWxlbWVudChLX0VYVEVORFNfS0VZV09SRCk7CiAKLQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbAotCQkmJiBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcgotCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gc2Nhbm5lci5zdGFydFBvc2l0aW9uCi0JCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbAorCQkmJiB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCisJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CiAJCXRoaXMucHVzaElkZW50aWZpZXIoKTsKIAogCQlpbnQgaW5kZXggPSAtMTsKIAkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KIAkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgewogCQkJaW50IHB0ciA9IHRoaXMuaWRlbnRpZmllclB0ciAtIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gKyBpbmRleCArIDE7Ci0JCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKXRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCiAJCQlpZiAoIXJlY292ZXJlZFR5cGUuZm91bmRPcGVuaW5nQnJhY2UpIHsKIAkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHJlY292ZXJlZFR5cGUudHlwZURlY2xhcmF0aW9uOwogCQkJCWlmKHR5cGUuc3VwZXJJbnRlcmZhY2VzID09IG51bGwpIHsKIAkJCQkJdHlwZS5zdXBlcmNsYXNzID0gbmV3IENvbXBsZXRpb25PbktleXdvcmQxKAotCQkJCQkJaWRlbnRpZmllclN0YWNrW3B0cl0sCi0JCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHJdLAorCQkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbcHRyXSwKKwkJCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyXSwKIAkJCQkJCUtleXdvcmRzLklNUExFTUVOVFMpOwogCQkJCQl0eXBlLnN1cGVyY2xhc3MuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwogCQkJCQl0aGlzLmFzc2lzdE5vZGUgPSB0eXBlLnN1cGVyY2xhc3M7CkBAIC0xOTcyLDYgKzIyNTEsMjEgQEAKIAkJfQogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKSB7CisJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOworCWlmICh0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiB0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPT0gbnVsbCkgeworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJaWYgKHR5cGVEZWNsICE9IG51bGwpIHsKKwkJCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbC5zdXBlckludGVyZmFjZXM7CisJCQlpbnQgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzID09IG51bGwgPyAwIDogc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoc3VwZXJJbnRlcmZhY2VzW2ldID09IHRoaXMuYXNzaXN0Tm9kZSkgeworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSB0eXBlRGVjbDsKKwkJCQl9CQorCQkJfQorCQl9CisJfQorfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzVHlwZUVsdCgpIHsKIAlwdXNoT25FbGVtZW50U3RhY2soS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKIAlzdXBlci5jb25zdW1lQ2xhc3NUeXBlRWx0KCk7CkBAIC0xOTg2LDExICsyMjgwLDExIEBACiAJY2hlY2tDb21tZW50KCk7CiAJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsICYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPiB0aGlzLmphdmFkb2Muc291cmNlU3RhcnQgJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuamF2YWRvYy5zb3VyY2VFbmQpIHsKIAkJLy8gY29tcGxldGlvbiBpcyBpbiBhbiBvcnBoYW4gamF2YWRvYyBjb21tZW50ID0+IHJlcGxhY2UgY29tcGlsYXRpb24gdW5pdCBvbmUgdG8gYWxsb3cgY29tcGxldGlvbiByZXNvbHV0aW9uCi0JCWNvbXBpbGF0aW9uVW5pdC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwogCQkvLyBjcmVhdGUgYSBmYWtlIGludGVyZmFjZSBkZWNsYXJhdGlvbiB0byBhbGxvdyByZXNvbHV0aW9uCiAJCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdC50eXBlcyA9PSBudWxsKSB7CiAJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC50eXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bMV07Ci0JCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKIAkJCWRlY2xhcmF0aW9uLm5hbWUgPSBGQUtFX1RZUEVfTkFNRTsKIAkJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKIAkJCXRoaXMuY29tcGlsYXRpb25Vbml0LnR5cGVzWzBdID0gZGVjbGFyYXRpb247CkBAIC0yMDE4LDYgKzIzMTIsOSBAQAogCiAJLyogbm8gbmVlZCB0byB0YWtlIGFjdGlvbiBpZiBub3QgaW5zaWRlIGFzc2lzdCBpZGVudGlmaWVycyAqLwogCWlmIChpbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQlsb25nIHNlbGVjdG9yU291cmNlUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCQlpbnQgc2VsZWN0b3JTb3VyY2VFbmQgPSAoaW50KSBzZWxlY3RvclNvdXJjZVBvc2l0aW9uczsKKwkJaW50IGN1cnJlbnRBc3RQdHIgPSB0aGlzLmFzdFB0cjsKIAkJLyogcmVjb3ZlcmluZyAtIG1pZ2h0IGJlIGFuIGVtcHR5IG1lc3NhZ2Ugc2VuZCAqLwogCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsICYmIHRoaXMubGFzdElnbm9yZWRUb2tlbiA9PSBUb2tlbk5hbWVuZXcpeyAvLyB3YXMgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCiAJCQlzdXBlci5jb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lKCk7CkBAIC0yMDI4LDExICsyMzI1LDE0IEBACiAJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CiAJCQl9CiAJCX0KKwkJaWYgKHRoaXMuc291cmNlRW5kcyAhPSBudWxsICYmIHRoaXMuYXN0UHRyID4gY3VycmVudEFzdFB0cikgeyAvLyBpZiBhc3Qgbm9kZSB3YXMgcHVzaGVkIG9uIHRoZSBhc3Qgc3RhY2sKKwkJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHNlbGVjdG9yU291cmNlRW5kKTsKKwkJfQogCQlyZXR1cm47CiAJfQogCiAJLyogZm9yY2UgdG8gc3RhcnQgcmVjb3ZlcmluZyBpbiBvcmRlciB0byBnZXQgZmFrZSBmaWVsZCBiZWhhdmlvciAqLwotCWlmIChjdXJyZW50RWxlbWVudCA9PSBudWxsKXsKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsKXsKIAkJdGhpcy5oYXNSZXBvcnRlZEVycm9yID0gdHJ1ZTsgLy8gZG8gbm90IHJlcG9ydCBhbnkgZXJyb3IKIAl9CiAJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0pOwpAQCAtMjA0MCw2ICsyMzQwLDkgQEAKIAl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworCWxvbmcgc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJaW50IHNlbGVjdG9yU291cmNlRW5kID0gKGludCkgc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnM7CisJaW50IGN1cnJlbnRBc3RQdHIgPSB0aGlzLmFzdFB0cjsKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsICYmIHRoaXMubGFzdElnbm9yZWRUb2tlbiA9PSBUb2tlbk5hbWVuZXcpeyAvLyB3YXMgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCiAJCXN1cGVyLmNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsKIAl9IGVsc2UgewpAQCAtMjA0OSw2ICsyMzUyLDkgQEAKIAkJCXRoaXMucGVuZGluZ0Fubm90YXRpb24gPSBudWxsOwogCQl9CiAJfQorCWlmICh0aGlzLnNvdXJjZUVuZHMgIT0gbnVsbCAmJiB0aGlzLmFzdFB0ciA+IGN1cnJlbnRBc3RQdHIpIHsgLy8gaWYgYXN0IG5vZGUgd2FzIHB1c2hlZCBvbiB0aGUgYXN0IHN0YWNrCisJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHNlbGVjdG9yU291cmNlRW5kKTsKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRGVmYXVsdExhYmVsKCkgewogCXN1cGVyLmNvbnN1bWVEZWZhdWx0TGFiZWwoKTsKQEAgLTIwNjEsMzAgKzIzNjcsMzkgQEAKIAkvLyBEaW1XaXRoT3JXaXRoT3V0RXhwciA6Oj0gJ1snICddJwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhudWxsKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudCgpIHsKKwlzdXBlci5jb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnQoKTsKKworCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpIHsKKwkJcG9wRWxlbWVudChLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUik7CisJfQorfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVySW5pdChib29sZWFuIGhhc01vZGlmaWVycykgewogCXN1cGVyLmNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlckluaXQoaGFzTW9kaWZpZXJzKTsKKwl0aGlzLmhhc1VudXNlZE1vZGlmaWVycyA9IGZhbHNlOwogCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsKIAkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbi5wb3RlbnRpYWxBbm5vdGF0ZWROb2RlID0gdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJCXRoaXMucGVuZGluZ0Fubm90YXRpb24gPSBudWxsOwogCX0KIH0KLXByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpIHsKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShib29sZWFuIHF1YWxpZmllZCkgewogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9RVUFMSUZJRVIpOwogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9JTlZPQ0FUSU9OX1RZUEUpOwotCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOworCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShxdWFsaWZpZWQpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyVmFyaWFibGUoKSB7Ci0JaWRlbnRpZmllclB0ci0tOwotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIAotCWJvb2xlYW4gaXNMb2NhbERlY2xhcmF0aW9uID0gbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdICE9IDA7Ci0JaW50IHZhcmlhYmxlSW5kZXggPSB2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdOwotCWludCBleHRlbmRlZERpbWVuc2lvbiA9IGludFN0YWNrW2ludFB0ciArIDFdOworCWJvb2xlYW4gaXNMb2NhbERlY2xhcmF0aW9uID0gdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSAhPSAwOworCWludCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV07CiAKLQlpZihpc0xvY2FsRGVjbGFyYXRpb24gfHwgaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDAgfHwgdmFyaWFibGVJbmRleCAhPSAwIHx8IGV4dGVuZGVkRGltZW5zaW9uICE9IDApIHsKLQkJaWRlbnRpZmllclB0cisrOwotCQlpZGVudGlmaWVyTGVuZ3RoUHRyKys7Ci0JCQorCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gZmFsc2U7CisKKwlpZihpc0xvY2FsRGVjbGFyYXRpb24gfHwgaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDAgfHwgdmFyaWFibGVJbmRleCAhPSAwKSB7CisJCXRoaXMuaWRlbnRpZmllclB0cisrOworCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIrKzsKKwogCQlpZiAodGhpcy5wZW5kaW5nQW5ub3RhdGlvbiAhPSBudWxsICYmCiAJCQkJdGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYKIAkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYKQEAgLTIwOTYsNyArMjQxMSw3IEBACiAJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJCXRoaXMucGVuZGluZ0Fubm90YXRpb24uaXNQYXJhbWV0ZXIgPSB0cnVlOwogCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7Ci0JCQkKKwogCQl9IGVsc2UgewogCQkJc3VwZXIuY29uc3VtZUVudGVyVmFyaWFibGUoKTsKIAkJCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsKQEAgLTIxMDUsMzEgKzI0MjAsNDEgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAogCQkvLyByZWNvdmVyeQotCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYoIWNoZWNrS2V5d29yZCgpICYmICEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRVbml0ICYmICgoUmVjb3ZlcmVkVW5pdCljdXJyZW50RWxlbWVudCkudHlwZUNvdW50ID09IDApKSB7Ci0JCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9IChpbnQpKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdID4+PiAzMik7Ci0JCQkJaW50UHRyLS07Ci0JCQkJVHlwZVJlZmVyZW5jZSB0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOwotCQkJCWludFB0ci0tOworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CisJCQlpZighY2hlY2tLZXl3b3JkKCkgJiYgISh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVW5pdCAmJiAoKFJlY292ZXJlZFVuaXQpdGhpcy5jdXJyZW50RWxlbWVudCkudHlwZUNvdW50ID09IDApKSB7CisJCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9IChpbnQpKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA+Pj4gMzIpOworCQkJCXRoaXMuaW50UHRyLS07CisJCQkJVHlwZVJlZmVyZW5jZSB0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKKwkJCQl0aGlzLmludFB0ci0tOwogCi0JCQkJaWYgKCEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKQotCQkJCQkmJiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZURPVAotCQkJCQkJfHwgKFV0aWwuZ2V0TGluZU51bWJlcih0eXBlLnNvdXJjZVN0YXJ0LCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpCi0JCQkJCQkJCSE9IFV0aWwuZ2V0TGluZU51bWJlcihuYW1lU291cmNlU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikpKSl7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gbmFtZVNvdXJjZVN0YXJ0OwotCQkJCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOworCQkJCWlmICghKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKQorCQkJCQkmJiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lRE9UCisJCQkJCQl8fCAoVXRpbC5nZXRMaW5lTnVtYmVyKHR5cGUuc291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCisJCQkJCQkJCSE9IFV0aWwuZ2V0TGluZU51bWJlcihuYW1lU291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpKSkpeworCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbmFtZVNvdXJjZVN0YXJ0OworCQkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAKIAkJCQlGaWVsZERlY2xhcmF0aW9uIGNvbXBsZXRpb25GaWVsZERlY2wgPSBuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKHR5cGUsIGZhbHNlKTsKLQkJCQljb21wbGV0aW9uRmllbGREZWNsLm1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJCQlhc3Npc3ROb2RlID0gY29tcGxldGlvbkZpZWxkRGVjbDsKLQkJCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGUuc291cmNlRW5kICsgMTsKLQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChjb21wbGV0aW9uRmllbGREZWNsLCAwKTsKLQkJCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCQkJLy8gY29uc3VtZSBhbm5vdGF0aW9ucworCQkJCWludCBsZW5ndGg7CisJCQkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCQkJCWNvbXBsZXRpb25GaWVsZERlY2wuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJCQkJMCwKKwkJCQkJCWxlbmd0aCk7CisJCQkJfQorCQkJCWNvbXBsZXRpb25GaWVsZERlY2wubW9kaWZpZXJzID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCQl0aGlzLmFzc2lzdE5vZGUgPSBjb21wbGV0aW9uRmllbGREZWNsOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlLnNvdXJjZUVuZCArIDE7CisJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGNvbXBsZXRpb25GaWVsZERlY2wsIDApOworCQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQkJfQogCQl9CiAJfQpAQCAtMjEzNyw3ICsyNDYyLDcgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnRIZWFkZXJOYW1lKCkgewogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKIAkJaWYgKCEodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUKLQkJCQkJfHwgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCAmJiAoKFJlY292ZXJlZEZpZWxkKWN1cnJlbnRFbGVtZW50KS5maWVsZERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkpCisJCQkJCXx8ICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQgJiYgKChSZWNvdmVyZWRGaWVsZCl0aGlzLmN1cnJlbnRFbGVtZW50KS5maWVsZERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkpCiAJCQkJfHwgKHRoaXMubGFzdElnbm9yZWRUb2tlbiA9PSBUb2tlbk5hbWVET1QpKSB7CiAJCQlzdXBlci5jb25zdW1lRW51bUNvbnN0YW50SGVhZGVyTmFtZSgpOwogCQkJcmV0dXJuOwpAQCAtMjE0OSw4ICsyNDc0LDM0IEBACiAJCXRoaXMucGVuZGluZ0Fubm90YXRpb24gPSBudWxsOwogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnROb0NsYXNzQm9keSgpIHsKKwlzdXBlci5jb25zdW1lRW51bUNvbnN0YW50Tm9DbGFzc0JvZHkoKTsKKwlpZiAoKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUNPTU1BIHx8IHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikKKwkJCSYmIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQlpZiAodGhpcy5zb3VyY2VFbmRzICE9IG51bGwpIHsKKwkJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKKwkJfQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnRXaXRoQ2xhc3NCb2R5KCkgeworCXN1cGVyLmNvbnN1bWVFbnVtQ29uc3RhbnRXaXRoQ2xhc3NCb2R5KCk7CisJaWYgKCh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVDT01NQSB8fCB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pCisJCQkmJiB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJaWYgKHRoaXMuc291cmNlRW5kcyAhPSBudWxsKSB7CisJCQl0aGlzLnNvdXJjZUVuZHMucHV0KHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CisJCX0KKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUhlYWRlck5hbWUoKSB7CiAJc3VwZXIuY29uc3VtZUVudW1IZWFkZXJOYW1lKCk7CisJdGhpcy5oYXNVbnVzZWRNb2RpZmllcnMgPSBmYWxzZTsKKwlpZiAodGhpcy5wZW5kaW5nQW5ub3RhdGlvbiAhPSBudWxsKSB7CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb24ucG90ZW50aWFsQW5ub3RhdGVkTm9kZSA9IHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uID0gbnVsbDsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisJc3VwZXIuY29uc3VtZUVudW1IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCk7CiAJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewogCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CkBAIC0yMTYwLDMwICsyNTExLDQ3IEBACiAJc3VwZXIuY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihvcCk7CiAJcG9wRWxlbWVudChLX0JJTkFSWV9PUEVSQVRPUik7CiAKLQlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5yaWdodCA9PSBhc3Npc3ROb2RlKSB7Ci0JCWFzc2lzdE5vZGVQYXJlbnQgPSBleHA7CisJQmluYXJ5RXhwcmVzc2lvbiBleHAgPSAoQmluYXJ5RXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwlpZih0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAucmlnaHQgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uV2l0aE5hbWUoaW50IG9wKSB7CiAJc3VwZXIuY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbldpdGhOYW1lKG9wKTsKIAlwb3BFbGVtZW50KEtfQklOQVJZX09QRVJBVE9SKTsKIAotCUJpbmFyeUV4cHJlc3Npb24gZXhwID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQlpZihhc3Npc3ROb2RlICE9IG51bGwgJiYgZXhwLnJpZ2h0ID09IGFzc2lzdE5vZGUpIHsKLQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5yaWdodCA9PSB0aGlzLmFzc2lzdE5vZGUpIHsKKwkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gZXhwOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKSB7CiAJc3VwZXIuY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOworCWlmICgodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQorCQkJJiYgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJCWlmICh0aGlzLnNvdXJjZUVuZHMgIT0gbnVsbCkgeworCQkJdGhpcy5zb3VyY2VFbmRzLnB1dCh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQl9CisJfQogCiAJLy8gZG9lcyBub3Qga2VlcCB0aGUgaW5pdGlhbGl6YXRpb24gaWYgY29tcGxldGlvbiBpcyBub3QgaW5zaWRlCi0JQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKLQlpZiAoY3Vyc29yTG9jYXRpb24gKyAxIDwgdmFyaWFibGUuaW5pdGlhbGl6YXRpb24uc291cmNlU3RhcnQgfHwKLQkJY3Vyc29yTG9jYXRpb24gPiB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQpIHsKKwlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwlpZiAodGhpcy5jdXJzb3JMb2NhdGlvbiArIDEgPCB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VTdGFydCB8fAorCQl0aGlzLmN1cnNvckxvY2F0aW9uID4gdmFyaWFibGUuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kKSB7CiAJCXZhcmlhYmxlLmluaXRpYWxpemF0aW9uID0gbnVsbDsKLQl9IGVsc2UgaWYgKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBhc3Npc3ROb2RlID09IHZhcmlhYmxlLmluaXRpYWxpemF0aW9uKSB7Ci0JCWFzc2lzdE5vZGVQYXJlbnQgPSB2YXJpYWJsZTsKKwl9IGVsc2UgaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZSA9PSB2YXJpYWJsZS5pbml0aWFsaXphdGlvbikgeworCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSB2YXJpYWJsZTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJc3VwZXIuY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOworCWlmICgodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQorCQkJJiYgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJCWlmICh0aGlzLnNvdXJjZUVuZHMgIT0gbnVsbCkgeworCQkJdGhpcy5zb3VyY2VFbmRzLnB1dCh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQl9CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGludCBmbGFnLCBpbnQgcmVjRmxhZykgewpAQCAtMjIwNyw3ICsyNTc1LDcgQEAKIAlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgewogCQlzdXBlci5jb25zdW1lRmllbGRBY2Nlc3MoaXNTdXBlckFjY2Vzcyk7CiAJfSBlbHNlIHsKLQkJdGhpcy5wdXNoQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzT25FeHByZXNzaW9uU3RhY2soaXNTdXBlckFjY2Vzcyk7CisJCXB1c2hDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3NPbkV4cHJlc3Npb25TdGFjayhpc1N1cGVyQWNjZXNzKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9yY2VOb0RpZXQoKSB7CkBAIC0yMjI1LDkgKzI1OTMsOSBAQAogCQl9CiAJfSBlbHNlIHsKIAotCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JCWNoYXJbXSBpZGVudGlmaWVyTmFtZSA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQkJbG9uZyBuYW1lUG9zaXRpb25zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJCWNoYXJbXSBpZGVudGlmaWVyTmFtZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJCWxvbmcgbmFtZVBvc2l0aW9ucyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOwogCQlpbnQgZXh0ZW5kZWREaW1lbnNpb25zID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJaW50IGVuZE9mRWxsaXBzaXMgPSAwOwogCQlpZiAoaXNWYXJBcmdzKSB7CkBAIC0yMjQzLDEzICsyNjExLDEzIEBACiAJCQl9CiAJCQl0eXBlLmJpdHMgfD0gQVNUTm9kZS5Jc1ZhckFyZ3M7IC8vIHNldCBpc1ZhckFyZ3MKIAkJfQotCQlpbnRQdHIgLT0gMjsKKwkJdGhpcy5pbnRQdHIgLT0gMjsKIAkJQ29tcGxldGlvbk9uQXJndW1lbnROYW1lIGFyZyA9CiAJCQluZXcgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKAogCQkJCWlkZW50aWZpZXJOYW1lLAogCQkJCW5hbWVQb3NpdGlvbnMsCiAJCQkJdHlwZSwKLQkJCQlpbnRTdGFja1tpbnRQdHIgKyAxXSAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7IC8vIG1vZGlmaWVycworCQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHIgKyAxXSAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7IC8vIG1vZGlmaWVycwogCQkvLyBjb25zdW1lIGFubm90YXRpb25zCiAJCWludCBsZW5ndGg7CiAJCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CkBAIC0yMjY0LDE3ICsyNjMyLDQ2IEBACiAJCWFyZy5pc0NhdGNoQXJndW1lbnQgPSB0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CRVRXRUVOX0NBVENIX0FORF9SSUdIVF9QQVJFTjsKIAkJcHVzaE9uQXN0U3RhY2soYXJnKTsKIAotCQlhc3Npc3ROb2RlID0gYXJnOworCQl0aGlzLmFzc2lzdE5vZGUgPSBhcmc7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSAoaW50KSBuYW1lUG9zaXRpb25zOwotCQlpc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAogCQkvKiBpZiBpbmNvbXBsZXRlIG1ldGhvZCBoZWFkZXIsIGxpc3RMZW5ndGggY291bnRlciB3aWxsIG5vdCBoYXZlIGJlZW4gcmVzZXQsCiAJCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3RhY2sgKi8KLQkJbGlzdExlbmd0aCsrOworCQl0aGlzLmxpc3RMZW5ndGgrKzsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lR2VuZXJpY1R5cGVXaXRoRGlhbW9uZCgpIHsKKwlzdXBlci5jb25zdW1lR2VuZXJpY1R5cGVXaXRoRGlhbW9uZCgpOworCS8vIHdlIG5lZWQgdG8gcG9wIHRoZSA8PiBvZiB0aGUgZGlhbW9uZCBmcm9tIHRoZSBzdGFjay4KKwkvLyBUaGlzIGlzIG5vdCByZXF1aXJlZCBpbiB1c3VhbCBjYXNlIHdoZW4gdGhlIHR5cGUgYXJndW1lbnQgaXNuJ3QgZWxpZGVkCisJLy8gc2luY2UgdGhlIDwgYW5kID4gZ2V0IHBvcHBlZCB3aGlsZSBwYXJzaW5nIHRoZSB0eXBlIGFyZ3VtZW50LiAKKwlwb3BFbGVtZW50KEtfQklOQVJZX09QRVJBVE9SKTsgLy8gcG9wID4KKwlwb3BFbGVtZW50KEtfQklOQVJZX09QRVJBVE9SKTsgLy8gcG9wIDwKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudEZvcigpOworCisJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUikgeworCQlwb3BFbGVtZW50KEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7CisKKwlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSKSB7CisJCXBvcEVsZW1lbnQoS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7CisKKwlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSKSB7CisJCXBvcEVsZW1lbnQoS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbigpIHsKLQlpbnQgZW5kID0gaW50U3RhY2tbaW50UHRyLS1dOworCWludCBlbmQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCWJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkID0odG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfUEFSQU1FVEVSSVpFRF9DQVNUKTsKIAlpZihpc1BhcmFtZXRlcml6ZWQpIHsKIAkJcG9wRWxlbWVudChLX1BBUkFNRVRFUklaRURfQ0FTVCk7CkBAIC0yMjg4LDEyICsyNjg1LDEyIEBACiAJCQlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOwogCQl9CiAJfQotCUV4cHJlc3Npb24gY2FzdFR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSk7CisJRXhwcmVzc2lvbiBjYXN0VHlwZSA9IGdldFR5cGVSZWZlcmVuY2UodGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CiAJaWYoaXNQYXJhbWV0ZXJpemVkKSB7Ci0JCWludFB0ci0tOworCQl0aGlzLmludFB0ci0tOwogCX0KIAljYXN0VHlwZS5zb3VyY2VFbmQgPSBlbmQgLSAxOwotCWNhc3RUeXBlLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dICsgMTsKKwljYXN0VHlwZS5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0gKyAxOwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhjYXN0VHlwZSk7CiAKIAlwdXNoT25FbGVtZW50U3RhY2soS19DQVNUX1NUQVRFTUVOVCk7CkBAIC0yMzEyLDcgKzI3MDksNyBAQAogCQkJaWYgKHRoaXMucmVjb3JkKSB7CiAJCQkJRXhwcmVzc2lvbiB0eXBlUmVmZXJlbmNlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKIAkJCQlpZiAoIWlzQWxyZWFkeVBvdGVudGlhbE5hbWUodHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCkpIHsKLQkJCQkJdGhpcy5hZGRQb3RlbnRpYWxOYW1lKG51bGwsIHR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQsIHR5cGVSZWZlcmVuY2Uuc291cmNlRW5kKTsKKwkJCQkJYWRkUG90ZW50aWFsTmFtZShudWxsLCB0eXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZCk7CiAJCQkJfQogCQkJfQogCQl9IGZpbmFsbHkgewpAQCAtMjM0MSwyMyArMjczOCwyOCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKCkgewogCXN1cGVyLmNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbigpOwogCXBvcEVsZW1lbnQoS19CSU5BUllfT1BFUkFUT1IpOworCS8vIHRvIGhhbmRsZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxNTM0CisJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fSUZfQU5EX1JJR0hUX1BBUkVOKSB7CisJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fSU5TVEFOQ0VPRl9BTkRfUlBBUkVOLCBJRiwgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CisJfQogCi0JSW5zdGFuY2VPZkV4cHJlc3Npb24gZXhwID0gKEluc3RhbmNlT2ZFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC50eXBlID09IGFzc2lzdE5vZGUpIHsKLQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwlJbnN0YW5jZU9mRXhwcmVzc2lvbiBleHAgPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYodGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYgZXhwLnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb25XaXRoTmFtZSgpIHsKIAlzdXBlci5jb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb25XaXRoTmFtZSgpOwogCXBvcEVsZW1lbnQoS19CSU5BUllfT1BFUkFUT1IpOwogCi0JSW5zdGFuY2VPZkV4cHJlc3Npb24gZXhwID0gKEluc3RhbmNlT2ZFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC50eXBlID09IGFzc2lzdE5vZGUpIHsKLQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwlJbnN0YW5jZU9mRXhwcmVzc2lvbiBleHAgPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYodGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYgZXhwLnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlSGVhZGVyTmFtZTEoKSB7CiAJc3VwZXIuY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUxKCk7CisJdGhpcy5oYXNVbnVzZWRNb2RpZmllcnMgPSBmYWxzZTsKIAlpZiAodGhpcy5wZW5kaW5nQW5ub3RhdGlvbiAhPSBudWxsKSB7CiAJCXRoaXMucGVuZGluZ0Fubm90YXRpb24ucG90ZW50aWFsQW5ub3RhdGVkTm9kZSA9IHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uID0gbnVsbDsKQEAgLTI0MDUsMzUgKzI4MDcsNDEgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKGJvb2xlYW4gaXNBbm5vdGF0aW9uTWV0aG9kKSB7CiAJaWYodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgewotCQlpZGVudGlmaWVyUHRyLS07Ci0JCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJdGhpcy5pZGVudGlmaWVyUHRyLS07CisJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCQlpZih0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgIT0gMCB8fAogCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSAhPSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHJdKSB7Ci0JCQlpZGVudGlmaWVyUHRyKys7Ci0JCQlpZGVudGlmaWVyTGVuZ3RoUHRyKys7CisJCQl0aGlzLmlkZW50aWZpZXJQdHIrKzsKKwkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0cisrOworCQkJbG9uZyBzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwkJCWludCBzZWxlY3RvclNvdXJjZUVuZCA9IChpbnQpIHNlbGVjdG9yU291cmNlUG9zaXRpb25zOworCQkJaW50IGN1cnJlbnRBc3RQdHIgPSB0aGlzLmFzdFB0cjsKIAkJCXN1cGVyLmNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKGlzQW5ub3RhdGlvbk1ldGhvZCk7CisJCQlpZiAodGhpcy5zb3VyY2VFbmRzICE9IG51bGwgJiYgdGhpcy5hc3RQdHIgPiBjdXJyZW50QXN0UHRyKSB7IC8vIGlmIGFzdCBub2RlIHdhcyBwdXNoZWQgb24gdGhlIGFzdCBzdGFjaworCQkJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHNlbGVjdG9yU291cmNlRW5kKTsKKwkJCX0KIAkJCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsKIAkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uID0gbnVsbDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAKIAkJCS8vIHJlY292ZXJ5Ci0JCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewogCQkJCS8vbmFtZQotCQkJCWNoYXJbXSBzZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyICsgMV07Ci0JCQkJbG9uZyBzZWxlY3RvclNvdXJjZSA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyAxXTsKKwkJCQljaGFyW10gc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyAxXTsKKwkJCQlsb25nIHNlbGVjdG9yU291cmNlID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyAxXTsKIAogCQkJCS8vdHlwZQotCQkJCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dKTsKKwkJCQlUeXBlUmVmZXJlbmNlIHR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOwogCQkJCSgoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSl0eXBlKS5pc0NvbXBsZXRpb25Ob2RlID0gZmFsc2U7CiAJCQkJLy9tb2RpZmllcnMKLQkJCQlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJCQlpbnQgbW9kID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCQlpbnQgbW9kID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAotCQkJCWlmKFV0aWwuZ2V0TGluZU51bWJlcih0eXBlLnNvdXJjZVN0YXJ0LCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpIAotCQkJCQkJIT0gVXRpbC5nZXRMaW5lTnVtYmVyKChpbnQpIChzZWxlY3RvclNvdXJjZSA+Pj4gMzIpLCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpKSB7CisJCQkJaWYoVXRpbC5nZXRMaW5lTnVtYmVyKHR5cGUuc291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCisJCQkJCQkhPSBVdGlsLmdldExpbmVOdW1iZXIoKGludCkgKHNlbGVjdG9yU291cmNlID4+PiAzMiksIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpKSB7CiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gY29tcGxldGlvbkZpZWxkRGVjbCA9IG5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUodHlwZSwgZmFsc2UpOwogCQkJCQkvLyBjb25zdW1lIGFubm90YXRpb25zCiAJCQkJCWludCBsZW5ndGg7CkBAIC0yNDQ2LDEwICsyODU0LDEwIEBACiAJCQkJCQkJbGVuZ3RoKTsKIAkJCQkJfQogCQkJCQljb21wbGV0aW9uRmllbGREZWNsLm1vZGlmaWVycyA9IG1vZDsKLQkJCQkJYXNzaXN0Tm9kZSA9IGNvbXBsZXRpb25GaWVsZERlY2w7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gdHlwZS5zb3VyY2VFbmQgKyAxOwotCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChjb21wbGV0aW9uRmllbGREZWNsLCAwKTsKLQkJCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQkJCQl0aGlzLmFzc2lzdE5vZGUgPSBjb21wbGV0aW9uRmllbGREZWNsOworCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdHlwZS5zb3VyY2VFbmQgKyAxOworCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoY29tcGxldGlvbkZpZWxkRGVjbCwgMCk7CisJCQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQkJCX0gZWxzZSB7CiAJCQkJCUNvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUgbWQgPSBuZXcgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSh0eXBlLCB0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CiAJCQkJCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKQEAgLTI0NjUsMTIgKzI4NzMsMTIgQEAKIAkJCQkJbWQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKIAkJCQkJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CiAJCQkJCW1kLm1vZGlmaWVycyA9IG1vZDsKLQkJCQkJbWQuYm9keVN0YXJ0ID0gbFBhcmVuUG9zKzE7Ci0JCQkJCWxpc3RMZW5ndGggPSAwOyAvLyBpbml0aWFsaXplIGxpc3RMZW5ndGggYmVmb3JlIHJlYWRpbmcgcGFyYW1ldGVycy90aHJvd3MKLQkJCQkJYXNzaXN0Tm9kZSA9IG1kOworCQkJCQltZC5ib2R5U3RhcnQgPSB0aGlzLmxQYXJlblBvcysxOworCQkJCQl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyBpbml0aWFsaXplIGxpc3RMZW5ndGggYmVmb3JlIHJlYWRpbmcgcGFyYW1ldGVycy90aHJvd3MKKwkJCQkJdGhpcy5hc3Npc3ROb2RlID0gbWQ7CiAJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKG1kLCAwKTsKLQkJCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQobWQsIDApOworCQkJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJCQkJLy8gamF2YWRvYwogCQkJCQltZC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwogCQkJCQl0aGlzLmphdmFkb2MgPSBudWxsOwpAQCAtMjQ4MiwxNCArMjg5MCwxNCBAQAogCQlDb21wbGV0aW9uT25NZXRob2ROYW1lIG1kID0gbmV3IENvbXBsZXRpb25Pbk1ldGhvZE5hbWUodGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOwogCiAJCS8vbmFtZQotCQltZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQkJbG9uZyBzZWxlY3RvclNvdXJjZSA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07Ci0JCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJbWQuc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCQlsb25nIHNlbGVjdG9yU291cmNlID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCQkvL3R5cGUKLQkJbWQucmV0dXJuVHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dKTsKKwkJbWQucmV0dXJuVHlwZSA9IGdldFR5cGVSZWZlcmVuY2UodGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CiAJCS8vbW9kaWZpZXJzCi0JCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JCW1kLm1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCW1kLm1vZGlmaWVycyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAkJaW50IGxlbmd0aDsKIAkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKQEAgLTI1MDgsMzAgKzI5MTYsMzYgQEAKIAkJbWQuc291cmNlU3RhcnQgPSAoaW50KSAoc2VsZWN0b3JTb3VyY2UgPj4+IDMyKTsKIAkJbWQuc2VsZWN0b3JFbmQgPSAoaW50KSBzZWxlY3RvclNvdXJjZTsKIAkJcHVzaE9uQXN0U3RhY2sobWQpOwotCQltZC5zb3VyY2VFbmQgPSBsUGFyZW5Qb3M7Ci0JCW1kLmJvZHlTdGFydCA9IGxQYXJlblBvcysxOwotCQlsaXN0TGVuZ3RoID0gMDsgLy8gaW5pdGlhbGl6ZSBsaXN0TGVuZ3RoIGJlZm9yZSByZWFkaW5nIHBhcmFtZXRlcnMvdGhyb3dzCisJCW1kLnNvdXJjZUVuZCA9IHRoaXMubFBhcmVuUG9zOworCQltZC5ib2R5U3RhcnQgPSB0aGlzLmxQYXJlblBvcysxOworCQl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyBpbml0aWFsaXplIGxpc3RMZW5ndGggYmVmb3JlIHJlYWRpbmcgcGFyYW1ldGVycy90aHJvd3MKIAogCQl0aGlzLmFzc2lzdE5vZGUgPSBtZDsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1kLnNvdXJjZUVuZDsKIAkJLy8gcmVjb3ZlcnkKLQkJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZQorCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZQogCQkJCS8vfHwgbWQubW9kaWZpZXJzICE9IDAKLQkJCQl8fCAoVXRpbC5nZXRMaW5lTnVtYmVyKG1kLnJldHVyblR5cGUuc291cmNlU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikKLQkJCQkJCT09IFV0aWwuZ2V0TGluZU51bWJlcihtZC5zb3VyY2VTdGFydCwgc2Nhbm5lci5saW5lRW5kcywgMCwgc2Nhbm5lci5saW5lUHRyKSkpewotCQkJCWxhc3RDaGVja1BvaW50ID0gbWQuYm9keVN0YXJ0OwotCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKG1kLCAwKTsKLQkJCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCQkJfHwgKFV0aWwuZ2V0TGluZU51bWJlcihtZC5yZXR1cm5UeXBlLnNvdXJjZVN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKQorCQkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKG1kLnNvdXJjZVN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKSkpeworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKG1kLCAwKTsKKwkJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJCX0gZWxzZSB7Ci0JCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5zb3VyY2VTdGFydDsKLQkJCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZC5zb3VyY2VTdGFydDsKKwkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCQl9CiAJCX0KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycyggYm9vbGVhbiBpc0Fubm90YXRpb25NZXRob2QpIHsKKwlsb25nIHNlbGVjdG9yU291cmNlUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCWludCBzZWxlY3RvclNvdXJjZUVuZCA9IChpbnQpIHNlbGVjdG9yU291cmNlUG9zaXRpb25zOworCWludCBjdXJyZW50QXN0UHRyID0gdGhpcy5hc3RQdHI7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoaXNBbm5vdGF0aW9uTWV0aG9kKTsKKwlpZiAodGhpcy5zb3VyY2VFbmRzICE9IG51bGwgJiYgdGhpcy5hc3RQdHIgPiBjdXJyZW50QXN0UHRyKSB7Ly8gaWYgYXN0IG5vZGUgd2FzIHB1c2hlZCBvbiB0aGUgYXN0IHN0YWNrCisJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHNlbGVjdG9yU291cmNlRW5kKTsKKwl9CiAJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewogCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CkBAIC0yNTQwLDI1ICsyOTU0LDI1IEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyUmlnaHRQYXJlbigpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyUmlnaHRQYXJlbigpOwogCi0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwKLQkJJiYgY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIKLQkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbisxID49IHNjYW5uZXIuc3RhcnRQb3NpdGlvbgotCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwKKwkJJiYgdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24KKwkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pewogCQl0aGlzLnB1c2hJZGVudGlmaWVyKCk7CiAKIAkJaW50IGluZGV4ID0gLTE7CiAJCS8qIGNoZWNrIGlmIGN1cnJlbnQgYXdhaXRpbmcgaWRlbnRpZmllciBpcyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyICovCiAJCWlmICgoaW5kZXggPSB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpID4gLTEpIHsKIAkJCWludCBwdHIgPSB0aGlzLmlkZW50aWZpZXJQdHIgLSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdICsgaW5kZXggKyAxOwotCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKLQkJCQlSZWNvdmVyZWRNZXRob2QgcmVjb3ZlcmVkTWV0aG9kID0gKFJlY292ZXJlZE1ldGhvZCljdXJyZW50RWxlbWVudDsKKwkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKKwkJCQlSZWNvdmVyZWRNZXRob2QgcmVjb3ZlcmVkTWV0aG9kID0gKFJlY292ZXJlZE1ldGhvZCl0aGlzLmN1cnJlbnRFbGVtZW50OwogCQkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KIAkJCQlpZiAoIXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSkgewogCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IHJlY292ZXJlZE1ldGhvZC5tZXRob2REZWNsYXJhdGlvbjsKIAkJCQkJaWYobWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgewogCQkJCQkJQ29tcGxldGlvbk9uS2V5d29yZDEgY29tcGxldGlvbk9uS2V5d29yZCA9IG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMSgKLQkJCQkJCQlpZGVudGlmaWVyU3RhY2tbcHRyXSwKLQkJCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHJdLAorCQkJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3B0cl0sCisJCQkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHJdLAogCQkJCQkJCUtleXdvcmRzLlRIUk9XUyk7CiAJCQkJCQltZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW117Y29tcGxldGlvbk9uS2V5d29yZH07CiAJCQkJCQlyZWNvdmVyZWRNZXRob2QuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwpAQCAtMjU3MywyNCArMjk4NywyNCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zKCk7CiAKLQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbAotCQkmJiBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcgotCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gc2Nhbm5lci5zdGFydFBvc2l0aW9uCi0JCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbAorCQkmJiB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCisJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CiAJCXRoaXMucHVzaElkZW50aWZpZXIoKTsKIAogCQlpbnQgaW5kZXggPSAtMTsKIAkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KIAkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgewogCQkJaW50IHB0ciA9IHRoaXMuaWRlbnRpZmllclB0ciAtIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gKyBpbmRleCArIDE7Ci0JCQlSZWNvdmVyZWRNZXRob2QgcmVjb3ZlcmVkTWV0aG9kID0gKFJlY292ZXJlZE1ldGhvZCljdXJyZW50RWxlbWVudDsKKwkJCVJlY292ZXJlZE1ldGhvZCByZWNvdmVyZWRNZXRob2QgPSAoUmVjb3ZlcmVkTWV0aG9kKXRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCiAJCQlpZiAoIXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSkgewogCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gcmVjb3ZlcmVkTWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uOwogCQkJCWlmKG1ldGhvZC50aHJvd25FeGNlcHRpb25zID09IG51bGwpIHsKIAkJCQkJQ29tcGxldGlvbk9uS2V5d29yZDEgY29tcGxldGlvbk9uS2V5d29yZCA9IG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMSgKLQkJCQkJCWlkZW50aWZpZXJTdGFja1twdHJdLAotCQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyXSwKKwkJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3B0cl0sCisJCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cl0sCiAJCQkJCQlLZXl3b3Jkcy5USFJPV1MpOwogCQkJCQltZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW117Y29tcGxldGlvbk9uS2V5d29yZH07CiAJCQkJCXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CkBAIC0yNjAxLDYgKzMwMTUsMzEgQEAKIAkJfQogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBbm5vdGF0aW9uQXNNb2RpZmllcigpIHsKKwlzdXBlci5jb25zdW1lQW5ub3RhdGlvbkFzTW9kaWZpZXIoKTsKKworCWlmIChpc0luc2lkZU1ldGhvZCgpKSB7CisJCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gdHJ1ZTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQWRkaXRpb25hbEJvdW5kKCkgeworCXN1cGVyLmNvbnN1bWVBZGRpdGlvbmFsQm91bmQoKTsKKwlBU1ROb2RlIG5vZGUgPSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCSgoQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgbm9kZSkuc2V0S2luZChDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLktfSU5URVJGQUNFKTsKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCSgoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgbm9kZSkuc2V0S2luZChDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLktfSU5URVJGQUNFKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQWRkaXRpb25hbEJvdW5kMSgpIHsKKwlzdXBlci5jb25zdW1lQWRkaXRpb25hbEJvdW5kMSgpOworCUFTVE5vZGUgbm9kZSA9IHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwlpZiAobm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJKChDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKSBub2RlKS5zZXRLaW5kKENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuS19JTlRFUkZBQ0UpOworCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJKChDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBub2RlKS5zZXRLaW5kKENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuS19JTlRFUkZBQ0UpOworCX0KK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVBbm5vdGF0aW9uTmFtZSgpIHsKIAlpbnQgaW5kZXg7CiAKQEAgLTI2MTgsMTIgKzMwNTcsMTIgQEAKIAkJc2hvdWxkIGluY2x1ZGUgdGhlIGVudGlyZSByZXBsYWNlZCBzb3VyY2UuICovCiAKIAljaGFyW11bXSBzdWJzZXQgPSBpZGVudGlmaWVyU3ViU2V0KGluZGV4KTsKLQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKIAlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywKLQkJaWRlbnRpZmllclB0ciArIDEsCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCiAJCXBvc2l0aW9ucywKIAkJMCwKIAkJbGVuZ3RoKTsKQEAgLTI2MzIsMTIgKzMwNzEsMTIgQEAKIAogCWlmIChpbmRleCA9PSAwKSB7CiAJCS8qIGFzc2lzdCBpbnNpZGUgZmlyc3QgaWRlbnRpZmllciAqLwotCQl0eXBlUmVmZXJlbmNlID0gdGhpcy5jcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAorCQl0eXBlUmVmZXJlbmNlID0gY3JlYXRlU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSgKIAkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwKIAkJCQkJCXBvc2l0aW9uc1swXSk7CiAJfSBlbHNlIHsKIAkJLyogYXNzaXN0IGluc2lkZSBzdWJzZXF1ZW50IGlkZW50aWZpZXIgKi8KLQkJdHlwZVJlZmVyZW5jZSA9CXRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKKwkJdHlwZVJlZmVyZW5jZSA9CWNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoCiAJCQkJCQlzdWJzZXQsCiAJCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksCiAJCQkJCQlwb3NpdGlvbnMpOwpAQCAtMjY0OCwxNSArMzA4NywyNCBAQAogCW1hcmtlckFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBtYXJrZXJBbm5vdGF0aW9uLnNvdXJjZUVuZDsKIAlwdXNoT25FeHByZXNzaW9uU3RhY2sobWFya2VyQW5ub3RhdGlvbik7CiAKLQlhc3Npc3ROb2RlID0gbWFya2VyQW5ub3RhdGlvbjsKKwl0aGlzLmFzc2lzdE5vZGUgPSBtYXJrZXJBbm5vdGF0aW9uOwogCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWFya2VyQW5ub3RhdGlvbi5zb3VyY2VFbmQgKyAxOwotCQorCiAJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOLCBMUEFSRU5fTk9UX0NPTlNVTUVEIHwgQU5OT1RBVElPTl9OQU1FX0NPTVBMRVRJT04pOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lKCkgewogCXN1cGVyLmNvbnN1bWVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyTmFtZSgpOworCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gZmFsc2U7CisJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgeworCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworCXN1cGVyLmNvbnN1bWVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycygpOworCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gZmFsc2U7CiAJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewogCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uLnBvdGVudGlhbEFubm90YXRlZE5vZGUgPSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7CkBAIC0yNjY0LDE2ICszMTEyLDE2IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTGFiZWwoKSB7CiAJc3VwZXIuY29uc3VtZUxhYmVsKCk7Ci0JdGhpcy5wdXNoT25MYWJlbFN0YWNrKHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pOworCXB1c2hPbkxhYmVsU3RhY2sodGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSk7CiAJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soS19MQUJFTCwgdGhpcy5sYWJlbFB0cik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWFya2VyQW5ub3RhdGlvbigpIHsKIAlpZiAodGhpcy50b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOICYmCiAJCQkodGhpcy50b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgJiBBTk5PVEFUSU9OX05BTUVfQ09NUExFVElPTikgIT0gMCApIHsKLQkJdGhpcy5wb3BFbGVtZW50KEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTik7CisJCXBvcEVsZW1lbnQoS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOKTsKIAkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCXRoaXMucG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOworCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTik7CiAJCXN1cGVyLmNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCk7CiAJfQogfQpAQCAtMjY5OCw3ICszMTQ2LDcgQEAKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAogCUNvbXBsZXRpb25Pbk1lbWJlclZhbHVlTmFtZSBtZW1iZXJWYWx1ZU5hbWUgPSBuZXcgQ29tcGxldGlvbk9uTWVtYmVyVmFsdWVOYW1lKHNpbXBsZU5hbWUsc3RhcnQsIGVuZCk7Ci0JdGhpcy5wdXNoT25Bc3RTdGFjayhtZW1iZXJWYWx1ZU5hbWUpOworCXB1c2hPbkFzdFN0YWNrKG1lbWJlclZhbHVlTmFtZSk7CiAJdGhpcy5hc3Npc3ROb2RlID0gbWVtYmVyVmFsdWVOYW1lOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kICsgMTsKIAl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwpAQCAtMjcyMywxMSArMzE3MSwxNyBAQAogCXN1cGVyLmNvbnN1bWVNZXRob2RIZWFkZXIoKTsKIAlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIpOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGJvb2xlYW4gaXNOb3RBYnN0cmFjdCkgeworCWlmICghaXNOb3RBYnN0cmFjdCkgeworCQlwb3BFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwl9CisJc3VwZXIuY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGlzTm90QWJzdHJhY3QpOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1vZGlmaWVycygpIHsKIAlzdXBlci5jb25zdW1lTW9kaWZpZXJzKCk7CiAJLy8gc2F2ZSBmcm9tIHN0YWNrIHZhbHVlcwotCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gaW50U3RhY2tbaW50UHRyXTsKLQl0aGlzLmxhc3RNb2RpZmllcnMgPSAJaW50U3RhY2tbaW50UHRyLTFdOworCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0cl07CisJdGhpcy5sYXN0TW9kaWZpZXJzID0gCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItMV07CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVmZXJlbmNlVHlwZSgpIHsKIAlpZiAodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA+IDEpIHsgLy8gcmVkdWNpbmcgYSBxdWFsaWZpZWQgbmFtZQpAQCAtMjc0NiwxMCArMzIwMCwxMCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSB7CiAJaWYgKHRoaXMudG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTiAmJgogCQkJKHRoaXMudG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpICYgQU5OT1RBVElPTl9OQU1FX0NPTVBMRVRJT04pICE9IDAgKSB7Ci0JCXRoaXMucG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOworCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTik7CiAJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAl9IGVsc2UgewotCQl0aGlzLnBvcEVsZW1lbnQoS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOKTsKKwkJcG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOwogCQlzdXBlci5jb25zdW1lU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwogCX0KIH0KQEAgLTI3NjYsMTMgKzMyMjAsMTMgQEAKIAlpZiAodGhpcy5yZWNvcmQpIHsKIAkJQVNUTm9kZSBicmVha1N0YXRlbWVudCA9IHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCQlpZiAoIWlzQWxyZWFkeVBvdGVudGlhbE5hbWUoYnJlYWtTdGF0ZW1lbnQuc291cmNlU3RhcnQpKSB7Ci0JCQl0aGlzLmFkZFBvdGVudGlhbE5hbWUobnVsbCwgYnJlYWtTdGF0ZW1lbnQuc291cmNlU3RhcnQsIGJyZWFrU3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCQlhZGRQb3RlbnRpYWxOYW1lKG51bGwsIGJyZWFrU3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBicmVha1N0YXRlbWVudC5zb3VyY2VFbmQpOwogCQl9CiAJfQotCQorCiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSB7Ci0JdGhpcy5wb3BFbGVtZW50KEtfTEFCRUwpOworCXBvcEVsZW1lbnQoS19MQUJFTCk7CiAJc3VwZXIuY29uc3VtZVN0YXRlbWVudExhYmVsKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50U3dpdGNoKCkgewpAQCAtMjc4Miw2ICszMjM2LDEyIEBACiAJCXBvcEVsZW1lbnQoS19CTE9DS19ERUxJTUlURVIpOwogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGVtZW50V2hpbGUoKTsKKwlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSKSB7CisJCXBvcEVsZW1lbnQoS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpOworCX0KK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKIAlzdXBlci5jb25zdW1lU3RhdGljSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKTsKIAl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uID0gbnVsbDsgLy8gdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gbmV4dCBub2RlcwpAQCAtMjc5NywxMCArMzI1NywxMCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU5vcm1hbEFubm90YXRpb24oKSB7CiAJaWYgKHRoaXMudG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTiAmJgogCQkJKHRoaXMudG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpICYgQU5OT1RBVElPTl9OQU1FX0NPTVBMRVRJT04pICE9IDAgKSB7Ci0JCXRoaXMucG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOworCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTik7CiAJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAl9IGVsc2UgewotCQl0aGlzLnBvcEVsZW1lbnQoS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOKTsKKwkJcG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOwogCQlzdXBlci5jb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpOwogCX0KIH0KQEAgLTI4NDgsMTQgKzMzMDgsMTQgQEAKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVG9rZW4oaW50IHRva2VuKSB7Ci0JaWYoaXNGaXJzdCkgeworCWlmKHRoaXMuaXNGaXJzdCkgewogCQlzdXBlci5jb25zdW1lVG9rZW4odG9rZW4pOwogCQlyZXR1cm47CiAJfQotCWlmKGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9PSBORVhUVE9LRU4pIHsKLQkJY2FuQmVFeHBsaWNpdENvbnN0cnVjdG9yID0gWUVTOworCWlmKHRoaXMuY2FuQmVFeHBsaWNpdENvbnN0cnVjdG9yID09IE5FWFRUT0tFTikgeworCQl0aGlzLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9IFlFUzsKIAl9IGVsc2UgewotCQljYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSBOTzsKKwkJdGhpcy5jYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSBOTzsKIAl9CiAKIAlpbnQgcHJldmlvdXMgPSB0aGlzLnByZXZpb3VzVG9rZW47CkBAIC0yOTEwLDggKzMzNzAsOCBAQAogCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCiAJCQkmJiB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdID09IGFzc2lzdElkZW50aWZpZXIoKQogCQkJJiYgdGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsCi0JCQkmJiB0aGlzLmlzSW5kaXJlY3RseUluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkgewotCQl0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPSBjdXJzb3JMb2NhdGlvbiA8IEludGVnZXIuTUFYX1ZBTFVFID8gY3Vyc29yTG9jYXRpb24rMSA6IGN1cnNvckxvY2F0aW9uOworCQkJJiYgaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpKSB7CisJCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY3Vyc29yTG9jYXRpb24gPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IHRoaXMuY3Vyc29yTG9jYXRpb24rMSA6IHRoaXMuY3Vyc29yTG9jYXRpb247CiAJfQogCiAJLy8gaWYgaW4gYSBtZXRob2Qgb3IgaWYgaW4gYSBmaWVsZCBpbml0aWFsaXplcgpAQCAtMjkxOSwxNSArMzM3OSwxNSBAQAogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCQljYXNlIFRva2VuTmFtZURPVDoKIAkJCQlzd2l0Y2ggKHByZXZpb3VzKSB7Ci0JCQkJCWNhc2UgVG9rZW5OYW1ldGhpczogLy8gZWcuIHRoaXNbLl1mcmVkKCkKKwkJCQkJY2FzZSBUb2tlbk5hbWV0aGlzOiAvLyBlLmcuIHRoaXNbLl1mcmVkKCkKIAkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBFWFBMSUNJVF9SRUNFSVZFUjsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFRva2VuTmFtZXN1cGVyOiAvLyBlZy4gc3VwZXJbLl1mcmVkKCkKKwkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZS5nLiBzdXBlclsuXWZyZWQoKQogCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IFNVUEVSX1JFQ0VJVkVSOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjogLy8gZWcuIGJhclsuXWZyZWQoKQorCQkJCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXI6IC8vIGUuZy4gYmFyWy5dZnJlZCgpCiAJCQkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpICE9IEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCkgewotCQkJCQkJCWlmICh0aGlzLmlkZW50aWZpZXJQdHIgIT0gcHJldklkZW50aWZpZXJQdHIpIHsgLy8gaWYgaWRlbnRpZmllciBoYXMgYmVlbiBjb25zdW1lZCwgZWcuIHRoaXMueFsuXWZyZWQoKQorCQkJCQkJCWlmICh0aGlzLmlkZW50aWZpZXJQdHIgIT0gcHJldklkZW50aWZpZXJQdHIpIHsgLy8gaWYgaWRlbnRpZmllciBoYXMgYmVlbiBjb25zdW1lZCwgZS5nLiB0aGlzLnhbLl1mcmVkKCkKIAkJCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IEVYUExJQ0lUX1JFQ0VJVkVSOwogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBOQU1FX1JFQ0VJVkVSOwpAQCAtMjkzNywzNCArMzM5Nyw0NiBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjoKLQkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lRE9UKSB7IC8vIGVnLiBmb28oKS5bZnJlZF0oKQotCQkJCQlpZiAodGhpcy5pbnZvY2F0aW9uVHlwZSAhPSBTVVBFUl9SRUNFSVZFUiAvLyBlZy4gbm90IHN1cGVyLltmcmVkXSgpCi0JCQkJCQkmJiB0aGlzLmludm9jYXRpb25UeXBlICE9IE5BTUVfUkVDRUlWRVIgLy8gZWcuIG5vdCBiYXIuW2ZyZWRdKCkKLQkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gQUxMT0NBVElPTiAvLyBlZy4gbm90IG5ldyBmb28uW0Jhcl0oKQotCQkJCQkJJiYgdGhpcy5pbnZvY2F0aW9uVHlwZSAhPSBRVUFMSUZJRURfQUxMT0NBVElPTikgeyAvLyBlZy4gbm90IGZyZWQoKS5uZXcgZm9vLltCYXJdKCkKKwkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lRE9UKSB7IC8vIGUuZy4gZm9vKCkuW2ZyZWRdKCkKKwkJCQkJaWYgKHRoaXMuaW52b2NhdGlvblR5cGUgIT0gU1VQRVJfUkVDRUlWRVIgLy8gZS5nLiBub3Qgc3VwZXIuW2ZyZWRdKCkKKwkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gTkFNRV9SRUNFSVZFUiAvLyBlLmcuIG5vdCBiYXIuW2ZyZWRdKCkKKwkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gQUxMT0NBVElPTiAvLyBlLmcuIG5vdCBuZXcgZm9vLltCYXJdKCkKKwkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsgLy8gZS5nLiBub3QgZnJlZCgpLm5ldyBmb28uW0Jhcl0oKQogCiAJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gRVhQTElDSVRfUkVDRUlWRVI7CiAJCQkJCQl0aGlzLnF1YWxpZmllciA9IHRoaXMuZXhwcmVzc2lvblB0cjsKIAkJCQkJfQogCQkJCX0KKwkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lR1JFQVRFUikgeyAvLyBlLmcuIGZvbygpLjxYPltmcmVkXSgpCisJCQkJCWlmICh0aGlzLmludm9jYXRpb25UeXBlICE9IFNVUEVSX1JFQ0VJVkVSIC8vIGUuZy4gbm90IHN1cGVyLjxYPltmcmVkXSgpCisJCQkJCQkmJiB0aGlzLmludm9jYXRpb25UeXBlICE9IE5BTUVfUkVDRUlWRVIgLy8gZS5nLiBub3QgYmFyLjxYPltmcmVkXSgpCisJCQkJCQkmJiB0aGlzLmludm9jYXRpb25UeXBlICE9IEFMTE9DQVRJT04gLy8gZS5nLiBub3QgbmV3IGZvby48WD5bQmFyXSgpCisJCQkJCQkmJiB0aGlzLmludm9jYXRpb25UeXBlICE9IFFVQUxJRklFRF9BTExPQ0FUSU9OKSB7IC8vIGUuZy4gbm90IGZyZWQoKS5uZXcgZm9vLjxYPltCYXJdKCkKKworCQkJCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX1BBUkFNRVRFUklaRURfTUVUSE9EX0lOVk9DQVRJT04pIHsKKwkJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gRVhQTElDSVRfUkVDRUlWRVI7CisJCQkJCQkJdGhpcy5xdWFsaWZpZXIgPSB0aGlzLmV4cHJlc3Npb25QdHI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZW5ldzoKIAkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX05FV19BTkRfTEVGVF9CUkFDS0VUKTsKIAkJCQl0aGlzLnF1YWxpZmllciA9IHRoaXMuZXhwcmVzc2lvblB0cjsgLy8gTkI6IGV2ZW4gaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWNhdGlvbiwgc2V0IGl0IHRvIHRoZSBleHByZXNzaW9uIHB0ciBzbyB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBjb3JyZWN0bHkgY29tcHV0ZWQKLQkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lRE9UKSB7IC8vIGVnLiBmcmVkKCkuW25ld10gWCgpCisJCQkJaWYgKHByZXZpb3VzID09IFRva2VuTmFtZURPVCkgeyAvLyBlLmcuIGZyZWQoKS5bbmV3XSBYKCkKIAkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IFFVQUxJRklFRF9BTExPQ0FUSU9OOwotCQkJCX0gZWxzZSB7IC8vIGVnLiBbbmV3XSBYKCkKKwkJCQl9IGVsc2UgeyAvLyBlLmcuIFtuZXddIFgoKQogCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gQUxMT0NBVElPTjsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZXRoaXM6Ci0JCQkJaWYgKHByZXZpb3VzID09IFRva2VuTmFtZURPVCkgeyAvLyBlZy4gZnJlZCgpLlt0aGlzXSgpCisJCQkJaWYgKHByZXZpb3VzID09IFRva2VuTmFtZURPVCkgeyAvLyBlLmcuIGZyZWQoKS5bdGhpc10oKQogCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gUVVBTElGSUVEX0FMTE9DQVRJT047CiAJCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lc3VwZXI6Ci0JCQkJaWYgKHByZXZpb3VzID09IFRva2VuTmFtZURPVCkgeyAvLyBlZy4gZnJlZCgpLltzdXBlcl0oKQorCQkJCWlmIChwcmV2aW91cyA9PSBUb2tlbk5hbWVET1QpIHsgLy8gZS5nLiBmcmVkKCkuW3N1cGVyXSgpCiAJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBRVUFMSUZJRURfQUxMT0NBVElPTjsKIAkJCQkJdGhpcy5xdWFsaWZpZXIgPSB0aGlzLmV4cHJlc3Npb25QdHI7CiAJCQkJfQpAQCAtMjk3NywxMyArMzQ0OSwxMyBAQAogCQkJCQl0aGlzLnF1YWxpZmllciA9IHRoaXMuZXhwcmVzc2lvblB0cjsgLy8gcmVtZW5iZXIgdGhlIGxhc3QgZXhwcmVzc2lvbiBzbyB0aGF0IGFyZ3VtZW50cyBhcmUgY29ycmVjdGx5IGNvbXB1dGVkCiAJCQkJfQogCQkJCXN3aXRjaCAocHJldmlvdXMpIHsKLQkJCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyOiAvLyBlZy4gZnJlZFsoXSkgb3IgZm9vLmZyZWRbKF0pCisJCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjogLy8gZS5nLiBmcmVkWyhdKSBvciBmb28uZnJlZFsoXSkKIAkJCQkJCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19TRUxFQ1RPUikgewogCQkJCQkJCWludCBpbmZvID0gMDsKIAkJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwxKSA9PSBLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4gJiYKIAkJCQkJCQkJCShpbmZvPXRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLDEpICYgTFBBUkVOX05PVF9DT05TVU1FRCkgIT0gMCkgewotCQkJCQkJCQl0aGlzLnBvcEVsZW1lbnQoS19TRUxFQ1RPUik7Ci0JCQkJCQkJCXRoaXMucG9wRWxlbWVudChLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pOworCQkJCQkJCQlwb3BFbGVtZW50KEtfU0VMRUNUT1IpOworCQkJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTik7CiAJCQkJCQkJCWlmICgoaW5mbyAmIEFOTk9UQVRJT05fTkFNRV9DT01QTEVUSU9OKSAhPSAwKSB7CiAJCQkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4sIExQQVJFTl9DT05TVU1FRCB8IEFOTk9UQVRJT05fTkFNRV9DT01QTEVUSU9OKTsKIAkJCQkJCQkJfSBlbHNlIHsKQEAgLTI5OTcsNyArMzQ2OSw3IEBACiAJCQkJCQl0aGlzLnF1YWxpZmllciA9IC0xOwogCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IE5PX1JFQ0VJVkVSOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVG9rZW5OYW1ldGhpczogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHRoaXNbKF0xLCAyKQorCQkJCQljYXNlIFRva2VuTmFtZXRoaXM6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGUuZy4gdGhpc1soXTEsIDIpCiAJCQkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfU0VMRUNUT1IpIHsKIAkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSwgKHRoaXMuaW52b2NhdGlvblR5cGUgPT0gUVVBTElGSUVEX0FMTE9DQVRJT04pID8gUVVBTElGSUVEX0FMTE9DQVRJT04gOiBBTExPQ0FUSU9OKTsKIAkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SX1FVQUxJRklFUiwgdGhpcy5xdWFsaWZpZXIpOwpAQCAtMzAwNSw3ICszNDc3LDcgQEAKIAkJCQkJCXRoaXMucXVhbGlmaWVyID0gLTE7CiAJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHN1cGVyWyhdMSwgMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZS5nLiBzdXBlclsoXTEsIDIpCiAJCQkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfU0VMRUNUT1IpIHsKIAkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSwgKHRoaXMuaW52b2NhdGlvblR5cGUgPT0gUVVBTElGSUVEX0FMTE9DQVRJT04pID8gUVVBTElGSUVEX0FMTE9DQVRJT04gOiBBTExPQ0FUSU9OKTsKIAkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SX1FVQUxJRklFUiwgdGhpcy5xdWFsaWZpZXIpOwpAQCAtMzAxMywxMiArMzQ4NSwxMyBAQAogCQkJCQkJdGhpcy5xdWFsaWZpZXIgPSAtMTsKIAkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBOT19SRUNFSVZFUjsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiBGcmVkPFg+WyhdMSwgMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSOiAvLyBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCBlLmcuIEZyZWQ8WD5bKF0xLCAyKQogCQkJCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUOiAvLyBvciBmcmVkPFg8WD4+WyhdMSwgMikKIAkJCQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVDogLy9vciBGcmVkPFg8WDxYPj4+WyhdMSwgMikKIAkJCQkJCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19TRUxFQ1RPUikgeworCQkJCQkJCWludCBpbmZvOwogCQkJCQkJCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMSkgPT0gS19CSU5BUllfT1BFUkFUT1IgJiYKLQkJCQkJCQkJCXRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSBHUkVBVEVSKSB7CisJCQkJCQkJCQkoKGluZm8gPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMSkpID09IEdSRUFURVIgfHwgaW5mbyA9PSBSSUdIVF9TSElGVCB8fCBpbmZvID09IFVOU0lHTkVEX1JJR0hUX1NISUZUKSkgewogCQkJCQkJCQkvLyBpdCdzIG5vdCBhIHNlbGVjdG9yIGludm9jYXRpb24KIAkJCQkJCQkJcG9wRWxlbWVudChLX1NFTEVDVE9SKTsKIAkJCQkJCQl9IGVsc2UgewpAQCAtMzAzMiw1MCArMzUwNSw1MCBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lTEJSQUNFOgotCQkJCXRoaXMuYnJhY2tldERlcHRoKys7CiAJCQkJaW50IGtpbmQgPSB0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CiAJCQkJaWYoa2luZCA9PSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUgogCQkJCQl8fCBraW5kID09IEtfTE9DQUxfSU5JVElBTElaRVJfREVMSU1JVEVSCiAJCQkJCXx8IGtpbmQgPT0gS19BUlJBWV9DUkVBVElPTikgewotCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19BUlJBWV9JTklUSUFMSVpFUiwgZW5kUG9zaXRpb24pOworCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5lbmRQb3NpdGlvbik7CiAJCQkJfSBlbHNlIGlmIChraW5kID09IEtfQkVUV0VFTl9BTk5PVEFUSU9OX05BTUVfQU5EX1JQQVJFTikgewotCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19NRU1CRVJfVkFMVUVfQVJSQVlfSU5JVElBTElaRVIsIGVuZFBvc2l0aW9uKTsKKwkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfTUVNQkVSX1ZBTFVFX0FSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmVuZFBvc2l0aW9uKTsKIAkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2gocHJldmlvdXMpIHsKLQkJCQkJCWNhc2UgVG9rZW5OYW1lUlBBUkVOIDoKLQkJCQkJCQlzd2l0Y2gocHJldmlvdXNLaW5kKSB7Ci0JCQkJCQkJCWNhc2UgS19CRVRXRUVOX0lGX0FORF9SSUdIVF9QQVJFTiA6Ci0JCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIElGKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBDQVRDSCk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBLX0JFVFdFRU5fV0hJTEVfQU5EX1JJR0hUX1BBUkVOIDoKLQkJCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUiwgV0hJTEUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBTV0lUQ0gpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgS19CRVRXRUVOX0ZPUl9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBGT1IpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgS19CRVRXRUVOX1NZTkNIUk9OSVpFRF9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBTWU5DSFJPTklaRUQpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgVG9rZW5OYW1ldHJ5IDoKLQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIFRSWSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFRva2VuTmFtZWRvOgotCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUiwgRE8pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSKTsKLQkJCQkJCQlicmVhazsKKwkJCQkJaWYgKGtpbmQgPT0gS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpIHsKKwkJCQkJCWludCBpbmZvID0gdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpOworCQkJCQkJcG9wRWxlbWVudChLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUik7CisJCQkJCQlpZiAoaW5mbyA9PSBJRikgeworCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUiwgSUYsIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIGluZm8pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJc3dpdGNoKHByZXZpb3VzKSB7CisJCQkJCQkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOgorCQkJCQkJCQlzd2l0Y2godGhpcy5wcmV2aW91c0tpbmQpIHsKKwkJCQkJCQkJCWNhc2UgS19CRVRXRUVOX0NBVENIX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBDQVRDSCk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIEtfQkVUV0VFTl9TV0lUQ0hfQU5EX1JJR0hUX1BBUkVOIDoKKwkJCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIFNXSVRDSCk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIEtfQkVUV0VFTl9TWU5DSFJPTklaRURfQU5EX1JJR0hUX1BBUkVOIDoKKwkJCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIFNZTkNIUk9OSVpFRCk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQlkZWZhdWx0IDoKKwkJCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIpOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVG9rZW5OYW1ldHJ5IDoKKwkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBUUlkpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRva2VuTmFtZWRvOgorCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIERPKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMzA4Myw1MyArMzU1Niw2NSBAQAogCQkJCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSAhPSBLX0FSUkFZX0NSRUFUSU9OKSB7CiAJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fTEVGVF9BTkRfUklHSFRfQlJBQ0tFVCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYocHJldmlvdXMgPT0gVG9rZW5OYW1lSWRlbnRpZmllcikgewotCQkJCQkJaW52b2NhdGlvblR5cGUgPSBOT19SRUNFSVZFUjsKLQkJCQkJCXF1YWxpZmllciA9IC0xOworCQkJCQlzd2l0Y2ggKHByZXZpb3VzKSB7CisJCQkJCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXI6CisJCQkJCQljYXNlIFRva2VuTmFtZWJvb2xlYW46CisJCQkJCQljYXNlIFRva2VuTmFtZWJ5dGU6CisJCQkJCQljYXNlIFRva2VuTmFtZWNoYXI6CisJCQkJCQljYXNlIFRva2VuTmFtZWRvdWJsZToKKwkJCQkJCWNhc2UgVG9rZW5OYW1lZmxvYXQ6CisJCQkJCQljYXNlIFRva2VuTmFtZWludDoKKwkJCQkJCWNhc2UgVG9rZW5OYW1lbG9uZzoKKwkJCQkJCWNhc2UgVG9rZW5OYW1lc2hvcnQ6CisJCQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVI6CisJCQkJCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUOgorCQkJCQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVDoKKwkJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CisJCQkJCQkJdGhpcy5xdWFsaWZpZXIgPSAtMTsKKwkJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0KLQkJCQl0aGlzLmJyYWNrZXREZXB0aCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0U6Ci0JCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVG9rZW5OYW1lUkJSQUNLRVQ6Ci0JCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lUlBBUkVOOgogCQkJCXN3aXRjaCh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKIAkJCQkJY2FzZSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOIDoKIAkJCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX0NBVENIX0FORF9SSUdIVF9QQVJFTik7CiAJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0JFVFdFRU5fSU5TVEFOQ0VPRl9BTkRfUlBBUkVOIDoKKwkJCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX0lOU1RBTkNFT0ZfQU5EX1JQQVJFTik7CisJCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJCWNhc2UgS19CRVRXRUVOX0lGX0FORF9SSUdIVF9QQVJFTiA6Ci0JCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKIAkJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9JRl9BTkRfUklHSFRfUEFSRU4pOworCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUiwgSUYsIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgS19CRVRXRUVOX1dISUxFX0FORF9SSUdIVF9QQVJFTiA6Ci0JCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKIAkJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9XSElMRV9BTkRfUklHSFRfUEFSRU4pOworCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUiwgV0hJTEUpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgS19CRVRXRUVOX0ZPUl9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IGJyYWNrZXREZXB0aCkgeworCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IHRoaXMuYnJhY2tldERlcHRoKSB7CiAJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTik7CisJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSLCBGT1IpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU4gOgotCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IGJyYWNrZXREZXB0aCkgeworCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IHRoaXMuYnJhY2tldERlcHRoKSB7CiAJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fU1dJVENIX0FORF9SSUdIVF9QQVJFTik7CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBLX0JFVFdFRU5fU1lOQ0hST05JWkVEX0FORF9SSUdIVF9QQVJFTiA6Ci0JCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKIAkJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9TWU5DSFJPTklaRURfQU5EX1JJR0hUX1BBUkVOKTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1ldGhyb3c6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfSU5TSURFX1RIUk9XX1NUQVRFTUVOVCwgYnJhY2tldERlcHRoKTsKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfVEhST1dfU1RBVEVNRU5ULCB0aGlzLmJyYWNrZXREZXB0aCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTjoKIAkJCQlzd2l0Y2godG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpKSB7CkBAIC0zMTQ4LDYgKzM2MzMsMTIgQEAKIAkJCQkJCQlwb3BFbGVtZW50KEtfSU5TSURFX0FTU0VSVF9TVEFURU1FTlQpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgS19JTlNJREVfQVNTRVJUX0VYQ0VQVElPTiA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKKwkJCQkJCQlwb3BFbGVtZW50KEtfSU5TSURFX0FTU0VSVF9FWENFUFRJT04pOworCQkJCQkJCXBvcEVsZW1lbnQoS19JTlNJREVfQVNTRVJUX1NUQVRFTUVOVCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBLX0lOU0lERV9CUkVBS19TVEFURU1FTlQ6CiAJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKIAkJCQkJCQlwb3BFbGVtZW50KEtfSU5TSURFX0JSRUFLX1NUQVRFTUVOVCk7CkBAIC0zMTU4LDYgKzM2NDksMTggQEAKIAkJCQkJCQlwb3BFbGVtZW50KEtfSU5TSURFX0NPTlRJTlVFX1NUQVRFTUVOVCk7CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTjoKKwkJCQkJCWlmKHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSB0aGlzLmJyYWNrZXREZXB0aCAtIDEpIHsKKwkJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9GT1JfQU5EX1JJR0hUX1BBUkVOKTsKKwkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfRk9SX0NPTkRJVElPTkFMLCB0aGlzLmJyYWNrZXREZXB0aCAtIDEpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgS19JTlNJREVfRk9SX0NPTkRJVElPTkFMOgorCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IHRoaXMuYnJhY2tldERlcHRoIC0gMSkgeworCQkJCQkJCXBvcEVsZW1lbnQoS19JTlNJREVfRk9SX0NPTkRJVElPTkFMKTsKKwkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX0ZPUl9BTkRfUklHSFRfUEFSRU4sIHRoaXMuYnJhY2tldERlcHRoIC0gMSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZXJldHVybjoKQEAgLTMyMTQsNyArMzcxNyw5IEBACiAJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBYT1IpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVPUjoKLQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIE9SKTsKKwkJCQkvLyBEb24ndCBwdXNoIHRoZSBPUiBvcGVyYXRvciB1c2VkIGZvciB1bmlvbiB0eXBlcyBpbiBhIGNhdGNoIGRlY2xhcmF0aW9uCisJCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9QQVJTRVIpICE9IEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4pCisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgT1IpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVBTkRfQU5EOgogCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgQU5EX0FORCk7CkBAIC0zMjQ0LDM3ICszNzQ5LDQ5IEBACiAJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBJTlNUQU5DRU9GKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT046Ci0JCQkJaWYocHJldmlvdXMgIT0gVG9rZW5OYW1lTEVTUykgeworCQkJCWlmKHByZXZpb3VzICE9IFRva2VuTmFtZUxFU1MgJiYgcHJldmlvdXMgIT0gVG9rZW5OYW1lQ09NTUEpIHsKIAkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQ09ORElUSU9OQUxfT1BFUkFUT1IsIFFVRVNUSU9OKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZUNPTE9OOgotCQkJCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0NPTkRJVElPTkFMX09QRVJBVE9SCi0JCQkJCSYmIHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBRVUVTVElPTikgewotCQkJCQlwb3BFbGVtZW50KEtfQ09ORElUSU9OQUxfT1BFUkFUT1IpOwotCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19DT05ESVRJT05BTF9PUEVSQVRPUiwgQ09MT04pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04pIHsKKwkJCQlzd2l0Y2ggKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSkgeworCQkJCQljYXNlIEtfQ09ORElUSU9OQUxfT1BFUkFUT1I6CisJCQkJCQlpZiAodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IFFVRVNUSU9OKSB7CisJCQkJCQkJcG9wRWxlbWVudChLX0NPTkRJVElPTkFMX09QRVJBVE9SKTsKKwkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19DT05ESVRJT05BTF9PUEVSQVRPUiwgQ09MT04pOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OOgogCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04pOwotCQkJCQl9IGVsc2UgeworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgS19CRVRXRUVOX0RFRkFVTFRfQU5EX0NPTE9OOgogCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fREVGQVVMVF9BTkRfQ09MT04pOwotCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0lOU0lERV9BU1NFUlRfU1RBVEVNRU5UOgorCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfSU5TSURFX0FTU0VSVF9FWENFUFRJT04sIHRoaXMuYnJhY2tldERlcHRoKTsKKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1laWY6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9JRl9BTkRfUklHSFRfUEFSRU4sIGJyYWNrZXREZXB0aCk7CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9JRl9BTkRfUklHSFRfUEFSRU4sIHRoaXMuYnJhY2tldERlcHRoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lZWxzZToKKwkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSKSB7CisJCQkJCXBvcEVsZW1lbnQoS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpOworCQkJCX0KKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWV3aGlsZToKLQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX1dISUxFX0FORF9SSUdIVF9QQVJFTiwgYnJhY2tldERlcHRoKTsKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX1dISUxFX0FORF9SSUdIVF9QQVJFTiwgdGhpcy5icmFja2V0RGVwdGgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVmb3I6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9GT1JfQU5EX1JJR0hUX1BBUkVOLCBicmFja2V0RGVwdGgpOworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTiwgdGhpcy5icmFja2V0RGVwdGgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVzd2l0Y2g6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9TV0lUQ0hfQU5EX1JJR0hUX1BBUkVOLCBicmFja2V0RGVwdGgpOworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fU1dJVENIX0FORF9SSUdIVF9QQVJFTiwgdGhpcy5icmFja2V0RGVwdGgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVzeW5jaHJvbml6ZWQ6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9TWU5DSFJPTklaRURfQU5EX1JJR0hUX1BBUkVOLCBicmFja2V0RGVwdGgpOworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fU1lOQ0hST05JWkVEX0FORF9SSUdIVF9QQVJFTiwgdGhpcy5icmFja2V0RGVwdGgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVhc3NlcnQ6CiAJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfSU5TSURFX0FTU0VSVF9TVEFURU1FTlQsIHRoaXMuYnJhY2tldERlcHRoKTsKQEAgLTMyODksMTAgKzM4MDYsMTAgQEAKIAkJCQlwdXNoT25FbGVtZW50U3RhY2soS19FWFRFTkRTX0tFWVdPUkQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVicmVhazoKLQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfQlJFQUtfU1RBVEVNRU5ULCBicmFja2V0RGVwdGgpOworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0lOU0lERV9CUkVBS19TVEFURU1FTlQsIHRoaXMuYnJhY2tldERlcHRoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lY29udGludWU6Ci0JCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfSU5TSURFX0NPTlRJTlVFX1NUQVRFTUVOVCwgYnJhY2tldERlcHRoKTsKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfQ09OVElOVUVfU1RBVEVNRU5ULCB0aGlzLmJyYWNrZXREZXB0aCk7CiAJCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgaWYgKGlzSW5zaWRlQW5ub3RhdGlvbigpKXsKQEAgLTMzMDEsNyArMzgxOCw3IEBACiAJCQkJdGhpcy5icmFja2V0RGVwdGgrKzsKIAkJCQlpbnQga2luZCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKTsKIAkJCQlpZiAoa2luZCA9PSBLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pIHsKLQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfTUVNQkVSX1ZBTFVFX0FSUkFZX0lOSVRJQUxJWkVSLCBlbmRQb3NpdGlvbik7CisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX01FTUJFUl9WQUxVRV9BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5lbmRQb3NpdGlvbik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9CkBAIC0zMzI2LDYgKzM4NDMsMTAgQEAKIAkJfQogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVPbmx5U3luY2hyb25pemVkKCkgeworCXN1cGVyLmNvbnN1bWVPbmx5U3luY2hyb25pemVkKCk7CisJdGhpcy5oYXNVbnVzZWRNb2RpZmllcnMgPSBmYWxzZTsKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVPbmx5VHlwZUFyZ3VtZW50cygpIHsKIAlzdXBlci5jb25zdW1lT25seVR5cGVBcmd1bWVudHMoKTsKIAlwb3BFbGVtZW50KEtfQklOQVJZX09QRVJBVE9SKTsKQEAgLTMzNDAsNiArMzg2MSwxMCBAQAogCXN1cGVyLmNvbnN1bWVPbmx5VHlwZUFyZ3VtZW50c0ZvckNhc3RFeHByZXNzaW9uKCk7CiAJcHVzaE9uRWxlbWVudFN0YWNrKEtfUEFSQU1FVEVSSVpFRF9DQVNUKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVPcGVuRmFrZUJsb2NrKCkgeworCXN1cGVyLmNvbnN1bWVPcGVuRmFrZUJsb2NrKCk7CisJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSKTsKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVSaWdodFBhcmVuKCkgewogCXN1cGVyLmNvbnN1bWVSaWdodFBhcmVuKCk7CiB9CkBAIC0zMzg3LDkgKzM5MTIsOSBAQAogCWlmKHR5cGVQYXJhbWV0ZXIudHlwZSAhPSBudWxsIHx8ICh0eXBlUGFyYW1ldGVyLmJvdW5kcyAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXIuYm91bmRzLmxlbmd0aCA+IDApKSByZXR1cm47CiAKIAlpZiAoYXNzaXN0SWRlbnRpZmllcigpID09IG51bGwgJiYgdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcikgeyAvLyBUZXN0IGJlbG93IGNvcGllZCBmcm9tIENvbXBsZXRpb25TY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCkKLQkJaWYgKGN1cnNvckxvY2F0aW9uIDwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbil7IC8vIGZha2UgZW1wdHkgaWRlbnRpZmllciBnb3QgaXNzdWVkCisJCWlmICh0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbil7IC8vIGZha2UgZW1wdHkgaWRlbnRpZmllciBnb3QgaXNzdWVkCiAJCQl0aGlzLnB1c2hJZGVudGlmaWVyKCk7Ci0JCX0gZWxzZSBpZiAoY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAmJiBjdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCQl9IGVsc2UgaWYgKHRoaXMuY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CiAJCQl0aGlzLnB1c2hJZGVudGlmaWVyKCk7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm47CkBAIC0zMzk5LDggKzM5MjQsOCBAQAogCX0KIAogCUNvbXBsZXRpb25PbktleXdvcmQxIGtleXdvcmQgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDEoCi0JCWlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAotCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAorCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAorCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCiAJCUtleXdvcmRzLkVYVEVORFMpOwogCWtleXdvcmQuY2FuQ29tcGxldGVFbXB0eVRva2VuID0gdHJ1ZTsKIAl0eXBlUGFyYW1ldGVyLnR5cGUgPSBrZXl3b3JkOwpAQCAtMzQxNywyNiArMzk0Miw1NiBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVQYXJhbWV0ZXJXaXRoRXh0ZW5kcygpIHsKIAlzdXBlci5jb25zdW1lVHlwZVBhcmFtZXRlcldpdGhFeHRlbmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChUeXBlUGFyYW1ldGVyKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh0eXBlUGFyYW1ldGVyICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlci50eXBlID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHR5cGVQYXJhbWV0ZXI7CisJfQogCXBvcEVsZW1lbnQoS19FWFRFTkRTX0tFWVdPUkQpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVQYXJhbWV0ZXJXaXRoRXh0ZW5kc0FuZEJvdW5kcygpIHsKIAlzdXBlci5jb25zdW1lVHlwZVBhcmFtZXRlcldpdGhFeHRlbmRzQW5kQm91bmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChUeXBlUGFyYW1ldGVyKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh0eXBlUGFyYW1ldGVyICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlci50eXBlID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHR5cGVQYXJhbWV0ZXI7CisJfQogCXBvcEVsZW1lbnQoS19FWFRFTkRTX0tFWVdPUkQpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVQYXJhbWV0ZXIxV2l0aEV4dGVuZHMoKSB7CiAJc3VwZXIuY29uc3VtZVR5cGVQYXJhbWV0ZXIxV2l0aEV4dGVuZHMoKTsKKwlpZiAodGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYgdGhpcy5hc3Npc3ROb2RlUGFyZW50ID09IG51bGwpIHsKKwkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKFR5cGVQYXJhbWV0ZXIpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXIgIT0gbnVsbCAmJiB0eXBlUGFyYW1ldGVyLnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKQorCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gdHlwZVBhcmFtZXRlcjsKKwl9CiAJcG9wRWxlbWVudChLX0VYVEVORFNfS0VZV09SRCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZVBhcmFtZXRlcjFXaXRoRXh0ZW5kc0FuZEJvdW5kcygpIHsKIAlzdXBlci5jb25zdW1lVHlwZVBhcmFtZXRlcjFXaXRoRXh0ZW5kc0FuZEJvdW5kcygpOworCWlmICh0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiB0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPT0gbnVsbCkgeworCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQlpZiAodHlwZVBhcmFtZXRlciAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXIudHlwZSA9PSB0aGlzLmFzc2lzdE5vZGUpCisJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSB0eXBlUGFyYW1ldGVyOworCX0KIAlwb3BFbGVtZW50KEtfRVhURU5EU19LRVlXT1JEKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmlvblR5cGUoKSB7CisJcHVzaE9uRWxlbWVudFN0YWNrKEtfTkVYVF9UWVBFUkVGX0lTX0VYQ0VQVElPTik7CisJc3VwZXIuY29uc3VtZVVuaW9uVHlwZSgpOworCXBvcEVsZW1lbnQoS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmlvblR5cGVBc0NsYXNzVHlwZSgpIHsKKwlwdXNoT25FbGVtZW50U3RhY2soS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKKwlzdXBlci5jb25zdW1lVW5pb25UeXBlQXNDbGFzc1R5cGUoKTsKKwlwb3BFbGVtZW50KEtfTkVYVF9UWVBFUkVGX0lTX0VYQ0VQVElPTik7Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lV2lsZGNhcmQoKSB7CiAJc3VwZXIuY29uc3VtZVdpbGRjYXJkKCk7CiAJaWYgKGFzc2lzdElkZW50aWZpZXIoKSA9PSBudWxsICYmIHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIpIHsgLy8gVGVzdCBiZWxvdyBjb3BpZWQgZnJvbSBDb21wbGV0aW9uU2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpCi0JCWlmIChjdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAorCQlpZiAodGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAogCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwotCQl9IGVsc2UgaWYgKGN1cnNvckxvY2F0aW9uKzEgPj0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgY3Vyc29yTG9jYXRpb24gPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKXsKKwkJfSBlbHNlIGlmICh0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pewogCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuOwpAQCAtMzQ0Niw4ICs0MDAxLDggQEAKIAl9CiAJV2lsZGNhcmQgd2lsZGNhcmQgPSAoV2lsZGNhcmQpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKIAlDb21wbGV0aW9uT25LZXl3b3JkMSBrZXl3b3JkID0gbmV3IENvbXBsZXRpb25PbktleXdvcmQxKAotCQlpZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKLQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKKwkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKKwkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAogCQluZXcgY2hhcltdW117S2V5d29yZHMuRVhURU5EUywgS2V5d29yZHMuU1VQRVJ9ICk7CiAJa2V5d29yZC5jYW5Db21wbGV0ZUVtcHR5VG9rZW4gPSB0cnVlOwogCXdpbGRjYXJkLmtpbmQgPSBXaWxkY2FyZC5FWFRFTkRTOwpAQCAtMzQ3MywyOCArNDAyOCw0OCBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVdpbGRjYXJkQm91bmRzRXh0ZW5kcygpIHsKIAlzdXBlci5jb25zdW1lV2lsZGNhcmRCb3VuZHNFeHRlbmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVdpbGRjYXJkIHdpbGRjYXJkID0gKFdpbGRjYXJkKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh3aWxkY2FyZCAhPSBudWxsICYmIHdpbGRjYXJkLmJvdW5kID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHdpbGRjYXJkOworCX0KIAlwb3BFbGVtZW50KEtfRVhURU5EU19LRVlXT1JEKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczFFeHRlbmRzKCkgewogCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczFFeHRlbmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVdpbGRjYXJkIHdpbGRjYXJkID0gKFdpbGRjYXJkKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh3aWxkY2FyZCAhPSBudWxsICYmIHdpbGRjYXJkLmJvdW5kID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHdpbGRjYXJkOworCX0KIAlwb3BFbGVtZW50KEtfRVhURU5EU19LRVlXT1JEKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczJFeHRlbmRzKCkgewogCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczJFeHRlbmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVdpbGRjYXJkIHdpbGRjYXJkID0gKFdpbGRjYXJkKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh3aWxkY2FyZCAhPSBudWxsICYmIHdpbGRjYXJkLmJvdW5kID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHdpbGRjYXJkOworCX0KIAlwb3BFbGVtZW50KEtfRVhURU5EU19LRVlXT1JEKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczNFeHRlbmRzKCkgewogCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczNFeHRlbmRzKCk7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9PSBudWxsKSB7CisJCVdpbGRjYXJkIHdpbGRjYXJkID0gKFdpbGRjYXJkKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCWlmICh3aWxkY2FyZCAhPSBudWxsICYmIHdpbGRjYXJkLmJvdW5kID09IHRoaXMuYXNzaXN0Tm9kZSkKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHdpbGRjYXJkOworCX0KIAlwb3BFbGVtZW50KEtfRVhURU5EU19LRVlXT1JEKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oaW50IG9wKSB7CiAJc3VwZXIuY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihvcCk7CiAJcG9wRWxlbWVudChLX1VOQVJZX09QRVJBVE9SKTsKIAotCWlmKGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSBpbnN0YW5jZW9mIFVuYXJ5RXhwcmVzc2lvbikgewotCQlVbmFyeUV4cHJlc3Npb24gZXhwID0gKFVuYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCQlpZihhc3Npc3ROb2RlICE9IG51bGwgJiYgZXhwLmV4cHJlc3Npb24gPT0gYXNzaXN0Tm9kZSkgewotCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwlpZih0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgVW5hcnlFeHByZXNzaW9uKSB7CisJCVVuYXJ5RXhwcmVzc2lvbiBleHAgPSAoVW5hcnlFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQlpZih0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAuZXhwcmVzc2lvbiA9PSB0aGlzLmFzc2lzdE5vZGUpIHsKKwkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKIAkJfQogCX0KIH0KQEAgLTM1MDIsMTQgKzQwNzcsMjIgQEAKIAlzdXBlci5jb25zdW1lVW5hcnlFeHByZXNzaW9uKG9wLCBwb3N0KTsKIAlwb3BFbGVtZW50KEtfVU5BUllfT1BFUkFUT1IpOwogCi0JaWYoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgVW5hcnlFeHByZXNzaW9uKSB7Ci0JCVVuYXJ5RXhwcmVzc2lvbiBleHAgPSAoVW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JCWlmKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAuZXhwcmVzc2lvbiA9PSBhc3Npc3ROb2RlKSB7Ci0JCQlhc3Npc3ROb2RlUGFyZW50ID0gZXhwOworCWlmKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsKKwkJVW5hcnlFeHByZXNzaW9uIGV4cCA9IChVbmFyeUV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCWlmKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5leHByZXNzaW9uID09IHRoaXMuYXNzaXN0Tm9kZSkgeworCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gZXhwOwogCQl9CiAJfQogfQotCitwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gY29udmVydFRvTWV0aG9kRGVjbGFyYXRpb24oQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjLCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gc3VwZXIuY29udmVydFRvTWV0aG9kRGVjbGFyYXRpb24oYywgY29tcGlsYXRpb25SZXN1bHQpOworCWlmICh0aGlzLnNvdXJjZUVuZHMgIT0gbnVsbCkgeworCQlpbnQgc2VsZWN0b3JTb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZHMucmVtb3ZlS2V5KGMpOworCQlpZiAoc2VsZWN0b3JTb3VyY2VFbmQgIT0gLTEpCisJCQl0aGlzLnNvdXJjZUVuZHMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBzZWxlY3RvclNvdXJjZUVuZCk7CisJfQorCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKK30KIHB1YmxpYyBJbXBvcnRSZWZlcmVuY2UgY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucywgbG9uZ1tdIHBvc2l0aW9ucywgaW50IG1vZCl7CiAJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIG1vZCk7CiB9CkBAIC0zNTI2LDYgKzQxMDksOCBAQAogcHVibGljIFR5cGVSZWZlcmVuY2UgY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gYXNzaXN0TmFtZSwgbG9uZ1tdIHBvc2l0aW9ucyl7CiAJc3dpdGNoICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKIAkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04gOgorCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOKQorCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCiAJCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsCiAJCQkJCWFzc2lzdE5hbWUsCkBAIC0zNTU4LDEwICs0MTQzLDEyIEBACiAJCX0KIAl9CiAJaWYoIWlzUGFyYW1ldGVyaXplZCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKHByZXZpb3VzSWRlbnRpZmllcnMsIGFzc2lzdE5hbWUsIHBvc2l0aW9ucyk7CisJCXJldHVybiBjcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKHByZXZpb3VzSWRlbnRpZmllcnMsIGFzc2lzdE5hbWUsIHBvc2l0aW9ucyk7CiAJfSBlbHNlIHsKIAkJc3dpdGNoICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKIAkJCWNhc2UgS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OIDoKKwkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIsIDEpID09IEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4pCisJCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKIAkJCQkJcHJldmlvdXNJZGVudGlmaWVycywKIAkJCQkJdHlwZUFyZ3VtZW50cywKQEAgLTM2MDYsMTIgKzQxOTMsMTIgQEAKIAl9IGVsc2UgewogCQlib29sZWFuIGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsKIAkJaWYoa2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUgotCQkJJiYgcHJldmlvdXNLaW5kID09IEtfQkxPQ0tfREVMSU1JVEVSCi0JCQkmJiBwcmV2aW91c0luZm8gPT0gRE8pIHsKKwkJCSYmIHRoaXMucHJldmlvdXNLaW5kID09IEtfQkxPQ0tfREVMSU1JVEVSCisJCQkmJiB0aGlzLnByZXZpb3VzSW5mbyA9PSBETykgewogCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMyhhc3Npc3ROYW1lLCBwb3NpdGlvbiwgS2V5d29yZHMuV0hJTEUpOwogCQl9IGVsc2UgaWYoa2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUgotCQkJJiYgcHJldmlvdXNLaW5kID09IEtfQkxPQ0tfREVMSU1JVEVSCi0JCQkmJiBwcmV2aW91c0luZm8gPT0gVFJZKSB7CisJCQkmJiB0aGlzLnByZXZpb3VzS2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUgorCQkJJiYgdGhpcy5wcmV2aW91c0luZm8gPT0gVFJZKSB7CiAJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PbktleXdvcmQzKGFzc2lzdE5hbWUsIHBvc2l0aW9uLCBuZXcgY2hhcltdW117S2V5d29yZHMuQ0FUQ0gsIEtleXdvcmRzLkZJTkFMTFl9KTsKIAkJfSBlbHNlIGlmKGtpbmQgPT0gS19CTE9DS19ERUxJTUlURVIKIAkJCSYmIHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBTV0lUQ0gpIHsKQEAgLTM2MjAsMTggKzQyMDcsMjEgQEAKIAkJCWNoYXJbXVtdIGtleXdvcmRzID0gbmV3IGNoYXJbS2V5d29yZHMuQ09VTlRdW107CiAJCQlpbnQgY291bnQgPSAwOwogCi0JCQlpZigobGFzdE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpID09IDApIHsKKwkJCWlmKCh0aGlzLmxhc3RNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSA9PSAwKSB7CiAJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLlNVUEVSOwogCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5USElTOwogCQkJfQogCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLk5FVzsKLQotCQkJaWYoa2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUikgewotCQkJCWlmKGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9PSBZRVMpIHsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjk0OTM6IEtleXdvcmRzIGFyZSBub3QgcHJvcG9zZWQgaW4gYSBmb3IKKwkJCS8vIGxvb3Agd2l0aG91dCBibG9jay4gQ29tcGxldGlvbiB3aGlsZSBhdCBLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUiBjYXNlIG5lZWRzIHRvIGhhbmRsZWQKKwkJCS8vIHNpbWlsYXIgdG8gdGhlIEtfQkxPQ0tfREVMSU1JVEVSIHdpdGggbWlub3IgZGlmZmVyZW5jZXMuCisJCQlpZihraW5kID09IEtfQkxPQ0tfREVMSU1JVEVSIHx8IGtpbmQgPT0gS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVIpIHsKKwkJCQlpZih0aGlzLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9PSBZRVMpIHsKIAkJCQkJY2FuQmVFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IHRydWU7CiAJCQkJfQotCi0JCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkFTU0VSVDsKKwkJCQlpZiAodGhpcy5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5BU1NFUlQ7CisJCQkJfQogCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5ETzsKIAkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuRk9SOwogCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5JRjsKQEAgLTM2NDUsOCArNDIzNSw4IEBACiAJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkZJTkFMOwogCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5DTEFTUzsKIAotCQkJCWlmKHByZXZpb3VzS2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUikgewotCQkJCQlzd2l0Y2ggKHByZXZpb3VzSW5mbykgeworCQkJCWlmKHRoaXMucHJldmlvdXNLaW5kID09IEtfQkxPQ0tfREVMSU1JVEVSKSB7CisJCQkJCXN3aXRjaCAodGhpcy5wcmV2aW91c0luZm8pIHsKIAkJCQkJCWNhc2UgSUYgOgogCQkJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5FTFNFOwogCQkJCQkJCWJyZWFrOwpAQCAtMzY1NSw2ICs0MjQ1LDggQEAKIAkJCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuRklOQUxMWTsKIAkJCQkJCQlicmVhazsKIAkJCQkJfQorCQkJCX0gZWxzZSBpZih0aGlzLnByZXZpb3VzS2luZCA9PSBLX0NPTlRST0xfU1RBVEVNRU5UX0RFTElNSVRFUiAmJiB0aGlzLnByZXZpb3VzSW5mbyA9PSBJRikgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuRUxTRTsKIAkJCQl9CiAJCQkJaWYoaXNJbnNpZGVMb29wKCkpIHsKIAkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkNPTlRJTlVFOwpAQCAtMzY3Myw4ICs0MjY1LDkgQEAKIAkJCQkJfQogCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQlJFQUs7CiAJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5DQVNFOwotCQkJCQkKLQkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkFTU0VSVDsKKwkJCQkJaWYgKHRoaXMub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgeworCQkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkFTU0VSVDsKKwkJCQkJfQogCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuRE87CiAJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5GT1I7CiAJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5JRjsKQEAgLTM2ODQsMTAgKzQyNzcsMTAgQEAKIAkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLlRIUk9XOwogCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuVFJZOwogCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuV0hJTEU7Ci0JCisKIAkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkZJTkFMOwogCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQ0xBU1M7Ci0JCQkJCQorCiAJCQkJCWlmKGlzSW5zaWRlTG9vcCgpKSB7CiAJCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQ09OVElOVUU7CiAJCQkJCX0KQEAgLTM3MDIsNiArNDI5NSw4IEBACiBwdWJsaWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKGNoYXJbXSBhc3Npc3ROYW1lLCBsb25nIHBvc2l0aW9uKSB7CiAJc3dpdGNoICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKIAkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04gOgorCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOKQorCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UoYXNzaXN0TmFtZSwgcG9zaXRpb24sIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuS19FWENFUFRJT04pIDsKIAkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19DTEFTUyA6CiAJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UoYXNzaXN0TmFtZSwgcG9zaXRpb24sIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuS19DTEFTUyk7CkBAIC0zNzEyLDcgKzQzMDcsNyBAQAogCX0KIH0KIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVBhcmFtZXRlcml6ZWRTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzLCBjaGFyW10gYXNzaXN0TmFtZSwgbG9uZyBwb3NpdGlvbikgewotCXJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoYXNzaXN0TmFtZSwgcG9zaXRpb24pOworCXJldHVybiBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKGFzc2lzdE5hbWUsIHBvc2l0aW9uKTsKIH0KIHByb3RlY3RlZCBTdHJpbmdMaXRlcmFsIGNyZWF0ZVN0cmluZ0xpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBsaW5lTnVtYmVyKSB7CiAJaWYgKHN0YXJ0IDw9IHRoaXMuY3Vyc29yTG9jYXRpb24gJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8PSBlbmQpewpAQCAtMzc5OCw3ICs0MzkzLDcgQEAKIAlzdXBlci5mbHVzaEFzc2lzdFN0YXRlKCk7CiAJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CiAJdGhpcy5pc0FscmVhZHlBdHRhY2hlZCA9IGZhbHNlOwotCWFzc2lzdE5vZGVQYXJlbnQgPSBudWxsOworCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IG51bGw7CiAJQ29tcGxldGlvblNjYW5uZXIgY29tcGxldGlvblNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5zY2FubmVyOwogCWNvbXBsZXRpb25TY2FubmVyLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCA9IDA7CiAJY29tcGxldGlvblNjYW5uZXIuY29tcGxldGVkSWRlbnRpZmllckVuZCA9IC0xOwpAQCAtMzgwNiw3ICs0NDAxLDEwIEBACiAKIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlIGdldFR5cGVSZWZlcmVuY2VGb3JHZW5lcmljVHlwZShpbnQgZGltLAlpbnQgaWRlbnRpZmllckxlbmd0aCwgaW50IG51bWJlck9mSWRlbnRpZmllcnMpIHsKIAlUeXBlUmVmZXJlbmNlIHJlZiA9IHN1cGVyLmdldFR5cGVSZWZlcmVuY2VGb3JHZW5lcmljVHlwZShkaW0sIGlkZW50aWZpZXJMZW5ndGgsIG51bWJlck9mSWRlbnRpZmllcnMpOwotCisJLy8gaW4gY29tcGxldGlvbiBjYXNlIHdlIG1pZ2h0IGhhdmUgZW5jb3VudGVyZWQgdGhlIGFzc2lzdCBub2RlIGJlZm9yZSByZWFsbHkgcGFyc2luZworCS8vIHRoZSBjb21wbGV0ZSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiwgYW5kIHNvIGEgc2VwYXJhdGUgY2hlY2sgZm9yIGRpYW1vbmQgaXMgbmVlZGVkIGhlcmUuCisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NjQ1NAorCWNoZWNrRm9yRGlhbW9uZChyZWYpOwogCWlmKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsKSB7CiAJCWlmIChpZGVudGlmaWVyTGVuZ3RoID09IDEgJiYgbnVtYmVyT2ZJZGVudGlmaWVycyA9PSAxKSB7CiAJCQlQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVSZWYgPSAoUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHJlZjsKQEAgLTM4NTcsNyArNDQ1NSw3IEBACiB9CiBwcml2YXRlIGJvb2xlYW4gaXNBbHJlYWR5UG90ZW50aWFsTmFtZShpbnQgaWRlbnRpZmllclN0YXJ0KSB7CiAJaWYgKHRoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0ciA8IDApIHJldHVybiBmYWxzZTsKLQkKKwogCXJldHVybiBpZGVudGlmaWVyU3RhcnQgPD0gdGhpcy5wb3RlbnRpYWxWYXJpYWJsZU5hbWVFbmRzW3RoaXMucG90ZW50aWFsVmFyaWFibGVOYW1lc1B0cl07CiB9CiBwcm90ZWN0ZWQgaW50IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKGJvb2xlYW4gdXNlR2VuZXJpY3NTdGFjaykgewpAQCAtMzg2NywxMiArNDQ2NSwxMiBAQAogcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAlzdXBlci5pbml0aWFsaXplKCk7CiAJdGhpcy5sYWJlbFB0ciA9IC0xOwotCXRoaXMuaW5pdGlhbGl6ZUZvckJsb2NrU3RhdGVtZW50cygpOworCWluaXRpYWxpemVGb3JCbG9ja1N0YXRlbWVudHMoKTsKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoYm9vbGVhbiBpbml0aWFsaXplTkxTKSB7CiAJc3VwZXIuaW5pdGlhbGl6ZShpbml0aWFsaXplTkxTKTsKIAl0aGlzLmxhYmVsUHRyID0gLTE7Ci0JdGhpcy5pbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CisJaW5pdGlhbGl6ZUZvckJsb2NrU3RhdGVtZW50cygpOwogfQogLyoKICAqIEluaXRpYWxpemVzIHRoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHRoYXQgaXMgYWJvdXQgdG8gZ28gZm9yIEJsb2NrU3RhdGVtZW50cy4KQEAgLTM4ODAsMTIgKzQ0NzgsMTggQEAKIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCkgewogCXRoaXMucHJldmlvdXNUb2tlbiA9IC0xOwogCXRoaXMucHJldmlvdXNJZGVudGlmaWVyUHRyID0gLTE7Ci0JdGhpcy5icmFja2V0RGVwdGggPSAwOwogCXRoaXMuaW52b2NhdGlvblR5cGUgPSBOT19SRUNFSVZFUjsKIAl0aGlzLnF1YWxpZmllciA9IC0xOwogCXBvcFVudGlsRWxlbWVudChLX1NXSVRDSF9MQUJFTCk7CiAJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpICE9IEtfU1dJVENIX0xBQkVMKSB7Ci0JCXRoaXMucG9wVW50aWxFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0FSUkFZX0lOSVRJQUxJWkVSKSB7CisJCQkvLyBpZiByZWNvdmVyeSBpcyB0YWtpbmcgcGxhY2UgaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIsIHdlIHNob3VsZCBwcmV2ZW50IHBvcHBpbmcKKwkJCS8vIHVwIHRvIHRoZSBlbmNsb3NpbmcgYmxvY2sgdW50aWwgdGhlIGFycmF5IGluaXRpYWxpemVyIGlzIHByb3Blcmx5IGNsb3NlZAorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTcwNAorCQkJcG9wVW50aWxFbGVtZW50KEtfQVJSQVlfSU5JVElBTElaRVIpOworCQl9IGVsc2UgeworCQkJcG9wVW50aWxFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwkJfQogCX0KIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7CkBAIC0zODkzLDcgKzQ0OTcsNyBAQAogfQogLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbXBsZXRpb24gaXMganVzdCBhZnRlciBhbiBhcnJheSB0eXBlCi0gKiBlZy4gU3RyaW5nW10uW2N1cnNvcl0KKyAqIGUuZy4gU3RyaW5nW10uW2N1cnNvcl0KICAqLwogcHJpdmF0ZSBib29sZWFuIGlzQWZ0ZXJBcnJheVR5cGUoKSB7CiAJLy8gVEJEOiBUaGUgZm9sbG93aW5nIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFycmF5IGRpbWVuc2lvbnMgYXJlIHNtYWxsOiBpdCBzYXlzIHRoYXQgaWYgdGhlCkBAIC0zOTExLDkgKzQ1MTUsOSBAQAogCQkoKChDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKXRoaXMuYXNzaXN0Tm9kZSkudG9rZW4ubGVuZ3RoID09IDApOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVBbm5vdGF0aW9uKCkgewotCWludCBpID0gZWxlbWVudFB0cjsKKwlpbnQgaSA9IHRoaXMuZWxlbWVudFB0cjsKIAl3aGlsZShpID4gLTEpIHsKLQkJaWYoZWxlbWVudEtpbmRTdGFja1tpXSA9PSBLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pCisJCWlmKHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSA9PSBLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4pCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaS0tOwogCX0KQEAgLTM5MjEsOSArNDUyNSw5IEBACiB9CiAKIHByb3RlY3RlZCBib29sZWFuIGlzSW5kaXJlY3RseUluc2lkZUJsb2NrKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlpZihlbGVtZW50S2luZFN0YWNrW2ldID09IEtfQkxPQ0tfREVMSU1JVEVSKQorCQlpZih0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0gPT0gS19CTE9DS19ERUxJTUlURVIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaS0tOwogCX0KQEAgLTM5MzEsOSArNDUzNSw5IEBACiB9CiAKIHByb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlQmxvY2soKXsKLQlpbnQgaSA9IGVsZW1lbnRQdHI7CisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CiAJd2hpbGUoaSA+IC0xKSB7Ci0JCXN3aXRjaCAoZWxlbWVudEtpbmRTdGFja1tpXSkgeworCQlzd2l0Y2ggKHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSkgewogCQkJY2FzZSBLX1RZUEVfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CiAJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwpAQCAtMzk0NCwxNSArNDU0OCwxNiBAQAogCXJldHVybiBmYWxzZTsKIH0KIHByb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlQnJlYWthYmxlKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19TV0lUQ0hfTEFCRUwgOiByZXR1cm4gdHJ1ZTsKIAkJCWNhc2UgS19CTE9DS19ERUxJTUlURVIgOgotCQkJCXN3aXRjaChlbGVtZW50SW5mb1N0YWNrW2ldKSB7CisJCQljYXNlIEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSOgorCQkJCXN3aXRjaCh0aGlzLmVsZW1lbnRJbmZvU3RhY2tbaV0pIHsKIAkJCQkJY2FzZSBGT1IgOgogCQkJCQljYXNlIERPIDoKIAkJCQkJY2FzZSBXSElMRSA6CkBAIC0zOTY0LDE0ICs0NTY5LDE1IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVMb29wKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19CTE9DS19ERUxJTUlURVIgOgotCQkJCXN3aXRjaChlbGVtZW50SW5mb1N0YWNrW2ldKSB7CisJCQljYXNlIEtfQ09OVFJPTF9TVEFURU1FTlRfREVMSU1JVEVSOgorCQkJCXN3aXRjaCh0aGlzLmVsZW1lbnRJbmZvU3RhY2tbaV0pIHsKIAkJCQkJY2FzZSBGT1IgOgogCQkJCQljYXNlIERPIDoKIAkJCQkJY2FzZSBXSElMRSA6CkBAIC0zOTgzLDEzICs0NTg5LDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVSZXR1cm4oKXsKLQlpbnQgaSA9IGVsZW1lbnRQdHI7CisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CiAJd2hpbGUoaSA+IC0xKSB7Ci0JCXN3aXRjaCAoZWxlbWVudEtpbmRTdGFja1tpXSkgeworCQlzd2l0Y2ggKHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSkgewogCQkJY2FzZSBLX1RZUEVfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CiAJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX0JMT0NLX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKKwkJCWNhc2UgS19DT05UUk9MX1NUQVRFTUVOVF9ERUxJTUlURVI6IHJldHVybiBmYWxzZTsgLy8gRldJVwogCQkJY2FzZSBLX0lOU0lERV9SRVRVUk5fU1RBVEVNRU5UIDogcmV0dXJuIHRydWU7CiAJCX0KIAkJaS0tOwpAQCAtNDAwNyw3ICs0NjE0LDcgQEAKIHB1YmxpYyB2b2lkIHBhcnNlQmxvY2tTdGF0ZW1lbnRzKAogCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QsCiAJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewotCWNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9IDE7CisJdGhpcy5jYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSAxOwogCXN1cGVyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKGNkLCB1bml0KTsKIH0KIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBwYXJzZVNvbWVTdGF0ZW1lbnRzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGZha2VCbG9ja3NDb3VudCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewpAQCAtNDAyNywxMyArNDYzNCwxMyBAQAogCWZha2VNZXRob2Quc291cmNlU3RhcnQgPSBzdGFydDsKIAlmYWtlTWV0aG9kLnNvdXJjZUVuZCA9IHN0YXJ0OyAvL2Zha2UgbWV0aG9kIG11c3QgaWdub3JlIHRoZSBtZXRob2QgaGVhZGVyCiAKLQlyZWZlcmVuY2VDb250ZXh0ID0gZmFrZU1ldGhvZDsKLQljb21waWxhdGlvblVuaXQgPSB1bml0OworCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGZha2VNZXRob2Q7CisJdGhpcy5jb21waWxhdGlvblVuaXQgPSB1bml0OwogCiAJdGhpcy5kaWV0ID0gZmFsc2U7CiAJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOwogCi0Jc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCXRoaXMuc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwogCWNvbnN1bWVOZXN0ZWRNZXRob2QoKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGZha2VCbG9ja3NDb3VudDsgaSsrKSB7CiAJCWNvbnN1bWVPcGVuRmFrZUJsb2NrKCk7CkBAIC00MDQxLDEzICs0NjQ4LDEzIEBACiAJdHJ5IHsKIAkJcGFyc2UoKTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7Ci0JCWxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CisJCXRoaXMubGFzdEFjdCA9IEVSUk9SX0FDVElPTjsKIAl9IGZpbmFsbHkgewotCQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0tLTsKKwkJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXS0tOwogCX0KIAlpZiAoIXRoaXMuaGFzRXJyb3IpIHsKIAkJaW50IGxlbmd0aDsKLQkJaWYgKGFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWlmICh0aGlzLmFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAogCQkJCXRoaXMuYXN0U3RhY2ssCiAJCQkJKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLApAQCAtNDA2MCwxOSArNDY2NywyNSBAQAogCXJldHVybiBmYWtlTWV0aG9kOwogfQogcHJvdGVjdGVkIHZvaWQgcG9wVW50aWxDb21wbGV0ZWRBbm5vdGF0aW9uSWZOZWNlc3NhcnkoKSB7Ci0JaWYoZWxlbWVudFB0ciA8IDApIHJldHVybjsKLQkKLQlpbnQgaSA9IGVsZW1lbnRQdHI7CisJaWYodGhpcy5lbGVtZW50UHRyIDwgMCkgcmV0dXJuOworCisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CiAJd2hpbGUoaSA+IC0xICYmCi0JCQkoZWxlbWVudEtpbmRTdGFja1tpXSAhPSBLX0JFVFdFRU5fQU5OT1RBVElPTl9OQU1FX0FORF9SUEFSRU4gfHwKLQkJCQkJKGVsZW1lbnRJbmZvU3RhY2tbaV0gJiBBTk5PVEFUSU9OX05BTUVfQ09NUExFVElPTikgPT0gMCkpIHsKKwkJCSh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0gIT0gS19CRVRXRUVOX0FOTk9UQVRJT05fTkFNRV9BTkRfUlBBUkVOIHx8CisJCQkJCSh0aGlzLmVsZW1lbnRJbmZvU3RhY2tbaV0gJiBBTk5PVEFUSU9OX05BTUVfQ09NUExFVElPTikgPT0gMCkpIHsKIAkJaS0tOwogCX0KLQkKKwogCWlmKGkgPj0gMCkgewotCQlwcmV2aW91c0tpbmQgPSBlbGVtZW50S2luZFN0YWNrW2ldOwotCQlwcmV2aW91c0luZm8gPSBlbGVtZW50SW5mb1N0YWNrW2ldOwotCQllbGVtZW50UHRyID0gaSAtIDE7CQorCQl0aGlzLnByZXZpb3VzS2luZCA9IHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXTsKKwkJdGhpcy5wcmV2aW91c0luZm8gPSB0aGlzLmVsZW1lbnRJbmZvU3RhY2tbaV07CisJCXRoaXMucHJldmlvdXNPYmplY3RJbmZvID0gdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW2ldOworCisJCWZvciAoaW50IGogPSBpOyBqIDw9IHRoaXMuZWxlbWVudFB0cjsgaisrKSB7CisJCQl0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbal0gPSBudWxsOworCQl9CisKKwkJdGhpcy5lbGVtZW50UHRyID0gaSAtIDE7CiAJfQogfQogLyoKQEAgLTQwODMsNyArNDY5Niw3IEBACiAJdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gPSAwOwogCXRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHIgPSAxXSA9IDA7CiAKLQl0aGlzLmluaXRpYWxpemVGb3JCbG9ja1N0YXRlbWVudHMoKTsKKwlpbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25MYWJlbFN0YWNrKGNoYXJbXSBsYWJlbCl7CiAJaWYgKHRoaXMubGFiZWxQdHIgPCAtMSkgcmV0dXJuOwpAQCAtNDEwMiwzOSArNDcxNSwyMyBAQAogICogb24gdGhlIGV4cHJlc3Npb24gc3RhY2suCiAgKi8KIHByaXZhdGUgdm9pZCBwdXNoQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzT25FeHByZXNzaW9uU3RhY2soYm9vbGVhbiBpc1N1cGVyQWNjZXNzKSB7Ci0JY2hhcltdIHNvdXJjZSA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJY2hhcltdIHNvdXJjZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAlDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MgZnIgPSBuZXcgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKHNvdXJjZSwgcG9zLCBpc0luc2lkZUFubm90YXRpb24oKSk7CiAJdGhpcy5hc3Npc3ROb2RlID0gZnI7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGZyLnNvdXJjZUVuZCArIDE7Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCWlmIChpc1N1cGVyQWNjZXNzKSB7IC8vY29uc2lkZXJhdGVzIHRoZSBmaWVsZFJlZmVyZW5jZSBiZWdpbm5pbmcgYXQgdGhlICdzdXBlcicgLi4uLgotCQlmci5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJZnIucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZnIuc291cmNlU3RhcnQsIGVuZFBvc2l0aW9uKTsKKwkJZnIuc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCQlmci5yZWNlaXZlciA9IG5ldyBTdXBlclJlZmVyZW5jZShmci5zb3VyY2VTdGFydCwgdGhpcy5lbmRQb3NpdGlvbik7CiAJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhmcik7CiAJfSBlbHNlIHsgLy9vcHRpbWl6ZSBwdXNoL3BvcAotCQlpZiAoKGZyLnJlY2VpdmVyID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKS5pc1RoaXMoKSkgeyAvL2ZpZWxkcmVmZXJlbmNlIGJlZ2lucyBhdCB0aGUgdGhpcworCQlpZiAoKGZyLnJlY2VpdmVyID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSkuaXNUaGlzKCkpIHsgLy9maWVsZHJlZmVyZW5jZSBiZWdpbnMgYXQgdGhlIHRoaXMKIAkJCWZyLnNvdXJjZVN0YXJ0ID0gZnIucmVjZWl2ZXIuc291cmNlU3RhcnQ7CiAJCX0KLQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gZnI7CisJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBmcjsKIAl9CiB9Ci1wdWJsaWMgdm9pZCByZWNvcmRDb21wbGV0aW9uT25SZWZlcmVuY2UoKXsKLQotCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpewotCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKLQotCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCi0JCWlmICghcmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgcmV0dXJuOwotCi0JCS8qIGdlbmVyYXRlIGEgcHNldWRvIGZpZWxkIHdpdGggYSBjb21wbGV0aW9uIG9uIHR5cGUgcmVmZXJlbmNlICovCi0JCWN1cnJlbnRFbGVtZW50LmFkZCgKLQkJCW5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUodGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApLCBmYWxzZSksIDApOwotCQlyZXR1cm47Ci0JfQotCWlmICghZGlldCkgcmV0dXJuOyAvLyBvbmx5IHJlY29yZCByZWZlcmVuY2VzIGF0dGFjaGVkIHRvIHR5cGVzCi0KLX0KIHByaXZhdGUgdm9pZCByZWNvcmRSZWZlcmVuY2UoTmFtZVJlZmVyZW5jZSBuYW1lUmVmZXJlbmNlKSB7CiAJaWYgKCF0aGlzLnNraXBSZWNvcmQgJiYKIAkJCXRoaXMucmVjb3JkRnJvbSA8PSBuYW1lUmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICYmCkBAIC00MTQ2LDE5ICs0NzQzLDE5IEBACiAJCX0gZWxzZSB7CiAJCQl0b2tlbiA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbmFtZVJlZmVyZW5jZSkudG9rZW5zWzBdOwogCQl9Ci0JCQorCiAJCS8vIE1vc3Qgb2YgdGhlIHRpbWUgYSBuYW1lIHdoaWNoIHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGlzIGEgdHlwZSBuYW1lLgogCQkvLyBBcyB3ZSBkb24ndCB3YW50IHRvIHJlc29sdmUgbmFtZXMgdG8gYXZvaWQgdG8gc2xvdyBkb3duIHBlcmZvcm1hbmNlcyB0aGVuIHRoaXMgbmFtZSB3aWxsIGJlIGlnbm9yZWQKIAkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh0b2tlblswXSkpIHJldHVybjsKLQkJCisKIAkJYWRkUG90ZW50aWFsTmFtZSh0b2tlbiwgbmFtZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwgbmFtZVJlZmVyZW5jZS5zb3VyY2VFbmQpOwogCX0KIH0KIHB1YmxpYyB2b2lkIHJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpIHsKLQlpZihjdXJyZW50RWxlbWVudCAhPSBudWxsICYmIGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgewotCQlSZWNvdmVyZWRFbGVtZW50IG9sZEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKKwlpZih0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZExvY2FsVmFyaWFibGUpIHsKKwkJUmVjb3ZlcmVkRWxlbWVudCBvbGRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJc3VwZXIucmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCk7Ci0JCWlmKG9sZEVsZW1lbnQgIT0gY3VycmVudEVsZW1lbnQpIHsKKwkJaWYob2xkRWxlbWVudCAhPSB0aGlzLmN1cnJlbnRFbGVtZW50KSB7CiAJCQlwb3BFbGVtZW50KEtfTE9DQUxfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKIAkJfQogCX0gZWxzZSB7CkBAIC00MTY2LDggKzQ3NjMsOCBAQAogCX0KIH0KIHB1YmxpYyB2b2lkIHJlY292ZXJ5VG9rZW5DaGVjaygpIHsKLQlSZWNvdmVyZWRFbGVtZW50IG9sZEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKLQlzd2l0Y2ggKGN1cnJlbnRUb2tlbikgeworCVJlY292ZXJlZEVsZW1lbnQgb2xkRWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQ7CisJc3dpdGNoICh0aGlzLmN1cnJlbnRUb2tlbikgewogCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6CiAJCQlpZighdGhpcy5pZ25vcmVOZXh0T3BlbmluZ0JyYWNlKSB7CiAJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbiA9IG51bGw7IC8vIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2Fubm90IGJlIGF0dGFjaGVkIHRvIG5leHQgbm9kZXMKQEAgLTQxNzYsOCArNDc3MywxNCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDoKIAkJCXN1cGVyLnJlY292ZXJ5VG9rZW5DaGVjaygpOwotCQkJaWYoY3VycmVudEVsZW1lbnQgIT0gb2xkRWxlbWVudCAmJiBvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQmxvY2spIHsKLQkJCQlwb3BFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwkJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gb2xkRWxlbWVudCAmJiBvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQmxvY2spIHsKKwkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQVJSQVlfSU5JVElBTElaRVIpIHsKKwkJCQkJLy8gV2hlbiBpbnNpZGUgYW4gYXJyYXkgaW5pdGlhbGl6ZXIsIHdlIHNob3VsZCBub3QgcHJlbWF0dXJlbHkgcG9wIHRoZSBlbmNsb3NpbmcgYmxvY2sKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTcwNAorCQkJCQlwb3BFbGVtZW50KEtfQVJSQVlfSU5JVElBTElaRVIpOworCQkJCX0gZWxzZSB7CisJCQkJCXBvcEVsZW1lbnQoS19CTE9DS19ERUxJTUlURVIpOworCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZWNhc2UgOgpAQCAtNDIwOSw2ICs0ODEyLDkgQEAKIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogCXN1cGVyLnJlc2V0KCk7CiAJdGhpcy5jdXJzb3JMb2NhdGlvbiA9IDA7CisJaWYgKHRoaXMuc3RvcmVTb3VyY2VFbmRzKSB7CisJCXRoaXMuc291cmNlRW5kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50KCk7CisJfQogfQogLyoKICAqIFJlc2V0IGludGVybmFsIHN0YXRlIGFmdGVyIGNvbXBsZXRpb24gaXMgb3ZlcgpAQCAtNDIxNiw3ICs0ODIyLDE1IEBACiAKIHB1YmxpYyB2b2lkIHJlc2V0QWZ0ZXJDb21wbGV0aW9uKCkgewogCXRoaXMuY3Vyc29yTG9jYXRpb24gPSAwOwotCXRoaXMuZmx1c2hBc3Npc3RTdGF0ZSgpOworCWZsdXNoQXNzaXN0U3RhdGUoKTsKK30KK3B1YmxpYyB2b2lkIHJlc3RvcmVBc3Npc3RQYXJzZXIoT2JqZWN0IHBhcnNlclN0YXRlKSB7CisJaW50W10gc3RhdGUgPSAoaW50W10pIHBhcnNlclN0YXRlOworCQorCUNvbXBsZXRpb25TY2FubmVyIGNvbXBsZXRpb25TY2FubmVyID0gKENvbXBsZXRpb25TY2FubmVyKXRoaXMuc2Nhbm5lcjsKKwkKKwl0aGlzLmN1cnNvckxvY2F0aW9uID0gc3RhdGVbMF07CisJY29tcGxldGlvblNjYW5uZXIuY3Vyc29yTG9jYXRpb24gPSBzdGF0ZVsxXTsKIH0KIC8qCiAgKiBSZXNldCBjb250ZXh0IHNvIGFzIHRvIHJlc3VtZSB0byByZWd1bGFyIHBhcnNlIGxvb3AKQEAgLTQyMjYsMTQgKzQ4NDAsMTUgQEAKICAqIGRlY2lkZSB3aGljaCBncmFtbWFyIGdvYWwgaXMgYWN0aXZhdGVkLgogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVBZnRlclJlY292ZXJ5KCkgeworCXRoaXMuaGFzVW51c2VkTW9kaWZpZXJzID0gZmFsc2U7CiAJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsKSB7CiAJCS8qIGlmIHJlYWNoZWQgW2VvZl0gaW5zaWRlIG1ldGhvZCBib2R5LCBidXQgc3RpbGwgaW5zaWRlIG5lc3RlZCB0eXBlLAogCQkJb3IgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIsIHNob3VsZCBjb250aW51ZSBpbiBkaWV0IG1vZGUgdW50aWwKIAkJCXRoZSBlbmQgb2YgdGhlIG1ldGhvZCBib2R5IG9yIGNvbXBpbGF0aW9uIHVuaXQgKi8KLQkJaWYgKChzY2FubmVyLmVvZlBvc2l0aW9uID09IGN1cnNvckxvY2F0aW9uKzEpCi0JCQkmJiAoIShyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pCisJCWlmICgodGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uID09IHRoaXMuY3Vyc29yTG9jYXRpb24rMSkKKwkJCSYmICghKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKQogCQkJfHwgaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpCi0JCQl8fCBhc3Npc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbiAmJiAhKGFzc2lzdE5vZGVQYXJlbnQgaW5zdGFuY2VvZiBJbml0aWFsaXplcikpKSB7CisJCQl8fCB0aGlzLmFzc2lzdE5vZGVQYXJlbnQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uICYmICEodGhpcy5hc3Npc3ROb2RlUGFyZW50IGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpKSkgewogCiAJCQkvKglkaXNhYmxlZCBzaW5jZSBkb2VzIG5vdCBoYW5kbGUgcG9zc2libGUgZmllbGQvbWVzc2FnZSByZWZzLCB0aGF0IGlzLCBPYmpbQVNTSVNUIEhFUkVdZWN0LnJlZ2lzdGVyTmF0aXZlcygpCiAJCQkvLyBjb25zdW1lIGV4dHJhIHRva2VucyB3aGljaCB3ZXJlIHBhcnQgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UKQEAgLTQyNTksMTggKzQ4NzQsMTggQEAKIAkJCX0KIAkJCSovCiAJCQkvKiByZXN0YXJ0IGluIGRpZXQgbW9kZSBmb3IgZmluZGluZyBzaWJsaW5nIGNvbnN0cnVjdHMgKi8KLQkJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUKLQkJCQl8fCBjdXJyZW50RWxlbWVudC5lbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCl7Ci0JCQkJCQorCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlCisJCQkJfHwgdGhpcy5jdXJyZW50RWxlbWVudC5lbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCl7CisKIAkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uID0gbnVsbDsKLQkJCQkKLQkJCQlpZihsYXN0Q2hlY2tQb2ludCA8PSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kKSB7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCsxOworCisJCQkJaWYodGhpcy5sYXN0Q2hlY2tQb2ludCA8PSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kKSB7CisJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kKzE7CiAJCQkJfQotCQkJCWludCBlbmQgPSBjdXJyZW50RWxlbWVudC50b3BFbGVtZW50KCkuc291cmNlRW5kKCk7Ci0JCQkJc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IGVuZCA8IEludGVnZXIuTUFYX1ZBTFVFID8gZW5kICsgMSA6IGVuZDsKKwkJCQlpbnQgZW5kID0gdGhpcy5jdXJyZW50RWxlbWVudC50b3BFbGVtZW50KCkuc291cmNlRW5kKCk7CisJCQkJdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uID0gZW5kIDwgSW50ZWdlci5NQVhfVkFMVUUgPyBlbmQgKyAxIDogZW5kOwogCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnJlc2V0U3RhY2tzKCk7CisJCQkJcmVzZXRTdGFja3MoKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KQEAgLTQyNzgsMTggKzQ4OTMsMTggQEAKIAlyZXR1cm4gc3VwZXIucmVzdW1lQWZ0ZXJSZWNvdmVyeSgpOwogfQogcHVibGljIHZvaWQgc2V0QXNzaXN0SWRlbnRpZmllcihjaGFyW10gYXNzaXN0SWRlbnQpewotCSgoQ29tcGxldGlvblNjYW5uZXIpc2Nhbm5lcikuY29tcGxldGlvbklkZW50aWZpZXIgPSBhc3Npc3RJZGVudDsKKwkoKENvbXBsZXRpb25TY2FubmVyKXRoaXMuc2Nhbm5lcikuY29tcGxldGlvbklkZW50aWZpZXIgPSBhc3Npc3RJZGVudDsKIH0KIHB1YmxpYyAgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJYnVmZmVyLmFwcGVuZCgiZWxlbWVudEtpbmRTdGFjayA6IGludFtdID0geyIpOyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZWxlbWVudEtpbmRTdGFja1tpXSkpLmFwcGVuZCgnLCcpOworCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZWxlbWVudFB0cjsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YodGhpcy5lbGVtZW50S2luZFN0YWNrW2ldKSkuYXBwZW5kKCcsJyk7CiAJfQogCWJ1ZmZlci5hcHBlbmQoIn1cbiIpOyAvLyROT04tTkxTLTEkCiAJYnVmZmVyLmFwcGVuZCgiZWxlbWVudEluZm9TdGFjayA6IGludFtdID0geyIpOyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZWxlbWVudEluZm9TdGFja1tpXSkpLmFwcGVuZCgnLCcpOworCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZWxlbWVudFB0cjsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YodGhpcy5lbGVtZW50SW5mb1N0YWNrW2ldKSkuYXBwZW5kKCcsJyk7CiAJfQogCWJ1ZmZlci5hcHBlbmQoIn1cbiIpOyAvLyROT04tTkxTLTEkCiAJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKQEAgLTQzMDIsMjUgKzQ5MTcsMjUgQEAKIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlY292ZXJ5U3RhdGUoKSB7CiAKIAkvKiBleHBvc2UgcGFyc2VyIHN0YXRlIHRvIHJlY292ZXJ5IHN0YXRlICovCi0JY3VycmVudEVsZW1lbnQudXBkYXRlRnJvbVBhcnNlclN0YXRlKCk7CisJdGhpcy5jdXJyZW50RWxlbWVudC51cGRhdGVGcm9tUGFyc2VyU3RhdGUoKTsKIAogCS8qIG1heSBiZSBhYmxlIHRvIHJldHJpZXZlIGNvbXBsZXRpb25Ob2RlIGFzIGFuIG9ycGhhbiwgYW5kIHRoZW4gYXR0YWNoIGl0ICovCi0JdGhpcy5jb21wbGV0aW9uSWRlbnRpZmllckNoZWNrKCk7Ci0JdGhpcy5hdHRhY2hPcnBoYW5Db21wbGV0aW9uTm9kZSgpOworCWNvbXBsZXRpb25JZGVudGlmaWVyQ2hlY2soKTsKKwlhdHRhY2hPcnBoYW5Db21wbGV0aW9uTm9kZSgpOwogCiAJLy8gaWYgYW4gYXNzaXN0IG5vZGUgaGFzIGJlZW4gZm91bmQgYW5kIGEgcmVjb3ZlcmVkIGVsZW1lbnQgZXhpc3RzLAogCS8vIG1hcmsgZW5jbG9zaW5nIGJsb2NrcyBhcyB0byBiZSBwcmVzZXJ2ZWQKIAlpZiAodGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYgdGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCWN1cnJlbnRFbGVtZW50LnByZXNlcnZlRW5jbG9zaW5nQmxvY2tzKCk7CisJCXRoaXMuY3VycmVudEVsZW1lbnQucHJlc2VydmVFbmNsb3NpbmdCbG9ja3MoKTsKIAl9CiAKIAkvKiBjaGVjayBhbmQgdXBkYXRlIHJlY292ZXJlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHRva2VuLAogCQl0aGlzIGFjdGlvbiBpcyBhbHNvIHBlcmZvcm1lZCB3aGVuIHNoaWZ0aW5nIHRva2VuIGFmdGVyIHJlY292ZXJ5CiAJCWdvdCBhY3RpdmF0ZWQgb25jZS4KIAkqLwotCXRoaXMucmVjb3ZlcnlUb2tlbkNoZWNrKCk7CisJcmVjb3ZlcnlUb2tlbkNoZWNrKCk7CiAKLQl0aGlzLnJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOworCXJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOwogfQogCiBwcm90ZWN0ZWQgTG9jYWxEZWNsYXJhdGlvbiBjcmVhdGVMb2NhbERlY2xhcmF0aW9uKGNoYXJbXSBhc3Npc3ROYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKQEAgLTQzMzksNyArNDk1NCw3IEBACiB9CiAKIHByb3RlY3RlZCBGaWVsZERlY2xhcmF0aW9uIGNyZWF0ZUZpZWxkRGVjbGFyYXRpb24oY2hhcltdIGFzc2lzdE5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwIHx8IChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQgJiYgKChSZWNvdmVyZWRVbml0KWN1cnJlbnRFbGVtZW50KS50eXBlQ291bnQgPT0gMCkpIHsKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCB8fCAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQgJiYgKChSZWNvdmVyZWRVbml0KXRoaXMuY3VycmVudEVsZW1lbnQpLnR5cGVDb3VudCA9PSAwKSkgewogCQlyZXR1cm4gc3VwZXIuY3JlYXRlRmllbGREZWNsYXJhdGlvbihhc3Npc3ROYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIAl9IGVsc2UgewogCQlDb21wbGV0aW9uT25GaWVsZE5hbWUgZmllbGQgPSBuZXcgQ29tcGxldGlvbk9uRmllbGROYW1lKGFzc2lzdE5hbWUsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwpAQCAtNDM0OCw0ICs0OTYzLDE5IEBACiAJCXJldHVybiBmaWVsZDsKIAl9CiB9CisKKy8qCisgKiBUbyBmaW5kIG91dCBpZiB0aGUgZ2l2ZW4gc3RhY2sgaGFzIGFuIGluc3RhbmNlb2YgZXhwcmVzc2lvbgorICogYXQgdGhlIGdpdmVuIHN0YXJ0SW5kZXggb3IgYXQgb25lIHByaW9yIHRvIHRoYXQKKyAqLworcHJpdmF0ZSBib29sZWFuIHN0YWNrSGFzSW5zdGFuY2VPZkV4cHJlc3Npb24oT2JqZWN0W10gc3RhY2tUb1NlYXJjaCwgaW50IHN0YXJ0SW5kZXgpIHsKKwlpbnQgaW5kZXhJbnN0YW5jZU9mID0gc3RhcnRJbmRleDsKKwl3aGlsZSAoaW5kZXhJbnN0YW5jZU9mID49IDApIHsKKwkJaWYgKHN0YWNrVG9TZWFyY2hbaW5kZXhJbnN0YW5jZU9mXSBpbnN0YW5jZW9mIEluc3RhbmNlT2ZFeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpbmRleEluc3RhbmNlT2YtLTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YQppbmRleCBjZGFmYzc2Li5lNjMyNDZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25TY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uU2Nhbm5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDYgKzIxLDcgQEAKICAqICBuICBtZWFucyBjb21wbGV0aW9uIGJlaGluZCB0aGUgbi10aCBjaGFyYWN0ZXIKICAqLwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVySGVscGVyOwogCkBAIC0yOSw5ICszMCw5IEBACiAJcHVibGljIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllcjsKIAlwdWJsaWMgaW50IGN1cnNvckxvY2F0aW9uOwogCXB1YmxpYyBpbnQgZW5kT2ZFbXB0eVRva2VuID0gLTE7Ci0JCQorCiAJLyogU291cmNlIHBvc2l0aW9ucyBvZiB0aGUgY29tcGxldGVkSWRlbnRpZmllcgotCSAqIGlmIGluc2lkZSBhY3R1YWwgaWRlbnRpZmllciwgZW5kIGdvZXMgdG8gdGhlIGFjdHVhbCBpZGVudGlmaWVyIAorCSAqIGlmIGluc2lkZSBhY3R1YWwgaWRlbnRpZmllciwgZW5kIGdvZXMgdG8gdGhlIGFjdHVhbCBpZGVudGlmaWVyCiAJICogZW5kLCBpbiBvdGhlciB3b3JkcywgYmV5b25kIGN1cnNvciBsb2NhdGlvbgogCSAqLwogCXB1YmxpYyBpbnQgY29tcGxldGVkSWRlbnRpZmllclN0YXJ0ID0gMDsKQEAgLTM5LDE4ICs0MCwxOCBAQAogCXB1YmxpYyBpbnQgdW5pY29kZUNoYXJTaXplOwogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRW1wdHlDb21wbGV0aW9uSWRlbnRpZmllciA9IHt9OwotCQorCiBwdWJsaWMgQ29tcGxldGlvblNjYW5uZXIobG9uZyBzb3VyY2VMZXZlbCkgewogCXN1cGVyKAotCQlmYWxzZSAvKmNvbW1lbnQqLywgCi0JCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKLQkJZmFsc2UgLypubHMqLywgCi0JCXNvdXJjZUxldmVsLCAKLQkJbnVsbCAvKnRhc2tUYWdzKi8sIAorCQlmYWxzZSAvKmNvbW1lbnQqLywKKwkJZmFsc2UgLyp3aGl0ZXNwYWNlKi8sCisJCWZhbHNlIC8qbmxzKi8sCisJCXNvdXJjZUxldmVsLAorCQludWxsIC8qdGFza1RhZ3MqLywKIAkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKIAkJdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiB9Ci0vKiAKKy8qCiAgKiBUcnVuY2F0ZSB0aGUgY3VycmVudCBpZGVudGlmaWVyIGlmIGl0IGlzIGNvbnRhaW5pbmcgdGhlIGN1cnNvciBsb2NhdGlvbi4gU2luY2UgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKICAqIG9uIGFuIGlkZW50aWZpZXIgcHJlZml4LgogICoKQEAgLTYxLDggKzYyLDggQEAKIAkJaWYgKHRoaXMuY3Vyc29yTG9jYXRpb24gPCB0aGlzLnN0YXJ0UG9zaXRpb24gJiYgdGhpcy5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zdGFydFBvc2l0aW9uKXsgLy8gZmFrZSBlbXB0eSBpZGVudGlmaWVyIGdvdCBpc3N1ZWQKIAkJCS8vIHJlbWVtYmVyIGFjdHVhbCBpZGVudGlmaWVyIHBvc2l0aW9ucwogCQkJdGhpcy5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247Ci0JCQl0aGlzLmNvbXBsZXRlZElkZW50aWZpZXJFbmQgPSB0aGlzLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCAtIDE7CQkJCi0JCQlyZXR1cm4gdGhpcy5jb21wbGV0aW9uSWRlbnRpZmllciA9IEVtcHR5Q29tcGxldGlvbklkZW50aWZpZXI7CQkJCQkKKwkJCXRoaXMuY29tcGxldGVkSWRlbnRpZmllckVuZCA9IHRoaXMuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0IC0gMTsKKwkJCXJldHVybiB0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gRW1wdHlDb21wbGV0aW9uSWRlbnRpZmllcjsKIAkJfQogCQlpZiAodGhpcy5jdXJzb3JMb2NhdGlvbisxID49IHRoaXMuc3RhcnRQb3NpdGlvbiAmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pewogCQkJLy8gcmVtZW1iZXIgYWN0dWFsIGlkZW50aWZpZXIgcG9zaXRpb25zCkBAIC03Miw3ICs3Myw3IEBACiAJCQkJaW50IGxlbmd0aCA9IHRoaXMuY3Vyc29yTG9jYXRpb24gKyAxIC0gdGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy51bmljb2RlQ2hhclNpemU7CiAJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAxLCB0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gbmV3IGNoYXJbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKIAkJCX0gZWxzZSB7Ci0JCQkJLy8gbm8gY2hhcltdIHNoYXJpbmcgYXJvdW5kIGNvbXBsZXRpb25JZGVudGlmaWVyLCB3ZSB3YW50IGl0IHRvIGJlIHVuaXF1ZSBzbyBhcyB0byB1c2UgaWRlbnRpdHkgY2hlY2tzCQorCQkJCS8vIG5vIGNoYXJbXSBzaGFyaW5nIGFyb3VuZCBjb21wbGV0aW9uSWRlbnRpZmllciwgd2Ugd2FudCBpdCB0byBiZSB1bmlxdWUgc28gYXMgdG8gdXNlIGlkZW50aXR5IGNoZWNrcwogCQkJCWludCBsZW5ndGggPSB0aGlzLmN1cnNvckxvY2F0aW9uICsgMSAtIHRoaXMuc3RhcnRQb3NpdGlvbjsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLnN0YXJ0UG9zaXRpb24sICh0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gbmV3IGNoYXJbbGVuZ3RoXSksIDAsIGxlbmd0aCk7CiAJCQl9CkBAIC05Miw3ICs5Myw3IEBACiAJCQkJaW50IGxlbmd0aCA9IHRoaXMuY3Vyc29yTG9jYXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLnVuaWNvZGVDaGFyU2l6ZTsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsIDIsIHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPSBuZXcgY2hhcltsZW5ndGhdLCAwLCBsZW5ndGgpOwogCQkJfSBlbHNlIHsKLQkJCQkvLyBubyBjaGFyW10gc2hhcmluZyBhcm91bmQgY29tcGxldGlvbklkZW50aWZpZXIsIHdlIHdhbnQgaXQgdG8gYmUgdW5pcXVlIHNvIGFzIHRvIHVzZSBpZGVudGl0eSBjaGVja3MJCisJCQkJLy8gbm8gY2hhcltdIHNoYXJpbmcgYXJvdW5kIGNvbXBsZXRpb25JZGVudGlmaWVyLCB3ZSB3YW50IGl0IHRvIGJlIHVuaXF1ZSBzbyBhcyB0byB1c2UgaWRlbnRpdHkgY2hlY2tzCiAJCQkJaW50IGxlbmd0aCA9IHRoaXMuY3Vyc29yTG9jYXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uICsgMSwgKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPSBuZXcgY2hhcltsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCX0KQEAgLTEzNSwxMSArMTM2LDExIEBACiAJCQkJCX0KIAkJCQkJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID4gdGhpcy5lb2ZQb3NpdGlvbikgewogCQkJCQkJLyogbWlnaHQgYmUgY29tcGxldGluZyBhdCBlb2YgKGUuZy4gYmVoaW5kIGEgZG90KSAqLwotCQkJCQkJaWYgKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPT0gbnVsbCAmJiAKKwkJCQkJCWlmICh0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID09IG51bGwgJiYKIAkJCQkJCQl0aGlzLnN0YXJ0UG9zaXRpb24gPT0gdGhpcy5jdXJzb3JMb2NhdGlvbiArIDEpewogCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOyAvLyBmb3IgYmVpbmcgZGV0ZWN0ZWQgYXMgZW1wdHkgZnJlZSBpZGVudGlmaWVyCiAJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7Ci0JCQkJCQl9CQorCQkJCQkJfQogCQkJCQkJcmV0dXJuIFRva2VuTmFtZUVPRjsKIAkJCQkJfQogCQkJCX0KQEAgLTE1NCw4ICsxNTUsOCBAQAogCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaXNXaGl0ZVNwYWNlID0gCi0JCQkJCQkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJCWlzV2hpdGVTcGFjZSA9CisJCQkJCQkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsKIAkJCQl9CiAJCQkJaWYgKGlzV2hpdGVTcGFjZSkgewogCQkJCQloYXNXaGl0ZVNwYWNlcyA9IHRydWU7CkBAIC0xNjYsNyArMTY3LDcgQEAKIAkJCQkJJiYgKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPT0gbnVsbCkKIAkJCQkJJiYgKHdoaXRlU3RhcnQgPD0gdGhpcy5jdXJzb3JMb2NhdGlvbisxKQogCQkJCQkmJiAodGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuc3RhcnRQb3NpdGlvbikKLQkJCQkJJiYgIVNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY3VycmVudENoYXJhY3RlcikpeworCQkJCQkmJiAhU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIHRoaXMuY3VycmVudENoYXJhY3RlcikpewogCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsgLy8gZm9yIG5leHQgdG9rZW4gcmVhZAogCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKIAkJCQl9CkBAIC0xODAsMTEgKzE4MSwxMSBAQAogCQkJLy9saXR0bGUgdHJpY2sgdG8gZ2V0IG91dCBpbiB0aGUgbWlkZGxlIG9mIGEgc291cmNlIGNvbXB1dGF0aW9uCiAJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPiB0aGlzLmVvZlBvc2l0aW9uKXsKIAkJCQkvKiBtaWdodCBiZSBjb21wbGV0aW5nIGF0IGVvZiAoZS5nLiBiZWhpbmQgYSBkb3QpICovCi0JCQkJaWYgKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPT0gbnVsbCAmJiAKKwkJCQlpZiAodGhpcy5jb21wbGV0aW9uSWRlbnRpZmllciA9PSBudWxsICYmCiAJCQkJCXRoaXMuc3RhcnRQb3NpdGlvbiA9PSB0aGlzLmN1cnNvckxvY2F0aW9uICsgMSl7CiAJCQkJCS8vIGNvbXB1dGUgZW5kIG9mIGVtcHR5IGlkZW50aWZpZXIuCiAJCQkJCS8vIGlmIHRoZSBlbXB0eSBpZGVudGlmaWVyIGlzIGF0IHRoZSBzdGFydCBvZiBhIG5leHQgdG9rZW4gdGhlIGVuZCBvZgotCQkJCQkvLyBlbXB0eSBpZGVudGlmaWVyIGlzIHRoZSBlbmQgb2YgdGhlIG5leHQgdG9rZW4gKGVnLiAiPGVtcHR5IHRva2VuPm5leHQiKS4KKwkJCQkJLy8gZW1wdHkgaWRlbnRpZmllciBpcyB0aGUgZW5kIG9mIHRoZSBuZXh0IHRva2VuIChlLmcuICI8ZW1wdHkgdG9rZW4+bmV4dCIpLgogCQkJCQlpbnQgdGVtcCA9IHRoaXMuZW9mUG9zaXRpb247CiAJCQkJCXRoaXMuZW9mUG9zaXRpb24gPSB0aGlzLnNvdXJjZS5sZW5ndGg7CiAJCQkJIAl3aGlsZShnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkpey8qZW1wdHkqL30KQEAgLTE5Miw3ICsxOTMsNyBAQAogCQkJCSAJdGhpcy5lbmRPZkVtcHR5VG9rZW4gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uOyAvLyBmb3IgYmVpbmcgZGV0ZWN0ZWQgYXMgZW1wdHkgZnJlZSBpZGVudGlmaWVyCiAJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwotCQkJCX0JCQkJCisJCQkJfQogCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CiAJCQl9CiAKQEAgLTIxOCwxMCArMjE5LDEwIEBACiAJCQkJY2FzZSAnLCcgOgogCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUE7CiAJCQkJY2FzZSAnLicgOgotCQkJCQlpZiAodGhpcy5zdGFydFBvc2l0aW9uIDw9IHRoaXMuY3Vyc29yTG9jYXRpb24gCi0JCQkJCSAgICAmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pewotCQkJCQkgICAgCXJldHVybiBUb2tlbk5hbWVET1Q7IC8vIGNvbXBsZXRpb24gaW5zaWRlIC48fD4xMgotCQkJCSAgICB9CQkJCQkKKwkJCQkJaWYgKHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmN1cnNvckxvY2F0aW9uCisJCQkJCQkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHRoaXMuY3VycmVudFBvc2l0aW9uKXsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVET1Q7IC8vIGNvbXBsZXRpb24gaW5zaWRlIC48fD4xMgorCQkJCQl9CiAJCQkJCWlmIChnZXROZXh0Q2hhckFzRGlnaXQoKSkgewogCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIodHJ1ZSk7CiAJCQkJCX0KQEAgLTM5NSw3ICszOTYsNyBAQAogCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7Ci0JCQkJCQkJICAgIHRoaXMudW5pY29kZVN0b3JlKCk7CisJCQkJCQkJICAgIHVuaWNvZGVTdG9yZSgpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtNDI0LDcgKzQyNSw3IEBACiAJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewotCQkJCQkJCSAgICB0aGlzLnVuaWNvZGVTdG9yZSgpOworCQkJCQkJCSAgICB1bmljb2RlU3RvcmUoKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAKQEAgLTUwNiw3ICs1MDcsNyBAQAogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCWlzVW5pY29kZSA9IGZhbHNlOwogCQkJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7Ci0JCQkJCQkJCSAgICB0aGlzLnVuaWNvZGVTdG9yZSgpOworCQkJCQkJCQkgICAgdW5pY29kZVN0b3JlKCk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAKQEAgLTU0MCw5ICs1NDEsOSBAQAogCQkJCWNhc2UgJy8nIDoKIAkJCQkJewogCQkJCQkJaW50IHRlc3Q7Ci0JCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQKIAkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJdHJ5IHsgLy9nZXQgdGhlIG5leHQgY2hhciAKKwkJCQkJCQl0cnkgeyAvL2dldCB0aGUgbmV4dCBjaGFyCiAJCQkJCQkJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQogCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCkBAIC01NzMsNyArNTc0LDcgQEAKIAkJCQkJCQkJYm9vbGVhbiBpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJd2hpbGUgKHRoaXMuY3VycmVudENoYXJhY3RlciAhPSAnXHInICYmIHRoaXMuY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CiAJCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgogCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKQEAgLTY3NSw2ICs2NzYsNyBAQAogCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIKIAkJCQkJCQkJYm9vbGVhbiBpc0phdmFkb2MgPSBmYWxzZSwgc3RhciA9IGZhbHNlOwogCQkJCQkJCQlib29sZWFuIGlzVW5pY29kZSA9IGZhbHNlOworCQkJCQkJCQlpbnQgcHJldmlvdXM7CiAJCQkJCQkJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKIAkJCQkJCQkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCkBAIC02ODQsMTAgKzY4NiwxMCBAQAogCQkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7Ci0JCQkJCQkJCQkgICAgdGhpcy51bmljb2RlU3RvcmUoKTsKKwkJCQkJCQkJCSAgICB1bmljb2RlU3RvcmUoKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQorCiAJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSB0cnVlOwogCQkJCQkJCQkJc3RhciA9IHRydWU7CkBAIC03MDEsNiArNzAzLDcgQEAKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQkJcHJldmlvdXMgPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KQEAgLTcxNSwxMCArNzE4LDExIEBACiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJfSAvL2p1bXAgb3ZlciB0aGUgXFwKIAkJCQkJCQkJLy8gZW1wdHkgY29tbWVudCBpcyBub3QgYSBqYXZhZG9jIC8qKi8KLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKIAkJCQkJCQkJfQotCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8gCisJCQkJCQkJCS8vbG9vcCB1bnRpbCBlbmQgb2YgY29tbWVudCAqLworCQkJCQkJCQlpbnQgZmlyc3RUYWcgPSAwOwogCQkJCQkJCQl3aGlsZSAoKHRoaXMuY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsKIAkJCQkJCQkJCWlmICgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKIAkJCQkJCQkJCQkvL2NoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nKCk7CkBAIC03MjcsOSArNzMxLDIxIEBACiAJCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOwogCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQkJCQkJCQkJCQorCQkJCQkJCQkJc3dpdGNoICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQkJCQkJCQljYXNlICcqJzoKKwkJCQkJCQkJCQkJc3RhciA9IHRydWU7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgJ0AnOgorCQkJCQkJCQkJCQlpZiAoZmlyc3RUYWcgPT0gMCAmJiB0aGlzLmlzRmlyc3RUYWcoKSkgeworCQkJCQkJCQkJCQkJZmlyc3RUYWcgPSBwcmV2aW91czsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkvLyRGQUxMLVRIUk9VR0gkIGRlZmF1bHQgY2FzZSB0byBzZXQgc3RhciB0byBmYWxzZQorCQkJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkJCXN0YXIgPSBmYWxzZTsKIAkJCQkJCQkJCX0KLQkJCQkJCQkJCXN0YXIgPSB0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonOwotCQkJCQkJCQkJLy9nZXQgbmV4dCBjaGFyCisgCQkJCQkJCQkJLy9nZXQgbmV4dCBjaGFyCisJCQkJCQkJCQlwcmV2aW91cyA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQpAQCAtNzQ2LDYgKzc2Miw3IEBACiAJCQkJCQkJCX0KIAkJCQkJCQkJaW50IHRva2VuID0gaXNKYXZhZG9jID8gVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDogVG9rZW5OYW1lQ09NTUVOVF9CTE9DSzsKIAkJCQkJCQkJcmVjb3JkQ29tbWVudCh0b2tlbik7CisJCQkJCQkJCXRoaXMuY29tbWVudFRhZ1N0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gZmlyc3RUYWc7CiAJCQkJCQkJCWlmICghaXNKYXZhZG9jICYmIHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmN1cnNvckxvY2F0aW9uICYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCB0aGlzLmN1cnJlbnRQb3NpdGlvbi0xKXsKIAkJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkQ3Vyc29yTG9jYXRpb24oSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX0NPTU1FTlQpOwogCQkJCQkJCQl9CkBAIC03NzUsNyArNzkyLDM5IEBACiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oIkN0cmwtWiIpOyAvLyROT04tTkxTLTEkCiAKIAkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY3VycmVudENoYXJhY3RlcikpCisJCQkJCWNoYXIgYyA9IHRoaXMuY3VycmVudENoYXJhY3RlcjsKKwkJCQkJaWYgKGMgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7CisJCQkJCQlpZiAoKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbY10gJiBTY2FubmVySGVscGVyLkNfSURFTlRfU1RBUlQpICE9IDApIHsKKwkJCQkJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJCX0gZWxzZSBpZiAoKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbY10gJiBTY2FubmVySGVscGVyLkNfRElHSVQpICE9IDApIHsKKwkJCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIoZmFsc2UpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYm9vbGVhbiBpc0phdmFJZFN0YXJ0OworCQkJCQlpZiAoYyA+PSBISUdIX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBISUdIX1NVUlJPR0FURV9NQVhfVkFMVUUpIHsKKwkJCQkJCWlmICh0aGlzLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJfQorCQkJCQkJLy8gVW5pY29kZSA0IGRldGVjdGlvbgorCQkJCQkJY2hhciBsb3cgPSAoY2hhcikgZ2V0TmV4dENoYXIoKTsKKwkJCQkJCWlmIChsb3cgPCBMT1dfU1VSUk9HQVRFX01JTl9WQUxVRSB8fCBsb3cgPiBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgeworCQkJCQkJCS8vIGlsbGVnYWwgbG93IHN1cnJvZ2F0ZQorCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9MT1dfU1VSUk9HQVRFKTsKKwkJCQkJCX0KKwkJCQkJCWlzSmF2YUlkU3RhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgYywgbG93KTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChjID49IExPV19TVVJST0dBVEVfTUlOX1ZBTFVFICYmIGMgPD0gTE9XX1NVUlJPR0FURV9NQVhfVkFMVUUpIHsKKwkJCQkJCWlmICh0aGlzLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJfQorCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hJR0hfU1VSUk9HQVRFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIG9wdGltaXplZCBjYXNlIGFscmVhZHkgY2hlY2tlZAorCQkJCQkJaXNKYXZhSWRTdGFydCA9IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7CisJCQkJCX0KKwkJCQkJaWYgKGlzSmF2YUlkU3RhcnQpCiAJCQkJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKIAkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CiAJCQkJCQlyZXR1cm4gc2Nhbk51bWJlcihmYWxzZSk7CkBAIC03OTMsNyArODQyLDcgQEAKIAkJfQogCX0KIAkvKiBtaWdodCBiZSBjb21wbGV0aW5nIGF0IHZlcnkgZW5kIG9mIGZpbGUgKGUuZy4gYmVoaW5kIGEgZG90KSAqLwotCWlmICh0aGlzLmNvbXBsZXRpb25JZGVudGlmaWVyID09IG51bGwgJiYgCisJaWYgKHRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPT0gbnVsbCAmJgogCQl0aGlzLnN0YXJ0UG9zaXRpb24gPT0gdGhpcy5jdXJzb3JMb2NhdGlvbiArIDEpewogCQl0aGlzLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsgLy8gZm9yIGJlaW5nIGRldGVjdGVkIGFzIGVtcHR5IGZyZWUgaWRlbnRpZmllcgogCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKQEAgLTgxMCwyMCArODU5LDMzIEBACiAJCXRocm93IG5ldyBJbnZhbGlkQ3Vyc29yTG9jYXRpb24oSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX1VOSUNPREUpOwogCX0KIH0KK3Byb3RlY3RlZCBib29sZWFuIGlzRmlyc3RUYWcoKSB7CisJcmV0dXJuCisJCWdldE5leHRDaGFyKCdkJykgJiYKKwkJZ2V0TmV4dENoYXIoJ2UnKSAmJgorCQlnZXROZXh0Q2hhcigncCcpICYmCisJCWdldE5leHRDaGFyKCdyJykgJiYKKwkJZ2V0TmV4dENoYXIoJ2UnKSAmJgorCQlnZXROZXh0Q2hhcignYycpICYmCisJCWdldE5leHRDaGFyKCdhJykgJiYKKwkJZ2V0TmV4dENoYXIoJ3QnKSAmJgorCQlnZXROZXh0Q2hhcignZScpICYmCisJCWdldE5leHRDaGFyKCdkJyk7Cit9CiBwdWJsaWMgZmluYWwgdm9pZCBqdW1wT3ZlckJsb2NrKCkgewotCXRoaXMuanVtcE92ZXJNZXRob2RCb2R5KCk7CisJanVtcE92ZXJNZXRob2RCb2R5KCk7CiB9CiAvLy8qCiAvLyAqIEluIGNhc2Ugd2UgYWN0dWFsbHkgcmVhZCBhIGtleXdvcmQsIGJ1dCB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQgaW5zaWRlLAogLy8gKiB3ZSBwcmV0ZW5kIHdlIHJlYWQgYW4gaWRlbnRpZmllci4KIC8vICovCiBwdWJsaWMgaW50IHNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKCkgewotCQorCiAJaW50IGlkID0gc3VwZXIuc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKIAotCWlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jdXJzb3JMb2NhdGlvbisxIAorCWlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jdXJzb3JMb2NhdGlvbisxCiAJCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pewotCQkKKwogCQkvLyBleHRlbmRzIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gdG9rZW4gZXZlbiBpZiB0aGUgZW5kIGlzIGFmdGVyIGVvZlBvc2l0aW9uCiAJCWlmICh0aGlzLmN1cnNvckxvY2F0aW9uKzEgPT0gdGhpcy5lb2ZQb3NpdGlvbikgewogCQkJaW50IHRlbXAgPSB0aGlzLmVvZlBvc2l0aW9uOwpAQCAtODM4LDExICs5MDAsMTEgQEAKIH0KIAogcHVibGljIGludCBzY2FuTnVtYmVyKGJvb2xlYW4gZG90UHJlZml4KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkKKwogCWludCB0b2tlbiA9IHN1cGVyLnNjYW5OdW1iZXIoZG90UHJlZml4KTsKIAogCS8vIGNvbnNpZGVyIGNvbXBsZXRpb24ganVzdCBiZWZvcmUgYSBudW1iZXIgdG8gYmUgb2ssIHdpbGwgaW5zZXJ0IGJlZm9yZSBpdAotCWlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jdXJzb3JMb2NhdGlvbiAmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24peyAgCisJaWYgKHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmN1cnNvckxvY2F0aW9uICYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCB0aGlzLmN1cnJlbnRQb3NpdGlvbil7CiAJCXRocm93IG5ldyBJbnZhbGlkQ3Vyc29yTG9jYXRpb24oSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX05VTUJFUik7CiAJfQogCXJldHVybiB0b2tlbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvSW52YWxpZEN1cnNvckxvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0ludmFsaWRDdXJzb3JMb2NhdGlvbi5qYXZhCmluZGV4IDg5Mjg5NDQuLjYxODBlMmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvSW52YWxpZEN1cnNvckxvY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9JbnZhbGlkQ3Vyc29yTG9jYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09NUExFVElPTl9JTlNJREVfTlVNQkVSID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIE51bWJlciI7ICAgICAgICAvLyROT04tTkxTLTEkCiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ0MzE2MDcyNTczNTc3OTU5MEw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogcHVibGljIEludmFsaWRDdXJzb3JMb2NhdGlvbihTdHJpbmcgaXJyaXRhbnQpewogCXRoaXMuaXJyaXRhbnQgPSBpcnJpdGFudDsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RBbm5vdGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2UwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworCitwdWJsaWMgY2xhc3MgQXNzaXN0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24geworCXByaXZhdGUgTWFwIGluZm9DYWNoZTsKKwlwdWJsaWMgQXNzaXN0QW5ub3RhdGlvbihKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lLCBNYXAgaW5mb0NhY2hlKSB7CisJCXN1cGVyKHBhcmVudCwgbmFtZSk7CisJCXRoaXMuaW5mb0NhY2hlID0gaW5mb0NhY2hlOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0Q29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0Q29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlZTBiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnRJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudDsKKworcHVibGljIGNsYXNzIEFzc2lzdENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIENvbXBpbGF0aW9uVW5pdCB7CisJcHJpdmF0ZSBNYXAgaW5mb0NhY2hlOworCXByaXZhdGUgTWFwIGJpbmRpbmdDYWNoZTsKKwlwdWJsaWMgQXNzaXN0Q29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBXb3JraW5nQ29weU93bmVyIG93bmVyLCBNYXAgYmluZGluZ0NhY2hlLCBNYXAgaW5mb0NhY2hlKSB7CisJCXN1cGVyKChQYWNrYWdlRnJhZ21lbnQpY29tcGlsYXRpb25Vbml0LmdldFBhcmVudCgpLCBjb21waWxhdGlvblVuaXQuZ2V0RWxlbWVudE5hbWUoKSwgb3duZXIpOworCQl0aGlzLmJpbmRpbmdDYWNoZSA9IGJpbmRpbmdDYWNoZTsKKwkJdGhpcy5pbmZvQ2FjaGUgPSBpbmZvQ2FjaGU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50SW5mbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5pbmZvQ2FjaGUuZ2V0KHRoaXMpOworCX0KKworCXB1YmxpYyBJSW1wb3J0Q29udGFpbmVyIGdldEltcG9ydENvbnRhaW5lcigpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RJbXBvcnRDb250YWluZXIodGhpcywgdGhpcy5pbmZvQ2FjaGUpOworCX0KKworCXB1YmxpYyBJUGFja2FnZURlY2xhcmF0aW9uIGdldFBhY2thZ2VEZWNsYXJhdGlvbihTdHJpbmcgcGtnKSB7CisJCXJldHVybiBuZXcgQXNzaXN0UGFja2FnZURlY2xhcmF0aW9uKHRoaXMsIHBrZywgdGhpcy5pbmZvQ2FjaGUpOworCX0KKworCXB1YmxpYyBJVHlwZSBnZXRUeXBlKFN0cmluZyB0eXBlTmFtZSkgeworCQlyZXR1cm4gbmV3IEFzc2lzdFNvdXJjZVR5cGUodGhpcywgdHlwZU5hbWUsIHRoaXMuYmluZGluZ0NhY2hlLCB0aGlzLmluZm9DYWNoZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKXRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwkJcmV0dXJuIGluZm8uZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RJbXBvcnRDb250YWluZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RJbXBvcnRDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZjNzcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdEltcG9ydENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkltcG9ydENvbnRhaW5lcjsKKworcHVibGljIGNsYXNzIEFzc2lzdEltcG9ydENvbnRhaW5lciBleHRlbmRzIEltcG9ydENvbnRhaW5lciB7CisJcHJpdmF0ZSBNYXAgaW5mb0NhY2hlOworCXB1YmxpYyBBc3Npc3RJbXBvcnRDb250YWluZXIoQ29tcGlsYXRpb25Vbml0IHBhcmVudCwgTWFwIGluZm9DYWNoZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmluZm9DYWNoZSA9IGluZm9DYWNoZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRJbmZvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmluZm9DYWNoZS5nZXQodGhpcyk7CisJfQorCisJcHJvdGVjdGVkIElJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gaXNPbkRlbWFuZCkgeworCQlyZXR1cm4gbmV3IEFzc2lzdEltcG9ydERlY2xhcmF0aW9uKHRoaXMsIGltcG9ydE5hbWUsIGlzT25EZW1hbmQsIHRoaXMuaW5mb0NhY2hlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0SW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RJbXBvcnREZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2UyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0SW1wb3J0RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSW1wb3J0Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkltcG9ydERlY2xhcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQXNzaXN0SW1wb3J0RGVjbGFyYXRpb24gZXh0ZW5kcyBJbXBvcnREZWNsYXJhdGlvbiB7CisJcHJpdmF0ZSBNYXAgaW5mb0NhY2hlOworCXB1YmxpYyBBc3Npc3RJbXBvcnREZWNsYXJhdGlvbihJbXBvcnRDb250YWluZXIgcGFyZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc09uRGVtYW5kLCBNYXAgaW5mb0NhY2hlKSB7CisJCXN1cGVyKHBhcmVudCwgbmFtZSwgaXNPbkRlbWFuZCk7CisJCXRoaXMuaW5mb0NhY2hlID0gaW5mb0NhY2hlOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0SW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTA2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0SW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKKwlwcml2YXRlIE1hcCBiaW5kaW5nQ2FjaGU7CisJcHJpdmF0ZSBNYXAgaW5mb0NhY2hlOworCXB1YmxpYyBBc3Npc3RJbml0aWFsaXplcihKYXZhRWxlbWVudCBwYXJlbnQsIGludCBjb3VudCwgTWFwIGJpbmRpbmdDYWNoZSwgTWFwIGluZm9DYWNoZSkgeworCQlzdXBlcihwYXJlbnQsIGNvdW50KTsKKwkJdGhpcy5iaW5kaW5nQ2FjaGUgPSBiaW5kaW5nQ2FjaGU7CisJCXRoaXMuaW5mb0NhY2hlID0gaW5mb0NhY2hlOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUsIGludCBjb3VudCkgeworCQlBc3Npc3RTb3VyY2VUeXBlIHR5cGUgPSBuZXcgQXNzaXN0U291cmNlVHlwZSh0aGlzLCB0eXBlTmFtZSwgdGhpcy5iaW5kaW5nQ2FjaGUsIHRoaXMuaW5mb0NhY2hlKTsKKwkJdHlwZS5vY2N1cnJlbmNlQ291bnQgPSBjb3VudDsKKwkJcmV0dXJuIHR5cGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdE9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RPcHRpb25zLmphdmEKaW5kZXggODIxMDNlOC4uNmRhNjM3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdE9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0T3B0aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDYgKzI4LDggQEAKIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU3RhdGljRmllbGRQcmVmaXhlcyA9CiAJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcyI7IAkvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1N0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcyA9CisJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fTG9jYWxQcmVmaXhlcyA9CiAJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcyI7IAkvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0FyZ3VtZW50UHJlZml4ZXMgPQpAQCAtMzYsNiArMzgsOCBAQAogCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXMiOyAJLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TdGF0aWNGaWVsZFN1ZmZpeGVzID0KIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXMiOyAJLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Mb2NhbFN1ZmZpeGVzID0KIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fQXJndW1lbnRTdWZmaXhlcyA9CkBAIC00OCwxMCArNTIsMTAgQEAKIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5jYW1lbENhc2VNYXRjaCI7IAkvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1N1Z2dlc3RTdGF0aWNJbXBvcnRzID0KIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdWdnZXN0U3RhdGljSW1wb3J0cyI7IAkvLyROT04tTkxTLTEkCi0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCisKIAlwdWJsaWMgYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKIAlwdWJsaWMgYm9vbGVhbiBjaGVja0RlcHJlY2F0aW9uID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gY2hlY2tGb3JiaWRkZW5SZWZlcmVuY2UgPSBmYWxzZTsKQEAgLTYxLDIxICs2NSwyMyBAQAogCXB1YmxpYyBib29sZWFuIHN1Z2dlc3RTdGF0aWNJbXBvcnQgPSB0cnVlOwogCXB1YmxpYyBjaGFyW11bXSBmaWVsZFByZWZpeGVzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gc3RhdGljRmllbGRQcmVmaXhlcyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIHN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcyA9IG51bGw7CiAJcHVibGljIGNoYXJbXVtdIGxvY2FsUHJlZml4ZXMgPSBudWxsOwogCXB1YmxpYyBjaGFyW11bXSBhcmd1bWVudFByZWZpeGVzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gZmllbGRTdWZmaXhlcyA9IG51bGw7CiAJcHVibGljIGNoYXJbXVtdIHN0YXRpY0ZpZWxkU3VmZml4ZXMgPSBudWxsOworCXB1YmxpYyBjaGFyW11bXSBzdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXMgPSBudWxsOwogCXB1YmxpYyBjaGFyW11bXSBsb2NhbFN1ZmZpeGVzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gYXJndW1lbnRTdWZmaXhlcyA9IG51bGw7CiAKLQkvKiogCisJLyoqCiAJICogSW5pdGlhbGl6aW5nIHRoZSBhc3Npc3Qgb3B0aW9ucyB3aXRoIGRlZmF1bHQgc2V0dGluZ3MKIAkgKi8KIAlwdWJsaWMgQXNzaXN0T3B0aW9ucygpIHsKIAkJLy8gSW5pdGlhbGl6aW5nIHRoZSBhc3Npc3Qgb3B0aW9ucyB3aXRoIGRlZmF1bHQgc2V0dGluZ3MKIAl9CiAKLQkvKiogCisJLyoqCiAJICogSW5pdGlhbGl6aW5nIHRoZSBhc3Npc3Qgb3B0aW9ucyB3aXRoIGV4dGVybmFsIHNldHRpbmdzCiAJICovCiAJcHVibGljIEFzc2lzdE9wdGlvbnMoTWFwIHNldHRpbmdzKSB7CkBAIC0xMDUsNyArMTExLDcgQEAKIAkJCWlmIChvcHRpb25WYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewogCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9wdGlvblZhbHVlOwogCQkJCWlmIChzdHJpbmdWYWx1ZS5sZW5ndGgoKSA+IDApewotCQkJCQl0aGlzLmZpZWxkUHJlZml4ZXMgPSB0aGlzLnNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJCXRoaXMuZmllbGRQcmVmaXhlcyA9IHNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhpcy5maWVsZFByZWZpeGVzID0gbnVsbDsKIAkJCQl9CkBAIC0xMTUsMTcgKzEyMSwyNyBAQAogCQkJaWYgKG9wdGlvblZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgb3B0aW9uVmFsdWU7CiAJCQkJaWYgKHN0cmluZ1ZhbHVlLmxlbmd0aCgpID4gMCl7Ci0JCQkJCXRoaXMuc3RhdGljRmllbGRQcmVmaXhlcyA9IHRoaXMuc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQkJdGhpcy5zdGF0aWNGaWVsZFByZWZpeGVzID0gc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLnN0YXRpY0ZpZWxkUHJlZml4ZXMgPSBudWxsOwogCQkJCX0KIAkJCX0KIAkJfQorCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1N0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcykpICE9IG51bGwpIHsKKwkJCWlmIChvcHRpb25WYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9wdGlvblZhbHVlOworCQkJCWlmIChzdHJpbmdWYWx1ZS5sZW5ndGgoKSA+IDApeworCQkJCQl0aGlzLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcyA9IHNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXMgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfQogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX0xvY2FsUHJlZml4ZXMpKSAhPSBudWxsKSB7CiAJCQlpZiAob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKIAkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKIAkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAwKXsKLQkJCQkJdGhpcy5sb2NhbFByZWZpeGVzID0gdGhpcy5zcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCQl0aGlzLmxvY2FsUHJlZml4ZXMgPSBzcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMubG9jYWxQcmVmaXhlcyA9IG51bGw7CiAJCQkJfQpAQCAtMTM1LDcgKzE1MSw3IEBACiAJCQlpZiAob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKIAkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKIAkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAwKXsKLQkJCQkJdGhpcy5hcmd1bWVudFByZWZpeGVzID0gdGhpcy5zcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCQl0aGlzLmFyZ3VtZW50UHJlZml4ZXMgPSBzcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMuYXJndW1lbnRQcmVmaXhlcyA9IG51bGw7CiAJCQkJfQpAQCAtMTQ1LDcgKzE2MSw3IEBACiAJCQlpZiAob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKIAkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKIAkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAwKXsKLQkJCQkJdGhpcy5maWVsZFN1ZmZpeGVzID0gdGhpcy5zcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCQl0aGlzLmZpZWxkU3VmZml4ZXMgPSBzcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMuZmllbGRTdWZmaXhlcyA9IG51bGw7CiAJCQkJfQpAQCAtMTU1LDE3ICsxNzEsMjcgQEAKIAkJCWlmIChvcHRpb25WYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewogCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9wdGlvblZhbHVlOwogCQkJCWlmIChzdHJpbmdWYWx1ZS5sZW5ndGgoKSA+IDApewotCQkJCQl0aGlzLnN0YXRpY0ZpZWxkU3VmZml4ZXMgPSB0aGlzLnNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJCXRoaXMuc3RhdGljRmllbGRTdWZmaXhlcyA9IHNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhpcy5zdGF0aWNGaWVsZFN1ZmZpeGVzID0gbnVsbDsKIAkJCQl9CiAJCQl9CiAJCX0KKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9TdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXMpKSAhPSBudWxsKSB7CisJCQlpZiAob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKKwkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPiAwKXsKKwkJCQkJdGhpcy5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXMgPSBzcGxpdEFuZFRyaW1PbignLCcsIHN0cmluZ1ZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9Mb2NhbFN1ZmZpeGVzKSkgIT0gbnVsbCkgewogCQkJaWYgKG9wdGlvblZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgb3B0aW9uVmFsdWU7CiAJCQkJaWYgKHN0cmluZ1ZhbHVlLmxlbmd0aCgpID4gMCl7Ci0JCQkJCXRoaXMubG9jYWxTdWZmaXhlcyA9IHRoaXMuc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQkJdGhpcy5sb2NhbFN1ZmZpeGVzID0gc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLmxvY2FsU3VmZml4ZXMgPSBudWxsOwogCQkJCX0KQEAgLTE3NSw3ICsyMDEsNyBAQAogCQkJaWYgKG9wdGlvblZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgb3B0aW9uVmFsdWU7CiAJCQkJaWYgKHN0cmluZ1ZhbHVlLmxlbmd0aCgpID4gMCl7Ci0JCQkJCXRoaXMuYXJndW1lbnRTdWZmaXhlcyA9IHRoaXMuc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQkJdGhpcy5hcmd1bWVudFN1ZmZpeGVzID0gc3BsaXRBbmRUcmltT24oJywnLCBzdHJpbmdWYWx1ZS50b0NoYXJBcnJheSgpKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLmFyZ3VtZW50U3VmZml4ZXMgPSBudWxsOwogCQkJCX0KQEAgLTIxNywxMiArMjQzLDEyIEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGNoYXJbXVtdIHNwbGl0QW5kVHJpbU9uKGNoYXIgZGl2aWRlciwgY2hhcltdIGFycmF5VG9TcGxpdCkgewogCQljaGFyW11bXSByZXN1bHQgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgYXJyYXlUb1NwbGl0KTsKLQkJCisKIAkJaW50IGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCQorCiAJCWludCByZXN1bHRDb3VudCA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWlmKHJlc3VsdFtpXS5sZW5ndGggIT0gMCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRGVjbGFyYXRpb247CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RQYWNrYWdlRGVjbGFyYXRpb24gZXh0ZW5kcyBQYWNrYWdlRGVjbGFyYXRpb24geworCXByaXZhdGUgTWFwIGluZm9DYWNoZTsKKwlwdWJsaWMgQXNzaXN0UGFja2FnZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBwYXJlbnQsIFN0cmluZyBuYW1lLCBNYXAgaW5mb0NhY2hlKSB7CisJCXN1cGVyKHBhcmVudCwgbmFtZSk7CisJCXRoaXMuaW5mb0NhY2hlID0gaW5mb0NhY2hlOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmV3IEFzc2lzdEFubm90YXRpb24odGhpcywgbmFtZSwgdGhpcy5pbmZvQ2FjaGUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YQppbmRleCAzNjE5NjNlLi5mZTUxZWRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzMsNyArMzMsOSBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFzc2lzdFBhcnNlciBleHRlbmRzIFBhcnNlciB7CiAJcHVibGljIEFTVE5vZGUgYXNzaXN0Tm9kZTsKIAlwdWJsaWMgYm9vbGVhbiBpc09ycGhhbkNvbXBsZXRpb25Ob2RlOwotCQkKKwkvLyBsYXN0IG1vZGlmaWVycyBpbmZvCisJcHJvdGVjdGVkIGludCBsYXN0TW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7CisJcHJvdGVjdGVkIGludCBsYXN0TW9kaWZpZXJzU3RhcnQgPSAtMTsKIAkvKiByZWNvdmVyeSAqLwogCWludFtdIGJsb2NrU3RhcnRzID0gbmV3IGludFszMF07CiAKQEAgLTQzLDE3ICs0NSwyMiBAQAogCS8vIHRoZSBpbmRleCBpbiB0aGUgaWRlbnRpZmllciBzdGFjayBvZiB0aGUgcHJldmlvdXMgaWRlbnRpZmllcgogCXByb3RlY3RlZCBpbnQgcHJldmlvdXNJZGVudGlmaWVyUHRyOwogCQorCS8vIGRlcHRoIG9mICcoJywgJ3snIGFuZCAnW10nCisJcHJvdGVjdGVkIGludCBicmFja2V0RGVwdGg7CisKIAkvLyBlbGVtZW50IHN0YWNrCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRWxlbWVudFN0YWNrSW5jcmVtZW50ID0gMTAwOwogCXByb3RlY3RlZCBpbnQgZWxlbWVudFB0cjsKIAlwcm90ZWN0ZWQgaW50W10gZWxlbWVudEtpbmRTdGFjayA9IG5ldyBpbnRbRWxlbWVudFN0YWNrSW5jcmVtZW50XTsKIAlwcm90ZWN0ZWQgaW50W10gZWxlbWVudEluZm9TdGFjayA9IG5ldyBpbnRbRWxlbWVudFN0YWNrSW5jcmVtZW50XTsKKwlwcm90ZWN0ZWQgT2JqZWN0W10gZWxlbWVudE9iamVjdEluZm9TdGFjayA9IG5ldyBPYmplY3RbRWxlbWVudFN0YWNrSW5jcmVtZW50XTsKIAlwcm90ZWN0ZWQgaW50IHByZXZpb3VzS2luZDsKIAlwcm90ZWN0ZWQgaW50IHByZXZpb3VzSW5mbzsKLQkKKwlwcm90ZWN0ZWQgT2JqZWN0IHByZXZpb3VzT2JqZWN0SW5mbzsKKwogCS8vIE9XTkVSCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVNTSVNUX1BBUlNFUiA9IDUxMjsKLQkKKwogCS8vIEtJTkQgOiBhbGwgdmFsdWVzIGtub3duIGJ5IEFzc2lzdFBhcnNlciBhcmUgYmV0d2VlbiA1MTMgYW5kIDEwMjMKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX1NFTEVDVE9SID0gQVNTSVNUX1BBUlNFUiArIDE7IC8vIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIG1lc3NhZ2Ugc2VuZAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfVFlQRV9ERUxJTUlURVIgPSBBU1NJU1RfUEFSU0VSICsgMjsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgdHlwZSBkZWNsYXJhdGlvbgpAQCAtNjEsMjUgKzY4LDQwIEBACiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIgPSBBU1NJU1RfUEFSU0VSICsgNDsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0FUVFJJQlVURV9WQUxVRV9ERUxJTUlURVIgPSBBU1NJU1RfUEFSU0VSICsgNTsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgYW5ub3RhdGlvbiBhdHRyaWJ1dGUgdmFsdWVyCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19FTlVNX0NPTlNUQU5UX0RFTElNSVRFUiA9IEFTU0lTVF9QQVJTRVIgKyA2OyAvLyB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgYSBmaWVsZCBpbml0aWFsaXplcgotCQorCiAJLy8gc2VsZWN0b3IgY29uc3RhbnRzCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEhJU19DT05TVFJVQ1RPUiA9IC0xOwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNVUEVSX0NPTlNUUlVDVE9SID0gLTI7Ci0JCisKIAkvLyBlbnVtIGNvbnN0YW50IGNvbnN0YW50cwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PX0JPRFkgPSAwOwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdJVEhfQk9EWSA9IDE7Ci0JCisKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0ID0gZmFsc2U7CiAKIHB1YmxpYyBBc3Npc3RQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgewogCXN1cGVyKHByb2JsZW1SZXBvcnRlciwgdHJ1ZSk7CiAJdGhpcy5qYXZhZG9jUGFyc2VyLmNoZWNrRG9jQ29tbWVudCA9IGZhbHNlOwotCQotCXRoaXMuc2V0TWV0aG9kc0Z1bGxSZWNvdmVyeShmYWxzZSk7Ci0JdGhpcy5zZXRTdGF0ZW1lbnRzUmVjb3ZlcnkoZmFsc2UpOworCisJc2V0TWV0aG9kc0Z1bGxSZWNvdmVyeShmYWxzZSk7CisJc2V0U3RhdGVtZW50c1JlY292ZXJ5KGZhbHNlKTsKIH0KIHB1YmxpYyBhYnN0cmFjdCBjaGFyW10gYXNzaXN0SWRlbnRpZmllcigpOworCisvKioKKyAqIFRoZSBwYXJzZXIgYmVjb21lIGEgc2ltcGxlIHBhcnNlciB3aGljaCBiZWhhdmUgbGlrZSBhIFBhcnNlcgorICogQHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIGFzc2lzdCBwYXJzZXIgdG8gYmUgYWJsZSB0byByZXN0b3JlIHRoZSBhc3Npc3QgcGFyc2VyIHN0YXRlCisgKi8KK3B1YmxpYyBPYmplY3QgYmVjb21lU2ltcGxlUGFyc2VyKCkgeworCXJldHVybiBudWxsOworfQorLyoqCisgKiBSZXN0b3JlIHRoZSBwYXJzZXIgYXMgYW4gYXNzaXN0IHBhcnNlcgorICogQHBhcmFtIHBhcnNlclN0YXRlCisgKi8KK3B1YmxpYyB2b2lkIHJlc3RvcmVBc3Npc3RQYXJzZXIoT2JqZWN0IHBhcnNlclN0YXRlKSB7CisJLy9EbyBub3RoaW5nCit9CiBwdWJsaWMgaW50IGJvZHlFbmQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpewogCXJldHVybiBtZXRob2QuYm9keUVuZDsKIH0KQEAgLTkyLDcgKzExNCw3IEBACiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGJ1aWxkSW5pdGlhbFJlY292ZXJ5U3RhdGUoKXsKIAkvKiByZWNvdmVyeSBpbiB1bml0IHN0cnVjdHVyZSAqLwotCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24peworCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbil7CiAJCVJlY292ZXJlZEVsZW1lbnQgZWxlbWVudCA9IHN1cGVyLmJ1aWxkSW5pdGlhbFJlY292ZXJ5U3RhdGUoKTsKIAkJZmx1c2hBc3Npc3RTdGF0ZSgpOwogCQlmbHVzaEVsZW1lbnRTdGFjaygpOwpAQCAtMTAwLDY3ICsxMjIsNjkgQEAKIAl9CiAKIAkvKiByZWNvdmVyeSBpbiBtZXRob2QgYm9keSAqLwotCWxhc3RDaGVja1BvaW50ID0gMDsKKwl0aGlzLmxhc3RDaGVja1BvaW50ID0gMDsKIAogCVJlY292ZXJlZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKLQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQsIG51bGwsIDAsIHRoaXMpOwotCQlsYXN0Q2hlY2tQb2ludCA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCkuYm9keVN0YXJ0OworCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKKwkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCwgbnVsbCwgMCwgdGhpcyk7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCkuYm9keVN0YXJ0OwogCX0gZWxzZSB7CiAJCS8qIEluaXRpYWxpemVyIGJvZGllcyBhcmUgcGFyc2VkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0eXBlIGRlY2xhcmF0aW9uLCB3ZSBtdXN0IHRodXMgc2VhcmNoIGl0IGluc2lkZSAqLwotCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbil7Ci0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsKLQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdHlwZS5maWVsZHNbaV07CQkJCQkKKwkJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbil7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dDsKKwkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlLmZpZWxkczsKKwkJCWludCBsZW5ndGggPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKIAkJCQlpZiAoZmllbGQgIT0gbnVsbAogCQkJCQkJJiYgZmllbGQuZ2V0S2luZCgpID09IEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUgotCQkJCQkJJiYgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSBzY2FubmVyLmluaXRpYWxQb3NpdGlvbgotCQkJCQkJJiYgc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQKLQkJCQkJCSYmIHNjYW5uZXIuZW9mUG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMSl7CisJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb24KKwkJCQkJCSYmIHRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQKKwkJCQkJCSYmIHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsKIAkJCQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRJbml0aWFsaXplcihmaWVsZCwgbnVsbCwgMSwgdGhpcyk7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsJCQkJCQorCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQl9IAorCQl9CiAJfQogCiAJaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGVsZW1lbnQ7CiAKIAkvKiBhZGQgaW5pdGlhbCBibG9jayAqLwogCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOwotCWludCBsYXN0U3RhcnQgPSBibG9ja1N0YXJ0c1swXTsKKwlpbnQgbGFzdFN0YXJ0ID0gdGhpcy5ibG9ja1N0YXJ0c1swXTsKIAlibG9jay5zb3VyY2VTdGFydCA9IGxhc3RTdGFydDsKIAllbGVtZW50ID0gZWxlbWVudC5hZGQoYmxvY2ssIDEpOwogCWludCBibG9ja0luZGV4ID0gMTsJLy8gaWdub3JlIGZpcnN0IGJsb2NrIHN0YXJ0LCBzaW5jZSBtYW51YWxseSByZWJ1aWx0IGhlcmUKIAotCWZvcihpbnQgaSA9IDA7IGkgPD0gYXN0UHRyOyBpKyspewotCQlBU1ROb2RlIG5vZGUgPSBhc3RTdGFja1tpXTsKLQkJCisJZm9yKGludCBpID0gMDsgaSA8PSB0aGlzLmFzdFB0cjsgaSsrKXsKKwkJQVNUTm9kZSBub2RlID0gdGhpcy5hc3RTdGFja1tpXTsKKwogCQlpZihub2RlIGluc3RhbmNlb2YgRm9yZWFjaFN0YXRlbWVudCAmJiAoKEZvcmVhY2hTdGF0ZW1lbnQpbm9kZSkuYWN0aW9uID09IG51bGwpIHsKIAkJCW5vZGUgPSAoKEZvcmVhY2hTdGF0ZW1lbnQpbm9kZSkuZWxlbWVudFZhcmlhYmxlOwogCQl9CiAKIAkJLyogY2hlY2sgZm9yIGludGVybWVkaWF0ZSBibG9jayBjcmVhdGlvbiwgc28gcmVjb3ZlcnkgY2FuIHByb3Blcmx5IGNsb3NlIHRoZW0gYWZ0ZXJ3YXJkcyAqLwogCQlpbnQgbm9kZVN0YXJ0ID0gbm9kZS5zb3VyY2VTdGFydDsKLQkJZm9yIChpbnQgaiA9IGJsb2NrSW5kZXg7IGogPD0gcmVhbEJsb2NrUHRyOyBqKyspewotCQkJaWYgKGJsb2NrU3RhcnRzW2pdID49IDApIHsKLQkJCQlpZiAoYmxvY2tTdGFydHNbal0gPiBub2RlU3RhcnQpeworCQlmb3IgKGludCBqID0gYmxvY2tJbmRleDsgaiA8PSB0aGlzLnJlYWxCbG9ja1B0cjsgaisrKXsKKwkJCWlmICh0aGlzLmJsb2NrU3RhcnRzW2pdID49IDApIHsKKwkJCQlpZiAodGhpcy5ibG9ja1N0YXJ0c1tqXSA+IG5vZGVTdGFydCl7CiAJCQkJCWJsb2NrSW5kZXggPSBqOyAvLyBzaGlmdCB0aGUgaW5kZXggdG8gdGhlIG5ldyBibG9jawogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJaWYgKGJsb2NrU3RhcnRzW2pdICE9IGxhc3RTdGFydCl7IC8vIGF2b2lkIG11bHRpcGxlIGJsb2NrIGlmIGF0IHNhbWUgcG9zaXRpb24KKwkJCQlpZiAodGhpcy5ibG9ja1N0YXJ0c1tqXSAhPSBsYXN0U3RhcnQpeyAvLyBhdm9pZCBtdWx0aXBsZSBibG9jayBpZiBhdCBzYW1lIHBvc2l0aW9uCiAJCQkJCWJsb2NrID0gbmV3IEJsb2NrKDApOwotCQkJCQlibG9jay5zb3VyY2VTdGFydCA9IGxhc3RTdGFydCA9IGJsb2NrU3RhcnRzW2pdOworCQkJCQlibG9jay5zb3VyY2VTdGFydCA9IGxhc3RTdGFydCA9IHRoaXMuYmxvY2tTdGFydHNbal07CiAJCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChibG9jaywgMSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlpZiAoLWJsb2NrU3RhcnRzW2pdID4gbm9kZVN0YXJ0KXsKKwkJCQlpZiAoLXRoaXMuYmxvY2tTdGFydHNbal0gPiBub2RlU3RhcnQpewogCQkJCQlibG9ja0luZGV4ID0gajsgLy8gc2hpZnQgdGhlIGluZGV4IHRvIHRoZSBuZXcgYmxvY2sKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJsb2NrID0gbmV3IEJsb2NrKDApOwotCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gLWJsb2NrU3RhcnRzW2pdOworCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gLXRoaXMuYmxvY2tTdGFydHNbal07CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGJsb2NrLCAxKTsKIAkJCX0KIAkJCWJsb2NrSW5kZXggPSBqKzE7IC8vIHNoaWZ0IHRoZSBpbmRleCB0byB0aGUgbmV3IGJsb2NrCkBAIC0xNzAsMjQgKzE5NCwyNCBAQAogCQkJaWYgKGxvY2FsLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApewogCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChsb2NhbCwgMCk7CiAJCQkJaWYgKGxvY2FsLmluaXRpYWxpemF0aW9uID09IG51bGwpewotCQkJCQlsYXN0Q2hlY2tQb2ludCA9IGxvY2FsLnNvdXJjZUVuZCArIDE7CisJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBsb2NhbC5zb3VyY2VFbmQgKyAxOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gbG9jYWwuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kICsgMTsKKwkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGxvY2FsLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCArIDE7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQobG9jYWwsIDApOwotCQkJCWxhc3RDaGVja1BvaW50ID0gbG9jYWwuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBsb2NhbC5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CiAJCQl9CiAJCQljb250aW51ZTsKLQkJfQkJCisJCX0KIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7CiAJCQlpZiAobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApewogCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChtZXRob2QsIDApOwotCQkJCWxhc3RDaGVja1BvaW50ID0gbWV0aG9kLmJvZHlTdGFydDsKKwkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWV0aG9kLmJvZHlTdGFydDsKIAkJCX0gZWxzZSB7CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKG1ldGhvZCwgMCk7Ci0JCQkJbGFzdENoZWNrUG9pbnQgPSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOwogCQkJfQogCQkJY29udGludWU7CiAJCX0KQEAgLTE5NSw0MyArMjE5LDQzIEBACiAJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgbm9kZTsKIAkJCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKIAkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoaW5pdGlhbGl6ZXIsIDEpOwotCQkJCWxhc3RDaGVja1BvaW50ID0gaW5pdGlhbGl6ZXIuc291cmNlU3RhcnQ7CQkJCQorCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbml0aWFsaXplci5zb3VyY2VTdGFydDsKIAkJCX0gZWxzZSB7CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGluaXRpYWxpemVyLCAwKTsKLQkJCQlsYXN0Q2hlY2tQb2ludCA9IGluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKKwkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOwogCQkJfQogCQkJY29udGludWU7Ci0JCX0JCQorCQl9CiAJCWlmIChub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbil7CiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7CiAJCQlpZiAoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGZpZWxkLCAwKTsKIAkJCQlpZiAoZmllbGQuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCl7Ci0JCQkJCWxhc3RDaGVja1BvaW50ID0gZmllbGQuc291cmNlRW5kICsgMTsKKwkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGZpZWxkLnNvdXJjZUVuZCArIDE7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZC5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQgKyAxOworCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gZmllbGQuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kICsgMTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChmaWVsZCwgMCk7Ci0JCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKXsKIAkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKIAkJCWlmICh0eXBlLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApewotCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZCh0eXBlLCAwKTsJCi0JCQkJbGFzdENoZWNrUG9pbnQgPSB0eXBlLmJvZHlTdGFydDsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CisJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGUuYm9keVN0YXJ0OwogCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CQkJCQotCQkJCWxhc3RDaGVja1BvaW50ID0gdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKHR5cGUsIDApOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKXsKIAkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYgPSAoSW1wb3J0UmVmZXJlbmNlKSBub2RlOwogCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGltcG9ydFJlZiwgMCk7Ci0JCQlsYXN0Q2hlY2tQb2ludCA9IGltcG9ydFJlZi5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wb3J0UmVmLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKIAkJfQogCX0KIAlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSB7CkBAIC0yMzksMjMgKzI2MywyMyBAQAogCX0KIAogCS8qIG1pZ2h0IG5lZWQgc29tZSBleHRyYSBibG9jayAoYWZ0ZXIgdGhlIGxhc3QgcmVkdWNlZCBub2RlKSAqLwotCWludCBwb3MgPSB0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbCA/IGxhc3RDaGVja1BvaW50IDogdGhpcy5hc3Npc3ROb2RlLnNvdXJjZVN0YXJ0OwotCWZvciAoaW50IGogPSBibG9ja0luZGV4OyBqIDw9IHJlYWxCbG9ja1B0cjsgaisrKXsKLQkJaWYgKGJsb2NrU3RhcnRzW2pdID49IDApIHsKLQkJCWlmICgoYmxvY2tTdGFydHNbal0gPCBwb3MpICYmIChibG9ja1N0YXJ0c1tqXSAhPSBsYXN0U3RhcnQpKXsgLy8gYXZvaWQgbXVsdGlwbGUgYmxvY2sgaWYgYXQgc2FtZSBwb3NpdGlvbgorCWludCBwb3MgPSB0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbCA/IHRoaXMubGFzdENoZWNrUG9pbnQgOiB0aGlzLmFzc2lzdE5vZGUuc291cmNlU3RhcnQ7CisJZm9yIChpbnQgaiA9IGJsb2NrSW5kZXg7IGogPD0gdGhpcy5yZWFsQmxvY2tQdHI7IGorKyl7CisJCWlmICh0aGlzLmJsb2NrU3RhcnRzW2pdID49IDApIHsKKwkJCWlmICgodGhpcy5ibG9ja1N0YXJ0c1tqXSA8IHBvcykgJiYgKHRoaXMuYmxvY2tTdGFydHNbal0gIT0gbGFzdFN0YXJ0KSl7IC8vIGF2b2lkIG11bHRpcGxlIGJsb2NrIGlmIGF0IHNhbWUgcG9zaXRpb24KIAkJCQlibG9jayA9IG5ldyBCbG9jaygwKTsKLQkJCQlibG9jay5zb3VyY2VTdGFydCA9IGxhc3RTdGFydCA9IGJsb2NrU3RhcnRzW2pdOworCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gdGhpcy5ibG9ja1N0YXJ0c1tqXTsKIAkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoYmxvY2ssIDEpOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKChibG9ja1N0YXJ0c1tqXSA8IHBvcykpeyAvLyBhdm9pZCBtdWx0aXBsZSBibG9jayBpZiBhdCBzYW1lIHBvc2l0aW9uCisJCQlpZiAoKHRoaXMuYmxvY2tTdGFydHNbal0gPCBwb3MpKXsgLy8gYXZvaWQgbXVsdGlwbGUgYmxvY2sgaWYgYXQgc2FtZSBwb3NpdGlvbgogCQkJCWJsb2NrID0gbmV3IEJsb2NrKDApOwotCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gLWJsb2NrU3RhcnRzW2pdOworCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gLXRoaXMuYmxvY2tTdGFydHNbal07CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGJsb2NrLCAxKTsKIAkJCX0KIAkJfQogCX0KLQkKKwogCXJldHVybiBlbGVtZW50OwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXIoKSB7CkBAIC0yODIsOCArMzA2LDE3IEBACiAJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCk7CiAJcHVzaE9uRWxlbWVudFN0YWNrKEtfTUVUSE9EX0RFTElNSVRFUik7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKSB7Ci0Jc3VwZXIuY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCk7Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXJJbml0KGJvb2xlYW4gaGFzTW9kaWZpZXJzKSB7CisJc3VwZXIuY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVySW5pdChoYXNNb2RpZmllcnMpOworCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbCA9ICgoRm9yZWFjaFN0YXRlbWVudCl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSkuZWxlbWVudFZhcmlhYmxlOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbG9jYWxEZWNsLnNvdXJjZUVuZCArIDE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChsb2NhbERlY2wsIDApOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShib29sZWFuIHF1YWxpZmllZCkgeworCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShxdWFsaWZpZWQpOwogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7CiAJcHVzaE9uRWxlbWVudFN0YWNrKEtfVFlQRV9ERUxJTUlURVIpOwogfQpAQCAtMzI4LDcgKzM2MSw3IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9yY2VOb0RpZXQoKSB7CiAJc3VwZXIuY29uc3VtZUZvcmNlTm9EaWV0KCk7Ci0JLy8gaWYgd2UgYXJlIG5vdCBpbiBhIG1ldGhvZCAoaWUuIHdlIGFyZSBub3QgaW4gYSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXplcikKKwkvLyBpZiB3ZSBhcmUgbm90IGluIGEgbWV0aG9kIChpLmUuIHdlIGFyZSBub3QgaW4gYSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXplcikKIAkvLyB0aGVuIHdlIGFyZSBlbnRlcmluZyBhIGZpZWxkIGluaXRpYWxpemVyCiAJaWYgKCFpc0luc2lkZU1ldGhvZCgpKSB7CiAJCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQVNTSVNUX1BBUlNFUikgIT0gS19FTlVNX0NPTlNUQU5UX0RFTElNSVRFUikgewpAQCAtMzQxLDcgKzM3NCw3IEBACiAJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKIAkJCX0KIAkJfQotCQkKKwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKSB7CkBAIC0zNTIsNiArMzg1LDEyIEBACiAJc3VwZXIuY29uc3VtZU1ldGhvZEJvZHkoKTsKIAlwb3BFbGVtZW50KEtfTUVUSE9EX0RFTElNSVRFUik7CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oYm9vbGVhbiBpc05vdEFic3RyYWN0KSB7CisJaWYgKCFpc05vdEFic3RyYWN0KSB7CisJCXBvcEVsZW1lbnQoS19NRVRIT0RfREVMSU1JVEVSKTsKKwl9CisJc3VwZXIuY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGlzTm90QWJzdHJhY3QpOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlcigpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyKCk7CiAJcHVzaE9uRWxlbWVudFN0YWNrKEtfTUVUSE9EX0RFTElNSVRFUik7CkBAIC0zNTksNDggKzM5OCw0OCBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOwogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7Ci0JTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCWlmIChtZXNzYWdlU2VuZCA9PSBhc3Npc3ROb2RlKXsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmIChtZXNzYWdlU2VuZCA9PSB0aGlzLmFzc2lzdE5vZGUpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVzc2FnZVNlbmQuc291cmNlRW5kICsgMTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWVXaXRoVHlwZUFyZ3VtZW50cygpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWVXaXRoVHlwZUFyZ3VtZW50cygpOwogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7Ci0JTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCWlmIChtZXNzYWdlU2VuZCA9PSBhc3Npc3ROb2RlKXsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmIChtZXNzYWdlU2VuZCA9PSB0aGlzLmFzc2lzdE5vZGUpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVzc2FnZVNlbmQuc291cmNlRW5kICsgMTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7CiAJcG9wRWxlbWVudChLX1NFTEVDVE9SKTsKLQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYgKG1lc3NhZ2VTZW5kID09IGFzc2lzdE5vZGUpeworCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKG1lc3NhZ2VTZW5kID09IHRoaXMuYXNzaXN0Tm9kZSl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXNzYWdlU2VuZC5zb3VyY2VFbmQgKyAxOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeVdpdGhUeXBlQXJndW1lbnRzKCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeVdpdGhUeXBlQXJndW1lbnRzKCk7CiAJcG9wRWxlbWVudChLX1NFTEVDVE9SKTsKLQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYgKG1lc3NhZ2VTZW5kID09IGFzc2lzdE5vZGUpeworCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKG1lc3NhZ2VTZW5kID09IHRoaXMuYXNzaXN0Tm9kZSl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXNzYWdlU2VuZC5zb3VyY2VFbmQgKyAxOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOwogCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7Ci0JTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCWlmIChtZXNzYWdlU2VuZCA9PSBhc3Npc3ROb2RlKXsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmIChtZXNzYWdlU2VuZCA9PSB0aGlzLmFzc2lzdE5vZGUpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVzc2FnZVNlbmQuc291cmNlRW5kICsgMTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyV2l0aFR5cGVBcmd1bWVudHMoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcldpdGhUeXBlQXJndW1lbnRzKCk7CiAJcG9wRWxlbWVudChLX1NFTEVDVE9SKTsKLQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYgKG1lc3NhZ2VTZW5kID09IGFzc2lzdE5vZGUpeworCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKG1lc3NhZ2VTZW5kID09IHRoaXMuYXNzaXN0Tm9kZSl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXNzYWdlU2VuZC5zb3VyY2VFbmQgKyAxOwogCX0KIH0KQEAgLTQxOSw3ICs0NTgsNyBAQAogCQkJdGhpcy5ibG9ja1N0YXJ0cyA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsCiAJCQlzdGFja0xlbmd0aCk7CiAJfQotCXRoaXMuYmxvY2tTdGFydHNbdGhpcy5yZWFsQmxvY2tQdHJdID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCXRoaXMuYmxvY2tTdGFydHNbdGhpcy5yZWFsQmxvY2tQdHJdID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lT3BlbkZha2VCbG9jaygpIHsKIAkvLyBPcGVuQmxvY2sgOjo9ICRlbXB0eQpAQCAtNDMyLDExICs0NzEsMTEgQEAKIAkJCXRoaXMuYmxvY2tTdGFydHMgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdLCAwLAogCQkJc3RhY2tMZW5ndGgpOwogCX0KLQl0aGlzLmJsb2NrU3RhcnRzW3RoaXMucmVhbEJsb2NrUHRyXSA9IC1zY2FubmVyLnN0YXJ0UG9zaXRpb247CisJdGhpcy5ibG9ja1N0YXJ0c1t0aGlzLnJlYWxCbG9ja1B0cl0gPSAtdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpIHsKIAkvLyBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSAncGFja2FnZScgTmFtZQotCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJLyogYnVpbGQgYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTQ0OCw0MyArNDg3LDQzIEBACiAJfQogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBub2RlIG9uIHBhY2thZ2Ugc3RhdGVtZW50ICovCi0JSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlQXNzaXN0UGFja2FnZVJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucyk7Ci0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gY3JlYXRlQXNzaXN0UGFja2FnZVJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucyk7CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSByZWZlcmVuY2U7IAorCXRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0gcmVmZXJlbmNlOwogCi0JaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewotCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CisJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCX0gZWxzZSB7CiAJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IChpbnQpIHBvc2l0aW9uc1tsZW5ndGgtMV07CiAJfQogCS8vZW5kUG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIDsKLQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJLy8gZmx1c2ggY29tbWVudHMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAKIAkvLyByZWNvdmVyeQotCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKLQkJbGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKLQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCi0JfQkKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZVdpdGhNb2RpZmllcnMoKSB7CiAJLy8gUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gTW9kaWZpZXJzICdwYWNrYWdlJyBQdXNoUmVhbE1vZGlmaWVycyBOYW1lCi0JLyogYnVpbGQgYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwkvKiBidWlsZCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lCiAJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLwogCiAJaW50IGluZGV4OwpAQCAtNDk2LDU0ICs1MzUsNTQgQEAKIAl9CiAJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBhc3Npc3Qgbm9kZSBwb3NpdGlvbnMKIAkJc2hvdWxkIGluY2x1ZGUgdGhlIGVudGlyZSByZXBsYWNlZCBzb3VyY2UuICovCi0JaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKIAljaGFyW11bXSBzdWJzZXQgPSBpZGVudGlmaWVyU3ViU2V0KGluZGV4KzEpOyAvLyBpbmNsdWRlIHRoZSBhc3Npc3RJZGVudGlmaWVyCi0JaWRlbnRpZmllckxlbmd0aFB0ci0tOwotCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXRoaXMuaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CiAJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQlpZGVudGlmaWVyUHRyICsgMSwgCi0JCXBvc2l0aW9ucywgCi0JCTAsIAotCQlsZW5ndGgpOyAKKwkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwKKwkJcG9zaXRpb25zLAorCQkwLAorCQlsZW5ndGgpOwogCiAJdGhpcy5pbnRQdHItLTsgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgbW9kaWZpZXJzIHN0YXJ0CiAJdGhpcy5pbnRQdHItLTsgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgcGFja2FnZSBtb2RpZmllcnMKLQlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RQYWNrYWdlUmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zKTsKKwlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gY3JlYXRlQXNzaXN0UGFja2FnZVJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucyk7CiAJLy8gY29uc3VtZSBhbm5vdGF0aW9ucwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCXJlZmVyZW5jZS5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKLQl9CQorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJcmVmZXJlbmNlLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOworCX0KIAkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgbm9kZSBvbiBwYWNrYWdlIHN0YXRlbWVudCAqLwotCWFzc2lzdE5vZGUgPSByZWZlcmVuY2U7CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSByZWZlcmVuY2U7IAorCXRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0gcmVmZXJlbmNlOwogCi0JaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewotCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CisJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCX0gZWxzZSB7CiAJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IChpbnQpIHBvc2l0aW9uc1tsZW5ndGgtMV07CiAJfQogCS8vZW5kUG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIDsKLQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJLy8gZmx1c2ggY29tbWVudHMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAKIAkvLyByZWNvdmVyeQotCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKLQkJbGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKLQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCi0JfQkKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVzdG9yZURpZXQoKSB7CiAJc3VwZXIuY29uc3VtZVJlc3RvcmVEaWV0KCk7Ci0JLy8gaWYgd2UgYXJlIG5vdCBpbiBhIG1ldGhvZCAoaWUuIHdlIHdlcmUgbm90IGluIGEgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXIpCisJLy8gaWYgd2UgYXJlIG5vdCBpbiBhIG1ldGhvZCAoaS5lLiB3ZSB3ZXJlIG5vdCBpbiBhIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemVyKQogCS8vIHRoZW4gd2UgYXJlIGV4aXRpbmcgYSBmaWVsZCBpbml0aWFsaXplcgogCWlmICghaXNJbnNpZGVNZXRob2QoKSkgewogCQlwb3BFbGVtZW50KEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKQEAgLTU1MSw3ICs1OTAsNyBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVN0YXRpY0ltcG9ydERlY2xhcmF0aW9uTmFtZSgpIHsKIAkvLyBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyAnc3RhdGljJyBOYW1lCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTU2Myw0NiArNjAyLDQ2IEBACiAJfQogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBub2RlIG9uIGltcG9ydCBzdGF0ZW1lbnQgKi8KLQlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOwotCWFzc2lzdE5vZGUgPSByZWZlcmVuY2U7CisJSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNyZWF0ZUFzc2lzdEltcG9ydFJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucywgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyk7CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKIAogCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CiAKLQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7Ci0JCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKIAkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKIAl9CiAJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCi0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOwotCQlsYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CiAJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZQotCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlpbnQgaW5kZXg7CkBAIC02MTQsNDYgKzY1Myw0NiBAQAogCX0KIAkvKiByZXRyaWV2ZSBpZGVudGlmaWVycyBzdWJzZXQgYW5kIHdob2xlIHBvc2l0aW9ucywgdGhlIGFzc2lzdCBub2RlIHBvc2l0aW9ucwogCQlzaG91bGQgaW5jbHVkZSB0aGUgZW50aXJlIHJlcGxhY2VkIHNvdXJjZS4gKi8KLQlpbnQgbGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdOworCWludCBsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdOwogCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoaW5kZXgrMSk7IC8vIGluY2x1ZGUgdGhlIGFzc2lzdElkZW50aWZpZXIKLQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKIAlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCWlkZW50aWZpZXJQdHIgKyAxLCAKLQkJcG9zaXRpb25zLCAKLQkJMCwgCi0JCWxlbmd0aCk7IAorCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLAorCQl0aGlzLmlkZW50aWZpZXJQdHIgKyAxLAorCQlwb3NpdGlvbnMsCisJCTAsCisJCWxlbmd0aCk7CiAKIAkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgbm9kZSBvbiBpbXBvcnQgc3RhdGVtZW50ICovCi0JSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7Ci0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKIAogCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CiAKLQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7Ci0JCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKIAkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKIAl9CiAJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBmbHVzaCBjb21tZW50cyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCi0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOwotCQlsYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0ltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgJ3N0YXRpYycgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTY2NSw0MiArNzA0LDQ0IEBACiAJfQogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBub2RlIG9uIGltcG9ydCBzdGF0ZW1lbnQgKi8KLQlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOworCUltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOwogCXJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuT25EZW1hbmQ7Ci0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwkvLyBzdGFyIGVuZCBwb3NpdGlvbgorCXJlZmVyZW5jZS50cmFpbGluZ1N0YXJQb3NpdGlvbiA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKIAogCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CiAKLQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7Ci0JCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKIAkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKIAl9CiAJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCi0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOwotCQlsYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCkgewpAQCAtNzEzLDI4ICs3NTQsMjkgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUb2tlbihpbnQgdG9rZW4pIHsKIAlzdXBlci5jb25zdW1lVG9rZW4odG9rZW4pOwotCQotCWlmKGlzRmlyc3QpIHsKLQkJaXNGaXJzdCA9IGZhbHNlOworCisJaWYodGhpcy5pc0ZpcnN0KSB7CisJCXRoaXMuaXNGaXJzdCA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQotCS8vIHJlZ2lzdGVyIG1lc3NhZ2Ugc2VuZCBzZWxlY3RvciBvbmx5IGlmIGluc2lkZSBhIG1ldGhvZCBvciBpZiBsb29raW5nIGF0IGEgZmllbGQgaW5pdGlhbGl6ZXIgCisJLy8gcmVnaXN0ZXIgbWVzc2FnZSBzZW5kIHNlbGVjdG9yIG9ubHkgaWYgaW5zaWRlIGEgbWV0aG9kIG9yIGlmIGxvb2tpbmcgYXQgYSBmaWVsZCBpbml0aWFsaXplcgogCS8vIGFuZCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhbiBvcGVuIHBhcmVudGhlc2lzCiAJaWYgKGlzSW5zaWRlTWV0aG9kKCkgfHwgaXNJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkgfHwgaXNJbnNpZGVBdHRyaWJ1dGVWYWx1ZSgpKSB7CiAJCXN3aXRjaCAodG9rZW4pIHsKIAkJCWNhc2UgVG9rZW5OYW1lTFBBUkVOIDoKKwkJCQl0aGlzLmJyYWNrZXREZXB0aCsrOwogCQkJCXN3aXRjaCAodGhpcy5wcmV2aW91c1Rva2VuKSB7CiAJCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjoKIAkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1IsIHRoaXMuaWRlbnRpZmllclB0cik7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBUb2tlbk5hbWV0aGlzOiAvLyBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCBlZy4gdGhpcygxLCAyKQorCQkJCQljYXNlIFRva2VuTmFtZXRoaXM6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGUuZy4gdGhpcygxLCAyKQogCQkJCQkJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soS19TRUxFQ1RPUiwgVEhJU19DT05TVFJVQ1RPUik7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHN1cGVyKDEsIDIpCisJCQkJCWNhc2UgVG9rZW5OYW1lc3VwZXI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGUuZy4gc3VwZXIoMSwgMikKIAkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1IsIFNVUEVSX0NPTlNUUlVDVE9SKTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiBGcmVkPFg+WyhdMSwgMikKLQkJCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVDogLy8gb3IgZnJlZDxYPFg+PlsoXTEsIDIpIAorCQkJCQljYXNlIFRva2VuTmFtZUdSRUFURVI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGUuZy4gRnJlZDxYPlsoXTEsIDIpCisJCQkJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQ6IC8vIG9yIGZyZWQ8WDxYPj5bKF0xLCAyKQogCQkJCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUOiAvL29yIEZyZWQ8WDxYPFg+Pj5bKF0xLCAyKQogCQkJCQkJaWYodGhpcy5pZGVudGlmaWVyUHRyID4gLTEpIHsKIAkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SLCB0aGlzLmlkZW50aWZpZXJQdHIpOwpAQCAtNzQyLDYgKzc4NCwyMSBAQAogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVMQlJBQ0U6CisJCQkJdGhpcy5icmFja2V0RGVwdGgrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJdGhpcy5icmFja2V0RGVwdGgrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lUkJSQUNFOgorCQkJCXRoaXMuYnJhY2tldERlcHRoLS07CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZVJCUkFDS0VUOgorCQkJCXRoaXMuYnJhY2tldERlcHRoLS07CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZVJQQVJFTjoKKwkJCQl0aGlzLmJyYWNrZXREZXB0aC0tOworCQkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKIAkJc3dpdGNoICh0b2tlbikgewpAQCAtNzU5LDcgKzgxNiw3IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTc3MSw0MiArODI4LDQ0IEBACiAJfQogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBub2RlIG9uIGltcG9ydCBzdGF0ZW1lbnQgKi8KLQlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KTsKKwlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CiAJcmVmZXJlbmNlLmJpdHMgfD0gQVNUTm9kZS5PbkRlbWFuZDsKLQlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCS8vIHN0YXIgZW5kIHBvc2l0aW9uCisJcmVmZXJlbmNlLnRyYWlsaW5nU3RhclBvc2l0aW9uID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwl0aGlzLmFzc2lzdE5vZGUgPSByZWZlcmVuY2U7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOwogCiAJcHVzaE9uQXN0U3RhY2socmVmZXJlbmNlKTsKIAotCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKLQkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peworCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAl9IGVsc2UgewogCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAoaW50KSBwb3NpdGlvbnNbbGVuZ3RoLTFdOwogCX0KIAkvL2VuZFBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSA7Ci0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCS8vIGZsdXNoIGNvbW1lbnRzIGRlZmluZWQgcHJpb3IgdG8gaW1wb3J0IHN0YXRlbWVudHMKLQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLmZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyhyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyhyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogCiAJLy8gcmVjb3ZlcnkKLQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7Ci0JCWxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7Ci0JCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKHJlZmVyZW5jZSwgMCk7Ci0JCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKLQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKKwkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKHJlZmVyZW5jZSwgMCk7CisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9CiB9CiBwdWJsaWMgYWJzdHJhY3QgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUFzc2lzdEltcG9ydFJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMsIGludCBtb2QpOwpAQCAtODIzLDEyICs4ODIsMTcgQEAKIHB1YmxpYyB2b2lkIGZsdXNoQXNzaXN0U3RhdGUoKXsKIAl0aGlzLmFzc2lzdE5vZGUgPSBudWxsOwogCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IGZhbHNlOwotCXRoaXMuc2V0QXNzaXN0SWRlbnRpZmllcihudWxsKTsKKwlzZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOwogfQogcHJvdGVjdGVkIHZvaWQgZmx1c2hFbGVtZW50U3RhY2soKSB7CisJZm9yIChpbnQgaiA9IDA7IGogPD0gdGhpcy5lbGVtZW50UHRyOyBqKyspIHsKKwkJdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW2pdID0gbnVsbDsKKwl9CisKIAl0aGlzLmVsZW1lbnRQdHIgPSAtMTsKIAl0aGlzLnByZXZpb3VzS2luZCA9IDA7CiAJdGhpcy5wcmV2aW91c0luZm8gPSAwOworCXRoaXMucHJldmlvdXNPYmplY3RJbmZvID0gbnVsbDsKIH0KIC8qCiAgKiBCdWlsZCBzcGVjaWZpYyB0eXBlIHJlZmVyZW5jZSBub2RlcyBpbiBjYXNlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZCBpbnNpZGUgdGhlIHR5cGUgcmVmZXJlbmNlCkBAIC04NDEsNDcgKzkwNSw0NyBAQAogCWlmICgoaW5kZXggPSBpbmRleE9mQXNzaXN0SWRlbnRpZmllcih0cnVlKSkgPCAwKSB7CiAJCXJldHVybiBzdXBlci5nZXRUeXBlUmVmZXJlbmNlKGRpbSk7CiAJfQotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJVHlwZVJlZmVyZW5jZSByZWZlcmVuY2U7CiAJaW50IG51bWJlck9mSWRlbnRpZmllcnMgPSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHItLV07CiAJaWYgKGxlbmd0aCAhPSBudW1iZXJPZklkZW50aWZpZXJzIHx8IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXSAhPSAwKSB7Ci0JCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAJCS8vIGdlbmVyaWMgdHlwZQogCQlyZWZlcmVuY2UgPSBnZXRBc3Npc3RUeXBlUmVmZXJlbmNlRm9yR2VuZXJpY1R5cGUoZGltLCBsZW5ndGgsIG51bWJlck9mSWRlbnRpZmllcnMpOwogCX0gZWxzZSB7CiAJCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCQlzaG91bGQgaW5jbHVkZSB0aGUgZW50aXJlIHJlcGxhY2VkIHNvdXJjZS4gKi8KLQkJCisKIAkJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCk7Ci0JCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQkJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCQl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJCWlkZW50aWZpZXJQdHIgKyAxLCAKLQkJCXBvc2l0aW9ucywgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAotCQorCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCQlwb3NpdGlvbnMsCisJCQkwLAorCQkJbGVuZ3RoKTsKKwogCQkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgb24gdHlwZSByZWZlcmVuY2UgKi8KLQkJCisKIAkJaWYgKGluZGV4ID09IDApIHsKIC8vCQkJZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0ci0tOwotCQkJZ2VuZXJpY3NMZW5ndGhQdHItLTsKKwkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhQdHItLTsKIAkJCS8qIGFzc2lzdCBpbnNpZGUgZmlyc3QgaWRlbnRpZmllciAqLwotCQkJcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAotCQkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwgCisJCQlyZWZlcmVuY2UgPSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAorCQkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwKIAkJCQkJCQlwb3NpdGlvbnNbMF0pOwogCQl9IGVsc2UgewogLy8JCQlnZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyLS07Ci0JCQlnZW5lcmljc0xlbmd0aFB0ci0tOworCQkJdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tOwogCQkJLyogYXNzaXN0IGluc2lkZSBzdWJzZXF1ZW50IGlkZW50aWZpZXIgKi8KLQkJCXJlZmVyZW5jZSA9CXRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKLQkJCQkJCQlzdWJzZXQsICAKLQkJCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksIAorCQkJcmVmZXJlbmNlID0JY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKKwkJCQkJCQlzdWJzZXQsCisJCQkJCQkJYXNzaXN0SWRlbnRpZmllcigpLAogCQkJCQkJCXBvc2l0aW9ucyk7CiAJCX0KLQkJYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwkJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLnNvdXJjZUVuZCArIDE7CiAJfQogCXJldHVybiByZWZlcmVuY2U7CkBAIC04OTAsMjkgKzk1NCwzNCBAQAogCS8qIG5vIG5lZWQgdG8gdGFrZSBhY3Rpb24gaWYgbm90IGluc2lkZSBjb21wbGV0ZWQgaWRlbnRpZmllcnMgKi8KIAlpZiAoLyooaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPCAwIHx8Ki8gKGlkZW50aWZpZXJMZW5ndGggPT0gMSAmJiBudW1iZXJPZklkZW50aWZpZXJzID09IDEpKSB7CiAJCWludCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwotCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2N1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoXTsKLQkJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCB0eXBlQXJndW1lbnRzLCAwLCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCk7CisJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzOworCQlpZiAoY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGggPiAtMSkgeworCQkJdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2N1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoXTsKKwkJCXRoaXMuZ2VuZXJpY3NQdHIgLT0gY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIHR5cGVBcmd1bWVudHMsIDAsIGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXR5cGVBcmd1bWVudHMgPSBUeXBlUmVmZXJlbmNlLk5PX1RZUEVfQVJHVU1FTlRTOworCQl9CiAJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tpZGVudGlmaWVyTGVuZ3RoXTsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJCWlkZW50aWZpZXJQdHIsIAotCQkJcG9zaXRpb25zLCAKLQkJCTAsIAotCQkJaWRlbnRpZmllckxlbmd0aCk7IAotCQkKKwkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCQl0aGlzLmlkZW50aWZpZXJQdHIsCisJCQlwb3NpdGlvbnMsCisJCQkwLAorCQkJaWRlbnRpZmllckxlbmd0aCk7CisKIAkJdGhpcy5pZGVudGlmaWVyUHRyLS07Ci0JCQkJCi0JCVR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVQYXJhbWV0ZXJpemVkU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSgKKworCQlUeXBlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNyZWF0ZVBhcmFtZXRlcml6ZWRTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAogCQkJCXR5cGVBcmd1bWVudHMsCiAJCQkJYXNzaXN0SWRlbnRpZmllcigpLAogCQkJCXBvc2l0aW9uc1swXSk7Ci0JCQorCiAJCXRoaXMuYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOwogCQlyZXR1cm4gcmVmZXJlbmNlOwogCX0KLQkKKwogCVR5cGVSZWZlcmVuY2VbXVtdIHR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtudW1iZXJPZklkZW50aWZpZXJzXVtdOwogCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW251bWJlck9mSWRlbnRpZmllcnNdW107CiAJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW251bWJlck9mSWRlbnRpZmllcnNdOwpAQCAtOTIwLDcgKzk4OSw3IEBACiAJaW50IGN1cnJlbnRJZGVudGlmaWVyc0xlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGg7CiAJd2hpbGUgKGluZGV4ID4gMCkgewogCQlpbnQgY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKLQkJaWYgKGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoICE9IDApIHsKKwkJaWYgKGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoID4gMCkgewogCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgdHlwZUFyZ3VtZW50c1tpbmRleCAtIDFdID0gbmV3IFR5cGVSZWZlcmVuY2VbY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGhdLCAwLCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCk7CiAJCX0KQEAgLTk0MSw3ICsxMDEwLDcgQEAKIAkJCWN1cnJlbnRJZGVudGlmaWVyc0xlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXTsKIAkJfQogCX0KLQkKKwogCS8vIHJlbW92ZSBjb21wbGV0aW9uIHRva2VuCiAJaW50IHJlYWxMZW5ndGggPSBudW1iZXJPZklkZW50aWZpZXJzOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZJZGVudGlmaWVyczsgaSsrKSB7CkBAIC05NTIsMTUgKzEwMjEsMTUgQEAKIAlUeXBlUmVmZXJlbmNlIHJlZmVyZW5jZTsKIAlpZihyZWFsTGVuZ3RoID09IDApIHsKIAkJaWYodHlwZUFyZ3VtZW50c1swXSAhPSBudWxsICYmIHR5cGVBcmd1bWVudHNbMF0ubGVuZ3RoID4gMCkgewotCQkJcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVQYXJhbWV0ZXJpemVkU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSh0eXBlQXJndW1lbnRzWzBdLCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CisJCQlyZWZlcmVuY2UgPSBjcmVhdGVQYXJhbWV0ZXJpemVkU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSh0eXBlQXJndW1lbnRzWzBdLCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CiAJCX0gZWxzZSB7Ci0JCQlyZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoYXNzaXN0SWRlbnRpZmllcigpLCBwb3NpdGlvbnNbMF0pOworCQkJcmVmZXJlbmNlID0gY3JlYXRlU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZShhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CiAJCX0KIAl9IGVsc2UgewogCQlUeXBlUmVmZXJlbmNlW10gYXNzaXN0VHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHNbcmVhbExlbmd0aF07CiAJCVN5c3RlbS5hcnJheWNvcHkodG9rZW5zLCAwLCB0b2tlbnMgPSBuZXcgY2hhcltyZWFsTGVuZ3RoXVtdLCAwLCByZWFsTGVuZ3RoKTsKIAkJU3lzdGVtLmFycmF5Y29weSh0eXBlQXJndW1lbnRzLCAwLCB0eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbcmVhbExlbmd0aF1bXSwgMCwgcmVhbExlbmd0aCk7Ci0JCQorCiAJCWJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkID0gZmFsc2U7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogCQkJaWYodHlwZUFyZ3VtZW50c1tpXSAhPSBudWxsKSB7CkBAIC05NjgsMjAgKzEwMzcsMjAgQEAKIAkJCX0KIAkJfQogCQlpZihpc1BhcmFtZXRlcml6ZWQgfHwgKGFzc2lzdFR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiBhc3Npc3RUeXBlQXJndW1lbnRzLmxlbmd0aCA+IDApKSB7Ci0JCQlyZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKHRva2VucywgdHlwZUFyZ3VtZW50cywgYXNzaXN0SWRlbnRpZmllcigpLCBhc3Npc3RUeXBlQXJndW1lbnRzLCBwb3NpdGlvbnMpOworCQkJcmVmZXJlbmNlID0gY3JlYXRlUGFyYW1ldGVyaXplZFF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UodG9rZW5zLCB0eXBlQXJndW1lbnRzLCBhc3Npc3RJZGVudGlmaWVyKCksIGFzc2lzdFR5cGVBcmd1bWVudHMsIHBvc2l0aW9ucyk7CiAJCX0gZWxzZSB7Ci0JCQlyZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UodG9rZW5zLCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9ucyk7CisJCQlyZWZlcmVuY2UgPSBjcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKHRva2VucywgYXNzaXN0SWRlbnRpZmllcigpLCBwb3NpdGlvbnMpOwogCQl9CiAJfQogCi0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwl0aGlzLmFzc2lzdE5vZGUgPSByZWZlcmVuY2U7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOwogCXJldHVybiByZWZlcmVuY2U7CiB9CiAvKgogICogQ29weSBvZiBjb2RlIGZyb20gc3VwZXJjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgotICogSW4gdGhlIGNhc2Ugb2YgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIGlmIHRoZSBjdXJzb3IgbG9jYXRpb24gaXMgb24gdGhlIAotICogcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLCB0aGVuIGNyZWF0ZSBhIENvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UgCisgKiBJbiB0aGUgY2FzZSBvZiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgaWYgdGhlIGN1cnNvciBsb2NhdGlvbiBpcyBvbiB0aGUKKyAqIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSwgdGhlbiBjcmVhdGUgYSBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlCiAgKiBpbnN0ZWFkLgogICovCiBwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpIHsKQEAgLTk5NSw0OSArMTA2NCw0OSBAQAogCiAJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBjb21wbGV0aW9uIG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChjb21wbGV0aW9uSW5kZXgpOwotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKKwkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwKKwkJcG9zaXRpb25zLAorCQkwLAogCQlsZW5ndGgpOwogCiAJLyogYnVpbGQgc3BlY2lmaWMgY29tcGxldGlvbiBvbiBuYW1lIHJlZmVyZW5jZSAqLwogCU5hbWVSZWZlcmVuY2UgcmVmZXJlbmNlOwogCWlmIChjb21wbGV0aW9uSW5kZXggPT0gMCkgewogCQkvKiBjb21wbGV0aW9uIGluc2lkZSBmaXJzdCBpZGVudGlmaWVyICovCi0JCXJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlU2luZ2xlQXNzaXN0TmFtZVJlZmVyZW5jZShhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CisJCXJlZmVyZW5jZSA9IGNyZWF0ZVNpbmdsZUFzc2lzdE5hbWVSZWZlcmVuY2UoYXNzaXN0SWRlbnRpZmllcigpLCBwb3NpdGlvbnNbMF0pOwogCX0gZWxzZSB7CiAJCS8qIGNvbXBsZXRpb24gaW5zaWRlIHN1YnNlcXVlbnQgaWRlbnRpZmllciAqLwotCQlyZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2Uoc3Vic2V0LCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9ucyk7CisJCXJlZmVyZW5jZSA9IGNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2Uoc3Vic2V0LCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9ucyk7CiAJfQogCXJlZmVyZW5jZS5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CiAJcmVmZXJlbmNlLmJpdHMgfD0gQmluZGluZy5MT0NBTCB8IEJpbmRpbmcuRklFTEQ7Ci0JCi0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKLQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOworCisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKIAlyZXR1cm4gcmVmZXJlbmNlOwogfQogcHVibGljIHZvaWQgZ29Gb3JCbG9ja1N0YXRlbWVudHNvcHQoKSB7CiAJc3VwZXIuZ29Gb3JCbG9ja1N0YXRlbWVudHNvcHQoKTsKLQlpc0ZpcnN0ID0gdHJ1ZTsKKwl0aGlzLmlzRmlyc3QgPSB0cnVlOwogfQogcHVibGljIHZvaWQgZ29Gb3JIZWFkZXJzKCl7CiAJc3VwZXIuZ29Gb3JIZWFkZXJzKCk7Ci0JaXNGaXJzdCA9IHRydWU7CisJdGhpcy5pc0ZpcnN0ID0gdHJ1ZTsKIH0KIHB1YmxpYyB2b2lkIGdvRm9yQ29tcGlsYXRpb25Vbml0KCl7CiAJc3VwZXIuZ29Gb3JDb21waWxhdGlvblVuaXQoKTsKLQlpc0ZpcnN0ID0gdHJ1ZTsKKwl0aGlzLmlzRmlyc3QgPSB0cnVlOwogfQogcHVibGljIHZvaWQgZ29Gb3JCbG9ja1N0YXRlbWVudHNPckNhdGNoSGVhZGVyKCkgewogCXN1cGVyLmdvRm9yQmxvY2tTdGF0ZW1lbnRzT3JDYXRjaEhlYWRlcigpOwotCWlzRmlyc3QgPSB0cnVlOworCXRoaXMuaXNGaXJzdCA9IHRydWU7CiB9CiAvKgogICogUmV0cmlldmUgYSBwYXJ0aWFsIHN1YnNldCBvZiBhIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSB1cCB0byB0aGUgY29tcGxldGlvbiBwb2ludC4KQEAgLTEwNDcsMTEgKzExMTYsMTEgQEAKIHByb3RlY3RlZCBjaGFyW11bXSBpZGVudGlmaWVyU3ViU2V0KGludCBzdWJzZXRMZW5ndGgpewogCiAJaWYgKHN1YnNldExlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLQkKKwogCWNoYXJbXVtdIHN1YnNldDsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQlpZGVudGlmaWVyU3RhY2ssCi0JCWlkZW50aWZpZXJQdHIgLSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl0gKyAxLAorCQl0aGlzLmlkZW50aWZpZXJTdGFjaywKKwkJdGhpcy5pZGVudGlmaWVyUHRyIC0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSArIDEsCiAJCShzdWJzZXQgPSBuZXcgY2hhcltzdWJzZXRMZW5ndGhdW10pLAogCQkwLAogCQlzdWJzZXRMZW5ndGgpOwpAQCAtMTA2MiwzMCArMTEzMSwzMCBAQAogCXJldHVybiB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKGZhbHNlKTsKIH0KIC8qCi0gKiBJdGVyYXRlIHRoZSBtb3N0IHJlY2VudCBncm91cCBvZiBhd2FpdGluZyBpZGVudGlmaWVycyAoZ3JvdXBlZCBmb3IgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIChlZy4gYWEuYmIuY2MpCisgKiBJdGVyYXRlIHRoZSBtb3N0IHJlY2VudCBncm91cCBvZiBhd2FpdGluZyBpZGVudGlmaWVycyAoZ3JvdXBlZCBmb3IgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIChlLmcuIGFhLmJiLmNjKQogICogc28gYXMgdG8gY2hlY2sgd2hldGhlciBvbmUgb2YgdGhlbSBpcyB0aGUgYXNzaXN0IGlkZW50aWZpZXIuCiAgKiBJZiBzbywgdGhlbiBhbnN3ZXIgdGhlIGluZGV4IG9mIHRoZSBhc3Npc3QgaWRlbnRpZmllciAoMCBiZWluZyB0aGUgZmlyc3QgaWRlbnRpZmllciBvZiB0aGUgc2V0KS4KLSAqCWVnLiBhYSgwKS5iYigxKS5jYygyKQorICoJZS5nLiBhYSgwKS5iYigxKS5jYygyKQogICogSWYgbm8gYXNzaXN0IGlkZW50aWZpZXIgd2FzIGZvdW5kLCBhbnN3ZXJzIC0xLgogICovCiBwcm90ZWN0ZWQgaW50IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKGJvb2xlYW4gdXNlR2VuZXJpY3NTdGFjayl7CiAKLQlpZiAoaWRlbnRpZmllckxlbmd0aFB0ciA8IDApeworCWlmICh0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgPCAwKXsKIAkJcmV0dXJuIC0xOyAvLyBubyBhd2FpdGluZyBpZGVudGlmaWVyCiAJfQogCiAJY2hhcltdIGFzc2lzdElkZW50aWZpZXIgOwotCWlmICgoYXNzaXN0SWRlbnRpZmllciA9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpKSA9PSBudWxsKXsKKwlpZiAoKGFzc2lzdElkZW50aWZpZXIgPSBhc3Npc3RJZGVudGlmaWVyKCkpID09IG51bGwpewogCQlyZXR1cm4gLTE7IC8vIG5vIGFzc2lzdCBpZGVudGlmaWVyIGZvdW5kIHlldAogCX0KIAogCS8vIGl0ZXJhdGUgYXdhaXRpbmcgaWRlbnRpZmllcnMgYmFja3dhcmRzCi0JaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKIAlpZih1c2VHZW5lcmljc1N0YWNrICYmIGxlbmd0aCA+IDAgJiYgdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyID4gLTEgKSB7CiAJCWxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0cl07CiAJfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeyAKLQkJaWYgKGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyIC0gaV0gPT0gYXNzaXN0SWRlbnRpZmllcil7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCWlmICh0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgLSBpXSA9PSBhc3Npc3RJZGVudGlmaWVyKXsKIAkJCXJldHVybiBsZW5ndGggLSBpIC0gMTsKIAkJfQogCX0KQEAgLTEwOTQsNDggKzExNjMsNTAgQEAKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCXRoaXMuZmx1c2hBc3Npc3RTdGF0ZSgpOwotCXRoaXMuZmx1c2hFbGVtZW50U3RhY2soKTsKKwlmbHVzaEFzc2lzdFN0YXRlKCk7CisJZmx1c2hFbGVtZW50U3RhY2soKTsKIAl0aGlzLnByZXZpb3VzSWRlbnRpZmllclB0ciA9IC0xOworCXRoaXMuYnJhY2tldERlcHRoID0gMDsKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoYm9vbGVhbiBpbml0aWFsaXplTkxTKSB7CiAJc3VwZXIuaW5pdGlhbGl6ZShpbml0aWFsaXplTkxTKTsKLQl0aGlzLmZsdXNoQXNzaXN0U3RhdGUoKTsKLQl0aGlzLmZsdXNoRWxlbWVudFN0YWNrKCk7CisJZmx1c2hBc3Npc3RTdGF0ZSgpOworCWZsdXNoRWxlbWVudFN0YWNrKCk7CiAJdGhpcy5wcmV2aW91c0lkZW50aWZpZXJQdHIgPSAtMTsKKwl0aGlzLmJyYWNrZXREZXB0aCA9IDA7CiB9CiBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU2Nhbm5lcigpOwogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpewotCWludCBpID0gZWxlbWVudFB0cjsKKwlpbnQgaSA9IHRoaXMuZWxlbWVudFB0cjsKIAl3aGlsZShpID4gLTEpIHsKLQkJaWYoZWxlbWVudEtpbmRTdGFja1tpXSA9PSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUikKKwkJaWYodGhpcy5lbGVtZW50S2luZFN0YWNrW2ldID09IEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKQogCQkJcmV0dXJuIHRydWU7CiAJCWktLTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRpcmVjdGx5SW5zaWRlTWV0aG9kKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlpZihlbGVtZW50S2luZFN0YWNrW2ldID09IEtfTUVUSE9EX0RFTElNSVRFUikKKwkJaWYodGhpcy5lbGVtZW50S2luZFN0YWNrW2ldID09IEtfTUVUSE9EX0RFTElNSVRFUikKIAkJCXJldHVybiB0cnVlOwogCQlpLS07CiAJfQogCXJldHVybiBmYWxzZTsKIH0KIHByb3RlY3RlZCBib29sZWFuIGlzSW5kaXJlY3RseUluc2lkZVR5cGUoKXsKLQlpbnQgaSA9IGVsZW1lbnRQdHI7CisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CiAJd2hpbGUoaSA+IC0xKSB7Ci0JCWlmKGVsZW1lbnRLaW5kU3RhY2tbaV0gPT0gS19UWVBFX0RFTElNSVRFUikKKwkJaWYodGhpcy5lbGVtZW50S2luZFN0YWNrW2ldID09IEtfVFlQRV9ERUxJTUlURVIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaS0tOwogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CiBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc2lkZUF0dHJpYnV0ZVZhbHVlKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKQEAgLTExNDYsOSArMTIxNyw5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwogCQkJY2FzZSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUiA6IHJldHVybiB0cnVlOwpAQCAtMTE1OCwyMSArMTIyOSwyMSBAQAogCXJldHVybiBmYWxzZTsKIH0KIHByb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlTWV0aG9kKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKIAkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIHRydWU7CiAJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwotCQl9CQorCQl9CiAJCWktLTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVUeXBlKCl7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKIAkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiB0cnVlOwogCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CiAJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOwpAQCAtMTE4MiwxMCArMTI1MywxMCBAQAogCXJldHVybiBmYWxzZTsKIH0KIHByb3RlY3RlZCBpbnQgbGFzdEluZGV4T2ZFbGVtZW50KGludCBraW5kKSB7Ci0JaW50IGkgPSBlbGVtZW50UHRyOworCWludCBpID0gdGhpcy5lbGVtZW50UHRyOwogCXdoaWxlKGkgPiAtMSkgewotCQlpZihlbGVtZW50S2luZFN0YWNrW2ldID09IGtpbmQpIHJldHVybiBpOwotCQlpLS07CQorCQlpZih0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0gPT0ga2luZCkgcmV0dXJuIGk7CisJCWktLTsKIAl9CiAJcmV0dXJuIC0xOwogfQpAQCAtMTIxMSw1NCArMTI4Miw1OSBAQAogCS8vY29udmVydCBidWdzIGludG8gcGFyc2UgZXJyb3IKIAogCWluaXRpYWxpemUoKTsKLQkKKwkvLyBzZXQgdGhlIGxhc3RNb2RpZmllcnMgdG8gcmVmbGVjdCB0aGUgbW9kaWZpZXJzIG9mIHRoZSBjb25zdHJ1Y3RvciB3aG9zZQorCS8vIGJsb2NrIHN0YXRlbWVudHMgYXJlIGJlaW5nIHBhcnNlZAorCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNjM0CisJdGhpcy5sYXN0TW9kaWZpZXJzID0gY2QubW9kaWZpZXJzOworCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gY2QubW9kaWZpZXJzU291cmNlU3RhcnQ7CiAJLy8gc2ltdWxhdGUgZ29Gb3JDb25zdHJ1Y3RvckJvZHkgZXhjZXB0IHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBiYWxhbmNlIGJyYWNrZXRzIGJlY2F1c2UgdGhleSBhcmUgbm90IGdvaW5nIHRvIGJlIGJhbGFuY2VkCiAJZ29Gb3JCbG9ja1N0YXRlbWVudHNvcHQoKTsKIAotCXJlZmVyZW5jZUNvbnRleHQgPSBjZDsKLQljb21waWxhdGlvblVuaXQgPSB1bml0OworCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNkOworCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKIAotCXNjYW5uZXIucmVzZXRUbyhjZC5ib2R5U3RhcnQsIGJvZHlFbmQoY2QpKTsKKwl0aGlzLnNjYW5uZXIucmVzZXRUbyhjZC5ib2R5U3RhcnQsIGJvZHlFbmQoY2QpKTsKIAljb25zdW1lTmVzdGVkTWV0aG9kKCk7CiAJdHJ5IHsKIAkJcGFyc2UoKTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7Ci0JCWxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CisJCXRoaXMubGFzdEFjdCA9IEVSUk9SX0FDVElPTjsKIAl9Ci0JCi0JaWYgKGxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisKKwlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQljZC5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJLy8gYXR0YWNoIHRoZSBzdGF0ZW1lbnRzIGFzIHdlIG1pZ2h0IGJlIHNlYXJjaGluZyBmb3IgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCB0eXBlCi0JY2QuZXhwbGljaXREZWNsYXJhdGlvbnMgPSByZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHItLV07CisJY2QuZXhwbGljaXREZWNsYXJhdGlvbnMgPSB0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyLS1dOwogCWludCBsZW5ndGg7Ci0JaWYgKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pICE9IDApIHsKLQkJYXN0UHRyIC09IGxlbmd0aDsKLQkJaWYgKGFzdFN0YWNrW2FzdFB0ciArIDFdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCisJaWYgKChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCXRoaXMuYXN0UHRyIC09IGxlbmd0aDsKKwkJaWYgKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgKyAxXSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKQogCQkJLy9hdm9pZCBhIGlzU29tZVRoaW5nIHRoYXQgd291bGQgb25seSBiZSB1c2VkIGhlcmUgQlVUIHdoYXQgaXMgZmFzdGVyIGJldHdlZW4gdHdvIGFsdGVybmF0aXZlcyA/CiAJCQl7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCWFzdFN0YWNrLCAKLQkJCQlhc3RQdHIgKyAyLCAKLQkJCQljZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGggLSAxXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoIC0gMSk7IAotCQkJY2QuY29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBhc3RTdGFja1thc3RQdHIgKyAxXTsKKwkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCXRoaXMuYXN0UHRyICsgMiwKKwkJCQljZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGggLSAxXSwKKwkJCQkwLAorCQkJCWxlbmd0aCAtIDEpOworCQkJY2QuY29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyICsgMV07CiAJCX0gZWxzZSB7IC8vbmVlZCB0byBhZGQgZXhwbGljaXRseSB0aGUgc3VwZXIoKTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJYXN0U3RhY2ssIAotCQkJCWFzdFB0ciArIDEsIAotCQkJCWNkLnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sIAotCQkJCTAsIAotCQkJCWxlbmd0aCk7IAorCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJdGhpcy5hc3RQdHIgKyAxLAorCQkJCWNkLnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOwogCQkJY2QuY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOwogCQl9CiAJfSBlbHNlIHsKIAkJY2QuY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOwogCQlpZiAoIWNvbnRhaW5zQ29tbWVudChjZC5ib2R5U3RhcnQsIGNkLmJvZHlFbmQpKSB7CiAJCQljZC5iaXRzIHw9IEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jazsKLQkJfQkJCisJCX0KIAl9CiAKIAlpZiAoY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9PSAwKSB7CkBAIC0xMjcyLDQ3ICsxMzQ4LDUyIEBACiAgKi8KIHB1YmxpYyB2b2lkIHBhcnNlQmxvY2tTdGF0ZW1lbnRzKAogCUluaXRpYWxpemVyIGluaXRpYWxpemVyLAotCVR5cGVEZWNsYXJhdGlvbiB0eXBlLCAKKwlUeXBlRGVjbGFyYXRpb24gdHlwZSwKIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CiAKIAlpbml0aWFsaXplKCk7Ci0KKwkvLyBzZXQgdGhlIGxhc3RNb2RpZmllcnMgdG8gcmVmbGVjdCB0aGUgbW9kaWZpZXJzIG9mIHRoZSBpbml0aWFsaXplciB3aG9zZQorCS8vIGJsb2NrIHN0YXRlbWVudHMgYXJlIGJlaW5nIHBhcnNlZAorCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNjM0CisJdGhpcy5sYXN0TW9kaWZpZXJzID0gaW5pdGlhbGl6ZXIubW9kaWZpZXJzOworCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gaW5pdGlhbGl6ZXIubW9kaWZpZXJzU291cmNlU3RhcnQ7CiAJLy8gc2ltdWxhdGUgZ29Gb3JJbml0aWFsaXplciBleGNlcHQgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJhbGFuY2UgYnJhY2tldHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgZ29pbmcgdG8gYmUgYmFsYW5jZWQKIAlnb0ZvckJsb2NrU3RhdGVtZW50c29wdCgpOwotCQotCXJlZmVyZW5jZUNvbnRleHQgPSB0eXBlOwotCWNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7CiAKLQlzY2FubmVyLnJlc2V0VG8oaW5pdGlhbGl6ZXIuc291cmNlU3RhcnQsIGJvZHlFbmQoaW5pdGlhbGl6ZXIpKTsgLy8ganVzdCBhZnRlciB0aGUgYmVnaW5uaW5nIHsKKwl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSB0eXBlOworCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKKworCXRoaXMuc2Nhbm5lci5yZXNldFRvKGluaXRpYWxpemVyLnNvdXJjZVN0YXJ0LCBib2R5RW5kKGluaXRpYWxpemVyKSk7IC8vIGp1c3QgYWZ0ZXIgdGhlIGJlZ2lubmluZyB7CiAJY29uc3VtZU5lc3RlZE1ldGhvZCgpOwogCXRyeSB7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewotCQlsYXN0QWN0ID0gRVJST1JfQUNUSU9OOworCQl0aGlzLmxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CiAJfSBmaW5hbGx5IHsKLQkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CisJCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0tLTsKIAl9Ci0JCi0JaWYgKGxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisKKwlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQlpbml0aWFsaXplci5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJLy8gYXR0YWNoIHRoZSBzdGF0ZW1lbnRzIGFzIHdlIG1pZ2h0IGJlIHNlYXJjaGluZyBmb3IgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCB0eXBlCi0JaW5pdGlhbGl6ZXIuYmxvY2suZXhwbGljaXREZWNsYXJhdGlvbnMgPSByZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHItLV07CisJaW5pdGlhbGl6ZXIuYmxvY2suZXhwbGljaXREZWNsYXJhdGlvbnMgPSB0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyLS1dOwogCWludCBsZW5ndGg7Ci0JaWYgKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pID4gMCkgewotCQlTeXN0ZW0uYXJyYXljb3B5KGFzdFN0YWNrLCAoYXN0UHRyIC09IGxlbmd0aCkgKyAxLCBpbml0aWFsaXplci5ibG9jay5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAwLCBsZW5ndGgpOyAKKwlpZiAoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pID4gMCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXN0U3RhY2ssICh0aGlzLmFzdFB0ciAtPSBsZW5ndGgpICsgMSwgaW5pdGlhbGl6ZXIuYmxvY2suc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKIAl9IGVsc2UgewogCQkvLyBjaGVjayB3aGV0aGVyIHRoaXMgYmxvY2sgYXQgbGVhc3QgY29udGFpbnMgc29tZSBjb21tZW50IGluIGl0CiAJCWlmICghY29udGFpbnNDb21tZW50KGluaXRpYWxpemVyLmJsb2NrLnNvdXJjZVN0YXJ0LCBpbml0aWFsaXplci5ibG9jay5zb3VyY2VFbmQpKSB7CiAJCQlpbml0aWFsaXplci5ibG9jay5iaXRzIHw9IEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jazsKIAkJfQogCX0KLQkKKwogCS8vIG1hcmsgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCB0eXBlIGlmIG9uZSB3YXMgZm91bmQgZHVyaW5nIHBhcnNpbmcKIAlpZiAoKHR5cGUuYml0cyAmIEFTVE5vZGUuSGFzTG9jYWxUeXBlKSAhPSAwKSB7CiAJCWluaXRpYWxpemVyLmJpdHMgfD0gQVNUTm9kZS5IYXNMb2NhbFR5cGU7Ci0JfQkKKwl9CiB9CiAvKioKICAqIFBhcnNlIHRoZSBibG9jayBzdGF0ZW1lbnRzIGluc2lkZSB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCB0cnkgdG8gY29tcGxldGUgYXQgdGhlCkBAIC0xMzMyLDM3ICsxNDEzLDQyIEBACiAJCXJldHVybjsKIAogCWluaXRpYWxpemUoKTsKLQorCS8vIHNldCB0aGUgbGFzdE1vZGlmaWVycyB0byByZWZsZWN0IHRoZSBtb2RpZmllcnMgb2YgdGhlIG1ldGhvZCB3aG9zZQorCS8vIGJsb2NrIHN0YXRlbWVudHMgYXJlIGJlaW5nIHBhcnNlZAorCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNjM0CisJdGhpcy5sYXN0TW9kaWZpZXJzID0gbWQubW9kaWZpZXJzOworCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gbWQubW9kaWZpZXJzU291cmNlU3RhcnQ7CiAJLy8gc2ltdWxhdGUgZ29Gb3JNZXRob2RCb2R5IGV4Y2VwdCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmFsYW5jZSBicmFja2V0cyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBnb2luZyB0byBiZSBiYWxhbmNlZAogCWdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCk7CiAKLQlyZWZlcmVuY2VDb250ZXh0ID0gbWQ7Ci0JY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKLQkKLQlzY2FubmVyLnJlc2V0VG8obWQuYm9keVN0YXJ0LCBib2R5RW5kKG1kKSk7IC8vIHJlc2V0IHRoZSBzY2FubmVyIHRvIHBhcnNlciBmcm9tIHsgZG93biB0byB0aGUgY3Vyc29yIGxvY2F0aW9uCisJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gbWQ7CisJdGhpcy5jb21waWxhdGlvblVuaXQgPSB1bml0OworCisJdGhpcy5zY2FubmVyLnJlc2V0VG8obWQuYm9keVN0YXJ0LCBib2R5RW5kKG1kKSk7IC8vIHJlc2V0IHRoZSBzY2FubmVyIHRvIHBhcnNlciBmcm9tIHsgZG93biB0byB0aGUgY3Vyc29yIGxvY2F0aW9uCiAJY29uc3VtZU5lc3RlZE1ldGhvZCgpOwogCXRyeSB7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewotCQlsYXN0QWN0ID0gRVJST1JfQUNUSU9OOworCQl0aGlzLmxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CiAJfSBmaW5hbGx5IHsKLQkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CQkKKwkJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXS0tOwogCX0KLQkKLQlpZiAobGFzdEFjdCA9PSBFUlJPUl9BQ1RJT04pIHsKKworCWlmICh0aGlzLmxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisJCW1kLmJpdHMgfD0gQVNUTm9kZS5IYXNTeW50YXhFcnJvcnM7CiAJCXJldHVybjsKIAl9CiAKIAkvLyBhdHRhY2ggdGhlIHN0YXRlbWVudHMgYXMgd2UgbWlnaHQgYmUgc2VhcmNoaW5nIGZvciBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIHR5cGUKLQltZC5leHBsaWNpdERlY2xhcmF0aW9ucyA9IHJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0ci0tXTsKKwltZC5leHBsaWNpdERlY2xhcmF0aW9ucyA9IHRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHItLV07CiAJaW50IGxlbmd0aDsKLQlpZiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkgeworCWlmICgobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgIT0gMCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJYXN0U3RhY2ssIAotCQkJKGFzdFB0ciAtPSBsZW5ndGgpICsgMSwgCi0JCQltZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmFzdFN0YWNrLAorCQkJKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLAorCQkJbWQuc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOwogCX0gZWxzZSB7CiAJCWlmICghY29udGFpbnNDb21tZW50KG1kLmJvZHlTdGFydCwgbWQuYm9keUVuZCkpIHsKIAkJCW1kLmJpdHMgfD0gQVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwpAQCAtMTM3MSwyOSArMTQ1NywzNyBAQAogCiB9CiBwcm90ZWN0ZWQgdm9pZCBwb3BFbGVtZW50KGludCBraW5kKXsKLQlpZihlbGVtZW50UHRyIDwgMCB8fCBlbGVtZW50S2luZFN0YWNrW2VsZW1lbnRQdHJdICE9IGtpbmQpIHJldHVybjsKLQkKLQlwcmV2aW91c0tpbmQgPSBlbGVtZW50S2luZFN0YWNrW2VsZW1lbnRQdHJdOwotCXByZXZpb3VzSW5mbyA9IGVsZW1lbnRJbmZvU3RhY2tbZWxlbWVudFB0cl07Ci0JCisJaWYodGhpcy5lbGVtZW50UHRyIDwgMCB8fCB0aGlzLmVsZW1lbnRLaW5kU3RhY2tbdGhpcy5lbGVtZW50UHRyXSAhPSBraW5kKSByZXR1cm47CisKKwl0aGlzLnByZXZpb3VzS2luZCA9IHRoaXMuZWxlbWVudEtpbmRTdGFja1t0aGlzLmVsZW1lbnRQdHJdOworCXRoaXMucHJldmlvdXNJbmZvID0gdGhpcy5lbGVtZW50SW5mb1N0YWNrW3RoaXMuZWxlbWVudFB0cl07CisJdGhpcy5wcmV2aW91c09iamVjdEluZm8gPSB0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbdGhpcy5lbGVtZW50UHRyXTsKKworCXRoaXMuZWxlbWVudE9iamVjdEluZm9TdGFja1t0aGlzLmVsZW1lbnRQdHJdID0gbnVsbDsKKwogCXN3aXRjaCAoa2luZCkgewogCQlkZWZhdWx0IDoKLQkJCWVsZW1lbnRQdHItLTsKKwkJCXRoaXMuZWxlbWVudFB0ci0tOwogCQkJYnJlYWs7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgcG9wVW50aWxFbGVtZW50KGludCBraW5kKXsKLQlpZihlbGVtZW50UHRyIDwgMCkgcmV0dXJuOwotCWludCBpID0gZWxlbWVudFB0cjsKLQl3aGlsZSAoaSA+PSAwICYmIGVsZW1lbnRLaW5kU3RhY2tbaV0gIT0ga2luZCkgeworCWlmKHRoaXMuZWxlbWVudFB0ciA8IDApIHJldHVybjsKKwlpbnQgaSA9IHRoaXMuZWxlbWVudFB0cjsKKwl3aGlsZSAoaSA+PSAwICYmIHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSAhPSBraW5kKSB7CiAJCWktLTsKIAl9CiAJaWYoaSA+PSAwKSB7Ci0JCWlmKGkgPCBlbGVtZW50UHRyKSB7Ci0JCQlwcmV2aW91c0tpbmQgPSBlbGVtZW50S2luZFN0YWNrW2krMV07Ci0JCQlwcmV2aW91c0luZm8gPSBlbGVtZW50SW5mb1N0YWNrW2krMV07CisJCWlmKGkgPCB0aGlzLmVsZW1lbnRQdHIpIHsKKwkJCXRoaXMucHJldmlvdXNLaW5kID0gdGhpcy5lbGVtZW50S2luZFN0YWNrW2krMV07CisJCQl0aGlzLnByZXZpb3VzSW5mbyA9IHRoaXMuZWxlbWVudEluZm9TdGFja1tpKzFdOworCQkJdGhpcy5wcmV2aW91c09iamVjdEluZm8gPSB0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbaSsxXTsKKworCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDw9IHRoaXMuZWxlbWVudFB0cjsgaisrKSB7CisJCQkJdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW2pdID0gbnVsbDsKKwkJCX0KIAkJfQotCQllbGVtZW50UHRyID0gaTsJCisJCXRoaXMuZWxlbWVudFB0ciA9IGk7CiAJfQogfQogLyoKQEAgLTE0MDMsNyArMTQ5Nyw3IEBACiAJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlID0gMF0gPSAxOwogCXRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdID0gMDsKIAl0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyID0gMV0gPSAwOwotCQorCiAJLy8gaW5pdGlhbGl6ZSBlbGVtZW50IHN0YWNrCiAJaW50IGZpZWxkSW5pdGlhbGl6ZXJJbmRleCA9IGxhc3RJbmRleE9mRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CiAJaW50IG1ldGhvZEluZGV4ID0gbGFzdEluZGV4T2ZFbGVtZW50KEtfTUVUSE9EX0RFTElNSVRFUik7CkBAIC0xNDIwLDI3ICsxNTE0LDMxIEBACiAgKiBQcmVwYXJlcyB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciB0byBnbyBmb3IgSGVhZGVycy4KICAqLwogcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckhlYWRlcnMoKSB7Ci0JbmVzdGVkTWV0aG9kW25lc3RlZFR5cGUgPSAwXSA9IDA7Ci0JdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSA9IDA7Ci0JcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyID0gMF0gPSAwOwotCQorCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZSA9IDBdID0gMDsKKwl0aGlzLnZhcmlhYmxlc0NvdW50ZXJbdGhpcy5uZXN0ZWRUeXBlXSA9IDA7CisJdGhpcy5yZWFsQmxvY2tTdGFja1t0aGlzLnJlYWxCbG9ja1B0ciA9IDBdID0gMDsKKwogCXBvcFVudGlsRWxlbWVudChLX1RZUEVfREVMSU1JVEVSKTsKIAogCWlmKHRoaXMudG9wS25vd25FbGVtZW50S2luZChBU1NJU1RfUEFSU0VSKSAhPSBLX1RZUEVfREVMSU1JVEVSKSB7CiAJCS8vIGlzIG91dHNpZGUgYSB0eXBlIGFuZCBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0LgogCQkvLyByZW1vdmUgYWxsIGVsZW1lbnRzLgotCQl0aGlzLmZsdXNoRWxlbWVudFN0YWNrKCk7CisJCWZsdXNoRWxlbWVudFN0YWNrKCk7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgcHVzaE9uRWxlbWVudFN0YWNrKGludCBraW5kKXsKLQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhraW5kLCAwKTsKKwl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhraW5kLCAwLCBudWxsKTsKIH0KIHByb3RlY3RlZCB2b2lkIHB1c2hPbkVsZW1lbnRTdGFjayhpbnQga2luZCwgaW50IGluZm8peworCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKGtpbmQsIGluZm8sIG51bGwpOworfQorcHJvdGVjdGVkIHZvaWQgcHVzaE9uRWxlbWVudFN0YWNrKGludCBraW5kLCBpbnQgaW5mbywgT2JqZWN0IG9iamVjdEluZm8pewogCWlmICh0aGlzLmVsZW1lbnRQdHIgPCAtMSkgcmV0dXJuOwotCQorCiAJdGhpcy5wcmV2aW91c0tpbmQgPSAwOwogCXRoaXMucHJldmlvdXNJbmZvID0gMDsKLQkKKwl0aGlzLnByZXZpb3VzT2JqZWN0SW5mbyA9IG51bGw7CisKIAlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmVsZW1lbnRLaW5kU3RhY2subGVuZ3RoOwogCWlmICgrK3RoaXMuZWxlbWVudFB0ciA+PSBzdGFja0xlbmd0aCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KApAQCAtMTQ1MSwxNiArMTU0OSwyMSBAQAogCQkJdGhpcy5lbGVtZW50SW5mb1N0YWNrLCAwLAogCQkJdGhpcy5lbGVtZW50SW5mb1N0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSwgMCwKIAkJCXN0YWNrTGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZWxlbWVudE9iamVjdEluZm9TdGFjaywgMCwKKwkJCXRoaXMuZWxlbWVudE9iamVjdEluZm9TdGFjayA9IG5ldyBPYmplY3Rbc3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0sIDAsCisJCQlzdGFja0xlbmd0aCk7CiAJfQogCXRoaXMuZWxlbWVudEtpbmRTdGFja1t0aGlzLmVsZW1lbnRQdHJdID0ga2luZDsKIAl0aGlzLmVsZW1lbnRJbmZvU3RhY2tbdGhpcy5lbGVtZW50UHRyXSA9IGluZm87CisJdGhpcy5lbGVtZW50T2JqZWN0SW5mb1N0YWNrW3RoaXMuZWxlbWVudFB0cl0gPSBvYmplY3RJbmZvOwogfQogcHVibGljIHZvaWQgcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCkgewotCWlmKGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZAotCQkmJiAhKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpKSB7Ci0JCVJlY292ZXJlZEVsZW1lbnQgb2xkRWxlbWVudCA9IGN1cnJlbnRFbGVtZW50OworCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQKKwkJJiYgISh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpKSB7CisJCVJlY292ZXJlZEVsZW1lbnQgb2xkRWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQ7CiAJCXN1cGVyLnJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOwotCQlpZihvbGRFbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50KSB7CisJCWlmKG9sZEVsZW1lbnQgIT0gdGhpcy5jdXJyZW50RWxlbWVudCkgewogCQkJcG9wRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTQ2OCwxNiArMTU3MSwxNiBAQAogCX0KIH0KIHB1YmxpYyB2b2lkIHJlY292ZXJ5VG9rZW5DaGVjaygpIHsKLQlSZWNvdmVyZWRFbGVtZW50IG9sZEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKLQlzd2l0Y2ggKGN1cnJlbnRUb2tlbikgeworCVJlY292ZXJlZEVsZW1lbnQgb2xkRWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQ7CisJc3dpdGNoICh0aGlzLmN1cnJlbnRUb2tlbikgewogCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6CiAJCQlzdXBlci5yZWNvdmVyeVRva2VuQ2hlY2soKTsKLQkJCWlmKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpIHsKKwkJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcikgewogCQkJCWlmKG9sZEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCkgewogCQkJCQlwb3BVbnRpbEVsZW1lbnQoS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIpOwogCQkJCQlwb3BFbGVtZW50KEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKIAkJCQl9Ci0JCQkJaWYoY3VycmVudEVsZW1lbnQgIT0gb2xkRWxlbWVudAorCQkJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gb2xkRWxlbWVudAogCQkJCQkmJiB0b3BLbm93bkVsZW1lbnRLaW5kKEFTU0lTVF9QQVJTRVIpICE9IEtfTUVUSE9EX0RFTElNSVRFUikgewogCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19NRVRIT0RfREVMSU1JVEVSKTsKIAkJCQl9CkBAIC0xNDg1LDcgKzE1ODgsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDoKIAkJCXN1cGVyLnJlY292ZXJ5VG9rZW5DaGVjaygpOwotCQkJaWYoY3VycmVudEVsZW1lbnQgIT0gb2xkRWxlbWVudCAmJiAhaXNJbnNpZGVBdHRyaWJ1dGVWYWx1ZSgpKSB7CisJCQlpZih0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG9sZEVsZW1lbnQgJiYgIWlzSW5zaWRlQXR0cmlidXRlVmFsdWUoKSkgewogCQkJCWlmKG9sZEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcgogCQkJCQl8fCBvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kCiAJCQkJCXx8IChvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQmxvY2sgJiYgb2xkRWxlbWVudC5wYXJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcikKQEAgLTE0OTQsOSArMTU5Nyw5IEBACiAJCQkJCXBvcEVsZW1lbnQoS19NRVRIT0RfREVMSU1JVEVSKTsKIAkJCQl9IGVsc2UgaWYob2xkRWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpIHsKIAkJCQkJcG9wVW50aWxFbGVtZW50KEtfVFlQRV9ERUxJTUlURVIpOwotCQkJCQlpZighKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikgCisJCQkJCWlmKCEodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pCiAJCQkJCQkJfHwgaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpCi0JCQkJCQkJfHwgY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRVbml0KSB7CisJCQkJCQkJfHwgdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpIHsKIAkJCQkJCXBvcEVsZW1lbnQoS19UWVBFX0RFTElNSVRFUik7CiAJCQkJCX0KIAkJCQl9CkBAIC0xNTA4LDcgKzE2MTEsNyBAQAogCX0KIH0KIHB1YmxpYyB2b2lkIHJlc2V0KCl7Ci0JdGhpcy5mbHVzaEFzc2lzdFN0YXRlKCk7CisJZmx1c2hBc3Npc3RTdGF0ZSgpOwogfQogLyoKICAqIFJlc2V0IGNvbnRleHQgc28gYXMgdG8gcmVzdW1lIHRvIHJlZ3VsYXIgcGFyc2UgbG9vcApAQCAtMTUxOSw1NCArMTYyMiw1NCBAQAogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVBZnRlclJlY292ZXJ5KCkgewogCi0JLy8gcmVzZXQgaW50ZXJuYWwgc3RhY2tzIAorCS8vIHJlc2V0IGludGVybmFsIHN0YWNrcwogCXRoaXMuYXN0UHRyID0gLTE7CiAJdGhpcy5hc3RMZW5ndGhQdHIgPSAtMTsKIAl0aGlzLmV4cHJlc3Npb25QdHIgPSAtMTsKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHIgPSAtMTsKLQl0aGlzLmlkZW50aWZpZXJQdHIgPSAtMTsJCisJdGhpcy5pZGVudGlmaWVyUHRyID0gLTE7CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyCT0gLTE7CiAJdGhpcy5pbnRQdHIgPSAtMTsKIAl0aGlzLmRpbWVuc2lvbnMgPSAwIDsKIAl0aGlzLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPSAwOwotCQorCiAJdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyID0gLTE7CiAJdGhpcy5nZW5lcmljc0xlbmd0aFB0ciA9IC0xOwogCXRoaXMuZ2VuZXJpY3NQdHIgPSAtMTsKLQkKKwogCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7CiAJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IC0xOwogCiAJLy8gaWYgaW4gZGlldCBtb2RlLCByZXNldCB0aGUgZGlldCBjb3VudGVyIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gcmVzdGFydCBvdXRzaWRlIGFuIGluaXRpYWxpemVyLgotCWlmIChkaWV0KSBkaWV0SW50ID0gMDsKKwlpZiAodGhpcy5kaWV0KSB0aGlzLmRpZXRJbnQgPSAwOwogCiAJLyogYXR0ZW1wdCB0byBtb3ZlIGNoZWNrcG9pbnQgbG9jYXRpb24gKi8KLQlpZiAoIXRoaXMubW92ZVJlY292ZXJ5Q2hlY2twb2ludCgpKSByZXR1cm4gZmFsc2U7CisJaWYgKCFtb3ZlUmVjb3ZlcnlDaGVja3BvaW50KCkpIHJldHVybiBmYWxzZTsKIAogCS8vIG9ubHkgbG9vayBmb3IgaGVhZGVycwotCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24KKwlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24KIAkJfHwgdGhpcy5hc3Npc3ROb2RlICE9IG51bGwpewogCQlpZihpc0luc2lkZU1ldGhvZCgpICYmCi0JCQlpc0luZGlyZWN0bHlJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkgJiYJCQorCQkJaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpICYmCiAJCQl0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbAotCQkJKXsgCi0JCQl0aGlzLnByZXBhcmVGb3JCbG9ja1N0YXRlbWVudHMoKTsKKwkJCSl7CisJCQlwcmVwYXJlRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CiAJCQlnb0ZvckJsb2NrU3RhdGVtZW50c09yQ2F0Y2hIZWFkZXIoKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMucHJlcGFyZUZvckhlYWRlcnMoKTsKKwkJCXByZXBhcmVGb3JIZWFkZXJzKCk7CiAJCQlnb0ZvckhlYWRlcnMoKTsKLQkJCWRpZXQgPSB0cnVlOyAvLyBwYXNzZWQgdGhpcyBwb2ludCwgd2lsbCBub3QgY29uc2lkZXIgbWV0aG9kIGJvZGllcworCQkJdGhpcy5kaWV0ID0gdHJ1ZTsgLy8gcGFzc2VkIHRoaXMgcG9pbnQsIHdpbGwgbm90IGNvbnNpZGVyIG1ldGhvZCBib2RpZXMKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCi0JCXx8IHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pewotCQkJCi0JCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpewotCQkJdGhpcy5wcmVwYXJlRm9ySGVhZGVycygpOworCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJCXx8IHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbil7CisKKwkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKKwkJCXByZXBhcmVGb3JIZWFkZXJzKCk7CiAJCQlnb0ZvckhlYWRlcnMoKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMucHJlcGFyZUZvckJsb2NrU3RhdGVtZW50cygpOworCQkJcHJlcGFyZUZvckJsb2NrU3RhdGVtZW50cygpOwogCQkJZ29Gb3JCbG9ja1N0YXRlbWVudHNPckNhdGNoSGVhZGVyKCk7CiAJCX0KIAkJcmV0dXJuIHRydWU7CkBAIC0xNTc5LDEwICsxNjgyLDEwIEBACiAJcmV0dXJuIHRvcEtub3duRWxlbWVudEluZm8ob3duZXIsIDApOwogfQogcHJvdGVjdGVkIGludCB0b3BLbm93bkVsZW1lbnRJbmZvKGludCBvd25lciwgaW50IG9mZlNldCkgewotCWludCBpID0gZWxlbWVudFB0cjsKKwlpbnQgaSA9IHRoaXMuZWxlbWVudFB0cjsKIAl3aGlsZShpID4gLTEpIHsKLQkJaWYoKGVsZW1lbnRLaW5kU3RhY2tbaV0gJiBvd25lcikgIT0gMCkgewotCQkJaWYob2ZmU2V0IDw9IDApIHJldHVybiBlbGVtZW50SW5mb1N0YWNrW2ldOworCQlpZigodGhpcy5lbGVtZW50S2luZFN0YWNrW2ldICYgb3duZXIpICE9IDApIHsKKwkJCWlmKG9mZlNldCA8PSAwKSByZXR1cm4gdGhpcy5lbGVtZW50SW5mb1N0YWNrW2ldOwogCQkJb2ZmU2V0LS07CiAJCX0KIAkJaS0tOwpAQCAtMTU5MywxNiArMTY5NiwzMCBAQAogCXJldHVybiB0b3BLbm93bkVsZW1lbnRLaW5kKG93bmVyLCAwKTsKIH0KIHByb3RlY3RlZCBpbnQgdG9wS25vd25FbGVtZW50S2luZChpbnQgb3duZXIsIGludCBvZmZTZXQpIHsKLQlpbnQgaSA9IGVsZW1lbnRQdHI7CisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CiAJd2hpbGUoaSA+IC0xKSB7Ci0JCWlmKChlbGVtZW50S2luZFN0YWNrW2ldICYgb3duZXIpICE9IDApIHsKLQkJCWlmKG9mZlNldCA8PSAwKSByZXR1cm4gZWxlbWVudEtpbmRTdGFja1tpXTsKKwkJaWYoKHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSAmIG93bmVyKSAhPSAwKSB7CisJCQlpZihvZmZTZXQgPD0gMCkgcmV0dXJuIHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXTsKIAkJCW9mZlNldC0tOwogCQl9CiAJCWktLTsKIAl9CiAJcmV0dXJuIDA7CiB9Citwcm90ZWN0ZWQgT2JqZWN0IHRvcEtub3duRWxlbWVudE9iamVjdEluZm8oaW50IG93bmVyLCBpbnQgb2ZmU2V0KSB7CisJaW50IGkgPSB0aGlzLmVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCWlmKCh0aGlzLmVsZW1lbnRLaW5kU3RhY2tbaV0gJiBvd25lcikgIT0gMCkgeworCQkJaWYob2ZmU2V0IDw9IDApIHJldHVybiB0aGlzLmVsZW1lbnRPYmplY3RJbmZvU3RhY2tbaV07CisJCQlvZmZTZXQtLTsKKwkJfQorCQlpLS07CisJfQorCXJldHVybiBudWxsOworfQorcHJvdGVjdGVkIE9iamVjdCB0b3BLbm93bkVsZW1lbnRPYmplY3RJbmZvKGludCBvd25lcikgeworCXJldHVybiB0b3BLbm93bkVsZW1lbnRPYmplY3RJbmZvKG93bmVyLCAwKTsKK30KIC8qKgogICogSWYgdGhlIGdpdmVuIGFzdCBub2RlIGlzIGluc2lkZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsCiAgKiB0aGVuIHdyYXAgaXQgd2l0aCBhIGZha2UgY29uc3RydWN0b3IgY2FsbC4KQEAgLTE2MTQsOCArMTczMSw4IEBACiAJCQkoKChzZWxlY3RvciA9IHRvcEtub3duRWxlbWVudEluZm8oQVNTSVNUX1BBUlNFUikpID09IFRISVNfQ09OU1RSVUNUT1IpIHx8CiAJCQkoc2VsZWN0b3IgPT0gU1VQRVJfQ09OU1RSVUNUT1IpKSkgewogCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjYWxsID0gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKAotCQkJKHNlbGVjdG9yID09IFRISVNfQ09OU1RSVUNUT1IpID8gCi0JCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6IAorCQkJKHNlbGVjdG9yID09IFRISVNfQ09OU1RSVUNUT1IpID8KKwkJCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzIDoKIAkJCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcgogCQkpOwogCQljYWxsLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW10geyhFeHByZXNzaW9uKWFzdH07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0U291cmNlRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RTb3VyY2VGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDRhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0U291cmNlRmllbGQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlJlc29sdmVkU291cmNlRmllbGQ7CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RTb3VyY2VGaWVsZCBleHRlbmRzIFJlc29sdmVkU291cmNlRmllbGQgeworCXByaXZhdGUgTWFwIGJpbmRpbmdDYWNoZTsKKwlwcml2YXRlIE1hcCBpbmZvQ2FjaGU7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVLZXk7CisJcHJpdmF0ZSBib29sZWFuIGlzUmVzb2x2ZWQ7CisKKwlwdWJsaWMgQXNzaXN0U291cmNlRmllbGQoSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSwgTWFwIGJpbmRpbmdDYWNoZSwgTWFwIGluZm9DYWNoZSkgeworCQlzdXBlcihwYXJlbnQsIG5hbWUsIG51bGwpOworCQl0aGlzLmJpbmRpbmdDYWNoZSA9IGJpbmRpbmdDYWNoZTsKKwkJdGhpcy5pbmZvQ2FjaGUgPSBpbmZvQ2FjaGU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50SW5mbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5pbmZvQ2FjaGUuZ2V0KHRoaXMpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZUZpZWxkI2dldEtleSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCWlmICh0aGlzLnVuaXF1ZUtleSA9PSBudWxsKSB7CisJCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgdGhpcy5iaW5kaW5nQ2FjaGUuZ2V0KHRoaXMpOworCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCXRoaXMuaXNSZXNvbHZlZCA9IHRydWU7CisJCQkJdGhpcy51bmlxdWVLZXkgPSBuZXcgU3RyaW5nKGJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pc1Jlc29sdmVkID0gZmFsc2U7CisJCQkJdHJ5IHsKKwkJCQkJdGhpcy51bmlxdWVLZXkgPSBnZXRLZXkodGhpcywgZmFsc2UvKmRvbid0IG9wZW4qLyk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaGFwcGVuIG9ubHkgaWYgZm9yY2Ugb3BlbiBpcyB0cnVlCisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy51bmlxdWVLZXk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKKwkJZ2V0S2V5KCk7CisJCXJldHVybiB0aGlzLmlzUmVzb2x2ZWQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvLGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgeworCQlzdXBlci50b1N0cmluZ0luZm8odGFiLCBidWZmZXIsIGluZm8sIHNob3dSZXNvbHZlZEluZm8gJiYgaXNSZXNvbHZlZCgpKTsKKwl9CisKKwlwdWJsaWMgSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lLCB0aGlzLmluZm9DYWNoZSk7CisJfQorCisJcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBpbnQgY291bnQpIHsKKwkJQXNzaXN0U291cmNlVHlwZSB0eXBlID0gbmV3IEFzc2lzdFNvdXJjZVR5cGUodGhpcywgdHlwZU5hbWUsIHRoaXMuYmluZGluZ0NhY2hlLCB0aGlzLmluZm9DYWNoZSk7CisJCXR5cGUub2NjdXJyZW5jZUNvdW50ID0gY291bnQ7CisJCXJldHVybiB0eXBlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RTb3VyY2VNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RTb3VyY2VNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZmMjRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFNvdXJjZU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUmVzb2x2ZWRTb3VyY2VNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RTb3VyY2VNZXRob2QgZXh0ZW5kcyBSZXNvbHZlZFNvdXJjZU1ldGhvZCB7CisJcHJpdmF0ZSBNYXAgYmluZGluZ0NhY2hlOworCXByaXZhdGUgTWFwIGluZm9DYWNoZTsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUtleTsKKwlwcml2YXRlIGJvb2xlYW4gaXNSZXNvbHZlZDsKKworCXB1YmxpYyBBc3Npc3RTb3VyY2VNZXRob2QoSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMsIE1hcCBiaW5kaW5nQ2FjaGUsIE1hcCBpbmZvQ2FjaGUpIHsKKwkJc3VwZXIocGFyZW50LCBuYW1lLCBwYXJhbWV0ZXJUeXBlcywgbnVsbCk7CisJCXRoaXMuYmluZGluZ0NhY2hlID0gYmluZGluZ0NhY2hlOworCQl0aGlzLmluZm9DYWNoZSA9IGluZm9DYWNoZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRJbmZvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmluZm9DYWNoZS5nZXQodGhpcyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlTWV0aG9kI2dldEtleSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCWlmICh0aGlzLnVuaXF1ZUtleSA9PSBudWxsKSB7CisJCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgdGhpcy5iaW5kaW5nQ2FjaGUuZ2V0KHRoaXMpOworCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCXRoaXMuaXNSZXNvbHZlZCA9IHRydWU7CisJCQkJdGhpcy51bmlxdWVLZXkgPSBuZXcgU3RyaW5nKGJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pc1Jlc29sdmVkID0gZmFsc2U7CisJCQkJdHJ5IHsKKwkJCQkJdGhpcy51bmlxdWVLZXkgPSBnZXRLZXkodGhpcywgZmFsc2UvKmRvbid0IG9wZW4qLyk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaGFwcGVuIG9ubHkgaWYgZm9yY2Ugb3BlbiBpcyB0cnVlCisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy51bmlxdWVLZXk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKKwkJZ2V0S2V5KCk7CisJCXJldHVybiB0aGlzLmlzUmVzb2x2ZWQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvLGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgeworCQlzdXBlci50b1N0cmluZ0luZm8odGFiLCBidWZmZXIsIGluZm8sIHNob3dSZXNvbHZlZEluZm8gJiYgaXNSZXNvbHZlZCgpKTsKKwl9CisKKwlwdWJsaWMgSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lLCB0aGlzLmluZm9DYWNoZSk7CisJfQorCisJcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBpbnQgY291bnQpIHsKKwkJQXNzaXN0U291cmNlVHlwZSB0eXBlID0gbmV3IEFzc2lzdFNvdXJjZVR5cGUodGhpcywgdHlwZU5hbWUsIHRoaXMuYmluZGluZ0NhY2hlLCB0aGlzLmluZm9DYWNoZSk7CisJCXR5cGUub2NjdXJyZW5jZUNvdW50ID0gY291bnQ7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyBJVHlwZVBhcmFtZXRlciBnZXRUeXBlUGFyYW1ldGVyKFN0cmluZyB0eXBlUGFyYW1ldGVyTmFtZSkgeworCQlyZXR1cm4gbmV3IEFzc2lzdFR5cGVQYXJhbWV0ZXIodGhpcywgdHlwZVBhcmFtZXRlck5hbWUsIHRoaXMuaW5mb0NhY2hlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0U291cmNlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM3MTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFNvdXJjZVR5cGUuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUmVzb2x2ZWRTb3VyY2VUeXBlOworCitwdWJsaWMgY2xhc3MgQXNzaXN0U291cmNlVHlwZSBleHRlbmRzIFJlc29sdmVkU291cmNlVHlwZSB7CisJcHJpdmF0ZSBNYXAgYmluZGluZ0NhY2hlOworCXByaXZhdGUgTWFwIGluZm9DYWNoZTsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUtleTsKKwlwcml2YXRlIGJvb2xlYW4gaXNSZXNvbHZlZDsKKworCXB1YmxpYyBBc3Npc3RTb3VyY2VUeXBlKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUsIE1hcCBiaW5kaW5nQ2FjaGUsIE1hcCBpbmZvQ2FjaGUpIHsKKwkJc3VwZXIocGFyZW50LCBuYW1lLCBudWxsKTsKKwkJdGhpcy5iaW5kaW5nQ2FjaGUgPSBiaW5kaW5nQ2FjaGU7CisJCXRoaXMuaW5mb0NhY2hlID0gaW5mb0NhY2hlOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuaW5mb0NhY2hlLmdldCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKGlzUmVzb2x2ZWQoKSkgeworCQkJcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyksIHRoaXMuZ2V0S2V5KCkpOworCQl9CisJCXJldHVybiBnZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nLCB0cnVlLypzaG93IHBhcmFtZXRlcnMqLyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZSNnZXRLZXkoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlpZiAodGhpcy51bmlxdWVLZXkgPT0gbnVsbCkgeworCQkJQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIHRoaXMuYmluZGluZ0NhY2hlLmdldCh0aGlzKTsKKwkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQl0aGlzLmlzUmVzb2x2ZWQgPSB0cnVlOworCQkJCXRoaXMudW5pcXVlS2V5ID0gbmV3IFN0cmluZyhiaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuaXNSZXNvbHZlZCA9IGZhbHNlOworCQkJCXRyeSB7CisJCQkJCXRoaXMudW5pcXVlS2V5ID0gZ2V0S2V5KHRoaXMsIGZhbHNlLypkb24ndCBvcGVuKi8pOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGhhcHBlbiBvbmx5IGlmIGZvcmNlIG9wZW4gaXMgdHJ1ZQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMudW5pcXVlS2V5OworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CisJCWdldEtleSgpOworCQlyZXR1cm4gdGhpcy5pc1Jlc29sdmVkOworCX0KKworCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbyxib29sZWFuIHNob3dSZXNvbHZlZEluZm8pIHsKKwkJc3VwZXIudG9TdHJpbmdJbmZvKHRhYiwgYnVmZmVyLCBpbmZvLCBzaG93UmVzb2x2ZWRJbmZvICYmIGlzUmVzb2x2ZWQoKSk7CisJfQorCisJcHVibGljIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiBuZXcgQXNzaXN0QW5ub3RhdGlvbih0aGlzLCBhbm5vdGF0aW9uTmFtZSwgdGhpcy5pbmZvQ2FjaGUpOworCX0KKworCXB1YmxpYyBJRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSkgeworCQlyZXR1cm4gbmV3IEFzc2lzdFNvdXJjZUZpZWxkKHRoaXMsIGZpZWxkTmFtZSwgdGhpcy5iaW5kaW5nQ2FjaGUsIHRoaXMuaW5mb0NhY2hlKTsKKwl9CisKKwlwdWJsaWMgSUluaXRpYWxpemVyIGdldEluaXRpYWxpemVyKGludCBjb3VudCkgeworCQlyZXR1cm4gbmV3IEFzc2lzdEluaXRpYWxpemVyKHRoaXMsIGNvdW50LCB0aGlzLmJpbmRpbmdDYWNoZSwgdGhpcy5pbmZvQ2FjaGUpOworCX0KKworCXB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgc2VsZWN0b3IsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKSB7CisJCXJldHVybiBuZXcgQXNzaXN0U291cmNlTWV0aG9kKHRoaXMsIHNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcywgdGhpcy5iaW5kaW5nQ2FjaGUsIHRoaXMuaW5mb0NhY2hlKTsKKwl9CisKKwlwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RTb3VyY2VUeXBlKHRoaXMsIHR5cGVOYW1lLCB0aGlzLmJpbmRpbmdDYWNoZSwgdGhpcy5pbmZvQ2FjaGUpOworCX0KKworCXB1YmxpYyBJVHlwZSBnZXRUeXBlKFN0cmluZyB0eXBlTmFtZSwgaW50IGNvdW50KSB7CisJCUFzc2lzdFNvdXJjZVR5cGUgdHlwZSA9IG5ldyBBc3Npc3RTb3VyY2VUeXBlKHRoaXMsIHR5cGVOYW1lLCB0aGlzLmJpbmRpbmdDYWNoZSwgdGhpcy5pbmZvQ2FjaGUpOworCQl0eXBlLm9jY3VycmVuY2VDb3VudCA9IGNvdW50OworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgSVR5cGVQYXJhbWV0ZXIgZ2V0VHlwZVBhcmFtZXRlcihTdHJpbmcgdHlwZVBhcmFtZXRlck5hbWUpIHsKKwkJcmV0dXJuIG5ldyBBc3Npc3RUeXBlUGFyYW1ldGVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJOYW1lLCB0aGlzLmluZm9DYWNoZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFR5cGVQYXJhbWV0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RUeXBlUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4YzJmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RUeXBlUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlR5cGVQYXJhbWV0ZXI7CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVHlwZVBhcmFtZXRlciB7CisJcHJpdmF0ZSBNYXAgaW5mb0NhY2hlOworCXB1YmxpYyBBc3Npc3RUeXBlUGFyYW1ldGVyKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUsIE1hcCBpbmZvQ2FjaGUpIHsKKwkJc3VwZXIocGFyZW50LCBuYW1lKTsKKwkJdGhpcy5pbmZvQ2FjaGUgPSBpbmZvQ2FjaGU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50SW5mbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5pbmZvQ2FjaGUuZ2V0KHRoaXMpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9FbmdpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9FbmdpbmUuamF2YQppbmRleCA4NTlkYjhmLi4xNGY5YTAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0VuZ2luZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTU3LDcgKzU3LDcgQEAKIAkgKiBBZGQgYW4gYWRkaXRpb25hbCBiaW5hcnkgdHlwZQogCSAqLwogCXB1YmxpYyB2b2lkIGFjY2VwdChJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZywgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKLQkJbG9va3VwRW52aXJvbm1lbnQuY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jcmVhdGVCaW5hcnlUeXBlRnJvbShiaW5hcnlUeXBlLCBwYWNrYWdlQmluZGluZywgYWNjZXNzUmVzdHJpY3Rpb24pOwogCX0KIAogCS8qKgpAQCAtNjUsMTEgKzY1LDE3IEBACiAJICovCiAJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKIAkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDEsIDEsIHRoaXMuY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCQorCQlBc3Npc3RQYXJzZXIgYXNzaXN0UGFyc2VyID0gZ2V0UGFyc2VyKCk7CisJCU9iamVjdCBwYXJzZXJTdGF0ZSA9IGFzc2lzdFBhcnNlci5iZWNvbWVTaW1wbGVQYXJzZXIoKTsKKwkJCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPQotCQkJdGhpcy5nZXRQYXJzZXIoKS5kaWV0UGFyc2Uoc291cmNlVW5pdCwgcmVzdWx0KTsKKwkJCWFzc2lzdFBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgcmVzdWx0KTsKKwkJCisJCWFzc2lzdFBhcnNlci5yZXN0b3JlQXNzaXN0UGFyc2VyKHBhcnNlclN0YXRlKTsKIAotCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBhY2Nlc3NSZXN0cmljdGlvbik7Ci0JCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOworCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCB0cnVlKTsKIAl9CiAKIAkvKioKQEAgLTg1LDIzICs5MSwyNSBAQAogCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfQU5EX01FVEhPRCAvLyBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCiAJCQkJfCBTb3VyY2VUeXBlQ29udmVydGVyLk1FTUJFUl9UWVBFLCAvLyBuZWVkIG1lbWJlciB0eXBlcwogCQkJCS8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCi0JCQkJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLAorCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLAogCQkJCXJlc3VsdCk7CiAKIAkJaWYgKHVuaXQgIT0gbnVsbCkgewotCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCwgYWNjZXNzUmVzdHJpY3Rpb24pOwotCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7CiAJCX0KIAl9CiAKIAlwdWJsaWMgYWJzdHJhY3QgQXNzaXN0UGFyc2VyIGdldFBhcnNlcigpOwogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUltcG9ydENhY2hlcygpIHsKKwkJaWYgKHRoaXMuY3VycmVudFBhY2thZ2VOYW1lID09IG51bGwpIHsKKwkJCWluaXRpYWxpemVQYWNrYWdlQ2FjaGUoKTsKKwkJfQorCQkKIAkJSW1wb3J0QmluZGluZ1tdIGltcG9ydEJpbmRpbmdzID0gdGhpcy51bml0U2NvcGUuaW1wb3J0czsKIAkJaW50IGxlbmd0aCA9IGltcG9ydEJpbmRpbmdzID09IG51bGwgPyAwIDogaW1wb3J0QmluZGluZ3MubGVuZ3RoOwogCi0JCXRoaXMuY3VycmVudFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUsICcuJyk7Ci0KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gaW1wb3J0QmluZGluZ3NbaV07CiAJCQlpZihpbXBvcnRCaW5kaW5nLm9uRGVtYW5kKSB7CkBAIC0xMjYsNiArMTM0LDE3IEBACiAKIAkJdGhpcy5pbXBvcnRDYWNoZXNJbml0aWFsaXplZCA9IHRydWU7CiAJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ2FjaGUoKSB7CisJCWlmICh0aGlzLnVuaXRTY29wZS5mUGFja2FnZSAhPSBudWxsKSB7CisJCQl0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUsICcuJyk7CisJCX0gZWxzZSBpZiAodGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dCAhPSBudWxsICYmCisJCQkJdGhpcy51bml0U2NvcGUucmVmZXJlbmNlQ29udGV4dC5jdXJyZW50UGFja2FnZSAhPSBudWxsKSB7CisJCQl0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnVuaXRTY29wZS5yZWZlcmVuY2VDb250ZXh0LmN1cnJlbnRQYWNrYWdlLnRva2VucywgJy4nKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY3VycmVudFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQl9CisJfQogCiAJcHJvdGVjdGVkIGJvb2xlYW4gbXVzdFF1YWxpZnlUeXBlKAogCQljaGFyW10gcGFja2FnZU5hbWUsCkBAIC0xMzQsMTEgKzE1MywxMSBAQAogCQlpbnQgbW9kaWZpZXJzKSB7CiAKIAkJLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGVzIGRlZmluZWQgaW50byB0aGUgY3VycmVudCBDVSB5ZXQuCi0JCWlmICh1bml0U2NvcGUgPT0gbnVsbCkKKwkJaWYgKHRoaXMudW5pdFNjb3BlID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAogCQlpZighdGhpcy5pbXBvcnRDYWNoZXNJbml0aWFsaXplZCkgewotCQkJdGhpcy5pbml0aWFsaXplSW1wb3J0Q2FjaGVzKCk7CisJCQlpbml0aWFsaXplSW1wb3J0Q2FjaGVzKCk7CiAJCX0KIAogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW1wb3J0Q2FjaGVDb3VudDsgaSsrKSB7CkBAIC0yNzcsNyArMjk2LDcgQEAKIAkJCWludCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQkJaWYgKG1ldGhvZC5ib2R5U3RhcnQgPiBwb3NpdGlvbikKKwkJCQlpZiAobWV0aG9kLmJvZHlTdGFydCA+IHBvc2l0aW9uICsgMSkKIAkJCQkJY29udGludWU7CiAKIAkJCQlpZihtZXRob2QuaXNEZWZhdWx0Q29uc3RydWN0b3IoKSkKQEAgLTMwOSw0MSArMzI4LDQ0IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQlsb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOworCXByb3RlY3RlZCB2b2lkIHJlc2V0KGJvb2xlYW4gcmVzZXRMb29rdXBFbnZpcm9ubWVudCkgeworCQlpZiAocmVzZXRMb29rdXBFbnZpcm9ubWVudCkgdGhpcy5sb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFR5cGVTaWduYXR1cmUoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJcmV0dXJuIHR5cGVCaW5kaW5nLnNpZ25hdHVyZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRTaWduYXR1cmUoQmluZGluZyBiaW5kaW5nKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBudWxsOwotCQlpZiAoKGJpbmRpbmcua2luZCgpICYgQmluZGluZy5UWVBFKSAhPSAwKSB7Ci0JCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOwotCQkJcmVzdWx0ID0gdHlwZUJpbmRpbmcuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKLQkJfSBlbHNlIGlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLk1FVEhPRCkgIT0gMCkgewotCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsKLQkJCWludCBvbGRNb2QgPSBtZXRob2RCaW5kaW5nLm1vZGlmaWVyczsKLQkJCS8vVE9ETyByZW1vdmUgdGhlIG5leHQgbGluZSB3aGVuIG1ldGhvZCBmcm9tIGJpbmFyeSB0eXBlIHdpbGwgYmUgYWJsZSB0byBnZW5lcmF0ZSBnZW5lcmljIHNpZ2FudXRlCi0JCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7Ci0JCQlyZXN1bHQgPSBtZXRob2RCaW5kaW5nLmdlbmVyaWNTaWduYXR1cmUoKTsKLQkJCWlmKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gbWV0aG9kQmluZGluZy5zaWduYXR1cmUoKTsKLQkJCX0KLQkJCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gb2xkTW9kOwotCQl9CisJCWNoYXJbXSByZXN1bHQgPSB0eXBlQmluZGluZy5zaWduYXR1cmUoKTsKIAkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAJCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkocmVzdWx0LCAnLycsICcuJyk7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwdWJsaWMgc3RhdGljIGNoYXJbXVtdIGdldFNpZ25hdHVyZXMoQmluZGluZ1tdIGJpbmRpbmdzKSB7Ci0JCWludCBsZW5ndGggPSBiaW5kaW5ncyA9PSBudWxsID8gMCA6IGJpbmRpbmdzLmxlbmd0aDsKLQkJY2hhcltdW10gc2lnbmF0dXJlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJc2lnbmF0dXJlc1tpXSA9IGdldFNpZ25hdHVyZShiaW5kaW5nc1tpXSk7CisJcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0U2lnbmF0dXJlKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQljaGFyW10gcmVzdWx0ID0gbnVsbDsKKworCQlpbnQgb2xkTW9kID0gbWV0aG9kQmluZGluZy5tb2RpZmllcnM7CisJCS8vVE9ETyByZW1vdmUgdGhlIG5leHQgbGluZSB3aGVuIG1ldGhvZCBmcm9tIGJpbmFyeSB0eXBlIHdpbGwgYmUgYWJsZSB0byBnZW5lcmF0ZSBnZW5lcmljIHNpZ25hdHVyZQorCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7CisJCXJlc3VsdCA9IG1ldGhvZEJpbmRpbmcuZ2VuZXJpY1NpZ25hdHVyZSgpOworCQlpZihyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gbWV0aG9kQmluZGluZy5zaWduYXR1cmUoKTsKIAkJfQotCQlyZXR1cm4gc2lnbmF0dXJlczsKKwkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgPSBvbGRNb2Q7CisKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSBDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkocmVzdWx0LCAnLycsICcuJyk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRTaWduYXR1cmUoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJY2hhcltdIHJlc3VsdCA9IG51bGw7CisKKwkJcmVzdWx0ID0gdHlwZUJpbmRpbmcuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKKworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJlc3VsdCA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShyZXN1bHQsICcvJywgJy4nKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9LZXl3b3Jkcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0tleXdvcmRzLmphdmEKaW5kZXggNGY2MTQyNC4uNzljNGM3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0tleXdvcmRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0tleXdvcmRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNyArMTIsNyBAQAogCiBwdWJsaWMgaW50ZXJmYWNlIEtleXdvcmRzIHsKIAlpbnQgQ09VTlQgPSA0MTsKLQkKKwogCWNoYXJbXSBBQlNUUkFDVCA9ICJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBBU1NFUlQgPSAiYXNzZXJ0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIEJSRUFLID0gImJyZWFrIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCkBAIC0yMyw2ICsyMyw3IEBACiAJY2hhcltdIERFRkFVTFQgPSAiZGVmYXVsdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBETyA9ICJkbyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBFTFNFID0gImVsc2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gRU5VTSA9ICJlbnVtIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIEVYVEVORFMgPSAiZXh0ZW5kcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBGSU5BTCA9ICJmaW5hbCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBGSU5BTExZID0gImZpbmFsbHkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbkphdmFkb2MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbkphdmFkb2MuamF2YQppbmRleCA2ZjBkYTkzLi4yMTFiYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25KYXZhZG9jLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uSmF2YWRvYy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDYgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlJlZmVyZW5jZUNvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiAvKioKQEAgLTE5LDkgKzIwLDEzIEBACiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uSmF2YWRvYyBleHRlbmRzIEphdmFkb2MgewogCiAJRXhwcmVzc2lvbiBzZWxlY3RlZE5vZGU7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTAxOQorCS8vIEZsYWcgcmFpc2VkIHdoZW4gc2VsZWN0aW9uIGlzIGRvbmUgb24gaW5oZXJpdERvYyBqYXZhZG9jIHRhZworCWJvb2xlYW4gaW5oZXJpdERvY1NlbGVjdGVkOwogCiAJcHVibGljIFNlbGVjdGlvbkphdmFkb2MoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJCXN1cGVyKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCQl0aGlzLmluaGVyaXREb2NTZWxlY3RlZCA9IGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTU4LDcgKzYzLDcgQEAKIAkJCQlzZWxlY3RlZFN0cmluZyA9ICI8U2VsZWN0T25UeXBlOiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCWludCBwb3MgPSBvdXRwdXQubGVuZ3RoKCktMzsKLQkJCW91dHB1dC5yZXBsYWNlKHBvcy0yLHBvcywgc2VsZWN0ZWRTdHJpbmcrc2VsZWN0ZWROb2RlKyc+Jyk7CisJCQlvdXRwdXQucmVwbGFjZShwb3MtMixwb3MsIHNlbGVjdGVkU3RyaW5nK3RoaXMuc2VsZWN0ZWROb2RlKyc+Jyk7CiAJCX0KIAkJcmV0dXJuIG91dHB1dDsKIAl9CkBAIC02Niw3ICs3MSw3IEBACiAJLyoqCiAJICogUmVzb2x2ZSBzZWxlY3RlZCBub2RlIGlmIG5vdCBudWxsIGFuZCB0aHJvdyBleGNlcHRpb24gdG8gbGV0IGNsaWVudHMga25vdwogCSAqIHRoYXQgaXQgaGFzIGJlZW4gZm91bmQuCi0JICogCisJICoKIAkgKiBAdGhyb3dzIFNlbGVjdGlvbk5vZGVGb3VuZAogCSAqLwogCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlc29sdmUoU2NvcGUgc2NvcGUpIHsKQEAgLTEwNiwxMyArMTExLDIwIEBACiAJCQkJYmluZGluZyA9IHRoaXMuc2VsZWN0ZWROb2RlLnJlc29sdmVkVHlwZTsKIAkJCX0KIAkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCX0gZWxzZSBpZiAodGhpcy5pbmhlcml0RG9jU2VsZWN0ZWQpIHsKKwkJCS8vIG5vIHNlbGVjdGlvbiBub2RlIHdoZW4gaW5oZXJpdERvYyB0YWcgaXMgc2VsZWN0ZWQKKwkJCS8vIEJ1dCB3ZSBuZWVkIHRvIGRldGVjdCBpdCB0byBlbmFibGUgY29kZSBzZWxlY3Qgb24gaW5oZXJpdERvYworCQkJUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0ID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dCgpOworCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKChNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCkuYmluZGluZyk7CisJCQl9CiAJCX0KIAl9CiAKIAkvKioKIAkgKiBSZXNvbHZlIHNlbGVjdGVkIG5vZGUgaWYgbm90IG51bGwgYW5kIHRocm93IGV4Y2VwdGlvbiB0byBsZXQgY2xpZW50cyBrbm93CiAJICogdGhhdCBpdCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgU2VsZWN0aW9uTm9kZUZvdW5kCiAJICovCiAJcHVibGljIHZvaWQgcmVzb2x2ZShDbGFzc1Njb3BlIHNjb3BlKSB7CkBAIC0xMjIsNyArMTM0LDcgQEAKIAkvKioKIAkgKiBSZXNvbHZlIHNlbGVjdGVkIG5vZGUgaWYgbm90IG51bGwgYW5kIHRocm93IGV4Y2VwdGlvbiB0byBsZXQgY2xpZW50cyBrbm93CiAJICogdGhhdCBpdCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgU2VsZWN0aW9uTm9kZUZvdW5kCiAJICovCiAJcHVibGljIHZvaWQgcmVzb2x2ZShNZXRob2RTY29wZSBzY29wZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uSmF2YWRvY1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uSmF2YWRvY1BhcnNlci5qYXZhCmluZGV4IDEwNWU3ZTUuLjdjOGZiNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbkphdmFkb2NQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25KYXZhZG9jUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjIgKzIxLDI3IEBACiAgKiBQYXJzZXIgc3BlY2lhbGl6ZWQgZm9yIGRlY29kaW5nIGphdmFkb2MgY29tbWVudHMgd2hpY2ggaW5jbHVkZXMgY29kZSBzZWxlY3Rpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25KYXZhZG9jUGFyc2VyIGV4dGVuZHMgSmF2YWRvY1BhcnNlciB7Ci0JCisKIAlpbnQgc2VsZWN0aW9uU3RhcnQ7CiAJaW50IHNlbGVjdGlvbkVuZDsKIAlBU1ROb2RlIHNlbGVjdGVkTm9kZTsKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDE5CisJcHVibGljIGJvb2xlYW4gaW5oZXJpdERvY1RhZ1NlbGVjdGVkOwogCiAJcHVibGljIFNlbGVjdGlvbkphdmFkb2NQYXJzZXIoU2VsZWN0aW9uUGFyc2VyIHNvdXJjZVBhcnNlcikgewogCQlzdXBlcihzb3VyY2VQYXJzZXIpOworCQl0aGlzLnNob3VsZFJlcG9ydFByb2JsZW1zID0gZmFsc2U7CisJCXRoaXMucmVwb3J0UHJvYmxlbXMgPSBmYWxzZTsKIAkJdGhpcy5raW5kID0gU0VMRUNUSU9OX1BBUlNFUiB8IFRFWFRfUEFSU0U7CisJCXRoaXMuaW5oZXJpdERvY1RhZ1NlbGVjdGVkID0gZmFsc2U7CiAJfQogCiAJLyoKIAkgKiBEbyBub3QgcGFyc2UgY29tbWVudCBpZiBzZWxlY3Rpb24gaXMgbm90IGluY2x1ZGVkLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGNoZWNrRGVwcmVjYXRpb24oaW50IGNvbW1lbnRQdHIpIHsKLQkJdGhpcy5zZWxlY3Rpb25TdGFydCA9ICgoU2VsZWN0aW9uUGFyc2VyKXNvdXJjZVBhcnNlcikuc2VsZWN0aW9uU3RhcnQ7Ci0JCXRoaXMuc2VsZWN0aW9uRW5kID0gKChTZWxlY3Rpb25QYXJzZXIpc291cmNlUGFyc2VyKS5zZWxlY3Rpb25FbmQ7CisJCXRoaXMuc2VsZWN0aW9uU3RhcnQgPSAoKFNlbGVjdGlvblBhcnNlcil0aGlzLnNvdXJjZVBhcnNlcikuc2VsZWN0aW9uU3RhcnQ7CisJCXRoaXMuc2VsZWN0aW9uRW5kID0gKChTZWxlY3Rpb25QYXJzZXIpdGhpcy5zb3VyY2VQYXJzZXIpLnNlbGVjdGlvbkVuZDsKIAkJdGhpcy5qYXZhZG9jU3RhcnQgPSB0aGlzLnNvdXJjZVBhcnNlci5zY2FubmVyLmNvbW1lbnRTdGFydHNbY29tbWVudFB0cl07CiAJCXRoaXMuamF2YWRvY0VuZCA9IHRoaXMuc291cmNlUGFyc2VyLnNjYW5uZXIuY29tbWVudFN0b3BzW2NvbW1lbnRQdHJdOwogCQlpZiAodGhpcy5qYXZhZG9jU3RhcnQgPD0gdGhpcy5zZWxlY3Rpb25TdGFydCAmJiB0aGlzLnNlbGVjdGlvbkVuZCA8PSB0aGlzLmphdmFkb2NFbmQpIHsKQEAgLTY4LDEwICs3MywxMCBAQAogCQlpbnQgc3RhcnQgPSAoKFR5cGVSZWZlcmVuY2UpdHlwZVJlZikuc291cmNlU3RhcnQ7CiAJCWludCBlbmQgPSAoKFR5cGVSZWZlcmVuY2UpdHlwZVJlZikuc291cmNlRW5kOwogCQlpZiAoc3RhcnQgPD0gdGhpcy5zZWxlY3Rpb25TdGFydCAmJiB0aGlzLnNlbGVjdGlvbkVuZCA8PSBlbmQpIHsKLQkJCXNlbGVjdGVkTm9kZSA9IGV4cHJlc3Npb247CisJCQl0aGlzLnNlbGVjdGVkTm9kZSA9IGV4cHJlc3Npb247CiAJCQl0aGlzLmFib3J0ID0gdHJ1ZTsKIAkJCWlmIChTZWxlY3Rpb25FbmdpbmUuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBhcmd1bWVudD0iK3NlbGVjdGVkTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBhcmd1bWVudD0iK3RoaXMuc2VsZWN0ZWROb2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwpAQCAtODYsMTAgKzkxLDEwIEBACiAJCWludCBzdGFydCA9IChpbnQpICh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrWzBdID4+PiAzMik7CiAJCWludCBlbmQgPSAoaW50KSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrWzBdOwogCQlpZiAoc3RhcnQgPD0gdGhpcy5zZWxlY3Rpb25TdGFydCAmJiB0aGlzLnNlbGVjdGlvbkVuZCA8PSBlbmQpIHsKLQkJCXNlbGVjdGVkTm9kZSA9IChBU1ROb2RlKSBzdXBlci5jcmVhdGVGaWVsZFJlZmVyZW5jZShyZWNlaXZlcik7CisJCQl0aGlzLnNlbGVjdGVkTm9kZSA9IChBU1ROb2RlKSBzdXBlci5jcmVhdGVGaWVsZFJlZmVyZW5jZShyZWNlaXZlcik7CiAJCQl0aGlzLmFib3J0ID0gdHJ1ZTsKIAkJCWlmIChTZWxlY3Rpb25FbmdpbmUuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBmaWVsZD0iK3NlbGVjdGVkTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBmaWVsZD0iK3RoaXMuc2VsZWN0ZWROb2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwpAQCAtMTA1LDEwICsxMTAsMTAgQEAKIAkJaW50IHN0YXJ0ID0gKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbbWVtYmVyUHRyXSA+Pj4gMzIpOwogCQlpbnQgZW5kID0gKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1ttZW1iZXJQdHJdOwogCQlpZiAoc3RhcnQgPD0gdGhpcy5zZWxlY3Rpb25TdGFydCAmJiB0aGlzLnNlbGVjdGlvbkVuZCA8PSBlbmQpIHsKLQkJCXNlbGVjdGVkTm9kZSA9IChBU1ROb2RlKSBzdXBlci5jcmVhdGVNZXRob2RSZWZlcmVuY2UocmVjZWl2ZXIsIGFyZ3VtZW50cyk7CisJCQl0aGlzLnNlbGVjdGVkTm9kZSA9IChBU1ROb2RlKSBzdXBlci5jcmVhdGVNZXRob2RSZWZlcmVuY2UocmVjZWl2ZXIsIGFyZ3VtZW50cyk7CiAJCQl0aGlzLmFib3J0ID0gdHJ1ZTsKIAkJCWlmIChTZWxlY3Rpb25FbmdpbmUuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBtZXRob2Q9IitzZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJc2VsZWN0ZWQgbWV0aG9kPSIrdGhpcy5zZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CkBAIC0xMjIsNyArMTI3LDcgQEAKIAlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50IHByaW1pdGl2ZVRva2VuKSB7CiAJCS8vIE5lZWQgdG8gY3JlYXRlIHR5cGUgcmVmIGluIGNhc2UgaXQgd2FzIG5lZWRlZCBieSBtZW1iZXJzCiAJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IChUeXBlUmVmZXJlbmNlKSBzdXBlci5jcmVhdGVUeXBlUmVmZXJlbmNlKHByaW1pdGl2ZVRva2VuKTsKLQkKKwogCQkvLyBTZWUgaWYgbm9kZSBpcyBjb25jZXJuZWQgYnkgc2VsZWN0aW9uCiAJCWlmICh0eXBlUmVmLnNvdXJjZVN0YXJ0IDw9IHRoaXMuc2VsZWN0aW9uU3RhcnQgJiYgdGhpcy5zZWxlY3Rpb25FbmQgPD0gdHlwZVJlZi5zb3VyY2VFbmQpIHsKIAkJCS8vIFNlZSBpZiBzZWxlY3Rpb24gaXMgaW4gb25lIG9mIHRva2VucyBvZiBxdWFsaWZpY2F0aW9uCkBAIC0xMzksMTAgKzE0NCwxMCBAQAogCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgcHRyLCB0b2tlbnMsIDAsIHBvcyk7CiAJCQkJCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbcG9zXTsKIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgcHRyLCBwb3NpdGlvbnMsIDAsIHBvcyk7Ci0JCQkJCQlzZWxlY3RlZE5vZGUgPSBuZXcgSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kKTsKKwkJCQkJCXRoaXMuc2VsZWN0ZWROb2RlID0gbmV3IEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zLCB0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7CiAJCQkJCQl0aGlzLmFib3J0ID0gdHJ1ZTsgLy8gd2UgZ290IHNlbGVjdGVkIG5vZGUgPT4gY2FuY2VsIHBhcnNlCiAJCQkJCQlpZiAoU2VsZWN0aW9uRW5naW5lLkRFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJc2VsZWN0ZWQgcGFydGlhbCBxdWFsaWZpZWQgdHlwZT0iK3NlbGVjdGVkTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIglzZWxlY3RlZCBwYXJ0aWFsIHF1YWxpZmllZCB0eXBlPSIrdGhpcy5zZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gdHlwZVJlZjsKIAkJCQkJfQpAQCAtMTUwLDEwICsxNTUsMTAgQEAKIAkJCQkvLyBTZWxlY3Rpb24gaXMgaW4gbGFzdCB0b2tlbiA9PiB3ZSdsbCBzdG9yZSB0eXBlIHJlZiBhcyB0aGlzCiAJCQl9CiAJCQkvLyBTdG9yZSB0eXBlIHJlZiBhcyBzZWxlY3RlZCBub2RlCi0JCQlzZWxlY3RlZE5vZGUgPSB0eXBlUmVmOworCQkJdGhpcy5zZWxlY3RlZE5vZGUgPSB0eXBlUmVmOwogCQkJdGhpcy5hYm9ydCA9IHRydWU7IC8vIHdlIGdvdCBzZWxlY3RlZCBub2RlID0+IGNhbmNlbCBwYXJzZQogCQkJaWYgKFNlbGVjdGlvbkVuZ2luZS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCXNlbGVjdGVkIHR5cGU9IitzZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJc2VsZWN0ZWQgdHlwZT0iK3RoaXMuc2VsZWN0ZWROb2RlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiB0eXBlUmVmOwpAQCAtMTY1LDEzICsxNzAsMTMgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBwdXNoUGFyYW1OYW1lKGJvb2xlYW4gaXNUeXBlUGFyYW0pIHsKIAkJaWYgKHN1cGVyLnB1c2hQYXJhbU5hbWUoaXNUeXBlUGFyYW0pKSB7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgYXN0U3RhY2tbYXN0UHRyLS1dOworCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CiAJCQkvLyBTZWUgaWYgZXhwcmVzc2lvbiBpcyBjb25jZXJuZWQgYnkgc2VsZWN0aW9uCiAJCQlpZiAoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCA8PSB0aGlzLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMuc2VsZWN0aW9uRW5kIDw9IGV4cHJlc3Npb24uc291cmNlRW5kKSB7Ci0JCQkJc2VsZWN0ZWROb2RlID0gZXhwcmVzc2lvbjsKKwkJCQl0aGlzLnNlbGVjdGVkTm9kZSA9IGV4cHJlc3Npb247CiAJCQkJdGhpcy5hYm9ydCA9IHRydWU7IC8vIHdlIGdvdCBzZWxlY3RlZCBub2RlID0+IGNhbmNlbCBwYXJzZQogCQkJCWlmIChTZWxlY3Rpb25FbmdpbmUuREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJc2VsZWN0ZWQgcGFyYW09IitzZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCXNlbGVjdGVkIHBhcmFtPSIrdGhpcy5zZWxlY3RlZE5vZGUpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJfQogCQl9CkBAIC0xODIsOCArMTg3LDE4IEBACiAJICogU3RvcmUgc2VsZWN0ZWQgbm9kZSBpbnRvIGRvYyBjb21tZW50LgogCSAqLwogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURvY0NvbW1lbnQoKSB7Ci0JCWlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7Ci0JCQkoKFNlbGVjdGlvbkphdmFkb2MpIHRoaXMuZG9jQ29tbWVudCkuc2VsZWN0ZWROb2RlID0gKEV4cHJlc3Npb24pIHNlbGVjdGVkTm9kZTsKKwkJaWYgKHRoaXMuc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgeworCQkJKChTZWxlY3Rpb25KYXZhZG9jKSB0aGlzLmRvY0NvbW1lbnQpLnNlbGVjdGVkTm9kZSA9IChFeHByZXNzaW9uKSB0aGlzLnNlbGVjdGVkTm9kZTsKKwkJfSBlbHNlIGlmICh0aGlzLmluaGVyaXREb2NUYWdTZWxlY3RlZCkgeworCQkJKChTZWxlY3Rpb25KYXZhZG9jKSB0aGlzLmRvY0NvbW1lbnQpLmluaGVyaXREb2NTZWxlY3RlZCA9IHRydWU7CiAJCX0KIAl9CisJCisJLyoKKwkgKiBTZXRzIGEgZmxhZyB0byBkZW5vdGUgdGhhdCBzZWxlY3Rpb24gaGFzIHRha2VuIHBsYWNlIG9uIGFuIGluaGVyaXREb2MgdGFnCisJICovCisJcHJvdGVjdGVkIHZvaWQgcGFyc2VJbmhlcml0RG9jVGFnKCkgeworCQlpZiAodGhpcy50YWdTb3VyY2VTdGFydCA9PSB0aGlzLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMudGFnU291cmNlRW5kID09IHRoaXMuc2VsZWN0aW9uRW5kKQorCQkJdGhpcy5pbmhlcml0RG9jVGFnU2VsZWN0ZWQgPSB0cnVlOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk5vZGVGb3VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uTm9kZUZvdW5kLmphdmEKaW5kZXggZjY3MjA1YS4uOWM5NDQxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uTm9kZUZvdW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uTm9kZUZvdW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTEgKzEzLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uTm9kZUZvdW5kIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCisKIAlwdWJsaWMgQmluZGluZyBiaW5kaW5nOwogCXB1YmxpYyBib29sZWFuIGlzRGVjbGFyYXRpb247CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTczMzU0NDQ3MzY2MTgwOTIyOTVMOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlCi0JCisKIHB1YmxpYyBTZWxlY3Rpb25Ob2RlRm91bmQoKSB7CiAJdGhpcyhudWxsLCBmYWxzZSk7IC8vIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgc2VsZWN0aW9uIG5vZGUKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uQXJndW1lbnROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkFyZ3VtZW50TmFtZS5qYXZhCmluZGV4IGIxMjcxY2EuLmJiYmNlNDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uQXJndW1lbnROYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywzNCArMTcsMzQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUgZXh0ZW5kcyBBcmd1bWVudCB7Ci0JCisKIAlwdWJsaWMgU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUoY2hhcltdIG5hbWUgLCBsb25nIHBvc05vbSAsIFR5cGVSZWZlcmVuY2UgdHIgLCBpbnQgbW9kaWZpZXJzKXsKIAogCQlzdXBlcihuYW1lLCBwb3NOb20sIHRyLCBtb2RpZmllcnMpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGJpbmQoTWV0aG9kU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBib29sZWFuIHVzZWQpIHsKIAogCQlzdXBlci5iaW5kKHNjb3BlLCB0eXBlQmluZGluZywgdXNlZCk7Ci0JCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5iaW5kaW5nKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCisKIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOwogCQlvdXRwdXQuYXBwZW5kKCI8U2VsZWN0aW9uT25Bcmd1bWVudE5hbWU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgIT0gbnVsbCkgdHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOwotCQlvdXRwdXQuYXBwZW5kKG5hbWUpOwotCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHRoaXMudHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOworCQlvdXRwdXQuYXBwZW5kKHRoaXMubmFtZSk7CisJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoIiA9ICIpOy8vJE5PTi1OTFMtMSQKLQkJCWluaXRpYWxpemF0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOyAKKwkJCXRoaXMuaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCX0KIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJc3VwZXIucmVzb2x2ZShzY29wZSk7Ci0JCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5iaW5kaW5nKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKaW5kZXggZTg5MDdhMS4uYThhNTc0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00MywxNiArNDMsMTYgQEAKIAogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIjxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwpIHF1YWxpZmljYXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJyk7Ci0JCWlmIChhY2Nlc3NNb2RlID09IFRoaXMpIHsKKwkJaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKSB0aGlzLnF1YWxpZmljYXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJyk7CisJCWlmICh0aGlzLmFjY2Vzc01vZGUgPT0gVGhpcykgewogCQkJb3V0cHV0LmFwcGVuZCgidGhpcygiKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgewogCQkJb3V0cHV0LmFwcGVuZCgic3VwZXIoIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQkJCXRoaXMuYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpPjsiKTsgLy8kTk9OLU5MUy0xJApAQCAtNjEsMTMgKzYxLDEzIEBACiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAKIAkJc3VwZXIucmVzb2x2ZShzY29wZSk7Ci0JCisKIAkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcwotCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IAotCQkJCSEoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8Ci0JCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCisJCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCB8fAorCQkJCSEodGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwKKwkJCQkJdGhpcy5iaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpKQogCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOwogCQllbHNlCi0JCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0aGlzLmJpbmRpbmcpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2UuamF2YQppbmRleCA3YzNkZWE2Li40ZTc1NjU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDM3ICsyOCwzNyBAQAogICogICAgICAgfQogICoKICAqLwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZSBleHRlbmRzIEZpZWxkUmVmZXJlbmNlIHsKLQkKKwogCXB1YmxpYyBTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UgLCBsb25nIHBvcykgewogCiAJCXN1cGVyKHNvdXJjZSwgcG9zKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkJCisKIAkJb3V0cHV0LmFwcGVuZCgiPFNlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2U6Iik7ICAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzdXBlci5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJz4nKTsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCXN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKIAkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcwotCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IAotCQkJCSEoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8IAotCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUKLQkJCQkJfHwgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lCi0JCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24KLQkJCQkJfHwgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQpKQorCQlpZiAodGhpcy5iaW5kaW5nID09IG51bGwgfHwKKwkJCQkhKHRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8CisJCQkJCXRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCXx8IHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lCisJCQkJCXx8IHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbgorCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSkKIAkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKIAkJZWxzZQotCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5iaW5kaW5nKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFR5cGUuamF2YQppbmRleCBkOWFkYTFlLi5hNDgzOGIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsNiArMjMsNiBAQAogCQl0aGlzLm5hbWUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJfQogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQlyZXR1cm4gdHlwZS5wcmludCh0YWIsIG91dHB1dCkuYXBwZW5kKCc7Jyk7IAorCQlyZXR1cm4gdGhpcy50eXBlLnByaW50KHRhYiwgb3V0cHV0KS5hcHBlbmQoJzsnKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQppbmRleCBmNDg5YzViLi4xMGRjY2UzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsNyArMjgsNyBAQAogICogICAgICAgfQogICoKICAqLwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CiAKIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZSBleHRlbmRzIEltcG9ydFJlZmVyZW5jZSB7CkBAIC0zOSw5ICszOSw5IEBACiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQsIGJvb2xlYW4gd2l0aE9uRGVtYW5kKSB7CiAKIAlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCI8U2VsZWN0T25JbXBvcnQ6Iik7IC8vJE5PTi1OTFMtMSQKLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHsKIAkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCcuJyk7Ci0JCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2Vuc1tpXSk7CiAJfQogCXJldHVybiBvdXRwdXQuYXBwZW5kKCc+Jyk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkxvY2FsTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Mb2NhbE5hbWUuamF2YQppbmRleCBhMDkxYTVkLi5mYmY5MmM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkxvY2FsTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTG9jYWxOYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMzIgKzE0LDMyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25Mb2NhbE5hbWUgZXh0ZW5kcyBMb2NhbERlY2xhcmF0aW9uewotCQorCiAJcHVibGljIFNlbGVjdGlvbk9uTG9jYWxOYW1lKGNoYXJbXSBuYW1lLAlpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIAogCQlzdXBlcihuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAogCQlzdXBlci5yZXNvbHZlKHNjb3BlKTsKLQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0aGlzLmJpbmRpbmcpOwogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRBc0V4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIjxTZWxlY3Rpb25PbkxvY2FsTmFtZToiKTsgLy8kTk9OLU5MUy0xJAogCQlwcmludE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgb3V0cHV0KTsKLQkJIHR5cGUucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoJyAnKS5hcHBlbmQodGhpcy5uYW1lKTsKLQkJaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKKwkJIHRoaXMudHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpLmFwcGVuZCh0aGlzLm5hbWUpOworCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAJCQlvdXRwdXQuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJCQl0aGlzLmluaXRpYWxpemF0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCc+Jyk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCXRoaXMucHJpbnRBc0V4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOworCQlwcmludEFzRXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCc7Jyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhCmluZGV4IDRjMTUxN2EuLjI0ODU0NDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTWVzc2FnZVNlbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNzUsMzggKzc1LDM4IEBACiAJCX0KIAkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCiAJCW91dHB1dC5hcHBlbmQoIjxTZWxlY3RPbk1lc3NhZ2VTZW5kOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkgcmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJyk7CisJCWlmICghdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKSB0aGlzLnJlY2VpdmVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOwogCQlvdXRwdXQuYXBwZW5kKHRoaXMuc2VsZWN0b3IpLmFwcGVuZCgnKCcpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQkJCXRoaXMuYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpPiIpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CiAKIAkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcwotCQlpZihiaW5kaW5nID09IG51bGwgfHwKLQkJCQkJIShiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwgCi0JCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUKLQkJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQotCQkJCQkJfHwgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbgotCQkJCQkJfHwgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQpKSB7CisJCWlmKHRoaXMuYmluZGluZyA9PSBudWxsIHx8CisJCQkJCSEodGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwKKwkJCQkJCXRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQorCQkJCQkJfHwgdGhpcy5iaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSkgewogCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOwogCQl9IGVsc2UgewotCQkJaWYoYmluZGluZy5pc0RlZmF1bHRBYnN0cmFjdCgpKSB7Ci0JCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChmaW5kTm9uRGVmYXVsdEFic3RyYWN0TWV0aG9kKGJpbmRpbmcpKTsgLy8gMjM1OTQKKwkJCWlmKHRoaXMuYmluZGluZy5pc0RlZmF1bHRBYnN0cmFjdCgpKSB7CisJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChmaW5kTm9uRGVmYXVsdEFic3RyYWN0TWV0aG9kKHRoaXMuYmluZGluZykpOyAvLyAyMzU5NAogCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5iaW5kaW5nKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTmFtZU9mTWVtYmVyVmFsdWVQYWlyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Pbk5hbWVPZk1lbWJlclZhbHVlUGFpci5qYXZhCmluZGV4IGRkNDNkMjQuLmI3MDNkYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTmFtZU9mTWVtYmVyVmFsdWVQYWlyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25OYW1lT2ZNZW1iZXJWYWx1ZVBhaXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywyMSArMTcsMjEgQEAKIAogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25OYW1lT2ZNZW1iZXJWYWx1ZVBhaXIgZXh0ZW5kcyBNZW1iZXJWYWx1ZVBhaXIgewotCQorCiAJcHVibGljIFNlbGVjdGlvbk9uTmFtZU9mTWVtYmVyVmFsdWVQYWlyKGNoYXJbXSB0b2tlbiwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAJCXN1cGVyKHRva2VuLCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCB2YWx1ZSk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJCW91dHB1dC5hcHBlbmQoIjxTZWxlY3RPbk5hbWU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZChuYW1lKTsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLm5hbWUpOwogCQlvdXRwdXQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIG91dHB1dDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZUV4cGVjdGluZyhCbG9ja1Njb3BlIHNjb3BlLCBUeXBlQmluZGluZyByZXF1aXJlZFR5cGUpIHsKIAkJc3VwZXIucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIHJlcXVpcmVkVHlwZSk7Ci0JCQorCiAJCWlmKHRoaXMuYmluZGluZyAhPSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKaW5kZXggMDc2Nzc1My4uMTQ1NzQ3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsMjAgKzI4LDIwIEBACiAgKiAgICAgICB9CiAgKgogICovCi0gCisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlIGV4dGVuZHMgSW1wb3J0UmVmZXJlbmNlIHsKIHB1YmxpYyBTZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zICwgbG9uZ1tdIHBvc2l0aW9ucykgewotCXN1cGVyKHRva2VucywgcG9zaXRpb25zLCB0cnVlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CisJc3VwZXIodG9rZW5zLCBwb3NpdGlvbnMsIGZhbHNlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CiB9CiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQsIGJvb2xlYW4gd2l0aE9uRGVtYW5kKSB7CiAJcHJpbnRJbmRlbnQodGFiLCBvdXRwdXQpLmFwcGVuZCgiPFNlbGVjdE9uUGFja2FnZToiKTsgLy8kTk9OLU5MUy0xJAotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykgewogCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoJy4nKTsKLQkJb3V0cHV0LmFwcGVuZCh0b2tlbnNbaV0pOworCQlvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW5zW2ldKTsKIAl9Ci0JcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsgCisJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCBlYjQwNjg5Li5mYTI2MTYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDcgKzI4LDcgQEAKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVBcmd1bWVudHMsIDAsIHRoaXMudHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aCArIDFdW10sIDAsIGxlbmd0aCk7CiAJCXRoaXMudHlwZUFyZ3VtZW50c1tsZW5ndGhdID0gYXNzaXN0VHlwZUFyZ3VtZW50czsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiBjaGVja0JvdW5kcykgewogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSwgY2hlY2tCb3VuZHMpOwogCQkvLy8vIHJlbW92ZWQgdW5uZWNlc3NhcnkgY29kZSB0byBzb2x2ZSBidWcgOTQ2NTMKQEAgLTM4LDcgKzM4LDcgQEAKIAkJLy99CiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5yZXNvbHZlZFR5cGUpOwogCX0KLQkKKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShDbGFzc1Njb3BlIHNjb3BlKSB7CiAJCXN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKIAkJLy8vLyByZW1vdmVkIHVubmVjZXNzYXJ5IGNvZGUgdG8gc29sdmUgYnVnIDk0NjUzCkBAIC00OCwxNiArNDgsMTYgQEAKIAkJLy99CiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5yZXNvbHZlZFR5cGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJb3V0cHV0LmFwcGVuZCgiPFNlbGVjdE9uVHlwZToiKTsvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQlpbnQgbGVuZ3RoID0gdGhpcy50b2tlbnMubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlpZihpICE9IDApIHsKIAkJCQlvdXRwdXQuYXBwZW5kKCcuJyk7CiAJCQl9Ci0JCQlvdXRwdXQuYXBwZW5kKHRva2Vuc1tpXSk7Ci0JCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKwkJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbaV0pOworCQkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudCA9IHRoaXMudHlwZUFyZ3VtZW50c1tpXTsKIAkJCWlmICh0eXBlQXJndW1lbnQgIT0gbnVsbCkgewogCQkJCW91dHB1dC5hcHBlbmQoJzwnKTsKIAkJCQlpbnQgbWF4ID0gdHlwZUFyZ3VtZW50Lmxlbmd0aCAtIDE7CkBAIC02OCw5ICs2OCw5IEBACiAJCQkJdHlwZUFyZ3VtZW50W21heF0ucHJpbnQoMCwgb3V0cHV0KTsKIAkJCQlvdXRwdXQuYXBwZW5kKCc+Jyk7CiAJCQl9Ci0JCQkKKwogCQl9Ci0JCW91dHB1dC5hcHBlbmQoJz4nKTsgCisJCW91dHB1dC5hcHBlbmQoJz4nKTsKIAkJcmV0dXJuIG91dHB1dDsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggOTFkZmJlNi4uNTdmNzQ5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25QYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCwyOSArMjAsMjkgQEAKIAlwdWJsaWMgU2VsZWN0aW9uT25QYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZShjaGFyW10gbmFtZSwgVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudHMsIGxvbmcgcG9zKXsKIAkJc3VwZXIobmFtZSwgdHlwZUFyZ3VtZW50cywgMCwgcG9zKTsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiBjaGVja0JvdW5kcykgewogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSwgY2hlY2tCb3VuZHMpOwogCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMucmVzb2x2ZWRUeXBlKTsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBzY29wZSkgewogCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5yZXNvbHZlZFR5cGUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewogCQlvdXRwdXQuYXBwZW5kKCI8U2VsZWN0T25UeXBlOiIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCh0b2tlbik7CisJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbik7CiAJCW91dHB1dC5hcHBlbmQoJzwnKTsKLQkJaW50IG1heCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMTsKKwkJaW50IG1heCA9IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggLSAxOwogCQlmb3IgKGludCBpPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXR5cGVBcmd1bWVudHNbaV0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCXRoaXMudHlwZUFyZ3VtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpOwogCQkJb3V0cHV0LmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCiAJCX0KLQkJdHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CisJCXRoaXMudHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoJz4nKTsKLQkJb3V0cHV0LmFwcGVuZCgnPicpOyAKKwkJb3V0cHV0LmFwcGVuZCgnPicpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCAzMjlmNmJhLi4zNTZiZTk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM2LDQ5ICszNiw3NSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKLSAKKwogcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiB7CiAKIAlwdWJsaWMgU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpIHsKIAkJLy8gY29uc3RydWN0b3Igd2l0aG91dCBhcmd1bWVudAogCX0KLQkKKwogCXB1YmxpYyBTZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXMpIHsKIAkJc3VwZXIoYW5vbnltb3VzKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlID09IG51bGwpCiAJCQlvdXRwdXQuYXBwZW5kKCI8U2VsZWN0T25BbGxvY2F0aW9uRXhwcmVzc2lvbjoiKTsgIC8vJE5PTi1OTFMtMSQKLQkJZWxzZSAKKwkJZWxzZQogCQkJb3V0cHV0LmFwcGVuZCgiPFNlbGVjdE9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246Iik7IC8vJE5PTi1OTFMtMSQKIAotCQlyZXR1cm4gc3VwZXIucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KS5hcHBlbmQoJz4nKTsgCisJCXJldHVybiBzdXBlci5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnPicpOwogCX0KLQkKKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCXN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkKLQkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcwotCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IAotCQkJCSEoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8IAotCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpKQorCisJCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOwotCQlpZiAoYW5vbnltb3VzVHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKLQkKKwkJfQorCisJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKKwkJaWYgKCF0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJc3dpdGNoICh0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkpIHsKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGU6CisJCQkJCS8vIHZpc2liaWxpdHkgaXMgaWdub3JlZAorCQkJCQlicmVhazsKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kOgorCQkJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiB0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMucmVzb2x2ZWRUeXBlKTsKKwkJCQkJfQorCQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKCk7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOworCQkJfQorCQl9CisKKwkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0aGlzLmJpbmRpbmcpOworCiAJCS8vIGlmIHNlbGVjdGluZyBhIHR5cGUgZm9yIGFuIGFub255bW91cyB0eXBlIGNyZWF0aW9uLCB3ZSBoYXZlIHRvCi0JCS8vIGZpbmQgaXRzIHRhcmdldCBzdXBlciBjb25zdHJ1Y3RvciAoaWYgZXh0ZW5kaW5nIGEgY2xhc3MpIG9yIGl0cyB0YXJnZXQgCisJCS8vIGZpbmQgaXRzIHRhcmdldCBzdXBlciBjb25zdHJ1Y3RvciAoaWYgZXh0ZW5kaW5nIGEgY2xhc3MpIG9yIGl0cyB0YXJnZXQKIAkJLy8gc3VwZXIgaW50ZXJmYWNlIChpZiBleHRlbmRpbmcgYW4gaW50ZXJmYWNlKQotCQlpZiAoYW5vbnltb3VzVHlwZS5iaW5kaW5nLnN1cGVySW50ZXJmYWNlcyA9PSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewotCQkJLy8gZmluZCB0aGUgY29uc3RydWN0b3IgYmluZGluZyBpbnNpZGUgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwKLQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYW5vbnltb3VzVHlwZS5kZWNsYXJhdGlvbk9mKGJpbmRpbmcub3JpZ2luYWwoKSk7Ci0JCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKTsKKwkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZS5iaW5kaW5nICE9IG51bGwpIHsKKwkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gKExvY2FsVHlwZUJpbmRpbmcpIHRoaXMuYW5vbnltb3VzVHlwZS5iaW5kaW5nOworCQkJaWYgKGxvY2FsVHlwZS5zdXBlckludGVyZmFjZXMgPT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCQkvLyBmaW5kIHRoZSBjb25zdHJ1Y3RvciBiaW5kaW5nIGluc2lkZSB0aGUgc3VwZXIgY29uc3RydWN0b3IgY2FsbAorCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgdGhpcy5hbm9ueW1vdXNUeXBlLmRlY2xhcmF0aW9uT2YodGhpcy5iaW5kaW5nLm9yaWdpbmFsKCkpOworCQkJCWlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisJCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcpOworCQkJCX0KKwkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CisJCQl9CisJCQkvLyBvcGVuIG9uIHRoZSBvbmx5IHN1cGVyIGludGVyZmFjZQorCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChsb2NhbFR5cGUuc3VwZXJJbnRlcmZhY2VzWzBdKTsKIAkJfSBlbHNlIHsKLQkJCS8vIG9wZW4gb24gdGhlIG9ubHkgc3VwZXJpbnRlcmZhY2UKLQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYW5vbnltb3VzVHlwZS5iaW5kaW5nLnN1cGVySW50ZXJmYWNlc1swXSk7CisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5yZXNvbHZlZFR5cGUpOworCQkJfQorCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0aGlzLmJpbmRpbmcpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQppbmRleCBlNTRhMzJlLi45MzE3MTBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWROYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1pc3NpbmdUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwpAQCAtNTIsMzYgKzUzLDM2IEBACiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAlvdXRwdXQuYXBwZW5kKCI8U2VsZWN0T25OYW1lOiIpOyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnRva2Vucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoJy4nKTsKLQkJb3V0cHV0LmFwcGVuZCh0b2tlbnNbaV0pOworCQlvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW5zW2ldKTsKIAl9Ci0JcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsgCisJcmV0dXJuIG91dHB1dC5hcHBlbmQoJz4nKTsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJLy8gaXQgY2FuIGJlIGEgcGFja2FnZSwgdHlwZSwgbWVtYmVyIHR5cGUsIGxvY2FsIHZhcmlhYmxlIG9yIGZpZWxkCi0JYmluZGluZyA9IHNjb3BlLmdldEJpbmRpbmcodG9rZW5zLCB0aGlzKTsKLQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwl0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRoaXMudG9rZW5zLCB0aGlzKTsKKwlpZiAoIXRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CiAJCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCi0JCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCi0JCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQotCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCi0JCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSB7Ci0JCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCWlmICh0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZQorCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQorCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24KKwkJCQkJfHwgdGhpcy5iaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCkgeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5iaW5kaW5nKTsKIAkJCX0KLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKTsKLQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHx8IHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZykgewogCQkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcwotCQkJaWYgKGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSl7Ci0JCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCWlmICh0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSl7CisJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0aGlzLmJpbmRpbmcpOwogCQkJfQotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nKTsKIAkJfSBlbHNlIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucmVzb2x2YWJsZVJlZmVyZW5jZSh0aGlzLCBiaW5kaW5nKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucmVzb2x2YWJsZVJlZmVyZW5jZSh0aGlzLCB0aGlzLmJpbmRpbmcpOwogCQl9CiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKIAl9Ci0JdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDE4Nzk2N2UuLjc1ZDdhMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDExICsyMSwxMyBAQAogICoJLS0tPiBjbGFzcyBYIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpqYXZhLmxhbmcuT2JqZWN0PgogICoKICAqLwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIApAQCAtNDAsMTMgKzQyLDIwIEBACiB9CiBwcm90ZWN0ZWQgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKIAkvLyBpdCBjYW4gYmUgYSBwYWNrYWdlLCB0eXBlIG9yIG1lbWJlciB0eXBlCi0JQmluZGluZyBiaW5kaW5nID0gc2NvcGUuZ2V0VHlwZU9yUGFja2FnZSh0b2tlbnMpOworCUJpbmRpbmcgYmluZGluZyA9IHNjb3BlLmdldFR5cGVPclBhY2thZ2UodGhpcy50b2tlbnMpOwogCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCi0JCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKXsKLQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOwotCQkJfQotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpeworCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJfQorCisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBwcm9ibGVtQmluZGluZyA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygoKFBhY2thZ2VCaW5kaW5nKWJpbmRpbmcpLmNvbXBvdW5kTmFtZSwgbnVsbCwgYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCBwcm9ibGVtQmluZGluZyk7CisJCX0KKwogCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKCk7CiAJfQogCkBAIC01NSwxMCArNjQsMTAgQEAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCW91dHB1dC5hcHBlbmQoIjxTZWxlY3RPblR5cGU6Iik7IC8vJE5PTi1OTFMtMSQKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudG9rZW5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCWlmIChpID4gMCkgb3V0cHV0LmFwcGVuZCgnLicpOwotCQlvdXRwdXQuYXBwZW5kKHRva2Vuc1tpXSk7CisJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbaV0pOwogCX0KLQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnPicpOyAKKwlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnPicpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQppbmRleCA5NzFmYjJkLi4zNjk4NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMyw0NyArMzMsNDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWlzc2luZ1R5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKLSAKKwogcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSBleHRlbmRzIFNpbmdsZU5hbWVSZWZlcmVuY2UgewogcHVibGljIFNlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcykgewogCXN1cGVyKHNvdXJjZSwgcG9zKTsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKLQkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRva2VuLCB0aGlzKTsKKwkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOwogCQlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CiAJCX0KLQl9IAorCX0KIAkvLyBpdCBjYW4gYmUgYSBwYWNrYWdlLCB0eXBlLCBtZW1iZXIgdHlwZSwgbG9jYWwgdmFyaWFibGUgb3IgZmllbGQKLQliaW5kaW5nID0gc2NvcGUuZ2V0QmluZGluZyh0b2tlbiwgQmluZGluZy5WQVJJQUJMRSB8IEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuUEFDS0FHRSwgdGhpcywgdHJ1ZSAvKnJlc29sdmUqLyk7Ci0JaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CisJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0QmluZGluZyh0aGlzLnRva2VuLCBCaW5kaW5nLlZBUklBQkxFIHwgQmluZGluZy5UWVBFIHwgQmluZGluZy5QQUNLQUdFLCB0aGlzLCB0cnVlIC8qcmVzb2x2ZSovKTsKKwlpZiAoIXRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CiAJCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCi0JCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCi0JCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQotCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCi0JCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KXsKLQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCQkJaWYgKHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCXx8IHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lCisJCQkJCXx8IHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbgorCQkJCQl8fCB0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KXsKKwkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CiAJCQl9Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgYmluZGluZyk7Ci0JCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKTsKKwkJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyB8fCB0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBNaXNzaW5nVHlwZUJpbmRpbmcpIHsKIAkJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKLQkJCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpewotCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7Ci0JCQl9CQkJCi0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCQkJaWYgKHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKXsKKwkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CisJCQl9CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIHRoaXMuYmluZGluZyk7CiAJCX0gZWxzZSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgYmluZGluZyk7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgdGhpcy5iaW5kaW5nKTsKIAkJfQogCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKCk7CiAJfQogCi0JdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKHRoaXMuYmluZGluZyk7CiB9CiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJb3V0cHV0LmFwcGVuZCgiPFNlbGVjdE9uTmFtZToiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQppbmRleCBhOWU3YzliLi42NjQ5MGEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw3ICsyNCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKQEAgLTM4LDIzICs0MCwyOCBAQAogfQogcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKSB7CiAJLy8gaXQgY2FuIGJlIGEgcGFja2FnZSwgdHlwZSBvciBtZW1iZXIgdHlwZQotCUJpbmRpbmcgYmluZGluZyA9IHNjb3BlLmdldFR5cGVPclBhY2thZ2UobmV3IGNoYXJbXVtdIHt0b2tlbn0pOworCUJpbmRpbmcgYmluZGluZyA9IHNjb3BlLmdldFR5cGVPclBhY2thZ2UobmV3IGNoYXJbXVtdIHt0aGlzLnRva2VufSk7CiAJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJCVByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHByb2JsZW1CaW5kaW5nID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKCgoUGFja2FnZUJpbmRpbmcpYmluZGluZykuY29tcG91bmROYW1lLCBudWxsLCBiaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIHByb2JsZW1CaW5kaW5nKTsKKwkJfQogCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKCk7CiAJfQogCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CiB9CiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKLQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPFNlbGVjdE9uVHlwZToiKS5hcHBlbmQodG9rZW4pLmFwcGVuZCgnPicpOy8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiPFNlbGVjdE9uVHlwZToiKS5hcHBlbmQodGhpcy50b2tlbikuYXBwZW5kKCc+Jyk7Ly8kTk9OLU5MUy0xJAogfQogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlRW5jbG9zaW5nKEJsb2NrU2NvcGUgc2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgewogCXN1cGVyLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCBlbmNsb3NpbmdUeXBlKTsKIAogCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCi0JCWlmICh0aGlzLnJlc29sdmVkVHlwZSA9PSBudWxsIHx8IAotCQkJCSEodGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSB8fCAKKwkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09IG51bGwgfHwKKwkJCQkhKHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgfHwKIAkJCQkJdGhpcy5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKIAllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCmluZGV4IDgyYzQ0OTQuLjVlNTlhMWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTksNyArMTksNyBAQAogICoJMCAgbWVhbnMgY29tcGxldGlvbiBiZWhpbmQgdGhlIGZpcnN0IGNoYXJhY3RlcgogICogIG4gIG1lYW5zIGNvbXBsZXRpb24gYmVoaW5kIHRoZSBuLXRoIGNoYXJhY3RlcgogICovCi0gCisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKQEAgLTM3LDYxICszNyw2NCBAQAogCS8vIE9XTkVSCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX1BBUlNFUiA9IDEwMjQ7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX09SX0FTU0lTVF9QQVJTRVIgPSBBU1NJU1RfUEFSU0VSICsgU0VMRUNUSU9OX1BBUlNFUjsKLQkKKwogCS8vIEtJTkQgOiBhbGwgdmFsdWVzIGtub3duIGJ5IFNlbGVjdGlvblBhcnNlciBhcmUgYmV0d2VlbiAxMDI1IGFuZCAxNTQ5CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OID0gU0VMRUNUSU9OX1BBUlNFUiArIDE7IC8vIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIGJsb2NrCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCA9IFNFTEVDVElPTl9QQVJTRVIgKyAyOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuIHRoZSBrZXl3b3JkICdyZXR1cm4nIGFuZCB0aGUgZW5kIG9mIGEgcmV0dXJuIHN0YXRlbWVudAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQ0FTVF9TVEFURU1FTlQgPSBTRUxFQ1RJT05fUEFSU0VSICsgMzsgLy8gd2hldGhlciB3ZSBhcmUgYmV0d2VlbiAnKScgYW5kIHRoZSBlbmQgb2YgYSBjYXN0IHN0YXRlbWVudAorCQogCiAJcHVibGljIEFTVE5vZGUgYXNzaXN0Tm9kZVBhcmVudDsgLy8gdGhlIHBhcmVudCBub2RlIG9mIGFzc2lzdCBub2RlCi0JCisKIAkvKiBwdWJsaWMgZmllbGRzICovCiAKIAlwdWJsaWMgaW50IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQ7CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTVVBFUiA9ICJzdXBlciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFRISVMgPSAidGhpcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCiBwdWJsaWMgU2VsZWN0aW9uUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsKIAlzdXBlcihwcm9ibGVtUmVwb3J0ZXIpOwogCXRoaXMuamF2YWRvY1BhcnNlci5jaGVja0RvY0NvbW1lbnQgPSB0cnVlOwogfQogcHVibGljIGNoYXJbXSBhc3Npc3RJZGVudGlmaWVyKCl7Ci0JcmV0dXJuICgoU2VsZWN0aW9uU2Nhbm5lcilzY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOworCXJldHVybiAoKFNlbGVjdGlvblNjYW5uZXIpdGhpcy5zY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOwogfQogcHJvdGVjdGVkIHZvaWQgYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKXsKLQlpZiAoaXNPcnBoYW5Db21wbGV0aW9uTm9kZSl7CisJaWYgKHRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSl7CiAJCUFTVE5vZGUgb3JwaGFuID0gdGhpcy5hc3Npc3ROb2RlOwotCQlpc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7Ci0JCQotCQkKKwkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CisKKwogCQkvKiBpZiBpbiBjb250ZXh0IG9mIGEgdHlwZSwgdGhlbiBwZXJzaXN0cyB0aGUgaWRlbnRpZmllciBpbnRvIGEgZmFrZSBmaWVsZCByZXR1cm4gdHlwZSAqLwotCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKLQkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKWN1cnJlbnRFbGVtZW50OworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KIAkJCWlmIChyZWNvdmVyZWRUeXBlLmZvdW5kT3BlbmluZ0JyYWNlKSB7Ci0JCQkJLyogZ2VuZXJhdGUgYSBwc2V1ZG8gZmllbGQgd2l0aCBhIGNvbXBsZXRpb24gb24gdHlwZSByZWZlcmVuY2UgKi8JCisJCQkJLyogZ2VuZXJhdGUgYSBwc2V1ZG8gZmllbGQgd2l0aCBhIGNvbXBsZXRpb24gb24gdHlwZSByZWZlcmVuY2UgKi8KIAkJCQlpZiAob3JwaGFuIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSl7Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKG5ldyBTZWxlY3Rpb25PbkZpZWxkVHlwZSgoVHlwZVJlZmVyZW5jZSlvcnBoYW4pLCAwKTsKKwkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKG5ldyBTZWxlY3Rpb25PbkZpZWxkVHlwZSgoVHlwZVJlZmVyZW5jZSlvcnBoYW4pLCAwKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQlpZiAob3JwaGFuIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgewogCQkJYnVpbGRNb3JlQ29tcGxldGlvbkNvbnRleHQoKEV4cHJlc3Npb24pb3JwaGFuKTsKIAkJfSBlbHNlIHsKIAkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBvcnBoYW47Ci0JCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKHN0YXRlbWVudCwgMCk7CiAJCX0KLQkJY3VycmVudFRva2VuID0gMDsgLy8gZ2l2ZW4gd2UgYXJlIG5vdCBvbiBhbiBlb2YsIHdlIGRvIG5vdCB3YW50IHNpZGUgZWZmZWN0cyBjYXVzZWQgYnkgbG9va2VkLWFoZWFkIHRva2VuCisJCXRoaXMuY3VycmVudFRva2VuID0gMDsgLy8gZ2l2ZW4gd2UgYXJlIG5vdCBvbiBhbiBlb2YsIHdlIGRvIG5vdCB3YW50IHNpZGUgZWZmZWN0cyBjYXVzZWQgYnkgbG9va2VkLWFoZWFkIHRva2VuCiAJfQogfQogcHJpdmF0ZSB2b2lkIGJ1aWxkTW9yZUNvbXBsZXRpb25Db250ZXh0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCUFTVE5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0JCisKIAlpbnQga2luZCA9IHRvcEtub3duRWxlbWVudEtpbmQoU0VMRUNUSU9OX09SX0FTU0lTVF9QQVJTRVIpOwogCWlmKGtpbmQgIT0gMCkgewotLy8JCWludCBpbmZvID0gdG9wS25vd25FbGVtZW50SW5mbyhTRUxFQ1RJT05fT1JfQVNTSVNUX1BBUlNFUik7Ci0JCXN3aXRjaCAoa2luZCkgeworCQlpbnQgaW5mbyA9IHRvcEtub3duRWxlbWVudEluZm8oU0VMRUNUSU9OX09SX0FTU0lTVF9QQVJTRVIpOworCQluZXh0RWxlbWVudCA6IHN3aXRjaCAoa2luZCkgewogCQkJY2FzZSBLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04gOgogCQkJCWlmKHRoaXMuZXhwcmVzc2lvblB0ciA+IDApIHsKIAkJCQkJU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnQoKTsKQEAgLTEwMywxMSArMTA2LDExIEBACiAJCQkJCQlpZihsZW5ndGggIT0gMCAmJiBmaXJzdE5vZGUuc291cmNlU3RhcnQgPiBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5zb3VyY2VFbmQpIHsKIAkJCQkJCQlzd2l0Y2hTdGF0ZW1lbnQuc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoICsgMV07CiAJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJCQkJdGhpcy5hc3RTdGFjaywgCi0JCQkJCQkJCW5ld0FzdFB0ciArIDEsIAotCQkJCQkJCQlzd2l0Y2hTdGF0ZW1lbnQuc3RhdGVtZW50cywgCi0JCQkJCQkJCTAsIAotCQkJCQkJCQlsZW5ndGgpOyAKKwkJCQkJCQkJdGhpcy5hc3RTdGFjaywKKwkJCQkJCQkJbmV3QXN0UHRyICsgMSwKKwkJCQkJCQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMsCisJCQkJCQkJCTAsCisJCQkJCQkJCWxlbmd0aCk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50ID0gbmV3IENhc2VTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwpAQCAtMTE5LDI4ICsxMjIsNDYgQEAKIAkJCQkJcGFyZW50Tm9kZSA9IHN3aXRjaFN0YXRlbWVudDsKIAkJCQkJdGhpcy5hc3Npc3ROb2RlUGFyZW50ID0gcGFyZW50Tm9kZTsKIAkJCQl9Ci0JCQkJYnJlYWs7CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfSU5TSURFX1JFVFVSTl9TVEFURU1FTlQgOgorCQkJCWlmKGluZm8gPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKKwkJCQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworCQkJCQlwYXJlbnROb2RlID0gcmV0dXJuU3RhdGVtZW50OworCQkJCQl0aGlzLmFzc2lzdE5vZGVQYXJlbnQgPSBwYXJlbnROb2RlOworCQkJCX0KKwkJCQlicmVhayBuZXh0RWxlbWVudDsKKwkJCWNhc2UgS19DQVNUX1NUQVRFTUVOVCA6CisJCQkJRXhwcmVzc2lvbiBjYXN0VHlwZTsKKwkJCQlpZih0aGlzLmV4cHJlc3Npb25QdHIgPiAwCisJCQkJCSYmICgoY2FzdFR5cGUgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItMV0pIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkpIHsKKwkJCQkJQ2FzdEV4cHJlc3Npb24gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHByZXNzaW9uLCAoVHlwZVJlZmVyZW5jZSkgY2FzdFR5cGUpOworCQkJCQljYXN0LnNvdXJjZVN0YXJ0ID0gY2FzdFR5cGUuc291cmNlU3RhcnQ7CisJCQkJCWNhc3Quc291cmNlRW5kPSBleHByZXNzaW9uLnNvdXJjZUVuZDsKKwkJCQkJcGFyZW50Tm9kZSA9IGNhc3Q7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZVBhcmVudCA9IHBhcmVudE5vZGU7CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OwogCQl9CiAJfQogCWlmKHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KXBhcmVudE5vZGUsIDApOworCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoKFN0YXRlbWVudClwYXJlbnROb2RlLCAwKTsKIAl9IGVsc2UgewotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KXdyYXBXaXRoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxJZk5lZWRlZChleHByZXNzaW9uKSwgMCk7Ci0JCWlmKGxhc3RDaGVja1BvaW50IDwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpIHsKLQkJCWxhc3RDaGVja1BvaW50ID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgKyAxOworCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoKFN0YXRlbWVudCl3cmFwV2l0aEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsSWZOZWVkZWQoZXhwcmVzc2lvbiksIDApOworCQlpZih0aGlzLmxhc3RDaGVja1BvaW50IDwgZXhwcmVzc2lvbi5zb3VyY2VFbmQpIHsKKwkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBleHByZXNzaW9uLnNvdXJjZUVuZCArIDE7CiAJCX0KIAl9CiB9CiBwcml2YXRlIGJvb2xlYW4gY2hlY2tSZWNvdmVyZWRUeXBlKCkgewotCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CiAJCS8qIGNoZWNrIGlmIGN1cnJlbnQgYXdhaXRpbmcgaWRlbnRpZmllciBpcyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyICovCiAJCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSByZXR1cm4gZmFsc2U7CiAKLQkJaWYgKChsYXN0RXJyb3JFbmRQb3NpdGlvbiA+PSBzZWxlY3Rpb25TdGFydCkKLQkJCSYmIChsYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSBzZWxlY3Rpb25FbmQrMSkpeworCQlpZiAoKHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24gPj0gdGhpcy5zZWxlY3Rpb25TdGFydCkKKwkJCSYmICh0aGlzLmxhc3RFcnJvckVuZFBvc2l0aW9uIDw9IHRoaXMuc2VsZWN0aW9uRW5kKzEpKXsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpdGhpcy5jdXJyZW50RWxlbWVudDsKIAkJLyogZmlsdGVyIG91dCBjYXNlcyB3aGVyZSBzY2FubmVyIGlzIHN0aWxsIGluc2lkZSB0eXBlIGhlYWRlciAqLwogCQlpZiAocmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgewogCQkJdGhpcy5hc3Npc3ROb2RlID0gdGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApOwpAQCAtMTUyLDE3ICsxNzMsMTcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjbGFzc0luc3RhbmNlQ3JlYXRpb24oYm9vbGVhbiBoYXNDbGFzc0JvZHkpIHsKLQkKKwogCS8vIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKIAogCS8vIENsYXNzQm9keW9wdCBwcm9kdWNlcyBhIG51bGwgaXRlbSBvbiB0aGUgYXN0U3RhayBpZiBpdCBwcm9kdWNlcyBOTyBjbGFzcyBib2R5CiAJLy8gQW4gZW1wdHkgY2xhc3MgYm9keSBwcm9kdWNlcyBhIDAgb24gdGhlIGxlbmd0aCBzdGFjay4uLi4uCiAKLQkKLQlpZiAoKGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0cl0gPT0gMSkKLQkJJiYgKGFzdFN0YWNrW2FzdFB0cl0gPT0gbnVsbCkpIHsKIAotCQkKKwlpZiAoKHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdID09IDEpCisJCSYmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9PSBudWxsKSkgeworCisKIAkJaW50IGluZGV4OwogCQlpZiAoKGluZGV4ID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpKSA8IDApIHsKIAkJCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihoYXNDbGFzc0JvZHkpOwpAQCAtMTczLDM4ICsxOTQsMzkgQEAKIAkJCXJldHVybjsKIAkJfQogCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYzsKLQkJYXN0UHRyLS07Ci0JCWFzdExlbmd0aFB0ci0tOworCQl0aGlzLmFzdFB0ci0tOworCQl0aGlzLmFzdExlbmd0aFB0ci0tOwogCQlhbGxvYyA9IG5ldyBTZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKCk7Ci0JCWFsbG9jLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQorCQlhbGxvYy5zb3VyY2VFbmQgPSB0aGlzLmVuZFBvc2l0aW9uOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQogCiAJCWludCBsZW5ndGg7Ci0JCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKLQkJCWV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOworCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJZXhwcmVzc2lvblN0YWNrLCAKLQkJCQlleHByZXNzaW9uUHRyICsgMSwgCi0JCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKwkJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKIAkJfQogCQkvLyB0cmljayB0byBhdm9pZCBjcmVhdGluZyBhIHNlbGVjdGlvbiBvbiB0eXBlIHJlZmVyZW5jZQotCQljaGFyIFtdIG9sZElkZW50ID0gdGhpcy5hc3Npc3RJZGVudGlmaWVyKCk7Ci0JCXRoaXMuc2V0QXNzaXN0SWRlbnRpZmllcihudWxsKTsKKwkJY2hhciBbXSBvbGRJZGVudCA9IGFzc2lzdElkZW50aWZpZXIoKTsKKwkJc2V0QXNzaXN0SWRlbnRpZmllcihudWxsKTsKIAkJYWxsb2MudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JCQotCQl0aGlzLnNldEFzc2lzdElkZW50aWZpZXIob2xkSWRlbnQpOwotCQkKKwkJY2hlY2tGb3JEaWFtb25kKGFsbG9jLnR5cGUpOworCisJCXNldEFzc2lzdElkZW50aWZpZXIob2xkSWRlbnQpOworCiAJCS8vdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnQKIAkJLy93aWxsIGJlIGNyZWF0ZWQgYW5kIGFkZGVkIGJ5IHRoZSBUQyAoc2VlIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcpCi0JCWFsbG9jLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhhbGxvYyk7CiAKIAkJdGhpcy5hc3Npc3ROb2RlID0gYWxsb2M7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbGxvYy5zb3VyY2VFbmQgKyAxOwotCQlpZiAoIWRpZXQpeworCQlpZiAoIXRoaXMuZGlldCl7CiAJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KIAkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAl9IGVsc2UgewpAQCAtMjE3LDExICsyMzksMTEgQEAKIAogCXN1cGVyLmNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOwogCi0JQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQlpZiAoYWxsb2MudHlwZSA9PSBhc3Npc3ROb2RlKXsKLQkJaWYgKCFkaWV0KXsKKwlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwlpZiAoYWxsb2MudHlwZSA9PSB0aGlzLmFzc2lzdE5vZGUpeworCQlpZiAoIXRoaXMuZGlldCl7CiAJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KIAkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAl9CkBAIC0yMzEsMTUgKzI1Myw5MCBAQAogCiAJc3VwZXIuY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aEluaXRpYWxpemVyKCk7CiAKLQlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCWlmIChhbGxvYy50eXBlID09IGFzc2lzdE5vZGUpewotCQlpZiAoIWRpZXQpeworCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbil0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmIChhbGxvYy50eXBlID09IHRoaXMuYXNzaXN0Tm9kZSl7CisJCWlmICghdGhpcy5kaWV0KXsKIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCi0JCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJfQogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpIHsKKwlwb3BFbGVtZW50KEtfQ0FTVF9TVEFURU1FTlQpOworCXN1cGVyLmNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aEdlbmVyaWNzQXJyYXkoKSB7CisJcG9wRWxlbWVudChLX0NBU1RfU1RBVEVNRU5UKTsKKwlzdXBlci5jb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoR2VuZXJpY3NBcnJheSgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aE5hbWVBcnJheSgpIHsKKwlwb3BFbGVtZW50KEtfQ0FTVF9TVEFURU1FTlQpOworCXN1cGVyLmNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhOYW1lQXJyYXkoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhQcmltaXRpdmVUeXBlKCkgeworCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CisJc3VwZXIuY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aFByaW1pdGl2ZVR5cGUoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljc0FycmF5KCkgeworCXBvcEVsZW1lbnQoS19DQVNUX1NUQVRFTUVOVCk7CisJc3VwZXIuY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aFF1YWxpZmllZEdlbmVyaWNzQXJyYXkoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXRjaEZvcm1hbFBhcmFtZXRlcigpIHsKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQlzdXBlci5jb25zdW1lQ2F0Y2hGb3JtYWxQYXJhbWV0ZXIoKTsKKwkJaWYoKCF0aGlzLmRpZXQgfHwgdGhpcy5kaWV0SW50ICE9IDApICYmIHRoaXMuYXN0UHRyID4gLTEpIHsKKwkJCUFyZ3VtZW50IGFyZ3VtZW50ID0gKEFyZ3VtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJCWlmKGFyZ3VtZW50LnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJCWNoYXJbXSBpZGVudGlmaWVyTmFtZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJCWxvbmcgbmFtZVBvc2l0aW9ucyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCQl0aGlzLmludFB0ci0tOyAvLyBkaW1lbnNpb24gZnJvbSB0aGUgdmFyaWFibGVkZWNsYXJhdG9yaWQKKwkJVHlwZVJlZmVyZW5jZSB0eXBlID0gKFR5cGVSZWZlcmVuY2UpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CisJCWludCBtb2RpZmllclBvc2l0aW9ucyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCXRoaXMuaW50UHRyLS07CisJCUFyZ3VtZW50IGFyZyA9CisJCQluZXcgU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUoCisJCQkJaWRlbnRpZmllck5hbWUsCisJCQkJbmFtZVBvc2l0aW9ucywKKwkJCQl0eXBlLAorCQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHIgKyAxXSAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7IC8vIG1vZGlmaWVycworCQlhcmcuYml0cyAmPSB+QVNUTm9kZS5Jc0FyZ3VtZW50OworCQlhcmcuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IG1vZGlmaWVyUG9zaXRpb25zOworCisJCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKKwkJaW50IGxlbmd0aDsKKwkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCQlhcmcuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKKwkJfQorCisJCXB1c2hPbkFzdFN0YWNrKGFyZyk7CisKKwkJdGhpcy5hc3Npc3ROb2RlID0gYXJnOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gKGludCkgbmFtZVBvc2l0aW9uczsKKwkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKworCQlpZiAoIXRoaXMuZGlldCl7CisJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisJCX0KKworCQkvKiBpZiBpbmNvbXBsZXRlIG1ldGhvZCBoZWFkZXIsIGxpc3RMZW5ndGggY291bnRlciB3aWxsIG5vdCBoYXZlIGJlZW4gcmVzZXQsCisJCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3RhY2sgKi8KKwkJdGhpcy5saXN0TGVuZ3RoKys7CisJfQorfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWRXaXRoVHlwZUFyZ3VtZW50cygpIHsKIAkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBUeXBlQXJndW1lbnRzIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CiAJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgJ25ldycgVHlwZUFyZ3VtZW50cyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdApAQCAtMjQ3LDEyICszNDQsMTIgQEAKIAlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYzsKIAlpbnQgbGVuZ3RoOwogCWlmICgoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdKSA9PSAxKSAmJiAodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPT0gbnVsbCkpIHsKLQkJCisKIAkJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKIAkJCXN1cGVyLmNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkV2l0aFR5cGVBcmd1bWVudHMoKTsKIAkJCXJldHVybjsKIAkJfQotCQkKKwogCQkvL05PIENsYXNzQm9keQogCQl0aGlzLmFzdFB0ci0tOwogCQl0aGlzLmFzdExlbmd0aFB0ci0tOwpAQCAtMjYyLDM1ICszNTksMzYgQEAKIAkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOwogCQl9Ci0JCQorCiAJCS8vIHRyaWNrIHRvIGF2b2lkIGNyZWF0aW5nIGEgc2VsZWN0aW9uIG9uIHR5cGUgcmVmZXJlbmNlCi0JCWNoYXIgW10gb2xkSWRlbnQgPSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKTsKLQkJdGhpcy5zZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOworCQljaGFyIFtdIG9sZElkZW50ID0gYXNzaXN0SWRlbnRpZmllcigpOworCQlzZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOwogCQlhbGxvYy50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJCi0JCXRoaXMuc2V0QXNzaXN0SWRlbnRpZmllcihvbGRJZGVudCk7CisJCWNoZWNrRm9yRGlhbW9uZChhbGxvYy50eXBlKTsKKworCQlzZXRBc3Npc3RJZGVudGlmaWVyKG9sZElkZW50KTsKIAogCQlsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgYWxsb2MudHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCWludFB0ci0tOyAvLyByZW1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSAnPCcKKwkJdGhpcy5pbnRQdHItLTsgLy8gcmVtb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgJzwnCiAKIAkJLy90aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudAogCQkvL3dpbGwgYmUgY3JlYXRlZCBhbmQgYWRkZWQgYnkgdGhlIFRDIChzZWUgY3JlYXRlc0ludGVybmFsQ29uc3RydWN0b3JXaXRoQmluZGluZykKIAkJYWxsb2Muc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCQlwdXNoT25FeHByZXNzaW9uU3RhY2soYWxsb2MpOwotCQkKKwogCQl0aGlzLmFzc2lzdE5vZGUgPSBhbGxvYzsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGFsbG9jLnNvdXJjZUVuZCArIDE7Ci0JCWlmICghZGlldCl7CisJCWlmICghdGhpcy5kaWV0KXsKIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCi0JCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJfQogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCX0gZWxzZSB7CkBAIC0yOTgsOCArMzk2LDggQEAKIAl9CiAKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxYWUgPSAKLQkJKFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07IAorCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHFhZSA9CisJCShRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dOwogCXFhZS5lbmNsb3NpbmdJbnN0YW5jZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IHFhZTsKIAlxYWUuc291cmNlU3RhcnQgPSBxYWUuZW5jbG9zaW5nSW5zdGFuY2Uuc291cmNlU3RhcnQ7CkBAIC0zMTAsMTIgKzQwOCwxMiBAQAogCWludCBsZW5ndGg7CiAJaWYgKCgobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0cl0pID09IDEpCiAJCSYmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9PSBudWxsKSkgewotCQkKKwogCQlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgewogCQkJc3VwZXIuY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpOwogCQkJcmV0dXJuOwogCQl9Ci0JCQorCiAJCS8vTk8gQ2xhc3NCb2R5CiAJCXRoaXMuYXN0UHRyLS07CiAJCXRoaXMuYXN0TGVuZ3RoUHRyLS07CkBAIC0zMjUsOTkgKzQyMywxMDUgQEAKIAkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOwogCQl9Ci0JCQorCiAJCS8vIHRyaWNrIHRvIGF2b2lkIGNyZWF0aW5nIGEgc2VsZWN0aW9uIG9uIHR5cGUgcmVmZXJlbmNlCi0JCWNoYXIgW10gb2xkSWRlbnQgPSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKTsKLQkJdGhpcy5zZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOworCQljaGFyIFtdIG9sZElkZW50ID0gYXNzaXN0SWRlbnRpZmllcigpOworCQlzZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOwogCQlhbGxvYy50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJCi0JCXRoaXMuc2V0QXNzaXN0SWRlbnRpZmllcihvbGRJZGVudCk7CisJCWNoZWNrRm9yRGlhbW9uZChhbGxvYy50eXBlKTsKKworCQlzZXRBc3Npc3RJZGVudGlmaWVyKG9sZElkZW50KTsKIAogCQlsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgYWxsb2MudHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCWludFB0ci0tOyAvLyByZW1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSAnPCcKLQkJCisJCXRoaXMuaW50UHRyLS07IC8vIHJlbW92ZSB0aGUgcG9zaXRpb24gb2YgdGhlICc8JworCiAJCS8vdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnQKIAkJLy93aWxsIGJlIGNyZWF0ZWQgYW5kIGFkZGVkIGJ5IHRoZSBUQyAoc2VlIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcpCiAJCWFsbG9jLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFsbG9jKTsKLQkJCisKIAkJdGhpcy5hc3Npc3ROb2RlID0gYWxsb2M7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbGxvYy5zb3VyY2VFbmQgKyAxOwotCQlpZiAoIWRpZXQpeworCQlpZiAoIXRoaXMuZGlldCl7CiAJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KIAkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAl9IGVsc2UgewogCQlzdXBlci5jb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKCk7CiAJfQogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgeworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KGJvb2xlYW4gcXVhbGlmaWVkKSB7CiAJLy8gRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9ICRlbXB0eQogCiAJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKLQkJc3VwZXIuY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCk7CisJCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShxdWFsaWZpZWQpOwogCQlyZXR1cm47CiAJfQotCQotCS8vIHRyaWNrIHRvIGF2b2lkIGNyZWF0aW5nIGEgc2VsZWN0aW9uIG9uIHR5cGUgcmVmZXJlbmNlCi0JY2hhciBbXSBvbGRJZGVudCA9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpOwotCXRoaXMuc2V0QXNzaXN0SWRlbnRpZmllcihudWxsKTsJCQotCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JdGhpcy5zZXRBc3Npc3RJZGVudGlmaWVyKG9sZElkZW50KTsJCQogCi0JVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGUgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsgCisJLy8gdHJpY2sgdG8gYXZvaWQgY3JlYXRpbmcgYSBzZWxlY3Rpb24gb24gdHlwZSByZWZlcmVuY2UKKwljaGFyIFtdIG9sZElkZW50ID0gYXNzaXN0SWRlbnRpZmllcigpOworCXNldEFzc2lzdElkZW50aWZpZXIobnVsbCk7CisJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwlzZXRBc3Npc3RJZGVudGlmaWVyKG9sZElkZW50KTsKKworCVR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gbmV3IFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CiAJYW5vbnltb3VzVHlwZS5uYW1lID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCWFub255bW91c1R5cGUuYml0cyB8PSAoQVNUTm9kZS5Jc0Fub255bW91c1R5cGV8QVNUTm9kZS5Jc0xvY2FsVHlwZSk7Ci0JUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSBuZXcgU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsgCisJUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSBuZXcgU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsKIAltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOwogCXB1c2hPbkFzdFN0YWNrKGFub255bW91c1R5cGUpOwogCi0JYWxsb2Muc291cmNlRW5kID0gclBhcmVuUG9zOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQorCWFsbG9jLnNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQogCWludCBhcmd1bWVudExlbmd0aDsKLQlpZiAoKGFyZ3VtZW50TGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKLQkJZXhwcmVzc2lvblB0ciAtPSBhcmd1bWVudExlbmd0aDsKKwlpZiAoKGFyZ3VtZW50TGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBhcmd1bWVudExlbmd0aDsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCWV4cHJlc3Npb25TdGFjaywgCi0JCQlleHByZXNzaW9uUHRyICsgMSwgCi0JCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvblthcmd1bWVudExlbmd0aF0sIAotCQkJMCwgCi0JCQlhcmd1bWVudExlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bYXJndW1lbnRMZW5ndGhdLAorCQkJMCwKKwkJCWFyZ3VtZW50TGVuZ3RoKTsKKwl9CisJCisJaWYgKHF1YWxpZmllZCkgeworCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwkJYWxsb2MuZW5jbG9zaW5nSW5zdGFuY2UgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07CiAJfQogCi0JYWxsb2MudHlwZSA9IHR5cGVSZWZlcmVuY2U7CQorCWFsbG9jLnR5cGUgPSB0eXBlUmVmZXJlbmNlOwogCiAJYW5vbnltb3VzVHlwZS5zb3VyY2VFbmQgPSBhbGxvYy5zb3VyY2VFbmQ7CiAJLy9wb3NpdGlvbiBhdCB0aGUgdHlwZSB3aGlsZSBpdCBpbXBhY3RzIHRoZSBhbm9ueW1vdXMgZGVjbGFyYXRpb24KIAlhbm9ueW1vdXNUeXBlLnNvdXJjZVN0YXJ0ID0gYW5vbnltb3VzVHlwZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gYWxsb2MudHlwZS5zb3VyY2VTdGFydDsKLQlhbGxvYy5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFsbG9jKTsKIAotCWFzc2lzdE5vZGUgPSBhbGxvYzsKKwl0aGlzLmFzc2lzdE5vZGUgPSBhbGxvYzsKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gYWxsb2Muc291cmNlRW5kICsgMTsKLQlpZiAoIWRpZXQpeworCWlmICghdGhpcy5kaWV0KXsKIAkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCWN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKLQkJaGFzUmVwb3J0ZWRFcnJvciA9IHRydWU7CisJCXRoaXMuY3VycmVudFRva2VuID0gMDsgLy8gb3BlbmluZyBicmFjZSBhbHJlYWR5IHRha2VuIGludG8gYWNjb3VudAorCQl0aGlzLmhhc1JlcG9ydGVkRXJyb3IgPSB0cnVlOwogCX0KIAotCWFub255bW91c1R5cGUuYm9keVN0YXJ0ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcworCWFub255bW91c1R5cGUuYm9keVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiByZWFkaW5nIHN1cGVyLWludGVyZmFjZXMKIAkvLyByZWNvdmVyeQotCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKLQkJbGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKLQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoYW5vbnltb3VzVHlwZSwgMCk7Ci0JCWN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKLQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKKwkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOworCQl0aGlzLmN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKKwkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyVmFyaWFibGUoKSB7CkBAIC00MjYsMjUgKzUzMCwyNSBAQAogCiAJc3VwZXIuY29uc3VtZUVudGVyVmFyaWFibGUoKTsKIAotCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07Ci0JaWYgKHZhcmlhYmxlLnR5cGUgPT0gYXNzaXN0Tm9kZSl7Ci0JCWlmICghZGlldCl7CisJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaWYgKHZhcmlhYmxlLnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKXsKKwkJaWYgKCF0aGlzLmRpZXQpewogCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKLQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQl9Ci0JCWlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsgLy8gYWxyZWFkeSBhdHRhY2hlZCBpbnNpZGUgdmFyaWFibGUgZGVjbAorCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsgLy8gYWxyZWFkeSBhdHRhY2hlZCBpbnNpZGUgdmFyaWFibGUgZGVjbAogCX0KIH0KIAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpIHsKIAlzdXBlci5jb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCk7Ci0JCisKIAkvLyBkb2VzIG5vdCBrZWVwIHRoZSBpbml0aWFsaXphdGlvbiBpZiBzZWxlY3Rpb24gaXMgbm90IGluc2lkZQotCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJaW50IHN0YXJ0ID0gdmFyaWFibGUuaW5pdGlhbGl6YXRpb24uc291cmNlU3RhcnQ7CiAJaW50IGVuZCA9ICB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7Ci0JaWYgKChzZWxlY3Rpb25TdGFydCA8IHN0YXJ0KSAmJiAgKHNlbGVjdGlvbkVuZCA8IHN0YXJ0KSB8fAotCQkJKHNlbGVjdGlvblN0YXJ0ID4gZW5kKSAmJiAoc2VsZWN0aW9uRW5kID4gZW5kKSkgeworCWlmICgodGhpcy5zZWxlY3Rpb25TdGFydCA8IHN0YXJ0KSAmJiAgKHRoaXMuc2VsZWN0aW9uRW5kIDwgc3RhcnQpIHx8CisJCQkodGhpcy5zZWxlY3Rpb25TdGFydCA+IGVuZCkgJiYgKHRoaXMuc2VsZWN0aW9uRW5kID4gZW5kKSkgewogCQl2YXJpYWJsZS5pbml0aWFsaXphdGlvbiA9IG51bGw7CiAJfQogCkBAIC00NTcsNDUgKzU2MSw0NSBAQAogCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CiAJCXN1cGVyLmNvbnN1bWVGaWVsZEFjY2Vzcyhpc1N1cGVyQWNjZXNzKTsKIAkJcmV0dXJuOwotCX0gCi0JRmllbGRSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2UgPSAKKwl9CisJRmllbGRSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2UgPQogCQluZXcgU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZSgKLQkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCi0JCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsKLQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JaWYgKGlzU3VwZXJBY2Nlc3MpIHsgLy9jb25zaWRlcmF0ZXMgdGhlIGZpZWxkUmVmZXJlbmNlZXJlbmNlIGJlZ2lubmluZyBhdCB0aGUgJ3N1cGVyJyAuLi4uCQotCQlmaWVsZFJlZmVyZW5jZS5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZmllbGRSZWZlcmVuY2Uuc291cmNlU3RhcnQsIGVuZFBvc2l0aW9uKTsKKwkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCisJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJaWYgKGlzU3VwZXJBY2Nlc3MpIHsgLy9jb25zaWRlcmF0ZXMgdGhlIGZpZWxkUmVmZXJlbmNlZXJlbmNlIGJlZ2lubmluZyBhdCB0aGUgJ3N1cGVyJyAuLi4uCisJCWZpZWxkUmVmZXJlbmNlLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZmllbGRSZWZlcmVuY2Uuc291cmNlU3RhcnQsIHRoaXMuZW5kUG9zaXRpb24pOwogCQlwdXNoT25FeHByZXNzaW9uU3RhY2soZmllbGRSZWZlcmVuY2UpOwogCX0gZWxzZSB7IC8vb3B0aW1pemUgcHVzaC9wb3AKLQkJaWYgKChmaWVsZFJlZmVyZW5jZS5yZWNlaXZlciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSkuaXNUaGlzKCkpIHsgLy9maWVsZFJlZmVyZW5jZWVyZW5jZSBiZWdpbnMgYXQgdGhlIHRoaXMKKwkJaWYgKChmaWVsZFJlZmVyZW5jZS5yZWNlaXZlciA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pLmlzVGhpcygpKSB7IC8vZmllbGRSZWZlcmVuY2VlcmVuY2UgYmVnaW5zIGF0IHRoZSB0aGlzCiAJCQlmaWVsZFJlZmVyZW5jZS5zb3VyY2VTdGFydCA9IGZpZWxkUmVmZXJlbmNlLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwogCQl9Ci0JCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGZpZWxkUmVmZXJlbmNlOworCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gZmllbGRSZWZlcmVuY2U7CiAJfQotCWFzc2lzdE5vZGUgPSBmaWVsZFJlZmVyZW5jZTsKKwl0aGlzLmFzc2lzdE5vZGUgPSBmaWVsZFJlZmVyZW5jZTsKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gZmllbGRSZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQlpZiAoIWRpZXQpeworCWlmICghdGhpcy5kaWV0KXsKIAkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJfQotCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CQorCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9ybWFsUGFyYW1ldGVyKGJvb2xlYW4gaXNWYXJBcmdzKSB7CiAJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKIAkJc3VwZXIuY29uc3VtZUZvcm1hbFBhcmFtZXRlcihpc1ZhckFyZ3MpOwotCQlpZigoIWRpZXQgfHwgZGlldEludCAhPSAwKSAmJiBhc3RQdHIgPiAtMSkgewotCQkJQXJndW1lbnQgYXJndW1lbnQgPSAoQXJndW1lbnQpIGFzdFN0YWNrW2FzdFB0cl07Ci0JCQlpZihhcmd1bWVudC50eXBlID09IGFzc2lzdE5vZGUpIHsKLQkJCQlpc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJaWYoKCF0aGlzLmRpZXQgfHwgdGhpcy5kaWV0SW50ICE9IDApICYmIHRoaXMuYXN0UHRyID4gLTEpIHsKKwkJCUFyZ3VtZW50IGFyZ3VtZW50ID0gKEFyZ3VtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJCWlmKGFyZ3VtZW50LnR5cGUgPT0gdGhpcy5hc3Npc3ROb2RlKSB7CisJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwkJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQkJY2hhcltdIGlkZW50aWZpZXJOYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOwotCQlsb25nIG5hbWVQb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJY2hhcltdIGlkZW50aWZpZXJOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwkJbG9uZyBuYW1lUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CiAJCWludCBleHRlbmRlZERpbWVuc2lvbnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCQlpbnQgZW5kT2ZFbGxpcHNpcyA9IDA7CiAJCWlmIChpc1ZhckFyZ3MpIHsKQEAgLTUxMSwzNiArNjE1LDYwIEBACiAJCQl9CiAJCQl0eXBlLmJpdHMgfD0gQVNUTm9kZS5Jc1ZhckFyZ3M7IC8vIHNldCBpc1ZhckFyZ3MKIAkJfQotCQlpbnQgbW9kaWZpZXJQb3NpdGlvbnMgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JCWludFB0ci0tOwotCQlBcmd1bWVudCBhcmcgPSAKKwkJaW50IG1vZGlmaWVyUG9zaXRpb25zID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJdGhpcy5pbnRQdHItLTsKKwkJQXJndW1lbnQgYXJnID0KIAkJCW5ldyBTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZSgKLQkJCQlpZGVudGlmaWVyTmFtZSwgCi0JCQkJbmFtZVBvc2l0aW9ucywgCi0JCQkJdHlwZSwgCi0JCQkJaW50U3RhY2tbaW50UHRyICsgMV0gJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOyAvLyBtb2RpZmllcnMKKwkJCQlpZGVudGlmaWVyTmFtZSwKKwkJCQluYW1lUG9zaXRpb25zLAorCQkJCXR5cGUsCisJCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ciArIDFdICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKTsgLy8gbW9kaWZpZXJzCiAJCWFyZy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbW9kaWZpZXJQb3NpdGlvbnM7CisKKwkJLy8gY29uc3VtZSBhbm5vdGF0aW9ucworCQlpbnQgbGVuZ3RoOworCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJCWFyZy5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOworCQl9CisKIAkJcHVzaE9uQXN0U3RhY2soYXJnKTsKLQkJCi0JCWFzc2lzdE5vZGUgPSBhcmc7CisKKwkJdGhpcy5hc3Npc3ROb2RlID0gYXJnOwogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gKGludCkgbmFtZVBvc2l0aW9uczsKLQkJaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7Ci0JCQotCQlpZiAoIWRpZXQpeworCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCisJCWlmICghdGhpcy5kaWV0KXsKIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCi0JCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJfQogCiAJCS8qIGlmIGluY29tcGxldGUgbWV0aG9kIGhlYWRlciwgbGlzdExlbmd0aCBjb3VudGVyIHdpbGwgbm90IGhhdmUgYmVlbiByZXNldCwKIAkJCWluZGljYXRpbmcgdGhhdCBzb21lIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjayAqLwotCQlsaXN0TGVuZ3RoKys7Ci0JfSAJCisJCXRoaXMubGlzdExlbmd0aCsrOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbigpIHsKKwlzdXBlci5jb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKTsKKwlwdXNoT25FbGVtZW50U3RhY2soS19DQVNUX1NUQVRFTUVOVCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEoKSB7CisJc3VwZXIuY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uTEwxKCk7CisJcHVzaE9uRWxlbWVudFN0YWNrKEtfQ0FTVF9TVEFURU1FTlQpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uV2l0aFF1YWxpZmllZEdlbmVyaWNzKCkgeworCXN1cGVyLmNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljcygpOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX0NBU1RfU1RBVEVNRU5UKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbigpIHsKIAlpZiAoaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKIAkJc3VwZXIuY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKCk7CiAJfSBlbHNlIHsKLQkJZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCQlnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOwogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtNTUwLDcgKzY3OCw3IEBACiAJaWYgKGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CiAJCXN1cGVyLmNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbldpdGhOYW1lKCk7CiAJfSBlbHNlIHsKLQkJZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCQlnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOwogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtNTU4LDU4ICs2ODYsNTggQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7CiAJc3VwZXIuY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpOwotCQorCiAJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlIGlmIHRoZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VsZWN0aW9uCiAJaWYgKCF0aGlzLmRpZXQpIHsKIAkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gKExvY2FsRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwotCQlpZiAoKHRoaXMuc2VsZWN0aW9uU3RhcnQgPj0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCkgCisJCWlmICgodGhpcy5zZWxlY3Rpb25TdGFydCA+PSBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KQogCQkJCSYmICAodGhpcy5zZWxlY3Rpb25FbmQgPD0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQpKSB7Ci0JCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CQotCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOworCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWFya2VyQW5ub3RhdGlvbigpIHsKIAlpbnQgaW5kZXg7Ci0JCisKIAlpZiAoKGluZGV4ID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpKSA8IDApIHsKIAkJc3VwZXIuY29uc3VtZU1hcmtlckFubm90YXRpb24oKTsKIAkJcmV0dXJuOwotCX0gCi0JCisJfQorCiAJTWFya2VyQW5ub3RhdGlvbiBtYXJrZXJBbm5vdGF0aW9uID0gbnVsbDsKIAlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKIAlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2U7CiAKIAkvKiByZXRyaWV2ZSBpZGVudGlmaWVycyBzdWJzZXQgYW5kIHdob2xlIHBvc2l0aW9ucywgdGhlIGFzc2lzdCBub2RlIHBvc2l0aW9ucwogCQlzaG91bGQgaW5jbHVkZSB0aGUgZW50aXJlIHJlcGxhY2VkIHNvdXJjZS4gKi8KLQkKKwogCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoaW5kZXgpOwotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBvbiB0eXBlIHJlZmVyZW5jZSAqLwotCQorCiAJaWYgKGluZGV4ID09IDApIHsKIAkJLyogYXNzaXN0IGluc2lkZSBmaXJzdCBpZGVudGlmaWVyICovCi0JCXR5cGVSZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoCi0JCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksIAorCQl0eXBlUmVmZXJlbmNlID0gY3JlYXRlU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSgKKwkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwKIAkJCQkJCXBvc2l0aW9uc1swXSk7CiAJfSBlbHNlIHsKIAkJLyogYXNzaXN0IGluc2lkZSBzdWJzZXF1ZW50IGlkZW50aWZpZXIgKi8KLQkJdHlwZVJlZmVyZW5jZSA9CXRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKLQkJCQkJCXN1YnNldCwgIAotCQkJCQkJYXNzaXN0SWRlbnRpZmllcigpLCAKKwkJdHlwZVJlZmVyZW5jZSA9CWNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoCisJCQkJCQlzdWJzZXQsCisJCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksCiAJCQkJCQlwb3NpdGlvbnMpOwogCX0KLQlhc3Npc3ROb2RlID0gdHlwZVJlZmVyZW5jZTsKKwl0aGlzLmFzc2lzdE5vZGUgPSB0eXBlUmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZCArIDE7CiAKIAltYXJrZXJBbm5vdGF0aW9uID0gbmV3IE1hcmtlckFubm90YXRpb24odHlwZVJlZmVyZW5jZSwgdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CkBAIC02MjAsOCArNzQ4LDggQEAKIAlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgewogCQlzdXBlci5jb25zdW1lTWVtYmVyVmFsdWVQYWlyKCk7CiAJCXJldHVybjsKLQl9IAotCQorCX0KKwogCWNoYXJbXSBzaW1wbGVOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKIAlsb25nIHBvc2l0aW9uID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CkBAIC02MzEsMjAgKzc1OSwyMCBAQAogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwogCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgU2VsZWN0aW9uT25OYW1lT2ZNZW1iZXJWYWx1ZVBhaXIoc2ltcGxlTmFtZSwgc3RhcnQsIGVuZCwgdmFsdWUpOwogCXB1c2hPbkFzdFN0YWNrKG1lbWJlclZhbHVlUGFpcik7Ci0JCi0JYXNzaXN0Tm9kZSA9IG1lbWJlclZhbHVlUGFpcjsKKworCXRoaXMuYXNzaXN0Tm9kZSA9IG1lbWJlclZhbHVlUGFpcjsKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVtYmVyVmFsdWVQYWlyLnNvdXJjZUVuZCArIDE7Ci0JCi0JCisKKwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgewogCS8vIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKIAogCS8vIHdoZW4gdGhlIG5hbWUgaXMgb25seSBhbiBpZGVudGlmaWVyLi4ud2UgaGF2ZSBhIG1lc3NhZ2Ugc2VuZCB0byAidGhpcyIgKGltcGxpY2l0KQogCi0JY2hhcltdIHNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCWNoYXJbXSBzZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CiAJaW50IGFjY2Vzc01vZGU7Ci0JaWYoc2VsZWN0b3IgPT0gdGhpcy5hc3Npc3RJZGVudGlmaWVyKCkpIHsKKwlpZihzZWxlY3RvciA9PSBhc3Npc3RJZGVudGlmaWVyKCkpIHsKIAkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIFNVUEVSKSkgewogCQkJYWNjZXNzTW9kZSA9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyOwogCQl9IGVsc2UgaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIFRISVMpKSB7CkBAIC02NTcsMTcgKzc4NSwxNyBAQAogCQlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsKIAkJcmV0dXJuOwogCX0KLQkKKwogCWZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IG5ldyBTZWxlY3Rpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKGFjY2Vzc01vZGUpOwotCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7Ci0JY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdID4+PiAzMik7CisJY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOworCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IChpbnQpICh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPj4+IDMyKTsKIAlpbnQgbGVuZ3RoOwotCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKLQkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZXhwcmVzc2lvblN0YWNrLCBleHByZXNzaW9uUHRyICsgMSwgY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4cHJlc3Npb25TdGFjaywgdGhpcy5leHByZXNzaW9uUHRyICsgMSwgY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIDAsIGxlbmd0aCk7CiAJfQogCi0JaWYgKCFkaWV0KXsKKwlpZiAoIXRoaXMuZGlldCl7CiAJCXB1c2hPbkFzdFN0YWNrKGNvbnN0cnVjdG9yQ2FsbCk7CiAJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtNjc4LDExICs4MDYsMTEgQEAKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCQlyZXR1cm4gb3V0cHV0OyAKKwkJCQlyZXR1cm4gb3V0cHV0OwogCQkJfQogCQl9KTsKIAl9Ci0JdGhpcy5hc3Npc3ROb2RlID0gY29uc3RydWN0b3JDYWxsOwkKKwl0aGlzLmFzc2lzdE5vZGUgPSBjb25zdHJ1Y3RvckNhbGw7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgKyAxOwogCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiB9CkBAIC02OTAsOSArODE4LDkgQEAKIAkvL29wdGltaXplIHRoZSBwdXNoL3BvcAogCS8vTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCiAKLQljaGFyW10gc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJY2hhcltdIHNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKIAlpbnQgYWNjZXNzTW9kZTsKLQlpZihzZWxlY3RvciA9PSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKSkgeworCWlmKHNlbGVjdG9yID09IGFzc2lzdElkZW50aWZpZXIoKSkgewogCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgU1VQRVIpKSB7CiAJCQlhY2Nlc3NNb2RlID0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXI7CiAJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgVEhJUykpIHsKQEAgLTcwNSwxOCArODMzLDE4IEBACiAJCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOwogCQlyZXR1cm47CiAJfQotCQorCiAJZmluYWwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY29uc3RydWN0b3JDYWxsID0gbmV3IFNlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoYWNjZXNzTW9kZSk7Ci0JY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHJQYXJlblBvczsKKwljb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gdGhpcy5yUGFyZW5Qb3M7CiAJaW50IGxlbmd0aDsKLQlpZiAoKGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7Ci0JCWV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KGV4cHJlc3Npb25TdGFjaywgZXhwcmVzc2lvblB0ciArIDEsIGNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAwLCBsZW5ndGgpOworCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHByZXNzaW9uU3RhY2ssIHRoaXMuZXhwcmVzc2lvblB0ciArIDEsIGNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAwLCBsZW5ndGgpOwogCX0KLQljb25zdHJ1Y3RvckNhbGwucXVhbGlmaWNhdGlvbiA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dOworCWNvbnN0cnVjdG9yQ2FsbC5xdWFsaWZpY2F0aW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dOwogCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IGNvbnN0cnVjdG9yQ2FsbC5xdWFsaWZpY2F0aW9uLnNvdXJjZVN0YXJ0OwotCQotCWlmICghZGlldCl7CisKKwlpZiAoIXRoaXMuZGlldCl7CiAJCXB1c2hPbkFzdFN0YWNrKGNvbnN0cnVjdG9yQ2FsbCk7CiAJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtNzI3LDExMSArODU1LDExMSBAQAogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQkJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQkJCXJldHVybiBvdXRwdXQ7IAorCQkJCXJldHVybiBvdXRwdXQ7CiAJCQl9CiAJCX0pOwogCX0KLQkKKwogCXRoaXMuYXNzaXN0Tm9kZSA9IGNvbnN0cnVjdG9yQ2FsbDsKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCArIDE7CiAJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVOb3JtYWxBbm5vdGF0aW9uKCkgewogCWludCBpbmRleDsKLQkKKwogCWlmICgoaW5kZXggPSB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpIDwgMCkgewogCQlzdXBlci5jb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpOwogCQlyZXR1cm47Ci0JfSAKLQkKKwl9CisKIAlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSBudWxsOwogCWludCBsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdOwogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZTsKLQkKKwogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCQorCiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCk7Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOwotCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXRoaXMuaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CiAJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQlpZGVudGlmaWVyUHRyICsgMSwgCi0JCXBvc2l0aW9ucywgCi0JCTAsIAotCQlsZW5ndGgpOyAKKwkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwKKwkJcG9zaXRpb25zLAorCQkwLAorCQlsZW5ndGgpOwogCiAJLyogYnVpbGQgc3BlY2lmaWMgYXNzaXN0IG9uIHR5cGUgcmVmZXJlbmNlICovCi0JCisKIAlpZiAoaW5kZXggPT0gMCkgewogCQkvKiBhc3Npc3QgaW5zaWRlIGZpcnN0IGlkZW50aWZpZXIgKi8KLQkJdHlwZVJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSgKLQkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwgCisJCXR5cGVSZWZlcmVuY2UgPSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAorCQkJCQkJYXNzaXN0SWRlbnRpZmllcigpLAogCQkJCQkJcG9zaXRpb25zWzBdKTsKIAl9IGVsc2UgewogCQkvKiBhc3Npc3QgaW5zaWRlIHN1YnNlcXVlbnQgaWRlbnRpZmllciAqLwotCQl0eXBlUmVmZXJlbmNlID0JdGhpcy5jcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKAotCQkJCQkJc3Vic2V0LCAgCi0JCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksIAorCQl0eXBlUmVmZXJlbmNlID0JY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKKwkJCQkJCXN1YnNldCwKKwkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwKIAkJCQkJCXBvc2l0aW9ucyk7CiAJfQotCWFzc2lzdE5vZGUgPSB0eXBlUmVmZXJlbmNlOworCXRoaXMuYXNzaXN0Tm9kZSA9IHR5cGVSZWZlcmVuY2U7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGVSZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQkJCisKIAlub3JtYWxBbm5vdGF0aW9uID0gbmV3IE5vcm1hbEFubm90YXRpb24odHlwZVJlZmVyZW5jZSwgdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CiAJaWYgKChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmFzdFN0YWNrLCAKLQkJCSh0aGlzLmFzdFB0ciAtPSBsZW5ndGgpICsgMSwgCi0JCQlub3JtYWxBbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuYXN0U3RhY2ssCisJCQkodGhpcy5hc3RQdHIgLT0gbGVuZ3RoKSArIDEsCisJCQlub3JtYWxBbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJbm9ybWFsQW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhub3JtYWxBbm5vdGF0aW9uKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgewogCWludCBpbmRleDsKLQkKKwogCWlmICgoaW5kZXggPSB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpIDwgMCkgewogCQlzdXBlci5jb25zdW1lU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwogCQlyZXR1cm47Ci0JfSAKLQkKKwl9CisKIAlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNpbmdsZU1lbWJlckFubm90YXRpb24gPSBudWxsOwogCWludCBsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdOwogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZTsKLQkKKwogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCQorCiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCk7Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOwotCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXRoaXMuaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CiAJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQlpZGVudGlmaWVyUHRyICsgMSwgCi0JCXBvc2l0aW9ucywgCi0JCTAsIAotCQlsZW5ndGgpOyAKKwkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwKKwkJcG9zaXRpb25zLAorCQkwLAorCQlsZW5ndGgpOwogCiAJLyogYnVpbGQgc3BlY2lmaWMgYXNzaXN0IG9uIHR5cGUgcmVmZXJlbmNlICovCi0JCisKIAlpZiAoaW5kZXggPT0gMCkgewogCQkvKiBhc3Npc3QgaW5zaWRlIGZpcnN0IGlkZW50aWZpZXIgKi8KLQkJdHlwZVJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlU2luZ2xlQXNzaXN0VHlwZVJlZmVyZW5jZSgKLQkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwgCisJCXR5cGVSZWZlcmVuY2UgPSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKAorCQkJCQkJYXNzaXN0SWRlbnRpZmllcigpLAogCQkJCQkJcG9zaXRpb25zWzBdKTsKIAl9IGVsc2UgewogCQkvKiBhc3Npc3QgaW5zaWRlIHN1YnNlcXVlbnQgaWRlbnRpZmllciAqLwotCQl0eXBlUmVmZXJlbmNlID0JdGhpcy5jcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKAotCQkJCQkJc3Vic2V0LCAgCi0JCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksIAorCQl0eXBlUmVmZXJlbmNlID0JY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZSgKKwkJCQkJCXN1YnNldCwKKwkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwKIAkJCQkJCXBvc2l0aW9ucyk7CiAJfQotCWFzc2lzdE5vZGUgPSB0eXBlUmVmZXJlbmNlOworCXRoaXMuYXNzaXN0Tm9kZSA9IHR5cGVSZWZlcmVuY2U7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGVSZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKIAogCXNpbmdsZU1lbWJlckFubm90YXRpb24gPSBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih0eXBlUmVmZXJlbmNlLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKQEAgLTg0Miw3ICs5NzAsNyBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0ltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgJ3N0YXRpYycgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTg1NCw2NCArOTgyLDc4IEBACiAJfQogCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CiAJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJaWRlbnRpZmllclB0ciArIDEsIAotCQlwb3NpdGlvbnMsIAotCQkwLCAKLQkJbGVuZ3RoKTsgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKKwkJbGVuZ3RoKTsKIAogCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBub2RlIG9uIGltcG9ydCBzdGF0ZW1lbnQgKi8KLQlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOworCUltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UgPSBjcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2Uoc3Vic2V0LCBwb3NpdGlvbnMsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOwogCXJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuT25EZW1hbmQ7Ci0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwkvLyBzdGFyIGVuZCBwb3NpdGlvbgorCXJlZmVyZW5jZS50cmFpbGluZ1N0YXJQb3NpdGlvbiA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQkKKwogCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CiAKLQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7Ci0JCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKIAkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKIAl9CiAJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCi0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOwotCQlsYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVRva2VuKGludCB0b2tlbikgewogCXN1cGVyLmNvbnN1bWVUb2tlbih0b2tlbik7Ci0JCi0JLy8gaWYgaW4gYSBtZXRob2Qgb3IgaWYgaW4gYSBmaWVsZCBpbml0aWFsaXplciAKKworCS8vIGlmIGluIGEgbWV0aG9kIG9yIGlmIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIKIAlpZiAoaXNJbnNpZGVNZXRob2QoKSB8fCBpc0luc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkgewogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCQljYXNlIFRva2VuTmFtZWNhc2UgOgogCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVDT0xPTjoKLQkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKFNFTEVDVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04pIHsgCisJCQkJaWYodG9wS25vd25FbGVtZW50S2luZChTRUxFQ1RJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OKSB7CiAJCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OKTsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZXJldHVybjoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCwgdGhpcy5icmFja2V0RGVwdGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT046CisJCQkJc3dpdGNoKHRvcEtub3duRWxlbWVudEtpbmQoU0VMRUNUSU9OX09SX0FTU0lTVF9QQVJTRVIpKSB7CisJCQkJCWNhc2UgS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKFNFTEVDVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSB0aGlzLmJyYWNrZXREZXB0aCkgeworCQkJCQkJCXBvcEVsZW1lbnQoS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCX0KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCWludCBpbmRleDsKQEAgLTkyMyw0MiArMTA2NSw0NCBAQAogCX0KIAkvKiByZXRyaWV2ZSBpZGVudGlmaWVycyBzdWJzZXQgYW5kIHdob2xlIHBvc2l0aW9ucywgdGhlIGFzc2lzdCBub2RlIHBvc2l0aW9ucwogCQlzaG91bGQgaW5jbHVkZSB0aGUgZW50aXJlIHJlcGxhY2VkIHNvdXJjZS4gKi8KLQlpbnQgbGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdOworCWludCBsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdOwogCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoaW5kZXgrMSk7IC8vIGluY2x1ZGUgdGhlIGFzc2lzdElkZW50aWZpZXIKLQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKIAlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCWlkZW50aWZpZXJQdHIgKyAxLCAKLQkJcG9zaXRpb25zLCAKLQkJMCwgCi0JCWxlbmd0aCk7IAorCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLAorCQl0aGlzLmlkZW50aWZpZXJQdHIgKyAxLAorCQlwb3NpdGlvbnMsCisJCTAsCisJCWxlbmd0aCk7CiAKIAkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgbm9kZSBvbiBpbXBvcnQgc3RhdGVtZW50ICovCi0JSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CisJSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNyZWF0ZUFzc2lzdEltcG9ydFJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucywgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpOwogCXJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuT25EZW1hbmQ7Ci0JYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKKwkvLyBzdGFyIGVuZCBwb3NpdGlvbgorCXJlZmVyZW5jZS50cmFpbGluZ1N0YXJQb3NpdGlvbiA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQkKKwogCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CiAKLQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7Ci0JCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKIAkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKIAl9CiAJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwotCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBmbHVzaCBjb21tZW50cyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCi0JcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOwotCQlsYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHVibGljIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zLCBsb25nW10gcG9zaXRpb25zLCBpbnQgbW9kKXsKQEAgLTk4MiwxNSArMTEyNiwxNSBAQAogfQogcHVibGljIE5hbWVSZWZlcmVuY2UgY3JlYXRlUXVhbGlmaWVkQXNzaXN0TmFtZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gYXNzaXN0TmFtZSwgbG9uZ1tdIHBvc2l0aW9ucyl7CiAJcmV0dXJuIG5ldyBTZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UoCi0JCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsIAotCQkJCQlhc3Npc3ROYW1lLCAKLQkJCQkJcG9zaXRpb25zKTsgCQorCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLAorCQkJCQlhc3Npc3ROYW1lLAorCQkJCQlwb3NpdGlvbnMpOwogfQogcHVibGljIFR5cGVSZWZlcmVuY2UgY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gYXNzaXN0TmFtZSwgbG9uZ1tdIHBvc2l0aW9ucyl7CiAJcmV0dXJuIG5ldyBTZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCi0JCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsIAotCQkJCQlhc3Npc3ROYW1lLCAKLQkJCQkJcG9zaXRpb25zKTsgCQorCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLAorCQkJCQlhc3Npc3ROYW1lLAorCQkJCQlwb3NpdGlvbnMpOwogfQogcHVibGljIFR5cGVSZWZlcmVuY2UgY3JlYXRlUGFyYW1ldGVyaXplZFF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoCiAJCWNoYXJbXVtdIHRva2VucywgVHlwZVJlZmVyZW5jZVtdW10gdHlwZUFyZ3VtZW50cywgY2hhcltdIGFzc2lzdG5hbWUsIFR5cGVSZWZlcmVuY2VbXSBhc3Npc3RUeXBlQXJndW1lbnRzLCBsb25nW10gcG9zaXRpb25zKSB7CkBAIC0xMDA5LDExICsxMTUzLDExIEBACiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gZGlldFBhcnNlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIGludCBzdGFydCwgaW50IGVuZCkgewogCiAJdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0OwotCXRoaXMuc2VsZWN0aW9uRW5kID0gZW5kOwkKKwl0aGlzLnNlbGVjdGlvbkVuZCA9IGVuZDsKIAlTZWxlY3Rpb25TY2FubmVyIHNlbGVjdGlvblNjYW5uZXIgPSAoU2VsZWN0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CiAJc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25JZGVudGlmaWVyID0gbnVsbDsKIAlzZWxlY3Rpb25TY2FubmVyLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7Ci0Jc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25FbmQgPSBlbmQ7CQorCXNlbGVjdGlvblNjYW5uZXIuc2VsZWN0aW9uRW5kID0gZW5kOwogCXJldHVybiB0aGlzLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7CiB9CiBwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpIHsKQEAgLTEwMjYsMzEgKzExNzAsMzEgQEAKIAkJcmV0dXJuIHN1cGVyLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CiAJfQogCi0JaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKIAlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXNzaXN0SWRlbnRpZmllcigpLCBTVVBFUikpewogCQlSZWZlcmVuY2UgcmVmZXJlbmNlOwogCQlpZiAoY29tcGxldGlvbkluZGV4ID4gMCl7IC8vIHF1YWxpZmllZCBzdXBlcgogCQkJLy8gZGlzY2FyZCAnc3VwZXInIGZyb20gaWRlbnRpZmllciBzdGFja3MKLQkJCWlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGNvbXBsZXRpb25JbmRleDsKLQkJCWludCBwdHIgPSBpZGVudGlmaWVyUHRyIC09IChsZW5ndGggLSBjb21wbGV0aW9uSW5kZXgpOworCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGNvbXBsZXRpb25JbmRleDsKKwkJCWludCBwdHIgPSB0aGlzLmlkZW50aWZpZXJQdHIgLT0gKGxlbmd0aCAtIGNvbXBsZXRpb25JbmRleCk7CiAJCQlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOwotCQkJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSk7Ci0JCQlyZWZlcmVuY2UgPSAKKwkJCXB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayh0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdKTsKKwkJCXJlZmVyZW5jZSA9CiAJCQkJbmV3IFNlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UoCi0JCQkJCWdldFR5cGVSZWZlcmVuY2UoMCksIAotCQkJCQkoaW50KShpZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHIrMV0gPj4+IDMyKSwKLQkJCQkJKGludCkgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyKzFdKTsKKwkJCQkJZ2V0VHlwZVJlZmVyZW5jZSgwKSwKKwkJCQkJKGludCkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHIrMV0gPj4+IDMyKSwKKwkJCQkJKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1twdHIrMV0pOwogCQl9IGVsc2UgeyAvLyBzdGFuZGFyZCBzdXBlcgotCQkJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7Ci0JCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JCQlyZWZlcmVuY2UgPSBuZXcgU2VsZWN0aW9uT25TdXBlclJlZmVyZW5jZSgoaW50KShpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyKzFdID4+PiAzMiksIChpbnQpIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIrMV0pOworCQkJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCQkJcmVmZXJlbmNlID0gbmV3IFNlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UoKGludCkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIrMV0gPj4+IDMyKSwgKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIrMV0pOwogCQl9CiAJCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7Ci0JCXRoaXMuYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsJCisJCXRoaXMuYXNzaXN0Tm9kZSA9IHJlZmVyZW5jZTsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOwotCQlpZiAoIWRpZXQgfHwgZGlldEludCAhPSAwKXsKKwkJaWYgKCF0aGlzLmRpZXQgfHwgdGhpcy5kaWV0SW50ICE9IDApewogCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKLQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJfQogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCQlyZXR1cm4gbmV3IFNpbmdsZU5hbWVSZWZlcmVuY2UoQ2hhck9wZXJhdGlvbi5OT19DSEFSLCAwKTsgLy8gZHVtbXkgcmVmZXJlbmNlCkBAIC0xMDU5LDM2ICsxMjAzLDM2IEBACiAJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBjb21wbGV0aW9uIG5vZGUgcG9zaXRpb25zCiAJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLwogCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoY29tcGxldGlvbkluZGV4KTsKLQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0JaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKIAlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCWlkZW50aWZpZXJQdHIgKyAxLCAKLQkJcG9zaXRpb25zLCAKLQkJMCwgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCXBvc2l0aW9ucywKKwkJMCwKIAkJbGVuZ3RoKTsKIAkvKiBidWlsZCBzcGVjaWZpYyBjb21wbGV0aW9uIG9uIG5hbWUgcmVmZXJlbmNlICovCiAJaWYgKGNvbXBsZXRpb25JbmRleCA9PSAwKSB7CiAJCS8qIGNvbXBsZXRpb24gaW5zaWRlIGZpcnN0IGlkZW50aWZpZXIgKi8KLQkJbmFtZVJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlU2luZ2xlQXNzaXN0TmFtZVJlZmVyZW5jZShhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CisJCW5hbWVSZWZlcmVuY2UgPSBjcmVhdGVTaW5nbGVBc3Npc3ROYW1lUmVmZXJlbmNlKGFzc2lzdElkZW50aWZpZXIoKSwgcG9zaXRpb25zWzBdKTsKIAl9IGVsc2UgewogCQkvKiBjb21wbGV0aW9uIGluc2lkZSBzdWJzZXF1ZW50IGlkZW50aWZpZXIgKi8KLQkJbmFtZVJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0TmFtZVJlZmVyZW5jZShzdWJzZXQsIGFzc2lzdElkZW50aWZpZXIoKSwgcG9zaXRpb25zKTsKKwkJbmFtZVJlZmVyZW5jZSA9IGNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2Uoc3Vic2V0LCBhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9ucyk7CiAJfQotCWFzc2lzdE5vZGUgPSBuYW1lUmVmZXJlbmNlOworCXRoaXMuYXNzaXN0Tm9kZSA9IG5hbWVSZWZlcmVuY2U7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG5hbWVSZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKLQlpZiAoIWRpZXQpeworCWlmICghdGhpcy5kaWV0KXsKIAkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKLQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAl9CiAJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAlyZXR1cm4gbmFtZVJlZmVyZW5jZTsKIH0KIC8qCiAgKiBDb3B5IG9mIGNvZGUgZnJvbSBzdXBlcmNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2U6Ci0gKiBJbiB0aGUgY2FzZSBvZiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgaWYgdGhlIGN1cnNvciBsb2NhdGlvbiBpcyBvbiB0aGUgCi0gKiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UsIHRoZW4gY3JlYXRlIGEgQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSAKKyAqIEluIHRoZSBjYXNlIG9mIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSBpZiB0aGUgY3Vyc29yIGxvY2F0aW9uIGlzIG9uIHRoZQorICogcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLCB0aGVuIGNyZWF0ZSBhIENvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UKICAqIGluc3RlYWQuCiAgKi8KIHByb3RlY3RlZCBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkgewpAQCAtMTA5Nyw5ICsxMjQxLDkgQEAKIAlOYW1lUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHN1cGVyLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCk7CiAKIAlpZiAoaW5kZXggPj0gMCl7Ci0JCWlmICghZGlldCl7CisJCWlmICghdGhpcy5kaWV0KXsKIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCi0JCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KIAkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKIAl9CkBAIC0xMTEyLDY1ICsxMjU2LDY1IEBACiAJLy8gJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKIAkvLyB0aGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjawogCi0JY2hhcltdIHNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOwotCWlmIChzZWxlY3RvciAhPSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKSl7CisJY2hhcltdIHNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwlpZiAoc2VsZWN0b3IgIT0gYXNzaXN0SWRlbnRpZmllcigpKXsKIAkJcmV0dXJuIHN1cGVyLm5ld01lc3NhZ2VTZW5kKCk7Ci0JfQkKLQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IG5ldyBTZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kKCk7Ci0JaW50IGxlbmd0aDsKLQlpZiAoKGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7Ci0JCWV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJZXhwcmVzc2lvblN0YWNrLCAKLQkJCWV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKIAl9Ci0JYXNzaXN0Tm9kZSA9IG1lc3NhZ2VTZW5kOwotCWlmICghZGlldCl7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCi0JCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKLQl9Ci0JCi0JdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKLQlyZXR1cm4gbWVzc2FnZVNlbmQ7Ci19Ci1wcm90ZWN0ZWQgTWVzc2FnZVNlbmQgbmV3TWVzc2FnZVNlbmRXaXRoVHlwZUFyZ3VtZW50cygpIHsKLQljaGFyW10gc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07Ci0JaWYgKHNlbGVjdG9yICE9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpKXsKLQkJcmV0dXJuIHN1cGVyLm5ld01lc3NhZ2VTZW5kV2l0aFR5cGVBcmd1bWVudHMoKTsKLQl9CQogCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gbmV3IFNlbGVjdGlvbk9uTWVzc2FnZVNlbmQoKTsKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKwkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9Ci0JYXNzaXN0Tm9kZSA9IG1lc3NhZ2VTZW5kOwotCWlmICghZGlldCl7CisJdGhpcy5hc3Npc3ROb2RlID0gbWVzc2FnZVNlbmQ7CisJaWYgKCF0aGlzLmRpZXQpewogCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCX0KLQkKKworCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJcmV0dXJuIG1lc3NhZ2VTZW5kOworfQorcHJvdGVjdGVkIE1lc3NhZ2VTZW5kIG5ld01lc3NhZ2VTZW5kV2l0aFR5cGVBcmd1bWVudHMoKSB7CisJY2hhcltdIHNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwlpZiAoc2VsZWN0b3IgIT0gYXNzaXN0SWRlbnRpZmllcigpKXsKKwkJcmV0dXJuIHN1cGVyLm5ld01lc3NhZ2VTZW5kV2l0aFR5cGVBcmd1bWVudHMoKTsKKwl9CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSBuZXcgU2VsZWN0aW9uT25NZXNzYWdlU2VuZCgpOworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKwkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKKwl9CisJdGhpcy5hc3Npc3ROb2RlID0gbWVzc2FnZVNlbmQ7CisJaWYgKCF0aGlzLmRpZXQpeworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwl9CisKIAl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCXJldHVybiBtZXNzYWdlU2VuZDsKIH0KIHB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAogCWlmIChlbmQgPT0gLTEpIHJldHVybiBzdXBlci5wYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCwgc3RhcnQsIGVuZCk7Ci0JCisKIAl0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7Ci0JdGhpcy5zZWxlY3Rpb25FbmQgPSBlbmQ7CQorCXRoaXMuc2VsZWN0aW9uRW5kID0gZW5kOwogCVNlbGVjdGlvblNjYW5uZXIgc2VsZWN0aW9uU2Nhbm5lciA9IChTZWxlY3Rpb25TY2FubmVyKXRoaXMuc2Nhbm5lcjsKIAlzZWxlY3Rpb25TY2FubmVyLnNlbGVjdGlvbklkZW50aWZpZXIgPSBudWxsOwogCXNlbGVjdGlvblNjYW5uZXIuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDsKLQlzZWxlY3Rpb25TY2FubmVyLnNlbGVjdGlvbkVuZCA9IGVuZDsJCisJc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25FbmQgPSBlbmQ7CiAJcmV0dXJuIHN1cGVyLnBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0LCAtMSwgLTEvKnBhcnNlIHdpdGhvdXQgcmVzZXRpbmcgdGhlIHNjYW5uZXIqLyk7CiB9CiAvKgpAQCAtMTE4NSwyOSArMTMyOSwyOSBAQAogCS8qIGlmIHJlYWNoZWQgYXNzaXN0IG5vZGUgaW5zaWRlIG1ldGhvZCBib2R5LCBidXQgc3RpbGwgaW5zaWRlIG5lc3RlZCB0eXBlLAogCQlzaG91bGQgY29udGludWUgaW4gZGlldCBtb2RlIHVudGlsIHRoZSBlbmQgb2YgdGhlIG1ldGhvZCBib2R5ICovCiAJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsCi0JCSYmICEocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSl7Ci0JCWN1cnJlbnRFbGVtZW50LnByZXNlcnZlRW5jbG9zaW5nQmxvY2tzKCk7Ci0JCWlmIChjdXJyZW50RWxlbWVudC5lbmNsb3NpbmdUeXBlKCkgPT0gbnVsbCkgewotCQkJaWYoIShjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpKSB7Ci0JCQkJdGhpcy5yZXNldFN0YWNrcygpOworCQkmJiAhKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSl7CisJCXRoaXMuY3VycmVudEVsZW1lbnQucHJlc2VydmVFbmNsb3NpbmdCbG9ja3MoKTsKKwkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nVHlwZSgpID09IG51bGwpIHsKKwkJCWlmKCEodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpKSB7CisJCQkJcmVzZXRTdGFja3MoKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9Ci0JCQkKLQkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKWN1cnJlbnRFbGVtZW50OworCisJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSl0aGlzLmN1cnJlbnRFbGVtZW50OwogCQkJaWYocmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb24gIT0gbnVsbCAmJiByZWNvdmVyZWRUeXBlLnR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uID09IHRoaXMuYXNzaXN0Tm9kZSl7Ci0JCQkJdGhpcy5yZXNldFN0YWNrcygpOworCQkJCXJlc2V0U3RhY2tzKCk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9CiAJfQotCXJldHVybiBzdXBlci5yZXN1bWVBZnRlclJlY292ZXJ5KCk7CQkJCisJcmV0dXJuIHN1cGVyLnJlc3VtZUFmdGVyUmVjb3ZlcnkoKTsKIH0KIAogcHVibGljIHZvaWQgc2VsZWN0aW9uSWRlbnRpZmllckNoZWNrKCl7CiAJaWYgKGNoZWNrUmVjb3ZlcmVkVHlwZSgpKSByZXR1cm47CiB9CiBwdWJsaWMgdm9pZCBzZXRBc3Npc3RJZGVudGlmaWVyKGNoYXJbXSBhc3Npc3RJZGVudCl7Ci0JKChTZWxlY3Rpb25TY2FubmVyKXNjYW5uZXIpLnNlbGVjdGlvbklkZW50aWZpZXIgPSBhc3Npc3RJZGVudDsKKwkoKFNlbGVjdGlvblNjYW5uZXIpdGhpcy5zY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyID0gYXNzaXN0SWRlbnQ7CiB9CiAvKgogICogVXBkYXRlIHJlY292ZXJ5IHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgcGFyc2VyL3NjYW5uZXIgc3RhdGUKQEAgLTEyMTUsMzUgKzEzNTksMzUgQEAKIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlY292ZXJ5U3RhdGUoKSB7CiAKIAkvKiBleHBvc2UgcGFyc2VyIHN0YXRlIHRvIHJlY292ZXJ5IHN0YXRlICovCi0JY3VycmVudEVsZW1lbnQudXBkYXRlRnJvbVBhcnNlclN0YXRlKCk7CisJdGhpcy5jdXJyZW50RWxlbWVudC51cGRhdGVGcm9tUGFyc2VyU3RhdGUoKTsKIAogCS8qIG1heSBiZSBhYmxlIHRvIHJldHJpZXZlIGNvbXBsZXRpb25Ob2RlIGFzIGFuIG9ycGhhbiwgYW5kIHRoZW4gYXR0YWNoIGl0ICovCi0JdGhpcy5zZWxlY3Rpb25JZGVudGlmaWVyQ2hlY2soKTsKLQl0aGlzLmF0dGFjaE9ycGhhbkNvbXBsZXRpb25Ob2RlKCk7Ci0JCisJc2VsZWN0aW9uSWRlbnRpZmllckNoZWNrKCk7CisJYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKTsKKwogCS8vIGlmIGFuIGFzc2lzdCBub2RlIGhhcyBiZWVuIGZvdW5kIGFuZCBhIHJlY292ZXJlZCBlbGVtZW50IGV4aXN0cywKIAkvLyBtYXJrIGVuY2xvc2luZyBibG9ja3MgYXMgdG8gYmUgcHJlc2VydmVkCiAJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQljdXJyZW50RWxlbWVudC5wcmVzZXJ2ZUVuY2xvc2luZ0Jsb2NrcygpOworCQl0aGlzLmN1cnJlbnRFbGVtZW50LnByZXNlcnZlRW5jbG9zaW5nQmxvY2tzKCk7CiAJfQotCQorCiAJLyogY2hlY2sgYW5kIHVwZGF0ZSByZWNvdmVyZWQgc3RhdGUgYmFzZWQgb24gY3VycmVudCB0b2tlbiwKIAkJdGhpcyBhY3Rpb24gaXMgYWxzbyBwZXJmb3JtZWQgd2hlbiBzaGlmdGluZyB0b2tlbiBhZnRlciByZWNvdmVyeQotCQlnb3QgYWN0aXZhdGVkIG9uY2UuIAorCQlnb3QgYWN0aXZhdGVkIG9uY2UuCiAJKi8KLQl0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCXJlY292ZXJ5VG9rZW5DaGVjaygpOwogfQogCiBwdWJsaWMgIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgcyA9IFV0aWwuRU1QVFlfU1RSSU5HOwogCXMgPSBzICsgImVsZW1lbnRLaW5kU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7Ci0JCXMgPSBzICsgU3RyaW5nLnZhbHVlT2YoZWxlbWVudEtpbmRTdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmVsZW1lbnRQdHI7IGkrKykgeworCQlzID0gcyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZWxlbWVudEtpbmRTdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQKIAl9CiAJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAogCXMgPSBzICsgImVsZW1lbnRJbmZvU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCi0JZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7Ci0JCXMgPSBzICsgU3RyaW5nLnZhbHVlT2YoZWxlbWVudEluZm9TdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmVsZW1lbnRQdHI7IGkrKykgeworCQlzID0gcyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZWxlbWVudEluZm9TdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQKIAl9CiAJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBzICsgc3VwZXIudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblNjYW5uZXIuamF2YQppbmRleCAxZTM4NmVmLi4wZTgxY2QwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25TY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDI4ICsyMiwyOCBAQAogCiAJcHVibGljIGNoYXJbXSBzZWxlY3Rpb25JZGVudGlmaWVyOwogCXB1YmxpYyBpbnQgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZDsKLS8qIAorLyoKICAqIFRydW5jYXRlIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgaWYgaXQgaXMgY29udGFpbmluZyB0aGUgY3Vyc29yIGxvY2F0aW9uLiBTaW5jZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAogICogb24gYW4gaWRlbnRpZmllciBwcmVmaXguCiAgKgogICovCi0gCisKIHB1YmxpYyBTZWxlY3Rpb25TY2FubmVyKGxvbmcgc291cmNlTGV2ZWwpIHsKIAlzdXBlcihmYWxzZSAvKmNvbW1lbnQqLywgZmFsc2UgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIHNvdXJjZUxldmVsLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiB9CiAKIHB1YmxpYyBjaGFyW10gZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSB7CiAKLQlpZiAoc2VsZWN0aW9uSWRlbnRpZmllciA9PSBudWxsKXsKLQkJaWYgKHNlbGVjdGlvblN0YXJ0ID09IHN0YXJ0UG9zaXRpb24gJiYgc2VsZWN0aW9uRW5kID09IGN1cnJlbnRQb3NpdGlvbi0xKXsKLQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKXsJCQkvLyBjaGVjayB1bmljb2RlIHNjZW5hcmlvCi0JCQkJU3lzdGVtLmFycmF5Y29weSh3aXRob3V0VW5pY29kZUJ1ZmZlciwgMSwgc2VsZWN0aW9uSWRlbnRpZmllciA9IG5ldyBjaGFyW3dpdGhvdXRVbmljb2RlUHRyXSwgMCwgd2l0aG91dFVuaWNvZGVQdHIpOworCWlmICh0aGlzLnNlbGVjdGlvbklkZW50aWZpZXIgPT0gbnVsbCl7CisJCWlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ID09IHRoaXMuc3RhcnRQb3NpdGlvbiAmJiB0aGlzLnNlbGVjdGlvbkVuZCA9PSB0aGlzLmN1cnJlbnRQb3NpdGlvbi0xKXsKKwkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApewkJCS8vIGNoZWNrIHVuaWNvZGUgc2NlbmFyaW8KKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsIDEsIHRoaXMuc2VsZWN0aW9uSWRlbnRpZmllciA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLCAwLCB0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsKIAkJCX0gZWxzZSB7Ci0JCQkJaW50IGxlbmd0aCA9IGN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb247Ci0JCQkJLy8gbm8gY2hhcltdIHNoYXJpbmcgYXJvdW5kIGNvbXBsZXRpb25JZGVudGlmaWVyLCB3ZSB3YW50IGl0IHRvIGJlIHVuaXF1ZSBzbyBhcyB0byB1c2UgaWRlbnRpdHkgY2hlY2tzCQotCQkJCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzdGFydFBvc2l0aW9uLCAoc2VsZWN0aW9uSWRlbnRpZmllciA9IG5ldyBjaGFyW2xlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCWludCBsZW5ndGggPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbjsKKwkJCQkvLyBubyBjaGFyW10gc2hhcmluZyBhcm91bmQgY29tcGxldGlvbklkZW50aWZpZXIsIHdlIHdhbnQgaXQgdG8gYmUgdW5pcXVlIHNvIGFzIHRvIHVzZSBpZGVudGl0eSBjaGVja3MKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLnN0YXJ0UG9zaXRpb24sICh0aGlzLnNlbGVjdGlvbklkZW50aWZpZXIgPSBuZXcgY2hhcltsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCX0KLQkJCXJldHVybiBzZWxlY3Rpb25JZGVudGlmaWVyOworCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uSWRlbnRpZmllcjsKIAkJfQogCX0KIAlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKQEAgLTU4LDggKzU4LDggQEAKIAogCS8vIGNvbnZlcnQgY29tcGxldGVkIGtleXdvcmQgaW50byBhbiBpZGVudGlmaWVyCiAJaWYgKGlkICE9IFRva2VuTmFtZUlkZW50aWZpZXIKLQkJJiYgc3RhcnRQb3NpdGlvbiA9PSBzZWxlY3Rpb25TdGFydCAKLQkJJiYgY3VycmVudFBvc2l0aW9uID09IHNlbGVjdGlvbkVuZCsxKXsKKwkJJiYgdGhpcy5zdGFydFBvc2l0aW9uID09IHRoaXMuc2VsZWN0aW9uU3RhcnQKKwkJJiYgdGhpcy5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zZWxlY3Rpb25FbmQrMSl7CiAJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwogCX0KIAlyZXR1cm4gaWQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9DYXRlZ29yaXplZFByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NhdGVnb3JpemVkUHJvYmxlbS5qYXZhCmluZGV4IDExMmEzZDguLjNmZTE0ZWMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NhdGVnb3JpemVkUHJvYmxlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NhdGVnb3JpemVkUHJvYmxlbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDUyICsxNCw1MyBAQAogCiAvKioKICAqIFJpY2hlciBkZXNjcmlwdGlvbiBvZiBhIEphdmEgcHJvYmxlbSwgYXMgZGV0ZWN0ZWQgYnkgdGhlIGNvbXBpbGVyIG9yIHNvbWUgb2YgdGhlIHVuZGVybHlpbmcKLSAqIHRlY2hub2xvZ3kgcmV1c2luZyB0aGUgY29tcGlsZXIuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiA8Y29kZT5Db21waWxhdGlvblBhcnRpY2lwYW50PC9jb2RlPiwKLSAqIHRoZSBzaW1wbGVyIHByb2JsZW0gaW50ZXJmYWNlIDxjb2RlPklQcm9ibGVtPC9jb2RlPiBkaWQgbm90IGNhcnJ5IGVub3VnaCBpbmZvcm1hdGlvbiB0byBiZXR0ZXIKKyAqIHRlY2hub2xvZ3kgcmV1c2luZyB0aGUgY29tcGlsZXIuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5Db21waWxhdGlvblBhcnRpY2lwYW50PC9jb2RlPiwKKyAqIHRoZSBzaW1wbGVyIHByb2JsZW0gaW50ZXJmYWNlIHtAbGluayBJUHJvYmxlbX0gZGlkIG5vdCBjYXJyeSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYmV0dGVyCiAgKiBzZXBhcmF0ZSBhbmQgY2F0ZWdvcml6ZSBKYXZhIHByb2JsZW1zLiBJbiBvcmRlciB0byBtaW5pbWl6ZSBpbXBhY3Qgb24gZXhpc3RpbmcgQVBJLCBKYXZhIHByb2JsZW1zCi0gKiBhcmUgc3RpbGwgcGFzc2VkIGFyb3VuZCBhcyA8Y29kZT5JUHJvYmxlbTwvY29kZT4sIHRob3VnaCBhY3R1YWwgaW1wbGVtZW50YXRpb25zIHNob3VsZCBleHBsaWNpdGx5Ci0gKiBleHRlbmQgPGNvZGU+Q2F0ZWdvcml6ZWRQcm9ibGVtPC9jb2RlPi4gUGFydGljaXBhbnRzIGNhbiBwcm9kdWNlIHRoZWlyIG93biBwcm9ibGVtIGRlZmluaXRpb25zLAorICogYXJlIHN0aWxsIHBhc3NlZCBhcm91bmQgYXMge0BsaW5rIElQcm9ibGVtfSwgdGhvdWdoIGFjdHVhbCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGV4cGxpY2l0bHkKKyAqIGV4dGVuZCB7QGxpbmsgQ2F0ZWdvcml6ZWRQcm9ibGVtfS4gUGFydGljaXBhbnRzIGNhbiBwcm9kdWNlIHRoZWlyIG93biBwcm9ibGVtIGRlZmluaXRpb25zLAogICogYW5kIGdpdmVuIHRoZXNlIGFyZSBjYXRlZ29yaXplZCBwcm9ibGVtcywgdGhleSBjYW4gYmUgYmV0dGVyIGhhbmRsZWQgYnkgY2xpZW50cyAoc3VjaCBhcyB1c2VyCiAgKiBpbnRlcmZhY2UpLgotICogCisgKiA8cD4KICAqIEEgY2F0ZWdvcml6ZWQgcHJvYmxlbSBwcm92aWRlcyBhY2Nlc3MgdG86CiAgKiA8dWw+CiAgKiA8bGk+IGl0cyBsb2NhdGlvbiAob3JpZ2luYXRpbmcgc291cmNlIGZpbGUgbmFtZSwgc291cmNlIHBvc2l0aW9uLCBsaW5lIG51bWJlciksIDwvbGk+CiAgKiA8bGk+IGl0cyBtZXNzYWdlIGRlc2NyaXB0aW9uIGFuZCBhIHByZWRpY2F0ZSB0byBjaGVjayBpdHMgc2V2ZXJpdHkgKHdhcm5pbmcgb3IgZXJyb3IpLiA8L2xpPgotICogPGxpPiBpdHMgSUQgOiBhIG51bWJlciBpZGVudGlmeWluZyB0aGUgdmVyeSBuYXR1cmUgb2YgdGhpcyBwcm9ibGVtLiBBbGwgcG9zc2libGUgSURzIGZvciBzdGFuZGFyZCBKYXZhIAotICogcHJvYmxlbXMgYXJlIGxpc3RlZCBhcyBjb25zdGFudHMgb24gPGNvZGU+SVByb2JsZW08L2NvZGU+LCA8L2xpPgorICogPGxpPiBpdHMgSUQgOiBhIG51bWJlciBpZGVudGlmeWluZyB0aGUgdmVyeSBuYXR1cmUgb2YgdGhpcyBwcm9ibGVtLiBBbGwgcG9zc2libGUgSURzIGZvciBzdGFuZGFyZCBKYXZhCisgKiBwcm9ibGVtcyBhcmUgbGlzdGVkIGFzIGNvbnN0YW50cyBvbiB7QGxpbmsgSVByb2JsZW19LCA8L2xpPgogICogPGxpPiBpdHMgbWFya2VyIHR5cGUgOiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcHJvYmxlbSBjcmVhdG9yLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgbWFya2VyIHR5cGUKICAqIGNob3NlbiBpZiB0aGlzIHByb2JsZW0gd2FzIHRvIGJlIHBlcnNpc3RlZC4gU3RhbmRhcmQgSmF2YSBwcm9ibGVtcyBhcmUgYXNzb2NpYXRlZCB0byBtYXJrZXIKICAqIHR5cGUgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLnByb2JsZW0iKSwgPC9saT4KLSAqIDxsaT4gaXRzIGNhdGVnb3J5IElEIDogYSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIGNhdGVnb3J5IHRoaXMgcHJvYmxlbSBiZWxvbmdzIHRvLiBBbGwgcG9zc2libGUgSURzIGZvciAKKyAqIDxsaT4gaXRzIGNhdGVnb3J5IElEIDogYSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIGNhdGVnb3J5IHRoaXMgcHJvYmxlbSBiZWxvbmdzIHRvLiBBbGwgcG9zc2libGUgSURzIGZvcgogICogc3RhbmRhcmQgSmF2YSBwcm9ibGVtIGNhdGVnb3JpZXMgYXJlIGxpc3RlZCBpbiB0aGlzIGNsYXNzLiA8L2xpPgogICogPC91bD4KLSAqIAorICogPHA+CiAgKiBOb3RlOiB0aGUgY29tcGlsZXIgcHJvZHVjZXMgSVByb2JsZW1zIGludGVybmFsbHksIHdoaWNoIGFyZSB0dXJuZWQgaW50byBtYXJrZXJzIGJ5IHRoZSBKYXZhQnVpbGRlcgogICogc28gYXMgdG8gcGVyc2lzdCBwcm9ibGVtIGRlc2NyaXB0aW9ucy4gVGhpcyBleHBsYWlucyB3aHkgdGhlcmUgaXMgbm8gQVBJIGFsbG93aW5nIHRvIHJlYWNoIElQcm9ibGVtIGRldGVjdGVkCiAgKiB3aGVuIGNvbXBpbGluZy4gSG93ZXZlciwgdGhlIEphdmEgcHJvYmxlbSBtYXJrZXJzIGNhcnJ5IGVxdWl2YWxlbnQgaW5mb3JtYXRpb24gdG8gSVByb2JsZW0sIGluIHBhcnRpY3VsYXIKICAqIHRoZWlyIElEIChhdHRyaWJ1dGUgImlkIikgaXMgc2V0IHRvIG9uZSBvZiB0aGUgSURzIGRlZmluZWQgb24gdGhpcyBpbnRlcmZhY2UuCi0gKiAKKyAqIDxwPgogICogTm90ZTogU3RhbmRhcmQgSmF2YSBwcm9ibGVtcyBwcm9kdWNlZCBieSBKYXZhIGRlZmF1bHQgdG9vbGluZyB3aWxsIGJlIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcy4gVGVjaG5pY2FsbHksIG1vc3QKLSAqIEFQSSBtZXRob2RzIGRlYWxpbmcgd2l0aCBwcm9ibGVtcyBhcmUgcmVmZXJyaW5nIHRvIDxjb2RlPklQcm9ibGVtPC9jb2RlPiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb24uCi0gKiBJdCBpcyBpbnRlbmRlZCB0aGF0IDxjb2RlPkNhdGVnb3JpemVkUHJvYmxlbTwvY29kZT4gd2lsbCBiZSBzdWJjbGFzc2VkIGZvciBjdXN0b20gcHJvYmxlbSBpbXBsZW1lbnRhdGlvbiB3aGVuCisgKiBBUEkgbWV0aG9kcyBkZWFsaW5nIHdpdGggcHJvYmxlbXMgYXJlIHJlZmVycmluZyB0byB7QGxpbmsgSVByb2JsZW19IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbi4KKyAqIEl0IGlzIGludGVuZGVkIHRoYXQge0BsaW5rIENhdGVnb3JpemVkUHJvYmxlbX0gd2lsbCBiZSBzdWJjbGFzc2VkIGZvciBjdXN0b20gcHJvYmxlbSBpbXBsZW1lbnRhdGlvbiB3aGVuCiAgKiBwYXJ0aWNpcGF0aW5nIGluIGNvbXBpbGF0aW9uIG9wZXJhdGlvbnMsIHNvIGFzIHRvIGFsbG93IHBhcnRpY2lwYW50IHRvIGNvbnRyaWJ1dGUgdGhlaXIgb3duIG1hcmtlciB0eXBlcywgYW5kIHRodXMKICAqIGRlZmluaW5nIHRoZWlyIG93biBkb21haW4gc3BlY2lmaWMgcHJvYmxlbS9jYXRlZ29yeSBJRHMuCi0gKiAKLSAqIE5vdGU6IHN0YW5kYXJkIEphdmEgcHJvYmxlbXMgcHJvZHVjZWQgYnkgSmF2YSBkZWZhdWx0IHRvb2xpbmcgd2lsbCBzZXQgdGhlCi0gKiBtYXJrZXIgSU1hcmtlciNHRU5FUkFURURfQlkgYXR0cmlidXRlIHRvIEphdmFCdWlsZGVyI0dFTkVSQVRFRF9CWTsgY29tcGlsZXIKLSAqIHBhcnRpY2lwYW50cyBtYXkgc3BlY2lmeSB0aGUgSU1hcmtlciNHRU5FUkFURURfQlkgYXR0cmlidXRlIG9mIHRoZWlyIG1hcmtlcnMgCi0gKiBieSBhZGRpbmcgaXQgdG8gdGhlIGV4dHJhIG1hcmtlciBhdHRyaWJ1dGVzIG9mIHRoZSBwcm9ibGVtcyB0aGV5IGdlbmVyYXRlOyAKKyAqIDxwPgorICogTm90ZTogc3RhbmRhcmQgSmF2YSBwcm9ibGVtcyBwcm9kdWNlZCBieSBKYXZhIGRlZmF1bHQgdG9vbGluZyB3aWxsIHNldCB0aGUgbWFya2VyCisgKiA8Y29kZT4gSU1hcmtlciNTT1VSQ0VfSUQ8L2NvZGU+IGF0dHJpYnV0ZSB0bworICogPGNvZGU+IEphdmFCdWlsZGVyI1NPVVJDRV9JRDwvY29kZT47IGNvbXBpbGVyCisgKiBwYXJ0aWNpcGFudHMgbWF5IHNwZWNpZnkgdGhlIDxjb2RlPiBJTWFya2VyI1NPVVJDRV9JRDwvY29kZT4KKyAqIGF0dHJpYnV0ZSBvZiB0aGVpciBtYXJrZXJzIGJ5IGFkZGluZyBpdCB0byB0aGUgZXh0cmEgbWFya2VyIGF0dHJpYnV0ZXMgb2YgdGhlIHByb2JsZW1zIHRoZXkgZ2VuZXJhdGU7CiAgKiBtYXJrZXJzIHJlc3VsdGluZyBmcm9tIGNvbXBpbGVyIHBhcnRpY2lwYW50cycgcHJvYmxlbXMgdGhhdCBkbyBub3QgaGF2ZSB0aGUKLSAqIElNYXJrZXIjR0VORVJBVEVEX0JZIGV4dHJhIGF0dHJpYnV0ZSBzZXQgZG8gbm90IGhhdmUgdGhlIElNYXJrZXIjR0VORVJBVEVEX0JZCi0gKiBhdHRyaWJ1dGUgc2V0IGVpdGhlci4KLSAqIAorICogPGNvZGU+IElNYXJrZXIjU09VUkNFX0lEPC9jb2RlPiBleHRyYSBhdHRyaWJ1dGUgc2V0IGRvIG5vdCBoYXZlIHRoZQorICogPGNvZGU+IEphdmFCdWlsZGVyI1NPVVJDRV9JRDwvY29kZT4gYXR0cmlidXRlIHNldCBlaXRoZXIuCisgKgogICogQHNpbmNlIDMuMgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0ZWdvcml6ZWRQcm9ibGVtIGltcGxlbWVudHMgSVByb2JsZW0gewotCQorCiAJLyoqCi0JICogTGlzdCBvZiBzdGFuZGFyZCBjYXRlZ29yeSBJRHMgdXNlZCBieSBKYXZhIHByb2JsZW1zLCBtb3JlIGNhdGVnb3JpZXMgd2lsbCBiZSBhZGRlZCAKKwkgKiBMaXN0IG9mIHN0YW5kYXJkIGNhdGVnb3J5IElEcyB1c2VkIGJ5IEphdmEgcHJvYmxlbXMsIG1vcmUgY2F0ZWdvcmllcyB3aWxsIGJlIGFkZGVkCiAJICogaW4gdGhlIGZ1dHVyZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRfVU5TUEVDSUZJRUQgPSAwOwpAQCAtNzQsNyArNzUsNyBAQAogCS8qKiBDYXRlZ29yeSBmb3IgZmF0YWwgcHJvYmxlbXMgcmVsYXRlZCB0byB0eXBlIG1lbWJlcnMsIGNvdWxkIGJlIGFkZHJlc3NlZCBieSBzb21lIGZpZWxkIG9yIG1ldGhvZCBjaGFuZ2UgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRfTUVNQkVSID0gNTA7CiAJLyoqIENhdGVnb3J5IGZvciBmYXRhbCBwcm9ibGVtcyB3aGljaCBjb3VsZCBub3QgYmUgYWRkcmVzc2VkIGJ5IGV4dGVybmFsIGNoYW5nZXMsIGJ1dCByZXF1aXJlIGFuIGVkaXQgdG8gYmUgYWRkcmVzc2VkICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FUX0lOVEVSTkFMID0gNjA7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVF9JTlRFUk5BTCA9IDYwOwogCS8qKiBDYXRlZ29yeSBmb3Igb3B0aW9uYWwgcHJvYmxlbXMgaW4gSmF2YWRvYyAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVF9KQVZBRE9DID0gNzA7CiAJLyoqIENhdGVnb3J5IGZvciBvcHRpb25hbCBwcm9ibGVtcyByZWxhdGVkIHRvIGNvZGluZyBzdHlsZSBwcmFjdGljZXMgKi8KQEAgLTkyLDExICs5MywxMSBAQAogCS8qKiBDYXRlZ29yeSBmb3Igb3B0aW9uYWwgcHJvYmxlbXMgcmVsYXRlZCB0byBpbnRlcm5hdGlvbmFsaXphdGlvbiBvZiBTdHJpbmcgbGl0ZXJhbHMgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRfTkxTID0gMTQwOwogCS8qKiBDYXRlZ29yeSBmb3Igb3B0aW9uYWwgcHJvYmxlbXMgcmVsYXRlZCB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FUX1JFU1RSSUNUSU9OID0gMTUwOwkKLQkKLS8qKiAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRfUkVTVFJJQ1RJT04gPSAxNTA7CisKKy8qKgogICogUmV0dXJucyBhbiBpbnRlZ2VyIGlkZW50aWZ5aW5nIHRoZSBjYXRlZ29yeSBvZiB0aGlzIHByb2JsZW0uIENhdGVnb3JpZXMsIGxpa2UgcHJvYmxlbSBJRHMgYXJlCi0gKiBkZWZpbmVkIGluIHRoZSBjb250ZXh0IG9mIHNvbWUgbWFya2VyIHR5cGUuIEN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YgPGNvZGU+Q2F0ZWdvcml6ZWRQcm9ibGVtPC9jb2RlPgorICogZGVmaW5lZCBpbiB0aGUgY29udGV4dCBvZiBzb21lIG1hcmtlciB0eXBlLiBDdXN0b20gaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBDYXRlZ29yaXplZFByb2JsZW19CiAgKiBtYXkgY2hvb3NlIGFyYml0cmFyeSB2YWx1ZXMgZm9yIHByb2JsZW0vY2F0ZWdvcnkgSURzLCBhcyBsb25nIGFzIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudAogICogbWFya2VyIHR5cGUuCiAgKiBTdGFuZGFyZCBKYXZhIHByb2JsZW0gbWFya2VycyAoaS5lLiBtYXJrZXIgdHlwZSBpcyAib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSIpIGNhcnJ5IGFuCkBAIC0xMTQsMTIgKzExNSwxMiBAQAogcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNYXJrZXJUeXBlKCk7CiAKIC8qKgotICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGV4dHJhIG1hcmtlciBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgdG8gdGhpcyBwcm9ibGVtIHdoZW4gcGVyc2lzdGVkIGludG8gYSBtYXJrZXIgCisgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZXh0cmEgbWFya2VyIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB0byB0aGlzIHByb2JsZW0gd2hlbiBwZXJzaXN0ZWQgaW50byBhIG1hcmtlcgogICogYnkgdGhlIEphdmFCdWlsZGVyLiBFeHRyYSBhdHRyaWJ1dGVzIGFyZSBvbmx5IG9wdGlvbmFsLCBhbmQgYXJlIGFsbG93aW5nIGNsaWVudCBjdXN0b21pemF0aW9uIG9mIGdlbmVyYXRlZAogICogbWFya2Vycy4gQnkgZGVmYXVsdCwgbm8gRVhUUkEgYXR0cmlidXRlcyBpcyBwZXJzaXN0ZWQsIGFuZCBhIGNhdGVnb3JpemVkIHByb2JsZW0gb25seSBwZXJzaXN0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAgKiA8dWw+CiAgKiA8bGk+CTxjb2RlPklNYXJrZXIjTUVTU0FHRTwvY29kZT4gLSZndDsge0BsaW5rIElQcm9ibGVtI2dldE1lc3NhZ2UoKX08L2xpPgotICogPGxpPgk8Y29kZT5JTWFya2VyI1NFVkVSSVRZPC9jb2RlPiAtJmd0OyA8Y29kZT4gSU1hcmtlciNTRVZFUklUWV9FUlJPUjwvY29kZT4gb3IgCisgKiA8bGk+CTxjb2RlPklNYXJrZXIjU0VWRVJJVFk8L2NvZGU+IC0mZ3Q7IDxjb2RlPiBJTWFya2VyI1NFVkVSSVRZX0VSUk9SPC9jb2RlPiBvcgogICogICAgICAgICA8Y29kZT5JTWFya2VyI1NFVkVSSVRZX1dBUk5JTkc8L2NvZGU+IGRlcGVuZGluZyBvbiB7QGxpbmsgSVByb2JsZW0jaXNFcnJvcigpfSBvciB7QGxpbmsgSVByb2JsZW0jaXNXYXJuaW5nKCl9PC9saT4KICAqIDxsaT4JPGNvZGU+SUphdmFNb2RlbE1hcmtlciNJRDwvY29kZT4gLSZndDsge0BsaW5rIElQcm9ibGVtI2dldElEKCl9PC9saT4KICAqIDxsaT4JPGNvZGU+SU1hcmtlciNDSEFSX1NUQVJUPC9jb2RlPiAgLSZndDsge0BsaW5rIElQcm9ibGVtI2dldFNvdXJjZVN0YXJ0KCl9PC9saT4KQEAgLTEyOCw3ICsxMjksNyBAQAogICogPGxpPgk8Y29kZT5JSmF2YU1vZGVsTWFya2VyI0FSR1VNRU5UUzwvY29kZT4gIC0mZ3Q7IHNvbWUgPGNvZGU+U3RyaW5nW108L2NvZGU+IHVzZWQgdG8gY29tcHV0ZSBxdWlja2ZpeGVzIDwvbGk+CiAgKiA8bGk+CTxjb2RlPklKYXZhTW9kZWxNYXJrZXIjQ0FURUdPUllfSUQ8L2NvZGU+IC0mZ3Q7IHtAbGluayBDYXRlZ29yaXplZFByb2JsZW0jZ2V0Q2F0ZWdvcnlJRCgpfTwvbGk+CiAgKiA8L3VsPgotICogVGhlIG5hbWVzIG11c3QgYmUgZWxpZ2libGUgZm9yIG1hcmtlciBjcmVhdGlvbiwgYXMgZGVmaW5lZCBieSA8Y29kZT5JTWFya2VyI3NldEF0dHJpYnV0ZXMoU3RyaW5nW10sIE9iamVjdFtdKTwvY29kZT4sIAorICogVGhlIG5hbWVzIG11c3QgYmUgZWxpZ2libGUgZm9yIG1hcmtlciBjcmVhdGlvbiwgYXMgZGVmaW5lZCBieSA8Y29kZT5JTWFya2VyI3NldEF0dHJpYnV0ZXMoU3RyaW5nW10sIE9iamVjdFtdKTwvY29kZT4sCiAgKiBhbmQgdGhlcmUgbXVzdCBiZSBhcyBtYW55IG5hbWVzIGFzIHZhbHVlcyBhY2NvcmRpbmcgdG8ge0BsaW5rICNnZXRFeHRyYU1hcmtlckF0dHJpYnV0ZVZhbHVlcygpfS4KICAqIE5vdGUgdGhhdCBleHRyYSBtYXJrZXIgYXR0cmlidXRlcyB3aWxsIGJlIGluc2VydGVkIGFmdGVyIGRlZmF1bHQgb25lcyAoYXMgZGVzY3JpYmVkIGluIHtAbGluayBDYXRlZ29yaXplZFByb2JsZW0jZ2V0TWFya2VyVHlwZSgpfSwKICAqIGFuZCB0aHVzIGNvdWxkIGJlIHVzZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdHMuCkBAIC0xMzksMTAgKzE0MCwxMCBAQAogfQogCiAvKioKLSAqIFJldHVybnMgdGhlIHJlc3BlY3RpdmUgdmFsdWVzIGZvciB0aGUgZXh0cmEgbWFya2VyIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB0byB0aGlzIHByb2JsZW0gd2hlbiBwZXJzaXN0ZWQgaW50byAKKyAqIFJldHVybnMgdGhlIHJlc3BlY3RpdmUgdmFsdWVzIGZvciB0aGUgZXh0cmEgbWFya2VyIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB0byB0aGlzIHByb2JsZW0gd2hlbiBwZXJzaXN0ZWQgaW50bwogICogYSBtYXJrZXIgYnkgdGhlIEphdmFCdWlsZGVyLiBFYWNoIHZhbHVlIG11c3QgY29ycmVzcG9uZCB0byBhIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lLCBhcyBkZWZpbmVkIGJ5Ci0gKiB7QGxpbmsgI2dldEV4dHJhTWFya2VyQXR0cmlidXRlTmFtZXMoKX0uIAotICogVGhlIHZhbHVlcyBtdXN0IGJlIGVsaWdpYmxlIGZvciBtYXJrZXIgY3JlYXRpb24sIGFzIGRlZmluZWQgYnkgPGNvZGU+SU1hcmtlciNzZXRBdHRyaWJ1dGVzKFN0cmluZ1tdLCBPYmplY3RbXSk8L2NvZGU+LgorICoge0BsaW5rICNnZXRFeHRyYU1hcmtlckF0dHJpYnV0ZU5hbWVzKCl9LgorICogVGhlIHZhbHVlcyBtdXN0IGJlIGVsaWdpYmxlIGZvciBtYXJrZXIgY3JlYXRpb24sIGFzIGRlZmluZWQgYnkgPGNvZGU+IElNYXJrZXIjc2V0QXR0cmlidXRlcyhTdHJpbmdbXSwgT2JqZWN0W10pfS4KICAqIEByZXR1cm4gdGhlIHZhbHVlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBleHRyYSBtYXJrZXIgYXR0cmlidXRlcwogICovCiBwdWJsaWMgT2JqZWN0W10gZ2V0RXh0cmFNYXJrZXJBdHRyaWJ1dGVWYWx1ZXMoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9DaGFyT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9DaGFyT3BlcmF0aW9uLmphdmEKaW5kZXggZWJiODFlZC4uNmE4YjRkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvQ2hhck9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NoYXJPcGVyYXRpb24uamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgTHVpei1PdGF2aW8gWm9yemVsbGEgPHpvcnplbGxhIGF0IGdtYWlsIGRvdCBjb20+IC0gSW1wcm92ZSBDYW1lbENhc2UgYWxnb3JpdGhtCkBAIC0xNSwxMSArMTUsOSBAQAogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgYSBjb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIG1hbmlwdWxhdGUgY2hhciBhcnJheXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENoYXJPcGVyYXRpb24gewogCkBAIC0zMiwxMyArMzAsMTMgQEAKIAkgKiBDb25zdGFudCBmb3IgYW4gZW1wdHkgY2hhciBhcnJheSB3aXRoIHR3byBkaW1lbnNpb25zLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gTk9fQ0hBUl9DSEFSID0gbmV3IGNoYXJbMF1bXTsKLQkKKwogCS8qKgogCSAqIENvbnN0YW50IGZvciBhbiBlbXB0eSBTdHJpbmcgYXJyYXkuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fU1RSSU5HUyA9IG5ldyBTdHJpbmdbMF07Ci0JCisKIC8qKgogICogQW5zd2VycyBhIG5ldyBhcnJheSB3aXRoIGFwcGVuZGluZyB0aGUgc3VmZml4IGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KICAqIDxicj4KQEAgLTU3LDggKzU1LDggQEAKICAqICAgID0+IHJlc3VsdCA9IHsgJ2MnIH0KICAqIDwvcHJlPjwvbGk+CiAgKiA8L29sPgotICogCi0gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRoYXQgaXMgY29uY2FuYXRlZCB3aXRoIHRoZSBzdWZmaXggY2hhcmFjdGVyCisgKgorICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0aGF0IGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBzdWZmaXggY2hhcmFjdGVyCiAgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggY2hhcmFjdGVyCiAgKiBAcmV0dXJuIHRoZSBuZXcgYXJyYXkKICAqLwpAQCAtNzIsOCArNzAsOCBAQAogfQogCiAvKioKLSAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3ViYXJyYXkgdG8gdGhlIHRhcmdldCBhcnJheSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHRhcmdldCBhcnJheS4KLSAqIFRoZSBzdGFydCBvZiB0aGUgc3ViYXJyYXkgaXMgaW5jbHVzaXZlLCB0aGUgZW5kIGlzIGV4Y2x1c2l2ZS4KKyAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3ViLWFycmF5IHRvIHRoZSB0YXJnZXQgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSB0YXJnZXQgYXJyYXkuCisgKiBUaGUgc3RhcnQgb2YgdGhlIHN1Yi1hcnJheSBpcyBpbmNsdXNpdmUsIHRoZSBlbmQgaXMgZXhjbHVzaXZlLgogICogQW5zd2VycyBhIG5ldyB0YXJnZXQgYXJyYXkgaWYgaXQgbmVlZHMgdG8gZ3Jvdywgb3RoZXJ3aXNlIGFuc3dlcnMgdGhlIHNhbWUgdGFyZ2V0IGFycmF5LgogICogPGJyPgogICogRm9yIGV4YW1wbGU6PGJyPgpAQCAtMTA0LDEzICsxMDIsMTMgQEAKICAqICAgID0+IHJlc3VsdCA9IHsgJ2EnLCAnZCcgLCAnZScsICdmJywgJzAnLCAnMCcsICcwJywgJzAnIH0gKG5ldyBhcnJheSkKICAqIDwvcHJlPjwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIHRhcmdldCB0aGUgZ2l2ZW4gdGFyZ2V0CiAgKiBAcGFyYW0gaW5kZXggdGhlIGdpdmVuIGluZGV4CiAgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAgKiBAcGFyYW0gc3RhcnQgdGhlIGdpdmVuIHN0YXJ0IGluZGV4CiAgKiBAcGFyYW0gZW5kIHRoZSBnaXZlbiBlbmQgaW5kZXgKLSAqIAorICoKICAqIEByZXR1cm4gdGhlIG5ldyBhcnJheQogICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGFycmF5IGlzIG51bGwKICAqLwpAQCAtMTU4LDcgKzE1Niw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheSB0byBjb25jYXRlbmF0ZQogICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIGFycmF5IHRvIGNvbmNhdGVuYXRlCiAgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzLCBvciBudWxsIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBudWxsLgpAQCAtMTc4LDU0ICsxNzYsNjAgQEAKIH0KIAogLyoqCi0gKiBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSB1c2luZyBDYW1lbENhc2UgcnVsZXMsIG9yIGZhbHNlIG90aGVyd2lzZS4gCi0gKiBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzICcqJyBhbmQgJz8nIGFuZCBpcyBpbmhlcmVudGx5IGNhc2Ugc2Vuc2l0aXZlLgotICogPGJyPgotICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywgYW5kIGNhcGl0YWxpemluZyBldmVyeSB0ZXJtLgotICogVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyIENhbWVsQ2FzZSwgZGVwZW5kaW5nIHdoZXRoZXIgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGlzIGNhcGl0YWxpemVkCi0gKiBvciBub3QuIFRoZSBsZWFkaW5nIHBhcnQgb2YgYW4gdXBwZXIgQ2FtZWxDYXNlIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBjb250YWluIGEgc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZwotICogaW4gdGhlIG1hdGNoaW5nIG5hbWU7IGUuZy4gJ05QRScgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4KLSAqIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QgY2hhcmFjdGVyLiBJbiBKYXZhLCB0eXBlIG5hbWVzIGZvbGxvdyB0aGUgdXBwZXIgQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkCi0gKiBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyIENhbWVsQ2FzZSBjb252ZW50aW9uLgotICogPGJyPgotICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgbWF0Y2ggaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkuIFRoZXNlIGNoYXJhY3RlcnMgbXVzdAotICogYXBwZWFyIGluIHNlcXVlbmNlIGluIHRoZSBuYW1lLiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ051bGxQb2ludGVyRXhDRVBUSU9OJwotICogb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOb1BvaW50ZXJFeGNlcHRpb24nLgotICogPGJyPjxicj4KLSAqIEV4YW1wbGVzOgotICogPG9sPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0geyAnTicsICdQJywgJ0UnIH0KLSAqICAgIG5hbWUgPSB7ICdOJywgJ3UnLCdsJywgJ2wnLCAnUCcsICdvJywgJ2knLCAnbicsICd0JywgJ2UnLCAncicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQotICogICAgcmVzdWx0ID0+IHRydWUKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9IHsgJ04nLCAnUCcsICdFJyB9Ci0gKiAgICBuYW1lID0geyAnTicsICdvJywgJ1AnLCAnZScsICdyJywgJ20nLCAnaScsICdzJywgJ3MnLCAnaScsICdvJywgJ24nLCAnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nIH0KLSAqICAgIHJlc3VsdCA9PiB0cnVlCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8bGk+PHByZT4KLSAqICAgIHBhdHRlcm4gPSB7ICdOJywgJ3UnLCAnUCcsICdvJywgJ0UnLCAneCcgfQotICogICAgbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9Ci0gKiAgICByZXN1bHQgPT4gdHJ1ZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0geyAnTicsICd1JywgJ1AnLCAnbycsICdFJywgJ3gnIH0KLSAqICAgIG5hbWUgPSB7ICdOJywgJ28nLCAnUCcsICdlJywgJ3InLCAnbScsICdpJywgJ3MnLCAncycsICdpJywgJ28nLCAnbicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQotICogICAgcmVzdWx0ID0+IGZhbHNlCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8bGk+PHByZT4KLSAqICAgIHBhdHRlcm4gPSB7ICduJywgcCcsICdlJyB9Ci0gKiAgICBuYW1lID0geyAnTicsICd1JywnbCcsICdsJywgJ1AnLCAnbycsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nIH0KLSAqICAgIHJlc3VsdCA9PiBmYWxzZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPC9vbD4KLSAqIAorICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgdXNpbmcgQ2FtZWxDYXNlIHJ1bGVzLCBvcgorICogZmFsc2Ugb3RoZXJ3aXNlLiBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzCisgKiAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KKyAqIDxwPgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhCisgKiBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICogPHA+CisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaGVkIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtYXRjaGluZyBuYW1lcyB0byBoYXZlIG1vcmUgcGFydHMgdGhhbiB0aGUgc3BlY2lmaWVkCisgKiBwYXR0ZXJuIChzZWUge0BsaW5rICNjYW1lbENhc2VNYXRjaChjaGFyW10sIGNoYXJbXSwgYm9vbGVhbil9KS48YnI+CisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcsCisgKiAnSGF0TWFwcGVyJyA8Yj5hbmQgYWxzbzwvYj4gJ0hhc2hNYXBFbnRyeScuCisgKiA8cD4KKyAqIDxwcmU+CisgKiBFeGFtcGxlczo8b2w+CisgKiA8bGk+IHBhdHRlcm4gPSAiTlBFIi50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiTlBFIi50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIk5vUGVybWlzc2lvbkV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIk51UG9FeCIudG9DaGFyQXJyYXkoKQorICogbmFtZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIk51UG9FeCIudG9DaGFyQXJyYXkoKQorICogbmFtZSA9ICJOb1Blcm1pc3Npb25FeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIHJlc3VsdCA9PiBmYWxzZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAibnBlIi50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gZmFsc2U8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIklQTDMiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWUgPSAiSVBlcnNwZWN0aXZlTGlzdGVuZXIzIi50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiSE0iLnRvQ2hhckFycmF5KCkKKyAqIG5hbWUgPSAiSGFzaE1hcEVudHJ5Ii50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8L29sPjwvcHJlPgorICoKICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQogICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQpAQCAtMjM3LDkwICsyNDEsMzA4IEBACiAJaWYgKG5hbWUgPT0gbnVsbCkKIAkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCiAKLQlyZXR1cm4gY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgMCwgcGF0dGVybi5sZW5ndGgsIG5hbWUsIDAsIG5hbWUubGVuZ3RoKTsKKwlyZXR1cm4gY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgMCwgcGF0dGVybi5sZW5ndGgsIG5hbWUsIDAsIG5hbWUubGVuZ3RoLCBmYWxzZS8qbm90IHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzKi8pOwogfQogCiAvKioKLSAqIEFuc3dlcnMgdHJ1ZSBpZiBhIHN1Yi1wYXR0ZXJuIG1hdGNoZXMgdGhlIHN1YnBhcnQgb2YgdGhlIGdpdmVuIG5hbWUgdXNpbmcgQ2FtZWxDYXNlIHJ1bGVzLCBvciBmYWxzZSBvdGhlcndpc2UuICAKLSAqIGNoYXJbXSBDYW1lbENhc2UgbWF0Y2hpbmcgZG9lcyBOT1QgYWNjZXB0IGV4cGxpY2l0IHdpbGQtY2FyZHMgJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuIAorICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgdXNpbmcgQ2FtZWxDYXNlIHJ1bGVzLCBvcgorICogZmFsc2Ugb3RoZXJ3aXNlLiBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzCisgKiAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KKyAqIDxwPgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhCisgKiBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICogPHA+CisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaGVkIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBjYW4gYmUgcmVzdHJpY3RlZCB0byBtYXRjaCBvbmx5IHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzLiBXaGVuIHRoaXMKKyAqIHJlc3RyaWN0aW9uIGlzIHNwZWNpZmllZCB0aGUgZ2l2ZW4gcGF0dGVybiBhbmQgdGhlIGdpdmVuIG5hbWUgbXVzdCBoYXZlIDxiPmV4YWN0bHk8L2I+CisgKiB0aGUgc2FtZSBudW1iZXIgb2YgcGFydHMgKGkuZS4gdGhlIHNhbWUgbnVtYmVyIG9mIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKS48YnI+CisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kCisgKiAnSGF0TWFwcGVyJyA8Yj5idXQgbm90PC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIDxwPgorICogPHByZT4KKyAqIEV4YW1wbGVzOjxvbD4KKyAqIDxsaT4gcGF0dGVybiA9ICJOUEUiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWUgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJOUEUiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWUgPSAiTm9QZXJtaXNzaW9uRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiTnVQb0V4Ii50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiTnVQb0V4Ii50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIk5vUGVybWlzc2lvbkV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogcmVzdWx0ID0+IGZhbHNlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJucGUiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWUgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIHJlc3VsdCA9PiBmYWxzZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiSVBMMyIudG9DaGFyQXJyYXkoKQorICogbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiLnRvQ2hhckFycmF5KCkKKyAqIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJITSIudG9DaGFyQXJyYXkoKQorICogbmFtZSA9ICJIYXNoTWFwRW50cnkiLnRvQ2hhckFycmF5KCkKKyAqIHJlc3VsdCA9PiAoc2FtZVBhcnRDb3VudCA9PSBmYWxzZSk8L2xpPgorICogPC9vbD48L3ByZT4KKyAqCisgKiBAcGFyYW0gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgorICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKyAqIEBwYXJhbSBzYW1lUGFydENvdW50IGZsYWcgdGVsbGluZyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGFuZCB0aGUgbmFtZSBzaG91bGQKKyAqIAloYXZlIHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzIG9yIG5vdC48YnI+CisgKiAJJm5ic3A7Jm5ic3A7Rm9yIGV4YW1wbGU6CisgKiAJPHVsPgorICogCQk8bGk+J0hNJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicgdHlwZXMsCisgKiAJCQkJYnV0IG5vdCAnSGFzaE1hcEVudHJ5JzwvbGk+CisgKiAJCTxsaT4nSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIHN0aWxsIG1hdGNoIHByZXZpb3VzICdIYXNoTWFwJyBhbmQKKyAqIAkJCQknSHRtbE1hcHBlcicgdHlwZXMsIGJ1dCBub3QgJ0hpZ2hNYWduaXR1ZGUnPC9saT4KKyAqIAk8L3VsPgorICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goY2hhcltdIHBhdHRlcm4sIGNoYXJbXSBuYW1lLCBib29sZWFuIHNhbWVQYXJ0Q291bnQpIHsKKwlpZiAocGF0dGVybiA9PSBudWxsKQorCQlyZXR1cm4gdHJ1ZTsgLy8gbnVsbCBwYXR0ZXJuIGlzIGVxdWl2YWxlbnQgdG8gJyonCisJaWYgKG5hbWUgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisKKwlyZXR1cm4gY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgMCwgcGF0dGVybi5sZW5ndGgsIG5hbWUsIDAsIG5hbWUubGVuZ3RoLCBzYW1lUGFydENvdW50KTsKK30KKworLyoqCisgKiBBbnN3ZXJzIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSB1c2luZworICogQ2FtZWxDYXNlIHJ1bGVzLCBvciBmYWxzZSBvdGhlcndpc2UuICBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UCisgKiBhY2NlcHQgZXhwbGljaXQgd2lsZC1jYXJkcyAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KICAqIENhbiBtYXRjaCBvbmx5IHN1YnNldCBvZiBuYW1lL3BhdHRlcm4sIGNvbnNpZGVyaW5nIGVuZCBwb3NpdGlvbnMgYXMgbm9uLWluY2x1c2l2ZS4KLSAqIFRoZSBzdWJwYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQgcGF0dGVybkVuZCBwb3NpdGlvbnMuCi0gKiA8YnI+Ci0gKiBDYW1lbENhc2UgZGVub3RlcyB0aGUgY29udmVudGlvbiBvZiB3cml0aW5nIGNvbXBvdW5kIG5hbWVzIHdpdGhvdXQgc3BhY2VzLCBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uCi0gKiBUaGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgYm90aCB1cHBlciBhbmQgbG93ZXIgQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQKLSAqIG9yIG5vdC4gVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYSBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nCi0gKiBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgotICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlciBDYW1lbENhc2UgY29udmVudGlvbiwgd2hlcmVhcyBtZXRob2Qgb3IgZmllbGQKLSAqIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIgQ2FtZWxDYXNlIGNvbnZlbnRpb24uCi0gKiA8YnI+Ci0gKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaCBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0gKiBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdCAnTnVsbFBvaW50ZXJFeENFUFRJT04nCi0gKiBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05vUG9pbnRlckV4Y2VwdGlvbicuCi0gKiA8YnI+PGJyPgorICogVGhlIHN1Yi1wYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQgcGF0dGVybkVuZCBwb3NpdGlvbnMuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBkZW5vdGVzIHRoZSBjb252ZW50aW9uIG9mIHdyaXRpbmcgY29tcG91bmQgbmFtZXMgd2l0aG91dCBzcGFjZXMsCisgKiBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBib3RoIHVwcGVyIGFuZCBsb3dlcgorICogQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQgb3Igbm90LgorICogVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYQorICogc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZyBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsCisgKiBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4KKyAqIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QgY2hhcmFjdGVyLiBJbiBKYXZhLCB0eXBlIG5hbWVzIGZvbGxvdyB0aGUgdXBwZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLCB3aGVyZWFzIG1ldGhvZCBvciBmaWVsZCBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyCisgKiBDYW1lbENhc2UgY29udmVudGlvbi4KKyAqIDxwPgorICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgbWF0Y2hlZCBpbiBhIGNhc2UKKyAqIHNlbnNpdGl2ZSB3YXkuIFRoZXNlIGNoYXJhY3RlcnMgbXVzdCBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuCisgKiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOdWxsUG9pbnRlckV4Q0VQVElPTicgb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90CisgKiAnTm9Qb2ludGVyRXhjZXB0aW9uJy4KKyAqIDxwPgorICogRGlnaXQgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiBUaGV5IGNhbiBiZSB1c2VkIGluIHRoZSBwYXR0ZXJuCisgKiBidXQgYXJlIG5vdCBhbHdheXMgY29uc2lkZXJlZCBhcyBsZWFkaW5nIGNoYXJhY3Rlci4gRm9yIGluc3RhbmNlLCBib3RoCisgKiAnVVRGMTZEU1MnIGFuZCAnVVRGRFNTJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdVVEYxNkRvY3VtZW50U2Nhbm5lclN1cHBvcnQnLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtYXRjaGluZyBuYW1lcyB0byBoYXZlIG1vcmUgcGFydHMgdGhhbiB0aGUgc3BlY2lmaWVkCisgKiBwYXR0ZXJuIChzZWUge0BsaW5rICNjYW1lbENhc2VNYXRjaChjaGFyW10sIGludCwgaW50LCBjaGFyW10sIGludCwgaW50LCBib29sZWFuKX0pLjxicj4KKyAqIEZvciBpbnN0YW5jZSwgJ0hNJyAsICdIYU1hJyBhbmQgICdITWFwJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdIYXNoTWFwJywKKyAqICdIYXRNYXBwZXInIDxiPmFuZCBhbHNvPC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIDxwPgogICogRXhhbXBsZXM6CiAgKiA8b2w+Ci0gKiA8bGk+PHByZT4KLSAqICAgIHBhdHRlcm4gPSB7ICdOJywgJ1AnLCAnRScgfQotICogICAgcGF0dGVyblN0YXJ0ID0gMAotICogICAgcGF0dGVybkVuZCA9IDMKLSAqICAgIG5hbWUgPSB7ICdOJywgJ3UnLCdsJywgJ2wnLCAnUCcsICdvJywgJ2knLCAnbicsICd0JywgJ2UnLCAncicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQotICogICAgbmFtZVN0YXJ0ID0gMAotICogICAgbmFtZUVuZCA9IDIwCi0gKiAgICByZXN1bHQgPT4gdHJ1ZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0geyAnTicsICdQJywgJ0UnIH0KLSAqICAgIHBhdHRlcm5TdGFydCA9IDAKLSAqICAgIHBhdHRlcm5FbmQgPSAzCi0gKiAgICBuYW1lID0geyAnTicsICdvJywgJ1AnLCAnZScsICdyJywgJ20nLCAnaScsICdzJywgJ3MnLCAnaScsICdvJywgJ24nLCAnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nIH0KLSAqICAgIG5hbWVTdGFydCA9IDAKLSAqICAgIG5hbWVFbmQgPSAyMQotICogICAgcmVzdWx0ID0+IHRydWUKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9IHsgJ04nLCAndScsICdQJywgJ28nLCAnRScsICd4JyB9Ci0gKiAgICBwYXR0ZXJuU3RhcnQgPSAwCi0gKiAgICBwYXR0ZXJuRW5kID0gNgotICogICAgbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9Ci0gKiAgICBuYW1lU3RhcnQgPSAwCi0gKiAgICBuYW1lRW5kID0gMjAKLSAqICAgIHJlc3VsdCA9PiB0cnVlCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8bGk+PHByZT4KLSAqICAgIHBhdHRlcm4gPSB7ICdOJywgJ3UnLCAnUCcsICdvJywgJ0UnLCAneCcgfQotICogICAgcGF0dGVyblN0YXJ0ID0gMAotICogICAgcGF0dGVybkVuZCA9IDYKLSAqICAgIG5hbWUgPSB7ICdOJywgJ28nLCAnUCcsICdlJywgJ3InLCAnbScsICdpJywgJ3MnLCAncycsICdpJywgJ28nLCAnbicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQotICogICAgbmFtZVN0YXJ0ID0gMAotICogICAgbmFtZUVuZCA9IDIxCi0gKiAgICByZXN1bHQgPT4gZmFsc2UKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9IHsgJ24nLCBwJywgJ2UnIH0KLSAqICAgIHBhdHRlcm5TdGFydCA9IDAKLSAqICAgIHBhdHRlcm5FbmQgPSAzCi0gKiAgICBuYW1lID0geyAnTicsICd1JywnbCcsICdsJywgJ1AnLCAnbycsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nIH0KLSAqICAgIG5hbWVTdGFydCA9IDAKLSAqICAgIG5hbWVFbmQgPSAyMAotICogICAgcmVzdWx0ID0+IGZhbHNlCi0gKiA8L3ByZT4KLSAqIDwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiTlBFIi50b0NoYXJBcnJheSgpCisgKiBwYXR0ZXJuU3RhcnQgPSAwCisgKiBwYXR0ZXJuRW5kID0gMworICogbmFtZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDIwCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiTlBFIi50b0NoYXJBcnJheSgpCisgKiBwYXR0ZXJuU3RhcnQgPSAwCisgKiBwYXR0ZXJuRW5kID0gMworICogbmFtZSA9ICJOb1Blcm1pc3Npb25FeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAyMQorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIk51UG9FeCIudG9DaGFyQXJyYXkoKQorICogcGF0dGVyblN0YXJ0ID0gMAorICogcGF0dGVybkVuZCA9IDYKKyAqIG5hbWUgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAyMAorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIk51UG9FeCIudG9DaGFyQXJyYXkoKQorICogcGF0dGVyblN0YXJ0ID0gMAorICogcGF0dGVybkVuZCA9IDYKKyAqIG5hbWUgPSAiTm9QZXJtaXNzaW9uRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiBuYW1lU3RhcnQgPSAwCisgKiBuYW1lRW5kID0gMjEKKyAqIHJlc3VsdCA9PiBmYWxzZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAibnBlIi50b0NoYXJBcnJheSgpCisgKiBwYXR0ZXJuU3RhcnQgPSAwCisgKiBwYXR0ZXJuRW5kID0gMworICogbmFtZSA9ICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDIwCisgKiByZXN1bHQgPT4gZmFsc2U8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIklQTDMiLnRvQ2hhckFycmF5KCkKKyAqIHBhdHRlcm5TdGFydCA9IDAKKyAqIHBhdHRlcm5FbmQgPSA0CisgKiBuYW1lID0gIklQZXJzcGVjdGl2ZUxpc3RlbmVyMyIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDIxCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+IHBhdHRlcm4gPSAiSE0iLnRvQ2hhckFycmF5KCkKKyAqIHBhdHRlcm5TdGFydCA9IDAKKyAqIHBhdHRlcm5FbmQgPSAyCisgKiBuYW1lID0gIkhhc2hNYXBFbnRyeSIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDEyCisgKiByZXN1bHQgPT4gdHJ1ZTwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KICAqIEBwYXJhbSBwYXR0ZXJuU3RhcnQgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBpbmNsdXNpdmUKICAqIEBwYXJhbSBwYXR0ZXJuRW5kIHRoZSBlbmQgaW5kZXggb2YgdGhlIHBhdHRlcm4sIGV4Y2x1c2l2ZQogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqIEBwYXJhbSBuYW1lU3RhcnQgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBuYW1lLCBpbmNsdXNpdmUKICAqIEBwYXJhbSBuYW1lRW5kIHRoZSBlbmQgaW5kZXggb2YgdGhlIG5hbWUsIGV4Y2x1c2l2ZQotICogQHJldHVybiB0cnVlIGlmIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3VicGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCiAgKiBAc2luY2UgMy4yCiAgKi8KIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW1lbENhc2VNYXRjaChjaGFyW10gcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgeworCXJldHVybiBjYW1lbENhc2VNYXRjaChwYXR0ZXJuLCBwYXR0ZXJuU3RhcnQsIHBhdHRlcm5FbmQsIG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgZmFsc2UvKm5vdCB0aGUgc2FtZSBjb3VudCBvZiBwYXJ0cyovKTsKK30KKworLyoqCisgKiBBbnN3ZXJzIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSB1c2luZworICogQ2FtZWxDYXNlIHJ1bGVzLCBvciBmYWxzZSBvdGhlcndpc2UuICBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UCisgKiBhY2NlcHQgZXhwbGljaXQgd2lsZC1jYXJkcyAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KKyAqIENhbiBtYXRjaCBvbmx5IHN1YnNldCBvZiBuYW1lL3BhdHRlcm4sIGNvbnNpZGVyaW5nIGVuZCBwb3NpdGlvbnMgYXMKKyAqIG5vbi1pbmNsdXNpdmUuIFRoZSBzdWItcGF0dGVybiBpcyBkZWZpbmVkIGJ5IHRoZSBwYXR0ZXJuU3RhcnQgYW5kIHBhdHRlcm5FbmQKKyAqIHBvc2l0aW9ucy4KKyAqIDxwPgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbgorICogYSBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICogPHA+CisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaGVkIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBjYW4gYmUgcmVzdHJpY3RlZCB0byBtYXRjaCBvbmx5IHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzLiBXaGVuIHRoaXMKKyAqIHJlc3RyaWN0aW9uIGlzIHNwZWNpZmllZCB0aGUgZ2l2ZW4gcGF0dGVybiBhbmQgdGhlIGdpdmVuIG5hbWUgbXVzdCBoYXZlIDxiPmV4YWN0bHk8L2I+CisgKiB0aGUgc2FtZSBudW1iZXIgb2YgcGFydHMgKGkuZS4gdGhlIHNhbWUgbnVtYmVyIG9mIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKS48YnI+CisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kCisgKiAnSGF0TWFwcGVyJyA8Yj5idXQgbm90PC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIDxwPgorICogPHByZT4KKyAqIEV4YW1wbGVzOgorICogPG9sPgorICogPGxpPiBwYXR0ZXJuID0gIk5QRSIudG9DaGFyQXJyYXkoKQorICogcGF0dGVyblN0YXJ0ID0gMAorICogcGF0dGVybkVuZCA9IDMKKyAqIG5hbWUgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAyMAorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIk5QRSIudG9DaGFyQXJyYXkoKQorICogcGF0dGVyblN0YXJ0ID0gMAorICogcGF0dGVybkVuZCA9IDMKKyAqIG5hbWUgPSAiTm9QZXJtaXNzaW9uRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiBuYW1lU3RhcnQgPSAwCisgKiBuYW1lRW5kID0gMjEKKyAqIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJOdVBvRXgiLnRvQ2hhckFycmF5KCkKKyAqIHBhdHRlcm5TdGFydCA9IDAKKyAqIHBhdHRlcm5FbmQgPSA2CisgKiBuYW1lID0gIk51bGxQb2ludGVyRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpCisgKiBuYW1lU3RhcnQgPSAwCisgKiBuYW1lRW5kID0gMjAKKyAqIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJOdVBvRXgiLnRvQ2hhckFycmF5KCkKKyAqIHBhdHRlcm5TdGFydCA9IDAKKyAqIHBhdHRlcm5FbmQgPSA2CisgKiBuYW1lID0gIk5vUGVybWlzc2lvbkV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDIxCisgKiByZXN1bHQgPT4gZmFsc2U8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIm5wZSIudG9DaGFyQXJyYXkoKQorICogcGF0dGVyblN0YXJ0ID0gMAorICogcGF0dGVybkVuZCA9IDMKKyAqIG5hbWUgPSAiTnVsbFBvaW50ZXJFeGNlcHRpb24iLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAyMAorICogcmVzdWx0ID0+IGZhbHNlPC9saT4KKyAqIDxsaT4gcGF0dGVybiA9ICJJUEwzIi50b0NoYXJBcnJheSgpCisgKiBwYXR0ZXJuU3RhcnQgPSAwCisgKiBwYXR0ZXJuRW5kID0gNAorICogbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAyMQorICogcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiBwYXR0ZXJuID0gIkhNIi50b0NoYXJBcnJheSgpCisgKiBwYXR0ZXJuU3RhcnQgPSAwCisgKiBwYXR0ZXJuRW5kID0gMgorICogbmFtZSA9ICJIYXNoTWFwRW50cnkiLnRvQ2hhckFycmF5KCkKKyAqIG5hbWVTdGFydCA9IDAKKyAqIG5hbWVFbmQgPSAxMgorICogcmVzdWx0ID0+IChzYW1lUGFydENvdW50ID09IGZhbHNlKTwvbGk+CisgKiA8L29sPgorICogPC9wcmU+CisgKgorICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KKyAqIEBwYXJhbSBwYXR0ZXJuU3RhcnQgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBpbmNsdXNpdmUKKyAqIEBwYXJhbSBwYXR0ZXJuRW5kIHRoZSBlbmQgaW5kZXggb2YgdGhlIHBhdHRlcm4sIGV4Y2x1c2l2ZQorICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKyAqIEBwYXJhbSBuYW1lU3RhcnQgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBuYW1lLCBpbmNsdXNpdmUKKyAqIEBwYXJhbSBuYW1lRW5kIHRoZSBlbmQgaW5kZXggb2YgdGhlIG5hbWUsIGV4Y2x1c2l2ZQorICogQHBhcmFtIHNhbWVQYXJ0Q291bnQgZmxhZyB0ZWxsaW5nIHdoZXRoZXIgdGhlIHBhdHRlcm4gYW5kIHRoZSBuYW1lIHNob3VsZAorICogCWhhdmUgdGhlIHNhbWUgY291bnQgb2YgcGFydHMgb3Igbm90Ljxicj4KKyAqIAkmbmJzcDsmbmJzcDtGb3IgZXhhbXBsZToKKyAqIAk8dWw+CisgKiAJCTxsaT4nSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJyB0eXBlcywKKyAqIAkJCQlidXQgbm90ICdIYXNoTWFwRW50cnknPC9saT4KKyAqIAkJPGxpPidITWFwJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgc3RpbGwgbWF0Y2ggcHJldmlvdXMgJ0hhc2hNYXAnIGFuZAorICogCQkJCSdIdG1sTWFwcGVyJyB0eXBlcywgYnV0IG5vdCAnSGlnaE1hZ25pdHVkZSc8L2xpPgorICogCTwvdWw+CisgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW1lbENhc2VNYXRjaChjaGFyW10gcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgYm9vbGVhbiBzYW1lUGFydENvdW50KSB7CisKKwkvKiAhISEhISEhISEhIFdBUk5JTkcgISEhISEhISEhIQorCSAqIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaW4gdGhpcyBtZXRob2QgaGFzIGJlZW4gaGVhdmlseSB1c2VkIGluCisJICogU3RyaW5nT3BlcmF0aW9uI2dldENhbWVsQ2FzZU1hdGNoaW5nUmVnaW9ucyhTdHJpbmcsIGludCwgaW50LCBTdHJpbmcsIGludCwgaW50LCBib29sZWFuKQorCSAqIG1ldGhvZC4KKwkgKgorCSAqIFNvLCBpZiBhbnkgY2hhbmdlIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGN1cnJlbnQgYWxnb3JpdGhtLAorCSAqIGRvIE5PVCBmb3JnZXQgdG8gYWxzbyBhcHBseSB0aGUgc2FtZSBjaGFuZ2UgaW4gdGhlIFN0cmluZ09wZXJhdGlvbiBtZXRob2QhCisJICovCisKIAlpZiAobmFtZSA9PSBudWxsKQogCQlyZXR1cm4gZmFsc2U7IC8vIG51bGwgbmFtZSBjYW5ub3QgbWF0Y2gKIAlpZiAocGF0dGVybiA9PSBudWxsKQpAQCAtMzQ2LDEzICs1NjgsMzIgQEAKIAkJaVBhdHRlcm4rKzsKIAkJaU5hbWUrKzsKIAotCQlpZiAoaVBhdHRlcm4gPT0gcGF0dGVybkVuZCkgewotCQkJLy8gV2UgaGF2ZSBleGhhdXN0ZWQgcGF0dGVybiwgc28gaXQncyBhIG1hdGNoCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQpIHsgLy8gd2UgaGF2ZSBleGhhdXN0ZWQgcGF0dGVybi4uLgorCQkJLy8gaXQncyBhIG1hdGNoIGlmIHRoZSBuYW1lIGNhbiBoYXZlIGFkZGl0aW9uYWwgcGFydHMgKGkuZS4gdXBwZXJjYXNlIGNoYXJhY3RlcnMpIG9yIGlzIGFsc28gZXhoYXVzdGVkCisJCQlpZiAoIXNhbWVQYXJ0Q291bnQgfHwgaU5hbWUgPT0gbmFtZUVuZCkgcmV0dXJuIHRydWU7CisKKwkJCS8vIG90aGVyd2lzZSBpdCdzIGEgbWF0Y2ggb25seSBpZiB0aGUgbmFtZSBoYXMgbm8gbW9yZSB1cHBlcmNhc2UgY2hhcmFjdGVycworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCkgeworCQkJCQkvLyB3ZSBoYXZlIGV4aGF1c3RlZCB0aGUgbmFtZSwgc28gaXQncyBhIG1hdGNoCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQluYW1lQ2hhciA9IG5hbWVbaU5hbWVdOworCQkJCS8vIHRlc3QgaWYgdGhlIG5hbWUgY2hhcmFjdGVyIGlzIHVwcGVyY2FzZQorCQkJCWlmIChuYW1lQ2hhciA8IFNjYW5uZXJIZWxwZXIuTUFYX09CVklPVVMpIHsKKwkJCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW25hbWVDaGFyXSAmIFNjYW5uZXJIZWxwZXIuQ19VUFBFUl9MRVRURVIpICE9IDApIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVDaGFyKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZUNoYXIpKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJaU5hbWUrKzsKKwkJCX0KIAkJfQogCiAJCWlmIChpTmFtZSA9PSBuYW1lRW5kKXsKLQkJCS8vIFdlIGhhdmUgZXhoYXVzdGVkIG5hbWUgKGFuZCBub3QgcGF0dGVybiksIHNvIGl0J3Mgbm90IGEgbWF0Y2ggCisJCQkvLyBXZSBoYXZlIGV4aGF1c3RlZCB0aGUgbmFtZSAoYW5kIG5vdCB0aGUgcGF0dGVybiksIHNvIGl0J3Mgbm90IGEgbWF0Y2gKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0zNjMsMTEgKzYwNCwxMSBAQAogCiAJCS8vIElmIGNoYXJhY3RlcnMgYXJlIG5vdCBlcXVhbHMsIHRoZW4gaXQncyBub3QgYSBtYXRjaCBpZiBwYXR0ZXJuQ2hhciBpcyBsb3dlcmNhc2UKIAkJaWYgKHBhdHRlcm5DaGFyIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgewotCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW3BhdHRlcm5DaGFyXSAmIFNjYW5uZXJIZWxwZXIuQ19VUFBFUl9MRVRURVIpID09IDApIHsKKwkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1twYXR0ZXJuQ2hhcl0gJiAoU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19ESUdJVCkpID09IDApIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KLQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHBhdHRlcm5DaGFyKSAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHBhdHRlcm5DaGFyKSkgeworCQllbHNlIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQocGF0dGVybkNoYXIpICYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UocGF0dGVybkNoYXIpICYmICFDaGFyYWN0ZXIuaXNEaWdpdChwYXR0ZXJuQ2hhcikpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0zODAsOCArNjIxLDEzIEBACiAKIAkJCW5hbWVDaGFyID0gbmFtZVtpTmFtZV07CiAJCQlpZiAobmFtZUNoYXIgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7Ci0JCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW25hbWVDaGFyXSAmIChTY2FubmVySGVscGVyLkNfTE9XRVJfTEVUVEVSIHwgU2Nhbm5lckhlbHBlci5DX1NQRUNJQUwgfCBTY2FubmVySGVscGVyLkNfRElHSVQpKSAhPSAwKSB7Ci0JCQkJCS8vIG5hbWVDaGFyIGlzIGxvd2VyY2FzZSAgICAKKwkJCQlpbnQgY2hhck5hdHVyZSA9IFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbbmFtZUNoYXJdOworCQkJCWlmICgoY2hhck5hdHVyZSAmIChTY2FubmVySGVscGVyLkNfTE9XRVJfTEVUVEVSIHwgU2Nhbm5lckhlbHBlci5DX1NQRUNJQUwpKSAhPSAwKSB7CisJCQkJCS8vIG5hbWVDaGFyIGlzIGxvd2VyY2FzZQorCQkJCQlpTmFtZSsrOworCQkJCX0gZWxzZSBpZiAoKGNoYXJOYXR1cmUgJiBTY2FubmVySGVscGVyLkNfRElHSVQpICE9IDApIHsKKwkJCQkJLy8gbmFtZUNoYXIgaXMgZGlnaXQgPT4gYnJlYWsgaWYgdGhlIGRpZ2l0IGlzIGN1cnJlbnQgcGF0dGVybiBjaGFyYWN0ZXIgb3RoZXJ3aXNlIGNvbnN1bWUgaXQKKwkJCQkJaWYgKHBhdHRlcm5DaGFyID09IG5hbWVDaGFyKSBicmVhazsKIAkJCQkJaU5hbWUrKzsKIAkJCQkvLyBuYW1lQ2hhciBpcyB1cHBlcmNhc2UuLi4KIAkJCQl9IGVsc2UgIGlmIChwYXR0ZXJuQ2hhciAhPSBuYW1lQ2hhcikgewpAQCAtMzkyLDI2ICs2MzgsMjYgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQorCQkJLy8gU2FtZSB0ZXN0cyBmb3Igbm9uLW9idmlvdXMgY2hhcmFjdGVycwogCQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVDaGFyKSAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKG5hbWVDaGFyKSkgewotCQkJCS8vIG5hbWVDaGFyIGlzIGxvd2VyY2FzZSAgICAKIAkJCQlpTmFtZSsrOwotCQkJLy8gbmFtZUNoYXIgaXMgdXBwZXJjYXNlLi4uCisJCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KG5hbWVDaGFyKSkgeworCQkJCWlmIChwYXR0ZXJuQ2hhciA9PSBuYW1lQ2hhcikgYnJlYWs7CisJCQkJaU5hbWUrKzsKIAkJCX0gZWxzZSAgaWYgKHBhdHRlcm5DaGFyICE9IG5hbWVDaGFyKSB7Ci0JCQkJLy8uLiBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggcGF0dGVybkNoYXIsIHNvIGl0J3Mgbm90IGEgbWF0Y2gKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9IGVsc2UgewotCQkJCS8vLi4gYW5kIGl0IG1hdGNoZWQgcGF0dGVybkNoYXIuIEJhY2sgdG8gdGhlIGJpZyBsb29wCiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJLy8gQXQgdGhpcyBwb2ludCwgZWl0aGVyIG5hbWUgaGFzIGJlZW4gZXhoYXVzdGVkLCBvciBpdCBpcyBhdCBhbiB1cHBlcmNhc2UgbGV0dGVyLgogCQkvLyBTaW5jZSBwYXR0ZXJuIGlzIGFsc28gYXQgYW4gdXBwZXJjYXNlIGxldHRlcgogCX0KLX0JCit9CiAKIC8qKgogICogUmV0dXJucyB0aGUgY2hhciBhcnJheXMgYXMgYW4gYXJyYXkgb2YgU3RyaW5ncwotICogCisgKgogICogQHBhcmFtIGNoYXJBcnJheXMgdGhlIGNoYXIgYXJyYXkgdG8gY29udmVydAogICogQHJldHVybiB0aGUgY2hhciBhcnJheXMgYXMgYW4gYXJyYXkgb2YgU3RyaW5ncyBvciBudWxsIGlmIHRoZSBnaXZlbiBjaGFyIGFycmF5cyBpcyBudWxsLgogICogQHNpbmNlIDMuMApAQCAtNDY3LDcgKzcxMyw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheSB0byBjb25jYXRlbmF0ZQogICogQHBhcmFtIHNlY29uZCB0aGUgYXJyYXkgdG8gYWRkIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IGFycmF5CiAgKiBAcmV0dXJuIGEgbmV3IGFycmF5IGFkZGluZyB0aGUgc2Vjb25kIGFycmF5IGF0IHRoZSBlbmQgb2YgZmlyc3QgYXJyYXksIG9yIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCkBAIC00ODgsOSArNzM0LDkgQEAKICAqIENvbXBhcmVzIHRoZSB0d28gY2hhciBhcnJheXMgbGV4aWNvZ3JhcGhpY2FsbHkuCiAgKgogICogUmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYXJyYXkxIGxleGljb2dyYXBoaWNhbGx5IHByZWNlZGVzIHRoZSBhcnJheTIsCi0gKiBhIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBhcnJheTEgbGV4aWNvZ3JhcGhpY2FsbHkgZm9sbG93cyB0aGUgYXJyYXkyLCBvciAKLSAqIHplcm8gaWYgYm90aCBhcnJheXMgYXJlIGVxdWFsLiAKLSAqIAorICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgYXJyYXkxIGxleGljb2dyYXBoaWNhbGx5IGZvbGxvd3MgdGhlIGFycmF5Miwgb3IKKyAqIHplcm8gaWYgYm90aCBhcnJheXMgYXJlIGVxdWFsLgorICoKICAqIEBwYXJhbSBhcnJheTEgdGhlIGZpcnN0IGdpdmVuIGFycmF5CiAgKiBAcGFyYW0gYXJyYXkyIHRoZSBzZWNvbmQgZ2l2ZW4gYXJyYXkKICAqIEByZXR1cm4gdGhlIHJldHVybmVkIHZhbHVlIG9mIHRoZSBjb21wYXJpc29uIGJldHdlZW4gYXJyYXkxIGFuZCBhcnJheTIKQEAgLTUwOSwxMSArNzU1LDQwIEBACiAJcmV0dXJuIGxlbmd0aDEgLSBsZW5ndGgyOwogfQogLyoqCisgKiBDb21wYXJlcyB0aGUgdHdvIGNoYXIgYXJyYXlzIGxleGljb2dyYXBoaWNhbGx5IGJldHdlZW4gdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIGFycmF5MSBsZXhpY29ncmFwaGljYWxseSBwcmVjZWRlcyB0aGUgYXJyYXkyLAorICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgYXJyYXkxIGxleGljb2dyYXBoaWNhbGx5IGZvbGxvd3MgdGhlIGFycmF5Miwgb3IKKyAqIHplcm8gaWYgYm90aCBhcnJheXMgYXJlIGVxdWFsLgorICogPHA+VGhlIGNvbXBhcmlzb24gaXMgZG9uZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLjwvcD4KKyAqCisgKiBAcGFyYW0gYXJyYXkxIHRoZSBmaXJzdCBnaXZlbiBhcnJheQorICogQHBhcmFtIGFycmF5MiB0aGUgc2Vjb25kIGdpdmVuIGFycmF5CisgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIHRvIGNvbXBhcmUgKGluY2x1c2l2ZSkKKyAqIEBwYXJhbSBlbmQgdGhlIGVuZGluZyBwb3NpdGlvbiB0byBjb21wYXJlIChleGNsdXNpdmUpCisgKiAKKyAqIEByZXR1cm4gdGhlIHJldHVybmVkIHZhbHVlIG9mIHRoZSBjb21wYXJpc29uIGJldHdlZW4gYXJyYXkxIGFuZCBhcnJheTIKKyAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBhcnJheXMgaXMgbnVsbAorICogQHNpbmNlIDMuNy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmVUbyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlpbnQgbGVuZ3RoMSA9IGFycmF5MS5sZW5ndGg7CisJaW50IGxlbmd0aDIgPSBhcnJheTIubGVuZ3RoOworCWludCBtaW4gPSBNYXRoLm1pbihsZW5ndGgxLCBsZW5ndGgyKTsKKwltaW4gPSBNYXRoLm1pbihtaW4sIGVuZCk7CisJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbWluOyBpKyspIHsKKwkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKKwkJCXJldHVybiBhcnJheTFbaV0gLSBhcnJheTJbaV07CisJCX0KKwl9CisJcmV0dXJuIGxlbmd0aDEgLSBsZW5ndGgyOworfQorLyoqCiAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdGhlIHR3byBhcnJheXMgYXJyYXkgYW5kIHByZWZpeC4gUmV0dXJucwogICogPHVsPgogICogPGxpPnplcm8gaWYgdGhlIGFycmF5IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXggY29udGVudHM8L2xpPgogICogPGxpPnRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBlcXVhbCA8L2xpPgotICogPGxpPm9uZSBpZiBhcnJheSBsZW5ndGggaXMgbG93ZXIgdGhhbiB0aGUgcHJlZml4IGxlbmd0aCBhbmQgdGhhdCB0aGUgcHJlZml4IHN0YXJ0cyB3aXRoIHRoZSAKKyAqIDxsaT5vbmUgaWYgYXJyYXkgbGVuZ3RoIGlzIGxvd2VyIHRoYW4gdGhlIHByZWZpeCBsZW5ndGggYW5kIHRoYXQgdGhlIHByZWZpeCBzdGFydHMgd2l0aCB0aGUKICAqIGFycmF5IGNvbnRlbnRzLjwvbGk+CiAgKiA8L3VsPgogICogPHA+CkBAIC01NTcsNyArODMyLDcgQEAKICAqIDwvbGk+CiAgKiA8L29sPgogICogPC9wPgotICogCisgKgogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHBhcmFtIHByZWZpeCB0aGUgZ2l2ZW4gcHJlZml4CiAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gKD49MCBpZiBhcnJheT5wcmVmaXgpCkBAIC02MDYsNyArODgxLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5IHRvIGNvbmNhdGVuYXRlCiAgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkgdG8gY29uY2F0ZW5hdGUKICAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHR3byBhcnJheXMsIG9yIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCkBAIC02NzAsMTEgKzk0NSwxMSBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKICAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheSB0byBjb25jYXRlbmF0ZQogICogQHBhcmFtIHRoaXJkIHRoZSB0aGlyZCBhcnJheSB0byBjb25jYXRlbmF0ZQotICogCisgKgogICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGhyZWUgYXJyYXlzLCBvciBudWxsIGlmIHRoZSB0aHJlZSBhcnJheXMgYXJlIG51bGwuCiAgKi8KIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdCgKQEAgLTcyOSwxMSArMTAwNCwxMSBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKICAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheSB0byBjb25jYXRlbmF0ZQogICogQHBhcmFtIHNlcGFyYXRvciB0aGUgY2hhcmFjdGVyIHRvIGluc2VydAotICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdHdvIGFycmF5cyBpbnNlcnRpbmcgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgCisgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzIGluc2VydGluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcgogICogYmV0d2VlbiB0aGUgdHdvIGFycmF5cyAsIG9yIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCiAgKi8KIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdCgKQEAgLTc2MCw3ICsxMDM1LDcgQEAKIH0KIAogLyoqCi0gKiBBbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0aHJlZSBhcnJheXMgaW5zZXJ0aW5nIHRoZSBzZXAxIGNoYXJhY3RlciBiZXR3ZWVuIHRoZSAKKyAqIEFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHRocmVlIGFycmF5cyBpbnNlcnRpbmcgdGhlIHNlcDEgY2hhcmFjdGVyIGJldHdlZW4gdGhlCiAgKiBmaXJzdCB0d28gYXJyYXlzIGFuZCBzZXAyIGJldHdlZW4gdGhlIGxhc3QgdHdvLgogICogSXQgYW5zd2VycyBudWxsIGlmIHRoZSB0aHJlZSBhcnJheXMgYXJlIG51bGwuCiAgKiBJZiB0aGUgZmlyc3QgYXJyYXkgaXMgbnVsbCwgdGhlbiBpdCBhbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHNlY29uZCBhbmQgdGhpcmQgaW5zZXJ0aW5nCkBAIC04MTAsMTMgKzEwODUsMTMgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5IHRvIGNvbmNhdGVuYXRlCiAgKiBAcGFyYW0gc2VwMSB0aGUgY2hhcmFjdGVyIHRvIGluc2VydAogICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIGFycmF5IHRvIGNvbmNhdGVuYXRlCiAgKiBAcGFyYW0gc2VwMiB0aGUgY2hhcmFjdGVyIHRvIGluc2VydAogICogQHBhcmFtIHRoaXJkIHRoZSBzZWNvbmQgYXJyYXkgdG8gY29uY2F0ZW5hdGUKLSAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHRocmVlIGFycmF5cyBpbnNlcnRpbmcgdGhlIHNlcDEgY2hhcmFjdGVyIGJldHdlZW4gdGhlIAorICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGhyZWUgYXJyYXlzIGluc2VydGluZyB0aGUgc2VwMSBjaGFyYWN0ZXIgYmV0d2VlbiB0aGUKICAqIHR3byBhcnJheXMgYW5kIHNlcDIgYmV0d2VlbiB0aGUgbGFzdCB0d28uCiAgKi8KIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdCgKQEAgLTg0NSw4ICsxMTIwLDggQEAKIH0KIAogLyoqCi0gKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdpdGggcHJlcGVuZGluZyB0aGUgcHJlZml4IGNoYXJhY3RlciBhbmQgYXBwZW5kaW5nIHRoZSBzdWZmaXggCi0gKiBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuIElmIGFycmF5IGlzIG51bGwsIGl0IGFuc3dlcnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgCisgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdpdGggcHJlcGVuZGluZyB0aGUgcHJlZml4IGNoYXJhY3RlciBhbmQgYXBwZW5kaW5nIHRoZSBzdWZmaXgKKyAqIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4gSWYgYXJyYXkgaXMgbnVsbCwgaXQgYW5zd2VycyBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZQogICogcHJlZml4IGFuZCB0aGUgc3VmZml4IGNoYXJhY3RlcnMuCiAgKiA8YnI+CiAgKiA8YnI+CkBAIC04NjYsOSArMTE0MSw5IEBACiAgKiAgICA9PiByZXN1bHQgPSB7ICdhJywgJ2MnIH0KICAqIDwvcHJlPjwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IGNoYXJhY3RlcgotICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0aGF0IGlzIGNvbmNhbmF0ZWQgd2l0aCB0aGUgcHJlZml4IGFuZCBzdWZmaXggY2hhcmFjdGVycworICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0aGF0IGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBjaGFyYWN0ZXJzCiAgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggY2hhcmFjdGVyCiAgKiBAcmV0dXJuIHRoZSBuZXcgYXJyYXkKICAqLwpAQCAtODg2LDcgKzExNjEsNyBAQAogCiAvKioKICAqIEFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIGFycmF5IHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IgYmV0d2VlbiBlYWNoCi0gKiBwYXJ0IGFuZCBhcHBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGVuZC4KKyAqIHBhcnQgYW5kIHByZXBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGJlZ2lubmluZy4KICAqIDxicj4KICAqIDxicj4KICAqIEZvciBleGFtcGxlOjxicj4KQEAgLTkxMSwxMiArMTE4NiwxMiBAQAogICogICAgPT4gcmVzdWx0ID0geyAnYycgfQogICogPC9wcmU+PC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCiAgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGJldHdlZW4gZWFjaAotICogcGFydCBhbmQgYXBwZW5kaW5nIHRoZSBnaXZlbiBuYW1lIGF0IHRoZSBlbmQKKyAqIHBhcnQgYW5kIHByZXBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGJlZ2lubmluZwogICovCiBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBjb25jYXRXaXRoKAogCWNoYXJbXSBuYW1lLApAQCAtOTc2LDcgKzEyNTEsNyBAQAogICogICAgPT4gcmVzdWx0ID0geyAnYycgfQogICogPC9wcmU+PC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQogICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCkBAIC0xMDMyLDcgKzEzMDcsNyBAQAogICogICAgPT4gcmVzdWx0ID0geyB9CiAgKiA8L3ByZT48L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGdpdmVuIHNlcGFyYXRvcgogICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2ggcGFydApAQCAtMTA3Miw3ICsxMzQ3LDcgQEAKIAogLyoqCiAgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFuIG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gKiAKKyAqCiAgKiA8YnI+CiAgKiA8YnI+CiAgKiBGb3IgZXhhbXBsZToKQEAgLTEwOTAsNyArMTM2NSw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIGNoYXJhY3RlciB0aGUgY2hhcmFjdGVyIHRvIHNlYXJjaAogICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0aGUgc2VhcmNoIGlzIGRvbmUKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXJyYXkgY29udGFpbnMgYW4gb2NjdXJyZW5jZSBvZiBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KQEAgLTExMDgsNyArMTM4Myw3IEBACiAKIC8qKgogICogQW5zd2VycyB0cnVlIGlmIHRoZSBhcnJheSBjb250YWlucyBhbiBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgotICogCisgKgogICogPGJyPgogICogPGJyPgogICogRm9yIGV4YW1wbGU6CkBAIC0xMTI2LDcgKzE0MDEsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBjaGFyYWN0ZXIgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdGhlIHNlYXJjaCBpcyBkb25lCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFuIG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCkBAIC0xMTQxLDcgKzE0MTYsNyBAQAogCiAvKioKICAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgYXJyYXkgY29udGFpbnMgYW4gb2NjdXJyZW5jZSBvZiBvbmUgb2YgdGhlIGNoYXJhY3RlcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAqIAorICoKICAqIDxicj4KICAqIDxicj4KICAqIEZvciBleGFtcGxlOgpAQCAtMTE1OSw3ICsxNDM0LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gY2hhcmFjdGVycyB0aGUgY2hhcmFjdGVycyB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdGhlIHNlYXJjaCBpcyBkb25lCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFuIG9jY3VycmVuY2Ugb2Ygb25lIG9mIHRoZSBjaGFyYWN0ZXJzLCBmYWxzZSBvdGhlcndpc2UuCkBAIC0xMTc2LDcgKzE0NTEsNyBAQAogCiAvKioKICAqIEFuc3dlcnMgYSBkZWVwIGNvcHkgb2YgdGhlIHRvQ29weSBhcnJheS4KLSAqIAorICoKICAqIEBwYXJhbSB0b0NvcHkgdGhlIGFycmF5IHRvIGNvcHkKICAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhlIHRvQ29weSBhcnJheS4KICAqLwpAQCAtMTE5NSw3ICsxNDcwLDcgQEAKIH0KIAogLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiBhcnJheSBlbmRzIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRvQmVGb3VuZCwgCisgKiBSZXR1cm4gdHJ1ZSBpZiBhcnJheSBlbmRzIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRvQmVGb3VuZCwKICAqIG90aGVyd2lzZSBmYWxzZS4KICAqIDxicj4KICAqIDxicj4KQEAgLTEyMTQsMTAgKzE0ODksMTAgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGNoZWNrCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBhcnJheSB0byBmaW5kCi0gKiBAcmV0dXJuIHRydWUgaWYgYXJyYXkgZW5kcyB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiB0b0JlRm91bmQsIAorICogQHJldHVybiB0cnVlIGlmIGFycmF5IGVuZHMgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBjb250YWluZWQgaW4gdG9CZUZvdW5kLAogICogb3RoZXJ3aXNlIGZhbHNlLgogICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsIG9yIHRvQmVGb3VuZCBpcyBudWxsCiAgKi8KQEAgLTEyODYsNyArMTU2MSw3IEBACiAvKioKICAqIElmIGlzQ2FzZVNlbnNpdGUgaXMgdHJ1ZSwgYW5zd2VycyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyCiAgKiBieSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBmYWxzZS4KLSAqIElmIGl0IGlzIGZhbHNlLCBhbnN3ZXJzIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbCBjaGFyYWN0ZXIgYnkgCisgKiBJZiBpdCBpcyBmYWxzZSwgYW5zd2VycyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5CiAgKiBjaGFyYWN0ZXIgd2l0aG91dCBjaGVja2luZyB0aGUgY2FzZSwgb3RoZXJ3aXNlIGZhbHNlLgogICogPGJyPgogICogPGJyPgpAQCAtMTMyMSw3ICsxNTk2LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5CiAgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgY2hlY2sgd2hldGhlciBvciBub3QgdGhlIGVxdWFsaXR5IHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQpAQCAtMTQ1Miw3ICsxNzI3LDcgQEAKIH0KIC8qKgogICogPHA+QW5zd2VycyB0cnVlIGlmIHRoZSBmaXJzdCBhcnJheSBpcyBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciB0byBhIHBvcnRpb24gb2YgdGhlIHNlY29uZCBhcnJheQotICogZGVsaW1pdGVkIGZyb20gcG9zaXRpb24gc2Vjb25kU3RhcnQgKGluY2x1c2l2ZSkgdG8gc2Vjb25kRW5kKGV4Y2x1c2l2ZSksIG90aGVyd2lzZSBmYWxzZS4gVGhlIGVxdWFsaXR5IGNvdWxkIGJlIGVpdGhlciAKKyAqIGRlbGltaXRlZCBmcm9tIHBvc2l0aW9uIHNlY29uZFN0YXJ0IChpbmNsdXNpdmUpIHRvIHNlY29uZEVuZChleGNsdXNpdmUpLCBvdGhlcndpc2UgZmFsc2UuIFRoZSBlcXVhbGl0eSBjb3VsZCBiZSBlaXRoZXIKICAqIGNhc2Ugc2Vuc2l0aXZlIG9yIGNhc2UgaW5zZW5zaXRpdmUgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+aXNDYXNlU2Vuc2l0aXZlPC9jb2RlPiBwYXJhbWV0ZXIuCiAgKiA8L3A+CiAgKiA8cD5Gb3IgZXhhbXBsZTo8L3A+CkBAIC0xNTMzLDcgKzE4MDgsNyBAQAogLyoqCiAgKiBJZiBpc0Nhc2VTZW5zaXRlIGlzIHRydWUsIGFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlcgogICogYnkgY2hhcmFjdGVyLCBvdGhlcndpc2UgZmFsc2UuCi0gKiBJZiBpdCBpcyBmYWxzZSwgYW5zd2VycyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IAorICogSWYgaXQgaXMgZmFsc2UsIGFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlciBieQogICogY2hhcmFjdGVyIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGNhc2UsIG90aGVyd2lzZSBmYWxzZS4KICAqIDxicj4KICAqIDxicj4KQEAgLTE1NjgsNyArMTg0Myw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheQogICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIGFycmF5CiAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBlcXVhbGl0eSBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKQEAgLTE1OTksNyArMTg3NCw3IEBACiAKIC8qKgogICogSWYgaXNDYXNlU2Vuc2l0ZSBpcyB0cnVlLCB0aGUgZXF1YWxpdHkgaXMgY2FzZSBzZW5zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBjYXNlIGluc2Vuc2l0aXZlLgotICogCisgKgogICogQW5zd2VycyB0cnVlIGlmIHRoZSBuYW1lIGNvbnRhaW5zIHRoZSBmcmFnbWVudCBhdCB0aGUgc3RhcnRpbmcgaW5kZXggc3RhcnRJbmRleCwgb3RoZXJ3aXNlIGZhbHNlLgogICogPGJyPgogICogPGJyPgpAQCAtMTYzOCwxMiArMTkxMywxMiBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdG8gY2hlY2sKICAqIEBwYXJhbSBuYW1lIHRoZSBhcnJheSB0byBjaGVjawogICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIHN0YXJ0aW5nIGluZGV4CiAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBlcXVhbGl0eSBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBjb250YWlucyB0aGUgZnJhZ21lbnQgYXQgdGhlIHN0YXJ0aW5nIGluZGV4IHN0YXJ0SW5kZXggYWNjb3JkaW5nIHRvIHRoZSAKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBjb250YWlucyB0aGUgZnJhZ21lbnQgYXQgdGhlIHN0YXJ0aW5nIGluZGV4IHN0YXJ0SW5kZXggYWNjb3JkaW5nIHRvIHRoZQogICogdmFsdWUgb2YgaXNDYXNlU2Vuc2l0aXZlLCBvdGhlcndpc2UgZmFsc2UuCiAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGZyYWdtZW50IG9yIG5hbWUgaXMgbnVsbC4KICAqLwpAQCAtMTY3NSw3ICsxOTUwLDcgQEAKIAogLyoqCiAgKiBBbnN3ZXJzIGEgaGFzaGNvZGUgZm9yIHRoZSBhcnJheQotICogCisgKgogICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBmb3Igd2hpY2ggYSBoYXNoY29kZSBpcyByZXF1aXJlZAogICogQHJldHVybiB0aGUgaGFzaGNvZGUKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbApAQCAtMTcxMSw3ICsxOTg2LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gYyB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrCiAgKiBAcmV0dXJuIHRydWUgaWYgYyBpcyBhIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIHRoZSBKTFMsIG90aGVyd2lzZSBmYWxzZS4KICAqLwpAQCAtMTczOSw3ICsyMDE0LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkCiAgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpcwpAQCAtMTc3MCw3ICsyMDQ1LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBzdWJhcnJheSB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgZmxhZyB0byBrbm93IGlmIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKQEAgLTE4MDMsMTEgKzIwNzgsMTEgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBzdWJhcnJheSB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgZmxhZyB0byBrbm93IGlmIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKLSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggCisgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4CiAgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSB0b0JlRm91bmQgYXJyYXkgaXMgYSBtYXRjaGluZwogICogc3ViYXJyYXkgZm9sbG93aW5nIHRoZSBjYXNlIHJ1bGUgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHN0YXJ0LCAtMSBvdGhlcndpc2UKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbCBvciB0b0JlRm91bmQgaXMgbnVsbApAQCAtMTgzNyw3ICsyMTEyLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBzdWJhcnJheSB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgZmxhZyB0byBrbm93IGlmIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKQEAgLTE4NTEsNyArMjEyNiw3IEBACiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRleE9mKGZpbmFsIGNoYXJbXSB0b0JlRm91bmQsIGZpbmFsIGNoYXJbXSBhcnJheSwgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgewogCWZpbmFsIGludCBhcnJheUxlbmd0aCA9IGVuZDsKIAlmaW5hbCBpbnQgdG9CZUZvdW5kTGVuZ3RoID0gdG9CZUZvdW5kLmxlbmd0aDsKLQlpZiAodG9CZUZvdW5kTGVuZ3RoID4gYXJyYXlMZW5ndGgpIHJldHVybiAtMTsKKwlpZiAodG9CZUZvdW5kTGVuZ3RoID4gYXJyYXlMZW5ndGggfHwgc3RhcnQgPCAwKSByZXR1cm4gLTE7CiAJaWYgKHRvQmVGb3VuZExlbmd0aCA9PSAwKSByZXR1cm4gMDsKIAlpZiAodG9CZUZvdW5kTGVuZ3RoID09IGFycmF5TGVuZ3RoKSB7CiAJCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKQEAgLTE5MTgsNyArMjE5Myw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIHRvQmVGb3VuZCB0aGUgY2hhcmFjdGVyIHRvIHNlYXJjaAogICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0byBiZSBzZWFyY2hlZAogICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleApAQCAtMTk2NCw3ICsyMjM5LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkCiAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IChpbmNsdXNpdmUpCkBAIC0yMDk5LDcgKzIzNzQsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKICAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBzdG9wcGluZyBpbmRleApAQCAtMjEyOCw3ICsyNDAzLDcgQEAKICAqIDxwcmU+CiAgKiAJbGFzdFNlZ21lbnQoImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCksJy4nKSAtLT4gT2JqZWN0CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkKICAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGdpdmVuIHNlcGFyYXRvcgogICogQHJldHVybiB0aGUgbGFzdCBwb3J0aW9uIG9mIGEgbmFtZSBnaXZlbiBhIHNlcGFyYXRvcgpAQCAtMjE3NSw3ICsyNDUwLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgZmxhZyB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKQEAgLTIyMjksMTMgKzI1MDQsMTMgQEAKICAqICAgIHBhdHRlcm5FbmQgPSAyCiAgKiAgICBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0KICAqICAgIG5hbWVTdGFydCA9IDEKLSAqICAgIG5hbWVFbmQgPSAyCisgKiAgICBuYW1lRW5kID0gNAogICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQogICogICAgcmVzdWx0ID0+IGZhbHNlCiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KICAqIEBwYXJhbSBwYXR0ZXJuU3RhcnQgdGhlIGdpdmVuIHBhdHRlcm4gc3RhcnQKICAqIEBwYXJhbSBwYXR0ZXJuRW5kIHRoZSBnaXZlbiBwYXR0ZXJuIGVuZApAQCAtMjI2OCwxMCArMjU0MywxNyBAQAogCiAJLyogY2hlY2sgZmlyc3Qgc2VnbWVudCAqLwogCWNoYXIgcGF0dGVybkNoYXIgPSAwOwotCXdoaWxlICgoaVBhdHRlcm4gPCBwYXR0ZXJuRW5kKQotCQkmJiAocGF0dGVybkNoYXIgPSBwYXR0ZXJuW2lQYXR0ZXJuXSkgIT0gJyonKSB7Ci0JCWlmIChpTmFtZSA9PSBuYW1lRW5kKQotCQkJcmV0dXJuIGZhbHNlOworCXdoaWxlICh0cnVlKSB7CisJCWlmIChpUGF0dGVybiA9PSBwYXR0ZXJuRW5kKSB7CisJCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCkgcmV0dXJuIHRydWU7IC8vIHRoZSBjaGFycyBtYXRjaAorCQkJcmV0dXJuIGZhbHNlOyAvLyBwYXR0ZXJuIGhhcyBlbmRlZCBidXQgbm90IHRoZSBuYW1lLCBubyBtYXRjaAorCQl9IAorCQlpZiAoKHBhdHRlcm5DaGFyID0gcGF0dGVybltpUGF0dGVybl0pID09ICcqJykgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGlOYW1lID09IG5hbWVFbmQpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gbmFtZSBoYXMgZW5kZWQgYnV0IG5vdCB0aGUgcGF0dGVybgorCQl9CiAJCWlmIChwYXR0ZXJuQ2hhcgogCQkJIT0gKGlzQ2FzZVNlbnNpdGl2ZQogCQkJCT8gbmFtZVtpTmFtZV0KQEAgLTIzMjQsMTggKzI2MDYsMTggQEAKIAogLyoqCiAgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZmlsZXBhdGggdXNpbmcgdGhlIHBhdGhTZXBhdGF0b3IsIGZhbHNlIG90aGVyd2lzZS4KLSAqIAorICoKICAqIFBhdGggY2hhcltdIHBhdHRlcm4gbWF0Y2hpbmcsIGFjY2VwdGluZyB3aWxkLWNhcmRzICcqKicsICcqJyBhbmQgJz8nICh1c2luZyBBbnQgZGlyZWN0b3J5IHRhc2tzCiAgKiBjb252ZW50aW9ucywgYWxzbyBzZWUgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L21hbnVhbC9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyIpLgogICogUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGlzIGVuaGFuY2luZyByZWd1bGFyIHBhdHRlcm4gbWF0Y2hpbmcgaW4gc3VwcG9ydGluZyBleHRyYSBydWxlIHdoZXJlICcqKicgcmVwcmVzZW50CiAgKiBhbnkgZm9sZGVyIGNvbWJpbmF0aW9uLgotICogU3BlY2lhbCBydWxlOiAKLSAqIC0gZm9vXCAgaXMgZXF1aXZhbGVudCB0byBmb29cKiogICAKKyAqIFNwZWNpYWwgcnVsZToKKyAqIC0gZm9vXCAgaXMgZXF1aXZhbGVudCB0byBmb29cKioKICAqIFdoZW4gbm90IGNhc2Ugc2Vuc2l0aXZlLCB0aGUgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgbG93ZXJjYXNlZCwgdGhlCiAgKiBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyIGNoYXJhY3RlciBhcyBjb21wYXJpbmcuCi0gKiAKKyAqCiAgKiBAcGFyYW0gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgotICogQHBhcmFtIGZpbGVwYXRoIHRoZSBnaXZlbiBwYXRoIAorICogQHBhcmFtIGZpbGVwYXRoIHRoZSBnaXZlbiBwYXRoCiAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHRvIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKICAqIEBwYXJhbSBwYXRoU2VwYXJhdG9yIHRoZSBnaXZlbiBwYXRoIHNlcGFyYXRvcgogICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGZpbGVwYXRoIHVzaW5nIHRoZSBwYXRoU2VwYXRhdG9yLCBmYWxzZSBvdGhlcndpc2UKQEAgLTIzOTQsNyArMjY3Niw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAotCQkvLyBqdW1wIHRvIG5leHQgc2VnbWVudAkJCisJCS8vIGp1bXAgdG8gbmV4dCBzZWdtZW50CiAJCXBTZWdtZW50RW5kID0KIAkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZigKIAkJCQlwYXRoU2VwYXJhdG9yLApAQCAtMjQzMyw3ICsyNzE1LDcgQEAKIAl9CiAJaW50IGZTZWdtZW50UmVzdGFydCA9IGZTZWdtZW50U3RhcnQ7CiAJY2hlY2tTZWdtZW50IDogd2hpbGUgKGZTZWdtZW50U3RhcnQgPCBmTGVuZ3RoKSB7Ci0JCQkKKwogCQlpZiAocFNlZ21lbnRTdGFydCA+PSBwTGVuZ3RoKSB7CiAJCQlpZiAoZnJlZVRyYWlsaW5nRG91YmxlU3RhcikgcmV0dXJuIHRydWU7CiAJCQkvLyBtaXNtYXRjaCAtIHJlc3RhcnQgY3VycmVudCBwYXRoIHNlZ21lbnQKQEAgLTI0NDEsNyArMjcyMyw3IEBACiAJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIHBhdHRlcm4sIHBTZWdtZW50U3RhcnQgPSBwU2VnbWVudFJlc3RhcnQpOwogCQkJaWYgKHBTZWdtZW50RW5kIDwgMCkgcFNlZ21lbnRFbmQgPSBwTGVuZ3RoOwogCi0JCQlmU2VnbWVudFJlc3RhcnQgPSAKKwkJCWZTZWdtZW50UmVzdGFydCA9CiAJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIGZpbGVwYXRoLCBmU2VnbWVudFJlc3RhcnQgKyAxKTsKIAkJCS8vIHNraXAgc2VwYXJhdG9yCiAJCQlpZiAoZlNlZ21lbnRSZXN0YXJ0IDwgMCkgewpAQCAtMjQ1NCw3ICsyNzM2LDcgQEAKIAkJCWlmIChmU2VnbWVudEVuZCA8IDApIGZTZWdtZW50RW5kID0gZkxlbmd0aDsKIAkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKIAkJfQotCQkKKwogCQkvKiBwYXRoIHNlZ21lbnQgaXMgZW5kaW5nICovCiAJCWlmIChwU2VnbWVudEVuZCA9PSBwU2VnbWVudFN0YXJ0ICsgMgogCQkJJiYgcGF0dGVybltwU2VnbWVudFN0YXJ0XSA9PSAnKicKQEAgLTI0ODIsNyArMjc2NCw3IEBACiAJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIHBhdHRlcm4sIHBTZWdtZW50U3RhcnQgPSBwU2VnbWVudFJlc3RhcnQpOwogCQkJaWYgKHBTZWdtZW50RW5kIDwgMCkgcFNlZ21lbnRFbmQgPSBwTGVuZ3RoOwogCi0JCQlmU2VnbWVudFJlc3RhcnQgPSAKKwkJCWZTZWdtZW50UmVzdGFydCA9CiAJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIGZpbGVwYXRoLCBmU2VnbWVudFJlc3RhcnQgKyAxKTsKIAkJCS8vIHNraXAgc2VwYXJhdG9yCiAJCQlpZiAoZlNlZ21lbnRSZXN0YXJ0IDwgMCkgewpAQCAtMjQ5NSw3ICsyNzc3LDcgQEAKIAkJCWlmIChmU2VnbWVudEVuZCA8IDApIGZTZWdtZW50RW5kID0gZkxlbmd0aDsKIAkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKIAkJfQotCQkvLyBqdW1wIHRvIG5leHQgc2VnbWVudAkJCisJCS8vIGp1bXAgdG8gbmV4dCBzZWdtZW50CiAJCXBTZWdtZW50RW5kID0KIAkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZigKIAkJCQlwYXRoU2VwYXJhdG9yLApAQCAtMjUyNSw3ICsyODA3LDcgQEAKIAogLyoqCiAgKiBBbnN3ZXJzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gYXJyYXksIDAgaWYgYW55LgotICogCisgKgogICogPGJyPgogICogPGJyPgogICogRm9yIGV4YW1wbGU6CkBAIC0yNTQzLDcgKzI4MjUsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGdpdmVuIGNoYXJhY3RlcgogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIGFycmF5LCAwIGlmIGFueQpAQCAtMjU2MCw3ICsyODQyLDcgQEAKIC8qKgogICogQW5zd2VycyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nCiAgKiBhdCB0aGUgZ2l2ZW4gaW5kZXgsIDAgaWYgYW55LgotICogCisgKgogICogPGJyPgogICogPGJyPgogICogRm9yIGV4YW1wbGU6CkBAIC0yNTgwLDcgKzI4NjIsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGdpdmVuIGNoYXJhY3RlcgogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBpbmRleApAQCAtMjU5OCw3ICsyODgwLDI5IEBACiAJCQljb3VudCsrOwogCXJldHVybiBjb3VudDsKIH0KLQorLyoqCisgKiBSZXR1cm4gdGhlIGludCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZGVzaWduYXRlZCBzdWJwYXJ0IG9mIGFycmF5LiBUaGUKKyAqIGNhbGN1bGF0aW9uIG9mIHRoZSByZXN1bHQgZm9yIHNpbmdsZS1kaWdpdCBwb3NpdGl2ZSBpbnRlZ2VycyBpcyBvcHRpbWl6ZWQgaW4KKyAqIHRpbWUuCisgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHdpdGhpbiB3aGljaCB0aGUgaW50IHZhbHVlIGlzIHRvIGJlIHBhcnNlZAorICogQHBhcmFtIHN0YXJ0IGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaW50IHZhbHVlIGluIGFycmF5CisgKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgaW50IHZhbHVlIGluIGFycmF5CisgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgYSBzdWJwYXJ0IG9mIGFycmF5CisgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgZGVzaWduYXRlZCBzdWJwYXJ0IG9mIGFycmF5IGRvZXMgbm90CisgKiAgICAgICAgIHBhcnNlIHRvIGFuIGludAorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZUludChjaGFyW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisJaWYgKGxlbmd0aCA9PSAxKSB7CisJCWludCByZXN1bHQgPSBhcnJheVtzdGFydF0gLSAnMCc7CisJCWlmIChyZXN1bHQgPCAwIHx8IHJlc3VsdCA+IDkpIHsKKwkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oImludmFsaWQgZGlnaXQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyhhcnJheSwgc3RhcnQsIGxlbmd0aCkpOworCX0KK30KIC8qKgogICogQW5zd2VycyB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAqIFRoZSBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgpAQCAtMjYxOSw3ICsyOTIzLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gcHJlZml4IHRoZSBnaXZlbiBwcmVmaXgKICAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCkBAIC0yNjYwLDcgKzI5NjQsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBwcmVmaXggdGhlIGdpdmVuIHByZWZpeAogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgdG8gZmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIGNvbXBhcmlzb24gc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlCkBAIC0yNjcxLDMxICsyOTc1LDY5IEBACiAJY2hhcltdIHByZWZpeCwKIAljaGFyW10gbmFtZSwKIAlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCXJldHVybiBwcmVmaXhFcXVhbHMocHJlZml4LCBuYW1lLCBpc0Nhc2VTZW5zaXRpdmUsIDApOworfQorCisvKioKKyAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSwgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gaW5kZXgsIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsCisgKiBmYWxzZSBvdGhlcndpc2UuIGlzQ2FzZVNlbnNpdGl2ZSBpcyB1c2VkIHRvIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSBjb21wYXJpc29uIHNob3VsZCBiZQorICogY2FzZSBzZW5zaXRpdmUuCisgKiA8YnI+CisgKiA8YnI+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxvbD4KKyAqIDxsaT48cHJlPgorICogICAgcHJlZml4ID0geyAnYScgLCAnQicgfQorICogICAgbmFtZSA9IHsgJ2MnLCAnZCcsICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKyAqICAgIHN0YXJ0SW5kZXggPSAyCisgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZQorICogICAgcmVzdWx0ID0+IHRydWUKKyAqIDwvcHJlPgorICogPC9saT4KKyAqIDxsaT48cHJlPgorICogICAgcHJlZml4ID0geyAnYScgLCAnQicgfQorICogICAgbmFtZSA9IHsgJ2MnLCAnZCcsICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKyAqICAgIHN0YXJ0SW5kZXggPSAyCisgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlCisgKiAgICByZXN1bHQgPT4gZmFsc2UKKyAqIDwvcHJlPgorICogPC9saT4KKyAqIDwvb2w+CisgKgorICogQHBhcmFtIHByZWZpeCB0aGUgZ2l2ZW4gcHJlZml4CisgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSB0byBmaW5kIG91dCB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcGFyaXNvbiBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKKyAqIEBwYXJhbSBzdGFydEluZGV4IGluZGV4IGZyb20gd2hpY2ggdGhlIHByZWZpeCBzaG91bGQgYmUgc2VhcmNoZWQgaW4gdGhlIG5hbWUKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UKKyAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIG5hbWUgaXMgbnVsbCBvciBpZiB0aGUgZ2l2ZW4gcHJlZml4IGlzIG51bGwKKyAqIEBzaW5jZSAzLjcKKyAqLworcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHByZWZpeEVxdWFscygKKwljaGFyW10gcHJlZml4LAorCWNoYXJbXSBuYW1lLAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLAorCWludCBzdGFydEluZGV4KSB7CiAKIAlpbnQgbWF4ID0gcHJlZml4Lmxlbmd0aDsKLQlpZiAobmFtZS5sZW5ndGggPCBtYXgpCisJaWYgKG5hbWUubGVuZ3RoIC0gc3RhcnRJbmRleCA8IG1heCkKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJZm9yIChpbnQgaSA9IG1heDsKLQkJCS0taSA+PSAwOwotCQkJKSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCi0JCQlpZiAocHJlZml4W2ldICE9IG5hbWVbaV0pCisJCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQorCQkJaWYgKHByZWZpeFtpXSAhPSBuYW1lW3N0YXJ0SW5kZXggKyBpXSkKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCWZvciAoaW50IGkgPSBtYXg7Ci0JCS0taSA+PSAwOwotCQkpIC8vIGFzc3VtZXMgdGhlIHByZWZpeCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIG5hbWUKKwlmb3IgKGludCBpID0gbWF4OyAtLWkgPj0gMDspIC8vIGFzc3VtZXMgdGhlIHByZWZpeCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIG5hbWUKIAkJaWYgKFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2UocHJlZml4W2ldKQotCQkJIT0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShuYW1lW2ldKSkKKwkJCSE9IFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2UobmFtZVtzdGFydEluZGV4ICsgaV0pKQogCQkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQogCiAvKioKICAqIEFuc3dlcnMgYSBuZXcgYXJyYXkgcmVtb3ZpbmcgYSBnaXZlbiBjaGFyYWN0ZXIuIEFuc3dlcnMgdGhlIGdpdmVuIGFycmF5IGlmIHRoZXJlIGlzCi0gKiBubyBvY2N1cmVuY2Ugb2YgdGhlIGNoYXJhY3RlciB0byByZW1vdmUuCisgKiBubyBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgogICogPGJyPgogICogPGJyPgogICogRm9yIGV4YW1wbGU6CkBAIC0yNzEzLDcgKzMwNTUsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSB0b0JlUmVtb3ZlZCB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlbW92ZWQKICAqIEByZXR1cm4gYSBuZXcgYXJyYXkgcmVtb3ZpbmcgZ2l2ZW4gY2hhcmFjdGVyCkBAIC0yNzQ0LDcgKzMwODYsNyBAQAogfQogCiAvKioKLSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSByZW1wbGFjZW1lbnQgY2hhcmFjdGVyIGluIHRoZQorICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpbiB0aGUKICAqIGdpdmVuIGFycmF5LgogICogPGJyPgogICogPGJyPgpAQCAtMjc2NSw3ICszMTA3LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAgKiBAcGFyYW0gdG9CZVJlcGxhY2VkIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVwbGFjZWQKICAqIEBwYXJhbSByZXBsYWNlbWVudENoYXIgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlcgpAQCAtMjc4NCw3ICszMTI2LDcgQEAKIH0KIAogLyoqCi0gKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlbXBsYWNlbWVudCBjaGFyYWN0ZXIgaW4gdGhlCisgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpbiB0aGUKICAqIGdpdmVuIGFycmF5LgogICogPGJyPgogICogPGJyPgpAQCAtMjc5OCw3ICszMTQwLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAgKiBAcGFyYW0gdG9CZVJlcGxhY2VkIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQKICAqIEBwYXJhbSByZXBsYWNlbWVudENoYXIgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlcgpAQCAtMjgxMCw3ICszMTUyLDcgQEAKIH0KIAogLyoqCi0gKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlbXBsYWNlbWVudCBjaGFyYWN0ZXIgaW4gdGhlCisgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpbiB0aGUKICAqIGdpdmVuIGFycmF5IGZyb20gdGhlIHN0YXJ0IHBvc2l0aW9uIChpbmNsdXNpdmUpIHRvIHRoZSBlbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkuCiAgKiA8YnI+CiAgKiA8YnI+CkBAIC0yODI2LDcgKzMxNjgsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSB0b0JlUmVwbGFjZWQgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZAogICogQHBhcmFtIHJlcGxhY2VtZW50Q2hhciB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCkBAIC0yODY0LDcgKzMyMDYsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSB0b0JlUmVwbGFjZWQgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZAogICogQHBhcmFtIHJlcGxhY2VtZW50Q2hhcnMgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMKQEAgLTI5MjgsNyArMzI3MCw3IEBACiB9CiAKIC8qKgotICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlbXBsYWNlbWVudCBjaGFyYWN0ZXIgCisgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCiAgKiBpbiBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5LiBSZXR1cm5zIHRoZSBnaXZlbiBhcnJheSBpZiBubyBvY2N1cnJlbmNlcyBvZiB0aGUgY2hhcmFjdGVyCiAgKiB0byBiZSByZXBsYWNlZCBhcmUgZm91bmQuCiAgKiA8YnI+CkBAIC0yOTUwLDcgKzMyOTIsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSB0b0JlUmVwbGFjZWQgdGhlIGNoYXJhY3RlciB0byBiZSByZXBsYWNlZAogICogQHBhcmFtIHJlcGxhY2VtZW50Q2hhciB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCkBAIC0yOTYxLDcgKzMzMDMsNyBAQAogCWNoYXJbXSBhcnJheSwKIAljaGFyIHRvQmVSZXBsYWNlZCwKIAljaGFyIHJlcGxhY2VtZW50Q2hhcikgewotCQorCiAJY2hhcltdIHJlc3VsdCA9IG51bGw7CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCWNoYXIgYyA9IGFycmF5W2ldOwpAQCAtMjk4MCw3ICszMzIyLDcgQEAKIH0KIAogLyoqCi0gKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlciBhbmQgdHJpbWluZyBlYWNoIHN1YmFycmF5IHRvIHJlbW92ZQorICogUmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gYXJyYXkgdXNpbmcgdGhlIGdpdmVuIGRpdmlkZXIgYW5kIHRyaW1taW5nIGVhY2ggc3ViYXJyYXkgdG8gcmVtb3ZlCiAgKiB3aGl0ZXNwYWNlcyBlcXVhbHMgdG8gJyAnLgogICogPGJyPgogICogPGJyPgpAQCAtMzAxMSwxMCArMzM1MywxMCBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBkaXZpZGVyIHRoZSBnaXZlbiBkaXZpZGVyCiAgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5Ci0gKiBAcmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gYXJyYXkgdXNpbmcgdGhlIGdpdmVuIGRpdmlkZXIgYW5kIHRyaW1pbmcgZWFjaCBzdWJhcnJheSB0byByZW1vdmUKKyAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlciBhbmQgdHJpbW1pbmcgZWFjaCBzdWJhcnJheSB0byByZW1vdmUKICAqIHdoaXRlc3BhY2VzIGVxdWFscyB0byAnICcKICAqLwogcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBzcGxpdEFuZFRyaW1PbihjaGFyIGRpdmlkZXIsIGNoYXJbXSBhcnJheSkgewpAQCAtMzA4NSw3ICszNDI3LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gZGl2aWRlciB0aGUgZ2l2ZW4gZGl2aWRlcgogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyCkBAIC0zMTE5LDcgKzM0NjEsNyBAQAogfQogCiAvKioKLSAqIFJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyLiBUaGUgZ2l2ZW4gZW5kIAorICogUmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gYXJyYXkgdXNpbmcgdGhlIGdpdmVuIGRpdmlkZXIuIFRoZSBnaXZlbiBlbmQKICAqIGlzIGV4Y2x1c2l2ZSBhbmQgdGhlIGdpdmVuIHN0YXJ0IGlzIGluY2x1c2l2ZS4KICAqIDxicj4KICAqIDxicj4KQEAgLTMxMzQsNyArMzQ3Niw3IEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogCisgKgogICogQHBhcmFtIGRpdmlkZXIgdGhlIGdpdmVuIGRpdmlkZXIKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSBzdGFydCB0aGUgZ2l2ZW4gc3RhcnRpbmcgaW5kZXgKQEAgLTMxNzUsOSArMzUxNyw5IEBACiB9CiAKIC8qKgotICogQW5zd2VycyBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgCisgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0IGFuZAogICogZW5kaW5nIGF0IHRoZSBnaXZlbiBlbmQuIFRoZSBnaXZlbiBzdGFydCBpcyBpbmNsdXNpdmUgYW5kIHRoZSBnaXZlbiBlbmQgaXMgZXhjbHVzaXZlLgotICogQW5zd2VycyBudWxsIGlmIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiBlbmQsIGlmIHN0YXJ0IGlzIGxvd2VyIHRoYW4gMCBvciBpZiBlbmQgaXMgZ3JlYXRlciAKKyAqIEFuc3dlcnMgbnVsbCBpZiBzdGFydCBpcyBncmVhdGVyIHRoYW4gZW5kLCBpZiBzdGFydCBpcyBsb3dlciB0aGFuIDAgb3IgaWYgZW5kIGlzIGdyZWF0ZXIKICAqIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYXJyYXkuIElmIGVuZCAgZXF1YWxzIC0xLCBpdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGFycmF5IGxlbmd0aC4KICAqIDxicj4KICAqIDxicj4KQEAgLTMxOTgsMTEgKzM1NDAsMTEgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAgCisgKgogICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQogICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydGluZyBpbmRleAogICogQHBhcmFtIGVuZCB0aGUgZ2l2ZW4gZW5kaW5nIGluZGV4Ci0gKiBAcmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0IGFuZCAKKyAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBhcnJheSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kCiAgKiBlbmRpbmcgYXQgdGhlIGdpdmVuIGVuZAogICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbnVsbAogICovCkBAIC0zMjIyLDkgKzM1NjQsOSBAQAogfQogCiAvKioKLSAqIEFuc3dlcnMgYSBuZXcgYXJyYXkgd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBhcnJheSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIAorICogQW5zd2VycyBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQKICAqIGVuZGluZyBhdCB0aGUgZ2l2ZW4gZW5kLiBUaGUgZ2l2ZW4gc3RhcnQgaXMgaW5jbHVzaXZlIGFuZCB0aGUgZ2l2ZW4gZW5kIGlzIGV4Y2x1c2l2ZS4KLSAqIEFuc3dlcnMgbnVsbCBpZiBzdGFydCBpcyBncmVhdGVyIHRoYW4gZW5kLCBpZiBzdGFydCBpcyBsb3dlciB0aGFuIDAgb3IgaWYgZW5kIGlzIGdyZWF0ZXIgCisgKiBBbnN3ZXJzIG51bGwgaWYgc3RhcnQgaXMgZ3JlYXRlciB0aGFuIGVuZCwgaWYgc3RhcnQgaXMgbG93ZXIgdGhhbiAwIG9yIGlmIGVuZCBpcyBncmVhdGVyCiAgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5LiBJZiBlbmQgIGVxdWFscyAtMSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBhcnJheSBsZW5ndGguCiAgKiA8YnI+CiAgKiA8YnI+CkBAIC0zMjQ1LDExICszNTg3LDExIEBACiAgKiA8L3ByZT4KICAqIDwvbGk+CiAgKiA8L29sPgotICogIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEBwYXJhbSBzdGFydCB0aGUgZ2l2ZW4gc3RhcnRpbmcgaW5kZXgKICAqIEBwYXJhbSBlbmQgdGhlIGdpdmVuIGVuZGluZyBpbmRleAotICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgCisgKiBAcmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0IGFuZAogICogZW5kaW5nIGF0IHRoZSBnaXZlbiBlbmQKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFycmF5IGlzIG51bGwKICAqLwpAQCAtMzI4Nyw3ICszNjI5LDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIHRvIGNvbnZlcnQKICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBhIGNoYXJbXSBjb252ZXJzaW9uIHRvIGxvd2VyY2FzZQogICovCkBAIC0zMzE1LDYgKzM2NTcsNTQgQEAKIH0KIAogLyoqCisgKiBBbnN3ZXJzIHRoZSByZXN1bHQgb2YgYSBjaGFyW10gY29udmVyc2lvbiB0byB1cHBlcmNhc2UuIEFuc3dlcnMgbnVsbCBpZiB0aGUgZ2l2ZW4gY2hhcnMgYXJyYXkgaXMgbnVsbC4KKyAqIDxicj4KKyAqIE5PVEU6IElmIG5vIGNvbnZlcnNpb24gd2FzIG5lY2Vzc2FyeSwgdGhlbiBhbnN3ZXJzIGJhY2sgdGhlIGFyZ3VtZW50IG9uZS4KKyAqIDxicj4KKyAqIDxicj4KKyAqIEZvciBleGFtcGxlOgorICogPG9sPgorICogPGxpPjxwcmU+CisgKiAgICBjaGFycyA9IHsgJ0EnICwgJ0InIH0KKyAqICAgIHJlc3VsdCA9PiB7ICdBJyAsICdCJyB9CisgKiA8L3ByZT4KKyAqIDwvbGk+CisgKiA8bGk+PHByZT4KKyAqICAgIGFycmF5ID0geyAnYScsICdCJyB9CisgKiAgICByZXN1bHQgPT4geyAnQScgLCAnQicgfQorICogPC9wcmU+CisgKiA8L2xpPgorICogPC9vbD4KKyAqCisgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIHRvIGNvbnZlcnQKKyAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBhIGNoYXJbXSBjb252ZXJzaW9uIHRvIHVwcGVyY2FzZQorICogCisgKiBAc2luY2UgMy41CisgKi8KK2ZpbmFsIHN0YXRpYyBwdWJsaWMgY2hhcltdIHRvVXBwZXJDYXNlKGNoYXJbXSBjaGFycykgeworCWlmIChjaGFycyA9PSBudWxsKQorCQlyZXR1cm4gbnVsbDsKKwlpbnQgbGVuZ3RoID0gY2hhcnMubGVuZ3RoOworCWNoYXJbXSB1cHBlckNoYXJzID0gbnVsbDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNoYXIgYyA9IGNoYXJzW2ldOworCQljaGFyIGxjID0gU2Nhbm5lckhlbHBlci50b1VwcGVyQ2FzZShjKTsKKwkJaWYgKChjICE9IGxjKSB8fCAodXBwZXJDaGFycyAhPSBudWxsKSkgeworCQkJaWYgKHVwcGVyQ2hhcnMgPT0gbnVsbCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWNoYXJzLAorCQkJCQkwLAorCQkJCQl1cHBlckNoYXJzID0gbmV3IGNoYXJbbGVuZ3RoXSwKKwkJCQkJMCwKKwkJCQkJaSk7CisJCQl9CisJCQl1cHBlckNoYXJzW2ldID0gbGM7CisJCX0KKwl9CisJcmV0dXJuIHVwcGVyQ2hhcnMgPT0gbnVsbCA/IGNoYXJzIDogdXBwZXJDaGFyczsKK30KKworLyoqCiAgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHJlbW92aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyAoJyAnKS4gQW5zd2VycyB0aGUgZ2l2ZW4gYXJyYXkgaWYgdGhlcmUgaXMgbm8KICAqIHNwYWNlIGNoYXJhY3RlcnMgdG8gcmVtb3ZlLgogICogPGJyPgpAQCAtMzMzMiw3ICszNzIyLDcgQEAKICAqIDwvcHJlPgogICogPC9saT4KICAqIDwvb2w+Ci0gKiAKKyAqCiAgKiBAcGFyYW0gY2hhcnMgdGhlIGdpdmVuIGFycmF5CiAgKiBAcmV0dXJuIGEgbmV3IGFycmF5IHJlbW92aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyAoJyAnKQogICovCkBAIC0zMzcxLDcgKzM3NjEsNyBAQAogICogPC9wcmU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEByZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSAnLicgYXMgYSBzZXBhcmF0b3IKICAqLwpAQCAtMzM4Miw3ICszNzcyLDcgQEAKIAogLyoqCiAgKiBBbnN3ZXJzIGFuIGFycmF5IG9mIHN0cmluZ3MgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhciBhcnJheS4KLSAqIAorICoKICAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncwogICogQHNpbmNlIDMuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvQ29tcGlsYXRpb25Qcm9ncmVzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvQ29tcGlsYXRpb25Qcm9ncmVzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmI3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9Db21waWxhdGlvblByb2dyZXNzLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYmF0Y2guQmF0Y2hDb21waWxlcjsKKworLyoqCisgKiBBIGNvbXBpbGF0aW9uIHByb2dyZXNzIGlzIHVzZWQgYnkgdGhlIHtAbGluayBCYXRjaENvbXBpbGVyfSB0byByZXBvcnQgcHJvZ3Jlc3MgZHVyaW5nIGNvbXBpbGF0aW9uLgorICogSXQgaXMgYWxzbyB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIHRoZSBjb21waWxhdGlvbi4KKyAqIENsaWVudHMgb2YgdGhlIHtAbGluayBCYXRjaENvbXBpbGVyfSBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcywgaW5zdGFudGlhdGUgdGhlIHN1YmNsYXNzIGFuZCBwYXNzIHRoaXMgaW5zdGFuY2UgdG8KKyAqIHtAbGluayBCYXRjaENvbXBpbGVyI2NvbXBpbGUoU3RyaW5nLCBqYXZhLmlvLlByaW50V3JpdGVyLCBqYXZhLmlvLlByaW50V3JpdGVyLCBDb21waWxhdGlvblByb2dyZXNzKX0uCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNpbmNlIDMuNAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxhdGlvblByb2dyZXNzIHsKKworCS8qKgorCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNvbXBpbGF0aW9uIGlzIGJlZ2lubmluZy4gVGhpcyBpcyBjYWxsZWQgZXhhY3RseSBvbmNlIHBlciBiYXRjaCBjb21waWxhdGlvbi4KKwkgKiBBbiBlc3RpbWF0ZWQgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIGlzIGdpdmVuLiBUaGlzIGFtb3VudCB3aWxsIGNoYW5nZSBhcyB0aGUgY29tcGlsYXRpb24KKwkgKiBwcm9ncmVzc2VzLiBUaGUgbmV3IGVzdGltYXRlZCBhbW91bnQgb2YgcmVtYWluaW5nIHdvcmsgaXMgcmVwb3J0ZWQgdXNpbmcge0BsaW5rICN3b3JrZWQoaW50LCBpbnQpfS4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gcmVtYWluaW5nV29yayB0aGUgZXN0aW1hdGVkIGFtb3VudCBvZiByZW1haW5pbmcgd29yay4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpbihpbnQgcmVtYWluaW5nV29yayk7CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGF0IHRoZSB3b3JrIGlzIGRvbmU7IHRoYXQgaXMsIGVpdGhlciB0aGUgY29tcGlsYXRpb24gaXMgY29tcGxldGVkCisJICogb3IgYSBjYW5jZWxsYXRpb24gd2FzIHJlcXVlc3RlZC4gVGhpcyBpcyBjYWxsZWQgZXhhY3RseSBvbmNlIHBlciBiYXRjaCBjb21waWxhdGlvbi4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KKwkgKiA8L3A+CisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgZG9uZSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIGNhbmNlbGxhdGlvbiBvZiB0aGUgY29tcGlsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDYW5jZWxlZCgpOworCisJLyoqCisJICogUmVwb3J0cyB0aGUgbmFtZSAob3IgZGVzY3JpcHRpb24pIG9mIHRoZSBjdXJyZW50IHRhc2suCisJICogPHA+CisJICogQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgKG9yIGRlc2NyaXB0aW9uKSBvZiB0aGUgY3VycmVudCB0YXNrCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpOworCisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGF0IGEgZ2l2ZW4gYW1vdW50IG9mIHdvcmsgb2YgdGhlIGNvbXBpbGF0aW9uCisJICogaGFzIGJlZW4gY29tcGxldGVkLiBOb3RlIHRoYXQgdGhpcyBhbW91bnQgcmVwcmVzZW50cyBhbgorCSAqIGluc3RhbGxtZW50LCBhcyBvcHBvc2VkIHRvIGEgY3VtdWxhdGl2ZSBhbW91bnQgb2Ygd29yayBkb25lCisJICogdG8gZGF0ZS4KKwkgKiBBbHNvIG5vdGlmaWVzIGFuIGVzdGltYXRlZCBhbW91bnQgb2YgcmVtYWluaW5nIHdvcmsuIE5vdGUgdGhhdCB0aGlzCisJICogYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrICBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBlc3RpbWF0ZWQKKwkgKiBhbW91bnQgYXMgbmV3IGNvbXBpbGF0aW9uIHVuaXRzIGFyZSBpbmplY3RlZCBpbiB0aGUgY29tcGlsZSBsb29wLgorCSAqIDxwPgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSB3b3JrSW5jcmVtZW50IGEgbm9uLW5lZ2F0aXZlIGFtb3VudCBvZiB3b3JrIGp1c3QgY29tcGxldGVkCisJICogQHBhcmFtIHJlbWFpbmluZ1dvcmsgIGEgbm9uLW5lZ2F0aXZlIGFtb3VudCBvZiBlc3RpbWF0ZWQgcmVtYWluaW5nIHdvcmsKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3b3JrZWQoaW50IHdvcmtJbmNyZW1lbnQsIGludCByZW1haW5pbmdXb3JrKTsKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JUHJvYmxlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YQppbmRleCBmNzZmZTRkLi5jMTQyNTZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JUHJvYmxlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lQcm9ibGVtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTA4LDE0ICsxMDgsMjMgQEAKICAqIAkJCQkJCQkJICAgTnVsbExvY2FsVmFyaWFibGVJbnN0YW5jZW9mWWllbGRzRmFsc2UKICAqIAkJCQkJCQkJICAgUmVkdW5kYW50TnVsbENoZWNrT25Ob25OdWxsTG9jYWxWYXJpYWJsZQogICogCQkJCQkJCQkgICBOb25OdWxsTG9jYWxWYXJpYWJsZUNvbXBhcmlzb25ZaWVsZHNGYWxzZQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRVc2FnZU9mVHlwZVBhcmFtZXRlcnNGb3JBbm5vdGF0aW9uRGVjbGFyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFVzYWdlT2ZUeXBlUGFyYW1ldGVyc0ZvckVudW1EZWNsYXJhdGlvbgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKgkJCQkJCQkJICAgUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UKKyAqCQlCZW5qYW1pbiBNdXNrYWxsYSAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKgkJCQkJCQkJCU1pc3NpbmdTeW5jaHJvbml6ZWRNb2RpZmllckluSW5oZXJpdGVkTWV0aG9kCisgKgkJU3RlcGhhbiBIZXJybWFubiAgLSBhZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworICoJCQkJCQkJCQlVbnVzZWRPYmplY3RBbGxvY2F0aW9uCQkJCQkJCQkJCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7Ci0gCisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOwogCiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGEgSmF2YSBwcm9ibGVtLCBhcyBkZXRlY3RlZCBieSB0aGUgY29tcGlsZXIgb3Igc29tZSBvZiB0aGUgdW5kZXJseWluZwotICogdGVjaG5vbG9neSByZXVzaW5nIHRoZSBjb21waWxlci4gCisgKiB0ZWNobm9sb2d5IHJldXNpbmcgdGhlIGNvbXBpbGVyLgogICogQSBwcm9ibGVtIHByb3ZpZGVzIGFjY2VzcyB0bzoKICAqIDx1bD4KICAqIDxsaT4gaXRzIGxvY2F0aW9uIChvcmlnaW5hdGluZyBzb3VyY2UgZmlsZSBuYW1lLCBzb3VyY2UgcG9zaXRpb24sIGxpbmUgbnVtYmVyKSwgPC9saT4KQEAgLTEyMywxNiArMTMyLDE4IEBACiAgKiA8bGk+IGl0cyBJRCA6IGEgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSB2ZXJ5IG5hdHVyZSBvZiB0aGlzIHByb2JsZW0uIEFsbCBwb3NzaWJsZSBJRHMgYXJlIGxpc3RlZAogICogYXMgY29uc3RhbnRzIG9uIHRoaXMgaW50ZXJmYWNlLiA8L2xpPgogICogPC91bD4KLSAqIAorICoKICAqIE5vdGU6IHRoZSBjb21waWxlciBwcm9kdWNlcyBJUHJvYmxlbXMgaW50ZXJuYWxseSwgd2hpY2ggYXJlIHR1cm5lZCBpbnRvIG1hcmtlcnMgYnkgdGhlIEphdmFCdWlsZGVyCiAgKiBzbyBhcyB0byBwZXJzaXN0IHByb2JsZW0gZGVzY3JpcHRpb25zLiBUaGlzIGV4cGxhaW5zIHdoeSB0aGVyZSBpcyBubyBBUEkgYWxsb3dpbmcgdG8gcmVhY2ggSVByb2JsZW0gZGV0ZWN0ZWQKICAqIHdoZW4gY29tcGlsaW5nLiBIb3dldmVyLCB0aGUgSmF2YSBwcm9ibGVtIG1hcmtlcnMgY2FycnkgZXF1aXZhbGVudCBpbmZvcm1hdGlvbiB0byBJUHJvYmxlbSwgaW4gcGFydGljdWxhcgogICogdGhlaXIgSUQgKGF0dHJpYnV0ZSAiaWQiKSBpcyBzZXQgdG8gb25lIG9mIHRoZSBJRHMgZGVmaW5lZCBvbiB0aGlzIGludGVyZmFjZS4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIEBub2V4dGVuZCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGludGVyZmFjZSBJUHJvYmxlbSB7IAotCQorcHVibGljIGludGVyZmFjZSBJUHJvYmxlbSB7CisKIC8qKgogICogQW5zd2VyIGJhY2sgdGhlIG9yaWdpbmFsIGFyZ3VtZW50cyByZWNvcmRlZCBpbnRvIHRoZSBwcm9ibGVtLgogICogQHJldHVybiB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHJlY29yZGVkIGludG8gdGhlIHByb2JsZW0KQEAgLTE0MSw1NiArMTUyLDU2IEBACiAKIC8qKgogICogUmV0dXJucyB0aGUgcHJvYmxlbSBpZAotICogCisgKgogICogQHJldHVybiB0aGUgcHJvYmxlbSBpZAogICovCiBpbnQgZ2V0SUQoKTsKIAogLyoqCiAgKiBBbnN3ZXIgYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KLSAqIAorICoKICAqIEByZXR1cm4gYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbQogICovCiBTdHJpbmcgZ2V0TWVzc2FnZSgpOwogCiAvKioKICAqIEFuc3dlciB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHRoZSBwcm9ibGVtIHdhcyBmb3VuZC4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB0aGUgcHJvYmxlbSB3YXMgZm91bmQKICAqLwogY2hhcltdIGdldE9yaWdpbmF0aW5nRmlsZU5hbWUoKTsKIAogLyoqCiAgKiBBbnN3ZXIgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bi4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bgogICovCiBpbnQgZ2V0U291cmNlRW5kKCk7CiAKIC8qKgogICogQW5zd2VyIHRoZSBsaW5lIG51bWJlciBpbiBzb3VyY2Ugd2hlcmUgdGhlIHByb2JsZW0gYmVnaW5zLgotICogCisgKgogICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgaW4gc291cmNlIHdoZXJlIHRoZSBwcm9ibGVtIGJlZ2lucwogICovCiBpbnQgZ2V0U291cmNlTGluZU51bWJlcigpOwogCiAvKioKICAqIEFuc3dlciB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHByb2JsZW0gKGluY2x1c2l2ZSksIG9yIC0xIGlmIHVua25vd24uCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bgogICovCiBpbnQgZ2V0U291cmNlU3RhcnQoKTsKIAogLyoqCiAgKiBDaGVja3MgdGhlIHNldmVyaXR5IHRvIHNlZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldC4KLSAqIAorICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldCBmb3IgdGhlIHNldmVyaXR5LCBmYWxzZSBvdGhlcndpc2UKICAqLwogYm9vbGVhbiBpc0Vycm9yKCk7CiAKIC8qKgogICogQ2hlY2tzIHRoZSBzZXZlcml0eSB0byBzZWUgaWYgdGhlIEVycm9yIGJpdCBpcyBub3Qgc2V0LgotICogCisgKgogICogQHJldHVybiB0cnVlIGlmIHRoZSBFcnJvciBiaXQgaXMgbm90IHNldCBmb3IgdGhlIHNldmVyaXR5LCBmYWxzZSBvdGhlcndpc2UKICAqLwogYm9vbGVhbiBpc1dhcm5pbmcoKTsKQEAgLTE5OCwxNCArMjA5LDE0IEBACiAvKioKICAqIFNldCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtIChpbmNsdXNpdmUpLCBvciAtMSBpZiB1bmtub3duLgogICogVXNlZCBmb3Igc2hpZnRpbmcgcHJvYmxlbSBwb3NpdGlvbnMuCi0gKiAKKyAqCiAgKiBAcGFyYW0gc291cmNlRW5kIHRoZSBnaXZlbiBlbmQgcG9zaXRpb24KICAqLwogdm9pZCBzZXRTb3VyY2VFbmQoaW50IHNvdXJjZUVuZCk7CiAKIC8qKgogICogU2V0IHRoZSBsaW5lIG51bWJlciBpbiBzb3VyY2Ugd2hlcmUgdGhlIHByb2JsZW0gYmVnaW5zLgotICogCisgKgogICogQHBhcmFtIGxpbmVOdW1iZXIgdGhlIGdpdmVuIGxpbmUgbnVtYmVyCiAgKi8KIHZvaWQgc2V0U291cmNlTGluZU51bWJlcihpbnQgbGluZU51bWJlcik7CkBAIC0yMTMsNyArMjI0LDcgQEAKIC8qKgogICogU2V0IHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bi4KICAqIFVzZWQgZm9yIHNoaWZ0aW5nIHByb2JsZW0gcG9zaXRpb25zLgotICogCisgKgogICogQHBhcmFtIHNvdXJjZVN0YXJ0IHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbgogICovCiB2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCk7CkBAIC0yMjEsMTIgKzIzMiwxMiBAQAogCiAJLyoqCiAJICogUHJvYmxlbSBDYXRlZ29yaWVzCi0JICogVGhlIGhpZ2ggYml0cyBvZiBhIHByb2JsZW0gSUQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhdGVnb3J5IG9mIGEgcHJvYmxlbS4gCisJICogVGhlIGhpZ2ggYml0cyBvZiBhIHByb2JsZW0gSUQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhdGVnb3J5IG9mIGEgcHJvYmxlbS4KIAkgKiBGb3IgZXhhbXBsZSwgKHByb2JsZW1JRCAmIFR5cGVSZWxhdGVkKSAhPSAwLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHByb2JsZW0gaXMgdHlwZSByZWxhdGVkLgotCSAqIAorCSAqCiAJICogQSBwcm9ibGVtIGNhdGVnb3J5IGNhbiBoZWxwIHRvIGltcGxlbWVudCBjdXN0b20gcHJvYmxlbSBmaWx0ZXJzLiBJbmRlZWQsIHdoZW4gbnVtZXJvdXMgcHJvYmxlbXMKIAkgKiBhcmUgbGlzdGVkLCBmb2N1c2luZyBvbiBpbXBvcnQgcmVsYXRlZCBwcm9ibGVtcyBmaXJzdCBtaWdodCBiZSByZWxldmFudC4KLQkgKiAKKwkgKgogCSAqIFdoZW4gYSBwcm9ibGVtIGlzIHRhZ2dlZCBhcyBJbnRlcm5hbCwgaXQgbWVhbnMgdGhhdCBubyBjaGFuZ2Ugb3RoZXIgdGhhbiBhIGxvY2FsIHNvdXJjZSBjb2RlIGNoYW5nZQogCSAqIGNhbiAgZml4IHRoZSBjb3JyZXNwb25kaW5nIHByb2JsZW0uIEEgdHlwZSByZWxhdGVkIHByb2JsZW0gY291bGQgYmUgYWRkcmVzc2VkIGJ5IGNoYW5naW5nIHRoZSB0eXBlCiAJICogaW52b2x2ZWQgaW4gaXQuCkBAIC0yNDAsMTQgKzI1MSwxNCBAQAogCWludCBTeW50YXggPSAweDQwMDAwMDAwOwogCS8qKiBAc2luY2UgMy4wICovCiAJaW50IEphdmFkb2MgPSAweDgwMDAwMDAwOwotCQorCiAJLyoqCiAJICogTWFzayB0byB1c2UgaW4gb3JkZXIgdG8gZmlsdGVyIG91dCB0aGUgY2F0ZWdvcnkgcG9ydGlvbiBvZiB0aGUgcHJvYmxlbSBJRC4KIAkgKi8KIAlpbnQgSWdub3JlQ2F0ZWdvcmllc01hc2sgPSAweEZGRkZGRjsKIAogCS8qKgotCSAqIEJlbG93IGFyZSBsaXN0ZWQgYWxsIGF2YWlsYWJsZSBwcm9ibGVtIElEcy4gTm90ZSB0aGF0IHRoaXMgbGlzdCBjb3VsZCBiZSBhdWdtZW50ZWQgaW4gdGhlIGZ1dHVyZSwgCisJICogQmVsb3cgYXJlIGxpc3RlZCBhbGwgYXZhaWxhYmxlIHByb2JsZW0gSURzLiBOb3RlIHRoYXQgdGhpcyBsaXN0IGNvdWxkIGJlIGF1Z21lbnRlZCBpbiB0aGUgZnV0dXJlLAogCSAqIGFzIG5ldyBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gdGhlIEphdmEgY29yZSBpbXBsZW1lbnRhdGlvbi4KIAkgKi8KIApAQCAtMjc0LDE0ICsyODUsMTQgQEAKIAlpbnQgVHlwZU1pc21hdGNoID0gVHlwZVJlbGF0ZWQgKyAxNzsKIAkvKiogQHNpbmNlIDMuMCAqLwogCWludCBJbmRpcmVjdEFjY2Vzc1RvU3RhdGljVHlwZSA9IEludGVybmFsICsgVHlwZVJlbGF0ZWQgKyAxODsKLQkKKwogCS8qKgogCSAqIElubmVyIHR5cGVzIHJlbGF0ZWQgcHJvYmxlbXMKIAkgKi8KIAlpbnQgTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlRm9yQ29uc3RydWN0b3JDYWxsID0gVHlwZVJlbGF0ZWQgKyAyMDsKIAlpbnQgTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlID0gVHlwZVJlbGF0ZWQgKyAyMTsKIAlpbnQgSW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UgPSBUeXBlUmVsYXRlZCArIDIyOwotCWludCBJbGxlZ2FsRW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uID0gVHlwZVJlbGF0ZWQgKyAyMzsgCisJaW50IElsbGVnYWxFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24gPSBUeXBlUmVsYXRlZCArIDIzOwogCWludCBDYW5ub3REZWZpbmVTdGF0aWNJbml0aWFsaXplckluTG9jYWxUeXBlID0gSW50ZXJuYWwgKyAyNDsKIAlpbnQgT3V0ZXJMb2NhbE11c3RCZUZpbmFsID0gSW50ZXJuYWwgKyAyNTsKIAlpbnQgQ2Fubm90RGVmaW5lSW50ZXJmYWNlSW5Mb2NhbFR5cGUgPSBJbnRlcm5hbCArIDI2OwpAQCAtMjk3LDcgKzMwOCw3IEBACiAJaW50IE5vblN0YXRpY0NvbnRleHRGb3JFbnVtTWVtYmVyVHlwZSA9IEludGVybmFsICsgMzI7CiAJLyoqIEBzaW5jZSAzLjMgKi8KIAlpbnQgVHlwZUhpZGluZ1R5cGUgPSBUeXBlUmVsYXRlZCArIDMzOwotCQorCiAJLy8gdmFyaWFibGVzCiAJaW50IFVuZGVmaW5lZE5hbWUgPSBJbnRlcm5hbCArIEZpZWxkUmVsYXRlZCArIDUwOwogCWludCBVbmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZSA9IEludGVybmFsICsgNTE7CkBAIC0zMTMsNyArMzI0LDcgQEAKIAkvKiogQHNpbmNlIDIuMSAqLwogCWludCBOb25CbGFua0ZpbmFsTG9jYWxBc3NpZ25tZW50ID0gSW50ZXJuYWwgKyA1ODsKIAkvKiogQHNpbmNlIDMuMiAqLwotCWludCBQYXJhbWV0ZXJBc3NpZ25tZW50ID0gSW50ZXJuYWwgKyA1OTsJCisJaW50IFBhcmFtZXRlckFzc2lnbm1lbnQgPSBJbnRlcm5hbCArIDU5OwogCWludCBGaW5hbE91dGVyTG9jYWxBc3NpZ25tZW50ID0gSW50ZXJuYWwgKyA2MDsKIAlpbnQgTG9jYWxWYXJpYWJsZUlzTmV2ZXJVc2VkID0gSW50ZXJuYWwgKyA2MTsKIAlpbnQgQXJndW1lbnRJc05ldmVyVXNlZCA9IEludGVybmFsICsgNjI7CkBAIC0zMjcsNyArMzM4LDcgQEAKIAlpbnQgVG9vTWFueUFycmF5RGltZW5zaW9ucyA9IEludGVybmFsICsgNjg7CiAJLyoqIEBzaW5jZSAyLjEgKi8KIAlpbnQgQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXRGb3JDb25zdHJ1Y3RvciA9IEludGVybmFsICsgNjk7Ci0JCisKIAkvLyBmaWVsZHMKIAlpbnQgVW5kZWZpbmVkRmllbGQgPSBGaWVsZFJlbGF0ZWQgKyA3MDsKIAlpbnQgTm90VmlzaWJsZUZpZWxkID0gRmllbGRSZWxhdGVkICsgNzE7CkBAIC0zNDMsMjggKzM1NCwyOCBAQAogCWludCBJbmRpcmVjdEFjY2Vzc1RvU3RhdGljRmllbGQgPSBJbnRlcm5hbCArIEZpZWxkUmVsYXRlZCArIDc4OwogCS8qKiBAc2luY2UgMy4wICovCiAJaW50IFVucXVhbGlmaWVkRmllbGRBY2Nlc3MgPSBJbnRlcm5hbCArIEZpZWxkUmVsYXRlZCArIDc5OwotCQotCS8vIGJsYW5rIGZpbmFsIGZpZWxkcwogCWludCBGaW5hbEZpZWxkQXNzaWdubWVudCA9IEZpZWxkUmVsYXRlZCArIDgwOwogCWludCBVbmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkID0gRmllbGRSZWxhdGVkICsgODE7CiAJaW50IER1cGxpY2F0ZUJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uID0gRmllbGRSZWxhdGVkICsgODI7CisJLyoqIEBzaW5jZSAzLjYgKi8KKwlpbnQgVW5yZXNvbHZlZFZhcmlhYmxlID0gRmllbGRSZWxhdGVkICsgODM7CiAKIAkvLyB2YXJpYWJsZSBoaWRpbmcKIAkvKiogQHNpbmNlIDMuMCAqLwotCWludCBMb2NhbFZhcmlhYmxlSGlkaW5nTG9jYWxWYXJpYWJsZSA9IEludGVybmFsICsgOTA7CQkKKwlpbnQgTG9jYWxWYXJpYWJsZUhpZGluZ0xvY2FsVmFyaWFibGUgPSBJbnRlcm5hbCArIDkwOwogCS8qKiBAc2luY2UgMy4wICovCi0JaW50IExvY2FsVmFyaWFibGVIaWRpbmdGaWVsZCA9IEludGVybmFsICsgRmllbGRSZWxhdGVkICsgOTE7CQkKKwlpbnQgTG9jYWxWYXJpYWJsZUhpZGluZ0ZpZWxkID0gSW50ZXJuYWwgKyBGaWVsZFJlbGF0ZWQgKyA5MTsKIAkvKiogQHNpbmNlIDMuMCAqLwotCWludCBGaWVsZEhpZGluZ0xvY2FsVmFyaWFibGUgPSBJbnRlcm5hbCArIEZpZWxkUmVsYXRlZCArIDkyOwkJCisJaW50IEZpZWxkSGlkaW5nTG9jYWxWYXJpYWJsZSA9IEludGVybmFsICsgRmllbGRSZWxhdGVkICsgOTI7CiAJLyoqIEBzaW5jZSAzLjAgKi8KLQlpbnQgRmllbGRIaWRpbmdGaWVsZCA9IEludGVybmFsICsgRmllbGRSZWxhdGVkICsgOTM7CQkKKwlpbnQgRmllbGRIaWRpbmdGaWVsZCA9IEludGVybmFsICsgRmllbGRSZWxhdGVkICsgOTM7CiAJLyoqIEBzaW5jZSAzLjAgKi8KLQlpbnQgQXJndW1lbnRIaWRpbmdMb2NhbFZhcmlhYmxlID0gSW50ZXJuYWwgKyA5NDsJCQorCWludCBBcmd1bWVudEhpZGluZ0xvY2FsVmFyaWFibGUgPSBJbnRlcm5hbCArIDk0OwogCS8qKiBAc2luY2UgMy4wICovCi0JaW50IEFyZ3VtZW50SGlkaW5nRmllbGQgPSBJbnRlcm5hbCArIDk1OwkJCisJaW50IEFyZ3VtZW50SGlkaW5nRmllbGQgPSBJbnRlcm5hbCArIDk1OwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IE1pc3NpbmdTZXJpYWxWZXJzaW9uID0gSW50ZXJuYWwgKyA5NjsKLQkKKwogCS8vIG1ldGhvZHMKIAlpbnQgVW5kZWZpbmVkTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDEwMDsKIAlpbnQgTm90VmlzaWJsZU1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyAxMDE7CkBAIC0zODgsOCArMzk5LDE2IEBACiAJaW50IFVudXNlZFByaXZhdGVNZXRob2QgPSBJbnRlcm5hbCArIE1ldGhvZFJlbGF0ZWQgKyAxMTg7CiAJLyoqIEBzaW5jZSAzLjAgKi8KIAlpbnQgSW5kaXJlY3RBY2Nlc3NUb1N0YXRpY01ldGhvZCA9IEludGVybmFsICsgTWV0aG9kUmVsYXRlZCArIDExOTsKKwkvKiogQHNpbmNlIDMuNCAqLworCWludCBNaXNzaW5nVHlwZUluTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDEyMDsKKwkvKiogQHNpbmNlIDMuNyAqLworCWludCBNZXRob2RDYW5CZVN0YXRpYyA9IEludGVybmFsICsgTWV0aG9kUmVsYXRlZCArIDEyMTsKKwkvKiogQHNpbmNlIDMuNyAqLworCWludCBNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljID0gSW50ZXJuYWwgKyBNZXRob2RSZWxhdGVkICsgMTIyOwogCiAJLy8gY29uc3RydWN0b3JzCisJLyoqIEBzaW5jZSAzLjQgKi8KKwlpbnQgTWlzc2luZ1R5cGVJbkNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTI5OwogCWludCBVbmRlZmluZWRDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMDsKIAlpbnQgTm90VmlzaWJsZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTMxOwogCWludCBBbWJpZ3VvdXNDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMjsKQEAgLTQxMiw4ICs0MzEsMTIgQEAKIAlpbnQgQW1iaWd1b3VzQ29uc3RydWN0b3JJbkltcGxpY2l0Q29uc3RydWN0b3JDYWxsID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTQ1OwogCWludCBVbmhhbmRsZWRFeGNlcHRpb25JbkRlZmF1bHRDb25zdHJ1Y3RvciA9IFR5cGVSZWxhdGVkICsgMTQ2OwogCWludCBVbmhhbmRsZWRFeGNlcHRpb25JbkltcGxpY2l0Q29uc3RydWN0b3JDYWxsID0gVHlwZVJlbGF0ZWQgKyAxNDc7Ci0JCQkJCisKIAkvLyBleHByZXNzaW9ucworCS8qKiBAc2luY2UgMy42ICovCisJaW50IFVudXNlZE9iamVjdEFsbG9jYXRpb24gPSBJbnRlcm5hbCArIDE0ODsKKwkvKiogQHNpbmNlIDMuNSAqLworCWludCBEZWFkQ29kZSA9IEludGVybmFsICsgMTQ5OwogCWludCBBcnJheVJlZmVyZW5jZVJlcXVpcmVkID0gSW50ZXJuYWwgKyAxNTA7CiAJaW50IE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uRm9yQ2hhckFycmF5RXhwcmVzc2lvbiA9IEludGVybmFsICsgMTUxOwogCS8vIGNvbnN0YW50IGV4cHJlc3Npb25zCkBAIC00MzksNyArNDYyLDcgQEAKIAlpbnQgRHVwbGljYXRlRGVmYXVsdENhc2UgPSBJbnRlcm5hbCArIDE2NjsKIAlpbnQgVW5yZWFjaGFibGVDYXRjaCA9IFR5cGVSZWxhdGVkICsgTWV0aG9kUmVsYXRlZCArIDE2NzsKIAlpbnQgVW5oYW5kbGVkRXhjZXB0aW9uID0gVHlwZVJlbGF0ZWQgKyAxNjg7Ci0JLy8gc3dpdGNoICAgICAgIAorCS8vIHN3aXRjaAogCWludCBJbmNvcnJlY3RTd2l0Y2hUeXBlID0gVHlwZVJlbGF0ZWQgKyAxNjk7CiAJaW50IER1cGxpY2F0ZUNhc2UgPSBGaWVsZFJlbGF0ZWQgKyAxNzA7CiAKQEAgLTQ2NiwxOSArNDg5LDE5IEBACiAJICogICBAc2luY2UgMy4wICovCiAJaW50IFVubmVjZXNzYXJ5QXJndW1lbnRDYXN0ID0gSW50ZXJuYWwgKyBUeXBlUmVsYXRlZCArIDE4MjsKIAkvKiogQHNpbmNlIDMuMCAqLwotCWludCBVbm5lY2Vzc2FyeUluc3RhbmNlb2YgPSBJbnRlcm5hbCArIFR5cGVSZWxhdGVkICsgMTgzOwkKKwlpbnQgVW5uZWNlc3NhcnlJbnN0YW5jZW9mID0gSW50ZXJuYWwgKyBUeXBlUmVsYXRlZCArIDE4MzsKIAkvKiogQHNpbmNlIDMuMCAqLwotCWludCBGaW5hbGx5TXVzdENvbXBsZXRlTm9ybWFsbHkgPSBJbnRlcm5hbCArIDE4NDsJCisJaW50IEZpbmFsbHlNdXN0Q29tcGxldGVOb3JtYWxseSA9IEludGVybmFsICsgMTg0OwogCS8qKiBAc2luY2UgMy4wICovCi0JaW50IFVudXNlZE1ldGhvZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uID0gSW50ZXJuYWwgKyAxODU7CQorCWludCBVbnVzZWRNZXRob2REZWNsYXJlZFRocm93bkV4Y2VwdGlvbiA9IEludGVybmFsICsgMTg1OwogCS8qKiBAc2luY2UgMy4wICovCi0JaW50IFVudXNlZENvbnN0cnVjdG9yRGVjbGFyZWRUaHJvd25FeGNlcHRpb24gPSBJbnRlcm5hbCArIDE4NjsJCisJaW50IFVudXNlZENvbnN0cnVjdG9yRGVjbGFyZWRUaHJvd25FeGNlcHRpb24gPSBJbnRlcm5hbCArIDE4NjsKIAkvKiogQHNpbmNlIDMuMCAqLwogCWludCBJbnZhbGlkQ2F0Y2hCbG9ja1NlcXVlbmNlID0gSW50ZXJuYWwgKyBUeXBlUmVsYXRlZCArIDE4NzsKIAkvKiogQHNpbmNlIDMuMCAqLwotCWludCBFbXB0eUNvbnRyb2xGbG93U3RhdGVtZW50ID0gSW50ZXJuYWwgKyBUeXBlUmVsYXRlZCArIDE4ODsJCisJaW50IEVtcHR5Q29udHJvbEZsb3dTdGF0ZW1lbnQgPSBJbnRlcm5hbCArIFR5cGVSZWxhdGVkICsgMTg4OwogCS8qKiBAc2luY2UgMy4wICovCi0JaW50IFVubmVjZXNzYXJ5RWxzZSA9IEludGVybmFsICsgMTg5OwkKKwlpbnQgVW5uZWNlc3NhcnlFbHNlID0gSW50ZXJuYWwgKyAxODk7CiAKIAkvLyBpbm5lciBlbXVsYXRpb24KIAlpbnQgTmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyA9IEZpZWxkUmVsYXRlZCArIDE5MDsKQEAgLTQ4Nyw4ICs1MTAsOCBAQAogCWludCBOZWVkVG9FbXVsYXRlQ29uc3RydWN0b3JBY2Nlc3MgPSBNZXRob2RSZWxhdGVkICsgMTkzOwogCiAJLyoqIEBzaW5jZSAzLjIgKi8KLQlpbnQgRmFsbHRocm91Z2hDYXNlID0gSW50ZXJuYWwgKyAxOTQ7CQotCQorCWludCBGYWxsdGhyb3VnaENhc2UgPSBJbnRlcm5hbCArIDE5NDsKKwogCS8vaW5oZXJpdGVkIG5hbWUgaGlkZXMgZW5jbG9zaW5nIG5hbWUgKHNvcnQgb2YgYW1iaWd1b3VzKQogCWludCBJbmhlcml0ZWRNZXRob2RIaWRlc0VuY2xvc2luZ05hbWUgPSBNZXRob2RSZWxhdGVkICsgMTk1OwogCWludCBJbmhlcml0ZWRGaWVsZEhpZGVzRW5jbG9zaW5nTmFtZSA9IEZpZWxkUmVsYXRlZCArIDE5NjsKQEAgLTUwMyw2ICs1MjYsNyBAQAogCWludCBUaGlzSW5TdGF0aWNDb250ZXh0ID0gSW50ZXJuYWwgKyAyMDA7CiAJaW50IFN0YXRpY01ldGhvZFJlcXVlc3RlZCA9IEludGVybmFsICsgTWV0aG9kUmVsYXRlZCArIDIwMTsKIAlpbnQgSWxsZWdhbERpbWVuc2lvbiA9IEludGVybmFsICsgMjAyOworCS8qKiBAZGVwcmVjYXRlZCAtIHByb2JsZW0gaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZCAqLwogCWludCBJbnZhbGlkVHlwZUV4cHJlc3Npb24gPSBJbnRlcm5hbCArIDIwMzsKIAlpbnQgUGFyc2luZ0Vycm9yID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMDQ7CiAJaW50IFBhcnNpbmdFcnJvck5vU3VnZ2VzdGlvbiA9IFN5bnRheCArIEludGVybmFsICsgMjA1OwpAQCAtNTExLDkgKzUzNSwxMiBAQAogCS8vIHN5bnRheCBlcnJvcnMKIAlpbnQgSW50ZXJmYWNlQ2Fubm90SGF2ZUNvbnN0cnVjdG9ycyA9IFN5bnRheCArIEludGVybmFsICsgMjA3OwogCWludCBBcnJheUNvbnN0YW50c09ubHlJbkFycmF5SW5pdGlhbGl6ZXJzID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMDg7Ci0JaW50IFBhcnNpbmdFcnJvck9uS2V5d29yZCA9IFN5bnRheCArIEludGVybmFsICsgMjA5OwkKKwlpbnQgUGFyc2luZ0Vycm9yT25LZXl3b3JkID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMDk7CiAJaW50IFBhcnNpbmdFcnJvck9uS2V5d29yZE5vU3VnZ2VzdGlvbiA9IFN5bnRheCArIEludGVybmFsICsgMjEwOwogCisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgQ29tcGFyaW5nSWRlbnRpY2FsID0gSW50ZXJuYWwgKyAyMTE7CisKIAlpbnQgVW5tYXRjaGVkQnJhY2tldCA9IFN5bnRheCArIEludGVybmFsICsgMjIwOwogCWludCBOb0ZpZWxkT25CYXNlVHlwZSA9IEZpZWxkUmVsYXRlZCArIDIyMTsKIAlpbnQgSW52YWxpZEV4cHJlc3Npb25Bc1N0YXRlbWVudCA9IFN5bnRheCArIEludGVybmFsICsgMjIyOwpAQCAtNTIzLDcgKzU1MCw3IEBACiAJaW50IE1pc3NpbmdTZW1pQ29sb24gPSBTeW50YXggKyBJbnRlcm5hbCArIDIyNDsKIAkvKiogQHNpbmNlIDIuMSAqLwogCWludCBJbnZhbGlkUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSBTeW50YXggKyBJbnRlcm5hbCArIDIyNTsKLQkKKwogCS8qKiBAc2luY2UgMy4wICovCiAJaW50IFBhcnNpbmdFcnJvckluc2VydFRva2VuQmVmb3JlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMzA7CiAJLyoqIEBzaW5jZSAzLjAgKi8KQEAgLTU1MCw3ICs1NzcsNyBAQAogICAgIGludCBQYXJzaW5nRXJyb3JJbnNlcnRUb0NvbXBsZXRlU2NvcGUgPSBTeW50YXggKyBJbnRlcm5hbCArIDI0MTsKICAgICAvKiogQHNpbmNlIDMuMCAqLwogICAgIGludCBQYXJzaW5nRXJyb3JJbnNlcnRUb0NvbXBsZXRlUGhyYXNlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNDI7Ci0gICAgCisKIAkvLyBzY2FubmVyIGVycm9ycwogCWludCBFbmRPZlNvdXJjZSA9IFN5bnRheCArIEludGVybmFsICsgMjUwOwogCWludCBJbnZhbGlkSGV4YSA9IFN5bnRheCArIEludGVybmFsICsgMjUxOwpAQCAtNTY1LDEzICs1OTIsMjMgQEAKIAlpbnQgVW50ZXJtaW5hdGVkQ29tbWVudCA9IFN5bnRheCArIEludGVybmFsICsgMjYwOwogCWludCBOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gSW50ZXJuYWwgKyAyNjE7CiAJLyoqIEBzaW5jZSAzLjEgKi8KLQlpbnQgSW52YWxpZERpZ2l0ID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNjI7CQorCWludCBJbnZhbGlkRGlnaXQgPSBTeW50YXggKyBJbnRlcm5hbCArIDI2MjsKIAkvKiogQHNpbmNlIDMuMSAqLwogCWludCBJbnZhbGlkTG93U3Vycm9nYXRlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNjM7CiAJLyoqIEBzaW5jZSAzLjEgKi8KIAlpbnQgSW52YWxpZEhpZ2hTdXJyb2dhdGUgPSBTeW50YXggKyBJbnRlcm5hbCArIDI2NDsKIAkvKiogQHNpbmNlIDMuMiAqLwogCWludCBVbm5lY2Vzc2FyeU5MU1RhZyA9IEludGVybmFsICsgMjY1OworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgSW52YWxpZEJpbmFyeSA9IFN5bnRheCArIEludGVybmFsICsgMjY2OworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgQmluYXJ5TGl0ZXJhbE5vdEJlbG93MTcgPSBTeW50YXggKyBJbnRlcm5hbCArIDI2NzsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IElsbGVnYWxVbmRlcnNjb3JlUG9zaXRpb24gPSBTeW50YXggKyBJbnRlcm5hbCArIDI2ODsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IFVuZGVyc2NvcmVzSW5MaXRlcmFsc05vdEJlbG93MTcgPSBTeW50YXggKyBJbnRlcm5hbCArIDI2OTsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IElsbGVnYWxIZXhhTGl0ZXJhbCA9IFN5bnRheCArIEludGVybmFsICsgMjcwOwogCiAJLy8gdHlwZSByZWxhdGVkIHByb2JsZW1zCiAJLyoqIEBzaW5jZSAzLjEgKi8KQEAgLTYwNCw2ICs2NDEsNyBAQAogCWludCBEdXBsaWNhdGVUeXBlcyA9IFR5cGVSZWxhdGVkICsgMzIzOwogCWludCBJc0NsYXNzUGF0aENvcnJlY3QgPSBUeXBlUmVsYXRlZCArIDMyNDsKIAlpbnQgUHVibGljQ2xhc3NNdXN0TWF0Y2hGaWxlTmFtZSA9IFR5cGVSZWxhdGVkICsgMzI1OworCS8qKiBAZGVwcmVjYXRlZCAtIHByb2JsZW0gaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZCAqLwogCWludCBNdXN0U3BlY2lmeVBhY2thZ2UgPSBJbnRlcm5hbCArIDMyNjsKIAlpbnQgSGllcmFyY2h5SGFzUHJvYmxlbXMgPSBUeXBlUmVsYXRlZCArIDMyNzsKIAlpbnQgUGFja2FnZUlzTm90RXhwZWN0ZWRQYWNrYWdlID0gSW50ZXJuYWwgKyAzMjg7CkBAIC02MTEsNiArNjQ5LDEyIEBACiAJaW50IE9iamVjdENhbm5vdEhhdmVTdXBlclR5cGVzID0gSW50ZXJuYWwgKyAzMjk7CiAJLyoqIEBzaW5jZSAzLjEgKi8KIAlpbnQgT2JqZWN0TXVzdEJlQ2xhc3MgPSBJbnRlcm5hbCArIDMzMDsKKwkvKiogQHNpbmNlIDMuNCAqLworCWludCBSZWR1bmRhbnRTdXBlcmludGVyZmFjZSA9IFR5cGVSZWxhdGVkICsgMzMxOworCS8qKiBAc2luY2UgMy41ICovCisJaW50IFNob3VsZEltcGxlbWVudEhhc2hjb2RlID0gVHlwZVJlbGF0ZWQgKyAzMzI7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgQWJzdHJhY3RNZXRob2RzSW5Db25jcmV0ZUNsYXNzID0gVHlwZVJlbGF0ZWQgKyAzMzM7CiAKIAkvKiogQGRlcHJlY2F0ZWQgLSBwcm9ibGVtIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQsIHVzZSB7QGxpbmsgI1VuZGVmaW5lZFR5cGV9IGluc3RlYWQgKi8KIAlpbnQgU3VwZXJjbGFzc05vdEZvdW5kID0gIFR5cGVSZWxhdGVkICsgMzI5ICsgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQ7IC8vIFR5cGVSZWxhdGVkICsgMzMwCkBAIC02NTMsNyArNjk3LDcgQEAKIAlpbnQgRmllbGRUeXBlSW50ZXJuYWxOYW1lUHJvdmlkZWQgPSAgRmllbGRSZWxhdGVkICsgMzQ5ICsgUHJvYmxlbVJlYXNvbnMuSW50ZXJuYWxOYW1lUHJvdmlkZWQ7IC8vIEZpZWxkUmVsYXRlZCArIDM1MwogCS8qKiBAZGVwcmVjYXRlZCAtIHByb2JsZW0gaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZCwgdXNlIHtAbGluayAjSW5oZXJpdGVkVHlwZUhpZGVzRW5jbG9zaW5nTmFtZX0gaW5zdGVhZCAqLwogCWludCBGaWVsZFR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gIEZpZWxkUmVsYXRlZCArIDM0OSArIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWU7IC8vIEZpZWxkUmVsYXRlZCArIDM1NAotCQorCiAJLy8gbWV0aG9kIHJlbGF0ZWQgcHJvYmxlbXMKIAlpbnQgRHVwbGljYXRlTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM1NTsKIAlpbnQgSWxsZWdhbE1vZGlmaWVyRm9yQXJndW1lbnQgPSBNZXRob2RSZWxhdGVkICsgMzU2OwpAQCAtNjcxLDYgKzcxNSw4IEBACiAJaW50IFJldHVyblR5cGVDYW5ub3RCZVZvaWRBcnJheSA9IE1ldGhvZFJlbGF0ZWQgKyAzNjY7CiAJaW50IE5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwID0gTWV0aG9kUmVsYXRlZCArIDM2NzsKIAlpbnQgRHVwbGljYXRlTW9kaWZpZXJGb3JBcmd1bWVudCA9IE1ldGhvZFJlbGF0ZWQgKyAzNjg7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgSWxsZWdhbE1vZGlmaWVyRm9yQ29uc3RydWN0b3IgPSBNZXRob2RSZWxhdGVkICsgMzY5OwogCiAJLyoqIEBkZXByZWNhdGVkIC0gcHJvYmxlbSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkLCB1c2Uge0BsaW5rICNVbmRlZmluZWRUeXBlfSBpbnN0ZWFkICovCiAJaW50IEFyZ3VtZW50VHlwZU5vdEZvdW5kID0gIE1ldGhvZFJlbGF0ZWQgKyAzNjkgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gTWV0aG9kUmVsYXRlZCArIDM3MApAQCAtNzU1LDEzICs4MDEsMTkgQEAKIAkvKiogQHNpbmNlIDMuMSAqLwogCWludCBJbGxlZ2FsVmFyYXJnID0gTWV0aG9kUmVsYXRlZCArIDQxNTsKIAkvKiogQHNpbmNlIDMuMyAqLwotCWludCBPdmVycmlkaW5nTWV0aG9kV2l0aG91dFN1cGVySW52b2NhdGlvbiA9IE1ldGhvZFJlbGF0ZWQgKyA0MTY7IAotCQorCWludCBPdmVycmlkaW5nTWV0aG9kV2l0aG91dFN1cGVySW52b2NhdGlvbiA9IE1ldGhvZFJlbGF0ZWQgKyA0MTY7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgTWlzc2luZ1N5bmNocm9uaXplZE1vZGlmaWVySW5Jbmhlcml0ZWRNZXRob2Q9IE1ldGhvZFJlbGF0ZWQgKyA0MTc7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgQWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZE92ZXJDb25jcmV0ZU1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyA0MTg7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgSW5oZXJpdGVkSW5jb21wYXRpYmxlUmV0dXJuVHlwZSA9IE1ldGhvZFJlbGF0ZWQgKyA0MTk7CisKIAkvLyBjb2RlIHNuaXBwZXQgc3VwcG9ydAogCWludCBDb2RlU25pcHBldE1pc3NpbmdDbGFzcyA9IEludGVybmFsICsgNDIwOwogCWludCBDb2RlU25pcHBldE1pc3NpbmdNZXRob2QgPSBJbnRlcm5hbCArIDQyMTsKIAlpbnQgQ2Fubm90VXNlU3VwZXJJbkNvZGVTbmlwcGV0ID0gSW50ZXJuYWwgKyA0MjI7Ci0JCisKIAkvL2NvbnN0YW50IHBvb2wKIAlpbnQgVG9vTWFueUNvbnN0YW50c0luQ29uc3RhbnRQb29sID0gSW50ZXJuYWwgKyA0MzA7CiAJLyoqIEBzaW5jZSAyLjEgKi8KQEAgLTc3MSwxMiArODIzLDE0IEBACiAJLyoqIEBzaW5jZSAyLjEgKi8KIAlpbnQgVG9vTWFueUZpZWxkcyA9IEludGVybmFsICsgNDMyOwogCS8qKiBAc2luY2UgMi4xICovCi0JaW50IFRvb01hbnlNZXRob2RzID0gSW50ZXJuYWwgKyA0MzM7IAotCQkKKwlpbnQgVG9vTWFueU1ldGhvZHMgPSBJbnRlcm5hbCArIDQzMzsKKwkvKiogQHNpbmNlIDMuNyAqLworCWludCBUb29NYW55UGFyYW1ldGVyc0ZvclN5bnRoZXRpY01ldGhvZCA9IEludGVybmFsICsgNDM0OworCiAJLy8gMS40IGZlYXR1cmVzCiAJLy8gYXNzZXJ0aW9uIHdhcm5pbmcKIAlpbnQgVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIgPSBJbnRlcm5hbCArIDQ0MDsKLQkKKwogCS8vIDEuNSBmZWF0dXJlcwogCWludCBVc2VFbnVtQXNBbklkZW50aWZpZXIgPSBJbnRlcm5hbCArIDQ0MTsKIAkvKiogQHNpbmNlIDMuMiAqLwpAQCAtNzg1LDcgKzgzOSw3IEBACiAJLy8gZGV0ZWN0ZWQgdGFzawogCS8qKiBAc2luY2UgMi4xICovCiAJaW50IFRhc2sgPSBJbnRlcm5hbCArIDQ1MDsKLQkKKwogCS8vIGxvY2FsIHZhcmlhYmxlcyByZWxhdGVkIHByb2JsZW1zLCBjb250J2QKIAkvKiogQHNpbmNlIDMuMyAqLwogCWludCBOdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSA9IEludGVybmFsICsgNDUxOwpAQCAtODA3LDIxICs4NjEsMzIgQEAKIAkvLyBibG9jawogCS8qKiBAc2luY2UgMy4wICovCiAJaW50IFVuZG9jdW1lbnRlZEVtcHR5QmxvY2sgPSBJbnRlcm5hbCArIDQ2MDsKLQkJCisKIAkvKgogCSAqIEphdmFkb2MgY29tbWVudHMKIAkgKi8KLQkvKiogCisJLyoqCisJICogUHJvYmxlbSBzaWduYWxlZCBvbiBhbiBpbnZhbGlkIFVSTCByZWZlcmVuY2UuCisJICogVmFsaWQgc3ludGF4IGV4YW1wbGU6IEBzZWUgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlpbnQgSmF2YWRvY0ludmFsaWRTZWVVcmxSZWZlcmVuY2UgPSBKYXZhZG9jICsgSW50ZXJuYWwgKyA0NjI7CisJLyoqCisJICogUHJvYmxlbSB3YXJuZWQgb24gbWlzc2luZyB0YWcgZGVzY3JpcHRpb24uCisJICogQHNpbmNlIDMuNAorCSAqLworCWludCBKYXZhZG9jTWlzc2luZ1RhZ0Rlc2NyaXB0aW9uID0gSmF2YWRvYyArIEludGVybmFsICsgNDYzOworCS8qKgogCSAqIFByb2JsZW0gd2FybmVkIG9uIGR1cGxpY2F0ZWQgdGFnLgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlpbnQgSmF2YWRvY0R1cGxpY2F0ZVRhZyA9IEphdmFkb2MgKyBJbnRlcm5hbCArIDQ2NDsKLQkvKiogCisJLyoqCiAJICogUHJvYmxlbSBzaWduYWxlZCBvbiBhbiBoaWRkZW4gcmVmZXJlbmNlIGR1ZSB0byBhIHRvbyBsb3cgdmlzaWJpbGl0eSBsZXZlbC4KIAkgKiBAc2luY2UgMy4zCiAJICovCiAJaW50IEphdmFkb2NIaWRkZW5SZWZlcmVuY2UgPSBKYXZhZG9jICsgSW50ZXJuYWwgKyA0NjU7Ci0JLyoqIAorCS8qKgogCSAqIFByb2JsZW0gc2lnbmFsZWQgb24gYW4gaW52YWxpZCBxdWFsaWZpY2F0aW9uIGZvciBtZW1iZXIgdHlwZSByZWZlcmVuY2UuCiAJICogQHNpbmNlIDMuMwogCSAqLwpAQCAtODYwLDcgKzkyNSwxMSBAQAogCWludCBKYXZhZG9jTWlzc2luZ1NlZVJlZmVyZW5jZSA9IEphdmFkb2MgKyBJbnRlcm5hbCArIDQ4MjsKIAkvKiogQHNpbmNlIDMuMCAqLwogCWludCBKYXZhZG9jSW52YWxpZFNlZVJlZmVyZW5jZSA9IEphdmFkb2MgKyBJbnRlcm5hbCArIDQ4MzsKLQkvKiogQHNpbmNlIDMuMCAqLworCS8qKgorCSAqIFByb2JsZW0gc2lnbmFsZWQgb24gYW4gaW52YWxpZCBVUkwgcmVmZXJlbmNlIHRoYXQgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgaHJlZiBzeW50YXguCisJICogVmFsaWQgc3ludGF4IGV4YW1wbGU6IEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPkVjbGlwc2UgSG9tZSBQYWdlPC9hPgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KIAlpbnQgSmF2YWRvY0ludmFsaWRTZWVIcmVmID0gSmF2YWRvYyArIEludGVybmFsICsgNDg0OwogCS8qKiBAc2luY2UgMy4wICovCiAJaW50IEphdmFkb2NJbnZhbGlkU2VlQXJncyA9IEphdmFkb2MgKyBJbnRlcm5hbCArIDQ4NTsKQEAgLTk2OCw3ICsxMDM3LDcgQEAKIAkvKiogQHNpbmNlIDMuMSAqLwogCWludCBSZWZlcmVuY2VUb0ZvcndhcmRUeXBlVmFyaWFibGUgPSBUeXBlUmVsYXRlZCArIDUyODsKICAgICAvKiogQHNpbmNlIDMuMSAqLwotCWludCBCb3VuZE11c3RCZUFuSW50ZXJmYWNlID0gVHlwZVJlbGF0ZWQgKyA1Mjk7CQorCWludCBCb3VuZE11c3RCZUFuSW50ZXJmYWNlID0gVHlwZVJlbGF0ZWQgKyA1Mjk7CiAgICAgLyoqIEBzaW5jZSAzLjEgKi8KIAlpbnQgVW5zYWZlUmF3Q29uc3RydWN0b3JJbnZvY2F0aW9uID0gVHlwZVJlbGF0ZWQgKyA1MzA7CiAgICAgLyoqIEBzaW5jZSAzLjEgKi8KQEAgLTEwMzQsMTEgKzExMDMsMTEgQEAKIAkvKiogQHNpbmNlIDMuMSAqLwogCWludCBSYXdNZW1iZXJUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkID0gVHlwZVJlbGF0ZWQgKyA1NjE7CiAJLyoqIEBzaW5jZSAzLjEgKi8KLQlpbnQgTWlzc2luZ0FyZ3VtZW50c0ZvclBhcmFtZXRlcml6ZWRNZW1iZXJUeXBlID0gVHlwZVJlbGF0ZWQgKyA1NjI7CQorCWludCBNaXNzaW5nQXJndW1lbnRzRm9yUGFyYW1ldGVyaXplZE1lbWJlclR5cGUgPSBUeXBlUmVsYXRlZCArIDU2MjsKIAkvKiogQHNpbmNlIDMuMSAqLwotCWludCBTdGF0aWNNZW1iZXJPZlBhcmFtZXRlcml6ZWRUeXBlID0gVHlwZVJlbGF0ZWQgKyA1NjM7CQorCWludCBTdGF0aWNNZW1iZXJPZlBhcmFtZXRlcml6ZWRUeXBlID0gVHlwZVJlbGF0ZWQgKyA1NjM7CiAgICAgLyoqIEBzaW5jZSAzLjEgKi8KLQlpbnQgQm91bmRIYXNDb25mbGljdGluZ0FyZ3VtZW50cyA9IFR5cGVSZWxhdGVkICsgNTY0OwkKKwlpbnQgQm91bmRIYXNDb25mbGljdGluZ0FyZ3VtZW50cyA9IFR5cGVSZWxhdGVkICsgNTY0OwogICAgIC8qKiBAc2luY2UgMy4xICovCiAJaW50IER1cGxpY2F0ZVBhcmFtZXRlcml6ZWRNZXRob2RzID0gTWV0aG9kUmVsYXRlZCArIDU2NTsKIAkvKiogQHNpbmNlIDMuMSAqLwpAQCAtMTA2NywxNCArMTEzNiwyMSBAQAogCWludCBUeXBlSGlkaW5nVHlwZVBhcmFtZXRlckZyb21NZXRob2QgPSBUeXBlUmVsYXRlZCArIDU3NzsKICAgICAvKiogQHNpbmNlIDMuMyAqLwogICAgIGludCBJbnZhbGlkVXNhZ2VPZldpbGRjYXJkID0gU3ludGF4ICsgSW50ZXJuYWwgKyA1Nzg7Ci0JCisgICAgLyoqIEBzaW5jZSAzLjQgKi8KKyAgICBpbnQgVW51c2VkVHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb24gPSBNZXRob2RSZWxhdGVkICsgNTc5OworCiAJLyoqCiAJICogRm9yZWFjaAogCSAqLwotCS8qKiBAc2luY2UgMy4xICovCQotCWludCBJbmNvbXBhdGlibGVUeXBlc0luRm9yZWFjaCA9IFR5cGVSZWxhdGVkICsgNTgwOwkKKwkvKiogQHNpbmNlIDMuMSAqLworCWludCBJbmNvbXBhdGlibGVUeXBlc0luRm9yZWFjaCA9IFR5cGVSZWxhdGVkICsgNTgwOwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IEludmFsaWRUeXBlRm9yQ29sbGVjdGlvbiA9IEludGVybmFsICsgNTgxOworCS8qKiBAc2luY2UgMy42Ki8KKwlpbnQgSW52YWxpZFR5cGVGb3JDb2xsZWN0aW9uVGFyZ2V0MTQgPSBJbnRlcm5hbCArIDU4MjsKKworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgRHVwbGljYXRlSW5oZXJpdGVkTWV0aG9kcyA9IE1ldGhvZFJlbGF0ZWQgKyA1ODM7CiAJCiAJLyoqCiAJICogMS41IFN5bnRheCBlcnJvcnMgKHdoZW4gc291cmNlIGxldmVsIDwgMS41KQpAQCAtMTA5NSw3ICsxMTcxLDEwIEBACiAgICAgaW50IEludmFsaWRVc2FnZU9mQW5ub3RhdGlvbnMgPSBTeW50YXggKyBJbnRlcm5hbCArIDU5NjsKICAgICAvKiogQHNpbmNlIDMuMSAqLwogICAgIGludCBJbnZhbGlkVXNhZ2VPZkFubm90YXRpb25EZWNsYXJhdGlvbnMgPSBTeW50YXggKyBJbnRlcm5hbCArIDU5NzsKLSAgICAKKyAgICAvKiogQHNpbmNlIDMuNCAqLworICAgIGludCBJbnZhbGlkVXNhZ2VPZlR5cGVQYXJhbWV0ZXJzRm9yQW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gU3ludGF4ICsgSW50ZXJuYWwgKyA1OTg7CisgICAgLyoqIEBzaW5jZSAzLjQgKi8KKyAgICBpbnQgSW52YWxpZFVzYWdlT2ZUeXBlUGFyYW1ldGVyc0ZvckVudW1EZWNsYXJhdGlvbiA9IFN5bnRheCArIEludGVybmFsICsgNTk5OwogICAgIC8qKgogICAgICAqIEFubm90YXRpb24KICAgICAgKi8KQEAgLTExMTAsNyArMTE4OSw3IEBACiAgICAgLyoqIEBzaW5jZSAzLjEgKi8KIAlpbnQgSWxsZWdhbE1vZGlmaWVyRm9yQW5ub3RhdGlvbk1lbWJlclR5cGUgPSBUeXBlUmVsYXRlZCArIDYwNDsKICAgICAvKiogQHNpbmNlIDMuMSAqLwotCWludCBJbnZhbGlkQW5ub3RhdGlvbk1lbWJlclR5cGUgPSBUeXBlUmVsYXRlZCArIDYwNTsJCisJaW50IEludmFsaWRBbm5vdGF0aW9uTWVtYmVyVHlwZSA9IFR5cGVSZWxhdGVkICsgNjA1OwogICAgIC8qKiBAc2luY2UgMy4xICovCiAJaW50IEFubm90YXRpb25DaXJjdWxhcml0eVNlbGZSZWZlcmVuY2UgPSBUeXBlUmVsYXRlZCArIDYwNjsKICAgICAvKiogQHNpbmNlIDMuMSAqLwpAQCAtMTE3MCw3ICsxMjQ5LDE3IEBACiAJaW50IEFubm90YXRpb25WYWx1ZU11c3RCZUFuRW51bUNvbnN0YW50ID0gSW50ZXJuYWwgKyA2MzM7CiAJLyoqIEBzaW5jZSAzLjMgKi8KIAlpbnQgTWV0aG9kTXVzdE92ZXJyaWRlT3JJbXBsZW1lbnQgPSBNZXRob2RSZWxhdGVkICsgNjM0OwotCQorCS8qKiBAc2luY2UgMy40ICovCisJaW50IFVudXNlZFdhcm5pbmdUb2tlbiA9IEludGVybmFsICsgNjM1OworCS8qKiBAc2luY2UgMy42ICovCisJaW50IE1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbiA9IE1ldGhvZFJlbGF0ZWQgKyA2MzY7CisKKwkvKioKKwkgKiBNb3JlIHByb2JsZW1zIGluIGdlbmVyaWNzCisJICovCisgICAgLyoqIEBzaW5jZSAzLjQgKi8KKyAgICBpbnQgVW51c2VkVHlwZUFyZ3VtZW50c0ZvckNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IE1ldGhvZFJlbGF0ZWQgKyA2NjA7CisKIAkvKioKIAkgKiBDb3JydXB0ZWQgYmluYXJpZXMKIAkgKi8KQEAgLTExOTEsMTUgKzEyODAsMTYgQEAKIAlpbnQgQm94aW5nQ29udmVyc2lvbiA9IEludGVybmFsICsgNzIwOwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IFVuYm94aW5nQ29udmVyc2lvbiA9IEludGVybmFsICsgNzIxOwotCQorCiAJLyoqCiAJICogRW51bQogCSAqLwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IElsbGVnYWxNb2RpZmllckZvckVudW0gPSBUeXBlUmVsYXRlZCArIDc1MDsKIAkvKiogQHNpbmNlIDMuMSAqLwotCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JFbnVtQ29uc3RhbnQgPSBGaWVsZFJlbGF0ZWQgKyA3NTE7CQotCS8qKiBAc2luY2UgMy4xICovCisJaW50IElsbGVnYWxNb2RpZmllckZvckVudW1Db25zdGFudCA9IEZpZWxkUmVsYXRlZCArIDc1MTsKKwkvKiogQGRlcHJlY2F0ZWQgLSBwcm9ibGVtIGNvdWxkIG5vdCBiZSByZXBvcnRlZCwgZW51bXMgY2Fubm90IGJlIGxvY2FsIHRha2VzIHByZWNlZGVuY2UgCisJICogICBAc2luY2UgMy4xICovCiAJaW50IElsbGVnYWxNb2RpZmllckZvckxvY2FsRW51bSA9IFR5cGVSZWxhdGVkICsgNzUyOwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IElsbGVnYWxNb2RpZmllckZvck1lbWJlckVudW0gPSBUeXBlUmVsYXRlZCArIDc1MzsKQEAgLTEyMjEsNyArMTMxMSwxMyBAQAogCWludCBNaXNzaW5nRW51bUNvbnN0YW50Q2FzZSA9IEZpZWxkUmVsYXRlZCArIDc2MTsKIAkvKiogQHNpbmNlIDMuMiAqLyAvLyBUT0RPIG5lZWQgdG8gZml4IDMuMS4xIGNvbnRyaWJ1dGlvbiAoaW5saW5lIHRoaXMgY29uc3RhbnQgb24gY2xpZW50IHNpZGUpCiAJaW50IEVudW1TdGF0aWNGaWVsZEluSW5Jbml0aWFsaXplckNvbnRleHQgPSBGaWVsZFJlbGF0ZWQgKyA3NjI7Ci0JCisJLyoqIEBzaW5jZSAzLjQgKi8KKwlpbnQgRW51bUNvbnN0YW50TXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDc2MzsKKwkvKiogQHNpbmNlIDMuNSAqLworCWludCBFbnVtQ29uc3RhbnRDYW5ub3REZWZpbmVBYnN0cmFjdE1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyA3NjQ7CisJLyoqIEBzaW5jZSAzLjUgKi8KKwlpbnQgQWJzdHJhY3RNZXRob2RJbkVudW0gPSBNZXRob2RSZWxhdGVkICsgNzY1OworCiAJLyoqCiAJICogVmFyIGFyZ3MKIAkgKi8KQEAgLTEyMzMsNyArMTMyOSwxMiBAQAogCWludCBDb25zdHJ1Y3RvclZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0ID0gQ29uc3RydWN0b3JSZWxhdGVkICsgODAyOwogCS8qKiBAc2luY2UgMy4xICovCiAJaW50IFZhcmFyZ3NDb25mbGljdCA9IE1ldGhvZFJlbGF0ZWQgKyA4MDM7Ci0JCisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBTYWZlVmFyYXJnc09uRml4ZWRBcml0eU1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyA4MDQ7CisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBTYWZlVmFyYXJnc09uTm9uRmluYWxJbnN0YW5jZU1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyA4MDU7CisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBQb3RlbnRpYWxIZWFwUG9sbHV0aW9uRnJvbVZhcmFyZyA9IE1ldGhvZFJlbGF0ZWQgKyA4MDY7CiAJLyoqCiAJICogSmF2YWRvYyBHZW5lcmljCiAJICovCkBAIC0xMjU5LDYgKzEzNjAsMzkgQEAKIAlpbnQgSmF2YWRvY1R5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljQ29uc3RydWN0b3IgPSBKYXZhZG9jICsgSW50ZXJuYWwgKyA4NTk7CiAKIAkvKioKKwkgKiBKYXZhIDcgZXJyb3JzCisJICovCisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBBc3NpZ25tZW50VG9NdWx0aUNhdGNoUGFyYW1ldGVyID0gSW50ZXJuYWwgKyA4NzA7CisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBSZXNvdXJjZUhhc1RvSW1wbGVtZW50QXV0b0Nsb3NlYWJsZSA9IFR5cGVSZWxhdGVkICsgODcxOworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgQXNzaWdubWVudFRvUmVzb3VyY2UgPSBJbnRlcm5hbCArIDg3MjsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IEludmFsaWRVbmlvblR5cGVSZWZlcmVuY2VTZXF1ZW5jZSA9IEludGVybmFsICsgVHlwZVJlbGF0ZWQgKyA4NzM7IAorCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgQXV0b01hbmFnZWRSZXNvdXJjZU5vdEJlbG93MTcgPSBTeW50YXggKyBJbnRlcm5hbCArIDg3NDsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IE11bHRpQ2F0Y2hOb3RCZWxvdzE3ID0gIFN5bnRheCArIEludGVybmFsICsgODc1OworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgUG9seW1vcnBoaWNNZXRob2ROb3RCZWxvdzE3ID0gTWV0aG9kUmVsYXRlZCArIDg3NjsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IEluY29ycmVjdFN3aXRjaFR5cGUxNyA9IFR5cGVSZWxhdGVkICsgODc3OworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgQ2Fubm90SW5mZXJFbGlkZWRUeXBlcyA9IFR5cGVSZWxhdGVkICsgODc4OworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgQ2Fubm90VXNlRGlhbW9uZFdpdGhFeHBsaWNpdFR5cGVBcmd1bWVudHMgPSBUeXBlUmVsYXRlZCArIDg3OTsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IENhbm5vdFVzZURpYW1vbmRXaXRoQW5vbnltb3VzQ2xhc3NlcyA9IFR5cGVSZWxhdGVkICsgODgwOworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgU3dpdGNoT25TdHJpbmdzTm90QmVsb3cxNyA9IFR5cGVSZWxhdGVkICsgODgxOwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ4NDkyCisJLyoqIEBzaW5jZSAzLjcuMSAqLworCWludCBVbmhhbmRsZWRFeGNlcHRpb25PbkF1dG9DbG9zZSA9ICBUeXBlUmVsYXRlZCArIDg4MjsKKwkvKiogQHNpbmNlIDMuNy4xICovCisJaW50IERpYW1vbmROb3RCZWxvdzE3ID0gIFR5cGVSZWxhdGVkICsgODgzOworCS8qKiBAc2luY2UgMy43LjEgKi8KKwlpbnQgUmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyA9IFR5cGVSZWxhdGVkICsgODg0OworCS8qKgogCSAqIEV4dGVybmFsIHByb2JsZW1zIC0tIFRoZXNlIGFyZSBwcm9ibGVtcyBkZWZpbmVkIGJ5IG90aGVyIHBsdWdpbnMKIAkgKi8KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQppbmRleCAzYmM3YzkwLi4wYjlmNDE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywxNCArMTMsMTQgQEAKIAogLyoqCiAgKiBFeGNlcHRpb24gdGhyb3duIGJ5IGEgc2Nhbm5lciB3aGVuIGVuY291bnRlcmluZyBsZXhpY2FsIGVycm9ycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjkwOTczMjg1MzQ5OTczMTU5Mkw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlLgogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQVNUVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0FTVFZpc2l0b3IuamF2YQppbmRleCA1NWRiZmU1Li4wNGM5ODM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQVNUVmlzaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9BU1RWaXNpdG9yLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNyw3ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOwogCi0vKiogCisvKioKICAqIEEgdmlzaXRvciBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIHBhcnNlIHRyZWUuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU1RWaXNpdG9yIHsKQEAgLTM2LDcgKzM2LDcgQEAKIAkJCUFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLAogCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7CiAJCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9CQorCX0KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcmd1bWVudCBhcmd1bWVudCwgQmxvY2tTY29wZSBzY29wZSkgewogCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKIAl9CkBAIC00MjcsNyArNDI3LDcgQEAKIAkJVHlwZURlY2xhcmF0aW9uIGxvY2FsVHlwZURlY2xhcmF0aW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0JCisJfQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAogCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLAogCQlDbGFzc1Njb3BlIHNjb3BlKSB7CkBAIC00NDcsNiArNDQ3LDE2IEBACiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgewogCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKIAl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCQlVbmlvblR5cGVSZWZlcmVuY2UgdW5pb25UeXBlUmVmZXJlbmNlLAorCQkJQmxvY2tTY29wZSBzY29wZSkgeworCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCQlVbmlvblR5cGVSZWZlcmVuY2UgdW5pb25UeXBlUmVmZXJlbmNlLAorCQkJQ2xhc3NTY29wZSBzY29wZSkgeworCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CiAJcHVibGljIHZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CiAJfQpAQCAtNDY4LDcgKzQ3OCw3IEBACiAJCQlBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiwKIAkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSkgewogCQlyZXR1cm4gdHJ1ZTsgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0LCBrZWVwIHRyYXZlcnNpbmcKLQl9CQorCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcmd1bWVudCBhcmd1bWVudCwgQmxvY2tTY29wZSBzY29wZSkgewogCQlyZXR1cm4gdHJ1ZTsgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0LCBrZWVwIHRyYXZlcnNpbmcKIAl9CkBAIC04NjcsNyArODc3LDcgQEAKIAkJVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwKIAkJQ2xhc3NTY29wZSBzY29wZSkgewogCQlyZXR1cm4gdHJ1ZTsgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0LCBrZWVwIHRyYXZlcnNpbmcKLQl9CQorCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKIAkJQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKQEAgLTg4Miw2ICs4OTIsMTYgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChVbmFyeUV4cHJlc3Npb24gdW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCXJldHVybiB0cnVlOyAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQsIGtlZXAgdHJhdmVyc2luZwogCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGVSZWZlcmVuY2UsCisJCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOyAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQsIGtlZXAgdHJhdmVyc2luZworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGVSZWZlcmVuY2UsCisJCQlDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOyAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQsIGtlZXAgdHJhdmVyc2luZworCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgewogCQlyZXR1cm4gdHJ1ZTsgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0LCBrZWVwIHRyYXZlcnNpbmcKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIuamF2YQppbmRleCA2NjQ3MmNjLi41YzA1ZjkzIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsNzMgKzIyLDczIEBACiAJICogQ29uZmlndXJlIHRoZSByZWNlaXZlciB1c2luZyB0aGUgZ2l2ZW4gYmF0Y2ggY29tcGlsZXIgYW5kIHRoZSBnaXZlbiBvcHRpb25zLgogCSAqIFRoZSBwYXJhbWV0ZXIgYmF0Y2hDb21waWxlciBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgYmF0Y2ggY29tcGlsZXIuIFRoaXMgbWV0aG9kIGlzCiAJICogb25seSB1c2VkIGZvciB0aGUgYmF0Y2ggbW9kZS4gRm9yIHRoZSBJREUgbW9kZSwgcGxlYXNlIHNlZSB7QGxpbmsgI2NvbmZpZ3VyZUZyb21QbGF0Zm9ybShDb21waWxlciwgT2JqZWN0LCBPYmplY3QpfS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBiYXRjaENvbXBpbGVyIHRoZSBnaXZlbiBiYXRjaCBjb21waWxlciBvYmplY3QKIAkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgZ2l2ZW4gb3B0aW9ucwogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbmZpZ3VyZShPYmplY3QgYmF0Y2hDb21waWxlciwgU3RyaW5nW10gb3B0aW9ucyk7Ci0JCisKIAkvKioKLQkgKiBDb25maWd1cmUgdGhlIHJlY2VpdmVyIHVzaW5nIHRoZSBnaXZlbiBjb21waWxlciwgdGhlIGdpdmVuIGNvbXBpbGF0aW9uVW5pdExvY2F0b3IgYW5kIAorCSAqIENvbmZpZ3VyZSB0aGUgcmVjZWl2ZXIgdXNpbmcgdGhlIGdpdmVuIGNvbXBpbGVyLCB0aGUgZ2l2ZW4gY29tcGlsYXRpb25Vbml0TG9jYXRvciBhbmQKIAkgKiB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvbXBpbGVyIHRoZSBnaXZlbiBjb21waWxlcgogCSAqIEBwYXJhbSBjb21waWxhdGlvblVuaXRMb2NhdG9yIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGxvY2F0b3IKIAkgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIGphdmEgcHJvamVjdAogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbmZpZ3VyZUZyb21QbGF0Zm9ybShDb21waWxlciBjb21waWxlciwgT2JqZWN0IGNvbXBpbGF0aW9uVW5pdExvY2F0b3IsIE9iamVjdCBqYXZhUHJvamVjdCk7Ci0JCisKIAkvKioKIAkgKiBTZXQgdGhlIHByaW50IHdyaXRlciBmb3IgdGhlIHN0YW5kYXJkIG91dHB1dC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvdXQgdGhlIGdpdmVuIHByaW50IHdyaXRlciBmb3Igb3V0cHV0CiAJICovCiAJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T3V0KFByaW50V3JpdGVyIG91dCk7Ci0JCisKIAkvKioKIAkgKiBTZXQgdGhlIHByaW50IHdyaXRlciBmb3IgdGhlIHN0YW5kYXJkIGVycm9yLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVyciB0aGUgZ2l2ZW4gcHJpbnQgd3JpdGVyIGZvciBlcnJvcgogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVycihQcmludFdyaXRlciBlcnIpOwogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBuZXcgdW5pdHMgY3JlYXRlZCBpbiB0aGUgbGFzdCByb3VuZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5ldyB1bml0cyBjcmVhdGVkIGluIHRoZSBsYXN0IHJvdW5kCiAJICovCiAJcHVibGljIGFic3RyYWN0IElDb21waWxhdGlvblVuaXRbXSBnZXROZXdVbml0cygpOwotCQorCiAJLyoqCiAJICogUmV0dXJuIHRoZSBuZXcgYmluYXJ5IGJpbmRpbmdzIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgcm91bmQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuZXcgYmluYXJ5IGJpbmRpbmdzIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgcm91bmQKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgUmVmZXJlbmNlQmluZGluZ1tdIGdldE5ld0NsYXNzRmlsZXMoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGRlbGV0ZWQgdW5pdHMuCiAJICogQHJldHVybiB0aGUgZGVsZXRlZCB1bml0cwogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCBJQ29tcGlsYXRpb25Vbml0W10gZ2V0RGVsZXRlZFVuaXRzKCk7Ci0JCisKIAkvKioKIAkgKiBSZWluaXRpYWxpemUgdGhlIHJlY2VpdmVyCiAJICovCiAJcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKTsKLQkKKwogCS8qKgogCSAqIFJ1biBhIG5ldyBhbm5vdGF0aW9uIHByb2Nlc3Npbmcgcm91bmQgb24gdGhlIGdpdmVuIHZhbHVlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB1bml0cyB0aGUgZ2l2ZW4gc291cmNlIHR5cGUKIAkgKiBAcGFyYW0gcmVmZXJlbmNlQmluZGluZ3MgdGhlIGdpdmVuIGJpbmFyeSB0eXBlcwogCSAqIEBwYXJhbSBpc0xhc3RSb3VuZCBmbGFnIHRvIG5vdGlmeSB0aGUgbGFzdCByb3VuZAogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NBbm5vdGF0aW9ucyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHVuaXRzLCBSZWZlcmVuY2VCaW5kaW5nW10gcmVmZXJlbmNlQmluZGluZ3MsIGJvb2xlYW4gaXNMYXN0Um91bmQpOwotCQorCiAJLyoqCiAJICogU2V0IHRoZSBwcm9jZXNzb3JzIGZvciBhbm5vdGF0aW9uIHByb2Nlc3NpbmcuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvY2Vzc29ycyB0aGUgZ2l2ZW4gcHJvY2Vzc29ycwogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFByb2Nlc3NvcnMoT2JqZWN0W10gcHJvY2Vzc29ycyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEKaW5kZXggNzA0NTkzNi4uNTAzNWQ4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9DbGFzc0ZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxNyArMTAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwpAQCAtNDYsOSArNDIsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvbnN0YW50UG9vbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5FeGNlcHRpb25MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5WZXJpZmljYXRpb25UeXBlSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLlN0YWNrTWFwRnJhbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uRXhjZXB0aW9uTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLlN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLlN0YWNrRGVwdGhNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uU3RhY2tNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uVmVyaWZpY2F0aW9uVHlwZUluZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlN0cmluZ0NvbnN0YW50OwpAQCAtNTgsNyArNTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb29rdXBFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5OZXN0ZWRUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlN5bnRoZXRpY0FyZ3VtZW50QmluZGluZzsKQEAgLTY3LDcgKzY2LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlVmFyaWFibGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlNob3VsZE5vdEltcGxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCkBAIC04NSwxMiArODYsMTEgQEAKICAqIAkJRm9yIGV4YW1wbGUsIHt7amF2YX0sIHt1dGlsfSwge0hhc2h0YWJsZX19LgogICoKICAqIGJ5dGVbXSBnZXRSZWR1Y2VkQnl0ZXMoKTsKLSAqIAkJQW5zd2VyIGEgc21hbGxlciBieXRlIGZvcm1hdCwgd2hpY2ggaXMgb25seSBjb250YWlucyBzb21lIHN0cnVjdHVyYWwgCi0gKiAgICAgIGluZm9ybWF0aW9uLiBUaG9zZSBieXRlcyBhcmUgZGVjb2RhYmxlIHdpdGggYSByZWd1bGFyIGNsYXNzIGZpbGUgcmVhZGVyLCAKKyAqIAkJQW5zd2VyIGEgc21hbGxlciBieXRlIGZvcm1hdCwgd2hpY2ggaXMgb25seSBjb250YWlucyBzb21lIHN0cnVjdHVyYWwKKyAqICAgICAgaW5mb3JtYXRpb24uIFRob3NlIGJ5dGVzIGFyZSBkZWNvZGFibGUgd2l0aCBhIHJlZ3VsYXIgY2xhc3MgZmlsZSByZWFkZXIsCiAgKiAgICAgIHN1Y2ggYXMgRGlldENsYXNzRmlsZVJlYWRlcgogICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlCi0JaW1wbGVtZW50cyBUeXBlQ29uc3RhbnRzLCBUeXBlSWRzIHsKK3B1YmxpYyBjbGFzcyBDbGFzc0ZpbGUgaW1wbGVtZW50cyBUeXBlQ29uc3RhbnRzLCBUeXBlSWRzIHsKIAogCXByaXZhdGUgYnl0ZVtdIGJ5dGVzOwogCXB1YmxpYyBDb2RlU3RyZWFtIGNvZGVTdHJlYW07CkBAIC0xMDQsNyArMTA0LDcgQEAKIAlwdWJsaWMgaW50IGNvbnRlbnRzT2Zmc2V0OwogCiAJcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRpbmdQcm9ibGVtVHlwZTsKLQkKKwogCXB1YmxpYyBDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlOwogCXB1YmxpYyBieXRlW10gaGVhZGVyOwogCS8vIHRoYXQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgdGhlIHJlbWFpbmluZyBieXRlcyBvZiB0aGUgLmNsYXNzIGZpbGUKQEAgLTExMywxMzQgKzExMywyMiBAQAogCXB1YmxpYyBpbnQgbWV0aG9kQ291bnQ7CiAJcHVibGljIGludCBtZXRob2RDb3VudE9mZnNldDsKIAkvLyBwb29sIG1hbmFnbWVudAotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkID0gZmFsc2U7CisJYm9vbGVhbiBpc1NoYXJlZCA9IGZhbHNlOwogCS8vIHVzZWQgdG8gZ2VuZXJhdGUgcHJpdmF0ZSBhY2Nlc3MgbWV0aG9kcwogCS8vIGRlYnVnIGFuZCBzdGFjayBtYXAgYXR0cmlidXRlcwogCXB1YmxpYyBpbnQgcHJvZHVjZUF0dHJpYnV0ZXM7CiAJcHVibGljIFNvdXJjZVR5cGVCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmc7CisJcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRUeXBlOwogCXB1YmxpYyBsb25nIHRhcmdldEpESzsKKworCXB1YmxpYyBMaXN0IG1pc3NpbmdUeXBlcyA9IG51bGw7CisKKwlwdWJsaWMgU2V0IHZpc2l0ZWRUeXBlczsKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfQ09OVEVOVFNfU0laRSA9IDQwMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0hFQURFUl9TSVpFID0gMTUwMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk5FUl9DTEFTU0VTX1NJWkUgPSA1OwotCQotCS8qKgotCSAqIElOVEVSTkFMIFVTRS1PTkxZCi0JICogQnVpbGQgYWxsIHRoZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZXMgbmFtZXMKLQkgKiBpbnRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMuCi0JICoKLQkgKiBvdXRwdXRQYXRoIGlzIGZvcm1lZCBsaWtlOgotCSAqCSAgIGM6XHRlbXBcIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGZpbGUgc2VwYXJhdG9yCi0JICogcmVsYXRpdmVGaWxlTmFtZSBpcyBmb3JtZWQgbGlrZToKLQkgKiAgICAgamF2YVxsYW5nXFN0cmluZy5jbGFzcyAqCi0JICogCi0JICogQHBhcmFtIG91dHB1dFBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxhdGl2ZUZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEFsbERpcmVjdG9yaWVzSW50bygKLQkJU3RyaW5nIG91dHB1dFBhdGgsCi0JCVN0cmluZyByZWxhdGl2ZUZpbGVOYW1lKQotCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGFyIGZpbGVTZXBhcmF0b3JDaGFyID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZVNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yOwotCQlGaWxlIGY7Ci0JCW91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnJlcGxhY2UoJy8nLCBmaWxlU2VwYXJhdG9yQ2hhcik7Ci0JCQkvLyB0aGVzZSBjb3VsZCBiZSBvcHRpbWl6ZWQgb3V0IGlmIHdlIG5vcm1hbGl6ZWQgcGF0aHMgb25jZSBhbmQgZm9yCi0JCQkvLyBhbGwKLQkJcmVsYXRpdmVGaWxlTmFtZSA9IHJlbGF0aXZlRmlsZU5hbWUucmVwbGFjZSgnLycsIGZpbGVTZXBhcmF0b3JDaGFyKTsKLQkJU3RyaW5nIG91dHB1dERpclBhdGgsIGZpbGVOYW1lOwotCQlpbnQgc2VwYXJhdG9ySW5kZXggPSByZWxhdGl2ZUZpbGVOYW1lLmxhc3RJbmRleE9mKGZpbGVTZXBhcmF0b3JDaGFyKTsKLQkJaWYgKHNlcGFyYXRvckluZGV4ID09IC0xKSB7Ci0JCQlpZiAob3V0cHV0UGF0aC5lbmRzV2l0aChmaWxlU2VwYXJhdG9yKSkgewotCQkJCW91dHB1dERpclBhdGggPSBvdXRwdXRQYXRoLnN1YnN0cmluZygwLCBvdXRwdXRQYXRoLmxlbmd0aCgpIC0gMSk7Ci0JCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgcmVsYXRpdmVGaWxlTmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0RGlyUGF0aCA9IG91dHB1dFBhdGg7Ci0JCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgZmlsZVNlcGFyYXRvciArIHJlbGF0aXZlRmlsZU5hbWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob3V0cHV0UGF0aC5lbmRzV2l0aChmaWxlU2VwYXJhdG9yKSkgewotCQkJCW91dHB1dERpclBhdGggPSBvdXRwdXRQYXRoICsgCi0JCQkJCXJlbGF0aXZlRmlsZU5hbWUuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KTsKLQkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyByZWxhdGl2ZUZpbGVOYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXREaXJQYXRoID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKwotCQkJCQlyZWxhdGl2ZUZpbGVOYW1lLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7Ci0JCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgZmlsZVNlcGFyYXRvciArIHJlbGF0aXZlRmlsZU5hbWU7Ci0JCQl9Ci0JCX0KLQkJZiA9IG5ldyBGaWxlKG91dHB1dERpclBhdGgpOwotCQlmLm1rZGlycygpOwotCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgZGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZCBmb3Igc29tZSByZWFzb24gLSByZXRyeSB1c2luZwotCQkJLy8gYSBzbG93ZXIgYWxnb3JpdGhtIHNvIGFzIHRvIHJlZmluZSB0aGUgZGlhZ25vc3RpYwotCQkJaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsKLQkJCQlvdXRwdXRQYXRoID0gb3V0cHV0UGF0aC5zdWJzdHJpbmcoMCwgb3V0cHV0UGF0aC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJZiA9IG5ldyBGaWxlKG91dHB1dFBhdGgpOwotCQkJYm9vbGVhbiBjaGVja0ZpbGVUeXBlID0gZmFsc2U7Ci0JCQlpZiAoZi5leGlzdHMoKSkgewotCQkJICAJY2hlY2tGaWxlVHlwZSA9IHRydWU7IC8vIHByZS1leGlzdGVkCi0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGhhdmUgdG8gY3JlYXRlIHRoYXQgZGlyZWN0b3J5Ci0JCQkJaWYgKCFmLm1rZGlycygpKSB7Ci0JCQkJICAJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQkgIAkgIAkvLyBzb21lb25lIGVsc2UgY3JlYXRlZCBmIC0tIG5lZWQgdG8gY2hlY2sgaXRzIHR5cGUKLQkJCQkgIAkgIAljaGVja0ZpbGVUeXBlID0gdHJ1ZTsKLQkJCQkgIAl9IGVsc2UgewotCQkJCSAgCSAgCS8vIG5vIG9uZSBjb3VsZCBjcmVhdGUgZiAtLSBjb21wbGFpbgotCSAgICAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoCi0JICAgIAkJCQkJTWVzc2FnZXMub3V0cHV0X25vdFZhbGlkQWxsLCBmLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJICAJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGVja0ZpbGVUeXBlKSB7Ci0JCQkgIAlpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotCSAgICAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuYmluZCgKLQkgICAgCQkJCU1lc3NhZ2VzLm91dHB1dF9pc0ZpbGUsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCSAgCX0KLQkJCX0KLQkJCVN0cmluZ0J1ZmZlciBvdXREaXIgPSBuZXcgU3RyaW5nQnVmZmVyKG91dHB1dFBhdGgpOwotCQkJb3V0RGlyLmFwcGVuZChmaWxlU2VwYXJhdG9yKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPQotCQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIocmVsYXRpdmVGaWxlTmFtZSwgZmlsZVNlcGFyYXRvcik7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWYgPSBuZXcgRmlsZShvdXREaXIuYXBwZW5kKHRva2VuKS5hcHBlbmQoZmlsZVNlcGFyYXRvcikudG9TdHJpbmcoKSk7Ci0JCQkgIAljaGVja0ZpbGVUeXBlID0gZmFsc2U7IC8vIHJlc2V0Ci0JCQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQkgIAljaGVja0ZpbGVUeXBlID0gdHJ1ZTsgLy8gdGhpcyBpcyBzdWJvcHRpbWFsLCBidXQgaXQgY2F0Y2hlcyBjb3JuZXIgY2FzZXMKLQkJCQkgIAkJCQkJCSAgLy8gaW4gd2hpY2ggYSByZWd1bGFyIGZpbGUgcHJlLWV4aXN0cwotCQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgaGF2ZSB0byBjcmVhdGUgdGhhdCBkaXJlY3RvcnkKLQkgICAgCQkJaWYgKCFmLm1rZGlyKCkpIHsKLQkgICAgCQkJICAJaWYgKGYuZXhpc3RzKCkpIHsKLQkgICAgCQkJICAJICAJLy8gc29tZW9uZSBlbHNlIGNyZWF0ZWQgZiAtLSBuZWVkIHRvIGNoZWNrIGl0cyB0eXBlCi0JICAgIAkJCSAgCSAgCWNoZWNrRmlsZVR5cGUgPSB0cnVlOwotCSAgICAJCQkgIAl9IGVsc2UgewotCSAgICAJCQkgIAkgIAkvLyBubyBvbmUgY291bGQgY3JlYXRlIGYgLS0gY29tcGxhaW4KLQkgICAgICAgIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuYmluZCgKLQkgICAgICAgIAkJCQkJTWVzc2FnZXMub3V0cHV0X25vdFZhbGlkLCAKLQkgICAgICAgIAkJCQkJCW91dERpci5zdWJzdHJpbmcob3V0cHV0UGF0aC5sZW5ndGgoKSArIDEsIAotCSAgICAgICAgCQkJCQkJCW91dERpci5sZW5ndGgoKSAtIDEpLAotCSAgICAgICAgCQkJCQkJb3V0cHV0UGF0aCkpOwotCSAgICAJCQkgIAl9Ci0JICAgIAkJCX0KLQkJCQl9Ci0JICAgIAkJaWYgKGNoZWNrRmlsZVR5cGUpIHsKLQkgICAgCQkgIAlpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotCSAgICAgICAgCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoCi0JICAgICAgICAJCQkJTWVzc2FnZXMub3V0cHV0X2lzRmlsZSwgZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCSAgICAJCSAgCX0KLQkgICAgCQl9Ci0JCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQkvLyB0b2tlbiBjb250YWlucyB0aGUgbGFzdCBvbmUKLQkJCXJldHVybiBvdXREaXIuYXBwZW5kKHRva2VuKS50b1N0cmluZygpOwotCQl9Ci0JfQorCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBSZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBhIENsYXNzRmlsZSBjb21wYXRpYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvYmxlbWF0aWMgdHlwZQpAQCAtMjQ4LDEzICsxMzYsMTEgQEAKIAkgKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uCiAJICogQHBhcmFtIHVuaXRSZXN1bHQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uVW5pdFJlc3VsdAogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtVHlwZSgKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CiAJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CiAJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBDbGFzc0ZpbGUuZ2V0TmV3SW5zdGFuY2UodHlwZUJpbmRpbmcpOwogCQljbGFzc0ZpbGUuaW5pdGlhbGl6ZSh0eXBlQmluZGluZywgbnVsbCwgdHJ1ZSk7Ci0JCisKIAkJaWYgKHR5cGVCaW5kaW5nLmhhc01lbWJlclR5cGVzKCkpIHsKIAkJCS8vIHNlZSBidWcgMTgwMTA5CiAJCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVycyA9IHR5cGVCaW5kaW5nLm1lbWJlclR5cGVzOwpAQCAtMjY3LDcgKzE1MywxMyBAQAogCQlpZiAodHlwZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpIHsKIAkJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXModHlwZUJpbmRpbmcpOwogCQl9Ci0KKwkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSB0eXBlQmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZUJpbmRpbmcgPSB0eXBlVmFyaWFibGVzW2ldOworCQkJaWYgKCh0eXBlVmFyaWFibGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApIHsKKwkJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUoY2xhc3NGaWxlLCB0eXBlVmFyaWFibGVCaW5kaW5nKTsKKwkJCX0KKwkJfQogCQkvLyBhZGQgaXRzIGZpZWxkcwogCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSB0eXBlQmluZGluZy5maWVsZHMoKTsKIAkJaWYgKChmaWVsZHMgIT0gbnVsbCkgJiYgKGZpZWxkcyAhPSBCaW5kaW5nLk5PX0ZJRUxEUykpIHsKQEAgLTI4Nyw3ICsxNzksNyBAQAogCQl9CiAJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zQ29weSA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOwogCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKLQkJCisKIAkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CiAJCWlmIChtZXRob2REZWNscyAhPSBudWxsKSB7CiAJCQlpZiAodHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgewpAQCAtMjk4LDggKzE5MCw5IEBACiAJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG1ldGhvZERlY2xzW2ldOwogCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZERlY2wuYmluZGluZzsKIAkJCQkJaWYgKG1ldGhvZCA9PSBudWxsIHx8IG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlOworCQkJCQltZXRob2QubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdDsKIAkJCQkJY2xhc3NGaWxlLmFkZEFic3RyYWN0TWV0aG9kKG1ldGhvZERlY2wsIG1ldGhvZCk7Ci0JCQkJfQkJCisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kRGVjbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kRGVjbHNbaV07CkBAIC0zMDcsNiArMjAwLDggQEAKIAkJCQkJaWYgKG1ldGhvZCA9PSBudWxsKSBjb250aW51ZTsKIAkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKIAkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IobWV0aG9kRGVjbCwgbWV0aG9kLCBwcm9ibGVtc0NvcHkpOworCQkJCQl9IGVsc2UgaWYgKG1ldGhvZC5pc0Fic3RyYWN0KCkpIHsKKwkJCQkJCWNsYXNzRmlsZS5hZGRBYnN0cmFjdE1ldGhvZChtZXRob2REZWNsLCBtZXRob2QpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1NZXRob2QobWV0aG9kRGVjbCwgbWV0aG9kLCBwcm9ibGVtc0NvcHkpOwogCQkJCQl9CkBAIC0zMTQsOCArMjA5LDggQEAKIAkJCX0KIAkJCS8vIGFkZCBhYnN0cmFjdCBtZXRob2RzCiAJCQljbGFzc0ZpbGUuYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOwotCQl9CQkKLQkJCisJCX0KKwogCQkvLyBwcm9wYWdhdGUgZ2VuZXJhdGlvbiBvZiAocHJvYmxlbSkgbWVtYmVyIHR5cGVzCiAJCWlmICh0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtMzMyLDY4ICsyMjcsNiBAQAogCQlMb29rdXBFbnZpcm9ubWVudCBlbnYgPSB0eXBlQmluZGluZy5zY29wZS5lbnZpcm9ubWVudCgpOwogCQlyZXR1cm4gZW52LmNsYXNzRmlsZVBvb2wuYWNxdWlyZSh0eXBlQmluZGluZyk7CiAJfQotCQotCS8qKgotCSAqIElOVEVSTkFMIFVTRS1PTkxZCi0JICogb3V0cHV0UGF0aCBpcyBmb3JtZWQgbGlrZToKLQkgKgkgICBjOlx0ZW1wXCB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBmaWxlIHNlcGFyYXRvcgotCSAqIHJlbGF0aXZlRmlsZU5hbWUgaXMgZm9ybWVkIGxpa2U6Ci0JICogICAgIGphdmFcbGFuZ1xTdHJpbmcuY2xhc3MKLQkgKiBAcGFyYW0gZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZSBhIGZsYWcgdG8ga25vdyBpZiB0aGUgcGFja2FnZXMgc3RydWN0dXJlIGhhcyB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIG91dHB1dFBhdGggdGhlIGdpdmVuIG91dHB1dCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gcmVsYXRpdmVGaWxlTmFtZSB0aGUgZ2l2ZW4gcmVsYXRpdmUgZmlsZSBuYW1lCi0JICogQHBhcmFtIGNsYXNzRmlsZSB0aGUgZ2l2ZW4gY2xhc3NGaWxlIHRvIHdyaXRlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9EaXNrKAotCQlib29sZWFuIGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsCi0JCVN0cmluZyBvdXRwdXRQYXRoLAotCQlTdHJpbmcgcmVsYXRpdmVGaWxlTmFtZSwKLQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQotCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotICAgIAlpZiAoZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZSkgewotICAgIAkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgIAkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKAotICAgIAkJCQluZXcgRmlsZShidWlsZEFsbERpcmVjdG9yaWVzSW50byhvdXRwdXRQYXRoLCByZWxhdGl2ZUZpbGVOYW1lKSkpKTsKLSAgICAJfSBlbHNlIHsKLSAgICAJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0gICAgCQljaGFyIGZpbGVTZXBhcmF0b3JDaGFyID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgIAkJU3RyaW5nIGZpbGVTZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvcjsKLSAgICAJCS8vIEZpcnN0IHdlIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXRQYXRoIGV4aXN0cwotICAgIAkJb3V0cHV0UGF0aCA9IG91dHB1dFBhdGgucmVwbGFjZSgnLycsIGZpbGVTZXBhcmF0b3JDaGFyKTsKLSAgICAJCS8vIFRvIGJlIGFibGUgdG8gcGFzcyB0aGUgbWtkaXJzKCkgbWV0aG9kIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBmaWxlIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBvdXREaXIgbmFtZQotICAgIAkJaW50IGluZGV4T2ZQYWNrYWdlU2VwYXJhdG9yID0gcmVsYXRpdmVGaWxlTmFtZS5sYXN0SW5kZXhPZihmaWxlU2VwYXJhdG9yQ2hhcik7Ci0gICAgCQlpZiAoaW5kZXhPZlBhY2thZ2VTZXBhcmF0b3IgPT0gLTEpIHsKLSAgICAJCQlpZiAob3V0cHV0UGF0aC5lbmRzV2l0aChmaWxlU2VwYXJhdG9yKSkgewotICAgIAkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyByZWxhdGl2ZUZpbGVOYW1lOwotICAgIAkJCX0gZWxzZSB7Ci0gICAgCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKyByZWxhdGl2ZUZpbGVOYW1lOwotICAgIAkJCX0KLSAgICAJCX0gZWxzZSB7Ci0gICAgCQkJaW50IGxlbmd0aCA9IHJlbGF0aXZlRmlsZU5hbWUubGVuZ3RoKCk7Ci0gICAgCQkJaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsKLSAgICAJCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgcmVsYXRpdmVGaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXhPZlBhY2thZ2VTZXBhcmF0b3IgKyAxLCBsZW5ndGgpOwotICAgIAkJCX0gZWxzZSB7Ci0gICAgCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKyByZWxhdGl2ZUZpbGVOYW1lLnN1YnN0cmluZyhpbmRleE9mUGFja2FnZVNlcGFyYXRvciArIDEsIGxlbmd0aCk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgIAkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKAotICAgIAkJCQkJbmV3IEZpbGUoZmlsZU5hbWUpKSk7Ci0gICAgCX0KLQkJdHJ5IHsKLQkJCS8vIGlmIG5vIElPRXhjZXB0aW9uIG9jY3VyZWQsIG91dHB1dCBjYW5ub3QgYmUgbnVsbAotCQkJb3V0cHV0LndyaXRlKGNsYXNzRmlsZS5oZWFkZXIsIDAsIGNsYXNzRmlsZS5oZWFkZXJPZmZzZXQpOwotCQkJb3V0cHV0LndyaXRlKGNsYXNzRmlsZS5jb250ZW50cywgMCwgY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQkJfQotCX0KLQkKIAkvKioKIAkgKiBJTlRFUk5BTCBVU0UtT05MWQogCSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KQEAgLTQwMSw3ICsyMzQsNyBAQAogCXByb3RlY3RlZCBDbGFzc0ZpbGUoKSB7CiAJCS8vIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHN1YmNsYXNzZXMKIAl9Ci0JCisKIAlwdWJsaWMgQ2xhc3NGaWxlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CiAJCS8vIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHN1YmNsYXNzZXMKIAkJdGhpcy5jb25zdGFudFBvb2wgPSBuZXcgQ29uc3RhbnRQb29sKHRoaXMpOwpAQCAtNDA5LDMzICsyNDIsMzUgQEAKIAkJdGhpcy50YXJnZXRKREsgPSBvcHRpb25zLnRhcmdldEpESzsKIAkJdGhpcy5wcm9kdWNlQXR0cmlidXRlcyA9IG9wdGlvbnMucHJvZHVjZURlYnVnQXR0cmlidXRlczsKIAkJdGhpcy5yZWZlcmVuY2VCaW5kaW5nID0gdHlwZUJpbmRpbmc7CisJCXRoaXMuaXNOZXN0ZWRUeXBlID0gdHlwZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCk7CiAJCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82KSB7CisJCQl0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRTsKKwkJCXRoaXMuY29kZVN0cmVhbSA9IG5ldyBTdGFja01hcEZyYW1lQ29kZVN0cmVhbSh0aGlzKTsKKwkJfSBlbHNlIGlmICh0aGlzLnRhcmdldEpESyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQ0xEQ18xXzEpIHsKKwkJCXRoaXMudGFyZ2V0SkRLID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMTsgLy8gcHV0IGJhY2sgNDUuMwogCQkJdGhpcy5wcm9kdWNlQXR0cmlidXRlcyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVA7CiAJCQl0aGlzLmNvZGVTdHJlYW0gPSBuZXcgU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0odGhpcyk7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmNvZGVTdHJlYW0gPSBuZXcgQ29kZVN0cmVhbSh0aGlzKTsKIAkJfQotCQl0aGlzLmluaXRCeXRlQXJyYXlzKCk7CisJCWluaXRCeXRlQXJyYXlzKCk7CiAJfQogCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKLQkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBtZXRob2QuCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2d1cyBtZXRob2QuCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgogCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5NZXRob2RCaW5kaW5nCiAJICovCiAJcHVibGljIHZvaWQgYWRkQWJzdHJhY3RNZXRob2QoCi0JCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAotCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQotCQkvLyBmb3JjZSB0aGUgbW9kaWZpZXJzIHRvIGJlIHB1YmxpYyBhbmQgYWJzdHJhY3QKLQkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0OworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsCisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKIAogCQl0aGlzLmdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKIAkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSB0aGlzLmdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsKLQkJdGhpcy5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gdGhpcy5nZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKG1ldGhvZEJpbmRpbmcpOworCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQmluZGluZywgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwogCX0KIAogCS8qKgpAQCAtNDQ4LDE0NCArMjgzLDYyIEBACiAJICovCiAJcHVibGljIHZvaWQgYWRkQXR0cmlidXRlcygpIHsKIAkJLy8gdXBkYXRlIHRoZSBtZXRob2QgY291bnQKLQkJY29udGVudHNbbWV0aG9kQ291bnRPZmZzZXQrK10gPSAoYnl0ZSkgKG1ldGhvZENvdW50ID4+IDgpOwotCQljb250ZW50c1ttZXRob2RDb3VudE9mZnNldF0gPSAoYnl0ZSkgbWV0aG9kQ291bnQ7CisJCXRoaXMuY29udGVudHNbdGhpcy5tZXRob2RDb3VudE9mZnNldCsrXSA9IChieXRlKSAodGhpcy5tZXRob2RDb3VudCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLm1ldGhvZENvdW50T2Zmc2V0XSA9IChieXRlKSB0aGlzLm1ldGhvZENvdW50OwogCi0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOworCQlpbnQgYXR0cmlidXRlc051bWJlciA9IDA7CiAJCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGFuZCBzdG9yZSB0aGUgY3VycmVudCBvZmZzZXQKLQkJaW50IGF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OwotCQljb250ZW50c09mZnNldCArPSAyOworCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOwogCiAJCS8vIHNvdXJjZSBhdHRyaWJ1dGUKLQkJaWYgKChwcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NPVVJDRSkgIT0gMCkgeworCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TT1VSQ0UpICE9IDApIHsKIAkJCVN0cmluZyBmdWxsRmlsZU5hbWUgPQotCQkJCW5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5nZXRGaWxlTmFtZSgpKTsKKwkJCQluZXcgU3RyaW5nKHRoaXMucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5nZXRGaWxlTmFtZSgpKTsKIAkJCWZ1bGxGaWxlTmFtZSA9IGZ1bGxGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CiAJCQlpbnQgbGFzdEluZGV4ID0gZnVsbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcvJyk7CiAJCQlpZiAobGFzdEluZGV4ICE9IC0xKSB7CiAJCQkJZnVsbEZpbGVOYW1lID0gZnVsbEZpbGVOYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCBmdWxsRmlsZU5hbWUubGVuZ3RoKCkpOwogCQkJfQotCQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGZpZWxkIGluZm8gY29ycmVzcG9uZGluZwotCQkJLy8gdG8gdGhlIEBmaWVsZEJpbmRpbmcKLQkJCWlmIChjb250ZW50c09mZnNldCArIDggPj0gY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJcmVzaXplQ29udGVudHMoOCk7Ci0JCQl9Ci0JCQlpbnQgc291cmNlQXR0cmlidXRlTmFtZUluZGV4ID0KLQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlNvdXJjZU5hbWUpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHNvdXJjZUF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHNvdXJjZUF0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCS8vIFRoZSBsZW5ndGggb2YgYSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUgaXMgMi4gVGhpcyBpcyBhIGZpeGVkLWxlbmd0aAotCQkJLy8gYXR0cmlidXRlCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7Ci0JCQkvLyB3cml0ZSB0aGUgc291cmNlIGZpbGUgbmFtZQotCQkJaW50IGZpbGVOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZ1bGxGaWxlTmFtZS50b0NoYXJBcnJheSgpKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWxlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmlsZU5hbWVJbmRleDsKLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZVNvdXJjZUF0dHJpYnV0ZShmdWxsRmlsZU5hbWUpOwogCQl9CiAJCS8vIERlcHJlY2F0ZWQgYXR0cmlidXRlCi0JCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzRGVwcmVjYXRlZCgpKSB7CisJCWlmICh0aGlzLnJlZmVyZW5jZUJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsKIAkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBpbmZvIGNvcnJlc3BvbmRpbmcKIAkJCS8vIHRvIHRoZSBAZmllbGRCaW5kaW5nCi0JCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IGNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJfQotCQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRGVwcmVjYXRlZE5hbWUpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVEZXByZWNhdGVkQXR0cmlidXRlKCk7CiAJCX0KIAkJLy8gYWRkIHNpZ25hdHVyZSBhdHRyaWJ1dGUKLQkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSByZWZlcmVuY2VCaW5kaW5nLmdlbmVyaWNTaWduYXR1cmUoKTsKKwkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuZ2VuZXJpY1NpZ25hdHVyZSgpOwogCQlpZiAoZ2VuZXJpY1NpZ25hdHVyZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nCi0JCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZwotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgOCA+PSBjb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCX0KLQkJCWludCBzaWduYXR1cmVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU2lnbmF0dXJlTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDIKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKLQkJCWludCBzaWduYXR1cmVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChnZW5lcmljU2lnbmF0dXJlKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzaWduYXR1cmVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHNpZ25hdHVyZUluZGV4OwotCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU2lnbmF0dXJlQXR0cmlidXRlKGdlbmVyaWNTaWduYXR1cmUpOwogCQl9Ci0JCWlmICh0YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNQorCQlpZiAodGhpcy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNQogCQkJCSYmIHRoaXMucmVmZXJlbmNlQmluZGluZy5pc05lc3RlZFR5cGUoKQogCQkJCSYmICF0aGlzLnJlZmVyZW5jZUJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpIHsKIAkJCS8vIGFkZCBlbmNsb3NpbmcgbWV0aG9kIGF0dHJpYnV0ZSAoMS41IG1vZGUgb25seSkKLQkJCWlmIChjb250ZW50c09mZnNldCArIDEwID49IGNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDEwKTsKLQkJCX0KLQkJCWludCBlbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRW5jbG9zaW5nTWV0aG9kTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDIKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gNDsKLQkJCQotCQkJaW50IGVuY2xvc2luZ1R5cGVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHRoaXMucmVmZXJlbmNlQmluZGluZy5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmNsb3NpbmdUeXBlSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmNsb3NpbmdUeXBlSW5kZXg7Ci0JCQlieXRlIG1ldGhvZEluZGV4Qnl0ZTEgPSAwOwotCQkJYnl0ZSBtZXRob2RJbmRleEJ5dGUyID0gMDsKLQkJCWlmICh0aGlzLnJlZmVyZW5jZUJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFR5cGVCaW5kaW5nKSB7Ci0JCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKChMb2NhbFR5cGVCaW5kaW5nKSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcpLmVuY2xvc2luZ01ldGhvZDsKLQkJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCWludCBlbmNsb3NpbmdNZXRob2RJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JOYW1lQW5kVHlwZShtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSh0aGlzKSk7Ci0JCQkJCW1ldGhvZEluZGV4Qnl0ZTEgPSAoYnl0ZSkgKGVuY2xvc2luZ01ldGhvZEluZGV4ID4+IDgpOwotCQkJCQltZXRob2RJbmRleEJ5dGUyID0gKGJ5dGUpIGVuY2xvc2luZ01ldGhvZEluZGV4OwotCQkJCX0KLQkJCX0KLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gbWV0aG9kSW5kZXhCeXRlMTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gbWV0aG9kSW5kZXhCeXRlMjsKLQkJCWF0dHJpYnV0ZU51bWJlcisrOwkJCQorCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZSgpOwogCQl9Ci0JCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmICF0aGlzLmNyZWF0aW5nUHJvYmxlbVR5cGUpIHsKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSByZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdGhpcy5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CiAJCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCQlmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnM7CiAJCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCQkJYXR0cmlidXRlTnVtYmVyICs9IGdlbmVyYXRlUnVudGltZUFubm90YXRpb25zKGFubm90YXRpb25zKTsKKwkJCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZVJ1bnRpbWVBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCWlmICh0aGlzLnJlZmVyZW5jZUJpbmRpbmcuaXNIaWVyYXJjaHlJbmNvbnNpc3RlbnQoKSkgewotCQkJLy8gYWRkIGFuIGF0dHJpYnV0ZSBmb3IgaW5jb25zaXN0ZW50IGhpZXJhcmNoeQotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNiA+PSBjb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyg2KTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHRoaXMucmVmZXJlbmNlQmluZGluZy5zdXBlcmNsYXNzOworCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJCXRoaXMubWlzc2luZ1R5cGVzID0gc3VwZXJjbGFzcy5jb2xsZWN0TWlzc2luZ1R5cGVzKHRoaXMubWlzc2luZ1R5cGVzKTsKIAkJCX0KLQkJCWludCBpbmNvbnNpc3RlbnRIaWVyYXJjaHlOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuSW5jb25zaXN0ZW50SGllcmFyY2h5KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmNvbnNpc3RlbnRIaWVyYXJjaHlOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmNvbnNpc3RlbnRIaWVyYXJjaHlOYW1lSW5kZXg7Ci0JCQkvLyB0aGUgbGVuZ3RoIG9mIGFuIGluY29uc2lzdGVudCBoaWVyYXJjaHkgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJdGhpcy5taXNzaW5nVHlwZXMgPSBzdXBlckludGVyZmFjZXNbaV0uY29sbGVjdE1pc3NpbmdUeXBlcyh0aGlzLm1pc3NpbmdUeXBlcyk7CisJCQl9CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlSGllcmFyY2h5SW5jb25zaXN0ZW50QXR0cmlidXRlKCk7CiAJCX0KIAkJLy8gSW5uZXIgY2xhc3MgYXR0cmlidXRlCiAJCWludCBudW1iZXJPZklubmVyQ2xhc3NlcyA9IHRoaXMuaW5uZXJDbGFzc2VzQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLmlubmVyQ2xhc3Nlc0JpbmRpbmdzLnNpemUoKTsKQEAgLTU5OSw3OCArMzUyLDI2IEBACiAJCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbXBhcmVUbyhiaW5kaW5nMS5jb25zdGFudFBvb2xOYW1lKCksIGJpbmRpbmcyLmNvbnN0YW50UG9vbE5hbWUoKSk7CiAJCQkJfQogCQkJfSk7Ci0JCQkvLyBHZW5lcmF0ZSB0aGUgaW5uZXIgY2xhc3MgYXR0cmlidXRlCi0JCQlpbnQgZXhTaXplID0gOCAqIG51bWJlck9mSW5uZXJDbGFzc2VzICsgODsKLQkJCWlmIChleFNpemUgKyBjb250ZW50c09mZnNldCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKGV4U2l6ZSk7Ci0JCQl9Ci0JCQkvLyBOb3cgd2Ugbm93IHRoZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcwotCQkJLy8gYXR0cmlidXRlIG5hbWUKLQkJCWludCBhdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuSW5uZXJDbGFzc05hbWUpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCWludCB2YWx1ZSA9IChudW1iZXJPZklubmVyQ2xhc3NlcyA8PCAzKSArIDI7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mSW5uZXJDbGFzc2VzID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZJbm5lckNsYXNzZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mSW5uZXJDbGFzc2VzOyBpKyspIHsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGlubmVyQ2xhc3MgPSBpbm5lckNsYXNzZXNbaV07Ci0JCQkJaW50IGFjY2Vzc0ZsYWdzID0gaW5uZXJDbGFzcy5nZXRBY2Nlc3NGbGFncygpOwotCQkJCWludCBpbm5lckNsYXNzSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbm5lckNsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJLy8gaW5uZXIgY2xhc3MgaW5kZXgKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5uZXJDbGFzc0luZGV4ID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGlubmVyQ2xhc3NJbmRleDsKLQkJCQkvLyBvdXRlciBjbGFzcyBpbmRleDogYW5vbnltb3VzIGFuZCBsb2NhbCBoYXZlIG5vIG91dGVyIGNsYXNzIGluZGV4Ci0JCQkJaWYgKGlubmVyQ2xhc3MuaXNNZW1iZXJUeXBlKCkpIHsKLQkJCQkJLy8gbWVtYmVyIG9yIG1lbWJlciBvZiBsb2NhbAotCQkJCQlpbnQgb3V0ZXJDbGFzc0luZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5uZXJDbGFzcy5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG91dGVyQ2xhc3NJbmRleCA+PiA4KTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb3V0ZXJDbGFzc0luZGV4OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGVxdWFscyB0byAwIGlmIHRoZSBpbm5lckNsYXNzIGlzIG5vdCBhIG1lbWJlciB0eXBlCi0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCX0KLQkJCQkvLyBuYW1lIGluZGV4Ci0JCQkJaWYgKCFpbm5lckNsYXNzLmlzQW5vbnltb3VzVHlwZSgpKSB7Ci0JCQkJCWludCBuYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3Muc291cmNlTmFtZSgpKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGVxdWFscyB0byAwIGlmIHRoZSBpbm5lckNsYXNzIGlzIGFuIGFub255bW91cyB0eXBlCi0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCX0KLQkJCQkvLyBhY2Nlc3MgZmxhZwotCQkJCWlmIChpbm5lckNsYXNzLmlzQW5vbnltb3VzVHlwZSgpKSB7Ci0JCQkJCWFjY2Vzc0ZsYWdzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWw7Ci0JCQkJfSBlbHNlIGlmIChpbm5lckNsYXNzLmlzTWVtYmVyVHlwZSgpICYmIGlubmVyQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotCQkJCQlhY2Nlc3NGbGFncyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljOyAvLyBpbXBsaWNpdGVseSBzdGF0aWMKLQkJCQl9Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOwotCQkJfQotCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlSW5uZXJDbGFzc0F0dHJpYnV0ZShudW1iZXJPZklubmVyQ2xhc3NlcywgaW5uZXJDbGFzc2VzKTsKKwkJfQorCQlpZiAodGhpcy5taXNzaW5nVHlwZXMgIT0gbnVsbCkgeworCQkJZ2VuZXJhdGVNaXNzaW5nVHlwZXNBdHRyaWJ1dGUoKTsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKIAkJfQogCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAJCWlmIChhdHRyaWJ1dGVPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyKTsKIAkJfQotCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJY29udGVudHNbYXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbYXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVzTnVtYmVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlc051bWJlcjsKIAogCQkvLyByZXN5bmNocm9uaXplIGFsbCBvZmZzZXRzIG9mIHRoZSBjbGFzc2ZpbGUKLQkJaGVhZGVyID0gY29uc3RhbnRQb29sLnBvb2xDb250ZW50OwotCQloZWFkZXJPZmZzZXQgPSBjb25zdGFudFBvb2wuY3VycmVudE9mZnNldDsKLQkJaW50IGNvbnN0YW50UG9vbENvdW50ID0gY29uc3RhbnRQb29sLmN1cnJlbnRJbmRleDsKLQkJaGVhZGVyW2NvbnN0YW50UG9vbE9mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRQb29sQ291bnQgPj4gOCk7Ci0JCWhlYWRlcltjb25zdGFudFBvb2xPZmZzZXRdID0gKGJ5dGUpIGNvbnN0YW50UG9vbENvdW50OworCQl0aGlzLmhlYWRlciA9IHRoaXMuY29uc3RhbnRQb29sLnBvb2xDb250ZW50OworCQl0aGlzLmhlYWRlck9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sLmN1cnJlbnRPZmZzZXQ7CisJCWludCBjb25zdGFudFBvb2xDb3VudCA9IHRoaXMuY29uc3RhbnRQb29sLmN1cnJlbnRJbmRleDsKKwkJdGhpcy5oZWFkZXJbdGhpcy5jb25zdGFudFBvb2xPZmZzZXQrK10gPSAoYnl0ZSkgKGNvbnN0YW50UG9vbENvdW50ID4+IDgpOworCQl0aGlzLmhlYWRlclt0aGlzLmNvbnN0YW50UG9vbE9mZnNldF0gPSAoYnl0ZSkgY29uc3RhbnRQb29sQ291bnQ7CiAJfQotCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGUgYWxsIHRoZSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZCBpbmZvcyB0aGF0IGNvcnJlcG9uZCB0bwpAQCAtNjc4LDE1MCArMzc5LDM2IEBACiAJICovCiAJcHVibGljIHZvaWQgYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpIHsgLy8gZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCiAJCU1ldGhvZEJpbmRpbmdbXSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzID0KLQkJCXJlZmVyZW5jZUJpbmRpbmcuZ2V0RGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOworCQkJdGhpcy5yZWZlcmVuY2VCaW5kaW5nLmdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihkZWZhdWx0QWJzdHJhY3RNZXRob2RzW2ldKTsKLQkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXSk7Ci0JCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOworCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXTsKKwkJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKKwkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CisJCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQmluZGluZywgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBpbnQgYWRkRmllbGRBdHRyaWJ1dGVzKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsIGludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCkgewogCQlpbnQgYXR0cmlidXRlc051bWJlciA9IDA7CiAJCS8vIDQuNy4yIG9ubHkgc3RhdGljIGNvbnN0YW50IGZpZWxkcyBnZXQgYSBDb25zdGFudEF0dHJpYnV0ZQogCQkvLyBHZW5lcmF0ZSB0aGUgY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZQogCQlDb25zdGFudCBmaWVsZENvbnN0YW50ID0gZmllbGRCaW5kaW5nLmNvbnN0YW50KCk7CiAJCWlmIChmaWVsZENvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCl7Ci0JCQlpZiAoY29udGVudHNPZmZzZXQgKyA4ID49IGNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJfQotCQkJLy8gTm93IHdlIGdlbmVyYXRlIHRoZSBjb25zdGFudCBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGRCaW5kaW5nCi0JCQlpbnQgY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db25zdGFudFZhbHVlTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvbnN0YW50VmFsdWVOYW1lSW5kZXg7Ci0JCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IDIgaW4gY2FzZSBvZiBhIGNvbnN0YW50VmFsdWUgYXR0cmlidXRlCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7Ci0JCQlhdHRyaWJ1dGVzTnVtYmVyKys7Ci0JCQkvLyBOZWVkIHRvIGFkZCB0aGUgY29uc3RhbnRfdmFsdWVfaW5kZXgKLQkJCXN3aXRjaCAoZmllbGRDb25zdGFudC50eXBlSUQoKSkgewotCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJaW50IGJvb2xlYW5WYWx1ZUluZGV4ID0KLQkJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRDb25zdGFudC5ib29sZWFuVmFsdWUoKSA/IDEgOiAwKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGJvb2xlYW5WYWx1ZUluZGV4ID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBib29sZWFuVmFsdWVJbmRleDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUX2J5dGUgOgotCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQljYXNlIFRfaW50IDoKLQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQlpbnQgaW50ZWdlclZhbHVlSW5kZXggPQotCQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZENvbnN0YW50LmludFZhbHVlKCkpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZWdlclZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQlpbnQgZmxvYXRWYWx1ZUluZGV4ID0KLQkJCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRDb25zdGFudC5mbG9hdFZhbHVlKCkpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmxvYXRWYWx1ZUluZGV4ID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmbG9hdFZhbHVlSW5kZXg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQlpbnQgZG91YmxlVmFsdWVJbmRleCA9Ci0JCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQ29uc3RhbnQuZG91YmxlVmFsdWUoKSk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkb3VibGVWYWx1ZUluZGV4ID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkb3VibGVWYWx1ZUluZGV4OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCWludCBsb25nVmFsdWVJbmRleCA9Ci0JCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQ29uc3RhbnQubG9uZ1ZhbHVlKCkpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9uZ1ZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvbmdWYWx1ZUluZGV4OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgotCQkJCQlpbnQgc3RyaW5nVmFsdWVJbmRleCA9Ci0JCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KAotCQkJCQkJCSgoU3RyaW5nQ29uc3RhbnQpIGZpZWxkQ29uc3RhbnQpLnN0cmluZ1ZhbHVlKCkpOwotCQkJCQlpZiAoc3RyaW5nVmFsdWVJbmRleCA9PSAtMSkgewotCQkJCQkJaWYgKCFjcmVhdGluZ1Byb2JsZW1UeXBlKSB7Ci0JCQkJCQkJLy8gcmVwb3J0IGFuIGVycm9yIGFuZCBhYm9ydDogd2lsbCBsZWFkIHRvIGEgcHJvYmxlbSB0eXBlIGNsYXNzZmlsZSBjcmVhdGlvbgotCQkJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSByZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7Ci0JCQkJCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbHMgPSB0eXBlRGVjbGFyYXRpb24uZmllbGRzOwotCQkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZERlY2xzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChmaWVsZERlY2xzW2ldLmJpbmRpbmcgPT0gZmllbGRCaW5kaW5nKSB7Ci0JCQkJCQkJCQkvLyBwcm9ibGVtIHNob3VsZCBhYm9ydAotCQkJCQkJCQkJdHlwZURlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0cmluZ0NvbnN0YW50SXNFeGNlZWRpbmdVdGY4TGltaXQoCi0JCQkJCQkJCQkJZmllbGREZWNsc1tpXSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGFscmVhZHkgaW5zaWRlIGEgcHJvYmxlbSB0eXBlIGNyZWF0aW9uIDogbm8gY29uc3RhbnQgZm9yIHRoaXMgZmllbGQKLQkJCQkJCQljb250ZW50c09mZnNldCA9IGZpZWxkQXR0cmlidXRlT2Zmc2V0OwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ1ZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdHJpbmdWYWx1ZUluZGV4OwotCQkJCQl9Ci0JCQl9CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZShmaWVsZENvbnN0YW50LCBmaWVsZEJpbmRpbmcsIGZpZWxkQXR0cmlidXRlT2Zmc2V0KTsKIAkJfQogCQlpZiAodGhpcy50YXJnZXRKREsgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmIGZpZWxkQmluZGluZy5pc1N5bnRoZXRpYygpKSB7Ci0JCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IGNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJfQotCQkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMAotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJYXR0cmlidXRlc051bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZVN5bnRoZXRpY0F0dHJpYnV0ZSgpOwogCQl9CiAJCWlmIChmaWVsZEJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsKLQkJCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQl9Ci0JCQlpbnQgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDAKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVEZXByZWNhdGVkQXR0cmlidXRlKCk7CiAJCX0KIAkJLy8gYWRkIHNpZ25hdHVyZSBhdHRyaWJ1dGUKIAkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSBmaWVsZEJpbmRpbmcuZ2VuZXJpY1NpZ25hdHVyZSgpOwogCQlpZiAoZ2VuZXJpY1NpZ25hdHVyZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nCi0JCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZwotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgOCA+PSBjb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCX0KLQkJCWludCBzaWduYXR1cmVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU2lnbmF0dXJlTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDIKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKLQkJCWludCBzaWduYXR1cmVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChnZW5lcmljU2lnbmF0dXJlKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzaWduYXR1cmVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHNpZ25hdHVyZUluZGV4OwotCQkJYXR0cmlidXRlc051bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZVNpZ25hdHVyZUF0dHJpYnV0ZShnZW5lcmljU2lnbmF0dXJlKTsKIAkJfQotCQlpZiAodGhpcy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJiAhdGhpcy5jcmVhdGluZ1Byb2JsZW1UeXBlKSB7CisJCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7CiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBmaWVsZEJpbmRpbmcuc291cmNlRmllbGQoKTsKIAkJCWlmIChmaWVsZERlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCQlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBmaWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zOwpAQCAtODMwLDYgKzQxNyw5IEBACiAJCQkJfQogCQkJfQogCQl9CisJCWlmICgoZmllbGRCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQl0aGlzLm1pc3NpbmdUeXBlcyA9IGZpZWxkQmluZGluZy50eXBlLmNvbGxlY3RNaXNzaW5nVHlwZXModGhpcy5taXNzaW5nVHlwZXMpOworCQl9CiAJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOwogCX0KIApAQCAtODQxLDM3ICs0MzEsMzggQEAKIAlwcml2YXRlIHZvaWQgYWRkRmllbGRJbmZvKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKIAkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGZpZWxkIGluZm8gY29ycmVzcG9uZGluZwogCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZwotCQlpZiAoY29udGVudHNPZmZzZXQgKyA4ID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDggPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDgpOwogCQl9CiAJCS8vIE5vdyB3ZSBjYW4gZ2VuZXJhdGUgYWxsIGVudHJpZXMgaW50byB0aGUgYnl0ZSBhcnJheQogCQkvLyBGaXJzdCB0aGUgYWNjZXNzRmxhZ3MKIAkJaW50IGFjY2Vzc0ZsYWdzID0gZmllbGRCaW5kaW5nLmdldEFjY2Vzc0ZsYWdzKCk7Ci0JCWlmICh0YXJnZXRKREsgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCSAgICAvLyBwcmUgMS41LCBzeW50aGV0aWMgd2FzIGFuIGF0dHJpYnV0ZSwgbm90IGEgbW9kaWZpZXIKLQkJICAgIGFjY2Vzc0ZsYWdzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljOwotCQl9CQkKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsKKwkJaWYgKHRoaXMudGFyZ2V0SkRLIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJLy8gcHJlIDEuNSwgc3ludGhldGljIHdhcyBhbiBhdHRyaWJ1dGUsIG5vdCBhIG1vZGlmaWVyCisJCQlhY2Nlc3NGbGFncyAmPSB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYzsKKwkJfQorCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7CiAJCS8vIFRoZW4gdGhlIG5hbWVJbmRleAotCQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcubmFtZSk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJaW50IG5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcubmFtZSk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwogCQkvLyBUaGVuIHRoZSBkZXNjcmlwdG9ySW5kZXgKLQkJaW50IGRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLnR5cGUpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7Ci0JCWludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlpbnQgZGVzY3JpcHRvckluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy50eXBlKTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7CisJCWludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOwogCQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKLQkJY29udGVudHNPZmZzZXQgKz0gMjsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOwogCQlhdHRyaWJ1dGVOdW1iZXIgKz0gYWRkRmllbGRBdHRyaWJ1dGVzKGZpZWxkQmluZGluZywgZmllbGRBdHRyaWJ1dGVPZmZzZXQpOwotCQlpZiAoY29udGVudHNPZmZzZXQgKyAyID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIpOwogCQl9Ci0JCWNvbnRlbnRzW2ZpZWxkQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCWNvbnRlbnRzW2ZpZWxkQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbZmllbGRBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tmaWVsZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOwogCX0KKwogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogVGhpcyBtZXRob2RzIGdlbmVyYXRlIGFsbCB0aGUgZmllbGRzIGluZm9zIGZvciB0aGUgcmVjZWl2ZXIuCkBAIC04ODcsMTggKzQ3OCwxNiBAQAogCSAqIC0gYSBmaWVsZCBpbmZvIGZvciBlYWNoIHN5bnRoZXRpYyBmaWVsZCAoZS5nLiB0aGlzJDApCiAJICovCiAJcHVibGljIHZvaWQgYWRkRmllbGRJbmZvcygpIHsKLQkJU291cmNlVHlwZUJpbmRpbmcgY3VycmVudEJpbmRpbmcgPSByZWZlcmVuY2VCaW5kaW5nOworCQlTb3VyY2VUeXBlQmluZGluZyBjdXJyZW50QmluZGluZyA9IHRoaXMucmVmZXJlbmNlQmluZGluZzsKIAkJRmllbGRCaW5kaW5nW10gc3ludGhldGljRmllbGRzID0gY3VycmVudEJpbmRpbmcuc3ludGhldGljRmllbGRzKCk7Ci0JCWludCBmaWVsZENvdW50ID0KLQkJCWN1cnJlbnRCaW5kaW5nLmZpZWxkQ291bnQoKQotCQkJCSsgKHN5bnRoZXRpY0ZpZWxkcyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0ZpZWxkcy5sZW5ndGgpOworCQlpbnQgZmllbGRDb3VudCA9IAljdXJyZW50QmluZGluZy5maWVsZENvdW50KCkgKyAoc3ludGhldGljRmllbGRzID09IG51bGwgPyAwIDogc3ludGhldGljRmllbGRzLmxlbmd0aCk7CiAKIAkJLy8gd3JpdGUgdGhlIG51bWJlciBvZiBmaWVsZHMKIAkJaWYgKGZpZWxkQ291bnQgPiAweEZGRkYpIHsKLQkJCXJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueUZpZWxkcyhyZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueUZpZWxkcyh0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKIAkJfQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmllbGRDb3VudCA+PiA4KTsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmllbGRDb3VudDsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWVsZENvdW50ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmllbGRDb3VudDsKIAogCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNscyA9IGN1cnJlbnRCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGREZWNscyA9PSBudWxsID8gMCA6IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKQEAgLTkxNCwzOCArNTAzLDM5IEBACiAJCQl9CiAJCX0KIAl9CisKIAlwcml2YXRlIHZvaWQgYWRkTWlzc2luZ0Fic3RyYWN0UHJvYmxlbU1ldGhvZChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLCBDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKIAkJLy8gYWx3YXlzIGNsZWFyIHRoZSBzdHJpY3RmcC9uYXRpdmUvYWJzdHJhY3QgYml0IGZvciBhIHByb2JsZW0gbWV0aG9kCiAJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nLCBtZXRob2RCaW5kaW5nLm1vZGlmaWVycyAmIH4oQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkpOwotCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7Ci0JCQorCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CisKIAkJLy8gQ29kZSBhdHRyaWJ1dGUKIAkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDI1KTsKIAkJYnVmZmVyLmFwcGVuZCgiXHQiICArIHByb2JsZW0uZ2V0TWVzc2FnZSgpICsgIlxuIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJYnVmZmVyLmluc2VydCgwLCBNZXNzYWdlcy5jb21waWxhdGlvbl91bnJlc29sdmVkUHJvYmxlbSk7CiAJCVN0cmluZyBwcm9ibGVtU3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQotCQljb2RlU3RyZWFtLmluaXQodGhpcyk7Ci0JCWNvZGVTdHJlYW0ucHJlc2VydmVVbnVzZWRMb2NhbHMgPSB0cnVlOwotCQljb2RlU3RyZWFtLmluaXRpYWxpemVNYXhMb2NhbHMobWV0aG9kQmluZGluZyk7CisKKwkJdGhpcy5jb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5wcmVzZXJ2ZVVudXNlZExvY2FscyA9IHRydWU7CisJCXRoaXMuY29kZVN0cmVhbS5pbml0aWFsaXplTWF4TG9jYWxzKG1ldGhvZEJpbmRpbmcpOwogCiAJCS8vIHJldHVybiBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoY29tcC5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCAiIikKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKHByb2JsZW1TdHJpbmcpOwotCQkJCQorCQl0aGlzLmNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChwcm9ibGVtU3RyaW5nKTsKKwogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JNaXNzaW5nQWJzdHJhY3RQcm9ibGVtTWV0aG9kKAogCQkJbWV0aG9kQmluZGluZywKIAkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCiAJCQljb21waWxhdGlvblJlc3VsdC5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCksCiAJCQlwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSk7Ci0JCQkKLQkJY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKKworCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQmluZGluZywgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwogCX0KLQkKKwogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBjbGluaXQgbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIG1ldGhvZC4KQEAgLTk1NSwxNCArNTQ1LDE0IEBACiAJcHVibGljIHZvaWQgYWRkUHJvYmxlbUNsaW5pdChDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcykgewogCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXJGb3JDbGluaXQoKTsKIAkJLy8gbGVhdmUgdHdvIHNwYWNlcyBmb3IgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCi0JCWNvbnRlbnRzT2Zmc2V0IC09IDI7Ci0JCWludCBhdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJY29udGVudHNPZmZzZXQgKz0gMjsKKwkJdGhpcy5jb250ZW50c09mZnNldCAtPSAyOworCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOwogCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsKIAotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOwotCQljb2RlU3RyZWFtLnJlc2V0Rm9yUHJvYmxlbUNsaW5pdCh0aGlzKTsKKwkJdGhpcy5jb2RlU3RyZWFtLnJlc2V0Rm9yUHJvYmxlbUNsaW5pdCh0aGlzKTsKIAkJU3RyaW5nIHByb2JsZW1TdHJpbmcgPSAiIiA7IC8vJE5PTi1OTFMtMSQKIAkJaW50IHByb2JsZW1MaW5lID0gMDsKIAkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsKQEAgLTk4OSwxNiArNTc5LDE2IEBACiAJCX0KIAogCQkvLyByZXR1cm4gY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKGNvbXAub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgIiIpCi0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChwcm9ibGVtU3RyaW5nKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QocHJvYmxlbVN0cmluZyk7CiAJCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBjb2RlIGF0dHJpYnV0ZQogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JDbGluaXQoCiAJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAogCQkJcHJvYmxlbUxpbmUpOwotCQlpZiAoY29udGVudHNPZmZzZXQgKyAyID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIpOwogCQl9Ci0JCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOwotCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKIAl9CiAKIAkvKioKQEAgLTEwMTYsMTQgKzYwNiwxNCBAQAogCiAJCS8vIGFsd2F5cyBjbGVhciB0aGUgc3RyaWN0ZnAvbmF0aXZlL2Fic3RyYWN0IGJpdCBmb3IgYSBwcm9ibGVtIG1ldGhvZAogCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZywgbWV0aG9kQmluZGluZy5tb2RpZmllcnMgJiB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpKTsKLQkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OwotCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKG1ldGhvZEJpbmRpbmcsIHRydWUpOwotCQkKKwkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlcyhtZXRob2RCaW5kaW5nKTsKKwogCQkvLyBDb2RlIGF0dHJpYnV0ZQotCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJYXR0cmlidXRlc051bWJlcisrOworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOwotCQljb2RlU3RyZWFtLnJlc2V0KG1ldGhvZCwgdGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5yZXNldChtZXRob2QsIHRoaXMpOwogCQlTdHJpbmcgcHJvYmxlbVN0cmluZyA9ICIiIDsgLy8kTk9OLU5MUy0xJAogCQlpbnQgcHJvYmxlbUxpbmUgPSAwOwogCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgewpAQCAtMTA0OSw3ICs2MzksNyBAQAogCQl9CiAKIAkJLy8gcmV0dXJuIGNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChjb21wLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsICIiKQotCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QocHJvYmxlbVN0cmluZyk7CisJCXRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKHByb2JsZW1TdHJpbmcpOwogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKAogCQkJbWV0aG9kLAogCQkJbWV0aG9kQmluZGluZywKQEAgLTEwNjAsOSArNjUwLDggQEAKIAkJCQkuY29tcGlsYXRpb25SZXN1bHQKIAkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpLAogCQkJcHJvYmxlbUxpbmUpOwotCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOworCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQmluZGluZywgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVzTnVtYmVyKTsKIAl9Ci0KIAkvKioKIAkgKiBJTlRFUk5BTCBVU0UtT05MWQogCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIGNvbnN0cnVjdG9yLgpAQCAtMTA3OSwxMSArNjY4LDEwIEBACiAJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zLAogCQlpbnQgc2F2ZWRPZmZzZXQpIHsKIAkJLy8gd2UgbmVlZCB0byBtb3ZlIGJhY2sgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QKLQkJY29udGVudHNPZmZzZXQgPSBzYXZlZE9mZnNldDsKLQkJbWV0aG9kQ291bnQtLTsgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG1ldGhvZCB0aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gc2F2ZWRPZmZzZXQ7CisJCXRoaXMubWV0aG9kQ291bnQtLTsgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG1ldGhvZCB0aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQogCQlhZGRQcm9ibGVtQ29uc3RydWN0b3IobWV0aG9kLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtcyk7CiAJfQotCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBtZXRob2QuCkBAIC0xMTAxLDE1ICs2ODksMTUgQEAKIAkJfQogCQkvLyBhbHdheXMgY2xlYXIgdGhlIHN0cmljdGZwL25hdGl2ZS9hYnN0cmFjdCBiaXQgZm9yIGEgcHJvYmxlbSBtZXRob2QKIAkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcsIG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzICYgfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnAgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSk7Ci0JCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nLCB0cnVlKTsKLQkJCisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQlpbnQgYXR0cmlidXRlc051bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CisKIAkJLy8gQ29kZSBhdHRyaWJ1dGUKLQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlhdHRyaWJ1dGVzTnVtYmVyKys7CisKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OwogCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKLQkJY29kZVN0cmVhbS5yZXNldChtZXRob2QsIHRoaXMpOworCQl0aGlzLmNvZGVTdHJlYW0ucmVzZXQobWV0aG9kLCB0aGlzKTsKIAkJU3RyaW5nIHByb2JsZW1TdHJpbmcgPSAiIiA7IC8vJE5PTi1OTFMtMSQKIAkJaW50IHByb2JsZW1MaW5lID0gMDsKIAkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsKQEAgLTExMzksNyArNzI3LDcgQEAKIAkJfQogCiAJCS8vIHJldHVybiBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoY29tcC5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCAiIikKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKHByb2JsZW1TdHJpbmcpOworCQl0aGlzLmNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChwcm9ibGVtU3RyaW5nKTsKIAkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgKIAkJCW1ldGhvZCwKIAkJCW1ldGhvZEJpbmRpbmcsCkBAIC0xMTUwLDcgKzczOCw3IEBACiAJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CiAJCQkJLmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSwKIAkJCXByb2JsZW1MaW5lKTsKLQkJY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKKwkJY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEJpbmRpbmcsIG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlc051bWJlcik7CiAJfQogCiAJLyoqCkBAIC0xMTY5LDggKzc1Nyw4IEBACiAJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zLAogCQlpbnQgc2F2ZWRPZmZzZXQpIHsKIAkJLy8gd2UgbmVlZCB0byBtb3ZlIGJhY2sgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QKLQkJY29udGVudHNPZmZzZXQgPSBzYXZlZE9mZnNldDsKLQkJbWV0aG9kQ291bnQtLTsgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG1ldGhvZCB0aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gc2F2ZWRPZmZzZXQ7CisJCXRoaXMubWV0aG9kQ291bnQtLTsgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG1ldGhvZCB0aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQogCQlhZGRQcm9ibGVtTWV0aG9kKG1ldGhvZCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXMpOwogCX0KIApAQCAtMTE4MiwzMSArNzcwLDM0IEBACiAJICogLSBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMKIAkgKi8KIAlwdWJsaWMgdm9pZCBhZGRTcGVjaWFsTWV0aG9kcygpIHsKLQkgICAgCisKIAkJLy8gYWRkIGFsbCBtZXRob2RzIChkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMgYW5kIHN5bnRoZXRpYykKIAogCQkvLyBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMKLQkJZ2VuZXJhdGVNaXNzaW5nQWJzdHJhY3RNZXRob2RzKHJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpLm1pc3NpbmdBYnN0cmFjdE1ldGhvZHMsIHJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOworCQlnZW5lcmF0ZU1pc3NpbmdBYnN0cmFjdE1ldGhvZHModGhpcy5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5taXNzaW5nQWJzdHJhY3RNZXRob2RzLCB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOwogCiAJCU1ldGhvZEJpbmRpbmdbXSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzID0gdGhpcy5yZWZlcmVuY2VCaW5kaW5nLmdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihkZWZhdWx0QWJzdHJhY3RNZXRob2RzW2ldKTsKLQkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXSk7Ci0JCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOworCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gZGVmYXVsdEFic3RyYWN0TWV0aG9kc1tpXTsKKwkJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKKwkJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CisJCQljb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQmluZGluZywgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwogCQl9CiAJCS8vIGFkZCBzeW50aGV0aWMgbWV0aG9kcyBpbmZvcwogCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10gc3ludGhldGljTWV0aG9kcyA9IHRoaXMucmVmZXJlbmNlQmluZGluZy5zeW50aGV0aWNNZXRob2RzKCk7CiAJCWlmIChzeW50aGV0aWNNZXRob2RzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNNZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJU3ludGhldGljTWV0aG9kQmluZGluZyBzeW50aGV0aWNNZXRob2QgPSBzeW50aGV0aWNNZXRob2RzW2ldOwotCQkJCXN3aXRjaCAoc3ludGhldGljTWV0aG9kLmtpbmQpIHsKKwkJCQlzd2l0Y2ggKHN5bnRoZXRpY01ldGhvZC5wdXJwb3NlKSB7CiAJCQkJCWNhc2UgU3ludGhldGljTWV0aG9kQmluZGluZy5GaWVsZFJlYWRBY2Nlc3MgOgorCQkJCQljYXNlIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJGaWVsZFJlYWRBY2Nlc3MgOgogCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIHJlYWRpbmcgYWNjZXNzIHRvCiAJCQkJCQkvLyBhIG5vbi1hY2Nlc3NpYmxlIGZpZWxkCiAJCQkJCQlhZGRTeW50aGV0aWNGaWVsZFJlYWRBY2Nlc3NNZXRob2Qoc3ludGhldGljTWV0aG9kKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuRmllbGRXcml0ZUFjY2VzcyA6CisJCQkJCWNhc2UgU3ludGhldGljTWV0aG9kQmluZGluZy5TdXBlckZpZWxkV3JpdGVBY2Nlc3MgOgogCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIHdyaXRpbmcgYWNjZXNzIHRvCiAJCQkJCQkvLyBhIG5vbi1hY2Nlc3NpYmxlIGZpZWxkCiAJCQkJCQlhZGRTeW50aGV0aWNGaWVsZFdyaXRlQWNjZXNzTWV0aG9kKHN5bnRoZXRpY01ldGhvZCk7CkBAIC0xMjMyLDYgKzgyMyw5IEBACiAJCQkJCWNhc2UgU3ludGhldGljTWV0aG9kQmluZGluZy5Td2l0Y2hUYWJsZSA6CiAJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGRlZmluZSB0aGUgc3dpdGNoIHRhYmxlIHN5bnRoZXRpYyBtZXRob2QKIAkJCQkJCWFkZFN5bnRoZXRpY1N3aXRjaFRhYmxlKHN5bnRoZXRpY01ldGhvZCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTeW50aGV0aWNNZXRob2RCaW5kaW5nLlRvb01hbnlFbnVtc0NvbnN0YW50cyA6CisJCQkJCQlhZGRTeW50aGV0aWNFbnVtSW5pdGlhbGl6YXRpb25NZXRob2Qoc3ludGhldGljTWV0aG9kKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTEyNDcsMTMgKzg0MSwxMyBAQAogCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CiAJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OwogCQkvLyB0aGlzIHdpbGwgYWRkIGV4Y2VwdGlvbiBhdHRyaWJ1dGUsIHN5bnRoZXRpYyBhdHRyaWJ1dGUsIGRlcHJlY2F0ZWQgYXR0cmlidXRlLC4uLgotCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKG1ldGhvZEJpbmRpbmcpOworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlcyhtZXRob2RCaW5kaW5nKTsKIAkJLy8gQ29kZSBhdHRyaWJ1dGUKLQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OwogCQlhdHRyaWJ1dGVOdW1iZXIrKzsgLy8gYWRkIGNvZGUgYXR0cmlidXRlCiAJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOwotCQljb2RlU3RyZWFtLmluaXQodGhpcyk7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yQ29uc3RydWN0b3JBY2Nlc3MobWV0aG9kQmluZGluZyk7CisJCXRoaXMuY29kZVN0cmVhbS5pbml0KHRoaXMpOworCQl0aGlzLmNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yQ29uc3RydWN0b3JBY2Nlc3MobWV0aG9kQmluZGluZyk7CiAJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKIAkJCW1ldGhvZEJpbmRpbmcsCiAJCQljb2RlQXR0cmlidXRlT2Zmc2V0LApAQCAtMTI2MywyNyArODU3LDI3IEBACiAJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CiAJCQkJLmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSk7CiAJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCWNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOwogCX0KLQkJCisKIAkvKioKIAkgKiBJTlRFUk5BTCBVU0UtT05MWQogCSAqICBHZW5lcmF0ZSB0aGUgYnl0ZXMgZm9yIGEgc3ludGhldGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMgRW51bSN2YWx1ZU9mKFN0cmluZykgZm9yIGEgZ2l2ZW4gZW51bSB0eXBlCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZwotCSAqLwkKKwkgKi8KIAlwdWJsaWMgdm9pZCBhZGRTeW50aGV0aWNFbnVtVmFsdWVPZk1ldGhvZChTeW50aGV0aWNNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKIAkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOwogCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJLy8gdGhpcyB3aWxsIGFkZCBleGNlcHRpb24gYXR0cmlidXRlLCBzeW50aGV0aWMgYXR0cmlidXRlLCBkZXByZWNhdGVkIGF0dHJpYnV0ZSwuLi4KLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CiAJCS8vIENvZGUgYXR0cmlidXRlCi0JCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJYXR0cmlidXRlTnVtYmVyKys7IC8vIGFkZCBjb2RlIGF0dHJpYnV0ZQogCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKLQkJY29kZVN0cmVhbS5pbml0KHRoaXMpOwotCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckVudW1WYWx1ZU9mKG1ldGhvZEJpbmRpbmcpOworCQl0aGlzLmNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckVudW1WYWx1ZU9mKG1ldGhvZEJpbmRpbmcpOwogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNNZXRob2QoCiAJCQltZXRob2RCaW5kaW5nLAogCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKQEAgLTEyOTMsOCArODg3LDggQEAKIAkJCQkuY29tcGlsYXRpb25SZXN1bHQKIAkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CQkJCisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CiAJfQogCiAJLyoqCkBAIC0xMzAyLDE4ICs4OTYsMTggQEAKIAkgKiAgR2VuZXJhdGUgdGhlIGJ5dGVzIGZvciBhIHN5bnRoZXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzIEVudW0jdmFsdWVzKCkgZm9yIGEgZ2l2ZW4gZW51bSB0eXBlCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZwotCSAqLwkKKwkgKi8KIAlwdWJsaWMgdm9pZCBhZGRTeW50aGV0aWNFbnVtVmFsdWVzTWV0aG9kKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewogCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CiAJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OwogCQkvLyB0aGlzIHdpbGwgYWRkIGV4Y2VwdGlvbiBhdHRyaWJ1dGUsIHN5bnRoZXRpYyBhdHRyaWJ1dGUsIGRlcHJlY2F0ZWQgYXR0cmlidXRlLC4uLgotCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKG1ldGhvZEJpbmRpbmcpOworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlcyhtZXRob2RCaW5kaW5nKTsKIAkJLy8gQ29kZSBhdHRyaWJ1dGUKLQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OwogCQlhdHRyaWJ1dGVOdW1iZXIrKzsgLy8gYWRkIGNvZGUgYXR0cmlidXRlCiAJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOwotCQljb2RlU3RyZWFtLmluaXQodGhpcyk7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRW51bVZhbHVlcyhtZXRob2RCaW5kaW5nKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JFbnVtVmFsdWVzKG1ldGhvZEJpbmRpbmcpOwogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNNZXRob2QoCiAJCQltZXRob2RCaW5kaW5nLAogCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKQEAgLTEzMjMsMTAgKzkxNywzMyBAQAogCQkJCS5jb21waWxhdGlvblJlc3VsdAogCQkJCS5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCkpOwogCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCi0JCWNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsJCQorCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOwogCX0KIAorCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0VudW1Jbml0aWFsaXphdGlvbk1ldGhvZChTeW50aGV0aWNNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOworCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJLy8gdGhpcyB3aWxsIGFkZCBleGNlcHRpb24gYXR0cmlidXRlLCBzeW50aGV0aWMgYXR0cmlidXRlLCBkZXByZWNhdGVkIGF0dHJpYnV0ZSwuLi4KKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CisJCS8vIENvZGUgYXR0cmlidXRlCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJYXR0cmlidXRlTnVtYmVyKys7IC8vIGFkZCBjb2RlIGF0dHJpYnV0ZQorCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JFbnVtSW5pdGlhbGl6YXRpb25NZXRob2QobWV0aG9kQmluZGluZyk7CisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKKwkJCW1ldGhvZEJpbmRpbmcsCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCQkuc2NvcGUKKwkJCQkucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkKKwkJCQkuY29tcGlsYXRpb25SZXN1bHQKKwkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCX0KIAkvKioKIAkgKiBJTlRFUk5BTCBVU0UtT05MWQogCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0CkBAIC0xMzM4LDEzICs5NTUsMTMgQEAKIAkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOwogCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJLy8gdGhpcyB3aWxsIGFkZCBleGNlcHRpb24gYXR0cmlidXRlLCBzeW50aGV0aWMgYXR0cmlidXRlLCBkZXByZWNhdGVkIGF0dHJpYnV0ZSwuLi4KLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXMobWV0aG9kQmluZGluZyk7CiAJCS8vIENvZGUgYXR0cmlidXRlCi0JCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJYXR0cmlidXRlTnVtYmVyKys7IC8vIGFkZCBjb2RlIGF0dHJpYnV0ZQogCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKLQkJY29kZVN0cmVhbS5pbml0KHRoaXMpOwotCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckZpZWxkUmVhZEFjY2VzcyhtZXRob2RCaW5kaW5nKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFJlYWRBY2Nlc3MobWV0aG9kQmluZGluZyk7CiAJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKIAkJCW1ldGhvZEJpbmRpbmcsCiAJCQljb2RlQXR0cmlidXRlT2Zmc2V0LApAQCAtMTM1NCw5ICs5NzEsMTAgQEAKIAkJCQkuY29tcGlsYXRpb25SZXN1bHQKIAkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CiAJfQorCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIHN5bnRoZXRpYyBtZXRob2QgdGhhdApAQCAtMTM2OCwxMyArOTg2LDEzIEBACiAJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKIAkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCS8vIHRoaXMgd2lsbCBhZGQgZXhjZXB0aW9uIGF0dHJpYnV0ZSwgc3ludGhldGljIGF0dHJpYnV0ZSwgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsLi4uCi0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKG1ldGhvZEJpbmRpbmcpOwogCQkvLyBDb2RlIGF0dHJpYnV0ZQotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBhZGQgY29kZSBhdHRyaWJ1dGUKIAkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7Ci0JCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFdyaXRlQWNjZXNzKG1ldGhvZEJpbmRpbmcpOworCQl0aGlzLmNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckZpZWxkV3JpdGVBY2Nlc3MobWV0aG9kQmluZGluZyk7CiAJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKIAkJCW1ldGhvZEJpbmRpbmcsCiAJCQljb2RlQXR0cmlidXRlT2Zmc2V0LApAQCAtMTM4NCw4ICsxMDAyLDggQEAKIAkJCQkuY29tcGlsYXRpb25SZXN1bHQKIAkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CiAJfQogCiAJLyoqCkBAIC0xMzk4LDEzICsxMDE2LDEzIEBACiAJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKIAkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCS8vIHRoaXMgd2lsbCBhZGQgZXhjZXB0aW9uIGF0dHJpYnV0ZSwgc3ludGhldGljIGF0dHJpYnV0ZSwgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsLi4uCi0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKG1ldGhvZEJpbmRpbmcpOwogCQkvLyBDb2RlIGF0dHJpYnV0ZQotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBhZGQgY29kZSBhdHRyaWJ1dGUKIAkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7Ci0JCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JNZXRob2RBY2Nlc3MobWV0aG9kQmluZGluZyk7CisJCXRoaXMuY29kZVN0cmVhbS5pbml0KHRoaXMpOworCQl0aGlzLmNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yTWV0aG9kQWNjZXNzKG1ldGhvZEJpbmRpbmcpOwogCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNNZXRob2QoCiAJCQltZXRob2RCaW5kaW5nLAogCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKQEAgLTE0MTQsMjEgKzEwMzIsMjEgQEAKIAkJCQkuY29tcGlsYXRpb25SZXN1bHQKIAkJCQkuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CiAJfQogCiAJcHVibGljIHZvaWQgYWRkU3ludGhldGljU3dpdGNoVGFibGUoU3ludGhldGljTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CiAJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKIAkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCS8vIHRoaXMgd2lsbCBhZGQgZXhjZXB0aW9uIGF0dHJpYnV0ZSwgc3ludGhldGljIGF0dHJpYnV0ZSwgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsLi4uCi0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKG1ldGhvZEJpbmRpbmcpOwogCQkvLyBDb2RlIGF0dHJpYnV0ZQotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CiAJCWF0dHJpYnV0ZU51bWJlcisrOyAvLyBhZGQgY29kZSBhdHRyaWJ1dGUKIAkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7Ci0JCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JTd2l0Y2hUYWJsZShtZXRob2RCaW5kaW5nKTsKKwkJdGhpcy5jb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCXRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JTd2l0Y2hUYWJsZShtZXRob2RCaW5kaW5nKTsKIAkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yU3ludGhldGljTWV0aG9kKAogCQkJdHJ1ZSwKIAkJCW1ldGhvZEJpbmRpbmcsCkBAIC0xNDM5LDggKzEwNTcsOCBAQAogCQkJCS5jb21waWxhdGlvblJlc3VsdAogCQkJCS5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCkpOwogCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCi0JCWNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOwotCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJdGhpcy5jb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKIAl9CiAKIAkvKioKQEAgLTE0NTcsMjQgKzEwNzUsMjQgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGUoaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQpIHsKIAkJLy8gcmVpbml0aWFsaXplIHRoZSBsb2NhbENvbnRlbnRzIHdpdGggdGhlIGJ5dGUgbW9kaWZpZWQgYnkgdGhlIGNvZGUgc3RyZWFtCi0JCXRoaXMuY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOwotCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0OworCQl0aGlzLmNvbnRlbnRzID0gdGhpcy5jb2RlU3RyZWFtLmJDb2RlU3RyZWFtOworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CiAJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUKIAkJLy8gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlQXR0cmlidXRlCiAJCS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldAogCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLgotCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpbnQgY29kZV9sZW5ndGggPSB0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb247CiAJCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7Ci0JCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KAotCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24pOworCQkJdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KAorCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbik7CiAJCX0KIAkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMjApOwogCQl9Ci0JCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4OworCQlpbnQgbWF4X3N0YWNrID0gdGhpcy5jb2RlU3RyZWFtLnN0YWNrTWF4OwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7Ci0JCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7CisJCWludCBtYXhfbG9jYWxzID0gdGhpcy5jb2RlU3RyZWFtLm1heExvY2FsczsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOwpAQCAtMTQ4MiwzMCArMTEwMCwzMSBAQAogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CiAKKwkJYm9vbGVhbiBhZGRTdGFja01hcHMgPSAodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRSkgIT0gMDsKIAkJLy8gd3JpdGUgdGhlIGV4Y2VwdGlvbiB0YWJsZQotCQlFeGNlcHRpb25MYWJlbFtdIGV4Y2VwdGlvbkxhYmVscyA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uTGFiZWxzOworCQlFeGNlcHRpb25MYWJlbFtdIGV4Y2VwdGlvbkxhYmVscyA9IHRoaXMuY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHM7CiAJCWludCBleGNlcHRpb25IYW5kbGVyc0NvdW50ID0gMDsgLy8gZWFjaCBsYWJlbCBob2xkcyBvbmUgaGFuZGxlciBwZXIgcmFuZ2UgKHN0YXJ0L2VuZCBjb250aWd1b3VzKQotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgKz0gY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNbaV0uY291bnQgLyAyOyAKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgKz0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc1tpXS5nZXRDb3VudCgpIC8gMjsKIAkJfQogCQlpbnQgZXhTaXplID0gZXhjZXB0aW9uSGFuZGxlcnNDb3VudCAqIDggKyAyOwogCQlpZiAoZXhTaXplICsgbG9jYWxDb250ZW50c09mZnNldCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoZXhTaXplKTsKIAkJfQotCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIAorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlCiAJCS8vIG9uIHRoZSBhdHRyaWJ1dGUgZ2VuZXJhdGlvbgogCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgPj4gOCk7CiAJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBleGNlcHRpb25IYW5kbGVyc0NvdW50OwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbWF4OyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbWF4OyBpKyspIHsKIAkJCUV4Y2VwdGlvbkxhYmVsIGV4Y2VwdGlvbkxhYmVsID0gZXhjZXB0aW9uTGFiZWxzW2ldOwogCQkJaWYgKGV4Y2VwdGlvbkxhYmVsICE9IG51bGwpIHsKLQkJCQlpbnQgaVJhbmdlID0gMCwgbWF4UmFuZ2UgPSBleGNlcHRpb25MYWJlbC5jb3VudDsKKwkJCQlpbnQgaVJhbmdlID0gMCwgbWF4UmFuZ2UgPSBleGNlcHRpb25MYWJlbC5nZXRDb3VudCgpOwogCQkJCWlmICgobWF4UmFuZ2UgJiAxKSAhPSAwKSB7Ci0JCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5hYm9ydF9pbnZhbGlkRXhjZXB0aW9uQXR0cmlidXRlLCBuZXcgU3RyaW5nKGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2VsZWN0b3IpKSwgCi0JCQkJCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbik7CisJCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKKwkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmFib3J0X2ludmFsaWRFeGNlcHRpb25BdHRyaWJ1dGUsIG5ldyBTdHJpbmcodGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yKSksCisJCQkJCQkJdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uKTsKIAkJCQl9Ci0JCQkJd2hpbGUgIChpUmFuZ2UgPCBtYXhSYW5nZSkgeworCQkJCXdoaWxlIChpUmFuZ2UgPCBtYXhSYW5nZSkgewogCQkJCQlpbnQgc3RhcnQgPSBleGNlcHRpb25MYWJlbC5yYW5nZXNbaVJhbmdlKytdOyAvLyBldmVuIHJhbmdlcyBhcmUgc3RhcnQgcG9zaXRpb25zCiAJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhcnQgPj4gOCk7CiAJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydDsKQEAgLTE1MTMsNiArMTEzMiwxMSBAQAogCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVuZCA+PiA4KTsKIAkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVuZDsKIAkJCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkxhYmVsLnBvc2l0aW9uOworCQkJCQlpZiAoYWRkU3RhY2tNYXBzKSB7CisJCQkJCQlTdGFja01hcEZyYW1lQ29kZVN0cmVhbSBzdGFja01hcEZyYW1lQ29kZVN0cmVhbSA9IChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgdGhpcy5jb2RlU3RyZWFtOworCQkJCQkJc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uYWRkRnJhbWVQb3NpdGlvbihoYW5kbGVyUEMpOworLy8JCQkJCQlzdGFja01hcEZyYW1lQ29kZVN0cmVhbS5hZGRFeGNlcHRpb25NYXJrZXIoaGFuZGxlclBDLCBleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlKTsKKwkJCQkJfQogCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsKIAkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsKIAkJCQkJaWYgKGV4Y2VwdGlvbkxhYmVsLmV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgewpAQCAtMTUyMyw5ICsxMTQ3LDkgQEAKIAkJCQkJCWludCBuYW1lSW5kZXg7CiAJCQkJCQlpZiAoZXhjZXB0aW9uTGFiZWwuZXhjZXB0aW9uVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKSB7CiAJCQkJCQkJLyogcmVwcmVzZW50cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBzZWUgY2xhc3MgbGl0ZXJhbCBhY2Nlc3MqLwotCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lKTsKKwkJCQkJCQluYW1lSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoZXhjZXB0aW9uTGFiZWwuZXhjZXB0aW9uVHlwZSk7CisJCQkJCQkJbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlKTsKIAkJCQkJCX0KIAkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwogCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKQEAgLTE1MzUsNTkyICsxMTU5LDUyIEBACiAJCX0KIAkJLy8gZGVidWcgYXR0cmlidXRlcwogCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOworCQlpbnQgYXR0cmlidXRlc051bWJlciA9IDA7CiAJCS8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgKIAkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOwogCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIpOwogCQl9CiAKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisKIAkJLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQogCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUykgIT0gMCkgewotCQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSAKLQkJCSAqIEJ1aWxkIHRoZSBwYWlycyBvZjoKLQkJCSAqIAkoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQotCQkJICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCi0JCQkgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQotCQkJICovCi0JCQlpbnRbXSBwY1RvU291cmNlTWFwVGFibGU7Ci0JCQlpZiAoKChwY1RvU291cmNlTWFwVGFibGUgPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXApICE9IG51bGwpCi0JCQkJJiYgKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgIT0gMCkpIHsKLQkJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7Ci0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7Ci0JCQkJaW50IGxpbmVOdW1iZXJUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OwotCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgKLQkJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKLQkJCQlpbnQgbGVuZ3RoID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDspIHsKLQkJCQkJLy8gd3JpdGUgdGhlIGVudHJ5Ci0JCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJcmVzaXplQ29udGVudHMoNCk7Ci0JCQkJCX0KLQkJCQkJaW50IHBjID0gcGNUb1NvdXJjZU1hcFRhYmxlW2krK107Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocGMgPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwYzsKLQkJCQkJaW50IGxpbmVOdW1iZXIgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyID4+IDgpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlcjsKLQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJfQotCQkJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQotCQkJCWludCBsaW5lTnVtYmVyQXR0cl9sZW5ndGggPSBudW1iZXJPZkVudHJpZXMgKiA0ICsgMjsKLQkJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDI0KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDE2KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJBdHRyX2xlbmd0aDsKLQkJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsKLQkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJCX0KKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlKCk7CiAJCX0KIAkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMpICE9IDApIHsKLQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOwotCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7Ci0JCQlmaW5hbCBib29sZWFuIG1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMgPSBjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCk7Ci0JCQlpbnQgbWF4T2ZFbnRyaWVzID0gOCArIDEwICogKG1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMgPyAwIDogMSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGVTdHJlYW0uYWxsTG9jYWxzQ291bnRlcjsgaSsrKSB7Ci0JCQkJbWF4T2ZFbnRyaWVzICs9IDEwICogY29kZVN0cmVhbS5sb2NhbHNbaV0uaW5pdGlhbGl6YXRpb25Db3VudDsKLQkJCX0KLQkJCS8vIHJlc2VydmUgZW5vdWdoIHNwYWNlCi0JCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIG1heE9mRW50cmllcyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKG1heE9mRW50cmllcyk7Ci0JCQl9Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9jYWxWYXJpYWJsZU5hbWVJbmRleDsKLQkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxvY2FsX3ZhcmlhYmxlX3RhYmxlX2xlbmd0aAotCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OwotCQkJaW50IG5hbWVJbmRleDsKLQkJCWludCBkZXNjcmlwdG9ySW5kZXg7Ci0JCQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPSBudWxsOwotCQkJaWYgKCFtZXRob2REZWNsYXJhdGlvbklzU3RhdGljKSB7Ci0JCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOwotCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQ29uc3RhbnRQb29sLlRoaXMpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJZGVjbGFyaW5nQ2xhc3NCaW5kaW5nID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJZGVzY3JpcHRvckluZGV4ID0KLQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgKLQkJCQkJCWRlY2xhcmluZ0NsYXNzQmluZGluZy5zaWduYXR1cmUoKSk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOy8vIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhpcyBpcyBhbHdheXMgMAotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl9Ci0JCQkvLyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBsb2NhbCB2YXJpYWJsZSB3aXRoIGEgZ2VuZXJpYyB0eXBlCi0JCQlpbnQgZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlciA9IDA7Ci0JCQlMb2NhbFZhcmlhYmxlQmluZGluZ1tdIGdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9IG51bGw7Ci0JCQlpbnQgbnVtYmVyT2ZHZW5lcmljRW50cmllcyA9IDA7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkgPCBtYXg7IGkrKykgewotCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGUgPSBjb2RlU3RyZWFtLmxvY2Fsc1tpXTsKLQkJCQlmaW5hbCBUeXBlQmluZGluZyBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcgPSBsb2NhbFZhcmlhYmxlLnR5cGU7Ci0JCQkJYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWRUeXBlID0gbG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nLmlzUGFyYW1ldGVyaXplZFR5cGUoKSB8fCBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcuaXNUeXBlVmFyaWFibGUoKTsKLQkJCQlpZiAobG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50ICE9IDAgJiYgaXNQYXJhbWV0ZXJpemVkVHlwZSkgewotCQkJCQlpZiAoZ2VuZXJpY0xvY2FsVmFyaWFibGVzID09IG51bGwpIHsKLQkJCQkJCS8vIHdlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBtYXggbG9jYWxzCi0JCQkJCQlnZW5lcmljTG9jYWxWYXJpYWJsZXMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbbWF4XTsKLQkJCQkJfQotCQkJCQlnZW5lcmljTG9jYWxWYXJpYWJsZXNbZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlcisrXSA9IGxvY2FsVmFyaWFibGU7Ci0JCQkJfQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50OyBqKyspIHsKLQkJCQkJaW50IHN0YXJ0UEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzW2ogPDwgMV07Ci0JCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsKLQkJCQkJaWYgKHN0YXJ0UEMgIT0gZW5kUEMpIHsgLy8gb25seSBlbnRyaWVzIGZvciBub24gemVybyBsZW5ndGgKLQkJCQkJCWlmIChlbmRQQyA9PSAtMSkgewotCQkJCQkJCWxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoCi0JCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmFib3J0X2ludmFsaWRBdHRyaWJ1dGUsIG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIAotCQkJCQkJCQkJKEFTVE5vZGUpIGxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpc1BhcmFtZXRlcml6ZWRUeXBlKSB7Ci0JCQkJCQkJbnVtYmVyT2ZHZW5lcmljRW50cmllcysrOwotCQkJCQkJfQotCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsKLQkJCQkJCWludCBsZW5ndGggPSBlbmRQQyAtIHN0YXJ0UEM7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7Ci0JCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5zaWduYXR1cmUoKSk7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7Ci0JCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQkKLQkJCWZpbmFsIGJvb2xlYW4gY3VycmVudEluc3RhbmNlSXNHZW5lcmljID0gCi0JCQkJIW1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMKLQkJCQkmJiBkZWNsYXJpbmdDbGFzc0JpbmRpbmcgIT0gbnVsbCAKLQkJCQkmJiBkZWNsYXJpbmdDbGFzc0JpbmRpbmcudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOwotCQkJaWYgKGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIgIT0gMCB8fCBjdXJyZW50SW5zdGFuY2VJc0dlbmVyaWMpIHsKLQkJCQkvLyBhZGQgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGUgYXR0cmlidXRlCi0JCQkJbnVtYmVyT2ZHZW5lcmljRW50cmllcyArPSAoY3VycmVudEluc3RhbmNlSXNHZW5lcmljID8gMSA6IDApOwotCQkJCW1heE9mRW50cmllcyA9IDggKyBudW1iZXJPZkdlbmVyaWNFbnRyaWVzICogMTA7Ci0JCQkJLy8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UKLQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIG1heE9mRW50cmllcyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyhtYXhPZkVudHJpZXMpOwotCQkJCX0KLQkJCQlpbnQgbG9jYWxWYXJpYWJsZVR5cGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUeXBlVGFibGVOYW1lKTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4ID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVJbmRleDsKLQkJCQl2YWx1ZSA9IG51bWJlck9mR2VuZXJpY0VudHJpZXMgKiAxMCArIDI7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkdlbmVyaWNFbnRyaWVzID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZkdlbmVyaWNFbnRyaWVzOwotCQkJCWlmIChjdXJyZW50SW5zdGFuY2VJc0dlbmVyaWMpIHsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOwotCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5UaGlzKTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZGVjbGFyaW5nQ2xhc3NCaW5kaW5nLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQl9Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmljTG9jYWxWYXJpYWJsZXNDb3VudGVyOyBpKyspIHsKLQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGdlbmVyaWNMb2NhbFZhcmlhYmxlc1tpXTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgewotCQkJCQkJaW50IHN0YXJ0UEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzW2ogPDwgMV07Ci0JCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07Ci0JCQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgewotCQkJCQkJCS8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoCi0JCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhcnRQQyA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsKLQkJCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGVuZ3RoID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7Ci0JCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHJlc29sdmVkUG9zaXRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQl9CisJCQlmaW5hbCBib29sZWFuIG1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMgPSB0aGlzLmNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uaXNTdGF0aWMoKTsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUoY29kZV9sZW5ndGgsIG1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMsIGZhbHNlKTsKKwkJfQorCisJCWlmIChhZGRTdGFja01hcHMpIHsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcFRhYmxlQXR0cmlidXRlKAorCQkJCQl0aGlzLmNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uYmluZGluZywKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCWZhbHNlKTsKIAkJfQogCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkgIT0gMCkgewotCQkJZmluYWwgU2V0IGZyYW1lc1Bvc2l0aW9ucyA9ICgoU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmZyYW1lUG9zaXRpb25zOwotCQkJZmluYWwgaW50IGZyYW1lc1Bvc2l0aW9uc1NpemUgPSBmcmFtZXNQb3NpdGlvbnMuc2l6ZSgpOwotCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzUG9zaXRpb25zU2l6ZSAtIDE7IC8vIC0xIGJlY2F1c2UgbGFzdCByZXR1cm4gZG9lc24ndCBjb3VudAotCQkJaWYgKG51bWJlck9mRnJhbWVzID4gMCkgewotCQkJCUFycmF5TGlzdCBmcmFtZVBvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoZnJhbWVzUG9zaXRpb25zU2l6ZSk7Ci0JCQkJZnJhbWVQb3NpdGlvbnMuYWRkQWxsKGZyYW1lc1Bvc2l0aW9ucyk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChmcmFtZVBvc2l0aW9ucyk7Ci0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCS8vIGFkZCB0aGUgc3RhY2sgbWFwIHRhYmxlIGF0dHJpYnV0ZQotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCQl9Ci0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN0YWNrTWFwVGFibGVOYW1lKTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkJCi0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCS8vIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGUKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDQ7Ci0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOwotCQkJCX0KLQkJCQludW1iZXJPZkZyYW1lcyA9IDA7Ci0JCQkJaW50IG51bWJlck9mRnJhbWVzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7Ci0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDIpOwotCQkJCX0KLQkJCQlBcnJheUxpc3QgZnJhbWVzID0gKChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZnJhbWVzOwotCQkJCVN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lID0gKFN0YWNrTWFwRnJhbWUpIGZyYW1lcy5nZXQoMCk7Ci0JCQkJU3RhY2tNYXBGcmFtZSBwcmV2RnJhbWUgPSBudWxsOwotCQkJCWludCBmcmFtZXNTaXplID0gZnJhbWVzLnNpemUoKTsKLQkJCQlpbnQgZnJhbWVJbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcmFtZXNQb3NpdGlvbnNTaXplICYmICgoSW50ZWdlcikgZnJhbWVQb3NpdGlvbnMuZ2V0KGopKS5pbnRWYWx1ZSgpIDwgY29kZV9sZW5ndGg7IGorKykgewotCQkJCQkvLyBzZWxlY3QgbmV4dCBmcmFtZQotCQkJCQlwcmV2RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0JCQkJCWN1cnJlbnRGcmFtZSA9IG51bGw7Ci0JCQkJCWZvciAoOyBmcmFtZUluZGV4IDwgZnJhbWVzU2l6ZTsgZnJhbWVJbmRleCsrKSB7Ci0JCQkJCQljdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldChmcmFtZUluZGV4KTsKLQkJCQkJCWlmIChjdXJyZW50RnJhbWUucGMgPT0gKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEZyYW1lID09IG51bGwpIGJyZWFrOwotCQkJCQkvLyBnZW5lcmF0ZSBjdXJyZW50IGZyYW1lCi0JCQkJCS8vIG5lZWQgdG8gZmluZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGZyYW1lIGFuZCB0aGUgcHJldmlvdXMgZnJhbWUKLQkJCQkJbnVtYmVyT2ZGcmFtZXMrKzsKLQkJCQkJaW50IG9mZnNldERlbHRhID0gY3VycmVudEZyYW1lLmdldE9mZnNldERlbHRhKHByZXZGcmFtZSk7Ci0JCQkJCXN3aXRjaCAoY3VycmVudEZyYW1lLmdldEZyYW1lVHlwZShwcmV2RnJhbWUpKSB7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuQVBQRU5EX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQlpbnQgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPSBjdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSArIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlpbnQgaW5kZXggPSBjdXJyZW50RnJhbWUuZ2V0SW5kZXhPZkRpZmZlcmVudExvY2FscyhudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxzID0gY3VycmVudEZyYW1lLmdldE51bWJlck9mTG9jYWxzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgY3VycmVudEZyYW1lLmxvY2Fscy5sZW5ndGggJiYgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPiAwOyBpKyspIHsKLQkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlyZXNpemVDb250ZW50cyg2KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLmxvY2Fsc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2Fscy0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLlNBTUVfRlJBTUUgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygxKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjUxOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLkNIT1BfRlJBTUUgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCW51bWJlck9mRGlmZmVyZW50TG9jYWxzID0gLWN1cnJlbnRGcmFtZS5udW1iZXJPZkRpZmZlcmVudExvY2FscyhwcmV2RnJhbWUpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoMjUxIC0gbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwkJCQkJCQkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNCk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhICsgNjQpOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCWJ5dGUgdGFnID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IHRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKHRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjQ3OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCWJ5dGUgdGFnID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IHRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKHRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCS8vIEZVTExfRlJBTUUKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDUgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNSk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjU1OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FsT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGxlYXZlIHR3byBzcG90cyBmb3IgbnVtYmVyIG9mIGxvY2FscwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FsRW50cmllcyA9IDA7Ci0JCQkJCQkJbnVtYmVyT2ZMb2NhbHMgPSBjdXJyZW50RnJhbWUuZ2V0TnVtYmVyT2ZMb2NhbHMoKTsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKLQkJCQkJCQlpbnQgbG9jYWxzTGVuZ3RoID0gY3VycmVudEZyYW1lLmxvY2FscyA9PSBudWxsID8gMCA6IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxzTGVuZ3RoICYmIG51bWJlck9mTG9jYWxFbnRyaWVzIDwgbnVtYmVyT2ZMb2NhbHM7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLmxvY2Fsc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQludW1iZXJPZkxvY2FsRW50cmllcysrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW51bWJlck9mRW50cmllcysrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNCk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mTG9jYWxPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mTG9jYWxPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mU3RhY2tJdGVtcyA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZTdGFja0l0ZW1zOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGFja0l0ZW1zOyBpKyspIHsKLQkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG51bWJlck9mRnJhbWVzICE9IDApIHsKLQkJCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkZyYW1lc09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZGcmFtZXMgPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZGcmFtZXNPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRnJhbWVzOwotCQotCQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OwotCQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwotCQkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ID0gc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU9mZnNldDsKLQkJCQl9Ci0JCQl9CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU3RhY2tNYXBBdHRyaWJ1dGUoCisJCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nLAorCQkJCQljb2RlX2xlbmd0aCwKKwkJCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCQkJbWF4X2xvY2FscywKKwkJCQkJZmFsc2UpOwogCQl9CiAKLQkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZXNOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlc051bWJlcjsKIAogCQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgKLQkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSB0aGlzLmNvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOwotCQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CiAJfQogCiAJLyoqCkBAIC0yMTM3LDI0ICsxMjIxLDI0IEBACiAJICovCiAJcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlRm9yQ2xpbml0KGludCBjb2RlQXR0cmlidXRlT2Zmc2V0KSB7CiAJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KLQkJdGhpcy5jb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07Ci0JCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCXRoaXMuY29udGVudHMgPSB0aGlzLmNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsKIAkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGNvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUKIAkJLy8gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlQXR0cmlidXRlCiAJCS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldAogCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLgotCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpbnQgY29kZV9sZW5ndGggPSB0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb247CiAJCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7Ci0JCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KAotCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdCgKKwkJCQl0aGlzLmNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKIAkJfQogCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyMCk7CiAJCX0KLQkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7CisJCWludCBtYXhfc3RhY2sgPSB0aGlzLmNvZGVTdHJlYW0uc3RhY2tNYXg7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsKLQkJaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsKKwkJaW50IG1heF9sb2NhbHMgPSB0aGlzLmNvZGVTdHJlYW0ubWF4TG9jYWxzOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CkBAIC0yMTYyLDI5ICsxMjQ2LDMwIEBACiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsKIAorCQlib29sZWFuIGFkZFN0YWNrTWFwcyA9ICh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQX1RBQkxFKSAhPSAwOwogCQkvLyB3cml0ZSB0aGUgZXhjZXB0aW9uIHRhYmxlCi0JCUV4Y2VwdGlvbkxhYmVsW10gZXhjZXB0aW9uTGFiZWxzID0gY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHM7CisJCUV4Y2VwdGlvbkxhYmVsW10gZXhjZXB0aW9uTGFiZWxzID0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsczsKIAkJaW50IGV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgPSAwOyAvLyBlYWNoIGxhYmVsIGhvbGRzIG9uZSBoYW5kbGVyIHBlciByYW5nZSAoc3RhcnQvZW5kIGNvbnRpZ3VvdXMpCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJZXhjZXB0aW9uSGFuZGxlcnNDb3VudCArPSBjb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc1tpXS5jb3VudCAvIDI7IAorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJZXhjZXB0aW9uSGFuZGxlcnNDb3VudCArPSB0aGlzLmNvZGVTdHJlYW0uZXhjZXB0aW9uTGFiZWxzW2ldLmdldENvdW50KCkgLyAyOwogCQl9CiAJCWludCBleFNpemUgPSBleGNlcHRpb25IYW5kbGVyc0NvdW50ICogOCArIDI7CiAJCWlmIChleFNpemUgKyBsb2NhbENvbnRlbnRzT2Zmc2V0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cyhleFNpemUpOwogCQl9Ci0JCS8vIHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiB0YWJsZSwgc28gd2UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgY3VycmVudCBvZmZzZXQgYW5kIG1vdmUgCisJCS8vIHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiB0YWJsZSwgc28gd2UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgY3VycmVudCBvZmZzZXQgYW5kIG1vdmUKIAkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCiAJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uSGFuZGxlcnNDb3VudCA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzQ291bnQ7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBjb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBtYXg7IGkrKykgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBtYXg7IGkrKykgewogCQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uTGFiZWwgPSBleGNlcHRpb25MYWJlbHNbaV07CiAJCQlpZiAoZXhjZXB0aW9uTGFiZWwgIT0gbnVsbCkgewotCQkJCWludCBpUmFuZ2UgPSAwLCBtYXhSYW5nZSA9IGV4Y2VwdGlvbkxhYmVsLmNvdW50OworCQkJCWludCBpUmFuZ2UgPSAwLCBtYXhSYW5nZSA9IGV4Y2VwdGlvbkxhYmVsLmdldENvdW50KCk7CiAJCQkJaWYgKChtYXhSYW5nZSAmIDEpICE9IDApIHsKLQkJCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmFib3J0X2ludmFsaWRFeGNlcHRpb25BdHRyaWJ1dGUsIG5ldyBTdHJpbmcoY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvcikpLCAKLQkJCQkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uKTsKLQkJCQl9CQkJCQorCQkJCQl0aGlzLmNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoCisJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5hYm9ydF9pbnZhbGlkRXhjZXB0aW9uQXR0cmlidXRlLCBuZXcgU3RyaW5nKHRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvcikpLAorCQkJCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbik7CisJCQkJfQogCQkJCXdoaWxlICAoaVJhbmdlIDwgbWF4UmFuZ2UpIHsKIAkJCQkJaW50IHN0YXJ0ID0gZXhjZXB0aW9uTGFiZWwucmFuZ2VzW2lSYW5nZSsrXTsgLy8gZXZlbiByYW5nZXMgYXJlIHN0YXJ0IHBvc2l0aW9ucwogCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0ID4+IDgpOwpAQCAtMjE5NSw2ICsxMjgwLDExIEBACiAJCQkJCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25MYWJlbC5wb3NpdGlvbjsKIAkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7CiAJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7CisJCQkJCWlmIChhZGRTdGFja01hcHMpIHsKKwkJCQkJCVN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtIHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtID0gKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSB0aGlzLmNvZGVTdHJlYW07CisJCQkJCQlzdGFja01hcEZyYW1lQ29kZVN0cmVhbS5hZGRGcmFtZVBvc2l0aW9uKGhhbmRsZXJQQyk7CisvLwkJCQkJCXN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLmFkZEV4Y2VwdGlvbk1hcmtlcihoYW5kbGVyUEMsIGV4Y2VwdGlvbkxhYmVsLmV4Y2VwdGlvblR5cGUpOworCQkJCQl9CiAJCQkJCWlmIChleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlID09IG51bGwpIHsKIAkJCQkJCS8vIGFueSBleGNlcHRpb24gaGFuZGxlcgogCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKQEAgLTIyMDMsOSArMTI5Myw5IEBACiAJCQkJCQlpbnQgbmFtZUluZGV4OwogCQkJCQkJaWYgKGV4Y2VwdGlvbkxhYmVsLmV4Y2VwdGlvblR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCkgewogCQkJCQkJCS8qIHJlcHJlc2VudHMgZGVub3RlIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIHNlZSBjbGFzcyBsaXRlcmFsIGFjY2VzcyovCi0JCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkNvbnN0YW50UG9vbE5hbWUpOworCQkJCQkJCW5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkNvbnN0YW50UG9vbE5hbWUpOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlKTsKKwkJCQkJCQluYW1lSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGV4Y2VwdGlvbkxhYmVsLmV4Y2VwdGlvblR5cGUpOwogCQkJCQkJfQogCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7CiAJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwpAQCAtMjIxNSw1NDYgKzEzMDUsNTUgQEAKIAkJfQogCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzCiAJCWludCBjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKIAkJLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aAogCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7CiAJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMik7CiAJCX0KIAorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwogCQkvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX0xJTkVTKSAhPSAwKSB7Ci0JCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIAotCQkJICogQnVpbGQgdGhlIHBhaXJzIG9mOgotCQkJICogCShieXRlY29kZVBDIGxpbmVOdW1iZXIpCi0JCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUKLQkJCSAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtCi0JCQkgKi8KLQkJCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsKLQkJCWlmICgoKHBjVG9Tb3VyY2VNYXBUYWJsZSA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCkgIT0gbnVsbCkKLQkJCQkmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZSAhPSAwKSkgewotCQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0KLQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKLQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJcmVzaXplQ29udGVudHMoOCk7Ci0JCQkJfQotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsKLQkJCQlpbnQgbGluZU51bWJlclRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7Ci0JCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxpbmVfbnVtYmVyX3RhYmxlX2xlbmd0aAotCQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOwotCQkJCWludCBsZW5ndGggPSBjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOykgewotCQkJCQkvLyB3cml0ZSB0aGUgZW50cnkKLQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCQkJfQotCQkJCQlpbnQgcGMgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwYyA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHBjOwotCQkJCQlpbnQgbGluZU51bWJlciA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXIgPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyOwotCQkJCQludW1iZXJPZkVudHJpZXMrKzsKLQkJCQl9Ci0JCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlCi0JCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMjQpOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMTYpOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlckF0dHJfbGVuZ3RoOwotCQkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJCWF0dHJpYnV0ZU51bWJlcisrOwotCQkJfQorCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKIAkJfQogCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKIAkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUykgIT0gMCkgewotCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7Ci0JCQkvLwkJY29kZUF0dHJpYnV0ZS5hZGRMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUodGhpcyk7Ci0JCQlpZiAoKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCAhPSBudWxsKQotCQkJCSYmIChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7Ci0JCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOwotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCQl9Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4OwotCQkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsKLQotCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgKLQkJCQlpbnQgbmFtZUluZGV4OwotCQkJCWludCBkZXNjcmlwdG9ySW5kZXg7Ci0KLQkJCQkvLyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBsb2NhbCB2YXJpYWJsZSB3aXRoIGEgZ2VuZXJpYyB0eXBlCi0JCQkJaW50IGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIgPSAwOwotCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nW10gZ2VuZXJpY0xvY2FsVmFyaWFibGVzID0gbnVsbDsKLQkJCQlpbnQgbnVtYmVyT2ZHZW5lcmljRW50cmllcyA9IDA7Ci0KLQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGNvZGVTdHJlYW0ubG9jYWxzW2ldOwotCQkJCQlmaW5hbCBUeXBlQmluZGluZyBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcgPSBsb2NhbFZhcmlhYmxlLnR5cGU7Ci0JCQkJCWJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkVHlwZSA9IGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgbG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCk7Ci0JCQkJCWlmIChsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQgIT0gMCAmJiBpc1BhcmFtZXRlcml6ZWRUeXBlKSB7Ci0JCQkJCQlpZiAoZ2VuZXJpY0xvY2FsVmFyaWFibGVzID09IG51bGwpIHsKLQkJCQkJCQkvLyB3ZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gbWF4IGxvY2FscwotCQkJCQkJCWdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1ttYXhdOwotCQkJCQkJfQotCQkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzW2dlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIrK10gPSBsb2NhbFZhcmlhYmxlOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50OyBqKyspIHsKLQkJCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOwotCQkJCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOwotCQkJCQkJaWYgKHN0YXJ0UEMgIT0gZW5kUEMpIHsgLy8gb25seSBlbnRyaWVzIGZvciBub24gemVybyBsZW5ndGgKLQkJCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsKLQkJCQkJCQkJbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKLQkJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYWJvcnRfaW52YWxpZEF0dHJpYnV0ZSwgbmV3IFN0cmluZyhsb2NhbFZhcmlhYmxlLm5hbWUpKSwgCi0JCQkJCQkJCQkoQVNUTm9kZSkgbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDEwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJCW51bWJlck9mRW50cmllcysrOwotCQkJCQkJCWlmIChpc1BhcmFtZXRlcml6ZWRUeXBlKSB7Ci0JCQkJCQkJCW51bWJlck9mR2VuZXJpY0VudHJpZXMrKzsKLQkJCQkJCQl9Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydFBDOwotCQkJCQkJCWludCBsZW5ndGggPSBlbmRQQyAtIHN0YXJ0UEM7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsKLQkJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKLQkJCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5zaWduYXR1cmUoKSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHJlc29sdmVkUG9zaXRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJCWF0dHJpYnV0ZU51bWJlcisrOwotCi0JCQkJaWYgKGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIgIT0gMCkgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGUgYXR0cmlidXRlCi0JCQkJCS8vIHJlc2VydmUgZW5vdWdoIHNwYWNlCi0JCQkJCWludCBtYXhPZkVudHJpZXMgPSA4ICsgbnVtYmVyT2ZHZW5lcmljRW50cmllcyAqIDEwOwotCi0JCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgbWF4T2ZFbnRyaWVzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQlyZXNpemVDb250ZW50cyhtYXhPZkVudHJpZXMpOwotCQkJCQl9Ci0JCQkJCWludCBsb2NhbFZhcmlhYmxlVHlwZU5hbWVJbmRleCA9Ci0JCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUeXBlVGFibGVOYW1lKTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlVHlwZU5hbWVJbmRleCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4OwotCQkJCQl2YWx1ZSA9IG51bWJlck9mR2VuZXJpY0VudHJpZXMgKiAxMCArIDI7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mR2VuZXJpY0VudHJpZXMgPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZkdlbmVyaWNFbnRyaWVzOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXI7IGkrKykgewotCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGdlbmVyaWNMb2NhbFZhcmlhYmxlc1tpXTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50OyBqKyspIHsKLQkJCQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsKLQkJCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07Ci0JCQkJCQkJaWYgKHN0YXJ0UEMgIT0gZW5kUEMpIHsgLy8gb25seSBlbnRyaWVzIGZvciBub24gemVybyBsZW5ndGgKLQkJCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydFBDOwotCQkJCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOwotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKLQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsKLQkJCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOwotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKLQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKLQkJCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwotCQkJCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOwotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQkJfQotCQkJfQorCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZShjb2RlX2xlbmd0aCwgdHJ1ZSwgZmFsc2UpOwogCQl9Ci0JCQorCisJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRSkgIT0gMCkgeworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZVN0YWNrTWFwVGFibGVBdHRyaWJ1dGUoCisJCQkJCW51bGwsCisJCQkJCWNvZGVfbGVuZ3RoLAorCQkJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJCQltYXhfbG9jYWxzLAorCQkJCQl0cnVlKTsKKwkJfQorCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkgIT0gMCkgewotCQkJZmluYWwgU2V0IGZyYW1lc1Bvc2l0aW9ucyA9ICgoU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmZyYW1lUG9zaXRpb25zOwotCQkJZmluYWwgaW50IGZyYW1lc1Bvc2l0aW9uc1NpemUgPSBmcmFtZXNQb3NpdGlvbnMuc2l6ZSgpOwotCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzUG9zaXRpb25zU2l6ZSAtIDE7IC8vIC0xIGJlY2F1c2UgbGFzdCByZXR1cm4gZG9lc24ndCBjb3VudAotCQkJaWYgKG51bWJlck9mRnJhbWVzID4gMCkgewotCQkJCUFycmF5TGlzdCBmcmFtZVBvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoZnJhbWVzUG9zaXRpb25zU2l6ZSk7Ci0JCQkJZnJhbWVQb3NpdGlvbnMuYWRkQWxsKGZyYW1lc1Bvc2l0aW9ucyk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChmcmFtZVBvc2l0aW9ucyk7Ci0JCQkJLy8gYWRkIHRoZSBzdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCi0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJCX0KLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3RhY2tNYXBUYWJsZU5hbWUpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCQkKLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJLy8gZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZQotCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNDsKLQkJCQludW1iZXJPZkZyYW1lcyA9IDA7Ci0JCQkJaW50IG51bWJlck9mRnJhbWVzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7Ci0JCQkJLy8gZ2VuZXJhdGUgYWxsIGZyYW1lcwotCQkJCUFycmF5TGlzdCBmcmFtZXMgPSAoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5mcmFtZXM7Ci0JCQkJU3RhY2tNYXBGcmFtZSBjdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldCgwKTsKLQkJCQlTdGFja01hcEZyYW1lIHByZXZGcmFtZSA9IG51bGw7Ci0JCQkJaW50IGZyYW1lc1NpemUgPSBmcmFtZXMuc2l6ZSgpOwotCQkJCWludCBmcmFtZUluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyYW1lc1Bvc2l0aW9uc1NpemUgJiYgKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkgPCBjb2RlX2xlbmd0aDsgaisrKSB7Ci0JCQkJCS8vIHNlbGVjdCBuZXh0IGZyYW1lCi0JCQkJCXByZXZGcmFtZSA9IGN1cnJlbnRGcmFtZTsKLQkJCQkJY3VycmVudEZyYW1lID0gbnVsbDsKLQkJCQkJZm9yICg7IGZyYW1lSW5kZXggPCBmcmFtZXNTaXplOyBmcmFtZUluZGV4KyspIHsKLQkJCQkJCWN1cnJlbnRGcmFtZSA9IChTdGFja01hcEZyYW1lKSBmcmFtZXMuZ2V0KGZyYW1lSW5kZXgpOwotCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5wYyA9PSAoKEludGVnZXIpIGZyYW1lUG9zaXRpb25zLmdldChqKSkuaW50VmFsdWUoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50RnJhbWUgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCW51bWJlck9mRnJhbWVzKys7Ci0JCQkJCWludCBvZmZzZXREZWx0YSA9IGN1cnJlbnRGcmFtZS5nZXRPZmZzZXREZWx0YShwcmV2RnJhbWUpOwotCQkJCQlzd2l0Y2ggKGN1cnJlbnRGcmFtZS5nZXRGcmFtZVR5cGUocHJldkZyYW1lKSkgewotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLkFQUEVORF9GUkFNRSA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJaW50IG51bWJlck9mRGlmZmVyZW50TG9jYWxzID0gY3VycmVudEZyYW1lLm51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgyNTEgKyBudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IGluZGV4ID0gY3VycmVudEZyYW1lLmdldEluZGV4T2ZEaWZmZXJlbnRMb2NhbHMobnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWZvciAoaW50IGkgPSBpbmRleDsgaSA8IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoICYmIG51bWJlck9mRGlmZmVyZW50TG9jYWxzID4gMDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5sb2NhbHNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMtLTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMSk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9GUkFNRV9FWFRFTkRFRCA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI1MTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5DSE9QX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC1jdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSAtIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsJCQkJCQkJCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNUyA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSArIDY0KTsKLQkJCQkJCQlpZiAoY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0gPT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3dpdGNoKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdLmlkKCkpIHsKLQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXTsKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjQ3OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gRlVMTF9GUkFNRQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg1KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNTU7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gbGVhdmUgdHdvIHNwb3RzIGZvciBudW1iZXIgb2YgbG9jYWxzCi0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxFbnRyaWVzID0gMDsKLQkJCQkJCQludW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOwotCQkJCQkJCWludCBsb2NhbHNMZW5ndGggPSBjdXJyZW50RnJhbWUubG9jYWxzID09IG51bGwgPyAwIDogY3VycmVudEZyYW1lLmxvY2Fscy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHNMZW5ndGggJiYgbnVtYmVyT2ZMb2NhbEVudHJpZXMgPCBudW1iZXJPZkxvY2FsczsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOwotCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW51bWJlck9mTG9jYWxFbnRyaWVzKys7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJCQkJCWludCBudW1iZXJPZlN0YWNrSXRlbXMgPSBjdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZTdGFja0l0ZW1zID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZlN0YWNrSXRlbXM7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlN0YWNrSXRlbXM7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkZyYW1lcyA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkZyYW1lczsKLQotCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKLQkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJCX0KKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcEF0dHJpYnV0ZSgKKwkJCQkJbnVsbCwKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCXRydWUpOwogCQl9Ci0JCQorCiAJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKIAkJLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGNvbnRlbnRzIGFycmF5CiAJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMik7CiAJCX0KLQkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZXNOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlc051bWJlcjsKIAkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCi0JCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gdGhpcy5jb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKLQkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCX0KIAogCS8qKgpAQCAtMjc2OCwyNyArMTM2NywyNyBAQAogCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvckNsaW5pdCgKLQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsCi0JCWludCBwcm9ibGVtTGluZSkgeworCQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQlpbnQgcHJvYmxlbUxpbmUpIHsKIAkJLy8gcmVpbml0aWFsaXplIHRoZSBjb250ZW50cyB3aXRoIHRoZSBieXRlIG1vZGlmaWVkIGJ5IHRoZSBjb2RlIHN0cmVhbQotCQl0aGlzLmNvbnRlbnRzID0gY29kZVN0cmVhbS5iQ29kZVN0cmVhbTsKLQkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSBjb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsKKwkJdGhpcy5jb250ZW50cyA9IHRoaXMuY29kZVN0cmVhbS5iQ29kZVN0cmVhbTsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0OwogCQkvLyBjb2RlQXR0cmlidXRlT2Zmc2V0IGlzIHRoZSBwb3NpdGlvbiBpbnNpZGUgY29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZQogCQkvLyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVBdHRyaWJ1dGUKIAkJLy8gVGhhdCBtZWFucyB0aGF0IHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoIHlvdSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSB2YWx1ZSBvZiBjb2RlQXR0cmlidXRlT2Zmc2V0CiAJCS8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uCi0JCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWludCBjb2RlX2xlbmd0aCA9IHRoaXMuY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaWYgKGNvZGVfbGVuZ3RoID4gNjU1MzUpIHsKLQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYnl0ZWNvZGVFeGNlZWRzNjRLTGltaXQoCi0JCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KAorCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOwogCQl9CiAJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMjAgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIwKTsKIAkJfQotCQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsKKwkJaW50IG1heF9zdGFjayA9IHRoaXMuY29kZVN0cmVhbS5zdGFja01heDsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOwotCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOworCQlpbnQgbWF4X2xvY2FscyA9IHRoaXMuY29kZVN0cmVhbS5tYXhMb2NhbHM7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsKQEAgLTI4MDIsNDUgKzE0MDEsMjIgQEAKIAogCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzCiAJCWludCBjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7IC8vIGxlYXZlIHR3byBieXRlcyBmb3IgdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkJaW50IGF0dHJpYnV0ZXNOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCiAJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQogCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIpOwogCQl9CiAKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CiAJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUKIAkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfTElORVMpICE9IDApIHsKLQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMjAgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cygyMCk7Ci0JCQl9CQkJCi0JCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIAotCQkJICAgICogQnVpbGQgdGhlIHBhaXJzIG9mOgotCQkJICAgICogKGJ5dGVjb2RlUEMgbGluZU51bWJlcikKLQkJCSAgICAqIGFjY29yZGluZyB0byB0aGUgdGFibGUgb2Ygc3RhcnQgbGluZSBpbmRleGVzIGFuZCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZQotCQkJICAgICogY29udGFpbmVkIGludG8gdGhlIGNvZGVzdHJlYW0KLQkJCSAgICAqLwotCQkJaW50IGxpbmVOdW1iZXJOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDY7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsKLQkJCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMAotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHByb2JsZW1MaW5lOwotCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlCi0JCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlKHByb2JsZW1MaW5lKTsKIAkJfQorCQlsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMpICE9IDApIHsKIAkJCWludCBsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID0KLQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOworCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVGFibGVOYW1lKTsKIAkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwogCQkJfQpAQCAtMjg1MiwzOTEgKzE0MjgsNjQgQEAKIAkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDI7CiAJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwogCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlcisrOwogCQl9Ci0JCQotCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApICE9IDApIHsKLQkJCWZpbmFsIFNldCBmcmFtZXNQb3NpdGlvbnMgPSAoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5mcmFtZVBvc2l0aW9uczsKLQkJCWZpbmFsIGludCBmcmFtZXNQb3NpdGlvbnNTaXplID0gZnJhbWVzUG9zaXRpb25zLnNpemUoKTsKLQkJCWludCBudW1iZXJPZkZyYW1lcyA9IGZyYW1lc1Bvc2l0aW9uc1NpemUgLSAxOyAvLyAtMSBiZWNhdXNlIGxhc3QgcmV0dXJuIGRvZXNuJ3QgY291bnQKLQkJCWlmIChudW1iZXJPZkZyYW1lcyA+IDApIHsKLQkJCQlBcnJheUxpc3QgZnJhbWVQb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KGZyYW1lc1Bvc2l0aW9uc1NpemUpOwotCQkJCWZyYW1lUG9zaXRpb25zLmFkZEFsbChmcmFtZXNQb3NpdGlvbnMpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoZnJhbWVQb3NpdGlvbnMpOwotCQkJCS8vIGFkZCB0aGUgc3RhY2sgbWFwIHRhYmxlIGF0dHJpYnV0ZQotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCQl9Ci0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN0YWNrTWFwVGFibGVOYW1lKTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkJCi0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCS8vIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGUKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDQ7Ci0JCQkJbnVtYmVyT2ZGcmFtZXMgPSAwOwotCQkJCWludCBudW1iZXJPZkZyYW1lc09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOwotCQkJCS8vIGdlbmVyYXRlIGFsbCBmcmFtZXMKLQkJCQlBcnJheUxpc3QgZnJhbWVzID0gKChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZnJhbWVzOwotCQkJCVN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lID0gKFN0YWNrTWFwRnJhbWUpIGZyYW1lcy5nZXQoMCk7Ci0JCQkJU3RhY2tNYXBGcmFtZSBwcmV2RnJhbWUgPSBudWxsOwotCQkJCWludCBmcmFtZXNTaXplID0gZnJhbWVzLnNpemUoKTsKLQkJCQlpbnQgZnJhbWVJbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcmFtZXNQb3NpdGlvbnNTaXplICYmICgoSW50ZWdlcikgZnJhbWVQb3NpdGlvbnMuZ2V0KGopKS5pbnRWYWx1ZSgpIDwgY29kZV9sZW5ndGg7IGorKykgewotCQkJCQkvLyBzZWxlY3QgbmV4dCBmcmFtZQotCQkJCQlwcmV2RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0JCQkJCWN1cnJlbnRGcmFtZSA9IG51bGw7Ci0JCQkJCWZvciAoOyBmcmFtZUluZGV4IDwgZnJhbWVzU2l6ZTsgZnJhbWVJbmRleCsrKSB7Ci0JCQkJCQljdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldChmcmFtZUluZGV4KTsKLQkJCQkJCWlmIChjdXJyZW50RnJhbWUucGMgPT0gKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEZyYW1lID09IG51bGwpIGJyZWFrOwotCQkJCQkvLyBnZW5lcmF0ZSBjdXJyZW50IGZyYW1lCi0JCQkJCS8vIG5lZWQgdG8gZmluZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGZyYW1lIGFuZCB0aGUgcHJldmlvdXMgZnJhbWUKLQkJCQkJbnVtYmVyT2ZGcmFtZXMrKzsKLQkJCQkJaW50IG9mZnNldERlbHRhID0gY3VycmVudEZyYW1lLmdldE9mZnNldERlbHRhKHByZXZGcmFtZSk7Ci0JCQkJCXN3aXRjaCAoY3VycmVudEZyYW1lLmdldEZyYW1lVHlwZShwcmV2RnJhbWUpKSB7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuQVBQRU5EX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQlpbnQgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPSBjdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSArIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlpbnQgaW5kZXggPSBjdXJyZW50RnJhbWUuZ2V0SW5kZXhPZkRpZmZlcmVudExvY2FscyhudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxzID0gY3VycmVudEZyYW1lLmdldE51bWJlck9mTG9jYWxzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgY3VycmVudEZyYW1lLmxvY2Fscy5sZW5ndGggJiYgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPiAwOyBpKyspIHsKLQkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlyZXNpemVDb250ZW50cyg2KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLmxvY2Fsc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2Fscy0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLlNBTUVfRlJBTUUgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygxKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjUxOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLkNIT1BfRlJBTUUgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCW51bWJlck9mRGlmZmVyZW50TG9jYWxzID0gLWN1cnJlbnRGcmFtZS5udW1iZXJPZkRpZmZlcmVudExvY2FscyhwcmV2RnJhbWUpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoMjUxIC0gbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwkJCQkJCQkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNCk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhICsgNjQpOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLlNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTVNfRVhURU5ERUQgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg2KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNDc7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdID09IG51bGwpIHsKLQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXN3aXRjaChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXS5pZCgpKSB7Ci0JCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF07Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkvLyBGVUxMX0ZSQU1FCi0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA1ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDUpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI1NTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyBsZWF2ZSB0d28gc3BvdHMgZm9yIG51bWJlciBvZiBsb2NhbHMKLQkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbEVudHJpZXMgPSAwOwotCQkJCQkJCW51bWJlck9mTG9jYWxzID0gY3VycmVudEZyYW1lLmdldE51bWJlck9mTG9jYWxzKCk7Ci0JCQkJCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7Ci0JCQkJCQkJaW50IGxvY2Fsc0xlbmd0aCA9IGN1cnJlbnRGcmFtZS5sb2NhbHMgPT0gbnVsbCA/IDAgOiBjdXJyZW50RnJhbWUubG9jYWxzLmxlbmd0aDsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fsc0xlbmd0aCAmJiBudW1iZXJPZkxvY2FsRW50cmllcyA8IG51bWJlck9mTG9jYWxzOyBpKyspIHsKLQkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5sb2NhbHNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbnVtYmVyT2ZMb2NhbEVudHJpZXMrKzsKLQkJCQkJCQkJfQotCQkJCQkJCQludW1iZXJPZkVudHJpZXMrKzsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkxvY2FsT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkxvY2FsT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7Ci0JCQkJCQkJaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IGN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZlN0YWNrSXRlbXMgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mU3RhY2tJdGVtczsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhY2tJdGVtczsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW2ldOwotCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZGcmFtZXNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRnJhbWVzID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZGcmFtZXNPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRnJhbWVzOwogCi0JCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGxvY2FsQ29udGVudHNPZmZzZXQgLSBzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0IC0gNDsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwotCQkJCWF0dHJpYnV0ZU51bWJlcisrOwotCQkJfQorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKworCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVBfVEFCTEUpICE9IDApIHsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcFRhYmxlQXR0cmlidXRlKAorCQkJCQludWxsLAorCQkJCQljb2RlX2xlbmd0aCwKKwkJCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCQkJbWF4X2xvY2FscywKKwkJCQkJdHJ1ZSk7CiAJCX0KLQkJCisKKwkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQKSAhPSAwKSB7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU3RhY2tNYXBBdHRyaWJ1dGUoCisJCQkJCW51bGwsCisJCQkJCWNvZGVfbGVuZ3RoLAorCQkJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJCQltYXhfbG9jYWxzLAorCQkJCQl0cnVlKTsKKwkJfQorCiAJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKIAkJLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGNvbnRlbnRzIGFycmF5CiAJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMik7CiAJCX0KLQkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZXNOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlc051bWJlcjsKIAkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCi0JCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gdGhpcy5jb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKLQkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCX0KIAorCiAJLyoqCi0JICogCisJICoKIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JNaXNzaW5nQWJzdHJhY3RQcm9ibGVtTWV0aG9kKAotCQlNZXRob2RCaW5kaW5nIGJpbmRpbmcsCi0JCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAotCQlpbnRbXSBzdGFydExpbmVJbmRleGVzLAotCQlpbnQgcHJvYmxlbUxpbmUpIHsKKwkJCU1ldGhvZEJpbmRpbmcgYmluZGluZywKKwkJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJaW50W10gc3RhcnRMaW5lSW5kZXhlcywKKwkJCWludCBwcm9ibGVtTGluZSkgewogCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KLQkJdGhpcy5jb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07Ci0JCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCXRoaXMuY29udGVudHMgPSB0aGlzLmNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsKIAkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGxvY2FsQ29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldC8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uCi0JCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4OworCQlpbnQgbWF4X3N0YWNrID0gdGhpcy5jb2RlU3RyZWFtLnN0YWNrTWF4OwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7Ci0JCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7CisJCWludCBtYXhfbG9jYWxzID0gdGhpcy5jb2RlU3RyZWFtLm1heExvY2FsczsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7Ci0JCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWludCBjb2RlX2xlbmd0aCA9IHRoaXMuY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOwpAQCAtMzI0OSw0MDMgKzE0OTgsNTEgQEAKIAkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKIAkJLy8gZGVidWcgYXR0cmlidXRlcwogCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsgLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aAogCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUKIAkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyKTsKIAkJfQogCisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUykgIT0gMCkgewotCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDEyKTsKLQkJCX0KLQkJCS8qIENyZWF0ZSBhbmQgYWRkIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgKHVzZWQgZm9yIGRlYnVnZ2luZykgCi0JCQkgICAgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6Ci0JCQkgICAgKiAoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQotCQkJICAgICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCi0JCQkgICAgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQotCQkJICAgICovCi0JCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4OwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOwogCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKIAkJCQlwcm9ibGVtTGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihiaW5kaW5nLnNvdXJjZVN0YXJ0KCksIHN0YXJ0TGluZUluZGV4ZXMsIDAsIHN0YXJ0TGluZUluZGV4ZXMubGVuZ3RoLTEpOwogCQkJfQotCQkJLy8gZmlyc3QgZW50cnkgYXQgcGMgPSAwCi0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocHJvYmxlbUxpbmUgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcHJvYmxlbUxpbmU7Ci0JCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUKLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGUocHJvYmxlbUxpbmUpOworCQl9CisKKwkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQX1RBQkxFKSAhPSAwKSB7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZSgKKwkJCQkJYmluZGluZywKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCWZhbHNlKTsKIAkJfQogCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkgIT0gMCkgewotCQkJZmluYWwgU2V0IGZyYW1lc1Bvc2l0aW9ucyA9ICgoU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmZyYW1lUG9zaXRpb25zOwotCQkJZmluYWwgaW50IGZyYW1lc1Bvc2l0aW9uc1NpemUgPSBmcmFtZXNQb3NpdGlvbnMuc2l6ZSgpOwotCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzUG9zaXRpb25zU2l6ZSAtIDE7IC8vIC0xIGJlY2F1c2UgbGFzdCByZXR1cm4gZG9lc24ndCBjb3VudAotCQkJaWYgKG51bWJlck9mRnJhbWVzID4gMCkgewotCQkJCUFycmF5TGlzdCBmcmFtZVBvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoZnJhbWVzUG9zaXRpb25zU2l6ZSk7Ci0JCQkJZnJhbWVQb3NpdGlvbnMuYWRkQWxsKGZyYW1lc1Bvc2l0aW9ucyk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChmcmFtZVBvc2l0aW9ucyk7Ci0JCQkJLy8gYWRkIHRoZSBzdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCi0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJCX0KLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3RhY2tNYXBUYWJsZU5hbWUpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCQkKLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJLy8gZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZQotCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNDsKLQkJCQludW1iZXJPZkZyYW1lcyA9IDA7Ci0JCQkJaW50IG51bWJlck9mRnJhbWVzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7Ci0JCQkJLy8gZ2VuZXJhdGUgYWxsIGZyYW1lcwotCQkJCUFycmF5TGlzdCBmcmFtZXMgPSAoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5mcmFtZXM7Ci0JCQkJU3RhY2tNYXBGcmFtZSBjdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldCgwKTsKLQkJCQlTdGFja01hcEZyYW1lIHByZXZGcmFtZSA9IG51bGw7Ci0JCQkJaW50IGZyYW1lc1NpemUgPSBmcmFtZXMuc2l6ZSgpOwotCQkJCWludCBmcmFtZUluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyYW1lc1Bvc2l0aW9uc1NpemUgJiYgKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkgPCBjb2RlX2xlbmd0aDsgaisrKSB7Ci0JCQkJCS8vIHNlbGVjdCBuZXh0IGZyYW1lCi0JCQkJCXByZXZGcmFtZSA9IGN1cnJlbnRGcmFtZTsKLQkJCQkJY3VycmVudEZyYW1lID0gbnVsbDsKLQkJCQkJZm9yICg7IGZyYW1lSW5kZXggPCBmcmFtZXNTaXplOyBmcmFtZUluZGV4KyspIHsKLQkJCQkJCWN1cnJlbnRGcmFtZSA9IChTdGFja01hcEZyYW1lKSBmcmFtZXMuZ2V0KGZyYW1lSW5kZXgpOwotCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5wYyA9PSAoKEludGVnZXIpIGZyYW1lUG9zaXRpb25zLmdldChqKSkuaW50VmFsdWUoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50RnJhbWUgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCW51bWJlck9mRnJhbWVzKys7Ci0JCQkJCWludCBvZmZzZXREZWx0YSA9IGN1cnJlbnRGcmFtZS5nZXRPZmZzZXREZWx0YShwcmV2RnJhbWUpOwotCQkJCQlzd2l0Y2ggKGN1cnJlbnRGcmFtZS5nZXRGcmFtZVR5cGUocHJldkZyYW1lKSkgewotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLkFQUEVORF9GUkFNRSA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJaW50IG51bWJlck9mRGlmZmVyZW50TG9jYWxzID0gY3VycmVudEZyYW1lLm51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgyNTEgKyBudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IGluZGV4ID0gY3VycmVudEZyYW1lLmdldEluZGV4T2ZEaWZmZXJlbnRMb2NhbHMobnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWZvciAoaW50IGkgPSBpbmRleDsgaSA8IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoICYmIG51bWJlck9mRGlmZmVyZW50TG9jYWxzID4gMDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5sb2NhbHNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMtLTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMSk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9GUkFNRV9FWFRFTkRFRCA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI1MTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5DSE9QX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC1jdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSAtIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsJCQkJCQkJCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNUyA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSArIDY0KTsKLQkJCQkJCQlpZiAoY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0gPT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3dpdGNoKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdLmlkKCkpIHsKLQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXTsKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjQ3OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gRlVMTF9GUkFNRQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg1KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNTU7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gbGVhdmUgdHdvIHNwb3RzIGZvciBudW1iZXIgb2YgbG9jYWxzCi0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxFbnRyaWVzID0gMDsKLQkJCQkJCQludW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOwotCQkJCQkJCWludCBsb2NhbHNMZW5ndGggPSBjdXJyZW50RnJhbWUubG9jYWxzID09IG51bGwgPyAwIDogY3VycmVudEZyYW1lLmxvY2Fscy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHNMZW5ndGggJiYgbnVtYmVyT2ZMb2NhbEVudHJpZXMgPCBudW1iZXJPZkxvY2FsczsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOwotCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW51bWJlck9mTG9jYWxFbnRyaWVzKys7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJCQkJCWludCBudW1iZXJPZlN0YWNrSXRlbXMgPSBjdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZTdGFja0l0ZW1zID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZlN0YWNrSXRlbXM7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlN0YWNrSXRlbXM7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkZyYW1lcyA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkZyYW1lczsKLQotCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKLQkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJCX0KKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcEF0dHJpYnV0ZSgKKwkJCQkJYmluZGluZywKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCWZhbHNlKTsKIAkJfQotCQkKKwogCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcy8vIGVuc3VyZSBmaXJzdCB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW5zaWRlIHRoZSBsb2NhbENvbnRlbnRzIGFycmF5CiAJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMik7CiAJCX0KLQkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZXNOdW1iZXIgPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlc051bWJlcjsKIAkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCi0JCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gdGhpcy5jb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKLQkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCX0KIAogCS8qKgpAQCAtMzY2MSwyMiArMTU1OCwyMiBAQAogCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKAotCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwKLQkJTWV0aG9kQmluZGluZyBiaW5kaW5nLAotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwKLQkJaW50W10gc3RhcnRMaW5lSW5kZXhlcywKLQkJaW50IHByb2JsZW1MaW5lKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwKKwkJCU1ldGhvZEJpbmRpbmcgYmluZGluZywKKwkJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJaW50W10gc3RhcnRMaW5lSW5kZXhlcywKKwkJCWludCBwcm9ibGVtTGluZSkgewogCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KLQkJdGhpcy5jb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07Ci0JCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCXRoaXMuY29udGVudHMgPSB0aGlzLmNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsKIAkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGxvY2FsQ29udGVudHMgYnl0ZSBhcnJheSBiZWZvcmUgd2Ugc3RhcnRlZCB0byB3cml0ZS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldC8vIHRvIGdldCB0aGUgcmlnaHQgcG9zaXRpb24sIDYgZm9yIHRoZSBtYXhfc3RhY2sgZXRjLi4uCi0JCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4OworCQlpbnQgbWF4X3N0YWNrID0gdGhpcy5jb2RlU3RyZWFtLnN0YWNrTWF4OwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7Ci0JCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7CisJCWludCBtYXhfbG9jYWxzID0gdGhpcy5jb2RlU3RyZWFtLm1heExvY2FsczsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7Ci0JCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWludCBjb2RlX2xlbmd0aCA9IHRoaXMuY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOwpAQCAtMzY5MSw2MjMgKzE1ODgsNTYgQEAKIAkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKIAkJLy8gZGVidWcgYXR0cmlidXRlcwogCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsgLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aAogCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUKIAkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyKTsKIAkJfQogCisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUykgIT0gMCkgewotCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDIwKTsKLQkJCX0KLQkJCS8qIENyZWF0ZSBhbmQgYWRkIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgKHVzZWQgZm9yIGRlYnVnZ2luZykgCi0JCQkgICAgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6Ci0JCQkgICAgKiAoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQotCQkJICAgICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCi0JCQkgICAgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQotCQkJICAgICovCi0JCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4OwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOwogCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKIAkJCQlwcm9ibGVtTGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihiaW5kaW5nLnNvdXJjZVN0YXJ0KCksIHN0YXJ0TGluZUluZGV4ZXMsIDAsIHN0YXJ0TGluZUluZGV4ZXMubGVuZ3RoLTEpOwogCQkJfQotCQkJLy8gZmlyc3QgZW50cnkgYXQgcGMgPSAwCi0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocHJvYmxlbUxpbmUgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcHJvYmxlbUxpbmU7Ci0JCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUKLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGUocHJvYmxlbUxpbmUpOwogCQl9CisKIAkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMpICE9IDApIHsKLQkJCS8vIGNvbXB1dGUgdGhlIHJlc29sdmVkIHBvc2l0aW9uIGZvciB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QKLQkJCWludCBhcmdTaXplOwotCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7Ci0JCQkvLwkJY29kZUF0dHJpYnV0ZS5hZGRMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUodGhpcyk7Ci0JCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVGFibGVOYW1lKTsKLQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJfQotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7Ci0JCQlpbnQgbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsKLQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgKLQkJCWludCBkZXNjcmlwdG9ySW5kZXg7Ci0JCQlpbnQgbmFtZUluZGV4OwotCQkJU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3NCaW5kaW5nID0gbnVsbDsKLQkJCWZpbmFsIGJvb2xlYW4gbWV0aG9kRGVjbGFyYXRpb25Jc1N0YXRpYyA9IGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uaXNTdGF0aWMoKTsKLQkJCWlmICghbWV0aG9kRGVjbGFyYXRpb25Jc1N0YXRpYykgewotCQkJCW51bWJlck9mRW50cmllcysrOwotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJcmVzaXplQ29udGVudHMoMTApOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7Ci0JCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChDb25zdGFudFBvb2wuVGhpcyk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKLQkJCQlkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPSAoU291cmNlVHlwZUJpbmRpbmcpIGNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uYmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJCQlkZXNjcmlwdG9ySW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGRlY2xhcmluZ0NsYXNzQmluZGluZy5zaWduYXR1cmUoKSk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQkvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQl9Ci0JCQkvLyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBsb2NhbCB2YXJpYWJsZSB3aXRoIGEgZ2VuZXJpYyB0eXBlCi0JCQlpbnQgZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlciA9IDA7Ci0JCQlMb2NhbFZhcmlhYmxlQmluZGluZ1tdIGdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9IG51bGw7Ci0JCQlpbnQgbnVtYmVyT2ZHZW5lcmljRW50cmllcyA9IDA7Ci0JCQkKLQkJCWlmIChiaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwotCQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKSkgewotCQkJCQlOZXN0ZWRUeXBlQmluZGluZyBtZXRob2REZWNsYXJpbmdDbGFzcyA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJCWFyZ1NpemUgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdJbnN0YW5jZXNTbG90U2l6ZTsKLQkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzOwotCQkJCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IG1ldGhvZERlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpKSAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXTsKLQkJCQkJCQlmaW5hbCBUeXBlQmluZGluZyBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcgPSBsb2NhbFZhcmlhYmxlLnR5cGU7Ci0JCQkJCQkJaWYgKGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgbG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkpIHsKLQkJCQkJCQkJaWYgKGdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyB3ZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gbWF4IGxvY2FscwotCQkJCQkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW21heF07Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzW2dlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIrK10gPSBsb2NhbFZhcmlhYmxlOwotCQkJCQkJCQludW1iZXJPZkdlbmVyaWNFbnRyaWVzKys7CQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygxMCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkKLQkJCQkJCQludW1iZXJPZkVudHJpZXMrKzsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7Ci0JCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcuc2lnbmF0dXJlKCkpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7Ci0JCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXJnU2l6ZSA9IDE7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhcmdTaXplID0gYmluZGluZy5pc1N0YXRpYygpID8gMCA6IDE7Ci0JCQl9Ci0JCQkKLQkJCWludCBnZW5lcmljQXJndW1lbnRzQ291bnRlciA9IDA7Ci0JCQlpbnRbXSBnZW5lcmljQXJndW1lbnRzTmFtZUluZGV4ZXMgPSBudWxsOwotCQkJaW50W10gZ2VuZXJpY0FyZ3VtZW50c1Jlc29sdmVkUG9zaXRpb25zID0gbnVsbDsKLQkJCVR5cGVCaW5kaW5nW10gZ2VuZXJpY0FyZ3VtZW50c1R5cGVCaW5kaW5ncyA9IG51bGw7Ci0KLQkJCWlmIChtZXRob2QuYmluZGluZyAhPSBudWxsKSB7Ci0JCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmJpbmRpbmcucGFyYW1ldGVyczsKLQkJCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZC5hcmd1bWVudHM7Ci0JCQkJaWYgKChwYXJhbWV0ZXJzICE9IG51bGwpICYmIChhcmd1bWVudHMgIT0gbnVsbCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50QmluZGluZyA9IHBhcmFtZXRlcnNbaV07Ci0JCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJcmVzaXplQ29udGVudHMoMTApOwotCQkJCQkJfQotCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7Ci0JCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFyZ3VtZW50c1tpXS5uYW1lKTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKLQkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gYXJnU2l6ZTsKLQkJCQkJCWlmIChhcmd1bWVudEJpbmRpbmcuaXNQYXJhbWV0ZXJpemVkVHlwZSgpIHx8IGFyZ3VtZW50QmluZGluZy5pc1R5cGVWYXJpYWJsZSgpKSB7Ci0JCQkJCQkJaWYgKGdlbmVyaWNBcmd1bWVudHNDb3VudGVyID09IDApIHsKLQkJCQkJCQkJLy8gd2UgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG1heCBsb2NhbHMKLQkJCQkJCQkJZ2VuZXJpY0FyZ3VtZW50c05hbWVJbmRleGVzID0gbmV3IGludFttYXhdOwotCQkJCQkJCQlnZW5lcmljQXJndW1lbnRzUmVzb2x2ZWRQb3NpdGlvbnMgPSBuZXcgaW50W21heF07Ci0JCQkJCQkJCWdlbmVyaWNBcmd1bWVudHNUeXBlQmluZGluZ3MgPSBuZXcgVHlwZUJpbmRpbmdbbWF4XTsKLQkJCQkJCQl9Ci0JCQkJCQkJZ2VuZXJpY0FyZ3VtZW50c05hbWVJbmRleGVzW2dlbmVyaWNBcmd1bWVudHNDb3VudGVyXSA9IG5hbWVJbmRleDsKLQkJCQkJCQlnZW5lcmljQXJndW1lbnRzUmVzb2x2ZWRQb3NpdGlvbnNbZ2VuZXJpY0FyZ3VtZW50c0NvdW50ZXJdID0gcmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQkJCQlnZW5lcmljQXJndW1lbnRzVHlwZUJpbmRpbmdzW2dlbmVyaWNBcmd1bWVudHNDb3VudGVyKytdID0gYXJndW1lbnRCaW5kaW5nOwotCQkJCQkJfQotCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhcmd1bWVudEJpbmRpbmcuc2lnbmF0dXJlKCkpOwotCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwotCQkJCQkJaWYgKChhcmd1bWVudEJpbmRpbmcgPT0gVHlwZUJpbmRpbmcuTE9ORykKLQkJCQkJCQl8fCAoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpCi0JCQkJCQkJYXJnU2l6ZSArPSAyOwotCQkJCQkJZWxzZQotCQkJCQkJCWFyZ1NpemUrKzsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKLQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOwotCQkJdGhpcy5jb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKLQkJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7Ci0JCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQkKLQkJCWZpbmFsIGJvb2xlYW4gY3VycmVudEluc3RhbmNlSXNHZW5lcmljID0gCi0JCQkJIW1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMKLQkJCQkmJiBkZWNsYXJpbmdDbGFzc0JpbmRpbmcgIT0gbnVsbAotCQkJCSYmIGRlY2xhcmluZ0NsYXNzQmluZGluZy50eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7Ci0JCQlpZiAoZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlciAhPSAwIHx8IGdlbmVyaWNBcmd1bWVudHNDb3VudGVyICE9IDAgfHwgY3VycmVudEluc3RhbmNlSXNHZW5lcmljKSB7Ci0JCQkJLy8gYWRkIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlIGF0dHJpYnV0ZQotCQkJCW51bWJlck9mRW50cmllcyA9IG51bWJlck9mR2VuZXJpY0VudHJpZXMgKyBnZW5lcmljQXJndW1lbnRzQ291bnRlciArIChjdXJyZW50SW5zdGFuY2VJc0dlbmVyaWMgPyAxIDogMCk7Ci0JCQkJLy8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UKLQkJCQlpbnQgbWF4T2ZFbnRyaWVzID0gOCArIG51bWJlck9mRW50cmllcyAqIDEwOwotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgbWF4T2ZFbnRyaWVzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKG1heE9mRW50cmllcyk7Ci0JCQkJfQotCQkJCWludCBsb2NhbFZhcmlhYmxlVHlwZU5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVR5cGVUYWJsZU5hbWUpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9jYWxWYXJpYWJsZVR5cGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4OwotCQkJCXZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7Ci0JCQkJaWYgKGN1cnJlbnRJbnN0YW5jZUlzR2VuZXJpYykgewotCQkJCQludW1iZXJPZkVudHJpZXMrKzsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOwotCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5UaGlzKTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZGVjbGFyaW5nQ2xhc3NCaW5kaW5nLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDAKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQl9Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmljTG9jYWxWYXJpYWJsZXNDb3VudGVyOyBpKyspIHsKLQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGdlbmVyaWNMb2NhbFZhcmlhYmxlc1tpXTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOwotCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwotCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUudHlwZS5nZW5lcmljVHlwZVNpZ25hdHVyZSgpKTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7Ci0JCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyaWNBcmd1bWVudHNDb3VudGVyOyBpKyspIHsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOwotCQkJCQluYW1lSW5kZXggPSBnZW5lcmljQXJndW1lbnRzTmFtZUluZGV4ZXNbaV07Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwotCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGdlbmVyaWNBcmd1bWVudHNUeXBlQmluZGluZ3NbaV0uZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7Ci0JCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwotCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGdlbmVyaWNBcmd1bWVudHNSZXNvbHZlZFBvc2l0aW9uc1tpXTsKLQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOwotCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKLQkJCQl9CQkJCQotCQkJCWF0dHJpYnV0ZU51bWJlcisrOwotCQkJfQkJCQorCQkJZmluYWwgYm9vbGVhbiBtZXRob2REZWNsYXJhdGlvbklzU3RhdGljID0gdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCk7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlKGNvZGVfbGVuZ3RoLCBtZXRob2REZWNsYXJhdGlvbklzU3RhdGljLCBmYWxzZSk7CiAJCX0KLQkJCisKKwkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQX1RBQkxFKSAhPSAwKSB7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZSgKKwkJCQkJYmluZGluZywKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCWZhbHNlKTsKKwkJfQorCiAJCWlmICgodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkgIT0gMCkgewotCQkJZmluYWwgU2V0IGZyYW1lc1Bvc2l0aW9ucyA9ICgoU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmZyYW1lUG9zaXRpb25zOwotCQkJZmluYWwgaW50IGZyYW1lc1Bvc2l0aW9uc1NpemUgPSBmcmFtZXNQb3NpdGlvbnMuc2l6ZSgpOwotCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzUG9zaXRpb25zU2l6ZSAtIDE7IC8vIC0xIGJlY2F1c2UgbGFzdCByZXR1cm4gZG9lc24ndCBjb3VudAotCQkJaWYgKG51bWJlck9mRnJhbWVzID4gMCkgewotCQkJCUFycmF5TGlzdCBmcmFtZVBvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoZnJhbWVzUG9zaXRpb25zU2l6ZSk7Ci0JCQkJZnJhbWVQb3NpdGlvbnMuYWRkQWxsKGZyYW1lc1Bvc2l0aW9ucyk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChmcmFtZVBvc2l0aW9ucyk7Ci0JCQkJLy8gYWRkIHRoZSBzdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCi0JCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOwotCQkJCX0KLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3RhY2tNYXBUYWJsZU5hbWUpOwotCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCQkKLQkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJLy8gZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZQotCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNDsKLQkJCQludW1iZXJPZkZyYW1lcyA9IDA7Ci0JCQkJaW50IG51bWJlck9mRnJhbWVzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7Ci0JCQkJLy8gZ2VuZXJhdGUgYWxsIGZyYW1lcwotCQkJCUFycmF5TGlzdCBmcmFtZXMgPSAoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5mcmFtZXM7Ci0JCQkJU3RhY2tNYXBGcmFtZSBjdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldCgwKTsKLQkJCQlTdGFja01hcEZyYW1lIHByZXZGcmFtZSA9IG51bGw7Ci0JCQkJaW50IGZyYW1lc1NpemUgPSBmcmFtZXMuc2l6ZSgpOwotCQkJCWludCBmcmFtZUluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyYW1lc1Bvc2l0aW9uc1NpemUgJiYgKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkgPCBjb2RlX2xlbmd0aDsgaisrKSB7Ci0JCQkJCS8vIHNlbGVjdCBuZXh0IGZyYW1lCi0JCQkJCXByZXZGcmFtZSA9IGN1cnJlbnRGcmFtZTsKLQkJCQkJY3VycmVudEZyYW1lID0gbnVsbDsKLQkJCQkJZm9yICg7IGZyYW1lSW5kZXggPCBmcmFtZXNTaXplOyBmcmFtZUluZGV4KyspIHsKLQkJCQkJCWN1cnJlbnRGcmFtZSA9IChTdGFja01hcEZyYW1lKSBmcmFtZXMuZ2V0KGZyYW1lSW5kZXgpOwotCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5wYyA9PSAoKEludGVnZXIpIGZyYW1lUG9zaXRpb25zLmdldChqKSkuaW50VmFsdWUoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50RnJhbWUgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCW51bWJlck9mRnJhbWVzKys7Ci0JCQkJCWludCBvZmZzZXREZWx0YSA9IGN1cnJlbnRGcmFtZS5nZXRPZmZzZXREZWx0YShwcmV2RnJhbWUpOwotCQkJCQlzd2l0Y2ggKGN1cnJlbnRGcmFtZS5nZXRGcmFtZVR5cGUocHJldkZyYW1lKSkgewotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLkFQUEVORF9GUkFNRSA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJaW50IG51bWJlck9mRGlmZmVyZW50TG9jYWxzID0gY3VycmVudEZyYW1lLm51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgyNTEgKyBudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IGluZGV4ID0gY3VycmVudEZyYW1lLmdldEluZGV4T2ZEaWZmZXJlbnRMb2NhbHMobnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWZvciAoaW50IGkgPSBpbmRleDsgaSA8IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoICYmIG51bWJlck9mRGlmZmVyZW50TG9jYWxzID4gMDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5sb2NhbHNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMtLTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMSk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9GUkFNRV9FWFRFTkRFRCA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI1MTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5DSE9QX0ZSQU1FIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC1jdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSAtIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsJCQkJCQkJCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNUyA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSArIDY0KTsKLQkJCQkJCQlpZiAoY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0gPT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3dpdGNoKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdLmlkKCkpIHsKLQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXTsKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TX0VYVEVOREVEIDoKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjQ3OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgewotCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOwotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKLQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gRlVMTF9GUkFNRQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg1KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNTU7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gbGVhdmUgdHdvIHNwb3RzIGZvciBudW1iZXIgb2YgbG9jYWxzCi0JCQkJCQkJaW50IG51bWJlck9mTG9jYWxFbnRyaWVzID0gMDsKLQkJCQkJCQludW1iZXJPZkxvY2FscyA9IGN1cnJlbnRGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCQkJCQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOwotCQkJCQkJCWludCBsb2NhbHNMZW5ndGggPSBjdXJyZW50RnJhbWUubG9jYWxzID09IG51bGwgPyAwIDogY3VycmVudEZyYW1lLmxvY2Fscy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHNMZW5ndGggJiYgbnVtYmVyT2ZMb2NhbEVudHJpZXMgPCBudW1iZXJPZkxvY2FsczsgaSsrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7Ci0JCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOwotCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW51bWJlck9mTG9jYWxFbnRyaWVzKys7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJCQkJCWludCBudW1iZXJPZlN0YWNrSXRlbXMgPSBjdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZTdGFja0l0ZW1zID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZlN0YWNrSXRlbXM7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlN0YWNrSXRlbXM7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkZyYW1lcyA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkZyYW1lczsKLQotCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKLQkJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKLQkJCX0KKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcEF0dHJpYnV0ZSgKKwkJCQkJYmluZGluZywKKwkJCQkJY29kZV9sZW5ndGgsCisJCQkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQkJCW1heF9sb2NhbHMsCisJCQkJCWZhbHNlKTsKIAkJfQotCQkKKwogCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGxvY2FsQ29udGVudHMgYXJyYXkKIAkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyKTsKIAkJfQotCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKLQkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlc051bWJlciA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVzTnVtYmVyOwogCQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgKLQkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSB0aGlzLmNvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKIAkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CiAJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOwogCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOwotCQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CiAJfQogCiAJLyoqCkBAIC00MzI0LDU1ICsxNjU0LDU2IEBACiAJICogQHBhcmFtIGNvZGVBdHRyaWJ1dGVPZmZzZXQgPENPREU+aW50PC9DT0RFPgogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKLQkJYm9vbGVhbiBoYXNFeGNlcHRpb25IYW5kbGVycywKLQkJU3ludGhldGljTWV0aG9kQmluZGluZyBiaW5kaW5nLAotCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwKLQkJaW50W10gc3RhcnRMaW5lSW5kZXhlcykgeworCQkJYm9vbGVhbiBoYXNFeGNlcHRpb25IYW5kbGVycywKKwkJCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYmluZGluZywKKwkJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJaW50W10gc3RhcnRMaW5lSW5kZXhlcykgewogCQkvLyByZWluaXRpYWxpemUgdGhlIGNvbnRlbnRzIHdpdGggdGhlIGJ5dGUgbW9kaWZpZWQgYnkgdGhlIGNvZGUgc3RyZWFtCi0JCXRoaXMuY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOwotCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0OworCQl0aGlzLmNvbnRlbnRzID0gdGhpcy5jb2RlU3RyZWFtLmJDb2RlU3RyZWFtOworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CiAJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBjb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlCiAJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQogCQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQKIAkJLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4KLQkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOwotCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOwotCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOwotCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOwotCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsKLQkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCWludCBtYXhfc3RhY2sgPSB0aGlzLmNvZGVTdHJlYW0uc3RhY2tNYXg7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsKKwkJaW50IG1heF9sb2NhbHMgPSB0aGlzLmNvZGVTdHJlYW0ubWF4TG9jYWxzOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsKKwkJaW50IGNvZGVfbGVuZ3RoID0gdGhpcy5jb2RlU3RyZWFtLnBvc2l0aW9uOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsKKwkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTFdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAxNik7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsKIAkJaWYgKChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNDApID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cyg0MCk7CiAJCX0KLQkJCisKKwkJYm9vbGVhbiBhZGRTdGFja01hcHMgPSAodGhpcy5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRSkgIT0gMDsKIAkJaWYgKGhhc0V4Y2VwdGlvbkhhbmRsZXJzKSB7CiAJCQkvLyB3cml0ZSB0aGUgZXhjZXB0aW9uIHRhYmxlCi0JCQlFeGNlcHRpb25MYWJlbFtdIGV4Y2VwdGlvbkxhYmVscyA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uTGFiZWxzOworCQkJRXhjZXB0aW9uTGFiZWxbXSBleGNlcHRpb25MYWJlbHMgPSB0aGlzLmNvZGVTdHJlYW0uZXhjZXB0aW9uTGFiZWxzOwogCQkJaW50IGV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgPSAwOyAvLyBlYWNoIGxhYmVsIGhvbGRzIG9uZSBoYW5kbGVyIHBlciByYW5nZSAoc3RhcnQvZW5kIGNvbnRpZ3VvdXMpCi0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlleGNlcHRpb25IYW5kbGVyc0NvdW50ICs9IGNvZGVTdHJlYW0uZXhjZXB0aW9uTGFiZWxzW2ldLmNvdW50IC8gMjsgCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgKz0gdGhpcy5jb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc1tpXS5nZXRDb3VudCgpIC8gMjsKIAkJCX0KIAkJCWludCBleFNpemUgPSBleGNlcHRpb25IYW5kbGVyc0NvdW50ICogOCArIDI7CiAJCQlpZiAoZXhTaXplICsgbG9jYWxDb250ZW50c09mZnNldCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCXJlc2l6ZUNvbnRlbnRzKGV4U2l6ZSk7CiAJCQl9Ci0JCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIAorCQkJLy8gdGhlcmUgaXMgbm8gZXhjZXB0aW9uIHRhYmxlLCBzbyB3ZSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSBjdXJyZW50IG9mZnNldCBhbmQgbW92ZQogCQkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCiAJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkhhbmRsZXJzQ291bnQgPj4gOCk7CiAJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSGFuZGxlcnNDb3VudDsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjb2RlU3RyZWFtLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXI7IGkgPCBtYXg7IGkrKykgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuY29kZVN0cmVhbS5leGNlcHRpb25MYWJlbHNDb3VudGVyOyBpIDwgbWF4OyBpKyspIHsKIAkJCQlFeGNlcHRpb25MYWJlbCBleGNlcHRpb25MYWJlbCA9IGV4Y2VwdGlvbkxhYmVsc1tpXTsKIAkJCQlpZiAoZXhjZXB0aW9uTGFiZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgaVJhbmdlID0gMCwgbWF4UmFuZ2UgPSBleGNlcHRpb25MYWJlbC5jb3VudDsKKwkJCQkJaW50IGlSYW5nZSA9IDAsIG1heFJhbmdlID0gZXhjZXB0aW9uTGFiZWwuZ2V0Q291bnQoKTsKIAkJCQkJaWYgKChtYXhSYW5nZSAmIDEpICE9IDApIHsKLQkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoCi0JCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYWJvcnRfaW52YWxpZEV4Y2VwdGlvbkF0dHJpYnV0ZSwgbmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwgCi0JCQkJCQkJCQkJcmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWZlcmVuY2VDb250ZXh0KSk7CisJCQkJCQl0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoCisJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYWJvcnRfaW52YWxpZEV4Y2VwdGlvbkF0dHJpYnV0ZSwgbmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwKKwkJCQkJCQkJCQl0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmVmZXJlbmNlQ29udGV4dCkpOwogCQkJCQl9CiAJCQkJCXdoaWxlICAoaVJhbmdlIDwgbWF4UmFuZ2UpIHsKIAkJCQkJCWludCBzdGFydCA9IGV4Y2VwdGlvbkxhYmVsLnJhbmdlc1tpUmFuZ2UrK107IC8vIGV2ZW4gcmFuZ2VzIGFyZSBzdGFydCBwb3NpdGlvbnMKQEAgLTQzODIsNiArMTcxMywxMCBAQAogCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7CiAJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5kOwogCQkJCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkxhYmVsLnBvc2l0aW9uOworCQkJCQkJaWYgKGFkZFN0YWNrTWFwcykgeworCQkJCQkJCVN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtIHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtID0gKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSB0aGlzLmNvZGVTdHJlYW07CisJCQkJCQkJc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uYWRkRnJhbWVQb3NpdGlvbihoYW5kbGVyUEMpOworCQkJCQkJfQogCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7CiAJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaGFuZGxlclBDOwogCQkJCQkJaWYgKGV4Y2VwdGlvbkxhYmVsLmV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgewpAQCAtNDM5MywxNCArMTcyOCwxNCBAQAogCQkJCQkJCXN3aXRjaChleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlLmlkKSB7CiAJCQkJCQkJCWNhc2UgVF9udWxsIDoKIAkJCQkJCQkJCS8qIHJlcHJlc2VudHMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgc2VlIGNsYXNzIGxpdGVyYWwgYWNjZXNzKi8KLQkJCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lKTsKKwkJCQkJCQkJCW5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkNvbnN0YW50UG9vbE5hbWUpOwogCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCWNhc2UgVF9sb25nIDoKIAkJCQkJCQkJCS8qIHJlcHJlc2VudHMgTm9TdWNoRmllbGRFcnJvciwgc2VlIHN3aXRjaCB0YWJsZSBnZW5lcmF0aW9uKi8KLQkJCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ05vU3VjaEZpZWxkRXJyb3JDb25zdGFudFBvb2xOYW1lKTsKKwkJCQkJCQkJCW5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nTm9TdWNoRmllbGRFcnJvckNvbnN0YW50UG9vbE5hbWUpOwogCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShleGNlcHRpb25MYWJlbC5leGNlcHRpb25UeXBlKTsKKwkJCQkJCQkJCW5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoZXhjZXB0aW9uTGFiZWwuZXhjZXB0aW9uVHlwZSk7CiAJCQkJCQkJfQogCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwogCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CkBAIC00NDA5LDUzMCArMTc0NCw1OCBAQAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8vIHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiB0YWJsZSwgc28gd2UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgY3VycmVudCBvZmZzZXQgYW5kIG1vdmUgCisJCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlCiAJCQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24KLQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKIAkJfQogCQkvLyBkZWJ1ZyBhdHRyaWJ1dGVzCiAJCWludCBjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKIAkJLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aAogCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7CiAJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJcmVzaXplQ29udGVudHMoMik7CiAJCX0KIAorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKIAkJLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQogCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUykgIT0gMCkgewotCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDEyKTsKLQkJCX0JCQotCQkJaW50IGluZGV4ID0gMDsKLQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0KLQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOwotCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsKLQkJCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OwotCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxpbmVfbnVtYmVyX3RhYmxlX2xlbmd0aAotCQkJLy8gU2VlbXMgbGlrZSBkbyB3b3VsZCBiZSBiZXR0ZXIsIGJ1dCB0aGlzIHByZXNlcnZlcyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IuCi0JCQlpbmRleCA9IFV0aWwuZ2V0TGluZU51bWJlcihiaW5kaW5nLnNvdXJjZVN0YXJ0LCBzdGFydExpbmVJbmRleGVzLCAwLCBzdGFydExpbmVJbmRleGVzLmxlbmd0aC0xKTsKLQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7Ci0JCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUKLQkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDY7Ci0JCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMTsKLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJaW50IGxpbmVOdW1iZXIgPSBVdGlsLmdldExpbmVOdW1iZXIoYmluZGluZy5zb3VyY2VTdGFydCwgc3RhcnRMaW5lSW5kZXhlcywgMCwgc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGgtMSk7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZShsaW5lTnVtYmVyKTsKIAkJfQogCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKIAkJaWYgKCh0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUykgIT0gMCkgewotCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7Ci0JCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVGFibGVOYW1lKTsKLQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJcmVzaXplQ29udGVudHMoOCk7Ci0JCQl9Ci0JCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4OwotCQkJaW50IGxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7Ci0JCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbG9jYWxfdmFyaWFibGVfdGFibGVfbGVuZ3RoCi0JCQlpbnQgbmFtZUluZGV4OwotCQkJaW50IGRlc2NyaXB0b3JJbmRleDsKLQotCQkJLy8gdXNlZCB0byByZW1lbWJlciB0aGUgbG9jYWwgdmFyaWFibGUgd2l0aCBhIGdlbmVyaWMgdHlwZQotCQkJaW50IGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIgPSAwOwotCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBnZW5lcmljTG9jYWxWYXJpYWJsZXMgPSBudWxsOwotCQkJaW50IG51bWJlck9mR2VuZXJpY0VudHJpZXMgPSAwOwotCQkJCi0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gY29kZVN0cmVhbS5sb2NhbHNbaV07Ci0JCQkJZmluYWwgVHlwZUJpbmRpbmcgbG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nID0gbG9jYWxWYXJpYWJsZS50eXBlOwotCQkJCWJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkVHlwZSA9IGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgbG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCk7Ci0JCQkJaWYgKGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudCAhPSAwICYmIGlzUGFyYW1ldGVyaXplZFR5cGUpIHsKLQkJCQkJaWYgKGdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSB7Ci0JCQkJCQkvLyB3ZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gbWF4IGxvY2FscwotCQkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW21heF07Ci0JCQkJCX0KLQkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzW2dlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIrK10gPSBsb2NhbFZhcmlhYmxlOwotCQkJCX0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7Ci0JCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOwotCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07Ci0JCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7IC8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoCi0JCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsKLQkJCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAotCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmFib3J0X2ludmFsaWRBdHRyaWJ1dGUsIG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIAotCQkJCQkJCQkoQVNUTm9kZSkgbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOwotCQkJCQkJfQotCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJcmVzaXplQ29udGVudHMoMTApOwotCQkJCQkJfQotCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7Ci0JCQkJCQlpZiAoaXNQYXJhbWV0ZXJpemVkVHlwZSkgewotCQkJCQkJCW51bWJlck9mR2VuZXJpY0VudHJpZXMrKzsKLQkJCQkJCX0KLQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7Ci0JCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0UEM7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOwotCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGVuZ3RoID4+IDgpOwotCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7Ci0JCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7Ci0JCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKLQkJCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZVR5cGVCaW5kaW5nLnNpZ25hdHVyZSgpKTsKLQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKLQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwotCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247Ci0JCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOwotCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOwotCQkJY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7Ci0JCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKLQkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7Ci0JCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci0JCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKLQkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOwotCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0KLQkJCWlmIChnZW5lcmljTG9jYWxWYXJpYWJsZXNDb3VudGVyICE9IDApIHsKLQkJCQkvLyBhZGQgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGUgYXR0cmlidXRlCi0JCQkJaW50IG1heE9mRW50cmllcyA9IDggKyBudW1iZXJPZkdlbmVyaWNFbnRyaWVzICogMTA7Ci0JCQkJLy8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UKLQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIG1heE9mRW50cmllcyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyhtYXhPZkVudHJpZXMpOwotCQkJCX0KLQkJCQlpbnQgbG9jYWxWYXJpYWJsZVR5cGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUeXBlVGFibGVOYW1lKTsKLQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlVHlwZU5hbWVJbmRleCA+PiA4KTsKLQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4OwotCQkJCXZhbHVlID0gbnVtYmVyT2ZHZW5lcmljRW50cmllcyAqIDEwICsgMjsKLQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7Ci0JCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOwotCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOwotCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci0JCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZHZW5lcmljRW50cmllcyA+PiA4KTsKLQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mR2VuZXJpY0VudHJpZXM7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXI7IGkrKykgewotCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gZ2VuZXJpY0xvY2FsVmFyaWFibGVzW2ldOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7Ci0JCQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsKLQkJCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsKLQkJCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7IC8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoCi0JCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQotCQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7Ci0JCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydFBDOwotCQkJCQkJCWludCBsZW5ndGggPSBlbmRQQyAtIHN0YXJ0UEM7Ci0JCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGVuZ3RoID4+IDgpOwotCQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOwotCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS5uYW1lKTsKLQkJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7Ci0JCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7Ci0JCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwotCQkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOwotCQkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7Ci0JCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWF0dHJpYnV0ZU51bWJlcisrOwotCQkJfQorCQkJZmluYWwgYm9vbGVhbiBtZXRob2REZWNsYXJhdGlvbklzU3RhdGljID0gYmluZGluZy5pc1N0YXRpYygpOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZShjb2RlX2xlbmd0aCwgbWV0aG9kRGVjbGFyYXRpb25Jc1N0YXRpYywgdHJ1ZSk7CiAJCX0KLQkJCisJCWlmIChhZGRTdGFja01hcHMpIHsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTdGFja01hcFRhYmxlQXR0cmlidXRlKGJpbmRpbmcsIGNvZGVfbGVuZ3RoLCBjb2RlQXR0cmlidXRlT2Zmc2V0LCBtYXhfbG9jYWxzLCBmYWxzZSk7CisJCX0KKwogCQlpZiAoKHRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApICE9IDApIHsKLQkJCWZpbmFsIFNldCBmcmFtZXNQb3NpdGlvbnMgPSAoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5mcmFtZVBvc2l0aW9uczsKLQkJCWZpbmFsIGludCBmcmFtZXNQb3NpdGlvbnNTaXplID0gZnJhbWVzUG9zaXRpb25zLnNpemUoKTsKLQkJCWludCBudW1iZXJPZkZyYW1lcyA9IGZyYW1lc1Bvc2l0aW9uc1NpemUgLSAxOyAvLyAtMSBiZWNhdXNlIGxhc3QgcmV0dXJuIGRvZXNuJ3QgY291bnQKLQkJCWlmIChudW1iZXJPZkZyYW1lcyA+IDApIHsKLQkJCQlBcnJheUxpc3QgZnJhbWVQb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KGZyYW1lc1Bvc2l0aW9uc1NpemUpOwotCQkJCWZyYW1lUG9zaXRpb25zLmFkZEFsbChmcmFtZXNQb3NpdGlvbnMpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoZnJhbWVQb3NpdGlvbnMpOwotCQkJCS8vIGFkZCB0aGUgc3RhY2sgbWFwIHRhYmxlIGF0dHJpYnV0ZQotCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCQl9Ci0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN0YWNrTWFwVGFibGVOYW1lKTsKLQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkJCi0JCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwotCQkJCS8vIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGUKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDQ7Ci0JCQkJbnVtYmVyT2ZGcmFtZXMgPSAwOwotCQkJCWludCBudW1iZXJPZkZyYW1lc09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7Ci0JCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOwotCQkJCS8vIGdlbmVyYXRlIGFsbCBmcmFtZXMKLQkJCQlBcnJheUxpc3QgZnJhbWVzID0gKChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZnJhbWVzOwotCQkJCVN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lID0gKFN0YWNrTWFwRnJhbWUpIGZyYW1lcy5nZXQoMCk7Ci0JCQkJU3RhY2tNYXBGcmFtZSBwcmV2RnJhbWUgPSBudWxsOwotCQkJCWludCBmcmFtZXNTaXplID0gZnJhbWVzLnNpemUoKTsKLQkJCQlpbnQgZnJhbWVJbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcmFtZXNQb3NpdGlvbnNTaXplICYmICgoSW50ZWdlcikgZnJhbWVQb3NpdGlvbnMuZ2V0KGopKS5pbnRWYWx1ZSgpIDwgY29kZV9sZW5ndGg7IGorKykgewotCQkJCQkvLyBzZWxlY3QgbmV4dCBmcmFtZQotCQkJCQlwcmV2RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0JCQkJCWN1cnJlbnRGcmFtZSA9IG51bGw7Ci0JCQkJCWZvciAoOyBmcmFtZUluZGV4IDwgZnJhbWVzU2l6ZTsgZnJhbWVJbmRleCsrKSB7Ci0JCQkJCQljdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldChmcmFtZUluZGV4KTsKLQkJCQkJCWlmIChjdXJyZW50RnJhbWUucGMgPT0gKChJbnRlZ2VyKSBmcmFtZVBvc2l0aW9ucy5nZXQoaikpLmludFZhbHVlKCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEZyYW1lID09IG51bGwpIGJyZWFrOwotCQkJCQludW1iZXJPZkZyYW1lcysrOwotCQkJCQlpbnQgb2Zmc2V0RGVsdGEgPSBjdXJyZW50RnJhbWUuZ2V0T2Zmc2V0RGVsdGEocHJldkZyYW1lKTsKLQkJCQkJc3dpdGNoIChjdXJyZW50RnJhbWUuZ2V0RnJhbWVUeXBlKHByZXZGcmFtZSkpIHsKLQkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5BUFBFTkRfRlJBTUUgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCWludCBudW1iZXJPZkRpZmZlcmVudExvY2FscyA9IGN1cnJlbnRGcmFtZS5udW1iZXJPZkRpZmZlcmVudExvY2FscyhwcmV2RnJhbWUpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoMjUxICsgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWludCBpbmRleCA9IGN1cnJlbnRGcmFtZS5nZXRJbmRleE9mRGlmZmVyZW50TG9jYWxzKG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbHMgPSBjdXJyZW50RnJhbWUuZ2V0TnVtYmVyT2ZMb2NhbHMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCBjdXJyZW50RnJhbWUubG9jYWxzLmxlbmd0aCAmJiBudW1iZXJPZkRpZmZlcmVudExvY2FscyA+IDA7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOwotCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7Ci0JCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQkJY2FzZSBUX2ludCA6Ci0JCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKLQkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW51bWJlck9mRGlmZmVyZW50TG9jYWxzLS07Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9GUkFNRSA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDEpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLlNBTUVfRlJBTUVfRVhURU5ERUQgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNTE7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuQ0hPUF9GUkFNRSA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPSAtY3VycmVudEZyYW1lLm51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgyNTEgLSBudW1iZXJPZkRpZmZlcmVudExvY2Fscyk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7CQkJCQkJCQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTdGFja01hcEZyYW1lLlNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTVMgOgotCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgKyA2NCk7Ci0JCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdID09IG51bGwpIHsKLQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXN3aXRjaChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXS5pZCgpKSB7Ci0JCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF07Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOwotCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgotCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNU19FWFRFTkRFRCA6Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI0NzsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKLQkJCQkJCQlpZiAoY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0gPT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc3dpdGNoKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdLmlkKCkpIHsKLQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKLQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBUX251bGwgOgotCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXTsKLQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7Ci0JCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7Ci0JCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCS8vIEZVTExfRlJBTUUKLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDUgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNSk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjU1OwotCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7Ci0JCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FsT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKLQkJCQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGxlYXZlIHR3byBzcG90cyBmb3IgbnVtYmVyIG9mIGxvY2FscwotCQkJCQkJCWludCBudW1iZXJPZkxvY2FsRW50cmllcyA9IDA7Ci0JCQkJCQkJbnVtYmVyT2ZMb2NhbHMgPSBjdXJyZW50RnJhbWUuZ2V0TnVtYmVyT2ZMb2NhbHMoKTsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKLQkJCQkJCQlpbnQgbG9jYWxzTGVuZ3RoID0gY3VycmVudEZyYW1lLmxvY2FscyA9PSBudWxsID8gMCA6IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxzTGVuZ3RoICYmIG51bWJlck9mTG9jYWxFbnRyaWVzIDwgbnVtYmVyT2ZMb2NhbHM7IGkrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOwotCQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLmxvY2Fsc1tpXTsKLQkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgewotCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6Ci0JCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgotCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbG9uZyA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7Ci0JCQkJCQkJCQkJCWkrKzsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKLQkJCQkJCQkJCQkJaSsrOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQludW1iZXJPZkxvY2FsRW50cmllcysrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW51bWJlck9mRW50cmllcysrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJcmVzaXplQ29udGVudHMoNCk7Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mTG9jYWxPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mTG9jYWxPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsKLQkJCQkJCQlpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mU3RhY2tJdGVtcyA+PiA4KTsKLQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZTdGFja0l0ZW1zOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGFja0l0ZW1zOyBpKyspIHsKLQkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbaV07Ci0JCQkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKLQkJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQkJCQkJCWNhc2UgVF9jaGFyIDoKLQkJCQkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOwotCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQljYXNlIFRfbnVsbCA6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKLQkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgewotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgotCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OwotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6Ci0JCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKLQkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkZyYW1lc09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZGcmFtZXMgPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkZyYW1lc09mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZGcmFtZXM7Ci0KLQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OwotCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKLQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7Ci0JCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVMZW5ndGg7Ci0JCQkJYXR0cmlidXRlTnVtYmVyKys7Ci0JCQl9CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU3RhY2tNYXBBdHRyaWJ1dGUoCisJCQkJCWJpbmRpbmcsCisJCQkJCWNvZGVfbGVuZ3RoLAorCQkJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJCQltYXhfbG9jYWxzLAorCQkJCQlmYWxzZSk7CiAJCX0KLQkJCisKIAkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcwogCQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKIAkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyKTsKIAkJfQotCQljb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVzTnVtYmVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZXNOdW1iZXI7CiAKIAkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCi0JCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAyXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7Ci0JCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDVdID0gKGJ5dGUpIGNvZGVBdHRyaWJ1dGVMZW5ndGg7Ci0JCWNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSB0aGlzLmNvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKKwkJdGhpcy5jb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CisJCXRoaXMuY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOwogCX0KIAogCS8qKgpAQCAtNDk0OSwxMCArMTgxMiwxMCBAQAogCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNNZXRob2QoCi0JCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYmluZGluZywKLQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsCi0JCWludFtdIHN0YXJ0TGluZUluZGV4ZXMpIHsKLQkJCisJCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nIGJpbmRpbmcsCisJCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCWludFtdIHN0YXJ0TGluZUluZGV4ZXMpIHsKKwogCQl0aGlzLmNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY01ldGhvZCgKIAkJCQlmYWxzZSwKIAkJCQliaW5kaW5nLApAQCAtNDk2NSwxNiArMTgyOCwxNiBAQAogCSAqIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBpbmZvIGJ5IHNldHRpbmcgdXAgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGF0IHRoZSByaWdodCBvZmZzZXQuCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KLQkgKiBAcGFyYW0gYXR0cmlidXRlTnVtYmVyIDxDT0RFPmludDwvQ09ERT4gCisJICogQHBhcmFtIGF0dHJpYnV0ZXNOdW1iZXIgPENPREU+aW50PC9DT0RFPgogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWV0aG9kSW5mbygKLQkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwKLQkJaW50IGF0dHJpYnV0ZU51bWJlcikgeworCQkJTWV0aG9kQmluZGluZyBiaW5kaW5nLAorCQkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwKKwkJCWludCBhdHRyaWJ1dGVzTnVtYmVyKSB7CiAJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKLQkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7Ci0JCWNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQl0aGlzLmNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlc051bWJlciA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZXNOdW1iZXI7CiAJfQotCQogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogVGhpcyBtZXRob2RzIHJldHVybnMgYSBjaGFyW10gcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlY2VpdmVyCkBAIC00OTgyLDcxICsxODQ1LDEwNyBAQAogCSAqIEByZXR1cm4gY2hhcltdCiAJICovCiAJcHVibGljIGNoYXJbXSBmaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGNvbnN0YW50UG9vbC5VVEY4Q2FjaGUucmV0dXJuS2V5Rm9yKDIpOworCQlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2wuVVRGOENhY2hlLnJldHVybktleUZvcigyKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbiwgaW50IGF0dHJpYnV0ZU9mZnNldCkgewotCQlpZiAoY29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24sIGludCBjdXJyZW50T2Zmc2V0KSB7CisJCWludCBzdGFydGluZ0NvbnRlbnRzT2Zmc2V0ID0gY3VycmVudE9mZnNldDsKKwkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cyg0KTsKIAkJfQogCQlUeXBlQmluZGluZyBhbm5vdGF0aW9uVHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVkVHlwZTsKIAkJaWYgKGFubm90YXRpb25UeXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OworCQkJdGhpcy5jb250ZW50c09mZnNldCA9IHN0YXJ0aW5nQ29udGVudHNPZmZzZXQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJZmluYWwgaW50IHR5cGVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoYW5ub3RhdGlvblR5cGVCaW5kaW5nLnNpZ25hdHVyZSgpKTsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHR5cGVJbmRleCA+PiA4KTsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdHlwZUluZGV4OworCQlmaW5hbCBpbnQgdHlwZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFubm90YXRpb25UeXBlQmluZGluZy5zaWduYXR1cmUoKSk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodHlwZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdHlwZUluZGV4OwogCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKIAkJCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwogCQkJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IG5vcm1hbEFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlyczsKIAkJCWlmIChtZW1iZXJWYWx1ZVBhaXJzICE9IG51bGwpIHsKIAkJCQlmaW5hbCBpbnQgbWVtYmVyVmFsdWVQYWlyc0xlbmd0aCA9IG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChtZW1iZXJWYWx1ZVBhaXJzTGVuZ3RoID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG1lbWJlclZhbHVlUGFpcnNMZW5ndGg7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChtZW1iZXJWYWx1ZVBhaXJzTGVuZ3RoID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBtZW1iZXJWYWx1ZVBhaXJzTGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVmFsdWVQYWlyc0xlbmd0aDsgaSsrKSB7CiAJCQkJCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBtZW1iZXJWYWx1ZVBhaXJzW2ldOwotCQkJCQlpZiAoY29udGVudHNPZmZzZXQgKyAyID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCQkJcmVzaXplQ29udGVudHMoMik7CiAJCQkJCX0KLQkJCQkJZmluYWwgaW50IGVsZW1lbnROYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KG1lbWJlclZhbHVlUGFpci5uYW1lKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVsZW1lbnROYW1lSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVsZW1lbnROYW1lSW5kZXg7CisJCQkJCWZpbmFsIGludCBlbGVtZW50TmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KG1lbWJlclZhbHVlUGFpci5uYW1lKTsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbGVtZW50TmFtZUluZGV4ID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZWxlbWVudE5hbWVJbmRleDsKIAkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWVtYmVyVmFsdWVQYWlyLmJpbmRpbmc7CiAJCQkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKLQkJCQkJCWNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OworCQkJCQkJdGhpcy5jb250ZW50c09mZnNldCA9IHN0YXJ0aW5nQ29udGVudHNPZmZzZXQ7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlnZW5lcmF0ZUVsZW1lbnRWYWx1ZShtZW1iZXJWYWx1ZVBhaXIudmFsdWUsIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwgYXR0cmlidXRlT2Zmc2V0KTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJZ2VuZXJhdGVFbGVtZW50VmFsdWUobWVtYmVyVmFsdWVQYWlyLnZhbHVlLCBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUsIHN0YXJ0aW5nQ29udGVudHNPZmZzZXQpOworCQkJCQkJfSBjYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworCQkJCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBzdGFydGluZ0NvbnRlbnRzT2Zmc2V0OworCQkJCQkJfSBjYXRjaChTaG91bGROb3RJbXBsZW1lbnQgZSkgeworCQkJCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBzdGFydGluZ0NvbnRlbnRzT2Zmc2V0OworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsKIAkJCX0KIAkJfSBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgewogCQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247CiAJCQkvLyB0aGlzIGlzIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIChvbmUgbWVtYmVyIHZhbHVlKQotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAxOwotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IDE7CisJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCQlyZXNpemVDb250ZW50cygyKTsKIAkJCX0KLQkJCWZpbmFsIGludCBlbGVtZW50TmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChWQUxVRSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZWxlbWVudE5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVsZW1lbnROYW1lSW5kZXg7CisJCQlmaW5hbCBpbnQgZWxlbWVudE5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChWQUxVRSk7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVsZW1lbnROYW1lSW5kZXggPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZWxlbWVudE5hbWVJbmRleDsKIAkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHNpbmdsZU1lbWJlckFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycygpWzBdLmJpbmRpbmc7CiAJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJY29udGVudHNPZmZzZXQgPSBhdHRyaWJ1dGVPZmZzZXQ7CisJCQkJdGhpcy5jb250ZW50c09mZnNldCA9IHN0YXJ0aW5nQ29udGVudHNPZmZzZXQ7CiAJCQl9IGVsc2UgewotCQkJCWdlbmVyYXRlRWxlbWVudFZhbHVlKHNpbmdsZU1lbWJlckFubm90YXRpb24ubWVtYmVyVmFsdWUsIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwgYXR0cmlidXRlT2Zmc2V0KTsKKwkJCQl0cnkgeworCQkJCQlnZW5lcmF0ZUVsZW1lbnRWYWx1ZShzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLm1lbWJlclZhbHVlLCBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUsIHN0YXJ0aW5nQ29udGVudHNPZmZzZXQpOworCQkJCX0gY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhpcy5jb250ZW50c09mZnNldCA9IHN0YXJ0aW5nQ29udGVudHNPZmZzZXQ7CisJCQkJfSBjYXRjaChTaG91bGROb3RJbXBsZW1lbnQgZSkgeworCQkJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gc3RhcnRpbmdDb250ZW50c09mZnNldDsKKwkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvLyB0aGlzIGlzIGEgbWFya2VyIGFubm90YXRpb24gKG5vIG1lbWJlciB2YWx1ZSBwYWlycykKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAwOwogCQl9CiAJfQogCisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZShBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBhdHRyaWJ1dGVPZmZzZXQpIHsKKwkJaW50IGF0dHJpYnV0ZXNOdW1iZXIgPSAwOworCQkvLyBhZGQgYW4gYW5ub3RhdGlvbiBkZWZhdWx0IGF0dHJpYnV0ZQorCQlpbnQgYW5ub3RhdGlvbkRlZmF1bHROYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkFubm90YXRpb25EZWZhdWx0TmFtZSk7CisJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMoNik7CisJCX0KKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhbm5vdGF0aW9uRGVmYXVsdE5hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFubm90YXRpb25EZWZhdWx0TmFtZUluZGV4OworCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSA0OworCQlnZW5lcmF0ZUVsZW1lbnRWYWx1ZShkZWNsYXJhdGlvbi5kZWZhdWx0VmFsdWUsIGRlY2xhcmF0aW9uLmJpbmRpbmcucmV0dXJuVHlwZSwgYXR0cmlidXRlT2Zmc2V0KTsKKwkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgIT0gYXR0cmlidXRlT2Zmc2V0KSB7CisJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gdGhpcy5jb250ZW50c09mZnNldCAtIGF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7CisJCQl0aGlzLmNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKKwkJfQorCQlyZXR1cm4gYXR0cmlidXRlc051bWJlcjsKKwl9CiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGhlYWRlciBvZiBhIGNvZGUgYXR0cmlidXRlLgpAQCAtNTA1NCwxNyArMTk1MywxMTUgQEAKIAkgKiAtIGxlYXZlIHNvbWUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGgoNCksIG1heF9zdGFjaygyKSwgbWF4X2xvY2FscygyKSwgY29kZV9sZW5ndGgoNCkuCiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCkgewotCQlpZiAoY29udGVudHNPZmZzZXQgKyAyMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygyMCk7CiAJCX0KIAkJaW50IGNvbnN0YW50VmFsdWVOYW1lSW5kZXggPQotCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db2RlTmFtZSk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb25zdGFudFZhbHVlTmFtZUluZGV4OworCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNvZGVOYW1lKTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29uc3RhbnRWYWx1ZU5hbWVJbmRleDsKIAkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGgoNCksIG1heF9zdGFjaygyKSwgbWF4X2xvY2FscygyKSwgY29kZV9sZW5ndGgoNCkKLQkJY29udGVudHNPZmZzZXQgKz0gMTI7CisJCXRoaXMuY29udGVudHNPZmZzZXQgKz0gMTI7CiAJfQotCisJCisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVDb25zdGFudFZhbHVlQXR0cmlidXRlKENvbnN0YW50IGZpZWxkQ29uc3RhbnQsIEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsIGludCBmaWVsZEF0dHJpYnV0ZU9mZnNldCkgeworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMTsKKwkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQlyZXNpemVDb250ZW50cyg4KTsKKwkJfQorCQkvLyBOb3cgd2UgZ2VuZXJhdGUgdGhlIGNvbnN0YW50IGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZEJpbmRpbmcKKwkJaW50IGNvbnN0YW50VmFsdWVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNvbnN0YW50VmFsdWVOYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29uc3RhbnRWYWx1ZU5hbWVJbmRleDsKKwkJLy8gVGhlIGF0dHJpYnV0ZSBsZW5ndGggPSAyIGluIGNhc2Ugb2YgYSBjb25zdGFudFZhbHVlIGF0dHJpYnV0ZQorCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAyOworCQkvLyBOZWVkIHRvIGFkZCB0aGUgY29uc3RhbnRfdmFsdWVfaW5kZXgKKwkJc3dpdGNoIChmaWVsZENvbnN0YW50LnR5cGVJRCgpKSB7CisJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJaW50IGJvb2xlYW5WYWx1ZUluZGV4ID0KKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPyAxIDogMCk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChib29sZWFuVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYm9vbGVhblZhbHVlSW5kZXg7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQljYXNlIFRfY2hhciA6CisJCQljYXNlIFRfaW50IDoKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJaW50IGludGVnZXJWYWx1ZUluZGV4ID0KKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQ29uc3RhbnQuaW50VmFsdWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZWdlclZhbHVlSW5kZXg7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCWludCBmbG9hdFZhbHVlSW5kZXggPQorCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRDb25zdGFudC5mbG9hdFZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmxvYXRWYWx1ZUluZGV4ID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmbG9hdFZhbHVlSW5kZXg7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlpbnQgZG91YmxlVmFsdWVJbmRleCA9CisJCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZENvbnN0YW50LmRvdWJsZVZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZG91YmxlVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZG91YmxlVmFsdWVJbmRleDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlpbnQgbG9uZ1ZhbHVlSW5kZXggPQorCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRDb25zdGFudC5sb25nVmFsdWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb25nVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9uZ1ZhbHVlSW5kZXg7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQkJCWludCBzdHJpbmdWYWx1ZUluZGV4ID0KKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KAorCQkJCQkJKChTdHJpbmdDb25zdGFudCkgZmllbGRDb25zdGFudCkuc3RyaW5nVmFsdWUoKSk7CisJCQkJaWYgKHN0cmluZ1ZhbHVlSW5kZXggPT0gLTEpIHsKKwkJCQkJaWYgKCF0aGlzLmNyZWF0aW5nUHJvYmxlbVR5cGUpIHsKKwkJCQkJCS8vIHJlcG9ydCBhbiBlcnJvciBhbmQgYWJvcnQ6IHdpbGwgbGVhZCB0byBhIHByb2JsZW0gdHlwZSBjbGFzc2ZpbGUgY3JlYXRpb24KKwkJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJCQkJCWludCBtYXggPSBmaWVsZERlY2xzID09IG51bGwgPyAwIDogZmllbGREZWNscy5sZW5ndGg7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJaWYgKGZpZWxkRGVjbHNbaV0uYmluZGluZyA9PSBmaWVsZEJpbmRpbmcpIHsKKwkJCQkJCQkJLy8gcHJvYmxlbSBzaG91bGQgYWJvcnQKKwkJCQkJCQkJdHlwZURlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0cmluZ0NvbnN0YW50SXNFeGNlZWRpbmdVdGY4TGltaXQoCisJCQkJCQkJCQlmaWVsZERlY2xzW2ldKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBhbHJlYWR5IGluc2lkZSBhIHByb2JsZW0gdHlwZSBjcmVhdGlvbiA6IG5vIGNvbnN0YW50IGZvciB0aGlzIGZpZWxkCisJCQkJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gZmllbGRBdHRyaWJ1dGVPZmZzZXQ7CisJCQkJCQlhdHRyaWJ1dGVzTnVtYmVyID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RyaW5nVmFsdWVJbmRleCA+PiA4KTsKKwkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0cmluZ1ZhbHVlSW5kZXg7CisJCQkJfQorCQl9CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gYXR0cmlidXRlc051bWJlcjsKKwl9CisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVEZXByZWNhdGVkQXR0cmlidXRlKCkgeworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMoNik7CisJCX0KKwkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkRlcHJlY2F0ZWROYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleDsKKwkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gMTsKKwl9CiAJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRWxlbWVudFZhbHVlKAogCQkJRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUsCiAJCQlUeXBlQmluZGluZyBtZW1iZXJWYWx1ZVBhaXJSZXR1cm5UeXBlLApAQCAtNTA3MiwxNiArMjA2OSwxNiBAQAogCQlDb25zdGFudCBjb25zdGFudCA9IGRlZmF1bHRWYWx1ZS5jb25zdGFudDsKIAkJVHlwZUJpbmRpbmcgZGVmYXVsdFZhbHVlQmluZGluZyA9IGRlZmF1bHRWYWx1ZS5yZXNvbHZlZFR5cGU7CiAJCWlmIChkZWZhdWx0VmFsdWVCaW5kaW5nID09IG51bGwpIHsKLQkJCWNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OworCQkJdGhpcy5jb250ZW50c09mZnNldCA9IGF0dHJpYnV0ZU9mZnNldDsKIAkJfSBlbHNlIHsKIAkJCWlmIChtZW1iZXJWYWx1ZVBhaXJSZXR1cm5UeXBlLmlzQXJyYXlUeXBlKCkgJiYgIWRlZmF1bHRWYWx1ZUJpbmRpbmcuaXNBcnJheVR5cGUoKSkgewogCQkJCS8vIGF1dG9tYXRpYyB3cmFwcGluZwotCQkJCWlmIChjb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJcmVzaXplQ29udGVudHMoMyk7CiAJCQkJfQotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdbJzsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAwOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDE7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdbJzsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMTsKIAkJCX0KIAkJCWlmIChjb25zdGFudCAhPSBudWxsICYmIGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJCWdlbmVyYXRlRWxlbWVudFZhbHVlKGF0dHJpYnV0ZU9mZnNldCwgZGVmYXVsdFZhbHVlLCBjb25zdGFudCwgbWVtYmVyVmFsdWVQYWlyUmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKQEAgLTUwOTAsOTggKzIwODcsOTcgQEAKIAkJCX0KIAkJfQogCX0KLQogCS8qKgogCSAqIEBwYXJhbSBhdHRyaWJ1dGVPZmZzZXQKIAkgKi8KIAlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbGVtZW50VmFsdWUoaW50IGF0dHJpYnV0ZU9mZnNldCwgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUsIENvbnN0YW50IGNvbnN0YW50LCBUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChjb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygzKTsKIAkJfQogCQlzd2l0Y2ggKGJpbmRpbmcuaWQpIHsKIAkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnWic7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdaJzsKIAkJCQlpbnQgYm9vbGVhblZhbHVlSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID8gMSA6IDApOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChib29sZWFuVmFsdWVJbmRleCA+PiA4KTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBib29sZWFuVmFsdWVJbmRleDsKKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID8gMSA6IDApOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYm9vbGVhblZhbHVlSW5kZXggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGJvb2xlYW5WYWx1ZUluZGV4OwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdCJzsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ0InOwogCQkJCWludCBpbnRlZ2VyVmFsdWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQuaW50VmFsdWUoKSk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGludGVnZXJWYWx1ZUluZGV4ID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4OworCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQuaW50VmFsdWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZWdlclZhbHVlSW5kZXg7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRfY2hhciA6Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ0MnOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnQyc7CiAJCQkJaW50ZWdlclZhbHVlSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmludFZhbHVlKCkpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlZ2VyVmFsdWVJbmRleDsKKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmludFZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZWdlclZhbHVlSW5kZXggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4OwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ0knOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnSSc7CiAJCQkJaW50ZWdlclZhbHVlSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmludFZhbHVlKCkpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlZ2VyVmFsdWVJbmRleDsKKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmludFZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZWdlclZhbHVlSW5kZXggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4OwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnUyc7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdTJzsKIAkJCQlpbnRlZ2VyVmFsdWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQuaW50VmFsdWUoKSk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGludGVnZXJWYWx1ZUluZGV4ID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVnZXJWYWx1ZUluZGV4OworCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQuaW50VmFsdWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZWdlclZhbHVlSW5kZXg7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdGJzsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ0YnOwogCQkJCWludCBmbG9hdFZhbHVlSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmZsb2F0VmFsdWUoKSk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZsb2F0VmFsdWVJbmRleCA+PiA4KTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmbG9hdFZhbHVlSW5kZXg7CisJCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudC5mbG9hdFZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZmxvYXRWYWx1ZUluZGV4ID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmbG9hdFZhbHVlSW5kZXg7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRfZG91YmxlIDoKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnRCc7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdEJzsKIAkJCQlpbnQgZG91YmxlVmFsdWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQuZG91YmxlVmFsdWUoKSk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRvdWJsZVZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZG91YmxlVmFsdWVJbmRleDsKKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmRvdWJsZVZhbHVlKCkpOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZG91YmxlVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZG91YmxlVmFsdWVJbmRleDsKIAkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnSic7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdKJzsKIAkJCQlpbnQgbG9uZ1ZhbHVlSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50LmxvbmdWYWx1ZSgpKTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9uZ1ZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9uZ1ZhbHVlSW5kZXg7CisJCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudC5sb25nVmFsdWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb25nVmFsdWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9uZ1ZhbHVlSW5kZXg7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdzJzsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ3MnOwogCQkJCWludCBzdHJpbmdWYWx1ZUluZGV4ID0KLQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgoKFN0cmluZ0NvbnN0YW50KSBjb25zdGFudCkuc3RyaW5nVmFsdWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KCgoU3RyaW5nQ29uc3RhbnQpIGNvbnN0YW50KS5zdHJpbmdWYWx1ZSgpLnRvQ2hhckFycmF5KCkpOwogCQkJCWlmIChzdHJpbmdWYWx1ZUluZGV4ID09IC0xKSB7Ci0JCQkJCWlmICghY3JlYXRpbmdQcm9ibGVtVHlwZSkgeworCQkJCQlpZiAoIXRoaXMuY3JlYXRpbmdQcm9ibGVtVHlwZSkgewogCQkJCQkJLy8gcmVwb3J0IGFuIGVycm9yIGFuZCBhYm9ydDogd2lsbCBsZWFkIHRvIGEgcHJvYmxlbSB0eXBlIGNsYXNzZmlsZSBjcmVhdGlvbgotCQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKIAkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdHJpbmdDb25zdGFudElzRXhjZWVkaW5nVXRmOExpbWl0KGRlZmF1bHRWYWx1ZSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQkvLyBhbHJlYWR5IGluc2lkZSBhIHByb2JsZW0gdHlwZSBjcmVhdGlvbiA6IG5vIGF0dHJpYnV0ZQotCQkJCQkJY29udGVudHNPZmZzZXQgPSBhdHRyaWJ1dGVPZmZzZXQ7CisJCQkJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ1ZhbHVlSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0cmluZ1ZhbHVlSW5kZXg7CisJCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RyaW5nVmFsdWVJbmRleCA+PiA4KTsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0cmluZ1ZhbHVlSW5kZXg7CiAJCQkJfQogCQl9CiAJfQotCisJCiAJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRWxlbWVudFZhbHVlRm9yTm9uQ29uc3RhbnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlLCBpbnQgYXR0cmlidXRlT2Zmc2V0LCBUeXBlQmluZGluZyBkZWZhdWx0VmFsdWVCaW5kaW5nKSB7CiAJCWlmIChkZWZhdWx0VmFsdWVCaW5kaW5nICE9IG51bGwpIHsKIAkJCWlmIChkZWZhdWx0VmFsdWVCaW5kaW5nLmlzRW51bSgpKSB7Ci0JCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCQlyZXNpemVDb250ZW50cyg1KTsKIAkJCQl9Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ2UnOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnZSc7CiAJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IG51bGw7CiAJCQkJaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKIAkJCQkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBuYW1lUmVmZXJlbmNlID0gKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIGRlZmF1bHRWYWx1ZTsKQEAgLTUxOTAsODcgKzIxODYsNDQ2IEBACiAJCQkJCVNpbmdsZU5hbWVSZWZlcmVuY2UgbmFtZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBkZWZhdWx0VmFsdWU7CiAJCQkJCWZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIG5hbWVSZWZlcmVuY2UuYmluZGluZzsKIAkJCQl9IGVsc2UgewotCQkJCQljb250ZW50c09mZnNldCA9IGF0dHJpYnV0ZU9mZnNldDsKKwkJCQkJdGhpcy5jb250ZW50c09mZnNldCA9IGF0dHJpYnV0ZU9mZnNldDsKIAkJCQl9CiAJCQkJaWYgKGZpZWxkQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIGludCBlbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcudHlwZS5zaWduYXR1cmUoKSk7Ci0JCQkJCWZpbmFsIGludCBlbnVtQ29uc3RhbnROYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5uYW1lKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVudW1Db25zdGFudFR5cGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVudW1Db25zdGFudFR5cGVOYW1lSW5kZXg7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbnVtQ29uc3RhbnROYW1lSW5kZXggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVudW1Db25zdGFudE5hbWVJbmRleDsKKwkJCQkJZmluYWwgaW50IGVudW1Db25zdGFudFR5cGVOYW1lSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nLnR5cGUuc2lnbmF0dXJlKCkpOworCQkJCQlmaW5hbCBpbnQgZW51bUNvbnN0YW50TmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5uYW1lKTsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4ID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW51bUNvbnN0YW50VHlwZU5hbWVJbmRleDsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbnVtQ29uc3RhbnROYW1lSW5kZXggPj4gOCk7CisJCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbnVtQ29uc3RhbnROYW1lSW5kZXg7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChkZWZhdWx0VmFsdWVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkgewotCQkJCWlmIChjb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJcmVzaXplQ29udGVudHMoMSk7CiAJCQkJfQotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICdAJzsKKwkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ0AnOwogCQkJCWdlbmVyYXRlQW5ub3RhdGlvbigoQW5ub3RhdGlvbikgZGVmYXVsdFZhbHVlLCBhdHRyaWJ1dGVPZmZzZXQpOwogCQkJfSBlbHNlIGlmIChkZWZhdWx0VmFsdWVCaW5kaW5nLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQkvLyBhcnJheSB0eXBlCi0JCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCQlyZXNpemVDb250ZW50cygzKTsKIAkJCQl9Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ1snOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnWyc7CiAJCQkJaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKIAkJCQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gKEFycmF5SW5pdGlhbGl6ZXIpIGRlZmF1bHRWYWx1ZTsKIAkJCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucyAhPSBudWxsID8gYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucy5sZW5ndGggOiAwOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXJyYXlMZW5ndGggPj4gOCk7Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFycmF5TGVuZ3RoOworCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFycmF5TGVuZ3RoID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXJyYXlMZW5ndGg7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewogCQkJCQkJZ2VuZXJhdGVFbGVtZW50VmFsdWUoYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9uc1tpXSwgZGVmYXVsdFZhbHVlQmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSgpLCBhdHRyaWJ1dGVPZmZzZXQpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJY29udGVudHNPZmZzZXQgPSBhdHRyaWJ1dGVPZmZzZXQ7CisJCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBhdHRyaWJ1dGVPZmZzZXQ7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvLyBjbGFzcyB0eXBlCi0JCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCQlyZXNpemVDb250ZW50cygzKTsKIAkJCQl9Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgJ2MnOworCQkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAnYyc7CiAJCQkJaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIENsYXNzTGl0ZXJhbEFjY2VzcykgewogCQkJCQlDbGFzc0xpdGVyYWxBY2Nlc3MgY2xhc3NMaXRlcmFsQWNjZXNzID0gKENsYXNzTGl0ZXJhbEFjY2VzcykgZGVmYXVsdFZhbHVlOwotCQkJCQlmaW5hbCBpbnQgY2xhc3NJbmZvSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNsYXNzTGl0ZXJhbEFjY2Vzcy50YXJnZXRUeXBlLnNpZ25hdHVyZSgpKTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNsYXNzSW5mb0luZGV4ID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjbGFzc0luZm9JbmRleDsKKwkJCQkJZmluYWwgaW50IGNsYXNzSW5mb0luZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNsYXNzTGl0ZXJhbEFjY2Vzcy50YXJnZXRUeXBlLnNpZ25hdHVyZSgpKTsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc0luZm9JbmRleCA+PiA4KTsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzSW5mb0luZGV4OwogCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OworCQkJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWNvbnRlbnRzT2Zmc2V0ID0gYXR0cmlidXRlT2Zmc2V0OworCQkJdGhpcy5jb250ZW50c09mZnNldCA9IGF0dHJpYnV0ZU9mZnNldDsKIAkJfQogCX0KLQkKLQlwdWJsaWMgaW50IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQkJcmV0dXJuIGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nLCBmYWxzZSk7Ci0JfQogCi0JcHVibGljIGludCBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLCBBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaW50IGF0dHJpYnV0ZXNOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7Ci0JCWludCBhdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJaWYgKChkZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbkRlZmF1bHQpICE9IDApIHsKLQkJCS8vIGFkZCBhbiBhbm5vdGF0aW9uIGRlZmF1bHQgYXR0cmlidXRlCi0JCQlpbnQgYW5ub3RhdGlvbkRlZmF1bHROYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQW5ub3RhdGlvbkRlZmF1bHROYW1lKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhbm5vdGF0aW9uRGVmYXVsdE5hbWVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFubm90YXRpb25EZWZhdWx0TmFtZUluZGV4OwotCQkJaW50IGF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OwotCQkJY29udGVudHNPZmZzZXQgKz0gNDsKLQkJCWlmIChjb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyg0KTsKLQkJCX0KLQkJCWdlbmVyYXRlRWxlbWVudFZhbHVlKGRlY2xhcmF0aW9uLmRlZmF1bHRWYWx1ZSwgZGVjbGFyYXRpb24uYmluZGluZy5yZXR1cm5UeXBlLCBhdHRyaWJ1dGVPZmZzZXQpOwotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICE9IGF0dHJpYnV0ZU9mZnNldCkgewotCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBjb250ZW50c09mZnNldCAtIGF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwkJCQotCQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKKwlwcml2YXRlIGludCBnZW5lcmF0ZUVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZSgpIHsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkvLyBhZGQgZW5jbG9zaW5nIG1ldGhvZCBhdHRyaWJ1dGUgKDEuNSBtb2RlIG9ubHkpCisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCXJlc2l6ZUNvbnRlbnRzKDEwKTsKKwkJfQorCQlpbnQgZW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlTmFtZUluZGV4ID0KKwkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5FbmNsb3NpbmdNZXRob2ROYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCS8vIHRoZSBsZW5ndGggb2YgYSBzaWduYXR1cmUgYXR0cmlidXRlIGlzIGVxdWFscyB0byAyCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDQ7CisKKwkJaW50IGVuY2xvc2luZ1R5cGVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUodGhpcy5yZWZlcmVuY2VCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCkpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGVuY2xvc2luZ1R5cGVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGVuY2xvc2luZ1R5cGVJbmRleDsKKwkJYnl0ZSBtZXRob2RJbmRleEJ5dGUxID0gMDsKKwkJYnl0ZSBtZXRob2RJbmRleEJ5dGUyID0gMDsKKwkJaWYgKHRoaXMucmVmZXJlbmNlQmluZGluZyBpbnN0YW5jZW9mIExvY2FsVHlwZUJpbmRpbmcpIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9ICgoTG9jYWxUeXBlQmluZGluZykgdGhpcy5yZWZlcmVuY2VCaW5kaW5nKS5lbmNsb3NpbmdNZXRob2Q7CisJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCQkJaW50IGVuY2xvc2luZ01ldGhvZEluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTmFtZUFuZFR5cGUobWV0aG9kQmluZGluZy5zZWxlY3RvciwgbWV0aG9kQmluZGluZy5zaWduYXR1cmUodGhpcykpOworCQkJCW1ldGhvZEluZGV4Qnl0ZTEgPSAoYnl0ZSkgKGVuY2xvc2luZ01ldGhvZEluZGV4ID4+IDgpOworCQkJCW1ldGhvZEluZGV4Qnl0ZTIgPSAoYnl0ZSkgZW5jbG9zaW5nTWV0aG9kSW5kZXg7CiAJCQl9CiAJCX0KKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gbWV0aG9kSW5kZXhCeXRlMTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gbWV0aG9kSW5kZXhCeXRlMjsKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiAxOworCX0KKwlwcml2YXRlIGludCBnZW5lcmF0ZUV4Y2VwdGlvbnNBdHRyaWJ1dGUoUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bnNFeGNlcHRpb25zKSB7CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJaW50IGxlbmd0aCA9IHRocm93bnNFeGNlcHRpb25zLmxlbmd0aDsKKwkJaW50IGV4U2l6ZSA9IDggKyBsZW5ndGggKiAyOworCQlpZiAoZXhTaXplICsgdGhpcy5jb250ZW50c09mZnNldCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMoZXhTaXplKTsKKwkJfQorCQlpbnQgZXhjZXB0aW9uTmFtZUluZGV4ID0KKwkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5FeGNlcHRpb25zTmFtZSk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uTmFtZUluZGV4OworCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyIGluIGNhc2Ugb2YgYSBleGNlcHRpb24gYXR0cmlidXRlCisJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBsZW5ndGggKiAyICsgMjsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaW50IGV4Y2VwdGlvbkluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSh0aHJvd25zRXhjZXB0aW9uc1tpXSk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkluZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkluZGV4OworCQl9CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gMTsKKwl9CisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVIaWVyYXJjaHlJbmNvbnNpc3RlbnRBdHRyaWJ1dGUoKSB7CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJLy8gYWRkIGFuIGF0dHJpYnV0ZSBmb3IgaW5jb25zaXN0ZW50IGhpZXJhcmNoeQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCXJlc2l6ZUNvbnRlbnRzKDYpOworCQl9CisJCWludCBpbmNvbnNpc3RlbnRIaWVyYXJjaHlOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkluY29uc2lzdGVudEhpZXJhcmNoeSk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5jb25zaXN0ZW50SGllcmFyY2h5TmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5jb25zaXN0ZW50SGllcmFyY2h5TmFtZUluZGV4OworCQkvLyB0aGUgbGVuZ3RoIG9mIGFuIGluY29uc2lzdGVudCBoaWVyYXJjaHkgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gMTsKKwl9CisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVJbm5lckNsYXNzQXR0cmlidXRlKGludCBudW1iZXJPZklubmVyQ2xhc3NlcywgUmVmZXJlbmNlQmluZGluZ1tdIGlubmVyQ2xhc3NlcykgeworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCS8vIEdlbmVyYXRlIHRoZSBpbm5lciBjbGFzcyBhdHRyaWJ1dGUKKwkJaW50IGV4U2l6ZSA9IDggKiBudW1iZXJPZklubmVyQ2xhc3NlcyArIDg7CisJCWlmIChleFNpemUgKyBsb2NhbENvbnRlbnRzT2Zmc2V0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQlyZXNpemVDb250ZW50cyhleFNpemUpOworCQl9CisJCS8vIE5vdyB3ZSBub3cgdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgdGhlIG51bWJlciBvZiBlbnRyaWVzCisJCS8vIGF0dHJpYnV0ZSBuYW1lCisJCWludCBhdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLklubmVyQ2xhc3NOYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7CisJCWludCB2YWx1ZSA9IChudW1iZXJPZklubmVyQ2xhc3NlcyA8PCAzKSArIDI7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mSW5uZXJDbGFzc2VzID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZJbm5lckNsYXNzZXM7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZJbm5lckNsYXNzZXM7IGkrKykgeworCQkJUmVmZXJlbmNlQmluZGluZyBpbm5lckNsYXNzID0gaW5uZXJDbGFzc2VzW2ldOworCQkJaW50IGFjY2Vzc0ZsYWdzID0gaW5uZXJDbGFzcy5nZXRBY2Nlc3NGbGFncygpOworCQkJaW50IGlubmVyQ2xhc3NJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5uZXJDbGFzcy5jb25zdGFudFBvb2xOYW1lKCkpOworCQkJLy8gaW5uZXIgY2xhc3MgaW5kZXgKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5uZXJDbGFzc0luZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGlubmVyQ2xhc3NJbmRleDsKKwkJCS8vIG91dGVyIGNsYXNzIGluZGV4OiBhbm9ueW1vdXMgYW5kIGxvY2FsIGhhdmUgbm8gb3V0ZXIgY2xhc3MgaW5kZXgKKwkJCWlmIChpbm5lckNsYXNzLmlzTWVtYmVyVHlwZSgpKSB7CisJCQkJLy8gbWVtYmVyIG9yIG1lbWJlciBvZiBsb2NhbAorCQkJCWludCBvdXRlckNsYXNzSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGlubmVyQ2xhc3MuZW5jbG9zaW5nVHlwZSgpLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvdXRlckNsYXNzSW5kZXggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG91dGVyQ2xhc3NJbmRleDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgbm90IGEgbWVtYmVyIHR5cGUKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl9CisJCQkvLyBuYW1lIGluZGV4CisJCQlpZiAoIWlubmVyQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3Muc291cmNlTmFtZSgpKTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQkJfSBlbHNlIHsKKwkJCQkvLyBlcXVhbHMgdG8gMCBpZiB0aGUgaW5uZXJDbGFzcyBpcyBhbiBhbm9ueW1vdXMgdHlwZQorCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCX0KKwkJCS8vIGFjY2VzcyBmbGFnCisJCQlpZiAoaW5uZXJDbGFzcy5pc0Fub255bW91c1R5cGUoKSkgeworCQkJCWFjY2Vzc0ZsYWdzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWw7CisJCQl9IGVsc2UgaWYgKGlubmVyQ2xhc3MuaXNNZW1iZXJUeXBlKCkgJiYgaW5uZXJDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJYWNjZXNzRmxhZ3MgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYzsgLy8gaW1wbGljaXRlbHkgc3RhdGljCisJCQl9CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOworCQl9CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gMTsKKwl9CisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlKCkgeworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKKwkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKQorCQkgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6CisJCSAqIAkoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQorCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUKKwkJICogY29udGFpbmVkIGludG8gdGhlIGNvZGVzdHJlYW0KKwkJICovCisJCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsKKwkJaWYgKCgocGNUb1NvdXJjZU1hcFRhYmxlID0gdGhpcy5jb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXApICE9IG51bGwpCisJCQkmJiAodGhpcy5jb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7CisJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9CisJCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOworCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJcmVzaXplQ29udGVudHMoOCk7CisJCQl9CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlck5hbWVJbmRleDsKKwkJCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OworCQkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxpbmVfbnVtYmVyX3RhYmxlX2xlbmd0aAorCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7CisJCQkJLy8gd3JpdGUgdGhlIGVudHJ5CisJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOworCQkJCX0KKwkJCQlpbnQgcGMgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHBjID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwYzsKKwkJCQlpbnQgbGluZU51bWJlciA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlciA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlcjsKKwkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCX0KKwkJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQorCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOworCQkJdGhpcy5jb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiAyNCk7CisJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlckF0dHJfbGVuZ3RoID4+IDE2KTsKKwkJCXRoaXMuY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyQXR0cl9sZW5ndGg7CisJCQl0aGlzLmNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOworCQkJYXR0cmlidXRlc051bWJlciA9IDE7CisJCX0KKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOworCX0KKwkvLyB0aGlzIGlzIHVzZWQgZm9yIHByb2JsZW0gYW5kIHN5bnRoZXRpYyBtZXRob2RzCisJcHJpdmF0ZSBpbnQgZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlKGludCBwcm9ibGVtTGluZSkgeworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCXJlc2l6ZUNvbnRlbnRzKDEyKTsKKwkJfQorCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpCisJCSAqIEJ1aWxkIHRoZSBwYWlycyBvZjoKKwkJICogKGJ5dGVjb2RlUEMgbGluZU51bWJlcikKKwkJICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCisJCSAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtCisJCSAqLworCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9CisJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTGluZU51bWJlclRhYmxlTmFtZSk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDY7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDE7CisJCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMAorCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcHJvYmxlbUxpbmU7CisJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwkJcmV0dXJuIDE7CisJfQorCQorCXByaXZhdGUgaW50IGdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlKGludCBjb2RlX2xlbmd0aCwgYm9vbGVhbiBtZXRob2REZWNsYXJhdGlvbklzU3RhdGljLCBib29sZWFuIGlzU3ludGhldGljKSB7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKKwkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOworCQlpbnQgbWF4T2ZFbnRyaWVzID0gOCArIDEwICogKG1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMgPyAwIDogMSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkrKykgeworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZUJpbmRpbmcgPSB0aGlzLmNvZGVTdHJlYW0ubG9jYWxzW2ldOworCQkJbWF4T2ZFbnRyaWVzICs9IDEwICogbG9jYWxWYXJpYWJsZUJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudDsKKwkJfQorCQkvLyByZXNlcnZlIGVub3VnaCBzcGFjZQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIG1heE9mRW50cmllcyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMobWF4T2ZFbnRyaWVzKTsKKwkJfQorCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4OworCQlpbnQgbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwkJLy8gbGVhdmUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGggYW5kIGxvY2FsX3ZhcmlhYmxlX3RhYmxlX2xlbmd0aAorCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7CisJCWludCBuYW1lSW5kZXg7CisJCWludCBkZXNjcmlwdG9ySW5kZXg7CisJCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzQmluZGluZyA9IG51bGw7CisJCWlmICghbWV0aG9kRGVjbGFyYXRpb25Jc1N0YXRpYyAmJiAhaXNTeW50aGV0aWMpIHsKKwkJCW51bWJlck9mRW50cmllcysrOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOworCQkJbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5UaGlzKTsKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJCWRlY2xhcmluZ0NsYXNzQmluZGluZyA9IChTb3VyY2VUeXBlQmluZGluZykgdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCQlkZXNjcmlwdG9ySW5kZXggPQorCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgKKwkJCQkJZGVjbGFyaW5nQ2xhc3NCaW5kaW5nLnNpZ25hdHVyZSgpKTsKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7Ly8gdGhlIHJlc29sdmVkIHBvc2l0aW9uIGZvciB0aGlzIGlzIGFsd2F5cyAwCisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQl9CisJCS8vIHVzZWQgdG8gcmVtZW1iZXIgdGhlIGxvY2FsIHZhcmlhYmxlIHdpdGggYSBnZW5lcmljIHR5cGUKKwkJaW50IGdlbmVyaWNMb2NhbFZhcmlhYmxlc0NvdW50ZXIgPSAwOworCQlMb2NhbFZhcmlhYmxlQmluZGluZ1tdIGdlbmVyaWNMb2NhbFZhcmlhYmxlcyA9IG51bGw7CisJCWludCBudW1iZXJPZkdlbmVyaWNFbnRyaWVzID0gMDsKKworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkgPCBtYXg7IGkrKykgeworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IHRoaXMuY29kZVN0cmVhbS5sb2NhbHNbaV07CisJCQlpbnQgaW5pdGlhbGl6YXRpb25Db3VudCA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsKKwkJCWlmIChpbml0aWFsaXphdGlvbkNvdW50ID09IDApIGNvbnRpbnVlOworCQkJaWYgKGxvY2FsVmFyaWFibGUuZGVjbGFyYXRpb24gPT0gbnVsbCkgY29udGludWU7CisJCQlmaW5hbCBUeXBlQmluZGluZyBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcgPSBsb2NhbFZhcmlhYmxlLnR5cGU7CisJCQlib29sZWFuIGlzUGFyYW1ldGVyaXplZFR5cGUgPSBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcuaXNQYXJhbWV0ZXJpemVkVHlwZSgpIHx8IGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5pc1R5cGVWYXJpYWJsZSgpOworCQkJaWYgKGlzUGFyYW1ldGVyaXplZFR5cGUpIHsKKwkJCQlpZiAoZ2VuZXJpY0xvY2FsVmFyaWFibGVzID09IG51bGwpIHsKKwkJCQkJLy8gd2UgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG1heCBsb2NhbHMKKwkJCQkJZ2VuZXJpY0xvY2FsVmFyaWFibGVzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW21heF07CisJCQkJfQorCQkJCWdlbmVyaWNMb2NhbFZhcmlhYmxlc1tnZW5lcmljTG9jYWxWYXJpYWJsZXNDb3VudGVyKytdID0gbG9jYWxWYXJpYWJsZTsKKwkJCX0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7CisJCQkJaW50IHN0YXJ0UEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzW2ogPDwgMV07CisJCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOworCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7IC8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoCisJCQkJCWlmIChlbmRQQyA9PSAtMSkgeworCQkJCQkJbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKKwkJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5hYm9ydF9pbnZhbGlkQXR0cmlidXRlLCBuZXcgU3RyaW5nKGxvY2FsVmFyaWFibGUubmFtZSkpLAorCQkJCQkJCQkoQVNUTm9kZSkgbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOworCQkJCQl9CisJCQkJCWlmIChpc1BhcmFtZXRlcml6ZWRUeXBlKSB7CisJCQkJCQludW1iZXJPZkdlbmVyaWNFbnRyaWVzKys7CisJCQkJCX0KKwkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQorCQkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsKKwkJCQkJaW50IGxlbmd0aCA9IGVuZFBDIC0gc3RhcnRQQzsKKwkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7CisJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7CisJCQkJCW5hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJCQkJZGVzY3JpcHRvckluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGVUeXBlQmluZGluZy5zaWduYXR1cmUoKSk7CisJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOworCQlhdHRyaWJ1dGVzTnVtYmVyKys7CisKKwkJZmluYWwgYm9vbGVhbiBjdXJyZW50SW5zdGFuY2VJc0dlbmVyaWMgPQorCQkJIW1ldGhvZERlY2xhcmF0aW9uSXNTdGF0aWMKKwkJCSYmIGRlY2xhcmluZ0NsYXNzQmluZGluZyAhPSBudWxsCisJCQkmJiBkZWNsYXJpbmdDbGFzc0JpbmRpbmcudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOworCQlpZiAoZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlciAhPSAwIHx8IGN1cnJlbnRJbnN0YW5jZUlzR2VuZXJpYykgeworCQkJLy8gYWRkIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlIGF0dHJpYnV0ZQorCQkJbnVtYmVyT2ZHZW5lcmljRW50cmllcyArPSAoY3VycmVudEluc3RhbmNlSXNHZW5lcmljID8gMSA6IDApOworCQkJbWF4T2ZFbnRyaWVzID0gOCArIG51bWJlck9mR2VuZXJpY0VudHJpZXMgKiAxMDsKKwkJCS8vIHJlc2VydmUgZW5vdWdoIHNwYWNlCisJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIG1heE9mRW50cmllcyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCXJlc2l6ZUNvbnRlbnRzKG1heE9mRW50cmllcyk7CisJCQl9CisJCQlpbnQgbG9jYWxWYXJpYWJsZVR5cGVOYW1lSW5kZXggPQorCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVHlwZVRhYmxlTmFtZSk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVUeXBlTmFtZUluZGV4OworCQkJdmFsdWUgPSBudW1iZXJPZkdlbmVyaWNFbnRyaWVzICogMTAgKyAyOworCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKKwkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mR2VuZXJpY0VudHJpZXMgPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZHZW5lcmljRW50cmllczsKKwkJCWlmIChjdXJyZW50SW5zdGFuY2VJc0dlbmVyaWMpIHsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOyAvLyB0aGUgc3RhcnRQQyBmb3IgdGhpcyBpcyBhbHdheXMgMAorCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCQkJbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5UaGlzKTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQkJCWRlc2NyaXB0b3JJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChkZWNsYXJpbmdDbGFzc0JpbmRpbmcuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOy8vIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhpcyBpcyBhbHdheXMgMAorCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl9CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJpY0xvY2FsVmFyaWFibGVzQ291bnRlcjsgaSsrKSB7CisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGdlbmVyaWNMb2NhbFZhcmlhYmxlc1tpXTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7CisJCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOworCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07CisJCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7CisJCQkJCQkvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aAorCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQorCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOworCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0UEM7CisJCQkJCQlpbnQgbGVuZ3RoID0gZW5kUEMgLSBzdGFydFBDOworCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7CisJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOworCQkJCQkJbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7CisJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJCQlkZXNjcmlwdG9ySW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS50eXBlLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOworCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247CisJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJlc29sdmVkUG9zaXRpb24gPj4gOCk7CisJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKKwkJfQorCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKIAkJcmV0dXJuIGF0dHJpYnV0ZXNOdW1iZXI7CiAJfQogCS8qKgpAQCAtNTI4NiwxMCArMjY0MSwxMCBAQAogCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZwogCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgogCSAqLwotCXB1YmxpYyBpbnQgZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgYm9vbGVhbiBjcmVhdGVQcm9ibGVtTWV0aG9kKSB7CisJcHVibGljIGludCBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewogCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbnVtYmVyCi0JCWNvbnRlbnRzT2Zmc2V0ICs9IDI7Ci0JCWlmIChjb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOworCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCXJlc2l6ZUNvbnRlbnRzKDIpOwogCQl9CiAJCS8vIG5vdyB3ZSBjYW4gaGFuZGxlIGFsbCB0aGUgYXR0cmlidXRlIGZvciB0aGF0IG1ldGhvZCBpbmZvOgpAQCAtNTMwMSwxMzQgKzI2NTYsNTggQEAKIAogCQkvLyBFeGNlcHRpb24gYXR0cmlidXRlCiAJCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25zRXhjZXB0aW9uczsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKIAkJaWYgKCh0aHJvd25zRXhjZXB0aW9ucyA9IG1ldGhvZEJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykgIT0gQmluZGluZy5OT19FWENFUFRJT05TKSB7CiAJCQkvLyBUaGUgbWV0aG9kIGhhcyBhIHRocm93IGNsYXVzZS4gU28gd2UgbmVlZCB0byBhZGQgYW4gZXhjZXB0aW9uIGF0dHJpYnV0ZQogCQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGV4Y2VwdGlvbiBhdHRyaWJ1dGUKLQkJCWludCBsZW5ndGggPSB0aHJvd25zRXhjZXB0aW9ucy5sZW5ndGg7Ci0JCQlpbnQgZXhTaXplID0gOCArIGxlbmd0aCAqIDI7Ci0JCQlpZiAoZXhTaXplICsgY29udGVudHNPZmZzZXQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyhleFNpemUpOwotCQkJfQotCQkJaW50IGV4Y2VwdGlvbk5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5FeGNlcHRpb25zTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uTmFtZUluZGV4OwotCQkJLy8gVGhlIGF0dHJpYnV0ZSBsZW5ndGggPSBsZW5ndGggKiAyICsgMiBpbiBjYXNlIG9mIGEgZXhjZXB0aW9uIGF0dHJpYnV0ZQotCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVMZW5ndGg7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGVuZ3RoID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWludCBleGNlcHRpb25JbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHRocm93bnNFeGNlcHRpb25zW2ldKTsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZXhjZXB0aW9uSW5kZXggPj4gOCk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZXhjZXB0aW9uSW5kZXg7Ci0JCQl9Ci0JCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVFeGNlcHRpb25zQXR0cmlidXRlKHRocm93bnNFeGNlcHRpb25zKTsKIAkJfQogCQlpZiAobWV0aG9kQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgewogCQkJLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUKLQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZQotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewotCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJfQotCQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRGVwcmVjYXRlZE5hbWUpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0KLQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZURlcHJlY2F0ZWRBdHRyaWJ1dGUoKTsKIAkJfQogCQlpZiAodGhpcy50YXJnZXRKREsgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQlpZiAobWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpKSB7Ci0JCQkJLy8gU3ludGhldGljIGF0dHJpYnV0ZQotCQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZQotCQkJCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQkJcmVzaXplQ29udGVudHMoNik7Ci0JCQkJfQotCQkJCWludCBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4OwotCQkJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQotCQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVTeW50aGV0aWNBdHRyaWJ1dGUoKTsKIAkJCX0KIAkJCWlmIChtZXRob2RCaW5kaW5nLmlzVmFyYXJncygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBoYW5kbGUgb2YgdGhlIHRhcmdldCBqc3IxNCBmb3IgdmFyYXJncyBpbiB0aGUgc291cmNlCi0JCQkJICogVmFyYXJncyBhdHRyaWJ1dGUKLQkJCQkgKiBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUKLQkJCQkgKi8KLQkJCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7Ci0JCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOwotCQkJCX0KLQkJCQlpbnQgdmFyYXJnc0F0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuVmFyYXJnc05hbWUpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YXJhcmdzQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHZhcmFyZ3NBdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQkJLy8gdGhlIGxlbmd0aCBvZiBhIHZhcmFyZ3MgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCi0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7Ci0JCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOwotCQotCQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVWYXJhcmdzQXR0cmlidXRlKCk7CiAJCQl9CiAJCX0KIAkJLy8gYWRkIHNpZ25hdHVyZSBhdHRyaWJ1dGUKIAkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSBtZXRob2RCaW5kaW5nLmdlbmVyaWNTaWduYXR1cmUoKTsKIAkJaWYgKGdlbmVyaWNTaWduYXR1cmUgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGZpZWxkIGluZm8gY29ycmVzcG9uZGluZwotCQkJLy8gdG8gdGhlIEBmaWVsZEJpbmRpbmcKLQkJCWlmIChjb250ZW50c09mZnNldCArIDggPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKLQkJCQlyZXNpemVDb250ZW50cyg4KTsKLQkJCX0KLQkJCWludCBzaWduYXR1cmVBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU2lnbmF0dXJlTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4OwotCQkJLy8gdGhlIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDIKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKLQkJCWludCBzaWduYXR1cmVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChnZW5lcmljU2lnbmF0dXJlKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzaWduYXR1cmVJbmRleCA+PiA4KTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHNpZ25hdHVyZUluZGV4OwotCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlU2lnbmF0dXJlQXR0cmlidXRlKGdlbmVyaWNTaWduYXR1cmUpOwogCQl9Ci0JCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmICF0aGlzLmNyZWF0aW5nUHJvYmxlbVR5cGUgJiYgIWNyZWF0ZVByb2JsZW1NZXRob2QpIHsKKwkJaWYgKHRoaXMudGFyZ2V0SkRLID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RCaW5kaW5nLnNvdXJjZU1ldGhvZCgpOwogCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCQlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKIAkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJCQlhdHRyaWJ1dGVOdW1iZXIgKz0gZ2VuZXJhdGVSdW50aW1lQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworCQkJCQlhdHRyaWJ1dGVzTnVtYmVyICs9IGdlbmVyYXRlUnVudGltZUFubm90YXRpb25zKGFubm90YXRpb25zKTsKIAkJCQl9CiAJCQkJaWYgKChtZXRob2RCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1BhcmFtZXRlckFubm90YXRpb25zKSAhPSAwKSB7CiAJCQkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzOwogCQkJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCWF0dHJpYnV0ZU51bWJlciArPSBnZW5lcmF0ZVJ1bnRpbWVBbm5vdGF0aW9uc0ZvclBhcmFtZXRlcnMoYXJndW1lbnRzKTsKKwkJCQkJCWF0dHJpYnV0ZXNOdW1iZXIgKz0gZ2VuZXJhdGVSdW50aW1lQW5ub3RhdGlvbnNGb3JQYXJhbWV0ZXJzKGFyZ3VtZW50cyk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU51bWJlcjsKKwkJaWYgKChtZXRob2RCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQl0aGlzLm1pc3NpbmdUeXBlcyA9IG1ldGhvZEJpbmRpbmcuY29sbGVjdE1pc3NpbmdUeXBlcyh0aGlzLm1pc3NpbmdUeXBlcyk7CisJCX0KKwkJcmV0dXJuIGF0dHJpYnV0ZXNOdW1iZXI7CiAJfQotCisJcHVibGljIGludCBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlcyhtZXRob2RCaW5kaW5nKTsKKwkJaW50IGF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWlmICgoZGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb25EZWZhdWx0KSAhPSAwKSB7CisJCQkvLyBhZGQgYW4gYW5ub3RhdGlvbiBkZWZhdWx0IGF0dHJpYnV0ZQorCQkJYXR0cmlidXRlc051bWJlciArPSBnZW5lcmF0ZUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlKGRlY2xhcmF0aW9uLCBhdHRyaWJ1dGVPZmZzZXQpOworCQl9CisJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOworCX0KIAkvKioKIAkgKiBJTlRFUk5BTCBVU0UtT05MWQogCSAqIFRoYXQgbWV0aG9kIGdlbmVyYXRlcyB0aGUgaGVhZGVyIG9mIGEgbWV0aG9kIGluZm86CkBAIC01NDU3LDExICsyNzM2LDExIEBACiAJcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgaW50IGFjY2Vzc0ZsYWdzKSB7CiAJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBtZXRob2QgaW5mbyBjb3JyZXNwb25kaW5nCiAJCS8vIHRvIHRoZSBAbWV0aG9kQmluZGluZwotCQltZXRob2RDb3VudCsrOyAvLyBhZGQgb25lIG1vcmUgbWV0aG9kCi0JCWlmIChjb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCXRoaXMubWV0aG9kQ291bnQrKzsgLy8gYWRkIG9uZSBtb3JlIG1ldGhvZAorCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygxMCk7CiAJCX0KLQkJaWYgKHRhcmdldEpESyA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJaWYgKHRoaXMudGFyZ2V0SkRLIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogCQkJLy8gcHJlIDEuNSwgc3ludGhldGljIGlzIGFuIGF0dHJpYnV0ZSwgbm90IGEgbW9kaWZpZXIKIAkJCS8vIHByZSAxLjUsIHZhcmFyZ3MgaXMgYW4gYXR0cmlidXRlLCBub3QgYSBtb2RpZmllciAoLXRhcmdldCBqc3IxNCBtb2RlKQogCQkJYWNjZXNzRmxhZ3MgJj0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ZhcmFyZ3MpOwpAQCAtNTQ2OSw0MiArMjc0OCw0MyBAQAogCQlpZiAoKG1ldGhvZEJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuQ2xlYXJQcml2YXRlTW9kaWZpZXIpICE9IDApIHsKIAkJCWFjY2Vzc0ZsYWdzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZTsKIAkJfQotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYWNjZXNzRmxhZ3MgPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOwotCQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChtZXRob2RCaW5kaW5nLnNlbGVjdG9yKTsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwotCQlpbnQgZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSh0aGlzKSk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOworCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJaW50IGRlc2NyaXB0b3JJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSh0aGlzKSk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwogCX0KKwogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogVGhhdCBtZXRob2QgZ2VuZXJhdGVzIHRoZSBtZXRob2QgaW5mbyBoZWFkZXIgb2YgYSBjbGluaXQ6CiAJICogVGhlIGhlYWRlciBjb25zaXN0cyBpbjoKIAkgKiAtIHRoZSBhY2Nlc3MgZmxhZ3MgKGFsd2F5cyBkZWZhdWx0IGFjY2VzcyArIHN0YXRpYykKLQkgKiAtIHRoZSBuYW1lIGluZGV4IG9mIHRoZSBtZXRob2QgbmFtZSAoYWx3YXlzIDxjbGluaXQ+KSBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wgCisJICogLSB0aGUgbmFtZSBpbmRleCBvZiB0aGUgbWV0aG9kIG5hbWUgKGFsd2F5cyA8Y2xpbml0PikgaW5zaWRlIHRoZSBjb25zdGFudCBwb29sCiAJICogLSB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGUgc2lnbmF0dXJlIChhbHdheXMgKClWKSBvZiB0aGUgbWV0aG9kIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbC4KIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXJGb3JDbGluaXQoKSB7CiAJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBtZXRob2QgaW5mbyBjb3JyZXNwb25kaW5nCiAJCS8vIHRvIHRoZSBAbWV0aG9kQmluZGluZwotCQltZXRob2RDb3VudCsrOyAvLyBhZGQgb25lIG1vcmUgbWV0aG9kCi0JCWlmIChjb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCXRoaXMubWV0aG9kQ291bnQrKzsgLy8gYWRkIG9uZSBtb3JlIG1ldGhvZAorCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDEwID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQlyZXNpemVDb250ZW50cygxMCk7CiAJCX0KLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKChDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKTsKLQkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQ29uc3RhbnRQb29sLkNsaW5pdCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOworCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5DbGluaXQpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKIAkJaW50IGRlc2NyaXB0b3JJbmRleCA9Ci0JCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KENvbnN0YW50UG9vbC5DbGluaXRTaWduYXR1cmUpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7CisJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQ29uc3RhbnRQb29sLkNsaW5pdFNpZ25hdHVyZSk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OwogCQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAxIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlCi0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAxOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAwOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAxOwogCX0KIAogCS8qKgpAQCAtNTUyMiwxNiArMjgwMiwxNiBAQAogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb25zW2ldOwogCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmc7Ci0JCSAJCVN0cmluZyByZWFkYWJsZU5hbWUgPSBuZXcgU3RyaW5nKG1ldGhvZEJpbmRpbmcucmVhZGFibGVOYW1lKCkpOwotCQkgCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcyA9IGNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1zOwotCQkgCQlpbnQgcHJvYmxlbXNDb3VudCA9IGNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1Db3VudDsKKwkJCQkgU3RyaW5nIHJlYWRhYmxlTmFtZSA9IG5ldyBTdHJpbmcobWV0aG9kQmluZGluZy5yZWFkYWJsZU5hbWUoKSk7CisJCQkJIENhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zID0gY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbXM7CisJCQkJIGludCBwcm9ibGVtc0NvdW50ID0gY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50OwogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvYmxlbXNDb3VudDsgaisrKSB7CiAJCQkJCUNhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbal07CiAJCQkJCWlmIChwcm9ibGVtICE9IG51bGwKLSAgICAJCQkJCQkmJiBwcm9ibGVtLmdldElEKCkgPT0gSVByb2JsZW0uQWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZAotICAgIAkJCQkJCSYmIHByb2JsZW0uZ2V0TWVzc2FnZSgpLmluZGV4T2YocmVhZGFibGVOYW1lKSAhPSAtMQotICAgIAkJCQkJCSYmIHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSA+PSB0eXBlRGVjbGFyYXRpb25Tb3VyY2VTdGFydAotICAgIAkJCQkJCSYmIHByb2JsZW0uZ2V0U291cmNlRW5kKCkgPD0gdHlwZURlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCQkJCQkJJiYgcHJvYmxlbS5nZXRJRCgpID09IElQcm9ibGVtLkFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQKKwkJCQkJCQkmJiBwcm9ibGVtLmdldE1lc3NhZ2UoKS5pbmRleE9mKHJlYWRhYmxlTmFtZSkgIT0gLTEKKwkJCQkJCQkmJiBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgPj0gdHlwZURlY2xhcmF0aW9uU291cmNlU3RhcnQKKwkJCQkJCQkmJiBwcm9ibGVtLmdldFNvdXJjZUVuZCgpIDw9IHR5cGVEZWNsYXJhdGlvblNvdXJjZUVuZCkgewogCQkJCQkJLy8gd2UgZm91bmQgYSBtYXRjaAogCQkJCQkJYWRkTWlzc2luZ0Fic3RyYWN0UHJvYmxlbU1ldGhvZChtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kQmluZGluZywgcHJvYmxlbSwgY29tcGlsYXRpb25SZXN1bHQpOwogCQkJCQl9CkBAIC01NTQwLDYgKzI4MjAsNTQgQEAKIAkJfQogCX0KIAorCXByaXZhdGUgdm9pZCBnZW5lcmF0ZU1pc3NpbmdUeXBlc0F0dHJpYnV0ZSgpIHsKKwkJaW50IGluaXRpYWxTaXplID0gdGhpcy5taXNzaW5nVHlwZXMuc2l6ZSgpOworCQlpbnRbXSBtaXNzaW5nVHlwZXNJbmRleGVzID0gbmV3IGludFtpbml0aWFsU2l6ZV07CisJCWludCBudW1iZXJPZk1pc3NpbmdUeXBlcyA9IDA7CisJCWlmIChpbml0aWFsU2l6ZSA+IDEpIHsKKwkJCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5taXNzaW5nVHlwZXMsIG5ldyBDb21wYXJhdG9yKCkgeworCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworCQkJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZzEgPSAoVHlwZUJpbmRpbmcpIG8xOworCQkJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSAoVHlwZUJpbmRpbmcpIG8yOworCQkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb21wYXJlVG8odHlwZUJpbmRpbmcxLmNvbnN0YW50UG9vbE5hbWUoKSwgdHlwZUJpbmRpbmcyLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJaW50IHByZXZpb3VzSW5kZXggPSAwOworCQluZXh0OiBmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxTaXplOyBpKyspIHsKKwkJCWludCBtaXNzaW5nVHlwZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSgoVHlwZUJpbmRpbmcpIHRoaXMubWlzc2luZ1R5cGVzLmdldChpKSk7CisJCQlpZiAocHJldmlvdXNJbmRleCA9PSBtaXNzaW5nVHlwZUluZGV4KSB7CisJCQkJY29udGludWUgbmV4dDsKKwkJCX0KKwkJCXByZXZpb3VzSW5kZXggPSBtaXNzaW5nVHlwZUluZGV4OworCQkJbWlzc2luZ1R5cGVzSW5kZXhlc1tudW1iZXJPZk1pc3NpbmdUeXBlcysrXSA9IG1pc3NpbmdUeXBlSW5kZXg7CisJCX0KKwkJLy8gd2UgZG9uJ3QgbmVlZCB0byByZXNpemUgYXMgd2UgaW50ZXJhdGUgZnJvbSAwIHRvIG51bWJlck9mTWlzc2luZ1R5cGVzIHdoZW4gcmVjb3JkaW5nIHRoZSBpbmRleGVzIGluIHRoZSAuY2xhc3MgZmlsZQorCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbnVtYmVyT2ZNaXNzaW5nVHlwZXMgKiAyICsgMjsKKwkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyBhdHRyaWJ1dGVMZW5ndGggKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQlyZXNpemVDb250ZW50cyhhdHRyaWJ1dGVMZW5ndGggKyA2KTsKKwkJfQorCQlpbnQgbWlzc2luZ1R5cGVzTmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLk1pc3NpbmdUeXBlc05hbWUpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG1pc3NpbmdUeXBlc05hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG1pc3NpbmdUeXBlc05hbWVJbmRleDsKKworCQkvLyBnZW5lcmF0ZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKKworCQkvLyBnZW5lcmF0ZSBudW1iZXIgb2YgbWlzc2luZyB0eXBlcworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mTWlzc2luZ1R5cGVzID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZNaXNzaW5nVHlwZXM7CisJCS8vIGdlbmVyYXRlIGVudHJ5IGZvciBlYWNoIG1pc3NpbmcgdHlwZQorCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mTWlzc2luZ1R5cGVzOyBpKyspIHsKKwkJCWludCBtaXNzaW5nVHlwZUluZGV4ID0gbWlzc2luZ1R5cGVzSW5kZXhlc1tpXTsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobWlzc2luZ1R5cGVJbmRleCA+PiA4KTsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBtaXNzaW5nVHlwZUluZGV4OworCQl9CisJfQorCiAJLyoqCiAJICogQHBhcmFtIGFubm90YXRpb25zCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY3JlYXRlZCB3aGlsZSBkdW1waW5nIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgLmNsYXNzIGZpbGUKQEAgLTU1NDksMTAwICsyODc3LDExMCBAQAogCQlmaW5hbCBpbnQgbGVuZ3RoID0gYW5ub3RhdGlvbnMubGVuZ3RoOwogCQlpbnQgdmlzaWJsZUFubm90YXRpb25zQ291bnRlciA9IDA7CiAJCWludCBpbnZpc2libGVBbm5vdGF0aW9uc0NvdW50ZXIgPSAwOwotCQkKKwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKLQkJCWlmIChpc1J1bnRpbWVJbnZpc2libGUoYW5ub3RhdGlvbikpIHsKKwkJCWlmIChhbm5vdGF0aW9uLmlzUnVudGltZUludmlzaWJsZSgpKSB7CiAJCQkJaW52aXNpYmxlQW5ub3RhdGlvbnNDb3VudGVyKys7Ci0JCQl9IGVsc2UgaWYgKGlzUnVudGltZVZpc2libGUoYW5ub3RhdGlvbikpIHsKKwkJCX0gZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1J1bnRpbWVWaXNpYmxlKCkpIHsKIAkJCQl2aXNpYmxlQW5ub3RhdGlvbnNDb3VudGVyKys7CiAJCQl9CiAJCX0KIAorCQlpbnQgYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCWludCBjb25zdGFudFBPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0OworCQlpbnQgY29uc3RhbnRQb29sSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXg7CiAJCWlmIChpbnZpc2libGVBbm5vdGF0aW9uc0NvdW50ZXIgIT0gMCkgewotCQkJaW50IGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWlmIChjb250ZW50c09mZnNldCArIDEwID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyAxMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCXJlc2l6ZUNvbnRlbnRzKDEwKTsKIAkJCX0KIAkJCWludCBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGVOYW1lSW5kZXggPQotCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZUludmlzaWJsZUFubm90YXRpb25zTmFtZSk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlTmFtZUluZGV4OwotCQkJaW50IGF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OwotCQkJY29udGVudHNPZmZzZXQgKz0gNDsgLy8gbGVhdmUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCi0JCi0JCQlpbnQgYW5ub3RhdGlvbnNMZW5ndGhPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgYW5ub3RhdGlvbnMgbGVuZ3RoCi0JCQotCQkJY29udGVudHNbYW5ub3RhdGlvbnNMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGludmlzaWJsZUFubm90YXRpb25zQ291bnRlciA+PiA4KTsKLQkJCWNvbnRlbnRzW2Fubm90YXRpb25zTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIGludmlzaWJsZUFubm90YXRpb25zQ291bnRlcjsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZUludmlzaWJsZUFubm90YXRpb25zTmFtZSk7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJCXRoaXMuY29udGVudHNPZmZzZXQgKz0gNDsgLy8gbGVhdmUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCiAKKwkJCWludCBhbm5vdGF0aW9uc0xlbmd0aE9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgYW5ub3RhdGlvbnMgbGVuZ3RoCisKKwkJCWludCBjb3VudGVyID0gMDsKIAkJCWxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoaW52aXNpYmxlQW5ub3RhdGlvbnNDb3VudGVyID09IDApIGJyZWFrIGxvb3A7CiAJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07Ci0JCQkJaWYgKGlzUnVudGltZUludmlzaWJsZShhbm5vdGF0aW9uKSkgewotCQkJCQlnZW5lcmF0ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldCk7CisJCQkJaWYgKGFubm90YXRpb24uaXNSdW50aW1lSW52aXNpYmxlKCkpIHsKKwkJCQkJaW50IGN1cnJlbnRBbm5vdGF0aW9uT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJCQkJZ2VuZXJhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIGN1cnJlbnRBbm5vdGF0aW9uT2Zmc2V0KTsKIAkJCQkJaW52aXNpYmxlQW5ub3RhdGlvbnNDb3VudGVyLS07Ci0JCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ID09IGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQpIHsKLQkJCQkJCWJyZWFrIGxvb3A7CisJCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICE9IGN1cnJlbnRBbm5vdGF0aW9uT2Zmc2V0KSB7CisJCQkJCQljb3VudGVyKys7CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoY29udGVudHNPZmZzZXQgIT0gYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldCkgewotCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSBjb250ZW50c09mZnNldCAtIGF0dHJpYnV0ZUxlbmd0aE9mZnNldCAtIDQ7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwkJCQorCQkJaWYgKGNvdW50ZXIgIT0gMCkgeworCQkJCXRoaXMuY29udGVudHNbYW5ub3RhdGlvbnNMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGNvdW50ZXIgPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1thbm5vdGF0aW9uc0xlbmd0aE9mZnNldCsrXSA9IChieXRlKSBjb3VudGVyOworCisJCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IHRoaXMuY29udGVudHNPZmZzZXQgLSBhdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwogCQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKLQkJCX0gZWxzZSB7CQkKLQkJCQljb250ZW50c09mZnNldCA9IGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQ7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0OworCQkJCS8vIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIGNsaW5pdAorCQkJCXRoaXMuY29uc3RhbnRQb29sLnJlc2V0Rm9yQXR0cmlidXRlTmFtZShBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5SdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNOYW1lLCBjb25zdGFudFBvb2xJbmRleCwgY29uc3RhbnRQT2Zmc2V0KTsKIAkJCX0KIAkJfQotCQorCisJCWFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQljb25zdGFudFBPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0OworCQljb25zdGFudFBvb2xJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmN1cnJlbnRJbmRleDsKIAkJaWYgKHZpc2libGVBbm5vdGF0aW9uc0NvdW50ZXIgIT0gMCkgewotCQkJaW50IGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWlmIChjb250ZW50c09mZnNldCArIDEwID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyAxMCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCXJlc2l6ZUNvbnRlbnRzKDEwKTsKIAkJCX0KIAkJCWludCBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlTmFtZUluZGV4ID0KLQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNOYW1lKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZU5hbWVJbmRleDsKLQkJCWludCBhdHRyaWJ1dGVMZW5ndGhPZmZzZXQgPSBjb250ZW50c09mZnNldDsKLQkJCWNvbnRlbnRzT2Zmc2V0ICs9IDQ7IC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGxlbmd0aAotCQotCQkJaW50IGFubm90YXRpb25zTGVuZ3RoT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7Ci0JCQljb250ZW50c09mZnNldCArPSAyOyAvLyBsZWF2ZSBzcGFjZSBmb3IgdGhlIGFubm90YXRpb25zIGxlbmd0aAotCQkKLQkJCWNvbnRlbnRzW2Fubm90YXRpb25zTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpICh2aXNpYmxlQW5ub3RhdGlvbnNDb3VudGVyID4+IDgpOwotCQkJY29udGVudHNbYW5ub3RhdGlvbnNMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgdmlzaWJsZUFubm90YXRpb25zQ291bnRlcjsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZVZpc2libGVBbm5vdGF0aW9uc05hbWUpOworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJCXRoaXMuY29udGVudHNPZmZzZXQgKz0gNDsgLy8gbGVhdmUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCiAKKwkJCWludCBhbm5vdGF0aW9uc0xlbmd0aE9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgYW5ub3RhdGlvbnMgbGVuZ3RoCisKKwkJCWludCBjb3VudGVyID0gMDsKIAkJCWxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAodmlzaWJsZUFubm90YXRpb25zQ291bnRlciA9PSAwKSBicmVhayBsb29wOwogCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW2ldOwotCQkJCWlmIChpc1J1bnRpbWVWaXNpYmxlKGFubm90YXRpb24pKSB7CisJCQkJaWYgKGFubm90YXRpb24uaXNSdW50aW1lVmlzaWJsZSgpKSB7CiAJCQkJCXZpc2libGVBbm5vdGF0aW9uc0NvdW50ZXItLTsKLQkJCQkJZ2VuZXJhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQpOwotCQkJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCA9PSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0KSB7Ci0JCQkJCQlicmVhayBsb29wOworCQkJCQlpbnQgY3VycmVudEFubm90YXRpb25PZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkJCQlnZW5lcmF0ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgY3VycmVudEFubm90YXRpb25PZmZzZXQpOworCQkJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCAhPSBjdXJyZW50QW5ub3RhdGlvbk9mZnNldCkgeworCQkJCQkJY291bnRlcisrOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICE9IGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQpIHsKLQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gY29udGVudHNPZmZzZXQgLSBhdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsJCQkKKwkJCWlmIChjb3VudGVyICE9IDApIHsKKwkJCQl0aGlzLmNvbnRlbnRzW2Fubm90YXRpb25zTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChjb3VudGVyID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbYW5ub3RhdGlvbnNMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgY291bnRlcjsKKworCQkJCWludCBhdHRyaWJ1dGVMZW5ndGggPSB0aGlzLmNvbnRlbnRzT2Zmc2V0IC0gYXR0cmlidXRlTGVuZ3RoT2Zmc2V0IC0gNDsKKwkJCQl0aGlzLmNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKKwkJCQl0aGlzLmNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKIAkJCQlhdHRyaWJ1dGVzTnVtYmVyKys7CiAJCQl9IGVsc2UgewotCQkJCWNvbnRlbnRzT2Zmc2V0ID0gYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldDsKKwkJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ID0gYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldDsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbC5yZXNldEZvckF0dHJpYnV0ZU5hbWUoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZVZpc2libGVBbm5vdGF0aW9uc05hbWUsIGNvbnN0YW50UG9vbEluZGV4LCBjb25zdGFudFBPZmZzZXQpOwogCQkJfQogCQl9CiAJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOwogCX0KLQogCXByaXZhdGUgaW50IGdlbmVyYXRlUnVudGltZUFubm90YXRpb25zRm9yUGFyYW1ldGVycyhBcmd1bWVudFtdIGFyZ3VtZW50cykgewogCQlmaW5hbCBpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJZmluYWwgaW50IFZJU0lCTEVfSU5ERVggPSAwOwpAQCAtNTY1NiwxMCArMjk5NCwxMCBAQAogCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKIAkJCQlmb3IgKGludCBqID0gMCwgbWF4MiA9IGFubm90YXRpb25zLmxlbmd0aDsgaiA8IG1heDI7IGorKykgewogCQkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tqXTsKLQkJCQkJaWYgKGlzUnVudGltZUludmlzaWJsZShhbm5vdGF0aW9uKSkgeworCQkJCQlpZiAoYW5ub3RhdGlvbi5pc1J1bnRpbWVJbnZpc2libGUoKSkgewogCQkJCQkJYW5ub3RhdGlvbnNDb3VudGVyc1tpXVtJTlZJU0lCTEVfSU5ERVhdKys7CiAJCQkJCQlpbnZpc2libGVQYXJhbWV0ZXJzQW5ub3RhdGlvbnNDb3VudGVyKys7Ci0JCQkJCX0gZWxzZSBpZiAoaXNSdW50aW1lVmlzaWJsZShhbm5vdGF0aW9uKSkgeworCQkJCQl9IGVsc2UgaWYgKGFubm90YXRpb24uaXNSdW50aW1lVmlzaWJsZSgpKSB7CiAJCQkJCQlhbm5vdGF0aW9uc0NvdW50ZXJzW2ldW1ZJU0lCTEVfSU5ERVhdKys7CiAJCQkJCQl2aXNpYmxlUGFyYW1ldGVyc0Fubm90YXRpb25zQ291bnRlcisrOwogCQkJCQl9CkBAIC01NjY3LDExMCArMzAwNSw3NDkgQEAKIAkJCX0KIAkJfQogCQlpbnQgYXR0cmlidXRlc051bWJlciA9IDA7Ci0JCWludCBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWludCBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKIAkJaWYgKGludmlzaWJsZVBhcmFtZXRlcnNBbm5vdGF0aW9uc0NvdW50ZXIgIT0gMCkgewotCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgNyA+PSBjb250ZW50cy5sZW5ndGgpIHsKKwkJCWludCBnbG9iYWxDb3VudGVyID0gMDsKKwkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgNyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCXJlc2l6ZUNvbnRlbnRzKDcpOwogCQkJfQogCQkJaW50IGF0dHJpYnV0ZU5hbWVJbmRleCA9Ci0JCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5SdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNOYW1lKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7Ci0JCQljb250ZW50c09mZnNldCArPSA0OyAvLyBsZWF2ZSBzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBsZW5ndGgKKwkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zTmFtZSk7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJCXRoaXMuY29udGVudHNPZmZzZXQgKz0gNDsgLy8gbGVhdmUgc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCiAKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFyZ3VtZW50c0xlbmd0aDsKLQkJCWludmlzaWJsZUxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY29udGVudHNPZmZzZXQgKyAyID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFyZ3VtZW50c0xlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodGhpcy5jb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJcmVzaXplQ29udGVudHMoMik7CiAJCQkJfQogCQkJCWlmIChpbnZpc2libGVQYXJhbWV0ZXJzQW5ub3RhdGlvbnNDb3VudGVyID09IDApIHsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsJCQkJCQorCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDA7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZmluYWwgaW50IG51bWJlck9mSW52aXNpYmxlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc0NvdW50ZXJzW2ldW0lOVklTSUJMRV9JTkRFWF07Ci0JCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkludmlzaWJsZUFubm90YXRpb25zID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZkludmlzaWJsZUFubm90YXRpb25zOworCQkJCQlpbnQgaW52aXNpYmxlQW5ub3RhdGlvbnNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkJCQkvLyBsZWF2ZSBzcGFjZSBmb3IgbnVtYmVyIG9mIGFubm90YXRpb25zCisJCQkJCXRoaXMuY29udGVudHNPZmZzZXQgKz0gMjsKKwkJCQkJaW50IGNvdW50ZXIgPSAwOwogCQkJCQlpZiAobnVtYmVyT2ZJbnZpc2libGVBbm5vdGF0aW9ucyAhPSAwKSB7CiAJCQkJCQlBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKIAkJCQkJCUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFyZ3VtZW50LmFubm90YXRpb25zOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7CiAJCQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbal07Ci0JCQkJCQkJaWYgKGlzUnVudGltZUludmlzaWJsZShhbm5vdGF0aW9uKSkgewotCQkJCQkJCQlnZW5lcmF0ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldCk7Ci0JCQkJCQkJCWlmIChjb250ZW50c09mZnNldCA9PSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0KSB7Ci0JCQkJCQkJCQlicmVhayBpbnZpc2libGVMb29wOworCQkJCQkJCWlmIChhbm5vdGF0aW9uLmlzUnVudGltZUludmlzaWJsZSgpKSB7CisJCQkJCQkJCWludCBjdXJyZW50QW5ub3RhdGlvbk9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQkJCQkJCWdlbmVyYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBjdXJyZW50QW5ub3RhdGlvbk9mZnNldCk7CisJCQkJCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICE9IGN1cnJlbnRBbm5vdGF0aW9uT2Zmc2V0KSB7CisJCQkJCQkJCQljb3VudGVyKys7CisJCQkJCQkJCQlnbG9iYWxDb3VudGVyKys7CiAJCQkJCQkJCX0KIAkJCQkJCQkJaW52aXNpYmxlUGFyYW1ldGVyc0Fubm90YXRpb25zQ291bnRlci0tOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQorCQkJCQl0aGlzLmNvbnRlbnRzW2ludmlzaWJsZUFubm90YXRpb25zT2Zmc2V0KytdID0gKGJ5dGUpIChjb3VudGVyID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2ludmlzaWJsZUFubm90YXRpb25zT2Zmc2V0XSA9IChieXRlKSBjb3VudGVyOwogCQkJCX0KIAkJCX0KLQkJCWlmIChjb250ZW50c09mZnNldCAhPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0KSB7Ci0JCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGNvbnRlbnRzT2Zmc2V0IC0gYXR0cmlidXRlTGVuZ3RoT2Zmc2V0IC0gNDsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVMZW5ndGg7CQkJCisJCQlpZiAoZ2xvYmFsQ291bnRlciAhPSAwKSB7CisJCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IHRoaXMuY29udGVudHNPZmZzZXQgLSBhdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwogCQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKIAkJCX0gZWxzZSB7Ci0JCQkJY29udGVudHNPZmZzZXQgPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0OworCQkJCS8vIGlmIGdsb2JhbENvdW50ZXIgaXMgMCwgdGhpcyBtZWFucyB0aGF0IHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIGFsbCB2aXNpYmxlIGFubm90YXRpb25zIGZhaWxlZAorCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0OwogCQkJfQogCQl9CiAJCWlmICh2aXNpYmxlUGFyYW1ldGVyc0Fubm90YXRpb25zQ291bnRlciAhPSAwKSB7Ci0JCQlpZiAoY29udGVudHNPZmZzZXQgKyA3ID49IGNvbnRlbnRzLmxlbmd0aCkgeworCQkJaW50IGdsb2JhbENvdW50ZXIgPSAwOworCQkJaWYgKHRoaXMuY29udGVudHNPZmZzZXQgKyA3ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CiAJCQkJcmVzaXplQ29udGVudHMoNyk7CiAJCQl9CiAJCQlpbnQgYXR0cmlidXRlTmFtZUluZGV4ID0KLQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNOYW1lKTsKLQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7Ci0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7Ci0JCQlpbnQgYXR0cmlidXRlTGVuZ3RoT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7Ci0JCQljb250ZW50c09mZnNldCArPSA0OyAvLyBsZWF2ZSBzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBsZW5ndGgKKwkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc05hbWUpOworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTmFtZUluZGV4OworCQkJaW50IGF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQl0aGlzLmNvbnRlbnRzT2Zmc2V0ICs9IDQ7IC8vIGxlYXZlIHNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGxlbmd0aAogCi0JCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhcmd1bWVudHNMZW5ndGg7Ci0JCQl2aXNpYmxlTG9vcDogZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHNMZW5ndGg7IGkrKykgewotCQkJCWlmIChjb250ZW50c09mZnNldCArIDIgPj0gY29udGVudHMubGVuZ3RoKSB7CisJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYXJndW1lbnRzTGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHNMZW5ndGg7IGkrKykgeworCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgewogCQkJCQlyZXNpemVDb250ZW50cygyKTsKIAkJCQl9CiAJCQkJaWYgKHZpc2libGVQYXJhbWV0ZXJzQW5ub3RhdGlvbnNDb3VudGVyID09IDApIHsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsJCQkJCQorCQkJCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMDsKKwkJCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDA7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZmluYWwgaW50IG51bWJlck9mVmlzaWJsZUFubm90YXRpb25zID0gYW5ub3RhdGlvbnNDb3VudGVyc1tpXVtWSVNJQkxFX0lOREVYXTsKLQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mVmlzaWJsZUFubm90YXRpb25zID4+IDgpOwotCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZlZpc2libGVBbm5vdGF0aW9uczsKKwkJCQkJaW50IHZpc2libGVBbm5vdGF0aW9uc09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBudW1iZXIgb2YgYW5ub3RhdGlvbnMKKwkJCQkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOworCQkJCQlpbnQgY291bnRlciA9IDA7CiAJCQkJCWlmIChudW1iZXJPZlZpc2libGVBbm5vdGF0aW9ucyAhPSAwKSB7CiAJCQkJCQlBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKIAkJCQkJCUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFyZ3VtZW50LmFubm90YXRpb25zOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7CiAJCQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbal07Ci0JCQkJCQkJaWYgKGlzUnVudGltZVZpc2libGUoYW5ub3RhdGlvbikpIHsKLQkJCQkJCQkJZ2VuZXJhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb25BdHRyaWJ1dGVPZmZzZXQpOwotCQkJCQkJCQlpZiAoY29udGVudHNPZmZzZXQgPT0gYW5ub3RhdGlvbkF0dHJpYnV0ZU9mZnNldCkgewotCQkJCQkJCQkJYnJlYWsgdmlzaWJsZUxvb3A7CisJCQkJCQkJaWYgKGFubm90YXRpb24uaXNSdW50aW1lVmlzaWJsZSgpKSB7CisJCQkJCQkJCWludCBjdXJyZW50QW5ub3RhdGlvbk9mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCQkJCQkJCWdlbmVyYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBjdXJyZW50QW5ub3RhdGlvbk9mZnNldCk7CisJCQkJCQkJCWlmICh0aGlzLmNvbnRlbnRzT2Zmc2V0ICE9IGN1cnJlbnRBbm5vdGF0aW9uT2Zmc2V0KSB7CisJCQkJCQkJCQljb3VudGVyKys7CisJCQkJCQkJCQlnbG9iYWxDb3VudGVyKys7CiAJCQkJCQkJCX0KIAkJCQkJCQkJdmlzaWJsZVBhcmFtZXRlcnNBbm5vdGF0aW9uc0NvdW50ZXItLTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJdGhpcy5jb250ZW50c1t2aXNpYmxlQW5ub3RhdGlvbnNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvdW50ZXIgPj4gOCk7CisJCQkJCXRoaXMuY29udGVudHNbdmlzaWJsZUFubm90YXRpb25zT2Zmc2V0XSA9IChieXRlKSBjb3VudGVyOwogCQkJCX0KIAkJCX0KLQkJCWlmIChjb250ZW50c09mZnNldCAhPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0KSB7Ci0JCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IGNvbnRlbnRzT2Zmc2V0IC0gYXR0cmlidXRlTGVuZ3RoT2Zmc2V0IC0gNDsKLQkJCQljb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7Ci0JCQkJY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOwotCQkJCWNvbnRlbnRzW2F0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVMZW5ndGg7CQkJCisJCQlpZiAoZ2xvYmFsQ291bnRlciAhPSAwKSB7CisJCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IHRoaXMuY29udGVudHNPZmZzZXQgLSBhdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQkJCXRoaXMuY29udGVudHNbYXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7CisJCQkJdGhpcy5jb250ZW50c1thdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOwogCQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKIAkJCX0gZWxzZSB7Ci0JCQkJY29udGVudHNPZmZzZXQgPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0OworCQkJCS8vIGlmIGdsb2JhbENvdW50ZXIgaXMgMCwgdGhpcyBtZWFucyB0aGF0IHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIGFsbCB2aXNpYmxlIGFubm90YXRpb25zIGZhaWxlZAorCQkJCXRoaXMuY29udGVudHNPZmZzZXQgPSBhbm5vdGF0aW9uQXR0cmlidXRlT2Zmc2V0OwogCQkJfQogCQl9CiAJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOwogCX0KLQkKKworCXByaXZhdGUgaW50IGdlbmVyYXRlU2lnbmF0dXJlQXR0cmlidXRlKGNoYXJbXSBnZW5lcmljU2lnbmF0dXJlKSB7CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQlyZXNpemVDb250ZW50cyg4KTsKKwkJfQorCQlpbnQgc2lnbmF0dXJlQXR0cmlidXRlTmFtZUluZGV4ID0KKwkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TaWduYXR1cmVOYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzaWduYXR1cmVBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzaWduYXR1cmVBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCS8vIHRoZSBsZW5ndGggb2YgYSBzaWduYXR1cmUgYXR0cmlidXRlIGlzIGVxdWFscyB0byAyCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDI7CisJCWludCBzaWduYXR1cmVJbmRleCA9CisJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZ2VuZXJpY1NpZ25hdHVyZSk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc2lnbmF0dXJlSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzaWduYXR1cmVJbmRleDsKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiAxOworCX0KKworCXByaXZhdGUgaW50IGdlbmVyYXRlU291cmNlQXR0cmlidXRlKFN0cmluZyBmdWxsRmlsZU5hbWUpIHsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgaW5mbyBjb3JyZXNwb25kaW5nCisJCS8vIHRvIHRoZSBAZmllbGRCaW5kaW5nCisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMoOCk7CisJCX0KKwkJaW50IHNvdXJjZUF0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU291cmNlTmFtZSk7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc291cmNlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc291cmNlQXR0cmlidXRlTmFtZUluZGV4OworCQkvLyBUaGUgbGVuZ3RoIG9mIGEgc291cmNlIGZpbGUgYXR0cmlidXRlIGlzIDIuIFRoaXMgaXMgYSBmaXhlZC1sZW5ndGgKKwkJLy8gYXR0cmlidXRlCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDI7CisJCS8vIHdyaXRlIHRoZSBzb3VyY2UgZmlsZSBuYW1lCisJCWludCBmaWxlTmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZ1bGxGaWxlTmFtZS50b0NoYXJBcnJheSgpKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWxlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmlsZU5hbWVJbmRleDsKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiAxOworCX0KKwlwcml2YXRlIGludCBnZW5lcmF0ZVN0YWNrTWFwQXR0cmlidXRlKAorCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLAorCQkJaW50IGNvZGVfbGVuZ3RoLAorCQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQlpbnQgbWF4X2xvY2FscywKKwkJCWJvb2xlYW4gaXNDbGluaXQpIHsKKwkJaW50IGF0dHJpYnV0ZXNOdW1iZXIgPSAwOworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IHRoaXMuY29udGVudHNPZmZzZXQ7CisJCVN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtIHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtID0gKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSB0aGlzLmNvZGVTdHJlYW07CisJCXN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLnJlbW92ZUZyYW1lUG9zaXRpb24oY29kZV9sZW5ndGgpOworCQlpZiAoc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uaGFzRnJhbWVQb3NpdGlvbnMoKSkgeworCQkJQXJyYXlMaXN0IGZyYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCXRyYXZlcnNlKGlzQ2xpbml0ID8gbnVsbCA6IG1ldGhvZEJpbmRpbmcsIG1heF9sb2NhbHMsIHRoaXMuY29udGVudHMsIGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxNCwgY29kZV9sZW5ndGgsIGZyYW1lcywgaXNDbGluaXQpOworCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzLnNpemUoKTsKKwkJCWlmIChudW1iZXJPZkZyYW1lcyA+IDEpIHsKKwkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJLy8gYWRkIHRoZSBzdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCisJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOworCQkJCX0KKwkJCQlpbnQgc3RhY2tNYXBBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3RhY2tNYXBOYW1lKTsKKwkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YWNrTWFwQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFja01hcEF0dHJpYnV0ZU5hbWVJbmRleDsKKworCQkJCWludCBzdGFja01hcEF0dHJpYnV0ZUxlbmd0aE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJLy8gZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZQorCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNDsKKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJcmVzaXplQ29udGVudHMoNCk7CisJCQkJfQorCQkJCWludCBudW1iZXJPZkZyYW1lc09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOworCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCQlyZXNpemVDb250ZW50cygyKTsKKwkJCQl9CisJCQkJU3RhY2tNYXBGcmFtZSBjdXJyZW50RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgZnJhbWVzLmdldCgwKTsKKwkJCQlmb3IgKGludCBqID0gMTsgaiA8IG51bWJlck9mRnJhbWVzOyBqKyspIHsKKwkJCQkJLy8gc2VsZWN0IG5leHQgZnJhbWUKKwkJCQkJY3VycmVudEZyYW1lID0gKFN0YWNrTWFwRnJhbWUpIGZyYW1lcy5nZXQoaik7CisJCQkJCS8vIGdlbmVyYXRlIGN1cnJlbnQgZnJhbWUKKwkJCQkJLy8gbmVlZCB0byBmaW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgZnJhbWUgYW5kIHRoZSBwcmV2aW91cyBmcmFtZQorCQkJCQlpbnQgZnJhbWVPZmZzZXQgPSBjdXJyZW50RnJhbWUucGM7CisJCQkJCS8vIEZVTExfRlJBTUUKKwkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA1ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCQlyZXNpemVDb250ZW50cyg1KTsKKwkJCQkJfQorCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZyYW1lT2Zmc2V0ID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZnJhbWVPZmZzZXQ7CisJCQkJCWludCBudW1iZXJPZkxvY2FsT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwkJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyBsZWF2ZSB0d28gc3BvdHMgZm9yIG51bWJlciBvZiBsb2NhbHMKKwkJCQkJaW50IG51bWJlck9mTG9jYWxFbnRyaWVzID0gMDsKKwkJCQkJaW50IG51bWJlck9mTG9jYWxzID0gY3VycmVudEZyYW1lLmdldE51bWJlck9mTG9jYWxzKCk7CisJCQkJCWludCBudW1iZXJPZkVudHJpZXMgPSAwOworCQkJCQlpbnQgbG9jYWxzTGVuZ3RoID0gY3VycmVudEZyYW1lLmxvY2FscyA9PSBudWxsID8gMCA6IGN1cnJlbnRGcmFtZS5sb2NhbHMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fsc0xlbmd0aCAmJiBudW1iZXJPZkxvY2FsRW50cmllcyA8IG51bWJlck9mTG9jYWxzOyBpKyspIHsKKwkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOworCQkJCQkJfQorCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5sb2NhbHNbaV07CisJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7CisJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKKwkJCQkJCQkJCWkrKzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKKwkJCQkJCQkJCWkrKzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIFRfbnVsbCA6CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7CisJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKKwkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKKwkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgorCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCW51bWJlck9mTG9jYWxFbnRyaWVzKys7CisJCQkJCQl9CisJCQkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQkJfQorCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOworCQkJCQl9CisJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZMb2NhbE9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mTG9jYWxPZmZzZXRdID0gKGJ5dGUpIG51bWJlck9mRW50cmllczsKKwkJCQkJaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IGN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7CisJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZTdGFja0l0ZW1zID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZTdGFja0l0ZW1zOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhY2tJdGVtczsgaSsrKSB7CisJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKKwkJCQkJCX0KKwkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tpXTsKKwkJCQkJCWlmIChpbmZvID09IG51bGwpIHsKKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKKwkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9GTE9BVDsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9MT05HOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgVF9udWxsIDoKKwkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKKwkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgeworCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgorCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6CisJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOworCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOworCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQludW1iZXJPZkZyYW1lcy0tOworCQkJCWlmIChudW1iZXJPZkZyYW1lcyAhPSAwKSB7CisJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZGcmFtZXNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRnJhbWVzID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkZyYW1lczsKKworCQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIHN0YWNrTWFwQXR0cmlidXRlTGVuZ3RoT2Zmc2V0IC0gNDsKKwkJCQkJdGhpcy5jb250ZW50c1tzdGFja01hcEF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJCQkJdGhpcy5jb250ZW50c1tzdGFja01hcEF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKKwkJCQkJdGhpcy5jb250ZW50c1tzdGFja01hcEF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwQXR0cmlidXRlTGVuZ3RoT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVMZW5ndGg7CisJCQkJCWF0dHJpYnV0ZXNOdW1iZXIrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ID0gc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU9mZnNldDsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiBhdHRyaWJ1dGVzTnVtYmVyOworCX0KKworCXByaXZhdGUgaW50IGdlbmVyYXRlU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZSgKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywKKwkJCWludCBjb2RlX2xlbmd0aCwKKwkJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJaW50IG1heF9sb2NhbHMsCisJCQlib29sZWFuIGlzQ2xpbml0KSB7CisJCWludCBhdHRyaWJ1dGVzTnVtYmVyID0gMDsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQlTdGFja01hcEZyYW1lQ29kZVN0cmVhbSBzdGFja01hcEZyYW1lQ29kZVN0cmVhbSA9IChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgdGhpcy5jb2RlU3RyZWFtOworCQlzdGFja01hcEZyYW1lQ29kZVN0cmVhbS5yZW1vdmVGcmFtZVBvc2l0aW9uKGNvZGVfbGVuZ3RoKTsKKwkJaWYgKHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLmhhc0ZyYW1lUG9zaXRpb25zKCkpIHsKKwkJCUFycmF5TGlzdCBmcmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQl0cmF2ZXJzZShpc0NsaW5pdCA/IG51bGw6IG1ldGhvZEJpbmRpbmcsIG1heF9sb2NhbHMsIHRoaXMuY29udGVudHMsIGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxNCwgY29kZV9sZW5ndGgsIGZyYW1lcywgaXNDbGluaXQpOworCQkJaW50IG51bWJlck9mRnJhbWVzID0gZnJhbWVzLnNpemUoKTsKKwkJCWlmIChudW1iZXJPZkZyYW1lcyA+IDEpIHsKKwkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJLy8gYWRkIHRoZSBzdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCisJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCXJlc2l6ZUNvbnRlbnRzKDgpOworCQkJCX0KKwkJCQlpbnQgc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQkJCXRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TdGFja01hcFRhYmxlTmFtZSk7CisJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFja01hcFRhYmxlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFja01hcFRhYmxlQXR0cmlidXRlTmFtZUluZGV4OworCisJCQkJaW50IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJCS8vIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGUKKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDQ7CisJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA0ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCXJlc2l6ZUNvbnRlbnRzKDQpOworCQkJCX0KKwkJCQlpbnQgbnVtYmVyT2ZGcmFtZXNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsKKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJcmVzaXplQ29udGVudHMoMik7CisJCQkJfQorCQkJCVN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lID0gKFN0YWNrTWFwRnJhbWUpIGZyYW1lcy5nZXQoMCk7CisJCQkJU3RhY2tNYXBGcmFtZSBwcmV2RnJhbWUgPSBudWxsOworCQkJCWZvciAoaW50IGogPSAxOyBqIDwgbnVtYmVyT2ZGcmFtZXM7IGorKykgeworCQkJCQkvLyBzZWxlY3QgbmV4dCBmcmFtZQorCQkJCQlwcmV2RnJhbWUgPSBjdXJyZW50RnJhbWU7CisJCQkJCWN1cnJlbnRGcmFtZSA9IChTdGFja01hcEZyYW1lKSBmcmFtZXMuZ2V0KGopOworCQkJCQkvLyBnZW5lcmF0ZSBjdXJyZW50IGZyYW1lCisJCQkJCS8vIG5lZWQgdG8gZmluZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGZyYW1lIGFuZCB0aGUgcHJldmlvdXMgZnJhbWUKKwkJCQkJaW50IG9mZnNldERlbHRhID0gY3VycmVudEZyYW1lLmdldE9mZnNldERlbHRhKHByZXZGcmFtZSk7CisJCQkJCXN3aXRjaCAoY3VycmVudEZyYW1lLmdldEZyYW1lVHlwZShwcmV2RnJhbWUpKSB7CisJCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuQVBQRU5EX0ZSQU1FIDoKKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7CisJCQkJCQkJfQorCQkJCQkJCWludCBudW1iZXJPZkRpZmZlcmVudExvY2FscyA9IGN1cnJlbnRGcmFtZS5udW1iZXJPZkRpZmZlcmVudExvY2FscyhwcmV2RnJhbWUpOworCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoMjUxICsgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMpOworCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOworCQkJCQkJCWludCBpbmRleCA9IGN1cnJlbnRGcmFtZS5nZXRJbmRleE9mRGlmZmVyZW50TG9jYWxzKG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKKwkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbHMgPSBjdXJyZW50RnJhbWUuZ2V0TnVtYmVyT2ZMb2NhbHMoKTsKKwkJCQkJCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCBjdXJyZW50RnJhbWUubG9jYWxzLmxlbmd0aCAmJiBudW1iZXJPZkRpZmZlcmVudExvY2FscyA+IDA7IGkrKykgeworCQkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOworCQkJCQkJCQl9CisJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOworCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7CisJCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKKwkJCQkJCQkJCQkJaSsrOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFOworCQkJCQkJCQkJCQlpKys7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgVF9udWxsIDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZm8udGFnOworCQkJCQkJCQkJCQlzd2l0Y2ggKGluZm8udGFnKSB7CisJCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6CisJCQkJCQkJCQkJCQkJaW50IG9mZnNldCA9IGluZm8ub2Zmc2V0OworCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOworCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7CisJCQkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKKwkJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbmRleEZvclR5cGUgPj4gOCk7CisJCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMtLTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FIDoKKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQkJcmVzaXplQ29udGVudHMoMSk7CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0ZSQU1FX0VYVEVOREVEIDoKKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDMgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAyNTE7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXREZWx0YSA+PiA4KTsKKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0RGVsdGE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuQ0hPUF9GUkFNRSA6CisJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDMpOworCQkJCQkJCX0KKwkJCQkJCQludW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC1jdXJyZW50RnJhbWUubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKTsKKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKDI1MSAtIG51bWJlck9mRGlmZmVyZW50TG9jYWxzKTsKKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOworCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgU3RhY2tNYXBGcmFtZS5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TIDoKKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCQkJCQkJcmVzaXplQ29udGVudHMoNCk7CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgKyA2NCk7CisJCQkJCQkJaWYgKGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdID09IG51bGwpIHsKKwkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXN3aXRjaChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXS5pZCgpKSB7CisJCQkJCQkJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgVF9udWxsIDoKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF07CisJCQkJCQkJCQkJYnl0ZSB0YWcgPSAoYnl0ZSkgaW5mby50YWc7CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gdGFnOworCQkJCQkJCQkJCXN3aXRjaCAodGFnKSB7CisJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKKwkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKKwkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0ID4+IDgpOworCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKKwkJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNUIDoKKwkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOworCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4Rm9yVHlwZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFN0YWNrTWFwRnJhbWUuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNU19FWFRFTkRFRCA6CisJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA2ID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCQkJCXJlc2l6ZUNvbnRlbnRzKDYpOworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgMjQ3OworCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob2Zmc2V0RGVsdGEgPj4gOCk7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldERlbHRhOworCQkJCQkJCWlmIChjdXJyZW50RnJhbWUuc3RhY2tJdGVtc1swXSA9PSBudWxsKSB7CisJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzd2l0Y2goY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbMF0uaWQoKSkgeworCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9ET1VCTEU7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFRfbnVsbCA6CisJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTlVMTDsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zWzBdOworCQkJCQkJCQkJCWJ5dGUgdGFnID0gKGJ5dGUpIGluZm8udGFnOworCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IHRhZzsKKwkJCQkJCQkJCQlzd2l0Y2ggKHRhZykgeworCQkJCQkJCQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6CisJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7CisJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKKwkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXQ7CisJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6CisJCQkJCQkJCQkJCQlpbnQgaW5kZXhGb3JUeXBlID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShpbmZvLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKKwkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJLy8gRlVMTF9GUkFNRQorCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNSA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCQkJCQlyZXNpemVDb250ZW50cyg1KTsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIDI1NTsKKwkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldERlbHRhID4+IDgpOworCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvZmZzZXREZWx0YTsKKwkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbE9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyBsZWF2ZSB0d28gc3BvdHMgZm9yIG51bWJlciBvZiBsb2NhbHMKKwkJCQkJCQlpbnQgbnVtYmVyT2ZMb2NhbEVudHJpZXMgPSAwOworCQkJCQkJCW51bWJlck9mTG9jYWxzID0gY3VycmVudEZyYW1lLmdldE51bWJlck9mTG9jYWxzKCk7CisJCQkJCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7CisJCQkJCQkJaW50IGxvY2Fsc0xlbmd0aCA9IGN1cnJlbnRGcmFtZS5sb2NhbHMgPT0gbnVsbCA/IDAgOiBjdXJyZW50RnJhbWUubG9jYWxzLmxlbmd0aDsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fsc0xlbmd0aCAmJiBudW1iZXJPZkxvY2FsRW50cmllcyA8IG51bWJlck9mTG9jYWxzOyBpKyspIHsKKwkJCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAzID49IHRoaXMuY29udGVudHMubGVuZ3RoKSB7CisJCQkJCQkJCQlyZXNpemVDb250ZW50cygzKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gY3VycmVudEZyYW1lLmxvY2Fsc1tpXTsKKwkJCQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgeworCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVE9QOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJc3dpdGNoKGluZm8uaWQoKSkgeworCQkJCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0lOVEVHRVI7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0ZMT0FUOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0xPTkc7CisJCQkJCQkJCQkJCWkrKzsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKKwkJCQkJCQkJCQkJaSsrOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIFRfbnVsbCA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEw7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmZvLnRhZzsKKwkJCQkJCQkJCQkJc3dpdGNoIChpbmZvLnRhZykgeworCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQgOgorCQkJCQkJCQkJCQkJCWludCBvZmZzZXQgPSBpbmZvLm9mZnNldDsKKwkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG9mZnNldCA+PiA4KTsKKwkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgb2Zmc2V0OworCQkJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6CisJCQkJCQkJCQkJCQkJaW50IGluZGV4Rm9yVHlwZSA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoaW5mby5jb25zdGFudFBvb2xOYW1lKCkpOworCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW5kZXhGb3JUeXBlID4+IDgpOworCQkJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleEZvclR5cGU7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCW51bWJlck9mTG9jYWxFbnRyaWVzKys7CisJCQkJCQkJCX0KKwkJCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7CisJCQkJCQkJfQorCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCQkJCQlyZXNpemVDb250ZW50cyg0KTsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkxvY2FsT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7CisJCQkJCQkJdGhpcy5jb250ZW50c1tudW1iZXJPZkxvY2FsT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7CisJCQkJCQkJaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IGN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZlN0YWNrSXRlbXMgPj4gOCk7CisJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mU3RhY2tJdGVtczsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhY2tJdGVtczsgaSsrKSB7CisJCQkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMyA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJCQkJCQkJcmVzaXplQ29udGVudHMoMyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW2ldOworCQkJCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1A7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlzd2l0Y2goaW5mby5pZCgpKSB7CisJCQkJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fSU5URUdFUjsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQ7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORzsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJCQkJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX0RPVUJMRTsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJY2FzZSBUX251bGwgOgorCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9OVUxMOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5mby50YWc7CisJCQkJCQkJCQkJCXN3aXRjaCAoaW5mby50YWcpIHsKKwkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKKwkJCQkJCQkJCQkJCQlpbnQgb2Zmc2V0ID0gaW5mby5vZmZzZXQ7CisJCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChvZmZzZXQgPj4gOCk7CisJCQkJCQkJCQkJCQkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG9mZnNldDsKKwkJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1QgOgorCQkJCQkJCQkJCQkJCWludCBpbmRleEZvclR5cGUgPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGluZm8uY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4Rm9yVHlwZSA+PiA4KTsKKwkJCQkJCQkJCQkJCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXhGb3JUeXBlOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQludW1iZXJPZkZyYW1lcy0tOworCQkJCWlmIChudW1iZXJPZkZyYW1lcyAhPSAwKSB7CisJCQkJCXRoaXMuY29udGVudHNbbnVtYmVyT2ZGcmFtZXNPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRnJhbWVzID4+IDgpOworCQkJCQl0aGlzLmNvbnRlbnRzW251bWJlck9mRnJhbWVzT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkZyYW1lczsKKworCQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQgLSA0OworCQkJCQl0aGlzLmNvbnRlbnRzW3N0YWNrTWFwVGFibGVBdHRyaWJ1dGVMZW5ndGhPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7CisJCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDE2KTsKKwkJCQkJdGhpcy5jb250ZW50c1tzdGFja01hcFRhYmxlQXR0cmlidXRlTGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gOCk7CisJCQkJCXRoaXMuY29udGVudHNbc3RhY2tNYXBUYWJsZUF0dHJpYnV0ZUxlbmd0aE9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTGVuZ3RoOworCQkJCQlhdHRyaWJ1dGVzTnVtYmVyKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9jYWxDb250ZW50c09mZnNldCA9IHN0YWNrTWFwVGFibGVBdHRyaWJ1dGVPZmZzZXQ7CisJCQkJfQorCQkJfQorCQl9CisJCXRoaXMuY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlyZXR1cm4gYXR0cmlidXRlc051bWJlcjsKKwl9CisKKwlwcml2YXRlIGludCBnZW5lcmF0ZVN5bnRoZXRpY0F0dHJpYnV0ZSgpIHsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDYgPj0gdGhpcy5jb250ZW50cy5sZW5ndGgpIHsKKwkJCXJlc2l6ZUNvbnRlbnRzKDYpOworCQl9CisJCWludCBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsKKwkJLy8gdGhlIGxlbmd0aCBvZiBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDAKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiAxOworCX0KKworCXByaXZhdGUgaW50IGdlbmVyYXRlVmFyYXJnc0F0dHJpYnV0ZSgpIHsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQkvKgorCQkgKiBoYW5kbGUgb2YgdGhlIHRhcmdldCBqc3IxNCBmb3IgdmFyYXJncyBpbiB0aGUgc291cmNlCisJCSAqIFZhcmFyZ3MgYXR0cmlidXRlCisJCSAqIENoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBhdHRyaWJ1dGUKKwkJICovCisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNiA+PSB0aGlzLmNvbnRlbnRzLmxlbmd0aCkgeworCQkJcmVzaXplQ29udGVudHMoNik7CisJCX0KKwkJaW50IHZhcmFyZ3NBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlZhcmFyZ3NOYW1lKTsKKwkJdGhpcy5jb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YXJhcmdzQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgdmFyYXJnc0F0dHJpYnV0ZU5hbWVJbmRleDsKKwkJLy8gdGhlIGxlbmd0aCBvZiBhIHZhcmFyZ3MgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCXRoaXMuY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisKKwkJdGhpcy5jb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCXJldHVybiAxOworCX0KKwogCS8qKgogCSAqIEVYVEVSTkFMIEFQSQogCSAqIEFuc3dlciB0aGUgYWN0dWFsIGJ5dGVzIG9mIHRoZSBjbGFzcyBmaWxlCkBAIC01Nzk4LDI4ICszNzc1LDkwIEBACiAJCXJldHVybiBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBmaWxlTmFtZSgpKTsKIAl9CiAKKwlwcml2YXRlIGludCBnZXRQYXJhbWV0ZXJzQ291bnQoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgeworCQlpbnQgaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKCcsIG1ldGhvZFNpZ25hdHVyZSk7CisJCWkrKzsKKwkJY2hhciBjdXJyZW50Q2hhcmFjdGVyID0gbWV0aG9kU2lnbmF0dXJlW2ldOworCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnKScpIHsKKwkJCXJldHVybiAwOworCQl9CisJCWludCByZXN1bHQgPSAwOworCQl3aGlsZSAodHJ1ZSkgeworCQkJY3VycmVudENoYXJhY3RlciA9IG1ldGhvZFNpZ25hdHVyZVtpXTsKKwkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICcpJykgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQljYXNlICdbJzoKKwkJCQkJLy8gYXJyYXkgdHlwZQorCQkJCQlpbnQgc2NhblR5cGUgPSBzY2FuVHlwZShtZXRob2RTaWduYXR1cmUsIGkgKyAxKTsKKwkJCQkJcmVzdWx0Kys7CisJCQkJCWkgPSBzY2FuVHlwZSArIDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0wnOgorCQkJCQlzY2FuVHlwZSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignOycsIG1ldGhvZFNpZ25hdHVyZSwKKwkJCQkJCQlpICsgMSk7CisJCQkJCXJlc3VsdCsrOworCQkJCQlpID0gc2NhblR5cGUgKyAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdaJzoKKwkJCQljYXNlICdCJzoKKwkJCQljYXNlICdDJzoKKwkJCQljYXNlICdEJzoKKwkJCQljYXNlICdGJzoKKwkJCQljYXNlICdJJzoKKwkJCQljYXNlICdKJzoKKwkJCQljYXNlICdTJzoKKwkJCQkJcmVzdWx0Kys7CisJCQkJCWkrKzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdGFydGluZyB0eXBlIGNoYXJhY3RlciA6ICIgKyBjdXJyZW50Q2hhcmFjdGVyKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBjaGFyW10gZ2V0UmV0dXJuVHlwZShjaGFyW10gbWV0aG9kU2lnbmF0dXJlKSB7CisJCS8vIHNraXAgdHlwZSBwYXJhbWV0ZXJzCisJCWludCBwYXJlbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyknLCBtZXRob2RTaWduYXR1cmUpOworCQkvLyB0aGVyZSBjb3VsZCBiZSB0aHJvd24gZXhjZXB0aW9ucyBiZWhpbmQsIHRodXMgc2NhbiBvbmUgdHlwZSBleGFjdGx5CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG1ldGhvZFNpZ25hdHVyZSwgcGFyZW4gKyAxLAorCQkJCW1ldGhvZFNpZ25hdHVyZS5sZW5ndGgpOworCX0KKworCisJcHJpdmF0ZSBmaW5hbCBpbnQgaTRBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsCisJCQlpbnQgc3RydWN0T2Zmc2V0KSB7CisJCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCQlyZXR1cm4gKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAyNCkKKwkJCQkrICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgMTYpCisJCQkJKyAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpCisJCQkJKyAocmVmZXJlbmNlW3Bvc2l0aW9uXSAmIDB4RkYpOworCX0KKwogCXByb3RlY3RlZCB2b2lkIGluaXRCeXRlQXJyYXlzKCkgewotCQlpbnQgbWVtYmVycyA9IHJlZmVyZW5jZUJpbmRpbmcubWV0aG9kcygpLmxlbmd0aCArIHJlZmVyZW5jZUJpbmRpbmcuZmllbGRzKCkubGVuZ3RoOworCQlpbnQgbWVtYmVycyA9IHRoaXMucmVmZXJlbmNlQmluZGluZy5tZXRob2RzKCkubGVuZ3RoICsgdGhpcy5yZWZlcmVuY2VCaW5kaW5nLmZpZWxkcygpLmxlbmd0aDsKIAkJdGhpcy5oZWFkZXIgPSBuZXcgYnl0ZVtJTklUSUFMX0hFQURFUl9TSVpFXTsKIAkJdGhpcy5jb250ZW50cyA9IG5ldyBieXRlW21lbWJlcnMgPCAxNSA/IElOSVRJQUxfQ09OVEVOVFNfU0laRSA6IElOSVRJQUxfSEVBREVSX1NJWkVdOwogCX0KIAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU291cmNlVHlwZUJpbmRpbmcgYVR5cGUsIENsYXNzRmlsZSBwYXJlbnRDbGFzc0ZpbGUsIGJvb2xlYW4gY3JlYXRlUHJvYmxlbVR5cGUpIHsKIAkJLy8gZ2VuZXJhdGUgdGhlIG1hZ2ljIG51bWJlcnMgaW5zaWRlIHRoZSBoZWFkZXIKLQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IChieXRlKSAoMHhDQUZFQkFCRUwgPj4gMjQpOwotCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAxNik7Ci0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDgpOwotCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAwKTsKLQkJCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRoaXMudGFyZ2V0SkRLID4+IDgpOyAvLyBtaW5vciBoaWdoCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRoaXMudGFyZ2V0SkRLID4+IDApOyAvLyBtaW5vciBsb3cKLQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IChieXRlKSAodGhpcy50YXJnZXRKREsgPj4gMjQpOyAvLyBtYWpvciBoaWdoCi0JCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRoaXMudGFyZ2V0SkRLID4+IDE2KTsgLy8gbWFqb3IgbG93CisJCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAyNCk7CisJCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAxNik7CisJCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiA4KTsKKwkJdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDApOwogCi0JCWNvbnN0YW50UG9vbE9mZnNldCA9IGhlYWRlck9mZnNldDsKLQkJaGVhZGVyT2Zmc2V0ICs9IDI7CisJCWxvbmcgdGFyZ2V0VmVyc2lvbiA9IHRoaXMudGFyZ2V0SkRLOworCQl0aGlzLmhlYWRlclt0aGlzLmhlYWRlck9mZnNldCsrXSA9IChieXRlKSAodGFyZ2V0VmVyc2lvbiA+PiA4KTsgLy8gbWlub3IgaGlnaAorCQl0aGlzLmhlYWRlclt0aGlzLmhlYWRlck9mZnNldCsrXSA9IChieXRlKSAodGFyZ2V0VmVyc2lvbj4+IDApOyAvLyBtaW5vciBsb3cKKwkJdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRhcmdldFZlcnNpb24gPj4gMjQpOyAvLyBtYWpvciBoaWdoCisJCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICh0YXJnZXRWZXJzaW9uID4+IDE2KTsgLy8gbWFqb3IgbG93CisKKwkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXQgPSB0aGlzLmhlYWRlck9mZnNldDsKKwkJdGhpcy5oZWFkZXJPZmZzZXQgKz0gMjsKIAkJdGhpcy5jb25zdGFudFBvb2wuaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCisKIAkJLy8gTW9kaWZpZXIgbWFuaXB1bGF0aW9ucyBmb3IgY2xhc3NmaWxlCiAJCWludCBhY2Nlc3NGbGFncyA9IGFUeXBlLmdldEFjY2Vzc0ZsYWdzKCk7CiAJCWlmIChhVHlwZS5pc1ByaXZhdGUoKSkgeyAvLyByZXdyaXRlIHByaXZhdGUgdG8gbm9uLXB1YmxpYwpAQCAtNTgzNyw3NiArMzg3NiwyNDIgQEAKIAkJCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljCiAJCQkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZAogCQkJCQl8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUpOwotCQkJCQkKKwogCQkvLyBzZXQgdGhlIEFjY1N1cGVyIGZsYWcgKGhhcyB0byBiZSBkb25lIGFmdGVyIGNsZWFyaW5nIEFjY1N5bmNocm9uaXplZCAtIHNpbmNlIHNhbWUgdmFsdWUpCiAJCWlmICghYVR5cGUuaXNJbnRlcmZhY2UoKSkgeyAvLyBjbGFzcyBvciBlbnVtCiAJCQlhY2Nlc3NGbGFncyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3VwZXI7CiAJCX0KLQkJCisJCWlmIChhVHlwZS5pc0Fub255bW91c1R5cGUoKSkgeworCQkJYWNjZXNzRmxhZ3MgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbDsKKwkJfQorCQlpbnQgZmluYWxBYnN0cmFjdCA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdDsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIGZpbmFsQWJzdHJhY3QpID09IGZpbmFsQWJzdHJhY3QpIHsKKwkJCWFjY2Vzc0ZsYWdzICY9IH5maW5hbEFic3RyYWN0OworCQl9CiAJCXRoaXMuZW5jbG9zaW5nQ2xhc3NGaWxlID0gcGFyZW50Q2xhc3NGaWxlOwogCQkvLyBpbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWVzIGNvbXB1dGVkIGF0IGNvZGUgZ2VuIHRpbWUKIAogCQkvLyBub3cgd2UgY29udGludWUgdG8gZ2VuZXJhdGUgdGhlIGJ5dGVzIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKLQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsKLQkJaW50IGNsYXNzTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoYVR5cGUpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY2xhc3NOYW1lSW5kZXggPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzTmFtZUluZGV4OworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7CisJCWludCBjbGFzc05hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoYVR5cGUpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNsYXNzTmFtZUluZGV4ID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY2xhc3NOYW1lSW5kZXg7CiAJCWludCBzdXBlcmNsYXNzTmFtZUluZGV4OwogCQlpZiAoYVR5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJc3VwZXJjbGFzc05hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ09iamVjdENvbnN0YW50UG9vbE5hbWUpOworCQkJc3VwZXJjbGFzc05hbWVJbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSk7CiAJCX0gZWxzZSB7Ci0JCQlzdXBlcmNsYXNzTmFtZUluZGV4ID0KLQkJCQkoYVR5cGUuc3VwZXJjbGFzcyA9PSBudWxsID8gMCA6IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGFUeXBlLnN1cGVyY2xhc3MpKTsKKwkJCWlmIChhVHlwZS5zdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCQkgaWYgKChhVHlwZS5zdXBlcmNsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQlzdXBlcmNsYXNzTmFtZUluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdPYmplY3RDb25zdGFudFBvb2xOYW1lKTsKKwkJCQkgfSBlbHNlIHsKKwkJCQkJCXN1cGVyY2xhc3NOYW1lSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGFUeXBlLnN1cGVyY2xhc3MpOworCQkJCSB9CisJCQl9IGVsc2UgeworCQkJCXN1cGVyY2xhc3NOYW1lSW5kZXggPSAwOworCQkJfQogCQl9Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdXBlcmNsYXNzTmFtZUluZGV4ID4+IDgpOwotCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdXBlcmNsYXNzTmFtZUluZGV4OworCQl0aGlzLmNvbnRlbnRzW3RoaXMuY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN1cGVyY2xhc3NOYW1lSW5kZXggPj4gOCk7CisJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdXBlcmNsYXNzTmFtZUluZGV4OwogCQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzQmluZGluZyA9IGFUeXBlLnN1cGVySW50ZXJmYWNlcygpOwogCQlpbnQgaW50ZXJmYWNlc0NvdW50ID0gc3VwZXJJbnRlcmZhY2VzQmluZGluZy5sZW5ndGg7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlcmZhY2VzQ291bnQgPj4gOCk7Ci0JCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVyZmFjZXNDb3VudDsKKwkJaW50IGludGVyZmFjZXNDb3VudFBvc2l0aW9uID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOworCQlpbnQgaW50ZXJmYWNlQ291bnRlciA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlc0NvdW50OyBpKyspIHsKLQkJCWludCBpbnRlcmZhY2VJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHN1cGVySW50ZXJmYWNlc0JpbmRpbmdbaV0pOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGludGVyZmFjZUluZGV4ID4+IDgpOwotCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZXJmYWNlSW5kZXg7CisJCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSBzdXBlckludGVyZmFjZXNCaW5kaW5nW2ldOworCQkJaWYgKChiaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpbnRlcmZhY2VDb3VudGVyKys7CisJCQlpbnQgaW50ZXJmYWNlSW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKGJpbmRpbmcpOworCQkJdGhpcy5jb250ZW50c1t0aGlzLmNvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlcmZhY2VJbmRleCA+PiA4KTsKKwkJCXRoaXMuY29udGVudHNbdGhpcy5jb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlcmZhY2VJbmRleDsKIAkJfQorCQl0aGlzLmNvbnRlbnRzW2ludGVyZmFjZXNDb3VudFBvc2l0aW9uKytdID0gKGJ5dGUpIChpbnRlcmZhY2VDb3VudGVyID4+IDgpOworCQl0aGlzLmNvbnRlbnRzW2ludGVyZmFjZXNDb3VudFBvc2l0aW9uXSA9IChieXRlKSBpbnRlcmZhY2VDb3VudGVyOwogCQl0aGlzLmNyZWF0aW5nUHJvYmxlbVR5cGUgPSBjcmVhdGVQcm9ibGVtVHlwZTsKIAogCQkvLyByZXRyaWV2ZSB0aGUgZW5jbG9zaW5nIG9uZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHByb3BhZ2F0ZWQgZmxvdyBpbmZvCiAJCS8vIDFGRjlaQlU6IExGQ09NOkFMTCAtIExvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMgYnVzdGVkIChTYW5pdHkgY2hlY2spCi0JCWlmICh0aGlzLmVuY2xvc2luZ0NsYXNzRmlsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvZGVTdHJlYW0ubWF4RmllbGRDb3VudCA9IGFUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5tYXhGaWVsZENvdW50OwotCQl9IGVsc2UgewotCQkJQ2xhc3NGaWxlIG91dGVybW9zdENsYXNzRmlsZSA9IHRoaXMub3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCk7Ci0JCQl0aGlzLmNvZGVTdHJlYW0ubWF4RmllbGRDb3VudCA9IG91dGVybW9zdENsYXNzRmlsZS5jb2RlU3RyZWFtLm1heEZpZWxkQ291bnQ7CisJCXRoaXMuY29kZVN0cmVhbS5tYXhGaWVsZENvdW50ID0gYVR5cGUuc2NvcGUub3V0ZXJNb3N0Q2xhc3NTY29wZSgpLnJlZmVyZW5jZVR5cGUoKS5tYXhGaWVsZENvdW50OworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdExvY2FscyhTdGFja01hcEZyYW1lIGZyYW1lLAorCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLAorCQkJaW50IG1heExvY2FscywKKwkJCWludCBjb2RlTGVuZ3RoKSB7CisJCWlmIChtYXhMb2NhbHMgIT0gMCkgeworCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSAwOworCQkJLy8gdGFrZSBpbnRvIGFjY291bnQgZW51bSBjb25zdHJ1Y3RvciBzeW50aGV0aWMgbmFtZStvcmRpbmFsCisJCQlmaW5hbCBib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKTsKKwkJCWlmIChpc0NvbnN0cnVjdG9yIHx8ICFtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhDb25zdGFudFBvb2wuVGhpcywgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywgMCwgZmFsc2UpOworCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gPSAwOworCQkJCXRoaXMuY29kZVN0cmVhbS5yZWNvcmQobG9jYWxWYXJpYWJsZUJpbmRpbmcpOworCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQygwKTsKKwkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKGNvZGVMZW5ndGgpOworCQkJCWZyYW1lLnB1dExvY2FsKHJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygKKwkJCQkJCWlzQ29uc3RydWN0b3IgPyBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRURfVEhJUyA6IFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNULAorCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykpOworCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCX0KKworCQkJaWYgKGlzQ29uc3RydWN0b3IpIHsKKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZygiIG5hbWUiLnRvQ2hhckFycmF5KCksIHRoaXMucmVmZXJlbmNlQmluZGluZy5zY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpLCAwLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9IHJlc29sdmVkUG9zaXRpb247CisJCQkJCXRoaXMuY29kZVN0cmVhbS5yZWNvcmQobG9jYWxWYXJpYWJsZUJpbmRpbmcpOworCQkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoMCk7CisJCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEMoY29kZUxlbmd0aCk7CisKKwkJCQkJZnJhbWUucHV0TG9jYWwocmVzb2x2ZWRQb3NpdGlvbiwgbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKAorCQkJCQkJCVR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZywKKwkJCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lKSk7CisJCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKworCQkJCQlsb2NhbFZhcmlhYmxlQmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZygiIG9yZGluYWwiLnRvQ2hhckFycmF5KCksIFR5cGVCaW5kaW5nLklOVCwgMCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gPSByZXNvbHZlZFBvc2l0aW9uOworCQkJCQl0aGlzLmNvZGVTdHJlYW0ucmVjb3JkKGxvY2FsVmFyaWFibGVCaW5kaW5nKTsKKwkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKDApOworCQkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKGNvZGVMZW5ndGgpOworCQkJCQlmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLCBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oCisJCQkJCQkJVHlwZUJpbmRpbmcuSU5UKSk7CisJCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCQl9CisKKwkJCQkvLyB0YWtlIGludG8gYWNjb3VudCB0aGUgc3ludGhldGljIHBhcmFtZXRlcnMKKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKSkgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ0luc3RhbmNlVHlwZXNbXTsKKwkJCQkJaWYgKChlbmNsb3NpbmdJbnN0YW5jZVR5cGVzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkpICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbmNsb3NpbmdJbnN0YW5jZVR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJLy8gYW4gZW5jbG9zaW5nSW5zdGFuY2VUeXBlIGNhbiBvbmx5IGJlIGEgcmVmZXJlbmNlCisJCQkJCQkJLy8gYmluZGluZy4gSXQgY2Fubm90IGJlCisJCQkJCQkJLy8gTG9uZ0JpbmRpbmcgb3IgRG91YmxlQmluZGluZworCQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKCgiIGVuY2xvc2luZ1R5cGUiICsgaSkudG9DaGFyQXJyYXkoKSwgZW5jbG9zaW5nSW5zdGFuY2VUeXBlc1tpXSwgMCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9IHJlc29sdmVkUG9zaXRpb247CisJCQkJCQkJdGhpcy5jb2RlU3RyZWFtLnJlY29yZChsb2NhbFZhcmlhYmxlQmluZGluZyk7CisJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKDApOworCQkJCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEMoY29kZUxlbmd0aCk7CisKKwkJCQkJCQlmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLAorCQkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKGVuY2xvc2luZ0luc3RhbmNlVHlwZXNbaV0pKTsKKwkJCQkJCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKKwkJCQkJaWYgKChhcmd1bWVudHMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMpICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFyZ3VtZW50c1tpXTsKKwkJCQkJCQlmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLAorCQkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7CisJCQkJCQkJc3dpdGNoICh0eXBlQmluZGluZy5pZCkgeworCQkJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGU6CisJCQkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmc6CisJCQkJCQkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJndW1lbnRzW107CisJCQkJCWlmICgoc3ludGhldGljQXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkpICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXS50eXBlOworCQkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKCgiIHN5bnRoZXRpYyIgKyBpKS50b0NoYXJBcnJheSgpLCB0eXBlQmluZGluZywgMCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9IHJlc29sdmVkUG9zaXRpb247CisJCQkJCQkJdGhpcy5jb2RlU3RyZWFtLnJlY29yZChsb2NhbFZhcmlhYmxlQmluZGluZyk7CisJCQkJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKDApOworCQkJCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEMoY29kZUxlbmd0aCk7CisKKwkJCQkJCQlmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLAorCQkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7CisJCQkJCQkJc3dpdGNoICh0eXBlQmluZGluZy5pZCkgeworCQkJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGU6CisJCQkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmc6CisJCQkJCQkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKKwkJCQkJaWYgKChhcmd1bWVudHMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMpICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFyZ3VtZW50c1tpXTsKKwkJCQkJCQlmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLAorCQkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7CisJCQkJCQkJc3dpdGNoICh0eXBlQmluZGluZy5pZCkgeworCQkJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGU6CisJCQkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmc6CisJCQkJCQkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzOworCQkJCWlmICgoYXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzKSAhPSBudWxsKSB7CisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCWZpbmFsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYXJndW1lbnRzW2ldOworCQkJCQkJZnJhbWUucHV0TG9jYWwocmVzb2x2ZWRQb3NpdGlvbiwKKwkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7CisJCQkJCQlzd2l0Y2ggKHR5cGVCaW5kaW5nLmlkKSB7CisJCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlOgorCQkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmc6CisJCQkJCQkJCXJlc29sdmVkUG9zaXRpb24gKz0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcmVzb2x2ZWRQb3NpdGlvbisrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQogCQl9CiAJfQogCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUnVudGltZUludmlzaWJsZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZmluYWwgVHlwZUJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVkVHlwZTsKLQkJaWYgKGFubm90YXRpb25CaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxvY2Fscyhib29sZWFuIGlzU3RhdGljLCBpbnQgY3VycmVudFBDLCBTdGFja01hcEZyYW1lIGN1cnJlbnRGcmFtZSkgeworCQlWZXJpZmljYXRpb25UeXBlSW5mb1tdIGxvY2FscyA9IGN1cnJlbnRGcmFtZS5sb2NhbHM7CisJCWludCBsb2NhbHNMZW5ndGggPSBsb2NhbHMubGVuZ3RoOworCQlpbnQgaSA9IDA7CisJCWlmICghaXNTdGF0aWMpIHsKKwkJCS8vIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGZpcnN0IGxvY2FsIGlmIHRoZSBtZXRob2QgaXMgbm90IHN0YXRpYworCQkJaSA9IDE7CiAJCX0KLQkJbG9uZyBtZXRhVGFnQml0cyA9IGFubm90YXRpb25CaW5kaW5nLmdldEFubm90YXRpb25UYWdCaXRzKCk7IC8vIGNvdWxkIGJlIGZvcndhcmQgcmVmZXJlbmNlCi0JCWlmICgobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSA9PSAwKQotCQkJcmV0dXJuIHRydWU7IC8vIGJ5IGRlZmF1bHQgdGhlIHJldGVudGlvbiBpcyBDTEFTUwotCQkJCi0JCXJldHVybiAobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSA9PSBUYWdCaXRzLkFubm90YXRpb25DbGFzc1JldGVudGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSdW50aW1lVmlzaWJsZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZmluYWwgVHlwZUJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVkVHlwZTsKLQkJaWYgKGFubm90YXRpb25CaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKKwkJZm9yICg7IGkgPCBsb2NhbHNMZW5ndGg7IGkrKykgeworCQkJbG9jYWxzW2ldID0gbnVsbDsKIAkJfQotCQlsb25nIG1ldGFUYWdCaXRzID0gYW5ub3RhdGlvbkJpbmRpbmcuZ2V0QW5ub3RhdGlvblRhZ0JpdHMoKTsKLQkJaWYgKChtZXRhVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblJldGVudGlvbk1BU0spID09IDApCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGJ5IGRlZmF1bHQgdGhlIHJldGVudGlvbiBpcyBDTEFTUwotCQkJCi0JCXJldHVybiAobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSA9PSBUYWdCaXRzLkFubm90YXRpb25SdW50aW1lUmV0ZW50aW9uOworCQlpID0gMDsKKwkJbG9jYWxzOiBmb3IgKGludCBtYXggPSB0aGlzLmNvZGVTdHJlYW0uYWxsTG9jYWxzQ291bnRlcjsgaSA8IG1heDsgaSsrKSB7CisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gdGhpcy5jb2RlU3RyZWFtLmxvY2Fsc1tpXTsKKwkJCWlmIChsb2NhbFZhcmlhYmxlID09IG51bGwpIGNvbnRpbnVlOworCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247CisJCQlmaW5hbCBUeXBlQmluZGluZyBsb2NhbFZhcmlhYmxlVHlwZUJpbmRpbmcgPSBsb2NhbFZhcmlhYmxlLnR5cGU7CisJCQlpbml0czogZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgeworCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOworCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsKKwkJCQlpZiAoY3VycmVudFBDIDwgc3RhcnRQQykgeworCQkJCQljb250aW51ZSBpbml0czsKKwkJCQl9IGVsc2UgaWYgKGN1cnJlbnRQQyA8IGVuZFBDKSB7CisJCQkJCS8vIHRoZSBjdXJyZW50IGxvY2FsIGlzIGFuIGFjdGl2ZSBsb2NhbAorCQkJCQlpZiAoY3VycmVudEZyYW1lLmxvY2Fsc1tyZXNvbHZlZFBvc2l0aW9uXSA9PSBudWxsKSB7CisJCQkJCQljdXJyZW50RnJhbWUubG9jYWxzW3Jlc29sdmVkUG9zaXRpb25dID0KKwkJCQkJCQkJbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKAorCQkJCQkJCQkJCWxvY2FsVmFyaWFibGVUeXBlQmluZGluZyk7CisJCQkJCX0KKwkJCQkJY29udGludWUgbG9jYWxzOworCQkJCX0KKwkJCX0KKwkJfQogCX0KLQogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogUmV0dXJucyB0aGUgbW9zdCBlbmNsb3NpbmcgY2xhc3NmaWxlIG9mIHRoZSByZWNlaXZlci4gVGhpcyBpcyB1c2VkIGtub3cgdG8gc3RvcmUgdGhlIGNvbnN0YW50IHBvb2wgbmFtZQpAQCAtNTkzOCw5ICs0MTQzLDEzIEBACiAJCS8vIHRoZSBjb2RlIHN0cmVhbSBpcyByZWluaXRpYWxpemVkIGZvciBlYWNoIG1ldGhvZAogCQlmaW5hbCBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IHR5cGVCaW5kaW5nLnNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOwogCQl0aGlzLnJlZmVyZW5jZUJpbmRpbmcgPSB0eXBlQmluZGluZzsKKwkJdGhpcy5pc05lc3RlZFR5cGUgPSB0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKTsKIAkJdGhpcy50YXJnZXRKREsgPSBvcHRpb25zLnRhcmdldEpESzsKIAkJdGhpcy5wcm9kdWNlQXR0cmlidXRlcyA9IG9wdGlvbnMucHJvZHVjZURlYnVnQXR0cmlidXRlczsKIAkJaWYgKHRoaXMudGFyZ2V0SkRLID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYpIHsKKwkJCXRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQX1RBQkxFOworCQl9IGVsc2UgaWYgKHRoaXMudGFyZ2V0SkRLID09IENsYXNzRmlsZUNvbnN0YW50cy5DTERDXzFfMSkgeworCQkJdGhpcy50YXJnZXRKREsgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8xOyAvLyBwdXQgYmFjayA0NS4zCiAJCQl0aGlzLnByb2R1Y2VBdHRyaWJ1dGVzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUDsKIAkJfQogCQl0aGlzLmJ5dGVzID0gbnVsbDsKQEAgLTU5NTYsNiArNDE2NSw4IEBACiAJCWlmICh0aGlzLmlubmVyQ2xhc3Nlc0JpbmRpbmdzICE9IG51bGwpIHsKIAkJCXRoaXMuaW5uZXJDbGFzc2VzQmluZGluZ3MuY2xlYXIoKTsKIAkJfQorCQl0aGlzLm1pc3NpbmdUeXBlcyA9IG51bGw7CisJCXRoaXMudmlzaXRlZFR5cGVzID0gbnVsbDsKIAl9CiAKIAkvKioKQEAgLTU5NjksMTMgKzQxODAsMTMzOSBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIDAsIHRoaXMuY29udGVudHMgPSBuZXcgYnl0ZVtsZW5ndGggKyB0b0FkZF0sIDAsIGxlbmd0aCk7CiAJfQogCisJcHJpdmF0ZSBWZXJpZmljYXRpb25UeXBlSW5mbyByZXRyaWV2ZUxvY2FsKGludCBjdXJyZW50UEMsIGludCByZXNvbHZlZFBvc2l0aW9uKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmNvZGVTdHJlYW0uYWxsTG9jYWxzQ291bnRlcjsgaSA8IG1heDsgaSsrKSB7CisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gdGhpcy5jb2RlU3RyZWFtLmxvY2Fsc1tpXTsKKwkJCWlmIChsb2NhbFZhcmlhYmxlID09IG51bGwpIGNvbnRpbnVlOworCQkJaWYgKHJlc29sdmVkUG9zaXRpb24gPT0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uKSB7CisJCQkJaW5pdHM6IGZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50OyBqKyspIHsKKwkJCQkJaW50IHN0YXJ0UEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzW2ogPDwgMV07CisJCQkJCWludCBlbmRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbKGogPDwgMSkgKyAxXTsKKwkJCQkJaWYgKGN1cnJlbnRQQyA8IHN0YXJ0UEMpIHsKKwkJCQkJCWNvbnRpbnVlIGluaXRzOworCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRQQyA8IGVuZFBDKSB7CisJCQkJCQkvLyB0aGUgY3VycmVudCBsb2NhbCBpcyBhbiBhY3RpdmUgbG9jYWwKKwkJCQkJCXJldHVybiBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8obG9jYWxWYXJpYWJsZS50eXBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGludCBzY2FuVHlwZShjaGFyW10gbWV0aG9kU2lnbmF0dXJlLCBpbnQgaW5kZXgpIHsKKwkJc3dpdGNoIChtZXRob2RTaWduYXR1cmVbaW5kZXhdKSB7CisJCQljYXNlICdbJzoKKwkJCQkvLyBhcnJheSB0eXBlCisJCQkJcmV0dXJuIHNjYW5UeXBlKG1ldGhvZFNpZ25hdHVyZSwgaW5kZXggKyAxKTsKKwkJCWNhc2UgJ0wnOgorCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCBtZXRob2RTaWduYXR1cmUsIGluZGV4ICsgMSk7CisJCQljYXNlICdaJzoKKwkJCWNhc2UgJ0InOgorCQkJY2FzZSAnQyc6CisJCQljYXNlICdEJzoKKwkJCWNhc2UgJ0YnOgorCQkJY2FzZSAnSSc6CisJCQljYXNlICdKJzoKKwkJCWNhc2UgJ1MnOgorCQkJCXJldHVybiBpbmRleDsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJfQorCiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBUaGlzIG1ldGhvZHMgbGVhdmVzIHRoZSBzcGFjZSBmb3IgbWV0aG9kIGNvdW50cyByZWNvcmRpbmcuCiAJICovCiAJcHVibGljIHZvaWQgc2V0Rm9yTWV0aG9kSW5mb3MoKSB7CiAJCS8vIGxlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBtZXRob2RDb3VudAotCQltZXRob2RDb3VudE9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OwotCQljb250ZW50c09mZnNldCArPSAyOworCQl0aGlzLm1ldGhvZENvdW50T2Zmc2V0ID0gdGhpcy5jb250ZW50c09mZnNldDsKKwkJdGhpcy5jb250ZW50c09mZnNldCArPSAyOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgaW50IG1heExvY2FscywgYnl0ZVtdIGJ5dGVjb2RlcywgaW50IGNvZGVPZmZzZXQsIGludCBjb2RlTGVuZ3RoLCBBcnJheUxpc3QgZnJhbWVzLCBib29sZWFuIGlzQ2xpbml0KSB7CisJCVN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtIHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtID0gKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSB0aGlzLmNvZGVTdHJlYW07CisJCWludFtdIGZyYW1lUG9zaXRpb25zID0gc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uZ2V0RnJhbWVQb3NpdGlvbnMoKTsKKwkJaW50IHBjID0gY29kZU9mZnNldDsKKwkJaW50IGluZGV4OworCQlpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzID0gdGhpcy5jb25zdGFudFBvb2wub2Zmc2V0czsKKwkJYnl0ZVtdIHBvb2xDb250ZW50cyA9IHRoaXMuY29uc3RhbnRQb29sLnBvb2xDb250ZW50OworCisJCS8vIHNldCBpbml0aWFsIHZhbHVlcyBmb3IgZnJhbWUgcG9zaXRpb25zCisJCWludCBpbmRleEluRnJhbWVQb3NpdGlvbnMgPSAwOworCQlpbnQgZnJhbWVQb3NpdGlvbnNMZW5ndGggPSBmcmFtZVBvc2l0aW9ucy5sZW5ndGg7CisJCWludCBjdXJyZW50RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb25zWzBdOworCisJCS8vIHNldCBpbml0aWFsIHZhbHVlcyBmb3Igc3RhY2sgZGVwdGggbWFya2VycworCQlpbnQgaW5kZXhJblN0YWNrRGVwdGhNYXJrZXJzID0gMDsKKwkJU3RhY2tEZXB0aE1hcmtlcltdIHN0YWNrRGVwdGhNYXJrZXJzID0gc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uZ2V0U3RhY2tEZXB0aE1hcmtlcnMoKTsKKwkJaW50IHN0YWNrRGVwdGhNYXJrZXJzTGVuZ3RoID0gc3RhY2tEZXB0aE1hcmtlcnMgPT0gbnVsbCA/IDAgOiBzdGFja0RlcHRoTWFya2Vycy5sZW5ndGg7CisJCWJvb2xlYW4gaGFzU3RhY2tEZXB0aE1hcmtlcnMgPSBzdGFja0RlcHRoTWFya2Vyc0xlbmd0aCAhPSAwOworCQlTdGFja0RlcHRoTWFya2VyIHN0YWNrRGVwdGhNYXJrZXIgPSBudWxsOworCQlpZiAoaGFzU3RhY2tEZXB0aE1hcmtlcnMpIHsKKwkJCXN0YWNrRGVwdGhNYXJrZXIgPSBzdGFja0RlcHRoTWFya2Vyc1swXTsKKwkJfQorCisJCS8vIHNldCBpbml0aWFsIHZhbHVlcyBmb3Igc3RhY2sgbWFya2VycyAodXNlZCBvbmx5IGluIGNsZGMgbW9kZSkKKwkJaW50IGluZGV4SW5TdGFja01hcmtlcnMgPSAwOworCQlTdGFja01hcmtlcltdIHN0YWNrTWFya2VycyA9IHN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLmdldFN0YWNrTWFya2VycygpOworCQlpbnQgc3RhY2tNYXJrZXJzTGVuZ3RoID0gc3RhY2tNYXJrZXJzID09IG51bGwgPyAwIDogc3RhY2tNYXJrZXJzLmxlbmd0aDsKKwkJYm9vbGVhbiBoYXNTdGFja01hcmtlcnMgPSBzdGFja01hcmtlcnNMZW5ndGggIT0gMDsKKwkJU3RhY2tNYXJrZXIgc3RhY2tNYXJrZXIgPSBudWxsOworCQlpZiAoaGFzU3RhY2tNYXJrZXJzKSB7CisJCQlzdGFja01hcmtlciA9IHN0YWNrTWFya2Vyc1swXTsKKwkJfQorCisJCS8vIHNldCBpbml0aWFsIHZhbHVlcyBmb3IgZXhjZXB0aW9uIG1hcmtlcnMKKwkJaW50IGluZGV4SW5FeGNlcHRpb25NYXJrZXJzID0gMDsKKwkJRXhjZXB0aW9uTWFya2VyW10gZXhjZXB0aW9uTWFya2Vycz0gc3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uZ2V0RXhjZXB0aW9uTWFya2VycygpOworCQlpbnQgZXhjZXB0aW9uc01hcmtlcnNMZW5ndGggPSBleGNlcHRpb25NYXJrZXJzID09IG51bGwgPyAwIDogZXhjZXB0aW9uTWFya2Vycy5sZW5ndGg7CisJCWJvb2xlYW4gaGFzRXhjZXB0aW9uTWFya2VycyA9IGV4Y2VwdGlvbnNNYXJrZXJzTGVuZ3RoICE9IDA7CisJCUV4Y2VwdGlvbk1hcmtlciBleGNlcHRpb25NYXJrZXIgPSBudWxsOworCQlpZiAoaGFzRXhjZXB0aW9uTWFya2VycykgeworCQkJZXhjZXB0aW9uTWFya2VyID0gZXhjZXB0aW9uTWFya2Vyc1swXTsKKwkJfQorCisJCVN0YWNrTWFwRnJhbWUgZnJhbWUgPSBuZXcgU3RhY2tNYXBGcmFtZShtYXhMb2NhbHMpOworCQlpZiAoIWlzQ2xpbml0KSB7CisJCQlpbml0aWFsaXplRGVmYXVsdExvY2FscyhmcmFtZSwgbWV0aG9kQmluZGluZywgbWF4TG9jYWxzLCBjb2RlTGVuZ3RoKTsKKwkJfQorCQlmcmFtZS5wYyA9IC0xOworCQlmcmFtZXMuYWRkKGZyYW1lLmR1cGxpY2F0ZSgpKTsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWludCBjdXJyZW50UEMgPSBwYyAtIGNvZGVPZmZzZXQ7CisJCQlpZiAoaGFzU3RhY2tNYXJrZXJzICYmIHN0YWNrTWFya2VyLnBjID09IGN1cnJlbnRQQykgeworCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvW10gaW5mb3MgPSBmcmFtZS5zdGFja0l0ZW1zOworCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvW10gdGVtcEluZm9zID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtc107CisJCQkJU3lzdGVtLmFycmF5Y29weShpbmZvcywgMCwgdGVtcEluZm9zLCAwLCBmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMpOworCQkJCXN0YWNrTWFya2VyLnNldEluZm9zKHRlbXBJbmZvcyk7CisJCQl9IGVsc2UgaWYgKGhhc1N0YWNrTWFya2VycyAmJiBzdGFja01hcmtlci5kZXN0aW5hdGlvblBDID09IGN1cnJlbnRQQykgeworCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvW10gaW5mb3MgPSBzdGFja01hcmtlci5pbmZvczsKKwkJCQlmcmFtZS5zdGFja0l0ZW1zID0gaW5mb3M7CisJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID0gaW5mb3MubGVuZ3RoOworCQkJCWluZGV4SW5TdGFja01hcmtlcnMrKzsKKwkJCQlpZiAoaW5kZXhJblN0YWNrTWFya2VycyA8IHN0YWNrTWFya2Vyc0xlbmd0aCkgeworCQkJCQlzdGFja01hcmtlciA9IHN0YWNrTWFya2Vyc1tpbmRleEluU3RhY2tNYXJrZXJzXTsKKwkJCQl9IGVsc2UgeworCQkJCQloYXNTdGFja01hcmtlcnMgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaGFzU3RhY2tEZXB0aE1hcmtlcnMgJiYgc3RhY2tEZXB0aE1hcmtlci5wYyA9PSBjdXJyZW50UEMpIHsKKwkJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHN0YWNrRGVwdGhNYXJrZXIudHlwZUJpbmRpbmc7CisJCQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJaWYgKHN0YWNrRGVwdGhNYXJrZXIuZGVsdGEgPiAwKSB7CisJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCX0KKwkJCQlpbmRleEluU3RhY2tEZXB0aE1hcmtlcnMrKzsKKwkJCQlpZiAoaW5kZXhJblN0YWNrRGVwdGhNYXJrZXJzIDwgc3RhY2tEZXB0aE1hcmtlcnNMZW5ndGgpIHsKKwkJCQkJc3RhY2tEZXB0aE1hcmtlciA9IHN0YWNrRGVwdGhNYXJrZXJzW2luZGV4SW5TdGFja0RlcHRoTWFya2Vyc107CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFzU3RhY2tEZXB0aE1hcmtlcnMgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaGFzRXhjZXB0aW9uTWFya2VycyAmJiBleGNlcHRpb25NYXJrZXIucGMgPT0gY3VycmVudFBDKSB7CisJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID0gMDsKKwkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKDAsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNULCBleGNlcHRpb25NYXJrZXIuY29uc3RhbnRQb29sTmFtZSkpOworCQkJCWluZGV4SW5FeGNlcHRpb25NYXJrZXJzKys7CisJCQkJaWYgKGluZGV4SW5FeGNlcHRpb25NYXJrZXJzIDwgZXhjZXB0aW9uc01hcmtlcnNMZW5ndGgpIHsKKwkJCQkJZXhjZXB0aW9uTWFya2VyID0gZXhjZXB0aW9uTWFya2Vyc1tpbmRleEluRXhjZXB0aW9uTWFya2Vyc107CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFzRXhjZXB0aW9uTWFya2VycyA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCWlmIChjdXJyZW50RnJhbWVQb3NpdGlvbiA8IGN1cnJlbnRQQykgeworCQkJCWRvIHsKKwkJCQkJaW5kZXhJbkZyYW1lUG9zaXRpb25zKys7CisJCQkJCWlmIChpbmRleEluRnJhbWVQb3NpdGlvbnMgPCBmcmFtZVBvc2l0aW9uc0xlbmd0aCkgeworCQkJCQkJY3VycmVudEZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uc1tpbmRleEluRnJhbWVQb3NpdGlvbnNdOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gbm8gbW9yZSBmcmFtZSB0byBnZW5lcmF0ZQorCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSB3aGlsZSAoY3VycmVudEZyYW1lUG9zaXRpb24gPCBjdXJyZW50UEMpOworCQkJfQorCQkJaWYgKGN1cnJlbnRGcmFtZVBvc2l0aW9uID09IGN1cnJlbnRQQykgeworCQkJCS8vIG5lZWQgdG8gYnVpbGQgYSBuZXcgZnJhbWUgYW5kIGNyZWF0ZSBhIHN0YWNrIG1hcCBhdHRyaWJ1dGUgZW50cnkKKwkJCQlTdGFja01hcEZyYW1lIGN1cnJlbnRGcmFtZSA9IGZyYW1lLmR1cGxpY2F0ZSgpOworCQkJCWN1cnJlbnRGcmFtZS5wYyA9IGN1cnJlbnRQQzsKKwkJCQkvLyBpbml0aWFsaXplIGxvY2FscworCQkJCWluaXRpYWxpemVMb2NhbHMoaXNDbGluaXQgPyB0cnVlIDogbWV0aG9kQmluZGluZy5pc1N0YXRpYygpLCBjdXJyZW50UEMsIGN1cnJlbnRGcmFtZSk7CisJCQkJLy8gaW5zZXJ0IGEgbmV3IGZyYW1lCisJCQkJZnJhbWVzLmFkZChjdXJyZW50RnJhbWUpOworCQkJCWluZGV4SW5GcmFtZVBvc2l0aW9ucysrOworCQkJCWlmIChpbmRleEluRnJhbWVQb3NpdGlvbnMgPCBmcmFtZVBvc2l0aW9uc0xlbmd0aCkgeworCQkJCQljdXJyZW50RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb25zW2luZGV4SW5GcmFtZVBvc2l0aW9uc107CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gbm8gbW9yZSBmcmFtZSB0byBnZW5lcmF0ZQorCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJYnl0ZSBvcGNvZGUgPSAoYnl0ZSkgdTFBdChieXRlY29kZXMsIDAsIHBjKTsKKwkJCXN3aXRjaCAob3Bjb2RlKSB7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19ub3A6CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYWNvbnN0X251bGw6CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5OVUxMKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pY29uc3RfbTE6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pY29uc3RfMDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ljb25zdF8xOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWNvbnN0XzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pY29uc3RfMzoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ljb25zdF80OgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWNvbnN0XzU6CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xjb25zdF8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGNvbnN0XzE6CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5MT05HKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mY29uc3RfMDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Zjb25zdF8xOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZmNvbnN0XzI6CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5GTE9BVCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZGNvbnN0XzA6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kY29uc3RfMToKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkRPVUJMRSk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYmlwdXNoOgorCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuQllURSk7CisJCQkJCXBjICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfc2lwdXNoOgorCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuU0hPUlQpOworCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xkYzoKKwkJCQkJaW5kZXggPSB1MUF0KGJ5dGVjb2RlcywgMSwgcGMpOworCQkJCQlzd2l0Y2ggKHUxQXQocG9vbENvbnRlbnRzLCAwLCBjb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSkpIHsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLlN0cmluZ1RhZzoKKwkJCQkJCQlmcmFtZQorCQkJCQkJCQkJLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oCisJCQkJCQkJCQkJCVR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZywKKwkJCQkJCQkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuSW50ZWdlclRhZzoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkZsb2F0VGFnOgorCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5GTE9BVCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5DbGFzc1RhZzoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKAorCQkJCQkJCQkJVHlwZUlkcy5UX0phdmFMYW5nQ2xhc3MsCisJCQkJCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUpKTsKKwkJCQkJfQorCQkJCQlwYyArPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xkY193OgorCQkJCQlpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAxLCBwYyk7CisJCQkJCXN3aXRjaCAodTFBdChwb29sQ29udGVudHMsIDAsIGNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKSkgeworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuU3RyaW5nVGFnOgorCQkJCQkJCWZyYW1lCisJCQkJCQkJCQkuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygKKwkJCQkJCQkJCQkJVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nLAorCQkJCQkJCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5JbnRlZ2VyVGFnOgorCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuRmxvYXRUYWc6CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkNsYXNzVGFnOgorCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oCisJCQkJCQkJCQlUeXBlSWRzLlRfSmF2YUxhbmdDbGFzcywKKwkJCQkJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSkpOworCQkJCQl9CisJCQkJCXBjICs9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGRjMl93OgorCQkJCQlpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAxLCBwYyk7CisJCQkJCXN3aXRjaCAodTFBdChwb29sQ29udGVudHMsIDAsIGNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKSkgeworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuRG91YmxlVGFnOgorCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTG9uZ1RhZzoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuTE9ORyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbG9hZDoKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7CisJCQkJCXBjICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGxvYWQ6CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5MT05HKTsKKwkJCQkJcGMgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mbG9hZDoKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJcGMgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kbG9hZDoKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkRPVUJMRSk7CisJCQkJCXBjICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYWxvYWQ6CisJCQkJCWluZGV4ID0gdTFBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gbG9jYWxzTiA9IHJldHJpZXZlTG9jYWwoY3VycmVudFBDLCBpbmRleCk7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShsb2NhbHNOKTsKKwkJCQkJcGMgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbG9hZF8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWxvYWRfMToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lsb2FkXzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbG9hZF8zOgorCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sbG9hZF8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGxvYWRfMToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xsb2FkXzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sbG9hZF8zOgorCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuTE9ORyk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZmxvYWRfMDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Zsb2FkXzE6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mbG9hZF8yOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZmxvYWRfMzoKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kbG9hZF8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZGxvYWRfMToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Rsb2FkXzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kbG9hZF8zOgorCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRE9VQkxFKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hbG9hZF8wOgorCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBsb2NhbHMwID0gZnJhbWUubG9jYWxzWzBdOworCQkJCQlpZiAobG9jYWxzMCA9PSBudWxsIHx8IGxvY2FsczAudGFnICE9IFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRF9USElTKSB7CisJCQkJCQkvLyBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIHVuaW5pdGlhbGl6ZWQgb2JqZWN0CisJCQkJCQlsb2NhbHMwID0gcmV0cmlldmVMb2NhbChjdXJyZW50UEMsIDApOworCQkJCQl9CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShsb2NhbHMwKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hbG9hZF8xOgorCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBsb2NhbHMxID0gcmV0cmlldmVMb2NhbChjdXJyZW50UEMsIDEpOworCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obG9jYWxzMSk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYWxvYWRfMjoKKwkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gbG9jYWxzMiA9IHJldHJpZXZlTG9jYWwoY3VycmVudFBDLCAyKTsKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGxvY2FsczIpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Fsb2FkXzM6CisJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGxvY2FsczMgPSByZXRyaWV2ZUxvY2FsKGN1cnJlbnRQQywgMyk7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShsb2NhbHMzKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pYWxvYWQ6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xhbG9hZDoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09MjsKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ZhbG9hZDoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09MjsKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kYWxvYWQ6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2FhbG9hZDoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCWZyYW1lLnJlcGxhY2VXaXRoRWxlbWVudFR5cGUoKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19iYWxvYWQ6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19jYWxvYWQ6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19zYWxvYWQ6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5TSE9SVCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaXN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbHN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZHN0b3JlOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJcGMgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hc3RvcmU6CisJCQkJCWluZGV4ID0gdTFBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYXN0b3JlXzA6CisJCQkJCWZyYW1lLmxvY2Fsc1swXSA9IGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2FzdG9yZV8xOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYXN0b3JlXzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hc3RvcmVfMzoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lzdG9yZV8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaXN0b3JlXzE6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pc3RvcmVfMjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lzdG9yZV8zOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbHN0b3JlXzA6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sc3RvcmVfMToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xzdG9yZV8yOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbHN0b3JlXzM6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mc3RvcmVfMDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ZzdG9yZV8xOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnN0b3JlXzI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mc3RvcmVfMzoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RzdG9yZV8wOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZHN0b3JlXzE6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kc3RvcmVfMjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RzdG9yZV8zOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pYXN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGFzdG9yZToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Zhc3RvcmU6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kYXN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYWFzdG9yZToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2Jhc3RvcmU6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19jYXN0b3JlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfc2FzdG9yZToKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0zOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX3BvcDoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfcG9wMjoKKwkJCQkJaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IGZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKKwkJCQkJc3dpdGNoKGZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0uaWQoKSkgeworCQkJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKKwkJCQkJfQorCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2R1cDoKKwkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2R1cF94MToKKwkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMiA9IGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kdXBfeDI6CisJCQkJCWluZm8gPSBmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdOworCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJaW5mbzIgPSBmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdOworCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJc3dpdGNoKGluZm8yLmlkKCkpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCW51bWJlck9mU3RhY2tJdGVtcyA9IGZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKKwkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMyA9IGZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCX0KKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kdXAyOgorCQkJCQlpbmZvID0gZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlpbmZvMiA9IGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCX0KKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kdXAyX3gxOgorCQkJCQlpbmZvID0gZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCWluZm8yID0gZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8zID0gZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOworCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzMpOworCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQl9CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZHVwMl94MjoKKwkJCQkJbnVtYmVyT2ZTdGFja0l0ZW1zID0gZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOworCQkJCQlpbmZvID0gZnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCWluZm8yID0gZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXN3aXRjaChpbmZvLmlkKCkpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQlzd2l0Y2goaW5mbzIuaWQoKSkgeworCQkJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQkJCS8vIGZvcm0gNAorCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJLy8gZm9ybSAyCisJCQkJCQkJCQludW1iZXJPZlN0YWNrSXRlbXMgPSBmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7CisJCQkJCQkJCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMyA9IGZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7CisJCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJbnVtYmVyT2ZTdGFja0l0ZW1zID0gZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOworCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8zID0gZnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJCQlzd2l0Y2goaW5mbzMuaWQoKSkgeworCQkJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQkJCS8vIGZvcm0gMworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7CisJCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkvLyBmb3JtIDEKKwkJCQkJCQkJCW51bWJlck9mU3RhY2tJdGVtcyA9IGZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKKwkJCQkJCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm80ID0gZnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKKwkJCQkJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvNCk7CisJCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzMpOworCQkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKKwkJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKKwkJCQkJCQl9CisJCQkJCX0KKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19zd2FwOgorCQkJCQludW1iZXJPZlN0YWNrSXRlbXMgPSBmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7CisJCQkJCWluZm8gPSBmcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdOworCQkJCQlpbmZvMiA9IGZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMl07CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBpbmZvMjsKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAyXSA9IGluZm87CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWFkZDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xhZGQ6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mYWRkOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZGFkZDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lzdWI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sc3ViOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnN1YjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RzdWI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbXVsOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbG11bDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ZtdWw6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kbXVsOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWRpdjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2xkaXY6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mZGl2OgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZGRpdjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lyZW06CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19scmVtOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnJlbToKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RyZW06CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pc2hsOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbHNobDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lzaHI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sc2hyOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaXVzaHI6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sdXNocjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lhbmQ6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sYW5kOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaW9yOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbG9yOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaXhvcjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2x4b3I6CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2luZWc6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sbmVnOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZm5lZzoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RuZWc6CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWluYzoKKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pMmw6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuTE9ORyk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaTJmOgorCQkJCQlmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pMmQ6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRE9VQkxFKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sMmk6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sMmY6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRkxPQVQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2wyZDoKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2YyaToKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2YybDoKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5MT05HKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19mMmQ6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRE9VQkxFKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kMmk6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kMmw6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuTE9ORyk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZDJmOgorCQkJCQlmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pMmI6CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQllURSk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaTJjOgorCQkJCQlmcmFtZS5zdGFja0l0ZW1zW2ZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkNIQVIpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2kyczoKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5TSE9SVCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbGNtcDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ZjbXBsOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZmNtcGc6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19kY21wbDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RjbXBnOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTI7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lmZXE6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pZm5lOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZsdDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lmZ2U6CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pZmd0OgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZsZToKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjICs9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcGVxOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcG5lOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcGx0OgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcGdlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcGd0OgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfaWNtcGxlOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfYWNtcGVxOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWZfYWNtcG5lOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19nb3RvOgorCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX3RhYmxlc3dpdGNoOgorCQkJCQlwYysrOworCQkJCQl3aGlsZSAoKChwYyAtIGNvZGVPZmZzZXQpICYgMHgwMykgIT0gMCkgeworCQkJCQkJcGMrKzsKKwkJCQkJfQorCQkJCQlwYyArPSA0OyAvLyBkZWZhdWx0CisJCQkJCWludCBsb3cgPSBpNEF0KGJ5dGVjb2RlcywgMCwgcGMpOworCQkJCQlwYyArPSA0OworCQkJCQlpbnQgaGlnaCA9IGk0QXQoYnl0ZWNvZGVzLCAwLCBwYyk7CisJCQkJCXBjICs9IDQ7CisJCQkJCWludCBsZW5ndGggPSBoaWdoIC0gbG93ICsgMTsKKwkJCQkJcGMgKz0gKGxlbmd0aCAqIDQpOworCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19sb29rdXBzd2l0Y2g6CisJCQkJCXBjKys7CisJCQkJCXdoaWxlICgoKHBjIC0gY29kZU9mZnNldCkgJiAweDAzKSAhPSAwKSB7CisJCQkJCQlwYysrOworCQkJCQl9CisJCQkJCXBjICs9IDQ7IC8vIGRlZmF1bHQKKwkJCQkJaW50IG5wYWlycyA9IChpbnQpIHU0QXQoYnl0ZWNvZGVzLCAwLCBwYyk7CisJCQkJCXBjICs9ICg0ICsgbnBhaXJzICogOCk7CisJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lyZXR1cm46CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19scmV0dXJuOgorCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnJldHVybjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2RyZXR1cm46CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hcmV0dXJuOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19yZXR1cm46CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZ2V0c3RhdGljOgorCQkJCQlpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAxLCBwYyk7CisJCQkJCWludCBuYW1lQW5kVHlwZUluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpbmRleF0pOworCQkJCQlpbnQgdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCWNoYXJbXSBkZXNjcmlwdG9yID0gdXRmOEF0KHBvb2xDb250ZW50cywKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0gKyAzLCB1MkF0KAorCQkJCQkJCQkJcG9vbENvbnRlbnRzLCAxLAorCQkJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdKSk7CisJCQkJCWlmIChkZXNjcmlwdG9yLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkvLyBiYXNlIHR5cGUKKwkJCQkJCXN3aXRjaChkZXNjcmlwdG9yWzBdKSB7CisJCQkJCQkJY2FzZSAnWic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRCc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdKJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdTJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLlNIT1JUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoZGVzY3JpcHRvclswXSA9PSAnWycpIHsKKwkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgZGVzY3JpcHRvcikpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGRlc2NyaXB0b3IsIDEsIGRlc2NyaXB0b3IubGVuZ3RoIC0gMSkpKTsKKwkJCQkJfQorCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX3B1dHN0YXRpYzoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjICs9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZ2V0ZmllbGQ6CisJCQkJCWluZGV4ID0gdTJBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKTsKKwkJCQkJdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCWRlc2NyaXB0b3IgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCWlmIChkZXNjcmlwdG9yLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkvLyBiYXNlIHR5cGUKKwkJCQkJCXN3aXRjaChkZXNjcmlwdG9yWzBdKSB7CisJCQkJCQkJY2FzZSAnWic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRCc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdKJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdTJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLlNIT1JUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoZGVzY3JpcHRvclswXSA9PSAnWycpIHsKKwkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgZGVzY3JpcHRvcikpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGRlc2NyaXB0b3IsIDEsIGRlc2NyaXB0b3IubGVuZ3RoIC0gMSkpKTsKKwkJCQkJfQorCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX3B1dGZpZWxkOgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsOgorCQkJCQlpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAxLCBwYyk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMywKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSk7CisJCQkJCXV0ZjhpbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbbmFtZUFuZFR5cGVJbmRleF0pOworCQkJCQlkZXNjcmlwdG9yID0gdXRmOEF0KHBvb2xDb250ZW50cywKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0gKyAzLCB1MkF0KAorCQkJCQkJCQkJcG9vbENvbnRlbnRzLCAxLAorCQkJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdKSk7CisJCQkJCXV0ZjhpbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAxLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbbmFtZUFuZFR5cGVJbmRleF0pOworCQkJCQljaGFyW10gbmFtZSA9IHV0ZjhBdChwb29sQ29udGVudHMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdICsgMywgdTJBdCgKKwkJCQkJCQkJCXBvb2xDb250ZW50cywgMSwKKwkJCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSkpOworCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gKGdldFBhcmFtZXRlcnNDb3VudChkZXNjcmlwdG9yKSArIDEpOworCQkJCQljaGFyW10gcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUoZGVzY3JpcHRvcik7CisJCQkJCWlmIChyZXR1cm5UeXBlLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkvLyBiYXNlIHR5cGUKKwkJCQkJCXN3aXRjaChyZXR1cm5UeXBlWzBdKSB7CisJCQkJCQkJY2FzZSAnWic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRCc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdKJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdTJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLlNIT1JUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAocmV0dXJuVHlwZVswXSA9PSAnWycpIHsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKDAsIHJldHVyblR5cGUpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHJldHVyblR5cGUsIDEsIHJldHVyblR5cGUubGVuZ3RoIC0gMSkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWw6CisJCQkJCWluZGV4ID0gdTJBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKTsKKwkJCQkJdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCWRlc2NyaXB0b3IgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDEsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCW5hbWUgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IGdldFBhcmFtZXRlcnNDb3VudChkZXNjcmlwdG9yKTsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKENvbnN0YW50UG9vbC5Jbml0LCBuYW1lKSkgeworCQkJCQkJLy8gY29uc3RydWN0b3IKKwkJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0udGFnID0gVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1Q7CisJCQkJCX0KKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKGRlc2NyaXB0b3IpOworCQkJCQlpZiAocmV0dXJuVHlwZS5sZW5ndGggPT0gMSkgeworCQkJCQkJLy8gYmFzZSB0eXBlCisJCQkJCQlzd2l0Y2gocmV0dXJuVHlwZVswXSkgeworCQkJCQkJCWNhc2UgJ1onOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0InOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuQllURSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0MnOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuQ0hBUik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0QnOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRE9VQkxFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5GTE9BVCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0knOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5MT05HKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnUyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5TSE9SVCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHJldHVyblR5cGVbMF0gPT0gJ1snKSB7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCByZXR1cm5UeXBlKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgQ2hhck9wZXJhdGlvbi5zdWJhcnJheShyZXR1cm5UeXBlLCAxLCByZXR1cm5UeXBlLmxlbmd0aCAtIDEpKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWM6CisJCQkJCWluZGV4ID0gdTJBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKTsKKwkJCQkJdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCWRlc2NyaXB0b3IgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJdXRmOGluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDEsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lQW5kVHlwZUluZGV4XSk7CisJCQkJCW5hbWUgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IGdldFBhcmFtZXRlcnNDb3VudChkZXNjcmlwdG9yKTsKKwkJCQkJcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUoZGVzY3JpcHRvcik7CisJCQkJCWlmIChyZXR1cm5UeXBlLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkvLyBiYXNlIHR5cGUKKwkJCQkJCXN3aXRjaChyZXR1cm5UeXBlWzBdKSB7CisJCQkJCQkJY2FzZSAnWic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRCc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdKJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdTJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLlNIT1JUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAocmV0dXJuVHlwZVswXSA9PSAnWycpIHsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKDAsIHJldHVyblR5cGUpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHJldHVyblR5cGUsIDEsIHJldHVyblR5cGUubGVuZ3RoIC0gMSkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2ludm9rZWludGVyZmFjZToKKwkJCQkJaW5kZXggPSB1MkF0KGJ5dGVjb2RlcywgMSwgcGMpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gdTJBdChwb29sQ29udGVudHMsIDMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpbmRleF0pOworCQkJCQl1dGY4aW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMywKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW25hbWVBbmRUeXBlSW5kZXhdKTsKKwkJCQkJZGVzY3JpcHRvciA9IHV0ZjhBdChwb29sQ29udGVudHMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdICsgMywgdTJBdCgKKwkJCQkJCQkJCXBvb2xDb250ZW50cywgMSwKKwkJCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSkpOworCQkJCQl1dGY4aW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMSwKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW25hbWVBbmRUeXBlSW5kZXhdKTsKKwkJCQkJbmFtZSA9IHV0ZjhBdChwb29sQ29udGVudHMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdICsgMywgdTJBdCgKKwkJCQkJCQkJCXBvb2xDb250ZW50cywgMSwKKwkJCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSkpOworCQkJCQkvLyB3ZSBkb24ndCBuZWVkIGNvdW50IGFuZCBhcmdzCisJCQkJCS8vIHUxQXQoYnl0ZWNvZGVzLCAzLCBwYyk7IC8vIGNvdW50CisJCQkJCS8vIHUxQXQoYnl0ZWNvZGVzLCA0LCBwYyk7IC8vIGV4dHJhIGFyZ3MKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IChnZXRQYXJhbWV0ZXJzQ291bnQoZGVzY3JpcHRvcikgKyAxKTsKKwkJCQkJcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUoZGVzY3JpcHRvcik7CisJCQkJCWlmIChyZXR1cm5UeXBlLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkvLyBiYXNlIHR5cGUKKwkJCQkJCXN3aXRjaChyZXR1cm5UeXBlWzBdKSB7CisJCQkJCQkJY2FzZSAnWic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQic6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5CWVRFKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5DSEFSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRCc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkZMT0FUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdKJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdTJzoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLlNIT1JUKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAocmV0dXJuVHlwZVswXSA9PSAnWycpIHsKKwkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKDAsIHJldHVyblR5cGUpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHJldHVyblR5cGUsIDEsIHJldHVyblR5cGUubGVuZ3RoIC0gMSkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwYyArPSA1OworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX25ldzoKKwkJCQkJaW5kZXggPSB1MkF0KGJ5dGVjb2RlcywgMSwgcGMpOworCQkJCQl1dGY4aW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMSwKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSk7CisJCQkJCWNoYXJbXSBjbGFzc05hbWUgPSB1dGY4QXQocG9vbENvbnRlbnRzLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSArIDMsIHUyQXQoCisJCQkJCQkJCQlwb29sQ29udGVudHMsIDEsCisJCQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0pKTsKKwkJCQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gdmVyaWZpY2F0aW9uVHlwZUluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCBjbGFzc05hbWUpOworCQkJCQl2ZXJpZmljYXRpb25UeXBlSW5mby5vZmZzZXQgPSBjdXJyZW50UEM7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbSh2ZXJpZmljYXRpb25UeXBlSW5mbyk7CisJCQkJCXBjICs9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfbmV3YXJyYXk6CisJCQkJCWNoYXJbXSBjb25zdGFudFBvb2xOYW1lID0gbnVsbDsKKwkJCQkJc3dpdGNoICh1MUF0KGJ5dGVjb2RlcywgMSwgcGMpKSB7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5JTlRfQVJSQVkgOgorCQkJCQkJCWNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnSScgfTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkJZVEVfQVJSQVkgOgorCQkJCQkJCWNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnQicgfTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkJPT0xFQU5fQVJSQVkgOgorCQkJCQkJCWNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnWicgfTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLlNIT1JUX0FSUkFZIDoKKwkJCQkJCQljb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbXSB7ICdbJywgJ1MnIH07CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5DSEFSX0FSUkFZIDoKKwkJCQkJCQljb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbXSB7ICdbJywgJ0MnIH07CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5MT05HX0FSUkFZIDoKKwkJCQkJCQljb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbXSB7ICdbJywgJ0onIH07CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5GTE9BVF9BUlJBWSA6CisJCQkJCQkJY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW10geyAnWycsICdGJyB9OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuRE9VQkxFX0FSUkFZIDoKKwkJCQkJCQljb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbXSB7ICdbJywgJ0QnIH07CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QsIGNvbnN0YW50UG9vbE5hbWUpOworCQkJCQlwYyArPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2FuZXdhcnJheToKKwkJCQkJaW5kZXggPSB1MkF0KGJ5dGVjb2RlcywgMSwgcGMpOworCQkJCQl1dGY4aW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMSwKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSk7CisJCQkJCWNsYXNzTmFtZSA9IHV0ZjhBdChwb29sQ29udGVudHMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdICsgMywgdTJBdCgKKwkJCQkJCQkJCXBvb2xDb250ZW50cywgMSwKKwkJCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSkpOworCQkJCQlpbnQgY2xhc3NOYW1lTGVuZ3RoID0gY2xhc3NOYW1lLmxlbmd0aDsKKwkJCQkJaWYgKGNsYXNzTmFtZVswXSAhPSAnWycpIHsKKwkJCQkJCS8vIHRoaXMgaXMgYSB0eXBlIG5hbWUgKGNsYXNzIG9yIGludGVyZmFjZSkuIFNvIHdlIGFkZCBhcHByb3ByaWF0ZSAnWycsICdMJyBhbmQgJzsnLgorCQkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc05hbWUsIDAsIChjb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbY2xhc3NOYW1lTGVuZ3RoICsgM10pLCAyLCBjbGFzc05hbWVMZW5ndGgpOworCQkJCQkJY29uc3RhbnRQb29sTmFtZVswXSA9ICdbJzsKKwkJCQkJCWNvbnN0YW50UG9vbE5hbWVbMV0gPSAnTCc7CisJCQkJCQljb25zdGFudFBvb2xOYW1lW2NsYXNzTmFtZUxlbmd0aCArIDJdID0gJzsnOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaWYgY2xhc3MgbmFtZSBpcyBhbHJlYWR5IGFuIGFycmF5LCB3ZSBqdXN0IG5lZWQgdG8gYWRkIG9uZSBkaW1lbnNpb24KKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NOYW1lLCAwLCAoY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW2NsYXNzTmFtZUxlbmd0aCArIDFdKSwgMSwgY2xhc3NOYW1lTGVuZ3RoKTsKKwkJCQkJCWNvbnN0YW50UG9vbE5hbWVbMF0gPSAnWyc7CisJCQkJCX0KKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbygwLCBjb25zdGFudFBvb2xOYW1lKTsKKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19hcnJheWxlbmd0aDoKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2F0aHJvdzoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfY2hlY2tjYXN0OgorCQkJCQlpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAxLCBwYyk7CisJCQkJCXV0ZjhpbmRleCA9IHUyQXQocG9vbENvbnRlbnRzLCAxLAorCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdKTsKKwkJCQkJY2xhc3NOYW1lID0gdXRmOEF0KHBvb2xDb250ZW50cywKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3V0ZjhpbmRleF0gKyAzLCB1MkF0KAorCQkJCQkJCQkJcG9vbENvbnRlbnRzLCAxLAorCQkJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdKSk7CisJCQkJCWZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgY2xhc3NOYW1lKTsKKwkJCQkJcGMgKz0gMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19pbnN0YW5jZW9mOgorCQkJCQkvLyBubyBuZWVkIHRvIGtub3cgdGhlIGNsYXNzIGluZGV4ID0gdTJBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJZnJhbWUuc3RhY2tJdGVtc1tmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOworCQkJCQlwYyArPSAzOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX21vbml0b3JlbnRlcjoKKwkJCQljYXNlIE9wY29kZXMuT1BDX21vbml0b3JleGl0OgorCQkJCQlmcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ193aWRlOgorCQkJCQlvcGNvZGUgPSAoYnl0ZSkgdTFBdChieXRlY29kZXMsIDEsIHBjKTsKKwkJCQkJaWYgKG9wY29kZSA9PSBPcGNvZGVzLk9QQ19paW5jKSB7CisJCQkJCQkvLyBpbmRleCA9IHUyQXQoYnl0ZWNvZGVzLCAyLCBwYyk7CisJCQkJCQkvLyBpMkF0KGJ5dGVjb2RlcywgNCwgcGMpOyAvLyBjb25zdAorCQkJCQkJLy8gd2UgZG9uJ3QgbmVlZCB0aGUgaW5kZXggYW5kIHRoZSBjb25zdCB2YWx1ZQorCQkJCQkJcGMgKz0gNjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWluZGV4ID0gdTJBdChieXRlY29kZXMsIDIsIHBjKTsKKwkJCQkJCS8vIG5lZWQgdG8gaGFuZGxlIGlsb2FkLCBmbG9hZCwgYWxvYWQsIGxsb2FkLCBkbG9hZCwgaXN0b3JlLCBmc3RvcmUsIGFzdG9yZSwgbHN0b3JlIG9yIGRzdG9yZQorCQkJCQkJc3dpdGNoKG9wY29kZSkgeworCQkJCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaWxvYWQgOgorCQkJCQkJCQlmcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBPcGNvZGVzLk9QQ19mbG9hZCA6CisJCQkJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5GTE9BVCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYWxvYWQgOgorCQkJCQkJCQlsb2NhbHNOID0gZnJhbWUubG9jYWxzW2luZGV4XTsKKwkJCQkJCQkJaWYgKGxvY2Fsc04gPT0gbnVsbCkgeworCQkJCQkJCQkJbG9jYWxzTiA9IHJldHJpZXZlTG9jYWwoY3VycmVudFBDLCBpbmRleCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKGxvY2Fsc04pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIE9wY29kZXMuT1BDX2xsb2FkIDoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIE9wY29kZXMuT1BDX2Rsb2FkIDoKKwkJCQkJCQkJZnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkRPVUJMRSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgT3Bjb2Rlcy5PUENfaXN0b3JlIDoKKwkJCQkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZnN0b3JlIDoKKwkJCQkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgT3Bjb2Rlcy5PUENfYXN0b3JlIDoKKwkJCQkJCQkJZnJhbWUubG9jYWxzW2luZGV4XSA9IGZyYW1lLnN0YWNrSXRlbXNbZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07CisJCQkJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIE9wY29kZXMuT1BDX2xzdG9yZSA6CisJCQkJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIE9wY29kZXMuT1BDX2RzdG9yZSA6CisJCQkJCQkJCWZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBjICs9IDQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcGNvZGVzLk9QQ19tdWx0aWFuZXdhcnJheToKKwkJCQkJaW5kZXggPSB1MkF0KGJ5dGVjb2RlcywgMSwgcGMpOworCQkJCQl1dGY4aW5kZXggPSB1MkF0KHBvb2xDb250ZW50cywgMSwKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSk7CisJCQkJCWNsYXNzTmFtZSA9IHV0ZjhBdChwb29sQ29udGVudHMsCisJCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1dGY4aW5kZXhdICsgMywgdTJBdCgKKwkJCQkJCQkJCXBvb2xDb250ZW50cywgMSwKKwkJCQkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdXRmOGluZGV4XSkpOworCQkJCQlpbnQgZGltZW5zaW9ucyA9IHUxQXQoYnl0ZWNvZGVzLCAzLCBwYyk7IC8vIGRpbWVuc2lvbnMKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IGRpbWVuc2lvbnM7CisJCQkJCWNsYXNzTmFtZUxlbmd0aCA9IGNsYXNzTmFtZS5sZW5ndGg7CisJCQkJCWNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltjbGFzc05hbWVMZW5ndGggKyBkaW1lbnNpb25zXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKwkJCQkJCWNvbnN0YW50UG9vbE5hbWVbaV0gPSAnWyc7CisJCQkJCX0KKwkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc05hbWUsIDAsIGNvbnN0YW50UG9vbE5hbWUsIGRpbWVuc2lvbnMsIGNsYXNzTmFtZUxlbmd0aCk7CisJCQkJCWZyYW1lLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oMCwgY29uc3RhbnRQb29sTmFtZSkpOworCQkJCQlwYyArPSA0OworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lmbnVsbDoKKwkJCQljYXNlIE9wY29kZXMuT1BDX2lmbm9ubnVsbDoKKwkJCQkJZnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07CisJCQkJCXBjICs9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT3Bjb2Rlcy5PUENfZ290b193OgorCQkJCQlwYyArPSA1OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiAvLyBzaG91bGQgbm90IG9jY3VyCisJCQkJCXRoaXMuY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKKwkJCQkJCQlNZXNzYWdlcy5iaW5kKAorCQkJCQkJCQkJTWVzc2FnZXMuYWJvcnRfaW52YWxpZE9wY29kZSwKKwkJCQkJCQkJCW5ldyBPYmplY3RbXSB7CisJCQkJCQkJCQkJbmV3IEJ5dGUob3Bjb2RlKSwKKwkJCQkJCQkJCQluZXcgSW50ZWdlcihwYyksCisJCQkJCQkJCQkJbmV3IFN0cmluZyhtZXRob2RCaW5kaW5nLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkJCQkJfSksCisJCQkJCQkJdGhpcy5jb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwYyA+PSAoY29kZUxlbmd0aCArIGNvZGVPZmZzZXQpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIGludCB1MUF0KGJ5dGVbXSByZWZlcmVuY2UsIGludCByZWxhdGl2ZU9mZnNldCwKKwkJCWludCBzdHJ1Y3RPZmZzZXQpIHsKKwkJcmV0dXJuIChyZWZlcmVuY2VbcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXRdICYgMHhGRik7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBpbnQgdTJBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsCisJCQlpbnQgc3RydWN0T2Zmc2V0KSB7CisJCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCQlyZXR1cm4gKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCA4KQorCQkJCSsgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIGxvbmcgdTRBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsCisJCQlpbnQgc3RydWN0T2Zmc2V0KSB7CisJCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCQlyZXR1cm4gKCgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRkwpIDw8IDI0KQorCQkJCSsgKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAxNikKKwkJCQkrICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkgKyAocmVmZXJlbmNlW3Bvc2l0aW9uXSAmIDB4RkYpKTsKKwl9CisKKwlwdWJsaWMgY2hhcltdIHV0ZjhBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgYWJzb2x1dGVPZmZzZXQsCisJCQlpbnQgYnl0ZXNBdmFpbGFibGUpIHsKKwkJaW50IGxlbmd0aCA9IGJ5dGVzQXZhaWxhYmxlOworCQljaGFyIG91dHB1dEJ1ZltdID0gbmV3IGNoYXJbYnl0ZXNBdmFpbGFibGVdOworCQlpbnQgb3V0cHV0UG9zID0gMDsKKwkJaW50IHJlYWRPZmZzZXQgPSBhYnNvbHV0ZU9mZnNldDsKKworCQl3aGlsZSAobGVuZ3RoICE9IDApIHsKKwkJCWludCB4ID0gcmVmZXJlbmNlW3JlYWRPZmZzZXQrK10gJiAweEZGOworCQkJbGVuZ3RoLS07CisJCQlpZiAoKDB4ODAgJiB4KSAhPSAwKSB7CisJCQkJaWYgKCh4ICYgMHgyMCkgIT0gMCkgeworCQkJCQlsZW5ndGggLT0gMjsKKwkJCQkJeCA9ICgoeCAmIDB4RikgPDwgMTIpCisJCQkJCQkJfCAoKHJlZmVyZW5jZVtyZWFkT2Zmc2V0KytdICYgMHgzRikgPDwgNikKKwkJCQkJCQl8IChyZWZlcmVuY2VbcmVhZE9mZnNldCsrXSAmIDB4M0YpOworCQkJCX0gZWxzZSB7CisJCQkJCWxlbmd0aC0tOworCQkJCQl4ID0gKCh4ICYgMHgxRikgPDwgNikgfCAocmVmZXJlbmNlW3JlYWRPZmZzZXQrK10gJiAweDNGKTsKKwkJCQl9CisJCQl9CisJCQlvdXRwdXRCdWZbb3V0cHV0UG9zKytdID0gKGNoYXIpIHg7CisJCX0KKworCQlpZiAob3V0cHV0UG9zICE9IGJ5dGVzQXZhaWxhYmxlKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG91dHB1dEJ1ZiwgMCwgKG91dHB1dEJ1ZiA9IG5ldyBjaGFyW291dHB1dFBvc10pLAorCQkJCQkwLCBvdXRwdXRQb3MpOworCQl9CisJCXJldHVybiBvdXRwdXRCdWY7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZVBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9DbGFzc0ZpbGVQb29sLmphdmEKaW5kZXggZGViMzAxZC4uMzdhZWI3MSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZVBvb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlUG9vbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDI5ICsxNSwxOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CiAKIHB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVQb29sIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT09MX1NJWkUgPSA3OwotCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXM7IAotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPT0xfU0laRSA9IDI1OyAvLyBuZWVkIHRvIGhhdmUgZW5vdWdoIGZvciAyIHVuaXRzCisJQ2xhc3NGaWxlW10gY2xhc3NGaWxlczsKKwogcHJpdmF0ZSBDbGFzc0ZpbGVQb29sKCkgewogCS8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgotCXRoaXMuY2xhc3NGaWxlcyA9IG5ldyBDbGFzc0ZpbGVbUE9PTF9TSVpFXTsJCQorCXRoaXMuY2xhc3NGaWxlcyA9IG5ldyBDbGFzc0ZpbGVbUE9PTF9TSVpFXTsKIH0KIAogcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVQb29sIG5ld0luc3RhbmNlKCkgewogCXJldHVybiBuZXcgQ2xhc3NGaWxlUG9vbCgpOwogfQogCi1wdWJsaWMgdm9pZCByZWxlYXNlKENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfU0laRTsgaSsrKSB7Ci0JCUNsYXNzRmlsZSBjdXJyZW50Q2xhc3NGaWxlID0gdGhpcy5jbGFzc0ZpbGVzW2ldOwotCQlpZiAoY3VycmVudENsYXNzRmlsZSA9PSBjbGFzc0ZpbGUpIHsKLQkJCWNsYXNzRmlsZS5pc1NoYXJlZCA9IGZhbHNlOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCQotcHVibGljIENsYXNzRmlsZSBhY3F1aXJlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CitwdWJsaWMgc3luY2hyb25pemVkIENsYXNzRmlsZSBhY3F1aXJlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MX1NJWkU7IGkrKykgewogCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdGhpcy5jbGFzc0ZpbGVzW2ldOwogCQlpZiAoY2xhc3NGaWxlID09IG51bGwpIHsKQEAgLTQ2LDI0ICszNiwxOCBAQAogCQkJbmV3Q2xhc3NGaWxlLmlzU2hhcmVkID0gdHJ1ZTsKIAkJCXJldHVybiBuZXdDbGFzc0ZpbGU7CiAJCX0KLQkJaWYgKGNsYXNzRmlsZS5pc1NoYXJlZCkgewotCQkJY29udGludWU7CisJCWlmICghY2xhc3NGaWxlLmlzU2hhcmVkKSB7CisJCQljbGFzc0ZpbGUucmVzZXQodHlwZUJpbmRpbmcpOworCQkJY2xhc3NGaWxlLmlzU2hhcmVkID0gdHJ1ZTsKKwkJCXJldHVybiBjbGFzc0ZpbGU7CiAJCX0KLQkJY2xhc3NGaWxlLnJlc2V0KHR5cGVCaW5kaW5nKTsKLQkJY2xhc3NGaWxlLmlzU2hhcmVkID0gdHJ1ZTsKLQkJcmV0dXJuIGNsYXNzRmlsZTsKIAl9CiAJcmV0dXJuIG5ldyBDbGFzc0ZpbGUodHlwZUJpbmRpbmcpOwogfQorcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCWNsYXNzRmlsZS5pc1NoYXJlZCA9IGZhbHNlOworfQogcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JQXJyYXlzLmZpbGwodGhpcy5jbGFzc0ZpbGVzLCBudWxsKTsgCQorCUFycmF5cy5maWxsKHRoaXMuY2xhc3NGaWxlcywgbnVsbCk7CiB9Ci0vLwlUeXBlQmluZGluZyBtb3N0RW5jbG9zaW5nVHlwZShUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0vLwkJVHlwZUJpbmRpbmcgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nOwotLy8JCXdoaWxlIChjdXJyZW50QmluZGluZy5lbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgewotLy8JCQljdXJyZW50QmluZGluZyA9IGN1cnJlbnRCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGN1cnJlbnRCaW5kaW5nOwotLy8JfQogfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29tcGlsYXRpb25SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhCmluZGV4IDUyMzMzMTcuLmQ4MmRlM2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiAvKioKLSAqIEEgY29tcGlsYXRpb24gcmVzdWx0IGNvbnNpc3RzIG9mIGFsbCBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgY29tcGlsZXIgZm9yIAorICogQSBjb21waWxhdGlvbiByZXN1bHQgY29uc2lzdHMgb2YgYWxsIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBjb21waWxlciBmb3IKICAqIGEgc2luZ2xlIGNvbXBpbGVkIGNvbXBpbGF0aW9uIHNvdXJjZSB1bml0LiAgVGhpcyBpbmNsdWRlczoKICAqIDx1bD4KICAqIDxsaT4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3YXMgY29tcGlsZWQKQEAgLTI3LDcgKzI3LDcgQEAKICAqIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzLCBsb2NhbCB2YXJpYWJsZSB0eXBlcywgdHlwZXMgb2YgaW50ZXJtZWRpYXRlIGV4cHJlc3Npb25zLCBldGMuCiAgKiBJdCBhbHNvIGluY2x1ZGVzIHRoZSBuYW1lc3BhY2VzIChwYWNrYWdlcykgaW4gd2hpY2ggbmFtZXMgd2VyZSBsb29rZWQgdXAuCiAgKiBJdCBkb2VzIDxlbT5ub3Q8L2VtPiBpbmNsdWRlIGZpbmVyIGdyYWluZWQgZGVwZW5kZW5jaWVzIHN1Y2ggYXMgaW5mb3JtYXRpb24gYWJvdXQKLSAqIHNwZWNpZmljIGZpZWxkcyBhbmQgbWV0aG9kcyB3aGljaCB3ZXJlIHJlZmVyZW5jZWQsIGJ1dCBkb2VzIGNvbnRhaW4gdGhlaXIgCisgKiBzcGVjaWZpYyBmaWVsZHMgYW5kIG1ldGhvZHMgd2hpY2ggd2VyZSByZWZlcmVuY2VkLCBidXQgZG9lcyBjb250YWluIHRoZWlyCiAgKiBkZWNsYXJpbmcgdHlwZXMgYW5kIGFueSBvdGhlciB0eXBlcyB1c2VkIHRvIGxvY2F0ZSBzdWNoIGZpZWxkcyBvciBtZXRob2RzLgogICovCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTQ2LDExICs0NiwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlJlZmVyZW5jZUNvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJ5U2Nhbm5lckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBDb21waWxhdGlvblJlc3VsdCB7Ci0JCisKIAlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW1zW107CiAJcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSB0YXNrc1tdOwogCXB1YmxpYyBpbnQgcHJvYmxlbUNvdW50OwpAQCAtNjEsNiArNjAsNyBAQAogCXByaXZhdGUgaW50IG1heFByb2JsZW1QZXJVbml0OwogCXB1YmxpYyBjaGFyW11bXVtdIHF1YWxpZmllZFJlZmVyZW5jZXM7CiAJcHVibGljIGNoYXJbXVtdIHNpbXBsZU5hbWVSZWZlcmVuY2VzOworCXB1YmxpYyBjaGFyW11bXSByb290UmVmZXJlbmNlczsKIAlwdWJsaWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9ucyA9IGZhbHNlOwogCXB1YmxpYyBpbnQgbGluZVNlcGFyYXRvclBvc2l0aW9uc1tdOwogCXB1YmxpYyBSZWNvdmVyeVNjYW5uZXJEYXRhIHJlY292ZXJ5U2Nhbm5lckRhdGE7CkBAIC03MCwzNiArNzAsMjUgQEAKIAlwdWJsaWMgY2hhcltdIGZpbGVOYW1lOwogCXB1YmxpYyBib29sZWFuIGhhc0luY29uc2lzdGVudFRvcGxldmVsSGllcmFyY2hpZXMgPSBmYWxzZTsgLy8gcmVjb3JkIHRoZSBmYWN0IHNvbWUgdG9wbGV2ZWwgdHlwZXMgaGF2ZSBpbmNvbnNpc3RlbnQgaGllcmFyY2hpZXMKIAlwdWJsaWMgYm9vbGVhbiBoYXNTeW50YXhFcnJvciA9IGZhbHNlOwotCWxvbmdbXSBzdXBwcmVzc1dhcm5pbmdJcnJpdGFudHM7ICAvLyBpcnJpdGFudCBmb3Igc3VwcHJlc3NlZCB3YXJuaW5ncwotCWxvbmdbXSBzdXBwcmVzc1dhcm5pbmdTY29wZVBvc2l0aW9uczsgLy8gKHN0YXJ0IDw8IDMyKSArIGVuZCAKLQlpbnQgc3VwcHJlc3NXYXJuaW5nc0NvdW50OwogCXB1YmxpYyBjaGFyW11bXSBwYWNrYWdlTmFtZTsKLQkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX0xJTkVfRU5EUyA9IFV0aWwuRU1QVFlfSU5UX0FSUkFZOwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBQUk9CTEVNX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuICgoQ2F0ZWdvcml6ZWRQcm9ibGVtKSBvMSkuZ2V0U291cmNlU3RhcnQoKSAtICgoQ2F0ZWdvcml6ZWRQcm9ibGVtKSBvMikuZ2V0U291cmNlU3RhcnQoKTsKLQl9Ci19OworCXB1YmxpYyBib29sZWFuIGNoZWNrU2Vjb25kYXJ5VHlwZXMgPSBmYWxzZTsgLy8gY2hlY2sgZm9yIHNlY29uZGFyeSB0eXBlcyB3aGljaCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIGluaXRpYWwgYnVpbGRUeXBlQmluZGluZ3MgY2FsbAorCXByaXZhdGUgaW50IG51bWJlck9mRXJyb3JzOwogCi1wdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQoCi0JCWNoYXJbXSBmaWxlTmFtZSwKLQkJaW50IHVuaXRJbmRleCwgCi0JCWludCB0b3RhbFVuaXRzS25vd24sCi0JCWludCBtYXhQcm9ibGVtUGVyVW5pdCl7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfTElORV9FTkRTID0gVXRpbC5FTVBUWV9JTlRfQVJSQVk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBQUk9CTEVNX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKKwkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQlyZXR1cm4gKChDYXRlZ29yaXplZFByb2JsZW0pIG8xKS5nZXRTb3VyY2VTdGFydCgpIC0gKChDYXRlZ29yaXplZFByb2JsZW0pIG8yKS5nZXRTb3VyY2VTdGFydCgpOworCQl9CisJfTsKIAorcHVibGljIENvbXBpbGF0aW9uUmVzdWx0KGNoYXJbXSBmaWxlTmFtZSwgaW50IHVuaXRJbmRleCwgaW50IHRvdGFsVW5pdHNLbm93biwgaW50IG1heFByb2JsZW1QZXJVbml0KXsKIAl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CiAJdGhpcy51bml0SW5kZXggPSB1bml0SW5kZXg7CiAJdGhpcy50b3RhbFVuaXRzS25vd24gPSB0b3RhbFVuaXRzS25vd247CiAJdGhpcy5tYXhQcm9ibGVtUGVyVW5pdCA9IG1heFByb2JsZW1QZXJVbml0OwogfQogCi1wdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQoCi0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQlpbnQgdW5pdEluZGV4LCAKLQkJaW50IHRvdGFsVW5pdHNLbm93biwKLQkJaW50IG1heFByb2JsZW1QZXJVbml0KXsKLQorcHVibGljIENvbXBpbGF0aW9uUmVzdWx0KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBpbnQgdW5pdEluZGV4LCBpbnQgdG90YWxVbml0c0tub3duLCBpbnQgbWF4UHJvYmxlbVBlclVuaXQpewogCXRoaXMuZmlsZU5hbWUgPSBjb21waWxhdGlvblVuaXQuZ2V0RmlsZU5hbWUoKTsKIAl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKIAl0aGlzLnVuaXRJbmRleCA9IHVuaXRJbmRleDsKQEAgLTExMiw3ICsxMDEsNyBAQAogCWZpbmFsIGludCBQX09VVFNJREVfTUVUSE9EID0gNDAwMDA7CiAJZmluYWwgaW50IFBfRklSU1RfRVJST1IgPSAyMDAwMDsKIAlmaW5hbCBpbnQgUF9FUlJPUiA9IDEwMDAwMDsKLQkKKwogCWludCBwcmlvcml0eSA9IDEwMDAwIC0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7IC8vIGVhcmx5IHByb2JsZW1zIGZpcnN0CiAJaWYgKHByaW9yaXR5IDwgMCkgcHJpb3JpdHkgPSAwOwogCWlmIChwcm9ibGVtLmlzRXJyb3IoKSl7CkBAIC0xMzcsNTIgKzEyNiwxMCBAQAogCXJldHVybiBwcmlvcml0eTsKIH0KIAotcHVibGljIHZvaWQgZGlzY2FyZFN1cHByZXNzZWRXYXJuaW5ncygpIHsKLQlpZiAodGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnQgPT0gMCkgcmV0dXJuOwotCWludCByZW1vdmVkID0gMDsKLQluZXh0UHJvYmxlbTogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucHJvYmxlbUNvdW50OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0gPSB0aGlzLnByb2JsZW1zW2ldOwotCQlpbnQgcHJvYmxlbUlEID0gcHJvYmxlbS5nZXRJRCgpOwotCQlpZiAoIXByb2JsZW0uaXNXYXJuaW5nKCkpIHsKLQkJCWNvbnRpbnVlIG5leHRQcm9ibGVtOwotCQl9Ci0JCWludCBzdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKLQkJaW50IGVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCk7Ci0JCW5leHRTdXBwcmVzczogZm9yIChpbnQgaiA9IDAsIG1heCA9IHRoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50OyBqIDwgbWF4OyBqKyspIHsKLQkJCWxvbmcgcG9zaXRpb24gPSB0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zW2pdOwotCQkJaW50IHN0YXJ0U3VwcHJlc3MgPSAoaW50KSAocG9zaXRpb24gPj4+IDMyKTsKLQkJCWludCBlbmRTdXBwcmVzcyA9IChpbnQpIHBvc2l0aW9uOwotCQkJaWYgKHN0YXJ0IDwgc3RhcnRTdXBwcmVzcykgY29udGludWUgbmV4dFN1cHByZXNzOwotCQkJaWYgKGVuZCA+IGVuZFN1cHByZXNzKSBjb250aW51ZSBuZXh0U3VwcHJlc3M7Ci0JCQlpZiAoKFByb2JsZW1SZXBvcnRlci5nZXRJcnJpdGFudChwcm9ibGVtSUQpICYgdGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHNbal0pID09IDApCi0JCQkJY29udGludWUgbmV4dFN1cHByZXNzOwotCQkJLy8gZGlzY2FyZCBzdXBwcmVzc2VkIHdhcm5pbmcKLQkJCXJlbW92ZWQrKzsKLQkJCXRoaXMucHJvYmxlbXNbaV0gPSBudWxsOwotCQkJaWYgKHRoaXMucHJvYmxlbXNNYXAgIT0gbnVsbCkgdGhpcy5wcm9ibGVtc01hcC5yZW1vdmUocHJvYmxlbSk7Ci0JCQlpZiAodGhpcy5maXJzdEVycm9ycyAhPSBudWxsKSB0aGlzLmZpcnN0RXJyb3JzLnJlbW92ZShwcm9ibGVtKTsKLQkJCWNvbnRpbnVlIG5leHRQcm9ibGVtOwotCQl9Ci0JfQotCWlmIChyZW1vdmVkID4gMCkgewotCQlmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgdGhpcy5wcm9ibGVtQ291bnQ7IGkrKykgewotCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW07Ci0JCQlpZiAoKHByb2JsZW0gPSB0aGlzLnByb2JsZW1zW2ldKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGkgPiBpbmRleCkgewotCQkJCQl0aGlzLnByb2JsZW1zW2luZGV4KytdID0gcHJvYmxlbTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLnByb2JsZW1Db3VudCAtPSByZW1vdmVkOwotCX0KLX0KLQogcHVibGljIENhdGVnb3JpemVkUHJvYmxlbVtdIGdldEFsbFByb2JsZW1zKCkgewotCUNhdGVnb3JpemVkUHJvYmxlbVtdIG9ubHlQcm9ibGVtcyA9IHRoaXMuZ2V0UHJvYmxlbXMoKTsKKwlDYXRlZ29yaXplZFByb2JsZW1bXSBvbmx5UHJvYmxlbXMgPSBnZXRQcm9ibGVtcygpOwogCWludCBvbmx5UHJvYmxlbUNvdW50ID0gb25seVByb2JsZW1zICE9IG51bGwgPyBvbmx5UHJvYmxlbXMubGVuZ3RoIDogMDsKLQlDYXRlZ29yaXplZFByb2JsZW1bXSBvbmx5VGFza3MgPSB0aGlzLmdldFRhc2tzKCk7CisJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gb25seVRhc2tzID0gZ2V0VGFza3MoKTsKIAlpbnQgb25seVRhc2tDb3VudCA9IG9ubHlUYXNrcyAhPSBudWxsID8gb25seVRhc2tzLmxlbmd0aCA6IDA7CiAJaWYgKG9ubHlUYXNrQ291bnQgPT0gMCkgewogCQlyZXR1cm4gb25seVByb2JsZW1zOwpAQCAtMTkwLDcgKzEzNyw2IEBACiAJaWYgKG9ubHlQcm9ibGVtQ291bnQgPT0gMCkgewogCQlyZXR1cm4gb25seVRhc2tzOwogCX0KLQogCWludCB0b3RhbE51bWJlck9mUHJvYmxlbSA9IG9ubHlQcm9ibGVtQ291bnQgKyBvbmx5VGFza0NvdW50OwogCUNhdGVnb3JpemVkUHJvYmxlbVtdIGFsbFByb2JsZW1zID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVt0b3RhbE51bWJlck9mUHJvYmxlbV07CiAJaW50IGFsbFByb2JsZW1JbmRleCA9IDA7CkBAIC0yMzQsNyArMTgwLDcgQEAKIHB1YmxpYyBDbGFzc0ZpbGVbXSBnZXRDbGFzc0ZpbGVzKCkgewogCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBuZXcgQ2xhc3NGaWxlW3RoaXMuY29tcGlsZWRUeXBlcy5zaXplKCldOwogCXRoaXMuY29tcGlsZWRUeXBlcy52YWx1ZXMoKS50b0FycmF5KGNsYXNzRmlsZXMpOwotCXJldHVybiBjbGFzc0ZpbGVzOwkKKwlyZXR1cm4gY2xhc3NGaWxlczsKIH0KIAogLyoqCkBAIC0yODUsOCArMjMxLDYgQEAKIHB1YmxpYyBDYXRlZ29yaXplZFByb2JsZW1bXSBnZXRQcm9ibGVtcygpIHsKIAkvLyBSZS1hZGp1c3QgdGhlIHNpemUgb2YgdGhlIHByb2JsZW1zIGlmIG5lY2Vzc2FyeS4KIAlpZiAodGhpcy5wcm9ibGVtcyAhPSBudWxsKSB7Ci0JCWRpc2NhcmRTdXBwcmVzc2VkV2FybmluZ3MoKTsKLQogCQlpZiAodGhpcy5wcm9ibGVtQ291bnQgIT0gdGhpcy5wcm9ibGVtcy5sZW5ndGgpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wcm9ibGVtcywgMCwgKHRoaXMucHJvYmxlbXMgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3RoaXMucHJvYmxlbUNvdW50XSksIDAsIHRoaXMucHJvYmxlbUNvdW50KTsKIAkJfQpAQCAtMzI3LDEyICsyNzEsNyBAQAogfQogCiBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0JaWYgKHRoaXMucHJvYmxlbXMgIT0gbnVsbCkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1Db3VudDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5wcm9ibGVtc1tpXS5pc0Vycm9yKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRoaXMubnVtYmVyT2ZFcnJvcnMgIT0gMDsKIH0KIAogcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbXMoKSB7CkBAIC0zNTQsNyArMjkzLDYgQEAKIAogcHJpdmF0ZSB2b2lkIHF1aWNrUHJpb3JpdGl6ZShDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtTGlzdCwgaW50IGxlZnQsIGludCByaWdodCkgewogCWlmIChsZWZ0ID49IHJpZ2h0KSByZXR1cm47Ci0KIAkvLyBzb3J0IHRoZSBwcm9ibGVtcyBieSB0aGVpciBwcmlvcml0eS4uLiBzdGFydGluZyB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5CiAJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OwogCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OwpAQCAtMzc3LDE3ICszMTUsMTkgQEAKIAlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KQogCQlxdWlja1ByaW9yaXRpemUocHJvYmxlbUxpc3QsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKIH0KKwogLyoKICAqIFJlY29yZCB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQncyBwYWNrYWdlIG5hbWUKICAqLwogcHVibGljIHZvaWQgcmVjb3JkUGFja2FnZU5hbWUoY2hhcltdW10gcGFja05hbWUpIHsKIAl0aGlzLnBhY2thZ2VOYW1lID0gcGFja05hbWU7CiB9CisKIHB1YmxpYyB2b2lkIHJlY29yZChDYXRlZ29yaXplZFByb2JsZW0gbmV3UHJvYmxlbSwgUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CiAJLy9uZXcgRXhjZXB0aW9uKCJWRVJCT1NFIFBST0JMRU0gUkVQT1JUSU5HIikucHJpbnRTdGFja1RyYWNlKCk7CiAJaWYobmV3UHJvYmxlbS5nZXRJRCgpID09IElQcm9ibGVtLlRhc2spIHsKLQkJCXJlY29yZFRhc2sobmV3UHJvYmxlbSk7Ci0JCQlyZXR1cm47CisJCXJlY29yZFRhc2sobmV3UHJvYmxlbSk7CisJCXJldHVybjsKIAl9CiAJaWYgKHRoaXMucHJvYmxlbUNvdW50ID09IDApIHsKIAkJdGhpcy5wcm9ibGVtcyA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bNV07CkBAIC00MDEsOCArMzQxLDEyIEBACiAJCWlmIChuZXdQcm9ibGVtLmlzRXJyb3IoKSAmJiAhcmVmZXJlbmNlQ29udGV4dC5oYXNFcnJvcnMoKSkgdGhpcy5maXJzdEVycm9ycy5hZGQobmV3UHJvYmxlbSk7CiAJCXRoaXMucHJvYmxlbXNNYXAucHV0KG5ld1Byb2JsZW0sIHJlZmVyZW5jZUNvbnRleHQpOwogCX0KLQlpZiAoKG5ld1Byb2JsZW0uZ2V0SUQoKSAmIElQcm9ibGVtLlN5bnRheCkgIT0gMCAmJiBuZXdQcm9ibGVtLmlzRXJyb3IoKSkKLQkJdGhpcy5oYXNTeW50YXhFcnJvciA9IHRydWU7CisJaWYgKG5ld1Byb2JsZW0uaXNFcnJvcigpKSB7CisJCXRoaXMubnVtYmVyT2ZFcnJvcnMrKzsKKwkJaWYgKChuZXdQcm9ibGVtLmdldElEKCkgJiBJUHJvYmxlbS5TeW50YXgpICE9IDApIHsKKwkJCXRoaXMuaGFzU3ludGF4RXJyb3IgPSB0cnVlOworCQl9CisJfQogfQogCiAvKioKQEAgLTQxNiwxOCArMzYwLDYgQEAKIAl0aGlzLmNvbXBpbGVkVHlwZXMucHV0KHR5cGVOYW1lLCBjbGFzc0ZpbGUpOwogfQogCi1wdWJsaWMgdm9pZCByZWNvcmRTdXBwcmVzc1dhcm5pbmdzKGxvbmcgaXJyaXRhbnQsIGludCBzY29wZVN0YXJ0LCBpbnQgc2NvcGVFbmQpIHsKLQlpZiAodGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHMgPT0gbnVsbCkgewotCQl0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50cyA9IG5ldyBsb25nWzNdOwotCQl0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zID0gbmV3IGxvbmdbM107Ci0JfSBlbHNlIGlmICh0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50cy5sZW5ndGggPT0gdGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnQpIHsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50cywgMCx0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50cyA9IG5ldyBsb25nWzIqdGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnRdLCAwLCB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdXBwcmVzc1dhcm5pbmdTY29wZVBvc2l0aW9ucywgMCx0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zID0gbmV3IGxvbmdbMip0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudF0sIDAsIHRoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50KTsKLQl9Ci0JdGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHNbdGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnRdID0gaXJyaXRhbnQ7Ci0JdGhpcy5zdXBwcmVzc1dhcm5pbmdTY29wZVBvc2l0aW9uc1t0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudCsrXSA9ICgobG9uZylzY29wZVN0YXJ0PDwzMikgKyBzY29wZUVuZDsKLX0KLQogcHJpdmF0ZSB2b2lkIHJlY29yZFRhc2soQ2F0ZWdvcml6ZWRQcm9ibGVtIG5ld1Byb2JsZW0pIHsKIAlpZiAodGhpcy50YXNrQ291bnQgPT0gMCkgewogCQl0aGlzLnRhc2tzID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVs1XTsKQEAgLTQzNiw3ICszNjgsMTQgQEAKIAl9CiAJdGhpcy50YXNrc1t0aGlzLnRhc2tDb3VudCsrXSA9IG5ld1Byb2JsZW07CiB9Ci0KK3B1YmxpYyB2b2lkIHJlbW92ZVByb2JsZW0oQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0pIHsKKwlpZiAodGhpcy5wcm9ibGVtc01hcCAhPSBudWxsKSB0aGlzLnByb2JsZW1zTWFwLnJlbW92ZShwcm9ibGVtKTsKKwlpZiAodGhpcy5maXJzdEVycm9ycyAhPSBudWxsKSB0aGlzLmZpcnN0RXJyb3JzLnJlbW92ZShwcm9ibGVtKTsKKwlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKKwkJdGhpcy5udW1iZXJPZkVycm9ycy0tOworCX0KKwl0aGlzLnByb2JsZW1Db3VudC0tOworfQogcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IHRhZ0FzQWNjZXB0ZWQoKXsKIAl0aGlzLmhhc0JlZW5BY2NlcHRlZCA9IHRydWU7CiAJdGhpcy5wcm9ibGVtc01hcCA9IG51bGw7IC8vIGZsdXNoCkBAIC00NTUsNyArMzk0LDcgQEAKIAkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CiAJCQljaGFyW10gdHlwZU5hbWUgPSAoY2hhcltdKSBrZXlzLm5leHQoKTsKIAkJCWJ1ZmZlci5hcHBlbmQoIlx0IC0gIikuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoJ1xuJyk7ICAgLy8kTk9OLU5MUy0xJAotCQkJCisKIAkJfQogCX0gZWxzZSB7CiAJCWJ1ZmZlci5hcHBlbmQoIk5vIENPTVBJTEVEIHR5cGVcbiIpOyAgLy8kTk9OLU5MUy0xJApAQCAtNDY3LDcgKzQwNiw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlidWZmZXIuYXBwZW5kKCJObyBQUk9CTEVNXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0gCisJfQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKaW5kZXggOGQ0NTNiNi4uNDRhNjlhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIGNvbnRyaWJ1dGlvbiBmb3IgYnVnIDMzNzg2OCAtIFtjb21waWxlcl1bbW9kZWxdIGluY29tcGxldGUgc3VwcG9ydCBmb3IgcGFja2FnZS1pbmZvLmphdmEgd2hlbiB1c2luZyBTZWFyY2hhYmxlRW52aXJvbm1lbnQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CiAKQEAgLTI4LDYgKzI5LDkgQEAKIAlwdWJsaWMgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CiAJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7CiAJcHJvdGVjdGVkIFByaW50V3JpdGVyIG91dDsgLy8gb3V0cHV0IGZvciBtZXNzYWdlcyB0aGF0IGFyZSBub3Qgc2VudCB0byBwcm9ibGVtUmVwb3J0ZXIKKwlwdWJsaWMgQ29tcGlsZXJTdGF0cyBzdGF0czsKKwlwdWJsaWMgQ29tcGlsYXRpb25Qcm9ncmVzcyBwcm9ncmVzczsKKwlwdWJsaWMgaW50IHJlbWFpbmluZ0l0ZXJhdGlvbnMgPSAxOwogCiAJLy8gbWFuYWdlbWVudCBvZiB1bml0IHRvIGJlIHByb2Nlc3NlZAogCS8vcHVibGljIENvbXBpbGF0aW9uVW5pdFJlc3VsdCBjdXJyZW50Q29tcGlsYXRpb25Vbml0UmVzdWx0OwpAQCAtNDAsMTYgKzQ0LDE4IEBACiAJLy8gT05DRSBTVEFCSUxJWkVELCBUSEVTRSBTSE9VTEQgUkVUVVJOIFRPIEEgRklOQUwgRklFTEQKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAlwdWJsaWMgaW50IHBhcnNlVGhyZXNob2xkID0gLTE7Ci0JCisKIAlwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlciBhbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlcjsKKwlwdWJsaWMgaW50IGFubm90YXRpb25Qcm9jZXNzb3JTdGFydEluZGV4ID0gMDsKIAlwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIHJlZmVyZW5jZUJpbmRpbmdzOworCXB1YmxpYyBib29sZWFuIHVzZVNpbmdsZVRocmVhZCA9IHRydWU7IC8vIGJ5IGRlZmF1bHQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IHVzZSB3b3JrZXIgdGhyZWFkcyB0byByZWFkL3Byb2Nlc3Mvd3JpdGUKIAogCS8vIG51bWJlciBvZiBpbml0aWFsIHVuaXRzIHBhcnNlZCBhdCBvbmNlICgtMTogbm9uZSkKIAogCS8qCiAJICogU3RhdGljIHJlcXVlc3RvciByZXNlcnZlZCB0byBsaXN0ZW5pbmcgY29tcGlsYXRpb24gcmVzdWx0cyBpbiBkZWJ1ZyBtb2RlLAogCSAqIHNvIGFzIGZvciBleGFtcGxlIHRvIG1vbml0b3IgY29tcGlsZXIgYWN0aXZpdHkgaW5kZXBlbmRhbnRseSBmcm9tIGEgcGFydGljdWxhcgotCSAqIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24uIEl0IGlzIHJlc2V0IGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24sIGFuZCBzaG91bGQgbm90IAorCSAqIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24uIEl0IGlzIHJlc2V0IGF0IHRoZSBlbmQgb2YgY29tcGlsYXRpb24sIGFuZCBzaG91bGQgbm90CiAJICogcGVyc2lzdCBhbnkgaW5mb3JtYXRpb24gYWZ0ZXIgaGF2aW5nIGJlZW4gcmVzZXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBJRGVidWdSZXF1ZXN0b3IgRGVidWdSZXF1ZXN0b3IgPSBudWxsOwpAQCAtNzMsMTMgKzc5LDEzIEBACiAJICogICAgICB0aGVtIGFsbCkgYW5kIGF0IHRoZSBzYW1lIHRpbWUgcGVyZm9ybSBzb21lIGFjdGlvbnMgc3VjaCBhcyBvcGVuaW5nIGEgZGlhbG9nCiAJICogICAgICBpbiBVSSB3aGVuIGNvbXBpbGluZyBpbnRlcmFjdGl2ZWx5LgogCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcwotCSAqICAKKwkgKgogCSAqICBAcGFyYW0gc2V0dGluZ3MgamF2YS51dGlsLk1hcAogCSAqICAgICAgVGhlIHNldHRpbmdzIHRoYXQgY29udHJvbCB0aGUgY29tcGlsZXIgYmVoYXZpb3IuCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUNvbXBpbGVyUmVxdWVzdG9yCiAJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZAotCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIAorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzCiAJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgogCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQKIAkgKgpAQCAtODksMTggKzk1LDE4IEBACiAJICogICAgICBvcmRlciB0byBhdm9pZCBvYmplY3QgY29udmVyc2lvbnMuIE5vdGUgdGhhdCB0aGUgZmFjdG9yeSBpcyBub3Qgc3VwcG9zZWQKIAkgKiAgICAgIHRvIGFjY3VtdWxhdGUgdGhlIGNyZWF0ZWQgcHJvYmxlbXMsIHRoZSBjb21waWxlciB3aWxsIGdhdGhlciB0aGVtIGFsbCBhbmQgaGFuZAogCSAqICAgICAgdGhlbSBiYWNrIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0LgotCSAqICAgICAgCisJICoKIAkgKiAgQGRlcHJlY2F0ZWQgdGhpcyBjb25zdHJ1Y3RvciBpcyBrZXB0IHRvIHByZXNlcnZlIDMuMSBhbmQgMy4yTTQgY29tcGF0aWJpbGl0eQogCSAqLwogCXB1YmxpYyBDb21waWxlcigKLQkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKLQkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAotCQlNYXAgc2V0dGluZ3MsCi0JCWZpbmFsIElDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgewotCQl0aGlzKGVudmlyb25tZW50LCBwb2xpY3ksIG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBudWxsKTsgCisJCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LAorCQkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAorCQkJTWFwIHNldHRpbmdzLAorCQkJZmluYWwgSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgeworCQl0aGlzKGVudmlyb25tZW50LCBwb2xpY3ksIG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBudWxsIC8qIHByaW50d3JpdGVyICovLCBudWxsIC8qIHByb2dyZXNzICovKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYSBuZXcgY29tcGlsZXIgdXNpbmcgdGhlIGdpdmVuIG5hbWUgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIG9wdGlvbnMuCiAJICogVGhlIGVudmlyb25tZW50IGFuZCBvcHRpb25zIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBpbGVyLgpAQCAtMTIwLDEzICsxMjYsMTMgQEAKIAkgKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cKIAkgKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuCiAJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gc2V0dGluZ3MgamF2YS51dGlsLk1hcAogCSAqICAgICAgVGhlIHNldHRpbmdzIHRoYXQgY29udHJvbCB0aGUgY29tcGlsZXIgYmVoYXZpb3IuCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUNvbXBpbGVyUmVxdWVzdG9yCiAJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZAotCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIAorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzCiAJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgogCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQKIAkgKgpAQCAtMTM2LDIzICsxNDIsMjMgQEAKIAkgKiAgICAgIG9yZGVyIHRvIGF2b2lkIG9iamVjdCBjb252ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBmYWN0b3J5IGlzIG5vdCBzdXBwb3NlZAogCSAqICAgICAgdG8gYWNjdW11bGF0ZSB0aGUgY3JlYXRlZCBwcm9ibGVtcywgdGhlIGNvbXBpbGVyIHdpbGwgZ2F0aGVyIHRoZW0gYWxsIGFuZCBoYW5kCiAJICogICAgICB0aGVtIGJhY2sgYXMgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQuCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cyA8Y29kZT5ib29sZWFuPC9jb2RlPgogCSAqCQlUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIG9wdGltaXplIHRoZSBsaXRlcmFscyBvciBsZWF2ZSB0aGVtIGFzIHRoZXkgYXJlIGluIHRoZSBzb3VyY2UuCiAJICogCQlJZiB5b3UgcHV0IHRydWUsICJIZWxsbyIgKyAiIHdvcmxkIiB3aWxsIGJlIGNvbnZlcnRlZCB0byAiSGVsbG8gd29ybGQiLgotCSAqIAorCSAqCiAJICogIEBkZXByZWNhdGVkIHRoaXMgY29uc3RydWN0b3IgaXMga2VwdCB0byBwcmVzZXJ2ZSAzLjEgYW5kIDMuMk00IGNvbXBhdGliaWxpdHkKIAkgKi8KIAlwdWJsaWMgQ29tcGlsZXIoCi0JCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCi0JCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwKLQkJTWFwIHNldHRpbmdzLAotCQlmaW5hbCBJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yLAotCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksCi0JCWJvb2xlYW4gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cykgewotCQl0aGlzKGVudmlyb25tZW50LCBwb2xpY3ksIG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MsIHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMpLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBudWxsKTsgCisJCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LAorCQkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAorCQkJTWFwIHNldHRpbmdzLAorCQkJZmluYWwgSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKKwkJCWJvb2xlYW4gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cykgeworCQl0aGlzKGVudmlyb25tZW50LCBwb2xpY3ksIG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MsIHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMpLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBudWxsIC8qIHByaW50d3JpdGVyICovLCBudWxsIC8qIHByb2dyZXNzICovKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYSBuZXcgY29tcGlsZXIgdXNpbmcgdGhlIGdpdmVuIG5hbWUgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIG9wdGlvbnMuCiAJICogVGhlIGVudmlyb25tZW50IGFuZCBvcHRpb25zIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBpbGVyLgpAQCAtMTcyLDEzICsxNzgsMTMgQEAKIAkgKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cKIAkgKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuCiAJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gb3B0aW9ucyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnMKIAkgKiAgICAgIFRoZSBvcHRpb25zIHRoYXQgY29udHJvbCB0aGUgY29tcGlsZXIgYmVoYXZpb3IuCi0JICogICAgICAKKwkgKgogCSAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUNvbXBpbGVyUmVxdWVzdG9yCiAJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZAotCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIAorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzCiAJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgogCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQKIAkgKgpAQCAtMTk1LDcgKzIwMSw3IEBACiAJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogCQlmaW5hbCBJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yLAogCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKLQkJdGhpcyhlbnZpcm9ubWVudCwgcG9saWN5LCBvcHRpb25zLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBudWxsKTsgCisJCXRoaXMoZW52aXJvbm1lbnQsIHBvbGljeSwgb3B0aW9ucywgcmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSwgbnVsbCAvKiBwcmludHdyaXRlciAqLywgbnVsbCAvKiBwcm9ncmVzcyAqLyk7CiAJfQogCiAJLyoqCkBAIC0yMTcsMTMgKzIyMywxMyBAQAogCSAqICAgICAgdGhlbSBhbGwpIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHBlcmZvcm0gc29tZSBhY3Rpb25zIHN1Y2ggYXMgb3BlbmluZyBhIGRpYWxvZwogCSAqICAgICAgaW4gVUkgd2hlbiBjb21waWxpbmcgaW50ZXJhY3RpdmVseS4KIAkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMKLQkgKiAgICAgIAorCSAqCiAJICogIEBwYXJhbSBvcHRpb25zIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9ucwogCSAqICAgICAgVGhlIG9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBjb21waWxlciBiZWhhdmlvci4KLQkgKiAgICAgIAorCSAqCiAJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5JQ29tcGlsZXJSZXF1ZXN0b3IKIAkgKiAgICAgIENvbXBvbmVudCB3aGljaCB3aWxsIHJlY2VpdmUgYW5kIHBlcnNpc3QgYWxsIGNvbXBpbGF0aW9uIHJlc3VsdHMgYW5kIGlzIGludGVuZGVkCi0JICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMgCisJICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMKIAkgKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCiAJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdAogCSAqCkBAIC0yMzMsNiArMjM5LDcgQEAKIAkgKiAgICAgIG9yZGVyIHRvIGF2b2lkIG9iamVjdCBjb252ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBmYWN0b3J5IGlzIG5vdCBzdXBwb3NlZAogCSAqICAgICAgdG8gYWNjdW11bGF0ZSB0aGUgY3JlYXRlZCBwcm9ibGVtcywgdGhlIGNvbXBpbGVyIHdpbGwgZ2F0aGVyIHRoZW0gYWxsIGFuZCBoYW5kCiAJICogICAgICB0aGVtIGJhY2sgYXMgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQuCisJICogQGRlcHJlY2F0ZWQKIAkgKi8KIAlwdWJsaWMgQ29tcGlsZXIoCiAJCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LApAQCAtMjQxLDkgKzI0OCwyMSBAQAogCQkJZmluYWwgSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKIAkJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKIAkJCVByaW50V3JpdGVyIG91dCkgewotCQkKKwkJdGhpcyhlbnZpcm9ubWVudCwgcG9saWN5LCBvcHRpb25zLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBvdXQsIG51bGwgLyogcHJvZ3Jlc3MgKi8pOworCX0KKworCXB1YmxpYyBDb21waWxlcigKKwkJCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCisJCQlJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3ksCisJCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucywKKwkJCWZpbmFsIElDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsCisJCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksCisJCQlQcmludFdyaXRlciBvdXQsCisJCQlDb21waWxhdGlvblByb2dyZXNzIHByb2dyZXNzKSB7CisKIAkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQkJCisJCXRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzczsKKwogCQkvLyB3cmFwIHJlcXVlc3RvciBpbiBEZWJ1Z1JlcXVlc3RvciBpZiBvbmUgaXMgc3BlY2lmaWVkCiAJCWlmKERlYnVnUmVxdWVzdG9yID09IG51bGwpIHsKIAkJCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwpAQCAtMjU4LDExICsyNzcsMTIgQEAKIAkJCX07CiAJCX0KIAkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIgPSBuZXcgUHJvYmxlbVJlcG9ydGVyKHBvbGljeSwgdGhpcy5vcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7Ci0JCXRoaXMubG9va3VwRW52aXJvbm1lbnQgPSBuZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgdGhpcy5vcHRpb25zLCBwcm9ibGVtUmVwb3J0ZXIsIGVudmlyb25tZW50KTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9IG5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCB0aGlzLm9wdGlvbnMsIHRoaXMucHJvYmxlbVJlcG9ydGVyLCBlbnZpcm9ubWVudCk7CiAJCXRoaXMub3V0ID0gb3V0ID09IG51bGwgPyBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCwgdHJ1ZSkgOiBvdXQ7CisJCXRoaXMuc3RhdHMgPSBuZXcgQ29tcGlsZXJTdGF0cygpOwogCQlpbml0aWFsaXplUGFyc2VyKCk7CiAJfQotCQorCiAJLyoqCiAJICogQWRkIGFuIGFkZGl0aW9uYWwgYmluYXJ5IHR5cGUKIAkgKi8KQEAgLTI3Myw3ICsyOTMsNyBAQAogLy8JCQluZXcgRXhjZXB0aW9uKCJUUkFDRSBCSU5BUlkiKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CiAvLwkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogCQl9Ci0JCWxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nLCBhY2Nlc3NSZXN0cmljdGlvbik7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAl9CiAKIAkvKioKQEAgLTI4MywxMCArMzAzLDExIEBACiAJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKIAkJLy8gU3dpdGNoIHRoZSBjdXJyZW50IHBvbGljeSBhbmQgY29tcGlsYXRpb24gcmVzdWx0IGZvciB0aGlzIHVuaXQgdG8gdGhlIHJlcXVlc3RlZCBvbmUuCiAJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPQotCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIHRvdGFsVW5pdHMsIHRvdGFsVW5pdHMsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIHRoaXMudG90YWxVbml0cywgdGhpcy50b3RhbFVuaXRzLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJdW5pdFJlc3VsdC5jaGVja1NlY29uZGFyeVR5cGVzID0gdHJ1ZTsKIAkJdHJ5IHsKLQkJCWlmIChvcHRpb25zLnZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgY291bnQgPSBTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSk7CisJCQlpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHsKKwkJCQlTdHJpbmcgY291bnQgPSBTdHJpbmcudmFsdWVPZih0aGlzLnRvdGFsVW5pdHMgKyAxKTsKIAkJCQl0aGlzLm91dC5wcmludGxuKAogCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbXBpbGF0aW9uX3JlcXVlc3QsCiAJCQkJCQluZXcgU3RyaW5nW10gewpAQCAtMjk3LDIzICszMTgsMjMgQEAKIAkJCX0KIAkJCS8vIGRpZXQgcGFyc2luZyBmb3IgbGFyZ2UgY29sbGVjdGlvbiBvZiB1bml0CiAJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0OwotCQkJaWYgKHRvdGFsVW5pdHMgPCBwYXJzZVRocmVzaG9sZCkgewotCQkJCXBhcnNlZFVuaXQgPSBwYXJzZXIucGFyc2Uoc291cmNlVW5pdCwgdW5pdFJlc3VsdCk7CisJCQlpZiAodGhpcy50b3RhbFVuaXRzIDwgdGhpcy5wYXJzZVRocmVzaG9sZCkgeworCQkJCXBhcnNlZFVuaXQgPSB0aGlzLnBhcnNlci5wYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKIAkJCX0gZWxzZSB7Ci0JCQkJcGFyc2VkVW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgdW5pdFJlc3VsdCk7CisJCQkJcGFyc2VkVW5pdCA9IHRoaXMucGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKIAkJCX0KIAkJCXBhcnNlZFVuaXQuYml0cyB8PSBBU1ROb2RlLklzSW1wbGljaXRVbml0OwogCQkJLy8gaW5pdGlhbCB0eXBlIGJpbmRpbmcgY3JlYXRpb24KLQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKLQkJCXRoaXMuYWRkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVVuaXQsIHBhcnNlZFVuaXQpOworCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBhY2Nlc3NSZXN0cmljdGlvbik7CisJCQlhZGRDb21waWxhdGlvblVuaXQoc291cmNlVW5pdCwgcGFyc2VkVW5pdCk7CiAKIAkJCS8vIGJpbmRpbmcgcmVzb2x1dGlvbgotCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOwogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7CiAJCQkvLyBhdCB0aGlzIHBvaW50LCBjdXJyZW50Q29tcGlsYXRpb25Vbml0UmVzdWx0IG1heSBub3QgYmUgc291cmNlVW5pdCwgYnV0IHNvbWUgb3RoZXIKIAkJCS8vIG9uZSByZXF1ZXN0ZWQgZnVydGhlciBhbG9uZyB0byByZXNvbHZlIHNvdXJjZVVuaXQuCiAJCQlpZiAodW5pdFJlc3VsdC5jb21waWxhdGlvblVuaXQgPT0gc291cmNlVW5pdCkgeyAvLyBvbmx5IHJlcG9ydCBvbmNlCi0JCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0UmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXRSZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhyb3cgZTsgLy8gd2FudCB0byBhYm9ydCBlbmNsb3NpbmcgcmVxdWVzdCB0byBjb21waWxlCiAJCQl9CkBAIC0zMjQsMjUgKzM0NSwyOCBAQAogCSAqIEFkZCBhZGRpdGlvbmFsIHNvdXJjZSB0eXBlcwogCSAqLwogCXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZywgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKLQkJcHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAotCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5hYm9ydF9hZ2FpbnN0U291cmNlTW9kZWwsIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGVzWzBdLmdldE5hbWUoKSksIFN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGVzWzBdLmdldEZpbGVOYW1lKCkpIH0pKTsgCisJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAorCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5hYm9ydF9hZ2FpbnN0U291cmNlTW9kZWwsIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGVzWzBdLmdldE5hbWUoKSksIFN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGVzWzBdLmdldEZpbGVOYW1lKCkpIH0pKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxhdGlvblVuaXQoCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbXBpbGF0aW9uVW5pdCgKIAkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LAogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0KSB7CiAKKwkJaWYgKHRoaXMudW5pdHNUb1Byb2Nlc3MgPT0gbnVsbCkKKwkJCXJldHVybjsgLy8gbm90IGNvbGxlY3RpbmcgdW5pdHMKKwogCQkvLyBhcHBlbmQgdGhlIHVuaXQgdG8gdGhlIGxpc3Qgb2Ygb25lcyB0byBwcm9jZXNzIGxhdGVyIG9uCi0JCWludCBzaXplID0gdW5pdHNUb1Byb2Nlc3MubGVuZ3RoOwotCQlpZiAodG90YWxVbml0cyA9PSBzaXplKQorCQlpbnQgc2l6ZSA9IHRoaXMudW5pdHNUb1Byb2Nlc3MubGVuZ3RoOworCQlpZiAodGhpcy50b3RhbFVuaXRzID09IHNpemUpCiAJCQkvLyB3aGVuIGdyb3dpbmcgcmVwb3NpdGlvbiB1bml0cyBzdGFydGluZyBhdCBwb3NpdGlvbiAwCiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXVuaXRzVG9Qcm9jZXNzLAorCQkJCXRoaXMudW5pdHNUb1Byb2Nlc3MsCiAJCQkJMCwKLQkJCQkodW5pdHNUb1Byb2Nlc3MgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bc2l6ZSAqIDJdKSwKKwkJCQkodGhpcy51bml0c1RvUHJvY2VzcyA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltzaXplICogMl0pLAogCQkJCTAsCi0JCQkJdG90YWxVbml0cyk7Ci0JCXVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMrK10gPSBwYXJzZWRVbml0OworCQkJCXRoaXMudG90YWxVbml0cyk7CisJCXRoaXMudW5pdHNUb1Byb2Nlc3NbdGhpcy50b3RhbFVuaXRzKytdID0gcGFyc2VkVW5pdDsKIAl9CiAKIAkvKioKQEAgLTM1OCw1MiArMzgyLDEzOSBAQAogCX0KIAogCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCBhbmQgcmVwb3J0cyB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgdG8gdGhlIGNvbXBpbGVyIHByb2dyZXNzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlcG9ydFByb2dyZXNzKFN0cmluZyB0YXNrRGVjcmlwdGlvbikgeworCQlpZiAodGhpcy5wcm9ncmVzcyAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5wcm9ncmVzcy5pc0NhbmNlbGVkKCkpIHsKKwkJCQkvLyBPbmx5IEFib3J0Q29tcGlsYXRpb24gY2FuIHN0b3AgdGhlIGNvbXBpbGVyIGNsZWFubHkuCisJCQkJLy8gV2UgY2hlY2sgY2FuY2VsbGF0aW9uIGFnYWluIGZvbGxvd2luZyB0aGUgY2FsbCB0byBjb21waWxlLgorCQkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHRydWUsIG51bGwpOworCQkJfQorCQkJdGhpcy5wcm9ncmVzcy5zZXRUYXNrTmFtZSh0YXNrRGVjcmlwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29tcGlsYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQgYW5kIHJlcG9ydHMgdGhlIGdpdmVuIHdvcmsgaW5jcmVtZW50IHRvIHRoZSBjb21waWxlciBwcm9ncmVzcy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZXBvcnRXb3JrZWQoaW50IHdvcmtJbmNyZW1lbnQsIGludCBjdXJyZW50VW5pdEluZGV4KSB7CisJCWlmICh0aGlzLnByb2dyZXNzICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLnByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgeworCQkJCS8vIE9ubHkgQWJvcnRDb21waWxhdGlvbiBjYW4gc3RvcCB0aGUgY29tcGlsZXIgY2xlYW5seS4KKwkJCQkvLyBXZSBjaGVjayBjYW5jZWxsYXRpb24gYWdhaW4gZm9sbG93aW5nIHRoZSBjYWxsIHRvIGNvbXBpbGUuCisJCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbnVsbCk7CisJCQl9CisJCQl0aGlzLnByb2dyZXNzLndvcmtlZCh3b3JrSW5jcmVtZW50LCAodGhpcy50b3RhbFVuaXRzKiB0aGlzLnJlbWFpbmluZ0l0ZXJhdGlvbnMpIC0gY3VycmVudFVuaXRJbmRleCAtIDEpOworCQl9CisJfQorCisJLyoqCiAJICogR2VuZXJhbCBBUEkKIAkgKiAtPiBjb21waWxlIGVhY2ggb2Ygc3VwcGxpZWQgZmlsZXMKIAkgKiAtPiByZWNvbXBpbGUgYW55IHJlcXVpcmVkIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlIGFuIGluY29tcGxldGUgcHJpbmNpcGxlIHN0cnVjdHVyZQogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXBpbGUoSUNvbXBpbGF0aW9uVW5pdFtdIHNvdXJjZVVuaXRzKSB7CisJCXRoaXMuc3RhdHMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOwotCQlpbnQgaSA9IDA7CisJCVByb2Nlc3NUYXNrTWFuYWdlciBwcm9jZXNzaW5nVGFzayA9IG51bGw7CiAJCXRyeSB7CiAJCQkvLyBidWlsZCBhbmQgcmVjb3JkIHBhcnNlZCB1bml0cworCQkJcmVwb3J0UHJvZ3Jlc3MoTWVzc2FnZXMuY29tcGlsYXRpb25fYmVnaW5uaW5nVG9Db21waWxlKTsKIAotCQkJYmVnaW5Ub0NvbXBpbGUoc291cmNlVW5pdHMpOworCQkJaWYgKHRoaXMuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIgPT0gbnVsbCkgeworCQkJCWJlZ2luVG9Db21waWxlKHNvdXJjZVVuaXRzKTsKKwkJCX0gZWxzZSB7CisJCQkJSUNvbXBpbGF0aW9uVW5pdFtdIG9yaWdpbmFsVW5pdHMgPSAoSUNvbXBpbGF0aW9uVW5pdFtdKSBzb3VyY2VVbml0cy5jbG9uZSgpOyAvLyByZW1lbWJlciBzb3VyY2UgdW5pdHMgaW4gY2FzZSBhIHNvdXJjZSB0eXBlIGNvbGxpc2lvbiBvY2N1cnMKKwkJCQl0cnkgeworCQkJCQliZWdpblRvQ29tcGlsZShzb3VyY2VVbml0cyk7CiAKLQkJCWlmICh0aGlzLmFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlwcm9jZXNzQW5ub3RhdGlvbnMoKTsKLQkJCQlpZiAoIW9wdGlvbnMuZ2VuZXJhdGVDbGFzc0ZpbGVzKSB7Ci0JCQkJCS8vIC1wcm9jOm9ubHkgd2FzIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lCisJCQkJCXByb2Nlc3NBbm5vdGF0aW9ucygpOworCQkJCQlpZiAoIXRoaXMub3B0aW9ucy5nZW5lcmF0ZUNsYXNzRmlsZXMpIHsKKwkJCQkJCS8vIC1wcm9jOm9ubHkgd2FzIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lCisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9IGNhdGNoIChTb3VyY2VUeXBlQ29sbGlzaW9uRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmVzZXQoKTsKKwkJCQkJLy8gYSBnZW5lcmF0ZWQgdHlwZSB3YXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgd2FzIGNyZWF0ZWQKKwkJCQkJLy8gdGhlIGNvbXBpbGVyIGVpdGhlciBjcmVhdGVkIGEgTWlzc2luZ1R5cGUgb3IgZm91bmQgYSBCaW5hcnlUeXBlIGZvciBpdAorCQkJCQkvLyBzbyBhZGQgdGhlIHByb2Nlc3NvcidzIGdlbmVyYXRlZCBmaWxlcyAmIHN0YXJ0IG92ZXIsCisJCQkJCS8vIGJ1dCByZW1lbWJlciB0byBvbmx5IHBhc3MgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IKKwkJCQkJaW50IG9yaWdpbmFsTGVuZ3RoID0gb3JpZ2luYWxVbml0cy5sZW5ndGg7CisJCQkJCWludCBuZXdQcm9jZXNzZWRMZW5ndGggPSBlLm5ld0Fubm90YXRpb25Qcm9jZXNzb3JVbml0cy5sZW5ndGg7CisJCQkJCUlDb21waWxhdGlvblVuaXRbXSBjb21iaW5lZFVuaXRzID0gbmV3IElDb21waWxhdGlvblVuaXRbb3JpZ2luYWxMZW5ndGggKyBuZXdQcm9jZXNzZWRMZW5ndGhdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVW5pdHMsIDAsIGNvbWJpbmVkVW5pdHMsIDAsIG9yaWdpbmFsTGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShlLm5ld0Fubm90YXRpb25Qcm9jZXNzb3JVbml0cywgMCwgY29tYmluZWRVbml0cywgb3JpZ2luYWxMZW5ndGgsIG5ld1Byb2Nlc3NlZExlbmd0aCk7CisJCQkJCXRoaXMuYW5ub3RhdGlvblByb2Nlc3NvclN0YXJ0SW5kZXggID0gb3JpZ2luYWxMZW5ndGg7CisJCQkJCWNvbXBpbGUoY29tYmluZWRVbml0cyk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9Ci0JCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpCi0JCQlmb3IgKDsgaSA8IHRoaXMudG90YWxVbml0czsgaSsrKSB7Ci0JCQkJdW5pdCA9IHVuaXRzVG9Qcm9jZXNzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCisKKwkJCWlmICh0aGlzLnVzZVNpbmdsZVRocmVhZCkgeworCQkJCS8vIHByb2Nlc3MgYWxsIHVuaXRzIChzb21lIG1vcmUgY291bGQgYmUgaW5qZWN0ZWQgaW4gdGhlIGxvb3AgYnkgdGhlIGxvb2t1cCBlbnZpcm9ubWVudCkKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudG90YWxVbml0czsgaSsrKSB7CisJCQkJCXVuaXQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldOworCQkJCQlyZXBvcnRQcm9ncmVzcyhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbXBpbGF0aW9uX3Byb2Nlc3NpbmcsIG5ldyBTdHJpbmcodW5pdC5nZXRGaWxlTmFtZSgpKSkpOworCQkJCQl0cnkgeworCQkJCQkJaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKQorCQkJCQkJCXRoaXMub3V0LnByaW50bG4oCisJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29tcGlsYXRpb25fcHJvY2VzcywKKwkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQkJCVN0cmluZy52YWx1ZU9mKGkgKyAxKSwKKwkJCQkJCQkJCVN0cmluZy52YWx1ZU9mKHRoaXMudG90YWxVbml0cyksCisJCQkJCQkJCQluZXcgU3RyaW5nKHRoaXMudW5pdHNUb1Byb2Nlc3NbaV0uZ2V0RmlsZU5hbWUoKSkKKwkJCQkJCQkJfSkpOworCQkJCQkJcHJvY2Vzcyh1bml0LCBpKTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCS8vIGNsZWFudXAgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKKwkJCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJCQl9CisJCQkJCXRoaXMudW5pdHNUb1Byb2Nlc3NbaV0gPSBudWxsOyAvLyByZWxlYXNlIHJlZmVyZW5jZSB0byBwcm9jZXNzZWQgdW5pdCBkZWNsYXJhdGlvbgorCisJCQkJCXJlcG9ydFdvcmtlZCgxLCBpKTsKKwkJCQkJdGhpcy5zdGF0cy5saW5lQ291bnQgKz0gdW5pdC5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zLmxlbmd0aDsKKwkJCQkJbG9uZyBhY2NlcHRTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOworCQkJCQl0aGlzLnN0YXRzLmdlbmVyYXRlVGltZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGFjY2VwdFN0YXJ0OyAvLyByZWNvcmQgYWNjZXB0IHRpbWUgYXMgcGFydCBvZiBnZW5lcmF0aW9uCisJCQkJCWlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkKIAkJCQkJCXRoaXMub3V0LnByaW50bG4oCi0JCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl9wcm9jZXNzLAorCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29tcGlsYXRpb25fZG9uZSwKIAkJCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkJCQlTdHJpbmcudmFsdWVPZihpICsgMSksCiAJCQkJCQkJCVN0cmluZy52YWx1ZU9mKHRoaXMudG90YWxVbml0cyksCi0JCQkJCQkJCW5ldyBTdHJpbmcodW5pdHNUb1Byb2Nlc3NbaV0uZ2V0RmlsZU5hbWUoKSkKKwkJCQkJCQkJbmV3IFN0cmluZyh1bml0LmdldEZpbGVOYW1lKCkpCiAJCQkJCQkJfSkpOwotCQkJCQlwcm9jZXNzKHVuaXQsIGkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCS8vIGNsZWFudXAgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKLQkJCQkJdW5pdC5jbGVhblVwKCk7CiAJCQkJfQotCQkJCXVuaXRzVG9Qcm9jZXNzW2ldID0gbnVsbDsgLy8gcmVsZWFzZSByZWZlcmVuY2UgdG8gcHJvY2Vzc2VkIHVuaXQgZGVjbGFyYXRpb24KLQkJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXQuY29tcGlsYXRpb25SZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQl0aGlzLm91dC5wcmludGxuKAotCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl9kb25lLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlTdHJpbmcudmFsdWVPZihpICsgMSksCi0JCQkJCQkJU3RyaW5nLnZhbHVlT2YodGhpcy50b3RhbFVuaXRzKSwKLQkJCQkJCQluZXcgU3RyaW5nKHVuaXQuZ2V0RmlsZU5hbWUoKSkKLQkJCQkJCX0pKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvY2Vzc2luZ1Rhc2sgPSBuZXcgUHJvY2Vzc1Rhc2tNYW5hZ2VyKHRoaXMpOworCQkJCWludCBhY2NlcHRlZENvdW50ID0gMDsKKwkJCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpCisJCQkJLy8gdGhlIHByb2Nlc3NUYXNrIGNhbiBjb250aW51ZSB0byBwcm9jZXNzIHVuaXRzIHVudGlsIGl0cyBmaXhlZCBzaXplZCBjYWNoZSBpcyBmdWxsIHRoZW4gaXQgbXVzdCB3YWl0CisJCQkJLy8gZm9yIHRoaXMgdGhpcyB0aHJlYWQgdG8gYWNjZXB0IHRoZSB1bml0cyBhcyB0aGV5IGFwcGVhciAoaXQgb25seSB3YWl0cyBpZiBubyB1bml0cyBhcmUgYXZhaWxhYmxlKQorCQkJCXdoaWxlICh0cnVlKSB7CisJCQkJCXRyeSB7CisJCQkJCQl1bml0ID0gcHJvY2Vzc2luZ1Rhc2sucmVtb3ZlTmV4dFVuaXQoKTsgLy8gd2FpdHMgaWYgbm8gdW5pdHMgYXJlIGluIHRoZSBwcm9jZXNzZWQgcXVldWUKKwkJCQkJfSBjYXRjaCAoRXJyb3IgZSkgeworCQkJCQkJdW5pdCA9IHByb2Nlc3NpbmdUYXNrLnVuaXRUb1Byb2Nlc3M7CisJCQkJCQl0aHJvdyBlOworCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXVuaXQgPSBwcm9jZXNzaW5nVGFzay51bml0VG9Qcm9jZXNzOworCQkJCQkJdGhyb3cgZTsKKwkJCQkJfQorCQkJCQlpZiAodW5pdCA9PSBudWxsKSBicmVhazsKKwkJCQkJcmVwb3J0V29ya2VkKDEsIGFjY2VwdGVkQ291bnQrKyk7CisJCQkJCXRoaXMuc3RhdHMubGluZUNvdW50ICs9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucy5sZW5ndGg7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQkJCWlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkKKwkJCQkJCXRoaXMub3V0LnByaW50bG4oCisJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl9kb25lLAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKGFjY2VwdGVkQ291bnQpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZih0aGlzLnRvdGFsVW5pdHMpLAorCQkJCQkJCQluZXcgU3RyaW5nKHVuaXQuZ2V0RmlsZU5hbWUoKSkKKwkJCQkJCQl9KSk7CisJCQkJfQogCQkJfQogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCk7CkBAIC00MTQsMTkgKzUyNSwzNCBAQAogCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0LCBudWxsKTsKIAkJCXRocm93IGU7IC8vIHJldGhyb3cKIAkJfSBmaW5hbGx5IHsKLQkJCXRoaXMucmVzZXQoKTsKKwkJCWlmIChwcm9jZXNzaW5nVGFzayAhPSBudWxsKSB7CisJCQkJcHJvY2Vzc2luZ1Rhc2suc2h1dGRvd24oKTsKKwkJCQlwcm9jZXNzaW5nVGFzayA9IG51bGw7CisJCQl9CisJCQlyZXNldCgpOworCQkJdGhpcy5hbm5vdGF0aW9uUHJvY2Vzc29yU3RhcnRJbmRleCAgPSAwOworCQkJdGhpcy5zdGF0cy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAJCX0KLQkJaWYgKG9wdGlvbnMudmVyYm9zZSkgeworCQlpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHsKIAkJCWlmICh0aGlzLnRvdGFsVW5pdHMgPiAxKSB7CiAJCQkJdGhpcy5vdXQucHJpbnRsbigKLQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl91bml0cywgU3RyaW5nLnZhbHVlT2YodGhpcy50b3RhbFVuaXRzKSkpOyAKKwkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl91bml0cywgU3RyaW5nLnZhbHVlT2YodGhpcy50b3RhbFVuaXRzKSkpOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLm91dC5wcmludGxuKAotCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbXBpbGF0aW9uX3VuaXQsIFN0cmluZy52YWx1ZU9mKHRoaXMudG90YWxVbml0cykpKTsgCisJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29tcGlsYXRpb25fdW5pdCwgU3RyaW5nLnZhbHVlT2YodGhpcy50b3RhbFVuaXRzKSkpOwogCQkJfQogCQl9CiAJfQotCQorCisJcHVibGljIHN5bmNocm9uaXplZCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBnZXRVbml0VG9Qcm9jZXNzKGludCBuZXh0KSB7CisJCWlmIChuZXh0IDwgdGhpcy50b3RhbFVuaXRzKSB7CisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gdGhpcy51bml0c1RvUHJvY2Vzc1tuZXh0XTsKKwkJCXRoaXMudW5pdHNUb1Byb2Nlc3NbbmV4dF0gPSBudWxsOyAvLyByZWxlYXNlIHJlZmVyZW5jZSB0byBwcm9jZXNzZWQgdW5pdCBkZWNsYXJhdGlvbgorCQkJcmV0dXJuIHVuaXQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCiAJcHVibGljIHZvaWQgc2V0QmluYXJ5VHlwZXMoUmVmZXJlbmNlQmluZGluZ1tdIGJpbmFyeVR5cGVzKSB7CiAJCXRoaXMucmVmZXJlbmNlQmluZGluZ3MgPSBiaW5hcnlUeXBlczsKIAl9CkBAIC00MzgsNTIgKzU2NCw0NyBAQAogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LAogCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKIAotCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdCAhPSBudWxsKSkgeworCQlpZiAocmVzdWx0ID09IG51bGwgJiYgdW5pdCAhPSBudWxsKSB7CiAJCQlyZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OyAvLyBjdXJyZW50IHVuaXQgYmVpbmcgcHJvY2Vzc2VkID8KIAkJfQogCQkvLyBMb29rdXAgZW52aXJvbm1lbnQgbWF5IGJlIGluIG1pZGRsZSBvZiBjb25uZWN0aW5nIHR5cGVzCi0JCWlmICgocmVzdWx0ID09IG51bGwpICYmIGxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCAhPSBudWxsKSB7Ci0JCSAgICByZXN1bHQgPSBsb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQuY29tcGlsYXRpb25SZXN1bHQ7Ci0JCX0JCQotCQkvLyBMb29rdXAgZW52aXJvbm1lbnQgbWF5IGJlIGluIG1pZGRsZSBvZiBjb25uZWN0aW5nIHR5cGVzCi0JCWlmICgocmVzdWx0ID09IG51bGwpICYmIGxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCAhPSBudWxsKSB7Ci0JCSAgICByZXN1bHQgPSBsb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQuY29tcGlsYXRpb25SZXN1bHQ7Ci0JCX0JCQotCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCkgJiYgKHRvdGFsVW5pdHMgPiAwKSkKLQkJCXJlc3VsdCA9IHVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsKKwkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkICE9IG51bGwpIHsKKwkJICAgIHJlc3VsdCA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkLmNvbXBpbGF0aW9uUmVzdWx0OworCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQkJaWYgKHRoaXMudW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCAmJiB0aGlzLnRvdGFsVW5pdHMgPiAwKQorCQkJCQlyZXN1bHQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW3RoaXMudG90YWxVbml0cyAtIDFdLmNvbXBpbGF0aW9uUmVzdWx0OworCQkJfQorCQl9CiAJCS8vIGxhc3QgdW5pdCBpbiBiZWdpblRvQ29tcGlsZSA/CiAKIAkJYm9vbGVhbiBuZWVkVG9QcmludCA9IHRydWU7CiAJCWlmIChyZXN1bHQgIT0gbnVsbCkgewogCQkJLyogY3JlYXRlIGFuZCByZWNvcmQgYSBjb21waWxhdGlvbiBwcm9ibGVtICovCi0JCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0JCQlpbnRlcm5hbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCk7Ci0KKwkJCS8vIG9ubHkga2VlcCBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIHRyYWNlCiAJCQlTdHJpbmdbXSBwYkFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJTWVzc2FnZXMuY29tcGlsYXRpb25faW50ZXJuYWxFcnJvcgotCQkJCQkrICJcbiIgIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBidWZmZXIudG9TdHJpbmcoKX07CisJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl9pbnRlcm5hbEVycm9yLCBVdGlsLmdldEV4Y2VwdGlvblN1bW1hcnkoaW50ZXJuYWxFeGNlcHRpb24pKSwKKwkJCX07CiAKIAkJCXJlc3VsdAogCQkJCS5yZWNvcmQoCi0JCQkJCXByb2JsZW1SZXBvcnRlcgotCQkJCQkuY3JlYXRlUHJvYmxlbSgKLQkJCQkJCXJlc3VsdC5nZXRGaWxlTmFtZSgpLAotCQkJCQkJSVByb2JsZW0uVW5jbGFzc2lmaWVkLAotCQkJCQkJcGJBcmd1bWVudHMsCi0JCQkJCQlwYkFyZ3VtZW50cywKLQkJCQkJCUVycm9yLCAvLyBzZXZlcml0eQotCQkJCQkJMCwgLy8gc291cmNlIHN0YXJ0Ci0JCQkJCQkwLCAvLyBzb3VyY2UgZW5kCi0JCQkJCQkwLCAvLyBsaW5lIG51bWJlcgotCQkJCQkJMCksLy8gY29sdW1uIG51bWJlcgorCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcgorCQkJCQkJLmNyZWF0ZVByb2JsZW0oCisJCQkJCQkJcmVzdWx0LmdldEZpbGVOYW1lKCksCisJCQkJCQkJSVByb2JsZW0uVW5jbGFzc2lmaWVkLAorCQkJCQkJCXBiQXJndW1lbnRzLAorCQkJCQkJCXBiQXJndW1lbnRzLAorCQkJCQkJCUVycm9yLCAvLyBzZXZlcml0eQorCQkJCQkJCTAsIC8vIHNvdXJjZSBzdGFydAorCQkJCQkJCTAsIC8vIHNvdXJjZSBlbmQKKwkJCQkJCQkwLCAvLyBsaW5lIG51bWJlcgorCQkJCQkJCTApLC8vIGNvbHVtbiBudW1iZXIKIAkJCQkJdW5pdCk7CiAKIAkJCS8qIGhhbmQgYmFjayB0aGUgY29tcGlsYXRpb24gcmVzdWx0ICovCiAJCQlpZiAoIXJlc3VsdC5oYXNCZWVuQWNjZXB0ZWQpIHsKLQkJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOworCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFJlc3VsdChyZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKIAkJCQluZWVkVG9QcmludCA9IGZhbHNlOwogCQkJfQogCQl9CkBAIC01MDksMTkgKzYzMCwyMyBAQAogCQl9CiAKIAkJLyogdW5jb21tZW50IGZvbGxvd2luZyBsaW5lIHRvIHNlZSB3aGVyZSB0aGUgYWJvcnQgY2FtZSBmcm9tICovCi0JCS8vIGFib3J0RXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyAKKwkJLy8gYWJvcnRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CiAKIAkJLy8gRXhjZXB0aW9uIG1heSB0ZWxsIHdoaWNoIGNvbXBpbGF0aW9uIHJlc3VsdCBpdCBpcyByZWxhdGVkLCBhbmQgd2hpY2ggcHJvYmxlbSBjYXVzZWQgaXQKIAkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gYWJvcnRFeGNlcHRpb24uY29tcGlsYXRpb25SZXN1bHQ7Ci0JCWlmICgocmVzdWx0ID09IG51bGwpICYmICh1bml0ICE9IG51bGwpKSB7CisJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB1bml0ICE9IG51bGwpIHsKIAkJCXJlc3VsdCA9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQ7IC8vIGN1cnJlbnQgdW5pdCBiZWluZyBwcm9jZXNzZWQgPwogCQl9CiAJCS8vIExvb2t1cCBlbnZpcm9ubWVudCBtYXkgYmUgaW4gbWlkZGxlIG9mIGNvbm5lY3RpbmcgdHlwZXMKLQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgJiYgbG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkICE9IG51bGwpIHsKLQkJICAgIHJlc3VsdCA9IGxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZC5jb21waWxhdGlvblJlc3VsdDsKKwkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkICE9IG51bGwpIHsKKwkJICAgIHJlc3VsdCA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkLmNvbXBpbGF0aW9uUmVzdWx0OwogCQl9Ci0JCWlmICgocmVzdWx0ID09IG51bGwpICYmICh1bml0c1RvUHJvY2VzcyAhPSBudWxsKSAmJiAodG90YWxVbml0cyA+IDApKQotCQkJcmVzdWx0ID0gdW5pdHNUb1Byb2Nlc3NbdG90YWxVbml0cyAtIDFdLmNvbXBpbGF0aW9uUmVzdWx0OworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJCWlmICh0aGlzLnVuaXRzVG9Qcm9jZXNzICE9IG51bGwgJiYgdGhpcy50b3RhbFVuaXRzID4gMCkKKwkJCQkJcmVzdWx0ID0gdGhpcy51bml0c1RvUHJvY2Vzc1t0aGlzLnRvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsKKwkJCX0KKwkJfQogCQkvLyBsYXN0IHVuaXQgaW4gYmVnaW5Ub0NvbXBpbGUgPwogCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5oYXNCZWVuQWNjZXB0ZWQpIHsKIAkJCS8qIGRpc3RhbnQgcHJvYmxlbSB3aGljaCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQgYmFjayB0aGVyZT8gKi8KQEAgLTU0OCw3ICs2NzMsNyBAQAogCQkJfQogCQkJLyogaGFuZCBiYWNrIHRoZSBjb21waWxhdGlvbiByZXN1bHQgKi8KIAkJCWlmICghcmVzdWx0Lmhhc0JlZW5BY2NlcHRlZCkgewotCQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQocmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOwogCQkJfQogCQl9IGVsc2UgewogCQkJYWJvcnRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CkBAIC01NTksMTkgKzY4NCwxOSBAQAogCiAJCXRoaXMucGFyc2VyID0gbmV3IFBhcnNlcih0aGlzLnByb2JsZW1SZXBvcnRlciwgdGhpcy5vcHRpb25zLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMpOwogCX0KLQkKKwogCS8qKgogCSAqIEFkZCB0aGUgaW5pdGlhbCBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgaW50byB0aGUgbG9vcAogCSAqICAtPiAgYnVpbGQgY29tcGlsYXRpb24gdW5pdCBkZWNsYXJhdGlvbnMsIHRoZWlyIGJpbmRpbmdzIGFuZCByZWNvcmQgdGhlaXIgcmVzdWx0cy4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEJlZ2luVG9Db21waWxlKElDb21waWxhdGlvblVuaXRbXSBzb3VyY2VVbml0cywgaW50IG1heFVuaXRzKSB7CisJCWlmICghdGhpcy51c2VTaW5nbGVUaHJlYWQgJiYgbWF4VW5pdHMgPj0gUmVhZE1hbmFnZXIuVEhSRVNIT0xEKQorCQkJdGhpcy5wYXJzZXIucmVhZE1hbmFnZXIgPSBuZXcgUmVhZE1hbmFnZXIoc291cmNlVW5pdHMsIG1heFVuaXRzKTsKKwogCQkvLyBTd2l0Y2ggdGhlIGN1cnJlbnQgcG9saWN5IGFuZCBjb21waWxhdGlvbiByZXN1bHQgZm9yIHRoaXMgdW5pdCB0byB0aGUgcmVxdWVzdGVkIG9uZS4KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhVbml0czsgaSsrKSB7Ci0JCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0OwotCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9Ci0JCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXRzW2ldLCBpLCBtYXhVbml0cywgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCQl0cnkgewotCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpIHsKKwkJCQlpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHsKIAkJCQkJdGhpcy5vdXQucHJpbnRsbigKIAkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29tcGlsYXRpb25fcmVxdWVzdCwKIAkJCQkJCW5ldyBTdHJpbmdbXSB7CkBAIC01ODEsMTQgKzcwNiwyMSBAQAogCQkJCQkJfSkpOwogCQkJCX0KIAkJCQkvLyBkaWV0IHBhcnNpbmcgZm9yIGxhcmdlIGNvbGxlY3Rpb24gb2YgdW5pdHMKLQkJCQlpZiAodG90YWxVbml0cyA8IHBhcnNlVGhyZXNob2xkKSB7Ci0JCQkJCXBhcnNlZFVuaXQgPSBwYXJzZXIucGFyc2Uoc291cmNlVW5pdHNbaV0sIHVuaXRSZXN1bHQpOworCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7CisJCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9CisJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0c1tpXSwgaSwgbWF4VW5pdHMsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJCWxvbmcgcGFyc2VTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCWlmICh0aGlzLnRvdGFsVW5pdHMgPCB0aGlzLnBhcnNlVGhyZXNob2xkKSB7CisJCQkJCXBhcnNlZFVuaXQgPSB0aGlzLnBhcnNlci5wYXJzZShzb3VyY2VVbml0c1tpXSwgdW5pdFJlc3VsdCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJcGFyc2VkVW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdHNbaV0sIHVuaXRSZXN1bHQpOworCQkJCQlwYXJzZWRVbml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXRzW2ldLCB1bml0UmVzdWx0KTsKIAkJCQl9CisJCQkJbG9uZyByZXNvbHZlU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQl0aGlzLnN0YXRzLnBhcnNlVGltZSArPSByZXNvbHZlU3RhcnQgLSBwYXJzZVN0YXJ0OwogCQkJCS8vIGluaXRpYWwgdHlwZSBiaW5kaW5nIGNyZWF0aW9uCi0JCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgbnVsbCAvKm5vIGFjY2VzcyByZXN0cmljdGlvbiovKTsKLQkJCQl0aGlzLmFkZENvbXBpbGF0aW9uVW5pdChzb3VyY2VVbml0c1tpXSwgcGFyc2VkVW5pdCk7CisJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBudWxsIC8qbm8gYWNjZXNzIHJlc3RyaWN0aW9uKi8pOworCQkJCXRoaXMuc3RhdHMucmVzb2x2ZVRpbWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSByZXNvbHZlU3RhcnQ7CisJCQkJYWRkQ29tcGlsYXRpb25Vbml0KHNvdXJjZVVuaXRzW2ldLCBwYXJzZWRVbml0KTsKIAkJCQlJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UgPSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlOwogCQkJCWlmIChjdXJyZW50UGFja2FnZSAhPSBudWxsKSB7CiAJCQkJCXVuaXRSZXN1bHQucmVjb3JkUGFja2FnZU5hbWUoY3VycmVudFBhY2thZ2UudG9rZW5zKTsKQEAgLTU5OSw4ICs3MzEsMTIgQEAKIAkJCQlzb3VyY2VVbml0c1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBob2xkIG9udG8gdGhlIHVuaXQKIAkJCX0KIAkJfQorCQlpZiAodGhpcy5wYXJzZXIucmVhZE1hbmFnZXIgIT0gbnVsbCkgeworCQkJdGhpcy5wYXJzZXIucmVhZE1hbmFnZXIuc2h1dGRvd24oKTsKKwkJCXRoaXMucGFyc2VyLnJlYWRNYW5hZ2VyID0gbnVsbDsKKwkJfQogCQkvLyBiaW5kaW5nIHJlc29sdXRpb24KLQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncygpOwogCX0KIAogCS8qKgpAQCAtNjA4LDMyICs3NDQsNDYgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBwcm9jZXNzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsIGludCBpKSB7CiAJCXRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkID0gdW5pdDsKKwkJbG9uZyBwYXJzZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKIAkJdGhpcy5wYXJzZXIuZ2V0TWV0aG9kQm9kaWVzKHVuaXQpOwogCisJCWxvbmcgcmVzb2x2ZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXRoaXMuc3RhdHMucGFyc2VUaW1lICs9IHJlc29sdmVTdGFydCAtIHBhcnNlU3RhcnQ7CisKIAkJLy8gZmF1bHQgaW4gZmllbGRzICYgbWV0aG9kcwogCQlpZiAodW5pdC5zY29wZSAhPSBudWxsKQogCQkJdW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKIAogCQkvLyB2ZXJpZnkgaW5oZXJpdGVkIG1ldGhvZHMKIAkJaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkKLQkJCXVuaXQuc2NvcGUudmVyaWZ5TWV0aG9kcyhsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsKKwkJCXVuaXQuc2NvcGUudmVyaWZ5TWV0aG9kcyh0aGlzLmxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCkpOwogCiAJCS8vIHR5cGUgY2hlY2tpbmcKIAkJdW5pdC5yZXNvbHZlKCk7CiAKLQkJLy8gZmxvdyBhbmFseXNpcwotCQl1bml0LmFuYWx5c2VDb2RlKCk7CisJCWxvbmcgYW5hbHl6ZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXRoaXMuc3RhdHMucmVzb2x2ZVRpbWUgKz0gYW5hbHl6ZVN0YXJ0IC0gcmVzb2x2ZVN0YXJ0OworCQkKKwkJLy9ObyBuZWVkIG9mIGFuYWx5c2lzIG9yIGdlbmVyYXRpb24gb2YgY29kZSBpZiBzdGF0ZW1lbnRzIGFyZSBub3QgcmVxdWlyZWQJCQorCQlpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVNZXRob2RCb2RpZXMpIHVuaXQuYW5hbHlzZUNvZGUoKTsgLy8gZmxvdyBhbmFseXNpcwogCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbgotCQl1bml0LmdlbmVyYXRlQ29kZSgpOwotCisJCWxvbmcgZ2VuZXJhdGVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl0aGlzLnN0YXRzLmFuYWx5emVUaW1lICs9IGdlbmVyYXRlU3RhcnQgLSBhbmFseXplU3RhcnQ7CisJCisJCWlmICghdGhpcy5vcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcykgdW5pdC5nZW5lcmF0ZUNvZGUoKTsgLy8gY29kZSBnZW5lcmF0aW9uCisJCQogCQkvLyByZWZlcmVuY2UgaW5mbwotCQlpZiAob3B0aW9ucy5wcm9kdWNlUmVmZXJlbmNlSW5mbyAmJiB1bml0LnNjb3BlICE9IG51bGwpCisJCWlmICh0aGlzLm9wdGlvbnMucHJvZHVjZVJlZmVyZW5jZUluZm8gJiYgdW5pdC5zY29wZSAhPSBudWxsKQogCQkJdW5pdC5zY29wZS5zdG9yZURlcGVuZGVuY3lJbmZvKCk7CiAKKwkJLy8gZmluYWxpemUgcHJvYmxlbXMgKHN1cHByZXNzV2FybmluZ3MpCisJCXVuaXQuZmluYWxpemVQcm9ibGVtcygpOworCisJCXRoaXMuc3RhdHMuZ2VuZXJhdGVUaW1lICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZ2VuZXJhdGVTdGFydDsKKwogCQkvLyByZWZyZXNoIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pdHMga25vd24gYXQgdGhpcyBzdGFnZQotCQl1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRvdGFsVW5pdHNLbm93biA9IHRvdGFsVW5pdHM7CisJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQudG90YWxVbml0c0tub3duID0gdGhpcy50b3RhbFVuaXRzOwogCiAJCXRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkID0gbnVsbDsKIAl9CkBAIC02NDEsOCArNzkxLDggQEAKIAlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQW5ub3RhdGlvbnMoKSB7CiAJCWludCBuZXdVbml0U2l6ZSA9IDA7CiAJCWludCBuZXdDbGFzc0ZpbGVzU2l6ZSA9IDA7Ci0JCWludCBib3R0b20gPSAwOwotCQlpbnQgdG9wID0gdGhpcy51bml0c1RvUHJvY2Vzcy5sZW5ndGg7CisJCWludCBib3R0b20gPSB0aGlzLmFubm90YXRpb25Qcm9jZXNzb3JTdGFydEluZGV4OworCQlpbnQgdG9wID0gdGhpcy50b3RhbFVuaXRzOwogCQlSZWZlcmVuY2VCaW5kaW5nW10gYmluYXJ5VHlwZUJpbmRpbmdzVGVtcCA9IHRoaXMucmVmZXJlbmNlQmluZGluZ3M7CiAJCWlmICh0b3AgPT0gMCAmJiBiaW5hcnlUeXBlQmluZGluZ3NUZW1wID09IG51bGwpIHJldHVybjsKIAkJdGhpcy5yZWZlcmVuY2VCaW5kaW5ncyA9IG51bGw7CkBAIC02NjcsMjYgKzgxNyw1MCBAQAogCQkJYmluYXJ5VHlwZUJpbmRpbmdzVGVtcCA9IG5ld0NsYXNzRmlsZXM7CiAJCQluZXdDbGFzc0ZpbGVzU2l6ZSA9IG5ld0NsYXNzRmlsZXMubGVuZ3RoOwogCQkJaWYgKG5ld1VuaXRTaXplICE9IDApIHsKLQkJCQkvLyB3ZSByZXNldCB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8gcmVzdGFydCB3aXRoIHRoZSBuZXcgdW5pdHMKLQkJCQlpbnRlcm5hbEJlZ2luVG9Db21waWxlKG5ld1VuaXRzLCBuZXdVbml0U2l6ZSk7CisJCQkJSUNvbXBpbGF0aW9uVW5pdFtdIG5ld1Byb2Nlc3NlZFVuaXRzID0gKElDb21waWxhdGlvblVuaXRbXSkgbmV3VW5pdHMuY2xvbmUoKTsgLy8gcmVtZW1iZXIgbmV3IHVuaXRzIGluIGNhc2UgYSBzb3VyY2UgdHlwZSBjb2xsaXNpb24gb2NjdXJzCisJCQkJdHJ5IHsKKwkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5pc1Byb2Nlc3NpbmdBbm5vdGF0aW9ucyA9IHRydWU7CisJCQkJCWludGVybmFsQmVnaW5Ub0NvbXBpbGUobmV3VW5pdHMsIG5ld1VuaXRTaXplKTsKKwkJCQl9IGNhdGNoIChTb3VyY2VUeXBlQ29sbGlzaW9uRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5uZXdBbm5vdGF0aW9uUHJvY2Vzc29yVW5pdHMgPSBuZXdQcm9jZXNzZWRVbml0czsKKwkJCQkJdGhyb3cgZTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmlzUHJvY2Vzc2luZ0Fubm90YXRpb25zID0gZmFsc2U7CisJCQkJCXRoaXMuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIucmVzZXQoKTsKKwkJCQl9CiAJCQkJYm90dG9tID0gdG9wOwogCQkJCXRvcCA9IHRoaXMudG90YWxVbml0czsgLy8gbGFzdCB1bml0IGFkZGVkCiAJCQl9IGVsc2UgewogCQkJCWJvdHRvbSA9IHRvcDsKKwkJCQl0aGlzLmFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyLnJlc2V0KCk7CiAJCQl9Ci0JCQl0aGlzLmFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyLnJlc2V0KCk7CiAJCX0gd2hpbGUgKG5ld1VuaXRTaXplICE9IDAgfHwgbmV3Q2xhc3NGaWxlc1NpemUgIT0gMCk7Ci0JCS8vIG9uZSBtb3JlIGxvb3AgdG8gY3JlYXRlIHBvc3NpYmxlIHJlc291cmNlcwotCQkvLyB0aGlzIGxvb3AgY2Fubm90IGNyZWF0ZSBhbnkgamF2YSBzb3VyY2UgZmlsZXMKLQkJLy8gVE9ETyAob2xpdmllcikgd2Ugc2hvdWxkIGNoZWNrIGlmIHdlIHNob3VsZCBwYXNzIGFueSB1bml0IGF0IGFsbCBmb3IgdGhlIGxhc3Qgcm91bmQKKwkJCiAJCXRoaXMuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIucHJvY2Vzc0Fubm90YXRpb25zKG51bGwsIG51bGwsIHRydWUpOwotCQkvLyBUT0RPIHdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgdGhpcyBsb29wIGNyZWF0ZWQgbmV3IHVuaXRzCisJCS8vIHByb2Nlc3MgcG90ZW50aWFsIHVuaXRzIGFkZGVkIGluIHRoZSBmaW5hbCByb3VuZCBzZWUgMzI5MTU2IAorCQlJQ29tcGlsYXRpb25Vbml0W10gbmV3VW5pdHMgPSB0aGlzLmFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyLmdldE5ld1VuaXRzKCk7CisJCW5ld1VuaXRTaXplID0gbmV3VW5pdHMubGVuZ3RoOworCQlpZiAobmV3VW5pdFNpemUgIT0gMCkgeworCQkJSUNvbXBpbGF0aW9uVW5pdFtdIG5ld1Byb2Nlc3NlZFVuaXRzID0gKElDb21waWxhdGlvblVuaXRbXSkgbmV3VW5pdHMuY2xvbmUoKTsgLy8gcmVtZW1iZXIgbmV3IHVuaXRzIGluIGNhc2UgYSBzb3VyY2UgdHlwZSBjb2xsaXNpb24gb2NjdXJzCisJCQl0cnkgeworCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuaXNQcm9jZXNzaW5nQW5ub3RhdGlvbnMgPSB0cnVlOworCQkJCWludGVybmFsQmVnaW5Ub0NvbXBpbGUobmV3VW5pdHMsIG5ld1VuaXRTaXplKTsKKwkJCX0gY2F0Y2ggKFNvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24gZSkgeworCQkJCWUubmV3QW5ub3RhdGlvblByb2Nlc3NvclVuaXRzID0gbmV3UHJvY2Vzc2VkVW5pdHM7CisJCQkJdGhyb3cgZTsKKwkJCX0gZmluYWxseSB7CisJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5pc1Byb2Nlc3NpbmdBbm5vdGF0aW9ucyA9IGZhbHNlOworCQkJCXRoaXMuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIucmVzZXQoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIucmVzZXQoKTsKKwkJfQogCX0KIAogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlsb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOwotCQlwYXJzZXIuc2Nhbm5lci5zb3VyY2UgPSBudWxsOwotCQl1bml0c1RvUHJvY2VzcyA9IG51bGw7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsKKwkJdGhpcy5wYXJzZXIuc2Nhbm5lci5zb3VyY2UgPSBudWxsOworCQl0aGlzLnVuaXRzVG9Qcm9jZXNzID0gbnVsbDsKIAkJaWYgKERlYnVnUmVxdWVzdG9yICE9IG51bGwpIERlYnVnUmVxdWVzdG9yLnJlc2V0KCk7CiAJCXRoaXMucHJvYmxlbVJlcG9ydGVyLnJlc2V0KCk7CiAJfQpAQCAtNjk1LDI1ICs4NjksMzUgQEAKIAkgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4gQ2FuIHJ1biBhIHN1YnNldCBvZiB0aGUgY29tcGlsYXRpb24gcHJvY2VzcwogCSAqLwogCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXNvbHZlKAotCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgCi0JCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIAorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwKKwkJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwKIAkJCWJvb2xlYW4gdmVyaWZ5TWV0aG9kcywKIAkJCWJvb2xlYW4gYW5hbHl6ZUNvZGUsCiAJCQlib29sZWFuIGdlbmVyYXRlQ29kZSkgewotCQkJCQorCiAJCXRyeSB7CiAJCQlpZiAodW5pdCA9PSBudWxsKSB7CiAJCQkJLy8gYnVpbGQgYW5kIHJlY29yZCBwYXJzZWQgdW5pdHMKLQkJCQlwYXJzZVRocmVzaG9sZCA9IDA7IC8vIHdpbGwgcmVxdWVzdCBhIGZ1bGwgcGFyc2UKKwkJCQl0aGlzLnBhcnNlVGhyZXNob2xkID0gMDsgLy8gd2lsbCByZXF1ZXN0IGEgZnVsbCBwYXJzZQogCQkJCWJlZ2luVG9Db21waWxlKG5ldyBJQ29tcGlsYXRpb25Vbml0W10geyBzb3VyY2VVbml0IH0pOwotCQkJCS8vIHByb2Nlc3MgYWxsIHVuaXRzIChzb21lIG1vcmUgY291bGQgYmUgaW5qZWN0ZWQgaW4gdGhlIGxvb3AgYnkgdGhlIGxvb2t1cCBlbnZpcm9ubWVudCkKLQkJCQl1bml0ID0gdW5pdHNUb1Byb2Nlc3NbMF07CisJCQkJLy8gZmluZCB0aGUgcmlnaHQgdW5pdCBmcm9tIHdoYXQgd2FzIGluamVjdGVkIHZpYSBhY2NlcHQoSUNvbXBpbGF0aW9uVW5pdCwuLik6CisJCQkJZm9yIChpbnQgaT0wOyBpPHRoaXMudG90YWxVbml0czsgaSsrKSB7CisJCQkJCWlmICggICB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldICE9IG51bGwKKwkJCQkJCSYmIHRoaXMudW5pdHNUb1Byb2Nlc3NbaV0uY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0ID09IHNvdXJjZVVuaXQpCisJCQkJCXsKKwkJCQkJCXVuaXQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHVuaXQgPT0gbnVsbCkKKwkJCQkJdW5pdCA9IHRoaXMudW5pdHNUb1Byb2Nlc3NbMF07IC8vIGZhbGwgYmFjayB0byBvbGQgYmVoYXZpb3IKKwogCQkJfSBlbHNlIHsKIAkJCQkvLyBpbml0aWFsIHR5cGUgYmluZGluZyBjcmVhdGlvbgotCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQsIG51bGwgLypubyBhY2Nlc3MgcmVzdHJpY3Rpb24qLyk7CisJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0LCBudWxsIC8qbm8gYWNjZXNzIHJlc3RyaWN0aW9uKi8pOwogCiAJCQkJLy8gYmluZGluZyByZXNvbHV0aW9uCi0JCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKCk7CiAJCQl9CiAJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCA9IHVuaXQ7CiAJCQl0aGlzLnBhcnNlci5nZXRNZXRob2RCb2RpZXModW5pdCk7CkBAIC03MjMsMjMgKzkwNywyNiBAQAogCQkJCWlmICh1bml0LnNjb3BlICE9IG51bGwgJiYgdmVyaWZ5TWV0aG9kcykgewogCQkJCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTE3CiAgCQkJCQkvLyB2ZXJpZnkgaW5oZXJpdGVkIG1ldGhvZHMKLQkJCQkJdW5pdC5zY29wZS52ZXJpZnlNZXRob2RzKGxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCkpOworCQkJCQl1bml0LnNjb3BlLnZlcmlmeU1ldGhvZHModGhpcy5sb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsKIAkJCQl9CiAJCQkJLy8gdHlwZSBjaGVja2luZwotCQkJCXVuaXQucmVzb2x2ZSgpOwkJCisJCQkJdW5pdC5yZXNvbHZlKCk7CiAKIAkJCQkvLyBmbG93IGFuYWx5c2lzCiAJCQkJaWYgKGFuYWx5emVDb2RlKSB1bml0LmFuYWx5c2VDb2RlKCk7Ci0JCQorCiAJCQkJLy8gY29kZSBnZW5lcmF0aW9uCiAJCQkJaWYgKGdlbmVyYXRlQ29kZSkgdW5pdC5nZW5lcmF0ZUNvZGUoKTsKKworCQkJCS8vIGZpbmFsaXplIHByb2JsZW1zIChzdXBwcmVzc1dhcm5pbmdzKQorCQkJCXVuaXQuZmluYWxpemVQcm9ibGVtcygpOwogCQkJfQotCQkJaWYgKHVuaXRzVG9Qcm9jZXNzICE9IG51bGwpIHVuaXRzVG9Qcm9jZXNzWzBdID0gbnVsbDsgLy8gcmVsZWFzZSByZWZlcmVuY2UgdG8gcHJvY2Vzc2VkIHVuaXQgZGVjbGFyYXRpb24KLQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOworCQkJaWYgKHRoaXMudW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCkgdGhpcy51bml0c1RvUHJvY2Vzc1swXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uCisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOwogCQkJcmV0dXJuIHVuaXQ7CiAJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewogCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0KTsKLQkJCXJldHVybiB1bml0ID09IG51bGwgPyB1bml0c1RvUHJvY2Vzc1swXSA6IHVuaXQ7CisJCQlyZXR1cm4gdW5pdCA9PSBudWxsID8gdGhpcy51bml0c1RvUHJvY2Vzc1swXSA6IHVuaXQ7CiAJCX0gY2F0Y2ggKEVycm9yIGUpIHsKIAkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCwgbnVsbCk7CiAJCQl0aHJvdyBlOyAvLyByZXRocm93CkBAIC03NjMsMTEgKzk1MCwxMSBAQAogCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBnaXZlbiBjb21waWxhdGlvbiB1bml0LiBDYW4gcnVuIGEgc3Vic2V0IG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCiAJICovCiAJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlc29sdmUoCi0JCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIAorCQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LAogCQkJYm9vbGVhbiB2ZXJpZnlNZXRob2RzLAogCQkJYm9vbGVhbiBhbmFseXplQ29kZSwKIAkJCWJvb2xlYW4gZ2VuZXJhdGVDb2RlKSB7Ci0JCQkJCisKIAkJcmV0dXJuIHJlc29sdmUoCiAJCQludWxsLAogCQkJc291cmNlVW5pdCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxNjJiYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29uZmlndXJhYmxlT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKLQotLyoqCi0gKiBHZW5lcmljIG9wdGlvbiBkZXNjcmlwdGlvbiwgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgZnJvbSB0aGUKLSAqIGNvbXBvbmVudCBpdCBiZWxvbmdzIHRvLgotICogCi0gKiBAZGVwcmVjYXRlZCBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlT3B0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lOwotCXByaXZhdGUgU3RyaW5nIG9wdGlvbk5hbWU7Ci0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgaW50IGN1cnJlbnRWYWx1ZUluZGV4OwotCXByaXZhdGUgU3RyaW5nW10gcG9zc2libGVWYWx1ZXM7Ci0KLQkvLyBzcGVjaWFsIHZhbHVlIGZvciA8cG9zc2libGVWYWx1ZXM+IGluZGljYXRpbmcgdGhhdCAKLQkvLyB0aGUgPGN1cnJlbnRWYWx1ZUluZGV4PiBpcyB0aGUgYWN0dWFsIHZhbHVlCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBOb0Rpc2NyZXRlVmFsdWUgPSB7fTsgCi0vKioKLSAqIElOVEVSTkFMIFVTRSBPTkxZCi0gKgotICogSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFjY29yZGluZyB0byBhIHNwZWNpZmljIGxvY2FsZQotICoKLSAqIEBwYXJhbSBsb2MgamF2YS51dGlsLkxvY2FsZQotICovCi1wdWJsaWMgQ29uZmlndXJhYmxlT3B0aW9uKAotCVN0cmluZyBjb21wb25lbnROYW1lLCAKLQlTdHJpbmcgb3B0aW9uTmFtZSwgCi0JTG9jYWxlIGxvYywgCi0JaW50IGN1cnJlbnRWYWx1ZUluZGV4KSB7Ci0KLQl0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotCXRoaXMub3B0aW9uTmFtZSA9IG9wdGlvbk5hbWU7Ci0JdGhpcy5jdXJyZW50VmFsdWVJbmRleCA9IGN1cnJlbnRWYWx1ZUluZGV4OwotCQkKLQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQkJcmVzb3VyY2UgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobG9jYXRpb24gKyAiLm9wdGlvbnMiLCBsb2MpOyAvLyROT04tTkxTLTEkCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJY2F0ZWdvcnkgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIiArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbmFtZSA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRlc2NyaXB0aW9uID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIgKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBvc3NpYmxlVmFsdWVzID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwotCQlpZCA9IC0xOwotCX0KLQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuOwotCXRyeSB7Ci0JCWlkID0gSW50ZWdlci5wYXJzZUludChyZXNvdXJjZS5nZXRTdHJpbmcob3B0aW9uTmFtZSArICIubnVtYmVyIikpOyAvLyROT04tTkxTLTEkCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJaWQgPSAtMTsKLQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQlpZCA9IC0xOwotCX0KLQl0cnkgewotCQljYXRlZ29yeSA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5jYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJY2F0ZWdvcnkgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIiArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JdHJ5IHsKLQkJbmFtZSA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQluYW1lID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIrIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JdHJ5IHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzb3VyY2UuZ2V0U3RyaW5nKG9wdGlvbk5hbWUgKyAiLnBvc3NpYmxlVmFsdWVzIiksICJ8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgbnVtYmVyT2ZWYWx1ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCWlmKG51bWJlck9mVmFsdWVzID09IC0xKXsKLQkJCXBvc3NpYmxlVmFsdWVzID0gTm9EaXNjcmV0ZVZhbHVlOwotCQl9IGVsc2UgewotCQkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nW251bWJlck9mVmFsdWVzXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXBvc3NpYmxlVmFsdWVzW2luZGV4XSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJcG9zc2libGVWYWx1ZXMgPSBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7Ci0JfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCXBvc3NpYmxlVmFsdWVzID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwotCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCXBvc3NpYmxlVmFsdWVzID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwotCX0KLQl0cnkgewotCQlkZXNjcmlwdGlvbiA9IHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5kZXNjcmlwdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCWRlc2NyaXB0aW9uID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIrIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBjYXRlZ29yeSBvZiB0aGUgcmVjZWl2ZXIuCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gY2F0ZWdvcnk7Ci19Ci0vKioKLSAqIFJldHVybiBhIFN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIGNvbXBvbmVudCBvd25lciAodHlwaWNhbGx5IHRoZSBxdWFsaWZpZWQKLSAqCXR5cGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaXQgY29ycmVzcG9uZHMgdG8pLgotICoKLSAqIGUuZy4gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuQ29tcGlsZXIiCi0gKgotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLQlyZXR1cm4gY29tcG9uZW50TmFtZTsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBpbmRleCAoaW4gcG9zc2libGVWYWx1ZXMgYXJyYXkpIG9mIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoaXMKLSAqIHBhcnRpY3VsYXIgb3B0aW9uLgotICoKLSAqIEluIGNhc2UgdGhlIHNldCBvZiBwb3NzaWJsZVZhbHVlcyBpcyBOb0Rpc2NyZXRlVmFsdWUsIHRoZW4gdGhpcyBpbmRleCBpcyB0aGUKLSAqIGFjdHVhbCB2YWx1ZSAoZS5nLiBtYXggbGluZSBsZW5naHQgc2V0IHRvIDgwKS4KLSAqCi0gKiBAcmV0dXJuIGludAotICovCi1wdWJsaWMgaW50IGdldEN1cnJlbnRWYWx1ZUluZGV4KCkgewotCXJldHVybiBjdXJyZW50VmFsdWVJbmRleDsKLX0KLS8qKgotICogUmV0dXJuIGFuIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIGRlc2NyaXB0aW9uOwotfQotLyoqCi0gKiBJbnRlcm5hbCBJRCB3aGljaCBhbGxvd3MgdGhlIGNvbmZpZ3VyYWJsZSBjb21wb25lbnQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbi4KLSAqCi0gKiBAcmV0dXJuIGludAotICovCi1wdWJsaWMgaW50IGdldElEKCkgewotCXJldHVybiBpZDsKLX0KLS8qKgotICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyLgotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQlyZXR1cm4gbmFtZTsKLX0KLS8qKgotICogUmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHJlY2VpdmVyLgotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLSAqLwotcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKCkgewotCXJldHVybiBwb3NzaWJsZVZhbHVlczsKLX0KLS8qKgotICogQ2hhbmdlIHRoZSBpbmRleCAoaW4gcG9zc2libGVWYWx1ZXMgYXJyYXkpIG9mIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoaXMKLSAqIHBhcnRpY3VsYXIgb3B0aW9uLgotICoKLSAqIEluIGNhc2UgdGhlIHNldCBvZiBwb3NzaWJsZVZhbHVlcyBpcyBOb0Rpc2NyZXRlVmFsdWUsIHRoZW4gdGhpcyBpbmRleCBpcyB0aGUKLSAqIGFjdHVhbCB2YWx1ZSAoZS5nLiBtYXggbGluZSBsZW5naHQgc2V0IHRvIDgwKS4KLSAqLwotcHVibGljIHZvaWQgc2V0VmFsdWVJbmRleChpbnQgbmV3SW5kZXgpIHsKLQljdXJyZW50VmFsdWVJbmRleCA9IG5ld0luZGV4OwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoIkNvbmZpZ3VyYWJsZSBvcHRpb24gZm9yICIpOyAvLyROT04tTkxTLTEkIAotCWJ1ZmZlci5hcHBlbmQodGhpcy5jb21wb25lbnROYW1lKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgCi0JYnVmZmVyLmFwcGVuZCgiLSBjYXRlZ29yeToJCQkiKS5hcHBlbmQodGhpcy5jYXRlZ29yeSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlidWZmZXIuYXBwZW5kKCItIG5hbWU6CQkJCSIpLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyogZGlzcGxheSBjdXJyZW50IHZhbHVlICovCi0JYnVmZmVyLmFwcGVuZCgiLSBjdXJyZW50IHZhbHVlOgkiKTsgLy8kTk9OLU5MUy0xJCAKLQlpZiAocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLmN1cnJlbnRWYWx1ZUluZGV4KTsKLQl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKHRoaXMucG9zc2libGVWYWx1ZXNbdGhpcy5jdXJyZW50VmFsdWVJbmRleF0pOwotCX0KLQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIAotCQotCS8qIGRpc3BsYXkgcG9zc2libGUgdmFsdWVzICovCi0JaWYgKHBvc3NpYmxlVmFsdWVzICE9IE5vRGlzY3JldGVWYWx1ZSl7Ci0JCWJ1ZmZlci5hcHBlbmQoIi0gcG9zc2libGUgdmFsdWVzOglbIik7IC8vJE5PTi1OTFMtMSQgCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwb3NzaWJsZVZhbHVlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkIAotCQkJYnVmZmVyLmFwcGVuZChwb3NzaWJsZVZhbHVlc1tpXSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgCi0JCWJ1ZmZlci5hcHBlbmQoIi0gY3Vyci4gdmFsLiBpbmRleDoJIikuYXBwZW5kKGN1cnJlbnRWYWx1ZUluZGV4KS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlidWZmZXIuYXBwZW5kKCItIGRlc2NyaXB0aW9uOgkJIikuYXBwZW5kKGRlc2NyaXB0aW9uKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb25OYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG9wdGlvbk5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmphdmEKaW5kZXggMjgyYzg2My4uZjM3NGM0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiBwdWJsaWMgY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcyB7Ci0gCisKIC8qCiAgKiBBY2N1bXVsYXRlIGFsbCBwcm9ibGVtcywgdGhlbiBleGl0IHdpdGhvdXQgcHJvY2VlZGluZy4KICAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEKaW5kZXggZTUyMTA3Mi4uMDhiNDVlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lDb21waWxlclJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQ29tcGlsZXJSZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGNvbXBpbGF0aW9uIHJlc3VsdHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGVyUmVxdWVzdG9yIHsKLQkKKwogCS8qKgogCSAqIEFjY2VwdCBhIGNvbXBpbGF0aW9uIHJlc3VsdC4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRGVidWdSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRGVidWdSZXF1ZXN0b3IuamF2YQppbmRleCAzMzczOWVjLi44OWU2YjgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURlYnVnUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEZWJ1Z1JlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDE3ICsyMywxNyBAQAogCSAqIEFuc3dlcnMgdHJ1ZSB3aGVuIGluIGFjdGl2ZSBtb2RlCiAJICovCiAJYm9vbGVhbiBpc0FjdGl2ZSgpOwotCQotCS8qIAorCisJLyoKIAkgKiBBY3RpdmF0ZSBkZWJ1ZyBjYWxsYmFja3MKLQkgKi8JCisJICovCiAJdm9pZCBhY3RpdmF0ZSgpOwogCi0JLyogCisJLyoKIAkgKiBEZWFjdGl2YXRlIGRlYnVnIGNhbGxiYWNrcwotCSAqLwkKKwkgKi8KIAl2b2lkIGRlYWN0aXZhdGUoKTsKLQkKKwogCS8qCiAJICogUmVzZXQgZGVidWcgcmVxdWVzdG9yIGFmdGVyIGNvbXBpbGF0aW9uIGhhcyBmaW5pc2hlZAogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lFcnJvckhhbmRsaW5nUG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YQppbmRleCBmZjM4M2E3Li5mOGFmZGYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw4ICsxNyw4IEBACiAgKgl0byBiZSBhIHJlYWwgZXJyb3IgKHRoYXQgaXMsIG5vdCBhIHdhcm5pbmcpLAogICogMi4gc2hvdWxkIGl0IHByb2NlZWQgb25jZSBpdCBoYXMgZ2F0aGVyZWQgYWxsIHByb2JsZW1zCiAgKgotICogVGhlIGludGVudCBpcyB0aGF0IG9uZSBjYW4gc3VwcGx5IGl0cyBvd24gcG9saWN5IHRvIGltcGxlbWVudCAKLSAqIHNvbWUgaW50ZXJhY3RpdmUgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ3kgd2hlcmUgc29tZSBVSSB3b3VsZCAKKyAqIFRoZSBpbnRlbnQgaXMgdGhhdCBvbmUgY2FuIHN1cHBseSBpdHMgb3duIHBvbGljeSB0byBpbXBsZW1lbnQKKyAqIHNvbWUgaW50ZXJhY3RpdmUgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ3kgd2hlcmUgc29tZSBVSSB3b3VsZAogICogZGlzcGxheSBwcm9ibGVtcyBhbmQgYXNrIHVzZXIgaWYgaGUgd2FudHMgdG8gcHJvY2VlZCBvciBub3QuCiAgKi8KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhCmluZGV4IDk0MTVhZjEuLjI5YzNjM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JUHJvYmxlbUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVByb2JsZW1GYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMTkgKzI0LDYxIEBACiAgKi8KIAogcHVibGljIGludGVyZmFjZSBJUHJvYmxlbUZhY3RvcnkgeworCUNhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAorCQkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCisJCQlpbnQgcHJvYmxlbUlkLAorCQkJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwkJCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsIC8vIHNob3J0ZXIgdmVyc2lvbnMgb2YgdGhlIHByb2JsZW1Bcmd1bWVudHMKKwkJCWludCBzZXZlcml0eSwKKwkJCWludCBzdGFydFBvc2l0aW9uLAorCQkJaW50IGVuZFBvc2l0aW9uLAorCQkJaW50IGxpbmVOdW1iZXIsCisJCQlpbnQgY29sdW1uTnVtYmVyKTsKIAorCS8qKgorCSAqIEFuc3dlciBhIG5ldyBJUHJvYmxlbSBjcmVhdGVkIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycyB2YWx1ZXMuCisJICogQHBhcmFtIG9yaWdpbmF0aW5nRmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJvYmxlbSBpcyBvcmlnaW5hdGVkCisJICogQHBhcmFtIHByb2JsZW1JZCB0aGUgcHJvYmxlbSBpZAorCSAqIEBwYXJhbSBwcm9ibGVtQXJndW1lbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgYXJndW1lbnRzIHJlY29yZGVkIGluc2lkZSB0aGUgcHJvYmxlbQorCSAqIEBwYXJhbSBlbGFib3JhdGlvbklkIHRoZSBtZXNzYWdlIGVsYWJvcmF0aW9uIGlkICgwIGZvciBwcm9ibGVtcyB0aGF0IGhhdmUgbm8gbWVzc2FnZSBlbGFib3JhdGlvbikKKwkgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIG5lZWRlZCB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgKHNob3J0ZXIgbmFtZXMgdGhhbiBwcm9ibGVtQXJndW1lbnRzIG9uZXMpCisJICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbQorCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbQorCSAqIEBwYXJhbSBlbmRQb3NpdGlvbiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtCisJICogQHBhcmFtIGxpbmVOdW1iZXIgdGhlIGxpbmUgb24gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJyZWQKKwkgKiBAcmV0dXJuIGEgbmV3IElQcm9ibGVtIGNyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHZhbHVlcy4KKwkgKi8KIAlDYXRlZ29yaXplZFByb2JsZW0gY3JlYXRlUHJvYmxlbSgKIAkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCWludCBwcm9ibGVtSWQsCiAJCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJCWludCBlbGFib3JhdGlvbklkLAogCQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLCAvLyBzaG9ydGVyIHZlcnNpb25zIG9mIHRoZSBwcm9ibGVtQXJndW1lbnRzCiAJCWludCBzZXZlcml0eSwKIAkJaW50IHN0YXJ0UG9zaXRpb24sCiAJCWludCBlbmRQb3NpdGlvbiwKIAkJaW50IGxpbmVOdW1iZXIsCiAJCWludCBjb2x1bW5OdW1iZXIpOwotCQkKKwogCUxvY2FsZSBnZXRMb2NhbGUoKTsKLQkKKwogCVN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKGludCBwcm9ibGVtSWQsIFN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMpOworCisJLyoqCisJICogSW5qZWN0IHRoZSBzdXBwbGllZCBtZXNzYWdlIGFyZ3VtZW50cyBpbnRvIGEgbG9jYWxpemVkIHRlbXBsYXRlCisJICogZWxhYm9yYXRlZCBmcm9tIHRoZSBzdXBwbGllZCBwcm9ibGVtIGlkIGFuZCBhbiBvcHRpb25hbCBlbGFib3JhdGlvbiBpZAorCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBtZXNzYWdlLiBUaGUgYXJndW1lbnRzIG51bWJlciBzaG91bGQgbWF0Y2ggdGhlCisJICogaGlnaGVzdCBwbGFjZWhvbGRlciBpbmRleCBpbiB0aGUgdGVtcGxhdGUuIFdoZW4gYW4gZWxhYm9yYXRpb24gaWQgaXMKKwkgKiB1c2VkLCB0aGUgdGVtcGxhdGUgbWF0Y2hpbmcgdGhhdCBlbGFib3JhdGlvbiBpZCByZXBsYWNlcyAnezB9JyBpbnRvIHRoZQorCSAqIHRlbXBsYXRlIG1hdGNoaW5nIHRoZSBwcm9ibGVtIGlkIGJlZm9yZSB0aGUgbWVzc2FnZSBhcmd1bWVudHMgYXJlCisJICogaW5qZWN0ZWQuCisJICogQHBhcmFtIHByb2JsZW1JZCB0aGUgcHJvYmxlbSBpZCB0YWtlbiBmcm9tCisJICogICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbX0gY29uc3RhbnRzCisJICogQHBhcmFtIGVsYWJvcmF0aW9uSWQgMCBpZiB0aGUgY29uc2lkZXJlZCBwcm9ibGVtIGhhcyBubyBlbGFib3JhdGlvbiwgYQorCSAqICAgICAgICB2YWxpZCBlbGFib3JhdGlvbiBpZCBlbHNlCisJICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgdGhlIGFyZ3VtZW50cyB0byBpbmplY3QgaW50byB0aGUgdGVtcGxhdGUKKwkgKiBAcmV0dXJuIGEgbG9jYWxpemVkIG1lc3NhZ2UgZWxhYm9yYXRlZCBmcm9tIHRoZSBzdXBwbGllZCBwcm9ibGVtIGlkLAorCSAqICAgICAgICAgZWxhYm9yYXRpb24gaWQgYW5kIG1lc3NhZ2UgcGFyYW1ldGVycworCSAqLworCVN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKGludCBwcm9ibGVtSWQsIGludCBlbGFib3JhdGlvbklkLCBTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Qcm9jZXNzVGFza01hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Qcm9jZXNzVGFza01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA0NmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1Byb2Nlc3NUYXNrTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk1lc3NhZ2VzOworCitwdWJsaWMgY2xhc3MgUHJvY2Vzc1Rhc2tNYW5hZ2VyIGltcGxlbWVudHMgUnVubmFibGUgeworCisJQ29tcGlsZXIgY29tcGlsZXI7CisJcHJpdmF0ZSBpbnQgdW5pdEluZGV4OworCXByaXZhdGUgVGhyZWFkIHByb2Nlc3NpbmdUaHJlYWQ7CisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdFRvUHJvY2VzczsKKwlwcml2YXRlIFRocm93YWJsZSBjYXVnaHRFeGNlcHRpb247CisKKwkvLyBxdWV1ZQorCXZvbGF0aWxlIGludCBjdXJyZW50SW5kZXgsIGF2YWlsYWJsZUluZGV4LCBzaXplLCBzbGVlcENvdW50OworCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW10gdW5pdHM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTRURfUVVFVUVfU0laRSA9IDEyOworCitwdWJsaWMgUHJvY2Vzc1Rhc2tNYW5hZ2VyKENvbXBpbGVyIGNvbXBpbGVyKSB7CisJdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOworCXRoaXMudW5pdEluZGV4ID0gMDsKKworCXRoaXMuY3VycmVudEluZGV4ID0gMDsKKwl0aGlzLmF2YWlsYWJsZUluZGV4ID0gMDsKKwl0aGlzLnNpemUgPSBQUk9DRVNTRURfUVVFVUVfU0laRTsKKwl0aGlzLnNsZWVwQ291bnQgPSAwOyAvLyAwIGlzIG5vIG9uZSwgKzEgaXMgdGhlIHByb2Nlc3NpbmcgdGhyZWFkICYgLTEgaXMgdGhlIHdyaXRpbmcvbWFpbiB0aHJlYWQKKwl0aGlzLnVuaXRzID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW3RoaXMuc2l6ZV07CisKKwlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiQ29tcGlsZXIgUHJvY2Vzc2luZyBUYXNrIik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkLnNldERhZW1vbih0cnVlKTsKKwkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkLnN0YXJ0KCk7CisJfQorfQorCisvLyBhZGQgdW5pdCB0byB0aGUgcXVldWUgLSB3YWl0IGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZQorcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGROZXh0VW5pdChDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBuZXdFbGVtZW50KSB7CisJd2hpbGUgKHRoaXMudW5pdHNbdGhpcy5hdmFpbGFibGVJbmRleF0gIT0gbnVsbCkgeworCQkvL1N5c3RlbS5vdXQucHJpbnQoJ2EnKTsKKwkJLy9pZiAodGhpcy5zbGVlcENvdW50IDwgMCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihuZXcgSW50ZWdlcih0aGlzLnNsZWVwQ291bnQpLnRvU3RyaW5nKCkpOworCQl0aGlzLnNsZWVwQ291bnQgPSAxOworCQl0cnkgeworCQkJd2FpdCgyNTApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisJCXRoaXMuc2xlZXBDb3VudCA9IDA7CisJfQorCisJdGhpcy51bml0c1t0aGlzLmF2YWlsYWJsZUluZGV4KytdID0gbmV3RWxlbWVudDsKKwlpZiAodGhpcy5hdmFpbGFibGVJbmRleCA+PSB0aGlzLnNpemUpCisJCXRoaXMuYXZhaWxhYmxlSW5kZXggPSAwOworCWlmICh0aGlzLnNsZWVwQ291bnQgPD0gLTEpCisJCW5vdGlmeSgpOyAvLyB3YWtlIHVwIHdyaXRpbmcgdGhyZWFkIHRvIGFjY2VwdCBuZXh0IHVuaXQgLSBjb3VsZCBiZSB0aGUgbGFzdCBvbmUgLSBtdXN0IGF2b2lkIGRlYWRsb2NrCit9CisKK3B1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZW1vdmVOZXh0VW5pdCgpIHRocm93cyBFcnJvciB7CisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gbmV4dCA9IG51bGw7CisJYm9vbGVhbiB5aWVsZCA9IGZhbHNlOworCXN5bmNocm9uaXplZCAodGhpcykgeworCQluZXh0ID0gdGhpcy51bml0c1t0aGlzLmN1cnJlbnRJbmRleF07CisJCWlmIChuZXh0ID09IG51bGwgfHwgdGhpcy5jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgeworCQkJZG8geworCQkJCWlmICh0aGlzLnByb2Nlc3NpbmdUaHJlYWQgPT0gbnVsbCkgeworCQkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgeworCQkJCQkJLy8gcmV0aHJvdyB0aGUgY2F1Z2h0IGV4Y2VwdGlvbiBmcm9tIHRoZSBwcm9jZXNzaW5nVGhyZWFkIGluIHRoZSBtYWluIGNvbXBpbGVyIHRocmVhZAorCQkJCQkJaWYgKHRoaXMuY2F1Z2h0RXhjZXB0aW9uIGluc3RhbmNlb2YgRXJyb3IpCisJCQkJCQkJdGhyb3cgKEVycm9yKSB0aGlzLmNhdWdodEV4Y2VwdGlvbjsKKwkJCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0aGlzLmNhdWdodEV4Y2VwdGlvbjsKKwkJCQkJfQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50KCdyJyk7CisJCQkJLy9pZiAodGhpcy5zbGVlcENvdW50ID4gMCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihuZXcgSW50ZWdlcih0aGlzLnNsZWVwQ291bnQpLnRvU3RyaW5nKCkpOworCQkJCXRoaXMuc2xlZXBDb3VudCA9IC0xOworCQkJCXRyeSB7CisJCQkJCXdhaXQoMTAwKTsKKwkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJCXRoaXMuc2xlZXBDb3VudCA9IDA7CisJCQkJbmV4dCA9IHRoaXMudW5pdHNbdGhpcy5jdXJyZW50SW5kZXhdOworCQkJfSB3aGlsZSAobmV4dCA9PSBudWxsKTsKKwkJfQorCisJCXRoaXMudW5pdHNbdGhpcy5jdXJyZW50SW5kZXgrK10gPSBudWxsOworCQlpZiAodGhpcy5jdXJyZW50SW5kZXggPj0gdGhpcy5zaXplKQorCQkJdGhpcy5jdXJyZW50SW5kZXggPSAwOworCQlpZiAodGhpcy5zbGVlcENvdW50ID49IDEgJiYgKyt0aGlzLnNsZWVwQ291bnQgPiA0KSB7CisJCQlub3RpZnkoKTsgLy8gd2FrZSB1cCBwcm9jZXNzaW5nIHRocmVhZCB0byBhZGQgbmV4dCB1bml0IGJ1dCBvbmx5IGFmdGVyIHJlbW92aW5nIHNvbWUgZWxlbWVudHMgZmlyc3QKKwkJCXlpZWxkID0gdGhpcy5zbGVlcENvdW50ID4gODsKKwkJfQorCX0KKwlpZiAoeWllbGQpCisJCVRocmVhZC55aWVsZCgpOworCXJldHVybiBuZXh0OworfQorCitwdWJsaWMgdm9pZCBydW4oKSB7CisJd2hpbGUgKHRoaXMucHJvY2Vzc2luZ1RocmVhZCAhPSBudWxsKSB7CisJCXRoaXMudW5pdFRvUHJvY2VzcyA9IG51bGw7CisJCWludCBpbmRleCA9IC0xOworCQl0cnkgeworCQkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQkJaWYgKHRoaXMucHJvY2Vzc2luZ1RocmVhZCA9PSBudWxsKSByZXR1cm47CisKKwkJCQl0aGlzLnVuaXRUb1Byb2Nlc3MgPSB0aGlzLmNvbXBpbGVyLmdldFVuaXRUb1Byb2Nlc3ModGhpcy51bml0SW5kZXgpOworCQkJCWlmICh0aGlzLnVuaXRUb1Byb2Nlc3MgPT0gbnVsbCkgeworCQkJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQgPSBudWxsOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWluZGV4ID0gdGhpcy51bml0SW5kZXgrKzsKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQl0aGlzLmNvbXBpbGVyLnJlcG9ydFByb2dyZXNzKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29tcGlsYXRpb25fcHJvY2Vzc2luZywgbmV3IFN0cmluZyh0aGlzLnVuaXRUb1Byb2Nlc3MuZ2V0RmlsZU5hbWUoKSkpKTsKKwkJCQlpZiAodGhpcy5jb21waWxlci5vcHRpb25zLnZlcmJvc2UpCisJCQkJCXRoaXMuY29tcGlsZXIub3V0LnByaW50bG4oCisJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbXBpbGF0aW9uX3Byb2Nlc3MsCisJCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZGV4ICsgMSksCisJCQkJCQkJU3RyaW5nLnZhbHVlT2YodGhpcy5jb21waWxlci50b3RhbFVuaXRzKSwKKwkJCQkJCQluZXcgU3RyaW5nKHRoaXMudW5pdFRvUHJvY2Vzcy5nZXRGaWxlTmFtZSgpKQorCQkJCQkJfSkpOworCQkJCXRoaXMuY29tcGlsZXIucHJvY2Vzcyh0aGlzLnVuaXRUb1Byb2Nlc3MsIGluZGV4KTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYgKHRoaXMudW5pdFRvUHJvY2VzcyAhPSBudWxsKQorCQkJCQl0aGlzLnVuaXRUb1Byb2Nlc3MuY2xlYW5VcCgpOworCQkJfQorCisJCQlhZGROZXh0VW5pdCh0aGlzLnVuaXRUb1Byb2Nlc3MpOworCQl9IGNhdGNoIChFcnJvciBlKSB7CisJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQgPSBudWxsOworCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uID0gZTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQgPSBudWxsOworCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uID0gZTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisJdHJ5IHsKKwkJVGhyZWFkIHQgPSBudWxsOworCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCWlmICh0aGlzLnByb2Nlc3NpbmdUaHJlYWQgIT0gbnVsbCkgeworCQkJCXQgPSB0aGlzLnByb2Nlc3NpbmdUaHJlYWQ7CisJCQkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkID0gbnVsbDsKKwkJCQlub3RpZnlBbGwoKTsKKwkJCX0KKwkJfQorCQlpZiAodCAhPSBudWxsKQorCQkJdC5qb2luKDI1MCk7IC8vIGRvIG5vdCB3YWl0IGZvcmV2ZXIKKwl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisJCS8vIGlnbm9yZQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9SZWFkTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1JlYWRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExYWQxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9SZWFkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworCitwdWJsaWMgY2xhc3MgUmVhZE1hbmFnZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJSUNvbXBpbGF0aW9uVW5pdFtdIHVuaXRzOworCWludCBuZXh0RmlsZVRvUmVhZDsKKwlJQ29tcGlsYXRpb25Vbml0W10gZmlsZXNSZWFkOworCWNoYXJbXVtdIGNvbnRlbnRzUmVhZDsKKwlpbnQgcmVhZHlUb1JlYWRQb3NpdGlvbjsKKwlpbnQgbmV4dEF2YWlsYWJsZVBvc2l0aW9uOworCVRocmVhZFtdIHJlYWRpbmdUaHJlYWRzOworCWNoYXJbXSByZWFkSW5Qcm9jZXNzTWFya2VyID0gbmV3IGNoYXJbMF07CisJaW50IHNsZWVwaW5nVGhyZWFkQ291bnQ7CisJcHJpdmF0ZSBUaHJvd2FibGUgY2F1Z2h0RXhjZXB0aW9uOworCisJc3RhdGljIGZpbmFsIGludCBTVEFSVF9DVVNISU9OID0gNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJFU0hPTEQgPSAxMDsKKwlzdGF0aWMgZmluYWwgaW50IENBQ0hFX1NJWkUgPSAxNTsgLy8gZG8gbm90IHdhc3RlIG1lbW9yeSBieSBrZWVwaW5nIHRvbyBtYW55IGZpbGVzIGluIG1lbW9yeQorCitwdWJsaWMgUmVhZE1hbmFnZXIoSUNvbXBpbGF0aW9uVW5pdFtdIGZpbGVzLCBpbnQgbGVuZ3RoKSB7CisJLy8gc3RhcnQgdGhlIGJhY2tncm91bmQgdGhyZWFkcyB0byByZWFkIHRoZSBmaWxlJ3MgY29udGVudHMKKwlpbnQgdGhyZWFkQ291bnQgPSAwOworCXRyeSB7CisJCUNsYXNzIHJ1bnRpbWUgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuUnVudGltZSIpOyAvLyROT04tTkxTLTEkCisJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtID0gcnVudGltZS5nZXREZWNsYXJlZE1ldGhvZCgiYXZhaWxhYmxlUHJvY2Vzc29ycyIsIG5ldyBDbGFzc1swXSk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG0gIT0gbnVsbCkgeworCQkJSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcikgbS5pbnZva2UoUnVudGltZS5nZXRSdW50aW1lKCksIG51bGwpOworCQkJdGhyZWFkQ291bnQgPSByZXN1bHQuaW50VmFsdWUoKSArIDE7CisJCQlpZiAodGhyZWFkQ291bnQgPCAyKQorCQkJCXRocmVhZENvdW50ID0gMDsKKwkJCWVsc2UgaWYgKHRocmVhZENvdW50ID4gQ0FDSEVfU0laRSkKKwkJCQl0aHJlYWRDb3VudCA9IENBQ0hFX1NJWkU7CisJCX0KKwl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlnbm9yZWQpIHsgLy8gaWdub3JlZAorCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyAvLyBpZ25vcmVkCisJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeyAvLyBpZ25vcmVkCisJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsgLy8gaWdub3JlZAorCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IC8vIGlnbm9yZWQKKwl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsgLy8gaWdub3JlZAorCX0KKworCWlmICh0aHJlYWRDb3VudCA+IDApIHsKKwkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQl0aGlzLnVuaXRzID0gbmV3IElDb21waWxhdGlvblVuaXRbbGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZmlsZXMsIDAsIHRoaXMudW5pdHMsIDAsIGxlbmd0aCk7CisJCQl0aGlzLm5leHRGaWxlVG9SZWFkID0gU1RBUlRfQ1VTSElPTjsgLy8gc2tpcCBzb21lIGZpbGVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGhhdmUgdG8gd2FpdAorCQkJdGhpcy5maWxlc1JlYWQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdFtDQUNIRV9TSVpFXTsKKwkJCXRoaXMuY29udGVudHNSZWFkID0gbmV3IGNoYXJbQ0FDSEVfU0laRV1bXTsKKwkJCXRoaXMucmVhZHlUb1JlYWRQb3NpdGlvbiA9IDA7CisJCQl0aGlzLm5leHRBdmFpbGFibGVQb3NpdGlvbiA9IDA7CisJCQl0aGlzLnNsZWVwaW5nVGhyZWFkQ291bnQgPSAwOworCQkJdGhpcy5yZWFkaW5nVGhyZWFkcyA9IG5ldyBUaHJlYWRbdGhyZWFkQ291bnRdOworCQkJZm9yIChpbnQgaSA9IHRocmVhZENvdW50OyAtLWkgPj0gMDspIHsKKwkJCQl0aGlzLnJlYWRpbmdUaHJlYWRzW2ldID0gbmV3IFRocmVhZCh0aGlzLCAiQ29tcGlsZXIgU291cmNlIEZpbGUgUmVhZGVyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLnJlYWRpbmdUaHJlYWRzW2ldLnNldERhZW1vbih0cnVlKTsKKwkJCQl0aGlzLnJlYWRpbmdUaHJlYWRzW2ldLnN0YXJ0KCk7CisJCQl9CisJCX0KKwl9Cit9CisKK3B1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB0aHJvd3MgRXJyb3IgeworCWlmICh0aGlzLnJlYWRpbmdUaHJlYWRzID09IG51bGwgfHwgdGhpcy51bml0cy5sZW5ndGggPT0gMCkgeworCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgeworCQkJLy8gcmV0aHJvdyB0aGUgY2F1Z2h0IGV4Y2VwdGlvbiBmcm9tIHRoZSByZWFkaW5nVGhyZWFkcyBpbiB0aGUgbWFpbiBjb21waWxlciB0aHJlYWQKKwkJCWlmICh0aGlzLmNhdWdodEV4Y2VwdGlvbiBpbnN0YW5jZW9mIEVycm9yKQorCQkJCXRocm93IChFcnJvcikgdGhpcy5jYXVnaHRFeGNlcHRpb247CisJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgdGhpcy5jYXVnaHRFeGNlcHRpb247CisJCX0KKwkJcmV0dXJuIHVuaXQuZ2V0Q29udGVudHMoKTsKKwl9CisKKwlib29sZWFuIHlpZWxkID0gZmFsc2U7CisJY2hhcltdIHJlc3VsdCA9IG51bGw7CisJc3luY2hyb25pemVkICh0aGlzKSB7CisJCWlmICh1bml0ID09IHRoaXMuZmlsZXNSZWFkW3RoaXMucmVhZHlUb1JlYWRQb3NpdGlvbl0pIHsKKwkJCXJlc3VsdCA9IHRoaXMuY29udGVudHNSZWFkW3RoaXMucmVhZHlUb1JlYWRQb3NpdGlvbl07CisJCQl3aGlsZSAocmVzdWx0ID09IHRoaXMucmVhZEluUHJvY2Vzc01hcmtlciB8fCByZXN1bHQgPT0gbnVsbCkgeworCQkJCS8vIGxldCB0aGUgcmVhZGluZ1RocmVhZCBrbm93IHdlJ3JlIHdhaXRpbmcKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnQoJ3wnKTsKKwkJCQl0aGlzLmNvbnRlbnRzUmVhZFt0aGlzLnJlYWR5VG9SZWFkUG9zaXRpb25dID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQl3YWl0KDI1MCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7IC8vIGlnbm9yZQorCQkJCX0KKwkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgeworCQkJCQkvLyByZXRocm93IHRoZSBjYXVnaHQgZXhjZXB0aW9uIGZyb20gdGhlIHJlYWRpbmdUaHJlYWRzIGluIHRoZSBtYWluIGNvbXBpbGVyIHRocmVhZAorCQkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb24gaW5zdGFuY2VvZiBFcnJvcikKKwkJCQkJCXRocm93IChFcnJvcikgdGhpcy5jYXVnaHRFeGNlcHRpb247CisJCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0aGlzLmNhdWdodEV4Y2VwdGlvbjsKKwkJCQl9CisJCQkJcmVzdWx0ID0gdGhpcy5jb250ZW50c1JlYWRbdGhpcy5yZWFkeVRvUmVhZFBvc2l0aW9uXTsKKwkJCX0KKwkJCS8vIGZyZWUgc3BvdCBmb3IgbmV4dCBmaWxlCisJCQl0aGlzLmZpbGVzUmVhZFt0aGlzLnJlYWR5VG9SZWFkUG9zaXRpb25dID0gbnVsbDsKKwkJCXRoaXMuY29udGVudHNSZWFkW3RoaXMucmVhZHlUb1JlYWRQb3NpdGlvbl0gPSBudWxsOworCQkJaWYgKCsrdGhpcy5yZWFkeVRvUmVhZFBvc2l0aW9uID49IHRoaXMuY29udGVudHNSZWFkLmxlbmd0aCkKKwkJCQl0aGlzLnJlYWR5VG9SZWFkUG9zaXRpb24gPSAwOworCQkJaWYgKHRoaXMuc2xlZXBpbmdUaHJlYWRDb3VudCA+IDApIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnQoJysnKTsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnQodGhpcy5uZXh0RmlsZVRvUmVhZCk7CisJCQkJbm90aWZ5KCk7CisJCQkJeWllbGQgPSB0aGlzLnNsZWVwaW5nVGhyZWFkQ291bnQgPT0gdGhpcy5yZWFkaW5nVGhyZWFkcy5sZW5ndGg7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBtdXN0IG1ha2Ugc3VyZSB3ZSdyZSByZWFkaW5nIGFoZWFkIG9mIHRoZSB1bml0CisJCQlpbnQgdW5pdEluZGV4ID0gMDsKKwkJCWZvciAoaW50IGwgPSB0aGlzLnVuaXRzLmxlbmd0aDsgdW5pdEluZGV4IDwgbDsgdW5pdEluZGV4KyspCisJCQkJaWYgKHRoaXMudW5pdHNbdW5pdEluZGV4XSA9PSB1bml0KSBicmVhazsKKwkJCWlmICh1bml0SW5kZXggPT0gdGhpcy51bml0cy5sZW5ndGgpIHsKKwkJCQkvLyBhdHRlbXB0aW5nIHRvIHJlYWQgYSB1bml0IHRoYXQgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBmaWxlcyAtIHNob3VsZCBub3QgaGFwcGVuCisJCQkJdGhpcy51bml0cyA9IG5ldyBJQ29tcGlsYXRpb25Vbml0WzBdOyAvLyBzdG9wIGxvb2tpbmcgZm9yIG1vcmUKKwkJCX0gZWxzZSBpZiAodW5pdEluZGV4ID49IHRoaXMubmV4dEZpbGVUb1JlYWQpIHsKKwkJCQkvLyBzdGFydCBvdmVyCisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4odW5pdEluZGV4ICsgIiB2cyAiICsgdGhpcy5uZXh0RmlsZVRvUmVhZCk7CisJCQkJdGhpcy5uZXh0RmlsZVRvUmVhZCA9IHVuaXRJbmRleCArIFNUQVJUX0NVU0hJT047CisJCQkJdGhpcy5yZWFkeVRvUmVhZFBvc2l0aW9uID0gMDsKKwkJCQl0aGlzLm5leHRBdmFpbGFibGVQb3NpdGlvbiA9IDA7CisJCQkJdGhpcy5maWxlc1JlYWQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdFtDQUNIRV9TSVpFXTsKKwkJCQl0aGlzLmNvbnRlbnRzUmVhZCA9IG5ldyBjaGFyW0NBQ0hFX1NJWkVdW107CisJCQkJbm90aWZ5QWxsKCk7CisJCQl9CisJCX0KKwl9CisJaWYgKHlpZWxkKQorCQlUaHJlYWQueWllbGQoKTsgLy8gZW5zdXJlIG90aGVyIHRocmVhZHMgZ2V0IGEgY2hhbmNlCisJaWYgKHJlc3VsdCAhPSBudWxsKQorCQlyZXR1cm4gcmVzdWx0OworCS8vU3lzdGVtLm91dC5wcmludCgnLScpOworCXJldHVybiB1bml0LmdldENvbnRlbnRzKCk7Cit9CisKK3B1YmxpYyB2b2lkIHJ1bigpIHsKKwl0cnkgeworCQl3aGlsZSAodGhpcy5yZWFkaW5nVGhyZWFkcyAhPSBudWxsICYmIHRoaXMubmV4dEZpbGVUb1JlYWQgPCB0aGlzLnVuaXRzLmxlbmd0aCkgeworCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gbnVsbDsKKwkJCWludCBwb3NpdGlvbiA9IC0xOworCQkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQkJaWYgKHRoaXMucmVhZGluZ1RocmVhZHMgPT0gbnVsbCkgcmV0dXJuOworCisJCQkJd2hpbGUgKHRoaXMuZmlsZXNSZWFkW3RoaXMubmV4dEF2YWlsYWJsZVBvc2l0aW9uXSAhPSBudWxsKSB7CisJCQkJCXRoaXMuc2xlZXBpbmdUaHJlYWRDb3VudCsrOworCQkJCQl0cnkgeworCQkJCQkJd2FpdCgyNTApOyAvLyB3YWl0IHVudGlsIGEgc3BvdCBpbiBjb250ZW50cyBpcyBhdmFpbGFibGUKKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeyAvLyBpZ25vcmUKKwkJCQkJfQorCQkJCQl0aGlzLnNsZWVwaW5nVGhyZWFkQ291bnQtLTsKKwkJCQkJaWYgKHRoaXMucmVhZGluZ1RocmVhZHMgPT0gbnVsbCkgcmV0dXJuOworCQkJCX0KKworCQkJCWlmICh0aGlzLm5leHRGaWxlVG9SZWFkID49IHRoaXMudW5pdHMubGVuZ3RoKSByZXR1cm47CisJCQkJdW5pdCA9IHRoaXMudW5pdHNbdGhpcy5uZXh0RmlsZVRvUmVhZCsrXTsKKwkJCQlwb3NpdGlvbiA9IHRoaXMubmV4dEF2YWlsYWJsZVBvc2l0aW9uOworCQkJCWlmICgrK3RoaXMubmV4dEF2YWlsYWJsZVBvc2l0aW9uID49IHRoaXMuY29udGVudHNSZWFkLmxlbmd0aCkKKwkJCQkJdGhpcy5uZXh0QXZhaWxhYmxlUG9zaXRpb24gPSAwOworCQkJCXRoaXMuZmlsZXNSZWFkW3Bvc2l0aW9uXSA9IHVuaXQ7CisJCQkJdGhpcy5jb250ZW50c1JlYWRbcG9zaXRpb25dID0gdGhpcy5yZWFkSW5Qcm9jZXNzTWFya2VyOyAvLyBtYXJrIHRoZSBzcG90IHNvIHdlIGtub3cgaXRzIGJlaW5nIHJlYWQKKwkJCX0KKwkJCWNoYXJbXSByZXN1bHQgPSB1bml0LmdldENvbnRlbnRzKCk7CisJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCQlpZiAodGhpcy5maWxlc1JlYWRbcG9zaXRpb25dID09IHVuaXQpIHsKKwkJCQkJaWYgKHRoaXMuY29udGVudHNSZWFkW3Bvc2l0aW9uXSA9PSBudWxsKSAvLyB3YWtlIHVwIG1haW4gdGhyZWFkIHdoaWNoIGlzIHdhaXRpbmcgZm9yIHRoaXMgZmlsZQorCQkJCQkJbm90aWZ5QWxsKCk7CisJCQkJCXRoaXMuY29udGVudHNSZWFkW3Bvc2l0aW9uXSA9IHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGNhdGNoIChFcnJvciBlKSB7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJdGhpcy5jYXVnaHRFeGNlcHRpb24gPSBlOworCQkJc2h1dGRvd24oKTsKKwkJfQorCQlyZXR1cm47CisJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJdGhpcy5jYXVnaHRFeGNlcHRpb24gPSBlOworCQkJc2h1dGRvd24oKTsKKwkJfQorCQlyZXR1cm47CisJfQorfQorCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7CisJdGhpcy5yZWFkaW5nVGhyZWFkcyA9IG51bGw7IC8vIG1hcmsgdGhlIHJlYWQgbWFuYWdlciBhcyBzaHV0dGluZyBkb3duIHNvIHRoYXQgdGhlIHJlYWRpbmcgdGhyZWFkcyBzdG9wCisJbm90aWZ5QWxsKCk7Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BTkRfQU5EX0V4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQU5EX0FORF9FeHByZXNzaW9uLmphdmEKaW5kZXggZGNlMjc3NC4uY2UzZGE5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BTkRfQU5EX0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FORF9BTkRfRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAzMTkyMDEgLSBbbnVsbF0gbm8gd2FybmluZyB3aGVuIHVuYm94aW5nIFNpbmdsZU5hbWVSZWZlcmVuY2UgY2F1c2VzIE5QRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKQEAgLTM3LDMyICszOCw0MSBAQAogCQkJLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgogCQkJLy8gICh4ICYmIHkpICYmICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZAogCQkJLy8gYmUgc3dhcHBlZCBieSB0aGUgIQotCQkJRmxvd0luZm8gbWVyZ2VkSW5mbyA9IGxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCisJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gdGhpcy5sZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7Ci0JCQltZXJnZWRJbmZvID0gcmlnaHQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgbWVyZ2VkSW5mbyk7Ci0JCQltZXJnZWRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpCisJCQltZXJnZWRJbmZvID0gdGhpcy5yaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBtZXJnZWRJbmZvKTsKKwkJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKQogCQkJCQkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKIAkJfQogCi0JCUZsb3dJbmZvIGxlZnRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCUZsb3dJbmZvIGxlZnRJbmZvID0gdGhpcy5sZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAkJLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgogCQkvLyAgKHggJiYgeSkgJiYgIXosIGlmIHBhc3NpbmcgdGhlIGxlZnQgaW5mbyB0byB0aGUgcmlnaHQsIGl0IHdvdWxkIGJlCiAJCS8vIHN3YXBwZWQgYnkgdGhlICEKIAkJRmxvd0luZm8gcmlnaHRJbmZvID0gbGVmdEluZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxDb3B5KCk7Ci0JCXJpZ2h0SW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyaWdodEluZm8pOworCQl0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyaWdodEluZm8pOwogCiAJCWludCBwcmV2aW91c01vZGUgPSByaWdodEluZm8ucmVhY2hNb2RlKCk7CiAJCWlmIChpc0xlZnRPcHRpbWl6ZWRGYWxzZSkgewotCQkJcmlnaHRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQlpZiAoKHJpZ2h0SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZha2VSZWFjaGFibGUodGhpcy5yaWdodCk7CisJCQkJcmlnaHRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsKKwkJCX0KIAkJfQotCQlyaWdodEluZm8gPSByaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCByaWdodEluZm8pOworCQlyaWdodEluZm8gPSB0aGlzLnJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHJpZ2h0SW5mbyk7CisJCWlmICgodGhpcy5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCXRoaXMubGVmdC5jaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCX0KKwkJaWYgKCh0aGlzLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCXRoaXMucmlnaHQuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQl9CiAJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBGbG93SW5mby5jb25kaXRpb25hbCgKLQkJCQlyaWdodEluZm8uc2FmZUluaXRzV2hlblRydWUoKSwgCisJCQkJcmlnaHRJbmZvLnNhZmVJbml0c1doZW5UcnVlKCksCiAJCQkJbGVmdEluZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKAogCQkJCQkJcmlnaHRJbmZvLmluaXRzV2hlbkZhbHNlKCkuc2V0UmVhY2hNb2RlKHByZXZpb3VzTW9kZSkudW5jb25kaXRpb25hbEluaXRzKCkpKTsKIAkJLy8gcmVzZXQgYWZ0ZXIgdHJ1ZU1lcmdlZEluZm8gZ290IGV4dHJhY3RlZAotCQltZXJnZWRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwogCX0KIApAQCAtNzIsMTQgKzgyLDE0IEBACiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQkvLyBpbmxpbmVkIHZhbHVlCiAJCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJQ29uc3RhbnQgY3N0ID0gcmlnaHQuY29uc3RhbnQ7CisJCUNvbnN0YW50IGNzdCA9IHRoaXMucmlnaHQuY29uc3RhbnQ7CiAJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQkvLyA8ZXhwcj4gJiYgdHJ1ZSAtLT4gPGV4cHI+CiAJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKQEAgLTg5LDQ1ICs5OSw0NSBAQAogCQkJCXRoaXMubGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIGNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKIAkJCX0KLQkJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwotCQkJfQkJCQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJaWYgKHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJcmV0dXJuOwogCQl9Ci0JCQorCiAJCUJyYW5jaExhYmVsIGZhbHNlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSksIGVuZExhYmVsOwotCQljc3QgPSBsZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQljc3QgPSB0aGlzLmxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CiAJCWJvb2xlYW4gbGVmdElzQ29uc3QgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlib29sZWFuIGxlZnRJc1RydWUgPSBsZWZ0SXNDb25zdCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKIAotCQljc3QgPSByaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJY3N0ID0gdGhpcy5yaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiByaWdodElzQ29uc3QgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlib29sZWFuIHJpZ2h0SXNUcnVlID0gcmlnaHRJc0NvbnN0ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwogCiAJCWdlbmVyYXRlT3BlcmFuZHMgOiB7CiAJCQlpZiAobGVmdElzQ29uc3QpIHsKLQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOwogCQkJCWlmICghbGVmdElzVHJ1ZSkgewogCQkJCQlicmVhayBnZW5lcmF0ZU9wZXJhbmRzOyAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIHJpZ2h0IG9wZXJhbmQKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdHJ1ZSk7IAotCQkJCS8vIG5lZWQgdmFsdWUsIGUuZy4gaWYgKGEgPT0gMSAmJiAoKGIgPSAyKSA+IDApKSB7fSAtPiBzaG91bGRuJ3QgaW5pdGlhbGl6ZSAnYicgaWYgYSE9MSAKKwkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdHJ1ZSk7CisJCQkJLy8gbmVlZCB2YWx1ZSwgZS5nLiBpZiAoYSA9PSAxICYmICgoYiA9IDIpID4gMCkpIHt9IC0+IHNob3VsZG4ndCBpbml0aWFsaXplICdiJyBpZiBhIT0xCiAJCQl9Ci0JCQlpZiAocmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQlpZiAodGhpcy5yaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJaWYgKHJpZ2h0SXNDb25zdCkgewotCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5yaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBudWxsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCX0KIAkJfQotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJfQogCQkvKgogCQkgKiBpbXByb3ZpbmcgY29kZSBnZW4gZm9yIHN1Y2ggYSBjYXNlOiBib29sZWFuIGIgPSBpIDwgMCAmJiBmYWxzZSBzaW5jZQpAQCAtMTQ2LDcgKzE1Niw3IEBACiAJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKIAkJCQl9CiAJCQkJaWYgKGZhbHNlTGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50KCkgPiAwKSB7Ci0JCQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCkgeworCQkJCQlpZiAoKHRoaXMuYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCkgewogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUodGhpcyk7CiAJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CkBAIC0xNjIsNyArMTcyLDcgQEAKIAkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOwogCQkJCX0KIAkJCX0KLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQl9IGVsc2UgewogCQkJZmFsc2VMYWJlbC5wbGFjZSgpOwpAQCAtMTc0LDI4ICsxODQsMjggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQnJhbmNoTGFiZWwgdHJ1ZUxhYmVsLCBCcmFuY2hMYWJlbCBmYWxzZUxhYmVsLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAotCQlpZiAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLAogCQkJCQl2YWx1ZVJlcXVpcmVkKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCS8vIDxleHByPiAmJiB0cnVlIC0tPiA8ZXhwcj4KLQkJQ29uc3RhbnQgY3N0ID0gcmlnaHQuY29uc3RhbnQ7CisJCUNvbnN0YW50IGNzdCA9IHRoaXMucmlnaHQuY29uc3RhbnQ7CiAJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7Ci0JCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKLQkJCX0JCQkKKwkJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCX0KIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJY3N0ID0gbGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJY3N0ID0gdGhpcy5sZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlib29sZWFuIGxlZnRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiBsZWZ0SXNUcnVlID0gbGVmdElzQ29uc3QgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CiAKLQkJY3N0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWNzdCA9IHRoaXMucmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CiAJCWJvb2xlYW4gcmlnaHRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiByaWdodElzVHJ1ZSA9IHJpZ2h0SXNDb25zdCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKIApAQCAtMjA1LDE3ICsyMTUsMTcgQEAKIAkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKIAkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCiAJCQkJCUJyYW5jaExhYmVsIGludGVybmFsRmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKLQkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBudWxsLCBpbnRlcm5hbEZhbHNlTGFiZWwsICFsZWZ0SXNDb25zdCk7IAorCQkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgaW50ZXJuYWxGYWxzZUxhYmVsLCAhbGVmdElzQ29uc3QpOwogCQkJCQkvLyBuZWVkIHZhbHVlLCBlLmcuIGlmIChhID09IDEgJiYgKChiID0gMikgPiAwKSkge30gLT4gc2hvdWxkbid0IGluaXRpYWxpemUgJ2InIGlmIGEhPTEKIAkJCQkJaWYgKGxlZnRJc0NvbnN0ICYmICFsZWZ0SXNUcnVlKSB7CiAJCQkJCQlpbnRlcm5hbEZhbHNlTGFiZWwucGxhY2UoKTsKIAkJCQkJCWJyZWFrIGdlbmVyYXRlT3BlcmFuZHM7IC8vIG5vIG5lZWQgdG8gZ2VuZXJhdGUgcmlnaHQgb3BlcmFuZAogCQkJCQl9Ci0JCQkJCWlmIChyaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCWlmICh0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQkJCWNvZGVTdHJlYW0KLQkJCQkJCQkJLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOworCQkJCQkJCQkuYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5yaWdodEluaXRTdGF0ZUluZGV4KTsKIAkJCQkJfQotCQkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIG51bGwsCisJCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBudWxsLAogCQkJCQkJCXZhbHVlUmVxdWlyZWQgJiYgIXJpZ2h0SXNDb25zdCk7CiAJCQkJCWlmICh2YWx1ZVJlcXVpcmVkICYmIHJpZ2h0SXNDb25zdCAmJiByaWdodElzVHJ1ZSkgewogCQkJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOwpAQCAtMjI2LDE4ICsyMzYsMTggQEAKIAkJCX0gZWxzZSB7CiAJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKIAkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKLQkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBudWxsLCBmYWxzZUxhYmVsLCAhbGVmdElzQ29uc3QpOyAKKwkJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsICFsZWZ0SXNDb25zdCk7CiAJCQkJCS8vIG5lZWQgdmFsdWUsIGUuZy4gaWYgKGEgPT0gMSAmJiAoKGIgPSAyKSA+IDApKSB7fSAtPiBzaG91bGRuJ3QgaW5pdGlhbGl6ZSAnYicgaWYgYSE9MQogCQkJCQlpZiAobGVmdElzQ29uc3QgJiYgIWxlZnRJc1RydWUpIHsKIAkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSBjb2RlU3RyZWFtLmdvdG9fKGZhbHNlTGFiZWwpOwogCQkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCQkJYnJlYWsgZ2VuZXJhdGVPcGVyYW5kczsgLy8gbm8gbmVlZCB0byBnZW5lcmF0ZSByaWdodCBvcGVyYW5kCiAJCQkJCX0KLQkJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJaWYgKHRoaXMucmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJCQkJY29kZVN0cmVhbQotCQkJCQkJCQkuYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJCQkJCS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXgpOwogCQkJCQl9Ci0JCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQgJiYgIXJpZ2h0SXNDb25zdCk7CisJCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCAmJiAhcmlnaHRJc0NvbnN0KTsKIAkJCQkJaWYgKHZhbHVlUmVxdWlyZWQgJiYgcmlnaHRJc0NvbnN0ICYmICFyaWdodElzVHJ1ZSkgewogCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhmYWxzZUxhYmVsKTsKIAkJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKQEAgLTI0Nyw4ICsyNTcsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJfQogCX0KIApAQCAtMjU2LDEwICsyNjYsMjQgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CaW5hcnlFeHByZXNzaW9uI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKKwkgKi8KKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQlUeXBlQmluZGluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCS8vIGNoZWNrIHdoZXRoZXIgY29tcGFyaW5nIGlkZW50aWNhbCBleHByZXNzaW9ucworCQlCaW5kaW5nIGxlZnREaXJlY3QgPSBFeHByZXNzaW9uLmdldERpcmVjdEJpbmRpbmcodGhpcy5sZWZ0KTsKKwkJaWYgKGxlZnREaXJlY3QgIT0gbnVsbCAmJiBsZWZ0RGlyZWN0ID09IEV4cHJlc3Npb24uZ2V0RGlyZWN0QmluZGluZyh0aGlzLnJpZ2h0KSkgeworCQkJaWYgKCEodGhpcy5yaWdodCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbXBhcmluZ0lkZW50aWNhbEV4cHJlc3Npb25zKHRoaXMpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewotCQkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQlyaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLmxlZnQudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJdGhpcy5yaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BU1ROb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FTVE5vZGUuamF2YQppbmRleCA2Njk1NWJhLi44OTI1MzhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FTVE5vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FTVE5vZGUuamF2YQpAQCAtMSwxNCArMSwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWF0dCBNY0N1dGNoZW4KLSAqICAgICAJCVBhcnRpYWwgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyOTk1LgorICogICAgIE1hdHQgTWNDdXRjaGVuIC0gcGFydGlhbCBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI5OTUKKyAqICAgICBLYXJlbiBNb29yZSAtIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzQxMQorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDE4NTY4MiAtIEluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIG1hcmsgbG9jYWwgdmFyaWFibGVzIGFzIHJlYWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0yNywzNCArMjgsMzQgQEAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyID0gMHgyOwkJCQkJLy8gcmV0dXJuIHR5cGUgKG9wZXJhdG9yKSB8IG5hbWUgcmVmZXJlbmNlIGtpbmQgKG5hbWUgcmVmKSB8IGhhcyBsb2NhbCB0eXBlICh0eXBlLCBtZXRob2QsIGZpZWxkIGRlY2wpCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MyA9IDB4NDsJCQkJCS8vIHJldHVybiB0eXBlIChvcGVyYXRvcikgfCBuYW1lIHJlZmVyZW5jZSBraW5kIChuYW1lIHJlZikgfCBpbXBsaWNpdCB0aGlzICh0aGlzIHJlZikKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQ0ID0gMHg4OwkJCQkJLy8gcmV0dXJuIHR5cGUgKG9wZXJhdG9yKSB8IGZpcnN0IGFzc2lnbm1lbnQgdG8gbG9jYWwgKG5hbWUgcmVmLGxvY2FsIGRlY2wpIHwgdW5kb2N1bWVudGVkIGVtcHR5IGJsb2NrIChibG9jaywgdHlwZSBhbmQgbWV0aG9kIGRlY2wpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0NSA9IDB4MTA7CQkJCS8vIHZhbHVlIGZvciByZXR1cm4gKGV4cHJlc3Npb24pIHwgaGFzIGFsbCBtZXRob2QgYm9kaWVzICh1bml0KSB8IHN1cGVydHlwZSByZWYgKHR5cGUgcmVmKSB8IHJlc29sdmVkIChmaWVsZCBkZWNsKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDYgPSAweDIwOwkJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBpZ25vcmUgbmVlZCBjYXN0IGNoZWNrIChjYXN0IGV4cHJlc3Npb24pIHwgZXJyb3IgaW4gc2lnbmF0dXJlIChtZXRob2QgZGVjbGFyYXRpb24vIGluaXRpYWxpemVyKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDcgPSAweDQwOwkJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBvcGVyYXRvciAob3BlcmF0b3IpIHwgbmVlZCBydW50aW1lIGNoZWNrY2FzdCAoY2FzdCBleHByZXNzaW9uKSB8IGxhYmVsIHVzZWQgKGxhYmVsU3RhdGVtZW50KSB8IG5lZWRGcmVlUmV0dXJuIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDggPSAweDgwOwkJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBvcGVyYXRvciAob3BlcmF0b3IpIHwgdW5zYWZlIGNhc3QgKGNhc3QgZXhwcmVzc2lvbikgfCBpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIChjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQ5ID0gMHgxMDA7CQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcikgfCBpcyBsb2NhbCB0eXBlICh0eXBlIGRlY2wpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0NSA9IDB4MTA7CQkJCQkvLyB2YWx1ZSBmb3IgcmV0dXJuIChleHByZXNzaW9uKSB8IGhhcyBhbGwgbWV0aG9kIGJvZGllcyAodW5pdCkgfCBzdXBlcnR5cGUgcmVmICh0eXBlIHJlZikgfCByZXNvbHZlZCAoZmllbGQgZGVjbCkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQ2ID0gMHgyMDsJCQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IGlnbm9yZSBuZWVkIGNhc3QgY2hlY2sgKGNhc3QgZXhwcmVzc2lvbikgfCBlcnJvciBpbiBzaWduYXR1cmUgKG1ldGhvZCBkZWNsYXJhdGlvbi8gaW5pdGlhbGl6ZXIpIHwgaXMgcmVjb3ZlcmVkIChhbm5vdGF0aW9uIHJlZmVyZW5jZSkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQ3ID0gMHg0MDsJCQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcikgfCBuZWVkIHJ1bnRpbWUgY2hlY2tjYXN0IChjYXN0IGV4cHJlc3Npb24pIHwgbGFiZWwgdXNlZCAobGFiZWxTdGF0ZW1lbnQpIHwgbmVlZEZyZWVSZXR1cm4gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0OCA9IDB4ODA7CQkJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBvcGVyYXRvciAob3BlcmF0b3IpIHwgdW5zYWZlIGNhc3QgKGNhc3QgZXhwcmVzc2lvbikgfCBpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIChjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbikgfCBpc0Vsc2VTdGF0ZW1lbnRVbnJlYWNoYWJsZSAoaWYgc3RhdGVtZW50KQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDkgPSAweDEwMDsJCQkJLy8gZGVwdGggKG5hbWUgcmVmLCBtc2cpIHwgb3BlcmF0b3IgKG9wZXJhdG9yKSB8IGlzIGxvY2FsIHR5cGUgKHR5cGUgZGVjbCkgfCBpc1RoZW5TdGF0ZW1lbnRVbnJlYWNoYWJsZSAoaWYgc3RhdGVtZW50KSB8IGNhbiBiZSBzdGF0aWMKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxMD0gMHgyMDA7CQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcikgfCBpcyBhbm9ueW1vdXMgdHlwZSAodHlwZSBkZWNsKQogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDExID0gMHg0MDA7CQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcikgfCBpcyBtZW1iZXIgdHlwZSAodHlwZSBkZWNsKQogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDEyID0gMHg4MDA7CQkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcikgfCBoYXMgYWJzdHJhY3QgbWV0aG9kcyAodHlwZSBkZWNsKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDEzID0gMHgxMDAwOwkJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBpcyBzZWNvbmRhcnkgdHlwZSAodHlwZSBkZWNsKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDE0ID0gMHgyMDAwOwkJCQkvLyBzdHJpY3RseSBhc3NpZ25lZCAocmVmZXJlbmNlIGxocykgfCBkaXNjYXJkIGVuY2xvc2luZyBpbnN0YW5jZSAoZXhwbGljaXQgY29uc3RyIGNhbGwpIHwgaGFzQmVlbkdlbmVyYXRlZCAodHlwZSBkZWNsKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDE1ID0gMHg0MDAwOwkJCQkvLyBpcyB1bm5lY2Vzc2FyeSBjYXN0IChleHByZXNzaW9uKSB8IGlzIHZhcmFyZ3MgKHR5cGUgcmVmKSB8IGlzU3ViUm91dGluZUVzY2FwaW5nICh0cnkgc3RhdGVtZW50KSB8IHN1cGVyQWNjZXNzIChqYXZhZG9jIGFsbG9jYXRpb24gZXhwcmVzc2lvbi9qYXZhZG9jIG1lc3NhZ2Ugc2VuZC9qYXZhZG9jIHJldHVybiBzdGF0ZW1lbnQpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTYgPSAweDgwMDA7CQkJCS8vIGluIGphdmFkb2MgY29tbWVudCAobmFtZSByZWYsIHR5cGUgcmVmLCBtc2cpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTcgPSAweDEwMDAwOwkJCS8vIGNvbXBvdW5kIGFzc2lnbmVkIChyZWZlcmVuY2UgbGhzKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDEzID0gMHgxMDAwOwkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IGlzIHNlY29uZGFyeSB0eXBlICh0eXBlIGRlY2wpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTQgPSAweDIwMDA7CQkJLy8gc3RyaWN0bHkgYXNzaWduZWQgKHJlZmVyZW5jZSBsaHMpIHwgZGlzY2FyZCBlbmNsb3NpbmcgaW5zdGFuY2UgKGV4cGxpY2l0IGNvbnN0ciBjYWxsKSB8IGhhc0JlZW5HZW5lcmF0ZWQgKHR5cGUgZGVjbCkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxNSA9IDB4NDAwMDsJCQkvLyBpcyB1bm5lY2Vzc2FyeSBjYXN0IChleHByZXNzaW9uKSB8IGlzIHZhcmFyZ3MgKHR5cGUgcmVmKSB8IGlzU3ViUm91dGluZUVzY2FwaW5nICh0cnkgc3RhdGVtZW50KSB8IHN1cGVyQWNjZXNzIChqYXZhZG9jIGFsbG9jYXRpb24gZXhwcmVzc2lvbi9qYXZhZG9jIG1lc3NhZ2Ugc2VuZC9qYXZhZG9jIHJldHVybiBzdGF0ZW1lbnQpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTYgPSAweDgwMDA7CQkJLy8gaW4gamF2YWRvYyBjb21tZW50IChuYW1lIHJlZiwgdHlwZSByZWYsIG1zZykKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxNyA9IDB4MTAwMDA7CQkJLy8gY29tcG91bmQgYXNzaWduZWQgKHJlZmVyZW5jZSBsaHMpIHwgdW5jaGVja2VkIChtc2csIGFsbG9jLCBleHBsaWNpdCBjb25zdHIgY2FsbCkKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxOCA9IDB4MjAwMDA7CQkJLy8gbm9uIG51bGwgKGV4cHJlc3Npb24pIHwgb25EZW1hbmQgKGltcG9ydCByZWZlcmVuY2UpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTkgPSAweDQwMDAwOwkJCS8vIGRpZFJlc29sdmUgKHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkIHR5cGUgcmVmL3BhcmFtZXRlcml6ZWQgc2luZ2xlIHR5cGUgcmVmKSAgfCBlbXB0eSAoamF2YWRvYyByZXR1cm4gc3RhdGVtZW50KQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDIwID0gMHg4MDAwMDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxOSA9IDB4NDAwMDA7CQkJLy8gZGlkUmVzb2x2ZSAocGFyYW1ldGVyaXplZCBxdWFsaWZpZWQgdHlwZSByZWYvcGFyYW1ldGVyaXplZCBzaW5nbGUgdHlwZSByZWYpICB8IGVtcHR5IChqYXZhZG9jIHJldHVybiBzdGF0ZW1lbnQpIHwgbmVlZFJlY2VpdmVyR2VuZXJpY0Nhc3QgKG1zZy9maWVsZHJlZikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyMCA9IDB4ODAwMDA7CQkJLy8gY29udGFpbnMgc3ludGF4IGVycm9ycyAobWV0aG9kIGRlY2xhcmF0aW9uLCB0eXBlIGRlY2xhcmF0aW9uLCBmaWVsZCBkZWNsYXJhdGlvbnMsIGluaXRpYWxpemVyKQogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDIxID0gMHgxMDAwMDA7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjIgPSAweDIwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikgfCB1c2VkIChpbXBvcnQgcmVmZXJlbmNlKQogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDIzID0gMHg0MDAwMDA7CQkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjQgPSAweDgwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNSA9IDB4MTAwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNiA9IDB4MjAwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNyA9IDB4NDAwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyOCA9IDB4ODAwMDAwMDsJCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyOSA9IDB4MTAwMDAwMDA7CQkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MzAgPSAweDIwMDAwMDAwOwkJCS8vIGVsc2VpZiAoaWYgc3RhdGVtZW50KSB8IHRyeSBibG9jayBleGl0ICh0cnkgc3RhdGVtZW50KSB8IGZhbGwtdGhyb3VnaCAoY2FzZSBzdGF0ZW1lbnQpIHwgaWdub3JlIG5vIGVmZmVjdCBhc3NpZ24gKGV4cHJlc3Npb24gcmVmKSB8IG5lZWRTY29wZSAoZm9yIHN0YXRlbWVudCkgfCBpc0FueVN1YlJvdXRpbmVFc2NhcGluZyAocmV0dXJuIHN0YXRlbWVudCkgfCBibG9ja0V4aXQgKHN5bmNocm9uaXplZCBzdGF0ZW1lbnQpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MzEgPSAweDQwMDAwMDAwOwkJCS8vIGxvY2FsIGRlY2xhcmF0aW9uIHJlYWNoYWJsZSAobG9jYWwgZGVjbCkgfCBpZ25vcmUgcmF3IHR5cGUgY2hlY2sgKHR5cGUgcmVmKSB8IGRpc2NhcmQgZW50aXJlIGFzc2lnbm1lbnQgKGFzc2lnbm1lbnQpIHwgaXNTeW5jaHJvbml6ZWQgKHJldHVybiBzdGF0ZW1lbnQpIHwgdGhlbkV4aXQgKGlmIHN0YXRlbWVudCkgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MzIgPSAweDgwMDAwMDAwOwkJCS8vIHJlYWNoYWJsZSAoc3RhdGVtZW50KQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDI1ID0gMHgxMDAwMDAwOwkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjYgPSAweDIwMDAwMDA7CQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNyA9IDB4NDAwMDAwMDsJCS8vIHBhcmVudGhlc2lzIGNvdW50IChleHByZXNzaW9uKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDI4ID0gMHg4MDAwMDAwOwkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjkgPSAweDEwMDAwMDAwOwkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MzAgPSAweDIwMDAwMDAwOwkJLy8gZWxzZWlmIChpZiBzdGF0ZW1lbnQpIHwgdHJ5IGJsb2NrIGV4aXQgKHRyeSBzdGF0ZW1lbnQpIHwgZmFsbC10aHJvdWdoIChjYXNlIHN0YXRlbWVudCkgfCBpZ25vcmUgbm8gZWZmZWN0IGFzc2lnbiAoZXhwcmVzc2lvbiByZWYpIHwgbmVlZFNjb3BlIChmb3Igc3RhdGVtZW50KSB8IGlzQW55U3ViUm91dGluZUVzY2FwaW5nIChyZXR1cm4gc3RhdGVtZW50KSB8IGJsb2NrRXhpdCAoc3luY2hyb25pemVkIHN0YXRlbWVudCkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQzMSA9IDB4NDAwMDAwMDA7CQkvLyBsb2NhbCBkZWNsYXJhdGlvbiByZWFjaGFibGUgKGxvY2FsIGRlY2wpIHwgaWdub3JlIHJhdyB0eXBlIGNoZWNrICh0eXBlIHJlZikgfCBkaXNjYXJkIGVudGlyZSBhc3NpZ25tZW50IChhc3NpZ25tZW50KSB8IGlzU3luY2hyb25pemVkIChyZXR1cm4gc3RhdGVtZW50KSB8IHRoZW5FeGl0IChpZiBzdGF0ZW1lbnQpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MzIgPSAweDgwMDAwMDAwOwkJLy8gcmVhY2hhYmxlIChzdGF0ZW1lbnQpCiAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQml0MzJMID0gMHg4MDAwMDAwMEw7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJpdDMzTCA9IDB4MTAwMDAwMDAwTDsKQEAgLTEwOSw5ICsxMTAsMTUgQEAKIAkvLyBmb3IgbmFtZSByZWZlcmVuY2VzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVzdHJpY3RpdmVGbGFnTUFTSyA9IEJpdDF8Qml0MnxCaXQzOwogCisJLy8gZm9yIGxvY2FsIGRlY2xzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNBcmd1bWVudCA9IEJpdDM7CisKIAkvLyBmb3IgbmFtZSByZWZzIG9yIGxvY2FsIGRlY2xzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlyc3RBc3NpZ25tZW50VG9Mb2NhbCA9IEJpdDQ7CiAKKwkvLyBmb3IgbXNnIG9yIGZpZWxkIHJlZmVyZW5jZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOZWVkUmVjZWl2ZXJHZW5lcmljQ2FzdCA9IEJpdDE5OworCQogCS8vIGZvciB0aGlzIHJlZmVyZW5jZQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzSW1wbGljaXRUaGlzID0gQml0MzsKIApAQCAtMTIyLDcgKzEyOSw3IEBACiAJLy8gZm9yIHN0YXRlbWVudHMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc1JlYWNoYWJsZSA9IEJpdDMyOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExhYmVsVXNlZCA9IEJpdDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG9jdW1lbnRlZEZhbGx0aHJvdWdoID0gQml0MzA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG9jdW1lbnRlZEZhbGx0aHJvdWdoID0gQml0MzA7IC8vIHN3aXRjaCBzdGF0ZW1lbnQKIAogCS8vIGxvY2FsIGRlY2xzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlID0gQml0MzE7CkBAIC0xNTUsNiArMTYyLDEyIEBACiAKIAkvLyBmb3IgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpc2NhcmRFbmNsb3NpbmdJbnN0YW5jZSA9IEJpdDE0OyAvLyB1c2VkIGZvciBjb2RlZ2VuCisKKwkvLyBmb3IgYWxsIG1ldGhvZC9jb25zdHJ1Y3RvciBpbnZvY2F0aW9ucyAobXNnLCBhbGxvYywgZXhwbC4gY29uc3RyIGNhbGwpCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5jaGVja2VkID0gQml0MTc7CisJCisJLy8gZm9yIGphdmFkb2MgLSB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGphdmFkb2MgaGFzIHRvIGJlIHJlc29sdmVkCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVzb2x2ZUphdmFkb2MgPSBCaXQxNzsKIAkKIAkvLyBmb3IgZW1wdHkgc3RhdGVtZW50CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNVc2VmdWxFbXB0eVN0YXRlbWVudCA9IEJpdDE7CkBAIC0xNjIsMTAgKzE3NSwxMSBAQAogCS8vIGZvciBibG9jayBhbmQgbWV0aG9kIGRlY2xhcmF0aW9uCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5kb2N1bWVudGVkRW1wdHlCbG9jayA9IEJpdDQ7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3ZlcnJpZGluZ01ldGhvZFdpdGhTdXBlcmNhbGwgPSBCaXQ1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENhbkJlU3RhdGljID0gQml0OTsgICAvLyB1c2VkIHRvIGZsYWcgYSBtZXRob2QgdGhhdCBjYW4gYmUgZGVjbGFyZWQgc3RhdGljCiAKIAkvLyBmb3IgaW5pdGlhbGl6ZXIgYW5kIG1ldGhvZCBkZWNsYXJhdGlvbgogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVycm9ySW5TaWduYXR1cmUgPSBCaXQ2OwotCQorCiAJLy8gZm9yIGFic3RyYWN0IG1ldGhvZCBkZWNsYXJhdGlvbgogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5lZWRGcmVlUmV0dXJuID0gQml0NzsgLy8gYWJzdHJhY3QgbWV0aG9kIGRlY2xhcmF0aW9uCiAKQEAgLTE4OCw2ICsyMDIsOCBAQAogCS8vIGZvciBpZiBzdGF0ZW1lbnQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc0Vsc2VJZlN0YXRlbWVudCA9IEJpdDMwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW5FeGl0ID0gQml0MzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNFbHNlU3RhdGVtZW50VW5yZWFjaGFibGUgPSBCaXQ4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzVGhlblN0YXRlbWVudFVucmVhY2hhYmxlID0gQml0OTsKIAogCS8vIGZvciB0eXBlIHJlZmVyZW5jZQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzU3VwZXJUeXBlID0gQml0NTsKQEAgLTIwNiwyMiArMjIyLDM4IEBACiAJLy8gZm9yIGltcG9ydCByZWZlcmVuY2UKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPbkRlbWFuZCA9IEJpdDE4OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVzZWQgPSBCaXQyOwotCQorCiAJLy8gZm9yIHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkL3NpbmdsZSB0eXBlIHJlZgogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpZFJlc29sdmUgPSBCaXQxOTsKLQkKKwogCS8vIGZvciByZXR1cm4gc3RhdGVtZW50CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNBbnlTdWJSb3V0aW5lRXNjYXBpbmcgPSBCaXQzMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc1N5bmNocm9uaXplZCA9IEJpdDMxOwotCQorCiAJLy8gZm9yIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCbG9ja0V4aXQgPSBCaXQzMDsKLQkKKworCS8vIGZvciBhbm5vdGF0aW9uIHJlZmVyZW5jZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzUmVjb3ZlcmVkID0gQml0NjsKKworCS8vIGZvciB0eXBlIGRlY2xhcmF0aW9uLCBpbml0aWFsaXplciBhbmQgbWV0aG9kIGRlY2xhcmF0aW9uCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSGFzU3ludGF4RXJyb3JzID0gQml0MjA7CisKIAkvLyBjb25zdGFudHMgdXNlZCB3aGVuIGNoZWNraW5nIGludm9jYXRpb24gYXJndW1lbnRzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WT0NBVElPTl9BUkdVTUVOVF9PSyA9IDA7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WT0NBVElPTl9BUkdVTUVOVF9VTkNIRUNLRUQgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVk9DQVRJT05fQVJHVU1FTlRfV0lMRENBUkQgPSAyOwogCisJLy8gZm9yIHR5cGUgcmVmZXJlbmNlIChkaWFtb25kIGNhc2UpIC0gSmF2YSA3CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNVbmlvblR5cGUgPSBCaXQzMDsKKwkvLyBVc2VkIHRvIHRhZyBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBvciBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB3aGVuIHRoZXkgYXJlCisJLy8gdXNlZCB3aXRob3V0IGFueSB0eXBlIGFyZ3MuIEl0IGlzIGFsc28gdXNlZCB0byB0YWcgQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhwcmVzc2lvbiB3aGVuIHRoZQorCS8vIGdlbmVyaWNzIGluZmVyZW5jZSBoYXMgZmFpbGVkIGFuZCB0aGUgcmVzb2x2ZWQgdHlwZSBzdGlsbCBoYXMgPD4uCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNEaWFtb25kID0gQml0MjA7CisKKwkvLyB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgbWV0aG9kIGludm9jYXRpb24gYXMgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zaWRlRXhwcmVzc2lvblN0YXRlbWVudCA9IEJpdDU7CisKIAlwdWJsaWMgQVNUTm9kZSgpIHsKIAogCQlzdXBlcigpOwpAQCAtMjI5LDE5ICsyNjEsMjQgQEAKIAlwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tJbnZvY2F0aW9uQXJndW1lbnQoQmxvY2tTY29wZSBzY29wZSwgRXhwcmVzc2lvbiBhcmd1bWVudCwgVHlwZUJpbmRpbmcgcGFyYW1ldGVyVHlwZSwgVHlwZUJpbmRpbmcgYXJndW1lbnRUeXBlLCBUeXBlQmluZGluZyBvcmlnaW5hbFBhcmFtZXRlclR5cGUpIHsKIAkJYXJndW1lbnQuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHBhcmFtZXRlclR5cGUsIGFyZ3VtZW50VHlwZSk7CiAKLQkJaWYgKGFyZ3VtZW50VHlwZSAhPSBUeXBlQmluZGluZy5OVUxMICYmIHBhcmFtZXRlclR5cGUuaXNXaWxkY2FyZCgpKSB7CisJCWlmIChhcmd1bWVudFR5cGUgIT0gVHlwZUJpbmRpbmcuTlVMTCAmJiBwYXJhbWV0ZXJUeXBlLmtpbmQoKSA9PSBCaW5kaW5nLldJTERDQVJEX1RZUEUpIHsgLy8gaW50ZXJzZWN0aW9uIHR5cGVzIGFyZSB0b2xlcmF0ZWQKIAkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIHBhcmFtZXRlclR5cGU7Ci0JCQlpZiAod2lsZGNhcmQuYm91bmRLaW5kICE9IFdpbGRjYXJkLlNVUEVSICYmIHdpbGRjYXJkLm90aGVyQm91bmRzID09IG51bGwpIC8vIGx1YiB3aWxkY2FyZHMgYXJlIHRvbGVyYXRlZAorCQkJaWYgKHdpbGRjYXJkLmJvdW5kS2luZCAhPSBXaWxkY2FyZC5TVVBFUikgewogCQkgICAgCXJldHVybiBJTlZPQ0FUSU9OX0FSR1VNRU5UX1dJTERDQVJEOworCQkJfQogCQl9Ci0JCVR5cGVCaW5kaW5nIGNoZWNrZWRQYXJhbWV0ZXJUeXBlID0gb3JpZ2luYWxQYXJhbWV0ZXJUeXBlID09IG51bGwgPyBwYXJhbWV0ZXJUeXBlIDogb3JpZ2luYWxQYXJhbWV0ZXJUeXBlOworCQlUeXBlQmluZGluZyBjaGVja2VkUGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGU7IC8vIG9yaWdpbmFsUGFyYW1ldGVyVHlwZSA9PSBudWxsID8gcGFyYW1ldGVyVHlwZSA6IG9yaWdpbmFsUGFyYW1ldGVyVHlwZTsKIAkJaWYgKGFyZ3VtZW50VHlwZSAhPSBjaGVja2VkUGFyYW1ldGVyVHlwZSAmJiBhcmd1bWVudFR5cGUubmVlZHNVbmNoZWNrZWRDb252ZXJzaW9uKGNoZWNrZWRQYXJhbWV0ZXJUeXBlKSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlVHlwZUNvbnZlcnNpb24oYXJndW1lbnQsIGFyZ3VtZW50VHlwZSwgY2hlY2tlZFBhcmFtZXRlclR5cGUpOwogCQkJcmV0dXJuIElOVk9DQVRJT05fQVJHVU1FTlRfVU5DSEVDS0VEOwogCQl9CiAJCXJldHVybiBJTlZPQ0FUSU9OX0FSR1VNRU5UX09LOwogCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKEJsb2NrU2NvcGUgc2NvcGUsIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgTWV0aG9kQmluZGluZyBtZXRob2QsIEV4cHJlc3Npb25bXSBhcmd1bWVudHMsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgYm9vbGVhbiBhcmdzQ29udGFpbkNhc3QsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrSW52b2NhdGlvbkFyZ3VtZW50cyhCbG9ja1Njb3BlIHNjb3BlLCBFeHByZXNzaW9uIHJlY2VpdmVyLCBUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBFeHByZXNzaW9uW10gYXJndW1lbnRzLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIGJvb2xlYW4gYXJnc0NvbnRhaW5DYXN0LCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCQlib29sZWFuIGlzMV83ID0gc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNzsKKwkJaWYgKGlzMV83ICYmIG1ldGhvZC5pc1BvbHltb3JwaGljKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQogCQlUeXBlQmluZGluZ1tdIHBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzOwogCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbXMubGVuZ3RoOwogCQlib29sZWFuIGlzUmF3TWVtYmVySW52b2NhdGlvbiA9ICFtZXRob2QuaXNTdGF0aWMoKQpAQCAtMjQ5LDExICsyODYsMTIgQEAKIAkJCQkmJiBtZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNSYXdUeXBlKCkKIAkJCQkmJiBtZXRob2QuaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCk7CiAKKwkJYm9vbGVhbiB1bmNoZWNrZWRCb3VuZENoZWNrID0gKG1ldGhvZC50YWdCaXRzICYgVGFnQml0cy5IYXNVbmNoZWNrZWRUeXBlQXJndW1lbnRGb3JCb3VuZENoZWNrKSAhPSAwOwogCQlNZXRob2RCaW5kaW5nIHJhd09yaWdpbmFsR2VuZXJpY01ldGhvZCA9IG51bGw7CiAJCWlmICghaXNSYXdNZW1iZXJJbnZvY2F0aW9uKSB7CiAJCQlpZiAobWV0aG9kIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSB7CiAJCQkJUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIHBhcmFtTWV0aG9kID0gKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZykgbWV0aG9kOwotCQkJCWlmIChwYXJhbU1ldGhvZC5pc1VuY2hlY2tlZCB8fCAocGFyYW1NZXRob2QuaXNSYXcgJiYgbWV0aG9kLmhhc1N1YnN0aXR1dGVkUGFyYW1ldGVycygpKSkgeworCQkJCWlmIChwYXJhbU1ldGhvZC5pc1JhdyAmJiBtZXRob2QuaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCkpIHsKIAkJCQkJcmF3T3JpZ2luYWxHZW5lcmljTWV0aG9kID0gbWV0aG9kLm9yaWdpbmFsKCk7CiAJCQkJfQogCQkJfQpAQCAtMjYyLDkgKzMwMCwxMCBAQAogCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKIAkJCWlmIChtZXRob2QuaXNWYXJhcmdzKCkpIHsKIAkJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXJUeXBlID0gKChBcnJheUJpbmRpbmcpIHBhcmFtc1twYXJhbUxlbmd0aC0xXSkuZWxlbWVudHNUeXBlKCk7IC8vIG5vIGVsZW1lbnQgd2FzIHN1cHBsaWVkIGZvciB2YXJhcmcgcGFyYW1ldGVyCi0JCSAgICAJaWYgKCFwYXJhbWV0ZXJUeXBlLmlzUmVpZmlhYmxlKCkpIHsKLQkJCQkgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlR2VuZXJpY0FycmF5Rm9yVmFyYXJncyhwYXJhbWV0ZXJUeXBlLCAoQVNUTm9kZSlpbnZvY2F0aW9uU2l0ZSk7Ci0JCSAgICAJfQorCQkJCWlmICghcGFyYW1ldGVyVHlwZS5pc1JlaWZpYWJsZSgpCisJCQkJCQkmJiAoIWlzMV83IHx8ICgobWV0aG9kLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25TYWZlVmFyYXJncykgPT0gMCkpKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZUdlbmVyaWNBcnJheUZvclZhcmFyZ3MocGFyYW1ldGVyVHlwZSwgKEFTVE5vZGUpaW52b2NhdGlvblNpdGUpOworCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChtZXRob2QuaXNWYXJhcmdzKCkpIHsKQEAgLTI3NCwyNCArMzEzLDI0IEBACiAJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsUmF3UGFyYW0gPSByYXdPcmlnaW5hbEdlbmVyaWNNZXRob2QgPT0gbnVsbCA/IG51bGwgOiByYXdPcmlnaW5hbEdlbmVyaWNNZXRob2QucGFyYW1ldGVyc1tpXTsKIAkJCQkJaW52b2NhdGlvblN0YXR1cyB8PSBjaGVja0ludm9jYXRpb25Bcmd1bWVudChzY29wZSwgYXJndW1lbnRzW2ldLCBwYXJhbXNbaV0gLCBhcmd1bWVudFR5cGVzW2ldLCBvcmlnaW5hbFJhd1BhcmFtKTsKIAkJCQl9Ci0JCQkgICBpbnQgYXJnTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKLQkJCSAgIGlmIChsYXN0SW5kZXggPCBhcmdMZW5ndGgpIHsgLy8gdmFyYXJnIGFyZ3VtZW50IHdhcyBwcm92aWRlZAotCQkJCSAgIAlUeXBlQmluZGluZyBwYXJhbWV0ZXJUeXBlID0gcGFyYW1zW2xhc3RJbmRleF07CisJCQkJaW50IGFyZ0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCQkJaWYgKGxhc3RJbmRleCA8PSBhcmdMZW5ndGgpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzA5MworCQkJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXJUeXBlID0gcGFyYW1zW2xhc3RJbmRleF07CiAJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsUmF3UGFyYW0gPSBudWxsOwogCi0JCQkJICAgIGlmIChwYXJhbUxlbmd0aCAhPSBhcmdMZW5ndGggfHwgcGFyYW1ldGVyVHlwZS5kaW1lbnNpb25zKCkgIT0gYXJndW1lbnRUeXBlc1tsYXN0SW5kZXhdLmRpbWVuc2lvbnMoKSkgewotCQkJCSAgICAJcGFyYW1ldGVyVHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBwYXJhbWV0ZXJUeXBlKS5lbGVtZW50c1R5cGUoKTsgLy8gc2luZ2xlIGVsZW1lbnQgd2FzIHByb3ZpZGVkIGZvciB2YXJhcmcgcGFyYW1ldGVyCi0JCQkJICAgIAlpZiAoIXBhcmFtZXRlclR5cGUuaXNSZWlmaWFibGUoKSkgewotCQkJCQkJICAgIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZUdlbmVyaWNBcnJheUZvclZhcmFyZ3MocGFyYW1ldGVyVHlwZSwgKEFTVE5vZGUpaW52b2NhdGlvblNpdGUpOwotCQkJCSAgICAJfQorCQkJCQlpZiAocGFyYW1MZW5ndGggIT0gYXJnTGVuZ3RoIHx8IHBhcmFtZXRlclR5cGUuZGltZW5zaW9ucygpICE9IGFyZ3VtZW50VHlwZXNbbGFzdEluZGV4XS5kaW1lbnNpb25zKCkpIHsKKwkJCQkJCXBhcmFtZXRlclR5cGUgPSAoKEFycmF5QmluZGluZykgcGFyYW1ldGVyVHlwZSkuZWxlbWVudHNUeXBlKCk7IC8vIHNpbmdsZSBlbGVtZW50IHdhcyBwcm92aWRlZCBmb3IgdmFyYXJnIHBhcmFtZXRlcgorCQkJCQkJaWYgKCFwYXJhbWV0ZXJUeXBlLmlzUmVpZmlhYmxlKCkKKwkJCQkJCQkJJiYgKCFpczFfNyB8fCAoKG1ldGhvZC50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpID09IDApKSkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZUdlbmVyaWNBcnJheUZvclZhcmFyZ3MocGFyYW1ldGVyVHlwZSwgKEFTVE5vZGUpaW52b2NhdGlvblNpdGUpOworCQkJCQkJfQogCQkJCQkJb3JpZ2luYWxSYXdQYXJhbSA9IHJhd09yaWdpbmFsR2VuZXJpY01ldGhvZCA9PSBudWxsID8gbnVsbCA6ICgoQXJyYXlCaW5kaW5nKXJhd09yaWdpbmFsR2VuZXJpY01ldGhvZC5wYXJhbWV0ZXJzW2xhc3RJbmRleF0pLmVsZW1lbnRzVHlwZSgpOwotCQkJCSAgICB9CisJCQkJCX0KIAkJCQkJZm9yIChpbnQgaSA9IGxhc3RJbmRleDsgaSA8IGFyZ0xlbmd0aDsgaSsrKSB7CiAJCQkJCQlpbnZvY2F0aW9uU3RhdHVzIHw9IGNoZWNrSW52b2NhdGlvbkFyZ3VtZW50KHNjb3BlLCBhcmd1bWVudHNbaV0sIHBhcmFtZXRlclR5cGUsIGFyZ3VtZW50VHlwZXNbaV0sIG9yaWdpbmFsUmF3UGFyYW0pOwogCQkJCQl9Ci0JCQkJfQotCi0JCQkgICBpZiAocGFyYW1MZW5ndGggPT0gYXJndW1lbnRUeXBlcy5sZW5ndGgpIHsgLy8gNzAwNTYKKwkJCQl9IAorCQkJCWlmIChwYXJhbUxlbmd0aCA9PSBhcmdMZW5ndGgpIHsgLy8gNzAwNTYKIAkJCQkJaW50IHZhcmFyZ3NJbmRleCA9IHBhcmFtTGVuZ3RoIC0gMTsKIAkJCQkJQXJyYXlCaW5kaW5nIHZhcmFyZ3NUeXBlID0gKEFycmF5QmluZGluZykgcGFyYW1zW3ZhcmFyZ3NJbmRleF07CiAJCQkJCVR5cGVCaW5kaW5nIGxhc3RBcmdUeXBlID0gYXJndW1lbnRUeXBlc1t2YXJhcmdzSW5kZXhdOwpAQCAtMzI1LDIyICszNjQsMzYgQEAKIAkJCX0KIAkJfQogCQlpZiAoKGludm9jYXRpb25TdGF0dXMgJiBJTlZPQ0FUSU9OX0FSR1VNRU5UX1dJTERDQVJEKSAhPSAwKSB7Ci0JCSAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS53aWxkY2FyZEludm9jYXRpb24oKEFTVE5vZGUpaW52b2NhdGlvblNpdGUsIHJlY2VpdmVyVHlwZSwgbWV0aG9kLCBhcmd1bWVudFR5cGVzKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLndpbGRjYXJkSW52b2NhdGlvbigoQVNUTm9kZSlpbnZvY2F0aW9uU2l0ZSwgcmVjZWl2ZXJUeXBlLCBtZXRob2QsIGFyZ3VtZW50VHlwZXMpOwogCQl9IGVsc2UgaWYgKCFtZXRob2QuaXNTdGF0aWMoKSAmJiAhcmVjZWl2ZXJUeXBlLmlzVW5ib3VuZFdpbGRjYXJkKCkgJiYgbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzUmF3VHlwZSgpICYmIG1ldGhvZC5oYXNTdWJzdGl0dXRlZFBhcmFtZXRlcnMoKSkgewotCQkgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlUmF3SW52b2NhdGlvbigoQVNUTm9kZSlpbnZvY2F0aW9uU2l0ZSwgbWV0aG9kKTsKLQkJfSBlbHNlIGlmIChyYXdPcmlnaW5hbEdlbmVyaWNNZXRob2QgIT0gbnVsbCkgewotCQkgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlUmF3R2VuZXJpY01ldGhvZEludm9jYXRpb24oKEFTVE5vZGUpaW52b2NhdGlvblNpdGUsIG1ldGhvZCk7CisJCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zIHx8IHJlY2VpdmVyID09IG51bGwgfHwgIXJlY2VpdmVyLmZvcmNlZFRvQmVSYXcoc2NvcGUucmVmZXJlbmNlQ29udGV4dCgpKSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZVJhd0ludm9jYXRpb24oKEFTVE5vZGUpaW52b2NhdGlvblNpdGUsIG1ldGhvZCk7CisJCQl9CisJCX0gZWxzZSBpZiAocmF3T3JpZ2luYWxHZW5lcmljTWV0aG9kICE9IG51bGwgCisJCQkJfHwgdW5jaGVja2VkQm91bmRDaGVjaworCQkJCXx8ICgoaW52b2NhdGlvblN0YXR1cyAmIElOVk9DQVRJT05fQVJHVU1FTlRfVU5DSEVDS0VEKSAhPSAwIAorCQkJCQkJJiYgbWV0aG9kIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nCisJCQkJCQkvKiYmIG1ldGhvZC5yZXR1cm5UeXBlICE9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZShtZXRob2QucmV0dXJuVHlwZS5lcmFzdXJlKCksIHRydWUpKi8pKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVSYXdHZW5lcmljTWV0aG9kSW52b2NhdGlvbigoQVNUTm9kZSlpbnZvY2F0aW9uU2l0ZSwgbWV0aG9kLCBhcmd1bWVudFR5cGVzKTsKKwkJCXJldHVybiB0cnVlOwogCQl9CisJCXJldHVybiBmYWxzZTsKIAl9CiAJcHVibGljIEFTVE5vZGUgY29uY3JldGVTdGF0ZW1lbnQoKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmllbGRVc2VEZXByZWNhdGVkKEZpZWxkQmluZGluZyBmaWVsZCwgU2NvcGUgc2NvcGUsIGJvb2xlYW4gaXNTdHJpY3RseUFzc2lnbmVkKSB7Ci0KLQkJaWYgKCFpc1N0cmljdGx5QXNzaWduZWQgJiYgKGZpZWxkLmlzUHJpdmF0ZSgpIHx8IChmaWVsZC5kZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmIGZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzTG9jYWxUeXBlKCkpKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5GaWVsZChmaWVsZCkpIHsKLQkJCS8vIGlnbm9yZSBjYXNlcyB3aGVyZSBmaWVsZCBpcyB1c2VkIGZyb20gd2l0aGluIGluc2lkZSBpdHNlbGYKLQkJCWZpZWxkLm9yaWdpbmFsKCkubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWVsZFVzZURlcHJlY2F0ZWQoRmllbGRCaW5kaW5nIGZpZWxkLCBTY29wZSBzY29wZSwgaW50IGZpbHRlcmVkQml0cykgeworCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSW5zaWRlSmF2YWRvYykgPT0gMAkJCS8vIGlnbm9yZSByZWZlcmVuY2VzIGluc2lkZSBKYXZhZG9jIGNvbW1lbnRzIAorCQkJCSYmIChmaWx0ZXJlZEJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpID09IDAgCS8vIGlnbm9yZSB3cml0ZSBhY2Nlc3MKKwkJCQkmJiBmaWVsZC5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkgCisJCQkJJiYgIXNjb3BlLmlzRGVmaW5lZEluRmllbGQoZmllbGQpKSAJCQkJLy8gaWdub3JlIGNhc2VzIHdoZXJlIGZpZWxkIGlzIHVzZWQgZnJvbSBpbnNpZGUgaXRzZWxmIAorCQl7CQkKKwkJCWlmICgoKGZpbHRlcmVkQml0cyAmIElzQ29tcG91bmRBc3NpZ25lZCkgIT0gMCkpCisJCQkJLy8gdXNlZCwgYnV0IHVzYWdlIG1heSBub3QgYmUgcmVsZXZhbnQKKwkJCQlmaWVsZC5vcmlnaW5hbCgpLmNvbXBvdW5kVXNlRmxhZysrOworCQkJZWxzZQorCQkJCWZpZWxkLm9yaWdpbmFsKCkubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CiAJCX0KIAogCQlpZiAoKGZpZWxkLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjUmVzdHJpY3RlZEFjY2VzcykgIT0gMCkgewpAQCAtMzQ4LDcgKzQwMSw4IEBACiAJCQkJc2NvcGUuZW52aXJvbm1lbnQoKS5nZXRBY2Nlc3NSZXN0cmljdGlvbihmaWVsZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpOwogCQkJaWYgKHJlc3RyaWN0aW9uICE9IG51bGwpIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mb3JiaWRkZW5SZWZlcmVuY2UoZmllbGQsIHRoaXMsCi0JCQkJCQlyZXN0cmljdGlvbi5nZXRGaWVsZEFjY2Vzc01lc3NhZ2VUZW1wbGF0ZSgpLCByZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSk7CisJCQkJCQlyZXN0cmljdGlvbi5jbGFzc3BhdGhFbnRyeVR5cGUsIHJlc3RyaWN0aW9uLmNsYXNzcGF0aEVudHJ5TmFtZSwKKwkJCQkJCXJlc3RyaWN0aW9uLmdldFByb2JsZW1JZCgpKTsKIAkJCX0KIAkJfQogCkBAIC0zNzIsOCArNDI2LDkgQEAKIAkqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWV0aG9kVXNlRGVwcmVjYXRlZChNZXRob2RCaW5kaW5nIG1ldGhvZCwgU2NvcGUgc2NvcGUsCiAJCQlib29sZWFuIGlzRXhwbGljaXRVc2UpIHsKLQkJaWYgKChtZXRob2QuaXNQcml2YXRlKCkgfHwgbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzTG9jYWxUeXBlKCkpICYmICFzY29wZS5pc0RlZmluZWRJbk1ldGhvZChtZXRob2QpKSB7Ci0JCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgbWV0aG9kIGlzIHVzZWQgZnJvbSB3aXRoaW4gaW5zaWRlIGl0c2VsZiAoZS5nLiBkaXJlY3QgcmVjdXJzaW9ucykKKwkJLy8gaWdub3JlIHJlZmVyZW5jZXMgaW5zaW5nIEphdmFkb2MgY29tbWVudHMKKwkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpID09IDAgJiYgbWV0aG9kLmlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QobWV0aG9kKSkgeworCQkJLy8gaWdub3JlIGNhc2VzIHdoZXJlIG1ldGhvZCBpcyB1c2VkIGZyb20gaW5zaWRlIGl0c2VsZiAoZS5nLiBkaXJlY3QgcmVjdXJzaW9ucykKIAkJCW1ldGhvZC5vcmlnaW5hbCgpLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOwogCQl9CiAKQEAgLTM4NSwxNiArNDQwLDkgQEAKIAkJCUFjY2Vzc1Jlc3RyaWN0aW9uIHJlc3RyaWN0aW9uID0KIAkJCQlzY29wZS5lbnZpcm9ubWVudCgpLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpOwogCQkJaWYgKHJlc3RyaWN0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mb3JiaWRkZW5SZWZlcmVuY2UobWV0aG9kLCB0aGlzLAotCQkJCQkJCXJlc3RyaWN0aW9uLmdldENvbnN0cnVjdG9yQWNjZXNzTWVzc2FnZVRlbXBsYXRlKCksCi0JCQkJCQkJcmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yYmlkZGVuUmVmZXJlbmNlKG1ldGhvZCwgdGhpcywKLQkJCQkJCQlyZXN0cmljdGlvbi5nZXRNZXRob2RBY2Nlc3NNZXNzYWdlVGVtcGxhdGUoKSwKLQkJCQkJCQlyZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSk7Ci0JCQkJfQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZvcmJpZGRlblJlZmVyZW5jZShtZXRob2QsIHRoaXMsCisJCQkJCQlyZXN0cmljdGlvbi5jbGFzc3BhdGhFbnRyeVR5cGUsIHJlc3RyaWN0aW9uLmNsYXNzcGF0aEVudHJ5TmFtZSwKKwkJCQkJCXJlc3RyaWN0aW9uLmdldFByb2JsZW1JZCgpKTsKIAkJCX0KIAkJfQogCkBAIC00MjksMjIgKzQ3NywyNCBAQAogCSovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUeXBlVXNlRGVwcmVjYXRlZChUeXBlQmluZGluZyB0eXBlLCBTY29wZSBzY29wZSkgewogCi0JCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpCisJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCXR5cGUgPSAoKEFycmF5QmluZGluZykgdHlwZSkubGVhZkNvbXBvbmVudFR5cGU7CisJCX0KIAkJaWYgKHR5cGUuaXNCYXNlVHlwZSgpKQogCQkJcmV0dXJuIGZhbHNlOwogCiAJCVJlZmVyZW5jZUJpbmRpbmcgcmVmVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlOwotCi0JCWlmICgocmVmVHlwZS5pc1ByaXZhdGUoKSB8fCByZWZUeXBlLmlzTG9jYWxUeXBlKCkpICYmICFzY29wZS5pc0RlZmluZWRJblR5cGUocmVmVHlwZSkpIHsKLQkJCS8vIGlnbm9yZSBjYXNlcyB3aGVyZSB0eXBlIGlzIHVzZWQgZnJvbSB3aXRoaW4gaW5zaWRlIGl0c2VsZgorCQkvLyBpZ25vcmUgcmVmZXJlbmNlcyBpbnNpbmcgSmF2YWRvYyBjb21tZW50cworCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSW5zaWRlSmF2YWRvYykgPT0gMCAmJiByZWZUeXBlLmlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5UeXBlKHJlZlR5cGUpKSB7CisJCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgdHlwZSBpcyB1c2VkIGZyb20gaW5zaWRlIGl0c2VsZgogCQkJKChSZWZlcmVuY2VCaW5kaW5nKXJlZlR5cGUuZXJhc3VyZSgpKS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKIAkJfQogCiAJCWlmIChyZWZUeXBlLmhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSkgewogCQkJQWNjZXNzUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSBzY29wZS5lbnZpcm9ubWVudCgpLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKHR5cGUuZXJhc3VyZSgpKTsKIAkJCWlmIChyZXN0cmljdGlvbiAhPSBudWxsKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yYmlkZGVuUmVmZXJlbmNlKHR5cGUsIHRoaXMsIHJlc3RyaWN0aW9uLmdldE1lc3NhZ2VUZW1wbGF0ZSgpLCByZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKSk7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yYmlkZGVuUmVmZXJlbmNlKHR5cGUsIHRoaXMsIHJlc3RyaWN0aW9uLmNsYXNzcGF0aEVudHJ5VHlwZSwKKwkJCQkJCXJlc3RyaWN0aW9uLmNsYXNzcGF0aEVudHJ5TmFtZSwgcmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkpOwogCQkJfQogCQl9CiAKQEAgLTUwNyw5ICs1NTcsOSBAQAogCSAqIFJlc29sdmUgYW5ub3RhdGlvbnMsIGFuZCBjaGVjayBkdXBsaWNhdGVzLCBhbnN3ZXJzIGNvbWJpbmVkIHRhZ0JpdHMKIAkgKiBmb3IgcmVjb2duaXplZCBzdGFuZGFyZCBhbm5vdGF0aW9ucwogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlQW5ub3RhdGlvbnMoQmxvY2tTY29wZSBzY29wZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBCaW5kaW5nIHJlY2lwaWVudCkgewotCQlBbm5vdGF0aW9uQmluZGluZ1tdIGluc3RhbmNlcyA9IG51bGw7Ci0JCWludCBsZW5ndGggPSBhbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGFubm90YXRpb25zLmxlbmd0aDsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUFubm90YXRpb25zKEJsb2NrU2NvcGUgc2NvcGUsIEFubm90YXRpb25bXSBzb3VyY2VBbm5vdGF0aW9ucywgQmluZGluZyByZWNpcGllbnQpIHsKKwkJQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9ucyA9IG51bGw7CisJCWludCBsZW5ndGggPSBzb3VyY2VBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IHNvdXJjZUFubm90YXRpb25zLmxlbmd0aDsKIAkJaWYgKHJlY2lwaWVudCAhPSBudWxsKSB7CiAJCQlzd2l0Y2ggKHJlY2lwaWVudC5raW5kKCkpIHsKIAkJCQljYXNlIEJpbmRpbmcuUEFDS0FHRSA6CkBAIC01MjMsOCArNTczLDggQEAKIAkJCQkJaWYgKCh0eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCkgIT0gMCkgcmV0dXJuOwogCQkJCQl0eXBlLnRhZ0JpdHMgfD0gKFRhZ0JpdHMuQW5ub3RhdGlvblJlc29sdmVkIHwgVGFnQml0cy5EZXByZWNhdGVkQW5ub3RhdGlvblJlc29sdmVkKTsKIAkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWluc3RhbmNlcyA9IG5ldyBBbm5vdGF0aW9uQmluZGluZ1tsZW5ndGhdOwotCQkJCQkJdHlwZS5zZXRBbm5vdGF0aW9ucyhpbnN0YW5jZXMpOworCQkJCQkJYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKKwkJCQkJCXR5cGUuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQmluZGluZy5NRVRIT0QgOgpAQCAtNTMyLDggKzU4Miw4IEBACiAJCQkJCWlmICgobWV0aG9kLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCkgIT0gMCkgcmV0dXJuOwogCQkJCQltZXRob2QudGFnQml0cyB8PSAoVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQgfCBUYWdCaXRzLkRlcHJlY2F0ZWRBbm5vdGF0aW9uUmVzb2x2ZWQpOwogCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJaW5zdGFuY2VzID0gbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07Ci0JCQkJCQltZXRob2Quc2V0QW5ub3RhdGlvbnMoaW5zdGFuY2VzKTsKKwkJCQkJCWFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07CisJCQkJCQltZXRob2Quc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQmluZGluZy5GSUVMRCA6CkBAIC01NDEsOCArNTkxLDggQEAKIAkJCQkJaWYgKChmaWVsZC50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQpICE9IDApIHJldHVybjsKIAkJCQkJZmllbGQudGFnQml0cyB8PSAoVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQgfCBUYWdCaXRzLkRlcHJlY2F0ZWRBbm5vdGF0aW9uUmVzb2x2ZWQpOwogCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJaW5zdGFuY2VzID0gbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07Ci0JCQkJCQlmaWVsZC5zZXRBbm5vdGF0aW9ucyhpbnN0YW5jZXMpOworCQkJCQkJYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKKwkJCQkJCWZpZWxkLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIEJpbmRpbmcuTE9DQUwgOgpAQCAtNTUwLDE5ICs2MDAsMTggQEAKIAkJCQkJaWYgKChsb2NhbC50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQpICE9IDApIHJldHVybjsKIAkJCQkJbG9jYWwudGFnQml0cyB8PSAoVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQgfCBUYWdCaXRzLkRlcHJlY2F0ZWRBbm5vdGF0aW9uUmVzb2x2ZWQpOwogCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJaW5zdGFuY2VzID0gbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07Ci0JCQkJCQlsb2NhbC5zZXRBbm5vdGF0aW9ucyhpbnN0YW5jZXMpOworCQkJCQkJYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKKwkJCQkJCWxvY2FsLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJcmV0dXJuOwogCQkJfQogCQl9Ci0JCWlmIChhbm5vdGF0aW9ucyA9PSBudWxsKQorCQlpZiAoc291cmNlQW5ub3RhdGlvbnMgPT0gbnVsbCkKIAkJCXJldHVybjsKLQkJVHlwZUJpbmRpbmdbXSBhbm5vdGF0aW9uVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07CisJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBzb3VyY2VBbm5vdGF0aW9uc1tpXTsKIAkJCWZpbmFsIEJpbmRpbmcgYW5ub3RhdGlvblJlY2lwaWVudCA9IGFubm90YXRpb24ucmVjaXBpZW50OwogCQkJaWYgKGFubm90YXRpb25SZWNpcGllbnQgIT0gbnVsbCAmJiByZWNpcGllbnQgIT0gbnVsbCkgewogCQkJCS8vIG9ubHkgbG9jYWwgYW5kIGZpZWxkIGNhbiBzaGFyZSBhbm5ub3RhdGlvbnMKQEAgLTU3MCw0NCArNjE5LDgzIEBACiAJCQkJCWNhc2UgQmluZGluZy5GSUVMRCA6CiAJCQkJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSAoRmllbGRCaW5kaW5nKSByZWNpcGllbnQ7CiAJCQkJCQlmaWVsZC50YWdCaXRzID0gKChGaWVsZEJpbmRpbmcpIGFubm90YXRpb25SZWNpcGllbnQpLnRhZ0JpdHM7CisJCQkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJCS8vIG5lZWQgdG8gZmlsbCB0aGUgaW5zdGFuY2VzIGFycmF5CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJCQlBbm5vdGF0aW9uIGFubm90ID0gc291cmNlQW5ub3RhdGlvbnNbal07CisJCQkJCQkJCWFubm90YXRpb25zW2pdID0gYW5ub3QuZ2V0Q29tcGlsZXJBbm5vdGF0aW9uKCk7CisJCQkJCQkJfQorCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgQmluZGluZy5MT0NBTCA6CiAJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgcmVjaXBpZW50OwotCQkJCQkJbG9jYWwudGFnQml0cyA9ICgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGFubm90YXRpb25SZWNpcGllbnQpLnRhZ0JpdHM7CisJCQkJCQlsb25nIG90aGVyTG9jYWxUYWdCaXRzID0gKChMb2NhbFZhcmlhYmxlQmluZGluZykgYW5ub3RhdGlvblJlY2lwaWVudCkudGFnQml0czsKKwkJCQkJCWxvY2FsLnRhZ0JpdHMgPSBvdGhlckxvY2FsVGFnQml0czsKKwkJCQkJCWlmICgob3RoZXJMb2NhbFRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25TdXBwcmVzc1dhcm5pbmdzKSA9PSAwKSB7CisJCQkJCQkJLy8gTm9uZSBvZiB0aGUgYW5ub3RhdGlvbnMgaXMgYSBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24KKwkJCQkJCQkvLyBuZWVkIHRvIGZpbGwgdGhlIGluc3RhbmNlcyBhcnJheQorCQkJCQkJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkJCUFubm90YXRpb24gYW5ub3QgPSBzb3VyY2VBbm5vdGF0aW9uc1tqXTsKKwkJCQkJCQkJCWFubm90YXRpb25zW2pdID0gYW5ub3QuZ2V0Q29tcGlsZXJBbm5vdGF0aW9uKCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQkJCQkvLyBPbmUgb2YgdGhlIGFubm90YXRpb25zIGF0IGxlYXN0IGlzIGEgU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uCisJCQkJCQkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gbG9jYWwuZGVjbGFyYXRpb247CisJCQkJCQkJaW50IGRlY2xhcmF0aW9uU291cmNlRW5kID0gbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCQkJCQlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQkJCUFubm90YXRpb24gYW5ub3QgPSBzb3VyY2VBbm5vdGF0aW9uc1tqXTsKKwkJCQkJCQkJLyoKKwkJCQkJCQkJICogQW5ub3RhdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuIHR3byBsb2NhbHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHJlY29yZAorCQkJCQkJCQkgKiB0aGUgc3VwcHJlc3MgYW5ub3RhdGlvbiByYW5nZSBmb3IgdGhlIHNlY29uZCBsb2NhbAorCQkJCQkJCQkgKi8KKwkJCQkJCQkJQW5ub3RhdGlvbkJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBhbm5vdC5nZXRDb21waWxlckFubm90YXRpb24oKTsKKwkJCQkJCQkJYW5ub3RhdGlvbnNbal0gPSBhbm5vdGF0aW9uQmluZGluZzsKKwkJCQkJCQkJaWYgKGFubm90YXRpb25CaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSBhbm5vdGF0aW9uQmluZGluZy5nZXRBbm5vdGF0aW9uVHlwZSgpOworCQkJCQkJCQkJaWYgKGFubm90YXRpb25UeXBlICE9IG51bGwgJiYgYW5ub3RhdGlvblR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nU3VwcHJlc3NXYXJuaW5ncykgeworCQkJCQkJCQkJCWFubm90LnJlY29yZFN1cHByZXNzV2FybmluZ3Moc2NvcGUsIGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGRlY2xhcmF0aW9uU291cmNlRW5kLCBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zdXBwcmVzc1dhcm5pbmdzKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlpZiAoaW5zdGFuY2VzICE9IG51bGwpIHsKLQkJCQkJLy8gbmVlZCB0byBmaWxsIHRoZSBpbnN0YW5jZXMgYXJyYXkKLQkJCQkJaW5zdGFuY2VzWzBdID0gYW5ub3RhdGlvbi5nZXRDb21waWxlckFubm90YXRpb24oKTsKLQkJCQkJZm9yIChpbnQgaiA9IDE7IGogPCBsZW5ndGg7IGorKykgewotCQkJCQkJQW5ub3RhdGlvbiBhbm5vdCA9IGFubm90YXRpb25zW2pdOwotCQkJCQkJaW5zdGFuY2VzW2pdID0gYW5ub3QuZ2V0Q29tcGlsZXJBbm5vdGF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfSBlbHNlIHsKIAkJCQlhbm5vdGF0aW9uLnJlY2lwaWVudCA9IHJlY2lwaWVudDsKLQkJCQlhbm5vdGF0aW9uVHlwZXNbaV0gPSBhbm5vdGF0aW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCQlhbm5vdGF0aW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKIAkJCQkvLyBudWxsIGlmIHJlY2VpdmVyIGlzIGEgcGFja2FnZSBiaW5kaW5nCi0JCQkJaWYgKGluc3RhbmNlcyAhPSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlc1tpXSA9IGFubm90YXRpb24uZ2V0Q29tcGlsZXJBbm5vdGF0aW9uKCk7CisJCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQkJYW5ub3RhdGlvbnNbaV0gPSBhbm5vdGF0aW9uLmdldENvbXBpbGVyQW5ub3RhdGlvbigpOwogCQkJCX0KIAkJCX0KIAkJfQogCQkvLyBjaGVjayBkdXBsaWNhdGUgYW5ub3RhdGlvbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJVHlwZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSBhbm5vdGF0aW9uVHlwZXNbaV07Ci0JCQlpZiAoYW5ub3RhdGlvblR5cGUgPT0gbnVsbCkgY29udGludWU7Ci0JCQlib29sZWFuIGZvdW5kRHVwbGljYXRlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gaSsxOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoYW5ub3RhdGlvblR5cGVzW2pdID09IGFubm90YXRpb25UeXBlKSB7Ci0JCQkJCWZvdW5kRHVwbGljYXRlID0gdHJ1ZTsKLQkJCQkJYW5ub3RhdGlvblR5cGVzW2pdID0gbnVsbDsgLy8gcmVwb3J0IGl0IG9ubHkgb25jZQotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVBbm5vdGF0aW9uKGFubm90YXRpb25zW2pdKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCUFubm90YXRpb25CaW5kaW5nW10gZGlzdGluY3RBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOyAvLyBvbmx5IGNvcHkgYWZ0ZXIgMXN0IGR1cGxpY2F0ZSBpcyBkZXRlY3RlZAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb24gPSBkaXN0aW5jdEFubm90YXRpb25zW2ldOworCQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIGNvbnRpbnVlOworCQkJCVR5cGVCaW5kaW5nIGFubm90YXRpb25UeXBlID0gYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uVHlwZSgpOworCQkJCWJvb2xlYW4gZm91bmREdXBsaWNhdGUgPSBmYWxzZTsKKwkJCQlmb3IgKGludCBqID0gaSsxOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJQW5ub3RhdGlvbkJpbmRpbmcgb3RoZXJBbm5vdGF0aW9uID0gZGlzdGluY3RBbm5vdGF0aW9uc1tqXTsKKwkJCQkJaWYgKG90aGVyQW5ub3RhdGlvbiA9PSBudWxsKSBjb250aW51ZTsKKwkJCQkJaWYgKG90aGVyQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uVHlwZSgpID09IGFubm90YXRpb25UeXBlKSB7CisJCQkJCQlmb3VuZER1cGxpY2F0ZSA9IHRydWU7CisJCQkJCQlpZiAoZGlzdGluY3RBbm5vdGF0aW9ucyA9PSBhbm5vdGF0aW9ucykgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZGlzdGluY3RBbm5vdGF0aW9ucywgMCwgZGlzdGluY3RBbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uQmluZGluZ1tsZW5ndGhdLCAwLCBsZW5ndGgpOworCQkJCQkJfQorCQkJCQkJZGlzdGluY3RBbm5vdGF0aW9uc1tqXSA9IG51bGw7IC8vIHJlcG9ydCBpdCBvbmx5IG9uY2UKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUFubm90YXRpb24oc291cmNlQW5ub3RhdGlvbnNbal0pOworCQkJCQl9CiAJCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kRHVwbGljYXRlKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uc1tpXSk7CisJCQkJaWYgKGZvdW5kRHVwbGljYXRlKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUFubm90YXRpb24oc291cmNlQW5ub3RhdGlvbnNbaV0pOworCQkJCX0KIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKaW5kZXggMWE2MjQwYi4uMjI4ZTZlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTMgKzIwLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCiAJZXh0ZW5kcyBBU1ROb2RlCiAJaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgUmVmZXJlbmNlQ29udGV4dCB7Ci0JCQorCiAJcHVibGljIE1ldGhvZFNjb3BlIHNjb3BlOwotCS8vaXQgaXMgbm90IHJlbGV2ZW50IGZvciBjb25zdHJ1Y3RvciBidXQgaXQgaGVscHMgdG8gaGF2ZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IgaGVyZSAKKwkvL2l0IGlzIG5vdCByZWxldmVudCBmb3IgY29uc3RydWN0b3IgYnV0IGl0IGhlbHBzIHRvIGhhdmUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIGhlcmUKIAkvL3doaWNoIGlzIGFsd2F5cyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuLi4uLnBhcnNpbmcgZG8gZXh0cmEgd29yayB0byBmaWxsIGl0IHVwIHdoaWxlIGl0IGRvIG5vdCBoYXZlIHRvLi4uLgogCXB1YmxpYyBjaGFyW10gc2VsZWN0b3I7CiAJcHVibGljIGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwpAQCAtNDAsMTcgKzQxLDE3IEBACiAJcHVibGljIGludCBleHBsaWNpdERlY2xhcmF0aW9uczsKIAlwdWJsaWMgTWV0aG9kQmluZGluZyBiaW5kaW5nOwogCXB1YmxpYyBib29sZWFuIGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gZmFsc2U7Ci0JCisKIAlwdWJsaWMgSmF2YWRvYyBqYXZhZG9jOwotCQorCiAJcHVibGljIGludCBib2R5U3RhcnQ7CiAJcHVibGljIGludCBib2R5RW5kID0gLTE7CiAJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OwotCQorCiAJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CiAJCXRoaXMuY29tcGlsYXRpb25SZXN1bHQgPSBjb21waWxhdGlvblJlc3VsdDsKIAl9Ci0JCisKIAkvKgogCSAqCVdlIGNhdXNlIHRoZSBjb21waWxhdGlvbiB0YXNrIHRvIGFib3J0IHRvIGEgZ2l2ZW4gZXh0ZW50LgogCSAqLwpAQCAtODksMTAgKzkwLDE1IEBACiAJCQkJQXJndW1lbnQgYXJndW1lbnQgPSB0aGlzLmFyZ3VtZW50c1tpXTsKIAkJCQlhcmd1bWVudC5iaW5kKHRoaXMuc2NvcGUsIHRoaXMuYmluZGluZy5wYXJhbWV0ZXJzW2ldLCB1c2VkKTsKIAkJCQlpZiAoYXJndW1lbnQuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJCQl0aGlzLmJpbmRpbmcudGFnQml0cyB8PSBUYWdCaXRzLkhhc1BhcmFtZXRlckFubm90YXRpb25zOwotCQkJCQlpZiAocGFyYW1Bbm5vdGF0aW9ucyA9PSBudWxsKQorCQkJCQlpZiAocGFyYW1Bbm5vdGF0aW9ucyA9PSBudWxsKSB7CiAJCQkJCQlwYXJhbUFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF1bXTsKKwkJCQkJCWZvciAoaW50IGo9MDsgajxpOyBqKyspIHsKKwkJCQkJCQlwYXJhbUFubm90YXRpb25zW2pdID0gQmluZGluZy5OT19BTk5PVEFUSU9OUzsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCQlwYXJhbUFubm90YXRpb25zW2ldID0gYXJndW1lbnQuYmluZGluZy5nZXRBbm5vdGF0aW9ucygpOworCQkJCX0gZWxzZSBpZiAocGFyYW1Bbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkJCXBhcmFtQW5ub3RhdGlvbnNbaV0gPSBCaW5kaW5nLk5PX0FOTk9UQVRJT05TOwogCQkJCX0KIAkJCX0KIAkJCWlmIChwYXJhbUFubm90YXRpb25zICE9IG51bGwpCkBAIC0xNDIsMTcgKzE0OCwxNyBAQAogCX0KIAogCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCgpIHsKLQkJCisKIAkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25SZXN1bHQ7CiAJfQotCQorCiAJLyoqCiAJICogQnl0ZWNvZGUgZ2VuZXJhdGlvbiBmb3IgYSBtZXRob2QKIAkgKiBAcGFyYW0gY2xhc3NTY29wZQogCSAqIEBwYXJhbSBjbGFzc0ZpbGUKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlLCBDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7Ci0JCQorCiAJCWludCBwcm9ibGVtUmVzZXRQQyA9IDA7CiAJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLndpZGVNb2RlID0gZmFsc2U7IC8vIHJlc2V0IHdpZGVNb2RlIHRvIGZhbHNlCiAJCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7CkBAIC0xNjcsMzYgKzE3Myw0OCBAQAogCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1NZXRob2QodGhpcywgdGhpcy5iaW5kaW5nLCBwcm9ibGVtc0NvcHkpOwogCQkJcmV0dXJuOwogCQl9CisJCWJvb2xlYW4gcmVzdGFydCA9IGZhbHNlOworCQlib29sZWFuIGFib3J0ID0gZmFsc2U7CiAJCS8vIHJlZ3VsYXIgY29kZSBnZW5lcmF0aW9uCi0JCXRyeSB7Ci0JCQlwcm9ibGVtUmVzZXRQQyA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKLQkJCXRoaXMuZ2VuZXJhdGVDb2RlKGNsYXNzRmlsZSk7Ci0JCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsKLQkJCS8vIGEgZmF0YWwgZXJyb3Igd2FzIGRldGVjdGVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24sIG5lZWQgdG8gcmVzdGFydCBjb2RlIGdlbiBpZiBwb3NzaWJsZQotCQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgewotCQkJCS8vIGEgYnJhbmNoIHRhcmdldCByZXF1aXJlZCBhIGdvdG9fdywgcmVzdGFydCBjb2RlIGdlbiBpbiB3aWRlIG1vZGUuCi0JCQkJdHJ5IHsKKwkJZG8geworCQkJdHJ5IHsKKwkJCQlwcm9ibGVtUmVzZXRQQyA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwkJCQl0aGlzLmdlbmVyYXRlQ29kZShjbGFzc0ZpbGUpOworCQkJCXJlc3RhcnQgPSBmYWxzZTsKKwkJCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsKKwkJCQkvLyBhIGZhdGFsIGVycm9yIHdhcyBkZXRlY3RlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBuZWVkIHRvIHJlc3RhcnQgY29kZSBnZW4gaWYgcG9zc2libGUKKwkJCQlpZiAoZS5jb21waWxhdGlvblJlc3VsdCA9PSBDb2RlU3RyZWFtLlJFU1RBUlRfSU5fV0lERV9NT0RFKSB7CisJCQkJCS8vIGEgYnJhbmNoIHRhcmdldCByZXF1aXJlZCBhIGdvdG9fdywgcmVzdGFydCBjb2RlIGdlbiBpbiB3aWRlIG1vZGUuCisJCQkJCWlmICghcmVzdGFydCkgeworCQkJCQkJY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0ID0gcHJvYmxlbVJlc2V0UEM7CisJCQkJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKKwkJCQkJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLnJlc2V0SW5XaWRlTW9kZSgpOyAvLyByZXF1ZXN0IHdpZGUgbW9kZQorCQkJCQkJcmVzdGFydCA9IHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBhZnRlciByZXN0YXJ0aW5nIGluIHdpZGUgbW9kZSwgY29kZSBnZW5lcmF0aW9uIGZhaWxlZCBhZ2FpbgorCQkJCQkJLy8gcmVwb3J0IGEgcHJvYmxlbQorCQkJCQkJcmVzdGFydCA9IGZhbHNlOworCQkJCQkJYWJvcnQgPSB0cnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChlLmNvbXBpbGF0aW9uUmVzdWx0ID09IENvZGVTdHJlYW0uUkVTVEFSVF9DT0RFX0dFTl9GT1JfVU5VU0VEX0xPQ0FMU19NT0RFKSB7CiAJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IHByb2JsZW1SZXNldFBDOwogCQkJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKLQkJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ud2lkZU1vZGUgPSB0cnVlOyAvLyByZXF1ZXN0IHdpZGUgbW9kZSAKLQkJCQkJdGhpcy5nZW5lcmF0ZUNvZGUoY2xhc3NGaWxlKTsgLy8gcmVzdGFydCBtZXRob2QgZ2VuZXJhdGlvbgotCQkJCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUyKSB7Ci0JCQkJCWludCBwcm9ibGVtc0xlbmd0aDsKLQkJCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPQotCQkJCQkJdGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpOwotCQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgcHJvYmxlbXNDb3B5LCAwLCBwcm9ibGVtc0xlbmd0aCk7Ci0JCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZywgcHJvYmxlbXNDb3B5LCBwcm9ibGVtUmVzZXRQQyk7CisJCQkJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLnJlc2V0Rm9yQ29kZUdlblVudXNlZExvY2FscygpOworCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN0YXJ0ID0gZmFsc2U7CisJCQkJCWFib3J0ID0gdHJ1ZTsgCiAJCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBwcm9kdWNlIGEgcHJvYmxlbSBtZXRob2QgYWNjb3VudGluZyBmb3IgdGhpcyBmYXRhbCBlcnJvcgotCQkJCWludCBwcm9ibGVtc0xlbmd0aDsKLQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcyA9Ci0JCQkJCXRoaXMuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0QWxsUHJvYmxlbXMoKTsKLQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKLQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbU1ldGhvZCh0aGlzLCB0aGlzLmJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOwogCQkJfQorCQl9IHdoaWxlIChyZXN0YXJ0KTsKKwkJLy8gcHJvZHVjZSBhIHByb2JsZW0gbWV0aG9kIGFjY291bnRpbmcgZm9yIHRoaXMgZmF0YWwgZXJyb3IKKwkJaWYgKGFib3J0KSB7CisJCQlpbnQgcHJvYmxlbXNMZW5ndGg7CisJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcyA9CisJCQkJdGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpOworCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVtwcm9ibGVtc0xlbmd0aCA9IHByb2JsZW1zLmxlbmd0aF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKKwkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZywgcHJvYmxlbXNDb3B5LCBwcm9ibGVtUmVzZXRQQyk7CiAJCX0KIAl9CiAKQEAgLTIwNCw3ICsyMjIsNyBAQAogCiAJCWNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIodGhpcy5iaW5kaW5nKTsKIAkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKLQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUodGhpcy5iaW5kaW5nKTsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKHRoaXMuYmluZGluZyk7CiAJCWlmICgoIXRoaXMuYmluZGluZy5pc05hdGl2ZSgpKSAmJiAoIXRoaXMuYmluZGluZy5pc0Fic3RyYWN0KCkpKSB7CiAJCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKIAkJCWNsYXNzRmlsZS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKQEAgLTIyNSw0MSArMjQzLDQ3IEBACiAJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykKIAkJCQkJdGhpcy5zdGF0ZW1lbnRzW2ldLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KKwkJCS8vIGlmIGEgcHJvYmxlbSBnb3QgcmVwb3J0ZWQgZHVyaW5nIGNvZGUgZ2VuLCB0aGVuIHRyaWdnZXIgcHJvYmxlbSBtZXRob2QgY3JlYXRpb24KKwkJCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7CisJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHRoaXMuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQsIG51bGwpOworCQkJfQogCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLk5lZWRGcmVlUmV0dXJuKSAhPSAwKSB7CiAJCQkJY29kZVN0cmVhbS5yZXR1cm5fKCk7CiAJCQl9CiAJCQkvLyBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCiAJCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUodGhpcy5zY29wZSk7CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oMCwgdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQljbGFzc0ZpbGUuY29tcGxldGVDb2RlQXR0cmlidXRlKGNvZGVBdHRyaWJ1dGVPZmZzZXQpOworCQkJdHJ5IHsKKwkJCQljbGFzc0ZpbGUuY29tcGxldGVDb2RlQXR0cmlidXRlKGNvZGVBdHRyaWJ1dGVPZmZzZXQpOworCQkJfSBjYXRjaChOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHRoaXMuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQsIG51bGwpOworCQkJfQogCQkJYXR0cmlidXRlTnVtYmVyKys7CiAJCX0gZWxzZSB7CiAJCQljaGVja0FyZ3VtZW50c1NpemUoKTsKIAkJfQotCQljbGFzc0ZpbGUuY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKLQotCQkvLyBpZiBhIHByb2JsZW0gZ290IHJlcG9ydGVkIGR1cmluZyBjb2RlIGdlbiwgdGhlbiB0cmlnZ2VyIHByb2JsZW0gbWV0aG9kIGNyZWF0aW9uCi0JCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QodGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCwgbnVsbCk7Ci0JCX0KKwkJY2xhc3NGaWxlLmNvbXBsZXRlTWV0aG9kSW5mbyh0aGlzLmJpbmRpbmcsIG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgY2hlY2tBcmd1bWVudHNTaXplKCkgewogCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSB0aGlzLmJpbmRpbmcucGFyYW1ldGVyczsKLQkJaW50IHNpemUgPSAxOyAvLyBhbiBhYnN0YWN0IG1ldGhvZCBvciBhIG5hdGl2ZSBtZXRob2QgY2Fubm90IGJlIHN0YXRpYworCQlpbnQgc2l6ZSA9IDE7IC8vIGFuIGFic3RyYWN0IG1ldGhvZCBvciBhIG5hdGl2ZSBtZXRob2QgY2Fubm90IGJlIHN0YXRpYwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKLQkJCWlmIChwYXJhbWV0ZXIgPT0gVHlwZUJpbmRpbmcuTE9ORyB8fCBwYXJhbWV0ZXIgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSB7Ci0JCQkJc2l6ZSArPSAyOwotCQkJfSBlbHNlIHsKLQkJCQlzaXplKys7CisJCQlzd2l0Y2gocGFyYW1ldGVyc1tpXS5pZCkgeworCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCXNpemUgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCXNpemUrKzsKKwkJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoc2l6ZSA+IDB4RkYpIHsKIAkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yQXJndW1lbnQodGhpcy5zY29wZS5sb2NhbHNbaV0sIHRoaXMuc2NvcGUubG9jYWxzW2ldLmRlY2xhcmF0aW9uKTsKIAkJCX0KIAkJfQogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKIAkJcmV0dXJuIHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb247CiAJfQpAQCAtMjc1LDcgKzI5OSw3IEBACiAKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgewogCiAJCXJldHVybiBmYWxzZTsKQEAgLTMyMCw5ICszNDQsNyBAQAogCSAqIEBwYXJhbSBwYXJzZXIKIAkgKiBAcGFyYW0gdW5pdAogCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBhcnNlU3RhdGVtZW50cygKLQkJUGFyc2VyIHBhcnNlciwKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCk7CisJcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2VTdGF0ZW1lbnRzKFBhcnNlciBwYXJzZXIsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpOwogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKQEAgLTMzMiw3ICszNTQsNyBAQAogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCk7CiAJCXByaW50TW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBvdXRwdXQpOwogCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSBwcmludEFubm90YXRpb25zKHRoaXMuYW5ub3RhdGlvbnMsIG91dHB1dCk7Ci0JCQorCiAJCVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1zID0gdHlwZVBhcmFtZXRlcnMoKTsKIAkJaWYgKHR5cGVQYXJhbXMgIT0gbnVsbCkgewogCQkJb3V0cHV0LmFwcGVuZCgnPCcpOwpAQCAtMzQ0LDcgKzM2Niw3IEBACiAJCQl0eXBlUGFyYW1zW21heF0ucHJpbnQoMCwgb3V0cHV0KTsKIAkJCW91dHB1dC5hcHBlbmQoJz4nKTsKIAkJfQotCQkKKwogCQlwcmludFJldHVyblR5cGUoMCwgb3V0cHV0KS5hcHBlbmQodGhpcy5zZWxlY3RvcikuYXBwZW5kKCcoJyk7CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CkBAIC0zNjYsMTQgKzM4OCwxNCBAQAogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEJvZHkoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCi0JCWlmIChpc0Fic3RyYWN0KCkgfHwgKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5KSAhPSAwKSAKKwkJaWYgKGlzQWJzdHJhY3QoKSB8fCAodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1NlbWljb2xvbkJvZHkpICE9IDApCiAJCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnOycpOwogCiAJCW91dHB1dC5hcHBlbmQoIiB7Iik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgewogCQkJCW91dHB1dC5hcHBlbmQoJ1xuJyk7Ci0JCQkJdGhpcy5zdGF0ZW1lbnRzW2ldLnByaW50U3RhdGVtZW50KGluZGVudCwgb3V0cHV0KTsgCisJCQkJdGhpcy5zdGF0ZW1lbnRzW2ldLnByaW50U3RhdGVtZW50KGluZGVudCwgb3V0cHV0KTsKIAkJCX0KIAkJfQogCQlvdXRwdXQuYXBwZW5kKCdcbicpOwpAQCAtMzgyLDcgKzQwNCw3IEBACiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFJldHVyblR5cGUoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQkKKwogCQlyZXR1cm4gb3V0cHV0OwogCX0KIApAQCAtMzkzLDEwICs0MTUsMTAgQEAKIAkJfQogCiAJCXRyeSB7Ci0JCQliaW5kQXJndW1lbnRzKCk7IAorCQkJYmluZEFyZ3VtZW50cygpOwogCQkJYmluZFRocm93bkV4Y2VwdGlvbnMoKTsKIAkJCXJlc29sdmVKYXZhZG9jKCk7Ci0JCQlyZXNvbHZlQW5ub3RhdGlvbnMoc2NvcGUsIHRoaXMuYW5ub3RhdGlvbnMsIHRoaXMuYmluZGluZyk7CisJCQlyZXNvbHZlQW5ub3RhdGlvbnModGhpcy5zY29wZSwgdGhpcy5hbm5vdGF0aW9ucywgdGhpcy5iaW5kaW5nKTsKIAkJCXJlc29sdmVTdGF0ZW1lbnRzKCk7CiAJCQkvLyBjaGVjayBARGVwcmVjYXRlZCBhbm5vdGF0aW9uIHByZXNlbmNlCiAJCQlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwKQEAgLTQwNCwyMSArNDI2LDMzIEBACiAJCQkJCSYmICh0aGlzLmJpbmRpbmcubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDAKIAkJCQkJJiYgdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb25Gb3JNZXRob2QodGhpcyk7Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsJLy8gPT09PT09PT09IGFib3J0IG9uIGZhdGFsIGVycm9yID09PT09PT09PT09PT0KKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJLy8gPT09PT09PT09IGFib3J0IG9uIGZhdGFsIGVycm9yID09PT09PT09PT09PT0KIAkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOwotCQl9IAorCQl9CiAJfQogCiAJcHVibGljIHZvaWQgcmVzb2x2ZUphdmFkb2MoKSB7Ci0JCQorCiAJCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuOwogCQlpZiAodGhpcy5qYXZhZG9jICE9IG51bGwpIHsKIAkJCXRoaXMuamF2YWRvYy5yZXNvbHZlKHRoaXMuc2NvcGUpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAmJiAhdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTG9jYWxUeXBlKCkpIHsKLQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY01pc3NpbmcodGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQsIHRoaXMuYmluZGluZy5tb2RpZmllcnMpOworCQkJLy8gU2V0IGphdmFkb2MgdmlzaWJpbGl0eQorCQkJaW50IGphdmFkb2NWaXNpYmlsaXR5ID0gdGhpcy5iaW5kaW5nLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0s7CisJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSB0aGlzLnNjb3BlLmNsYXNzU2NvcGUoKTsKKwkJCVByb2JsZW1SZXBvcnRlciByZXBvcnRlciA9IHRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7CisJCQlpbnQgc2V2ZXJpdHkgPSByZXBvcnRlci5jb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY01pc3NpbmcpOworCQkJaWYgKHNldmVyaXR5ICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgeworCQkJCWlmIChjbGFzc1Njb3BlICE9IG51bGwpIHsKKwkJCQkJamF2YWRvY1Zpc2liaWxpdHkgPSBVdGlsLmNvbXB1dGVPdXRlck1vc3RWaXNpYmlsaXR5KGNsYXNzU2NvcGUucmVmZXJlbmNlVHlwZSgpLCBqYXZhZG9jVmlzaWJpbGl0eSk7CisJCQkJfQorCQkJCWludCBqYXZhZG9jTW9kaWZpZXJzID0gKHRoaXMuYmluZGluZy5tb2RpZmllcnMgJiB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NWaXNpYmlsaXR5TUFTSykgfCBqYXZhZG9jVmlzaWJpbGl0eTsKKwkJCQlyZXBvcnRlci5qYXZhZG9jTWlzc2luZyh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgc2V2ZXJpdHksIGphdmFkb2NNb2RpZmllcnMpOworCQkJfQogCQl9CiAJfQogCkBAIC00MjksMTIgKzQ2MywxMyBAQAogCQkJCXRoaXMuc3RhdGVtZW50c1tpXS5yZXNvbHZlKHRoaXMuc2NvcGUpOwogCQkJfQogCQl9IGVsc2UgaWYgKCh0aGlzLmJpdHMgJiBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrKSAhPSAwKSB7Ci0JCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2sodGhpcy5ib2R5U3RhcnQtMSwgdGhpcy5ib2R5RW5kKzEpOworCQkJaWYgKCF0aGlzLmlzQ29uc3RydWN0b3IoKSB8fCB0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk2MjYKKwkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2sodGhpcy5ib2R5U3RhcnQtMSwgdGhpcy5ib2R5RW5kKzEpOworCQkJfQogCQl9CiAJfQogCiAJcHVibGljIHZvaWQgdGFnQXNIYXZpbmdFcnJvcnMoKSB7Ci0KIAkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJfQogCkBAIC00NDMsNyArNDc4LDcgQEAKIAkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IHN1YmNsYXNzIHdpbGwgZGVmaW5lIGl0CiAJfQotCQorCiAJcHVibGljIFR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycygpIHsKIAkgICAgcmV0dXJuIG51bGw7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKaW5kZXggZWJjM2YzMC4uYWI2NmQzOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDYgKzE5LDExIEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBJbnZvY2F0aW9uU2l0ZSB7CiAJcHVibGljIGludCBkZWNsYXJhdGlvbkVuZDsKKwkvKioKKwkgKiBGb3IgbG9jYWwgZGVjbGFyYXRpb25zIChvdXRzaWRlIG9mIGZvciBzdGF0ZW1lbnQgaW5pdGlhbGl6YXRpb24pIGFuZCBmaWVsZCBkZWNsYXJhdGlvbnMsCisJICogdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIGNvdmVycyBtdWx0aXBsZSBsb2NhbHMgaWYgYW55LgorCSAqIEZvciBsb2NhbCBkZWNsYXJhdGlvbnMgaW5zaWRlIGZvciBzdGF0ZW1lbnQgaW5pdGlhbGl6YXRpb24sIHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCSAqLwogCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiAJcHVibGljIGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCXB1YmxpYyBpbnQgaGlkZGVuVmFyaWFibGVEZXB0aDsgLy8gdXNlZCB0byBkaWFnbm9zZSBoaWRpbmcgc2NlbmFyaWkKQEAgLTMwLDMxICszNSwzMSBAQAogCXB1YmxpYyBjaGFyW10gbmFtZTsKIAogCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHR5cGU7Ci0JCisKIAlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCQlyZXR1cm4gZmxvd0luZm87CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWkVSID0gMjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNX0NPTlNUQU5UID0gMzsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9WQVJJQUJMRSA9IDQ7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1FVEVSID0gNTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BBUkFNRVRFUiA9IDY7Ci0JCi0JCisKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbnN0YW50IGtpbmQgb2YgdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0S2luZCgpOwotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNpc1N1cGVyQWNjZXNzKCkKIAkgKi8KQEAgLTc4LDI2ICs4MywyNiBAQAogCQkJCXJldHVybiBvdXRwdXQuYXBwZW5kKCc7Jyk7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50QXNFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOwogCQlwcmludE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgb3V0cHV0KTsKIAkJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgcHJpbnRBbm5vdGF0aW9ucyh0aGlzLmFubm90YXRpb25zLCBvdXRwdXQpOwotCQkKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJdHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOworCisJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy50eXBlLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCcgJyk7CiAJCX0KLQkJb3V0cHV0LmFwcGVuZCh0aGlzLm5hbWUpOyAKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLm5hbWUpOwogCQlzd2l0Y2goZ2V0S2luZCgpKSB7CiAJCQljYXNlIEVOVU1fQ09OU1RBTlQ6Ci0JCQkJaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KTsKKwkJCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24ucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewogCQkJCQlvdXRwdXQuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbml0aWFsaXphdGlvbi5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOworCQkJCQl0aGlzLmluaXRpYWxpemF0aW9uLnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7CiAJCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggZTYwM2E4NS4uMjUxOWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSw0OSArMSw2MyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbnMgZm9yIAorICogICAgIAkJCQkJCWJ1ZyAyMzYzODUgLSBbY29tcGlsZXJdIFdhcm4gZm9yIHBvdGVudGlhbCBwcm9ncmFtbWluZyBwcm9ibGVtIGlmIGFuIG9iamVjdCBpcyBjcmVhdGVkIGJ1dCBub3QgdXNlZAorICogICAgIAkJCQkJCWJ1ZyAzMTkyMDEgLSBbbnVsbF0gbm8gd2FybmluZyB3aGVuIHVuYm94aW5nIFNpbmdsZU5hbWVSZWZlcmVuY2UgY2F1c2VzIE5QRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOwogCiBwdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgSW52b2NhdGlvblNpdGUgewotCQkKKwogCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHR5cGU7CiAJcHVibGljIEV4cHJlc3Npb25bXSBhcmd1bWVudHM7CiAJcHVibGljIE1ldGhvZEJpbmRpbmcgYmluZGluZzsJCQkJCQkJLy8gZXhhY3QgYmluZGluZyByZXN1bHRpbmcgZnJvbSBsb29rdXAKLQlwcm90ZWN0ZWQgTWV0aG9kQmluZGluZyBjb2RlZ2VuQmluZGluZzsJLy8gYWN0dWFsIGJpbmRpbmcgdXNlZCBmb3IgY29kZSBnZW5lcmF0aW9uIChpZiBubyBzeW50aGV0aWMgYWNjZXNzb3IpCiAJTWV0aG9kQmluZGluZyBzeW50aGV0aWNBY2Nlc3NvcjsJCQkJCQkvLyBzeW50aGV0aWMgYWNjZXNzb3IgZm9yIGlubmVyLWVtdWxhdGlvbgotCXB1YmxpYyBUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50czsJCisJcHVibGljIFR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzOwogCXB1YmxpYyBUeXBlQmluZGluZ1tdIGdlbmVyaWNUeXBlQXJndW1lbnRzOwogCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIGVudW1Db25zdGFudDsgLy8gZm9yIGVudW0gY29uc3RhbnQgaW5pdGlhbGl6YXRpb25zCisJcHJvdGVjdGVkIFR5cGVCaW5kaW5nIHR5cGVFeHBlY3RlZDsJICAvLyBmb3IgPD4gaW5mZXJlbmNlCisJcHVibGljIGJvb2xlYW4gaW5mZXJyZWRSZXR1cm5UeXBlOwogCiBwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCS8vIGNoZWNrIGNhcHR1cmVkIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gY3VycmVudCBjb250ZXh0ICgyNjEzNCkKIAljaGVja0NhcHR1cmVkTG9jYWxJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCksIGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwogCiAJLy8gcHJvY2VzcyBhcmd1bWVudHMKLQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQlmbG93SW5mbyA9Ci0JCQkJYXJndW1lbnRzW2ldCisJCQkJdGhpcy5hcmd1bWVudHNbaV0KIAkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlpZiAoKHRoaXMuYXJndW1lbnRzW2ldLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQl0aGlzLmFyZ3VtZW50c1tpXS5jaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQl9CiAJCX0KIAl9CiAJLy8gcmVjb3JkIHNvbWUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgZXhjZXB0aW9uIHR5cGVzCiAJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnM7CiAJaWYgKCgodGhyb3duRXhjZXB0aW9ucyA9IHRoaXMuYmluZGluZy50aHJvd25FeGNlcHRpb25zKS5sZW5ndGgpICE9IDApIHsKKwkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlVuY2hlY2tlZCkgIT0gMCAmJiB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzID09IG51bGwpIHsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMsIGFsaWduIHdpdGggamF2YWMgb24gSkxTIDE1LjEyLjIuNgorCQkJdGhyb3duRXhjZXB0aW9ucyA9IGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGVzKHRoaXMuYmluZGluZy50aHJvd25FeGNlcHRpb25zLCB0cnVlLCB0cnVlKTsKKwkJfQkJCiAJCS8vIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGluZwogCQlmbG93Q29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKAogCQkJdGhyb3duRXhjZXB0aW9ucywKQEAgLTUxLDE5ICs2NSwyMyBAQAogCQkJZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKSwKIAkJCWN1cnJlbnRTY29wZSk7CiAJfQorCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNNZW1iZXJUeXBlKCkgJiYgIXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc1N0YXRpYygpKSB7CisJCS8vIGFsbG9jYXRpbmcgYSBub24tc3RhdGljIG1lbWJlciB0eXBlIHdpdGhvdXQgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHBhcmVudCB0eXBlCisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU4NDUKKwkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCX0KIAltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwogCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwotCQorCiAJcmV0dXJuIGZsb3dJbmZvOwogfQogCiBwdWJsaWMgdm9pZCBjaGVja0NhcHR1cmVkTG9jYWxJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KFJlZmVyZW5jZUJpbmRpbmcgY2hlY2tlZFR5cGUsIEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmIChjaGVja2VkVHlwZS5pc0xvY2FsVHlwZSgpIAotCQkJJiYgIWNoZWNrZWRUeXBlLmlzQW5vbnltb3VzVHlwZSgpCisJaWYgKCgoY2hlY2tlZFR5cGUudGFnQml0cyAmICggVGFnQml0cy5Bbm9ueW1vdXNUeXBlTWFza3xUYWdCaXRzLkxvY2FsVHlwZU1hc2spKSA9PSBUYWdCaXRzLkxvY2FsVHlwZU1hc2spCiAJCQkmJiAhY3VycmVudFNjb3BlLmlzRGVmaW5lZEluVHlwZShjaGVja2VkVHlwZSkpIHsgLy8gb25seSBjaGVjayBleHRlcm5hbCBhbGxvY2F0aW9ucwogCQlOZXN0ZWRUeXBlQmluZGluZyBuZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBjaGVja2VkVHlwZTsKIAkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzID0gbmVzdGVkVHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7Ci0JCWlmIChzeW50aGV0aWNBcmd1bWVudHMgIT0gbnVsbCkgCisJCWlmIChzeW50aGV0aWNBcmd1bWVudHMgIT0gbnVsbCkKIAkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKXsKIAkJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJndW1lbnQgPSBzeW50aGV0aWNBcmd1bWVudHNbaV07CiAJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdGFyZ2V0TG9jYWw7CkBAIC04MCw4ICs5OCwxMiBAQAogfQogCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaWYgKCF2YWx1ZVJlcXVpcmVkKQorCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkT2JqZWN0QWxsb2NhdGlvbih0aGlzKTsKKwogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwlNZXRob2RCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CiAKIAljb2RlU3RyZWFtLm5ld18oYWxsb2NhdGVkVHlwZSk7CiAJYm9vbGVhbiBpc1VuYm94aW5nID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMDsKQEAgLTkzLDggKzExNSw4IEBACiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy50eXBlLnNvdXJjZVN0YXJ0KTsKIAl9IGVsc2UgewogCQkvLyBwdXNoIGVudW0gY29uc3RhbnQgbmFtZSBhbmQgb3JkaW5hbAotCQljb2RlU3RyZWFtLmxkYyhTdHJpbmcudmFsdWVPZihlbnVtQ29uc3RhbnQubmFtZSkpOwotCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGVudW1Db25zdGFudC5iaW5kaW5nLmlkKTsKKwkJY29kZVN0cmVhbS5sZGMoU3RyaW5nLnZhbHVlT2YodGhpcy5lbnVtQ29uc3RhbnQubmFtZSkpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKHRoaXMuZW51bUNvbnN0YW50LmJpbmRpbmcuaWQpOwogCX0KIAogCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbiAtIGVuY2xvc2luZyBpbnN0YW5jZSBhcmd1bWVudHMKQEAgLTEwNiw3ICsxMjgsNyBAQAogCQkJdGhpcyk7CiAJfQogCS8vIGdlbmVyYXRlIHRoZSBhcmd1bWVudHMgZm9yIGNvbnN0cnVjdG9yCi0JZ2VuZXJhdGVBcmd1bWVudHMoYmluZGluZywgYXJndW1lbnRzLCBjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCWdlbmVyYXRlQXJndW1lbnRzKHRoaXMuYmluZGluZywgdGhpcy5hcmd1bWVudHMsIGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJLy8gaGFuZGxpbmcgaW5uZXJjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uIC0gb3V0ZXIgbG9jYWwgYXJndW1lbnRzCiAJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY091dGVyQXJndW1lbnRWYWx1ZXMoCkBAIC0xMTUsMTcgKzEzNywxNyBAQAogCQkJdGhpcyk7CiAJfQogCS8vIGludm9rZSBjb25zdHJ1Y3RvcgotCWlmIChzeW50aGV0aWNBY2Nlc3NvciA9PSBudWxsKSB7Ci0JCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvciA9PSBudWxsKSB7CisJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsIGNvZGVnZW5CaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCX0gZWxzZSB7CiAJCS8vIHN5bnRoZXRpYyBhY2Nlc3NvciBnb3Qgc29tZSBleHRyYSBhcmd1bWVudHMgYXBwZW5kZWQgdG8gaXRzIHNpZ25hdHVyZSwgd2hpY2ggbmVlZCB2YWx1ZXMKIAkJZm9yIChpbnQgaSA9IDAsCi0JCQltYXggPSBzeW50aGV0aWNBY2Nlc3Nvci5wYXJhbWV0ZXJzLmxlbmd0aCAtIHRoaXMuY29kZWdlbkJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CisJCQltYXggPSB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yLnBhcmFtZXRlcnMubGVuZ3RoIC0gY29kZWdlbkJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CiAJCQlpIDwgbWF4OwogCQkJaSsrKSB7CiAJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCX0KLQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKHN5bnRoZXRpY0FjY2Vzc29yKTsKKwkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAl9CiAJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CkBAIC0xNTksNyArMTgxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5IAorLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5CiAgKiBsaW5rIG9ubHksIG9yIHBlcmZvcm1pbmcgb25lIGxldmVsIG9mIHByb3BhZ2F0aW9uLgogICoKICAqIERlcGVuZGVuY3kgbWVjaGFuaXNtIGlzIHVzZWQgd2hlbmV2ZXIgZGVhbGluZyB3aXRoIHNvdXJjZSB0YXJnZXQKQEAgLTE2Nyw4ICsxODksOCBAQAogICogZXhhY3QgbmVlZC4KICAqLwogcHVibGljIHZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgcmV0dXJuOwotCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZUVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkgcmV0dXJuOworCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZUVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKIAogCS8vIHBlcmZvcm0gc29tZSBlbXVsYXRpb24gd29yayBpbiBjYXNlIHRoZXJlIGlzIHNvbWUgYW5kIHdlIGFyZSBpbnNpZGUgYSBsb2NhbCB0eXBlIG9ubHkKIAlpZiAoYWxsb2NhdGVkVHlwZUVyYXN1cmUuaXNOZXN0ZWRUeXBlKCkKQEAgLTE4NiwyMCArMjA4LDIwIEBACiB9CiAKIHB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKSByZXR1cm47CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkgcmV0dXJuOwogCS8vIGlmIGNvbnN0cnVjdG9yIGZyb20gcGFyYW1ldGVyaXplZCB0eXBlIGdvdCBmb3VuZCwgdXNlIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciBhdCBjb2RlZ2VuIHRpbWUKLQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJTWV0aG9kQmluZGluZyBjb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZy5vcmlnaW5hbCgpOwogCiAJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzczsKLQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5pc1ByaXZhdGUoKSAmJiBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpICE9IChkZWNsYXJpbmdDbGFzcyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpKSB7CisJaWYgKGNvZGVnZW5CaW5kaW5nLmlzUHJpdmF0ZSgpICYmIGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gKGRlY2xhcmluZ0NsYXNzID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpKSB7CiAKIAkJLy8gZnJvbSAxLjQgb24sIGxvY2FsIHR5cGUgY29uc3RydWN0b3IgY2FuIGxvc2UgdGhlaXIgcHJpdmF0ZSBmbGFnIHRvIGVhc2UgZW11bGF0aW9uCi0JCWlmICgoZGVjbGFyaW5nQ2xhc3MudGFnQml0cyAmIFRhZ0JpdHMuSXNMb2NhbFR5cGUpICE9IDAgCSYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgeworCQlpZiAoKGRlY2xhcmluZ0NsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLklzTG9jYWxUeXBlKSAhPSAwICYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgewogCQkJLy8gY29uc3RydWN0b3Igd2lsbCBub3QgYmUgZHVtcGVkIGFzIHByaXZhdGUsIG5vIGVtdWxhdGlvbiByZXF1aXJlZCB0aHVzCi0JCQl0aGlzLmNvZGVnZW5CaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5DbGVhclByaXZhdGVNb2RpZmllcjsKKwkJCWNvZGVnZW5CaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5DbGVhclByaXZhdGVNb2RpZmllcjsKIAkJfSBlbHNlIHsKLQkJCXN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZCh0aGlzLmNvZGVnZW5CaW5kaW5nLCBpc1N1cGVyQWNjZXNzKCkpOwotCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3ModGhpcy5jb2RlZ2VuQmluZGluZywgdGhpcyk7CisJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChjb2RlZ2VuQmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKGNvZGVnZW5CaW5kaW5nLCB0aGlzKTsKIAkJfQogCX0KIH0KQEAgLTIwOCwyNCArMjMwLDI0IEBACiAJaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7IC8vIHR5cGUgbnVsbCBmb3IgZW51bSBjb25zdGFudCBpbml0aWFsaXphdGlvbnMKIAkJb3V0cHV0LmFwcGVuZCgibmV3ICIpOyAvLyROT04tTkxTLTEkCiAJfQotCWlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKwlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJb3V0cHV0LmFwcGVuZCgnPCcpOwotCQlpbnQgbWF4ID0gdHlwZUFyZ3VtZW50cy5sZW5ndGggLSAxOworCQlpbnQgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7CiAJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKLQkJCXR5cGVBcmd1bWVudHNbal0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCXRoaXMudHlwZUFyZ3VtZW50c1tqXS5wcmludCgwLCBvdXRwdXQpOwogCQkJb3V0cHV0LmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCiAJCX0KLQkJdHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CisJCXRoaXMudHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoJz4nKTsKIAl9Ci0JaWYgKHR5cGUgIT0gbnVsbCkgeyAvLyB0eXBlIG51bGwgZm9yIGVudW0gY29uc3RhbnQgaW5pdGlhbGl6YXRpb25zCi0JCXR5cGUucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7IAorCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeyAvLyB0eXBlIG51bGwgZm9yIGVudW0gY29uc3RhbnQgaW5pdGlhbGl6YXRpb25zCisJCXRoaXMudHlwZS5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAl9CiAJb3V0cHV0LmFwcGVuZCgnKCcpOwotCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKIAkJCWlmIChpID4gMCkgb3V0cHV0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQkJdGhpcy5hcmd1bWVudHNbaV0ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCX0KIAl9CiAJcmV0dXJuIG91dHB1dC5hcHBlbmQoJyknKTsKQEAgLTIzMyw3ICsyNTUsNyBAQAogCiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCS8vIFByb3BhZ2F0ZSB0aGUgdHlwZSBjaGVja2luZyB0byB0aGUgYXJndW1lbnRzLCBhbmQgY2hlY2sgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCi0JY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAlpZiAodGhpcy50eXBlID09IG51bGwpIHsKIAkJLy8gaW5pdGlhbGl6YXRpb24gb2YgYW4gZW51bSBjb25zdGFudAogCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpOwpAQCAtMjQyLDcgKzI2NCw3IEBACiAJCWNoZWNrUGFyYW1ldGVyaXplZEFsbG9jYXRpb246IHsKIAkJCWlmICh0aGlzLnR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeyAvLyBkaXNhbGxvdyBuZXcgWDxTdHJpbmc+Llk8SW50ZWdlcj4oKQogCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZyl0aGlzLnJlc29sdmVkVHlwZTsKLQkJCQlpZiAoY3VycmVudFR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJaWYgKGN1cnJlbnRUeXBlID09IG51bGwpIHJldHVybiBjdXJyZW50VHlwZTsKIAkJCQlkbyB7CiAJCQkJCS8vIGlzU3RhdGljKCkgaXMgYW5zd2VyaW5nIHRydWUgZm9yIHRvcGxldmVsIHR5cGVzCiAJCQkJCWlmICgoY3VycmVudFR5cGUubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMCkgYnJlYWsgY2hlY2tQYXJhbWV0ZXJpemVkQWxsb2NhdGlvbjsKQEAgLTI2MCwxMCArMjgyLDExIEBACiAJfQogCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKIAorCWZpbmFsIGJvb2xlYW4gaXNEaWFtb25kID0gdGhpcy50eXBlICE9IG51bGwgJiYgKHRoaXMudHlwZS5iaXRzICYgQVNUTm9kZS5Jc0RpYW1vbmQpICE9IDA7CiAJLy8gcmVzb2x2ZSB0eXBlIGFyZ3VtZW50cyAoZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgY2FsbCkKIAlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7Ci0JCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzCisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7CiAJCXRoaXMuZ2VuZXJpY1R5cGVBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOwpAQCAtMjc0LDE3ICsyOTcsMjYgQEAKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVXNhZ2VPZldpbGRjYXJkKHR5cGVSZWZlcmVuY2UpOwogCQkJfQogCQl9CisJCWlmIChpc0RpYW1vbmQpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRpYW1vbmROb3RXaXRoRXhwbGljaXRUeXBlQXJndW1lbnRzKHRoaXMudHlwZUFyZ3VtZW50cyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQogCQlpZiAoYXJnSGFzRXJyb3IpIHsKKwkJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7IC8vIHN0aWxsIGF0dGVtcHQgdG8gcmVzb2x2ZSBhcmd1bWVudHMKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJdGhpcy5hcmd1bWVudHNbaV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJCX0KKwkJCX0KIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQotCQorCiAJLy8gYnVmZmVyaW5nIHRoZSBhcmd1bWVudHMnIHR5cGVzCiAJYm9vbGVhbiBhcmdzQ29udGFpbkNhc3QgPSBmYWxzZTsKIAlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlM7Ci0JaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKIAkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlFeHByZXNzaW9uIGFyZ3VtZW50ID0gdGhpcy5hcmd1bWVudHNbaV07CkBAIC0yOTcsOCArMzI5LDE1IEBACiAJCQl9CiAJCX0KIAkJaWYgKGFyZ0hhc0Vycm9yKSB7CisJCQkvKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1MzU5LCBpZiBhcmd1bWVudHMgaGF2ZSBlcnJvcnMsIGNvbXBsZXRlbHkgYmFpbCBvdXQgaW4gdGhlIDw+IGNhc2UuCisJCQkgICBObyBtZWFuaW5nZnVsIHR5cGUgcmVzb2x1dGlvbiBpcyBwb3NzaWJsZSBzaW5jZSBpbmZlcmVuY2Ugb2YgdGhlIGVsaWRlZCB0eXBlcyBpcyBmdWxseSB0aWVkIHRvIGFyZ3VtZW50IHR5cGVzLiBEbworCQkJICAgbm90IHJldHVybiB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHR5cGUuCisJCQkgKi8KKwkJCWlmIChpc0RpYW1vbmQpIHsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gbm90IHRoZSBwYXJ0aWFsbHkgY29va2VkIHRoaXMucmVzb2x2ZWRUeXBlCisJCQl9CiAJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJLy8gcmVjb3JkIGEgYmVzdCBndWVzcywgZm9yIGNsaWVudHMgd2hvIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBjb250cnVjdG9yIG1hdGNoCisJCQkJLy8gcmVjb3JkIGEgYmVzdCBndWVzcywgZm9yIGNsaWVudHMgd2hvIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBjb25zdHJ1Y3RvciBtYXRjaAogCQkJCVR5cGVCaW5kaW5nW10gcHNldWRvQXJncyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQkJCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+PSAwOykgewogCQkJCQlwc2V1ZG9BcmdzW2ldID0gYXJndW1lbnRUeXBlc1tpXSA9PSBudWxsID8gVHlwZUJpbmRpbmcuTlVMTCA6IGFyZ3VtZW50VHlwZXNbaV07IC8vIHJlcGxhY2UgYXJncyB3aXRoIGVycm9ycyB3aXRoIG51bGwgdHlwZQpAQCAtMzE0LDcgKzM1Myw3IEBACiAJCQkJCQl9CiAJCQkJCQl0aGlzLmJpbmRpbmcgPSBjbG9zZXN0TWF0Y2g7CiAJCQkJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaE9yaWdpbmFsID0gY2xvc2VzdE1hdGNoLm9yaWdpbmFsKCk7Ci0JCQkJCQlpZiAoKGNsb3Nlc3RNYXRjaE9yaWdpbmFsLmlzUHJpdmF0ZSgpIHx8IGNsb3Nlc3RNYXRjaE9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzLmlzTG9jYWxUeXBlKCkpICYmICFzY29wZS5pc0RlZmluZWRJbk1ldGhvZChjbG9zZXN0TWF0Y2hPcmlnaW5hbCkpIHsKKwkJCQkJCWlmIChjbG9zZXN0TWF0Y2hPcmlnaW5hbC5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkgJiYgIXNjb3BlLmlzRGVmaW5lZEluTWV0aG9kKGNsb3Nlc3RNYXRjaE9yaWdpbmFsKSkgewogCQkJCQkJCS8vIGlnbm9yZSBjYXNlcyB3aGVyZSBtZXRob2QgaXMgdXNlZCBmcm9tIHdpdGhpbiBpbnNpZGUgaXRzZWxmIChlLmcuIGRpcmVjdCByZWN1cnNpb25zKQogCQkJCQkJCWNsb3Nlc3RNYXRjaE9yaWdpbmFsLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOwogCQkJCQkJfQpAQCAtMzI0LDI4ICszNjMsOTggQEAKIAkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJfQogCX0KLQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCkKKwlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCB8fCAhdGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewogCQlyZXR1cm4gbnVsbDsKKwl9CiAKIAkvLyBudWxsIHR5cGUgZGVub3RlcyBmYWtlIGFsbG9jYXRpb24gZm9yIGVudW0gY29uc3RhbnQgaW5pdHMKIAlpZiAodGhpcy50eXBlICE9IG51bGwgJiYgIXRoaXMucmVzb2x2ZWRUeXBlLmNhbkJlSW5zdGFudGlhdGVkKCkpIHsKLQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodHlwZSwgdGhpcy5yZXNvbHZlZFR5cGUpOworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnN0YW50aWF0ZSh0aGlzLnR5cGUsIHRoaXMucmVzb2x2ZWRUeXBlKTsKIAkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCX0KKwlpZiAoaXNEaWFtb25kKSB7CisJCVR5cGVCaW5kaW5nIFtdIGluZmVycmVkVHlwZXMgPSBpbmZlckVsaWRlZFR5cGVzKCgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSkuZ2VuZXJpY1R5cGUoKSwgbnVsbCwgYXJndW1lbnRUeXBlcywgc2NvcGUpOworCQlpZiAoaW5mZXJyZWRUeXBlcyA9PSBudWxsKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbmZlckVsaWRlZFR5cGVzKHRoaXMpOworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gbnVsbDsKKwkJfQorCQl0aGlzLnJlc29sdmVkVHlwZSA9IHRoaXMudHlwZS5yZXNvbHZlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKCgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSkuZ2VuZXJpY1R5cGUoKSwgaW5mZXJyZWRUeXBlcywgKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlKS5lbmNsb3NpbmdUeXBlKCkpOworIAl9CiAJUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZTsKLQlpZiAoIShiaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IoYWxsb2NhdGlvblR5cGUsIGFyZ3VtZW50VHlwZXMsIHRoaXMpKS5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCi0JCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGlvblR5cGU7Ci0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsKKwlpZiAoISh0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihhbGxvY2F0aW9uVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CisJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0aW9uVHlwZTsKKwkJfQorCQlpZiAodGhpcy50eXBlICE9IG51bGwgJiYgIXRoaXMudHlwZS5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIHRoaXMuYmluZGluZyk7CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JaWYgKGlzTWV0aG9kVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSwgdHJ1ZSkpCi0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QoYmluZGluZywgdGhpcyk7Ci0JY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKHNjb3BlLCBudWxsLCBhbGxvY2F0aW9uVHlwZSwgdGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKTsKLQorCWlmICgodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdUeXBlSW5Db25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcpOworCX0KKwlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZywgc2NvcGUsIHRydWUpKQorCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKHRoaXMuYmluZGluZywgdGhpcyk7CisJaWYgKGNoZWNrSW52b2NhdGlvbkFyZ3VtZW50cyhzY29wZSwgbnVsbCwgYWxsb2NhdGlvblR5cGUsIHRoaXMuYmluZGluZywgdGhpcy5hcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMsIGFyZ3NDb250YWluQ2FzdCwgdGhpcykpIHsKKwkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuVW5jaGVja2VkOworCX0KKwlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCkudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5VHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb24odGhpcy5iaW5kaW5nLCB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzLCB0aGlzLnR5cGVBcmd1bWVudHMpOworCX0KKwlpZiAoIWlzRGlhbW9uZCAmJiB0aGlzLnJlc29sdmVkVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlV2l0aEFjdHVhbEFyZ3VtZW50cygpKSB7CisgCQljaGVja1R5cGVBcmd1bWVudFJlZHVuZGFuY3koKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUsIG51bGwsIGFyZ3VtZW50VHlwZXMsIHNjb3BlKTsKKyAJfQogCXJldHVybiBhbGxvY2F0aW9uVHlwZTsKIH0KIAorcHVibGljIFR5cGVCaW5kaW5nW10gaW5mZXJFbGlkZWRUeXBlcyhSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRpb25UeXBlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgZmluYWwgQmxvY2tTY29wZSBzY29wZSkgeworCS8qIEdpdmVuIHRoZSBhbGxvY2F0aW9uIHR5cGUgYW5kIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLCBzZWUgaWYgd2UgY2FuIHN5bnRoZXNpemUgYSBnZW5lcmljIHN0YXRpYyBmYWN0b3J5CisJICAgbWV0aG9kIHRoYXQgd291bGQsIGdpdmVuIHRoZSBhcmd1bWVudCB0eXBlcyBhbmQgdGhlIGludm9jYXRpb24gc2l0ZSwgbWFudWZhY3R1cmUgYSBwYXJhbWV0ZXJpemVkIG9iamVjdCBvZiB0eXBlIGFsbG9jYXRpb25UeXBlLgorCSAgIElmIHdlIGFyZSBzdWNjZXNzZnVsIHRoZW4gYnkgZGVzaWduIGFuZCBjb25zdHJ1Y3Rpb24sIHRoZSBwYXJhbWV0ZXJpemF0aW9uIG9mIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZmFjdG9yeSBtZXRob2QgaXMgaWRlbnRpY2FsCisJICAgdG8gdGhlIHR5cGVzIGVsaWRlZCBpbiB0aGUgPD4uCisJICovICAgCisJTWV0aG9kQmluZGluZyBmYWN0b3J5ID0gc2NvcGUuZ2V0U3RhdGljRmFjdG9yeShhbGxvY2F0aW9uVHlwZSwgZW5jbG9zaW5nVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcyk7CisJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgJiYgZmFjdG9yeS5pc1ZhbGlkQmluZGluZygpKSB7CisJCVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZyBnZW5lcmljRmFjdG9yeSA9IChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpIGZhY3Rvcnk7CisJCXRoaXMuaW5mZXJyZWRSZXR1cm5UeXBlID0gZ2VuZXJpY0ZhY3RvcnkuaW5mZXJyZWRSZXR1cm5UeXBlOworCQlyZXR1cm4gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpZmFjdG9yeS5yZXR1cm5UeXBlKS5hcmd1bWVudHM7CisJfQorCXJldHVybiBudWxsOworfQorCitwdWJsaWMgdm9pZCBjaGVja1R5cGVBcmd1bWVudFJlZHVuZGFuY3koUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGFsbG9jYXRpb25UeXBlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgZmluYWwgQmxvY2tTY29wZSBzY29wZSkgeworCVByb2JsZW1SZXBvcnRlciByZXBvcnRlciA9IHNjb3BlLnByb2JsZW1SZXBvcnRlcigpOworCWlmICgocmVwb3J0ZXIuY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMpID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgfHwgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSByZXR1cm47CisJaWYgKGFsbG9jYXRpb25UeXBlLmFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm47ICAvLyByYXcgYmluZGluZworCWlmICh0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzICE9IG51bGwpIHJldHVybjsgLy8gZGlhbW9uZCBjYW4ndCBvY2N1ciB3aXRoIGV4cGxpY2l0IHR5cGUgYXJncyBmb3IgY29uc3RydWN0b3IKKwlpZiAoYXJndW1lbnRUeXBlcyA9PSBCaW5kaW5nLk5PX1BBUkFNRVRFUlMgJiYgdGhpcy50eXBlRXhwZWN0ZWQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHsKKwkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGV4cGVjdGVkID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy50eXBlRXhwZWN0ZWQ7CisJCWlmIChleHBlY3RlZC5hcmd1bWVudHMgIT0gbnVsbCAmJiBhbGxvY2F0aW9uVHlwZS5hcmd1bWVudHMubGVuZ3RoID09IGV4cGVjdGVkLmFyZ3VtZW50cy5sZW5ndGgpIHsKKwkJCS8vIGNoZWNrIHRoZSBjYXNlIHdoZW4gbm8gY3RvciB0YWtlcyBubyBwYXJhbXMgYW5kIGluZmVyZW5jZSB1c2VzIHRoZSBleHBlY3RlZCB0eXBlIGRpcmVjdGx5CisJCQkvLyBlZy4gWDxTdHJpbmc+IHggPSBuZXcgWDxTdHJpbmc+KCkKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGFsbG9jYXRpb25UeXBlLmFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChhbGxvY2F0aW9uVHlwZS5hcmd1bWVudHNbaV0gIT0gZXhwZWN0ZWQuYXJndW1lbnRzW2ldKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpID09IGFsbG9jYXRpb25UeXBlLmFyZ3VtZW50cy5sZW5ndGgpIHsKKwkJCQlyZXBvcnRlci5yZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKHRoaXMudHlwZSwgYWxsb2NhdGlvblR5cGUuYXJndW1lbnRzKTsKKwkJCQlyZXR1cm47CisJCQl9CQorCQl9CisJfQorCVR5cGVCaW5kaW5nIFtdIGluZmVycmVkVHlwZXMgPSBpbmZlckVsaWRlZFR5cGVzKGFsbG9jYXRpb25UeXBlLmdlbmVyaWNUeXBlKCksIGVuY2xvc2luZ1R5cGUsIGFyZ3VtZW50VHlwZXMsIHNjb3BlKTsKKwlpZiAoaW5mZXJyZWRUeXBlcyA9PSBudWxsKSB7CisJCXJldHVybjsKKwl9CisJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZlcnJlZFR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChpbmZlcnJlZFR5cGVzW2ldICE9IGFsbG9jYXRpb25UeXBlLmFyZ3VtZW50c1tpXSkKKwkJCXJldHVybjsKKwl9CisJcmVwb3J0ZXIucmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyh0aGlzLnR5cGUsIGFsbG9jYXRpb25UeXBlLmFyZ3VtZW50cyk7Cit9CisKIHB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgewogCS8vIGlnbm9yZWQKIH0KQEAgLTM3NSw0ICs0ODQsMTcgQEAKIAl9CiAJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiB9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3NldEV4cGVjdGVkVHlwZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKQorICovCitwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFR5cGUoVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJdGhpcy50eXBlRXhwZWN0ZWQgPSBleHBlY3RlZFR5cGU7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNleHBlY3RlZFR5cGUoKQorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKCkgeworCXJldHVybiB0aGlzLnR5cGVFeHBlY3RlZDsKK30KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bbm5vdGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fubm90YXRpb24uamF2YQppbmRleCAyYWJiNGEyLi40ODIwMjQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fubm90YXRpb24uamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE1LDgwICsxNSw4MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLklycml0YW50U2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogLyoqCiAgKiBBbm5vdGF0aW9uCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCisKIAlmaW5hbCBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyW10gTm9WYWx1ZVBhaXJzID0gbmV3IE1lbWJlclZhbHVlUGFpclswXTsKIAlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kOwogCXB1YmxpYyBCaW5kaW5nIHJlY2lwaWVudDsKLQkKKwogCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHR5cGU7Ci0JLyoqIAotCSAqICBUaGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uIGluIHRoZSB0eXBlIHN5c3RlbS4gCisJLyoqCisJICogIFRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24gaW4gdGhlIHR5cGUgc3lzdGVtLgogCSAqLwogCXByaXZhdGUgQW5ub3RhdGlvbkJpbmRpbmcgY29tcGlsZXJBbm5vdGF0aW9uID0gbnVsbDsKLQkKKwogCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXRlbnRpb25Qb2xpY3koY2hhcltdIHBvbGljeU5hbWUpIHsKIAkJaWYgKHBvbGljeU5hbWUgPT0gbnVsbCB8fCBwb2xpY3lOYW1lLmxlbmd0aCA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCXN3aXRjaChwb2xpY3lOYW1lWzBdKSB7CiAJCQljYXNlICdDJyA6Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBvbGljeU5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfQ0xBU1MpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocG9saWN5TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9DTEFTUykpCiAJCQkJCXJldHVybiBUYWdCaXRzLkFubm90YXRpb25DbGFzc1JldGVudGlvbjsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ1MnIDoKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocG9saWN5TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9TT1VSQ0UpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocG9saWN5TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9TT1VSQ0UpKQogCQkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uU291cmNlUmV0ZW50aW9uOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnUicgOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwb2xpY3lOYW1lLCBUeXBlQ29uc3RhbnRzLlVQUEVSX1JVTlRJTUUpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocG9saWN5TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9SVU5USU1FKSkKIAkJCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb247CiAJCQkJYnJlYWs7CiAJCX0KIAkJcmV0dXJuIDA7IC8vIHVua25vd24KIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VGFyZ2V0RWxlbWVudFR5cGUoY2hhcltdIGVsZW1lbnROYW1lKSB7CiAJCWlmIChlbGVtZW50TmFtZSA9PSBudWxsIHx8IGVsZW1lbnROYW1lLmxlbmd0aCA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCXN3aXRjaChlbGVtZW50TmFtZVswXSkgewogCQkJY2FzZSAnQScgOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9BTk5PVEFUSU9OX1RZUEUpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudE5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfQU5OT1RBVElPTl9UWVBFKSkKIAkJCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckFubm90YXRpb25UeXBlOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnQycgOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9DT05TVFJVQ1RPUikpIAorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9DT05TVFJVQ1RPUikpCiAJCQkJCXJldHVybiBUYWdCaXRzLkFubm90YXRpb25Gb3JDb25zdHJ1Y3RvcjsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ0YnIDoKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudE5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfRklFTEQpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudE5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfRklFTEQpKQogCQkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yRmllbGQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlICdMJyA6Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGVsZW1lbnROYW1lLCBUeXBlQ29uc3RhbnRzLlVQUEVSX0xPQ0FMX1ZBUklBQkxFKSkgCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGVsZW1lbnROYW1lLCBUeXBlQ29uc3RhbnRzLlVQUEVSX0xPQ0FMX1ZBUklBQkxFKSkKIAkJCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckxvY2FsVmFyaWFibGU7CiAJCQkJYnJlYWs7CiAJCQljYXNlICdNJyA6Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGVsZW1lbnROYW1lLCBUeXBlQ29uc3RhbnRzLlVQUEVSX01FVEhPRCkpIAorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9NRVRIT0QpKQogCQkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yTWV0aG9kOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnUCcgOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9QQVJBTUVURVIpKSAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudE5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfUEFSQU1FVEVSKSkKIAkJCQkJcmV0dXJuIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhcmFtZXRlcjsKLQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5VUFBFUl9QQUNLQUdFKSkgCisJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudE5hbWUsIFR5cGVDb25zdGFudHMuVVBQRVJfUEFDS0FHRSkpCiAJCQkJCXJldHVybiBUYWdCaXRzLkFubm90YXRpb25Gb3JQYWNrYWdlOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnVCcgOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50TmFtZSwgVHlwZUNvbnN0YW50cy5UWVBFKSkgCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGVsZW1lbnROYW1lLCBUeXBlQ29uc3RhbnRzLlRZUEUpKQogCQkJCQlyZXR1cm4gVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZTsKIAkJCQlicmVhazsKIAkJfQogCQlyZXR1cm4gMDsgLy8gdW5rbm93bgotCX0JCQorCX0KIAogCXB1YmxpYyBFbGVtZW50VmFsdWVQYWlyW10gY29tcHV0ZUVsZW1lbnRWYWx1ZVBhaXJzKCkgewogCQlyZXR1cm4gQmluZGluZy5OT19FTEVNRU5UX1ZBTFVFX1BBSVJTOwpAQCAtMTEzLDcgKzExNCw3IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQkJLy8gdGFyZ2V0IGFubm90YXRpb24KLQkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nQW5ub3RhdGlvblRhcmdldCA6CQkKKwkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nQW5ub3RhdGlvblRhcmdldCA6CiAJCQkJdGFnQml0cyB8PSBUYWdCaXRzLkFubm90YXRpb25UYXJnZXQ7IC8vIHRhcmdldCBzcGVjaWZpZWQgKGNvdWxkIGJlIGVtcHR5KQogCQkJCWlmICh2YWx1ZUF0dHJpYnV0ZSAhPSBudWxsKSB7CiAJCQkJCUV4cHJlc3Npb24gZXhwciA9IHZhbHVlQXR0cmlidXRlLnZhbHVlOwpAQCAtMTMyLDcgKzEzMyw3IEBACiAJCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQkJdGFnQml0cyB8PSBlbGVtZW50OwogCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0JCQkJCQkJCisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC0xNjAsNiArMTYxLDEyIEBACiAJCQljYXNlIFR5cGVJZHMuVF9KYXZhTGFuZ1N1cHByZXNzV2FybmluZ3MgOgogCQkJCXRhZ0JpdHMgfD0gVGFnQml0cy5Bbm5vdGF0aW9uU3VwcHJlc3NXYXJuaW5nczsKIAkJCQlicmVhazsKKwkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nU2FmZVZhcmFyZ3MgOgorCQkJCXRhZ0JpdHMgfD0gVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3M7CisJCQkJYnJlYWs7CisJCQljYXNlIFR5cGVJZHMuVF9KYXZhTGFuZ0ludm9rZU1ldGhvZEhhbmRsZVBvbHltb3JwaGljU2lnbmF0dXJlIDoKKwkJCQl0YWdCaXRzIHw9IFRhZ0JpdHMuQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlOworCQkJCWJyZWFrOwogCQl9CiAJCXJldHVybiB0YWdCaXRzOwogCX0KQEAgLTE2OCwxNyArMTc1LDQxIEBACiAJCXJldHVybiB0aGlzLmNvbXBpbGVyQW5ub3RhdGlvbjsKIAl9CiAKKwlwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVJbnZpc2libGUoKSB7CisJCWZpbmFsIFR5cGVCaW5kaW5nIGFubm90YXRpb25CaW5kaW5nID0gdGhpcy5yZXNvbHZlZFR5cGU7CisJCWlmIChhbm5vdGF0aW9uQmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbG9uZyBtZXRhVGFnQml0cyA9IGFubm90YXRpb25CaW5kaW5nLmdldEFubm90YXRpb25UYWdCaXRzKCk7IC8vIGNvdWxkIGJlIGZvcndhcmQgcmVmZXJlbmNlCisJCWlmICgobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSA9PSAwKQorCQkJcmV0dXJuIHRydWU7IC8vIGJ5IGRlZmF1bHQgdGhlIHJldGVudGlvbiBpcyBDTEFTUworCisJCXJldHVybiAobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSA9PSBUYWdCaXRzLkFubm90YXRpb25DbGFzc1JldGVudGlvbjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVWaXNpYmxlKCkgeworCQlmaW5hbCBUeXBlQmluZGluZyBhbm5vdGF0aW9uQmluZGluZyA9IHRoaXMucmVzb2x2ZWRUeXBlOworCQlpZiAoYW5ub3RhdGlvbkJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWxvbmcgbWV0YVRhZ0JpdHMgPSBhbm5vdGF0aW9uQmluZGluZy5nZXRBbm5vdGF0aW9uVGFnQml0cygpOworCQlpZiAoKG1ldGFUYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmV0ZW50aW9uTUFTSykgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsgLy8gYnkgZGVmYXVsdCB0aGUgcmV0ZW50aW9uIGlzIENMQVNTCisKKwkJcmV0dXJuIChtZXRhVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblJldGVudGlvbk1BU0spID09IFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb247CisJfQorCiAJcHVibGljIGFic3RyYWN0IE1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMoKTsKLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJb3V0cHV0LmFwcGVuZCgnQCcpOwogCQl0aGlzLnR5cGUucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhTY29wZSBzY29wZSwgaW50IHN0YXJ0U3VwcHJlc3NzLCBpbnQgZW5kU3VwcHJlc3MsIGJvb2xlYW4gaXNTdXBwcmVzc2luZ1dhcm5pbmdzKSB7Ci0JCWxvbmcgc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID0gMDsKLQkJTWVtYmVyVmFsdWVQYWlyW10gcGFpcnMgPSB0aGlzLm1lbWJlclZhbHVlUGFpcnMoKTsKKwkJSXJyaXRhbnRTZXQgc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID0gbnVsbDsKKwkJTWVtYmVyVmFsdWVQYWlyW10gcGFpcnMgPSBtZW1iZXJWYWx1ZVBhaXJzKCk7CiAJCXBhaXJMb29wOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gcGFpcnNbaV07CiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFpci5uYW1lLCBUeXBlQ29uc3RhbnRzLlZBTFVFKSkgewpAQCAtMTkwLDEwICsyMjEsMTMgQEAKIAkJCQkJCWZvciAoaW50IGogPSAwLCBpbml0c0xlbmd0aCA9IGluaXRzLmxlbmd0aDsgaiA8IGluaXRzTGVuZ3RoOyBqKyspIHsKIAkJCQkJCQlDb25zdGFudCBjc3QgPSBpbml0c1tqXS5jb25zdGFudDsKIAkJCQkJCQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QudHlwZUlEKCkgPT0gVF9KYXZhTGFuZ1N0cmluZykgewotCQkJCQkJCQlsb25nIGlycml0YW50ID0gQ29tcGlsZXJPcHRpb25zLndhcm5pbmdUb2tlblRvSXJyaXRhbnQoY3N0LnN0cmluZ1ZhbHVlKCkpOwotCQkJCQkJCQlpZiAoaXJyaXRhbnQgIT0gMCkgewotCQkJCQkJCQkJc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzIHw9IGlycml0YW50OwotCQkJCQkJCQkJaWYgKH5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHMgPT0gMCkgYnJlYWsgcGFpckxvb3A7CisJCQkJCQkJCUlycml0YW50U2V0IGlycml0YW50cyA9IENvbXBpbGVyT3B0aW9ucy53YXJuaW5nVG9rZW5Ub0lycml0YW50cyhjc3Quc3RyaW5nVmFsdWUoKSk7CisJCQkJCQkJCWlmIChpcnJpdGFudHMgIT0gbnVsbCkgeworCQkJCQkJCQkJaWYgKHN1cHByZXNzV2FybmluZ0lycml0YW50cyA9PSBudWxsKSB7CisJCQkJCQkJCQkJc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID0gbmV3IElycml0YW50U2V0KGlycml0YW50cyk7CisJCQkJCQkJCQl9IGVsc2UgaWYgKHN1cHByZXNzV2FybmluZ0lycml0YW50cy5zZXQoaXJyaXRhbnRzKSA9PSBudWxsKSB7CisJCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZFdhcm5pbmdUb2tlbihpbml0c1tqXSk7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmhhbmRsZWRXYXJuaW5nVG9rZW4oaW5pdHNbal0pOwogCQkJCQkJCQl9CkBAIC0yMDMsMzcgKzIzNywzNyBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCUNvbnN0YW50IGNzdCA9IHZhbHVlLmNvbnN0YW50OwogCQkJCQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QudHlwZUlEKCkgPT0gVF9KYXZhTGFuZ1N0cmluZykgewotCQkJCQkJbG9uZyBpcnJpdGFudCA9IENvbXBpbGVyT3B0aW9ucy53YXJuaW5nVG9rZW5Ub0lycml0YW50KGNzdC5zdHJpbmdWYWx1ZSgpKTsKLQkJCQkJCWlmIChpcnJpdGFudCAhPSAwKSB7Ci0JCQkJCQkJc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzIHw9IGlycml0YW50OwotCQkJCQkJCWlmICh+c3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID09IDApIGJyZWFrIHBhaXJMb29wOworCQkJCQkJSXJyaXRhbnRTZXQgaXJyaXRhbnRzID0gQ29tcGlsZXJPcHRpb25zLndhcm5pbmdUb2tlblRvSXJyaXRhbnRzKGNzdC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJCWlmIChpcnJpdGFudHMgIT0gbnVsbCkgeworCQkJCQkJCXN1cHByZXNzV2FybmluZ0lycml0YW50cyA9IG5ldyBJcnJpdGFudFNldChpcnJpdGFudHMpOworCQkJCQkJCS8vIFRPRE86IHNob3VsZCBjaGVjayBmb3IgdW51c2VkIHdhcm5pbmcgdG9rZW4gYWdhaW5zdCBlbmNsb3NpbmcgYW5ub3RhdGlvbiBhcyB3ZWxsID8KIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5oYW5kbGVkV2FybmluZ1Rva2VuKHZhbHVlKTsKIAkJCQkJCX0KLQkJCQkJfQkKKwkJCQkJfQogCQkJCX0KIAkJCQlicmVhayBwYWlyTG9vcDsKIAkJCX0KIAkJfQotCQlpZiAoaXNTdXBwcmVzc2luZ1dhcm5pbmdzICYmIHN1cHByZXNzV2FybmluZ0lycml0YW50cyAhPSAwKSB7Ci0JCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5yZWNvcmRTdXBwcmVzc1dhcm5pbmdzKHN1cHByZXNzV2FybmluZ0lycml0YW50cywgc3RhcnRTdXBwcmVzc3MsIGVuZFN1cHByZXNzKTsKKwkJaWYgKGlzU3VwcHJlc3NpbmdXYXJuaW5ncyAmJiBzdXBwcmVzc1dhcm5pbmdJcnJpdGFudHMgIT0gbnVsbCkgeworCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhzdXBwcmVzc1dhcm5pbmdJcnJpdGFudHMsIHRoaXMsIHN0YXJ0U3VwcHJlc3NzLCBlbmRTdXBwcmVzcyk7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCWlmICh0aGlzLmNvbXBpbGVyQW5ub3RhdGlvbiAhPSBudWxsKQogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQkKKwogCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMudHlwZS5yZXNvbHZlVHlwZShzY29wZSk7CiAJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGVCaW5kaW5nOwogCQkvLyBlbnN1cmUgdHlwZSByZWZlcnMgdG8gYW4gYW5ub3RhdGlvbiB0eXBlCi0JCWlmICghdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcih0eXBlQmluZGluZywgc2NvcGUuZ2V0SmF2YUxhbmdBbm5vdGF0aW9uQW5ub3RhdGlvbigpLCB0aGlzLnR5cGUpOworCQlpZiAoIXR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSAmJiB0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcih0eXBlQmluZGluZywgc2NvcGUuZ2V0SmF2YUxhbmdBbm5vdGF0aW9uQW5ub3RhdGlvbigpLCB0aGlzLnR5cGUsIG51bGwpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIApAQCAtMjQ4LDggKzI4Miw4IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVmFsdWVQYWlycywgMCwgcGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW3BhaXJzTGVuZ3RoXSwgMCwgcGFpcnNMZW5ndGgpOwogCQl9IGVsc2UgewogCQkJcGFpcnMgPSBvcmlnaW5hbFZhbHVlUGFpcnM7Ci0JCX0JCQotCQkKKwkJfQorCiAJCW5leHRNZW1iZXI6IGZvciAoaW50IGkgPSAwLCByZXF1aXJlZExlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgcmVxdWlyZWRMZW5ndGg7IGkrKykgewogCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOwogCQkJY2hhcltdIHNlbGVjdG9yID0gbWV0aG9kLnNlbGVjdG9yOwpAQCAtMjY2LDcgKzMwMCw3IEBACiAJCQkJCXBhaXIucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIG1ldGhvZC5yZXR1cm5UeXBlKTsKIAkJCQkJcGFpcnNbal0gPSBudWxsOyAvLyBjb25zdW1lZAogCQkJCQlmb3VuZFZhbHVlID0gdHJ1ZTsKLQkJCQkJCisKIAkJCQkJLy8gY2hlY2sgZHVwbGljYXRlcwogCQkJCQlib29sZWFuIGZvdW5kRHVwbGljYXRlID0gZmFsc2U7CiAJCQkJCWZvciAoaW50IGsgPSBqKzE7IGsgPCBwYWlyc0xlbmd0aDsgaysrKSB7CkBAIC0yODYsNyArMzIwLDkgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWlmICghZm91bmRWYWx1ZSAmJiAobWV0aG9kLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uRGVmYXVsdCkgPT0gMCkgeworCQkJaWYgKCFmb3VuZFZhbHVlICYmCisJCQkJCShtZXRob2QubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb25EZWZhdWx0KSA9PSAwICYmCisJCQkJCSh0aGlzLmJpdHMgJiBJc1JlY292ZXJlZCkgPT0gMCkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdWYWx1ZUZvckFubm90YXRpb25NZW1iZXIodGhpcywgc2VsZWN0b3IpOwogCQkJfQogCQl9CkBAIC0yOTgsMTIgKzMzNCwxMiBAQAogCQkJfQogCQl9CiAvLwkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnN0b3JlQW5ub3RhdGlvbnMpCi0JCXRoaXMuY29tcGlsZXJBbm5vdGF0aW9uID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVBbm5vdGF0aW9uKChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSwgdGhpcy5jb21wdXRlRWxlbWVudFZhbHVlUGFpcnMoKSk7CisJCXRoaXMuY29tcGlsZXJBbm5vdGF0aW9uID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVBbm5vdGF0aW9uKChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSwgY29tcHV0ZUVsZW1lbnRWYWx1ZVBhaXJzKCkpOwogCQkvLyByZWNvZ25pemUgc3RhbmRhcmQgYW5ub3RhdGlvbnMgPwogCQlsb25nIHRhZ0JpdHMgPSBkZXRlY3RTdGFuZGFyZEFubm90YXRpb24oc2NvcGUsIGFubm90YXRpb25UeXBlLCB2YWx1ZUF0dHJpYnV0ZSk7CiAKIAkJLy8gcmVjb3JkIGFubm90YXRpb24gcG9zaXRpb25zIGluIHRoZSBjb21waWxhdGlvbiByZXN1bHQKLQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQucmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhDb21waWxlck9wdGlvbnMuTm9uRXh0ZXJuYWxpemVkU3RyaW5nLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhJcnJpdGFudFNldC5OTFMsIG51bGwsIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogCQlpZiAodGhpcy5yZWNpcGllbnQgIT0gbnVsbCkgewogCQkJaWYgKHRhZ0JpdHMgIT0gMCkgewogCQkJCS8vIHRhZyBiaXRzIG9udG8gcmVjaXBpZW50CkBAIC0zNDIsNyArMzc4LDcgQEAKIAkJCQkJCQlzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBzb3VyY2VGaWVsZC5kZWNsYXJpbmdDbGFzczsKIAkJCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZGVjbGFyYXRpb25PZihzb3VyY2VGaWVsZCk7CiAJCQkJCQkJcmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhzY29wZSwgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kLCBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zdXBwcmVzc1dhcm5pbmdzKTsKLQkJCQkJCX0JCQkJCQkKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIEJpbmRpbmcuTE9DQUwgOgogCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMucmVjaXBpZW50OwpAQCAtMzUwLDE3ICszODYsMTcgQEAKIAkJCQkJCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblN1cHByZXNzV2FybmluZ3MpICE9IDApIHsKIAkJCQkJCQkgTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gdmFyaWFibGUuZGVjbGFyYXRpb247CiAJCQkJCQkJcmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhzY29wZSwgbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kLCBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zdXBwcmVzc1dhcm5pbmdzKTsKLQkJCQkJCX0JCQkJCQkJCQkKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCX0JCQkKKwkJCQl9CiAJCQl9CiAJCQkvLyBjaGVjayAobWV0YSl0YXJnZXQgY29tcGF0aWJpbGl0eQogCQkJY2hlY2tUYXJnZXRDb21wYXRpYmlsaXR5OiB7CiAJCQkJbG9uZyBtZXRhVGFnQml0cyA9IGFubm90YXRpb25UeXBlLmdldEFubm90YXRpb25UYWdCaXRzKCk7IC8vIGNvdWxkIGJlIGZvcndhcmQgcmVmZXJlbmNlCiAJCQkJaWYgKChtZXRhVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblRhcmdldE1BU0spID09IDApIC8vIGRvZXMgbm90IHNwZWNpZnkgYW55IHRhcmdldCByZXN0cmljdGlvbgogCQkJCQlicmVhayBjaGVja1RhcmdldENvbXBhdGliaWxpdHk7Ci0JCQkJCQotCQkJCXN3aXRjaCAocmVjaXBpZW50LmtpbmQoKSkgeworCisJCQkJc3dpdGNoICh0aGlzLnJlY2lwaWVudC5raW5kKCkpIHsKIAkJCQkJY2FzZSBCaW5kaW5nLlBBQ0tBR0UgOgogCQkJCQkJaWYgKChtZXRhVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhY2thZ2UpICE9IDApCiAJCQkJCQkJYnJlYWsgY2hlY2tUYXJnZXRDb21wYXRpYmlsaXR5OwpAQCAtMzcwLDggKzQwNiwxMiBAQAogCQkJCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZyl0aGlzLnJlY2lwaWVudCkuaXNBbm5vdGF0aW9uVHlwZSgpKSB7CiAJCQkJCQkJaWYgKChtZXRhVGFnQml0cyAmIChUYWdCaXRzLkFubm90YXRpb25Gb3JBbm5vdGF0aW9uVHlwZXxUYWdCaXRzLkFubm90YXRpb25Gb3JUeXBlKSkgIT0gMCkKIAkJCQkJCQlicmVhayBjaGVja1RhcmdldENvbXBhdGliaWxpdHk7Ci0JCQkJCQl9IGVsc2UgaWYgKChtZXRhVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclR5cGUpICE9IDApIAorCQkJCQkJfSBlbHNlIGlmICgobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Gb3JUeXBlKSAhPSAwKSB7CiAJCQkJCQkJYnJlYWsgY2hlY2tUYXJnZXRDb21wYXRpYmlsaXR5OworCQkJCQkJfSBlbHNlIGlmICgobWV0YVRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Gb3JQYWNrYWdlKSAhPSAwKSB7CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKCgoUmVmZXJlbmNlQmluZGluZyl0aGlzLnJlY2lwaWVudCkuc291cmNlTmFtZSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkpCisJCQkJCQkJCWJyZWFrIGNoZWNrVGFyZ2V0Q29tcGF0aWJpbGl0eTsKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIEJpbmRpbmcuTUVUSE9EIDoKIAkJCQkJCWlmICgoKE1ldGhvZEJpbmRpbmcpdGhpcy5yZWNpcGllbnQpLmlzQ29uc3RydWN0b3IoKSkgewpAQCAtMzkxLDEzICs0MzEsMTMgQEAKIAkJCQkJCX0gZWxzZSAJaWYgKChhbm5vdGF0aW9uVHlwZS50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yTG9jYWxWYXJpYWJsZSkgIT0gMCkKIAkJCQkJCQlicmVhayBjaGVja1RhcmdldENvbXBhdGliaWxpdHk7CiAJCQkJCQlicmVhazsKLQkJCQl9CQkJCisJCQkJfQogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRpc2FsbG93ZWRUYXJnZXRGb3JBbm5vdGF0aW9uKHRoaXMpOwogCQkJfQogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JCisKIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpOwotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fubm90YXRpb25NZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24uamF2YQppbmRleCA4M2FiZTM2Li44ODYwZWM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fubm90YXRpb25NZXRob2REZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOwogCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24gewotCQorCiAJcHVibGljIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlOwogCXB1YmxpYyBpbnQgZXh0ZW5kZWREaW1lbnNpb25zOwogCkBAIC0zMiwzMSArMzIsMzEgQEAKIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQ2xhc3NGaWxlIGNsYXNzRmlsZSkgewogCQljbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKHRoaXMuYmluZGluZyk7CiAJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7Ci0JCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBjbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKHRoaXMuYmluZGluZywgdGhpcyk7Ci0JCWNsYXNzRmlsZS5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gY2xhc3NGaWxlLmdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZXModGhpcy5iaW5kaW5nLCB0aGlzKTsKKwkJY2xhc3NGaWxlLmNvbXBsZXRlTWV0aG9kSW5mbyh0aGlzLmJpbmRpbmcsIG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25NZXRob2QoKSB7CiAKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNNZXRob2QoKSB7CiAKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cyhQYXJzZXIgcGFyc2VyLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CiAJCS8vIG5vdGhpbmcgdG8gZG8KIAkJLy8gYW5ub3RhdGlvbiB0eXBlIG1lbWJlciBkZWNsYXJhdGlvbiBkb24ndCBoYXZlIGFueSBib2R5CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAkJcHJpbnRJbmRlbnQodGFiLCBvdXRwdXQpOwogCQlwcmludE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgb3V0cHV0KTsKIAkJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgcHJpbnRBbm5vdGF0aW9ucyh0aGlzLmFubm90YXRpb25zLCBvdXRwdXQpOwotCQkKKwogCQlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtcyA9IHR5cGVQYXJhbWV0ZXJzKCk7CiAJCWlmICh0eXBlUGFyYW1zICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoJzwnKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAkJCXR5cGVQYXJhbXNbbWF4XS5wcmludCgwLCBvdXRwdXQpOwogCQkJb3V0cHV0LmFwcGVuZCgnPicpOwogCQl9Ci0JCQorCiAJCXByaW50UmV0dXJuVHlwZSgwLCBvdXRwdXQpLmFwcGVuZCh0aGlzLnNlbGVjdG9yKS5hcHBlbmQoJygnKTsKIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKQEAgLTg0LDMyICs4NCwzMiBAQAogCQkJCXRoaXMudGhyb3duRXhjZXB0aW9uc1tpXS5wcmludCgwLCBvdXRwdXQpOwogCQkJfQogCQl9Ci0JCQorCiAJCWlmICh0aGlzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAJCQlvdXRwdXQuYXBwZW5kKCIgZGVmYXVsdCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJdGhpcy5kZWZhdWx0VmFsdWUucHJpbnQoMCwgb3V0cHV0KTsKIAkJfQotCQkKKwogCQlwcmludEJvZHkodGFiICsgMSwgb3V0cHV0KTsKIAkJcmV0dXJuIG91dHB1dDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cygpIHsKIAogCQlzdXBlci5yZXNvbHZlU3RhdGVtZW50cygpOwogCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvbk1lbWJlcnNDYW5ub3RIYXZlUGFyYW1ldGVycyh0aGlzKTsKKwkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvbk1lbWJlcnNDYW5ub3RIYXZlUGFyYW1ldGVycyh0aGlzKTsKIAkJfQogCQlpZiAodGhpcy50eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hbm5vdGF0aW9uTWVtYmVyc0Nhbm5vdEhhdmVUeXBlUGFyYW1ldGVycyh0aGlzKTsKKwkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvbk1lbWJlcnNDYW5ub3RIYXZlVHlwZVBhcmFtZXRlcnModGhpcyk7CiAJCX0KIAkJaWYgKHRoaXMuZXh0ZW5kZWREaW1lbnNpb25zICE9IDApIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxFeHRlbmRlZERpbWVuc2lvbnModGhpcyk7CQkKLQkJfQkJCisJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxFeHRlbmRlZERpbWVuc2lvbnModGhpcyk7CisJCX0KIAkJaWYgKHRoaXMuYmluZGluZyA9PSBudWxsKSByZXR1cm47CiAJCVR5cGVCaW5kaW5nIHJldHVyblR5cGVCaW5kaW5nID0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGU7CiAJCWlmIChyZXR1cm5UeXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCisKIAkJCS8vIGFubm90YXRpb24gbWV0aG9kcyBjYW4gb25seSByZXR1cm4gYmFzZSB0eXBlcywgU3RyaW5nLCBDbGFzcywgZW51bSB0eXBlLCBhbm5vdGF0aW9uIHR5cGVzIGFuZCBhcnJheXMgb2YgdGhlc2UKIAkJCWNoZWNrQW5ub3RhdGlvbk1ldGhvZFR5cGU6IHsKIAkJCQlUeXBlQmluZGluZyBsZWFmUmV0dXJuVHlwZSA9IHJldHVyblR5cGVCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCk7CkBAIC0xMzAsMTIgKzEzMCwxMiBAQAogCQkJCQlpZiAobGVhZlJldHVyblR5cGUuaXNFbnVtKCkgfHwgbGVhZlJldHVyblR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpKQogCQkJCQkJYnJlYWsgY2hlY2tBbm5vdGF0aW9uTWV0aG9kVHlwZTsKIAkJCQl9Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEFubm90YXRpb25NZW1iZXJUeXBlKHRoaXMpOworCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEFubm90YXRpb25NZW1iZXJUeXBlKHRoaXMpOwogCQkJfQogCQkJaWYgKHRoaXMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKIAkJCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IG5ldyBNZW1iZXJWYWx1ZVBhaXIodGhpcy5zZWxlY3RvciwgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQsIHRoaXMuZGVmYXVsdFZhbHVlKTsKIAkJCQlwYWlyLmJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7Ci0JCQkJcGFpci5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgcmV0dXJuVHlwZUJpbmRpbmcpOworCQkJCXBhaXIucmVzb2x2ZVR5cGVFeHBlY3RpbmcodGhpcy5zY29wZSwgcmV0dXJuVHlwZUJpbmRpbmcpOwogCQkJCXRoaXMuYmluZGluZy5zZXREZWZhdWx0VmFsdWUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FbGVtZW50VmFsdWVQYWlyLmdldFZhbHVlKHRoaXMuZGVmYXVsdFZhbHVlKSk7CiAJCQl9IGVsc2UgeyAvLyBsZXQgaXQga25vdyBpdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBzbyBpdCB3b24ndCB0cnkgdG8gZmluZCBpdAogCQkJCXRoaXMuYmluZGluZy5zZXREZWZhdWx0VmFsdWUobnVsbCk7CkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCQkJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkJCWludCBhbm5vdGF0aW9uc0xlbmd0aCA9IHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNMZW5ndGg7IGkrKykKLQkJCQkJdGhpcy5hbm5vdGF0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCXRoaXMuYW5ub3RhdGlvbnNbaV0udHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQl9CiAJCQlpZiAodGhpcy5yZXR1cm5UeXBlICE9IG51bGwpIHsKLQkJCQl0aGlzLnJldHVyblR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCXRoaXMucmV0dXJuVHlwZS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KIAkJCWlmICh0aGlzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5kZWZhdWx0VmFsdWUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCXRoaXMuZGVmYXVsdFZhbHVlLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCQkJfQogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgY2xhc3NTY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEKaW5kZXggZDc1NDVlYi4uYWNhZDJlNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bcmd1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJndW1lbnQuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyLDI3ICsxMiwyOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIEFyZ3VtZW50IGV4dGVuZHMgTG9jYWxEZWNsYXJhdGlvbiB7Ci0JCisKIAkvLyBwcmVmaXggZm9yIHNldHRlciBtZXRob2QgKHRvIHJlY29nbml6ZSBzcGVjaWFsIGhpZGluZyBhcmd1bWVudCkKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VUID0gInNldCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJcHVibGljIEFyZ3VtZW50KGNoYXJbXSBuYW1lLCBsb25nIHBvc05vbSwgVHlwZVJlZmVyZW5jZSB0ciwgaW50IG1vZGlmaWVycykgewogCiAJCXN1cGVyKG5hbWUsIChpbnQpIChwb3NOb20gPj4+IDMyKSwgKGludCkgcG9zTm9tKTsKIAkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IChpbnQpIHBvc05vbTsKIAkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JCXR5cGUgPSB0cjsKLQkJdGhpcy5iaXRzIHw9IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZTsKKwkJdGhpcy50eXBlID0gdHI7CisJCXRoaXMuYml0cyB8PSAoSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlIHwgSXNBcmd1bWVudCk7CiAJfQogCiAJcHVibGljIHZvaWQgYmluZChNZXRob2RTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGJvb2xlYW4gdXNlZCkgewogCiAJCS8vIHJlY29yZCB0aGUgcmVzb2x2ZWQgdHlwZSBpbnRvIHRoZSB0eXBlIHJlZmVyZW5jZQotCQlCaW5kaW5nIGV4aXN0aW5nVmFyaWFibGUgPSBzY29wZS5nZXRCaW5kaW5nKG5hbWUsIEJpbmRpbmcuVkFSSUFCTEUsIHRoaXMsIGZhbHNlIC8qZG8gbm90IHJlc29sdmUgaGlkZGVuIGZpZWxkKi8pOworCQlCaW5kaW5nIGV4aXN0aW5nVmFyaWFibGUgPSBzY29wZS5nZXRCaW5kaW5nKHRoaXMubmFtZSwgQmluZGluZy5WQVJJQUJMRSwgdGhpcywgZmFsc2UgLypkbyBub3QgcmVzb2x2ZSBoaWRkZW4gZmllbGQqLyk7CiAJCWlmIChleGlzdGluZ1ZhcmlhYmxlICE9IG51bGwgJiYgZXhpc3RpbmdWYXJpYWJsZS5pc1ZhbGlkQmluZGluZygpKXsKIAkJCWlmIChleGlzdGluZ1ZhcmlhYmxlIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcgJiYgdGhpcy5oaWRkZW5WYXJpYWJsZURlcHRoID09IDApIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWRlZmluZUFyZ3VtZW50KHRoaXMpOwpAQCAtNTQsNiArNTUsMTQgQEAKIAogCQlpZiAodGhpcy5iaW5kaW5nID09IG51bGwpIHsKIAkJCXRoaXMuYmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyh0aGlzLCB0eXBlQmluZGluZywgdGhpcy5tb2RpZmllcnMsIHRydWUpOworCQl9IGVsc2UgaWYgKCF0aGlzLmJpbmRpbmcudHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBzY29wZS5yZWZlcmVuY2VNZXRob2QoKTsKKwkJCWlmIChtZXRob2REZWNsICE9IG51bGwpIHsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2REZWNsLmJpbmRpbmc7CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQltZXRob2RCaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNVbnJlc29sdmVkQXJndW1lbnRzOworCQkJCX0KKwkJCX0KIAkJfQogCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuYmluZGluZyk7CiAJCXJlc29sdmVBbm5vdGF0aW9ucyhzY29wZSwgdGhpcy5hbm5vdGF0aW9ucywgdGhpcy5iaW5kaW5nKTsKQEAgLTY2LDIzICs3NSwyMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24jZ2V0S2luZCgpCiAJICovCiAJcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gUEFSQU1FVEVSOworCQlyZXR1cm4gKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNBcmd1bWVudCkgIT0gMCA/IFBBUkFNRVRFUiA6IExPQ0FMX1ZBUklBQkxFOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzVmFyQXJncygpIHsKIAkJcmV0dXJuIHRoaXMudHlwZSAhPSBudWxsICYmICAodGhpcy50eXBlLmJpdHMgJiBJc1ZhckFyZ3MpICE9IDA7CiAJfQotCQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCiAJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KTsKIAkJcHJpbnRNb2RpZmllcnModGhpcy5tb2RpZmllcnMsIG91dHB1dCk7CiAJCWlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpIHByaW50QW5ub3RhdGlvbnModGhpcy5hbm5vdGF0aW9ucywgb3V0cHV0KTsKLQkJCi0JCWlmICh0eXBlID09IG51bGwpIHsKKworCQlpZiAodGhpcy50eXBlID09IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoIjxubyB0eXBlPiAiKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgewotCQkJdHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOyAKKwkJCXRoaXMudHlwZS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgnICcpOwogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKHRoaXMubmFtZSk7CiAJfQpAQCAtOTAsMzkgKzk5LDQwIEBACiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAkJcmV0dXJuIHByaW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoJzsnKTsKLQl9CQorCX0KIAogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlRm9yQ2F0Y2goQmxvY2tTY29wZSBzY29wZSkgewotCiAJCS8vIHJlc29sdXRpb24gb24gYW4gYXJndW1lbnQgb2YgYSBjYXRjaCBjbGF1c2UKIAkJLy8gcHJvdmlkZSB0aGUgc2NvcGUgd2l0aCBhIHNpZGUgZWZmZWN0IDogaW5zZXJ0aW9uIG9mIGEgTE9DQUwKIAkJLy8gdGhhdCByZXByZXNlbnRzIHRoZSBhcmd1bWVudC4gVGhlIHR5cGUgbXVzdCBiZSBmcm9tIEphdmFUaHJvd2FibGUKIAogCQlUeXBlQmluZGluZyBleGNlcHRpb25UeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKLQkJaWYgKGV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWJvb2xlYW4gaGFzRXJyb3IgPSBmYWxzZTsKLQkJaWYgKGV4Y2VwdGlvblR5cGUuaXNCb3VuZFBhcmFtZXRlcml6ZWRUeXBlKCkpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRQYXJhbWV0ZXJpemVkRXhjZXB0aW9uVHlwZShleGNlcHRpb25UeXBlLCB0aGlzKTsKKwkJYm9vbGVhbiBoYXNFcnJvcjsKKwkJaWYgKGV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgewogCQkJaGFzRXJyb3IgPSB0cnVlOwotCQkJLy8gZmFsbCB0aHJ1IHRvIGNyZWF0ZSB0aGUgdmFyaWFibGUgLSBhdm9pZHMgYWRkaXRpb25hbCBlcnJvcnMgYmVjYXVzZSB0aGUgdmFyaWFibGUgaXMgbWlzc2luZworCQl9IGVsc2UgeworCQkJaGFzRXJyb3IgPSBmYWxzZTsKKwkJCXN3aXRjaChleGNlcHRpb25UeXBlLmtpbmQoKSkgeworCQkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkJCQlpZiAoZXhjZXB0aW9uVHlwZS5pc0JvdW5kUGFyYW1ldGVyaXplZFR5cGUoKSkgeworCQkJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFBhcmFtZXRlcml6ZWRFeGNlcHRpb25UeXBlKGV4Y2VwdGlvblR5cGUsIHRoaXMpOworCQkJCQkJLy8gZmFsbCB0aHJ1IHRvIGNyZWF0ZSB0aGUgdmFyaWFibGUgLSBhdm9pZHMgYWRkaXRpb25hbCBlcnJvcnMgYmVjYXVzZSB0aGUgdmFyaWFibGUgaXMgbWlzc2luZworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlVmFyaWFibGVBc0V4Y2VwdGlvbihleGNlcHRpb25UeXBlLCB0aGlzKTsKKwkJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJCQkvLyBmYWxsIHRocnUgdG8gY3JlYXRlIHRoZSB2YXJpYWJsZSAtIGF2b2lkcyBhZGRpdGlvbmFsIGVycm9ycyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGV4Y2VwdGlvblR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShUeXBlSWRzLlRfSmF2YUxhbmdUaHJvd2FibGUsIHRydWUpID09IG51bGwgJiYgZXhjZXB0aW9uVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90VGhyb3dUeXBlKHRoaXMudHlwZSwgZXhjZXB0aW9uVHlwZSk7CisJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJCS8vIGZhbGwgdGhydSB0byBjcmVhdGUgdGhlIHZhcmlhYmxlIC0gYXZvaWRzIGFkZGl0aW9uYWwgZXJyb3JzIGJlY2F1c2UgdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcKKwkJCX0KIAkJfQotCQlpZiAoZXhjZXB0aW9uVHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZVZhcmlhYmxlQXNFeGNlcHRpb24oZXhjZXB0aW9uVHlwZSwgdGhpcyk7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCQkvLyBmYWxsIHRocnUgdG8gY3JlYXRlIHRoZSB2YXJpYWJsZSAtIGF2b2lkcyBhZGRpdGlvbmFsIGVycm9ycyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nCi0JCX0KLQkJaWYgKGV4Y2VwdGlvblR5cGUuaXNBcnJheVR5cGUoKSAmJiAoKEFycmF5QmluZGluZykgZXhjZXB0aW9uVHlwZSkubGVhZkNvbXBvbmVudFR5cGUgPT0gVHlwZUJpbmRpbmcuVk9JRCkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkQXJyYXkodGhpcyk7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCQkvLyBmYWxsIHRocnUgdG8gY3JlYXRlIHRoZSB2YXJpYWJsZSAtIGF2b2lkcyBhZGRpdGlvbmFsIGVycm9ycyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nCi0JCX0KLQkJaWYgKGV4Y2VwdGlvblR5cGUuZmluZFN1cGVyVHlwZUVyYXNpbmdUbyhUeXBlSWRzLlRfSmF2YUxhbmdUaHJvd2FibGUsIHRydWUpID09IG51bGwpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFRocm93VHlwZSh0aGlzLnR5cGUsIGV4Y2VwdGlvblR5cGUpOwotCQkJaGFzRXJyb3IgPSB0cnVlOwotCQkJLy8gZmFsbCB0aHJ1IHRvIGNyZWF0ZSB0aGUgdmFyaWFibGUgLSBhdm9pZHMgYWRkaXRpb25hbCBlcnJvcnMgYmVjYXVzZSB0aGUgdmFyaWFibGUgaXMgbWlzc2luZwotCQl9Ci0JCQotCQlCaW5kaW5nIGV4aXN0aW5nVmFyaWFibGUgPSBzY29wZS5nZXRCaW5kaW5nKG5hbWUsIEJpbmRpbmcuVkFSSUFCTEUsIHRoaXMsIGZhbHNlIC8qZG8gbm90IHJlc29sdmUgaGlkZGVuIGZpZWxkKi8pOworCQlCaW5kaW5nIGV4aXN0aW5nVmFyaWFibGUgPSBzY29wZS5nZXRCaW5kaW5nKHRoaXMubmFtZSwgQmluZGluZy5WQVJJQUJMRSwgdGhpcywgZmFsc2UgLypkbyBub3QgcmVzb2x2ZSBoaWRkZW4gZmllbGQqLyk7CiAJCWlmIChleGlzdGluZ1ZhcmlhYmxlICE9IG51bGwgJiYgZXhpc3RpbmdWYXJpYWJsZS5pc1ZhbGlkQmluZGluZygpKXsKIAkJCWlmIChleGlzdGluZ1ZhcmlhYmxlIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcgJiYgdGhpcy5oaWRkZW5WYXJpYWJsZURlcHRoID09IDApIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWRlZmluZUFyZ3VtZW50KHRoaXMpOwpAQCAtMTMwLDM5ICsxNDAsNDQgQEAKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlSGlkaW5nKHRoaXMsIGV4aXN0aW5nVmFyaWFibGUsIGZhbHNlKTsKIAkJCX0KIAkJfQotCi0JCXRoaXMuYmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyh0aGlzLCBleGNlcHRpb25UeXBlLCBtb2RpZmllcnMsIGZhbHNlKTsgLy8gYXJndW1lbnQgZGVjbCwgYnV0IGxvY2FsIHZhciAgKHdoZXJlIGlzQXJndW1lbnQgPSBmYWxzZSkKLQkJcmVzb2x2ZUFubm90YXRpb25zKHNjb3BlLCB0aGlzLmFubm90YXRpb25zLCB0aGlzLmJpbmRpbmcpOwogCQkKLQkJc2NvcGUuYWRkTG9jYWxWYXJpYWJsZShiaW5kaW5nKTsKLQkJYmluZGluZy5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOworCQlpZiAoKHRoaXMudHlwZS5iaXRzICYgQVNUTm9kZS5Jc1VuaW9uVHlwZSkgIT0gMCkgeworCQkJdGhpcy5iaW5kaW5nID0gbmV3IENhdGNoUGFyYW1ldGVyQmluZGluZyh0aGlzLCBleGNlcHRpb25UeXBlLCB0aGlzLm1vZGlmaWVycyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCwgZmFsc2UpOyAvLyBhcmd1bWVudCBkZWNsLCBidXQgbG9jYWwgdmFyICAod2hlcmUgaXNBcmd1bWVudCA9IGZhbHNlKQorCQkJdGhpcy5iaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5NdWx0aUNhdGNoUGFyYW1ldGVyOworCQl9IGVsc2UgeworCQkJdGhpcy5iaW5kaW5nID0gbmV3IENhdGNoUGFyYW1ldGVyQmluZGluZyh0aGlzLCBleGNlcHRpb25UeXBlLCB0aGlzLm1vZGlmaWVycywgZmFsc2UpOyAvLyBhcmd1bWVudCBkZWNsLCBidXQgbG9jYWwgdmFyICAod2hlcmUgaXNBcmd1bWVudCA9IGZhbHNlKQorCQl9CisJCXJlc29sdmVBbm5vdGF0aW9ucyhzY29wZSwgdGhpcy5hbm5vdGF0aW9ucywgdGhpcy5iaW5kaW5nKTsKKworCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuYmluZGluZyk7CisJCXRoaXMuYmluZGluZy5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOwogCQlpZiAoaGFzRXJyb3IpIHJldHVybiBudWxsOwogCQlyZXR1cm4gZXhjZXB0aW9uVHlwZTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAJCQkJaW50IGFubm90YXRpb25zTGVuZ3RoID0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc0xlbmd0aDsgaSsrKQogCQkJCQl0aGlzLmFubm90YXRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCX0KLQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAodGhpcy50eXBlICE9IG51bGwpCisJCQkJdGhpcy50eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9CiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewogCQkJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkJCWludCBhbm5vdGF0aW9uc0xlbmd0aCA9IHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNMZW5ndGg7IGkrKykKIAkJCQkJdGhpcy5hbm5vdGF0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQl9Ci0JCQlpZiAodHlwZSAhPSBudWxsKQotCQkJCXR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKHRoaXMudHlwZSAhPSBudWxsKQorCQkJCXRoaXMudHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCAyYWQ1ZWI5Li5lNjM4ZGM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0zMCw2ICszMSw5IEBACiAJCQlFeHByZXNzaW9uIGRpbTsKIAkJCWlmICgoZGltID0gdGhpcy5kaW1lbnNpb25zW2ldKSAhPSBudWxsKSB7CiAJCQkJZmxvd0luZm8gPSBkaW0uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJCWlmICgoZGltLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQkJZGltLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJaWYgKHRoaXMuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewpAQCAtNzcsNyArODEsNyBAQAogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlvdXRwdXQuYXBwZW5kKCJuZXcgIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy50eXBlLnByaW50KDAsIG91dHB1dCk7IAorCQl0aGlzLnR5cGUucHJpbnQoMCwgb3V0cHV0KTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmRpbWVuc2lvbnMubGVuZ3RoOyBpKyspIHsKIAkJCWlmICh0aGlzLmRpbWVuc2lvbnNbaV0gPT0gbnVsbCkKIAkJCQlvdXRwdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCkBAIC04NiwxMSArOTAsMTEgQEAKIAkJCQl0aGlzLmRpbWVuc2lvbnNbaV0ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCQkJb3V0cHV0LmFwcGVuZCgnXScpOwogCQkJfQotCQl9IAorCQl9CiAJCWlmICh0aGlzLmluaXRpYWxpemVyICE9IG51bGwpIHRoaXMuaW5pdGlhbGl6ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJLy8gQnVpbGQgYW4gYXJyYXkgdHlwZSByZWZlcmVuY2UgdXNpbmcgdGhlIGN1cnJlbnQgZGltZW5zaW9ucwogCQkvLyBUaGUgcGFyc2VyIGRvZXMgbm90IGNoZWNrIGZvciB0aGUgZmFjdCB0aGF0IGRpbWVuc2lvbiBtYXkgYmUgbnVsbApAQCAtOTgsNyArMTAyLDcgQEAKIAkJLy8gc28gdGhpcyBtdXN0IGJlIGNoZWNrZWQgaGVyZS4uLi4uLih0aGlzIGNvbWVzIGZyb20gYSByZWR1Y3Rpb24gdG8gTEwxIGdyYW1tYXIpCiAKIAkJVHlwZUJpbmRpbmcgcmVmZXJlbmNlVHlwZSA9IHRoaXMudHlwZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7Ci0JCQorCiAJCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgZGltZW5zaW9ucyBhcmUgY2hlY2tlZAogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlpZiAocmVmZXJlbmNlVHlwZSA9PSBUeXBlQmluZGluZy5WT0lEKSB7CkBAIC0xMzIsNyArMTM2LDcgQEAKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdERlZmluZURpbWVuc2lvbnNBbmRJbml0aWFsaXplcih0aGlzKTsKIAkJfQogCi0JCS8vIGRpbWVuc2lvbnMgcmVzb2x1dGlvbiAKKwkJLy8gZGltZW5zaW9ucyByZXNvbHV0aW9uCiAJCWZvciAoaW50IGkgPSAwOyBpIDw9IGV4cGxpY2l0RGltSW5kZXg7IGkrKykgewogCQkJRXhwcmVzc2lvbiBkaW1FeHByZXNzaW9uOwogCQkJaWYgKChkaW1FeHByZXNzaW9uID0gdGhpcy5kaW1lbnNpb25zW2ldKSAhPSBudWxsKSB7CkBAIC0xNTUsNiArMTU5LDkgQEAKIAkJCQlpZiAoKHRoaXMuaW5pdGlhbGl6ZXIucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIHRoaXMucmVzb2x2ZWRUeXBlKSkgIT0gbnVsbCkKIAkJCQkJdGhpcy5pbml0aWFsaXplci5iaW5kaW5nID0gKEFycmF5QmluZGluZyl0aGlzLnJlc29sdmVkVHlwZTsKIAkJCX0KKwkJCWlmICgocmVmZXJlbmNlVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5SW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhCmluZGV4IGNmOWFmM2QuLmFmZTQxNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE3ICsxMSwxNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgQXJyYXlJbml0aWFsaXplciBleHRlbmRzIEV4cHJlc3Npb24gewotCQkKKwogCXB1YmxpYyBFeHByZXNzaW9uW10gZXhwcmVzc2lvbnM7CiAJcHVibGljIEFycmF5QmluZGluZyBiaW5kaW5nOyAvL3RoZSB0eXBlIG9mIHRoZSB7ICwgLCAsIH0KLQkKKwogCS8qKgogCSAqIEFycmF5SW5pdGlhbGl6ZXIgY29uc3RydWN0b3IgY29tbWVudC4KIAkgKi8KQEAgLTMyLDkgKzMxLDkgQEAKIAogCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKLQkJaWYgKGV4cHJlc3Npb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBleHByZXNzaW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCWZsb3dJbmZvID0gZXhwcmVzc2lvbnNbaV0uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLnVuY29uZGl0aW9uYWxJbml0cygpOworCQlpZiAodGhpcy5leHByZXNzaW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWZsb3dJbmZvID0gdGhpcy5leHByZXNzaW9uc1tpXS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGZsb3dJbmZvOwpAQCAtNDcsMTUgKzQ2LDE1IEBACiAKIAkJLy8gRmxhdHRlbiB0aGUgdmFsdWVzIGFuZCBjb21wdXRlIHRoZSBkaW1lbnNpb25zLCBieSBpdGVyYXRpbmcgaW4gZGVwdGggaW50byBuZXN0ZWQgYXJyYXkgaW5pdGlhbGl6ZXJzCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWludCBleHByZXNzaW9uTGVuZ3RoID0gKGV4cHJlc3Npb25zID09IG51bGwpID8gMDogZXhwcmVzc2lvbnMubGVuZ3RoOworCQlpbnQgZXhwcmVzc2lvbkxlbmd0aCA9ICh0aGlzLmV4cHJlc3Npb25zID09IG51bGwpID8gMDogdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7CiAJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoZXhwcmVzc2lvbkxlbmd0aCk7Ci0JCWNvZGVTdHJlYW0ubmV3QXJyYXkoYmluZGluZyk7Ci0JCWlmIChleHByZXNzaW9ucyAhPSBudWxsKSB7CisJCWNvZGVTdHJlYW0ubmV3QXJyYXkodGhpcy5iaW5kaW5nKTsKKwkJaWYgKHRoaXMuZXhwcmVzc2lvbnMgIT0gbnVsbCkgewogCQkJLy8gYmluZGluZyBpcyBhbiBBcnJheVR5cGUsIHNvIEkgY2FuIGp1c3QgZGVhbCB3aXRoIHRoZSBkaW1lbnNpb24KLQkJCWludCBlbGVtZW50c1R5cGVJRCA9IGJpbmRpbmcuZGltZW5zaW9ucyA+IDEgPyAtMSA6IGJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUuaWQ7CisJCQlpbnQgZWxlbWVudHNUeXBlSUQgPSB0aGlzLmJpbmRpbmcuZGltZW5zaW9ucyA+IDEgPyAtMSA6IHRoaXMuYmluZGluZy5sZWFmQ29tcG9uZW50VHlwZS5pZDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbkxlbmd0aDsgaSsrKSB7CiAJCQkJRXhwcmVzc2lvbiBleHByOwotCQkJCWlmICgoZXhwciA9IGV4cHJlc3Npb25zW2ldKS5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAoKGV4cHIgPSB0aGlzLmV4cHJlc3Npb25zW2ldKS5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCQkJc3dpdGNoIChlbGVtZW50c1R5cGVJRCkgeyAvLyBmaWx0ZXIgb3V0IGluaXRpYWxpemF0aW9ucyB0byBkZWZhdWx0IHZhbHVlcwogCQkJCQkJY2FzZSBUX2ludCA6CiAJCQkJCQljYXNlIFRfc2hvcnQgOgpAQCAtMTEyLDEzICsxMTEsMTMgQEAKIAl9CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCisKIAkJb3V0cHV0LmFwcGVuZCgneycpOwotCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkgeyAJCi0JCQlpbnQgaiA9IDIwIDsgCi0JCQlmb3IgKGludCBpID0gMCA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGggOyBpKyspIHsJCisJCWlmICh0aGlzLmV4cHJlc3Npb25zICE9IG51bGwpIHsKKwkJCWludCBqID0gMjAgOworCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgdGhpcy5leHByZXNzaW9ucy5sZW5ndGggOyBpKyspIHsKIAkJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlleHByZXNzaW9uc1tpXS5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKKwkJCQl0aGlzLmV4cHJlc3Npb25zW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQkJCWogLS0gOwogCQkJCWlmIChqID09IDApIHsKIAkJCQkJb3V0cHV0LmFwcGVuZCgnXG4nKTsKQEAgLTEzNCwxMSArMTMzLDExIEBACiAJCS8vIEFycmF5IGluaXRpYWxpemVycyBjYW4gb25seSBvY2N1ciBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQKIAkJLy8gZXhwcmVzc2lvbiwgdGhlcmVmb3JlIHRoZSBleHBlY3RlZCB0eXBlIGNvbnRhaW5zIHRoZSB2YWxpZCBpbmZvcm1hdGlvbgogCQkvLyBjb25jZXJuaW5nIHRoZSB0eXBlIHRoYXQgbXVzdCBiZSBlbmZvcmNlZCBieSB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IGluaXRpYWxpemVyLgotCQorCiAJCS8vIHRoaXMgbWV0aG9kIGlzIHJlY3Vyc2l2ZS4uLiAodGhlIHRlc3Qgb24gaXNBcnJheVR5cGUgaXMgdGhlIHN0b3AgY2FzZSkKLQkKKwogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQkKKwogCQlpZiAoZXhwZWN0ZWRUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKSB7CiAJCQkvLyBhbGxvdyBuZXcgTGlzdDw/Pls1XQogCQkJaWYgKCh0aGlzLmJpdHMgJiBJc0Fubm90YXRpb25EZWZhdWx0VmFsdWUpID09IDApIHsgLy8gYW5ub3RhdGlvbiBkZWZhdWx0IHZhbHVlIG5lZWQgb25seSB0byBiZSBjb21tZW5zdXJhdGUgSkxTOS43CkBAIC0xNjUsMjMgKzE2NCwxOCBAQAogCQkJCWlmIChlbGVtZW50VHlwZSAhPSBleHByZXNzaW9uVHlwZSkgLy8gbXVzdCBjYWxsIGJlZm9yZSBjb21wdXRlQ29udmVyc2lvbigpIGFuZCB0eXBlTWlzbWF0Y2hFcnJvcigpCiAJCQkJCXNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZUNvbnZlcnNpb24oZWxlbWVudFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAotCQkJCWlmICgoZXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGV4cHJlc3Npb25UeXBlLCBlbGVtZW50VHlwZSkKLQkJCQkJCXx8IChlbGVtZW50VHlwZS5pc0Jhc2VUeXBlKCkgJiYgQmFzZVR5cGVCaW5kaW5nLmlzV2lkZW5pbmcoZWxlbWVudFR5cGUuaWQsIGV4cHJlc3Npb25UeXBlLmlkKSkpCisJCQkJaWYgKGV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShleHByZXNzaW9uVHlwZSwgZWxlbWVudFR5cGUpIAogCQkJCQkJfHwgZXhwcmVzc2lvblR5cGUuaXNDb21wYXRpYmxlV2l0aChlbGVtZW50VHlwZSkpIHsKIAkJCQkJZXhwcmVzc2lvbi5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgZWxlbWVudFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKLQkJCQl9IGVsc2UgaWYgKHNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoZXhwcmVzc2lvblR5cGUsIGVsZW1lbnRUeXBlKSAKLQkJCQkJCQkJCXx8IChleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkgIC8vIG5hcnJvd2luZyB0aGVuIGJveGluZyA/Ci0JCQkJCQkJCQkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgLy8gYXV0b2JveGluZwotCQkJCQkJCQkJCQkmJiAhZWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpCi0JCQkJCQkJCQkJCSYmIGV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShleHByZXNzaW9uVHlwZSwgc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShlbGVtZW50VHlwZSkpKSkgeworCQkJCX0gZWxzZSBpZiAoaXNCb3hpbmdDb21wYXRpYmxlKGV4cHJlc3Npb25UeXBlLCBlbGVtZW50VHlwZSwgZXhwcmVzc2lvbiwgc2NvcGUpKSB7CiAJCQkJCWV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIGVsZW1lbnRUeXBlLCBleHByZXNzaW9uVHlwZSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IoZXhwcmVzc2lvblR5cGUsIGVsZW1lbnRUeXBlLCBleHByZXNzaW9uKTsKLQkJCQl9IAkJCQkKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IoZXhwcmVzc2lvblR5cGUsIGVsZW1lbnRUeXBlLCBleHByZXNzaW9uLCBudWxsKTsKKwkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gdGhpcy5iaW5kaW5nOwogCQl9Ci0JCQorCiAJCS8vIGluZmVyIGluaXRpYWxpemVyIHR5cGUgZm9yIGVycm9yIHJlcG9ydGluZyBiYXNlZCBvbiBmaXJzdCBlbGVtZW50CiAJCVR5cGVCaW5kaW5nIGxlYWZFbGVtZW50VHlwZSA9IG51bGw7CiAJCWludCBkaW0gPSAxOwpAQCAtMjEyLDExICsyMDYsMTEgQEAKIAkJaWYgKGxlYWZFbGVtZW50VHlwZSAhPSBudWxsKSB7CiAJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmNyZWF0ZUFycmF5VHlwZShsZWFmRWxlbWVudFR5cGUsIGRpbSk7CiAJCQlpZiAoZXhwZWN0ZWRUeXBlICE9IG51bGwpCi0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IodGhpcy5yZXNvbHZlZFR5cGUsIGV4cGVjdGVkVHlwZSwgdGhpcyk7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IodGhpcy5yZXNvbHZlZFR5cGUsIGV4cGVjdGVkVHlwZSwgdGhpcywgbnVsbCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCBmZTUyY2EyLi44MDM5NjZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTYgKzE3LDE2IEBACiAKIHB1YmxpYyBjbGFzcyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHsKIAlpbnQgZGltZW5zaW9uczsKLQkKKwogCXB1YmxpYyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UoY2hhcltdW10gc291cmNlcyAsIGludCBkaW0sIGxvbmdbXSBwb3NzKSB7Ci0JCQorCiAJCXN1cGVyKCBzb3VyY2VzICwgcG9zcyk7Ci0JCWRpbWVuc2lvbnMgPSBkaW0gOworCQl0aGlzLmRpbWVuc2lvbnMgPSBkaW0gOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgZGltZW5zaW9ucygpIHsKLQkJCi0JCXJldHVybiBkaW1lbnNpb25zOworCisJCXJldHVybiB0aGlzLmRpbWVuc2lvbnM7CiAJfQogCiAJLyoqCkBAIC00NSwxMCArNDUsMTAgQEAKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnRva2VucywgMCwgcVBhcmFtTmFtZSwgMCwgbGVuZ3RoLTEpOwogCQlxUGFyYW1OYW1lW2xlbmd0aC0xXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMudG9rZW5zW2xlbmd0aC0xXSwgZGltQ2hhcnMpOwogCQlyZXR1cm4gcVBhcmFtTmFtZTsKLQl9CQotCQorCX0KKwogCXByb3RlY3RlZCBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewotCQkKKwogCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkKIAkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJaWYgKHRoaXMuZGltZW5zaW9ucyA+IDI1NSkgewpAQCAtNTgsNyArNTgsMTAgQEAKIAkJdHJ5IHsKIAkJCWVudi5taXNzaW5nQ2xhc3NGaWxlTG9jYXRpb24gPSB0aGlzOwogCQkJVHlwZUJpbmRpbmcgbGVhZkNvbXBvbmVudFR5cGUgPSBzdXBlci5nZXRUeXBlQmluZGluZyhzY29wZSk7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5jcmVhdGVBcnJheVR5cGUobGVhZkNvbXBvbmVudFR5cGUsIGRpbWVuc2lvbnMpOworCQkJaWYgKGxlYWZDb21wb25lbnRUeXBlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5jcmVhdGVBcnJheVR5cGUobGVhZkNvbXBvbmVudFR5cGUsIHRoaXMuZGltZW5zaW9ucyk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKIAkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CiAJCQllLnVwZGF0ZUNvbnRleHQodGhpcywgc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOwogCQkJdGhyb3cgZTsKQEAgLTY2LDMxICs2OSwzMSBAQAogCQkJZW52Lm1pc3NpbmdDbGFzc0ZpbGVMb2NhdGlvbiA9IG51bGw7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkJCisKIAkJc3VwZXIucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KTsKIAkJaWYgKCh0aGlzLmJpdHMgJiBJc1ZhckFyZ3MpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDAgOyBpIDwgZGltZW5zaW9ucyAtIDE7IGkrKykgeworCQkJZm9yIChpbnQgaT0gMCA7IGkgPCB0aGlzLmRpbWVuc2lvbnMgLSAxOyBpKyspIHsKIAkJCQlvdXRwdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlvdXRwdXQuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaT0gMCA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKwkJCWZvciAoaW50IGk9IDAgOyBpIDwgdGhpcy5kaW1lbnNpb25zOyBpKyspIHsKIAkJCQlvdXRwdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KIAkJcmV0dXJuIG91dHB1dDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkKKwogCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhCmluZGV4IGQxNzdmYTUuLmViYWQxN2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMjggKzExLDI3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiAKIHB1YmxpYyBjbGFzcyBBcnJheVJlZmVyZW5jZSBleHRlbmRzIFJlZmVyZW5jZSB7Ci0JCisKIAlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlcjsKIAlwdWJsaWMgRXhwcmVzc2lvbiBwb3NpdGlvbjsKIAotCXB1YmxpYyBBcnJheVJlZmVyZW5jZShFeHByZXNzaW9uIHJlYywgRXhwcmVzc2lvbiBwb3MpIHsKLQkJdGhpcy5yZWNlaXZlciA9IHJlYzsKLQkJdGhpcy5wb3NpdGlvbiA9IHBvczsKLQkJc291cmNlU3RhcnQgPSByZWMuc291cmNlU3RhcnQ7Ci0JfQorcHVibGljIEFycmF5UmVmZXJlbmNlKEV4cHJlc3Npb24gcmVjLCBFeHByZXNzaW9uIHBvcykgeworCXRoaXMucmVjZWl2ZXIgPSByZWM7CisJdGhpcy5wb3NpdGlvbiA9IHBvczsKKwl0aGlzLnNvdXJjZVN0YXJ0ID0gcmVjLnNvdXJjZVN0YXJ0OworfQogCi1wdWJsaWMgRmxvd0luZm8gYW5hbHlzZUFzc2lnbm1lbnQoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKLQkJRmxvd0luZm8gZmxvd0luZm8sCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCwKLQkJYm9vbGVhbiBjb21wb3VuZEFzc2lnbm1lbnQpIHsKK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gY29tcG91bmRBc3NpZ25tZW50KSB7CiAJLy8gVE9ETyAobWF4aW1lKSBvcHRpbWl6YXRpb246IHVuY29uZGl0aW9uYWxJbml0cyBpcyBhcHBsaWVkIHRvIGFsbCBleGlzdGluZyBjYWxscwogCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQlyZXR1cm4gYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwpAQCAtNDUsMTgzICs0NCwxNTkgQEAKIAkJCWFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiB9CiAKLXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCXJlY2VpdmVyLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKLQlmbG93SW5mbyA9IHJlY2VpdmVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKLQlyZXR1cm4gcG9zaXRpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwl0aGlzLnJlY2VpdmVyLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwlmbG93SW5mbyA9IHRoaXMucmVjZWl2ZXIuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCXJldHVybiB0aGlzLnBvc2l0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIH0KIAotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQXNzaWdubWVudCgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50LAotCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gKCh0eXBlW10pbnVsbClbMF0KLQkJCQkmJiAoKENhc3RFeHByZXNzaW9uKXJlY2VpdmVyKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpewotCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QocmVjZWl2ZXIucmVzb2x2ZWRUeXBlKTsgCi0JCX0JCi0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci0JCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCWNvZGVTdHJlYW0uYXJyYXlBdFB1dCh0aGlzLnJlc29sdmVkVHlwZS5pZCwgdmFsdWVSZXF1aXJlZCk7Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfQorcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gKCh0eXBlW10pbnVsbClbMF0KKwkJCSYmICgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuaW5uZXJtb3N0Q2FzdGVkRXhwcmVzc2lvbigpLnJlc29sdmVkVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKXsKKwkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZWNlaXZlci5yZXNvbHZlZFR5cGUpOwogCX0KLQotCS8qKgotCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBhcnJheSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCi0JCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCi0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgkvLyAoKHR5cGVbXSludWxsKVswXQotCQkJCSYmICgoQ2FzdEV4cHJlc3Npb24pcmVjZWl2ZXIpLmlubmVybW9zdENhc3RlZEV4cHJlc3Npb24oKS5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCl7Ci0JCQljb2RlU3RyZWFtLmNoZWNrY2FzdChyZWNlaXZlci5yZXNvbHZlZFR5cGUpOyAKLQkJfQkJCQotCQlwb3NpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJY29kZVN0cmVhbS5hcnJheUF0KHRoaXMucmVzb2x2ZWRUeXBlLmlkKTsKLQkJLy8gR2VuZXJhdGluZyBjb2RlIGZvciB0aGUgcG90ZW50aWFsIHJ1bnRpbWUgdHlwZSBjaGVja2luZwotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBpc1VuYm94aW5nID0gKGltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7Ci0JCQkvLyBjb252ZXJzaW9uIG9ubHkgZ2VuZXJhdGVkIGlmIHVuYm94aW5nCi0JCQlpZiAoaXNVbmJveGluZykgY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwotCQkJc3dpdGNoIChpc1VuYm94aW5nID8gcG9zdENvbnZlcnNpb25UeXBlKGN1cnJlbnRTY29wZSkuaWQgOiB0aGlzLnJlc29sdmVkVHlwZS5pZCkgewotCQkJCWNhc2UgVF9sb25nIDoKLQkJCQljYXNlIFRfZG91YmxlIDoKLQkJCQkJY29kZVN0cmVhbS5wb3AyKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlU3RyZWFtLnBvcCgpOwotCQkJfQotCQl9Ci0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl0aGlzLnBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwljb2RlU3RyZWFtLmFycmF5QXRQdXQodGhpcy5yZXNvbHZlZFR5cGUuaWQsIHZhbHVlUmVxdWlyZWQpOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwogCX0KK30KIAotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24sCi0JCWludCBvcGVyYXRvciwKLQkJaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sCi0JCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCi0JCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgkvLyAoKHR5cGVbXSludWxsKVswXQotCQkJCSYmICgoQ2FzdEV4cHJlc3Npb24pcmVjZWl2ZXIpLmlubmVybW9zdENhc3RlZEV4cHJlc3Npb24oKS5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCl7Ci0JCQljb2RlU3RyZWFtLmNoZWNrY2FzdChyZWNlaXZlci5yZXNvbHZlZFR5cGUpOyAKLQkJfQkKLQkJcG9zaXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCWNvZGVTdHJlYW0uZHVwMigpOwotCQljb2RlU3RyZWFtLmFycmF5QXQodGhpcy5yZXNvbHZlZFR5cGUuaWQpOwotCQlpbnQgb3BlcmF0aW9uVHlwZUlEOwotCQlzd2l0Y2gob3BlcmF0aW9uVHlwZUlEID0gKGltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgewotCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKLQkJCWNhc2UgVF9KYXZhTGFuZ09iamVjdCA6Ci0JCQljYXNlIFRfdW5kZWZpbmVkIDoKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQ29uY2F0ZW5hdGlvbkFwcGVuZChjdXJyZW50U2NvcGUsIG51bGwsIGV4cHJlc3Npb24pOworLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGEgYXJyYXkgcmVmZXJlbmNlCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJaWYgKHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgkvLyAoKHR5cGVbXSludWxsKVswXQorCQkJJiYgKChDYXN0RXhwcmVzc2lvbil0aGlzLnJlY2VpdmVyKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpeworCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLnJlY2VpdmVyLnJlc29sdmVkVHlwZSk7CisJfQorCXRoaXMucG9zaXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJY29kZVN0cmVhbS5hcnJheUF0KHRoaXMucmVzb2x2ZWRUeXBlLmlkKTsKKwkvLyBHZW5lcmF0aW5nIGNvZGUgZm9yIHRoZSBwb3RlbnRpYWwgcnVudGltZSB0eXBlIGNoZWNraW5nCisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJfSBlbHNlIHsKKwkJYm9vbGVhbiBpc1VuYm94aW5nID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMDsKKwkJLy8gY29udmVyc2lvbiBvbmx5IGdlbmVyYXRlZCBpZiB1bmJveGluZworCQlpZiAoaXNVbmJveGluZykgY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJCXN3aXRjaCAoaXNVbmJveGluZyA/IHBvc3RDb252ZXJzaW9uVHlwZShjdXJyZW50U2NvcGUpLmlkIDogdGhpcy5yZXNvbHZlZFR5cGUuaWQpIHsKKwkJCWNhc2UgVF9sb25nIDoKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCWNvZGVTdHJlYW0ucG9wMigpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6Ci0JCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQkvLyBnZW5lcmF0ZSB0aGUgaW5jcmVtZW50IHZhbHVlICh3aWxsIGJ5IGl0c2VsZiAgYmUgcHJvbW90ZWQgdG8gdGhlIG9wZXJhdGlvbiB2YWx1ZSkKLQkJCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSkgeyAvLyBwcmVmaXggb3BlcmF0aW9uCi0JCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgotCQkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKG9wZXJhdG9yLCBvcGVyYXRpb25UeXBlSUQpOwotCQkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLnBvcCgpOwogCQl9Ci0JCWNvZGVTdHJlYW0uYXJyYXlBdFB1dCh0aGlzLnJlc29sdmVkVHlwZS5pZCwgdmFsdWVSZXF1aXJlZCk7CiAJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CiAKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCi0JCUNvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LAotCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQotCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gKCh0eXBlW10pbnVsbClbMF0KLQkJCQkmJiAoKENhc3RFeHByZXNzaW9uKXJlY2VpdmVyKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpewotCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QocmVjZWl2ZXIucmVzb2x2ZWRUeXBlKTsgCi0JCX0JCi0JCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQljb2RlU3RyZWFtLmR1cDIoKTsKLQkJY29kZVN0cmVhbS5hcnJheUF0KHRoaXMucmVzb2x2ZWRUeXBlLmlkKTsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWlmICgodGhpcy5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykKLQkJCQl8fCAodGhpcy5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gKCh0eXBlW10pbnVsbClbMF0KKwkJCSYmICgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuaW5uZXJtb3N0Q2FzdGVkRXhwcmVzc2lvbigpLnJlc29sdmVkVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKXsKKwkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZWNlaXZlci5yZXNvbHZlZFR5cGUpOworCX0KKwl0aGlzLnBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWNvZGVTdHJlYW0uZHVwMigpOworCWNvZGVTdHJlYW0uYXJyYXlBdCh0aGlzLnJlc29sdmVkVHlwZS5pZCk7CisJaW50IG9wZXJhdGlvblR5cGVJRDsKKwlzd2l0Y2gob3BlcmF0aW9uVHlwZUlEID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5JTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsKKwkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKKwkJY2FzZSBUX0phdmFMYW5nT2JqZWN0IDoKKwkJY2FzZSBUX3VuZGVmaW5lZCA6CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQ29uY2F0ZW5hdGlvbkFwcGVuZChjdXJyZW50U2NvcGUsIG51bGwsIGV4cHJlc3Npb24pOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJCQkvLyBnZW5lcmF0ZSB0aGUgaW5jcmVtZW50IHZhbHVlICh3aWxsIGJ5IGl0c2VsZiAgYmUgcHJvbW90ZWQgdG8gdGhlIG9wZXJhdGlvbiB2YWx1ZSkKKwkJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKSB7IC8vIHByZWZpeCBvcGVyYXRpb24KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCQl9Ci0JCX0KLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwkJCi0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCgKLQkJCXBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwKLQkJCWltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgQ09NUElMRV9UWVBFX01BU0spOwotCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKAotCQkJcG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOwotCQljb2RlU3RyZWFtLmFycmF5QXRQdXQodGhpcy5yZXNvbHZlZFR5cGUuaWQsIGZhbHNlKTsKKwkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7CisJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKIAl9CisJY29kZVN0cmVhbS5hcnJheUF0UHV0KHRoaXMucmVzb2x2ZWRUeXBlLmlkLCB2YWx1ZVJlcXVpcmVkKTsKK30KKworcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIENvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gKCh0eXBlW10pbnVsbClbMF0KKwkJCSYmICgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuaW5uZXJtb3N0Q2FzdGVkRXhwcmVzc2lvbigpLnJlc29sdmVkVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKXsKKwkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZWNlaXZlci5yZXNvbHZlZFR5cGUpOworCX0KKwl0aGlzLnBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWNvZGVTdHJlYW0uZHVwMigpOworCWNvZGVTdHJlYW0uYXJyYXlBdCh0aGlzLnJlc29sdmVkVHlwZS5pZCk7CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJc3dpdGNoKHRoaXMucmVzb2x2ZWRUeXBlLmlkKSB7CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCWJyZWFrOworCQl9CisJfQorCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCgKKwkJcG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LAorCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkNPTVBJTEVfVFlQRV9NQVNLKTsKKwljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKAorCQlwb3N0SW5jcmVtZW50LnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5hcnJheUF0UHV0KHRoaXMucmVzb2x2ZWRUeXBlLmlkLCBmYWxzZSk7Cit9CiAKIHB1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgewogCXJldHVybiBGbG93SW5mby5VTktOT1dOOwogfQogCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCXRoaXMucmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCdbJyk7CisJcmV0dXJuIHRoaXMucG9zaXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCddJyk7Cit9CiAKLQkJcmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCdbJyk7Ci0JCXJldHVybiBwb3NpdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJ10nKTsKLQl9IAotCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24JLy8gbm8gY2FzdCBjaGVjayBmb3IgKCh0eXBlW10pbnVsbClbMF0KLQkJCQkmJiAoKENhc3RFeHByZXNzaW9uKXJlY2VpdmVyKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgewotCQkJdGhpcy5yZWNlaXZlci5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgotCQl9CQkKLQkJVHlwZUJpbmRpbmcgYXJyYXlUeXBlID0gcmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQlpZiAoYXJyYXlUeXBlICE9IG51bGwpIHsKLQkJCXJlY2VpdmVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBhcnJheVR5cGUsIGFycmF5VHlwZSk7Ci0JCQlpZiAoYXJyYXlUeXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJCQlUeXBlQmluZGluZyBlbGVtZW50VHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBhcnJheVR5cGUpLmVsZW1lbnRzVHlwZSgpOwotCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gKCh0aGlzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpID09IDApID8gZWxlbWVudFR5cGUuY2FwdHVyZShzY29wZSwgdGhpcy5zb3VyY2VFbmQpIDogZWxlbWVudFR5cGU7Ci0JCQl9IGVsc2UgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KGFycmF5VHlwZSwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQkJVHlwZUJpbmRpbmcgcG9zaXRpb25UeXBlID0gcG9zaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIFR5cGVCaW5kaW5nLklOVCk7Ci0JCWlmIChwb3NpdGlvblR5cGUgIT0gbnVsbCkgewotCQkJcG9zaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLklOVCwgcG9zaXRpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJaWYgKHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgkvLyBubyBjYXN0IGNoZWNrIGZvciAoKHR5cGVbXSludWxsKVswXQorCQkJJiYgKChDYXN0RXhwcmVzc2lvbil0aGlzLnJlY2VpdmVyKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeworCQl0aGlzLnJlY2VpdmVyLmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KIAl9Ci0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCi0JCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewotCQkJcmVjZWl2ZXIudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJcG9zaXRpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCVR5cGVCaW5kaW5nIGFycmF5VHlwZSA9IHRoaXMucmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmIChhcnJheVR5cGUgIT0gbnVsbCkgeworCQl0aGlzLnJlY2VpdmVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBhcnJheVR5cGUsIGFycmF5VHlwZSk7CisJCWlmIChhcnJheVR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGUgPSAoKEFycmF5QmluZGluZykgYXJyYXlUeXBlKS5lbGVtZW50c1R5cGUoKTsKKwkJCXRoaXMucmVzb2x2ZWRUeXBlID0gKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgPT0gMCkgPyBlbGVtZW50VHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCkgOiBlbGVtZW50VHlwZTsKKwkJfSBlbHNlIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KGFycmF5VHlwZSwgdGhpcyk7CiAJCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQorCVR5cGVCaW5kaW5nIHBvc2l0aW9uVHlwZSA9IHRoaXMucG9zaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIFR5cGVCaW5kaW5nLklOVCk7CisJaWYgKHBvc2l0aW9uVHlwZSAhPSBudWxsKSB7CisJCXRoaXMucG9zaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLklOVCwgcG9zaXRpb25UeXBlKTsKKwl9CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOworfQorCitwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJdGhpcy5yZWNlaXZlci50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCXRoaXMucG9zaXRpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCX0KKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDgzNDJmNTYuLmZhNmM4ZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCwxNSArMjgsMTUgQEAKIAkgKiBAcGFyYW0gcG9zIGludAogCSAqLwogCXB1YmxpYyBBcnJheVR5cGVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgaW50IGRpbWVuc2lvbnMsIGxvbmcgcG9zKSB7Ci0JCQorCiAJCXN1cGVyKHNvdXJjZSwgcG9zKTsKIAkJdGhpcy5vcmlnaW5hbFNvdXJjZUVuZCA9IHRoaXMuc291cmNlRW5kOwogCQl0aGlzLmRpbWVuc2lvbnMgPSBkaW1lbnNpb25zIDsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGRpbWVuc2lvbnMoKSB7Ci0JCQotCQlyZXR1cm4gZGltZW5zaW9uczsKKworCQlyZXR1cm4gdGhpcy5kaW1lbnNpb25zOwogCX0KIAkvKioKIAkgKiBAcmV0dXJuIGNoYXJbXVtdCkBAIC00OSw0MyArNDksNDUgQEAKIAkJCWRpbUNoYXJzW2luZGV4XSA9ICdbJzsKIAkJCWRpbUNoYXJzW2luZGV4KzFdID0gJ10nOwogCQl9Ci0JCXJldHVybiBuZXcgY2hhcltdW117IENoYXJPcGVyYXRpb24uY29uY2F0KHRva2VuLCBkaW1DaGFycykgfTsKLQl9CQorCQlyZXR1cm4gbmV3IGNoYXJbXVtdeyBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLnRva2VuLCBkaW1DaGFycykgfTsKKwl9CiAJcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKSB7Ci0JCQotCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwotCQlpZiAoZGltZW5zaW9ucyA+IDI1NSkgeworCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCX0KKwkJaWYgKHRoaXMuZGltZW5zaW9ucyA+IDI1NSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueURpbWVuc2lvbnModGhpcyk7CiAJCX0KLQkJVHlwZUJpbmRpbmcgbGVhZkNvbXBvbmVudFR5cGUgPSBzY29wZS5nZXRUeXBlKHRva2VuKTsKLQkJcmV0dXJuIHNjb3BlLmNyZWF0ZUFycmF5VHlwZShsZWFmQ29tcG9uZW50VHlwZSwgZGltZW5zaW9ucyk7Ci0JCisJCVR5cGVCaW5kaW5nIGxlYWZDb21wb25lbnRUeXBlID0gc2NvcGUuZ2V0VHlwZSh0aGlzLnRva2VuKTsKKwkJcmV0dXJuIHNjb3BlLmNyZWF0ZUFycmF5VHlwZShsZWFmQ29tcG9uZW50VHlwZSwgdGhpcy5kaW1lbnNpb25zKTsKKwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewotCQorCiAJCXN1cGVyLnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7CiAJCWlmICgodGhpcy5iaXRzICYgSXNWYXJBcmdzKSAhPSAwKSB7Ci0JCQlmb3IgKGludCBpPSAwIDsgaSA8IGRpbWVuc2lvbnMgLSAxOyBpKyspIHsKKwkJCWZvciAoaW50IGk9IDAgOyBpIDwgdGhpcy5kaW1lbnNpb25zIC0gMTsgaSsrKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJb3V0cHV0LmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGk9IDAgOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7CisJCQlmb3IgKGludCBpPSAwIDsgaSA8IHRoaXMuZGltZW5zaW9uczsgaSsrKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fzc2VydFN0YXRlbWVudC5qYXZhCmluZGV4IGNjZGZmZjIuLmVmZWYzMzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NlcnRTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDIwNiArNywyMDUgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMxOTIwMSAtIFtudWxsXSBubyB3YXJuaW5nIHdoZW4gdW5ib3hpbmcgU2luZ2xlTmFtZVJlZmVyZW5jZSBjYXVzZXMgTlBFCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiAKIHB1YmxpYyBjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIEV4cHJlc3Npb24gYXNzZXJ0RXhwcmVzc2lvbiwgZXhjZXB0aW9uQXJndW1lbnQ7CiAKIAkvLyBmb3IgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCiAJaW50IHByZUFzc2VydEluaXRTdGF0ZUluZGV4ID0gLTE7CiAJcHJpdmF0ZSBGaWVsZEJpbmRpbmcgYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nOworCitwdWJsaWMgQXNzZXJ0U3RhdGVtZW50KAlFeHByZXNzaW9uIGV4Y2VwdGlvbkFyZ3VtZW50LCBFeHByZXNzaW9uIGFzc2VydEV4cHJlc3Npb24sIGludCBzdGFydFBvc2l0aW9uKSB7CisJdGhpcy5hc3NlcnRFeHByZXNzaW9uID0gYXNzZXJ0RXhwcmVzc2lvbjsKKwl0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50ID0gZXhjZXB0aW9uQXJndW1lbnQ7CisJdGhpcy5zb3VyY2VTdGFydCA9IHN0YXJ0UG9zaXRpb247CisJdGhpcy5zb3VyY2VFbmQgPSBleGNlcHRpb25Bcmd1bWVudC5zb3VyY2VFbmQ7Cit9CisKK3B1YmxpYyBBc3NlcnRTdGF0ZW1lbnQoRXhwcmVzc2lvbiBhc3NlcnRFeHByZXNzaW9uLCBpbnQgc3RhcnRQb3NpdGlvbikgeworCXRoaXMuYXNzZXJ0RXhwcmVzc2lvbiA9IGFzc2VydEV4cHJlc3Npb247CisJdGhpcy5zb3VyY2VTdGFydCA9IHN0YXJ0UG9zaXRpb247CisJdGhpcy5zb3VyY2VFbmQgPSBhc3NlcnRFeHByZXNzaW9uLnNvdXJjZUVuZDsKK30KKworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwl0aGlzLnByZUFzc2VydEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOworCisJQ29uc3RhbnQgY3N0ID0gdGhpcy5hc3NlcnRFeHByZXNzaW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCWlmICgodGhpcy5hc3NlcnRFeHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJdGhpcy5hc3NlcnRFeHByZXNzaW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CisJYm9vbGVhbiBpc09wdGltaXplZFRydWVBc3NlcnRpb24gPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOworCWJvb2xlYW4gaXNPcHRpbWl6ZWRGYWxzZUFzc2VydGlvbiA9IGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOwogCQotCXB1YmxpYyBBc3NlcnRTdGF0ZW1lbnQoCi0JCUV4cHJlc3Npb24gZXhjZXB0aW9uQXJndW1lbnQsCi0JCUV4cHJlc3Npb24gYXNzZXJ0RXhwcmVzc2lvbiwKLQkJaW50IHN0YXJ0UG9zaXRpb24pIHsKLQkJCQotCQl0aGlzLmFzc2VydEV4cHJlc3Npb24gPSBhc3NlcnRFeHByZXNzaW9uOwotCQl0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50ID0gZXhjZXB0aW9uQXJndW1lbnQ7Ci0JCXNvdXJjZVN0YXJ0ID0gc3RhcnRQb3NpdGlvbjsKLQkJc291cmNlRW5kID0gZXhjZXB0aW9uQXJndW1lbnQuc291cmNlRW5kOworCWZsb3dDb250ZXh0LnRhZ0JpdHMgfD0gRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORzsKKwlGbG93SW5mbyBjb25kaXRpb25GbG93SW5mbyA9IHRoaXMuYXNzZXJ0RXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOworCWZsb3dDb250ZXh0LnRhZ0JpdHMgJj0gfkZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkc7CisJVW5jb25kaXRpb25hbEZsb3dJbmZvIGFzc2VydFdoZW5UcnVlSW5mbyA9IGNvbmRpdGlvbkZsb3dJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwlGbG93SW5mbyBhc3NlcnRJbmZvID0gY29uZGl0aW9uRmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKTsKKwlpZiAoaXNPcHRpbWl6ZWRUcnVlQXNzZXJ0aW9uKSB7CisJCWFzc2VydEluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwogCX0KIAotCXB1YmxpYyBBc3NlcnRTdGF0ZW1lbnQoRXhwcmVzc2lvbiBhc3NlcnRFeHByZXNzaW9uLCBpbnQgc3RhcnRQb3NpdGlvbikgeworCWlmICh0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKKwkJLy8gb25seSBnZXRzIGV2YWx1YXRlZCB3aGVuIGVzY2FwaW5nIC0gcmVzdWx0cyBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudAorCQlGbG93SW5mbyBleGNlcHRpb25JbmZvID0gdGhpcy5leGNlcHRpb25Bcmd1bWVudC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBhc3NlcnRJbmZvLmNvcHkoKSk7CiAKLQkJdGhpcy5hc3NlcnRFeHByZXNzaW9uID0gYXNzZXJ0RXhwcmVzc2lvbjsKLQkJc291cmNlU3RhcnQgPSBzdGFydFBvc2l0aW9uOwotCQlzb3VyY2VFbmQgPSBhc3NlcnRFeHByZXNzaW9uLnNvdXJjZUVuZDsKLQl9Ci0KLQlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKLQkJRmxvd0luZm8gZmxvd0luZm8pIHsKLQkJCQotCQlwcmVBc3NlcnRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKLQotCQlDb25zdGFudCBjc3QgPSB0aGlzLmFzc2VydEV4cHJlc3Npb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CQkKLQkJYm9vbGVhbiBpc09wdGltaXplZFRydWVBc3NlcnRpb24gPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwotCQlib29sZWFuIGlzT3B0aW1pemVkRmFsc2VBc3NlcnRpb24gPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZTsKLQotCQlGbG93SW5mbyBhc3NlcnRSYXdJbmZvID0gYXNzZXJ0RXhwcmVzc2lvbi4KLQkJCWFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLmNvcHkoKSk7Ci0JCVVuY29uZGl0aW9uYWxGbG93SW5mbyBhc3NlcnRXaGVuVHJ1ZUluZm8gPSBhc3NlcnRSYXdJbmZvLmluaXRzV2hlblRydWUoKS4KLQkJCXVuY29uZGl0aW9uYWxJbml0cygpOwotCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gYXNzZXJ0SW5mbyA9IGFzc2VydFJhd0luZm8udW5jb25kaXRpb25hbENvcHkoKTsKLQkJaWYgKGlzT3B0aW1pemVkVHJ1ZUFzc2VydGlvbikgewotCQkJYXNzZXJ0SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOwotCQl9Ci0JCQotCQlpZiAoZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgewotCQkJLy8gb25seSBnZXRzIGV2YWx1YXRlZCB3aGVuIGVzY2FwaW5nIC0gcmVzdWx0cyBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudAotCQkJRmxvd0luZm8gZXhjZXB0aW9uSW5mbyA9IGV4Y2VwdGlvbkFyZ3VtZW50LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGFzc2VydEluZm8uY29weSgpKTsgCi0JCQkKLQkJCWlmICghaXNPcHRpbWl6ZWRUcnVlQXNzZXJ0aW9uKXsKLQkJCQlmbG93Q29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKAotCQkJCQljdXJyZW50U2NvcGUuZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpLAotCQkJCQl0aGlzLAotCQkJCQlleGNlcHRpb25JbmZvLAotCQkJCQljdXJyZW50U2NvcGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWlzT3B0aW1pemVkVHJ1ZUFzc2VydGlvbil7Ci0JCQkvLyBhZGQgdGhlIGFzc2VydCBzdXBwb3J0IGluIHRoZSBjbGluaXQKLQkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwotCQl9Ci0JCWlmIChpc09wdGltaXplZEZhbHNlQXNzZXJ0aW9uKSB7Ci0JCQlyZXR1cm4gZmxvd0luZm87IC8vIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGJlIHVucmVhY2hhYmxlCi0JCQkvLyBjaGFuZ2UgdGhpcyBpZiB3ZSBuZWVkIHRvIGNhcnJ5IG51bGwgYW5hbHlzaXMgcmVzdWx0cyBvZiB0aGUgYXNzZXJ0Ci0JCQkvLyBleHByZXNzaW9uIGRvd25zdHJlYW0KKwkJaWYgKGlzT3B0aW1pemVkVHJ1ZUFzc2VydGlvbil7CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZmFrZVJlYWNoYWJsZSh0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50KTsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiBmbG93SW5mby5tZXJnZWRXaXRoKGFzc2VydEluZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkuCi0JCQkJYWRkSW5pdGlhbGl6YXRpb25zRnJvbShhc3NlcnRXaGVuVHJ1ZUluZm8uZGlzY2FyZEluaXRpYWxpemF0aW9uSW5mbygpKTsKLQkJCS8vIGtlZXAgdGhlIG1lcmdlIGZyb20gdGhlIGluaXRpYWwgY29kZSBmb3IgdGhlIGRlZmluaXRlIGFzc2lnbm1lbnQgCi0JCQkvLyBhbmFseXNpcywgdHdlYWsgdGhlIG51bGwgcGFydCB0byBpbmZsdWVuY2UgbnVsbHMgZG93bnN0cmVhbQorCQkJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycygKKwkJCQljdXJyZW50U2NvcGUuZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpLAorCQkJCXRoaXMsCisJCQkJZXhjZXB0aW9uSW5mbywKKwkJCQljdXJyZW50U2NvcGUpOwogCQl9CiAJfQogCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKLQotCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCi0JCWlmICh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyAhPSBudWxsKSB7Ci0JCQlCcmFuY2hMYWJlbCBhc3NlcnRpb25BY3RpdmF0aW9uTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7Ci0JCQljb2RlU3RyZWFtLmdldHN0YXRpYyh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyk7Ci0JCQljb2RlU3RyZWFtLmlmbmUoYXNzZXJ0aW9uQWN0aXZhdGlvbkxhYmVsKTsKLQkJCQotCQkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbDsKLQkJCXRoaXMuYXNzZXJ0RXhwcmVzc2lvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAoZmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKSksIG51bGwgLCB0cnVlKTsKLQkJCWNvZGVTdHJlYW0ubmV3SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOwotCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCWlmIChleGNlcHRpb25Bcmd1bWVudCAhPSBudWxsKSB7Ci0JCQkJZXhjZXB0aW9uQXJndW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJY29kZVN0cmVhbS5pbnZva2VKYXZhTGFuZ0Fzc2VydGlvbkVycm9yQ29uc3RydWN0b3IoZXhjZXB0aW9uQXJndW1lbnQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5pbnZva2VKYXZhTGFuZ0Fzc2VydGlvbkVycm9yRGVmYXVsdENvbnN0cnVjdG9yKCk7Ci0JCQl9Ci0JCQljb2RlU3RyZWFtLmF0aHJvdygpOwotCQkJCi0JCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKLQkJCWlmIChwcmVBc3NlcnRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcHJlQXNzZXJ0SW5pdFN0YXRlSW5kZXgpOwotCQkJfQkKLQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKLQkJCWFzc2VydGlvbkFjdGl2YXRpb25MYWJlbC5wbGFjZSgpOwotCQl9IGVsc2UgewkJCQotCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQlpZiAocHJlQXNzZXJ0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHByZUFzc2VydEluaXRTdGF0ZUluZGV4KTsKLQkJCX0JCQkKLQkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCWlmICghaXNPcHRpbWl6ZWRUcnVlQXNzZXJ0aW9uKXsKKwkJLy8gYWRkIHRoZSBhc3NlcnQgc3VwcG9ydCBpbiB0aGUgY2xpbml0CisJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwogCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewotCi0JCWFzc2VydEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIFR5cGVCaW5kaW5nLkJPT0xFQU4pOwotCQlpZiAoZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgewotCQkJVHlwZUJpbmRpbmcgZXhjZXB0aW9uQXJndW1lbnRUeXBlID0gZXhjZXB0aW9uQXJndW1lbnQucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQkJaWYgKGV4Y2VwdGlvbkFyZ3VtZW50VHlwZSAhPSBudWxsKXsKLQkJCSAgICBpbnQgaWQgPSBleGNlcHRpb25Bcmd1bWVudFR5cGUuaWQ7Ci0JCQkgICAgc3dpdGNoKGlkKSB7Ci0JCQkJCWNhc2UgVF92b2lkIDoKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWb2lkRXhwcmVzc2lvbihleGNlcHRpb25Bcmd1bWVudCk7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCSAgICBpZCA9IFRfSmF2YUxhbmdPYmplY3Q7Ci0JCQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQkJY2FzZSBUX2J5dGUgOgotCQkJCQljYXNlIFRfY2hhciA6Ci0JCQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQljYXNlIFRfZmxvYXQgOgotCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJY2FzZSBUX2xvbmcgOgotCQkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgotCQkJCQkJZXhjZXB0aW9uQXJndW1lbnQuaW1wbGljaXRDb252ZXJzaW9uID0gKGlkIDw8IDQpICsgaWQ7Ci0JCQkJfQotCQkJfQorCWlmIChpc09wdGltaXplZEZhbHNlQXNzZXJ0aW9uKSB7CisJCXJldHVybiBmbG93SW5mbzsgLy8gaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgYmUgdW5yZWFjaGFibGUKKwkJLy8gY2hhbmdlIHRoaXMgaWYgd2UgbmVlZCB0byBjYXJyeSBudWxsIGFuYWx5c2lzIHJlc3VsdHMgb2YgdGhlIGFzc2VydAorCQkvLyBleHByZXNzaW9uIGRvd25zdHJlYW0KKwl9IGVsc2UgeworCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOworCQlpZiAoIWNvbXBpbGVyT3B0aW9ucy5pbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0cykgeworCQkJLy8ga2VlcCBqdXN0IHRoZSBpbml0aWFsaXphdGlvbnMgaW5mbywgZG9uJ3QgaW5jbHVkZSBhc3NlcnQncyBudWxsIGluZm8KKwkJCS8vIG1lcmdlIGluaXRpYWxpemF0aW9uIGluZm8ncyBhbmQgdGhlbiBhZGQgYmFjayB0aGUgbnVsbCBpbmZvIGZyb20gZmxvd0luZm8gdG8KKwkJCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbXB0eSBudWxsIGluZm8gb2YgYXNzZXJ0SW5mbyBkb2VzbnQgY2hhbmdlIGZsb3dJbmZvJ3MgbnVsbCBpbmZvLgorCQkJcmV0dXJuICgoZmxvd0luZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkubWVyZ2VkV2l0aChhc3NlcnRJbmZvLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpKS5hZGROdWxsSW5mb0Zyb20oZmxvd0luZm8pOwogCQl9CisJCXJldHVybiBmbG93SW5mby5tZXJnZWRXaXRoKGFzc2VydEluZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkuCisJCQlhZGRJbml0aWFsaXphdGlvbnNGcm9tKGFzc2VydFdoZW5UcnVlSW5mby5kaXNjYXJkSW5pdGlhbGl6YXRpb25JbmZvKCkpOworCQkvLyBrZWVwIHRoZSBtZXJnZSBmcm9tIHRoZSBpbml0aWFsIGNvZGUgZm9yIHRoZSBkZWZpbml0ZSBhc3NpZ25tZW50CisJCS8vIGFuYWx5c2lzLCB0d2VhayB0aGUgbnVsbCBwYXJ0IHRvIGluZmx1ZW5jZSBudWxscyBkb3duc3RyZWFtCiAJfQorfQogCi0JcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0KLQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCQlhc3NlcnRFeHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKLQkJCWlmIChleGNlcHRpb25Bcmd1bWVudCAhPSBudWxsKSB7Ci0JCQkJZXhjZXB0aW9uQXJndW1lbnQudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJfQotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0KLQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKLSAgICAJCQotICAgIAkJLy8gbmVlZCBhc3NlcnRpb24gZmxhZzogJGFzc2VydGlvbnNEaXNhYmxlZCBvbiBvdXRlciBtb3N0IHNvdXJjZSBjbGFzCi0gICAgCQkvLyAoaW4gY2FzZSBvZiBzdGF0aWMgbWVtYmVyIG9mIGludGVyZmFjZSwgd2lsbCB1c2UgdGhlIG91dGVybW9zdCBzdGF0aWMgbWVtYmVyIC0gYnVnIDIyMzM0KQotICAgIAkJU291cmNlVHlwZUJpbmRpbmcgb3V0ZXJNb3N0Q2xhc3MgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkJd2hpbGUgKG91dGVyTW9zdENsYXNzLmlzTG9jYWxUeXBlKCkpIHsKLSAgICAJCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZyA9IG91dGVyTW9zdENsYXNzLmVuY2xvc2luZ1R5cGUoKTsKLSAgICAJCQlpZiAoZW5jbG9zaW5nID09IG51bGwgfHwgZW5jbG9zaW5nLmlzSW50ZXJmYWNlKCkpIGJyZWFrOwotICAgIAkJCW91dGVyTW9zdENsYXNzID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBlbmNsb3Npbmc7Ci0gICAgCQl9Ci0gICAgCi0gICAgCQl0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyA9IG91dGVyTW9zdENsYXNzLmFkZFN5bnRoZXRpY0ZpZWxkRm9yQXNzZXJ0KGN1cnJlbnRTY29wZSk7Ci0gICAgCi0gICAgCQkvLyBmaW5kIDxjbGluaXQ+IGFuZCBlbmFibGUgYXNzZXJ0aW9uIHN1cHBvcnQKLSAgICAJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBvdXRlck1vc3RDbGFzcy5zY29wZS5yZWZlcmVuY2VUeXBlKCk7Ci0gICAgCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwotICAgIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLSAgICAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0gICAgCQkJaWYgKG1ldGhvZC5pc0NsaW5pdCgpKSB7Ci0gICAgCQkJCSgoQ2xpbml0KSBtZXRob2QpLnNldEFzc2VydGlvblN1cHBvcnQoYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nLCBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCQkJfQotICAgIAkJfQotCQl9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKwkJcmV0dXJuOwogCX0KKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CisJaWYgKHRoaXMuYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nICE9IG51bGwpIHsKKwkJQnJhbmNoTGFiZWwgYXNzZXJ0aW9uQWN0aXZhdGlvbkxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgdGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCWNvZGVTdHJlYW0uaWZuZShhc3NlcnRpb25BY3RpdmF0aW9uTGFiZWwpOwogCi0JCXByaW50SW5kZW50KHRhYiwgb3V0cHV0KTsKLQkJb3V0cHV0LmFwcGVuZCgiYXNzZXJ0ICIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuYXNzZXJ0RXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKKwkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbDsKKwkJdGhpcy5hc3NlcnRFeHByZXNzaW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIChmYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pKSwgbnVsbCAsIHRydWUpOworCQljb2RlU3RyZWFtLm5ld0phdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJY29kZVN0cmVhbS5kdXAoKTsKIAkJaWYgKHRoaXMuZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgewotCQkJb3V0cHV0LmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5leGNlcHRpb25Bcmd1bWVudC5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKKwkJCXRoaXMuZXhjZXB0aW9uQXJndW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQljb2RlU3RyZWFtLmludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3Rvcih0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4Rik7CisJCX0gZWxzZSB7CisJCQljb2RlU3RyZWFtLmludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IoKTsKIAkJfQotCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnOycpOworCQljb2RlU3RyZWFtLmF0aHJvdygpOworCisJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQlpZiAodGhpcy5wcmVBc3NlcnRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZUFzc2VydEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCWFzc2VydGlvbkFjdGl2YXRpb25MYWJlbC5wbGFjZSgpOworCX0gZWxzZSB7CisJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQlpZiAodGhpcy5wcmVBc3NlcnRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZUFzc2VydEluaXRTdGF0ZUluZGV4KTsKKwkJfQogCX0KLQkKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorCitwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl0aGlzLmFzc2VydEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIFR5cGVCaW5kaW5nLkJPT0xFQU4pOworCWlmICh0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKKwkJVHlwZUJpbmRpbmcgZXhjZXB0aW9uQXJndW1lbnRUeXBlID0gdGhpcy5leGNlcHRpb25Bcmd1bWVudC5yZXNvbHZlVHlwZShzY29wZSk7CisJCWlmIChleGNlcHRpb25Bcmd1bWVudFR5cGUgIT0gbnVsbCl7CisJCSAgICBpbnQgaWQgPSBleGNlcHRpb25Bcmd1bWVudFR5cGUuaWQ7CisJCSAgICBzd2l0Y2goaWQpIHsKKwkJCQljYXNlIFRfdm9pZCA6CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWb2lkRXhwcmVzc2lvbih0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50KTsKKwkJCQkJLy8kRkFMTC1USFJPVUdIJAorCQkJCWRlZmF1bHQ6CisJCQkJICAgIGlkID0gVF9KYXZhTGFuZ09iamVjdDsKKwkJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQljYXNlIFRfY2hhciA6CisJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQljYXNlIFRfZmxvYXQgOgorCQkJCWNhc2UgVF9pbnQgOgorCQkJCWNhc2UgVF9sb25nIDoKKwkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQkJCQl0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50LmltcGxpY2l0Q29udmVyc2lvbiA9IChpZCA8PCA0KSArIGlkOworCQkJfQorCQl9CisJfQorfQorCitwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJdGhpcy5hc3NlcnRFeHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJaWYgKHRoaXMuZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgeworCQkJdGhpcy5leGNlcHRpb25Bcmd1bWVudC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwl9CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9CisKK3B1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgeworCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKKwkJLy8gbmVlZCBhc3NlcnRpb24gZmxhZzogJGFzc2VydGlvbnNEaXNhYmxlZCBvbiBvdXRlciBtb3N0IHNvdXJjZSBjbGFzCisJCS8vIChpbiBjYXNlIG9mIHN0YXRpYyBtZW1iZXIgb2YgaW50ZXJmYWNlLCB3aWxsIHVzZSB0aGUgb3V0ZXJtb3N0IHN0YXRpYyBtZW1iZXIgLSBidWcgMjIzMzQpCisJCVNvdXJjZVR5cGVCaW5kaW5nIG91dGVyTW9zdENsYXNzID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJd2hpbGUgKG91dGVyTW9zdENsYXNzLmlzTG9jYWxUeXBlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nID0gb3V0ZXJNb3N0Q2xhc3MuZW5jbG9zaW5nVHlwZSgpOworCQkJaWYgKGVuY2xvc2luZyA9PSBudWxsIHx8IGVuY2xvc2luZy5pc0ludGVyZmFjZSgpKSBicmVhazsKKwkJCW91dGVyTW9zdENsYXNzID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBlbmNsb3Npbmc7CisJCX0KKwkJdGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcgPSBvdXRlck1vc3RDbGFzcy5hZGRTeW50aGV0aWNGaWVsZEZvckFzc2VydChjdXJyZW50U2NvcGUpOworCisJCS8vIGZpbmQgPGNsaW5pdD4gYW5kIGVuYWJsZSBhc3NlcnRpb24gc3VwcG9ydAorCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gb3V0ZXJNb3N0Q2xhc3Muc2NvcGUucmVmZXJlbmNlVHlwZSgpOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJaWYgKG1ldGhvZC5pc0NsaW5pdCgpKSB7CisJCQkJKChDbGluaXQpIG1ldGhvZCkuc2V0QXNzZXJ0aW9uU3VwcG9ydCh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZywgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3B1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IHRhYiwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCXByaW50SW5kZW50KHRhYiwgb3V0cHV0KTsKKwlvdXRwdXQuYXBwZW5kKCJhc3NlcnQgIik7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmFzc2VydEV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJaWYgKHRoaXMuZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgeworCQlvdXRwdXQuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCisJCXRoaXMuZXhjZXB0aW9uQXJndW1lbnQucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJfQorCXJldHVybiBvdXRwdXQuYXBwZW5kKCc7Jyk7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fzc2lnbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCmluZGV4IDljZjc4OWUuLjU0MDQ2NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhCkBAIC0xLDE4ICsxLDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqICAgICBHZW5hZHkgQmVyaW96a2luIC0gYWRkZWQgc3VwcG9ydCBmb3IgcmVwb3J0aW5nIGFzc2lnbm1lbnQgd2l0aCBubyBlZmZlY3QKKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBDb250cmlidXRpb25zIGZvciAKKyAqIAkJCQkJCQlidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKKyAqIAkJCQkJCQlidWcgMjkyNDc4IC0gUmVwb3J0IHBvdGVudGlhbGx5IG51bGwgYWNyb3NzIHZhcmlhYmxlIGFzc2lnbm1lbnQKKyAqICAgICAJCQkJCQlidWcgMzM1MDkzIC0gW2NvbXBpbGVyXVtudWxsXSBtaW5pbWFsIGhvb2sgZm9yIGZ1dHVyZSBudWxsIGFubm90YXRpb24gc3VwcG9ydAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKQEAgLTIyLDcgKzI1LDcgQEAKIAogCXB1YmxpYyBFeHByZXNzaW9uIGxoczsKIAlwdWJsaWMgRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCQkKKwogcHVibGljIEFzc2lnbm1lbnQoRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IHNvdXJjZUVuZCkgewogCS8vbGhzIGlzIGFsd2F5cyBhIHJlZmVyZW5jZSBieSBjb25zdHJ1Y3Rpb24gLAogCS8vYnV0IGlzIGJ1aWxkIGFzIGFuIGV4cHJlc3Npb24gPT0+IHRoZSBjaGVja2Nhc3QgY2Fubm90IGZhaWwKQEAgLTM0LDk3ICszNyw1NSBAQAogfQogCiBwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewotCS8vIHJlY29yZCBzZXR0aW5nIGEgdmFyaWFibGU6IHZhcmlvdXMgc2NlbmFyaWkgYXJlIHBvc3NpYmxlLCBzZXR0aW5nIGFuIGFycmF5IHJlZmVyZW5jZSwgCi0vLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAorCS8vIHJlY29yZCBzZXR0aW5nIGEgdmFyaWFibGU6IHZhcmlvdXMgc2NlbmFyaWkgYXJlIHBvc3NpYmxlLCBzZXR0aW5nIGFuIGFycmF5IHJlZmVyZW5jZSwKKy8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IKIC8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KIAlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IHRoaXMubGhzLmxvY2FsVmFyaWFibGVCaW5kaW5nKCk7CisJaWYgKCh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeworCQl0aGlzLmV4cHJlc3Npb24uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCX0KKwlmbG93SW5mbyA9ICgoUmVmZXJlbmNlKSB0aGlzLmxocykKKwkJLmFuYWx5c2VBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBmYWxzZSkKKwkJLnVuY29uZGl0aW9uYWxJbml0cygpOwogCWludCBudWxsU3RhdHVzID0gdGhpcy5leHByZXNzaW9uLm51bGxTdGF0dXMoZmxvd0luZm8pOwogCWlmIChsb2NhbCAhPSBudWxsICYmIChsb2NhbC50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLklzQmFzZVR5cGUpID09IDApIHsKIAkJaWYgKG51bGxTdGF0dXMgPT0gRmxvd0luZm8uTlVMTCkgewotCQkJZmxvd0NvbnRleHQucmVjb3JkVXNpbmdOdWxsUmVmZXJlbmNlKGN1cnJlbnRTY29wZSwgbG9jYWwsIHRoaXMubGhzLCAKKwkJCWZsb3dDb250ZXh0LnJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShjdXJyZW50U2NvcGUsIGxvY2FsLCB0aGlzLmxocywKIAkJCQlGbG93Q29udGV4dC5DQU5fT05MWV9OVUxMIHwgRmxvd0NvbnRleHQuSU5fQVNTSUdOTUVOVCwgZmxvd0luZm8pOwogCQl9CiAJfQotCWZsb3dJbmZvID0gKChSZWZlcmVuY2UpIGxocykKLQkJLmFuYWx5c2VBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBmYWxzZSkKLQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCW51bGxTdGF0dXMgPSBjaGVja0FnYWluc3ROdWxsQW5ub3RhdGlvbihjdXJyZW50U2NvcGUsIGxvY2FsLCBudWxsU3RhdHVzKTsKIAlpZiAobG9jYWwgIT0gbnVsbCAmJiAobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSA9PSAwKSB7Ci0JCXN3aXRjaChudWxsU3RhdHVzKSB7Ci0JCQljYXNlIEZsb3dJbmZvLk5VTEwgOgotCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlOdWxsKGxvY2FsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRmxvd0luZm8uTk9OX05VTEwgOgotCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseVVua25vd24obG9jYWwpOwotCQl9Ci0JCWlmIChmbG93Q29udGV4dC5pbml0c09uRmluYWxseSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2gobnVsbFN0YXR1cykgewotCQkJCWNhc2UgRmxvd0luZm8uTlVMTCA6Ci0JCQkJCWZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5Lm1hcmtBc0RlZmluaXRlbHlOdWxsKGxvY2FsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGbG93SW5mby5OT05fTlVMTCA6Ci0JCQkJCWZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5Lm1hcmtBc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZmxvd0NvbnRleHQuaW5pdHNPbkZpbmFsbHkubWFya0FzRGVmaW5pdGVseVVua25vd24obG9jYWwpOwotCQkJfQotCQl9Ci0JfQkJCisJCWZsb3dJbmZvLm1hcmtOdWxsU3RhdHVzKGxvY2FsLCBudWxsU3RhdHVzKTsKKwkJaWYgKGZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5ICE9IG51bGwpCisJCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrTnVsbFN0YXR1cyhsb2NhbCwgbnVsbFN0YXR1cyk7CisJfQogCXJldHVybiBmbG93SW5mbzsKIH0KIAogdm9pZCBjaGVja0Fzc2lnbm1lbnQoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgbGhzVHlwZSwgVHlwZUJpbmRpbmcgcmhzVHlwZSkgewogCUZpZWxkQmluZGluZyBsZWZ0RmllbGQgPSBnZXRMYXN0RmllbGQodGhpcy5saHMpOwotCWlmIChsZWZ0RmllbGQgIT0gbnVsbCAmJiAgcmhzVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMICYmIGxoc1R5cGUuaXNXaWxkY2FyZCgpICYmICgoV2lsZGNhcmRCaW5kaW5nKWxoc1R5cGUpLmJvdW5kS2luZCAhPSBXaWxkY2FyZC5TVVBFUikgeworCWlmIChsZWZ0RmllbGQgIT0gbnVsbCAmJiAgcmhzVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMICYmIChsaHNUeXBlLmtpbmQoKSA9PSBCaW5kaW5nLldJTERDQVJEX1RZUEUpICYmICgoV2lsZGNhcmRCaW5kaW5nKWxoc1R5cGUpLmJvdW5kS2luZCAhPSBXaWxkY2FyZC5TVVBFUikgewogCSAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS53aWxkY2FyZEFzc2lnbm1lbnQobGhzVHlwZSwgcmhzVHlwZSwgdGhpcy5leHByZXNzaW9uKTsKIAl9IGVsc2UgaWYgKGxlZnRGaWVsZCAhPSBudWxsICYmICFsZWZ0RmllbGQuaXNTdGF0aWMoKSAmJiBsZWZ0RmllbGQuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvKmxlbmd0aCBwc2V1ZG8gZmllbGQqLyYmIGxlZnRGaWVsZC5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSkgewogCSAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVSYXdGaWVsZEFzc2lnbm1lbnQobGVmdEZpZWxkLCByaHNUeXBlLCB0aGlzLmxocyk7CiAJfSBlbHNlIGlmIChyaHNUeXBlLm5lZWRzVW5jaGVja2VkQ29udmVyc2lvbihsaHNUeXBlKSkgewogCSAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVUeXBlQ29udmVyc2lvbih0aGlzLmV4cHJlc3Npb24sIHJoc1R5cGUsIGxoc1R5cGUpOwotCX0JCQorCX0KIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCS8vIHZhcmlvdXMgc2NlbmFyaWkgYXJlIHBvc3NpYmxlLCBzZXR0aW5nIGFuIGFycmF5IHJlZmVyZW5jZSwgCi0JLy8gYSBmaWVsZCByZWZlcmVuY2UsIGEgYmxhbmsgZmluYWwgZmllbGQgcmVmZXJlbmNlLCBhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBvciAKKwkvLyB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsCisJLy8gYSBmaWVsZCByZWZlcmVuY2UsIGEgYmxhbmsgZmluYWwgZmllbGQgcmVmZXJlbmNlLCBhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBvcgogCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KIAogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JICgoUmVmZXJlbmNlKSBsaHMpLmdlbmVyYXRlQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMsIHZhbHVlUmVxdWlyZWQpOworCSAoKFJlZmVyZW5jZSkgdGhpcy5saHMpLmdlbmVyYXRlQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMsIHZhbHVlUmVxdWlyZWQpOwogCS8vIHZhcmlhYmxlIG1heSBoYXZlIGJlZW4gb3B0aW1pemVkIG91dAogCS8vIHRoZSBsaHMgaXMgcmVzcG9uc2libGUgdG8gcGVyZm9ybSB0aGUgaW1wbGljaXRDb252ZXJzaW9uIGdlbmVyYXRpb24gZm9yIHRoZSBhc3NpZ25tZW50IHNpbmNlIG9wdGltaXplZCBmb3IgdW51c2VkIGxvY2FsIGFzc2lnbm1lbnQuCiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KIAotcHVibGljIHN0YXRpYyBCaW5kaW5nIGdldERpcmVjdEJpbmRpbmcoRXhwcmVzc2lvbiBzb21lRXhwcmVzc2lvbikgewotCWlmICgoc29tZUV4cHJlc3Npb24uYml0cyAmIEFTVE5vZGUuSWdub3JlTm9FZmZlY3RBc3NpZ25DaGVjaykgIT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgewotCQlyZXR1cm4gKChTaW5nbGVOYW1lUmVmZXJlbmNlKXNvbWVFeHByZXNzaW9uKS5iaW5kaW5nOwotCX0gZWxzZSBpZiAoc29tZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgewotCQlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChGaWVsZFJlZmVyZW5jZSlzb21lRXhwcmVzc2lvbjsKLQkJaWYgKGZpZWxkUmVmLnJlY2VpdmVyLmlzVGhpcygpICYmICEoZmllbGRSZWYucmVjZWl2ZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlKSkgewotCQkJcmV0dXJuIGZpZWxkUmVmLmJpbmRpbmc7Ci0JCX0JCQkKLQl9IGVsc2UgaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgQXNzaWdubWVudCkgewotCQlFeHByZXNzaW9uIGxocyA9ICgoQXNzaWdubWVudClzb21lRXhwcmVzc2lvbikubGhzOwotCQlpZiAoKGxocy5iaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpICE9IDApIHsKLQkJCS8vIGkgPSBpID0gLi4uOyAvLyBlcSB0byBpbnQgaSA9IC4uLjsKLQkJCXJldHVybiBnZXREaXJlY3RCaW5kaW5nICgoKEFzc2lnbm1lbnQpc29tZUV4cHJlc3Npb24pLmxocyk7Ci0JCX0gZWxzZSBpZiAoc29tZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBQcmVmaXhFeHByZXNzaW9uKSB7Ci0JCQkvLyBpID0gaSsrOyAvLyBlcSB0byArK2k7Ci0JCQlyZXR1cm4gZ2V0RGlyZWN0QmluZGluZyAoKChBc3NpZ25tZW50KXNvbWVFeHByZXNzaW9uKS5saHMpOwotCQl9Ci0JfQotLy8JCX0gZWxzZSBpZiAoc29tZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBQb3N0Zml4RXhwcmVzc2lvbikgeyAvLyByZWN1cnNlIGZvciBwb3N0Zml4OiBpKysgLS0+IGkKLS8vCQkJLy8gbm90ZTogImIgPSBiKysiIGlzIGVxdWl2YWxlbnQgdG8gZG9pbmcgbm90aGluZywgbm90IHRvICJiKysiCi0vLwkJCXJldHVybiBnZXREaXJlY3RCaW5kaW5nKCgoUG9zdGZpeEV4cHJlc3Npb24pIHNvbWVFeHByZXNzaW9uKS5saHMpOwotCXJldHVybiBudWxsOwotfQotCiBGaWVsZEJpbmRpbmcgZ2V0TGFzdEZpZWxkKEV4cHJlc3Npb24gc29tZUV4cHJlc3Npb24pIHsKICAgICBpZiAoc29tZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CiAgICAgICAgIGlmICgoc29tZUV4cHJlc3Npb24uYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spID09IEJpbmRpbmcuRklFTEQpIHsKQEAgLTE0MywxNCArMTA0LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGw7Ci19CQorfQogCiBwdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKIAlyZXR1cm4gdGhpcy5leHByZXNzaW9uLm51bGxTdGF0dXMoZmxvd0luZm8pOwogfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkvL25vICgpIHdoZW4gdXNlZCBhcyBhIHN0YXRlbWVudCAKKwkvL25vICgpIHdoZW4gdXNlZCBhcyBhIHN0YXRlbWVudAogCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KTsKIAlyZXR1cm4gcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcyhpbmRlbnQsIG91dHB1dCk7CiB9CkBAIC0xNTgsMTUgKzExOSwxNSBAQAogCS8vc3ViY2xhc3MgcmVkZWZpbmUgcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpCiAJb3V0cHV0LmFwcGVuZCgnKCcpOwogCXJldHVybiBwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzKDAsIG91dHB1dCkuYXBwZW5kKCcpJyk7Ci19IAorfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCWxocy5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKKwl0aGlzLmxocy5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gdGhpcy5leHByZXNzaW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkvL25vICgpIHdoZW4gdXNlZCBhcyBhIHN0YXRlbWVudCAKKwkvL25vICgpIHdoZW4gdXNlZCBhcyBhIHN0YXRlbWVudAogCXJldHVybiBwcmludChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCc7Jyk7CiB9CiAKQEAgLTE3Nyw0OCArMTM4LDQ4IEBACiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmV4cHJlc3Npb25TaG91bGRCZUFWYXJpYWJsZSh0aGlzLmxocyk7CiAJCXJldHVybiBudWxsOwogCX0KLQlUeXBlQmluZGluZyBsaHNUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsKKwlUeXBlQmluZGluZyBsaHNUeXBlID0gdGhpcy5saHMucmVzb2x2ZVR5cGUoc2NvcGUpOwogCXRoaXMuZXhwcmVzc2lvbi5zZXRFeHBlY3RlZFR5cGUobGhzVHlwZSk7IC8vIG5lZWRlZCBpbiBjYXNlIG9mIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24KLQlpZiAobGhzVHlwZSAhPSBudWxsKSAKKwlpZiAobGhzVHlwZSAhPSBudWxsKSB7CiAJCXRoaXMucmVzb2x2ZWRUeXBlID0gbGhzVHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCk7CisJfQorCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gdGhpcy5saHMubG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKKwlpZiAobG9jYWxWYXJpYWJsZUJpbmRpbmcgIT0gbnVsbCkgeworCQlsb2NhbFZhcmlhYmxlQmluZGluZy50YWdCaXRzICY9IH5UYWdCaXRzLklzRWZmZWN0aXZlbHlGaW5hbDsKKwl9CiAJVHlwZUJpbmRpbmcgcmhzVHlwZSA9IHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CiAJaWYgKGxoc1R5cGUgPT0gbnVsbCB8fCByaHNUeXBlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQogCS8vIGNoZWNrIGZvciBhc3NpZ25tZW50IHdpdGggbm8gZWZmZWN0CiAJQmluZGluZyBsZWZ0ID0gZ2V0RGlyZWN0QmluZGluZyh0aGlzLmxocyk7Ci0JaWYgKGxlZnQgIT0gbnVsbCAmJiBsZWZ0ID09IGdldERpcmVjdEJpbmRpbmcodGhpcy5leHByZXNzaW9uKSkgeworCWlmIChsZWZ0ICE9IG51bGwgJiYgIWxlZnQuaXNWb2xhdGlsZSgpICYmIGxlZnQgPT0gZ2V0RGlyZWN0QmluZGluZyh0aGlzLmV4cHJlc3Npb24pKSB7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFzc2lnbm1lbnRIYXNOb0VmZmVjdCh0aGlzLCBsZWZ0LnNob3J0UmVhZGFibGVOYW1lKCkpOwogCX0KIAogCS8vIENvbXBpbGUtdGltZSBjb252ZXJzaW9uIG9mIGJhc2UtdHlwZXMgOiBpbXBsaWNpdCBuYXJyb3dpbmcgaW50ZWdlciBpbnRvIGJ5dGUvc2hvcnQvY2hhcmFjdGVyCiAJLy8gbWF5IHJlcXVpcmUgdG8gd2lkZW4gdGhlIHJocyBleHByZXNzaW9uIGF0IHJ1bnRpbWUKLQlpZiAobGhzVHlwZSAhPSByaHNUeXBlKSAvLyBtdXN0IGNhbGwgYmVmb3JlIGNvbXB1dGVDb252ZXJzaW9uKCkgYW5kIHR5cGVNaXNtYXRjaEVycm9yKCkKKwlpZiAobGhzVHlwZSAhPSByaHNUeXBlKSB7IC8vIG11c3QgY2FsbCBiZWZvcmUgY29tcHV0ZUNvbnZlcnNpb24oKSBhbmQgdHlwZU1pc21hdGNoRXJyb3IoKQogCQlzY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVDb252ZXJzaW9uKGxoc1R5cGUsIHJoc1R5cGUpOwotCWlmICgodGhpcy5leHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUocmhzVHlwZSwgbGhzVHlwZSkKLQkJCXx8IChsaHNUeXBlLmlzQmFzZVR5cGUoKSAmJiBCYXNlVHlwZUJpbmRpbmcuaXNXaWRlbmluZyhsaHNUeXBlLmlkLCByaHNUeXBlLmlkKSkpCisJfQorCWlmICh0aGlzLmV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShyaHNUeXBlLCBsaHNUeXBlKQogCQkJfHwgcmhzVHlwZS5pc0NvbXBhdGlibGVXaXRoKGxoc1R5cGUpKSB7CiAJCXRoaXMuZXhwcmVzc2lvbi5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgbGhzVHlwZSwgcmhzVHlwZSk7CiAJCWNoZWNrQXNzaWdubWVudChzY29wZSwgbGhzVHlwZSwgcmhzVHlwZSk7Ci0JCWlmICh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbiAKKwkJaWYgKHRoaXMuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uCiAJCQkJJiYgKHRoaXMuZXhwcmVzc2lvbi5iaXRzICYgQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3QpID09IDApIHsKIAkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFzc2lnbmVkQ2FzdChzY29wZSwgbGhzVHlwZSwgKENhc3RFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb24pOwotCQl9CQkJCisJCX0KIAkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwotCX0gZWxzZSBpZiAoc2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aChyaHNUeXBlLCBsaHNUeXBlKSAKLQkJCQkJCXx8IChyaHNUeXBlLmlzQmFzZVR5cGUoKSAgLy8gbmFycm93aW5nIHRoZW4gYm94aW5nID8KLQkJCQkJCQkJJiYgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvLyBhdXRvYm94aW5nCi0JCQkJCQkJCSYmICFsaHNUeXBlLmlzQmFzZVR5cGUoKQotCQkJCQkJCQkmJiB0aGlzLmV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShyaHNUeXBlLCBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGxoc1R5cGUpKSkpIHsKKwl9IGVsc2UgaWYgKGlzQm94aW5nQ29tcGF0aWJsZShyaHNUeXBlLCBsaHNUeXBlLCB0aGlzLmV4cHJlc3Npb24sIHNjb3BlKSkgewogCQl0aGlzLmV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIGxoc1R5cGUsIHJoc1R5cGUpOwotCQlpZiAodGhpcy5leHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24gCisJCWlmICh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgogCQkJCSYmICh0aGlzLmV4cHJlc3Npb24uYml0cyAmIEFTVE5vZGUuVW5uZWNlc3NhcnlDYXN0KSA9PSAwKSB7CiAJCQlDYXN0RXhwcmVzc2lvbi5jaGVja05lZWRGb3JBc3NpZ25lZENhc3Qoc2NvcGUsIGxoc1R5cGUsIChDYXN0RXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uKTsKLQkJfQkJCQorCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKLQl9IAotCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHJoc1R5cGUsIGxoc1R5cGUsIHRoaXMuZXhwcmVzc2lvbik7CisJfQorCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHJoc1R5cGUsIGxoc1R5cGUsIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5saHMpOwogCXJldHVybiBsaHNUeXBlOwogfQogCkBAIC0yMjksMTEgKzE5MCwxMSBAQAogCiAJVHlwZUJpbmRpbmcgdHlwZSA9IHN1cGVyLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBleHBlY3RlZFR5cGUpOwogCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOwotCVR5cGVCaW5kaW5nIGxoc1R5cGUgPSB0aGlzLnJlc29sdmVkVHlwZTsgCisJVHlwZUJpbmRpbmcgbGhzVHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlOwogCVR5cGVCaW5kaW5nIHJoc1R5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwogCS8vIHNpZ25hbCBwb3NzaWJsZSBhY2NpZGVudGFsIGJvb2xlYW4gYXNzaWdubWVudCAoaW5zdGVhZCBvZiB1c2luZyAnPT0nIG9wZXJhdG9yKQotCWlmIChleHBlY3RlZFR5cGUgPT0gVHlwZUJpbmRpbmcuQk9PTEVBTiAKLQkJCSYmIGxoc1R5cGUgPT0gVHlwZUJpbmRpbmcuQk9PTEVBTiAKKwlpZiAoZXhwZWN0ZWRUeXBlID09IFR5cGVCaW5kaW5nLkJPT0xFQU4KKwkJCSYmIGxoc1R5cGUgPT0gVHlwZUJpbmRpbmcuQk9PTEVBTgogCQkJJiYgKHRoaXMubGhzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpICE9IDApIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQodGhpcyk7CiAJfQpAQCAtMjQzLDEyICsyMDQsMTIgQEAKIAogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCWxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCWV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQl0aGlzLmxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCXRoaXMuZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJfQogCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogfQogcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nKCkgewotCXJldHVybiBsaHMubG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKKwlyZXR1cm4gdGhpcy5saHMubG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CaW5hcnlFeHByZXNzaW9uLmphdmEKaW5kZXggODYxYWQyOS4uOThhZjEwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CaW5hcnlFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CaW5hcnlFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsOSArMTgsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIEJpbmFyeUV4cHJlc3Npb24gZXh0ZW5kcyBPcGVyYXRvckV4cHJlc3Npb24gewotCQorCiAvKiBUcmFja2luZyBoZWxwZXJzCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGVsYWJvcmF0ZSByZWFsaXN0aWMgc3RhdGlzdGljcyBhYm91dCBiaW5hcnkgCisgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGVsYWJvcmF0ZSByZWFsaXN0aWMgc3RhdGlzdGljcyBhYm91dCBiaW5hcnkKICAqIGV4cHJlc3Npb25zLiBUaGlzIG11c3QgYmUgbmV1dHJhbGl6ZWQgaW4gdGhlIHJlbGVhc2VkIGNvZGUuCiAgKiBTZWFyY2ggdGhlIGtleXdvcmQgQkVfSU5TVFJVTUVOVEFUSU9OIHRvIHJlZW5hYmxlLgogICogQW4gZXh0ZXJuYWwgZGV2aWNlIG11c3QgaW5zdGFsbCBhIHN1aXRhYmxlIHByb2JlIHNvIGFzIHRvIG1vbml0b3IgdGhlCkBAIC00MiwyMCArNDIsMjUgQEAKIAl0aGlzLnNvdXJjZVN0YXJ0ID0gbGVmdC5zb3VyY2VTdGFydDsKIAl0aGlzLnNvdXJjZUVuZCA9IHJpZ2h0LnNvdXJjZUVuZDsKIAkvLyBCRV9JTlNUUlVNRU5UQVRJT046IG5ldXRyYWxpemVkIGluIHRoZSByZWxlYXNlZCBjb2RlCi0vLwlpZiAobGVmdCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24gJiYgCisvLwlpZiAobGVmdCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24gJiYKIC8vCQkJKChsZWZ0LmJpdHMgJiBPcGVyYXRvck1BU0spIF4gKHRoaXMuYml0cyAmIE9wZXJhdG9yTUFTSykpID09IDApIHsKIC8vCQl0aGlzLmRlcHRoVHJhY2tlciA9ICgoQmluYXJ5RXhwcmVzc2lvbilsZWZ0KS5kZXB0aFRyYWNrZXIgKyAxOwogLy8JfSBlbHNlIHsKIC8vCQl0aGlzLmRlcHRoVHJhY2tlciA9IDE7CiAvLwl9CiB9Ci0KLXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIAotCQlGbG93SW5mbyBmbG93SW5mbykgeworcHVibGljIEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJdGhpcy5sZWZ0ID0gZXhwcmVzc2lvbi5sZWZ0OworCXRoaXMucmlnaHQgPSBleHByZXNzaW9uLnJpZ2h0OworCXRoaXMuYml0cyA9IGV4cHJlc3Npb24uYml0czsKKwl0aGlzLnNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwl0aGlzLnNvdXJjZUVuZCA9IGV4cHJlc3Npb24uc291cmNlRW5kOworfQorcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aCBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24jYW5hbHlzZUNvZGUKIAlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7CiAJCXJldHVybiB0aGlzLnJpZ2h0LmFuYWx5c2VDb2RlKAotCQkJCQkJCWN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIAorCQkJCQkJCWN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsCiAJCQkJCQkJdGhpcy5sZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkKIAkJCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAl9IGVsc2UgewpAQCAtODUsNyArOTAsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJLy9hZGQgc29tZSB3b3JrIGZvciB0aGUgYm9vbGVhbiBvcGVyYXRvcnMgJiB8ICAKKwkJLy9hZGQgc29tZSB3b3JrIGZvciB0aGUgYm9vbGVhbiBvcGVyYXRvcnMgJiB8CiAJCXRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KAogCQkJbGVmdElkLAogCQkJKHRoaXMuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQsCkBAIC0xMTUsNyArMTIwLDcgQEAKIAkJY2FzZSBQTFVTIDoKIAkJCXN3aXRjaCAodGhpcy5iaXRzICYgQVNUTm9kZS5SZXR1cm5UeXBlSURNQVNLKSB7CiAJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKLQkJCQkJLy8gQkVfSU5TVFJVTUVOVEFUSU9OOiBuZXV0cmFsaXplZCBpbiB0aGUgcmVsZWFzZWQgY29kZQkJCQkJCisJCQkJCS8vIEJFX0lOU1RSVU1FTlRBVElPTjogbmV1dHJhbGl6ZWQgaW4gdGhlIHJlbGVhc2VkIGNvZGUKIC8vCQkJCQlpZiAocHJvYmUgIT0gbnVsbCkgewogLy8JCQkJCQlwcm9iZS5waW5nKHRoaXMuZGVwdGhUcmFja2VyKTsKIC8vCQkJCQl9CkBAIC02NjQsNyArNjY5LDcgQEAKIAkJCQl9CiAJCQl9CiAJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQlyZXR1cm47CiAJCX0KIAkJLy8geCA+IDAKQEAgLTY4Niw3ICs2OTEsNyBAQAogCQkJCX0KIAkJCX0KIAkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTcxNCw3ICs3MTksNyBAQAogCQkJCQkJY29kZVN0cmVhbS5pZmd0KHRydWVMYWJlbCk7CiAJCQkJfQogCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTczNyw3ICs3NDIsNyBAQAogCQkJCQkJY29kZVN0cmVhbS5pZmxlKGZhbHNlTGFiZWwpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKQEAgLTc3Miw3ICs3NzcsNyBAQAogCQkJCX0KIAkJCX0KIAkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJfQogCQkvLyB4ID49IDAKQEAgLTc5NCw3ICs3OTksNyBAQAogCQkJCX0KIAkJCX0KIAkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTgyMiw3ICs4MjcsNyBAQAogCQkJCQkJY29kZVN0cmVhbS5pZmdlKHRydWVMYWJlbCk7CiAJCQkJfQogCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTg0NSw3ICs4NTAsNyBAQAogCQkJCQkJY29kZVN0cmVhbS5pZmx0KGZhbHNlTGFiZWwpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKQEAgLTk4NCw3ICs5ODksNyBAQAogCQkJCX0KIAkJCX0KIAkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJfQogCQkvLyB4IDw9IDAKQEAgLTEwMDYsNyArMTAxMSw3IEBACiAJCQkJfQogCQkJfQogCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMTAzNCw3ICsxMDM5LDcgQEAKIAkJCQkJCWNvZGVTdHJlYW0uaWZsZSh0cnVlTGFiZWwpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xMDU3LDcgKzEwNjIsNyBAQAogCQkJCQkJY29kZVN0cmVhbS5pZmd0KGZhbHNlTGFiZWwpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKQEAgLTEwODUsMTAgKzEwOTAsMTAgQEAKIAkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCX0KIAkJCXJldHVybjsKLQkJfSAKKwkJfQogCQlpZiAoKGNvbmRDb25zdCA9IHRoaXMucmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJLy8geCAmIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPgpAQCAtMTEwMiw3ICsxMTA3LDcgQEAKIAkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOwogCQkJCX0KIAkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCX0KIAkJCXJldHVybjsKIAkJfQpAQCAtMTExNCw3ICsxMTE5LDcgQEAKIAkJY29kZVN0cmVhbS5pYW5kKCk7CiAJfQogCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogfQogCiAvKioKQEAgLTExMzIsNyArMTEzNyw3IEBACiAJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKIAkJCQl9CiAJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQl9IGVsc2UgewogCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4gfCB4CiAJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKQEAgLTExNDksNyArMTE1NCw3IEBACiAJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKIAkJCQl9CiAJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQl9IGVsc2UgewogCQkJCS8vIHggfCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CiAJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwpAQCAtMTE2NSw3ICsxMTcwLDcgQEAKIAkJY29kZVN0cmVhbS5pb3IoKTsKIAl9CiAJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiB9CiAKIC8qKgpAQCAtMTE4NCw3ICsxMTg5LDcgQEAKIAkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCWNvZGVTdHJlYW0uaXhvcigpOyAvLyBuZWdhdGUKLQkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4gXiB4CkBAIC0xMjAxLDcgKzEyMDYsNyBAQAogCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKIAkJCQkJY29kZVN0cmVhbS5peG9yKCk7IC8vIG5lZ2F0ZQotCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLy8geCBeIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4KQEAgLTEyMTgsOCArMTIyMyw4IEBACiAJCWNvZGVTdHJlYW0uaXhvcigpOwogCX0KIAkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQotfQkKKwljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7Cit9CiAKIC8qKgogICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciAmCkBAIC0xMjYzLDcgKzEyNjgsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJfQogCQkJcmV0dXJuOwogCQl9CkBAIC0xMzA1LDcgKzEzMTAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJfQogCQkJcmV0dXJuOwogCQl9CkBAIC0xMzMwLDcgKzEzMzUsNyBAQAogCQl9CiAJfQogCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCi0JY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCisJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogfQogCiAvKioKQEAgLTEzNjIsNyArMTM2Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQl9IGVsc2UgewogCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4gfCB4CiAJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKQEAgLTE0MDMsNyArMTQwOCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQl9IGVsc2UgewogCQkJCS8vIHggfCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CiAJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKQEAgLTE0NDIsNyArMTQ0Nyw3IEBACiAJCX0KIAl9CiAJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CiB9CiAKIC8qKgpAQCAtMTUzNiw3ICsxNTQxLDcgQEAKIAkJfQogCX0KIAkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQorCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uKEJsb2NrU2NvcGUgYmxvY2tTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBpbnQgdHlwZUlEKSB7CkBAIC0xNTc1LDcgKzE1ODAsNyBAQAogCS8vIGtlZXAgaW1wbGVtZW50YXRpb24gaW4gc3luYyB3aXRoIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbgogCS8vICNnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb25DcmVhdGlvbgogCS8qIEluIHRoZSBjYXNlIHRyeWluZyB0byBtYWtlIGEgc3RyaW5nIGNvbmNhdGVuYXRpb24sIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3Ci0JICogc3RyaW5nIGJ1ZmZlciwgdGh1cyB1c2UgYSBsb3dlci1sZXZlbCBBUEkgZm9yIGNvZGUgZ2VuZXJhdGlvbiBpbnZvbHZpbmcgb25seSB0aGUgCisJICogc3RyaW5nIGJ1ZmZlciwgdGh1cyB1c2UgYSBsb3dlci1sZXZlbCBBUEkgZm9yIGNvZGUgZ2VuZXJhdGlvbiBpbnZvbHZpbmcgb25seSB0aGUKIAkgKiBhcHBlbmRpbmcgb2YgYXJndW1lbnRzIHRvIHRoZSBleGlzdGluZyBTdHJpbmdCdWZmZXIKIAkgKi8KIAlpZiAoKCgodGhpcy5iaXRzICYgQVNUTm9kZS5PcGVyYXRvck1BU0spID4+IEFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0gT3BlcmF0b3JJZHMuUExVUykKQEAgLTE2MTAsOSArMTYxNSw5IEBACiB9CiAKIC8qKgotICogU2VwYXJhdGVzIGludG8gYSByZXVzYWJsZSBtZXRob2QgdGhlIHN1YnBhcnQgb2Yge0BsaW5rIAotICogI3Jlc29sdmVUeXBlKEJsb2NrU2NvcGUpfSB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIHdoaWxlIGNsaW1iaW5nIHVwIHRoZSAKLSAqIGNoYWluIG9mIGV4cHJlc3Npb25zIG9mIHRoaXMnIGxlZnRtb3N0IGJyYW5jaC4gRm9yIHVzZSBieSB7QGxpbmsgCisgKiBTZXBhcmF0ZXMgaW50byBhIHJldXNhYmxlIG1ldGhvZCB0aGUgc3VicGFydCBvZiB7QGxpbmsKKyAqICNyZXNvbHZlVHlwZShCbG9ja1Njb3BlKX0gdGhhdCBuZWVkcyB0byBiZSBleGVjdXRlZCB3aGlsZSBjbGltYmluZyB1cCB0aGUKKyAqIGNoYWluIG9mIGV4cHJlc3Npb25zIG9mIHRoaXMnIGxlZnRtb3N0IGJyYW5jaC4gRm9yIHVzZSBieSB7QGxpbmsKICAqIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiNyZXNvbHZlVHlwZShCbG9ja1Njb3BlKX0uCiAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHdpdGhpbiB3aGljaCB0aGUgcmVzb2x1dGlvbiBvY2N1cnMKICAqLwpAQCAtMTYyMCw3ICsxNjI1LDcgQEAKIAkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aCBCaW5hcnlFeHByZXNzaW9uI3Jlc29sdmVUeXBlCiAJYm9vbGVhbiBsZWZ0SXNDYXN0LCByaWdodElzQ2FzdDsKIAlUeXBlQmluZGluZyBsZWZ0VHlwZSA9IHRoaXMubGVmdC5yZXNvbHZlZFR5cGU7Ci0JCisKIAlpZiAoKHJpZ2h0SXNDYXN0ID0gdGhpcy5yaWdodCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSA9PSB0cnVlKSB7CiAJCXRoaXMucmlnaHQuYml0cyB8PSBBU1ROb2RlLkRpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgogCX0KQEAgLTE2NzgsNyArMTY4Myw3IEBACiAJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCiAKIAkvLyBEb24ndCB0ZXN0IGZvciByZXN1bHQgPSAwLiBJZiBpdCBpcyB6ZXJvLCBzb21lIG1vcmUgd29yayBpcyBkb25lLgotCS8vIE9uIHRoZSBvbmUgaGFuZCB3aGVuIGl0IGlzIG5vdCB6ZXJvIChjb3JyZWN0IGNvZGUpIHdlIGF2b2lkIGRvaW5nIHRoZSB0ZXN0CQorCS8vIE9uIHRoZSBvbmUgaGFuZCB3aGVuIGl0IGlzIG5vdCB6ZXJvIChjb3JyZWN0IGNvZGUpIHdlIGF2b2lkIGRvaW5nIHRoZSB0ZXN0CiAJaW50IG9wZXJhdG9yID0gKHRoaXMuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQ7CiAJaW50IG9wZXJhdG9yU2lnbmF0dXJlID0gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU2lnbmF0dXJlc1tvcGVyYXRvcl1bKGxlZnRUeXBlSUQgPDwgNCkgKyByaWdodFR5cGVJRF07CiAKQEAgLTE3MTgsNyArMTcyMyw3IEBACiAJfQogCiAJLy8gY2hlY2sgbmVlZCBmb3Igb3BlcmFuZCBjYXN0Ci0JaWYgKChsZWZ0SXNDYXN0ID0gKHRoaXMubGVmdCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSkgPT0gdHJ1ZSB8fCAKKwlpZiAoKGxlZnRJc0Nhc3QgPSAodGhpcy5sZWZ0IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pKSA9PSB0cnVlIHx8CiAJCQlyaWdodElzQ2FzdCkgewogCQlDYXN0RXhwcmVzc2lvbi5jaGVja05lZWRGb3JBcmd1bWVudENhc3RzKHNjb3BlLCBvcGVyYXRvciwgb3BlcmF0b3JTaWduYXR1cmUsIHRoaXMubGVmdCwgbGVmdFR5cGVJRCwgbGVmdElzQ2FzdCwgdGhpcy5yaWdodCwgcmlnaHRUeXBlSUQsIHJpZ2h0SXNDYXN0KTsKIAl9CkBAIC0xNzMxLDYgKzE3MzYsNyBAQAogCQljYXNlIEFORCA6CiAJCQlpZiAoKGxlZnRJZCAhPSBUeXBlSWRzLlRfYm9vbGVhbikgfHwgKHJpZ2h0SWQgIT0gVHlwZUlkcy5UX2Jvb2xlYW4pKQogCQkJCXJldHVybjsKKwkJCS8vJEZBTEwtVEhST1VHSCQKIAkJY2FzZSBBTkRfQU5EIDoKIAkJCUNvbnN0YW50IGNzdDsKIAkJCWlmICgoY3N0ID0gdGhpcy5sZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKQEAgLTE3NTQsNiArMTc2MCw3IEBACiAJCWNhc2UgT1IgOgogCQkJaWYgKChsZWZ0SWQgIT0gVHlwZUlkcy5UX2Jvb2xlYW4pIHx8IChyaWdodElkICE9IFR5cGVJZHMuVF9ib29sZWFuKSkKIAkJCQlyZXR1cm47CisJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCWNhc2UgT1JfT1IgOgogCQkJaWYgKChjc3QgPSB0aGlzLmxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJCWlmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeyAvLyBsZWZ0IGlzIGVxdWl2YWxlbnQgdG8gdHJ1ZQpAQCAtMTc3NSw3ICsxNzgyLDcgQEAKIH0KIAogcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aCAKKwkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aAogCS8vIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiNwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzCiAJdGhpcy5sZWZ0LnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yVG9TdHJpbmcoKSkuYXBwZW5kKCcgJyk7CiAJcmV0dXJuIHRoaXMucmlnaHQucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CkBAIC0xODQzLDExICsxODUwLDExIEBACiAJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCiAKIAkvLyBEb24ndCB0ZXN0IGZvciByZXN1bHQgPSAwLiBJZiBpdCBpcyB6ZXJvLCBzb21lIG1vcmUgd29yayBpcyBkb25lLgotCS8vIE9uIHRoZSBvbmUgaGFuZCB3aGVuIGl0IGlzIG5vdCB6ZXJvIChjb3JyZWN0IGNvZGUpIHdlIGF2b2lkIGRvaW5nIHRoZSB0ZXN0CQorCS8vIE9uIHRoZSBvbmUgaGFuZCB3aGVuIGl0IGlzIG5vdCB6ZXJvIChjb3JyZWN0IGNvZGUpIHdlIGF2b2lkIGRvaW5nIHRoZSB0ZXN0CiAJaW50IG9wZXJhdG9yID0gKHRoaXMuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQ7CiAJaW50IG9wZXJhdG9yU2lnbmF0dXJlID0gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU2lnbmF0dXJlc1tvcGVyYXRvcl1bKGxlZnRUeXBlSUQgPDwgNCkgKyByaWdodFR5cGVJRF07CiAKLQl0aGlzLmxlZnQuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIAlUeXBlQmluZGluZy53ZWxsS25vd25UeXBlKHNjb3BlLCAob3BlcmF0b3JTaWduYXR1cmUgPj4+IDE2KSAmIDB4MDAwMEYpLCBsZWZ0VHlwZSk7CisJdGhpcy5sZWZ0LmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy53ZWxsS25vd25UeXBlKHNjb3BlLCAob3BlcmF0b3JTaWduYXR1cmUgPj4+IDE2KSAmIDB4MDAwMEYpLCBsZWZ0VHlwZSk7CiAJdGhpcy5yaWdodC5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcud2VsbEtub3duVHlwZShzY29wZSwgKG9wZXJhdG9yU2lnbmF0dXJlID4+PiA4KSAmIDB4MDAwMEYpLCByaWdodFR5cGUpOwogCXRoaXMuYml0cyB8PSBvcGVyYXRvclNpZ25hdHVyZSAmIDB4RjsKIAlzd2l0Y2ggKG9wZXJhdG9yU2lnbmF0dXJlICYgMHhGKSB7IC8vIHJlY29yZCB0aGUgY3VycmVudCBSZXR1cm5UeXBlSUQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YQppbmRleCAwMWFlMTU0Li5jYjc4OWE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Jsb2NrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CbG9jay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDEyNyArMTYsMTExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgQmxvY2sgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIFN0YXRlbWVudFtdIHN0YXRlbWVudHM7CiAJcHVibGljIGludCBleHBsaWNpdERlY2xhcmF0aW9uczsKIAkvLyB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IGRlY2xhcmF0aW9uICwgdXNlZCB0byBjcmVhdGUgc2NvcGUKIAlwdWJsaWMgQmxvY2tTY29wZSBzY29wZTsKLQkKLQlwdWJsaWMgQmxvY2soaW50IGV4cGxpY2l0RGVjbGFyYXRpb25zKSB7Ci0JCXRoaXMuZXhwbGljaXREZWNsYXJhdGlvbnMgPSBleHBsaWNpdERlY2xhcmF0aW9uczsKLQl9Ci0JCi0JcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCUZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKLQkJLy8gZW1wdHkgYmxvY2sKLQkJaWYgKHN0YXRlbWVudHMgPT0gbnVsbCkJcmV0dXJuIGZsb3dJbmZvOwotCQlib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJU3RhdGVtZW50IHN0YXQgPSBzdGF0ZW1lbnRzW2ldOwotCQkJaWYgKCFzdGF0LmNvbXBsYWluSWZVbnJlYWNoYWJsZShmbG93SW5mbywgc2NvcGUsIGRpZEFscmVhZHlDb21wbGFpbikpIHsKLQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUoc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7Ci0JCQl9IGVsc2UgewotCQkJCWRpZEFscmVhZHlDb21wbGFpbiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZsb3dJbmZvOwotCX0KLQkvKioKLQkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGEgYmxvY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworcHVibGljIEJsb2NrKGludCBleHBsaWNpdERlY2xhcmF0aW9ucykgeworCXRoaXMuZXhwbGljaXREZWNsYXJhdGlvbnMgPSBleHBsaWNpdERlY2xhcmF0aW9uczsKK30KIAotCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc3RhdGVtZW50c1tpXS5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOwotCQkJfQotCQl9IC8vIGZvciBsb2NhbCB2YXJpYWJsZSBkZWJ1ZyBhdHRyaWJ1dGVzCi0JCWlmIChzY29wZSAhPSBjdXJyZW50U2NvcGUpIHsgLy8gd2FzIHJlYWxseSBhc3NvY2lhdGVkIHdpdGggaXRzIG93biBzY29wZQotCQkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHNjb3BlKTsKLQkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlCbG9jaygpIHsKLQotCQlyZXR1cm4gc3RhdGVtZW50cyA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRCb2R5KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQotCQlpZiAodGhpcy5zdGF0ZW1lbnRzID09IG51bGwpIHJldHVybiBvdXRwdXQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJc3RhdGVtZW50c1tpXS5wcmludFN0YXRlbWVudChpbmRlbnQgKyAxLCBvdXRwdXQpOwotCQkJb3V0cHV0LmFwcGVuZCgnXG4nKTsgCi0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQotCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7Ci0JCW91dHB1dC5hcHBlbmQoIntcbiIpOyAvLyROT04tTkxTLTEkCi0JCXByaW50Qm9keShpbmRlbnQsIG91dHB1dCk7Ci0JCXJldHVybiBwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCd9Jyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHVwcGVyU2NvcGUpIHsKLQotCQlpZiAoKHRoaXMuYml0cyAmIFVuZG9jdW1lbnRlZEVtcHR5QmxvY2spICE9IDApIHsKLQkJCXVwcGVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5kb2N1bWVudGVkRW1wdHlCbG9jayh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7Ci0JCX0KLQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJc2NvcGUgPQotCQkJCWV4cGxpY2l0RGVjbGFyYXRpb25zID09IDAKLQkJCQkJPyB1cHBlclNjb3BlCi0JCQkJCTogbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSwgZXhwbGljaXREZWNsYXJhdGlvbnMpOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlzdGF0ZW1lbnRzW2ldLnJlc29sdmUoc2NvcGUpOwotCQkJfQorcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwkvLyBlbXB0eSBibG9jaworCWlmICh0aGlzLnN0YXRlbWVudHMgPT0gbnVsbCkJcmV0dXJuIGZsb3dJbmZvOworCWludCBjb21wbGFpbnRMZXZlbCA9IChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwID8gU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEUgOiBTdGF0ZW1lbnQuTk9UX0NPTVBMQUlORUQ7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlTdGF0ZW1lbnQgc3RhdCA9IHRoaXMuc3RhdGVtZW50c1tpXTsKKwkJaWYgKChjb21wbGFpbnRMZXZlbCA9IHN0YXQuY29tcGxhaW5JZlVucmVhY2hhYmxlKGZsb3dJbmZvLCB0aGlzLnNjb3BlLCBjb21wbGFpbnRMZXZlbCkpIDwgU3RhdGVtZW50LkNPTVBMQUlORURfVU5SRUFDSEFCTEUpIHsKKwkJCWZsb3dJbmZvID0gc3RhdC5hbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwogCQl9CiAJfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVVzaW5nKEJsb2NrU2NvcGUgZ2l2ZW5TY29wZSkgewotCi0JCWlmICgodGhpcy5iaXRzICYgVW5kb2N1bWVudGVkRW1wdHlCbG9jaykgIT0gMCkgewotCQkJZ2l2ZW5TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrKHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsKKwlyZXR1cm4gZmxvd0luZm87Cit9CisvKioKKyAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBibG9jaworICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKwkJcmV0dXJuOworCX0KKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh0aGlzLnN0YXRlbWVudHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQl0aGlzLnN0YXRlbWVudHNbaV0uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0pOwogCQl9Ci0JCS8vIHRoaXMgb3B0aW1pemVkIHJlc29sdmUoLi4uKSBpcyBzZW50IG9ubHkgb24gbm9uZSBlbXB0eSBibG9ja3MKLQkJc2NvcGUgPSBnaXZlblNjb3BlOwotCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCXN0YXRlbWVudHNbaV0ucmVzb2x2ZShzY29wZSk7Ci0JCQl9CisJfSAvLyBmb3IgbG9jYWwgdmFyaWFibGUgZGVidWcgYXR0cmlidXRlcworCWlmICh0aGlzLnNjb3BlICE9IGN1cnJlbnRTY29wZSkgeyAvLyB3YXMgcmVhbGx5IGFzc29jaWF0ZWQgd2l0aCBpdHMgb3duIHNjb3BlCisJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKKwl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KKworcHVibGljIGJvb2xlYW4gaXNFbXB0eUJsb2NrKCkgeworCXJldHVybiB0aGlzLnN0YXRlbWVudHMgPT0gbnVsbDsKK30KKworcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEJvZHkoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCWlmICh0aGlzLnN0YXRlbWVudHMgPT0gbnVsbCkgcmV0dXJuIG91dHB1dDsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnN0YXRlbWVudHNbaV0ucHJpbnRTdGF0ZW1lbnQoaW5kZW50ICsgMSwgb3V0cHV0KTsKKwkJb3V0cHV0LmFwcGVuZCgnXG4nKTsKKwl9CisJcmV0dXJuIG91dHB1dDsKK30KKworcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CisJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOworCW91dHB1dC5hcHBlbmQoIntcbiIpOyAvLyROT04tTkxTLTEkCisJcHJpbnRCb2R5KGluZGVudCwgb3V0cHV0KTsKKwlyZXR1cm4gcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnfScpOworfQorCitwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgdXBwZXJTY29wZSkgeworCWlmICgodGhpcy5iaXRzICYgVW5kb2N1bWVudGVkRW1wdHlCbG9jaykgIT0gMCkgeworCQl1cHBlclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2sodGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCX0KKwlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJdGhpcy5zY29wZSA9CisJCQl0aGlzLmV4cGxpY2l0RGVjbGFyYXRpb25zID09IDAKKwkJCQk/IHVwcGVyU2NvcGUKKwkJCQk6IG5ldyBCbG9ja1Njb3BlKHVwcGVyU2NvcGUsIHRoaXMuZXhwbGljaXREZWNsYXJhdGlvbnMpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLnN0YXRlbWVudHNbaV0ucmVzb2x2ZSh0aGlzLnNjb3BlKTsKIAkJfQogCX0KK30KIAotCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAotCQlBU1RWaXNpdG9yIHZpc2l0b3IsCi0JCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewotCi0JCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7Ci0JCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJCXN0YXRlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJfQorcHVibGljIHZvaWQgcmVzb2x2ZVVzaW5nKEJsb2NrU2NvcGUgZ2l2ZW5TY29wZSkgeworCWlmICgodGhpcy5iaXRzICYgVW5kb2N1bWVudGVkRW1wdHlCbG9jaykgIT0gMCkgeworCQlnaXZlblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2sodGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCX0KKwkvLyB0aGlzIG9wdGltaXplZCByZXNvbHZlKC4uLikgaXMgc2VudCBvbmx5IG9uIG5vbmUgZW1wdHkgYmxvY2tzCisJdGhpcy5zY29wZSA9IGdpdmVuU2NvcGU7CisJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMuc3RhdGVtZW50c1tpXS5yZXNvbHZlKHRoaXMuc2NvcGUpOwogCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotCQotCS8qKgotCSAqIERpc3BhdGNoIHRoZSBjYWxsIG9uIGl0cyBsYXN0IHN0YXRlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBicmFuY2hDaGFpblRvKEJyYW5jaExhYmVsIGxhYmVsKSB7Ci0JCSBpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKLQkJIAl0aGlzLnN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5icmFuY2hDaGFpblRvKGxhYmVsKTsKLQkJIH0KK30KKworcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJdGhpcy5zdGF0ZW1lbnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOworCQl9CiAJfQotCQorCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7Cit9CisKKy8qKgorICogRGlzcGF0Y2ggdGhlIGNhbGwgb24gaXRzIGxhc3Qgc3RhdGVtZW50LgorICovCitwdWJsaWMgdm9pZCBicmFuY2hDaGFpblRvKEJyYW5jaExhYmVsIGxhYmVsKSB7CisJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCXRoaXMuc3RhdGVtZW50c1t0aGlzLnN0YXRlbWVudHMubGVuZ3RoIC0gMV0uYnJhbmNoQ2hhaW5UbyhsYWJlbCk7CisJfQorfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmFuY2hTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJhbmNoU3RhdGVtZW50LmphdmEKaW5kZXggMGU0M2RhMC4uNjI3MzUxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmFuY2hTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyYW5jaFN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCcmFuY2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIGNoYXJbXSBsYWJlbDsKIAlwdWJsaWMgQnJhbmNoTGFiZWwgdGFyZ2V0TGFiZWw7CiAJcHVibGljIFN1YlJvdXRpbmVTdGF0ZW1lbnRbXSBzdWJyb3V0aW5lczsKQEAgLTQwLDcgKzQwLDcgQEAKIAl9CiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAotCS8vIGdlbmVyYXRpb24gb2YgY29kZSByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgdGhlIGZpbmFsbHkgCisJLy8gZ2VuZXJhdGlvbiBvZiBjb2RlIHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyB0aGUgZmluYWxseQogCS8vIGJsb2NrcyBpbiBzZXF1ZW5jZQogCWlmICh0aGlzLnN1YnJvdXRpbmVzICE9IG51bGwpewogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5zdWJyb3V0aW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CkBAIC01Miw3ICs1Miw3IEBACiAJCQkJCWlmICh0aGlzLmluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMuaW5pdFN0YXRlSW5kZXgpOwogCQkJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLmluaXRTdGF0ZUluZGV4KTsKLQkJCQkJfQkJCQkJCisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC02Myw3ICs2Myw3IEBACiAJaWYgKHRoaXMuaW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLmluaXRTdGF0ZUluZGV4KTsKIAkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLmluaXRTdGF0ZUluZGV4KTsKLQl9CQkJCQkKKwl9CiB9CiAKIHB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVha1N0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVha1N0YXRlbWVudC5qYXZhCmluZGV4IDllNjg0MDMuLjNjNTk5MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJlYWtTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyZWFrU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgQnJhbmNoU3RhdGVtZW50IHsKLQkKKwogcHVibGljIEJyZWFrU3RhdGVtZW50KGNoYXJbXSBsYWJlbCwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgZSkgewogCXN1cGVyKGxhYmVsLCBzb3VyY2VTdGFydCwgZSk7CiB9CkBAIC0yNiw3ICsyNiw3IEBACiAJLy8gdG8gZWFjaCBvZiB0aGUgdHJhdmVyc2VkIHRyeSBzdGF0ZW1lbnRzLCBzbyB0aGF0IGV4ZWN1dGlvbiB3aWxsIHRlcm1pbmF0ZSBwcm9wZXJseS4KIAogCS8vIGxvb2t1cCB0aGUgbGFiZWwsIHRoaXMgc2hvdWxkIGFuc3dlciB0aGUgcmV0dXJuQ29udGV4dAotCUZsb3dDb250ZXh0IHRhcmdldENvbnRleHQgPSAodGhpcy5sYWJlbCA9PSBudWxsKSAKKwlGbG93Q29udGV4dCB0YXJnZXRDb250ZXh0ID0gKHRoaXMubGFiZWwgPT0gbnVsbCkKIAkJPyBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdEJyZWFrKCkKIAkJOiBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yQnJlYWtMYWJlbCh0aGlzLmxhYmVsKTsKIApAQCAtMzQsMTkgKzM0LDE5IEBACiAJCWlmICh0aGlzLmxhYmVsID09IG51bGwpIHsKIAkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQnJlYWsodGhpcyk7CiAJCX0gZWxzZSB7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5kZWZpbmVkTGFiZWwodGhpcyk7IAorCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOwogCQl9CiAJCXJldHVybiBmbG93SW5mbzsgLy8gcHJldGVuZCBpdCBkaWQgbm90IGJyZWFrIHNpbmNlIG5vIGFjdHVhbCB0YXJnZXQKIAl9Ci0JCisKIAl0aGlzLmluaXRTdGF0ZUluZGV4ID0KIAkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOwotCQorCiAJdGhpcy50YXJnZXRMYWJlbCA9IHRhcmdldENvbnRleHQuYnJlYWtMYWJlbCgpOwogCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSBmbG93Q29udGV4dDsKIAlpbnQgc3ViQ291bnQgPSAwOwogCXRoaXMuc3Vicm91dGluZXMgPSBuZXcgU3ViUm91dGluZVN0YXRlbWVudFs1XTsKLQkKKwogCWRvIHsKIAkJU3ViUm91dGluZVN0YXRlbWVudCBzdWI7CiAJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJyb3V0aW5lKCkpICE9IG51bGwpIHsKQEAgLTYwLDEyICs2MCwxMiBAQAogCQl9CiAJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiAJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkQnJlYWtUbyh0YXJnZXRDb250ZXh0KTsKLQkJCisKIAkJaWYgKHRyYXZlcnNlZENvbnRleHQgaW5zdGFuY2VvZiBJbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQpIHsKIAkJCUFTVE5vZGUgbm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGU7CiAJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgewogCQkJCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSAoVHJ5U3RhdGVtZW50KSBub2RlOwotCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMJCQkKKwkJCQlmbG93SW5mby5hZGRJbml0aWFsaXphdGlvbnNGcm9tKHRyeVN0YXRlbWVudC5zdWJSb3V0aW5lSW5pdHMpOyAvLyBjb2xsZWN0IGluaXRzCiAJCQl9CiAJCX0gZWxzZSBpZiAodHJhdmVyc2VkQ29udGV4dCA9PSB0YXJnZXRDb250ZXh0KSB7CiAJCQkvLyBvbmx5IHJlY29yZCBicmVhayBpbmZvIG9uY2UgYWNjdW11bGF0ZWQgdGhyb3VnaCBzdWJyb3V0aW5lcywgYW5kIG9ubHkgYWdhaW5zdCB0YXJnZXQgY29udGV4dApAQCAtNzMsNyArNzMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlICgodHJhdmVyc2VkQ29udGV4dCA9IHRyYXZlcnNlZENvbnRleHQucGFyZW50KSAhPSBudWxsKTsKLQkKKwogCS8vIHJlc2l6ZSBzdWJyb3V0aW5lcwogCWlmIChzdWJDb3VudCAhPSB0aGlzLnN1YnJvdXRpbmVzLmxlbmd0aCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3Vicm91dGluZXMsIDAsICh0aGlzLnN1YnJvdXRpbmVzID0gbmV3IFN1YlJvdXRpbmVTdGF0ZW1lbnRbc3ViQ291bnRdKSwgMCwgc3ViQ291bnQpOwpAQCAtODIsOCArODIsOCBAQAogfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKCJicmVhayAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICh0aGlzLmxhYmVsICE9IG51bGwpIG91dHB1dC5hcHBlbmQodGhpcy5sYWJlbCk7CisJcHJpbnRJbmRlbnQodGFiLCBvdXRwdXQpLmFwcGVuZCgiYnJlYWsiKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLmxhYmVsICE9IG51bGwpIG91dHB1dC5hcHBlbmQoJyAnKS5hcHBlbmQodGhpcy5sYWJlbCk7CiAJcmV0dXJuIG91dHB1dC5hcHBlbmQoJzsnKTsKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc2VTdGF0ZW1lbnQuamF2YQppbmRleCBhODE4NTYzLi4xM2IyNzg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc2VTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc2VTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw3ICsxMiw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNhc2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5CcmFuY2hMYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwpAQCAtMjUsMTAgKzI1LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIAogcHVibGljIGNsYXNzIENhc2VTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIEV4cHJlc3Npb24gY29uc3RhbnRFeHByZXNzaW9uOwotCXB1YmxpYyBDYXNlTGFiZWwgdGFyZ2V0TGFiZWw7Ci0JCisJcHVibGljIEJyYW5jaExhYmVsIHRhcmdldExhYmVsOworCiBwdWJsaWMgQ2FzZVN0YXRlbWVudChFeHByZXNzaW9uIGNvbnN0YW50RXhwcmVzc2lvbiwgaW50IHNvdXJjZUVuZCwgaW50IHNvdXJjZVN0YXJ0KSB7CiAJdGhpcy5jb25zdGFudEV4cHJlc3Npb24gPSBjb25zdGFudEV4cHJlc3Npb247CiAJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CkBAIC00MSw3ICs0MSw3IEBACiAJRmxvd0luZm8gZmxvd0luZm8pIHsKIAogCWlmICh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCWlmICh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbi5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgCisJCWlmICh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbi5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKIAkJCQkmJiAhdGhpcy5jb25zdGFudEV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlzRW51bSgpKSB7CiAJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2FzZUV4cHJlc3Npb25NdXN0QmVDb25zdGFudCh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbik7CiAJCX0KQEAgLTUzLDEyICs1MywxMiBAQAogcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJcHJpbnRJbmRlbnQodGFiLCBvdXRwdXQpOwogCWlmICh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCW91dHB1dC5hcHBlbmQoImRlZmF1bHQgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlvdXRwdXQuYXBwZW5kKCJkZWZhdWx0IDoiKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSB7CiAJCW91dHB1dC5hcHBlbmQoImNhc2UgIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5jb25zdGFudEV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmNvbnN0YW50RXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoIiA6Iik7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JcmV0dXJuIG91dHB1dC5hcHBlbmQoJzsnKTsKKwlyZXR1cm4gb3V0cHV0OwogfQogCiAvKioKQEAgLTg3LDE0ICs4NywxNCBAQAogICovCiBwdWJsaWMgQ29uc3RhbnQgcmVzb2x2ZUNhc2UoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgc3dpdGNoRXhwcmVzc2lvblR5cGUsIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKIAkvLyBzd2l0Y2hFeHByZXNzaW9uVHlwZSBtYXliZSBudWxsIGluIGVycm9yIGNhc2UKLSAgICBzY29wZS5lbmNsb3NpbmdDYXNlID0gdGhpczsgLy8gcmVjb3JkIGVudGVyaW5nIGluIGEgc3dpdGNoIGNhc2UgYmxvY2sKLSAgICAKKwlzY29wZS5lbmNsb3NpbmdDYXNlID0gdGhpczsgLy8gcmVjb3JkIGVudGVyaW5nIGluIGEgc3dpdGNoIGNhc2UgYmxvY2sKKwogCWlmICh0aGlzLmNvbnN0YW50RXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCS8vIHJlbWVtYmVyIHRoZSBkZWZhdWx0IGNhc2UgaW50byB0aGUgYXNzb2NpYXRlZCBzd2l0Y2ggc3RhdGVtZW50CiAJCWlmIChzd2l0Y2hTdGF0ZW1lbnQuZGVmYXVsdENhc2UgIT0gbnVsbCkKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZURlZmF1bHRDYXNlKHRoaXMpOwogCi0JCS8vIG9uIGVycm9yIHRoZSBsYXN0IGRlZmF1bHQgd2lsbCBiZSB0aGUgc2VsZWN0ZWQgb25lIC4uLgkKKwkJLy8gb24gZXJyb3IgdGhlIGxhc3QgZGVmYXVsdCB3aWxsIGJlIHRoZSBzZWxlY3RlZCBvbmUgLi4uCiAJCXN3aXRjaFN0YXRlbWVudC5kZWZhdWx0Q2FzZSA9IHRoaXM7CiAJCXJldHVybiBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJfQpAQCAtMTI3LDE1ICsxMjcsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCXJldHVybiB0aGlzLmNvbnN0YW50RXhwcmVzc2lvbi5jb25zdGFudDsKIAkJfQotCX0gZWxzZSBpZiAoc2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aChjYXNlVHlwZSwgc3dpdGNoRXhwcmVzc2lvblR5cGUpCi0JCQkJCXx8IChjYXNlVHlwZS5pc0Jhc2VUeXBlKCkgIC8vIG5hcnJvd2luZyB0aGVuIGJveGluZyA/Ci0JCQkJCQkJJiYgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvLyBhdXRvYm94aW5nCi0JCQkJCQkJJiYgIXN3aXRjaEV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKQotCQkJCQkJCSYmIHRoaXMuY29uc3RhbnRFeHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoY2FzZVR5cGUsIHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoc3dpdGNoRXhwcmVzc2lvblR5cGUpKSkpIHsKKwl9IGVsc2UgaWYgKGlzQm94aW5nQ29tcGF0aWJsZShjYXNlVHlwZSwgc3dpdGNoRXhwcmVzc2lvblR5cGUsIHRoaXMuY29uc3RhbnRFeHByZXNzaW9uLCBzY29wZSkpIHsKIAkJLy8gY29uc3RhbnRFeHByZXNzaW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBjYXNlVHlwZSwgc3dpdGNoRXhwcmVzc2lvblR5cGUpOyAtIGRvIG5vdCByZXBvcnQgYm94aW5nL3VuYm94aW5nIGNvbnZlcnNpb24KIAkJcmV0dXJuIHRoaXMuY29uc3RhbnRFeHByZXNzaW9uLmNvbnN0YW50OwogCX0KLQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcihjYXNlVHlwZSwgc3dpdGNoRXhwcmVzc2lvblR5cGUsIHRoaXMuY29uc3RhbnRFeHByZXNzaW9uKTsKKwlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcihjYXNlVHlwZSwgc3dpdGNoRXhwcmVzc2lvblR5cGUsIHRoaXMuY29uc3RhbnRFeHByZXNzaW9uLCBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbik7CiAJcmV0dXJuIENvbnN0YW50Lk5vdEFDb25zdGFudDsKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhCmluZGV4IDJlMTA5MjMuLjM5NjI3NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzdEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc3RFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOCw1MTQgKzgsNTczIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgTmljayBUZXJ5YWV2IC0gZml4IGZvciBidWcgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00MDc1MikKKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9va3VwRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKIAogcHVibGljIGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAlwdWJsaWMgRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCXB1YmxpYyBFeHByZXNzaW9uIHR5cGU7CisJcHVibGljIFR5cGVSZWZlcmVuY2UgdHlwZTsKIAlwdWJsaWMgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlOyAvLyB3aGVuIGFzc2lnbm1lbnQgY29udmVyc2lvbiB0byBhIGdpdmVuIGV4cGVjdGVkIHR5cGU6IFN0cmluZyBzID0gKFN0cmluZykgdDsKLQkKLQkvL2V4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uIGhvbGRzIHRoZSBjYXN0IGZvciBiYXNlVHlwZSBjYXN0aW5nIAotCXB1YmxpYyBDYXN0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sIEV4cHJlc3Npb24gdHlwZSkgewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0eXBlLmJpdHMgfD0gSWdub3JlUmF3VHlwZUNoZWNrOyAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHJhdyB0eXBlIHVzYWdlCi0JfQogCi0JcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisvL2V4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uIGhvbGRzIHRoZSBjYXN0IGZvciBiYXNlVHlwZSBjYXN0aW5nCitwdWJsaWMgQ2FzdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlUmVmZXJlbmNlIHR5cGUpIHsKKwl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCXRoaXMudHlwZSA9IHR5cGU7CisJdHlwZS5iaXRzIHw9IEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrOyAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHJhdyB0eXBlIHVzYWdlCit9CiAKLQkJcmV0dXJuIGV4cHJlc3Npb24KLQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKLQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJRmxvd0luZm8gcmVzdWx0ID0gdGhpcy5leHByZXNzaW9uCisJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCWlmICgodGhpcy5leHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJdGhpcy5leHByZXNzaW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAl9CisJcmV0dXJuIHJlc3VsdDsKK30KIAotCS8qKgotCSAqIENvbXBsYWluIGlmIGFzc2lnbmVkIGV4cHJlc3Npb24gaXMgY2FzdCwgYnV0IG5vdCBhY3R1YWxseSB1c2VkIGFzIHN1Y2gsIGUuZy4gT2JqZWN0IG8gPSAoTGlzdCkgb2JqZWN0OwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja05lZWRGb3JBc3NpZ25lZENhc3QoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlLCBDYXN0RXhwcmVzc2lvbiByaHMpIHsKLQkKLQkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47Ci0JCi0JCVR5cGVCaW5kaW5nIGNhc3RlZEV4cHJlc3Npb25UeXBlID0gcmhzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwotCQkvLwlpbnQgaSA9IChieXRlKSBuOyAvLyBjYXN0IHN0aWxsIGhhZCBzaWRlIGVmZmVjdAotCQkvLyBkb3VibGUgZCA9IChmbG9hdCkgbjsgLy8gY2FzdCB0byBmbG9hdCBpcyB1bm5lY2Vzc2FyeQotCQlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gbnVsbCB8fCByaHMucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSkgcmV0dXJuOyAKLQkJLy9pZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUuaWQgPT0gVF9udWxsKSByZXR1cm47IC8vIHRvbGVyYXRlIG51bGwgZXhwcmVzc2lvbiBjYXN0Ci0JCWlmIChjYXN0ZWRFeHByZXNzaW9uVHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cGVjdGVkVHlwZSkpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdChyaHMpOyAKLQkJfQorLyoqCisgKiBDb21wbGFpbiBpZiBhc3NpZ25lZCBleHByZXNzaW9uIGlzIGNhc3QsIGJ1dCBub3QgYWN0dWFsbHkgdXNlZCBhcyBzdWNoLCBlLmcuIE9iamVjdCBvID0gKExpc3QpIG9iamVjdDsKKyAqLworcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTmVlZEZvckFzc2lnbmVkQ2FzdChCbG9ja1Njb3BlIHNjb3BlLCBUeXBlQmluZGluZyBleHBlY3RlZFR5cGUsIENhc3RFeHByZXNzaW9uIHJocykgeworCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlUeXBlQ2hlY2spID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOworCisJVHlwZUJpbmRpbmcgY2FzdGVkRXhwcmVzc2lvblR5cGUgPSByaHMuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7CisJLy8JaW50IGkgPSAoYnl0ZSkgbjsgLy8gY2FzdCBzdGlsbCBoYWQgc2lkZSBlZmZlY3QKKwkvLyBkb3VibGUgZCA9IChmbG9hdCkgbjsgLy8gY2FzdCB0byBmbG9hdCBpcyB1bm5lY2Vzc2FyeQorCWlmIChjYXN0ZWRFeHByZXNzaW9uVHlwZSA9PSBudWxsIHx8IHJocy5yZXNvbHZlZFR5cGUuaXNCYXNlVHlwZSgpKSByZXR1cm47CisJLy9pZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUuaWQgPT0gVF9udWxsKSByZXR1cm47IC8vIHRvbGVyYXRlIG51bGwgZXhwcmVzc2lvbiBjYXN0CisJaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoZXhwZWN0ZWRUeXBlKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QocmhzKTsKIAl9Ci0JCi0JLyoqCi0JICogQ2FzdGluZyBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugd2lsbCBjb25zaWRlcmVkIGFzIHVzZWZ1bCBpZiByZW1vdmluZyBpdCB3b3VsZCBhY3R1YWxseSBiaW5kIHRvIGEgZGlmZmVyZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tOZWVkRm9yRW5jbG9zaW5nSW5zdGFuY2VDYXN0KEJsb2NrU2NvcGUgc2NvcGUsIEV4cHJlc3Npb24gZW5jbG9zaW5nSW5zdGFuY2UsIFR5cGVCaW5kaW5nIGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgVHlwZUJpbmRpbmcgbWVtYmVyVHlwZSkgewotCQotCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlVubmVjZXNzYXJ5VHlwZUNoZWNrKSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKLQkJCi0JCVR5cGVCaW5kaW5nIGNhc3RlZEV4cHJlc3Npb25UeXBlID0gKChDYXN0RXhwcmVzc2lvbillbmNsb3NpbmdJbnN0YW5jZSkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7Ci0JCWlmIChjYXN0ZWRFeHByZXNzaW9uVHlwZSA9PSBudWxsKSByZXR1cm47IC8vIGNhbm5vdCBkbyBiZXR0ZXIKLQkJLy8gb2J2aW91cyBpZGVudGl0eSBjYXN0Ci0JCWlmIChjYXN0ZWRFeHByZXNzaW9uVHlwZSA9PSBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpIHsgCit9CisKKworLyoqCisgKiBDb21wbGFpbiBpZiBjYXN0IGV4cHJlc3Npb24gaXMgY2FzdCwgYnV0IG5vdCBhY3R1YWxseSBuZWVkZWQsIGludCBpID0gKGludCkoSW50ZWdlcikgMTI7CisgKiBOb3RlIHRoYXQgdGhpcyAoaW50KSBjYXN0IGlzIGhvd2V2ZXIgbmVlZGVkOiAgIEludGVnZXIgaSA9IDA7ICBjaGFyIGMgPSAoY2hhcikoKGludCkgaSk7CisgKi8KK3B1YmxpYyBzdGF0aWMgdm9pZCBjaGVja05lZWRGb3JDYXN0Q2FzdChCbG9ja1Njb3BlIHNjb3BlLCBDYXN0RXhwcmVzc2lvbiBlbmNsb3NpbmdDYXN0KSB7CisJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CisKKwlDYXN0RXhwcmVzc2lvbiBuZXN0ZWRDYXN0ID0gKENhc3RFeHByZXNzaW9uKSBlbmNsb3NpbmdDYXN0LmV4cHJlc3Npb247CisJaWYgKChuZXN0ZWRDYXN0LmJpdHMgJiBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdCkgPT0gMCkgcmV0dXJuOworCS8vIGNoZWNrIGlmIGNvdWxkIGNhc3QgZGlyZWN0bHkgdG8gZW5jbG9zaW5nIGNhc3QgdHlwZSwgd2l0aG91dCBpbnRlcm1lZGlhdGUgdHlwZSBjYXN0CisJQ2FzdEV4cHJlc3Npb24gYWx0ZXJuYXRlQ2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihudWxsLCBlbmNsb3NpbmdDYXN0LnR5cGUpOworCWFsdGVybmF0ZUNhc3QucmVzb2x2ZWRUeXBlID0gZW5jbG9zaW5nQ2FzdC5yZXNvbHZlZFR5cGU7CisJaWYgKCFhbHRlcm5hdGVDYXN0LmNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgZW5jbG9zaW5nQ2FzdC5yZXNvbHZlZFR5cGUsIG5lc3RlZENhc3QuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUsIG51bGwgLyogbm8gZXhwciB0byBhdm9pZCBzaWRlLWVmZmVjdHMqLykpIHJldHVybjsKKwlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QobmVzdGVkQ2FzdCk7Cit9CisKKworLyoqCisgKiBDYXN0aW5nIGFuIGVuY2xvc2luZyBpbnN0YW5jZSB3aWxsIGNvbnNpZGVyZWQgYXMgdXNlZnVsIGlmIHJlbW92aW5nIGl0IHdvdWxkIGFjdHVhbGx5IGJpbmQgdG8gYSBkaWZmZXJlbnQgdHlwZQorICovCitwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tOZWVkRm9yRW5jbG9zaW5nSW5zdGFuY2VDYXN0KEJsb2NrU2NvcGUgc2NvcGUsIEV4cHJlc3Npb24gZW5jbG9zaW5nSW5zdGFuY2UsIFR5cGVCaW5kaW5nIGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgVHlwZUJpbmRpbmcgbWVtYmVyVHlwZSkgeworCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlUeXBlQ2hlY2spID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOworCisJVHlwZUJpbmRpbmcgY2FzdGVkRXhwcmVzc2lvblR5cGUgPSAoKENhc3RFeHByZXNzaW9uKWVuY2xvc2luZ0luc3RhbmNlKS5leHByZXNzaW9uLnJlc29sdmVkVHlwZTsKKwlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYW5ub3QgZG8gYmV0dGVyCisJLy8gb2J2aW91cyBpZGVudGl0eSBjYXN0CisJaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlID09IGVuY2xvc2luZ0luc3RhbmNlVHlwZSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWVuY2xvc2luZ0luc3RhbmNlKTsKKwl9IGVsc2UgaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpeworCQlyZXR1cm47IC8vIHRvbGVyYXRlIG51bGwgZW5jbG9zaW5nIGluc3RhbmNlIGNhc3QKKwl9IGVsc2UgeworCQlUeXBlQmluZGluZyBhbHRlcm5hdGVFbmNsb3NpbmdJbnN0YW5jZVR5cGUgPSBjYXN0ZWRFeHByZXNzaW9uVHlwZTsKKwkJaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSB8fCBjYXN0ZWRFeHByZXNzaW9uVHlwZS5pc0FycmF5VHlwZSgpKSByZXR1cm47IC8vIGVycm9yIGNhc2UKKwkJaWYgKG1lbWJlclR5cGUgPT0gc2NvcGUuZ2V0TWVtYmVyVHlwZShtZW1iZXJUeXBlLnNvdXJjZU5hbWUoKSwgKFJlZmVyZW5jZUJpbmRpbmcpIGFsdGVybmF0ZUVuY2xvc2luZ0luc3RhbmNlVHlwZSkpIHsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pZW5jbG9zaW5nSW5zdGFuY2UpOwotCQl9IGVsc2UgaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpewotCQkJcmV0dXJuOyAvLyB0b2xlcmF0ZSBudWxsIGVuY2xvc2luZyBpbnN0YW5jZSBjYXN0Ci0JCX0gZWxzZSB7Ci0JCQlUeXBlQmluZGluZyBhbHRlcm5hdGVFbmNsb3NpbmdJbnN0YW5jZVR5cGUgPSBjYXN0ZWRFeHByZXNzaW9uVHlwZTsgCi0JCQlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUuaXNCYXNlVHlwZSgpIHx8IGNhc3RlZEV4cHJlc3Npb25UeXBlLmlzQXJyYXlUeXBlKCkpIHJldHVybjsgLy8gZXJyb3IgY2FzZQotCQkJaWYgKG1lbWJlclR5cGUgPT0gc2NvcGUuZ2V0TWVtYmVyVHlwZShtZW1iZXJUeXBlLnNvdXJjZU5hbWUoKSwgKFJlZmVyZW5jZUJpbmRpbmcpIGFsdGVybmF0ZUVuY2xvc2luZ0luc3RhbmNlVHlwZSkpIHsKLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWVuY2xvc2luZ0luc3RhbmNlKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBPbmx5IGNvbXBsYWluIGZvciBpZGVudGl0eSBjYXN0LCBzaW5jZSBvdGhlciB0eXBlIG9mIGNhc3RzIG1heSBiZSB1c2VmdWw6IGUuZy4gIH4oKH4obG9uZykgMCkgPDwgMzIpICBpcyBkaWZmZXJlbnQgZnJvbTogfigofjApIDw8IDMyKQorICovCitwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tOZWVkRm9yQXJndW1lbnRDYXN0KEJsb2NrU2NvcGUgc2NvcGUsIGludCBvcGVyYXRvciwgaW50IG9wZXJhdG9yU2lnbmF0dXJlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBleHByZXNzaW9uVHlwZUlkKSB7CisJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CisKKwkvLyBjaGVjayBuZWVkIGZvciBsZWZ0IG9wZXJhbmQgY2FzdAorCWlmICgoZXhwcmVzc2lvbi5iaXRzICYgQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3QpID09IDAgJiYgZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCS8vIG5hcnJvd2luZyBjb252ZXJzaW9uIG9uIGJhc2UgdHlwZSBtYXkgY2hhbmdlIHZhbHVlLCB0aHVzIG5lY2Vzc2FyeQorCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlTGVmdFR5cGUgPSAoKENhc3RFeHByZXNzaW9uKWV4cHJlc3Npb24pLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOworCQlpZiAoYWx0ZXJuYXRlTGVmdFR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYW5ub3QgZG8gYmV0dGVyCisJCWlmIChhbHRlcm5hdGVMZWZ0VHlwZS5pZCA9PSBleHByZXNzaW9uVHlwZUlkKSB7IC8vIG9idmlvdXMgaWRlbnRpdHkgY2FzdAorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlDYXN0KChDYXN0RXhwcmVzc2lvbilleHByZXNzaW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoqCisgKiBDYXN0IGV4cHJlc3Npb25zIHdpbGwgY29uc2lkZXJlZCBhcyB1c2VmdWwgaWYgcmVtb3ZpbmcgdGhlbSBhbGwgd291bGQgYWN0dWFsbHkgYmluZCB0byBhIGRpZmZlcmVudCBtZXRob2QKKyAqIChubyBmaW5lIGdyYWluIGFuYWx5c2lzIG9uIHBlciBjYXN0ZWQgYXJndW1lbnQgYmFzaXMsIHNpbXBseSBzZXBhcmF0ZSB3aWRlbmluZyBjYXN0IGZyb20gbmFycm93aW5nIG9uZXMpCisgKi8KK3B1YmxpYyBzdGF0aWMgdm9pZCBjaGVja05lZWRGb3JBcmd1bWVudENhc3RzKEJsb2NrU2NvcGUgc2NvcGUsIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgTWV0aG9kQmluZGluZyBiaW5kaW5nLCBFeHByZXNzaW9uW10gYXJndW1lbnRzLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIGZpbmFsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CisKKwlpbnQgbGVuZ3RoID0gYXJndW1lbnRUeXBlcy5sZW5ndGg7CisKKwkvLyBpdGVyYXRlIG92ZXIgYXJndW1lbnRzLCBhbmQgcmV0cmlldmUgb3JpZ2luYWwgYXJndW1lbnQgdHlwZXMgKGJlZm9yZSBjYXN0KQorCVR5cGVCaW5kaW5nW10gcmF3QXJndW1lbnRUeXBlcyA9IGFyZ3VtZW50VHlwZXM7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlFeHByZXNzaW9uIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOworCQlpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgeworCQkJLy8gbmFycm93aW5nIGNvbnZlcnNpb24gb24gYmFzZSB0eXBlIG1heSBjaGFuZ2UgdmFsdWUsIHRodXMgbmVjZXNzYXJ5CisJCQlpZiAoKGFyZ3VtZW50LmJpdHMgJiBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdCkgPT0gMCAmJiBhcmd1bWVudC5yZXNvbHZlZFR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlUeXBlQmluZGluZyBjYXN0ZWRFeHByZXNzaW9uVHlwZSA9ICgoQ2FzdEV4cHJlc3Npb24pYXJndW1lbnQpLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOworCQkJaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlID09IG51bGwpIHJldHVybjsgLy8gY2Fubm90IGRvIGJldHRlcgorCQkJLy8gb2J2aW91cyBpZGVudGl0eSBjYXN0CisJCQlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gYXJndW1lbnRUeXBlc1tpXSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pYXJndW1lbnQpOworCQkJfSBlbHNlIGlmIChjYXN0ZWRFeHByZXNzaW9uVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKXsKKwkJCQljb250aW51ZTsgLy8gdG9sZXJhdGUgbnVsbCBhcmd1bWVudCBjYXN0CisJCQl9IGVsc2UgaWYgKChhcmd1bWVudC5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkJPWElORykgIT0gMCkgeworCQkJCWNvbnRpbnVlOyAvLyBib3hpbmcgaGFzIGEgc2lkZSBlZmZlY3Q6IChpbnQpIGNoYXIgICBpcyBub3QgYm94ZWQgYXMgc2ltcGxlIGNoYXIKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJhd0FyZ3VtZW50VHlwZXMgPT0gYXJndW1lbnRUeXBlcykgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJhd0FyZ3VtZW50VHlwZXMsIDAsIHJhd0FyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCQl9CisJCQkJLy8gcmV0YWluIG9yaWdpbmFsIGFyZ3VtZW50IHR5cGUKKwkJCQlyYXdBcmd1bWVudFR5cGVzW2ldID0gY2FzdGVkRXhwcmVzc2lvblR5cGU7CiAJCQl9CiAJCX0KIAl9CisJLy8gcGVyZm9ybSBhbHRlcm5hdGUgbG9va3VwIHdpdGggb3JpZ2luYWwgdHlwZXMKKwlpZiAocmF3QXJndW1lbnRUeXBlcyAhPSBhcmd1bWVudFR5cGVzKSB7CisJCWNoZWNrQWx0ZXJuYXRlQmluZGluZyhzY29wZSwgcmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSwgYmluZGluZywgYXJndW1lbnRzLCBhcmd1bWVudFR5cGVzLCByYXdBcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CisJfQorfQogCi0JLyoqCi0JICogT25seSBjb21wbGFpbiBmb3IgaWRlbnRpdHkgY2FzdCwgc2luY2Ugb3RoZXIgdHlwZSBvZiBjYXN0cyBtYXkgYmUgdXNlZnVsOiBlLmcuICB+KCh+KGxvbmcpIDApIDw8IDMyKSAgaXMgZGlmZmVyZW50IGZyb206IH4oKH4wKSA8PCAzMikgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdChCbG9ja1Njb3BlIHNjb3BlLCBpbnQgb3BlcmF0b3IsIGludCBvcGVyYXRvclNpZ25hdHVyZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgZXhwcmVzc2lvblR5cGVJZCkgewotCQotCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlVubmVjZXNzYXJ5VHlwZUNoZWNrKSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKLQkKLQkJLy8gY2hlY2sgbmVlZCBmb3IgbGVmdCBvcGVyYW5kIGNhc3QKLQkJaW50IGFsdGVybmF0ZUxlZnRUeXBlSWQgPSBleHByZXNzaW9uVHlwZUlkOwotCQlpZiAoKGV4cHJlc3Npb24uYml0cyAmIFVubmVjZXNzYXJ5Q2FzdCkgPT0gMCAmJiBleHByZXNzaW9uLnJlc29sdmVkVHlwZS5pc0Jhc2VUeXBlKCkpIHsKKy8qKgorICogQ2hlY2sgYmluYXJ5IG9wZXJhdG9yIGNhc3RlZCBhcmd1bWVudHMKKyAqLworcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoQmxvY2tTY29wZSBzY29wZSwgaW50IG9wZXJhdG9yLCBpbnQgb3BlcmF0b3JTaWduYXR1cmUsIEV4cHJlc3Npb24gbGVmdCwgaW50IGxlZnRUeXBlSWQsIGJvb2xlYW4gbGVmdElzQ2FzdCwgRXhwcmVzc2lvbiByaWdodCwgaW50IHJpZ2h0VHlwZUlkLCBib29sZWFuIHJpZ2h0SXNDYXN0KSB7CisJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CisKKwkvLyBjaGVjayBuZWVkIGZvciBsZWZ0IG9wZXJhbmQgY2FzdAorCWludCBhbHRlcm5hdGVMZWZ0VHlwZUlkID0gbGVmdFR5cGVJZDsKKwlpZiAobGVmdElzQ2FzdCkgeworCQlpZiAoKGxlZnQuYml0cyAmIEFTVE5vZGUuVW5uZWNlc3NhcnlDYXN0KSA9PSAwICYmIGxlZnQucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSkgewogCQkJLy8gbmFycm93aW5nIGNvbnZlcnNpb24gb24gYmFzZSB0eXBlIG1heSBjaGFuZ2UgdmFsdWUsIHRodXMgbmVjZXNzYXJ5Ci0JCQlyZXR1cm47CisJCQlsZWZ0SXNDYXN0ID0gZmFsc2U7CiAJCX0gZWxzZSAgewotCQkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlTGVmdFR5cGUgPSAoKENhc3RFeHByZXNzaW9uKWV4cHJlc3Npb24pLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOworCQkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlTGVmdFR5cGUgPSAoKENhc3RFeHByZXNzaW9uKWxlZnQpLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwogCQkJaWYgKGFsdGVybmF0ZUxlZnRUeXBlID09IG51bGwpIHJldHVybjsgLy8gY2Fubm90IGRvIGJldHRlcgotCQkJaWYgKChhbHRlcm5hdGVMZWZ0VHlwZUlkID0gYWx0ZXJuYXRlTGVmdFR5cGUuaWQpID09IGV4cHJlc3Npb25UeXBlSWQpIHsgLy8gb2J2aW91cyBpZGVudGl0eSBjYXN0Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlDYXN0KChDYXN0RXhwcmVzc2lvbilleHByZXNzaW9uKTsgCi0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChhbHRlcm5hdGVMZWZ0VHlwZUlkID09IFRfbnVsbCkgewotCQkJCWFsdGVybmF0ZUxlZnRUeXBlSWQgPSBleHByZXNzaW9uVHlwZUlkOyAgLy8gdG9sZXJhdGUgbnVsbCBhcmd1bWVudCBjYXN0Ci0JCQkJcmV0dXJuOworCQkJaWYgKChhbHRlcm5hdGVMZWZ0VHlwZUlkID0gYWx0ZXJuYXRlTGVmdFR5cGUuaWQpID09IGxlZnRUeXBlSWQgfHwgc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShhbHRlcm5hdGVMZWZ0VHlwZSkuaWQgPT0gbGVmdFR5cGVJZCkgeyAvLyBvYnZpb3VzIGlkZW50aXR5IGNhc3QKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWxlZnQpOworCQkJCWxlZnRJc0Nhc3QgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoYWx0ZXJuYXRlTGVmdFR5cGVJZCA9PSBUeXBlSWRzLlRfbnVsbCkgeworCQkJCWFsdGVybmF0ZUxlZnRUeXBlSWQgPSBsZWZ0VHlwZUlkOyAgLy8gdG9sZXJhdGUgbnVsbCBhcmd1bWVudCBjYXN0CisJCQkJbGVmdElzQ2FzdCA9IGZhbHNlOwogCQkJfQogCQl9Ci0vKgkJdG9sZXJhdGUgd2lkZW5pbmcgY2FzdCBpbiB1bmFyeSBleHByZXNzaW9ucywgYXMgbWF5IGJlIHVzZWQgd2hlbiBjb21iaW5lZCBpbiBiaW5hcnkgZXhwcmVzc2lvbnMgKDQxNjgwKQotCQlpbnQgYWx0ZXJuYXRlT3BlcmF0b3JTaWduYXR1cmUgPSBPcGVyYXRvckV4cHJlc3Npb24uT3BlcmF0b3JTaWduYXR1cmVzW29wZXJhdG9yXVsoYWx0ZXJuYXRlTGVmdFR5cGVJZCA8PCA0KSArIGFsdGVybmF0ZUxlZnRUeXBlSWRdOworCX0KKwkvLyBjaGVjayBuZWVkIGZvciByaWdodCBvcGVyYW5kIGNhc3QKKwlpbnQgYWx0ZXJuYXRlUmlnaHRUeXBlSWQgPSByaWdodFR5cGVJZDsKKwlpZiAocmlnaHRJc0Nhc3QpIHsKKwkJaWYgKChyaWdodC5iaXRzICYgQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3QpID09IDAgJiYgcmlnaHQucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJLy8gbmFycm93aW5nIGNvbnZlcnNpb24gb24gYmFzZSB0eXBlIG1heSBjaGFuZ2UgdmFsdWUsIHRodXMgbmVjZXNzYXJ5CisJCQlyaWdodElzQ2FzdCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlUmlnaHRUeXBlID0gKChDYXN0RXhwcmVzc2lvbilyaWdodCkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7CisJCQlpZiAoYWx0ZXJuYXRlUmlnaHRUeXBlID09IG51bGwpIHJldHVybjsgLy8gY2Fubm90IGRvIGJldHRlcgorCQkJaWYgKChhbHRlcm5hdGVSaWdodFR5cGVJZCA9IGFsdGVybmF0ZVJpZ2h0VHlwZS5pZCkgPT0gcmlnaHRUeXBlSWQgfHwgc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShhbHRlcm5hdGVSaWdodFR5cGUpLmlkID09IHJpZ2h0VHlwZUlkKSB7IC8vIG9idmlvdXMgaWRlbnRpdHkgY2FzdAorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pcmlnaHQpOworCQkJCXJpZ2h0SXNDYXN0ID0gZmFsc2U7CisJCQl9IGVsc2UgaWYgKGFsdGVybmF0ZVJpZ2h0VHlwZUlkID09IFR5cGVJZHMuVF9udWxsKSB7CisJCQkJYWx0ZXJuYXRlUmlnaHRUeXBlSWQgPSByaWdodFR5cGVJZDsgIC8vIHRvbGVyYXRlIG51bGwgYXJndW1lbnQgY2FzdAorCQkJCXJpZ2h0SXNDYXN0ID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisJaWYgKGxlZnRJc0Nhc3QgfHwgcmlnaHRJc0Nhc3QpIHsKKwkJaWYgKGFsdGVybmF0ZUxlZnRUeXBlSWQgPiAxNSB8fCBhbHRlcm5hdGVSaWdodFR5cGVJZCA+IDE1KSB7IC8vIG11c3QgY29udmVydCBTdHJpbmcgKyBPYmplY3QgfHwgT2JqZWN0ICsgU3RyaW5nCisJCQlpZiAoYWx0ZXJuYXRlTGVmdFR5cGVJZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpIHsKKwkJCQlhbHRlcm5hdGVSaWdodFR5cGVJZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdDsKKwkJCX0gZWxzZSBpZiAoYWx0ZXJuYXRlUmlnaHRUeXBlSWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7CisJCQkJYWx0ZXJuYXRlTGVmdFR5cGVJZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuOyAvLyBpbnZhbGlkIG9wZXJhdG9yCisJCQl9CisJCX0KKwkJaW50IGFsdGVybmF0ZU9wZXJhdG9yU2lnbmF0dXJlID0gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU2lnbmF0dXJlc1tvcGVyYXRvcl1bKGFsdGVybmF0ZUxlZnRUeXBlSWQgPDwgNCkgKyBhbHRlcm5hdGVSaWdodFR5cGVJZF07CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlnaHQgLS0+IHJlc3VsdAogCQkvLyAgMTExMSAgIDAwMDAgICAgICAgMTExMSAgIDAwMDAgICAgIDExMTEKIAkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCiAJCWZpbmFsIGludCBDb21wYXJlTUFTSyA9ICgweEY8PDE2KSArICgweEY8PDgpICsgMHhGOyAvLyBtYXNrIGhpZGluZyBjb21waWxlLXRpbWUgdHlwZXMKIAkJaWYgKChvcGVyYXRvclNpZ25hdHVyZSAmIENvbXBhcmVNQVNLKSA9PSAoYWx0ZXJuYXRlT3BlcmF0b3JTaWduYXR1cmUgJiBDb21wYXJlTUFTSykpIHsgLy8gc2FtZSBwcm9tb3Rpb25zIGFuZCByZXN1bHQKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdEZvckFyZ3VtZW50KChDYXN0RXhwcmVzc2lvbilleHByZXNzaW9uLCAgVHlwZUJpbmRpbmcud2VsbEtub3duVHlwZShzY29wZSwgZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkpOyAKLQkJfQotKi8JCQotCX0KLQkJCi0JLyoqCi0JICogQ2FzdCBleHByZXNzaW9ucyB3aWxsIGNvbnNpZGVyZWQgYXMgdXNlZnVsIGlmIHJlbW92aW5nIHRoZW0gYWxsIHdvdWxkIGFjdHVhbGx5IGJpbmQgdG8gYSBkaWZmZXJlbnQgbWV0aG9kCi0JICogKG5vIGZpbmUgZ3JhaW4gYW5hbHlzaXMgb24gcGVyIGNhc3RlZCBhcmd1bWVudCBiYXNpcywgc2ltcGx5IHNlcGFyYXRlIHdpZGVuaW5nIGNhc3QgZnJvbSBuYXJyb3dpbmcgb25lcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tOZWVkRm9yQXJndW1lbnRDYXN0cyhCbG9ja1Njb3BlIHNjb3BlLCBFeHByZXNzaW9uIHJlY2VpdmVyLCBUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIE1ldGhvZEJpbmRpbmcgYmluZGluZywgRXhwcmVzc2lvbltdIGFyZ3VtZW50cywgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBmaW5hbCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgewotCQotCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlVubmVjZXNzYXJ5VHlwZUNoZWNrKSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKLQkJCi0JCWludCBsZW5ndGggPSBhcmd1bWVudFR5cGVzLmxlbmd0aDsKLQotCQkvLyBpdGVyYXRlIG92ZXIgYXJndW1lbnRzLCBhbmQgcmV0cmlldmUgb3JpZ2luYWwgYXJndW1lbnQgdHlwZXMgKGJlZm9yZSBjYXN0KQotCQlUeXBlQmluZGluZ1tdIHJhd0FyZ3VtZW50VHlwZXMgPSBhcmd1bWVudFR5cGVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlFeHByZXNzaW9uIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOwotCQkJaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKLSAJCQkJLy8gbmFycm93aW5nIGNvbnZlcnNpb24gb24gYmFzZSB0eXBlIG1heSBjaGFuZ2UgdmFsdWUsIHRodXMgbmVjZXNzYXJ5Ci0JCQkJaWYgKChhcmd1bWVudC5iaXRzICYgVW5uZWNlc3NhcnlDYXN0KSA9PSAwICYmIGFyZ3VtZW50LnJlc29sdmVkVHlwZS5pc0Jhc2VUeXBlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCi0JCQkJVHlwZUJpbmRpbmcgY2FzdGVkRXhwcmVzc2lvblR5cGUgPSAoKENhc3RFeHByZXNzaW9uKWFyZ3VtZW50KS5leHByZXNzaW9uLnJlc29sdmVkVHlwZTsKLQkJCQlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYW5ub3QgZG8gYmV0dGVyCi0JCQkJLy8gb2J2aW91cyBpZGVudGl0eSBjYXN0Ci0JCQkJaWYgKGNhc3RlZEV4cHJlc3Npb25UeXBlID09IGFyZ3VtZW50VHlwZXNbaV0pIHsgCi0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pYXJndW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCl7Ci0JCQkJCWNvbnRpbnVlOyAvLyB0b2xlcmF0ZSBudWxsIGFyZ3VtZW50IGNhc3QKLQkJCQl9IGVsc2UgaWYgKChhcmd1bWVudC5pbXBsaWNpdENvbnZlcnNpb24gJiBCT1hJTkcpICE9IDApIHsKLQkJCQkJY29udGludWU7IC8vIGJveGluZyBoYXMgYSBzaWRlIGVmZmVjdDogKGludCkgY2hhciAgIGlzIG5vdCBib3hlZCBhcyBzaW1wbGUgY2hhcgotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyYXdBcmd1bWVudFR5cGVzID09IGFyZ3VtZW50VHlwZXMpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocmF3QXJndW1lbnRUeXBlcywgMCwgcmF3QXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdLCAwLCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCS8vIHJldGFpbiBvcmlnaW5hbCBhcmd1bWVudCB0eXBlCi0JCQkJCXJhd0FyZ3VtZW50VHlwZXNbaV0gPSBjYXN0ZWRFeHByZXNzaW9uVHlwZTsgCi0JCQkJfQotCQkJfQkJCQkKLQkJfQotCQkvLyBwZXJmb3JtIGFsdGVybmF0ZSBsb29rdXAgd2l0aCBvcmlnaW5hbCB0eXBlcwotCQlpZiAocmF3QXJndW1lbnRUeXBlcyAhPSBhcmd1bWVudFR5cGVzKSB7Ci0JCQljaGVja0FsdGVybmF0ZUJpbmRpbmcoc2NvcGUsIHJlY2VpdmVyLCByZWNlaXZlclR5cGUsIGJpbmRpbmcsIGFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgcmF3QXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworCQkJaWYgKGxlZnRJc0Nhc3QpIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pbGVmdCk7CisJCQlpZiAocmlnaHRJc0Nhc3QpIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pcmlnaHQpOwogCQl9CiAJfQorfQogCi0JLyoqCi0JICogQ2hlY2sgYmluYXJ5IG9wZXJhdG9yIGNhc3RlZCBhcmd1bWVudHMgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoQmxvY2tTY29wZSBzY29wZSwgaW50IG9wZXJhdG9yLCBpbnQgb3BlcmF0b3JTaWduYXR1cmUsIEV4cHJlc3Npb24gbGVmdCwgaW50IGxlZnRUeXBlSWQsIGJvb2xlYW4gbGVmdElzQ2FzdCwgRXhwcmVzc2lvbiByaWdodCwgaW50IHJpZ2h0VHlwZUlkLCBib29sZWFuIHJpZ2h0SXNDYXN0KSB7Ci0KLQkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjaykgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47Ci0KLQkJLy8gY2hlY2sgbmVlZCBmb3IgbGVmdCBvcGVyYW5kIGNhc3QKLQkJaW50IGFsdGVybmF0ZUxlZnRUeXBlSWQgPSBsZWZ0VHlwZUlkOwotCQlpZiAobGVmdElzQ2FzdCkgewotCQkJaWYgKChsZWZ0LmJpdHMgJiBVbm5lY2Vzc2FyeUNhc3QpID09IDAgJiYgbGVmdC5yZXNvbHZlZFR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0gCQkJCS8vIG5hcnJvd2luZyBjb252ZXJzaW9uIG9uIGJhc2UgdHlwZSBtYXkgY2hhbmdlIHZhbHVlLCB0aHVzIG5lY2Vzc2FyeQotIAkJCQlsZWZ0SXNDYXN0ID0gZmFsc2U7Ci0JCQl9IGVsc2UgIHsKLQkJCQlUeXBlQmluZGluZyBhbHRlcm5hdGVMZWZ0VHlwZSA9ICgoQ2FzdEV4cHJlc3Npb24pbGVmdCkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7Ci0JCQkJaWYgKGFsdGVybmF0ZUxlZnRUeXBlID09IG51bGwpIHJldHVybjsgLy8gY2Fubm90IGRvIGJldHRlcgotCQkJCWlmICgoYWx0ZXJuYXRlTGVmdFR5cGVJZCA9IGFsdGVybmF0ZUxlZnRUeXBlLmlkKSA9PSBsZWZ0VHlwZUlkKSB7IC8vIG9idmlvdXMgaWRlbnRpdHkgY2FzdAotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWxlZnQpOyAKLQkJCQkJbGVmdElzQ2FzdCA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoYWx0ZXJuYXRlTGVmdFR5cGVJZCA9PSBUX251bGwpIHsKLQkJCQkJYWx0ZXJuYXRlTGVmdFR5cGVJZCA9IGxlZnRUeXBlSWQ7ICAvLyB0b2xlcmF0ZSBudWxsIGFyZ3VtZW50IGNhc3QKLQkJCQkJbGVmdElzQ2FzdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KK3ByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tBbHRlcm5hdGVCaW5kaW5nKEJsb2NrU2NvcGUgc2NvcGUsIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgTWV0aG9kQmluZGluZyBiaW5kaW5nLCBFeHByZXNzaW9uW10gYXJndW1lbnRzLCBUeXBlQmluZGluZ1tdIG9yaWdpbmFsQXJndW1lbnRUeXBlcywgVHlwZUJpbmRpbmdbXSBhbHRlcm5hdGVBcmd1bWVudFR5cGVzLCBmaW5hbCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCQlJbnZvY2F0aW9uU2l0ZSBmYWtlSW52b2NhdGlvblNpdGUgPSBuZXcgSW52b2NhdGlvblNpdGUoKXsKKwkJCXB1YmxpYyBUeXBlQmluZGluZ1tdIGdlbmVyaWNUeXBlQXJndW1lbnRzKCkgeyByZXR1cm4gbnVsbDsgfQorCQkJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpeyByZXR1cm4gaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpOyB9CisJCQlwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7IHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1R5cGVBY2Nlc3MoKTsgfQorCQkJcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgYWN0dWFsUmVjZWl2ZXJUeXBlKSB7IC8qIGlnbm9yZSAqL30KKwkJCXB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgeyAvKiBpZ25vcmUgKi99CisJCQlwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBkZXB0aCl7IC8qIGlnbm9yZSAqL30KKwkJCXB1YmxpYyBpbnQgc291cmNlU3RhcnQoKSB7IHJldHVybiAwOyB9CisJCQlwdWJsaWMgaW50IHNvdXJjZUVuZCgpIHsgcmV0dXJuIDA7IH0KKwkJCXB1YmxpYyBUeXBlQmluZGluZyBleHBlY3RlZFR5cGUoKSB7IHJldHVybiBpbnZvY2F0aW9uU2l0ZS5leHBlY3RlZFR5cGUoKTsgfQorCQl9OworCQlNZXRob2RCaW5kaW5nIGJpbmRpbmdJZk5vQ2FzdDsKKwkJaWYgKGJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQliaW5kaW5nSWZOb0Nhc3QgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcigoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUsIGFsdGVybmF0ZUFyZ3VtZW50VHlwZXMsIGZha2VJbnZvY2F0aW9uU2l0ZSk7CisJCX0gZWxzZSB7CisJCQliaW5kaW5nSWZOb0Nhc3QgPSByZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpCisJCQkJPyBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZChiaW5kaW5nLnNlbGVjdG9yLCBhbHRlcm5hdGVBcmd1bWVudFR5cGVzLCBmYWtlSW52b2NhdGlvblNpdGUpCisJCQkJOiBzY29wZS5nZXRNZXRob2QocmVjZWl2ZXJUeXBlLCBiaW5kaW5nLnNlbGVjdG9yLCBhbHRlcm5hdGVBcmd1bWVudFR5cGVzLCBmYWtlSW52b2NhdGlvblNpdGUpOwogCQl9Ci0JCS8vIGNoZWNrIG5lZWQgZm9yIHJpZ2h0IG9wZXJhbmQgY2FzdAotCQlpbnQgYWx0ZXJuYXRlUmlnaHRUeXBlSWQgPSByaWdodFR5cGVJZDsKLQkJaWYgKHJpZ2h0SXNDYXN0KSB7Ci0JCQlpZiAoKHJpZ2h0LmJpdHMgJiBVbm5lY2Vzc2FyeUNhc3QpID09IDAgJiYgcmlnaHQucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSkgewotIAkJCQkvLyBuYXJyb3dpbmcgY29udmVyc2lvbiBvbiBiYXNlIHR5cGUgbWF5IGNoYW5nZSB2YWx1ZSwgdGh1cyBuZWNlc3NhcnkKLSAJCQkJcmlnaHRJc0Nhc3QgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlUmlnaHRUeXBlID0gKChDYXN0RXhwcmVzc2lvbilyaWdodCkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7Ci0JCQkJaWYgKGFsdGVybmF0ZVJpZ2h0VHlwZSA9PSBudWxsKSByZXR1cm47IC8vIGNhbm5vdCBkbyBiZXR0ZXIKLQkJCQlpZiAoKGFsdGVybmF0ZVJpZ2h0VHlwZUlkID0gYWx0ZXJuYXRlUmlnaHRUeXBlLmlkKSA9PSByaWdodFR5cGVJZCkgeyAvLyBvYnZpb3VzIGlkZW50aXR5IGNhc3QKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlDYXN0KChDYXN0RXhwcmVzc2lvbilyaWdodCk7IAotCQkJCQlyaWdodElzQ2FzdCA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoYWx0ZXJuYXRlUmlnaHRUeXBlSWQgPT0gVF9udWxsKSB7Ci0JCQkJCWFsdGVybmF0ZVJpZ2h0VHlwZUlkID0gcmlnaHRUeXBlSWQ7ICAvLyB0b2xlcmF0ZSBudWxsIGFyZ3VtZW50IGNhc3QKLQkJCQkJcmlnaHRJc0Nhc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCWlmIChsZWZ0SXNDYXN0IHx8IHJpZ2h0SXNDYXN0KSB7Ci0JCQlpZiAoYWx0ZXJuYXRlTGVmdFR5cGVJZCA+IDE1IHx8IGFsdGVybmF0ZVJpZ2h0VHlwZUlkID4gMTUpIHsgLy8gbXVzdCBjb252ZXJ0IFN0cmluZyArIE9iamVjdCB8fCBPYmplY3QgKyBTdHJpbmcKLQkJCQlpZiAoYWx0ZXJuYXRlTGVmdFR5cGVJZCA9PSBUX0phdmFMYW5nU3RyaW5nKSB7Ci0JCQkJCWFsdGVybmF0ZVJpZ2h0VHlwZUlkID0gVF9KYXZhTGFuZ09iamVjdDsKLQkJCQl9IGVsc2UgaWYgKGFsdGVybmF0ZVJpZ2h0VHlwZUlkID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKLQkJCQkJYWx0ZXJuYXRlTGVmdFR5cGVJZCA9IFRfSmF2YUxhbmdPYmplY3Q7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuOyAvLyBpbnZhbGlkIG9wZXJhdG9yCi0JCQkJfQotCQkJfQotCQkJaW50IGFsdGVybmF0ZU9wZXJhdG9yU2lnbmF0dXJlID0gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU2lnbmF0dXJlc1tvcGVyYXRvcl1bKGFsdGVybmF0ZUxlZnRUeXBlSWQgPDwgNCkgKyBhbHRlcm5hdGVSaWdodFR5cGVJZF07Ci0JCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ2h0IC0tPiByZXN1bHQKLQkJCS8vICAxMTExICAgMDAwMCAgICAgICAxMTExICAgMDAwMCAgICAgMTExMQotCQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCi0JCQlmaW5hbCBpbnQgQ29tcGFyZU1BU0sgPSAoMHhGPDwxNikgKyAoMHhGPDw4KSArIDB4RjsgLy8gbWFzayBoaWRpbmcgY29tcGlsZS10aW1lIHR5cGVzCi0JCQlpZiAoKG9wZXJhdG9yU2lnbmF0dXJlICYgQ29tcGFyZU1BU0spID09IChhbHRlcm5hdGVPcGVyYXRvclNpZ25hdHVyZSAmIENvbXBhcmVNQVNLKSkgeyAvLyBzYW1lIHByb21vdGlvbnMgYW5kIHJlc3VsdAotCQkJCWlmIChsZWZ0SXNDYXN0KSBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWxlZnQpOyAKLQkJCQlpZiAocmlnaHRJc0Nhc3QpIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pcmlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0FsdGVybmF0ZUJpbmRpbmcoQmxvY2tTY29wZSBzY29wZSwgRXhwcmVzc2lvbiByZWNlaXZlciwgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBNZXRob2RCaW5kaW5nIGJpbmRpbmcsIEV4cHJlc3Npb25bXSBhcmd1bWVudHMsIFR5cGVCaW5kaW5nW10gb3JpZ2luYWxBcmd1bWVudFR5cGVzLCBUeXBlQmluZGluZ1tdIGFsdGVybmF0ZUFyZ3VtZW50VHlwZXMsIGZpbmFsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7Ci0KLQkJCUludm9jYXRpb25TaXRlIGZha2VJbnZvY2F0aW9uU2l0ZSA9IG5ldyBJbnZvY2F0aW9uU2l0ZSgpewkKLQkJCQlwdWJsaWMgVHlwZUJpbmRpbmdbXSBnZW5lcmljVHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIG51bGw7IH0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQWNjZXNzKCl7IHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1N1cGVyQWNjZXNzKCk7IH0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7IHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1R5cGVBY2Nlc3MoKTsgfQotCQkJCXB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIGFjdHVhbFJlY2VpdmVyVHlwZSkgeyAvKiBpZ25vcmUgKi99Ci0JCQkJcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKSB7IC8qIGlnbm9yZSAqL30KLQkJCQlwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBkZXB0aCl7IC8qIGlnbm9yZSAqL30KLQkJCQlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0KCkgeyByZXR1cm4gMDsgfQotCQkJCXB1YmxpYyBpbnQgc291cmNlRW5kKCkgeyByZXR1cm4gMDsgfQotCQkJfTsJCi0JCQlNZXRob2RCaW5kaW5nIGJpbmRpbmdJZk5vQ2FzdDsKLQkJCWlmIChiaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCWJpbmRpbmdJZk5vQ2FzdCA9IHNjb3BlLmdldENvbnN0cnVjdG9yKChSZWZlcmVuY2VCaW5kaW5nKXJlY2VpdmVyVHlwZSwgYWx0ZXJuYXRlQXJndW1lbnRUeXBlcywgZmFrZUludm9jYXRpb25TaXRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmluZGluZ0lmTm9DYXN0ID0gcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKQotCQkJCQk/IHNjb3BlLmdldEltcGxpY2l0TWV0aG9kKGJpbmRpbmcuc2VsZWN0b3IsIGFsdGVybmF0ZUFyZ3VtZW50VHlwZXMsIGZha2VJbnZvY2F0aW9uU2l0ZSkKLQkJCQkJOiBzY29wZS5nZXRNZXRob2QocmVjZWl2ZXJUeXBlLCBiaW5kaW5nLnNlbGVjdG9yLCBhbHRlcm5hdGVBcmd1bWVudFR5cGVzLCBmYWtlSW52b2NhdGlvblNpdGUpOyAJCi0JCQl9Ci0JCQlpZiAoYmluZGluZ0lmTm9DYXN0ID09IGJpbmRpbmcpIHsKLQkJCQlpbnQgYXJndW1lbnRMZW5ndGggPSBvcmlnaW5hbEFyZ3VtZW50VHlwZXMubGVuZ3RoOwotCQkJCWlmIChiaW5kaW5nLmlzVmFyYXJncygpKSB7Ci0JCQkJCWludCBwYXJhbUxlbmd0aCA9IGJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7Ci0JCQkJCWlmIChwYXJhbUxlbmd0aCA9PSBhcmd1bWVudExlbmd0aCkgewotCQkJCQkJaW50IHZhcmFyZ3NJbmRleCA9IHBhcmFtTGVuZ3RoIC0gMTsKLQkJCQkJCUFycmF5QmluZGluZyB2YXJhcmdzVHlwZSA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmcucGFyYW1ldGVyc1t2YXJhcmdzSW5kZXhdOwotCQkJCQkJVHlwZUJpbmRpbmcgbGFzdEFyZ1R5cGUgPSBhbHRlcm5hdGVBcmd1bWVudFR5cGVzW3ZhcmFyZ3NJbmRleF07Ci0JCQkJCQkvLyBvcmlnaW5hbFR5cGUgbWF5IGJlIGNvbXBhdGlibGUgYWxyZWFkeSwgYnV0IGNhc3QgbWFuZGF0ZWQKLQkJCQkJCS8vIHRvIGNsYXJpZnkgYmV0d2VlbiB2YXJhcmdzL25vbi12YXJhcmdzIGNhbGwKLQkJCQkJCWlmICh2YXJhcmdzVHlwZS5kaW1lbnNpb25zICE9IGxhc3RBcmdUeXBlLmRpbWVuc2lvbnMoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChsYXN0QXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHZhcmFyZ3NUeXBlLmVsZW1lbnRzVHlwZSgpKQotCQkJCQkJCQkmJiBsYXN0QXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHZhcmFyZ3NUeXBlKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KKwkJaWYgKGJpbmRpbmdJZk5vQ2FzdCA9PSBiaW5kaW5nKSB7CisJCQlpbnQgYXJndW1lbnRMZW5ndGggPSBvcmlnaW5hbEFyZ3VtZW50VHlwZXMubGVuZ3RoOworCQkJaWYgKGJpbmRpbmcuaXNWYXJhcmdzKCkpIHsKKwkJCQlpbnQgcGFyYW1MZW5ndGggPSBiaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJCWlmIChwYXJhbUxlbmd0aCA9PSBhcmd1bWVudExlbmd0aCkgeworCQkJCQlpbnQgdmFyYXJnc0luZGV4ID0gcGFyYW1MZW5ndGggLSAxOworCQkJCQlBcnJheUJpbmRpbmcgdmFyYXJnc1R5cGUgPSAoQXJyYXlCaW5kaW5nKSBiaW5kaW5nLnBhcmFtZXRlcnNbdmFyYXJnc0luZGV4XTsKKwkJCQkJVHlwZUJpbmRpbmcgbGFzdEFyZ1R5cGUgPSBhbHRlcm5hdGVBcmd1bWVudFR5cGVzW3ZhcmFyZ3NJbmRleF07CisJCQkJCS8vIG9yaWdpbmFsVHlwZSBtYXkgYmUgY29tcGF0aWJsZSBhbHJlYWR5LCBidXQgY2FzdCBtYW5kYXRlZAorCQkJCQkvLyB0byBjbGFyaWZ5IGJldHdlZW4gdmFyYXJncy9ub24tdmFyYXJncyBjYWxsCisJCQkJCWlmICh2YXJhcmdzVHlwZS5kaW1lbnNpb25zICE9IGxhc3RBcmdUeXBlLmRpbWVuc2lvbnMoKSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWlmIChsYXN0QXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHZhcmFyZ3NUeXBlLmVsZW1lbnRzVHlwZSgpKQorCQkJCQkJCSYmIGxhc3RBcmdUeXBlLmlzQ29tcGF0aWJsZVdpdGgodmFyYXJnc1R5cGUpKSB7CisJCQkJCQlyZXR1cm47CiAJCQkJCX0KIAkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChvcmlnaW5hbEFyZ3VtZW50VHlwZXNbaV0gIT0gYWx0ZXJuYXRlQXJndW1lbnRUeXBlc1tpXSkgewotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlDYXN0KChDYXN0RXhwcmVzc2lvbilhcmd1bWVudHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tVbnNhZmVDYXN0KFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBjYXN0VHlwZSwgVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUsIFR5cGVCaW5kaW5nIG1hdGNoLCBib29sZWFuIGlzTmFycm93aW5nKSB7Ci0gCQlpZiAobWF0Y2ggPT0gY2FzdFR5cGUpIHsKLQkJCWlmICghaXNOYXJyb3dpbmcgJiYgbWF0Y2ggPT0gdGhpcy5yZXNvbHZlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSkgeyAvLyBkbyBub3QgdGFnIGFzIHVubmVjZXNzYXJ5IHdoZW4gcmVjdXJzaW5nIHRocm91Z2ggdXBwZXIgYm91bmRzCi0JCQkJdGFnQXNVbm5lY2Vzc2FyeUNhc3Qoc2NvcGUsIGNhc3RUeXBlKTsKIAkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChtYXRjaCAhPSBudWxsICYmIG1hdGNoLmlzUHJvdmFibHlEaXN0aW5jdEZyb20oaXNOYXJyb3dpbmcgPyBleHByZXNzaW9uVHlwZSA6IGNhc3RUeXBlLCAwKSkgewotCQkJcmV0dXJuIGZhbHNlOyAKLQkJfQotCQlzd2l0Y2ggKGNhc3RUeXBlLmtpbmQoKSkgewotCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6Ci0JCQkJaWYgKGNhc3RUeXBlLmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCQkJCWlmIChtYXRjaCA9PSBudWxsKSB7IC8vIHVucmVsYXRlZCB0eXBlcwotCQkJCQkJdGhpcy5iaXRzIHw9IFVuc2FmZUNhc3Q7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlzd2l0Y2ggKG1hdGNoLmtpbmQoKSkgewotCQkJCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6Ci0JCQkJCQkJaWYgKGlzTmFycm93aW5nKSB7Ci0JCQkJCQkJCS8vIFtKTFMgNS41XSBUIDw6IFMKLQkJCQkJCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzUmF3VHlwZSgpIHx8ICFleHByZXNzaW9uVHlwZS5pc0VxdWl2YWxlbnRUbyhtYXRjaCkpIHsKLQkJCQkJCQkJCXRoaXMuYml0cyB8PSBVbnNhZmVDYXN0OwotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gW0pMUyA1LjVdIFMgaGFzIG5vIHN1YnR5cGUgWCAhPSBULCBzdWNoIHRoYXQgfFh8ID09IHxUfAotCQkJCQkJCQlUeXBlQmluZGluZyBnZW5lcmljQ2FzdFR5cGUgPSBjYXN0VHlwZS5lcmFzdXJlKCk7IC8vIGp1bXAgdG8gZ2VuZXJpYyB0eXBlCi0JCQkJCQkJCVR5cGVCaW5kaW5nIGdlbmVyaWNNYXRjaCA9IGdlbmVyaWNDYXN0VHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGV4cHJlc3Npb25UeXBlKTsKLQkJCQkJCQkJaWYgKGdlbmVyaWNNYXRjaCA9PSBtYXRjaCkgewotCQkJCQkJCQkJdGhpcy5iaXRzIHw9IFVuc2FmZUNhc3Q7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gW0pMUyA1LjVdIFQgPjogUwotCQkJCQkJCQlpZiAoIW1hdGNoLmlzRXF1aXZhbGVudFRvKGNhc3RUeXBlKSkgewotCQkJCQkJCQkJdGhpcy5iaXRzIHw9IFVuc2FmZUNhc3Q7Ci0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6Ci0JCQkJCQkJdGhpcy5iaXRzIHw9IFVuc2FmZUNhc3Q7IC8vIHVwY2FzdCBzaW5jZSBjYXN0VHlwZSBpcyBrbm93biB0byBiZSBib3VuZCBwYXJhbVR5cGUKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCWlmIChpc05hcnJvd2luZyl7Ci0JCQkJCQkJCS8vIG1hdGNoIGlzIG5vdCBwYXJhbWV0ZXJpemVkIG9yIHJhdywgdGhlbiBhbnkgb3RoZXIgc3VidHlwZSBvZiBtYXRjaCB3aWxsIGVyYXNlICB0byB8VHwKLQkJCQkJCQkJdGhpcy5iaXRzIHw9IFVuc2FmZUNhc3Q7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7CisJCQkJaWYgKG9yaWdpbmFsQXJndW1lbnRUeXBlc1tpXSAhPSBhbHRlcm5hdGVBcmd1bWVudFR5cGVzW2ldCisgICAgICAgICAgICAgICAgICAgICAgIC8qJiYgIW9yaWdpbmFsQXJndW1lbnRUeXBlc1tpXS5uZWVkc1VuY2hlY2tlZENvbnZlcnNpb24oYWx0ZXJuYXRlQXJndW1lbnRUeXBlc1tpXSkqLykgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWFyZ3VtZW50c1tpXSk7CiAJCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgotCQkJCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gY2FzdFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKLQkJCQlpZiAoaXNOYXJyb3dpbmcgJiYgKGxlYWZUeXBlLmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpIHx8IGxlYWZUeXBlLmlzVHlwZVZhcmlhYmxlKCkpKSB7Ci0JCQkJCXRoaXMuYml0cyB8PSBVbnNhZmVDYXN0OwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgotCQkJCXRoaXMuYml0cyB8PSBVbnNhZmVDYXN0OwotCQkJCXJldHVybiB0cnVlOwkJCQkKKwkJCX0KIAkJfQorfQorCitwdWJsaWMgYm9vbGVhbiBjaGVja1Vuc2FmZUNhc3QoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGNhc3RUeXBlLCBUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcgbWF0Y2gsIGJvb2xlYW4gaXNOYXJyb3dpbmcpIHsKKwlpZiAobWF0Y2ggPT0gY2FzdFR5cGUpIHsKIAkJaWYgKCFpc05hcnJvd2luZyAmJiBtYXRjaCA9PSB0aGlzLnJlc29sdmVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKSB7IC8vIGRvIG5vdCB0YWcgYXMgdW5uZWNlc3Nhcnkgd2hlbiByZWN1cnNpbmcgdGhyb3VnaCB1cHBlciBib3VuZHMKIAkJCXRhZ0FzVW5uZWNlc3NhcnlDYXN0KHNjb3BlLCBjYXN0VHlwZSk7CiAJCX0KIAkJcmV0dXJuIHRydWU7Ci0JfQkKLQkKLQkvKioKLQkgKiBDYXN0IGV4cHJlc3Npb24gY29kZSBnZW5lcmF0aW9uCi0JICoKLQkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQotCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KLQkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlib29sZWFuIG5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gKHRoaXMuYml0cyAmIEdlbmVyYXRlQ2hlY2tjYXN0KSAhPSAwOwotCQlpZiAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQlpZiAodmFsdWVSZXF1aXJlZCB8fCBuZWVkUnVudGltZUNoZWNrY2FzdCkgeyAvLyBBZGRlZCBmb3I6IDFGMVc5SUc6IElWSkNPTTpXSU5OVCAtIENvbXBpbGVyIG9taXRzIGNhc3RpbmcgY2hlY2sKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7Ci0JCQkJaWYgKG5lZWRSdW50aW1lQ2hlY2tjYXN0KSB7Ci0JCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMucmVzb2x2ZWRUeXBlKTsKKwl9CisJaWYgKG1hdGNoICE9IG51bGwpIHsKKwkJaWYgKGlzTmFycm93aW5nCisJCQkJPyBtYXRjaC5pc1Byb3ZhYmx5RGlzdGluY3QoZXhwcmVzc2lvblR5cGUpCisJCQkJOiBjYXN0VHlwZS5pc1Byb3ZhYmx5RGlzdGluY3QobWF0Y2gpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJc3dpdGNoIChjYXN0VHlwZS5raW5kKCkpIHsKKwkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6CisJCQlpZiAoIWNhc3RUeXBlLmlzUmVpZmlhYmxlKCkpIHsKKwkJCQlpZiAobWF0Y2ggPT0gbnVsbCkgeyAvLyB1bnJlbGF0ZWQgdHlwZXMKKwkJCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuVW5zYWZlQ2FzdDsKKwkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQotCQkJCWlmICghdmFsdWVSZXF1aXJlZCkgewotCQkJCQkvLyB0aGUgcmVzb2x2ZVR5cGUgY2Fubm90IGJlIGRvdWJsZSBvciBsb25nCi0JCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQkJfQotCQkJfQotCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKLQkJCXJldHVybjsKLQkJfQotCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQgfHwgbmVlZFJ1bnRpbWVDaGVja2Nhc3QpOwotCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QgJiYgdGhpcy5leHByZXNzaW9uLnBvc3RDb252ZXJzaW9uVHlwZShjdXJyZW50U2NvcGUpICE9IHRoaXMucmVzb2x2ZWRUeXBlLmVyYXN1cmUoKSkgeyAvLyBubyBuZWVkIHRvIGlzc3VlIGEgY2hlY2tjYXN0IGlmIGFscmVhZHkgZG9uZSBhcyBnZW5lcmljQ2FzdAotCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZXNvbHZlZFR5cGUpOwotCQl9Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7Ci0JCX0gZWxzZSBpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKLQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCX0KLQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBpbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCl7IAotCQlFeHByZXNzaW9uIGN1cnJlbnQgPSB0aGlzLmV4cHJlc3Npb247Ci0JCXdoaWxlIChjdXJyZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKLQkJCWN1cnJlbnQgPSAoKENhc3RFeHByZXNzaW9uKSBjdXJyZW50KS5leHByZXNzaW9uOwotCQl9Ci0JCXJldHVybiBjdXJyZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI2xvY2FsVmFyaWFibGVCaW5kaW5nKCkKLQkgKi8KLQlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZUJpbmRpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmV4cHJlc3Npb24ubG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGludCBudWxsU3RhdHVzKEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCXJldHVybiB0aGlzLmV4cHJlc3Npb24ubnVsbFN0YXR1cyhmbG93SW5mbyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI29wdGltaXplZEJvb2xlYW5Db25zdGFudCgpCi0JICovCi0JcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpIHsKLQkJc3dpdGNoKHRoaXMucmVzb2x2ZWRUeXBlLmlkKSB7Ci0JCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQljYXNlIFRfSmF2YUxhbmdCb29sZWFuIDoKLQkJCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwotCQl9Ci0JCXJldHVybiBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQotCQlvdXRwdXQuYXBwZW5kKCcoJyk7Ci0JCXR5cGUucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7Ci0JfQotCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJLy8gY29tcHV0ZSBhIG5ldyBjb25zdGFudCBpZiB0aGUgY2FzdCBpcyBlZmZlY3RpdmUKLQotCQkvLyBkdWUgdG8gdGhlIGZhY3QgYW4gZXhwcmVzc2lvbiBtYXkgc3RhcnQgd2l0aCAoIGFuZCB0aGF0IGEgY2FzdCBjYW4gYWxzbyBzdGFydCB3aXRoICgKLQkJLy8gdGhlIGZpZWxkIGlzIGFuIGV4cHJlc3Npb24uLi4uaXQgY2FuIGJlIGEgVHlwZVJlZmVyZW5jZSBPUiBhIE5hbWVSZWZlcmVuY2UgT3IKLQkJLy8gYW55IGtpbmQgb2YgRXhwcmVzc2lvbiA8LS0gdGhpcyBsYXN0IG9uZSBpcyBpbnZhbGlkLi4uLi4uLgotCi0JCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlpbXBsaWNpdENvbnZlcnNpb24gPSBUX3VuZGVmaW5lZDsKLQotCQlpZiAoKHR5cGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB8fCAodHlwZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpCi0JCQkJJiYgKCh0eXBlLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgPT0gMCkgeyAvLyBubyBleHRyYSBwYXJlbnRoZXNpcyBhcm91bmQgdHlwZTogKChBKSlleHAKLQotCQkJVHlwZUJpbmRpbmcgY2FzdFR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQkJLy9leHByZXNzaW9uLnNldEV4cGVjdGVkVHlwZSh0aGlzLnJlc29sdmVkVHlwZSk7IC8vIG5lZWRlZCBpbiBjYXNlIG9mIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24JCQkKLQkJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCQlpZiAoY2FzdFR5cGUgIT0gbnVsbCkgewotCQkJCWlmIChleHByZXNzaW9uVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gaXNMZWdhbCA9IGNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlLCB0aGlzLmV4cHJlc3Npb24pOwotCQkJCQlpZiAoaXNMZWdhbCkgewotCQkJCQkJdGhpcy5leHByZXNzaW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUpOwotCQkJCQkJaWYgKCh0aGlzLmJpdHMgJiBVbnNhZmVDYXN0KSAhPSAwKSB7IC8vIHVuc2FmZSBjYXN0Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlQ2FzdCh0aGlzLCBzY29wZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChjYXN0VHlwZS5pc1Jhd1R5cGUoKSAmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZSkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKXsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmF3VHlwZVJlZmVyZW5jZSh0aGlzLnR5cGUsIGNhc3RUeXBlKTsJCQkKKwkJCQlzd2l0Y2ggKG1hdGNoLmtpbmQoKSkgeworCQkJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKKwkJCQkJCWlmIChpc05hcnJvd2luZykgeworCQkJCQkJCS8vIFtKTFMgNS41XSBUIDw6IFMKKwkJCQkJCQlpZiAoZXhwcmVzc2lvblR5cGUuaXNSYXdUeXBlKCkgfHwgIWV4cHJlc3Npb25UeXBlLmlzRXF1aXZhbGVudFRvKG1hdGNoKSkgeworCQkJCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbnNhZmVDYXN0OworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCQl9Ci0JCQkJCQkJaWYgKCh0aGlzLmJpdHMgJiAoVW5uZWNlc3NhcnlDYXN0fERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjaykpID09IFVubmVjZXNzYXJ5Q2FzdCkgeyAvLyB1bm5lY2Vzc2FyeSBjYXN0IAotCQkJCQkJCQlpZiAoIWlzSW5kaXJlY3RseVVzZWQoKSkgLy8gdXNlZCBmb3IgZ2VuZXJpYyB0eXBlIGluZmVyZW5jZSBvciBib3hpbmcgPwotCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlDYXN0KHRoaXMpOworCQkJCQkJCS8vIFtKTFMgNS41XSBTIGhhcyBubyBzdWJ0eXBlIFggIT0gVCwgc3VjaCB0aGF0IHxYfCA9PSB8VHwKKwkJCQkJCQkvLyBpZiBJMjxULFU+IGV4dGVuZHMgSTE8VD4sIHRoZW4gY2FzdCBmcm9tIEkxPFQ+IHRvIEkyPFQsVT4gaXMgdW5jaGVja2VkCisJCQkJCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtQ2FzdFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBjYXN0VHlwZTsKKwkJCQkJCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1NYXRjaCA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIG1hdGNoOworCQkJCQkJCS8vIGVhc3kgY2FzZSBpZiBsZXNzIHBhcmFtZXRlcnMgb24gbWF0Y2gKKwkJCQkJCQlUeXBlQmluZGluZ1tdIGNhc3RBcmd1bWVudHMgPSBwYXJhbUNhc3RUeXBlLmFyZ3VtZW50czsKKwkJCQkJCQlpbnQgbGVuZ3RoID0gY2FzdEFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGNhc3RBcmd1bWVudHMubGVuZ3RoOworCQkJCQkJCWlmIChwYXJhbU1hdGNoLmFyZ3VtZW50cyA9PSBudWxsIHx8IGxlbmd0aCA+IHBhcmFtTWF0Y2guYXJndW1lbnRzLmxlbmd0aCkgeworCQkJCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbnNhZmVDYXN0OworCQkJCQkJCX0gZWxzZSBpZiAoKHBhcmFtQ2FzdFR5cGUudGFnQml0cyAmIChUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkfFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlKSkgIT0gMCkgeworCQkJCQkJCQkvLyB2ZXJpZnkgYWx0ZXJuYXRlIGNhc3QgdHlwZSwgc3Vic3RpdHV0aW5nIGRpZmZlcmVudCB0eXBlIGFyZ3VtZW50cworCQkJCQkJCQluZXh0QWx0ZXJuYXRlQXJndW1lbnQ6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJCXN3aXRjaCAoY2FzdEFyZ3VtZW50c1tpXS5raW5kKCkpIHsKKwkJCQkJCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJCQkJCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCQkJCQkJCQkJYnJlYWs7IC8vIGNoZWNrIHN1YnN0aXR1dGluZyB3aXRoIG90aGVyCisJCQkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCQkJY29udGludWUgbmV4dEFsdGVybmF0ZUFyZ3VtZW50OyAvLyBubyBhbHRlcm5hdGl2ZSBwb3NzaWJsZQorCQkJCQkJCQkJfQorCQkJCQkJCQkJVHlwZUJpbmRpbmdbXSBhbHRlcm5hdGVBcmd1bWVudHM7CisJCQkJCQkJCQkvLyBuZWVkIHRvIGNsb25lIGZvciBlYWNoIGl0ZXJhdGlvbiB0byBhdm9pZCBlbnYgcGFyYW10eXBlIGNhY2hlIGludGVyZmVyZW5jZQorCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbUNhc3RUeXBlLmFyZ3VtZW50cywgMCwgYWx0ZXJuYXRlQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJCQkJCQkJCQlhbHRlcm5hdGVBcmd1bWVudHNbaV0gPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOworCQkJCQkJCQkJTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBzY29wZS5lbnZpcm9ubWVudCgpOworCQkJCQkJCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGFsdGVybmF0ZUNhc3RUeXBlID0gZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpY2FzdFR5cGUuZXJhc3VyZSgpLCBhbHRlcm5hdGVBcmd1bWVudHMsIGNhc3RUeXBlLmVuY2xvc2luZ1R5cGUoKSk7CisJCQkJCQkJCQlpZiAoYWx0ZXJuYXRlQ2FzdFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShleHByZXNzaW9uVHlwZSkgPT0gbWF0Y2gpIHsKKwkJCQkJCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbnNhZmVDYXN0OworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBbSkxTIDUuNV0gVCA+OiBTCisJCQkJCQkJaWYgKCFtYXRjaC5pc0VxdWl2YWxlbnRUbyhjYXN0VHlwZSkpIHsKKwkJCQkJCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuVW5zYWZlQ2FzdDsKKwkJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyBpbGxlZ2FsIGNhc3QKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKLQkJCQkJCXRoaXMuYml0cyB8PSBEaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIGRpc2FibGUgZnVydGhlciBzZWNvbmRhcnkgZGlhZ25vc2lzCisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKKwkJCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVuc2FmZUNhc3Q7IC8vIHVwY2FzdCBzaW5jZSBjYXN0VHlwZSBpcyBrbm93biB0byBiZSBib3VuZCBwYXJhbVR5cGUKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmIChpc05hcnJvd2luZyl7CisJCQkJCQkJLy8gbWF0Y2ggaXMgbm90IHBhcmFtZXRlcml6ZWQgb3IgcmF3LCB0aGVuIGFueSBvdGhlciBzdWJ0eXBlIG9mIG1hdGNoIHdpbGwgZXJhc2UgIHRvIHxUfAorCQkJCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVuc2FmZUNhc3Q7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgorCQkJVHlwZUJpbmRpbmcgbGVhZlR5cGUgPSBjYXN0VHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQkJaWYgKGlzTmFycm93aW5nICYmICghbGVhZlR5cGUuaXNSZWlmaWFibGUoKSB8fCBsZWFmVHlwZS5pc1R5cGVWYXJpYWJsZSgpKSkgeworCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVuc2FmZUNhc3Q7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVuc2FmZUNhc3Q7CisJCQlyZXR1cm4gdHJ1ZTsKKy8vCQkoZGlzYWJsZWQpIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDA4MDcJCQkKKy8vCQljYXNlIEJpbmRpbmcuVFlQRSA6CisvLwkJCWlmIChpc05hcnJvd2luZyAmJiBtYXRjaCA9PSBudWxsICYmIGV4cHJlc3Npb25UeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgeworLy8JCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuVW5zYWZlQ2FzdDsKKy8vCQkJCXJldHVybiB0cnVlOworLy8JCQl9CisvLwkJCWJyZWFrOworCX0KKwlpZiAoIWlzTmFycm93aW5nICYmIG1hdGNoID09IHRoaXMucmVzb2x2ZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpIHsgLy8gZG8gbm90IHRhZyBhcyB1bm5lY2Vzc2FyeSB3aGVuIHJlY3Vyc2luZyB0aHJvdWdoIHVwcGVyIGJvdW5kcworCQl0YWdBc1VubmVjZXNzYXJ5Q2FzdChzY29wZSwgY2FzdFR5cGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBDYXN0IGV4cHJlc3Npb24gY29kZSBnZW5lcmF0aW9uCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJYm9vbGVhbiBuZWVkUnVudGltZUNoZWNrY2FzdCA9ICh0aGlzLmJpdHMgJiBBU1ROb2RlLkdlbmVyYXRlQ2hlY2tjYXN0KSAhPSAwOworCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQlpZiAodmFsdWVSZXF1aXJlZCB8fCBuZWVkUnVudGltZUNoZWNrY2FzdCkgeyAvLyBBZGRlZCBmb3I6IDFGMVc5SUc6IElWSkNPTTpXSU5OVCAtIENvbXBpbGVyIG9taXRzIGNhc3RpbmcgY2hlY2sKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCh0aGlzLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLnJlc29sdmVkVHlwZSk7CisJCQl9CisJCQlpZiAoIXZhbHVlUmVxdWlyZWQpIHsKKwkJCQkvLyB0aGUgcmVzb2x2ZVR5cGUgY2Fubm90IGJlIGRvdWJsZSBvciBsb25nCisJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQlyZXR1cm47CisJfQorCXRoaXMuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkIHx8IG5lZWRSdW50aW1lQ2hlY2tjYXN0KTsKKwlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QgJiYgdGhpcy5leHByZXNzaW9uLnBvc3RDb252ZXJzaW9uVHlwZShjdXJyZW50U2NvcGUpICE9IHRoaXMucmVzb2x2ZWRUeXBlLmVyYXN1cmUoKSkgeyAvLyBubyBuZWVkIHRvIGlzc3VlIGEgY2hlY2tjYXN0IGlmIGFscmVhZHkgZG9uZSBhcyBnZW5lcmljQ2FzdAorCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLnJlc29sdmVkVHlwZSk7CisJfQorCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCX0gZWxzZSBpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKKwkJY29kZVN0cmVhbS5wb3AoKTsKKwl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KKworcHVibGljIEV4cHJlc3Npb24gaW5uZXJtb3N0Q2FzdGVkRXhwcmVzc2lvbigpeworCUV4cHJlc3Npb24gY3VycmVudCA9IHRoaXMuZXhwcmVzc2lvbjsKKwl3aGlsZSAoY3VycmVudCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB7CisJCWN1cnJlbnQgPSAoKENhc3RFeHByZXNzaW9uKSBjdXJyZW50KS5leHByZXNzaW9uOworCX0KKwlyZXR1cm4gY3VycmVudDsKK30KKworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiNsb2NhbFZhcmlhYmxlQmluZGluZygpCisgKi8KK3B1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZygpIHsKKwlyZXR1cm4gdGhpcy5leHByZXNzaW9uLmxvY2FsVmFyaWFibGVCaW5kaW5nKCk7Cit9CisKK3B1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgeworCXJldHVybiB0aGlzLmV4cHJlc3Npb24ubnVsbFN0YXR1cyhmbG93SW5mbyk7Cit9CisKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24jb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkKKyAqLworcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpIHsKKwlzd2l0Y2godGhpcy5yZXNvbHZlZFR5cGUuaWQpIHsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQljYXNlIFRfSmF2YUxhbmdCb29sZWFuIDoKKwkJCXJldHVybiB0aGlzLmV4cHJlc3Npb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJfQorCXJldHVybiBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Cit9CisKK3B1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKKwlvdXRwdXQuYXBwZW5kKCcoJyk7CisJdGhpcy50eXBlLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCIpICIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKK30KKworcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBjb21wdXRlIGEgbmV3IGNvbnN0YW50IGlmIHRoZSBjYXN0IGlzIGVmZmVjdGl2ZQorCisJLy8gZHVlIHRvIHRoZSBmYWN0IGFuIGV4cHJlc3Npb24gbWF5IHN0YXJ0IHdpdGggKCBhbmQgdGhhdCBhIGNhc3QgY2FuIGFsc28gc3RhcnQgd2l0aCAoCisJLy8gdGhlIGZpZWxkIGlzIGFuIGV4cHJlc3Npb24uLi4uaXQgY2FuIGJlIGEgVHlwZVJlZmVyZW5jZSBPUiBhIE5hbWVSZWZlcmVuY2UgT3IKKwkvLyBhbnkga2luZCBvZiBFeHByZXNzaW9uIDwtLSB0aGlzIGxhc3Qgb25lIGlzIGludmFsaWQuLi4uLi4uCisKKwl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCXRoaXMuaW1wbGljaXRDb252ZXJzaW9uID0gVHlwZUlkcy5UX3VuZGVmaW5lZDsKKworCWJvb2xlYW4gZXhwckNvbnRhaW5DYXN0ID0gZmFsc2U7CisKKwlUeXBlQmluZGluZyBjYXN0VHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkvL2V4cHJlc3Npb24uc2V0RXhwZWN0ZWRUeXBlKHRoaXMucmVzb2x2ZWRUeXBlKTsgLy8gbmVlZGVkIGluIGNhc2Ugb2YgZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbgorCWlmICh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgeworCQl0aGlzLmV4cHJlc3Npb24uYml0cyB8PSBBU1ROb2RlLkRpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsKKwkJZXhwckNvbnRhaW5DYXN0ID0gdHJ1ZTsKKwl9CisJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmICh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgeworCQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgdGhpcy5leHByZXNzaW9uOworCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXNzYWdlU2VuZC5iaW5kaW5nOworCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsICYmIG1ldGhvZEJpbmRpbmcuaXNQb2x5bW9ycGhpYygpKSB7CisJCQltZXNzYWdlU2VuZC5iaW5kaW5nID0gc2NvcGUuZW52aXJvbm1lbnQoKS51cGRhdGVQb2x5bW9ycGhpY01ldGhvZFJldHVyblR5cGUoKFBvbHltb3JwaGljTWV0aG9kQmluZGluZykgbWV0aG9kQmluZGluZywgY2FzdFR5cGUpOworCQkJZXhwcmVzc2lvblR5cGUgPSBjYXN0VHlwZTsKKwkJfQorCX0KKwlpZiAoY2FzdFR5cGUgIT0gbnVsbCkgeworCQlpZiAoZXhwcmVzc2lvblR5cGUgIT0gbnVsbCkgeworCQkJYm9vbGVhbiBpc0xlZ2FsID0gY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIHRoaXMuZXhwcmVzc2lvbik7CisJCQlpZiAoaXNMZWdhbCkgeworCQkJCXRoaXMuZXhwcmVzc2lvbi5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuVW5zYWZlQ2FzdCkgIT0gMCkgeyAvLyB1bnNhZmUgY2FzdAorCQkJCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zIHx8ICF0aGlzLmV4cHJlc3Npb24uZm9yY2VkVG9CZVJhdyhzY29wZS5yZWZlcmVuY2VDb250ZXh0KCkpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVDYXN0KHRoaXMsIHNjb3BlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjYXN0VHlwZS5pc1Jhd1R5cGUoKSAmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZSkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKXsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJhd1R5cGVSZWZlcmVuY2UodGhpcy50eXBlLCBjYXN0VHlwZSk7CisJCQkJCX0KKwkJCQkJaWYgKCh0aGlzLmJpdHMgJiAoQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3R8QVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2spKSA9PSBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdCkgeyAvLyB1bm5lY2Vzc2FyeSBjYXN0CisJCQkJCQlpZiAoIWlzSW5kaXJlY3RseVVzZWQoKSkgLy8gdXNlZCBmb3IgZ2VuZXJpYyB0eXBlIGluZmVyZW5jZSBvciBib3hpbmcgPworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCh0aGlzKTsKIAkJCQkJfQogCQkJCX0KLQkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IGNhc3RUeXBlLmNhcHR1cmUoc2NvcGUsIHRoaXMuc291cmNlRW5kKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKLQkJfSBlbHNlIHsgLy8gZXhwcmVzc2lvbiBhcyBhIGNhc3QKLQkJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCQlpZiAoZXhwcmVzc2lvblR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZVJlZmVyZW5jZSh0eXBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3NldEV4cGVjdGVkVHlwZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVHlwZShUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKLQkJdGhpcy5leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFwcGFyZW50IHVubmVjZXNzYXJ5IGNhc3Qgd2Fzbid0IGFjdHVhbGx5IHVzZWQgdG8KLQkgKiBwZXJmb3JtIHJldHVybiB0eXBlIGluZmVyZW5jZSBvZiBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uIG9yIGJveGluZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbmRpcmVjdGx5VXNlZCgpIHsKLQkJaWYgKHRoaXMuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7Ci0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9ICgoTWVzc2FnZVNlbmQpdGhpcy5leHByZXNzaW9uKS5iaW5kaW5nOwotCQkJaWYgKG1ldGhvZCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZwotCQkJCQkJJiYgKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpbWV0aG9kKS5pbmZlcnJlZFJldHVyblR5cGUpIHsKLQkJCQlpZiAodGhpcy5leHBlY3RlZFR5cGUgPT0gbnVsbCkgCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSB0aGlzLmV4cGVjdGVkVHlwZSkKLQkJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeyAvLyBpbGxlZ2FsIGNhc3QKKwkJCQlpZiAoKGNhc3RUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7IC8vIG5vIGNvbXBsYWludCBpZiBzZWNvbmRhcnkgZXJyb3IKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUpOworCQkJCX0KKwkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIGRpc2FibGUgZnVydGhlciBzZWNvbmRhcnkgZGlhZ25vc2lzCiAJCQl9CiAJCX0KLQkJaWYgKHRoaXMuZXhwZWN0ZWRUeXBlICE9IG51bGwgJiYgdGhpcy5yZXNvbHZlZFR5cGUuaXNCYXNlVHlwZSgpICYmICF0aGlzLnJlc29sdmVkVHlwZS5pc0NvbXBhdGlibGVXaXRoKHRoaXMuZXhwZWN0ZWRUeXBlKSkgewotCQkJLy8gYm94aW5nOiBTaG9ydCBzID0gKHNob3J0KSBfYnl0ZQotCQkJcmV0dXJuIHRydWU7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gY2FzdFR5cGUuY2FwdHVyZShzY29wZSwgdGhpcy5zb3VyY2VFbmQpOworCQlpZiAoZXhwckNvbnRhaW5DYXN0KSB7CisJCQljaGVja05lZWRGb3JDYXN0Q2FzdChzY29wZSwgdGhpcyk7CiAJCX0KLQkJcmV0dXJuIGZhbHNlOwogCX0KKwlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7Cit9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiN0YWdBc05lZWRDaGVja0Nhc3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRhZ0FzTmVlZENoZWNrQ2FzdCgpIHsKLQkJdGhpcy5iaXRzIHw9IEdlbmVyYXRlQ2hlY2tjYXN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiN0YWdBc1VubmVjZXNzYXJ5Q2FzdChTY29wZSwgVHlwZUJpbmRpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGFnQXNVbm5lY2Vzc2FyeUNhc3QoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGNhc3RUeXBlKSB7Ci0JCWlmICh0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlID09IG51bGwpIHJldHVybjsgLy8gY2Fubm90IGRvIGJldHRlciBpZiBleHByZXNzaW9uIGlzIG5vdCBib3VuZAotCQl0aGlzLmJpdHMgfD0gVW5uZWNlc3NhcnlDYXN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKLQkJQVNUVmlzaXRvciB2aXNpdG9yLAotCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24jc2V0RXhwZWN0ZWRUeXBlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpCisgKi8KK3B1YmxpYyB2b2lkIHNldEV4cGVjdGVkVHlwZShUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKKwl0aGlzLmV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZTsKK30KIAotCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewotCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKLQkJCWV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisvKioKKyAqIERldGVybWluZXMgd2hldGhlciBhcHBhcmVudCB1bm5lY2Vzc2FyeSBjYXN0IHdhc24ndCBhY3R1YWxseSB1c2VkIHRvCisgKiBwZXJmb3JtIHJldHVybiB0eXBlIGluZmVyZW5jZSBvZiBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uIG9yIGJveGluZy4KKyAqLworcHJpdmF0ZSBib29sZWFuIGlzSW5kaXJlY3RseVVzZWQoKSB7CisJaWYgKHRoaXMuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gKChNZXNzYWdlU2VuZCl0aGlzLmV4cHJlc3Npb24pLmJpbmRpbmc7CisJCWlmIChtZXRob2QgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcKKwkJCQkJJiYgKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpbWV0aG9kKS5pbmZlcnJlZFJldHVyblR5cGUpIHsKKwkJCWlmICh0aGlzLmV4cGVjdGVkVHlwZSA9PSBudWxsKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlICE9IHRoaXMuZXhwZWN0ZWRUeXBlKQorCQkJCXJldHVybiB0cnVlOwogCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQorCWlmICh0aGlzLmV4cGVjdGVkVHlwZSAhPSBudWxsICYmIHRoaXMucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSAmJiAhdGhpcy5yZXNvbHZlZFR5cGUuaXNDb21wYXRpYmxlV2l0aCh0aGlzLmV4cGVjdGVkVHlwZSkpIHsKKwkJLy8gYm94aW5nOiBTaG9ydCBzID0gKHNob3J0KSBfYnl0ZQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3RhZ0FzTmVlZENoZWNrQ2FzdCgpCisgKi8KK3B1YmxpYyB2b2lkIHRhZ0FzTmVlZENoZWNrQ2FzdCgpIHsKKwl0aGlzLmJpdHMgfD0gQVNUTm9kZS5HZW5lcmF0ZUNoZWNrY2FzdDsKK30KKworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiN0YWdBc1VubmVjZXNzYXJ5Q2FzdChTY29wZSwgVHlwZUJpbmRpbmcpCisgKi8KK3B1YmxpYyB2b2lkIHRhZ0FzVW5uZWNlc3NhcnlDYXN0KFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBjYXN0VHlwZSkgeworCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdDsKK30KKworcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQl0aGlzLnR5cGUudHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCXRoaXMuZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwl9CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2hhckxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2hhckxpdGVyYWwuamF2YQppbmRleCA5YjJmOTMzLi5jZDVmMTI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NoYXJMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DaGFyTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDY1ICsxNyw2OCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKIAogcHVibGljIGNsYXNzIENoYXJMaXRlcmFsIGV4dGVuZHMgTnVtYmVyTGl0ZXJhbCB7CisJCiAJY2hhciB2YWx1ZTsKKwkKIHB1YmxpYyBDaGFyTGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLCBpbnQgZSkgewogCXN1cGVyKHRva2VuLCBzLCBlKTsKIAljb21wdXRlVmFsdWUoKTsKIH0KKwogcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewogCS8vVGhlIHNvdXJjZSBpcyBhICBjaGFyWzNdIGZpcnN0IGFuZCBsYXN0IGNoYXIgYXJlICcKIAkvL1RoaXMgaXMgdHJ1ZSBmb3IgYm90aCByZWd1bGFyIGNoYXIgQU5EIHVuaWNvZGUgY2hhcgogCS8vQlVUIG5vdCBmb3IgZXNjYXBlIGNoYXIgbGlrZSAnXGInIHdoaWNoIGFyZSBjaGFyWzRdLi4uLgotCi0JY29uc3RhbnQgPSBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlKTsKKwl0aGlzLmNvbnN0YW50ID0gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSh0aGlzLnZhbHVlKTsKIH0KKwogcHJpdmF0ZSB2b2lkIGNvbXB1dGVWYWx1ZSgpIHsKIAkvL1RoZSBzb3VyY2UgaXMgYSAgY2hhclszXSBmaXJzdCBhbmQgbGFzdCBjaGFyIGFyZSAnCiAJLy9UaGlzIGlzIHRydWUgZm9yIGJvdGggcmVndWxhciBjaGFyIEFORCB1bmljb2RlIGNoYXIKIAkvL0JVVCBub3QgZm9yIGVzY2FwZSBjaGFyIGxpa2UgJ1xiJyB3aGljaCBhcmUgY2hhcls0XS4uLi4KLQotCWlmICgodmFsdWUgPSBzb3VyY2VbMV0pICE9ICdcXCcpCisJaWYgKCh0aGlzLnZhbHVlID0gdGhpcy5zb3VyY2VbMV0pICE9ICdcXCcpCiAJCXJldHVybjsKIAljaGFyIGRpZ2l0OwotCXN3aXRjaCAoZGlnaXQgPSBzb3VyY2VbMl0pIHsKKwlzd2l0Y2ggKGRpZ2l0ID0gdGhpcy5zb3VyY2VbMl0pIHsKIAkJY2FzZSAnYicgOgotCQkJdmFsdWUgPSAnXGInOworCQkJdGhpcy52YWx1ZSA9ICdcYic7CiAJCQlicmVhazsKIAkJY2FzZSAndCcgOgotCQkJdmFsdWUgPSAnXHQnOworCQkJdGhpcy52YWx1ZSA9ICdcdCc7CiAJCQlicmVhazsKIAkJY2FzZSAnbicgOgotCQkJdmFsdWUgPSAnXG4nOworCQkJdGhpcy52YWx1ZSA9ICdcbic7CiAJCQlicmVhazsKIAkJY2FzZSAnZicgOgotCQkJdmFsdWUgPSAnXGYnOworCQkJdGhpcy52YWx1ZSA9ICdcZic7CiAJCQlicmVhazsKIAkJY2FzZSAncicgOgotCQkJdmFsdWUgPSAnXHInOworCQkJdGhpcy52YWx1ZSA9ICdccic7CiAJCQlicmVhazsKIAkJY2FzZSAnXCInIDoKLQkJCXZhbHVlID0gJ1wiJzsKKwkJCXRoaXMudmFsdWUgPSAnXCInOwogCQkJYnJlYWs7CiAJCWNhc2UgJ1wnJyA6Ci0JCQl2YWx1ZSA9ICdcJyc7CisJCQl0aGlzLnZhbHVlID0gJ1wnJzsKIAkJCWJyZWFrOwogCQljYXNlICdcXCcgOgotCQkJdmFsdWUgPSAnXFwnOworCQkJdGhpcy52YWx1ZSA9ICdcXCc7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6IC8vb2N0YWwgKHdlbGwtZm9ybWVkOiBlbmRlZCBieSBhICcgKQogCQkJaW50IG51bWJlciA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGRpZ2l0KTsKLQkJCWlmICgoZGlnaXQgPSBzb3VyY2VbM10pICE9ICdcJycpCisJCQlpZiAoKGRpZ2l0ID0gdGhpcy5zb3VyY2VbM10pICE9ICdcJycpCiAJCQkJbnVtYmVyID0gKG51bWJlciAqIDgpICsgU2Nhbm5lckhlbHBlci5nZXROdW1lcmljVmFsdWUoZGlnaXQpOwogCQkJZWxzZSB7Ci0JCQkJY29uc3RhbnQgPSBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlID0gKGNoYXIpIG51bWJlcik7CisJCQkJdGhpcy5jb25zdGFudCA9IENoYXJDb25zdGFudC5mcm9tVmFsdWUodGhpcy52YWx1ZSA9IChjaGFyKSBudW1iZXIpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKChkaWdpdCA9IHNvdXJjZVs0XSkgIT0gJ1wnJykKKwkJCWlmICgoZGlnaXQgPSB0aGlzLnNvdXJjZVs0XSkgIT0gJ1wnJykKIAkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBTY2FubmVySGVscGVyLmdldE51bWVyaWNWYWx1ZShkaWdpdCk7Ci0JCQl2YWx1ZSA9IChjaGFyKSBudW1iZXI7CisJCQl0aGlzLnZhbHVlID0gKGNoYXIpIG51bWJlcjsKIAkJCWJyZWFrOwogCX0KIH0KKwogLyoqCiAgKiBDaGFyTGl0ZXJhbCBjb2RlIGdlbmVyYXRpb24KICAqCkBAIC04NiwxMyArODksMTUgQEAKIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KKwogcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAlyZXR1cm4gVHlwZUJpbmRpbmcuQ0hBUjsKIH0KKwogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQppbmRleCA5MThjZjRmLi4xMmIzOWNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIENsYXNzTGl0ZXJhbEFjY2VzcyBleHRlbmRzIEV4cHJlc3Npb24gewotCQorCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgdHlwZTsKIAlwdWJsaWMgVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZTsKIAlGaWVsZEJpbmRpbmcgc3ludGhldGljRmllbGQ7CkBAIC0zOSw5ICszOSw5IEBACiAJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBjdXJyZW50U2NvcGUub3V0ZXJNb3N0Q2xhc3NTY29wZSgpLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKIAkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjMzNAogCQlpZiAoIXNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKQotCQkJCSYmICFzb3VyY2VUeXBlLmlzQmFzZVR5cGUoKQotCQkJCSYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCXN5bnRoZXRpY0ZpZWxkID0gc291cmNlVHlwZS5hZGRTeW50aGV0aWNGaWVsZEZvckNsYXNzTGl0ZXJhbCh0YXJnZXRUeXBlLCBjdXJyZW50U2NvcGUpOworCQkJCSYmICF0aGlzLnRhcmdldFR5cGUuaXNCYXNlVHlwZSgpCisJCQkJJiYgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnRhcmdldEpESyA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCXRoaXMuc3ludGhldGljRmllbGQgPSBzb3VyY2VUeXBlLmFkZFN5bnRoZXRpY0ZpZWxkRm9yQ2xhc3NMaXRlcmFsKHRoaXMudGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJfQogCQlyZXR1cm4gZmxvd0luZm87CiAJfQpAQCAtNjEsNyArNjEsNyBAQAogCiAJCS8vIGluIGludGVyZmFjZSBjYXNlLCBubyBjYWNoaW5nIG9jY3Vycywgc2luY2UgY2Fubm90IG1ha2UgYSBjYWNoZSBmaWVsZCBmb3IgaW50ZXJmYWNlCiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlQ2xhc3NMaXRlcmFsQWNjZXNzRm9yVHlwZSh0eXBlLnJlc29sdmVkVHlwZSwgc3ludGhldGljRmllbGQpOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUodGhpcy50eXBlLnJlc29sdmVkVHlwZSwgdGhpcy5zeW50aGV0aWNGaWVsZCk7CiAJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwpAQCAtNjksMTYgKzY5LDI2IEBACiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKLQkJcmV0dXJuIHR5cGUucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiB0aGlzLnR5cGUucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJaWYgKCh0YXJnZXRUeXBlID0gdHlwZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLykpID09IG51bGwpCisJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCWlmICgodGhpcy50YXJnZXRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKSkgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOworCQkKKwkJLyogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDQ2MworCQkgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEyMDc2CisJCSAgIEpMUzMgMTUuOC4yIGZvcmJpZHMgdGhlIHR5cGUgbmFtZWQgaW4gdGhlIGNsYXNzIGxpdGVyYWwgZXhwcmVzc2lvbiBmcm9tIGJlaW5nIGEgcGFyYW1ldGVyaXplZCB0eXBlLgorCQkgICBBbmQgdGhlIGdyYW1tYXIgaW4gMTguMSBkaXNhbGxvd3MgKHdoZXJlIFggYW5kIFkgYXJlIHNvbWUgY29uY3JldGUgdHlwZXMpIGNvbnN0cnVjdHMgb2YgdGhlIGZvcm0KKwkJICAgT3V0ZXI8WD4uY2xhc3MsIE91dGVyPFg+LklubmVyLmNsYXNzLCBPdXRlci5Jbm5lcjxYPi5jbGFzcywgT3V0ZXI8WD4uSW5uZXI8WT4uY2xhc3MgZXRjLgorCQkgICBDb3JvbGxhcnkgd2lzZSwgd2Ugc2hvdWxkIHJlc29sdmUgdGhlIHR5cGUgb2YgdGhlIGNsYXNzIGxpdGVyYWwgZXhwcmVzc2lvbiB0byBiZSBhIHJhdyB0eXBlIGFzCisJCSAgIGNsYXNzIGxpdGVyYWxzIGV4aXN0IG9ubHkgZm9yIHRoZSByYXcgdW5kZXJseWluZyB0eXBlLiAKKwkJICovCisJCXRoaXMudGFyZ2V0VHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0aGlzLnRhcmdldFR5cGUsIHRydWUgLyogZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CiAKLQkJaWYgKHRhcmdldFR5cGUuaXNBcnJheVR5cGUoKSkgeworCQlpZiAodGhpcy50YXJnZXRUeXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSB0aGlzLnRhcmdldFR5cGU7CiAJCQlUeXBlQmluZGluZyBsZWFmQ29tcG9uZW50VHlwZSA9IGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZTsKIAkJCWlmIChsZWFmQ29tcG9uZW50VHlwZSA9PSBUeXBlQmluZGluZy5WT0lEKSB7CkBAIC04OCwxOSArOTgsMTcgQEAKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsQ2xhc3NMaXRlcmFsRm9yVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVCaW5kaW5nKWxlYWZDb21wb25lbnRUeXBlLCB0aGlzKTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0aGlzLnRhcmdldFR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbENsYXNzTGl0ZXJhbEZvclR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlQmluZGluZyl0YXJnZXRUeXBlLCB0aGlzKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxDbGFzc0xpdGVyYWxGb3JUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZUJpbmRpbmcpdGhpcy50YXJnZXRUeXBlLCB0aGlzKTsKIAkJfQogCQlSZWZlcmVuY2VCaW5kaW5nIGNsYXNzVHlwZSA9IHNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKTsKLQkJaWYgKGNsYXNzVHlwZS5pc0dlbmVyaWNUeXBlKCkpIHsKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODY4OQorCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogCQkJLy8gSW50ZWdlci5jbGFzcyAtLT4gQ2xhc3M8SW50ZWdlcj4sIHBlcmZvcm0gYm94aW5nIG9mIGJhc2UgdHlwZXMgKGludC5jbGFzcyAtLT4gQ2xhc3M8SW50ZWdlcj4pCiAJCQlUeXBlQmluZGluZyBib3hlZFR5cGUgPSBudWxsOwotCQkJaWYgKHRhcmdldFR5cGUuaWQgPT0gVF92b2lkKSB7Ci0JCQkJYm94ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfTEFOR19WT0lEKTsKLQkJCQlpZiAoYm94ZWRUeXBlID09IG51bGwpIHsKLQkJCQkJYm94ZWRUeXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19WT0lELCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7Ci0JCQkJfQorCQkJaWYgKHRoaXMudGFyZ2V0VHlwZS5pZCA9PSBUX3ZvaWQpIHsKKwkJCQlib3hlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfVk9JRCwgc2NvcGUpOwogCQkJfSBlbHNlIHsKLQkJCQlib3hlZFR5cGUgPSBzY29wZS5ib3hpbmcodGFyZ2V0VHlwZSk7CisJCQkJYm94ZWRUeXBlID0gc2NvcGUuYm94aW5nKHRoaXMudGFyZ2V0VHlwZSk7CiAJCQl9CiAJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoY2xhc3NUeXBlLCBuZXcgVHlwZUJpbmRpbmdbXXsgYm94ZWRUeXBlIH0sIG51bGwvKm5vdCBhIG1lbWJlciovKTsKIAkJfSBlbHNlIHsKQEAgLTExNCw3ICsxMjIsNyBAQAogCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewotCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJCXRoaXMudHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsaW5pdC5qYXZhCmluZGV4IGZiYzM4M2IuLjNjY2IwYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGluaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQnJhbmNoTGFiZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQ7CkBAIC0yNSwxOSArMjYsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TeW50aGV0aWNNZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydE1ldGhvZDsKIAogcHVibGljIGNsYXNzIENsaW5pdCBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gewotCQorCXByaXZhdGUgc3RhdGljIGludCBFTlVNX0NPTlNUQU5UU19USFJFU0hPTEQgPSAyMDAwOworCiAJcHJpdmF0ZSBGaWVsZEJpbmRpbmcgYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nID0gbnVsbDsKIAlwcml2YXRlIEZpZWxkQmluZGluZyBjbGFzc0xpdGVyYWxTeW50aGV0aWNGaWVsZCA9IG51bGw7CiAKIAlwdWJsaWMgQ2xpbml0KENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CiAJCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJbW9kaWZpZXJzID0gMDsKLQkJc2VsZWN0b3IgPSBUeXBlQ29uc3RhbnRzLkNMSU5JVDsKKwkJdGhpcy5tb2RpZmllcnMgPSAwOworCQl0aGlzLnNlbGVjdG9yID0gVHlwZUNvbnN0YW50cy5DTElOSVQ7CiAJfQogCiAJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoCkBAIC00NSw3ICs0OCw3IEBACiAJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgc3RhdGljSW5pdGlhbGl6ZXJGbG93Q29udGV4dCwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAotCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQogCQkJcmV0dXJuOwogCQl0cnkgewogCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBjbGluaXRDb250ZXh0ID0KQEAgLTUzLDMxICs1NiwzMiBAQAogCQkJCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LnBhcmVudCwKIAkJCQkJdGhpcywKIAkJCQkJQmluZGluZy5OT19FWENFUFRJT05TLAotCQkJCQlzY29wZSwKKwkJCQkJc3RhdGljSW5pdGlhbGl6ZXJGbG93Q29udGV4dCwKKwkJCQkJdGhpcy5zY29wZSwKIAkJCQkJRmxvd0luZm8uREVBRF9FTkQpOwogCiAJCQkvLyBjaGVjayBmb3IgbWlzc2luZyByZXR1cm5pbmcgcGF0aAotCQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKKwkJCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKIAkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5OZWVkRnJlZVJldHVybjsKIAkJCX0KIAogCQkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMKIAkJCWZsb3dJbmZvID0gZmxvd0luZm8ubWVyZ2VkV2l0aChzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmluaXRzT25SZXR1cm4pOwotCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmZpZWxkcygpOworCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gdGhpcy5zY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZmllbGRzKCk7CiAJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewogCQkJCUZpZWxkQmluZGluZyBmaWVsZDsKIAkJCQlpZiAoKGZpZWxkID0gZmllbGRzW2ldKS5pc1N0YXRpYygpCiAJCQkJCSYmIGZpZWxkLmlzRmluYWwoKQogCQkJCQkmJiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkc1tpXSkpKSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoCisJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZCgKIAkJCQkJCWZpZWxkLAotCQkJCQkJc2NvcGUucmVmZXJlbmNlVHlwZSgpLmRlY2xhcmF0aW9uT2YoZmllbGQub3JpZ2luYWwoKSkpOworCQkJCQkJdGhpcy5zY29wZS5yZWZlcmVuY2VUeXBlKCkuZGVjbGFyYXRpb25PZihmaWVsZC5vcmlnaW5hbCgpKSk7CiAJCQkJCS8vIGNhbiBjb21wbGFpbiBhZ2FpbnN0IHRoZSBmaWVsZCBkZWNsLCBzaW5jZSBvbmx5IG9uZSA8Y2xpbml0PgogCQkJCX0KIAkJCX0KIAkJCS8vIGNoZWNrIHN0YXRpYyBpbml0aWFsaXplcnMgdGhyb3duIGV4Y2VwdGlvbnMKIAkJCXN0YXRpY0luaXRpYWxpemVyRmxvd0NvbnRleHQuY2hlY2tJbml0aWFsaXplckV4Y2VwdGlvbnMoCi0JCQkJc2NvcGUsCisJCQkJdGhpcy5zY29wZSwKIAkJCQljbGluaXRDb250ZXh0LAogCQkJCWZsb3dJbmZvKTsKIAkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgewpAQCAtOTQsMzkgKzk4LDUwIEBACiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgewogCiAJCWludCBjbGluaXRPZmZzZXQgPSAwOwotCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKIAkJCS8vIHNob3VsZCBuZXZlciBoYXZlIHRvIGFkZCBhbnkgPGNsaW5pdD4gcHJvYmxlbSBtZXRob2QKIAkJCXJldHVybjsKIAkJfQotCQl0cnkgewotCQkJY2xpbml0T2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OwotCQkJdGhpcy5nZW5lcmF0ZUNvZGUoY2xhc3NTY29wZSwgY2xhc3NGaWxlLCBjbGluaXRPZmZzZXQpOwotCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIKLQkJCS8vIHRoZSBjbGluaXQgcmVmZXJlbmNlQ29udGV4dCBpcyB0aGUgdHlwZSBkZWNsYXJhdGlvbgotCQkJLy8gQWxsIGNsaW5pdCBwcm9ibGVtcyB3aWxsIGJlIHJlcG9ydGVkIGFnYWluc3QgdGhlIHR5cGU6IEFib3J0VHlwZSBpbnN0ZWFkIG9mIEFib3J0TWV0aG9kCi0JCQkvLyByZXNldCB0aGUgY29udGVudHNPZmZzZXQgdG8gdGhlIHZhbHVlIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjbGluaXQgY29kZQotCQkJLy8gZGVjcmVtZW50IHRoZSBudW1iZXIgb2YgbWV0aG9kIGluZm8gYXMgd2VsbC4KLQkJCS8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgYWRkUHJvYmxlbU1ldGhvZCBhbmQgYWRkUHJvYmxlbUNvbnN0cnVjdG9yIGZvciBvdGhlcgotCQkJLy8gY2FzZXMuCi0JCQlpZiAoZS5jb21waWxhdGlvblJlc3VsdCA9PSBDb2RlU3RyZWFtLlJFU1RBUlRfSU5fV0lERV9NT0RFKSB7Ci0JCQkJLy8gYSBicmFuY2ggdGFyZ2V0IHJlcXVpcmVkIGEgZ290b193LCByZXN0YXJ0IGNvZGUgZ2VuIGluIHdpZGUgbW9kZS4KLQkJCQl0cnkgeworCQlib29sZWFuIHJlc3RhcnQgPSBmYWxzZTsKKwkJZG8geworCQkJdHJ5IHsKKwkJCQljbGluaXRPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CisJCQkJdGhpcy5nZW5lcmF0ZUNvZGUoY2xhc3NTY29wZSwgY2xhc3NGaWxlLCBjbGluaXRPZmZzZXQpOworCQkJCXJlc3RhcnQgPSBmYWxzZTsKKwkJCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsKKwkJCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkvLyB0aGUgY2xpbml0IHJlZmVyZW5jZUNvbnRleHQgaXMgdGhlIHR5cGUgZGVjbGFyYXRpb24KKwkJCQkvLyBBbGwgY2xpbml0IHByb2JsZW1zIHdpbGwgYmUgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgdHlwZTogQWJvcnRUeXBlIGluc3RlYWQgb2YgQWJvcnRNZXRob2QKKwkJCQkvLyByZXNldCB0aGUgY29udGVudHNPZmZzZXQgdG8gdGhlIHZhbHVlIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjbGluaXQgY29kZQorCQkJCS8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIG1ldGhvZCBpbmZvIGFzIHdlbGwuCisJCQkJLy8gVGhpcyBpcyBkb25lIGluIHRoZSBhZGRQcm9ibGVtTWV0aG9kIGFuZCBhZGRQcm9ibGVtQ29uc3RydWN0b3IgZm9yIG90aGVyCisJCQkJLy8gY2FzZXMuCisJCQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgeworCQkJCQkvLyBhIGJyYW5jaCB0YXJnZXQgcmVxdWlyZWQgYSBnb3RvX3csIHJlc3RhcnQgY29kZSBnZW4gaW4gd2lkZSBtb2RlLgorCQkJCQlpZiAoIXJlc3RhcnQpIHsKKwkJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsKKwkJCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOworCQkJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ucmVzZXRJbldpZGVNb2RlKCk7IC8vIHJlcXVlc3Qgd2lkZSBtb2RlCisJCQkJCQkvLyByZXN0YXJ0IG1ldGhvZCBnZW5lcmF0aW9uCisJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsKKwkJCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChlLmNvbXBpbGF0aW9uUmVzdWx0ID09IENvZGVTdHJlYW0uUkVTVEFSVF9DT0RFX0dFTl9GT1JfVU5VU0VEX0xPQ0FMU19NT0RFKSB7CiAJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsKIAkJCQkJY2xhc3NGaWxlLm1ldGhvZENvdW50LS07Ci0JCQkJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLndpZGVNb2RlID0gdHJ1ZTsgLy8gcmVxdWVzdCB3aWRlIG1vZGUgCi0JCQkJCXRoaXMuZ2VuZXJhdGVDb2RlKGNsYXNzU2NvcGUsIGNsYXNzRmlsZSwgY2xpbml0T2Zmc2V0KTsKKwkJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ucmVzZXRGb3JDb2RlR2VuVW51c2VkTG9jYWxzKCk7CiAJCQkJCS8vIHJlc3RhcnQgbWV0aG9kIGdlbmVyYXRpb24KLQkJCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlMikgeworCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBwcm9kdWNlIGEgcHJvYmxlbSBtZXRob2QgYWNjb3VudGluZyBmb3IgdGhpcyBmYXRhbCBlcnJvcgogCQkJCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBjbGluaXRPZmZzZXQ7CiAJCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOworCQkJCQlyZXN0YXJ0ID0gZmFsc2U7CiAJCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBwcm9kdWNlIGEgcHJvYmxlbSBtZXRob2QgYWNjb3VudGluZyBmb3IgdGhpcyBmYXRhbCBlcnJvcgotCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsKLQkJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKIAkJCX0KLQkJfQorCQl9IHdoaWxlIChyZXN0YXJ0KTsKIAl9CiAKIAkvKioKQEAgLTE0Nyw3ICsxNjIsNyBAQAogCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKIAkJY2xhc3NGaWxlLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOwogCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0gPSBjbGFzc0ZpbGUuY29kZVN0cmVhbTsKLQkJdGhpcy5yZXNvbHZlKGNsYXNzU2NvcGUpOworCQlyZXNvbHZlKGNsYXNzU2NvcGUpOwogCiAJCWNvZGVTdHJlYW0ucmVzZXQodGhpcywgY2xhc3NGaWxlKTsKIAkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQ7CkBAIC0xNzMsMjEgKzE4OCw0OSBAQAogCQkJZmFsc2VMYWJlbC5wbGFjZSgpOwogCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOwogCQkJanVtcExhYmVsLnBsYWNlKCk7Ci0JCQljb2RlU3RyZWFtLnB1dHN0YXRpYyh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX3B1dHN0YXRpYywgdGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KIAkJLy8gZ2VuZXJhdGUgc3RhdGljIGZpZWxkcy9pbml0aWFsaXplcnMvZW51bSBjb25zdGFudHMKIAkJZmluYWwgRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gZGVjbGFyaW5nVHlwZS5maWVsZHM7CiAJCUJsb2NrU2NvcGUgbGFzdEluaXRpYWxpemVyU2NvcGUgPSBudWxsOworCQlpbnQgcmVtYWluaW5nRmllbGRDb3VudCA9IDA7CiAJCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZChkZWNsYXJpbmdUeXBlLm1vZGlmaWVycykgPT0gVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCkgewotCQkJaW50IGVudW1Db3VudCA9IDA7Ci0JCQlpbnQgcmVtYWluaW5nRmllbGRDb3VudCA9IDA7Ci0JCQlpZiAoZmllbGREZWNsYXJhdGlvbnMgIT0gbnVsbCkgeworCQkJaW50IGVudW1Db3VudCA9IGRlY2xhcmluZ1R5cGUuZW51bUNvbnN0YW50c0NvdW50ZXI7CisJCQlpZiAoZW51bUNvdW50ID4gRU5VTV9DT05TVEFOVFNfVEhSRVNIT0xEKSB7CisJCQkJLy8gZ2VuZXJhdGUgc3ludGhldGljIG1ldGhvZHMgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIGVudW0gY29uc3RhbnRzCisJCQkJaW50IGJlZ2luID0gLTE7CisJCQkJaW50IGNvdW50ID0gMDsKKwkJCQlpZiAoZmllbGREZWNsYXJhdGlvbnMgIT0gbnVsbCkgeworCQkJCQlpbnQgbWF4ID0gZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IGZpZWxkRGVjbGFyYXRpb25zW2ldOworCQkJCQkJaWYgKGZpZWxkRGVjbC5pc1N0YXRpYygpKSB7CisJCQkJCQkJaWYgKGZpZWxkRGVjbC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKKwkJCQkJCQkJaWYgKGJlZ2luID09IC0xKSB7CisJCQkJCQkJCQliZWdpbiA9IGk7CisJCQkJCQkJCX0KKwkJCQkJCQkJY291bnQrKzsKKwkJCQkJCQkJaWYgKGNvdW50ID4gRU5VTV9DT05TVEFOVFNfVEhSRVNIT0xEKSB7CisJCQkJCQkJCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nIHN5bnRoZXRpY01ldGhvZCA9IGRlY2xhcmluZ1R5cGUuYmluZGluZy5hZGRTeW50aGV0aWNNZXRob2RGb3JFbnVtSW5pdGlhbGl6YXRpb24oYmVnaW4sIGkpOworCQkJCQkJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBzeW50aGV0aWNNZXRob2QsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQkJCQkJCQliZWdpbiA9IGk7CisJCQkJCQkJCQljb3VudCA9IDE7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGNvdW50ICE9IDApIHsKKwkJCQkJCS8vIGFkZCBsYXN0IHN5bnRoZXRpYyBtZXRob2QKKwkJCQkJCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgc3ludGhldGljTWV0aG9kID0gZGVjbGFyaW5nVHlwZS5iaW5kaW5nLmFkZFN5bnRoZXRpY01ldGhvZEZvckVudW1Jbml0aWFsaXphdGlvbihiZWdpbiwgbWF4KTsKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgc3ludGhldGljTWV0aG9kLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChmaWVsZERlY2xhcmF0aW9ucyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJCWlmIChmaWVsZERlY2wuaXNTdGF0aWMoKSkgewogCQkJCQkJaWYgKGZpZWxkRGVjbC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKIAkJCQkJCQlmaWVsZERlY2wuZ2VuZXJhdGVDb2RlKHN0YXRpY0luaXRpYWxpemVyU2NvcGUsIGNvZGVTdHJlYW0pOwotCQkJCQkJCWVudW1Db3VudCsrOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlyZW1haW5pbmdGaWVsZENvdW50Kys7CiAJCQkJCQl9CkBAIC0yMDYsMjkgKzI0OSwzMyBAQAogCQkJCQkJaWYgKGZpZWxkRGVjbC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKIAkJCQkJCQljb2RlU3RyZWFtLmR1cCgpOwogCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoZmllbGREZWNsLmJpbmRpbmcuaWQpOwotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkRGVjbC5iaW5kaW5nKTsKKwkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgZmllbGREZWNsLmJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCQkJCQkJY29kZVN0cmVhbS5hYXN0b3JlKCk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQljb2RlU3RyZWFtLnB1dHN0YXRpYyhkZWNsYXJpbmdUeXBlLmVudW1WYWx1ZXNTeW50aGV0aWNmaWVsZCk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX3B1dHN0YXRpYywgZGVjbGFyaW5nVHlwZS5lbnVtVmFsdWVzU3ludGhldGljZmllbGQsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCQlpZiAocmVtYWluaW5nRmllbGRDb3VudCAhPSAwKSB7CiAJCQkJLy8gaWYgZmllbGRzIHRoYXQgYXJlIG5vdCBlbnVtIGNvbnN0YW50cyBuZWVkIHRvIGJlIGdlbmVyYXRlZCAoc3RhdGljIGluaXRpYWxpemVyL3N0YXRpYyBmaWVsZCkKLQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOyBpIDwgbWF4ICYmIHJlbWFpbmluZ0ZpZWxkQ291bnQgPj0gMDsgaSsrKSB7CiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJCXN3aXRjaCAoZmllbGREZWNsLmdldEtpbmQoKSkgewogCQkJCQkJY2FzZSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVCA6CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUiA6Ci0JCQkJCQkJaWYgKCFmaWVsZERlY2wuaXNTdGF0aWMoKSkgCisJCQkJCQkJaWYgKCFmaWVsZERlY2wuaXNTdGF0aWMoKSkgewogCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJcmVtYWluaW5nRmllbGRDb3VudC0tOwogCQkJCQkJCWxhc3RJbml0aWFsaXplclNjb3BlID0gKChJbml0aWFsaXplcikgZmllbGREZWNsKS5ibG9jay5zY29wZTsKIAkJCQkJCQlmaWVsZERlY2wuZ2VuZXJhdGVDb2RlKHN0YXRpY0luaXRpYWxpemVyU2NvcGUsIGNvZGVTdHJlYW0pOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRklFTEQgOgotCQkJCQkJCWlmICghZmllbGREZWNsLmJpbmRpbmcuaXNTdGF0aWMoKSkgCisJCQkJCQkJaWYgKCFmaWVsZERlY2wuYmluZGluZy5pc1N0YXRpYygpKSB7CiAJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlyZW1haW5pbmdGaWVsZENvdW50LS07CiAJCQkJCQkJbGFzdEluaXRpYWxpemVyU2NvcGUgPSBudWxsOwogCQkJCQkJCWZpZWxkRGVjbC5nZW5lcmF0ZUNvZGUoc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwgY29kZVN0cmVhbSk7CiAJCQkJCQkJYnJlYWs7CkBAIC0yNDEsMTMgKzI4OCwxMyBAQAogCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IGZpZWxkRGVjbGFyYXRpb25zW2ldOwogCQkJCQlzd2l0Y2ggKGZpZWxkRGVjbC5nZXRLaW5kKCkpIHsKIAkJCQkJCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSIDoKLQkJCQkJCQlpZiAoIWZpZWxkRGVjbC5pc1N0YXRpYygpKSAKKwkJCQkJCQlpZiAoIWZpZWxkRGVjbC5pc1N0YXRpYygpKQogCQkJCQkJCQlicmVhazsKIAkJCQkJCQlsYXN0SW5pdGlhbGl6ZXJTY29wZSA9ICgoSW5pdGlhbGl6ZXIpIGZpZWxkRGVjbCkuYmxvY2suc2NvcGU7CiAJCQkJCQkJZmllbGREZWNsLmdlbmVyYXRlQ29kZShzdGF0aWNJbml0aWFsaXplclNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkZJRUxEIDoKLQkJCQkJCQlpZiAoIWZpZWxkRGVjbC5iaW5kaW5nLmlzU3RhdGljKCkpIAorCQkJCQkJCWlmICghZmllbGREZWNsLmJpbmRpbmcuaXNTdGF0aWMoKSkKIAkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJbGFzdEluaXRpYWxpemVyU2NvcGUgPSBudWxsOwogCQkJCQkJCWZpZWxkRGVjbC5nZW5lcmF0ZUNvZGUoc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwgY29kZVN0cmVhbSk7CkBAIC0yNTYsNyArMzAzLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJCisKIAkJaWYgKGNvZGVTdHJlYW0ucG9zaXRpb24gPT0gMCkgewogCQkJLy8gZG8gbm90IG5lZWQgdG8gb3V0cHV0IGEgQ2xpbml0IGlmIG5vIGJ5dGVjb2RlcwogCQkJLy8gc28gd2UgcmVzZXQgdGhlIG9mZnNldCBpbnNpZGUgdGhlIGJ5dGUgYXJyYXkgY29udGVudHMuCkBAIC0yOTYsNyArMzQzLDcgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoUGFyc2VyIHBhcnNlciwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewotCQkvL3RoZSBjbGluaXQgaXMgZmlsbGVkIGJ5IGhhbmQgLi4uLiAKKwkJLy90aGUgY2xpbml0IGlzIGZpbGxlZCBieSBoYW5kIC4uLi4KIAl9CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKQEAgLTMyOCw4ICszNzUsOCBAQAogCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9CiAJCQkJdGhpcy5zY29wZS5vdXRlck1vc3RDbGFzc1Njb3BlKCkuZW5jbG9zaW5nU291cmNlVHlwZSgpOwogCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjMzNAotCQkJaWYgKCFzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIXNvdXJjZVR5cGUuaXNCYXNlVHlwZSgpKSB7CQkJCi0JCQkJdGhpcy5jbGFzc0xpdGVyYWxTeW50aGV0aWNGaWVsZCA9IHNvdXJjZVR5cGUuYWRkU3ludGhldGljRmllbGRGb3JDbGFzc0xpdGVyYWwoc291cmNlVHlwZSwgc2NvcGUpOworCQkJaWYgKCFzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkgJiYgIXNvdXJjZVR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCQkJdGhpcy5jbGFzc0xpdGVyYWxTeW50aGV0aWNGaWVsZCA9IHNvdXJjZVR5cGUuYWRkU3ludGhldGljRmllbGRGb3JDbGFzc0xpdGVyYWwoc291cmNlVHlwZSwgdGhpcy5zY29wZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21iaW5lZEJpbmFyeUV4cHJlc3Npb24uamF2YQppbmRleCA3MWUxMDFiLi5kNDljMmQ2IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTAgKzIwLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogCiAvKioKLSAqIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnlFeHByZXNzaW9uIHRoYXQgCisgKiBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5RXhwcmVzc2lvbiB0aGF0CiAgKiBzcGVjaWZpY2FsbHkgYXR0ZW1wdHMgdG8gbWl0aWdhdGUgdGhlIGlzc3VlcyByYWlzZWQgYnkgZXhwcmVzc2lvbnMgd2hpY2gKLSAqIGhhdmUgYSB2ZXJ5IGRlZXAgbGVmdG1vc3QgYnJhbmNoLiBJdCBkb2VzIHNvIGJ5IG1haW50YWluaW5nIGEgdGFibGUgb2YgCi0gKiBkaXJlY3QgcmVmZXJlbmNlcyB0byBpdHMgc3ViZXhwcmVzc2lvbnMsIGFuZCBpbXBsZW1lbnRpbmcgbm9uLXJlY3Vyc2l2ZSAKKyAqIGhhdmUgYSB2ZXJ5IGRlZXAgbGVmdG1vc3QgYnJhbmNoLiBJdCBkb2VzIHNvIGJ5IG1haW50YWluaW5nIGEgdGFibGUgb2YKKyAqIGRpcmVjdCByZWZlcmVuY2VzIHRvIGl0cyBzdWJleHByZXNzaW9ucywgYW5kIGltcGxlbWVudGluZyBub24tcmVjdXJzaXZlCiAgKiB2YXJpYW50cyBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCByZWN1cnNpdmUgYWxnb3JpdGhtcyBvZiBpdHMgYW5jZXN0b3JzLgogICogVGhlIHN1YmV4cHJlc3Npb25zIHRhYmxlIG9ubHkgaG9sZHMgaW50ZXJtZWRpYXRlIGJpbmFyeSBleHByZXNzaW9ucy4gSXRzCiAgKiByb2xlIGlzIHRvIHByb3ZpZGUgdGhlIHJldmVyc2VkIG5hdmlnYXRpb24gdGhyb3VnaCB0aGUgbGVmdCByZWxhdGlvbnNoaXAKQEAgLTM1LDcgKzM1LDcgQEAKICAqIHRhYmxlLjxicj4KICAqIE5vdGVzOgogICogPHVsPgotICogPGxpPkNvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiBpcyBub3QgbWVhbnQgdG8gYmVoYXZlIGluIG90aGVyIHdheXMgdGhhbiAKKyAqIDxsaT5Db21iaW5lZEJpbmFyeUV4cHJlc3Npb24gaXMgbm90IG1lYW50IHRvIGJlaGF2ZSBpbiBvdGhlciB3YXlzIHRoYW4KICAqICAgICBCaW5hcnlFeHByZXNzaW9uIGluIGFueSBvYnNlcnZhYmxlIHJlc3BlY3Q7PC9saT4KICAqIDxsaT52aXNpdG9ycyB0aGF0IGltcGxlbWVudCB0aGVpciBvd24gdHJhdmVyc2FsIHVwb24gYmluYXJ5IGV4cHJlc3Npb25zCiAgKiAgICAgc2hvdWxkIGNvbnNpZGVyIHRha2luZyBhZHZhbnRhZ2Ugb2YgY29tYmluZWQgYmluYXJ5IGV4cHJlc3Npb25zLCBvcgpAQCAtNDcsMTcgKzQ3LDE3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gZXh0ZW5kcyBCaW5hcnlFeHByZXNzaW9uIHsKIAotCS8qKiAKLQkgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJpbmFyeSBleHByZXNzaW9ucyBvZiB0aGlzJyBsZWZ0IGJyYW5jaCB0aGF0IAorCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmluYXJ5IGV4cHJlc3Npb25zIG9mIHRoaXMnIGxlZnQgYnJhbmNoIHRoYXQKIAkgKiBiZWFyIHRoZSBzYW1lIG9wZXJhdG9yIGFzIHRoaXMuPGJyPgotCSAqIE5vdGVzOiAKLQkgKiA8dWw+PGxpPnRoZSBwcmVzZW5jZSBvZiBhIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiBpbnN0YW5jZSByZXNldHMgCisJICogTm90ZXM6CisJICogPHVsPjxsaT50aGUgcHJlc2VuY2Ugb2YgYSBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gaW5zdGFuY2UgcmVzZXRzCiAJICogICAgICAgICBhcml0eSwgZXZlbiB3aGVuIGl0cyBvcGVyYXRvciBpcyBjb21wYXRpYmxlOzwvbGk+CiAJICoJICAgPGxpPnRoaXMgcHJvcGVydHkgaXMgbWFpbnRhaW5lZCBieSB0aGUgcGFyc2VyLjwvbGk+CiAJICogPC91bD4KIAkgKi8KIAlwdWJsaWMgaW50IGFyaXR5OwotCQorCiAJLyoqCiAJICogVGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgdGhlIG5leHQgZnVsbC1mbGVkZ2VkCiAJICogQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgbWFpbnRhaW5lZCBmb3IgdGhlCkBAIC02NSwzMCArNjUsMzAgQEAKIAkgKiBwb2xpY3ksIHdoaWNoIHNjYWxlcyBiZXR0ZXIgd2l0aCB2ZXJ5IGxhcmdlIGV4cHJlc3Npb25zLgogCSAqLwogCXB1YmxpYyBpbnQgYXJpdHlNYXg7Ci0JCisKIAkvKioKIAkgKiBVcHBlciBsaW1pdCBmb3Ige0BsaW5rICNhcml0eU1heH0uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJJVFlfTUFYX01BWCA9IDE2MDsKLQkKKwogCS8qKgogCSAqIERlZmF1bHQgbG93ZXIgbGltaXQgZm9yIHtAbGluayAjYXJpdHlNYXh9LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSSVRZX01BWF9NSU4gPSAyMDsKLQkKKwogCS8qKgogCSAqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBmaXJzdCB0ZXJtIG9mIHRoZSBzZXJpZXMgb2Yge0BsaW5rICNhcml0eU1heH0KLQkgKiB2YWx1ZXMuIENoYW5naW5nIHRoaXMgYWxsb3dzIGZvciBleHBlcmltZW50YXRpb24uIE5vdCBtZWFudCB0byBiZSAKKwkgKiB2YWx1ZXMuIENoYW5naW5nIHRoaXMgYWxsb3dzIGZvciBleHBlcmltZW50YXRpb24uIE5vdCBtZWFudCB0byBiZQogCSAqIGNoYW5nZWQgZHVyaW5nIGEgcGFyc2Ugb3BlcmF0aW9uLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IGRlZmF1bHRBcml0eU1heFN0YXJ0aW5nVmFsdWUgPSBBUklUWV9NQVhfTUlOOwotCQorCiAJLyoqCiAJICogQSB0YWJsZSBvZiByZWZlcmVuY2VzIHRvIHRoZSBiaW5hcnkgZXhwcmVzc2lvbnMgb2YgdGhpcycgbGVmdCBicmFuY2guCiAJICogSW5zdGFuY2VzIG9mIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiBhcmUgbm90IHJlcGVhdGVkIGhlcmUuIEluc3RlYWQsCiAJICogdGhlIGxlZnQgc3ViZXhwcmVzc2lvbiBvZiByZWZlcmVuY2VzVGFibGVbMF0gbWF5IGJlIGEgY29tYmluZWQgYmluYXJ5Ci0JICogZXhwcmVzc2lvbiwgaWYgYXBwcm9wcmlhdGUuIE51bGwgd2hlbiB0aGlzIG9ubHkgY2FyZXMgYWJvdXQgdHJhY2tpbmcgCi0JICogdGhlIGV4cHJlc3Npb24ncyBhcml0eS4gCisJICogZXhwcmVzc2lvbiwgaWYgYXBwcm9wcmlhdGUuIE51bGwgd2hlbiB0aGlzIG9ubHkgY2FyZXMgYWJvdXQgdHJhY2tpbmcKKwkgKiB0aGUgZXhwcmVzc2lvbidzIGFyaXR5LgogCSAqLwogCXB1YmxpYyBCaW5hcnlFeHByZXNzaW9uIHJlZmVyZW5jZXNUYWJsZVtdOwogCkBAIC0xMDYsMzcgKzEwNiwzMCBAQAogICogICAgICAgIGFscmVhZHkgZXhpc3QgaW50byB0aGUgbGVmdG1vc3QgYnJhbmNoIG9mIGxlZnQgKGluY2x1ZGluZyBsZWZ0KTsgbXVzdAogICogICAgICAgIGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwCiAgKi8KLXB1YmxpYyBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24oRXhwcmVzc2lvbiBsZWZ0LCBFeHByZXNzaW9uIHJpZ2h0LCBpbnQgb3BlcmF0b3IsCi0JCWludCBhcml0eSkgeworcHVibGljIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbihFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsIGludCBvcGVyYXRvciwgaW50IGFyaXR5KSB7CiAJc3VwZXIobGVmdCwgcmlnaHQsIG9wZXJhdG9yKTsKLQl0aGlzLmFyaXR5ID0gYXJpdHk7Ci0JaWYgKGFyaXR5ID4gMSkgewotCQl0aGlzLnJlZmVyZW5jZXNUYWJsZSA9IG5ldyBCaW5hcnlFeHByZXNzaW9uW2FyaXR5XTsKLQkJdGhpcy5yZWZlcmVuY2VzVGFibGVbYXJpdHkgLSAxXSA9IChCaW5hcnlFeHByZXNzaW9uKSBsZWZ0OwotCQlmb3IgKGludCBpID0gYXJpdHkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQl0aGlzLnJlZmVyZW5jZXNUYWJsZVtpIC0gMV0gPSAKLQkJCQkoQmluYXJ5RXhwcmVzc2lvbikgdGhpcy5yZWZlcmVuY2VzVGFibGVbaV0ubGVmdDsgCi0JCX0KLQl9IGVsc2UgewotCQl0aGlzLmFyaXR5TWF4ID0gZGVmYXVsdEFyaXR5TWF4U3RhcnRpbmdWYWx1ZTsKLQl9CisJaW5pdEFyaXR5KGxlZnQsIGFyaXR5KTsKK30KK3B1YmxpYyBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24oQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwlzdXBlcihleHByZXNzaW9uKTsKKwlpbml0QXJpdHkoZXhwcmVzc2lvbi5sZWZ0LCBleHByZXNzaW9uLmFyaXR5KTsKIH0KIAotcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewotCS8vIGtlZXAgaW1wbGVtZW50YXRpb24gaW4gc3luYyB3aXRoIEJpbmFyeUV4cHJlc3Npb24jYW5hbHlzZUNvZGUJCisJLy8ga2VlcCBpbXBsZW1lbnRhdGlvbiBpbiBzeW5jIHdpdGggQmluYXJ5RXhwcmVzc2lvbiNhbmFseXNlQ29kZQogCWlmICh0aGlzLnJlZmVyZW5jZXNUYWJsZSA9PSBudWxsKSB7CiAJCXJldHVybiBzdXBlci5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJfQogCUJpbmFyeUV4cHJlc3Npb24gY3Vyc29yOwotCWlmICgoY3Vyc29yID0gdGhpcy5yZWZlcmVuY2VzVGFibGVbMF0pLnJlc29sdmVkVHlwZS5pZCAhPSAKKwlpZiAoKGN1cnNvciA9IHRoaXMucmVmZXJlbmNlc1RhYmxlWzBdKS5yZXNvbHZlZFR5cGUuaWQgIT0KIAkJCVR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgewogCQljdXJzb3IubGVmdC5jaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJfQogCWZsb3dJbmZvID0gY3Vyc29yLmxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLgotCQl1bmNvbmRpdGlvbmFsSW5pdHMoKTsJCisJCXVuY29uZGl0aW9uYWxJbml0cygpOwogCWZvciAoaW50IGkgPSAwLCBlbmQgPSB0aGlzLmFyaXR5OyBpIDwgZW5kOyBpICsrKSB7Ci0JCWlmICgoY3Vyc29yID0gdGhpcy5yZWZlcmVuY2VzVGFibGVbaV0pLnJlc29sdmVkVHlwZS5pZCAhPSAKKwkJaWYgKChjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVtpXSkucmVzb2x2ZWRUeXBlLmlkICE9CiAJCQkJVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7CiAJCQljdXJzb3IucmlnaHQuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwogCQl9CkBAIC0xNTEsMTUgKzE0NCwxNSBAQAogCQl1bmNvbmRpdGlvbmFsSW5pdHMoKTsKIH0KIAotcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uKEJsb2NrU2NvcGUgYmxvY2tTY29wZSwgCitwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oQmxvY2tTY29wZSBibG9ja1Njb3BlLAogCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGludCB0eXBlSUQpIHsKIAkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aCBCaW5hcnlFeHByZXNzaW9uIGFuZCBFeHByZXNzaW9uCiAJLy8gI2dlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbgogCWlmICh0aGlzLnJlZmVyZW5jZXNUYWJsZSA9PSBudWxsKSB7Ci0JCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbihibG9ja1Njb3BlLCBjb2RlU3RyZWFtLCAKKwkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sCiAJCQl0eXBlSUQpOwotCX0gZWxzZSB7CQotCQlpZiAoKCgodGhpcy5iaXRzICYgQVNUTm9kZS5PcGVyYXRvck1BU0spID4+IEFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0gCisJfSBlbHNlIHsKKwkJaWYgKCgoKHRoaXMuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQpID09CiAJCQkJT3BlcmF0b3JJZHMuUExVUykKIAkJCSYmICgodGhpcy5iaXRzICYgQVNUTm9kZS5SZXR1cm5UeXBlSURNQVNLKSA9PSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpKSB7CiAJCQlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKQEAgLTE2OCwzNCArMTYxLDM0IEBACiAJCQkJCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCQkJfSBlbHNlIHsKIAkJCQlCaW5hcnlFeHByZXNzaW9uIGN1cnNvciA9IHRoaXMucmVmZXJlbmNlc1RhYmxlWzBdOwotCQkKKwogCQkJCWludCByZXN0YXJ0ID0gMDsKIAkvLwkJCWludCBjdXJzb3JUeXBlSUQ7CiAJCQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJCQlmb3IgKHJlc3RhcnQgPSB0aGlzLmFyaXR5IC0gMTsgcmVzdGFydCA+PSAwOyByZXN0YXJ0LS0pIHsKLQkJCQkJaWYgKChjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVtyZXN0YXJ0XSkuY29uc3RhbnQgIT0gCisJCQkJCWlmICgoY3Vyc29yID0gdGhpcy5yZWZlcmVuY2VzVGFibGVbcmVzdGFydF0pLmNvbnN0YW50ICE9CiAJCQkJCQkJQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY3Vyc29yLmNvbnN0YW50LCAKKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjdXJzb3IuY29uc3RhbnQsCiAJCQkJCQkJY3Vyc29yLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmRGb3JUeXBlKAogCQkJCQkJCWN1cnNvci5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkNPTVBJTEVfVFlQRV9NQVNLKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCS8vIG5ldmVyIGhhcHBlbnMgZm9yIG5vdyAtIG1heSByZWNvbnNpZGVyIGlmIHdlIGRlY2lkZSB0byAKKwkJCQkJLy8gbmV2ZXIgaGFwcGVucyBmb3Igbm93IC0gbWF5IHJlY29uc2lkZXIgaWYgd2UgZGVjaWRlIHRvCiAJCQkJCS8vIGNvdmVyIG1vcmUgdGhhbiBzdHJpbmcgY29uY2F0ZW5hdGlvbgotCS8vCQkJCWlmICghKCgoKGN1cnNvciA9IHRoaXMucmVmZXJlbmNlc1RhYmxlW3Jlc3RhcnRdKS5iaXRzICYgCi0JLy8JCQkJCQlBU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gQVNUTm9kZS5PcGVyYXRvclNISUZUKSA9PSAKLQkvLwkJCQkJCQlPcGVyYXRvcklkcy5QTFVTKSAmIAotCS8vCQkJCQkJKChjdXJzb3JUeXBlSUQgPSBjdXJzb3IuYml0cyAmIEFTVE5vZGUuUmV0dXJuVHlwZUlETUFTSykgPT0gCisJLy8JCQkJaWYgKCEoKCgoY3Vyc29yID0gdGhpcy5yZWZlcmVuY2VzVGFibGVbcmVzdGFydF0pLmJpdHMgJgorCS8vCQkJCQkJQVNUTm9kZS5PcGVyYXRvck1BU0spID4+IEFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0KKwkvLwkJCQkJCQlPcGVyYXRvcklkcy5QTFVTKSAmCisJLy8JCQkJCQkoKGN1cnNvclR5cGVJRCA9IGN1cnNvci5iaXRzICYgQVNUTm9kZS5SZXR1cm5UeXBlSURNQVNLKSA9PQogCS8vCQkJCQkJCVR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykpIHsKLQkvLwkJCQkJaWYgKGN1cnNvclR5cGVJRCA9PSBUX0phdmFMYW5nU3RyaW5nICYmIAotCS8vCQkJCQkJCWN1cnNvci5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgCisJLy8JCQkJCWlmIChjdXJzb3JUeXBlSUQgPT0gVF9KYXZhTGFuZ1N0cmluZyAmJgorCS8vCQkJCQkJCWN1cnNvci5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYKIAkvLwkJCQkJCQljdXJzb3IuY29uc3RhbnQuc3RyaW5nVmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7CiAJLy8JCQkJCQlicmVhazsgLy8gb3B0aW1pemUgc3RyICsgIiIKIAkvLwkJCQkJfQogCS8vCQkJCQljdXJzb3IuZ2VuZXJhdGVDb2RlKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCS8vCQkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmRGb3JUeXBlKAotCS8vCQkJCQkJCWN1cnNvclR5cGVJRCk7CQkJCQkKKwkvLwkJCQkJCQljdXJzb3JUeXBlSUQpOwogCS8vCQkJCQlicmVhazsKIAkvLwkJCQl9CiAJCQkJfQpAQCAtMjA4LDExICsyMDEsMTEgQEAKIAkJCQl9CiAJCQkJaW50IHBjQXV4OwogCQkJCWZvciAoaW50IGkgPSByZXN0YXJ0OyBpIDwgdGhpcy5hcml0eTsgaSsrKSB7Ci0JCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgCisJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywKIAkJCQkJCShjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVtpXSkubGVmdC5zb3VyY2VTdGFydCk7CiAJCQkJCXBjQXV4ID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJCQkJY3Vyc29yLnJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbihibG9ja1Njb3BlLCAKLQkJCQkJCWNvZGVTdHJlYW0sCWN1cnNvci5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gJiAKKwkJCQkJY3Vyc29yLnJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbihibG9ja1Njb3BlLAorCQkJCQkJY29kZVN0cmVhbSwJY3Vyc29yLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiAmCiAJCQkJCQkJVHlwZUlkcy5DT01QSUxFX1RZUEVfTUFTSyk7CiAJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwY0F1eCwgY3Vyc29yLnJpZ2h0LnNvdXJjZVN0YXJ0KTsKIAkJCQl9CkBAIC0yMjUsMzQgKzIxOCwzNCBAQAogCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5yaWdodC5zb3VyY2VTdGFydCk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgCisJCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oYmxvY2tTY29wZSwgY29kZVN0cmVhbSwKIAkJCQl0eXBlSUQpOwogCQl9CiAJfQogfQogCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb25DcmVhdGlvbihCbG9ja1Njb3BlIGJsb2NrU2NvcGUsIAorcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uQ3JlYXRpb24oQmxvY2tTY29wZSBibG9ja1Njb3BlLAogCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGludCB0eXBlSUQpIHsKIAkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aCBCaW5hcnlFeHByZXNzaW9uCiAJLy8gI2dlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uCiAJaWYgKHRoaXMucmVmZXJlbmNlc1RhYmxlID09IG51bGwpIHsKLQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uQ3JlYXRpb24oYmxvY2tTY29wZSwgCisJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uKGJsb2NrU2NvcGUsCiAJCQljb2RlU3RyZWFtLAl0eXBlSUQpOwogCX0gZWxzZSB7Ci0JCWlmICgoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gQVNUTm9kZS5PcGVyYXRvclNISUZUKSA9PSAKLQkJCQlPcGVyYXRvcklkcy5QTFVTKSAmJiAKLQkJCQkJKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlJldHVyblR5cGVJRE1BU0spID09IAotCQkJCQkJVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSAmJiAKKwkJaWYgKCgoKHRoaXMuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQpID09CisJCQkJT3BlcmF0b3JJZHMuUExVUykgJiYKKwkJCQkJKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlJldHVyblR5cGVJRE1BU0spID09CisJCQkJCQlUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpICYmCiAJCQkJCXRoaXMuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQkJQmluYXJ5RXhwcmVzc2lvbiBjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVt0aGlzLmFyaXR5IC0gMV07CiAJCQkJLy8gc2lsZW5jZSB3YXJuaW5ncwogCQkJaW50IHJlc3RhcnQgPSAwOwogCQkJZm9yIChyZXN0YXJ0ID0gdGhpcy5hcml0eSAtIDE7IHJlc3RhcnQgPj0gMDsgcmVzdGFydC0tKSB7Ci0JCQkJaWYgKCgoKChjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVtyZXN0YXJ0XSkuYml0cyAmIAotCQkJCQkJQVNUTm9kZS5PcGVyYXRvck1BU0spID4+IEFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0gCi0JCQkJCQkJT3BlcmF0b3JJZHMuUExVUykgJiYgCi0JCQkJCQkoKGN1cnNvci5iaXRzICYgQVNUTm9kZS5SZXR1cm5UeXBlSURNQVNLKSA9PSAKKwkJCQlpZiAoKCgoKGN1cnNvciA9IHRoaXMucmVmZXJlbmNlc1RhYmxlW3Jlc3RhcnRdKS5iaXRzICYKKwkJCQkJCUFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQpID09CisJCQkJCQkJT3BlcmF0b3JJZHMuUExVUykgJiYKKwkJCQkJCSgoY3Vyc29yLmJpdHMgJiBBU1ROb2RlLlJldHVyblR5cGVJRE1BU0spID09CiAJCQkJCQkJVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSkgewogCQkJCQlpZiAoY3Vyc29yLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJCQkJY29kZVN0cmVhbS5uZXdTdHJpbmdDb250YXRlbmF0aW9uKCk7IC8vIG5ldzogamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgpAQCAtMjYzLDggKzI1Niw4IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWN1cnNvci5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb25DcmVhdGlvbihibG9ja1Njb3BlLCAKLQkJCQkJCWNvZGVTdHJlYW0sIGN1cnNvci5pbXBsaWNpdENvbnZlcnNpb24gJiAKKwkJCQkJY3Vyc29yLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uKGJsb2NrU2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLCBjdXJzb3IuaW1wbGljaXRDb252ZXJzaW9uICYKIAkJCQkJCQlUeXBlSWRzLkNPTVBJTEVfVFlQRV9NQVNLKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjc4LDExICsyNzEsMTEgQEAKIAkJCX0KIAkJCWludCBwY0F1eDsKIAkJCWZvciAoaW50IGkgPSByZXN0YXJ0OyBpIDwgdGhpcy5hcml0eTsgaSsrKSB7Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCAKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsCiAJCQkJCShjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVtpXSkubGVmdC5zb3VyY2VTdGFydCk7CiAJCQkJcGNBdXggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQkJCWN1cnNvci5yaWdodC5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oYmxvY2tTY29wZSwgCi0JCQkJCWNvZGVTdHJlYW0sCWN1cnNvci5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gJiAKKwkJCQljdXJzb3IucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uKGJsb2NrU2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCWN1cnNvci5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gJgogCQkJCQkJVHlwZUlkcy5DT01QSUxFX1RZUEVfTUFTSyk7CiAJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjQXV4LCBjdXJzb3IucmlnaHQuc291cmNlU3RhcnQpOwogCQkJfQpAQCAtMjk0LDE2ICsyODcsMjkgQEAKIAkJCQl0aGlzLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnJpZ2h0LnNvdXJjZVN0YXJ0KTsKIAkJfSBlbHNlIHsKLQkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uKGJsb2NrU2NvcGUsIAorCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uQ3JlYXRpb24oYmxvY2tTY29wZSwKIAkJCQljb2RlU3RyZWFtLCB0eXBlSUQpOwogCQl9CiAJfQogfQorcHJpdmF0ZSB2b2lkIGluaXRBcml0eShFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCB2YWx1ZSkgeworCXRoaXMuYXJpdHkgPSB2YWx1ZTsKKwlpZiAodmFsdWUgPiAxKSB7CisJCXRoaXMucmVmZXJlbmNlc1RhYmxlID0gbmV3IEJpbmFyeUV4cHJlc3Npb25bdmFsdWVdOworCQl0aGlzLnJlZmVyZW5jZXNUYWJsZVt2YWx1ZSAtIDFdID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisJCWZvciAoaW50IGkgPSB2YWx1ZSAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJCXRoaXMucmVmZXJlbmNlc1RhYmxlW2kgLSAxXSA9CisJCQkJKEJpbmFyeUV4cHJlc3Npb24pIHRoaXMucmVmZXJlbmNlc1RhYmxlW2ldLmxlZnQ7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmFyaXR5TWF4ID0gZGVmYXVsdEFyaXR5TWF4U3RhcnRpbmdWYWx1ZTsKKwl9Cit9CiAKLXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcyhpbnQgaW5kZW50LCAKK3B1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcyhpbnQgaW5kZW50LAogCQlTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JLy8ga2VlcCBpbXBsZW1lbnRhdGlvbiBpbiBzeW5jIHdpdGggCi0JLy8gQmluYXJ5RXhwcmVzc2lvbiNwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzIGFuZCAKKwkvLyBrZWVwIGltcGxlbWVudGF0aW9uIGluIHN5bmMgd2l0aAorCS8vIEJpbmFyeUV4cHJlc3Npb24jcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcyBhbmQKIAkvLyBPcGVyYXRvckV4cHJlc3Npb24jcHJpbnRFeHByZXNzaW9uCiAJaWYgKHRoaXMucmVmZXJlbmNlc1RhYmxlID09IG51bGwpIHsKIAkJcmV0dXJuIHN1cGVyLnByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW5kZW50LCBvdXRwdXQpOwpAQCAtMzE0LDcgKzMyMCw3IEBACiAJfQogCW91dHB1dCA9IHRoaXMucmVmZXJlbmNlc1RhYmxlWzBdLmxlZnQuCiAJCXByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7Ci0JZm9yIChpbnQgaSA9IDAsIGVuZCA9IHRoaXMuYXJpdHk7IAorCWZvciAoaW50IGkgPSAwLCBlbmQgPSB0aGlzLmFyaXR5OwogCQkJCWkgPCBlbmQ7IGkrKykgewogCQlvdXRwdXQuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKS5hcHBlbmQoJyAnKTsKIAkJb3V0cHV0ID0gdGhpcy5yZWZlcmVuY2VzVGFibGVbaV0ucmlnaHQuCkBAIC0zMzIsNyArMzM4LDcgQEAKIAl9CiAJQmluYXJ5RXhwcmVzc2lvbiBjdXJzb3I7CiAJaWYgKChjdXJzb3IgPSB0aGlzLnJlZmVyZW5jZXNUYWJsZVswXSkubGVmdCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB7Ci0JCWN1cnNvci5sZWZ0LmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IAorCQljdXJzb3IubGVmdC5iaXRzIHw9IEFTVE5vZGUuRGlzYWJsZVVubmVjZXNzYXJ5Q2FzdENoZWNrOwogCQkJLy8gd2lsbCBjaGVjayBsYXRlciBvbgogCX0KIAljdXJzb3IubGVmdC5yZXNvbHZlVHlwZShzY29wZSk7CkBAIC0zNDksOCArMzU1LDggQEAKIAl9IGVsc2UgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKIAkJCWludCByZXN0YXJ0OwotCQkJZm9yIChyZXN0YXJ0ID0gdGhpcy5hcml0eSAtIDE7IAotCQkJCQlyZXN0YXJ0ID49IDA7IAorCQkJZm9yIChyZXN0YXJ0ID0gdGhpcy5hcml0eSAtIDE7CisJCQkJCXJlc3RhcnQgPj0gMDsKIAkJCQkJcmVzdGFydC0tKSB7CiAJCQkJaWYgKCF2aXNpdG9yLnZpc2l0KAogCQkJCQkJdGhpcy5yZWZlcmVuY2VzVGFibGVbcmVzdGFydF0sIHNjb3BlKSkgewpAQCAtMzY1LDcgKzM3MSw3IEBACiAJCQlpZiAocmVzdGFydCA9PSAwKSB7CiAJCQkJdGhpcy5yZWZlcmVuY2VzVGFibGVbMF0ubGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQl9Ci0JCQlmb3IgKGludCBpID0gcmVzdGFydCwgZW5kID0gdGhpcy5hcml0eTsgCisJCQlmb3IgKGludCBpID0gcmVzdGFydCwgZW5kID0gdGhpcy5hcml0eTsKIAkJCQkJCWkgPCBlbmQ7IGkrKykgewogCQkJCXRoaXMucmVmZXJlbmNlc1RhYmxlW2ldLnJpZ2h0LnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMucmVmZXJlbmNlc1RhYmxlW2ldLCBzY29wZSk7CkBAIC0zNzcsMTAgKzM4MywxMCBAQAogfQogCiAvKioKLSAqIENoYW5nZSB7QGxpbmsgI2FyaXR5TWF4fSBpZiBhbmQgYXMgbmVlZGVkLiBUaGUgY3VycmVudCBwb2xpY3kgaXMgdG8gZG91YmxlIAotICogYXJpdHlNYXggZWFjaCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdW50aWwgaXQgcmVhY2hlcyAKKyAqIENoYW5nZSB7QGxpbmsgI2FyaXR5TWF4fSBpZiBhbmQgYXMgbmVlZGVkLiBUaGUgY3VycmVudCBwb2xpY3kgaXMgdG8gZG91YmxlCisgKiBhcml0eU1heCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB1bnRpbCBpdCByZWFjaGVzCiAgKiB7QGxpbmsgI0FSSVRZX01BWF9NQVh9LiBPdGhlciBwb2xpY2llcyBtYXkgY29uc2lkZXIgaW5jcmVtZW50aW5nIGl0IGxlc3MKLSAqIGFncmVzc2l2ZWx5LiBDYWxsIG9ubHkgYWZ0ZXIgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gCisgKiBhZ3Jlc3NpdmVseS4gQ2FsbCBvbmx5IGFmdGVyIGFuIGFwcHJvcHJpYXRlIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvCiAgKiB7QGxpbmsgI2xlZnR9LgogICovCiAvLyBtb3JlIHNvcGhpc3RpY2F0ZSBpbmNyZW1lbnQgcG9saWNpZXMgd291bGQgbGV2ZXJhZ2UgdGhlIGxlZnRtb3N0IGV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YQppbmRleCA2NGUwY2VhLi5lYjZmNjRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjk1NTUxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMTgsMjIgKzE5LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSXJyaXRhbnRTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuUmVmZXJlbmNlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGF0aW9uVW5pdFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW1wb3J0QmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuTkxTVGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0TWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaFNldE9mSW50OwogCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24KLQlleHRlbmRzIEFTVE5vZGUKLQlpbXBsZW1lbnRzIFByb2JsZW1TZXZlcml0aWVzLCBSZWZlcmVuY2VDb250ZXh0IHsKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgUmVmZXJlbmNlQ29udGV4dCB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFNUUklOR19MSVRFUkFMX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKIAkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CkBAIC00OSw3ICs1NCw3IEBACiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIHR5cGVzOwogCXB1YmxpYyBpbnRbXVtdIGNvbW1lbnRzOwogCi0JcHVibGljIGJvb2xlYW4gaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSBmYWxzZTsJLy8gb25jZSBwb2ludGxlc3MgdG8gaW52ZXN0aWdhdGUgZHVlIHRvIGVycm9ycworCXB1YmxpYyBib29sZWFuIGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gZmFsc2U7IC8vIG9uY2UgcG9pbnRsZXNzIHRvIGludmVzdGlnYXRlIGR1ZSB0byBlcnJvcnMKIAlwdWJsaWMgYm9vbGVhbiBpZ25vcmVNZXRob2RCb2RpZXMgPSBmYWxzZTsKIAlwdWJsaWMgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGU7CiAJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7CkBAIC02NSw0NjMgKzcwLDYzMCBAQAogCXB1YmxpYyBOTFNUYWdbXSBubHNUYWdzOwogCXByaXZhdGUgU3RyaW5nTGl0ZXJhbFtdIHN0cmluZ0xpdGVyYWxzOwogCXByaXZhdGUgaW50IHN0cmluZ0xpdGVyYWxzUHRyOworCXByaXZhdGUgSGFzaFNldE9mSW50IHN0cmluZ0xpdGVyYWxzU3RhcnQ7CiAKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oCi0JCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIsCi0JCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LAotCQlpbnQgc291cmNlTGVuZ3RoKSB7CisJSXJyaXRhbnRTZXRbXSBzdXBwcmVzc1dhcm5pbmdJcnJpdGFudHM7ICAvLyBpcnJpdGFudCBmb3Igc3VwcHJlc3NlZCB3YXJuaW5ncworCUFubm90YXRpb25bXSBzdXBwcmVzc1dhcm5pbmdBbm5vdGF0aW9uczsKKwlsb25nW10gc3VwcHJlc3NXYXJuaW5nU2NvcGVQb3NpdGlvbnM7IC8vIChzdGFydCA8PCAzMikgKyBlbmQKKwlpbnQgc3VwcHJlc3NXYXJuaW5nc0NvdW50OwogCi0JCXRoaXMucHJvYmxlbVJlcG9ydGVyID0gcHJvYmxlbVJlcG9ydGVyOwotCQl0aGlzLmNvbXBpbGF0aW9uUmVzdWx0ID0gY29tcGlsYXRpb25SZXN1bHQ7CitwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIAlpbnQgc291cmNlTGVuZ3RoKSB7CisJdGhpcy5wcm9ibGVtUmVwb3J0ZXIgPSBwcm9ibGVtUmVwb3J0ZXI7CisJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OworCS8vYnkgZGVmaW5pdGlvbiBvZiBhIGNvbXBpbGF0aW9uIHVuaXQuLi4uCisJdGhpcy5zb3VyY2VTdGFydCA9IDA7CisJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VMZW5ndGggLSAxOworfQogCi0JCS8vYnkgZGVmaW5pdGlvbiBvZiBhIGNvbXBpbGF0aW9uIHVuaXQuLi4uCi0JCXNvdXJjZVN0YXJ0ID0gMDsKLQkJc291cmNlRW5kID0gc291cmNlTGVuZ3RoIC0gMTsKKy8qCisgKglXZSBjYXVzZSB0aGUgY29tcGlsYXRpb24gdGFzayB0byBhYm9ydCB0byBhIGdpdmVuIGV4dGVudC4KKyAqLworcHVibGljIHZvaWQgYWJvcnQoaW50IGFib3J0TGV2ZWwsIENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtKSB7CisJc3dpdGNoIChhYm9ydExldmVsKSB7CisJCWNhc2UgQWJvcnRUeXBlIDoKKwkJCXRocm93IG5ldyBBYm9ydFR5cGUodGhpcy5jb21waWxhdGlvblJlc3VsdCwgcHJvYmxlbSk7CisJCWNhc2UgQWJvcnRNZXRob2QgOgorCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHRoaXMuY29tcGlsYXRpb25SZXN1bHQsIHByb2JsZW0pOworCQlkZWZhdWx0IDoKKwkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uVW5pdCh0aGlzLmNvbXBpbGF0aW9uUmVzdWx0LCBwcm9ibGVtKTsKIAl9Cit9CiAKLQkvKgotCSAqCVdlIGNhdXNlIHRoZSBjb21waWxhdGlvbiB0YXNrIHRvIGFib3J0IHRvIGEgZ2l2ZW4gZXh0ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFib3J0KGludCBhYm9ydExldmVsLCBDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSkgewotCi0JCXN3aXRjaCAoYWJvcnRMZXZlbCkgewotCQkJY2FzZSBBYm9ydFR5cGUgOgotCQkJCXRocm93IG5ldyBBYm9ydFR5cGUodGhpcy5jb21waWxhdGlvblJlc3VsdCwgcHJvYmxlbSk7Ci0JCQljYXNlIEFib3J0TWV0aG9kIDoKLQkJCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QodGhpcy5jb21waWxhdGlvblJlc3VsdCwgcHJvYmxlbSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvblVuaXQodGhpcy5jb21waWxhdGlvblJlc3VsdCwgcHJvYmxlbSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIERpc3BhdGNoIGNvZGUgYW5hbHlzaXMgQU5EIHJlcXVlc3Qgc2F0dXJhdGlvbiBvZiBpbm5lciBlbXVsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZSgpIHsKLQotCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJdHlwZXNbaV0uYW5hbHlzZUNvZGUoc2NvcGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHJlcXVlc3QgaW5uZXIgZW11bGF0aW9uIHByb3BhZ2F0aW9uCi0JCQlwcm9wYWdhdGVJbm5lckVtdWxhdGlvbkZvckFsbExvY2FsVHlwZXMoKTsKLQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgewotCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdoZW4gdW5pdCByZXN1bHQgaXMgYWJvdXQgdG8gYmUgYWNjZXB0ZWQsIHJlbW92ZWQgYmFjayBwb2ludGVycwotCSAqIHRvIGNvbXBpbGVyIHN0cnVjdHVyZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKKy8qCisgKiBEaXNwYXRjaCBjb2RlIGFuYWx5c2lzIEFORCByZXF1ZXN0IHNhdHVyYXRpb24gb2YgaW5uZXIgZW11bGF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIGFuYWx5c2VDb2RlKCkgeworCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQlyZXR1cm47CisJdHJ5IHsKIAkJaWYgKHRoaXMudHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQljbGVhblVwKHRoaXMudHlwZXNbaV0pOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubG9jYWxUeXBlQ291bnQ7IGkgPCBtYXg7IGkrKykgewotCQkJICAgIExvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbG9jYWxUeXBlc1tpXTsKLQkJCQkvLyBudWxsIG91dCB0aGUgdHlwZSdzIHNjb3BlIGJhY2twb2ludGVycwotCQkJCWxvY2FsVHlwZS5zY29wZSA9IG51bGw7IC8vIGxvY2FsIG1lbWJlcnMgYXJlIGFscmVhZHkgaW4gdGhlIGxpc3QKLQkJCQlsb2NhbFR5cGUuZW5jbG9zaW5nQ2FzZSA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLnR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQl0aGlzLnR5cGVzW2ldLmFuYWx5c2VDb2RlKHRoaXMuc2NvcGUpOwogCQkJfQogCQl9CisJCS8vIHJlcXVlc3QgaW5uZXIgZW11bGF0aW9uIHByb3BhZ2F0aW9uCisJCXByb3BhZ2F0ZUlubmVyRW11bGF0aW9uRm9yQWxsTG9jYWxUeXBlcygpOworCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCXJldHVybjsKKwl9Cit9CiAKLQkJY29tcGlsYXRpb25SZXN1bHQucmVjb3ZlcnlTY2FubmVyRGF0YSA9IG51bGw7IC8vIHJlY292ZXJ5IGlzIGFscmVhZHkgZG9uZQotCi0JCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBjb21waWxhdGlvblJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBjbGFzc0ZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkvLyBjbGVhciB0aGUgY2xhc3NGaWxlIGJhY2sgcG9pbnRlciB0byB0aGUgYmluZGluZ3MKLQkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBjbGFzc0ZpbGVzW2ldOwotCQkJLy8gbnVsbCBvdXQgdGhlIGNsYXNzZmlsZSBiYWNrcG9pbnRlciB0byBhIHR5cGUgYmluZGluZwotCQkJY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcgPSBudWxsOwotCQkJY2xhc3NGaWxlLmlubmVyQ2xhc3Nlc0JpbmRpbmdzID0gbnVsbDsKKy8qCisgKiBXaGVuIHVuaXQgcmVzdWx0IGlzIGFib3V0IHRvIGJlIGFjY2VwdGVkLCByZW1vdmVkIGJhY2sgcG9pbnRlcnMKKyAqIHRvIGNvbXBpbGVyIHN0cnVjdHVyZXMuCisgKi8KK3B1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CisJaWYgKHRoaXMudHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJY2xlYW5VcCh0aGlzLnR5cGVzW2ldKTsKIAkJfQotCX0KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChUeXBlRGVjbGFyYXRpb24gdHlwZSkgewotCQlpZiAodHlwZS5tZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZS5tZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCQkJY2xlYW5VcCh0eXBlLm1lbWJlclR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAodHlwZS5iaW5kaW5nICE9IG51bGwgJiYgdHlwZS5iaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkKLQkJCWNvbXBpbGF0aW9uUmVzdWx0Lmhhc0Fubm90YXRpb25zID0gdHJ1ZTsKLQkJaWYgKHR5cGUuYmluZGluZyAhPSBudWxsKSB7Ci0JCQkvLyBudWxsIG91dCB0aGUgdHlwZSdzIHNjb3BlIGJhY2twb2ludGVycwotCQkJdHlwZS5iaW5kaW5nLnNjb3BlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoZWNrVW51c2VkSW1wb3J0cygpewotCi0JCWlmICh0aGlzLnNjb3BlLmltcG9ydHMgIT0gbnVsbCl7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5zY29wZS5pbXBvcnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKLQkJCQlJbXBvcnRCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSB0aGlzLnNjb3BlLmltcG9ydHNbaV07Ci0JCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IGltcG9ydEJpbmRpbmcucmVmZXJlbmNlOwotCQkJCWlmIChpbXBvcnRSZWZlcmVuY2UgIT0gbnVsbCAmJiAoKGltcG9ydFJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5Vc2VkKSA9PSAwKSl7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZEltcG9ydChpbXBvcnRSZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25SZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBGaW5kcyB0aGUgbWF0Y2hpbmcgdHlwZSBhbW91bmcgdGhpcyBjb21waWxhdGlvbiB1bml0IHR5cGVzLgotCSAqIFJldHVybnMgbnVsbCBpZiBubyB0eXBlIHdpdGggdGhpcyBuYW1lIGlzIGZvdW5kLgotCSAqIFRoZSB0eXBlIG5hbWUgaXMgYSBjb21wb3VuZCBuYW1lCi0JICogZWcuIGlmIHdlJ3JlIGxvb2tpbmcgZm9yIFguQS5CIHRoZW4gYSB0eXBlIG5hbWUgd291bGQgYmUge1gsIEEsIEJ9Ci0JICovCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbk9mVHlwZShjaGFyW11bXSB0eXBlTmFtZSkgewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50eXBlcy5sZW5ndGg7IGkrKykgewotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy50eXBlc1tpXS5kZWNsYXJhdGlvbk9mVHlwZSh0eXBlTmFtZSk7Ci0JCQlpZiAodHlwZURlY2wgIT0gbnVsbCkgewotCQkJCXJldHVybiB0eXBlRGVjbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCeXRlY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKCkgewotCi0JCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikgewotCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCXR5cGVzW2ldLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKLQkJCQkJLy8gcHJvcGFnYXRlIHRoZSBmbGFnIHRvIHJlcXVlc3QgcHJvYmxlbSB0eXBlIGNyZWF0aW9uCi0JCQkJCXR5cGVzW2ldLmdlbmVyYXRlQ29kZShzY29wZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmlzUGFja2FnZUluZm8oKSAmJiB0aGlzLnR5cGVzICE9IG51bGwgJiYgdGhpcy5jdXJyZW50UGFja2FnZSE9IG51bGwgJiYgdGhpcy5jdXJyZW50UGFja2FnZS5hbm5vdGF0aW9ucyAhPSBudWxsKSB7Ci0JCQl0eXBlc1swXS5hbm5vdGF0aW9ucyA9IHRoaXMuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnM7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykKLQkJCQkJdHlwZXNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgewotCi0JCXJldHVybiBjb21waWxhdGlvblJlc3VsdC5nZXRGaWxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgewotCi0JCWlmIChjb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJY2hhcltdIGZpbGVOYW1lID0gY29tcGlsYXRpb25SZXN1bHQuZ2V0RmlsZU5hbWUoKTsKLQotCQkJaW50IHN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIGZpbGVOYW1lKSArIDE7Ci0JCQlpZiAoc3RhcnQgPT0gMCB8fCBzdGFydCA8IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJ1xcJywgZmlsZU5hbWUpKQotCQkJCXN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignXFwnLCBmaWxlTmFtZSkgKyAxOwotCi0JCQlpbnQgZW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIGZpbGVOYW1lKTsKLQkJCWlmIChlbmQgPT0gLTEpCi0JCQkJZW5kID0gZmlsZU5hbWUubGVuZ3RoOwotCi0JCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmaWxlTmFtZSwgc3RhcnQsIGVuZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQotCQlyZXR1cm4gKGN1cnJlbnRQYWNrYWdlID09IG51bGwpICYmIChpbXBvcnRzID09IG51bGwpICYmICh0eXBlcyA9PSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2VJbmZvKCkgewotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5nZXRNYWluVHlwZU5hbWUoKSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgewotCQlyZXR1cm4gdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQotCQlpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgewotCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgicGFja2FnZSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3VycmVudFBhY2thZ2UucHJpbnQoMCwgb3V0cHV0LCBmYWxzZSkuYXBwZW5kKCI7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChpbXBvcnRzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCJpbXBvcnQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJbXBvcnRSZWZlcmVuY2UgY3VycmVudEltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQkJaWYgKGN1cnJlbnRJbXBvcnQuaXNTdGF0aWMoKSkgewotCQkJCQlvdXRwdXQuYXBwZW5kKCJzdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY3VycmVudEltcG9ydC5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgiO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXR5cGVzW2ldLnByaW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qCi0JICogRm9yY2UgaW5uZXIgbG9jYWwgdHlwZXMgdG8gdXBkYXRlIHRoZWlyIGlubmVyY2xhc3MgZW11bGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGFnYXRlSW5uZXJFbXVsYXRpb25Gb3JBbGxMb2NhbFR5cGVzKCkgewotCi0JCWlzUHJvcGFnYXRpbmdJbm5lckNsYXNzRW11bGF0aW9uID0gdHJ1ZTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubG9jYWxUeXBlQ291bnQ7IGkgPCBtYXg7IGkrKykgewotCi0JCQlMb2NhbFR5cGVCaW5kaW5nIGxvY2FsVHlwZSA9IGxvY2FsVHlwZXNbaV07Ci0JCQkvLyBvbmx5IHByb3BhZ2F0ZSBmb3IgcmVhY2hhYmxlIGxvY2FsIHR5cGVzCi0JCQlpZiAoKGxvY2FsVHlwZS5zY29wZS5yZWZlcmVuY2VUeXBlKCkuYml0cyAmIElzUmVhY2hhYmxlKSAhPSAwKSB7Ci0JCQkJbG9jYWxUeXBlLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOwotCQkJfQorCQkgICAgTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUgPSB0aGlzLmxvY2FsVHlwZXNbaV07CisJCQkvLyBudWxsIG91dCB0aGUgdHlwZSdzIHNjb3BlIGJhY2twb2ludGVycworCQkJbG9jYWxUeXBlLnNjb3BlID0gbnVsbDsgLy8gbG9jYWwgbWVtYmVycyBhcmUgYWxyZWFkeSBpbiB0aGUgbGlzdAorCQkJbG9jYWxUeXBlLmVuY2xvc2luZ0Nhc2UgPSBudWxsOwogCQl9CiAJfQogCi0JcHVibGljIHZvaWQgcmVjb3JkU3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIGxpdGVyYWwpIHsKLQkJaWYgKHRoaXMuc3RyaW5nTGl0ZXJhbHMgPT0gbnVsbCkgewotCQkJdGhpcy5zdHJpbmdMaXRlcmFscyA9IG5ldyBTdHJpbmdMaXRlcmFsW1NUUklOR19MSVRFUkFMU19JTkNSRU1FTlRdOwotCQkJdGhpcy5zdHJpbmdMaXRlcmFsc1B0ciA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLnN0cmluZ0xpdGVyYWxzLmxlbmd0aDsKLQkJCWlmICh0aGlzLnN0cmluZ0xpdGVyYWxzUHRyID09IHN0YWNrTGVuZ3RoKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJdGhpcy5zdHJpbmdMaXRlcmFscywKLQkJCQkJMCwKLQkJCQkJdGhpcy5zdHJpbmdMaXRlcmFscyA9IG5ldyBTdHJpbmdMaXRlcmFsW3N0YWNrTGVuZ3RoICsgU1RSSU5HX0xJVEVSQUxTX0lOQ1JFTUVOVF0sCi0JCQkJCTAsCi0JCQkJCXN0YWNrTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnN0cmluZ0xpdGVyYWxzW3RoaXMuc3RyaW5nTGl0ZXJhbHNQdHIrK10gPSBsaXRlcmFsOworCXRoaXMuY29tcGlsYXRpb25SZXN1bHQucmVjb3ZlcnlTY2FubmVyRGF0YSA9IG51bGw7IC8vIHJlY292ZXJ5IGlzIGFscmVhZHkgZG9uZQorCisJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IHRoaXMuY29tcGlsYXRpb25SZXN1bHQuZ2V0Q2xhc3NGaWxlcygpOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBjbGFzc0ZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCS8vIGNsZWFyIHRoZSBjbGFzc0ZpbGUgYmFjayBwb2ludGVyIHRvIHRoZSBiaW5kaW5ncworCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gY2xhc3NGaWxlc1tpXTsKKwkJLy8gbnVsbCBvdXQgdGhlIGNsYXNzZmlsZSBiYWNrcG9pbnRlciB0byBhIHR5cGUgYmluZGluZworCQljbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZyA9IG51bGw7CisJCWNsYXNzRmlsZS5pbm5lckNsYXNzZXNCaW5kaW5ncyA9IG51bGw7CisJCWNsYXNzRmlsZS5taXNzaW5nVHlwZXMgPSBudWxsOworCQljbGFzc0ZpbGUudmlzaXRlZFR5cGVzID0gbnVsbDsKIAl9CiAKLQkvKgotCSAqIEtlZXAgdHJhY2sgb2YgYWxsIGxvY2FsIHR5cGVzLCBzbyBhcyB0byB1cGRhdGUgdGhlaXIgaW5uZXJjbGFzcwotCSAqIGVtdWxhdGlvbiBsYXRlciBvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvcmQoTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUpIHsKKwl0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zID0gbnVsbDsKK30KIAotCQlpZiAodGhpcy5sb2NhbFR5cGVDb3VudCA9PSAwKSB7Ci0JCQl0aGlzLmxvY2FsVHlwZXMgPSBuZXcgTG9jYWxUeXBlQmluZGluZ1s1XTsKLQkJfSBlbHNlIGlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID09IHRoaXMubG9jYWxUeXBlcy5sZW5ndGgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhbFR5cGVzLCAwLCAodGhpcy5sb2NhbFR5cGVzID0gbmV3IExvY2FsVHlwZUJpbmRpbmdbdGhpcy5sb2NhbFR5cGVDb3VudCAqIDJdKSwgMCwgdGhpcy5sb2NhbFR5cGVDb3VudCk7Ci0JCX0KLQkJdGhpcy5sb2NhbFR5cGVzW3RoaXMubG9jYWxUeXBlQ291bnQrK10gPSBsb2NhbFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKLQkJaW50IHN0YXJ0aW5nVHlwZUluZGV4ID0gMDsKLQkJYm9vbGVhbiBpc1BhY2thZ2VJbmZvID0gaXNQYWNrYWdlSW5mbygpOwotCQlpZiAodGhpcy50eXBlcyAhPSBudWxsICYmIGlzUGFja2FnZUluZm8pIHsKLQkJCS8vIHJlc29sdmUgc3ludGhldGljIHR5cGUgZGVjbGFyYXRpb24KLQkJCWZpbmFsIFR5cGVEZWNsYXJhdGlvbiBzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24gPSB0eXBlc1swXTsKLQkJCS8vIHNldCBlbXB0eSBqYXZhZG9jIHRvIGF2b2lkIG1pc3Npbmcgd2FybmluZyAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUyODYpCi0JCQlpZiAoc3ludGhldGljVHlwZURlY2xhcmF0aW9uLmphdmFkb2MgPT0gbnVsbCkgewotCQkJCXN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbi5qYXZhZG9jID0gbmV3IEphdmFkb2Moc3ludGhldGljVHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KTsKLQkJCX0KLQkJCXN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbi5yZXNvbHZlKHRoaXMuc2NvcGUpOwotCQkJLy8gcmVzb2x2ZSBhbm5vdGF0aW9ucyBpZiBhbnkKLQkJCWlmICh0aGlzLmN1cnJlbnRQYWNrYWdlIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRQYWNrYWdlLmFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCQlyZXNvbHZlQW5ub3RhdGlvbnMoc3ludGhldGljVHlwZURlY2xhcmF0aW9uLnN0YXRpY0luaXRpYWxpemVyU2NvcGUsIHRoaXMuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnMsIHRoaXMuc2NvcGUuZlBhY2thZ2UpOwotCQkJfQotCQkJLyoKLQkJCSAqIHJlc29sdmUgamF2YWRvYyBwYWNrYWdlIGlmIGFueQotCQkJICogd2UgZG8gaXQgbm93IGFuZCB0aGUgamF2YWRvYyBpbiB0aGUgZmFrZSB0eXBlIHdvbid0IGJlIHJlc29sdmVkCi0JCQkgKi8KLQkJCWlmICh0aGlzLmphdmFkb2MgIT0gbnVsbCkgewotCQkJCXRoaXMuamF2YWRvYy5yZXNvbHZlKHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbi5zdGF0aWNJbml0aWFsaXplclNjb3BlKTsKLQkJCX0KLQkJCXN0YXJ0aW5nVHlwZUluZGV4ID0gMTsKLQkJfSBlbHNlIHsKLQkJCS8vIHJlc29sdmUgY29tcGlsYXRpb24gdW5pdCBqYXZhZG9jIHBhY2thZ2UgaWYgYW55Ci0JCQlpZiAodGhpcy5qYXZhZG9jICE9IG51bGwpIHsKLQkJCQl0aGlzLmphdmFkb2MucmVzb2x2ZSh0aGlzLnNjb3BlKTsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5jdXJyZW50UGFja2FnZSAhPSBudWxsICYmIHRoaXMuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhaXNQYWNrYWdlSW5mbykgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpbGVOYW1lRm9yUGFja2FnZUFubm90YXRpb25zKHRoaXMuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnNbMF0pOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydGluZ1R5cGVJbmRleCwgY291bnQgPSB0eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCXR5cGVzW2ldLnJlc29sdmUoc2NvcGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghdGhpcy5jb21waWxhdGlvblJlc3VsdC5oYXNFcnJvcnMoKSkgY2hlY2tVbnVzZWRJbXBvcnRzKCk7Ci0JCQlyZXBvcnROTFNQcm9ibGVtcygpOwotCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7Ci0JCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKLQkJCXJldHVybjsKK3ByaXZhdGUgdm9pZCBjbGVhblVwKFR5cGVEZWNsYXJhdGlvbiB0eXBlKSB7CisJaWYgKHR5cGUubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZS5tZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQljbGVhblVwKHR5cGUubWVtYmVyVHlwZXNbaV0pOwogCQl9CiAJfQorCWlmICh0eXBlLmJpbmRpbmcgIT0gbnVsbCAmJiB0eXBlLmJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKQorCQl0aGlzLmNvbXBpbGF0aW9uUmVzdWx0Lmhhc0Fubm90YXRpb25zID0gdHJ1ZTsKKwlpZiAodHlwZS5iaW5kaW5nICE9IG51bGwpIHsKKwkJLy8gbnVsbCBvdXQgdGhlIHR5cGUncyBzY29wZSBiYWNrcG9pbnRlcnMKKwkJdHlwZS5iaW5kaW5nLnNjb3BlID0gbnVsbDsKKwl9Cit9CiAKLQlwcml2YXRlIHZvaWQgcmVwb3J0TkxTUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLm5sc1RhZ3MgIT0gbnVsbCB8fCB0aGlzLnN0cmluZ0xpdGVyYWxzICE9IG51bGwpIHsKLQkJCWZpbmFsIGludCBzdHJpbmdMaXRlcmFsc0xlbmd0aCA9IHRoaXMuc3RyaW5nTGl0ZXJhbHNQdHI7Ci0JCQlmaW5hbCBpbnQgbmxzVGFnc0xlbmd0aCA9IHRoaXMubmxzVGFncyA9PSBudWxsID8gMCA6IHRoaXMubmxzVGFncy5sZW5ndGg7Ci0JCQlpZiAoc3RyaW5nTGl0ZXJhbHNMZW5ndGggPT0gMCkgewotCQkJCWlmIChubHNUYWdzTGVuZ3RoICE9IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubHNUYWdzTGVuZ3RoOyBpKyspIHsKLQkJCQkJCU5MU1RhZyB0YWcgPSB0aGlzLm5sc1RhZ3NbaV07Ci0JCQkJCQlpZiAodGFnICE9IG51bGwpIHsKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeU5MU1RhZ3ModGFnLnN0YXJ0LCB0YWcuZW5kKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAobmxzVGFnc0xlbmd0aCA9PSAwKSB7Ci0JCQkJLy8gcmVzaXplIHN0cmluZyBsaXRlcmFscwotCQkJCWlmICh0aGlzLnN0cmluZ0xpdGVyYWxzLmxlbmd0aCAhPSBzdHJpbmdMaXRlcmFsc0xlbmd0aCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RyaW5nTGl0ZXJhbHMsIDAsIChzdHJpbmdMaXRlcmFscyA9IG5ldyBTdHJpbmdMaXRlcmFsW3N0cmluZ0xpdGVyYWxzTGVuZ3RoXSksIDAsIHN0cmluZ0xpdGVyYWxzTGVuZ3RoKTsKLQkJCQl9Ci0JCQkJQXJyYXlzLnNvcnQodGhpcy5zdHJpbmdMaXRlcmFscywgU1RSSU5HX0xJVEVSQUxfQ09NUEFSQVRPUik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdMaXRlcmFsc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwodGhpcy5zdHJpbmdMaXRlcmFsc1tpXSk7Ci0JCQkJfQorcHVibGljIHZvaWQgY2hlY2tVbnVzZWRJbXBvcnRzKCl7CisJaWYgKHRoaXMuc2NvcGUuaW1wb3J0cyAhPSBudWxsKXsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuc2NvcGUuaW1wb3J0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlJbXBvcnRCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSB0aGlzLnNjb3BlLmltcG9ydHNbaV07CisJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0QmluZGluZy5yZWZlcmVuY2U7CisJCQlpZiAoaW1wb3J0UmVmZXJlbmNlICE9IG51bGwgJiYgKChpbXBvcnRSZWZlcmVuY2UuYml0cyAmIEFTVE5vZGUuVXNlZCkgPT0gMCkpeworCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkSW1wb3J0KGltcG9ydFJlZmVyZW5jZSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3B1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCgpIHsKKwlyZXR1cm4gdGhpcy5jb21waWxhdGlvblJlc3VsdDsKK30KKworcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUluZm9UeXBlKCkgeworCVR5cGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblJlc3VsdCk7CisJZGVjbGFyYXRpb24ubmFtZSA9IFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUU7CisJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlOworCWRlY2xhcmF0aW9uLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7CisJdGhpcy50eXBlc1swXSA9IGRlY2xhcmF0aW9uOyAvLyBBc3N1bWVzIHRoZSBmaXJzdCBzbG90IGlzIG1lYW50IGZvciB0aGlzIHR5cGUKK30KKworLyoKKyAqIEZpbmRzIHRoZSBtYXRjaGluZyB0eXBlIGFtb3VuZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgdHlwZXMuCisgKiBSZXR1cm5zIG51bGwgaWYgbm8gdHlwZSB3aXRoIHRoaXMgbmFtZSBpcyBmb3VuZC4KKyAqIFRoZSB0eXBlIG5hbWUgaXMgYSBjb21wb3VuZCBuYW1lCisgKiBlLmcuIGlmIHdlJ3JlIGxvb2tpbmcgZm9yIFguQS5CIHRoZW4gYSB0eXBlIG5hbWUgd291bGQgYmUge1gsIEEsIEJ9CisgKi8KK3B1YmxpYyBUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb25PZlR5cGUoY2hhcltdW10gdHlwZU5hbWUpIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy50eXBlc1tpXS5kZWNsYXJhdGlvbk9mVHlwZSh0eXBlTmFtZSk7CisJCWlmICh0eXBlRGVjbCAhPSBudWxsKSB7CisJCQlyZXR1cm4gdHlwZURlY2w7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyB2b2lkIGZpbmFsaXplUHJvYmxlbXMoKSB7CisJaWYgKHRoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50ID09IDApIHJldHVybjsKKwlpbnQgcmVtb3ZlZCA9IDA7CisJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSB0aGlzLmNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1zOworCWludCBwcm9ibGVtQ291bnQgPSB0aGlzLmNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1Db3VudDsKKwlJcnJpdGFudFNldFtdIGZvdW5kSXJyaXRhbnRzID0gbmV3IElycml0YW50U2V0W3RoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50XTsKKwlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IHRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCk7CisJYm9vbGVhbiBoYXNNYW5kYXRvcnlFcnJvcnMgPSBmYWxzZTsKKwluZXh0UHJvYmxlbTogZm9yIChpbnQgaVByb2JsZW0gPSAwLCBsZW5ndGggPSBwcm9ibGVtQ291bnQ7IGlQcm9ibGVtIDwgbGVuZ3RoOyBpUHJvYmxlbSsrKSB7CisJCUNhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaVByb2JsZW1dOworCQlpbnQgcHJvYmxlbUlEID0gcHJvYmxlbS5nZXRJRCgpOworCQlpbnQgaXJyaXRhbnQgPSBQcm9ibGVtUmVwb3J0ZXIuZ2V0SXJyaXRhbnQocHJvYmxlbUlEKTsKKwkJYm9vbGVhbiBpc0Vycm9yID0gcHJvYmxlbS5pc0Vycm9yKCk7CisJCWlmIChpc0Vycm9yKSB7CisJCQlpZiAoaXJyaXRhbnQgPT0gMCkgeworCQkJCS8vIHRvbGVyYXRlIHVudXNlZCB3YXJuaW5nIHRva2VucyB3aGVuIG1hbmRhdG9yeSBlcnJvcnMKKwkJCQloYXNNYW5kYXRvcnlFcnJvcnMgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFvcHRpb25zLnN1cHByZXNzT3B0aW9uYWxFcnJvcnMpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpbnQgc3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7CisJCWludCBlbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOworCQluZXh0U3VwcHJlc3M6IGZvciAoaW50IGlTdXBwcmVzcyA9IDAsIHN1cHByZXNzQ291bnQgPSB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudDsgaVN1cHByZXNzIDwgc3VwcHJlc3NDb3VudDsgaVN1cHByZXNzKyspIHsKKwkJCWxvbmcgcG9zaXRpb24gPSB0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zW2lTdXBwcmVzc107CisJCQlpbnQgc3RhcnRTdXBwcmVzcyA9IChpbnQpIChwb3NpdGlvbiA+Pj4gMzIpOworCQkJaW50IGVuZFN1cHByZXNzID0gKGludCkgcG9zaXRpb247CisJCQlpZiAoc3RhcnQgPCBzdGFydFN1cHByZXNzKSBjb250aW51ZSBuZXh0U3VwcHJlc3M7CisJCQlpZiAoZW5kID4gZW5kU3VwcHJlc3MpIGNvbnRpbnVlIG5leHRTdXBwcmVzczsKKwkJCWlmICghdGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHNbaVN1cHByZXNzXS5pc1NldChpcnJpdGFudCkpCisJCQkJY29udGludWUgbmV4dFN1cHByZXNzOworCQkJLy8gZGlzY2FyZCBzdXBwcmVzc2VkIHdhcm5pbmcKKwkJCXJlbW92ZWQrKzsKKwkJCXByb2JsZW1zW2lQcm9ibGVtXSA9IG51bGw7CisJCQl0aGlzLmNvbXBpbGF0aW9uUmVzdWx0LnJlbW92ZVByb2JsZW0ocHJvYmxlbSk7CisJCQlpZiAoZm91bmRJcnJpdGFudHNbaVN1cHByZXNzXSA9PSBudWxsKXsKKwkJCQlmb3VuZElycml0YW50c1tpU3VwcHJlc3NdID0gbmV3IElycml0YW50U2V0KGlycml0YW50KTsKIAkJCX0gZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byBpdGVyYXRlIGJvdGggYXJyYXlzIHRvIGZpbmQgbm9uIG1hdGNoaW5nIGVsZW1lbnRzCi0JCQkJaWYgKHRoaXMuc3RyaW5nTGl0ZXJhbHMubGVuZ3RoICE9IHN0cmluZ0xpdGVyYWxzTGVuZ3RoKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdHJpbmdMaXRlcmFscywgMCwgKHN0cmluZ0xpdGVyYWxzID0gbmV3IFN0cmluZ0xpdGVyYWxbc3RyaW5nTGl0ZXJhbHNMZW5ndGhdKSwgMCwgc3RyaW5nTGl0ZXJhbHNMZW5ndGgpOworCQkJCWZvdW5kSXJyaXRhbnRzW2lTdXBwcmVzc10uc2V0KGlycml0YW50KTsKKwkJCX0KKwkJCWNvbnRpbnVlIG5leHRQcm9ibGVtOworCQl9CisJfQorCS8vIGNvbXBhY3QgcmVtYWluaW5nIHByb2JsZW1zCisJaWYgKHJlbW92ZWQgPiAwKSB7CisJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBwcm9ibGVtQ291bnQ7IGkrKykgeworCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW07CisJCQlpZiAoKHByb2JsZW0gPSBwcm9ibGVtc1tpXSkgIT0gbnVsbCkgeworCQkJCWlmIChpID4gaW5kZXgpIHsKKwkJCQkJcHJvYmxlbXNbaW5kZXgrK10gPSBwcm9ibGVtOworCQkJCX0gZWxzZSB7CisJCQkJCWluZGV4Kys7CiAJCQkJfQotCQkJCUFycmF5cy5zb3J0KHRoaXMuc3RyaW5nTGl0ZXJhbHMsIFNUUklOR19MSVRFUkFMX0NPTVBBUkFUT1IpOwotCQkJCWludCBpbmRleEluTGluZSA9IDE7Ci0JCQkJaW50IGxhc3RMaW5lTnVtYmVyID0gLTE7Ci0JCQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gbnVsbDsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWludCBpID0gMDsKLQkJCQlzdHJpbmdMaXRlcmFsc0xvb3A6IGZvciAoOyBpIDwgc3RyaW5nTGl0ZXJhbHNMZW5ndGg7IGkrKykgewotCQkJCQlsaXRlcmFsID0gdGhpcy5zdHJpbmdMaXRlcmFsc1tpXTsKLQkJCQkJZmluYWwgaW50IGxpdGVyYWxMaW5lTnVtYmVyID0gbGl0ZXJhbC5saW5lTnVtYmVyOwotCQkJCQlpZiAobGFzdExpbmVOdW1iZXIgIT0gbGl0ZXJhbExpbmVOdW1iZXIpIHsKLQkJCQkJCWluZGV4SW5MaW5lID0gMTsKLQkJCQkJCWxhc3RMaW5lTnVtYmVyID0gbGl0ZXJhbExpbmVOdW1iZXI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbmRleEluTGluZSsrOwotCQkJCQl9Ci0JCQkJCWlmIChpbmRleCA8IG5sc1RhZ3NMZW5ndGgpIHsKLQkJCQkJCW5sc1RhZ3NMb29wOiBmb3IgKDsgaW5kZXggPCBubHNUYWdzTGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJTkxTVGFnIHRhZyA9IHRoaXMubmxzVGFnc1tpbmRleF07Ci0JCQkJCQkJaWYgKHRhZyA9PSBudWxsKSBjb250aW51ZSBubHNUYWdzTG9vcDsKLQkJCQkJCQlpbnQgdGFnTGluZU51bWJlciA9IHRhZy5saW5lTnVtYmVyOwotCQkJCQkJCWlmIChsaXRlcmFsTGluZU51bWJlciA8IHRhZ0xpbmVOdW1iZXIpIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbChsaXRlcmFsKTsKLQkJCQkJCQkJY29udGludWUgc3RyaW5nTGl0ZXJhbHNMb29wOwotCQkJCQkJCX0gZWxzZSBpZiAobGl0ZXJhbExpbmVOdW1iZXIgPT0gdGFnTGluZU51bWJlcikgewotCQkJCQkJCQlpZiAodGFnLmluZGV4ID09IGluZGV4SW5MaW5lKSB7Ci0JCQkJCQkJCQl0aGlzLm5sc1RhZ3NbaW5kZXhdID0gbnVsbDsKLQkJCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJCQljb250aW51ZSBzdHJpbmdMaXRlcmFsc0xvb3A7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlubHNUYWdzTG9vcDI6IGZvciAoaW50IGluZGV4MiA9IGluZGV4ICsgMTsgaW5kZXgyIDwgbmxzVGFnc0xlbmd0aDsgaW5kZXgyKyspIHsKLQkJCQkJCQkJCQlOTFNUYWcgdGFnMiA9IHRoaXMubmxzVGFnc1tpbmRleDJdOwotCQkJCQkJCQkJCWlmICh0YWcyID09IG51bGwpIGNvbnRpbnVlIG5sc1RhZ3NMb29wMjsKLQkJCQkJCQkJCQlpbnQgdGFnTGluZU51bWJlcjIgPSB0YWcyLmxpbmVOdW1iZXI7Ci0JCQkJCQkJCQkJaWYgKGxpdGVyYWxMaW5lTnVtYmVyID09IHRhZ0xpbmVOdW1iZXIyKSB7Ci0JCQkJCQkJCQkJCWlmICh0YWcyLmluZGV4ID09IGluZGV4SW5MaW5lKSB7Ci0JCQkJCQkJCQkJCQl0aGlzLm5sc1RhZ3NbaW5kZXgyXSA9IG51bGw7Ci0JCQkJCQkJCQkJCQljb250aW51ZSBzdHJpbmdMaXRlcmFsc0xvb3A7Ci0JCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQljb250aW51ZSBubHNUYWdzTG9vcDI7CisJCQl9CisJCX0KKwl9CisJLy8gZmxhZyBTdXBwcmVzc1dhcm5pbmdzIHdoaWNoIGhhZCBubyBlZmZlY3QgKG9ubHkgaWYgbm8gKG1hbmRhdG9yeSkgZXJyb3IgZ290IGRldGVjdGVkIHdpdGhpbiB1bml0CisJaWYgKCFoYXNNYW5kYXRvcnlFcnJvcnMpIHsKKwkJaW50IHNldmVyaXR5ID0gb3B0aW9ucy5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuVW51c2VkV2FybmluZ1Rva2VuKTsKKwkJaWYgKHNldmVyaXR5ICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgeworCQkJYm9vbGVhbiB1bnVzZWRXYXJuaW5nVG9rZW5Jc1dhcm5pbmcgPSAoc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcikgPT0gMDsKKwkJCWZvciAoaW50IGlTdXBwcmVzcyA9IDAsIHN1cHByZXNzQ291bnQgPSB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudDsgaVN1cHByZXNzIDwgc3VwcHJlc3NDb3VudDsgaVN1cHByZXNzKyspIHsKKwkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zW2lTdXBwcmVzc107CisJCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgY29udGludWU7IC8vIGltcGxpY2l0IGFubm90YXRpb24KKwkJCQlJcnJpdGFudFNldCBpcnJpdGFudHMgPSB0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50c1tpU3VwcHJlc3NdOworCQkJCWlmICh1bnVzZWRXYXJuaW5nVG9rZW5Jc1dhcm5pbmcgJiYgaXJyaXRhbnRzLmFyZUFsbFNldCgpKSBjb250aW51ZTsgLy8gQFN1cHByZXNzV2FybmluZ3MoImFsbCIpIGFsc28gc3VwcHJlc3NlcyB1bnVzZWQgd2FybmluZyB0b2tlbgorCQkJCWlmIChpcnJpdGFudHMgIT0gZm91bmRJcnJpdGFudHNbaVN1cHByZXNzXSkgeyAvLyBtaXNtYXRjaCwgc29tZSB3YXJuaW5nIHRva2VucyB3ZXJlIHVudXNlZAorCQkJCQlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycygpOworCQkJCQlwYWlyTG9vcDogZm9yIChpbnQgaVBhaXIgPSAwLCBwYWlyQ291bnQgPSBwYWlycy5sZW5ndGg7IGlQYWlyIDwgcGFpckNvdW50OyBpUGFpcisrKSB7CisJCQkJCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHBhaXJzW2lQYWlyXTsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwYWlyLm5hbWUsIFR5cGVDb25zdGFudHMuVkFMVUUpKSB7CisJCQkJCQkJRXhwcmVzc2lvbiB2YWx1ZSA9IHBhaXIudmFsdWU7CisJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikgeworCQkJCQkJCQlBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEFycmF5SW5pdGlhbGl6ZXIpIHZhbHVlOworCQkJCQkJCQlFeHByZXNzaW9uW10gaW5pdHMgPSBpbml0aWFsaXplci5leHByZXNzaW9uczsKKwkJCQkJCQkJaWYgKGluaXRzICE9IG51bGwpIHsKKwkJCQkJCQkJCWZvciAoaW50IGlUb2tlbiA9IDAsIHRva2VuQ291bnQgPSBpbml0cy5sZW5ndGg7IGlUb2tlbiA8IHRva2VuQ291bnQ7IGlUb2tlbisrKSB7CisJCQkJCQkJCQkJQ29uc3RhbnQgY3N0ID0gaW5pdHNbaVRva2VuXS5jb25zdGFudDsKKwkJCQkJCQkJCQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QudHlwZUlEKCkgPT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7CisJCQkJCQkJCQkJCUlycml0YW50U2V0IHRva2VuSXJyaXRhbnRzID0gQ29tcGlsZXJPcHRpb25zLndhcm5pbmdUb2tlblRvSXJyaXRhbnRzKGNzdC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJCQkJCQkJaWYgKHRva2VuSXJyaXRhbnRzICE9IG51bGwKKwkJCQkJCQkJCQkJCQkmJiAhdG9rZW5JcnJpdGFudHMuYXJlQWxsU2V0KCkgLy8gbm8gY29tcGxhaW50IGFnYWluc3QgQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCisJCQkJCQkJCQkJCQkJJiYgb3B0aW9ucy5pc0FueUVuYWJsZWQodG9rZW5JcnJpdGFudHMpIC8vIGlmIGlycml0YW50IGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQKKwkJCQkJCQkJCQkJCQkmJiAoZm91bmRJcnJpdGFudHNbaVN1cHByZXNzXSA9PSBudWxsIHx8ICFmb3VuZElycml0YW50c1tpU3VwcHJlc3NdLmlzQW55U2V0KHRva2VuSXJyaXRhbnRzKSkpIHsgLy8gaWYgaXJyaXRhbnQgaGFkIG5vIG1hdGNoaW5nIHByb2JsZW0KKwkJCQkJCQkJCQkJCWlmICh1bnVzZWRXYXJuaW5nVG9rZW5Jc1dhcm5pbmcpIHsKKwkJCQkJCQkJCQkJCQlpbnQgc3RhcnQgPSB2YWx1ZS5zb3VyY2VTdGFydCwgZW5kID0gdmFsdWUuc291cmNlRW5kOworCQkJCQkJCQkJCQkJCW5leHRTdXBwcmVzczogZm9yIChpbnQgalN1cHByZXNzID0gaVN1cHByZXNzIC0gMTsgalN1cHByZXNzID49IDA7IGpTdXBwcmVzcy0tKSB7CisJCQkJCQkJCQkJCQkJCWxvbmcgcG9zaXRpb24gPSB0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zW2pTdXBwcmVzc107CisJCQkJCQkJCQkJCQkJCWludCBzdGFydFN1cHByZXNzID0gKGludCkgKHBvc2l0aW9uID4+PiAzMik7CisJCQkJCQkJCQkJCQkJCWludCBlbmRTdXBwcmVzcyA9IChpbnQpIHBvc2l0aW9uOworCQkJCQkJCQkJCQkJCQlpZiAoc3RhcnQgPCBzdGFydFN1cHByZXNzKSBjb250aW51ZSBuZXh0U3VwcHJlc3M7CisJCQkJCQkJCQkJCQkJCWlmIChlbmQgPiBlbmRTdXBwcmVzcykgY29udGludWUgbmV4dFN1cHByZXNzOworCQkJCQkJCQkJCQkJCQlpZiAodGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHNbalN1cHByZXNzXS5hcmVBbGxTZXQoKSkgYnJlYWsgcGFpckxvb3A7IC8vIHN1cHByZXNzIGFsbD8KKwkJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZFdhcm5pbmdUb2tlbihpbml0c1tpVG9rZW5dKTsKIAkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwobGl0ZXJhbCk7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIHN0cmluZ0xpdGVyYWxzTG9vcDsKIAkJCQkJCQkJCQl9CiAJCQkJCQkJCQl9Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKGxpdGVyYWwpOwotCQkJCQkJCQkJY29udGludWUgc3RyaW5nTGl0ZXJhbHNMb29wOwogCQkJCQkJCQl9CiAJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlOTFNUYWdzKHRhZy5zdGFydCwgdGFnLmVuZCk7Ci0JCQkJCQkJCWNvbnRpbnVlIG5sc1RhZ3NMb29wOworCQkJCQkJCQlDb25zdGFudCBjc3QgPSB2YWx1ZS5jb25zdGFudDsKKwkJCQkJCQkJaWYgKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LnR5cGVJRCgpID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKKwkJCQkJCQkJCUlycml0YW50U2V0IHRva2VuSXJyaXRhbnRzID0gQ29tcGlsZXJPcHRpb25zLndhcm5pbmdUb2tlblRvSXJyaXRhbnRzKGNzdC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJCQkJCWlmICh0b2tlbklycml0YW50cyAhPSBudWxsCisJCQkJCQkJCQkJCSYmICF0b2tlbklycml0YW50cy5hcmVBbGxTZXQoKSAvLyBubyBjb21wbGFpbnQgYWdhaW5zdCBAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKKwkJCQkJCQkJCQkJJiYgb3B0aW9ucy5pc0FueUVuYWJsZWQodG9rZW5JcnJpdGFudHMpIC8vIGlmIGlycml0YW50IGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQKKwkJCQkJCQkJCQkJJiYgKGZvdW5kSXJyaXRhbnRzW2lTdXBwcmVzc10gPT0gbnVsbCB8fCAhZm91bmRJcnJpdGFudHNbaVN1cHByZXNzXS5pc0FueVNldCh0b2tlbklycml0YW50cykpKSB7IC8vIGlmIGlycml0YW50IGhhZCBubyBtYXRjaGluZyBwcm9ibGVtCisJCQkJCQkJCQkJaWYgKHVudXNlZFdhcm5pbmdUb2tlbklzV2FybmluZykgeworCQkJCQkJCQkJCQlpbnQgc3RhcnQgPSB2YWx1ZS5zb3VyY2VTdGFydCwgZW5kID0gdmFsdWUuc291cmNlRW5kOworCQkJCQkJCQkJCQluZXh0U3VwcHJlc3M6IGZvciAoaW50IGpTdXBwcmVzcyA9IGlTdXBwcmVzcyAtIDE7IGpTdXBwcmVzcyA+PSAwOyBqU3VwcHJlc3MtLSkgeworCQkJCQkJCQkJCQkJbG9uZyBwb3NpdGlvbiA9IHRoaXMuc3VwcHJlc3NXYXJuaW5nU2NvcGVQb3NpdGlvbnNbalN1cHByZXNzXTsKKwkJCQkJCQkJCQkJCWludCBzdGFydFN1cHByZXNzID0gKGludCkgKHBvc2l0aW9uID4+PiAzMik7CisJCQkJCQkJCQkJCQlpbnQgZW5kU3VwcHJlc3MgPSAoaW50KSBwb3NpdGlvbjsKKwkJCQkJCQkJCQkJCWlmIChzdGFydCA8IHN0YXJ0U3VwcHJlc3MpIGNvbnRpbnVlIG5leHRTdXBwcmVzczsKKwkJCQkJCQkJCQkJCWlmIChlbmQgPiBlbmRTdXBwcmVzcykgY29udGludWUgbmV4dFN1cHByZXNzOworCQkJCQkJCQkJCQkJaWYgKHRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzW2pTdXBwcmVzc10uYXJlQWxsU2V0KCkpIGJyZWFrIHBhaXJMb29wOyAvLyBzdXBwcmVzcyBhbGw/CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRXYXJuaW5nVG9rZW4odmFsdWUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CiAJCQkJCQkJfQorCQkJCQkJCWJyZWFrIHBhaXJMb29wOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCS8vIGFsbCBubHMgdGFncyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBzbyByZW1haW5pbmcgc3RyaW5nIGxpdGVyYWxzIGFyZSBub3QgZXh0ZXJuYWxpemVkCi0JCQkJCWJyZWFrIHN0cmluZ0xpdGVyYWxzTG9vcDsKIAkJCQl9Ci0JCQkJZm9yICg7IGkgPCBzdHJpbmdMaXRlcmFsc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwodGhpcy5zdHJpbmdMaXRlcmFsc1tpXSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogQnl0ZWNvZGUgZ2VuZXJhdGlvbgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoKSB7CisJaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJaWYgKHRoaXMudHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy50eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJdGhpcy50eXBlc1tpXS5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCQkJLy8gcHJvcGFnYXRlIHRoZSBmbGFnIHRvIHJlcXVlc3QgcHJvYmxlbSB0eXBlIGNyZWF0aW9uCisJCQkJdGhpcy50eXBlc1tpXS5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKwl0cnkgeworCQlpZiAodGhpcy50eXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLnR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspCisJCQkJdGhpcy50eXBlc1tpXS5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSk7CisJCX0KKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7CisJCS8vIGlnbm9yZQorCX0KK30KKworcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5jb21waWxhdGlvblJlc3VsdC5nZXRGaWxlTmFtZSgpOworfQorCitwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwlpZiAodGhpcy5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQgPT0gbnVsbCkgeworCQljaGFyW10gZmlsZU5hbWUgPSB0aGlzLmNvbXBpbGF0aW9uUmVzdWx0LmdldEZpbGVOYW1lKCk7CisKKwkJaW50IHN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIGZpbGVOYW1lKSArIDE7CisJCWlmIChzdGFydCA9PSAwIHx8IHN0YXJ0IDwgQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignXFwnLCBmaWxlTmFtZSkpCisJCQlzdGFydCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJ1xcJywgZmlsZU5hbWUpICsgMTsKKworCQlpbnQgZW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIGZpbGVOYW1lKTsKKwkJaWYgKGVuZCA9PSAtMSkKKwkJCWVuZCA9IGZpbGVOYW1lLmxlbmd0aDsKKworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmaWxlTmFtZSwgc3RhcnQsIGVuZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpOworCX0KK30KKworcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwlyZXR1cm4gKHRoaXMuY3VycmVudFBhY2thZ2UgPT0gbnVsbCkgJiYgKHRoaXMuaW1wb3J0cyA9PSBudWxsKSAmJiAodGhpcy50eXBlcyA9PSBudWxsKTsKK30KKworcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlSW5mbygpIHsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5lcXVhbHMoZ2V0TWFpblR5cGVOYW1lKCksIFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUUpOworfQorCitwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CisJcmV0dXJuIHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb247Cit9CisKK3B1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCWlmICh0aGlzLmN1cnJlbnRQYWNrYWdlICE9IG51bGwpIHsKKwkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgicGFja2FnZSAiKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmN1cnJlbnRQYWNrYWdlLnByaW50KDAsIG91dHB1dCwgZmFsc2UpLmFwcGVuZCgiO1xuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKHRoaXMuaW1wb3J0cyAhPSBudWxsKQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW1wb3J0cy5sZW5ndGg7IGkrKykgeworCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiaW1wb3J0ICIpOyAvLyROT04tTkxTLTEkCisJCQlJbXBvcnRSZWZlcmVuY2UgY3VycmVudEltcG9ydCA9IHRoaXMuaW1wb3J0c1tpXTsKKwkJCWlmIChjdXJyZW50SW1wb3J0LmlzU3RhdGljKCkpIHsKKwkJCQlvdXRwdXQuYXBwZW5kKCJzdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWN1cnJlbnRJbXBvcnQucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIjtcbiIpOyAvLyROT04tTkxTLTEkCisJCX0KKworCWlmICh0aGlzLnR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLnR5cGVzW2ldLnByaW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlyZXR1cm4gb3V0cHV0OworfQorCisvKgorICogRm9yY2UgaW5uZXIgbG9jYWwgdHlwZXMgdG8gdXBkYXRlIHRoZWlyIGlubmVyY2xhc3MgZW11bGF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIHByb3BhZ2F0ZUlubmVyRW11bGF0aW9uRm9yQWxsTG9jYWxUeXBlcygpIHsKKwl0aGlzLmlzUHJvcGFnYXRpbmdJbm5lckNsYXNzRW11bGF0aW9uID0gdHJ1ZTsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5sb2NhbFR5cGVDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gdGhpcy5sb2NhbFR5cGVzW2ldOworCQkvLyBvbmx5IHByb3BhZ2F0ZSBmb3IgcmVhY2hhYmxlIGxvY2FsIHR5cGVzCisJCWlmICgobG9jYWxUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5iaXRzICYgSXNSZWFjaGFibGUpICE9IDApIHsKKwkJCWxvY2FsVHlwZS51cGRhdGVJbm5lckVtdWxhdGlvbkRlcGVuZGVudHMoKTsKKwkJfQorCX0KK30KKworcHVibGljIHZvaWQgcmVjb3JkU3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIGxpdGVyYWwsIGJvb2xlYW4gZnJvbVJlY292ZXJ5KSB7CisJaWYgKHRoaXMuc3RyaW5nTGl0ZXJhbHNTdGFydCAhPSBudWxsKSB7CisJCWlmICh0aGlzLnN0cmluZ0xpdGVyYWxzU3RhcnQuY29udGFpbnMobGl0ZXJhbC5zb3VyY2VTdGFydCkpIHJldHVybjsKKwkJdGhpcy5zdHJpbmdMaXRlcmFsc1N0YXJ0LmFkZChsaXRlcmFsLnNvdXJjZVN0YXJ0KTsKKwl9IGVsc2UgaWYgKGZyb21SZWNvdmVyeSkgeworCQl0aGlzLnN0cmluZ0xpdGVyYWxzU3RhcnQgPSBuZXcgSGFzaFNldE9mSW50KHRoaXMuc3RyaW5nTGl0ZXJhbHNQdHIgKyBTVFJJTkdfTElURVJBTFNfSU5DUkVNRU5UKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnN0cmluZ0xpdGVyYWxzUHRyOyBpKyspIHsKKwkJCXRoaXMuc3RyaW5nTGl0ZXJhbHNTdGFydC5hZGQodGhpcy5zdHJpbmdMaXRlcmFsc1tpXS5zb3VyY2VTdGFydCk7CisJCX0KKworCQlpZiAodGhpcy5zdHJpbmdMaXRlcmFsc1N0YXJ0LmNvbnRhaW5zKGxpdGVyYWwuc291cmNlU3RhcnQpKSByZXR1cm47CisJCXRoaXMuc3RyaW5nTGl0ZXJhbHNTdGFydC5hZGQobGl0ZXJhbC5zb3VyY2VTdGFydCk7CisJfQorCisJaWYgKHRoaXMuc3RyaW5nTGl0ZXJhbHMgPT0gbnVsbCkgeworCQl0aGlzLnN0cmluZ0xpdGVyYWxzID0gbmV3IFN0cmluZ0xpdGVyYWxbU1RSSU5HX0xJVEVSQUxTX0lOQ1JFTUVOVF07CisJCXRoaXMuc3RyaW5nTGl0ZXJhbHNQdHIgPSAwOworCX0gZWxzZSB7CisJCWludCBzdGFja0xlbmd0aCA9IHRoaXMuc3RyaW5nTGl0ZXJhbHMubGVuZ3RoOworCQlpZiAodGhpcy5zdHJpbmdMaXRlcmFsc1B0ciA9PSBzdGFja0xlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnN0cmluZ0xpdGVyYWxzLAorCQkJCTAsCisJCQkJdGhpcy5zdHJpbmdMaXRlcmFscyA9IG5ldyBTdHJpbmdMaXRlcmFsW3N0YWNrTGVuZ3RoICsgU1RSSU5HX0xJVEVSQUxTX0lOQ1JFTUVOVF0sCisJCQkJMCwKKwkJCQlzdGFja0xlbmd0aCk7CisJCX0KKwl9CisJdGhpcy5zdHJpbmdMaXRlcmFsc1t0aGlzLnN0cmluZ0xpdGVyYWxzUHRyKytdID0gbGl0ZXJhbDsKK30KKworcHVibGljIHZvaWQgcmVjb3JkU3VwcHJlc3NXYXJuaW5ncyhJcnJpdGFudFNldCBpcnJpdGFudHMsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgaW50IHNjb3BlU3RhcnQsIGludCBzY29wZUVuZCkgeworCWlmICh0aGlzLnN1cHByZXNzV2FybmluZ0lycml0YW50cyA9PSBudWxsKSB7CisJCXRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID0gbmV3IElycml0YW50U2V0WzNdOworCQl0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bM107CisJCXRoaXMuc3VwcHJlc3NXYXJuaW5nU2NvcGVQb3NpdGlvbnMgPSBuZXcgbG9uZ1szXTsKKwl9IGVsc2UgaWYgKHRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzLmxlbmd0aCA9PSB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzLCAwLHRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzID0gbmV3IElycml0YW50U2V0WzIqdGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnRdLCAwLCB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudCk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdXBwcmVzc1dhcm5pbmdBbm5vdGF0aW9ucywgMCx0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bMip0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudF0sIDAsIHRoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50KTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zLCAwLHRoaXMuc3VwcHJlc3NXYXJuaW5nU2NvcGVQb3NpdGlvbnMgPSBuZXcgbG9uZ1syKnRoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50XSwgMCwgdGhpcy5zdXBwcmVzc1dhcm5pbmdzQ291bnQpOworCX0KKwlmaW5hbCBsb25nIHNjb3BlUG9zaXRpb25zID0gKChsb25nKXNjb3BlU3RhcnQ8PDMyKSArIHNjb3BlRW5kOworCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCWlmICh0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zW2ldID09IGFubm90YXRpb24KKwkJCQkmJiB0aGlzLnN1cHByZXNzV2FybmluZ1Njb3BlUG9zaXRpb25zW2ldID09IHNjb3BlUG9zaXRpb25zCisJCQkJJiYgdGhpcy5zdXBwcmVzc1dhcm5pbmdJcnJpdGFudHNbaV0uaGFzU2FtZUlycml0YW50cyhpcnJpdGFudHMpKSB7CisJCQkvLyBhbm5vdGF0aW9uIGRhdGEgYWxyZWFkeSByZWNvcmRlZAorCQkJcmV0dXJuOworCQl9CisJfQorCXRoaXMuc3VwcHJlc3NXYXJuaW5nSXJyaXRhbnRzW3RoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50XSA9IGlycml0YW50czsKKwl0aGlzLnN1cHByZXNzV2FybmluZ0Fubm90YXRpb25zW3RoaXMuc3VwcHJlc3NXYXJuaW5nc0NvdW50XSA9IGFubm90YXRpb247CisJdGhpcy5zdXBwcmVzc1dhcm5pbmdTY29wZVBvc2l0aW9uc1t0aGlzLnN1cHByZXNzV2FybmluZ3NDb3VudCsrXSA9IHNjb3BlUG9zaXRpb25zOworfQorCisvKgorICogS2VlcCB0cmFjayBvZiBhbGwgbG9jYWwgdHlwZXMsIHNvIGFzIHRvIHVwZGF0ZSB0aGVpciBpbm5lcmNsYXNzCisgKiBlbXVsYXRpb24gbGF0ZXIgb24uCisgKi8KK3B1YmxpYyB2b2lkIHJlY29yZChMb2NhbFR5cGVCaW5kaW5nIGxvY2FsVHlwZSkgeworCWlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID09IDApIHsKKwkJdGhpcy5sb2NhbFR5cGVzID0gbmV3IExvY2FsVHlwZUJpbmRpbmdbNV07CisJfSBlbHNlIGlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID09IHRoaXMubG9jYWxUeXBlcy5sZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmxvY2FsVHlwZXMsIDAsICh0aGlzLmxvY2FsVHlwZXMgPSBuZXcgTG9jYWxUeXBlQmluZGluZ1t0aGlzLmxvY2FsVHlwZUNvdW50ICogMl0pLCAwLCB0aGlzLmxvY2FsVHlwZUNvdW50KTsKKwl9CisJdGhpcy5sb2NhbFR5cGVzW3RoaXMubG9jYWxUeXBlQ291bnQrK10gPSBsb2NhbFR5cGU7Cit9CisKK3B1YmxpYyB2b2lkIHJlc29sdmUoKSB7CisJaW50IHN0YXJ0aW5nVHlwZUluZGV4ID0gMDsKKwlib29sZWFuIGlzUGFja2FnZUluZm8gPSBpc1BhY2thZ2VJbmZvKCk7CisJaWYgKHRoaXMudHlwZXMgIT0gbnVsbCAmJiBpc1BhY2thZ2VJbmZvKSB7CisJCS8vIHJlc29sdmUgc3ludGhldGljIHR5cGUgZGVjbGFyYXRpb24KKwkJZmluYWwgVHlwZURlY2xhcmF0aW9uIHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZXNbMF07CisJCS8vIHNldCBlbXB0eSBqYXZhZG9jIHRvIGF2b2lkIG1pc3Npbmcgd2FybmluZyAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUyODYpCisJCWlmIChzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uamF2YWRvYyA9PSBudWxsKSB7CisJCQlzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uamF2YWRvYyA9IG5ldyBKYXZhZG9jKHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCk7CisJCX0KKwkJc3ludGhldGljVHlwZURlY2xhcmF0aW9uLnJlc29sdmUodGhpcy5zY29wZSk7CisJCS8qCisJCSAqIHJlc29sdmUgamF2YWRvYyBwYWNrYWdlIGlmIGFueSwgc2tpcCB0aGlzIHN0ZXAgaWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIHNjb3BlIGR1ZSB0byBhbiBlYXJsaWVyIGVycm9yIChidWcgMjUyNTU1KQorCQkgKiB3ZSBkbyBpdCBub3cgYXMgdGhlIGphdmFkb2MgaW4gdGhlIGZha2UgdHlwZSB3b24ndCBiZSByZXNvbHZlZC4gVGhlIHBlY3VsaWFyIHVzYWdlIG9mIE1ldGhvZFNjb3BlIHRvIHJlc29sdmUgdGhlCisJCSAqIHBhY2thZ2UgbGV2ZWwgamF2YWRvYyBpcyBiZWNhdXNlIHRoZSBDVSBsZXZlbCByZXNvbHZlIG1ldGhvZAlpcyBhIE5PUCB0byBtaW1pYyBKYXZhZG9jJ3MgYmVoYXZpb3IgYW5kIGNhbid0IGJlIHVzZWQKKwkJICogYXMgc3VjaC4KKwkJICovCisJCWlmICh0aGlzLmphdmFkb2MgIT0gbnVsbCAmJiBzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uc3RhdGljSW5pdGlhbGl6ZXJTY29wZSAhPSBudWxsKSB7CisJCQl0aGlzLmphdmFkb2MucmVzb2x2ZShzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uc3RhdGljSW5pdGlhbGl6ZXJTY29wZSk7CisJCX0KKwkJc3RhcnRpbmdUeXBlSW5kZXggPSAxOworCX0gZWxzZSB7CisJCS8vIHJlc29sdmUgY29tcGlsYXRpb24gdW5pdCBqYXZhZG9jIHBhY2thZ2UgaWYgYW55CisJCWlmICh0aGlzLmphdmFkb2MgIT0gbnVsbCkgeworCQkJdGhpcy5qYXZhZG9jLnJlc29sdmUodGhpcy5zY29wZSk7CisJCX0KKwl9CisJaWYgKHRoaXMuY3VycmVudFBhY2thZ2UgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRQYWNrYWdlLmFubm90YXRpb25zICE9IG51bGwgJiYgIWlzUGFja2FnZUluZm8pIHsKKwkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmlsZU5hbWVGb3JQYWNrYWdlQW5ub3RhdGlvbnModGhpcy5jdXJyZW50UGFja2FnZS5hbm5vdGF0aW9uc1swXSk7CisJfQorCXRyeSB7CisJCWlmICh0aGlzLnR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSBzdGFydGluZ1R5cGVJbmRleCwgY291bnQgPSB0aGlzLnR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQl0aGlzLnR5cGVzW2ldLnJlc29sdmUodGhpcy5zY29wZSk7CisJCQl9CisJCX0KKwkJaWYgKCF0aGlzLmNvbXBpbGF0aW9uUmVzdWx0Lmhhc0Vycm9ycygpKSBjaGVja1VudXNlZEltcG9ydHMoKTsKKwkJcmVwb3J0TkxTUHJvYmxlbXMoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7CisJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQlyZXR1cm47CisJfQorfQorCitwcml2YXRlIHZvaWQgcmVwb3J0TkxTUHJvYmxlbXMoKSB7CisJaWYgKHRoaXMubmxzVGFncyAhPSBudWxsIHx8IHRoaXMuc3RyaW5nTGl0ZXJhbHMgIT0gbnVsbCkgeworCQlmaW5hbCBpbnQgc3RyaW5nTGl0ZXJhbHNMZW5ndGggPSB0aGlzLnN0cmluZ0xpdGVyYWxzUHRyOworCQlmaW5hbCBpbnQgbmxzVGFnc0xlbmd0aCA9IHRoaXMubmxzVGFncyA9PSBudWxsID8gMCA6IHRoaXMubmxzVGFncy5sZW5ndGg7CisJCWlmIChzdHJpbmdMaXRlcmFsc0xlbmd0aCA9PSAwKSB7CisJCQlpZiAobmxzVGFnc0xlbmd0aCAhPSAwKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubHNUYWdzTGVuZ3RoOyBpKyspIHsKKwkJCQkJTkxTVGFnIHRhZyA9IHRoaXMubmxzVGFnc1tpXTsKKwkJCQkJaWYgKHRhZyAhPSBudWxsKSB7CisJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5TkxTVGFncyh0YWcuc3RhcnQsIHRhZy5lbmQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG5sc1RhZ3NMZW5ndGggPT0gMCkgeworCQkJLy8gcmVzaXplIHN0cmluZyBsaXRlcmFscworCQkJaWYgKHRoaXMuc3RyaW5nTGl0ZXJhbHMubGVuZ3RoICE9IHN0cmluZ0xpdGVyYWxzTGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN0cmluZ0xpdGVyYWxzLCAwLCAodGhpcy5zdHJpbmdMaXRlcmFscyA9IG5ldyBTdHJpbmdMaXRlcmFsW3N0cmluZ0xpdGVyYWxzTGVuZ3RoXSksIDAsIHN0cmluZ0xpdGVyYWxzTGVuZ3RoKTsKKwkJCX0KKwkJCUFycmF5cy5zb3J0KHRoaXMuc3RyaW5nTGl0ZXJhbHMsIFNUUklOR19MSVRFUkFMX0NPTVBBUkFUT1IpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdMaXRlcmFsc0xlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKHRoaXMuc3RyaW5nTGl0ZXJhbHNbaV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gbmVlZCB0byBpdGVyYXRlIGJvdGggYXJyYXlzIHRvIGZpbmQgbm9uIG1hdGNoaW5nIGVsZW1lbnRzCisJCQlpZiAodGhpcy5zdHJpbmdMaXRlcmFscy5sZW5ndGggIT0gc3RyaW5nTGl0ZXJhbHNMZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RyaW5nTGl0ZXJhbHMsIDAsICh0aGlzLnN0cmluZ0xpdGVyYWxzID0gbmV3IFN0cmluZ0xpdGVyYWxbc3RyaW5nTGl0ZXJhbHNMZW5ndGhdKSwgMCwgc3RyaW5nTGl0ZXJhbHNMZW5ndGgpOworCQkJfQorCQkJQXJyYXlzLnNvcnQodGhpcy5zdHJpbmdMaXRlcmFscywgU1RSSU5HX0xJVEVSQUxfQ09NUEFSQVRPUik7CisJCQlpbnQgaW5kZXhJbkxpbmUgPSAxOworCQkJaW50IGxhc3RMaW5lTnVtYmVyID0gLTE7CisJCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSBudWxsOworCQkJaW50IGluZGV4ID0gMDsKKwkJCWludCBpID0gMDsKKwkJCXN0cmluZ0xpdGVyYWxzTG9vcDogZm9yICg7IGkgPCBzdHJpbmdMaXRlcmFsc0xlbmd0aDsgaSsrKSB7CisJCQkJbGl0ZXJhbCA9IHRoaXMuc3RyaW5nTGl0ZXJhbHNbaV07CisJCQkJZmluYWwgaW50IGxpdGVyYWxMaW5lTnVtYmVyID0gbGl0ZXJhbC5saW5lTnVtYmVyOworCQkJCWlmIChsYXN0TGluZU51bWJlciAhPSBsaXRlcmFsTGluZU51bWJlcikgeworCQkJCQlpbmRleEluTGluZSA9IDE7CisJCQkJCWxhc3RMaW5lTnVtYmVyID0gbGl0ZXJhbExpbmVOdW1iZXI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5kZXhJbkxpbmUrKzsKIAkJCQl9CiAJCQkJaWYgKGluZGV4IDwgbmxzVGFnc0xlbmd0aCkgewotCQkJCQlmb3IgKDsgaW5kZXggPCBubHNUYWdzTGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJCW5sc1RhZ3NMb29wOiBmb3IgKDsgaW5kZXggPCBubHNUYWdzTGVuZ3RoOyBpbmRleCsrKSB7CiAJCQkJCQlOTFNUYWcgdGFnID0gdGhpcy5ubHNUYWdzW2luZGV4XTsKLQkJCQkJCWlmICh0YWcgIT0gbnVsbCkgewotCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5TkxTVGFncyh0YWcuc3RhcnQsIHRhZy5lbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGFnQXNIYXZpbmdFcnJvcnMoKSB7Ci0JCWlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKLQkJQVNUVmlzaXRvciB2aXNpdG9yLAotCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUpIHsKLQotCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCB0aGlzLnNjb3BlKSkgewotCQkJCWlmICh0aGlzLnR5cGVzICE9IG51bGwgJiYgaXNQYWNrYWdlSW5mbygpKSB7Ci0JCSAgICAgICAgICAgIC8vIHJlc29sdmUgc3ludGhldGljIHR5cGUgZGVjbGFyYXRpb24KLQkJCQkJZmluYWwgVHlwZURlY2xhcmF0aW9uIHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbiA9IHR5cGVzWzBdOwotCQkJCQkvLyByZXNvbHZlIGphdmFkb2MgcGFja2FnZSBpZiBhbnkKLQkJCQkJZmluYWwgTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKLQkJCQkJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsKSB7Ci0JCQkJCQl0aGlzLmphdmFkb2MudHJhdmVyc2UodmlzaXRvciwgbWV0aG9kU2NvcGUpOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLmN1cnJlbnRQYWNrYWdlICE9IG51bGwpIHsKLQkJCQkJCWZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHRoaXMuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnM7Ci0JCQkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJCQkJCWludCBhbm5vdGF0aW9uc0xlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aDsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zTGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJYW5ub3RhdGlvbnNbaV0udHJhdmVyc2UodmlzaXRvciwgbWV0aG9kU2NvcGUpOworCQkJCQkJaWYgKHRhZyA9PSBudWxsKSBjb250aW51ZSBubHNUYWdzTG9vcDsKKwkJCQkJCWludCB0YWdMaW5lTnVtYmVyID0gdGFnLmxpbmVOdW1iZXI7CisJCQkJCQlpZiAobGl0ZXJhbExpbmVOdW1iZXIgPCB0YWdMaW5lTnVtYmVyKSB7CisJCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKGxpdGVyYWwpOworCQkJCQkJCWNvbnRpbnVlIHN0cmluZ0xpdGVyYWxzTG9vcDsKKwkJCQkJCX0gZWxzZSBpZiAobGl0ZXJhbExpbmVOdW1iZXIgPT0gdGFnTGluZU51bWJlcikgeworCQkJCQkJCWlmICh0YWcuaW5kZXggPT0gaW5kZXhJbkxpbmUpIHsKKwkJCQkJCQkJdGhpcy5ubHNUYWdzW2luZGV4XSA9IG51bGw7CisJCQkJCQkJCWluZGV4Kys7CisJCQkJCQkJCWNvbnRpbnVlIHN0cmluZ0xpdGVyYWxzTG9vcDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlubHNUYWdzTG9vcDI6IGZvciAoaW50IGluZGV4MiA9IGluZGV4ICsgMTsgaW5kZXgyIDwgbmxzVGFnc0xlbmd0aDsgaW5kZXgyKyspIHsKKwkJCQkJCQkJCU5MU1RhZyB0YWcyID0gdGhpcy5ubHNUYWdzW2luZGV4Ml07CisJCQkJCQkJCQlpZiAodGFnMiA9PSBudWxsKSBjb250aW51ZSBubHNUYWdzTG9vcDI7CisJCQkJCQkJCQlpbnQgdGFnTGluZU51bWJlcjIgPSB0YWcyLmxpbmVOdW1iZXI7CisJCQkJCQkJCQlpZiAobGl0ZXJhbExpbmVOdW1iZXIgPT0gdGFnTGluZU51bWJlcjIpIHsKKwkJCQkJCQkJCQlpZiAodGFnMi5pbmRleCA9PSBpbmRleEluTGluZSkgeworCQkJCQkJCQkJCQl0aGlzLm5sc1RhZ3NbaW5kZXgyXSA9IG51bGw7CisJCQkJCQkJCQkJCWNvbnRpbnVlIHN0cmluZ0xpdGVyYWxzTG9vcDsKKwkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQljb250aW51ZSBubHNUYWdzTG9vcDI7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwobGl0ZXJhbCk7CisJCQkJCQkJCQkJY29udGludWUgc3RyaW5nTGl0ZXJhbHNMb29wOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbChsaXRlcmFsKTsKKwkJCQkJCQkJY29udGludWUgc3RyaW5nTGl0ZXJhbHNMb29wOwogCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeU5MU1RhZ3ModGFnLnN0YXJ0LCB0YWcuZW5kKTsKKwkJCQkJCQljb250aW51ZSBubHNUYWdzTG9vcDsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAodGhpcy5jdXJyZW50UGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY3VycmVudFBhY2thZ2UudHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnRzICE9IG51bGwpIHsKLQkJCQkJaW50IGltcG9ydExlbmd0aCA9IGltcG9ydHMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydExlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbXBvcnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQkJCWludCB0eXBlc0xlbmd0aCA9IHR5cGVzLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0eXBlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKKwkJCQkvLyBhbGwgbmxzIHRhZ3MgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgc28gcmVtYWluaW5nIHN0cmluZyBsaXRlcmFscyBhcmUgbm90IGV4dGVybmFsaXplZAorCQkJCWJyZWFrIHN0cmluZ0xpdGVyYWxzTG9vcDsKKwkJCX0KKwkJCWZvciAoOyBpIDwgc3RyaW5nTGl0ZXJhbHNMZW5ndGg7IGkrKykgeworCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCh0aGlzLnN0cmluZ0xpdGVyYWxzW2ldKTsKKwkJCX0KKwkJCWlmIChpbmRleCA8IG5sc1RhZ3NMZW5ndGgpIHsKKwkJCQlmb3IgKDsgaW5kZXggPCBubHNUYWdzTGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJCU5MU1RhZyB0YWcgPSB0aGlzLm5sc1RhZ3NbaW5kZXhdOworCQkJCQlpZiAodGFnICE9IG51bGwpIHsKKwkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlOTFNUYWdzKHRhZy5zdGFydCwgdGFnLmVuZCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHRoaXMuc2NvcGUpOwotCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7Ci0JCQkvLyBpZ25vcmUKIAkJfQogCX0KIH0KKworcHVibGljIHZvaWQgdGFnQXNIYXZpbmdFcnJvcnMoKSB7CisJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7Cit9CisKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlKSB7CisJaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCXJldHVybjsKKwl0cnkgeworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCB0aGlzLnNjb3BlKSkgeworCQkJaWYgKHRoaXMudHlwZXMgIT0gbnVsbCAmJiBpc1BhY2thZ2VJbmZvKCkpIHsKKwkgICAgICAgICAgICAvLyByZXNvbHZlIHN5bnRoZXRpYyB0eXBlIGRlY2xhcmF0aW9uCisJCQkJZmluYWwgVHlwZURlY2xhcmF0aW9uIHN5bnRoZXRpY1R5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZXNbMF07CisJCQkJLy8gcmVzb2x2ZSBqYXZhZG9jIHBhY2thZ2UgaWYgYW55CisJCQkJZmluYWwgTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzeW50aGV0aWNUeXBlRGVjbGFyYXRpb24uc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKKwkJCQkvLyBEb24ndCB0cmF2ZXJzZSBpbiBudWxsIHNjb3BlIGFuZCBpbnZpdGUgdHJvdWJsZSBhIGxhIGJ1ZyAyNTI1NTUuCisJCQkJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsICYmIG1ldGhvZFNjb3BlICE9IG51bGwpIHsKKwkJCQkJdGhpcy5qYXZhZG9jLnRyYXZlcnNlKHZpc2l0b3IsIG1ldGhvZFNjb3BlKTsKKwkJCQl9CisJCQkJLy8gRG9uJ3QgdHJhdmVyc2UgaW4gbnVsbCBzY29wZSBhbmQgaW52aXRlIHRyb3VibGUgYSBsYSBidWcgMjUyNTU1LgorCQkJCWlmICh0aGlzLmN1cnJlbnRQYWNrYWdlICE9IG51bGwgJiYgbWV0aG9kU2NvcGUgIT0gbnVsbCkgeworCQkJCQlmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSB0aGlzLmN1cnJlbnRQYWNrYWdlLmFubm90YXRpb25zOworCQkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJaW50IGFubm90YXRpb25zTGVuZ3RoID0gYW5ub3RhdGlvbnMubGVuZ3RoOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc0xlbmd0aDsgaSsrKSB7CisJCQkJCQkJYW5ub3RhdGlvbnNbaV0udHJhdmVyc2UodmlzaXRvciwgbWV0aG9kU2NvcGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHRoaXMuY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgeworCQkJCXRoaXMuY3VycmVudFBhY2thZ2UudHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CisJCQl9CisJCQlpZiAodGhpcy5pbXBvcnRzICE9IG51bGwpIHsKKwkJCQlpbnQgaW1wb3J0TGVuZ3RoID0gdGhpcy5pbXBvcnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydExlbmd0aDsgaSsrKSB7CisJCQkJCXRoaXMuaW1wb3J0c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAodGhpcy50eXBlcyAhPSBudWxsKSB7CisJCQkJaW50IHR5cGVzTGVuZ3RoID0gdGhpcy50eXBlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aDsgaSsrKSB7CisJCQkJCXRoaXMudHlwZXNbaV0udHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgdGhpcy5zY29wZSk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgeworCQkvLyBpZ25vcmUKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21wb3VuZEFzc2lnbm1lbnQuamF2YQppbmRleCBhOWZkYzdlLi5kNGVhYjA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcG91bmRBc3NpZ25tZW50LmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNyw0NSArMjcsNTkgQEAKIAlwdWJsaWMgQ29tcG91bmRBc3NpZ25tZW50KEV4cHJlc3Npb24gbGhzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24saW50IG9wZXJhdG9yLCBpbnQgc291cmNlRW5kKSB7CiAJCS8vbGhzIGlzIGFsd2F5cyBhIHJlZmVyZW5jZSBieSBjb25zdHJ1Y3Rpb24gLAogCQkvL2J1dCBpcyBidWlsZCBhcyBhbiBleHByZXNzaW9uID09PiB0aGUgY2hlY2tjYXN0IGNhbm5vdCBmYWlsCi0JCisKIAkJc3VwZXIobGhzLCBleHByZXNzaW9uLCBzb3VyY2VFbmQpOwogCQlsaHMuYml0cyAmPSB+SXNTdHJpY3RseUFzc2lnbmVkOyAvLyB0YWcgbGhzIGFzIE5PTiBhc3NpZ25lZCAtIGl0IGlzIGFsc28gYSByZWFkIGFjY2VzcwogCQlsaHMuYml0cyB8PSBJc0NvbXBvdW5kQXNzaWduZWQ7IC8vIHRhZyBsaHMgYXMgYXNzaWduZWQgYnkgY29tcG91bmQKIAkJdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yIDsKIAl9Ci0JCi1wdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCAKKworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKLQkvLyByZWNvcmQgc2V0dGluZyBhIHZhcmlhYmxlOiB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsIAotCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IgCisJLy8gcmVjb3JkIHNldHRpbmcgYSB2YXJpYWJsZTogdmFyaW91cyBzY2VuYXJpaSBhcmUgcG9zc2libGUsIHNldHRpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLAorCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IKIAkvLyBqdXN0IGEgbG9jYWwgdmFyaWFibGUuCiAJaWYgKHRoaXMucmVzb2x2ZWRUeXBlLmlkICE9IFRfSmF2YUxhbmdTdHJpbmcpIHsKLQkJbGhzLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJdGhpcy5saHMuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwogCX0KLQlyZXR1cm4gICgoUmVmZXJlbmNlKSBsaHMpLmFuYWx5c2VBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCB0cnVlKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwlmbG93SW5mbyA9ICgoUmVmZXJlbmNlKSB0aGlzLmxocykuYW5hbHlzZUFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIHRydWUpLnVuY29uZGl0aW9uYWxJbml0cygpOworCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSB7CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyNTAKKwkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSB0aGlzLmxocy5sb2NhbFZhcmlhYmxlQmluZGluZygpOworCQlpZiAobG9jYWwgIT0gbnVsbCkgeworCQkJLy8gY29tcG91bmQgYXNzaWdubWVudCByZXN1bHRzIGluIGEgZGVmaW5pdGVseSBub24gbnVsbCB2YWx1ZSBmb3IgU3RyaW5nCisJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CisJCQlpZiAoZmxvd0NvbnRleHQuaW5pdHNPbkZpbmFsbHkgIT0gbnVsbCkKKwkJCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CisJCX0KKwl9CisJcmV0dXJuIGZsb3dJbmZvOwogfQotCQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tDYXN0Q29tcGF0aWJpbGl0eSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkKLQkJLy8gdmFyaW91cyBzY2VuYXJpaSBhcmUgcG9zc2libGUsIHNldHRpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLCAKLQkJLy8gYSBmaWVsZCByZWZlcmVuY2UsIGEgYmxhbmsgZmluYWwgZmllbGQgcmVmZXJlbmNlLCBhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBvciAKKworCQkvLyB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsCisJCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IKIAkJLy8ganVzdCBhIGxvY2FsIHZhcmlhYmxlLgotCQorCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCSAoKFJlZmVyZW5jZSkgbGhzKS5nZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOworCQkgKChSZWZlcmVuY2UpIHRoaXMubGhzKS5nZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCX0KIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9Ci0JCisKIHB1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgewogCXJldHVybiBGbG93SW5mby5OT05fTlVMTDsKLQkvLyB3ZSBtYXkgaGF2ZSBjb21wbGFpbmVkIG9uIGNoZWNrTlBFLCBidXQgd2UgYXZvaWQgZHVwbGljYXRlIGVycm9yIAorCS8vIHdlIG1heSBoYXZlIGNvbXBsYWluZWQgb24gY2hlY2tOUEUsIGJ1dCB3ZSBhdm9pZCBkdXBsaWNhdGUgZXJyb3IKIH0KLQkKKwogCXB1YmxpYyBTdHJpbmcgb3BlcmF0b3JUb1N0cmluZygpIHsKLQkJc3dpdGNoIChvcGVyYXRvcikgeworCQlzd2l0Y2ggKHRoaXMub3BlcmF0b3IpIHsKIAkJCWNhc2UgUExVUyA6CiAJCQkJcmV0dXJuICIrPSI7IC8vJE5PTi1OTFMtMSQKIAkJCWNhc2UgTUlOVVMgOgpAQCAtOTEsMjQgKzEwNSwzMCBAQAogCQl9CiAJCXJldHVybiAidW5rbm93biBvcGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQotCQlsaHMucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KS5hcHBlbmQoJyAnKS5hcHBlbmQob3BlcmF0b3JUb1N0cmluZygpKS5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkgOyAKKworCQl0aGlzLmxocy5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnICcpLmFwcGVuZChvcGVyYXRvclRvU3RyaW5nKCkpLmFwcGVuZCgnICcpOworCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpIDsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJaWYgKCEodGhpcy5saHMgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHx8IHRoaXMubGhzLmlzVGhpcygpKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5leHByZXNzaW9uU2hvdWxkQmVBVmFyaWFibGUodGhpcy5saHMpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxMaHNUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxFeHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlib29sZWFuIGV4cHJlc3Npb25Jc0Nhc3QgPSB0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbjsKKwkJaWYgKGV4cHJlc3Npb25Jc0Nhc3QpCisJCQl0aGlzLmV4cHJlc3Npb24uYml0cyB8PSBBU1ROb2RlLkRpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgorCQlUeXBlQmluZGluZyBvcmlnaW5hbExoc1R5cGUgPSB0aGlzLmxocy5yZXNvbHZlVHlwZShzY29wZSk7CisJCVR5cGVCaW5kaW5nIG9yaWdpbmFsRXhwcmVzc2lvblR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOwogCQlpZiAob3JpZ2luYWxMaHNUeXBlID09IG51bGwgfHwgb3JpZ2luYWxFeHByZXNzaW9uVHlwZSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7Ci0JCisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gdGhpcy5saHMubG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKKwkJaWYgKGxvY2FsVmFyaWFibGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSXNFZmZlY3RpdmVseUZpbmFsOworCQl9CiAJCS8vIGF1dG9ib3hpbmcgc3VwcG9ydAogCQlMb29rdXBFbnZpcm9ubWVudCBlbnYgPSBzY29wZS5lbnZpcm9ubWVudCgpOwogCQlUeXBlQmluZGluZyBsaHNUeXBlID0gb3JpZ2luYWxMaHNUeXBlLCBleHByZXNzaW9uVHlwZSA9IG9yaWdpbmFsRXhwcmVzc2lvblR5cGU7CkBAIC0xMjYsNyArMTQ2LDcgQEAKIAkJCQlleHByZXNzaW9uVHlwZSA9IGVudi5jb21wdXRlQm94aW5nVHlwZShleHByZXNzaW9uVHlwZSk7CiAJCQl9CiAJCX0KLQkJCisKIAkJaWYgKHJlc3RyYWluVXNhZ2VUb051bWVyaWNUeXBlcygpICYmICFsaHNUeXBlLmlzTnVtZXJpY1R5cGUoKSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkub3BlcmF0b3JPbmx5VmFsaWRPbk51bWVyaWNUeXBlKHRoaXMsIGxoc1R5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCXJldHVybiBudWxsOwpAQCAtMTQwLDIxICsxNjAsMjEgQEAKIAkJCX0KIAkJCWV4cHJlc3Npb25JRCA9IFRfSmF2YUxhbmdPYmplY3Q7IC8vIHVzZSB0aGUgT2JqZWN0IGhhcyB0YWcgdGFibGUKIAkJfQotCQorCiAJCS8vIHRoZSBjb2RlIGlzIGFuIGludAotCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQgCisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCiAJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgIDw8NCAgICAgICAgPDwwCi0JCisKIAkJLy8gdGhlIGNvbnZlcnNpb24gaXMgc3RvcmVkIElOVE8gdGhlIHJlZmVyZW5jZSAoaW5mbyBuZWVkZWQgZm9yIHRoZSBjb2RlIGdlbikKLQkJaW50IHJlc3VsdCA9IE9wZXJhdG9yRXhwcmVzc2lvbi5PcGVyYXRvclNpZ25hdHVyZXNbb3BlcmF0b3JdWyAobGhzSUQgPDwgNCkgKyBleHByZXNzaW9uSURdOworCQlpbnQgcmVzdWx0ID0gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU2lnbmF0dXJlc1t0aGlzLm9wZXJhdG9yXVsgKGxoc0lEIDw8IDQpICsgZXhwcmVzc2lvbklEXTsKIAkJaWYgKHJlc3VsdCA9PSBUX3VuZGVmaW5lZCkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGxoc1R5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCWlmIChvcGVyYXRvciA9PSBQTFVTKXsKLQkJCWlmKGxoc0lEID09IFRfSmF2YUxhbmdPYmplY3QpIHsKLQkJCQkvLyA8T2JqZWN0PiArPSA8U3RyaW5nPiBpcyBpbGxlZ2FsICgzOTI0OCkKKwkJaWYgKHRoaXMub3BlcmF0b3IgPT0gUExVUyl7CisJCQlpZihsaHNJRCA9PSBUX0phdmFMYW5nT2JqZWN0ICYmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSkgeworCQkJCS8vIDxPYmplY3Q+ICs9IDxTdHJpbmc+IGlzIGlsbGVnYWwgKDM5MjQ4KSBmb3IgY29tcGxpYW5jZSA8IDEuNwogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRPcGVyYXRvcih0aGlzLCBsaHNUeXBlLCBleHByZXNzaW9uVHlwZSk7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9IGVsc2UgewpAQCAtMTY1LDIxICsxODUsMzIgQEAKIAkJCQl9CiAJCQl9CiAJCX0KKwkJVHlwZUJpbmRpbmcgcmVzdWx0VHlwZSA9IFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIHJlc3VsdCAmIDB4MDAwMEYpOworCQlpZiAoY2hlY2tDYXN0Q29tcGF0aWJpbGl0eSgpKSB7CisJCQlpZiAob3JpZ2luYWxMaHNUeXBlLmlkICE9IFRfSmF2YUxhbmdTdHJpbmcgJiYgcmVzdWx0VHlwZS5pZCAhPSBUX0phdmFMYW5nU3RyaW5nKSB7CisJCQkJaWYgKCFjaGVja0Nhc3RUeXBlc0NvbXBhdGliaWxpdHkoc2NvcGUsIG9yaWdpbmFsTGhzVHlwZSwgcmVzdWx0VHlwZSwgbnVsbCkpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIG9yaWdpbmFsTGhzVHlwZSwgZXhwcmVzc2lvblR5cGUpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KIAkJdGhpcy5saHMuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIChyZXN1bHQgPj4+IDE2KSAmIDB4MDAwMEYpLCBvcmlnaW5hbExoc1R5cGUpOwogCQl0aGlzLmV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIChyZXN1bHQgPj4+IDgpICYgMHgwMDAwRiksIG9yaWdpbmFsRXhwcmVzc2lvblR5cGUpOwogCQl0aGlzLnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbiA9ICAodW5ib3hlZExocyA/IEJPWElORyA6IDApIHwgKGxoc0lEIDw8IDQpIHwgKHJlc3VsdCAmIDB4MDAwMEYpOwogCQlpZiAodW5ib3hlZExocykgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXV0b2JveGluZyh0aGlzLCBsaHNUeXBlLCBvcmlnaW5hbExoc1R5cGUpOworCQlpZiAoZXhwcmVzc2lvbklzQ2FzdCkKKwkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoc2NvcGUsIHRoaXMub3BlcmF0b3IsIHJlc3VsdCwgdGhpcy5saHMsIG9yaWdpbmFsTGhzVHlwZS5pZCwgZmFsc2UsIHRoaXMuZXhwcmVzc2lvbiwgb3JpZ2luYWxFeHByZXNzaW9uVHlwZS5pZCwgdHJ1ZSk7CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IG9yaWdpbmFsTGhzVHlwZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiByZXN0cmFpblVzYWdlVG9OdW1lcmljVHlwZXMoKXsKIAkJcmV0dXJuIGZhbHNlIDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCQlsaHMudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLmxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLmV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmluZGV4IDQwZjAyZTQuLmRkNGY5YjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsMTAgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhlbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gIENvbnRyaWJ1dGlvbnMgZm9yCisgKiAgICAgCQkJCQkJYnVnIDEzMzEyNSAtIFtjb21waWxlcl1bbnVsbF0gbmVlZCB0byByZXBvcnQgdGhlIG51bGwgc3RhdHVzIG9mIGV4cHJlc3Npb25zIGFuZCBhbmFseXplIHRoZW0gc2ltdWx0YW5lb3VzbHkKKyAqICAgICAJCQkJCQlidWcgMjkyNDc4IC0gUmVwb3J0IHBvdGVudGlhbGx5IG51bGwgYWNyb3NzIHZhcmlhYmxlIGFzc2lnbm1lbnQKKyAqIAkJCQkJCQlidWcgMzI0MTc4IC0gW251bGxdIENvbmRpdGlvbmFsRXhwcmVzc2lvbi5udWxsU3RhdHVzKC4uKSBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBhbmFseXNpcyBvZiBjb25kaXRpb24gaXRzZWxmCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMjMsMTIgKzI3LDE1IEBACiAJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKIAlwdWJsaWMgQ29uc3RhbnQgb3B0aW1pemVkSWZUcnVlQ29uc3RhbnQ7CiAJcHVibGljIENvbnN0YW50IG9wdGltaXplZElmRmFsc2VDb25zdGFudDsKLQkKKwogCS8vIGZvciBsb2NhbCB2YXJpYWJsZXMgdGFibGUgYXR0cmlidXRlcwogCWludCB0cnVlSW5pdFN0YXRlSW5kZXggPSAtMTsKIAlpbnQgZmFsc2VJbml0U3RhdGVJbmRleCA9IC0xOwogCWludCBtZXJnZWRJbml0U3RhdGVJbmRleCA9IC0xOwogCQorCS8vIHdlIGNvbXB1dGUgYW5kIHN0b3JlIHRoZSBudWxsIHN0YXR1cyBkdXJpbmcgYW5hbHlzZUNvZGUgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjQxNzgpOgorCXByaXZhdGUgaW50IG51bGxTdGF0dXMgPSBGbG93SW5mby5VTktOT1dOOworCiAJcHVibGljIENvbmRpdGlvbmFsRXhwcmVzc2lvbigKIAkJRXhwcmVzc2lvbiBjb25kaXRpb24sCiAJCUV4cHJlc3Npb24gdmFsdWVJZlRydWUsCkBAIC0zNiw3MSArNDMsMTMzIEBACiAJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOwogCQl0aGlzLnZhbHVlSWZUcnVlID0gdmFsdWVJZlRydWU7CiAJCXRoaXMudmFsdWVJZkZhbHNlID0gdmFsdWVJZkZhbHNlOwotCQlzb3VyY2VTdGFydCA9IGNvbmRpdGlvbi5zb3VyY2VTdGFydDsKLQkJc291cmNlRW5kID0gdmFsdWVJZkZhbHNlLnNvdXJjZUVuZDsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IGNvbmRpdGlvbi5zb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSB2YWx1ZUlmRmFsc2Uuc291cmNlRW5kOwogCX0KIAogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwKLQkJRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCWludCBpbml0aWFsQ29tcGxhaW50TGV2ZWwgPSAoZmxvd0luZm8ucmVhY2hNb2RlKCkgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCA/IFN0YXRlbWVudC5DT01QTEFJTkVEX0ZBS0VfUkVBQ0hBQkxFIDogU3RhdGVtZW50Lk5PVF9DT01QTEFJTkVEOwogCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwogCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZTsKIAogCQlpbnQgbW9kZSA9IGZsb3dJbmZvLnJlYWNoTW9kZSgpOwotCQlmbG93SW5mbyA9IGNvbmRpdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgY3N0ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCk7Ci0JCQorCQlmbG93SW5mbyA9IHRoaXMuY29uZGl0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCBjc3QgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKKwogCQkvLyBwcm9jZXNzIHRoZSBpZi10cnVlIHBhcnQKIAkJRmxvd0luZm8gdHJ1ZUZsb3dJbmZvID0gZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKTsKIAkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UpIHsKLQkJCXRydWVGbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOyAKKwkJCWlmICgobW9kZSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKSB7CisJCQkJdHJ1ZUZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsKKwkJCX0KKwkJCWlmICghaXNLbm93RGVhZENvZGVQYXR0ZXJuKHRoaXMuY29uZGl0aW9uKSB8fCBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCkgeworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcGxhaW5JZlVucmVhY2hhYmxlKHRydWVGbG93SW5mbywgY3VycmVudFNjb3BlLCBpbml0aWFsQ29tcGxhaW50TGV2ZWwpOworCQkJfQogCQl9Ci0JCXRydWVJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRydWVGbG93SW5mbyk7Ci0JCXRydWVGbG93SW5mbyA9IHZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHRydWVGbG93SW5mbyk7CisJCXRoaXMudHJ1ZUluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXModHJ1ZUZsb3dJbmZvKTsKKwkJdHJ1ZUZsb3dJbmZvID0gdGhpcy52YWx1ZUlmVHJ1ZS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCB0cnVlRmxvd0luZm8pOwogCiAJCS8vIHByb2Nlc3MgdGhlIGlmLWZhbHNlIHBhcnQKIAkJRmxvd0luZm8gZmFsc2VGbG93SW5mbyA9IGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpOwogCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlKSB7Ci0JCQlmYWxzZUZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCQkJaWYgKChtb2RlICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKKwkJCQlmYWxzZUZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsKKwkJCX0KKwkJCWlmICghaXNLbm93RGVhZENvZGVQYXR0ZXJuKHRoaXMuY29uZGl0aW9uKSB8fCBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCkgeworCQkJCXRoaXMudmFsdWVJZkZhbHNlLmNvbXBsYWluSWZVbnJlYWNoYWJsZShmYWxzZUZsb3dJbmZvLCBjdXJyZW50U2NvcGUsIGluaXRpYWxDb21wbGFpbnRMZXZlbCk7CisJCQl9CiAJCX0KLQkJZmFsc2VJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZhbHNlRmxvd0luZm8pOwotCQlmYWxzZUZsb3dJbmZvID0gdmFsdWVJZkZhbHNlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZhbHNlRmxvd0luZm8pOworCQl0aGlzLmZhbHNlSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmYWxzZUZsb3dJbmZvKTsKKwkJZmFsc2VGbG93SW5mbyA9IHRoaXMudmFsdWVJZkZhbHNlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZhbHNlRmxvd0luZm8pOwogCiAJCS8vIG1lcmdlIGlmLXRydWUgJiBpZi1mYWxzZSBpbml0aWFsaXphdGlvbnMKIAkJRmxvd0luZm8gbWVyZ2VkSW5mbzsKIAkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSl7CiAJCQltZXJnZWRJbmZvID0gdHJ1ZUZsb3dJbmZvLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oZmFsc2VGbG93SW5mbyk7CisJCQl0aGlzLm51bGxTdGF0dXMgPSB0aGlzLnZhbHVlSWZUcnVlLm51bGxTdGF0dXModHJ1ZUZsb3dJbmZvKTsKIAkJfSBlbHNlIGlmIChpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlKSB7CiAJCQltZXJnZWRJbmZvID0gZmFsc2VGbG93SW5mby5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKHRydWVGbG93SW5mbyk7CisJCQl0aGlzLm51bGxTdGF0dXMgPSB0aGlzLnZhbHVlSWZGYWxzZS5udWxsU3RhdHVzKGZhbHNlRmxvd0luZm8pOwogCQl9IGVsc2UgewotCQkJLy8gaWYgKCh0ICYmICh2ID0gdCkpID8gdCA6IHQgJiYgKHYgPSBmKSkgciA9IHY7ICAtLSBvaworCQkJLy8gdGhpcyBibG9jayBtdXN0IG1lZXQgdHdvIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjQxNzgpOgorCQkJLy8gKDEpIEZvciBudWxsIGFuYWx5c2lzIG9mICJPYmplY3QgbzIgPSAobzEgIT0gbnVsbCkgPyBvMSA6IG5ldyBPYmplY3QoKTsiIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2gKKwkJCS8vICAgICB0aGUgcGF0aHMgKm9yaWdpbmF0aW5nKiBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBjb25kaXRpb24gdG8gdHJ1ZS9mYWxzZSByZXNwZWN0aXZlbHkuCisJCQkvLyAgICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgbnVsbCBzdGF0dXMgb2YgdGhlIGVudGlyZSBjb25kaXRpb25hbCBleHByZXNzaW9uLgorCQkJLy8gKDIpIEZvciBkZWZpbml0ZSBhc3NpZ25tZW50IGFuYWx5c2lzIChKTFMgMTYuMS41KSBvZiBib29sZWFuIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtCisJCQkvLyAgICAgImlmIChjMSA/IGV4cHIxIDogZXhwcjIpIHVzZSh2KTsiIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBhbnkgdmFyaWFibGUgdiB3aWxsIGJlIGRlZmluaXRlbHkKKwkJCS8vICAgICBhc3NpZ25lZCB3aGVuZXZlciB0aGUgZW50aXJlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUgKHRvIHJlYWNoIHRoZSB0aGVuIGJyYW5jaCkuCisJCQkvLyAgICAgSS5lLiwgd2UgbmVlZCB0byBjb2xsZWN0IGZsb3dJbmZvICp0b3dhcmRzKiB0aGUgb3ZlcmFsbCBvdXRjb21lIHRydWUvZmFsc2UgCisJCQkvLyAgICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIGV2YWx1YXRpb24gb2YgdGhlIGNvbmRpdGlvbikuCisJCQkKKwkJCS8vIHRvIHN1cHBvcnQgKDEpIHVzZSB0aGUgaW5mb3Mgb2YgYm90aCBicmFuY2hlcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjb25kaXRpb24gZm9yIGNvbXB1dGluZyB0aGUgbnVsbFN0YXR1czoKKwkJCWNvbXB1dGVOdWxsU3RhdHVzKHRydWVGbG93SW5mbywgZmFsc2VGbG93SW5mbyk7CisJCQkKKwkJCS8vIHRvIHN1cHBvcnQgKDIpIHdlIHNwbGl0IHRoZSB0cnVlL2ZhbHNlIGJyYW5jaGVzIGFjY29yZGluZyB0byB0aGVpciBpbm5lciBzdHJ1Y3R1cmUuIENvbnNpZGVyIHRoaXM6CisJCQkvLyBpZiAoYiA/IGZhbHNlIDogKHRydWUgJiYgKHYgPSBmYWxzZSkpKSByZXR1cm4gdjsgLS0gb2sKKwkJCS8vIC0gZXhwcjEgKCJmYWxzZSIpIGhhcyBubyBwYXRoIHRvd2FyZHMgdHJ1ZSAobWFyayBhcyB1bnJlYWNoYWJsZSkKKwkJCS8vIC0gZXhwcjIgKCIodHJ1ZSAmJiAodiA9IGZhbHNlKSkiKSBoYXMgYSBicmFuY2ggdG93YXJkcyB0cnVlIG9uIHdoaWNoIHYgaXMgYXNzaWduZWQuCisJCQkvLyAgIC0+IG1lcmdpbmcgdGhlc2UgdHdvIGJyYW5jaGVzIHlpZWxkczogdiBpcyBhc3NpZ25lZAorCQkJLy8gLSB0aGUgcGF0aHMgdG93YXJkcyBmYWxzZSBhcmUgaXJyZWxldmFudCBzaW5jZSB0aGUgZW5jbG9zaW5nIGlmIGhhcyBubyBlbHNlLgogCQkJY3N0ID0gdGhpcy5vcHRpbWl6ZWRJZlRydWVDb25zdGFudDsKIAkJCWJvb2xlYW4gaXNWYWx1ZUlmVHJ1ZU9wdGltaXplZFRydWUgPSBjc3QgIT0gbnVsbCAmJiBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwogCQkJYm9vbGVhbiBpc1ZhbHVlSWZUcnVlT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gbnVsbCAmJiBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZTsKLQkJCQorCiAJCQljc3QgPSB0aGlzLm9wdGltaXplZElmRmFsc2VDb25zdGFudDsKIAkJCWJvb2xlYW4gaXNWYWx1ZUlmRmFsc2VPcHRpbWl6ZWRUcnVlID0gY3N0ICE9IG51bGwgJiYgY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKIAkJCWJvb2xlYW4gaXNWYWx1ZUlmRmFsc2VPcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBudWxsICYmIGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOwogCi0JCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gdHJ1ZUluZm9XaGVuVHJ1ZSA9IHRydWVGbG93SW5mby5pbml0c1doZW5UcnVlKCkudW5jb25kaXRpb25hbENvcHkoKTsKLQkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmYWxzZUluZm9XaGVuVHJ1ZSA9IGZhbHNlRmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxDb3B5KCk7Ci0JCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gdHJ1ZUluZm9XaGVuRmFsc2UgPSB0cnVlRmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKLQkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmYWxzZUluZm9XaGVuRmFsc2UgPSBmYWxzZUZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCk7Ci0JCQlpZiAoaXNWYWx1ZUlmVHJ1ZU9wdGltaXplZEZhbHNlKSB0cnVlSW5mb1doZW5UcnVlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAotCQkJaWYgKGlzVmFsdWVJZkZhbHNlT3B0aW1pemVkRmFsc2UpIGZhbHNlSW5mb1doZW5UcnVlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAotCQkJaWYgKGlzVmFsdWVJZlRydWVPcHRpbWl6ZWRUcnVlKSB0cnVlSW5mb1doZW5GYWxzZS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOyAKLQkJCWlmIChpc1ZhbHVlSWZGYWxzZU9wdGltaXplZFRydWUpIGZhbHNlSW5mb1doZW5GYWxzZS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOyAKLQorCQkJVW5jb25kaXRpb25hbEZsb3dJbmZvIHRydWVGbG93VG93YXJkc1RydWUgPSB0cnVlRmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxDb3B5KCk7CisJCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmFsc2VGbG93VG93YXJkc1RydWUgPSBmYWxzZUZsb3dJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsQ29weSgpOworCQkJVW5jb25kaXRpb25hbEZsb3dJbmZvIHRydWVGbG93VG93YXJkc0ZhbHNlID0gdHJ1ZUZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmFsc2VGbG93VG93YXJkc0ZhbHNlID0gZmFsc2VGbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJaWYgKGlzVmFsdWVJZlRydWVPcHRpbWl6ZWRGYWxzZSkgeworCQkJCXRydWVGbG93VG93YXJkc1RydWUuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwkJCQkKKwkJCX0KKwkJCWlmIChpc1ZhbHVlSWZGYWxzZU9wdGltaXplZEZhbHNlKSB7CisJCQkJZmFsc2VGbG93VG93YXJkc1RydWUuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwkKKwkJCX0KKwkJCWlmIChpc1ZhbHVlSWZUcnVlT3B0aW1pemVkVHJ1ZSkgeworCQkJCXRydWVGbG93VG93YXJkc0ZhbHNlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsJCisJCQl9CisJCQlpZiAoaXNWYWx1ZUlmRmFsc2VPcHRpbWl6ZWRUcnVlKSB7CisJCQkJZmFsc2VGbG93VG93YXJkc0ZhbHNlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsJCisJCQl9CiAJCQltZXJnZWRJbmZvID0KIAkJCQlGbG93SW5mby5jb25kaXRpb25hbCgKLQkJCQkJdHJ1ZUluZm9XaGVuVHJ1ZS5tZXJnZWRXaXRoKGZhbHNlSW5mb1doZW5UcnVlKSwKLQkJCQkJdHJ1ZUluZm9XaGVuRmFsc2UubWVyZ2VkV2l0aChmYWxzZUluZm9XaGVuRmFsc2UpKTsKKwkJCQkJdHJ1ZUZsb3dUb3dhcmRzVHJ1ZS5tZXJnZWRXaXRoKGZhbHNlRmxvd1Rvd2FyZHNUcnVlKSwKKwkJCQkJdHJ1ZUZsb3dUb3dhcmRzRmFsc2UubWVyZ2VkV2l0aChmYWxzZUZsb3dUb3dhcmRzRmFsc2UpKTsKIAkJfQotCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCW1lcmdlZEluZm8uc2V0UmVhY2hNb2RlKG1vZGUpOwogCQlyZXR1cm4gbWVyZ2VkSW5mbzsKIAl9CiAKKwlwcml2YXRlIHZvaWQgY29tcHV0ZU51bGxTdGF0dXMoRmxvd0luZm8gdHJ1ZUJyYW5jaEluZm8sIEZsb3dJbmZvIGZhbHNlQnJhbmNoSW5mbykgeworCQkvLyBnaXZlbiB0aGF0IHRoZSBjb25kaXRpb24gY2Fubm90IGJlIG9wdGltaXplZCB0byBhIGNvbnN0YW50IAorCQkvLyB3ZSBub3cgbWVyZ2UgdGhlIG51bGxTdGF0dXMgZnJvbSBib3RoIGJyYW5jaGVzOgorCQlpbnQgaWZUcnVlTnVsbFN0YXR1cyA9IHRoaXMudmFsdWVJZlRydWUubnVsbFN0YXR1cyh0cnVlQnJhbmNoSW5mbyk7CisJCWludCBpZkZhbHNlTnVsbFN0YXR1cyA9IHRoaXMudmFsdWVJZkZhbHNlLm51bGxTdGF0dXMoZmFsc2VCcmFuY2hJbmZvKTsKKworCQlpZiAoaWZUcnVlTnVsbFN0YXR1cyA9PSBpZkZhbHNlTnVsbFN0YXR1cykgeworCQkJdGhpcy5udWxsU3RhdHVzID0gaWZUcnVlTnVsbFN0YXR1czsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBpcyB0aGVyZSBhIGNoYW5jZSBvZiBudWxsIChvciBub24tbnVsbCk/IC0+IHBvdGVudGlhbGx5IG51bGwgZXRjLgorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMTI1CisJCWludCBzdGF0dXMgPSAwOworCQlpbnQgY29tYmluZWRTdGF0dXMgPSBpZlRydWVOdWxsU3RhdHVzfGlmRmFsc2VOdWxsU3RhdHVzOworCQlpZiAoKGNvbWJpbmVkU3RhdHVzICYgKEZsb3dJbmZvLk5VTEx8Rmxvd0luZm8uUE9URU5USUFMTFlfTlVMTCkpICE9IDApCisJCQlzdGF0dXMgfD0gRmxvd0luZm8uUE9URU5USUFMTFlfTlVMTDsKKwkJaWYgKChjb21iaW5lZFN0YXR1cyAmIChGbG93SW5mby5OT05fTlVMTHxGbG93SW5mby5QT1RFTlRJQUxMWV9OT05fTlVMTCkpICE9IDApCisJCQlzdGF0dXMgfD0gRmxvd0luZm8uUE9URU5USUFMTFlfTk9OX05VTEw7CisJCWlmICgoY29tYmluZWRTdGF0dXMgJiAoRmxvd0luZm8uVU5LTk9XTnxGbG93SW5mby5QT1RFTlRJQUxMWV9VTktOT1dOKSkgIT0gMCkKKwkJCXN0YXR1cyB8PSBGbG93SW5mby5QT1RFTlRJQUxMWV9VTktOT1dOOworCQlpZiAoc3RhdHVzID4gMCkKKwkJCXRoaXMubnVsbFN0YXR1cyA9IHN0YXR1czsKKwl9CisKIAkvKioKIAkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvciA/OgogCSAqCkBAIC0xMTUsMTMgKzE4NCwxMyBAQAogCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCUJyYW5jaExhYmVsIGVuZGlmTGFiZWwsIGZhbHNlTGFiZWw7Ci0JCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBuZWVkVHJ1ZVBhcnQgPSAhKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKTsKIAkJYm9vbGVhbiBuZWVkRmFsc2VQYXJ0ID0gCSEoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSk7CiAJCWVuZGlmTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7CkBAIC0xMjksMjIgKzE5OCwyMiBAQAogCQkvLyBHZW5lcmF0ZSBjb2RlIGZvciB0aGUgY29uZGl0aW9uCiAJCWZhbHNlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7CiAJCWZhbHNlTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwotCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQljdXJyZW50U2NvcGUsCiAJCQljb2RlU3RyZWFtLAogCQkJbnVsbCwKIAkJCWZhbHNlTGFiZWwsCiAJCQljc3QgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKIAotCQlpZiAodHJ1ZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCWlmICh0aGlzLnRydWVJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJY3VycmVudFNjb3BlLAotCQkJCXRydWVJbml0U3RhdGVJbmRleCk7Ci0JCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRydWVJbml0U3RhdGVJbmRleCk7CisJCQkJdGhpcy50cnVlSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnRydWVJbml0U3RhdGVJbmRleCk7CiAJCX0KIAkJLy8gVGhlbiBjb2RlIGdlbmVyYXRpb24KIAkJaWYgKG5lZWRUcnVlUGFydCkgewotCQkJdmFsdWVJZlRydWUuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQl0aGlzLnZhbHVlSWZUcnVlLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJaWYgKG5lZWRGYWxzZVBhcnQpIHsKIAkJCQkvLyBKdW1wIG92ZXIgdGhlIGVsc2UgcGFydAogCQkJCWludCBwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CkBAIC0xNTIsMjEgKzIyMSwyOSBAQAogCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBwb3NpdGlvbik7CiAJCQkJLy8gVHVuZSBjb2Rlc3RyZWFtIHN0YWNrIHNpemUKIAkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUodGhpcy5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORyB8fCB0aGlzLnJlc29sdmVkVHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUgPyAyIDogMSk7CisJCQkJCXN3aXRjaCh0aGlzLnJlc29sdmVkVHlwZS5pZCkgeworCQkJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGVjclN0YWNrU2l6ZSgyKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGVjclN0YWNrU2l6ZSgxKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQogCQlpZiAobmVlZEZhbHNlUGFydCkgewotCQkJaWYgKGZhbHNlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWlmICh0aGlzLmZhbHNlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLAotCQkJCQlmYWxzZUluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGZhbHNlSW5pdFN0YXRlSW5kZXgpOworCQkJCQl0aGlzLmZhbHNlSW5pdFN0YXRlSW5kZXgpOworCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5mYWxzZUluaXRTdGF0ZUluZGV4KTsKIAkJCX0KIAkJCWlmIChmYWxzZUxhYmVsLmZvcndhcmRSZWZlcmVuY2VDb3VudCgpID4gMCkgewogCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKIAkJCX0KLQkJCXZhbHVlSWZGYWxzZS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCXRoaXMudmFsdWVJZkZhbHNlLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQljb2RlU3RyZWFtLnJlY29yZEV4cHJlc3Npb25UeXBlKHRoaXMucmVzb2x2ZWRUeXBlKTsKIAkJCX0KQEAgLTE3NiwxNCArMjUzLDE0IEBACiAJCQl9CiAJCX0KIAkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJY3VycmVudFNjb3BlLAotCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJfQogCQkvLyBpbXBsaWNpdCBjb252ZXJzaW9uCiAJCWlmICh2YWx1ZVJlcXVpcmVkKQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQogCkBAIC0xOTcsMTMgKzI3NCwxMyBAQAogCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAotCQlpZiAoKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikgLy8gY29uc3RhbnQKLQkJCXx8ICgodmFsdWVJZlRydWUuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUX2Jvb2xlYW4pIHsgLy8gbm9uIGJvb2xlYW4gdmFsdWVzCisJCWlmICgodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmICh0aGlzLmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikgLy8gY29uc3RhbnQKKwkJCXx8ICgodGhpcy52YWx1ZUlmVHJ1ZS5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpICE9IFRfYm9vbGVhbikgeyAvLyBub24gYm9vbGVhbiB2YWx1ZXMKIAkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50OwotCQlDb25zdGFudCBjb25kQ3N0ID0gY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5jb25zdGFudDsKKwkJQ29uc3RhbnQgY29uZENzdCA9IHRoaXMuY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlib29sZWFuIG5lZWRUcnVlUGFydCA9CiAJCQkhKCgoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkpCiAJCQkJfHwgKChjb25kQ3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNvbmRDc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKSk7CkBAIC0yMTUsMjMgKzI5MiwyMyBAQAogCiAJCS8vIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBjb25kaXRpb24KIAkJYm9vbGVhbiBuZWVkQ29uZGl0aW9uVmFsdWUgPSAoY3N0ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNvbmRDc3QgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKLQkJY29uZGl0aW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJdGhpcy5jb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAogCQkJCWN1cnJlbnRTY29wZSwKIAkJCQljb2RlU3RyZWFtLAogCQkJCW51bGwsCiAJCQkJaW50ZXJuYWxGYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pLAogCQkJCW5lZWRDb25kaXRpb25WYWx1ZSk7CiAKLQkJaWYgKHRydWVJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQlpZiAodGhpcy50cnVlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAogCQkJCWN1cnJlbnRTY29wZSwKLQkJCQl0cnVlSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0cnVlSW5pdFN0YXRlSW5kZXgpOworCQkJCXRoaXMudHJ1ZUluaXRTdGF0ZUluZGV4KTsKKwkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy50cnVlSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJCS8vIFRoZW4gY29kZSBnZW5lcmF0aW9uCiAJCWlmIChuZWVkVHJ1ZVBhcnQpIHsKLQkJCXZhbHVlSWZUcnVlLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7Ci0JCQkKKwkJCXRoaXMudmFsdWVJZlRydWUuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKwogCQkJaWYgKG5lZWRGYWxzZVBhcnQpIHsKIAkJCQkvLyBKdW1wIG92ZXIgdGhlIGVsc2UgcGFydAogCQkJCUp1bXBFbmRpZjogewpAQCAtMjYyLDY1ICszMzksNTIgQEAKIAkJfQogCQlpZiAobmVlZEZhbHNlUGFydCkgewogCQkJaW50ZXJuYWxGYWxzZUxhYmVsLnBsYWNlKCk7Ci0JCQlpZiAoZmFsc2VJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgZmFsc2VJbml0U3RhdGVJbmRleCk7Ci0JCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBmYWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCWlmICh0aGlzLmZhbHNlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMuZmFsc2VJbml0U3RhdGVJbmRleCk7CisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLmZhbHNlSW5pdFN0YXRlSW5kZXgpOwogCQkJfQotCQkJdmFsdWVJZkZhbHNlLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCQl0aGlzLnZhbHVlSWZGYWxzZS5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwogCiAJCQkvLyBFbmQgb2YgaWYgc3RhdGVtZW50CiAJCQllbmRpZkxhYmVsLnBsYWNlKCk7CiAJCX0KIAkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJCS8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGJvb2xlYW4gdmFsdWVzCiAJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAl9Ci0JCi1wdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKLQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKLQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWVJZlRydWUubnVsbFN0YXR1cyhmbG93SW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlSWZGYWxzZS5udWxsU3RhdHVzKGZsb3dJbmZvKTsKKworCXB1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgeworCQlyZXR1cm4gdGhpcy5udWxsU3RhdHVzOwogCX0KLQlpbnQgaWZUcnVlTnVsbFN0YXR1cyA9IHZhbHVlSWZUcnVlLm51bGxTdGF0dXMoZmxvd0luZm8pLAotCSAgICBpZkZhbHNlTnVsbFN0YXR1cyA9IHZhbHVlSWZGYWxzZS5udWxsU3RhdHVzKGZsb3dJbmZvKTsKLQlpZiAoaWZUcnVlTnVsbFN0YXR1cyA9PSBpZkZhbHNlTnVsbFN0YXR1cykgewotCQlyZXR1cm4gaWZUcnVlTnVsbFN0YXR1czsKLQl9Ci0JcmV0dXJuIEZsb3dJbmZvLlVOS05PV047Ci0JLy8gY2Fubm90IGRlY2lkZSB3aGljaCBicmFuY2ggdG8gdGFrZSwgYW5kIHRoZXkgZGlzYWdyZWUKLX0KIAogCXB1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSB7CiAKIAkJcmV0dXJuIHRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID09IG51bGwgPyB0aGlzLmNvbnN0YW50IDogdGhpcy5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCi0JCWNvbmRpdGlvbi5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiID8gIik7IC8vJE5PTi1OTFMtMSQKLQkJdmFsdWVJZlRydWUucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdmFsdWVJZkZhbHNlLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCisJCXRoaXMuY29uZGl0aW9uLnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCIgPyAiKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnZhbHVlSWZUcnVlLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRoaXMudmFsdWVJZkZhbHNlLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCX0KIAogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCS8vIEpMUzMgMTUuMjUKLQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCUxvb2t1cEVudmlyb25tZW50IGVudiA9IHNjb3BlLmVudmlyb25tZW50KCk7CiAJCWJvb2xlYW4gdXNlMTVzcGVjaWZpY3MgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwotCQlUeXBlQmluZGluZyBjb25kaXRpb25UeXBlID0gY29uZGl0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBUeXBlQmluZGluZy5CT09MRUFOKTsKLQkJY29uZGl0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy5CT09MRUFOLCBjb25kaXRpb25UeXBlKTsKLQkJCi0JCWlmICh2YWx1ZUlmVHJ1ZSBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB2YWx1ZUlmVHJ1ZS5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgotCQlUeXBlQmluZGluZyBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSA9IHZhbHVlSWZUcnVlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJVHlwZUJpbmRpbmcgY29uZGl0aW9uVHlwZSA9IHRoaXMuY29uZGl0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBUeXBlQmluZGluZy5CT09MRUFOKTsKKwkJdGhpcy5jb25kaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkJPT0xFQU4sIGNvbmRpdGlvblR5cGUpOwogCi0JCWlmICh2YWx1ZUlmRmFsc2UgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgdmFsdWVJZkZhbHNlLmJpdHMgfD0gRGlzYWJsZVVubmVjZXNzYXJ5Q2FzdENoZWNrOyAvLyB3aWxsIGNoZWNrIGxhdGVyIG9uCi0JCVR5cGVCaW5kaW5nIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSA9IHZhbHVlSWZGYWxzZS5yZXNvbHZlVHlwZShzY29wZSk7CisJCWlmICh0aGlzLnZhbHVlSWZUcnVlIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHRoaXMudmFsdWVJZlRydWUuYml0cyB8PSBEaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KKwkJVHlwZUJpbmRpbmcgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUgPSB0aGlzLnZhbHVlSWZUcnVlLnJlc29sdmVUeXBlKHNjb3BlKTsKKworCQlpZiAodGhpcy52YWx1ZUlmRmFsc2UgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgdGhpcy52YWx1ZUlmRmFsc2UuYml0cyB8PSBEaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KKwkJVHlwZUJpbmRpbmcgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlID0gdGhpcy52YWx1ZUlmRmFsc2UucmVzb2x2ZVR5cGUoc2NvcGUpOwogCiAJCWlmIChjb25kaXRpb25UeXBlID09IG51bGwgfHwgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUgPT0gbnVsbCB8fCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMzUyLDcgKzQxNiw3IEBACiAJCQkJCQl2YWx1ZUlmVHJ1ZVR5cGUgPSB1bmJveGVkSWZUcnVlVHlwZTsgLy8gdW5ib3hpbmcKIAkJCQkJfSBlbHNlIGlmICh2YWx1ZUlmRmFsc2VUeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwpIHsgIC8vIGJvb2wgPyBuZXcgSW50ZWdlcigxMikgOiAxMiAtLT4gaW50CiAJCQkJCQl2YWx1ZUlmVHJ1ZVR5cGUgPSBlbnYuY29tcHV0ZUJveGluZ1R5cGUodmFsdWVJZlRydWVUeXBlKTsgLy8gdW5ib3hpbmcKLQkJCQkJfQkJCQkJCisJCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJCS8vIGJvb2wgPyBub25CYXNlVHlwZSA6IG5vbkJhc2VUeXBlCiAJCQkJCVR5cGVCaW5kaW5nIHVuYm94ZWRJZlRydWVUeXBlID0gZW52LmNvbXB1dGVCb3hpbmdUeXBlKHZhbHVlSWZUcnVlVHlwZSk7CkBAIC0zNjEsMjkgKzQyNSwyOSBAQAogCQkJCQkJdmFsdWVJZlRydWVUeXBlID0gdW5ib3hlZElmVHJ1ZVR5cGU7CiAJCQkJCQl2YWx1ZUlmRmFsc2VUeXBlID0gdW5ib3hlZElmRmFsc2VUeXBlOwogCQkJCQl9Ci0JCQl9IAorCQkJfQogCQl9CiAJCS8vIFByb3BhZ2F0ZSB0aGUgY29uc3RhbnQgdmFsdWUgZnJvbSB0aGUgdmFsdWVJZlRydWUgYW5kIHZhbHVlSUZGYWxzZSBleHByZXNzaW9uIGlmIGl0IGlzIHBvc3NpYmxlCiAJCUNvbnN0YW50IGNvbmRDb25zdGFudCwgdHJ1ZUNvbnN0YW50LCBmYWxzZUNvbnN0YW50OwotCQlpZiAoKGNvbmRDb25zdGFudCA9IGNvbmRpdGlvbi5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50Ci0JCQkmJiAodHJ1ZUNvbnN0YW50ID0gdmFsdWVJZlRydWUuY29uc3RhbnQpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudAotCQkJJiYgKGZhbHNlQ29uc3RhbnQgPSB2YWx1ZUlmRmFsc2UuY29uc3RhbnQpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQlpZiAoKGNvbmRDb25zdGFudCA9IHRoaXMuY29uZGl0aW9uLmNvbnN0YW50KSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKKwkJCSYmICh0cnVlQ29uc3RhbnQgPSB0aGlzLnZhbHVlSWZUcnVlLmNvbnN0YW50KSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKKwkJCSYmIChmYWxzZUNvbnN0YW50ID0gdGhpcy52YWx1ZUlmRmFsc2UuY29uc3RhbnQpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJLy8gYWxsIHRlcm1zIGFyZSBjb25zdGFudCBleHByZXNzaW9uIHNvIHdlIGNhbiBwcm9wYWdhdGUgdGhlIGNvbnN0YW50CiAJCQkvLyBmcm9tIHZhbHVlSUZUcnVlIG9yIHZhbHVlSWZGYWxzZSB0byB0aGUgcmVjZWl2ZXIgY29uc3RhbnQKLQkJCWNvbnN0YW50ID0gY29uZENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZUNvbnN0YW50IDogZmFsc2VDb25zdGFudDsKKwkJCXRoaXMuY29uc3RhbnQgPSBjb25kQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPyB0cnVlQ29uc3RhbnQgOiBmYWxzZUNvbnN0YW50OwogCQl9Ci0JCWlmICh2YWx1ZUlmVHJ1ZVR5cGUgPT0gdmFsdWVJZkZhbHNlVHlwZSkgeyAvLyBoYXJtZWQgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gCi0JCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZlRydWVUeXBlLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQl2YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZGYWxzZVR5cGUsIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSk7CisJCWlmICh2YWx1ZUlmVHJ1ZVR5cGUgPT0gdmFsdWVJZkZhbHNlVHlwZSkgeyAvLyBoYXJtZWQgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZUcnVlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUpOworCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZGYWxzZVR5cGUsIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSk7CiAJCQlpZiAodmFsdWVJZlRydWVUeXBlID09IFR5cGVCaW5kaW5nLkJPT0xFQU4pIHsKLQkJCQl0aGlzLm9wdGltaXplZElmVHJ1ZUNvbnN0YW50ID0gdmFsdWVJZlRydWUub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7Ci0JCQkJdGhpcy5vcHRpbWl6ZWRJZkZhbHNlQ29uc3RhbnQgPSB2YWx1ZUlmRmFsc2Uub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7Ci0JCQkJaWYgKHRoaXMub3B0aW1pemVkSWZUcnVlQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50IAorCQkJCXRoaXMub3B0aW1pemVkSWZUcnVlQ29uc3RhbnQgPSB0aGlzLnZhbHVlSWZUcnVlLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQkJCXRoaXMub3B0aW1pemVkSWZGYWxzZUNvbnN0YW50ID0gdGhpcy52YWx1ZUlmRmFsc2Uub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCQkJaWYgKHRoaXMub3B0aW1pemVkSWZUcnVlQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50CiAJCQkJCQkmJiB0aGlzLm9wdGltaXplZElmRmFsc2VDb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKIAkJCQkJCSYmIHRoaXMub3B0aW1pemVkSWZUcnVlQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdGhpcy5vcHRpbWl6ZWRJZkZhbHNlQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsKIAkJCQkJLy8gYSA/IHRydWUgOiB0cnVlICAvICAgYSA/IGZhbHNlIDogZmFsc2UKLQkJCQkJdGhpcy5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBvcHRpbWl6ZWRJZlRydWVDb25zdGFudDsKLQkJCQl9IGVsc2UgaWYgKChjb25kQ29uc3RhbnQgPSBjb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeyAvLyBQcm9wYWdhdGUgdGhlIG9wdGltaXplZCBib29sZWFuIGNvbnN0YW50IGlmIHBvc3NpYmxlCisJCQkJCXRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gdGhpcy5vcHRpbWl6ZWRJZlRydWVDb25zdGFudDsKKwkJCQl9IGVsc2UgaWYgKChjb25kQ29uc3RhbnQgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7IC8vIFByb3BhZ2F0ZSB0aGUgb3B0aW1pemVkIGJvb2xlYW4gY29uc3RhbnQgaWYgcG9zc2libGUKIAkJCQkJdGhpcy5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjb25kQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkKIAkJCQkJCT8gdGhpcy5vcHRpbWl6ZWRJZlRydWVDb25zdGFudAogCQkJCQkJOiB0aGlzLm9wdGltaXplZElmRmFsc2VDb25zdGFudDsKQEAgLTM5Nyw1MiArNDYxLDUyIEBACiAJCQkvLyAoU2hvcnQgeCBCeXRlKSBvciAoQnl0ZSB4IFNob3J0KSIKIAkJCWlmICgodmFsdWVJZlRydWVUeXBlID09IFR5cGVCaW5kaW5nLkJZVEUgJiYgdmFsdWVJZkZhbHNlVHlwZSA9PSBUeXBlQmluZGluZy5TSE9SVCkKIAkJCQl8fCAodmFsdWVJZlRydWVUeXBlID09IFR5cGVCaW5kaW5nLlNIT1JUICYmIHZhbHVlSWZGYWxzZVR5cGUgPT0gVHlwZUJpbmRpbmcuQllURSkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuU0hPUlQsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKLQkJCQl2YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLlNIT1JULCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLlNIT1JULCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLlNIT1JULCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOwogCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IFR5cGVCaW5kaW5nLlNIT1JUOwogCQkJfQogCQkJLy8gPEJ5dGV8U2hvcnR8Q2hhcj4geCBjb25zdGFudChJbnQpICAtLS0+IDxCeXRlfFNob3J0fENoYXI+ICAgYW5kIHJlY2lwcm9jYWxseQogCQkJaWYgKCh2YWx1ZUlmVHJ1ZVR5cGUgPT0gVHlwZUJpbmRpbmcuQllURSB8fCB2YWx1ZUlmVHJ1ZVR5cGUgPT0gVHlwZUJpbmRpbmcuU0hPUlQgfHwgdmFsdWVJZlRydWVUeXBlID09IFR5cGVCaW5kaW5nLkNIQVIpCiAJCQkJCSYmICh2YWx1ZUlmRmFsc2VUeXBlID09IFR5cGVCaW5kaW5nLklOVAotCQkJCQkJJiYgdmFsdWVJZkZhbHNlLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUodmFsdWVJZkZhbHNlVHlwZSwgdmFsdWVJZlRydWVUeXBlKSkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZlRydWVUeXBlLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQkJdmFsdWVJZkZhbHNlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB2YWx1ZUlmVHJ1ZVR5cGUsIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSk7CisJCQkJCQkmJiB0aGlzLnZhbHVlSWZGYWxzZS5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKHZhbHVlSWZGYWxzZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSkpKSB7CisJCQkJdGhpcy52YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZlRydWVUeXBlLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZUcnVlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB2YWx1ZUlmVHJ1ZVR5cGU7CiAJCQl9CiAJCQlpZiAoKHZhbHVlSWZGYWxzZVR5cGUgPT0gVHlwZUJpbmRpbmcuQllURQogCQkJCQl8fCB2YWx1ZUlmRmFsc2VUeXBlID09IFR5cGVCaW5kaW5nLlNIT1JUCiAJCQkJCXx8IHZhbHVlSWZGYWxzZVR5cGUgPT0gVHlwZUJpbmRpbmcuQ0hBUikKIAkJCQkJJiYgKHZhbHVlSWZUcnVlVHlwZSA9PSBUeXBlQmluZGluZy5JTlQKLQkJCQkJCSYmIHZhbHVlSWZUcnVlLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUodmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKSkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZkZhbHNlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUpOwotCQkJCXZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZkZhbHNlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKKwkJCQkJCSYmIHRoaXMudmFsdWVJZlRydWUuaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZGYWxzZVR5cGUpKSkgeworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZGYWxzZVR5cGUsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZkZhbHNlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB2YWx1ZUlmRmFsc2VUeXBlOwogCQkJfQogCQkJLy8gTWFudWFsIGJpbmFyeSBudW1lcmljIHByb21vdGlvbgogCQkJLy8gaW50CiAJCQlpZiAoQmFzZVR5cGVCaW5kaW5nLmlzTmFycm93aW5nKHZhbHVlSWZUcnVlVHlwZS5pZCwgVF9pbnQpCiAJCQkJCSYmIEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyh2YWx1ZUlmRmFsc2VUeXBlLmlkLCBUX2ludCkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuSU5ULCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQkJdmFsdWVJZkZhbHNlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy5JTlQsIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuSU5ULCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLklOVCwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBUeXBlQmluZGluZy5JTlQ7CiAJCQl9CiAJCQkvLyBsb25nCiAJCQlpZiAoQmFzZVR5cGVCaW5kaW5nLmlzTmFycm93aW5nKHZhbHVlSWZUcnVlVHlwZS5pZCwgVF9sb25nKQogCQkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9sb25nKSkgewotCQkJCXZhbHVlSWZUcnVlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy5MT05HLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQkJdmFsdWVJZkZhbHNlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy5MT05HLCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkxPTkcsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuTE9ORywgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBUeXBlQmluZGluZy5MT05HOwogCQkJfQogCQkJLy8gZmxvYXQKIAkJCWlmIChCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZlRydWVUeXBlLmlkLCBUX2Zsb2F0KQogCQkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9mbG9hdCkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuRkxPQVQsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKLQkJCQl2YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkZMT0FULCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkZMT0FULCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkZMT0FULCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOwogCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IFR5cGVCaW5kaW5nLkZMT0FUOwogCQkJfQogCQkJLy8gZG91YmxlCi0JCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgVHlwZUJpbmRpbmcuRE9VQkxFLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQl2YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkRPVUJMRSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKKwkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkRPVUJMRSwgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUpOworCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLkRPVUJMRSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IFR5cGVCaW5kaW5nLkRPVUJMRTsKIAkJfQogCQkvLyBUeXBlIHJlZmVyZW5jZXMgKG51bGwgbnVsbCBpcyBhbHJlYWR5IHRlc3RlZCkKQEAgLTQ1Myw3ICs1MTcsNyBAQAogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbmRpdGlvbmFsQXJndW1lbnRzSW5jb21wYXRpYmxlVHlwZXModGhpcywgdmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KLQkJfSAKKwkJfQogCQlpZiAodmFsdWVJZkZhbHNlVHlwZS5pc0Jhc2VUeXBlKCkgJiYgdmFsdWVJZkZhbHNlVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMKSB7CiAJCQlpZiAodXNlMTVzcGVjaWZpY3MpIHsKIAkJCQl2YWx1ZUlmRmFsc2VUeXBlID0gZW52LmNvbXB1dGVCb3hpbmdUeXBlKHZhbHVlSWZGYWxzZVR5cGUpOwpAQCAtNDczLDE5ICs1MzcsMTkgQEAKIAkJCQljb21tb25UeXBlID0gc2NvcGUubG93ZXJVcHBlckJvdW5kKG5ldyBUeXBlQmluZGluZ1tdIHsgdmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlIH0pOwogCQkJfQogCQkJaWYgKGNvbW1vblR5cGUgIT0gbnVsbCkgewotCQkJCXZhbHVlSWZUcnVlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBjb21tb25UeXBlLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7Ci0JCQkJdmFsdWVJZkZhbHNlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBjb21tb25UeXBlLCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudmFsdWVJZlRydWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIGNvbW1vblR5cGUsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgY29tbW9uVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBjb21tb25UeXBlLmNhcHR1cmUoc2NvcGUsIHRoaXMuc291cmNlRW5kKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIDwgMS41IDogb25lIG9wZXJhbmQgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byB0aGUgb3RoZXIKIAkJCWlmICh2YWx1ZUlmRmFsc2VUeXBlLmlzQ29tcGF0aWJsZVdpdGgodmFsdWVJZlRydWVUeXBlKSkgewotCQkJCXZhbHVlSWZUcnVlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB2YWx1ZUlmVHJ1ZVR5cGUsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKLQkJCQl2YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZUcnVlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZUcnVlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB2YWx1ZUlmVHJ1ZVR5cGUsIG9yaWdpbmFsVmFsdWVJZlRydWVUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZlRydWVUeXBlLCBvcmlnaW5hbFZhbHVlSWZGYWxzZVR5cGUpOwogCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHZhbHVlSWZUcnVlVHlwZTsKIAkJCX0gZWxzZSBpZiAodmFsdWVJZlRydWVUeXBlLmlzQ29tcGF0aWJsZVdpdGgodmFsdWVJZkZhbHNlVHlwZSkpIHsKLQkJCQl2YWx1ZUlmVHJ1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZkZhbHNlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmVHJ1ZVR5cGUpOwotCQkJCXZhbHVlSWZGYWxzZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFsdWVJZkZhbHNlVHlwZSwgb3JpZ2luYWxWYWx1ZUlmRmFsc2VUeXBlKTsKKwkJCQl0aGlzLnZhbHVlSWZUcnVlLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB2YWx1ZUlmRmFsc2VUeXBlLCBvcmlnaW5hbFZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdGhpcy52YWx1ZUlmRmFsc2UuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhbHVlSWZGYWxzZVR5cGUsIG9yaWdpbmFsVmFsdWVJZkZhbHNlVHlwZSk7CiAJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdmFsdWVJZkZhbHNlVHlwZTsKIAkJCX0KIAkJfQpAQCAtNDk1LDEyICs1NTksMTIgQEAKIAkJCXZhbHVlSWZGYWxzZVR5cGUpOwogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCQljb25kaXRpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJdmFsdWVJZlRydWUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJdmFsdWVJZkZhbHNlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCXRoaXMuY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCXRoaXMudmFsdWVJZlRydWUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJdGhpcy52YWx1ZUlmRmFsc2UudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKaW5kZXggZGQyMjJkNy4uZTdjNzkwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgQnVnIDM0MzcxMyAtIFtjb21waWxlcl0gYm9ndXMgbGluZSBudW1iZXIgaW4gY29uc3RydWN0b3Igb2YgaW5uZXIgY2xhc3MgaW4gMS41IGNvbXBsaWFuY2UKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0yMCw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB7CiAKQEAgLTMxLDcgKzMzLDcgQEAKIAlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CiB9CiAKLS8qKiAKKy8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24jYW5hbHlzZUNvZGUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbykKICAqIEBkZXByZWNhdGVkIHVzZSBpbnN0ZWFkIHtAbGluayAjYW5hbHlzZUNvZGUoQ2xhc3NTY29wZSwgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCwgRmxvd0luZm8sIGludCl9CiAgKi8KQEAgLTQ5LDcgKzUxLDcgQEAKIAogCWludCBub25TdGF0aWNGaWVsZEluZm9SZWFjaE1vZGUgPSBmbG93SW5mby5yZWFjaE1vZGUoKTsKIAlmbG93SW5mby5zZXRSZWFjaE1vZGUoaW5pdGlhbFJlYWNoTW9kZSk7Ci0JCisKIAljaGVja1VudXNlZDogewogCQlNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yQmluZGluZzsKIAkJaWYgKChjb25zdHJ1Y3RvckJpbmRpbmcgPSB0aGlzLmJpbmRpbmcpID09IG51bGwpIGJyZWFrIGNoZWNrVW51c2VkOwpAQCAtNTgsMjQgKzYwLDQ2IEBACiAJCWlmIChjb25zdHJ1Y3RvckJpbmRpbmcuaXNQcml2YXRlKCkpIHsKIAkJCWlmICgodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc05vblByaXZhdGVDb25zdHJ1Y3RvcikgPT0gMCkKIAkJCQlicmVhayBjaGVja1VudXNlZDsgLy8gdG9sZXJhdGUgYXMga25vd24gcGF0dGVybiB0byBibG9jayBpbnN0YW50aWF0aW9uCi0JCX0gZWxzZSBpZiAoKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy50YWdCaXRzICYgKFRhZ0JpdHMuSXNBbm9ueW1vdXNUeXBlfFRhZ0JpdHMuSXNMb2NhbFR5cGUpKSAhPSBUYWdCaXRzLklzTG9jYWxUeXBlKSB7CisJCX0gZWxzZSBpZiAoIWNvbnN0cnVjdG9yQmluZGluZy5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkpIHsKIAkJCWJyZWFrIGNoZWNrVW51c2VkOworIAkJfQorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwNDQ2LCBXaGVuIHRoZSBBU1QgYnVpbHQgaXMgYW4gYWJyaWRnZWQgdmVyc2lvbgorCQkvLyB3ZSBkb24ndCBoYXZlIGFsbCB0cmVlIG5vZGVzIHdlIHdvdWxkIG90aGVyd2lzZSBleHBlY3QuIChzZWUgQVNUUGFyc2VyLnNldEZvY2FsUG9zaXRpb24pCisJCWlmICh0aGlzLmNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsKQorCQkJYnJlYWsgY2hlY2tVbnVzZWQ7IAorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0OTkxLCBEb24ndCBjb21wbGFpbiBhYm91dCB0aGlzCisJCS8vIGNvbnN0cnVjdG9yIGJlaW5nIHVudXNlZCBpZiB0aGUgYmFzZSBjbGFzcyBkb2Vzbid0IGhhdmUgYSBuby1hcmcgY29uc3RydWN0b3IuCisJCS8vIFNlZSB0aGF0IGEgc2VlbWluZ2x5IHVudXNlZCBjb25zdHJ1Y3RvciB0aGF0IGNoYWlucyB0byBhbm90aGVyIGNvbnN0cnVjdG9yIHdpdGggYQorCQkvLyB0aGlzKC4uLikgY2FuIGJlIGZsYWdnZWQgYXMgYmVpbmcgdW51c2VkIHdpdGhvdXQgaGVzaXRhdGlvbi4KKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NTE0MgorCQlpZiAodGhpcy5jb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyQ2xhc3MgPSBjb25zdHJ1Y3RvckJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc3VwZXJjbGFzcygpOworCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkKKwkJCQlicmVhayBjaGVja1VudXNlZDsKKwkJCS8vIHNlZSBpZiB0aGVyZSBpcyBhIG5vLWFyZyBzdXBlciBjb25zdHJ1Y3RvcgorCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gc3VwZXJDbGFzcy5nZXRFeGFjdENvbnN0cnVjdG9yKEJpbmRpbmcuTk9fUEFSQU1FVEVSUyk7CisJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKQorCQkJCWJyZWFrIGNoZWNrVW51c2VkOworCQkJaWYgKCFtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKSwgdGhpcy5zY29wZSkpCisJCQkJYnJlYWsgY2hlY2tVbnVzZWQ7CisJCQkvLyBvdGhlcndpc2UgZGVmYXVsdCBzdXBlciBjb25zdHJ1Y3RvciBleGlzdHMsIHNvIGdvIGFoZWFkIGFuZCBjb21wbGFpbiB1bnVzZWQuCiAJCX0KIAkJLy8gY29tcGxhaW4gdW51c2VkCiAJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZUNvbnN0cnVjdG9yKHRoaXMpOwogCX0KLQkJCisKIAkvLyBjaGVjayBjb25zdHJ1Y3RvciByZWN1cnNpb24sIG9uY2UgYWxsIGNvbnN0cnVjdG9yIGdvdCByZXNvbHZlZAotCWlmIChpc1JlY3Vyc2l2ZShudWxsIC8qbGF6eSBpbml0aWFsaXplZCB2aXNpdGVkIGxpc3QqLykpIHsJCQkJCisJaWYgKGlzUmVjdXJzaXZlKG51bGwgLypsYXp5IGluaXRpYWxpemVkIHZpc2l0ZWQgbGlzdCovKSkgewogCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzLmNvbnN0cnVjdG9yQ2FsbCk7CiAJfQotCQkKKwogCXRyeSB7CiAJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgY29uc3RydWN0b3JDb250ZXh0ID0KIAkJCW5ldyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KAogCQkJCWluaXRpYWxpemVyRmxvd0NvbnRleHQucGFyZW50LAogCQkJCXRoaXMsCiAJCQkJdGhpcy5iaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsCisJCQkJaW5pdGlhbGl6ZXJGbG93Q29udGV4dCwKIAkJCQl0aGlzLnNjb3BlLAogCQkJCUZsb3dJbmZvLkRFQURfRU5EKTsKIAkJaW5pdGlhbGl6ZXJGbG93Q29udGV4dC5jaGVja0luaXRpYWxpemVyRXhjZXB0aW9ucygKQEAgLTk1LDE0ICsxMTksMTQgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gdGFnIHBhcmFtZXRlcnMgYXMgYmVpbmcgc2V0CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKHRoaXMuYXJndW1lbnRzW2ldLmJpbmRpbmcpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIHByb3BhZ2F0ZSB0byBjb25zdHJ1Y3RvciBjYWxsCiAJCWlmICh0aGlzLmNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CiAJCQkvLyBpZiBjYWxsaW5nICd0aGlzKC4uLiknLCB0aGVuIGZsYWcgYWxsIG5vbi1zdGF0aWMgZmllbGRzIGFzIGRlZmluaXRlbHkKQEAgLTExOCwyOSArMTQyLDI5IEBACiAJCQl9CiAJCQlmbG93SW5mbyA9IHRoaXMuY29uc3RydWN0b3JDYWxsLmFuYWx5c2VDb2RlKHRoaXMuc2NvcGUsIGNvbnN0cnVjdG9yQ29udGV4dCwgZmxvd0luZm8pOwogCQl9Ci0JCQorCiAJCS8vIHJldXNlIHRoZSByZWFjaE1vZGUgZnJvbSBub24gc3RhdGljIGZpZWxkIGluZm8KIAkJZmxvd0luZm8uc2V0UmVhY2hNb2RlKG5vblN0YXRpY0ZpZWxkSW5mb1JlYWNoTW9kZSk7CiAKIAkJLy8gcHJvcGFnYXRlIHRvIHN0YXRlbWVudHMKIAkJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbiA9IGZhbHNlOworCQkJaW50IGNvbXBsYWludExldmVsID0gKG5vblN0YXRpY0ZpZWxkSW5mb1JlYWNoTW9kZSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwID8gU3RhdGVtZW50Lk5PVF9DT01QTEFJTkVEIDogU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEU7CiAJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLnN0YXRlbWVudHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewogCQkJCVN0YXRlbWVudCBzdGF0ID0gdGhpcy5zdGF0ZW1lbnRzW2ldOwotCQkJCWlmICghc3RhdC5jb21wbGFpbklmVW5yZWFjaGFibGUoZmxvd0luZm8sIHRoaXMuc2NvcGUsIGRpZEFscmVhZHlDb21wbGFpbikpIHsKKwkJCQlpZiAoKGNvbXBsYWludExldmVsID0gc3RhdC5jb21wbGFpbklmVW5yZWFjaGFibGUoZmxvd0luZm8sIHRoaXMuc2NvcGUsIGNvbXBsYWludExldmVsKSkgPCBTdGF0ZW1lbnQuQ09NUExBSU5FRF9VTlJFQUNIQUJMRSkgewogCQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUodGhpcy5zY29wZSwgY29uc3RydWN0b3JDb250ZXh0LCBmbG93SW5mbyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gdHJ1ZTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJLy8gY2hlY2sgZm9yIG1pc3NpbmcgcmV0dXJuaW5nIHBhdGgKLQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKKwkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgPT0gMCkgewogCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuTmVlZEZyZWVSZXR1cm47CiAJCX0KIAogCQkvLyByZXVzZSB0aGUgaW5pdGlhbCByZWFjaCBtb2RlIGZvciBkaWFnbm9zaW5nIG1pc3NpbmcgYmxhbmsgZmluYWxzCi0JCWZsb3dJbmZvLnNldFJlYWNoTW9kZShpbml0aWFsUmVhY2hNb2RlKTsJCQorCQkvLyBubywgd2Ugc2hvdWxkIHVzZSB0aGUgdXBkYXRlZCByZWFjaCBtb2RlIGZvciBkaWFnbm9zaW5nIHVuaW5pdGlhbGl6ZWQgYmxhbmsgZmluYWxzLgorCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTc4MQorCQkvLyBmbG93SW5mby5zZXRSZWFjaE1vZGUoaW5pdGlhbFJlYWNoTW9kZSk7CiAKIAkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMKIAkJaWYgKCh0aGlzLmNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKQpAQCAtMTYwLDYgKzE4NCw4IEBACiAJCX0KIAkJLy8gY2hlY2sgdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2tzCiAJCWNvbnN0cnVjdG9yQ29udGV4dC5jb21wbGFpbklmVW51c2VkRXhjZXB0aW9uSGFuZGxlcnModGhpcyk7CisJCS8vIGNoZWNrIHVudXNlZCBwYXJhbWV0ZXJzCisJCXRoaXMuc2NvcGUuY2hlY2tVbnVzZWRQYXJhbWV0ZXJzKHRoaXMuYmluZGluZyk7CiAJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgewogCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKIAl9CkBAIC0xODQsNTcgKzIxMCw3MSBAQAogCQljbGFzc0ZpbGUuYWRkUHJvYmxlbUNvbnN0cnVjdG9yKHRoaXMsIHRoaXMuYmluZGluZywgcHJvYmxlbXNDb3B5KTsKIAkJcmV0dXJuOwogCX0KLQl0cnkgewotCQlwcm9ibGVtUmVzZXRQQyA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKLQkJdGhpcy5pbnRlcm5hbEdlbmVyYXRlQ29kZShjbGFzc1Njb3BlLCBjbGFzc0ZpbGUpOwotCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUpIHsKLQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgewotCQkJLy8gYSBicmFuY2ggdGFyZ2V0IHJlcXVpcmVkIGEgZ290b193LCByZXN0YXJ0IGNvZGUgZ2VuIGluIHdpZGUgbW9kZS4KLQkJCXRyeSB7CisJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7CisJYm9vbGVhbiBhYm9ydCA9IGZhbHNlOworCWRvIHsKKwkJdHJ5IHsKKwkJCXByb2JsZW1SZXNldFBDID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OworCQkJaW50ZXJuYWxHZW5lcmF0ZUNvZGUoY2xhc3NTY29wZSwgY2xhc3NGaWxlKTsKKwkJCXJlc3RhcnQgPSBmYWxzZTsKKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgeworCQkJCS8vIGEgYnJhbmNoIHRhcmdldCByZXF1aXJlZCBhIGdvdG9fdywgcmVzdGFydCBjb2RlIGdlbiBpbiB3aWRlIG1vZGUuCisJCQkJaWYgKCFyZXN0YXJ0KSB7CisJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IHByb2JsZW1SZXNldFBDOworCQkJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKKwkJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ucmVzZXRJbldpZGVNb2RlKCk7IC8vIHJlcXVlc3Qgd2lkZSBtb2RlCisJCQkJCXJlc3RhcnQgPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3RhcnQgPSBmYWxzZTsKKwkJCQkJYWJvcnQgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZS5jb21waWxhdGlvblJlc3VsdCA9PSBDb2RlU3RyZWFtLlJFU1RBUlRfQ09ERV9HRU5fRk9SX1VOVVNFRF9MT0NBTFNfTU9ERSkgewogCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IHByb2JsZW1SZXNldFBDOwogCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOwotCQkJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLndpZGVNb2RlID0gdHJ1ZTsgLy8gcmVxdWVzdCB3aWRlIG1vZGUgCi0JCQkJdGhpcy5pbnRlcm5hbEdlbmVyYXRlQ29kZShjbGFzc1Njb3BlLCBjbGFzc0ZpbGUpOyAvLyByZXN0YXJ0IG1ldGhvZCBnZW5lcmF0aW9uCi0JCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlMikgewotCQkJCWludCBwcm9ibGVtc0xlbmd0aDsKLQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcyA9Ci0JCQkJCXRoaXMuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0QWxsUHJvYmxlbXMoKTsKLQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKLQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbUNvbnN0cnVjdG9yKHRoaXMsIHRoaXMuYmluZGluZywgcHJvYmxlbXNDb3B5LCBwcm9ibGVtUmVzZXRQQyk7CisJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ucmVzZXRGb3JDb2RlR2VuVW51c2VkTG9jYWxzKCk7CisJCQkJcmVzdGFydCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnQgPSBmYWxzZTsKKwkJCQlhYm9ydCA9IHRydWU7CiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcHJvYmxlbXNMZW5ndGg7Ci0JCQlDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtcyA9Ci0JCQkJdGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpOwotCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVtwcm9ibGVtc0xlbmd0aCA9IHByb2JsZW1zLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKLQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nLCBwcm9ibGVtc0NvcHksIHByb2JsZW1SZXNldFBDKTsKIAkJfQorCX0gd2hpbGUgKHJlc3RhcnQpOworCWlmIChhYm9ydCkgeworCQlpbnQgcHJvYmxlbXNMZW5ndGg7CisJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zID0KKwkJCQl0aGlzLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7CisJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zQ29weSA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKKwkJY2xhc3NGaWxlLmFkZFByb2JsZW1Db25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOwogCX0KIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNGaWVsZEluaXRpYWxpemF0aW9uc0lmTmVjZXNzYXJ5KE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKIAlpZiAoIWRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSByZXR1cm47Ci0JCisKIAlOZXN0ZWRUeXBlQmluZGluZyBuZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKIAogCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3MgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOwotCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmdzID09IG51bGwgPyAwIDogc3ludGhldGljQXJncy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOwotCQlpZiAoKHN5bnRoZXRpY0FyZyA9IHN5bnRoZXRpY0FyZ3NbaV0pLm1hdGNoaW5nRmllbGQgIT0gbnVsbCkgewotCQkJY29kZVN0cmVhbS5hbG9hZF8wKCk7Ci0JCQljb2RlU3RyZWFtLmxvYWQoc3ludGhldGljQXJnKTsKLQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoc3ludGhldGljQXJnLm1hdGNoaW5nRmllbGQpOworCWlmIChzeW50aGV0aWNBcmdzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmc7CisJCQlpZiAoKHN5bnRoZXRpY0FyZyA9IHN5bnRoZXRpY0FyZ3NbaV0pLm1hdGNoaW5nRmllbGQgIT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCQkJCWNvZGVTdHJlYW0ubG9hZChzeW50aGV0aWNBcmcpOworCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfcHV0ZmllbGQsIHN5bnRoZXRpY0FyZy5tYXRjaGluZ0ZpZWxkLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCQkJfQogCQl9CiAJfQogCXN5bnRoZXRpY0FyZ3MgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJncyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZzsKLQkJaWYgKChzeW50aGV0aWNBcmcgPSBzeW50aGV0aWNBcmdzW2ldKS5tYXRjaGluZ0ZpZWxkICE9IG51bGwpIHsKLQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwotCQkJY29kZVN0cmVhbS5sb2FkKHN5bnRoZXRpY0FyZyk7Ci0JCQljb2RlU3RyZWFtLnB1dGZpZWxkKHN5bnRoZXRpY0FyZy5tYXRjaGluZ0ZpZWxkKTsKKwlpZiAoc3ludGhldGljQXJncyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOworCQkJaWYgKChzeW50aGV0aWNBcmcgPSBzeW50aGV0aWNBcmdzW2ldKS5tYXRjaGluZ0ZpZWxkICE9IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQljb2RlU3RyZWFtLmxvYWQoc3ludGhldGljQXJnKTsKKwkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX3B1dGZpZWxkLCBzeW50aGV0aWNBcmcubWF0Y2hpbmdGaWVsZCwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKKwkJCX0KIAkJfQogCX0KIH0KQEAgLTI0Miw5ICsyODIsOSBAQAogcHJpdmF0ZSB2b2lkIGludGVybmFsR2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgewogCWNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIodGhpcy5iaW5kaW5nKTsKIAlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OwotCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBjbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKHRoaXMuYmluZGluZyk7CisJaW50IGF0dHJpYnV0ZU51bWJlciA9IGNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGVzKHRoaXMuYmluZGluZyk7CiAJaWYgKCghdGhpcy5iaW5kaW5nLmlzTmF0aXZlKCkpICYmICghdGhpcy5iaW5kaW5nLmlzQWJzdHJhY3QoKSkpIHsKLQkJCisKIAkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQ7CiAJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OwogCQljbGFzc0ZpbGUuZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CkBAIC0yNTgsMzIgKzI5OCwzNCBAQAogCQlpbnQgYXJnU2xvdFNpemUgPSAxICsgZW51bU9mZnNldDsgLy8gdGhpcz09YWxvYWQwCiAKIAkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKXsKLQkJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOwotCQkJdGhpcy5zY29wZS5leHRyYVN5bnRoZXRpY0FyZ3VtZW50cyA9IG5lc3RlZFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQkJdGhpcy5zY29wZS5leHRyYVN5bnRoZXRpY0FyZ3VtZW50cyA9IGRlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKIAkJCXRoaXMuc2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoLy8gY29uc2lkZXIgc3ludGhldGljIGFyZ3VtZW50cyBpZiBhbnkKLQkJCQluZXN0ZWRUeXBlLmVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplICsgMSArIGVudW1PZmZzZXQsCisJCQkJCWRlY2xhcmluZ0NsYXNzLmdldEVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplKCkgKyAxICsgZW51bU9mZnNldCwKIAkJCQljb2RlU3RyZWFtKTsKLQkJCWFyZ1Nsb3RTaXplICs9IG5lc3RlZFR5cGUuZW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemU7Ci0JCQlhcmdTbG90U2l6ZSArPSBuZXN0ZWRUeXBlLm91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZTsKKwkJCWFyZ1Nsb3RTaXplICs9IGRlY2xhcmluZ0NsYXNzLmdldEVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplKCk7CisJCQlhcmdTbG90U2l6ZSArPSBkZWNsYXJpbmdDbGFzcy5nZXRPdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUoKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuc2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoMSArIGVudW1PZmZzZXQsICBjb2RlU3RyZWFtKTsKIAkJfQotCQkJCisKIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCS8vIGFyZ3VtZW50cyBpbml0aWFsaXphdGlvbiBmb3IgbG9jYWwgdmFyaWFibGUgZGVidWcgYXR0cmlidXRlcwogCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGFyZ0JpbmRpbmc7CiAJCQkJY29kZVN0cmVhbS5hZGRWaXNpYmxlTG9jYWxWYXJpYWJsZShhcmdCaW5kaW5nID0gdGhpcy5hcmd1bWVudHNbaV0uYmluZGluZyk7CiAJCQkJYXJnQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoMCk7Ci0JCQkJVHlwZUJpbmRpbmcgYXJnVHlwZTsKLQkJCQlpZiAoKGFyZ1R5cGUgPSBhcmdCaW5kaW5nLnR5cGUpID09IFR5cGVCaW5kaW5nLkxPTkcgfHwgKGFyZ1R5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQlhcmdTbG90U2l6ZSArPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFyZ1Nsb3RTaXplKys7CisJCQkJc3dpdGNoKGFyZ0JpbmRpbmcudHlwZS5pZCkgeworCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCWFyZ1Nsb3RTaXplICs9IDI7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlhcmdTbG90U2l6ZSsrOworCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCU1ldGhvZFNjb3BlIGluaXRpYWxpemVyU2NvcGUgPSBkZWNsYXJpbmdUeXBlLmluaXRpYWxpemVyU2NvcGU7CiAJCWluaXRpYWxpemVyU2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoYXJnU2xvdFNpemUsIGNvZGVTdHJlYW0pOyAvLyBvZmZzZXQgYnkgdGhlIGFyZ3VtZW50IHNpemUgKHNpbmNlIG5vdCBsaW5rZWQgdG8gbWV0aG9kIHNjb3BlKQogCkBAIC0yOTQsNiArMzM2LDcgQEAKIAogCQlpZiAobmVlZEZpZWxkSW5pdGlhbGl6YXRpb25zICYmIHByZUluaXRTeW50aGV0aWNGaWVsZHMpewogCQkJZ2VuZXJhdGVTeW50aGV0aWNGaWVsZEluaXRpYWxpemF0aW9uc0lmTmVjZXNzYXJ5KHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0sIGRlY2xhcmluZ0NsYXNzKTsKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbSgwLCB0aGlzLmJvZHlTdGFydCk7CiAJCX0KIAkJLy8gZ2VuZXJhdGUgY29uc3RydWN0b3IgY2FsbAogCQlpZiAodGhpcy5jb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgewpAQCAtMzIwLDIxICszNjMsMjkgQEAKIAkJCQl0aGlzLnN0YXRlbWVudHNbaV0uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0pOwogCQkJfQogCQl9CisJCS8vIGlmIGEgcHJvYmxlbSBnb3QgcmVwb3J0ZWQgZHVyaW5nIGNvZGUgZ2VuLCB0aGVuIHRyaWdnZXIgcHJvYmxlbSBtZXRob2QgY3JlYXRpb24KKwkJaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJCXRocm93IG5ldyBBYm9ydE1ldGhvZCh0aGlzLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LCBudWxsKTsKKwkJfQogCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuTmVlZEZyZWVSZXR1cm4pICE9IDApIHsKIAkJCWNvZGVTdHJlYW0ucmV0dXJuXygpOwogCQl9CiAJCS8vIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKIAkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHRoaXMuc2NvcGUpOwogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oMCwgdGhpcy5ib2R5RW5kKTsKLQkJY2xhc3NGaWxlLmNvbXBsZXRlQ29kZUF0dHJpYnV0ZShjb2RlQXR0cmlidXRlT2Zmc2V0KTsKKwkJdHJ5IHsKKwkJCWNsYXNzRmlsZS5jb21wbGV0ZUNvZGVBdHRyaWJ1dGUoY29kZUF0dHJpYnV0ZU9mZnNldCk7CisJCX0gY2F0Y2goTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHRoaXMuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQsIG51bGwpOworCQl9CiAJCWF0dHJpYnV0ZU51bWJlcisrOworCQlpZiAoKGNvZGVTdHJlYW0gaW5zdGFuY2VvZiBTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkKKwkJCQkmJiBuZWVkRmllbGRJbml0aWFsaXphdGlvbnMKKwkJCQkmJiBkZWNsYXJpbmdUeXBlLmZpZWxkcyAhPSBudWxsKSB7CisJCQkoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5yZXNldFNlY3JldExvY2FscygpOworCQl9CiAJfQotCWNsYXNzRmlsZS5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwotCi0JLy8gaWYgYSBwcm9ibGVtIGdvdCByZXBvcnRlZCBkdXJpbmcgY29kZSBnZW4sIHRoZW4gdHJpZ2dlciBwcm9ibGVtIG1ldGhvZCBjcmVhdGlvbgotCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7Ci0JCXRocm93IG5ldyBBYm9ydE1ldGhvZCh0aGlzLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LCBudWxsKTsKLQl9CisJY2xhc3NGaWxlLmNvbXBsZXRlTWV0aG9kSW5mbyh0aGlzLmJpbmRpbmcsIG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKIH0KIAogcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKQEAgLTM2Miw4ICs0MTMsOCBAQAogCQkJfHwgIXRoaXMuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQotCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gdGFyZ2V0Q29uc3RydWN0b3IgPSAKKworCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gdGFyZ2V0Q29uc3RydWN0b3IgPQogCQkoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pdGhpcy5zY29wZS5yZWZlcmVuY2VUeXBlKCkuZGVjbGFyYXRpb25PZih0aGlzLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLm9yaWdpbmFsKCkpKTsKIAlpZiAodGhpcyA9PSB0YXJnZXRDb25zdHJ1Y3RvcikgcmV0dXJuIHRydWU7IC8vIGRpcmVjdCBjYXNlCiAKQEAgLTM4MCwxNSArNDMxLDEzIEBACiAKIHB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cyhQYXJzZXIgcGFyc2VyLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CiAJLy9maWxsIHVwIHRoZSBjb25zdHJ1Y3RvciBib2R5IHdpdGggaXRzIHN0YXRlbWVudHMKLQlpZiAodGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKLQkJcmV0dXJuOwogCWlmICgoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNEZWZhdWx0Q29uc3RydWN0b3IpICE9IDApICYmIHRoaXMuY29uc3RydWN0b3JDYWxsID09IG51bGwpewogCQl0aGlzLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKIAkJdGhpcy5jb25zdHJ1Y3RvckNhbGwuc291cmNlU3RhcnQgPSB0aGlzLnNvdXJjZVN0YXJ0OwotCQl0aGlzLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZDsgCisJCXRoaXMuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHRoaXMuc291cmNlRW5kOwogCQlyZXR1cm47CiAJfQotCXBhcnNlci5wYXJzZSh0aGlzLCB1bml0KTsKKwlwYXJzZXIucGFyc2UodGhpcywgdW5pdCwgZmFsc2UpOwogCiB9CiAKQEAgLTQxMyw3ICs0NjIsMjAgQEAKIAlpZiAodGhpcy5iaW5kaW5nID09IG51bGwgfHwgdGhpcy5qYXZhZG9jICE9IG51bGwpIHsKIAkJc3VwZXIucmVzb2x2ZUphdmFkb2MoKTsKIAl9IGVsc2UgaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzRGVmYXVsdENvbnN0cnVjdG9yKSA9PSAwKSB7Ci0JCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY01pc3NpbmcodGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQsIHRoaXMuYmluZGluZy5tb2RpZmllcnMpOworCQlpZiAodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgIXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSB7CisJCQkvLyBTZXQgamF2YWRvYyB2aXNpYmlsaXR5CisJCQlpbnQgamF2YWRvY1Zpc2liaWxpdHkgPSB0aGlzLmJpbmRpbmcubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NWaXNpYmlsaXR5TUFTSzsKKwkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSA9IHRoaXMuc2NvcGUuY2xhc3NTY29wZSgpOworCQkJUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyID0gdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKTsKKwkJCWludCBzZXZlcml0eSA9IHJlcG9ydGVyLmNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5KYXZhZG9jTWlzc2luZyk7CisJCQlpZiAoc2V2ZXJpdHkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CisJCQkJaWYgKGNsYXNzU2NvcGUgIT0gbnVsbCkgeworCQkJCQlqYXZhZG9jVmlzaWJpbGl0eSA9IFV0aWwuY29tcHV0ZU91dGVyTW9zdFZpc2liaWxpdHkoY2xhc3NTY29wZS5yZWZlcmVuY2VUeXBlKCksIGphdmFkb2NWaXNpYmlsaXR5KTsKKwkJCQl9CisJCQkJaW50IGphdmFkb2NNb2RpZmllcnMgPSAodGhpcy5iaW5kaW5nLm1vZGlmaWVycyAmIH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1Zpc2liaWxpdHlNQVNLKSB8IGphdmFkb2NWaXNpYmlsaXR5OworCQkJCXJlcG9ydGVyLmphdmFkb2NNaXNzaW5nKHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kLCBzZXZlcml0eSwgamF2YWRvY01vZGlmaWVycyk7CisJCQl9CisJCX0KIAl9CiB9CiAKQEAgLTQ0NSwxNSArNTA3LDE1IEBACiAJCQl0aGlzLmNvbnN0cnVjdG9yQ2FsbCA9IG51bGw7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKHRoaXMuc2NvcGUpOwotCQl9CQorCQl9CiAJfQogCWlmICgodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1NlbWljb2xvbkJvZHkpICE9IDApIHsKLQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tZXRob2ROZWVkQm9keSh0aGlzKTsJCQorCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1ldGhvZE5lZWRCb2R5KHRoaXMpOwogCX0KIAlzdXBlci5yZXNvbHZlU3RhdGVtZW50cygpOwogfQogCi1wdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsCUNsYXNzU2NvcGUgY2xhc3NTY29wZSkgeworcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBjbGFzc1Njb3BlKSkgewogCQlpZiAodGhpcy5qYXZhZG9jICE9IG51bGwpIHsKIAkJCXRoaXMuamF2YWRvYy50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKQEAgLTQ2OCw3ICs1MzAsNyBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVyc0xlbmd0aDsgaSsrKSB7CiAJCQkJdGhpcy50eXBlUGFyYW1ldGVyc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KLQkJfQkJCQorCQl9CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlpbnQgYXJndW1lbnRMZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspCkBAIC00OTEsNSArNTUzLDUgQEAKIH0KIHB1YmxpYyBUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMoKSB7CiAgICAgcmV0dXJuIHRoaXMudHlwZVBhcmFtZXRlcnM7Ci19CQkKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWVTdGF0ZW1lbnQuamF2YQppbmRleCBhZTVkYjUzLi4xNjQxYmM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnRpbnVlU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db250aW51ZVN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI2LDE4ICsyNiwxOCBAQAogCS8vIHRvIGVhY2ggb2YgdGhlIHRyYXZlcnNlZCB0cnkgc3RhdGVtZW50cywgc28gdGhhdCBleGVjdXRpb24gd2lsbCB0ZXJtaW5hdGUgcHJvcGVybHkuCiAKIAkvLyBsb29rdXAgdGhlIGxhYmVsLCB0aGlzIHNob3VsZCBhbnN3ZXIgdGhlIHJldHVybkNvbnRleHQKLQlGbG93Q29udGV4dCB0YXJnZXRDb250ZXh0ID0gKGxhYmVsID09IG51bGwpCisJRmxvd0NvbnRleHQgdGFyZ2V0Q29udGV4dCA9ICh0aGlzLmxhYmVsID09IG51bGwpCiAJCQk/IGZsb3dDb250ZXh0LmdldFRhcmdldENvbnRleHRGb3JEZWZhdWx0Q29udGludWUoKQotCQkJOiBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yQ29udGludWVMYWJlbChsYWJlbCk7CisJCQk6IGZsb3dDb250ZXh0LmdldFRhcmdldENvbnRleHRGb3JDb250aW51ZUxhYmVsKHRoaXMubGFiZWwpOwogCiAJaWYgKHRhcmdldENvbnRleHQgPT0gbnVsbCkgewotCQlpZiAobGFiZWwgPT0gbnVsbCkgeworCQlpZiAodGhpcy5sYWJlbCA9PSBudWxsKSB7CiAJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnRpbnVlKHRoaXMpOwogCQl9IGVsc2UgewotCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOyAKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmRlZmluZWRMYWJlbCh0aGlzKTsKIAkJfQotCQlyZXR1cm4gZmxvd0luZm87IC8vIHByZXRlbmQgaXQgZGlkIG5vdCBjb250aW51ZSBzaW5jZSBubyBhY3R1YWwgdGFyZ2V0CQkJCi0JfSAKKwkJcmV0dXJuIGZsb3dJbmZvOyAvLyBwcmV0ZW5kIGl0IGRpZCBub3QgY29udGludWUgc2luY2Ugbm8gYWN0dWFsIHRhcmdldAorCX0KIAogCWlmICh0YXJnZXRDb250ZXh0ID09IEZsb3dDb250ZXh0Lk5vdENvbnRpbnVhYmxlQ29udGV4dCkgewogCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnRpbnVlKHRoaXMpOwpAQCAtNDYsMTggKzQ2LDE4IEBACiAJdGhpcy5pbml0U3RhdGVJbmRleCA9CiAJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKIAotCXRhcmdldExhYmVsID0gdGFyZ2V0Q29udGV4dC5jb250aW51ZUxhYmVsKCk7CisJdGhpcy50YXJnZXRMYWJlbCA9IHRhcmdldENvbnRleHQuY29udGludWVMYWJlbCgpOwogCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSBmbG93Q29udGV4dDsKIAlpbnQgc3ViQ291bnQgPSAwOwotCXN1YnJvdXRpbmVzID0gbmV3IFN1YlJvdXRpbmVTdGF0ZW1lbnRbNV07CisJdGhpcy5zdWJyb3V0aW5lcyA9IG5ldyBTdWJSb3V0aW5lU3RhdGVtZW50WzVdOwogCiAJZG8gewogCQlTdWJSb3V0aW5lU3RhdGVtZW50IHN1YjsKIAkJaWYgKChzdWIgPSB0cmF2ZXJzZWRDb250ZXh0LnN1YnJvdXRpbmUoKSkgIT0gbnVsbCkgewotCQkJaWYgKHN1YkNvdW50ID09IHN1YnJvdXRpbmVzLmxlbmd0aCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoc3Vicm91dGluZXMsIDAsIHN1YnJvdXRpbmVzID0gbmV3IFN1YlJvdXRpbmVTdGF0ZW1lbnRbc3ViQ291bnQqMl0sIDAsIHN1YkNvdW50KTsgLy8gZ3JvdworCQkJaWYgKHN1YkNvdW50ID09IHRoaXMuc3Vicm91dGluZXMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1YnJvdXRpbmVzLCAwLCB0aGlzLnN1YnJvdXRpbmVzID0gbmV3IFN1YlJvdXRpbmVTdGF0ZW1lbnRbc3ViQ291bnQqMl0sIDAsIHN1YkNvdW50KTsgLy8gZ3JvdwogCQkJfQotCQkJc3Vicm91dGluZXNbc3ViQ291bnQrK10gPSBzdWI7CisJCQl0aGlzLnN1YnJvdXRpbmVzW3N1YkNvdW50KytdID0gc3ViOwogCQkJaWYgKHN1Yi5pc1N1YlJvdXRpbmVFc2NhcGluZygpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC02OCwyNSArNjgsMjUgQEAKIAkJCUFTVE5vZGUgbm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGU7CiAJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgewogCQkJCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSAoVHJ5U3RhdGVtZW50KSBub2RlOwotCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMJCQkKLQkJCX0JCQorCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMKKwkJCX0KIAkJfSBlbHNlIGlmICh0cmF2ZXJzZWRDb250ZXh0ID09IHRhcmdldENvbnRleHQpIHsKIAkJCS8vIG9ubHkgcmVjb3JkIGNvbnRpbnVlIGluZm8gb25jZSBhY2N1bXVsYXRlZCB0aHJvdWdoIHN1YnJvdXRpbmVzLCBhbmQgb25seSBhZ2FpbnN0IHRhcmdldCBjb250ZXh0CiAJCQl0YXJnZXRDb250ZXh0LnJlY29yZENvbnRpbnVlRnJvbShmbG93Q29udGV4dCwgZmxvd0luZm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlICgodHJhdmVyc2VkQ29udGV4dCA9IHRyYXZlcnNlZENvbnRleHQucGFyZW50KSAhPSBudWxsKTsKLQkKKwogCS8vIHJlc2l6ZSBzdWJyb3V0aW5lcwotCWlmIChzdWJDb3VudCAhPSBzdWJyb3V0aW5lcy5sZW5ndGgpIHsKLQkJU3lzdGVtLmFycmF5Y29weShzdWJyb3V0aW5lcywgMCwgc3Vicm91dGluZXMgPSBuZXcgU3ViUm91dGluZVN0YXRlbWVudFtzdWJDb3VudF0sIDAsIHN1YkNvdW50KTsKKwlpZiAoc3ViQ291bnQgIT0gdGhpcy5zdWJyb3V0aW5lcy5sZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1YnJvdXRpbmVzLCAwLCB0aGlzLnN1YnJvdXRpbmVzID0gbmV3IFN1YlJvdXRpbmVTdGF0ZW1lbnRbc3ViQ291bnRdLCAwLCBzdWJDb3VudCk7CiAJfQogCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKIH0KIAogcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgdGFiLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJcHJpbnRJbmRlbnQodGFiLCBvdXRwdXQpLmFwcGVuZCgiY29udGludWUgIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAobGFiZWwgIT0gbnVsbCkgb3V0cHV0LmFwcGVuZChsYWJlbCk7CisJaWYgKHRoaXMubGFiZWwgIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCh0aGlzLmxhYmVsKTsKIAlyZXR1cm4gb3V0cHV0LmFwcGVuZCgnOycpOwogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEKaW5kZXggMmMwMzQ3ZC4uNTgwNmNlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Eb1N0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG9TdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0yNSw2ICsyNiw3IEBACiAKIAkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMKIAlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgcHJlQ29uZGl0aW9uSW5pdFN0YXRlSW5kZXggPSAtMTsKIAogcHVibGljIERvU3RhdGVtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgYWN0aW9uLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIApAQCAtNTUsNyArNTcsOSBAQAogCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOwogCiAJaW50IHByZXZpb3VzTW9kZSA9IGZsb3dJbmZvLnJlYWNoTW9kZSgpOwotCQkJCisKKwlGbG93SW5mbyBpbml0c09uQ29uZGl0aW9uID0gZmxvd0luZm87CisKIAlVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWN0aW9uSW5mbyA9IGZsb3dJbmZvLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCk7CiAJLy8gd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBjb250cmlidXRpb24gdG8gbnVsbHMgb2YgdGhlIGNvbWluZyBwYXRocyB0aHJvdWdoIHRoZQogCS8vIGxvb3AsIGJlIHRoZXkgZmFsbGluZyB0aHJvdWdoIG5vcm1hbGx5IG9yIGJyYW5jaGVkIHRvIGJyZWFrLCBjb250aW51ZSBsYWJlbHMKQEAgLTY2LDUzICs3MCw2NyBAQAogCQkJdW5jb25kaXRpb25hbEluaXRzKCk7CiAKIAkJLy8gY29kZSBnZW5lcmF0aW9uIGNhbiBiZSBvcHRpbWl6ZWQgd2hlbiBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBsb29wCi0JCWlmICgoYWN0aW9uSW5mby50YWdCaXRzICYgCi0JCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHMgJiAKLQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgeworCQlpZiAoKGFjdGlvbkluZm8udGFnQml0cyAmCisJCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHMgJgorCQkJCUZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpICE9IDApIHsKIAkJCXRoaXMuY29udGludWVMYWJlbCA9IG51bGw7CiAJCX0KKwkJaWYgKCh0aGlzLmNvbmRpdGlvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7CisJCQlpbml0c09uQ29uZGl0aW9uID0gZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkuCisJCQkJCQkJCQlhZGRJbml0aWFsaXphdGlvbnNGcm9tKAorCQkJCQkJCQkJCWFjdGlvbkluZm8ubWVyZ2VkV2l0aChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUpKTsKKwkJfQorCX0KKwlpZiAoKHRoaXMuY29uZGl0aW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJdGhpcy5jb25kaXRpb24uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgaW5pdHNPbkNvbmRpdGlvbik7CiAJfQogCS8qIFJlc2V0IHJlYWNoIG1vZGUsIHRvIGFkZHJlc3MgZm9sbG93aW5nIHNjZW5hcmlvLgogCSAqICAgZmluYWwgYmxhbms7CiAJICogICBkbyB7IGlmICh0cnVlKSBicmVhazsgZWxzZSBibGFuayA9IDA7IH0gd2hpbGUoZmFsc2UpOwotCSAqICAgYmxhbmsgPSAxOyAvLyBtYXkgYmUgaW5pdGlhbGl6ZWQgYWxyZWFkeSAKKwkgKiAgIGJsYW5rID0gMTsgLy8gbWF5IGJlIGluaXRpYWxpemVkIGFscmVhZHkKIAkgKi8KIAlhY3Rpb25JbmZvLnNldFJlYWNoTW9kZShwcmV2aW91c01vZGUpOwotCQorCiAJTG9vcGluZ0Zsb3dDb250ZXh0IGNvbmRMb29wQ29udGV4dDsKIAlGbG93SW5mbyBjb25kSW5mbyA9CiAJCXRoaXMuY29uZGl0aW9uLmFuYWx5c2VDb2RlKAogCQkJY3VycmVudFNjb3BlLAogCQkJKGNvbmRMb29wQ29udGV4dCA9Ci0JCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwJZmxvd0luZm8sIHRoaXMsIG51bGwsIAorCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsCWZsb3dJbmZvLCB0aGlzLCBudWxsLAogCQkJCQludWxsLCBjdXJyZW50U2NvcGUpKSwKIAkJCSh0aGlzLmFjdGlvbiA9PSBudWxsCiAJCQkJPyBhY3Rpb25JbmZvCiAJCQkJOiAoYWN0aW9uSW5mby5tZXJnZWRXaXRoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZSkpKS5jb3B5KCkpOworCXRoaXMucHJlQ29uZGl0aW9uSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhhY3Rpb25JbmZvKTsKIAlpZiAoIWlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgJiYgdGhpcy5jb250aW51ZUxhYmVsICE9IG51bGwpIHsKIAkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkRmluYWxDaGVja3MoY3VycmVudFNjb3BlLCBjb25kSW5mbyk7CiAJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhjdXJyZW50U2NvcGUsIGNvbmRJbmZvKTsKLQkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkTnVsbENoZWNrcyhjdXJyZW50U2NvcGUsIAorCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWROdWxsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCQlmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpLmFkZFBvdGVudGlhbE51bGxJbmZvRnJvbSgKIAkJCQkJICBjb25kSW5mby5pbml0c1doZW5UcnVlKCkudW5jb25kaXRpb25hbEluaXRzKCkpKTsKLQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLCAKKwkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLAogCQkJCWFjdGlvbkluZm8uYWRkUG90ZW50aWFsTnVsbEluZm9Gcm9tKAogCQkJCSAgY29uZEluZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxJbml0cygpKSk7CiAJfQotCisJaWYgKGxvb3BpbmdDb250ZXh0Lmhhc0VzY2FwaW5nRXhjZXB0aW9ucygpKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE5MjYKKwkJRmxvd0luZm8gbG9vcGJhY2tGbG93SW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKKwkJbG9vcGJhY2tGbG93SW5mby5tZXJnZWRXaXRoKGNvbmRJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsQ29weSgpKTsKKwkJbG9vcGluZ0NvbnRleHQuc2ltdWxhdGVUaHJvd0FmdGVyTG9vcEJhY2sobG9vcGJhY2tGbG93SW5mbyk7CisJfQogCS8vIGVuZCBvZiBsb29wCi0JRmxvd0luZm8gbWVyZ2VkSW5mbyA9IEZsb3dJbmZvLm1lcmdlZE9wdGltaXplZEJyYW5jaGVzKAotCQkJKGxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhay50YWdCaXRzICYKLQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCA/Ci0JCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrIDoKLQkJCQlmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpLmFkZEluaXRpYWxpemF0aW9uc0Zyb20obG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKSwgCi0JCQkJCS8vIHJlY292ZXIgdXBzdHJlYW0gbnVsbCBpbmZvCi0JCQlpc0NvbmRpdGlvbk9wdGltaXplZFRydWUsCi0JCQkoY29uZEluZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwID8KLQkJCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbShjb25kSW5mby5pbml0c1doZW5GYWxzZSgpKSA6IGNvbmRJbmZvLCAKLQkJCQkvLyByZWNvdmVyIG51bGwgaW5pdHMgZnJvbSBiZWZvcmUgY29uZGl0aW9uIGFuYWx5c2lzCi0JCQlmYWxzZSwgLy8gbmV2ZXIgY29uc2lkZXIgb3B0IGZhbHNlIGNhc2UgZm9yIERPIGxvb3AsIHNpbmNlIGJyZWFrIGNhbiBhbHdheXMgb2NjdXIgKDQ3Nzc2KQotCQkJIWlzQ29uZGl0aW9uVHJ1ZSAvKmRve313aGlsZSh0cnVlKTsgdW5yZWFjaGFibGUoKTsgKi8pOworCUZsb3dJbmZvIG1lcmdlZEluZm8gPSAKKwkJRmxvd0luZm8ubWVyZ2VkT3B0aW1pemVkQnJhbmNoZXMoCisJCQkJCQkobG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMAorCQkJCQkJCQk/IGxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhaworCQkJCQkJCQk6IGZsb3dJbmZvLnVuY29uZGl0aW9uYWxDb3B5KCkuYWRkSW5pdGlhbGl6YXRpb25zRnJvbShsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWspLAorCQkJCQkJCQkvLyByZWNvdmVyIHVwc3RyZWFtIG51bGwgaW5mbworCQkJCQkJaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlLAorCQkJCQkJKGNvbmRJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMAorCQkJCQkJCQk/IGZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20oY29uZEluZm8uaW5pdHNXaGVuRmFsc2UoKSkgCisJCQkJCQkJCTogY29uZEluZm8sCisJCQkJCQkJLy8gcmVjb3ZlciBudWxsIGluaXRzIGZyb20gYmVmb3JlIGNvbmRpdGlvbiBhbmFseXNpcworCQkJCQkJZmFsc2UsIC8vIG5ldmVyIGNvbnNpZGVyIG9wdCBmYWxzZSBjYXNlIGZvciBETyBsb29wLCBzaW5jZSBicmVhayBjYW4gYWx3YXlzIG9jY3VyICg0Nzc3NikKKwkJCQkJCSFpc0NvbmRpdGlvblRydWUgLypkb3t9d2hpbGUodHJ1ZSk7IHVucmVhY2hhYmxlKCk7ICovKTsKIAl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJcmV0dXJuIG1lcmdlZEluZm87CiB9CkBAIC0xNDQsMTkgKzE2MiwyNCBAQAogCS8vIGNvbnRpbnVlIGxhYmVsICgxMzU2MDIpCiAJaWYgKGhhc0NvbnRpbnVlTGFiZWwpIHsKIAkJdGhpcy5jb250aW51ZUxhYmVsLnBsYWNlKCk7Ci0JfQotCS8vIGdlbmVyYXRlIGNvbmRpdGlvbgotCUNvbnN0YW50IGNzdCA9IHRoaXMuY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwotCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOwkJCi0JaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UpewotCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JfSBlbHNlIGlmIChoYXNDb250aW51ZUxhYmVsKSB7Ci0JCXRoaXMuY29uZGl0aW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKLQkJCWN1cnJlbnRTY29wZSwKLQkJCWNvZGVTdHJlYW0sCi0JCQlhY3Rpb25MYWJlbCwKLQkJCW51bGwsCi0JCQl0cnVlKTsKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmICh0aGlzLnByZUNvbmRpdGlvbkluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMucHJlQ29uZGl0aW9uSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZUNvbmRpdGlvbkluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQkvLyBnZW5lcmF0ZSBjb25kaXRpb24KKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSl7CisJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWNvZGVTdHJlYW0sCisJCQkJYWN0aW9uTGFiZWwsCisJCQkJbnVsbCwKKwkJCQl0cnVlKTsKKwkJfQogCX0KIAkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKIAlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Eb3VibGVMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YQppbmRleCA3MGJlZWJlLi4xYTdlZjEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw2ICsxMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwpAQCAtMTcsOTcgKzE4LDEwNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkZsb2F0VXRpbDsKIAogcHVibGljIGNsYXNzIERvdWJsZUxpdGVyYWwgZXh0ZW5kcyBOdW1iZXJMaXRlcmFsIHsKKwkKIAlkb3VibGUgdmFsdWU7Ci0JcHVibGljIERvdWJsZUxpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgcywgaW50IGUpIHsKLQkJc3VwZXIodG9rZW4sIHMsIGUpOworCQorcHVibGljIERvdWJsZUxpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgcywgaW50IGUpIHsKKwlzdXBlcih0b2tlbiwgcywgZSk7Cit9CisKK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKwlEb3VibGUgY29tcHV0ZWRWYWx1ZTsKKwlib29sZWFuIGNvbnRhaW5zVW5kZXJzY29yZXMgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJ18nLCB0aGlzLnNvdXJjZSkgPiAwOworCWlmIChjb250YWluc1VuZGVyc2NvcmVzKSB7CisJCS8vIHJlbW92ZSBhbGwgdW5kZXJzY29yZXMgZnJvbSBzb3VyY2UKKwkJdGhpcy5zb3VyY2UgPSBDaGFyT3BlcmF0aW9uLnJlbW92ZSh0aGlzLnNvdXJjZSwgJ18nKTsKIAl9Ci0JcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewotCQlEb3VibGUgY29tcHV0ZWRWYWx1ZTsKKwl0cnkgeworCQljb21wdXRlZFZhbHVlID0gRG91YmxlLnZhbHVlT2YoU3RyaW5nLnZhbHVlT2YodGhpcy5zb3VyY2UpKTsKKwl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkvLyBoZXggZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbAorCQkvLyBiZWluZyByZWplY3RlZCBieSAxLjQgbGlicmFyaWVzIHdoZXJlIERvdWJsZS52YWx1ZU9mKC4uLikgZG9lc24ndCBoYW5kbGUgaGV4IGRlY2ltYWwgZmxvYXRzCiAJCXRyeSB7Ci0JCQljb21wdXRlZFZhbHVlID0gRG91YmxlLnZhbHVlT2YoU3RyaW5nLnZhbHVlT2Yoc291cmNlKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBoZXggZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbAotCQkJLy8gYmVpbmcgcmVqZWN0ZWQgYnkgMS40IGxpYnJhcmllcyB3aGVyZSBEb3VibGUudmFsdWVPZiguLi4pIGRvZXNuJ3QgaGFuZGxlIGhleCBkZWNpbWFsIGZsb2F0cwotCQkJdHJ5IHsKLQkJCQlkb3VibGUgdiA9IEZsb2F0VXRpbC52YWx1ZU9mSGV4RG91YmxlTGl0ZXJhbChzb3VyY2UpOwotCQkJCWlmICh2ID09IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkgewotCQkJCQkvLyBlcnJvcjogdGhlIG51bWJlciBpcyB0b28gbGFyZ2UgdG8gcmVwcmVzZW50Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKERvdWJsZS5pc05hTih2KSkgeworCQkJZG91YmxlIHYgPSBGbG9hdFV0aWwudmFsdWVPZkhleERvdWJsZUxpdGVyYWwodGhpcy5zb3VyY2UpOworCQkJaWYgKHYgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKSB7CisJCQkJLy8gZXJyb3I6IHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChEb3VibGUuaXNOYU4odikpIHsKKwkJCQkvLyBlcnJvcjogdGhlIG51bWJlciBpcyB0b28gc21hbGwgdG8gcmVwcmVzZW50CisJCQkJcmV0dXJuOworCQkJfQorCQkJdGhpcy52YWx1ZSA9IHY7CisJCQl0aGlzLmNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHYpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsKKwkJCS8vIGlmIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgY29uc3RhbnQgZmFpbHMKKwkJfQorCQlyZXR1cm47CisJfQorCWZpbmFsIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGNvbXB1dGVkVmFsdWUuZG91YmxlVmFsdWUoKTsKKwlpZiAoZG91YmxlVmFsdWUgPiBEb3VibGUuTUFYX1ZBTFVFKSB7CisJCS8vIGVycm9yOiB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQKKwkJcmV0dXJuOworCX0KKwlpZiAoZG91YmxlVmFsdWUgPCBEb3VibGUuTUlOX1ZBTFVFKSB7CisJCS8vIHNlZSAxRjZJR1VVCisJCS8vIGEgdHJ1ZSAwIG9ubHkgaGFzICcwJyBhbmQgJy4nIGluIG1hbnRpc3NhCisJCS8vIDEuMGUtNTAwMGQgaXMgbm9uLXplcm8sIGJ1dCB1bmRlcmZsb3dzIHRvIDAKKwkJYm9vbGVhbiBpc0hleGFEZWNpbWFsID0gZmFsc2U7CisJCWxhYmVsIDogZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZS5sZW5ndGg7IGkrKykgeyAvL2l0IGlzIHdlbGxlZCBmb3JtYXRlZCBzbyBqdXN0IHRlc3QgYWdhaW5zdCAnMCcgYW5kIHBvdGVudGlhbCAuIEQgZAorCQkJc3dpdGNoICh0aGlzLnNvdXJjZVtpXSkgeworCQkJCWNhc2UgJzAnIDoKKwkJCQljYXNlICcuJyA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3gnIDoKKwkJCQljYXNlICdYJyA6CisJCQkJCWlzSGV4YURlY2ltYWwgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdlJyA6CisJCQkJY2FzZSAnRScgOgorCQkJCWNhc2UgJ2YnIDoKKwkJCQljYXNlICdGJyA6CisJCQkJY2FzZSAnZCcgOgorCQkJCWNhc2UgJ0QnIDoKKwkJCQkJaWYgKGlzSGV4YURlY2ltYWwpIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvLyBzdGFydGluZyB0aGUgZXhwb25lbnQgLSBtYW50aXNzYSBpcyBhbGwgemVybworCQkJCQkvLyBubyBleHBvbmVudCAtIG1hbnRpc3NhIGlzIGFsbCB6ZXJvCisJCQkJCWJyZWFrIGxhYmVsOworCQkJCWNhc2UgJ3AnIDoKKwkJCQljYXNlICdQJyA6CisJCQkJCWJyZWFrIGxhYmVsOworCQkJCWRlZmF1bHQgOgogCQkJCQkvLyBlcnJvcjogdGhlIG51bWJlciBpcyB0b28gc21hbGwgdG8gcmVwcmVzZW50CiAJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdmFsdWUgPSB2OwotCQkJCWNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHYpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gaWYgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBjb25zdGFudCBmYWlscwogCQkJfQotCQkJcmV0dXJuOwogCQl9CisJfQorCXRoaXMudmFsdWUgPSBkb3VibGVWYWx1ZTsKKwl0aGlzLmNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHRoaXMudmFsdWUpOworfQogCi0JCWZpbmFsIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGNvbXB1dGVkVmFsdWUuZG91YmxlVmFsdWUoKTsKLQkJaWYgKGRvdWJsZVZhbHVlID4gRG91YmxlLk1BWF9WQUxVRSkgewotCQkJLy8gZXJyb3I6IHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkb3VibGVWYWx1ZSA8IERvdWJsZS5NSU5fVkFMVUUpIHsKLQkJCS8vIHNlZSAxRjZJR1VVCi0JCQkvLyBhIHRydWUgMCBvbmx5IGhhcyAnMCcgYW5kICcuJyBpbiBtYW50aXNzYQotCQkJLy8gMS4wZS01MDAwZCBpcyBub24temVybywgYnV0IHVuZGVyZmxvd3MgdG8gMAotCQkJYm9vbGVhbiBpc0hleGFEZWNpbWFsID0gZmFsc2U7Ci0JCQlsYWJlbCA6IGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7IC8vaXQgaXMgd2VsbGVkIGZvcm1hdGVkIHNvIGp1c3QgdGVzdCBhZ2FpbnN0ICcwJyBhbmQgcG90ZW50aWFsIC4gRCBkICAKLQkJCQlzd2l0Y2ggKHNvdXJjZVtpXSkgewotCQkJCQljYXNlICcwJyA6Ci0JCQkJCWNhc2UgJy4nIDoKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICd4JyA6Ci0JCQkJCWNhc2UgJ1gnIDoKLQkJCQkJCWlzSGV4YURlY2ltYWwgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ2UnIDoKLQkJCQkJY2FzZSAnRScgOgotCQkJCQljYXNlICdmJyA6Ci0JCQkJCWNhc2UgJ0YnIDoKLQkJCQkJY2FzZSAnZCcgOgotCQkJCQljYXNlICdEJyA6Ci0JCQkJCQlpZiAoaXNIZXhhRGVjaW1hbCkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCS8vIHN0YXJ0aW5nIHRoZSBleHBvbmVudCAtIG1hbnRpc3NhIGlzIGFsbCB6ZXJvCi0JCQkJCQkvLyBubyBleHBvbmVudCAtIG1hbnRpc3NhIGlzIGFsbCB6ZXJvCi0JCQkJCQlicmVhayBsYWJlbDsKLQkJCQkJY2FzZSAncCcgOgotCQkJCQljYXNlICdQJyA6Ci0JCQkJCQlicmVhayBsYWJlbDsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkvLyBlcnJvcjogdGhlIG51bWJlciBpcyB0b28gc21hbGwgdG8gcmVwcmVzZW50Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZhbHVlID0gZG91YmxlVmFsdWU7Ci0JCWNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlKTsKKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgZG91YmxlIGxpdGVyYWsKKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlpZiAodmFsdWVSZXF1aXJlZCkgeworCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCX0KLQkvKioKLQkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBkb3VibGUgbGl0ZXJhawotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCi0JICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCX0KLQlwdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQlyZXR1cm4gVHlwZUJpbmRpbmcuRE9VQkxFOwotCX0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwotCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorCitwdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCXJldHVybiBUeXBlQmluZGluZy5ET1VCTEU7Cit9CisKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FbXB0eVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FbXB0eVN0YXRlbWVudC5qYXZhCmluZGV4IDA1Zjc0ZjEuLmQ2Y2JkMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRW1wdHlTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VtcHR5U3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjksMjUgKzI5LDI0IEBACiAJfQogCiAJLy8gUmVwb3J0IGFuIGVycm9yIGlmIG5lY2Vzc2FyeQotCXB1YmxpYyBib29sZWFuIGNvbXBsYWluSWZVbnJlYWNoYWJsZShGbG93SW5mbyBmbG93SW5mbywgQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiBkaWRBbHJlYWR5Q29tcGxhaW4pIHsKLQkJCisJcHVibGljIGludCBjb21wbGFpbklmVW5yZWFjaGFibGUoRmxvd0luZm8gZmxvd0luZm8sIEJsb2NrU2NvcGUgc2NvcGUsIGludCBjb21wbGFpbnRMZXZlbCkgewogCQkvLyBiZWZvcmUgMS40LCBlbXB0eSBzdGF0ZW1lbnRzIGFyZSB0b2xlcmF0ZWQgYW55d2hlcmUKIAkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBjb21wbGFpbnRMZXZlbDsKIAkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGxhaW5JZlVucmVhY2hhYmxlKGZsb3dJbmZvLCBzY29wZSwgZGlkQWxyZWFkeUNvbXBsYWluKTsKKwkJcmV0dXJuIHN1cGVyLmNvbXBsYWluSWZVbnJlYWNoYWJsZShmbG93SW5mbywgc2NvcGUsIGNvbXBsYWludExldmVsKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSl7CiAJCS8vIG5vIGJ5dGVjb2RlLCBubyBuZWVkIHRvIGNoZWNrIGZvciByZWFjaGFiaWxpdHkgb3IgcmVjb3JkaW5nIHNvdXJjZSBwb3NpdGlvbnMKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAkJcmV0dXJuIHByaW50SW5kZW50KHRhYiwgb3V0cHV0KS5hcHBlbmQoJzsnKTsKIAl9Ci0JCQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCWlmICgoYml0cyAmIElzVXNlZnVsRW1wdHlTdGF0ZW1lbnQpID09IDApIHsKKwkJaWYgKCh0aGlzLmJpdHMgJiBJc1VzZWZ1bEVtcHR5U3RhdGVtZW50KSA9PSAwKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdXBlcmZsdW91c1NlbWljb2xvbih0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7CiAJCX0gZWxzZSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lbXB0eUNvbnRyb2xGbG93U3RhdGVtZW50KHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsKQEAgLTU4LDcgKzU3LDcgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLQkKKwogCiB9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXF1YWxFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VxdWFsRXhwcmVzc2lvbi5qYXZhCmluZGV4IGVlNGEyNWIuLmE5Y2UzZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXF1YWxFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FcXVhbEV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywxMDAgKzIzLDEwNiBAQAogCQlzdXBlcihsZWZ0LHJpZ2h0LG9wZXJhdG9yKTsKIAl9CiAJcHJpdmF0ZSB2b2lkIGNoZWNrTnVsbENvbXBhcmlzb24oQmxvY2tTY29wZSBzY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBGbG93SW5mbyBpbml0c1doZW5UcnVlLCBGbG93SW5mbyBpbml0c1doZW5GYWxzZSkgewotCQkKKwogCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IHRoaXMubGVmdC5sb2NhbFZhcmlhYmxlQmluZGluZygpOwogCQlpZiAobG9jYWwgIT0gbnVsbCAmJiAobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSA9PSAwKSB7Ci0JCQljaGVja1ZhcmlhYmxlQ29tcGFyaXNvbihzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCBpbml0c1doZW5UcnVlLCBpbml0c1doZW5GYWxzZSwgbG9jYWwsIHJpZ2h0Lm51bGxTdGF0dXMoZmxvd0luZm8pLCB0aGlzLmxlZnQpOworCQkJY2hlY2tWYXJpYWJsZUNvbXBhcmlzb24oc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgaW5pdHNXaGVuVHJ1ZSwgaW5pdHNXaGVuRmFsc2UsIGxvY2FsLCB0aGlzLnJpZ2h0Lm51bGxTdGF0dXMoZmxvd0luZm8pLCB0aGlzLmxlZnQpOwogCQl9CiAJCWxvY2FsID0gdGhpcy5yaWdodC5sb2NhbFZhcmlhYmxlQmluZGluZygpOwogCQlpZiAobG9jYWwgIT0gbnVsbCAmJiAobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSA9PSAwKSB7Ci0JCQljaGVja1ZhcmlhYmxlQ29tcGFyaXNvbihzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCBpbml0c1doZW5UcnVlLCBpbml0c1doZW5GYWxzZSwgbG9jYWwsIGxlZnQubnVsbFN0YXR1cyhmbG93SW5mbyksIHRoaXMucmlnaHQpOworCQkJY2hlY2tWYXJpYWJsZUNvbXBhcmlzb24oc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgaW5pdHNXaGVuVHJ1ZSwgaW5pdHNXaGVuRmFsc2UsIGxvY2FsLCB0aGlzLmxlZnQubnVsbFN0YXR1cyhmbG93SW5mbyksIHRoaXMucmlnaHQpOwogCQl9CiAJfQogCXByaXZhdGUgdm9pZCBjaGVja1ZhcmlhYmxlQ29tcGFyaXNvbihCbG9ja1Njb3BlIHNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEZsb3dJbmZvIGluaXRzV2hlblRydWUsIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlLCBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgaW50IG51bGxTdGF0dXMsIEV4cHJlc3Npb24gcmVmZXJlbmNlKSB7CiAJCXN3aXRjaCAobnVsbFN0YXR1cykgewogCQkJY2FzZSBGbG93SW5mby5OVUxMIDoKIAkJCQlpZiAoKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IEVRVUFMX0VRVUFMKSB7Ci0JCQkJCWZsb3dDb250ZXh0LnJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShzY29wZSwgbG9jYWwsIHJlZmVyZW5jZSwgCisJCQkJCWZsb3dDb250ZXh0LnJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShzY29wZSwgbG9jYWwsIHJlZmVyZW5jZSwKIAkJCQkJCQlGbG93Q29udGV4dC5DQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgRmxvd0NvbnRleHQuSU5fQ09NUEFSSVNPTl9OVUxMLCBmbG93SW5mbyk7CiAJCQkJCWluaXRzV2hlblRydWUubWFya0FzQ29tcGFyZWRFcXVhbFRvTnVsbChsb2NhbCk7IC8vIGZyb20gdGhlcmVvbiBpdCBpcyBzZXQKIAkJCQkJaW5pdHNXaGVuRmFsc2UubWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChsb2NhbCk7IC8vIGZyb20gdGhlcmVvbiBpdCBpcyBzZXQKIAkJCQl9IGVsc2UgewotCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsIAorCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsCiAJCQkJCQkJRmxvd0NvbnRleHQuQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEwsIGZsb3dJbmZvKTsKIAkJCQkJaW5pdHNXaGVuVHJ1ZS5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsgLy8gZnJvbSB0aGVyZW9uIGl0IGlzIHNldAogCQkJCQlpbml0c1doZW5GYWxzZS5tYXJrQXNDb21wYXJlZEVxdWFsVG9OdWxsKGxvY2FsKTsgLy8gZnJvbSB0aGVyZW9uIGl0IGlzIHNldAogCQkJCX0KKwkJCQlpZiAoKGZsb3dDb250ZXh0LnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSAhPSAwKSB7CisJCQkJCWZsb3dJbmZvLm1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCk7CisJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBGbG93SW5mby5OT05fTlVMTCA6CiAJCQkJaWYgKCgodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBFUVVBTF9FUVVBTCkgewotCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsIAorCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsCiAJCQkJCQkJRmxvd0NvbnRleHQuQ0FOX09OTFlfTlVMTCB8IEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEwsIGZsb3dJbmZvKTsKIAkJCQkJaW5pdHNXaGVuVHJ1ZS5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsgLy8gZnJvbSB0aGVyZW9uIGl0IGlzIHNldAorCQkJCQlpZiAoKGZsb3dDb250ZXh0LnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSAhPSAwKSB7CisJCQkJCQlpbml0c1doZW5UcnVlLm1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCk7CisJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsIAorCQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsCiAJCQkJCQkJRmxvd0NvbnRleHQuQ0FOX09OTFlfTlVMTCB8IEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTCwgZmxvd0luZm8pOwogCQkJCX0KIAkJCQlicmVhazsKLQkJfQkKKwkJfQogCQkvLyB3ZSBkbyBub3QgaW1wYWN0IGVuY2xvc2luZyB0cnkgY29udGV4dCBiZWNhdXNlIHRoaXMga2luZCBvZiBwcm90ZWN0aW9uCiAJCS8vIGRvZXMgbm90IHByZWNsdWRlIHRoZSB2YXJpYWJsZSBmcm9tIGJlaW5nIG51bGwgaW4gYW4gZW5jbG9zaW5nIHNjb3BlCiAJfQotCQorCiAJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJRmxvd0luZm8gcmVzdWx0OwotCQlpZiAoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBFUVVBTF9FUVVBTCkgewotCQkJaWYgKChsZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGxlZnQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgewotCQkJCWlmIChsZWZ0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7IC8vICB0cnVlID09IGFueXRoaW5nCi0JCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50IGluaXRzIAotCQkJCQlyZXN1bHQgPSByaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCWlmICgoKHRoaXMuYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gRVFVQUxfRVFVQUwpIHsKKwkJCWlmICgodGhpcy5sZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKHRoaXMubGVmdC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCQkJaWYgKHRoaXMubGVmdC5jb25zdGFudC5ib29sZWFuVmFsdWUoKSkgeyAvLyAgdHJ1ZSA9PSBhbnl0aGluZworCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cworCQkJCQlyZXN1bHQgPSB0aGlzLnJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAkJCQl9IGVsc2UgeyAvLyBmYWxzZSA9PSBhbnl0aGluZwogCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyBuZWdhdGVkCi0JCQkJCXJlc3VsdCA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS5hc05lZ2F0ZWRDb25kaXRpb24oKTsKKwkJCQkJcmVzdWx0ID0gdGhpcy5yaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CiAJCQkJfQotCQkJfSAKLQkJCWVsc2UgaWYgKChyaWdodC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmIChyaWdodC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7Ci0JCQkJaWYgKHJpZ2h0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7IC8vICBhbnl0aGluZyA9PSB0cnVlCi0JCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGxlZnQgYXJndW1lbnQgaW5pdHMgCi0JCQkJCXJlc3VsdCA9IGxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJfQorCQkJZWxzZSBpZiAoKHRoaXMucmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAodGhpcy5yaWdodC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCQkJaWYgKHRoaXMucmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsgLy8gIGFueXRoaW5nID09IHRydWUKKwkJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbGVmdCBhcmd1bWVudCBpbml0cworCQkJCQlyZXN1bHQgPSB0aGlzLmxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwogCQkJCX0gZWxzZSB7IC8vIGFueXRoaW5nID09IGZhbHNlCiAJCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50IGluaXRzIG5lZ2F0ZWQKLQkJCQkJcmVzdWx0ID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CisJCQkJCXJlc3VsdCA9IHRoaXMubGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CiAJCQkJfQotCQkJfSAKKwkJCX0KIAkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHJpZ2h0LmFuYWx5c2VDb2RlKAotCQkJCQljdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCAKLQkJCQkJbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCkpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJCXJlc3VsdCA9IHRoaXMucmlnaHQuYW5hbHlzZUNvZGUoCisJCQkJCWN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsCisJCQkJCXRoaXMubGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCkpLnVuY29uZGl0aW9uYWxJbml0cygpOwogCQkJfQogCQl9IGVsc2UgeyAvL05PVF9FUVVBTCA6Ci0JCQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAobGVmdC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7Ci0JCQkJaWYgKCFsZWZ0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7IC8vICBmYWxzZSAhPSBhbnl0aGluZwotCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyAKLQkJCQkJcmVzdWx0ID0gcmlnaHQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJaWYgKCh0aGlzLmxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAodGhpcy5sZWZ0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCQlpZiAoIXRoaXMubGVmdC5jb25zdGFudC5ib29sZWFuVmFsdWUoKSkgeyAvLyAgZmFsc2UgIT0gYW55dGhpbmcKKwkJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgYXJndW1lbnQgaW5pdHMKKwkJCQkJcmVzdWx0ID0gdGhpcy5yaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCQkJfSBlbHNlIHsgLy8gdHJ1ZSAhPSBhbnl0aGluZwogCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyBuZWdhdGVkCi0JCQkJCXJlc3VsdCA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS5hc05lZ2F0ZWRDb25kaXRpb24oKTsKKwkJCQkJcmVzdWx0ID0gdGhpcy5yaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CiAJCQkJfQogCQkJfQotCQkJZWxzZSBpZiAoKHJpZ2h0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKHJpZ2h0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKLQkJCQlpZiAoIXJpZ2h0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7IC8vICBhbnl0aGluZyAhPSBmYWxzZQotCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyAKLQkJCQkJcmVzdWx0ID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQllbHNlIGlmICgodGhpcy5yaWdodC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmICh0aGlzLnJpZ2h0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCQlpZiAoIXRoaXMucmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsgLy8gIGFueXRoaW5nICE9IGZhbHNlCisJCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50IGluaXRzCisJCQkJCXJlc3VsdCA9IHRoaXMubGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCQkJfSBlbHNlIHsgLy8gYW55dGhpbmcgIT0gdHJ1ZQogCQkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyBuZWdhdGVkCi0JCQkJCXJlc3VsdCA9IGxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLmFzTmVnYXRlZENvbmRpdGlvbigpOworCQkJCQlyZXN1bHQgPSB0aGlzLmxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLmFzTmVnYXRlZENvbmRpdGlvbigpOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCQllbHNlIHsKLQkJCQlyZXN1bHQgPSByaWdodC5hbmFseXNlQ29kZSgKLQkJCQkJY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgCi0JCQkJCWxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLnVuY29uZGl0aW9uYWxJbml0cygpKS4KKwkJCQlyZXN1bHQgPSB0aGlzLnJpZ2h0LmFuYWx5c2VDb2RlKAorCQkJCQljdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LAorCQkJCQl0aGlzLmxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLnVuY29uZGl0aW9uYWxJbml0cygpKS4KIAkJCQkJLyogdW5uZWVkZWQgc2luY2Ugd2UgZmxhdHRlbiBpdDogYXNOZWdhdGVkQ29uZGl0aW9uKCkuICovCiAJCQkJCXVuY29uZGl0aW9uYWxJbml0cygpOwogCQkJfQogCQl9Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBVbmNvbmRpdGlvbmFsRmxvd0luZm8gJiYgCisJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBVbmNvbmRpdGlvbmFsRmxvd0luZm8gJiYKIAkJCQkocmVzdWx0LnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgeyAvLyB0aGUgZmxvdyBpbmZvIGlzIGZsYXQKIAkJCXJlc3VsdCA9IEZsb3dJbmZvLmNvbmRpdGlvbmFsKHJlc3VsdC5jb3B5KCksIHJlc3VsdC5jb3B5KCkpOwogCQkJLy8gVE9ETyAobWF4aW1lKSBjaGVjaywgcmVpbnRyb2R1Y2VkIGNvcHkKQEAgLTEyNCwxNyArMTMwLDE3IEBACiAJICBjaGVja051bGxDb21wYXJpc29uKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHJlc3VsdCwgcmVzdWx0LmluaXRzV2hlblRydWUoKSwgcmVzdWx0LmluaXRzV2hlbkZhbHNlKCkpOwogCSAgcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAlwdWJsaWMgZmluYWwgdm9pZCBjb21wdXRlQ29uc3RhbnQoVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgewogCQlpZiAoKHRoaXMubGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmICh0aGlzLnJpZ2h0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKIAkJCXRoaXMuY29uc3RhbnQgPQogCQkJCUNvbnN0YW50LmNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkVRVUFMX0VRVUFMKAotCQkJCQlsZWZ0LmNvbnN0YW50LAorCQkJCQl0aGlzLmxlZnQuY29uc3RhbnQsCiAJCQkJCWxlZnRUeXBlLmlkLAotCQkJCQlyaWdodC5jb25zdGFudCwKKwkJCQkJdGhpcy5yaWdodC5jb25zdGFudCwKIAkJCQkJcmlnaHRUeXBlLmlkKTsKIAkJCWlmICgoKHRoaXMuYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UX0VRVUFMKQotCQkJCWNvbnN0YW50ID0gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZSghY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpOworCQkJCXRoaXMuY29uc3RhbnQgPSBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKCF0aGlzLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCQkvLyBubyBvcHRpbWl6YXRpb24gZm9yIG51bGwgPT0gbnVsbApAQCAtMTQ4LDIyICsxNTQsMjIgQEAKIAkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQorCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCWlmICh2YWx1ZVJlcXVpcmVkKSAKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJCi0JCWlmICgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBDT01QSUxFX1RZUEVfTUFTSykgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKKworCQlpZiAoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBDT01QSUxFX1RZUEVfTUFTSykgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKIAkJCWdlbmVyYXRlQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCX0gZWxzZSB7CiAJCQlnZW5lcmF0ZU5vbkJvb2xlYW5FcXVhbChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQl9CiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCX0KQEAgLTE3MiwxOSArMTc4LDE5IEBACiAJICoJT3B0aW1pemVkIG9wZXJhdGlvbnMgYXJlOiA9PSBhbmQgIT0KIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQnJhbmNoTGFiZWwgdHJ1ZUxhYmVsLCBCcmFuY2hMYWJlbCBmYWxzZUxhYmVsLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkKLQkJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCisJCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBFUVVBTF9FUVVBTCkgewotCQkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIENPTVBJTEVfVFlQRV9NQVNLKSAvKmNvbXBpbGUtdGltZSovID09IFRfYm9vbGVhbikgeworCQlpZiAoKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IEVRVUFMX0VRVUFMKSB7CisJCQlpZiAoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBDT01QSUxFX1RZUEVfTUFTSykgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKIAkJCQlnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW5FcXVhbChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CiAJCQl9IGVsc2UgewogCQkJCWdlbmVyYXRlT3B0aW1pemVkTm9uQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmICgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBDT01QSUxFX1RZUEVfTUFTSykgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKKwkJCWlmICgodGhpcy5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIENPTVBJTEVfVFlQRV9NQVNLKSAvKmNvbXBpbGUtdGltZSovID09IFRfYm9vbGVhbikgewogCQkJCWdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2VMYWJlbCwgdHJ1ZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCX0gZWxzZSB7CiAJCQkJZ2VuZXJhdGVPcHRpbWl6ZWROb25Cb29sZWFuRXF1YWwoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZUxhYmVsLCB0cnVlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwpAQCAtMTk4LDE4ICsyMDQsMTggQEAKIAkgKiBOb3RlIHRoaXMgY29kZSBkb2VzIG5vdCBvcHRpbWl6ZSBjb25kaXRpb25hbCBjb25zdGFudHMgISEhIQogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQm9vbGVhbkVxdWFsKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQotCQkvLyBvcHRpbWl6ZWQgY2FzZXM6IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiA9PSB4LCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ID09IHgsIAotCQkvLyBvcHRpbWl6ZWQgY2FzZXM6IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4gIT0geCwgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+ICE9IHgsIAorCisJCS8vIG9wdGltaXplZCBjYXNlczogPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+ID09IHgsIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4gPT0geCwKKwkJLy8gb3B0aW1pemVkIGNhc2VzOiA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ICE9IHgsIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiAhPSB4LAogCQlib29sZWFuIGlzRXF1YWxPcGVyYXRvciA9ICgodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBFUVVBTF9FUVVBTDsKLQkJQ29uc3RhbnQgY3N0ID0gbGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5sZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJQ29uc3RhbnQgcmlnaHRDc3QgPSByaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJCUNvbnN0YW50IHJpZ2h0Q3N0ID0gdGhpcy5yaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJCWlmIChyaWdodENzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4gPT0gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+LCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ICE9IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPgogCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiA9PSA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+LCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ICE9IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4KLQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKLQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQlib29sZWFuIGxlZnRCb29sID0gY3N0LmJvb2xlYW5WYWx1ZSgpOwogCQkJCQlib29sZWFuIHJpZ2h0Qm9vbCA9IHJpZ2h0Q3N0LmJvb2xlYW5WYWx1ZSgpOwpAQCAtMjI5LDE3ICsyMzUsMTcgQEAKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSBpc0VxdWFsT3BlcmF0b3IpIHsKIAkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4gPT0geCwgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiAhPSB4Ci0JCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJfSBlbHNlIHsKIAkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ID09IHgsIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiAhPSB4CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKLQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwotCQkJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUgCisJCQkJCXRoaXMubGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCS8vIGNvbXBhcmlzb24gaXMgVFJVRQogCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7Ci0JCQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CisJCQkJCWlmICgodGhpcy5iaXRzICYgSXNSZXR1cm5lZFZhbHVlKSAhPSAwKXsKIAkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVJldHVybkJ5dGVjb2RlKHRoaXMpOwogCQkJCQkJLy8gY29tcGFyaXNvbiBpcyBGQUxTRQpAQCAtMjU1LDggKzI2MSw4IEBACiAJCQkJCQllbmRMYWJlbC5wbGFjZSgpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQkJdGhpcy5yaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCQkJfQogLy8JCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAvLwkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKQEAgLTI2NiwyMiArMjcyLDIyIEBACiAvLwkJCQl9CiAJCQl9CiAJCQlyZXR1cm47Ci0JCX0gCi0JCWNzdCA9IHJpZ2h0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQl9CisJCWNzdCA9IHRoaXMucmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CiAJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGlzRXF1YWxPcGVyYXRvcikgewogCQkJCS8vIHggPT0gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+LCB4ICE9IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4KLQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwotCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5yaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCQl9IGVsc2UgewogCQkJCS8vIHggPT0gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiwgeCAhPSA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4KIAkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOwotCQkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwotCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCQkJCS8vIGNvbXBhcmlzb24gaXMgVFJVRSAKKwkJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOworCQkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFCiAJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKLQkJCQkJaWYgKChiaXRzICYgSXNSZXR1cm5lZFZhbHVlKSAhPSAwKXsKKwkJCQkJaWYgKCh0aGlzLmJpdHMgJiBJc1JldHVybmVkVmFsdWUpICE9IDApewogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUodGhpcyk7CiAJCQkJCQkvLyBjb21wYXJpc29uIGlzIEZBTFNFCkBAIC0yOTcsOCArMzAzLDggQEAKIAkJCQkJCWVuZExhYmVsLnBsYWNlKCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKLQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCQl9CiAvLwkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogLy8JCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOwpAQCAtMzA4LDE4ICszMTQsMTggQEAKIC8vCQkJCX0KIAkJCX0KIAkJCXJldHVybjsKLQkJfSAKKwkJfQogCQkvLyBkZWZhdWx0IGNhc2UKLQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKLQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCXRoaXMubGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJdGhpcy5yaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJaWYgKGlzRXF1YWxPcGVyYXRvcikgewogCQkJCUJyYW5jaExhYmVsIGZhbHNlTGFiZWw7CiAJCQkJY29kZVN0cmVhbS5pZl9pY21wbmUoZmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKSk7Ci0JCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFIAorCQkJCS8vIGNvbXBhcmlzb24gaXMgVFJVRQogCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKLQkJCQlpZiAoKGJpdHMgJiBJc1JldHVybmVkVmFsdWUpICE9IDApeworCQkJCWlmICgodGhpcy5iaXRzICYgSXNSZXR1cm5lZFZhbHVlKSAhPSAwKXsKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVSZXR1cm5CeXRlY29kZSh0aGlzKTsKIAkJCQkJLy8gY29tcGFyaXNvbiBpcyBGQUxTRQpAQCAtMzM1LDMyICszNDEsMzIgQEAKIAkJCQkJZW5kTGFiZWwucGxhY2UoKTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWNvZGVTdHJlYW0uaXhvcigpOwkJCQkKKwkJCQljb2RlU3RyZWFtLml4b3IoKTsKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEJvb2xlYW4gZ2VuZXJhdGlvbiBmb3IgPT0gd2l0aCBib29sZWFuIG9wZXJhbmRzCiAJICoKIAkgKiBOb3RlIHRoaXMgY29kZSBkb2VzIG5vdCBvcHRpbWl6ZSBjb25kaXRpb25hbCBjb25zdGFudHMgISEhIQogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbkVxdWFsKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEJyYW5jaExhYmVsIHRydWVMYWJlbCwgQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCisKIAkJLy8gb3B0aW1pemVkIGNhc2VzOiB0cnVlID09IHgsIGZhbHNlID09IHgKLQkJaWYgKGxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQlib29sZWFuIGlubGluZSA9IGxlZnQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCk7Ci0JCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAoaW5saW5lID8gdHJ1ZUxhYmVsIDogZmFsc2VMYWJlbCksIChpbmxpbmUgPyBmYWxzZUxhYmVsIDogdHJ1ZUxhYmVsKSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh0aGlzLmxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQlib29sZWFuIGlubGluZSA9IHRoaXMubGVmdC5jb25zdGFudC5ib29sZWFuVmFsdWUoKTsKKwkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgKGlubGluZSA/IHRydWVMYWJlbCA6IGZhbHNlTGFiZWwpLCAoaW5saW5lID8gZmFsc2VMYWJlbCA6IHRydWVMYWJlbCksIHZhbHVlUmVxdWlyZWQpOwogCQkJcmV0dXJuOwogCQl9IC8vIG9wdGltaXplZCBjYXNlczogeCA9PSB0cnVlLCB4ID09IGZhbHNlCi0JCWlmIChyaWdodC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCWJvb2xlYW4gaW5saW5lID0gcmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCk7Ci0JCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIChpbmxpbmUgPyB0cnVlTGFiZWwgOiBmYWxzZUxhYmVsKSwgKGlubGluZSA/IGZhbHNlTGFiZWwgOiB0cnVlTGFiZWwpLCB2YWx1ZVJlcXVpcmVkKTsKKwkJaWYgKHRoaXMucmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQlib29sZWFuIGlubGluZSA9IHRoaXMucmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCk7CisJCQl0aGlzLmxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgKGlubGluZSA/IHRydWVMYWJlbCA6IGZhbHNlTGFiZWwpLCAoaW5saW5lID8gZmFsc2VMYWJlbCA6IHRydWVMYWJlbCksIHZhbHVlUmVxdWlyZWQpOwogCQkJcmV0dXJuOwogCQl9CiAJCS8vIGRlZmF1bHQgY2FzZQotCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwotCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewogCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewpAQCAtMzc3LDIwICszODMsMjAgQEAKIAkJCX0KIAkJfQogCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQwotCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKKwkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCX0KIAkvKioKIAkgKiBCb29sZWFuIGdlbmVyYXRpb24gZm9yID09IHdpdGggbm9uLWJvb2xlYW4gb3BlcmFuZHMKIAkgKgogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlTm9uQm9vbGVhbkVxdWFsKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQorCiAJCWJvb2xlYW4gaXNFcXVhbE9wZXJhdG9yID0gKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IEVRVUFMX0VRVUFMOwotCQlpZiAoKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgPT0gVF9pbnQpIHsKKwkJaWYgKCgodGhpcy5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgPT0gVF9pbnQpIHsKIAkJCUNvbnN0YW50IGNzdDsKLQkJCWlmICgoY3N0ID0gbGVmdC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5pbnRWYWx1ZSgpID09IDApIHsKKwkJCWlmICgoY3N0ID0gdGhpcy5sZWZ0LmNvbnN0YW50KSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmludFZhbHVlKCkgPT0gMCkgewogCQkJCS8vIG9wdGltaXplZCBjYXNlOiAwID09IHgsIDAgIT0geAotCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKIAkJCQkJaWYgKGlzRXF1YWxPcGVyYXRvcikgewpAQCAtMzk4LDkgKzQwNCw5IEBACiAJCQkJCX0gZWxzZSB7CiAJCQkJCQljb2RlU3RyZWFtLmlmZXEoZmFsc2VMYWJlbCk7CiAJCQkJCX0KLQkJCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFIAorCQkJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUKIAkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOwotCQkJCQlpZiAoKGJpdHMgJiBJc1JldHVybmVkVmFsdWUpICE9IDApeworCQkJCQlpZiAoKHRoaXMuYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVSZXR1cm5CeXRlY29kZSh0aGlzKTsKIAkJCQkJCS8vIGNvbXBhcmlzb24gaXMgRkFMU0UKQEAgLTQxNSwxMiArNDIxLDEyIEBACiAJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CiAJCQkJCQllbmRMYWJlbC5wbGFjZSgpOwogCQkJCQl9Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJaWYgKChjc3QgPSByaWdodC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5pbnRWYWx1ZSgpID09IDApIHsKKwkJCWlmICgoY3N0ID0gdGhpcy5yaWdodC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5pbnRWYWx1ZSgpID09IDApIHsKIAkJCQkvLyBvcHRpbWl6ZWQgY2FzZTogeCA9PSAwLCB4ICE9IDAKLQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCXRoaXMubGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOwogCQkJCQlpZiAoaXNFcXVhbE9wZXJhdG9yKSB7CkBAIC00MjgsOSArNDM0LDkgQEAKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWNvZGVTdHJlYW0uaWZlcShmYWxzZUxhYmVsKTsKIAkJCQkJfQotCQkJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUgCisJCQkJCS8vIGNvbXBhcmlzb24gaXMgVFJVRQogCQkJCQljb2RlU3RyZWFtLmljb25zdF8xKCk7Ci0JCQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CisJCQkJCWlmICgodGhpcy5iaXRzICYgSXNSZXR1cm5lZFZhbHVlKSAhPSAwKXsKIAkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVJldHVybkJ5dGVjb2RlKHRoaXMpOwogCQkJCQkJLy8gY29tcGFyaXNvbiBpcyBGQUxTRQpAQCAtNDUxLDggKzQ1Nyw4IEBACiAJCX0KIAogCQkvLyBudWxsIGNhc2VzCi0JCWlmIChyaWdodCBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSB7Ci0JCQlpZiAobGVmdCBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSB7CisJCWlmICh0aGlzLnJpZ2h0IGluc3RhbmNlb2YgTnVsbExpdGVyYWwpIHsKKwkJCWlmICh0aGlzLmxlZnQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgewogCQkJCS8vIG51bGwgPT0gbnVsbCwgbnVsbCAhPSBudWxsCiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJaWYgKGlzRXF1YWxPcGVyYXRvcikgewpAQCAtNDYzLDcgKzQ2OSw3IEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvLyB4ID09IG51bGwsIHggIT0gbnVsbAotCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCUJyYW5jaExhYmVsIGZhbHNlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7CiAJCQkJCWlmIChpc0VxdWFsT3BlcmF0b3IpIHsKQEAgLTQ3MSw5ICs0NzcsOSBAQAogCQkJCQl9IGVsc2UgewogCQkJCQkJY29kZVN0cmVhbS5pZm51bGwoZmFsc2VMYWJlbCk7CiAJCQkJCX0KLQkJCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFIAorCQkJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUKIAkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOwotCQkJCQlpZiAoKGJpdHMgJiBJc1JldHVybmVkVmFsdWUpICE9IDApeworCQkJCQlpZiAoKHRoaXMuYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVSZXR1cm5CeXRlY29kZSh0aGlzKTsKIAkJCQkJCS8vIGNvbXBhcmlzb24gaXMgRkFMU0UKQEAgLTQ5MSw5ICs0OTcsOSBAQAogCQkJCX0KIAkJCX0KIAkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChsZWZ0IGluc3RhbmNlb2YgTnVsbExpdGVyYWwpIHsKKwkJfSBlbHNlIGlmICh0aGlzLmxlZnQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgewogCQkJLy8gbnVsbCA9IHgsIG51bGwgIT0geAotCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOwogCQkJCWlmIChpc0VxdWFsT3BlcmF0b3IpIHsKQEAgLTUwMSw5ICs1MDcsOSBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCWNvZGVTdHJlYW0uaWZudWxsKGZhbHNlTGFiZWwpOwogCQkJCX0KLQkJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUgCisJCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFCiAJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOwotCQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CisJCQkJaWYgKCh0aGlzLmJpdHMgJiBJc1JldHVybmVkVmFsdWUpICE9IDApewogCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVJldHVybkJ5dGVjb2RlKHRoaXMpOwogCQkJCQkvLyBjb21wYXJpc29uIGlzIEZBTFNFCkBAIC01MTgsMTcgKzUyNCwxNyBAQAogCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CiAJCQkJCWVuZExhYmVsLnBsYWNlKCk7CiAJCQkJfQotCQkJfQkJCQkKKwkJCX0KIAkJCXJldHVybjsKIAkJfQotCQorCiAJCS8vIGRlZmF1bHQgY2FzZQotCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwotCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKIAkJCWlmIChpc0VxdWFsT3BlcmF0b3IpIHsKLQkJCQlzd2l0Y2ggKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgeyAvLyBvcGVyYW5kIHJ1bnRpbWUgdHlwZQorCQkJCXN3aXRjaCAoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsgLy8gb3BlcmFuZCBydW50aW1lIHR5cGUKIAkJCQkJY2FzZSBUX2ludCA6CiAJCQkJCQljb2RlU3RyZWFtLmlmX2ljbXBuZShmYWxzZUxhYmVsKTsKIAkJCQkJCWJyZWFrOwpAQCAtNTQ4LDcgKzU1NCw3IEBACiAJCQkJCQljb2RlU3RyZWFtLmlmX2FjbXBuZShmYWxzZUxhYmVsKTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoKGxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSB7IC8vIG9wZXJhbmQgcnVudGltZSB0eXBlCisJCQkJc3dpdGNoICgodGhpcy5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgeyAvLyBvcGVyYW5kIHJ1bnRpbWUgdHlwZQogCQkJCQljYXNlIFRfaW50IDoKIAkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGVxKGZhbHNlTGFiZWwpOwogCQkJCQkJYnJlYWs7CkBAIC01NjYsMTEgKzU3MiwxMSBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQgOgogCQkJCQkJY29kZVN0cmVhbS5pZl9hY21wZXEoZmFsc2VMYWJlbCk7Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQl9Ci0JCQkvLyBjb21wYXJpc29uIGlzIFRSVUUgCisJCQkvLyBjb21wYXJpc29uIGlzIFRSVUUKIAkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKLQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CisJCQlpZiAoKHRoaXMuYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCl7CiAJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVJldHVybkJ5dGVjb2RlKHRoaXMpOwogCQkJCS8vIGNvbXBhcmlzb24gaXMgRkFMU0UKQEAgLTU4NCwyMiArNTkwLDIyIEBACiAJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOwogCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKIAkJCQllbmRMYWJlbC5wbGFjZSgpOwotCQkJfQkJCQorCQkJfQogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciA9PSB3aXRoIG5vbi1ib29sZWFuIG9wZXJhbmRzCiAJICoKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZE5vbkJvb2xlYW5FcXVhbChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBCcmFuY2hMYWJlbCB0cnVlTGFiZWwsIEJyYW5jaExhYmVsIGZhbHNlTGFiZWwsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQorCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCUNvbnN0YW50IGlubGluZTsKLQkJaWYgKChpbmxpbmUgPSByaWdodC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCWlmICgoaW5saW5lID0gdGhpcy5yaWdodC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQkvLyBvcHRpbWl6ZWQgY2FzZTogeCA9PSAwCi0JCQlpZiAoKCgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfaW50KSAmJiAoaW5saW5lLmludFZhbHVlKCkgPT0gMCkpIHsKLQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJaWYgKCgoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfaW50KSAmJiAoaW5saW5lLmludFZhbHVlKCkgPT0gMCkpIHsKKwkJCQl0aGlzLmxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewogCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CkBAIC02MTksMTEgKzYyNSwxMSBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQlpZiAoKGlubGluZSA9IGxlZnQuY29uc3RhbnQpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQlpZiAoKGlubGluZSA9IHRoaXMubGVmdC5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQkvLyBvcHRpbWl6ZWQgY2FzZTogMCA9PSB4Ci0JCQlpZiAoKCgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfaW50KQorCQkJaWYgKCgoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfaW50KQogCQkJCSYmIChpbmxpbmUuaW50VmFsdWUoKSA9PSAwKSkgewotCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewogCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CkBAIC02NDUsOCArNjUxLDggQEAKIAkJfQogCQkvLyBudWxsIGNhc2VzCiAJCS8vIG9wdGltaXplZCBjYXNlOiB4ID09IG51bGwKLQkJaWYgKHJpZ2h0IGluc3RhbmNlb2YgTnVsbExpdGVyYWwpIHsKLQkJCWlmIChsZWZ0IGluc3RhbmNlb2YgTnVsbExpdGVyYWwpIHsKKwkJaWYgKHRoaXMucmlnaHQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeworCQkJaWYgKHRoaXMubGVmdCBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSB7CiAJCQkJLy8gbnVsbCA9PSBudWxsCiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewpAQCAtNjU3LDcgKzY2Myw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKIAkJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewpAQCAtNjc2LDggKzY4Miw4IEBACiAJCQl9CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKGxlZnQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeyAvLyBvcHRpbWl6ZWQgY2FzZTogbnVsbCA9PSB4Ci0JCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJfSBlbHNlIGlmICh0aGlzLmxlZnQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeyAvLyBvcHRpbWl6ZWQgY2FzZTogbnVsbCA9PSB4CisJCQl0aGlzLnJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CiAJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewpAQCAtNjk2LDE1ICs3MDIsMTUgQEAKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkKKwogCQkvLyBkZWZhdWx0IGNhc2UKLQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKLQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCXRoaXMubGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJdGhpcy5yaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKIAkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKIAkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCi0JCQkJCXN3aXRjaCAoKGxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSB7IC8vIG9wZXJhbmQgcnVudGltZSB0eXBlCisJCQkJCXN3aXRjaCAoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsgLy8gb3BlcmFuZCBydW50aW1lIHR5cGUKIAkJCQkJCWNhc2UgVF9pbnQgOgogCQkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGVxKHRydWVMYWJlbCk7CiAJCQkJCQkJYnJlYWs7CkBAIC03MjcsNyArNzMzLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKIAkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKLQkJCQkJc3dpdGNoICgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsgLy8gb3BlcmFuZCBydW50aW1lIHR5cGUKKwkJCQkJc3dpdGNoICgodGhpcy5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgeyAvLyBvcGVyYW5kIHJ1bnRpbWUgdHlwZQogCQkJCQkJY2FzZSBUX2ludCA6CiAJCQkJCQkJY29kZVN0cmVhbS5pZl9pY21wbmUoZmFsc2VMYWJlbCk7CiAJCQkJCQkJYnJlYWs7CkBAIC03NTcsMjAgKzc2MywyMCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCisKIAkJCWJvb2xlYW4gbGVmdElzQ2FzdCwgcmlnaHRJc0Nhc3Q7Ci0JCQlpZiAoKGxlZnRJc0Nhc3QgPSBsZWZ0IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pID09IHRydWUpIGxlZnQuYml0cyB8PSBEaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KLQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsTGVmdFR5cGUgPSBsZWZ0LnJlc29sdmVUeXBlKHNjb3BlKTsKLQkKLQkJCWlmICgocmlnaHRJc0Nhc3QgPSByaWdodCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSA9PSB0cnVlKSByaWdodC5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgotCQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxSaWdodFR5cGUgPSByaWdodC5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCisJCQlpZiAoKGxlZnRJc0Nhc3QgPSB0aGlzLmxlZnQgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgPT0gdHJ1ZSkgdGhpcy5sZWZ0LmJpdHMgfD0gRGlzYWJsZVVubmVjZXNzYXJ5Q2FzdENoZWNrOyAvLyB3aWxsIGNoZWNrIGxhdGVyIG9uCisJCQlUeXBlQmluZGluZyBvcmlnaW5hbExlZnRUeXBlID0gdGhpcy5sZWZ0LnJlc29sdmVUeXBlKHNjb3BlKTsKKworCQkJaWYgKChyaWdodElzQ2FzdCA9IHRoaXMucmlnaHQgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgPT0gdHJ1ZSkgdGhpcy5yaWdodC5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgorCQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxSaWdodFR5cGUgPSB0aGlzLnJpZ2h0LnJlc29sdmVUeXBlKHNjb3BlKTsKKwogCQkvLyBhbHdheXMgcmV0dXJuIEJvb2xlYW5CaW5kaW5nCiAJCWlmIChvcmlnaW5hbExlZnRUeXBlID09IG51bGwgfHwgb3JpZ2luYWxSaWdodFR5cGUgPT0gbnVsbCl7Ci0JCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsJCQorCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCisKIAkJLy8gYXV0b2JveGluZyBzdXBwb3J0CiAJCWJvb2xlYW4gdXNlMTVzcGVjaWZpY3MgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwogCQlUeXBlQmluZGluZyBsZWZ0VHlwZSA9IG9yaWdpbmFsTGVmdFR5cGUsIHJpZ2h0VHlwZSA9IG9yaWdpbmFsUmlnaHRUeXBlOwpAQCAtNzg5LDY2ICs3OTUsODcgQEAKIAkJaWYgKGxlZnRUeXBlLmlzQmFzZVR5cGUoKSAmJiByaWdodFR5cGUuaXNCYXNlVHlwZSgpKSB7CiAJCQlpbnQgbGVmdFR5cGVJRCA9IGxlZnRUeXBlLmlkOwogCQkJaW50IHJpZ2h0VHlwZUlEID0gcmlnaHRUeXBlLmlkOwotCQorCiAJCQkvLyB0aGUgY29kZSBpcyBhbiBpbnQKIAkJCS8vIChjYXN0KSAgbGVmdCAgID09IChjYXN0KSAgcmlnaHQgLS0+IHJlc3VsdAogCQkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAogCQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCiAJCQlpbnQgb3BlcmF0b3JTaWduYXR1cmUgPSBPcGVyYXRvclNpZ25hdHVyZXNbRVFVQUxfRVFVQUxdWyAobGVmdFR5cGVJRCA8PCA0KSArIHJpZ2h0VHlwZUlEXTsKLQkJCWxlZnQuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIChvcGVyYXRvclNpZ25hdHVyZSA+Pj4gMTYpICYgMHgwMDAwRiksIG9yaWdpbmFsTGVmdFR5cGUpOwotCQkJcmlnaHQuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIChvcGVyYXRvclNpZ25hdHVyZSA+Pj4gOCkgJiAweDAwMDBGKSwgb3JpZ2luYWxSaWdodFR5cGUpOwotCQkJYml0cyB8PSBvcGVyYXRvclNpZ25hdHVyZSAmIDB4RjsJCQorCQkJdGhpcy5sZWZ0LmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBUeXBlQmluZGluZy53ZWxsS25vd25UeXBlKHNjb3BlLCAob3BlcmF0b3JTaWduYXR1cmUgPj4+IDE2KSAmIDB4MDAwMEYpLCBvcmlnaW5hbExlZnRUeXBlKTsKKwkJCXRoaXMucmlnaHQuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIFR5cGVCaW5kaW5nLndlbGxLbm93blR5cGUoc2NvcGUsIChvcGVyYXRvclNpZ25hdHVyZSA+Pj4gOCkgJiAweDAwMDBGKSwgb3JpZ2luYWxSaWdodFR5cGUpOworCQkJdGhpcy5iaXRzIHw9IG9wZXJhdG9yU2lnbmF0dXJlICYgMHhGOwogCQkJaWYgKChvcGVyYXRvclNpZ25hdHVyZSAmIDB4MDAwMEYpID09IFRfdW5kZWZpbmVkKSB7Ci0JCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgbGVmdFR5cGUsIHJpZ2h0VHlwZSk7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCQkvLyBjaGVjayBuZWVkIGZvciBvcGVyYW5kIGNhc3QKIAkJCWlmIChsZWZ0SXNDYXN0IHx8IHJpZ2h0SXNDYXN0KSB7Ci0JCQkJQ2FzdEV4cHJlc3Npb24uY2hlY2tOZWVkRm9yQXJndW1lbnRDYXN0cyhzY29wZSwgRVFVQUxfRVFVQUwsIG9wZXJhdG9yU2lnbmF0dXJlLCBsZWZ0LCBsZWZ0VHlwZS5pZCwgbGVmdElzQ2FzdCwgcmlnaHQsIHJpZ2h0VHlwZS5pZCwgcmlnaHRJc0Nhc3QpOworCQkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoc2NvcGUsIEVRVUFMX0VRVUFMLCBvcGVyYXRvclNpZ25hdHVyZSwgdGhpcy5sZWZ0LCBsZWZ0VHlwZS5pZCwgbGVmdElzQ2FzdCwgdGhpcy5yaWdodCwgcmlnaHRUeXBlLmlkLCByaWdodElzQ2FzdCk7CiAJCQl9CiAJCQljb21wdXRlQ29uc3RhbnQobGVmdFR5cGUsIHJpZ2h0VHlwZSk7CisKKwkJCS8vIGNoZWNrIHdoZXRoZXIgY29tcGFyaW5nIGlkZW50aWNhbCBleHByZXNzaW9ucworCQkJQmluZGluZyBsZWZ0RGlyZWN0ID0gRXhwcmVzc2lvbi5nZXREaXJlY3RCaW5kaW5nKHRoaXMubGVmdCk7CisJCQlpZiAobGVmdERpcmVjdCAhPSBudWxsICYmIGxlZnREaXJlY3QgPT0gRXhwcmVzc2lvbi5nZXREaXJlY3RCaW5kaW5nKHRoaXMucmlnaHQpKSB7CisJCQkJaWYgKGxlZnRUeXBlSUQgIT0gVHlwZUlkcy5UX2RvdWJsZSAmJiBsZWZ0VHlwZUlEICE9IFR5cGVJZHMuVF9mbG9hdAorCQkJCQkJJiYoISh0aGlzLnJpZ2h0IGluc3RhbmNlb2YgQXNzaWdubWVudCkpKSAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxNzc2CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbXBhcmluZ0lkZW50aWNhbEV4cHJlc3Npb25zKHRoaXMpOworCQkJfSBlbHNlIGlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY3NDAKKwkJCQlpbnQgb3BlcmF0b3IgPSAodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUOworCQkJCWlmICgob3BlcmF0b3IgPT0gRVFVQUxfRVFVQUwgJiYgdGhpcy5jb25zdGFudCA9PSBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKHRydWUpKQorCQkJCQkJfHwgKG9wZXJhdG9yID09IE5PVF9FUVVBTCAmJiB0aGlzLmNvbnN0YW50ID09IEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUoZmFsc2UpKSkKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29tcGFyaW5nSWRlbnRpY2FsRXhwcmVzc2lvbnModGhpcyk7CisJCQl9CiAJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBUeXBlQmluZGluZy5CT09MRUFOOwogCQl9Ci0JCi0JCS8vIE9iamVjdCByZWZlcmVuY2VzIAorCisJCS8vIE9iamVjdCByZWZlcmVuY2VzCiAJCS8vIHNwZWMgMTUuMjAuMwogCQlpZiAoKCFsZWZ0VHlwZS5pc0Jhc2VUeXBlKCkgfHwgbGVmdFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCkgLy8gY2Fubm90IGNvbXBhcmU6IE9iamVjdCA9PSAoaW50KTAKIAkJCQkmJiAoIXJpZ2h0VHlwZS5pc0Jhc2VUeXBlKCkgfHwgcmlnaHRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpCi0JCQkJJiYgKHRoaXMuY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBudWxsKSAKLQkJCQkJCXx8IHRoaXMuY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCByaWdodFR5cGUsIGxlZnRUeXBlLCBudWxsKSkpIHsKKwkJCQkmJiAoY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBudWxsKQorCQkJCQkJfHwgY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCByaWdodFR5cGUsIGxlZnRUeXBlLCBudWxsKSkpIHsKIAogCQkJLy8gKHNwZWNpYWwgY2FzZSBmb3IgU3RyaW5nKQogCQkJaWYgKChyaWdodFR5cGUuaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKGxlZnRUeXBlLmlkID09IFRfSmF2YUxhbmdTdHJpbmcpKSB7CiAJCQkJY29tcHV0ZUNvbnN0YW50KGxlZnRUeXBlLCByaWdodFR5cGUpOwogCQkJfSBlbHNlIHsKLQkJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQkJfQogCQkJVHlwZUJpbmRpbmcgb2JqZWN0VHlwZSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7Ci0JCQlsZWZ0LmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBvYmplY3RUeXBlLCBsZWZ0VHlwZSk7Ci0JCQlyaWdodC5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgb2JqZWN0VHlwZSwgcmlnaHRUeXBlKTsKKwkJCXRoaXMubGVmdC5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgb2JqZWN0VHlwZSwgbGVmdFR5cGUpOworCQkJdGhpcy5yaWdodC5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgb2JqZWN0VHlwZSwgcmlnaHRUeXBlKTsKIAkJCS8vIGNoZWNrIG5lZWQgZm9yIG9wZXJhbmQgY2FzdAotCQkJYm9vbGVhbiB1bm5lY2Vzc2FyeUxlZnRDYXN0ID0gKGxlZnQuYml0cyAmIFVubmVjZXNzYXJ5Q2FzdCkgIT0gMDsKLQkJCWJvb2xlYW4gdW5uZWNlc3NhcnlSaWdodENhc3QgPSAocmlnaHQuYml0cyAmIFVubmVjZXNzYXJ5Q2FzdCkgIT0gMDsKKwkJCWJvb2xlYW4gdW5uZWNlc3NhcnlMZWZ0Q2FzdCA9ICh0aGlzLmxlZnQuYml0cyAmIFVubmVjZXNzYXJ5Q2FzdCkgIT0gMDsKKwkJCWJvb2xlYW4gdW5uZWNlc3NhcnlSaWdodENhc3QgPSAodGhpcy5yaWdodC5iaXRzICYgVW5uZWNlc3NhcnlDYXN0KSAhPSAwOwogCQkJaWYgKHVubmVjZXNzYXJ5TGVmdENhc3QgfHwgdW5uZWNlc3NhcnlSaWdodENhc3QpIHsKLQkJCQlUeXBlQmluZGluZyBhbHRlcm5hdGVMZWZ0VHlwZSA9IHVubmVjZXNzYXJ5TGVmdENhc3QgPyAoKENhc3RFeHByZXNzaW9uKWxlZnQpLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlIDogbGVmdFR5cGU7Ci0JCQkJVHlwZUJpbmRpbmcgYWx0ZXJuYXRlUmlnaHRUeXBlID0gdW5uZWNlc3NhcnlSaWdodENhc3QgPyAoKENhc3RFeHByZXNzaW9uKXJpZ2h0KS5leHByZXNzaW9uLnJlc29sdmVkVHlwZSA6IHJpZ2h0VHlwZTsKLQkJCQlpZiAodGhpcy5jaGVja0Nhc3RUeXBlc0NvbXBhdGliaWxpdHkoc2NvcGUsIGFsdGVybmF0ZUxlZnRUeXBlLCBhbHRlcm5hdGVSaWdodFR5cGUsIG51bGwpIAotCQkJCQkJfHwgdGhpcy5jaGVja0Nhc3RUeXBlc0NvbXBhdGliaWxpdHkoc2NvcGUsIGFsdGVybmF0ZVJpZ2h0VHlwZSwgYWx0ZXJuYXRlTGVmdFR5cGUsIG51bGwpKSB7Ci0JCQkJCWlmICh1bm5lY2Vzc2FyeUxlZnRDYXN0KSBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKWxlZnQpOyAKLQkJCQkJaWYgKHVubmVjZXNzYXJ5UmlnaHRDYXN0KSBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKXJpZ2h0KTsKKwkJCQlUeXBlQmluZGluZyBhbHRlcm5hdGVMZWZ0VHlwZSA9IHVubmVjZXNzYXJ5TGVmdENhc3QgPyAoKENhc3RFeHByZXNzaW9uKXRoaXMubGVmdCkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgOiBsZWZ0VHlwZTsKKwkJCQlUeXBlQmluZGluZyBhbHRlcm5hdGVSaWdodFR5cGUgPSB1bm5lY2Vzc2FyeVJpZ2h0Q2FzdCA/ICgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yaWdodCkuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgOiByaWdodFR5cGU7CisJCQkJaWYgKGNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgYWx0ZXJuYXRlTGVmdFR5cGUsIGFsdGVybmF0ZVJpZ2h0VHlwZSwgbnVsbCkKKwkJCQkJCXx8IGNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgYWx0ZXJuYXRlUmlnaHRUeXBlLCBhbHRlcm5hdGVMZWZ0VHlwZSwgbnVsbCkpIHsKKwkJCQkJaWYgKHVubmVjZXNzYXJ5TGVmdENhc3QpIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5sZWZ0KTsKKwkJCQkJaWYgKHVubmVjZXNzYXJ5UmlnaHRDYXN0KSBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKXRoaXMucmlnaHQpOworCQkJCX0KKwkJCX0KKwkJCS8vIGNoZWNrIHdoZXRoZXIgY29tcGFyaW5nIGlkZW50aWNhbCBleHByZXNzaW9ucworCQkJQmluZGluZyBsZWZ0RGlyZWN0ID0gRXhwcmVzc2lvbi5nZXREaXJlY3RCaW5kaW5nKHRoaXMubGVmdCk7CisJCQlpZiAobGVmdERpcmVjdCAhPSBudWxsICYmIGxlZnREaXJlY3QgPT0gRXhwcmVzc2lvbi5nZXREaXJlY3RCaW5kaW5nKHRoaXMucmlnaHQpKSB7CisJCQkJaWYgKCEodGhpcy5yaWdodCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbXBhcmluZ0lkZW50aWNhbEV4cHJlc3Npb25zKHRoaXMpOwogCQkJCX0KIAkJCX0KIAkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IFR5cGVCaW5kaW5nLkJPT0xFQU47CiAJCX0KLQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9yKHRoaXMsIGxlZnRUeXBlLCByaWdodFR5cGUpOwogCQlyZXR1cm4gbnVsbDsKIAl9CiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewotCQkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQlyaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLmxlZnQudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJdGhpcy5yaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCmluZGV4IDQyZjVjMTEuLmJhMjIxOWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywzMiArNyw0OSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkludm9jYXRpb25TaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmF3VHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKIAogcHVibGljIGNsYXNzIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4dGVuZHMgU3RhdGVtZW50IGltcGxlbWVudHMgSW52b2NhdGlvblNpdGUgewotCQkKKwogCXB1YmxpYyBFeHByZXNzaW9uW10gYXJndW1lbnRzOwogCXB1YmxpYyBFeHByZXNzaW9uIHF1YWxpZmljYXRpb247CiAJcHVibGljIE1ldGhvZEJpbmRpbmcgYmluZGluZzsJCQkJCQkJLy8gZXhhY3QgYmluZGluZyByZXN1bHRpbmcgZnJvbSBsb29rdXAKLQlwcm90ZWN0ZWQgTWV0aG9kQmluZGluZyBjb2RlZ2VuQmluZGluZzsJCS8vIGFjdHVhbCBiaW5kaW5nIHVzZWQgZm9yIGNvZGUgZ2VuZXJhdGlvbiAoaWYgbm8gc3ludGhldGljIGFjY2Vzc29yKQogCU1ldGhvZEJpbmRpbmcgc3ludGhldGljQWNjZXNzb3I7CQkJCQkJLy8gc3ludGhldGljIGFjY2Vzc29yIGZvciBpbm5lci1lbXVsYXRpb24KIAlwdWJsaWMgaW50IGFjY2Vzc01vZGU7CiAJcHVibGljIFR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzOwogCXB1YmxpYyBUeXBlQmluZGluZ1tdIGdlbmVyaWNUeXBlQXJndW1lbnRzOwotCQorCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSW1wbGljaXRTdXBlciA9IDE7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU3VwZXIgPSAyOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRoaXMgPSAzOwogCiAJcHVibGljIFZhcmlhYmxlQmluZGluZ1tdW10gaW1wbGljaXRBcmd1bWVudHM7Ci0JCisKIAkvLyBUT0RPIFJlbW92ZSBvbmNlIERPTVBhcnNlciBpcyBhY3RpdmF0ZWQKIAlwdWJsaWMgaW50IHR5cGVBcmd1bWVudHNTb3VyY2VTdGFydDsKIApAQCAtNDAsMzkgKzU3LDQyIEBACiAJCXRoaXMuYWNjZXNzTW9kZSA9IGFjY2Vzc01vZGU7CiAJfQogCi0JcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCUZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0KKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCQkvLyBtdXN0IHZlcmlmeSB0aGF0IGV4Y2VwdGlvbnMgcG90ZW50aWFsbHkgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiBhcmUgY2F1Z2h0IGluIHRoZSBtZXRob2QuCiAKIAkJdHJ5IHsKIAkJCSgoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZSkuaXNDb25zdHJ1Y3RvckNhbGwgPSB0cnVlOwogCiAJCQkvLyBwcm9jZXNzIGVuY2xvc2luZyBpbnN0YW5jZQotCQkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgeworCQkJaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKSB7CiAJCQkJZmxvd0luZm8gPQotCQkJCQlxdWFsaWZpY2F0aW9uCisJCQkJCXRoaXMucXVhbGlmaWNhdGlvbgogCQkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOwogCQkJfQogCQkJLy8gcHJvY2VzcyBhcmd1bWVudHMKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCWZsb3dJbmZvID0KLQkJCQkJCWFyZ3VtZW50c1tpXQorCQkJCQkJdGhpcy5hcmd1bWVudHNbaV0KIAkJCQkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCiAJCQkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJCQlpZiAoKHRoaXMuYXJndW1lbnRzW2ldLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQkJCXRoaXMuYXJndW1lbnRzW2ldLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAogCQkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnM7Ci0JCQlpZiAoKHRocm93bkV4Y2VwdGlvbnMgPSBiaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUykgeworCQkJaWYgKCh0aHJvd25FeGNlcHRpb25zID0gdGhpcy5iaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUykgeworCQkJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5VbmNoZWNrZWQpICE9IDAgJiYgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMsIGFsaWduIHdpdGggamF2YWMgb24gSkxTIDE1LjEyLjIuNgorCQkJCQl0aHJvd25FeGNlcHRpb25zID0gY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZXModGhpcy5iaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsIHRydWUsIHRydWUpOworCQkJCX0JCQkJCiAJCQkJLy8gY2hlY2sgZXhjZXB0aW9ucwogCQkJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCiAJCQkJCXRocm93bkV4Y2VwdGlvbnMsCi0JCQkJCShhY2Nlc3NNb2RlID09IEltcGxpY2l0U3VwZXIpCisJCQkJCSh0aGlzLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcikKIAkJCQkJCT8gKEFTVE5vZGUpIGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQKIAkJCQkJCTogKEFTVE5vZGUpIHRoaXMsCiAJCQkJCWZsb3dJbmZvLApAQCAtOTMsOCArMTEzLDcgQEAKIAkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKLQotCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgeworCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNSZWFjaGFibGUpID09IDApIHsKIAkJCXJldHVybjsKIAkJfQogCQl0cnkgewpAQCAtMTAzLDEwICsxMjIsMTEgQEAKIAkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKIAotCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJCQorCQkJTWV0aG9kQmluZGluZyBjb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZy5vcmlnaW5hbCgpOworCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisKIAkJCS8vIHNwZWNpYWwgbmFtZSZvcmRpbmFsIGFyZ3VtZW50IGdlbmVyYXRpb24gZm9yIGVudW0gY29uc3RydWN0b3JzCi0JCQlpZiAodGFyZ2V0VHlwZS5lcmFzdXJlKCkuaWQgPT0gVF9KYXZhTGFuZ0VudW0gfHwgdGFyZ2V0VHlwZS5pc0VudW0oKSkgeworCQkJaWYgKHRhcmdldFR5cGUuZXJhc3VyZSgpLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ0VudW0gfHwgdGFyZ2V0VHlwZS5pc0VudW0oKSkgewogCQkJCWNvZGVTdHJlYW0uYWxvYWRfMSgpOyAvLyBwYXNzIGFsb25nIG5hbWUgcGFyYW0gYXMgbmFtZSBhcmcKIAkJCQljb2RlU3RyZWFtLmlsb2FkXzIoKTsgLy8gcGFzcyBhbG9uZyBvcmRpbmFsIHBhcmFtIGFzIG9yZGluYWwgYXJnCiAJCQl9CkBAIC0xMTYsMTIgKzEzNiwxMiBAQAogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVZhbHVlcygKIAkJCQkJY3VycmVudFNjb3BlLAogCQkJCQl0YXJnZXRUeXBlLAotCQkJCQkodGhpcy5iaXRzICYgQVNUTm9kZS5EaXNjYXJkRW5jbG9zaW5nSW5zdGFuY2UpICE9IDAgPyBudWxsIDogcXVhbGlmaWNhdGlvbiwKKwkJCQkJKHRoaXMuYml0cyAmIEFTVE5vZGUuRGlzY2FyZEVuY2xvc2luZ0luc3RhbmNlKSAhPSAwID8gbnVsbCA6IHRoaXMucXVhbGlmaWNhdGlvbiwKIAkJCQkJdGhpcyk7CiAJCQl9CiAJCQkvLyBnZW5lcmF0ZSBhcmd1bWVudHMKLQkJCWdlbmVyYXRlQXJndW1lbnRzKGJpbmRpbmcsIGFyZ3VtZW50cywgY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsJCQkKLQkJCQorCQkJZ2VuZXJhdGVBcmd1bWVudHModGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwogCQkJLy8gaGFuZGxpbmcgaW5uZXJjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uIC0gb3V0ZXIgbG9jYWwgYXJndW1lbnRzCiAJCQlpZiAodGFyZ2V0VHlwZS5pc05lc3RlZFR5cGUoKSkgewogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNPdXRlckFyZ3VtZW50VmFsdWVzKApAQCAtMTI5LDQ2ICsxNDksNDQgQEAKIAkJCQkJdGFyZ2V0VHlwZSwKIAkJCQkJdGhpcyk7CiAJCQl9Ci0JCQlpZiAoc3ludGhldGljQWNjZXNzb3IgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuc3ludGhldGljQWNjZXNzb3IgIT0gbnVsbCkgewogCQkJCS8vIHN5bnRoZXRpYyBhY2Nlc3NvciBnb3Qgc29tZSBleHRyYSBhcmd1bWVudHMgYXBwZW5kZWQgdG8gaXRzIHNpZ25hdHVyZSwgd2hpY2ggbmVlZCB2YWx1ZXMKIAkJCQlmb3IgKGludCBpID0gMCwKLQkJCQkJbWF4ID0gc3ludGhldGljQWNjZXNzb3IucGFyYW1ldGVycy5sZW5ndGggLSB0aGlzLmNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJCQltYXggPSB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yLnBhcmFtZXRlcnMubGVuZ3RoIC0gY29kZWdlbkJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CiAJCQkJCWkgPCBtYXg7CiAJCQkJCWkrKykgewogCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChzeW50aGV0aWNBY2Nlc3Nvcik7CisJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsIGNvZGVnZW5CaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQkJfQogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJfSBmaW5hbGx5IHsKIAkJCSgoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZSkuaXNDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsKIAkJfQogCX0KKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKSB7CiAJCXJldHVybiB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzOwogCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0U3VwZXIoKSB7Ci0JCS8vcmV0dXJuIHRydWUgaWYgSSdtIG9mIHRoZXNlIGNvbXBpbGVyIGFkZGVkIHN0YXRlbWVudCBzdXBlcigpOwogCi0JCXJldHVybiAoYWNjZXNzTW9kZSA9PSBJbXBsaWNpdFN1cGVyKTsKKwlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0U3VwZXIoKSB7CisJCXJldHVybiAodGhpcy5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7Ci0KLQkJcmV0dXJuIGFjY2Vzc01vZGUgIT0gVGhpczsKKwkJcmV0dXJuIHRoaXMuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpIHsKLQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKiBJbm5lciBlbXVsYXRpb24gY29uc2lzdHMgaW4gZWl0aGVyIHJlY29yZGluZyBhIGRlcGVuZGVuY3kgCisJLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5CiAJICogbGluayBvbmx5LCBvciBwZXJmb3JtaW5nIG9uZSBsZXZlbCBvZiBwcm9wYWdhdGlvbi4KIAkgKgogCSAqIERlcGVuZGVuY3kgbWVjaGFuaXNtIGlzIHVzZWQgd2hlbmV2ZXIgZGVhbGluZyB3aXRoIHNvdXJjZSB0YXJnZXQKQEAgLTE3Niw3MiArMTk0LDcwIEBACiAJICogZXhhY3QgbmVlZC4KIAkgKi8KIAl2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlRXJhc3VyZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKKwkJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGVFcmFzdXJlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CiAKLQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApCXsKKwkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgPT0gMCkJewogCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CiAJCWlmIChzdXBlclR5cGVFcmFzdXJlLmlzTmVzdGVkVHlwZSgpCiAJCQkmJiBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmlzTG9jYWxUeXBlKCkpIHsKIAogCQkJaWYgKHN1cGVyVHlwZUVyYXN1cmUuaXNMb2NhbFR5cGUoKSkgewotCQkJCSgoTG9jYWxUeXBlQmluZGluZykgc3VwZXJUeXBlRXJhc3VyZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoY3VycmVudFNjb3BlLCBxdWFsaWZpY2F0aW9uICE9IG51bGwpOworCQkJCSgoTG9jYWxUeXBlQmluZGluZykgc3VwZXJUeXBlRXJhc3VyZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoY3VycmVudFNjb3BlLCB0aGlzLnF1YWxpZmljYXRpb24gIT0gbnVsbCk7CiAJCQl9IGVsc2UgewogCQkJCS8vIGxvY2FsbHkgcHJvcGFnYXRlLCBzaW5jZSB3ZSBhbHJlYWR5IG5vdyB0aGUgZGVzaXJlZCBzaGFwZSBmb3Igc3VyZQotCQkJCWN1cnJlbnRTY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbihzdXBlclR5cGVFcmFzdXJlLCBxdWFsaWZpY2F0aW9uICE9IG51bGwpOworCQkJCWN1cnJlbnRTY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbihzdXBlclR5cGVFcmFzdXJlLCB0aGlzLnF1YWxpZmljYXRpb24gIT0gbnVsbCk7CiAJCQl9CiAJCX0KIAkJfQogCX0KIAogCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgeworCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKQl7CisJCQkvLyBpZiBjb25zdHJ1Y3RvciBmcm9tIHBhcmFtZXRlcml6ZWQgdHlwZSBnb3QgZm91bmQsIHVzZSB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYXQgY29kZWdlbiB0aW1lCisJCQlNZXRob2RCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CiAKLQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApCXsKLQkJLy8gaWYgY29uc3RydWN0b3IgZnJvbSBwYXJhbWV0ZXJpemVkIHR5cGUgZ290IGZvdW5kLCB1c2UgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIGF0IGNvZGVnZW4gdGltZQotCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7Ci0JCQotCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5Ci0JCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpICYmIGFjY2Vzc01vZGUgIT0gVGhpcykgewotCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCQkvLyBmcm9tIDEuNCBvbiwgbG9jYWwgdHlwZSBjb25zdHJ1Y3RvciBjYW4gbG9zZSB0aGVpciBwcml2YXRlIGZsYWcgdG8gZWFzZSBlbXVsYXRpb24KLQkJCWlmICgoZGVjbGFyaW5nQ2xhc3MudGFnQml0cyAmIFRhZ0JpdHMuSXNMb2NhbFR5cGUpICE9IDAgCSYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgewotCQkJCS8vIGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGR1bXBlZCBhcyBwcml2YXRlLCBubyBlbXVsYXRpb24gcmVxdWlyZWQgdGh1cwotCQkJCXRoaXMuY29kZWdlbkJpbmRpbmcudGFnQml0cyB8PSBUYWdCaXRzLkNsZWFyUHJpdmF0ZU1vZGlmaWVyOwotCQkJfSBlbHNlIHsKLQkJCQlzeW50aGV0aWNBY2Nlc3NvciA9ICgoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QodGhpcy5jb2RlZ2VuQmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKLQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2Vzcyh0aGlzLmNvZGVnZW5CaW5kaW5nLCB0aGlzKTsKKwkJCS8vIHBlcmZvcm0gc29tZSBlbXVsYXRpb24gd29yayBpbiBjYXNlIHRoZXJlIGlzIHNvbWUgYW5kIHdlIGFyZSBpbnNpZGUgYSBsb2NhbCB0eXBlIG9ubHkKKwkJCWlmICh0aGlzLmJpbmRpbmcuaXNQcml2YXRlKCkgJiYgdGhpcy5hY2Nlc3NNb2RlICE9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCQkJLy8gZnJvbSAxLjQgb24sIGxvY2FsIHR5cGUgY29uc3RydWN0b3IgY2FuIGxvc2UgdGhlaXIgcHJpdmF0ZSBmbGFnIHRvIGVhc2UgZW11bGF0aW9uCisJCQkJaWYgKChkZWNsYXJpbmdDbGFzcy50YWdCaXRzICYgVGFnQml0cy5Jc0xvY2FsVHlwZSkgIT0gMCAmJiBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKKwkJCQkJLy8gY29uc3RydWN0b3Igd2lsbCBub3QgYmUgZHVtcGVkIGFzIHByaXZhdGUsIG5vIGVtdWxhdGlvbiByZXF1aXJlZCB0aHVzCisJCQkJCWNvZGVnZW5CaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5DbGVhclByaXZhdGVNb2RpZmllcjsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChjb2RlZ2VuQmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoY29kZWdlbkJpbmRpbmcsIHRoaXMpOworCQkJCX0KIAkJCX0KIAkJfQotCQl9CiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0KIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOwotCQlpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsKSBxdWFsaWZpY2F0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOwotCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWlmICh0aGlzLnF1YWxpZmljYXRpb24gIT0gbnVsbCkgdGhpcy5xdWFsaWZpY2F0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOworCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCW91dHB1dC5hcHBlbmQoJzwnKTsKLQkJCWludCBtYXggPSB0eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7CisJCQlpbnQgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7CiAJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heDsgaisrKSB7Ci0JCQkJdHlwZUFyZ3VtZW50c1tqXS5wcmludCgwLCBvdXRwdXQpOworCQkJCXRoaXMudHlwZUFyZ3VtZW50c1tqXS5wcmludCgwLCBvdXRwdXQpOwogCQkJCW91dHB1dC5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAogCQkJfQotCQkJdHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CisJCQl0aGlzLnR5cGVBcmd1bWVudHNbbWF4XS5wcmludCgwLCBvdXRwdXQpOwogCQkJb3V0cHV0LmFwcGVuZCgnPicpOwotCQl9CQkKLQkJaWYgKGFjY2Vzc01vZGUgPT0gVGhpcykgeworCQl9CisJCWlmICh0aGlzLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcykgewogCQkJb3V0cHV0LmFwcGVuZCgidGhpcygiKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgewogCQkJb3V0cHV0LmFwcGVuZCgic3VwZXIoIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQkJCXRoaXMuYXJndW1lbnRzW2ldLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpOyIpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCS8vIHRoZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgdm9pZCBmb3IgYSBjb25zdHJ1Y3Rvci4KIAkJLy8gdGhlIHRlc3QgaXMgbWFkZSBpbnRvIGdldENvbnN0cnVjdG9yCkBAIC0yNTEsNyArMjY3LDcgQEAKIAkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOwogCQl0cnkgewogCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZFNjb3BlLnJlZmVyZW5jZU1ldGhvZCgpOwotCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uID09IG51bGwgCisJCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gPT0gbnVsbAogCQkJCQl8fCAhbWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpCiAJCQkJCXx8ICgoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb24pLmNvbnN0cnVjdG9yQ2FsbCAhPSB0aGlzKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKHRoaXMpOwpAQCAtMjczLDM4ICsyODksNDIgQEAKIAkJCX0KIAkJCW1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsID0gdHJ1ZTsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCk7Ci0JCQlpZiAoYWNjZXNzTW9kZSAhPSBUaGlzKQorCQkJYm9vbGVhbiByY3ZIYXNFcnJvciA9IGZhbHNlOworCQkJaWYgKHRoaXMuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSB7CiAJCQkJcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJUeXBlLnN1cGVyY2xhc3MoKTsKLQotCQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gcHJldmVudCAoZXhwbGljaXQpIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gZnJvbSB3aXRoaW4gZW51bQotCQkJaWYgKHRoaXMuYWNjZXNzTW9kZSA9PSBTdXBlciAmJiByZWNlaXZlclR5cGUuZXJhc3VyZSgpLmlkID09IFRfSmF2YUxhbmdFbnVtKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW52b2tlU3VwZXJDb25zdHJ1Y3RvckluRW51bSh0aGlzLCBtZXRob2RTY29wZS5yZWZlcmVuY2VNZXRob2QoKS5iaW5kaW5nKTsKLQkJCX0KLQkJCS8vIHF1YWxpZmljYXRpb24gc2hvdWxkIGJlIGZyb20gdGhlIHR5cGUgb2YgdGhlIGVuY2xvc2luZ1R5cGUKLQkJCWlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoYWNjZXNzTW9kZSAhPSBTdXBlcikgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbigKLQkJCQkJCXF1YWxpZmljYXRpb24sCi0JCQkJCQlyZWNlaXZlclR5cGUpOworCQkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzc1JlZiA9IHNjb3BlLnJlZmVyZW5jZVR5cGUoKS5zdXBlcmNsYXNzOworCQkJCWlmIChzdXBlcmNsYXNzUmVmICE9IG51bGwgJiYgc3VwZXJjbGFzc1JlZi5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiAhc3VwZXJjbGFzc1JlZi5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlyY3ZIYXNFcnJvciA9IHRydWU7CiAJCQkJfQotCQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlY2VpdmVyVHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbigKLQkJCQkJCXF1YWxpZmljYXRpb24sCi0JCQkJCQlyZWNlaXZlclR5cGUpOwotCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5EaXNjYXJkRW5jbG9zaW5nSW5zdGFuY2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVHlwZUJpbmRpbmcgcVRiID0gcXVhbGlmaWNhdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgZW5jbG9zaW5nVHlwZSk7Ci0JCQkJCXF1YWxpZmljYXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHFUYiwgcVRiKTsKKwkJCX0KKwkJCWlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCkgeworCQkJCS8vIHByZXZlbnQgKGV4cGxpY2l0KSBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGZyb20gd2l0aGluIGVudW0KKwkJCQlpZiAodGhpcy5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyICYmIHJlY2VpdmVyVHlwZS5lcmFzdXJlKCkuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nRW51bSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnZva2VTdXBlckNvbnN0cnVjdG9ySW5FbnVtKHRoaXMsIG1ldGhvZFNjb3BlLnJlZmVyZW5jZU1ldGhvZCgpLmJpbmRpbmcpOworCQkJCX0KKwkJCQkvLyBxdWFsaWZpY2F0aW9uIHNob3VsZCBiZSBmcm9tIHRoZSB0eXBlIG9mIHRoZSBlbmNsb3NpbmdUeXBlCisJCQkJaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKSB7CisJCQkJCWlmICh0aGlzLmFjY2Vzc01vZGUgIT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5RW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKAorCQkJCQkJCXRoaXMucXVhbGlmaWNhdGlvbiwKKwkJCQkJCQlyZWNlaXZlclR5cGUpOworCQkJCQl9CisJCQkJCWlmICghcmN2SGFzRXJyb3IpIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlY2VpdmVyVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQkJCQlpZiAoZW5jbG9zaW5nVHlwZSA9PSBudWxsKSB7CisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24odGhpcy5xdWFsaWZpY2F0aW9uLCByZWNlaXZlclR5cGUpOworCQkJCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLkRpc2NhcmRFbmNsb3NpbmdJbnN0YW5jZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJVHlwZUJpbmRpbmcgcVRiID0gdGhpcy5xdWFsaWZpY2F0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBlbmNsb3NpbmdUeXBlKTsKKwkJCQkJCQl0aGlzLnF1YWxpZmljYXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHFUYiwgcVRiKTsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCS8vIHJlc29sdmUgdHlwZSBhcmd1bWVudHMgKGZvciBnZW5lcmljIGNvbnN0cnVjdG9yIGNhbGwpCiAJCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwogCQkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOwotCQkJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzCiAJCQkJdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOwpAQCAtMzE2LDIxICszMzYsMjUgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAoYXJnSGFzRXJyb3IpIHsKKwkJCQkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsgLy8gc3RpbGwgYXR0ZW1wdCB0byByZXNvbHZlIGFyZ3VtZW50cworCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJdGhpcy5hcmd1bWVudHNbaV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9CQkJCi0JCisJCQl9CiAJCQkvLyBhcmd1bWVudHMgYnVmZmVyaW5nIGZvciB0aGUgbWV0aG9kIGxvb2t1cAogCQkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzID0gQmluZGluZy5OT19QQVJBTUVURVJTOwogCQkJYm9vbGVhbiBhcmdzQ29udGFpbkNhc3QgPSBmYWxzZTsKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gZmFsc2U7IC8vIHR5cGVDaGVja3MgYWxsIGFyZ3VtZW50cwotCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWludCBsZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCQkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IHRoaXMuYXJndW1lbnRzW2ldOwogCQkJCQlpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgewotCQkJCQkJYXJndW1lbnQuYml0cyB8PSBEaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KKwkJCQkJCWFyZ3VtZW50LmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KIAkJCQkJCWFyZ3NDb250YWluQ2FzdCA9IHRydWU7CiAJCQkJCX0KIAkJCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnQucmVzb2x2ZVR5cGUoc2NvcGUpKSA9PSBudWxsKSB7CkBAIC0zMzgsNiArMzYyLDkgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAoYXJnSGFzRXJyb3IpIHsKKwkJCQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJLy8gcmVjb3JkIGEgYmVzdCBndWVzcywgZm9yIGNsaWVudHMgd2hvIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBjb250cnVjdG9yIG1hdGNoCiAJCQkJCVR5cGVCaW5kaW5nW10gcHNldWRvQXJncyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQkJCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspIHsKQEAgLTM1NCw3ICszODEsNyBAQAogCQkJCQkJCX0KIAkJCQkJCQl0aGlzLmJpbmRpbmcgPSBjbG9zZXN0TWF0Y2g7CiAJCQkJCQkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2hPcmlnaW5hbCA9IGNsb3Nlc3RNYXRjaC5vcmlnaW5hbCgpOwotCQkJCQkJCWlmICgoY2xvc2VzdE1hdGNoT3JpZ2luYWwuaXNQcml2YXRlKCkgfHwgY2xvc2VzdE1hdGNoT3JpZ2luYWwuZGVjbGFyaW5nQ2xhc3MuaXNMb2NhbFR5cGUoKSkgJiYgIXNjb3BlLmlzRGVmaW5lZEluTWV0aG9kKGNsb3Nlc3RNYXRjaE9yaWdpbmFsKSkgeworCQkJCQkJCWlmIChjbG9zZXN0TWF0Y2hPcmlnaW5hbC5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkgJiYgIXNjb3BlLmlzRGVmaW5lZEluTWV0aG9kKGNsb3Nlc3RNYXRjaE9yaWdpbmFsKSkgewogCQkJCQkJCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgbWV0aG9kIGlzIHVzZWQgZnJvbSB3aXRoaW4gaW5zaWRlIGl0c2VsZiAoZS5nLiBkaXJlY3QgcmVjdXJzaW9ucykKIAkJCQkJCQkJY2xvc2VzdE1hdGNoT3JpZ2luYWwubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CiAJCQkJCQkJfQpAQCAtMzYyLDIxICszODksMzkgQEAKIAkJCQkJfQogCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJfSBlbHNlIGlmIChyZWNlaXZlclR5cGUuZXJhc3VyZSgpLmlkID09IFRfSmF2YUxhbmdFbnVtKSB7CisJCQl9IGVsc2UgaWYgKHJlY2VpdmVyVHlwZS5lcmFzdXJlKCkuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nRW51bSkgewogCQkJCS8vIFRPRE8gKHBoaWxpcHBlKSBnZXQgcmlkIG9mIG9uY2Ugd2VsbC1rbm93biBiaW5kaW5nIGlzIGF2YWlsYWJsZQogCQkJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbXSB7IHNjb3BlLmdldEphdmFMYW5nU3RyaW5nKCksIFR5cGVCaW5kaW5nLklOVCB9OwogCQkJfQotCQkJaWYgKChiaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IocmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKSkuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQodGhpcy5iaW5kaW5nLCBzY29wZSwgdGhpcy5hY2Nlc3NNb2RlICE9IEltcGxpY2l0U3VwZXIpKQotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOwotCQkJCWNoZWNrSW52b2NhdGlvbkFyZ3VtZW50cyhzY29wZSwgbnVsbCwgcmVjZWl2ZXJUeXBlLCBiaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKTsKLQkJCQlpZiAoYmluZGluZy5pc1ByaXZhdGUoKSB8fCByZWNlaXZlclR5cGUuaXNMb2NhbFR5cGUoKSkgewotCQkJCQliaW5kaW5nLm9yaWdpbmFsKCkubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7Ci0JCQkJfQkJCQkKKwkJCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICgodGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IocmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKSkuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCWlmICgodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCWlmICghbWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmlzQW5vbnltb3VzVHlwZSgpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nVHlwZUluQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZywgc2NvcGUsIHRoaXMuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKHRoaXMuYmluZGluZywgdGhpcyk7CisJCQkJfQorCQkJCWlmIChjaGVja0ludm9jYXRpb25Bcmd1bWVudHMoc2NvcGUsIG51bGwsIHJlY2VpdmVyVHlwZSwgdGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKSkgeworCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbmNoZWNrZWQ7CisJCQkJfQorCQkJCWlmICh0aGlzLmJpbmRpbmcuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpKSB7CisJCQkJCXRoaXMuYmluZGluZy5vcmlnaW5hbCgpLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOworCQkJCX0KKwkJCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwKKwkJCQkJCSYmIHRoaXMuYmluZGluZy5vcmlnaW5hbCgpLnR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeVR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uKHRoaXMuYmluZGluZywgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cywgdGhpcy50eXBlQXJndW1lbnRzKTsKKwkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCi0JCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSByZWNlaXZlclR5cGU7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcpOworCQkJCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeworCQkJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSByZWNlaXZlclR5cGU7CisJCQkJfQorCQkJCWlmIChyY3ZIYXNFcnJvcikKKwkJCQkJcmV0dXJuOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsKQEAgLTM5NCw5ICs0MzksOCBAQAogCXB1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGRlcHRoKSB7CiAJCS8vIGlnbm9yZSBmb3IgaGVyZQogCX0KLQorCQogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewotCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewogCQkJaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKSB7CiAJCQkJdGhpcy5xdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKQEAgLTQwNCw3ICs0NDgsNyBAQAogCQkJaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDAsIHR5cGVBcmd1bWVudHNMZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwgdHlwZUFyZ3VtZW50c0xlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMudHlwZUFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQkJfQkJCQorCQkJCX0KIAkJCX0KIAkJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDAsIGFyZ3VtZW50TGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpIDwgYXJndW1lbnRMZW5ndGg7IGkrKykKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKaW5kZXggZDllMTg2Zi4uZGYyMTYxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjkyNDc4IC0gUmVwb3J0IHBvdGVudGlhbGx5IG51bGwgYWNyb3NzIHZhcmlhYmxlIGFzc2lnbm1lbnQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0yMCwxMSArMjEsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKQEAgLTM4LDExICs0MSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk1lc3NhZ2VzOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCisKIAlwdWJsaWMgQ29uc3RhbnQgY29uc3RhbnQ7Ci0JCisKIAlwdWJsaWMgaW50IHN0YXRlbWVudEVuZCA9IC0xOwotCQorCiAJLy9Tb21lIGV4cHJlc3Npb24gbWF5IG5vdCBiZSB1c2VkIC0gZnJvbSBhIGphdmEgc2VtYW50aWMgcG9pbnQKIAkvL29mIHZpZXcgb25seSAtIGFzIHN0YXRlbWVudHMuIE90aGVyIG1heS4gSW4gb3JkZXIgdG8gYXZvaWQgdGhlIGNyZWF0aW9uCiAJLy9vZiB3cmFwcGVycyBhcm91bmQgZXhwcmVzc2lvbiBpbiBvcmRlciB0byB0dW5lIHRoZW0gYXMgZXhwcmVzc2lvbgpAQCAtNzUsNyArNzgsNyBAQAogCQkJCQlyZXR1cm4gY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gY29uc3RhbnQuY2hhclZhbHVlKCk7CiAJCQkJZGVmYXVsdCA6CiAJCQkJCXJldHVybiBmYWxzZTsvL2Jvb2xlYW4KLQkJCX0gCisJCQl9CiAKIAkJY2FzZSBUX2Zsb2F0IDoKIAkJCXN3aXRjaCAoY29uc3RhbnRUeXBlSUQpIHsKQEAgLTk1LDggKzk4LDggQEAKIAkJCQkJcmV0dXJuIGNvbnN0YW50LmxvbmdWYWx1ZSgpID09IGNvbnN0YW50LmZsb2F0VmFsdWUoKTsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJcmV0dXJuIGZhbHNlOy8vYm9vbGVhbgotCQkJfSAKLQkJCQorCQkJfQorCiAJCWNhc2UgVF9kb3VibGUgOgogCQkJc3dpdGNoIChjb25zdGFudFR5cGVJRCkgewogCQkJCWNhc2UgVF9jaGFyIDoKQEAgLTExNSw4ICsxMTgsOCBAQAogCQkJCQlyZXR1cm4gY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gY29uc3RhbnQuZG91YmxlVmFsdWUoKTsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJcmV0dXJuIGZhbHNlOyAvL2Jvb2xlYW4KLQkJCX0gCi0JCQkKKwkJCX0KKwogCQljYXNlIFRfYnl0ZSA6CiAJCQlzd2l0Y2ggKGNvbnN0YW50VHlwZUlEKSB7CiAJCQkJY2FzZSBUX2NoYXIgOgpAQCAtMTM1LDggKzEzOCw4IEBACiAJCQkJCXJldHVybiBjb25zdGFudC5sb25nVmFsdWUoKSA9PSBjb25zdGFudC5ieXRlVmFsdWUoKTsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJcmV0dXJuIGZhbHNlOyAvL2Jvb2xlYW4KLQkJCX0gCi0JCQkKKwkJCX0KKwogCQljYXNlIFRfc2hvcnQgOgogCQkJc3dpdGNoIChjb25zdGFudFR5cGVJRCkgewogCQkJCWNhc2UgVF9jaGFyIDoKQEAgLTE1NSw4ICsxNTgsOCBAQAogCQkJCQlyZXR1cm4gY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gY29uc3RhbnQuc2hvcnRWYWx1ZSgpOwogCQkJCWRlZmF1bHQgOgogCQkJCQlyZXR1cm4gZmFsc2U7IC8vYm9vbGVhbgotCQkJfSAKLQkJCQorCQkJfQorCiAJCWNhc2UgVF9pbnQgOgogCQkJc3dpdGNoIChjb25zdGFudFR5cGVJRCkgewogCQkJCWNhc2UgVF9jaGFyIDoKQEAgLTE3NSw4ICsxNzgsOCBAQAogCQkJCQlyZXR1cm4gY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gY29uc3RhbnQuaW50VmFsdWUoKTsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJcmV0dXJuIGZhbHNlOyAvL2Jvb2xlYW4KLQkJCX0gCi0JCQkKKwkJCX0KKwogCQljYXNlIFRfbG9uZyA6CiAJCQlzd2l0Y2ggKGNvbnN0YW50VHlwZUlEKSB7CiAJCQkJY2FzZSBUX2NoYXIgOgpAQCAtMTk1LDEzICsxOTgsMTMgQEAKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJZGVmYXVsdCA6CiAJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCi0JCQl9IAotCQkJCisJCQl9CisKIAkJZGVmYXVsdCA6CiAJCQlyZXR1cm4gZmFsc2U7IC8vYm9vbGVhbgotCX0gCisJfQogfQotCQorCiBwdWJsaWMgRXhwcmVzc2lvbigpIHsKIAlzdXBlcigpOwogfQpAQCAtMjEzLDcgKzIxNiw3IEBACiAvKioKICAqIE1vcmUgc29waGlzdGljYXRlZCBmb3Igb2YgdGhlIGZsb3cgYW5hbHlzaXMgdXNlZCBmb3IgYW5hbHl6aW5nIGV4cHJlc3Npb25zLCBhbmQgYmUgYWJsZSB0byBvcHRpbWl6ZSBvdXQKICAqIHBvcnRpb25zIG9mIGV4cHJlc3Npb25zIHdoZXJlIG5vIGFjdHVhbCB2YWx1ZSBpcyByZXF1aXJlZC4KLSAqIAorICoKICAqIEBwYXJhbSBjdXJyZW50U2NvcGUKICAqIEBwYXJhbSBmbG93Q29udGV4dAogICogQHBhcmFtIGZsb3dJbmZvCkBAIC0yMjEsMTUgKzIyNCwxMyBAQAogICogQHJldHVybiBUaGUgc3RhdGUgb2YgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgdGhlIGFuYWx5c2lzIG9mIHRoZSBjdXJyZW50IGV4cHJlc3Npb24KICAqLwogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCiAJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIH0KIAogLyoqCi0gKiBSZXR1cm5zIGZhbHNlIGlmIGNhc3QgaXMgbm90IGxlZ2FsLiAKKyAqIFJldHVybnMgZmFsc2UgaWYgY2FzdCBpcyBub3QgbGVnYWwuCiAgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgY2FzdFR5cGUsIFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQogCS8vIHNlZSBzcGVjaWZpY2F0aW9ucyA1LjUKIAkvLyBoYW5kbGUgZXJyb3JzIGFuZCBwcm9jZXNzIGNvbnN0YW50IHdoZW4gbmVlZGVkCiAKQEAgLTI0Miw2ICsyNDMsNyBAQAogCS8vIGlkZW50aXR5IGNvbnZlcnNpb24gY2Fubm90IGJlIHBlcmZvcm1lZCB1cGZyb250LCBkdWUgdG8gc2lkZS1lZmZlY3RzCiAJLy8gbGlrZSBjb25zdGFudCBwcm9wYWdhdGlvbgogCWJvb2xlYW4gdXNlMTVzcGVjaWZpY3MgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCWJvb2xlYW4gdXNlMTdzcGVjaWZpY3MgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83OwogCWlmIChjYXN0VHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSkgewogCQkJaWYgKGV4cHJlc3Npb25UeXBlID09IGNhc3RUeXBlKSB7CkBAIC0yNjIsMzcgKzI2NCw0MCBAQAogCQkJCX0KIAkJCQlpZiAoIW5lY2Vzc2FyeSkgdGFnQXNVbm5lY2Vzc2FyeUNhc3Qoc2NvcGUsIGNhc3RUeXBlKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkKKwogCQkJfQotCQl9IGVsc2UgaWYgKHVzZTE1c3BlY2lmaWNzIAorCQl9IGVsc2UgaWYgKHVzZTE3c3BlY2lmaWNzICYmIGV4cHJlc3Npb25UeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCl7CisJCQkvLyBjYXN0IGZyb20gT2JqZWN0IHRvIGJhc2UgdHlwZSBhbGxvd2VkIGZyb20gMS43LCBzZWUgSkxTICQ1LjUKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgaWYgKHVzZTE1c3BlY2lmaWNzCiAJCQkJCQkJJiYgc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShleHByZXNzaW9uVHlwZSkuaXNDb21wYXRpYmxlV2l0aChjYXN0VHlwZSkpIHsgLy8gdW5ib3hpbmcgLSBvbmx5IHdpZGVuaW5nIG1hdGNoIGlzIGFsbG93ZWQKLQkJCXRhZ0FzVW5uZWNlc3NhcnlDYXN0KHNjb3BlLCBjYXN0VHlwZSk7ICAKKwkJCXRhZ0FzVW5uZWNlc3NhcnlDYXN0KHNjb3BlLCBjYXN0VHlwZSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmICh1c2UxNXNwZWNpZmljcyAKLQkJCQkJCSYmIGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSAKKwl9IGVsc2UgaWYgKHVzZTE1c3BlY2lmaWNzCisJCQkJCQkmJiBleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkKIAkJCQkJCSYmIHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoZXhwcmVzc2lvblR5cGUpLmlzQ29tcGF0aWJsZVdpdGgoY2FzdFR5cGUpKSB7IC8vIGJveGluZyAtIG9ubHkgd2lkZW5pbmcgbWF0Y2ggaXMgYWxsb3dlZAotCQl0YWdBc1VubmVjZXNzYXJ5Q2FzdChzY29wZSwgY2FzdFR5cGUpOyAgCisJCXRhZ0FzVW5uZWNlc3NhcnlDYXN0KHNjb3BlLCBjYXN0VHlwZSk7CiAJCXJldHVybiB0cnVlOwogCX0KIAogCXN3aXRjaChleHByZXNzaW9uVHlwZS5raW5kKCkpIHsKIAkJY2FzZSBCaW5kaW5nLkJBU0VfVFlQRSA6Ci0JCQkvLy0tLS0tLS0tLS0tY2FzdCB0byBzb21ldGhpbmcgd2hpY2ggaXMgTk9UIGEgYmFzZSB0eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisJCQkvLy0tLS0tLS0tLS0tY2FzdCB0byBzb21ldGhpbmcgd2hpY2ggaXMgTk9UIGEgYmFzZSB0eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCWlmIChleHByZXNzaW9uVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKSB7CiAJCQkJdGFnQXNVbm5lY2Vzc2FyeUNhc3Qoc2NvcGUsIGNhc3RUeXBlKTsKIAkJCQlyZXR1cm4gdHJ1ZTsgLy9udWxsIGlzIGNvbXBhdGlibGUgd2l0aCBldmVyeSB0aGluZwogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwotCQkJCisKIAkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgogCQkJaWYgKGNhc3RUeXBlID09IGV4cHJlc3Npb25UeXBlKSB7CiAJCQkJdGFnQXNVbm5lY2Vzc2FyeUNhc3Qoc2NvcGUsIGNhc3RUeXBlKTsKIAkJCQlyZXR1cm4gdHJ1ZTsgLy8gaWRlbnRpdHkgY29udmVyc2lvbgogCQkJfQogCQkJc3dpdGNoIChjYXN0VHlwZS5raW5kKCkpIHsKLQkJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6IAorCQkJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKIAkJCQkJLy8gKCBBUlJBWSApIEFSUkFZCiAJCQkJCVR5cGVCaW5kaW5nIGNhc3RFbGVtZW50VHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBjYXN0VHlwZSkuZWxlbWVudHNUeXBlKCk7CiAJCQkJCVR5cGVCaW5kaW5nIGV4cHJFbGVtZW50VHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkuZWxlbWVudHNUeXBlKCk7CkBAIC0zMDAsMjEgKzMwNSwyMSBAQAogCQkJCQkJaWYgKGNhc3RFbGVtZW50VHlwZSA9PSBleHByRWxlbWVudFR5cGUpIHsKIAkJCQkJCQl0YWdBc05lZWRDaGVja0Nhc3QoKTsKIAkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gCisJCQkJCQl9CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAkJCQkJLy8gcmVjdXJzZSBvbiBhcnJheSB0eXBlIGVsZW1lbnRzCiAJCQkJCXJldHVybiBjaGVja0Nhc3RUeXBlc0NvbXBhdGliaWxpdHkoc2NvcGUsIGNhc3RFbGVtZW50VHlwZSwgZXhwckVsZW1lbnRUeXBlLCBleHByZXNzaW9uKTsKLQkJCQkJCi0JCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDogCisKKwkJCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgogCQkJCQkvLyAoIFRZUEVfUEFSQU1FVEVSICkgQVJSQVkKLQkJCQkJVHlwZUJpbmRpbmcgbWF0Y2ggPSBleHByZXNzaW9uVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGNhc3RUeXBlKTsKKwkJCQkJVHlwZUJpbmRpbmcgbWF0Y2ggPSBleHByZXNzaW9uVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGNhc3RUeXBlKTsKIAkJCQkJaWYgKG1hdGNoID09IG51bGwpIHsKIAkJCQkJCWNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlLCBudWxsIC8qbm8gbWF0Y2gqLywgdHJ1ZSk7CiAJCQkJCX0KIAkJCQkJLy8gcmVjdXJzZSBvbiB0aGUgdHlwZSB2YXJpYWJsZSB1cHBlciBib3VuZAogCQkJCQlyZXR1cm4gY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpY2FzdFR5cGUpLnVwcGVyQm91bmQoKSwgZXhwcmVzc2lvblR5cGUsIGV4cHJlc3Npb24pOwotCQkJCQkKKwogCQkJCWRlZmF1bHQ6CiAJCQkJCS8vICggQ0xBU1MvSU5URVJGQUNFICkgQVJSQVkKIAkJCQkJc3dpdGNoIChjYXN0VHlwZS5pZCkgewpAQCAtMzI5LDE3ICszMzQsMTggQEAKIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAkJCX0KLQkJCQkJCisKIAkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKLQkJCVR5cGVCaW5kaW5nIG1hdGNoID0gZXhwcmVzc2lvblR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShjYXN0VHlwZSk7CisJCQlUeXBlQmluZGluZyBtYXRjaCA9IGV4cHJlc3Npb25UeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oY2FzdFR5cGUpOwogCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gY2hlY2tVbnNhZmVDYXN0KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIG1hdGNoLCBmYWxzZSk7CiAJCQl9CiAJCQkvLyByZWN1cnNpdmVseSBvbiB0aGUgdHlwZSB2YXJpYWJsZSB1cHBlciBib3VuZAogCQkJcmV0dXJuIGNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgY2FzdFR5cGUsICgoVHlwZVZhcmlhYmxlQmluZGluZylleHByZXNzaW9uVHlwZSkudXBwZXJCb3VuZCgpLCBleHByZXNzaW9uKTsKLQkJCQotCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6IC8vIGludGVyc2VjdGlvbiB0eXBlCi0JCQltYXRjaCA9IGV4cHJlc3Npb25UeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoY2FzdFR5cGUpOworCisJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKKwkJCW1hdGNoID0gZXhwcmVzc2lvblR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShjYXN0VHlwZSk7CiAJCQlpZiAobWF0Y2ggIT0gbnVsbCkgewogCQkJCXJldHVybiBjaGVja1Vuc2FmZUNhc3Qoc2NvcGUsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSwgbWF0Y2gsIGZhbHNlKTsKIAkJCX0KQEAgLTM1NiwxMyArMzYyLDEzIEBACiAJCQkJCQkJY2FzZSBUX0phdmFJb1NlcmlhbGl6YWJsZSA6CiAJCQkJCQkJCXRhZ0FzTmVlZENoZWNrQ2FzdCgpOwogCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQlkZWZhdWx0IDoJCQkJCQkJCQkKKwkJCQkJCQlkZWZhdWx0IDoKIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJfQogCiAJCQkJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6CiAJCQkJCQkvLyAoIElOVEVSRkFDRSApIFRZUEVfUEFSQU1FVEVSCi0JCQkJCQltYXRjaCA9IGV4cHJlc3Npb25UeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoY2FzdFR5cGUpOworCQkJCQkJbWF0Y2ggPSBleHByZXNzaW9uVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGNhc3RUeXBlKTsKIAkJCQkJCWlmIChtYXRjaCA9PSBudWxsKSB7CiAJCQkJCQkJY2hlY2tVbnNhZmVDYXN0KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIG51bGwgLypubyBtYXRjaCovLCB0cnVlKTsKIAkJCQkJCX0KQEAgLTM3MywyNCArMzc5LDMyIEBACiAJCQkJCQlpZiAoY2FzdFR5cGUuaXNJbnRlcmZhY2UoKSkgewogCQkJCQkJCS8vICggSU5URVJGQUNFICkgSU5URVJGQUNFCiAJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBpbnRlcmZhY2VUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlOwotCQkJCQkJCW1hdGNoID0gaW50ZXJmYWNlVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGNhc3RUeXBlKTsKKwkJCQkJCQltYXRjaCA9IGludGVyZmFjZVR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShjYXN0VHlwZSk7CiAJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKIAkJCQkJCQkJcmV0dXJuIGNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGludGVyZmFjZVR5cGUsIG1hdGNoLCBmYWxzZSk7CiAJCQkJCQkJfQogCQkJCQkJCXRhZ0FzTmVlZENoZWNrQ2FzdCgpOwotCQkJCQkJCW1hdGNoID0gY2FzdFR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShpbnRlcmZhY2VUeXBlKTsKKwkJCQkJCQltYXRjaCA9IGNhc3RUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oaW50ZXJmYWNlVHlwZSk7CiAJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKIAkJCQkJCQkJcmV0dXJuIGNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGludGVyZmFjZVR5cGUsIG1hdGNoLCB0cnVlKTsKIAkJCQkJCQl9CiAJCQkJCQkJaWYgKHVzZTE1c3BlY2lmaWNzKSB7CiAJCQkJCQkJCWNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlLCBudWxsIC8qbm8gbWF0Y2gqLywgdHJ1ZSk7CiAJCQkJCQkJCS8vIGVuc3VyZSB0aGVyZSBpcyBubyBjb2xsaXNpb24gYmV0d2VlbiBib3RoIGludGVyZmFjZXM6IGkuZS4gSTEgZXh0ZW5kcyBMaXN0PFN0cmluZz4sIEkyIGV4dGVuZHMgTGlzdDxPYmplY3Q+Ci0JCQkJCQkJCWlmIChpbnRlcmZhY2VUeXBlLmhhc0luY29tcGF0aWJsZVN1cGVyVHlwZSgoUmVmZXJlbmNlQmluZGluZyljYXN0VHlwZSkpCisJCQkJCQkJCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJCQkJCQlpZiAoaW50ZXJmYWNlVHlwZS5oYXNJbmNvbXBhdGlibGVTdXBlclR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKSkgeworCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIGlmICghY2FzdFR5cGUuaXNSYXdUeXBlKCkgJiYgaW50ZXJmYWNlVHlwZS5oYXNJbmNvbXBhdGlibGVTdXBlclR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKSkgewogCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQl9CiAJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJLy8gcHJlMS41IHNlbWFudGljcyAtIG5vIGNvdmFyaWFuY2UgYWxsb3dlZCAoZXZlbiBpZiAxLjUgY29tcGxpYW50LCBidXQgMS40IHNvdXJjZSkKLQkJCQkJCQkJTWV0aG9kQmluZGluZ1tdIGNhc3RUeXBlTWV0aG9kcyA9IGdldEFsbEluaGVyaXRlZE1ldGhvZHMoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKTsKLQkJCQkJCQkJTWV0aG9kQmluZGluZ1tdIGV4cHJlc3Npb25UeXBlTWV0aG9kcyA9IGdldEFsbEluaGVyaXRlZE1ldGhvZHMoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlKTsKKwkJCQkJCQkJLy8gbG9vayBhdCBvcmlnaW5hbCBtZXRob2RzIHJhdGhlciB0aGFuIHRoZSBwYXJhbWV0ZXJpemVkIHZhcmlhbnRzIGF0IDEuNCB0byBkZXRlY3QKKwkJCQkJCQkJLy8gY292YXJpYW5jZS4gT3RoZXJ3aXNlIHdoZW4gY29uZnJvbnRlZCB3aXRoIG9uZSByYXcgdHlwZSBhbmQgb25lIHBhcmFtZXRlcml6ZWQgdHlwZSwKKwkJCQkJCQkJLy8gd2UgY291bGQgbWlzdGFrZW5seSBkZXRlY3QgY292YXJpYW5jZSBhbmQgc2NyZWFtIGZvdWwuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNzQ0CisJCQkJCQkJCU1ldGhvZEJpbmRpbmdbXSBjYXN0VHlwZU1ldGhvZHMgPSBnZXRBbGxPcmlnaW5hbEluaGVyaXRlZE1ldGhvZHMoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKTsKKwkJCQkJCQkJTWV0aG9kQmluZGluZ1tdIGV4cHJlc3Npb25UeXBlTWV0aG9kcyA9IGdldEFsbE9yaWdpbmFsSW5oZXJpdGVkTWV0aG9kcygoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblR5cGUpOwogCQkJCQkJCQlpbnQgZXhwck1ldGhvZHNMZW5ndGggPSBleHByZXNzaW9uVHlwZU1ldGhvZHMubGVuZ3RoOwogCQkJCQkJCQlmb3IgKGludCBpID0gMCwgY2FzdE1ldGhvZHNMZW5ndGggPSBjYXN0VHlwZU1ldGhvZHMubGVuZ3RoOyBpIDwgY2FzdE1ldGhvZHNMZW5ndGg7IGkrKykgewogCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHByTWV0aG9kc0xlbmd0aDsgaisrKSB7CkBAIC0zOTgsMTIgKzQxMiwxMiBAQAogCQkJCQkJCQkJCQkJJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNhc3RUeXBlTWV0aG9kc1tpXS5zZWxlY3RvciwgZXhwcmVzc2lvblR5cGVNZXRob2RzW2pdLnNlbGVjdG9yKSkKIAkJCQkJCQkJCQkJCSYmIGNhc3RUeXBlTWV0aG9kc1tpXS5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhwcmVzc2lvblR5cGVNZXRob2RzW2pdKSkgewogCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCisKIAkJCQkJCQkJCQl9CiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRydWU7CQkKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJLy8gKCBDTEFTUyApIElOVEVSRkFDRQogCQkJCQkJCWlmIChjYXN0VHlwZS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsgLy8gbm8gcnVudGltZSBlcnJvcgpAQCAtNDEyLDcgKzQyNiw3IEBACiAJCQkJCQkJfQogCQkJCQkJCS8vIGNhbiBvbmx5IGJlIGEgZG93bmNhc3QKIAkJCQkJCQl0YWdBc05lZWRDaGVja0Nhc3QoKTsKLQkJCQkJCQltYXRjaCA9IGNhc3RUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoZXhwcmVzc2lvblR5cGUpOworCQkJCQkJCW1hdGNoID0gY2FzdFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShleHByZXNzaW9uVHlwZSk7CiAJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKIAkJCQkJCQkJcmV0dXJuIGNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlLCBtYXRjaCwgdHJ1ZSk7CiAJCQkJCQkJfQpAQCAtNDIzLDcgKzQzNywxMSBAQAogCQkJCQkJCWlmICh1c2UxNXNwZWNpZmljcykgewogCQkJCQkJCQljaGVja1Vuc2FmZUNhc3Qoc2NvcGUsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSwgbnVsbCAvKm5vIG1hdGNoKi8sIHRydWUpOwogCQkJCQkJCQkvLyBlbnN1cmUgdGhlcmUgaXMgbm8gY29sbGlzaW9uIGJldHdlZW4gYm90aCBpbnRlcmZhY2VzOiBpLmUuIEkxIGV4dGVuZHMgTGlzdDxTdHJpbmc+LCBJMiBleHRlbmRzIExpc3Q8T2JqZWN0PgotCQkJCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKWNhc3RUeXBlKS5oYXNJbmNvbXBhdGlibGVTdXBlclR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlKSkgeworCQkJCQkJCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgeworCQkJCQkJCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZyljYXN0VHlwZSkuaGFzSW5jb21wYXRpYmxlU3VwZXJUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkpIHsKKwkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSBpZiAoIWNhc3RUeXBlLmlzUmF3VHlwZSgpICYmICgoUmVmZXJlbmNlQmluZGluZyljYXN0VHlwZSkuaGFzSW5jb21wYXRpYmxlU3VwZXJUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkpIHsKIAkJCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KQEAgLTQ0MCwyMSArNDU4LDIxIEBACiAJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkKKwogCQkJCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgogCQkJCQkJLy8gKCBUWVBFX1BBUkFNRVRFUiApIENMQVNTCi0JCQkJCQltYXRjaCA9IGV4cHJlc3Npb25UeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoY2FzdFR5cGUpOworCQkJCQkJbWF0Y2ggPSBleHByZXNzaW9uVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGNhc3RUeXBlKTsKIAkJCQkJCWlmIChtYXRjaCA9PSBudWxsKSB7Ci0JCQkJCQkJY2hlY2tVbnNhZmVDYXN0KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIG1hdGNoLCB0cnVlKTsKKwkJCQkJCQljaGVja1Vuc2FmZUNhc3Qoc2NvcGUsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSwgbnVsbCwgdHJ1ZSk7CiAJCQkJCQl9CiAJCQkJCQkvLyByZWN1cnNlIG9uIHRoZSB0eXBlIHZhcmlhYmxlIHVwcGVyIGJvdW5kCiAJCQkJCQlyZXR1cm4gY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpY2FzdFR5cGUpLnVwcGVyQm91bmQoKSwgZXhwcmVzc2lvblR5cGUsIGV4cHJlc3Npb24pOwotCQkJCQkJCisKIAkJCQkJZGVmYXVsdCA6CiAJCQkJCQlpZiAoY2FzdFR5cGUuaXNJbnRlcmZhY2UoKSkgewogCQkJCQkJCS8vICggSU5URVJGQUNFICkgQ0xBU1MKIAkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZkV4cHJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlOwotCQkJCQkJCW1hdGNoID0gcmVmRXhwclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShjYXN0VHlwZSk7CisJCQkJCQkJbWF0Y2ggPSByZWZFeHByVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGNhc3RUeXBlKTsKIAkJCQkJCQlpZiAobWF0Y2ggIT0gbnVsbCkgewogCQkJCQkJCQlyZXR1cm4gY2hlY2tVbnNhZmVDYXN0KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIG1hdGNoLCBmYWxzZSk7CiAJCQkJCQkJfQpAQCAtNDYzLDI1ICs0ODEsMzAgQEAKIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJCX0KIAkJCQkJCQl0YWdBc05lZWRDaGVja0Nhc3QoKTsKLQkJCQkJCQltYXRjaCA9IGNhc3RUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoZXhwcmVzc2lvblR5cGUpOworCQkJCQkJCW1hdGNoID0gY2FzdFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShleHByZXNzaW9uVHlwZSk7CiAJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKIAkJCQkJCQkJcmV0dXJuIGNoZWNrVW5zYWZlQ2FzdChzY29wZSwgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlLCBtYXRjaCwgdHJ1ZSk7CiAJCQkJCQkJfQogCQkJCQkJCWlmICh1c2UxNXNwZWNpZmljcykgewogCQkJCQkJCQljaGVja1Vuc2FmZUNhc3Qoc2NvcGUsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSwgbnVsbCAvKm5vIG1hdGNoKi8sIHRydWUpOwogCQkJCQkJCQkvLyBlbnN1cmUgdGhlcmUgaXMgbm8gY29sbGlzaW9uIGJldHdlZW4gYm90aCBpbnRlcmZhY2VzOiBpLmUuIEkxIGV4dGVuZHMgTGlzdDxTdHJpbmc+LCBJMiBleHRlbmRzIExpc3Q8T2JqZWN0PgotCQkJCQkJCQlpZiAocmVmRXhwclR5cGUuaGFzSW5jb21wYXRpYmxlU3VwZXJUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VHlwZSkpCisJCQkJCQkJCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJCQkJCQlpZiAocmVmRXhwclR5cGUuaGFzSW5jb21wYXRpYmxlU3VwZXJUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VHlwZSkpIHsKKwkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSBpZiAoIWNhc3RUeXBlLmlzUmF3VHlwZSgpICYmIHJlZkV4cHJUeXBlLmhhc0luY29tcGF0aWJsZVN1cGVyVHlwZSgoUmVmZXJlbmNlQmluZGluZykgY2FzdFR5cGUpKSB7CiAJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQkJCQkJCQkJCisJCQkJCQkJCX0KKwkJCQkJCQl9CiAJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCS8vICggQ0xBU1MgKSBDTEFTUwotCQkJCQkJCW1hdGNoID0gZXhwcmVzc2lvblR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShjYXN0VHlwZSk7CisJCQkJCQkJbWF0Y2ggPSBleHByZXNzaW9uVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGNhc3RUeXBlKTsKIAkJCQkJCQlpZiAobWF0Y2ggIT0gbnVsbCkgewogCQkJCQkJCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGNhc3RUeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgdGhpcy5jb25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQ7IC8vIChTdHJpbmcpIGNzdCBpcyBzdGlsbCBhIGNvbnN0YW50CiAJCQkJCQkJCXJldHVybiBjaGVja1Vuc2FmZUNhc3Qoc2NvcGUsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSwgbWF0Y2gsIGZhbHNlKTsKIAkJCQkJCQl9Ci0JCQkJCQkJbWF0Y2ggPSBjYXN0VHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGV4cHJlc3Npb25UeXBlKTsKKwkJCQkJCQltYXRjaCA9IGNhc3RUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZXhwcmVzc2lvblR5cGUpOwogCQkJCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7CiAJCQkJCQkJCXRhZ0FzTmVlZENoZWNrQ2FzdCgpOwogCQkJCQkJCQlyZXR1cm4gY2hlY2tVbnNhZmVDYXN0KHNjb3BlLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUsIG1hdGNoLCB0cnVlKTsKQEAgLTQ5MSwzMjUgKzUxNCwzNDkgQEAKIAkJCQl9CiAJCQl9CiAJfQotfQkKLQkKK30KKwogLyoqCi0gKiBDaGVjayB0aGUgbG9jYWwgdmFyaWFibGUgb2YgdGhpcyBleHByZXNzaW9uLCBpZiBhbnksIGFnYWluc3QgcG90ZW50aWFsIE5QRXMgCisgKiBDaGVjayB0aGUgbG9jYWwgdmFyaWFibGUgb2YgdGhpcyBleHByZXNzaW9uLCBpZiBhbnksIGFnYWluc3QgcG90ZW50aWFsIE5QRXMKICAqIGdpdmVuIGEgZmxvdyBjb250ZXh0IGFuZCBhbiB1cHN0cmVhbSBmbG93IGluZm8uIElmIHNvLCByZXBvcnQgdGhlIHJpc2sgdG8KICAqIHRoZSBjb250ZXh0LiBNYXJrcyB0aGUgbG9jYWwgYXMgY2hlY2tlZCwgd2hpY2ggYWZmZWN0cyB0aGUgZmxvdyBpbmZvLgogICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBvZiB0aGUgYW5hbHlzaXMKICAqIEBwYXJhbSBmbG93Q29udGV4dCB0aGUgY3VycmVudCBmbG93IGNvbnRleHQKICAqIEBwYXJhbSBmbG93SW5mbyB0aGUgdXBzdHJlYW0gZmxvdyBpbmZvOyBjYXZlYXQ6IG1heSBnZXQgbW9kaWZpZWQKICAqLwotcHVibGljIHZvaWQgY2hlY2tOUEUoQmxvY2tTY29wZSBzY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gdGhpcy5sb2NhbFZhcmlhYmxlQmluZGluZygpOwotCWlmIChsb2NhbCAhPSBudWxsICYmIAorcHVibGljIHZvaWQgY2hlY2tOUEUoQmxvY2tTY29wZSBzY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBsb2NhbFZhcmlhYmxlQmluZGluZygpOworCWlmIChsb2NhbCAhPSBudWxsICYmCiAJCQkobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSA9PSAwKSB7CiAJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5Jc05vbk51bGwpID09IDApIHsKLQkJCWZsb3dDb250ZXh0LnJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShzY29wZSwgbG9jYWwsIHRoaXMsIAorCQkJZmxvd0NvbnRleHQucmVjb3JkVXNpbmdOdWxsUmVmZXJlbmNlKHNjb3BlLCBsb2NhbCwgdGhpcywKIAkJCQkJRmxvd0NvbnRleHQuTUFZX05VTEwsIGZsb3dJbmZvKTsKIAkJfQotCQlmbG93SW5mby5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsgCisJCWZsb3dJbmZvLm1hcmtBc0NvbXBhcmVkRXF1YWxUb05vbk51bGwobG9jYWwpOwogCQkJLy8gZnJvbSB0aGVyZW9uIGl0IGlzIHNldAorCQlpZiAoKGZsb3dDb250ZXh0LnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSAhPSAwKSB7CisJCQlmbG93SW5mby5tYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpOworCQl9CiAJCWlmIChmbG93Q29udGV4dC5pbml0c09uRmluYWxseSAhPSBudWxsKSB7Ci0JCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsgCisJCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsKKwkJCWlmICgoZmxvd0NvbnRleHQudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpICE9IDApIHsKKwkJCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpOworCQkJfQogCQl9CiAJfQogfQogCiBwdWJsaWMgYm9vbGVhbiBjaGVja1Vuc2FmZUNhc3QoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGNhc3RUeXBlLCBUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcgbWF0Y2gsIGJvb2xlYW4gaXNOYXJyb3dpbmcpIHsKLQkJaWYgKG1hdGNoID09IGNhc3RUeXBlKSB7Ci0JCQlpZiAoIWlzTmFycm93aW5nKSB0YWdBc1VubmVjZXNzYXJ5Q2FzdChzY29wZSwgY2FzdFR5cGUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG1hdGNoICE9IG51bGwgJiYgKAotCQkJCWNhc3RUeXBlLmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpIAotCQkJCXx8IAlleHByZXNzaW9uVHlwZS5pc0JvdW5kUGFyYW1ldGVyaXplZFR5cGUoKSkpIHsKLQkJCQotCQkJaWYgKG1hdGNoLmlzUHJvdmFibHlEaXN0aW5jdEZyb20oaXNOYXJyb3dpbmcgPyBleHByZXNzaW9uVHlwZSA6IGNhc3RUeXBlLCAwKSkgewotCQkJCXJldHVybiBmYWxzZTsgCi0JCQl9Ci0JCX0KKwlpZiAobWF0Y2ggPT0gY2FzdFR5cGUpIHsKIAkJaWYgKCFpc05hcnJvd2luZykgdGFnQXNVbm5lY2Vzc2FyeUNhc3Qoc2NvcGUsIGNhc3RUeXBlKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCS8qKgotCSAqIEJhc2UgdHlwZXMgbmVlZCB0aGF0IHRoZSB3aWRlbmluZyBpcyBleHBsaWNpdGx5IGRvbmUgYnkgdGhlIGNvbXBpbGVyIHVzaW5nIHNvbWUgYnl0ZWNvZGUgbGlrZSBpMmYuCi0JICogQWxzbyBjaGVjayB1bnNhZmUgdHlwZSBvcGVyYXRpb25zLgotCSAqLyAKLQlwdWJsaWMgdm9pZCBjb21wdXRlQ29udmVyc2lvbihTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgcnVudGltZVR5cGUsIFR5cGVCaW5kaW5nIGNvbXBpbGVUaW1lVHlwZSkgewotCi0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsIHx8IGNvbXBpbGVUaW1lVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gIT0gMCkgcmV0dXJuOyAvLyBhbHJlYWR5IHNldCBpbmRlcGVuZGFudGx5Ci0JCQotCQkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgYSBCeXRlIHRvIGJlIHVuYm94ZWQgdG8gYSBieXRlICYgdGhlbiBjb252ZXJ0ZWQgdG8gYW4gaW50Ci0JCS8vIGJ1dCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGEgYnl0ZSB0byBiZWNvbWUgQnl0ZSAmIHRoZW4gYXNzaWduZWQgdG8gYW4gSW50ZWdlciwKLQkJLy8gb3IgdG8gYmVjb21lIGFuIGludCBiZWZvcmUgYm94ZWQgaW50byBhbiBJbnRlZ2VyCi0JCWlmIChydW50aW1lVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMICYmIHJ1bnRpbWVUeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJaWYgKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJVHlwZUJpbmRpbmcgdW5ib3hlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGNvbXBpbGVUaW1lVHlwZSk7Ci0JCQkJdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gPSBUeXBlSWRzLlVOQk9YSU5HOwotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmF1dG9ib3hpbmcodGhpcywgY29tcGlsZVRpbWVUeXBlLCBydW50aW1lVHlwZSk7Ci0JCQkJY29tcGlsZVRpbWVUeXBlID0gdW5ib3hlZFR5cGU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29tcGlsZVRpbWVUeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwgJiYgY29tcGlsZVRpbWVUeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJVHlwZUJpbmRpbmcgYm94ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShydW50aW1lVHlwZSk7Ci0JCQlpZiAoYm94ZWRUeXBlID09IHJ1bnRpbWVUeXBlKSAvLyBPYmplY3QgbyA9IDEyOwotCQkJCWJveGVkVHlwZSA9IGNvbXBpbGVUaW1lVHlwZTsgCi0JCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbiA9IFR5cGVJZHMuQk9YSU5HIHwgKGJveGVkVHlwZS5pZCA8PCA0KSArIGNvbXBpbGVUaW1lVHlwZS5pZDsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmF1dG9ib3hpbmcodGhpcywgY29tcGlsZVRpbWVUeXBlLCBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGJveGVkVHlwZSkpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIHRoaXMuY29uc3RhbnQudHlwZUlEKCkgIT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7Ci0JCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbiA9IFR5cGVJZHMuQk9YSU5HOwotCQkJcmV0dXJuOworCWlmIChtYXRjaCAhPSBudWxsICYmICghY2FzdFR5cGUuaXNSZWlmaWFibGUoKSB8fCAhZXhwcmVzc2lvblR5cGUuaXNSZWlmaWFibGUoKSkpIHsKKwkJaWYoaXNOYXJyb3dpbmcKKwkJCQk/IG1hdGNoLmlzUHJvdmFibHlEaXN0aW5jdChleHByZXNzaW9uVHlwZSkKKwkJCQk6IGNhc3RUeXBlLmlzUHJvdmFibHlEaXN0aW5jdChtYXRjaCkpIHsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlpbnQgY29tcGlsZVRpbWVUeXBlSUQsIHJ1bnRpbWVUeXBlSUQ7Ci0JCWlmICgoY29tcGlsZVRpbWVUeXBlSUQgPSBjb21waWxlVGltZVR5cGUuaWQpID09IFR5cGVJZHMuTm9JZCkgeyAvLyBlLmcuID8gZXh0ZW5kcyBTdHJpbmcgID09PiBTdHJpbmcgKDEwMzIyNykKLQkJCWNvbXBpbGVUaW1lVHlwZUlEID0gY29tcGlsZVRpbWVUeXBlLmVyYXN1cmUoKS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcgPyBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcgOiBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3Q7Ci0JCX0JCQotCQlzd2l0Y2ggKHJ1bnRpbWVUeXBlSUQgPSBydW50aW1lVHlwZS5pZCkgewotCQkJY2FzZSBUX2J5dGUgOgotCQkJY2FzZSBUX3Nob3J0IDoKLQkJCWNhc2UgVF9jaGFyIDoKLQkJCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbiB8PSAoVHlwZUlkcy5UX2ludCA8PCA0KSArIGNvbXBpbGVUaW1lVHlwZUlEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKLQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQljYXNlIFRfZG91YmxlIDoKLQkJCWNhc2UgVF9pbnQgOiAvL2ltcGxpY2l0Q29udmVyc2lvbiBtYXkgcmVzdWx0IGluIGkyaSB3aGljaCB3aWxsIHJlc3VsdCBpbiBOTyBjb2RlIGdlbgotCQkJY2FzZSBUX2xvbmcgOgorCX0KKwlpZiAoIWlzTmFycm93aW5nKSB0YWdBc1VubmVjZXNzYXJ5Q2FzdChzY29wZSwgY2FzdFR5cGUpOworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIEJhc2UgdHlwZXMgbmVlZCB0aGF0IHRoZSB3aWRlbmluZyBpcyBleHBsaWNpdGx5IGRvbmUgYnkgdGhlIGNvbXBpbGVyIHVzaW5nIHNvbWUgYnl0ZWNvZGUgbGlrZSBpMmYuCisgKiBBbHNvIGNoZWNrIHVuc2FmZSB0eXBlIG9wZXJhdGlvbnMuCisgKi8KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb252ZXJzaW9uKFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBydW50aW1lVHlwZSwgVHlwZUJpbmRpbmcgY29tcGlsZVRpbWVUeXBlKSB7CisJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwgfHwgY29tcGlsZVRpbWVUeXBlID09IG51bGwpCisJCXJldHVybjsKKwlpZiAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gIT0gMCkgcmV0dXJuOyAvLyBhbHJlYWR5IHNldCBpbmRlcGVuZGFudGx5CisKKwkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgYSBCeXRlIHRvIGJlIHVuYm94ZWQgdG8gYSBieXRlICYgdGhlbiBjb252ZXJ0ZWQgdG8gYW4gaW50CisJLy8gYnV0IGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYSBieXRlIHRvIGJlY29tZSBCeXRlICYgdGhlbiBhc3NpZ25lZCB0byBhbiBJbnRlZ2VyLAorCS8vIG9yIHRvIGJlY29tZSBhbiBpbnQgYmVmb3JlIGJveGVkIGludG8gYW4gSW50ZWdlcgorCWlmIChydW50aW1lVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMICYmIHJ1bnRpbWVUeXBlLmlzQmFzZVR5cGUoKSkgeworCQlpZiAoIWNvbXBpbGVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCVR5cGVCaW5kaW5nIHVuYm94ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShjb21waWxlVGltZVR5cGUpOworCQkJdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gPSBUeXBlSWRzLlVOQk9YSU5HOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXV0b2JveGluZyh0aGlzLCBjb21waWxlVGltZVR5cGUsIHJ1bnRpbWVUeXBlKTsKKwkJCWNvbXBpbGVUaW1lVHlwZSA9IHVuYm94ZWRUeXBlOworCQl9CisJfSBlbHNlIGlmIChjb21waWxlVGltZVR5cGUgIT0gVHlwZUJpbmRpbmcuTlVMTCAmJiBjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCVR5cGVCaW5kaW5nIGJveGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUocnVudGltZVR5cGUpOworCQlpZiAoYm94ZWRUeXBlID09IHJ1bnRpbWVUeXBlKSAvLyBPYmplY3QgbyA9IDEyOworCQkJYm94ZWRUeXBlID0gY29tcGlsZVRpbWVUeXBlOworCQl0aGlzLmltcGxpY2l0Q29udmVyc2lvbiA9IFR5cGVJZHMuQk9YSU5HIHwgKGJveGVkVHlwZS5pZCA8PCA0KSArIGNvbXBpbGVUaW1lVHlwZS5pZDsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXV0b2JveGluZyh0aGlzLCBjb21waWxlVGltZVR5cGUsIHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoYm94ZWRUeXBlKSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIHRoaXMuY29uc3RhbnQudHlwZUlEKCkgIT0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nKSB7CisJCXRoaXMuaW1wbGljaXRDb252ZXJzaW9uID0gVHlwZUlkcy5CT1hJTkc7CisJCXJldHVybjsKKwl9CisJaW50IGNvbXBpbGVUaW1lVHlwZUlELCBydW50aW1lVHlwZUlEOworCWlmICgoY29tcGlsZVRpbWVUeXBlSUQgPSBjb21waWxlVGltZVR5cGUuaWQpID09IFR5cGVJZHMuTm9JZCkgeyAvLyBlLmcuID8gZXh0ZW5kcyBTdHJpbmcgID09PiBTdHJpbmcgKDEwMzIyNykKKwkJY29tcGlsZVRpbWVUeXBlSUQgPSBjb21waWxlVGltZVR5cGUuZXJhc3VyZSgpLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyA/IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyA6IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdDsKKwl9CisJc3dpdGNoIChydW50aW1lVHlwZUlEID0gcnVudGltZVR5cGUuaWQpIHsKKwkJY2FzZSBUX2J5dGUgOgorCQljYXNlIFRfc2hvcnQgOgorCQljYXNlIFRfY2hhciA6CisJCQlpZiAoY29tcGlsZVRpbWVUeXBlSUQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7CiAJCQkJdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gfD0gKHJ1bnRpbWVUeXBlSUQgPDwgNCkgKyBjb21waWxlVGltZVR5cGVJRDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOiAvLyByZWd1bGFyIG9iamVjdCByZWYKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gfD0gKFR5cGVJZHMuVF9pbnQgPDwgNCkgKyBjb21waWxlVGltZVR5cGVJRDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQljYXNlIFRfZmxvYXQgOgorCQljYXNlIFRfYm9vbGVhbiA6CisJCWNhc2UgVF9kb3VibGUgOgorCQljYXNlIFRfaW50IDogLy9pbXBsaWNpdENvbnZlcnNpb24gbWF5IHJlc3VsdCBpbiBpMmkgd2hpY2ggd2lsbCByZXN1bHQgaW4gTk8gY29kZSBnZW4KKwkJY2FzZSBUX2xvbmcgOgorCQkJdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gfD0gKHJ1bnRpbWVUeXBlSUQgPDwgNCkgKyBjb21waWxlVGltZVR5cGVJRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDogLy8gcmVndWxhciBvYmplY3QgcmVmCiAvLwkJCQlpZiAoY29tcGlsZVRpbWVUeXBlLmlzUmF3VHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0JvdW5kUGFyYW1ldGVyaXplZFR5cGUoKSkgewogLy8JCQkJICAgIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZVJhd0V4cHJlc3Npb24odGhpcywgY29tcGlsZVRpbWVUeXBlLCBydW50aW1lVGltZVR5cGUpOwotLy8JCQkJfQkJCi0JCX0KKy8vCQkJCX0KIAl9Cit9CiAKLQkvKioKLQkgKiBFeHByZXNzaW9uIHN0YXRlbWVudHMgYXJlIHBsYWluIGV4cHJlc3Npb25zLCBob3dldmVyIHRoZXkgZ2VuZXJhdGUgbGlrZQotCSAqIG5vcm1hbCBleHByZXNzaW9ucyB3aXRoIG5vIHZhbHVlIHJlcXVpcmVkLgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtIAotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7Ci0KLQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzUmVhY2hhYmxlKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworLyoqCisgKiBFeHByZXNzaW9uIHN0YXRlbWVudHMgYXJlIHBsYWluIGV4cHJlc3Npb25zLCBob3dldmVyIHRoZXkgZ2VuZXJhdGUgbGlrZQorICogbm9ybWFsIGV4cHJlc3Npb25zIHdpdGggbm8gdmFsdWUgcmVxdWlyZWQuCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNSZWFjaGFibGUpID09IDApIHsKKwkJcmV0dXJuOwogCX0KLQkKLQkvKioKLQkgKiBFdmVyeSBleHByZXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGl0cyBpbXBsaWNpdCBjb252ZXJzaW9uIHdoZW4gbmVjZXNzYXJ5LgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCi0JICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworfQogCi0JCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJLy8gZ2VuZXJhdGUgYSBjb25zdGFudCBleHByZXNzaW9uCi0JCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisvKioKKyAqIEV2ZXJ5IGV4cHJlc3Npb24gaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgaXRzIGltcGxpY2l0IGNvbnZlcnNpb24gd2hlbiBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkvLyBnZW5lcmF0ZSBhIGNvbnN0YW50IGV4cHJlc3Npb24KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9IGVsc2UgeworCQkvLyBhY3R1YWwgbm9uLWNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbgorCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KE1lc3NhZ2VzLmFzdF9taXNzaW5nQ29kZSk7CisJfQorfQorCisvKioKKyAqIERlZmF1bHQgZ2VuZXJhdGlvbiBvZiBhIGJvb2xlYW4gdmFsdWUKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtCisgKiBAcGFyYW0gdHJ1ZUxhYmVsCisgKiBAcGFyYW0gZmFsc2VMYWJlbAorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQKKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEJyYW5jaExhYmVsIHRydWVMYWJlbCwgQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJLy8gYSBsYWJlbCB2YWx1ZWQgdG8gbmlsIG1lYW5zOiBieSBkZWZhdWx0IHdlIGZhbGwgdGhyb3VnaCB0aGUgY2FzZS4uLgorCS8vIGJvdGggbmlsIG1lYW5zIHdlIGxlYXZlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sKKworCUNvbnN0YW50IGNzdCA9IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCWdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQgJiYgY3N0ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCk7CisJaWYgKChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY3N0LnR5cGVJRCgpID09IFR5cGVJZHMuVF9ib29sZWFuKSkgeworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCS8vIGNvbnN0YW50ID09IHRydWUKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQljb2RlU3RyZWFtLmdvdG9fKHRydWVMYWJlbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQkvLyBhY3R1YWwgbm9uLWNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbgotCQkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChNZXNzYWdlcy5hc3RfbWlzc2luZ0NvZGUpOyAKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogRGVmYXVsdCBnZW5lcmF0aW9uIG9mIGEgYm9vbGVhbiB2YWx1ZQotCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbQotCSAqIEBwYXJhbSB0cnVlTGFiZWwKLQkgKiBAcGFyYW0gZmFsc2VMYWJlbAotCSAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAotCQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCi0JCQlCcmFuY2hMYWJlbCB0cnVlTGFiZWwsCi0JCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsLAotCQkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0KLQkJLy8gYSBsYWJlbCB2YWx1ZWQgdG8gbmlsIG1lYW5zOiBieSBkZWZhdWx0IHdlIGZhbGwgdGhyb3VnaCB0aGUgY2FzZS4uLiAKLQkJLy8gYm90aCBuaWwgbWVhbnMgd2UgbGVhdmUgdGhlIHZhbHVlIG9uIHRoZSBzdGFjawotCi0JCUNvbnN0YW50IGNzdCA9IHRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7Ci0JCWdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQgJiYgY3N0ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCk7Ci0JCWlmICgoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNzdC50eXBlSUQoKSA9PSBUeXBlSWRzLlRfYm9vbGVhbikpIHsKLQkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKLQkJCQkvLyBjb25zdGFudCA9PSB0cnVlCi0JCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewotCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCi0JCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdvdG9fKHRydWVMYWJlbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCi0JCQkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdvdG9fKGZhbHNlTGFiZWwpOwotCQkJCQkJfQorCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoZmFsc2VMYWJlbCAhPSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhmYWxzZUxhYmVsKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJcmV0dXJuOworCX0KKwkvLyBicmFuY2hpbmcKKwlpbnQgcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCS8vIEltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCWNvZGVTdHJlYW0uaWZuZSh0cnVlTGFiZWwpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJLy8gSW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQljb2RlU3RyZWFtLmlmZXEoZmFsc2VMYWJlbCk7CisJCQl9IGVsc2UgeworCQkJCS8vIE5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCX0KKwkJfQorCX0KKwkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBwb3NpdGlvbik7Cit9CisKKy8qIE9wdGltaXplZCAoamF2YSkgY29kZSBnZW5lcmF0aW9uIGZvciBzdHJpbmcgY29uY2F0ZW5hdGlvbnMgdGhhdCBpbnZvbHZlIFN0cmluZ0J1ZmZlcgorICogY3JlYXRpb246IGdvaW5nIHRocm91Z2ggdGhpcyBwYXRoIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBuZXcgU3RyaW5nQnVmZmVyCisgKiBjcmVhdGlvbiwgZnVydGhlciBvcGVyYW5kcyBzaG91bGQgcmF0aGVyIGJlIG9ubHkgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgb25lLgorICogQnkgZGVmYXVsdDogbm8gb3B0aW1pemF0aW9uLgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oQmxvY2tTY29wZSBibG9ja1Njb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGludCB0eXBlSUQpIHsKKwlpZiAodHlwZUlEID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyAmJiB0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiB0aGlzLmNvbnN0YW50LnN0cmluZ1ZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm47IC8vIG9wdGltaXplIHN0ciArICIiCisJfQorCWdlbmVyYXRlQ29kZShibG9ja1Njb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwljb2RlU3RyZWFtLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmRGb3JUeXBlKHR5cGVJRCk7Cit9CisKKy8qIE9wdGltaXplZCAoamF2YSkgY29kZSBnZW5lcmF0aW9uIGZvciBzdHJpbmcgY29uY2F0ZW5hdGlvbnMgdGhhdCBpbnZvbHZlIFN0cmluZ0J1ZmZlcgorICogY3JlYXRpb246IGdvaW5nIHRocm91Z2ggdGhpcyBwYXRoIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBuZXcgU3RyaW5nQnVmZmVyCisgKiBjcmVhdGlvbiwgZnVydGhlciBvcGVyYW5kcyBzaG91bGQgcmF0aGVyIGJlIG9ubHkgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgb25lLgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb25DcmVhdGlvbihCbG9ja1Njb3BlIGJsb2NrU2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgaW50IHR5cGVJRCkgeworCWNvZGVTdHJlYW0ubmV3U3RyaW5nQ29udGF0ZW5hdGlvbigpOworCWNvZGVTdHJlYW0uZHVwKCk7CisJc3dpdGNoICh0eXBlSUQpIHsKKwkJY2FzZSBUX0phdmFMYW5nT2JqZWN0IDoKKwkJY2FzZSBUX3VuZGVmaW5lZCA6CisJCQkvLyBpbiB0aGUgY2FzZSB0aGUgcnVudGltZSB2YWx1ZSBvZiB2YWx1ZU9mKE9iamVjdCkgcmV0dXJucyBudWxsLCB3ZSBoYXZlIHRvIHVzZSBhcHBlbmQoT2JqZWN0KSBpbnN0ZWFkIG9mIGRpcmVjdGx5IHZhbHVlT2YoT2JqZWN0KQorCQkJLy8gYXBwZW5kKE9iamVjdCkgcmV0dXJucyBhcHBlbmQodmFsdWVPZihPYmplY3QpKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbnVsbCBjYXNlIGlzIGhhbmRsZWQgYnkgdGhlIG5leHQgY2FzZS4KKwkJCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvbkRlZmF1bHRDb25zdHJ1Y3RvcigpOworCQkJZ2VuZXJhdGVDb2RlKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kRm9yVHlwZShUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpOwogCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGJyYW5jaGluZwotCQlpbnQgcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgewotCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewotCQkJCQkvLyBJbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKLQkJCQkJY29kZVN0cmVhbS5pZm5lKHRydWVMYWJlbCk7CisJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZyA6CisJCWNhc2UgVF9udWxsIDoKKwkJCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHRoaXMuY29uc3RhbnQuc3RyaW5nVmFsdWUoKTsKKwkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgeyAgLy8gb3B0aW1pemUgIiIrPHN0cj4KKwkJCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uRGVmYXVsdENvbnN0cnVjdG9yKCk7CisJCQkJCXJldHVybjsKIAkJCQl9CisJCQkJY29kZVN0cmVhbS5sZGMoc3RyaW5nVmFsdWUpOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKLQkJCQkJLy8gSW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKLQkJCQkJY29kZVN0cmVhbS5pZmVxKGZhbHNlTGFiZWwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIE5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKLQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKiBPcHRpbWl6ZWQgKGphdmEpIGNvZGUgZ2VuZXJhdGlvbiBmb3Igc3RyaW5nIGNvbmNhdGVuYXRpb25zIHRoYXQgaW52b2x2ZSBTdHJpbmdCdWZmZXIKLQkgKiBjcmVhdGlvbjogZ29pbmcgdGhyb3VnaCB0aGlzIHBhdGggbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIG5ldyBTdHJpbmdCdWZmZXIKLQkgKiBjcmVhdGlvbiwgZnVydGhlciBvcGVyYW5kcyBzaG91bGQgcmF0aGVyIGJlIG9ubHkgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgb25lLgotCSAqIEJ5IGRlZmF1bHQ6IG5vIG9wdGltaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0NvbmNhdGVuYXRpb24oCi0JCUJsb2NrU2NvcGUgYmxvY2tTY29wZSwKLQkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAotCQlpbnQgdHlwZUlEKSB7Ci0KLQkJaWYgKHR5cGVJRCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcgJiYgdGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgdGhpcy5jb25zdGFudC5zdHJpbmdWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsgLy8gb3B0aW1pemUgc3RyICsgIiIKLQkJfQotCQlnZW5lcmF0ZUNvZGUoYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvbkFwcGVuZEZvclR5cGUodHlwZUlEKTsKLQl9Ci0KLQkvKiBPcHRpbWl6ZWQgKGphdmEpIGNvZGUgZ2VuZXJhdGlvbiBmb3Igc3RyaW5nIGNvbmNhdGVuYXRpb25zIHRoYXQgaW52b2x2ZSBTdHJpbmdCdWZmZXIKLQkgKiBjcmVhdGlvbjogZ29pbmcgdGhyb3VnaCB0aGlzIHBhdGggbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIG5ldyBTdHJpbmdCdWZmZXIKLQkgKiBjcmVhdGlvbiwgZnVydGhlciBvcGVyYW5kcyBzaG91bGQgcmF0aGVyIGJlIG9ubHkgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uKAotCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQkJaW50IHR5cGVJRCkgewotCi0JCWNvZGVTdHJlYW0ubmV3U3RyaW5nQ29udGF0ZW5hdGlvbigpOwotCQljb2RlU3RyZWFtLmR1cCgpOwotCQlzd2l0Y2ggKHR5cGVJRCkgewotCQkJY2FzZSBUX0phdmFMYW5nT2JqZWN0IDoKLQkJCWNhc2UgVF91bmRlZmluZWQgOgotCQkJCS8vIGluIHRoZSBjYXNlIHRoZSBydW50aW1lIHZhbHVlIG9mIHZhbHVlT2YoT2JqZWN0KSByZXR1cm5zIG51bGwsIHdlIGhhdmUgdG8gdXNlIGFwcGVuZChPYmplY3QpIGluc3RlYWQgb2YgZGlyZWN0bHkgdmFsdWVPZihPYmplY3QpCi0JCQkJLy8gYXBwZW5kKE9iamVjdCkgcmV0dXJucyBhcHBlbmQodmFsdWVPZihPYmplY3QpKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbnVsbCBjYXNlIGlzIGhhbmRsZWQgYnkgdGhlIG5leHQgY2FzZS4KLQkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25EZWZhdWx0Q29uc3RydWN0b3IoKTsKKwkJCQkvLyBudWxsIGNhc2UgaXMgbm90IGEgY29uc3RhbnQKIAkJCQlnZW5lcmF0ZUNvZGUoYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kRm9yVHlwZShUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZyA6Ci0JCQljYXNlIFRfbnVsbCA6Ci0JCQkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHRoaXMuY29uc3RhbnQuc3RyaW5nVmFsdWUoKTsKLQkJCQkJaWYgKHN0cmluZ1ZhbHVlLmxlbmd0aCgpID09IDApIHsgIC8vIG9wdGltaXplICIiKzxzdHI+IAotCQkJCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uRGVmYXVsdENvbnN0cnVjdG9yKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5sZGMoc3RyaW5nVmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG51bGwgY2FzZSBpcyBub3QgYSBjb25zdGFudAotCQkJCQlnZW5lcmF0ZUNvZGUoYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nVmFsdWVPZihUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWdlbmVyYXRlQ29kZShibG9ja1Njb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ1ZhbHVlT2YodHlwZUlEKTsKLQkJfQotCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25TdHJpbmdDb25zdHJ1Y3RvcigpOwotCX0KLQotCXByaXZhdGUgTWV0aG9kQmluZGluZ1tdIGdldEFsbEluaGVyaXRlZE1ldGhvZHMoUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nKSB7Ci0JCUFycmF5TGlzdCBjb2xsZWN0b3IgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEluaGVyaXRlZE1ldGhvZHMwKGJpbmRpbmcsIGNvbGxlY3Rvcik7Ci0JCXJldHVybiAoTWV0aG9kQmluZGluZ1tdKSBjb2xsZWN0b3IudG9BcnJheShuZXcgTWV0aG9kQmluZGluZ1tjb2xsZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEluaGVyaXRlZE1ldGhvZHMwKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZywgQXJyYXlMaXN0IGNvbGxlY3RvcikgewotCQlpZiAoIWJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgcmV0dXJuOwotCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kQmluZGluZ3MgPSBiaW5kaW5nLm1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZEJpbmRpbmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQljb2xsZWN0b3IuYWRkKG1ldGhvZEJpbmRpbmdzW2ldKTsKLQkJfQotCQlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gYmluZGluZy5zdXBlckludGVyZmFjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJZ2V0QWxsSW5oZXJpdGVkTWV0aG9kczAoc3VwZXJJbnRlcmZhY2VzW2ldLCBjb2xsZWN0b3IpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0KLQkvL1JldHVybiB0cnVlIGlmIHRoZSBjb252ZXJzaW9uIGlzIGRvbmUgQVVUT01BVElDQUxMWSBieSB0aGUgdm0KLQkvL3doaWxlIHRoZSBqYXZhVk0gaXMgYW4gaW50IGJhc2VkLW1hY2hpbmUsIHRodXMgZm9yIGV4YW1wbGUgcHVzaGluZwotCS8vYSBieXRlIG9udG8gdGhlIHN0YWNrICwgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhbiBpbnQgb24gdGhlIHN0YWNrCi0JLy8odGhpcyByZXF1ZXN0IHNvbWUgd29yayBkIGJlIGRvbmUgYnkgdGhlIFZNIG9uIHNpZ25lZCBudW1iZXJzKQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoVHlwZUJpbmRpbmcgY29uc3RhbnRUeXBlLCBUeXBlQmluZGluZyB0YXJnZXRUeXBlKSB7Ci0KLQkJaWYgKHRoaXMuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY29uc3RhbnRUeXBlID09IHRhcmdldFR5cGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNvbnN0YW50VHlwZS5pc0Jhc2VUeXBlKCkgJiYgdGFyZ2V0VHlwZS5pc0Jhc2VUeXBlKCkpIHsKLQkJCS8vTm8gZnJlZSBhc3NpZ25tZW50IGNvbnZlcnNpb24gZnJvbSBhbnl0aGluZyBidXQgdG8gaW50ZWdyYWwgb25lcy4KLQkJCWlmICgoY29uc3RhbnRUeXBlID09IFR5cGVCaW5kaW5nLklOVAotCQkJCXx8IEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKFR5cGVJZHMuVF9pbnQsIGNvbnN0YW50VHlwZS5pZCkpCi0JCQkJJiYgKEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyh0YXJnZXRUeXBlLmlkLCBUeXBlSWRzLlRfaW50KSkpIHsKLQkJCQkvL3VzZSBjdXJyZW50IGV4cGxpY2l0IGNvbnZlcnNpb24gaW4gb3JkZXIgdG8gZ2V0IHNvbWUgbmV3IHZhbHVlIHRvIGNvbXBhcmUgd2l0aCBjdXJyZW50IG9uZQotCQkJCXJldHVybiBpc0NvbnN0YW50VmFsdWVSZXByZXNlbnRhYmxlKHRoaXMuY29uc3RhbnQsIGNvbnN0YW50VHlwZS5pZCwgdGFyZ2V0VHlwZS5pZCk7CisJCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdWYWx1ZU9mKFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCk7CiAJCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJZ2VuZXJhdGVDb2RlKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdWYWx1ZU9mKHR5cGVJRCk7CiAJfQorCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvblN0cmluZ0NvbnN0cnVjdG9yKCk7Cit9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKK3ByaXZhdGUgTWV0aG9kQmluZGluZ1tdIGdldEFsbE9yaWdpbmFsSW5oZXJpdGVkTWV0aG9kcyhSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsKKwlBcnJheUxpc3QgY29sbGVjdG9yID0gbmV3IEFycmF5TGlzdCgpOworCWdldEFsbEluaGVyaXRlZE1ldGhvZHMwKGJpbmRpbmcsIGNvbGxlY3Rvcik7CisJZm9yIChpbnQgaSA9IDAsIGxlbiA9IGNvbGxlY3Rvci5zaXplKCk7IGkgPCBsZW47IGkrKykgeworCQljb2xsZWN0b3Iuc2V0KGksICgoTWV0aG9kQmluZGluZyljb2xsZWN0b3IuZ2V0KGkpKS5vcmlnaW5hbCgpKTsKIAl9CisJcmV0dXJuIChNZXRob2RCaW5kaW5nW10pIGNvbGxlY3Rvci50b0FycmF5KG5ldyBNZXRob2RCaW5kaW5nW2NvbGxlY3Rvci5zaXplKCldKTsKK30KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIHZhcmlhYmxlIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLiBDYW4gYmUgYSBkaXJlY3QgcmVmZXJlbmNlIChTaW5nbGVOYW1lUmVmZXJlbmNlKQotCSAqIG9yIHRocnUgYSBjYXN0IGV4cHJlc3Npb24gZXRjLi4uCi0JICovCi0JcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nKCkgeworcHJpdmF0ZSB2b2lkIGdldEFsbEluaGVyaXRlZE1ldGhvZHMwKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZywgQXJyYXlMaXN0IGNvbGxlY3RvcikgeworCWlmICghYmluZGluZy5pc0ludGVyZmFjZSgpKSByZXR1cm47CisJTWV0aG9kQmluZGluZ1tdIG1ldGhvZEJpbmRpbmdzID0gYmluZGluZy5tZXRob2RzKCk7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZEJpbmRpbmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCWNvbGxlY3Rvci5hZGQobWV0aG9kQmluZGluZ3NbaV0pOworCX0KKwlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzID0gYmluZGluZy5zdXBlckludGVyZmFjZXMoKTsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCWdldEFsbEluaGVyaXRlZE1ldGhvZHMwKHN1cGVySW50ZXJmYWNlc1tpXSwgY29sbGVjdG9yKTsKKwl9Cit9CisKK3B1YmxpYyBzdGF0aWMgQmluZGluZyBnZXREaXJlY3RCaW5kaW5nKEV4cHJlc3Npb24gc29tZUV4cHJlc3Npb24pIHsKKwlpZiAoKHNvbWVFeHByZXNzaW9uLmJpdHMgJiBBU1ROb2RlLklnbm9yZU5vRWZmZWN0QXNzaWduQ2hlY2spICE9IDApIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCWlmIChzb21lRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKKwkJcmV0dXJuICgoU2luZ2xlTmFtZVJlZmVyZW5jZSlzb21lRXhwcmVzc2lvbikuYmluZGluZzsKKwl9IGVsc2UgaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsKKwkJRmllbGRSZWZlcmVuY2UgZmllbGRSZWYgPSAoRmllbGRSZWZlcmVuY2Upc29tZUV4cHJlc3Npb247CisJCWlmIChmaWVsZFJlZi5yZWNlaXZlci5pc1RoaXMoKSAmJiAhKGZpZWxkUmVmLnJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSkpIHsKKwkJCXJldHVybiBmaWVsZFJlZi5iaW5kaW5nOworCQl9CisJfSBlbHNlIGlmIChzb21lRXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKKwkJRXhwcmVzc2lvbiBsaHMgPSAoKEFzc2lnbm1lbnQpc29tZUV4cHJlc3Npb24pLmxoczsKKwkJaWYgKChsaHMuYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSAhPSAwKSB7CisJCQkvLyBpID0gaSA9IC4uLjsgLy8gZXEgdG8gaW50IGkgPSAuLi47CisJCQlyZXR1cm4gZ2V0RGlyZWN0QmluZGluZyAoKChBc3NpZ25tZW50KXNvbWVFeHByZXNzaW9uKS5saHMpOworCQl9IGVsc2UgaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgUHJlZml4RXhwcmVzc2lvbikgeworCQkJLy8gaSA9IGkrKzsgLy8gZXEgdG8gKytpOworCQkJcmV0dXJuIGdldERpcmVjdEJpbmRpbmcgKCgoQXNzaWdubWVudClzb21lRXhwcmVzc2lvbikubGhzKTsKKwkJfQorCX0gZWxzZSBpZiAoc29tZUV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBzb21lRXhwcmVzc2lvbjsKKwkJaWYgKHF1YWxpZmllZE5hbWVSZWZlcmVuY2UuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nICE9IDEKKwkJCQkmJiBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLm90aGVyQmluZGluZ3MgPT0gbnVsbCkgeworCQkJLy8gY2FzZSB3aGVyZSBhIHN0YXRpYyBmaWVsZCBpcyByZXRyaWV2ZWQgdXNpbmcgQ2xhc3NOYW1lLmZpZWxkbmFtZQorCQkJcmV0dXJuIHF1YWxpZmllZE5hbWVSZWZlcmVuY2UuYmluZGluZzsKKwkJfQorCX0gZWxzZSBpZiAoc29tZUV4cHJlc3Npb24uaXNUaGlzKCkpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njc0MQorCQlyZXR1cm4gc29tZUV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOworCX0KKy8vCQl9IGVsc2UgaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgUG9zdGZpeEV4cHJlc3Npb24pIHsgLy8gcmVjdXJzZSBmb3IgcG9zdGZpeDogaSsrIC0tPiBpCisvLwkJCS8vIG5vdGU6ICJiID0gYisrIiBpcyBlcXVpdmFsZW50IHRvIGRvaW5nIG5vdGhpbmcsIG5vdCB0byAiYisrIgorLy8JCQlyZXR1cm4gZ2V0RGlyZWN0QmluZGluZygoKFBvc3RmaXhFeHByZXNzaW9uKSBzb21lRXhwcmVzc2lvbikubGhzKTsKKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIGJvb2xlYW4gaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8vUmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgZG9uZSBBVVRPTUFUSUNBTExZIGJ5IHRoZSB2bQorLy93aGlsZSB0aGUgamF2YVZNIGlzIGFuIGludCBiYXNlZC1tYWNoaW5lLCB0aHVzIGZvciBleGFtcGxlIHB1c2hpbmcKKy8vYSBieXRlIG9udG8gdGhlIHN0YWNrICwgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhbiBpbnQgb24gdGhlIHN0YWNrCisvLyh0aGlzIHJlcXVlc3Qgc29tZSB3b3JrIGQgYmUgZG9uZSBieSB0aGUgVk0gb24gc2lnbmVkIG51bWJlcnMpCitwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKFR5cGVCaW5kaW5nIGNvbnN0YW50VHlwZSwgVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSkgeworCisJaWYgKHRoaXMuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGNvbnN0YW50VHlwZSA9PSB0YXJnZXRUeXBlKQorCQlyZXR1cm4gdHJ1ZTsKKwkvL05vIGZyZWUgYXNzaWdubWVudCBjb252ZXJzaW9uIGZyb20gYW55dGhpbmcgYnV0IHRvIGludGVncmFsIG9uZXMuCisJaWYgKEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKFR5cGVJZHMuVF9pbnQsIGNvbnN0YW50VHlwZS5pZCkKKwkJCSYmIChCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodGFyZ2V0VHlwZS5pZCwgVHlwZUlkcy5UX2ludCkpKSB7CisJCS8vdXNlIGN1cnJlbnQgZXhwbGljaXQgY29udmVyc2lvbiBpbiBvcmRlciB0byBnZXQgc29tZSBuZXcgdmFsdWUgdG8gY29tcGFyZSB3aXRoIGN1cnJlbnQgb25lCisJCXJldHVybiBpc0NvbnN0YW50VmFsdWVSZXByZXNlbnRhYmxlKHRoaXMuY29uc3RhbnQsIGNvbnN0YW50VHlwZS5pZCwgdGFyZ2V0VHlwZS5pZCk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworcHVibGljIGJvb2xlYW4gaXNUeXBlUmVmZXJlbmNlKCkgeworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBsb2NhbCB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS4gQ2FuIGJlIGEgZGlyZWN0IHJlZmVyZW5jZSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkKKyAqIG9yIHRocnUgYSBjYXN0IGV4cHJlc3Npb24gZXRjLi4uCisgKi8KK3B1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZygpIHsKKwlyZXR1cm4gbnVsbDsKK30KKwogLyoqCiAgKiBNYXJrIHRoaXMgZXhwcmVzc2lvbiBhcyBiZWluZyBub24gbnVsbCwgcGVyIGEgc3BlY2lmaWMgdGFnIGluIHRoZQogICogc291cmNlIGNvZGUuCkBAIC04MTksMjAxICs4NjYsMjUwIEBACiAJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSXNOb25OdWxsOwogfQogCi0JcHVibGljIGludCBudWxsU3RhdHVzKEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCQotCQlpZiAoLyogKHRoaXMuYml0cyAmIElzTm9uTnVsbCkgIT0gMCB8fCAqLyAKLQkJCQl0aGlzLmNvbnN0YW50ICE9IG51bGwgJiYgdGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCi0JCQlyZXR1cm4gRmxvd0luZm8uTk9OX05VTEw7IC8vIGNvbnN0YW50IGV4cHJlc3Npb24gY2Fubm90IGJlIG51bGwKLQkJCi0JCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxWYXJpYWJsZUJpbmRpbmcoKTsKLQkJaWYgKGxvY2FsICE9IG51bGwpIHsKLQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkKLQkJCQlyZXR1cm4gRmxvd0luZm8uTlVMTDsKLQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKSkKLQkJCQlyZXR1cm4gRmxvd0luZm8uTk9OX05VTEw7Ci0JCQlyZXR1cm4gRmxvd0luZm8uVU5LTk9XTjsKK3B1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgeworCisJaWYgKC8qICh0aGlzLmJpdHMgJiBJc05vbk51bGwpICE9IDAgfHwgKi8KKwkJdGhpcy5jb25zdGFudCAhPSBudWxsICYmIHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCXJldHVybiBGbG93SW5mby5OT05fTlVMTDsgLy8gY29uc3RhbnQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgbnVsbAorCisJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBsb2NhbFZhcmlhYmxlQmluZGluZygpOworCWlmIChsb2NhbCAhPSBudWxsKQorCQlyZXR1cm4gZmxvd0luZm8ubnVsbFN0YXR1cyhsb2NhbCk7CisJcmV0dXJuIEZsb3dJbmZvLk5PTl9OVUxMOworfQorCisvKioKKyAqIENvbnN0YW50IHVzYWJsZSBmb3IgYnl0ZWNvZGUgcGF0dGVybiBvcHRpbWl6YXRpb25zLCBidXQgY2Fubm90IGJlIGlubGluZWQKKyAqIHNpbmNlIGl0IGlzIG5vdCBzdHJpY3RseSBlcXVpdmFsZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGNvbnN0YW50IGV4cHJlc3Npb25zLgorICogSW4gcGFydGljdWxhciwgc29tZSBzaWRlLWVmZmVjdHMgbWF5IGJlIHJlcXVpcmVkIHRvIG9jY3VyIChvbmx5IHRoZSBlbmQgdmFsdWUKKyAqIGlzIGtub3duKS4KKyAqIEByZXR1cm4gQ29uc3RhbnQga25vd24gdG8gYmUgb2YgYm9vbGVhbiB0eXBlCisgKi8KK3B1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSB7CisJcmV0dXJuIHRoaXMuY29uc3RhbnQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBhZnRlciByZXF1aXJlZCBpbXBsaWNpdCBjb252ZXJzaW9ucy4gV2hlbiBleHByZXNzaW9uIHR5cGUgZ2V0cyBwcm9tb3RlZAorICogb3IgaW5zZXJ0ZWQgYSBnZW5lcmljIGNhc3QsIHRoZSBjb252ZXJ0ZWQgdHlwZSB3aWxsIGRpZmZlciBmcm9tIHRoZSByZXNvbHZlZCB0eXBlIChzdXJmYWNlIHNpZGUtZWZmZWN0cyBmcm9tCisgKiAjY29tcHV0ZUNvbnZlcnNpb24oLi4uKSkuCisgKiBAcmV0dXJuIHRoZSB0eXBlIGFmdGVyIGltcGxpY2l0IGNvbnZlcnNpb24KKyAqLworcHVibGljIFR5cGVCaW5kaW5nIHBvc3RDb252ZXJzaW9uVHlwZShTY29wZSBzY29wZSkgeworCVR5cGVCaW5kaW5nIGNvbnZlcnRlZFR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZTsKKwlpbnQgcnVudGltZVR5cGUgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLklNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNDsKKwlzd2l0Y2ggKHJ1bnRpbWVUeXBlKSB7CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5CT09MRUFOOworCQkJYnJlYWs7CisJCWNhc2UgVF9ieXRlIDoKKwkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5CWVRFOworCQkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuU0hPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBUX2NoYXIgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkNIQVI7CisJCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuSU5UOworCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuRkxPQVQ7CisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkxPTkc7CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuRE9VQkxFOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCX0KKwlpZiAoKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5CT1hJTkcpICE9IDApIHsKKwkJY29udmVydGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29udmVydGVkVHlwZSk7CisJfQorCXJldHVybiBjb252ZXJ0ZWRUeXBlOworfQorCitwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKKwlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CisJcmV0dXJuIHByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7Cit9CisKK3B1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpOworCitwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKKwlyZXR1cm4gcHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiOyIpOyAvLyROT04tTkxTLTEkCit9CisKK3B1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGRyb3BzIHRoZSByZXR1cm5pbmcgZXhwcmVzc2lvbidzIHR5cGUgd2hhdGV2ZXIgdGhlIHR5cGUgaXMuCisJdGhpcy5yZXNvbHZlVHlwZShzY29wZSk7CisJcmV0dXJuOworfQorCisvKioKKyAqIFJlc29sdmUgdGhlIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIGEgYmxvY2tTY29wZQorICoKKyAqIEBwYXJhbSBzY29wZQorICogQHJldHVybgorICogCVJldHVybiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uIGFmdGVyIHJlc29sdXRpb24KKyAqLworcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBieSBkZWZhdWx0Li4uIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBhIGJldHRlciBUQiBpZiByZXF1aXJlZC4KKwlyZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBSZXNvbHZlIHRoZSB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiBhIGNsYXNzU2NvcGUKKyAqCisgKiBAcGFyYW0gc2NvcGUKKyAqIEByZXR1cm4KKyAqIAlSZXR1cm4gdGhlIGFjdHVhbCB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbiBhZnRlciByZXNvbHV0aW9uCisgKi8KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShDbGFzc1Njb3BlIHNjb3BlKSB7CisJLy8gYnkgZGVmYXVsdC4uLiBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgYSBiZXR0ZXIgVEIgaWYgcmVxdWlyZWQuCisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZUV4cGVjdGluZyhCbG9ja1Njb3BlIHNjb3BlLCBUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKKwlzZXRFeHBlY3RlZFR5cGUoZXhwZWN0ZWRUeXBlKTsgLy8gbmVlZGVkIGluIGNhc2Ugb2YgZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbgorCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gdGhpcy5yZXNvbHZlVHlwZShzY29wZSk7CisJaWYgKGV4cHJlc3Npb25UeXBlID09IG51bGwpIHJldHVybiBudWxsOworCWlmIChleHByZXNzaW9uVHlwZSA9PSBleHBlY3RlZFR5cGUpIHJldHVybiBleHByZXNzaW9uVHlwZTsKKworCWlmICghZXhwcmVzc2lvblR5cGUuaXNDb21wYXRpYmxlV2l0aChleHBlY3RlZFR5cGUpKSB7CisJCWlmIChzY29wZS5pc0JveGluZ0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlLCBleHBlY3RlZFR5cGUpKSB7CisJCQljb21wdXRlQ29udmVyc2lvbihzY29wZSwgZXhwZWN0ZWRUeXBlLCBleHByZXNzaW9uVHlwZSk7CisJCX0gZWxzZSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcihleHByZXNzaW9uVHlwZSwgZXhwZWN0ZWRUeXBlLCB0aGlzLCBudWxsKTsKKwkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBGbG93SW5mby5OT05fTlVMTDsKIAl9Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgdXNhYmxlIGZvciBieXRlY29kZSBwYXR0ZXJuIG9wdGltaXphdGlvbnMsIGJ1dCBjYW5ub3QgYmUgaW5saW5lZAotCSAqIHNpbmNlIGl0IGlzIG5vdCBzdHJpY3RseSBlcXVpdmFsZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqIEluIHBhcnRpY3VsYXIsIHNvbWUgc2lkZS1lZmZlY3RzIG1heSBiZSByZXF1aXJlZCB0byBvY2N1ciAob25seSB0aGUgZW5kIHZhbHVlCi0JICogaXMga25vd24pLgotCSAqIEByZXR1cm4gQ29uc3RhbnQga25vd24gdG8gYmUgb2YgYm9vbGVhbiB0eXBlCi0JICovIAotCXB1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnN0YW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYWZ0ZXIgcmVxdWlyZWQgaW1wbGljaXQgY29udmVyc2lvbnMuIFdoZW4gZXhwcmVzc2lvbiB0eXBlIGdldHMgcHJvbW90ZWQKLQkgKiBvciBpbnNlcnRlZCBhIGdlbmVyaWMgY2FzdCwgdGhlIGNvbnZlcnRlZCB0eXBlIHdpbGwgZGlmZmVyIGZyb20gdGhlIHJlc29sdmVkIHR5cGUgKHN1cmZhY2Ugc2lkZS1lZmZlY3RzIGZyb20KLQkgKiAjY29tcHV0ZUNvbnZlcnNpb24oLi4uKSkuCi0JICogQHJldHVybiB0aGUgdHlwZSBhZnRlciBpbXBsaWNpdCBjb252ZXJzaW9uCi0JICovCi0JcHVibGljIFR5cGVCaW5kaW5nIHBvc3RDb252ZXJzaW9uVHlwZShTY29wZSBzY29wZSkgewotCQlUeXBlQmluZGluZyBjb252ZXJ0ZWRUeXBlID0gdGhpcy5yZXNvbHZlZFR5cGU7Ci0JCWludCBydW50aW1lVHlwZSA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0OwotCQlzd2l0Y2ggKHJ1bnRpbWVUeXBlKSB7Ci0JCQljYXNlIFRfYm9vbGVhbiA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkJPT0xFQU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRfYnl0ZSA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkJZVEU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRfc2hvcnQgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5TSE9SVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9jaGFyIDoKLQkJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQ0hBUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9pbnQgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5JTlQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRfZmxvYXQgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5GTE9BVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9sb25nIDoKLQkJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuTE9ORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5ET1VCTEU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJfQkJCi0JCWlmICgodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkJPWElORykgIT0gMCkgewotCQkJY29udmVydGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29udmVydGVkVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlZFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KTsKLQkJcmV0dXJuIHByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpOwotCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0JCXJldHVybiBwcmludChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJLy8gZHJvcHMgdGhlIHJldHVybmluZyBleHByZXNzaW9uJ3MgdHlwZSB3aGF0ZXZlciB0aGUgdHlwZSBpcy4KLQotCQl0aGlzLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIGEgYmxvY2tTY29wZQotCSAqIAotCSAqIEBwYXJhbSBzY29wZQotCSAqIEByZXR1cm4KLQkgKiAJUmV0dXJuIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24gYWZ0ZXIgcmVzb2x1dGlvbgotCSAqLwotCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCS8vIGJ5IGRlZmF1bHQuLi4gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGEgYmV0dGVyIFRCIGlmIHJlcXVpcmVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiBhIGNsYXNzU2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiBAcmV0dXJuCi0JICogCVJldHVybiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uIGFmdGVyIHJlc29sdXRpb24KLQkgKi8KLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBzY29wZSkgewotCQkvLyBieSBkZWZhdWx0Li4uIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBhIGJldHRlciBUQiBpZiByZXF1aXJlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlRXhwZWN0aW5nKAotCQlCbG9ja1Njb3BlIHNjb3BlLAotCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKLQotCQl0aGlzLnNldEV4cGVjdGVkVHlwZShleHBlY3RlZFR5cGUpOyAvLyBuZWVkZWQgaW4gY2FzZSBvZiBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uCi0JCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gdGhpcy5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmIChleHByZXNzaW9uVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJaWYgKGV4cHJlc3Npb25UeXBlID09IGV4cGVjdGVkVHlwZSkgcmV0dXJuIGV4cHJlc3Npb25UeXBlOwotCQkKLQkJaWYgKCFleHByZXNzaW9uVHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cGVjdGVkVHlwZSkpIHsKLQkJCWlmIChzY29wZS5pc0JveGluZ0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlLCBleHBlY3RlZFR5cGUpKSB7Ci0JCQkJdGhpcy5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgZXhwZWN0ZWRUeXBlLCBleHByZXNzaW9uVHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGV4cHJlc3Npb25UeXBlLCBleHBlY3RlZFR5cGUsIHRoaXMpOwotCQkJCXJldHVybiBudWxsOworCXJldHVybiBleHByZXNzaW9uVHlwZTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBmb3JjZWQgdG8gYmUgb2YgcmF3IHR5cGUgZWl0aGVyIHRvIHNhdGlzZnkgdGhlIGNvbnRyYWN0IGltcG9zZWQKKyAqIGJ5IGEgc3VwZXIgdHlwZSBvciBiZWNhdXNlIGl0ICppcyogcmF3IGFuZCB0aGUgY3VycmVudCB0eXBlIGhhcyBubyBjb250cm9sIG92ZXIgaXQgKGkuZSB0aGUgcmF3bmVzcworICogb3JpZ2luYXRlcyBmcm9tIHNvbWUgb3RoZXIgZmlsZS4pCisgKi8KK3B1YmxpYyBib29sZWFuIGZvcmNlZFRvQmVSYXcoUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CisJaWYgKHRoaXMgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7CisJCWZpbmFsIEJpbmRpbmcgcmVjZWl2ZXJCaW5kaW5nID0gKChOYW1lUmVmZXJlbmNlKSB0aGlzKS5iaW5kaW5nOworCQlpZiAocmVjZWl2ZXJCaW5kaW5nLmlzUGFyYW1ldGVyKCkgJiYgKCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHJlY2VpdmVyQmluZGluZykudGFnQml0cyAmIFRhZ0JpdHMuRm9yY2VkVG9CZVJhd1R5cGUpICE9IDApIHsKKwkJCXJldHVybiB0cnVlOyAgLy8gcGFyYW1ldGVyIGlzIGZvcmNlZCB0byBiZSByYXcgc2luY2Ugc3VwZXIgbWV0aG9kIHVzZXMgcmF3IHR5cGVzLgorCQl9IGVsc2UgaWYgKHJlY2VpdmVyQmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gKEZpZWxkQmluZGluZykgcmVjZWl2ZXJCaW5kaW5nOworCQkJaWYgKGZpZWxkLnR5cGUuaXNSYXdUeXBlKCkpIHsKKwkJCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisJCQkJCWlmIChmaWVsZC5kZWNsYXJpbmdDbGFzcyAhPSBtZXRob2REZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpIHsgLy8gaW5oZXJpdGVkIHJhdyBmaWVsZCwgc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc5NjIKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzICE9IHR5cGUuYmluZGluZykgeyAvLyBpbmhlcml0ZWQgcmF3IGZpZWxkLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzk2MgorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAJCX0KLQkJcmV0dXJuIGV4cHJlc3Npb25UeXBlOworCX0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoKChNZXNzYWdlU2VuZCkgdGhpcykuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRGaWxlTmFtZSgpLAorCQkJCXJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQoKS5nZXRGaWxlTmFtZSgpKSkgeyAgLy8gcHJvYmxlbSBpcyByb290ZWQgZWxzZXdoZXJlCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7CisJCUZpZWxkQmluZGluZyBmaWVsZCA9ICgoRmllbGRSZWZlcmVuY2UpIHRoaXMpLmJpbmRpbmc7CisJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQuZGVjbGFyaW5nQ2xhc3MuZ2V0RmlsZU5hbWUoKSwKKwkJCQlyZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0KCkuZ2V0RmlsZU5hbWUoKSkpIHsgLy8gcHJvYmxlbSBpcyByb290ZWQgZWxzZXdoZXJlCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoZmllbGQudHlwZS5pc1Jhd1R5cGUoKSkgeworCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzICE9IG1ldGhvZERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcykgeyAvLyBpbmhlcml0ZWQgcmF3IGZpZWxkLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzk2MgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CisJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzICE9IHR5cGUuYmluZGluZykgeyAvLyBpbmhlcml0ZWQgcmF3IGZpZWxkLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzk2MgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzc1MQorCQlDb25kaXRpb25hbEV4cHJlc3Npb24gdGVybmFyeSA9IChDb25kaXRpb25hbEV4cHJlc3Npb24pIHRoaXM7CisJCWlmICh0ZXJuYXJ5LnZhbHVlSWZUcnVlLmZvcmNlZFRvQmVSYXcocmVmZXJlbmNlQ29udGV4dCkgfHwgdGVybmFyeS52YWx1ZUlmRmFsc2UuZm9yY2VkVG9CZVJhdyhyZWZlcmVuY2VDb250ZXh0KSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KIAl9CisJcmV0dXJuIGZhbHNlOworfQogCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaWRlbnRpY2FsIEpTUiBzZXF1ZW5jZSB0YXJnZXRzCi0JICogKHNlZSBUcnlTdGF0ZW1lbnQgc3Vicm91dGluZSBjb2RlZ2VuKQotCSAqIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCByZXVzYWJsZQotCSAqLwotCXB1YmxpYyBPYmplY3QgcmV1c2FibGVKU1JUYXJnZXQoKSB7Ci0JCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKLQkJCXJldHVybiB0aGlzLmNvbnN0YW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVjb3JkIHRoZSB0eXBlIGV4cGVjdGF0aW9uIGJlZm9yZSB0aGlzIGV4cHJlc3Npb24gaXMgdHlwZWNoZWNrZWQuCi0JICogZS5nLiBTdHJpbmcgcyA9IGZvbygpOywgZm9vKCkgd2lsbCBiZSB0YWdnZWQgYXMgYmVpbmcgZXhwZWN0ZWQgb2YgdHlwZSBTdHJpbmcKLQkgKiBVc2VkIHRvIHRyaWdnZXIgcHJvcGVyIGluZmVyZW5jZSBvZiBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlCi0JICogCVRoZSB0eXBlIGRlbm90aW5nIGFuIGV4cGVjdGF0aW9uIGluIHRoZSBjb250ZXh0IG9mIGFuIGFzc2lnbm1lbnQgY29udmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVHlwZShUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKLQkgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRhZ0FzTmVlZENoZWNrQ2FzdCgpIHsKLQkgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CQkKLQl9Ci0JCi0JLyoqCi0JICogUmVjb3JkIHRoZSBmYWN0IGEgY2FzdCBleHByZXNzaW9uIGdvdCBkZXRlY3RlZCBhcyBiZWluZyB1bm5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiBAcGFyYW0gY2FzdFR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YWdBc1VubmVjZXNzYXJ5Q2FzdChTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgY2FzdFR5cGUpIHsKLQkgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCQotCXB1YmxpYyBFeHByZXNzaW9uIHRvVHlwZVJlZmVyZW5jZSgpIHsKLQkJLy9ieSBkZWZhdWx0IHVuZGVmaW5lZAorLyoqCisgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBpZGVudGljYWwgSlNSIHNlcXVlbmNlIHRhcmdldHMKKyAqIChzZWUgVHJ5U3RhdGVtZW50IHN1YnJvdXRpbmUgY29kZWdlbikKKyAqIG9yIDxjb2RlPm51bGw8L251bGw+IGlmIG5vdCByZXVzYWJsZQorICovCitwdWJsaWMgT2JqZWN0IHJldXNhYmxlSlNSVGFyZ2V0KCkgeworCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJcmV0dXJuIHRoaXMuY29uc3RhbnQ7CisJcmV0dXJuIG51bGw7Cit9CiAKLQkJLy90aGlzIG1ldGhvZCBpcyBtZWFubHkgdXNlZCBieSB0aGUgcGFyc2VyIGluIG9yZGVyIHRvIHRyYW5zZm9ybQotCQkvL2FuIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGFzIGEgdHlwZSByZWZlcmVuY2UgaW4gYSBjYXN0IC4uLi4KLQkJLy8tLWFwcHJlY2lhdGUgdGhlIGZhY3QgdGhhdCBjYXN0RXhwcmVzc2lvbiBhbmQgRXhwcmVzc2lvbldpdGhQYXJlbnRoZXNpcwotCQkvLy0tc3RhcnRzIHdpdGggdGhlIHNhbWUgcGF0dGVybi4uLi4uCisvKioKKyAqIFJlY29yZCB0aGUgdHlwZSBleHBlY3RhdGlvbiBiZWZvcmUgdGhpcyBleHByZXNzaW9uIGlzIHR5cGVjaGVja2VkLgorICogZS5nLiBTdHJpbmcgcyA9IGZvbygpOywgZm9vKCkgd2lsbCBiZSB0YWdnZWQgYXMgYmVpbmcgZXhwZWN0ZWQgb2YgdHlwZSBTdHJpbmcKKyAqIFVzZWQgdG8gdHJpZ2dlciBwcm9wZXIgaW5mZXJlbmNlIG9mIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb25zLgorICoKKyAqIEBwYXJhbSBleHBlY3RlZFR5cGUKKyAqIAlUaGUgdHlwZSBkZW5vdGluZyBhbiBleHBlY3RhdGlvbiBpbiB0aGUgY29udGV4dCBvZiBhbiBhc3NpZ25tZW50IGNvbnZlcnNpb24KKyAqLworcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUeXBlKFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSkgeworICAgIC8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorfQogCi0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBUcmF2ZXJzZSBhbiBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIGEgYmxvY2tTY29wZQotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogQHBhcmFtIHNjb3BlCi0JICovCi0JcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JLyoqCi0JICogVHJhdmVyc2UgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiBhIGNsYXNzU2NvcGUKLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqIEBwYXJhbSBzY29wZQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQorcHVibGljIHZvaWQgdGFnQXNOZWVkQ2hlY2tDYXN0KCkgeworICAgIC8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorfQorCisvKioKKyAqIFJlY29yZCB0aGUgZmFjdCBhIGNhc3QgZXhwcmVzc2lvbiBnb3QgZGV0ZWN0ZWQgYXMgYmVpbmcgdW5uZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHNjb3BlCisgKiBAcGFyYW0gY2FzdFR5cGUKKyAqLworcHVibGljIHZvaWQgdGFnQXNVbm5lY2Vzc2FyeUNhc3QoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGNhc3RUeXBlKSB7CisgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Cit9CisKK3B1YmxpYyBFeHByZXNzaW9uIHRvVHlwZVJlZmVyZW5jZSgpIHsKKwkvL2J5IGRlZmF1bHQgdW5kZWZpbmVkCisKKwkvL3RoaXMgbWV0aG9kIGlzIG1lYW5seSB1c2VkIGJ5IHRoZSBwYXJzZXIgaW4gb3JkZXIgdG8gdHJhbnNmb3JtCisJLy9hbiBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBhcyBhIHR5cGUgcmVmZXJlbmNlIGluIGEgY2FzdCAuLi4uCisJLy8tLWFwcHJlY2lhdGUgdGhlIGZhY3QgdGhhdCBjYXN0RXhwcmVzc2lvbiBhbmQgRXhwcmVzc2lvbldpdGhQYXJlbnRoZXNpcworCS8vLS1zdGFydHMgd2l0aCB0aGUgc2FtZSBwYXR0ZXJuLi4uLi4KKworCXJldHVybiB0aGlzOworfQorCisvKioKKyAqIFRyYXZlcnNlIGFuIGV4cHJlc3Npb24gaW4gdGhlIGNvbnRleHQgb2YgYSBibG9ja1Njb3BlCisgKiBAcGFyYW0gdmlzaXRvcgorICogQHBhcmFtIHNjb3BlCisgKi8KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCS8vIG5vdGhpbmcgdG8gZG8KK30KKworLyoqCisgKiBUcmF2ZXJzZSBhbiBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIGEgY2xhc3NTY29wZQorICogQHBhcmFtIHZpc2l0b3IKKyAqIEBwYXJhbSBzY29wZQorICovCitwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkvLyBub3RoaW5nIHRvIGRvCit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4dGVuZGVkU3RyaW5nTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YQppbmRleCAyMDczNjY5Li4wNWNmYjBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4dGVuZGVkU3RyaW5nTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXh0ZW5kZWRTdHJpbmdMaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNyArMTUsNyBAQAogCiBwdWJsaWMgY2xhc3MgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbCB7CiAKLQkvKiogCisJLyoqCiAJICogIEJ1aWxkIGEgc3RyaW5nK2NoYXIgbGl0ZXJhbAogCSAqLwogCXB1YmxpYyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBzdHIsIENoYXJMaXRlcmFsIGNoYXJhY3RlcikgewpAQCAtMjQsNyArMjQsNyBAQAogCQlleHRlbmRXaXRoKGNoYXJhY3Rlcik7CiAJfQogCi0JLyoqCQorCS8qKgogCSAqIEJ1aWxkIGEgdHdvLXN0cmluZ3MgbGl0ZXJhbAogCSAqICovCiAJcHVibGljIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIHN0cjEsIFN0cmluZ0xpdGVyYWwgc3RyMikgewpAQCAtMzksMTEgKzM5LDExIEBACiAJcHVibGljIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRXaXRoKENoYXJMaXRlcmFsIGxpdCkgewogCiAJCS8vdXBkYXRlIHRoZSBzb3VyY2UKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCAwLCAoc291cmNlID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0pLCAwLCBsZW5ndGgpOwotCQlzb3VyY2VbbGVuZ3RoXSA9IGxpdC52YWx1ZTsKKwkJaW50IGxlbmd0aCA9IHRoaXMuc291cmNlLmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgMCwgKHRoaXMuc291cmNlID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0pLCAwLCBsZW5ndGgpOworCQl0aGlzLnNvdXJjZVtsZW5ndGhdID0gbGl0LnZhbHVlOwogCQkvL3Bvc2l0aW9uIGF0IHRoZSBlbmQgb2YgYWxsIGxpdGVyYWxzCi0JCXNvdXJjZUVuZCA9IGxpdC5zb3VyY2VFbmQ7CisJCXRoaXMuc291cmNlRW5kID0gbGl0LnNvdXJjZUVuZDsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC01MywyMiArNTMsMjIgQEAKIAlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZFdpdGgoU3RyaW5nTGl0ZXJhbCBsaXQpIHsKIAogCQkvL3VkZGF0ZSB0aGUgc291cmNlCi0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOworCQlpbnQgbGVuZ3RoID0gdGhpcy5zb3VyY2UubGVuZ3RoOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJc291cmNlLAorCQkJdGhpcy5zb3VyY2UsCiAJCQkwLAotCQkJc291cmNlID0gbmV3IGNoYXJbbGVuZ3RoICsgbGl0LnNvdXJjZS5sZW5ndGhdLAorCQkJdGhpcy5zb3VyY2UgPSBuZXcgY2hhcltsZW5ndGggKyBsaXQuc291cmNlLmxlbmd0aF0sCiAJCQkwLAogCQkJbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShsaXQuc291cmNlLCAwLCBzb3VyY2UsIGxlbmd0aCwgbGl0LnNvdXJjZS5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KGxpdC5zb3VyY2UsIDAsIHRoaXMuc291cmNlLCBsZW5ndGgsIGxpdC5zb3VyY2UubGVuZ3RoKTsKIAkJLy9wb3NpdGlvbiBhdCB0aGUgZW5kIG9mIGFsbCBsaXRlcmFscwotCQlzb3VyY2VFbmQgPSBsaXQuc291cmNlRW5kOworCQl0aGlzLnNvdXJjZUVuZCA9IGxpdC5zb3VyY2VFbmQ7CiAJCXJldHVybiB0aGlzOwogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAotCQlyZXR1cm4gb3V0cHV0LmFwcGVuZCgiRXh0ZW5kZWRTdHJpbmdMaXRlcmFseyIpLmFwcGVuZChzb3VyY2UpLmFwcGVuZCgnfScpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBvdXRwdXQuYXBwZW5kKCJFeHRlbmRlZFN0cmluZ0xpdGVyYWx7IikuYXBwZW5kKHRoaXMuc291cmNlKS5hcHBlbmQoJ30nKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GYWxzZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmFsc2VMaXRlcmFsLmphdmEKaW5kZXggNjVjZTgzNS4uYWJhMWMzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GYWxzZUxpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZhbHNlTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDEyICsxOCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiAKIHB1YmxpYyBjbGFzcyBGYWxzZUxpdGVyYWwgZXh0ZW5kcyBNYWdpY0xpdGVyYWwgeworCQogCXN0YXRpYyBmaW5hbCBjaGFyW10gc291cmNlID0geydmJywgJ2EnLCAnbCcsICdzJywgJ2UnfTsKKwkKIHB1YmxpYyBGYWxzZUxpdGVyYWwoaW50IHMgLCBpbnQgZSkgewogCXN1cGVyKHMsZSk7CiB9CiBwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7Ci0JY29uc3RhbnQgPSBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGZhbHNlKTsKKwl0aGlzLmNvbnN0YW50ID0gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShmYWxzZSk7CiB9CiAvKioKICAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgZmFsc2UgbGl0ZXJhbApAQCAtNTgsNyArNjAsNyBAQAogCXJldHVybiBUeXBlQmluZGluZy5CT09MRUFOOwogfQogLyoqCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjaGFyW10gc291cmNlKCkgewogCXJldHVybiBzb3VyY2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGREZWNsYXJhdGlvbi5qYXZhCmluZGV4IDkzY2U1OGEuLjMwYWI1NGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGREZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDIzICsxMCwyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIEZpZWxkRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gewotCQorCiAJcHVibGljIEZpZWxkQmluZGluZyBiaW5kaW5nOwogCXB1YmxpYyBKYXZhZG9jIGphdmFkb2M7CiAKIAkvL2FsbG93cyB0byByZXRyaWV2ZSBib3RoIHRoZSAidHlwZSIgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gKHBhcnQxKQogCS8vYW5kIGFsc28gdGhlIHBhcnQgdGhhdCBkZWNyaWJlIHRoZSBuYW1lIGFuZCB0aGUgaW5pdCBhbmQgb3B0aW9uYWxseQotCS8vc29tZSBvdGhlciBkaW1lbnNpb24gISAuLi4uIAorCS8vc29tZSBvdGhlciBkaW1lbnNpb24gISAuLi4uCiAJLy9wdWJsaWMgaW50W10gYSwgYltdID0gWCwgYyA7Ci0JLy9mb3IgYiB0aGF0IHdvdWxkIGdpdmUgZm9yIAorCS8vZm9yIGIgdGhhdCB3b3VsZCBnaXZlIGZvcgogCS8vIC0gcGFydDEgOiBwdWJsaWMgaW50W10KIAkvLyAtIHBhcnQyIDogYltdID0gWCwKIApAQCAtMzksNyArNDMsNyBAQAogCiBwdWJsaWMgRmllbGREZWNsYXJhdGlvbigJY2hhcltdIG5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCXRoaXMubmFtZSA9IG5hbWU7Ci0JLy9kdWUgdG8gc29tZSBkZWNsYXJhdGlvbiBsaWtlIAorCS8vZHVlIHRvIHNvbWUgZGVjbGFyYXRpb24gbGlrZQogCS8vIGludCB4LCB5ID0gMywgeiAsIHggOwogCS8vdGhlIHNvdXJjZVN0YXJ0IGFuZCB0aGUgc291cmNlRW5kIGlzIE9OTFkgb24gIHRoZSBuYW1lCiAJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwpAQCAtNDcsMTEgKzUxLDkgQEAKIH0KIAogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKE1ldGhvZFNjb3BlIGluaXRpYWxpemF0aW9uU2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCAmJiAhdGhpcy5iaW5kaW5nLmlzVXNlZCgpKSB7Ci0JCWlmICh0aGlzLmJpbmRpbmcuaXNQcml2YXRlKCkgfHwgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSkgewotCQkJaWYgKCFpbml0aWFsaXphdGlvblNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0Lmhhc1N5bnRheEVycm9yKSB7Ci0JCQkJaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRQcml2YXRlRmllbGQodGhpcyk7Ci0JCQl9CisJaWYgKHRoaXMuYmluZGluZyAhPSBudWxsICYmICF0aGlzLmJpbmRpbmcuaXNVc2VkKCkgJiYgdGhpcy5iaW5kaW5nLmlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSkgeworCQlpZiAoIWluaXRpYWxpemF0aW9uU2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuaGFzU3ludGF4RXJyb3IpIHsKKwkJCWluaXRpYWxpemF0aW9uU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZUZpZWxkKHRoaXMpOwogCQl9CiAJfQogCS8vIGNhbm5vdCBkZWZpbmUgc3RhdGljIG5vbi1jb25zdGFudCBmaWVsZCBpbnNpZGUgbmVzdGVkIGNsYXNzCkBAIC03OCw3ICs4MCw3IEBACiAKIC8qKgogICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIGZpZWxkIGRlY2xhcmF0aW9uOgotICoJICAgc3RhbmRhcmQgYXNzaWdubWVudCB0byBhIGZpZWxkIAorICoJICAgc3RhbmRhcmQgYXNzaWdubWVudCB0byBhIGZpZWxkCiAgKgogICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKICAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KQEAgLTkyLDcgKzk0LDcgQEAKIAlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCWJvb2xlYW4gaXNTdGF0aWM7CiAJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gIT0gbnVsbAotCQkmJiAhKChpc1N0YXRpYyA9IHRoaXMuYmluZGluZy5pc1N0YXRpYygpKSAmJiB0aGlzLmJpbmRpbmcuY29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpKSB7CisJCQkmJiAhKChpc1N0YXRpYyA9IHRoaXMuYmluZGluZy5pc1N0YXRpYygpKSAmJiB0aGlzLmJpbmRpbmcuY29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpKSB7CiAJCS8vIG5vbi1zdGF0aWMgZmllbGQsIG5lZWQgcmVjZWl2ZXIKIAkJaWYgKCFpc1N0YXRpYykKIAkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwpAQCAtMTAwLDkgKzEwMiw5IEBACiAJCXRoaXMuaW5pdGlhbGl6YXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCS8vIHN0b3JlIGludG8gZmllbGQKIAkJaWYgKGlzU3RhdGljKSB7Ci0JCQljb2RlU3RyZWFtLnB1dHN0YXRpYyh0aGlzLmJpbmRpbmcpOworCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19wdXRzdGF0aWMsIHRoaXMuYmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQodGhpcy5iaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfcHV0ZmllbGQsIHRoaXMuYmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfQogCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwpAQCAtMTM2LDI5ICsxMzgsMzAgQEAKIAkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkhhc0JlZW5SZXNvbHZlZCkgIT0gMCkgcmV0dXJuOwogCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCB8fCAhdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybjsKLQkKKwogCXRoaXMuYml0cyB8PSBBU1ROb2RlLkhhc0JlZW5SZXNvbHZlZDsKIAogCS8vIGNoZWNrIGlmIGZpZWxkIGlzIGhpZGluZyBzb21lIHZhcmlhYmxlIC0gaXNzdWUgaXMgdGhhdCBmaWVsZCBiaW5kaW5nIGFscmVhZHkgZ290IGluc2VydGVkIGluIHNjb3BlCiAJLy8gdGh1cyBtdXN0IGxvb2t1cCBzZXBhcmF0ZWx5IGluIHN1cGVyIHR5cGUgYW5kIG91dGVyIGNvbnRleHQKIAlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSBpbml0aWFsaXphdGlvblNjb3BlLmVuY2xvc2luZ0NsYXNzU2NvcGUoKTsKLQkKKwogCWlmIChjbGFzc1Njb3BlICE9IG51bGwpIHsKIAkJY2hlY2tIaWRpbmc6IHsKIAkJCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ1R5cGUgPSBjbGFzc1Njb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKIAkJCWNoZWNrSGlkaW5nU3VwZXJGaWVsZDogewogCQkJCWlmIChkZWNsYXJpbmdUeXBlLnN1cGVyY2xhc3MgPT0gbnVsbCkgYnJlYWsgY2hlY2tIaWRpbmdTdXBlckZpZWxkOwotCQkJCUJpbmRpbmcgZXhpc3RpbmdWYXJpYWJsZSA9IGNsYXNzU2NvcGUuZmluZEZpZWxkKGRlY2xhcmluZ1R5cGUuc3VwZXJjbGFzcywgdGhpcy5uYW1lLCB0aGlzLCAgZmFsc2UgLypkbyBub3QgcmVzb2x2ZSBoaWRkZW4gZmllbGQqLyk7CisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODE3MSwgZmluZCBmaWVsZCBza2lwcGluZyB2aXNpYmlsaXR5IGNoZWNrcworCQkJCS8vIHdlIGRvIHRoZSBjaGVja3MgYmVsb3cgb3Vyc2VsdmVzLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9ucyBmb3IgYWNjZXNzIGNoZWNrIG9mCisJCQkJLy8gcHJvdGVjdGVkIG1lbWJlcnMgZnJvbSBzdXBlcmNsYXNzZXMuCisJCQkJRmllbGRCaW5kaW5nIGV4aXN0aW5nVmFyaWFibGUgPSBjbGFzc1Njb3BlLmZpbmRGaWVsZChkZWNsYXJpbmdUeXBlLnN1cGVyY2xhc3MsIHRoaXMubmFtZSwgdGhpcywgIGZhbHNlIC8qZG8gbm90IHJlc29sdmUgaGlkZGVuIGZpZWxkKi8sIHRydWUgLyogbm8gdmlzaWJpbGl0eSBjaGVja3MgcGxlYXNlICovKTsKIAkJCQlpZiAoZXhpc3RpbmdWYXJpYWJsZSA9PSBudWxsKSBicmVhayBjaGVja0hpZGluZ1N1cGVyRmllbGQ7IC8vIGtlZXAgY2hlY2tpbmcgb3V0ZXIgc2NlbmFyaW8KIAkJCQlpZiAoIWV4aXN0aW5nVmFyaWFibGUuaXNWYWxpZEJpbmRpbmcoKSkgIGJyZWFrIGNoZWNrSGlkaW5nU3VwZXJGaWVsZDsgLy8ga2VlcCBjaGVja2luZyBvdXRlciBzY2VuYXJpbwotCQkJCWlmIChleGlzdGluZ1ZhcmlhYmxlIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7Ci0JCQkJCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkID0gKEZpZWxkQmluZGluZykgZXhpc3RpbmdWYXJpYWJsZTsKLQkJCQkJaWYgKGV4aXN0aW5nRmllbGQub3JpZ2luYWwoKSA9PSB0aGlzLmJpbmRpbmcpIGJyZWFrIGNoZWNrSGlkaW5nU3VwZXJGaWVsZDsgLy8ga2VlcCBjaGVja2luZyBvdXRlciBzY2VuYXJpbwotCQkJCX0KKwkJCQlpZiAoZXhpc3RpbmdWYXJpYWJsZS5vcmlnaW5hbCgpID09IHRoaXMuYmluZGluZykgYnJlYWsgY2hlY2tIaWRpbmdTdXBlckZpZWxkOyAvLyBrZWVwIGNoZWNraW5nIG91dGVyIHNjZW5hcmlvCisJCQkJaWYgKCFleGlzdGluZ1ZhcmlhYmxlLmNhbkJlU2VlbkJ5KGRlY2xhcmluZ1R5cGUsIHRoaXMsIGluaXRpYWxpemF0aW9uU2NvcGUpKSBicmVhayBjaGVja0hpZGluZ1N1cGVyRmllbGQ7IC8vIGtlZXAgY2hlY2tpbmcgb3V0ZXIgc2NlbmFyaW8KIAkJCQkvLyBjb2xsaXNpb24gd2l0aCBzdXBlcnR5cGUgZmllbGQKIAkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkSGlkaW5nKHRoaXMsIGV4aXN0aW5nVmFyaWFibGUpOwogCQkJCWJyZWFrIGNoZWNrSGlkaW5nOyAvLyBhbHJlYWR5IGZvdW5kIGEgbWF0Y2hpbmcgZmllbGQKLQkJCX0JCQkJCQorCQkJfQogCQkJLy8gb25seSBjb3JuZXIgY2FzZSBpczogbG9va3VwIG9mIG91dGVyIGZpZWxkIHRocm91Z2ggc3RhdGljIGRlY2xhcmluZ1R5cGUsIHdoaWNoIGlzbid0IGRldGVjdGVkIGJ5ICNnZXRCaW5kaW5nIGFzIGxvb2t1cCBzdGFydHMKIAkJCS8vIGZyb20gb3V0ZXIgc2NvcGUuIFN1YnNlcXVlbnQgc3RhdGljIGNvbnRleHRzIGFyZSBkZXRlY3RlZCBmb3IgZnJlZS4KIAkJCVNjb3BlIG91dGVyU2NvcGUgPSBjbGFzc1Njb3BlLnBhcmVudDsKQEAgLTE3Niw3ICsxNzksNyBAQAogCQkJaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5maWVsZEhpZGluZyh0aGlzLCBleGlzdGluZ1ZhcmlhYmxlKTsKIAkJfQogCX0KLQkKKwogCWlmICh0aGlzLnR5cGUgIT0gbnVsbCApIHsgLy8gZW51bSBjb25zdGFudHMgaGF2ZSBubyBkZWNsYXJlZCB0eXBlCiAJCXRoaXMudHlwZS5yZXNvbHZlZFR5cGUgPSB0aGlzLmJpbmRpbmcudHlwZTsgLy8gdXBkYXRlIGJpbmRpbmcgZm9yIHR5cGUgcmVmZXJlbmNlCiAJfQpAQCAtMTkzLDE0ICsxOTYsMTQgQEAKIAkJCQkmJiAodGhpcy5iaW5kaW5nLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwCiAJCQkJJiYgaW5pdGlhbGl6YXRpb25TY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbkZvckZpZWxkKHRoaXMpOwotCQl9CQkJCQkJCisJCX0KIAkJLy8gdGhlIHJlc29sdXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGhhc24ndCBiZWVuIGRvbmUKIAkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgewogCQkJdGhpcy5iaW5kaW5nLnNldENvbnN0YW50KENvbnN0YW50Lk5vdEFDb25zdGFudCk7CiAJCX0gZWxzZSB7CiAJCQkvLyBicmVhayBkZWFkLWxvY2sgY3ljbGVzIGJ5IGZvcmNpbmcgY29uc3RhbnQgdG8gTm90QUNvbnN0YW50CiAJCQl0aGlzLmJpbmRpbmcuc2V0Q29uc3RhbnQoQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKLQkJCQorCiAJCQlUeXBlQmluZGluZyBmaWVsZFR5cGUgPSB0aGlzLmJpbmRpbmcudHlwZTsKIAkJCVR5cGVCaW5kaW5nIGluaXRpYWxpemF0aW9uVHlwZTsKIAkJCXRoaXMuaW5pdGlhbGl6YXRpb24uc2V0RXhwZWN0ZWRUeXBlKGZpZWxkVHlwZSk7IC8vIG5lZWRlZCBpbiBjYXNlIG9mIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24KQEAgLTIxNSwyOCArMjE4LDI2IEBACiAJCQkJaWYgKGZpZWxkVHlwZSAhPSBpbml0aWFsaXphdGlvblR5cGUpIC8vIG11c3QgY2FsbCBiZWZvcmUgY29tcHV0ZUNvbnZlcnNpb24oKSBhbmQgdHlwZU1pc21hdGNoRXJyb3IoKQogCQkJCQlpbml0aWFsaXphdGlvblNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZUNvbnZlcnNpb24oZmllbGRUeXBlLCBpbml0aWFsaXphdGlvblR5cGUpOwogCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoaW5pdGlhbGl6YXRpb25UeXBlLCBmaWVsZFR5cGUpCi0JCQkJCQl8fCAoZmllbGRUeXBlLmlzQmFzZVR5cGUoKSAmJiBCYXNlVHlwZUJpbmRpbmcuaXNXaWRlbmluZyhmaWVsZFR5cGUuaWQsIGluaXRpYWxpemF0aW9uVHlwZS5pZCkpCiAJCQkJCQl8fCBpbml0aWFsaXphdGlvblR5cGUuaXNDb21wYXRpYmxlV2l0aChmaWVsZFR5cGUpKSB7CiAJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24uY29tcHV0ZUNvbnZlcnNpb24oaW5pdGlhbGl6YXRpb25TY29wZSwgZmllbGRUeXBlLCBpbml0aWFsaXphdGlvblR5cGUpOwogCQkJCQlpZiAoaW5pdGlhbGl6YXRpb25UeXBlLm5lZWRzVW5jaGVja2VkQ29udmVyc2lvbihmaWVsZFR5cGUpKSB7CiAJCQkJCQkgICAgaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVUeXBlQ29udmVyc2lvbih0aGlzLmluaXRpYWxpemF0aW9uLCBpbml0aWFsaXphdGlvblR5cGUsIGZpZWxkVHlwZSk7CiAJCQkJCX0KLQkJCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbiAKKwkJCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbgogCQkJCQkJCSYmICh0aGlzLmluaXRpYWxpemF0aW9uLmJpdHMgJiBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdCkgPT0gMCkgewogCQkJCQkJQ2FzdEV4cHJlc3Npb24uY2hlY2tOZWVkRm9yQXNzaWduZWRDYXN0KGluaXRpYWxpemF0aW9uU2NvcGUsIGZpZWxkVHlwZSwgKENhc3RFeHByZXNzaW9uKSB0aGlzLmluaXRpYWxpemF0aW9uKTsKLQkJCQkJfQkJCQkJCQkJCi0JCQkJfSBlbHNlIGlmIChpbml0aWFsaXphdGlvblNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoaW5pdGlhbGl6YXRpb25UeXBlLCBmaWVsZFR5cGUpIAotCQkJCQkJCQkJfHwgKGluaXRpYWxpemF0aW9uVHlwZS5pc0Jhc2VUeXBlKCkgIC8vIG5hcnJvd2luZyB0aGVuIGJveGluZyA/Ci0JCQkJCQkJCQkJCSYmIGluaXRpYWxpemF0aW9uU2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvLyBhdXRvYm94aW5nCi0JCQkJCQkJCQkJCSYmICFmaWVsZFR5cGUuaXNCYXNlVHlwZSgpCi0JCQkJCQkJCQkJCSYmIGluaXRpYWxpemF0aW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoaW5pdGlhbGl6YXRpb25UeXBlLCBpbml0aWFsaXphdGlvblNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoZmllbGRUeXBlKSkpKSB7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGlzQm94aW5nQ29tcGF0aWJsZShpbml0aWFsaXphdGlvblR5cGUsIGZpZWxkVHlwZSwgdGhpcy5pbml0aWFsaXphdGlvbiwgaW5pdGlhbGl6YXRpb25TY29wZSkpIHsKIAkJCQkJdGhpcy5pbml0aWFsaXphdGlvbi5jb21wdXRlQ29udmVyc2lvbihpbml0aWFsaXphdGlvblNjb3BlLCBmaWVsZFR5cGUsIGluaXRpYWxpemF0aW9uVHlwZSk7Ci0JCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24gCisJCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24KIAkJCQkJCQkmJiAodGhpcy5pbml0aWFsaXphdGlvbi5iaXRzICYgQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3QpID09IDApIHsKIAkJCQkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFzc2lnbmVkQ2FzdChpbml0aWFsaXphdGlvblNjb3BlLCBmaWVsZFR5cGUsIChDYXN0RXhwcmVzc2lvbikgdGhpcy5pbml0aWFsaXphdGlvbik7Ci0JCQkJCX0JCQkJCQkJCisJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGluaXRpYWxpemF0aW9uVHlwZSwgZmllbGRUeXBlLCB0aGlzKTsKKwkJCQkJaWYgKChmaWVsZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApIHsKKwkJCQkJCS8vIGlmIHByb2JsZW0gYWxyZWFkeSBnb3Qgc2lnbmFsZWQgb24gdHlwZSwgZG8gbm90IHJlcG9ydCBzZWNvbmRhcnkgcHJvYmxlbQorCQkJCQkJaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcihpbml0aWFsaXphdGlvblR5cGUsIGZpZWxkVHlwZSwgdGhpcy5pbml0aWFsaXphdGlvbiwgbnVsbCk7CisJCQkJCX0KIAkJCQl9CiAJCQkJaWYgKHRoaXMuYmluZGluZy5pc0ZpbmFsKCkpeyAvLyBjYXN0IGZyb20gY29uc3RhbnQgYWN0dWFsIHR5cGUgdG8gdmFyaWFibGUgdHlwZQogCQkJCQl0aGlzLmJpbmRpbmcuc2V0Q29uc3RhbnQodGhpcy5pbml0aWFsaXphdGlvbi5jb25zdGFudC5jYXN0VG8oKHRoaXMuYmluZGluZy50eXBlLmlkIDw8IDQpICsgdGhpcy5pbml0aWFsaXphdGlvbi5jb25zdGFudC50eXBlSUQoKSkpOwpAQCAtMjQ1LDIwICsyNDYsMjUgQEAKIAkJCQl0aGlzLmJpbmRpbmcuc2V0Q29uc3RhbnQoQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKIAkJCX0KIAkJCS8vIGNoZWNrIGZvciBhc3NpZ25tZW50IHdpdGggbm8gZWZmZWN0Ci0JCQlpZiAodGhpcy5iaW5kaW5nID09IEFzc2lnbm1lbnQuZ2V0RGlyZWN0QmluZGluZyh0aGlzLmluaXRpYWxpemF0aW9uKSkgeworCQkJaWYgKHRoaXMuYmluZGluZyA9PSBFeHByZXNzaW9uLmdldERpcmVjdEJpbmRpbmcodGhpcy5pbml0aWFsaXphdGlvbikpIHsKIAkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFzc2lnbm1lbnRIYXNOb0VmZmVjdCh0aGlzLCB0aGlzLm5hbWUpOwotCQkJfQkJCQkJCisJCQl9CiAJCX0KIAkJLy8gUmVzb2x2ZSBKYXZhZG9jIGNvbW1lbnQgaWYgb25lIGlzIHByZXNlbnQKIAkJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsKSB7Ci0JCQkvKgotCQkJaWYgKGNsYXNzU2NvcGUgIT0gbnVsbCkgewotCQkJCXRoaXMuamF2YWRvYy5yZXNvbHZlKGNsYXNzU2NvcGUpOwotCQkJfQotCQkJKi8KIAkJCXRoaXMuamF2YWRvYy5yZXNvbHZlKGluaXRpYWxpemF0aW9uU2NvcGUpOwotCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmICF0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNMb2NhbFR5cGUoKSkgewotCQkJaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZyh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgdGhpcy5iaW5kaW5nLm1vZGlmaWVycyk7CisJCX0gZWxzZSBpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgIXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSB7CisJCQkvLyBTZXQgamF2YWRvYyB2aXNpYmlsaXR5CisJCQlpbnQgamF2YWRvY1Zpc2liaWxpdHkgPSB0aGlzLmJpbmRpbmcubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NWaXNpYmlsaXR5TUFTSzsKKwkJCVByb2JsZW1SZXBvcnRlciByZXBvcnRlciA9IGluaXRpYWxpemF0aW9uU2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7CisJCQlpbnQgc2V2ZXJpdHkgPSByZXBvcnRlci5jb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY01pc3NpbmcpOworCQkJaWYgKHNldmVyaXR5ICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgeworCQkJCWlmIChjbGFzc1Njb3BlICE9IG51bGwpIHsKKwkJCQkJamF2YWRvY1Zpc2liaWxpdHkgPSBVdGlsLmNvbXB1dGVPdXRlck1vc3RWaXNpYmlsaXR5KGNsYXNzU2NvcGUucmVmZXJlbmNlVHlwZSgpLCBqYXZhZG9jVmlzaWJpbGl0eSk7CisJCQkJfQorCQkJCWludCBqYXZhZG9jTW9kaWZpZXJzID0gKHRoaXMuYmluZGluZy5tb2RpZmllcnMgJiB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NWaXNpYmlsaXR5TUFTSykgfCBqYXZhZG9jVmlzaWJpbGl0eTsKKwkJCQlyZXBvcnRlci5qYXZhZG9jTWlzc2luZyh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgc2V2ZXJpdHksIGphdmFkb2NNb2RpZmllcnMpOworCQkJfQogCQl9CiAJfSBmaW5hbGx5IHsKIAkJaW5pdGlhbGl6YXRpb25TY29wZS5pbml0aWFsaXplZEZpZWxkID0gcHJldmlvdXNGaWVsZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGRSZWZlcmVuY2UuamF2YQppbmRleCA3NDE5ZDdiLi42NmYxNmI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsMTYgKzcsMzQgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMTg1NjgyIC0gSW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgbWFyayBsb2NhbCB2YXJpYWJsZXMgYXMgcmVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW52b2NhdGlvblNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NaXNzaW5nVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIAogcHVibGljIGNsYXNzIEZpZWxkUmVmZXJlbmNlIGV4dGVuZHMgUmVmZXJlbmNlIGltcGxlbWVudHMgSW52b2NhdGlvblNpdGUgewogCkBAIC0yNSwzOCArNDMsMzkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlcjsKIAlwdWJsaWMgY2hhcltdIHRva2VuOwogCXB1YmxpYyBGaWVsZEJpbmRpbmcgYmluZGluZzsJCQkJCQkJCQkJCQkJCQkvLyBleGFjdCBiaW5kaW5nIHJlc3VsdGluZyBmcm9tIGxvb2t1cAotCXByb3RlY3RlZCBGaWVsZEJpbmRpbmcgY29kZWdlbkJpbmRpbmc7CQkJCQkJCQkJLy8gYWN0dWFsIGJpbmRpbmcgdXNlZCBmb3IgY29kZSBnZW5lcmF0aW9uIChpZiBubyBzeW50aGV0aWMgYWNjZXNzb3IpCiAJcHVibGljIE1ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNBY2Nlc3NvcnM7IC8vIFswXT1yZWFkIGFjY2Vzc29yIFsxXT13cml0ZSBhY2Nlc3NvcgotCQorCiAJcHVibGljIGxvbmcgbmFtZVNvdXJjZVBvc2l0aW9uOyAvLyhzdGFydDw8MzIpK2VuZAotCXB1YmxpYyBUeXBlQmluZGluZyByZWNlaXZlclR5cGU7CisJcHVibGljIFR5cGVCaW5kaW5nIGFjdHVhbFJlY2VpdmVyVHlwZTsKIAlwdWJsaWMgVHlwZUJpbmRpbmcgZ2VuZXJpY0Nhc3Q7Ci0JCisKIHB1YmxpYyBGaWVsZFJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcykgewotCXRva2VuID0gc291cmNlOwotCW5hbWVTb3VyY2VQb3NpdGlvbiA9IHBvczsKKwl0aGlzLnRva2VuID0gc291cmNlOworCXRoaXMubmFtZVNvdXJjZVBvc2l0aW9uID0gcG9zOwogCS8vYnkgZGVmYXVsdCB0aGUgcG9zaXRpb24gYXJlIHRoZSBvbmUgb2YgdGhlIGZpZWxkIChub3QgdHJ1ZSBmb3Igc3VwZXIgYWNjZXNzKQotCXNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOwotCXNvdXJjZUVuZCA9IChpbnQpIChwb3MgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLQliaXRzIHw9IEJpbmRpbmcuRklFTEQ7CisJdGhpcy5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwl0aGlzLnNvdXJjZUVuZCA9IChpbnQpIChwb3MgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKKwl0aGlzLmJpdHMgfD0gQmluZGluZy5GSUVMRDsKIAogfQogCi1wdWJsaWMgRmxvd0luZm8gYW5hbHlzZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIAlGbG93Q29udGV4dCBmbG93Q29udGV4dCwgCUZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gaXNDb21wb3VuZCkgeworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiBpc0NvbXBvdW5kKSB7CiAJLy8gY29tcG91bmQgYXNzaWdubWVudCBleHRyYSB3b3JrCiAJaWYgKGlzQ29tcG91bmQpIHsgLy8gY2hlY2sgdGhlIHZhcmlhYmxlIHBhcnQgaXMgaW5pdGlhbGl6ZWQgaWYgYmxhbmsgZmluYWwKLQkJaWYgKGJpbmRpbmcuaXNCbGFua0ZpbmFsKCkKLQkJCSYmIHJlY2VpdmVyLmlzVGhpcygpCi0JCQkmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2soYmluZGluZykKLQkJCSYmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZykpKSB7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChiaW5kaW5nLCB0aGlzKTsKLQkJCS8vIHdlIGNvdWxkIGltcHJvdmUgZXJyb3IgbXNnIGhlcmUgdGVsbGluZyAiY2Fubm90IHVzZSBjb21wb3VuZCBhc3NpZ25tZW50IG9uIGZpbmFsIGJsYW5rIGZpZWxkIgorCQlpZiAodGhpcy5iaW5kaW5nLmlzQmxhbmtGaW5hbCgpCisJCQkmJiB0aGlzLnJlY2VpdmVyLmlzVGhpcygpCisJCQkmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2sodGhpcy5iaW5kaW5nKSkgeworCQkJRmxvd0luZm8gZmllbGRJbml0cyA9IGZsb3dDb250ZXh0LmdldEluaXRzRm9yRmluYWxCbGFua0luaXRpYWxpemF0aW9uQ2hlY2sodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLm9yaWdpbmFsKCksIGZsb3dJbmZvKTsKKwkJCWlmICghZmllbGRJbml0cy5pc0RlZmluaXRlbHlBc3NpZ25lZCh0aGlzLmJpbmRpbmcpKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQodGhpcy5iaW5kaW5nLCB0aGlzKTsKKwkJCQkvLyB3ZSBjb3VsZCBpbXByb3ZlIGVycm9yIG1zZyBoZXJlIHRlbGxpbmcgImNhbm5vdCB1c2UgY29tcG91bmQgYXNzaWdubWVudCBvbiBmaW5hbCBibGFuayBmaWVsZCIKKwkJCX0KIAkJfQogCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvLCB0cnVlIC8qcmVhZC1hY2Nlc3MqLyk7CiAJfQogCWZsb3dJbmZvID0KLQkJcmVjZWl2ZXIKLQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgIWJpbmRpbmcuaXNTdGF0aWMoKSkKKwkJdGhpcy5yZWNlaXZlcgorCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCAhdGhpcy5iaW5kaW5nLmlzU3RhdGljKCkpCiAJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAJCWZsb3dJbmZvID0KQEAgLTY3LDI2ICs4NiwzNyBAQAogCX0KIAltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvLCBmYWxzZSAvKndyaXRlLWFjY2VzcyovKTsKIAotCS8vIGNoZWNrIGlmIGFzc2lnbmluZyBhIGZpbmFsIGZpZWxkIAotCWlmIChiaW5kaW5nLmlzRmluYWwoKSkgeworCS8vIGNoZWNrIGlmIGFzc2lnbmluZyBhIGZpbmFsIGZpZWxkCisJaWYgKHRoaXMuYmluZGluZy5pc0ZpbmFsKCkpIHsKIAkJLy8gaW4gYSBjb250ZXh0IHdoZXJlIGl0IGNhbiBiZSBhc3NpZ25lZD8KLQkJaWYgKGJpbmRpbmcuaXNCbGFua0ZpbmFsKCkKKwkJaWYgKHRoaXMuYmluZGluZy5pc0JsYW5rRmluYWwoKQogCQkJJiYgIWlzQ29tcG91bmQKLQkJCSYmIHJlY2VpdmVyLmlzVGhpcygpCi0JCQkmJiAhKHJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSkKLQkJCSYmICgocmVjZWl2ZXIuYml0cyAmIFBhcmVudGhlc2l6ZWRNQVNLKSA9PSAwKSAvLyAodGhpcykueCBpcyBmb3JiaWRkZW4KLQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoYmluZGluZykpIHsKLQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoYmluZGluZykpIHsKKwkJCSYmIHRoaXMucmVjZWl2ZXIuaXNUaGlzKCkKKwkJCSYmICEodGhpcy5yZWNlaXZlciBpbnN0YW5jZW9mIFF1YWxpZmllZFRoaXNSZWZlcmVuY2UpCisJCQkmJiAoKHRoaXMucmVjZWl2ZXIuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID09IDApIC8vICh0aGlzKS54IGlzIGZvcmJpZGRlbgorCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudCh0aGlzLmJpbmRpbmcpKSB7CisJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKHRoaXMuYmluZGluZykpIHsKIAkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZCgKLQkJCQkJYmluZGluZywKKwkJCQkJdGhpcy5iaW5kaW5nLAogCQkJCQl0aGlzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGJpbmRpbmcsIHRoaXMsIGZsb3dJbmZvKTsKKwkJCQlmbG93Q29udGV4dC5yZWNvcmRTZXR0aW5nRmluYWwodGhpcy5iaW5kaW5nLCB0aGlzLCBmbG93SW5mbyk7CiAJCQl9Ci0JCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZyk7CisJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQodGhpcy5iaW5kaW5nKTsKIAkJfSBlbHNlIHsKIAkJCS8vIGFzc2lnbmluZyBhIGZpbmFsIGZpZWxkIG91dHNpZGUgYW4gaW5pdGlhbGl6ZXIgb3IgY29uc3RydWN0b3Igb3Igd3JvbmcgcmVmZXJlbmNlCi0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbEZpZWxkKGJpbmRpbmcsIHRoaXMpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZCh0aGlzLmJpbmRpbmcsIHRoaXMpOworCQl9CisJfQorCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg2ODIKKwlpZiAoIXRoaXMuYmluZGluZy5pc1N0YXRpYygpKSB7CisJCWlmICh0aGlzLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCQljdXJyZW50U2NvcGUucmVzZXRFbmNsb3NpbmdNZXRob2RTdGF0aWNGbGFnKCk7CisJCX0KKwl9IGVsc2UgaWYgKHRoaXMucmVjZWl2ZXIuaXNUaGlzKCkpIHsKKwkJaWYgKCh0aGlzLnJlY2VpdmVyLmJpdHMgJiBBU1ROb2RlLklzSW1wbGljaXRUaGlzKSA9PSAwKSB7CisJCQkvLyBleHBsaWNpdCB0aGlzLCBub3QgYWxsb3dlZCBpbiBzdGF0aWMgY29udGV4dAorCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOwogCQl9CiAJfQogCXJldHVybiBmbG93SW5mbzsKQEAgLTk3LDEyICsxMjcsMjIgQEAKIH0KIAogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCWJvb2xlYW4gbm9uU3RhdGljID0gIWJpbmRpbmcuaXNTdGF0aWMoKTsKLQlyZWNlaXZlci5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgbm9uU3RhdGljKTsKKwlib29sZWFuIG5vblN0YXRpYyA9ICF0aGlzLmJpbmRpbmcuaXNTdGF0aWMoKTsKKwl0aGlzLnJlY2VpdmVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCBub25TdGF0aWMpOwogCWlmIChub25TdGF0aWMpIHsKLQkJcmVjZWl2ZXIuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQl0aGlzLnJlY2VpdmVyLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODY4MgorCQlpZiAodGhpcy5yZWNlaXZlci5pc1RoaXMoKSkgeworCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCQl9CisJfSBlbHNlIGlmICh0aGlzLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCWlmICgodGhpcy5yZWNlaXZlci5iaXRzICYgQVNUTm9kZS5Jc0ltcGxpY2l0VGhpcykgPT0gMCkgeworCQkJLy8gZXhwbGljaXQgdGhpcyByZWNlaXZlciwgbm90IGFsbG93ZWQgaW4gc3RhdGljIGNvbnRleHQKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg2ODIKKwkJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJfQogCX0KLQkKKwogCWlmICh2YWx1ZVJlcXVpcmVkIHx8IGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgewogCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvLCB0cnVlIC8qcmVhZC1hY2Nlc3MqLyk7CiAJfQpAQCAtMTE0LDUyICsxNTQsNDMgQEAKICAqLwogcHVibGljIHZvaWQgY29tcHV0ZUNvbnZlcnNpb24oU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIHJ1bnRpbWVUaW1lVHlwZSwgVHlwZUJpbmRpbmcgY29tcGlsZVRpbWVUeXBlKSB7CiAJaWYgKHJ1bnRpbWVUaW1lVHlwZSA9PSBudWxsIHx8IGNvbXBpbGVUaW1lVHlwZSA9PSBudWxsKQotCQlyZXR1cm47CQkKKwkJcmV0dXJuOwogCS8vIHNldCB0aGUgZ2VuZXJpYyBjYXN0IGFmdGVyIHRoZSBmYWN0LCBvbmNlIHRoZSB0eXBlIGV4cGVjdGF0aW9uIGlzIGZ1bGx5IGtub3duIChubyBuZWVkIGZvciBzdHJpY3QgY2FzdCkKIAlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJRmllbGRCaW5kaW5nIG9yaWdpbmFsQmluZGluZyA9IHRoaXMuYmluZGluZy5vcmlnaW5hbCgpOwogCQlUeXBlQmluZGluZyBvcmlnaW5hbFR5cGUgPSBvcmlnaW5hbEJpbmRpbmcudHlwZTsKLQkgICAgLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgbWV0aG9kIHJldHVybiB0eXBlIGlzIHR5cGUgdmFyaWFibGUKLQkJaWYgKG9yaWdpbmFsQmluZGluZyAhPSB0aGlzLmJpbmRpbmcgCi0JCQkJJiYgb3JpZ2luYWxUeXBlICE9IHRoaXMuYmluZGluZy50eXBlCi0JCQkJJiYgcnVudGltZVRpbWVUeXBlLmlkICE9IFRfSmF2YUxhbmdPYmplY3QKLQkJCQkmJiAob3JpZ2luYWxUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgIT0gMCkgewotCSAgICAJVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSA9ICghY29tcGlsZVRpbWVUeXBlLmlzQmFzZVR5cGUoKSAmJiBydW50aW1lVGltZVR5cGUuaXNCYXNlVHlwZSgpKSAKKwkgICAgLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgZmllbGQgdHlwZSBpcyB0eXBlIHZhcmlhYmxlCisJCWlmIChvcmlnaW5hbFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJICAgIAlUeXBlQmluZGluZyB0YXJnZXRUeXBlID0gKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpCiAJICAgIAkJPyBjb21waWxlVGltZVR5cGUgIC8vIHVuYm94aW5nOiBjaGVja2Nhc3QgYmVmb3JlIGNvbnZlcnNpb24KIAkgICAgCQk6IHJ1bnRpbWVUaW1lVHlwZTsKIAkgICAgICAgIHRoaXMuZ2VuZXJpY0Nhc3QgPSBvcmlnaW5hbEJpbmRpbmcudHlwZS5nZW5lcmljQ2FzdCh0YXJnZXRUeXBlKTsKIAkgICAgICAgIGlmICh0aGlzLmdlbmVyaWNDYXN0IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQ2FzdCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmdlbmVyaWNDYXN0OwogCQkJCWlmICghcmVmZXJlbmNlQ2FzdC5jYW5CZVNlZW5CeShzY29wZSkpIHsKLQkJICAgICAgICAJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgCisJCSAgICAgICAgCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsCiAJCSAgICAgICAgCQkJbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQkJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCByZWZlcmVuY2VDYXN0LnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJCQkJCQlyZWZlcmVuY2VDYXN0LAogCQkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSk7CiAJCQkJfQotCSAgICAgICAgfQkJCSAgICAgICAgCisJICAgICAgICB9CiAJCX0KLQl9IAkKKwl9CiAJc3VwZXIuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHJ1bnRpbWVUaW1lVHlwZSwgY29tcGlsZVRpbWVUeXBlKTsKIH0KIAogcHVibGljIEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcoKSB7Ci0JcmV0dXJuIGJpbmRpbmc7CisJcmV0dXJuIHRoaXMuYmluZGluZzsKIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoCi0JCWN1cnJlbnRTY29wZSwKLQkJY29kZVN0cmVhbSwKLQkJIXRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CisJRmllbGRCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JZmllbGRTdG9yZSgKLQkJY29kZVN0cmVhbSwKLQkJdGhpcy5jb2RlZ2VuQmluZGluZywKLQkJc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwKLQkJdmFsdWVSZXF1aXJlZCk7CisJZmllbGRTdG9yZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGNvZGVnZW5CaW5kaW5nLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLldSSVRFXSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSwgdmFsdWVSZXF1aXJlZCk7CiAJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CiAJfQpAQCAtMTc1LDYzICsyMDYsNjggQEAKICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQlyZXR1cm47CiAJfQotCWJvb2xlYW4gaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CisJRmllbGRCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJYm9vbGVhbiBpc1N0YXRpYyA9IGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CiAJYm9vbGVhbiBpc1RoaXNSZWNlaXZlciA9IHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBUaGlzUmVmZXJlbmNlOwotCUNvbnN0YW50IGZpZWxkQ29uc3RhbnQgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50KCk7CisJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGNvZGVnZW5CaW5kaW5nLmNvbnN0YW50KCk7CiAJaWYgKGZpZWxkQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCWlmICghaXNUaGlzUmVjZWl2ZXIpIHsKLQkJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CisJCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CiAJCQlpZiAoIWlzU3RhdGljKXsKIAkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7CiAJCQkJY29kZVN0cmVhbS5wb3AoKTsKIAkJCX0KIAkJfQogCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGZpZWxkQ29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRDb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHZhbHVlUmVxdWlyZWQgCisJaWYgKHZhbHVlUmVxdWlyZWQKIAkJCXx8ICghaXNUaGlzUmVjZWl2ZXIgJiYgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KQotCQkJfHwgKChpbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKQorCQkJfHwgKCh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApCiAJCQl8fCAodGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsKSkgewotCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOworCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CisJCWlmICgodGhpcy5iaXRzICYgTmVlZFJlY2VpdmVyR2VuZXJpY0Nhc3QpICE9IDApIHsKKwkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKKwkJfQkJCiAJCXBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeyAvLyBhcnJheSBsZW5ndGgKKwkJaWYgKGNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCiAJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0gZWxzZSB7CiAJCQkJLy8gY291bGQgb2NjdXIgaWYgIXZhbHVlUmVxdWlyZWQgYnV0IGNvbXBsaWFuY2UgPj0gMS40CiAJCQkJY29kZVN0cmVhbS5wb3AoKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCB8fCBzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0gPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgfHwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbRmllbGRSZWZlcmVuY2UuUkVBRF0gPT0gbnVsbCkgeworCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5CaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKTsKIAkJCQlpZiAoaXNTdGF0aWMpIHsKLQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWModGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGNvZGVnZW5CaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbRmllbGRSZWZlcmVuY2UuUkVBRF0sIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCQl9CiAJCQkvLyByZXF1aXJlZCBjYXN0IG11c3Qgb2NjdXIgZXZlbiBpZiBubyB2YWx1ZSBpcyByZXF1aXJlZAogCQkJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYm9vbGVhbiBpc1VuYm94aW5nID0gKGltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7CisJCQkJYm9vbGVhbiBpc1VuYm94aW5nID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMDsKIAkJCQkvLyBjb252ZXJzaW9uIG9ubHkgZ2VuZXJhdGVkIGlmIHVuYm94aW5nCi0JCQkJaWYgKGlzVW5ib3hpbmcpIGNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQlzd2l0Y2ggKGlzVW5ib3hpbmcgPyBwb3N0Q29udmVyc2lvblR5cGUoY3VycmVudFNjb3BlKS5pZCA6IHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZS5pZCkgeworCQkJCWlmIChpc1VuYm94aW5nKSBjb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQlzd2l0Y2ggKGlzVW5ib3hpbmcgPyBwb3N0Q29udmVyc2lvblR5cGUoY3VycmVudFNjb3BlKS5pZCA6IGNvZGVnZW5CaW5kaW5nLnR5cGUuaWQpIHsKIAkJCQkJY2FzZSBUX2xvbmcgOgogCQkJCQljYXNlIFRfZG91YmxlIDoKIAkJCQkJCWNvZGVTdHJlYW0ucG9wMigpOwpAQCAtMjQ1LDE0ICsyODEsMTUgQEAKIAkJaWYgKGlzVGhpc1JlY2VpdmVyKSB7CiAJCQlpZiAoaXNTdGF0aWMpewogCQkJCS8vIGlmIG5vIHZhbHVlUmVxdWlyZWQsIHN0aWxsIG5lZWQgcG9zc2libGUgc2lkZS1lZmZlY3RzIG9mIDxjbGluaXQ+IGludm9jYXRpb24sIGlmIGZpZWxkIGJlbG9uZ3MgdG8gZGlmZmVyZW50IGNsYXNzCi0JCQkJaWYgKHRoaXMuYmluZGluZy5vcmlnaW5hbCgpLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMucmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSkgewotCQkJCQlNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0gc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1JFQURdOyAKKwkJCQlpZiAodGhpcy5iaW5kaW5nLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuZXJhc3VyZSgpKSB7CisJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPSB0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLlJFQURdOwogCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgewotCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWModGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSk7CisJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgYWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCQkJCX0KLQkJCQkJc3dpdGNoICh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUuaWQpIHsKKwkJCQkJc3dpdGNoIChjb2RlZ2VuQmluZGluZy50eXBlLmlkKSB7CiAJCQkJCQljYXNlIFRfbG9uZyA6CiAJCQkJCQljYXNlIFRfZG91YmxlIDoKIAkJCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKQEAgLTI2MywzOCArMzAwLDQwIEBACiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewotCQkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIWlzU3RhdGljKTsJCQkJCisJCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CiAJCQlpZiAoIWlzU3RhdGljKXsKIAkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjawogCQkJCWNvZGVTdHJlYW0ucG9wKCk7CiAJCQl9Ci0JCX0JCQkJCQkKKwkJfQogCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlRW5kKTsKIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlib29sZWFuIGlzU3RhdGljOwotCXJlY2VpdmVyLmdlbmVyYXRlQ29kZSgKLQkJY3VycmVudFNjb3BlLAotCQljb2RlU3RyZWFtLAotCQkhKGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJLy8gY2hlY2sgaWYgY29tcG91bmQgYXNzaWdubWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiBhIHByaXZhdGUgZmllbGQKKwlyZXBvcnRPbmx5VXNlbGVzc2x5UmVhZFByaXZhdGVGaWVsZChjdXJyZW50U2NvcGUsIHRoaXMuYmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJRmllbGRCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhKGlzU3RhdGljID0gY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOwogCWlmIChpc1N0YXRpYykgewotCQlpZiAoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgfHwgc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpIHsKLQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCB8fCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tGaWVsZFJlZmVyZW5jZS5SRUFEXSA9PSBudWxsKSB7CisJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSk7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLlJFQURdLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQl9CiAJfSBlbHNlIHsKIAkJY29kZVN0cmVhbS5kdXAoKTsKLQkJaWYgKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsIHx8IHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSA9PSBudWxsKSB7Ci0JCQljb2RlU3RyZWFtLmdldGZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCB8fCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tGaWVsZFJlZmVyZW5jZS5SRUFEXSA9PSBudWxsKSB7CisJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3JzW1JFQURdKTsKKwkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbRmllbGRSZWZlcmVuY2UuUkVBRF0sIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KIAl9CiAJaW50IG9wZXJhdGlvblR5cGVJRDsKLQlzd2l0Y2gob3BlcmF0aW9uVHlwZUlEID0gKGltcGxpY2l0Q29udmVyc2lvbiAmIElNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgeworCXN3aXRjaChvcGVyYXRpb25UeXBlSUQgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLklNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgewogCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgogCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgogCQljYXNlIFRfdW5kZWZpbmVkIDoKQEAgLTMwMiwxMiArMzQxLDEyIEBACiAJCQlicmVhazsKIAkJZGVmYXVsdCA6CiAJCQlpZiAodGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsKQotCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuZ2VuZXJpY0Nhc3QpOwkJCQkKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmdlbmVyaWNDYXN0KTsKIAkJCS8vIHByb21vdGUgdGhlIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgc3VpdGFibGUgb3BlcmF0aW9uIHR5cGUKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCiAJCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSkgeyAvLyBwcmVmaXggb3BlcmF0aW9uCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0gZWxzZSB7CiAJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJCX0KQEAgLTMxNiw2MiArMzU1LDcxIEBACiAJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKIAl9Ci0JZmllbGRTdG9yZSgKLQkJY29kZVN0cmVhbSwKLQkJdGhpcy5jb2RlZ2VuQmluZGluZywKLQkJc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwKLQkJdmFsdWVSZXF1aXJlZCk7CisJZmllbGRTdG9yZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGNvZGVnZW5CaW5kaW5nLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLldSSVRFXSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSwgdmFsdWVSZXF1aXJlZCk7CiAJLy8gbm8gbmVlZCBmb3IgZ2VuZXJpYyBjYXN0IGFzIHZhbHVlIGdvdCBkdXBwZWQKIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIENvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlib29sZWFuIGlzU3RhdGljOwotCXJlY2VpdmVyLmdlbmVyYXRlQ29kZSgKLQkJY3VycmVudFNjb3BlLAotCQljb2RlU3RyZWFtLAotCQkhKGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJLy8gY2hlY2sgaWYgcG9zdEluY3JlbWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiBhIHByaXZhdGUgZmllbGQKKwlyZXBvcnRPbmx5VXNlbGVzc2x5UmVhZFByaXZhdGVGaWVsZChjdXJyZW50U2NvcGUsIHRoaXMuYmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJRmllbGRCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhKGlzU3RhdGljID0gY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOwogCWlmIChpc1N0YXRpYykgewotCQlpZiAoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgfHwgc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpIHsKLQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCB8fCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tGaWVsZFJlZmVyZW5jZS5SRUFEXSA9PSBudWxsKSB7CisJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSk7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLlJFQURdLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQl9CiAJfSBlbHNlIHsKIAkJY29kZVN0cmVhbS5kdXAoKTsKLQkJaWYgKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsIHx8IHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSA9PSBudWxsKSB7Ci0JCQljb2RlU3RyZWFtLmdldGZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCB8fCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tGaWVsZFJlZmVyZW5jZS5SRUFEXSA9PSBudWxsKSB7CisJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3JzW1JFQURdKTsKKwkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbRmllbGRSZWZlcmVuY2UuUkVBRF0sIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KIAl9CisJVHlwZUJpbmRpbmcgb3BlcmFuZFR5cGU7CisJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgeworCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmdlbmVyaWNDYXN0KTsKKwkJb3BlcmFuZFR5cGUgPSB0aGlzLmdlbmVyaWNDYXN0OworCX0gZWxzZSB7CisJCW9wZXJhbmRUeXBlID0gY29kZWdlbkJpbmRpbmcudHlwZTsKKwl9CQogCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCWlmIChpc1N0YXRpYykgewotCQkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykKLQkJCQl8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCX0KKwkJCXN3aXRjaCAob3BlcmFuZFR5cGUuaWQpIHsKKwkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCWJyZWFrOworCQkJfQkJCQogCQl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXSAgLS0tPiBbb2xkIGZpZWxkIHZhbHVlXVtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXQotCQkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykKLQkJCQl8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5kdXBfeDEoKTsKLQkJCX0KKwkJCXN3aXRjaCAob3BlcmFuZFR5cGUuaWQpIHsKKwkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJCWJyZWFrOworCQkJfQkJCQogCQl9CiAJfQotCWlmICh0aGlzLmdlbmVyaWNDYXN0ICE9IG51bGwpCi0JCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuZ2VuZXJpY0Nhc3QpOwogCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwkJCiAJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KAogCQlwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsCiAJCXRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIENPTVBJTEVfVFlQRV9NQVNLKTsKKwljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oCiAJCXBvc3RJbmNyZW1lbnQucHJlQXNzaWduSW1wbGljaXRDb252ZXJzaW9uKTsKLQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIHRoaXMuY29kZWdlbkJpbmRpbmcsIHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sIGZhbHNlKTsKLX0JCisJZmllbGRTdG9yZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGNvZGVnZW5CaW5kaW5nLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljQWNjZXNzb3JzW0ZpZWxkUmVmZXJlbmNlLldSSVRFXSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSwgZmFsc2UpOworfQogCiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCkBAIC0zODAsODIgKzQyOCw1NiBAQAogCXJldHVybiBudWxsOwogfQogcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsKLQlyZXR1cm4gcmVjZWl2ZXIuaXNTdXBlcigpOworCXJldHVybiB0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKTsKIH0KIAogcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgewotCXJldHVybiByZWNlaXZlciAhPSBudWxsICYmIHJlY2VpdmVyLmlzVHlwZVJlZmVyZW5jZSgpOworCXJldHVybiB0aGlzLnJlY2VpdmVyICE9IG51bGwgJiYgdGhpcy5yZWNlaXZlci5pc1R5cGVSZWZlcmVuY2UoKTsKIH0KIAogLyoKICAqIE5vIG5lZWQgdG8gZW11bGF0ZSBhY2Nlc3MgdG8gcHJvdGVjdGVkIGZpZWxkcyBzaW5jZSBub3QgaW1wbGljaXRseSBhY2Nlc3NlZAogICovCiBwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gaXNSZWFkQWNjZXNzKSB7Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApCXJldHVybjsKLQotCS8vIGlmIGZpZWxkIGZyb20gcGFyYW1ldGVyaXplZCB0eXBlIGdvdCBmb3VuZCwgdXNlIHRoZSBvcmlnaW5hbCBmaWVsZCBhdCBjb2RlZ2VuIHRpbWUKLQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkJcmV0dXJuOwogCQotCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpKSB7Ci0JCWlmICgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSAKLQkJCQkmJiBiaW5kaW5nLmNvbnN0YW50KCkgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQlpZiAoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpCi0JCQkJc3ludGhldGljQWNjZXNzb3JzID0gbmV3IE1ldGhvZEJpbmRpbmdbMl07Ci0JCQlzeW50aGV0aWNBY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gUkVBRCA6IFdSSVRFXSA9IAotCQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZCh0aGlzLmNvZGVnZW5CaW5kaW5nLCBpc1JlYWRBY2Nlc3MpOwotCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZEFjY2Vzcyh0aGlzLmNvZGVnZW5CaW5kaW5nLCB0aGlzLCBpc1JlYWRBY2Nlc3MpOworCS8vIGlmIGZpZWxkIGZyb20gcGFyYW1ldGVyaXplZCB0eXBlIGdvdCBmb3VuZCwgdXNlIHRoZSBvcmlnaW5hbCBmaWVsZCBhdCBjb2RlZ2VuIHRpbWUKKwlGaWVsZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwlpZiAodGhpcy5iaW5kaW5nLmlzUHJpdmF0ZSgpKSB7CisJCWlmICgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCQkmJiB0aGlzLmJpbmRpbmcuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCWlmICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKQorCQkJCXRoaXMuc3ludGhldGljQWNjZXNzb3JzID0gbmV3IE1ldGhvZEJpbmRpbmdbMl07CisJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tpc1JlYWRBY2Nlc3MgPyBGaWVsZFJlZmVyZW5jZS5SRUFEIDogRmllbGRSZWZlcmVuY2UuV1JJVEVdID0KKwkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKGNvZGVnZW5CaW5kaW5nLCBpc1JlYWRBY2Nlc3MsIGZhbHNlIC8qIG5vdCBzdXBlciByZWYgaW4gcmVtb3RlIHR5cGUqLyk7CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkQWNjZXNzKGNvZGVnZW5CaW5kaW5nLCB0aGlzLCBpc1JlYWRBY2Nlc3MpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQl9IGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIHsgLy8gcXVhbGlmaWVkIHN1cGVyCi0KKwl9IGVsc2UgaWYgKHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgeyAvLyBxdWFsaWZpZWQgc3VwZXIKIAkJLy8gcXVhbGlmaWVkIHN1cGVyIG5lZWQgZW11bGF0aW9uIGFsd2F5cwotCQlTb3VyY2VUeXBlQmluZGluZyBkZXN0aW5hdGlvblR5cGUgPQotCQkJKFNvdXJjZVR5cGVCaW5kaW5nKSAoKChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgcmVjZWl2ZXIpCi0JCQkJLmN1cnJlbnRDb21wYXRpYmxlVHlwZSk7Ci0JCWlmIChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkKLQkJCXN5bnRoZXRpY0FjY2Vzc29ycyA9IG5ldyBNZXRob2RCaW5kaW5nWzJdOwotCQlzeW50aGV0aWNBY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gUkVBRCA6IFdSSVRFXSA9IGRlc3RpbmF0aW9uVHlwZS5hZGRTeW50aGV0aWNNZXRob2QodGhpcy5jb2RlZ2VuQmluZGluZywgaXNSZWFkQWNjZXNzKTsKLQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZEFjY2Vzcyh0aGlzLmNvZGVnZW5CaW5kaW5nLCB0aGlzLCBpc1JlYWRBY2Nlc3MpOworCQlTb3VyY2VUeXBlQmluZGluZyBkZXN0aW5hdGlvblR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpICgoKFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSB0aGlzLnJlY2VpdmVyKS5jdXJyZW50Q29tcGF0aWJsZVR5cGUpOworCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkKKwkJCXRoaXMuc3ludGhldGljQWNjZXNzb3JzID0gbmV3IE1ldGhvZEJpbmRpbmdbMl07CisJCXRoaXMuc3ludGhldGljQWNjZXNzb3JzW2lzUmVhZEFjY2VzcyA/IEZpZWxkUmVmZXJlbmNlLlJFQUQgOiBGaWVsZFJlZmVyZW5jZS5XUklURV0gPSBkZXN0aW5hdGlvblR5cGUuYWRkU3ludGhldGljTWV0aG9kKGNvZGVnZW5CaW5kaW5nLCBpc1JlYWRBY2Nlc3MsIGlzU3VwZXJBY2Nlc3MoKSk7CisJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlRmllbGRBY2Nlc3MoY29kZWdlbkJpbmRpbmcsIHRoaXMsIGlzUmVhZEFjY2Vzcyk7CiAJCXJldHVybjsKIAotCX0gZWxzZSBpZiAoYmluZGluZy5pc1Byb3RlY3RlZCgpKSB7Ci0KKwl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5pc1Byb3RlY3RlZCgpKSB7CiAJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGU7Ci0JCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApCi0JCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKQorCQlpZiAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgIT0gMCkKKwkJCSYmIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkKIAkJCQkhPSAoZW5jbG9zaW5nU291cmNlVHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpLmdldFBhY2thZ2UoKSkgewogCiAJCQlTb3VyY2VUeXBlQmluZGluZyBjdXJyZW50Q29tcGF0aWJsZVR5cGUgPQogCQkJCShTb3VyY2VUeXBlQmluZGluZykgZW5jbG9zaW5nU291cmNlVHlwZS5lbmNsb3NpbmdUeXBlQXQoCi0JCQkJCShiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKLQkJCWlmIChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkKLQkJCQlzeW50aGV0aWNBY2Nlc3NvcnMgPSBuZXcgTWV0aG9kQmluZGluZ1syXTsKLQkJCXN5bnRoZXRpY0FjY2Vzc29yc1tpc1JlYWRBY2Nlc3MgPyBSRUFEIDogV1JJVEVdID0gY3VycmVudENvbXBhdGlibGVUeXBlLmFkZFN5bnRoZXRpY01ldGhvZCh0aGlzLmNvZGVnZW5CaW5kaW5nLCBpc1JlYWRBY2Nlc3MpOwotCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZEFjY2Vzcyh0aGlzLmNvZGVnZW5CaW5kaW5nLCB0aGlzLCBpc1JlYWRBY2Nlc3MpOworCQkJCQkodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spID4+IEFTVE5vZGUuRGVwdGhTSElGVCk7CisJCQlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkKKwkJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9IG5ldyBNZXRob2RCaW5kaW5nWzJdOworCQkJdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gRmllbGRSZWZlcmVuY2UuUkVBRCA6IEZpZWxkUmVmZXJlbmNlLldSSVRFXSA9IGN1cnJlbnRDb21wYXRpYmxlVHlwZS5hZGRTeW50aGV0aWNNZXRob2QoY29kZWdlbkJpbmRpbmcsIGlzUmVhZEFjY2VzcywgaXNTdXBlckFjY2VzcygpKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlRmllbGRBY2Nlc3MoY29kZWdlbkJpbmRpbmcsIHRoaXMsIGlzUmVhZEFjY2Vzcyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCi0JLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKLQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBmaWVsZCBhY2Nlc3MuCQotCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5yZWNlaXZlclR5cGUKLQkJCSYmICF0aGlzLnJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCi0JCQkmJiB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKLQkJCSYmIHRoaXMuYmluZGluZy5jb25zdGFudCgpID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKTsKLQkJaWYgKChvcHRpb25zLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8yCi0JCQkJJiYgKG9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgfHwgIShyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpICYmIHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpCi0JCQkJJiYgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfSmF2YUxhbmdPYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcwotCQkJfHwgIXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSB7Ci0KLQkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPQotCQkJCWN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZygKLQkJCQkJdGhpcy5jb2RlZ2VuQmluZGluZywKLQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSk7Ci0JCX0KLQl9CQkKIH0KIAogcHVibGljIGludCBudWxsU3RhdHVzKEZsb3dJbmZvIGZsb3dJbmZvKSB7CkBAIC00NjUsNyArNDg3LDcgQEAKIHB1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSB7CiAJc3dpdGNoICh0aGlzLnJlc29sdmVkVHlwZS5pZCkgewogCQljYXNlIFRfYm9vbGVhbiA6Ci0JCWNhc2UgVF9KYXZhTGFuZ0Jvb2xlYW4gOgkJCisJCWNhc2UgVF9KYXZhTGFuZ0Jvb2xlYW4gOgogCQkJcmV0dXJuIHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ID8gdGhpcy5jb25zdGFudCA6IHRoaXMuYmluZGluZy5jb25zdGFudCgpOwogCQlkZWZhdWx0IDoKIAkJCXJldHVybiBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CkBAIC00NzcsOSArNDk5LDkgQEAKICAqLwogcHVibGljIFR5cGVCaW5kaW5nIHBvc3RDb252ZXJzaW9uVHlwZShTY29wZSBzY29wZSkgewogCVR5cGVCaW5kaW5nIGNvbnZlcnRlZFR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZTsKLQlpZiAodGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsKSAKKwlpZiAodGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsKQogCQljb252ZXJ0ZWRUeXBlID0gdGhpcy5nZW5lcmljQ2FzdDsKLQlpbnQgcnVudGltZVR5cGUgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7CisJaW50IHJ1bnRpbWVUeXBlID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5JTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7CiAJc3dpdGNoIChydW50aW1lVHlwZSkgewogCQljYXNlIFRfYm9vbGVhbiA6CiAJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQk9PTEVBTjsKQEAgLTUwNiw4NiArNTI4LDEzMyBAQAogCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkRPVUJMRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKLQl9CQkKLQlpZiAoKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgQk9YSU5HKSAhPSAwKSB7CisJfQorCWlmICgodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkJPWElORykgIT0gMCkgewogCQljb252ZXJ0ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShjb252ZXJ0ZWRUeXBlKTsKIAl9CiAJcmV0dXJuIGNvbnZlcnRlZFR5cGU7CiB9CiAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQlyZXR1cm4gcmVjZWl2ZXIucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcuJykuYXBwZW5kKHRva2VuKTsKKwlyZXR1cm4gdGhpcy5yZWNlaXZlci5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJy4nKS5hcHBlbmQodGhpcy50b2tlbik7CiB9CiAKIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJLy8gQW5zd2VyIHRoZSBzaWduYXR1cmUgdHlwZSBvZiB0aGUgZmllbGQuCiAJLy8gY29uc3RhbnRzIGFyZSBwcm9wYWdlZCB3aGVuIHRoZSBmaWVsZCBpcyBmaW5hbAotCS8vIGFuZCBpbml0aWFsaXplZCB3aXRoIGEgKGNvbXBpbGUgdGltZSkgY29uc3RhbnQgCisJLy8gYW5kIGluaXRpYWxpemVkIHdpdGggYSAoY29tcGlsZSB0aW1lKSBjb25zdGFudAogCiAJLy9hbHdheXMgaWdub3JlIHJlY2VpdmVyIGNhc3QsIHNpbmNlIG1heSBhZmZlY3QgY29uc3RhbnQgcG9vbCByZWZlcmVuY2UKIAlib29sZWFuIHJlY2VpdmVyQ2FzdCA9IGZhbHNlOwogCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKLQkJdGhpcy5yZWNlaXZlci5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgorCQl0aGlzLnJlY2VpdmVyLmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KIAkJcmVjZWl2ZXJDYXN0ID0gdHJ1ZTsKIAl9Ci0JdGhpcy5yZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JaWYgKHRoaXMucmVjZWl2ZXJUeXBlID09IG51bGwpIHsKLQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKKwlpZiAodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPT0gbnVsbCkgeworCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlyZXR1cm4gbnVsbDsKIAl9CiAJaWYgKHJlY2VpdmVyQ2FzdCkgewogCQkgLy8gZHVlIHRvIGNoYW5nZSBvZiBkZWNsYXJpbmcgY2xhc3Mgd2l0aCByZWNlaXZlciB0eXBlLCBvbmx5IGlkZW50aXR5IGNhc3Qgc2hvdWxkIGJlIG5vdGlmaWVkCi0JCWlmICgoKENhc3RFeHByZXNzaW9uKXRoaXMucmVjZWl2ZXIpLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlID09IHRoaXMucmVjZWl2ZXJUeXBlKSB7IAotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcik7CQkKKwkJaWYgKCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgPT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUNhc3QoKENhc3RFeHByZXNzaW9uKXRoaXMucmVjZWl2ZXIpOwogCQl9Ci0JfQkJCisJfQogCS8vIHRoZSBjYXNlIHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSBhbmQgdG9rZW4gPSAnbGVuZ3RoJyBpcyBoYW5kbGVkIGJ5IHRoZSBzY29wZSBBUEkKLQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEZpZWxkKHRoaXMucmVjZWl2ZXJUeXBlLCB0b2tlbiwgdGhpcyk7CisJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEZpZWxkKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnRva2VuLCB0aGlzKTsKIAlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgdGhpcy5yZWNlaXZlclR5cGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JVHlwZUJpbmRpbmcgcmVjZWl2ZXJFcmFzdXJlID0gdGhpcy5yZWNlaXZlclR5cGUuZXJhc3VyZSgpOwotCWlmIChyZWNlaXZlckVyYXN1cmUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCWlmIChyZWNlaXZlckVyYXN1cmUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpID09IG51bGwpIHsKLQkJCXRoaXMucmVjZWl2ZXJUeXBlID0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOyAvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJaWYgKHRoaXMucmVjZWl2ZXIucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCS8vIHByb2JsZW0gYWxyZWFkeSBnb3Qgc2lnbmFsZWQgb24gcmVjZWl2ZXIsIGRvIG5vdCByZXBvcnQgc2Vjb25kYXJ5IHByb2JsZW0KKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMDcgYXZvaWQgc2Vjb25kYXJ5IGVycm9ycyBpbiBjYXNlIG9mCisJCS8vIG1pc3Npbmcgc3VwZXIgdHlwZSBmb3IgYW5vbnltb3VzIGNsYXNzZXMgLi4uIAorCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlib29sZWFuIGF2b2lkU2Vjb25kYXJ5ID0gZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAmJgorCQkJCQkJCQkgZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkgJiYKKwkJCQkJCQkJIGRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKSBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZzsKKwkJaWYgKCFhdm9pZFNlY29uZGFyeSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKKwkJfQorCQlpZiAoZmllbGRCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUZpZWxkQmluZGluZykgeworCQkJUHJvYmxlbUZpZWxkQmluZGluZyBwcm9ibGVtRmllbGRCaW5kaW5nID0gKFByb2JsZW1GaWVsZEJpbmRpbmcpIGZpZWxkQmluZGluZzsKKwkJCUZpZWxkQmluZGluZyBjbG9zZXN0TWF0Y2ggPSBwcm9ibGVtRmllbGRCaW5kaW5nLmNsb3Nlc3RNYXRjaDsKKwkJCXN3aXRjaChwcm9ibGVtRmllbGRCaW5kaW5nLnByb2JsZW1JZCgpKSB7CisJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOgorCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24gOgorCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCQkJaWYgKGNsb3Nlc3RNYXRjaCAhPSBudWxsKSB7CisJCQkJCQlmaWVsZEJpbmRpbmcgPSBjbG9zZXN0TWF0Y2g7CisJCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KLQl0aGlzLnJlY2VpdmVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5yZWNlaXZlclR5cGUpOwotCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZEJpbmRpbmcsIHNjb3BlLCAodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSAhPTApKSB7CisJLy8gaGFuZGxlIGluZGlyZWN0IGluaGVyaXRhbmNlIHRocnUgdmFyaWFibGUgc2Vjb25kYXJ5IGJvdW5kCisJLy8gcmVjZWl2ZXIgbWF5IHJlY2VpdmUgZ2VuZXJpYyBjYXN0LCBhcyBwYXJ0IG9mIGltcGxpY2l0IGNvbnZlcnNpb24KKwlUeXBlQmluZGluZyBvbGRSZWNlaXZlclR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmdldEVyYXN1cmVDb21wYXRpYmxlVHlwZShmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpOworCXRoaXMucmVjZWl2ZXIuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSk7CisJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG9sZFJlY2VpdmVyVHlwZSAmJiB0aGlzLnJlY2VpdmVyLnBvc3RDb252ZXJzaW9uVHlwZShzY29wZSkgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpIHsgLy8gcmVjb3JkIG5lZWQgZm9yIGV4cGxpY2l0IGNhc3QgYXQgY29kZWdlbiBzaW5jZSByZWNlaXZlciBjb3VsZCBub3QgaGFuZGxlIGl0CisJCXRoaXMuYml0cyB8PSBOZWVkUmVjZWl2ZXJHZW5lcmljQ2FzdDsKKwl9CisJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUsIHRoaXMuYml0cykpIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CiAJfQotCWJvb2xlYW4gaXNJbXBsaWNpdFRoaXNSY3YgPSByZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpOwotCWNvbnN0YW50ID0gaXNJbXBsaWNpdFRoaXNSY3YgPyBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKSA6IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwlib29sZWFuIGlzSW1wbGljaXRUaGlzUmN2ID0gdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpOworCXRoaXMuY29uc3RhbnQgPSBpc0ltcGxpY2l0VGhpc1JjdiA/IGZpZWxkQmluZGluZy5jb25zdGFudCgpIDogQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewogCQkvLyBzdGF0aWMgZmllbGQgYWNjZXNzZWQgdGhyb3VnaCByZWNlaXZlcj8gbGVnYWwgYnV0IHVub3B0aW1hbCAob3B0aW9uYWwgd2FybmluZykKIAkJaWYgKCEoaXNJbXBsaWNpdFRoaXNSY3YKLQkJCQl8fCAocmVjZWl2ZXIgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlIAotCQkJCQkmJiAoKChOYW1lUmVmZXJlbmNlKSByZWNlaXZlcikuYml0cyAmIEJpbmRpbmcuVFlQRSkgIT0gMCkpKSB7CisJCQkJfHwgKHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlCisJCQkJCSYmICgoKE5hbWVSZWZlcmVuY2UpIHRoaXMucmVjZWl2ZXIpLmJpdHMgJiBCaW5kaW5nLlRZUEUpICE9IDApKSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uU3RhdGljQWNjZXNzVG9TdGF0aWNGaWVsZCh0aGlzLCBmaWVsZEJpbmRpbmcpOwogCQl9CisJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CiAJCWlmICghaXNJbXBsaWNpdFRoaXNSY3YKLQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gcmVjZWl2ZXJUeXBlCi0JCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KHNjb3BlKSkgeworCQkJCSYmIGRlY2xhcmluZ0NsYXNzICE9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlCisJCQkJJiYgZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoc2NvcGUpKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmRpcmVjdEFjY2Vzc1RvU3RhdGljRmllbGQodGhpcywgZmllbGRCaW5kaW5nKTsKIAkJfQorCQkvLyBjaGVjayBpZiBhY2Nlc3NpbmcgZW51bSBzdGF0aWMgZmllbGQgaW4gaW5pdGlhbGl6ZXIKKwkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7CisJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJaWYgKHRoaXMuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50CisJCQkJCSYmICFtZXRob2RTY29wZS5pc1N0YXRpYworCQkJCQkmJiAoc291cmNlVHlwZSA9PSBkZWNsYXJpbmdDbGFzcyB8fCBzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPT0gZGVjbGFyaW5nQ2xhc3MpIC8vIGVudW0gY29uc3RhbnQgYm9keQorCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZW51bVN0YXRpY0ZpZWxkVXNlZER1cmluZ0luaXRpYWxpemF0aW9uKHRoaXMuYmluZGluZywgdGhpcyk7CisJCQl9CisJCX0KIAl9CiAJVHlwZUJpbmRpbmcgZmllbGRUeXBlID0gZmllbGRCaW5kaW5nLnR5cGU7Ci0JaWYgKGZpZWxkVHlwZSAhPSBudWxsICYmICgodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwKSkgewotCQlmaWVsZFR5cGUgPSBmaWVsZFR5cGUuY2FwdHVyZShzY29wZSwgdGhpcy5zb3VyY2VFbmQpOwkvLyBwZXJmb3JtIGNhcHR1cmUgY29udmVyc2lvbiBpZiByZWFkIGFjY2VzcworCWlmIChmaWVsZFR5cGUgIT0gbnVsbCkgeworCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwKSB7CisJCQlmaWVsZFR5cGUgPSBmaWVsZFR5cGUuY2FwdHVyZShzY29wZSwgdGhpcy5zb3VyY2VFbmQpOwkvLyBwZXJmb3JtIGNhcHR1cmUgY29udmVyc2lvbiBpZiByZWFkIGFjY2VzcworCQl9CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gZmllbGRUeXBlOworCQlpZiAoKGZpZWxkVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgZmllbGRUeXBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CiAJfQotCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGZpZWxkVHlwZTsKKwlyZXR1cm4gZmllbGRUeXBlOwogfQogCiBwdWJsaWMgdm9pZCBzZXRBY3R1YWxSZWNlaXZlclR5cGUoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsKLQkvLyBpZ25vcmVkCisJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGU7CiB9CiAKIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgewotCWJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CQkJCisJdGhpcy5iaXRzICY9IH5BU1ROb2RlLkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CiAJaWYgKGRlcHRoID4gMCkgewotCQliaXRzIHw9IChkZXB0aCAmIDB4RkYpIDw8IERlcHRoU0hJRlQ7IC8vIGVuY29kZWQgb24gOCBiaXRzCisJCXRoaXMuYml0cyB8PSAoZGVwdGggJiAweEZGKSA8PCBBU1ROb2RlLkRlcHRoU0hJRlQ7IC8vIGVuY29kZWQgb24gOCBiaXRzCiAJfQogfQogCkBAIC01OTUsNyArNjY0LDcgQEAKIAogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCXJlY2VpdmVyLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJdGhpcy5yZWNlaXZlci50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJfQogCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GbG9hdExpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmxvYXRMaXRlcmFsLmphdmEKaW5kZXggNDM3OTNlZi4uZjNlNGIyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GbG9hdExpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Zsb2F0TGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDYgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkZsb2F0Q29uc3RhbnQ7CkBAIC0xOCw5OCArMTksMTA3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuRmxvYXRVdGlsOwogCiBwdWJsaWMgY2xhc3MgRmxvYXRMaXRlcmFsIGV4dGVuZHMgTnVtYmVyTGl0ZXJhbCB7CisJCiAJZmxvYXQgdmFsdWU7Ci0JZmluYWwgc3RhdGljIGZsb2F0IEZsb2F0X01JTl9WQUxVRSA9IEZsb2F0LmludEJpdHNUb0Zsb2F0KDEpOyAvLyB3b3JrLWFyb3VuZCBWQUogcHJvYmxlbSAxRjZJR1VVCi0JcHVibGljIEZsb2F0TGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLCBpbnQgZSkgewotCQlzdXBlcih0b2tlbiwgcywgZSk7CisJCitwdWJsaWMgRmxvYXRMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJc3VwZXIodG9rZW4sIHMsIGUpOworfQorCitwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7CisJRmxvYXQgY29tcHV0ZWRWYWx1ZTsKKwlib29sZWFuIGNvbnRhaW5zVW5kZXJzY29yZXMgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJ18nLCB0aGlzLnNvdXJjZSkgPiAwOworCWlmIChjb250YWluc1VuZGVyc2NvcmVzKSB7CisJCS8vIHJlbW92ZSBhbGwgdW5kZXJzY29yZXMgZnJvbSBzb3VyY2UKKwkJdGhpcy5zb3VyY2UgPSBDaGFyT3BlcmF0aW9uLnJlbW92ZSh0aGlzLnNvdXJjZSwgJ18nKTsKIAl9Ci0JcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewotCQlGbG9hdCBjb21wdXRlZFZhbHVlOworCXRyeSB7CisJCWNvbXB1dGVkVmFsdWUgPSBGbG9hdC52YWx1ZU9mKFN0cmluZy52YWx1ZU9mKHRoaXMuc291cmNlKSk7CisJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJLy8gaGV4IGZsb2F0aW5nIHBvaW50IGxpdGVyYWwKKwkJLy8gYmVpbmcgcmVqZWN0ZWQgYnkgMS40IGxpYnJhcmllcyB3aGVyZSBGbG9hdC52YWx1ZU9mKC4uLikgZG9lc24ndCBoYW5kbGUgaGV4IGRlY2ltYWwgZmxvYXRzCiAJCXRyeSB7Ci0JCQljb21wdXRlZFZhbHVlID0gRmxvYXQudmFsdWVPZihTdHJpbmcudmFsdWVPZihzb3VyY2UpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGhleCBmbG9hdGluZyBwb2ludCBsaXRlcmFsCi0JCQkvLyBiZWluZyByZWplY3RlZCBieSAxLjQgbGlicmFyaWVzIHdoZXJlIEZsb2F0LnZhbHVlT2YoLi4uKSBkb2Vzbid0IGhhbmRsZSBoZXggZGVjaW1hbCBmbG9hdHMKLQkJCXRyeSB7Ci0JCQkJZmxvYXQgdiA9IEZsb2F0VXRpbC52YWx1ZU9mSGV4RmxvYXRMaXRlcmFsKHNvdXJjZSk7Ci0JCQkJaWYgKHYgPT0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkpIHsKLQkJCQkJLy8gZXJyb3I6IHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChGbG9hdC5pc05hTih2KSkgeworCQkJZmxvYXQgdiA9IEZsb2F0VXRpbC52YWx1ZU9mSGV4RmxvYXRMaXRlcmFsKHRoaXMuc291cmNlKTsKKwkJCWlmICh2ID09IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKSB7CisJCQkJLy8gZXJyb3I6IHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChGbG9hdC5pc05hTih2KSkgeworCQkJCS8vIGVycm9yOiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCB0byByZXByZXNlbnQKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzLnZhbHVlID0gdjsKKwkJCXRoaXMuY29uc3RhbnQgPSBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSh2KTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7CisJCQkvLyBpZiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGNvbnN0YW50IGZhaWxzCisJCX0KKwkJcmV0dXJuOworCX0KKwlmaW5hbCBmbG9hdCBmbG9hdFZhbHVlID0gY29tcHV0ZWRWYWx1ZS5mbG9hdFZhbHVlKCk7CisJaWYgKGZsb2F0VmFsdWUgPiBGbG9hdC5NQVhfVkFMVUUpIHsKKwkJLy8gZXJyb3I6IHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAorCQlyZXR1cm47CisJfQorCWlmIChmbG9hdFZhbHVlIDwgRmxvYXQuTUlOX1ZBTFVFKSB7CisJCS8vIHNlZSAxRjZJR1VVCisJCS8vIGEgdHJ1ZSAwIG9ubHkgaGFzICcwJyBhbmQgJy4nIGluIG1hbnRpc3NhCisJCS8vIDEuMGUtNTAwMGQgaXMgbm9uLXplcm8sIGJ1dCB1bmRlcmZsb3dzIHRvIDAKKwkJYm9vbGVhbiBpc0hleGFEZWNpbWFsID0gZmFsc2U7CisJCWxhYmVsIDogZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZS5sZW5ndGg7IGkrKykgeyAvL2l0IGlzIHdlbGxlZCBmb3JtYXRlZCBzbyBqdXN0IHRlc3QgYWdhaW5zdCAnMCcgYW5kIHBvdGVudGlhbCAuIEQgZAorCQkJc3dpdGNoICh0aGlzLnNvdXJjZVtpXSkgeworCQkJCWNhc2UgJzAnIDoKKwkJCQljYXNlICcuJyA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3gnIDoKKwkJCQljYXNlICdYJyA6CisJCQkJCWlzSGV4YURlY2ltYWwgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdlJyA6CisJCQkJY2FzZSAnRScgOgorCQkJCWNhc2UgJ2YnIDoKKwkJCQljYXNlICdGJyA6CisJCQkJY2FzZSAnZCcgOgorCQkJCWNhc2UgJ0QnIDoKKwkJCQkJaWYgKGlzSGV4YURlY2ltYWwpIHsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvLyBzdGFydGluZyB0aGUgZXhwb25lbnQgLSBtYW50aXNzYSBpcyBhbGwgemVybworCQkJCQkvLyBubyBleHBvbmVudCAtIG1hbnRpc3NhIGlzIGFsbCB6ZXJvCisJCQkJCWJyZWFrIGxhYmVsOworCQkJCWNhc2UgJ3AnIDoKKwkJCQljYXNlICdQJyA6CisJCQkJCWJyZWFrIGxhYmVsOworCQkJCWRlZmF1bHQgOgogCQkJCQkvLyBlcnJvcjogdGhlIG51bWJlciBpcyB0b28gc21hbGwgdG8gcmVwcmVzZW50CiAJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdmFsdWUgPSB2OwotCQkJCWNvbnN0YW50ID0gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUodik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBpZiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGNvbnN0YW50IGZhaWxzCiAJCQl9Ci0JCQlyZXR1cm47CiAJCX0KKwl9CisJdGhpcy52YWx1ZSA9IGZsb2F0VmFsdWU7CisJdGhpcy5jb25zdGFudCA9IEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKHRoaXMudmFsdWUpOworfQogCi0JCWZpbmFsIGZsb2F0IGZsb2F0VmFsdWUgPSBjb21wdXRlZFZhbHVlLmZsb2F0VmFsdWUoKTsKLQkJaWYgKGZsb2F0VmFsdWUgPiBGbG9hdC5NQVhfVkFMVUUpIHsKLQkJCS8vIGVycm9yOiB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZmxvYXRWYWx1ZSA8IEZsb2F0Lk1JTl9WQUxVRSkgewotCQkJLy8gc2VlIDFGNklHVVUKLQkJCS8vIGEgdHJ1ZSAwIG9ubHkgaGFzICcwJyBhbmQgJy4nIGluIG1hbnRpc3NhCi0JCQkvLyAxLjBlLTUwMDBkIGlzIG5vbi16ZXJvLCBidXQgdW5kZXJmbG93cyB0byAwCi0JCQlib29sZWFuIGlzSGV4YURlY2ltYWwgPSBmYWxzZTsKLQkJCWxhYmVsIDogZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsgLy9pdCBpcyB3ZWxsZWQgZm9ybWF0ZWQgc28ganVzdCB0ZXN0IGFnYWluc3QgJzAnIGFuZCBwb3RlbnRpYWwgLiBEIGQgIAotCQkJCXN3aXRjaCAoc291cmNlW2ldKSB7Ci0JCQkJCWNhc2UgJzAnIDoKLQkJCQkJY2FzZSAnLicgOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ3gnIDoKLQkJCQkJY2FzZSAnWCcgOgotCQkJCQkJaXNIZXhhRGVjaW1hbCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnZScgOgotCQkJCQljYXNlICdFJyA6Ci0JCQkJCWNhc2UgJ2YnIDoKLQkJCQkJY2FzZSAnRicgOgotCQkJCQljYXNlICdkJyA6Ci0JCQkJCWNhc2UgJ0QnIDoKLQkJCQkJCWlmIChpc0hleGFEZWNpbWFsKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJLy8gc3RhcnRpbmcgdGhlIGV4cG9uZW50IC0gbWFudGlzc2EgaXMgYWxsIHplcm8KLQkJCQkJCS8vIG5vIGV4cG9uZW50IC0gbWFudGlzc2EgaXMgYWxsIHplcm8KLQkJCQkJCWJyZWFrIGxhYmVsOwotCQkJCQljYXNlICdwJyA6Ci0JCQkJCWNhc2UgJ1AnIDoKLQkJCQkJCWJyZWFrIGxhYmVsOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCS8vIGVycm9yOiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbCB0byByZXByZXNlbnQKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmFsdWUgPSBmbG9hdFZhbHVlOwotCQljb25zdGFudCA9IEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlKTsKKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciBmbG9hdCBsaXRlcmFsCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAl9Ci0JLyoqCi0JICogQ29kZSBnZW5lcmF0aW9uIGZvciBmbG9hdCBsaXRlcmFsCi0JICoKLQkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQotCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KLQkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwotCQl9Ci0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci0JfQotCXB1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXJldHVybiBUeXBlQmluZGluZy5GTE9BVDsKLQl9Ci0JcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLQl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KKworcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlyZXR1cm4gVHlwZUJpbmRpbmcuRkxPQVQ7Cit9CisKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEKaW5kZXggZmRkNmFhMi4uMjc0OTRmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZvclN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAzMTkyMDEgLSBbbnVsbF0gbm8gd2FybmluZyB3aGVuIHVuYm94aW5nIFNpbmdsZU5hbWVSZWZlcmVuY2UgY2F1c2VzIE5QRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKQEAgLTE4LDcgKzE5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBjbGFzcyBGb3JTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIFN0YXRlbWVudFtdIGluaXRpYWxpemF0aW9uczsKIAlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb247CiAJcHVibGljIFN0YXRlbWVudFtdIGluY3JlbWVudHM7CkBAIC01OCwyMSArNTksMTggQEAKIAkJfQogCX0KIAotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCQkJCi0JCWJyZWFrTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKTsKLQkJY29udGludWVMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpOworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCXRoaXMuYnJlYWtMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpOworCQl0aGlzLmNvbnRpbnVlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKTsKKwkJaW50IGluaXRpYWxDb21wbGFpbnRMZXZlbCA9IChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwID8gU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEUgOiBTdGF0ZW1lbnQuTk9UX0NPTVBMQUlORUQ7CiAKIAkJLy8gcHJvY2VzcyB0aGUgaW5pdGlhbGl6YXRpb25zCi0JCWlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlmbG93SW5mbyA9IGluaXRpYWxpemF0aW9uc1tpXS5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRoaXMuaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlmbG93SW5mbyA9IHRoaXMuaW5pdGlhbGl6YXRpb25zW2ldLmFuYWx5c2VDb2RlKHRoaXMuc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCQl9CiAJCX0KLQkJcHJlQ29uZEluaXRTdGF0ZUluZGV4ID0KKwkJdGhpcy5wcmVDb25kSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOwogCiAJCUNvbnN0YW50IGNzdCA9IHRoaXMuY29uZGl0aW9uID09IG51bGwgPyBudWxsIDogdGhpcy5jb25kaXRpb24uY29uc3RhbnQ7CkBAIC04NiwyNSArODQsMjggQEAKIAkJLy8gcHJvY2VzcyB0aGUgY29uZGl0aW9uCiAJCUxvb3BpbmdGbG93Q29udGV4dCBjb25kTG9vcENvbnRleHQgPSBudWxsOwogCQlGbG93SW5mbyBjb25kSW5mbyA9IGZsb3dJbmZvLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCk7Ci0JCWlmIChjb25kaXRpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy5jb25kaXRpb24gIT0gbnVsbCkgewogCQkJaWYgKCFpc0NvbmRpdGlvblRydWUpIHsKIAkJCQljb25kSW5mbyA9Ci0JCQkJCWNvbmRpdGlvbi5hbmFseXNlQ29kZSgKLQkJCQkJCXNjb3BlLAorCQkJCQl0aGlzLmNvbmRpdGlvbi5hbmFseXNlQ29kZSgKKwkJCQkJCXRoaXMuc2NvcGUsCiAJCQkJCQkoY29uZExvb3BDb250ZXh0ID0KLQkJCQkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCBmbG93SW5mbywgdGhpcywgbnVsbCwgCi0JCQkJCQkJCW51bGwsIHNjb3BlKSksCisJCQkJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIG51bGwsCisJCQkJCQkJCW51bGwsIHRoaXMuc2NvcGUpKSwKIAkJCQkJCWNvbmRJbmZvKTsKKwkJCQlpZiAoKHRoaXMuY29uZGl0aW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQkJdGhpcy5jb25kaXRpb24uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJCX0KIAkJCX0KIAkJfQogCiAJCS8vIHByb2Nlc3MgdGhlIGFjdGlvbgogCQlMb29waW5nRmxvd0NvbnRleHQgbG9vcGluZ0NvbnRleHQ7CiAJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBhY3Rpb25JbmZvOwotCQlpZiAoYWN0aW9uID09IG51bGwgCi0JCQl8fCAoYWN0aW9uLmlzRW1wdHlCbG9jaygpICYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMykpIHsKKwkJaWYgKHRoaXMuYWN0aW9uID09IG51bGwKKwkJCXx8ICh0aGlzLmFjdGlvbi5pc0VtcHR5QmxvY2soKSAmJiBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMpKSB7CiAJCQlpZiAoY29uZExvb3BDb250ZXh0ICE9IG51bGwpCi0JCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHNjb3BlLCBjb25kSW5mbyk7CisJCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHRoaXMuc2NvcGUsIGNvbmRJbmZvKTsKIAkJCWlmIChpc0NvbmRpdGlvblRydWUpIHsKIAkJCQlpZiAoY29uZExvb3BDb250ZXh0ICE9IG51bGwpIHsKIAkJCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLApAQCAtMTEzLDIwICsxMTQsMjAgQEAKIAkJCQlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7CiAJCQl9IGVsc2UgewogCQkJCWlmIChpc0NvbmRpdGlvbkZhbHNlKXsKLQkJCQkJY29udGludWVMYWJlbCA9IG51bGw7IC8vIGZvcig7ZmFsc2U7cCgpKTsKKwkJCQkJdGhpcy5jb250aW51ZUxhYmVsID0gbnVsbDsgLy8gZm9yKDtmYWxzZTtwKCkpOwogCQkJCX0KIAkJCQlhY3Rpb25JbmZvID0gY29uZEluZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxDb3B5KCk7CiAJCQkJbG9vcGluZ0NvbnRleHQgPQotCQkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCBmbG93SW5mbywgdGhpcywgCi0JCQkJCQlicmVha0xhYmVsLCBjb250aW51ZUxhYmVsLCBzY29wZSk7CisJCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLAorCQkJCQkJdGhpcy5icmVha0xhYmVsLCB0aGlzLmNvbnRpbnVlTGFiZWwsIHRoaXMuc2NvcGUpOwogCQkJfQotCQl9IAorCQl9CiAJCWVsc2UgewogCQkJbG9vcGluZ0NvbnRleHQgPQotCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBicmVha0xhYmVsLCAKLQkJCQkJY29udGludWVMYWJlbCwgc2NvcGUpOworCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCB0aGlzLmJyZWFrTGFiZWwsCisJCQkJCXRoaXMuY29udGludWVMYWJlbCwgdGhpcy5zY29wZSk7CiAJCQlGbG93SW5mbyBpbml0c1doZW5UcnVlID0gY29uZEluZm8uaW5pdHNXaGVuVHJ1ZSgpOwotCQkJY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ID0KKwkJCXRoaXMuY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ID0KIAkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhpbml0c1doZW5UcnVlKTsKIAogCQkJCWlmIChpc0NvbmRpdGlvbkZhbHNlKSB7CkBAIC0xMzQsMjcgKzEzNSwyNiBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCWFjdGlvbkluZm8gPSBpbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxDb3B5KCk7CiAJCQkJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlKXsKLQkJCQkJCWFjdGlvbkluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsKKwkJCQkJCWFjdGlvbkluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwogCQkJCQl9CiAJCQkJfQotCQkJaWYgKCF0aGlzLmFjdGlvbi5jb21wbGFpbklmVW5yZWFjaGFibGUoYWN0aW9uSW5mbywgc2NvcGUsIGZhbHNlKSkgewotCQkJCWFjdGlvbkluZm8gPSBhY3Rpb24uYW5hbHlzZUNvZGUoc2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKS4KLQkJCQkJdW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlpZiAodGhpcy5hY3Rpb24uY29tcGxhaW5JZlVucmVhY2hhYmxlKGFjdGlvbkluZm8sIHRoaXMuc2NvcGUsIGluaXRpYWxDb21wbGFpbnRMZXZlbCkgPCBTdGF0ZW1lbnQuQ09NUExBSU5FRF9VTlJFQUNIQUJMRSkgeworCQkJCWFjdGlvbkluZm8gPSB0aGlzLmFjdGlvbi5hbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBsb29waW5nQ29udGV4dCwgYWN0aW9uSW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCQl9CiAKIAkJCS8vIGNvZGUgZ2VuZXJhdGlvbiBjYW4gYmUgb3B0aW1pemVkIHdoZW4gbm8gbmVlZCB0byBjb250aW51ZSBpbiB0aGUgbG9vcAotCQkJaWYgKChhY3Rpb25JbmZvLnRhZ0JpdHMgJiAKKwkJCWlmICgoYWN0aW9uSW5mby50YWdCaXRzICYKIAkJCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHMgJgotCQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgewotCQkJCWNvbnRpbnVlTGFiZWwgPSBudWxsOwotCQkJfSAKKwkJCQkJRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkgeworCQkJCXRoaXMuY29udGludWVMYWJlbCA9IG51bGw7CisJCQl9CiAJCQllbHNlIHsKIAkJCQlpZiAoY29uZExvb3BDb250ZXh0ICE9IG51bGwpIHsKLQkJCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHNjb3BlLCAKKwkJCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHRoaXMuc2NvcGUsCiAJCQkJCQkJY29uZEluZm8pOwogCQkJCX0KIAkJCQlhY3Rpb25JbmZvID0gYWN0aW9uSW5mby5tZXJnZWRXaXRoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZSk7Ci0JCQkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkRmluYWxDaGVja3Moc2NvcGUsIAorCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHRoaXMuc2NvcGUsCiAJCQkJCQlhY3Rpb25JbmZvKTsKIAkJCX0KIAkJfQpAQCAtMTYyLDUwICsxNjIsNzEgQEAKIAkJRmxvd0luZm8gZXhpdEJyYW5jaCA9IGZsb3dJbmZvLmNvcHkoKTsKIAkJLy8gcmVjb3ZlciBudWxsIGluaXRzIGZyb20gYmVmb3JlIGNvbmRpdGlvbiBhbmFseXNpcwogCQlMb29waW5nRmxvd0NvbnRleHQgaW5jcmVtZW50Q29udGV4dCA9IG51bGw7Ci0JCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKLQkJCWlmIChpbmNyZW1lbnRzICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5pbmNyZW1lbnRzICE9IG51bGwpIHsKIAkJCQlpbmNyZW1lbnRDb250ZXh0ID0KLQkJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIG51bGwsIAotCQkJCQkJbnVsbCwgc2NvcGUpOworCQkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCBmbG93SW5mbywgdGhpcywgbnVsbCwKKwkJCQkJCW51bGwsIHRoaXMuc2NvcGUpOwogCQkJCUZsb3dJbmZvIGluY3JlbWVudEluZm8gPSBhY3Rpb25JbmZvOwogCQkJCXRoaXMucHJlSW5jcmVtZW50c0luaXRTdGF0ZUluZGV4ID0KIAkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoaW5jcmVtZW50SW5mbyk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gaW5jcmVtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCWluY3JlbWVudEluZm8gPSBpbmNyZW1lbnRzW2ldLgotCQkJCQkJYW5hbHlzZUNvZGUoc2NvcGUsIGluY3JlbWVudENvbnRleHQsIGluY3JlbWVudEluZm8pOworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRoaXMuaW5jcmVtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCWluY3JlbWVudEluZm8gPSB0aGlzLmluY3JlbWVudHNbaV0uCisJCQkJCQlhbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBpbmNyZW1lbnRDb250ZXh0LCBpbmNyZW1lbnRJbmZvKTsKIAkJCQl9Ci0JCQkJaW5jcmVtZW50Q29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhzY29wZSwKKwkJCQlpbmNyZW1lbnRDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHRoaXMuc2NvcGUsCiAJCQkJCQlhY3Rpb25JbmZvID0gaW5jcmVtZW50SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiAJCQl9CiAJCQlleGl0QnJhbmNoLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oYWN0aW9uSW5mbykuCiAJCQkJYWRkSW5pdGlhbGl6YXRpb25zRnJvbShjb25kSW5mby5pbml0c1doZW5GYWxzZSgpKTsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWV4aXRCcmFuY2guYWRkSW5pdGlhbGl6YXRpb25zRnJvbShjb25kSW5mby5pbml0c1doZW5GYWxzZSgpKTsKKwkJCWlmICh0aGlzLmluY3JlbWVudHMgIT0gbnVsbCkgeworCQkJCWlmIChpbml0aWFsQ29tcGxhaW50TGV2ZWwgPT0gU3RhdGVtZW50Lk5PVF9DT01QTEFJTkVEKSB7CisJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mYWtlUmVhY2hhYmxlKHRoaXMuaW5jcmVtZW50c1swXSk7CisJCQkJfQorCQkJfQogCQl9CiAJCS8vIG51bGxzIGNoZWNrcwogCQlpZiAoY29uZExvb3BDb250ZXh0ICE9IG51bGwpIHsKLQkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWROdWxsQ2hlY2tzKGN1cnJlbnRTY29wZSwgCisJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkTnVsbENoZWNrcyhjdXJyZW50U2NvcGUsCiAJCQkJYWN0aW9uSW5mbyk7CiAJCX0KLQkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkTnVsbENoZWNrcyhjdXJyZW50U2NvcGUsIAorCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWROdWxsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCWFjdGlvbkluZm8pOwogCQlpZiAoaW5jcmVtZW50Q29udGV4dCAhPSBudWxsKSB7Ci0JCQlpbmNyZW1lbnRDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLCAKKwkJCWluY3JlbWVudENvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkTnVsbENoZWNrcyhjdXJyZW50U2NvcGUsCiAJCQkJYWN0aW9uSW5mbyk7CiAJCX0KLQorCQlpZiAobG9vcGluZ0NvbnRleHQuaGFzRXNjYXBpbmdFeGNlcHRpb25zKCkpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTkyNgorCQkJRmxvd0luZm8gbG9vcGJhY2tGbG93SW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKKwkJCWlmICh0aGlzLmNvbnRpbnVlTGFiZWwgIT0gbnVsbCkgeyAgLy8gd2UgZG8gZ2V0IHRvIHRoZSBib3R0b20gCisJCQkJbG9vcGJhY2tGbG93SW5mby5tZXJnZWRXaXRoKGFjdGlvbkluZm8udW5jb25kaXRpb25hbENvcHkoKSk7CisJCQl9CisJCQlsb29waW5nQ29udGV4dC5zaW11bGF0ZVRocm93QWZ0ZXJMb29wQmFjayhsb29wYmFja0Zsb3dJbmZvKTsKKwkJfQogCQkvL2VuZCBvZiBsb29wCiAJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBGbG93SW5mby5tZXJnZWRPcHRpbWl6ZWRCcmFuY2hlcygKIAkJCQkobG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrLnRhZ0JpdHMgJgogCQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCA/CiAJCQkJCWxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhayA6CiAJCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20obG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKSwgLy8gcmVjb3ZlciB1cHN0cmVhbSBudWxsIGluZm8KLQkJCQlpc0NvbmRpdGlvbk9wdGltaXplZFRydWUsIAotCQkJCWV4aXRCcmFuY2gsIAotCQkJCWlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UsIAorCQkJCWlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSwKKwkJCQlleGl0QnJhbmNoLAorCQkJCWlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UsCiAJCQkJIWlzQ29uZGl0aW9uVHJ1ZSAvKmZvcig7Oyl7fXdoaWxlKHRydWUpOyB1bnJlYWNoYWJsZSgpOyAqLyk7Ci0JCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCS8vIFZhcmlhYmxlcyBpbml0aWFsaXplZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0aGUgZm9yIGxvb3AgY2FuIGJlIHJlbW92ZWQgZm9yIGZ1cnRoZXIgZmxvdyBpbmZvCisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTk0OTUKKwkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbml0aWFsaXphdGlvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdGF0ZW1lbnQgaW5pdCA9IHRoaXMuaW5pdGlhbGl6YXRpb25zW2ldOworCQkJCWlmIChpbml0IGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gKChMb2NhbERlY2xhcmF0aW9uKSBpbml0KS5iaW5kaW5nOworCQkJCQltZXJnZWRJbmZvLnJlc2V0QXNzaWdubWVudEluZm8oYmluZGluZyk7CisJCQkJfQorCQkJfQorCQl9CisJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKIAkJcmV0dXJuIG1lcmdlZEluZm87CiAJfQogCkBAIC0yMTcsNjcgKzIzOCw2NyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAKLQkJaWYgKChiaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKwkJaWYgKCh0aGlzLmJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgewogCQkJcmV0dXJuOwogCQl9CiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAKIAkJLy8gZ2VuZXJhdGUgdGhlIGluaXRpYWxpemF0aW9ucwotCQlpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBpbml0aWFsaXphdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpbml0aWFsaXphdGlvbnNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmluaXRpYWxpemF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCXRoaXMuaW5pdGlhbGl6YXRpb25zW2ldLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KIAkJfQogCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbiA9PSBudWxsID8gbnVsbCA6IHRoaXMuY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gbnVsbCAmJiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpOwogCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgewotCQkJY29uZGl0aW9uLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJdGhpcy5jb25kaXRpb24uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwogCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLk5lZWRlZFNjb3BlKSAhPSAwKSB7Ci0JCQkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHNjb3BlKTsKKwkJCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUodGhpcy5zY29wZSk7CiAJCQl9Ci0JCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQotCQkKKwogCQkvLyBsYWJlbCBtYW5hZ2VtZW50CiAJCUJyYW5jaExhYmVsIGFjdGlvbkxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOwogCQlhY3Rpb25MYWJlbC50YWdCaXRzIHw9IEJyYW5jaExhYmVsLlVTRUQ7CiAJCUJyYW5jaExhYmVsIGNvbmRpdGlvbkxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOwotCQlicmVha0xhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CisJCXRoaXMuYnJlYWtMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwogCQlpZiAodGhpcy5jb250aW51ZUxhYmVsID09IG51bGwpIHsKIAkJCWNvbmRpdGlvbkxhYmVsLnBsYWNlKCk7Ci0JCQlpZiAoKGNvbmRpdGlvbiAhPSBudWxsKSAmJiAoY29uZGl0aW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKLQkJCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKHNjb3BlLCBjb2RlU3RyZWFtLCBudWxsLCBicmVha0xhYmVsLCB0cnVlKTsKKwkJCWlmICgodGhpcy5jb25kaXRpb24gIT0gbnVsbCkgJiYgKHRoaXMuY29uZGl0aW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKKwkJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4odGhpcy5zY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgdGhpcy5icmVha0xhYmVsLCB0cnVlKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXRoaXMuY29udGludWVMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwogCQkJLy8ganVtcCBvdmVyIHRoZSBhY3Rpb25CbG9jawotCQkJaWYgKChjb25kaXRpb24gIT0gbnVsbCkKLQkJCQkmJiAoY29uZGl0aW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkKLQkJCQkmJiAhKChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24uaXNFbXB0eUJsb2NrKCkpICYmIChpbmNyZW1lbnRzID09IG51bGwpKSkgeworCQkJaWYgKCh0aGlzLmNvbmRpdGlvbiAhPSBudWxsKQorCQkJCSYmICh0aGlzLmNvbmRpdGlvbi5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJJiYgISgodGhpcy5hY3Rpb24gPT0gbnVsbCB8fCB0aGlzLmFjdGlvbi5pc0VtcHR5QmxvY2soKSkgJiYgKHRoaXMuaW5jcmVtZW50cyA9PSBudWxsKSkpIHsKIAkJCQljb25kaXRpb25MYWJlbC50YWdCaXRzIHw9IEJyYW5jaExhYmVsLlVTRUQ7CiAJCQkJaW50IGp1bXBQQyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCQkJY29kZVN0cmVhbS5nb3RvXyhjb25kaXRpb25MYWJlbCk7Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGp1bXBQQywgY29uZGl0aW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oanVtcFBDLCB0aGlzLmNvbmRpdGlvbi5zb3VyY2VTdGFydCk7CiAJCQl9CiAJCX0KIAogCQkvLyBnZW5lcmF0ZSB0aGUgbG9vcCBhY3Rpb24KLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCWlmICh0aGlzLmFjdGlvbiAhPSBudWxsKSB7CiAJCQkvLyBSZXF1aXJlZCB0byBmaXggMVBSMFhWUzogTEZSRTpXSU5OVCAtIENvbXBpbGVyOiB2YXJpYWJsZSB0YWJsZSBmb3IgbWV0aG9kIGFwcGVhcnMgaW5jb3JyZWN0Ci0JCQlpZiAoY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQlpZiAodGhpcy5jb25kSWZUcnVlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQkvLyBpbnNlcnQgYWxsIGxvY2FscyBpbml0aWFsaXplZCBpbnNpZGUgdGhlIGNvbmRpdGlvbiBpbnRvIHRoZSBhY3Rpb24gZ2VuZXJhdGVkIHByaW9yIHRvIHRoZSBjb25kaXRpb24KIAkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLAotCQkJCQljb25kSWZUcnVlSW5pdFN0YXRlSW5kZXgpOworCQkJCQl0aGlzLmNvbmRJZlRydWVJbml0U3RhdGVJbmRleCk7CiAJCQl9CiAJCQlhY3Rpb25MYWJlbC5wbGFjZSgpOwotCQkJYWN0aW9uLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQl0aGlzLmFjdGlvbi5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSwgY29kZVN0cmVhbSk7CiAJCX0gZWxzZSB7CiAJCQlhY3Rpb25MYWJlbC5wbGFjZSgpOwogCQl9CkBAIC0yODYsNDMgKzMwNyw0MyBAQAogCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZUluY3JlbWVudHNJbml0U3RhdGVJbmRleCk7CiAJCX0KIAkJLy8gY29udGludWF0aW9uIHBvaW50Ci0JCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKLQkJCWNvbnRpbnVlTGFiZWwucGxhY2UoKTsKKwkJaWYgKHRoaXMuY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLmNvbnRpbnVlTGFiZWwucGxhY2UoKTsKIAkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnRzIGZvciBuZXh0IGl0ZXJhdGlvbgotCQkJaWYgKGluY3JlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBpbmNyZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCWluY3JlbWVudHNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCWlmICh0aGlzLmluY3JlbWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmluY3JlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJdGhpcy5pbmNyZW1lbnRzW2ldLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCQl9CiAJCQl9CiAJCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKLQkJCWlmIChwcmVDb25kSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHByZUNvbmRJbml0U3RhdGVJbmRleCk7Ci0JCQl9CQkKKwkJCWlmICh0aGlzLnByZUNvbmRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVDb25kSW5pdFN0YXRlSW5kZXgpOworCQkJfQogCQkJLy8gZ2VuZXJhdGUgdGhlIGNvbmRpdGlvbgogCQkJY29uZGl0aW9uTGFiZWwucGxhY2UoKTsKLQkJCWlmICgoY29uZGl0aW9uICE9IG51bGwpICYmIChjb25kaXRpb24uY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSkgewotCQkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oc2NvcGUsIGNvZGVTdHJlYW0sIGFjdGlvbkxhYmVsLCBudWxsLCB0cnVlKTsKKwkJCWlmICgodGhpcy5jb25kaXRpb24gIT0gbnVsbCkgJiYgKHRoaXMuY29uZGl0aW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKKwkJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4odGhpcy5zY29wZSwgY29kZVN0cmVhbSwgYWN0aW9uTGFiZWwsIG51bGwsIHRydWUpOwogCQkJfSBlbHNlIHsKIAkJCQljb2RlU3RyZWFtLmdvdG9fKGFjdGlvbkxhYmVsKTsKIAkJCX0KLQkJCQorCiAJCX0gZWxzZSB7CiAJCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKLQkJCWlmIChwcmVDb25kSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHByZUNvbmRJbml0U3RhdGVJbmRleCk7CisJCQlpZiAodGhpcy5wcmVDb25kSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMucHJlQ29uZEluaXRTdGF0ZUluZGV4KTsKIAkJCX0KIAkJfQogCiAKIAkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCiAJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5OZWVkZWRTY29wZSkgIT0gMCkgewotCQkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHNjb3BlKTsKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKIAkJfQotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJfQotCQlicmVha0xhYmVsLnBsYWNlKCk7CisJCXRoaXMuYnJlYWtMYWJlbC5wbGFjZSgpOwogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCX0KIApAQCAtMzMwLDMxICszNTEsMzEgQEAKIAogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKCJmb3IgKCIpOyAvLyROT04tTkxTLTEkCiAJCS8vaW5pdHMKLQkJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemF0aW9ucy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluaXRpYWxpemF0aW9ucy5sZW5ndGg7IGkrKykgewogCQkJCS8vbmljZSBvbmx5IHdpdGggZXhwcmVzc2lvbnMKIAkJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbml0aWFsaXphdGlvbnNbaV0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCQl0aGlzLmluaXRpYWxpemF0aW9uc1tpXS5wcmludCgwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCW91dHB1dC5hcHBlbmQoIjsgIik7IC8vJE5PTi1OTFMtMSQKIAkJLy9jb25kCi0JCWlmIChjb25kaXRpb24gIT0gbnVsbCkgY29uZGl0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOworCQlpZiAodGhpcy5jb25kaXRpb24gIT0gbnVsbCkgdGhpcy5jb25kaXRpb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIjsgIik7IC8vJE5PTi1OTFMtMSQKIAkJLy91cGRhdGVzCi0JCWlmIChpbmNyZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jcmVtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5pbmNyZW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbmNyZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKSBvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5jcmVtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpOworCQkJCXRoaXMuaW5jcmVtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpOwogCQkJfQogCQl9CiAJCW91dHB1dC5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKIAkJLy9ibG9jawotCQlpZiAoYWN0aW9uID09IG51bGwpCisJCWlmICh0aGlzLmFjdGlvbiA9PSBudWxsKQogCQkJb3V0cHV0LmFwcGVuZCgnOycpOwogCQllbHNlIHsKIAkJCW91dHB1dC5hcHBlbmQoJ1xuJyk7Ci0JCQlhY3Rpb24ucHJpbnRTdGF0ZW1lbnQodGFiICsgMSwgb3V0cHV0KTsKKwkJCXRoaXMuYWN0aW9uLnByaW50U3RhdGVtZW50KHRhYiArIDEsIG91dHB1dCk7CiAJCX0KIAkJcmV0dXJuIG91dHB1dDsKIAl9CkBAIC0zNjIsNDMgKzM4Myw0MyBAQAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSB1cHBlclNjb3BlKSB7CiAKIAkJLy8gdXNlIHRoZSBzY29wZSB0aGF0IHdpbGwgaG9sZCB0aGUgaW5pdCBkZWNsYXJhdGlvbnMKLQkJc2NvcGUgPSAodGhpcy5iaXRzICYgQVNUTm9kZS5OZWVkZWRTY29wZSkgIT0gMCA/IG5ldyBCbG9ja1Njb3BlKHVwcGVyU2NvcGUpIDogdXBwZXJTY29wZTsKLQkJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluaXRpYWxpemF0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlpbml0aWFsaXphdGlvbnNbaV0ucmVzb2x2ZShzY29wZSk7Ci0JCWlmIChjb25kaXRpb24gIT0gbnVsbCkgewotCQkJVHlwZUJpbmRpbmcgdHlwZSA9IGNvbmRpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgVHlwZUJpbmRpbmcuQk9PTEVBTik7Ci0JCQljb25kaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHR5cGUsIHR5cGUpOworCQl0aGlzLnNjb3BlID0gKHRoaXMuYml0cyAmIEFTVE5vZGUuTmVlZGVkU2NvcGUpICE9IDAgPyBuZXcgQmxvY2tTY29wZSh1cHBlclNjb3BlKSA6IHVwcGVyU2NvcGU7CisJCWlmICh0aGlzLmluaXRpYWxpemF0aW9ucyAhPSBudWxsKQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCXRoaXMuaW5pdGlhbGl6YXRpb25zW2ldLnJlc29sdmUodGhpcy5zY29wZSk7CisJCWlmICh0aGlzLmNvbmRpdGlvbiAhPSBudWxsKSB7CisJCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5jb25kaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3RpbmcodGhpcy5zY29wZSwgVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJCQl0aGlzLmNvbmRpdGlvbi5jb21wdXRlQ29udmVyc2lvbih0aGlzLnNjb3BlLCB0eXBlLCB0eXBlKTsKIAkJfQotCQlpZiAoaW5jcmVtZW50cyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluY3JlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJaW5jcmVtZW50c1tpXS5yZXNvbHZlKHNjb3BlKTsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJYWN0aW9uLnJlc29sdmUoc2NvcGUpOworCQlpZiAodGhpcy5pbmNyZW1lbnRzICE9IG51bGwpCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5pbmNyZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCXRoaXMuaW5jcmVtZW50c1tpXS5yZXNvbHZlKHRoaXMuc2NvcGUpOworCQlpZiAodGhpcy5hY3Rpb24gIT0gbnVsbCkKKwkJCXRoaXMuYWN0aW9uLnJlc29sdmUodGhpcy5zY29wZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoCiAJCUFTVFZpc2l0b3IgdmlzaXRvciwKIAkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKLQkJCWlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgewotCQkJCWludCBpbml0aWFsaXphdGlvbnNMZW5ndGggPSBpbml0aWFsaXphdGlvbnMubGVuZ3RoOworCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCQlpbnQgaW5pdGlhbGl6YXRpb25zTGVuZ3RoID0gdGhpcy5pbml0aWFsaXphdGlvbnMubGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25zTGVuZ3RoOyBpKyspCi0JCQkJCWluaXRpYWxpemF0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCQkJfQogCi0JCQlpZiAoY29uZGl0aW9uICE9IG51bGwpCi0JCQkJY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWlmICh0aGlzLmNvbmRpdGlvbiAhPSBudWxsKQorCQkJCXRoaXMuY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCi0JCQlpZiAoaW5jcmVtZW50cyAhPSBudWxsKSB7Ci0JCQkJaW50IGluY3JlbWVudHNMZW5ndGggPSBpbmNyZW1lbnRzLmxlbmd0aDsKKwkJCWlmICh0aGlzLmluY3JlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBpbmNyZW1lbnRzTGVuZ3RoID0gdGhpcy5pbmNyZW1lbnRzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY3JlbWVudHNMZW5ndGg7IGkrKykKLQkJCQkJaW5jcmVtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCXRoaXMuaW5jcmVtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KIAotCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJCWFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAodGhpcy5hY3Rpb24gIT0gbnVsbCkKKwkJCQl0aGlzLmFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yZWFjaFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JlYWNoU3RhdGVtZW50LmphdmEKaW5kZXggNWUzMDI0ZC4uMjhiZTNjNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JlYWNoU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JlYWNoU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsOCArMTIsOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkJyYW5jaExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuTG9vcGluZ0Zsb3dDb250ZXh0OwpAQCAtMjMsMTggKzIzLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhcmFtZXRlcml6ZWRUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIAogcHVibGljIGNsYXNzIEZvcmVhY2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotICAgIAorCiAJcHVibGljIExvY2FsRGVjbGFyYXRpb24gZWxlbWVudFZhcmlhYmxlOwotCXB1YmxpYyBpbnQgZWxlbWVudFZhcmlhYmxlSW1wbGljaXRXaWRlbmluZyA9IC0xOyAKKwlwdWJsaWMgaW50IGVsZW1lbnRWYXJpYWJsZUltcGxpY2l0V2lkZW5pbmcgPSAtMTsKIAlwdWJsaWMgRXhwcmVzc2lvbiBjb2xsZWN0aW9uOwogCXB1YmxpYyBTdGF0ZW1lbnQgYWN0aW9uOwotCQorCiAJLy8gc2V0IHRoZSBraW5kIG9mIGZvcmVhY2gKIAlwcml2YXRlIGludCBraW5kOwogCS8vIHBvc3NpYmxlIGtpbmRzIG9mIGl0ZXJhdGluZyBiZWhhdmlvcgpAQCAtNDgsNyArNDcsNyBAQAogCS8vIGxvb3AgbGFiZWxzCiAJcHJpdmF0ZSBCcmFuY2hMYWJlbCBicmVha0xhYmVsOwogCXByaXZhdGUgQnJhbmNoTGFiZWwgY29udGludWVMYWJlbDsKLQkKKwogCXB1YmxpYyBCbG9ja1Njb3BlIHNjb3BlOwogCiAJLy8gc2VjcmV0IHZhcmlhYmxlcyBmb3IgY29kZWdlbgpAQCAtNTYsMTMgKzU1LDE0IEBACiAJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGNvbGxlY3Rpb25WYXJpYWJsZTsJLy8gdG8gc3RvcmUgdGhlIGNvbGxlY3Rpb24gZXhwcmVzc2lvbiB2YWx1ZQogCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBtYXhWYXJpYWJsZTsKIAkvLyBzZWNyZXQgdmFyaWFibGUgbmFtZXMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU2VjcmV0SXRlcmF0b3JWYXJpYWJsZU5hbWUgPSAiIGl0ZXJhdG9yIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNlY3JldEluZGV4VmFyaWFibGVOYW1lID0gIiBpbmRleCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTZWNyZXRDb2xsZWN0aW9uVmFyaWFibGVOYW1lID0gIiBjb2xsZWN0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNlY3JldE1heFZhcmlhYmxlTmFtZSA9ICIgbWF4Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCisKIAlpbnQgcG9zdENvbGxlY3Rpb25Jbml0U3RhdGVJbmRleCA9IC0xOwogCWludCBtZXJnZWRJbml0U3RhdGVJbmRleCA9IC0xOwotCQorCiAJcHVibGljIEZvcmVhY2hTdGF0ZW1lbnQoCiAJCUxvY2FsRGVjbGFyYXRpb24gZWxlbWVudFZhcmlhYmxlLAogCQlpbnQgc3RhcnQpIHsKQEAgLTcyLDY3ICs3Miw2MyBAQAogCQl0aGlzLmtpbmQgPSAtMTsKIAl9CiAKLQlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKLQkJRmxvd0luZm8gZmxvd0luZm8pIHsKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCQkvLyBpbml0aWFsaXplIGJyZWFrIGFuZCBjb250aW51ZSBsYWJlbHMKLQkJYnJlYWtMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpOwotCQljb250aW51ZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKCk7CisJCXRoaXMuYnJlYWtMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpOworCQl0aGlzLmNvbnRpbnVlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKTsKKwkJaW50IGluaXRpYWxDb21wbGFpbnRMZXZlbCA9IChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwID8gU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEUgOiBTdGF0ZW1lbnQuTk9UX0NPTVBMQUlORUQ7CiAKIAkJLy8gcHJvY2VzcyB0aGUgZWxlbWVudCB2YXJpYWJsZSBhbmQgY29sbGVjdGlvbgogCQl0aGlzLmNvbGxlY3Rpb24uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwotCQlmbG93SW5mbyA9IHRoaXMuZWxlbWVudFZhcmlhYmxlLmFuYWx5c2VDb2RlKHNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwotCQlGbG93SW5mbyBjb25kSW5mbyA9IHRoaXMuY29sbGVjdGlvbi5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLmNvcHkoKSk7CisJCWZsb3dJbmZvID0gdGhpcy5lbGVtZW50VmFyaWFibGUuYW5hbHlzZUNvZGUodGhpcy5zY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsJCQorCQlGbG93SW5mbyBjb25kSW5mbyA9IHRoaXMuY29sbGVjdGlvbi5hbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8uY29weSgpKTsKIAogCQkvLyBlbGVtZW50IHZhcmlhYmxlIHdpbGwgYmUgYXNzaWduZWQgd2hlbiBpdGVyYXRpbmcKIAkJY29uZEluZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKHRoaXMuZWxlbWVudFZhcmlhYmxlLmJpbmRpbmcpOwogCiAJCXRoaXMucG9zdENvbGxlY3Rpb25Jbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGNvbmRJbmZvKTsKLQkJCisKIAkJLy8gcHJvY2VzcyB0aGUgYWN0aW9uCi0JCUxvb3BpbmdGbG93Q29udGV4dCBsb29waW5nQ29udGV4dCA9IAotCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIGJyZWFrTGFiZWwsIAotCQkJCWNvbnRpbnVlTGFiZWwsIHNjb3BlKTsKLQkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGFjdGlvbkluZm8gPSAKKwkJTG9vcGluZ0Zsb3dDb250ZXh0IGxvb3BpbmdDb250ZXh0ID0KKwkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCB0aGlzLmJyZWFrTGFiZWwsCisJCQkJdGhpcy5jb250aW51ZUxhYmVsLCB0aGlzLnNjb3BlKTsKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGFjdGlvbkluZm8gPQogCQkJY29uZEluZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKTsKIAkJYWN0aW9uSW5mby5tYXJrQXNEZWZpbml0ZWx5VW5rbm93bih0aGlzLmVsZW1lbnRWYXJpYWJsZS5iaW5kaW5nKTsKIAkJRmxvd0luZm8gZXhpdEJyYW5jaDsKLQkJaWYgKCEoYWN0aW9uID09IG51bGwgfHwgKGFjdGlvbi5pc0VtcHR5QmxvY2soKSAKLQkJICAgICAgICAJJiYgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zKSkpIHsKKwkJaWYgKCEodGhpcy5hY3Rpb24gPT0gbnVsbCB8fCAodGhpcy5hY3Rpb24uaXNFbXB0eUJsb2NrKCkKKwkJCQkmJiBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMpKSkgewogCi0JCQlpZiAoIXRoaXMuYWN0aW9uLmNvbXBsYWluSWZVbnJlYWNoYWJsZShhY3Rpb25JbmZvLCBzY29wZSwgZmFsc2UpKSB7Ci0JCQkJYWN0aW9uSW5mbyA9IGFjdGlvbi4KLQkJCQkJYW5hbHlzZUNvZGUoc2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKS4KLQkJCQkJdW5jb25kaXRpb25hbENvcHkoKTsKKwkJCWlmICh0aGlzLmFjdGlvbi5jb21wbGFpbklmVW5yZWFjaGFibGUoYWN0aW9uSW5mbywgdGhpcy5zY29wZSwgaW5pdGlhbENvbXBsYWludExldmVsKSA8IFN0YXRlbWVudC5DT01QTEFJTkVEX1VOUkVBQ0hBQkxFKSB7CisJCQkJYWN0aW9uSW5mbyA9IHRoaXMuYWN0aW9uLmFuYWx5c2VDb2RlKHRoaXMuc2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKS51bmNvbmRpdGlvbmFsQ29weSgpOwogCQkJfQogCiAJCQkvLyBjb2RlIGdlbmVyYXRpb24gY2FuIGJlIG9wdGltaXplZCB3aGVuIG5vIG5lZWQgdG8gY29udGludWUgaW4gdGhlIGxvb3AKIAkJCWV4aXRCcmFuY2ggPSBmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpLgotCQkJCWFkZEluaXRpYWxpemF0aW9uc0Zyb20oY29uZEluZm8uaW5pdHNXaGVuRmFsc2UoKSk7IAotCQkJLy8gVE9ETyAobWF4aW1lKSBubyBuZWVkIHRvIHRlc3Qgd2hlbiBmYWxzZTogY2FuIG9wdGltaXplIChzYW1lIGZvciBhY3Rpb24gYmVpbmcgdW5yZWFjaGFibGUgYWJvdmUpIAorCQkJCQlhZGROdWxsSW5mb0Zyb20oY29uZEluZm8uaW5pdHNXaGVuRmFsc2UoKSk7CisJCQkvLyBUT0RPIChtYXhpbWUpIG5vIG5lZWQgdG8gdGVzdCB3aGVuIGZhbHNlOiBjYW4gb3B0aW1pemUgKHNhbWUgZm9yIGFjdGlvbiBiZWluZyB1bnJlYWNoYWJsZSBhYm92ZSkKIAkJCWlmICgoYWN0aW9uSW5mby50YWdCaXRzICYgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHMgJgotCQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgewotCQkJCWNvbnRpbnVlTGFiZWwgPSBudWxsOworCQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSB7CisJCQkJdGhpcy5jb250aW51ZUxhYmVsID0gbnVsbDsKIAkJCX0gZWxzZSB7CiAJCQkJYWN0aW9uSW5mbyA9IGFjdGlvbkluZm8ubWVyZ2VkV2l0aChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUpOwotCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKHNjb3BlLCBhY3Rpb25JbmZvKTsKKwkJCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyh0aGlzLnNjb3BlLCBhY3Rpb25JbmZvKTsKIAkJCQlleGl0QnJhbmNoLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oYWN0aW9uSW5mbyk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlleGl0QnJhbmNoID0gY29uZEluZm8uaW5pdHNXaGVuRmFsc2UoKTsKIAkJfQogCi0JCS8vIHdlIG5lZWQgdGhlIHZhcmlhYmxlIHRvIGl0ZXJhdGUgdGhlIGNvbGxlY3Rpb24gZXZlbiBpZiB0aGUgCisJCS8vIHdlIG5lZWQgdGhlIHZhcmlhYmxlIHRvIGl0ZXJhdGUgdGhlIGNvbGxlY3Rpb24gZXZlbiBpZiB0aGUKIAkJLy8gZWxlbWVudCB2YXJpYWJsZSBpcyBub3QgdXNlZAogCQlmaW5hbCBib29sZWFuIGhhc0VtcHR5QWN0aW9uID0gdGhpcy5hY3Rpb24gPT0gbnVsbAotCQkJCXx8IHRoaXMuYWN0aW9uLmlzRW1wdHlCbG9jaygpCi0JCQkJfHwgKCh0aGlzLmFjdGlvbi5iaXRzICYgSXNVc2VmdWxFbXB0eVN0YXRlbWVudCkgIT0gMCk7CisJCXx8IHRoaXMuYWN0aW9uLmlzRW1wdHlCbG9jaygpCisJCXx8ICgodGhpcy5hY3Rpb24uYml0cyAmIElzVXNlZnVsRW1wdHlTdGF0ZW1lbnQpICE9IDApOwogCiAJCXN3aXRjaCh0aGlzLmtpbmQpIHsKIAkJCWNhc2UgQVJSQVkgOgogCQkJCWlmICghaGFzRW1wdHlBY3Rpb24KLQkJCQkJCXx8IHRoaXMuZWxlbWVudFZhcmlhYmxlLmJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgewkJCQkKKwkJCQkJCXx8IHRoaXMuZWxlbWVudFZhcmlhYmxlLmJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgewogCQkJCQl0aGlzLmNvbGxlY3Rpb25WYXJpYWJsZS51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKIAkJCQkJaWYgKHRoaXMuY29udGludWVMYWJlbCAhPSBudWxsKSB7CiAJCQkJCQl0aGlzLmluZGV4VmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CkBAIC0xNTAsMTQgKzE0NiwxNCBAQAogCiAJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBGbG93SW5mby5tZXJnZWRPcHRpbWl6ZWRCcmFuY2hlcygKIAkJCQkobG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrLnRhZ0JpdHMgJgotCQkJCQlGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCA/Ci0JCQkJCWxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhayA6Ci0JCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20obG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKSwgLy8gcmVjb3ZlciB1cHN0cmVhbSBudWxsIGluZm8KLQkJCQlmYWxzZSwgCi0JCQkJZXhpdEJyYW5jaCwgCi0JCQkJZmFsc2UsIAotCQkJCXRydWUgLypmb3IoOzspe313aGlsZSh0cnVlKTsgdW5yZWFjaGFibGUoKTsgKi8pOwotCQltZXJnZWRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQkJCQkJRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDAgPworCQkJCQkJCQlsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWsgOgorCQkJCQkJCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbShsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWspLCAvLyByZWNvdmVyIHVwc3RyZWFtIG51bGwgaW5mbworCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQlleGl0QnJhbmNoLAorCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQl0cnVlIC8qZm9yKDs7KXt9d2hpbGUodHJ1ZSk7IHVucmVhY2hhYmxlKCk7ICovKTsKKwkJdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOwogCQlyZXR1cm4gbWVyZ2VkSW5mbzsKIAl9CiAKQEAgLTE2OCw4ICsxNjQsOCBAQAogCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCSAgICAKLQkJaWYgKChiaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKworCQlpZiAoKHRoaXMuYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CiAJCQlyZXR1cm47CiAJCX0KIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKQEAgLTE4MCwxMSArMTc2LDExIEBACiAJCWlmIChoYXNFbXB0eUFjdGlvbgogCQkJCSYmIHRoaXMuZWxlbWVudFZhcmlhYmxlLmJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9PSAtMQogCQkJCSYmIHRoaXMua2luZCA9PSBBUlJBWSkgewotCQkJY29sbGVjdGlvbi5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKLQkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZShzY29wZSk7Ci0JCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsJCQkJCisJCQl0aGlzLmNvbGxlY3Rpb24uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKKwkJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJCXJldHVybjsKQEAgLTE5MywzNiArMTg5LDI4IEBACiAJCS8vIGdlbmVyYXRlIHRoZSBpbml0aWFsaXphdGlvbnMKIAkJc3dpdGNoKHRoaXMua2luZCkgewogCQkJY2FzZSBBUlJBWSA6Ci0JCQkJY29sbGVjdGlvbi5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5jb2xsZWN0aW9uVmFyaWFibGUsIHRydWUpOyAKKwkJCQl0aGlzLmNvbGxlY3Rpb24uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5jb2xsZWN0aW9uVmFyaWFibGUsIHRydWUpOworCQkJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5jb2xsZWN0aW9uVmFyaWFibGUpOwogCQkJCWlmICh0aGlzLmNvbnRpbnVlTGFiZWwgIT0gbnVsbCkgewogCQkJCQkvLyBpbnQgbGVuZ3RoID0gKGNvbGxlY3Rpb25WYXJpYWJsZSA9IFtjb2xsZWN0aW9uXSkubGVuZ3RoOwogCQkJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CiAJCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5tYXhWYXJpYWJsZSwgZmFsc2UpOworCQkJCQljb2RlU3RyZWFtLmFkZFZhcmlhYmxlKHRoaXMubWF4VmFyaWFibGUpOwogCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CiAJCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5pbmRleFZhcmlhYmxlLCBmYWxzZSk7CisJCQkJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5pbmRleFZhcmlhYmxlKTsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyBsZWF2ZSBjb2xsZWN0aW9uVmFyaWFibGUgb24gZXhlY3V0aW9uIHN0YWNrICh3aWxsIGJlIGNvbnN1bWVkIHdoZW4gc3dhcHBpbmcgY29uZGl0aW9uIGZ1cnRoZXIgZG93bikKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFJBV19JVEVSQUJMRSA6CiAJCQljYXNlIEdFTkVSSUNfSVRFUkFCTEUgOgotCQkJCWNvbGxlY3Rpb24uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQl0aGlzLmNvbGxlY3Rpb24uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQkJCS8vIGRlY2xhcmluZ0NsYXNzLml0ZXJhdG9yKCk7Ci0JCQkJTWV0aG9kQmluZGluZyBpdGVyYXRvck1ldGhvZEJpbmRpbmcgPQotCQkJCQluZXcgTWV0aG9kQmluZGluZygKLQkJCQkJCQlDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljLAotCQkJCQkJCSJpdGVyYXRvciIudG9DaGFyQXJyYXkoKSwvLyROT04tTkxTLTEkCi0JCQkJCQkJc2NvcGUuZ2V0SmF2YVV0aWxJdGVyYXRvcigpLAotCQkJCQkJCUJpbmRpbmcuTk9fUEFSQU1FVEVSUywKLQkJCQkJCQlCaW5kaW5nLk5PX0VYQ0VQVElPTlMsCi0JCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuaXRlcmF0b3JSZWNlaXZlclR5cGUuZXJhc3VyZSgpKTsKLQkJCQlpZiAodGhpcy5pdGVyYXRvclJlY2VpdmVyVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCWNvZGVTdHJlYW0uaW52b2tlaW50ZXJmYWNlKGl0ZXJhdG9yTWV0aG9kQmluZGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29kZVN0cmVhbS5pbnZva2V2aXJ0dWFsKGl0ZXJhdG9yTWV0aG9kQmluZGluZyk7Ci0JCQkJfQorCQkJCWNvZGVTdHJlYW0uaW52b2tlSXRlcmFibGVJdGVyYXRvcih0aGlzLml0ZXJhdG9yUmVjZWl2ZXJUeXBlKTsKIAkJCQljb2RlU3RyZWFtLnN0b3JlKHRoaXMuaW5kZXhWYXJpYWJsZSwgZmFsc2UpOworCQkJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5pbmRleFZhcmlhYmxlKTsKIAkJCQlicmVhazsKIAkJfQogCQkvLyBsYWJlbCBtYW5hZ2VtZW50CkBAIC0yMzAsNyArMjE4LDcgQEAKIAkJYWN0aW9uTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwogCQlCcmFuY2hMYWJlbCBjb25kaXRpb25MYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKIAkJY29uZGl0aW9uTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwotCQlicmVha0xhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CisJCXRoaXMuYnJlYWtMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwogCQlpZiAodGhpcy5jb250aW51ZUxhYmVsID09IG51bGwpIHsKIAkJCS8vIGdlbmVyYXRlIHRoZSBjb25kaXRpb24gKHN3YXBwZWQgZm9yIG9wdGltaXppbmcpCiAJCQljb25kaXRpb25MYWJlbC5wbGFjZSgpOwpAQCAtMjM5LDE3ICsyMjcsMTcgQEAKIAkJCQljYXNlIEFSUkFZIDoKIAkJCQkJLy8gaW5saW5lIHRoZSBhcnJheWxlbmd0aCBjYWxsCiAJCQkJCS8vIGNvbGxlY3Rpb25WYXJpYWJsZSBpcyBhbHJlYWR5IG9uIGV4ZWN1dGlvbiBzdGFjawotCQkJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CQkJCQkKLQkJCQkJY29kZVN0cmVhbS5pZmVxKGJyZWFrTGFiZWwpOworCQkJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CisJCQkJCWNvZGVTdHJlYW0uaWZlcSh0aGlzLmJyZWFrTGFiZWwpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFJBV19JVEVSQUJMRSA6CiAJCQkJY2FzZSBHRU5FUklDX0lURVJBQkxFIDoKIAkJCQkJY29kZVN0cmVhbS5sb2FkKHRoaXMuaW5kZXhWYXJpYWJsZSk7CiAJCQkJCWNvZGVTdHJlYW0uaW52b2tlSmF2YVV0aWxJdGVyYXRvckhhc05leHQoKTsKLQkJCQkJY29kZVN0cmVhbS5pZmVxKGJyZWFrTGFiZWwpOworCQkJCQljb2RlU3RyZWFtLmlmZXEodGhpcy5icmVha0xhYmVsKTsKIAkJCQkJYnJlYWs7CiAJCQl9Ci0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oY29uZGl0aW9uUEMsIHRoaXMuZWxlbWVudFZhcmlhYmxlLnNvdXJjZVN0YXJ0KTsJCQkKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShjb25kaXRpb25QQywgdGhpcy5lbGVtZW50VmFyaWFibGUuc291cmNlU3RhcnQpOwogCQl9IGVsc2UgewogCQkJdGhpcy5jb250aW51ZUxhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CiAJCQl0aGlzLmNvbnRpbnVlTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwpAQCAtMzEwLDcgKzI5OCw3IEBACiAJCX0KIAogCQlpZiAoIWhhc0VtcHR5QWN0aW9uKSB7Ci0JCQl0aGlzLmFjdGlvbi5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQkJdGhpcy5hY3Rpb24uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0pOwogCQl9CiAJCWNvZGVTdHJlYW0ucmVtb3ZlVmFyaWFibGUodGhpcy5lbGVtZW50VmFyaWFibGUuYmluZGluZyk7CiAJCWlmICh0aGlzLnBvc3RDb2xsZWN0aW9uSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKQEAgLTM0MywyMSArMzMxLDM3IEBACiAJCQl9CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oY29udGludWF0aW9uUEMsIHRoaXMuZWxlbWVudFZhcmlhYmxlLnNvdXJjZVN0YXJ0KTsKIAkJfQotCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUoc2NvcGUpOwotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CQkJCisJCXN3aXRjaCh0aGlzLmtpbmQpIHsKKwkJCWNhc2UgQVJSQVkgOgorCQkJCWNvZGVTdHJlYW0ucmVtb3ZlVmFyaWFibGUodGhpcy5pbmRleFZhcmlhYmxlKTsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZVZhcmlhYmxlKHRoaXMubWF4VmFyaWFibGUpOworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlVmFyaWFibGUodGhpcy5jb2xsZWN0aW9uVmFyaWFibGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBSQVdfSVRFUkFCTEUgOgorCQkJY2FzZSBHRU5FUklDX0lURVJBQkxFIDoKKwkJCQkvLyBnZW5lcmF0ZSB0aGUgY29uZGl0aW9uCisJCQkJY29kZVN0cmVhbS5yZW1vdmVWYXJpYWJsZSh0aGlzLmluZGV4VmFyaWFibGUpOworCQkJCWJyZWFrOwogCQl9Ci0JCWJyZWFrTGFiZWwucGxhY2UoKTsKKwkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHRoaXMuc2NvcGUpOworCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCX0KKwkJdGhpcy5icmVha0xhYmVsLnBsYWNlKCk7CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAKIAkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiZm9yICgiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmVsZW1lbnRWYXJpYWJsZS5wcmludEFzRXhwcmVzc2lvbigwLCBvdXRwdXQpOyAKKwkJdGhpcy5lbGVtZW50VmFyaWFibGUucHJpbnRBc0V4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAkJb3V0cHV0LmFwcGVuZCgiIDogIik7Ly8kTk9OLU5MUy0xJAotCQl0aGlzLmNvbGxlY3Rpb24ucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRoaXMuY29sbGVjdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmNvbGxlY3Rpb24ucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCW91dHB1dC5hcHBlbmQoJyknKTsKKwkJfQogCQkvL2Jsb2NrCiAJCWlmICh0aGlzLmFjdGlvbiA9PSBudWxsKSB7CiAJCQlvdXRwdXQuYXBwZW5kKCc7Jyk7CkBAIC0zNzAsOTEgKzM3NCwxMDcgQEAKIAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSB1cHBlclNjb3BlKSB7CiAJCS8vIHVzZSB0aGUgc2NvcGUgdGhhdCB3aWxsIGhvbGQgdGhlIGluaXQgZGVjbGFyYXRpb25zCi0JCXNjb3BlID0gbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSk7Ci0JCXRoaXMuZWxlbWVudFZhcmlhYmxlLnJlc29sdmUoc2NvcGUpOyAvLyBjb2xsZWN0aW9uIGV4cHJlc3Npb24gY2FuIHNlZSBpdGVtVmFyaWFibGUKKwkJdGhpcy5zY29wZSA9IG5ldyBCbG9ja1Njb3BlKHVwcGVyU2NvcGUpOworCQl0aGlzLmVsZW1lbnRWYXJpYWJsZS5yZXNvbHZlKHRoaXMuc2NvcGUpOyAvLyBjb2xsZWN0aW9uIGV4cHJlc3Npb24gY2FuIHNlZSBpdGVtVmFyaWFibGUKIAkJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGUgPSB0aGlzLmVsZW1lbnRWYXJpYWJsZS50eXBlLnJlc29sdmVkVHlwZTsKLQkJVHlwZUJpbmRpbmcgY29sbGVjdGlvblR5cGUgPSB0aGlzLmNvbGxlY3Rpb24gPT0gbnVsbCA/IG51bGwgOiB0aGlzLmNvbGxlY3Rpb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlUeXBlQmluZGluZyBjb2xsZWN0aW9uVHlwZSA9IHRoaXMuY29sbGVjdGlvbiA9PSBudWxsID8gbnVsbCA6IHRoaXMuY29sbGVjdGlvbi5yZXNvbHZlVHlwZSh0aGlzLnNjb3BlKTsKIAorCQlUeXBlQmluZGluZyBleHBlY3RlZENvbGxlY3Rpb25UeXBlID0gbnVsbDsKIAkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwgJiYgY29sbGVjdGlvblR5cGUgIT0gbnVsbCkgeworCQkJYm9vbGVhbiBpc1RhcmdldEpzcjE0ID0gdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS50YXJnZXRKREsgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKIAkJCWlmIChjb2xsZWN0aW9uVHlwZS5pc0FycmF5VHlwZSgpKSB7IC8vIGZvcihFIGUgOiBFW10pCiAJCQkJdGhpcy5raW5kID0gQVJSQVk7Ci0JCQkJdGhpcy5jb2xsZWN0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLGNvbGxlY3Rpb25UeXBlLCBjb2xsZWN0aW9uVHlwZSk7CiAJCQkJdGhpcy5jb2xsZWN0aW9uRWxlbWVudFR5cGUgPSAoKEFycmF5QmluZGluZykgY29sbGVjdGlvblR5cGUpLmVsZW1lbnRzVHlwZSgpOwotCQkJCWlmICghY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgoZWxlbWVudFR5cGUpCi0JCQkJCQkmJiAhc2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aChjb2xsZWN0aW9uRWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKSkgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub3RDb21wYXRpYmxlVHlwZXNFcnJvckluRm9yZWFjaChjb2xsZWN0aW9uLCBjb2xsZWN0aW9uRWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKTsKKwkJCQlpZiAoIXRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgoZWxlbWVudFR5cGUpCisJCQkJCQkmJiAhdGhpcy5zY29wZS5pc0JveGluZ0NvbXBhdGlibGVXaXRoKHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpIHsKKwkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub3RDb21wYXRpYmxlVHlwZXNFcnJvckluRm9yZWFjaCh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSk7CisJCQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZS5uZWVkc1VuY2hlY2tlZENvbnZlcnNpb24oZWxlbWVudFR5cGUpKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEwODUKKwkJCQkgICAgdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVUeXBlQ29udmVyc2lvbih0aGlzLmNvbGxlY3Rpb24sIGNvbGxlY3Rpb25UeXBlLCB1cHBlclNjb3BlLmNyZWF0ZUFycmF5VHlwZShlbGVtZW50VHlwZSwgMSkpOwogCQkJCX0KIAkJCQkvLyBpbiBjYXNlIHdlIG5lZWQgdG8gZG8gYSBjb252ZXJzaW9uCi0JCQkJaW50IGNvbXBpbGVUaW1lVHlwZUlEID0gY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlkOworCQkJCWludCBjb21waWxlVGltZVR5cGVJRCA9IHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlkOwogCQkJCWlmIChlbGVtZW50VHlwZS5pc0Jhc2VUeXBlKCkpIHsKLQkJCQkJaWYgKCFjb2xsZWN0aW9uRWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJCQljb21waWxlVGltZVR5cGVJRCA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29sbGVjdGlvbkVsZW1lbnRUeXBlKS5pZDsKKwkJCQkJdGhpcy5jb2xsZWN0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHRoaXMuc2NvcGUsIGNvbGxlY3Rpb25UeXBlLCBjb2xsZWN0aW9uVHlwZSk7CisJCQkJCWlmICghdGhpcy5jb2xsZWN0aW9uRWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCQkJCQljb21waWxlVGltZVR5cGVJRCA9IHRoaXMuc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZSh0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSkuaWQ7CiAJCQkJCQl0aGlzLmVsZW1lbnRWYXJpYWJsZUltcGxpY2l0V2lkZW5pbmcgPSBVTkJPWElORzsKIAkJCQkJCWlmIChlbGVtZW50VHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJCQkJCQl0aGlzLmVsZW1lbnRWYXJpYWJsZUltcGxpY2l0V2lkZW5pbmcgfD0gKGVsZW1lbnRUeXBlLmlkIDw8IDQpICsgY29tcGlsZVRpbWVUeXBlSUQ7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXV0b2JveGluZyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uRWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKTsKKwkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmF1dG9ib3hpbmcodGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhpcy5lbGVtZW50VmFyaWFibGVJbXBsaWNpdFdpZGVuaW5nID0gKGVsZW1lbnRUeXBlLmlkIDw8IDQpICsgY29tcGlsZVRpbWVUeXBlSUQ7CiAJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJCQl0aGlzLmNvbGxlY3Rpb24uY29tcHV0ZUNvbnZlcnNpb24odGhpcy5zY29wZSwgY29sbGVjdGlvblR5cGUsIGNvbGxlY3Rpb25UeXBlKTsKKwkJCQkJaW50IGJveGVkSUQgPSB0aGlzLnNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUodGhpcy5jb2xsZWN0aW9uRWxlbWVudFR5cGUpLmlkOworCQkJCQl0aGlzLmVsZW1lbnRWYXJpYWJsZUltcGxpY2l0V2lkZW5pbmcgPSBCT1hJTkcgfCAoY29tcGlsZVRpbWVUeXBlSUQgPDwgNCkgfCBjb21waWxlVGltZVR5cGVJRDsgLy8gdXNlIHByaW1pdGl2ZSB0eXBlIGluIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCQkJY29tcGlsZVRpbWVUeXBlSUQgPSBib3hlZElEOworCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmF1dG9ib3hpbmcodGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjb2xsZWN0aW9uRWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJCQlpbnQgYm94ZWRJRCA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29sbGVjdGlvbkVsZW1lbnRUeXBlKS5pZDsKLQkJCQkJCXRoaXMuZWxlbWVudFZhcmlhYmxlSW1wbGljaXRXaWRlbmluZyA9IEJPWElORyB8IChjb21waWxlVGltZVR5cGVJRCA8PCA0KSB8IGNvbXBpbGVUaW1lVHlwZUlEOyAvLyB1c2UgcHJpbWl0aXZlIHR5cGUgaW4gaW1wbGljaXQgY29udmVyc2lvbgotCQkJCQkJY29tcGlsZVRpbWVUeXBlSUQgPSBib3hlZElEOwotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXV0b2JveGluZyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uRWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKTsKLQkJCQkJfQorCQkJCQlleHBlY3RlZENvbGxlY3Rpb25UeXBlID0gdXBwZXJTY29wZS5jcmVhdGVBcnJheVR5cGUoZWxlbWVudFR5cGUsIDEpOworCQkJCQl0aGlzLmNvbGxlY3Rpb24uY29tcHV0ZUNvbnZlcnNpb24odGhpcy5zY29wZSwgZXhwZWN0ZWRDb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoY29sbGVjdGlvblR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkgICAgUmVmZXJlbmNlQmluZGluZyBpdGVyYWJsZVR5cGUgPSAoKFJlZmVyZW5jZUJpbmRpbmcpY29sbGVjdGlvblR5cGUpLmZpbmRTdXBlclR5cGVFcmFzaW5nVG8oVF9KYXZhTGFuZ0l0ZXJhYmxlLCBmYWxzZSAvKkl0ZXJhYmxlIGlzIG5vdCBhIGNsYXNzKi8pOwotCQkJICAgIGNoZWNrSXRlcmFibGU6IHsKLQkJCSAgICAJaWYgKGl0ZXJhYmxlVHlwZSA9PSBudWxsKSBicmVhayBjaGVja0l0ZXJhYmxlOwotCQkJICAgIAkKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGl0ZXJhYmxlVHlwZSA9ICgoUmVmZXJlbmNlQmluZGluZyljb2xsZWN0aW9uVHlwZSkuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShUX0phdmFMYW5nSXRlcmFibGUsIGZhbHNlIC8qSXRlcmFibGUgaXMgbm90IGEgY2xhc3MqLyk7CisJCQkJaWYgKGl0ZXJhYmxlVHlwZSA9PSBudWxsICYmIGlzVGFyZ2V0SnNyMTQpIHsKKwkJCQkJaXRlcmFibGVUeXBlID0gKChSZWZlcmVuY2VCaW5kaW5nKWNvbGxlY3Rpb25UeXBlKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFRfSmF2YVV0aWxDb2xsZWN0aW9uLCBmYWxzZSAvKkl0ZXJhYmxlIGlzIG5vdCBhIGNsYXNzKi8pOworCQkJCX0KKwkJCQljaGVja0l0ZXJhYmxlOiB7CisJCQkJCWlmIChpdGVyYWJsZVR5cGUgPT0gbnVsbCkgYnJlYWsgY2hlY2tJdGVyYWJsZTsKKwogCQkJCQl0aGlzLml0ZXJhdG9yUmVjZWl2ZXJUeXBlID0gY29sbGVjdGlvblR5cGUuZXJhc3VyZSgpOwotCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKWl0ZXJhdG9yUmVjZWl2ZXJUeXBlKS5maW5kU3VwZXJUeXBlRXJhc2luZ1RvKFRfSmF2YUxhbmdJdGVyYWJsZSwgZmFsc2UpID09IG51bGwpIHsKKwkJCQkJaWYgKGlzVGFyZ2V0SnNyMTQpIHsKKwkJCQkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5pdGVyYXRvclJlY2VpdmVyVHlwZSkuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShUX0phdmFVdGlsQ29sbGVjdGlvbiwgZmFsc2UpID09IG51bGwpIHsKKwkJCQkJCQl0aGlzLml0ZXJhdG9yUmVjZWl2ZXJUeXBlID0gaXRlcmFibGVUeXBlOyAvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKKwkJCQkJCQl0aGlzLmNvbGxlY3Rpb24uY29tcHV0ZUNvbnZlcnNpb24odGhpcy5zY29wZSwgaXRlcmFibGVUeXBlLCBjb2xsZWN0aW9uVHlwZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMuY29sbGVjdGlvbi5jb21wdXRlQ29udmVyc2lvbih0aGlzLnNjb3BlLCBjb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKCgoUmVmZXJlbmNlQmluZGluZyl0aGlzLml0ZXJhdG9yUmVjZWl2ZXJUeXBlKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFRfSmF2YUxhbmdJdGVyYWJsZSwgZmFsc2UpID09IG51bGwpIHsKIAkJCQkJCXRoaXMuaXRlcmF0b3JSZWNlaXZlclR5cGUgPSBpdGVyYWJsZVR5cGU7IC8vIGhhbmRsZSBpbmRpcmVjdCBpbmhlcml0YW5jZSB0aHJ1IHZhcmlhYmxlIHNlY29uZGFyeSBib3VuZAotCSAgIAkJCQkJdGhpcy5jb2xsZWN0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBpdGVyYWJsZVR5cGUsIGNvbGxlY3Rpb25UeXBlKTsKKwkJCQkJCXRoaXMuY29sbGVjdGlvbi5jb21wdXRlQ29udmVyc2lvbih0aGlzLnNjb3BlLCBpdGVyYWJsZVR5cGUsIGNvbGxlY3Rpb25UeXBlKTsKIAkJCQkJfSBlbHNlIHsKLQkgICAJCQkJCXRoaXMuY29sbGVjdGlvbi5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgY29sbGVjdGlvblR5cGUsIGNvbGxlY3Rpb25UeXBlKTsKKwkJCQkJCXRoaXMuY29sbGVjdGlvbi5jb21wdXRlQ29udmVyc2lvbih0aGlzLnNjb3BlLCBjb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpOwogCQkJCQl9CiAKLQkJCSAgICAJVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMgPSBudWxsOwotCQkJICAgIAlzd2l0Y2ggKGl0ZXJhYmxlVHlwZS5raW5kKCkpIHsKLQkJCSAgICAJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6IC8vIGZvcihPYmplY3QgbyA6IEl0ZXJhYmxlKQorCQkJCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IG51bGw7CisJCQkJCXN3aXRjaCAoaXRlcmFibGVUeXBlLmtpbmQoKSkgeworCQkJCQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDogLy8gZm9yKE9iamVjdCBvIDogSXRlcmFibGUpCiAJCQkJCQkJdGhpcy5raW5kID0gUkFXX0lURVJBQkxFOwotCQkJCQkJCXRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKLQkJCQkJCQlpZiAoIWNvbGxlY3Rpb25FbGVtZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKGVsZW1lbnRUeXBlKQotCQkJCQkJCQkJJiYgIXNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoY29sbGVjdGlvbkVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3JJbkZvcmVhY2goY29sbGVjdGlvbiwgY29sbGVjdGlvbkVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSk7CisJCQkJCQkJdGhpcy5jb2xsZWN0aW9uRWxlbWVudFR5cGUgPSB0aGlzLnNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJCQkJCQkJaWYgKCF0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKGVsZW1lbnRUeXBlKQorCQkJCQkJCQkJJiYgIXRoaXMuc2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aCh0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpKSB7CisJCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3JJbkZvcmVhY2godGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpOwogCQkJCQkJCX0KIAkJCQkJCQkvLyBubyBjb252ZXJzaW9uIG5lZWRlZCBhcyBvbmx5IGZvciByZWZlcmVuY2UgdHlwZXMKLQkJCSAgICAJCQlicmVhayBjaGVja0l0ZXJhYmxlOwotCQkJICAgIAkJCQotCQkJICAgIAkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6IC8vIGZvciAoVCB0IDogSXRlcmFibGU8VD4pIC0gaW4gY2FzZSB1c2VkIGluc2lkZSBJdGVyYWJsZSBpdHNlbGYKLQkJCSAgICAJCQlhcmd1bWVudHMgPSBpdGVyYWJsZVR5cGUudHlwZVZhcmlhYmxlcygpOwotCQkJICAgIAkJCWJyZWFrOwotCQkJICAgIAkJCQotCQkJICAgIAkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6IC8vIGZvcihFIGUgOiBJdGVyYWJsZTxFPikKLQkJCSAgICAJCQlhcmd1bWVudHMgPSAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZylpdGVyYWJsZVR5cGUpLmFyZ3VtZW50czsKLQkJCSAgICAJCQlicmVhazsKLQkJCSAgICAJCQkKLQkJCSAgICAJCWRlZmF1bHQ6Ci0JCQkgICAgCQkJYnJlYWsgY2hlY2tJdGVyYWJsZTsKLQkJCSAgICAJfQotCQkJICAgIAkvLyBnZW5lcmljIG9yIHBhcmFtZXRlcml6ZWQgY2FzZQorCQkJCQkJCWJyZWFrIGNoZWNrSXRlcmFibGU7CisKKwkJCQkJCWNhc2UgQmluZGluZy5HRU5FUklDX1RZUEUgOiAvLyBmb3IgKFQgdCA6IEl0ZXJhYmxlPFQ+KSAtIGluIGNhc2UgdXNlZCBpbnNpZGUgSXRlcmFibGUgaXRzZWxmCisJCQkJCQkJYXJndW1lbnRzID0gaXRlcmFibGVUeXBlLnR5cGVWYXJpYWJsZXMoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6IC8vIGZvcihFIGUgOiBJdGVyYWJsZTxFPikKKwkJCQkJCQlhcmd1bWVudHMgPSAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZylpdGVyYWJsZVR5cGUpLmFyZ3VtZW50czsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhayBjaGVja0l0ZXJhYmxlOworCQkJCQl9CisJCQkJCS8vIGdlbmVyaWMgb3IgcGFyYW1ldGVyaXplZCBjYXNlCiAJCQkJCWlmIChhcmd1bWVudHMubGVuZ3RoICE9IDEpIGJyZWFrIGNoZWNrSXRlcmFibGU7IC8vIHBlciBjb25zdHJ1Y3Rpb24gY2FuIG9ubHkgYmUgb25lCiAJCQkJCXRoaXMua2luZCA9IEdFTkVSSUNfSVRFUkFCTEU7Ci0JCQkJCQotCQkJCQl0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSA9IGFyZ3VtZW50c1swXTsgCi0JCQkJCWlmICghY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgoZWxlbWVudFR5cGUpCi0JCQkJCQkJJiYgIXNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoY29sbGVjdGlvbkVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpIHsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9ySW5Gb3JlYWNoKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpOworCisJCQkJCXRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlID0gYXJndW1lbnRzWzBdOworCQkJCQlpZiAoIXRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgoZWxlbWVudFR5cGUpCisJCQkJCQkJJiYgIXRoaXMuc2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aCh0aGlzLmNvbGxlY3Rpb25FbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpKSB7CisJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9ySW5Gb3JlYWNoKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKTsKIAkJCQkJfQotCQkJCQlpbnQgY29tcGlsZVRpbWVUeXBlSUQgPSBjb2xsZWN0aW9uRWxlbWVudFR5cGUuaWQ7CisJCQkJCWludCBjb21waWxlVGltZVR5cGVJRCA9IHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlkOwogCQkJCQkvLyBubyBjb252ZXJzaW9uIG5lZWRlZCBhcyBvbmx5IGZvciByZWZlcmVuY2UgdHlwZXMKIAkJCQkJaWYgKGVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJCQkJaWYgKCFjb2xsZWN0aW9uRWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJCQkJY29tcGlsZVRpbWVUeXBlSUQgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGNvbGxlY3Rpb25FbGVtZW50VHlwZSkuaWQ7CisJCQkJCQlpZiAoIXRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJCQkJCWNvbXBpbGVUaW1lVHlwZUlEID0gdGhpcy5zY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlKS5pZDsKIAkJCQkJCQl0aGlzLmVsZW1lbnRWYXJpYWJsZUltcGxpY2l0V2lkZW5pbmcgPSBVTkJPWElORzsKIAkJCQkJCQlpZiAoZWxlbWVudFR5cGUuaXNCYXNlVHlwZSgpKSB7CiAJCQkJCQkJCXRoaXMuZWxlbWVudFZhcmlhYmxlSW1wbGljaXRXaWRlbmluZyB8PSAoZWxlbWVudFR5cGUuaWQgPDwgNCkgKyBjb21waWxlVGltZVR5cGVJRDsKQEAgLTQ2Myw1NSArNDgzLDYyIEBACiAJCQkJCQkJdGhpcy5lbGVtZW50VmFyaWFibGVJbXBsaWNpdFdpZGVuaW5nID0gKGVsZW1lbnRUeXBlLmlkIDw8IDQpICsgY29tcGlsZVRpbWVUeXBlSUQ7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJCQkJCWludCBib3hlZElEID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShjb2xsZWN0aW9uRWxlbWVudFR5cGUpLmlkOworCQkJCQkJaWYgKHRoaXMuY29sbGVjdGlvbkVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgewogCQkJCQkJCXRoaXMuZWxlbWVudFZhcmlhYmxlSW1wbGljaXRXaWRlbmluZyA9IEJPWElORyB8IChjb21waWxlVGltZVR5cGVJRCA8PCA0KSB8IGNvbXBpbGVUaW1lVHlwZUlEOyAvLyB1c2UgcHJpbWl0aXZlIHR5cGUgaW4gaW1wbGljaXQgY29udmVyc2lvbgotCQkJCQkJCWNvbXBpbGVUaW1lVHlwZUlEID0gYm94ZWRJRDsKIAkJCQkJCX0KIAkJCQkJfQotCQkJICAgIH0KKwkJCQl9CiAJCQl9CiAJCQlzd2l0Y2godGhpcy5raW5kKSB7CiAJCQkJY2FzZSBBUlJBWSA6CiAJCQkJCS8vIGFsbG9jYXRlICNpbmRleCBzZWNyZXQgdmFyaWFibGUgKG9mIHR5cGUgaW50KQogCQkJCQl0aGlzLmluZGV4VmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoU2VjcmV0SW5kZXhWYXJpYWJsZU5hbWUsIFR5cGVCaW5kaW5nLklOVCwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQsIGZhbHNlKTsKLQkJCQkJc2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLmluZGV4VmFyaWFibGUpOworCQkJCQl0aGlzLnNjb3BlLmFkZExvY2FsVmFyaWFibGUodGhpcy5pbmRleFZhcmlhYmxlKTsKIAkJCQkJdGhpcy5pbmRleFZhcmlhYmxlLnNldENvbnN0YW50KENvbnN0YW50Lk5vdEFDb25zdGFudCk7IC8vIG5vdCBpbmxpbmFibGUKLQkJCQkJCiAJCQkJCS8vIGFsbG9jYXRlICNtYXggc2VjcmV0IHZhcmlhYmxlCiAJCQkJCXRoaXMubWF4VmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoU2VjcmV0TWF4VmFyaWFibGVOYW1lLCBUeXBlQmluZGluZy5JTlQsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0LCBmYWxzZSk7Ci0JCQkJCXNjb3BlLmFkZExvY2FsVmFyaWFibGUodGhpcy5tYXhWYXJpYWJsZSk7CisJCQkJCXRoaXMuc2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLm1heFZhcmlhYmxlKTsKIAkJCQkJdGhpcy5tYXhWYXJpYWJsZS5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOyAvLyBub3QgaW5saW5hYmxlCiAJCQkJCS8vIGFkZCAjYXJyYXkgc2VjcmV0IHZhcmlhYmxlIChvZiBjb2xsZWN0aW9uIHR5cGUpCi0JCQkJCXRoaXMuY29sbGVjdGlvblZhcmlhYmxlID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKFNlY3JldENvbGxlY3Rpb25WYXJpYWJsZU5hbWUsIGNvbGxlY3Rpb25UeXBlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCwgZmFsc2UpOwotCQkJCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuY29sbGVjdGlvblZhcmlhYmxlKTsKKwkJCQkJaWYgKGV4cGVjdGVkQ29sbGVjdGlvblR5cGUgPT0gbnVsbCkgeworCQkJCQkJdGhpcy5jb2xsZWN0aW9uVmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoU2VjcmV0Q29sbGVjdGlvblZhcmlhYmxlTmFtZSwgY29sbGVjdGlvblR5cGUsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0LCBmYWxzZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLmNvbGxlY3Rpb25WYXJpYWJsZSA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhTZWNyZXRDb2xsZWN0aW9uVmFyaWFibGVOYW1lLCBleHBlY3RlZENvbGxlY3Rpb25UeXBlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCwgZmFsc2UpOworCQkJCQl9CisJCQkJCXRoaXMuc2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLmNvbGxlY3Rpb25WYXJpYWJsZSk7CiAJCQkJCXRoaXMuY29sbGVjdGlvblZhcmlhYmxlLnNldENvbnN0YW50KENvbnN0YW50Lk5vdEFDb25zdGFudCk7IC8vIG5vdCBpbmxpbmFibGUKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBSQVdfSVRFUkFCTEUgOgogCQkJCWNhc2UgR0VORVJJQ19JVEVSQUJMRSA6CiAJCQkJCS8vIGFsbG9jYXRlICNpbmRleCBzZWNyZXQgdmFyaWFibGUgKG9mIHR5cGUgSXRlcmF0b3IpCi0JCQkJCXRoaXMuaW5kZXhWYXJpYWJsZSA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhTZWNyZXRJbmRleFZhcmlhYmxlTmFtZSwgc2NvcGUuZ2V0SmF2YVV0aWxJdGVyYXRvcigpLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCwgZmFsc2UpOwotCQkJCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuaW5kZXhWYXJpYWJsZSk7CisJCQkJCXRoaXMuaW5kZXhWYXJpYWJsZSA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhTZWNyZXRJdGVyYXRvclZhcmlhYmxlTmFtZSwgdGhpcy5zY29wZS5nZXRKYXZhVXRpbEl0ZXJhdG9yKCksIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0LCBmYWxzZSk7CisJCQkJCXRoaXMuc2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLmluZGV4VmFyaWFibGUpOwogCQkJCQl0aGlzLmluZGV4VmFyaWFibGUuc2V0Q29uc3RhbnQoQ29uc3RhbnQuTm90QUNvbnN0YW50KTsgLy8gbm90IGlubGluYWJsZQogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0IDoKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGVGb3JDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOworCQkJCQlpZiAoaXNUYXJnZXRKc3IxNCkgeworCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZUZvckNvbGxlY3Rpb25UYXJnZXQxNCh0aGlzLmNvbGxlY3Rpb24pOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZUZvckNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKTsKKwkJCQkJfQogCQkJfQogCQl9Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnJlc29sdmUoc2NvcGUpOworCQlpZiAodGhpcy5hY3Rpb24gIT0gbnVsbCkgeworCQkJdGhpcy5hY3Rpb24ucmVzb2x2ZSh0aGlzLnNjb3BlKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAogCQlBU1RWaXNpdG9yIHZpc2l0b3IsCiAJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewogCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7Ci0JCQl0aGlzLmVsZW1lbnRWYXJpYWJsZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQl0aGlzLmNvbGxlY3Rpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQkJYWN0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCXRoaXMuZWxlbWVudFZhcmlhYmxlLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOworCQkJaWYgKHRoaXMuY29sbGVjdGlvbiAhPSBudWxsKSB7CisJCQkJdGhpcy5jb2xsZWN0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOworCQkJfQorCQkJaWYgKHRoaXMuYWN0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JZlN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JZlN0YXRlbWVudC5qYXZhCmluZGV4IDMyNGRmODAuLjJmM2IxYTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSWZTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lmU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMxOTIwMSAtIFtudWxsXSBubyB3YXJuaW5nIHdoZW4gdW5ib3hpbmcgU2luZ2xlTmFtZVJlZmVyZW5jZSBjYXVzZXMgTlBFCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMTcsOCArMTgsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIElmU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkKLQkvL3RoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY2FzZSBvZiBvbmx5IG9uZSBzdGF0ZW1lbnQgaW4gCisKKwkvL3RoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY2FzZSBvZiBvbmx5IG9uZSBzdGF0ZW1lbnQgaW4KIAkvL2VpdGhlciBlbHNlIGFuZC9vciB0aGVuIGJyYW5jaGVzLgogCiAJcHVibGljIEV4cHJlc3Npb24gY29uZGl0aW9uOwpAQCAtMzAsMjIyICszMSwyNDUgQEAKIAlpbnQgZWxzZUluaXRTdGF0ZUluZGV4ID0gLTE7CiAJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7CiAKLQlwdWJsaWMgSWZTdGF0ZW1lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50LCAJaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CitwdWJsaWMgSWZTdGF0ZW1lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50LCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKwl0aGlzLnRoZW5TdGF0ZW1lbnQgPSB0aGVuU3RhdGVtZW50OworCS8vIHJlbWVtYmVyIHVzZWZ1bCBlbXB0eSBzdGF0ZW1lbnQKKwlpZiAodGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSB0aGVuU3RhdGVtZW50LmJpdHMgfD0gSXNVc2VmdWxFbXB0eVN0YXRlbWVudDsKKwl0aGlzLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7CisJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7Cit9CiAKLQkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247Ci0JCXRoaXMudGhlblN0YXRlbWVudCA9IHRoZW5TdGF0ZW1lbnQ7Ci0JCS8vIHJlbWVtYmVyIHVzZWZ1bCBlbXB0eSBzdGF0ZW1lbnQKLQkJaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkgdGhlblN0YXRlbWVudC5iaXRzIHw9IElzVXNlZnVsRW1wdHlTdGF0ZW1lbnQ7Ci0JCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKLQkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CitwdWJsaWMgSWZTdGF0ZW1lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50LCBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJdGhpcy50aGVuU3RhdGVtZW50ID0gdGhlblN0YXRlbWVudDsKKwkvLyByZW1lbWJlciB1c2VmdWwgZW1wdHkgc3RhdGVtZW50CisJaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkgdGhlblN0YXRlbWVudC5iaXRzIHw9IElzVXNlZnVsRW1wdHlTdGF0ZW1lbnQ7CisJdGhpcy5lbHNlU3RhdGVtZW50ID0gZWxzZVN0YXRlbWVudDsKKwlpZiAoZWxzZVN0YXRlbWVudCBpbnN0YW5jZW9mIElmU3RhdGVtZW50KSBlbHNlU3RhdGVtZW50LmJpdHMgfD0gSXNFbHNlSWZTdGF0ZW1lbnQ7CisJaWYgKGVsc2VTdGF0ZW1lbnQgaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkgZWxzZVN0YXRlbWVudC5iaXRzIHw9IElzVXNlZnVsRW1wdHlTdGF0ZW1lbnQ7CisJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworfQorCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCS8vIHByb2Nlc3MgdGhlIGNvbmRpdGlvbgorCUZsb3dJbmZvIGNvbmRpdGlvbkZsb3dJbmZvID0gdGhpcy5jb25kaXRpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCWludCBpbml0aWFsQ29tcGxhaW50TGV2ZWwgPSAoZmxvd0luZm8ucmVhY2hNb2RlKCkgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCA/IFN0YXRlbWVudC5DT01QTEFJTkVEX0ZBS0VfUkVBQ0hBQkxFIDogU3RhdGVtZW50Lk5PVF9DT01QTEFJTkVEOworCisJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJaWYgKCh0aGlzLmNvbmRpdGlvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7CisJCXRoaXMuY29uZGl0aW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAl9CisJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOworCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOwogCi0JcHVibGljIElmU3RhdGVtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCwgU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotCi0JCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOwotCQl0aGlzLnRoZW5TdGF0ZW1lbnQgPSB0aGVuU3RhdGVtZW50OwotCQkvLyByZW1lbWJlciB1c2VmdWwgZW1wdHkgc3RhdGVtZW50Ci0JCWlmICh0aGVuU3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHRoZW5TdGF0ZW1lbnQuYml0cyB8PSBJc1VzZWZ1bEVtcHR5U3RhdGVtZW50OwotCQl0aGlzLmVsc2VTdGF0ZW1lbnQgPSBlbHNlU3RhdGVtZW50OwotCQlpZiAoZWxzZVN0YXRlbWVudCBpbnN0YW5jZW9mIElmU3RhdGVtZW50KSBlbHNlU3RhdGVtZW50LmJpdHMgfD0gSXNFbHNlSWZTdGF0ZW1lbnQ7Ci0JCWlmIChlbHNlU3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIGVsc2VTdGF0ZW1lbnQuYml0cyB8PSBJc1VzZWZ1bEVtcHR5U3RhdGVtZW50OwotCQl0aGlzLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7Ci0JCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworCS8vIHByb2Nlc3MgdGhlIFRIRU4gcGFydAorCUZsb3dJbmZvIHRoZW5GbG93SW5mbyA9IGNvbmRpdGlvbkZsb3dJbmZvLnNhZmVJbml0c1doZW5UcnVlKCk7CisJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UpIHsKKwkJdGhlbkZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsKIAl9Ci0KLQlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCi0JCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKLQkJRmxvd0luZm8gZmxvd0luZm8pIHsKLQotCQkvLyBwcm9jZXNzIHRoZSBjb25kaXRpb24KLQkJRmxvd0luZm8gY29uZGl0aW9uRmxvd0luZm8gPQotCQkJY29uZGl0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKLQotCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKLQkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwotCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZTsKLQkJCi0JCS8vIHByb2Nlc3MgdGhlIFRIRU4gcGFydAotCQlGbG93SW5mbyB0aGVuRmxvd0luZm8gPSBjb25kaXRpb25GbG93SW5mby5zYWZlSW5pdHNXaGVuVHJ1ZSgpOwotCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgewotCQkJdGhlbkZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAotCQl9Ci0JCUZsb3dJbmZvIGVsc2VGbG93SW5mbyA9IGNvbmRpdGlvbkZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCk7Ci0JCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZFRydWUpIHsKLQkJCWVsc2VGbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOyAKLQkJfQotCQlpZiAodGhpcy50aGVuU3RhdGVtZW50ICE9IG51bGwpIHsKLQkJCS8vIFNhdmUgaW5mbyBmb3IgY29kZSBnZW4KLQkJCXRoZW5Jbml0U3RhdGVJbmRleCA9Ci0JCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXModGhlbkZsb3dJbmZvKTsKLQkJCWlmICghdGhlblN0YXRlbWVudC5jb21wbGFpbklmVW5yZWFjaGFibGUodGhlbkZsb3dJbmZvLCBjdXJyZW50U2NvcGUsIGZhbHNlKSkgewotCQkJCXRoZW5GbG93SW5mbyA9Ci0JCQkJCXRoZW5TdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgdGhlbkZsb3dJbmZvKTsKKwlGbG93SW5mbyBlbHNlRmxvd0luZm8gPSBjb25kaXRpb25GbG93SW5mby5pbml0c1doZW5GYWxzZSgpLmNvcHkoKTsKKwlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlKSB7CisJCWVsc2VGbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCk7CisJfQorCWlmICgoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgJiYgCisJCQkoKHRoZW5GbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApKSB7CisJCS8vIE1hcmsgdGhlbiBibG9jayBhcyB1bnJlYWNoYWJsZQorCQkvLyBObyBuZWVkIGlmIHRoZSB3aG9sZSBpZi1lbHNlIGNvbnN0cnVjdCBpdHNlbGYgbGllcyBpbiB1bnJlYWNoYWJsZSBjb2RlCisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzVGhlblN0YXRlbWVudFVucmVhY2hhYmxlOworCX0gZWxzZSBpZiAoKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApICYmCisJCQkoKGVsc2VGbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApKSB7CisJCS8vIE1hcmsgZWxzZSBibG9jayBhcyB1bnJlYWNoYWJsZQorCQkvLyBObyBuZWVkIGlmIHRoZSB3aG9sZSBpZi1lbHNlIGNvbnN0cnVjdCBpdHNlbGYgbGllcyBpbiB1bnJlYWNoYWJsZSBjb2RlCisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzRWxzZVN0YXRlbWVudFVucmVhY2hhYmxlOworCX0KKwlpZiAodGhpcy50aGVuU3RhdGVtZW50ICE9IG51bGwpIHsKKwkJLy8gU2F2ZSBpbmZvIGZvciBjb2RlIGdlbgorCQl0aGlzLnRoZW5Jbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRoZW5GbG93SW5mbyk7CisJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlIHx8ICgodGhpcy5iaXRzICYgQVNUTm9kZS5Jc1RoZW5TdGF0ZW1lbnRVbnJlYWNoYWJsZSkgIT0gMCkpIHsKKwkJCWlmICghaXNLbm93RGVhZENvZGVQYXR0ZXJuKHRoaXMuY29uZGl0aW9uKSB8fCBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCkgeworCQkJCXRoaXMudGhlblN0YXRlbWVudC5jb21wbGFpbklmVW5yZWFjaGFibGUodGhlbkZsb3dJbmZvLCBjdXJyZW50U2NvcGUsIGluaXRpYWxDb21wbGFpbnRMZXZlbCk7CisJCQl9IGVsc2UgeworCQkJCS8vIGl0cyBhIGtub3duIGNvZGluZyBwYXR0ZXJuIHdoaWNoIHNob3VsZCBiZSB0b2xlcmF0ZWQgYnkgZGVhZCBjb2RlIGFuYWx5c2lzCisJCQkJLy8gYWNjb3JkaW5nIHRvIGlzS25vd0RlYWRDb2RlUGF0dGVybigpCisJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLklzVGhlblN0YXRlbWVudFVucmVhY2hhYmxlOwogCQkJfQogCQl9Ci0JCS8vIGNvZGUgZ2VuOiBvcHRpbWl6aW5nIHRoZSBqdW1wIGFyb3VuZCB0aGUgRUxTRSBwYXJ0Ci0JCWlmICgodGhlbkZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgewotCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuVGhlbkV4aXQ7Ci0JCX0KLQotCQkvLyBwcm9jZXNzIHRoZSBFTFNFIHBhcnQKLQkJaWYgKHRoaXMuZWxzZVN0YXRlbWVudCAhPSBudWxsKSB7Ci0JCSAgICAvLyBzaWduYWwgZWxzZSBjbGF1c2UgdW5uZWNlc3NhcmlseSBuZXN0ZWQsIHRvbGVyYXRlIGVsc2UtaWYgY29kZSBwYXR0ZXJuCi0JCSAgICBpZiAodGhlbkZsb3dJbmZvID09IEZsb3dJbmZvLkRFQURfRU5EIAotCQkgICAgICAgICAgICAmJiAodGhpcy5iaXRzICYgSXNFbHNlSWZTdGF0ZW1lbnQpID09IDAgCS8vIGVsc2Ugb2YgYW4gZWxzZS1pZgotCQkgICAgICAgICAgICAmJiAhKHRoaXMuZWxzZVN0YXRlbWVudCBpbnN0YW5jZW9mIElmU3RhdGVtZW50KSkgewotCQkgICAgICAgIGN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVsc2UodGhpcy5lbHNlU3RhdGVtZW50KTsKLQkJICAgIH0KLQkJCS8vIFNhdmUgaW5mbyBmb3IgY29kZSBnZW4KLQkJCWVsc2VJbml0U3RhdGVJbmRleCA9Ci0JCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZWxzZUZsb3dJbmZvKTsKLQkJCWlmICghZWxzZVN0YXRlbWVudC5jb21wbGFpbklmVW5yZWFjaGFibGUoZWxzZUZsb3dJbmZvLCBjdXJyZW50U2NvcGUsIGZhbHNlKSkgewotCQkJCWVsc2VGbG93SW5mbyA9Ci0JCQkJCWVsc2VTdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZWxzZUZsb3dJbmZvKTsKLQkJCX0KLQkJfQotCi0JCS8vIG1lcmdlIFRIRU4gJiBFTFNFIGluaXRpYWxpemF0aW9ucwotCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gRmxvd0luZm8ubWVyZ2VkT3B0aW1pemVkQnJhbmNoZXMoCi0JCQl0aGVuRmxvd0luZm8sIAotCQkJaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlLCAKLQkJCWVsc2VGbG93SW5mbywgCi0JCQlpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlLAotCQkJdHJ1ZSAvKmlmKHRydWUpeyByZXR1cm47IH0gIGZha2UtcmVhY2hhYmxlKCk7ICovKTsKLQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKLQkJcmV0dXJuIG1lcmdlZEluZm87CisJCXRoZW5GbG93SW5mbyA9IHRoaXMudGhlblN0YXRlbWVudC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCB0aGVuRmxvd0luZm8pOworCX0KKwkvLyBjb2RlIGdlbjogb3B0aW1pemluZyB0aGUganVtcCBhcm91bmQgdGhlIEVMU0UgcGFydAorCWlmICgodGhlbkZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSB7CisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlRoZW5FeGl0OwogCX0KIAotCS8qKgotCSAqIElmIGNvZGUgZ2VuZXJhdGlvbgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKLQotCQlpZiAoKHRoaXMuYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7Ci0JCQlyZXR1cm47CisJLy8gcHJvY2VzcyB0aGUgRUxTRSBwYXJ0CisJaWYgKHRoaXMuZWxzZVN0YXRlbWVudCAhPSBudWxsKSB7CisJCS8vIHNpZ25hbCBlbHNlIGNsYXVzZSB1bm5lY2Vzc2FyaWx5IG5lc3RlZCwgdG9sZXJhdGUgZWxzZS1pZiBjb2RlIHBhdHRlcm4KKwkJaWYgKHRoZW5GbG93SW5mbyA9PSBGbG93SW5mby5ERUFEX0VORAorCQkJCSYmICh0aGlzLmJpdHMgJiBJc0Vsc2VJZlN0YXRlbWVudCkgPT0gMCAJLy8gZWxzZSBvZiBhbiBlbHNlLWlmCisJCQkJJiYgISh0aGlzLmVsc2VTdGF0ZW1lbnQgaW5zdGFuY2VvZiBJZlN0YXRlbWVudCkpIHsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVsc2UodGhpcy5lbHNlU3RhdGVtZW50KTsKIAkJfQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlCcmFuY2hMYWJlbCBlbmRpZkxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCQkvLyBTYXZlIGluZm8gZm9yIGNvZGUgZ2VuCisJCXRoaXMuZWxzZUluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZWxzZUZsb3dJbmZvKTsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSB8fCAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNFbHNlU3RhdGVtZW50VW5yZWFjaGFibGUpICE9IDApKSB7CisJCQlpZiAoIWlzS25vd0RlYWRDb2RlUGF0dGVybih0aGlzLmNvbmRpdGlvbikgfHwgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnJlcG9ydERlYWRDb2RlSW5Ucml2aWFsSWZTdGF0ZW1lbnQpIHsKKwkJCQl0aGlzLmVsc2VTdGF0ZW1lbnQuY29tcGxhaW5JZlVucmVhY2hhYmxlKGVsc2VGbG93SW5mbywgY3VycmVudFNjb3BlLCBpbml0aWFsQ29tcGxhaW50TGV2ZWwpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBpdHMgYSBrbm93biBjb2RpbmcgcGF0dGVybiB3aGljaCBzaG91bGQgYmUgdG9sZXJhdGVkIGJ5IGRlYWQgY29kZSBhbmFseXNpcworCQkJCS8vIGFjY29yZGluZyB0byBpc0tub3dEZWFkQ29kZVBhdHRlcm4oKQorCQkJCXRoaXMuYml0cyAmPSB+QVNUTm9kZS5Jc0Vsc2VTdGF0ZW1lbnRVbnJlYWNoYWJsZTsKKwkJCX0KKwkJfQorCQllbHNlRmxvd0luZm8gPSB0aGlzLmVsc2VTdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZWxzZUZsb3dJbmZvKTsKKwl9CisJLy8gbWVyZ2UgVEhFTiAmIEVMU0UgaW5pdGlhbGl6YXRpb25zCisJRmxvd0luZm8gbWVyZ2VkSW5mbyA9IEZsb3dJbmZvLm1lcmdlZE9wdGltaXplZEJyYW5jaGVzSWZFbHNlKAorCQl0aGVuRmxvd0luZm8sCisJCWlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSwKKwkJZWxzZUZsb3dJbmZvLAorCQlpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlLAorCQl0cnVlIC8qaWYodHJ1ZSl7IHJldHVybjsgfSAgZmFrZS1yZWFjaGFibGUoKTsgKi8sCisJCWZsb3dJbmZvLAorCQl0aGlzKTsKKwl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJcmV0dXJuIG1lcmdlZEluZm87Cit9CiAKLQkJLy8gb3B0aW1pemluZyB0aGUgdGhlbi9lbHNlIHBhcnQgY29kZSBnZW4KLQkJQ29uc3RhbnQgY3N0OwotCQlib29sZWFuIGhhc1RoZW5QYXJ0ID0gCi0JCQkhKCgoY3N0ID0gdGhpcy5jb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudAotCQkJCQkmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpCi0JCQkJfHwgdGhpcy50aGVuU3RhdGVtZW50ID09IG51bGwKLQkJCQl8fCB0aGlzLnRoZW5TdGF0ZW1lbnQuaXNFbXB0eUJsb2NrKCkpOwotCQlib29sZWFuIGhhc0Vsc2VQYXJ0ID0KLQkJCSEoKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJfHwgdGhpcy5lbHNlU3RhdGVtZW50ID09IG51bGwKLQkJCQl8fCB0aGlzLmVsc2VTdGF0ZW1lbnQuaXNFbXB0eUJsb2NrKCkpOwotCQlpZiAoaGFzVGhlblBhcnQpIHsKLQkJCUJyYW5jaExhYmVsIGZhbHNlTGFiZWwgPSBudWxsOwotCQkJLy8gZ2VuZXJhdGUgYm9vbGVhbiBjb25kaXRpb24KKy8qKgorICogSWYgY29kZSBnZW5lcmF0aW9uCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwlpZiAoKHRoaXMuYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlCcmFuY2hMYWJlbCBlbmRpZkxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCisJLy8gb3B0aW1pemluZyB0aGUgdGhlbi9lbHNlIHBhcnQgY29kZSBnZW4KKwlDb25zdGFudCBjc3Q7CisJYm9vbGVhbiBoYXNUaGVuUGFydCA9CisJCSEoKChjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50CisJCQkJJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKQorCQkJfHwgdGhpcy50aGVuU3RhdGVtZW50ID09IG51bGwKKwkJCXx8IHRoaXMudGhlblN0YXRlbWVudC5pc0VtcHR5QmxvY2soKSk7CisJYm9vbGVhbiBoYXNFbHNlUGFydCA9CisJCSEoKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCisJCQl8fCB0aGlzLmVsc2VTdGF0ZW1lbnQgPT0gbnVsbAorCQkJfHwgdGhpcy5lbHNlU3RhdGVtZW50LmlzRW1wdHlCbG9jaygpKTsKKwlpZiAoaGFzVGhlblBhcnQpIHsKKwkJQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCA9IG51bGw7CisJCS8vIGdlbmVyYXRlIGJvb2xlYW4gY29uZGl0aW9uIG9ubHkgaWYgbmVlZGVkCisJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CisJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCX0gZWxzZSB7CiAJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJY3VycmVudFNjb3BlLAogCQkJCWNvZGVTdHJlYW0sCiAJCQkJbnVsbCwKIAkJCQloYXNFbHNlUGFydCA/IChmYWxzZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pKSA6IGVuZGlmTGFiZWwsCiAJCQkJdHJ1ZS8qY3N0ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCovKTsKKwkJfQorCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKwkJaWYgKHRoaXMudGhlbkluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMudGhlbkluaXRTdGF0ZUluZGV4KTsKKwkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy50aGVuSW5pdFN0YXRlSW5kZXgpOworCQl9CisJCS8vIGdlbmVyYXRlIHRoZW4gc3RhdGVtZW50CisJCXRoaXMudGhlblN0YXRlbWVudC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJLy8ganVtcCBhcm91bmQgdGhlIGVsc2Ugc3RhdGVtZW50CisJCWlmIChoYXNFbHNlUGFydCkgeworCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlRoZW5FeGl0KSA9PSAwKSB7CisJCQkJdGhpcy50aGVuU3RhdGVtZW50LmJyYW5jaENoYWluVG8oZW5kaWZMYWJlbCk7CisJCQkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZGlmTGFiZWwpOworCQkJCS8vZ290byBpcyB0YWdnZWQgYXMgcGFydCBvZiB0aGUgdGhlbkFjdGlvbiBibG9jaworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoKHRoaXMudGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEJsb2NrKSA/ICgoQmxvY2spIHRoaXMudGhlblN0YXRlbWVudCkuc2NvcGUgOiBjdXJyZW50U2NvcGUsIHBvc2l0aW9uKTsKKwkJCQkvLyBnZW5lcmF0ZSBlbHNlIHN0YXRlbWVudAorCQkJfQogCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQlpZiAodGhlbkluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGVuSW5pdFN0YXRlSW5kZXgpOwotCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhlbkluaXRTdGF0ZUluZGV4KTsKKwkJCWlmICh0aGlzLmVsc2VJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCXRoaXMuZWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMuZWxzZUluaXRTdGF0ZUluZGV4KTsKIAkJCX0KLQkJCS8vIGdlbmVyYXRlIHRoZW4gc3RhdGVtZW50Ci0JCQl0aGlzLnRoZW5TdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7Ci0JCQkvLyBqdW1wIGFyb3VuZCB0aGUgZWxzZSBzdGF0ZW1lbnQKLQkJCWlmIChoYXNFbHNlUGFydCkgewotCQkJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5UaGVuRXhpdCkgPT0gMCkgewotCQkJCQl0aGlzLnRoZW5TdGF0ZW1lbnQuYnJhbmNoQ2hhaW5UbyhlbmRpZkxhYmVsKTsKLQkJCQkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRpZkxhYmVsKTsKLQkJCQkJLy9nb3RvIGlzIHRhZ2dlZCBhcyBwYXJ0IG9mIHRoZSB0aGVuQWN0aW9uIGJsb2NrCi0JCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoKHRoaXMudGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEJsb2NrKSA/ICgoQmxvY2spIHRoaXMudGhlblN0YXRlbWVudCkuc2NvcGUgOiBjdXJyZW50U2NvcGUsIHBvc2l0aW9uKTsKLQkJCQkJLy8gZ2VuZXJhdGUgZWxzZSBzdGF0ZW1lbnQKLQkJCQl9Ci0JCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQkJaWYgKGVsc2VJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKLQkJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJCWVsc2VJbml0U3RhdGVJbmRleCk7Ci0JCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgZWxzZUluaXRTdGF0ZUluZGV4KTsKLQkJCQl9Ci0JCQkJaWYgKGZhbHNlTGFiZWwgIT0gbnVsbCkgZmFsc2VMYWJlbC5wbGFjZSgpOwotCQkJCXRoaXMuZWxzZVN0YXRlbWVudC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChoYXNFbHNlUGFydCkgewotCQkJLy8gZ2VuZXJhdGUgYm9vbGVhbiBjb25kaXRpb24KKwkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIGZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCXRoaXMuZWxzZVN0YXRlbWVudC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJfQorCX0gZWxzZSBpZiAoaGFzRWxzZVBhcnQpIHsKKwkJLy8gZ2VuZXJhdGUgYm9vbGVhbiBjb25kaXRpb24gb25seSBpZiBuZWVkZWQKKwkJaWYgKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7CisJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCX0gZWxzZSB7CiAJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJY3VycmVudFNjb3BlLAogCQkJCWNvZGVTdHJlYW0sCiAJCQkJZW5kaWZMYWJlbCwKIAkJCQludWxsLAogCQkJCXRydWUvKmNzdCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQqLyk7Ci0JCQkvLyBnZW5lcmF0ZSBlbHNlIHN0YXRlbWVudAotCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQlpZiAoZWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCi0JCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7Ci0JCQl9Ci0JCQl0aGlzLmVsc2VTdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBnZW5lcmF0ZSBjb25kaXRpb24gc2lkZS1lZmZlY3RzCi0JCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQl9CisJCS8vIGdlbmVyYXRlIGVsc2Ugc3RhdGVtZW50CiAJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJaWYgKHRoaXMuZWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQljdXJyZW50U2NvcGUsCi0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQkJdGhpcy5lbHNlSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLmVsc2VJbml0U3RhdGVJbmRleCk7CiAJCX0KLQkJZW5kaWZMYWJlbC5wbGFjZSgpOworCQl0aGlzLmVsc2VTdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJfSBlbHNlIHsKKwkJLy8gZ2VuZXJhdGUgY29uZGl0aW9uIHNpZGUtZWZmZWN0cworCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQotCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFN0YXRlbWVudChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7Ci0KLQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiaWYgKCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbmRpdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoIilcbiIpOwkvLyROT04tTkxTLTEkIAotCQl0aGVuU3RhdGVtZW50LnByaW50U3RhdGVtZW50KGluZGVudCArIDIsIG91dHB1dCk7Ci0JCWlmIChlbHNlU3RhdGVtZW50ICE9IG51bGwpIHsKLQkJCW91dHB1dC5hcHBlbmQoJ1xuJyk7Ci0JCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7Ci0JCQlvdXRwdXQuYXBwZW5kKCJlbHNlXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZVN0YXRlbWVudC5wcmludFN0YXRlbWVudChpbmRlbnQgKyAyLCBvdXRwdXQpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7CisJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJaWYgKHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQljdXJyZW50U2NvcGUsCisJCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAl9CisJZW5kaWZMYWJlbC5wbGFjZSgpOworCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CiAKLQlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAotCQlUeXBlQmluZGluZyB0eXBlID0gY29uZGl0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBUeXBlQmluZGluZy5CT09MRUFOKTsKLQkJY29uZGl0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB0eXBlLCB0eXBlKTsKLQkJaWYgKHRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkKLQkJCXRoZW5TdGF0ZW1lbnQucmVzb2x2ZShzY29wZSk7Ci0JCWlmIChlbHNlU3RhdGVtZW50ICE9IG51bGwpCi0JCQllbHNlU3RhdGVtZW50LnJlc29sdmUoc2NvcGUpOworCitwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKKwlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCJpZiAoIik7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmNvbmRpdGlvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoIilcbiIpOwkvLyROT04tTkxTLTEkCisJdGhpcy50aGVuU3RhdGVtZW50LnByaW50U3RhdGVtZW50KGluZGVudCArIDIsIG91dHB1dCk7CisJaWYgKHRoaXMuZWxzZVN0YXRlbWVudCAhPSBudWxsKSB7CisJCW91dHB1dC5hcHBlbmQoJ1xuJyk7CisJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KTsKKwkJb3V0cHV0LmFwcGVuZCgiZWxzZVxuIik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5lbHNlU3RhdGVtZW50LnByaW50U3RhdGVtZW50KGluZGVudCArIDIsIG91dHB1dCk7CiAJfQorCXJldHVybiBvdXRwdXQ7Cit9CiAKLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKLQkJQVNUVmlzaXRvciB2aXNpdG9yLAotCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKK3B1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLmNvbmRpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJdGhpcy5jb25kaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHR5cGUsIHR5cGUpOworCWlmICh0aGlzLnRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkKKwkJdGhpcy50aGVuU3RhdGVtZW50LnJlc29sdmUoc2NvcGUpOworCWlmICh0aGlzLmVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkKKwkJdGhpcy5lbHNlU3RhdGVtZW50LnJlc29sdmUoc2NvcGUpOworfQogCi0JCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7Ci0JCQljb25kaXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7Ci0JCQlpZiAodGhlblN0YXRlbWVudCAhPSBudWxsKQotCQkJCXRoZW5TdGF0ZW1lbnQudHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7Ci0JCQlpZiAoZWxzZVN0YXRlbWVudCAhPSBudWxsKQotCQkJCWVsc2VTdGF0ZW1lbnQudHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJdGhpcy5jb25kaXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCWlmICh0aGlzLnRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkKKwkJCXRoaXMudGhlblN0YXRlbWVudC50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJaWYgKHRoaXMuZWxzZVN0YXRlbWVudCAhPSBudWxsKQorCQkJdGhpcy5lbHNlU3RhdGVtZW50LnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCX0KKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbXBvcnRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW1wb3J0UmVmZXJlbmNlLmphdmEKaW5kZXggNzQ3NTNkNC4uNjAxMTk0MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbXBvcnRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDYgKzIzLDggQEAKIAlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kOwogCXB1YmxpYyBpbnQgbW9kaWZpZXJzOyAvLyAxLjUgYWRkaXRpb24gZm9yIHN0YXRpYyBpbXBvcnRzCiAJcHVibGljIEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKwkvLyBzdGFyIGVuZCBwb3NpdGlvbgorCXB1YmxpYyBpbnQgdHJhaWxpbmdTdGFyUG9zaXRpb247CiAKIAlwdWJsaWMgSW1wb3J0UmVmZXJlbmNlKAogCQkJY2hhcltdW10gdG9rZW5zLApAQCAtMzksNyArNDEsNyBAQAogCQl0aGlzLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNvdXJjZVBvc2l0aW9uc1swXSA+Pj4gMzIpOwogCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKIAkJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDA7CiAJfQpAQCAtNDksNyArNTEsNyBAQAogCSAqLwogCXB1YmxpYyBjaGFyW11bXSBnZXRJbXBvcnROYW1lKCkgewogCi0JCXJldHVybiB0b2tlbnM7CisJCXJldHVybiB0aGlzLnRva2VuczsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKQEAgLTYwLDkgKzYyLDkgQEAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQsIGJvb2xlYW4gd2l0aE9uRGVtYW5kKSB7CiAKIAkJLyogd2hlbiB3aXRoT25EZW1hbmQgaXMgZmFsc2UsIG9ubHkgdGhlIG5hbWUgaXMgcHJpbnRlZCAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoJy4nKTsKLQkJCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKKwkJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbaV0pOwogCQl9CiAJCWlmICh3aXRoT25EZW1hbmQgJiYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwKSkgewogCQkJb3V0cHV0LmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhCmluZGV4IDQ2YmY2NDkuLjZkNTQ0YWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luaXRpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsNyArMjgsOSBAQAogCQl0aGlzLmJsb2NrID0gYmxvY2s7CiAJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOwogCi0JCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VTdGFydCA9IGJsb2NrLnNvdXJjZVN0YXJ0OworCQlpZiAoYmxvY2sgIT0gbnVsbCkgeworCQkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydCA9IGJsb2NrLnNvdXJjZVN0YXJ0OworCQl9CiAJfQogCiAJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKApAQCAtMzYsMTEgKzM4LDE0IEBACiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCi0JCXJldHVybiBibG9jay5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCWlmICh0aGlzLmJsb2NrICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLmJsb2NrLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJfQorCQlyZXR1cm4gZmxvd0luZm87CiAJfQogCiAJLyoqCi0JICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIG5vbi1zdGF0aWMgaW5pdGlhbGl6ZXI6IAorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBub24tc3RhdGljIGluaXRpYWxpemVyOgogCSAqICAgIHN0YW5kYXJkIGJsb2NrIGNvZGUgZ2VuCiAJICoKIAkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQpAQCAtNDgsMTEgKzUzLDExIEBACiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKIAotCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgeworCQlpZiAoKHRoaXMuYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CiAJCQlyZXR1cm47CiAJCX0KIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJYmxvY2suZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCWlmICh0aGlzLmJsb2NrICE9IG51bGwpIHRoaXMuYmxvY2suZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQogCkBAIC02MiwxMiArNjcsMTIgQEAKIAlwdWJsaWMgaW50IGdldEtpbmQoKSB7CiAJCXJldHVybiBJTklUSUFMSVpFUjsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKIAogCQlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoCiAJCVBhcnNlciBwYXJzZXIsCiAJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCkBAIC03OSwyNiArODQsMzEgQEAKIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCi0JCWlmIChtb2RpZmllcnMgIT0gMCkgeworCQlpZiAodGhpcy5tb2RpZmllcnMgIT0gMCkgewogCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpOwotCQkJcHJpbnRNb2RpZmllcnMobW9kaWZpZXJzLCBvdXRwdXQpOworCQkJcHJpbnRNb2RpZmllcnModGhpcy5tb2RpZmllcnMsIG91dHB1dCk7CiAJCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSBwcmludEFubm90YXRpb25zKHRoaXMuYW5ub3RhdGlvbnMsIG91dHB1dCk7CiAJCQlvdXRwdXQuYXBwZW5kKCJ7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYmxvY2sucHJpbnRCb2R5KGluZGVudCwgb3V0cHV0KTsKLQkJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoJ30nKTsgCisJCQlpZiAodGhpcy5ibG9jayAhPSBudWxsKSB7CisJCQkJdGhpcy5ibG9jay5wcmludEJvZHkoaW5kZW50LCBvdXRwdXQpOworCQkJfQorCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnfScpOwogCQkJcmV0dXJuIG91dHB1dDsKKwkJfSBlbHNlIGlmICh0aGlzLmJsb2NrICE9IG51bGwpIHsKKwkJCXRoaXMuYmxvY2sucHJpbnRTdGF0ZW1lbnQoaW5kZW50LCBvdXRwdXQpOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIGJsb2NrLnByaW50U3RhdGVtZW50KGluZGVudCwgb3V0cHV0KTsKKwkJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoInt9Iik7IC8vJE5PTi1OTFMtMSQKIAkJfQorCQlyZXR1cm4gb3V0cHV0OwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlc29sdmUoTWV0aG9kU2NvcGUgc2NvcGUpIHsKIAotCSAgICBGaWVsZEJpbmRpbmcgcHJldmlvdXNGaWVsZCA9IHNjb3BlLmluaXRpYWxpemVkRmllbGQ7CisJCUZpZWxkQmluZGluZyBwcmV2aW91c0ZpZWxkID0gc2NvcGUuaW5pdGlhbGl6ZWRGaWVsZDsKIAkJaW50IHByZXZpb3VzRmllbGRJRCA9IHNjb3BlLmxhc3RWaXNpYmxlRmllbGRJRDsKIAkJdHJ5IHsKLQkJICAgIHNjb3BlLmluaXRpYWxpemVkRmllbGQgPSBudWxsOwotCQkJc2NvcGUubGFzdFZpc2libGVGaWVsZElEID0gbGFzdFZpc2libGVGaWVsZElEOworCQkJc2NvcGUuaW5pdGlhbGl6ZWRGaWVsZCA9IG51bGw7CisJCQlzY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQgPSB0aGlzLmxhc3RWaXNpYmxlRmllbGRJRDsKIAkJCWlmIChpc1N0YXRpYygpKSB7CiAJCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwogCQkJCWlmIChkZWNsYXJpbmdUeXBlLmlzTmVzdGVkVHlwZSgpICYmICFkZWNsYXJpbmdUeXBlLmlzU3RhdGljKCkpCkBAIC0xMDYsNyArMTE2LDcgQEAKIAkJCQkJCWRlY2xhcmluZ1R5cGUsCiAJCQkJCQl0aGlzKTsKIAkJCX0KLQkJCWJsb2NrLnJlc29sdmUoc2NvcGUpOworCQkJaWYgKHRoaXMuYmxvY2sgIT0gbnVsbCkgdGhpcy5ibG9jay5yZXNvbHZlKHNjb3BlKTsKIAkJfSBmaW5hbGx5IHsKIAkJICAgIHNjb3BlLmluaXRpYWxpemVkRmllbGQgPSBwcmV2aW91c0ZpZWxkOwogCQkJc2NvcGUubGFzdFZpc2libGVGaWVsZElEID0gcHJldmlvdXNGaWVsZElEOwpAQCAtMTE0LDkgKzEyNCw4IEBACiAJfQogCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBNZXRob2RTY29wZSBzY29wZSkgewotCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewotCQkJYmxvY2sudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKHRoaXMuYmxvY2sgIT0gbnVsbCkgdGhpcy5ibG9jay50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnN0YW5jZU9mRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnN0YW5jZU9mRXhwcmVzc2lvbi5qYXZhCmluZGV4IDY4NDliYzQuLjMzODJlYmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5zdGFuY2VPZkV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luc3RhbmNlT2ZFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsOTQgKzIxLDg4IEBACiAJcHVibGljIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKIAlwdWJsaWMgVHlwZVJlZmVyZW5jZSB0eXBlOwogCi0JcHVibGljIEluc3RhbmNlT2ZFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZVJlZmVyZW5jZSB0eXBlKSB7CitwdWJsaWMgSW5zdGFuY2VPZkV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlUmVmZXJlbmNlIHR5cGUpIHsKKwl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCXRoaXMudHlwZSA9IHR5cGU7CisJdHlwZS5iaXRzIHw9IElnbm9yZVJhd1R5cGVDaGVjazsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MjE0MQorCXRoaXMuYml0cyB8PSBJTlNUQU5DRU9GIDw8IE9wZXJhdG9yU0hJRlQ7CisJdGhpcy5zb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CisJdGhpcy5zb3VyY2VFbmQgPSB0eXBlLnNvdXJjZUVuZDsKK30KIAotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0eXBlLmJpdHMgfD0gSWdub3JlUmF3VHlwZUNoZWNrOyAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHJhdyB0eXBlIHVzYWdlCi0JCXRoaXMuYml0cyB8PSBJTlNUQU5DRU9GIDw8IE9wZXJhdG9yU0hJRlQ7Ci0JCXRoaXMuc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwotCQl0aGlzLnNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOwotCX0KLQotcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCUZsb3dJbmZvIGZsb3dJbmZvKSB7CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gdGhpcy5leHByZXNzaW9uLmxvY2FsVmFyaWFibGVCaW5kaW5nKCk7CiAJaWYgKGxvY2FsICE9IG51bGwgJiYgKGxvY2FsLnR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSXNCYXNlVHlwZSkgPT0gMCkgewotCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2UoY3VycmVudFNjb3BlLCBsb2NhbCwgCi0JCQl0aGlzLmV4cHJlc3Npb24sIEZsb3dDb250ZXh0LkNBTl9PTkxZX05VTEwgfCBGbG93Q29udGV4dC5JTl9JTlNUQU5DRU9GLCBmbG93SW5mbyk7Ci0JCWZsb3dJbmZvID0gZXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuCisJCWZsb3dJbmZvID0gdGhpcy5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS4KIAkJCXVuY29uZGl0aW9uYWxJbml0cygpOwogCQlGbG93SW5mbyBpbml0c1doZW5UcnVlID0gZmxvd0luZm8uY29weSgpOwogCQlpbml0c1doZW5UcnVlLm1hcmtBc0NvbXBhcmVkRXF1YWxUb05vbk51bGwobG9jYWwpOworCQlpZiAoKGZsb3dDb250ZXh0LnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSAhPSAwKSB7CisJCQlpbml0c1doZW5UcnVlLm1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCk7CisJCX0KKwkJZmxvd0NvbnRleHQucmVjb3JkVXNpbmdOdWxsUmVmZXJlbmNlKGN1cnJlbnRTY29wZSwgbG9jYWwsCisJCQkJdGhpcy5leHByZXNzaW9uLCBGbG93Q29udGV4dC5DQU5fT05MWV9OVUxMIHwgRmxvd0NvbnRleHQuSU5fSU5TVEFOQ0VPRiwgZmxvd0luZm8pOwogCQkvLyBubyBpbXBhY3QgdXBvbiBlbmNsb3NpbmcgdHJ5IGNvbnRleHQKIAkJcmV0dXJuIEZsb3dJbmZvLmNvbmRpdGlvbmFsKGluaXRzV2hlblRydWUsIGZsb3dJbmZvLmNvcHkoKSk7CiAJfQotCXJldHVybiBleHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS4KKwlyZXR1cm4gdGhpcy5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS4KIAkJCXVuY29uZGl0aW9uYWxJbml0cygpOwogfQogCi0JLyoqCi0JICogQ29kZSBnZW5lcmF0aW9uIGZvciBpbnN0YW5jZU9mRXhwcmVzc2lvbgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKLQkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCi0JICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotCSovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAotCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQljb2RlU3RyZWFtLmluc3RhbmNlX29mKHR5cGUucmVzb2x2ZWRUeXBlKTsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCX0KLQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciBpbnN0YW5jZU9mRXhwcmVzc2lvbgorICoKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWNvZGVTdHJlYW0uaW5zdGFuY2Vfb2YodGhpcy50eXBlLnJlc29sdmVkVHlwZSk7CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJfSBlbHNlIHsKKwkJY29kZVN0cmVhbS5wb3AoKTsKIAl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KIAotCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uTm9QYXJlbnRoZXNpcyhpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CitwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCXRoaXMuZXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiIGluc3RhbmNlb2YgIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gdGhpcy50eXBlLnByaW50KDAsIG91dHB1dCk7Cit9CiAKLQkJZXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiIGluc3RhbmNlb2YgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHR5cGUucHJpbnQoMCwgb3V0cHV0KTsKK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSA9IHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJVHlwZUJpbmRpbmcgY2hlY2tlZFR5cGUgPSB0aGlzLnR5cGUucmVzb2x2ZVR5cGUoc2NvcGUsIHRydWUgLyogY2hlY2sgYm91bmRzKi8pOworCWlmIChleHByZXNzaW9uVHlwZSA9PSBudWxsIHx8IGNoZWNrZWRUeXBlID09IG51bGwpCisJCXJldHVybiBudWxsOworCisJaWYgKCFjaGVja2VkVHlwZS5pc1JlaWZpYWJsZSgpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxJbnN0YW5jZU9mR2VuZXJpY1R5cGUoY2hlY2tlZFR5cGUsIHRoaXMpOworCX0gZWxzZSBpZiAoKGV4cHJlc3Npb25UeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwgJiYgZXhwcmVzc2lvblR5cGUuaXNCYXNlVHlwZSgpKSAvLyBkaXNhbGxvdyBhdXRvYm94aW5nCisJCQl8fCAhY2hlY2tDYXN0VHlwZXNDb21wYXRpYmlsaXR5KHNjb3BlLCBjaGVja2VkVHlwZSwgZXhwcmVzc2lvblR5cGUsIG51bGwpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9yKHRoaXMsIGV4cHJlc3Npb25UeXBlLCBjaGVja2VkVHlwZSk7CiAJfQorCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IFR5cGVCaW5kaW5nLkJPT0xFQU47Cit9CiAKLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiN0YWdBc1VubmVjZXNzYXJ5Q2FzdChTY29wZSxUeXBlQmluZGluZykKKyAqLworcHVibGljIHZvaWQgdGFnQXNVbm5lY2Vzc2FyeUNhc3QoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGNhc3RUeXBlKSB7CisJLy8gbnVsbCBpcyBub3QgaW5zdGFuY2VvZiBUeXBlLCByZWNvZ25pemUgZGlyZWN0IHNjZW5hcmlvCisJaWYgKHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgIT0gVHlwZUJpbmRpbmcuTlVMTCkKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlJbnN0YW5jZW9mKHRoaXMsIGNhc3RUeXBlKTsKK30KIAotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJVHlwZUJpbmRpbmcgY2hlY2tlZFR5cGUgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKLQkJaWYgKGV4cHJlc3Npb25UeXBlID09IG51bGwgfHwgY2hlY2tlZFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghY2hlY2tlZFR5cGUuaXNSZWlmaWFibGUoKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbEluc3RhbmNlT2ZHZW5lcmljVHlwZShjaGVja2VkVHlwZSwgdGhpcyk7Ci0JCX0gZWxzZSBpZiAoKGV4cHJlc3Npb25UeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwgJiYgZXhwcmVzc2lvblR5cGUuaXNCYXNlVHlwZSgpKSAvLyBkaXNhbGxvdyBhdXRvYm94aW5nCi0JCQkJfHwgIWNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgY2hlY2tlZFR5cGUsIGV4cHJlc3Npb25UeXBlLCBudWxsKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3IodGhpcywgZXhwcmVzc2lvblR5cGUsIGNoZWNrZWRUeXBlKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBUeXBlQmluZGluZy5CT09MRUFOOworcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCXRoaXMuZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCXRoaXMudHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3RhZ0FzVW5uZWNlc3NhcnlDYXN0KFNjb3BlLFR5cGVCaW5kaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRhZ0FzVW5uZWNlc3NhcnlDYXN0KFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBjYXN0VHlwZSkgewotCQkvLyBudWxsIGlzIG5vdCBpbnN0YW5jZW9mIFR5cGUsIHJlY29nbml6ZSBkaXJlY3Qgc2NlbmFyaW8KLQkJaWYgKGV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwpCi0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUluc3RhbmNlb2YodGhpcywgY2FzdFR5cGUpOwotCX0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQotCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKLQkJCWV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Ci0JfQorCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnRMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQppbmRleCAxOTU0MzlkLi4yZmE0MDcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxNDAgKzEwLDE2NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5JbnRDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CiAKIHB1YmxpYyBjbGFzcyBJbnRMaXRlcmFsIGV4dGVuZHMgTnVtYmVyTGl0ZXJhbCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWEFfTUlOX1ZBTFVFICAgICAgICA9ICIweDgwMDAwMDAwIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWEFfTUlOVVNfT05FX1ZBTFVFICA9ICIweGZmZmZmZmZmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE9DVEFMX01JTl9WQUxVRSAgICAgICA9ICIwMjAwMDAwMDAwMDAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gT0NUQUxfTUlOVVNfT05FX1ZBTFVFID0gIjAzNzc3Nzc3Nzc3NyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBERUNJTUFMX01JTl9WQUxVRSAgICAgPSAiMjE0NzQ4MzY0OCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBERUNJTUFMX01BWF9WQUxVRSAgICAgPSAiMjE0NzQ4MzY0NyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBjaGFyW10gcmVkdWNlZEZvcm07IC8vIG5vIHVuZGVyc2NvcmVzCisKIAlwdWJsaWMgaW50IHZhbHVlOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGl0ZXJhbAotCQlPbmUgPSBuZXcgSW50TGl0ZXJhbChuZXcgY2hhcltdeycxJ30sMCwwLDEpOy8vdXNlZCBmb3IgKysgYW5kIC0tIAogCi0Jc3RhdGljIGZpbmFsIENvbnN0YW50IEZPUk1BVF9FUlJPUiA9IERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZSgxLjAvMC4wKTsgLy8gTmFOOwotcHVibGljIEludExpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgcywgaW50IGUpIHsKLQlzdXBlcih0b2tlbiwgcyxlKTsKKwkvL3VzZWQgZm9yICsrIGFuZCAtLQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGl0ZXJhbCBPbmUgPSBuZXcgSW50TGl0ZXJhbChuZXcgY2hhcltdeycxJ30sIG51bGwsIDAsIDAsIDEsIEludENvbnN0YW50LmZyb21WYWx1ZSgxKSk7CisKKwlwdWJsaWMgc3RhdGljIEludExpdGVyYWwgYnVpbGRJbnRMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJCS8vIHJlbW92ZSAnXycgYW5kIHByZWZpeCAnMCcgZmlyc3QKKwkJY2hhcltdIGludFJlZHVjZWRUb2tlbiA9IHJlbW92ZVByZWZpeFplcm9zQW5kVW5kZXJzY29yZXModG9rZW4sIGZhbHNlKTsKKwkJc3dpdGNoKGludFJlZHVjZWRUb2tlbi5sZW5ndGgpIHsKKwkJCWNhc2UgMTAgOgorCQkJCS8vIDB4ODAwMDAwMDAKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW50UmVkdWNlZFRva2VuLCBIRVhBX01JTl9WQUxVRSkpIHsKKwkJCQkJcmV0dXJuIG5ldyBJbnRMaXRlcmFsTWluVmFsdWUodG9rZW4sIGludFJlZHVjZWRUb2tlbiAhPSB0b2tlbiA/IGludFJlZHVjZWRUb2tlbiA6IG51bGwsIHMsIGUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTIgOgorCQkJCS8vIDAyMDAwMDAwMDAwMAorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhpbnRSZWR1Y2VkVG9rZW4sIE9DVEFMX01JTl9WQUxVRSkpIHsKKwkJCQkJcmV0dXJuIG5ldyBJbnRMaXRlcmFsTWluVmFsdWUodG9rZW4sIGludFJlZHVjZWRUb2tlbiAhPSB0b2tlbiA/IGludFJlZHVjZWRUb2tlbiA6IG51bGwsIHMsIGUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbmV3IEludExpdGVyYWwodG9rZW4sIGludFJlZHVjZWRUb2tlbiAhPSB0b2tlbiA/IGludFJlZHVjZWRUb2tlbiA6IG51bGwsIHMsIGUpOworCX0KK0ludExpdGVyYWwoY2hhcltdIHRva2VuLCBjaGFyW10gcmVkdWNlZEZvcm0sIGludCBzdGFydCwgaW50IGVuZCkgeworCXN1cGVyKHRva2VuLCBzdGFydCwgZW5kKTsKKwl0aGlzLnJlZHVjZWRGb3JtID0gcmVkdWNlZEZvcm07CiB9Ci1wdWJsaWMgSW50TGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLGludCBlLCBpbnQgdmFsdWUpIHsKLQl0aGlzKHRva2VuLCBzLGUpOworSW50TGl0ZXJhbChjaGFyW10gdG9rZW4sIGNoYXJbXSByZWR1Y2VkRm9ybSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgdmFsdWUsIENvbnN0YW50IGNvbnN0YW50KSB7CisJc3VwZXIodG9rZW4sIHN0YXJ0LCBlbmQpOworCXRoaXMucmVkdWNlZEZvcm0gPSByZWR1Y2VkRm9ybTsKIAl0aGlzLnZhbHVlID0gdmFsdWU7Ci19Ci1wdWJsaWMgSW50TGl0ZXJhbChpbnQgaW50VmFsdWUpIHsKLQkvL3NwZWNpYWwgb3B0aW1pemVkIGNvbnN0cnVjdG9yIDogdGhlIGNzdCBpcyB0aGUgYXJndW1lbnQgCi0KLQkvL3ZhbHVlIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0JLy8JdG9rZW5zID0gbnVsbCA7Ci0JLy8Jc291cmNlU3RhcnQgPSAwOwotCS8vCXNvdXJjZUVuZCA9IDA7Ci0Jc3VwZXIobnVsbCwwLDApOwotCWNvbnN0YW50ID0gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGludFZhbHVlKTsKLQl2YWx1ZSA9IGludFZhbHVlOwotCQorCXRoaXMuY29uc3RhbnQgPSBjb25zdGFudDsKIH0KIHB1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKLQkvL2Egc3BlY2lhbCBjb25zdGFudCBpcyB1c2UgZm9yIHRoZSBwb3RlbnRpYWwgSW50ZWdlci5NQVhfVkFMVUUrMQotCS8vd2hpY2ggaXMgbGVnYWwgaWYgdXNlZCB3aXRoIGEgLSBhcyBwcmVmaXguLi4uY29vbC4uLi4KLQkvL25vdGljZSB0aGF0IEludGVnZXIuTUlOX1ZBTFVFICA9PSAtMjE0NzQ4MzY0OAotCi0JbG9uZyBNQVggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQlpZiAodGhpcyA9PSBPbmUpIHsJY29uc3RhbnQgPSBJbnRDb25zdGFudC5mcm9tVmFsdWUoMSk7IHJldHVybiA7fQotCQotCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwotCWxvbmcgY29tcHV0ZWRWYWx1ZSA9IDBMOwotCWlmIChzb3VyY2VbMF0gPT0gJzAnKQotCXsJTUFYID0gMHhGRkZGRkZGRkwgOyAvL2EgbG9uZyBpbiBvcmRlciB0byBiZSBwb3NpdGl2ZSAhIAkKLQkJaWYgKGxlbmd0aCA9PSAxKSB7CWNvbnN0YW50ID0gSW50Q29uc3RhbnQuZnJvbVZhbHVlKDApOyByZXR1cm4gO30KLQkJZmluYWwgaW50IHNoaWZ0LHJhZGl4OwotCQlpbnQgaiA7Ci0JCWlmICggKHNvdXJjZVsxXSA9PSAneCcpIHx8IChzb3VyY2VbMV0gPT0gJ1gnKSApCi0JCXsJc2hpZnQgPSA0IDsgaiA9IDI7IHJhZGl4ID0gMTY7fQotCQllbHNlCi0JCXsJc2hpZnQgPSAzIDsgaiA9IDE7IHJhZGl4ID0gODt9Ci0JCXdoaWxlIChzb3VyY2Vbal09PScwJykgCi0JCXsJaisrOyAvL2p1bXAgb3ZlciByZWRvbmRhbnQgemVybwotCQkJaWYgKGogPT0gbGVuZ3RoKQotCQkJewkvL3dhdGNoIGZvciAwMDAwMDAwMDAwMDAwMDAwMDAKLQkJCQljb25zdGFudCA9IEludENvbnN0YW50LmZyb21WYWx1ZSh2YWx1ZSA9IChpbnQpY29tcHV0ZWRWYWx1ZSk7Ci0JCQkJcmV0dXJuIDt9fQotCQkKLQkJd2hpbGUgKGo8bGVuZ3RoKQotCQl7CWludCBkaWdpdFZhbHVlIDsKLQkJCWlmICgoZGlnaXRWYWx1ZSA9IFNjYW5uZXJIZWxwZXIuZGlnaXQoc291cmNlW2orK10scmFkaXgpKQk8IDAgKSAJCi0JCQl7CWNvbnN0YW50ID0gRk9STUFUX0VSUk9SOyByZXR1cm4gO30KLQkJCWNvbXB1dGVkVmFsdWUgPSAoY29tcHV0ZWRWYWx1ZTw8c2hpZnQpIHwgZGlnaXRWYWx1ZSA7Ci0JCQlpZiAoY29tcHV0ZWRWYWx1ZSA+IE1BWCkgcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovIDt9fQotCWVsc2UKLQl7CS8vLS0tLS0tLS0tLS1yZWd1bGFyIGNhc2UgOiByYWRpeCA9IDEwLS0tLS0tLS0tLS0KLQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoO2krKykKLQkJewlpbnQgZGlnaXRWYWx1ZSA7Ci0JCQlpZiAoKGRpZ2l0VmFsdWUgPSBTY2FubmVySGVscGVyLmRpZ2l0KHNvdXJjZVtpXSwxMCkpCTwgMCApIAotCQkJewljb25zdGFudCA9IEZPUk1BVF9FUlJPUjsgcmV0dXJuIDt9Ci0JCQljb21wdXRlZFZhbHVlID0gMTAqY29tcHV0ZWRWYWx1ZSArIGRpZ2l0VmFsdWU7Ci0JCQlpZiAoY29tcHV0ZWRWYWx1ZSA+IE1BWCkgcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovIDsgfX0KLQotCWNvbnN0YW50ID0gSW50Q29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlID0gKGludCljb21wdXRlZFZhbHVlKTsKLQkJCisJY2hhcltdIHRva2VuID0gdGhpcy5yZWR1Y2VkRm9ybSAhPSBudWxsID8gdGhpcy5yZWR1Y2VkRm9ybSA6IHRoaXMuc291cmNlOworCWludCB0b2tlbkxlbmd0aCA9IHRva2VuLmxlbmd0aDsKKwlpbnQgcmFkaXggPSAxMDsKKwlpbnQgaiA9IDA7CisJaWYgKHRva2VuWzBdID09ICcwJykgeworCQlpZiAodG9rZW5MZW5ndGggPT0gMSkgeworCQkJdGhpcy5jb25zdGFudCA9IEludENvbnN0YW50LmZyb21WYWx1ZSgwKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKHRva2VuWzFdID09ICd4JykgfHwgKHRva2VuWzFdID09ICdYJykpIHsKKwkJCXJhZGl4ID0gMTY7CisJCQlqID0gMjsKKwkJfSBlbHNlIGlmICgodG9rZW5bMV0gPT0gJ2InKSB8fCAodG9rZW5bMV0gPT0gJ0InKSkgeworCQkJcmFkaXggPSAyOworCQkJaiA9IDI7CisJCX0gZWxzZSB7CisJCQlyYWRpeCA9IDg7CisJCQlqID0gMTsKKwkJfQorCX0KKwlzd2l0Y2gocmFkaXgpIHsKKwkJY2FzZSAyIDoKKwkJCWlmICgodG9rZW5MZW5ndGggLSAyKSA+IDMyKSB7CisJCQkJLy8gcmVtb3ZlIDBiIG9yIDBCCisJCQkJcmV0dXJuOyAvKmNvbnN0YW50IHN0YXlzIG51bGwqLworCQkJfQorCQkJY29tcHV0ZVZhbHVlKHRva2VuLCB0b2tlbkxlbmd0aCwgcmFkaXgsIGopOworCQkJcmV0dXJuOworCQljYXNlIDE2IDoKKwkJCWlmICh0b2tlbkxlbmd0aCA8PSAxMCkgeworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0b2tlbiwgSEVYQV9NSU5VU19PTkVfVkFMVUUpKSB7CisJCQkJCXRoaXMuY29uc3RhbnQgPSBJbnRDb25zdGFudC5mcm9tVmFsdWUoLTEpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWNvbXB1dGVWYWx1ZSh0b2tlbiwgdG9rZW5MZW5ndGgsIHJhZGl4LCBqKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxMCA6CisJCQlpZiAodG9rZW5MZW5ndGggPiBERUNJTUFMX01BWF9WQUxVRS5sZW5ndGgKKwkJCQkJfHwgKHRva2VuTGVuZ3RoID09IERFQ0lNQUxfTUFYX1ZBTFVFLmxlbmd0aAorCQkJCQkJCSYmIENoYXJPcGVyYXRpb24uY29tcGFyZVRvKHRva2VuLCBERUNJTUFMX01BWF9WQUxVRSkgPiAwKSkgeworCQkJCXJldHVybjsgLypjb25zdGFudCBzdGF5cyBudWxsKi8KKwkJCX0KKwkJCWNvbXB1dGVWYWx1ZSh0b2tlbiwgdG9rZW5MZW5ndGgsIHJhZGl4LCBqKTsKKwkJCWJyZWFrOworCQljYXNlIDggOgorCQkJaWYgKHRva2VuTGVuZ3RoIDw9IDEyKSB7CisJCQkJaWYgKHRva2VuTGVuZ3RoID09IDEyICYmIHRva2VuW2pdID4gJzQnKSB7CisJCQkJCXJldHVybjsgLypjb25zdGFudCBzdGF5cyBudWxsKi8KKwkJCQl9CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRva2VuLCBPQ1RBTF9NSU5VU19PTkVfVkFMVUUpKSB7CisJCQkJCXRoaXMuY29uc3RhbnQgPSBJbnRDb25zdGFudC5mcm9tVmFsdWUoLTEpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWNvbXB1dGVWYWx1ZSh0b2tlbiwgdG9rZW5MZW5ndGgsIHJhZGl4LCBqKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwl9Cit9Citwcml2YXRlIHZvaWQgY29tcHV0ZVZhbHVlKGNoYXJbXSB0b2tlbiwgaW50IHRva2VuTGVuZ3RoLCBpbnQgcmFkaXgsIGludCBqKSB7CisJaW50IGRpZ2l0VmFsdWU7CisJaW50IGNvbXB1dGVkVmFsdWUgPSAwOworCXdoaWxlIChqIDwgdG9rZW5MZW5ndGgpIHsKKwkJaWYgKChkaWdpdFZhbHVlID0gU2Nhbm5lckhlbHBlci5kaWdpdCh0b2tlbltqKytdLHJhZGl4KSkgPCAwKSB7CisJCQlyZXR1cm47IC8qY29uc3RhbnQgc3RheXMgbnVsbCovCisJCX0KKwkJY29tcHV0ZWRWYWx1ZSA9IChjb21wdXRlZFZhbHVlICogcmFkaXgpICsgZGlnaXRWYWx1ZSA7CisJfQorCXRoaXMuY29uc3RhbnQgPSBJbnRDb25zdGFudC5mcm9tVmFsdWUoY29tcHV0ZWRWYWx1ZSk7Cit9CitwdWJsaWMgSW50TGl0ZXJhbCBjb252ZXJ0VG9NaW5WYWx1ZSgpIHsKKwlpZiAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgIT0gMCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJY2hhcltdIHRva2VuID0gdGhpcy5yZWR1Y2VkRm9ybSAhPSBudWxsID8gdGhpcy5yZWR1Y2VkRm9ybSA6IHRoaXMuc291cmNlOworCXN3aXRjaCh0b2tlbi5sZW5ndGgpIHsKKwkJY2FzZSAxMCA6CisJCQkvLyAyMTQ3NDgzNjQ4CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIERFQ0lNQUxfTUlOX1ZBTFVFKSkgeworCQkJCXJldHVybiBuZXcgSW50TGl0ZXJhbE1pblZhbHVlKHRoaXMuc291cmNlLCB0aGlzLnJlZHVjZWRGb3JtLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHRoaXM7CiB9CiAvKioKLSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgaW50IGxpdGVyYWwKKyAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgbG9uZyBsaXRlcmFsCiAgKgogICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKICAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KICAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KLSAqLyAKKyAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogfQorCiBwdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCXJldHVybiBUeXBlQmluZGluZy5JTlQ7CiB9Ci1wdWJsaWMgZmluYWwgYm9vbGVhbiBtYXlSZXByZXNlbnRNSU5fVkFMVUUoKXsKLQkvL2Egc3BlY2lhbCBhdXRvcml6ZWQgaW50IGxpdGVycmFsIGlzIDIxNDc0ODM2NDgKLQkvL3doaWNoIGlzIE9ORSBvdmVyIHRoZSBsaW1pdC4gVGhpcyBzcGVjaWFsIGNhc2UgCi0JLy9vbmx5IGlzIHVzZWQgaW4gY29tYmluYWlzb24gd2l0aCAtIHRvIGRlbm90ZQotCS8vdGhlIG1pbmltYWwgdmFsdWUgb2YgaW50IC0yMTQ3NDgzNjQ4Ci0KLQlyZXR1cm4gKChzb3VyY2UubGVuZ3RoID09IDEwKSAmJgotCQkJKHNvdXJjZVswXSA9PSAnMicpICYmCi0JCQkoc291cmNlWzFdID09ICcxJykgJiYKLQkJCShzb3VyY2VbMl0gPT0gJzQnKSAmJgotCQkJKHNvdXJjZVszXSA9PSAnNycpICYmCQkJCi0JCQkoc291cmNlWzRdID09ICc0JykgJiYKLQkJCShzb3VyY2VbNV0gPT0gJzgnKSAmJgotCQkJKHNvdXJjZVs2XSA9PSAnMycpICYmCi0JCQkoc291cmNlWzddID09ICc2JykgJiYJCQkKLQkJCShzb3VyY2VbOF0gPT0gJzQnKSAmJgotCQkJKHNvdXJjZVs5XSA9PSAnOCcpICYmCi0JCQkoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgPT0gMCkpOwotfQotcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkvLyB0aGUgZm9ybWF0IG1heSBiZSBpbmNvcnJlY3Qgd2hpbGUgdGhlIHNjYW5uZXIgY291bGQgZGV0ZWN0Ci0JLy8gc3VjaCBhbiBlcnJvciBvbmx5IG9uIHBhaW5mdWxsIHRlc3RzLi4uZWFzaWVyIGFuZCBmYXN0ZXIgaGVyZQotCi0JVHlwZUJpbmRpbmcgdGIgPSBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JaWYgKGNvbnN0YW50ID09IEZPUk1BVF9FUlJPUikgewotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29uc3RhbnRPdXRPZkZvcm1hdCh0aGlzKTsKLQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBudWxsOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIHRiOwotfQotcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCl7Ci0KLQlpZiAoc291cmNlID09IG51bGwpIHsKLQkvKiBzcGVjaWFsIG9wdGltaXplZCBJbnRMaXRlcmFsIHRoYXQgYXJlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyICovCi0JCXJldHVybiBvdXRwdXQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7Ci0JfQotCXJldHVybiBzdXBlci5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOwotfQotCQogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnRMaXRlcmFsTWluVmFsdWUuamF2YQppbmRleCA4ZmI5MmJiLi5mMTc1ZmU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW50TGl0ZXJhbE1pblZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsMTMgKzE1LDExIEBACiBwdWJsaWMgY2xhc3MgSW50TGl0ZXJhbE1pblZhbHVlIGV4dGVuZHMgSW50TGl0ZXJhbCB7CiAKIAlmaW5hbCBzdGF0aWMgY2hhcltdIENoYXJWYWx1ZSA9IG5ldyBjaGFyW117Jy0nLCcyJywnMScsJzQnLCc3JywnNCcsJzgnLCczJywnNicsJzQnLCc4J307Ci0JZmluYWwgc3RhdGljIENvbnN0YW50IE1JTl9WQUxVRSA9IEludENvbnN0YW50LmZyb21WYWx1ZShJbnRlZ2VyLk1JTl9WQUxVRSkgOyAKIAotcHVibGljIEludExpdGVyYWxNaW5WYWx1ZSgpIHsKLQlzdXBlcihDaGFyVmFsdWUsMCwwLEludGVnZXIuTUlOX1ZBTFVFKTsKLQljb25zdGFudCA9IE1JTl9WQUxVRTsKK3B1YmxpYyBJbnRMaXRlcmFsTWluVmFsdWUoY2hhcltdIHRva2VuLCBjaGFyW10gcmVkdWNlZFRva2VuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlzdXBlcih0b2tlbiwgcmVkdWNlZFRva2VuLCBzdGFydCwgZW5kLCBJbnRlZ2VyLk1JTl9WQUxVRSwgSW50Q29uc3RhbnQuZnJvbVZhbHVlKEludGVnZXIuTUlOX1ZBTFVFKSk7CiB9CisKIHB1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpewotCQogCS8qcHJlY29tcHV0ZWQgYXQgY3JlYXRpb24gdGltZSovIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvYy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jLmphdmEKaW5kZXggZTk0OGU5My4uYmE4OGE2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNiArMTMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1RhZ0NvbnN0YW50czsKIApAQCAtMjYsNyArMjcsNyBAQAogCXB1YmxpYyBUeXBlUmVmZXJlbmNlW10gZXhjZXB0aW9uUmVmZXJlbmNlczsgLy8gQHRocm93cywgQGV4Y2VwdGlvbgogCXB1YmxpYyBKYXZhZG9jUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudDsgLy8gQHJldHVybgogCXB1YmxpYyBFeHByZXNzaW9uW10gc2VlUmVmZXJlbmNlczsgLy8gQHNlZQotCXB1YmxpYyBsb25nIGluaGVyaXRlZFBvc2l0aW9ucyA9IC0xOworCXB1YmxpYyBsb25nW10gaW5oZXJpdGVkUG9zaXRpb25zID0gbnVsbDsKIAkvLyBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxNjAwCiAJLy8gU3RvcmUgcGFyYW0gcmVmZXJlbmNlcyBmb3IgdGFnIHdpdGggaW52YWxpZCBzeW50YXgKIAlwdWJsaWMgSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2VbXSBpbnZhbGlkUGFyYW1ldGVyczsgLy8gQHBhcmFtCkBAIC0zNyw2ICszOCw3IEBACiAJcHVibGljIEphdmFkb2MoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKIAkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlJlc29sdmVKYXZhZG9jOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgYSB0eXBlIGNhbiBiZSBzZWVuIGF0IGEgZ2l2ZW4gdmlzaWJpbGl0eSBsZXZlbCBvciBub3QuCkBAIC0xNDksMTMgKzE1MSwxMyBAQAogCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCIvKipcbiIpOyAvLyROT04tTkxTLTEkCiAJCWlmICh0aGlzLnBhcmFtUmVmZXJlbmNlcyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXJhbVJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlwcmludEluZGVudChpbmRlbnQgKyAxLCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtICIpOyAvLyROT04tTkxTLTEkCQkKKwkJCQlwcmludEluZGVudChpbmRlbnQgKyAxLCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtICIpOyAvLyROT04tTkxTLTEkCiAJCQkJdGhpcy5wYXJhbVJlZmVyZW5jZXNbaV0ucHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnXG4nKTsKIAkJCX0KIAkJfQogCQlpZiAodGhpcy5wYXJhbVR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhcmFtVHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlwcmludEluZGVudChpbmRlbnQgKyAxLCBvdXRwdXQpLmFwcGVuZCgiICogQHBhcmFtIDwiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50ICsgMSwgb3V0cHV0KS5hcHBlbmQoIiAqIEBwYXJhbSA8Iik7IC8vJE5PTi1OTFMtMSQKIAkJCQl0aGlzLnBhcmFtVHlwZVBhcmFtZXRlcnNbaV0ucHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfQpAQCAtMTY1LDEzICsxNjcsMTMgQEAKIAkJfQogCQlpZiAodGhpcy5leGNlcHRpb25SZWZlcmVuY2VzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmV4Y2VwdGlvblJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlwcmludEluZGVudChpbmRlbnQgKyAxLCBvdXRwdXQpLmFwcGVuZCgiICogQHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50ICsgMSwgb3V0cHV0KS5hcHBlbmQoIiAqIEB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKIAkJCQl0aGlzLmV4Y2VwdGlvblJlZmVyZW5jZXNbaV0ucHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnXG4nKTsKIAkJCX0KIAkJfQogCQlpZiAodGhpcy5zZWVSZWZlcmVuY2VzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnNlZVJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlwcmludEluZGVudChpbmRlbnQgKyAxLCBvdXRwdXQpLmFwcGVuZCgiICogQHNlZSAiKTsgLy8kTk9OLU5MUy0xJAkJCisJCQkJcHJpbnRJbmRlbnQoaW5kZW50ICsgMSwgb3V0cHV0KS5hcHBlbmQoIiAqIEBzZWUgIik7IC8vJE5PTi1OTFMtMSQKIAkJCQl0aGlzLnNlZVJlZmVyZW5jZXNbaV0ucHJpbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnXG4nKTsKIAkJCX0KIAkJfQpAQCAtMTgzLDcgKzE4NSwxOSBAQAogCSAqIFJlc29sdmUgdHlwZSBqYXZhZG9jCiAJICovCiAJcHVibGljIHZvaWQgcmVzb2x2ZShDbGFzc1Njb3BlIHNjb3BlKSB7Ci0KKwkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc29sdmVKYXZhZG9jKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzAzNywgQGluaGVyaXREb2MgdGFnIGNhbm5vdAorCQkvLyBiZSB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgZm9yIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLgorCQlpZiAodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IHRoaXMuaW5oZXJpdGVkUG9zaXRpb25zLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKwkJCQlpbnQgc3RhcnQgPSAoaW50KSAodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnNbaV0gPj4+IDMyKTsKKwkJCQlpbnQgZW5kID0gKGludCkgdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnNbaV07CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcoc3RhcnQsIGVuZCk7CisJCQl9CisJCX0KIAkJLy8gQHBhcmFtIHRhZ3MKIAkJaW50IHBhcmFtVGFnc1NpemUgPSB0aGlzLnBhcmFtUmVmZXJlbmNlcyA9PSBudWxsID8gMCA6IHRoaXMucGFyYW1SZWZlcmVuY2VzLmxlbmd0aDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVRhZ3NTaXplOyBpKyspIHsKQEAgLTIzNCw2NCArMjQ4LDcwIEBACiAJICogUmVzb2x2ZSBjb21waWxhdGlvbiB1bml0IGphdmFkb2MKIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNvbHZlKENvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSkgewotCQkvLyBkbyBub3RoaW5nCisJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5SZXNvbHZlSmF2YWRvYykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIERvIG5vdGhpbmcgLSBUaGlzIGlzIHRvIG1pbWljIHRoZSBTREsncyBqYXZhZG9jIHRvb2wgYmVoYXZpb3IsIHdoaWNoIG5laXRoZXIKKwkJLy8gc2FuaXR5IGNoZWNrcyBub3IgZ2VuZXJhdGVzIGRvY3VtZW50YXRpb24gdXNpbmcgY29tbWVudHMgYXQgdGhlIENVIHNjb3BlIAorCQkvLyAodW5sZXNzIHRoZSB1bml0IGhhcHBlbnMgdG8gYmUgcGFja2FnZS1pbmZvLmphdmEgLSBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGNvbWUgaGVyZS4pIAogCX0KIAogCS8qCiAJICogUmVzb2x2ZSBtZXRob2QgamF2YWRvYwogCSAqLwogCXB1YmxpYyB2b2lkIHJlc29sdmUoTWV0aG9kU2NvcGUgbWV0aFNjb3BlKSB7Ci0JCQorCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzb2x2ZUphdmFkb2MpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQogCQkvLyBnZXQgbWV0aG9kIGRlY2xhcmF0aW9uCiAJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aERlY2wgPSBtZXRoU2NvcGUucmVmZXJlbmNlTWV0aG9kKCk7CiAJCWJvb2xlYW4gb3ZlcnJpZGluZyA9IG1ldGhEZWNsID09IG51bGwgLyogZmllbGQgZGVjbGFyYXRpb24gKi8gfHwgbWV0aERlY2wuYmluZGluZyA9PSBudWxsIC8qIGNvbXBpbGVyIGVycm9yICovCiAJCQk/IGZhbHNlIDoKIAkJCSFtZXRoRGVjbC5iaW5kaW5nLmlzU3RhdGljKCkgJiYgKChtZXRoRGVjbC5iaW5kaW5nLm1vZGlmaWVycyAmIChFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0ltcGxlbWVudGluZyB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykpICE9IDApOwotCQkKKwogCQkvLyBAc2VlIHRhZ3MKIAkJaW50IHNlZVRhZ3NMZW5ndGggPSB0aGlzLnNlZVJlZmVyZW5jZXMgPT0gbnVsbCA/IDAgOiB0aGlzLnNlZVJlZmVyZW5jZXMubGVuZ3RoOwogCQlib29sZWFuIHN1cGVyUmVmID0gZmFsc2U7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VlVGFnc0xlbmd0aDsgaSsrKSB7Ci0JCQkKKwogCQkJLy8gUmVzb2x2ZSByZWZlcmVuY2UKIAkJCXJlc29sdmVSZWZlcmVuY2UodGhpcy5zZWVSZWZlcmVuY2VzW2ldLCBtZXRoU2NvcGUpOwotCQkJCisKIAkJCS8vIHNlZSB3aGV0aGVyIHdlIGNhbiBoYXZlIGEgc3VwZXIgcmVmZXJlbmNlCi0JCQlpZiAobWV0aERlY2wgIT0gbnVsbCAmJiAobWV0aERlY2wuaXNDb25zdHJ1Y3RvcigpIHx8IG92ZXJyaWRpbmcpICYmICFzdXBlclJlZikgewotCQkJCWlmICh0aGlzLnNlZVJlZmVyZW5jZXNbaV0gaW5zdGFuY2VvZiBKYXZhZG9jTWVzc2FnZVNlbmQpIHsKLQkJCQkJSmF2YWRvY01lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKEphdmFkb2NNZXNzYWdlU2VuZCkgdGhpcy5zZWVSZWZlcmVuY2VzW2ldOwotCQkJCQkvLyBpZiBiaW5kaW5nIGlzIHZhbGlkIHRoZW4gbG9vayBpZiB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIG92ZXJyaWRlbiBtZXRob2QvY29uc3RydWN0b3IKLQkJCQkJaWYgKG1lc3NhZ2VTZW5kLmJpbmRpbmcgIT0gbnVsbCAmJiBtZXNzYWdlU2VuZC5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgJiYgbWVzc2FnZVNlbmQuYWN0dWFsUmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJCQkJUmVmZXJlbmNlQmluZGluZyBtZXRob2RSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgbWVzc2FnZVNlbmQuYWN0dWFsUmVjZWl2ZXJUeXBlOwotCQkJCQkJaWYgKChtZXRob2RSZWNlaXZlclR5cGUuaXNTdXBlcmNsYXNzT2YobWV0aERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcykgfHwgKG1ldGhvZFJlY2VpdmVyVHlwZS5pc0ludGVyZmFjZSgpICYmIG1ldGhEZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShtZXRob2RSZWNlaXZlclR5cGUsIHRydWUpKSkgJiYKLQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5lcXVhbHMobWVzc2FnZVNlbmQuc2VsZWN0b3IsIG1ldGhEZWNsLnNlbGVjdG9yKSAmJgotCQkJCQkJCQkobWV0aERlY2wuYmluZGluZy5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgobWVzc2FnZVNlbmQuYmluZGluZy5yZXR1cm5UeXBlKSkpIHsKLQkJCQkJCQlpZiAobWVzc2FnZVNlbmQuYXJndW1lbnRzID09IG51bGwgJiYgbWV0aERlY2wuYXJndW1lbnRzID09IG51bGwpIHsKLQkJCQkJCQkJc3VwZXJSZWYgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChtZXNzYWdlU2VuZC5hcmd1bWVudHMgIT0gbnVsbCAmJiBtZXRoRGVjbC5hcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlzdXBlclJlZiA9IG1ldGhEZWNsLmJpbmRpbmcuYXJlUGFyYW1ldGVyRXJhc3VyZXNFcXVhbChtZXNzYWdlU2VuZC5iaW5kaW5nKTsKKwkJCWlmIChtZXRoRGVjbCAhPSBudWxsICYmICFzdXBlclJlZikgeworCQkJCWlmICghbWV0aERlY2wuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJCWlmIChvdmVycmlkaW5nICYmIHRoaXMuc2VlUmVmZXJlbmNlc1tpXSBpbnN0YW5jZW9mIEphdmFkb2NNZXNzYWdlU2VuZCkgeworCQkJCQkJSmF2YWRvY01lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKEphdmFkb2NNZXNzYWdlU2VuZCkgdGhpcy5zZWVSZWZlcmVuY2VzW2ldOworCQkJCQkJLy8gaWYgYmluZGluZyBpcyB2YWxpZCB0aGVuIGxvb2sgaWYgd2UgaGF2ZSBhIHJlZmVyZW5jZSB0byBhbiBvdmVycmlkZW4gbWV0aG9kL2NvbnN0cnVjdG9yCisJCQkJCQlpZiAobWVzc2FnZVNlbmQuYmluZGluZyAhPSBudWxsICYmIG1lc3NhZ2VTZW5kLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSAmJiBtZXNzYWdlU2VuZC5hY3R1YWxSZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBtZXRob2RSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgbWVzc2FnZVNlbmQuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IG1ldGhEZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShtZXRob2RSZWNlaXZlclR5cGUpOworCQkJCQkJCWlmIChzdXBlclR5cGUgIT0gbnVsbCAmJiBzdXBlclR5cGUub3JpZ2luYWwoKSAhPSBtZXRoRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1lc3NhZ2VTZW5kLnNlbGVjdG9yLCBtZXRoRGVjbC5zZWxlY3RvcikpIHsKKwkJCQkJCQkJaWYgKG1ldGhTY29wZS5lbnZpcm9ubWVudCgpLm1ldGhvZFZlcmlmaWVyKCkuZG9lc01ldGhvZE92ZXJyaWRlKG1ldGhEZWNsLmJpbmRpbmcsIG1lc3NhZ2VTZW5kLmJpbmRpbmcub3JpZ2luYWwoKSkpIHsKKwkJCQkJCQkJCXN1cGVyUmVmID0gdHJ1ZTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0aGlzLnNlZVJlZmVyZW5jZXNbaV0gaW5zdGFuY2VvZiBKYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwkJCQl9IGVsc2UgaWYgKHRoaXMuc2VlUmVmZXJlbmNlc1tpXSBpbnN0YW5jZW9mIEphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbikgewogCQkJCQlKYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHIgPSAoSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKSB0aGlzLnNlZVJlZmVyZW5jZXNbaV07CiAJCQkJCS8vIGlmIGJpbmRpbmcgaXMgdmFsaWQgdGhlbiBsb29rIGlmIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gb3ZlcnJpZGVuIG1ldGhvZC9jb25zdHJ1Y3RvcgogCQkJCQlpZiAoYWxsb2NhdGlvbkV4cHIuYmluZGluZyAhPSBudWxsICYmIGFsbG9jYXRpb25FeHByLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJaWYgKG1ldGhEZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNDb21wYXRpYmxlV2l0aChhbGxvY2F0aW9uRXhwci5yZXNvbHZlZFR5cGUpKSB7Ci0JCQkJCQkJaWYgKGFsbG9jYXRpb25FeHByLmFyZ3VtZW50cyA9PSBudWxsICYmIG1ldGhEZWNsLmFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCQkJCQkJCXN1cGVyUmVmID0gdHJ1ZTsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGFsbG9jYXRpb25FeHByLnJlc29sdmVkVHlwZS5vcmlnaW5hbCgpOworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgbWV0aERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGFsbG9jVHlwZSk7CisJCQkJCQlpZiAoc3VwZXJUeXBlICE9IG51bGwgJiYgc3VwZXJUeXBlLm9yaWdpbmFsKCkgIT0gbWV0aERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcykgeworCQkJCQkJCU1ldGhvZEJpbmRpbmcgc3VwZXJDb25zdHJ1Y3RvciA9IG1ldGhTY29wZS5nZXRDb25zdHJ1Y3RvcihzdXBlclR5cGUsIG1ldGhEZWNsLmJpbmRpbmcucGFyYW1ldGVycywgYWxsb2NhdGlvbkV4cHIpOworCQkJCQkJCWlmIChzdXBlckNvbnN0cnVjdG9yLmlzVmFsaWRCaW5kaW5nKCkgJiYgc3VwZXJDb25zdHJ1Y3Rvci5vcmlnaW5hbCgpID09IGFsbG9jYXRpb25FeHByLmJpbmRpbmcub3JpZ2luYWwoKSkgeworCQkJCQkJCQlpZiAoc3VwZXJDb25zdHJ1Y3Rvci5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aERlY2wuYmluZGluZykpIHsKKwkJCQkJCQkJCXN1cGVyUmVmID0gdHJ1ZTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChhbGxvY2F0aW9uRXhwci5hcmd1bWVudHMgIT0gbnVsbCAmJiBtZXRoRGVjbC5hcmd1bWVudHMgIT0gbnVsbCAmJiBhbGxvY2F0aW9uRXhwci5hcmd1bWVudHMubGVuZ3RoID09IG1ldGhEZWNsLmFyZ3VtZW50cy5sZW5ndGgpIHsKLQkJCQkJCQkJc3VwZXJSZWYgPSBtZXRoRGVjbC5iaW5kaW5nLmFyZVBhcmFtZXRlcnNDb21wYXRpYmxlV2l0aChhbGxvY2F0aW9uRXhwci5iaW5kaW5nLnBhcmFtZXRlcnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KKwkJCQkJCX0JCQkJCQkKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQkvLyBMb29rIGF0IEBPdmVycmlkZSBhbm5vdGF0aW9ucwogCQlpZiAoIXN1cGVyUmVmICYmIG1ldGhEZWNsICE9IG51bGwgJiYgbWV0aERlY2wuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkJaW50IGxlbmd0aCA9IG1ldGhEZWNsLmFubm90YXRpb25zLmxlbmd0aDsKQEAgLTI5OSwxOSArMzE5LDIyIEBACiAJCQkJc3VwZXJSZWYgPSAobWV0aERlY2wuYmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uT3ZlcnJpZGUpICE9IDA7CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gU3RvcmUgaWYgYSByZWZlcmVuY2UgZXhpc3RzIHRvIGFuIG92ZXJyaWRlbiBtZXRob2QvY29uc3RydWN0b3Igb3IgdGhlIG1ldGhvZCBpcyBpbiBhIGxvY2FsIHR5cGUsCi0JCWJvb2xlYW4gcmVwb3J0TWlzc2luZyA9IG1ldGhEZWNsID09IG51bGwgfHwgISgob3ZlcnJpZGluZyAmJiB0aGlzLmluaGVyaXRlZFBvc2l0aW9ucyAhPSAtMSkgfHwgc3VwZXJSZWYgfHwgKG1ldGhEZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAmJiBtZXRoRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTG9jYWxUeXBlKCkpKTsKLQkJaWYgKCFvdmVycmlkaW5nICYmIHRoaXMuaW5oZXJpdGVkUG9zaXRpb25zICE9IC0xKSB7Ci0JCQlpbnQgc3RhcnQgPSAoaW50KSAodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPj4+IDMyKTsKLQkJCWludCBlbmQgPSAoaW50KSB0aGlzLmluaGVyaXRlZFBvc2l0aW9uczsKLQkJCW1ldGhTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZyhzdGFydCwgZW5kKTsKKwkJYm9vbGVhbiByZXBvcnRNaXNzaW5nID0gbWV0aERlY2wgPT0gbnVsbCB8fCAhKChvdmVycmlkaW5nICYmIHRoaXMuaW5oZXJpdGVkUG9zaXRpb25zICE9IG51bGwpIHx8IHN1cGVyUmVmIHx8IChtZXRoRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgbWV0aERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSk7CisJCWlmICghb3ZlcnJpZGluZyAmJiB0aGlzLmluaGVyaXRlZFBvc2l0aW9ucyAhPSBudWxsKSB7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworCQkJCWludCBzdGFydCA9IChpbnQpICh0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1tpXSA+Pj4gMzIpOworCQkJCWludCBlbmQgPSAoaW50KSB0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1tpXTsKKwkJCQltZXRoU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcoc3RhcnQsIGVuZCk7CisJCQl9CiAJCX0KIAogCQkvLyBAcGFyYW0gdGFncwotCQlib29sZWFuIGNvbnNpZGVyUGFyYW1SZWZBc1VzYWdlID0gbWV0aFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnJlcG9ydFVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlOwotCQlyZXNvbHZlUGFyYW1UYWdzKG1ldGhTY29wZSwgcmVwb3J0TWlzc2luZywgY29uc2lkZXJQYXJhbVJlZkFzVXNhZ2UpOwotCQlyZXNvbHZlVHlwZVBhcmFtZXRlclRhZ3MobWV0aFNjb3BlLCByZXBvcnRNaXNzaW5nKTsKKwkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG1ldGhTY29wZS5jb21waWxlck9wdGlvbnMoKTsKKwkJcmVzb2x2ZVBhcmFtVGFncyhtZXRoU2NvcGUsIHJlcG9ydE1pc3NpbmcsIGNvbXBpbGVyT3B0aW9ucy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSAvKiBjb25zaWRlclBhcmFtUmVmQXNVc2FnZSovKTsKKwkJcmVzb2x2ZVR5cGVQYXJhbWV0ZXJUYWdzKG1ldGhTY29wZSwgcmVwb3J0TWlzc2luZyAmJiBjb21waWxlck9wdGlvbnMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMpOwogCiAJCS8vIEByZXR1cm4gdGFncwogCQlpZiAodGhpcy5yZXR1cm5TdGF0ZW1lbnQgPT0gbnVsbCkgewpAQCAtMzMyLDcgKzM1NSw3IEBACiAJCXJlc29sdmVUaHJvd3NUYWdzKG1ldGhTY29wZSwgcmVwb3J0TWlzc2luZyk7CiAKIAkJLy8gQHZhbHVlIHRhZwotCQlib29sZWFuIHNvdXJjZTE1ID0gbWV0aFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7CisJCWJvb2xlYW4gc291cmNlMTUgPSBjb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKIAkJaWYgKCFzb3VyY2UxNSAmJiBtZXRoRGVjbCAhPSBudWxsICYmIHRoaXMudmFsdWVQb3NpdGlvbnMgIT0gLTEpIHsKIAkJCW1ldGhTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZygoaW50KSh0aGlzLnZhbHVlUG9zaXRpb25zPj4+MzIpLCAoaW50KSB0aGlzLnZhbHVlUG9zaXRpb25zKTsKIAkJfQpAQCAtMzQzLDcgKzM2Niw3IEBACiAJCQl0aGlzLmludmFsaWRQYXJhbWV0ZXJzW2ldLnJlc29sdmUobWV0aFNjb3BlLCBmYWxzZSwgZmFsc2UpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHJlc29sdmVSZWZlcmVuY2UoRXhwcmVzc2lvbiByZWZlcmVuY2UsIFNjb3BlIHNjb3BlKSB7CiAKIAkJLy8gUGVyZm9ybSByZXNvbHZlCkBAIC0zNjMsNyArMzg2LDcgQEAKIAkJaW50IHNjb3BlTW9kaWZpZXJzID0gLTE7CiAJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBKYXZhZG9jRmllbGRSZWZlcmVuY2UpIHsKIAkJCUphdmFkb2NGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChKYXZhZG9jRmllbGRSZWZlcmVuY2UpIHJlZmVyZW5jZTsKLQkJCQorCiAJCQkvLyBWZXJpZnkgaWYgdGhpcyBpcyBhIG1ldGhvZCByZWZlcmVuY2UKIAkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxOTExCiAJCQlpZiAoZmllbGRSZWYubWV0aG9kQmluZGluZyAhPSBudWxsKSB7CkBAIC0zNzIsMTEgKzM5NSwxNiBAQAogCQkJCQlpZiAoc2NvcGVNb2RpZmllcnMgPT0gLTEpIHNjb3BlTW9kaWZpZXJzID0gc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKTsKIAkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRWYWx1ZVJlZmVyZW5jZShmaWVsZFJlZi5zb3VyY2VTdGFydCwgZmllbGRSZWYuc291cmNlRW5kLCBzY29wZU1vZGlmaWVycyk7CiAJCQkJfQotCQkJCWVsc2UgaWYgKGZpZWxkUmVmLnJlY2VpdmVyVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuaXNDb21wYXRpYmxlV2l0aChmaWVsZFJlZi5yZWNlaXZlclR5cGUpKSB7CisJCQkJZWxzZSBpZiAoZmllbGRSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKKwkJCQkJaWYgKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5pc0NvbXBhdGlibGVXaXRoKGZpZWxkUmVmLmFjdHVhbFJlY2VpdmVyVHlwZSkpIHsKIAkJCQkJCWZpZWxkUmVmLmJpdHMgfD0gQVNUTm9kZS5TdXBlckFjY2VzczsKIAkJCQkJfQotCQkJCQlmaWVsZFJlZi5tZXRob2RCaW5kaW5nID0gc2NvcGUuZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZylmaWVsZFJlZi5yZWNlaXZlclR5cGUsIGZpZWxkUmVmLnRva2VuLCBuZXcgVHlwZUJpbmRpbmdbMF0sIGZpZWxkUmVmKTsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyByZXNvbHZlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgZmllbGRSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVzb2x2ZWRUeXBlLnNvdXJjZU5hbWUoKSwgZmllbGRSZWYudG9rZW4pKSB7CisJCQkJCQlmaWVsZFJlZi5tZXRob2RCaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IocmVzb2x2ZWRUeXBlLCBCaW5kaW5nLk5PX1RZUEVTLCBmaWVsZFJlZik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmaWVsZFJlZi5tZXRob2RCaW5kaW5nID0gc2NvcGUuZmluZE1ldGhvZChyZXNvbHZlZFR5cGUsIGZpZWxkUmVmLnRva2VuLCBCaW5kaW5nLk5PX1RZUEVTLCBmaWVsZFJlZik7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAKQEAgLTM4OSw4ICs0MTcsOCBAQAogCQkJfQogCiAJCQkvLyBWZXJpZnkgdHlwZSByZWZlcmVuY2VzCi0JCQlpZiAoIWhhc1Byb2JsZW1zICYmIGZpZWxkUmVmLmJpbmRpbmcgIT0gbnVsbCAmJiBmaWVsZFJlZi5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgJiYgZmllbGRSZWYucmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGZpZWxkUmVmLnJlY2VpdmVyVHlwZTsKKwkJCWlmICghaGFzUHJvYmxlbXMgJiYgZmllbGRSZWYuYmluZGluZyAhPSBudWxsICYmIGZpZWxkUmVmLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSAmJiBmaWVsZFJlZi5hY3R1YWxSZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyByZXNvbHZlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgZmllbGRSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlOwogCQkJCXZlcmlmeVR5cGVSZWZlcmVuY2UoZmllbGRSZWYsIGZpZWxkUmVmLnJlY2VpdmVyLCBzY29wZSwgc291cmNlMTUsIHJlc29sdmVkVHlwZSwgZmllbGRSZWYuYmluZGluZy5tb2RpZmllcnMpOwogCQkJfQogCkBAIC00MzcsNyArNDY1LDcgQEAKIAkJCQl2ZXJpZnlUeXBlUmVmZXJlbmNlKGFsbG9jLCBhbGxvYy50eXBlLCBzY29wZSwgc291cmNlMTUsIHJlc29sdmVkVHlwZSwgYWxsb2MuYmluZGluZy5tb2RpZmllcnMpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIFZlcmlmeSB0aGF0IHRoZXJlJ3Mgbm8gdHlwZSB2YXJpYWJsZSByZWZlcmVuY2UKIAkJLy8gKGphdmFkb2MgZG9lcyBub3QgYWNjZXB0IHRoZW0gYW5kIHRoaXMgaXMgbm90IGEgcmVmZXJlbmNlZCBidWcgb3IgcmVxdWVzdGVkIGVuaGFuY2VtZW50KQogCQlpZiAocmVmZXJlbmNlLnJlc29sdmVkVHlwZSAhPSBudWxsICYmIHJlZmVyZW5jZS5yZXNvbHZlZFR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewpAQCAtNDYwLDcgKzQ4OCw3IEBACiAJCQl9CiAJCQlyZXR1cm47CiAJCX0KLQkJCisKIAkJLy8gSWYgbm8gcGFyYW0gdGFncyB0aGVuIHJlcG9ydCBhIHByb2JsZW0gZm9yIGVhY2ggbWV0aG9kIGFyZ3VtZW50CiAJCWludCBhcmd1bWVudHNTaXplID0gbWV0aG9kRGVjbC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBtZXRob2REZWNsLmFyZ3VtZW50cy5sZW5ndGg7CiAJCWlmIChwYXJhbVRhZ3NTaXplID09IDApIHsKQEAgLTUyOCw3ICs1NTYsNyBAQAogCQkJCS8vIElmIG5vIHJlZmVyZW5jZWQgbWV0aG9kIChmaWVsZCBpbml0aWFsaXplciBmb3IgZXhhbXBsZSkgdGhlbiByZXBvcnQgYSBwcm9ibGVtIGZvciBlYWNoIHBhcmFtIHRhZwogCQkJCWlmIChtZXRob2REZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlUGFyYW1MZW5ndGg7IGkrKykgewotCQkJCQkJSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2UgcGFyYW0gPSB0aGlzLnBhcmFtUmVmZXJlbmNlc1tpXTsKKwkJCQkJCUphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlIHBhcmFtID0gdGhpcy5wYXJhbVR5cGVQYXJhbWV0ZXJzW2ldOwogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcocGFyYW0udGFnU291cmNlU3RhcnQsIHBhcmFtLnRhZ1NvdXJjZUVuZCk7CiAJCQkJCX0KIAkJCQkJcmV0dXJuOwpAQCAtNTUzLDkgKzU4MSwxMSBAQAogCQkJfQogCQkJcmV0dXJuOwogCQl9Ci0JCQorCiAJCS8vIElmIG5vIHBhcmFtIHRhZ3MgdGhlbiByZXBvcnQgYSBwcm9ibGVtIGZvciBlYWNoIGRlY2xhcmF0aW9uIHR5cGUgcGFyYW1ldGVyCiAJCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAsIGF2b2lkIHNlY29uZGFyeSBlcnJvcnMgd2hlbiA8PSAxLjQgCisJCQlyZXBvcnRNaXNzaW5nID0gcmVwb3J0TWlzc2luZyAmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwogCQkJaW50IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CiAJCQlpZiAocGFyYW1UeXBlUGFyYW1MZW5ndGggPT0gMCkgewogCQkJCWlmIChyZXBvcnRNaXNzaW5nKSB7CkBAIC02MDUsNyArNjM1LDcgQEAKIAkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NNaXNzaW5nUGFyYW1UYWcocGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci5zb3VyY2VTdGFydCwgcGFyYW1ldGVyLnNvdXJjZUVuZCwgbW9kaWZpZXJzKTsKIAkJCQkJfQogCQkJCX0KLQkJCQorCiAJCQkJLy8gUmVwb3J0IGludmFsaWQgcGFyYW0KIAkJCQlmb3IgKGludCBpPTA7IGk8cGFyYW1UeXBlUGFyYW1MZW5ndGg7IGkrKykgewogCQkJCQlpZiAoYmluZGluZ3NbaV0gIT0gbnVsbCkgewpAQCAtNzExLDcgKzc0MSw3IEBACiAJCQkJCQkJY29tcGF0aWJsZSA9IHR5cGVSZWYucmVzb2x2ZWRUeXBlLmlzQ29tcGF0aWJsZVdpdGgoZXhjZXB0aW9uQmluZGluZyk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQorCiAJCQkJCS8vICBJZiBub3QgY29tcGF0aWJsZSBvbmx5IGNvbXBsYWluIG9uIHVuY2hlY2tlZCBleGNlcHRpb24KIAkJCQkJaWYgKCFjb21wYXRpYmxlICYmICF0eXBlUmVmLnJlc29sdmVkVHlwZS5pc1VuY2hlY2tlZEV4Y2VwdGlvbihmYWxzZSkpIHsKIAkJCQkJCW1ldGhTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFRocm93c0NsYXNzTmFtZSh0eXBlUmVmLCBtZC5iaW5kaW5nLm1vZGlmaWVycyk7CkBAIC03MzgsNyArNzY4LDcgQEAKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQkvLyBtZW1iZXIgdHlwZXMKIAkJCWlmIChyZXNvbHZlZFR5cGUuaXNNZW1iZXJUeXBlKCkpIHsKIAkJCQlSZWZlcmVuY2VCaW5kaW5nIHRvcExldmVsVHlwZSA9IHJlc29sdmVkVHlwZTsKQEAgLTc1MiwxMiArNzgyLDEyIEBACiAJCQkJCXRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZS5lbmNsb3NpbmdUeXBlKCk7CiAJCQkJCWNvbXB1dGVkQ29tcG91bmROYW1lWy0taWR4XSA9IHRvcExldmVsVHlwZS5zb3VyY2VOYW1lOwogCQkJCX0KLQkJCQkKKwogCQkJCS8vIGFkZCBwYWNrYWdlIGluZm9ybWF0aW9uCiAJCQkJZm9yIChpbnQgaSA9IHBhY2thZ2VMZW5ndGg7IC0taSA+PSAwOykgewogCQkJCQljb21wdXRlZENvbXBvdW5kTmFtZVstLWlkeF0gPSB0b3BMZXZlbFR5cGUuZlBhY2thZ2UuY29tcG91bmROYW1lW2ldOwogCQkJCX0KLQkJCQkJCQkJCQkKKwogCQkJCUNsYXNzU2NvcGUgdG9wTGV2ZWxTY29wZSA9IHNjb3BlLmNsYXNzU2NvcGUoKTsKIAkJCQkvLyB3aGVuIHNjb3BlIGlzIG5vdCBvbiBjb21waWxhdGlvbiB1bml0IHR5cGUsIHRoZW4gaW5uZXIgY2xhc3MgbWF5IG5vdCBiZSB2aXNpYmxlLi4uCiAJCQkJaWYgKHRvcExldmVsU2NvcGUucGFyZW50LmtpbmQgIT0gU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSB8fApAQCAtNzc1LDE3ICs4MDUsMjAgQEAKIAkJCQkJCQkJbWFpbkxvb3A6IGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgewogCQkJCQkJCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gaW1wb3J0c1tpXS5jb21wb3VuZE5hbWU7CiAJCQkJCQkJCQlpbnQgY29tcG91bmROYW1lTGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsKLQkJCQkJCQkJCWlmICgoaW1wb3J0c1tpXS5vbkRlbWFuZCAmJiBjb21wb3VuZE5hbWVMZW5ndGggPT0gY29tcHV0ZWRDb21wb3VuZE5hbWUubGVuZ3RoLTEpIHx8Ci0JCQkJCQkJCQkJKGNvbXBvdW5kTmFtZUxlbmd0aCA9PSBjb21wdXRlZENvbXBvdW5kTmFtZS5sZW5ndGgpKQotCQkJCQkJCQkJeworCQkJCQkJCQkJaWYgKChpbXBvcnRzW2ldLm9uRGVtYW5kICYmIGNvbXBvdW5kTmFtZUxlbmd0aCA9PSBjb21wdXRlZENvbXBvdW5kTmFtZS5sZW5ndGgtMSkgCisJCQkJCQkJCQkJCXx8IChjb21wb3VuZE5hbWVMZW5ndGggPT0gY29tcHV0ZWRDb21wb3VuZE5hbWUubGVuZ3RoKSkgewogCQkJCQkJCQkJCWZvciAoaW50IGogPSBjb21wb3VuZE5hbWVMZW5ndGg7IC0taiA+PSAwOykgewogCQkJCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW1wb3J0c1tpXS5jb21wb3VuZE5hbWVbal0sIGNvbXB1dGVkQ29tcG91bmROYW1lW2pdKSkgewogCQkJCQkJCQkJCQkJaWYgKGogPT0gMCkgewogCQkJCQkJCQkJCQkJCWhhc1ZhbGlkSW1wb3J0ID0gdHJ1ZTsKKwkJCQkJCQkJCQkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0c1tpXS5yZWZlcmVuY2U7CisJCQkJCQkJCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJCQkJCWltcG9ydFJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuVXNlZDsKKwkJCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJCQkJYnJlYWsgbWFpbkxvb3A7CiAJCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQlicmVhazsJCisJCQkJCQkJCQkJCQlicmVhazsKIAkJCQkJCQkJCQkJfQogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0KQEAgLTgwMiw2ICs4MzUsNDcgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KKwkJCQlpZiAodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlICYmICFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KHJlc29sdmVkVHlwZSkpIHsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjE4OAorCQkJCQkvLyBwYXJ0aWFsbHkgcXVhbGlmaWVkIHJlZmVyZW5jZXMgZnJvbSBhIGRpZmZlcmVudCBDVSBzaG91bGQgYmUgd2FybmVkCisJCQkJCWNoYXJbXVtdIHR5cGVSZWZOYW1lID0gKChKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgdHlwZVJlZmVyZW5jZSkuZ2V0VHlwZU5hbWUoKTsKKwkJCQkJaW50IHNraXBMZW5ndGggPSAwOworCQkJCQlpZiAodG9wTGV2ZWxTY29wZS5nZXRDdXJyZW50UGFja2FnZSgpID09IHJlc29sdmVkVHlwZS5nZXRQYWNrYWdlKCkKKwkJCQkJCQkmJiB0eXBlUmVmTmFtZS5sZW5ndGggPCBjb21wdXRlZENvbXBvdW5kTmFtZS5sZW5ndGgpIHsKKwkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE1Mzk6IHJlZmVyZW5jZXMgY2FuIGJlIHBhcnRpYWxseSBxdWFsaWZpZWQKKwkJCQkJCS8vIGluIHNhbWUgcGFja2FnZSBhbmQgaGVuY2UgaWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBub3QgZ2l2ZW4sIGlnbm9yZSBwYWNrYWdlIG5hbWUgY2hlY2sKKwkJCQkJCXNraXBMZW5ndGggPSByZXNvbHZlZFR5cGUuZlBhY2thZ2UuY29tcG91bmROYW1lLmxlbmd0aDsKKwkJCQkJfQorCQkJCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKKwkJCQkJaWYgKHR5cGVSZWZOYW1lLmxlbmd0aCA9PSBjb21wdXRlZENvbXBvdW5kTmFtZS5sZW5ndGggLSBza2lwTGVuZ3RoKSB7CisJCQkJCQljaGVja1F1YWxpZmljYXRpb246IGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVJlZk5hbWUubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVSZWZOYW1lW2ldLCBjb21wdXRlZENvbXBvdW5kTmFtZVtpICsgc2tpcExlbmd0aF0pKSB7CisJCQkJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCQkJCWJyZWFrIGNoZWNrUXVhbGlmaWNhdGlvbjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQl9CisJCQkJCS8vIHJlcG9ydCBpbnZhbGlkIHJlZmVyZW5jZQorCQkJCQlpZiAoIXZhbGlkKSB7CisJCQkJCQlpZiAoc2NvcGVNb2RpZmllcnMgPT0gLTEpIHNjb3BlTW9kaWZpZXJzID0gc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKTsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkTWVtYmVyVHlwZVF1YWxpZmljYXRpb24odHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwgdHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQsIHNjb3BlTW9kaWZpZXJzKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2OTE4CisJCQkgKgorCQkJICogV2UgYXJlIGNvbmNlcm5lZCBvbmx5IGFib3V0IHRoZSBTaW5nbGUgdHlwZSByZWZlcmVuY2VzIChpLmUuIHdpdGhvdXQgYW55IHBhY2thZ2UpIElmIHRoZXkgYXJlIG5vdCBpbiBkZWZhdWx0IHBhY2thZ2UsCisJCQkgKiB0aGVuIHJlcG9ydCBhbiBlcnJvci4gUmVmZXJlbmNlcyB3aXRoIHF1YWxpZmllZCB5ZXQgaW5jb3JyZWN0IG5hbWVzIHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCisJCQkgKi8KKwkJCWlmIChzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5pc1BhY2thZ2VJbmZvKCkgJiYgdHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQkJaWYgKHJlc29sdmVkVHlwZS5mUGFja2FnZS5jb21wb3VuZE5hbWUubGVuZ3RoID4gMCkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFJlZmVyZW5jZSh0eXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCQkJCXJldHVybjsgLy8gTm90IHJlYWxseSBuZWVkZWQgLSBqdXN0IGluIGNhc2UgbW9yZSBjb2RlIGFkZGVkIGluIGZ1dHVyZQorCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTgyMiwxMiArODk2LDEyIEBACiAJCQkJdGhpcy5yZXR1cm5TdGF0ZW1lbnQudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQkJfQogCQkJaWYgKHRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewkKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5leGNlcHRpb25SZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMuZXhjZXB0aW9uUmVmZXJlbmNlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQkJfQogCQkJfQogCQkJaWYgKHRoaXMuc2VlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuc2VlUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewkKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zZWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMuc2VlUmVmZXJlbmNlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQkJfQogCQkJfQpAQCAtODUwLDEyICs5MjQsMTIgQEAKIAkJCQl0aGlzLnJldHVyblN0YXRlbWVudC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQl9CiAJCQlpZiAodGhpcy5leGNlcHRpb25SZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5leGNlcHRpb25SZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CQorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmV4Y2VwdGlvblJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJdGhpcy5leGNlcHRpb25SZWZlcmVuY2VzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCQl9CiAJCQl9CiAJCQlpZiAodGhpcy5zZWVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zZWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CQorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnNlZVJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJdGhpcy5zZWVSZWZlcmVuY2VzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCBkYTQyOTgxLi5mMjcwYTQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsNyArMzEsNyBAQAogCX0KIAogCVR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUpIHsKLQkKKwogCQkvLyBQcm9wYWdhdGUgdGhlIHR5cGUgY2hlY2tpbmcgdG8gdGhlIGFyZ3VtZW50cywgYW5kIGNoZWNrIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkLgogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlpZiAodGhpcy50eXBlID09IG51bGwpIHsKQEAgLTQxLDcgKzQxLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKChCbG9ja1Njb3BlKXNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKIAkJfQotCQorCiAJCS8vIGJ1ZmZlcmluZyB0aGUgYXJndW1lbnRzJyB0eXBlcwogCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlM7CiAJCWJvb2xlYW4gaGFzVHlwZVZhckFyZ3MgPSBmYWxzZTsKQEAgLTY2LDE3ICs2NiwxNyBAQAogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9Ci0JCisKIAkJLy8gY2hlY2sgcmVzb2x2ZWQgdHlwZQogCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodGhpcy50eXBlLnJlc29sdmVkVHlwZSk7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHRoaXMudHlwZS5yZXNvbHZlZFR5cGUsICB0cnVlIC8qZm9yY2UgdGhlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOwogCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwogCQlpZiAoZW5jbG9zaW5nVHlwZSA9PSBudWxsID8gZmFsc2UgOiBlbmNsb3NpbmdUeXBlLmlzQ29tcGF0aWJsZVdpdGgodGhpcy5yZXNvbHZlZFR5cGUpKSB7CiAJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5TdXBlckFjY2VzczsKIAkJfQotCQorCiAJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGlvblR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGU7CiAJCXRoaXMuYmluZGluZyA9IHNjb3BlLmdldENvbnN0cnVjdG9yKGFsbG9jYXRpb25UeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKIAkJaWYgKCF0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewpAQCAtMTAyLDkgKzEwMiw5IEBACiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwogCQkJfQogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwotCQl9IGVsc2UgaWYgKGJpbmRpbmcuaXNWYXJhcmdzKCkpIHsKKwkJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcuaXNWYXJhcmdzKCkpIHsKIAkJCWludCBsZW5ndGggPSBhcmd1bWVudFR5cGVzLmxlbmd0aDsKLQkJCWlmICghKGJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gbGVuZ3RoICYmIGFyZ3VtZW50VHlwZXNbbGVuZ3RoLTFdLmlzQXJyYXlUeXBlKCkpKSB7CisJCQlpZiAoISh0aGlzLmJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gbGVuZ3RoICYmIGFyZ3VtZW50VHlwZXNbbGVuZ3RoLTFdLmlzQXJyYXlUeXBlKCkpKSB7CiAJCQkJTWV0aG9kQmluZGluZyBwcm9ibGVtID0gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHRoaXMuYmluZGluZywgdGhpcy5iaW5kaW5nLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBwcm9ibGVtLCBzY29wZS5nZXREZWNsYXJhdGlvbk1vZGlmaWVycygpKTsKIAkJCX0KQEAgLTEyNSwxNCArMTI1LDE0IEBACiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZWRUeXBlLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQlpbnQgbGVuZ3RoID0gcXVhbGlmaWNhdGlvbi5sZW5ndGg7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5xdWFsaWZpY2F0aW9uLmxlbmd0aDsKIAkJCWlmIChsZW5ndGggPiAxKSB7IC8vIGFjY2VwdCBxdWFsaWZpZWQgbWVtYmVyIGNsYXNzIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSA9PiBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMzMDQKIAkJCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGVCaW5kaW5nID0gYWxsb2NhdGlvblR5cGU7Ci0JCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBKYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSAmJiAoKEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXR5cGUpLnRva2Vucy5sZW5ndGggIT0gbGVuZ3RoKSB7CisJCQkJaWYgKHRoaXMudHlwZSBpbnN0YW5jZW9mIEphdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlICYmICgoSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UpdGhpcy50eXBlKS50b2tlbnMubGVuZ3RoICE9IGxlbmd0aCkgewogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZE1lbWJlclR5cGVRdWFsaWZpY2F0aW9uKHRoaXMubWVtYmVyU3RhcnQrMSwgdGhpcy5zb3VyY2VFbmQsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWludCBpZHggPSBsZW5ndGg7Ci0JCQkJCXdoaWxlIChpZHggPiAwICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHF1YWxpZmljYXRpb25bLS1pZHhdLCBlbmNsb3NpbmdUeXBlQmluZGluZy5zb3VyY2VOYW1lKSAmJiAoZW5jbG9zaW5nVHlwZUJpbmRpbmcgPSBlbmNsb3NpbmdUeXBlQmluZGluZy5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpIHsKKwkJCQkJd2hpbGUgKGlkeCA+IDAgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5xdWFsaWZpY2F0aW9uWy0taWR4XSwgZW5jbG9zaW5nVHlwZUJpbmRpbmcuc291cmNlTmFtZSkgJiYgKGVuY2xvc2luZ1R5cGVCaW5kaW5nID0gZW5jbG9zaW5nVHlwZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSB7CiAJCQkJCQkvLyB2ZXJpZnkgdGhhdCBlYWNoIHF1YWxpZmljYXRpb24gdG9rZW4gbWF0Y2hlcyBlbmNsb3NpbmcgdHlwZXMKIAkJCQkJfQogCQkJCQlpZiAoaWR4ID4gMCB8fCBlbmNsb3NpbmdUeXBlQmluZGluZyAhPSBudWxsKSB7CkBAIC0xOTEsNSArMTkxLDUgQEAKIAkJCX0KIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLQl9CQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0FyZ3VtZW50RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jQXJndW1lbnRFeHByZXNzaW9uLmphdmEKaW5kZXggYWI3YzhmYS4uZTQ2YmY4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jQXJndW1lbnRFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jQXJndW1lbnRFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDEsNiArNDEsMzAgQEAKIAkJCWlmICh0eXBlUmVmICE9IG51bGwpIHsKIAkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGVSZWYuZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOwogCQkJCXR5cGVSZWYucmVzb2x2ZWRUeXBlID0gdGhpcy5yZXNvbHZlZFR5cGU7CisJCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUzNzQKKwkJCQkvLyByZXByb2R1Y2UgamF2YWRvYyAxLjMuMSAvIDEuNC4yIGJlaGF2aW9yCisJCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCWlmICh0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSAmJgorCQkJCQkJdGhpcy5yZXNvbHZlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5lbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCAmJgorCQkJCQkJc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRNZW1iZXJUeXBlUXVhbGlmaWNhdGlvbih0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjg2NDgKKwkJCQkJLy8gZG8gbm90IHJldHVybiBub3cgYnV0IHJlcG9ydCB1bnJlc29sdmVkIHJlZmVyZW5jZSBhcyBleHBlY3RlZCBkZXBlbmRpbmcgb24gY29tcGxpYW5jZSBzZXR0aW5ncworCQkJCX0gZWxzZSBpZiAodHlwZVJlZiBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCQkJVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuZW5jbG9zaW5nVHlwZSgpOworCQkJCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMTg3CisJCQkJCQkvLyBpbm5lciB0eXBlIHJlZmVyZW5jZXMgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZAorCQkJCQkJaW50IGNvbXBvdW5kTGVuZ3RoID0gMjsKKwkJCQkJCXdoaWxlICgoZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSBjb21wb3VuZExlbmd0aCsrOworCQkJCQkJaW50IHR5cGVOYW1lTGVuZ3RoID0gdHlwZVJlZi5nZXRUeXBlTmFtZSgpLmxlbmd0aDsKKwkJCQkJCWlmICh0eXBlTmFtZUxlbmd0aCAhPSBjb21wb3VuZExlbmd0aCAmJiB0eXBlTmFtZUxlbmd0aCAhPSAoY29tcG91bmRMZW5ndGgrdGhpcy5yZXNvbHZlZFR5cGUuZ2V0UGFja2FnZSgpLmNvbXBvdW5kTmFtZS5sZW5ndGgpKSB7CisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRNZW1iZXJUeXBlUXVhbGlmaWNhdGlvbih0eXBlUmVmLnNvdXJjZVN0YXJ0LCB0eXBlUmVmLnNvdXJjZUVuZCwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CiAJCQkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkVHlwZSh0eXBlUmVmLCB0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CiAJCQkJCXJldHVybiBudWxsOwpAQCAtNDgsMTIgKzcyLDEyIEBACiAJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKSkgewogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jRGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHR5cGVSZWYsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwogCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodGhpcy5yZXNvbHZlZFR5cGUpOworCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgIHRydWUgLypmb3JjZSB0aGUgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlpZiAodGhpcy5hcmd1bWVudCA9PSBudWxsKSB7CiAJCQlpZiAodGhpcy50b2tlbiAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDViZDljODguLjQzZDRmYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQxLDcgKzQxLDcgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgewogCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NGaWVsZFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jRmllbGRSZWZlcmVuY2UuamF2YQppbmRleCAyZDYyNDY3Li5iNmJhYjk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NGaWVsZFJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0ZpZWxkUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw5ICs3LDExIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDE4NTY4MiAtIEluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIG1hcmsgbG9jYWwgdmFyaWFibGVzIGFzIHJlYWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CkBAIC0yNCw3ICsyNiw3IEBACiAJCXN1cGVyKHNvdXJjZSwgcG9zKTsKIAkJdGhpcy5iaXRzIHw9IEluc2lkZUphdmFkb2M7CiAJfQotCQorCiAJLyoKIAlwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewogCQlpZiAodGhpcy5tZXRob2RCaW5kaW5nICE9IG51bGwpIHsKQEAgLTQxLDI1ICs0MywyNSBAQAogCiAJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCWlmICh0aGlzLnJlY2VpdmVyID09IG51bGwpIHsKLQkJCXRoaXMucmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdSZWNlaXZlclR5cGUoKTsKIAkJfSBlbHNlIGlmIChzY29wZS5raW5kID09IFNjb3BlLkNMQVNTX1NDT1BFKSB7Ci0JCQl0aGlzLnJlY2VpdmVyVHlwZSA9IHRoaXMucmVjZWl2ZXIucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpIHNjb3BlKTsKKwkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZSgoQ2xhc3NTY29wZSkgc2NvcGUpOwogCQl9IGVsc2UgewotCQkJdGhpcy5yZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKChCbG9ja1Njb3BlKXNjb3BlKTsKKwkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZSgoQmxvY2tTY29wZSlzY29wZSk7CiAJCX0KLQkJaWYgKHRoaXMucmVjZWl2ZXJUeXBlID09IG51bGwpIHsKKwkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAKIAkJQmluZGluZyBmaWVsZEJpbmRpbmcgPSAodGhpcy5yZWNlaXZlciAhPSBudWxsICYmIHRoaXMucmVjZWl2ZXIuaXNUaGlzKCkpCiAJCQk/IHNjb3BlLmNsYXNzU2NvcGUoKS5nZXRCaW5kaW5nKHRoaXMudG9rZW4sIHRoaXMuYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0ssIHRoaXMsIHRydWUgLypyZXNvbHZlKi8pCi0JCQk6IHNjb3BlLmdldEZpZWxkKHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLnRva2VuLCB0aGlzKTsKKwkJCTogc2NvcGUuZ2V0RmllbGQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOwogCQlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkvLyBpbXBsaWNpdCBsb29rdXAgbWF5IGRpc2NvdmVyIGlzc3VlcyBkdWUgdG8gc3RhdGljL2NvbnN0cnVjdG9yIGNvbnRleHRzLiBqYXZhZG9jIG11c3QgYmUgcmVzaWxpZW50CiAJCQlzd2l0Y2ggKGZpZWxkQmluZGluZy5wcm9ibGVtSWQoKSkgewogCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb246CiAJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQ6Ci0JCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDogCisJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKIAkJCQkJRmllbGRCaW5kaW5nIGNsb3Nlc3RNYXRjaCA9ICgoUHJvYmxlbUZpZWxkQmluZGluZylmaWVsZEJpbmRpbmcpLmNsb3Nlc3RNYXRjaDsKIAkJCQkJaWYgKGNsb3Nlc3RNYXRjaCAhPSBudWxsKSB7CiAJCQkJCQlmaWVsZEJpbmRpbmcgPSBjbG9zZXN0TWF0Y2g7IC8vIGlnbm9yZSBwcm9ibGVtIGlmIGNhbiByZWFjaCB0YXJnZXQgZmllbGQgdGhyb3VnaCBpdApAQCAtNjgsMjYgKzcwLDM0IEBACiAJCX0KIAkJLy8gV2hlbiB0aGVyZSdzIG5vIHZhbGlkIGZpZWxkIGJpbmRpbmcsIHRyeSB0byByZXNvbHZlIHBvc3NpYmxlIG1ldGhvZCByZWZlcmVuY2Ugd2l0aG91dCBwYXJlbnRoZXNpcwogCQlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8ICEoZmllbGRCaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSkgewotCQkJaWYgKHRoaXMucmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlY2VpdmVyVHlwZTsKLQkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kQmluZGluZ3MgPSByZWZCaW5kaW5nLmdldE1ldGhvZHModGhpcy50b2tlbik7Ci0JCQkJaWYgKG1ldGhvZEJpbmRpbmdzID09IG51bGwpIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRGaWVsZCh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgZmllbGRCaW5kaW5nLCB0aGlzLnJlY2VpdmVyVHlwZSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CisJCQlpZiAodGhpcy5yZWNlaXZlci5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgeworCQkJCS8vIHByb2JsZW0gYWxyZWFkeSBnb3Qgc2lnbmFsZWQgb24gcmVjZWl2ZXIsIGRvIG5vdCByZXBvcnQgc2Vjb25kYXJ5IHByb2JsZW0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZkJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7CisJCQkJY2hhcltdIHNlbGVjdG9yID0gdGhpcy50b2tlbjsKKwkJCQlNZXRob2RCaW5kaW5nIHBvc3NpYmxlTWV0aG9kID0gbnVsbDsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuc291cmNlTmFtZSgpLCBzZWxlY3RvcikpIHsKKwkJCQkJcG9zc2libGVNZXRob2QgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihyZWZCaW5kaW5nLCBCaW5kaW5nLk5PX1RZUEVTLCB0aGlzKTsKIAkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2ggKG1ldGhvZEJpbmRpbmdzLmxlbmd0aCkgewotCQkJCQkJY2FzZSAwOgotCQkJCQkJCS8vIG5vIG1ldGhvZCB3YXMgZm91bmQ6IHJlcG9ydCBwcm9ibGVtCi0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRGaWVsZCh0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCwgZmllbGRCaW5kaW5nLCB0aGlzLnJlY2VpdmVyVHlwZSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQkJLy8gb25lIG1ldGhvZCBiaW5kaW5nIHdhcyBmb3VuZDogc3RvcmUgYmluZGluZyBpbiBzcGVjaWZpYyBmaWVsZAotCQkJCQkJCXRoaXMubWV0aG9kQmluZGluZyA9IG1ldGhvZEJpbmRpbmdzWzBdOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkvLyBzZXZlcmFsIG1ldGhvZCBiaW5kaW5nIHdlcmUgZm91bmQ6IHN0b3JlIGZpcnN0IGJpbmRpbmcgaW4gc3BlY2lmaWMgZmllbGQgYW5kIHJlcG9ydCBhbWJpZ3VvdXMgZXJyb3IKLQkJCQkJCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSBtZXRob2RCaW5kaW5nc1swXTsKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jQW1iaWd1b3VzTWV0aG9kUmVmZXJlbmNlKHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kLCBmaWVsZEJpbmRpbmcsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwotCQkJCQkJCWJyZWFrOworCQkJCQlwb3NzaWJsZU1ldGhvZCA9IHRoaXMucmVjZWl2ZXIuaXNUaGlzKCkKKwkJCQkJCT8gc2NvcGUuZ2V0SW1wbGljaXRNZXRob2Qoc2VsZWN0b3IsIEJpbmRpbmcuTk9fVFlQRVMsIHRoaXMpCisJCQkJCQk6IHNjb3BlLmdldE1ldGhvZChyZWZCaW5kaW5nLCBzZWxlY3RvciwgQmluZGluZy5OT19UWVBFUywgdGhpcyk7CisJCQkJfQorCQkJCWlmIChwb3NzaWJsZU1ldGhvZC5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCXRoaXMubWV0aG9kQmluZGluZyA9IHBvc3NpYmxlTWV0aG9kOworCQkJCX0gZWxzZSB7CisJCQkJCVByb2JsZW1NZXRob2RCaW5kaW5nIHByb2JsZW1NZXRob2RCaW5kaW5nID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSBwb3NzaWJsZU1ldGhvZDsKKwkJCQkJaWYgKHByb2JsZW1NZXRob2RCaW5kaW5nLmNsb3Nlc3RNYXRjaCA9PSBudWxsKSB7CisJCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQkvLyBXaGVuIHRoZSBiaW5kaW5nIGlzIG5vdCBvbiBhIGZpZWxkIChlLmcuIGxvY2FsIHZhcmlhYmxlKSwgd2UgbmVlZCB0byBjcmVhdGUgYSBwcm9ibGVtIGZpZWxkIGJpbmRpbmcgdG8gcmVwb3J0IHRoZSBjb3JyZWN0IHByb2JsZW0KKwkJCQkJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTQ4MjUKKwkJCQkJCQlmaWVsZEJpbmRpbmcgPSBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhyZWZCaW5kaW5nLCBmaWVsZEJpbmRpbmcucmVhZGFibGVOYW1lKCksIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJCQkJCX0KKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkRmllbGQodGhpcywgZmllbGRCaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSBwcm9ibGVtTWV0aG9kQmluZGluZy5jbG9zZXN0TWF0Y2g7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC05NSwxMiArMTA1LDEyIEBACiAJCX0KIAkJdGhpcy5iaW5kaW5nID0gKEZpZWxkQmluZGluZykgZmllbGRCaW5kaW5nOwogCi0JCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZCh0aGlzLmJpbmRpbmcsIHNjb3BlLCAodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSAhPSAwKSkgeworCQlpZiAoaXNGaWVsZFVzZURlcHJlY2F0ZWQodGhpcy5iaW5kaW5nLCBzY29wZSwgdGhpcy5iaXRzKSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0RlcHJlY2F0ZWRGaWVsZCh0aGlzLmJpbmRpbmcsIHRoaXMsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHRoaXMuYmluZGluZy50eXBlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7CiAJCXJldHVybiAodGhpcy5iaXRzICYgQVNUTm9kZS5TdXBlckFjY2VzcykgIT0gMDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NJbXBsaWNpdFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0ltcGxpY2l0VHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDk1Y2M2MjYuLjY5NmE2OTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0ltcGxpY2l0VHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY0ltcGxpY2l0VHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDcgKzE1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBjbGFzcyBKYXZhZG9jSW1wbGljaXRUeXBlUmVmZXJlbmNlIGV4dGVuZHMgVHlwZVJlZmVyZW5jZSB7Ci0JCisKIAlwdWJsaWMgY2hhcltdIHRva2VuOwogCiAJcHVibGljIEphdmFkb2NJbXBsaWNpdFR5cGVSZWZlcmVuY2UoY2hhcltdIG5hbWUsIGludCBwb3MpIHsKQEAgLTM2LDEzICszNiwxMyBAQAogCSAqLwogCXByb3RlY3RlZCBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpOwogCX0KIAogCXB1YmxpYyBjaGFyW10gZ2V0TGFzdFRva2VuKCkgewogCQlyZXR1cm4gdGhpcy50b2tlbjsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2UjZ2V0VHlwZU5hbWUoKQogCSAqLwpAQCAtNjEsMjIgKzYxLDU3IEBACiAJICogUmVzb2x2ZXMgdHlwZSBvbiBhIEJsb2NrLCBDbGFzcyBvciBDb21waWxhdGlvblVuaXQgc2NvcGUuCiAJICogV2UgbmVlZCB0byBtb2RpZnkgcmVzb2xpbmcgYmVoYXZpb3IgdG8gYXZvaWQgcmF3IHR5cGUgY3JlYXRpb24uCiAJICovCi0JcHJpdmF0ZSBUeXBlQmluZGluZyBpbnRlcm5hbFJlc29sdmVUeXBlKFNjb3BlIHNjb3BlKSB7CisJcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUpIHsKIAkJLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCiAJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSAvLyBpcyBhIHNoYXJlZCB0eXBlIHJlZmVyZW5jZSB3aGljaCB3YXMgYWxyZWFkeSByZXNvbHZlZAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgPyB0aGlzLnJlc29sdmVkVHlwZSA6IG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKLQotCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZGV0ZWN0ZWQgY3ljbGUgd2hpbGUgcmVzb2x2aW5nIGhpZXJhcmNoeQkKLQkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoICh0aGlzLnJlc29sdmVkVHlwZS5wcm9ibGVtSWQoKSkgeworCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlIDoKKwkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZS5jbG9zZXN0TWF0Y2goKTsKKwkJCQkJCXJldHVybiB0eXBlOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQlib29sZWFuIGhhc0Vycm9yOworCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5yZXNvbHZlZFR5cGUgPSBnZXRUeXBlQmluZGluZyhzY29wZSk7CisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOyAvLyBkZXRlY3RlZCBjeWNsZSB3aGlsZSByZXNvbHZpbmcgaGllcmFyY2h5CisJCX0gZWxzZSBpZiAoKGhhc0Vycm9yID0gIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSk9PSB0cnVlKSB7CiAJCQlyZXBvcnRJbnZhbGlkVHlwZShzY29wZSk7CisJCQlzd2l0Y2ggKHR5cGUucHJvYmxlbUlkKCkpIHsKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOgorCQkJCQl0eXBlID0gdHlwZS5jbG9zZXN0TWF0Y2goKTsKKwkJCQkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlpZiAodHlwZS5pc0FycmF5VHlwZSgpICYmICgoQXJyYXlCaW5kaW5nKSB0eXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBUeXBlQmluZGluZy5WT0lEKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RBbGxvY2F0ZVZvaWRBcnJheSh0aGlzKTsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHRoaXMucmVzb2x2ZWRUeXBlLCBzY29wZSkpCi0JCQlyZXBvcnREZXByZWNhdGVkVHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpOwotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHR5cGUsIHNjb3BlKSkgeworCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodHlwZSwgc2NvcGUpOworCQl9CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk5MzYKKwkJLy8gcmF3IGNvbnZlcnQgYWxsIGVuY2xvc2luZyB0eXBlcyB3aGVuIGRlYWxpbmcgd2l0aCBKYXZhZG9jIHJlZmVyZW5jZXMKKwkJaWYgKHR5cGUuaXNHZW5lcmljVHlwZSgpIHx8IHR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQl0eXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGUsIHRydWUgLypmb3JjZSB0aGUgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CisJCX0KKworCQlpZiAoaGFzRXJyb3IpIHsKKwkJCS8vIGRvIG5vdCBzdG9yZSB0aGUgY29tcHV0ZWQgdHlwZSwga2VlcCB0aGUgcHJvYmxlbSB0eXBlIGluc3RlYWQKKwkJCXJldHVybiB0eXBlOworCQl9CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGU7CiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgcmVwb3J0SW52YWxpZFR5cGUoU2NvcGUgc2NvcGUpIHsKQEAgLTg2LDE0ICsxMjEsNiBAQAogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jRGVwcmVjYXRlZFR5cGUodHlwZSwgdGhpcywgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CiAJfQogCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgYmxvY2tTY29wZSwgYm9vbGVhbiBjaGVja0JvdW5kcykgewotCQlyZXR1cm4gaW50ZXJuYWxSZXNvbHZlVHlwZShibG9ja1Njb3BlKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGNsYXNzU2NvcGUpOwotCX0KLQogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewogCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NNZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jTWVzc2FnZVNlbmQuamF2YQppbmRleCA1ZTUxZGQwLi4yZGY1YWJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NNZXNzYWdlU2VuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY01lc3NhZ2VTZW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDEsNyArNDEsNyBAQAogCQkvLyBCYXNlIHR5cGUgcHJvbW90aW9uCiAJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCWlmICh0aGlzLnJlY2VpdmVyID09IG51bGwpIHsKLQkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdSZWNlaXZlclR5cGUoKTsKIAkJfSBlbHNlIGlmIChzY29wZS5raW5kID09IFNjb3BlLkNMQVNTX1NDT1BFKSB7CiAJCQl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMucmVjZWl2ZXIucmVzb2x2ZVR5cGUoKENsYXNzU2NvcGUpIHNjb3BlKTsKIAkJfSBlbHNlIHsKQEAgLTQ5LDExICs0OSwxMSBAQAogCQl9CiAKIAkJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBhcmdzIGFyZSByZXNvbHZlZAotCQkKKwogCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlM7CiAJCWJvb2xlYW4gaGFzQXJnc1R5cGVWYXIgPSBmYWxzZTsKIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzIAorCQkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOyAvLyB0eXBlQ2hlY2tzIGFsbCBhcmd1bWVudHMKIAkJCWludCBsZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCQlhcmd1bWVudFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKQEAgLTc4LDggKzc4LDggQEAKIAkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHRoaXMucmVjZWl2ZXIucmVzb2x2ZWRUeXBlKTsKLQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodGhpcy5yZWNlaXZlci5yZXNvbHZlZFR5cGUsIHRydWUgLypmb3JjZSB0aGUgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CisJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpOwogCQlpZiAoZW5jbG9zaW5nVHlwZT09bnVsbCA/IGZhbHNlIDogZW5jbG9zaW5nVHlwZS5pc0NvbXBhdGlibGVXaXRoKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKSkgewogCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuU3VwZXJBY2Nlc3M7CiAJCX0KQEAgLTEyMCw4ICsxMjAsOCBAQAogCQkJc3dpdGNoICh0aGlzLmJpbmRpbmcucHJvYmxlbUlkKCkpIHsKIAkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uOgogCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0OgotCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA6IAotCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzOiAKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzOgogCQkJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaCA9ICgoUHJvYmxlbU1ldGhvZEJpbmRpbmcpdGhpcy5iaW5kaW5nKS5jbG9zZXN0TWF0Y2g7CiAJCQkJCWlmIChjbG9zZXN0TWF0Y2ggIT0gbnVsbCkgewogCQkJCQkJdGhpcy5iaW5kaW5nID0gY2xvc2VzdE1hdGNoOyAvLyBpZ25vcmUgcHJvYmxlbSBpZiBjYW4gcmVhY2ggdGFyZ2V0IG1ldGhvZCB0aHJvdWdoIGl0CkBAIC0xMjksMTAgKzEyOSwxNCBAQAogCQkJfQogCQl9CiAJCWlmICghdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmICh0aGlzLnJlY2VpdmVyLnJlc29sdmVkVHlwZSBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJLy8gcHJvYmxlbSBhbHJlYWR5IGdvdCBzaWduYWxlZCBvbiByZWNlaXZlciwgZG8gbm90IHJlcG9ydCBzZWNvbmRhcnkgcHJvYmxlbQorCQkJCXJldHVybiBudWxsOworCQkJfQogCQkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CiAJCQkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7Ci0JCQkJfSBlbHNlIHsgCisJCQkJfSBlbHNlIHsKIAkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0Vycm9yTm9NZXRob2RGb3IodGhpcywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CkBAIC0xNDcsOSArMTUxLDkgQEAKIAkJfSBlbHNlIGlmIChoYXNBcmdzVHlwZVZhcikgewogCQkJTWV0aG9kQmluZGluZyBwcm9ibGVtID0gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHRoaXMuYmluZGluZywgdGhpcy5zZWxlY3RvciwgYXJndW1lbnRUeXBlcywgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRNZXRob2QodGhpcywgcHJvYmxlbSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7Ci0JCX0gZWxzZSBpZiAoYmluZGluZy5pc1ZhcmFyZ3MoKSkgeworCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5pc1ZhcmFyZ3MoKSkgewogCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOwotCQkJaWYgKCEoYmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSBsZW5ndGggJiYgYXJndW1lbnRUeXBlc1tsZW5ndGgtMV0uaXNBcnJheVR5cGUoKSkpIHsKKwkJCWlmICghKHRoaXMuYmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSBsZW5ndGggJiYgYXJndW1lbnRUeXBlc1tsZW5ndGgtMV0uaXNBcnJheVR5cGUoKSkpIHsKIAkJCQlNZXRob2RCaW5kaW5nIHByb2JsZW0gPSBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcodGhpcy5iaW5kaW5nLCB0aGlzLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRNZXRob2QodGhpcywgcHJvYmxlbSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CiAJCQl9CkBAIC0xNjksNyArMTczLDcgQEAKIAogCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmJpbmRpbmcucmV0dXJuVHlwZTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkludm9jYXRpb25TaXRlI2lzU3VwZXJBY2Nlc3MoKQogCSAqLwpAQCAtMTc4LDEzICsxODIsMTMgQEAKIAl9CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkKKwogCQlpZiAodGhpcy5yZWNlaXZlciAhPSBudWxsKSB7CiAJCQl0aGlzLnJlY2VpdmVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwogCQl9CiAJCW91dHB1dC5hcHBlbmQoJyMnKS5hcHBlbmQodGhpcy5zZWxlY3RvcikuYXBwZW5kKCcoJyk7CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aCA7IGkgKyspIHsJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aCA7IGkgKyspIHsKIAkJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKIAkJCQl0aGlzLmFyZ3VtZW50c1tpXS5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCAxOTJmM2FiLi5lZTdkZjg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDcgKzE2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCkBAIC0zMywxMiArMzIsNTUgQEAKIAkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSW5zaWRlSmF2YWRvYzsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZXBvcnRJbnZhbGlkVHlwZShTY29wZSBzY29wZSkgewotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFR5cGUodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOworCS8qCisJICogV2UgbmVlZCB0byBtb2RpZnkgcmVzb2x2aW5nIGJlaGF2aW9yIHRvIGhhbmRsZSBwYWNrYWdlIHJlZmVyZW5jZXMKKwkgKi8KKwlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKKwkJLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCisJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSAvLyBpcyBhIHNoYXJlZCB0eXBlIHJlZmVyZW5jZSB3aGljaCB3YXMgYWxyZWFkeSByZXNvbHZlZAorCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgPyB0aGlzLnJlc29sdmVkVHlwZSA6IHRoaXMucmVzb2x2ZWRUeXBlLmNsb3Nlc3RNYXRjaCgpOyAvLyBhbHJlYWR5IHJlcG9ydGVkIGVycm9yCisKKwkJVHlwZUJpbmRpbmcgdHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlID0gZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworCQkvLyBFbmQgcmVzb2x1dGlvbiB3aGVuIGdldFR5cGVCaW5kaW5nKHNjb3BlKSByZXR1cm5zIG51bGwuIFRoaXMgbWF5IGhhcHBlbiBpbgorCQkvLyBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHR5cGljYWxseSB3aGVuIGFuIGlsbGVnYWwgYWNjZXNzIGlzIGRvbmUgb24gYSB0eXBlCisJCS8vIHZhcmlhYmxlIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQ3NDkpCisJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCQlpZiAoIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJQmluZGluZyBiaW5kaW5nID0gc2NvcGUuZ2V0VHlwZU9yUGFja2FnZSh0aGlzLnRva2Vucyk7CisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQkJdGhpcy5wYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJCQkvLyBWYWxpZCBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIGFsbG93ZWQgaW4gSmF2YWRvYyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTYwOSkKKwkJCX0gZWxzZSB7CisJCQkJcmVwb3J0SW52YWxpZFR5cGUoc2NvcGUpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTkzNgorCQkvLyByYXcgY29udmVydCBhbGwgZW5jbG9zaW5nIHR5cGVzIHdoZW4gZGVhbGluZyB3aXRoIEphdmFkb2MgcmVmZXJlbmNlcworCQlpZiAodHlwZS5pc0dlbmVyaWNUeXBlKCkgfHwgdHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKKwkJCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGUsIHRydWUgLypmb3JjZSB0aGUgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCX0KIAlwcm90ZWN0ZWQgdm9pZCByZXBvcnREZXByZWNhdGVkVHlwZShUeXBlQmluZGluZyB0eXBlLCBTY29wZSBzY29wZSkgewogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jRGVwcmVjYXRlZFR5cGUodHlwZSwgdGhpcywgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CiAJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlcG9ydERlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlLCBpbnQgaW5kZXgpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0RlcHJlY2F0ZWRUeXBlKHR5cGUsIHRoaXMsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCksIGluZGV4KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZXBvcnRJbnZhbGlkVHlwZShTY29wZSBzY29wZSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFR5cGUodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOworCX0KKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBibG9ja1Njb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7CisJCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGJsb2NrU2NvcGUsIGNoZWNrQm91bmRzKTsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7CisJCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGNsYXNzU2NvcGUsIGZhbHNlKTsKKwl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogUmVkZWZpbmUgdG8gY2FwdHVyZSBqYXZhZG9jIHNwZWNpZmljIHNpZ25hdHVyZXMKQEAgLTQ4LDQzICs5MCw5IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9CisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLQotCS8qCi0JICogV2UgbmVlZCB0byBtb2RpZnkgcmVzb2x2aW5nIGJlaGF2aW9yIHRvIGhhbmRsZSBwYWNrYWdlIHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKLQkJLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCi0JCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSAvLyBpcyBhIHNoYXJlZCB0eXBlIHJlZmVyZW5jZSB3aGljaCB3YXMgYWxyZWFkeSByZXNvbHZlZAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgPyB0aGlzLnJlc29sdmVkVHlwZSA6IG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKLQotCQl0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKLQkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQlCaW5kaW5nIGJpbmRpbmcgPSBzY29wZS5nZXRUeXBlT3JQYWNrYWdlKHRoaXMudG9rZW5zKTsKLQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKLQkJCQl0aGlzLnBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOwotCQkJfSBlbHNlIHsKLQkJCQlyZXBvcnRJbnZhbGlkVHlwZShzY29wZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpKQotCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKTsKLQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB7Ci0JCQl0aGlzLnJlc29sdmVkVHlwZSA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKXRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKLQl9Ci0KLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBibG9ja1Njb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGJsb2NrU2NvcGUsIGNoZWNrQm91bmRzKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGNsYXNzU2NvcGUsIGZhbHNlKTsKLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NSZXR1cm5TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1JldHVyblN0YXRlbWVudC5qYXZhCmluZGV4IDVhN2MyMmMuLjI1Y2IwMzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1JldHVyblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1JldHVyblN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDggKzI5LDggQEAKIAkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbnVsbDsKIAkJVHlwZUJpbmRpbmcgbWV0aG9kVHlwZSA9CiAJCQkobWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pCi0JCQkJPyAoKG1ldGhvZEJpbmRpbmcgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmcpID09IG51bGwgCi0JCQkJCT8gbnVsbCAKKwkJCQk/ICgobWV0aG9kQmluZGluZyA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCkuYmluZGluZykgPT0gbnVsbAorCQkJCQk/IG51bGwKIAkJCQkJOiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpCiAJCQkJOiBUeXBlQmluZGluZy5WT0lEOwogCQlpZiAobWV0aG9kVHlwZSA9PSBudWxsIHx8IG1ldGhvZFR5cGUgPT0gVHlwZUJpbmRpbmcuVk9JRCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDAzODZlOTYuLmFmYjIzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsNyArMzIsNyBAQAogCSAqIFJlc29sdmUgd2l0aG91dCB3YXJuaW5ncwogCSAqLwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiB3YXJuLCBib29sZWFuIGNvbnNpZGVyUGFyYW1SZWZBc1VzYWdlKSB7Ci0JCQorCiAJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHNjb3BlLmZpbmRWYXJpYWJsZSh0aGlzLnRva2VuKTsKIAkJaWYgKHZhcmlhYmxlQmluZGluZyAhPSBudWxsICYmIHZhcmlhYmxlQmluZGluZy5pc1ZhbGlkQmluZGluZygpICYmICgodmFyaWFibGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLklzQXJndW1lbnQpICE9IDApKSB7CiAJCQl0aGlzLmJpbmRpbmcgPSB2YXJpYWJsZUJpbmRpbmc7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0phdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggMjg5OTE3ZS4uMTlhZWQwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9KYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxNiArMTYsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiAKIAogcHVibGljIGNsYXNzIEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlIGV4dGVuZHMgU2luZ2xlVHlwZVJlZmVyZW5jZSB7Ci0JCisKIAlwdWJsaWMgaW50IHRhZ1NvdXJjZVN0YXJ0LCB0YWdTb3VyY2VFbmQ7CiAJcHVibGljIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nOwogCkBAIC0zNiw0NSArMzMsNDIgQEAKIAkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSW5zaWRlSmF2YWRvYzsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZXBvcnRJbnZhbGlkVHlwZShTY29wZSBzY29wZSkgewotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFR5cGUodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlLmdldERlY2xhcmF0aW9uTW9kaWZpZXJzKCkpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZXBvcnREZXByZWNhdGVkVHlwZShUeXBlQmluZGluZyB0eXBlLCBTY29wZSBzY29wZSkgewotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jRGVwcmVjYXRlZFR5cGUodHlwZSwgdGhpcywgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFJlZGVmaW5lIHRvIGNhcHR1cmUgamF2YWRvYyBzcGVjaWZpYyBzaWduYXR1cmVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUjdHJhdmVyc2Uob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwotCX0KLQogCS8qCiAJICogV2UgbmVlZCB0byBtb2RpZnkgcmVzb2x2aW5nIGJlaGF2aW9yIHRvIGhhbmRsZSBwYWNrYWdlIHJlZmVyZW5jZXMKIAkgKi8KLQlUeXBlQmluZGluZyBpbnRlcm5hbFJlc29sdmVUeXBlKFNjb3BlIHNjb3BlKSB7CisJcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUpIHsKIAkJLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCiAJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKS8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCi0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSA/IHRoaXMucmVzb2x2ZWRUeXBlIDogbnVsbDsgLy8gYWxyZWFkeSByZXBvcnRlZCBlcnJvcgotCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoICh0aGlzLnJlc29sdmVkVHlwZS5wcm9ibGVtSWQoKSkgeworCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlIDoKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZS5jbG9zZXN0TWF0Y2goKTsKKwkJCQkJCXJldHVybiB0eXBlOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQogCQl0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKKwkJLy8gRW5kIHJlc29sdXRpb24gd2hlbiBnZXRUeXBlQmluZGluZyhzY29wZSkgcmV0dXJucyBudWxsLiBUaGlzIG1heSBoYXBwZW4gaW4KKwkJLy8gY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0eXBpY2FsbHkgd2hlbiBhbiBpbGxlZ2FsIGFjY2VzcyBpcyBkb25lIG9uIGEgdHlwZQorCQkvLyB2YXJpYWJsZSAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0NzQ5KQorCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKIAkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQljaGFyW11bXSB0b2tlbnMgPSB7IHRoaXMudG9rZW4gfTsKIAkJCUJpbmRpbmcgYmluZGluZyA9IHNjb3BlLmdldFR5cGVPclBhY2thZ2UodG9rZW5zKTsKIAkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKIAkJCQl0aGlzLnBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQkJCS8vIFZhbGlkIHBhY2thZ2UgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBpbiBKYXZhZG9jIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxNjA5KQogCQkJfSBlbHNlIHsKIAkJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSB7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgY2xvc2VzdE1hdGNoID0gKChQcm9ibGVtUmVmZXJlbmNlQmluZGluZyl0aGlzLnJlc29sdmVkVHlwZSkuY2xvc2VzdE1hdGNoKCk7CisJCQkJCVR5cGVCaW5kaW5nIGNsb3Nlc3RNYXRjaCA9IHRoaXMucmVzb2x2ZWRUeXBlLmNsb3Nlc3RNYXRjaCgpOwogCQkJCQlpZiAoY2xvc2VzdE1hdGNoICE9IG51bGwgJiYgY2xvc2VzdE1hdGNoLmlzVHlwZVZhcmlhYmxlKCkpIHsKIAkJCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gY2xvc2VzdE1hdGNoOyAvLyBpZ25vcmUgcHJvYmxlbSBhcyB3ZSB3YW50IHJlcG9ydCBzcGVjaWZpYyBqYXZhZG9jIG9uZSBpbnN0ZWFkCiAJCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CkBAIC04NiwyMSArODAsMzIgQEAKIAkJfQogCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpKQogCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKTsKLQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB7Ci0JCQl0aGlzLnJlc29sdmVkVHlwZSA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKXRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpOworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5OTM2CisJCS8vIHJhdyBjb252ZXJ0IGFsbCBlbmNsb3NpbmcgdHlwZXMgd2hlbiBkZWFsaW5nIHdpdGggSmF2YWRvYyByZWZlcmVuY2VzCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pc0dlbmVyaWNUeXBlKCkgfHwgdGhpcy5yZXNvbHZlZFR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgdHJ1ZSAvKmZvcmNlIHRoZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKIAkJfQogCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKLQkgKiBXZSBuZWVkIHRvIG92ZXJyaWRlIHRvIGhhbmRsZSBwYWNrYWdlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBibG9ja1Njb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGJsb2NrU2NvcGUpOworCXByb3RlY3RlZCB2b2lkIHJlcG9ydERlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NEZXByZWNhdGVkVHlwZSh0eXBlLCB0aGlzLCBzY29wZS5nZXREZWNsYXJhdGlvbk1vZGlmaWVycygpKTsKIAl9CiAKLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGNsYXNzU2NvcGUpOworCXByb3RlY3RlZCB2b2lkIHJlcG9ydEludmFsaWRUeXBlKFNjb3BlIHNjb3BlKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkVHlwZSh0aGlzLCB0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUuZ2V0RGVjbGFyYXRpb25Nb2RpZmllcnMoKSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIFJlZGVmaW5lIHRvIGNhcHR1cmUgamF2YWRvYyBzcGVjaWZpYyBzaWduYXR1cmVzCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUjdHJhdmVyc2Uob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgeworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MYWJlbGVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xhYmVsZWRTdGF0ZW1lbnQuamF2YQppbmRleCAxNmQ0YzI5Li45ZmZmYTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xhYmVsZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xhYmVsZWRTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw3ICsxNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgTGFiZWxlZFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCisKIAlwdWJsaWMgU3RhdGVtZW50IHN0YXRlbWVudDsKIAlwdWJsaWMgY2hhcltdIGxhYmVsOwogCXB1YmxpYyBCcmFuY2hMYWJlbCB0YXJnZXRMYWJlbDsKQEAgLTI0LDEyICsyNCwxMiBAQAogCiAJLy8gZm9yIGxvY2FsIHZhcmlhYmxlcyB0YWJsZSBhdHRyaWJ1dGVzCiAJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7Ci0JCisKIAkvKioKIAkgKiBMYWJlbGVkU3RhdGVtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCiAJICovCiAJcHVibGljIExhYmVsZWRTdGF0ZW1lbnQoY2hhcltdIGxhYmVsLCBTdGF0ZW1lbnQgc3RhdGVtZW50LCBsb25nIGxhYmVsUG9zaXRpb24sIGludCBzb3VyY2VFbmQpIHsKLQkJCisKIAkJdGhpcy5zdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CiAJCS8vIHJlbWVtYmVyIHVzZWZ1bCBlbXB0eSBzdGF0ZW1lbnQKIAkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSBzdGF0ZW1lbnQuYml0cyB8PSBJc1VzZWZ1bEVtcHR5U3RhdGVtZW50OwpAQCAtMzgsNyArMzgsNyBAQAogCQl0aGlzLmxhYmVsRW5kID0gKGludCkgbGFiZWxQb3NpdGlvbjsKIAkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CiAJfQotCQorCiAJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAogCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCkBAIC00NiwxOSArNDYsMTkgQEAKIAogCQkvLyBuZWVkIHRvIHN0YWNrIGEgY29udGV4dCB0byBzdG9yZSBleHBsaWNpdCBsYWJlbCwgYW5zd2VyIGluaXRzIGluIGNhc2Ugb2Ygbm9ybWFsIGNvbXBsZXRpb24gbWVyZ2VkCiAJCS8vIHdpdGggdGhvc2UgcmVsYXRpdmUgdG8gdGhlIGV4aXQgcGF0aCBmcm9tIGJyZWFrIHN0YXRlbWVudCBvY2N1cnJpbmcgaW5zaWRlIHRoZSBsYWJlbGVkIHN0YXRlbWVudC4KLQkJaWYgKHN0YXRlbWVudCA9PSBudWxsKSB7CisJCWlmICh0aGlzLnN0YXRlbWVudCA9PSBudWxsKSB7CiAJCQlyZXR1cm4gZmxvd0luZm87CiAJCX0gZWxzZSB7CiAJCQlMYWJlbEZsb3dDb250ZXh0IGxhYmVsQ29udGV4dDsKIAkJCUZsb3dJbmZvIHN0YXRlbWVudEluZm8sIG1lcmdlZEluZm87Ci0JCQlzdGF0ZW1lbnRJbmZvID0gc3RhdGVtZW50LmFuYWx5c2VDb2RlKAorCQkJc3RhdGVtZW50SW5mbyA9IHRoaXMuc3RhdGVtZW50LmFuYWx5c2VDb2RlKAogCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkobGFiZWxDb250ZXh0ID0KIAkJCQkJbmV3IExhYmVsRmxvd0NvbnRleHQoCiAJCQkJCQlmbG93Q29udGV4dCwKIAkJCQkJCXRoaXMsCi0JCQkJCQlsYWJlbCwKLQkJCQkJCSh0YXJnZXRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpKSwKKwkJCQkJCXRoaXMubGFiZWwsCisJCQkJCQkodGhpcy50YXJnZXRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpKSwKIAkJCQkJCWN1cnJlbnRTY29wZSkpLAogCQkJCWZsb3dJbmZvKTsKIAkJCWJvb2xlYW4gcmVpbmplY3ROdWxsSW5mbyA9IChzdGF0ZW1lbnRJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCAmJgpAQCAtNjksNyArNjksNyBAQAogCQkJCSgoVW5jb25kaXRpb25hbEZsb3dJbmZvKW1lcmdlZEluZm8pLmFkZEluaXRpYWxpemF0aW9uc0Zyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEZpZWxkTGVzc0NvcHkoKSkuCiAJCQkJCWFkZEluaXRpYWxpemF0aW9uc0Zyb20obGFiZWxDb250ZXh0LmluaXRzT25CcmVhay51bmNvbmRpdGlvbmFsRmllbGRMZXNzQ29weSgpKTsKIAkJCX0KLQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOwogCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkxhYmVsVXNlZCkgPT0gMCkgewogCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRMYWJlbCh0aGlzKTsKQEAgLTc3LDEzICs3NywxMyBAQAogCQkJcmV0dXJuIG1lcmdlZEluZm87CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgQVNUTm9kZSBjb25jcmV0ZVN0YXRlbWVudCgpIHsKLQkJCisKIAkJLy8gcmV0dXJuIHN0YXRlbWVudC5jb25jcmV0ZVN0YXRlbWVudCgpOyAvLyBmb3Igc3VwcG9ydGluZyBuZXN0ZWQgbGFiZWxzOiAgIGE6YjpjOiBzb21lU3RhdGVtZW50IChzZWUgMjE5MTIpCi0JCXJldHVybiBzdGF0ZW1lbnQ7CisJCXJldHVybiB0aGlzLnN0YXRlbWVudDsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGxhYmVsZWQgc3RhdGVtZW50CiAJICoKQEAgLTkzLDM4ICs5MywzOCBAQAogCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQkKLQkJaWYgKChiaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKworCQlpZiAoKHRoaXMuYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CiAJCQlyZXR1cm47Ci0JCX0JCQorCQl9CiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmICh0YXJnZXRMYWJlbCAhPSBudWxsKSB7Ci0JCQl0YXJnZXRMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwotCQkJaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0JCQkJc3RhdGVtZW50LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQlpZiAodGhpcy50YXJnZXRMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLnRhcmdldExhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CisJCQlpZiAodGhpcy5zdGF0ZW1lbnQgIT0gbnVsbCkgeworCQkJCXRoaXMuc3RhdGVtZW50LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQkJfQotCQkJdGFyZ2V0TGFiZWwucGxhY2UoKTsKKwkJCXRoaXMudGFyZ2V0TGFiZWwucGxhY2UoKTsKIAkJfQogCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKLQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKLQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CiAJCX0KIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAotCQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKGxhYmVsKS5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuc3RhdGVtZW50ID09IG51bGwpIAorCQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKHRoaXMubGFiZWwpLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5zdGF0ZW1lbnQgPT0gbnVsbCkKIAkJCW91dHB1dC5hcHBlbmQoJzsnKTsKLQkJZWxzZSAKLQkJCXRoaXMuc3RhdGVtZW50LnByaW50U3RhdGVtZW50KDAsIG91dHB1dCk7IAorCQllbHNlCisJCQl0aGlzLnN0YXRlbWVudC5wcmludFN0YXRlbWVudCgwLCBvdXRwdXQpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewotCQkKKwogCQlpZiAodGhpcy5zdGF0ZW1lbnQgIT0gbnVsbCkgewogCQkJdGhpcy5zdGF0ZW1lbnQucmVzb2x2ZShzY29wZSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MaXRlcmFsLmphdmEKaW5kZXggOWQ2YzYzMC4uMjE1N2JlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMTUgKzE5LDE1IEBACiAKIAlwdWJsaWMgTGl0ZXJhbChpbnQgcywgaW50IGUpIHsKIAotCQlzb3VyY2VTdGFydCA9IHM7Ci0JCXNvdXJjZUVuZCA9IGU7CisJCXRoaXMuc291cmNlU3RhcnQgPSBzOworCQl0aGlzLnNvdXJjZUVuZCA9IGU7CiAJfQogCiAJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAogCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCQkKKwogCQlyZXR1cm4gZmxvd0luZm87CiAJfQogCkBAIC0zNiwxOSArMzYsMTkgQEAKIAlwdWJsaWMgYWJzdHJhY3QgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSk7CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkKKwogCQlyZXR1cm4gb3V0cHV0LmFwcGVuZChzb3VyY2UoKSk7CiAJIH0KLQkgCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCQkvLyBjb21wdXRlIHRoZSByZWFsIHZhbHVlLCB3aGljaCBtdXN0IHJhbmdlIGl0cyB0eXBlJ3MgcmFuZ2UKIAkJdGhpcy5yZXNvbHZlZFR5cGUgPSBsaXRlcmFsVHlwZShzY29wZSk7CiAKIAkJLy8gaW4gY2FzZSBvZiBlcnJvciwgY29uc3RhbnQgZGlkIHJlbWFpbiBudWxsCiAJCWNvbXB1dGVDb25zdGFudCgpOwotCQlpZiAoY29uc3RhbnQgPT0gbnVsbCkgeworCQlpZiAodGhpcy5jb25zdGFudCA9PSBudWxsKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb25zdGFudE91dE9mUmFuZ2UodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUpOwotCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDUwYzc4YWMuLjc2MDZkYzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNywxMCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBDb250cmlidXRpb25zIGZvciAKKyAqICAgICAJCQkJCQlidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKKyAqICAgICAJCQkJCQlidWcgMjkyNDc4IC0gUmVwb3J0IHBvdGVudGlhbGx5IG51bGwgYWNyb3NzIHZhcmlhYmxlIGFzc2lnbm1lbnQKKyAqICAgICAJCQkJCQlidWcgMzM1MDkzIC0gW2NvbXBpbGVyXVtudWxsXSBtaW5pbWFsIGhvb2sgZm9yIGZ1dHVyZSBudWxsIGFubm90YXRpb24gc3VwcG9ydAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKQEAgLTIwLDcgKzI0LDcgQEAKIHB1YmxpYyBjbGFzcyBMb2NhbERlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHsKIAogCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nOwotCQorCiAJcHVibGljIExvY2FsRGVjbGFyYXRpb24oCiAJCWNoYXJbXSBuYW1lLAogCQlpbnQgc291cmNlU3RhcnQsCkBAIC0zNCwzNCArMzgsNTQgQEAKIAogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkvLyByZWNvcmQgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gaWYgYW55Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKLQkJYml0cyB8PSBBU1ROb2RlLklzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZTsgLy8gb25seSBzZXQgaWYgYWN0dWFsbHkgcmVhY2hlZAorCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKKwkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlOyAvLyBvbmx5IHNldCBpZiBhY3R1YWxseSByZWFjaGVkCiAJfQotCWlmICh0aGlzLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsgCisJaWYgKHRoaXMuYmluZGluZyAhPSBudWxsICYmIHRoaXMudHlwZS5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKSB7CisJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlPSB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKTsKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZFNjb3BlLnJlZmVyZW5jZU1ldGhvZCgpOworCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCAmJiAoKG1ldGhvZERlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLkNhbkJlU3RhdGljKSAhPSAwKSAmJiBtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nICE9IG51bGwpIHsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gbWV0aG9kRGVjbGFyYXRpb24uYmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJCQlpZiAodHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CisJCQkJLy8gTWV0aG9kIGRlY2xhcmVzIG5vIHR5cGUgdmFyaWFibGVzLgorCQkJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gdG8gY2hlY2sgd2hldGhlciB0aGUgcmVzb2x2ZWQgdHlwZSBmb3IgdGhpcyBpcyBkZWNsYXJlZCBieSBlbmNsb3NpbmcgbWV0aG9kIGFzIGEgdHlwZSB2YXJpYWJsZQorCQkJCWJvb2xlYW4gdXNlc0VuY2xvc2luZ1R5cGVWYXIgPSBmYWxzZTsgCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlVmFyaWFibGVzLmxlbmd0aCA7IGkgKyspIHsKKwkJCQkJaWYgKHR5cGVWYXJpYWJsZXNbaV0gPT0gdGhpcy50eXBlLnJlc29sdmVkVHlwZSl7CisJCQkJCQl1c2VzRW5jbG9zaW5nVHlwZVZhciA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXVzZXNFbmNsb3NpbmdUeXBlVmFyKSB7CisJCQkJCS8vIHVzZXMgYSB0eXBlIHZhcmlhYmxlIG5vdCBkZWNsYXJlZCBieSBlbmNsb3NpbmcgbWV0aG9kCisJCQkJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgewogCQlyZXR1cm4gZmxvd0luZm87CiAJfQotCWludCBudWxsU3RhdHVzID0gdGhpcy5pbml0aWFsaXphdGlvbi5udWxsU3RhdHVzKGZsb3dJbmZvKTsKKwlpZiAoKHRoaXMuaW5pdGlhbGl6YXRpb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeworCQl0aGlzLmluaXRpYWxpemF0aW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CisJCiAJZmxvd0luZm8gPQogCQl0aGlzLmluaXRpYWxpemF0aW9uCiAJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCiAJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJaW50IG51bGxTdGF0dXMgPSB0aGlzLmluaXRpYWxpemF0aW9uLm51bGxTdGF0dXMoZmxvd0luZm8pOwogCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQodGhpcy5iaW5kaW5nKSl7Ly8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKIAkJdGhpcy5iaXRzIHw9IEZpcnN0QXNzaWdubWVudFRvTG9jYWw7CiAJfSBlbHNlIHsKIAkJdGhpcy5iaXRzICY9IH5GaXJzdEFzc2lnbm1lbnRUb0xvY2FsOyAgLy8gaW50IGkgPSAoaSA9IDApOwotCX0JCi0JZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGJpbmRpbmcpOworCX0KKwlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQodGhpcy5iaW5kaW5nKTsKKwludWxsU3RhdHVzID0gY2hlY2tBZ2FpbnN0TnVsbEFubm90YXRpb24oY3VycmVudFNjb3BlLCB0aGlzLmJpbmRpbmcsIG51bGxTdGF0dXMpOwkJCiAJaWYgKCh0aGlzLmJpbmRpbmcudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSA9PSAwKSB7Ci0JCXN3aXRjaChudWxsU3RhdHVzKSB7Ci0JCQljYXNlIEZsb3dJbmZvLk5VTEwgOgotCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlOdWxsKHRoaXMuYmluZGluZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZsb3dJbmZvLk5PTl9OVUxMIDoKLQkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbCh0aGlzLmJpbmRpbmcpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5VW5rbm93bih0aGlzLmJpbmRpbmcpOwotCQl9CisJCWZsb3dJbmZvLm1hcmtOdWxsU3RhdHVzKHRoaXMuYmluZGluZywgbnVsbFN0YXR1cyk7CiAJCS8vIG5vIG5lZWQgdG8gaW5mb3JtIGVuY2xvc2luZyB0cnkgYmxvY2sgc2luY2UgaXRzIGxvY2FscyB3b24ndCBnZXQKIAkJLy8ga25vd24gYnkgdGhlIGZpbmFsbHkgYmxvY2sKIAl9CkBAIC03MSw1NSArOTUsNTUgQEAKIAlwdWJsaWMgdm9pZCBjaGVja01vZGlmaWVycygpIHsKIAogCQkvL29ubHkgcG90ZW50aWFsIHZhbGlkIG1vZGlmaWVyIGlzIDw8ZmluYWw+PgotCQlpZiAoKChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnKSAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpICE9IDApCisJCWlmICgoKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwKQogCQkJLy9BY2NNb2RpZmllclByb2JsZW0gLT4gb3RoZXIgKG5vbi12aXNpYmlsaXR5IHByb2JsZW0pCiAJCQkvL0FjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSAtPiBkdXBsaWNhdGUgbW9kaWZpZXIKIAkJCS8vQWNjTW9kaWZpZXJQcm9ibGVtIHwgQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtIC0+IHZpc2liaWxpdHkgcHJvYmxlbSIKIAotCQkJbW9kaWZpZXJzID0gKG1vZGlmaWVycyAmIH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY01vZGlmaWVyUHJvYmxlbTsKKwkJCXRoaXMubW9kaWZpZXJzID0gKHRoaXMubW9kaWZpZXJzICYgfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTW9kaWZpZXJQcm9ibGVtOwogCX0KIAogCS8qKgogCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBsb2NhbCBkZWNsYXJhdGlvbjoKLQkgKglpLmUuJm5ic3A7bm9ybWFsIGFzc2lnbm1lbnQgdG8gYSBsb2NhbCB2YXJpYWJsZSArIHVudXNlZCB2YXJpYWJsZSBoYW5kbGluZyAKKwkgKglpLmUuJm5ic3A7bm9ybWFsIGFzc2lnbm1lbnQgdG8gYSBsb2NhbCB2YXJpYWJsZSArIHVudXNlZCB2YXJpYWJsZSBoYW5kbGluZwogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAKIAkJLy8gZXZlbiBpZiBub3QgcmVhY2hhYmxlLCB2YXJpYWJsZSBtdXN0IGJlIGFkZGVkIHRvIHZpc2libGUgaWYgYWxsb2NhdGVkICgyODI5OCkKLQkJaWYgKGJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgewotCQkJY29kZVN0cmVhbS5hZGRWaXNpYmxlTG9jYWxWYXJpYWJsZShiaW5kaW5nKTsKKwkJaWYgKHRoaXMuYmluZGluZy5yZXNvbHZlZFBvc2l0aW9uICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLmFkZFZpc2libGVMb2NhbFZhcmlhYmxlKHRoaXMuYmluZGluZyk7CiAJCX0KLQkJaWYgKChiaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKKwkJaWYgKCh0aGlzLmJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgewogCQkJcmV0dXJuOwogCQl9CiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAKIAkJLy8gc29tZXRoaW5nIHRvIGluaXRpYWxpemU/CiAJCWdlbmVyYXRlSW5pdDogewotCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgCisJCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiA9PSBudWxsKQogCQkJCWJyZWFrIGdlbmVyYXRlSW5pdDsKIAkJCS8vIGZvcmdldCBpbml0aWFsaXppbmcgdW51c2VkIG9yIGZpbmFsIGxvY2FscyBzZXQgdG8gY29uc3RhbnQgdmFsdWUgKGZpbmFsIG9uZXMgYXJlIGlubGluZWQpCi0JCQlpZiAoYmluZGluZy5yZXNvbHZlZFBvc2l0aW9uIDwgMCkgewotCQkJCWlmIChpbml0aWFsaXphdGlvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIAorCQkJaWYgKHRoaXMuYmluZGluZy5yZXNvbHZlZFBvc2l0aW9uIDwgMCkgeworCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKIAkJCQkJYnJlYWsgZ2VuZXJhdGVJbml0OwogCQkJCS8vIGlmIGJpbmRpbmcgdW51c2VkIGdlbmVyYXRlIHRoZW4gZGlzY2FyZCB0aGUgdmFsdWUKLQkJCQlpbml0aWFsaXphdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJdGhpcy5pbml0aWFsaXphdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCQkJYnJlYWsgZ2VuZXJhdGVJbml0OwogCQkJfQotCQkJaW5pdGlhbGl6YXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkvLyAyNjkwMywgbmVlZCBleHRyYSBjYXN0IHRvIHN0b3JlIG51bGwgaW4gYXJyYXkgbG9jYWwgdmFyCQotCQkJaWYgKGJpbmRpbmcudHlwZS5pc0FycmF5VHlwZSgpIAotCQkJCSYmIChpbml0aWFsaXphdGlvbi5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTAkvLyBhcnJheUxvYyA9IG51bGwKLQkJCQkJfHwgKChpbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKQkvLyBhcnJheUxvYyA9ICh0eXBlW10pbnVsbAotCQkJCQkJJiYgKCgoQ2FzdEV4cHJlc3Npb24paW5pdGlhbGl6YXRpb24pLmlubmVybW9zdENhc3RlZEV4cHJlc3Npb24oKS5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCkpKSl7Ci0JCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QoYmluZGluZy50eXBlKTsgCi0JCQl9CQkJCQkKLQkJCWNvZGVTdHJlYW0uc3RvcmUoYmluZGluZywgZmFsc2UpOworCQkJdGhpcy5pbml0aWFsaXphdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCS8vIDI2OTAzLCBuZWVkIGV4dHJhIGNhc3QgdG8gc3RvcmUgbnVsbCBpbiBhcnJheSBsb2NhbCB2YXIKKwkJCWlmICh0aGlzLmJpbmRpbmcudHlwZS5pc0FycmF5VHlwZSgpCisJCQkJJiYgKHRoaXMuaW5pdGlhbGl6YXRpb24ucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwJLy8gYXJyYXlMb2MgPSBudWxsCisJCQkJCXx8ICgodGhpcy5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKQkvLyBhcnJheUxvYyA9ICh0eXBlW10pbnVsbAorCQkJCQkJJiYgKCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5pbml0aWFsaXphdGlvbikuaW5uZXJtb3N0Q2FzdGVkRXhwcmVzc2lvbigpLnJlc29sdmVkVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKSkpKXsKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmJpbmRpbmcudHlwZSk7CisJCQl9CisJCQljb2RlU3RyZWFtLnN0b3JlKHRoaXMuYmluZGluZywgZmFsc2UpOwogCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkZpcnN0QXNzaWdubWVudFRvTG9jYWwpICE9IDApIHsKIAkJCQkvKiBWYXJpYWJsZSBtYXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGR1cmluZyB0aGUgY29kZSBpbml0aWFsaXppbmcgaXQKIAkJCQkJZS5nLiBpbnQgaSA9IChpID0gMSk7CiAJCQkJKi8KLQkJCQliaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJCQl0aGlzLmJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJfQogCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CkBAIC0xMzEsMTEgKzE1NSwxMSBAQAogCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKIAkJcmV0dXJuIExPQ0FMX1ZBUklBQkxFOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCS8vIGNyZWF0ZSBhIGJpbmRpbmcgYW5kIGFkZCBpdCB0byB0aGUgc2NvcGUKLQkJVHlwZUJpbmRpbmcgdmFyaWFibGVUeXBlID0gdHlwZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7CisJCVR5cGVCaW5kaW5nIHZhcmlhYmxlVHlwZSA9IHRoaXMudHlwZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7CiAKIAkJY2hlY2tNb2RpZmllcnMoKTsKIAkJaWYgKHZhcmlhYmxlVHlwZSAhPSBudWxsKSB7CkBAIC0xNDgsOCArMTcyLDggQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KLQkJCi0JCUJpbmRpbmcgZXhpc3RpbmdWYXJpYWJsZSA9IHNjb3BlLmdldEJpbmRpbmcobmFtZSwgQmluZGluZy5WQVJJQUJMRSwgdGhpcywgZmFsc2UgLypkbyBub3QgcmVzb2x2ZSBoaWRkZW4gZmllbGQqLyk7CisKKwkJQmluZGluZyBleGlzdGluZ1ZhcmlhYmxlID0gc2NvcGUuZ2V0QmluZGluZyh0aGlzLm5hbWUsIEJpbmRpbmcuVkFSSUFCTEUsIHRoaXMsIGZhbHNlIC8qZG8gbm90IHJlc29sdmUgaGlkZGVuIGZpZWxkKi8pOwogCQlpZiAoZXhpc3RpbmdWYXJpYWJsZSAhPSBudWxsICYmIGV4aXN0aW5nVmFyaWFibGUuaXNWYWxpZEJpbmRpbmcoKSl7CiAJCQlpZiAoZXhpc3RpbmdWYXJpYWJsZSBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nICYmIHRoaXMuaGlkZGVuVmFyaWFibGVEZXB0aCA9PSAwKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmVkZWZpbmVMb2NhbCh0aGlzKTsKQEAgLTE1NywyOSArMTgxLDI5IEBACiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZUhpZGluZyh0aGlzLCBleGlzdGluZ1ZhcmlhYmxlLCBmYWxzZSk7CiAJCQl9CiAJCX0KLQkJCQkKLQkJaWYgKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpIT0gMCAmJiB0aGlzLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKLQkJCW1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0JsYW5rRmluYWw7CisKKwkJaWYgKCh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkhPSAwICYmIHRoaXMuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgeworCQkJdGhpcy5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NCbGFua0ZpbmFsOwogCQl9Ci0JCXRoaXMuYmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyh0aGlzLCB2YXJpYWJsZVR5cGUsIG1vZGlmaWVycywgZmFsc2UpOwotCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKGJpbmRpbmcpOworCQl0aGlzLmJpbmRpbmcgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcodGhpcywgdmFyaWFibGVUeXBlLCB0aGlzLm1vZGlmaWVycywgZmFsc2UpOworCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuYmluZGluZyk7CiAJCXRoaXMuYmluZGluZy5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOwogCQkvLyBhbGxvdyB0byByZWN1cnNpdmVsbHkgdGFyZ2V0IHRoZSBiaW5kaW5nLi4uLgogCQkvLyB0aGUgY29ycmVjdCBjb25zdGFudCBpcyBoYXJtZWQgaWYgY29ycmVjdGx5IGNvbXB1dGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QKIAogCQlpZiAodmFyaWFibGVUeXBlID09IG51bGwpIHsKLQkJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKQotCQkJCWluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlKHNjb3BlKTsgLy8gd2FudCB0byByZXBvcnQgYWxsIHBvc3NpYmxlIGVycm9ycworCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkKKwkJCQl0aGlzLmluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlKHNjb3BlKTsgLy8gd2FudCB0byByZXBvcnQgYWxsIHBvc3NpYmxlIGVycm9ycwogCQkJcmV0dXJuOwogCQl9CiAKLQkJLy8gc3RvcmUgdGhlIGNvbnN0YW50IGZvciBmaW5hbCBsb2NhbHMgCQotCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikgewotCQkJCVR5cGVCaW5kaW5nIGluaXRpYWxpemF0aW9uVHlwZSA9IGluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCB2YXJpYWJsZVR5cGUpOworCQkvLyBzdG9yZSB0aGUgY29uc3RhbnQgZm9yIGZpbmFsIGxvY2FscworCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKKwkJCQlUeXBlQmluZGluZyBpbml0aWFsaXphdGlvblR5cGUgPSB0aGlzLmluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCB2YXJpYWJsZVR5cGUpOwogCQkJCWlmIChpbml0aWFsaXphdGlvblR5cGUgIT0gbnVsbCkgewotCQkJCQkoKEFycmF5SW5pdGlhbGl6ZXIpIGluaXRpYWxpemF0aW9uKS5iaW5kaW5nID0gKEFycmF5QmluZGluZykgaW5pdGlhbGl6YXRpb25UeXBlOwotCQkJCQlpbml0aWFsaXphdGlvbi5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdmFyaWFibGVUeXBlLCBpbml0aWFsaXphdGlvblR5cGUpOworCQkJCQkoKEFycmF5SW5pdGlhbGl6ZXIpIHRoaXMuaW5pdGlhbGl6YXRpb24pLmJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSBpbml0aWFsaXphdGlvblR5cGU7CisJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhcmlhYmxlVHlwZSwgaW5pdGlhbGl6YXRpb25UeXBlKTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJICAgIHRoaXMuaW5pdGlhbGl6YXRpb24uc2V0RXhwZWN0ZWRUeXBlKHZhcmlhYmxlVHlwZSk7CkBAIC0xODcsNDUgKzIxMSw0MyBAQAogCQkJCWlmIChpbml0aWFsaXphdGlvblR5cGUgIT0gbnVsbCkgewogCQkJCQlpZiAodmFyaWFibGVUeXBlICE9IGluaXRpYWxpemF0aW9uVHlwZSkgLy8gbXVzdCBjYWxsIGJlZm9yZSBjb21wdXRlQ29udmVyc2lvbigpIGFuZCB0eXBlTWlzbWF0Y2hFcnJvcigpCiAJCQkJCQlzY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVDb252ZXJzaW9uKHZhcmlhYmxlVHlwZSwgaW5pdGlhbGl6YXRpb25UeXBlKTsKLQkJCQkJaWYgKGluaXRpYWxpemF0aW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoaW5pdGlhbGl6YXRpb25UeXBlLCB2YXJpYWJsZVR5cGUpCi0JCQkJCQl8fCAodmFyaWFibGVUeXBlLmlzQmFzZVR5cGUoKSAmJiBCYXNlVHlwZUJpbmRpbmcuaXNXaWRlbmluZyh2YXJpYWJsZVR5cGUuaWQsIGluaXRpYWxpemF0aW9uVHlwZS5pZCkpCisJCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoaW5pdGlhbGl6YXRpb25UeXBlLCB2YXJpYWJsZVR5cGUpCiAJCQkJCQl8fCBpbml0aWFsaXphdGlvblR5cGUuaXNDb21wYXRpYmxlV2l0aCh2YXJpYWJsZVR5cGUpKSB7CiAJCQkJCQl0aGlzLmluaXRpYWxpemF0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB2YXJpYWJsZVR5cGUsIGluaXRpYWxpemF0aW9uVHlwZSk7CiAJCQkJCQlpZiAoaW5pdGlhbGl6YXRpb25UeXBlLm5lZWRzVW5jaGVja2VkQ29udmVyc2lvbih2YXJpYWJsZVR5cGUpKSB7CiAJCQkJCQkgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlVHlwZUNvbnZlcnNpb24odGhpcy5pbml0aWFsaXphdGlvbiwgaW5pdGlhbGl6YXRpb25UeXBlLCB2YXJpYWJsZVR5cGUpOwotCQkJCQkJfQkJCQkJCQotCQkJCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbiAKKwkJCQkJCX0KKwkJCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24KIAkJCQkJCQkJJiYgKHRoaXMuaW5pdGlhbGl6YXRpb24uYml0cyAmIEFTVE5vZGUuVW5uZWNlc3NhcnlDYXN0KSA9PSAwKSB7CiAJCQkJCQkJQ2FzdEV4cHJlc3Npb24uY2hlY2tOZWVkRm9yQXNzaWduZWRDYXN0KHNjb3BlLCB2YXJpYWJsZVR5cGUsIChDYXN0RXhwcmVzc2lvbikgdGhpcy5pbml0aWFsaXphdGlvbik7Ci0JCQkJCQl9CQotCQkJCQl9IGVsc2UgaWYgKHNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoaW5pdGlhbGl6YXRpb25UeXBlLCB2YXJpYWJsZVR5cGUpIAotCQkJCQkJCQkJCXx8IChpbml0aWFsaXphdGlvblR5cGUuaXNCYXNlVHlwZSgpICAvLyBuYXJyb3dpbmcgdGhlbiBib3hpbmcgPwotCQkJCQkJCQkJCQkJJiYgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvLyBhdXRvYm94aW5nCi0JCQkJCQkJCQkJCQkmJiAhdmFyaWFibGVUeXBlLmlzQmFzZVR5cGUoKQotCQkJCQkJCQkJCQkJJiYgaW5pdGlhbGl6YXRpb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShpbml0aWFsaXphdGlvblR5cGUsIHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUodmFyaWFibGVUeXBlKSkpKSB7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoaXNCb3hpbmdDb21wYXRpYmxlKGluaXRpYWxpemF0aW9uVHlwZSwgdmFyaWFibGVUeXBlLCB0aGlzLmluaXRpYWxpemF0aW9uLCBzY29wZSkpIHsKIAkJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHZhcmlhYmxlVHlwZSwgaW5pdGlhbGl6YXRpb25UeXBlKTsKLQkJCQkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24gCisJCQkJCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uCiAJCQkJCQkJCSYmICh0aGlzLmluaXRpYWxpemF0aW9uLmJpdHMgJiBBU1ROb2RlLlVubmVjZXNzYXJ5Q2FzdCkgPT0gMCkgewogCQkJCQkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFzc2lnbmVkQ2FzdChzY29wZSwgdmFyaWFibGVUeXBlLCAoQ2FzdEV4cHJlc3Npb24pIHRoaXMuaW5pdGlhbGl6YXRpb24pOwotCQkJCQkJfQkKKwkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGluaXRpYWxpemF0aW9uVHlwZSwgdmFyaWFibGVUeXBlLCB0aGlzLmluaXRpYWxpemF0aW9uKTsKKwkJCQkJCWlmICgodmFyaWFibGVUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQkJCQkJLy8gaWYgcHJvYmxlbSBhbHJlYWR5IGdvdCBzaWduYWxlZCBvbiB0eXBlLCBkbyBub3QgcmVwb3J0IHNlY29uZGFyeSBwcm9ibGVtCisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IoaW5pdGlhbGl6YXRpb25UeXBlLCB2YXJpYWJsZVR5cGUsIHRoaXMuaW5pdGlhbGl6YXRpb24sIG51bGwpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJLy8gY2hlY2sgZm9yIGFzc2lnbm1lbnQgd2l0aCBubyBlZmZlY3QKLQkJCWlmICh0aGlzLmJpbmRpbmcgPT0gQXNzaWdubWVudC5nZXREaXJlY3RCaW5kaW5nKHRoaXMuaW5pdGlhbGl6YXRpb24pKSB7CisJCQlpZiAodGhpcy5iaW5kaW5nID09IEV4cHJlc3Npb24uZ2V0RGlyZWN0QmluZGluZyh0aGlzLmluaXRpYWxpemF0aW9uKSkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFzc2lnbm1lbnRIYXNOb0VmZmVjdCh0aGlzLCB0aGlzLm5hbWUpOwogCQkJfQogCQkJLy8gY2hhbmdlIHRoZSBjb25zdGFudCBpbiB0aGUgYmluZGluZyB3aGVuIGl0IGlzIGZpbmFsCiAJCQkvLyAodGhlIG9wdGltaXphdGlvbiBvZiB0aGUgY29uc3RhbnQgcHJvcGFnYXRpb24gd2lsbCBiZSBkb25lIGxhdGVyIG9uKQogCQkJLy8gY2FzdCBmcm9tIGNvbnN0YW50IGFjdHVhbCB0eXBlIHRvIHZhcmlhYmxlIHR5cGUKLQkJCWJpbmRpbmcuc2V0Q29uc3RhbnQoCi0JCQkJYmluZGluZy5pc0ZpbmFsKCkKLQkJCQkJPyBpbml0aWFsaXphdGlvbi5jb25zdGFudC5jYXN0VG8oKHZhcmlhYmxlVHlwZS5pZCA8PCA0KSArIGluaXRpYWxpemF0aW9uLmNvbnN0YW50LnR5cGVJRCgpKQorCQkJdGhpcy5iaW5kaW5nLnNldENvbnN0YW50KAorCQkJCXRoaXMuYmluZGluZy5pc0ZpbmFsKCkKKwkJCQkJPyB0aGlzLmluaXRpYWxpemF0aW9uLmNvbnN0YW50LmNhc3RUbygodmFyaWFibGVUeXBlLmlkIDw8IDQpICsgdGhpcy5pbml0aWFsaXphdGlvbi5jb25zdGFudC50eXBlSUQoKSkKIAkJCQkJOiBDb25zdGFudC5Ob3RBQ29uc3RhbnQpOwogCQl9Ci0JCS8vIG9ubHkgcmVzb2x2ZSBhbm5vdGF0aW9uIGF0IHRoZSBlbmQsIGZvciBjb25zdGFudCB0byBiZSBwb3NpdGlvbm5lZCBiZWZvcmUgKDk2OTkxKQorCQkvLyBvbmx5IHJlc29sdmUgYW5ub3RhdGlvbiBhdCB0aGUgZW5kLCBmb3IgY29uc3RhbnQgdG8gYmUgcG9zaXRpb25lZCBiZWZvcmUgKDk2OTkxKQogCQlyZXNvbHZlQW5ub3RhdGlvbnMoc2NvcGUsIHRoaXMuYW5ub3RhdGlvbnMsIHRoaXMuYmluZGluZyk7CiAJfQogCkBAIC0yMzcsOSArMjU5LDkgQEAKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zTGVuZ3RoOyBpKyspCiAJCQkJCXRoaXMuYW5ub3RhdGlvbnNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQkJfQotCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkKLQkJCQlpbml0aWFsaXphdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLnR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkKKwkJCQl0aGlzLmluaXRpYWxpemF0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsLmphdmEKaW5kZXggNDc4Njg1My4uODdjYTc1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw4NyArMTAsMTM0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkxvbmdDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CiAKIHB1YmxpYyBjbGFzcyBMb25nTGl0ZXJhbCBleHRlbmRzIE51bWJlckxpdGVyYWwgewotCXN0YXRpYyBmaW5hbCBDb25zdGFudCBGT1JNQVRfRVJST1IgPSBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUoMS4wLzAuMCk7IC8vIE5hTjsJCi0JCQotcHVibGljIExvbmdMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsaW50IGUpIHsKLQlzdXBlcih0b2tlbiwgcyxlKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhBX01JTl9WQUxVRSAgICAgICAgPSAiMHg4MDAwMDAwMDAwMDAwMDAwTCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhBX01JTlVTX09ORV9WQUxVRSAgPSAiMHhmZmZmZmZmZmZmZmZmZmZmTCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBPQ1RBTF9NSU5fVkFMVUUgICAgICAgPSAiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDBMIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE9DVEFMX01JTlVTX09ORV9WQUxVRSA9ICIwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N0wiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gREVDSU1BTF9NSU5fVkFMVUUgICAgID0gIjkyMjMzNzIwMzY4NTQ3NzU4MDhMIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIERFQ0lNQUxfTUFYX1ZBTFVFICAgICA9ICI5MjIzMzcyMDM2ODU0Nzc1ODA3TCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBjaGFyW10gcmVkdWNlZEZvcm07IC8vIG5vIHVuZGVyc2NvcmVzCisKKwlwdWJsaWMgc3RhdGljIExvbmdMaXRlcmFsIGJ1aWxkTG9uZ0xpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgcywgaW50IGUpIHsKKwkJLy8gcmVtb3ZlICdfJyBhbmQgcHJlZml4ICcwJyBmaXJzdAorCQljaGFyW10gbG9uZ1JlZHVjZWRUb2tlbiA9IHJlbW92ZVByZWZpeFplcm9zQW5kVW5kZXJzY29yZXModG9rZW4sIHRydWUpOworCQlzd2l0Y2gobG9uZ1JlZHVjZWRUb2tlbi5sZW5ndGgpIHsKKwkJCWNhc2UgMTkgOgorCQkJCS8vIDB4ODAwMDAwMDAwMDAwMDAwMEwKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobG9uZ1JlZHVjZWRUb2tlbiwgSEVYQV9NSU5fVkFMVUUpKSB7CisJCQkJCXJldHVybiBuZXcgTG9uZ0xpdGVyYWxNaW5WYWx1ZSh0b2tlbiwgbG9uZ1JlZHVjZWRUb2tlbiAhPSB0b2tlbiA/IGxvbmdSZWR1Y2VkVG9rZW4gOiBudWxsLCBzLCBlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI0IDoKKwkJCQkvLyAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMEwKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobG9uZ1JlZHVjZWRUb2tlbiwgT0NUQUxfTUlOX1ZBTFVFKSkgeworCQkJCQlyZXR1cm4gbmV3IExvbmdMaXRlcmFsTWluVmFsdWUodG9rZW4sIGxvbmdSZWR1Y2VkVG9rZW4gIT0gdG9rZW4gPyBsb25nUmVkdWNlZFRva2VuIDogbnVsbCwgcywgZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBuZXcgTG9uZ0xpdGVyYWwodG9rZW4sIGxvbmdSZWR1Y2VkVG9rZW4gIT0gdG9rZW4gPyBsb25nUmVkdWNlZFRva2VuIDogbnVsbCwgcywgZSk7CisJfQorCitMb25nTGl0ZXJhbChjaGFyW10gdG9rZW4sIGNoYXJbXSByZWR1Y2VkRm9ybSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJc3VwZXIodG9rZW4sIHN0YXJ0LCBlbmQpOworCXRoaXMucmVkdWNlZEZvcm0gPSByZWR1Y2VkRm9ybTsKK30KK3B1YmxpYyBMb25nTGl0ZXJhbCBjb252ZXJ0VG9NaW5WYWx1ZSgpIHsKKwlpZiAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgIT0gMCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJY2hhcltdIHRva2VuID0gdGhpcy5yZWR1Y2VkRm9ybSAhPSBudWxsID8gdGhpcy5yZWR1Y2VkRm9ybSA6IHRoaXMuc291cmNlOworCXN3aXRjaCh0b2tlbi5sZW5ndGgpIHsKKwkJY2FzZSAyMCA6CisJCQkvLyA5MjIzMzcyMDM2ODU0Nzc1ODA4TAorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRva2VuLCBERUNJTUFMX01JTl9WQUxVRSwgZmFsc2UpKSB7CisJCQkJcmV0dXJuIG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlKHRoaXMuc291cmNlLCB0aGlzLnJlZHVjZWRGb3JtLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHRoaXM7CiB9CiBwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7Ci0JLy90aGUgb3ZlcmZsb3cgKHdoZW4gcmFkaXg9MTApIGlzIHRlc3RlZCB1c2luZyB0aGUgZmFjdCB0aGF0Ci0JLy90aGUgdmFsdWUgc2hvdWxkIGFsd2F5cyBncm93IGR1cmluZyBpdHMgY29tcHV0YXRpb24KLQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCAtIDE7IC8vbWludXMgb25lIGJlY2F1c2UgdGhlIGxhc3QgY2hhciBpcyAnbCcgb3IgJ0wnCi0JCi0JbG9uZyBjb21wdXRlZFZhbHVlIDsKLQlpZiAoc291cmNlWzBdID09ICcwJykgeworCWNoYXJbXSB0b2tlbiA9IHRoaXMucmVkdWNlZEZvcm0gIT0gbnVsbCA/IHRoaXMucmVkdWNlZEZvcm0gOiB0aGlzLnNvdXJjZTsKKwlpbnQgdG9rZW5MZW5ndGggPSB0b2tlbi5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRva2VuTGVuZ3RoIC0gMTsKKwlpbnQgcmFkaXggPSAxMDsKKwlpbnQgaiA9IDA7CisJaWYgKHRva2VuWzBdID09ICcwJykgewogCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCWNvbnN0YW50ID0gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSgwTCk7CisJCQl0aGlzLmNvbnN0YW50ID0gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSgwTCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZmluYWwgaW50IHNoaWZ0LHJhZGl4OwotCQlpbnQgaiA7Ci0JCWlmICggKHNvdXJjZVsxXSA9PSAneCcpIHx8IChzb3VyY2VbMV0gPT0gJ1gnKSApIHsKLQkJCXNoaWZ0ID0gNCA7IGogPSAyOyByYWRpeCA9IDE2OworCQlpZiAoKHRva2VuWzFdID09ICd4JykgfHwgKHRva2VuWzFdID09ICdYJykpIHsKKwkJCXJhZGl4ID0gMTY7CisJCQlqID0gMjsKKwkJfSBlbHNlIGlmICgodG9rZW5bMV0gPT0gJ2InKSB8fCAodG9rZW5bMV0gPT0gJ0InKSkgeworCQkJcmFkaXggPSAyOworCQkJaiA9IDI7CiAJCX0gZWxzZSB7Ci0JCQlzaGlmdCA9IDMgOyBqID0gMTsgcmFkaXggPSA4OwotCQl9Ci0JCWludCBuYkRpZ2l0ID0gMDsKLQkJd2hpbGUgKHNvdXJjZVtqXT09JzAnKSB7Ci0JCQlqKys7IC8vanVtcCBvdmVyIHJlZG9uZGFudCB6ZXJvCi0JCQlpZiAoIGogPT0gbGVuZ3RoKSB7Ci0JCQkJLy93YXRjaCBmb3IgMDAwMDAwMDAwMDAwMEwKLQkJCQljb25zdGFudCA9IExvbmdDb25zdGFudC5mcm9tVmFsdWUoMEwpOwotCQkJCXJldHVybiA7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaW50IGRpZ2l0VmFsdWUgOwotCQlpZiAoKGRpZ2l0VmFsdWUgPSBTY2FubmVySGVscGVyLmRpZ2l0KHNvdXJjZVtqKytdLHJhZGl4KSkgPCAwICkgewotCQkJY29uc3RhbnQgPSBGT1JNQVRfRVJST1I7IHJldHVybiA7Ci0JCX0KLQkJaWYgKGRpZ2l0VmFsdWUgPj0gOCkKLQkJCW5iRGlnaXQgPSA0OwotCQllbHNlIGlmIChkaWdpdFZhbHVlID49IDQpCi0JCQluYkRpZ2l0ID0gMzsKLQkJZWxzZSBpZiAoZGlnaXRWYWx1ZSA+PSAyKQotCQkJbmJEaWdpdCA9IDI7Ci0JCWVsc2UKLQkJCW5iRGlnaXQgPSAxOyAvL2RpZ2l0VmFsdWUgaXMgbm90IDAKLQkJY29tcHV0ZWRWYWx1ZSA9IGRpZ2l0VmFsdWUgOwotCQl3aGlsZSAoajxsZW5ndGgpIHsKLQkJCWlmICgoZGlnaXRWYWx1ZSA9IFNjYW5uZXJIZWxwZXIuZGlnaXQoc291cmNlW2orK10scmFkaXgpKSA8IDApIHsKLQkJCQljb25zdGFudCA9IEZPUk1BVF9FUlJPUjsgcmV0dXJuIDsKLQkJCX0KLQkJCWlmICgobmJEaWdpdCArPSBzaGlmdCkgPiA2NCkKLQkJCQlyZXR1cm4gLypjb25zdGFudCBzdGF5cyBudWxsKi8gOwotCQkJY29tcHV0ZWRWYWx1ZSA9IChjb21wdXRlZFZhbHVlPDxzaGlmdCkgfCBkaWdpdFZhbHVlIDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vLS0tLS0tLS0tLS1jYXNlIHJhZGl4PTEwLS0tLS0tLS0tLS0tLS0tLS0KLQkJbG9uZyBwcmV2aW91cyA9IDA7Ci0JCWNvbXB1dGVkVmFsdWUgPSAwOwotCQlmaW5hbCBsb25nIGxpbWl0ID0gTG9uZy5NQVhfVkFMVUUgLyAxMDsgLy8gbmVlZGVkIHRvIGNoZWNrIHByaW9yIHRvIHRoZSBtdWx0aXBsaWNhdGlvbgotCQlmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaW50IGRpZ2l0VmFsdWUgOwkKLQkJCWlmICgoZGlnaXRWYWx1ZSA9IFNjYW5uZXJIZWxwZXIuZGlnaXQoc291cmNlW2ldLCAxMCkpIDwgMCApIHJldHVybiAvKmNvbnN0YW50IHN0YXlzIG51bGwqLzsKLQkJCXByZXZpb3VzID0gY29tcHV0ZWRWYWx1ZTsKLQkJCWlmIChjb21wdXRlZFZhbHVlID4gbGltaXQpCi0JCQkJcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovOwotCQkJY29tcHV0ZWRWYWx1ZSAqPSAxMDsKLQkJCWlmICgoY29tcHV0ZWRWYWx1ZSArIGRpZ2l0VmFsdWUpID4gTG9uZy5NQVhfVkFMVUUpCi0JCQkJcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovOwotCQkJY29tcHV0ZWRWYWx1ZSArPSBkaWdpdFZhbHVlOwotCQkJaWYgKHByZXZpb3VzID4gY29tcHV0ZWRWYWx1ZSkKLQkJCQlyZXR1cm4gLypjb25zdGFudCBzdGF5cyBudWxsKi87CisJCQlyYWRpeCA9IDg7CisJCQlqID0gMTsKIAkJfQogCX0KLQljb25zdGFudCA9IExvbmdDb25zdGFudC5mcm9tVmFsdWUoY29tcHV0ZWRWYWx1ZSk7CisJc3dpdGNoKHJhZGl4KSB7CisJCWNhc2UgMiA6CisJCQlpZiAoKGxlbmd0aCAtIDIpID4gNjQpIHsgLy8gcmVtb3ZlIDBiIG9yIDBCCisJCQkJcmV0dXJuOyAvKmNvbnN0YW50IHN0YXlzIG51bGwqLworCQkJfQorCQkJY29tcHV0ZVZhbHVlKHRva2VuLCBsZW5ndGgsIHJhZGl4LCBqKTsKKwkJCWJyZWFrOworCQljYXNlIDE2IDoKKwkJCWlmICh0b2tlbkxlbmd0aCA8PSAxOSkgeworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0b2tlbiwgSEVYQV9NSU5VU19PTkVfVkFMVUUpKSB7CisJCQkJCXRoaXMuY29uc3RhbnQgPSBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKC0xTCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJY29tcHV0ZVZhbHVlKHRva2VuLCBsZW5ndGgsIHJhZGl4LCBqKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDEwIDoKKwkJCWlmICh0b2tlbkxlbmd0aCA+IERFQ0lNQUxfTUFYX1ZBTFVFLmxlbmd0aAorCQkJCQl8fCAodG9rZW5MZW5ndGggPT0gREVDSU1BTF9NQVhfVkFMVUUubGVuZ3RoCisJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5jb21wYXJlVG8odG9rZW4sIERFQ0lNQUxfTUFYX1ZBTFVFLCAwLCBsZW5ndGgpID4gMCkpIHsKKwkJCQlyZXR1cm47IC8qY29uc3RhbnQgc3RheXMgbnVsbCovCisJCQl9CisJCQljb21wdXRlVmFsdWUodG9rZW4sIGxlbmd0aCwgcmFkaXgsIGopOworCQkJYnJlYWs7CisJCWNhc2UgOCA6CisJCQlpZiAodG9rZW5MZW5ndGggPD0gMjQpIHsKKwkJCQlpZiAodG9rZW5MZW5ndGggPT0gMjQgJiYgdG9rZW5bal0gPiAnMScpIHsKKwkJCQkJcmV0dXJuOyAvKmNvbnN0YW50IHN0YXlzIG51bGwqLworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIE9DVEFMX01JTlVTX09ORV9WQUxVRSkpIHsKKwkJCQkJdGhpcy5jb25zdGFudCA9IExvbmdDb25zdGFudC5mcm9tVmFsdWUoLTFMKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQljb21wdXRlVmFsdWUodG9rZW4sIGxlbmd0aCwgcmFkaXgsIGopOworCQkJfQorCQkJYnJlYWs7CisJfQorfQorcHJpdmF0ZSB2b2lkIGNvbXB1dGVWYWx1ZShjaGFyW10gdG9rZW4sIGludCB0b2tlbkxlbmd0aCwgaW50IHJhZGl4LCBpbnQgaikgeworCWludCBkaWdpdFZhbHVlOworCWxvbmcgY29tcHV0ZWRWYWx1ZSA9IDA7CisJd2hpbGUgKGogPCB0b2tlbkxlbmd0aCkgeworCQlpZiAoKGRpZ2l0VmFsdWUgPSBTY2FubmVySGVscGVyLmRpZ2l0KHRva2VuW2orK10scmFkaXgpKSA8IDApIHsKKwkJCXJldHVybjsgLypjb25zdGFudCBzdGF5cyBudWxsKi8KKwkJfQorCQljb21wdXRlZFZhbHVlID0gKGNvbXB1dGVkVmFsdWUgKiByYWRpeCkgKyBkaWdpdFZhbHVlIDsKKwl9CisJdGhpcy5jb25zdGFudCA9IExvbmdDb25zdGFudC5mcm9tVmFsdWUoY29tcHV0ZWRWYWx1ZSk7CiB9CiAvKioKICAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgbG9uZyBsaXRlcmFsCkBAIC05OCw1OCArMTQ1LDE4IEBACiAgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQogICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQogICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotICovIAorICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpZiAodmFsdWVSZXF1aXJlZCkgewotCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCh0aGlzLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJfQogCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiB9CisKIHB1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJcmV0dXJuIFR5cGVCaW5kaW5nLkxPTkc7CiB9Ci1wdWJsaWMgZmluYWwgYm9vbGVhbiBtYXlSZXByZXNlbnRNSU5fVkFMVUUoKXsKLQkvL2Egc3BlY2lhbCBhdXRvcml6ZWQgaW50IGxpdGVycmFsIGlzIDkyMjMzNzIwMzY4NTQ3NzU4MDhMCi0JLy93aGljaCBpcyBPTkUgb3ZlciB0aGUgbGltaXQuIFRoaXMgc3BlY2lhbCBjYXNlIAotCS8vb25seSBpcyB1c2VkIGluIGNvbWJpbmFpc29uIHdpdGggLSB0byBkZW5vdGUKLQkvL3RoZSBtaW5pbWFsIHZhbHVlIG9mIGludCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwKLQotCXJldHVybiAoKHNvdXJjZS5sZW5ndGggPT0gMjApICYmCi0JCQkoc291cmNlWzBdID09ICc5JykgJiYKLQkJCShzb3VyY2VbMV0gPT0gJzInKSAmJgotCQkJKHNvdXJjZVsyXSA9PSAnMicpICYmCi0JCQkoc291cmNlWzNdID09ICczJykgJiYJCQkKLQkJCShzb3VyY2VbNF0gPT0gJzMnKSAmJgotCQkJKHNvdXJjZVs1XSA9PSAnNycpICYmCi0JCQkoc291cmNlWzZdID09ICcyJykgJiYKLQkJCShzb3VyY2VbN10gPT0gJzAnKSAmJgkJCQotCQkJKHNvdXJjZVs4XSA9PSAnMycpICYmCi0JCQkoc291cmNlWzldID09ICc2JykgJiYKLQkJCShzb3VyY2VbMTBdID09ICc4JykgJiYKLQkJCShzb3VyY2VbMTFdID09ICc1JykgJiYKLQkJCShzb3VyY2VbMTJdID09ICc0JykgJiYJCQkKLQkJCShzb3VyY2VbMTNdID09ICc3JykgJiYKLQkJCShzb3VyY2VbMTRdID09ICc3JykgJiYKLQkJCShzb3VyY2VbMTVdID09ICc1JykgJiYKLQkJCShzb3VyY2VbMTZdID09ICc4JykgJiYJCQkKLQkJCShzb3VyY2VbMTddID09ICcwJykgJiYKLQkJCShzb3VyY2VbMThdID09ICc4JykgJiYKLQkJCSgoKHRoaXMuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUKSA9PSAwKSk7Ci19Ci1wdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCS8vIHRoZSBmb3JtYXQgbWF5IGJlIGluY29ycmVjdCB3aGlsZSB0aGUgc2Nhbm5lciBjb3VsZCBkZXRlY3QKLQkvLyBzdWNoIGVycm9yIG9ubHkgb24gcGFpbmZ1bGwgdGVzdHMuLi5lYXNpZXIgYW5kIGZhc3RlciBoZXJlCi0KLQlUeXBlQmluZGluZyB0YiA9IHN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKLQlpZiAoY29uc3RhbnQgPT0gRk9STUFUX0VSUk9SKSB7Ci0JCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb25zdGFudE91dE9mRm9ybWF0KHRoaXMpOwotCQl0aGlzLnJlc29sdmVkVHlwZSA9IG51bGw7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gdGI7Ci19CiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKIAl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWxNaW5WYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKaW5kZXggZmY3MTE4NS4uOTYyYjg3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsMTMgKzE1LDExIEBACiBwdWJsaWMgY2xhc3MgTG9uZ0xpdGVyYWxNaW5WYWx1ZSBleHRlbmRzIExvbmdMaXRlcmFsIHsKIAogCWZpbmFsIHN0YXRpYyBjaGFyW10gQ2hhclZhbHVlID0gbmV3IGNoYXJbXXsnLScsICc5JywnMicsJzInLCczJywnMycsJzcnLCcyJywnMCcsJzMnLCc2JywnOCcsJzUnLCc0JywnNycsJzcnLCc1JywnOCcsJzAnLCc4JywnTCd9OwotCWZpbmFsIHN0YXRpYyBDb25zdGFudCBNSU5fVkFMVUUgPSBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKExvbmcuTUlOX1ZBTFVFKSA7IAogCi1wdWJsaWMgTG9uZ0xpdGVyYWxNaW5WYWx1ZSgpewotCXN1cGVyKENoYXJWYWx1ZSwwLDApOwotCWNvbnN0YW50ID0gTUlOX1ZBTFVFOworcHVibGljIExvbmdMaXRlcmFsTWluVmFsdWUoY2hhcltdIHRva2VuLCBjaGFyW10gcmVkdWNlZEZvcm0sIGludCBzdGFydCwgaW50IGVuZCkgeworCXN1cGVyKHRva2VuLCByZWR1Y2VkRm9ybSwgc3RhcnQsIGVuZCk7CisJdGhpcy5jb25zdGFudCA9IExvbmdDb25zdGFudC5mcm9tVmFsdWUoTG9uZy5NSU5fVkFMVUUpOwogfQogcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewotCiAJLypwcmVjb21wdXRlZCBhdCBjcmVhdGlvbiB0aW1lKi99CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01hZ2ljTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYWdpY0xpdGVyYWwuamF2YQppbmRleCBkZDg0ODk1Li43ZWI5MTExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01hZ2ljTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFnaWNMaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTkgKzExLDE5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyAgTWFnaWNMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB7Ci0JCisKIAlwdWJsaWMgTWFnaWNMaXRlcmFsKGludCBzdGFydCAsIGludCBlbmQpIHsKLQkJCisKIAkJc3VwZXIoc3RhcnQsZW5kKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpewotCQkKKwogCQlyZXR1cm4gZmFsc2UgOwogCX0KLQkKKwogCXB1YmxpYyBjaGFyW10gc291cmNlKCkgewotCQorCiAJCXJldHVybiBudWxsOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFya2VyQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYXJrZXJBbm5vdGF0aW9uLmphdmEKaW5kZXggYjdlMWVkNi4uMmE0ODQ4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYXJrZXJBbm5vdGF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYXJrZXJBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMjIgKzIwLDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgTWFya2VyQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewotCQorCiAJcHVibGljIE1hcmtlckFubm90YXRpb24oVHlwZVJlZmVyZW5jZSB0eXBlLCBpbnQgc291cmNlU3RhcnQpIHsKIAkJdGhpcy50eXBlID0gdHlwZTsKIAkJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwogCQl0aGlzLnNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uI21lbWJlclZhbHVlUGFpcnMoKQogCSAqLwogCXB1YmxpYyBNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzKCkgewogCQlyZXR1cm4gTm9WYWx1ZVBhaXJzOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHsKKwkJCQl0aGlzLnR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVtYmVyVmFsdWVQYWlyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lbWJlclZhbHVlUGFpci5qYXZhCmluZGV4IGY4Nzc3MjkuLmEwODM3NDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVtYmVyVmFsdWVQYWlyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZW1iZXJWYWx1ZVBhaXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxMSArMTIsMTEgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FbGVtZW50VmFsdWVQYWlyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiAKQEAgLTI0LDE1ICsyNCwxNSBAQAogICogTWVtYmVyVmFsdWVQYWlyIG5vZGUKICAqLwogcHVibGljIGNsYXNzIE1lbWJlclZhbHVlUGFpciBleHRlbmRzIEFTVE5vZGUgewotCQorCiAJcHVibGljIGNoYXJbXSBuYW1lOwogCXB1YmxpYyBFeHByZXNzaW9uIHZhbHVlOwogCXB1YmxpYyBNZXRob2RCaW5kaW5nIGJpbmRpbmc7Ci0JLyoqIAotCSAqICBUaGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwYWlyIGluIHRoZSB0eXBlIHN5c3RlbS4gCisJLyoqCisJICogIFRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBhaXIgaW4gdGhlIHR5cGUgc3lzdGVtLgogCSAqLwogCXB1YmxpYyBFbGVtZW50VmFsdWVQYWlyIGNvbXBpbGVyRWxlbWVudFBhaXIgPSBudWxsOwotCQorCiAJcHVibGljIE1lbWJlclZhbHVlUGFpcihjaGFyW10gdG9rZW4sIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgRXhwcmVzc2lvbiB2YWx1ZSkgewogCQl0aGlzLm5hbWUgPSB0b2tlbjsKIAkJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwpAQCAtNDIsMjAgKzQyLDIwIEBACiAJCQl2YWx1ZS5iaXRzIHw9IElzQW5ub3RhdGlvbkRlZmF1bHRWYWx1ZTsKIAkJfQogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSNwcmludChpbnQsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCiAJICovCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludChpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJCW91dHB1dAotCQkJLmFwcGVuZChuYW1lKQorCQkJLmFwcGVuZCh0aGlzLm5hbWUpCiAJCQkuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQl2YWx1ZS5wcmludCgwLCBvdXRwdXQpOworCQl0aGlzLnZhbHVlLnByaW50KDAsIG91dHB1dCk7CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVFeHBlY3RpbmcoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgcmVxdWlyZWRUeXBlKSB7Ci0JCQorCiAJCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKIAkJCXRoaXMuY29tcGlsZXJFbGVtZW50UGFpciA9IG5ldyBFbGVtZW50VmFsdWVQYWlyKHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgdGhpcy5iaW5kaW5nKTsKIAkJCXJldHVybjsKQEAgLTgyLDM0ICs4Miw0MiBAQAogCQkJdmFsdWVUeXBlID0gbnVsbDsgLy8gbm8gbmVlZCB0byBwdXJzdWUKIAkJfSBlbHNlIHsKIAkJCXZhbHVlVHlwZSA9IHRoaXMudmFsdWUucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODg5NworCQkJQVNUVmlzaXRvciB2aXNpdG9yID0gbmV3IEFTVFZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTmFtZVJlZmVyZW5jZSByZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcCkgeworCQkJCQlpZiAocmVmZXJlbmNlLmJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJCQkJKChMb2NhbFZhcmlhYmxlQmluZGluZykgcmVmZXJlbmNlLmJpbmRpbmcpLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQkJCQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCQl0aGlzLnZhbHVlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJfQogCQl0aGlzLmNvbXBpbGVyRWxlbWVudFBhaXIgPSBuZXcgRWxlbWVudFZhbHVlUGFpcih0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRoaXMuYmluZGluZyk7CiAJCWlmICh2YWx1ZVR5cGUgPT0gbnVsbCkKIAkJCXJldHVybjsKIAogCQlUeXBlQmluZGluZyBsZWFmVHlwZSA9IHJlcXVpcmVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoISgodGhpcy52YWx1ZS5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKHZhbHVlVHlwZSwgcmVxdWlyZWRUeXBlKQotCQkJCXx8IChyZXF1aXJlZFR5cGUuaXNCYXNlVHlwZSgpICYmIEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKHJlcXVpcmVkVHlwZS5pZCwgdmFsdWVUeXBlLmlkKSkpCisJCWlmICghKHRoaXMudmFsdWUuaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSh2YWx1ZVR5cGUsIHJlcXVpcmVkVHlwZSkKIAkJCQl8fCB2YWx1ZVR5cGUuaXNDb21wYXRpYmxlV2l0aChyZXF1aXJlZFR5cGUpKSkgewogCi0JCQlpZiAoIShyZXF1aXJlZFR5cGUuaXNBcnJheVR5cGUoKSAKLQkJCQkJJiYgcmVxdWlyZWRUeXBlLmRpbWVuc2lvbnMoKSA9PSAxIAorCQkJaWYgKCEocmVxdWlyZWRUeXBlLmlzQXJyYXlUeXBlKCkKKwkJCQkJJiYgcmVxdWlyZWRUeXBlLmRpbWVuc2lvbnMoKSA9PSAxCiAJCQkJCSYmICh0aGlzLnZhbHVlLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUodmFsdWVUeXBlLCBsZWFmVHlwZSkKLQkJCQkJCQl8fCAobGVhZlR5cGUuaXNCYXNlVHlwZSgpICYmIEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKGxlYWZUeXBlLmlkLCB2YWx1ZVR5cGUuaWQpKSkKLQkJCQkJCQl8fCB2YWx1ZVR5cGUuaXNDb21wYXRpYmxlV2l0aChsZWFmVHlwZSkpKSB7Ci0JCQkJCisJCQkJCQkJfHwgdmFsdWVUeXBlLmlzQ29tcGF0aWJsZVdpdGgobGVhZlR5cGUpKSkpIHsKKwogCQkJCWlmIChsZWFmVHlwZS5pc0Fubm90YXRpb25UeXBlKCkgJiYgIXZhbHVlVHlwZS5pc0Fubm90YXRpb25UeXBlKCkpIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvblZhbHVlTXVzdEJlQW5ub3RhdGlvbih0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgbGVhZlR5cGUpOwkJCQkKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvblZhbHVlTXVzdEJlQW5ub3RhdGlvbih0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgbGVhZlR5cGUpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHZhbHVlVHlwZSwgcmVxdWlyZWRUeXBlLCB0aGlzLnZhbHVlKTsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IodmFsdWVUeXBlLCByZXF1aXJlZFR5cGUsIHRoaXMudmFsdWUsIG51bGwpOwogCQkJCX0KIAkJCQlyZXR1cm47IC8vIG1heSBhbGxvdyB0byBwcm9jZWVkIHRvIGZpbmQgbW9yZSBlcnJvcnMgYXQgb25jZQogCQkJfQogCQl9IGVsc2UgewogCQkJc2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlQ29udmVyc2lvbihyZXF1aXJlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSwgdmFsdWVUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpOwotCQkJdGhpcy52YWx1ZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgcmVxdWlyZWRUeXBlLCB2YWx1ZVR5cGUpOwkJCQkKKwkJCXRoaXMudmFsdWUuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHJlcXVpcmVkVHlwZSwgdmFsdWVUeXBlKTsKIAkJfQotCQkKKwogCQkvLyBhbm5vdGF0aW9uIG1ldGhvZHMgY2FuIG9ubHkgcmV0dXJuIGJhc2UgdHlwZXMsIFN0cmluZywgQ2xhc3MsIGVudW0gdHlwZSwgYW5ub3RhdGlvbiB0eXBlcyBhbmQgYXJyYXlzIG9mIHRoZXNlCiAJCWNoZWNrQW5ub3RhdGlvbk1ldGhvZFR5cGU6IHsKIAkJCXN3aXRjaCAobGVhZlR5cGUuZXJhc3VyZSgpLmlkKSB7CkBAIC0xOTUsNiArMjAzLDggQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQl9ICBlbHNlIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvblZhbHVlTXVzdEJlQ29uc3RhbnQodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRydWUpOwogCQkJCX0KIAkJCQlicmVhayBjaGVja0Fubm90YXRpb25NZXRob2RUeXBlOwogCQkJfQpAQCAtMjE5LDcgKzIyOSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lc3NhZ2VTZW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lc3NhZ2VTZW5kLmphdmEKaW5kZXggYzIxNzVmNi4uZjkxMzMwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXNzYWdlU2VuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIE5pY2sgVGVyeWFldiAtIGZpeCBmb3IgYnVnIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDA3NTIpCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMxOTIwMSAtIFtudWxsXSBubyB3YXJuaW5nIHdoZW4gdW5ib3hpbmcgU2luZ2xlTmFtZVJlZmVyZW5jZSBjYXVzZXMgTlBFCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMTUsNiArMTYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKQEAgLTI1LDYgKzI3LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkV4dHJhQ29tcGlsZXJNb2RpZmllcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NaXNzaW5nVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qb2x5bW9ycGhpY01ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CkBAIC0zNCw1MSArMzgsNjQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CiAKIHB1YmxpYyBjbGFzcyBNZXNzYWdlU2VuZCBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBJbnZvY2F0aW9uU2l0ZSB7Ci0gICAgCisKIAlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlcjsKIAlwdWJsaWMgY2hhcltdIHNlbGVjdG9yOwogCXB1YmxpYyBFeHByZXNzaW9uW10gYXJndW1lbnRzOwogCXB1YmxpYyBNZXRob2RCaW5kaW5nIGJpbmRpbmc7CQkJCQkJCS8vIGV4YWN0IGJpbmRpbmcgcmVzdWx0aW5nIGZyb20gbG9va3VwCi0JcHJvdGVjdGVkIE1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmc7CQkvLyBhY3R1YWwgYmluZGluZyB1c2VkIGZvciBjb2RlIGdlbmVyYXRpb24gKGlmIG5vIHN5bnRoZXRpYyBhY2Nlc3NvcikKLQlNZXRob2RCaW5kaW5nIHN5bnRoZXRpY0FjY2Vzc29yOwkJCQkJCS8vIHN5bnRoZXRpYyBhY2Nlc3NvciBmb3IgaW5uZXItZW11bGF0aW9uCisJcHVibGljIE1ldGhvZEJpbmRpbmcgc3ludGhldGljQWNjZXNzb3I7CQkJCQkJLy8gc3ludGhldGljIGFjY2Vzc29yIGZvciBpbm5lci1lbXVsYXRpb24KIAlwdWJsaWMgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlOwkJCQkJLy8gZm9yIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24gKHJldHVybiB0eXBlIGluZmVyZW5jZSkKIAogCXB1YmxpYyBsb25nIG5hbWVTb3VyY2VQb3NpdGlvbiA7IC8vKHN0YXJ0PDwzMikrZW5kCiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgYWN0dWFsUmVjZWl2ZXJUeXBlOwotCXB1YmxpYyBUeXBlQmluZGluZyByZWNlaXZlckdlbmVyaWNDYXN0OyAvLyBleHRyYSByZWZlcmVuY2UgdHlwZSBjYXN0IHRvIHBlcmZvcm0gb24gZ2VuZXJpYyByZWNlaXZlcgogCXB1YmxpYyBUeXBlQmluZGluZyB2YWx1ZUNhc3Q7IC8vIGV4dHJhIHJlZmVyZW5jZSB0eXBlIGNhc3QgdG8gcGVyZm9ybSBvbiBtZXRob2QgcmV0dXJuZWQgdmFsdWUKIAlwdWJsaWMgVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudHM7CiAJcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHM7Ci0JCi1wdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgewogCWJvb2xlYW4gbm9uU3RhdGljID0gIXRoaXMuYmluZGluZy5pc1N0YXRpYygpOwogCWZsb3dJbmZvID0gdGhpcy5yZWNlaXZlci5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgbm9uU3RhdGljKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAlpZiAobm9uU3RhdGljKSB7CiAJCXRoaXMucmVjZWl2ZXIuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NjgyCisJCWlmICh0aGlzLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCQkvLyBhY2Nlc3Npbmcgbm9uLXN0YXRpYyBtZXRob2Qgd2l0aG91dCBhbiBvYmplY3QKKwkJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJfQorCX0gZWxzZSBpZiAodGhpcy5yZWNlaXZlci5pc1RoaXMoKSkgeworCQlpZiAoKHRoaXMucmVjZWl2ZXIuYml0cyAmIEFTVE5vZGUuSXNJbXBsaWNpdFRoaXMpID09IDApIHsKKwkJCS8vIGV4cGxpY2l0IHRoaXMgcmVjZWl2ZXIsIG5vdCBhbGxvd2VkIGluIHN0YXRpYyBjb250ZXh0CisJCQljdXJyZW50U2NvcGUucmVzZXRFbmNsb3NpbmdNZXRob2RTdGF0aWNGbGFnKCk7CisJCX0KIAl9CiAKIAlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAoKHRoaXMuYXJndW1lbnRzW2ldLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQl0aGlzLmFyZ3VtZW50c1tpXS5jaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQl9CiAJCQlmbG93SW5mbyA9IHRoaXMuYXJndW1lbnRzW2ldLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAkJfQogCX0KIAlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duRXhjZXB0aW9uczsKIAlpZiAoKHRocm93bkV4Y2VwdGlvbnMgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykgIT0gQmluZGluZy5OT19FWENFUFRJT05TKSB7CisJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5VbmNoZWNrZWQpICE9IDAgJiYgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3NjQzLCBhbGlnbiB3aXRoIGphdmFjIG9uIEpMUyAxNS4xMi4yLjYKKwkJCXRocm93bkV4Y2VwdGlvbnMgPSBjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlcyh0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywgdHJ1ZSwgdHJ1ZSk7CisJCX0KIAkJLy8gbXVzdCB2ZXJpZnkgdGhhdCBleGNlcHRpb25zIHBvdGVudGlhbGx5IHRocm93biBieSB0aGlzIGV4cHJlc3Npb24gYXJlIGNhdWdodCBpbiB0aGUgbWV0aG9kCiAJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnModGhyb3duRXhjZXB0aW9ucywgdGhpcywgZmxvd0luZm8uY29weSgpLCBjdXJyZW50U2NvcGUpOwotCQkvLyBUT0RPIChtYXhpbWUpIHRoZSBjb3B5IGFib3ZlIGlzIG5lZWRlZCBiZWNhdXNlIG9mIGEgc2lkZSBlZmZlY3QgaW50byAKKwkJLy8gVE9ETyAobWF4aW1lKSB0aGUgY29weSBhYm92ZSBpcyBuZWVkZWQgYmVjYXVzZSBvZiBhIHNpZGUgZWZmZWN0IGludG8KIAkJLy8gICAgICAgICAgICAgICBjaGVja0V4Y2VwdGlvbkhhbmRsZXJzOyBjb25zaWRlciBwcm90ZWN0aW5nIHRoZXJlIGluc3RlYWQgb2YgaGVyZTsKIAkJLy8gICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlVGVzdCN0ZXN0MDUxMAogCX0KLQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvKTsJCisJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBmbG93SW5mbyk7CiAJcmV0dXJuIGZsb3dJbmZvOwogfQogLyoqCkBAIC05MiwzMiArMTA5LDI3IEBACiAJCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxCaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CiAJCVR5cGVCaW5kaW5nIG9yaWdpbmFsVHlwZSA9IG9yaWdpbmFsQmluZGluZy5yZXR1cm5UeXBlOwogCSAgICAvLyBleHRyYSBjYXN0IG5lZWRlZCBpZiBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdHlwZSB2YXJpYWJsZQotCQlpZiAob3JpZ2luYWxCaW5kaW5nICE9IHRoaXMuYmluZGluZyAKLQkJCQkmJiBvcmlnaW5hbFR5cGUgIT0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGUKLQkJCQkmJiBydW50aW1lVGltZVR5cGUuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0Ci0JCQkJJiYgKG9yaWdpbmFsVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpICE9IDApIHsKLQkgICAgCVR5cGVCaW5kaW5nIHRhcmdldFR5cGUgPSAoIWNvbXBpbGVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkgJiYgcnVudGltZVRpbWVUeXBlLmlzQmFzZVR5cGUoKSkgCisJCWlmIChvcmlnaW5hbFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJICAgIAlUeXBlQmluZGluZyB0YXJnZXRUeXBlID0gKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpCiAJICAgIAkJPyBjb21waWxlVGltZVR5cGUgIC8vIHVuYm94aW5nOiBjaGVja2Nhc3QgYmVmb3JlIGNvbnZlcnNpb24KIAkgICAgCQk6IHJ1bnRpbWVUaW1lVHlwZTsKIAkgICAgICAgIHRoaXMudmFsdWVDYXN0ID0gb3JpZ2luYWxUeXBlLmdlbmVyaWNDYXN0KHRhcmdldFR5cGUpOwotCQl9IAllbHNlIGlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpIAotCQkJCQkJJiYgcnVudGltZVRpbWVUeXBlLmlkICE9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdAotCQkJCQkJJiYgdGhpcy5iaW5kaW5nLnBhcmFtZXRlcnMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTIAotCQkJCQkJJiYgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgCi0JCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmJpbmRpbmcuc2VsZWN0b3IsIFR5cGVDb25zdGFudHMuQ0xPTkUpKSB7Ci0JCQkJCS8vIGZyb20gMS41IGNvbXBsaWFudCBtb2RlIG9uLCBhcnJheSNjbG9uZSgpIHJlc29sdmVzIHRvIGFycmF5IHR5cGUsIGJ1dCBjb2RlZ2VuIHRvICNjbG9uZSgpT2JqZWN0IC0gdGh1cyByZXF1aXJlIGV4dHJhIGluc2VydGVkIGNhc3QKLQkJCXRoaXMudmFsdWVDYXN0ID0gcnVudGltZVRpbWVUeXBlOwkJCQorCQl9IAllbHNlIGlmICh0aGlzLmJpbmRpbmcgPT0gc2NvcGUuZW52aXJvbm1lbnQoKS5hcnJheUNsb25lCisJCQkJJiYgcnVudGltZVRpbWVUeXBlLmlkICE9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdAorCQkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJLy8gZnJvbSAxLjUgc291cmNlIGxldmVsIG9uLCBhcnJheSNjbG9uZSgpIHJlc29sdmVzIHRvIGFycmF5IHR5cGUsIGJ1dCBjb2RlZ2VuIHRvICNjbG9uZSgpT2JqZWN0IC0gdGh1cyByZXF1aXJlIGV4dHJhIGluc2VydGVkIGNhc3QKKwkJCXRoaXMudmFsdWVDYXN0ID0gcnVudGltZVRpbWVUeXBlOwogCQl9CiAgICAgICAgIGlmICh0aGlzLnZhbHVlQ2FzdCBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQ2FzdCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnZhbHVlQ2FzdDsKIAkJCWlmICghcmVmZXJlbmNlQ2FzdC5jYW5CZVNlZW5CeShzY29wZSkpIHsKLQkgICAgICAgIAlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAKKwkgICAgICAgIAlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLAogCSAgICAgICAgCQkJbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHJlZmVyZW5jZUNhc3Quc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQkJCQkJcmVmZXJlbmNlQ2FzdCwKIAkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSk7CiAJCQl9Ci0gICAgICAgIH0JCQorICAgICAgICB9CiAJfQogCXN1cGVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBydW50aW1lVGltZVR5cGUsIGNvbXBpbGVUaW1lVHlwZSk7CiB9CkBAIC0xMjgsNDcgKzE0MCw0MyBAQAogICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKICAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KICAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KLSAqLyAKKyAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQogCS8vIGdlbmVyYXRlIHJlY2VpdmVyL2VuY2xvc2luZyBpbnN0YW5jZSBhY2Nlc3MKLQlib29sZWFuIGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOworCU1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmcgPyB0aGlzLmJpbmRpbmcgOiB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwlib29sZWFuIGlzU3RhdGljID0gY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKTsKIAlpZiAoaXNTdGF0aWMpIHsKIAkJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7Ci0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfSBlbHNlIGlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spICE9IDAgJiYgdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKSB7IC8vIG91dGVyIGFjY2VzcyA/CiAJCS8vIG91dGVyIG1ldGhvZCBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGVtdWxhdGlvbiBpZiBpbXBsaWNpdCBhY2Nlc3MKLQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSA+PiBBU1ROb2RlLkRlcHRoU0hJRlQpOwkJCisJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUKTsKIAkJT2JqZWN0W10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwogCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAl9IGVsc2UgewogCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlpZiAodGhpcy5yZWNlaXZlckdlbmVyaWNDYXN0ICE9IG51bGwpIAotCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZWNlaXZlckdlbmVyaWNDYXN0KTsKLQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKLQkJCisJCWlmICgodGhpcy5iaXRzICYgTmVlZFJlY2VpdmVyR2VuZXJpY0Nhc3QpICE9IDApIHsKKwkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKKwkJfQogCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCS8vIGdlbmVyYXRlIGFyZ3VtZW50cwogCWdlbmVyYXRlQXJndW1lbnRzKHRoaXMuYmluZGluZywgdGhpcy5hcmd1bWVudHMsIGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCS8vIGFjdHVhbCBtZXNzYWdlIGludm9jYXRpb24KIAlpZiAodGhpcy5zeW50aGV0aWNBY2Nlc3NvciA9PSBudWxsKXsKKwkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgY29kZWdlbkJpbmRpbmcsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpOwogCQlpZiAoaXNTdGF0aWMpewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWModGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIGNvZGVnZW5CaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CisJCX0gZWxzZSBpZigodGhpcy5yZWNlaXZlci5pc1N1cGVyKCkpIHx8IGNvZGVnZW5CaW5kaW5nLmlzUHJpdmF0ZSgpKXsKKwkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsIGNvZGVnZW5CaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CisJCX0gZWxzZSBpZiAoY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeyAvLyBpbnRlcmZhY2Ugb3IgYW5ub3RhdGlvbiB0eXBlCisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UsIGNvZGVnZW5CaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCX0gZWxzZSB7Ci0JCQlpZiggKHRoaXMucmVjZWl2ZXIuaXNTdXBlcigpKSB8fCB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzUHJpdmF0ZSgpKXsKLQkJCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwodGhpcy5jb2RlZ2VuQmluZGluZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsgLy8gaW50ZXJmYWNlIG9yIGFubm90YXRpb24gdHlwZQotCQkJCQljb2RlU3RyZWFtLmludm9rZWludGVyZmFjZSh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2RlU3RyZWFtLmludm9rZXZpcnR1YWwodGhpcy5jb2RlZ2VuQmluZGluZyk7Ci0JCQkJfQotCQkJfQorCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHRoaXMuc3ludGhldGljQWNjZXNzb3IpOworCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljQWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJfQogCS8vIHJlcXVpcmVkIGNhc3QgbXVzdCBvY2N1ciBldmVuIGlmIG5vIHZhbHVlIGlzIHJlcXVpcmVkCiAJaWYgKHRoaXMudmFsdWVDYXN0ICE9IG51bGwpIGNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMudmFsdWVDYXN0KTsKQEAgLTE3OSw3ICsxODcsNyBAQAogCQlib29sZWFuIGlzVW5ib3hpbmcgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwOwogCQkvLyBjb252ZXJzaW9uIG9ubHkgZ2VuZXJhdGVkIGlmIHVuYm94aW5nCiAJCWlmIChpc1VuYm94aW5nKSBjb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJc3dpdGNoIChpc1VuYm94aW5nID8gcG9zdENvbnZlcnNpb25UeXBlKGN1cnJlbnRTY29wZSkuaWQgOiB0aGlzLmNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaWQpIHsKKwkJc3dpdGNoIChpc1VuYm94aW5nID8gcG9zdENvbnZlcnNpb25UeXBlKGN1cnJlbnRTY29wZSkuaWQgOiBjb2RlZ2VuQmluZGluZy5yZXR1cm5UeXBlLmlkKSB7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQljYXNlIFRfZG91YmxlIDoKIAkJCQljb2RlU3RyZWFtLnBvcDIoKTsKQEAgLTE5MiwzMyArMjAwLDMxIEBACiAJfQogCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgKGludCkodGhpcy5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSk7IC8vIGhpZ2hsaWdodCBzZWxlY3RvcgogfQotCiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCiAgKi8KIHB1YmxpYyBUeXBlQmluZGluZ1tdIGdlbmVyaWNUeXBlQXJndW1lbnRzKCkgewogCXJldHVybiB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzOwotfQkKK30KIAotcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsJCitwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQWNjZXNzKCkgewogCXJldHVybiB0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKTsKIH0KLXB1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpIHsJCitwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7CiAJcmV0dXJuIHRoaXMucmVjZWl2ZXIgIT0gbnVsbCAmJiB0aGlzLnJlY2VpdmVyLmlzVHlwZVJlZmVyZW5jZSgpOwogfQogcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKXsKIAotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKQlyZXR1cm47CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkJcmV0dXJuOwogCiAJLy8gaWYgbWV0aG9kIGZyb20gcGFyYW1ldGVyaXplZCB0eXBlIGdvdCBmb3VuZCwgdXNlIHRoZSBvcmlnaW5hbCBtZXRob2QgYXQgY29kZWdlbiB0aW1lCi0JdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZy5vcmlnaW5hbCgpOworCU1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKIAlpZiAodGhpcy5iaW5kaW5nLmlzUHJpdmF0ZSgpKXsKIAotCQkvLyBkZXB0aCBpcyBzZXQgZm9yIGJvdGggaW1wbGljaXQgYW5kIGV4cGxpY2l0IGFjY2VzcyAoc2VlIE1ldGhvZEJpbmRpbmcjY2FuQmVTZWVuQnkpCQkKLQkJaWYgKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcyl7Ci0JCQotCQkJdGhpcy5zeW50aGV0aWNBY2Nlc3NvciA9ICgoU291cmNlVHlwZUJpbmRpbmcpdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKHRoaXMuY29kZWdlbkJpbmRpbmcsIGlzU3VwZXJBY2Nlc3MoKSk7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2Vzcyh0aGlzLmNvZGVnZW5CaW5kaW5nLCB0aGlzKTsKKwkJLy8gZGVwdGggaXMgc2V0IGZvciBib3RoIGltcGxpY2l0IGFuZCBleHBsaWNpdCBhY2Nlc3MgKHNlZSBNZXRob2RCaW5kaW5nI2NhbkJlU2VlbkJ5KQorCQlpZiAoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcyl7CisJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZyljb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKGNvZGVnZW5CaW5kaW5nLCBmYWxzZSAvKiBub3Qgc3VwZXIgYWNjZXNzIHRoZXJlICovKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKGNvZGVnZW5CaW5kaW5nLCB0aGlzKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0yMjYsNDMgKzIzMiwyMyBAQAogCiAJCS8vIHF1YWxpZmllZCBzdXBlciBuZWVkIGVtdWxhdGlvbiBhbHdheXMKIAkJU291cmNlVHlwZUJpbmRpbmcgZGVzdGluYXRpb25UeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSgoKFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKXRoaXMucmVjZWl2ZXIpLmN1cnJlbnRDb21wYXRpYmxlVHlwZSk7Ci0JCXRoaXMuc3ludGhldGljQWNjZXNzb3IgPSBkZXN0aW5hdGlvblR5cGUuYWRkU3ludGhldGljTWV0aG9kKHRoaXMuY29kZWdlbkJpbmRpbmcsIGlzU3VwZXJBY2Nlc3MoKSk7Ci0JCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKHRoaXMuY29kZWdlbkJpbmRpbmcsIHRoaXMpOworCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gZGVzdGluYXRpb25UeXBlLmFkZFN5bnRoZXRpY01ldGhvZChjb2RlZ2VuQmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKKwkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoY29kZWdlbkJpbmRpbmcsIHRoaXMpOwogCQlyZXR1cm47CiAKIAl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5pc1Byb3RlY3RlZCgpKXsKIAogCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlOwotCQlpZiAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgIT0gMCkgCi0JCQkJJiYgdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkgCisJCWlmICgoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKQorCQkJCSYmIGNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKQogCQkJCQkhPSAoZW5jbG9zaW5nU291cmNlVHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpLmdldFBhY2thZ2UoKSl7CiAKIAkJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRDb21wYXRpYmxlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZyllbmNsb3NpbmdTb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGVBdCgodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spID4+IEFTVE5vZGUuRGVwdGhTSElGVCk7Ci0JCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gY3VycmVudENvbXBhdGlibGVUeXBlLmFkZFN5bnRoZXRpY01ldGhvZCh0aGlzLmNvZGVnZW5CaW5kaW5nLCBpc1N1cGVyQWNjZXNzKCkpOwotCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3ModGhpcy5jb2RlZ2VuQmluZGluZywgdGhpcyk7CisJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yID0gY3VycmVudENvbXBhdGlibGVUeXBlLmFkZFN5bnRoZXRpY01ldGhvZChjb2RlZ2VuQmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKGNvZGVnZW5CaW5kaW5nLCB0aGlzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQkKLQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KLQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKLQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4JCi0JaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZQotCQkJJiYgdGhpcy5yZWNlaXZlckdlbmVyaWNDYXN0ID09IG51bGwKLQkJCSYmICF0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKSB7Ci0JCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOwotCQlpZiAoKG9wdGlvbnMudGFyZ2V0SkRLID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzIKLQkJCQkmJiAob3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCB8fCAhKHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSAmJiB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKQotCQkJCSYmIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IG1ldGhvZHMKLQkJCXx8ICF0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkgewotCi0JCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkTWV0aG9kQmluZGluZygKLQkJCSAgICAgICAgCQkJCQkJCQkJCXRoaXMuY29kZWdlbkJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpOwotCQl9Ci0JCS8vIFBvc3QgMS40LjAgdGFyZ2V0LCBhcnJheSBjbG9uZSgpIGludm9jYXRpb25zIGFyZSBxdWFsaWZpZWQgd2l0aCBhcnJheSB0eXBlIAotCQkvLyBUaGlzIGlzIGhhbmRsZWQgaW4gYXJyYXkgdHlwZSAjY2xvbmUgbWV0aG9kIGJpbmRpbmcgcmVzb2x1dGlvbiAoc2VlIFNjb3BlIGFuZCBVcGRhdGVkTWV0aG9kQmluZGluZykKLQl9CiB9CiBwdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKIAlyZXR1cm4gRmxvd0luZm8uVU5LTk9XTjsKQEAgLTI3Myw3ICsyNTksNyBAQAogICovCiBwdWJsaWMgVHlwZUJpbmRpbmcgcG9zdENvbnZlcnNpb25UeXBlKFNjb3BlIHNjb3BlKSB7CiAJVHlwZUJpbmRpbmcgY29udmVydGVkVHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlOwotCWlmICh0aGlzLnZhbHVlQ2FzdCAhPSBudWxsKSAKKwlpZiAodGhpcy52YWx1ZUNhc3QgIT0gbnVsbCkKIAkJY29udmVydGVkVHlwZSA9IHRoaXMudmFsdWVDYXN0OwogCWludCBydW50aW1lVHlwZSA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0OwogCXN3aXRjaCAocnVudGltZVR5cGUpIHsKQEAgLTMwMiwxNSArMjg4LDE1IEBACiAJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuRE9VQkxFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgotCX0JCQorCX0KIAlpZiAoKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5CT1hJTkcpICE9IDApIHsKIAkJY29udmVydGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29udmVydGVkVHlwZSk7CiAJfQogCXJldHVybiBjb252ZXJ0ZWRUeXBlOwogfQotCQorCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkKKwogCWlmICghdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKSB0aGlzLnJlY2VpdmVyLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOwogCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQlvdXRwdXQuYXBwZW5kKCc8Jyk7CkBAIC0zMjQsNyArMzEwLDcgQEAKIAl9CiAJb3V0cHV0LmFwcGVuZCh0aGlzLnNlbGVjdG9yKS5hcHBlbmQoJygnKSA7CiAJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFyZ3VtZW50cy5sZW5ndGggOyBpICsrKSB7CQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXJndW1lbnRzLmxlbmd0aCA7IGkgKyspIHsKIAkJCWlmIChpID4gMCkgb3V0cHV0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJdGhpcy5hcmd1bWVudHNbaV0ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CiAJCX0KQEAgLTMzNywyMyArMzIzLDIzIEBACiAJLy8gQmFzZSB0eXBlIHByb21vdGlvbgogCiAJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQlib29sZWFuIHJlY2VpdmVyQ2FzdCA9IGZhbHNlLCBhcmdzQ29udGFpbkNhc3QgPSBmYWxzZTsgCisJYm9vbGVhbiByZWNlaXZlckNhc3QgPSBmYWxzZSwgYXJnc0NvbnRhaW5DYXN0ID0gZmFsc2U7CiAJaWYgKHRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgewogCQl0aGlzLnJlY2VpdmVyLmJpdHMgfD0gQVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2s7IC8vIHdpbGwgY2hlY2sgbGF0ZXIgb24KIAkJcmVjZWl2ZXJDYXN0ID0gdHJ1ZTsKIAl9Ci0JdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsgCisJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKIAlib29sZWFuIHJlY2VpdmVySXNUeXBlID0gdGhpcy5yZWNlaXZlciBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UgJiYgKCgoTmFtZVJlZmVyZW5jZSkgdGhpcy5yZWNlaXZlcikuYml0cyAmIEJpbmRpbmcuVFlQRSkgIT0gMDsKIAlpZiAocmVjZWl2ZXJDYXN0ICYmIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKIAkJIC8vIGR1ZSB0byBjaGFuZ2Ugb2YgZGVjbGFyaW5nIGNsYXNzIHdpdGggcmVjZWl2ZXIgdHlwZSwgb25seSBpZGVudGl0eSBjYXN0IHNob3VsZCBiZSBub3RpZmllZAotCQlpZiAoKChDYXN0RXhwcmVzc2lvbil0aGlzLnJlY2VpdmVyKS5leHByZXNzaW9uLnJlc29sdmVkVHlwZSA9PSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSkgeyAKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcik7CQkKKwkJaWYgKCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgPT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcik7CiAJCX0KIAl9CiAJLy8gcmVzb2x2ZSB0eXBlIGFyZ3VtZW50cyAoZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgY2FsbCkKIAlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7Ci0JCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzCisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7IC8vIHR5cGVDaGVja3MgYWxsIGFyZ3VtZW50cwogCQl0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IHRoaXMudHlwZUFyZ3VtZW50c1tpXTsKQEAgLTM2NSwxMyArMzUxLDE4IEBACiAJCQl9CiAJCX0KIAkJaWYgKGFyZ0hhc0Vycm9yKSB7CisJCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeyAvLyBzdGlsbCBhdHRlbXB0IHRvIHJlc29sdmUgYXJndW1lbnRzCisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCXRoaXMuYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCQl9CisJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCX0JCisJfQogCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKIAlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlM7CiAJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKLQkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOyAvLyB0eXBlQ2hlY2tzIGFsbCBhcmd1bWVudHMgCisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzCiAJCWludCBsZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CkBAIC0zOTAsNyArMzgxLDcgQEAKIAkJCQlUeXBlQmluZGluZ1tdIHBzZXVkb0FyZ3MgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspCiAJCQkJCXBzZXVkb0FyZ3NbaV0gPSBhcmd1bWVudFR5cGVzW2ldID09IG51bGwgPyBUeXBlQmluZGluZy5OVUxMIDogYXJndW1lbnRUeXBlc1tpXTsgLy8gcmVwbGFjZSBhcmdzIHdpdGggZXJyb3JzIHdpdGggbnVsbCB0eXBlCi0JCQkJdGhpcy5iaW5kaW5nID0gCisJCQkJdGhpcy5iaW5kaW5nID0KIAkJCQkJdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpCiAJCQkJCQk/IHNjb3BlLmdldEltcGxpY2l0TWV0aG9kKHRoaXMuc2VsZWN0b3IsIHBzZXVkb0FyZ3MsIHRoaXMpCiAJCQkJCQk6IHNjb3BlLmZpbmRNZXRob2QoKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnNlbGVjdG9yLCBwc2V1ZG9BcmdzLCB0aGlzKTsKQEAgLTQwNCw3ICszOTUsNyBAQAogCQkJCQkJfQogCQkJCQkJdGhpcy5iaW5kaW5nID0gY2xvc2VzdE1hdGNoOwogCQkJCQkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2hPcmlnaW5hbCA9IGNsb3Nlc3RNYXRjaC5vcmlnaW5hbCgpOwotCQkJCQkJaWYgKChjbG9zZXN0TWF0Y2hPcmlnaW5hbC5pc1ByaXZhdGUoKSB8fCBjbG9zZXN0TWF0Y2hPcmlnaW5hbC5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QoY2xvc2VzdE1hdGNoT3JpZ2luYWwpKSB7CisJCQkJCQlpZiAoY2xvc2VzdE1hdGNoT3JpZ2luYWwuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpICYmICFzY29wZS5pc0RlZmluZWRJbk1ldGhvZChjbG9zZXN0TWF0Y2hPcmlnaW5hbCkpIHsKIAkJCQkJCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgbWV0aG9kIGlzIHVzZWQgZnJvbSB3aXRoaW4gaW5zaWRlIGl0c2VsZiAoZS5nLiBkaXJlY3QgcmVjdXJzaW9ucykKIAkJCQkJCQljbG9zZXN0TWF0Y2hPcmlnaW5hbC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKIAkJCQkJCX0KQEAgLTQyMiwyMCArNDEzLDI2IEBACiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yTm9NZXRob2RGb3IodGhpcywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMpOwogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JdGhpcy5iaW5kaW5nID0gCi0JCXRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKQorCXRoaXMuYmluZGluZyA9IHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKQogCQkJPyBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZCh0aGlzLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKQotCQkJOiBzY29wZS5nZXRNZXRob2QodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMuc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOyAKKwkJCTogc2NvcGUuZ2V0TWV0aG9kKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKIAlpZiAoIXRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgewogCQkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKLQkJCX0gZWxzZSB7IAorCQkJfSBlbHNlIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvck5vTWV0aG9kRm9yKHRoaXMsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzKTsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJfQotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkTWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZyk7CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMDcgYXZvaWQgc2Vjb25kYXJ5IGVycm9ycyBpbiBjYXNlIG9mCisJCS8vIG1pc3Npbmcgc3VwZXIgdHlwZSBmb3IgYW5vbnltb3VzIGNsYXNzZXMgLi4uIAorCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlib29sZWFuIGF2b2lkU2Vjb25kYXJ5ID0gZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAmJgorCQkJCQkJCQkgZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkgJiYKKwkJCQkJCQkJIGRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKSBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZzsKKwkJaWYgKCFhdm9pZFNlY29uZGFyeSkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRNZXRob2QodGhpcywgdGhpcy5iaW5kaW5nKTsKIAkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2ggPSAoKFByb2JsZW1NZXRob2RCaW5kaW5nKXRoaXMuYmluZGluZykuY2xvc2VzdE1hdGNoOwogCQlzd2l0Y2ggKHRoaXMuYmluZGluZy5wcm9ibGVtSWQoKSkgewogCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMgOgpAQCAtNDQ3LDM3ICs0NDQsNTMgQEAKIAkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyQm91bmRNaXNtYXRjaCA6CiAJCQkJLy8gb25seSBzdGVhbCByZXR1cm5UeXBlIGluIGNhc2VzIGxpc3RlZCBhYm92ZQogCQkJCWlmIChjbG9zZXN0TWF0Y2ggIT0gbnVsbCkgdGhpcy5yZXNvbHZlZFR5cGUgPSBjbG9zZXN0TWF0Y2gucmV0dXJuVHlwZTsKLQkJCWRlZmF1bHQgOgorCQkJCWJyZWFrOwogCQl9CiAJCS8vIHJlY29yZCB0aGUgY2xvc2VzdCBtYXRjaCwgZm9yIGNsaWVudHMgd2hvIG1heSBzdGlsbCBuZWVkIGhpbnQgYWJvdXQgcG9zc2libGUgbWV0aG9kIG1hdGNoCiAJCWlmIChjbG9zZXN0TWF0Y2ggIT0gbnVsbCkgewogCQkJdGhpcy5iaW5kaW5nID0gY2xvc2VzdE1hdGNoOwotCQkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2hPcmlnaW5hbCA9IGNsb3Nlc3RNYXRjaC5vcmlnaW5hbCgpOwkJCQotCQkJaWYgKChjbG9zZXN0TWF0Y2hPcmlnaW5hbC5pc1ByaXZhdGUoKSB8fCBjbG9zZXN0TWF0Y2hPcmlnaW5hbC5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QoY2xvc2VzdE1hdGNoT3JpZ2luYWwpKSB7CisJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaE9yaWdpbmFsID0gY2xvc2VzdE1hdGNoLm9yaWdpbmFsKCk7CisJCQlpZiAoY2xvc2VzdE1hdGNoT3JpZ2luYWwuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpICYmICFzY29wZS5pc0RlZmluZWRJbk1ldGhvZChjbG9zZXN0TWF0Y2hPcmlnaW5hbCkpIHsKIAkJCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgbWV0aG9kIGlzIHVzZWQgZnJvbSB3aXRoaW4gaW5zaWRlIGl0c2VsZiAoZS5nLiBkaXJlY3QgcmVjdXJzaW9ucykKIAkJCQljbG9zZXN0TWF0Y2hPcmlnaW5hbC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKIAkJCX0KIAkJfQotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCXJldHVybiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiAodGhpcy5yZXNvbHZlZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApCisJCQkJCQk/IHRoaXMucmVzb2x2ZWRUeXBlCisJCQkJCQk6IG51bGw7CiAJfQogCWZpbmFsIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKTsKKwlpZiAoY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA8PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82CisJCQkmJiB0aGlzLmJpbmRpbmcuaXNQb2x5bW9ycGhpYygpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnBvbHltb3JwaGljTWV0aG9kTm90QmVsb3cxNyh0aGlzKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJaWYgKCgodGhpcy5iaXRzICYgQVNUTm9kZS5JbnNpZGVFeHByZXNzaW9uU3RhdGVtZW50KSAhPSAwKQorCQkJJiYgdGhpcy5iaW5kaW5nLmlzUG9seW1vcnBoaWMoKSkgeworCQkvLyB3ZSBvbmx5IHNldCB0aGUgcmV0dXJuIHR5cGUgdG8gYmUgdm9pZCBpZiB0aGlzIG1ldGhvZCBpbnZvY2F0aW9uIGlzIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50CisJCXRoaXMuYmluZGluZyA9IHNjb3BlLmVudmlyb25tZW50KCkudXBkYXRlUG9seW1vcnBoaWNNZXRob2RSZXR1cm5UeXBlKChQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmcpIHRoaXMuYmluZGluZywgVHlwZUJpbmRpbmcuVk9JRCk7CisJfQorCWlmICgodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdUeXBlSW5NZXRob2QodGhpcywgdGhpcy5iaW5kaW5nKTsKKwl9CiAJaWYgKCF0aGlzLmJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkvLyB0aGUgInJlY2VpdmVyIiBtdXN0IG5vdCBiZSBhIHR5cGUsIGluIG90aGVyIHdvcmRzLCBhIE5hbWVSZWZlcmVuY2UgdGhhdCB0aGUgVEMgaGFzIGJvdW5kIHRvIGEgVHlwZQorCQkvLyB0aGUgInJlY2VpdmVyIiBtdXN0IG5vdCBiZSBhIHR5cGUKIAkJaWYgKHJlY2VpdmVySXNUeXBlKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tdXN0VXNlQVN0YXRpY01ldGhvZCh0aGlzLCB0aGlzLmJpbmRpbmcpOwotCQkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzUmF3VHlwZSgpIAotCQkJCQkmJiAodGhpcy5yZWNlaXZlci5iaXRzICYgQVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2spID09IDAgCisJCQlpZiAodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuaXNSYXdUeXBlKCkKKwkJCQkJJiYgKHRoaXMucmVjZWl2ZXIuYml0cyAmIEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrKSA9PSAwCiAJCQkJCSYmIGNvbXBpbGVyT3B0aW9ucy5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZSkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmF3VHlwZVJlZmVyZW5jZSh0aGlzLnJlY2VpdmVyLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSk7CiAJCQl9CiAJCX0gZWxzZSB7CisJCQkvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKKwkJCS8vIHJlY2VpdmVyIG1heSByZWNlaXZlIGdlbmVyaWMgY2FzdCwgYXMgcGFydCBvZiBpbXBsaWNpdCBjb252ZXJzaW9uCisJCQlUeXBlQmluZGluZyBvbGRSZWNlaXZlclR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuZ2V0RXJhc3VyZUNvbXBhdGlibGVUeXBlKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CiAJCQl0aGlzLnJlY2VpdmVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpOwotCQkJLy8gY29tcHV0ZSBnZW5lcmljIGNhc3QgaWYgbmVjZXNzYXJ5Ci0JCQlUeXBlQmluZGluZyByZWNlaXZlckVyYXN1cmUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCk7Ci0JCQlpZiAocmVjZWl2ZXJFcmFzdXJlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJCWlmIChyZWNlaXZlckVyYXN1cmUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZSh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpID09IG51bGwpIHsKLQkJCQkJdGhpcy5yZWNlaXZlckdlbmVyaWNDYXN0ID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzOyAvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKLQkJCQl9CisJCQlpZiAodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgIT0gb2xkUmVjZWl2ZXJUeXBlICYmIHRoaXMucmVjZWl2ZXIucG9zdENvbnZlcnNpb25UeXBlKHNjb3BlKSAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSkgeyAvLyByZWNvcmQgbmVlZCBmb3IgZXhwbGljaXQgY2FzdCBhdCBjb2RlZ2VuIHNpbmNlIHJlY2VpdmVyIGNvdWxkIG5vdCBoYW5kbGUgaXQKKwkJCQl0aGlzLmJpdHMgfD0gTmVlZFJlY2VpdmVyR2VuZXJpY0Nhc3Q7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewpAQCAtNDg3LDkgKzUwMCwxMSBAQAogCQl9CiAJCWlmICghdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpICYmIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5kaXJlY3RBY2Nlc3NUb1N0YXRpY01ldGhvZCh0aGlzLCB0aGlzLmJpbmRpbmcpOwotCQl9CQkKKwkJfQogCX0KLQljaGVja0ludm9jYXRpb25Bcmd1bWVudHMoc2NvcGUsIHRoaXMucmVjZWl2ZXIsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLmJpbmRpbmcsIHRoaXMuYXJndW1lbnRzLCBhcmd1bWVudFR5cGVzLCBhcmdzQ29udGFpbkNhc3QsIHRoaXMpOworCWlmIChjaGVja0ludm9jYXRpb25Bcmd1bWVudHMoc2NvcGUsIHRoaXMucmVjZWl2ZXIsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLmJpbmRpbmcsIHRoaXMuYXJndW1lbnRzLCBhcmd1bWVudFR5cGVzLCBhcmdzQ29udGFpbkNhc3QsIHRoaXMpKSB7CisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLlVuY2hlY2tlZDsKKwl9CiAKIAkvLy0tLS0tLS1tZXNzYWdlIHNlbmQgdGhhdCBhcmUga25vd24gdG8gZmFpbCBhdCBjb21waWxlIHRpbWUtLS0tLS0tLS0tLQogCWlmICh0aGlzLmJpbmRpbmcuaXNBYnN0cmFjdCgpKSB7CkBAIC01MDEsMTUgKzUxNiwyMyBAQAogCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQodGhpcy5iaW5kaW5nLCBzY29wZSwgdHJ1ZSkpCiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QodGhpcy5iaW5kaW5nLCB0aGlzKTsKIAotCS8vIGZyb20gMS41IGNvbXBsaWFuY2Ugb24sIGFycmF5I2Nsb25lKCkgcmV0dXJucyB0aGUgYXJyYXkgdHlwZSAoYnV0IGJpbmRpbmcgc3RpbGwgc2hvd3MgT2JqZWN0KQotCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpIAotCQkJJiYgdGhpcy5iaW5kaW5nLnBhcmFtZXRlcnMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTIAotCQkJJiYgY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81IAotCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5iaW5kaW5nLnNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLkNMT05FKSkgeworCS8vIGZyb20gMS41IHNvdXJjZSBsZXZlbCBvbiwgYXJyYXkjY2xvbmUoKSByZXR1cm5zIHRoZSBhcnJheSB0eXBlIChidXQgYmluZGluZyBzdGlsbCBzaG93cyBPYmplY3QpCisJaWYgKHRoaXMuYmluZGluZyA9PSBzY29wZS5lbnZpcm9ubWVudCgpLmFycmF5Q2xvbmUgJiYgY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKIAkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKIAl9IGVsc2UgewotCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGU7Ci0JCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHJldHVyblR5cGUgPSByZXR1cm5UeXBlLmNhcHR1cmUoc2NvcGUsIHRoaXMuc291cmNlRW5kKTsKKwkJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZTsKKwkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLlVuY2hlY2tlZCkgIT0gMCAmJiB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzID09IG51bGwpIHsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMsIGFsaWduIHdpdGggamF2YWMgb24gSkxTIDE1LjEyLjIuNgorCQkJcmV0dXJuVHlwZSA9IHRoaXMuYmluZGluZy5yZXR1cm5UeXBlOworCQkJaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgeworCQkJCXJldHVyblR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUocmV0dXJuVHlwZS5lcmFzdXJlKCksIHRydWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuVHlwZSA9IHRoaXMuYmluZGluZy5yZXR1cm5UeXBlOworCQkJaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgeworCQkJCXJldHVyblR5cGUgPSByZXR1cm5UeXBlLmNhcHR1cmUoc2NvcGUsIHRoaXMuc291cmNlRW5kKTsKKwkJCX0KKwkJfQogCQl0aGlzLnJlc29sdmVkVHlwZSA9IHJldHVyblR5cGU7CiAJfQogCWlmICh0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKSAmJiBjb21waWxlck9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKQEAgLTUyNCw3ICs1NDcsMTIgQEAKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHRoaXMuYmluZGluZy5vcmlnaW5hbCgpLnR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeVR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uKHRoaXMuYmluZGluZywgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cywgdGhpcy50eXBlQXJndW1lbnRzKTsKKwl9CisJcmV0dXJuICh0aGlzLnJlc29sdmVkVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgPT0gMAorCQkJCT8gdGhpcy5yZXNvbHZlZFR5cGUKKwkJCQk6IG51bGw7CiB9CiAKIHB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgewpAQCAtNTQ3LDYgKzU3NSw5IEBACiBwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBkZXB0aCkgewogCS8vIGlnbm9yZSBmb3IgaGVyZQogfQorcHVibGljIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSgpIHsKKwlyZXR1cm4gdGhpcy5leHBlY3RlZFR5cGU7Cit9CiAKIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKQEAgLTU1NCw3ICs1ODUsNyBAQAogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCB0eXBlQXJndW1lbnRzTGVuZ3RoID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IHR5cGVBcmd1bWVudHNMZW5ndGg7IGkrKykgewogCQkJCXRoaXMudHlwZUFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKLQkJCX0JCQorCQkJfQogCQl9CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXRob2REZWNsYXJhdGlvbi5qYXZhCmluZGV4IDY1YTMxOTAuLjUzZmFkZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01ldGhvZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMjAgKzE4LDI0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkV4dHJhQ29tcGlsZXJNb2RpZmllcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWVtYmVyVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZVZhcmlhYmxlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydE1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKIAogcHVibGljIGNsYXNzIE1ldGhvZERlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB7Ci0JCisKIAlwdWJsaWMgVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlOwogCXB1YmxpYyBUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnM7Ci0JCisKIAkvKioKIAkgKiBNZXRob2REZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgogCSAqLwpAQCAtMzksMTUwICs0MywxOTggQEAKIAkJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOwogCX0KIAotCXB1YmxpYyB2b2lkIGFuYWx5c2VDb2RlKAotCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUsCi0JCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6YXRpb25Db250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlLCBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IGluaXRpYWxpemF0aW9uQ29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJLy8gc3RhcnRpbmcgb2YgdGhlIGNvZGUgYW5hbHlzaXMgZm9yIG1ldGhvZHMKLQkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQlpZiAodGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKIAkJCXJldHVybjsKIAkJdHJ5IHsKLQkJCWlmIChiaW5kaW5nID09IG51bGwpCisJCQlpZiAodGhpcy5iaW5kaW5nID09IG51bGwpCiAJCQkJcmV0dXJuOwotCQkJCQotCQkJaWYgKCF0aGlzLmJpbmRpbmcuaXNVc2VkKCkgJiYgCi0JCQkJCSh0aGlzLmJpbmRpbmcuaXNQcml2YXRlKCkgCi0JCQkJCQl8fCAoKCh0aGlzLmJpbmRpbmcubW9kaWZpZXJzICYgKEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZ3xFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0ltcGxlbWVudGluZykpID09IDApICYmIHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSkpIHsKLQkJCQlpZiAoIWNsYXNzU2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuaGFzU3ludGF4RXJyb3IpIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZU1ldGhvZCh0aGlzKTsKKworCQkJaWYgKCF0aGlzLmJpbmRpbmcuaXNVc2VkKCkgJiYgIXRoaXMuYmluZGluZy5pc0Fic3RyYWN0KCkpIHsKKwkJCQlpZiAodGhpcy5iaW5kaW5nLmlzUHJpdmF0ZSgpCisJCQkJCXx8ICgoKHRoaXMuYmluZGluZy5tb2RpZmllcnMgJiAoRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NPdmVycmlkaW5nfEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSW1wbGVtZW50aW5nKSkgPT0gMCkKKwkJCQkJCSYmIHRoaXMuYmluZGluZy5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkpKSB7CisJCQkJCWlmICghY2xhc3NTY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5oYXNTeW50YXhFcnJvcikgeworCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRQcml2YXRlTWV0aG9kKHRoaXMpOworCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJCQorCiAJCQkvLyBza2lwIGVudW0gaW1wbGljaXQgbWV0aG9kcwotCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkgJiYgKHRoaXMuc2VsZWN0b3IgPT0gVHlwZUNvbnN0YW50cy5WQUxVRVMgfHwgdGhpcy5zZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLlZBTFVFT0YpKQorCQkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0VudW0oKSAmJiAodGhpcy5zZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLlZBTFVFUyB8fCB0aGlzLnNlbGVjdG9yID09IFR5cGVDb25zdGFudHMuVkFMVUVPRikpCiAJCQkJcmV0dXJuOwogCiAJCQkvLyBtYXkgYmUgaW4gYSBub24gbmVjZXNzYXJ5IDxjbGluaXQ+IGZvciBpbm5lcmNsYXNzIHdpdGggc3RhdGljIGZpbmFsIGNvbnN0YW50IGZpZWxkcwotCQkJaWYgKGJpbmRpbmcuaXNBYnN0cmFjdCgpIHx8IGJpbmRpbmcuaXNOYXRpdmUoKSkKKwkJCWlmICh0aGlzLmJpbmRpbmcuaXNBYnN0cmFjdCgpIHx8IHRoaXMuYmluZGluZy5pc05hdGl2ZSgpKQogCQkJCXJldHVybjsKLQkJCQorCiAJCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IG1ldGhvZENvbnRleHQgPQogCQkJCW5ldyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KAogCQkJCQlpbml0aWFsaXphdGlvbkNvbnRleHQsCiAJCQkJCXRoaXMsCi0JCQkJCWJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywKLQkJCQkJc2NvcGUsCisJCQkJCXRoaXMuYmluZGluZy50aHJvd25FeGNlcHRpb25zLAorCQkJCQludWxsLAorCQkJCQl0aGlzLnNjb3BlLAogCQkJCQlGbG93SW5mby5ERUFEX0VORCk7CiAKIAkJCS8vIHRhZyBwYXJhbWV0ZXJzIGFzIGJlaW5nIHNldAogCQkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZCh0aGlzLmFyZ3VtZW50c1tpXS5iaW5kaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwcm9wYWdhdGUgdG8gc3RhdGVtZW50cwotCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZGlkQWxyZWFkeUNvbXBsYWluID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCVN0YXRlbWVudCBzdGF0ID0gc3RhdGVtZW50c1tpXTsKLQkJCQkJaWYgKCFzdGF0LmNvbXBsYWluSWZVbnJlYWNoYWJsZShmbG93SW5mbywgc2NvcGUsIGRpZEFscmVhZHlDb21wbGFpbikpIHsKLQkJCQkJCWZsb3dJbmZvID0gc3RhdC5hbmFseXNlQ29kZShzY29wZSwgbWV0aG9kQ29udGV4dCwgZmxvd0luZm8pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gdHJ1ZTsKKwkJCQkJLy8gaWYgdGhpcyBtZXRob2QgdXNlcyBhIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmVkIGJ5IHRoZSBkZWNsYXJpbmcgY2xhc3MsCisJCQkJCS8vIGl0IGNhbid0IGJlIHN0YXRpYy4gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODY4MgorCQkJCQlpZiAodGhpcy5hcmd1bWVudHNbaV0uYmluZGluZyAhPSBudWxsICYmICh0aGlzLmFyZ3VtZW50c1tpXS5iaW5kaW5nLnR5cGUgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKSkgeworCQkJCQkJQmluZGluZyBkZWNsYXJpbmdFbGVtZW50ID0gKChUeXBlVmFyaWFibGVCaW5kaW5nKXRoaXMuYXJndW1lbnRzW2ldLmJpbmRpbmcudHlwZSkuZGVjbGFyaW5nRWxlbWVudDsKKwkJCQkJCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCAmJiB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gZGVjbGFyaW5nRWxlbWVudCkKKwkJCQkJCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuQ2FuQmVTdGF0aWM7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCQlpZiAodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzIGluc3RhbmNlb2YgTWVtYmVyVHlwZUJpbmRpbmcgJiYgIXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc1N0YXRpYygpKSB7CisJCQkJLy8gbWV0aG9kIG9mIGEgbm9uLXN0YXRpYyBtZW1iZXIgdHlwZSBjYW4ndCBiZSBzdGF0aWMuCisJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLkNhbkJlU3RhdGljOworCQkJfQorCQkJLy8gcHJvcGFnYXRlIHRvIHN0YXRlbWVudHMKKwkJCWlmICh0aGlzLnN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBjb21wbGFpbnRMZXZlbCA9IChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwID8gU3RhdGVtZW50Lk5PVF9DT01QTEFJTkVEIDogU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEU7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJU3RhdGVtZW50IHN0YXQgPSB0aGlzLnN0YXRlbWVudHNbaV07CisJCQkJCWlmICgoY29tcGxhaW50TGV2ZWwgPSBzdGF0LmNvbXBsYWluSWZVbnJlYWNoYWJsZShmbG93SW5mbywgdGhpcy5zY29wZSwgY29tcGxhaW50TGV2ZWwpKSA8IFN0YXRlbWVudC5DT01QTEFJTkVEX1VOUkVBQ0hBQkxFKSB7CisJCQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUodGhpcy5zY29wZSwgbWV0aG9kQ29udGV4dCwgZmxvd0luZm8pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBtZXRob2Qgd2l0aCBlbXB0eSBib2R5IHNob3VsZCBub3QgYmUgZmxhZ2dlZCBhcyBzdGF0aWMuCisJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLkNhbkJlU3RhdGljOworCQkJfQogCQkJLy8gY2hlY2sgZm9yIG1pc3NpbmcgcmV0dXJuaW5nIHBhdGgKLQkJCVR5cGVCaW5kaW5nIHJldHVyblR5cGVCaW5kaW5nID0gYmluZGluZy5yZXR1cm5UeXBlOworCQkJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcucmV0dXJuVHlwZTsKIAkJCWlmICgocmV0dXJuVHlwZUJpbmRpbmcgPT0gVHlwZUJpbmRpbmcuVk9JRCkgfHwgaXNBYnN0cmFjdCgpKSB7Ci0JCQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKKwkJCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKSB7CiAJCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLk5lZWRGcmVlUmV0dXJuOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZsb3dJbmZvICE9IEZsb3dJbmZvLkRFQURfRU5EKSB7IAotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zaG91bGRSZXR1cm4ocmV0dXJuVHlwZUJpbmRpbmcsIHRoaXMpOworCQkJCWlmIChmbG93SW5mbyAhPSBGbG93SW5mby5ERUFEX0VORCkgeworCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnNob3VsZFJldHVybihyZXR1cm5UeXBlQmluZGluZywgdGhpcyk7CiAJCQkJfQogCQkJfQogCQkJLy8gY2hlY2sgdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2tzCiAJCQltZXRob2RDb250ZXh0LmNvbXBsYWluSWZVbnVzZWRFeGNlcHRpb25IYW5kbGVycyh0aGlzKTsKKwkJCS8vIGNoZWNrIHVudXNlZCBwYXJhbWV0ZXJzCisJCQl0aGlzLnNjb3BlLmNoZWNrVW51c2VkUGFyYW1ldGVycyh0aGlzLmJpbmRpbmcpOworCQkJLy8gY2hlY2sgaWYgdGhlIG1ldGhvZCBjb3VsZCBoYXZlIGJlZW4gc3RhdGljCisJCQlpZiAoIXRoaXMuYmluZGluZy5pc1N0YXRpYygpICYmICh0aGlzLmJpdHMgJiBBU1ROb2RlLkNhbkJlU3RhdGljKSAhPSAwKSB7CisJCQkJaWYoIXRoaXMuYmluZGluZy5pc092ZXJyaWRpbmcoKSAmJiAhdGhpcy5iaW5kaW5nLmlzSW1wbGVtZW50aW5nKCkpIHsKKwkJCQkJaWYgKHRoaXMuYmluZGluZy5pc1ByaXZhdGUoKSB8fCB0aGlzLmJpbmRpbmcuaXNGaW5hbCgpIHx8IHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ZpbmFsKCkpIHsKKwkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWV0aG9kQ2FuQmVEZWNsYXJlZFN0YXRpYyh0aGlzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWV0aG9kQ2FuQmVQb3RlbnRpYWxseURlY2xhcmVkU3RhdGljKHRoaXMpOworCQkJCQl9CisJCQkJfQorCQkJCQkKKwkJCX0KIAkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgewogCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCX0KIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZCgpIHsKLQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoUGFyc2VyIHBhcnNlciwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewotCiAJCS8vZmlsbCB1cCB0aGUgbWV0aG9kIGJvZHkgd2l0aCBzdGF0ZW1lbnQKLQkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQotCQkJcmV0dXJuOwogCQlwYXJzZXIucGFyc2UodGhpcywgdW5pdCk7CiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludFJldHVyblR5cGUoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCi0JCWlmIChyZXR1cm5UeXBlID09IG51bGwpIHJldHVybiBvdXRwdXQ7Ci0JCXJldHVybiByZXR1cm5UeXBlLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnICcpOworCQlpZiAodGhpcy5yZXR1cm5UeXBlID09IG51bGwpIHJldHVybiBvdXRwdXQ7CisJCXJldHVybiB0aGlzLnJldHVyblR5cGUucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcgJyk7CiAJfQogCiAJcHVibGljIHZvaWQgcmVzb2x2ZVN0YXRlbWVudHMoKSB7Ci0KIAkJLy8gPT09PT09PT09IGFib3J0IG9uIGZhdGFsIGVycm9yID09PT09PT09PT09PT0KIAkJaWYgKHRoaXMucmV0dXJuVHlwZSAhPSBudWxsICYmIHRoaXMuYmluZGluZyAhPSBudWxsKSB7CiAJCQl0aGlzLnJldHVyblR5cGUucmVzb2x2ZWRUeXBlID0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGU7CiAJCQkvLyByZWNvcmQgdGhlIHJldHVybiB0eXBlIGJpbmRpbmcKIAkJfQogCQkvLyBjaGVjayBpZiBtZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lCi0JCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5zb3VyY2VOYW1lLCBzZWxlY3RvcikpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLnNvdXJjZU5hbWUsIHRoaXMuc2VsZWN0b3IpKSB7CiAJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUodGhpcyk7CiAJCX0KLQkJCisJCS8vIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG1ldGhvZCByZXR1cm5zIGEgdHlwZSBwYXJhbWV0ZXIgbm90IGRlY2xhcmVkIGJ5IGl0LgorCQlib29sZWFuIHJldHVybnNVbmRlY2xUeXBlVmFyID0gZmFsc2U7CisJCWlmICh0aGlzLnJldHVyblR5cGUgIT0gbnVsbCAmJiB0aGlzLnJldHVyblR5cGUucmVzb2x2ZWRUeXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykgeworCQkJcmV0dXJuc1VuZGVjbFR5cGVWYXIgPSB0cnVlOworCQl9CiAJCWlmICh0aGlzLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJdGhpcy50eXBlUGFyYW1ldGVyc1tpXS5yZXNvbHZlKHRoaXMuc2NvcGUpOworCQkJCWlmIChyZXR1cm5zVW5kZWNsVHlwZVZhciAmJiB0aGlzLnR5cGVQYXJhbWV0ZXJzW2ldLmJpbmRpbmcgPT0gdGhpcy5yZXR1cm5UeXBlLnJlc29sdmVkVHlwZSkgeworCQkJCQlyZXR1cm5zVW5kZWNsVHlwZVZhciA9IGZhbHNlOworCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQkvLyBjaGVjayBAT3ZlcnJpZGUgYW5ub3RhdGlvbgogCQlmaW5hbCBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKTsKIAkJY2hlY2tPdmVycmlkZTogewogCQkJaWYgKHRoaXMuYmluZGluZyA9PSBudWxsKSBicmVhayBjaGVja092ZXJyaWRlOwotCQkJbG9uZyBzb3VyY2VMZXZlbCA9IGNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbDsKLQkJCWlmIChzb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIGJyZWFrIGNoZWNrT3ZlcnJpZGU7CisJCQlsb25nIGNvbXBsaWFuY2VMZXZlbCA9IGNvbXBpbGVyT3B0aW9ucy5jb21wbGlhbmNlTGV2ZWw7CisJCQlpZiAoY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgYnJlYWsgY2hlY2tPdmVycmlkZTsKIAkJCWludCBiaW5kaW5nTW9kaWZpZXJzID0gdGhpcy5iaW5kaW5nLm1vZGlmaWVyczsKIAkJCWJvb2xlYW4gaGFzT3ZlcnJpZGVBbm5vdGF0aW9uID0gKHRoaXMuYmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uT3ZlcnJpZGUpICE9IDA7Ci0JCQlib29sZWFuIGlzSW50ZXJmYWNlTWV0aG9kID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCk7Ci0JCQlpZiAoaGFzT3ZlcnJpZGVBbm5vdGF0aW9uKSB7CisJCQlib29sZWFuIGhhc1VucmVzb2x2ZWRBcmd1bWVudHMgPSAodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1VucmVzb2x2ZWRBcmd1bWVudHMpICE9IDA7CisJCQlpZiAoaGFzT3ZlcnJpZGVBbm5vdGF0aW9uICAmJiAhaGFzVW5yZXNvbHZlZEFyZ3VtZW50cykgewogCQkJCS8vIG5vIHN0YXRpYyBtZXRob2QgaXMgY29uc2lkZXJlZCBvdmVycmlkaW5nCi0JCQkJaWYgKCFpc0ludGVyZmFjZU1ldGhvZCAmJiAoYmluZGluZ01vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljfEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykpID09IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykKKwkJCQlpZiAoKGJpbmRpbmdNb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpY3xFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpKSA9PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpCiAJCQkJCWJyZWFrIGNoZWNrT3ZlcnJpZGU7CiAJCQkJLy8JaW4gMS41LCBzdHJpY3RseSBmb3Igb3ZlcnJpZGluZyBzdXBlcmNsYXNzIG1ldGhvZAogCQkJCS8vCWluIDEuNiBhbmQgYWJvdmUsIGFsc28gdG9sZXJhdGUgaW1wbGVtZW50aW5nIGludGVyZmFjZSBtZXRob2QKLQkJCQlpZiAoc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNgorCQkJCWlmIChjb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNgogCQkJCQkJJiYgKChiaW5kaW5nTW9kaWZpZXJzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWN8RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NJbXBsZW1lbnRpbmcpKSA9PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0ltcGxlbWVudGluZykpCiAJCQkJCWJyZWFrIGNoZWNrT3ZlcnJpZGU7CiAJCQkJLy8gY2xhaW1zIHRvIG92ZXJyaWRlLCBhbmQgZG9lc24ndCBhY3R1YWxseSBkbyBzbwotCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWV0aG9kTXVzdE92ZXJyaWRlKHRoaXMpOwkJCQkJCi0JCQl9IGVsc2UgaWYgKCFpc0ludGVyZmFjZU1ldGhvZCAJCi0JCQkJCQkmJiAoYmluZGluZ01vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljfEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykpID09IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykgewotCQkJCS8vIGFjdHVhbGx5IG92ZXJyaWRlcywgYnV0IGRpZCBub3QgY2xhaW0gdG8gZG8gc28KLQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb24odGhpcyk7CisJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tZXRob2RNdXN0T3ZlcnJpZGUodGhpcywgY29tcGxpYW5jZUxldmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9JbiBjYXNlIG9mICBhIGNvbmNyZXRlIGNsYXNzIG1ldGhvZCwgd2UgaGF2ZSB0byBjaGVjayBpZiBpdCBvdmVycmlkZXMoaW4gMS41IGFuZCBhYm92ZSkgT1IgaW1wbGVtZW50cyBhIG1ldGhvZCgxLjYgYW5kIGFib3ZlKS4KKwkJCQkvL0Fsc28gY2hlY2sgaWYgdGhlIG1ldGhvZCBoYXMgYSBzaWduYXR1cmUgdGhhdCBpcyBvdmVycmlkZS1lcXVpdmFsZW50IHRvIHRoYXQgb2YgYW55IHB1YmxpYyBtZXRob2QgZGVjbGFyZWQgaW4gT2JqZWN0LgorCQkJCWlmICghdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpeworCQkJCQkJaWYoKGJpbmRpbmdNb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpY3xFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpKSA9PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpIHsKKwkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb24odGhpcyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmKGNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82CisJCQkJCQkJCSYmIGNvbXBpbGVyT3B0aW9ucy5yZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24KKwkJCQkJCQkJJiYgdGhpcy5iaW5kaW5nLmlzSW1wbGVtZW50aW5nKCkpIHsKKwkJCQkJCQkJCS8vIGFjdHVhbGx5IG92ZXJyaWRlcywgYnV0IGRpZCBub3QgY2xhaW0gdG8gZG8gc28KKwkJCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uKHRoaXMpOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CS8vRm9yIDEuNiBhbmQgYWJvdmUgb25seQorCQkJCQkvL0luIGNhc2Ugb2YgYSBpbnRlcmZhY2UgY2xhc3MgbWV0aG9kLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGl0IG92ZXJyaWRlcyBhIG1ldGhvZCAoaXNJbXBsZW1lbnRpbmcgcmV0dXJucyB0cnVlIGluIGNhc2UgaXQgb3ZlcnJpZGVzKQorCQkJCQkvL0Fsc28gY2hlY2sgaWYgdGhlIG1ldGhvZCBoYXMgYSBzaWduYXR1cmUgdGhhdCBpcyBvdmVycmlkZS1lcXVpdmFsZW50IHRvIHRoYXQgb2YgYW55IHB1YmxpYyBtZXRob2QgZGVjbGFyZWQgaW4gT2JqZWN0LgorCQkJCQlpZihjb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNgorCQkJCQkJCSYmIGNvbXBpbGVyT3B0aW9ucy5yZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24KKwkJCQkJCQkmJiAoKChiaW5kaW5nTW9kaWZpZXJzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWN8RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NPdmVycmlkaW5nKSkgPT0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NPdmVycmlkaW5nKSB8fCB0aGlzLmJpbmRpbmcuaXNJbXBsZW1lbnRpbmcoKSkpeworCQkJCQkJLy8gYWN0dWFsbHkgb3ZlcnJpZGVzLCBidXQgZGlkIG5vdCBjbGFpbSB0byBkbyBzbworCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24odGhpcyk7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAJCX0KLQkJCQkKKwogCQkvLyBieSBncmFtbWF0aWNhbCBjb25zdHJ1Y3Rpb24sIGludGVyZmFjZSBtZXRob2RzIGFyZSBhbHdheXMgYWJzdHJhY3QKIAkJc3dpdGNoIChUeXBlRGVjbGFyYXRpb24ua2luZCh0aGlzLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5tb2RpZmllcnMpKSB7CiAJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0wgOgogCQkJCWlmICh0aGlzLnNlbGVjdG9yID09IFR5cGVDb25zdGFudHMuVkFMVUVTKSBicmVhazsKIAkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLlZBTFVFT0YpIGJyZWFrOworCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0wgOgogCQkJCS8vIGlmIGEgbWV0aG9kIGhhcyBhbiBzZW1pY29sb24gYm9keSBhbmQgaXMgbm90IGRlY2xhcmVkIGFzIGFic3RyYWN0PT0+ZXJyb3IKLQkJCQkvLyBuYXRpdmUgbWV0aG9kcyBtYXkgaGF2ZSBhIHNlbWljb2xvbiBib2R5IAorCQkJCS8vIG5hdGl2ZSBtZXRob2RzIG1heSBoYXZlIGEgc2VtaWNvbG9uIGJvZHkKIAkJCQlpZiAoKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5KSAhPSAwKSB7CiAJCQkJCWlmICgodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlKSA9PSAwKQogCQkJCQkJaWYgKCh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgPT0gMCkKQEAgLTE5MSwxMCArMjQzLDE0IEBACiAJCQkJCS8vIHRoZSBtZXRob2QgSEFTIGEgYm9keSAtLT4gYWJzdHJhY3QgbmF0aXZlIG1vZGlmaWVycyBhcmUgZm9yYmlkZW4KIAkJCQkJaWYgKCgodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlKSAhPSAwKSB8fCAoKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSAhPSAwKSkKIAkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWV0aG9kTmVlZGluZ05vQm9keSh0aGlzKTsKKwkJCQkJZWxzZSBpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgIXRoaXMuYmluZGluZy5pc1N0YXRpYygpICYmICEodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzIGluc3RhbmNlb2YgTG9jYWxUeXBlQmluZGluZykgJiYgIXJldHVybnNVbmRlY2xUeXBlVmFyKSB7CisJCQkJCQkvLyBOb3QgYSBtZXRob2Qgb2YgbG9jYWwgdHlwZSAtIGNhbiBiZSBzdGF0aWMKKwkJCQkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLkNhbkJlU3RhdGljOworCQkJCQl9CiAJCQkJfQogCQl9CiAJCXN1cGVyLnJlc29sdmVTdGF0ZW1lbnRzKCk7Ci0JCQorCiAJCS8vIFRhZ0JpdHMuT3ZlcnJpZGluZ01ldGhvZFdpdGhTdXBlcmNhbGwgaXMgc2V0IGR1cmluZyB0aGUgcmVzb2x2ZVN0YXRlbWVudHMoKSBjYWxsCiAJCWlmIChjb21waWxlck9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKIAkJCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCkgewpAQCAtMjEzLDQwICsyNjksNDAgQEAKIAogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBjbGFzc1Njb3BlKSkgewogCQkJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qYXZhZG9jLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQl0aGlzLmphdmFkb2MudHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQl9CiAJCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAJCQkJaW50IGFubm90YXRpb25zTGVuZ3RoID0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc0xlbmd0aDsgaSsrKQotCQkJCQl0aGlzLmFubm90YXRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQkJdGhpcy5hbm5vdGF0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KIAkJCWlmICh0aGlzLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJCQlpbnQgdHlwZVBhcmFtZXRlcnNMZW5ndGggPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoOyBpKyspIHsKLQkJCQkJdGhpcy50eXBlUGFyYW1ldGVyc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCXRoaXMudHlwZVBhcmFtZXRlcnNbaV0udHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQkJfQotCQkJfQkJCQotCQkJaWYgKHJldHVyblR5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm5UeXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCQl9CisJCQlpZiAodGhpcy5yZXR1cm5UeXBlICE9IG51bGwpCisJCQkJdGhpcy5yZXR1cm5UeXBlLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOworCQkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlpbnQgYXJndW1lbnRMZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKQotCQkJCQlhcmd1bWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCQl0aGlzLmFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KLQkJCWlmICh0aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQlpbnQgdGhyb3duRXhjZXB0aW9uc0xlbmd0aCA9IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQkJaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQkJaW50IHRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9uc0xlbmd0aDsgaSsrKQotCQkJCQl0aHJvd25FeGNlcHRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCQkJfQotCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CisJCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCQlpbnQgc3RhdGVtZW50c0xlbmd0aCA9IHRoaXMuc3RhdGVtZW50cy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzTGVuZ3RoOyBpKyspCi0JCQkJCXN0YXRlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCQl0aGlzLnN0YXRlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQl9CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBjbGFzc1Njb3BlKTsKIAl9CiAJcHVibGljIFR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycygpIHsKIAkgICAgcmV0dXJuIHRoaXMudHlwZVBhcmFtZXRlcnM7Ci0JfQkJCisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQppbmRleCA5YzI0ZjEzLi43MmJkYmEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw4ICsxNCw4IEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lUmVmZXJlbmNlIGV4dGVuZHMgUmVmZXJlbmNlIGltcGxlbWVudHMgSW52b2NhdGlvblNpdGUgewogCi0JcHVibGljIEJpbmRpbmcgYmluZGluZywgY29kZWdlbkJpbmRpbmc7IC8vbWF5IGJlIGFUeXBlQmluZGluZy1hRmllbGRCaW5kaW5nLWFMb2NhbFZhcmlhYmxlQmluZGluZwotCQorCXB1YmxpYyBCaW5kaW5nIGJpbmRpbmc7IC8vbWF5IGJlIGFUeXBlQmluZGluZy1hRmllbGRCaW5kaW5nLWFMb2NhbFZhcmlhYmxlQmluZGluZworCiAJcHVibGljIFR5cGVCaW5kaW5nIGFjdHVhbFJlY2VpdmVyVHlwZTsJLy8gbW9kaWZpZWQgcmVjZWl2ZXIgdHlwZSAtIGFjdHVhbCBvbmUgYWNjb3JkaW5nIHRvIG5hbWVsb29rdXAKIAogCS8vdGhlIGVycm9yIHByaW50aW5nCkBAIC0yNiwzNiArMjYsNDAgQEAKIAkvL3dpbGwgYmUgYSBUeXBlUmVmZXJlbmNlIChzdGF0aWMgbWVzc2FnZSBzZW5kcy4uLi4uKSBhbmQgdGhlcmUgaXMKIAkvL25vIGNoYW5nZUNsYXNzIGluIGphdmEuCiBwdWJsaWMgTmFtZVJlZmVyZW5jZSgpIHsKLQlzdXBlcigpOwotCWJpdHMgfD0gQmluZGluZy5UWVBFIHwgQmluZGluZy5WQVJJQUJMRTsgLy8gcmVzdHJpY3RpdmVGbGFnCi0JCisJdGhpcy5iaXRzIHw9IEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuVkFSSUFCTEU7IC8vIHJlc3RyaWN0aXZlRmxhZwogfQorCiBwdWJsaWMgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZygpIHsKIAkvL3RoaXMgbWV0aG9kIHNob3VsZCBiZSBzZW50IE9OTFkgYWZ0ZXIgYSBjaGVjayBhZ2FpbnN0IGlzRmllbGRSZWZlcmVuY2UoKQogCS8vY2hlY2sgaXRzIHVzZSBkb2luZyBzZW5kZXJzLi4uLi4uLi4uCi0KLQlyZXR1cm4gKEZpZWxkQmluZGluZykgYmluZGluZyA7CisJcmV0dXJuIChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZyA7CiB9CisKIHB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7CiAJcmV0dXJuIGZhbHNlOwogfQorCiBwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7CiAJLy8gbnVsbCBpcyBhY2NlcHRhYmxlIHdoZW4gd2UgYXJlIHJlc29sdmluZyB0aGUgZmlyc3QgcGFydCBvZiBhIHJlZmVyZW5jZQotCXJldHVybiBiaW5kaW5nID09IG51bGwgfHwgYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmc7CisJcmV0dXJuIHRoaXMuYmluZGluZyA9PSBudWxsIHx8IHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmc7CiB9CisKIHB1YmxpYyBib29sZWFuIGlzVHlwZVJlZmVyZW5jZSgpIHsKLQlyZXR1cm4gYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmc7CisJcmV0dXJuIHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmc7CiB9CisKIHB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgewogCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBlcnJvciBzY2VuYXJpbyBvbmx5CiAJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGU7CiB9CisKIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgewotCWJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CQkJCisJdGhpcy5iaXRzICY9IH5EZXB0aE1BU0s7IC8vIGZsdXNoIHByZXZpb3VzIGRlcHRoIGlmIGFueQogCWlmIChkZXB0aCA+IDApIHsKLQkJYml0cyB8PSAoZGVwdGggJiAweEZGKSA8PCBEZXB0aFNISUZUOyAvLyBlbmNvZGVkIG9uIDggYml0cworCQl0aGlzLmJpdHMgfD0gKGRlcHRoICYgMHhGRikgPDwgRGVwdGhTSElGVDsgLy8gZW5jb2RlZCBvbiA4IGJpdHMKIAl9CiB9CisKIHB1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGluZGV4KXsKIAkvLyBpZ25vcmVkCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05vcm1hbEFubm90YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTm9ybWFsQW5ub3RhdGlvbi5qYXZhCmluZGV4IGRjMzNlNjAuLmExZDFiZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTm9ybWFsQW5ub3RhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTm9ybWFsQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDkgKzE3LDkgQEAKICAqIE5vcm1hbCBhbm5vdGF0aW9uIG5vZGUKICAqLwogcHVibGljIGNsYXNzIE5vcm1hbEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKKwogCXB1YmxpYyBNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzOwotCQorCiAJcHVibGljIE5vcm1hbEFubm90YXRpb24oVHlwZVJlZmVyZW5jZSB0eXBlLCBpbnQgc291cmNlU3RhcnQpIHsKIAkJdGhpcy50eXBlID0gdHlwZTsKIAkJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwpAQCAtNTcsOSArNTcsMTIgQEAKIAkJb3V0cHV0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeworCQkJCXRoaXMudHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CiAJCQlpZiAodGhpcy5tZW1iZXJWYWx1ZVBhaXJzICE9IG51bGwpIHsKIAkJCQlpbnQgbWVtYmVyVmFsdWVQYWlyc0xlbmd0aCA9IHRoaXMubWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJWYWx1ZVBhaXJzTGVuZ3RoOyBpKyspCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEKaW5kZXggN2M5NTQ0Yi4uYWE3Nzc3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OdWxsTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVsbExpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw4ICsyNiw4IEBACiAJfQogCiAJcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewotCQotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsgCisKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAl9CiAKIAkvKioKQEAgLTM2LDcgKzM2LDcgQEAKIAkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQogCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KIAkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKQEAgLTU2LDcgKzU2LDcgQEAKIAlwdWJsaWMgT2JqZWN0IHJldXNhYmxlSlNSVGFyZ2V0KCkgewogCQlyZXR1cm4gVHlwZUJpbmRpbmcuTlVMTDsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKIAkJcmV0dXJuIHNvdXJjZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bWJlckxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCmluZGV4IGRiZDI2MzguLmY3MzgxMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDI0ICsxMyw3OSBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIE51bWJlckxpdGVyYWwgZXh0ZW5kcyBMaXRlcmFsIHsKIAogCWNoYXJbXSBzb3VyY2U7Ci0JCisKIAlwdWJsaWMgTnVtYmVyTGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLCBpbnQgZSkgewotCQkKIAkJdGhpcyhzLGUpIDsKLQkJc291cmNlID0gdG9rZW4gOworCQl0aGlzLnNvdXJjZSA9IHRva2VuIDsKIAl9Ci0JCisKIAlwdWJsaWMgTnVtYmVyTGl0ZXJhbChpbnQgcywgaW50IGUpIHsKIAkJc3VwZXIgKHMsZSkgOwogCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpewogCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZEphdmFTdGF0ZW1lbnQoKXsKIAkJcmV0dXJuIGZhbHNlIDsKIAl9Ci0JCi0JcHVibGljIGNoYXJbXSBzb3VyY2UoKXsKIAotCQlyZXR1cm4gc291cmNlOworCXB1YmxpYyBjaGFyW10gc291cmNlKCl7CisJCXJldHVybiB0aGlzLnNvdXJjZTsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4WmVyb3NBbmRVbmRlcnNjb3JlcyhjaGFyW10gdG9rZW4sIGJvb2xlYW4gaXNMb25nKSB7CisJCWludCBtYXggPSB0b2tlbi5sZW5ndGg7CisJCWludCBzdGFydCA9IDA7CisJCWludCBlbmQgPSBtYXggLSAxOworCQlpZiAoaXNMb25nKSB7CisJCQllbmQtLTsgLy8gcmVtb3ZlIHRoZSAnTCcgb3IgJ2wnCisJCX0KKwkJaWYgKG1heCA+IDEgJiYgdG9rZW5bMF0gPT0gJzAnKSB7CisJCQlpZiAobWF4ID4gMiAmJiAodG9rZW5bMV0gPT0gJ3gnIHx8IHRva2VuWzFdID09ICdYJykpIHsKKwkJCQlzdGFydCA9IDI7CisJCQl9IGVsc2UgaWYgKG1heCA+IDIgJiYgKHRva2VuWzFdID09ICdiJyB8fCB0b2tlblsxXSA9PSAnQicpKSB7CisJCQkJc3RhcnQgPSAyOworCQkJfSBlbHNlIHsKKwkJCQlzdGFydCA9IDE7CisJCQl9CisJCX0KKwkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworCQlib29sZWFuIGlnbm9yZSA9IHRydWU7CisJCWxvb3A6IGZvciAoaW50IGkgPSBzdGFydDsgaSA8IG1heDsgaSsrKSB7CisJCQljaGFyIGN1cnJlbnRDaGFyID0gdG9rZW5baV07CisJCQlzd2l0Y2goY3VycmVudENoYXIpIHsKKwkJCQljYXNlICcwJyA6CisJCQkJCS8vIHRoaXMgaXMgYSBwcmVmaXggJzAnCisJCQkJCWlmIChpZ25vcmUgJiYgIW1vZGlmaWVkICYmIChpIDwgZW5kKSkgeworCQkJCQkJbW9kaWZpZWQgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ18nIDoKKwkJCQkJbW9kaWZpZWQgPSB0cnVlOworCQkJCQlicmVhayBsb29wOworCQkJCWRlZmF1bHQgOgorCQkJCQlpZ25vcmUgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAoIW1vZGlmaWVkKSB7CisJCQlyZXR1cm4gdG9rZW47CisJCX0KKwkJaWdub3JlID0gdHJ1ZTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZCh0b2tlbiwgMCwgc3RhcnQpOworCQlsb29wOiBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhciBjdXJyZW50Q2hhciA9IHRva2VuW2ldOworCQkJc3dpdGNoKGN1cnJlbnRDaGFyKSB7CisJCQkJY2FzZSAnMCcgOgorCQkJCQlpZiAoaWdub3JlICYmIChpIDwgZW5kKSkgeworCQkJCQkJLy8gdGhpcyBpcyBhIHByZWZpeCAnMCcKKwkJCQkJCWNvbnRpbnVlIGxvb3A7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXycgOgorCQkJCQljb250aW51ZSBsb29wOworCQkJCWRlZmF1bHQ6CisJCQkJCWlnbm9yZSA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcik7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09SX09SX0V4cHJlc3Npb24uamF2YQppbmRleCBhYjk1NjU4Li40YjNmY2E0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09SX09SX0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09SX09SX0V4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCkBAIC0zOSwzMiArNDAsNDQgQEAKIAkJCS8vIEZBTFNFIHx8IGFueXRoaW5nCiAJCQkgLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgogCQkJLy8JCSh4IHx8IHkpIHx8ICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZCBiZSBzd2FwcGVkIGJ5IHRoZSAhCi0JCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7Ci0JCQltZXJnZWRJbmZvID0gcmlnaHQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgbWVyZ2VkSW5mbyk7Ci0JCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gdGhpcy5sZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCW1lcmdlZEluZm8gPSB0aGlzLnJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOworCQkJdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCA9CiAJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKIAkJfQogCi0JCUZsb3dJbmZvIGxlZnRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7Ci0JCisJCUZsb3dJbmZvIGxlZnRJbmZvID0gdGhpcy5sZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwogCQkgLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgogCQkvLwkJKHggfHwgeSkgfHwgIXosIGlmIHBhc3NpbmcgdGhlIGxlZnQgaW5mbyB0byB0aGUgcmlnaHQsIGl0IHdvdWxkIGJlIHN3YXBwZWQgYnkgdGhlICEKIAkJRmxvd0luZm8gcmlnaHRJbmZvID0gbGVmdEluZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsQ29weSgpOwotCQlyaWdodEluaXRTdGF0ZUluZGV4ID0KKwkJdGhpcy5yaWdodEluaXRTdGF0ZUluZGV4ID0KIAkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHJpZ2h0SW5mbyk7CiAKIAkJaW50IHByZXZpb3VzTW9kZSA9IHJpZ2h0SW5mby5yZWFjaE1vZGUoKTsKIAkJaWYgKGlzTGVmdE9wdGltaXplZFRydWUpewotCQkJcmlnaHRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCQkJaWYgKChyaWdodEluZm8ucmVhY2hNb2RlKCkgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgeworCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mYWtlUmVhY2hhYmxlKHRoaXMucmlnaHQpOworCQkJCXJpZ2h0SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCk7CisJCQl9CiAJCX0KLQkJcmlnaHRJbmZvID0gcmlnaHQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgcmlnaHRJbmZvKTsKKwkJcmlnaHRJbmZvID0gdGhpcy5yaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCByaWdodEluZm8pOworCQlpZiAoKHRoaXMubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7CisJCQl0aGlzLmxlZnQuY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQl9CisJCWlmICgodGhpcy5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7CisJCQl0aGlzLnJpZ2h0LmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJfQorCQkvLyBUaGUgZGVmaW5pdGVseSBudWxsIHZhcmlhYmxlcyBpbiByaWdodCBpbmZvIHdoZW4gdHJ1ZSBzaG91bGQgbm90IGJlIG1pc3NlZCBvdXQgd2hpbGUgbWVyZ2luZworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk5OTAwCisJCUZsb3dJbmZvIGxlZnRJbmZvV2hlblRydWVGb3JNZXJnaW5nID0gbGVmdEluZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxDb3B5KCkuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShyaWdodEluZm8udW5jb25kaXRpb25hbEluaXRzV2l0aG91dFNpZGVFZmZlY3QoKSk7CiAJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBGbG93SW5mby5jb25kaXRpb25hbCgKIAkJCQkJLy8gbWVyZ2luZyB0d28gdHJ1ZSBpbml0SW5mb3MgZm9yIHN1Y2ggYSBuZWdhdGl2ZSBjYXNlOiBpZiAoKHQgJiYgKGIgPSB0KSkgfHwgZikgciA9IGI7IC8vIGIgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKLQkJCQkJbGVmdEluZm8uaW5pdHNXaGVuVHJ1ZSgpLnVuY29uZGl0aW9uYWxJbml0cygpLm1lcmdlZFdpdGgoCisJCQkJbGVmdEluZm9XaGVuVHJ1ZUZvck1lcmdpbmcudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKIAkJCQkJCXJpZ2h0SW5mby5zYWZlSW5pdHNXaGVuVHJ1ZSgpLnNldFJlYWNoTW9kZShwcmV2aW91c01vZGUpLnVuY29uZGl0aW9uYWxJbml0cygpKSwKIAkJCQkJcmlnaHRJbmZvLmluaXRzV2hlbkZhbHNlKCkpOwotCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwogCX0KQEAgLTc0LDE0ICs4NywxNCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCS8vIGlubGluZWQgdmFsdWUKIAkJCWlmICh2YWx1ZVJlcXVpcmVkKQotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQotCQlDb25zdGFudCBjc3QgPSByaWdodC5jb25zdGFudDsKKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5yaWdodC5jb25zdGFudDsKIAkJaWYgKGNzdCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCS8vIDxleHByPiB8fCB0cnVlIC0tPiB0cnVlCiAJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKQEAgLTkxLDQ1ICsxMDQsNDUgQEAKIAkJCQkvLyA8ZXhwcj58fCBmYWxzZSAtLT4gPGV4cHI+CiAJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJfQotCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7Ci0JCQl9CQkJCi0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJCisKIAkJQnJhbmNoTGFiZWwgdHJ1ZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pLCBlbmRMYWJlbDsKLQkJY3N0ID0gbGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJY3N0ID0gdGhpcy5sZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlib29sZWFuIGxlZnRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiBsZWZ0SXNUcnVlID0gbGVmdElzQ29uc3QgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CiAKLQkJY3N0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWNzdCA9IHRoaXMucmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CiAJCWJvb2xlYW4gcmlnaHRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiByaWdodElzVHJ1ZSA9IHJpZ2h0SXNDb25zdCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKIAogCQlnZW5lcmF0ZU9wZXJhbmRzIDogewogCQkJaWYgKGxlZnRJc0NvbnN0KSB7Ci0JCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCQlpZiAobGVmdElzVHJ1ZSkgewogCQkJCQlicmVhayBnZW5lcmF0ZU9wZXJhbmRzOyAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIHJpZ2h0IG9wZXJhbmQKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBudWxsLCB0cnVlKTsgCi0JCQkJLy8gbmVlZCB2YWx1ZSwgZS5nLiBpZiAoYSA9PSAxIHx8ICgoYiA9IDIpID4gMCkpIHt9IC0+IHNob3VsZG4ndCBpbml0aWFsaXplICdiJyBpZiBhPT0xIAorCQkJCXRoaXMubGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIG51bGwsIHRydWUpOworCQkJCS8vIG5lZWQgdmFsdWUsIGUuZy4gaWYgKGEgPT0gMSB8fCAoKGIgPSAyKSA+IDApKSB7fSAtPiBzaG91bGRuJ3QgaW5pdGlhbGl6ZSAnYicgaWYgYT09MQogCQkJfQotCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOworCQkJaWYgKHRoaXMucmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5yaWdodEluaXRTdGF0ZUluZGV4KTsKIAkJCX0KIAkJCWlmIChyaWdodElzQ29uc3QpIHsKLQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJdGhpcy5yaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CiAJCQl9IGVsc2UgewotCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgbnVsbCwgdmFsdWVSZXF1aXJlZCk7CisJCQkJdGhpcy5yaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIG51bGwsIHZhbHVlUmVxdWlyZWQpOwogCQkJfQogCQl9Ci0JCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJCS8qCiAJCSAqIGltcHJvdmluZyBjb2RlIGdlbiBmb3Igc3VjaCBhIGNhc2U6IGJvb2xlYW4gYiA9IGkgPCAwIHx8IHRydWUgc2luY2UKQEAgLTE0OCw3ICsxNjEsNyBAQAogCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CiAJCQkJfQogCQkJCWlmICh0cnVlTGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50KCkgPiAwKSB7Ci0JCQkJCWlmICgoYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCkgeworCQkJCQlpZiAoKHRoaXMuYml0cyAmIElzUmV0dXJuZWRWYWx1ZSkgIT0gMCkgewogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUodGhpcyk7CiAJCQkJCQl0cnVlTGFiZWwucGxhY2UoKTsKQEAgLTE2NCw3ICsxNzcsNyBAQAogCQkJCQl0cnVlTGFiZWwucGxhY2UoKTsKIAkJCQl9CiAJCQl9Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJfSBlbHNlIHsKIAkJCXRydWVMYWJlbC5wbGFjZSgpOwpAQCAtMTc1LDI4ICsxODgsMjggQEAKIAkgKiBCb29sZWFuIG9wZXJhdG9yIGNvZGUgZ2VuZXJhdGlvbiBPcHRpbWl6ZWQgb3BlcmF0aW9ucyBhcmU6IHx8CiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEJyYW5jaExhYmVsIHRydWVMYWJlbCwgQnJhbmNoTGFiZWwgZmFsc2VMYWJlbCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJLy8gPGV4cHI+IHx8IGZhbHNlIC0tPiA8ZXhwcj4KLQkJQ29uc3RhbnQgY3N0ID0gcmlnaHQuY29uc3RhbnQ7CisJCUNvbnN0YW50IGNzdCA9IHRoaXMucmlnaHQuY29uc3RhbnQ7CiAJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewogCQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJCXRoaXMubGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwotCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7Ci0JCQl9CQkJCisJCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQl9CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJcmV0dXJuOwogCQl9Ci0JCi0JCWNzdCA9IGxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisKKwkJY3N0ID0gdGhpcy5sZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwogCQlib29sZWFuIGxlZnRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiBsZWZ0SXNUcnVlID0gbGVmdElzQ29uc3QgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CiAKLQkJY3N0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWNzdCA9IHRoaXMucmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CiAJCWJvb2xlYW4gcmlnaHRJc0NvbnN0ID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJYm9vbGVhbiByaWdodElzVHJ1ZSA9IHJpZ2h0SXNDb25zdCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKIApAQCAtMjA1LDE3ICsyMTgsMTcgQEAKIAkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKIAkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKIAkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCi0JCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBudWxsLCAhbGVmdElzQ29uc3QpOyAKKwkJCQkJdGhpcy5sZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgbnVsbCwgIWxlZnRJc0NvbnN0KTsKIAkJCQkJLy8gbmVlZCB2YWx1ZSwgZS5nLiBpZiAoYSA9PSAxIHx8ICgoYiA9IDIpID4gMCkpIHt9IC0+IHNob3VsZG4ndCBpbml0aWFsaXplICdiJyBpZiBhPT0xCiAJCQkJCWlmIChsZWZ0SXNUcnVlKSB7CiAJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOwogCQkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCQkJYnJlYWsgZ2VuZXJhdGVPcGVyYW5kczsgLy8gbm8gbmVlZCB0byBnZW5lcmF0ZSByaWdodCBvcGVyYW5kCiAJCQkJCX0KLQkJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJCWlmICh0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5yaWdodEluaXRTdGF0ZUluZGV4KTsKIAkJCQkJfQotCQkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIG51bGwsIHZhbHVlUmVxdWlyZWQgJiYgIXJpZ2h0SXNDb25zdCk7CisJCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBudWxsLCB2YWx1ZVJlcXVpcmVkICYmICFyaWdodElzQ29uc3QpOwogCQkJCQlpZiAodmFsdWVSZXF1aXJlZCAmJiByaWdodElzVHJ1ZSkgewogCQkJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOwogCQkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0ucG9zaXRpb24pOwpAQCAtMjI1LDE3ICsyMzgsMTcgQEAKIAkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQogCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgewogCQkJCQlCcmFuY2hMYWJlbCBpbnRlcm5hbFRydWVMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKLQkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBpbnRlcm5hbFRydWVMYWJlbCwgbnVsbCwgIWxlZnRJc0NvbnN0KTsgCisJCQkJCXRoaXMubGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBpbnRlcm5hbFRydWVMYWJlbCwgbnVsbCwgIWxlZnRJc0NvbnN0KTsKIAkJCQkJLy8gbmVlZCB2YWx1ZSwgZS5nLiBpZiAoYSA9PSAxIHx8ICgoYiA9IDIpID4gMCkpIHt9IC0+IHNob3VsZG4ndCBpbml0aWFsaXplICdiJyBpZiBhPT0xCiAJCQkJCWlmIChsZWZ0SXNUcnVlKSB7CiAJCQkJCQlpbnRlcm5hbFRydWVMYWJlbC5wbGFjZSgpOwogCQkJCQkJYnJlYWsgZ2VuZXJhdGVPcGVyYW5kczsgLy8gbm8gbmVlZCB0byBnZW5lcmF0ZSByaWdodCBvcGVyYW5kCiAJCQkJCX0KLQkJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJaWYgKHRoaXMucmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJCQkJY29kZVN0cmVhbQotCQkJCQkJCQkuYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJCQkJCS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnJpZ2h0SW5pdFN0YXRlSW5kZXgpOwogCQkJCQl9Ci0JCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQgJiYgIXJpZ2h0SXNDb25zdCk7CisJCQkJCXRoaXMucmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbnVsbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCAmJiAhcmlnaHRJc0NvbnN0KTsKIAkJCQkJaWYgKHZhbHVlUmVxdWlyZWQgJiYgcmlnaHRJc0NvbnN0ICYmICFyaWdodElzVHJ1ZSkgewogCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhmYWxzZUxhYmVsKTsKIAkJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLnBvc2l0aW9uKTsKQEAgLTI0NiwxOSArMjU5LDMzIEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CaW5hcnlFeHByZXNzaW9uI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKKwkgKi8KKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQlUeXBlQmluZGluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCS8vIGNoZWNrIHdoZXRoZXIgY29tcGFyaW5nIGlkZW50aWNhbCBleHByZXNzaW9ucworCQlCaW5kaW5nIGxlZnREaXJlY3QgPSBFeHByZXNzaW9uLmdldERpcmVjdEJpbmRpbmcodGhpcy5sZWZ0KTsKKwkJaWYgKGxlZnREaXJlY3QgIT0gbnVsbCAmJiBsZWZ0RGlyZWN0ID09IEV4cHJlc3Npb24uZ2V0RGlyZWN0QmluZGluZyh0aGlzLnJpZ2h0KSkgeworCQkJaWYgKCEodGhpcy5yaWdodCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbXBhcmluZ0lkZW50aWNhbEV4cHJlc3Npb25zKHRoaXMpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewotCQkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQlyaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0aGlzLmxlZnQudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJdGhpcy5yaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvckV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKaW5kZXggYmI2NDFhOS4uZjQzMTc0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvckV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTUwLDE5ICs1MCwxOSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRlVGFibGVUZXN0Q2FzZSgpewogCQkvL3JldHVybiBhIFN0cmluZyB3aGljaCBpcyBhIGphdmEgbWV0aG9kIGFsbG93aW5nIHRvIHRlc3QKIAkJLy90aGUgbm9uIHplcm8gZW50cmllcyBvZiBhbGwgdGFibGVzCi0JCisKIAkJLyoKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4KIAkJT3BlcmF0b3JFeHByZXNzaW9uLmdlbmVyYXRlVGFibGVUZXN0Q2FzZSgpOwogCQkqLwotCQorCiAJCWludFtdIG9wZXJhdG9ycyA9IG5ldyBpbnRbXXtBTkQsQU5EX0FORCxESVZJREUsR1JFQVRFUixHUkVBVEVSX0VRVUFMLAogCQkJCUxFRlRfU0hJRlQsTEVTUyxMRVNTX0VRVUFMLE1JTlVTLE1VTFRJUExZLE9SLE9SX09SLFBMVVMsUkVNQUlOREVSLAogCQkJCVJJR0hUX1NISUZULFVOU0lHTkVEX1JJR0hUX1NISUZULFhPUn07Ci0JCisKIAkJY2xhc3MgRGVjb2RlIHsKIAkJCXB1YmxpYyAgZmluYWwgU3RyaW5nIGNvbnN0YW50KGludCBjb2RlKXsKLQkJCQlzd2l0Y2goY29kZSl7IAorCQkJCXN3aXRjaChjb2RlKXsKIAkJCQkJY2FzZSBUX2Jvb2xlYW4gCTogcmV0dXJuICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAogCQkJCQljYXNlIFRfYnl0ZQkJOiByZXR1cm4gIigoYnl0ZSkgMykiOyAvLyROT04tTkxTLTEkCiAJCQkJCWNhc2UgVF9jaGFyCQk6IHJldHVybiAiJ0EnIjsgLy8kTk9OLU5MUy0xJApAQCAtNzUsOSArNzUsOSBAQAogCQkJCQljYXNlIFRfc2hvcnQJOiByZXR1cm4gIigoc2hvcnQpIDUpIjsgLy8kTk9OLU5MUy0xJAogCQkJCQljYXNlIFRfSmF2YUxhbmdPYmplY3QJOiByZXR1cm4gIm51bGwiO30gLy8kTk9OLU5MUy0xJAogCQkJCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzt9Ci0JCisKIAkJCXB1YmxpYyAgZmluYWwgU3RyaW5nIHR5cGUoaW50IGNvZGUpewotCQkJCXN3aXRjaChjb2RlKXsgCisJCQkJc3dpdGNoKGNvZGUpewogCQkJCQljYXNlIFRfYm9vbGVhbiAJOiByZXR1cm4gInoiOyAvLyROT04tTkxTLTEkCiAJCQkJCWNhc2UgVF9ieXRlCQk6IHJldHVybiAiYiI7IC8vJE5PTi1OTFMtMSQKIAkJCQkJY2FzZSBUX2NoYXIJCTogcmV0dXJuICJjIjsgLy8kTk9OLU5MUy0xJApAQCAtOTAsNyArOTAsNyBAQAogCQkJCQljYXNlIFRfc2hvcnQJOiByZXR1cm4gInMiOyAvLyROT04tTkxTLTEkCiAJCQkJCWNhc2UgVF9KYXZhTGFuZ09iamVjdAk6IHJldHVybiAib2JqIjt9IC8vJE5PTi1OTFMtMSQKIAkJCQlyZXR1cm4gInh4eCI7fSAvLyROT04tTkxTLTEkCi0JCQkKKwogCQkJcHVibGljICBmaW5hbCBTdHJpbmcgb3BlcmF0b3IoaW50IG9wZXJhdG9yKXsKIAkJCQkJc3dpdGNoIChvcGVyYXRvcikgewogCQkJCQljYXNlIEVRVUFMX0VRVUFMIDoJcmV0dXJuICI9PSI7IC8vJE5PTi1OTFMtMSQKQEAgLTExNSwxNyArMTE1LDE3IEBACiAJCQkJCWNhc2UgTEVTUyA6CQkJcmV0dXJuICI8IjsJfSAvLyROT04tTkxTLTEkCiAJCQkJcmV0dXJuICI/Pz8/Ijt9IC8vJE5PTi1OTFMtMSQKIAkJfQotCQotCQkJCisKKwogCQlEZWNvZGUgZGVjb2RlID0gbmV3IERlY29kZSgpOwogCQlTdHJpbmcgczsKLQkKKwogCQlzID0gIlx0cHVibGljIHN0YXRpYyB2b2lkIGJpbmFyeU9wZXJhdGlvblRhYmxlc1Rlc3RDYXNlKCl7XG4iICsgLy8kTk9OLU5MUy0xJAotCQorCiAJCQkiXHRcdC8vVEMgdGVzdCA6IGFsbCBiaW5hcnkgb3BlcmF0aW9uIChkZXNjcmliZWQgaW4gdGFibGVzKVxuIisgLy8kTk9OLU5MUy0xJAogCQkJIlx0XHQvL21ldGhvZCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieVxuIisgLy8kTk9OLU5MUy0xJAogCQkJIlx0XHQvL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JFeHByZXNzaW9uLmdlbmVyYXRlVGFibGVUZXN0Q2FzZSgpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkKKwogCQkJIlx0XHRTdHJpbmcgc3RyMDtcdCBTdHJpbmcgc3RyXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfSmF2YUxhbmdTdHJpbmcpKyI7XG4iKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSJcdFx0aW50IGkwO1x0IGludCBpXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfaW50KSsiO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkiXHRcdGJvb2xlYW4gejA7XHQgYm9vbGVhbiB6XHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfYm9vbGVhbikrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTM3LDIxICsxMzcsMjEgQEAKIAkJCSJcdFx0bG9uZyBsMDsgXHQgbG9uZyBsXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfbG9uZykrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJIlx0XHRPYmplY3Qgb2JqMDsgXHQgT2JqZWN0IG9ialx0PSAiK2RlY29kZS5jb25zdGFudChUX0phdmFMYW5nT2JqZWN0KSsiO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JCWludCBlcnJvciA9IDA7CQkKKworCQlpbnQgZXJyb3IgPSAwOwogCQlmb3IgKGludCBpPTA7IGkgPCBvcGVyYXRvcnMubGVuZ3RoOyBpKyspCiAJCXsJaW50IG9wZXJhdG9yID0gb3BlcmF0b3JzW2ldOwogCQkJZm9yIChpbnQgbGVmdD0wOyBsZWZ0PDE2O2xlZnQrKykKIAkJCWZvciAoaW50IHJpZ2h0PTA7IHJpZ2h0PDE2O3JpZ2h0KyspCiAJCQl7CWludCByZXN1bHQgPSAoT3BlcmF0b3JTaWduYXR1cmVzW29wZXJhdG9yXVsobGVmdDw8NCkrcmlnaHRdKSAmIDB4MDAwMEY7CiAJCQkJaWYgKHJlc3VsdCAhPSBUX3VuZGVmaW5lZCkKLQkKKwogCQkJCQkvLzEvIEZpcnN0IHJlZ3VsYXIgY29tcHV0YXRpb24gdGhlbiAyLyBjb21wYXJhaXNvbgogCQkJCQkvL3dpdGggYSBjb21waWxlIHRpbWUgY29uc3RhbnQgKGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIpCiAJCQkJCS8vCXowID0gcyA+PSBzOwogCQkJCQkvLwlpZiAoIHowICE9ICgoKHNob3J0KSA1KSA+PSAoKHNob3J0KSA1KSkpCiAJCQkJCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oMTU1KTsKLQkKKwogCQkJCXsJcyArPSAiXHRcdCIrZGVjb2RlLnR5cGUocmVzdWx0KSsiMCIrIiA9ICIrZGVjb2RlLnR5cGUobGVmdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCiAJCQkJCXMgKz0gIiAiK2RlY29kZS5vcGVyYXRvcihvcGVyYXRvcikrIiAiK2RlY29kZS50eXBlKHJpZ2h0KSsiO1xuIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKIAkJCQkJU3RyaW5nIGJlZ2luID0gcmVzdWx0ID09IFRfSmF2YUxhbmdTdHJpbmcgPyAiXHRcdGlmICghICIgOiAiXHRcdGlmICggIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCkBAIC0xNjEsMjMgKzE2MSwyMyBAQAogCQkJCQkJCQkrZGVjb2RlLm9wZXJhdG9yKG9wZXJhdG9yKSsiICIgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQkrZGVjb2RlLmNvbnN0YW50KHJpZ2h0KSsiKSlcbiI7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcyArPSAiXHRcdFx0U3lzdGVtLm91dC5wcmludGxuKCIrICgrK2Vycm9yKSArIik7XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQorCiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQlyZXR1cm4gcyArPSAiXG5cdFx0U3lzdGVtLm91dC5wcmludGxuKFwiYmluYXJ5IHRhYmxlcyB0ZXN0IDogZG9uZVwiKTt9IjsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0FORCgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50LCBvbmx5IDIwIGJpdHMgYXJlIHVzZWQsIHNlZSBiZWxvdy4KIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NAorCiAJCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwotCQkKKwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2J5dGVdIAkJPSAoQnl0ZTJJbnQ8PDEyKSArKEJ5dGUySW50PDw0KSArVF9pbnQ7CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfbG9uZ10JCT0gKEJ5dGUyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZzsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSAoQnl0ZTJJbnQ8PDEyKSArKENoYXIySW50PDw0KSArVF9pbnQ7CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gKEJ5dGUySW50PDwxMikgKyhJbnQySW50PDw0KSAgK1RfaW50OwogCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9sb25nPDw0KStUX2J5dGVdIAkJPSAoTG9uZzJMb25nPDwxMikrKEJ5dGUyTG9uZzw8NCkrVF9sb25nOwogCQl0YWJsZVsoVF9sb25nPDw0KStUX2xvbmddIAkJPSAoTG9uZzJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IChMb25nMkxvbmc8PDEyKSsoQ2hhcjJMb25nPDw0KStUX2xvbmc7CiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfaW50XSAJCT0gKExvbmcyTG9uZzw8MTIpKyhJbnQyTG9uZzw8NCkrVF9sb25nOwogCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfYnl0ZV0gCQkJPSAoU2hvcnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfbG9uZ10gCQkJPSAoU2hvcnQyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZzsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9jaGFyXSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9pbnRdIAkJCT0gKFNob3J0MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludDsKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTI4OSw3ICsyODksNyBAQAogCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkJCisKIAkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IChDaGFyMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfbG9uZ10gCQkJPSAoQ2hhcjJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nOwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfY2hhcl0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfYnl0ZV0gCQk9IChJbnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfaW50PDw0KStUX2xvbmddIAkJPSAoSW50Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmc7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAkJdGFibGVbKFRfaW50PDw0KStUX2NoYXJdIAkJPSAoSW50MkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX2ludDw8NCkrVF9pbnRdIAkJPSAoSW50MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludDsKIAkJLy8JdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0zNTksMTkgKzM1OSwxOSBAQAogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJcmV0dXJuIHRhYmxlOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0FORF9BTkQoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKIAkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl07Ci0JCQorCiAJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC00MTMsNyArNDEzLDcgQEAKIAkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfbG9uZzw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTQyNyw3ICs0MjcsNyBAQAogCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3ZvaWQ8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX3ZvaWQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC00NTUsNyArNDU1LDcgQEAKIAkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9TdHJpbmc8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC00NjksNyArNDY5LDcgQEAKIAkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC00ODMsNyArNDgzLDcgQEAKIAkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZDsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtNTExLDcgKzUxMSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfY2hhcjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8gICAgIHRhYmxlWyhUX2ludDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX2ludF0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9udWxsPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vICAgICB0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC01NTcsMjcgKzU1NywyNyBAQAogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0RJVklERSgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKKwogCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwotCQkKKwogCQlyZXR1cm4gZ2V0X01JTlVTKCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfRVFVQUxfRVFVQUwoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKIAkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl07Ci0JCQorCiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC01OTEsNyArNTkxLDcgQEAKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfYnl0ZV0gCQk9IChCeXRlMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2xvbmddIAkJPSAoQnl0ZTJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9ib29sZWFuOwpAQCAtNjA1LDcgKzYwNSw3IEBACiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfY2hhcl0gCQk9IChCeXRlMkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2ludF0gCQk9IChCeXRlMkludDw8MTIpKyhJbnQySW50PDw0KStUX2Jvb2xlYW47CiAJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9ieXRlXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhCeXRlMkxvbmc8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbjsKQEAgLTYxOSw3ICs2MTksNyBAQAogCQl0YWJsZVsoVF9sb25nPDw0KStUX2NoYXJdIAkJPSAoTG9uZzJMb25nPDwxMikrKENoYXIyTG9uZzw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IChMb25nMkxvbmc8PDEyKSsoSW50Mkxvbmc8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfYnl0ZV0gCQkJPSAoU2hvcnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW47CkBAIC02MzMsNyArNjMzLDcgQEAKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfY2hhcl0gCQkJPSAoU2hvcnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2ludF0gCQkJPSAoU2hvcnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC02NDcsMTAgKzY0NywxMCBAQAogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQotCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsgCisKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7Ci0JCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfSmF2YUxhbmdTdHJpbmddIAkJPSAvKlN0cmluZzJPYmplY3QgICAgICAgICAgICAgICAgIFN0cmluZzJPYmplY3QqLwpAQCAtNjU4LDEzICs2NTgsMTMgQEAKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfSmF2YUxhbmdPYmplY3RdIAkJPSAvKlN0cmluZzJPYmplY3QgICAgICAgICAgICAgICAgIE9iamVjdDJPYmplY3QqLwogCQkJCQkJCQkJCQkgIChUX0phdmFMYW5nT2JqZWN0PDwxNikrKFRfSmF2YUxhbmdTdHJpbmc8PDEyKSsoVF9KYXZhTGFuZ09iamVjdDw8OCkrKFRfSmF2YUxhbmdPYmplY3Q8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkOwotCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZDsgCisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9udWxsXSAJCT0gLypPYmplY3QyU3RyaW5nICAgICAgICAgICAgICAgIG51bGwyT2JqZWN0ICovCiAJCQkJCQkJCQkJCSAgKFRfSmF2YUxhbmdPYmplY3Q8PDE2KSsoVF9KYXZhTGFuZ1N0cmluZzw8MTIpKyhUX0phdmFMYW5nT2JqZWN0PDw4KSsoVF9udWxsPDw0KStUX2Jvb2xlYW47Ci0JCisKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC02ODEsNyArNjgxLDcgQEAKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfSmF2YUxhbmdPYmplY3Q8PDQpK1RfbnVsbF0gCQk9IC8qT2JqZWN0Mk9iamVjdCAgICAgICAgICAgICAgICAgbnVsbDJPYmplY3QqLwogCQkJCQkJCQkJCQkgIChUX0phdmFMYW5nT2JqZWN0PDwxNikrKFRfSmF2YUxhbmdPYmplY3Q8PDEyKSsoVF9KYXZhTGFuZ09iamVjdDw8OCkrKFRfbnVsbDw8NCkrVF9ib29sZWFuOwotCQorCiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYnl0ZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEJ5dGUyRG91YmxlPDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9sb25nXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoTG9uZzJEb3VibGU8PDQpK1RfYm9vbGVhbjsKQEAgLTY5NSw3ICs2OTUsNyBAQAogCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfY2hhcl0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKENoYXIyRG91YmxlPDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9pbnRdIAkJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoSW50MkRvdWJsZTw8NCkrVF9ib29sZWFuOwogCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2J5dGVdIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEJ5dGUyRmxvYXQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoTG9uZzJGbG9hdDw8NCkrVF9ib29sZWFuOwpAQCAtNzA5LDcgKzcwOSw3IEBACiAJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2NoYXJdIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKENoYXIyRmxvYXQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfaW50XSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhJbnQyRmxvYXQ8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC03MjMsNyArNzIzLDcgQEAKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkJCisKIAkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IChDaGFyMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2xvbmddIAkJCT0gKENoYXIyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbjsKQEAgLTczNyw3ICs3MzcsNyBAQAogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2NoYXJdIAkJCT0gKENoYXIySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfaW50XSAJCQk9IChDaGFyMkludDw8MTIpKyhJbnQySW50PDw0KStUX2Jvb2xlYW47CiAJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfYnl0ZV0gCQk9IChJbnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2ludDw8NCkrVF9sb25nXSAJCT0gKEludDJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9ib29sZWFuOwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJCXRhYmxlWyhUX2ludDw8NCkrVF9jaGFyXSAJCT0gKEludDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfaW50PDw0KStUX2ludF0gCQk9IChJbnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC03NjAsNyArNzYwLDcgQEAKIAkJdGFibGVbKFRfbnVsbDw8NCkrVF9KYXZhTGFuZ1N0cmluZ10gCQk9IC8qbnVsbDJPYmplY3QgICAgICAgICAgICAgICAgIFN0cmluZzJPYmplY3QqLwogCQkJCQkJCQkJCQkgIChUX0phdmFMYW5nT2JqZWN0PDwxNikrKFRfbnVsbDw8MTIpKyhUX0phdmFMYW5nT2JqZWN0PDw4KSsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9udWxsPDw0KStUX0phdmFMYW5nT2JqZWN0XSAJCT0gLypudWxsMk9iamVjdCAgICAgICAgICAgICAgICAgT2JqZWN0Mk9iamVjdCovCi0JCQkJCQkJCQkJCSAgKFRfSmF2YUxhbmdPYmplY3Q8PDE2KSsoVF9udWxsPDwxMikrKFRfSmF2YUxhbmdPYmplY3Q8PDgpKyhUX0phdmFMYW5nT2JqZWN0PDw0KStUX2Jvb2xlYW47IAorCQkJCQkJCQkJCQkgIChUX0phdmFMYW5nT2JqZWN0PDwxNikrKFRfbnVsbDw8MTIpKyhUX0phdmFMYW5nT2JqZWN0PDw4KSsoVF9KYXZhTGFuZ09iamVjdDw8NCkrVF9ib29sZWFuOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTc3MiwzNiArNzcyLDM2IEBACiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfR1JFQVRFUigpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKwogCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKIAkJcmV0dXJuIGdldF9MRVNTKCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfR1JFQVRFUl9FUVVBTCgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKwogCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKIAkJcmV0dXJuIGdldF9MRVNTKCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfTEVGVF9TSElGVCgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKwogCQlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKLQkJCisKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZDsKQEAgLTgxNSw3ICs4MTUsNyBAQAogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQkKKwogCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfYnl0ZV0gCQk9IChCeXRlMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfbG9uZ10gCQk9IChCeXRlMkludDw8MTIpKyhMb25nMkludDw8NCkrVF9pbnQ7CkBAIC04MjksNyArODI5LDcgQEAKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9jaGFyXSAJCT0gKEJ5dGUySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9pbnRdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfYnl0ZV0gCQk9IChMb25nMkxvbmc8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfbG9uZzsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhMb25nMkludDw8NCkrVF9sb25nOwpAQCAtODQzLDcgKzg0Myw3IEBACiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IChMb25nMkxvbmc8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfbG9uZzsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9pbnRdIAkJPSAoTG9uZzJMb25nPDwxMikrKEludDJJbnQ8PDQpK1RfbG9uZzsKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJCT0gKFNob3J0MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0MkludDw8MTIpKyhMb25nMkludDw8NCkrVF9pbnQ7CkBAIC04NTcsNyArODU3LDcgQEAKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfY2hhcl0gCQkJPSAoU2hvcnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfaW50XSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwpAQCAtODcxLDcgKzg3MSw3IEBACiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2ludF0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC04ODUsNyArODg1LDcgQEAKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC04OTksNyArODk5LDcgQEAKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC05MTMsNyArOTEzLDcgQEAKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZDsKQEAgLTkyNyw3ICs5MjcsNyBAQAogCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtOTQxLDcgKzk0MSw3IEBACiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCQorCiAJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfYnl0ZV0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2xvbmddIAkJCT0gKENoYXIySW50PDwxMikrKExvbmcySW50PDw0KStUX2ludDsKQEAgLTk1NSw3ICs5NTUsNyBAQAogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2NoYXJdIAkJCT0gKENoYXIySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfY2hhcjw8NCkrVF9pbnRdIAkJCT0gKENoYXIySW50PDwxMikrKEludDJJbnQ8PDQpK1RfaW50OwogCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfYnl0ZV0gCQk9IChJbnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfaW50PDw0KStUX2xvbmddIAkJPSAoSW50MkludDw8MTIpKyhMb25nMkludDw8NCkrVF9pbnQ7CkBAIC05NjksNyArOTY5LDcgQEAKIAkJdGFibGVbKFRfaW50PDw0KStUX2NoYXJdIAkJPSAoSW50MkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX2ludDw8NCkrVF9pbnRdIAkJPSAoSW50MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludDsKIAkJLy8JdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC05ODMsMTkgKzk4MywxOSBAQAogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJcmV0dXJuIHRhYmxlOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0xFU1MoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKIAkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl07Ci0JCQorCiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0xMDA5LDcgKzEwMDksNyBAQAogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9ieXRlXSAJCT0gKEJ5dGUySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2J5dGU8PDQpK1RfbG9uZ10gCQk9IChCeXRlMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW47CkBAIC0xMDIzLDcgKzEwMjMsNyBAQAogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9pbnRdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuOwogCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkKKwogCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfYnl0ZV0gCQk9IChMb25nMkxvbmc8PDEyKSsoQnl0ZTJMb25nPDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfbG9uZ10gCQk9IChMb25nMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW47CkBAIC0xMDM3LDcgKzEwMzcsNyBAQAogCQl0YWJsZVsoVF9sb25nPDw0KStUX2NoYXJdIAkJPSAoTG9uZzJMb25nPDwxMikrKENoYXIyTG9uZzw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IChMb25nMkxvbmc8PDEyKSsoSW50Mkxvbmc8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfYnl0ZV0gCQkJPSAoU2hvcnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW47CkBAIC0xMDUxLDcgKzEwNTEsNyBAQAogCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9jaGFyXSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfaW50XSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuOwogCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwpAQCAtMTA2NSwyMSArMTA2NSwyMSBAQAogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQotCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsgCisKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7Ci0JCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZDsKLQkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQ7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYnl0ZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEJ5dGUyRG91YmxlPDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9sb25nXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoTG9uZzJEb3VibGU8PDQpK1RfYm9vbGVhbjsKQEAgLTExMDcsNyArMTEwNyw3IEBACiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9jaGFyXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoQ2hhcjJEb3VibGU8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfZG91YmxlPDw0KStUX2ludF0gCQkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhJbnQyRG91YmxlPDw0KStUX2Jvb2xlYW47CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfYnl0ZV0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoQnl0ZTJGbG9hdDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9sb25nXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhMb25nMkZsb2F0PDw0KStUX2Jvb2xlYW47CkBAIC0xMTIxLDcgKzExMjEsNyBAQAogCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9jaGFyXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhDaGFyMkZsb2F0PDw0KStUX2Jvb2xlYW47CiAJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2ludF0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoSW50MkZsb2F0PDw0KStUX2Jvb2xlYW47CiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkJCisKIAkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IChDaGFyMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2xvbmddIAkJCT0gKENoYXIyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbjsKQEAgLTExNDksNyArMTE0OSw3IEBACiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfY2hhcl0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfY2hhcjw8NCkrVF9pbnRdIAkJCT0gKENoYXIySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkKKwogCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfaW50PDw0KStUX2J5dGVdIAkJPSAoSW50MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuOwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfbG9uZ10gCQk9IChJbnQyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbjsKQEAgLTExNjMsNyArMTE2Myw3IEBACiAJCXRhYmxlWyhUX2ludDw8NCkrVF9jaGFyXSAJCT0gKEludDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJdGFibGVbKFRfaW50PDw0KStUX2ludF0gCQk9IChJbnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbjsKIAkJLy8JdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0xMTc3LDMxICsxMTc3LDMxIEBACiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkKKwogCQlyZXR1cm4gdGFibGU7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfTEVTU19FUVVBTCgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKwogCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKIAkJcmV0dXJuIGdldF9MRVNTKCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfTUlOVVMoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKIAkJaW50W10gdGFibGUgPSAoaW50W10pIGdldF9QTFVTKCkuY2xvbmUoKTsKIAotCQkvLyBjdXN0b21pemF0aW9uCQorCQkvLyBjdXN0b21pemF0aW9uCiAJCXRhYmxlWyhUX0phdmFMYW5nU3RyaW5nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkOwpAQCAtMTIxNCw3ICsxMjE0LDcgQEAKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX0phdmFMYW5nU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJdGFibGVbKFRfYnl0ZTw8NCkJK1RfSmF2YUxhbmdTdHJpbmddIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfbG9uZzw8NCkJK1RfSmF2YUxhbmdTdHJpbmddIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfc2hvcnQ8PDQpCStUX0phdmFMYW5nU3RyaW5nXSAJCT0gVF91bmRlZmluZWQ7CkBAIC0xMjI2LDU1ICsxMjI2LDU1IEBACiAJCXRhYmxlWyhUX2NoYXI8PDQpCStUX0phdmFMYW5nU3RyaW5nXSAJCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2ludDw8NCkJK1RfSmF2YUxhbmdTdHJpbmddIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfbnVsbDw8NCkJK1RfSmF2YUxhbmdTdHJpbmddIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJdGFibGVbKFRfbnVsbDw8NCkJK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCXJldHVybiB0YWJsZTsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9NVUxUSVBMWSgpewotCQorCiAJCS8vdGhlIGNvZGUgaXMgYW4gaW50CiAJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAogCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCi0JCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKwogCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKIAkJcmV0dXJuIGdldF9NSU5VUygpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X09SKCl7Ci0JCisKIAkJLy90aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQotCQkKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKKworCiAJCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwogCQlyZXR1cm4gZ2V0X0FORCgpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X09SX09SKCl7Ci0JCisKIAkJLy90aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NAorCiAJCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwogCQlyZXR1cm4gZ2V0X0FORF9BTkQoKTsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9QTFVTKCl7Ci0JCisKIAkJLy90aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NAorCiAJCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwotCQkKKwogCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkOwpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKIAkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkOwotCQkJCisKIAkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2J5dGVdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9ieXRlPDw0KStUX2xvbmddIAkJPSAoQnl0ZTJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nOwpAQCAtMTMwMiw3ICsxMzAyLDcgQEAKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9jaGFyXSAJCT0gKEJ5dGUySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludDsKIAkJdGFibGVbKFRfYnl0ZTw8NCkrVF9pbnRdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQorCiAJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9ieXRlXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhCeXRlMkxvbmc8PDQpK1RfbG9uZzsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZzsKQEAgLTEzMTQsOSArMTMxNCw5IEBACiAJCXRhYmxlWyhUX2xvbmc8PDQpK1RfZmxvYXRdIAkJPSAoTG9uZzJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9mbG9hdDsKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfbG9uZzw8NCkrVF9jaGFyXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhDaGFyMkxvbmc8PDQpK1RfbG9uZzsKLQkJdGFibGVbKFRfbG9uZzw8NCkrVF9pbnRdIAkJPSAoTG9uZzJMb25nPDwxMikrKEludDJMb25nPDw0KStUX2xvbmc7IAorCQl0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IChMb25nMkxvbmc8PDEyKSsoSW50Mkxvbmc8PDQpK1RfbG9uZzsKIAkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJCT0gKFNob3J0MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQ7CiAJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmc7CkBAIC0xMzMwLDcgKzEzMzAsNyBAQAogCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9jaGFyXSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9pbnRdIAkJCT0gKFNob3J0MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludDsKIAkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkKKwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTEzNDQsMjEgKzEzNDQsMjEgQEAKIAkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkOwotCQkKLQkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7IAorCisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQnl0ZTJCeXRlPDw0KStUX0phdmFMYW5nU3RyaW5nOwotCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9sb25nXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX0phdmFMYW5nU3RyaW5nOyAKKwkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfbG9uZ10gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9KYXZhTGFuZ1N0cmluZzsKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSAoU3RyaW5nMlN0cmluZzw8MTIpKyhTaG9ydDJTaG9ydDw8NCkrVF9KYXZhTGFuZ1N0cmluZzsKIAkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfSmF2YUxhbmdTdHJpbmddIAkJPSAoU3RyaW5nMlN0cmluZzw8MTIpKyhTdHJpbmcyU3RyaW5nPDw0KStUX0phdmFMYW5nU3RyaW5nOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9KYXZhTGFuZ09iamVjdF0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKE9iamVjdDJPYmplY3Q8PDQpK1RfSmF2YUxhbmdTdHJpbmc7CiAJCXRhYmxlWyhUX0phdmFMYW5nU3RyaW5nPDw0KStUX2RvdWJsZV0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfSmF2YUxhbmdTdHJpbmc7Ci0JCXRhYmxlWyhUX0phdmFMYW5nU3RyaW5nPDw0KStUX2Zsb2F0XSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfSmF2YUxhbmdTdHJpbmc7IAorCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9mbG9hdF0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX0phdmFMYW5nU3RyaW5nOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9ib29sZWFuXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQm9vbGVhbjJCb29sZWFuPDw0KStUX0phdmFMYW5nU3RyaW5nOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9jaGFyXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQ2hhcjJDaGFyPDw0KStUX0phdmFMYW5nU3RyaW5nOwogCQl0YWJsZVsoVF9KYXZhTGFuZ1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoSW50MkludDw8NCkrVF9KYXZhTGFuZ1N0cmluZzsKIAkJdGFibGVbKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfbnVsbF0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKFRfbnVsbDw8OCkrKFRfbnVsbDw8NCkrVF9KYXZhTGFuZ1N0cmluZzsKLQkKKwogCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZDsKQEAgLTEzNzIsMjEgKzEzNzIsMjEgQEAKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ieXRlXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoQnl0ZTJEb3VibGU8PDQpK1RfZG91YmxlOwogCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbG9uZ10gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKExvbmcyRG91YmxlPDw0KStUX2RvdWJsZTsKLQkJdGFibGVbKFRfZG91YmxlPDw0KStUX3Nob3J0XSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoU2hvcnQyRG91YmxlPDw0KStUX2RvdWJsZTsgCisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9zaG9ydF0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKFNob3J0MkRvdWJsZTw8NCkrVF9kb3VibGU7CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9KYXZhTGFuZ1N0cmluZ10gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfSmF2YUxhbmdTdHJpbmc7CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZDsKIAkJdGFibGVbKFRfZG91YmxlPDw0KStUX2RvdWJsZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfZG91YmxlOwotCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfZmxvYXRdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhGbG9hdDJEb3VibGU8PDQpK1RfZG91YmxlOyAKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2Zsb2F0XSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoRmxvYXQyRG91YmxlPDw0KStUX2RvdWJsZTsKIAkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZDsKLQkJdGFibGVbKFRfZG91YmxlPDw0KStUX2NoYXJdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhDaGFyMkRvdWJsZTw8NCkrVF9kb3VibGU7IAotCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEludDJEb3VibGU8PDQpK1RfZG91YmxlOyAKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2NoYXJdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhDaGFyMkRvdWJsZTw8NCkrVF9kb3VibGU7CisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9pbnRdIAkJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoSW50MkRvdWJsZTw8NCkrVF9kb3VibGU7CiAJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2J5dGVdIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEJ5dGUyRmxvYXQ8PDQpK1RfZmxvYXQ7CiAJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2xvbmddIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKExvbmcyRmxvYXQ8PDQpK1RfZmxvYXQ7CkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9jaGFyXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhDaGFyMkZsb2F0PDw0KStUX2Zsb2F0OwogCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9pbnRdIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEludDJGbG9hdDw8NCkrVF9mbG9hdDsKIAkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0xNDE0LDcgKzE0MTQsNyBAQAogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQ7Ci0JCQorCiAJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfYnl0ZV0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2xvbmddIAkJCT0gKENoYXIyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZzsKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAJCXRhYmxlWyhUX2NoYXI8PDQpK1RfY2hhcl0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZDsKLQkJCisKIAkJLy8JdGFibGVbKFRfaW50PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQ7CiAJCXRhYmxlWyhUX2ludDw8NCkrVF9ieXRlXSAJCT0gKEludDJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfbG9uZ10gCQk9IChJbnQyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZzsKQEAgLTE0NDIsNyArMTQ0Miw3IEBACiAJCXRhYmxlWyhUX2ludDw8NCkrVF9jaGFyXSAJCT0gKEludDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50OwogCQl0YWJsZVsoVF9pbnQ8PDQpK1RfaW50XSAJCT0gKEludDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQ7CiAJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQ7Ci0JCisKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkOwogCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CkBAIC0xNDU2LDU2ICsxNDU2LDU2IEBACiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZDsKIAkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CiAJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfbnVsbF0gCQkJPSAoTnVsbDJTdHJpbmc8PDEyKSsoTnVsbDJTdHJpbmc8PDQpK1RfU3RyaW5nOzsKLQkKKwogCQlyZXR1cm4gdGFibGU7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfUkVNQUlOREVSKCl7Ci0JCisKIAkJLy90aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NAorCiAJCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwogCQlyZXR1cm4gZ2V0X01JTlVTKCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfUklHSFRfU0hJRlQoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKLQkJCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0CisKIAkJLy8JaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl07CiAJCXJldHVybiBnZXRfTEVGVF9TSElGVCgpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X1VOU0lHTkVEX1JJR0hUX1NISUZUKCl7Ci0JCisKIAkJLy90aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKLQkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCi0JCQorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NAorCiAJCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdOwogCQlyZXR1cm4gZ2V0X0xFRlRfU0hJRlQoKTsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9YT1IoKXsKLQkKKwogCQkvL3RoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAotCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQKIAogCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XTsKIAkJcmV0dXJuIGdldF9BTkQoKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIG9wZXJhdG9yVG9TdHJpbmcoKSB7Ci0JCXN3aXRjaCAoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKKwkJc3dpdGNoICgodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSB7CiAJCQljYXNlIEVRVUFMX0VRVUFMIDoKIAkJCQlyZXR1cm4gIj09IjsgLy8kTk9OLU5MUy0xJAogCQkJY2FzZSBMRVNTX0VRVUFMIDoKQEAgLTE1NTksMTIgKzE1NTksMTIgQEAKIAlwdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJcmV0dXJuIEZsb3dJbmZvLk5PTl9OVUxMOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewogCiAJCW91dHB1dC5hcHBlbmQoJygnKTsKIAkJcmV0dXJuIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoMCwgb3V0cHV0KS5hcHBlbmQoJyknKTsKIAl9Ci0JCisKIAlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9ySWRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9ySWRzLmphdmEKaW5kZXggZmI5MTNhNC4uODg2YTYzOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvcklkcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JJZHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywyMCArMTMsMjAgQEAKIHB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0b3JJZHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFORF9BTkQgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SX09SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTkQgPSAyOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUiA9IDM7IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFORCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1IgPSAzOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1MgPSA0OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1NfRVFVQUwgPSA1OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUFURVIgPSA2OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUFURVJfRVFVQUwgPSA3OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhPUiA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWSURFID0gOTsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWSURFID0gOTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1NISUZUID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UID0gMTE7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRXSURETEUgPSAxMjsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSAxMzsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUyA9IDE0OyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVUxUSVBMWSA9IDE1OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1QgPSAxMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUV0lERExFID0gMTI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSAxMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTID0gMTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElQTFkgPSAxNTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1BSU5ERVIgPSAxNjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVCA9IDE3OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMX0VRVUFMID0gMTg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1BhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1BhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggOTQxYjI1OC4uZTFjZDUyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwxNyArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgQnVnIDM0MjY3MSAtIENsYXNzQ2FzdEV4Y2VwdGlvbjogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZyBjYW5ub3QgYmUgY2FzdCB0byBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCkBAIC0yOSw3ICszMSw3IEBACiAJICogQHBhcmFtIHBvc2l0aW9ucwogCSAqLwogCXB1YmxpYyBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIFR5cGVSZWZlcmVuY2VbXVtdIHR5cGVBcmd1bWVudHMsIGludCBkaW0sIGxvbmdbXSBwb3NpdGlvbnMpIHsKLQkgICAgCisKIAkJc3VwZXIodG9rZW5zLCBkaW0sIHBvc2l0aW9ucyk7CiAJCXRoaXMudHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CiAJfQpAQCAtNDYsMjAgKzQ4LDE5IEBACiAJCWlmIChpbmRleCA+IDAgJiYgIHR5cGUuZW5jbG9zaW5nVHlwZSgpICE9IG51bGwpIHsKIAkJCWNoZWNrQm91bmRzKHR5cGUuZW5jbG9zaW5nVHlwZSgpLCBzY29wZSwgaW5kZXggLSAxKTsKIAkJfQotCQlpZiAodHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKKwkJaWYgKHR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZVdpdGhBY3R1YWxBcmd1bWVudHMoKSkgewogCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdHlwZTsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBwYXJhbWV0ZXJpemVkVHlwZS5nZW5lcmljVHlwZSgpOwogCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSBjdXJyZW50VHlwZS50eXBlVmFyaWFibGVzKCk7Ci0JCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0gcGFyYW1ldGVyaXplZFR5cGUuYXJndW1lbnRzOwotCQkJaWYgKGFyZ1R5cGVzICE9IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7IC8vIGFyZ1R5cGVzIG1heSBiZSBudWxsIGluIGVycm9yIGNhc2VzCisJCQlpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7IC8vIGFyZ1R5cGVzIG1heSBiZSBudWxsIGluIGVycm9yIGNhc2VzCiAJCQkJcGFyYW1ldGVyaXplZFR5cGUuYm91bmRDaGVjayhzY29wZSwgdGhpcy50eXBlQXJndW1lbnRzW2luZGV4XSk7CiAJCQl9CiAJCX0KIAl9CiAJcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CiAJCXJldHVybiBuZXcgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodGhpcy50b2tlbnMsIHRoaXMudHlwZUFyZ3VtZW50cywgZGltLCB0aGlzLnNvdXJjZVBvc2l0aW9ucyk7Ci0JfQkKLQkKKwl9CisKIAkvKioKIAkgKiBAcmV0dXJuIGNoYXJbXVtdCiAJICovCkBAIC04MSw3ICs4Miw3IEBACiAJCQkJYnVmZmVyLmFwcGVuZCgnPicpOwogCQkJCWludCBuYW1lTGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOwogCQkJCXFQYXJhbU5hbWVbaV0gPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKLQkJCQlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgcVBhcmFtTmFtZVtpXSwgMCk7CQkKKwkJCQlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgcVBhcmFtTmFtZVtpXSwgMCk7CiAJCQl9CiAJCX0KIAkJaW50IGRpbSA9IHRoaXMuZGltZW5zaW9uczsKQEAgLTk1LDI4ICs5Niw0NCBAQAogCQkJcVBhcmFtTmFtZVtsZW5ndGgtMV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChxUGFyYW1OYW1lW2xlbmd0aC0xXSwgZGltQ2hhcnMpOwogCQl9CiAJCXJldHVybiBxUGFyYW1OYW1lOwotCX0JCi0JCisJfQorCiAJLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UjZ2V0VHlwZUJpbmRpbmcob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKICAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vdCBzdXBwb3J0ZWQgaGVyZSAtIGNvbWJpbmVkIHdpdGggcmVzb2x2ZVR5cGUoLi4uKQogICAgIH0KLSAgICAKKwogICAgIC8qCiAgICAgICogTm8gbmVlZCB0byBjaGVjayBmb3IgcmVmZXJlbmNlIHRvIHJhdyB0eXBlIHBlciBjb25zdHJ1Y3Rpb24KICAgICAgKi8KIAlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKLQogCQkvLyBoYW5kbGUgdGhlIGVycm9yIGhlcmUKIAkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRpZFJlc29sdmUpICE9IDApIHsgLy8gaXMgYSBzaGFyZWQgdHlwZSByZWZlcmVuY2Ugd2hpY2ggd2FzIGFscmVhZHkgcmVzb2x2ZWQKLQkJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsICYmICF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKQotCQkJCXJldHVybiBudWxsOyAvLyBhbHJlYWR5IHJlcG9ydGVkIGVycm9yCi0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7Ci0JCX0gCisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgeyAvLyBpcyBhIHNoYXJlZCB0eXBlIHJlZmVyZW5jZSB3aGljaCB3YXMgYWxyZWFkeSByZXNvbHZlZAorCQkJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzd2l0Y2ggKHRoaXMucmVzb2x2ZWRUeXBlLnByb2JsZW1JZCgpKSB7CisJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6CisJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZS5jbG9zZXN0TWF0Y2goKTsKKwkJCQkJCQlyZXR1cm4gdHlwZTsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAJCXRoaXMuYml0cyB8PSBBU1ROb2RlLkRpZFJlc29sdmU7CisJCVR5cGVCaW5kaW5nIHR5cGUgPSBpbnRlcm5hbFJlc29sdmVMZWFmVHlwZShzY29wZSwgY2hlY2tCb3VuZHMpOworCQljcmVhdGVBcnJheVR5cGUoc2NvcGUpOworCQlyZXR1cm4gdHlwZSA9PSBudWxsID8gdHlwZSA6IHRoaXMucmVzb2x2ZWRUeXBlOworCX0KKwlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZUxlYWZUeXBlKFNjb3BlIHNjb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7CiAJCWJvb2xlYW4gaXNDbGFzc1Njb3BlID0gc2NvcGUua2luZCA9PSBTY29wZS5DTEFTU19TQ09QRTsKIAkJQmluZGluZyBiaW5kaW5nID0gc2NvcGUuZ2V0UGFja2FnZSh0aGlzLnRva2Vucyk7CiAJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewpAQCAtMTQyLDcgKzE1OSw3IEBACiAKIAkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBiaW5kaW5nID09IG51bGwgPyBudWxsIDogKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOwogCQlib29sZWFuIHR5cGVJc0NvbnNpc3RlbnQgPSB0cnVlOwotCQlSZWZlcmVuY2VCaW5kaW5nIHF1YWxpZmllZFR5cGUgPSBudWxsOworCQlSZWZlcmVuY2VCaW5kaW5nIHF1YWxpZnlpbmdUeXBlID0gbnVsbDsKIAkJZm9yIChpbnQgaSA9IHBhY2thZ2VCaW5kaW5nID09IG51bGwgPyAwIDogcGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lLmxlbmd0aCwgbWF4ID0gdGhpcy50b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCWZpbmROZXh0VHlwZUJpbmRpbmcoaSwgc2NvcGUsIHBhY2thZ2VCaW5kaW5nKTsKIAkJCWlmICghKHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpKSB7CkBAIC0xNjAsMjMgKzE3NywzMCBAQAogCQkJCQkJICAgIAl0eXBlQXJndW1lbnQucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpIHNjb3BlKTsKIAkJCQkJCSAgICB9CiAJCQkJCQl9Ci0JCQkJICAgIH0JCQkJCisJCQkJICAgIH0KIAkJCQl9CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlOwotCQkJaWYgKHF1YWxpZmllZFR5cGUgPT0gbnVsbCkgewotCQkJCXF1YWxpZmllZFR5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCk7IC8vIGlmIG1lbWJlciB0eXBlCi0JCQkJaWYgKHF1YWxpZmllZFR5cGUgIT0gbnVsbCAmJiAocXVhbGlmaWVkVHlwZS5pc0dlbmVyaWNUeXBlKCkgfHwgcXVhbGlmaWVkVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpKSB7Ci0JCQkJCXF1YWxpZmllZFR5cGUgPSBjdXJyZW50VHlwZS5pc1N0YXRpYygpCi0JCQkJCQk/IChSZWZlcmVuY2VCaW5kaW5nKSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUocXVhbGlmaWVkVHlwZSkKLQkJCQkJCTogc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9QYXJhbWV0ZXJpemVkVHlwZShxdWFsaWZpZWRUeXBlKTsKKwkJCWlmIChxdWFsaWZ5aW5nVHlwZSA9PSBudWxsKSB7CisJCQkJcXVhbGlmeWluZ1R5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCk7IC8vIGlmIG1lbWJlciB0eXBlCisJCQkJaWYgKHF1YWxpZnlpbmdUeXBlICE9IG51bGwpIHsKKwkJCQkJcXVhbGlmeWluZ1R5cGUgPSBjdXJyZW50VHlwZS5pc1N0YXRpYygpCisJCQkJCQk/IChSZWZlcmVuY2VCaW5kaW5nKSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUocXVhbGlmeWluZ1R5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pCisJCQkJCQk6IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUGFyYW1ldGVyaXplZFR5cGUocXVhbGlmeWluZ1R5cGUpOwogCQkJCX0KLQkJCX0JCQkJCi0JCQlpZiAodHlwZUlzQ29uc2lzdGVudCAmJiBjdXJyZW50VHlwZS5pc1N0YXRpYygpICYmIHF1YWxpZmllZFR5cGUgIT0gbnVsbCAmJiAocXVhbGlmaWVkVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgcXVhbGlmaWVkVHlwZS5pc0dlbmVyaWNUeXBlKCkpKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljTWVtYmVyT2ZQYXJhbWV0ZXJpemVkVHlwZSh0aGlzLCBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKChSZWZlcmVuY2VCaW5kaW5nKWN1cnJlbnRUeXBlLmVyYXN1cmUoKSwgbnVsbCwgcXVhbGlmaWVkVHlwZSkpOwotCQkJCXR5cGVJc0NvbnNpc3RlbnQgPSBmYWxzZTsKLQkJCX0JCQkKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHR5cGVJc0NvbnNpc3RlbnQgJiYgY3VycmVudFR5cGUuaXNTdGF0aWMoKQorCQkJCQkJJiYgKHF1YWxpZnlpbmdUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGVXaXRoQWN0dWFsQXJndW1lbnRzKCkgfHwgcXVhbGlmeWluZ1R5cGUuaXNHZW5lcmljVHlwZSgpKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdGF0aWNNZW1iZXJPZlBhcmFtZXRlcml6ZWRUeXBlKHRoaXMsIHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpY3VycmVudFR5cGUuZXJhc3VyZSgpLCBudWxsLCBxdWFsaWZ5aW5nVHlwZSksIGkpOworCQkJCQl0eXBlSXNDb25zaXN0ZW50ID0gZmFsc2U7CisJCQkJfQorCQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGUuZXJhc3VyZSgpICE9IHF1YWxpZnlpbmdUeXBlLmVyYXN1cmUoKSkgeyAvLyBxdWFsaWZpZXIgIT0gZGVjbGFyaW5nL2VuY2xvc2luZworCQkJCQlxdWFsaWZ5aW5nVHlwZSA9IGVuY2xvc2luZ1R5cGU7IC8vIGluaGVyaXRlZCBtZW1iZXIgdHlwZSwgbGVhdmUgaXQgYXNzb2NpYXRlZCB3aXRoIGl0cyBlbmNsb3NpbmcgcmF0aGVyIHRoYW4gc3VidHlwZQorCQkJCX0KKwkJCX0KKwogCQkJLy8gY2hlY2sgZ2VuZXJpYyBhbmQgYXJpdHkKIAkJICAgIFR5cGVSZWZlcmVuY2VbXSBhcmdzID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOwogCQkgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewpAQCAtMTg2LDEyNiArMjEwLDE0NiBAQAogCQkJICAgIAkoKENsYXNzU2NvcGUpIHNjb3BlKS5zdXBlclR5cGVSZWZlcmVuY2UgPSBudWxsOwogCQkJICAgIH0KIAkJCQlpbnQgYXJnTGVuZ3RoID0gYXJncy5sZW5ndGg7CisJCQkJYm9vbGVhbiBpc0RpYW1vbmQgPSBhcmdMZW5ndGggPT0gMCAmJiAoaSA9PSAobWF4IC0xKSkgJiYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzRGlhbW9uZCkgIT0gMCk7CiAJCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1thcmdMZW5ndGhdOwogCQkJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRPcmlnaW5hbCA9IChSZWZlcmVuY2VCaW5kaW5nKWN1cnJlbnRUeXBlLm9yaWdpbmFsKCk7CiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmdMZW5ndGg7IGorKykgewogCQkJCSAgICBUeXBlUmVmZXJlbmNlIGFyZyA9IGFyZ3Nbal07CiAJCQkJICAgIFR5cGVCaW5kaW5nIGFyZ1R5cGUgPSBpc0NsYXNzU2NvcGUKLQkJCQkJCT8gYXJnLnJlc29sdmVUeXBlQXJndW1lbnQoKENsYXNzU2NvcGUpIHNjb3BlLCBjdXJyZW50VHlwZSwgaikKLQkJCQkJCTogYXJnLnJlc29sdmVUeXBlQXJndW1lbnQoKEJsb2NrU2NvcGUpIHNjb3BlLCBjdXJyZW50VHlwZSwgaik7CisJCQkJCQk/IGFyZy5yZXNvbHZlVHlwZUFyZ3VtZW50KChDbGFzc1Njb3BlKSBzY29wZSwgY3VycmVudE9yaWdpbmFsLCBqKQorCQkJCQkJOiBhcmcucmVzb2x2ZVR5cGVBcmd1bWVudCgoQmxvY2tTY29wZSkgc2NvcGUsIGN1cnJlbnRPcmlnaW5hbCwgaik7CiAJCQkJCWlmIChhcmdUeXBlID09IG51bGwpIHsKIAkJCQkJCWFyZ0hhc0Vycm9yID0gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWFyZ1R5cGVzW2pdID0gYXJnVHlwZTsKLQkJCQkJfQkJCSAgICAKLQkJCQl9CQkJCQorCQkJCQl9CisJCQkJfQogCQkJCWlmIChhcmdIYXNFcnJvcikgewogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQkJaWYgKGlzQ2xhc3NTY29wZSkgewogCQkJCQkoKENsYXNzU2NvcGUpIHNjb3BlKS5zdXBlclR5cGVSZWZlcmVuY2UgPSBrZWVwOwotCQkJCQlpZiAoKChDbGFzc1Njb3BlKSBzY29wZSkuZGV0ZWN0SGllcmFyY2h5Q3ljbGUoY3VycmVudFR5cGUsIHRoaXMpKQorCQkJCQlpZiAoKChDbGFzc1Njb3BlKSBzY29wZSkuZGV0ZWN0SGllcmFyY2h5Q3ljbGUoY3VycmVudE9yaWdpbmFsLCB0aGlzKSkKIAkJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAotCQkJICAgIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gY3VycmVudFR5cGUudHlwZVZhcmlhYmxlcygpOworCQkJICAgIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gY3VycmVudE9yaWdpbmFsLnR5cGVWYXJpYWJsZXMoKTsKIAkJCQlpZiAodHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7IC8vIGNoZWNrIGdlbmVyaWMKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQoaSwgdGhpcywgY3VycmVudFR5cGUsIGFyZ1R5cGVzKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBlbHNlIGlmIChhcmdMZW5ndGggIT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsgLy8gY2hlY2sgYXJpdHkKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZSh0aGlzLCBjdXJyZW50VHlwZSwgYXJnVHlwZXMpOwotCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLm9yaWdpbmFsU291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeyAvLyBiZWxvdyAxLjUsIGFscmVhZHkgcmVwb3J0ZWQgYXMgc3ludGF4IGVycm9yCisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub25HZW5lcmljVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZChpLCB0aGlzLCBjdXJyZW50VHlwZSwgYXJnVHlwZXMpOworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSAgKHF1YWxpZnlpbmdUeXBlICE9IG51bGwgJiYgcXVhbGlmeWluZ1R5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQorCQkJCQkJPyBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKGN1cnJlbnRPcmlnaW5hbCwgbnVsbCwgcXVhbGlmeWluZ1R5cGUpCisJCQkJCQk6IGN1cnJlbnRUeXBlOworCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCQkJfSBlbHNlIGlmIChhcmdMZW5ndGggIT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsKKwkJCQkJaWYgKCFpc0RpYW1vbmQpIHsgLy8gY2hlY2sgYXJpdHkKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmluY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZFR5cGUodGhpcywgY3VycmVudFR5cGUsIGFyZ1R5cGVzLCBpKTsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CiAJCQkJfQogCQkJCS8vIGNoZWNrIHBhcmFtZXRlcml6aW5nIG5vbi1zdGF0aWMgbWVtYmVyIHR5cGUgb2YgcmF3IHR5cGUKIAkJCQlpZiAodHlwZUlzQ29uc2lzdGVudCAmJiAhY3VycmVudFR5cGUuaXNTdGF0aWMoKSkgewogCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFjdHVhbEVuY2xvc2luZyA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKIAkJCQkJaWYgKGFjdHVhbEVuY2xvc2luZyAhPSBudWxsICYmIGFjdHVhbEVuY2xvc2luZy5pc1Jhd1R5cGUoKSkgewogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmF3TWVtYmVyVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZCgKLQkJCQkJCQkJdGhpcywgc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKChSZWZlcmVuY2VCaW5kaW5nKWN1cnJlbnRUeXBlLmVyYXN1cmUoKSwgYWN0dWFsRW5jbG9zaW5nKSwgYXJnVHlwZXMpOwotCQkJCQkJdHlwZUlzQ29uc2lzdGVudCA9IGZhbHNlOwkJCQkKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtZXRlcml6ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgoUmVmZXJlbmNlQmluZGluZyljdXJyZW50VHlwZS5lcmFzdXJlKCksIGFyZ1R5cGVzLCBxdWFsaWZpZWRUeXBlKTsKLQkJCQkvLyBjaGVjayBhcmd1bWVudCB0eXBlIGNvbXBhdGliaWxpdHkKLQkJCQlpZiAoY2hlY2tCb3VuZHMpIC8vIG90aGVyd2lzZSB3aWxsIGRvIGl0IGluIFNjb3BlLmNvbm5lY3RUeXBlVmFyaWFibGVzKCkgb3IgZ2VuZXJpYyBtZXRob2QgcmVzb2x1dGlvbgotCQkJCQlwYXJhbWV0ZXJpemVkVHlwZS5ib3VuZENoZWNrKHNjb3BlLCBhcmdzKTsKLQkJCQlxdWFsaWZpZWRUeXBlID0gcGFyYW1ldGVyaXplZFR5cGU7Ci0JCSAgICB9IGVsc2UgewotCQkJCWlmIChpc0NsYXNzU2NvcGUpCi0JCQkJCWlmICgoKENsYXNzU2NvcGUpIHNjb3BlKS5kZXRlY3RIaWVyYXJjaHlDeWNsZShjdXJyZW50VHlwZSwgdGhpcykpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRFcmFzdXJlID0gKFJlZmVyZW5jZUJpbmRpbmcpY3VycmVudFR5cGUuZXJhc3VyZSgpOwotCQkJCWlmIChjdXJyZW50RXJhc3VyZS5pc0dlbmVyaWNUeXBlKCkpIHsKLQkgICAJCQkgICAgaWYgKHR5cGVJc0NvbnNpc3RlbnQgJiYgcXVhbGlmaWVkVHlwZSAhPSBudWxsICYmIHF1YWxpZmllZFR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5wYXJhbWV0ZXJpemVkTWVtYmVyVHlwZU1pc3NpbmdBcmd1bWVudHModGhpcywgc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZShjdXJyZW50RXJhc3VyZSwgbnVsbCwgcXVhbGlmaWVkVHlwZSkpOworCQkJCQkJCQl0aGlzLCBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVJhd1R5cGUoY3VycmVudE9yaWdpbmFsLCBhY3R1YWxFbmNsb3NpbmcpLCBhcmdUeXBlcyk7CiAJCQkJCQl0eXBlSXNDb25zaXN0ZW50ID0gZmFsc2U7CiAJCQkJCX0KLQkgICAJCQkgICAgcXVhbGlmaWVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUmF3VHlwZShjdXJyZW50RXJhc3VyZSwgcXVhbGlmaWVkVHlwZSk7IC8vIHJhdyB0eXBlCisJCQkJfQorCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoY3VycmVudE9yaWdpbmFsLCBhcmdUeXBlcywgcXVhbGlmeWluZ1R5cGUpOworCQkJCS8vIGNoZWNrIGFyZ3VtZW50IHR5cGUgY29tcGF0aWJpbGl0eSBmb3Igbm9uIDw+IGNhc2VzIC0gPD4gY2FzZSBuZWVkcyBubyBib3VuZHMgY2hlY2ssIHdlIHdpbGwgc2NyZWFtIGZvdWwgaWYgbmVlZGVkIGR1cmluZyBpbmZlcmVuY2UuCisJCQkJaWYgKCFpc0RpYW1vbmQpIHsKKwkJCQkJaWYgKGNoZWNrQm91bmRzKSAvLyBvdGhlcndpc2Ugd2lsbCBkbyBpdCBpbiBTY29wZS5jb25uZWN0VHlwZVZhcmlhYmxlcygpIG9yIGdlbmVyaWMgbWV0aG9kIHJlc29sdXRpb24KKwkJCQkJCXBhcmFtZXRlcml6ZWRUeXBlLmJvdW5kQ2hlY2soc2NvcGUsIGFyZ3MpOworCQkJCQllbHNlCisJCQkJCQlzY29wZS5kZWZlckJvdW5kQ2hlY2sodGhpcyk7CisJCQkJfQorCQkJCXF1YWxpZnlpbmdUeXBlID0gcGFyYW1ldGVyaXplZFR5cGU7CisJCSAgICB9IGVsc2UgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudE9yaWdpbmFsID0gKFJlZmVyZW5jZUJpbmRpbmcpY3VycmVudFR5cGUub3JpZ2luYWwoKTsKKwkJCQlpZiAoaXNDbGFzc1Njb3BlKQorCQkJCQlpZiAoKChDbGFzc1Njb3BlKSBzY29wZSkuZGV0ZWN0SGllcmFyY2h5Q3ljbGUoY3VycmVudE9yaWdpbmFsLCB0aGlzKSkKKwkJCQkJCXJldHVybiBudWxsOworCQkJCWlmIChjdXJyZW50T3JpZ2luYWwuaXNHZW5lcmljVHlwZSgpKSB7CisJICAgCQkJICAgIGlmICh0eXBlSXNDb25zaXN0ZW50ICYmIHF1YWxpZnlpbmdUeXBlICE9IG51bGwgJiYgcXVhbGlmeWluZ1R5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5wYXJhbWV0ZXJpemVkTWVtYmVyVHlwZU1pc3NpbmdBcmd1bWVudHModGhpcywgc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZShjdXJyZW50T3JpZ2luYWwsIG51bGwsIHF1YWxpZnlpbmdUeXBlKSwgaSk7CisJCQkJCQl0eXBlSXNDb25zaXN0ZW50ID0gZmFsc2U7CisJCQkJCX0KKwkgICAJCQkgICAgcXVhbGlmeWluZ1R5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVJhd1R5cGUoY3VycmVudE9yaWdpbmFsLCBxdWFsaWZ5aW5nVHlwZSk7IC8vIHJhdyB0eXBlCiAJCQkJfSBlbHNlIHsKLQkJCQkJcXVhbGlmaWVkVHlwZSA9IChxdWFsaWZpZWRUeXBlICE9IG51bGwgJiYgcXVhbGlmaWVkVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpCi0JCQkJCQkJCQkJCQkJPyBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKGN1cnJlbnRFcmFzdXJlLCBudWxsLCBxdWFsaWZpZWRUeXBlKQorCQkJCQlxdWFsaWZ5aW5nVHlwZSA9IChxdWFsaWZ5aW5nVHlwZSAhPSBudWxsICYmIHF1YWxpZnlpbmdUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkKKwkJCQkJCQkJCQkJCQk/IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoY3VycmVudE9yaWdpbmFsLCBudWxsLCBxdWFsaWZ5aW5nVHlwZSkKIAkJCQkJCQkJCQkJCQk6IGN1cnJlbnRUeXBlOwogCQkJCX0KIAkJCX0KLQkJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHF1YWxpZmllZFR5cGUsIHNjb3BlKSkKLQkJCQlyZXBvcnREZXByZWNhdGVkVHlwZShxdWFsaWZpZWRUeXBlLCBzY29wZSk7CQkgICAgCi0JCQl0aGlzLnJlc29sdmVkVHlwZSA9IHF1YWxpZmllZFR5cGU7Ci0JCX0KLS8vCQl0aGlzLnJlc29sdmVkVHlwZSA9IHF1YWxpZmllZFR5cGU7Ci0JCS8vIGFycmF5IHR5cGUgPwotCQlpZiAodGhpcy5kaW1lbnNpb25zID4gMCkgewotCQkJaWYgKGRpbWVuc2lvbnMgPiAyNTUpCi0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueURpbWVuc2lvbnModGhpcyk7Ci0JCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmNyZWF0ZUFycmF5VHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgZGltZW5zaW9ucyk7CisJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChxdWFsaWZ5aW5nVHlwZSwgc2NvcGUpKQorCQkJCXJlcG9ydERlcHJlY2F0ZWRUeXBlKHF1YWxpZnlpbmdUeXBlLCBzY29wZSwgaSk7CisJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHF1YWxpZnlpbmdUeXBlOwogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFycmF5VHlwZShTY29wZSBzY29wZSkgeworCQlpZiAodGhpcy5kaW1lbnNpb25zID4gMCkgeworCQkJaWYgKHRoaXMuZGltZW5zaW9ucyA+IDI1NSkKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50b29NYW55RGltZW5zaW9ucyh0aGlzKTsKKwkJCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuY3JlYXRlQXJyYXlUeXBlKHRoaXMucmVzb2x2ZWRUeXBlLCB0aGlzLmRpbWVuc2lvbnMpOworCQl9CisJfQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQlpbnQgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMudG9rZW5zLmxlbmd0aDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKLQkJCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKLQkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworCQkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2Vuc1tpXSk7CisJCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50ID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOwogCQkJaWYgKHR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgnPCcpOwotCQkJCWludCBtYXggPSB0eXBlQXJndW1lbnQubGVuZ3RoIC0gMTsKKwkJCQlpbnQgdHlwZUFyZ3VtZW50TGVuZ3RoID0gdHlwZUFyZ3VtZW50Lmxlbmd0aDsKKwkJCQlpZiAodHlwZUFyZ3VtZW50TGVuZ3RoID4gMCkgeworCQkJCQlpbnQgbWF4ID0gdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXg7IGorKykgeworCQkJCQkJdHlwZUFyZ3VtZW50W2pdLnByaW50KDAsIG91dHB1dCk7CisJCQkJCQlvdXRwdXQuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQl0eXBlQXJndW1lbnRbbWF4XS5wcmludCgwLCBvdXRwdXQpOworCQkJCX0KKwkJCQlvdXRwdXQuYXBwZW5kKCc+Jyk7CisJCQl9CisJCQlvdXRwdXQuYXBwZW5kKCcuJyk7CisJCX0KKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2Vuc1tsZW5ndGggLSAxXSk7CisJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbbGVuZ3RoIC0gMV07CisJCWlmICh0eXBlQXJndW1lbnQgIT0gbnVsbCkgeworCQkJb3V0cHV0LmFwcGVuZCgnPCcpOworCQkJaW50IHR5cGVBcmd1bWVudExlbmd0aCA9IHR5cGVBcmd1bWVudC5sZW5ndGg7CisJCQlpZiAodHlwZUFyZ3VtZW50TGVuZ3RoID4gMCkgeworCQkJCWludCBtYXggPSB0eXBlQXJndW1lbnRMZW5ndGggLSAxOwogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKIAkJCQkJdHlwZUFyZ3VtZW50W2pdLnByaW50KDAsIG91dHB1dCk7CiAJCQkJCW91dHB1dC5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQl0eXBlQXJndW1lbnRbbWF4XS5wcmludCgwLCBvdXRwdXQpOwotCQkJCW91dHB1dC5hcHBlbmQoJz4nKTsKIAkJCX0KLQkJCW91dHB1dC5hcHBlbmQoJy4nKTsKLQkJfQotCQlvdXRwdXQuYXBwZW5kKHRva2Vuc1tsZW5ndGggLSAxXSk7Ci0JCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2xlbmd0aCAtIDFdOwotCQlpZiAodHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCW91dHB1dC5hcHBlbmQoJzwnKTsKLQkJCWludCBtYXggPSB0eXBlQXJndW1lbnQubGVuZ3RoIC0gMTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKLQkJCQl0eXBlQXJndW1lbnRbal0ucHJpbnQoMCwgb3V0cHV0KTsKLQkJCQlvdXRwdXQuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXR5cGVBcmd1bWVudFttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCQlvdXRwdXQuYXBwZW5kKCc+Jyk7CiAJCX0KIAkJaWYgKCh0aGlzLmJpdHMgJiBJc1ZhckFyZ3MpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDAgOyBpIDwgZGltZW5zaW9ucyAtIDE7IGkrKykgeworCQkJZm9yIChpbnQgaT0gMCA7IGkgPCB0aGlzLmRpbWVuc2lvbnMgLSAxOyBpKyspIHsKIAkJCQlvdXRwdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlvdXRwdXQuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaT0gMCA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKwkJCWZvciAoaW50IGk9IDAgOyBpIDwgdGhpcy5kaW1lbnNpb25zOyBpKyspIHsKIAkJCQlvdXRwdXQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KIAkJcmV0dXJuIG91dHB1dDsKLQl9CQotCQorCX0KKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7CiAJICAgIHJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKHNjb3BlLCBjaGVja0JvdW5kcyk7Ci0JfQkKKwl9CiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKENsYXNzU2NvcGUgc2NvcGUpIHsKIAkgICAgcmV0dXJuIGludGVybmFsUmVzb2x2ZVR5cGUoc2NvcGUsIGZhbHNlKTsKIAl9CkBAIC0zMjEsNyArMzY1LDcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1BhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1BhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggM2Y3NTk1ZS4uNDBiZGM4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwxNyArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgQnVnIDM0MjY3MSAtIENsYXNzQ2FzdEV4Y2VwdGlvbjogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZyBjYW5ub3QgYmUgY2FzdCB0byBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCkBAIC0yMiw3ICsyNCw3IEBACiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBBcnJheVR5cGVSZWZlcmVuY2UgewogCiAJcHVibGljIFR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzOwotCQorCiAJcHVibGljIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cywgaW50IGRpbSwgbG9uZyBwb3MpewogCQlzdXBlcihuYW1lLCBkaW0sIHBvcyk7CiAJCXRoaXMub3JpZ2luYWxTb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZDsKQEAgLTQ1LDcgKzQ3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSNjb3B5RGltcyhpbnQpCiAJICovCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSkgewotCQlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKHRva2VuLCB0eXBlQXJndW1lbnRzLCBkaW0sICgoKGxvbmcpc291cmNlU3RhcnQpPDwzMikrc291cmNlRW5kKTsKKwkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSh0aGlzLnRva2VuLCB0aGlzLnR5cGVBcmd1bWVudHMsIGRpbSwgKCgobG9uZyl0aGlzLnNvdXJjZVN0YXJ0KTw8MzIpK3RoaXMuc291cmNlRW5kKTsKIAl9CiAKIAkvKioKQEAgLTcxLDYxICs3MywxMDUgQEAKIAkJCQlkaW1DaGFyc1tpbmRleCsxXSA9ICddJzsKIAkJCX0KIAkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLCBkaW1DaGFycyk7Ci0JCX0JCQorCQl9CiAJCXJldHVybiBuZXcgY2hhcltdW117IG5hbWUgfTsKLQl9CQorCX0KIAkvKioKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlI2dldFR5cGVCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGUpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKSB7CiAgICAgICAgIHJldHVybiBudWxsOyAvLyBub3Qgc3VwcG9ydGVkIGhlcmUgLSBjb21iaW5lZCB3aXRoIHJlc29sdmVUeXBlKC4uLikKLSAgICB9CQorICAgIH0KIAogICAgIC8qCiAgICAgICogTm8gbmVlZCB0byBjaGVjayBmb3IgcmVmZXJlbmNlIHRvIHJhdyB0eXBlIHBlciBjb25zdHJ1Y3Rpb24KICAgICAgKi8KIAlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgYm9vbGVhbiBjaGVja0JvdW5kcykgewotCiAJCS8vIGhhbmRsZSB0aGUgZXJyb3IgaGVyZQogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGlkUmVzb2x2ZSkgIT0gMCkgeyAvLyBpcyBhIHNoYXJlZCB0eXBlIHJlZmVyZW5jZSB3aGljaCB3YXMgYWxyZWFkeSByZXNvbHZlZAotCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgIXRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKLQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKLQkJfSAKLQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuRGlkUmVzb2x2ZTsKLQkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5nZXRUeXBlKHRva2VuKTsKLQkJCWlmICghKHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpKSB7Ci0JCQkJcmVwb3J0SW52YWxpZFR5cGUoc2NvcGUpOwotCQkJCS8vIGJlIHJlc2lsaWVudCwgc3RpbGwgYXR0ZW1wdCByZXNvbHZpbmcgYXJndW1lbnRzCi0JCQkJYm9vbGVhbiBpc0NsYXNzU2NvcGUgPSBzY29wZS5raW5kID09IFNjb3BlLkNMQVNTX1NDT1BFOwotCQkJCWludCBhcmdMZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnTGVuZ3RoOyBpKyspIHsKLQkJCQkJVHlwZVJlZmVyZW5jZSB0eXBlQXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07Ci0JCQkJCWlmIChpc0NsYXNzU2NvcGUpIHsKLQkJCQkJCXR5cGVBcmd1bWVudC5yZXNvbHZlVHlwZSgoQ2xhc3NTY29wZSkgc2NvcGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHlwZUFyZ3VtZW50LnJlc29sdmVUeXBlKChCbG9ja1Njb3BlKSBzY29wZSwgY2hlY2tCb3VuZHMpOworCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlICE9IG51bGwpIHsgLy8gaXMgYSBzaGFyZWQgdHlwZSByZWZlcmVuY2Ugd2hpY2ggd2FzIGFscmVhZHkgcmVzb2x2ZWQKKwkJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3dpdGNoICh0aGlzLnJlc29sdmVkVHlwZS5wcm9ibGVtSWQoKSkgeworCQkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCA6CisJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOgorCQkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5yZXNvbHZlZFR5cGUuY2xvc2VzdE1hdGNoKCk7CisJCQkJCQkJcmV0dXJuIHR5cGU7CisJCQkJCQlkZWZhdWx0IDoKKwkJCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQkJfQogCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KLQkJCWVuY2xvc2luZ1R5cGUgPSB0aGlzLnJlc29sdmVkVHlwZS5lbmNsb3NpbmdUeXBlKCk7IC8vIGlmIG1lbWJlciB0eXBlCi0JCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIChlbmNsb3NpbmdUeXBlLmlzR2VuZXJpY1R5cGUoKSB8fCBlbmNsb3NpbmdUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkpIHsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlOworCQl9CisJCXRoaXMuYml0cyB8PSBBU1ROb2RlLkRpZFJlc29sdmU7CisJCVR5cGVCaW5kaW5nIHR5cGUgPSBpbnRlcm5hbFJlc29sdmVMZWFmVHlwZShzY29wZSwgZW5jbG9zaW5nVHlwZSwgY2hlY2tCb3VuZHMpOworCQkvLyBoYW5kbGUgdGhyZWUgZGlmZmVyZW50IG91dGNvbWVzOgorCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0aGlzLnJlc29sdmVkVHlwZSA9IGNyZWF0ZUFycmF5VHlwZShzY29wZSwgdGhpcy5yZXNvbHZlZFR5cGUpOworCQkJcmV0dXJuIG51bGw7CQkJCQkJCS8vIG5vIHVzZWZ1bCB0eXBlLCBidXQgc3RpbGwgY2FwdHVyZWQgZGltZW5zaW9ucyBpbnRvIHRoaXMucmVzb2x2ZWRUeXBlCisJCX0gZWxzZSB7CisJCQl0eXBlID0gY3JlYXRlQXJyYXlUeXBlKHNjb3BlLCB0eXBlKTsKKwkJCWlmICghdGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQlyZXR1cm4gdHlwZTsJCQkJCQkvLyBmb3VuZCBzb21lIGVycm9yLCBidXQgY291bGQgcmVjb3ZlciB1c2VmdWwgdHlwZSAobGlrZSBjbG9zZXN0TWF0Y2gpCisJCQllbHNlIAorCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGU7IAkvLyBubyBjb21wbGFpbnQsIGtlZXAgZnVsbHkgcmVzb2x2ZWQgdHlwZSAoaW5jbC4gZGltZW5zaW9ucykKKwkJfQorCX0KKwlwcml2YXRlIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZUxlYWZUeXBlKFNjb3BlIHNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZTsKKwkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgeworCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5nZXRUeXBlKHRoaXMudG9rZW4pOworCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQljdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZTsKKwkJCX0gZWxzZSB7CisJCQkJcmVwb3J0SW52YWxpZFR5cGUoc2NvcGUpOworCQkJCXN3aXRjaCAodGhpcy5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkpIHsKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCA6CisJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6CisJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA6CisJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5yZXNvbHZlZFR5cGUuY2xvc2VzdE1hdGNoKCk7CisJCQkJCQlpZiAodHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCQljdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8kRkFMTC1USFJPVUdIJCAtIHVuYWJsZSB0byBjb21wbGV0ZSB0eXBlIGJpbmRpbmcsIGJ1dCBzdGlsbCByZXNvbHZlIHR5cGUgYXJndW1lbnRzCisJCQkJCWRlZmF1bHQgOgorCQkJCQkJYm9vbGVhbiBpc0NsYXNzU2NvcGUgPSBzY29wZS5raW5kID09IFNjb3BlLkNMQVNTX1NDT1BFOworCQkJCQlpbnQgYXJnTGVuZ3RoID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdMZW5ndGg7IGkrKykgeworCQkJCQkJVHlwZVJlZmVyZW5jZSB0eXBlQXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07CisJCQkJCQlpZiAoaXNDbGFzc1Njb3BlKSB7CisJCQkJCQkJdHlwZUFyZ3VtZW50LnJlc29sdmVUeXBlKChDbGFzc1Njb3BlKSBzY29wZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXR5cGVBcmd1bWVudC5yZXNvbHZlVHlwZSgoQmxvY2tTY29wZSkgc2NvcGUsIGNoZWNrQm91bmRzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJLy8gYmUgcmVzaWxpZW50LCBzdGlsbCBhdHRlbXB0IHJlc29sdmluZyBhcmd1bWVudHMKKwkJCX0KKwkJCWVuY2xvc2luZ1R5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCk7IC8vIGlmIG1lbWJlciB0eXBlCisJCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CiAJCQkJZW5jbG9zaW5nVHlwZSA9IGN1cnJlbnRUeXBlLmlzU3RhdGljKCkKLQkJCQkJPyAoUmVmZXJlbmNlQmluZGluZykgc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKGVuY2xvc2luZ1R5cGUpCisJCQkJCT8gKFJlZmVyZW5jZUJpbmRpbmcpIHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZShlbmNsb3NpbmdUeXBlLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKQogCQkJCQk6IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUGFyYW1ldGVyaXplZFR5cGUoZW5jbG9zaW5nVHlwZSk7CisJCQkJY3VycmVudFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBjdXJyZW50VHlwZS5lcmFzdXJlKCksIG51bGwgLyogbm8gYXJnICovLCBlbmNsb3NpbmdUeXBlKTsKIAkJCX0KIAkJfSBlbHNlIHsgLy8gcmVzb2x2aW5nIG1lbWJlciB0eXBlIChyZWxhdGl2ZWx5IHRvIGVuY2xvc2luZ1R5cGUpCi0JCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmdldE1lbWJlclR5cGUodG9rZW4sIGVuY2xvc2luZ1R5cGUpOworCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBjdXJyZW50VHlwZSA9IHNjb3BlLmdldE1lbWJlclR5cGUodGhpcy50b2tlbiwgZW5jbG9zaW5nVHlwZSk7CiAJCQlpZiAoIXRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRW5jbG9zaW5nVHlwZSh0aGlzLCB0aGlzLnJlc29sdmVkVHlwZSwgZW5jbG9zaW5nVHlwZSk7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEVuY2xvc2luZ1R5cGUodGhpcywgY3VycmVudFR5cGUsIGVuY2xvc2luZ1R5cGUpOwogCQkJCXJldHVybiBudWxsOwogCQkJfQotCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKSkKLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgdGhpcyk7CisJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChjdXJyZW50VHlwZSwgc2NvcGUpKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKGN1cnJlbnRUeXBlLCB0aGlzKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudEVuY2xvc2luZyA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCWlmIChjdXJyZW50RW5jbG9zaW5nICE9IG51bGwgJiYgY3VycmVudEVuY2xvc2luZy5lcmFzdXJlKCkgIT0gZW5jbG9zaW5nVHlwZS5lcmFzdXJlKCkpIHsKKwkJCQllbmNsb3NpbmdUeXBlID0gY3VycmVudEVuY2xvc2luZzsgLy8gaW5oZXJpdGVkIG1lbWJlciB0eXBlLCBsZWF2ZSBpdCBhc3NvY2lhdGVkIHdpdGggaXRzIGVuY2xvc2luZyByYXRoZXIgdGhhbiBzdWJ0eXBlCisJCQl9CiAJCX0KIAogCQkvLyBjaGVjayBnZW5lcmljIGFuZCBhcml0eQpAQCAtMTM1LDk3ICsxODEsMTI1IEBACiAJICAgIAlrZWVwID0gKChDbGFzc1Njb3BlKSBzY29wZSkuc3VwZXJUeXBlUmVmZXJlbmNlOwogCSAgICAJKChDbGFzc1Njb3BlKSBzY29wZSkuc3VwZXJUeXBlUmVmZXJlbmNlID0gbnVsbDsKIAkgICAgfQotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlOwogCQlpbnQgYXJnTGVuZ3RoID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsKIAkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1thcmdMZW5ndGhdOwogCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gZmFsc2U7CisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudE9yaWdpbmFsID0gKFJlZmVyZW5jZUJpbmRpbmcpY3VycmVudFR5cGUub3JpZ2luYWwoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdMZW5ndGg7IGkrKykgewogCQkgICAgVHlwZVJlZmVyZW5jZSB0eXBlQXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07CiAJCSAgICBUeXBlQmluZGluZyBhcmdUeXBlID0gaXNDbGFzc1Njb3BlCi0JCQkJPyB0eXBlQXJndW1lbnQucmVzb2x2ZVR5cGVBcmd1bWVudCgoQ2xhc3NTY29wZSkgc2NvcGUsIGN1cnJlbnRUeXBlLCBpKQotCQkJCTogdHlwZUFyZ3VtZW50LnJlc29sdmVUeXBlQXJndW1lbnQoKEJsb2NrU2NvcGUpIHNjb3BlLCBjdXJyZW50VHlwZSwgaSk7CisJCQkJPyB0eXBlQXJndW1lbnQucmVzb2x2ZVR5cGVBcmd1bWVudCgoQ2xhc3NTY29wZSkgc2NvcGUsIGN1cnJlbnRPcmlnaW5hbCwgaSkKKwkJCQk6IHR5cGVBcmd1bWVudC5yZXNvbHZlVHlwZUFyZ3VtZW50KChCbG9ja1Njb3BlKSBzY29wZSwgY3VycmVudE9yaWdpbmFsLCBpKTsKIAkJICAgICBpZiAoYXJnVHlwZSA9PSBudWxsKSB7CiAJCSAgICAgICAgIGFyZ0hhc0Vycm9yID0gdHJ1ZTsKIAkJICAgICB9IGVsc2UgewogCQkJICAgIGFyZ1R5cGVzW2ldID0gYXJnVHlwZTsKIAkJICAgICB9CiAJCX0KLQkJaWYgKGFyZ0hhc0Vycm9yKSByZXR1cm4gbnVsbDsKKwkJaWYgKGFyZ0hhc0Vycm9yKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQogCQlpZiAoaXNDbGFzc1Njb3BlKSB7CiAJICAgIAkoKENsYXNzU2NvcGUpIHNjb3BlKS5zdXBlclR5cGVSZWZlcmVuY2UgPSBrZWVwOwotCQkJaWYgKCgoQ2xhc3NTY29wZSkgc2NvcGUpLmRldGVjdEhpZXJhcmNoeUN5Y2xlKGN1cnJlbnRUeXBlLCB0aGlzKSkKKwkJCWlmICgoKENsYXNzU2NvcGUpIHNjb3BlKS5kZXRlY3RIaWVyYXJjaHlDeWNsZShjdXJyZW50T3JpZ2luYWwsIHRoaXMpKQogCQkJCXJldHVybiBudWxsOwogCQl9CiAKLQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSBjdXJyZW50VHlwZS50eXBlVmFyaWFibGVzKCk7Ci0JCWlmICh0eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsgLy8gY2hlY2sgZ2VuZXJpYwotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQodGhpcywgY3VycmVudFR5cGUsIGFyZ1R5cGVzKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGFyZ0xlbmd0aCAhPSB0eXBlVmFyaWFibGVzLmxlbmd0aCkgeyAvLyBjaGVjayBhcml0eQotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZSh0aGlzLCBjdXJyZW50VHlwZSwgYXJnVHlwZXMpOwotCQkJcmV0dXJuIG51bGw7CisJCWZpbmFsIGJvb2xlYW4gaXNEaWFtb25kID0gKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNEaWFtb25kKSAhPSAwOworCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IGN1cnJlbnRPcmlnaW5hbC50eXBlVmFyaWFibGVzKCk7CisJCWlmICh0eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsgLy8gbm9uIGdlbmVyaWMgaW52b2tlZCB3aXRoIGFyZ3VtZW50cworCQkJYm9vbGVhbiBpc0NvbXBsaWFudDE1ID0gc2NvcGUuY29tcGlsZXJPcHRpb25zKCkub3JpZ2luYWxTb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQkJaWYgKChjdXJyZW50T3JpZ2luYWwudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApIHsKKwkJCQlpZiAoaXNDb21wbGlhbnQxNSkgeyAvLyBiZWxvdyAxLjUsIGFscmVhZHkgcmVwb3J0ZWQgYXMgc3ludGF4IGVycm9yCisJCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gY3VycmVudFR5cGU7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vbkdlbmVyaWNUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkKDAsIHRoaXMsIGN1cnJlbnRUeXBlLCBhcmdUeXBlcyk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJCS8vIHJlc2lsaWVuY2UgZG8gbm90IHJlYnVpbGQgYSBwYXJhbWV0ZXJpemVkIHR5cGUgdW5sZXNzIGNvbXBsaWFuY2UgaXMgYWxsb3dpbmcgaXQKKwkJCWlmICghaXNDb21wbGlhbnQxNSkgeworCQkJCWlmICghdGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQkJcmV0dXJuIGN1cnJlbnRUeXBlOworCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGN1cnJlbnRUeXBlOworCQkJfQorCQkJLy8gaWYgbWlzc2luZyBnZW5lcmljIHR5cGUsIGFuZCBjb21wbGlhbmNlID49IDEuNSwgdGhlbiB3aWxsIHJlYnVpbGQgYSBwYXJhbWV0ZXJpemVkIGJpbmRpbmcKKwkJfSBlbHNlIGlmIChhcmdMZW5ndGggIT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsKKwkJCWlmICghaXNEaWFtb25kKSB7IC8vIGNoZWNrIGFyaXR5LCBJc0RpYW1vbmQgbmV2ZXIgc2V0IGZvciAxLjYtCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZSh0aGlzLCBjdXJyZW50VHlwZSwgYXJnVHlwZXMpOworCQkJCXJldHVybiBudWxsOworCQkJfSAKIAkJfSBlbHNlIGlmICghY3VycmVudFR5cGUuaXNTdGF0aWMoKSkgewogCQkJUmVmZXJlbmNlQmluZGluZyBhY3R1YWxFbmNsb3NpbmcgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCk7CiAJCQlpZiAoYWN0dWFsRW5jbG9zaW5nICE9IG51bGwgJiYgYWN0dWFsRW5jbG9zaW5nLmlzUmF3VHlwZSgpKXsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yYXdNZW1iZXJUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkKAotCQkJCQkJdGhpcywgc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKChSZWZlcmVuY2VCaW5kaW5nKWN1cnJlbnRUeXBlLmVyYXN1cmUoKSwgYWN0dWFsRW5jbG9zaW5nKSwgYXJnVHlwZXMpOworCQkJCQkJdGhpcywgc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKGN1cnJlbnRPcmlnaW5hbCwgYWN0dWFsRW5jbG9zaW5nKSwgYXJnVHlwZXMpOwogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9CiAKLSAgICAJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtZXRlcml6ZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgoUmVmZXJlbmNlQmluZGluZyljdXJyZW50VHlwZS5lcmFzdXJlKCksIGFyZ1R5cGVzLCBlbmNsb3NpbmdUeXBlKTsKLQkJLy8gY2hlY2sgYXJndW1lbnQgdHlwZSBjb21wYXRpYmlsaXR5Ci0JCWlmIChjaGVja0JvdW5kcykgLy8gb3RoZXJ3aXNlIHdpbGwgZG8gaXQgaW4gU2NvcGUuY29ubmVjdFR5cGVWYXJpYWJsZXMoKSBvciBnZW5lcmljIG1ldGhvZCByZXNvbHV0aW9uCi0JCQlwYXJhbWV0ZXJpemVkVHlwZS5ib3VuZENoZWNrKHNjb3BlLCB0aGlzLnR5cGVBcmd1bWVudHMpOworICAgIAlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKGN1cnJlbnRPcmlnaW5hbCwgYXJnVHlwZXMsIGVuY2xvc2luZ1R5cGUpOworCQkvLyBjaGVjayBhcmd1bWVudCB0eXBlIGNvbXBhdGliaWxpdHkgZm9yIG5vbiA8PiBjYXNlcyAtIDw+IGNhc2UgbmVlZHMgbm8gYm91bmRzIGNoZWNrLCB3ZSB3aWxsIHNjcmVhbSBmb3VsIGlmIG5lZWRlZCBkdXJpbmcgaW5mZXJlbmNlLgorICAgIAlpZiAoIWlzRGlhbW9uZCkgeworICAgIAkJaWYgKGNoZWNrQm91bmRzKSAvLyBvdGhlcndpc2Ugd2lsbCBkbyBpdCBpbiBTY29wZS5jb25uZWN0VHlwZVZhcmlhYmxlcygpIG9yIGdlbmVyaWMgbWV0aG9kIHJlc29sdXRpb24KKyAgICAJCQlwYXJhbWV0ZXJpemVkVHlwZS5ib3VuZENoZWNrKHNjb3BlLCB0aGlzLnR5cGVBcmd1bWVudHMpOworICAgIAkJZWxzZQorICAgIAkJCXNjb3BlLmRlZmVyQm91bmRDaGVjayh0aGlzKTsKKyAgICAJfQorCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChwYXJhbWV0ZXJpemVkVHlwZSwgc2NvcGUpKQorCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUocGFyYW1ldGVyaXplZFR5cGUsIHNjb3BlKTsKIAotCQl0aGlzLnJlc29sdmVkVHlwZSA9IHBhcmFtZXRlcml6ZWRUeXBlOwotCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpKQotCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKTsKLQotCQkvLyBhcnJheSB0eXBlID8KKwkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gcGFyYW1ldGVyaXplZFR5cGU7CisJCX0KKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gcGFyYW1ldGVyaXplZFR5cGU7CisJfQorCXByaXZhdGUgVHlwZUJpbmRpbmcgY3JlYXRlQXJyYXlUeXBlKFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyB0eXBlKSB7CiAJCWlmICh0aGlzLmRpbWVuc2lvbnMgPiAwKSB7Ci0JCQlpZiAoZGltZW5zaW9ucyA+IDI1NSkKKwkJCWlmICh0aGlzLmRpbWVuc2lvbnMgPiAyNTUpCiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueURpbWVuc2lvbnModGhpcyk7Ci0JCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmNyZWF0ZUFycmF5VHlwZSh0aGlzLnJlc29sdmVkVHlwZSwgZGltZW5zaW9ucyk7CisJCQlyZXR1cm4gc2NvcGUuY3JlYXRlQXJyYXlUeXBlKHR5cGUsIHRoaXMuZGltZW5zaW9ucyk7CiAJCX0KLQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwotCX0JCi0JCisJCXJldHVybiB0eXBlOworCX0KKwogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewotCQlvdXRwdXQuYXBwZW5kKHRva2VuKTsKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnRva2VuKTsKIAkJb3V0cHV0LmFwcGVuZCgiPCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBtYXggPSB0eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJdHlwZUFyZ3VtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpOwotCQkJb3V0cHV0LmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCisJCWludCBsZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOworCQlpZiAobGVuZ3RoID4gMCkgeworCQkJaW50IG1heCA9IGxlbmd0aCAtIDE7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCQl0aGlzLnR5cGVBcmd1bWVudHNbaV0ucHJpbnQoMCwgb3V0cHV0KTsKKwkJCQlvdXRwdXQuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXRoaXMudHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCX0KLQkJdHlwZUFyZ3VtZW50c1ttYXhdLnByaW50KDAsIG91dHB1dCk7CiAJCW91dHB1dC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAoKHRoaXMuYml0cyAmIElzVmFyQXJncykgIT0gMCkgewotCQkJZm9yIChpbnQgaT0gMCA7IGkgPCBkaW1lbnNpb25zIC0gMTsgaSsrKSB7CisJCQlmb3IgKGludCBpPSAwIDsgaSA8IHRoaXMuZGltZW5zaW9ucyAtIDE7IGkrKykgewogCQkJCW91dHB1dC5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCW91dHB1dC5hcHBlbmQoIi4uLiIpOyAvLyROT04tTkxTLTEkCiAJCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpPSAwIDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgeworCQkJZm9yIChpbnQgaT0gMCA7IGkgPCB0aGlzLmRpbWVuc2lvbnM7IGkrKykgewogCQkJCW91dHB1dC5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfQogCQlyZXR1cm4gb3V0cHV0OwogCX0KLQkKKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7CiAJICAgIHJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKHNjb3BlLCBudWxsLCBjaGVja0JvdW5kcyk7Ci0JfQkKKwl9CiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBzY29wZSkgewogCSAgICByZXR1cm4gaW50ZXJuYWxSZXNvbHZlVHlwZShzY29wZSwgbnVsbCwgZmFsc2UgLypubyBib3VuZHMgY2hlY2sgaW4gY2xhc3NTY29wZSovKTsKLQl9CQotCQorCX0KKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZUVuY2xvc2luZyhCbG9ja1Njb3BlIHNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKIAkgICAgcmV0dXJuIGludGVybmFsUmVzb2x2ZVR5cGUoc2NvcGUsIGVuY2xvc2luZ1R5cGUsIHRydWUvKmNoZWNrIGJvdW5kcyovKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CkBAIC0yMzQsNyArMzA4LDcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKaW5kZXggODdiODUyZC4uM2JkODE4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUG9zdGZpeEV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw5IEBACiAJdGhpcy5zb3VyY2VTdGFydCA9IGxocy5zb3VyY2VTdGFydDsKIAl0aGlzLnNvdXJjZUVuZCA9IHBvczsKIH0KLQorcHVibGljIGJvb2xlYW4gY2hlY2tDYXN0Q29tcGF0aWJpbGl0eSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CiAvKioKICAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgUG9zdGZpeEV4cHJlc3Npb24KICAqCkBAIC0zMCw4ICszMiw4IEBACiAgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCiAgKi8KIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkvLyB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsIAotCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IgCisJLy8gdmFyaW91cyBzY2VuYXJpaSBhcmUgcG9zc2libGUsIHNldHRpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLAorCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IKIAkvLyBqdXN0IGEgbG9jYWwgdmFyaWFibGUuCiAKIAlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwpAQCAtNDgsMTMgKzUwLDEzIEBACiAJCQlyZXR1cm4gIisrIjsgLy8kTk9OLU5MUy0xJAogCQljYXNlIE1JTlVTIDoKIAkJCXJldHVybiAiLS0iOyAvLyROT04tTkxTLTEkCi0JfSAKKwl9CiAJcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAogfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCXJldHVybiB0aGlzLmxocy5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgnICcpLmFwcGVuZChvcGVyYXRvclRvU3RyaW5nKCkpOyAKLX0gCisJcmV0dXJuIHRoaXMubGhzLnByaW50RXhwcmVzc2lvbihpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yVG9TdHJpbmcoKSk7Cit9CiAKIHB1YmxpYyBib29sZWFuIHJlc3RyYWluVXNhZ2VUb051bWVyaWNUeXBlcygpIHsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUHJlZml4RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKaW5kZXggYjNhNWE4Yy4uMTllY2YxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsMjIgKzI2LDI0IEBACiAJdGhpcy5zb3VyY2VTdGFydCA9IHBvczsKIAl0aGlzLnNvdXJjZUVuZCA9IGxocy5zb3VyY2VFbmQ7CiB9Ci0KK3B1YmxpYyBib29sZWFuIGNoZWNrQ2FzdENvbXBhdGliaWxpdHkoKSB7CisJcmV0dXJuIGZhbHNlOworfQogcHVibGljIFN0cmluZyBvcGVyYXRvclRvU3RyaW5nKCkgewogCXN3aXRjaCAodGhpcy5vcGVyYXRvcikgewogCQljYXNlIFBMVVMgOgogCQkJcmV0dXJuICIrKyI7IC8vJE5PTi1OTFMtMSQKIAkJY2FzZSBNSU5VUyA6CiAJCQlyZXR1cm4gIi0tIjsgLy8kTk9OLU5MUy0xJAotCX0gCisJfQogCXJldHVybiAidW5rbm93biBvcGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKIH0KIAogcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCW91dHB1dC5hcHBlbmQob3BlcmF0b3JUb1N0cmluZygpKS5hcHBlbmQoJyAnKTsKLQlyZXR1cm4gdGhpcy5saHMucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7IAotfSAKKwlyZXR1cm4gdGhpcy5saHMucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7Cit9CiAKIHB1YmxpYyBib29sZWFuIHJlc3RyYWluVXNhZ2VUb051bWVyaWNUeXBlcygpIHsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCAxNzU5YmFlLi42ODE4ZTFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDE4ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzE5MjAxIC0gW251bGxdIG5vIHdhcm5pbmcgd2hlbiB1bmJveGluZyBTaW5nbGVOYW1lUmVmZXJlbmNlIGNhdXNlcyBOUEUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLk9wY29kZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CkBAIC0yMSw2ICsyMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CkBAIC0zOCwxMiArNDEsMTEgQEAKICAqIC0gZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCiAgKi8KIHB1YmxpYyBjbGFzcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEFsbG9jYXRpb25FeHByZXNzaW9uIHsKLQkKKwogCS8vcXVhbGlmaWNhdGlvbiBtYXkgYmUgb24gYm90aCBzaWRlCiAJcHVibGljIEV4cHJlc3Npb24gZW5jbG9zaW5nSW5zdGFuY2U7CiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlOwotCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZUJpbmRpbmc7Ci0JCisKIAlwdWJsaWMgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oKSB7CiAJCS8vIGZvciBzdWJ0eXBlcwogCX0KQEAgLTUzLDI3ICs1NSwyNyBAQAogCQlhbm9ueW1vdXNUeXBlLmFsbG9jYXRpb24gPSB0aGlzOwogCX0KIAotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJLy8gYW5hbHlzZSB0aGUgZW5jbG9zaW5nIGluc3RhbmNlCiAJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKIAkJCWZsb3dJbmZvID0gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCX0KLQkJCisKIAkJLy8gY2hlY2sgY2FwdHVyZWQgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBpbiBjdXJyZW50IGNvbnRleHQgKDI2MTM0KQotCQlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSB0aGlzLnN1cGVyVHlwZUJpbmRpbmcgPT0gbnVsbCA/IHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA6IHRoaXMuc3VwZXJUeXBlQmluZGluZzsKIAkJY2hlY2tDYXB0dXJlZExvY2FsSW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSgKLQkJCShSZWZlcmVuY2VCaW5kaW5nKSBhbGxvY2F0ZWRUeXBlLmVyYXN1cmUoKSwKLQkJCWN1cnJlbnRTY29wZSwgCisJCQkoUmVmZXJlbmNlQmluZGluZykodGhpcy5hbm9ueW1vdXNUeXBlID09IG51bGwKKwkJCQk/IHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkKKwkJCQk6IHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zdXBlcmNsYXNzKCkuZXJhc3VyZSgpKSwKKwkJCWN1cnJlbnRTY29wZSwKIAkJCWZsb3dJbmZvKTsKLQkJCisKIAkJLy8gcHJvY2VzcyBhcmd1bWVudHMKIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQlmbG93SW5mbyA9IHRoaXMuYXJndW1lbnRzW2ldLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQlpZiAoKHRoaXMuYXJndW1lbnRzW2ldLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsKKwkJCQkJdGhpcy5hcmd1bWVudHNbaV0uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJCX0KIAkJCX0KIAkJfQogCkBAIC04NSw2ICs4NywxMCBAQAogCQkvLyByZWNvcmQgc29tZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvciBleGNlcHRpb24gdHlwZXMKIAkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnM7CiAJCWlmICgoKHRocm93bkV4Y2VwdGlvbnMgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoKSAhPSAwKSB7CisJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuVW5jaGVja2VkKSAhPSAwICYmIHRoaXMuZ2VuZXJpY1R5cGVBcmd1bWVudHMgPT0gbnVsbCkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMsIGFsaWduIHdpdGggamF2YWMgb24gSkxTIDE1LjEyLjIuNgorCQkJCXRocm93bkV4Y2VwdGlvbnMgPSBjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlcyh0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywgdHJ1ZSwgdHJ1ZSk7CisJCQl9CQkJCiAJCQkvLyBjaGVjayBleGNlcHRpb24gaGFuZGxpbmcKIAkJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCiAJCQkJdGhyb3duRXhjZXB0aW9ucywKQEAgLTEwMiwxMyArMTA4LDEyIEBACiAJCXJldHVybiB0aGlzLmVuY2xvc2luZ0luc3RhbmNlOwogCX0KIAotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCWlmICghdmFsdWVSZXF1aXJlZCkKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRPYmplY3RBbGxvY2F0aW9uKHRoaXMpOwogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlNZXRob2RCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IGNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwogCQljb2RlU3RyZWFtLm5ld18oYWxsb2NhdGVkVHlwZSk7CiAJCWJvb2xlYW4gaXNVbmJveGluZyA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7CiAJCWlmICh2YWx1ZVJlcXVpcmVkIHx8IGlzVW5ib3hpbmcpIHsKQEAgLTEzOSwyNSArMTQ0LDI1IEBACiAJCQkJYWxsb2NhdGVkVHlwZSwKIAkJCQl0aGlzKTsKIAkJfQotCQkKKwogCQkvLyBpbnZva2UgY29uc3RydWN0b3IKIAkJaWYgKHRoaXMuc3ludGhldGljQWNjZXNzb3IgPT0gbnVsbCkgewotCQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwgY29kZWdlbkJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0gZWxzZSB7CiAJCQkvLyBzeW50aGV0aWMgYWNjZXNzb3IgZ290IHNvbWUgZXh0cmEgYXJndW1lbnRzIGFwcGVuZGVkIHRvIGl0cyBzaWduYXR1cmUsIHdoaWNoIG5lZWQgdmFsdWVzCiAJCQlmb3IgKGludCBpID0gMCwKLQkJCQltYXggPSB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yLnBhcmFtZXRlcnMubGVuZ3RoIC0gdGhpcy5jb2RlZ2VuQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQltYXggPSB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yLnBhcmFtZXRlcnMubGVuZ3RoIC0gY29kZWdlbkJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CiAJCQkJaSA8IG1heDsKIAkJCQlpKyspIHsKIAkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQl9Ci0JCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwodGhpcy5zeW50aGV0aWNBY2Nlc3Nvcik7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQl9CiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfSBlbHNlIGlmIChpc1VuYm94aW5nKSB7CiAJCQkvLyBjb252ZXJzaW9uIG9ubHkgZ2VuZXJhdGVkIGlmIHVuYm94aW5nCi0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCXN3aXRjaCAocG9zdENvbnZlcnNpb25UeXBlKGN1cnJlbnRTY29wZSkuaWQpIHsKIAkJCQljYXNlIFRfbG9uZyA6CiAJCQkJY2FzZSBUX2RvdWJsZSA6CkBAIC0xNzMsMTQgKzE3OCwxNCBAQAogCQkJdGhpcy5hbm9ueW1vdXNUeXBlLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQl9CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsKIAogCQkvLyBuZWNlc3NhcnkgdG8gbG9va3VwIHN1cGVyIGNvbnN0cnVjdG9yIG9mIGFub255bW91cyB0eXBlCiAJCXJldHVybiB0aGlzLmFub255bW91c1R5cGUgIT0gbnVsbDsKIAl9Ci0JCi0JLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5IAorCisJLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5CiAJICogbGluayBvbmx5LCBvciBwZXJmb3JtaW5nIG9uZSBsZXZlbCBvZiBwcm9wYWdhdGlvbi4KIAkgKgogCSAqIERlcGVuZGVuY3kgbWVjaGFuaXNtIGlzIHVzZWQgd2hlbmV2ZXIgZGVhbGluZyB3aXRoIHNvdXJjZSB0YXJnZXQKQEAgLTE4OCw4ICsxOTMsNyBAQAogCSAqIGV4YWN0IG5lZWQuCiAJICovCiAJcHVibGljIHZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQotCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkJeworCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKQl7CiAJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZUVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKIAogCQkvLyBwZXJmb3JtIHNvbWUgZXh0cmEgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CkBAIC0yMDcsMTggKzIxMSwxNiBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQogCQlpZiAodGhpcy5lbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKQotCQkJdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoJy4nKTsgCisJCQl0aGlzLmVuY2xvc2luZ0luc3RhbmNlLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnLicpOwogCQlzdXBlci5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKIAkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CiAJCQl0aGlzLmFub255bW91c1R5cGUucHJpbnQoaW5kZW50LCBvdXRwdXQpOwogCQl9CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQotCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCQkvLyBhZGRlZCBmb3IgY29kZSBhc3Npc3QuLi5jYW5ub3Qgb2NjdXIgd2l0aCAnbm9ybWFsJyBjb2RlCiAJCWlmICh0aGlzLmFub255bW91c1R5cGUgPT0gbnVsbCAmJiB0aGlzLmVuY2xvc2luZ0luc3RhbmNlID09IG51bGwpIHsKIAkJCXJldHVybiBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CkBAIC0yMjcsMTQgKzIyOSwxNSBAQAogCQkvLyBQcm9wYWdhdGUgdGhlIHR5cGUgY2hlY2tpbmcgdG8gdGhlIGFyZ3VtZW50cywgYW5kIGNoZWNrcyBpZiB0aGUgY29uc3RydWN0b3IgaXMgZGVmaW5lZC4KIAkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKIAkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gTmFtZSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKLQkJCisKIAkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJVHlwZUJpbmRpbmcgZW5jbG9zaW5nSW5zdGFuY2VUeXBlID0gbnVsbDsKKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSA9IG51bGw7CiAJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IG51bGw7CiAJCWJvb2xlYW4gaGFzRXJyb3IgPSBmYWxzZTsKIAkJYm9vbGVhbiBlbmNsb3NpbmdJbnN0YW5jZUNvbnRhaW5zQ2FzdCA9IGZhbHNlOwogCQlib29sZWFuIGFyZ3NDb250YWluQ2FzdCA9IGZhbHNlOwotCQkKKwogCQlpZiAodGhpcy5lbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7CiAJCQlpZiAodGhpcy5lbmNsb3NpbmdJbnN0YW5jZSBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB7CiAJCQkJdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5iaXRzIHw9IEFTVE5vZGUuRGlzYWJsZVVubmVjZXNzYXJ5Q2FzdENoZWNrOyAvLyB3aWxsIGNoZWNrIGxhdGVyIG9uCkBAIC0yNTAsNiArMjUzLDE0IEBACiAJCQl9IGVsc2UgaWYgKHRoaXMudHlwZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVXNhZ2VPZlF1YWxpZmllZFR5cGVSZWZlcmVuY2UoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpdGhpcy50eXBlKTsKIAkJCQloYXNFcnJvciA9IHRydWU7CisJCQl9IGVsc2UgaWYgKCEoZW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UgPSAoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VUeXBlKS5jYW5CZVNlZW5CeShzY29wZSkpIHsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MjEyCisJCQkJZW5jbG9zaW5nSW5zdGFuY2VUeXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJCWVuY2xvc2luZ0luc3RhbmNlUmVmZXJlbmNlLmNvbXBvdW5kTmFtZSwKKwkJCQkJCQllbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSwKKwkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLmVuY2xvc2luZ0luc3RhbmNlLCBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpOworCQkJCWhhc0Vycm9yID0gdHJ1ZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmVjZWl2ZXJUeXBlID0gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0aGlzLnR5cGUpLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCAoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VUeXBlKTsKIAkJCQlpZiAocmVjZWl2ZXJUeXBlICE9IG51bGwgJiYgZW5jbG9zaW5nSW5zdGFuY2VDb250YWluc0Nhc3QpIHsKQEAgLTI2Myw3ICsyNzQsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlyZWNlaXZlclR5cGUgPSB0aGlzLnR5cGUucmVzb2x2ZVR5cGUoc2NvcGUsIHRydWUgLyogY2hlY2sgYm91bmRzKi8pOwogCQkJCWNoZWNrUGFyYW1ldGVyaXplZEFsbG9jYXRpb246IHsKLQkJCQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKSBicmVhayBjaGVja1BhcmFtZXRlcml6ZWRBbGxvY2F0aW9uOworCQkJCQlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwgfHwgIXJlY2VpdmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSBicmVhayBjaGVja1BhcmFtZXRlcml6ZWRBbGxvY2F0aW9uOwogCQkJCQlpZiAodGhpcy50eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsgLy8gZGlzYWxsb3cgbmV3IFg8U3RyaW5nPi5ZPEludGVnZXI+KCkKIAkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGU7CiAJCQkJCQlkbyB7CkBAIC0yNzksMzkgKzI5MCw0MiBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQotCQkJCX0JCQkJCi0JCQl9CQkJCi0JCX0KLQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKSB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUpLmlzRmluYWwoKSkgewotCQkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFyZWNlaXZlclR5cGUuaXNFbnVtKCkpIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKHRoaXMudHlwZSwgcmVjZWl2ZXJUeXBlKTsKLQkJCQkJaGFzRXJyb3IgPSB0cnVlOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXJlY2VpdmVyVHlwZS5jYW5CZUluc3RhbnRpYXRlZCgpKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodGhpcy50eXBlLCByZWNlaXZlclR5cGUpOwotCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlY2VpdmVyVHlwZTsKIAkJCX0KIAkJfQorCQlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwgfHwgIXJlY2VpdmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQloYXNFcnJvciA9IHRydWU7CisJCX0KKwogCQkvLyByZXNvbHZlIHR5cGUgYXJndW1lbnRzIChmb3IgZ2VuZXJpYyBjb25zdHJ1Y3RvciBjYWxsKQorCQlmaW5hbCBib29sZWFuIGlzRGlhbW9uZCA9IHRoaXMudHlwZSAhPSBudWxsICYmICh0aGlzLnR5cGUuYml0cyAmIEFTVE5vZGUuSXNEaWFtb25kKSAhPSAwOwogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOworCQkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKIAkJCXRoaXMuZ2VuZXJpY1R5cGVBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07CQkJCQotCQkJCVR5cGVCaW5kaW5nIGFyZ1R5cGUgPSB0eXBlUmVmZXJlbmNlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKLQkJCQlpZiAoYXJnVHlwZSA9PSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgV2lsZGNhcmQpIHsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxVc2FnZU9mV2lsZGNhcmQodHlwZVJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yIGFscmVhZHkgcmVwb3J0ZWQKKwkJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07CisJCQkJaWYgKCh0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzW2ldID0gdHlwZVJlZmVyZW5jZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLykpID09IG51bGwpIHsKKwkJCQkJYXJnSGFzRXJyb3IgPSB0cnVlOwogCQkJCX0KLQkJCQl0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzW2ldID0gYXJnVHlwZTsKKwkJCQlpZiAoYXJnSGFzRXJyb3IgJiYgdHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxVc2FnZU9mV2lsZGNhcmQodHlwZVJlZmVyZW5jZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGlzRGlhbW9uZCkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRpYW1vbmROb3RXaXRoRXhwbGljaXRUeXBlQXJndW1lbnRzKHRoaXMudHlwZUFyZ3VtZW50cyk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZiAoYXJnSGFzRXJyb3IpIHsKKwkJCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeyAvLyBzdGlsbCBhdHRlbXB0IHRvIHJlc29sdmUgYXJndW1lbnRzCisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkJdGhpcy5hcmd1bWVudHNbaV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKIAkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzID0gQmluZGluZy5OT19QQVJBTUVURVJTOwogCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtMzI4LDMzICszNDIsNDkgQEAKIAkJCQl9CiAJCQl9CiAJCX0KKwogCQkvLyBsaW1pdCBvZiBmYXVsdC10b2xlcmFuY2UKIAkJaWYgKGhhc0Vycm9yKSB7CisJCQkvKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1MzU5LCBpZiBhcmd1bWVudHMgaGF2ZSBlcnJvcnMsIGNvbXBsZXRlbHkgYmFpbCBvdXQgaW4gdGhlIDw+IGNhc2UuCisJCQkgICBObyBtZWFuaW5nZnVsIHR5cGUgcmVzb2x1dGlvbiBpcyBwb3NzaWJsZSBzaW5jZSBpbmZlcmVuY2Ugb2YgdGhlIGVsaWRlZCB0eXBlcyBpcyBmdWxseSB0aWVkIHRvIGFyZ3VtZW50IHR5cGVzLiBEbworCQkJICAgbm90IHJldHVybiB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHR5cGUuCisJCQkgKi8KKwkJCWlmIChpc0RpYW1vbmQpIHsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gbm90IHRoZSBwYXJ0aWFsbHkgY29va2VkIHRoaXMucmVzb2x2ZWRUeXBlCisJCQl9CiAJCQlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQkJCS8vIHJlY29yZCBhIGJlc3QgZ3Vlc3MsIGZvciBjbGllbnRzIHdobyBuZWVkIGhpbnQgYWJvdXQgcG9zc2libGUgY29udHJ1Y3RvciBtYXRjaAotCQkJCWludCBsZW5ndGggPSB0aGlzLmFyZ3VtZW50cyAgPT0gbnVsbCA/IDAgOiB0aGlzLmFyZ3VtZW50cy5sZW5ndGg7Ci0JCQkJVHlwZUJpbmRpbmdbXSBwc2V1ZG9BcmdzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7Ci0JCQkJCXBzZXVkb0FyZ3NbaV0gPSBhcmd1bWVudFR5cGVzW2ldID09IG51bGwgPyBUeXBlQmluZGluZy5OVUxMIDogYXJndW1lbnRUeXBlc1tpXTsgLy8gcmVwbGFjZSBhcmdzIHdpdGggZXJyb3JzIHdpdGggbnVsbCB0eXBlCi0JCQkJfQotCQkJCXRoaXMuYmluZGluZyA9IHNjb3BlLmZpbmRNZXRob2QoKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSwgVHlwZUNvbnN0YW50cy5JTklULCBwc2V1ZG9BcmdzLCB0aGlzKTsKLQkJCQlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgIXRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJCU1ldGhvZEJpbmRpbmcgY2xvc2VzdE1hdGNoID0gKChQcm9ibGVtTWV0aG9kQmluZGluZyl0aGlzLmJpbmRpbmcpLmNsb3Nlc3RNYXRjaDsKLQkJCQkJLy8gcmVjb3JkIHRoZSBjbG9zZXN0IG1hdGNoLCBmb3IgY2xpZW50cyB3aG8gbWF5IHN0aWxsIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBtZXRob2QgbWF0Y2gKLQkJCQkJaWYgKGNsb3Nlc3RNYXRjaCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2xvc2VzdE1hdGNoLm9yaWdpbmFsKCkudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7IC8vIGdlbmVyaWMgbWV0aG9kCi0JCQkJCQkJLy8gc2hvdWxkbid0IHJldHVybiBnZW5lcmljIG1ldGhvZCBvdXRzaWRlIGl0cyBjb250ZXh0LCByYXRoZXIgY29udmVydCBpdCB0byByYXcgbWV0aG9kICgxNzU0MDkpCi0JCQkJCQkJY2xvc2VzdE1hdGNoID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZChjbG9zZXN0TWF0Y2gub3JpZ2luYWwoKSwgKFJhd1R5cGVCaW5kaW5nKW51bGwpOwotCQkJCQkJfQotCQkJCQkJdGhpcy5iaW5kaW5nID0gY2xvc2VzdE1hdGNoOwotCQkJCQkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2hPcmlnaW5hbCA9IGNsb3Nlc3RNYXRjaC5vcmlnaW5hbCgpOwotCQkJCQkJaWYgKChjbG9zZXN0TWF0Y2hPcmlnaW5hbC5pc1ByaXZhdGUoKSB8fCBjbG9zZXN0TWF0Y2hPcmlnaW5hbC5kZWNsYXJpbmdDbGFzcy5pc0xvY2FsVHlwZSgpKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QoY2xvc2VzdE1hdGNoT3JpZ2luYWwpKSB7Ci0JCQkJCQkJLy8gaWdub3JlIGNhc2VzIHdoZXJlIG1ldGhvZCBpcyB1c2VkIGZyb20gd2l0aGluIGluc2lkZSBpdHNlbGYgKGUuZy4gZGlyZWN0IHJlY3Vyc2lvbnMpCi0JCQkJCQkJY2xvc2VzdE1hdGNoT3JpZ2luYWwubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CisJCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VSZWNlaXZlciA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CisJCQkJaWYgKHJlY2VpdmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCS8vIHJlY29yZCBhIGJlc3QgZ3Vlc3MsIGZvciBjbGllbnRzIHdobyBuZWVkIGhpbnQgYWJvdXQgcG9zc2libGUgY29udHJ1Y3RvciBtYXRjaAorCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy5hcmd1bWVudHMgID09IG51bGwgPyAwIDogdGhpcy5hcmd1bWVudHMubGVuZ3RoOworCQkJCQlUeXBlQmluZGluZ1tdIHBzZXVkb0FyZ3MgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7CisJCQkJCQlwc2V1ZG9BcmdzW2ldID0gYXJndW1lbnRUeXBlc1tpXSA9PSBudWxsID8gVHlwZUJpbmRpbmcuTlVMTCA6IGFyZ3VtZW50VHlwZXNbaV07IC8vIHJlcGxhY2UgYXJncyB3aXRoIGVycm9ycyB3aXRoIG51bGwgdHlwZQorCQkJCQl9CisJCQkJCXRoaXMuYmluZGluZyA9IHNjb3BlLmZpbmRNZXRob2QocmVmZXJlbmNlUmVjZWl2ZXIsIFR5cGVDb25zdGFudHMuSU5JVCwgcHNldWRvQXJncywgdGhpcyk7CisJCQkJCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCAmJiAhdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCU1ldGhvZEJpbmRpbmcgY2xvc2VzdE1hdGNoID0gKChQcm9ibGVtTWV0aG9kQmluZGluZyl0aGlzLmJpbmRpbmcpLmNsb3Nlc3RNYXRjaDsKKwkJCQkJCS8vIHJlY29yZCB0aGUgY2xvc2VzdCBtYXRjaCwgZm9yIGNsaWVudHMgd2hvIG1heSBzdGlsbCBuZWVkIGhpbnQgYWJvdXQgcG9zc2libGUgbWV0aG9kIG1hdGNoCisJCQkJCQlpZiAoY2xvc2VzdE1hdGNoICE9IG51bGwpIHsKKwkJCQkJCQlpZiAoY2xvc2VzdE1hdGNoLm9yaWdpbmFsKCkudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7IC8vIGdlbmVyaWMgbWV0aG9kCisJCQkJCQkJCS8vIHNob3VsZG4ndCByZXR1cm4gZ2VuZXJpYyBtZXRob2Qgb3V0c2lkZSBpdHMgY29udGV4dCwgcmF0aGVyIGNvbnZlcnQgaXQgdG8gcmF3IG1ldGhvZCAoMTc1NDA5KQorCQkJCQkJCQljbG9zZXN0TWF0Y2ggPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKGNsb3Nlc3RNYXRjaC5vcmlnaW5hbCgpLCAoUmF3VHlwZUJpbmRpbmcpbnVsbCk7CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuYmluZGluZyA9IGNsb3Nlc3RNYXRjaDsKKwkJCQkJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaE9yaWdpbmFsID0gY2xvc2VzdE1hdGNoLm9yaWdpbmFsKCk7CisJCQkJCQkJaWYgKGNsb3Nlc3RNYXRjaE9yaWdpbmFsLmlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QoY2xvc2VzdE1hdGNoT3JpZ2luYWwpKSB7CisJCQkJCQkJCS8vIGlnbm9yZSBjYXNlcyB3aGVyZSBtZXRob2QgaXMgdXNlZCBmcm9tIHdpdGhpbiBpbnNpZGUgaXRzZWxmIChlLmcuIGRpcmVjdCByZWN1cnNpb25zKQorCQkJCQkJCQljbG9zZXN0TWF0Y2hPcmlnaW5hbC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJCisJCQkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CisJCQkJCS8vIGluc2VydCBhbm9ueW1vdXMgdHlwZSBpbiBzY29wZSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTAwNzApCisJCQkJCXNjb3BlLmFkZEFub255bW91c1R5cGUodGhpcy5hbm9ueW1vdXNUeXBlLCByZWZlcmVuY2VSZWNlaXZlcik7CisJCQkJCXRoaXMuYW5vbnltb3VzVHlwZS5yZXNvbHZlKHNjb3BlKTsKKwkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5hbm9ueW1vdXNUeXBlLmJpbmRpbmc7CisJCQkJfQogCQkJfQogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gcmVjZWl2ZXJUeXBlOwogCQl9CkBAIC0zNjQsMjAgKzM5NCw0MiBAQAogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluc3RhbnRpYXRlKHRoaXMudHlwZSwgcmVjZWl2ZXJUeXBlKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSByZWNlaXZlclR5cGU7CiAJCQl9CisJCQlpZiAoaXNEaWFtb25kKSB7CisJCQkJVHlwZUJpbmRpbmcgW10gaW5mZXJyZWRUeXBlcyA9IGluZmVyRWxpZGVkVHlwZXMoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSkuZ2VuZXJpY1R5cGUoKSwgcmVjZWl2ZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgYXJndW1lbnRUeXBlcywgc2NvcGUpOworCQkJCWlmIChpbmZlcnJlZFR5cGVzID09IG51bGwpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5mZXJFbGlkZWRUeXBlcyh0aGlzKTsKKwkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gbnVsbDsKKwkJCQl9CisJCQkJcmVjZWl2ZXJUeXBlID0gdGhpcy50eXBlLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSkuZ2VuZXJpY1R5cGUoKSwgaW5mZXJyZWRUeXBlcywgKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSkuZW5jbG9zaW5nVHlwZSgpKTsKKwkJCX0KIAkJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGlvblR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOwogCQkJaWYgKCh0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihhbGxvY2F0aW9uVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZywgc2NvcGUsIHRydWUpKSB7CiAJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QodGhpcy5iaW5kaW5nLCB0aGlzKTsKIAkJCQl9Ci0JCQkJY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKHNjb3BlLCBudWxsLCBhbGxvY2F0aW9uVHlwZSwgdGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKTsKKwkJCQlpZiAoY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKHNjb3BlLCBudWxsLCBhbGxvY2F0aW9uVHlwZSwgdGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKSkgeworCQkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbmNoZWNrZWQ7CisJCQkJfQorCQkJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKS50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbih0aGlzLmJpbmRpbmcsIHRoaXMuZ2VuZXJpY1R5cGVBcmd1bWVudHMsIHRoaXMudHlwZUFyZ3VtZW50cyk7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsKIAkJCQkJdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGlvblR5cGU7CiAJCQkJfQorCQkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCAmJiAhdGhpcy50eXBlLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCS8vIHByb2JsZW0gYWxyZWFkeSBnb3Qgc2lnbmFsZWQgb24gdHlwZSByZWZlcmVuY2UsIGRvIG5vdCByZXBvcnQgc2Vjb25kYXJ5IHByb2JsZW0KKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcpOwogCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlY2VpdmVyVHlwZTsKIAkJCX0KLQorCQkJaWYgKCh0aGlzLmJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nVHlwZUluQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nKTsKKwkJCX0KKwkJCWlmICghaXNEaWFtb25kICYmIHJlY2VpdmVyVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlV2l0aEFjdHVhbEFyZ3VtZW50cygpKSB7CisJCSAJCWNoZWNrVHlwZUFyZ3VtZW50UmVkdW5kYW5jeSgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKXJlY2VpdmVyVHlwZSwgcmVjZWl2ZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgYXJndW1lbnRUeXBlcyAsIHNjb3BlKTsKKwkJIAl9CiAJCQkvLyBUaGUgZW5jbG9zaW5nIGluc3RhbmNlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIHR5cGUKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZXhwZWN0ZWRUeXBlID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKIAkJCWlmIChleHBlY3RlZFR5cGUgIT0gZW5jbG9zaW5nSW5zdGFuY2VUeXBlKSAvLyBtdXN0IGNhbGwgYmVmb3JlIGNvbXB1dGVDb252ZXJzaW9uKCkgYW5kIHR5cGVNaXNtYXRjaEVycm9yKCkKQEAgLTM4Niw2OCArNDM4LDgyIEBACiAJCQkJdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgZXhwZWN0ZWRUeXBlLCBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpOwogCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlY2VpdmVyVHlwZTsKIAkJCX0KLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgZXhwZWN0ZWRUeXBlLCB0aGlzLmVuY2xvc2luZ0luc3RhbmNlKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgZXhwZWN0ZWRUeXBlLCB0aGlzLmVuY2xvc2luZ0luc3RhbmNlLCBudWxsKTsKIAkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc0RpYW1vbmQpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kaWFtb25kTm90V2l0aEFub3ltb3VzQ2xhc3Nlcyh0aGlzLnR5cGUpOworCQkJCXJldHVybiBudWxsOworCQkJfQkKIAkJfQotCi0JCWlmIChyZWNlaXZlclR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCQkJcmVjZWl2ZXJUeXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHJlY2VpdmVyVHlwZS5zb3VyY2VOYW1lKCksIChSZWZlcmVuY2VCaW5kaW5nKXJlY2VpdmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuSWxsZWdhbFN1cGVyVHlwZVZhcmlhYmxlKTsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIHJlY2VpdmVyVHlwZSk7CisJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwkJaWYgKHN1cGVyVHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJCQlzdXBlclR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde3N1cGVyVHlwZS5zb3VyY2VOYW1lKCl9LCBzdXBlclR5cGUsIFByb2JsZW1SZWFzb25zLklsbGVnYWxTdXBlclR5cGVWYXJpYWJsZSk7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCBzdXBlclR5cGUpOwogCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAodGhpcy50eXBlICE9IG51bGwgJiYgcmVjZWl2ZXJUeXBlLmlzRW51bSgpKSB7IC8vIHRvbGVyYXRlIGVudW0gY29uc3RhbnQgYm9keQotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodGhpcy50eXBlLCByZWNlaXZlclR5cGUpOwotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gcmVjZWl2ZXJUeXBlOworCQl9IGVsc2UgaWYgKHRoaXMudHlwZSAhPSBudWxsICYmIHN1cGVyVHlwZS5pc0VudW0oKSkgeyAvLyB0b2xlcmF0ZSBlbnVtIGNvbnN0YW50IGJvZHkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluc3RhbnRpYXRlKHRoaXMudHlwZSwgc3VwZXJUeXBlKTsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHN1cGVyVHlwZTsKIAkJfQogCQkvLyBhbm9ueW1vdXMgdHlwZSBzY2VuYXJpbwogCQkvLyBhbiBhbm9ueW1vdXMgY2xhc3MgaW5oZXJpdHMgZnJvbSBqYXZhLmxhbmcuT2JqZWN0IHdoZW4gZGVjbGFyZWQgImFmdGVyIiBhbiBpbnRlcmZhY2UKLQkJdGhpcy5zdXBlclR5cGVCaW5kaW5nID0gcmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZyBhbm9ueW1vdXNTdXBlcmNsYXNzID0gc3VwZXJUeXBlLmlzSW50ZXJmYWNlKCkgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogc3VwZXJUeXBlOwogCQkvLyBpbnNlcnQgYW5vbnltb3VzIHR5cGUgaW4gc2NvcGUKLQkJc2NvcGUuYWRkQW5vbnltb3VzVHlwZSh0aGlzLmFub255bW91c1R5cGUsIChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUpOwotCQl0aGlzLmFub255bW91c1R5cGUucmVzb2x2ZShzY29wZSk7CQkKLQkJaWYgKHRoaXMuc3VwZXJUeXBlQmluZGluZy5lcmFzdXJlKCkuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nRW51bSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90RXh0ZW5kRW51bSh0aGlzLmFub255bW91c1R5cGUuYmluZGluZywgdGhpcy50eXBlLCB0aGlzLnN1cGVyVHlwZUJpbmRpbmcpOwotCQl9Ci0JCQotCQlpZiAoKHJlY2VpdmVyVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgIT0gMCkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJUeXBlQ2Fubm90VXNlV2lsZGNhcmQodGhpcy5hbm9ueW1vdXNUeXBlLmJpbmRpbmcsIHRoaXMudHlwZSwgcmVjZWl2ZXJUeXBlKTsKLQkJfQkJCisJCXNjb3BlLmFkZEFub255bW91c1R5cGUodGhpcy5hbm9ueW1vdXNUeXBlLCBzdXBlclR5cGUpOworCQl0aGlzLmFub255bW91c1R5cGUucmVzb2x2ZShzY29wZSk7CisKIAkJLy8gZmluZCBhbm9ueW1vdXMgc3VwZXIgY29uc3RydWN0b3IKLQkJTWV0aG9kQmluZGluZyBpbmhlcml0ZWRCaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IodGhpcy5zdXBlclR5cGVCaW5kaW5nLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKKwkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmFub255bW91c1R5cGUuYmluZGluZzsgLy8gMS4yIGNoYW5nZQorCQlpZiAoKHRoaXMucmVzb2x2ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zKSAhPSAwKSB7CisJCQlyZXR1cm4gbnVsbDsgLy8gc3RvcCBzZWNvbmRhcnkgZXJyb3JzCisJCX0KKwkJTWV0aG9kQmluZGluZyBpbmhlcml0ZWRCaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IoYW5vbnltb3VzU3VwZXJjbGFzcywgYXJndW1lbnRUeXBlcywgdGhpcyk7CiAJCWlmICghaW5oZXJpdGVkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQlpZiAoaW5oZXJpdGVkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7Ci0JCQkJaW5oZXJpdGVkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IHRoaXMuc3VwZXJUeXBlQmluZGluZzsKKwkJCQlpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYW5vbnltb3VzU3VwZXJjbGFzczsKKwkJCX0KKwkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCAmJiAhdGhpcy50eXBlLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJLy8gcHJvYmxlbSBhbHJlYWR5IGdvdCBzaWduYWxlZCBvbiB0eXBlIHJlZmVyZW5jZSwgZG8gbm90IHJlcG9ydCBzZWNvbmRhcnkgcHJvYmxlbQorCQkJCXJldHVybiBudWxsOwogCQkJfQogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGluaGVyaXRlZEJpbmRpbmcpOwotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5hbm9ueW1vdXNUeXBlLmJpbmRpbmc7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCX0KKwkJaWYgKChpbmhlcml0ZWRCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nVHlwZUluQ29uc3RydWN0b3IodGhpcywgaW5oZXJpdGVkQmluZGluZyk7CiAJCX0KIAkJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkgewogCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmcgPSBpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKIAkJCWlmICh0YXJnZXRFbmNsb3NpbmcgPT0gbnVsbCkgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5RW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UsIChSZWZlcmVuY2VCaW5kaW5nKXJlY2VpdmVyVHlwZSk7Ci0JCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5hbm9ueW1vdXNUeXBlLmJpbmRpbmc7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24odGhpcy5lbmNsb3NpbmdJbnN0YW5jZSwgc3VwZXJUeXBlKTsKKwkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJCQl9IGVsc2UgaWYgKCFlbmNsb3NpbmdJbnN0YW5jZVR5cGUuaXNDb21wYXRpYmxlV2l0aCh0YXJnZXRFbmNsb3NpbmcpICYmICFzY29wZS5pc0JveGluZ0NvbXBhdGlibGVXaXRoKGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgdGFyZ2V0RW5jbG9zaW5nKSkgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGVuY2xvc2luZ0luc3RhbmNlVHlwZSwgdGFyZ2V0RW5jbG9zaW5nLCB0aGlzLmVuY2xvc2luZ0luc3RhbmNlKTsKLQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmFub255bW91c1R5cGUuYmluZGluZzsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvcihlbmNsb3NpbmdJbnN0YW5jZVR5cGUsIHRhcmdldEVuY2xvc2luZywgdGhpcy5lbmNsb3NpbmdJbnN0YW5jZSwgbnVsbCk7CisJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJfQogCQkJdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgdGFyZ2V0RW5jbG9zaW5nLCBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpOwogCQl9Ci0JCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKQotCQkJY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKHNjb3BlLCBudWxsLCB0aGlzLnN1cGVyVHlwZUJpbmRpbmcsIGluaGVyaXRlZEJpbmRpbmcsIHRoaXMuYXJndW1lbnRzLCBhcmd1bWVudFR5cGVzLCBhcmdzQ29udGFpbkNhc3QsIHRoaXMpOwotCi0JCS8vIFVwZGF0ZSB0aGUgYW5vbnltb3VzIGlubmVyIGNsYXNzIDogc3VwZXJjbGFzcywgaW50ZXJmYWNlICAKLQkJdGhpcy5iaW5kaW5nID0gdGhpcy5hbm9ueW1vdXNUeXBlLmNyZWF0ZURlZmF1bHRDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKGluaGVyaXRlZEJpbmRpbmcpOwotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmFub255bW91c1R5cGUuYmluZGluZzsgLy8gMS4yIGNoYW5nZQorCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeworCQkJaWYgKGNoZWNrSW52b2NhdGlvbkFyZ3VtZW50cyhzY29wZSwgbnVsbCwgYW5vbnltb3VzU3VwZXJjbGFzcywgaW5oZXJpdGVkQmluZGluZywgdGhpcy5hcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMsIGFyZ3NDb250YWluQ2FzdCwgdGhpcykpIHsKKwkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbmNoZWNrZWQ7CisJCQl9CisJCX0KKwkJaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIGluaGVyaXRlZEJpbmRpbmcub3JpZ2luYWwoKS50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5VHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb24oaW5oZXJpdGVkQmluZGluZywgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cywgdGhpcy50eXBlQXJndW1lbnRzKTsKKwkJfQorCQkvLyBVcGRhdGUgdGhlIGFub255bW91cyBpbm5lciBjbGFzcyA6IHN1cGVyY2xhc3MsIGludGVyZmFjZQorCQl0aGlzLmJpbmRpbmcgPSB0aGlzLmFub255bW91c1R5cGUuY3JlYXRlRGVmYXVsdENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoaW5oZXJpdGVkQmluZGluZywgCSh0aGlzLmJpdHMgJiBBU1ROb2RlLlVuY2hlY2tlZCkgIT0gMCAmJiB0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzID09IG51bGwpOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQotCQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewogCisJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgewogCQkJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkKIAkJCQl0aGlzLmVuY2xvc2luZ0luc3RhbmNlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwLCB0eXBlQXJndW1lbnRzTGVuZ3RoID0gdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IHR5cGVBcmd1bWVudHNMZW5ndGg7IGkrKykgewogCQkJCQl0aGlzLnR5cGVBcmd1bWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJCX0JCQkJCQorCQkJCX0KIAkJCX0KIAkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgLy8gY2FzZSBvZiBlbnVtIGNvbnN0YW50CiAJCQkJdGhpcy50eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggZjdmZWM1Mi4uMWI0YTUzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMTg1NjgyIC0gSW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgbWFyayBsb2NhbCB2YXJpYWJsZXMgYXMgcmVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKQEAgLTE0LDYgKzE1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CkBAIC0yNSw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFZhcmlhYmxlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1pc3NpbmdUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwpAQCAtMzksMjUgKzQyLDI1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CiAKIHB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIGV4dGVuZHMgTmFtZVJlZmVyZW5jZSB7Ci0JCisKIAlwdWJsaWMgY2hhcltdW10gdG9rZW5zOwotCXB1YmxpYyBsb25nW10gc291cmNlUG9zaXRpb25zOwkKLQlwdWJsaWMgRmllbGRCaW5kaW5nW10gb3RoZXJCaW5kaW5ncywgb3RoZXJDb2RlZ2VuQmluZGluZ3M7CisJcHVibGljIGxvbmdbXSBzb3VyY2VQb3NpdGlvbnM7CisJcHVibGljIEZpZWxkQmluZGluZ1tdIG90aGVyQmluZGluZ3M7CiAJaW50W10gb3RoZXJEZXB0aHM7CiAJcHVibGljIGludCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmc7Ly9wb2ludHMgKGludG8gdG9rZW5zKSBmb3IgdGhlIGZpcnN0IHRva2VuIHRoYXQgY29ycmVzcG9uZHMgdG8gZmlyc3QgRmllbGRCaW5kaW5nCi0JU3ludGhldGljTWV0aG9kQmluZGluZyBzeW50aGV0aWNXcml0ZUFjY2Vzc29yOwotCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNSZWFkQWNjZXNzb3JzOworCXB1YmxpYyBTeW50aGV0aWNNZXRob2RCaW5kaW5nIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3I7CisJcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNSZWFkQWNjZXNzb3JzOwogCXB1YmxpYyBUeXBlQmluZGluZyBnZW5lcmljQ2FzdDsKIAlwdWJsaWMgVHlwZUJpbmRpbmdbXSBvdGhlckdlbmVyaWNDYXN0czsKLQkKLXB1YmxpYyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKAljaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCitwdWJsaWMgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCXRoaXMudG9rZW5zID0gdG9rZW5zOwogCXRoaXMuc291cmNlUG9zaXRpb25zID0gcG9zaXRpb25zOwogCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKIAl0aGlzLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKIH0KIAotcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCAJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gaXNDb21wb3VuZCkgeworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiBpc0NvbXBvdW5kKSB7CiAJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCiAJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7CiAJYm9vbGVhbiBuZWVkVmFsdWUgPSBvdGhlckJpbmRpbmdzQ291bnQgPT0gMCB8fCAhdGhpcy5vdGhlckJpbmRpbmdzWzBdLmlzU3RhdGljKCk7CkBAIC02NywzMyArNzAsMjAgQEAKIAkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCiAJCQlsYXN0RmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJaWYgKG5lZWRWYWx1ZSB8fCBjb21wbHlUbzE0KSB7Ci0JCQkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBsYXN0RmllbGRCaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgMCwgZmxvd0luZm8pOwotCQkJfQotCQkJaWYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpIHsgLy8gd2FzIGFuIGltcGxpY2l0IHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgZmllbGQgYmluZGluZwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBsYXN0RmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwotCQkJCS8vIGNoZWNrIGlmIGFjY2Vzc2luZyBlbnVtIHN0YXRpYyBmaWVsZCBpbiBpbml0aWFsaXplcgkJCQkJCi0JCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7Ci0JCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCk7Ci0JCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkKLQkJCQkJCQkmJiAoc291cmNlVHlwZSA9PSBkZWNsYXJpbmdDbGFzcyB8fCBzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPT0gZGVjbGFyaW5nQ2xhc3MpIC8vIGVudW0gY29uc3RhbnQgYm9keQotCQkJCQkJCSYmIGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKLQkJCQkJCQkmJiAhbWV0aG9kU2NvcGUuaXNTdGF0aWMKLQkJCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZW51bVN0YXRpY0ZpZWxkVXNlZER1cmluZ0luaXRpYWxpemF0aW9uKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOwotCQkJCQl9Ci0JCQkJfQkJCQkKKwkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGxhc3RGaWVsZEJpbmRpbmcsIDAsIGZsb3dJbmZvKTsKIAkJCX0KIAkJCS8vIGNoZWNrIGlmIGZpbmFsIGJsYW5rIGZpZWxkCiAJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc0JsYW5rRmluYWwoKQogCQkJCSAgICAmJiB0aGlzLm90aGVyQmluZGluZ3MgIT0gbnVsbCAvLyB0aGUgbGFzdCBmaWVsZCBiaW5kaW5nIGlzIG9ubHkgYXNzaWduZWQKIAkgCQkJCSYmIGN1cnJlbnRTY29wZS5uZWVkQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb25DaGVjayhsYXN0RmllbGRCaW5kaW5nKSkgewotCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobGFzdEZpZWxkQmluZGluZykpIHsKLQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoCi0JCQkJCQlsYXN0RmllbGRCaW5kaW5nLAotCQkJCQkJdGhpcyk7CisJCQkJRmxvd0luZm8gZmllbGRJbml0cyA9IGZsb3dDb250ZXh0LmdldEluaXRzRm9yRmluYWxCbGFua0luaXRpYWxpemF0aW9uQ2hlY2sobGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5vcmlnaW5hbCgpLCBmbG93SW5mbyk7CisJCQkJaWYgKCFmaWVsZEluaXRzLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxhc3RGaWVsZEJpbmRpbmcpKSB7CisJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOwogCQkJCX0KIAkJCX0KKwkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQmluZGluZy5MT0NBTCA6CiAJCQkvLyBmaXJzdCBiaW5kaW5nIGlzIGEgbG9jYWwgdmFyaWFibGUKQEAgLTEwNyw5ICs5NywxMSBAQAogCQkJfSBlbHNlIGlmIChsb2NhbEJpbmRpbmcudXNlRmxhZyA9PSBMb2NhbFZhcmlhYmxlQmluZGluZy5VTlVTRUQpIHsKIAkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRDsKIAkJCX0KLQkJCWNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0cnVlKTsKKwkJCWlmIChuZWVkVmFsdWUpIHsKKwkJCQljaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgdHJ1ZSk7CisJCQl9CiAJfQotCQorCiAJaWYgKG5lZWRWYWx1ZSkgewogCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwogCQkvLyBvbmx5IGZvciBmaXJzdCBiaW5kaW5nCkBAIC0xMjAsMTQgKzExMiw3IEBACiAJCQlsYXN0RmllbGRCaW5kaW5nID0gdGhpcy5vdGhlckJpbmRpbmdzW2ldOwogCQkJbmVlZFZhbHVlID0gIXRoaXMub3RoZXJCaW5kaW5nc1tpKzFdLmlzU3RhdGljKCk7CiAJCQlpZiAobmVlZFZhbHVlIHx8IGNvbXBseVRvMTQpIHsKLQkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeSgKLQkJCQkJY3VycmVudFNjb3BlLCAKLQkJCQkJbGFzdEZpZWxkQmluZGluZywgCi0JCQkJCWkgPT0gMCAKLQkJCQkJCT8gKChWYXJpYWJsZUJpbmRpbmcpdGhpcy5iaW5kaW5nKS50eXBlCi0JCQkJCQk6IHRoaXMub3RoZXJCaW5kaW5nc1tpLTFdLnR5cGUsCi0JCQkJCWkgKyAxLCAKLQkJCQkJZmxvd0luZm8pOworCQkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgaSArIDEsIGZsb3dJbmZvKTsKIAkJCX0KIAkJfQogCQlsYXN0RmllbGRCaW5kaW5nID0gdGhpcy5vdGhlckJpbmRpbmdzW290aGVyQmluZGluZ3NDb3VudC0xXTsKQEAgLTEzNiwzMCArMTIxLDE1IEBACiAJaWYgKGlzQ29tcG91bmQpIHsKIAkJaWYgKG90aGVyQmluZGluZ3NDb3VudCA9PSAwCiAJCQkJJiYgbGFzdEZpZWxkQmluZGluZy5pc0JsYW5rRmluYWwoKQotCQkJCSYmIGN1cnJlbnRTY29wZS5uZWVkQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb25DaGVjayhsYXN0RmllbGRCaW5kaW5nKQotCQkJCSYmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobGFzdEZpZWxkQmluZGluZykpKSB7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChsYXN0RmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCQkmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2sobGFzdEZpZWxkQmluZGluZykpIHsKKwkJCUZsb3dJbmZvIGZpZWxkSW5pdHMgPSBmbG93Q29udGV4dC5nZXRJbml0c0ZvckZpbmFsQmxhbmtJbml0aWFsaXphdGlvbkNoZWNrKGxhc3RGaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZsb3dJbmZvKTsKKwkJCWlmICghZmllbGRJbml0cy5pc0RlZmluaXRlbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKSkgeworCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJfQogCQl9Ci0JCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGU7Ci0JCXN3aXRjaCAob3RoZXJCaW5kaW5nc0NvdW50KSB7Ci0JCQljYXNlIDAgOgotCQkJCWxhc3RSZWNlaXZlclR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMSA6Ci0JCQkJbGFzdFJlY2VpdmVyVHlwZSA9ICgoVmFyaWFibGVCaW5kaW5nKXRoaXMuYmluZGluZykudHlwZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMub3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdzQ291bnQtMl0udHlwZTsKLQkJCQlicmVhazsKLQkJfQotCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeSgKLQkJCWN1cnJlbnRTY29wZSwKLQkJCWxhc3RGaWVsZEJpbmRpbmcsCi0JCQlsYXN0UmVjZWl2ZXJUeXBlLAotCQkJb3RoZXJCaW5kaW5nc0NvdW50LCAKLQkJCWZsb3dJbmZvKTsKKwkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBsYXN0RmllbGRCaW5kaW5nLCBvdGhlckJpbmRpbmdzQ291bnQsIGZsb3dJbmZvKTsKIAl9Ci0JCisKIAlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKIAkJZmxvd0luZm8gPQogCQkJYXNzaWdubWVudApAQCAtMTY3LDcgKzEzNyw3IEBACiAJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAl9Ci0JCisKIAkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKIAlpZiAobGFzdEZpZWxkQmluZGluZy5pc0ZpbmFsKCkpIHsKIAkJLy8gaW4gYSBjb250ZXh0IHdoZXJlIGl0IGNhbiBiZSBhc3NpZ25lZD8KQEAgLTE4OSwyMCArMTU5LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCi0JVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZTsKLQlzd2l0Y2ggKG90aGVyQmluZGluZ3NDb3VudCkgewotCQljYXNlIDAgOgotCQkJbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMSA6Ci0JCQlsYXN0UmVjZWl2ZXJUeXBlID0gKChWYXJpYWJsZUJpbmRpbmcpdGhpcy5iaW5kaW5nKS50eXBlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQgOgotCQkJbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMub3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdzQ291bnQtMl0udHlwZTsKLQkJCWJyZWFrOwotCX0KLQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGxhc3RGaWVsZEJpbmRpbmcsIGxhc3RSZWNlaXZlclR5cGUsIC0xIC8qd3JpdGUtYWNjZXNzKi8sIGZsb3dJbmZvKTsKKwltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGxhc3RGaWVsZEJpbmRpbmcsIC0xIC8qd3JpdGUtYWNjZXNzKi8sIGZsb3dJbmZvKTsKIAogCXJldHVybiBmbG93SW5mbzsKIH0KQEAgLTIyMCw0MyArMTc3LDM2IEBACiAJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCiAJCQlpZiAobmVlZFZhbHVlIHx8IGNvbXBseVRvMTQpIHsKLQkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIDAsIGZsb3dJbmZvKTsKKwkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZywgMCwgZmxvd0luZm8pOwogCQkJfQorCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKIAkJCWlmICh0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKSB7IC8vIHdhcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGZpZWxkIGJpbmRpbmcKLQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJLy8gY2hlY2sgaWYgYWNjZXNzaW5nIGVudW0gc3RhdGljIGZpZWxkIGluIGluaXRpYWxpemVyCQkJCQkKLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpIHsKLQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKTsKLQkJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IG1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpCi0JCQkJCQkJJiYgKHNvdXJjZVR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgfHwgc291cmNlVHlwZS5zdXBlcmNsYXNzID09IGRlY2xhcmluZ0NsYXNzKSAvLyBlbnVtIGNvbnN0YW50IGJvZHkKLQkJCQkJCQkmJiBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKLQkJCQkJCQkmJiAhbWV0aG9kU2NvcGUuaXNTdGF0aWMKLQkJCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZW51bVN0YXRpY0ZpZWxkVXNlZER1cmluZ0luaXRpYWxpemF0aW9uKGZpZWxkQmluZGluZywgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9CQkJCQogCQkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAogCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNCbGFua0ZpbmFsKCkKLQkJCQkJCSYmIGN1cnJlbnRTY29wZS5uZWVkQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb25DaGVjayhmaWVsZEJpbmRpbmcpCi0JCQkJCQkmJiAhZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgewotCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCQkJJiYgY3VycmVudFNjb3BlLm5lZWRCbGFua0ZpbmFsRmllbGRJbml0aWFsaXphdGlvbkNoZWNrKGZpZWxkQmluZGluZykpIHsKKwkJCQkJRmxvd0luZm8gZmllbGRJbml0cyA9IGZsb3dDb250ZXh0LmdldEluaXRzRm9yRmluYWxCbGFua0luaXRpYWxpemF0aW9uQ2hlY2soZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLm9yaWdpbmFsKCksIGZsb3dJbmZvKTsKKwkJCQkJaWYgKCFmaWVsZEluaXRzLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CisJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbCB2YXJpYWJsZQogCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nOwotCQkJaWYgKCFmbG93SW5mbwotCQkJCS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZykpIHsKKwkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpKSB7CiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKGxvY2FsQmluZGluZywgdGhpcyk7CiAJCQl9Ci0JCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkJeworCQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKIAkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CiAJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgewogCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuRkFLRV9VU0VEOwogCQkJfQotCQkJY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIHRydWUpOworCQkJaWYgKG5lZWRWYWx1ZSkgeworCQkJCWNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0cnVlKTsKKwkJCX0KIAl9CiAJaWYgKG5lZWRWYWx1ZSkgewogCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwpAQCAtMjY2LDYyICsyMTYsMzYgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlckJpbmRpbmdzQ291bnQ7IGkrKykgewogCQkJbmVlZFZhbHVlID0gaSA8IG90aGVyQmluZGluZ3NDb3VudC0xID8gIXRoaXMub3RoZXJCaW5kaW5nc1tpKzFdLmlzU3RhdGljKCkgOiB2YWx1ZVJlcXVpcmVkOwogCQkJaWYgKG5lZWRWYWx1ZSB8fCBjb21wbHlUbzE0KSB7Ci0JCQkJVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZSA9IGdldEdlbmVyaWNDYXN0KGkpOwotCQkJCWlmIChsYXN0UmVjZWl2ZXJUeXBlID09IG51bGwpIHsKLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJIGxhc3RSZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZyl0aGlzLmJpbmRpbmcpLnR5cGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5vdGhlckJpbmRpbmdzW2ktMV0udHlwZTsKLQkJCQkJfQotCQkJCX0KLQkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeSgKLQkJCQkJY3VycmVudFNjb3BlLCAKLQkJCQkJdGhpcy5vdGhlckJpbmRpbmdzW2ldLCAKLQkJCQkJbGFzdFJlY2VpdmVyVHlwZSwKLQkJCQkJaSArIDEsCi0JCQkJCWZsb3dJbmZvKTsKKwkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIHRoaXMub3RoZXJCaW5kaW5nc1tpXSwgaSArIDEsIGZsb3dJbmZvKTsKIAkJCX0KIAkJfQogCX0KIAlyZXR1cm4gZmxvd0luZm87CiB9CiAKLS8qKgotICogQ2hlY2sgYW5kL29yIHJlZGlyZWN0IHRoZSBmaWVsZCBhY2Nlc3MgdG8gdGhlIGRlbGVnYXRlIHJlY2VpdmVyIGlmIGFueQotICovCi1wdWJsaWMgVHlwZUJpbmRpbmcgY2hlY2tGaWVsZEFjY2VzcyhCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7Ci0JLy8gY2hlY2sgZm9yIGZvcndhcmQgcmVmZXJlbmNlcwotCWlmICh0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxCi0JCQkmJiBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgPT0gZmllbGRCaW5kaW5nLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3MKLQkJCSYmIG1ldGhvZFNjb3BlLmxhc3RWaXNpYmxlRmllbGRJRCA+PSAwCi0JCQkmJiBmaWVsZEJpbmRpbmcuaWQgPj0gbWV0aG9kU2NvcGUubGFzdFZpc2libGVGaWVsZElECi0JCQkmJiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpIHx8IG1ldGhvZFNjb3BlLmlzU3RhdGljKSkgewotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mb3J3YXJkUmVmZXJlbmNlKHRoaXMsIDAsIG1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSk7Ci0JfQotCXRoaXMuYml0cyAmPSB+QVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCi0JdGhpcy5iaXRzIHw9IEJpbmRpbmcuRklFTEQ7Ci0JcmV0dXJuIGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7Ci19Ci0KIHB1YmxpYyB2b2lkIGNoZWNrTlBFKEJsb2NrU2NvcGUgc2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgYm9vbGVhbiBjaGVja1N0cmluZykgewogCS8vIGNhbm5vdCBvdmVycmlkZSBsb2NhbFZhcmlhYmxlQmluZGluZyBiZWNhdXNlIHRoaXMgd291bGQgcHJvamVjdCBvLm0gb250byBvIHdoZW4KLQkvLyBhbmFseXNpbmcgYXNzaWdubWVudHMKKwkvLyBhbmFseXppbmcgYXNzaWdubWVudHMKIAlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgPT0gQmluZGluZy5MT0NBTCkgewogCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQlpZiAobG9jYWwgIT0gbnVsbCAmJiAKKwkJaWYgKGxvY2FsICE9IG51bGwgJiYKIAkJCShsb2NhbC50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLklzQmFzZVR5cGUpID09IDAgJiYKIAkJCShjaGVja1N0cmluZyB8fCBsb2NhbC50eXBlLmlkICE9IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykpIHsKIAkJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5Jc05vbk51bGwpID09IDApIHsKLQkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCB0aGlzLCAKKwkJCQlmbG93Q29udGV4dC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCB0aGlzLAogCQkJCQlGbG93Q29udGV4dC5NQVlfTlVMTCwgZmxvd0luZm8pOwogCQkJfQotCQkJZmxvd0luZm8ubWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChsb2NhbCk7IAotCQkJCS8vIGZyb20gdGhlcmVvbiBpdCBpcyBzZXQKKwkJCWZsb3dJbmZvLm1hcmtBc0NvbXBhcmVkRXF1YWxUb05vbk51bGwobG9jYWwpOworCQkJLy8gZnJvbSB0aGVyZW9uIGl0IGlzIHNldAorCQkJaWYgKChmbG93Q29udGV4dC50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgIT0gMCkgeworCQkJCWZsb3dJbmZvLm1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCk7CisJCQl9CiAJCQlpZiAoZmxvd0NvbnRleHQuaW5pdHNPbkZpbmFsbHkgIT0gbnVsbCkgewotCQkJCWZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5Lm1hcmtBc0NvbXBhcmVkRXF1YWxUb05vbk51bGwobG9jYWwpOyAKLQkJCX0JCQkKKwkJCQlmbG93Q29udGV4dC5pbml0c09uRmluYWxseS5tYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKGxvY2FsKTsKKwkJCQlpZiAoKGZsb3dDb250ZXh0LnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSAhPSAwKSB7CisJCQkJCWZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5Lm1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCk7CisJCQkJfQorCQkJfQogCQl9CiAJfQogfQpAQCAtMzMxLDcgKzI1NSw3IEBACiAgKi8KIHB1YmxpYyB2b2lkIGNvbXB1dGVDb252ZXJzaW9uKFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBydW50aW1lVGltZVR5cGUsIFR5cGVCaW5kaW5nIGNvbXBpbGVUaW1lVHlwZSkgewogCWlmIChydW50aW1lVGltZVR5cGUgPT0gbnVsbCB8fCBjb21waWxlVGltZVR5cGUgPT0gbnVsbCkKLQkJcmV0dXJuOwkJCisJCXJldHVybjsKIAkvLyBzZXQgdGhlIGdlbmVyaWMgY2FzdCBhZnRlciB0aGUgZmFjdCwgb25jZSB0aGUgdHlwZSBleHBlY3RhdGlvbiBpcyBmdWxseSBrbm93biAobm8gbmVlZCBmb3Igc3RyaWN0IGNhc3QpCiAJRmllbGRCaW5kaW5nIGZpZWxkID0gbnVsbDsKIAlpbnQgbGVuZ3RoID0gdGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aDsKQEAgLTM0NSwyNyArMjY5LDI0IEBACiAJaWYgKGZpZWxkICE9IG51bGwpIHsKIAkJRmllbGRCaW5kaW5nIG9yaWdpbmFsQmluZGluZyA9IGZpZWxkLm9yaWdpbmFsKCk7CiAJCVR5cGVCaW5kaW5nIG9yaWdpbmFsVHlwZSA9IG9yaWdpbmFsQmluZGluZy50eXBlOwotCSAgICAvLyBleHRyYSBjYXN0IG5lZWRlZCBpZiBtZXRob2QgcmV0dXJuIHR5cGUgaGFzIHR5cGUgdmFyaWFibGUKLQkJaWYgKG9yaWdpbmFsQmluZGluZyAhPSBmaWVsZCAKLQkJCQkmJiBvcmlnaW5hbFR5cGUgIT0gZmllbGQudHlwZQotCQkgICAgCSYmIHJ1bnRpbWVUaW1lVHlwZS5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QKLQkJICAgIAkmJiAob3JpZ2luYWxUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgIT0gMCkgewotCSAgICAJVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSA9ICghY29tcGlsZVRpbWVUeXBlLmlzQmFzZVR5cGUoKSAmJiBydW50aW1lVGltZVR5cGUuaXNCYXNlVHlwZSgpKSAKLQkgICAgCQk/IGNvbXBpbGVUaW1lVHlwZSAgLy8gdW5ib3hpbmc6IGNoZWNrY2FzdCBiZWZvcmUgY29udmVyc2lvbgotCSAgICAJCTogcnVudGltZVRpbWVUeXBlOwotCSAgICAJVHlwZUJpbmRpbmcgdHlwZUNhc3QgPSBvcmlnaW5hbFR5cGUuZ2VuZXJpY0Nhc3QodGFyZ2V0VHlwZSk7Ci0JICAgIAlzZXRHZW5lcmljQ2FzdChsZW5ndGgsIHR5cGVDYXN0KTsKLQkgICAgICAgIGlmICh0eXBlQ2FzdCBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgZmllbGQgdHlwZSBpcyB0eXBlIHZhcmlhYmxlCisJCWlmIChvcmlnaW5hbFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJCQlUeXBlQmluZGluZyB0YXJnZXRUeXBlID0gKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpCisJCQk/IGNvbXBpbGVUaW1lVHlwZSAgLy8gdW5ib3hpbmc6IGNoZWNrY2FzdCBiZWZvcmUgY29udmVyc2lvbgorCQkJCQk6IHJ1bnRpbWVUaW1lVHlwZTsKKwkJCVR5cGVCaW5kaW5nIHR5cGVDYXN0ID0gb3JpZ2luYWxUeXBlLmdlbmVyaWNDYXN0KHRhcmdldFR5cGUpOworCQkJc2V0R2VuZXJpY0Nhc3QobGVuZ3RoLCB0eXBlQ2FzdCk7CisJCQlpZiAodHlwZUNhc3QgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CiAJCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VDYXN0ID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVDYXN0OwogCQkJCWlmICghcmVmZXJlbmNlQ2FzdC5jYW5CZVNlZW5CeShzY29wZSkpIHsKLQkJICAgICAgICAJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgCi0JCSAgICAgICAgCQkJbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAotCQkJCQkJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCByZWZlcmVuY2VDYXN0LnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCQkJCQlyZWZlcmVuY2VDYXN0LAotCQkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSk7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsCisJCQkJCQkJbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcmVmZXJlbmNlQ2FzdC5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCQkJCXJlZmVyZW5jZUNhc3QsCisJCQkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSk7CiAJCQkJfQotCSAgICAgICAgfQkJCSAgICAJCi0JCX0gCQorCQkJfQorCQl9CiAJfQogCXN1cGVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBydW50aW1lVGltZVR5cGUsIGNvbXBpbGVUaW1lVHlwZSk7CiB9CkBAIC0zNzUsMTQgKzI5NiwxNCBAQAogCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMgLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JZmllbGRTdG9yZShjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCB0aGlzLnN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIHZhbHVlUmVxdWlyZWQpOworCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCB0aGlzLnN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIGdldEZpbmFsUmVjZWl2ZXJUeXBlKCksIGZhbHNlIC8qaW1wbGljaXQgdGhpcyovLCB2YWx1ZVJlcXVpcmVkKTsKIAkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCiAJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CiAJfQogfQogCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CQkKK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQlpZiAodmFsdWVSZXF1aXJlZCkgewpAQCAtNDAyLDExICszMjMsMTEgQEAKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGZpZWxkQ29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gaXNGaXJzdCA9IGxhc3RGaWVsZEJpbmRpbmcgPT0gdGhpcy5iaW5kaW5nIAorCQkJCWJvb2xlYW4gaXNGaXJzdCA9IGxhc3RGaWVsZEJpbmRpbmcgPT0gdGhpcy5iaW5kaW5nCiAJCQkJCQkJCQkJCQkmJiAodGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPT0gMSB8fCBsYXN0RmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdSZWNlaXZlclR5cGUoKSkKIAkJCQkJCQkJCQkJCSYmIHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsOyAvLyBjb3VsZCBiZSBkdXA6IG5leHQubmV4dC5uZXh0Ci0JCQkJVHlwZUJpbmRpbmcgcmVxdWlyZWRHZW5lcmljQ2FzdCA9IGdldEdlbmVyaWNDYXN0KHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzLmxlbmd0aCk7Ci0JCQkJaWYgKHZhbHVlUmVxdWlyZWQgIAorCQkJCVR5cGVCaW5kaW5nIHJlcXVpcmVkR2VuZXJpY0Nhc3QgPSBnZXRHZW5lcmljQ2FzdCh0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZAogCQkJCQkJfHwgKCFpc0ZpcnN0ICYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkKIAkJCQkJCXx8ICgodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKQogCQkJCQkJfHwgcmVxdWlyZWRHZW5lcmljQ2FzdCAhPSBudWxsKSB7CkBAIC00MjAsMTggKzM0MSwxNiBAQAogCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KLQkJCQkJCQl0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbAotCQkJCQkJCQk/IG51bGwKLQkJCQkJCQkJOiB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnNbdGhpcy5zeW50aGV0aWNSZWFkQWNjZXNzb3JzLmxlbmd0aCAtIDFdOworCQkJCQkJU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29yc1t0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMubGVuZ3RoIC0gMV07CiAJCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGxhc3RGaWVsZEJpbmRpbmcsIGdldEZpbmFsUmVjZWl2ZXJUeXBlKCksIGlzRmlyc3QpOwogCQkJCQkJCWlmIChpc1N0YXRpYykgewotCQkJCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRzdGF0aWMsIGxhc3RGaWVsZEJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBsYXN0RmllbGRCaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQkJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBhY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJCQkJCX0KIAkJCQkJCWlmIChyZXF1aXJlZEdlbmVyaWNDYXN0ICE9IG51bGwpIGNvZGVTdHJlYW0uY2hlY2tjYXN0KHJlcXVpcmVkR2VuZXJpY0Nhc3QpOwogCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKQEAgLTQ0NywxMCArMzY2LDExIEBACiAJCQkJCQkJCQlicmVhazsKIAkJCQkJCQkJZGVmYXVsdCA6CiAJCQkJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCQorCiAJCQkJCWludCBmaWVsZFBvc2l0aW9uID0gKGludCkgKHRoaXMuc291cmNlUG9zaXRpb25zW3RoaXMuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdID4+PiAzMik7CiAJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShsYXN0RmllbGRQYywgZmllbGRQb3NpdGlvbik7CiAJCQkJfSBlbHNlIHsKQEAgLTQ1OCwzOCArMzc4LDM0IEBACiAJCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjawogCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKIAkJCQkJfQotCQkJCX0JCQkJCQkJCQkKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KIAotcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoCi0JQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAotCUV4cHJlc3Npb24gZXhwcmVzc2lvbiwKLQlpbnQgb3BlcmF0b3IsCi0JaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sCi0JYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZyA9IGdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7Ci0JU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9Ci0JCXRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsCi0JCQk/IG51bGwKLQkJCTogdGhpcy5zeW50aGV0aWNSZWFkQWNjZXNzb3JzW3RoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycy5sZW5ndGggLSAxXTsKKwkvLyBjaGVjayBpZiBjb21wb3VuZCBhc3NpZ25tZW50IGlzIHRoZSBvbmx5IHVzYWdlIG9mIGEgcHJpdmF0ZSBmaWVsZAorCXJlcG9ydE9ubHlVc2VsZXNzbHlSZWFkUHJpdmF0ZUZpZWxkKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJYm9vbGVhbiBpc0ZpcnN0ID0gbGFzdEZpZWxkQmluZGluZyA9PSB0aGlzLmJpbmRpbmcKKwkJJiYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEgfHwgbGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCkpCisJCSYmIHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsOyAvLyBjb3VsZCBiZSBkdXA6IG5leHQubmV4dC5uZXh0CisJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgZ2V0RmluYWxSZWNlaXZlclR5cGUoKSwgaXNGaXJzdCk7CQkJCisJU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29yc1t0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMubGVuZ3RoIC0gMV07CiAJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewogCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgewotCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgbGFzdEZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoYWNjZXNzb3IpOworCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBhY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfQogCX0gZWxzZSB7CiAJCWNvZGVTdHJlYW0uZHVwKCk7CiAJCWlmIChhY2Nlc3NvciA9PSBudWxsKSB7Ci0JCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRmaWVsZCwgbGFzdEZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoYWNjZXNzb3IpOworCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBhY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfQogCX0KIAkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKQEAgLTUwMiw4ICs0MTgsOCBAQAogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKLQkJCVR5cGVCaW5kaW5nIHJlcXVpcmVkR2VuZXJpY0Nhc3QgPSBnZXRHZW5lcmljQ2FzdCh0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGgpOwotCQkJaWYgKHJlcXVpcmVkR2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QocmVxdWlyZWRHZW5lcmljQ2FzdCk7CQkJCQorCQkJVHlwZUJpbmRpbmcgcmVxdWlyZWRHZW5lcmljQ2FzdCA9IGdldEdlbmVyaWNDYXN0KHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgpOworCQkJaWYgKHJlcXVpcmVkR2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QocmVxdWlyZWRHZW5lcmljQ2FzdCk7CiAJCQkvLyBwcm9tb3RlIHRoZSBhcnJheSByZWZlcmVuY2UgdG8gdGhlIHN1aXRhYmxlIG9wZXJhdGlvbiB0eXBlCiAJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQpAQCAtNTE4LDU2ICs0MzQsNjcgQEAKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7CiAJfQogCS8vIGFjdHVhbCBhc3NpZ25tZW50Ci0JZmllbGRTdG9yZShjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCB0aGlzLnN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIHZhbHVlUmVxdWlyZWQpOworCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCB0aGlzLnN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIGdldEZpbmFsUmVjZWl2ZXJUeXBlKCksIGZhbHNlIC8qaW1wbGljaXQgdGhpcyovLCB2YWx1ZVJlcXVpcmVkKTsKIAkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCiB9CiAKLXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudCgKLQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCi0JQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsCi0JYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0gICAgCitwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKLQlTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KLQkJdGhpcy5zeW50aGV0aWNSZWFkQWNjZXNzb3JzID09IG51bGwKKwkvLyBjaGVjayBpZiB0aGlzIHBvc3QgaW5jcmVtZW50IGlzIHRoZSBvbmx5IHVzYWdlIG9mIGEgcHJpdmF0ZSBmaWVsZAorCXJlcG9ydE9ubHlVc2VsZXNzbHlSZWFkUHJpdmF0ZUZpZWxkKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJYm9vbGVhbiBpc0ZpcnN0ID0gbGFzdEZpZWxkQmluZGluZyA9PSB0aGlzLmJpbmRpbmcKKwkJJiYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEgfHwgbGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCkpCisJCSYmIHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsOyAvLyBjb3VsZCBiZSBkdXA6IG5leHQubmV4dC5uZXh0CisJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgZ2V0RmluYWxSZWNlaXZlclR5cGUoKSwgaXNGaXJzdCk7CQkJCisJU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsCiAJCQk/IG51bGwKIAkJCTogdGhpcy5zeW50aGV0aWNSZWFkQWNjZXNzb3JzW3RoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycy5sZW5ndGggLSAxXTsKIAlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CiAJCWlmIChhY2Nlc3NvciA9PSBudWxsKSB7Ci0JCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBsYXN0RmllbGRCaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIGFjY2Vzc29yLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCX0KIAl9IGVsc2UgewogCQljb2RlU3RyZWFtLmR1cCgpOwogCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgewotCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGxhc3RGaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIGFjY2Vzc29yLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQl9CiAJfQorCVR5cGVCaW5kaW5nIHJlcXVpcmVkR2VuZXJpY0Nhc3QgPSBnZXRHZW5lcmljQ2FzdCh0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoKTsKKwlUeXBlQmluZGluZyBvcGVyYW5kVHlwZTsKKwlpZiAocmVxdWlyZWRHZW5lcmljQ2FzdCAhPSBudWxsKSB7CisJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHJlcXVpcmVkR2VuZXJpY0Nhc3QpOworCQlvcGVyYW5kVHlwZSA9IHJlcXVpcmVkR2VuZXJpY0Nhc3Q7CisJfSBlbHNlIHsKKwkJb3BlcmFuZFR5cGUgPSBsYXN0RmllbGRCaW5kaW5nLnR5cGU7CisJfQkJCiAJLy8gZHVwbGljYXRlIHRoZSBvbGQgZmllbGQgdmFsdWUKIAlpZiAodmFsdWVSZXF1aXJlZCkgewogCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQlpZiAoKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKQotCQkJCXx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCWNvZGVTdHJlYW0uZHVwMigpOwotCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJfQorCQkJc3dpdGNoIChvcGVyYW5kVHlwZS5pZCkgeworCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQlicmVhazsKKwkJCX0JCQkKIAkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KLQkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpCi0JCQkJfHwgKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7Ci0JCQl9CisJCQlzd2l0Y2ggKG9wZXJhbmRUeXBlLmlkKSB7CisJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJCWJyZWFrOworCQkJfQkJCQogCQl9CiAJfQotCVR5cGVCaW5kaW5nIHJlcXVpcmVkR2VuZXJpY0Nhc3QgPSBnZXRHZW5lcmljQ2FzdCh0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGgpOwotCWlmIChyZXF1aXJlZEdlbmVyaWNDYXN0ICE9IG51bGwpIGNvZGVTdHJlYW0uY2hlY2tjYXN0KHJlcXVpcmVkR2VuZXJpY0Nhc3QpOwotCQogCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwkJCiAJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KAogCQlwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsCkBAIC01NzUsOCArNTAyLDggQEAKIAljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oCiAJCXBvc3RJbmNyZW1lbnQucHJlQXNzaWduSW1wbGljaXRDb252ZXJzaW9uKTsKLQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMuc3ludGhldGljV3JpdGVBY2Nlc3NvciwgZmFsc2UpOwotfQkKKwlmaWVsZFN0b3JlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbGFzdEZpZWxkQmluZGluZywgdGhpcy5zeW50aGV0aWNXcml0ZUFjY2Vzc29yLCBnZXRGaW5hbFJlY2VpdmVyVHlwZSgpLCBmYWxzZSAvKmltcGxpY2l0IHRoaXMqLywgZmFsc2UpOworfQogCiAvKgogICogR2VuZXJhdGUgY29kZSBmb3IgYWxsIGJpbmRpbmdzIChsb2NhbCBhbmQgZmllbGRzKSBleGNsdWRpbmcgdGhlIGxhc3Qgb25lLCB3aGljaCBtYXkgdGhlbiBiZSBnZW5lcmF0ZWQgY29kZQpAQCAtNTg0LDE2ICs1MTEsMTggQEAKICAqLwogcHVibGljIEZpZWxkQmluZGluZyBnZW5lcmF0ZVJlYWRTZXF1ZW5jZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCi0JaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzLmxlbmd0aDsKKwlpbnQgb3RoZXJCaW5kaW5nc0NvdW50ID0gdGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aDsKIAlib29sZWFuIG5lZWRWYWx1ZSA9IG90aGVyQmluZGluZ3NDb3VudCA9PSAwIHx8ICF0aGlzLm90aGVyQmluZGluZ3NbMF0uaXNTdGF0aWMoKTsKLQlGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZyA9IG51bGw7Ci0JVHlwZUJpbmRpbmcgbGFzdEdlbmVyaWNDYXN0ID0gbnVsbDsKKwlGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZzsKKwlUeXBlQmluZGluZyBsYXN0R2VuZXJpY0Nhc3Q7CisJVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZTsKIAlib29sZWFuIGNvbXBseVRvMTQgPSBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7CiAKIAlzd2l0Y2ggKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgewogCQljYXNlIEJpbmRpbmcuRklFTEQgOgotCQkJbGFzdEZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQlsYXN0RmllbGRCaW5kaW5nID0gKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZykub3JpZ2luYWwoKTsKIAkJCWxhc3RHZW5lcmljQ2FzdCA9IHRoaXMuZ2VuZXJpY0Nhc3Q7CisJCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7CiAJCQkvLyBpZiBmaXJzdCBmaWVsZCBpcyBhY3R1YWxseSBjb25zdGFudCwgd2UgY2FuIGlubGluZSBpdAogCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCQlicmVhazsKQEAgLTYxMSw4ICs1NDAsMTEgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyByZWFkaW5nIHRoZSBmaXJzdCBsb2NhbCB2YXJpYWJsZQorCQkJbGFzdEZpZWxkQmluZGluZyA9IG51bGw7CisJCQlsYXN0R2VuZXJpY0Nhc3QgPSBudWxsOworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlsYXN0UmVjZWl2ZXJUeXBlID0gbG9jYWxCaW5kaW5nLnR5cGU7CiAJCQlpZiAoIW5lZWRWYWx1ZSkgYnJlYWs7IC8vIG5vIHZhbHVlIG5lZWRlZAotCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwogCQkJLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSByZWFkCiAJCQlDb25zdGFudCBsb2NhbENvbnN0YW50ID0gbG9jYWxCaW5kaW5nLmNvbnN0YW50KCk7CiAJCQlpZiAobG9jYWxDb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKQEAgLTYyOCwxNSArNTYwLDE5IEBACiAJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwogCQkJCX0KIAkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0IDogLy8gc2hvdWxkIG5vdCBvY2N1cgorCQkJcmV0dXJuIG51bGw7CiAJfQotCQkJCQkKKwogCS8vIGFsbCBpbnRlcm1lZGlhdGUgZmllbGQgYWNjZXNzZXMgYXJlIHJlYWQgYWNjZXNzZXMKIAkvLyBvbmx5IHRoZSBsYXN0IGZpZWxkIGJpbmRpbmcgaXMgYSB3cml0ZSBhY2Nlc3MKIAlpbnQgcG9zaXRpb25zTGVuZ3RoID0gdGhpcy5zb3VyY2VQb3NpdGlvbnMubGVuZ3RoOwotCWlmICh0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzICE9IG51bGwpIHsKKwlGaWVsZEJpbmRpbmcgaW5pdGlhbEZpZWxkQmluZGluZyA9IGxhc3RGaWVsZEJpbmRpbmc7IC8vIGNhbiBiZSBudWxsIGlmIGluaXRpYWwgd2FzIGEgbG9jYWwgYmluZGluZworCWlmICh0aGlzLm90aGVyQmluZGluZ3MgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7CiAJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQkJRmllbGRCaW5kaW5nIG5leHRGaWVsZCA9IHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbaV07CisJCQlGaWVsZEJpbmRpbmcgbmV4dEZpZWxkID0gdGhpcy5vdGhlckJpbmRpbmdzW2ldLm9yaWdpbmFsKCk7CiAJCQlUeXBlQmluZGluZyBuZXh0R2VuZXJpY0Nhc3QgPSB0aGlzLm90aGVyR2VuZXJpY0Nhc3RzID09IG51bGwgPyBudWxsIDogdGhpcy5vdGhlckdlbmVyaWNDYXN0c1tpXTsKIAkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwpIHsKIAkJCQluZWVkVmFsdWUgPSAhbmV4dEZpZWxkLmlzU3RhdGljKCk7CkBAIC02NTEsMzYgKzU4Nyw0NCBAQAogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKG5lZWRWYWx1ZSB8fCAoaSA+IDAgJiYgY29tcGx5VG8xNCkgfHwgbGFzdEdlbmVyaWNDYXN0ICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPSB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnNbaV07IAorCQkJCQkJTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29yc1tpXTsKIAkJCQkJCWlmIChhY2Nlc3NvciA9PSBudWxsKSB7CisJCQkJCQkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgbGFzdFJlY2VpdmVyVHlwZSwgaSA9PSAwICYmIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpOwogCQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBsYXN0RmllbGRCaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRmaWVsZCwgbGFzdEZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoYWNjZXNzb3IpOworCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgYWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCQkJCQl9Ci0JCQkJCQlpZiAobGFzdEdlbmVyaWNDYXN0ICE9IG51bGwpIGNvZGVTdHJlYW0uY2hlY2tjYXN0KGxhc3RHZW5lcmljQ2FzdCk7CisJCQkJCQlpZiAobGFzdEdlbmVyaWNDYXN0ICE9IG51bGwpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdChsYXN0R2VuZXJpY0Nhc3QpOworCQkJCQkJCWxhc3RSZWNlaXZlclR5cGUgPSBsYXN0R2VuZXJpY0Nhc3Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxhc3RSZWNlaXZlclR5cGUgPSBsYXN0RmllbGRCaW5kaW5nLnR5cGU7CisJCQkJCQl9CiAJCQkJCQlpZiAoIW5lZWRWYWx1ZSkgY29kZVN0cmVhbS5wb3AoKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nID09IGxhc3RGaWVsZEJpbmRpbmcpIHsKKwkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nID09IGluaXRpYWxGaWVsZEJpbmRpbmcpIHsKIAkJCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKIAkJCQkJCQkJLy8gaWYgbm8gdmFsdWVSZXF1aXJlZCwgc3RpbGwgbmVlZCBwb3NzaWJsZSBzaWRlLWVmZmVjdHMgb2YgPGNsaW5pdD4gaW52b2NhdGlvbiwgaWYgZmllbGQgYmVsb25ncyB0byBkaWZmZXJlbnQgY2xhc3MKLQkJCQkJCQkJaWYgKCgoRmllbGRCaW5kaW5nKXRoaXMuYmluZGluZykub3JpZ2luYWwoKS5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpIHsKLQkJCQkJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPSB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnNbaV07IAorCQkJCQkJCQlpZiAoaW5pdGlhbEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpIHsKKwkJCQkJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPSB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnNbaV07CiAJCQkJCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgewotCQkJCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQkJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGxhc3RGaWVsZEJpbmRpbmcsIGxhc3RSZWNlaXZlclR5cGUsIGkgPT0gMCAmJiB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKTsKKwkJCQkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgbGFzdEZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQkJCQkJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBhY2Nlc3NvciwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQkJCQkJCX0JCQkJCisJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgaWYgKCFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpewogCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCiAJCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKLQkJCQkJCX0JCQkJCQkKKwkJCQkJCX0KKwkJCQkJCWxhc3RSZWNlaXZlclR5cGUgPSBsYXN0RmllbGRCaW5kaW5nLnR5cGU7CiAJCQkJCX0KIAkJCQkJaWYgKChwb3NpdGlvbnNMZW5ndGggLSBvdGhlckJpbmRpbmdzQ291bnQgKyBpIC0gMSkgPj0gMCkgewogCQkJCQkJaW50IGZpZWxkUG9zaXRpb24gPSAoaW50KSAodGhpcy5zb3VyY2VQb3NpdGlvbnNbcG9zaXRpb25zTGVuZ3RoIC0gb3RoZXJCaW5kaW5nc0NvdW50ICsgaSAtIDFdID4+PjMyKTsKQEAgLTcwNiwxNSArNjUwLDMxIEBACiAJcmV0dXJuIG51bGw7CiB9CiAKLS8vIGdldCB0aGUgbWF0Y2hpbmcgY29kZWdlbkJpbmRpbmcKIHByb3RlY3RlZCBGaWVsZEJpbmRpbmcgZ2V0Q29kZWdlbkJpbmRpbmcoaW50IGluZGV4KSB7CiAgIGlmIChpbmRleCA9PSAwKXsKLQkJcmV0dXJuIChGaWVsZEJpbmRpbmcpdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJcmV0dXJuICgoRmllbGRCaW5kaW5nKXRoaXMuYmluZGluZykub3JpZ2luYWwoKTsKIAl9IGVsc2UgewotCQlyZXR1cm4gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5nc1tpbmRleC0xXTsKKwkJcmV0dXJuIHRoaXMub3RoZXJCaW5kaW5nc1tpbmRleC0xXS5vcmlnaW5hbCgpOwogCX0KIH0KIAorLyoqCisgKiBSZXR1cm5zIHRoZSByZWNlaXZlciB0eXBlIGZvciB0aGUgZmluYWwgZmllbGQgaW4gc2VxdWVuY2UgKGkuZS4gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBwcmV2aW91cyBiaW5kaW5nKQorICogQHJldHVybiByZWNlaXZlciB0eXBlIGZvciB0aGUgZmluYWwgZmllbGQgaW4gc2VxdWVuY2UKKyAqLworcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGdldEZpbmFsUmVjZWl2ZXJUeXBlKCkgeworCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSB0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoOworCXN3aXRjaCAob3RoZXJCaW5kaW5nc0NvdW50KSB7CisJCWNhc2UgMCA6CisJCQlyZXR1cm4gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7CisJCWNhc2UgMSA6CisJCQlyZXR1cm4gdGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsID8gdGhpcy5nZW5lcmljQ2FzdCA6ICgoVmFyaWFibGVCaW5kaW5nKXRoaXMuYmluZGluZykudHlwZTsKKwkJZGVmYXVsdDoKKwkJCVR5cGVCaW5kaW5nIHByZXZpb3VzR2VuZXJpY0Nhc3QgPSB0aGlzLm90aGVyR2VuZXJpY0Nhc3RzID09IG51bGwgPyBudWxsIDogdGhpcy5vdGhlckdlbmVyaWNDYXN0c1tvdGhlckJpbmRpbmdzQ291bnQtMl07CisJCQlyZXR1cm4gcHJldmlvdXNHZW5lcmljQ2FzdCAhPSBudWxsID8gcHJldmlvdXNHZW5lcmljQ2FzdCA6IHRoaXMub3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdzQ291bnQtMl0udHlwZTsKKwl9CQorfQorCiAvLyBnZXQgdGhlIG1hdGNoaW5nIGdlbmVyaWMgY2FzdAogcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGdldEdlbmVyaWNDYXN0KGludCBpbmRleCkgewogICAgaWYgKGluZGV4ID09IDApewpAQCAtNzI0LDM0ICs2ODQsMTAgQEAKIAkJcmV0dXJuIHRoaXMub3RoZXJHZW5lcmljQ2FzdHNbaW5kZXgtMV07CiAJfQogfQotCiBwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBBdCB0aGlzIHBvaW50IHJlc3RyaWN0aXZlRmxhZyBtYXkgT05MWSBoYXZlIHR3byBwb3RlbnRpYWwgdmFsdWUgOiBGSUVMRCBMT0NBTCAoaS5lIGNhc3QgPDwoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nPj4gaXMgdmFsaWQpCiAJaW50IGxlbmd0aCA9IHRoaXMudG9rZW5zLmxlbmd0aDsKLQlGaWVsZEJpbmRpbmcgZmllbGQ7Ci0JaWYgKCh0aGlzLmJpdHMgJiBCaW5kaW5nLkZJRUxEKSAhPSAwKSB7Ci0JCWZpZWxkID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQlpZiAoIWZpZWxkLmlzU3RhdGljKCkpIHsKLQkJCS8vbXVzdCBjaGVjayBmb3IgdGhlIHN0YXRpYyBzdGF0dXMuLi4uCi0JCQlpZiAodGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAxICAvL2FjY2Vzc2luZyB0byBhIGZpZWxkIHVzaW5nIGEgdHlwZSBhcyAicmVjZWl2ZXIiIGlzIGFsbG93ZWQgb25seSB3aXRoIHN0YXRpYyBmaWVsZAotCQkJCQkgfHwgc2NvcGUubWV0aG9kU2NvcGUoKS5pc1N0YXRpYykgeyAJLy8gdGhlIGZpZWxkIGlzIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgcXVhbGlmaWVkIHJlZmVyZW5jZS4uLi4KLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdGF0aWNGaWVsZEFjY2Vzc1RvTm9uU3RhdGljVmFyaWFibGUodGhpcywgZmllbGQpOwotCQkJCXJldHVybiBudWxsOwotCQkJIH0KLQkJfSBlbHNlIHsKLQkJCS8vIGluZGlyZWN0IHN0YXRpYyByZWZlcmVuY2UgPwotCQkJaWYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSAKLQkJCQkJJiYgZmllbGQuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUKLQkJCQkJJiYgZmllbGQuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoc2NvcGUpKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5kaXJlY3RBY2Nlc3NUb1N0YXRpY0ZpZWxkKHRoaXMsIGZpZWxkKTsKLQkJCX0KLQkJfQotCQkvLyBvbmx5IGxhc3QgZmllbGQgaXMgYWN0dWFsbHkgYSB3cml0ZSBhY2Nlc3MgaWYgYW55Ci0JCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZCwgc2NvcGUsICh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgIT0gMCAmJiB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSBsZW5ndGgpKQotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGZpZWxkLCB0aGlzKTsKLQl9IGVsc2UgewotCQlmaWVsZCA9IG51bGw7Ci0JfQorCUZpZWxkQmluZGluZyBmaWVsZCA9ICgodGhpcy5iaXRzICYgQmluZGluZy5GSUVMRCkgIT0gMCkgPyAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcgOiBudWxsOwogCVR5cGVCaW5kaW5nIHR5cGUgPSAoKFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nKS50eXBlOwogCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOwogCWlmIChpbmRleCA9PSBsZW5ndGgpIHsgLy8JcmVzdHJpY3RpdmVGbGFnID09IEZJRUxECkBAIC03NjMsMjAgKzY5OSwyMCBAQAogCX0KIAkvLyBhbGxvY2F0aW9uIG9mIHRoZSBmaWVsZEJpbmRpbmdzIGFycmF5CWFuZCBpdHMgcmVzcGVjdGl2ZSBjb25zdGFudHMKIAlpbnQgb3RoZXJCaW5kaW5nc0xlbmd0aCA9IGxlbmd0aCAtIGluZGV4OwotCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPSB0aGlzLm90aGVyQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW290aGVyQmluZGluZ3NMZW5ndGhdOworCXRoaXMub3RoZXJCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbb3RoZXJCaW5kaW5nc0xlbmd0aF07CiAJdGhpcy5vdGhlckRlcHRocyA9IG5ldyBpbnRbb3RoZXJCaW5kaW5nc0xlbmd0aF07Ci0JCisKIAkvLyBmaWxsIHRoZSBmaXJzdCBjb25zdGFudCAodGhlIG9uZSBvZiB0aGUgYmluZGluZykKIAl0aGlzLmNvbnN0YW50ID0gKChWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZykuY29uc3RhbnQoKTsKIAkvLyBzYXZlIGZpcnN0IGRlcHRoLCBzaW5jZSB3aWxsIGJlIHVwZGF0ZWQgYnkgdmlzaWJpbGl0eSBjaGVja3Mgb2Ygb3RoZXIgYmluZGluZ3MKIAlpbnQgZmlyc3REZXB0aCA9ICh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUOwotCS8vIGl0ZXJhdGlvbiBvbiBlYWNoIGZpZWxkCQorCS8vIGl0ZXJhdGlvbiBvbiBlYWNoIGZpZWxkCiAJd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CiAJCWNoYXJbXSB0b2tlbiA9IHRoaXMudG9rZW5zW2luZGV4XTsKIAkJaWYgKHR5cGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOyAvLyBjb3VsZCBub3QgcmVzb2x2ZSB0eXBlIHByaW9yIHRvIHRoaXMgcG9pbnQKIAotCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuRGVwdGhNQVNLOyAvLyBmbHVzaCBwcmV2aW91cyBkZXB0aCBpZiBhbnkJCQorCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuRGVwdGhNQVNLOyAvLyBmbHVzaCBwcmV2aW91cyBkZXB0aCBpZiBhbnkKIAkJRmllbGRCaW5kaW5nIHByZXZpb3VzRmllbGQgPSBmaWVsZDsKIAkJZmllbGQgPSBzY29wZS5nZXRGaWVsZCh0eXBlLmNhcHR1cmUoc2NvcGUsIChpbnQpdGhpcy5zb3VyY2VQb3NpdGlvbnNbaW5kZXhdKSwgdG9rZW4sIHRoaXMpOwogCQlpbnQgcGxhY2UgPSBpbmRleCAtIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOwpAQCAtNzg2LDI5ICs3MjIsNDQgQEAKIAkJCS8vIHNldCBnZW5lcmljIGNhc3Qgb2YgZm9yIHByZXZpb3VzIGZpZWxkIChpZiBhbnkpCiAJCQlpZiAocHJldmlvdXNGaWVsZCAhPSBudWxsKSB7CiAJCQkJVHlwZUJpbmRpbmcgZmllbGRSZWNlaXZlclR5cGUgPSB0eXBlOwotCQkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyRXJhc3VyZSA9IHR5cGUuZXJhc3VyZSgpOwotCQkJCWlmIChyZWNlaXZlckVyYXN1cmUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCWlmIChyZWNlaXZlckVyYXN1cmUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShmaWVsZC5kZWNsYXJpbmdDbGFzcykgPT0gbnVsbCkgewotCQkJCQkJZmllbGRSZWNlaXZlclR5cGUgPSBmaWVsZC5kZWNsYXJpbmdDbGFzczsgLy8gaGFuZGxlIGluZGlyZWN0IGluaGVyaXRhbmNlIHRocnUgdmFyaWFibGUgc2Vjb25kYXJ5IGJvdW5kCi0JCQkJCX0KLQkJCQl9CQkJCQorCQkJCVR5cGVCaW5kaW5nIG9sZFJlY2VpdmVyVHlwZSA9IGZpZWxkUmVjZWl2ZXJUeXBlOworCQkJCWZpZWxkUmVjZWl2ZXJUeXBlID0gZmllbGRSZWNlaXZlclR5cGUuZ2V0RXJhc3VyZUNvbXBhdGlibGVUeXBlKGZpZWxkLmRlY2xhcmluZ0NsYXNzKTsvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKIAkJCQlGaWVsZEJpbmRpbmcgb3JpZ2luYWxCaW5kaW5nID0gcHJldmlvdXNGaWVsZC5vcmlnaW5hbCgpOwotCQkJICAgIGlmICgob3JpZ2luYWxCaW5kaW5nLnR5cGUudGFnQml0cyAmICBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgIT0gMCAmJiBmaWVsZFJlY2VpdmVyVHlwZS5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsKKwkJCQlpZiAoZmllbGRSZWNlaXZlclR5cGUgIT0gb2xkUmVjZWl2ZXJUeXBlIHx8IG9yaWdpbmFsQmluZGluZy50eXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNUeXBlVmFyaWFibGUoKSkgeyAvLyByZWNvcmQgbmVlZCBmb3IgZXhwbGljaXQgY2FzdCBhdCBjb2RlZ2VuCiAJCQkgICAgCXNldEdlbmVyaWNDYXN0KGluZGV4LTEsb3JpZ2luYWxCaW5kaW5nLnR5cGUuZ2VuZXJpY0Nhc3QoZmllbGRSZWNlaXZlclR5cGUpKTsgLy8gdHlwZSBjYW5ub3QgYmUgYmFzZS10eXBlIGV2ZW4gaW4gYm94aW5nIGNhc2UKLQkJCSAgICB9CisJCQkJfQkJCQkKIAkJICAgIH0KIAkJCS8vIG9ubHkgbGFzdCBmaWVsZCBpcyBhY3R1YWxseSBhIHdyaXRlIGFjY2VzcyBpZiBhbnkKLQkJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZCwgc2NvcGUsICh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgIT0wICYmIGluZGV4KzEgPT0gbGVuZ3RoKSkgeworCQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkLCBzY29wZSwgaW5kZXgrMSA9PSBsZW5ndGggPyB0aGlzLmJpdHMgOiAwKSkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZCwgdGhpcyk7CiAJCQl9CiAJCQkvLyBjb25zdGFudCBwcm9wYWdhdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgcHJldmlvdXMgb25lIGlzIGEgY29uc3RhbnQgdG9vLgogCQkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQkJdGhpcy5jb25zdGFudCA9IGZpZWxkLmNvbnN0YW50KCk7CQkJCQkKKwkJCQl0aGlzLmNvbnN0YW50ID0gZmllbGQuY29uc3RhbnQoKTsKIAkJCX0KIAogCQkJaWYgKGZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQlpZiAoKGZpZWxkLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKSAhPSAwKSB7IC8vIGVudW0gY29uc3RhbnRzIGFyZSBjaGVja2VkIGV2ZW4gd2hlbiBxdWFsaWZpZWQpCisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBmaWVsZC5vcmlnaW5hbCgpLmRlY2xhcmluZ0NsYXNzOworCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpID09IDAKKwkJCQkJCQkmJiBzb3VyY2VUeXBlID09IGRlY2xhcmluZ0NsYXNzCisJCQkJCQkJJiYgbWV0aG9kU2NvcGUubGFzdFZpc2libGVGaWVsZElEID49IDAKKwkJCQkJCQkmJiBmaWVsZC5pZCA+PSBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQKKwkJCQkJCQkmJiAoIWZpZWxkLmlzU3RhdGljKCkgfHwgbWV0aG9kU2NvcGUuaXNTdGF0aWMpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mb3J3YXJkUmVmZXJlbmNlKHRoaXMsIGluZGV4LCBmaWVsZCk7CisJCQkJCX0JCQkJCQorCQkJCQkvLyBjaGVjayBpZiBhY2Nlc3NpbmcgZW51bSBzdGF0aWMgZmllbGQgaW4gaW5pdGlhbGl6ZXIKKwkJCQkJaWYgKChzb3VyY2VUeXBlID09IGRlY2xhcmluZ0NsYXNzIHx8IHNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9PSBkZWNsYXJpbmdDbGFzcykgLy8gZW51bSBjb25zdGFudCBib2R5CisJCQkJCQkJJiYgZmllbGQuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKKwkJCQkJCQkmJiAhbWV0aG9kU2NvcGUuaXNTdGF0aWMKKwkJCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lbnVtU3RhdGljRmllbGRVc2VkRHVyaW5nSW5pdGlhbGl6YXRpb24oZmllbGQsIHRoaXMpOworCQkJCQl9CisJCQkJfQogCQkJCS8vIHN0YXRpYyBmaWVsZCBhY2Nlc3NlZCB0aHJvdWdoIHJlY2VpdmVyPyBsZWdhbCBidXQgdW5vcHRpbWFsIChvcHRpb25hbCB3YXJuaW5nKQotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vblN0YXRpY0FjY2Vzc1RvU3RhdGljRmllbGQodGhpcywgZmllbGQpOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vblN0YXRpY0FjY2Vzc1RvU3RhdGljRmllbGQodGhpcywgZmllbGQsIGluZGV4KTsKIAkJCQkvLyBpbmRpcmVjdCBzdGF0aWMgcmVmZXJlbmNlID8KIAkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MgIT0gdHlwZSkgewogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmRpcmVjdEFjY2Vzc1RvU3RhdGljRmllbGQodGhpcywgZmllbGQpOwpAQCAtODI4LDc5ICs3NzksNjEgQEAKIAkvLyBwZXJmb3JtIGNhcHR1cmUgY29udmVyc2lvbiBpZiByZWFkIGFjY2VzcwogCXJldHVybiAodHlwZSAhPSBudWxsICYmICh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgPT0gMCkKIAkJCT8gdHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCkKLQkJCTogdHlwZTsJCQorCQkJOiB0eXBlOwogfQogCiBwdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKQl7CiAJLy9JZiBpbmxpbmFibGUgZmllbGQsIGZvcmdldCB0aGUgYWNjZXNzIGVtdWxhdGlvbiwgdGhlIGNvZGUgZ2VuIHdpbGwgZGlyZWN0bHkgdGFyZ2V0IGl0CiAJaWYgKCgodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spID09IDApIHx8ICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKIAkJcmV0dXJuOwogCX0KIAlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgPT0gQmluZGluZy5MT0NBTCkgewotCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nKTsKLQl9CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCWlmIChsb2NhbFZhcmlhYmxlQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAoKGxvY2FsVmFyaWFibGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLk5vdEluaXRpYWxpemVkKSAhPSAwKSB7CisJCQkJLy8gbG9jYWwgd2FzIHRhZ2dlZCBhcyB1bmluaXRpYWxpemVkCisJCQkJcmV0dXJuOworCQkJfQorCQkJc3dpdGNoKGxvY2FsVmFyaWFibGVCaW5kaW5nLnVzZUZsYWcpIHsKKwkJCQljYXNlIExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRCA6CisJCQkJY2FzZSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEIDoKKwkJCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2Vzcyhsb2NhbFZhcmlhYmxlQmluZGluZyk7CisJCQl9CisJCX0KIAl9CiB9CiAKIC8qKgogICogaW5kZXggaXMgPDAgdG8gZGVub3RlIHdyaXRlIGFjY2VzcyBlbXVsYXRpb24KICAqLwotcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsIFR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGUsIAlpbnQgaW5kZXgsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApCXJldHVybjsKK3B1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBpbnQgaW5kZXgsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkgcmV0dXJuOwogCS8vIGluZGV4ID09IDAgZGVub3RlcyB0aGUgZmlyc3QgZmllbGRCaW5kaW5nLCBpbmRleCA+IDAgZGVub3RlcyBvbmUgb2YgdGhlICdvdGhlckJpbmRpbmdzJywgaW5kZXggPCAwIGRlbm90ZXMgYSB3cml0ZSBhY2Nlc3MgKHRvIGxhc3QgYmluZGluZykKIAlpZiAoZmllbGRCaW5kaW5nLmNvbnN0YW50KCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQogCQlyZXR1cm47CiAKLQkvLyBpZiBmaWVsZCBmcm9tIHBhcmFtZXRlcml6ZWQgdHlwZSBnb3QgZm91bmQsIHVzZSB0aGUgb3JpZ2luYWwgZmllbGQgYXQgY29kZWdlbiB0aW1lCi0JRmllbGRCaW5kaW5nIG9yaWdpbmFsRmllbGQgPSBmaWVsZEJpbmRpbmcub3JpZ2luYWwoKTsKLQlpZiAob3JpZ2luYWxGaWVsZCAhPSBmaWVsZEJpbmRpbmcpIHsKLQkJc2V0Q29kZWdlbkJpbmRpbmcoaW5kZXggPCAwID8gKHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgpIDogaW5kZXgsIG9yaWdpbmFsRmllbGQpOwotCX0KLQkKIAlpZiAoZmllbGRCaW5kaW5nLmlzUHJpdmF0ZSgpKSB7IC8vIHByaXZhdGUgYWNjZXNzCi0JICAgIEZpZWxkQmluZGluZyBzb21lQ29kZWdlbkJpbmRpbmcgPSBnZXRDb2RlZ2VuQmluZGluZyhpbmRleCA8IDAgPyAodGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aCkgOiBpbmRleCk7Ci0JCWlmIChzb21lQ29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSkgewotCQkgICAgc2V0U3ludGhldGljQWNjZXNzb3IoZmllbGRCaW5kaW5nLCBpbmRleCwgCi0JCSAgICAgICAgICAgICgoU291cmNlVHlwZUJpbmRpbmcpIHNvbWVDb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKHNvbWVDb2RlZ2VuQmluZGluZywgaW5kZXggPj0gMCAvKnJlYWQtYWNjZXNzPyovKSk7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkQWNjZXNzKHNvbWVDb2RlZ2VuQmluZGluZywgdGhpcywgaW5kZXggPj0gMCAvKnJlYWQtYWNjZXNzPyovKTsKKwkgICAgRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9IGdldENvZGVnZW5CaW5kaW5nKGluZGV4IDwgMCA/ICh0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoKSA6IGluZGV4KTsKKwkgICAgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGNvZGVnZW5GaWVsZC5kZWNsYXJpbmdDbGFzczsKKwkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpIHsKKwkJICAgIHNldFN5bnRoZXRpY0FjY2Vzc29yKGZpZWxkQmluZGluZywgaW5kZXgsICgoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoY29kZWdlbkZpZWxkLCBpbmRleCA+PSAwIC8qcmVhZC1hY2Nlc3M/Ki8sIGZhbHNlIC8qbm90IHN1cGVyIGFjY2VzcyovKSk7CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkQWNjZXNzKGNvZGVnZW5GaWVsZCwgdGhpcywgaW5kZXggPj0gMCAvKnJlYWQtYWNjZXNzPyovKTsKIAkJCXJldHVybjsKIAkJfQogCX0gZWxzZSBpZiAoZmllbGRCaW5kaW5nLmlzUHJvdGVjdGVkKCkpewogCSAgICBpbnQgZGVwdGggPSAoaW5kZXggPT0gMCB8fCAoaW5kZXggPCAwICYmIHRoaXMub3RoZXJEZXB0aHMgPT0gbnVsbCkpCi0JICAgIAkJPyAodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spID4+IEFTVE5vZGUuRGVwdGhTSElGVCAKKwkgICAgCQk/ICh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUCiAJICAgIAkJIDogdGhpcy5vdGhlckRlcHRoc1tpbmRleCA8IDAgPyB0aGlzLm90aGVyRGVwdGhzLmxlbmd0aC0xIDogaW5kZXgtMV07Ci0JCQotCQkvLyBpbXBsaWNpdCBwcm90ZWN0ZWQgYWNjZXNzIAorCisJCS8vIGltcGxpY2l0IHByb3RlY3RlZCBhY2Nlc3MKIAkJaWYgKGRlcHRoID4gMCAmJiAoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKSAhPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFBhY2thZ2UoKSkpIHsKLQkJICAgIEZpZWxkQmluZGluZyBzb21lQ29kZWdlbkJpbmRpbmcgPSBnZXRDb2RlZ2VuQmluZGluZyhpbmRleCA8IDAgPyAodGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aCkgOiBpbmRleCk7Ci0JCSAgICBzZXRTeW50aGV0aWNBY2Nlc3NvcihmaWVsZEJpbmRpbmcsIGluZGV4LCAKLQkJICAgICAgICAgICAgKChTb3VyY2VUeXBlQmluZGluZykgY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoZGVwdGgpKS5hZGRTeW50aGV0aWNNZXRob2Qoc29tZUNvZGVnZW5CaW5kaW5nLCBpbmRleCA+PSAwIC8qcmVhZC1hY2Nlc3M/Ki8pKTsKLQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlRmllbGRBY2Nlc3Moc29tZUNvZGVnZW5CaW5kaW5nLCB0aGlzLCBpbmRleCA+PSAwIC8qcmVhZC1hY2Nlc3M/Ki8pOworCQkgICAgRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9IGdldENvZGVnZW5CaW5kaW5nKGluZGV4IDwgMCA/ICh0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoKSA6IGluZGV4KTsKKwkJICAgIHNldFN5bnRoZXRpY0FjY2Vzc29yKGZpZWxkQmluZGluZywgaW5kZXgsCisJCSAgICAgICAgICAgICgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KGRlcHRoKSkuYWRkU3ludGhldGljTWV0aG9kKGNvZGVnZW5GaWVsZCwgaW5kZXggPj0gMCAvKnJlYWQtYWNjZXNzPyovLCBmYWxzZSAvKm5vdCBzdXBlciBhY2Nlc3MqLykpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZEFjY2Vzcyhjb2RlZ2VuRmllbGQsIHRoaXMsIGluZGV4ID49IDAgLypyZWFkLWFjY2Vzcz8qLyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCi0JLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKLQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBmaWVsZCBhY2Nlc3MuCQotCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbGFzdFJlY2VpdmVyVHlwZQotCQkJJiYgIWxhc3RSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQotCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwgLy8gYXJyYXkubGVuZ3RoCi0JCQkmJiBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCk7Ci0JCWlmICgob3B0aW9ucy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMgotCQkJCSYmIChvcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80IHx8ICEoaW5kZXggPD0gMSAmJiAgdGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPT0gMSAmJiBmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkpCi0JCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzCi0JCQkJfHwgIWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSB7Ci0JCi0JCSAgICBzZXRDb2RlZ2VuQmluZGluZygKLQkJICAgICAgICAgICAgaW5kZXggPCAwID8gKHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgpIDogaW5kZXgsIAotCQkgICAgICAgICAgICBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoCi0JCSAgICAgICAgICAgICAgICAgICAgZ2V0Q29kZWdlbkJpbmRpbmcoaW5kZXggPCAwID8gKHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgpIDogaW5kZXgpLCAKLQkJICAgICAgICAgICAgICAgICAgICAoUmVmZXJlbmNlQmluZGluZylsYXN0UmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSkpOwotCQl9Ci0JfQkJCQogfQogCiBwdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKQEAgLTkxNCwxMSArODQ3LDExIEBACiAJCQlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHJldHVybiB0aGlzLmNvbnN0YW50OwogCQkJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKLQkJCQlpZiAodGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwpCi0JCQkJCXJldHVybiAoKEZpZWxkQmluZGluZyl0aGlzLmJpbmRpbmcpLmNvbnN0YW50KCk7Ci0JCQkJLy8gZmFsbCB0aHJ1Ci0JCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKLQkJCQlyZXR1cm4gdGhpcy5vdGhlckJpbmRpbmdzW3RoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgtMV0uY29uc3RhbnQoKTsKKwkJCQkJaWYgKHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsKQorCQkJCQkJcmV0dXJuICgoRmllbGRCaW5kaW5nKXRoaXMuYmluZGluZykuY29uc3RhbnQoKTsKKwkJCQkJLy8kRkFMTC1USFJPVUdIJAorCQkJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbCB2YXJpYWJsZQorCQkJCQlyZXR1cm4gdGhpcy5vdGhlckJpbmRpbmdzW3RoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgtMV0uY29uc3RhbnQoKTsKIAkJfQogCX0KIAlyZXR1cm4gQ29uc3RhbnQuTm90QUNvbnN0YW50OwpAQCAtOTI5LDggKzg2Miw4IEBACiAgKi8KIHB1YmxpYyBUeXBlQmluZGluZyBwb3N0Q29udmVyc2lvblR5cGUoU2NvcGUgc2NvcGUpIHsKIAlUeXBlQmluZGluZyBjb252ZXJ0ZWRUeXBlID0gdGhpcy5yZXNvbHZlZFR5cGU7Ci0JVHlwZUJpbmRpbmcgcmVxdWlyZWRHZW5lcmljQ2FzdCA9IGdldEdlbmVyaWNDYXN0KHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzLmxlbmd0aCk7Ci0JaWYgKHJlcXVpcmVkR2VuZXJpY0Nhc3QgIT0gbnVsbCkgCisJVHlwZUJpbmRpbmcgcmVxdWlyZWRHZW5lcmljQ2FzdCA9IGdldEdlbmVyaWNDYXN0KHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgpOworCWlmIChyZXF1aXJlZEdlbmVyaWNDYXN0ICE9IG51bGwpCiAJCWNvbnZlcnRlZFR5cGUgPSByZXF1aXJlZEdlbmVyaWNDYXN0OwogCWludCBydW50aW1lVHlwZSA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0OwogCXN3aXRjaCAocnVudGltZVR5cGUpIHsKQEAgLTk1OSw3ICs4OTIsNyBAQAogCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkRPVUJMRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKLQl9CQkKKwl9CiAJaWYgKCh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQk9YSU5HKSAhPSAwKSB7CiAJCWNvbnZlcnRlZFR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGNvbnZlcnRlZFR5cGUpOwogCX0KQEAgLTk3MywxNCArOTA2LDE0IEBACiAJfQogCXJldHVybiBvdXRwdXQ7CiB9Ci0JCisKIC8qKgogICogTm9ybWFsIGZpZWxkIGJpbmRpbmcgZGlkIG5vdCB3b3JrLCB0cnkgdG8gYmluZCB0byBhIGZpZWxkIG9mIHRoZSBkZWxlZ2F0ZSByZWNlaXZlci4KICAqLwogcHVibGljIFR5cGVCaW5kaW5nIHJlcG9ydEVycm9yKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAlpZiAodGhpcy5iaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUZpZWxkQmluZGluZykgewogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKTsKLQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyB8fCB0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBNaXNzaW5nVHlwZUJpbmRpbmcpIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOwogCX0gZWxzZSB7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucmVzb2x2YWJsZVJlZmVyZW5jZSh0aGlzLCB0aGlzLmJpbmRpbmcpOwpAQCAtOTkxLDc2ICs5MjQsMTAxIEBACiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCS8vIGZpZWxkIGFuZC9vciBsb2NhbCBhcmUgZG9uZSBiZWZvcmUgdHlwZSBsb29rdXBzCiAJLy8gdGhlIG9ubHkgYXZhaWxhYmxlIHZhbHVlIGZvciB0aGUgcmVzdHJpY3RpdmVGbGFnIEJFRk9SRQotCS8vIHRoZSBUQyBpcyBGbGFnX1R5cGUgRmxhZ19Mb2NhbEZpZWxkIGFuZCBGbGFnX1R5cGVMb2NhbEZpZWxkIAorCS8vIHRoZSBUQyBpcyBGbGFnX1R5cGUgRmxhZ19Mb2NhbEZpZWxkIGFuZCBGbGFnX1R5cGVMb2NhbEZpZWxkCiAJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdSZWNlaXZlclR5cGUoKTsKIAl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEJpbmRpbmcodGhpcy50b2tlbnMsIHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSywgdGhpcywgdHJ1ZSAvKnJlc29sdmUqLykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwlpZiAoKHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEJpbmRpbmcodGhpcy50b2tlbnMsIHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSywgdGhpcywgdHJ1ZSAvKnJlc29sdmUqLykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJCWNhc2UgQmluZGluZy5WQVJJQUJMRSA6IC8vPT09PT09PT09PT09b25seSB2YXJpYWJsZT09PT09PT09PT09CiAJCQljYXNlIEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuVkFSSUFCTEUgOgogCQkJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgewotCQkJCQlpZiAoISgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZykuaXNGaW5hbCgpICYmICgodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spICE9IDApKQotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90UmVmZXJUb05vbkZpbmFsT3V0ZXJMb2NhbCgKLQkJCQkJCQkoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZywKLQkJCQkJCQl0aGlzKTsKIAkJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKIAkJCQkJdGhpcy5iaXRzIHw9IEJpbmRpbmcuTE9DQUw7Ci0JCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CisJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQkJCWlmICghbG9jYWwuaXNGaW5hbCgpICYmICgodGhpcy5iaXRzICYgQVNUTm9kZS5EZXB0aE1BU0spICE9IDApKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RSZWZlclRvTm9uRmluYWxPdXRlckxvY2FsKChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nLCB0aGlzKTsKKwkJCQkJfQorCQkJCQlpZiAobG9jYWwudHlwZSAhPSBudWxsICYmIChsb2NhbC50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQkvLyBvbmx5IGNvbXBsYWluIGlmIGZpZWxkIHJlZmVyZW5jZSAoZm9yIGxvY2FsLCBpdHMgdHlwZSBnb3QgZmxhZ2dlZCBhbHJlYWR5KQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOworCQkJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiAodGhpcy5yZXNvbHZlZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJCUZpZWxkQmluZGluZyBsYXN0RmllbGQgPSB0aGlzLm90aGVyQmluZGluZ3NbdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aCAtIDFdOworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGxhc3RGaWVsZC5kZWNsYXJpbmdDbGFzcywgbGFzdEZpZWxkLm5hbWUsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKSwgdGhpcy50b2tlbnMubGVuZ3RoLCB0aGlzLnJlc29sdmVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJCQl9CiAJCQkJaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCQkJCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cworCQkJCQl0aGlzLmJpdHMgfD0gQmluZGluZy5GSUVMRDsKIAkJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKIAkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZmllbGRCaW5kaW5nLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3M7CisJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CiAJCQkJCS8vIGNoZWNrIGZvciBmb3J3YXJkIHJlZmVyZW5jZXMKLQkJCQkJaWYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEKLQkJCQkJCQkmJiBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgPT0gZmllbGRCaW5kaW5nLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3MKKwkJCQkJaWYgKCh0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxIHx8IChmaWVsZEJpbmRpbmcubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0pICE9IDAgfHwgKCFmaWVsZEJpbmRpbmcuaXNGaW5hbCgpICYmIGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSkgLy8gZW51bSBjb25zdGFudHMgYXJlIGNoZWNrZWQgZXZlbiB3aGVuIHF1YWxpZmllZAorCQkJCQkJCSYmIHNvdXJjZVR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MKIAkJCQkJCQkmJiBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQgPj0gMAogCQkJCQkJCSYmIGZpZWxkQmluZGluZy5pZCA+PSBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQKIAkJCQkJCQkmJiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpIHx8IG1ldGhvZFNjb3BlLmlzU3RhdGljKSkgewotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yd2FyZFJlZmVyZW5jZSh0aGlzLCAwLCBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yd2FyZFJlZmVyZW5jZSh0aGlzLCB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZy0xLCBmaWVsZEJpbmRpbmcpOwogCQkJCQl9Ci0JCQkJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkgCi0JCQkJCQkJJiYgdGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPT0gMQotCQkJCQkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5VbnF1YWxpZmllZEZpZWxkQWNjZXNzKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucXVhbGlmaWVkRmllbGRBY2Nlc3ModGhpcywgZmllbGRCaW5kaW5nKTsKKwkJCQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUsIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMuYml0cyA6IDApKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsJCiAJCQkJCX0KLQkJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKLQkJCQkJdGhpcy5iaXRzIHw9IEJpbmRpbmcuRklFTEQ7CisJCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQkJLy8gb25seSBsYXN0IGZpZWxkIGlzIGFjdHVhbGx5IGEgd3JpdGUgYWNjZXNzIGlmIGFueQorCQkJCQkJLy8gY2hlY2sgaWYgYWNjZXNzaW5nIGVudW0gc3RhdGljIGZpZWxkIGluIGluaXRpYWxpemVyCisJCQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpIHsKKwkJCQkJCQlpZiAoKHNvdXJjZVR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgfHwgc291cmNlVHlwZS5zdXBlcmNsYXNzID09IGRlY2xhcmluZ0NsYXNzKSAvLyBlbnVtIGNvbnN0YW50IGJvZHkKKwkJCQkJCQkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCgpID09IENvbnN0YW50Lk5vdEFDb25zdGFudAorCQkJCQkJCQkJJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljCisJCQkJCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7CisJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVudW1TdGF0aWNGaWVsZFVzZWREdXJpbmdJbml0aWFsaXphdGlvbihmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmICh0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA+IDEKKwkJCQkJCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlCisJCQkJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShzY29wZSkpIHsKKwkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmRpcmVjdEFjY2Vzc1RvU3RhdGljRmllbGQodGhpcywgZmllbGRCaW5kaW5nKTsKKwkJCQkJCX0JCQkJCQkKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxICYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5VbnF1YWxpZmllZEZpZWxkQWNjZXNzKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKKwkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnF1YWxpZmllZEZpZWxkQWNjZXNzKHRoaXMsIGZpZWxkQmluZGluZyk7CisJCQkJCQl9CisJCQkJCQkvL211c3QgY2hlY2sgZm9yIHRoZSBzdGF0aWMgc3RhdHVzLi4uLgorCQkJCQkJaWYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSAgLy9hY2Nlc3NpbmcgdG8gYSBmaWVsZCB1c2luZyBhIHR5cGUgYXMgInJlY2VpdmVyIiBpcyBhbGxvd2VkIG9ubHkgd2l0aCBzdGF0aWMgZmllbGQKKwkJCQkJCQkJIHx8IHNjb3BlLm1ldGhvZFNjb3BlKCkuaXNTdGF0aWMpIHsgCS8vIHRoZSBmaWVsZCBpcyB0aGUgZmlyc3QgdG9rZW4gb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UuLi4uCisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKHRoaXMsIGZpZWxkQmluZGluZyk7CisJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQkgfQorCQkJCQl9CiAJCQkJCQotLy8JCQkJCQkvLyBjaGVjayBmb3IgZGVwcmVjYXRlZCByZWNlaXZlciB0eXBlCi0vLwkJCQkJCS8vIGRlcHJlY2F0aW9uIGNoZWNrIGZvciByZWNlaXZlciB0eXBlIGlmIG5vdCBmaXJzdCB0b2tlbgotLy8JCQkJCQlpZiAoaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSkgewotLy8JCQkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHNjb3BlKSkKLS8vCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcyk7Ci0vLwkJCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CisJCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKHNjb3BlKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlICE9IG51bGwKKwkJCQkJCQkmJiAodGhpcy5yZXNvbHZlZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJCUZpZWxkQmluZGluZyBsYXN0RmllbGQgPSB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSB0aGlzLnRva2Vucy5sZW5ndGggPyAoRmllbGRCaW5kaW5nKXRoaXMuYmluZGluZyA6IHRoaXMub3RoZXJCaW5kaW5nc1t0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoIC0gMV07CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcobGFzdEZpZWxkLmRlY2xhcmluZ0NsYXNzLCBsYXN0RmllbGQubmFtZSwgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpLCB0aGlzLnRva2Vucy5sZW5ndGgsIHRoaXMucmVzb2x2ZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpOworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJCX0KIAkJCQkvLyB0aHVzIGl0IHdhcyBhIHR5cGUKIAkJCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cwogCQkJCXRoaXMuYml0cyB8PSBCaW5kaW5nLlRZUEU7CisJCQkJLy8kRkFMTC1USFJPVUdIJAogCQkJY2FzZSBCaW5kaW5nLlRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KIAkJCSAgICBUeXBlQmluZGluZyB0eXBlID0gKFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CiAvLwkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodHlwZSwgc2NvcGUpKQogLy8JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0eXBlLCB0aGlzKTsKLQkJCQl0eXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGUpOworCQkJCXR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodHlwZSwgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CiAJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdHlwZTsKIAkJfQogCX0KIAkvLz09PT09PT09ZXJyb3IgY2FzZXM9PT09PT09PT09PT09PT0KLQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLnJlcG9ydEVycm9yKHNjb3BlKTsKLX0KLQotLy8gc2V0IHRoZSBtYXRjaGluZyBjb2RlZ2VuQmluZGluZyBhbmQgZ2VuZXJpYyBjYXN0Ci1wcm90ZWN0ZWQgdm9pZCBzZXRDb2RlZ2VuQmluZGluZyhpbnQgaW5kZXgsIEZpZWxkQmluZGluZyBzb21lQ29kZWdlbkJpbmRpbmcpIHsKLQlpZiAoaW5kZXggPT0gMCl7Ci0JCXRoaXMuY29kZWdlbkJpbmRpbmcgPSBzb21lQ29kZWdlbkJpbmRpbmc7Ci0JfSBlbHNlIHsKLQkgICAgaW50IGxlbmd0aCA9IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7Ci0JCWlmICh0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IHRoaXMub3RoZXJCaW5kaW5ncyl7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub3RoZXJCaW5kaW5ncywgMCwgdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJfQotCQl0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2luZGV4LTFdID0gc29tZUNvZGVnZW5CaW5kaW5nOwotCX0JICAgIAorCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlcG9ydEVycm9yKHNjb3BlKTsKIH0KIAogcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgaW5kZXgpIHsKQEAgLTEwNjksNiArMTAyNyw3IEBACiAKIC8vIHNldCB0aGUgbWF0Y2hpbmcgY29kZWdlbkJpbmRpbmcgYW5kIGdlbmVyaWMgY2FzdAogcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJpY0Nhc3QoaW50IGluZGV4LCBUeXBlQmluZGluZyBzb21lR2VuZXJpY0Nhc3QpIHsKKwlpZiAoc29tZUdlbmVyaWNDYXN0ID09IG51bGwpIHJldHVybjsKIAlpZiAoaW5kZXggPT0gMCl7CiAJCXRoaXMuZ2VuZXJpY0Nhc3QgPSBzb21lR2VuZXJpY0Nhc3Q7CiAJfSBlbHNlIHsKQEAgLTEwNzYsNyArMTAzNSw3IEBACiAJICAgICAgICB0aGlzLm90aGVyR2VuZXJpY0Nhc3RzID0gbmV3IFR5cGVCaW5kaW5nW3RoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGhdOwogCSAgICB9CiAJICAgIHRoaXMub3RoZXJHZW5lcmljQ2FzdHNbaW5kZXgtMV0gPSBzb21lR2VuZXJpY0Nhc3Q7Ci0JfQkgICAgCisJfQogfQogCiAvLyBzZXQgdGhlIG1hdGNoaW5nIHN5bnRoZXRpYyBhY2Nlc3NvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhCmluZGV4IGY4Nzk1ZGEuLmM3YmMxNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNTkgKzE0LDU1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgZXh0ZW5kcyBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHsKLQkKLQlwdWJsaWMgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UoVHlwZVJlZmVyZW5jZSBuYW1lLCBpbnQgcG9zLCBpbnQgc291cmNlRW5kKSB7Ci0JCXN1cGVyKG5hbWUsIHBvcywgc291cmNlRW5kKTsKKworcHVibGljIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgbmFtZSwgaW50IHBvcywgaW50IHNvdXJjZUVuZCkgeworCXN1cGVyKG5hbWUsIHBvcywgc291cmNlRW5kKTsKK30KKworcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKworcHVibGljIGJvb2xlYW4gaXNUaGlzKCkgeworCXJldHVybiBmYWxzZTsKK30KKworcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCXJldHVybiB0aGlzLnF1YWxpZmljYXRpb24ucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIi5zdXBlciIpOyAvLyROT04tTkxTLTEkCit9CisKK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJaWYgKCh0aGlzLmJpdHMgJiBQYXJlbnRoZXNpemVkTUFTSykgIT0gMCkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiBudWxsOwogCX0KKwlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisJaWYgKHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlID09IG51bGwpCisJCXJldHVybiBudWxsOyAvLyBlcnJvciBjYXNlCiAKLQlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyKCkgewotCi0JCXJldHVybiB0cnVlOworCWlmICh0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0KSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdCh0aGlzKTsKKwkJcmV0dXJuIG51bGw7CiAJfQorCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlLnN1cGVyY2xhc3MoKTsKK30KIAotCXB1YmxpYyBib29sZWFuIGlzVGhpcygpIHsKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKAorCUFTVFZpc2l0b3IgdmlzaXRvciwKKwlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAotCQlyZXR1cm4gZmFsc2U7CisJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJdGhpcy5xdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCX0KLQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQotCQlyZXR1cm4gcXVhbGlmaWNhdGlvbi5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgiLnN1cGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQotCQlpZiAoKHRoaXMuYml0cyAmIFBhcmVudGhlc2l6ZWRNQVNLKSAhPSAwKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGhpcyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmIChjdXJyZW50Q29tcGF0aWJsZVR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvciBjYXNlCi0KLQkJaWYgKGN1cnJlbnRDb21wYXRpYmxlVHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0KSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RVc2VTdXBlckluSmF2YUxhbmdPYmplY3QodGhpcyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBjdXJyZW50Q29tcGF0aWJsZVR5cGUuc3VwZXJjbGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKIAkJQVNUVmlzaXRvciB2aXNpdG9yLAotCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwkJQ2xhc3NTY29wZSBibG9ja1Njb3BlKSB7CiAKLQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKLQkJCXF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQl0aGlzLnF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CiAJfQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAotCQkJQVNUVmlzaXRvciB2aXNpdG9yLAotCQkJQ2xhc3NTY29wZSBibG9ja1Njb3BlKSB7Ci0KLQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKLQkJCXF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKLQl9CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVGhpc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggN2QyNmI3MS4uMTBlOTY0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTMgKzE3LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSBleHRlbmRzIFRoaXNSZWZlcmVuY2UgewotCQorCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgcXVhbGlmaWNhdGlvbjsKIAlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRDb21wYXRpYmxlVHlwZTsKLQkKKwogCXB1YmxpYyBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJCXN1cGVyKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwotCQlxdWFsaWZpY2F0aW9uID0gbmFtZTsKKwkJdGhpcy5xdWFsaWZpY2F0aW9uID0gbmFtZTsKIAkJbmFtZS5iaXRzIHw9IElnbm9yZVJhd1R5cGVDaGVjazsgLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCByYXcgdHlwZSB1c2FnZQogCQl0aGlzLnNvdXJjZVN0YXJ0ID0gbmFtZS5zb3VyY2VTdGFydDsKIAl9CkBAIC01OSw3ICs1OSw3IEBACiAKIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJaWYgKCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKIAkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0KIAkJCQkJY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCB0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZSwgY3VycmVudFNjb3BlKTsKQEAgLTczLDEzICs3MywxMyBAQAogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJLy8gWC50aGlzIGlzIG5vdCBhIHBhcmFtL3JhdyB0eXBlIGFzIGRlbm90aW5nIGVuY2xvc2luZyBpbnN0YW5jZQogCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5xdWFsaWZpY2F0aW9uLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWlmICh0eXBlID09IG51bGwgfHwgIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIG51bGw7CiAJCS8vIFgudGhpcyBpcyBub3QgYSBwYXJhbS9yYXcgdHlwZSBhcyBkZW5vdGluZyBlbmNsb3NpbmcgaW5zdGFuY2UKIAkJdHlwZSA9IHR5cGUuZXJhc3VyZSgpOwotCQkKKwogCQkvLyByZXNvbHZlZFR5cGUgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHBhcmFtZXRlcml6ZWQKIAkJaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CiAJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUGFyYW1ldGVyaXplZFR5cGUoKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGUpOwpAQCAtODcsNyArODcsNyBAQAogCQkJLy8gZXJyb3IgY2FzZQogCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0eXBlOwogCQl9Ci0JCQorCiAJCS8vIHRoZSBxdWFsaWZpY2F0aW9uIE1VU1QgZXhhY3RseSBtYXRjaCBzb21lIGVuY2xvc2luZyB0eXBlIG5hbWUKIAkJLy8gSXQgaXMgcG9zc2libGUgdG8gcXVhbGlmeSAndGhpcycgYnkgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2xhc3MKIAkJaW50IGRlcHRoID0gMDsKQEAgLTk2LDggKzk2LDggQEAKIAkJCWRlcHRoKys7CiAJCQl0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZSA9IHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlLmlzU3RhdGljKCkgPyBudWxsIDogdGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUuZW5jbG9zaW5nVHlwZSgpOwogCQl9Ci0JCWJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CQkJCi0JCWJpdHMgfD0gKGRlcHRoICYgMHhGRikgPDwgRGVwdGhTSElGVDsgLy8gZW5jb2RlZCBkZXB0aCBpbnRvIDggYml0cworCQl0aGlzLmJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CisJCXRoaXMuYml0cyB8PSAoZGVwdGggJiAweEZGKSA8PCBEZXB0aFNISUZUOyAvLyBlbmNvZGVkIGRlcHRoIGludG8gOCBiaXRzCiAKIAkJaWYgKHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlID09IG51bGwpIHsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vU3VjaEVuY2xvc2luZ0luc3RhbmNlKHR5cGUsIHRoaXMsIGZhbHNlKTsKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAJCWlmIChkZXB0aCA9PSAwKSB7CiAJCQljaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKTsKIAkJfSAvLyBpZiBkZXB0aD4wLCBwYXRoIGVtdWxhdGlvbiB3aWxsIGRpYWdub3NlIGJhZCBzY2VuYXJpaQotCQkKLQkJcmV0dXJuICB0aGlzLnJlc29sdmVkVHlwZTsKKworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCi0JCXJldHVybiBxdWFsaWZpY2F0aW9uLnByaW50KDAsIG91dHB1dCkuYXBwZW5kKCIudGhpcyIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiB0aGlzLnF1YWxpZmljYXRpb24ucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIi50aGlzIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKQEAgLTEyMiwxNyArMTIyLDE3IEBACiAJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewogCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7Ci0JCQlxdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJdGhpcy5xdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoCiAJCQlBU1RWaXNpdG9yIHZpc2l0b3IsCiAJCQlDbGFzc1Njb3BlIGJsb2NrU2NvcGUpIHsKIAogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewotCQkJcXVhbGlmaWNhdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJCXRoaXMucXVhbGlmaWNhdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggMWUxMGQxYi4uZjZkNWUzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwpAQCAtMjAsMTcgKzIxLDE3IEBACiAJcHVibGljIGxvbmdbXSBzb3VyY2VQb3NpdGlvbnM7CiAKIAlwdWJsaWMgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSBzb3VyY2VzICwgbG9uZ1tdIHBvc3MpIHsKLQkJCi0JCXRva2VucyA9IHNvdXJjZXMgOwotCQlzb3VyY2VQb3NpdGlvbnMgPSBwb3NzIDsKLQkJc291cmNlU3RhcnQgPSAoaW50KSAoc291cmNlUG9zaXRpb25zWzBdPj4+MzIpIDsKLQkJc291cmNlRW5kID0gKGludCkoc291cmNlUG9zaXRpb25zW3NvdXJjZVBvc2l0aW9ucy5sZW5ndGgtMV0gJiAweDAwMDAwMDAwRkZGRkZGRkZMICkgOworCisJCXRoaXMudG9rZW5zID0gc291cmNlcyA7CisJCXRoaXMuc291cmNlUG9zaXRpb25zID0gcG9zcyA7CisJCXRoaXMuc291cmNlU3RhcnQgPSAoaW50KSAodGhpcy5zb3VyY2VQb3NpdGlvbnNbMF0+Pj4zMikgOworCQl0aGlzLnNvdXJjZUVuZCA9IChpbnQpKHRoaXMuc291cmNlUG9zaXRpb25zW3RoaXMuc291cmNlUG9zaXRpb25zLmxlbmd0aC0xXSAmIDB4MDAwMDAwMDBGRkZGRkZGRkwgKSA7CiAJfQotCQkKKwogCXB1YmxpYyBUeXBlUmVmZXJlbmNlIGNvcHlEaW1zKGludCBkaW0pewogCQkvL3JldHVybiBhIHR5cGUgcmVmZXJlbmNlIGNvcHkgb2YgbWUgd2l0aCBzb21lIGRpbWVuc2lvbnMKIAkJLy93YXJuaW5nIDogdGhlIG5ldyB0eXBlIHJlZiBoYXMgYSBudWxsIGJpbmRpbmcKLQkJcmV0dXJuIG5ldyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBkaW0sIHNvdXJjZVBvc2l0aW9ucyk7CisJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRoaXMudG9rZW5zLCBkaW0sIHRoaXMuc291cmNlUG9zaXRpb25zKTsKIAl9CiAKIAlwcm90ZWN0ZWQgVHlwZUJpbmRpbmcgZmluZE5leHRUeXBlQmluZGluZyhpbnQgdG9rZW5JbmRleCwgU2NvcGUgc2NvcGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CkBAIC00MSwxMSArNDIsMTAgQEAKIAkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmdldFR5cGUodGhpcy50b2tlbnNbdG9rZW5JbmRleF0sIHBhY2thZ2VCaW5kaW5nKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5nZXRNZW1iZXJUeXBlKHRoaXMudG9rZW5zW3Rva2VuSW5kZXhdLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUpOwotCQkJCWlmICh0aGlzLnJlc29sdmVkVHlwZSBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCVByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHByb2JsZW1CaW5kaW5nID0gKFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZTsKKwkJCQlpZiAoIXRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCi0JCQkJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMudG9rZW5zLCAwLCB0b2tlbkluZGV4ICsgMSksCi0JCQkJCQlwcm9ibGVtQmluZGluZy5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkodGhpcy50b2tlbnMsIDAsIHRva2VuSW5kZXggKyAxKSwKKwkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKXRoaXMucmVzb2x2ZWRUeXBlLmNsb3Nlc3RNYXRjaCgpLAogCQkJCQkJdGhpcy5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkpOwogCQkJCX0KIAkJCX0KQEAgLTYyLDE0ICs2MiwxOSBAQAogCQlyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3RoLTFdOwogCX0KIAlwcm90ZWN0ZWQgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKLQkJCi0JCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKQorCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7Ci0KKwkJfQogCQlCaW5kaW5nIGJpbmRpbmcgPSBzY29wZS5nZXRQYWNrYWdlKHRoaXMudG9rZW5zKTsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiAhYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQlpZiAoYmluZGluZyAhPSBudWxsICYmICFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgJiYgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCkgeworCQkJCVByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHByb2JsZW1CaW5kaW5nID0gKFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCQkJCUJpbmRpbmcgcGtnID0gc2NvcGUuZ2V0VHlwZU9yUGFja2FnZSh0aGlzLnRva2Vucyk7CisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhwcm9ibGVtQmluZGluZy5jb21wb3VuZE5hbWUsIHBrZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nID8gbnVsbCA6IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlTWlzc2luZ1R5cGUobnVsbCwgdGhpcy50b2tlbnMpLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQl9CiAJCQlyZXR1cm4gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7IC8vIG5vdCBmb3VuZAotCisJCX0KIAkgICAgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBiaW5kaW5nID09IG51bGwgPyBudWxsIDogKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOwogCSAgICBib29sZWFuIGlzQ2xhc3NTY29wZSA9IHNjb3BlLmtpbmQgPT0gU2NvcGUuQ0xBU1NfU0NPUEU7CiAJICAgIFJlZmVyZW5jZUJpbmRpbmcgcXVhbGlmaWVkVHlwZSA9IG51bGw7CkBAIC03OSwxNiArODQsMjAgQEAKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJCQlpZiAoaSA9PSAwICYmIHRoaXMucmVzb2x2ZWRUeXBlLmlzVHlwZVZhcmlhYmxlKCkgJiYgKChUeXBlVmFyaWFibGVCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZSkuZmlyc3RCb3VuZCA9PSBudWxsKSB7IC8vIGNhbm5vdCBzZWxlY3QgZnJvbSBhIHR5cGUgdmFyaWFibGUKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsQWNjZXNzRnJvbVR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUsIHRoaXMpOwotCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IG51bGw7CisJCQkJcmV0dXJuIG51bGw7CiAJCQl9Ci0JCQlpZiAoaSA8IGxhc3QgJiYgaXNUeXBlVXNlRGVwcmVjYXRlZCh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpKSB7Ci0JCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKTsJCQkKKwkJCWlmIChpIDw9IGxhc3QgJiYgaXNUeXBlVXNlRGVwcmVjYXRlZCh0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpKSB7CisJCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlLCBpKTsKIAkJCX0KIAkJCWlmIChpc0NsYXNzU2NvcGUpCiAJCQkJaWYgKCgoQ2xhc3NTY29wZSkgc2NvcGUpLmRldGVjdEhpZXJhcmNoeUN5Y2xlKHRoaXMucmVzb2x2ZWRUeXBlLCB0aGlzKSkgLy8gbXVzdCBjb25uZWN0IGhpZXJhcmNoeSB0byBmaW5kIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMKIAkJCQkJcmV0dXJuIG51bGw7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJaWYgKHF1YWxpZmllZFR5cGUgIT0gbnVsbCkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGUuZXJhc3VyZSgpICE9IHF1YWxpZmllZFR5cGUuZXJhc3VyZSgpKSB7CisJCQkJCXF1YWxpZmllZFR5cGUgPSBlbmNsb3NpbmdUeXBlOyAvLyBpbmhlcml0ZWQgbWVtYmVyIHR5cGUsIGxlYXZlIGl0IGFzc29jaWF0ZWQgd2l0aCBpdHMgZW5jbG9zaW5nIHJhdGhlciB0aGFuIHN1YnR5cGUKKwkJCQl9CiAJCQkJYm9vbGVhbiByYXdRdWFsaWZpZWQ7CiAJCQkJaWYgKGN1cnJlbnRUeXBlLmlzR2VuZXJpY1R5cGUoKSkgewogCQkJCQlxdWFsaWZpZWRUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKGN1cnJlbnRUeXBlLCBxdWFsaWZpZWRUeXBlKTsKQEAgLTEwMCwzNSArMTA5LDM1IEBACiAJCQkJCXF1YWxpZmllZFR5cGUgPSBjdXJyZW50VHlwZTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXF1YWxpZmllZFR5cGUgPSBjdXJyZW50VHlwZS5pc0dlbmVyaWNUeXBlKCkgPyAoUmVmZXJlbmNlQmluZGluZylzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUoY3VycmVudFR5cGUpIDogY3VycmVudFR5cGU7Ci0JCQl9CQkJCisJCQkJcXVhbGlmaWVkVHlwZSA9IGN1cnJlbnRUeXBlLmlzR2VuZXJpY1R5cGUoKSA/IChSZWZlcmVuY2VCaW5kaW5nKXNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZShjdXJyZW50VHlwZSwgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLykgOiBjdXJyZW50VHlwZTsKKwkJCX0KIAkJfQogCQl0aGlzLnJlc29sdmVkVHlwZSA9IHF1YWxpZmllZFR5cGU7CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdW10gZ2V0VHlwZU5hbWUoKXsKLQkKLQkJcmV0dXJuIHRva2VuczsKKworCQlyZXR1cm4gdGhpcy50b2tlbnM7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoJy4nKTsKLQkJCW91dHB1dC5hcHBlbmQodG9rZW5zW2ldKTsKKwkJCW91dHB1dC5hcHBlbmQodGhpcy50b2tlbnNbaV0pOwogCQl9CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JlZmVyZW5jZS5qYXZhCmluZGV4IGU0MjUzNTUuLmVmOWU4ZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDEyICs3LDIzIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDE4NTY4MiAtIEluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIG1hcmsgbG9jYWwgdmFyaWFibGVzIGFzIHJlYWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLk9wY29kZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2UgZXh0ZW5kcyBFeHByZXNzaW9uICB7CiAvKioKQEAgLTI2LDQ1ICszNywxMjYgQEAKIHB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAJcmV0dXJuIGZsb3dJbmZvOwogfQorCiBwdWJsaWMgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZygpIHsKIAkvL3RoaXMgbWV0aG9kIHNob3VsZCBiZSBzZW50IG9uZSBGSUVMRC10YWdnZWQgcmVmZXJlbmNlcwogCS8vICAocmVmLmJpdHMgJiBCaW5kaW5nSWRzLkZJRUxEICE9IDApKCkKIAlyZXR1cm4gbnVsbCA7CiB9Ci1wdWJsaWMgdm9pZCBmaWVsZFN0b3JlKENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywgTWV0aG9kQmluZGluZyBzeW50aGV0aWNXcml0ZUFjY2Vzc29yLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworcHVibGljIHZvaWQgZmllbGRTdG9yZShTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywgTWV0aG9kQmluZGluZyBzeW50aGV0aWNXcml0ZUFjY2Vzc29yLCBUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIGJvb2xlYW4gaXNJbXBsaWNpdFRoaXNSZWNlaXZlciwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWlmICgoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCXN3aXRjaCAoZmllbGRCaW5kaW5nLnR5cGUuaWQpIHsKKwkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6IAorCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlpZiAoc3ludGhldGljV3JpdGVBY2Nlc3NvciA9PSBudWxsKSB7Ci0JCQljb2RlU3RyZWFtLnB1dHN0YXRpYyhmaWVsZEJpbmRpbmcpOworCQkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgZmllbGRCaW5kaW5nLCByZWNlaXZlclR5cGUsIGlzSW1wbGljaXRUaGlzUmVjZWl2ZXIpOworCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19wdXRzdGF0aWMsIGZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljV3JpdGVBY2Nlc3Nvcik7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KIAl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bbmV3IGZpZWxkIHZhbHVlXSAgLS0tPiBbbmV3IGZpZWxkIHZhbHVlXVtvd25lcl1bbmV3IGZpZWxkIHZhbHVlXQogCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOwotCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJc3dpdGNoIChmaWVsZEJpbmRpbmcudHlwZS5pZCkgeworCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDogCisJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCWlmIChzeW50aGV0aWNXcml0ZUFjY2Vzc29yID09IG51bGwpIHsKLQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGZpZWxkQmluZGluZywgcmVjZWl2ZXJUeXBlLCBpc0ltcGxpY2l0VGhpc1JlY2VpdmVyKTsKKwkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfcHV0ZmllbGQsIGZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljV3JpdGVBY2Nlc3Nvcik7CisJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KIAl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KKwogcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKTsKIAogcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpOwogCiBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCk7CisKKy8qIHJlcG9ydCBpZiBhIHByaXZhdGUgZmllbGQgaXMgb25seSByZWFkIGZyb20gYSAnc3BlY2lhbCBvcGVyYXRvcicsCisgKiBpLmUuLCBpbiBhIHBvc3RJbmNyZW1lbnQgZXhwcmVzc2lvbiBvciBhIGNvbXBvdW5kIGFzc2lnbm1lbnQsCisgKiB3aGVyZSB0aGUgaW5mb3JtYXRpb24gaXMgbmV2ZXIgZmxvd2luZyBvdXQgb2ZmIHRoZSBmaWVsZC4gKi8KK3ZvaWQgcmVwb3J0T25seVVzZWxlc3NseVJlYWRQcml2YXRlRmllbGQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCS8vIGFjY2VzcyBpcyByZWxldmFudCwgdHVybiBjb21wb3VuZCB1c2UgaW50byByZWFsIHVzZToKKwkJZmllbGRCaW5kaW5nLmNvbXBvdW5kVXNlRmxhZyA9IDA7CisJCWZpZWxkQmluZGluZy5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKKwl9IGVsc2UgeworCQlpZiAoZmllbGRCaW5kaW5nLmlzVXNlZE9ubHlJbkNvbXBvdW5kKCkpIHsKKwkJCWZpZWxkQmluZGluZy5jb21wb3VuZFVzZUZsYWctLTsgLy8gY29uc3VtZSBvbmUKKwkJCWlmIChmaWVsZEJpbmRpbmcuY29tcG91bmRVc2VGbGFnID09IDAJCQkJCS8vIHJlcG9ydCBvbmx5IHRoZSBsYXN0IHVzYWdlCisJCQkJCSYmIGZpZWxkQmluZGluZy5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkgCisJCQkJCSYmICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpID09IDApIC8vIGRvbid0IHJlcG9ydCBpZiB1bmJveGluZyBpcyBpbnZvbHZlZCAobWlnaHQgY2F1c2UgTlBFKQorCQkJeworCQkJCS8vIGNvbXBvdW5kQXNzaWdubWVudC9wb3N0SW5jcmVtZW50IGlzIHRoZSBvbmx5IHVzYWdlIG9mIHRoaXMgZmllbGQKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZUZpZWxkKGZpZWxkQmluZGluZy5zb3VyY2VGaWVsZCgpKTsKKwkJCQlmaWVsZEJpbmRpbmcubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7IC8vIGRvbid0IHJlcG9ydCBhZ2FpbgorCQkJfQorCQl9CisJfQorfQorLyogcmVwb3J0IGEgbG9jYWwvYXJnIHRoYXQgaXMgb25seSByZWFkIGZyb20gYSAnc3BlY2lhbCBvcGVyYXRvcicsCisgKiBpLmUuLCBpbiBhIHBvc3RJbmNyZW1lbnQgZXhwcmVzc2lvbiBvciBhIGNvbXBvdW5kIGFzc2lnbm1lbnQsCisgKiB3aGVyZSB0aGUgaW5mb3JtYXRpb24gaXMgbmV2ZXIgZmxvd2luZyBvdXQgb2ZmIHRoZSBsb2NhbC9hcmcuICovCitzdGF0aWMgdm9pZCByZXBvcnRPbmx5VXNlbGVzc2x5UmVhZExvY2FsKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWlmIChsb2NhbEJpbmRpbmcuZGVjbGFyYXRpb24gPT0gbnVsbCkKKwkJcmV0dXJuOyAgLy8gc2VjcmV0IGxvY2FsCisJaWYgKChsb2NhbEJpbmRpbmcuZGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlKSA9PSAwKQorCQlyZXR1cm47ICAvLyBkZWNsYXJhdGlvbiBpcyB1bnJlYWNoYWJsZQorCWlmIChsb2NhbEJpbmRpbmcudXNlRmxhZyA+PSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEKQorCQlyZXR1cm47ICAvLyB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY2FzZXMgd2l0aCBvbmx5IGNvbXBvdW5kIGFjY2VzcyAobmVnYXRpdmUgY291bnQpCisKKwlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkvLyBhY2Nlc3MgaXMgcmVsZXZhbnQKKwkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJbG9jYWxCaW5kaW5nLnVzZUZsYWcrKzsKKwkJaWYgKGxvY2FsQmluZGluZy51c2VGbGFnICE9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgLy8gaGF2ZSBhbGwgbmVnYXRpdmUgY291bnRzIGJlZW4gY29uc3VtZWQ/CisJCQlyZXR1cm47IC8vIHN0aWxsIHdhaXRpbmcgdG8gc2VlIG1vcmUgdXNhZ2VzIG9mIHRoaXMga2luZAorCX0KKwkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmVwb3J0CisJaWYgKGxvY2FsQmluZGluZy5kZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFyZ3VtZW50KSB7CisJCS8vIGNoZWNrIGNvbXBpbGVyIG9wdGlvbnMgdG8gcmVwb3J0IGFnYWluc3QgdW51c2VkIGFyZ3VtZW50cworCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpOworCQlpZiAobWV0aG9kU2NvcGUgIT0gbnVsbCkgeworCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCgpKS5iaW5kaW5nOworCQkJCisJCQlib29sZWFuIHNob3VsZFJlcG9ydCA9ICFtZXRob2QuaXNNYWluKCk7CisJCQlpZiAobWV0aG9kLmlzSW1wbGVtZW50aW5nKCkpIHsKKwkJCQlzaG91bGRSZXBvcnQgJj0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdDsKKwkJCX0gZWxzZSBpZiAobWV0aG9kLmlzT3ZlcnJpZGluZygpKSB7CisJCQkJc2hvdWxkUmVwb3J0ICY9IGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlOworCQkJfQorCQkJCisJCQlpZiAoc2hvdWxkUmVwb3J0KSB7CisJCQkJLy8gcmVwb3J0IHRoZSBjYXNlIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgdW5yZWFkIGV4Y2VwdCB0aHJvdWdoIGEgc3BlY2lhbCBvcGVyYXRvcgorCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRBcmd1bWVudChsb2NhbEJpbmRpbmcuZGVjbGFyYXRpb24pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLy8gcmVwb3J0IHRoZSBjYXNlIG9mIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBpcyB1bnJlYWQgZXhjZXB0IGZvciBhIHNwZWNpYWwgb3BlcmF0b3IKKwkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLmRlY2xhcmF0aW9uKTsKKwl9CisJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOyAvLyBkb24ndCByZXBvcnQgYWdhaW4KK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmV0dXJuU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JldHVyblN0YXRlbWVudC5qYXZhCmluZGV4IGFjZGJmNWUuLmIzZjJlZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmV0dXJuU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDIzICs3LDIzIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAzMTkyMDEgLSBbbnVsbF0gbm8gd2FybmluZyB3aGVuIHVuYm94aW5nIFNpbmdsZU5hbWVSZWZlcmVuY2UgY2F1c2VzIE5QRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBjbGFzcyBSZXR1cm5TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAJcHVibGljIFN1YlJvdXRpbmVTdGF0ZW1lbnRbXSBzdWJyb3V0aW5lczsKIAlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgc2F2ZVZhbHVlVmFyaWFibGU7CiAJcHVibGljIGludCBpbml0U3RhdGVJbmRleCA9IC0xOwotCQorCiBwdWJsaWMgUmV0dXJuU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwogCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOwpAQCAtMzcsNiArMzcsOSBAQAogCiAJaWYgKHRoaXMuZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAJCWZsb3dJbmZvID0gdGhpcy5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJaWYgKCh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeworCQkJdGhpcy5leHByZXNzaW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJfQogCX0KIAl0aGlzLmluaXRTdGF0ZUluZGV4ID0KIAkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOwpAQCAtNDQsOSArNDcsNyBAQAogCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSBmbG93Q29udGV4dDsKIAlpbnQgc3ViQ291bnQgPSAwOwogCWJvb2xlYW4gc2F2ZVZhbHVlTmVlZGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBoYXNWYWx1ZVRvU2F2ZSA9IHRoaXMuZXhwcmVzc2lvbiAhPSBudWxsIAotCQkJCQkJJiYgdGhpcy5leHByZXNzaW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCAKLQkJCQkJCSYmICEodGhpcy5leHByZXNzaW9uIGluc3RhbmNlb2YgTnVsbExpdGVyYWwpOworCWJvb2xlYW4gaGFzVmFsdWVUb1NhdmUgPSBuZWVkVmFsdWVTdG9yZSgpOwogCWRvIHsKIAkJU3ViUm91dGluZVN0YXRlbWVudCBzdWI7CiAJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJyb3V0aW5lKCkpICE9IG51bGwpIHsKQEAgLTc3LDYgKzc4LDggQEAKIAkJCQkJCXByZXBhcmVTYXZlVmFsdWVMb2NhdGlvbih0cnlTdGF0ZW1lbnQpOwogCQkJCQl9CiAJCQkJCXNhdmVWYWx1ZU5lZWRlZCA9IHRydWU7CisJCQkJCXRoaXMuaW5pdFN0YXRlSW5kZXggPQorCQkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmICh0cmF2ZXJzZWRDb250ZXh0IGluc3RhbmNlb2YgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCkgewpAQCAtODQsNyArODcsNyBAQAogCQkJCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKIAkJfQogCX0gd2hpbGUgKCh0cmF2ZXJzZWRDb250ZXh0ID0gdHJhdmVyc2VkQ29udGV4dC5wYXJlbnQpICE9IG51bGwpOwotCQorCiAJLy8gcmVzaXplIHN1YnJvdXRpbmVzCiAJaWYgKCh0aGlzLnN1YnJvdXRpbmVzICE9IG51bGwpICYmIChzdWJDb3VudCAhPSB0aGlzLnN1YnJvdXRpbmVzLmxlbmd0aCkpIHsKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1YnJvdXRpbmVzLCAwLCAodGhpcy5zdWJyb3V0aW5lcyA9IG5ldyBTdWJSb3V0aW5lU3RhdGVtZW50W3N1YkNvdW50XSksIDAsIHN1YkNvdW50KTsKQEAgLTEwMyw3ICsxMDYsNyBAQAogCX0KIAlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7CiB9Ci0gCisKIC8qKgogICogUmV0cnVuIHN0YXRlbWVudCBjb2RlIGdlbmVyYXRpb24KICAqCkBAIC0xMTksMTIgKzEyMiwxMiBAQAogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJYm9vbGVhbiBhbHJlYWR5R2VuZXJhdGVkRXhwcmVzc2lvbiA9IGZhbHNlOwogCS8vIGdlbmVyYXRlIHRoZSBleHByZXNzaW9uCi0JaWYgKCh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkgJiYgKHRoaXMuZXhwcmVzc2lvbi5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmICEodGhpcy5leHByZXNzaW9uIGluc3RhbmNlb2YgTnVsbExpdGVyYWwpKSB7CisJaWYgKG5lZWRWYWx1ZVN0b3JlKCkpIHsKIAkJYWxyZWFkeUdlbmVyYXRlZEV4cHJlc3Npb24gPSB0cnVlOwogCQl0aGlzLmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbmVlZFZhbHVlKCkpOyAvLyBubyB2YWx1ZSBuZWVkZWQgaWYgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lCiAJCWdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShjb2RlU3RyZWFtKTsKIAl9Ci0JCisKIAkvLyBnZW5lcmF0aW9uIG9mIGNvZGUgcmVzcG9uc2libGUgZm9yIGludm9raW5nIHRoZSBmaW5hbGx5IGJsb2NrcyBpbiBzZXF1ZW5jZQogCWlmICh0aGlzLnN1YnJvdXRpbmVzICE9IG51bGwpIHsKIAkJT2JqZWN0IHJldXNhYmxlSlNSVGFyZ2V0ID0gdGhpcy5leHByZXNzaW9uID09IG51bGwgPyAoT2JqZWN0KVR5cGVCaW5kaW5nLlZPSUQgOiB0aGlzLmV4cHJlc3Npb24ucmV1c2FibGVKU1JUYXJnZXQoKTsKQEAgLTE0NCwxNyArMTQ3LDE3IEBACiAJfQogCWlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCAmJiAhYWxyZWFkeUdlbmVyYXRlZEV4cHJlc3Npb24pIHsKIAkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlnZW5lcmF0ZVN0b3JlU2F2ZVZhbHVlSWZOZWNlc3NhcnkoY29kZVN0cmVhbSk7CQorCQlnZW5lcmF0ZVN0b3JlU2F2ZVZhbHVlSWZOZWNlc3NhcnkoY29kZVN0cmVhbSk7CiAJfQogCS8vIG91dHB1dCB0aGUgc3VpdGFibGUgcmV0dXJuIGJ5dGVjb2RlIG9yIHdyYXAgdGhlIHZhbHVlIGluc2lkZSBhIGRlc2NyaXB0b3IgZm9yIGRvaXRzCi0JdGhpcy5nZW5lcmF0ZVJldHVybkJ5dGVjb2RlKGNvZGVTdHJlYW0pOworCWdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUoY29kZVN0cmVhbSk7CiAJaWYgKHRoaXMuc2F2ZVZhbHVlVmFyaWFibGUgIT0gbnVsbCkgewogCQljb2RlU3RyZWFtLnJlbW92ZVZhcmlhYmxlKHRoaXMuc2F2ZVZhbHVlVmFyaWFibGUpOwotCX0JCisJfQogCWlmICh0aGlzLmluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5pbml0U3RhdGVJbmRleCk7CiAJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5pbml0U3RhdGVJbmRleCk7Ci0JfQkKKwl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAlTdWJSb3V0aW5lU3RhdGVtZW50LnJlZW50ZXJBbGxFeGNlcHRpb25IYW5kbGVycyh0aGlzLnN1YnJvdXRpbmVzLCAtMSwgY29kZVN0cmVhbSk7CiB9CkBAIC0xNzMsOCArMTc2LDE0IEBACiAJfQogfQogCitwcml2YXRlIGJvb2xlYW4gbmVlZFZhbHVlU3RvcmUoKSB7CisJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbiAhPSBudWxsCisJCQkJCSYmICh0aGlzLmV4cHJlc3Npb24uY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50IHx8ICh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5CT1hJTkcpIT0gMCkKKwkJCQkJJiYgISh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCk7Cit9CisKIHB1YmxpYyBib29sZWFuIG5lZWRWYWx1ZSgpIHsKLQlyZXR1cm4gdGhpcy5zYXZlVmFsdWVWYXJpYWJsZSAhPSBudWxsIAorCXJldHVybiB0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlICE9IG51bGwKIAkJCQkJfHwgKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNTeW5jaHJvbml6ZWQpICE9IDAKIAkJCQkJfHwgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzQW55U3ViUm91dGluZUVzY2FwaW5nKSA9PSAwKTsKIH0KQEAgLTE5NSw4ICsyMDQsOCBAQAogCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsKIAlUeXBlQmluZGluZyBtZXRob2RUeXBlID0KIAkJKG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKQotCQkJPyAoKG1ldGhvZEJpbmRpbmcgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmcpID09IG51bGwgCi0JCQkJPyBudWxsIAorCQkJPyAoKG1ldGhvZEJpbmRpbmcgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmcpID09IG51bGwKKwkJCQk/IG51bGwKIAkJCQk6IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSkKIAkJCTogVHlwZUJpbmRpbmcuVk9JRDsKIAlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZTsKQEAgLTIxOCw3ICsyMjcsNyBAQAogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hdHRlbXB0VG9SZXR1cm5Wb2lkVmFsdWUodGhpcyk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKG1ldGhvZFR5cGUgPT0gbnVsbCkgCisJaWYgKG1ldGhvZFR5cGUgPT0gbnVsbCkKIAkJcmV0dXJuOwogCiAJaWYgKG1ldGhvZFR5cGUgIT0gZXhwcmVzc2lvblR5cGUpIC8vIG11c3QgY2FsbCBiZWZvcmUgY29tcHV0ZUNvbnZlcnNpb24oKSBhbmQgdHlwZU1pc21hdGNoRXJyb3IoKQpAQCAtMjMwLDIzICsyMzksMjIgQEAKIAkJaWYgKGV4cHJlc3Npb25UeXBlLm5lZWRzVW5jaGVja2VkQ29udmVyc2lvbihtZXRob2RUeXBlKSkgewogCQkgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlVHlwZUNvbnZlcnNpb24odGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgbWV0aG9kVHlwZSk7CiAJCX0KLQkJaWYgKHRoaXMuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uIAorCQlpZiAodGhpcy5leHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24KIAkJCQkmJiAodGhpcy5leHByZXNzaW9uLmJpdHMgJiAoQVNUTm9kZS5Vbm5lY2Vzc2FyeUNhc3R8QVNUTm9kZS5EaXNhYmxlVW5uZWNlc3NhcnlDYXN0Q2hlY2spKSA9PSAwKSB7CiAJCQlDYXN0RXhwcmVzc2lvbi5jaGVja05lZWRGb3JBc3NpZ25lZENhc3Qoc2NvcGUsIG1ldGhvZFR5cGUsIChDYXN0RXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uKTsKLQkJfQkJCQorCQl9CiAJCXJldHVybjsKLQl9IGVsc2UgaWYgKHNjb3BlLmlzQm94aW5nQ29tcGF0aWJsZVdpdGgoZXhwcmVzc2lvblR5cGUsIG1ldGhvZFR5cGUpCi0JCQkJCQl8fCAoZXhwcmVzc2lvblR5cGUuaXNCYXNlVHlwZSgpICAvLyBuYXJyb3dpbmcgdGhlbiBib3hpbmcgPwotCQkJCQkJCQkmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81IC8vIGF1dG9ib3hpbmcKLQkJCQkJCQkJJiYgIW1ldGhvZFR5cGUuaXNCYXNlVHlwZSgpCi0JCQkJCQkJCSYmIHRoaXMuZXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGV4cHJlc3Npb25UeXBlLCBzY29wZS5lbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKG1ldGhvZFR5cGUpKSkpIHsKKwl9IGVsc2UgaWYgKGlzQm94aW5nQ29tcGF0aWJsZShleHByZXNzaW9uVHlwZSwgbWV0aG9kVHlwZSwgdGhpcy5leHByZXNzaW9uLCBzY29wZSkpIHsKIAkJdGhpcy5leHByZXNzaW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBtZXRob2RUeXBlLCBleHByZXNzaW9uVHlwZSk7Ci0JCWlmICh0aGlzLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbiAKKwkJaWYgKHRoaXMuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uCiAJCQkJJiYgKHRoaXMuZXhwcmVzc2lvbi5iaXRzICYgKEFTVE5vZGUuVW5uZWNlc3NhcnlDYXN0fEFTVE5vZGUuRGlzYWJsZVVubmVjZXNzYXJ5Q2FzdENoZWNrKSkgPT0gMCkgewogCQkJQ2FzdEV4cHJlc3Npb24uY2hlY2tOZWVkRm9yQXNzaWduZWRDYXN0KHNjb3BlLCBtZXRob2RUeXBlLCAoQ2FzdEV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvbik7CiAJCX0JCQlyZXR1cm47CiAJfQotCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGV4cHJlc3Npb25UeXBlLCBtZXRob2RUeXBlLCB0aGlzLmV4cHJlc3Npb24pOworCWlmICgobWV0aG9kVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgPT0gMCkgeworCQkvLyBubyBuZWVkIHRvIGNvbXBsYWluIGlmIHJldHVybiB0eXBlIHdhcyBtaXNzaW5nIChhdm9pZCBzZWNvbmRhcnkgZXJyb3IgOiAyMjA5NjcpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGV4cHJlc3Npb25UeXBlLCBtZXRob2RUeXBlLCB0aGlzLmV4cHJlc3Npb24sIG51bGwpOworCX0KIH0KIAogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU1lbWJlckFubm90YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCmluZGV4IDkwYzlhNDAuLmU2NGJmMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDcgKzE3LDcgQEAKICAqIFNpbmdsZU1lbWJlckFubm90YXRpb24gbm9kZQogICovCiBwdWJsaWMgY2xhc3MgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewotCQorCiAJcHVibGljIEV4cHJlc3Npb24gbWVtYmVyVmFsdWU7CiAJcHJpdmF0ZSBNZW1iZXJWYWx1ZVBhaXJbXSBzaW5nbGVQYWlyczsgLy8gZmFrZSBwYWlyIHNldCwgb25seSB2YWx1ZSBoYXMgYWNjdXJhdGUgcG9zaXRpb25zCiAKQEAgLTM2LDIzICszNiwyNiBAQAogCSAqLwogCXB1YmxpYyBNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzKCkgewogCQlpZiAodGhpcy5zaW5nbGVQYWlycyA9PSBudWxsKSB7Ci0JCQl0aGlzLnNpbmdsZVBhaXJzID0gIAotCQkJCW5ldyBNZW1iZXJWYWx1ZVBhaXJbXXsgCisJCQl0aGlzLnNpbmdsZVBhaXJzID0KKwkJCQluZXcgTWVtYmVyVmFsdWVQYWlyW117CiAJCQkJCW5ldyBNZW1iZXJWYWx1ZVBhaXIoVkFMVUUsIHRoaXMubWVtYmVyVmFsdWUuc291cmNlU3RhcnQsIHRoaXMubWVtYmVyVmFsdWUuc291cmNlRW5kLCB0aGlzLm1lbWJlclZhbHVlKQogCQkJCX07CiAJCX0KIAkJcmV0dXJuIHRoaXMuc2luZ2xlUGFpcnM7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCQlzdXBlci5wcmludEV4cHJlc3Npb24oaW5kZW50LCBvdXRwdXQpOwogCQlvdXRwdXQuYXBwZW5kKCcoJyk7CiAJCXRoaXMubWVtYmVyVmFsdWUucHJpbnRFeHByZXNzaW9uKGluZGVudCwgb3V0cHV0KTsKIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoJyknKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHsKKwkJCQl0aGlzLnR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQogCQkJaWYgKHRoaXMubWVtYmVyVmFsdWUgIT0gbnVsbCkgewogCQkJCXRoaXMubWVtYmVyVmFsdWUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQppbmRleCA3NGJhODZiLi5hMmNkZDg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDg4OCArNyw5OTcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjkyNDc4IC0gUmVwb3J0IHBvdGVudGlhbGx5IG51bGwgYWNyb3NzIHZhcmlhYmxlIGFzc2lnbm1lbnQsCisgKiAgICAgCQkJCQkJCQkJCQkgICAgQ29udHJpYnV0aW9uIGZvciBidWcgMTg1NjgyIC0gSW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgbWFyayBsb2NhbCB2YXJpYWJsZXMgYXMgcmVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFZhcmlhYmxlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1pc3NpbmdUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0TWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOwogCiBwdWJsaWMgY2xhc3MgU2luZ2xlTmFtZVJlZmVyZW5jZSBleHRlbmRzIE5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBPcGVyYXRvcklkcyB7Ci0gICAgCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEID0gMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURSA9IDE7CiAJcHVibGljIGNoYXJbXSB0b2tlbjsKIAlwdWJsaWMgTWV0aG9kQmluZGluZ1tdIHN5bnRoZXRpY0FjY2Vzc29yczsgLy8gWzBdPXJlYWQgYWNjZXNzb3IgWzFdPXdyaXRlIGFjY2Vzc29yCiAJcHVibGljIFR5cGVCaW5kaW5nIGdlbmVyaWNDYXN0OwotCQotCXB1YmxpYyBTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7Ci0JCXN1cGVyKCk7Ci0JCXRva2VuID0gc291cmNlOwotCQlzb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKLQkJc291cmNlRW5kID0gKGludCkgcG9zOwotCX0KLQlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIGlzQ29tcG91bmQpIHsKLQkKLQkJYm9vbGVhbiBpc1JlYWNoYWJsZSA9IChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDA7Ci0JCS8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgZXh0cmEgd29yawotCQlpZiAoaXNDb21wb3VuZCkgeyAvLyBjaGVjayB0aGUgdmFyaWFibGUgcGFydCBpcyBpbml0aWFsaXplZCBpZiBibGFuayBmaW5hbAotCQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewotCQkJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAotCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOwotCQkJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzQmxhbmtGaW5hbCgpIAotCQkJCQkJCSYmIGN1cnJlbnRTY29wZS5uZWVkQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb25DaGVjayhmaWVsZEJpbmRpbmcpKSB7Ci0JCQkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKLQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8sIHRydWUgLypyZWFkLWFjY2VzcyovKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCi0JCQkJCS8vIGNoZWNrIGlmIGFzc2lnbmluZyBhIGZpbmFsIGJsYW5rIGZpZWxkCi0JCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZzsKLQkJCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpKSB7Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKLQkJCQkJCS8vIHdlIGNvdWxkIGltcHJvdmUgZXJyb3IgbXNnIGhlcmUgdGVsbGluZyAiY2Fubm90IHVzZSBjb21wb3VuZCBhc3NpZ25tZW50IG9uIGZpbmFsIGxvY2FsIHZhcmlhYmxlIgotCQkJCQl9Ci0JCQkJCWlmIChpc1JlYWNoYWJsZSkgewotCQkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOwotCQkJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgewotCQkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5GQUtFX1VTRUQ7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKLQkJCWZsb3dJbmZvID0gYXNzaWdubWVudC5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKLQkJfQotCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7Ci0JCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyBhc3NpZ25pbmcgdG8gYSBmaWVsZAotCQkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8sIGZhbHNlIC8qd3JpdGUtYWNjZXNzKi8pOwotCQotCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJLy8gY2hlY2sgaWYgYWNjZXNzaW5nIGVudW0gc3RhdGljIGZpZWxkIGluIGluaXRpYWxpemVyCi0JCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7Ci0JCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCk7Ci0JCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkKLQkJCQkJCQkmJiB0aGlzLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudAotCQkJCQkJCSYmICFtZXRob2RTY29wZS5pc1N0YXRpYwotCQkJCQkJCSYmIChzb3VyY2VUeXBlID09IGRlY2xhcmluZ0NsYXNzIHx8IHNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9PSBkZWNsYXJpbmdDbGFzcykgLy8gZW51bSBjb25zdGFudCBib2R5Ci0JCQkJCQkJJiYgbWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKSkgewotCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVudW1TdGF0aWNGaWVsZFVzZWREdXJpbmdJbml0aWFsaXphdGlvbihmaWVsZEJpbmRpbmcsIHRoaXMpOwotCQkJCQl9Ci0JCQkJfQkJCQkJCi0JCQkJLy8gY2hlY2sgaWYgYXNzaWduaW5nIGEgZmluYWwgZmllbGQKLQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzRmluYWwoKSkgewotCQkJCQkvLyBpbnNpZGUgYSBjb250ZXh0IHdoZXJlIGFsbG93ZWQKLQkJCQkJaWYgKCFpc0NvbXBvdW5kICYmIGZpZWxkQmluZGluZy5pc0JsYW5rRmluYWwoKSAmJiBjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGZpZWxkQmluZGluZykpIHsKLQkJCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgewotCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChmaWVsZEJpbmRpbmcsIHRoaXMsIGZsb3dJbmZvKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUgCi0JCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKSl7Ly8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKLQkJCQkJYml0cyB8PSBGaXJzdEFzc2lnbm1lbnRUb0xvY2FsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJpdHMgJj0gfkZpcnN0QXNzaWdubWVudFRvTG9jYWw7Ci0JCQkJfQotCQkJCWlmIChsb2NhbEJpbmRpbmcuaXNGaW5hbCgpKSB7Ci0JCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgPT0gMCkgewotCQkJCQkJLy8gdG9sZXJhdGUgYXNzaWdubWVudCB0byBmaW5hbCBsb2NhbCBpbiB1bnJlYWNoYWJsZSBjb2RlICg0NTY3NCkKLQkJCQkJCWlmICgoaXNSZWFjaGFibGUgJiYgaXNDb21wb3VuZCkgfHwgIWxvY2FsQmluZGluZy5pc0JsYW5rRmluYWwoKSl7Ci0JCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOwotCQkJCQkJfSBlbHNlIGlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWxCaW5kaW5nKSkgewotCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mRmluYWxMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmbG93Q29udGV4dC5yZWNvcmRTZXR0aW5nRmluYWwobG9jYWxCaW5kaW5nLCB0aGlzLCBmbG93SW5mbyk7CQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RBc3NpZ25Ub0ZpbmFsT3V0ZXJMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgLyogYXZvaWQgZG91YmxlIGRpYWdub3N0aWMgKi8gaWYgKChsb2NhbEJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuSXNBcmd1bWVudCkgIT0gMCkgewotCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucGFyYW1ldGVyQXNzaWdubWVudChsb2NhbEJpbmRpbmcsIHRoaXMpOwotCQkJCX0KLQkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKTsKLQkJfQotCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwotCQlyZXR1cm4gZmxvd0luZm87Ci0JfQotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCXJldHVybiBhbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgdHJ1ZSk7Ci0JfQotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkKLQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCitwdWJsaWMgU2luZ2xlTmFtZVJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcykgeworCXN1cGVyKCk7CisJdGhpcy50b2tlbiA9IHNvdXJjZTsKKwl0aGlzLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworCXRoaXMuc291cmNlRW5kID0gKGludCkgcG9zOworfQorCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIGlzQ29tcG91bmQpIHsKKwlib29sZWFuIGlzUmVhY2hhYmxlID0gKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMDsKKwkvLyBjb21wb3VuZCBhc3NpZ25tZW50IGV4dHJhIHdvcmsKKwlpZiAoaXNDb21wb3VuZCkgeyAvLyBjaGVjayB0aGUgdmFyaWFibGUgcGFydCBpcyBpbml0aWFsaXplZCBpZiBibGFuayBmaW5hbAorCQlzd2l0Y2ggKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgewogCQkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCi0JCQkJaWYgKHZhbHVlUmVxdWlyZWQgfHwgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7Ci0JCQkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8sIHRydWUgLypyZWFkLWFjY2VzcyovKTsKLQkJCQl9Ci0JCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJCQkvLyBjaGVjayBpZiBhY2Nlc3NpbmcgZW51bSBzdGF0aWMgZmllbGQgaW4gaW5pdGlhbGl6ZXIKLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpIHsKLQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKTsKLQkJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKQotCQkJCQkJCSYmIHRoaXMuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50Ci0JCQkJCQkJJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljCi0JCQkJCQkJJiYgKHNvdXJjZVR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgfHwgc291cmNlVHlwZS5zdXBlcmNsYXNzID09IGRlY2xhcmluZ0NsYXNzKSAvLyBlbnVtIGNvbnN0YW50IGJvZHkKLQkJCQkJCQkmJiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZW51bVN0YXRpY0ZpZWxkVXNlZER1cmluZ0luaXRpYWxpemF0aW9uKGZpZWxkQmluZGluZywgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAotCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNCbGFua0ZpbmFsKCkgJiYgY3VycmVudFNjb3BlLm5lZWRCbGFua0ZpbmFsRmllbGRJbml0aWFsaXphdGlvbkNoZWNrKGZpZWxkQmluZGluZykpIHsKLQkJCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpKSB7CisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCQlpZiAoZmllbGRCaW5kaW5nLmlzQmxhbmtGaW5hbCgpCisJCQkJCQkmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2soZmllbGRCaW5kaW5nKSkgeworCQkJCQlGbG93SW5mbyBmaWVsZEluaXRzID0gZmxvd0NvbnRleHQuZ2V0SW5pdHNGb3JGaW5hbEJsYW5rSW5pdGlhbGl6YXRpb25DaGVjayhmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Mub3JpZ2luYWwoKSwgZmxvd0luZm8pOworCQkJCQlpZiAoIWZpZWxkSW5pdHMuaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgewogCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKIAkJCQkJfQogCQkJCX0KKwkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg2ODIKKwkJCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCQkJCX0KKwkJCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvLCB0cnVlIC8qcmVhZC1hY2Nlc3MqLyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKKwkJCQkvLyBjaGVjayBpZiBhc3NpZ25pbmcgYSBmaW5hbCBibGFuayBmaWVsZAogCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZzsKLQkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykpIHsKKwkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nKSkgewogCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQkJLy8gd2UgY291bGQgaW1wcm92ZSBlcnJvciBtc2cgaGVyZSB0ZWxsaW5nICJjYW5ub3QgdXNlIGNvbXBvdW5kIGFzc2lnbm1lbnQgb24gZmluYWwgbG9jYWwgdmFyaWFibGUiCiAJCQkJfQotCQkJCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKQl7Ci0JCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKLQkJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgewotCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRDsKLQkJCQl9Ci0JCX0KLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBmbG93SW5mbyk7Ci0JCX0KLQkJcmV0dXJuIGZsb3dJbmZvOwotCX0KLQkKLQlwdWJsaWMgVHlwZUJpbmRpbmcgY2hlY2tGaWVsZEFjY2VzcyhCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCi0JCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOwotCQkKLQkJYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cwotCQliaXRzIHw9IEJpbmRpbmcuRklFTEQ7Ci0JCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKLQkJYm9vbGVhbiBpc1N0YXRpYyA9IGZpZWxkQmluZGluZy5pc1N0YXRpYygpOwotCQlpZiAoIWlzU3RhdGljKSB7Ci0JCQkvLyBtdXN0IGNoZWNrIGZvciB0aGUgc3RhdGljIHN0YXR1cy4uLi4KLQkJCWlmIChtZXRob2RTY29wZS5pc1N0YXRpYykgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSh0aGlzLCBmaWVsZEJpbmRpbmcpOwotCQkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCQkJcmV0dXJuIGZpZWxkQmluZGluZy50eXBlOwotCQkJfQotCQl9Ci0JCXRoaXMuY29uc3RhbnQgPSBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKTsKLQkKLQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUsICh0aGlzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpICE9MCkpCi0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKLQkKLQkJaWYgKCh0aGlzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpID09IDAKLQkJCQkmJiBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgPT0gZmllbGRCaW5kaW5nLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3MKLQkJCQkmJiBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQgPj0gMAotCQkJCSYmIGZpZWxkQmluZGluZy5pZCA+PSBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQKLQkJCQkmJiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpIHx8IG1ldGhvZFNjb3BlLmlzU3RhdGljKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yd2FyZFJlZmVyZW5jZSh0aGlzLCAwLCBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOwotCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSWdub3JlTm9FZmZlY3RBc3NpZ25DaGVjazsKLQkJfQotCQlyZXR1cm4gZmllbGRCaW5kaW5nLnR5cGU7Ci0JCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI2NvbXB1dGVDb252ZXJzaW9uKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY29tcHV0ZUNvbnZlcnNpb24oU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIHJ1bnRpbWVUaW1lVHlwZSwgVHlwZUJpbmRpbmcgY29tcGlsZVRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVGltZVR5cGUgPT0gbnVsbCB8fCBjb21waWxlVGltZVR5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsJCQkJCi0JCWlmICgoYml0cyAmIEJpbmRpbmcuRklFTEQpICE9IDAgJiYgdGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCS8vIHNldCB0aGUgZ2VuZXJpYyBjYXN0IGFmdGVyIHRoZSBmYWN0LCBvbmNlIHRoZSB0eXBlIGV4cGVjdGF0aW9uIGlzIGZ1bGx5IGtub3duIChubyBuZWVkIGZvciBzdHJpY3QgY2FzdCkKLQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQkJCUZpZWxkQmluZGluZyBvcmlnaW5hbEJpbmRpbmcgPSBmaWVsZC5vcmlnaW5hbCgpOwotCQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxUeXBlID0gb3JpZ2luYWxCaW5kaW5nLnR5cGU7Ci0JCSAgICAvLyBleHRyYSBjYXN0IG5lZWRlZCBpZiBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdHlwZSB2YXJpYWJsZQotCQkJaWYgKG9yaWdpbmFsQmluZGluZyAhPSBmaWVsZCAKLQkJCQkJJiYgb3JpZ2luYWxUeXBlICE9IGZpZWxkLnR5cGUKLQkJCQkJJiYgcnVudGltZVRpbWVUeXBlLmlkICE9IFRfSmF2YUxhbmdPYmplY3QKLQkJCQkJJiYgKG9yaWdpbmFsVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpICE9IDApIHsKLQkJICAgIAlUeXBlQmluZGluZyB0YXJnZXRUeXBlID0gKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpIAotCQkgICAgCQk/IGNvbXBpbGVUaW1lVHlwZSAgLy8gdW5ib3hpbmc6IGNoZWNrY2FzdCBiZWZvcmUgY29udmVyc2lvbgotCQkgICAgCQk6IHJ1bnRpbWVUaW1lVHlwZTsKLQkJICAgICAgICB0aGlzLmdlbmVyaWNDYXN0ID0gb3JpZ2luYWxUeXBlLmdlbmVyaWNDYXN0KHNjb3BlLmJveGluZyh0YXJnZXRUeXBlKSk7Ci0JCSAgICAgICAgaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQ2FzdCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmdlbmVyaWNDYXN0OwotCQkJCQlpZiAoIXJlZmVyZW5jZUNhc3QuY2FuQmVTZWVuQnkoc2NvcGUpKSB7Ci0JCQkgICAgICAgIAlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAKLQkJCSAgICAgICAgCQkJbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAotCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcmVmZXJlbmNlQ2FzdC5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCQkJCQkJCXJlZmVyZW5jZUNhc3QsCi0JCQkJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSk7CisJCQkJaWYgKGxvY2FsQmluZGluZy51c2VGbGFnICE9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQpIHsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTY4MgorCQkJCQkvLyBhY2Nlc3MgZnJvbSBjb21wb3VuZCBhc3NpZ25tZW50IGRvZXMgbm90IHByZXZlbnQgInVudXNlZCIgd2FybmluZywgdW5sZXNzIHVuYm94aW5nIGlzIGludm9sdmVkOgorCQkJCQlpZiAoaXNSZWFjaGFibGUgJiYgKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeworCQkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gdXNlIHZhbHVlcyA8IDAgdG8gY291bnQgdGhlIG51bWJlciBvZiBjb21wb3VuZCB1c2VzOgorCQkJCQkJaWYgKGxvY2FsQmluZGluZy51c2VGbGFnIDw9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkKKwkJCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZy0tOwogCQkJCQl9Ci0JCSAgICAgICAgfQkJCQkgICAgICAgIAotCQkJfSAJCisJCQkJfQogCQl9Ci0JCXN1cGVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBydW50aW1lVGltZVR5cGUsIGNvbXBpbGVUaW1lVHlwZSk7Ci0JfQkKKwl9CisJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CisJCWZsb3dJbmZvID0gYXNzaWdubWVudC5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwl9CisJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgZmxvd0luZm8sIGZhbHNlIC8qd3JpdGUtYWNjZXNzKi8pOwogCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCi0JCS8vIG9wdGltaXppbmcgYXNzaWdubWVudCBsaWtlOiBpID0gaSArIDEgb3IgaSA9IDEgKyBpCi0JCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24uaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpKSB7Ci0JCQlCaW5hcnlFeHByZXNzaW9uIG9wZXJhdGlvbiA9IChCaW5hcnlFeHByZXNzaW9uKSBhc3NpZ25tZW50LmV4cHJlc3Npb247Ci0JCQlpbnQgb3BlcmF0b3IgPSAob3BlcmF0aW9uLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQ7Ci0JCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHZhcmlhYmxlUmVmZXJlbmNlOwotCQkJaWYgKChvcGVyYXRpb24ubGVmdCBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpICYmICgodmFyaWFibGVSZWZlcmVuY2UgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgb3BlcmF0aW9uLmxlZnQpLmJpbmRpbmcgPT0gYmluZGluZykpIHsKLQkJCQkvLyBpID0gaSArIHZhbHVlLCB0aGVuIHVzZSB0aGUgdmFyaWFibGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgc2luY2UgaXQgaGFzIHRoZSBjb3JyZWN0IGltcGxpY2l0IGNvbnZlcnNpb24KLQkJCQl2YXJpYWJsZVJlZmVyZW5jZS5nZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sIG9wZXJhdGlvbi5yaWdodCwgb3BlcmF0b3IsIG9wZXJhdGlvbi5pbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOwotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCX0JCQkJCi0JCQkJcmV0dXJuOwotCQkJfSAKLQkJCWlmICgob3BlcmF0aW9uLnJpZ2h0IGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkKLQkJCQkJJiYgKChvcGVyYXRvciA9PSBQTFVTKSB8fCAob3BlcmF0b3IgPT0gTVVMVElQTFkpKSAvLyBvbmx5IGNvbW11dGF0aXZlIG9wZXJhdGlvbnMKLQkJCQkJJiYgKCh2YXJpYWJsZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBvcGVyYXRpb24ucmlnaHQpLmJpbmRpbmcgPT0gYmluZGluZykKLQkJCQkJJiYgKG9wZXJhdGlvbi5sZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgLy8gZXhjbHVkZSBub24gY29uc3RhbnQgZXhwcmVzc2lvbnMsIHNpbmNlIGNvdWxkIGhhdmUgc2lkZS1lZmZlY3QKLQkJCQkJJiYgKCgob3BlcmF0aW9uLmxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUX0phdmFMYW5nU3RyaW5nKSAvLyBleGNsdWRlIHN0cmluZyBjb25jYXRlbmF0aW9uIHdoaWNoIHdvdWxkIG9jY3VyIGJhY2t3YXJkcwotCQkJCQkmJiAoKChvcGVyYXRpb24ucmlnaHQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUX0phdmFMYW5nU3RyaW5nKSkgeyAvLyBleGNsdWRlIHN0cmluZyBjb25jYXRlbmF0aW9uIHdoaWNoIHdvdWxkIG9jY3VyIGJhY2t3YXJkcwotCQkJCS8vIGkgPSB2YWx1ZSArIGksIHRoZW4gdXNlIHRoZSB2YXJpYWJsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBzaW5jZSBpdCBoYXMgdGhlIGNvcnJlY3QgaW1wbGljaXQgY29udmVyc2lvbgotCQkJCXZhcmlhYmxlUmVmZXJlbmNlLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwgb3BlcmF0aW9uLmxlZnQsIG9wZXJhdG9yLCBvcGVyYXRpb24uaW1wbGljaXRDb252ZXJzaW9uLCB2YWx1ZVJlcXVpcmVkKTsKLQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQl9CQkJCQotCQkJCXJldHVybjsKKwkJCS8vIGNoZWNrIGlmIGFzc2lnbmluZyBhIGZpbmFsIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJaWYgKGZpZWxkQmluZGluZy5pc0ZpbmFsKCkpIHsKKwkJCQkvLyBpbnNpZGUgYSBjb250ZXh0IHdoZXJlIGFsbG93ZWQKKwkJCQlpZiAoIWlzQ29tcG91bmQgJiYgZmllbGRCaW5kaW5nLmlzQmxhbmtGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmbG93Q29udGV4dC5yZWNvcmRTZXR0aW5nRmluYWwoZmllbGRCaW5kaW5nLCB0aGlzLCBmbG93SW5mbyk7CisJCQkJCX0KKwkJCQkJZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NjgyCisJCQkJY3VycmVudFNjb3BlLnJlc2V0RW5jbG9zaW5nTWV0aG9kU3RhdGljRmxhZygpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKSl7Ly8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKKwkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5GaXJzdEFzc2lnbm1lbnRUb0xvY2FsOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuRmlyc3RBc3NpZ25tZW50VG9Mb2NhbDsKKwkJCX0KKwkJCWlmIChsb2NhbEJpbmRpbmcuaXNGaW5hbCgpKSB7CisJCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPT0gMCkgeworCQkJCQkvLyB0b2xlcmF0ZSBhc3NpZ25tZW50IHRvIGZpbmFsIGxvY2FsIGluIHVucmVhY2hhYmxlIGNvZGUgKDQ1Njc0KQorCQkJCQlpZiAoKGlzUmVhY2hhYmxlICYmIGlzQ29tcG91bmQpIHx8ICFsb2NhbEJpbmRpbmcuaXNCbGFua0ZpbmFsKCkpeworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOworCQkJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcpKSB7CisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChsb2NhbEJpbmRpbmcsIHRoaXMsIGZsb3dJbmZvKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RBc3NpZ25Ub0ZpbmFsT3V0ZXJMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgLyogYXZvaWQgZG91YmxlIGRpYWdub3N0aWMgKi8gaWYgKChsb2NhbEJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuSXNBcmd1bWVudCkgIT0gMCkgeworCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5wYXJhbWV0ZXJBc3NpZ25tZW50KGxvY2FsQmluZGluZywgdGhpcyk7CisJCQl9CisJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKTsKKwl9CisJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvKTsKKwlyZXR1cm4gZmxvd0luZm87Cit9CisKK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0cnVlKTsKK30KKworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCXN3aXRjaCAodGhpcy5iaXRzICYgQVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJaWYgKHZhbHVlUmVxdWlyZWQgfHwgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7CisJCQkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBmbG93SW5mbywgdHJ1ZSAvKnJlYWQtYWNjZXNzKi8pOworCQkJfQorCQkJLy8gY2hlY2sgaWYgcmVhZGluZyBhIGZpbmFsIGJsYW5rIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJaWYgKGZpZWxkQmluZGluZy5pc0JsYW5rRmluYWwoKSAmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2soZmllbGRCaW5kaW5nKSkgeworCQkJCUZsb3dJbmZvIGZpZWxkSW5pdHMgPSBmbG93Q29udGV4dC5nZXRJbml0c0ZvckZpbmFsQmxhbmtJbml0aWFsaXphdGlvbkNoZWNrKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5vcmlnaW5hbCgpLCBmbG93SW5mbyk7CisJCQkJaWYgKCFmaWVsZEluaXRzLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODY4MgorCQkJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZzsKKwkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKGxvY2FsQmluZGluZywgdGhpcyk7CisJCQl9CisJCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgeworCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCX0gZWxzZSBpZiAobG9jYWxCaW5kaW5nLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVU5VU0VEKSB7CisJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5GQUtFX1VTRUQ7CisJCQl9CisJfQorCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBmbG93SW5mbyk7CisJfQorCXJldHVybiBmbG93SW5mbzsKK30KKworcHVibGljIFR5cGVCaW5kaW5nIGNoZWNrRmllbGRBY2Nlc3MoQmxvY2tTY29wZSBzY29wZSkgeworCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJdGhpcy5jb25zdGFudCA9IGZpZWxkQmluZGluZy5jb25zdGFudCgpOworCisJdGhpcy5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKKwl0aGlzLmJpdHMgfD0gQmluZGluZy5GSUVMRDsKKwlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCS8vIGNoZWNrIGlmIGFjY2Vzc2luZyBlbnVtIHN0YXRpYyBmaWVsZCBpbiBpbml0aWFsaXplcgorCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpIHsKKwkJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQlpZiAodGhpcy5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQKKwkJCQkJJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljCisJCQkJCSYmIChzb3VyY2VUeXBlID09IGRlY2xhcmluZ0NsYXNzIHx8IHNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9PSBkZWNsYXJpbmdDbGFzcykgLy8gZW51bSBjb25zdGFudCBib2R5CisJCQkJCSYmIG1ldGhvZFNjb3BlLmlzSW5zaWRlSW5pdGlhbGl6ZXJPckNvbnN0cnVjdG9yKCkpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lbnVtU3RhdGljRmllbGRVc2VkRHVyaW5nSW5pdGlhbGl6YXRpb24oZmllbGRCaW5kaW5nLCB0aGlzKTsKIAkJCX0KIAkJfQotCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7Ci0JCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyBhc3NpZ25pbmcgdG8gYSBmaWVsZAotCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7Ci0JCQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJCQlpZiAoIShmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nKS5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KLQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7Ci0JCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7Ci0JCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCQkJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGZpZWxkQmluZGluZywgc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwgdmFsdWVSZXF1aXJlZCk7Ci0JCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7Ci0JCQkJfQotCQkJCS8vIG5vIG5lZWQgZm9yIGdlbmVyaWMgY2FzdCBhcyB2YWx1ZSBnb3QgZHVwcGVkCi0JCQkJcmV0dXJuOwotCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQkJaWYgKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uICE9IC0xKSB7Ci0JCQkJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJCQkJLy8gYXNzaWduaW5nIGFuIHVudXNlZCBsb2NhbCB0byBhIGNvbnN0YW50IHZhbHVlID0gbm8gYWN0dWFsIGFzc2lnbm1lbnQgaXMgbmVjZXNzYXJ5Ci0JCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChhc3NpZ25tZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQkJCS8qIEV2ZW4gdGhvdWdoIHRoZSB2YWx1ZSBtYXkgbm90IGJlIHJlcXVpcmVkLCB3ZSBmb3JjZSBpdCB0byBiZSBwcm9kdWNlZCwgYW5kIGRpc2NhcmQgaXQgbGF0ZXIKLQkJCQkJCW9uIGlmIGl0IHdhcyBhY3R1YWxseSBub3QgbmVjZXNzYXJ5LCBzbyBhcyB0byBwcm92aWRlIHRoZSBzYW1lIGJlaGF2aW9yIGFzIEpESzEuMmJldGEzLgkqLwotCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsgLy8gaW1wbGljaXQgY29udmVyc2lvbgotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoKGxvY2FsQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChsb2NhbEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJCQkJCWNvZGVTdHJlYW0ucG9wMigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gMjY5MDMsIG5lZWQgZXh0cmEgY2FzdCB0byBzdG9yZSBudWxsIGluIGFycmF5IGxvY2FsIHZhcgkKLQkJCQlpZiAobG9jYWxCaW5kaW5nLnR5cGUuaXNBcnJheVR5cGUoKSAKLQkJCQkJJiYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTAkvLyBhcnJheUxvYyA9IG51bGwKLQkJCQkJCXx8ICgoYXNzaWdubWVudC5leHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pCS8vIGFycmF5TG9jID0gKHR5cGVbXSludWxsCi0JCQkJCQkJJiYgKCgoQ2FzdEV4cHJlc3Npb24pYXNzaWdubWVudC5leHByZXNzaW9uKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpKSkpewotCQkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdChsb2NhbEJpbmRpbmcudHlwZSk7IAotCQkJCX0KLQkJCQkKLQkJCQkvLyBub3JtYWwgbG9jYWwgYXNzaWdubWVudCAoc2luY2UgY2Fubm90IHN0b3JlIGluIG91dGVyIGxvY2FsIHdoaWNoIGFyZSBmaW5hbCBsb2NhdGlvbnMpCi0JCQkJY29kZVN0cmVhbS5zdG9yZShsb2NhbEJpbmRpbmcsIHZhbHVlUmVxdWlyZWQpOwotCQkJCWlmICgoYml0cyAmIEZpcnN0QXNzaWdubWVudFRvTG9jYWwpICE9IDApIHsgLy8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKLQkJCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKLQkJCQl9Ci0JCQkJLy8gaW1wbGljaXQgY29udmVyc2lvbgotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCX0KKwl9IGVsc2UgeworCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlVucXVhbGlmaWVkRmllbGRBY2Nlc3MpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5xdWFsaWZpZWRGaWVsZEFjY2Vzcyh0aGlzLCBmaWVsZEJpbmRpbmcpOworCQl9CisJCS8vIG11c3QgY2hlY2sgZm9yIHRoZSBzdGF0aWMgc3RhdHVzLi4uLgorCQlpZiAobWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSh0aGlzLCBmaWVsZEJpbmRpbmcpOworCQkJcmV0dXJuIGZpZWxkQmluZGluZy50eXBlOwogCQl9CiAJfQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCisJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUsIHRoaXMuYml0cykpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCisJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgPT0gMAorCQkJJiYgbWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpID09IGZpZWxkQmluZGluZy5vcmlnaW5hbCgpLmRlY2xhcmluZ0NsYXNzCisJCQkmJiBtZXRob2RTY29wZS5sYXN0VmlzaWJsZUZpZWxkSUQgPj0gMAorCQkJJiYgZmllbGRCaW5kaW5nLmlkID49IG1ldGhvZFNjb3BlLmxhc3RWaXNpYmxlRmllbGRJRAorCQkJJiYgKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSB8fCBtZXRob2RTY29wZS5pc1N0YXRpYykpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yd2FyZFJlZmVyZW5jZSh0aGlzLCAwLCBmaWVsZEJpbmRpbmcpOworCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5JZ25vcmVOb0VmZmVjdEFzc2lnbkNoZWNrOworCX0KKwlyZXR1cm4gZmllbGRCaW5kaW5nLnR5cGU7CisKK30KKworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiNjb21wdXRlQ29udmVyc2lvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKQorICovCitwdWJsaWMgdm9pZCBjb21wdXRlQ29udmVyc2lvbihTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgcnVudGltZVRpbWVUeXBlLCBUeXBlQmluZGluZyBjb21waWxlVGltZVR5cGUpIHsKKwlpZiAocnVudGltZVRpbWVUeXBlID09IG51bGwgfHwgY29tcGlsZVRpbWVUeXBlID09IG51bGwpCisJCXJldHVybjsKKwlpZiAoKHRoaXMuYml0cyAmIEJpbmRpbmcuRklFTEQpICE9IDAgJiYgdGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJLy8gc2V0IHRoZSBnZW5lcmljIGNhc3QgYWZ0ZXIgdGhlIGZhY3QsIG9uY2UgdGhlIHR5cGUgZXhwZWN0YXRpb24gaXMgZnVsbHkga25vd24gKG5vIG5lZWQgZm9yIHN0cmljdCBjYXN0KQorCQlGaWVsZEJpbmRpbmcgZmllbGQgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCUZpZWxkQmluZGluZyBvcmlnaW5hbEJpbmRpbmcgPSBmaWVsZC5vcmlnaW5hbCgpOworCQlUeXBlQmluZGluZyBvcmlnaW5hbFR5cGUgPSBvcmlnaW5hbEJpbmRpbmcudHlwZTsKKwkJLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgZmllbGQgdHlwZSBpcyB0eXBlIHZhcmlhYmxlCisJCWlmIChvcmlnaW5hbFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJICAgIAlUeXBlQmluZGluZyB0YXJnZXRUeXBlID0gKCFjb21waWxlVGltZVR5cGUuaXNCYXNlVHlwZSgpICYmIHJ1bnRpbWVUaW1lVHlwZS5pc0Jhc2VUeXBlKCkpCisJICAgIAkJPyBjb21waWxlVGltZVR5cGUgIC8vIHVuYm94aW5nOiBjaGVja2Nhc3QgYmVmb3JlIGNvbnZlcnNpb24KKwkgICAgCQk6IHJ1bnRpbWVUaW1lVHlwZTsKKwkgICAgICAgIHRoaXMuZ2VuZXJpY0Nhc3QgPSBvcmlnaW5hbFR5cGUuZ2VuZXJpY0Nhc3Qoc2NvcGUuYm94aW5nKHRhcmdldFR5cGUpKTsKKwkgICAgICAgIGlmICh0aGlzLmdlbmVyaWNDYXN0IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQ2FzdCA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmdlbmVyaWNDYXN0OworCQkJCWlmICghcmVmZXJlbmNlQ2FzdC5jYW5CZVNlZW5CeShzY29wZSkpIHsKKwkJICAgICAgICAJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywKKwkJICAgICAgICAJCQluZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHJlZmVyZW5jZUNhc3Quc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJCQkJCXJlZmVyZW5jZUNhc3QsCisJCQkJCQkJCVByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpKTsKKwkJCQl9CisJICAgICAgICB9CisJCX0KKwl9CisJc3VwZXIuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHJ1bnRpbWVUaW1lVHlwZSwgY29tcGlsZVRpbWVUeXBlKTsKK30KKworcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJLy8gb3B0aW1pemluZyBhc3NpZ25tZW50IGxpa2U6IGkgPSBpICsgMSBvciBpID0gMSArIGkKKwlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uLmlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSkgeworCQlCaW5hcnlFeHByZXNzaW9uIG9wZXJhdGlvbiA9IChCaW5hcnlFeHByZXNzaW9uKSBhc3NpZ25tZW50LmV4cHJlc3Npb247CisJCWludCBvcGVyYXRvciA9IChvcGVyYXRpb24uYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQ7CisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgdmFyaWFibGVSZWZlcmVuY2U7CisJCWlmICgob3BlcmF0aW9uLmxlZnQgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSAmJiAoKHZhcmlhYmxlUmVmZXJlbmNlID0gKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG9wZXJhdGlvbi5sZWZ0KS5iaW5kaW5nID09IHRoaXMuYmluZGluZykpIHsKKwkJCS8vIGkgPSBpICsgdmFsdWUsIHRoZW4gdXNlIHRoZSB2YXJpYWJsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBzaW5jZSBpdCBoYXMgdGhlIGNvcnJlY3QgaW1wbGljaXQgY29udmVyc2lvbgorCQkJdmFyaWFibGVSZWZlcmVuY2UuZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljQWNjZXNzb3JzW1NpbmdsZU5hbWVSZWZlcmVuY2UuV1JJVEVdLCBvcGVyYXRpb24ucmlnaHQsIG9wZXJhdG9yLCBvcGVyYXRpb24uaW1wbGljaXRDb252ZXJzaW9uLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWlmICgob3BlcmF0aW9uLnJpZ2h0IGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkKKwkJCQkmJiAoKG9wZXJhdG9yID09IE9wZXJhdG9ySWRzLlBMVVMpIHx8IChvcGVyYXRvciA9PSBPcGVyYXRvcklkcy5NVUxUSVBMWSkpIC8vIG9ubHkgY29tbXV0YXRpdmUgb3BlcmF0aW9ucworCQkJCSYmICgodmFyaWFibGVSZWZlcmVuY2UgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgb3BlcmF0aW9uLnJpZ2h0KS5iaW5kaW5nID09IHRoaXMuYmluZGluZykKKwkJCQkmJiAob3BlcmF0aW9uLmxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAvLyBleGNsdWRlIG5vbiBjb25zdGFudCBleHByZXNzaW9ucywgc2luY2UgY291bGQgaGF2ZSBzaWRlLWVmZmVjdAorCQkJCSYmICgoKG9wZXJhdGlvbi5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpIC8vIGV4Y2x1ZGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gd2hpY2ggd291bGQgb2NjdXIgYmFja3dhcmRzCisJCQkJJiYgKCgob3BlcmF0aW9uLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpKSB7IC8vIGV4Y2x1ZGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gd2hpY2ggd291bGQgb2NjdXIgYmFja3dhcmRzCisJCQkvLyBpID0gdmFsdWUgKyBpLCB0aGVuIHVzZSB0aGUgdmFyaWFibGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgc2luY2UgaXQgaGFzIHRoZSBjb3JyZWN0IGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCXZhcmlhYmxlUmVmZXJlbmNlLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLldSSVRFXSwgb3BlcmF0aW9uLmxlZnQsIG9wZXJhdG9yLCBvcGVyYXRpb24uaW1wbGljaXRDb252ZXJzaW9uLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9CisJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQlGaWVsZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpOworCQkJaWYgKCFjb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUKTsKKwkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOworCQkJCX0KIAkJCX0KIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQlmaWVsZFN0b3JlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgY29kZWdlbkJpbmRpbmcsIHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbU2luZ2xlTmFtZVJlZmVyZW5jZS5XUklURV0sIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0cnVlIC8qaW1wbGljaXQgdGhpcyovLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CisJCQl9CisJCQkvLyBubyBuZWVkIGZvciBnZW5lcmljIGNhc3QgYXMgdmFsdWUgZ290IGR1cHBlZAogCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewotCQkJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAotCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKLQkJCQkJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGZpZWxkQmluZGluZy5jb25zdGFudCgpOwotCQkJCQlpZiAoZmllbGRDb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCQkJCS8vIGRpcmVjdGx5IHVzZSBpbmxpbmVkIHZhbHVlIGZvciBjb25zdGFudCBmaWVsZHMKLQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGZpZWxkQ29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCQkJCQkJcmV0dXJuOworCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlpZiAobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKKwkJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24uY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQkJCS8vIGFzc2lnbmluZyBhbiB1bnVzZWQgbG9jYWwgdG8gYSBjb25zdGFudCB2YWx1ZSA9IG5vIGFjdHVhbCBhc3NpZ25tZW50IGlzIG5lY2Vzc2FyeQorCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGFzc2lnbm1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCQl9Ci0JCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCQkJaWYgKCF2YWx1ZVJlcXVpcmVkCi0JCQkJCQkJCS8vIGlmIG5vIHZhbHVlUmVxdWlyZWQsIHN0aWxsIG5lZWQgcG9zc2libGUgc2lkZS1lZmZlY3RzIG9mIDxjbGluaXQ+IGludm9jYXRpb24sIGlmIGZpZWxkIGJlbG9uZ3MgdG8gZGlmZmVyZW50IGNsYXNzCi0JCQkJCQkJCSYmICgoRmllbGRCaW5kaW5nKWJpbmRpbmcpLm9yaWdpbmFsKCkuZGVjbGFyaW5nQ2xhc3MgPT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuZXJhc3VyZSgpCi0JCQkJCQkJCSYmICgoaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgPT0gMCkKLQkJCQkJCQkJJiYgdGhpcy5nZW5lcmljQ2FzdCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaWYgbm8gdmFsdWVSZXF1aXJlZCwgb3B0aW1pemUgb3V0IGVudGlyZSBnZW4KLQkJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCS8vIG1hbmFnaW5nIHByaXZhdGUgYWNjZXNzCQkJCQkJCQotCQkJCQkJaWYgKChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkgfHwgKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSA9PSBudWxsKSkgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSk7Ci0JCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkvKiBFdmVuIHRob3VnaCB0aGUgdmFsdWUgbWF5IG5vdCBiZSByZXF1aXJlZCwgd2UgZm9yY2UgaXQgdG8gYmUgcHJvZHVjZWQsIGFuZCBkaXNjYXJkIGl0IGxhdGVyCisJCQkJCW9uIGlmIGl0IHdhcyBhY3R1YWxseSBub3QgbmVjZXNzYXJ5LCBzbyBhcyB0byBwcm92aWRlIHRoZSBzYW1lIGJlaGF2aW9yIGFzIEpESzEuMmJldGEzLgkqLworCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7IC8vIGltcGxpY2l0IGNvbnZlcnNpb24KIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghdmFsdWVSZXF1aXJlZAotCQkJCQkJCQkmJiAoaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgPT0gMCAKLQkJCQkJCQkJJiYgdGhpcy5nZW5lcmljQ2FzdCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaWYgbm8gdmFsdWVSZXF1aXJlZCwgb3B0aW1pemUgb3V0IGVudGlyZSBnZW4KLQkJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCS8vIG1hbmFnaW5nIGVuY2xvc2luZyBpbnN0YW5jZSBhY2Nlc3MKLQkJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewotCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKLQkJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBtYW5hZ2luZyBwcml2YXRlIGFjY2VzcwkJCQkJCQkKLQkJCQkJCWlmICgoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8IChzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0gPT0gbnVsbCkpIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGZpZWxkQmluZGluZyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSk7Ci0JCQkJCQl9CisJCQkJCQlzd2l0Y2gobG9jYWxCaW5kaW5nLnR5cGUuaWQpIHsKKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQkJCQkJCQogCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbAotCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQkJCWlmICghdmFsdWVSZXF1aXJlZCAmJiAoaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgPT0gMCkgeworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyAyNjkwMywgbmVlZCBleHRyYSBjYXN0IHRvIHN0b3JlIG51bGwgaW4gYXJyYXkgbG9jYWwgdmFyCisJCQlpZiAobG9jYWxCaW5kaW5nLnR5cGUuaXNBcnJheVR5cGUoKQorCQkJCSYmIChhc3NpZ25tZW50LmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwJLy8gYXJyYXlMb2MgPSBudWxsCisJCQkJCXx8ICgoYXNzaWdubWVudC5leHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pCS8vIGFycmF5TG9jID0gKHR5cGVbXSludWxsCisJCQkJCQkmJiAoKChDYXN0RXhwcmVzc2lvbilhc3NpZ25tZW50LmV4cHJlc3Npb24pLmlubmVybW9zdENhc3RlZEV4cHJlc3Npb24oKS5yZXNvbHZlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCkpKSl7CisJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QobG9jYWxCaW5kaW5nLnR5cGUpOworCQkJfQorCisJCQkvLyBub3JtYWwgbG9jYWwgYXNzaWdubWVudCAoc2luY2UgY2Fubm90IHN0b3JlIGluIG91dGVyIGxvY2FsIHdoaWNoIGFyZSBmaW5hbCBsb2NhdGlvbnMpCisJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRmlyc3RBc3NpZ25tZW50VG9Mb2NhbCkgIT0gMCkgeyAvLyBmb3IgbG9jYWwgdmFyaWFibGUgZGVidWcgYXR0cmlidXRlcworCQkJCWxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CisJCQl9CisJCQkvLyBpbXBsaWNpdCBjb252ZXJzaW9uCisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJfQorCX0KK30KKworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCisJCQkJRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9ICgoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLm9yaWdpbmFsKCk7CisJCQkJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGNvZGVnZW5GaWVsZC5jb25zdGFudCgpOworCQkJCWlmIChmaWVsZENvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCQkvLyBkaXJlY3RseSB1c2UgaW5saW5lZCB2YWx1ZSBmb3IgY29uc3RhbnQgZmllbGRzCisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRDb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKGNvZGVnZW5GaWVsZC5pc1N0YXRpYygpKSB7CisJCQkJCWlmICghdmFsdWVSZXF1aXJlZAorCQkJCQkJCS8vIGlmIG5vIHZhbHVlUmVxdWlyZWQsIHN0aWxsIG5lZWQgcG9zc2libGUgc2lkZS1lZmZlY3RzIG9mIDxjbGluaXQ+IGludm9jYXRpb24sIGlmIGZpZWxkIGJlbG9uZ3MgdG8gZGlmZmVyZW50IGNsYXNzCisJCQkJCQkJJiYgKChGaWVsZEJpbmRpbmcpdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpLmRlY2xhcmluZ0NsYXNzID09IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmVyYXN1cmUoKQorCQkJCQkJCSYmICgodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSA9PSAwKQorCQkJCQkJCSYmIHRoaXMuZ2VuZXJpY0Nhc3QgPT0gbnVsbCkgewogCQkJCQkJLy8gaWYgbm8gdmFsdWVSZXF1aXJlZCwgb3B0aW1pemUgb3V0IGVudGlyZSBnZW4KIAkJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KLQkJCQkJLy8gb3V0ZXIgbG9jYWw/Ci0JCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewotCQkJCQkJLy8gb3V0ZXIgbG9jYWwgY2FuIGJlIHJlYWNoZWQgZWl0aGVyIHRocm91Z2ggYSBzeW50aGV0aWMgYXJnIG9yIGEgc3ludGhldGljIGZpZWxkCi0JCQkJCQlWYXJpYWJsZUJpbmRpbmdbXSBwYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgobG9jYWxCaW5kaW5nKTsKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhwYXRoLCB0aGlzLCBsb2NhbEJpbmRpbmcsIGN1cnJlbnRTY29wZSk7CisJCQkJCS8vIG1hbmFnaW5nIHByaXZhdGUgYWNjZXNzCisJCQkJCWlmICgodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkgfHwgKHRoaXMuc3ludGhldGljQWNjZXNzb3JzW1NpbmdsZU5hbWVSZWZlcmVuY2UuUkVBRF0gPT0gbnVsbCkpIHsKKwkJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5GaWVsZCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgY29kZWdlbkZpZWxkLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyByZWd1bGFyIGxvY2FsIHZhcmlhYmxlIHJlYWQKLQkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8vIHR5cGUKLQkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQl9Ci0JCX0KLQkJLy8gcmVxdWlyZWQgY2FzdCBtdXN0IG9jY3VyIGV2ZW4gaWYgbm8gdmFsdWUgaXMgcmVxdWlyZWQKLQkJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIGlzVW5ib3hpbmcgPSAoaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMDsKLQkJCS8vIGNvbnZlcnNpb24gb25seSBnZW5lcmF0ZWQgaWYgdW5ib3hpbmcKLQkJCWlmIChpc1VuYm94aW5nKSBjb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7Ci0JCQlzd2l0Y2ggKGlzVW5ib3hpbmcgPyBwb3N0Q29udmVyc2lvblR5cGUoY3VycmVudFNjb3BlKS5pZCA6IHRoaXMucmVzb2x2ZWRUeXBlLmlkKSB7Ci0JCQkJY2FzZSBUX2xvbmcgOgotCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQl9Ci0JCX0JCQkJCQkJCi0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci0JfQotCS8qCi0JICogUmVndWxhciBBUEkgZm9yIGNvbXBvdW5kIGFzc2lnbm1lbnQsIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHJlZmVyZW5jZSB0byB0aGUKLQkgKiB2YXJpYWJsZSwgd2hpY2ggY2FycmllcyBib3RoIHN5bnRoZXRpYyByZWFkL3dyaXRlIGFjY2Vzc29ycy4KLQkgKiBUaGUgQVBJcyB3aXRoIGFuIGV4dHJhIGFyZ3VtZW50IGlzIHVzZWQgd2hlbmV2ZXIgdGhlcmUgYXJlIHR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHZhcmlhYmxlIHdoaWNoCi0JICogYXJlIG9wdGltaXplZCBpbiBvbmUgYWNjZXNzOiBlLmcgImEgPSBhICsgMSIgb3B0aW1pemVkIGludG8gImErKyIuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkKLQkJdGhpcy5nZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudCgKLQkJCWN1cnJlbnRTY29wZSwgCi0JCQljb2RlU3RyZWFtLCAKLQkJCXN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sCi0JCQlleHByZXNzaW9uLAotCQkJb3BlcmF0b3IsIAotCQkJYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgCi0JCQl2YWx1ZVJlcXVpcmVkKTsKLQl9Ci0JLyoKLQkgKiBUaGUgQVBJcyB3aXRoIGFuIGV4dHJhIGFyZ3VtZW50IGlzIHVzZWQgd2hlbmV2ZXIgdGhlcmUgYXJlIHR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHZhcmlhYmxlIHdoaWNoCi0JICogYXJlIG9wdGltaXplZCBpbiBvbmUgYWNjZXNzOiBlLmcgImEgPSBhICsgMSIgb3B0aW1pemVkIGludG8gImErKyIuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgTWV0aG9kQmluZGluZyB3cml0ZUFjY2Vzc29yLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7Ci0JCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyBhc3NpZ25pbmcgdG8gYSBmaWVsZAotCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7Ci0JCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nKS5pc1N0YXRpYygpKSB7Ci0JCQkJCWlmICgoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8IChzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0gPT0gbnVsbCkpIHsKLQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCWlmICghdmFsdWVSZXF1aXJlZAorCQkJCQkJCSYmICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpID09IDAKKwkJCQkJCQkmJiB0aGlzLmdlbmVyaWNDYXN0ID09IG51bGwpIHsKKwkJCQkJCS8vIGlmIG5vIHZhbHVlUmVxdWlyZWQsIG9wdGltaXplIG91dCBlbnRpcmUgZ2VuCisJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCS8vIG1hbmFnaW5nIGVuY2xvc2luZyBpbnN0YW5jZSBhY2Nlc3MKKwkJCQkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSA+PiBBU1ROb2RlLkRlcHRoU0hJRlQpOwogCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCQkJaWYgKChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkgfHwgKHN5bnRoZXRpY0FjY2Vzc29yc1tSRUFEXSA9PSBudWxsKSkgewotCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCQkvLyBtYW5hZ2luZyBwcml2YXRlIGFjY2VzcworCQkJCQlpZiAoKHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8ICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdID09IG51bGwpKSB7CisJCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuRmllbGQsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0cnVlIC8qIGltcGxpY2l0IHRoaXMgKi8pOworCQkJCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRmaWVsZCwgY29kZWdlbkZpZWxkLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUgKGNhbm5vdCBhc3NpZ24gdG8gb3V0ZXIgbG9jYWwpCi0JCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJCUNvbnN0YW50IGFzc2lnbkNvbnN0YW50OwotCQkJCWludCBpbmNyZW1lbnQ7Ci0JCQkJLy8gdXNpbmcgaW5jciBieXRlY29kZSBpZiBwb3NzaWJsZQotCQkJCXN3aXRjaCAobG9jYWxCaW5kaW5nLnR5cGUuaWQpIHsKLQkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kKGN1cnJlbnRTY29wZSwgdGhpcywgZXhwcmVzc2lvbik7Ci0JCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQkJCQl9Ci0JCQkJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCWlmICgoKGFzc2lnbkNvbnN0YW50ID0gZXhwcmVzc2lvbi5jb25zdGFudCkgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAKLQkJCQkJCQkmJiAoYXNzaWduQ29uc3RhbnQudHlwZUlEKCkgIT0gVF9mbG9hdCkgLy8gb25seSBmb3IgaW50ZWdyYWwgdHlwZXMKLQkJCQkJCQkmJiAoYXNzaWduQ29uc3RhbnQudHlwZUlEKCkgIT0gVF9kb3VibGUpCi0JCQkJCQkJJiYgKChpbmNyZW1lbnQgPSBhc3NpZ25Db25zdGFudC5pbnRWYWx1ZSgpKSA9PSAoc2hvcnQpIGluY3JlbWVudCkpIHsgLy8gMTYgYml0cyB2YWx1ZQotCQkJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKLQkJCQkJCQkJY2FzZSBQTFVTIDoKLQkJCQkJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgaW5jcmVtZW50KTsKLQkJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCWNhc2UgTUlOVVMgOgotCQkJCQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCAtaW5jcmVtZW50KTsKLQkJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOworCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQkJaWYgKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uID09IC0xKSB7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkvLyByZXN0YXJ0IGNvZGUgZ2VuCisJCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CisJCQkJCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QoQ29kZVN0cmVhbS5SRVNUQVJUX0NPREVfR0VOX0ZPUl9VTlVTRURfTE9DQUxTX01PREUsIG51bGwpOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJCXJldHVybjsKIAkJCQl9CisJCQkJaWYgKCF2YWx1ZVJlcXVpcmVkICYmICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpID09IDApIHsKKwkJCQkJLy8gaWYgbm8gdmFsdWVSZXF1aXJlZCwgb3B0aW1pemUgb3V0IGVudGlyZSBnZW4KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvLyBvdXRlciBsb2NhbD8KKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCS8vIG91dGVyIGxvY2FsIGNhbiBiZSByZWFjaGVkIGVpdGhlciB0aHJvdWdoIGEgc3ludGhldGljIGFyZyBvciBhIHN5bnRoZXRpYyBmaWVsZAorCQkJCQlWYXJpYWJsZUJpbmRpbmdbXSBwYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgobG9jYWxCaW5kaW5nKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGxvY2FsQmluZGluZywgY3VycmVudFNjb3BlKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyByZWd1bGFyIGxvY2FsIHZhcmlhYmxlIHJlYWQKKwkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gdHlwZQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJcmV0dXJuOwogCQl9Ci0JCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KLQkJaW50IG9wZXJhdGlvblR5cGVJRDsKLQkJc3dpdGNoKG9wZXJhdGlvblR5cGVJRCA9IChpbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsKLQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZyA6Ci0JCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgotCQkJY2FzZSBUX3VuZGVmaW5lZCA6Ci0JCQkJLy8gd2UgZW50ZXIgaGVyZSBpZiB0aGUgc2luZ2xlIG5hbWUgcmVmZXJlbmNlIGlzIGEgZmllbGQgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nIG9yIGlmIHRoZSB0eXBlIG9mIHRoZSAKLQkJCQkvLyBvcGVyYXRpb24gaXMgamF2YS5sYW5nLk9iamVjdAotCQkJCS8vIEZvciBleGFtcGxlOiBvID0gbyArICIiOyAvLyB3aGVyZSB0aGUgY29tcGlsZWQgdHlwZSBvZiBvIGlzIGphdmEubGFuZy5PYmplY3QuCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKLQkJCQkvLyBubyBuZWVkIGZvciBnZW5lcmljIGNhc3Qgb24gcHJldmlvdXMgI2dldGZpZWxkIHNpbmNlIHVzaW5nIE9iamVjdCBzdHJpbmcgYnVmZmVyIG1ldGhvZHMuCQkJCisJfQorCS8vIHJlcXVpcmVkIGNhc3QgbXVzdCBvY2N1ciBldmVuIGlmIG5vIHZhbHVlIGlzIHJlcXVpcmVkCisJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJfSBlbHNlIHsKKwkJYm9vbGVhbiBpc1VuYm94aW5nID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMDsKKwkJLy8gY29udmVyc2lvbiBvbmx5IGdlbmVyYXRlZCBpZiB1bmJveGluZworCQlpZiAoaXNVbmJveGluZykgY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJCXN3aXRjaCAoaXNVbmJveGluZyA/IHBvc3RDb252ZXJzaW9uVHlwZShjdXJyZW50U2NvcGUpLmlkIDogdGhpcy5yZXNvbHZlZFR5cGUuaWQpIHsKKwkJCWNhc2UgVF9sb25nIDoKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCWNvZGVTdHJlYW0ucG9wMigpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6Ci0JCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQotCQkJCWlmICh0aGlzLmdlbmVyaWNDYXN0ICE9IG51bGwpCi0JCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuZ2VuZXJpY0Nhc3QpOwotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQotCQkJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKXsgLy8gcHJlZml4IG9wZXJhdGlvbgotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJfQkJCi0JCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCi0JCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7Ci0JCQkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0ucG9wKCk7CiAJCX0KLQkJLy8gc3RvcmUgdGhlIHJlc3VsdCBiYWNrIGludG8gdGhlIHZhcmlhYmxlCi0JCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKLQkJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCi0JCQkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nLCB3cml0ZUFjY2Vzc29yLCB2YWx1ZVJlcXVpcmVkKTsKLQkJCQkvLyBubyBuZWVkIGZvciBnZW5lcmljIGNhc3QgYXMgdmFsdWUgZ290IGR1cHBlZAotCQkJCXJldHVybjsKLQkJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlCi0JCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCWlmICgobG9jYWxCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGxvY2FsQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQkJCWNvZGVTdHJlYW0uZHVwMigpOwotCQkJCQl9IGVsc2UgeworCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorCisvKgorICogUmVndWxhciBBUEkgZm9yIGNvbXBvdW5kIGFzc2lnbm1lbnQsIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHJlZmVyZW5jZSB0byB0aGUKKyAqIHZhcmlhYmxlLCB3aGljaCBjYXJyaWVzIGJvdGggc3ludGhldGljIHJlYWQvd3JpdGUgYWNjZXNzb3JzLgorICogVGhlIEFQSXMgd2l0aCBhbiBleHRyYSBhcmd1bWVudCBpcyB1c2VkIHdoZW5ldmVyIHRoZXJlIGFyZSB0d28gcmVmZXJlbmNlcyB0byB0aGUgc2FtZSB2YXJpYWJsZSB3aGljaAorICogYXJlIG9wdGltaXplZCBpbiBvbmUgYWNjZXNzOiBlLmcgImEgPSBhICsgMSIgb3B0aW1pemVkIGludG8gImErKyIuCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IG9wZXJhdG9yLCBpbnQgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTY4MgorCXN3aXRjaCAodGhpcy5iaXRzICYgQVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgQmluZGluZy5MT0NBTDoKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJLy8gY2hlY2sgaWYgY29tcG91bmQgYXNzaWdubWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiB0aGlzIGxvY2FsCisJCQlSZWZlcmVuY2UucmVwb3J0T25seVVzZWxlc3NseVJlYWRMb2NhbChjdXJyZW50U2NvcGUsIGxvY2FsQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJCQlicmVhazsKKwkJY2FzZSBCaW5kaW5nLkZJRUxEOgorCQkJLy8gY2hlY2sgaWYgY29tcG91bmQgYXNzaWdubWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiBhIHByaXZhdGUgZmllbGQKKwkJCXJlcG9ydE9ubHlVc2VsZXNzbHlSZWFkUHJpdmF0ZUZpZWxkKGN1cnJlbnRTY29wZSwgKEZpZWxkQmluZGluZyl0aGlzLmJpbmRpbmcsIHZhbHVlUmVxdWlyZWQpOworCX0KKwl0aGlzLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KAorCQljdXJyZW50U2NvcGUsCisJCWNvZGVTdHJlYW0sCisJCXRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbU2luZ2xlTmFtZVJlZmVyZW5jZS5XUklURV0sCisJCWV4cHJlc3Npb24sCisJCW9wZXJhdG9yLAorCQlhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLAorCQl2YWx1ZVJlcXVpcmVkKTsKK30KKworLyoKKyAqIFRoZSBBUElzIHdpdGggYW4gZXh0cmEgYXJndW1lbnQgaXMgdXNlZCB3aGVuZXZlciB0aGVyZSBhcmUgdHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUgd2hpY2gKKyAqIGFyZSBvcHRpbWl6ZWQgaW4gb25lIGFjY2VzczogZS5nICJhID0gYSArIDEiIG9wdGltaXplZCBpbnRvICJhKysiLgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBNZXRob2RCaW5kaW5nIHdyaXRlQWNjZXNzb3IsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IG9wZXJhdG9yLCBpbnQgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCUZpZWxkQmluZGluZyBjb2RlZ2VuRmllbGQgPSAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpOworCQkJaWYgKGNvZGVnZW5GaWVsZC5pc1N0YXRpYygpKSB7CisJCQkJaWYgKCh0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAodGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbU2luZ2xlTmFtZVJlZmVyZW5jZS5SRUFEXSA9PSBudWxsKSkgeworCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuRmllbGQsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0cnVlIC8qIGltcGxpY2l0IHRoaXMgKi8pOwkJCQkJCisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBjb2RlZ2VuRmllbGQsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljQWNjZXNzb3JzW1NpbmdsZU5hbWVSZWZlcmVuY2UuUkVBRF0sIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUKTsKKwkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQl9CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQlpZiAoKHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8ICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdID09IG51bGwpKSB7CisJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5GaWVsZCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGNvZGVnZW5GaWVsZCwgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbU2luZ2xlTmFtZVJlZmVyZW5jZS5SRUFEXSwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUgKGNhbm5vdCBhc3NpZ24gdG8gb3V0ZXIgbG9jYWwpCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCS8vIHVzaW5nIGluY3IgYnl0ZWNvZGUgaWYgcG9zc2libGUKKwkJCUNvbnN0YW50IGFzc2lnbkNvbnN0YW50OworCQkJc3dpdGNoIChsb2NhbEJpbmRpbmcudHlwZS5pZCkgeworCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZyA6CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kKGN1cnJlbnRTY29wZSwgdGhpcywgZXhwcmVzc2lvbik7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCQljb2RlU3RyZWFtLmR1cCgpOwogCQkJCQl9Ci0JCQkJfQotCQkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIENvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewotCQkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKLQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOwotCQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZykuaXNTdGF0aWMoKSkgewotCQkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7Ci0JCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3JzW1JFQURdKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewotCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOwotCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwotCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKLQkJCQkJfQotCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7Ci0JCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGZpZWxkQmluZGluZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwMigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXSAgLS0tPiBbb2xkIGZpZWxkIHZhbHVlXVtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXQotCQkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0aGlzLmdlbmVyaWNDYXN0ICE9IG51bGwpIAotCQkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmdlbmVyaWNDYXN0KTsKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsJCQotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIENPTVBJTEVfVFlQRV9NQVNLKTsKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQucHJlQXNzaWduSW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGZpZWxkQmluZGluZywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sIGZhbHNlKTsKLQkJCQkvLyBubyBuZWVkIGZvciBnZW5lcmljIGNhc3QgCi0JCQkJcmV0dXJuOwotCQkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQkJLy8gdXNpbmcgaW5jciBieXRlY29kZSBpZiBwb3NzaWJsZQotCQkJCWlmIChsb2NhbEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5JTlQpIHsKLQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwotCQkJCQl9Ci0JCQkJCWlmIChwb3N0SW5jcmVtZW50Lm9wZXJhdG9yID09IFBMVVMpIHsKLQkJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgMSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIC0xKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwotCQkJCQlpZiAodmFsdWVSZXF1aXJlZCl7Ci0JCQkJCQlpZiAoKGxvY2FsQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChsb2NhbEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIENPTVBJTEVfVFlQRV9NQVNLKTsKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbik7Ci0JCiAJCQkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7Ci0JCQkJfQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlY2VpdmVyKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQkJcmV0dXJuOworCQkJCWNhc2UgVF9pbnQgOgorCQkJCQlhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQ7CisJCQkJCWlmIChsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9PSAtMSkgeworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIHJlc3RhcnQgY29kZSBnZW4gYmVjYXVzZSB3ZSBlaXRoZXI6CisJCQkJCQkJICogLSBuZWVkIHRoZSB2YWx1ZQorCQkJCQkJCSAqIC0gdGhlIGNvbnN0YW50IGNhbiBoYXZlIHBvdGVudGlhbCBzaWRlLWVmZmVjdAorCQkJCQkJCSAqLworCQkJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQkJCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QoQ29kZVN0cmVhbS5SRVNUQVJUX0NPREVfR0VOX0ZPUl9VTlVTRURfTE9DQUxTX01PREUsIG51bGwpOworCQkJCQkJfSBlbHNlIGlmIChhc3NpZ25Db25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCQkJCQkvLyB3ZSBvbmx5IG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uJ3MgY29uc3RhbnQgaWYgaXQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorCQkJCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWlmICgoYXNzaWduQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCSYmIChhc3NpZ25Db25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfZmxvYXQpIC8vIG9ubHkgZm9yIGludGVncmFsIHR5cGVzCisJCQkJCQkJJiYgKGFzc2lnbkNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9kb3VibGUpKSB7IC8vIFRPRE8gKHBoaWxpcHBlKSBpcyB0aGlzIHRlc3QgbmVlZGVkID8KKwkJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCQkJCQljYXNlIFBMVVMgOgorCQkJCQkJCQlpbnQgaW5jcmVtZW50ICA9IGFzc2lnbkNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCQkJCWlmIChpbmNyZW1lbnQgIT0gKHNob3J0KSBpbmNyZW1lbnQpIGJyZWFrOyAvLyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIDE2LWJpdHMgdmFsdWUKKwkJCQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCBpbmNyZW1lbnQpOworCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCWNhc2UgTUlOVVMgOgorCQkJCQkJCQlpbmNyZW1lbnQgID0gLWFzc2lnbkNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCQkJCWlmIChpbmNyZW1lbnQgIT0gKHNob3J0KSBpbmNyZW1lbnQpIGJyZWFrOyAvLyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIDE2LWJpdHMgdmFsdWUKKwkJCQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCBpbmNyZW1lbnQpOworCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKKwkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uID09IC0xKSB7CisJCQkJCQlhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQ7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJCS8qCisJCQkJCQkJICogcmVzdGFydCBjb2RlIGdlbiBiZWNhdXNlIHdlIGVpdGhlcjoKKwkJCQkJCQkgKiAtIG5lZWQgdGhlIHZhbHVlCisJCQkJCQkJICogLSB0aGUgY29uc3RhbnQgY2FuIGhhdmUgcG90ZW50aWFsIHNpZGUtZWZmZWN0CisJCQkJCQkJICovCisJCQkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQkJCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChDb2RlU3RyZWFtLlJFU1RBUlRfQ09ERV9HRU5fRk9SX1VOVVNFRF9MT0NBTFNfTU9ERSwgbnVsbCk7CisJCQkJCQl9IGVsc2UgaWYgKGFzc2lnbkNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24ncyBjb25zdGFudCBpZiBpdCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uCisJCQkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQl9CiAJfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCi0JICovCi0JcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKSB7Ci0JCXJldHVybiBudWxsOworCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KKwlpbnQgb3BlcmF0aW9uVHlwZUlEOworCXN3aXRjaChvcGVyYXRpb25UeXBlSUQgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLklNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNCkgeworCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgorCQljYXNlIFRfdW5kZWZpbmVkIDoKKwkJCS8vIHdlIGVudGVyIGhlcmUgaWYgdGhlIHNpbmdsZSBuYW1lIHJlZmVyZW5jZSBpcyBhIGZpZWxkIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZyBvciBpZiB0aGUgdHlwZSBvZiB0aGUKKwkJCS8vIG9wZXJhdGlvbiBpcyBqYXZhLmxhbmcuT2JqZWN0CisJCQkvLyBGb3IgZXhhbXBsZTogbyA9IG8gKyAiIjsgLy8gd2hlcmUgdGhlIGNvbXBpbGVkIHR5cGUgb2YgbyBpcyBqYXZhLmxhbmcuT2JqZWN0LgorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKKwkJCS8vIG5vIG5lZWQgZm9yIGdlbmVyaWMgY2FzdCBvbiBwcmV2aW91cyAjZ2V0ZmllbGQgc2luY2UgdXNpbmcgT2JqZWN0IHN0cmluZyBidWZmZXIgbWV0aG9kcy4KKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCS8vIHByb21vdGUgdGhlIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgc3VpdGFibGUgb3BlcmF0aW9uIHR5cGUKKwkJCWlmICh0aGlzLmdlbmVyaWNDYXN0ICE9IG51bGwpCisJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpeyAvLyBwcmVmaXggb3BlcmF0aW9uCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0KKwkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7CisJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKIAl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IHRoaXMgbm9kZS4gQ2FuIGJlIGEgZGlyZWN0IHJlZmVyZW5jZSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkKLQkgKiBvciB0aHJ1IGEgY2FzdCBleHByZXNzaW9uIGV0Yy4uLgotCSAqLwotCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZygpIHsKLQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewotCQkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKLQkJCQlyZXR1cm4gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCi0JCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKQl7Ci0JCS8vSWYgaW5saW5hYmxlIGZpZWxkLCBmb3JnZXQgdGhlIGFjY2VzcyBlbXVsYXRpb24sIHRoZSBjb2RlIGdlbiB3aWxsIGRpcmVjdGx5IHRhcmdldCBpdAotCQlpZiAoKChiaXRzICYgRGVwdGhNQVNLKSA9PSAwKSB8fCAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSkgcmV0dXJuOwotCQotCQlpZiAoKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSA9PSBCaW5kaW5nLkxPQ0FMKSB7Ci0JCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZyk7Ci0JCX0KLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gaXNSZWFkQWNjZXNzKSB7Ci0JCi0JCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKQlyZXR1cm47Ci0JCi0JCS8vSWYgaW5saW5hYmxlIGZpZWxkLCBmb3JnZXQgdGhlIGFjY2VzcyBlbXVsYXRpb24sIHRoZSBjb2RlIGdlbiB3aWxsIGRpcmVjdGx5IHRhcmdldCBpdAotCQlpZiAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCS8vIHN0b3JlIHRoZSByZXN1bHQgYmFjayBpbnRvIHRoZSB2YXJpYWJsZQorCXN3aXRjaCAodGhpcy5iaXRzICYgQVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgY29kZWdlbkZpZWxkID0gKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZykub3JpZ2luYWwoKTsKKwkJCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBjb2RlZ2VuRmllbGQsIHdyaXRlQWNjZXNzb3IsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0cnVlIC8qIGltcGxpY2l0IHRoaXMqLywgdmFsdWVSZXF1aXJlZCk7CisJCQkvLyBubyBuZWVkIGZvciBnZW5lcmljIGNhc3QgYXMgdmFsdWUgZ290IGR1cHBlZAogCQkJcmV0dXJuOwotCQotCQlpZiAoKGJpdHMgJiBCaW5kaW5nLkZJRUxEKSAhPSAwKSB7Ci0JCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKKwkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlzd2l0Y2ggKGxvY2FsQmluZGluZy50eXBlLmlkKSB7CisJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOworCX0KK30KKworcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIENvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlzd2l0Y2ggKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyBhc3NpZ25pbmcgdG8gYSBmaWVsZAorCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpdGhpcy5iaW5kaW5nOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTY4MgorCQkJLy8gY2hlY2sgaWYgcG9zdEluY3JlbWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiBhIHByaXZhdGUgZmllbGQKKwkJCXJlcG9ydE9ubHlVc2VsZXNzbHlSZWFkUHJpdmF0ZUZpZWxkKGN1cnJlbnRTY29wZSwgZmllbGRCaW5kaW5nLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCUZpZWxkQmluZGluZyBjb2RlZ2VuRmllbGQgPSBmaWVsZEJpbmRpbmcub3JpZ2luYWwoKTsKLQkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPSBjb2RlZ2VuRmllbGQ7Ci0JCQlpZiAoKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKQotCQkJCSYmIChjb2RlZ2VuRmllbGQuaXNQcml2YXRlKCkgLy8gcHJpdmF0ZSBhY2Nlc3MKLQkJCQkJfHwgKGNvZGVnZW5GaWVsZC5pc1Byb3RlY3RlZCgpIC8vIGltcGxpY2l0IHByb3RlY3RlZCBhY2Nlc3MKLQkJCQkJCQkmJiBjb2RlZ2VuRmllbGQuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpICE9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZSgpKSkpIHsKLQkJCQlpZiAoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpCi0JCQkJCXN5bnRoZXRpY0FjY2Vzc29ycyA9IG5ldyBNZXRob2RCaW5kaW5nWzJdOwotCQkJCXN5bnRoZXRpY0FjY2Vzc29yc1tpc1JlYWRBY2Nlc3MgPyBSRUFEIDogV1JJVEVdID0gCi0JCQkJICAgICgoU291cmNlVHlwZUJpbmRpbmcpY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS4KLQkJCQkJCWVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpLmFkZFN5bnRoZXRpY01ldGhvZChjb2RlZ2VuRmllbGQsIGlzUmVhZEFjY2Vzcyk7Ci0JCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZEFjY2Vzcyhjb2RlZ2VuRmllbGQsIHRoaXMsIGlzUmVhZEFjY2Vzcyk7CisJCQlpZiAoY29kZWdlbkZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQlpZiAoKHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8ICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdID09IG51bGwpKSB7CisJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5GaWVsZCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBjb2RlZ2VuRmllbGQsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljQWNjZXNzb3JzW1NpbmdsZU5hbWVSZWZlcmVuY2UuUkVBRF0sIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPj4gQVNUTm9kZS5EZXB0aFNISUZUKTsKKwkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQl9CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQlpZiAoKHRoaXMuc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8ICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQURdID09IG51bGwpKSB7CisJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5GaWVsZCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGNvZGVnZW5GaWVsZCwgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnNbU2luZ2xlTmFtZVJlZmVyZW5jZS5SRUFEXSwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKKwkJCQl9CisJCQl9CisJCQlUeXBlQmluZGluZyBvcGVyYW5kVHlwZTsKKwkJCWlmICh0aGlzLmdlbmVyaWNDYXN0ICE9IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmdlbmVyaWNDYXN0KTsKKwkJCQlvcGVyYW5kVHlwZSA9IHRoaXMuZ2VuZXJpY0Nhc3Q7CisJCQl9IGVsc2UgeworCQkJCW9wZXJhbmRUeXBlID0gY29kZWdlbkZpZWxkLnR5cGU7CisJCQl9CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWlmIChjb2RlZ2VuRmllbGQuaXNTdGF0aWMoKSkgeworCQkJCQlzd2l0Y2ggKG9wZXJhbmRUeXBlLmlkKSB7CisJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0JCQkJCQorCQkJCX0gZWxzZSB7IC8vIFN0YWNrOiAgW293bmVyXVtvbGQgZmllbGQgdmFsdWVdICAtLS0+IFtvbGQgZmllbGQgdmFsdWVdW293bmVyXVtvbGQgZmllbGQgdmFsdWVdCisJCQkJCXN3aXRjaCAob3BlcmFuZFR5cGUuaWQpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJY29kZVN0cmVhbS5kdXBfeDEoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLkNPTVBJTEVfVFlQRV9NQVNLKTsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOworCQkJZmllbGRTdG9yZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGNvZGVnZW5GaWVsZCwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tTaW5nbGVOYW1lUmVmZXJlbmNlLldSSVRFXSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRydWUgLyppbXBsaWNpdCB0aGlzKi8sIGZhbHNlKTsKKwkJCS8vIG5vIG5lZWQgZm9yIGdlbmVyaWMgY2FzdCAKKwkJCXJldHVybjsKKwkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTY4MgorCQkJLy8gY2hlY2sgaWYgcG9zdEluY3JlbWVudCBpcyB0aGUgb25seSB1c2FnZSBvZiB0aGlzIGxvY2FsCisJCQlSZWZlcmVuY2UucmVwb3J0T25seVVzZWxlc3NseVJlYWRMb2NhbChjdXJyZW50U2NvcGUsIGxvY2FsQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CisJCQlpZiAobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gPT0gLTEpIHsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkvLyByZXN0YXJ0IGNvZGUgZ2VuCisJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKENvZGVTdHJlYW0uUkVTVEFSVF9DT0RFX0dFTl9GT1JfVU5VU0VEX0xPQ0FMU19NT0RFLCBudWxsKTsKKwkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCi0JCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCQkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCi0JCQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBmaWVsZCBhY2Nlc3MuCQotCQkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZQotCQkJCQkmJiAhdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQotCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKLQkJCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50KCkgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7Ci0JCQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCk7Ci0JCQkJaWYgKChvcHRpb25zLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8yCi0JCQkJCQkmJiAob3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCB8fCAhZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpCi0JCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9KYXZhTGFuZ09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzCi0JCQkJCXx8ICFmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkgewotCQkKLQkJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IAotCQkJCQkgICAgY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKAotCQkJCQkJICAgICAgIGNvZGVnZW5GaWVsZCwgCi0JCQkJCQkgICAgICAgIChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSk7CisKKwkJCS8vIHVzaW5nIGluY3IgYnl0ZWNvZGUgaWYgcG9zc2libGUKKwkJCWlmIChsb2NhbEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5JTlQpIHsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKIAkJCQl9Ci0JCQl9CQkJCQkKKwkJCQlpZiAocG9zdEluY3JlbWVudC5vcGVyYXRvciA9PSBPcGVyYXRvcklkcy5QTFVTKSB7CisJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCAtMSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCl7CisJCQkJCXN3aXRjaCAobG9jYWxCaW5kaW5nLnR5cGUuaWQpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQkJCQkJCisJCQkJfQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7CisJCQl9CisJfQorfQorCitwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlY2VpdmVyKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCisgKi8KK3B1YmxpYyBUeXBlQmluZGluZ1tdIGdlbmVyaWNUeXBlQXJndW1lbnRzKCkgeworCXJldHVybiBudWxsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGxvY2FsIHZhcmlhYmxlIHJlZmVyZW5jZWQgYnkgdGhpcyBub2RlLiBDYW4gYmUgYSBkaXJlY3QgcmVmZXJlbmNlIChTaW5nbGVOYW1lUmVmZXJlbmNlKQorICogb3IgdGhydSBhIGNhc3QgZXhwcmVzc2lvbiBldGMuLi4KKyAqLworcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nKCkgeworCXN3aXRjaCAodGhpcy5iaXRzICYgQVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbCB2YXJpYWJsZQorCQkJcmV0dXJuIChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIHZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwkvL0lmIGlubGluYWJsZSBmaWVsZCwgZm9yZ2V0IHRoZSBhY2Nlc3MgZW11bGF0aW9uLCB0aGUgY29kZSBnZW4gd2lsbCBkaXJlY3RseSB0YXJnZXQgaXQKKwlpZiAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgPT0gMCkgfHwgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSkgeworCQlyZXR1cm47CisJfQorCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLKSA9PSBCaW5kaW5nLkxPQ0FMKSB7CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCWlmIChsb2NhbFZhcmlhYmxlQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAoKGxvY2FsVmFyaWFibGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLk5vdEluaXRpYWxpemVkKSAhPSAwKSB7CisJCQkJLy8gbG9jYWwgd2FzIHRhZ2dlZCBhcyB1bmluaXRpYWxpemVkCisJCQkJcmV0dXJuOworCQkJfQorCQkJc3dpdGNoKGxvY2FsVmFyaWFibGVCaW5kaW5nLnVzZUZsYWcpIHsKKwkJCQljYXNlIExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRCA6CisJCQkJY2FzZSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEIDoKKwkJCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2Vzcyhsb2NhbFZhcmlhYmxlQmluZGluZyk7CisJCQl9CiAJCX0KIAl9Cit9CisKK3B1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbywgYm9vbGVhbiBpc1JlYWRBY2Nlc3MpIHsKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKQlyZXR1cm47CisKKwkvL0lmIGlubGluYWJsZSBmaWVsZCwgZm9yZ2V0IHRoZSBhY2Nlc3MgZW11bGF0aW9uLCB0aGUgY29kZSBnZW4gd2lsbCBkaXJlY3RseSB0YXJnZXQgaXQKKwlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCXJldHVybjsKKworCWlmICgodGhpcy5iaXRzICYgQmluZGluZy5GSUVMRCkgIT0gMCkgeworCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOworCQlGaWVsZEJpbmRpbmcgY29kZWdlbkZpZWxkID0gZmllbGRCaW5kaW5nLm9yaWdpbmFsKCk7CisJCWlmICgoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSAhPSAwKQorCQkJJiYgKGNvZGVnZW5GaWVsZC5pc1ByaXZhdGUoKSAvLyBwcml2YXRlIGFjY2VzcworCQkJCXx8IChjb2RlZ2VuRmllbGQuaXNQcm90ZWN0ZWQoKSAvLyBpbXBsaWNpdCBwcm90ZWN0ZWQgYWNjZXNzCisJCQkJCQkmJiBjb2RlZ2VuRmllbGQuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpICE9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZSgpKSkpIHsKKwkJCWlmICh0aGlzLnN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKQorCQkJCXRoaXMuc3ludGhldGljQWNjZXNzb3JzID0gbmV3IE1ldGhvZEJpbmRpbmdbMl07CisJCQl0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tpc1JlYWRBY2Nlc3MgPyBTaW5nbGVOYW1lUmVmZXJlbmNlLlJFQUQgOiBTaW5nbGVOYW1lUmVmZXJlbmNlLldSSVRFXSA9CisJCQkgICAgKChTb3VyY2VUeXBlQmluZGluZyljdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLgorCQkJCQllbmNsb3NpbmdUeXBlQXQoKHRoaXMuYml0cyAmIEFTVE5vZGUuRGVwdGhNQVNLKSA+PiBBU1ROb2RlLkRlcHRoU0hJRlQpKS5hZGRTeW50aGV0aWNNZXRob2QoY29kZWdlbkZpZWxkLCBpc1JlYWRBY2Nlc3MsIGZhbHNlIC8qbm90IHN1cGVyIGFjY2VzcyovKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlRmllbGRBY2Nlc3MoY29kZWdlbkZpZWxkLCB0aGlzLCBpc1JlYWRBY2Nlc3MpOworCQkJcmV0dXJuOworCQl9CisJfQorfQogCiBwdWJsaWMgaW50IG51bGxTdGF0dXMoRmxvd0luZm8gZmxvd0luZm8pIHsKIAlpZiAodGhpcy5jb25zdGFudCAhPSBudWxsICYmIHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCXJldHVybiBGbG93SW5mby5OT05fTlVMTDsgLy8gY29uc3RhbnQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgbnVsbAogCX0KLQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJc3dpdGNoICh0aGlzLmJpdHMgJiBBU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCiAJCQlyZXR1cm4gRmxvd0luZm8uVU5LTk9XTjsKIAkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCiAJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQkJaWYgKGxvY2FsICE9IG51bGwpIHsKLQkJCQlpZiAoZmxvd0luZm8uaXNEZWZpbml0ZWx5TnVsbChsb2NhbCkpCi0JCQkJCXJldHVybiBGbG93SW5mby5OVUxMOwotCQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKSkKLQkJCQkJcmV0dXJuIEZsb3dJbmZvLk5PTl9OVUxMOwotCQkJCXJldHVybiBGbG93SW5mby5VTktOT1dOOwotCQkJfQorCQkJaWYgKGxvY2FsICE9IG51bGwpCisJCQkJcmV0dXJuIGZsb3dJbmZvLm51bGxTdGF0dXMobG9jYWwpOwogCX0KLQlyZXR1cm4gRmxvd0luZm8uTk9OX05VTEw7IC8vIG5ldmVyIGdldCB0aGVyZSAKKwlyZXR1cm4gRmxvd0luZm8uTk9OX05VTEw7IC8vIG5ldmVyIGdldCB0aGVyZQogfQogCiAJLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24jcG9zdENvbnZlcnNpb25UeXBlKFNjb3BlKQotCSAqLwotCXB1YmxpYyBUeXBlQmluZGluZyBwb3N0Q29udmVyc2lvblR5cGUoU2NvcGUgc2NvcGUpIHsKLQkJVHlwZUJpbmRpbmcgY29udmVydGVkVHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlOwotCQlpZiAodGhpcy5nZW5lcmljQ2FzdCAhPSBudWxsKSAKLQkJCWNvbnZlcnRlZFR5cGUgPSB0aGlzLmdlbmVyaWNDYXN0OwotCQlpbnQgcnVudGltZVR5cGUgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7Ci0JCXN3aXRjaCAocnVudGltZVR5cGUpIHsKLQkJCWNhc2UgVF9ib29sZWFuIDoKLQkJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQk9PTEVBTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9ieXRlIDoKLQkJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQllURTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9zaG9ydCA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLlNIT1JUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX2NoYXIgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5DSEFSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX2ludCA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLklOVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVF9mbG9hdCA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkZMT0FUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX2xvbmcgOgotCQkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5MT05HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkRPVUJMRTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQl9CQkKLQkJaWYgKCh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIEJPWElORykgIT0gMCkgewotCQkJY29udmVydGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29udmVydGVkVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlZFR5cGU7CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiNwb3N0Q29udmVyc2lvblR5cGUoU2NvcGUpCisgKi8KK3B1YmxpYyBUeXBlQmluZGluZyBwb3N0Q29udmVyc2lvblR5cGUoU2NvcGUgc2NvcGUpIHsKKwlUeXBlQmluZGluZyBjb252ZXJ0ZWRUeXBlID0gdGhpcy5yZXNvbHZlZFR5cGU7CisJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkKKwkJY29udmVydGVkVHlwZSA9IHRoaXMuZ2VuZXJpY0Nhc3Q7CisJaW50IHJ1bnRpbWVUeXBlID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5JTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7CisJc3dpdGNoIChydW50aW1lVHlwZSkgeworCQljYXNlIFRfYm9vbGVhbiA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQk9PTEVBTjsKKwkJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCQljb252ZXJ0ZWRUeXBlID0gVHlwZUJpbmRpbmcuQllURTsKKwkJCWJyZWFrOworCQljYXNlIFRfc2hvcnQgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLlNIT1JUOworCQkJYnJlYWs7CisJCWNhc2UgVF9jaGFyIDoKKwkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5DSEFSOworCQkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLklOVDsKKwkJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkZMT0FUOworCQkJYnJlYWs7CisJCWNhc2UgVF9sb25nIDoKKwkJCWNvbnZlcnRlZFR5cGUgPSBUeXBlQmluZGluZy5MT05HOworCQkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJY29udmVydGVkVHlwZSA9IFR5cGVCaW5kaW5nLkRPVUJMRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKIAl9Ci0JCi0JcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCl7Ci0JCi0JCXJldHVybiBvdXRwdXQuYXBwZW5kKHRva2VuKTsKKwlpZiAoKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5CT1hJTkcpICE9IDApIHsKKwkJY29udmVydGVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUoY29udmVydGVkVHlwZSk7CiAJfQotCXB1YmxpYyBUeXBlQmluZGluZyByZXBvcnRFcnJvcihCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQotCQkvLz09PT09ZXJyb3IgY2FzZXM9PT09PT09Ci0JCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKTsKLQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgYmluZGluZyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQkvLyBmb3IgY29kZSBnZW4sIGhhcm0gdGhlIHJlc3RyaWN0aXZlRmxhZyAJCi0JCi0JCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRGaWVsZCh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdG9rZW4sIHRoaXMpOwotCQl9IGVsc2UgewotCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQl0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRva2VuLCBiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSywgdGhpcywgdHJ1ZSAvKnJlc29sdmUqLyk7Ci0JCX0KLQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZzsKLQkJaWYgKHRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7Ci0JCQkJY2FzZSBCaW5kaW5nLlZBUklBQkxFIDogLy8gPT09PT09PT09b25seSB2YXJpYWJsZT09PT09PT09PT09PQotCQkJCWNhc2UgQmluZGluZy5WQVJJQUJMRSB8IEJpbmRpbmcuVFlQRSA6IC8vPT09PWJvdGggdmFyaWFibGUgYW5kIHR5cGU9PT09PT09PT09PT0KLQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBWYXJpYWJsZUJpbmRpbmcpIHsKLQkJCQkJCVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IChWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nKSB7Ci0JCQkJCQkJYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgIC8vIGNsZWFyIGJpdHMKLQkJCQkJCQliaXRzIHw9IEJpbmRpbmcuTE9DQUw7Ci0JCQkJCQkJaWYgKCF2YXJpYWJsZS5pc0ZpbmFsKCkgJiYgKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90UmVmZXJUb05vbkZpbmFsT3V0ZXJMb2NhbCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpdmFyaWFibGUsIHRoaXMpOwotCQkJCQkJCX0KLQkJCQkJCQlUeXBlQmluZGluZyBmaWVsZFR5cGUgPSB2YXJpYWJsZS50eXBlOwotCQkJCQkJCWlmICgodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwKSB7Ci0JCQkJCQkJCWNvbnN0YW50ID0gdmFyaWFibGUuY29uc3RhbnQoKTsKLQkJCQkJCQkJaWYgKGZpZWxkVHlwZSAhPSBudWxsKSAKLQkJCQkJCQkJCWZpZWxkVHlwZSA9IGZpZWxkVHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCk7IC8vIHBlcmZvcm0gY2FwdHVyZSBjb252ZXJzaW9uIGlmIHJlYWQgYWNjZXNzCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGZpZWxkVHlwZTsKLQkJCQkJCX0KLQkJCQkJCS8vIGEgZmllbGQKLQkJCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQkJCQkJCWlmICghZmllbGQuaXNTdGF0aWMoKSAmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuVW5xdWFsaWZpZWRGaWVsZEFjY2VzcykgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5xdWFsaWZpZWRGaWVsZEFjY2Vzcyh0aGlzLCBmaWVsZCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBwZXJmb3JtIGNhcHR1cmUgY29udmVyc2lvbiBpZiByZWFkIGFjY2VzcwotCQkJCQkJVHlwZUJpbmRpbmcgZmllbGRUeXBlID0gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7Ci0JCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSAKLQkJCQkJCQkoKCh0aGlzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWQpID09IDApIAotCQkJCQkJCQk/IGZpZWxkVHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCkKLQkJCQkJCQkJOiBmaWVsZFR5cGUpOwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRodXMgaXQgd2FzIGEgdHlwZQotCQkJCQliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAgLy8gY2xlYXIgYml0cwotCQkJCQliaXRzIHw9IEJpbmRpbmcuVFlQRTsKLQkJCQljYXNlIEJpbmRpbmcuVFlQRSA6IC8vPT09PT09PT1vbmx5IHR5cGU9PT09PT09PT09PT09PQotCQkJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJCQkJLy9kZXByZWNhdGVkIHRlc3QKLQkJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IChUeXBlQmluZGluZyliaW5kaW5nOwotCQkJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0eXBlLCBzY29wZSkpCi0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0eXBlLCB0aGlzKTsKLQkJCQkJdHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0eXBlKTsKLQkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdHlwZTsKLQkJCX0KLQkJfQotCQotCQkvLyBlcnJvciBzY2VuYXJpaQotCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLnJlcG9ydEVycm9yKHNjb3BlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLQl9CisJcmV0dXJuIGNvbnZlcnRlZFR5cGU7Cit9CiAKLQlwdWJsaWMgU3RyaW5nIHVuYm91bmRSZWZlcmVuY2VFcnJvck5hbWUoKXsKLQkKLQkJcmV0dXJuIG5ldyBTdHJpbmcodG9rZW4pOwotCX0JCitwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKKwlyZXR1cm4gb3V0cHV0LmFwcGVuZCh0aGlzLnRva2VuKTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXBvcnRFcnJvcihCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy89PT09PWVycm9yIGNhc2VzPT09PT09PQorCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZyk7CisJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyB8fCB0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBNaXNzaW5nVHlwZUJpbmRpbmcpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOworCX0gZWxzZSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucmVzb2x2YWJsZVJlZmVyZW5jZSh0aGlzLCB0aGlzLmJpbmRpbmcpOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBmb3IgY29kZSBnZW4sIGhhcm0gdGhlIHJlc3RyaWN0aXZlRmxhZworCisJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKKwkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOworCX0gZWxzZSB7CisJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQl0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRoaXMudG9rZW4sIHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSywgdGhpcywgdHJ1ZSAvKnJlc29sdmUqLyk7CisJfQorCWlmICh0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQlzd2l0Y2ggKHRoaXMuYml0cyAmIEFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBCaW5kaW5nLlZBUklBQkxFIDogLy8gPT09PT09PT09b25seSB2YXJpYWJsZT09PT09PT09PT09PQorCQkJY2FzZSBCaW5kaW5nLlZBUklBQkxFIHwgQmluZGluZy5UWVBFIDogLy89PT09Ym90aCB2YXJpYWJsZSBhbmQgdHlwZT09PT09PT09PT09PQorCQkJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBWYXJpYWJsZUJpbmRpbmcpIHsKKwkJCQkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlID0gKFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJCQlUeXBlQmluZGluZyB2YXJpYWJsZVR5cGU7CisJCQkJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7ICAvLyBjbGVhciBiaXRzCisJCQkJCQl0aGlzLmJpdHMgfD0gQmluZGluZy5MT0NBTDsKKwkJCQkJCWlmICghdmFyaWFibGUuaXNGaW5hbCgpICYmICh0aGlzLmJpdHMgJiBBU1ROb2RlLkRlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFJlZmVyVG9Ob25GaW5hbE91dGVyTG9jYWwoKExvY2FsVmFyaWFibGVCaW5kaW5nKXZhcmlhYmxlLCB0aGlzKTsKKwkJCQkJCX0KKwkJCQkJCXZhcmlhYmxlVHlwZSA9IHZhcmlhYmxlLnR5cGU7CisJCQkJCQl0aGlzLmNvbnN0YW50ID0gKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwID8gdmFyaWFibGUuY29uc3RhbnQoKSA6IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGEgZmllbGQKKwkJCQkJCXZhcmlhYmxlVHlwZSA9IGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOworCQkJCQl9CisJCQkJCS8vIHBlcmZvcm0gY2FwdHVyZSBjb252ZXJzaW9uIGlmIHJlYWQgYWNjZXNzCisJCQkJCWlmICh2YXJpYWJsZVR5cGUgIT0gbnVsbCkgeworCQkJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB2YXJpYWJsZVR5cGUgPSAoKCh0aGlzLmJpdHMgJiBBU1ROb2RlLklzU3RyaWN0bHlBc3NpZ25lZCkgPT0gMCkKKwkJCQkJCQkJPyB2YXJpYWJsZVR5cGUuY2FwdHVyZShzY29wZSwgdGhpcy5zb3VyY2VFbmQpCisJCQkJCQkJCTogdmFyaWFibGVUeXBlKTsKKwkJCQkJCWlmICgodmFyaWFibGVUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQkJaWYgKCh0aGlzLmJpdHMgJiBCaW5kaW5nLkxPQ0FMKSA9PSAwKSB7CisJCQkJCQkJCS8vIG9ubHkgY29tcGxhaW4gaWYgZmllbGQgcmVmZXJlbmNlIChmb3IgbG9jYWwsIGl0cyB0eXBlIGdvdCBmbGFnZ2VkIGFscmVhZHkpCisJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIHZhcmlhYmxlVHlwZSk7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiB2YXJpYWJsZVR5cGU7CisJCQkJfQorCisJCQkJLy8gdGh1cyBpdCB3YXMgYSB0eXBlCisJCQkJdGhpcy5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7ICAvLyBjbGVhciBiaXRzCisJCQkJdGhpcy5iaXRzIHw9IEJpbmRpbmcuVFlQRTsKKwkJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQljYXNlIEJpbmRpbmcuVFlQRSA6IC8vPT09PT09PT1vbmx5IHR5cGU9PT09PT09PT09PT09PQorCQkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJLy9kZXByZWNhdGVkIHRlc3QKKwkJCQlUeXBlQmluZGluZyB0eXBlID0gKFR5cGVCaW5kaW5nKXRoaXMuYmluZGluZzsKKwkJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0eXBlLCBzY29wZSkpCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKHR5cGUsIHRoaXMpOworCQkJCXR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodHlwZSwgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CisJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdHlwZTsKKwkJfQorCX0KKwkvLyBlcnJvciBzY2VuYXJpaQorCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHJlcG9ydEVycm9yKHNjb3BlKTsKK30KKworcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9CisKK3B1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQorCitwdWJsaWMgU3RyaW5nIHVuYm91bmRSZWZlcmVuY2VFcnJvck5hbWUoKXsKKwlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLnRva2VuKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggNGYzZmQwZS4uOWQzYjcwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMSwxNyArMjEsMTcgQEAKIAogCXB1YmxpYyBTaW5nbGVUeXBlUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7CiAKLQkJCXRva2VuID0gc291cmNlOwotCQkJc291cmNlU3RhcnQgPSAoaW50KSAocG9zPj4+MzIpICA7Ci0JCQlzb3VyY2VFbmQgPSAoaW50KSAocG9zICYgMHgwMDAwMDAwMEZGRkZGRkZGTCkgOwotCQkKKwkJCXRoaXMudG9rZW4gPSBzb3VyY2U7CisJCQl0aGlzLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcz4+PjMyKSAgOworCQkJdGhpcy5zb3VyY2VFbmQgPSAoaW50KSAocG9zICYgMHgwMDAwMDAwMEZGRkZGRkZGTCkgOworCiAJfQogCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CiAJCS8vcmV0dXJuIGEgdHlwZSByZWZlcmVuY2UgY29weSBvZiBtZSB3aXRoIHNvbWUgZGltZW5zaW9ucwogCQkvL3dhcm5pbmcgOiB0aGUgbmV3IHR5cGUgcmVmIGhhcyBhIG51bGwgYmluZGluZwotCQkKLQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UodG9rZW4sIGRpbSwoKChsb25nKXNvdXJjZVN0YXJ0KTw8MzIpK3NvdXJjZUVuZCk7CisKKwkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UodGhpcy50b2tlbiwgZGltLCgoKGxvbmcpdGhpcy5zb3VyY2VTdGFydCk8PDMyKSt0aGlzLnNvdXJjZUVuZCk7CiAJfQogCiAJcHVibGljIGNoYXJbXSBnZXRMYXN0VG9rZW4oKSB7CkBAIC00MSw3ICs0MSw3IEBACiAJCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKQogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCi0JCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuZ2V0VHlwZSh0b2tlbik7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuZ2V0VHlwZSh0aGlzLnRva2VuKTsKIAogCQlpZiAoc2NvcGUua2luZCA9PSBTY29wZS5DTEFTU19TQ09QRSAmJiB0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKQogCQkJaWYgKCgoQ2xhc3NTY29wZSkgc2NvcGUpLmRldGVjdEhpZXJhcmNoeUN5Y2xlKHRoaXMucmVzb2x2ZWRUeXBlLCB0aGlzKSkKQEAgLTUwLDMwICs1MCwzNyBAQAogCX0KIAogCXB1YmxpYyBjaGFyIFtdW10gZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgY2hhcltdW10geyB0b2tlbiB9OworCQlyZXR1cm4gbmV3IGNoYXJbXVtdIHsgdGhpcy50b2tlbiB9OwogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewotCQkKLQkJcmV0dXJuIG91dHB1dC5hcHBlbmQodG9rZW4pOworCisJCXJldHVybiBvdXRwdXQuYXBwZW5kKHRoaXMudG9rZW4pOwogCX0KIAogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZUVuY2xvc2luZyhCbG9ja1Njb3BlIHNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKLQotCQlUeXBlQmluZGluZyBtZW1iZXJUeXBlID0gc2NvcGUuZ2V0TWVtYmVyVHlwZSh0b2tlbiwgZW5jbG9zaW5nVHlwZSk7CisJCVR5cGVCaW5kaW5nIG1lbWJlclR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmdldE1lbWJlclR5cGUodGhpcy50b2tlbiwgZW5jbG9zaW5nVHlwZSk7CisJCWJvb2xlYW4gaGFzRXJyb3IgPSBmYWxzZTsKIAkJaWYgKCFtZW1iZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gbWVtYmVyVHlwZTsKKwkJCWhhc0Vycm9yID0gdHJ1ZTsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRFbmNsb3NpbmdUeXBlKHRoaXMsIG1lbWJlclR5cGUsIGVuY2xvc2luZ1R5cGUpOwotCQkJcmV0dXJuIG51bGw7CisJCQltZW1iZXJUeXBlID0gKChSZWZlcmVuY2VCaW5kaW5nKW1lbWJlclR5cGUpLmNsb3Nlc3RNYXRjaCgpOworCQkJaWYgKG1lbWJlclR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQl9CiAJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKG1lbWJlclR5cGUsIHNjb3BlKSkKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKG1lbWJlclR5cGUsIHRoaXMpOwotCQltZW1iZXJUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKG1lbWJlclR5cGUpOwotCQlpZiAobWVtYmVyVHlwZS5pc1Jhd1R5cGUoKSAKLQkJCQkmJiAodGhpcy5iaXRzICYgSWdub3JlUmF3VHlwZUNoZWNrKSA9PSAwIAorCQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUobWVtYmVyVHlwZSwgc2NvcGUpOworCQltZW1iZXJUeXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKG1lbWJlclR5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOworCQlpZiAobWVtYmVyVHlwZS5pc1Jhd1R5cGUoKQorCQkJCSYmICh0aGlzLmJpdHMgJiBJZ25vcmVSYXdUeXBlQ2hlY2spID09IDAKIAkJCQkmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZSkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKXsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJhd1R5cGVSZWZlcmVuY2UodGhpcywgbWVtYmVyVHlwZSk7CiAJCX0KKwkJaWYgKGhhc0Vycm9yKSB7CisJCQkvLyBkbyBub3Qgc3RvcmUgdGhlIGNvbXB1dGVkIHR5cGUsIGtlZXAgdGhlIHByb2JsZW0gdHlwZSBpbnN0ZWFkCisJCQlyZXR1cm4gbWVtYmVyVHlwZTsKKwkJfQogCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBtZW1iZXJUeXBlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RhdGVtZW50LmphdmEKaW5kZXggMzUwYTRlZi4uZTFiMTBkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAzMzUwOTMgLSBbY29tcGlsZXJdW251bGxdIG1pbmltYWwgaG9vayBmb3IgZnV0dXJlIG51bGwgYW5ub3RhdGlvbiBzdXBwb3J0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMTYsMTI5ICsxNywxOTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbyk7Ci0JCisKIAkvKioKLQkgKiBJTlRFUk5BTCBVU0UgT05MWS4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gcmVkaXJlY3QgaW50ZXItc3RhdGVtZW50cyBqdW1wcy4KKwkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGlmIGlzIGlkZW50aWZpZWQgYXMgYSBrbm93biBjb2RpbmcgcGF0dGVybiB3aGljaAorCSAqIHNob3VsZCBiZSB0b2xlcmF0ZWQgYnkgZGVhZCBjb2RlIGFuYWx5c2lzLgorCSAqIGUuZy4gaWYgKERFQlVHKSBwcmludCgpOyAvLyBubyBjb21wbGFpbnQKKwkgKiBPbmx5IGludm9rZWQgd2hlbiBvdmVyYWxsIGNvbmRpdGlvbiBpcyBrbm93biB0byBiZSBvcHRpbWl6ZWFibGUgaW50byBmYWxzZS90cnVlLgogCSAqLwotCXB1YmxpYyB2b2lkIGJyYW5jaENoYWluVG8oQnJhbmNoTGFiZWwgbGFiZWwpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzS25vd0RlYWRDb2RlUGF0dGVybihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJLy8gaWYgKCFERUJVRykgcHJpbnQoKTsgLSB0b2xlcmF0ZWQKKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsKKwkJCWV4cHJlc3Npb24gPSAoKFVuYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZXhwcmVzc2lvbjsKKwkJfQorCQkvLyBpZiAoREVCVUcpIHByaW50KCk7IC0gdG9sZXJhdGVkCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlKSByZXR1cm4gdHJ1ZTsKKworLy8JCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworLy8JCQlCaW5hcnlFeHByZXNzaW9uIGJpbmFyeSA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uOworLy8JCQlzd2l0Y2ggKChiaW5hcnkuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQvKiBvcGVyYXRvciAqLykgeworLy8JCQkJY2FzZSBPcGVyYXRvcklkcy5BTkRfQU5EIDoKKy8vCQkJCWNhc2UgT3BlcmF0b3JJZHMuT1JfT1IgOgorLy8JCQkJCWJyZWFrOworLy8JCQkJZGVmYXVsdDogCisvLwkJCQkJLy8gaWYgKERFQlVHX0xFVkVMID4gMCkgcHJpbnQoKTsgLSB0b2xlcmF0ZWQKKy8vCQkJCQlpZiAoKGJpbmFyeS5sZWZ0IGluc3RhbmNlb2YgUmVmZXJlbmNlKSAmJiBiaW5hcnkucmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKKy8vCQkJCQkvLyBpZiAoMCA8IERFQlVHX0xFVkVMKSBwcmludCgpOyAtIHRvbGVyYXRlZAorLy8JCQkJCWlmICgoYmluYXJ5LnJpZ2h0IGluc3RhbmNlb2YgUmVmZXJlbmNlKSAmJiBiaW5hcnkubGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisvLwkJCQkJCXJldHVybiB0cnVlOworLy8JCQl9CisvLwkJfQorCQlyZXR1cm4gZmFsc2U7CiAJfQorcHVibGljIGFic3RyYWN0IEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0NPTVBMQUlORUQgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMQUlORURfRkFLRV9SRUFDSEFCTEUgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMQUlORURfVU5SRUFDSEFCTEUgPSAyOwogCQotCS8vIFJlcG9ydCBhbiBlcnJvciBpZiBuZWNlc3NhcnkKLQlwdWJsaWMgYm9vbGVhbiBjb21wbGFpbklmVW5yZWFjaGFibGUoRmxvd0luZm8gZmxvd0luZm8sIEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gZGlkQWxyZWFkeUNvbXBsYWluKSB7Ci0JCi0JCWlmICgoZmxvd0luZm8ucmVhY2hNb2RlKCkgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgeworLyoqIEVtcHR5IGhvb2sgZm9yIGNoZWNraW5nIG51bGwgc3RhdHVzIGFnYWluc3QgZGVjbGFyYXRpb24gdXNpbmcgbnVsbCBhbm5vdGF0aW9ucywgb25jZSB0aGlzIHdpbGwgYmUgc3VwcG9ydGVkLiAqLworcHJvdGVjdGVkIGludCBjaGVja0FnYWluc3ROdWxsQW5ub3RhdGlvbihCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIGludCBudWxsU3RhdHVzKSB7CisJcmV0dXJuIG51bGxTdGF0dXM7Cit9CisKKy8qKgorICogSU5URVJOQUwgVVNFIE9OTFkuCisgKiBUaGlzIGlzIHVzZWQgdG8gcmVkaXJlY3QgaW50ZXItc3RhdGVtZW50cyBqdW1wcy4KKyAqLworcHVibGljIHZvaWQgYnJhbmNoQ2hhaW5UbyhCcmFuY2hMYWJlbCBsYWJlbCkgeworCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorfQorCisvLyBSZXBvcnQgYW4gZXJyb3IgaWYgbmVjZXNzYXJ5IChpZiBldmVuIG1vcmUgdW5yZWFjaGFibGUgdGhhbiBwcmV2aW91c2x5IHJlcG9ydGVkCisvLyBjb21wbGFpbnRMZXZlbCA9IDAgaWYgd2FzIHJlYWNoYWJsZSB1cCB1bnRpbCBub3csIDEgaWYgZmFrZSByZWFjaGFibGUgKGRlYWRjb2RlKSwgMiBpZiBmYXRhbCB1bnJlYWNoYWJsZSAoZXJyb3IpCitwdWJsaWMgaW50IGNvbXBsYWluSWZVbnJlYWNoYWJsZShGbG93SW5mbyBmbG93SW5mbywgQmxvY2tTY29wZSBzY29wZSwgaW50IHByZXZpb3VzQ29tcGxhaW50TGV2ZWwpIHsKKwlpZiAoKGZsb3dJbmZvLnJlYWNoTW9kZSgpICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApIHsKKwkJaWYgKChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpICE9IDApCiAJCQl0aGlzLmJpdHMgJj0gfkFTVE5vZGUuSXNSZWFjaGFibGU7Ci0JCQlib29sZWFuIHJlcG9ydGVkID0gZmxvd0luZm8gPT0gRmxvd0luZm8uREVBRF9FTkQ7Ci0JCQlpZiAoIWRpZEFscmVhZHlDb21wbGFpbiAmJiByZXBvcnRlZCkgeworCQlpZiAoZmxvd0luZm8gPT0gRmxvd0luZm8uREVBRF9FTkQpIHsKKwkJCWlmIChwcmV2aW91c0NvbXBsYWludExldmVsIDwgQ09NUExBSU5FRF9VTlJFQUNIQUJMRSkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVucmVhY2hhYmxlQ29kZSh0aGlzKTsKIAkJCX0KLQkJCXJldHVybiByZXBvcnRlZDsgLy8ga2VlcCBnb2luZyBmb3IgZmFrZSByZWFjaGFibGUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgaW52b2NhdGlvbiBhcmd1bWVudHMsIGNvbnNpZGVyaW5nIHZhcmFyZ3MgbWV0aG9kcwotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQXJndW1lbnRzKE1ldGhvZEJpbmRpbmcgYmluZGluZywgRXhwcmVzc2lvbltdIGFyZ3VtZW50cywgQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQkKLQkJaWYgKGJpbmRpbmcuaXNWYXJhcmdzKCkpIHsKLQkJCS8vIDUgcG9zc2liaWxpdGllcyBleGlzdCBmb3IgYSBjYWxsIHRvIHRoZSB2YXJhcmcgbWV0aG9kIGZvbyhpbnQgaSwgaW50IC4uLiB2YWx1ZSkgOiAKLQkJCS8vICAgICAgZm9vKDEpLCBmb28oMSwgbnVsbCksIGZvbygxLCAyKSwgZm9vKDEsIDIsIDMsIDQpICYgZm9vKDEsIG5ldyBpbnRbXSB7MSwgMn0pCi0JCQlUeXBlQmluZGluZ1tdIHBhcmFtcyA9IGJpbmRpbmcucGFyYW1ldGVyczsKLQkJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7Ci0JCQlpbnQgdmFyQXJnSW5kZXggPSBwYXJhbUxlbmd0aCAtIDE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckFyZ0luZGV4OyBpKyspIHsKLQkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQlyZXR1cm4gQ09NUExBSU5FRF9VTlJFQUNIQUJMRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwcmV2aW91c0NvbXBsYWludExldmVsIDwgQ09NUExBSU5FRF9GQUtFX1JFQUNIQUJMRSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZha2VSZWFjaGFibGUodGhpcyk7CiAJCQl9CisJCQlyZXR1cm4gQ09NUExBSU5FRF9GQUtFX1JFQUNIQUJMRTsKKwkJfQorCX0KKwlyZXR1cm4gcHJldmlvdXNDb21wbGFpbnRMZXZlbDsKK30KIAotCQkJQXJyYXlCaW5kaW5nIHZhckFyZ3NUeXBlID0gKEFycmF5QmluZGluZykgcGFyYW1zW3ZhckFyZ0luZGV4XTsgLy8gcGFyYW1ldGVyVHlwZSBoYXMgdG8gYmUgYW4gYXJyYXkgdHlwZQotCQkJQXJyYXlCaW5kaW5nIGNvZGVHZW5WYXJBcmdzVHlwZSA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmcucGFyYW1ldGVyc1t2YXJBcmdJbmRleF0uZXJhc3VyZSgpOwotCQkJaW50IGVsZW1lbnRzVHlwZUlEID0gdmFyQXJnc1R5cGUuZWxlbWVudHNUeXBlKCkuaWQ7Ci0JCQlpbnQgYXJnTGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKKy8qKgorICogR2VuZXJhdGUgaW52b2NhdGlvbiBhcmd1bWVudHMsIGNvbnNpZGVyaW5nIHZhcmFyZ3MgbWV0aG9kcworICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUFyZ3VtZW50cyhNZXRob2RCaW5kaW5nIGJpbmRpbmcsIEV4cHJlc3Npb25bXSBhcmd1bWVudHMsIEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwlpZiAoYmluZGluZy5pc1ZhcmFyZ3MoKSkgeworCQkvLyA1IHBvc3NpYmlsaXRpZXMgZXhpc3QgZm9yIGEgY2FsbCB0byB0aGUgdmFyYXJnIG1ldGhvZCBmb28oaW50IGksIGludCAuLi4gdmFsdWUpIDoKKwkJLy8gICAgICBmb28oMSksIGZvbygxLCBudWxsKSwgZm9vKDEsIDIpLCBmb28oMSwgMiwgMywgNCkgJiBmb28oMSwgbmV3IGludFtdIHsxLCAyfSkKKwkJVHlwZUJpbmRpbmdbXSBwYXJhbXMgPSBiaW5kaW5nLnBhcmFtZXRlcnM7CisJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisJCWludCB2YXJBcmdJbmRleCA9IHBhcmFtTGVuZ3RoIC0gMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJBcmdJbmRleDsgaSsrKSB7CisJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCX0KKwkJQXJyYXlCaW5kaW5nIHZhckFyZ3NUeXBlID0gKEFycmF5QmluZGluZykgcGFyYW1zW3ZhckFyZ0luZGV4XTsgLy8gcGFyYW1ldGVyVHlwZSBoYXMgdG8gYmUgYW4gYXJyYXkgdHlwZQorCQlBcnJheUJpbmRpbmcgY29kZUdlblZhckFyZ3NUeXBlID0gKEFycmF5QmluZGluZykgYmluZGluZy5wYXJhbWV0ZXJzW3ZhckFyZ0luZGV4XS5lcmFzdXJlKCk7CisJCWludCBlbGVtZW50c1R5cGVJRCA9IHZhckFyZ3NUeXBlLmVsZW1lbnRzVHlwZSgpLmlkOworCQlpbnQgYXJnTGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKIAotCQkJaWYgKGFyZ0xlbmd0aCA+IHBhcmFtTGVuZ3RoKSB7CisJCWlmIChhcmdMZW5ndGggPiBwYXJhbUxlbmd0aCkgeworCQkJLy8gcmlnaHQgbnVtYmVyIGJ1dCBub3QgZGlyZWN0bHkgY29tcGF0aWJsZSBvciB0b28gbWFueSBhcmd1bWVudHMgLSB3cmFwIGV4dHJhIGludG8gYXJyYXkKKwkJCS8vIGNhbGxlZCB3aXRoIChhcmdMZW5ndGggLSBsYXN0SW5kZXgpIGVsZW1lbnRzIDogZm9vKDEsIDIpIG9yIGZvbygxLCAyLCAzLCA0KQorCQkJLy8gbmVlZCB0byBnZW4gZWxlbWVudHMgaW50byBhbiBhcnJheSwgdGhlbiBnZW4gZWFjaCByZW1haW5pbmcgZWxlbWVudCBpbnRvIGNyZWF0ZWQgYXJyYXkKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoYXJnTGVuZ3RoIC0gdmFyQXJnSW5kZXgpOworCQkJY29kZVN0cmVhbS5uZXdBcnJheShjb2RlR2VuVmFyQXJnc1R5cGUpOyAvLyBjcmVhdGUgYSBtb25vLWRpbWVuc2lvbmFsIGFycmF5CisJCQlmb3IgKGludCBpID0gdmFyQXJnSW5kZXg7IGkgPCBhcmdMZW5ndGg7IGkrKykgeworCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShpIC0gdmFyQXJnSW5kZXgpOworCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQljb2RlU3RyZWFtLmFycmF5QXRQdXQoZWxlbWVudHNUeXBlSUQsIGZhbHNlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmdMZW5ndGggPT0gcGFyYW1MZW5ndGgpIHsKKwkJCS8vIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMgLSBjb3VsZCBiZSBpbmV4YWN0IC0gcGFzcyBhcmd1bWVudCBhcyBpcworCQkJVHlwZUJpbmRpbmcgbGFzdFR5cGUgPSBhcmd1bWVudHNbdmFyQXJnSW5kZXhdLnJlc29sdmVkVHlwZTsKKwkJCWlmIChsYXN0VHlwZSA9PSBUeXBlQmluZGluZy5OVUxMCisJCQkJfHwgKHZhckFyZ3NUeXBlLmRpbWVuc2lvbnMoKSA9PSBsYXN0VHlwZS5kaW1lbnNpb25zKCkKKwkJCQkJJiYgbGFzdFR5cGUuaXNDb21wYXRpYmxlV2l0aCh2YXJBcmdzVHlwZSkpKSB7CisJCQkJLy8gZm9vKDEsIG5ldyBpbnRbXXsyLCAzfSkgb3IgZm9vKDEsIG51bGwpIC0tPiBsYXN0IGFyZyBpcyBwYXNzZWQgYXMtaXMKKwkJCQlhcmd1bWVudHNbdmFyQXJnSW5kZXhdLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfSBlbHNlIHsKIAkJCQkvLyByaWdodCBudW1iZXIgYnV0IG5vdCBkaXJlY3RseSBjb21wYXRpYmxlIG9yIHRvbyBtYW55IGFyZ3VtZW50cyAtIHdyYXAgZXh0cmEgaW50byBhcnJheQotCQkJCS8vIGNhbGxlZCB3aXRoIChhcmdMZW5ndGggLSBsYXN0SW5kZXgpIGVsZW1lbnRzIDogZm9vKDEsIDIpIG9yIGZvbygxLCAyLCAzLCA0KQogCQkJCS8vIG5lZWQgdG8gZ2VuIGVsZW1lbnRzIGludG8gYW4gYXJyYXksIHRoZW4gZ2VuIGVhY2ggcmVtYWluaW5nIGVsZW1lbnQgaW50byBjcmVhdGVkIGFycmF5Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShhcmdMZW5ndGggLSB2YXJBcmdJbmRleCk7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgxKTsKIAkJCQljb2RlU3RyZWFtLm5ld0FycmF5KGNvZGVHZW5WYXJBcmdzVHlwZSk7IC8vIGNyZWF0ZSBhIG1vbm8tZGltZW5zaW9uYWwgYXJyYXkKLQkJCQlmb3IgKGludCBpID0gdmFyQXJnSW5kZXg7IGkgPCBhcmdMZW5ndGg7IGkrKykgewotCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkgLSB2YXJBcmdJbmRleCk7Ci0JCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGVsZW1lbnRzVHlwZUlELCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhcmdMZW5ndGggPT0gcGFyYW1MZW5ndGgpIHsKLQkJCQkvLyByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzIC0gY291bGQgYmUgaW5leGFjdCAtIHBhc3MgYXJndW1lbnQgYXMgaXMKLQkJCQlUeXBlQmluZGluZyBsYXN0VHlwZSA9IGFyZ3VtZW50c1t2YXJBcmdJbmRleF0ucmVzb2x2ZWRUeXBlOwotCQkJCWlmIChsYXN0VHlwZSA9PSBUeXBlQmluZGluZy5OVUxMCi0JCQkJCXx8ICh2YXJBcmdzVHlwZS5kaW1lbnNpb25zKCkgPT0gbGFzdFR5cGUuZGltZW5zaW9ucygpCi0JCQkJCQkmJiBsYXN0VHlwZS5pc0NvbXBhdGlibGVXaXRoKHZhckFyZ3NUeXBlKSkpIHsKLQkJCQkJLy8gZm9vKDEsIG5ldyBpbnRbXXsyLCAzfSkgb3IgZm9vKDEsIG51bGwpIC0tPiBsYXN0IGFyZyBpcyBwYXNzZWQgYXMtaXMKLQkJCQkJYXJndW1lbnRzW3ZhckFyZ0luZGV4XS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByaWdodCBudW1iZXIgYnV0IG5vdCBkaXJlY3RseSBjb21wYXRpYmxlIG9yIHRvbyBtYW55IGFyZ3VtZW50cyAtIHdyYXAgZXh0cmEgaW50byBhcnJheQotCQkJCQkvLyBuZWVkIHRvIGdlbiBlbGVtZW50cyBpbnRvIGFuIGFycmF5LCB0aGVuIGdlbiBlYWNoIHJlbWFpbmluZyBlbGVtZW50IGludG8gY3JlYXRlZCBhcnJheQotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKDEpOwotCQkJCQljb2RlU3RyZWFtLm5ld0FycmF5KGNvZGVHZW5WYXJBcmdzVHlwZSk7IC8vIGNyZWF0ZSBhIG1vbm8tZGltZW5zaW9uYWwgYXJyYXkKLQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKLQkJCQkJYXJndW1lbnRzW3ZhckFyZ0luZGV4XS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGVsZW1lbnRzVHlwZUlELCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gbm90IGVub3VnaCBhcmd1bWVudHMgLSBwYXNzIGV4dHJhIGVtcHR5IGFycmF5Ci0JCQkJLy8gc2NlbmFyaW86IGZvbygxKSAtLT4gZm9vKDEsIG5ldyBpbnRbMF0pCi0JCQkJLy8gZ2VuZXJhdGUgY29kZSBmb3IgYW4gZW1wdHkgYXJyYXkgb2YgcGFyYW1ldGVyVHlwZQorCQkJCWNvZGVTdHJlYW0uZHVwKCk7CiAJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKLQkJCQljb2RlU3RyZWFtLm5ld0FycmF5KGNvZGVHZW5WYXJBcmdzVHlwZSk7IC8vIGNyZWF0ZSBhIG1vbm8tZGltZW5zaW9uYWwgYXJyYXkKKwkJCQlhcmd1bWVudHNbdmFyQXJnSW5kZXhdLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCWNvZGVTdHJlYW0uYXJyYXlBdFB1dChlbGVtZW50c1R5cGVJRCwgZmFsc2UpOwogCQkJfQotCQl9IGVsc2UgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7IC8vIHN0YW5kYXJkIGdlbmVyYXRpb24gZm9yIG1ldGhvZCBhcmd1bWVudHMKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCi0JCQkJYXJndW1lbnRzW2ldLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQl9IGVsc2UgeyAvLyBub3QgZW5vdWdoIGFyZ3VtZW50cyAtIHBhc3MgZXh0cmEgZW1wdHkgYXJyYXkKKwkJCS8vIHNjZW5hcmlvOiBmb28oMSkgLS0+IGZvbygxLCBuZXcgaW50WzBdKQorCQkJLy8gZ2VuZXJhdGUgY29kZSBmb3IgYW4gZW1wdHkgYXJyYXkgb2YgcGFyYW1ldGVyVHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKKwkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY29kZUdlblZhckFyZ3NUeXBlKTsgLy8gY3JlYXRlIGEgbW9uby1kaW1lbnNpb25hbCBhcnJheQogCQl9CisJfSBlbHNlIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgeyAvLyBzdGFuZGFyZCBnZW5lcmF0aW9uIGZvciBtZXRob2QgYXJndW1lbnRzCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCisJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJfQorfQogCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pOwotCQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlCbG9jaygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpIHsKLQkJLy90aGUgdXNlIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhdm9pZCBpbiBtb3N0IGNhc2VzCi0JCS8vYW5kIGlzIGhlcmUgbW9zdGx5IGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2UuLi4uLgotCQkvL3doaWxlIHRoZSBwYXJzZXIgaXMgcmVzcG9uc2FibGUgZm9yIGNyZWF0aW5nCi0JCS8vd2VsbGVkIGZvcm1lZCBleHByZXNzaW9uIHN0YXRlbWVudCwgd2hpY2ggcmVzdWx0cwotCQkvL2luIHRoZSBmYWN0IHRoYXQgamF2YS1ub24tc2VtYW50aWMtZXhwcmVzc2lvbi11c2VkLWFzLXN0YXRlbWVudAotCQkvL3Nob3VsZCBub3QgYmUgcGFyc2FibGUuLi50aHVzIG5vdCBiZWluZyBidWlsdC4KLQkJLy9JdCBzb3VuZHMgbGlrZSB0aGUgamF2YSBncmFtbWFyIGFzIGhlbHAgdGhlIGNvbXBpbGVyIGpvYiBpbiByZW1vdmluZwotCQkvLy1ieSBjb25zdHJ1Y3Rpb24tIHNvbWUgc3RhdGVtZW50IHRoYXQgd291bGQgaGF2ZSBubyBlZmZlY3QuLi4uCi0JCS8vKGZvciBleGFtcGxlIGFsbCBleHByZXNzaW9uIHRoYXQgbWF5IGRvIHNpZGUtZWZmZWN0cyBhcmUgdmFsaWQgc3RhdGVtZW50Ci0JCS8vIC10aGlzIGlzIGFuIGFwcHJvbWF0aXZlIGlkZWEuLi4uLi0pCitwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSk7CiAKK3Byb3RlY3RlZCBib29sZWFuIGlzQm94aW5nQ29tcGF0aWJsZShUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTY29wZSBzY29wZSkgeworCWlmIChzY29wZS5pc0JveGluZ0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlLCB0YXJnZXRUeXBlKSkKIAkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCQlyZXR1cm4gcHJpbnRTdGF0ZW1lbnQoaW5kZW50LCBvdXRwdXQpOwotCX0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpOwogCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGNhc2UgY29uc3RhbnQgYXNzb2NpYXRlZCB0byB0aGlzIHN0YXRlbWVudCAoTm90QUNvbnN0YW50IGlmIG5vbmUpCi0JICovCi0JcHVibGljIENvbnN0YW50IHJlc29sdmVDYXNlKEJsb2NrU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIHRlc3RUeXBlLCBTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7Ci0JCS8vIHN0YXRlbWVudCB3aXRoaW4gYSBzd2l0Y2ggdGhhdCBhcmUgbm90IGNhc2UgYXJlIHRyZWF0ZWQgYXMgbm9ybWFsIHN0YXRlbWVudC4uLi4gCisJcmV0dXJuIGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSAgLy8gbmFycm93aW5nIHRoZW4gYm94aW5nID8KKwkJJiYgIXRhcmdldFR5cGUuaXNCYXNlVHlwZSgpCisJCSYmICF0YXJnZXRUeXBlLmlzVHlwZVZhcmlhYmxlKCkKKwkJJiYgc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgLy8gYXV0b2JveGluZworCQkmJiBleHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoZXhwcmVzc2lvblR5cGUsIHNjb3BlLmVudmlyb25tZW50KCkuY29tcHV0ZUJveGluZ1R5cGUodGFyZ2V0VHlwZSkpOworfQogCi0JCXJlc29sdmUoc2NvcGUpOwotCQlyZXR1cm4gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCX0KK3B1YmxpYyBib29sZWFuIGlzRW1wdHlCbG9jaygpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CiAKK3B1YmxpYyBib29sZWFuIGlzVmFsaWRKYXZhU3RhdGVtZW50KCkgeworCS8vdGhlIHVzZSBvZiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYXZvaWQgaW4gbW9zdCBjYXNlcworCS8vYW5kIGlzIGhlcmUgbW9zdGx5IGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2UuLi4uLgorCS8vd2hpbGUgdGhlIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcKKwkvL3dlbGxlZCBmb3JtZWQgZXhwcmVzc2lvbiBzdGF0ZW1lbnQsIHdoaWNoIHJlc3VsdHMKKwkvL2luIHRoZSBmYWN0IHRoYXQgamF2YS1ub24tc2VtYW50aWMtZXhwcmVzc2lvbi11c2VkLWFzLXN0YXRlbWVudAorCS8vc2hvdWxkIG5vdCBiZSBwYXJzZWQuLi50aHVzIG5vdCBiZWluZyBidWlsdC4KKwkvL0l0IHNvdW5kcyBsaWtlIHRoZSBqYXZhIGdyYW1tYXIgYXMgaGVscCB0aGUgY29tcGlsZXIgam9iIGluIHJlbW92aW5nCisJLy8tYnkgY29uc3RydWN0aW9uLSBzb21lIHN0YXRlbWVudCB0aGF0IHdvdWxkIGhhdmUgbm8gZWZmZWN0Li4uLgorCS8vKGZvciBleGFtcGxlIGFsbCBleHByZXNzaW9uIHRoYXQgbWF5IGRvIHNpZGUtZWZmZWN0cyBhcmUgdmFsaWQgc3RhdGVtZW50CisJLy8gLXRoaXMgaXMgYW4gYXBwcm94aW1hdGl2ZSBpZGVhLi4uLi4tKQorCisJcmV0dXJuIHRydWU7Cit9CisKK3B1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCXJldHVybiBwcmludFN0YXRlbWVudChpbmRlbnQsIG91dHB1dCk7Cit9CisKK3B1YmxpYyBhYnN0cmFjdCBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCk7CisKK3B1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSk7CisKKy8qKgorICogUmV0dXJucyBjYXNlIGNvbnN0YW50IGFzc29jaWF0ZWQgdG8gdGhpcyBzdGF0ZW1lbnQgKE5vdEFDb25zdGFudCBpZiBub25lKQorICovCitwdWJsaWMgQ29uc3RhbnQgcmVzb2x2ZUNhc2UoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdGVzdFR5cGUsIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKKwkvLyBzdGF0ZW1lbnQgd2l0aGluIGEgc3dpdGNoIHRoYXQgYXJlIG5vdCBjYXNlIGFyZSB0cmVhdGVkIGFzIG5vcm1hbCBzdGF0ZW1lbnQuLi4uCisJcmVzb2x2ZShzY29wZSk7CisJcmV0dXJuIENvbnN0YW50Lk5vdEFDb25zdGFudDsKK30KKy8qKiAKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkludm9jYXRpb25TaXRlI2V4cGVjdGVkVHlwZX0KKyAqIHN1aXRhYmxlIGF0IHRoaXMgbGV2ZWwuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNleHBlY3RlZFR5cGUoKQorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKCkgeworCXJldHVybiBudWxsOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdHJpbmdMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YQppbmRleCBhMjQ2YWU0Li4yMTFjZjE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAKIAkJdGhpcyhzdGFydCxlbmQpOwogCQl0aGlzLnNvdXJjZSA9IHRva2VuOwotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyIC0gMTsgLy8gbGluZSBudW1iZXIgaXMgMSBiYXNlZCAKKwkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlciAtIDE7IC8vIGxpbmUgbnVtYmVyIGlzIDEgYmFzZWQKIAl9CiAKIAlwdWJsaWMgU3RyaW5nTGl0ZXJhbChpbnQgcywgaW50IGUpIHsKQEAgLTM0LDggKzM0LDggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7Ci0JCi0JCWNvbnN0YW50ID0gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKFN0cmluZy52YWx1ZU9mKHNvdXJjZSkpOworCisJCXRoaXMuY29uc3RhbnQgPSBTdHJpbmdDb25zdGFudC5mcm9tVmFsdWUoU3RyaW5nLnZhbHVlT2YodGhpcy5zb3VyY2UpKTsKIAl9CiAKIAlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZFdpdGgoQ2hhckxpdGVyYWwgbGl0KXsKQEAgLTU4LDEyICs1OCwxMiBAQAogCX0KIAkvKioKIAkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHN0cmluZyBsaXRlcmFsCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCWNvZGVTdHJlYW0ubGRjKGNvbnN0YW50LnN0cmluZ1ZhbHVlKCkpOworCQkJY29kZVN0cmVhbS5sZGModGhpcy5jb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9CiAKQEAgLTczLDExICs3MywxMSBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkKKwogCQkvLyBoYW5kbGUgc29tZSBzcGVjaWFsIGNoYXIuLi4uLgogCQlvdXRwdXQuYXBwZW5kKCdcIicpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewotCQkJc3dpdGNoIChzb3VyY2VbaV0pIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZS5sZW5ndGg7IGkrKykgeworCQkJc3dpdGNoICh0aGlzLnNvdXJjZVtpXSkgewogCQkJCWNhc2UgJ1xiJyA6CiAJCQkJCW91dHB1dC5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJyZWFrOwpAQCAtMTAzLDE2ICsxMDMsMTYgQEAKIAkJCQkJb3V0cHV0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQgOgotCQkJCQlvdXRwdXQuYXBwZW5kKHNvdXJjZVtpXSk7CisJCQkJCW91dHB1dC5hcHBlbmQodGhpcy5zb3VyY2VbaV0pOwogCQkJfQogCQl9Ci0JCW91dHB1dC5hcHBlbmQoJ1wiJyk7IAorCQlvdXRwdXQuYXBwZW5kKCdcIicpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KIAogCXB1YmxpYyBjaGFyW10gc291cmNlKCkgewogCi0JCXJldHVybiBzb3VyY2U7CisJCXJldHVybiB0aGlzLnNvdXJjZTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbENvbmNhdGVuYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbENvbmNhdGVuYXRpb24uamF2YQppbmRleCA4Yjc3OTdjLi40ZjM5M2YwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWxDb25jYXRlbmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdHJpbmdMaXRlcmFsQ29uY2F0ZW5hdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDcgKzIwLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9TSVpFID0gNTsKIAlwdWJsaWMgRXhwcmVzc2lvbltdIGxpdGVyYWxzOwogCXB1YmxpYyBpbnQgY291bnRlcjsKLQkvKioJCisJLyoqCiAJICogQnVpbGQgYSB0d28tc3RyaW5ncyBsaXRlcmFsCiAJICogKi8KIAlwdWJsaWMgU3RyaW5nTGl0ZXJhbENvbmNhdGVuYXRpb24oU3RyaW5nTGl0ZXJhbCBzdHIxLCBTdHJpbmdMaXRlcmFsIHN0cjIpIHsKQEAgLTQzLDE4ICs0MywxOCBAQAogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmxpdGVyYWxzLCAwLCB0aGlzLmxpdGVyYWxzID0gbmV3IFN0cmluZ0xpdGVyYWxbbGl0ZXJhbHNMZW5ndGggKyBJTklUSUFMX1NJWkVdLCAwLCBsaXRlcmFsc0xlbmd0aCk7CiAJCX0KIAkJLy91ZGRhdGUgdGhlIHNvdXJjZQotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMuc291cmNlLmxlbmd0aDsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXNvdXJjZSwKKwkJCXRoaXMuc291cmNlLAogCQkJMCwKLQkJCXNvdXJjZSA9IG5ldyBjaGFyW2xlbmd0aCArIGxpdC5zb3VyY2UubGVuZ3RoXSwKKwkJCXRoaXMuc291cmNlID0gbmV3IGNoYXJbbGVuZ3RoICsgbGl0LnNvdXJjZS5sZW5ndGhdLAogCQkJMCwKIAkJCWxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkobGl0LnNvdXJjZSwgMCwgc291cmNlLCBsZW5ndGgsIGxpdC5zb3VyY2UubGVuZ3RoKTsKLQkJdGhpcy5saXRlcmFsc1t0aGlzLmNvdW50ZXIrK10gPSBsaXQ7CQkKKwkJU3lzdGVtLmFycmF5Y29weShsaXQuc291cmNlLCAwLCB0aGlzLnNvdXJjZSwgbGVuZ3RoLCBsaXQuc291cmNlLmxlbmd0aCk7CisJCXRoaXMubGl0ZXJhbHNbdGhpcy5jb3VudGVyKytdID0gbGl0OwogCQlyZXR1cm4gdGhpczsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJCW91dHB1dC5hcHBlbmQoIlN0cmluZ0xpdGVyYWxDb25jYXRlbmF0aW9ueyIpOyAvLyROT04tTkxTLTEkCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmNvdW50ZXI7IGkgPCBtYXg7IGkrKykgewpAQCAtNjMsMTYgKzYzLDE2IEBACiAJCX0KIAkJcmV0dXJuIG91dHB1dC5hcHBlbmQoJ30nKTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKKwkJcmV0dXJuIHRoaXMuc291cmNlOwogCX0KIAogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmNvdW50ZXI7IGkgPCBtYXg7IGkrKykgewogCQkJCXRoaXMubGl0ZXJhbHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwotCQkJfQkJCQorCQkJfQogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3ViUm91dGluZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdWJSb3V0aW5lU3RhdGVtZW50LmphdmEKaW5kZXggMjRkYWY0My4uMWQ5ODI5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdWJSb3V0aW5lU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdWJSb3V0aW5lU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNyArMTksNyBAQAogICogRXh0cmEgYmVoYXZpb3IgZm9yIHN0YXRlbWVudHMgd2hpY2ggYXJlIGdlbmVyYXRpbmcgc3Vicm91dGluZXMKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YlJvdXRpbmVTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIHN0YXRpYyB2b2lkIHJlZW50ZXJBbGxFeGNlcHRpb25IYW5kbGVycyhTdWJSb3V0aW5lU3RhdGVtZW50W10gc3Vicm91dGluZXMsIGludCBtYXgsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCQlpZiAoc3Vicm91dGluZXMgPT0gbnVsbCkgcmV0dXJuOwogCQlpZiAobWF4IDwgMCkgbWF4ID0gc3Vicm91dGluZXMubGVuZ3RoOwpAQCAtMjksMzcgKzI5LDQ2IEBACiAJCQlzdWIuZW50ZXJEZWNsYXJlZEV4Y2VwdGlvbkhhbmRsZXJzKGNvZGVTdHJlYW0pOwogCQl9CiAJfQotCQorCiAJRXhjZXB0aW9uTGFiZWwgYW55RXhjZXB0aW9uTGFiZWw7CiAKIAlwdWJsaWMgRXhjZXB0aW9uTGFiZWwgZW50ZXJBbnlFeGNlcHRpb25IYW5kbGVyKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQkKKwogCQlpZiAodGhpcy5hbnlFeGNlcHRpb25MYWJlbCA9PSBudWxsKSB7CiAJCQl0aGlzLmFueUV4Y2VwdGlvbkxhYmVsID0gbmV3IEV4Y2VwdGlvbkxhYmVsKGNvZGVTdHJlYW0sIG51bGwgLyphbnkgZXhjZXB0aW9uKi8pOwogCQl9CiAJCXRoaXMuYW55RXhjZXB0aW9uTGFiZWwucGxhY2VTdGFydCgpOwogCQlyZXR1cm4gdGhpcy5hbnlFeGNlcHRpb25MYWJlbDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBlbnRlckRlY2xhcmVkRXhjZXB0aW9uSGFuZGxlcnMoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAkJCisJCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAogCX0KIAogCXB1YmxpYyB2b2lkIGV4aXRBbnlFeGNlcHRpb25IYW5kbGVyKCkgewogCQlpZiAodGhpcy5hbnlFeGNlcHRpb25MYWJlbCAhPSBudWxsKSB7CiAJCQl0aGlzLmFueUV4Y2VwdGlvbkxhYmVsLnBsYWNlRW5kKCk7CiAJCX0KLQl9CQorCX0KIAogCXB1YmxpYyB2b2lkIGV4aXREZWNsYXJlZEV4Y2VwdGlvbkhhbmRsZXJzKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQJCQorCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKIAl9Ci0JCiAKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZW5lcmF0ZVN1YlJvdXRpbmVJbnZvY2F0aW9uKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIE9iamVjdCB0YXJnZXRMb2NhdGlvbiwgaW50IHN0YXRlSW5kZXgsIExvY2FsVmFyaWFibGVCaW5kaW5nIHNlY3JldExvY2FsKTsJCi0JCisKKwkvKioKKwkgKiBHZW5lcmF0ZSBhbiBpbnZvY2F0aW9uIG9mIGEgc3Vicm91dGluZSAoZS5nLiBqc3IgZmluYWxseSkgaW4gY3VycmVudCBjb250ZXh0LgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbQorCSAqIEBwYXJhbSB0YXJnZXRMb2NhdGlvbgorCSAqIEBwYXJhbSBzdGF0ZUluZGV4CisJICogQHBhcmFtIHNlY3JldExvY2FsCisJICogQHJldHVybiBib29sZWFuLCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBhYnJ1cHQgY29tcGxldGlvbgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdlbmVyYXRlU3ViUm91dGluZUludm9jYXRpb24oQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgT2JqZWN0IHRhcmdldExvY2F0aW9uLCBpbnQgc3RhdGVJbmRleCwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgc2VjcmV0TG9jYWwpOworCiAJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTdWJSb3V0aW5lRXNjYXBpbmcoKTsKLQkKKwogCXB1YmxpYyB2b2lkIHBsYWNlQWxsQW55RXhjZXB0aW9uSGFuZGxlcigpIHsKIAkJdGhpcy5hbnlFeGNlcHRpb25MYWJlbC5wbGFjZSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3VwZXJSZWZlcmVuY2UuamF2YQppbmRleCAwMjc4OWVmLi41NDQ0ZDJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEzICsxMSwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgU3VwZXJSZWZlcmVuY2UgZXh0ZW5kcyBUaGlzUmVmZXJlbmNlIHsKLQkKKwogCXB1YmxpYyBTdXBlclJlZmVyZW5jZShpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIAogCQlzdXBlcihzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKQEAgLTI5LDI5ICszMSwyOSBAQAogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUaGlzKCkgewotCQkKKwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKLQkJCisKIAkJcmV0dXJuIHRydWU7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNUaGlzKCkgewotCQkKKwogCQlyZXR1cm4gZmFsc2UgOwogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRFeHByZXNzaW9uKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpewotCQorCiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCJzdXBlciIpOyAvLyROT04tTkxTLTEkCi0JCQorCiAJfQogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJaWYgKCFjaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKSkKIAkJCXJldHVybiBudWxsOwogCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1JlY2VpdmVyVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpOwpAQCAtNjYsNCArNjgsOSBAQAogCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KKwkKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCWN1cnJlbnRTY29wZS5yZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKTsKKwkJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N3aXRjaFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Td2l0Y2hTdGF0ZW1lbnQuamF2YQppbmRleCA1NzJlY2JlLi5mZTMxNmZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N3aXRjaFN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3dpdGNoU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw5ICs3LDEyIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAzMTkyMDEgLSBbbnVsbF0gbm8gd2FybmluZyB3aGVuIHVuYm94aW5nIFNpbmdsZU5hbWVSZWZlcmVuY2UgY2F1c2VzIE5QRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwpAQCAtMzEsMTQ5ICszNCwzMjIgQEAKIAlwdWJsaWMgaW50IGJsb2NrU3RhcnQ7CiAJcHVibGljIGludCBjYXNlQ291bnQ7CiAJaW50W10gY29uc3RhbnRzOwotCQorCVN0cmluZ1tdIHN0cmluZ0NvbnN0YW50czsKKwogCS8vIGZhbGx0aHJvdWdoCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0FTRSA9IDA7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRkFMTFRIUk9VR0ggPSAxOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVTQ0FQSU5HID0gMjsKIAkKLQkKKwkvLyBmb3Igc3dpdGNoIG9uIHN0cmluZ3MKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU2VjcmV0U3RyaW5nVmFyaWFibGVOYW1lID0gIiBzd2l0Y2hEaXNwYXRjaFN0cmluZyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisKIAlwdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZyBzeW50aGV0aWM7IC8vIHVzZSBmb3Igc3dpdGNoIG9uIGVudW1zIHR5cGVzCi0JCisKIAkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMKIAlpbnQgcHJlU3dpdGNoSW5pdFN0YXRlSW5kZXggPSAtMTsKIAlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKLQotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCQlGbG93SW5mbyBmbG93SW5mbykgewotCi0JICAgIHRyeSB7Ci0JCQlmbG93SW5mbyA9IGV4cHJlc3Npb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOwotCQkJU3dpdGNoRmxvd0NvbnRleHQgc3dpdGNoQ29udGV4dCA9Ci0JCQkJbmV3IFN3aXRjaEZsb3dDb250ZXh0KGZsb3dDb250ZXh0LCB0aGlzLCAoYnJlYWtMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpKSk7CiAJCi0JCQkvLyBhbmFseXNlIHRoZSBibG9jayBieSBjb25zaWRlcmluZyBzcGVjaWFsbHkgdGhlIGNhc2UvZGVmYXVsdCBzdGF0ZW1lbnRzIChuZWVkIHRvIGJpbmQgdGhlbSAKKwlDYXNlU3RhdGVtZW50W10gZHVwbGljYXRlQ2FzZVN0YXRlbWVudHMgPSBudWxsOworCWludCBkdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIgPSAwOworCXByaXZhdGUgTG9jYWxWYXJpYWJsZUJpbmRpbmcgZGlzcGF0Y2hTdHJpbmdDb3B5ID0gbnVsbDsKKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCXRyeSB7CisJCQlmbG93SW5mbyA9IHRoaXMuZXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQlpZiAoKHRoaXMuZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwCisJCQkJCXx8ICh0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgdGhpcy5leHByZXNzaW9uLnJlc29sdmVkVHlwZS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSkgeworCQkJCXRoaXMuZXhwcmVzc2lvbi5jaGVja05QRShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQl9CisJCQlTd2l0Y2hGbG93Q29udGV4dCBzd2l0Y2hDb250ZXh0ID0KKwkJCQluZXcgU3dpdGNoRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIHRoaXMsICh0aGlzLmJyZWFrTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKSkpOworCisJCQkvLyBhbmFseXNlIHRoZSBibG9jayBieSBjb25zaWRlcmluZyBzcGVjaWFsbHkgdGhlIGNhc2UvZGVmYXVsdCBzdGF0ZW1lbnRzIChuZWVkIHRvIGJpbmQgdGhlbQogCQkJLy8gdG8gdGhlIGVudHJ5IHBvaW50KQogCQkJRmxvd0luZm8gY2FzZUluaXRzID0gRmxvd0luZm8uREVBRF9FTkQ7CiAJCQkvLyBpbiBjYXNlIG9mIHN0YXRlbWVudHMgYmVmb3JlIHRoZSBmaXJzdCBjYXNlCi0JCQlwcmVTd2l0Y2hJbml0U3RhdGVJbmRleCA9Ci0JCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOworCQkJdGhpcy5wcmVTd2l0Y2hJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKIAkJCWludCBjYXNlSW5kZXggPSAwOwotCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZGlkQWxyZWFkeUNvbXBsYWluID0gZmFsc2U7CisJCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCQlpbnQgaW5pdGlhbENvbXBsYWludExldmVsID0gKGZsb3dJbmZvLnJlYWNoTW9kZSgpICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDAgPyBTdGF0ZW1lbnQuQ09NUExBSU5FRF9GQUtFX1JFQUNIQUJMRSA6IFN0YXRlbWVudC5OT1RfQ09NUExBSU5FRDsKKwkJCQlpbnQgY29tcGxhaW50TGV2ZWwgPSBpbml0aWFsQ29tcGxhaW50TGV2ZWw7CiAJCQkJaW50IGZhbGxUaHJvdWdoU3RhdGUgPSBDQVNFOwotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzW2ldOwotCQkJCQlpZiAoKGNhc2VJbmRleCA8IGNhc2VDb3VudCkgJiYgKHN0YXRlbWVudCA9PSBjYXNlc1tjYXNlSW5kZXhdKSkgeyAvLyBzdGF0ZW1lbnQgaXMgYSBjYXNlCi0JCQkJCQl0aGlzLnNjb3BlLmVuY2xvc2luZ0Nhc2UgPSBjYXNlc1tjYXNlSW5kZXhdOyAvLyByZWNvcmQgZW50ZXJpbmcgaW4gYSBzd2l0Y2ggY2FzZSBibG9jaworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50c1tpXTsKKwkJCQkJaWYgKChjYXNlSW5kZXggPCB0aGlzLmNhc2VDb3VudCkgJiYgKHN0YXRlbWVudCA9PSB0aGlzLmNhc2VzW2Nhc2VJbmRleF0pKSB7IC8vIHN0YXRlbWVudCBpcyBhIGNhc2UKKwkJCQkJCXRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IHRoaXMuY2FzZXNbY2FzZUluZGV4XTsgLy8gcmVjb3JkIGVudGVyaW5nIGluIGEgc3dpdGNoIGNhc2UgYmxvY2sKIAkJCQkJCWNhc2VJbmRleCsrOwogCQkJCQkJaWYgKGZhbGxUaHJvdWdoU3RhdGUgPT0gRkFMTFRIUk9VR0gKIAkJCQkJCQkJJiYgKHN0YXRlbWVudC5iaXRzICYgQVNUTm9kZS5Eb2N1bWVudGVkRmFsbHRocm91Z2gpID09IDApIHsgLy8gdGhlIGNhc2UgaXMgbm90IGZhbGwtdGhyb3VnaCBwcm90ZWN0ZWQgYnkgYSBsaW5lIGNvbW1lbnQKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5wb3NzaWJsZUZhbGxUaHJvdWdoQ2FzZSh0aGlzLnNjb3BlLmVuY2xvc2luZ0Nhc2UpOworCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucG9zc2libGVGYWxsVGhyb3VnaENhc2UodGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlKTsKIAkJCQkJCX0KIAkJCQkJCWNhc2VJbml0cyA9IGNhc2VJbml0cy5tZXJnZWRXaXRoKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKLQkJCQkJCWRpZEFscmVhZHlDb21wbGFpbiA9IGZhbHNlOyAvLyByZXNldCBjb21wbGFpbnQKKwkJCQkJCWNvbXBsYWludExldmVsID0gaW5pdGlhbENvbXBsYWludExldmVsOyAvLyByZXNldCBjb21wbGFpbnQKIAkJCQkJCWZhbGxUaHJvdWdoU3RhdGUgPSBDQVNFOwotCQkJCQl9IGVsc2UgaWYgKHN0YXRlbWVudCA9PSBkZWZhdWx0Q2FzZSkgeyAvLyBzdGF0ZW1lbnQgaXMgdGhlIGRlZmF1bHQgY2FzZQotCQkJCQkJdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gZGVmYXVsdENhc2U7IC8vIHJlY29yZCBlbnRlcmluZyBpbiBhIHN3aXRjaCBjYXNlIGJsb2NrCi0JCQkJCQlpZiAoZmFsbFRocm91Z2hTdGF0ZSA9PSBGQUxMVEhST1VHSCAKKwkJCQkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgPT0gdGhpcy5kZWZhdWx0Q2FzZSkgeyAvLyBzdGF0ZW1lbnQgaXMgdGhlIGRlZmF1bHQgY2FzZQorCQkJCQkJdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gdGhpcy5kZWZhdWx0Q2FzZTsgLy8gcmVjb3JkIGVudGVyaW5nIGluIGEgc3dpdGNoIGNhc2UgYmxvY2sKKwkJCQkJCWlmIChmYWxsVGhyb3VnaFN0YXRlID09IEZBTExUSFJPVUdICiAJCQkJCQkJCSYmIChzdGF0ZW1lbnQuYml0cyAmIEFTVE5vZGUuRG9jdW1lbnRlZEZhbGx0aHJvdWdoKSA9PSAwKSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucG9zc2libGVGYWxsVGhyb3VnaENhc2UodGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlKTsKKwkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnBvc3NpYmxlRmFsbFRocm91Z2hDYXNlKHRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSk7CiAJCQkJCQl9CiAJCQkJCQljYXNlSW5pdHMgPSBjYXNlSW5pdHMubWVyZ2VkV2l0aChmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JCQkJCQlkaWRBbHJlYWR5Q29tcGxhaW4gPSBmYWxzZTsgLy8gcmVzZXQgY29tcGxhaW50CisJCQkJCQljb21wbGFpbnRMZXZlbCA9IGluaXRpYWxDb21wbGFpbnRMZXZlbDsgLy8gcmVzZXQgY29tcGxhaW50CiAJCQkJCQlmYWxsVGhyb3VnaFN0YXRlID0gQ0FTRTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWZhbGxUaHJvdWdoU3RhdGUgPSBGQUxMVEhST1VHSDsgLy8gcmVzZXQgYmVsb3cgaWYgbmVlZGVkCiAJCQkJCX0KLQkJCQkJaWYgKCFzdGF0ZW1lbnQuY29tcGxhaW5JZlVucmVhY2hhYmxlKGNhc2VJbml0cywgc2NvcGUsIGRpZEFscmVhZHlDb21wbGFpbikpIHsKLQkJCQkJCWNhc2VJbml0cyA9IHN0YXRlbWVudC5hbmFseXNlQ29kZShzY29wZSwgc3dpdGNoQ29udGV4dCwgY2FzZUluaXRzKTsKKwkJCQkJaWYgKChjb21wbGFpbnRMZXZlbCA9IHN0YXRlbWVudC5jb21wbGFpbklmVW5yZWFjaGFibGUoY2FzZUluaXRzLCB0aGlzLnNjb3BlLCBjb21wbGFpbnRMZXZlbCkpIDwgU3RhdGVtZW50LkNPTVBMQUlORURfVU5SRUFDSEFCTEUpIHsKKwkJCQkJCWNhc2VJbml0cyA9IHN0YXRlbWVudC5hbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBzd2l0Y2hDb250ZXh0LCBjYXNlSW5pdHMpOwogCQkJCQkJaWYgKGNhc2VJbml0cyA9PSBGbG93SW5mby5ERUFEX0VORCkgewogCQkJCQkJCWZhbGxUaHJvdWdoU3RhdGUgPSBFU0NBUElORzsKIAkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRpZEFscmVhZHlDb21wbGFpbiA9IHRydWU7CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCisKIAkJCWZpbmFsIFR5cGVCaW5kaW5nIHJlc29sdmVkVHlwZUJpbmRpbmcgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwotCQkJaWYgKGNhc2VDb3VudCA+IDAgJiYgcmVzb2x2ZWRUeXBlQmluZGluZy5pc0VudW0oKSkgewotCQkJCWZpbmFsIFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGVCaW5kaW5nID0gdGhpcy5zY29wZS5jbGFzc1Njb3BlKCkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJaWYgKHJlc29sdmVkVHlwZUJpbmRpbmcuaXNFbnVtKCkpIHsKKwkJCQlmaW5hbCBTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlQmluZGluZyA9IGN1cnJlbnRTY29wZS5jbGFzc1Njb3BlKCkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwogCQkJCXRoaXMuc3ludGhldGljID0gc291cmNlVHlwZUJpbmRpbmcuYWRkU3ludGhldGljTWV0aG9kRm9yU3dpdGNoRW51bShyZXNvbHZlZFR5cGVCaW5kaW5nKTsKIAkJCX0KIAkJCS8vIGlmIG5vIGRlZmF1bHQgY2FzZSwgdGhlbiByZWNvcmQgaXQgbWF5IGp1bXAgb3ZlciB0aGUgYmxvY2sgZGlyZWN0bHkgdG8gdGhlIGVuZAotCQkJaWYgKGRlZmF1bHRDYXNlID09IG51bGwpIHsKKwkJCWlmICh0aGlzLmRlZmF1bHRDYXNlID09IG51bGwpIHsKIAkJCQkvLyBvbmx5IHJldGFpbiB0aGUgcG90ZW50aWFsIGluaXRpYWxpemF0aW9ucwotCQkJCWZsb3dJbmZvLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oCi0JCQkJCWNhc2VJbml0cy5tZXJnZWRXaXRoKHN3aXRjaENvbnRleHQuaW5pdHNPbkJyZWFrKSk7Ci0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisJCQkJZmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShjYXNlSW5pdHMubWVyZ2VkV2l0aChzd2l0Y2hDb250ZXh0LmluaXRzT25CcmVhaykpOworCQkJCXRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CiAJCQkJcmV0dXJuIGZsb3dJbmZvOwogCQkJfQotCQorCiAJCQkvLyBtZXJnZSBhbGwgYnJhbmNoZXMgaW5pdHMKIAkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBjYXNlSW5pdHMubWVyZ2VkV2l0aChzd2l0Y2hDb250ZXh0LmluaXRzT25CcmVhayk7Ci0JCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0KIAkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKIAkJCXJldHVybiBtZXJnZWRJbmZvOwotCSAgICB9IGZpbmFsbHkgewotCSAgICAgICAgaWYgKHRoaXMuc2NvcGUgIT0gbnVsbCkgdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gbnVsbDsgLy8gbm8gbG9uZ2VyIGluc2lkZSBzd2l0Y2ggY2FzZSBibG9jawotCSAgICB9CisJCX0gZmluYWxseSB7CisJCQlpZiAodGhpcy5zY29wZSAhPSBudWxsKSB0aGlzLnNjb3BlLmVuY2xvc2luZ0Nhc2UgPSBudWxsOyAvLyBubyBsb25nZXIgaW5zaWRlIHN3aXRjaCBjYXNlIGJsb2NrCisJCX0KIAl9CiAKIAkvKioKKwkgKiBTd2l0Y2ggb24gU3RyaW5nIGNvZGUgZ2VuZXJhdGlvbgorCSAqIFRoaXMgYXNzdW1lcyB0aGF0IGhhc2hDb2RlKCkgc3BlY2lmaWNhdGlvbiBmb3IgamF2YS5sYW5nLlN0cmluZyBpcyBBUEkKKwkgKiBhbmQgaXMgc3RhYmxlLgorCSAqIEBzZWUgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiCisJICogQHNlZSAiaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vZG9jcy9jZC9FMTc0MDlfMDEvamF2YXNlLzYvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlRm9yU3RyaW5nU3dpdGNoKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQl0cnkgeworCQkJaWYgKCh0aGlzLmJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQkKKwkJCWNsYXNzIFN0cmluZ1N3aXRjaENhc2UgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKwkJCQlpbnQgaGFzaENvZGU7CisJCQkJU3RyaW5nIHN0cmluZzsKKwkJCQlCcmFuY2hMYWJlbCBsYWJlbDsKKwkJCQlwdWJsaWMgU3RyaW5nU3dpdGNoQ2FzZShpbnQgaGFzaENvZGUsIFN0cmluZyBzdHJpbmcsIEJyYW5jaExhYmVsIGxhYmVsKSB7CisJCQkJCXRoaXMuaGFzaENvZGUgPSBoYXNoQ29kZTsKKwkJCQkJdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisJCQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJCQl9CisJCQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKwkJCQkJU3RyaW5nU3dpdGNoQ2FzZSB0aGF0ID0gKFN0cmluZ1N3aXRjaENhc2UpIG87CisJCQkJCWlmICh0aGlzLmhhc2hDb2RlID09IHRoYXQuaGFzaENvZGUpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCWlmICh0aGlzLmhhc2hDb2RlID4gdGhhdC5oYXNoQ29kZSkgeworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0KKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCQlyZXR1cm4gIlN0cmluZ1N3aXRjaENhc2UgOlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkJICAgICAgICJjYXNlICIgKyB0aGlzLmhhc2hDb2RlICsgIjooIiArIHRoaXMuc3RyaW5nICsgIilcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCSAgICAgICAKKwkJCQl9CisJCQl9CisKKwkJCWZpbmFsIGJvb2xlYW4gaGFzQ2FzZXMgPSB0aGlzLmNhc2VDb3VudCAhPSAwOworCisJCQlTdHJpbmdTd2l0Y2hDYXNlIFtdIHN0cmluZ0Nhc2VzID0gbmV3IFN0cmluZ1N3aXRjaENhc2VbdGhpcy5jYXNlQ291bnRdOyAvLyBtYXkgaGF2ZSB0byBzaHJpbmsgbGF0ZXIgaWYgbXVsdGlwbGUgc3RyaW5ncyBoYXNoIHRvIHNhbWUgY29kZS4KKwkJCUJyYW5jaExhYmVsW10gc291cmNlQ2FzZUxhYmVscyA9IG5ldyBCcmFuY2hMYWJlbFt0aGlzLmNhc2VDb3VudF07CisJCQlDYXNlTGFiZWwgW10gaGFzaENvZGVDYXNlTGFiZWxzID0gbmV3IENhc2VMYWJlbFt0aGlzLmNhc2VDb3VudF07CisJCQl0aGlzLmNvbnN0YW50cyA9IG5ldyBpbnRbdGhpcy5jYXNlQ291bnRdOyAgLy8gaGFzaENvZGUoKSB2YWx1ZXMuCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jYXNlQ291bnQ7IGkgPCBtYXg7IGkrKykgeworCQkJCXRoaXMuY2FzZXNbaV0udGFyZ2V0TGFiZWwgPSAoc291cmNlQ2FzZUxhYmVsc1tpXSA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKSk7ICAvLyBBIGJyYW5jaCBsYWJlbCwgbm90IGEgY2FzZSBsYWJlbC4KKwkJCQlzb3VyY2VDYXNlTGFiZWxzW2ldLnRhZ0JpdHMgfD0gQnJhbmNoTGFiZWwuVVNFRDsKKwkJCQlzdHJpbmdDYXNlc1tpXSA9IG5ldyBTdHJpbmdTd2l0Y2hDYXNlKHRoaXMuc3RyaW5nQ29uc3RhbnRzW2ldLmhhc2hDb2RlKCksIHRoaXMuc3RyaW5nQ29uc3RhbnRzW2ldLCBzb3VyY2VDYXNlTGFiZWxzW2ldKTsKKwkJCQloYXNoQ29kZUNhc2VMYWJlbHNbaV0gPSBuZXcgQ2FzZUxhYmVsKGNvZGVTdHJlYW0pOworCQkJCWhhc2hDb2RlQ2FzZUxhYmVsc1tpXS50YWdCaXRzIHw9IEJyYW5jaExhYmVsLlVTRUQ7CisJCQkJCisJCQl9CisJCQlBcnJheXMuc29ydChzdHJpbmdDYXNlcyk7CisKKwkJCWludCB1bmlxSGFzaENvdW50ID0gMDsKKwkJCWludCBsYXN0SGFzaENvZGUgPSAwOyAKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmNhc2VDb3VudDsgaSA8IGxlbmd0aDsgKytpKSB7CisJCQkJaW50IGhhc2hDb2RlID0gc3RyaW5nQ2FzZXNbaV0uaGFzaENvZGU7CisJCQkJaWYgKGkgPT0gMCB8fCBoYXNoQ29kZSAhPSBsYXN0SGFzaENvZGUpIHsKKwkJCQkJbGFzdEhhc2hDb2RlID0gdGhpcy5jb25zdGFudHNbdW5pcUhhc2hDb3VudCsrXSA9IGhhc2hDb2RlOworCQkJCX0KKwkJCX0KKwkJCQkKKwkJCWlmICh1bmlxSGFzaENvdW50ICE9IHRoaXMuY2FzZUNvdW50KSB7IC8vIG11bHRpcGxlIGtleXMgaGFzaGVkIHRvIHRoZSBzYW1lIHZhbHVlLgorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb25zdGFudHMsIDAsIHRoaXMuY29uc3RhbnRzID0gbmV3IGludFt1bmlxSGFzaENvdW50XSwgMCwgdW5pcUhhc2hDb3VudCk7CisJCQkJU3lzdGVtLmFycmF5Y29weShoYXNoQ29kZUNhc2VMYWJlbHMsIDAsIGhhc2hDb2RlQ2FzZUxhYmVscyA9IG5ldyBDYXNlTGFiZWxbdW5pcUhhc2hDb3VudF0sIDAsIHVuaXFIYXNoQ291bnQpOworCQkJfQorCQkJaW50W10gc29ydGVkSW5kZXhlcyA9IG5ldyBpbnRbdW5pcUhhc2hDb3VudF07IC8vIGhhc2ggY29kZSBhcmUgc29ydGVkIGFscmVhZHkgYW55d2F5cy4KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pcUhhc2hDb3VudDsgaSsrKSB7CisJCQkJc29ydGVkSW5kZXhlc1tpXSA9IGk7CisJCQl9CisKKwkJCUNhc2VMYWJlbCBkZWZhdWx0Q2FzZUxhYmVsID0gbmV3IENhc2VMYWJlbChjb2RlU3RyZWFtKTsKKwkJCWRlZmF1bHRDYXNlTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOworCisJCQkvLyBwcmVwYXJlIHRoZSBsYWJlbHMgYW5kIGNvbnN0YW50cworCQkJdGhpcy5icmVha0xhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CisJCQkKKwkJCUJyYW5jaExhYmVsIGRlZmF1bHRCcmFuY2hMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKKwkJCWlmIChoYXNDYXNlcykgZGVmYXVsdEJyYW5jaExhYmVsLnRhZ0JpdHMgfD0gQnJhbmNoTGFiZWwuVVNFRDsKKwkJCWlmICh0aGlzLmRlZmF1bHRDYXNlICE9IG51bGwpIHsKKwkJCQl0aGlzLmRlZmF1bHRDYXNlLnRhcmdldExhYmVsID0gZGVmYXVsdEJyYW5jaExhYmVsOworCQkJfQorCQkJLy8gZ2VuZXJhdGUgZXhwcmVzc2lvbgorCQkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJY29kZVN0cmVhbS5zdG9yZSh0aGlzLmRpc3BhdGNoU3RyaW5nQ29weSwgdHJ1ZSk7ICAvLyBsZWF2ZXMgc3RyaW5nIG9uIG9wZXJhbmQgc3RhY2sKKwkJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5kaXNwYXRjaFN0cmluZ0NvcHkpOworCQkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdIYXNoQ29kZSgpOworCQkJaWYgKGhhc0Nhc2VzKSB7CisJCQkJY29kZVN0cmVhbS5sb29rdXBzd2l0Y2goZGVmYXVsdENhc2VMYWJlbCwgdGhpcy5jb25zdGFudHMsIHNvcnRlZEluZGV4ZXMsIGhhc2hDb2RlQ2FzZUxhYmVscyk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGogPSAwLCBtYXggPSB0aGlzLmNhc2VDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCWludCBoYXNoQ29kZSA9IHN0cmluZ0Nhc2VzW2ldLmhhc2hDb2RlOworCQkJCQlpZiAoaSA9PSAwIHx8IGhhc2hDb2RlICE9IGxhc3RIYXNoQ29kZSkgeworCQkJCQkJbGFzdEhhc2hDb2RlID0gaGFzaENvZGU7CisJCQkJCQlpZiAoaSAhPSAwKSB7CisJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhkZWZhdWx0QnJhbmNoTGFiZWwpOworCQkJCQkJfQorCQkJCQkJaGFzaENvZGVDYXNlTGFiZWxzW2orK10ucGxhY2UoKTsKKwkJCQkJfQorCQkJCQljb2RlU3RyZWFtLmxvYWQodGhpcy5kaXNwYXRjaFN0cmluZ0NvcHkpOworCQkJCQljb2RlU3RyZWFtLmxkYyhzdHJpbmdDYXNlc1tpXS5zdHJpbmcpOworCQkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0VxdWFscygpOworCQkJCQljb2RlU3RyZWFtLmlmbmUoc3RyaW5nQ2FzZXNbaV0ubGFiZWwpOworCQkJCX0KKwkJCQljb2RlU3RyZWFtLmdvdG9fKGRlZmF1bHRCcmFuY2hMYWJlbCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQl9CisKKwkJCS8vIGdlbmVyYXRlIHRoZSBzd2l0Y2ggYmxvY2sgc3RhdGVtZW50cworCQkJaW50IGNhc2VJbmRleCA9IDA7CisJCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4Q2FzZXMgPSB0aGlzLnN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4Q2FzZXM7IGkrKykgeworCQkJCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnRzW2ldOworCQkJCQlpZiAoKGNhc2VJbmRleCA8IHRoaXMuY2FzZUNvdW50KSAmJiAoc3RhdGVtZW50ID09IHRoaXMuY2FzZXNbY2FzZUluZGV4XSkpIHsgLy8gc3RhdGVtZW50c1tpXSBpcyBhIGNhc2UKKwkJCQkJCXRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IHRoaXMuY2FzZXNbY2FzZUluZGV4XTsgLy8gcmVjb3JkIGVudGVyaW5nIGluIGEgc3dpdGNoIGNhc2UgYmxvY2sKKwkJCQkJCWlmICh0aGlzLnByZVN3aXRjaEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZVN3aXRjaEluaXRTdGF0ZUluZGV4KTsKKwkJCQkJCX0KKwkJCQkJCWNhc2VJbmRleCsrOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHN0YXRlbWVudCA9PSB0aGlzLmRlZmF1bHRDYXNlKSB7IC8vIHN0YXRlbWVudHNbaV0gaXMgYSBjYXNlIG9yIGEgZGVmYXVsdCBjYXNlCisJCQkJCQkJZGVmYXVsdENhc2VMYWJlbC5wbGFjZSgpOyAvLyBicmFuY2ggbGFiZWwgZ2V0cyBwbGFjZWQgYnkgZ2VuZXJhdGVDb2RlIGJlbG93LgorCQkJCQkJCXRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IHRoaXMuZGVmYXVsdENhc2U7IC8vIHJlY29yZCBlbnRlcmluZyBpbiBhIHN3aXRjaCBjYXNlIGJsb2NrCisJCQkJCQkJaWYgKHRoaXMucHJlU3dpdGNoSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZVN3aXRjaEluaXRTdGF0ZUluZGV4KTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJc3RhdGVtZW50LmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQkJaWYgKHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQljb2RlU3RyZWFtLnJlbW92ZVZhcmlhYmxlKHRoaXMuZGlzcGF0Y2hTdHJpbmdDb3B5KTsKKwkJCWlmICh0aGlzLnNjb3BlICE9IGN1cnJlbnRTY29wZSkgeworCQkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKKwkJCX0KKwkJCS8vIHBsYWNlIHRoZSB0cmFpbGluZyBsYWJlbHMgKGZvciBicmVhayBhbmQgZGVmYXVsdCBjYXNlKQorCQkJdGhpcy5icmVha0xhYmVsLnBsYWNlKCk7CisJCQlpZiAodGhpcy5kZWZhdWx0Q2FzZSA9PSBudWxsKSB7CisJCQkJLy8gd2Ugd2FudCB0byBmb3JjZSBhbiBsaW5lIG51bWJlciBlbnRyeSB0byBnZXQgYW4gZW5kIHBvc2l0aW9uIGFmdGVyIHRoZSBzd2l0Y2ggc3RhdGVtZW50CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGNvZGVTdHJlYW0ucG9zaXRpb24sIHRoaXMuc291cmNlRW5kLCB0cnVlKTsKKwkJCQlkZWZhdWx0Q2FzZUxhYmVsLnBsYWNlKCk7CisJCQkJZGVmYXVsdEJyYW5jaExhYmVsLnBsYWNlKCk7CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlmaW5hbGx5IHsKKwkJCWlmICh0aGlzLnNjb3BlICE9IG51bGwpIHRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IG51bGw7IC8vIG5vIGxvbmdlciBpbnNpZGUgc3dpdGNoIGNhc2UgYmxvY2sKKwkJfQorCX0KKworCQorCS8qKgogCSAqIFN3aXRjaCBjb2RlIGdlbmVyYXRpb24KIAkgKgogCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCiAJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7Ci0KLQkgICAgdHJ5IHsKLQkJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CisJCWlmICh0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgeworCQkJZ2VuZXJhdGVDb2RlRm9yU3RyaW5nU3dpdGNoKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCQlyZXR1cm47CisJCX0KKwkJdHJ5IHsKKwkJCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQorCiAJCQkvLyBwcmVwYXJlIHRoZSBsYWJlbHMgYW5kIGNvbnN0YW50cwogCQkJdGhpcy5icmVha0xhYmVsLmluaXRpYWxpemUoY29kZVN0cmVhbSk7CiAJCQlDYXNlTGFiZWxbXSBjYXNlTGFiZWxzID0gbmV3IENhc2VMYWJlbFt0aGlzLmNhc2VDb3VudF07Ci0JCQlib29sZWFuIG5lZWRTd2l0Y2ggPSB0aGlzLmNhc2VDb3VudCAhPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlQ291bnQ7IGkrKykgewotCQkJCWNhc2VzW2ldLnRhcmdldExhYmVsID0gKGNhc2VMYWJlbHNbaV0gPSBuZXcgQ2FzZUxhYmVsKGNvZGVTdHJlYW0pKTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmNhc2VDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCQkJdGhpcy5jYXNlc1tpXS50YXJnZXRMYWJlbCA9IChjYXNlTGFiZWxzW2ldID0gbmV3IENhc2VMYWJlbChjb2RlU3RyZWFtKSk7CiAJCQkJY2FzZUxhYmVsc1tpXS50YWdCaXRzIHw9IEJyYW5jaExhYmVsLlVTRUQ7CiAJCQl9CiAJCQlDYXNlTGFiZWwgZGVmYXVsdExhYmVsID0gbmV3IENhc2VMYWJlbChjb2RlU3RyZWFtKTsKLQkJCWlmIChuZWVkU3dpdGNoKSBkZWZhdWx0TGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwotCQkJaWYgKGRlZmF1bHRDYXNlICE9IG51bGwpIHsKLQkJCQlkZWZhdWx0Q2FzZS50YXJnZXRMYWJlbCA9IGRlZmF1bHRMYWJlbDsKKwkJCWZpbmFsIGJvb2xlYW4gaGFzQ2FzZXMgPSB0aGlzLmNhc2VDb3VudCAhPSAwOworCQkJaWYgKGhhc0Nhc2VzKSBkZWZhdWx0TGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOworCQkJaWYgKHRoaXMuZGVmYXVsdENhc2UgIT0gbnVsbCkgeworCQkJCXRoaXMuZGVmYXVsdENhc2UudGFyZ2V0TGFiZWwgPSBkZWZhdWx0TGFiZWw7CiAJCQl9CiAKIAkJCWZpbmFsIFR5cGVCaW5kaW5nIHJlc29sdmVkVHlwZSA9IHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGU7CisJCQlib29sZWFuIHZhbHVlUmVxdWlyZWQgPSBmYWxzZTsKIAkJCWlmIChyZXNvbHZlZFR5cGUuaXNFbnVtKCkpIHsKLQkJCQlpZiAobmVlZFN3aXRjaCkgewotCQkJCQkvLyBnbyB0aHJvdWdoIHRoZSB0cmFuc2xhdGlvbiB0YWJsZQotCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyh0aGlzLnN5bnRoZXRpYyk7Ci0JCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJCS8vIGdldCBlbnVtIGNvbnN0YW50IG9yZGluYWwoKQotCQkJCQljb2RlU3RyZWFtLmludm9rZUVudW1PcmRpbmFsKHJlc29sdmVkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpOwotCQkJCQljb2RlU3RyZWFtLmlhbG9hZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5vIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24gdGFibGUKLQkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJLy8gZ28gdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24gdGFibGUKKwkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIHRoaXMuc3ludGhldGljLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCQkJCXRoaXMuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQkvLyBnZXQgZW51bSBjb25zdGFudCBvcmRpbmFsKCkKKwkJCQljb2RlU3RyZWFtLmludm9rZUVudW1PcmRpbmFsKHJlc29sdmVkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpOworCQkJCWNvZGVTdHJlYW0uaWFsb2FkKCk7CisJCQkJaWYgKCFoYXNDYXNlcykgeworCQkJCQkvLyB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgZ2VuZXJhdGVkIG9yZGluYWwgdmFsdWUKKwkJCQkJY29kZVN0cmVhbS5wb3AoKTsKIAkJCQl9CiAJCQl9IGVsc2UgeworCQkJCXZhbHVlUmVxdWlyZWQgPSB0aGlzLmV4cHJlc3Npb24uY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50IHx8IGhhc0Nhc2VzOwogCQkJCS8vIGdlbmVyYXRlIGV4cHJlc3Npb24KLQkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG5lZWRTd2l0Y2gpOyAvLyB2YWx1ZSByZXF1aXJlZCAoc3dpdGNoIHdpdGhvdXQgY2FzZXMpCisJCQkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJfQogCQkJLy8gZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHN3aXRjaCB0YWJsZS9sb29rdXAgYnl0ZWNvZGUKLQkJCWlmIChuZWVkU3dpdGNoKSB7CisJCQlpZiAoaGFzQ2FzZXMpIHsKIAkJCQlpbnRbXSBzb3J0ZWRJbmRleGVzID0gbmV3IGludFt0aGlzLmNhc2VDb3VudF07CiAJCQkJLy8gd2Ugc29ydCB0aGUga2V5cyB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIHRoZSBjb2RlIGZvciB0YWJsZXN3aXRjaCBvciBsb29rdXBzd2l0Y2gKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VDb3VudDsgaSsrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNhc2VDb3VudDsgaSsrKSB7CiAJCQkJCXNvcnRlZEluZGV4ZXNbaV0gPSBpOwogCQkJCX0KIAkJCQlpbnRbXSBsb2NhbEtleXNDb3B5OwpAQCAtMTgyLDEzICszNTgsMTMgQEAKIAogCQkJCWludCBtYXggPSBsb2NhbEtleXNDb3B5W3RoaXMuY2FzZUNvdW50IC0gMV07CiAJCQkJaW50IG1pbiA9IGxvY2FsS2V5c0NvcHlbMF07Ci0JCQkJaWYgKChsb25nKSAoY2FzZUNvdW50ICogMi41KSA+ICgobG9uZykgbWF4IC0gKGxvbmcpIG1pbikpIHsKLQkJCQkJCisJCQkJaWYgKChsb25nKSAodGhpcy5jYXNlQ291bnQgKiAyLjUpID4gKChsb25nKSBtYXggLSAobG9uZykgbWluKSkgeworCiAJCQkJCS8vIHdvcmstYXJvdW5kIDEuMyBWTSBidWcsIGlmIG1heD4weDdGRkYwMDAwLCBtdXN0IHVzZSBsb29rdXAgYnl0ZWNvZGUKIAkJCQkJLy8gc2VlIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1NTcKIAkJCQkJaWYgKG1heCA+IDB4N0ZGRjAwMDAgJiYgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKIAkJCQkJCWNvZGVTdHJlYW0ubG9va3Vwc3dpdGNoKGRlZmF1bHRMYWJlbCwgdGhpcy5jb25zdGFudHMsIHNvcnRlZEluZGV4ZXMsIGNhc2VMYWJlbHMpOwotCQorCiAJCQkJCX0gZWxzZSB7CiAJCQkJCQljb2RlU3RyZWFtLnRhYmxlc3dpdGNoKAogCQkJCQkJCWRlZmF1bHRMYWJlbCwKQEAgLTIwMiw4ICszNzgsMTAgQEAKIAkJCQkJY29kZVN0cmVhbS5sb29rdXBzd2l0Y2goZGVmYXVsdExhYmVsLCB0aGlzLmNvbnN0YW50cywgc29ydGVkSW5kZXhlcywgY2FzZUxhYmVscyk7CiAJCQkJfQogCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEModGhpcy5zY29wZSwgY29kZVN0cmVhbS5wb3NpdGlvbik7CisJCQl9IGVsc2UgaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQljb2RlU3RyZWFtLnBvcCgpOwogCQkJfQotCQkJCisKIAkJCS8vIGdlbmVyYXRlIHRoZSBzd2l0Y2ggYmxvY2sgc3RhdGVtZW50cwogCQkJaW50IGNhc2VJbmRleCA9IDA7CiAJCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKQEAgLTIxMSw1MyArMzg5LDUzIEBACiAJCQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLnN0YXRlbWVudHNbaV07CiAJCQkJCWlmICgoY2FzZUluZGV4IDwgdGhpcy5jYXNlQ291bnQpICYmIChzdGF0ZW1lbnQgPT0gdGhpcy5jYXNlc1tjYXNlSW5kZXhdKSkgeyAvLyBzdGF0ZW1lbnRzW2ldIGlzIGEgY2FzZQogCQkJCQkJdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gdGhpcy5jYXNlc1tjYXNlSW5kZXhdOyAvLyByZWNvcmQgZW50ZXJpbmcgaW4gYSBzd2l0Y2ggY2FzZSBibG9jawotCQkJCQkJaWYgKHByZVN3aXRjaEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBwcmVTd2l0Y2hJbml0U3RhdGVJbmRleCk7CisJCQkJCQlpZiAodGhpcy5wcmVTd2l0Y2hJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVTd2l0Y2hJbml0U3RhdGVJbmRleCk7CiAJCQkJCQl9CiAJCQkJCQljYXNlSW5kZXgrKzsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmIChzdGF0ZW1lbnQgPT0gdGhpcy5kZWZhdWx0Q2FzZSkgeyAvLyBzdGF0ZW1lbnRzW2ldIGlzIGEgY2FzZSBvciBhIGRlZmF1bHQgY2FzZQogCQkJCQkJCXRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IHRoaXMuZGVmYXVsdENhc2U7IC8vIHJlY29yZCBlbnRlcmluZyBpbiBhIHN3aXRjaCBjYXNlIGJsb2NrCi0JCQkJCQkJaWYgKHByZVN3aXRjaEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcHJlU3dpdGNoSW5pdFN0YXRlSW5kZXgpOworCQkJCQkJCWlmICh0aGlzLnByZVN3aXRjaEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVTd2l0Y2hJbml0U3RhdGVJbmRleCk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCXN0YXRlbWVudC5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQkJCQlzdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0pOwogCQkJCX0KIAkJCX0KIAkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwotCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7Ci0JCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQlpZiAodGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJCX0KLQkJCWlmIChzY29wZSAhPSBjdXJyZW50U2NvcGUpIHsKKwkJCWlmICh0aGlzLnNjb3BlICE9IGN1cnJlbnRTY29wZSkgewogCQkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKIAkJCX0KIAkJCS8vIHBsYWNlIHRoZSB0cmFpbGluZyBsYWJlbHMgKGZvciBicmVhayBhbmQgZGVmYXVsdCBjYXNlKQogCQkJdGhpcy5icmVha0xhYmVsLnBsYWNlKCk7Ci0JCQlpZiAoZGVmYXVsdENhc2UgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuZGVmYXVsdENhc2UgPT0gbnVsbCkgewogCQkJCS8vIHdlIHdhbnQgdG8gZm9yY2UgYW4gbGluZSBudW1iZXIgZW50cnkgdG8gZ2V0IGFuIGVuZCBwb3NpdGlvbiBhZnRlciB0aGUgc3dpdGNoIHN0YXRlbWVudAogCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShjb2RlU3RyZWFtLnBvc2l0aW9uLCB0aGlzLnNvdXJjZUVuZCwgdHJ1ZSk7CiAJCQkJZGVmYXVsdExhYmVsLnBsYWNlKCk7CiAJCQl9CiAJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotCSAgICB9IGZpbmFsbHkgewotCSAgICAgICAgaWYgKHRoaXMuc2NvcGUgIT0gbnVsbCkgdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gbnVsbDsgLy8gbm8gbG9uZ2VyIGluc2lkZSBzd2l0Y2ggY2FzZSBibG9jawotCSAgICB9CQkKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh0aGlzLnNjb3BlICE9IG51bGwpIHRoaXMuc2NvcGUuZW5jbG9zaW5nQ2FzZSA9IG51bGw7IC8vIG5vIGxvbmdlciBpbnNpZGUgc3dpdGNoIGNhc2UgYmxvY2sKKwkJfQogCX0KIAogCXB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCiAJCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoInN3aXRjaCAoIik7IC8vJE5PTi1OTFMtMSQKLQkJZXhwcmVzc2lvbi5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KS5hcHBlbmQoIikgeyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgeworCQl0aGlzLmV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCIpIHsiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgnXG4nKTsKLQkJCQlpZiAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIENhc2VTdGF0ZW1lbnQpIHsKLQkJCQkJc3RhdGVtZW50c1tpXS5wcmludFN0YXRlbWVudChpbmRlbnQsIG91dHB1dCk7CisJCQkJaWYgKHRoaXMuc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIENhc2VTdGF0ZW1lbnQpIHsKKwkJCQkJdGhpcy5zdGF0ZW1lbnRzW2ldLnByaW50U3RhdGVtZW50KGluZGVudCwgb3V0cHV0KTsKIAkJCQl9IGVsc2UgewotCQkJCQlzdGF0ZW1lbnRzW2ldLnByaW50U3RhdGVtZW50KGluZGVudCsyLCBvdXRwdXQpOworCQkJCQl0aGlzLnN0YXRlbWVudHNbaV0ucHJpbnRTdGF0ZW1lbnQoaW5kZW50KzIsIG91dHB1dCk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yNjYsMTUgKzQ0NCwxOCBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSB1cHBlclNjb3BlKSB7Ci0JCi0JICAgIHRyeSB7CisJCXRyeSB7CiAJCQlib29sZWFuIGlzRW51bVN3aXRjaCA9IGZhbHNlOwotCQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHVwcGVyU2NvcGUpOworCQkJYm9vbGVhbiBpc1N0cmluZ1N3aXRjaCA9IGZhbHNlOworCQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUodXBwZXJTY29wZSk7CiAJCQlpZiAoZXhwcmVzc2lvblR5cGUgIT0gbnVsbCkgewotCQkJCWV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24odXBwZXJTY29wZSwgZXhwcmVzc2lvblR5cGUsIGV4cHJlc3Npb25UeXBlKTsKKwkJCQl0aGlzLmV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24odXBwZXJTY29wZSwgZXhwcmVzc2lvblR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCQljaGVja1R5cGU6IHsKLQkJCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJCQkJaWYgKGV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcuSU5UKSkKKwkJCQkJaWYgKCFleHByZXNzaW9uVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQlleHByZXNzaW9uVHlwZSA9IG51bGw7IC8vIGZhdWx0LXRvbGVyYW5jZTogaWdub3JlIHR5cGUgbWlzbWF0Y2ggZnJvbSBjb25zdGFudHMgZnJvbSBoZXJlb24KKwkJCQkJCWJyZWFrIGNoZWNrVHlwZTsKKwkJCQkJfSBlbHNlIGlmIChleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCQkJCWlmICh0aGlzLmV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcuSU5UKSkKIAkJCQkJCQlicmVhayBjaGVja1R5cGU7CiAJCQkJCQlpZiAoZXhwcmVzc2lvblR5cGUuaXNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZy5JTlQpKQogCQkJCQkJCWJyZWFrIGNoZWNrVHlwZTsKQEAgLTI4Miw3NSArNDYzLDg1IEBACiAJCQkJCQlpc0VudW1Td2l0Y2ggPSB0cnVlOwogCQkJCQkJYnJlYWsgY2hlY2tUeXBlOwogCQkJCQl9IGVsc2UgaWYgKHVwcGVyU2NvcGUuaXNCb3hpbmdDb21wYXRpYmxlV2l0aChleHByZXNzaW9uVHlwZSwgVHlwZUJpbmRpbmcuSU5UKSkgewotCQkJCQkJZXhwcmVzc2lvbi5jb21wdXRlQ29udmVyc2lvbih1cHBlclNjb3BlLCBUeXBlQmluZGluZy5JTlQsIGV4cHJlc3Npb25UeXBlKTsKKwkJCQkJCXRoaXMuZXhwcmVzc2lvbi5jb21wdXRlQ29udmVyc2lvbih1cHBlclNjb3BlLCBUeXBlQmluZGluZy5JTlQsIGV4cHJlc3Npb25UeXBlKTsKKwkJCQkJCWJyZWFrIGNoZWNrVHlwZTsKKwkJCQkJfSBlbHNlIGlmICh1cHBlclNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83ICYmIGV4cHJlc3Npb25UeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgeworCQkJCQkJaXNTdHJpbmdTd2l0Y2ggPSB0cnVlOwogCQkJCQkJYnJlYWsgY2hlY2tUeXBlOwogCQkJCQl9Ci0JCQkJCXVwcGVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0U3dpdGNoVHlwZShleHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSk7CisJCQkJCXVwcGVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0U3dpdGNoVHlwZSh0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlKTsKIAkJCQkJZXhwcmVzc2lvblR5cGUgPSBudWxsOyAvLyBmYXVsdC10b2xlcmFuY2U6IGlnbm9yZSB0eXBlIG1pc21hdGNoIGZyb20gY29uc3RhbnRzIGZyb20gaGVyZW9uCiAJCQkJfQogCQkJfQotCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCXNjb3BlID0gLypleHBsaWNpdERlY2xhcmF0aW9ucyA9PSAwID8gdXBwZXJTY29wZSA6ICovbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSk7CisJCQlpZiAoaXNTdHJpbmdTd2l0Y2gpIHsKKwkJCQkvLyB0aGUgc2VjcmV0IHZhcmlhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBpdGVyYXRpbmcgb3ZlciB0aGUgc3dpdGNoJ3Mgc3RhdGVtZW50cyB0aGF0IGNvdWxkCisJCQkJLy8gY3JlYXRlIG1vcmUgbG9jYWxzLiBUaGlzIG11c3QgYmUgZG9uZSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nIG9mIGxvY2FscworCQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzU2MDAyCisJCQkJdGhpcy5kaXNwYXRjaFN0cmluZ0NvcHkgID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKFNlY3JldFN0cmluZ1ZhcmlhYmxlTmFtZSwgdXBwZXJTY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCwgZmFsc2UpOworCQkJCXVwcGVyU2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLmRpc3BhdGNoU3RyaW5nQ29weSk7CisJCQkJdGhpcy5kaXNwYXRjaFN0cmluZ0NvcHkuc2V0Q29uc3RhbnQoQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKKwkJCQl0aGlzLmRpc3BhdGNoU3RyaW5nQ29weS51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCX0KKwkJCWlmICh0aGlzLnN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCXRoaXMuc2NvcGUgPSBuZXcgQmxvY2tTY29wZSh1cHBlclNjb3BlKTsKIAkJCQlpbnQgbGVuZ3RoOwogCQkJCS8vIGNvbGxlY3Rpb24gb2YgY2FzZXMgaXMgdG9vIGJpZyBidXQgd2Ugd2lsbCBvbmx5IGl0ZXJhdGUgdW50aWwgY2FzZUNvdW50Ci0JCQkJY2FzZXMgPSBuZXcgQ2FzZVN0YXRlbWVudFtsZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aF07Ci0JCQkJdGhpcy5jb25zdGFudHMgPSBuZXcgaW50W2xlbmd0aF07Ci0JCQkJQ2FzZVN0YXRlbWVudFtdIGR1cGxpY2F0ZUNhc2VTdGF0ZW1lbnRzID0gbnVsbDsKLQkJCQlpbnQgZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNDb3VudGVyID0gMDsKKwkJCQl0aGlzLmNhc2VzID0gbmV3IENhc2VTdGF0ZW1lbnRbbGVuZ3RoID0gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aF07CisJCQkJaWYgKCFpc1N0cmluZ1N3aXRjaCkgeworCQkJCQl0aGlzLmNvbnN0YW50cyA9IG5ldyBpbnRbbGVuZ3RoXTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnN0cmluZ0NvbnN0YW50cyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJCQl9CiAJCQkJaW50IGNvdW50ZXIgPSAwOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJQ29uc3RhbnQgY29uc3RhbnQ7Ci0JCQkJCWZpbmFsIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzW2ldOwotCQkJCQlpZiAoKGNvbnN0YW50ID0gc3RhdGVtZW50LnJlc29sdmVDYXNlKHNjb3BlLCBleHByZXNzaW9uVHlwZSwgdGhpcykpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJCQkJaW50IGtleSA9IGNvbnN0YW50LmludFZhbHVlKCk7Ci0JCQkJCQkvLy0tLS1jaGVjayBmb3IgZHVwbGljYXRlIGNhc2Ugc3RhdGVtZW50LS0tLS0tLS0tLS0tCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50ZXI7IGorKykgewotCQkJCQkJCWlmICh0aGlzLmNvbnN0YW50c1tqXSA9PSBrZXkpIHsKLQkJCQkJCQkJZmluYWwgQ2FzZVN0YXRlbWVudCBjdXJyZW50Q2FzZVN0YXRlbWVudCA9IChDYXNlU3RhdGVtZW50KSBzdGF0ZW1lbnQ7Ci0JCQkJCQkJCWlmIChkdXBsaWNhdGVDYXNlU3RhdGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVDYXNlKGNhc2VzW2pdKTsKLQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUNhc2UoY3VycmVudENhc2VTdGF0ZW1lbnQpOwotCQkJCQkJCQkJZHVwbGljYXRlQ2FzZVN0YXRlbWVudHMgPSBuZXcgQ2FzZVN0YXRlbWVudFtsZW5ndGhdOwotCQkJCQkJCQkJZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNbZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNDb3VudGVyKytdID0gY2FzZXNbal07Ci0JCQkJCQkJCQlkdXBsaWNhdGVDYXNlU3RhdGVtZW50c1tkdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIrK10gPSBjdXJyZW50Q2FzZVN0YXRlbWVudDsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQkJCXNlYXJjaFJlcG9ydGVkRHVwbGljYXRlOiBmb3IgKGludCBrID0gMjsgayA8IGR1cGxpY2F0ZUNhc2VTdGF0ZW1lbnRzQ291bnRlcjsgaysrKSB7Ci0JCQkJCQkJCQkJaWYgKGR1cGxpY2F0ZUNhc2VTdGF0ZW1lbnRzW2tdID09IHN0YXRlbWVudCkgewotCQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQkJCWJyZWFrIHNlYXJjaFJlcG9ydGVkRHVwbGljYXRlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVDYXNlKGN1cnJlbnRDYXNlU3RhdGVtZW50KTsKLQkJCQkJCQkJCQlkdXBsaWNhdGVDYXNlU3RhdGVtZW50c1tkdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIrK10gPSBjdXJyZW50Q2FzZVN0YXRlbWVudDsKLQkJCQkJCQkJCX0KKwkJCQkJZmluYWwgU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50c1tpXTsKKwkJCQkJaWYgKChjb25zdGFudCA9IHN0YXRlbWVudC5yZXNvbHZlQ2FzZSh0aGlzLnNjb3BlLCBleHByZXNzaW9uVHlwZSwgdGhpcykpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCQkJaWYgKCFpc1N0cmluZ1N3aXRjaCkgeworCQkJCQkJCWludCBrZXkgPSBjb25zdGFudC5pbnRWYWx1ZSgpOworCQkJCQkJCS8vLS0tLWNoZWNrIGZvciBkdXBsaWNhdGUgY2FzZSBzdGF0ZW1lbnQtLS0tLS0tLS0tLS0KKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50ZXI7IGorKykgeworCQkJCQkJCQlpZiAodGhpcy5jb25zdGFudHNbal0gPT0ga2V5KSB7CisJCQkJCQkJCQlyZXBvcnREdXBsaWNhdGVDYXNlKChDYXNlU3RhdGVtZW50KSBzdGF0ZW1lbnQsIHRoaXMuY2FzZXNbal0sIGxlbmd0aCk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CisJCQkJCQkJdGhpcy5jb25zdGFudHNbY291bnRlcisrXSA9IGtleTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJU3RyaW5nIGtleSA9IGNvbnN0YW50LnN0cmluZ1ZhbHVlKCk7CisJCQkJCQkJLy8tLS0tY2hlY2sgZm9yIGR1cGxpY2F0ZSBjYXNlIHN0YXRlbWVudC0tLS0tLS0tLS0tLQorCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY291bnRlcjsgaisrKSB7CisJCQkJCQkJCWlmICh0aGlzLnN0cmluZ0NvbnN0YW50c1tqXS5lcXVhbHMoa2V5KSkgeworCQkJCQkJCQkJcmVwb3J0RHVwbGljYXRlQ2FzZSgoQ2FzZVN0YXRlbWVudCkgc3RhdGVtZW50LCB0aGlzLmNhc2VzW2pdLCBsZW5ndGgpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuc3RyaW5nQ29uc3RhbnRzW2NvdW50ZXIrK10gPSBrZXk7CQkJCiAJCQkJCQl9Ci0JCQkJCQl0aGlzLmNvbnN0YW50c1tjb3VudGVyKytdID0ga2V5OwogCQkJCQl9CiAJCQkJfQogCQkJCWlmIChsZW5ndGggIT0gY291bnRlcikgeyAvLyByZXNpemUgY29uc3RhbnRzIGFycmF5Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb25zdGFudHMsIDAsIHRoaXMuY29uc3RhbnRzID0gbmV3IGludFtjb3VudGVyXSwgMCwgY291bnRlcik7CisJCQkJCWlmICghaXNTdHJpbmdTd2l0Y2gpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb25zdGFudHMsIDAsIHRoaXMuY29uc3RhbnRzID0gbmV3IGludFtjb3VudGVyXSwgMCwgY291bnRlcik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RyaW5nQ29uc3RhbnRzLCAwLCB0aGlzLnN0cmluZ0NvbnN0YW50cyA9IG5ldyBTdHJpbmdbY291bnRlcl0sIDAsIGNvdW50ZXIpOworCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKHRoaXMuYml0cyAmIFVuZG9jdW1lbnRlZEVtcHR5QmxvY2spICE9IDApIHsKIAkJCQkJdXBwZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrKHRoaXMuYmxvY2tTdGFydCwgdGhpcy5zb3VyY2VFbmQpOwogCQkJCX0KIAkJCX0KLQkJCS8vIGZvciBlbnVtIHN3aXRjaCwgY2hlY2sgaWYgYWxsIGNvbnN0YW50cyBhcmUgYWNjb3VudGVkIGZvciAoaWYgbm8gZGVmYXVsdCkgCi0JCQlpZiAoaXNFbnVtU3dpdGNoICYmIGRlZmF1bHRDYXNlID09IG51bGwgCisJCQkvLyBmb3IgZW51bSBzd2l0Y2gsIGNoZWNrIGlmIGFsbCBjb25zdGFudHMgYXJlIGFjY291bnRlZCBmb3IgKGlmIG5vIGRlZmF1bHQpCisJCQlpZiAoaXNFbnVtU3dpdGNoICYmIHRoaXMuZGVmYXVsdENhc2UgPT0gbnVsbAogCQkJCQkmJiB1cHBlclNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5JbmNvbXBsZXRlRW51bVN3aXRjaCkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CiAJCQkJaW50IGNvbnN0YW50Q291bnQgPSB0aGlzLmNvbnN0YW50cyA9PSBudWxsID8gMCA6IHRoaXMuY29uc3RhbnRzLmxlbmd0aDsgLy8gY291bGQgYmUgbnVsbCBpZiBubyBjYXNlIHN0YXRlbWVudAotCQkJCWlmIChjb25zdGFudENvdW50ID09IGNhc2VDb3VudCAvLyBpZ25vcmUgZGlhZ25vc2lzIGlmIHVucmVzb2x2ZWQgY29uc3RhbnRzCi0JCQkJCQkmJiBjYXNlQ291bnQgIT0gKChSZWZlcmVuY2VCaW5kaW5nKWV4cHJlc3Npb25UeXBlKS5lbnVtQ29uc3RhbnRDb3VudCgpKSB7CisJCQkJaWYgKGNvbnN0YW50Q291bnQgPT0gdGhpcy5jYXNlQ291bnQKKwkJCQkJCSYmIHRoaXMuY2FzZUNvdW50ICE9ICgoUmVmZXJlbmNlQmluZGluZylleHByZXNzaW9uVHlwZSkuZW51bUNvbnN0YW50Q291bnQoKSkgewogCQkJCQlGaWVsZEJpbmRpbmdbXSBlbnVtRmllbGRzID0gKChSZWZlcmVuY2VCaW5kaW5nKWV4cHJlc3Npb25UeXBlLmVyYXN1cmUoKSkuZmllbGRzKCk7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbnVtRmllbGRzLmxlbmd0aDsgaSA8bWF4OyBpKyspIHsKIAkJCQkJCUZpZWxkQmluZGluZyBlbnVtQ29uc3RhbnQgPSBlbnVtRmllbGRzW2ldOwogCQkJCQkJaWYgKChlbnVtQ29uc3RhbnQubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0pID09IDApIGNvbnRpbnVlOwogCQkJCQkJZmluZENvbnN0YW50IDogewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZUNvdW50OyBqKyspIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRoaXMuY2FzZUNvdW50OyBqKyspIHsKIAkJCQkJCQkJaWYgKChlbnVtQ29uc3RhbnQuaWQgKyAxKSA9PSB0aGlzLmNvbnN0YW50c1tqXSkgLy8gemVybyBzaG91bGQgbm90IGJlIHJldHVybmVkIHNlZSBidWcgMTQxODEwCiAJCQkJCQkJCQlicmVhayBmaW5kQ29uc3RhbnQ7CiAJCQkJCQkJfQpAQCAtMzYwLDkgKzU1MSwzMSBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCSAgICB9IGZpbmFsbHkgewotCSAgICAgICAgaWYgKHRoaXMuc2NvcGUgIT0gbnVsbCkgdGhpcy5zY29wZS5lbmNsb3NpbmdDYXNlID0gbnVsbDsgLy8gbm8gbG9uZ2VyIGluc2lkZSBzd2l0Y2ggY2FzZSBibG9jawotCSAgICB9CisJCX0gZmluYWxseSB7CisJCQlpZiAodGhpcy5zY29wZSAhPSBudWxsKSB0aGlzLnNjb3BlLmVuY2xvc2luZ0Nhc2UgPSBudWxsOyAvLyBubyBsb25nZXIgaW5zaWRlIHN3aXRjaCBjYXNlIGJsb2NrCisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVwb3J0RHVwbGljYXRlQ2FzZShmaW5hbCBDYXNlU3RhdGVtZW50IGR1cGxpY2F0ZSwgZmluYWwgQ2FzZVN0YXRlbWVudCBvcmlnaW5hbCwgaW50IGxlbmd0aCkgeworCQlpZiAodGhpcy5kdXBsaWNhdGVDYXNlU3RhdGVtZW50cyA9PSBudWxsKSB7CisJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUNhc2Uob3JpZ2luYWwpOworCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVDYXNlKGR1cGxpY2F0ZSk7CisJCQl0aGlzLmR1cGxpY2F0ZUNhc2VTdGF0ZW1lbnRzID0gbmV3IENhc2VTdGF0ZW1lbnRbbGVuZ3RoXTsKKwkJCXRoaXMuZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNbdGhpcy5kdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIrK10gPSBvcmlnaW5hbDsKKwkJCXRoaXMuZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNbdGhpcy5kdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIrK10gPSBkdXBsaWNhdGU7CisJCX0gZWxzZSB7CisJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQlzZWFyY2hSZXBvcnRlZER1cGxpY2F0ZTogZm9yIChpbnQgayA9IDI7IGsgPCB0aGlzLmR1cGxpY2F0ZUNhc2VTdGF0ZW1lbnRzQ291bnRlcjsgaysrKSB7CisJCQkJaWYgKHRoaXMuZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNba10gPT0gZHVwbGljYXRlKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWsgc2VhcmNoUmVwb3J0ZWREdXBsaWNhdGU7CisJCQkJfQorCQkJfQorCQkJaWYgKCFmb3VuZCkgeworCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlQ2FzZShkdXBsaWNhdGUpOworCQkJCXRoaXMuZHVwbGljYXRlQ2FzZVN0YXRlbWVudHNbdGhpcy5kdXBsaWNhdGVDYXNlU3RhdGVtZW50c0NvdW50ZXIrK10gPSBkdXBsaWNhdGU7CisJCQl9CisJCX0KIAl9CiAKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKQEAgLTM3MCwyMSArNTgzLDIxIEBACiAJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewotCQkJZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCXRoaXMuZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJCWlmICh0aGlzLnN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHNMZW5ndGg7IGkrKykKLQkJCQkJc3RhdGVtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCXRoaXMuc3RhdGVtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCX0KIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLQkKKwogCS8qKgogCSAqIERpc3BhdGNoIHRoZSBjYWxsIG9uIGl0cyBsYXN0IHN0YXRlbWVudC4KIAkgKi8KIAlwdWJsaWMgdm9pZCBicmFuY2hDaGFpblRvKEJyYW5jaExhYmVsIGxhYmVsKSB7Ci0JCQorCiAJCS8vIGluIG9yZGVyIHRvIGltcHJvdmUgZGVidWcgYXR0cmlidXRlcyBmb3Igc3RlcHBpbmcgKDExNDMxKQogCQkvLyB3ZSB3YW50IHRvIGlubGluZSB0aGUganVtcHMgdG8gI2JyZWFrTGFiZWwgd2hpY2ggYWxyZWFkeSBnb3QKIAkJLy8gZ2VuZXJhdGVkIChpZiBhbnkpLCBhbmQgaGF2ZSB0aGVtIGRpcmVjdGx5IGJyYW5jaCB0byBhIGJldHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKaW5kZXggNGJkNzgzNS4uYjJjNmRmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM3LDggKzM3LDggQEAKIAogCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CiAJdGhpcy5ibG9jayA9IHN0YXRlbWVudDsKLQlzb3VyY2VFbmQgPSBlOwotCXNvdXJjZVN0YXJ0ID0gczsKKwl0aGlzLnNvdXJjZUVuZCA9IGU7CisJdGhpcy5zb3VyY2VTdGFydCA9IHM7CiB9CiAKIHB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKQEAgLTQ5LDIyICs0OSwyMiBAQAogCXRoaXMucHJlU3luY2hyb25pemVkSW5pdFN0YXRlSW5kZXggPQogCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CiAgICAgLy8gVE9ETyAocGhpbGlwcGUpIHNob3VsZG4ndCBpdCBiZSBwcm90ZWN0ZWQgYnkgYSBjaGVjayB3aGV0aGVyIHJlYWNoYWJsZSBzdGF0ZW1lbnQgPwotICAgIAorCiAJLy8gbWFyayB0aGUgc3ludGhldGljIHZhcmlhYmxlIGFzIGJlaW5nIHVzZWQKLQlzeW5jaHJvVmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CisJdGhpcy5zeW5jaHJvVmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CiAKIAkvLyBzaW1wbGUgcHJvcGFnYXRpb24gdG8gc3Vibm9kZXMKIAlmbG93SW5mbyA9Ci0JCWJsb2NrLmFuYWx5c2VDb2RlKAotCQkJc2NvcGUsCisJCXRoaXMuYmxvY2suYW5hbHlzZUNvZGUoCisJCQl0aGlzLnNjb3BlLAogCQkJbmV3IEluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dChmbG93Q29udGV4dCwgdGhpcyksCi0JCQlleHByZXNzaW9uLmFuYWx5c2VDb2RlKHNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pKTsKKwkJCXRoaXMuZXhwcmVzc2lvbi5hbmFseXNlQ29kZSh0aGlzLnNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pKTsKIAogCXRoaXMubWVyZ2VkU3luY2hyb25pemVkSW5pdFN0YXRlSW5kZXggPQogCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CiAKIAkvLyBvcHRpbWl6aW5nIGNvZGUgZ2VuCi0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApIHsKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSB7CiAJCXRoaXMuYml0cyB8PSBBU1ROb2RlLkJsb2NrRXhpdDsKIAl9CiAKQEAgLTgyLDcgKzgyLDcgQEAKICAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKLQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZSkgPT0gMCkgeworCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKIAkJcmV0dXJuOwogCX0KIAkvLyBpbiBjYXNlIHRoZSBsYWJlbHMgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZApAQCAtOTIsNTcgKzkyLDYxIEBACiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAogCS8vIGdlbmVyYXRlIHRoZSBzeW5jaHJvbml6YXRpb24gZXhwcmVzc2lvbgotCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQlpZiAoYmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKLQkJaWYgKChzeW5jaHJvVmFyaWFibGUudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKQotCQkJfHwgKHN5bmNocm9WYXJpYWJsZS50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCWNvZGVTdHJlYW0uZHVwMigpOwotCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJfQorCXRoaXMuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJaWYgKHRoaXMuYmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKKwkJc3dpdGNoKHRoaXMuc3luY2hyb1ZhcmlhYmxlLnR5cGUuaWQpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJYnJlYWs7CisJCX0JCQogCQkvLyBvbmx5IHRha2UgdGhlIGxvY2sKIAkJY29kZVN0cmVhbS5tb25pdG9yZW50ZXIoKTsKIAkJY29kZVN0cmVhbS5tb25pdG9yZXhpdCgpOwotCQlpZiAoc2NvcGUgIT0gY3VycmVudFNjb3BlKSB7Ci0JCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUoc2NvcGUpOworCQlpZiAodGhpcy5zY29wZSAhPSBjdXJyZW50U2NvcGUpIHsKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8vIGVudGVyIHRoZSBtb25pdG9yCi0JCWNvZGVTdHJlYW0uc3RvcmUoc3luY2hyb1ZhcmlhYmxlLCB0cnVlKTsKKwkJY29kZVN0cmVhbS5zdG9yZSh0aGlzLnN5bmNocm9WYXJpYWJsZSwgdHJ1ZSk7CisJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5zeW5jaHJvVmFyaWFibGUpOwogCQljb2RlU3RyZWFtLm1vbml0b3JlbnRlcigpOwogCiAJCS8vIGdlbmVyYXRlICB0aGUgYm9keSBvZiB0aGUgc3luY2hyb25pemVkIGJsb2NrCi0JCXRoaXMuZW50ZXJBbnlFeGNlcHRpb25IYW5kbGVyKGNvZGVTdHJlYW0pOwotCQlibG9jay5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOwotCQlpZiAoc2NvcGUgIT0gY3VycmVudFNjb3BlKSB7CisJCWVudGVyQW55RXhjZXB0aW9uSGFuZGxlcihjb2RlU3RyZWFtKTsKKwkJdGhpcy5ibG9jay5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSwgY29kZVN0cmVhbSk7CisJCWlmICh0aGlzLnNjb3BlICE9IGN1cnJlbnRTY29wZSkgewogCQkJLy8gY2xvc2UgYWxsIGxvY2FscyBkZWZpbmVkIGluIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2sgZXhjZXB0IHRoZSBzZWNyZXQgbG9jYWwKLQkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZShzY29wZSwgc3luY2hyb1ZhcmlhYmxlKTsKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZSh0aGlzLnNjb3BlLCB0aGlzLnN5bmNocm9WYXJpYWJsZSk7CiAJCX0KIAogCQlCcmFuY2hMYWJlbCBlbmRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKIAkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkJsb2NrRXhpdCkgPT0gMCkgewotCQkJY29kZVN0cmVhbS5sb2FkKHN5bmNocm9WYXJpYWJsZSk7CisJCQljb2RlU3RyZWFtLmxvYWQodGhpcy5zeW5jaHJvVmFyaWFibGUpOwogCQkJY29kZVN0cmVhbS5tb25pdG9yZXhpdCgpOwotCQkJdGhpcy5leGl0QW55RXhjZXB0aW9uSGFuZGxlcigpOworCQkJZXhpdEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKIAkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwpOwotCQkJdGhpcy5lbnRlckFueUV4Y2VwdGlvbkhhbmRsZXIoY29kZVN0cmVhbSk7CisJCQllbnRlckFueUV4Y2VwdGlvbkhhbmRsZXIoY29kZVN0cmVhbSk7CiAJCX0KIAkJLy8gZ2VuZXJhdGUgdGhlIGJvZHkgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCi0JCWNvZGVTdHJlYW0ucHVzaE9uU3RhY2soc2NvcGUuZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSk7CisJCWNvZGVTdHJlYW0ucHVzaEV4Y2VwdGlvbk9uU3RhY2sodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKIAkJaWYgKHRoaXMucHJlU3luY2hyb25pemVkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVTeW5jaHJvbml6ZWRJbml0U3RhdGVJbmRleCk7CiAJCX0KLQkJdGhpcy5wbGFjZUFsbEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJY29kZVN0cmVhbS5sb2FkKHN5bmNocm9WYXJpYWJsZSk7CisJCXBsYWNlQWxsQW55RXhjZXB0aW9uSGFuZGxlcigpOworCQljb2RlU3RyZWFtLmxvYWQodGhpcy5zeW5jaHJvVmFyaWFibGUpOwogCQljb2RlU3RyZWFtLm1vbml0b3JleGl0KCk7Ci0JCXRoaXMuZXhpdEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKKwkJZXhpdEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKIAkJY29kZVN0cmVhbS5hdGhyb3coKTsKIAkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCiAJCWlmICh0aGlzLm1lcmdlZFN5bmNocm9uaXplZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkU3luY2hyb25pemVkSW5pdFN0YXRlSW5kZXgpOwogCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZFN5bmNocm9uaXplZEluaXRTdGF0ZUluZGV4KTsKIAkJfQotCQlpZiAoc2NvcGUgIT0gY3VycmVudFNjb3BlKSB7CisJCWlmICh0aGlzLnNjb3BlICE9IGN1cnJlbnRTY29wZSkgewogCQkJY29kZVN0cmVhbS5yZW1vdmVWYXJpYWJsZSh0aGlzLnN5bmNocm9WYXJpYWJsZSk7CiAJCX0KIAkJaWYgKCh0aGlzLmJpdHMgJiBBU1ROb2RlLkJsb2NrRXhpdCkgPT0gMCkgewpAQCAtMTY0LDggKzE2OCw4IEBACiAKIHB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSB1cHBlclNjb3BlKSB7CiAJLy8gc3BlY2lhbCBzY29wZSBmb3Igc2VjcmV0IGxvY2FscyBvcHRpbWl6YXRpb24uCi0Jc2NvcGUgPSBuZXcgQmxvY2tTY29wZSh1cHBlclNjb3BlKTsKLQlUeXBlQmluZGluZyB0eXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJdGhpcy5zY29wZSA9IG5ldyBCbG9ja1Njb3BlKHVwcGVyU2NvcGUpOworCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUodGhpcy5zY29wZSk7CiAJaWYgKHR5cGUgPT0gbnVsbCkKIAkJcmV0dXJuOwogCXN3aXRjaCAodHlwZS5pZCkgewpAQCAtMTc3LDM1ICsxODEsMzUgQEAKIAkJY2FzZSBUX3Nob3J0IDoKIAkJY2FzZSBUX2ludCA6CiAJCWNhc2UgVF9sb25nIDoKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlVG9TeW5jaHJvbml6ZShleHByZXNzaW9uLCB0eXBlKTsKKwkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGVUb1N5bmNocm9uaXplKHRoaXMuZXhwcmVzc2lvbiwgdHlwZSk7CiAJCQlicmVhazsKIAkJY2FzZSBUX3ZvaWQgOgotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFZvaWRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVm9pZEV4cHJlc3Npb24odGhpcy5leHByZXNzaW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIFRfbnVsbCA6Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkTnVsbFRvU3luY2hyb25pemUoZXhwcmVzc2lvbik7Ci0JCQlicmVhazsgCisJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWROdWxsVG9TeW5jaHJvbml6ZSh0aGlzLmV4cHJlc3Npb24pOworCQkJYnJlYWs7CiAJfQogCS8vY29udGludWUgZXZlbiBvbiBlcnJvcnMgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgVEMgZG9uZSBpbnRvIHRoZSBzdGF0ZW1lbnRzCi0Jc3luY2hyb1ZhcmlhYmxlID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKFNlY3JldExvY2FsRGVjbGFyYXRpb25OYW1lLCB0eXBlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCwgZmFsc2UpOwotCXNjb3BlLmFkZExvY2FsVmFyaWFibGUoc3luY2hyb1ZhcmlhYmxlKTsKLQlzeW5jaHJvVmFyaWFibGUuc2V0Q29uc3RhbnQoQ29uc3RhbnQuTm90QUNvbnN0YW50KTsgLy8gbm90IGlubGluYWJsZQotCWV4cHJlc3Npb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHR5cGUsIHR5cGUpOwotCWJsb2NrLnJlc29sdmVVc2luZyhzY29wZSk7CisJdGhpcy5zeW5jaHJvVmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoU2VjcmV0TG9jYWxEZWNsYXJhdGlvbk5hbWUsIHR5cGUsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0LCBmYWxzZSk7CisJdGhpcy5zY29wZS5hZGRMb2NhbFZhcmlhYmxlKHRoaXMuc3luY2hyb1ZhcmlhYmxlKTsKKwl0aGlzLnN5bmNocm9WYXJpYWJsZS5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOyAvLyBub3QgaW5saW5hYmxlCisJdGhpcy5leHByZXNzaW9uLmNvbXB1dGVDb252ZXJzaW9uKHRoaXMuc2NvcGUsIHR5cGUsIHR5cGUpOworCXRoaXMuYmxvY2sucmVzb2x2ZVVzaW5nKHRoaXMuc2NvcGUpOwogfQogCiBwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CiAJb3V0cHV0LmFwcGVuZCgic3luY2hyb25pemVkICgiKTsgLy8kTk9OLU5MUy0xJAotCWV4cHJlc3Npb24ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCkuYXBwZW5kKCcpJyk7CisJdGhpcy5leHByZXNzaW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnKScpOwogCW91dHB1dC5hcHBlbmQoJ1xuJyk7Ci0JcmV0dXJuIGJsb2NrLnByaW50U3RhdGVtZW50KGluZGVudCArIDEsIG91dHB1dCk7IAorCXJldHVybiB0aGlzLmJsb2NrLnByaW50U3RhdGVtZW50KGluZGVudCArIDEsIG91dHB1dCk7CiB9CiAKIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CiAJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKLQkJZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7Ci0JCWJsb2NrLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJdGhpcy5leHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOworCQl0aGlzLmJsb2NrLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCX0KIAl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaGlzUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YQppbmRleCA3ZWQyMWI3Li40NWI2NDQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwxOCArMjEsMTggQEAKIAogCXB1YmxpYyBzdGF0aWMgVGhpc1JlZmVyZW5jZSBpbXBsaWNpdFRoaXMoKXsKIAotCQlUaGlzUmVmZXJlbmNlIGltcGxpY2l0VGhpcyA9IG5ldyBUaGlzUmVmZXJlbmNlKDAsIDApOyAKKwkJVGhpc1JlZmVyZW5jZSBpbXBsaWNpdFRoaXMgPSBuZXcgVGhpc1JlZmVyZW5jZSgwLCAwKTsKIAkJaW1wbGljaXRUaGlzLmJpdHMgfD0gSXNJbXBsaWNpdFRoaXM7CiAJCXJldHVybiBpbXBsaWNpdFRoaXM7CiAJfQotCQkKKwogCXB1YmxpYyBUaGlzUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotCQorCiAJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKIAkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CiAJfQogCi0JLyogCisJLyoKIAkgKiBAc2VlIFJlZmVyZW5jZSNhbmFseXNlQXNzaWdubWVudCguLi4pCiAJICovCiAJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiBpc0NvbXBvdW5kKSB7CkBAIC00MSwxMyArNDEsMTMgQEAKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBjaGVja0FjY2VzcyhNZXRob2RTY29wZSBtZXRob2RTY29wZSkgewotCQorCiAJCS8vIHRoaXMvc3VwZXIgY2Fubm90IGJlIHVzZWQgaW4gY29uc3RydWN0b3IgY2FsbAogCQlpZiAobWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKIAkJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQorCiAJCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKIAkJaWYgKG1ldGhvZFNjb3BlLmlzU3RhdGljKSB7CiAJCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvclRoaXNTdXBlckluU3RhdGljKHRoaXMpOwpAQCAtNTYsNyArNTYsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKiAKKwkvKgogCSAqIEBzZWUgUmVmZXJlbmNlI2dlbmVyYXRlQXNzaWdubWVudCguLi4pCiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CkBAIC02NSw1MyArNjUsNTMgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCisKIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpCiAJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKIAkJaWYgKCh0aGlzLmJpdHMgJiBJc0ltcGxpY2l0VGhpcykgPT0gMCkgY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9CiAKLQkvKiAKKwkvKgogCSAqIEBzZWUgUmVmZXJlbmNlI2dlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KC4uLikKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sICBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAogCQkgLy8gdGhpcyBjYW5ub3QgYmUgYXNzaWduZWQKIAl9Ci0JCi0JLyogCisKKwkvKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2UjZ2VuZXJhdGVQb3N0SW5jcmVtZW50KCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCiAJCSAvLyB0aGlzIGNhbm5vdCBiZSBhc3NpZ25lZAogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUaGlzKCkgewotCQkKKwogCQlyZXR1cm4gKHRoaXMuYml0cyAmIElzSW1wbGljaXRUaGlzKSAhPSAwOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzVGhpcygpIHsKLQkJCisKIAkJcmV0dXJuIHRydWUgOwogCX0KIAogCXB1YmxpYyBpbnQgbnVsbFN0YXR1cyhGbG93SW5mbyBmbG93SW5mbykgewogCQlyZXR1cm4gRmxvd0luZm8uTk9OX05VTEw7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCl7Ci0JCi0JCWlmICh0aGlzLmlzSW1wbGljaXRUaGlzKCkpIHJldHVybiBvdXRwdXQ7CisKKwkJaWYgKGlzSW1wbGljaXRUaGlzKCkpIHJldHVybiBvdXRwdXQ7CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCJ0aGlzIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQotCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQkJaWYgKCF0aGlzLmlzSW1wbGljaXRUaGlzKCkgJiYhY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSkpIHsKKworCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQlpZiAoIWlzSW1wbGljaXRUaGlzKCkgJiYhY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpOwpAQCAtMTI3LDQgKzEyNywxMyBAQAogCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCWlmICghaXNJbXBsaWNpdFRoaXMoKSkgeworCQkJLy8gZXhwbGljaXQgdGhpcyByZWZlcmVuY2UsIG5vdCBhbGxvd2VkIGluIHN0YXRpYyBjb250ZXh0CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NzgwCisJCQljdXJyZW50U2NvcGUucmVzZXRFbmNsb3NpbmdNZXRob2RTdGF0aWNGbGFnKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Rocm93U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Rocm93U3RhdGVtZW50LmphdmEKaW5kZXggYjM1ZGY2Zi4uN2UzZDRjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaHJvd1N0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhyb3dTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw3ICsyMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogCiBwdWJsaWMgY2xhc3MgVGhyb3dTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJcHVibGljIEV4cHJlc3Npb24gZXhjZXB0aW9uOwogCXB1YmxpYyBUeXBlQmluZGluZyBleGNlcHRpb25UeXBlOwogCkBAIC0zMiw2ICszMiw3IEBACiAKIHB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAJdGhpcy5leGNlcHRpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCXRoaXMuZXhjZXB0aW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAkvLyBuZWVkIHRvIGNoZWNrIHRoYXQgZXhjZXB0aW9uIHRocm93biBpcyBhY3R1YWxseSBjYXVnaHQgc29tZXdoZXJlCiAJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyh0aGlzLmV4Y2VwdGlvblR5cGUsIHRoaXMsIGZsb3dJbmZvLCBjdXJyZW50U2NvcGUpOwogCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKQEAgLTY2LDcgKzY3LDcgQEAKIAkJCQkvLyBpZiBjb21wbGlhbnQgd2l0aCAxLjQsIHRoaXMgcHJvYmxlbSB3aWxsIG5vdCBiZSByZXBvcnRlZAogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFRocm93TnVsbCh0aGlzLmV4Y2VwdGlvbik7CiAJCQl9Ci0JIAl9IGVsc2UgaWYgKGV4Y2VwdGlvblR5cGUuZmluZFN1cGVyVHlwZUVyYXNpbmdUbyhUeXBlSWRzLlRfSmF2YUxhbmdUaHJvd2FibGUsIHRydWUpID09IG51bGwpIHsKKwkgCX0gZWxzZSBpZiAodGhpcy5leGNlcHRpb25UeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFMYW5nVGhyb3dhYmxlLCB0cnVlKSA9PSBudWxsKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RUaHJvd1R5cGUodGhpcy5leGNlcHRpb24sIHRoaXMuZXhjZXB0aW9uVHlwZSk7CiAJCX0KIAkJdGhpcy5leGNlcHRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHRoaXMuZXhjZXB0aW9uVHlwZSwgdGhpcy5leGNlcHRpb25UeXBlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ1ZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ1ZUxpdGVyYWwuamF2YQppbmRleCBhNDI3Y2ZjLi5kNjg1ZjgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RydWVMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnVlTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDcgKzE4LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgVHJ1ZUxpdGVyYWwgZXh0ZW5kcyBNYWdpY0xpdGVyYWwgeworCQogCXN0YXRpYyBmaW5hbCBjaGFyW10gc291cmNlID0geyd0JyAsICdyJyAsICd1JyAsICdlJ307CisJCiBwdWJsaWMgVHJ1ZUxpdGVyYWwoaW50IHMgLCBpbnQgZSkgewogCXN1cGVyKHMsZSk7CiB9CkBAIC0zMSwxMSArMzMsMTEgQEAKICAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCiAgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCiAgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCi0gKi8gCisgKi8KIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KQEAgLTU5LDcgKzYxLDcgQEAKIAlyZXR1cm4gVHlwZUJpbmRpbmcuQk9PTEVBTjsKIH0KIC8qKgotICogCisgKgogICovCiBwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKIAlyZXR1cm4gc291cmNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ5U3RhdGVtZW50LmphdmEKaW5kZXggODQ0NWZmMy4uNDE2NWI3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RyeVN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsOSArNywxMyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9ucyBmb3IKKyAqICAgICAJCQkJCQkJYnVnIDMzMjYzNyAtIERlYWQgQ29kZSBkZXRlY3Rpb24gcmVtb3ZpbmcgY29kZSB0aGF0IGlzbid0IGRlYWQKKyAqICAgICAJCQkJCQkJYnVnIDM1ODgyNyAtIFsxLjddIGV4Y2VwdGlvbiBhbmFseXNpcyBmb3IgdC13LXIgc3BvaWxzIG51bGwgYW5hbHlzaXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CkBAIC0xOCwxNiArMjIsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIHB1YmxpYyBjbGFzcyBUcnlTdGF0ZW1lbnQgZXh0ZW5kcyBTdWJSb3V0aW5lU3RhdGVtZW50IHsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VDUkVUX1JFVFVSTl9BRERSRVNTX05BTUUgPSAiIHJldHVybkFkZHJlc3MiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VDUkVUX0FOWV9IQU5ETEVSX05BTUUgPSAiIGFueUV4Y2VwdGlvbkhhbmRsZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VDUkVUX1JFVFVSTl9WQUxVRV9OQU1FID0gIiByZXR1cm5WYWx1ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCisJc3RhdGljIGZpbmFsIGNoYXJbXSBTRUNSRVRfUkVUVVJOX0FERFJFU1NfTkFNRSA9ICIgcmV0dXJuQWRkcmVzcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBjaGFyW10gU0VDUkVUX0FOWV9IQU5ETEVSX05BTUUgPSAiIGFueUV4Y2VwdGlvbkhhbmRsZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlzdGF0aWMgZmluYWwgY2hhcltdIFNFQ1JFVF9QUklNQVJZX0VYQ0VQVElPTl9WQVJJQUJMRV9OQU1FID0gIiBwcmltYXJ5RXhjZXB0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJc3RhdGljIGZpbmFsIGNoYXJbXSBTRUNSRVRfQ0FVR0hUX1RIUk9XQUJMRV9WQVJJQUJMRV9OQU1FID0gIiBjYXVnaHRUaHJvd2FibGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQ7CisJc3RhdGljIGZpbmFsIGNoYXJbXSBTRUNSRVRfUkVUVVJOX1ZBTFVFX05BTUUgPSAiIHJldHVyblZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBMb2NhbERlY2xhcmF0aW9uIFtdIE5PX1JFU09VUkNFUyA9IG5ldyBMb2NhbERlY2xhcmF0aW9uWzBdOworCXB1YmxpYyBMb2NhbERlY2xhcmF0aW9uW10gcmVzb3VyY2VzID0gTk9fUkVTT1VSQ0VTOworCiAJcHVibGljIEJsb2NrIHRyeUJsb2NrOwogCXB1YmxpYyBCbG9ja1tdIGNhdGNoQmxvY2tzOwogCiAJcHVibGljIEFyZ3VtZW50W10gY2F0Y2hBcmd1bWVudHM7Ci0JCisKIAkvLyBzaG91bGQgcmVuYW1lIGludG8gc3ViUm91dGluZUNvbXBsZXRlIHRvIGJlIHNldCB0byBmYWxzZSBieSBkZWZhdWx0CiAKIAlwdWJsaWMgQmxvY2sgZmluYWxseUJsb2NrOwpAQCAtMzYsMTIgKzQ1LDEyIEBACiAJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBzdWJSb3V0aW5lSW5pdHM7CiAJUmVmZXJlbmNlQmluZGluZ1tdIGNhdWdodEV4Y2VwdGlvblR5cGVzOwogCWJvb2xlYW5bXSBjYXRjaEV4aXRzOwotCQorCiAJQnJhbmNoTGFiZWwgc3ViUm91dGluZVN0YXJ0TGFiZWw7CiAJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGFueUV4Y2VwdGlvblZhcmlhYmxlLAogCQlyZXR1cm5BZGRyZXNzVmFyaWFibGUsCiAJCXNlY3JldFJldHVyblZhbHVlOwotCQorCiAJRXhjZXB0aW9uTGFiZWxbXSBkZWNsYXJlZEV4Y2VwdGlvbkxhYmVsczsgLy8gb25seSBzZXQgd2hpbGUgZ2VuZXJhdGluZyBjb2RlCiAKIAkvLyBmb3IgaW5saW5pbmcvb3B0aW1pemluZyBKU1IgaW5zdHJ1Y3Rpb25zCkBAIC01MCwyMCArNTksMjYgQEAKIAlwcml2YXRlIGludFtdIHJldXNhYmxlSlNSU3RhdGVJbmRleGVzOwogCXByaXZhdGUgaW50IHJldXNhYmxlSlNSVGFyZ2V0c0NvdW50ID0gMDsKIAotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBOT19GSU5BTExZID0gMDsJCQkJCQkJCQkJLy8gbm8gZmluYWxseSBibG9jawotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBGSU5BTExZX1NVQlJPVVRJTkUgPSAxOyAJCQkJCS8vIGZpbmFsbHkgaXMgZ2VuZXJhdGVkIGFzIGEgc3Vicm91dGluZSAodXNpbmcganNyL3JldCBieXRlY29kZXMpCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJTkFMTFlfRE9FU19OT1RfQ09NUExFVEUgPSAyOwkJLy8gbm9uIHJldHVybmluZyBmaW5hbGx5IGlzIG9wdGltaXplZCB3aXRoIG9ubHkgb25lIGluc3RhbmNlIG9mIGZpbmFsbHkgYmxvY2sKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRklOQUxMWV9JTkxJTkUgPSAzOwkJCQkJCQkJLy8gZmluYWxseSBibG9jayBtdXN0IGJlIGlubGluZWQgc2luY2UgY2Fubm90IHVzZSBqc3IvcmV0IGJ5dGVjb2RlcyA+MS41CQotCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19GSU5BTExZID0gMDsJCQkJCQkJCQkJLy8gbm8gZmluYWxseSBibG9jaworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5BTExZX1NVQlJPVVRJTkUgPSAxOyAJCQkJCS8vIGZpbmFsbHkgaXMgZ2VuZXJhdGVkIGFzIGEgc3Vicm91dGluZSAodXNpbmcganNyL3JldCBieXRlY29kZXMpCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkFMTFlfRE9FU19OT1RfQ09NUExFVEUgPSAyOwkJLy8gbm9uIHJldHVybmluZyBmaW5hbGx5IGlzIG9wdGltaXplZCB3aXRoIG9ubHkgb25lIGluc3RhbmNlIG9mIGZpbmFsbHkgYmxvY2sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxMWV9JTkxJTkUgPSAzOwkJCQkJCQkJLy8gZmluYWxseSBibG9jayBtdXN0IGJlIGlubGluZWQgc2luY2UgY2Fubm90IHVzZSBqc3IvcmV0IGJ5dGVjb2RlcyA+MS41CisKIAkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMKIAlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKIAlpbnQgcHJlVHJ5SW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgcG9zdFRyeUluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50W10gcG9zdFJlc291cmNlc0luaXRTdGF0ZUluZGV4ZXM7CiAJaW50IG5hdHVyYWxFeGl0TWVyZ2VJbml0U3RhdGVJbmRleCA9IC0xOwogCWludFtdIGNhdGNoRXhpdEluaXRTdGF0ZUluZGV4ZXM7CisJcHJpdmF0ZSBMb2NhbFZhcmlhYmxlQmluZGluZyBwcmltYXJ5RXhjZXB0aW9uVmFyaWFibGU7CisJcHJpdmF0ZSBMb2NhbFZhcmlhYmxlQmluZGluZyBjYXVnaHRUaHJvd2FibGVWYXJpYWJsZTsKKwlwcml2YXRlIEV4Y2VwdGlvbkxhYmVsW10gcmVzb3VyY2VFeGNlcHRpb25MYWJlbHM7CisJcHJpdmF0ZSBpbnRbXSBjYXVnaHRFeGNlcHRpb25zQ2F0Y2hCbG9ja3M7CiAKIHB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKLQkvLyBDb25zaWRlciB0aGUgdHJ5IGJsb2NrIGFuZCBjYXRjaCBibG9jayBzbyBhcyB0byBjb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgaW5pdGlhbGl6YXRpb25zIGFuZAkKKwkvLyBDb25zaWRlciB0aGUgdHJ5IGJsb2NrIGFuZCBjYXRjaCBibG9jayBzbyBhcyB0byBjb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgaW5pdGlhbGl6YXRpb25zIGFuZAogCS8vIHRoZSBtaW5pbXVtIGV4aXQgcmVsYXRpdmUgZGVwdGggYW1vbmdzdCBhbGwgb2YgdGhlbS4gVGhlbiBjb25zaWRlciB0aGUgc3Vicm91dGluZSwgYW5kIGFwcGVuZCBpdHMKIAkvLyBpbml0aWFsaXphdGlvbiB0byB0aGUgdHJ5L2NhdGNoIG9uZXMsIGlmIHRoZSBzdWJyb3V0aW5lIGNvbXBsZXRlcyBub3JtYWxseS4gSWYgdGhlIHN1YnJvdXRpbmUgZG9lcyBub3QKIAkvLyBjb21wbGV0ZSwgdGhlbiBvbmx5IGtlZXAgdGhpcyByZXN1bHQgZm9yIHRoZSByZXN0IG9mIHRoZSBhbmFseXNpcwpAQCAtNzYsOSArOTEsMjEgQEAKIAlpZiAodGhpcy5hbnlFeGNlcHRpb25WYXJpYWJsZSAhPSBudWxsKSB7CiAJCXRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CiAJfQorCWlmICh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSAhPSBudWxsKSB7CisJCXRoaXMucHJpbWFyeUV4Y2VwdGlvblZhcmlhYmxlLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCX0KKwlpZiAodGhpcy5jYXVnaHRUaHJvd2FibGVWYXJpYWJsZSAhPSBudWxsKSB7CisJCXRoaXMuY2F1Z2h0VGhyb3dhYmxlVmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CisJfQogCWlmICh0aGlzLnJldHVybkFkZHJlc3NWYXJpYWJsZSAhPSBudWxsKSB7IC8vIFRPRE8gKHBoaWxpcHBlKSBpZiBzdWJyb3V0aW5lIGlzIGVzY2FwaW5nLCB1bnVzZWQKIAkJdGhpcy5yZXR1cm5BZGRyZXNzVmFyaWFibGUudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CiAJfQorCWludCByZXNvdXJjZXNMZW5ndGggPSB0aGlzLnJlc291cmNlcy5sZW5ndGg7CisJaWYgKHJlc291cmNlc0xlbmd0aCA+IDApIHsKKwkJdGhpcy5wb3N0UmVzb3VyY2VzSW5pdFN0YXRlSW5kZXhlcyA9IG5ldyBpbnRbcmVzb3VyY2VzTGVuZ3RoXTsKKwl9CisKKwogCWlmICh0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsID09IG51bGwpIHsKIAkJLy8gbm8gZmluYWxseSBibG9jayAtLSB0aGlzIGlzIGEgc2ltcGxpZmllZCBjb3B5IG9mIHRoZSBlbHNlIHBhcnQKIAkJLy8gcHJvY2VzcyB0aGUgdHJ5IGJsb2NrIGluIGEgY29udGV4dCBoYW5kbGluZyB0aGUgbG9jYWwgZXhjZXB0aW9ucy4KQEAgLTg3LDYgKzExNCw5IEBACiAJCQkJZmxvd0NvbnRleHQsCiAJCQkJdGhpcywKIAkJCQl0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzLAorCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uc0NhdGNoQmxvY2tzLAorCQkJCXRoaXMuY2F0Y2hBcmd1bWVudHMsCisJCQkJbnVsbCwKIAkJCQl0aGlzLnNjb3BlLAogCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIAkJaGFuZGxpbmdDb250ZXh0LmluaXRzT25GaW5hbGx5ID0KQEAgLTk0LDE1ICsxMjQsMzMgQEAKIAkJLy8gb25seSB0cnkgYmxvY2tzIGluaXRpYWxpemUgdGhhdCBtZW1iZXIgLSBtYXkgY29uc2lkZXIgY3JlYXRpbmcgYQogCQkvLyBzZXBhcmF0ZSBjbGFzcyBpZiBuZWVkZWQKIAorCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlc0xlbmd0aDsgaSsrKSB7CisJCQlmbG93SW5mbyA9IHRoaXMucmVzb3VyY2VzW2ldLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgaGFuZGxpbmdDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOworCQkJdGhpcy5wb3N0UmVzb3VyY2VzSW5pdFN0YXRlSW5kZXhlc1tpXSA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKKwkJCXRoaXMucmVzb3VyY2VzW2ldLmJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7IC8vIElzIGltcGxpY2l0bHkgdXNlZCBhbnl3YXlzLgorCQkJVHlwZUJpbmRpbmcgdHlwZSA9IHRoaXMucmVzb3VyY2VzW2ldLmJpbmRpbmcudHlwZTsKKwkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGU7CisJCQkJTWV0aG9kQmluZGluZyBjbG9zZU1ldGhvZCA9IGJpbmRpbmcuZ2V0RXhhY3RNZXRob2QoQ29uc3RhbnRQb29sLkNsb3NlLCBuZXcgVHlwZUJpbmRpbmcgWzBdLCB0aGlzLnNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkpOyAvLyBzY29wZSBuZWVkcyB0byBiZSB0aWdodGVyCisJCQkJaWYgKGNsb3NlTWV0aG9kICE9IG51bGwgJiYgY2xvc2VNZXRob2QucmV0dXJuVHlwZS5pZCA9PSBUeXBlSWRzLlRfdm9pZCkgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duRXhjZXB0aW9ucyA9IGNsb3NlTWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CisJCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQloYW5kbGluZ0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyh0aHJvd25FeGNlcHRpb25zW2pdLCB0aGlzLnJlc291cmNlc1tpXSwgZmxvd0luZm8sIGN1cnJlbnRTY29wZSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KIAkJRmxvd0luZm8gdHJ5SW5mbzsKIAkJaWYgKHRoaXMudHJ5QmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKIAkJCXRyeUluZm8gPSBmbG93SW5mbzsKIAkJfSBlbHNlIHsKIAkJCXRyeUluZm8gPSB0aGlzLnRyeUJsb2NrLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgaGFuZGxpbmdDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOwotCQkJaWYgKCh0cnlJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkKKwkJCWlmICgodHJ5SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkKIAkJCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5Jc1RyeUJsb2NrRXhpdGluZzsKIAkJfQotCisJCWlmIChyZXNvdXJjZXNMZW5ndGggPiAwKSB7IAorCQkJdGhpcy5wb3N0VHJ5SW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyh0cnlJbmZvKTsKKwkJfQogCQkvLyBjaGVjayB1bnJlYWNoYWJsZSBjYXRjaCBibG9ja3MKIAkJaGFuZGxpbmdDb250ZXh0LmNvbXBsYWluSWZVbnVzZWRFeGNlcHRpb25IYW5kbGVycyh0aGlzLnNjb3BlLCB0aGlzKTsKIApAQCAtMTE0LDI5ICsxNjIsMjUgQEAKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0Y2hDb3VudDsgaSsrKSB7CiAJCQkJLy8ga2VlcCB0cmFjayBvZiB0aGUgaW5pdHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBoYXZlIGxlZCB0byB0aGlzIGV4Y2VwdGlvbiBoYW5kbGVyIChmb3IgZmluYWwgYXNzaWdubWVudHMgZGlhZ25vc2lzKQogCQkJCUZsb3dJbmZvIGNhdGNoSW5mbzsKLQkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXS5pc1VuY2hlY2tlZEV4Y2VwdGlvbih0cnVlKSkgeworCQkJCWlmIChpc1VuY2hlY2tlZENhdGNoQmxvY2soaSkpIHsKIAkJCQkJY2F0Y2hJbmZvID0KIAkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRmluYWxseS5taXRpZ2F0ZU51bGxJbmZvT2YoCiAJCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKLQkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKAotCQkJCQkJCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXNbaV0pKS4KKwkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKGkpKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlJbmZvKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKIAkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uUmV0dXJuKSk7CiAJCQkJfSBlbHNlIHsKKwkJCQkJRmxvd0luZm8gaW5pdHNPbkV4Y2VwdGlvbiA9IGhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKGkpOwogCQkJCQljYXRjaEluZm8gPQotCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKS4KLQkJCQkJCQlhZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKAotCQkJCQkJCQloYW5kbGluZ0NvbnRleHQuaW5pdHNPbkV4Y2VwdGlvbigKLQkJCQkJCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXNbaV0pKQorCQkJCQkJZmxvd0luZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKQorCQkJCQkJCS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGluaXRzT25FeGNlcHRpb24pCisJCQkJCQkJLmFkZE51bGxJbmZvRnJvbShpbml0c09uRXhjZXB0aW9uKQkvLyBudWxsIGluZm8gb25seSBmcm9tIGhlcmUsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGVudGVyIHRoZSBjYXRjaCBibG9jawogCQkJCQkJCS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKAotCQkJCQkJCQl0cnlJbmZvLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpCi0JCQkJCQkJCS8vIHJlbW92ZSBudWxsIGluZm8gdG8gcHJvdGVjdCBwb2ludCBvZiAKLQkJCQkJCQkJLy8gZXhjZXB0aW9uIG51bGwgaW5mbyAKKwkJCQkJCQkJCXRyeUluZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkKIAkJCQkJCQkuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKLQkJCQkJCQkJaGFuZGxpbmdDb250ZXh0LmluaXRzT25SZXR1cm4uCi0JCQkJCQkJCQludWxsSW5mb0xlc3NVbmNvbmRpdGlvbmFsQ29weSgpKTsKKwkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uUmV0dXJuLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpOwogCQkJCX0KIAogCQkJCS8vIGNhdGNoIHZhciBpcyBhbHdheXMgc2V0CkBAIC0xNDUsMTMgKzE4OSwxMyBAQAogCQkJCWNhdGNoSW5mby5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChjYXRjaEFyZyk7CiAJCQkJLyoKIAkJCQkiSWYgd2UgYXJlIGFib3V0IHRvIGNvbnNpZGVyIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gaGFuZGxlciwgcG90ZW50aWFsIGluaXRzIG1heSBoYXZlIG9jY3VyZWQgaW5zaWRlCi0JCQkJdGhlIHRyeSBibG9jayB0aGF0IG5lZWQgdG8gYmUgZGV0ZWN0ZWQgLCBlLmcuIAorCQkJCXRoZSB0cnkgYmxvY2sgdGhhdCBuZWVkIHRvIGJlIGRldGVjdGVkICwgZS5nLgogCQkJCXRyeSB7IHggPSAxOyB0aHJvd1NvbWV0aGluZygpO30gY2F0Y2goRXhjZXB0aW9uIGUpeyB4ID0gMn0gIgogCQkJCSIodW5jaGVja2VkRXhjZXB0aW9uVHlwZXMgbm90TmlsIGFuZDogW3VuY2hlY2tlZEV4Y2VwdGlvblR5cGVzIGF0OiBpbmRleF0pCiAJCQkJaWZUcnVlOiBbY2F0Y2hJbml0cyBhZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tOiB0cnlJbml0c10uIgogCQkJCSovCi0JCQkJaWYgKHRoaXMudHJ5QmxvY2suc3RhdGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCWNhdGNoSW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworCQkJCWlmICh0aGlzLnRyeUJsb2NrLnN0YXRlbWVudHMgPT0gbnVsbCAmJiB0aGlzLnJlc291cmNlcyA9PSBOT19SRVNPVVJDRVMpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDU3OQorCQkJCQljYXRjaEluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwogCQkJCX0KIAkJCQljYXRjaEluZm8gPQogCQkJCQl0aGlzLmNhdGNoQmxvY2tzW2ldLmFuYWx5c2VDb2RlKApAQCAtMTU5LDE5ICsyMDMsMTkgQEAKIAkJCQkJCWZsb3dDb250ZXh0LAogCQkJCQkJY2F0Y2hJbmZvKTsKIAkJCQl0aGlzLmNhdGNoRXhpdEluaXRTdGF0ZUluZGV4ZXNbaV0gPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhjYXRjaEluZm8pOwotCQkJCXRoaXMuY2F0Y2hFeGl0c1tpXSA9IAotCQkJCQkoY2F0Y2hJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMDsKKwkJCQl0aGlzLmNhdGNoRXhpdHNbaV0gPQorCQkJCQkoY2F0Y2hJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwOwogCQkJCXRyeUluZm8gPSB0cnlJbmZvLm1lcmdlZFdpdGgoY2F0Y2hJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIAkJCX0KIAkJfQogCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0KIAkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRyeUluZm8pOwotCQkKKwogCQkvLyBjaGFpbiB1cCBudWxsIGluZm8gcmVnaXN0cnkKIAkJaWYgKGZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5ICE9IG51bGwpIHsKIAkJCWZsb3dDb250ZXh0LmluaXRzT25GaW5hbGx5LmFkZChoYW5kbGluZ0NvbnRleHQuaW5pdHNPbkZpbmFsbHkpOwogCQl9Ci0JCQorCiAJCXJldHVybiB0cnlJbmZvOwogCX0gZWxzZSB7CiAJCUluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dCBpbnNpZGVTdWJDb250ZXh0OwpAQCAtMTk4LDIyICsyNDIsNDMgQEAKIAkJCQlpbnNpZGVTdWJDb250ZXh0LAogCQkJCXRoaXMsCiAJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlcywKKwkJCQl0aGlzLmNhdWdodEV4Y2VwdGlvbnNDYXRjaEJsb2NrcywKKwkJCQl0aGlzLmNhdGNoQXJndW1lbnRzLAorCQkJCW51bGwsCiAJCQkJdGhpcy5zY29wZSwKIAkJCQlmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiAJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRmluYWxseSA9CiAJCQluZXcgTnVsbEluZm9SZWdpc3RyeShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiAJCS8vIG9ubHkgdHJ5IGJsb2NrcyBpbml0aWFsaXplIHRoYXQgbWVtYmVyIC0gbWF5IGNvbnNpZGVyIGNyZWF0aW5nIGEKLQkJLy8gc2VwYXJhdGUgY2xhc3MgaWYgbmVlZGVkCQkKKwkJLy8gc2VwYXJhdGUgY2xhc3MgaWYgbmVlZGVkCiAKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXNMZW5ndGg7IGkrKykgeworCQkJZmxvd0luZm8gPSB0aGlzLnJlc291cmNlc1tpXS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGhhbmRsaW5nQ29udGV4dCwgZmxvd0luZm8uY29weSgpKTsKKwkJCXRoaXMucG9zdFJlc291cmNlc0luaXRTdGF0ZUluZGV4ZXNbaV0gPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisJCQl0aGlzLnJlc291cmNlc1tpXS5iaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOyAvLyBJcyBpbXBsaWNpdGx5IHVzZWQgYW55d2F5cy4KKwkJCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc291cmNlc1tpXS5iaW5kaW5nLnR5cGU7CisJCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlOworCQkJCU1ldGhvZEJpbmRpbmcgY2xvc2VNZXRob2QgPSBiaW5kaW5nLmdldEV4YWN0TWV0aG9kKENvbnN0YW50UG9vbC5DbG9zZSwgbmV3IFR5cGVCaW5kaW5nIFswXSwgdGhpcy5zY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpKTsgLy8gc2NvcGUgbmVlZHMgdG8gYmUgdGlnaHRlcgorCQkJCWlmIChjbG9zZU1ldGhvZCAhPSBudWxsICYmIGNsb3NlTWV0aG9kLnJldHVyblR5cGUuaWQgPT0gVHlwZUlkcy5UX3ZvaWQpIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnMgPSBjbG9zZU1ldGhvZC50aHJvd25FeGNlcHRpb25zOworCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJaGFuZGxpbmdDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnModGhyb3duRXhjZXB0aW9uc1tqXSwgdGhpcy5yZXNvdXJjZXNbaV0sIGZsb3dJbmZvLCBjdXJyZW50U2NvcGUsIHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAJCUZsb3dJbmZvIHRyeUluZm87CiAJCWlmICh0aGlzLnRyeUJsb2NrLmlzRW1wdHlCbG9jaygpKSB7CiAJCQl0cnlJbmZvID0gZmxvd0luZm87CiAJCX0gZWxzZSB7CiAJCQl0cnlJbmZvID0gdGhpcy50cnlCbG9jay5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGhhbmRsaW5nQ29udGV4dCwgZmxvd0luZm8uY29weSgpKTsKLQkJCWlmICgodHJ5SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApCisJCQlpZiAoKHRyeUluZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpICE9IDApCiAJCQkJdGhpcy5iaXRzIHw9IEFTVE5vZGUuSXNUcnlCbG9ja0V4aXRpbmc7CiAJCX0KLQorCQlpZiAocmVzb3VyY2VzTGVuZ3RoID4gMCkgeworCQkJdGhpcy5wb3N0VHJ5SW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyh0cnlJbmZvKTsKKwkJfQogCQkvLyBjaGVjayB1bnJlYWNoYWJsZSBjYXRjaCBibG9ja3MKIAkJaGFuZGxpbmdDb250ZXh0LmNvbXBsYWluSWZVbnVzZWRFeGNlcHRpb25IYW5kbGVycyh0aGlzLnNjb3BlLCB0aGlzKTsKIApAQCAtMjI1LDI5ICsyOTAsMjUgQEAKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0Y2hDb3VudDsgaSsrKSB7CiAJCQkJLy8ga2VlcCB0cmFjayBvZiB0aGUgaW5pdHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBoYXZlIGxlZCB0byB0aGlzIGV4Y2VwdGlvbiBoYW5kbGVyIChmb3IgZmluYWwgYXNzaWdubWVudHMgZGlhZ25vc2lzKQogCQkJCUZsb3dJbmZvIGNhdGNoSW5mbzsKLQkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXS5pc1VuY2hlY2tlZEV4Y2VwdGlvbih0cnVlKSkgeworCQkJCWlmIChpc1VuY2hlY2tlZENhdGNoQmxvY2soaSkpIHsKIAkJCQkJY2F0Y2hJbmZvID0KIAkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRmluYWxseS5taXRpZ2F0ZU51bGxJbmZvT2YoCiAJCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKLQkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKAotCQkJCQkJCQkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXNbaV0pKS4KKwkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKGkpKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlJbmZvKS4KIAkJCQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKIAkJCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uUmV0dXJuKSk7CiAJCQkJfWVsc2UgeworCQkJCQlGbG93SW5mbyBpbml0c09uRXhjZXB0aW9uID0gaGFuZGxpbmdDb250ZXh0LmluaXRzT25FeGNlcHRpb24oaSk7CiAJCQkJCWNhdGNoSW5mbyA9Ci0JCQkJCQlmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpCisJCQkJCQlmbG93SW5mby5udWxsSW5mb0xlc3NVbmNvbmRpdGlvbmFsQ29weSgpCisJCQkJCQkJLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5pdHNPbkV4Y2VwdGlvbikKKwkJCQkJCQkuYWRkTnVsbEluZm9Gcm9tKGluaXRzT25FeGNlcHRpb24pCS8vIG51bGwgaW5mbyBvbmx5IGZyb20gaGVyZSwgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZW50ZXIgdGhlIGNhdGNoIGJsb2NrCiAJCQkJCQkJLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oCi0JCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKAotCQkJCQkJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXSkpCi0JCQkJCQkJCQkuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKLQkJCQkJCQkJdHJ5SW5mby5udWxsSW5mb0xlc3NVbmNvbmRpdGlvbmFsQ29weSgpKQotCQkJCQkJCQkvLyByZW1vdmUgbnVsbCBpbmZvIHRvIHByb3RlY3QgcG9pbnQgb2YgCi0JCQkJCQkJCS8vIGV4Y2VwdGlvbiBudWxsIGluZm8gCisJCQkJCQkJCQl0cnlJbmZvLm51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpCiAJCQkJCQkJLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oCi0JCQkJCQkJCQloYW5kbGluZ0NvbnRleHQuaW5pdHNPblJldHVybi4KLQkJCQkJCQkJCW51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpOworCQkJCQkJCQkJaGFuZGxpbmdDb250ZXh0LmluaXRzT25SZXR1cm4ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSk7CiAJCQkJfQogCiAJCQkJLy8gY2F0Y2ggdmFyIGlzIGFsd2F5cyBzZXQKQEAgLTI1NiwxMyArMzE3LDEzIEBACiAJCQkJY2F0Y2hJbmZvLm1hcmtBc0RlZmluaXRlbHlOb25OdWxsKGNhdGNoQXJnKTsKIAkJCQkvKgogCQkJCSJJZiB3ZSBhcmUgYWJvdXQgdG8gY29uc2lkZXIgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBoYW5kbGVyLCBwb3RlbnRpYWwgaW5pdHMgbWF5IGhhdmUgb2NjdXJlZCBpbnNpZGUKLQkJCQl0aGUgdHJ5IGJsb2NrIHRoYXQgbmVlZCB0byBiZSBkZXRlY3RlZCAsIGUuZy4gCisJCQkJdGhlIHRyeSBibG9jayB0aGF0IG5lZWQgdG8gYmUgZGV0ZWN0ZWQgLCBlLmcuCiAJCQkJdHJ5IHsgeCA9IDE7IHRocm93U29tZXRoaW5nKCk7fSBjYXRjaChFeGNlcHRpb24gZSl7IHggPSAyfSAiCiAJCQkJIih1bmNoZWNrZWRFeGNlcHRpb25UeXBlcyBub3ROaWwgYW5kOiBbdW5jaGVja2VkRXhjZXB0aW9uVHlwZXMgYXQ6IGluZGV4XSkKIAkJCQlpZlRydWU6IFtjYXRjaEluaXRzIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb206IHRyeUluaXRzXS4iCiAJCQkJKi8KLQkJCQlpZiAodGhpcy50cnlCbG9jay5zdGF0ZW1lbnRzID09IG51bGwpIHsKLQkJCQkJY2F0Y2hJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQkJaWYgKHRoaXMudHJ5QmxvY2suc3RhdGVtZW50cyA9PSBudWxsICYmIHRoaXMucmVzb3VyY2VzID09IE5PX1JFU09VUkNFUykgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwNTc5CisJCQkJCWNhdGNoSW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCk7CiAJCQkJfQogCQkJCWNhdGNoSW5mbyA9CiAJCQkJCXRoaXMuY2F0Y2hCbG9ja3NbaV0uYW5hbHlzZUNvZGUoCkBAIC0yNzEsNyArMzMyLDcgQEAKIAkJCQkJCWNhdGNoSW5mbyk7CiAJCQkJdGhpcy5jYXRjaEV4aXRJbml0U3RhdGVJbmRleGVzW2ldID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoY2F0Y2hJbmZvKTsKIAkJCQl0aGlzLmNhdGNoRXhpdHNbaV0gPQotCQkJCQkoY2F0Y2hJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMDsKKwkJCQkJKGNhdGNoSW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMDsKIAkJCQl0cnlJbmZvID0gdHJ5SW5mby5tZXJnZWRXaXRoKGNhdGNoSW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CiAJCQl9CiAJCX0KQEAgLTI4Miw5ICszNDMsOSBAQAogCQkJCSh0cnlJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCA/CiAJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxDb3B5KCkuCiAJCQkJCWFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20odHJ5SW5mbykuCi0JCQkJCQkvLyBsaWdodGVuIHRoZSBpbmZsdWVuY2Ugb2YgdGhlIHRyeSBibG9jaywgd2hpY2ggbWF5IGhhdmUgCisJCQkJCQkvLyBsaWdodGVuIHRoZSBpbmZsdWVuY2Ugb2YgdGhlIHRyeSBibG9jaywgd2hpY2ggbWF5IGhhdmUKIAkJCQkJCS8vIGV4aXRlZCBhdCBhbnkgcG9pbnQKLQkJCQkJYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShpbnNpZGVTdWJDb250ZXh0LmluaXRzT25SZXR1cm4pIDogCisJCQkJCWFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5zaWRlU3ViQ29udGV4dC5pbml0c09uUmV0dXJuKSA6CiAJCQkJCWluc2lkZVN1YkNvbnRleHQuaW5pdHNPblJldHVybiksCiAJCQljdXJyZW50U2NvcGUpOwogCkBAIC0zMDcsNiArMzY4LDIwIEBACiAJCX0KIAl9CiB9CisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2F0Y2ggYmxvY2sgY29ycmVzcG9uZHMgdG8gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBtYWtpbmcgYWxsb3dhbmNlIGZvciBtdWx0aS1jYXRjaCBibG9ja3MuCitwcml2YXRlIGJvb2xlYW4gaXNVbmNoZWNrZWRDYXRjaEJsb2NrKGludCBjYXRjaEJsb2NrKSB7CisJaWYgKHRoaXMuY2F1Z2h0RXhjZXB0aW9uc0NhdGNoQmxvY2tzID09IG51bGwpIHsKKwkJcmV0dXJuIHRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXNbY2F0Y2hCbG9ja10uaXNVbmNoZWNrZWRFeGNlcHRpb24odHJ1ZSk7CisJfQorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmNhdWdodEV4Y2VwdGlvbnNDYXRjaEJsb2Nrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb25zQ2F0Y2hCbG9ja3NbaV0gPT0gY2F0Y2hCbG9jaykgeworCQkJaWYgKHRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXNbaV0uaXNVbmNoZWNrZWRFeGNlcHRpb24odHJ1ZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CiAKIHB1YmxpYyBFeGNlcHRpb25MYWJlbCBlbnRlckFueUV4Y2VwdGlvbkhhbmRsZXIoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJaWYgKHRoaXMuc3ViUm91dGluZVN0YXJ0TGFiZWwgPT0gbnVsbCkKQEAgLTMyNCw3ICszOTksNyBAQAogCWlmICh0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsID09IG51bGwpCiAJCXJldHVybjsKIAlzdXBlci5leGl0QW55RXhjZXB0aW9uSGFuZGxlcigpOwotfQkKK30KIAogcHVibGljIHZvaWQgZXhpdERlY2xhcmVkRXhjZXB0aW9uSGFuZGxlcnMoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZGVjbGFyZWRFeGNlcHRpb25MYWJlbHMgPT0gbnVsbCA/IDAgOiB0aGlzLmRlY2xhcmVkRXhjZXB0aW9uTGFiZWxzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0zMzcsMTEgKzQxMiwxMSBAQAogCQlyZXR1cm4gTk9fRklOQUxMWTsKIAl9IGVsc2UgaWYgKGlzU3ViUm91dGluZUVzY2FwaW5nKCkpIHsKIAkJcmV0dXJuIEZJTkFMTFlfRE9FU19OT1RfQ09NUExFVEU7Ci0JfSBlbHNlIGlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5pbmxpbmVKc3JCeXRlY29kZSkgeworCX0gZWxzZSBpZiAodGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5pbmxpbmVKc3JCeXRlY29kZSkgewogCQlyZXR1cm4gRklOQUxMWV9JTkxJTkU7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIEZJTkFMTFlfU1VCUk9VVElORTsKLQl9CQorCX0KIH0KIC8qKgogICogVHJ5IHN0YXRlbWVudCBjb2RlIGdlbmVyYXRpb24gd2l0aCBvciB3aXRob3V0IGpzciBieXRlY29kZSB1c2UKQEAgLTM2Miw3ICs0MzcsNyBAQAogCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpbnQgZmluYWxseU1vZGUgPSBmaW5hbGx5TW9kZSgpOwotCQorCiAJYm9vbGVhbiByZXF1aXJlc05hdHVyYWxFeGl0ID0gZmFsc2U7CiAJLy8gcHJlcGFyaW5nIGV4Y2VwdGlvbiBsYWJlbHMKIAlpbnQgbWF4Q2F0Y2hlcyA9IHRoaXMuY2F0Y2hBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aDsKQEAgLTM3MCw3ICs0NDUsMTUgQEAKIAlpZiAobWF4Q2F0Y2hlcyA+IDApIHsKIAkJZXhjZXB0aW9uTGFiZWxzID0gbmV3IEV4Y2VwdGlvbkxhYmVsW21heENhdGNoZXNdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENhdGNoZXM7IGkrKykgewotCQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uTGFiZWwgPSBuZXcgRXhjZXB0aW9uTGFiZWwoY29kZVN0cmVhbSwgdGhpcy5jYXRjaEFyZ3VtZW50c1tpXS5iaW5kaW5nLnR5cGUpOworCQkJQXJndW1lbnQgYXJndW1lbnQgPSB0aGlzLmNhdGNoQXJndW1lbnRzW2ldOworCQkJRXhjZXB0aW9uTGFiZWwgZXhjZXB0aW9uTGFiZWwgPSBudWxsOworCQkJaWYgKChhcmd1bWVudC5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLk11bHRpQ2F0Y2hQYXJhbWV0ZXIpICE9IDApIHsKKwkJCQlNdWx0aUNhdGNoRXhjZXB0aW9uTGFiZWwgbXVsdGlDYXRjaEV4Y2VwdGlvbkxhYmVsID0gbmV3IE11bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbChjb2RlU3RyZWFtLCBhcmd1bWVudC5iaW5kaW5nLnR5cGUpOworCQkJCW11bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbC5pbml0aWFsaXplKChVbmlvblR5cGVSZWZlcmVuY2UpIGFyZ3VtZW50LnR5cGUpOworCQkJCWV4Y2VwdGlvbkxhYmVsID0gbXVsdGlDYXRjaEV4Y2VwdGlvbkxhYmVsOworCQkJfSBlbHNlIHsKKwkJCQlleGNlcHRpb25MYWJlbCA9IG5ldyBFeGNlcHRpb25MYWJlbChjb2RlU3RyZWFtLCBhcmd1bWVudC5iaW5kaW5nLnR5cGUpOworCQkJfQogCQkJZXhjZXB0aW9uTGFiZWwucGxhY2VTdGFydCgpOwogCQkJZXhjZXB0aW9uTGFiZWxzW2ldID0gZXhjZXB0aW9uTGFiZWw7CiAJCX0KQEAgLTM3OSwxMiArNDYyLDEwNSBAQAogCX0KIAlpZiAodGhpcy5zdWJSb3V0aW5lU3RhcnRMYWJlbCAhPSBudWxsKSB7CiAJCXRoaXMuc3ViUm91dGluZVN0YXJ0TGFiZWwuaW5pdGlhbGl6ZShjb2RlU3RyZWFtKTsKLQkJdGhpcy5lbnRlckFueUV4Y2VwdGlvbkhhbmRsZXIoY29kZVN0cmVhbSk7CisJCWVudGVyQW55RXhjZXB0aW9uSGFuZGxlcihjb2RlU3RyZWFtKTsKIAl9CiAJLy8gZ2VuZXJhdGUgdGhlIHRyeSBibG9jawogCXRyeSB7CiAJCXRoaXMuZGVjbGFyZWRFeGNlcHRpb25MYWJlbHMgPSBleGNlcHRpb25MYWJlbHM7CisJCWludCByZXNvdXJjZUNvdW50ID0gdGhpcy5yZXNvdXJjZXMubGVuZ3RoOworCQlpZiAocmVzb3VyY2VDb3VudCA+IDApIHsKKwkJCS8vIFBsZWFzZSBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODQwMiNjMTYKKwkJCXRoaXMucmVzb3VyY2VFeGNlcHRpb25MYWJlbHMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbcmVzb3VyY2VDb3VudCArIDFdOworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJY29kZVN0cmVhbS5zdG9yZSh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSwgZmFsc2UgLyogdmFsdWUgbm90IHJlcXVpcmVkICovKTsKKwkJCWNvZGVTdHJlYW0uYWRkVmFyaWFibGUodGhpcy5wcmltYXJ5RXhjZXB0aW9uVmFyaWFibGUpOworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJY29kZVN0cmVhbS5zdG9yZSh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlLCBmYWxzZSAvKiB2YWx1ZSBub3QgcmVxdWlyZWQgKi8pOworCQkJY29kZVN0cmVhbS5hZGRWYXJpYWJsZSh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHJlc291cmNlQ291bnQ7IGkrKykgeworCQkJCS8vIHB1dCBudWxsIGZvciB0aGUgZXhjZXB0aW9uIHR5cGUgdG8gdHJlYXQgdGhlbSBhcyBhbnkgZXhjZXB0aW9uIGhhbmRsZXJzIChlcXVpdmFsZW50IHRvIGEgdHJ5L2ZpbmFsbHkpCisJCQkJdGhpcy5yZXNvdXJjZUV4Y2VwdGlvbkxhYmVsc1tpXSA9IG5ldyBFeGNlcHRpb25MYWJlbChjb2RlU3RyZWFtLCBudWxsKTsKKwkJCQl0aGlzLnJlc291cmNlRXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlU3RhcnQoKTsKKwkJCQlpZiAoaSA8IHJlc291cmNlQ291bnQpIHsKKwkJCQkJdGhpcy5yZXNvdXJjZXNbaV0uZ2VuZXJhdGVDb2RlKHRoaXMuc2NvcGUsIGNvZGVTdHJlYW0pOyAvLyBJbml0aWFsaXplIHJlc291cmNlcyAuLi4KKwkJCQl9CisJCQl9CisJCX0KIAkJdGhpcy50cnlCbG9jay5nZW5lcmF0ZUNvZGUodGhpcy5zY29wZSwgY29kZVN0cmVhbSk7CisJCWlmIChyZXNvdXJjZUNvdW50ID4gMCkgeworCQkJZm9yIChpbnQgaSA9IHJlc291cmNlQ291bnQ7IGkgPj0gMDsgaS0tKSB7CisJCQkJQnJhbmNoTGFiZWwgZXhpdExhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCQkJCXRoaXMucmVzb3VyY2VFeGNlcHRpb25MYWJlbHNbaV0ucGxhY2VFbmQoKTsgLy8gb3V0ZXIgaGFuZGxlciBpZiBhbnkgaXMgdGhlIG9uZSB0aGF0IHNob3VsZCBjYXRjaCBleGNlcHRpb25zIG91dCBvZiBjbG9zZSgpCisJCQkJCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGkgPiAwID8gdGhpcy5yZXNvdXJjZXNbaS0xXS5iaW5kaW5nIDogbnVsbDsKKwkJCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNUcnlCbG9ja0V4aXRpbmcpID09IDApIHsKKwkJCQkJLy8gaW5saW5lIHJlc291cmNlIGNsb3N1cmUKKwkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQlpbnQgaW52b2tlQ2xvc2VTdGFydFBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Mzc4NQorCQkJCQkJaWYgKHRoaXMucG9zdFRyeUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCQkJLyogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2MTA1Mywgd2UgYXJlIGp1c3QgcGFzdCBhIHN5bnRoZXRpYyBpbnN0YW5jZSBvZiB0cnktY2F0Y2gtZmluYWxseS4KKwkJCQkJCQkgICBPdXIgaW5pdGlhbGl6YXRpb24gdHlwZSBzdGF0ZSBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgYXQgdGhlIGVuZCBvZiB0aGUganVzdCBjb25jbHVkZWQgdHJ5IChjYXRjaCByZXRocm93cykKKwkJCQkJCQkqLworCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wb3N0VHJ5SW5pdFN0YXRlSW5kZXgpOworCQkJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wb3N0VHJ5SW5pdFN0YXRlSW5kZXgpOworCQkJCQkJfQorCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsVmFyaWFibGUpOworCQkJCQkJY29kZVN0cmVhbS5pZm51bGwoZXhpdExhYmVsKTsKKwkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbFZhcmlhYmxlKTsKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlQXV0b0Nsb3NlYWJsZUNsb3NlKGxvY2FsVmFyaWFibGUudHlwZSk7CisJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oaW52b2tlQ2xvc2VTdGFydFBjLCB0aGlzLnRyeUJsb2NrLnNvdXJjZUVuZCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5nb3RvXyhleGl0TGFiZWwpOyAvLyBza2lwIG92ZXIgdGhlIGNhdGNoIGJsb2NrLgorCQkJCX0KKworCQkJCWlmIChpID4gMCkgeworCQkJCQkvLyBpIGlzIG9mZiBieSBvbmUKKwkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnBvc3RSZXNvdXJjZXNJbml0U3RhdGVJbmRleGVzW2kgLSAxXSk7CisJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wb3N0UmVzb3VyY2VzSW5pdFN0YXRlSW5kZXhlc1tpIC0gMV0pOworCQkJCX0KKworCQkJCWNvZGVTdHJlYW0ucHVzaEV4Y2VwdGlvbk9uU3RhY2sodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKKwkJCQl0aGlzLnJlc291cmNlRXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlKCk7CisJCQkJaWYgKGkgPT0gcmVzb3VyY2VDb3VudCkgeyAKKwkJCQkJLy8gaW5uZXIgbW9zdCB0cnkncyBjYXRjaC9maW5hbGx5IGNhbiBiZSBhIGxvdCBzaW1wbGVyLiAKKwkJCQkJY29kZVN0cmVhbS5zdG9yZSh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSwgZmFsc2UpOworCQkJCQkvLyBmYWxsIHRocm91Z2gsIGludm9rZSBjbG9zZSgpIGFuZCByZS10aHJvdy4KKwkJCQl9IGVsc2UgeworCQkJCQlCcmFuY2hMYWJlbCBlbHNlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSksIHBvc3RFbHNlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7CisJCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5jYXVnaHRUaHJvd2FibGVWYXJpYWJsZSwgZmFsc2UpOworCQkJCQljb2RlU3RyZWFtLmxvYWQodGhpcy5wcmltYXJ5RXhjZXB0aW9uVmFyaWFibGUpOworCQkJCQljb2RlU3RyZWFtLmlmbm9ubnVsbChlbHNlTGFiZWwpOworCQkJCQljb2RlU3RyZWFtLmxvYWQodGhpcy5jYXVnaHRUaHJvd2FibGVWYXJpYWJsZSk7CisJCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5wcmltYXJ5RXhjZXB0aW9uVmFyaWFibGUsIGZhbHNlKTsKKwkJCQkJY29kZVN0cmVhbS5nb3RvXyhwb3N0RWxzZUxhYmVsKTsKKwkJCQkJZWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZCh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZCh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlKTsKKwkJCQkJY29kZVN0cmVhbS5pZl9hY21wZXEocG9zdEVsc2VMYWJlbCk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZCh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZCh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlKTsKKwkJCQkJY29kZVN0cmVhbS5pbnZva2VUaHJvd2FibGVBZGRTdXBwcmVzc2VkKCk7CisJCQkJCXBvc3RFbHNlTGFiZWwucGxhY2UoKTsKKwkJCQl9CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCS8vIGlubGluZSByZXNvdXJjZSBjbG9zZSBoZXJlIHJhdGhlciB0aGFuIGJyYWNrZXRpbmcgdGhlIGN1cnJlbnQgY2F0Y2ggYmxvY2sgd2l0aCBhIHRyeSByZWdpb24uCisJCQkJCUJyYW5jaExhYmVsIHBvc3RDbG9zZUxhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCQkJCQlpbnQgaW52b2tlQ2xvc2VTdGFydFBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0Mzc4NQkJCQorCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxWYXJpYWJsZSk7CisJCQkJCWNvZGVTdHJlYW0uaWZudWxsKHBvc3RDbG9zZUxhYmVsKTsKKwkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsVmFyaWFibGUpOworCQkJCQljb2RlU3RyZWFtLmludm9rZUF1dG9DbG9zZWFibGVDbG9zZShsb2NhbFZhcmlhYmxlLnR5cGUpOworCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oaW52b2tlQ2xvc2VTdGFydFBjLCB0aGlzLnRyeUJsb2NrLnNvdXJjZUVuZCk7CisJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlVmFyaWFibGUobG9jYWxWYXJpYWJsZSk7CisJCQkJCXBvc3RDbG9zZUxhYmVsLnBsYWNlKCk7CisJCQkJfQorCQkJCWNvZGVTdHJlYW0ubG9hZCh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCQkJY29kZVN0cmVhbS5hdGhyb3coKTsKKwkJCQlleGl0TGFiZWwucGxhY2UoKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0ucmVtb3ZlVmFyaWFibGUodGhpcy5wcmltYXJ5RXhjZXB0aW9uVmFyaWFibGUpOworCQkJY29kZVN0cmVhbS5yZW1vdmVWYXJpYWJsZSh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlKTsKKwkJfQogCX0gZmluYWxseSB7CiAJCXRoaXMuZGVjbGFyZWRFeGNlcHRpb25MYWJlbHMgPSBudWxsOwogCX0KQEAgLTM5NSw3ICs1NzEsNyBAQAogCWlmICh0cnlCbG9ja0hhc1NvbWVDb2RlKSB7CiAJCS8vIG5hdHVyYWwgZXhpdCBtYXkgcmVxdWlyZSBzdWJyb3V0aW5lIGludm9jYXRpb24gKGlmIGZpbmFsbHkgIT0gbnVsbCkKIAkJQnJhbmNoTGFiZWwgbmF0dXJhbEV4aXRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKLQkJQnJhbmNoTGFiZWwgcG9zdENhdGNoZXNGaW5hbGx5TGFiZWwgPSBudWxsOwkJCisJCUJyYW5jaExhYmVsIHBvc3RDYXRjaGVzRmluYWxseUxhYmVsID0gbnVsbDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhDYXRjaGVzOyBpKyspIHsKIAkJCWV4Y2VwdGlvbkxhYmVsc1tpXS5wbGFjZUVuZCgpOwogCQl9CkBAIC00MjksMTggKzYwNSwyNCBAQAogCQl0aHJvd24pIGludG8gdGhlaXIgb3duIGNhdGNoIHZhcmlhYmxlcywgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZQogCQl0aGF0IG11c3QgZGVub3RlIHRoZSBoYW5kbGVkIGV4Y2VwdGlvbi4KIAkJKi8KLQkJdGhpcy5leGl0QW55RXhjZXB0aW9uSGFuZGxlcigpOworCQlleGl0QW55RXhjZXB0aW9uSGFuZGxlcigpOwogCQlpZiAodGhpcy5jYXRjaEFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlwb3N0Q2F0Y2hlc0ZpbmFsbHlMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbChjb2RlU3RyZWFtKTsKLQkJCQorCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENhdGNoZXM7IGkrKykgeworCQkJCS8qCisJCQkJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2UsIGlmIHRoZSBleGNlcHRpb24gbGFiZWwgaXMgbmV2ZXIgdXNlZAorCQkJCSAqIHdlIGFsc28gZG9uJ3QgZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgY2F0Y2ggYmxvY2ssIG90aGVyd2lzZSB3ZSBoYXZlIHNvbWUKKwkJCQkgKiB1bnJlYWNoYWJsZSBieXRlY29kZXMKKwkJCQkgKi8KKwkJCQlpZiAoZXhjZXB0aW9uTGFiZWxzW2ldLmdldENvdW50KCkgPT0gMCkgY29udGludWU7CiAJCQkJZW50ZXJBbnlFeGNlcHRpb25IYW5kbGVyKGNvZGVTdHJlYW0pOwogCQkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwogCQkJCWlmICh0aGlzLnByZVRyeUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVUcnlJbml0U3RhdGVJbmRleCk7CiAJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5wcmVUcnlJbml0U3RhdGVJbmRleCk7CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucHVzaE9uU3RhY2soZXhjZXB0aW9uTGFiZWxzW2ldLmV4Y2VwdGlvblR5cGUpOworCQkJCWNvZGVTdHJlYW0ucHVzaEV4Y2VwdGlvbk9uU3RhY2soZXhjZXB0aW9uTGFiZWxzW2ldLmV4Y2VwdGlvblR5cGUpOwogCQkJCWV4Y2VwdGlvbkxhYmVsc1tpXS5wbGFjZSgpOwogCQkJCS8vIG9wdGltaXppbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4Y2VwdGlvbiB2YXJpYWJsZSBpcyBub3QgYWN0dWFsbHkgdXNlZAogCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGNhdGNoVmFyOwpAQCAtNDU2LDE0ICs2MzgsMTQgQEAKIAkJCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBwY3MgYXQgZGl2ZXJnaW5nIHBvaW50IGZvciBjb21wdXRpbmcgdGhlIGxvY2FsIGF0dHJpYnV0ZQogCQkJCS8vIHNpbmNlIG5vdCBwYXNzaW5nIHRoZSBjYXRjaFNjb3BlLCB0aGUgYmxvY2sgZ2VuZXJhdGlvbiB3aWxsIGV4aXRVc2VyU2NvcGUoY2F0Y2hTY29wZSkKIAkJCQl0aGlzLmNhdGNoQmxvY2tzW2ldLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKLQkJCQl0aGlzLmV4aXRBbnlFeGNlcHRpb25IYW5kbGVyKCk7CisJCQkJZXhpdEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKIAkJCQlpZiAoIXRoaXMuY2F0Y2hFeGl0c1tpXSkgewogCQkJCQlzd2l0Y2goZmluYWxseU1vZGUpIHsKIAkJCQkJCWNhc2UgRklOQUxMWV9JTkxJTkUgOgogCQkJCQkJCS8vIGlubGluZWQgZmluYWxseSBoZXJlIGNhbiBzZWUgYWxsIG1lcmdlZCB2YXJpYWJsZXMKIAkJCQkJCQlpZiAoaXNTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgewogCQkJCQkJCQkoKFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5wdXNoU3RhdGVJbmRleCh0aGlzLm5hdHVyYWxFeGl0TWVyZ2VJbml0U3RhdGVJbmRleCk7Ci0JCQkJCQkJfQkJCQkJCQkKKwkJCQkJCQl9CiAJCQkJCQkJaWYgKHRoaXMuY2F0Y2hFeGl0SW5pdFN0YXRlSW5kZXhlc1tpXSAhPSAtMSkgewogCQkJCQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMuY2F0Y2hFeGl0SW5pdFN0YXRlSW5kZXhlc1tpXSk7CiAJCQkJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5jYXRjaEV4aXRJbml0U3RhdGVJbmRleGVzW2ldKTsKQEAgLTQ3Nyw3ICs2NTksNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBGSU5BTExZX1NVQlJPVVRJTkUgOgogCQkJCQkJCXJlcXVpcmVzTmF0dXJhbEV4aXQgPSB0cnVlOwotCQkJCQkJCS8vIGZhbGwgdGhyb3VnaAorCQkJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJCWNhc2UgTk9fRklOQUxMWSA6CiAJCQkJCQkJaWYgKHRoaXMubmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhpcy5uYXR1cmFsRXhpdE1lcmdlSW5pdFN0YXRlSW5kZXgpOwpAQCAtNDkzLDM2ICs2NzUsMzYgQEAKIAkJCX0KIAkJfQogCQkvLyBleHRyYSBoYW5kbGVyIGZvciB0cmFpbGluZyBuYXR1cmFsIGV4aXQgKHdpbGwgYmUgZml4ZWQgdXAgbGF0ZXIgb24gd2hlbiBuYXR1cmFsIGV4aXQgaXMgZ2VuZXJhdGVkIGJlbG93KQotCQlFeGNlcHRpb25MYWJlbCBuYXR1cmFsRXhpdEV4Y2VwdGlvbkhhbmRsZXIgPSByZXF1aXJlc05hdHVyYWxFeGl0ICYmIChmaW5hbGx5TW9kZSA9PSBGSU5BTExZX1NVQlJPVVRJTkUpIAotCQkJCQk/IG5ldyBFeGNlcHRpb25MYWJlbChjb2RlU3RyZWFtLCBudWxsKSAKKwkJRXhjZXB0aW9uTGFiZWwgbmF0dXJhbEV4aXRFeGNlcHRpb25IYW5kbGVyID0gcmVxdWlyZXNOYXR1cmFsRXhpdCAmJiAoZmluYWxseU1vZGUgPT0gRklOQUxMWV9TVUJST1VUSU5FKQorCQkJCQk/IG5ldyBFeGNlcHRpb25MYWJlbChjb2RlU3RyZWFtLCBudWxsKQogCQkJCQk6IG51bGw7CiAKIAkJLy8gYWRkaXRpb24gb2YgYSBzcGVjaWFsIGhhbmRsZXIgc28gYXMgdG8gZW5zdXJlIHRoYXQgYW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiAob3IgZXhjZXB0aW9uIHRocm93bgogCQkvLyBpbnNpZGUgY2F0Y2ggYmxvY2tzKSB3aWxsIHJ1biB0aGUgZmluYWxseSBibG9jawogCQlpbnQgZmluYWxseVNlcXVlbmNlU3RhcnRQQyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmICh0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsICE9IG51bGwpIHsKLQkJCWNvZGVTdHJlYW0ucHVzaE9uU3RhY2sodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKKwkJaWYgKHRoaXMuc3ViUm91dGluZVN0YXJ0TGFiZWwgIT0gbnVsbCAmJiB0aGlzLmFueUV4Y2VwdGlvbkxhYmVsLmdldENvdW50KCkgIT0gMCkgeworCQkJY29kZVN0cmVhbS5wdXNoRXhjZXB0aW9uT25TdGFjayh0aGlzLnNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCkpOwogCQkJaWYgKHRoaXMucHJlVHJ5SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQkvLyByZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSwgYXMgZm9yIGEgbm9ybWFsIGNhdGNoIGJsb2NrCiAJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZVRyeUluaXRTdGF0ZUluZGV4KTsKIAkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMucHJlVHJ5SW5pdFN0YXRlSW5kZXgpOwogCQkJfQotCQkJdGhpcy5wbGFjZUFsbEFueUV4Y2VwdGlvbkhhbmRsZXIoKTsKKwkJCXBsYWNlQWxsQW55RXhjZXB0aW9uSGFuZGxlcigpOwogCQkJaWYgKG5hdHVyYWxFeGl0RXhjZXB0aW9uSGFuZGxlciAhPSBudWxsKSBuYXR1cmFsRXhpdEV4Y2VwdGlvbkhhbmRsZXIucGxhY2UoKTsKLQkJCQorCiAJCQlzd2l0Y2goZmluYWxseU1vZGUpIHsKIAkJCQljYXNlIEZJTkFMTFlfU1VCUk9VVElORSA6CiAJCQkJCS8vIGFueSBleGNlcHRpb24gaGFuZGxlcgogCQkJCQljb2RlU3RyZWFtLnN0b3JlKHRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUsIGZhbHNlKTsKIAkJCQkJY29kZVN0cmVhbS5qc3IodGhpcy5zdWJSb3V0aW5lU3RhcnRMYWJlbCk7CiAJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShmaW5hbGx5U2VxdWVuY2VTdGFydFBDLCB0aGlzLmZpbmFsbHlCbG9jay5zb3VyY2VTdGFydCk7Ci0JCQkJCWludCBwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CQkJCQkJCisJCQkJCWludCBwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCQkJCWNvZGVTdHJlYW0udGhyb3dBbnlFeGNlcHRpb24odGhpcy5hbnlFeGNlcHRpb25WYXJpYWJsZSk7CiAJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwb3NpdGlvbiwgdGhpcy5maW5hbGx5QmxvY2suc291cmNlRW5kKTsKIAkJCQkJLy8gc3Vicm91dGluZQogCQkJCQl0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsLnBsYWNlKCk7Ci0JCQkJCWNvZGVTdHJlYW0ucHVzaE9uU3RhY2sodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKLQkJCQkJcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwkKKwkJCQkJY29kZVN0cmVhbS5wdXNoRXhjZXB0aW9uT25TdGFjayh0aGlzLnNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCkpOworCQkJCQlwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCQkJCWNvZGVTdHJlYW0uc3RvcmUodGhpcy5yZXR1cm5BZGRyZXNzVmFyaWFibGUsIGZhbHNlKTsKIAkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBvc2l0aW9uLCB0aGlzLmZpbmFsbHlCbG9jay5zb3VyY2VTdGFydCk7CiAJCQkJCXRoaXMuZmluYWxseUJsb2NrLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKQEAgLTUzNiwxMSArNzE4LDEzIEBACiAJCQkJY2FzZSBGSU5BTExZX0lOTElORSA6CiAJCQkJCS8vIGFueSBleGNlcHRpb24gaGFuZGxlcgogCQkJCQljb2RlU3RyZWFtLnN0b3JlKHRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUsIGZhbHNlKTsKKwkJCQkJY29kZVN0cmVhbS5hZGRWYXJpYWJsZSh0aGlzLmFueUV4Y2VwdGlvblZhcmlhYmxlKTsKIAkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGZpbmFsbHlTZXF1ZW5jZVN0YXJ0UEMsIHRoaXMuZmluYWxseUJsb2NrLnNvdXJjZVN0YXJ0KTsKIAkJCQkJLy8gc3Vicm91dGluZQogCQkJCQl0aGlzLmZpbmFsbHlCbG9jay5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCQkJcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQkJCQljb2RlU3RyZWFtLnRocm93QW55RXhjZXB0aW9uKHRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUpOworCQkJCQljb2RlU3RyZWFtLnJlbW92ZVZhcmlhYmxlKHRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUpOwogCQkJCQlpZiAodGhpcy5wcmVUcnlJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZVRyeUluaXRTdGF0ZUluZGV4KTsKIAkJCQkJfQpAQCAtNTU2LDcgKzc0MCw3IEBACiAJCQkJCXRoaXMuZmluYWxseUJsb2NrLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCQkJYnJlYWs7CiAJCQl9Ci0JCQkKKwogCQkJLy8gd2lsbCBuYXR1cmFsbHkgZmFsbCBpbnRvIHN1YnNlcXVlbnQgY29kZSBhZnRlciBzdWJyb3V0aW5lIGludm9jYXRpb24KIAkJCWlmIChyZXF1aXJlc05hdHVyYWxFeGl0KSB7CiAJCQkJc3dpdGNoKGZpbmFsbHlNb2RlKSB7CkBAIC02MjcsNiArODExLDI3IEBACiAgKi8KIHB1YmxpYyBib29sZWFuIGdlbmVyYXRlU3ViUm91dGluZUludm9jYXRpb24oQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgT2JqZWN0IHRhcmdldExvY2F0aW9uLCBpbnQgc3RhdGVJbmRleCwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgc2VjcmV0TG9jYWwpIHsKIAorCWludCByZXNvdXJjZUNvdW50ID0gdGhpcy5yZXNvdXJjZXMubGVuZ3RoOworCWlmIChyZXNvdXJjZUNvdW50ID4gMCkgeworCQlmb3IgKGludCBpID0gcmVzb3VyY2VDb3VudDsgaSA+IDA7IC0taSkgeworCQkJLy8gRGlzYXJtIHRoZSBoYW5kbGVycyBhbmQgdGFrZSBjYXJlIG9mIHJlc291cmNlIGNsb3N1cmUuCisJCQl0aGlzLnJlc291cmNlRXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlRW5kKCk7CisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gdGhpcy5yZXNvdXJjZXNbaS0xXS5iaW5kaW5nOworCQkJQnJhbmNoTGFiZWwgZXhpdExhYmVsID0gbmV3IEJyYW5jaExhYmVsKGNvZGVTdHJlYW0pOworCQkJaW50IGludm9rZUNsb3NlU3RhcnRQYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM3ODUKKwkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbFZhcmlhYmxlKTsKKwkJCWNvZGVTdHJlYW0uaWZudWxsKGV4aXRMYWJlbCk7CisJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxWYXJpYWJsZSk7CisJCQljb2RlU3RyZWFtLmludm9rZUF1dG9DbG9zZWFibGVDbG9zZShsb2NhbFZhcmlhYmxlLnR5cGUpOworCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGludm9rZUNsb3NlU3RhcnRQYywgdGhpcy50cnlCbG9jay5zb3VyY2VFbmQpOworCQkJZXhpdExhYmVsLnBsYWNlKCk7CisJCX0KKwkJLy8gUmVpbnN0YWxsIGhhbmRsZXJzCisJCWZvciAoaW50IGkgPSByZXNvdXJjZUNvdW50OyBpID4gMDsgLS1pKSB7CisJCQl0aGlzLnJlc291cmNlRXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlU3RhcnQoKTsKKwkJfQorCX0KKwogCWJvb2xlYW4gaXNTdGFja01hcEZyYW1lQ29kZVN0cmVhbSA9IGNvZGVTdHJlYW0gaW5zdGFuY2VvZiBTdGFja01hcEZyYW1lQ29kZVN0cmVhbTsKIAlpbnQgZmluYWxseU1vZGUgPSBmaW5hbGx5TW9kZSgpOwogCXN3aXRjaChmaW5hbGx5TW9kZSkgewpAQCAtNjQ1LDkgKzg1MCw5IEBACiAJCQluZXh0UmV1c2FibGVUYXJnZXQ6IGZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRoaXMucmV1c2FibGVKU1JUYXJnZXRzQ291bnQ7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJT2JqZWN0IHJldXNhYmxlSlNSVGFyZ2V0ID0gdGhpcy5yZXVzYWJsZUpTUlRhcmdldHNbaV07CiAJCQkJZGlmZmVyZW50VGFyZ2V0OiB7Ci0JCQkJCWlmICh0YXJnZXRMb2NhdGlvbiA9PSByZXVzYWJsZUpTUlRhcmdldCkgCisJCQkJCWlmICh0YXJnZXRMb2NhdGlvbiA9PSByZXVzYWJsZUpTUlRhcmdldCkKIAkJCQkJCWJyZWFrIGRpZmZlcmVudFRhcmdldDsKLQkJCQkJaWYgKHRhcmdldExvY2F0aW9uIGluc3RhbmNlb2YgQ29uc3RhbnQgCisJCQkJCWlmICh0YXJnZXRMb2NhdGlvbiBpbnN0YW5jZW9mIENvbnN0YW50CiAJCQkJCQkJJiYgcmV1c2FibGVKU1JUYXJnZXQgaW5zdGFuY2VvZiBDb25zdGFudAogCQkJCQkJCSYmICgoQ29uc3RhbnQpdGFyZ2V0TG9jYXRpb24pLmhhc1NhbWVWYWx1ZSgoQ29uc3RhbnQpIHJldXNhYmxlSlNSVGFyZ2V0KSkgewogCQkJCQkJYnJlYWsgZGlmZmVyZW50VGFyZ2V0OwpAQCAtNjU2LDcgKzg2MSw3IEBACiAJCQkJCWNvbnRpbnVlIG5leHRSZXVzYWJsZVRhcmdldDsKIAkJCQl9CiAJCQkJLy8gY3VycmVudCB0YXJnZXQgaGFzIGJlZW4gdXNlZCBpbiB0aGUgcGFzdCwgc2ltcGx5IGJyYW5jaCB0byBpdHMgbGFiZWwKLQkJCQlpZiAoKHRoaXMucmV1c2FibGVKU1JTdGF0ZUluZGV4ZXNbaV0gIT0gc3RhdGVJbmRleCkgJiYgZmluYWxseU1vZGUgPT0gRklOQUxMWV9JTkxJTkUgJiYgaXNTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgeworCQkJCWlmICgodGhpcy5yZXVzYWJsZUpTUlN0YXRlSW5kZXhlc1tpXSAhPSBzdGF0ZUluZGV4KSAmJiBmaW5hbGx5TW9kZSA9PSBGSU5BTExZX0lOTElORSkgewogCQkJCQlyZXVzZVRhcmdldExvY2F0aW9uID0gZmFsc2U7CiAJCQkJCWJyZWFrIG5leHRSZXVzYWJsZVRhcmdldDsKIAkJCQl9IGVsc2UgewpAQCAtNjg1LDE3ICs4OTAsNiBAQAogCWlmIChmaW5hbGx5TW9kZSA9PSBGSU5BTExZX0lOTElORSkgewogCQlpZiAoaXNTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgewogCQkJKChTdGFja01hcEZyYW1lQ29kZVN0cmVhbSkgY29kZVN0cmVhbSkucHVzaFN0YXRlSW5kZXgoc3RhdGVJbmRleCk7Ci0JCQlpZiAodGhpcy5uYXR1cmFsRXhpdE1lcmdlSW5pdFN0YXRlSW5kZXggIT0gLTEgfHwgc3RhdGVJbmRleCAhPSAtMSkgewotCQkJCS8vIHJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlLCBhcyBmb3IgYSBub3JtYWwgY2F0Y2ggYmxvY2sKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLm5hdHVyYWxFeGl0TWVyZ2VJbml0U3RhdGVJbmRleCAhPSAtMSkgewotCQkJCS8vIHJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlLCBhcyBmb3IgYSBub3JtYWwgY2F0Y2ggYmxvY2sKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4KTsKLQkJCX0KIAkJfQogCQlpZiAoc2VjcmV0TG9jYWwgIT0gbnVsbCkgewogCQkJY29kZVN0cmVhbS5hZGRWYXJpYWJsZShzZWNyZXRMb2NhbCk7CkBAIC03MjEsNyArOTE1LDE4IEBACiB9CiAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRTdGF0ZW1lbnQoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewotCXByaW50SW5kZW50KGluZGVudCwgb3V0cHV0KS5hcHBlbmQoInRyeSBcbiIpOyAvLyROT04tTkxTLTEkCisJaW50IGxlbmd0aCA9IHRoaXMucmVzb3VyY2VzLmxlbmd0aDsKKwlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCkuYXBwZW5kKCJ0cnkiICsgKGxlbmd0aCA9PSAwID8gIlxuIiA6ICIgKCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXRoaXMucmVzb3VyY2VzW2ldLnByaW50QXNFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJCWlmIChpICE9IGxlbmd0aCAtIDEpIHsKKwkJCW91dHB1dC5hcHBlbmQoIjtcbiIpOyAvLyROT04tTkxTLTEkCisJCQlwcmludEluZGVudChpbmRlbnQgKyAyLCBvdXRwdXQpOworCQl9CisJfQorCWlmIChsZW5ndGggPiAwKSB7CisJCW91dHB1dC5hcHBlbmQoIilcbiIpOyAvLyROT04tTkxTLTEkCisJfQogCXRoaXMudHJ5QmxvY2sucHJpbnRTdGF0ZW1lbnQoaW5kZW50ICsgMSwgb3V0cHV0KTsKIAogCS8vY2F0Y2hlcwpAQCAtNzI5LDcgKzkzNCw3IEBACiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jYXRjaEJsb2Nrcy5sZW5ndGg7IGkrKykgewogCQkJCW91dHB1dC5hcHBlbmQoJ1xuJyk7CiAJCQkJcHJpbnRJbmRlbnQoaW5kZW50LCBvdXRwdXQpLmFwcGVuZCgiY2F0Y2ggKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5jYXRjaEFyZ3VtZW50c1tpXS5wcmludCgwLCBvdXRwdXQpLmFwcGVuZCgiKSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuY2F0Y2hBcmd1bWVudHNbaV0ucHJpbnQoMCwgb3V0cHV0KS5hcHBlbmQoIilcbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJdGhpcy5jYXRjaEJsb2Nrc1tpXS5wcmludFN0YXRlbWVudChpbmRlbnQgKyAxLCBvdXRwdXQpOwogCQl9CiAJLy9maW5hbGx5CkBAIC03NDIsMTIgKzk0Nyw0MyBAQAogfQogCiBwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgdXBwZXJTY29wZSkgewotCS8vIHNwZWNpYWwgc2NvcGUgZm9yIHNlY3JldCBsb2NhbHMgb3B0aW1pemF0aW9uLgkKKwkvLyBzcGVjaWFsIHNjb3BlIGZvciBzZWNyZXQgbG9jYWxzIG9wdGltaXphdGlvbi4KIAl0aGlzLnNjb3BlID0gbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSk7CiAKLQlCbG9ja1Njb3BlIHRyeVNjb3BlID0gbmV3IEJsb2NrU2NvcGUodGhpcy5zY29wZSk7CiAJQmxvY2tTY29wZSBmaW5hbGx5U2NvcGUgPSBudWxsOwotCQorICAgIEJsb2NrU2NvcGUgcmVzb3VyY2VNYW5hZ2VtZW50U2NvcGUgPSBudWxsOyAvLyBTaW5nbGUgc2NvcGUgdG8gaG9sZCBhbGwgcmVzb3VyY2VzIGFuZCBhZGRpdGlvbmFsIHNlY3JldCB2YXJpYWJsZXMuCisJaW50IHJlc291cmNlQ291bnQgPSB0aGlzLnJlc291cmNlcy5sZW5ndGg7CisJaWYgKHJlc291cmNlQ291bnQgPiAwKSB7CisJCXJlc291cmNlTWFuYWdlbWVudFNjb3BlID0gbmV3IEJsb2NrU2NvcGUodGhpcy5zY29wZSk7CisJCXRoaXMucHJpbWFyeUV4Y2VwdGlvblZhcmlhYmxlID0KKwkJCW5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhUcnlTdGF0ZW1lbnQuU0VDUkVUX1BSSU1BUllfRVhDRVBUSU9OX1ZBUklBQkxFX05BTUUsIHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQsIGZhbHNlKTsKKwkJcmVzb3VyY2VNYW5hZ2VtZW50U2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLnByaW1hcnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCXRoaXMucHJpbWFyeUV4Y2VwdGlvblZhcmlhYmxlLnNldENvbnN0YW50KENvbnN0YW50Lk5vdEFDb25zdGFudCk7IC8vIG5vdCBpbmxpbmFibGUKKwkJdGhpcy5jYXVnaHRUaHJvd2FibGVWYXJpYWJsZSA9CisJCQluZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoVHJ5U3RhdGVtZW50LlNFQ1JFVF9DQVVHSFRfVEhST1dBQkxFX1ZBUklBQkxFX05BTUUsIHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQsIGZhbHNlKTsKKwkJcmVzb3VyY2VNYW5hZ2VtZW50U2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLmNhdWdodFRocm93YWJsZVZhcmlhYmxlKTsKKwkJdGhpcy5jYXVnaHRUaHJvd2FibGVWYXJpYWJsZS5zZXRDb25zdGFudChDb25zdGFudC5Ob3RBQ29uc3RhbnQpOyAvLyBub3QgaW5saW5hYmxlCisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VDb3VudDsgaSsrKSB7CisJCXRoaXMucmVzb3VyY2VzW2ldLnJlc29sdmUocmVzb3VyY2VNYW5hZ2VtZW50U2NvcGUpOworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZyA9IHRoaXMucmVzb3VyY2VzW2ldLmJpbmRpbmc7CisJCWlmIChsb2NhbFZhcmlhYmxlQmluZGluZyAhPSBudWxsICYmIGxvY2FsVmFyaWFibGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLm1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWw7CisJCQlsb2NhbFZhcmlhYmxlQmluZGluZy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNSZXNvdXJjZTsKKwkJCVR5cGVCaW5kaW5nIHJlc291cmNlVHlwZSA9IGxvY2FsVmFyaWFibGVCaW5kaW5nLnR5cGU7CisJCQlpZiAocmVzb3VyY2VUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCWlmIChyZXNvdXJjZVR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShUeXBlSWRzLlRfSmF2YUxhbmdBdXRvQ2xvc2VhYmxlLCBmYWxzZSAvKkF1dG9DbG9zZWFibGUgaXMgbm90IGEgY2xhc3MqLykgPT0gbnVsbCAmJiByZXNvdXJjZVR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQl1cHBlclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlc291cmNlSGFzVG9JbXBsZW1lbnRBdXRvQ2xvc2VhYmxlKHJlc291cmNlVHlwZSwgdGhpcy5yZXNvdXJjZXNbaV0udHlwZSk7CisJCQkJCWxvY2FsVmFyaWFibGVCaW5kaW5nLnR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcmVzb3VyY2VUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCBudWxsLCBQcm9ibGVtUmVhc29ucy5JbnZhbGlkVHlwZUZvckF1dG9NYW5hZ2VkUmVzb3VyY2UpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocmVzb3VyY2VUeXBlICE9IG51bGwpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTg2MiwgYXZvaWQgc2Vjb25kYXJ5IGVycm9yIGluIHByb2JsZW1hdGljIG51bGwgY2FzZQorCQkJCXVwcGVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmVzb3VyY2VIYXNUb0ltcGxlbWVudEF1dG9DbG9zZWFibGUocmVzb3VyY2VUeXBlLCB0aGlzLnJlc291cmNlc1tpXS50eXBlKTsKKwkJCQlsb2NhbFZhcmlhYmxlQmluZGluZy50eXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHJlc291cmNlVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbnVsbCwgUHJvYmxlbVJlYXNvbnMuSW52YWxpZFR5cGVGb3JBdXRvTWFuYWdlZFJlc291cmNlKTsKKwkJCX0KKwkJfQorCX0KKwlCbG9ja1Njb3BlIHRyeVNjb3BlID0gbmV3IEJsb2NrU2NvcGUocmVzb3VyY2VNYW5hZ2VtZW50U2NvcGUgIT0gbnVsbCA/IHJlc291cmNlTWFuYWdlbWVudFNjb3BlIDogdGhpcy5zY29wZSk7CisKIAlpZiAodGhpcy5maW5hbGx5QmxvY2sgIT0gbnVsbCkgewogCQlpZiAodGhpcy5maW5hbGx5QmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKIAkJCWlmICgodGhpcy5maW5hbGx5QmxvY2suYml0cyAmIEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jaykgIT0gMCkgewpAQCAtNzkyLDcgKzEwMjgsOCBAQAogCQkJfQogCQkJdGhpcy5maW5hbGx5QmxvY2sucmVzb2x2ZVVzaW5nKGZpbmFsbHlTY29wZSk7CiAJCQkvLyBmb3JjZSB0aGUgZmluYWxseSBzY29wZSB0byBoYXZlIHZhcmlhYmxlIHBvc2l0aW9ucyBzaGlmdGVkIGFmdGVyIGl0cyB0cnkgc2NvcGUgYW5kIGNhdGNoIG9uZXMKLQkJCWZpbmFsbHlTY29wZS5zaGlmdFNjb3BlcyA9IG5ldyBCbG9ja1Njb3BlW3RoaXMuY2F0Y2hBcmd1bWVudHMgPT0gbnVsbCA/IDEgOiB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aCsxXTsKKwkJCWludCBzaGlmdFNjb3Blc0xlbmd0aCA9IHRoaXMuY2F0Y2hBcmd1bWVudHMgPT0gbnVsbCA/IDEgOiB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aCArIDE7CisJCQlmaW5hbGx5U2NvcGUuc2hpZnRTY29wZXMgPSBuZXcgQmxvY2tTY29wZVtzaGlmdFNjb3Blc0xlbmd0aF07CiAJCQlmaW5hbGx5U2NvcGUuc2hpZnRTY29wZXNbMF0gPSB0cnlTY29wZTsKIAkJfQogCX0KQEAgLTgwMiw2ICsxMDM5LDcgQEAKIAlpZiAodGhpcy5jYXRjaEJsb2NrcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aDsKIAkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CisJCWJvb2xlYW4gY29udGFpbnNVbmlvblR5cGVzID0gZmFsc2U7CiAJCWJvb2xlYW4gY2F0Y2hIYXNFcnJvciA9IGZhbHNlOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlCbG9ja1Njb3BlIGNhdGNoU2NvcGUgPSBuZXcgQmxvY2tTY29wZSh0aGlzLnNjb3BlKTsKQEAgLTgwOSw3ICsxMDQ3LDkgQEAKIAkJCQlmaW5hbGx5U2NvcGUuc2hpZnRTY29wZXNbaSsxXSA9IGNhdGNoU2NvcGU7CiAJCQl9CiAJCQkvLyBzaWRlIGVmZmVjdCBvbiBjYXRjaFNjb3BlIGluIHJlc29sdmVGb3JDYXRjaCguLikKLQkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IHRoaXMuY2F0Y2hBcmd1bWVudHNbaV0ucmVzb2x2ZUZvckNhdGNoKGNhdGNoU2NvcGUpKSA9PSBudWxsKSB7CisJCQlBcmd1bWVudCBjYXRjaEFyZ3VtZW50ID0gdGhpcy5jYXRjaEFyZ3VtZW50c1tpXTsKKwkJCWNvbnRhaW5zVW5pb25UeXBlcyB8PSAoY2F0Y2hBcmd1bWVudC50eXBlLmJpdHMgJiBBU1ROb2RlLklzVW5pb25UeXBlKSAhPSAwOworCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gY2F0Y2hBcmd1bWVudC5yZXNvbHZlRm9yQ2F0Y2goY2F0Y2hTY29wZSkpID09IG51bGwpIHsKIAkJCQljYXRjaEhhc0Vycm9yID0gdHJ1ZTsKIAkJCX0KIAkJCXRoaXMuY2F0Y2hCbG9ja3NbaV0ucmVzb2x2ZVVzaW5nKGNhdGNoU2NvcGUpOwpAQCAtODE5LDE5ICsxMDU5LDExIEBACiAJCX0KIAkJLy8gVmVyaWZ5IHRoYXQgdGhlIGNhdGNoIGNsYXVzZSBhcmUgb3JkZXJlZCBpbiB0aGUgcmlnaHQgd2F5OgogCQkvLyBtb3JlIHNwZWNpYWxpemVkIGZpcnN0LgotCQl0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKSBhcmd1bWVudFR5cGVzW2ldOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQlpZiAodGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXS5pc0NvbXBhdGlibGVXaXRoKGFyZ3VtZW50VHlwZXNbal0pKSB7Ci0JCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkud3JvbmdTZXF1ZW5jZU9mRXhjZXB0aW9uVHlwZXNFcnJvcih0aGlzLCB0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzW2ldLCBpLCBhcmd1bWVudFR5cGVzW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJdmVyaWZ5RHVwbGljYXRpb25BbmRPcmRlcihsZW5ndGgsIGFyZ3VtZW50VHlwZXMsIGNvbnRhaW5zVW5pb25UeXBlcyk7CiAJfSBlbHNlIHsKIAkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzBdOwogCX0KLQkKKwogCWlmIChmaW5hbGx5U2NvcGUgIT0gbnVsbCl7CiAJCS8vIGFkZCBmaW5hbGx5U2NvcGUgYXMgbGFzdCBzdWJzY29wZSwgc28gaXQgY2FuIGJlIHNoaWZ0ZWQgYmVoaW5kIHRyeS9jYXRjaCBzdWJzY29wZXMuCiAJCS8vIHRoZSBzaGlmdGluZyBpcyBuZWNlc3NhcnkgdG8gYWNoaWV2ZSBubyBvdmVybGF5IGluIGJldHdlZW4gdGhlIGZpbmFsbHkgc2NvcGUgYW5kIGl0cwpAQCAtODM5LDkgKzEwNzEsMTIgQEAKIAkJdGhpcy5zY29wZS5hZGRTdWJzY29wZShmaW5hbGx5U2NvcGUpOwogCX0KIH0KLQogcHVibGljIHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQlMb2NhbERlY2xhcmF0aW9uW10gbG9jYWxEZWNsYXJhdGlvbnMgPSB0aGlzLnJlc291cmNlczsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGxvY2FsRGVjbGFyYXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlsb2NhbERlY2xhcmF0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKKwkJfQogCQl0aGlzLnRyeUJsb2NrLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCQlpZiAodGhpcy5jYXRjaEFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jYXRjaEJsb2Nrcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtODU0LDQgKzEwODksNzAgQEAKIAl9CiAJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIH0KK3Byb3RlY3RlZCB2b2lkIHZlcmlmeUR1cGxpY2F0aW9uQW5kT3JkZXIoaW50IGxlbmd0aCwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBib29sZWFuIGNvbnRhaW5zVW5pb25UeXBlcykgeworCS8vIFZlcmlmeSB0aGF0IHRoZSBjYXRjaCBjbGF1c2UgYXJlIG9yZGVyZWQgaW4gdGhlIHJpZ2h0IHdheToKKwkvLyBtb3JlIHNwZWNpYWxpemVkIGZpcnN0LgorCWlmIChjb250YWluc1VuaW9uVHlwZXMpIHsKKwkJaW50IHRvdGFsQ291bnQgPSAwOworCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBhbGxFeGNlcHRpb25UeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xlbmd0aF1bXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RXhjZXB0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBhcmd1bWVudFR5cGVzW2ldOworCQkJVHlwZVJlZmVyZW5jZSBjYXRjaEFyZ3VtZW50VHlwZSA9IHRoaXMuY2F0Y2hBcmd1bWVudHNbaV0udHlwZTsKKwkJCWlmICgoY2F0Y2hBcmd1bWVudFR5cGUuYml0cyAmIEFTVE5vZGUuSXNVbmlvblR5cGUpICE9IDApIHsKKwkJCQlUeXBlUmVmZXJlbmNlW10gdHlwZVJlZmVyZW5jZXMgPSAoKFVuaW9uVHlwZVJlZmVyZW5jZSkgY2F0Y2hBcmd1bWVudFR5cGUpLnR5cGVSZWZlcmVuY2VzOworCQkJCWludCB0eXBlUmVmZXJlbmNlc0xlbmd0aCA9IHR5cGVSZWZlcmVuY2VzLmxlbmd0aDsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gdW5pb25FeGNlcHRpb25UeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3R5cGVSZWZlcmVuY2VzTGVuZ3RoXTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVSZWZlcmVuY2VzTGVuZ3RoOyBqKyspIHsKKwkJCQkJdW5pb25FeGNlcHRpb25UeXBlc1tqXSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlUmVmZXJlbmNlc1tqXS5yZXNvbHZlZFR5cGU7CisJCQkJfQorCQkJCXRvdGFsQ291bnQgKz0gdHlwZVJlZmVyZW5jZXNMZW5ndGg7CisJCQkJYWxsRXhjZXB0aW9uVHlwZXNbaV0gPSB1bmlvbkV4Y2VwdGlvblR5cGVzOworCQkJfSBlbHNlIHsKKwkJCQlhbGxFeGNlcHRpb25UeXBlc1tpXSA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW10geyBjdXJyZW50RXhjZXB0aW9uVHlwZSB9OworCQkJCXRvdGFsQ291bnQrKzsKKwkJCX0KKwkJfQorCQl0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbdG90YWxDb3VudF07CisJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uc0NhdGNoQmxvY2tzICA9IG5ldyBpbnRbdG90YWxDb3VudF07CisJCWZvciAoaW50IGkgPSAwLCBsID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nW10gY3VycmVudEV4Y2VwdGlvbnMgPSBhbGxFeGNlcHRpb25UeXBlc1tpXTsKKwkJCWxvb3A6IGZvciAoaW50IGogPSAwLCBtYXggPSBjdXJyZW50RXhjZXB0aW9ucy5sZW5ndGg7IGogPCBtYXg7IGorKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uID0gY3VycmVudEV4Y2VwdGlvbnNbal07CisJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tsXSA9IGV4Y2VwdGlvbjsKKwkJCQl0aGlzLmNhdWdodEV4Y2VwdGlvbnNDYXRjaEJsb2Nrc1tsKytdID0gaTsKKwkJCQkvLyBub3cgaXRlcmF0ZSBvdmVyIGFsbCBwcmV2aW91cyBleGNlcHRpb25zCisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpOyBrKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGV4Y2VwdGlvbnMgPSBhbGxFeGNlcHRpb25UeXBlc1trXTsKKwkJCQkJZm9yIChpbnQgbiA9IDAsIG1heDIgPSBleGNlcHRpb25zLmxlbmd0aDsgbiA8IG1heDI7IG4rKykgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RXhjZXB0aW9uID0gZXhjZXB0aW9uc1tuXTsKKwkJCQkJCWlmIChleGNlcHRpb24uaXNDb21wYXRpYmxlV2l0aChjdXJyZW50RXhjZXB0aW9uKSkgeworCQkJCQkJCVR5cGVSZWZlcmVuY2UgY2F0Y2hBcmd1bWVudFR5cGUgPSB0aGlzLmNhdGNoQXJndW1lbnRzW2ldLnR5cGU7CisJCQkJCQkJaWYgKChjYXRjaEFyZ3VtZW50VHlwZS5iaXRzICYgQVNUTm9kZS5Jc1VuaW9uVHlwZSkgIT0gMCkgeworCQkJCQkJCQljYXRjaEFyZ3VtZW50VHlwZSA9ICgoVW5pb25UeXBlUmVmZXJlbmNlKSBjYXRjaEFyZ3VtZW50VHlwZSkudHlwZVJlZmVyZW5jZXNbal07CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkud3JvbmdTZXF1ZW5jZU9mRXhjZXB0aW9uVHlwZXNFcnJvcigKKwkJCQkJCQkJY2F0Y2hBcmd1bWVudFR5cGUsCisJCQkJCQkJCWV4Y2VwdGlvbiwKKwkJCQkJCQkJY3VycmVudEV4Y2VwdGlvbik7CisJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIGFyZ3VtZW50VHlwZXNbaV07CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworCQkJCWlmICh0aGlzLmNhdWdodEV4Y2VwdGlvblR5cGVzW2ldLmlzQ29tcGF0aWJsZVdpdGgoYXJndW1lbnRUeXBlc1tqXSkpIHsKKwkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS53cm9uZ1NlcXVlbmNlT2ZFeGNlcHRpb25UeXBlc0Vycm9yKAorCQkJCQkJdGhpcy5jYXRjaEFyZ3VtZW50c1tpXS50eXBlLAorCQkJCQkJdGhpcy5jYXVnaHRFeGNlcHRpb25UeXBlc1tpXSwKKwkJCQkJCWFyZ3VtZW50VHlwZXNbal0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDBmMGJmYzQuLmI0NzU5MzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNCArMTksMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIFByb2JsZW1TZXZlcml0aWVzLCBSZWZlcmVuY2VDb250ZXh0IHsKIAkvLyBUeXBlIGRlY2wga2luZHMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19ERUNMID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUkZBQ0VfREVDTCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9ERUNMID0gMzsJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9ERUNMID0gMzsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX1RZUEVfREVDTCA9IDQ7Ci0JCisKIAlwdWJsaWMgaW50IG1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OwogCXB1YmxpYyBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQ7CiAJcHVibGljIEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKQEAgLTQ4LDIwICs0OSwyMSBAQAogCXB1YmxpYyBpbnQgYm9keUVuZDsgLy8gZG9lc24ndCBpbmNsdWRlIHRoZSB0cmFpbGluZyBjb21tZW50IGlmIGFueS4KIAlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQ7CiAJcHVibGljIE1ldGhvZERlY2xhcmF0aW9uW10gbWlzc2luZ0Fic3RyYWN0TWV0aG9kczsKLQlwdWJsaWMgSmF2YWRvYyBqYXZhZG9jOwkKLQkKKwlwdWJsaWMgSmF2YWRvYyBqYXZhZG9jOworCiAJcHVibGljIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb247IC8vIGZvciBhbm9ueW1vdXMgb25seQogCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24gZW5jbG9zaW5nVHlwZTsgLy8gZm9yIG1lbWJlciB0eXBlcyBvbmx5Ci0JCisKIAlwdWJsaWMgRmllbGRCaW5kaW5nIGVudW1WYWx1ZXNTeW50aGV0aWNmaWVsZDsgCS8vIGZvciBlbnVtCisJcHVibGljIGludCBlbnVtQ29uc3RhbnRzQ291bnRlcjsKIAogCS8vIDEuNSBzdXBwb3J0CiAJcHVibGljIFR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVyczsKLQkKKwogcHVibGljIFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CiAJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OwogfQotCQorCiAvKgogICoJV2UgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRhc2sgdG8gYWJvcnQgdG8gYSBnaXZlbiBleHRlbnQuCiAgKi8KQEAgLTgxLDExICs4MywxMSBAQAogLyoqCiAgKiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGEgPGNsaW5pdD4gbWV0aG9kIGRlY2xhcmF0aW9uIHRvIHRoZSB0eXBlIG1ldGhvZCBjb2xsZWN0aW9ucy4KICAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGluc2VydGluZyBpdCBpbiBmaXJzdCBwbGFjZSAoYXMgVkFKIG9yIGphdmFjKSwgYW5kIHRoYXQgdGhpcwotICogaW1wYWN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG1ldGhvZCBDb25zdGFudFBvb2wucmVzZXRGb3JDbGluaXQoaW50LiBpbnQpLCBpbiBzbyBmYXIgYXMgCi0gKiB0aGUgbGF0dGVyIHdpbGwgaGF2ZSB0byByZXNldCB0aGUgY29uc3RhbnQgcG9vbCBzdGF0ZSBhY2NvcmRpbmdseSAoaWYgaXQgd2FzIGFkZGVkIGZpcnN0LCBpdCBkb2VzIAorICogaW1wYWN0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG1ldGhvZCBDb25zdGFudFBvb2wucmVzZXRGb3JDbGluaXQoaW50LiBpbnQpLCBpbiBzbyBmYXIgYXMKKyAqIHRoZSBsYXR0ZXIgd2lsbCBoYXZlIHRvIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHN0YXRlIGFjY29yZGluZ2x5IChpZiBpdCB3YXMgYWRkZWQgZmlyc3QsIGl0IGRvZXMKICAqIG5vdCBuZWVkIHRvIHByZXNlcnZlIHNvbWUgb2YgdGhlIG1ldGhvZCBzcGVjaWZpYyBjYWNoZWQgZW50cmllcyBzaW5jZSB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IG1ldGhvZCkuCiAgKiBpbnNlcnRzIHRoZSBjbGluaXQgbWV0aG9kIGRlY2xhcmF0aW9uIGluIHRoZSBmaXJzdCBwb3NpdGlvbi4KLSAqIAorICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29uc3RhbnRQb29sI3Jlc2V0Rm9yQ2xpbml0KGludCwgaW50KQogICovCiBwdWJsaWMgZmluYWwgdm9pZCBhZGRDbGluaXQoKSB7CkBAIC0xNTQsMTMgKzE1NiwxMyBAQAogCiAJLy89PT09PT09PT09PT1CSU5ESU5HIFVQREFURT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJbWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyA9IG5ldyBNZXRob2RCaW5kaW5nKAotCQkJbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzLCAvL21ldGhvZERlY2xhcmF0aW9uCisJCQltZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljLCAvL21ldGhvZERlY2xhcmF0aW9uCiAJCQltZXRob2RCaW5kaW5nLnNlbGVjdG9yLAogCQkJbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLAogCQkJYXJndW1lbnRzTGVuZ3RoID09IDAgPyBCaW5kaW5nLk5PX1BBUkFNRVRFUlMgOiBhcmd1bWVudFR5cGVzLCAvL2FyZ3VtZW50cyBiaW5kaW5ncwogCQkJbWV0aG9kQmluZGluZy50aHJvd25FeGNlcHRpb25zLCAvL2V4Y2VwdGlvbnMKIAkJCXRoaXMuYmluZGluZyk7IC8vZGVjbGFyaW5nQ2xhc3MKLQkJCQorCiAJbWV0aG9kRGVjbGFyYXRpb24uc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcy5zY29wZSwgbWV0aG9kRGVjbGFyYXRpb24sIHRydWUpOwogCW1ldGhvZERlY2xhcmF0aW9uLmJpbmRBcmd1bWVudHMoKTsKIApAQCAtMTkwLDE0ICsxOTIsMTQgQEAKIAlpZiAodGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKIAkJcmV0dXJuIGZsb3dJbmZvOwogCXRyeSB7Ci0JCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKSB7CisJCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKIAkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzUmVhY2hhYmxlOwogCQkJTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUgPSAoTG9jYWxUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJbG9jYWxUeXBlLnNldENvbnN0YW50UG9vbE5hbWUoY3VycmVudFNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUobG9jYWxUeXBlKSk7CiAJCX0KIAkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGZsb3dJbmZvKTsKIAkJdXBkYXRlTWF4RmllbGRDb3VudCgpOyAvLyBwcm9wYWdhdGUgZG93biB0aGUgbWF4IGZpZWxkIGNvdW50Ci0JCWludGVybmFsQW5hbHlzZUNvZGUoZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsgCisJCWludGVybmFsQW5hbHlzZUNvZGUoZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAl9IGNhdGNoIChBYm9ydFR5cGUgZSkgewogCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKIAl9CkBAIC0yMjgsNyArMjMwLDcgQEAKIAlpZiAodGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKIAkJcmV0dXJuOwogCXRyeSB7Ci0JCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKSB7CisJCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKIAkJCXRoaXMuYml0cyB8PSBBU1ROb2RlLklzUmVhY2hhYmxlOwogCQkJTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUgPSAoTG9jYWxUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJbG9jYWxUeXBlLnNldENvbnN0YW50UG9vbE5hbWUoY3VycmVudFNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkuY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUobG9jYWxUeXBlKSk7CkBAIC0yODUsNyArMjg3LDcgQEAKIAkJCQkJCQkvLyByZXBvcnQgdGhlIHByb2JsZW0gYW5kIGNvbnRpbnVlIHRoZSBwYXJzaW5nCiAJCQkJCQkJcGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmFubm90YXRpb25UeXBlRGVjbGFyYXRpb25DYW5ub3RIYXZlQ29uc3RydWN0b3IoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFtKTsKIAkJCQkJCQlicmVhazsKLQkJCQkJCQkKKwogCQkJCQl9CiAJCQkJCWhhc0NvbnN0cnVjdG9yID0gdHJ1ZTsKIAkJCQl9CkBAIC0zMTEsNyArMzEzLDcgQEAKIAljb25zdHJ1Y3Rvci5zZWxlY3RvciA9IHRoaXMubmFtZTsKIAljb25zdHJ1Y3Rvci5tb2RpZmllcnMgPSB0aGlzLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0s7CiAKLQkvL2lmIHlvdSBjaGFuZ2UgdGhpcyBzZXR0aW5nLCBwbGVhc2UgdXBkYXRlIHRoZSAKKwkvL2lmIHlvdSBjaGFuZ2UgdGhpcyBzZXR0aW5nLCBwbGVhc2UgdXBkYXRlIHRoZQogCS8vU291cmNlSW5kZXhlcjIuYnVpbGRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uLGNoYXJbXSkgbWV0aG9kCiAJY29uc3RydWN0b3IuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGNvbnN0cnVjdG9yLnNvdXJjZVN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydDsKIAljb25zdHJ1Y3Rvci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9CkBAIC0zNDQsNyArMzQ2LDcgQEAKIH0KIAogLy8gYW5vbnltb3VzIHR5cGUgY29uc3RydWN0b3IgY3JlYXRpb246IHJhbmsgaXMgaW1wb3J0YW50IHNpbmNlIGJpbmRpbmdzIGFscmVhZHkgZ290IHNvcnRlZAotcHVibGljIE1ldGhvZEJpbmRpbmcgY3JlYXRlRGVmYXVsdENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoTWV0aG9kQmluZGluZyBpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcpIHsKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGNyZWF0ZURlZmF1bHRDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkQ29uc3RydWN0b3JCaW5kaW5nLCBib29sZWFuIGVyYXNlVGhyb3duRXhjZXB0aW9ucykgewogCS8vQWRkIHRvIG1ldGhvZCdzZXQsIHRoZSBkZWZhdWx0IGNvbnN0dWN0b3IgdGhhdCBqdXN0IHJlY2FsbCB0aGUKIAkvL3N1cGVyIGNvbnN0cnVjdG9yIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCiAJU3RyaW5nIGJhc2VOYW1lID0gIiRhbm9ueW1vdXMiOyAvLyROT04tTkxTLTEkCkBAIC0zOTIsMTUgKzM5NCwyMCBAQAogCX0KIAogCS8vPT09PT09PT09PT09QklORElORyBVUERBVEU9PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMsIGFsaWduIHdpdGggamF2YWMgb24gSkxTIDE1LjEyLjIuNgorCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25zID0gZXJhc2VUaHJvd25FeGNlcHRpb25zCisJCQk/IHRoaXMuc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlcyhpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywgdHJ1ZSwgdHJ1ZSkKKwkJCTogaW5oZXJpdGVkQ29uc3RydWN0b3JCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnM7CisKIAlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdGhpcy5iaW5kaW5nOwogCWNvbnN0cnVjdG9yLmJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZygKIAkJCWNvbnN0cnVjdG9yLm1vZGlmaWVycywgLy9tZXRob2REZWNsYXJhdGlvbgogCQkJYXJndW1lbnRzTGVuZ3RoID09IDAgPyBCaW5kaW5nLk5PX1BBUkFNRVRFUlMgOiBhcmd1bWVudFR5cGVzLCAvL2FyZ3VtZW50cyBiaW5kaW5ncwotCQkJaW5oZXJpdGVkQ29uc3RydWN0b3JCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsIC8vZXhjZXB0aW9ucworCQkJdGhyb3duRXhjZXB0aW9ucywgLy9leGNlcHRpb25zCiAJCQlzb3VyY2VUeXBlKTsgLy9kZWNsYXJpbmdDbGFzcwotCQorCWNvbnN0cnVjdG9yLmJpbmRpbmcudGFnQml0cyB8PSAoaW5oZXJpdGVkQ29uc3RydWN0b3JCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKTsKIAljb25zdHJ1Y3Rvci5iaW5kaW5nLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0lzRGVmYXVsdENvbnN0cnVjdG9yOwotCQkJCisKIAljb25zdHJ1Y3Rvci5zY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLnNjb3BlLCBjb25zdHJ1Y3RvciwgdHJ1ZSk7CiAJY29uc3RydWN0b3IuYmluZEFyZ3VtZW50cygpOwogCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKGNvbnN0cnVjdG9yLnNjb3BlKTsKQEAgLTQwOCw3ICs0MTUsNyBAQAogCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RCaW5kaW5ncyA9IHNvdXJjZVR5cGUubWV0aG9kcygpOyAvLyB0cmlnZ2VyIHNvcnRpbmcKIAlpbnQgbGVuZ3RoOwogCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kQmluZGluZ3MsIDAsIG1ldGhvZEJpbmRpbmdzID0gbmV3IE1ldGhvZEJpbmRpbmdbKGxlbmd0aCA9IG1ldGhvZEJpbmRpbmdzLmxlbmd0aCkgKyAxXSwgMSwgbGVuZ3RoKTsKLQltZXRob2RCaW5kaW5nc1swXSA9IGNvbnN0cnVjdG9yLmJpbmRpbmc7IAorCW1ldGhvZEJpbmRpbmdzWzBdID0gY29uc3RydWN0b3IuYmluZGluZzsKIAlpZiAoKytsZW5ndGggPiAxKQogCQlSZWZlcmVuY2VCaW5kaW5nLnNvcnRNZXRob2RzKG1ldGhvZEJpbmRpbmdzLCAwLCBsZW5ndGgpOwkvLyBuZWVkIHRvIHJlc29ydCwgc2luY2UgY291bGQgYmUgdmFsaWQgbWV0aG9kcyBhaGVhZCAoMTQwNjQzKSAtIERPTSBuZWVkcyBlYWdlciBzb3J0aW5nCiAJc291cmNlVHlwZS5zZXRNZXRob2RzKG1ldGhvZEJpbmRpbmdzKTsKQEAgLTQ2NCw3ICs0NzEsNyBAQAogICogRmluZHMgdGhlIG1hdGNoaW5nIHR5cGUgYW1vdW5nIHRoaXMgdHlwZSdzIG1lbWJlciB0eXBlcy4KICAqIFJldHVybnMgbnVsbCBpZiBubyB0eXBlIHdpdGggdGhpcyBuYW1lIGlzIGZvdW5kLgogICogVGhlIHR5cGUgbmFtZSBpcyBhIGNvbXBvdW5kIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyB0eXBlCi0gKiBlZy4gaWYgdGhpcyB0eXBlIGlzIFggYW5kIHdlJ3JlIGxvb2tpbmcgZm9yIFkuWC5BLkIKKyAqIGUuZy4gaWYgdGhpcyB0eXBlIGlzIFggYW5kIHdlJ3JlIGxvb2tpbmcgZm9yIFkuWC5BLkIKICAqICAgICB0aGVuIGEgdHlwZSBuYW1lIHdvdWxkIGJlIHtYLCBBLCBCfQogICovCiBwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uT2ZUeXBlKGNoYXJbXVtdIHR5cGVOYW1lKSB7CkBAIC01MTEsNiArNTE4LDEzIEBACiAJCQllbmNsb3NpbmdDbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKHRoaXMuYmluZGluZyk7CiAJCQljbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKHRoaXMuYmluZGluZyk7CiAJCX0KKwkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSB0aGlzLmJpbmRpbmcudHlwZVZhcmlhYmxlcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGVCaW5kaW5nID0gdHlwZVZhcmlhYmxlc1tpXTsKKwkJCWlmICgodHlwZVZhcmlhYmxlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgdHlwZVZhcmlhYmxlQmluZGluZyk7CisJCQl9CisJCX0KIAogCQkvLyBnZW5lcmF0ZSBhbGwgZmllbHMKIAkJY2xhc3NGaWxlLmFkZEZpZWxkSW5mb3MoKTsKQEAgLTU1NiwxMCArNTcwLDE5IEBACiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBibG9ja1Njb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKIAlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSXNSZWFjaGFibGUpID09IDApIHsKIAkJcmV0dXJuOwotCX0JCQorCX0KIAlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSGFzQmVlbkdlbmVyYXRlZCkgIT0gMCkgcmV0dXJuOwogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JaWYgKHRoaXMuYmluZGluZyAhPSBudWxsKSAoKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLmNvbXB1dGVTeW50aGV0aWNBcmd1bWVudFNsb3RTaXplcygpOworCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCkgeworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBlbmNsb3NpbmdJbnN0YW5jZXMgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOworCQlmb3IgKGludCBpID0gMCwgc2xvdFNpemUgPSAwLCBjb3VudCA9IGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsID8gMCA6IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKXsKKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBlbmNsb3NpbmdJbnN0YW5jZSA9IGVuY2xvc2luZ0luc3RhbmNlc1tpXTsKKwkJCWVuY2xvc2luZ0luc3RhbmNlLnJlc29sdmVkUG9zaXRpb24gPSArK3Nsb3RTaXplOyAvLyBzaGlmdCBieSAxIHRvIGxlYXZlIHJvb20gZm9yIGFsb2FkMD09dGhpcworCQkJaWYgKHNsb3RTaXplID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cworCQkJCWJsb2NrU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChlbmNsb3NpbmdJbnN0YW5jZSwgYmxvY2tTY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQl9CisJfQogCWdlbmVyYXRlQ29kZShjb2RlU3RyZWFtLmNsYXNzRmlsZSk7CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KQEAgLTU2OSw3ICs1OTIsMTYgQEAKICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGVuY2xvc2luZ0NsYXNzRmlsZSkgewogCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5IYXNCZWVuR2VuZXJhdGVkKSAhPSAwKSByZXR1cm47Ci0JaWYgKHRoaXMuYmluZGluZyAhPSBudWxsKSAoKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLmNvbXB1dGVTeW50aGV0aWNBcmd1bWVudFNsb3RTaXplcygpOworCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCkgeworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBlbmNsb3NpbmdJbnN0YW5jZXMgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOworCQlmb3IgKGludCBpID0gMCwgc2xvdFNpemUgPSAwLCBjb3VudCA9IGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsID8gMCA6IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKXsKKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBlbmNsb3NpbmdJbnN0YW5jZSA9IGVuY2xvc2luZ0luc3RhbmNlc1tpXTsKKwkJCWVuY2xvc2luZ0luc3RhbmNlLnJlc29sdmVkUG9zaXRpb24gPSArK3Nsb3RTaXplOyAvLyBzaGlmdCBieSAxIHRvIGxlYXZlIHJvb20gZm9yIGFsb2FkMD09dGhpcworCQkJaWYgKHNsb3RTaXplID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cworCQkJCWNsYXNzU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChlbmNsb3NpbmdJbnN0YW5jZSwgY2xhc3NTY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQl9CisJfQogCWdlbmVyYXRlQ29kZShlbmNsb3NpbmdDbGFzc0ZpbGUpOwogfQogCkBAIC01ODgsNTUgKzYyMCw1MCBAQAogICoJQ29tbW9uIGZsb3cgYW5hbHlzaXMgZm9yIGFsbCB0eXBlcwogICovCiBwcml2YXRlIHZvaWQgaW50ZXJuYWxBbmFseXNlQ29kZShGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQlpZiAoKHRoaXMuYmluZGluZy5pc1ByaXZhdGUoKSB8fCAodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiAoVGFnQml0cy5Jc0Fub255bW91c1R5cGV8VGFnQml0cy5Jc0xvY2FsVHlwZSkpID09IFRhZ0JpdHMuSXNMb2NhbFR5cGUpICYmICF0aGlzLmJpbmRpbmcuaXNVc2VkKCkpIHsKKwlpZiAoIXRoaXMuYmluZGluZy5pc1VzZWQoKSAmJiB0aGlzLmJpbmRpbmcuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpKSB7CiAJCWlmICghdGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5oYXNTeW50YXhFcnJvcikgewogCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRQcml2YXRlVHlwZSh0aGlzKTsKIAkJfQogCX0KLQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IGluaXRpYWxpemVyQ29udGV4dCA9IG5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIHRoaXMuaW5pdGlhbGl6ZXJTY29wZSk7Ci0JSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQgPSBuZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCB0aGlzLnN0YXRpY0luaXRpYWxpemVyU2NvcGUpOworCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6ZXJDb250ZXh0ID0gbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgZmxvd0luZm8sIGZsb3dDb250ZXh0LCB0aGlzLmluaXRpYWxpemVyU2NvcGUpOworCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0ID0gbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgZmxvd0luZm8sIGZsb3dDb250ZXh0LCB0aGlzLnN0YXRpY0luaXRpYWxpemVyU2NvcGUpOwogCUZsb3dJbmZvIG5vblN0YXRpY0ZpZWxkSW5mbyA9IGZsb3dJbmZvLnVuY29uZGl0aW9uYWxGaWVsZExlc3NDb3B5KCk7CiAJRmxvd0luZm8gc3RhdGljRmllbGRJbmZvID0gZmxvd0luZm8udW5jb25kaXRpb25hbEZpZWxkTGVzc0NvcHkoKTsKIAlpZiAodGhpcy5maWVsZHMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLmZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdGhpcy5maWVsZHNbaV07CiAJCQlpZiAoZmllbGQuaXNTdGF0aWMoKSkgewotCQkJCWlmICgoc3RhdGljRmllbGRJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkKKwkJCQlpZiAoKHN0YXRpY0ZpZWxkSW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkKIAkJCQkJZmllbGQuYml0cyAmPSB+QVNUTm9kZS5Jc1JlYWNoYWJsZTsKLQkJCQkKKwogCQkJCS8qaWYgKGZpZWxkLmlzRmllbGQoKSl7CiAJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dC5oYW5kbGVkRXhjZXB0aW9ucyA9IE5vRXhjZXB0aW9uczsgLy8gbm8gZXhjZXB0aW9uIGlzIGFsbG93ZWQgamxzOC4zLjIKIAkJCQl9IGVsc2UgeyovCiAJCQkJc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LmhhbmRsZWRFeGNlcHRpb25zID0gQmluZGluZy5BTllfRVhDRVBUSU9OOyAvLyB0b2xlcmF0ZSB0aGVtIGFsbCwgYW5kIHJlY29yZCB0aGVtCiAJCQkJLyp9Ki8KLQkJCQlzdGF0aWNGaWVsZEluZm8gPQotCQkJCQlmaWVsZC5hbmFseXNlQ29kZSgKLQkJCQkJCXRoaXMuc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwKLQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwKLQkJCQkJCXN0YXRpY0ZpZWxkSW5mbyk7CisJCQkJc3RhdGljRmllbGRJbmZvID0gZmllbGQuYW5hbHlzZUNvZGUodGhpcy5zdGF0aWNJbml0aWFsaXplclNjb3BlLCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQsIHN0YXRpY0ZpZWxkSW5mbyk7CiAJCQkJLy8gaW4gY2FzZSB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IHJlYWNoYWJsZSwgdXNlIGEgcmVpbml0aWFsaXplZCBmbG93SW5mbyBhbmQgZW50ZXIgYSBmYWtlIHJlYWNoYWJsZQogCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KIAkJCQlpZiAoc3RhdGljRmllbGRJbmZvID09IEZsb3dJbmZvLkRFQURfRU5EKSB7CiAJCQkJCXRoaXMuc3RhdGljSW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkKTsKLQkJCQkJc3RhdGljRmllbGRJbmZvID0gRmxvd0luZm8uaW5pdGlhbCh0aGlzLm1heEZpZWxkQ291bnQpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQkJCXN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwodGhpcy5tYXhGaWVsZENvdW50KS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlpZiAoKG5vblN0YXRpY0ZpZWxkSW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApCisJCQkJaWYgKChub25TdGF0aWNGaWVsZEluZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpICE9IDApCiAJCQkJCWZpZWxkLmJpdHMgJj0gfkFTVE5vZGUuSXNSZWFjaGFibGU7Ci0JCQkJCisKIAkJCQkvKmlmIChmaWVsZC5pc0ZpZWxkKCkpewogCQkJCQlpbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7IC8vIG5vIGV4Y2VwdGlvbiBpcyBhbGxvd2VkIGpsczguMy4yCiAJCQkJfSBlbHNlIHsqLwogCQkJCQlpbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBCaW5kaW5nLkFOWV9FWENFUFRJT047IC8vIHRvbGVyYXRlIHRoZW0gYWxsLCBhbmQgcmVjb3JkIHRoZW0KIAkJCQkvKn0qLwotCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9Ci0JCQkJCWZpZWxkLmFuYWx5c2VDb2RlKHRoaXMuaW5pdGlhbGl6ZXJTY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8pOworCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9IGZpZWxkLmFuYWx5c2VDb2RlKHRoaXMuaW5pdGlhbGl6ZXJTY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8pOwogCQkJCS8vIGluIGNhc2UgdGhlIGluaXRpYWxpemVyIGlzIG5vdCByZWFjaGFibGUsIHVzZSBhIHJlaW5pdGlhbGl6ZWQgZmxvd0luZm8gYW5kIGVudGVyIGEgZmFrZSByZWFjaGFibGUKIAkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCiAJCQkJaWYgKG5vblN0YXRpY0ZpZWxkSW5mbyA9PSBGbG93SW5mby5ERUFEX0VORCkgewogCQkJCQl0aGlzLmluaXRpYWxpemVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseShmaWVsZCk7Ci0JCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwodGhpcy5tYXhGaWVsZENvdW50KS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOwotCQkJCX0gCisJCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwodGhpcy5tYXhGaWVsZENvdW50KS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCk7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtNjU5LDggKzY4Niw4IEBACiAJCQlpZiAobWV0aG9kLmlzSW5pdGlhbGl6YXRpb25NZXRob2QoKSkgewogCQkJCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgeyAvLyA8Y2xpbml0PgogCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoCi0JCQkJCQl0aGlzLnNjb3BlLCAKLQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwgIAorCQkJCQkJdGhpcy5zY29wZSwKKwkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwKIAkJCQkJCXN0YXRpY0ZpZWxkSW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKS5kaXNjYXJkTm9uRmllbGRJbml0aWFsaXphdGlvbnMoKS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKG91dGVySW5mbykpOwogCQkJCX0gZWxzZSB7IC8vIGNvbnN0cnVjdG9yCiAJCQkJCSgoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiltZXRob2QpLmFuYWx5c2VDb2RlKHRoaXMuc2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgY29uc3RydWN0b3JJbmZvLmNvcHkoKSwgZmxvd0luZm8ucmVhY2hNb2RlKCkpOwpAQCAtNjg0LDEyICs3MTEsMTIgQEAKIAkJCXJldHVybiBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0w7CiAJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0gOgogCQkJcmV0dXJuIFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0w7Ci0JCWRlZmF1bHQgOiAKKwkJZGVmYXVsdCA6CiAJCQlyZXR1cm4gVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0w7Ci0JfQkJCisJfQogfQogCi0vKiAKKy8qCiAgKiBBY2Nlc3MgZW11bGF0aW9uIGZvciBhIGxvY2FsIHR5cGUKICAqIGZvcmNlIHRvIGVtdWxhdGlvbiBvZiBhY2Nlc3MgdG8gZGlyZWN0IGVuY2xvc2luZyBpbnN0YW5jZS4KICAqIEJ5IHVzaW5nIHRoZSBpbml0aWFsaXplciBzY29wZSwgd2UgYWN0dWFsbHkgb25seSByZXF1ZXN0IGFuIGFyZ3VtZW50IGVtdWxhdGlvbiwgdGhlCkBAIC02OTgsMTIgKzcyNSwxMiBAQAogICogMTUuOS4yCiAgKi8KIHB1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApIHJldHVybjsKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSByZXR1cm47CiAJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQorCiAJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKTsKIAlpZiAoIW1ldGhvZFNjb3BlLmlzU3RhdGljICYmICFtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbCl7Ci0JCW5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChuZXN0ZWRUeXBlLmVuY2xvc2luZ1R5cGUoKSk7CQorCQluZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQobmVzdGVkVHlwZS5lbmNsb3NpbmdUeXBlKCkpOwogCX0KIAkvLyBhZGQgc3VwZXJjbGFzcyBlbmNsb3NpbmcgaW5zdGFuY2UgYXJnIGZvciBhbm9ueW1vdXMgdHlwZXMgKGlmIG5lY2Vzc2FyeSkKIAlpZiAobmVzdGVkVHlwZS5pc0Fub255bW91c1R5cGUoKSkgewpAQCAtNzEyLDcgKzczOSw3IEBACiAJCQlpZiAoIXN1cGVyY2xhc3NCaW5kaW5nLmlzTG9jYWxUeXBlKCkKIAkJCQkJfHwgKChOZXN0ZWRUeXBlQmluZGluZylzdXBlcmNsYXNzQmluZGluZykuZ2V0U3ludGhldGljRmllbGQoc3VwZXJjbGFzc0JpbmRpbmcuZW5jbG9zaW5nVHlwZSgpLCB0cnVlKSAhPSBudWxsKXsKIAotCQkJCW5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnQoc3VwZXJjbGFzc0JpbmRpbmcuZW5jbG9zaW5nVHlwZSgpKTsJCisJCQkJbmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudChzdXBlcmNsYXNzQmluZGluZy5lbmNsb3NpbmdUeXBlKCkpOwogCQkJfQogCQl9CiAJCS8vIEZyb20gMS41IG9uLCBwcm92aWRlIGFjY2VzcyB0byBlbmNsb3NpbmcgaW5zdGFuY2Ugc3ludGhldGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50IHdoZW4gZGVjbGFyZWQgaW5zaWRlIGNvbnN0cnVjdG9yIGNhbGwKQEAgLTczMSw3ICs3NTgsNyBAQAogLy8JCQkJCWlmIChuZXN0ZWRFbmNsb3NpbmcuZmluZFN1cGVyVHlwZUVyYXNpbmdUbyhuZXN0ZWRFbmNsb3NpbmcuZW5jbG9zaW5nVHlwZSgpKSA9PSBudWxsKSB7IC8vIG9ubHkgaWYgbm90IGluaGVyaXRpbmcKIAkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlQXJndW1lbnQgPSBuZXN0ZWRFbmNsb3NpbmcuZ2V0U3ludGhldGljQXJndW1lbnQobmVzdGVkRW5jbG9zaW5nLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSk7CiAJCQkJCWlmIChzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZUFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCW5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZUFyZ3VtZW50KTsJCisJCQkJCQluZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VBcmd1bWVudCk7CiAJCQkJCX0KIAkJCQl9CiAvLwkJCQl9CkBAIC03NDUsMTUgKzc3MiwxNSBAQAogICogQnkgdXNpbmcgdGhlIGluaXRpYWxpemVyIHNjb3BlLCB3ZSBhY3R1YWxseSBvbmx5IHJlcXVlc3QgYW4gYXJndW1lbnQgZW11bGF0aW9uLCB0aGUKICAqIGZpZWxkIGlzIG5vdCBhZGRlZCB1bnRpbCBhY3R1YWxseSB1c2VkLiBIb3dldmVyIHdlIHdpbGwgZm9yY2UgYWxsb2NhdGlvbnMgdG8gYmUgcXVhbGlmaWVkCiAgKiB3aXRoIGFuIGVuY2xvc2luZyBpbnN0YW5jZS4KLSAqIAorICoKICAqIExvY2FsIG1lbWJlciBjYW5ub3QgYmUgc3RhdGljLgogICovCiBwdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KENsYXNzU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwKSB7CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgPT0gMCkgewogCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKIAluZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQodGhpcy5iaW5kaW5nLmVuY2xvc2luZ1R5cGUoKSk7CiAJfQotfQkKK30KIAogLyoqCiAgKiBBIDxjbGluaXQ+IHdpbGwgYmUgcmVxdWVzdGVkIGFzIHNvb24gYXMgc3RhdGljIGZpZWxkcyBvciBhc3NlcnRpb25zIGFyZSBwcmVzZW50LiBJdCB3aWxsIGJlIGVsaW1pbmF0ZWQgZHVyaW5nCkBAIC03NjMsNyArNzkwLDcgQEAKIAkvLyBhbHdheXMgbmVlZCBhIDxjbGluaXQ+IHdoZW4gYXNzZXJ0aW9ucyBhcmUgcHJlc2VudAogCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5Db250YWluc0Fzc2VydGlvbikgIT0gMCkKIAkJcmV0dXJuIHRydWU7Ci0JCisKIAlzd2l0Y2ggKGtpbmQodGhpcy5tb2RpZmllcnMpKSB7CiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMOgogCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTDoKQEAgLTc4Miw3ICs4MDksNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotcHVibGljIHZvaWQgcGFyc2VNZXRob2QoUGFyc2VyIHBhcnNlciwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgeworcHVibGljIHZvaWQgcGFyc2VNZXRob2RzKFBhcnNlciBwYXJzZXIsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKIAkvL2Nvbm5lY3QgbWV0aG9kIGJvZGllcwogCWlmICh1bml0Lmlnbm9yZU1ldGhvZEJvZGllcykKIAkJcmV0dXJuOwpAQCAtNzkwLDE1ICs4MTcsMjAgQEAKIAkvL21lbWJlcnMKIAlpZiAodGhpcy5tZW1iZXJUeXBlcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSB0aGlzLm1lbWJlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCXRoaXMubWVtYmVyVHlwZXNbaV0ucGFyc2VNZXRob2QocGFyc2VyLCB1bml0KTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMubWVtYmVyVHlwZXNbaV07CisJCQl0eXBlRGVjbGFyYXRpb24ucGFyc2VNZXRob2RzKHBhcnNlciwgdW5pdCk7CisJCQl0aGlzLmJpdHMgfD0gKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5IYXNTeW50YXhFcnJvcnMpOworCQl9CiAJfQogCiAJLy9tZXRob2RzCiAJaWYgKHRoaXMubWV0aG9kcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSB0aGlzLm1ldGhvZHMubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLm1ldGhvZHNbaV0ucGFyc2VTdGF0ZW1lbnRzKHBhcnNlciwgdW5pdCk7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gPSB0aGlzLm1ldGhvZHNbaV07CisJCQlhYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLnBhcnNlU3RhdGVtZW50cyhwYXJzZXIsIHVuaXQpOworCQkJdGhpcy5iaXRzIHw9IChhYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLkhhc1N5bnRheEVycm9ycyk7CiAJCX0KIAl9CiAKQEAgLTgxMCw2ICs4NDIsNyBAQAogCQkJc3dpdGNoKGZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpKSB7CiAJCQkJY2FzZSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uSU5JVElBTElaRVI6CiAJCQkJCSgoSW5pdGlhbGl6ZXIpIGZpZWxkRGVjbGFyYXRpb24pLnBhcnNlU3RhdGVtZW50cyhwYXJzZXIsIHRoaXMsIHVuaXQpOworCQkJCQl0aGlzLmJpdHMgfD0gKGZpZWxkRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzKTsKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTg0OSw3ICs4ODIsNyBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGkrKykgewogCQkJaWYgKHRoaXMubWV0aG9kc1tpXSAhPSBudWxsKSB7CiAJCQkJb3V0cHV0LmFwcGVuZCgnXG4nKTsKLQkJCQl0aGlzLm1ldGhvZHNbaV0ucHJpbnQoaW5kZW50ICsgMSwgb3V0cHV0KTsgCisJCQkJdGhpcy5tZXRob2RzW2ldLnByaW50KGluZGVudCArIDEsIG91dHB1dCk7CiAJCQl9CiAJCX0KIAl9CkBAIC04NjAsNyArODkzLDcgQEAKIHB1YmxpYyBTdHJpbmdCdWZmZXIgcHJpbnRIZWFkZXIoaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgewogCXByaW50TW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBvdXRwdXQpOwogCWlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpIHByaW50QW5ub3RhdGlvbnModGhpcy5hbm5vdGF0aW9ucywgb3V0cHV0KTsKLQkKKwogCXN3aXRjaCAoa2luZCh0aGlzLm1vZGlmaWVycykpIHsKIAkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQ0xBU1NfREVDTCA6CiAJCQlvdXRwdXQuYXBwZW5kKCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJApAQCAtODc0LDcgKzkwNyw3IEBACiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkFOTk9UQVRJT05fVFlQRV9ERUNMIDoKIAkJCW91dHB1dC5hcHBlbmQoIkBpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKIAkJCWJyZWFrOwotCX0JCQkKKwl9CiAJb3V0cHV0LmFwcGVuZCh0aGlzLm5hbWUpOwogCWlmICh0aGlzLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJb3V0cHV0LmFwcGVuZCgiPCIpOy8vJE5PTi1OTFMtMSQKQEAgLTg5OCw3ICs5MzEsNyBAQAogCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wgOgogCQkJCW91dHB1dC5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7Ci0JCX0JCQkKKwkJfQogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaSA+IDApIG91dHB1dC5hcHBlbmQoICIsICIpOyAvLyROT04tTkxTLTEkCiAJCQl0aGlzLnN1cGVySW50ZXJmYWNlc1tpXS5wcmludCgwLCBvdXRwdXQpOwpAQCAtOTI5LDgxICs5NjIsODEgQEAKIAkJfQogCQkvLyBjaGVjayBARGVwcmVjYXRlZCBhbm5vdGF0aW9uCiAJCWlmICgoc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uVGFnQml0cygpICYgVGFnQml0cy5Bbm5vdGF0aW9uRGVwcmVjYXRlZCkgPT0gMAotCQkJCSYmIChzb3VyY2VUeXBlLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwIAorCQkJCSYmIChzb3VyY2VUeXBlLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwCiAJCQkJJiYgdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbkZvclR5cGUodGhpcyk7Ci0JCX0JCQkKKwkJfQogCQlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jaykgIT0gMCkgewogCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrKHRoaXMuYm9keVN0YXJ0LTEsIHRoaXMuYm9keUVuZCk7CiAJCX0KLQkJYm9vbGVhbiBuZWVkU2VyaWFsVmVyc2lvbiA9IAorCQlib29sZWFuIG5lZWRTZXJpYWxWZXJzaW9uID0KIAkJCQkJCXRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdTZXJpYWxWZXJzaW9uKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUKLQkJCQkJCSYmIHNvdXJjZVR5cGUuaXNDbGFzcygpIAotCQkJCQkJJiYgIXNvdXJjZVR5cGUuaXNBYnN0cmFjdCgpIAotCQkJCQkJJiYgc291cmNlVHlwZS5maW5kU3VwZXJUeXBlRXJhc2luZ1RvKFR5cGVJZHMuVF9KYXZhSW9FeHRlcm5hbGl6YWJsZSwgZmFsc2UgLypTZXJpYWxpemFibGUgaXMgbm90IGEgY2xhc3MqLykgPT0gbnVsbAotCQkJCQkJJiYgc291cmNlVHlwZS5maW5kU3VwZXJUeXBlRXJhc2luZ1RvKFR5cGVJZHMuVF9KYXZhSW9TZXJpYWxpemFibGUsIGZhbHNlIC8qU2VyaWFsaXphYmxlIGlzIG5vdCBhIGNsYXNzKi8pICE9IG51bGw7CisJCQkJCQkmJiBzb3VyY2VUeXBlLmlzQ2xhc3MoKQorCQkJCQkJJiYgc291cmNlVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhSW9FeHRlcm5hbGl6YWJsZSwgZmFsc2UgLypFeHRlcm5hbGl6YWJsZSBpcyBub3QgYSBjbGFzcyovKSA9PSBudWxsCisJCQkJCQkmJiBzb3VyY2VUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFJb1NlcmlhbGl6YWJsZSwgZmFsc2UgLypTZXJpYWxpemFibGUgaXMgbm90IGEgY2xhc3MqLykgIT0gbnVsbDsKIAogCQlpZiAobmVlZFNlcmlhbFZlcnNpb24pIHsKIAkJCS8vIGlmIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gaXMgcHJlc2VudCwgdGhlbiBubyBzZXJpYWxWZXJzaW9uVUlEIGlzIG5lZWRlZAogCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE0NzYKLSAgICAJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIGNvbXBpbGF0aW9uVW5pdFNjb3BlID0gdGhpcy5zY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpOwotCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gc291cmNlVHlwZS5nZXRFeGFjdE1ldGhvZChUeXBlQ29uc3RhbnRzLldSSVRFUkVQTEFDRSwgbmV3IFR5cGVCaW5kaW5nWzBdLCBjb21waWxhdGlvblVuaXRTY29wZSk7Ci0gICAJCQlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3dzRXhjZXB0aW9uczsKLQkJCW5lZWRTZXJpYWxWZXJzaW9uID0gCisJCQlDb21waWxhdGlvblVuaXRTY29wZSBjb21waWxhdGlvblVuaXRTY29wZSA9IHRoaXMuc2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKTsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHNvdXJjZVR5cGUuZ2V0RXhhY3RNZXRob2QoVHlwZUNvbnN0YW50cy5XUklURVJFUExBQ0UsIEJpbmRpbmcuTk9fVFlQRVMsIGNvbXBpbGF0aW9uVW5pdFNjb3BlKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd3NFeGNlcHRpb25zOworCQkJbmVlZFNlcmlhbFZlcnNpb24gPQogCQkJCW1ldGhvZEJpbmRpbmcgPT0gbnVsbAotICAgIAkJCQl8fCAhbWV0aG9kQmluZGluZy5pc1ZhbGlkQmluZGluZygpCi0gICAgCQkJCXx8IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QKLSAgICAJCQkJfHwgKHRocm93c0V4Y2VwdGlvbnMgPSBtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpLmxlbmd0aCAhPSAxCi0gICAgCQkJCXx8IHRocm93c0V4Y2VwdGlvbnNbMF0uaWQgIT0gVHlwZUlkcy5UX0phdmFJb09iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLSAgICAJCWlmIChuZWVkU2VyaWFsVmVyc2lvbikgewotICAgIAkJCS8vIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kcwotICAgIAkJCS8vIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIAkJCS8vIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAJCQlib29sZWFuIGhhc1dyaXRlT2JqZWN0TWV0aG9kID0gZmFsc2U7Ci0gICAgCQkJYm9vbGVhbiBoYXNSZWFkT2JqZWN0TWV0aG9kID0gZmFsc2U7Ci0gICAgCQkJVHlwZUJpbmRpbmcgYXJndW1lbnRUeXBlQmluZGluZyA9IHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfSU9fT0JKRUNUT1VUUFVUU1RSRUFNLCAzKTsKLSAgICAgCQkJaWYgKGFyZ3VtZW50VHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotICAgICAgICAgICAgCQltZXRob2RCaW5kaW5nID0gc291cmNlVHlwZS5nZXRFeGFjdE1ldGhvZChUeXBlQ29uc3RhbnRzLldSSVRFT0JKRUNULCBuZXcgVHlwZUJpbmRpbmdbXSB7IGFyZ3VtZW50VHlwZUJpbmRpbmcgfSwgY29tcGlsYXRpb25Vbml0U2NvcGUpOwotICAgICAgICAgICAgCQloYXNXcml0ZU9iamVjdE1ldGhvZCA9IG1ldGhvZEJpbmRpbmcgIT0gbnVsbAotICAgICAgICAgICAgCQkJCSYmIG1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKQotICAgICAgICAgICAgCQkJCSYmIG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlCi0gICAgICAgICAgICAJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlID09IFR5cGVCaW5kaW5nLlZPSUQKLSAgICAgICAgICAgIAkJCQkmJiAodGhyb3dzRXhjZXB0aW9ucyA9IG1ldGhvZEJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoID09IDEKLSAgICAgICAgICAgIAkJCQkmJiB0aHJvd3NFeGNlcHRpb25zWzBdLmlkID09IFR5cGVJZHMuVF9KYXZhSW9FeGNlcHRpb247Ci0gICAgCQkJfQotICAgIAkJCWFyZ3VtZW50VHlwZUJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0lPX09CSkVDVElOUFVUU1RSRUFNLCAzKTsKLSAgICAgCQkJaWYgKGFyZ3VtZW50VHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotICAgICAgICAgICAgCQltZXRob2RCaW5kaW5nID0gc291cmNlVHlwZS5nZXRFeGFjdE1ldGhvZChUeXBlQ29uc3RhbnRzLlJFQURPQkpFQ1QsIG5ldyBUeXBlQmluZGluZ1tdIHsgYXJndW1lbnRUeXBlQmluZGluZyB9LCBjb21waWxhdGlvblVuaXRTY29wZSk7Ci0gICAgICAgICAgICAJCWhhc1JlYWRPYmplY3RNZXRob2QgPSBtZXRob2RCaW5kaW5nICE9IG51bGwKLSAgICAgICAgICAgIAkJCQkmJiBtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkKLSAgICAgICAgICAgIAkJCQkmJiBtZXRob2RCaW5kaW5nLm1vZGlmaWVycyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZQotICAgICAgICAgICAgCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSA9PSBUeXBlQmluZGluZy5WT0lECi0gICAgICAgICAgICAJCQkJJiYgKHRocm93c0V4Y2VwdGlvbnMgPSBtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpLmxlbmd0aCA9PSAxCi0gICAgICAgICAgICAJCQkJJiYgdGhyb3dzRXhjZXB0aW9uc1swXS5pZCA9PSBUeXBlSWRzLlRfSmF2YUlvRXhjZXB0aW9uOwotICAgIAkJCX0KLSAgICAJCQluZWVkU2VyaWFsVmVyc2lvbiA9ICFoYXNXcml0ZU9iamVjdE1ldGhvZCB8fCAhaGFzUmVhZE9iamVjdE1ldGhvZDsKLSAgICAJCX0KKwkJCQkJfHwgIW1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKQorCQkJCQl8fCBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0CisJCQkJCXx8ICh0aHJvd3NFeGNlcHRpb25zID0gbWV0aG9kQmluZGluZy50aHJvd25FeGNlcHRpb25zKS5sZW5ndGggIT0gMQorCQkJCQl8fCB0aHJvd3NFeGNlcHRpb25zWzBdLmlkICE9IFR5cGVJZHMuVF9KYXZhSW9PYmplY3RTdHJlYW1FeGNlcHRpb247CisJCQlpZiAobmVlZFNlcmlhbFZlcnNpb24pIHsKKwkJCQkvLyBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKKwkJCQkvLyBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKwkJCQkvLyBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisJCQkJYm9vbGVhbiBoYXNXcml0ZU9iamVjdE1ldGhvZCA9IGZhbHNlOworCQkJCWJvb2xlYW4gaGFzUmVhZE9iamVjdE1ldGhvZCA9IGZhbHNlOworCQkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50VHlwZUJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0lPX09CSkVDVE9VVFBVVFNUUkVBTSwgMyk7CisJCQkJaWYgKGFyZ3VtZW50VHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQltZXRob2RCaW5kaW5nID0gc291cmNlVHlwZS5nZXRFeGFjdE1ldGhvZChUeXBlQ29uc3RhbnRzLldSSVRFT0JKRUNULCBuZXcgVHlwZUJpbmRpbmdbXSB7IGFyZ3VtZW50VHlwZUJpbmRpbmcgfSwgY29tcGlsYXRpb25Vbml0U2NvcGUpOworCQkJCQloYXNXcml0ZU9iamVjdE1ldGhvZCA9IG1ldGhvZEJpbmRpbmcgIT0gbnVsbAorCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKQorCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlCisJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlID09IFR5cGVCaW5kaW5nLlZPSUQKKwkJCQkJCQkmJiAodGhyb3dzRXhjZXB0aW9ucyA9IG1ldGhvZEJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoID09IDEKKwkJCQkJCQkmJiB0aHJvd3NFeGNlcHRpb25zWzBdLmlkID09IFR5cGVJZHMuVF9KYXZhSW9FeGNlcHRpb247CisJCQkJfQorCQkJCWFyZ3VtZW50VHlwZUJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0lPX09CSkVDVElOUFVUU1RSRUFNLCAzKTsKKwkJCQlpZiAoYXJndW1lbnRUeXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCW1ldGhvZEJpbmRpbmcgPSBzb3VyY2VUeXBlLmdldEV4YWN0TWV0aG9kKFR5cGVDb25zdGFudHMuUkVBRE9CSkVDVCwgbmV3IFR5cGVCaW5kaW5nW10geyBhcmd1bWVudFR5cGVCaW5kaW5nIH0sIGNvbXBpbGF0aW9uVW5pdFNjb3BlKTsKKwkJCQkJaGFzUmVhZE9iamVjdE1ldGhvZCA9IG1ldGhvZEJpbmRpbmcgIT0gbnVsbAorCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKQorCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlCisJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlID09IFR5cGVCaW5kaW5nLlZPSUQKKwkJCQkJCQkmJiAodGhyb3dzRXhjZXB0aW9ucyA9IG1ldGhvZEJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoID09IDEKKwkJCQkJCQkmJiB0aHJvd3NFeGNlcHRpb25zWzBdLmlkID09IFR5cGVJZHMuVF9KYXZhSW9FeGNlcHRpb247CisJCQkJfQorCQkJCW5lZWRTZXJpYWxWZXJzaW9uID0gIWhhc1dyaXRlT2JqZWN0TWV0aG9kIHx8ICFoYXNSZWFkT2JqZWN0TWV0aG9kOworCQkJfQogCQl9CiAJCS8vIGdlbmVyaWNzIChhbmQgbm9uIHN0YXRpYyBnZW5lcmljIG1lbWJlcnMpIGNhbm5vdCBleHRlbmQgVGhyb3dhYmxlCi0JCWlmIChzb3VyY2VUeXBlLmZpbmRTdXBlclR5cGVFcmFzaW5nVG8oVHlwZUlkcy5UX0phdmFMYW5nVGhyb3dhYmxlLCB0cnVlKSAhPSBudWxsKSB7CisJCWlmIChzb3VyY2VUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFMYW5nVGhyb3dhYmxlLCB0cnVlKSAhPSBudWxsKSB7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnQgPSBzb3VyY2VUeXBlOwogCQkJY2hlY2tFbmNsb3NlZEluR2VuZXJpYyA6IGRvIHsKIAkJCQlpZiAoY3VycmVudC5pc0dlbmVyaWNUeXBlKCkpIHsKIAkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5nZW5lcmljVHlwZUNhbm5vdEV4dGVuZFRocm93YWJsZSh0aGlzKTsKLQkJCQkJYnJlYWsgY2hlY2tFbmNsb3NlZEluR2VuZXJpYzsJCQkJCQkKKwkJCQkJYnJlYWsgY2hlY2tFbmNsb3NlZEluR2VuZXJpYzsKIAkJCQl9CiAJCQkJaWYgKGN1cnJlbnQuaXNTdGF0aWMoKSkgYnJlYWsgY2hlY2tFbmNsb3NlZEluR2VuZXJpYzsKIAkJCQlpZiAoY3VycmVudC5pc0xvY2FsVHlwZSgpKSB7CiAJCQkJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGN1cnJlbnQuZXJhc3VyZSgpOwogCQkJCQlpZiAobmVzdGVkVHlwZS5zY29wZS5tZXRob2RTY29wZSgpLmlzU3RhdGljKSBicmVhayBjaGVja0VuY2xvc2VkSW5HZW5lcmljOwotCQkJCX0JCQkJCisJCQkJfQogCQkJfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LmVuY2xvc2luZ1R5cGUoKSkgIT0gbnVsbCk7CiAJCX0KLQkJdGhpcy5tYXhGaWVsZENvdW50ID0gMDsKKwkJLy8gdGhpcy5tYXhGaWVsZENvdW50IG1pZ2h0IGFscmVhZHkgYmUgc2V0CisJCWludCBsb2NhbE1heEZpZWxkQ291bnQgPSAwOwogCQlpbnQgbGFzdFZpc2libGVGaWVsZElEID0gLTE7CiAJCWJvb2xlYW4gaGFzRW51bUNvbnN0YW50cyA9IGZhbHNlOwotCQlib29sZWFuIGhhc0VudW1Db25zdGFudHNXaXRob3V0Qm9keSA9IGZhbHNlOwotCQkKKwkJRmllbGREZWNsYXJhdGlvbltdIGVudW1Db25zdGFudHNXaXRob3V0Qm9keSA9IG51bGw7CisKIAkJaWYgKHRoaXMudHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJdGhpcy50eXBlUGFyYW1ldGVyc1tpXS5yZXNvbHZlKHRoaXMuc2NvcGUpOwpAQCAtMTAyMCw4ICsxMDUzLDEyIEBACiAJCQkJc3dpdGNoKGZpZWxkLmdldEtpbmQoKSkgewogCQkJCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UOgogCQkJCQkJaGFzRW51bUNvbnN0YW50cyA9IHRydWU7Ci0JCQkJCQlpZiAoIShmaWVsZC5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSkKLQkJCQkJCQloYXNFbnVtQ29uc3RhbnRzV2l0aG91dEJvZHkgPSB0cnVlOworCQkJCQkJaWYgKCEoZmllbGQuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikpIHsKKwkJCQkJCQlpZiAoZW51bUNvbnN0YW50c1dpdGhvdXRCb2R5ID09IG51bGwpCisJCQkJCQkJCWVudW1Db25zdGFudHNXaXRob3V0Qm9keSA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW2NvdW50XTsKKwkJCQkJCQllbnVtQ29uc3RhbnRzV2l0aG91dEJvZHlbaV0gPSBmaWVsZDsKKwkJCQkJCX0KKwkJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJY2FzZSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRklFTEQ6CiAJCQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gZmllbGQuYmluZGluZzsKIAkJCQkJCWlmIChmaWVsZEJpbmRpbmcgPT0gbnVsbCkgewpAQCAtMTAzNiw3ICsxMDczLDcgQEAKIAkJCQkJCQkJJiYgVHlwZUJpbmRpbmcuTE9ORyA9PSBmaWVsZEJpbmRpbmcudHlwZSkgewogCQkJCQkJCW5lZWRTZXJpYWxWZXJzaW9uID0gZmFsc2U7CiAJCQkJCQl9Ci0JCQkJCQl0aGlzLm1heEZpZWxkQ291bnQrKzsKKwkJCQkJCWxvY2FsTWF4RmllbGRDb3VudCsrOwogCQkJCQkJbGFzdFZpc2libGVGaWVsZElEID0gZmllbGQuYmluZGluZy5pZDsKIAkJCQkJCWJyZWFrOwogCkBAIC0xMDQ3LDkgKzEwODQsMjcgQEAKIAkJCQlmaWVsZC5yZXNvbHZlKGZpZWxkLmlzU3RhdGljKCkgPyB0aGlzLnN0YXRpY0luaXRpYWxpemVyU2NvcGUgOiB0aGlzLmluaXRpYWxpemVyU2NvcGUpOwogCQkJfQogCQl9Ci0JCWlmIChuZWVkU2VyaWFsVmVyc2lvbikgewotCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nU2VyaWFsVmVyc2lvbih0aGlzKTsKKwkJaWYgKHRoaXMubWF4RmllbGRDb3VudCA8IGxvY2FsTWF4RmllbGRDb3VudCkgeworCQkJdGhpcy5tYXhGaWVsZENvdW50ID0gbG9jYWxNYXhGaWVsZENvdW50OwogCQl9CisJCWlmIChuZWVkU2VyaWFsVmVyc2lvbikgeworCQkJLy9jaGVjayB0aGF0IHRoZSBjdXJyZW50IHR5cGUgZG9lc24ndCBleHRlbmQgamF2YXgucm1pLkNPUkJBLlN0dWIKKwkJCVR5cGVCaW5kaW5nIGphdmF4Um1pQ29yYmFTdHViID0gdGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQVhfUk1JX0NPUkJBX1NUVUIsIDQpOworCQkJaWYgKGphdmF4Um1pQ29yYmFTdHViLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3NCaW5kaW5nID0gdGhpcy5iaW5kaW5nLnN1cGVyY2xhc3M7CisJCQkJbG9vcDogd2hpbGUgKHN1cGVyY2xhc3NCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJaWYgKHN1cGVyY2xhc3NCaW5kaW5nID09IGphdmF4Um1pQ29yYmFTdHViKSB7CisJCQkJCQluZWVkU2VyaWFsVmVyc2lvbiA9IGZhbHNlOworCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJfQorCQkJCQlzdXBlcmNsYXNzQmluZGluZyA9IHN1cGVyY2xhc3NCaW5kaW5nLnN1cGVyY2xhc3MoKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobmVlZFNlcmlhbFZlcnNpb24pIHsKKwkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdTZXJpYWxWZXJzaW9uKHRoaXMpOworCQkJfQorCQl9CisKIAkJLy8gY2hlY2sgZXh0ZW5kcy9pbXBsZW1lbnRzIGZvciBhbm5vdGF0aW9uIHR5cGUKIAkJc3dpdGNoKGtpbmQodGhpcy5tb2RpZmllcnMpKSB7CiAJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCA6CkBAIC0xMDU4LDIzICsxMTEzLDMxIEBACiAJCQkJfQogCQkJCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CiAJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkNhbm5vdEhhdmVTdXBlcmludGVyZmFjZXModGhpcyk7Ci0JCQkJfQkJCisJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uRU5VTV9ERUNMIDoKIAkJCQkvLyBjaGVjayBlbnVtIGFic3RyYWN0IG1ldGhvZHMKIAkJCQlpZiAodGhpcy5iaW5kaW5nLmlzQWJzdHJhY3QoKSkgewotCQkJCQlpZiAoIWhhc0VudW1Db25zdGFudHMgfHwgaGFzRW51bUNvbnN0YW50c1dpdGhvdXRCb2R5KSB7CisJCQkJCWlmICghaGFzRW51bUNvbnN0YW50cykgeworCQkJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJCQlmaW5hbCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gdGhpcy5tZXRob2RzW2ldOworCQkJCQkJCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0Fic3RyYWN0KCkgJiYgbWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyAhPSBudWxsKQorCQkJCQkJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVudW1BYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChlbnVtQ29uc3RhbnRzV2l0aG91dEJvZHkgIT0gbnVsbCkgewogCQkJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQkJCQlmaW5hbCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gdGhpcy5tZXRob2RzW2ldOwogCQkJCQkJCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0Fic3RyYWN0KCkgJiYgbWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZW51bUFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQobWV0aG9kRGVjbGFyYXRpb24pOworCQkJCQkJCQlmb3IgKGludCBmID0gMCwgbCA9IGVudW1Db25zdGFudHNXaXRob3V0Qm9keS5sZW5ndGg7IGYgPCBsOyBmKyspCisJCQkJCQkJCQlpZiAoZW51bUNvbnN0YW50c1dpdGhvdXRCb2R5W2ZdICE9IG51bGwpCisJCQkJCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lbnVtQ29uc3RhbnRNdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2QobWV0aG9kRGVjbGFyYXRpb24sIGVudW1Db25zdGFudHNXaXRob3V0Qm9keVtmXSk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9Ci0JCQorCiAJCWludCBtaXNzaW5nQWJzdHJhY3RNZXRob2RzbGVuZ3RoID0gdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzID09IG51bGwgPyAwIDogdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzLmxlbmd0aDsKIAkJaW50IG1ldGhvZHNMZW5ndGggPSB0aGlzLm1ldGhvZHMgPT0gbnVsbCA/IDAgOiB0aGlzLm1ldGhvZHMubGVuZ3RoOwogCQlpZiAoKG1ldGhvZHNMZW5ndGggKyBtaXNzaW5nQWJzdHJhY3RNZXRob2RzbGVuZ3RoKSA+IDB4RkZGRikgewpAQCAtMTA5MSwxMCArMTE1NCwxOSBAQAogCQkJCS8vIGlmIHRoZSB0eXBlIGlzIHBhY2thZ2UtaW5mbywgdGhlIGphdmFkb2Mgd2FzIHJlc29sdmVkIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgamF2YWRvYwogCQkJCXRoaXMuamF2YWRvYy5yZXNvbHZlKHRoaXMuc2NvcGUpOwogCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUgIT0gbnVsbCAmJiAhc291cmNlVHlwZS5pc0xvY2FsVHlwZSgpKSB7Ci0JCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NNaXNzaW5nKHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kLCBzb3VyY2VUeXBlLm1vZGlmaWVycyk7CisJCX0gZWxzZSBpZiAoIXNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQkJLy8gU2V0IGphdmFkb2MgdmlzaWJpbGl0eQorCQkJaW50IHZpc2liaWxpdHkgPSBzb3VyY2VUeXBlLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0s7CisJCQlQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIgPSB0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpOworCQkJaW50IHNldmVyaXR5ID0gcmVwb3J0ZXIuY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLkphdmFkb2NNaXNzaW5nKTsKKwkJCWlmIChzZXZlcml0eSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKKwkJCQlpZiAodGhpcy5lbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKKwkJCQkJdmlzaWJpbGl0eSA9IFV0aWwuY29tcHV0ZU91dGVyTW9zdFZpc2liaWxpdHkodGhpcy5lbmNsb3NpbmdUeXBlLCB2aXNpYmlsaXR5KTsKKwkJCQl9CisJCQkJaW50IGphdmFkb2NNb2RpZmllcnMgPSAodGhpcy5iaW5kaW5nLm1vZGlmaWVycyAmIH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1Zpc2liaWxpdHlNQVNLKSB8IHZpc2liaWxpdHk7CisJCQkJcmVwb3J0ZXIuamF2YWRvY01pc3NpbmcodGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQsIHNldmVyaXR5LCBqYXZhZG9jTW9kaWZpZXJzKTsKKwkJCX0KIAkJfQotCQkKIAl9IGNhdGNoIChBYm9ydFR5cGUgZSkgewogCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKIAkJcmV0dXJuOwpAQCAtMTEwNSw3ICsxMTc3LDcgQEAKICAqIFJlc29sdmUgYSBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uCiAgKi8KIHB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7Ci0JCisKIAkvLyBuZWVkIHRvIGJ1aWxkIGl0cyBzY29wZSBmaXJzdCBhbmQgcHJvY2VlZCB3aXRoIGJpbmRpbmcncyBjcmVhdGlvbgogCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpID09IDApIHsKIAkJLy8gY2hlY2sgY29sbGlzaW9uIHNjZW5hcmlpCkBAIC0xMTE2LDYgKzExODgsMjggQEAKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZXhpc3RpbmdUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGV4aXN0aW5nOwogCQkJaWYgKGV4aXN0aW5nVHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZUJpbmRpbmcpIHsKIAkJCQlibG9ja1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVIaWRpbmcodGhpcywgKFR5cGVWYXJpYWJsZUJpbmRpbmcpIGV4aXN0aW5nVHlwZSk7CisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMjk4OSwgY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGVuY2xvc2luZyB0eXBlLgorCQkJCVNjb3BlIG91dGVyU2NvcGUgPSBibG9ja1Njb3BlLnBhcmVudDsKK2NoZWNrT3V0ZXJTY29wZTp3aGlsZSAob3V0ZXJTY29wZSAhPSBudWxsKSB7CisJCQkJCUJpbmRpbmcgZXhpc3RpbmcyID0gb3V0ZXJTY29wZS5nZXRUeXBlKHRoaXMubmFtZSk7CisJCQkJCWlmIChleGlzdGluZzIgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nICYmIGV4aXN0aW5nMi5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR2YiA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSBleGlzdGluZ1R5cGU7CisJCQkJCQlCaW5kaW5nIGRlY2xhcmluZ0VsZW1lbnQgPSB0dmIuZGVjbGFyaW5nRWxlbWVudDsKKwkJCQkJCWlmIChkZWNsYXJpbmdFbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZworCQkJCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscygoKFJlZmVyZW5jZUJpbmRpbmcpIGRlY2xhcmluZ0VsZW1lbnQpLnNvdXJjZU5hbWUoKSwgdGhpcy5uYW1lKSkgeworCQkJCQkJCWJsb2NrU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNvbGxpZGVzV2l0aEVuY2xvc2luZ1R5cGUodGhpcyk7CisJCQkJCQkJYnJlYWsgY2hlY2tPdXRlclNjb3BlOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGV4aXN0aW5nMiBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcKKwkJCQkJCQkmJiBleGlzdGluZzIuaXNWYWxpZEJpbmRpbmcoKQorCQkJCQkJCSYmIG91dGVyU2NvcGUuaXNEZWZpbmVkSW5UeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBleGlzdGluZzIpKSB7IAorCQkJCQkJCWJsb2NrU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNvbGxpZGVzV2l0aEVuY2xvc2luZ1R5cGUodGhpcyk7CisJCQkJCQkJYnJlYWsgY2hlY2tPdXRlclNjb3BlOworCQkJCQl9IGVsc2UgaWYgKGV4aXN0aW5nMiA9PSBudWxsKSB7CisJCQkJCQlicmVhayBjaGVja091dGVyU2NvcGU7CisJCQkJCX0KKwkJCQkJb3V0ZXJTY29wZSA9IG91dGVyU2NvcGUucGFyZW50OworCQkJCX0KIAkJCX0gZWxzZSBpZiAoZXhpc3RpbmdUeXBlIGluc3RhbmNlb2YgTG9jYWxUeXBlQmluZGluZwogCQkJCQkJJiYgKChMb2NhbFR5cGVCaW5kaW5nKSBleGlzdGluZ1R5cGUpLnNjb3BlLm1ldGhvZFNjb3BlKCkgPT0gYmxvY2tTY29wZS5tZXRob2RTY29wZSgpKSB7CiAJCQkJCS8vIGR1cCBpbiBzYW1lIG1ldGhvZApAQCAtMTEzNCw3ICsxMjI4LDcgQEAKIAlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwpIHsKIAkJLy8gcmVtZW1iZXIgbG9jYWwgdHlwZXMgYmluZGluZyBmb3IgaW5uZXJjbGFzcyBlbXVsYXRpb24gcHJvcGFnYXRpb24KIAkJYmxvY2tTY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5yZWNvcmQoKExvY2FsVHlwZUJpbmRpbmcpdGhpcy5iaW5kaW5nKTsKLQkJCisKIAkJLy8gYmluZGluZyBpcyBub3Qgc2V0IGlmIHRoZSByZWNlaXZlciBjb3VsZCBub3QgYmUgY3JlYXRlZAogCQlyZXNvbHZlKCk7CiAJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKQEAgLTExNzQsOSArMTI2OCw2IEBACiAgKgogICovCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSkgewotCi0JaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCXJldHVybjsKIAl0cnkgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCB1bml0U2NvcGUpKSB7CiAJCQlpZiAodGhpcy5qYXZhZG9jICE9IG51bGwpIHsKQEAgLTExOTksNyArMTI5MCw3IEBACiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQl0aGlzLnR5cGVQYXJhbWV0ZXJzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHRoaXMuc2NvcGUpOwogCQkJCX0KLQkJCX0JCQkJCisJCQl9CiAJCQlpZiAodGhpcy5tZW1iZXJUeXBlcyAhPSBudWxsKSB7CiAJCQkJaW50IGxlbmd0aCA9IHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCkBAIC0xMjMyLDggKzEzMjMsNiBAQAogICoJSXRlcmF0aW9uIGZvciBhIGxvY2FsIGlubmVydHlwZQogICovCiBwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewotCWlmICh0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQotCQlyZXR1cm47CiAJdHJ5IHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKIAkJCWlmICh0aGlzLmphdmFkb2MgIT0gbnVsbCkgewpAQCAtMTI1Niw3ICsxMzQ1LDcgQEAKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMudHlwZVBhcmFtZXRlcnNbaV0udHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQkJfQotCQkJfQkJCQkKKwkJCX0KIAkJCWlmICh0aGlzLm1lbWJlclR5cGVzICE9IG51bGwpIHsKIAkJCQlpbnQgbGVuZ3RoID0gdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKQEAgLTEyOTAsMTIgKzEzNzksMTAgQEAKICAqCiAgKi8KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBjbGFzc1Njb3BlKSB7Ci0JaWYgKHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCXJldHVybjsKIAl0cnkgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBjbGFzc1Njb3BlKSkgewogCQkJaWYgKHRoaXMuamF2YWRvYyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qYXZhZG9jLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQl0aGlzLmphdmFkb2MudHJhdmVyc2UodmlzaXRvciwgdGhpcy5zY29wZSk7CiAJCQl9CiAJCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAJCQkJaW50IGFubm90YXRpb25zTGVuZ3RoID0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGg7CkBAIC0xMzE0LDcgKzE0MDEsNyBAQAogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJdGhpcy50eXBlUGFyYW1ldGVyc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCB0aGlzLnNjb3BlKTsKIAkJCQl9Ci0JCQl9CQkJCQorCQkJfQogCQkJaWYgKHRoaXMubWVtYmVyVHlwZXMgIT0gbnVsbCkgewogCQkJCWludCBsZW5ndGggPSB0aGlzLm1lbWJlclR5cGVzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQpAQCAtMTM0MSw3ICsxNDI4LDcgQEAKIAl9IGNhdGNoIChBYm9ydFR5cGUgZSkgewogCQkvLyBzaWxlbnQgYWJvcnQKIAl9Ci19CQorfQogCiAvKioKICAqIE1heEZpZWxkQ291bnQncyBjb21wdXRhdGlvbiBpcyBuZWNlc3Nhcnkgc28gYXMgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IKQEAgLTEzNjIsNyArMTQ0OSw3IEBACiAJfSBlbHNlIHsKIAkJdGhpcy5tYXhGaWVsZENvdW50ID0gb3V0ZXJNb3N0VHlwZS5tYXhGaWVsZENvdW50OyAvLyBkb3duCiAJfQotfQkKK30KIAogLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBzZWNvbmRhcnkgb25lIG9yIG5vdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZVBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUGFyYW1ldGVyLmphdmEKaW5kZXggMTQwMzIxYy4uMzdlZGFjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUGFyYW1ldGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUGFyYW1ldGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsNyArMzEsNyBAQAogCX0KIAogCXB1YmxpYyB2b2lkIGNoZWNrQm91bmRzKFNjb3BlIHNjb3BlKSB7Ci0JCQorCiAJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgewogCQkJdGhpcy50eXBlLmNoZWNrQm91bmRzKHNjb3BlKTsKIAkJfQpAQCAtNDEsMjQgKzQxLDI0IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZXNvbHZlKFNjb3BlIHNjb3BlLCBib29sZWFuIHN0YXRpY0NvbnRleHQpIHsKIAkgICAgLy8gZGV0ZWN0IHZhcmlhYmxlL3R5cGUgbmFtZSBjb2xsaXNpb25zCiAJCWlmICh0aGlzLmJpbmRpbmcgIT0gbnVsbCkgewogCQkJQmluZGluZyBleGlzdGluZ1R5cGUgPSBzY29wZS5wYXJlbnQuZ2V0QmluZGluZyh0aGlzLm5hbWUsIEJpbmRpbmcuVFlQRSwgdGhpcywgZmFsc2UvKmRvIG5vdCByZXNvbHZlIGhpZGRlbiBmaWVsZCovKTsKLQkJCWlmIChleGlzdGluZ1R5cGUgIT0gbnVsbCAKLQkJCQkJJiYgdGhpcy5iaW5kaW5nICE9IGV4aXN0aW5nVHlwZSAKKwkJCWlmIChleGlzdGluZ1R5cGUgIT0gbnVsbAorCQkJCQkmJiB0aGlzLmJpbmRpbmcgIT0gZXhpc3RpbmdUeXBlCiAJCQkJCSYmIGV4aXN0aW5nVHlwZS5pc1ZhbGlkQmluZGluZygpCiAJCQkJCSYmIChleGlzdGluZ1R5cGUua2luZCgpICE9IEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgfHwgIXN0YXRpY0NvbnRleHQpKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUhpZGluZyh0aGlzLCBleGlzdGluZ1R5cGUpOwogCQkJfQogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCWludGVybmFsUmVzb2x2ZShzY29wZSwgc2NvcGUubWV0aG9kU2NvcGUoKS5pc1N0YXRpYyk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZShDbGFzc1Njb3BlIHNjb3BlKSB7CiAJCWludGVybmFsUmVzb2x2ZShzY29wZSwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmlzU3RhdGljKCkpOwogCX0KQEAgLTgwLDE3ICs4MCwxNyBAQAogCQl9CiAJCXJldHVybiBvdXRwdXQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKIAkgICAgLy8gbm90aGluZyB0byBkbwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeworCQkJCXRoaXMudHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCQl9Ci0JCQlpZiAoYm91bmRzICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLmJvdW5kcyAhPSBudWxsKSB7CiAJCQkJaW50IGJvdW5kc0xlbmd0aCA9IHRoaXMuYm91bmRzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kc0xlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMuYm91bmRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKQEAgLTEwMiwxMCArMTAyLDEwIEBACiAKIAlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHsKKwkJCQl0aGlzLnR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOwogCQkJfQotCQkJaWYgKGJvdW5kcyAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5ib3VuZHMgIT0gbnVsbCkgewogCQkJCWludCBib3VuZHNMZW5ndGggPSB0aGlzLmJvdW5kcy5sZW5ndGg7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHNMZW5ndGg7IGkrKykgewogCQkJCQl0aGlzLmJvdW5kc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CkBAIC0xMTMsNSArMTEzLDUgQEAKIAkJCX0KIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLQl9CQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggYmViMWZlMS4uN2IwN2NiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMiwyNSArMjIsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAotcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQlyZXR1cm4gZmxvd0luZm87Ci19Ci0KLS8vIGFsbG93cyB1cyB0byB0cmFwIGNvbXBsZXRpb24gJiBzZWxlY3Rpb24gbm9kZXMKLXB1YmxpYyB2b2lkIGFib3V0VG9SZXNvbHZlKFNjb3BlIHNjb3BlKSB7Ci0JLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVJlZmVyZW5jZVtdIE5PX1RZUEVfQVJHVU1FTlRTID0gbmV3IFR5cGVSZWZlcmVuY2VbMF07CiAvKgogICogQW5zd2VyIGEgYmFzZSB0eXBlIHJlZmVyZW5jZSAoY2FuIGJlIGFuIGFycmF5IG9mIGJhc2UgdHlwZSkuCiAgKi8KIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVJlZmVyZW5jZSBiYXNlVHlwZVJlZmVyZW5jZShpbnQgYmFzZVR5cGUsIGludCBkaW0pIHsKLQkKKwogCWlmIChkaW0gPT0gMCkgewogCQlzd2l0Y2ggKGJhc2VUeXBlKSB7CiAJCQljYXNlIChUeXBlSWRzLlRfdm9pZCkgOgpAQCAtNTksNyArNTMsNyBAQAogCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5TSE9SVC5zaW1wbGVOYW1lLCAwKTsKIAkJCWNhc2UgKFR5cGVJZHMuVF9pbnQpIDoKIAkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuSU5ULnNpbXBsZU5hbWUsIDApOwotCQkJZGVmYXVsdCA6IC8vVF9sb25nCQorCQkJZGVmYXVsdCA6IC8vVF9sb25nCiAJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkxPTkcuc2ltcGxlTmFtZSwgMCk7CiAJCX0KIAl9CkBAIC04MCwxMCArNzQsMTggQEAKIAkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLlNIT1JULnNpbXBsZU5hbWUsIGRpbSwgMCk7CiAJCWNhc2UgKFR5cGVJZHMuVF9pbnQpIDoKIAkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLklOVC5zaW1wbGVOYW1lLCBkaW0sIDApOwotCQlkZWZhdWx0IDogLy9UX2xvbmcJCisJCWRlZmF1bHQgOiAvL1RfbG9uZwogCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuTE9ORy5zaW1wbGVOYW1lLCBkaW0sIDApOwogCX0KIH0KKworLy8gYWxsb3dzIHVzIHRvIHRyYXAgY29tcGxldGlvbiAmIHNlbGVjdGlvbiBub2RlcworcHVibGljIHZvaWQgYWJvdXRUb1Jlc29sdmUoU2NvcGUgc2NvcGUpIHsKKwkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCit9CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCXJldHVybiBmbG93SW5mbzsKK30KIHB1YmxpYyB2b2lkIGNoZWNrQm91bmRzKFNjb3BlIHNjb3BlKSB7CiAJLy8gb25seSBwYXJhbWV0ZXJpemVkIHR5cGUgcmVmZXJlbmNlcyBoYXZlIGJvdW5kcwogfQpAQCAtMTA2LDE5ICsxMDgsOTIgQEAKICAqIEByZXR1cm4gY2hhcltdW10KICAqLwogcHVibGljIGFic3RyYWN0IGNoYXIgW11bXSBnZXRUeXBlTmFtZSgpIDsKKworcHJvdGVjdGVkIFR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZVR5cGUoU2NvcGUgc2NvcGUpIHsKKwkvLyBoYW5kbGUgdGhlIGVycm9yIGhlcmUKKwl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHRoaXMucmVzb2x2ZWRUeXBlLnByb2JsZW1JZCgpKSB7CisJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCA6CisJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlIDoKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJCQlUeXBlQmluZGluZyB0eXBlID0gdGhpcy5yZXNvbHZlZFR5cGUuY2xvc2VzdE1hdGNoKCk7CisJCQkJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCQkJCQlyZXR1cm4gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCX0KKwlib29sZWFuIGhhc0Vycm9yOworCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKKwlpZiAodHlwZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOyAvLyBkZXRlY3RlZCBjeWNsZSB3aGlsZSByZXNvbHZpbmcgaGllcmFyY2h5CisJfSBlbHNlIGlmICgoaGFzRXJyb3IgPSAhdHlwZS5pc1ZhbGlkQmluZGluZygpKSA9PSB0cnVlKSB7CisJCXJlcG9ydEludmFsaWRUeXBlKHNjb3BlKTsKKwkJc3dpdGNoICh0eXBlLnByb2JsZW1JZCgpKSB7CisJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6CisJCQljYXNlIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJCXR5cGUgPSB0eXBlLmNsb3Nlc3RNYXRjaCgpOworCQkJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJaWYgKHR5cGUuaXNBcnJheVR5cGUoKSAmJiAoKEFycmF5QmluZGluZykgdHlwZSkubGVhZkNvbXBvbmVudFR5cGUgPT0gVHlwZUJpbmRpbmcuVk9JRCkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RBbGxvY2F0ZVZvaWRBcnJheSh0aGlzKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmICghKHRoaXMgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSAgIC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UjZ2V0VHlwZUJpbmRpbmcgY2FsbGVkIGFib3ZlIHdpbGwgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZGVwcmVjYXRpb24KKwkJCSYmIGlzVHlwZVVzZURlcHJlY2F0ZWQodHlwZSwgc2NvcGUpKSB7CisJCXJlcG9ydERlcHJlY2F0ZWRUeXBlKHR5cGUsIHNjb3BlKTsKKwl9CisJdHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0eXBlLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKKwlpZiAodHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpCisJCQkmJiAodGhpcy5iaXRzICYgQVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2spID09IDAKKwkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5SYXdUeXBlUmVmZXJlbmNlKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmF3VHlwZVJlZmVyZW5jZSh0aGlzLCB0eXBlKTsKKwl9CisJaWYgKGhhc0Vycm9yKSB7CisJCS8vIGRvIG5vdCBzdG9yZSB0aGUgY29tcHV0ZWQgdHlwZSwga2VlcCB0aGUgcHJvYmxlbSB0eXBlIGluc3RlYWQKKwkJcmV0dXJuIHR5cGU7CisJfQorCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGU7Cit9CiBwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZWZlcmVuY2UoKSB7CiAJcmV0dXJuIHRydWU7CiB9CisKK3Byb3RlY3RlZCB2b2lkIHJlcG9ydERlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlLCBpbnQgaW5kZXgpIHsKKwlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0eXBlLCB0aGlzLCBpbmRleCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHJlcG9ydERlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlKSB7CisJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUodHlwZSwgdGhpcywgSW50ZWdlci5NQVhfVkFMVUUpOworfQorCitwcm90ZWN0ZWQgdm9pZCByZXBvcnRJbnZhbGlkVHlwZShTY29wZSBzY29wZSkgeworCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIHRoaXMucmVzb2x2ZWRUeXBlKTsKK30KKwogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVTdXBlclR5cGUoQ2xhc3NTY29wZSBzY29wZSkgewogCS8vIGFzc3VtZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHJlc29sdmVUeXBlKENsYXNzU2NvcGUpIHdpbGwgY2FsbCBiYWNrIHRvIGRldGVjdCBjeWNsZXMKLQlpZiAocmVzb2x2ZVR5cGUoc2NvcGUpID09IG51bGwpIHJldHVybiBudWxsOworCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IHJlc29sdmVUeXBlKHNjb3BlKTsKKwlpZiAoc3VwZXJUeXBlID09IG51bGwpIHJldHVybiBudWxsOwogCi0JaWYgKHRoaXMucmVzb2x2ZWRUeXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKLQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoZ2V0VHlwZU5hbWUoKSwgKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlLCBQcm9ibGVtUmVhc29ucy5JbGxlZ2FsU3VwZXJUeXBlVmFyaWFibGUpOwotCQlyZXBvcnRJbnZhbGlkVHlwZShzY29wZSk7CisJaWYgKHN1cGVyVHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQl0aGlzLnJlc29sdmVkVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhnZXRUeXBlTmFtZSgpLCAoUmVmZXJlbmNlQmluZGluZyl0aGlzLnJlc29sdmVkVHlwZSwgUHJvYmxlbVJlYXNvbnMuSWxsZWdhbFN1cGVyVHlwZVZhcmlhYmxlKTsKKwkJCXJlcG9ydEludmFsaWRUeXBlKHNjb3BlKTsKKwkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOworCXJldHVybiBzdXBlclR5cGU7CiB9CiAKIHB1YmxpYyBmaW5hbCBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKQEAgLTEyNiw2MSArMjAxLDExIEBACiB9CiAKIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIGNoZWNrQm91bmRzKSB7Ci0JLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCi0JdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgLy8gaXMgYSBzaGFyZWQgdHlwZSByZWZlcmVuY2Ugd2hpY2ggd2FzIGFscmVhZHkgcmVzb2x2ZWQKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgPyB0aGlzLnJlc29sdmVkVHlwZSA6IG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKLQotCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKLQlpZiAodHlwZSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsgLy8gZGV0ZWN0ZWQgY3ljbGUgd2hpbGUgcmVzb2x2aW5nIGhpZXJhcmNoeQkKLQlpZiAoIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewotCQlyZXBvcnRJbnZhbGlkVHlwZShzY29wZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlpZiAodHlwZS5pc0FycmF5VHlwZSgpICYmICgoQXJyYXlCaW5kaW5nKSB0eXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBUeXBlQmluZGluZy5WT0lEKSB7Ci0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFsbG9jYXRlVm9pZEFycmF5KHRoaXMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCh0eXBlLCBzY29wZSkpCi0JCXJlcG9ydERlcHJlY2F0ZWRUeXBlKHR5cGUsIHNjb3BlKTsKLQkKLQl0eXBlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGUpOwotCWlmICh0eXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkgCi0JCQkmJiAodGhpcy5iaXRzICYgQVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2spID09IDAgCi0JCQkmJiBzY29wZS5jb21waWxlck9wdGlvbnMoKS5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZSkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CQotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yYXdUeXBlUmVmZXJlbmNlKHRoaXMsIHR5cGUpOwotCX0JCQkKLQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB0eXBlOworCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKHNjb3BlKTsKIH0KLXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JLy8gaGFuZGxlIHRoZSBlcnJvciBoZXJlCi0JdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKLQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgLy8gaXMgYSBzaGFyZWQgdHlwZSByZWZlcmVuY2Ugd2hpY2ggd2FzIGFscmVhZHkgcmVzb2x2ZWQKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkgPyB0aGlzLnJlc29sdmVkVHlwZSA6IG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKIAotCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKLQlpZiAodHlwZSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsgLy8gZGV0ZWN0ZWQgY3ljbGUgd2hpbGUgcmVzb2x2aW5nIGhpZXJhcmNoeQkKLQlpZiAoIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewotCQlyZXBvcnRJbnZhbGlkVHlwZShzY29wZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlpZiAodHlwZS5pc0FycmF5VHlwZSgpICYmICgoQXJyYXlCaW5kaW5nKSB0eXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBUeXBlQmluZGluZy5WT0lEKSB7Ci0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFsbG9jYXRlVm9pZEFycmF5KHRoaXMpOwotCQlyZXR1cm4gbnVsbDsKLQl9CQotCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHR5cGUsIHNjb3BlKSkKLQkJcmVwb3J0RGVwcmVjYXRlZFR5cGUodHlwZSwgc2NvcGUpOwotCQotCXR5cGUgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUodHlwZSk7Ci0JaWYgKHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1Jhd1R5cGUoKSAKLQkJCSYmICh0aGlzLmJpdHMgJiBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjaykgPT0gMCAKLQkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5SYXdUeXBlUmVmZXJlbmNlKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKLQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmF3VHlwZVJlZmVyZW5jZSh0aGlzLCB0eXBlKTsKLQl9CQkJCi0JcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdHlwZTsJCitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQ2xhc3NTY29wZSBzY29wZSkgeworCXJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKHNjb3BlKTsKIH0KIAogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlQXJndW1lbnQoQmxvY2tTY29wZSBibG9ja1Njb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlLCBpbnQgcmFuaykgewpAQCAtMTg4LDE1ICsyMTMsMjUgQEAKIH0KIAogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlQXJndW1lbnQoQ2xhc3NTY29wZSBjbGFzc1Njb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlLCBpbnQgcmFuaykgewotICAgIHJldHVybiByZXNvbHZlVHlwZShjbGFzc1Njb3BlKTsKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0MDU3LCBjaXJjdWxhcml0eSBpcyBhbGxvd2VkIHdoZW4gd2UgYXJlCisJLy8gcmVzb2x2aW5nIHR5cGUgYXJndW1lbnRzIGkuZSBpbnRlcmZhY2UgQTxUIGV4dGVuZHMgQz4ge30JaW50ZXJmYWNlIEIgZXh0ZW5kcyBBPEQ+IHt9CisJLy8gaW50ZXJmYWNlIEQgZXh0ZW5kcyBDIHt9CWludGVyZmFjZSBDIGV4dGVuZHMgQiB7fQorCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJYm9vbGVhbiBwYXVzZUhpZXJhcmNoeUNoZWNrID0gZmFsc2U7CisJdHJ5IHsKKwkJaWYgKHJlZi5pc0hpZXJhcmNoeUJlaW5nQ29ubmVjdGVkKCkpIHsKKwkJCXJlZi50YWdCaXRzIHw9IFRhZ0JpdHMuUGF1c2VIaWVyYXJjaHlDaGVjazsKKwkJCXBhdXNlSGllcmFyY2h5Q2hlY2sgPSB0cnVlOworCQl9CisJICAgIHJldHVybiByZXNvbHZlVHlwZShjbGFzc1Njb3BlKTsKKwl9IGZpbmFsbHkgeworCQlpZiAocGF1c2VIaWVyYXJjaHlDaGVjaykgeworCQkJcmVmLnRhZ0JpdHMgJj0gflRhZ0JpdHMuUGF1c2VIaWVyYXJjaHlDaGVjazsKKwkJfQorCX0KIH0KLQkKLXByb3RlY3RlZCB2b2lkIHJlcG9ydEludmFsaWRUeXBlKFNjb3BlIHNjb3BlKSB7Ci0Jc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgdGhpcy5yZXNvbHZlZFR5cGUpOwotfQotcHJvdGVjdGVkIHZvaWQgcmVwb3J0RGVwcmVjYXRlZFR5cGUoVHlwZUJpbmRpbmcgdHlwZSwgU2NvcGUgc2NvcGUpIHsKLQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSh0eXBlLCB0aGlzKTsKLX0KKwogcHVibGljIGFic3RyYWN0IHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwogcHVibGljIGFic3RyYWN0IHZvaWQgdHJhdmVyc2UoQVNUVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIHNjb3BlKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1VuYXJ5RXhwcmVzc2lvbi5qYXZhCmluZGV4IDEyYzE0NTkuLjI2MWJmOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCw3ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgVW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgT3BlcmF0b3JFeHByZXNzaW9uIHsKLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKIApAQCAtMzEsOCArMzEsOCBAQAogCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JdGhpcy5leHByZXNzaW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsJCi0JaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UKSB7CisJdGhpcy5leHByZXNzaW9uLmNoZWNrTlBFKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwlpZiAoKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IE5PVCkgewogCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uLgogCQkJYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLgogCQkJYXNOZWdhdGVkQ29uZGl0aW9uKCk7CkBAIC00Myw5ICs0Myw5IEBACiB9CiAKIAlwdWJsaWMgQ29uc3RhbnQgb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkgewotCQkKLQkJcmV0dXJuIHRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID09IG51bGwgCi0JCQkJPyB0aGlzLmNvbnN0YW50IAorCisJCXJldHVybiB0aGlzLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9PSBudWxsCisJCQkJPyB0aGlzLmNvbnN0YW50CiAJCQkJOiB0aGlzLm9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKIAl9CiAKQEAgLTYwLDcgKzYwLDcgQEAKIAkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCiAJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKIAkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkKKwogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlCcmFuY2hMYWJlbCBmYWxzZUxhYmVsLCBlbmRpZkxhYmVsOwogCQlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKQEAgLTcxLDcgKzcxLDcgQEAKIAkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJc3dpdGNoICgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgeworCQlzd2l0Y2ggKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKIAkJCWNhc2UgTk9UIDoKIAkJCQlzd2l0Y2ggKCh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAvKiBydW50aW1lIHR5cGUgKi8gewogCQkJCQljYXNlIFRfYm9vbGVhbiA6CkBAIC05NCw3ICs5NCw3IEBACiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsgLy8gNjU5NjogaWYgKCEoYSAmJiBiKSl7fSAtIG11c3Qgc3RpbGwgcGxhY2UgZmFsc2VMYWJlbAogCQkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKLQkJCQkJCX0JCQkJCQkKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJCXN3aXRjaCAoKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KXsgLyogcnVudGltZSB0eXBlICovCisJCQkJCQlzd2l0Y2ggKCh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KXsgLyogcnVudGltZSB0eXBlICovCiAJCQkJCQkJY2FzZSBUX2ludCA6CiAJCQkJCQkJCWNvZGVTdHJlYW0uaW5lZygpOwogCQkJCQkJCQlicmVhazsKQEAgLTIwMCwxMyArMjAwLDEyIEBACiAJfQogCiAJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb25Ob1BhcmVudGhlc2lzKGludCBpbmRlbnQsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCisKIAkJb3V0cHV0LmFwcGVuZChvcGVyYXRvclRvU3RyaW5nKCkpLmFwcGVuZCgnICcpOwogCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwotCX0gCi0JCisJfQorCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCiAJCWJvb2xlYW4gZXhwcmVzc2lvbklzQ2FzdDsKIAkJaWYgKChleHByZXNzaW9uSXNDYXN0ID0gdGhpcy5leHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pID09IHRydWUpIHRoaXMuZXhwcmVzc2lvbi5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgogCQlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSA9IHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CkBAIC0yMjEsMTUgKzIyMCwxNSBAQAogCQkJaWYgKCFleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJCQlleHByZXNzaW9uVHlwZUlEID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jb21wdXRlQm94aW5nVHlwZShleHByZXNzaW9uVHlwZSkuaWQ7CiAJCQl9Ci0JCX0JCQorCQl9CiAJCWlmIChleHByZXNzaW9uVHlwZUlEID4gMTUpIHsKIAkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgZXhwcmVzc2lvblR5cGUpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkKKwogCQlpbnQgdGFibGVJZDsKLQkJc3dpdGNoICgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgeworCQlzd2l0Y2ggKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKIAkJCWNhc2UgTk9UIDoKIAkJCQl0YWJsZUlkID0gQU5EX0FORDsKIAkJCQlicmVhazsKQEAgLTIzOSw3ICsyMzgsNyBAQAogCQkJZGVmYXVsdCA6CiAJCQkJdGFibGVJZCA9IE1JTlVTOwogCQl9IC8vKyBhbmQgLSBjYXNlcwotCQorCiAJCS8vIHRoZSBjb2RlIGlzIGFuIGludAogCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMApAQCAtMjgxLDEyICsyODAsMTIgQEAKIAkJCQlDb25zdGFudC5jb21wdXRlQ29uc3RhbnRPcGVyYXRpb24oCiAJCQkJCXRoaXMuZXhwcmVzc2lvbi5jb25zdGFudCwKIAkJCQkJZXhwcmVzc2lvblR5cGVJRCwKLQkJCQkJKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpOworCQkJCQkodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCQlpZiAoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBOT1QpIHsKLQkJCQlDb25zdGFudCBjc3QgPSBleHByZXNzaW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOwotCQkJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAKKwkJCWlmICgoKHRoaXMuYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UKSB7CisJCQkJQ29uc3RhbnQgY3N0ID0gdGhpcy5leHByZXNzaW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQkJCWlmIChjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQogCQkJCQl0aGlzLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9IEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUoIWNzdC5ib29sZWFuVmFsdWUoKSk7CiAJCQl9CiAJCX0KQEAgLTMwMCw3ICsyOTksNyBAQAogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAogICAgIAkJQVNUVmlzaXRvciB2aXNpdG9yLAogICAgIAkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7Ci0JCQkKKwogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewogCQkJdGhpcy5leHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1VuaW9uVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmlvblR5cGVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ3NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmlvblR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKKworcHVibGljIGNsYXNzIFVuaW9uVHlwZVJlZmVyZW5jZSBleHRlbmRzIFR5cGVSZWZlcmVuY2UgeworCXB1YmxpYyBUeXBlUmVmZXJlbmNlW10gdHlwZVJlZmVyZW5jZXM7CisKKwlwdWJsaWMgVW5pb25UeXBlUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2VbXSB0eXBlUmVmZXJlbmNlcykgeworCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5Jc1VuaW9uVHlwZTsKKwkJdGhpcy50eXBlUmVmZXJlbmNlcyA9IHR5cGVSZWZlcmVuY2VzOworCQl0aGlzLnNvdXJjZVN0YXJ0ID0gdHlwZVJlZmVyZW5jZXNbMF0uc291cmNlU3RhcnQ7CisJCWludCBsZW5ndGggPSB0eXBlUmVmZXJlbmNlcy5sZW5ndGg7CisJCXRoaXMuc291cmNlRW5kID0gdHlwZVJlZmVyZW5jZXNbbGVuZ3RoIC0gMV0uc291cmNlRW5kOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSNjb3B5RGltcyhpbnQpCisJICovCisJcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2UjZ2V0TGFzdFRva2VuKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldExhc3RUb2tlbigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSNnZXRUeXBlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlKQorCSAqLworCXByb3RlY3RlZCBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgeworCQlyZXR1cm4gbnVsbDsgLy8gbm90IHN1cHBvcnRlZCBoZXJlIC0gY29tYmluZWQgd2l0aCByZXNvbHZlVHlwZSguLi4pCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlI2dldFR5cGVCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGUpCisJICovCisJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gY2hlY2tCb3VuZHMpIHsKKwkJLy8gcmV0dXJuIHRoZSBsdWIgKGxlYXN0IHVwcGVyIGJvdW5kIG9mIGFsbCB0eXBlIGJpbmRpbmcpIAorCQlpbnQgbGVuZ3RoID0gdGhpcy50eXBlUmVmZXJlbmNlcy5sZW5ndGg7CisJCVR5cGVCaW5kaW5nW10gYWxsRXhjZXB0aW9uVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJYm9vbGVhbiBoYXNFcnJvciA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlUeXBlQmluZGluZyBleGNlcHRpb25UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlc1tpXS5yZXNvbHZlVHlwZShzY29wZSwgY2hlY2tCb3VuZHMpOworCQkJaWYgKGV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJc3dpdGNoKGV4Y2VwdGlvblR5cGUua2luZCgpKSB7CisJCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6CisJCQkJCWlmIChleGNlcHRpb25UeXBlLmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQkJCQloYXNFcnJvciA9IHRydWU7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkUGFyYW1ldGVyaXplZEV4Y2VwdGlvblR5cGUoZXhjZXB0aW9uVHlwZSwgdGhpcy50eXBlUmVmZXJlbmNlc1tpXSk7CisJCQkJCQkvLyBmYWxsIHRocnUgdG8gY3JlYXRlIHRoZSB2YXJpYWJsZSAtIGF2b2lkcyBhZGRpdGlvbmFsIGVycm9ycyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGVWYXJpYWJsZUFzRXhjZXB0aW9uKGV4Y2VwdGlvblR5cGUsIHRoaXMudHlwZVJlZmVyZW5jZXNbaV0pOworCQkJCQloYXNFcnJvciA9IHRydWU7CisJCQkJCS8vIGZhbGwgdGhydSB0byBjcmVhdGUgdGhlIHZhcmlhYmxlIC0gYXZvaWRzIGFkZGl0aW9uYWwgZXJyb3JzIGJlY2F1c2UgdGhlIHZhcmlhYmxlIGlzIG1pc3NpbmcKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZXhjZXB0aW9uVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhTGFuZ1Rocm93YWJsZSwgdHJ1ZSkgPT0gbnVsbAorCQkJCQkmJiBleGNlcHRpb25UeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RUaHJvd1R5cGUodGhpcy50eXBlUmVmZXJlbmNlc1tpXSwgZXhjZXB0aW9uVHlwZSk7CisJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJfQorCQkJYWxsRXhjZXB0aW9uVHlwZXNbaV0gPSBleGNlcHRpb25UeXBlOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDQ4NiwgZW5zdXJlIHR5cGVzIGFyZSBvZiB1bmlvbiB0eXBlLgorCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlpZiAoYWxsRXhjZXB0aW9uVHlwZXNbal0uaXNDb21wYXRpYmxlV2l0aChleGNlcHRpb25UeXBlKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS53cm9uZ1NlcXVlbmNlT2ZFeGNlcHRpb25UeXBlcygKKwkJCQkJCQl0aGlzLnR5cGVSZWZlcmVuY2VzW2pdLAorCQkJCQkJCWFsbEV4Y2VwdGlvblR5cGVzW2pdLAorCQkJCQkJCWV4Y2VwdGlvblR5cGUpOworCQkJCQloYXNFcnJvciA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChleGNlcHRpb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoYWxsRXhjZXB0aW9uVHlwZXNbal0pKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLndyb25nU2VxdWVuY2VPZkV4Y2VwdGlvblR5cGVzKAorCQkJCQkJCXRoaXMudHlwZVJlZmVyZW5jZXNbaV0sCisJCQkJCQkJZXhjZXB0aW9uVHlwZSwKKwkJCQkJCQlhbGxFeGNlcHRpb25UeXBlc1tqXSk7CisJCQkJCWhhc0Vycm9yID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGhhc0Vycm9yKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkvLyBjb21wdXRlIGx1YgorCQlyZXR1cm4gKHRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUubG93ZXJVcHBlckJvdW5kKGFsbEV4Y2VwdGlvblR5cGVzKSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlI2dldFR5cGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gZ2V0VHlwZU5hbWUoKSB7CisJCS8vIHdlIG5lZWQgdG8ga2VlcCBhIHJldHVybiB2YWx1ZSB0aGF0IGlzIGEgY2hhcltdW10KKwkJcmV0dXJuIHRoaXMudHlwZVJlZmVyZW5jZXNbMF0uZ2V0VHlwZU5hbWUoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2UjdHJhdmVyc2Uob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShBU1RWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy50eXBlUmVmZXJlbmNlcyA9PSBudWxsID8gMCA6IHRoaXMudHlwZVJlZmVyZW5jZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCXRoaXMudHlwZVJlZmVyZW5jZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSN0cmF2ZXJzZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlKQorCSAqLworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKEFTVFZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVSZWZlcmVuY2VzID09IG51bGwgPyAwIDogdGhpcy50eXBlUmVmZXJlbmNlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy50eXBlUmVmZXJlbmNlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uI3ByaW50RXhwcmVzc2lvbihpbnQsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCisJICovCisJcHVibGljIFN0cmluZ0J1ZmZlciBwcmludEV4cHJlc3Npb24oaW50IGluZGVudCwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy50eXBlUmVmZXJlbmNlcyA9PSBudWxsID8gMCA6IHRoaXMudHlwZVJlZmVyZW5jZXMubGVuZ3RoOworCQlwcmludEluZGVudChpbmRlbnQsIG91dHB1dCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMudHlwZVJlZmVyZW5jZXNbaV0ucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJCQlpZiAoaSAhPSBsZW5ndGggLSAxKSB7CisJCQkJb3V0cHV0LmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlyZXR1cm4gb3V0cHV0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaGlsZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaGlsZVN0YXRlbWVudC5qYXZhCmluZGV4IGM3NzRlN2MuLmM1MTA0MmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1doaWxlU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMxOTIwMSAtIFtudWxsXSBubyB3YXJuaW5nIHdoZW4gdW5ib3hpbmcgU2luZ2xlTmFtZVJlZmVyZW5jZSBjYXVzZXMgTlBFCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIApAQCAtMTgsNyArMTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGNvbmRpdGlvbjsKIAlwdWJsaWMgU3RhdGVtZW50IGFjdGlvbjsKIAlwcml2YXRlIEJyYW5jaExhYmVsIGJyZWFrTGFiZWwsIGNvbnRpbnVlTGFiZWw7CkBAIC0zMiwxNyArMzMsMTUgQEAKIAkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CiAJCS8vIHJlbWVtYmVyIHVzZWZ1bCBlbXB0eSBzdGF0ZW1lbnQKIAkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSBhY3Rpb24uYml0cyB8PSBJc1VzZWZ1bEVtcHR5U3RhdGVtZW50OwotCQlzb3VyY2VTdGFydCA9IHM7Ci0JCXNvdXJjZUVuZCA9IGU7CisJCXRoaXMuc291cmNlU3RhcnQgPSBzOworCQl0aGlzLnNvdXJjZUVuZCA9IGU7CiAJfQogCi0JcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKLQkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCi0JCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAotCQlicmVha0xhYmVsID0gbmV3IEJyYW5jaExhYmVsKCk7Ci0JCWNvbnRpbnVlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKTsgCisJCXRoaXMuYnJlYWtMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCgpOworCQl0aGlzLmNvbnRpbnVlTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoKTsKKwkJaW50IGluaXRpYWxDb21wbGFpbnRMZXZlbCA9IChmbG93SW5mby5yZWFjaE1vZGUoKSAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwID8gU3RhdGVtZW50LkNPTVBMQUlORURfRkFLRV9SRUFDSEFCTEUgOiBTdGF0ZW1lbnQuTk9UX0NPTVBMQUlORUQ7CiAKIAkJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24uY29uc3RhbnQ7CiAJCWJvb2xlYW4gaXNDb25kaXRpb25UcnVlID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKQEAgLTUxLDI3ICs1MCwzMCBAQAogCQljc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOwogCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZTsKLQkJCi0JCXByZUNvbmRJbml0U3RhdGVJbmRleCA9Ci0JCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisKKwkJdGhpcy5wcmVDb25kSW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CiAJCUxvb3BpbmdGbG93Q29udGV4dCBjb25kTG9vcENvbnRleHQ7CiAJCUZsb3dJbmZvIGNvbmRJbmZvID0JZmxvd0luZm8ubnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKTsKKwkJCiAJCS8vIHdlIG5lZWQgdG8gY29sbGVjdCB0aGUgY29udHJpYnV0aW9uIHRvIG51bGxzIG9mIHRoZSBjb21pbmcgcGF0aHMgdGhyb3VnaCB0aGUKIAkJLy8gbG9vcCwgYmUgdGhleSBmYWxsaW5nIHRocm91Z2ggbm9ybWFsbHkgb3IgYnJhbmNoZWQgdG8gYnJlYWssIGNvbnRpbnVlIGxhYmVscwogCQkvLyBvciBjYXRjaCBibG9ja3MKIAkJY29uZEluZm8gPSB0aGlzLmNvbmRpdGlvbi5hbmFseXNlQ29kZSgKIAkJCQljdXJyZW50U2NvcGUsCiAJCQkJKGNvbmRMb29wQ29udGV4dCA9Ci0JCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBudWxsLCAKKwkJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIG51bGwsCiAJCQkJCQludWxsLCBjdXJyZW50U2NvcGUpKSwKIAkJCQljb25kSW5mbyk7CisJCWlmICgodGhpcy5jb25kaXRpb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeworCQkJdGhpcy5jb25kaXRpb24uY2hlY2tOUEUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQl9CiAKIAkJTG9vcGluZ0Zsb3dDb250ZXh0IGxvb3BpbmdDb250ZXh0OwogCQlGbG93SW5mbyBhY3Rpb25JbmZvOwogCQlGbG93SW5mbyBleGl0QnJhbmNoOwotCQlpZiAoYWN0aW9uID09IG51bGwgCi0JCQl8fCAoYWN0aW9uLmlzRW1wdHlCbG9jaygpICYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMykpIHsKLQkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhjdXJyZW50U2NvcGUsIAorCQlpZiAodGhpcy5hY3Rpb24gPT0gbnVsbAorCQkJfHwgKHRoaXMuYWN0aW9uLmlzRW1wdHlCbG9jaygpICYmIGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMykpIHsKKwkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhjdXJyZW50U2NvcGUsCiAJCQkJCWNvbmRJbmZvKTsKIAkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWROdWxsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCQljb25kSW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CkBAIC04MCw2NSArODIsNzEgQEAKIAkJCX0gZWxzZSB7CiAJCQkJRmxvd0luZm8gbWVyZ2VkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKGNvbmRJbmZvLmluaXRzV2hlbkZhbHNlKCkpOwogCQkJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZFRydWUpewotCQkJCQltZXJnZWRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQkJCW1lcmdlZEluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpOwogCQkJCX0KLQkJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJdGhpcy5tZXJnZWRJbml0U3RhdGVJbmRleCA9CiAJCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOwotCQkJCXJldHVybiBtZXJnZWRJbmZvOyAKKwkJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8vIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB3YXMgaW5saW5lZCB0byBmYWxzZSwgcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIHJlYWNoIGFueSAKKwkJCS8vIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB3YXMgaW5saW5lZCB0byBmYWxzZSwgcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIHJlYWNoIGFueQogCQkJLy8gc3RhdGVtZW50IGluc2lkZSB0aGUgbG9vcGluZyBhY3Rpb24KIAkJCWxvb3BpbmdDb250ZXh0ID0KIAkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KAogCQkJCQlmbG93Q29udGV4dCwKIAkJCQkJZmxvd0luZm8sCiAJCQkJCXRoaXMsCi0JCQkJCWJyZWFrTGFiZWwsCi0JCQkJCWNvbnRpbnVlTGFiZWwsCisJCQkJCXRoaXMuYnJlYWtMYWJlbCwKKwkJCQkJdGhpcy5jb250aW51ZUxhYmVsLAogCQkJCQljdXJyZW50U2NvcGUpOwogCQkJaWYgKGlzQ29uZGl0aW9uRmFsc2UpIHsKIAkJCQlhY3Rpb25JbmZvID0gRmxvd0luZm8uREVBRF9FTkQ7CiAJCQl9IGVsc2UgewogCQkJCWFjdGlvbkluZm8gPSBjb25kSW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOwogCQkJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlKXsKLQkJCQkJYWN0aW9uSW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworCQkJCQlhY3Rpb25JbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKTsKIAkJCQl9CiAJCQl9CiAKIAkJCS8vIGZvciBjb21wdXRpbmcgbG9jYWwgdmFyIGF0dHJpYnV0ZXMKLQkJCWNvbmRJZlRydWVJbml0U3RhdGVJbmRleCA9CisJCQl0aGlzLmNvbmRJZlRydWVJbml0U3RhdGVJbmRleCA9CiAJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoCiAJCQkJCWNvbmRJbmZvLmluaXRzV2hlblRydWUoKSk7CiAKLQkJCWlmICghdGhpcy5hY3Rpb24uY29tcGxhaW5JZlVucmVhY2hhYmxlKGFjdGlvbkluZm8sIGN1cnJlbnRTY29wZSwgZmFsc2UpKSB7CisJCQlpZiAodGhpcy5hY3Rpb24uY29tcGxhaW5JZlVucmVhY2hhYmxlKGFjdGlvbkluZm8sIGN1cnJlbnRTY29wZSwgaW5pdGlhbENvbXBsYWludExldmVsKSA8IFN0YXRlbWVudC5DT01QTEFJTkVEX1VOUkVBQ0hBQkxFKSB7CiAJCQkJYWN0aW9uSW5mbyA9IHRoaXMuYWN0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgbG9vcGluZ0NvbnRleHQsIGFjdGlvbkluZm8pOwogCQkJfQogCiAJCQkvLyBjb2RlIGdlbmVyYXRpb24gY2FuIGJlIG9wdGltaXplZCB3aGVuIG5vIG5lZWQgdG8gY29udGludWUgaW4gdGhlIGxvb3AKIAkJCWV4aXRCcmFuY2ggPSBmbG93SW5mby5jb3B5KCk7CiAJCQkvLyBuZWVkIHRvIHN0YXJ0IG92ZXIgZnJvbSBmbG93SW5mbyBzbyBhcyB0byBnZXQgbnVsbCBpbml0cwotCi0JCQlpZiAoKGFjdGlvbkluZm8udGFnQml0cyAmIAotCQkJCQlsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUudGFnQml0cyAmCi0JCQkJCUZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKSB7Ci0JCQkJY29udGludWVMYWJlbCA9IG51bGw7CisgICAgICAgICAgICBpbnQgY29tYmluZWRUYWdCaXRzID0gYWN0aW9uSW5mby50YWdCaXRzICYgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHM7CisJCQlpZiAoKGNvbWJpbmVkVGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKSB7CisJCQkJaWYgKChjb21iaW5lZFRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKQorCQkJCQl0aGlzLmNvbnRpbnVlTGFiZWwgPSBudWxsOwogCQkJCWV4aXRCcmFuY2guYWRkSW5pdGlhbGl6YXRpb25zRnJvbShjb25kSW5mby5pbml0c1doZW5GYWxzZSgpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKGN1cnJlbnRTY29wZSwgCisJCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCQkJCWNvbmRJbmZvKTsKIAkJCQlhY3Rpb25JbmZvID0gYWN0aW9uSW5mby5tZXJnZWRXaXRoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JCQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLCAKKwkJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkRlZmVycmVkTnVsbENoZWNrcyhjdXJyZW50U2NvcGUsCiAJCQkJCQlhY3Rpb25JbmZvKTsKLQkJCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhjdXJyZW50U2NvcGUsIAorCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZEZpbmFsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCQkJCWFjdGlvbkluZm8pOwotCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25EZWZlcnJlZE51bGxDaGVja3MoY3VycmVudFNjb3BlLCAKKwkJCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRGVmZXJyZWROdWxsQ2hlY2tzKGN1cnJlbnRTY29wZSwKIAkJCQkJCWFjdGlvbkluZm8pOwogCQkJCWV4aXRCcmFuY2guCiAJCQkJCWFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oCiAJCQkJCQlhY3Rpb25JbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKS4KIAkJCQkJYWRkSW5pdGlhbGl6YXRpb25zRnJvbShjb25kSW5mby5pbml0c1doZW5GYWxzZSgpKTsKIAkJCX0KKwkJCWlmIChsb29waW5nQ29udGV4dC5oYXNFc2NhcGluZ0V4Y2VwdGlvbnMoKSkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxOTI2CisJCQkJRmxvd0luZm8gbG9vcGJhY2tGbG93SW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKKwkJCQlpZiAodGhpcy5jb250aW51ZUxhYmVsICE9IG51bGwpIHsgIC8vIHdlIGRvIGdldCB0byB0aGUgYm90dG9tIAorCQkJCQlsb29wYmFja0Zsb3dJbmZvLm1lcmdlZFdpdGgoYWN0aW9uSW5mby51bmNvbmRpdGlvbmFsQ29weSgpKTsKKwkJCQl9CisJCQkJbG9vcGluZ0NvbnRleHQuc2ltdWxhdGVUaHJvd0FmdGVyTG9vcEJhY2sobG9vcGJhY2tGbG93SW5mbyk7CisJCQl9CiAJCX0KIAogCQkvLyBlbmQgb2YgbG9vcApAQCAtMTQ3LDExICsxNTUsMTEgQEAKIAkJCQkJRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDAgPwogCQkJCQlsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWsgOgogCQkJCQlmbG93SW5mby5hZGRJbml0aWFsaXphdGlvbnNGcm9tKGxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhayksIC8vIHJlY292ZXIgdXBzdHJlYW0gbnVsbCBpbmZvCi0JCQkJaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlLCAKKwkJCQlpc0NvbmRpdGlvbk9wdGltaXplZFRydWUsCiAJCQkJZXhpdEJyYW5jaCwKIAkJCQlpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlLAogCQkJCSFpc0NvbmRpdGlvblRydWUgLyp3aGlsZSh0cnVlKTsgdW5yZWFjaGFibGUoKTsgKi8pOwotCQltZXJnZWRJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQl0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwogCX0KIApAQCAtMTYzLDcxICsxNzEsNzEgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCi0JCWlmICgoYml0cyAmIElzUmVhY2hhYmxlKSA9PSAwKSB7CisJCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGUpID09IDApIHsKIAkJCXJldHVybjsKIAkJfQogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlDb25zdGFudCBjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlID0gY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CiAJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlKSB7Ci0JCQljb25kaXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJdGhpcy5jb25kaXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOwogCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIG1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQotCQkKLQkJYnJlYWtMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOworCisJCXRoaXMuYnJlYWtMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwogCiAJCS8vIGdlbmVyYXRlIGNvbmRpdGlvbgotCQlpZiAoY29udGludWVMYWJlbCA9PSBudWxsKSB7CisJCWlmICh0aGlzLmNvbnRpbnVlTGFiZWwgPT0gbnVsbCkgewogCQkJLy8gbm8gbmVlZCB0byByZXZlcnNlIGNvbmRpdGlvbgotCQkJaWYgKGNvbmRpdGlvbi5jb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJaWYgKHRoaXMuY29uZGl0aW9uLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCXRoaXMuY29uZGl0aW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKIAkJCQkJY3VycmVudFNjb3BlLAogCQkJCQljb2RlU3RyZWFtLAogCQkJCQludWxsLAotCQkJCQlicmVha0xhYmVsLAorCQkJCQl0aGlzLmJyZWFrTGFiZWwsCiAJCQkJCXRydWUpOwogCQkJfQogCQl9IGVsc2UgewotCQkJY29udGludWVMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOwotCQkJaWYgKCEoKChjb25kaXRpb24uY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQotCQkJCSYmIChjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpCi0JCQkJfHwgKGFjdGlvbiA9PSBudWxsKQotCQkJCXx8IGFjdGlvbi5pc0VtcHR5QmxvY2soKSkpIHsKKwkJCXRoaXMuY29udGludWVMYWJlbC5pbml0aWFsaXplKGNvZGVTdHJlYW0pOworCQkJaWYgKCEoKCh0aGlzLmNvbmRpdGlvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJJiYgKHRoaXMuY29uZGl0aW9uLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpKQorCQkJCXx8ICh0aGlzLmFjdGlvbiA9PSBudWxsKQorCQkJCXx8IHRoaXMuYWN0aW9uLmlzRW1wdHlCbG9jaygpKSkgewogCQkJCWludCBqdW1wUEMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQkJCWNvZGVTdHJlYW0uZ290b18oY29udGludWVMYWJlbCk7Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGp1bXBQQywgY29uZGl0aW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKHRoaXMuY29udGludWVMYWJlbCk7CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGp1bXBQQywgdGhpcy5jb25kaXRpb24uc291cmNlU3RhcnQpOwogCQkJfQogCQl9CiAJCS8vIGdlbmVyYXRlIHRoZSBhY3Rpb24KIAkJQnJhbmNoTGFiZWwgYWN0aW9uTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwoY29kZVN0cmVhbSk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy5hY3Rpb24gIT0gbnVsbCkgewogCQkJYWN0aW9uTGFiZWwudGFnQml0cyB8PSBCcmFuY2hMYWJlbC5VU0VEOwogCQkJLy8gUmVxdWlyZWQgdG8gZml4IDFQUjBYVlM6IExGUkU6V0lOTlQgLSBDb21waWxlcjogdmFyaWFibGUgdGFibGUgZm9yIG1ldGhvZCBhcHBlYXJzIGluY29ycmVjdAotCQkJaWYgKGNvbmRJZlRydWVJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJaWYgKHRoaXMuY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJLy8gaW5zZXJ0IGFsbCBsb2NhbHMgaW5pdGlhbGl6ZWQgaW5zaWRlIHRoZSBjb25kaXRpb24gaW50byB0aGUgYWN0aW9uIGdlbmVyYXRlZCBwcmlvciB0byB0aGUgY29uZGl0aW9uCiAJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4KTsKKwkJCQkJdGhpcy5jb25kSWZUcnVlSW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJYWN0aW9uTGFiZWwucGxhY2UoKTsKLQkJCWFjdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCXRoaXMuYWN0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCi0JCQlpZiAocHJlQ29uZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7Ci0JCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBwcmVDb25kSW5pdFN0YXRlSW5kZXgpOworCQkJaWYgKHRoaXMucHJlQ29uZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLnByZUNvbmRJbml0U3RhdGVJbmRleCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlhY3Rpb25MYWJlbC5wbGFjZSgpOwogCQl9CiAJCS8vIG91dHB1dCBjb25kaXRpb24gYW5kIGJyYW5jaCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcGVhdGVkIGFjdGlvbgotCQlpZiAoY29udGludWVMYWJlbCAhPSBudWxsKSB7Ci0JCQljb250aW51ZUxhYmVsLnBsYWNlKCk7Ci0JCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlpZiAodGhpcy5jb250aW51ZUxhYmVsICE9IG51bGwpIHsKKwkJCXRoaXMuY29udGludWVMYWJlbC5wbGFjZSgpOworCQkJdGhpcy5jb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAogCQkJCWN1cnJlbnRTY29wZSwKIAkJCQljb2RlU3RyZWFtLAogCQkJCWFjdGlvbkxhYmVsLApAQCAtMjM2LDMwICsyNDQsMzAgQEAKIAkJfQogCiAJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwotCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKLQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCWlmICh0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoaXMubWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGlzLm1lcmdlZEluaXRTdGF0ZUluZGV4KTsKIAkJfQotCQlicmVha0xhYmVsLnBsYWNlKCk7CisJCXRoaXMuYnJlYWtMYWJlbC5wbGFjZSgpOwogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCX0KIAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewogCi0JCVR5cGVCaW5kaW5nIHR5cGUgPSBjb25kaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIFR5cGVCaW5kaW5nLkJPT0xFQU4pOwotCQljb25kaXRpb24uY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHR5cGUsIHR5cGUpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlhY3Rpb24ucmVzb2x2ZShzY29wZSk7CisJCVR5cGVCaW5kaW5nIHR5cGUgPSB0aGlzLmNvbmRpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgVHlwZUJpbmRpbmcuQk9PTEVBTik7CisJCXRoaXMuY29uZGl0aW9uLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB0eXBlLCB0eXBlKTsKKwkJaWYgKHRoaXMuYWN0aW9uICE9IG51bGwpCisJCQl0aGlzLmFjdGlvbi5yZXNvbHZlKHNjb3BlKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50U3RhdGVtZW50KGludCB0YWIsIFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAogCQlwcmludEluZGVudCh0YWIsIG91dHB1dCkuYXBwZW5kKCJ3aGlsZSAoIik7IC8vJE5PTi1OTFMtMSQKLQkJY29uZGl0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnKScpOwotCQlpZiAoYWN0aW9uID09IG51bGwpCisJCXRoaXMuY29uZGl0aW9uLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpLmFwcGVuZCgnKScpOworCQlpZiAodGhpcy5hY3Rpb24gPT0gbnVsbCkKIAkJCW91dHB1dC5hcHBlbmQoJzsnKTsKIAkJZWxzZQotCQkJYWN0aW9uLnByaW50U3RhdGVtZW50KHRhYiArIDEsIG91dHB1dCk7IAorCQkJdGhpcy5hY3Rpb24ucHJpbnRTdGF0ZW1lbnQodGFiICsgMSwgb3V0cHV0KTsKIAkJcmV0dXJuIG91dHB1dDsKIAl9CiAKQEAgLTI2OCw5ICsyNzYsOSBAQAogCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAogCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgewotCQkJY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJCWFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJCXRoaXMuY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJaWYgKHRoaXMuYWN0aW9uICE9IG51bGwpCisJCQkJdGhpcy5hY3Rpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1dpbGRjYXJkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1dpbGRjYXJkLmphdmEKaW5kZXggZWE2OWRjZi4uNzNiOTg1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaWxkY2FyZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2lsZGNhcmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiw3ICsyMiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VORCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EUyA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVIgPSAyOwotICAgIAorCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgYm91bmQ7CiAJcHVibGljIGludCBraW5kOwogCkBAIC0zMCw2MSArMzAsNjEgQEAKIAkJc3VwZXIoV0lMRENBUkRfTkFNRSwgMCk7CiAJCXRoaXMua2luZCA9IGtpbmQ7CiAJfQotCQorCiAJcHVibGljIGNoYXIgW11bXSBnZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSB7Ci0gICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLlVOQk9VTkQgOiAKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2hhcltdW10geyBXSUxEQ0FSRF9OQU1FIH07Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2hhcltdW10geyBDaGFyT3BlcmF0aW9uLmNvbmNhdChXSUxEQ0FSRF9OQU1FLCBXSUxEQ0FSRF9FWFRFTkRTLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5ib3VuZC5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKSkgfTsKKwkJc3dpdGNoICh0aGlzLmtpbmQpIHsKKwkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORCA6CisJCQkJcmV0dXJuIG5ldyBjaGFyW11bXSB7IFdJTERDQVJEX05BTUUgfTsKKwkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUyA6CisJCQkJcmV0dXJuIG5ldyBjaGFyW11bXSB7IENoYXJPcGVyYXRpb24uY29uY2F0KFdJTERDQVJEX05BTUUsIFdJTERDQVJEX0VYVEVORFMsIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmJvdW5kLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpKSB9OwogCQkJZGVmYXVsdDogLy8gU1VQRVIKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNoYXJbXVtdIHsgQ2hhck9wZXJhdGlvbi5jb25jYXQoV0lMRENBUkRfTkFNRSwgV0lMRENBUkRfU1VQRVIsIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmJvdW5kLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpKSB9OwotICAgICAgICB9ICAgICAgICAJICAgIAotCX0JCisJCQkJcmV0dXJuIG5ldyBjaGFyW11bXSB7IENoYXJPcGVyYXRpb24uY29uY2F0KFdJTERDQVJEX05BTUUsIFdJTERDQVJEX1NVUEVSLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5ib3VuZC5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKSkgfTsKKwkJfQorCX0KIAogCXB1YmxpYyBjaGFyIFtdW10gZ2V0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLlVOQk9VTkQgOiAKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2hhcltdW10geyBXSUxEQ0FSRF9OQU1FIH07Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2hhcltdW10geyBDaGFyT3BlcmF0aW9uLmNvbmNhdChXSUxEQ0FSRF9OQU1FLCBXSUxEQ0FSRF9FWFRFTkRTLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5ib3VuZC5nZXRUeXBlTmFtZSgpLCAnLicpKSB9OworCQlzd2l0Y2ggKHRoaXMua2luZCkgeworCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKKwkJCQlyZXR1cm4gbmV3IGNoYXJbXVtdIHsgV0lMRENBUkRfTkFNRSB9OworCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTIDoKKwkJCQlyZXR1cm4gbmV3IGNoYXJbXVtdIHsgQ2hhck9wZXJhdGlvbi5jb25jYXQoV0lMRENBUkRfTkFNRSwgV0lMRENBUkRfRVhURU5EUywgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuYm91bmQuZ2V0VHlwZU5hbWUoKSwgJy4nKSkgfTsKIAkJCWRlZmF1bHQ6IC8vIFNVUEVSCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjaGFyW11bXSB7IENoYXJPcGVyYXRpb24uY29uY2F0KFdJTERDQVJEX05BTUUsIFdJTERDQVJEX1NVUEVSLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5ib3VuZC5nZXRUeXBlTmFtZSgpLCAnLicpKSB9OwotICAgICAgICB9ICAgICAgICAJICAgIAorCQkJCXJldHVybiBuZXcgY2hhcltdW10geyBDaGFyT3BlcmF0aW9uLmNvbmNhdChXSUxEQ0FSRF9OQU1FLCBXSUxEQ0FSRF9TVVBFUiwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuYm91bmQuZ2V0VHlwZU5hbWUoKSwgJy4nKSkgfTsKKwkJfQogCX0KLQkKKwogCXByaXZhdGUgVHlwZUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlVHlwZShTY29wZSBzY29wZSwgUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZSwgaW50IHJhbmspIHsKLQkgICAgVHlwZUJpbmRpbmcgYm91bmRUeXBlID0gbnVsbDsKLQkgICAgaWYgKHRoaXMuYm91bmQgIT0gbnVsbCkgeworCQlUeXBlQmluZGluZyBib3VuZFR5cGUgPSBudWxsOworCQlpZiAodGhpcy5ib3VuZCAhPSBudWxsKSB7CiAJCQlib3VuZFR5cGUgPSBzY29wZS5raW5kID09IFNjb3BlLkNMQVNTX1NDT1BFCi0JICAgICAgIAkJPyB0aGlzLmJvdW5kLnJlc29sdmVUeXBlKChDbGFzc1Njb3BlKXNjb3BlKQotCSAgICAgICAJCTogdGhpcy5ib3VuZC5yZXNvbHZlVHlwZSgoQmxvY2tTY29wZSlzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7Ci0JICAgICAgIAkJICAgICAgICAKKwkJCQkJPyB0aGlzLmJvdW5kLnJlc29sdmVUeXBlKChDbGFzc1Njb3BlKXNjb3BlKQorCQkJCQk6IHRoaXMuYm91bmQucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpc2NvcGUsIHRydWUgLyogY2hlY2sgYm91bmRzKi8pOworCiAJCQlpZiAoYm91bmRUeXBlID09IG51bGwpIHsKIAkJCQlyZXR1cm4gbnVsbDsKLQkJCX0JICAgIAorCQkJfQogCQl9Ci0JICAgIFdpbGRjYXJkQmluZGluZyB3aWxkY2FyZCA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIGJvdW5kVHlwZSwgbnVsbCAvKm5vIGV4dHJhIGJvdW5kKi8sIHRoaXMua2luZCk7Ci0JICAgIHJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHdpbGRjYXJkOworCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQgPSBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBib3VuZFR5cGUsIG51bGwgLypubyBleHRyYSBib3VuZCovLCB0aGlzLmtpbmQpOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB3aWxkY2FyZDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLSAgICAgICAgc3dpdGNoICh0aGlzLmtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6IAotICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoV0lMRENBUkRfTkFNRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoV0lMRENBUkRfTkFNRSkuYXBwZW5kKFdJTERDQVJEX0VYVEVORFMpOwotICAgICAgICAgICAgCXRoaXMuYm91bmQucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7Ci0gICAgICAgICAgICAJYnJlYWs7CisJCXN3aXRjaCAodGhpcy5raW5kKSB7CisJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQgOgorCQkJCW91dHB1dC5hcHBlbmQoV0lMRENBUkRfTkFNRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgorCQkJCW91dHB1dC5hcHBlbmQoV0lMRENBUkRfTkFNRSkuYXBwZW5kKFdJTERDQVJEX0VYVEVORFMpOworCQkJCXRoaXMuYm91bmQucHJpbnRFeHByZXNzaW9uKDAsIG91dHB1dCk7CisJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OiAvLyBTVVBFUgotICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoV0lMRENBUkRfTkFNRSkuYXBwZW5kKFdJTERDQVJEX1NVUEVSKTsKLSAgICAgICAgICAgIAl0aGlzLmJvdW5kLnByaW50RXhwcmVzc2lvbigwLCBvdXRwdXQpOwotICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICB9ICAgICAgICAJICAgIAorCQkJb3V0cHV0LmFwcGVuZChXSUxEQ0FSRF9OQU1FKS5hcHBlbmQoV0lMRENBUkRfU1VQRVIpOworCQkJdGhpcy5ib3VuZC5wcmludEV4cHJlc3Npb24oMCwgb3V0cHV0KTsKKwkJCWJyZWFrOworCQl9CiAJCXJldHVybiBvdXRwdXQ7Ci0JfQkKLQkKKwl9CisKIAkvLyBvbmx5IGludm9rZWQgZm9yIGltcHJvdmluZyByZXNpbGllbmNlIHdoZW4gdW5hYmxlIHRvIGJpbmQgZ2VuZXJpYyB0eXBlIGZyb20gcGFyYW1ldGVyaXplZCByZWZlcmVuY2UKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiBjaGVja0JvdW5kcykgewogCQlpZiAodGhpcy5ib3VuZCAhPSBudWxsKSB7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVBcmd1bWVudChCbG9ja1Njb3BlIGJsb2NrU2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsIGludCByYW5rKSB7CiAJICAgIHJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGJsb2NrU2NvcGUsIGdlbmVyaWNUeXBlLCByYW5rKTsKIAl9Ci0JCisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVBcmd1bWVudChDbGFzc1Njb3BlIGNsYXNzU2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsIGludCByYW5rKSB7CiAJICAgIHJldHVybiBpbnRlcm5hbFJlc29sdmVUeXBlKGNsYXNzU2NvcGUsIGdlbmVyaWNUeXBlLCByYW5rKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQW5ub3RhdGlvbkluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Bbm5vdGF0aW9uSW5mby5qYXZhCmluZGV4IDQ2ZDcwMWEuLmQ4MWVjMWMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Bbm5vdGF0aW9uSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Bbm5vdGF0aW9uSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIEJFQSBTeXN0ZW1zLCBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDE1ICs3LDE5IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgdHlldW5nQGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgIG9saXZpZXJfdGhvbWFubkBjYS5pYm0uY29tIC0gYWRkIGhhc2hDb2RlKCkgYW5kIGVxdWFscyguLikgbWV0aG9kcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db25zdGFudFBvb2w7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlBbm5vdGF0aW9uIHsKIAkvKiogVGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSAqLwpAQCAtNDgsNyArNTIsNyBAQAogfQogcHJpdmF0ZSB2b2lkIGRlY29kZUFubm90YXRpb24oKSB7CiAJdGhpcy5yZWFkT2Zmc2V0ID0gMDsKLQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KDApXSAtIHN0cnVjdE9mZnNldDsKKwlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KDApXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCXRoaXMudHlwZW5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAlpbnQgbnVtYmVyT2ZQYWlycyA9IHUyQXQoMik7CiAJLy8gdTIgdHlwZV9pbmRleCArIHUyIG51bV9tZW1iZXJfdmFsdWVfcGFpcgpAQCAtNTYsNyArNjAsNyBAQAogCXRoaXMucGFpcnMgPSBudW1iZXJPZlBhaXJzID09IDAgPyBFbGVtZW50VmFsdWVQYWlySW5mby5Ob01lbWJlcnMgOiBuZXcgRWxlbWVudFZhbHVlUGFpckluZm9bbnVtYmVyT2ZQYWlyc107CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlBhaXJzOyBpKyspIHsKIAkJLy8gdTIgbWVtYmVyX25hbWVfaW5kZXg7Ci0JCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdCh0aGlzLnJlYWRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldDsKKwkJdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHRoaXMucmVhZE9mZnNldCldIC0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CiAJCWNoYXJbXSBtZW1iZXJuYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCXRoaXMucmVhZE9mZnNldCArPSAyOwogCQlPYmplY3QgdmFsdWUgPSBkZWNvZGVEZWZhdWx0VmFsdWUoKTsKQEAgLTE0Nyw3ICsxNTEsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdGFnICIgKyAoY2hhcikgdGFnKTsgLy8kTk9OLU5MUy0xJAkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVucmVjb2duaXplZCB0YWcgIiArIChjaGFyKSB0YWcpOyAvLyROT04tTkxTLTEkCiAJfQogCXJldHVybiB2YWx1ZTsKIH0KQEAgLTE2OSwxMSArMTczLDExIEBACiAJY3VycmVudE9mZnNldCsrOwogCXN3aXRjaCAodGFnKSB7CiAJCWNhc2UgJ2UnOgotCQkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjdXJyZW50T2Zmc2V0KV0gLSBzdHJ1Y3RPZmZzZXQ7CisJCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGN1cnJlbnRPZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQkJY2hhcltdIHR5cGVOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCQljdXJyZW50T2Zmc2V0ICs9IDI7CiAJCQlpZiAodHlwZU5hbWUubGVuZ3RoID09IDM4ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBDb25zdGFudFBvb2wuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OUE9MSUNZKSkgewotCQkJCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjdXJyZW50T2Zmc2V0KV0gLSBzdHJ1Y3RPZmZzZXQ7CisJCQkJdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGN1cnJlbnRPZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQkJCWNoYXJbXSBjb25zdE5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJCQl0aGlzLnN0YW5kYXJkQW5ub3RhdGlvblRhZ0JpdHMgfD0gQW5ub3RhdGlvbi5nZXRSZXRlbnRpb25Qb2xpY3koY29uc3ROYW1lKTsKIAkJCX0KQEAgLTIxMywxMSArMjE3LDExIEBACiAJY3VycmVudE9mZnNldCsrOwogCXN3aXRjaCAodGFnKSB7CiAJCWNhc2UgJ2UnOgotCQkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjdXJyZW50T2Zmc2V0KV0gLSBzdHJ1Y3RPZmZzZXQ7CisJCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGN1cnJlbnRPZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQkJY2hhcltdIHR5cGVOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCQljdXJyZW50T2Zmc2V0ICs9IDI7CiAJCQlpZiAodHlwZU5hbWUubGVuZ3RoID09IDM0ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBDb25zdGFudFBvb2wuSkFWQV9MQU5HX0FOTk9UQVRJT05fRUxFTUVOVFRZUEUpKSB7Ci0JCQkJdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGN1cnJlbnRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldDsKKwkJCQl1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoY3VycmVudE9mZnNldCldIC0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CiAJCQkJY2hhcltdIGNvbnN0TmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCQkJCXRoaXMuc3RhbmRhcmRBbm5vdGF0aW9uVGFnQml0cyB8PSBBbm5vdGF0aW9uLmdldFRhcmdldEVsZW1lbnRUeXBlKGNvbnN0TmFtZSk7CiAJCQl9CkBAIC0yNTksMTIgKzI2MywxMiBAQAogICogUmVhZCB0aHJvdWdoIHRoaXMgYW5ub3RhdGlvbiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHRoZSBuZWNlc3NhcnkgdGFnCiAgKiBiaXRzIGFuZCB0aGUgbGVuZ3RoIG9mIHRoaXMgYW5ub3RhdGlvbi4gVGhlIGRhdGEgc3RydWN0dXJlIHdpbGwgbm90IGJlCiAgKiBmbHVzaGVkIG91dC4KLSAqIAorICoKICAqIFRoZSB0YWcgYml0cyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgKHN1cHBvcnRlZCkgc3RhbmRhcmQKICAqIGFubm90YXRpb24uIGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQsCiAgKiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24sIGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCwgYW5kCiAgKiBqYXZhLmxhbmcuRGVwcmVjYXRlZAotICogCisgKgogICogQHBhcmFtIGV4cGVjdFJ1bnRpbWVWaXNpYmxlQW5ubwogICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2Q+IHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHJ1bnRpbWUtdmlzaWJsZSBhbm5vdGF0aW9uCiAgKiBAcGFyYW0gdG9wbGV2ZWwgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHRoYXQgYW4gbmVzdGVkIGFubm90YXRpb24gaXMgcmVhZC4KQEAgLTI3Myw3ICsyNzcsNyBAQAogICovCiBwcml2YXRlIGludCBzY2FuQW5ub3RhdGlvbihpbnQgb2Zmc2V0LCBib29sZWFuIGV4cGVjdFJ1bnRpbWVWaXNpYmxlQW5ubywgYm9vbGVhbiB0b3BsZXZlbCkgewogCWludCBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0OwotCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQob2Zmc2V0KV0gLSBzdHJ1Y3RPZmZzZXQ7CisJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChvZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCWNoYXJbXSB0eXBlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCWlmICh0b3BsZXZlbCkKIAkJdGhpcy50eXBlbmFtZSA9IHR5cGVOYW1lOwpAQCAtMjg4LDE4ICsyOTIsMTggQEAKIAkJCQkJcmV0dXJuIGN1cnJlbnRPZmZzZXQ7CiAJCQkJfQogCQkJCWJyZWFrOworCQkJY2FzZSAyMzoKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIENvbnN0YW50UG9vbC5KQVZBX0xBTkdfU0FGRVZBUkFSR1MpKSB7CisJCQkJCXRoaXMuc3RhbmRhcmRBbm5vdGF0aW9uVGFnQml0cyB8PSBUYWdCaXRzLkFubm90YXRpb25TYWZlVmFyYXJnczsKKwkJCQkJcmV0dXJuIGN1cnJlbnRPZmZzZXQ7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJY2FzZSAyOToKIAkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIENvbnN0YW50UG9vbC5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVQpKSB7CiAJCQkJCWN1cnJlbnRPZmZzZXQgKz0gMjsKIAkJCQkJcmV0dXJuIHJlYWRUYXJnZXRWYWx1ZShjdXJyZW50T2Zmc2V0KTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIDMzOgotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgQ29uc3RhbnRQb29sLkpBVkFfTEFOR19BTk5PVEFUSU9OX0RPQ1VNRU5URUQpKSB7Ci0JCQkJCXRoaXMuc3RhbmRhcmRBbm5vdGF0aW9uVGFnQml0cyB8PSBUYWdCaXRzLkFubm90YXRpb25Eb2N1bWVudGVkOwotCQkJCQlyZXR1cm4gY3VycmVudE9mZnNldDsKLQkJCQl9Ci0JCQkJYnJlYWs7CiAJCQljYXNlIDMyOgogCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgQ29uc3RhbnRQb29sLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTikpIHsKIAkJCQkJY3VycmVudE9mZnNldCArPSAyOwpAQCAtMzEwLDYgKzMxNCwxOCBAQAogCQkJCQlyZXR1cm4gY3VycmVudE9mZnNldDsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIDMzOgorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgQ29uc3RhbnRQb29sLkpBVkFfTEFOR19BTk5PVEFUSU9OX0RPQ1VNRU5URUQpKSB7CisJCQkJCXRoaXMuc3RhbmRhcmRBbm5vdGF0aW9uVGFnQml0cyB8PSBUYWdCaXRzLkFubm90YXRpb25Eb2N1bWVudGVkOworCQkJCQlyZXR1cm4gY3VycmVudE9mZnNldDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDUyOgorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgQ29uc3RhbnRQb29sLkpBVkFfTEFOR19JTlZPS0VfTUVUSE9ESEFORExFX1BPTFlNT1JQSElDU0lHTkFUVVJFKSkgeworCQkJCQl0aGlzLnN0YW5kYXJkQW5ub3RhdGlvblRhZ0JpdHMgfD0gVGFnQml0cy5Bbm5vdGF0aW9uUG9seW1vcnBoaWNTaWduYXR1cmU7CisJCQkJCXJldHVybiBjdXJyZW50T2Zmc2V0OworCQkJCX0KKwkJCQlicmVhazsKIAkJfQogCX0KIAlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUGFpcnM7IGkrKykgewpAQCAtMzc2LDQgKzM5MiwzMCBAQAogCX0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CitwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCWZpbmFsIGludCBwcmltZSA9IDMxOworCWludCByZXN1bHQgPSAxOworCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgVXRpbC5oYXNoQ29kZSh0aGlzLnBhaXJzKTsKKwlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIENoYXJPcGVyYXRpb24uaGFzaENvZGUodGhpcy50eXBlbmFtZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYgKHRoaXMgPT0gb2JqKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAob2JqID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCUFubm90YXRpb25JbmZvIG90aGVyID0gKEFubm90YXRpb25JbmZvKSBvYmo7CisJaWYgKCFBcnJheXMuZXF1YWxzKHRoaXMucGFpcnMsIG90aGVyLnBhaXJzKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghQXJyYXlzLmVxdWFscyh0aGlzLnR5cGVuYW1lLCBvdGhlci50eXBlbmFtZSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Bbm5vdGF0aW9uTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0Fubm90YXRpb25NZXRob2RJbmZvLmphdmEKaW5kZXggMGQ2ZGNiOC4uNmRkYmE3NyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0Fubm90YXRpb25NZXRob2RJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0Fubm90YXRpb25NZXRob2RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDcgKzI3LDcgQEAKIAkJaW50IHV0ZjhPZmZzZXQgPSBtZXRob2RJbmZvLmNvbnN0YW50UG9vbE9mZnNldHNbbWV0aG9kSW5mby51MkF0KHJlYWRPZmZzZXQpXSAtIG1ldGhvZEluZm8uc3RydWN0T2Zmc2V0OwogCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IG1ldGhvZEluZm8udXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCBtZXRob2RJbmZvLnUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJaWYgKGF0dHJpYnV0ZU5hbWUubGVuZ3RoID4gMCkgewotCQkJc3dpdGNoKGF0dHJpYnV0ZU5hbWVbMF0pIHsJCQkJCisJCQlzd2l0Y2goYXR0cmlidXRlTmFtZVswXSkgewogCQkJCWNhc2UgJ0EnOgogCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQW5ub3RhdGlvbkRlZmF1bHROYW1lKSkgewogCQkJCQkJLy8gcmVhZE9mZnNldCArIDYgc28gdGhlIG9mZnNldCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlICdtZW1iZXJfdmFsdWUnIGVudHJ5CkBAIC00NCw3ICs0NCw3IEBACiAJCQkJY2FzZSAnUicgOgogCQkJCQlBbm5vdGF0aW9uSW5mb1tdIG1ldGhvZEFubm90YXRpb25zID0gbnVsbDsKIAkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNOYW1lKSkgewotCQkJCQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBkZWNvZGVNZXRob2RBbm5vdGF0aW9ucyhyZWFkT2Zmc2V0LCB0cnVlLCBtZXRob2RJbmZvKTsJCQkJCQkKKwkJCQkJCW1ldGhvZEFubm90YXRpb25zID0gZGVjb2RlTWV0aG9kQW5ub3RhdGlvbnMocmVhZE9mZnNldCwgdHJ1ZSwgbWV0aG9kSW5mbyk7CiAJCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZUludmlzaWJsZUFubm90YXRpb25zTmFtZSkpIHsKIAkJCQkJCW1ldGhvZEFubm90YXRpb25zID0gZGVjb2RlTWV0aG9kQW5ub3RhdGlvbnMocmVhZE9mZnNldCwgZmFsc2UsIG1ldGhvZEluZm8pOwogCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEKaW5kZXggNjc5YTNjZS4uNzA5NWFmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMyw3ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogCiBwdWJsaWMgaW50ZXJmYWNlIENsYXNzRmlsZUNvbnN0YW50cyB7Ci0JCisKIAlpbnQgQWNjRGVmYXVsdCA9IDA7CiAJLyoKIAkgKiBNb2RpZmllcnMKQEAgLTU4LDcgKzU4LDcgQEAKIAlpbnQgTWV0aG9kUmVmVGFnID0gMTA7CiAJaW50IEludGVyZmFjZU1ldGhvZFJlZlRhZyA9IDExOwogCWludCBOYW1lQW5kVHlwZVRhZyA9IDEyOwotCQorCiAJaW50IENvbnN0YW50TWV0aG9kUmVmRml4ZWRTaXplID0gNTsKIAlpbnQgQ29uc3RhbnRDbGFzc0ZpeGVkU2l6ZSA9IDM7CiAJaW50IENvbnN0YW50RG91YmxlRml4ZWRTaXplID0gOTsKQEAgLTcwLDM0ICs3MCw0MSBAQAogCWludCBDb25zdGFudFN0cmluZ0ZpeGVkU2l6ZSA9IDM7CiAJaW50IENvbnN0YW50VXRmOEZpeGVkU2l6ZSA9IDM7CiAJaW50IENvbnN0YW50TmFtZUFuZFR5cGVGaXhlZFNpemUgPSA1OwotCQorCiAJaW50IE1BSk9SX1ZFUlNJT05fMV8xID0gNDU7CiAJaW50IE1BSk9SX1ZFUlNJT05fMV8yID0gNDY7CiAJaW50IE1BSk9SX1ZFUlNJT05fMV8zID0gNDc7CiAJaW50IE1BSk9SX1ZFUlNJT05fMV80ID0gNDg7Ci0JaW50IE1BSk9SX1ZFUlNJT05fMV81ID0gNDk7IAotCWludCBNQUpPUl9WRVJTSU9OXzFfNiA9IDUwOyAKLQlpbnQgTUFKT1JfVkVSU0lPTl8xXzcgPSA1MTsgCi0JCisJaW50IE1BSk9SX1ZFUlNJT05fMV81ID0gNDk7CisJaW50IE1BSk9SX1ZFUlNJT05fMV82ID0gNTA7CisJaW50IE1BSk9SX1ZFUlNJT05fMV83ID0gNTE7CisKIAlpbnQgTUlOT1JfVkVSU0lPTl8wID0gMDsKIAlpbnQgTUlOT1JfVkVSU0lPTl8xID0gMTsKLQlpbnQgTUlOT1JfVkVSU0lPTl8yID0gMjsJCi0JaW50IE1JTk9SX1ZFUlNJT05fMyA9IDM7CQotCQorCWludCBNSU5PUl9WRVJTSU9OXzIgPSAyOworCWludCBNSU5PUl9WRVJTSU9OXzMgPSAzOworCWludCBNSU5PUl9WRVJTSU9OXzQgPSA0OworCiAJLy8gSkRLIDEuMSAtPiAxLjcsIGNvbXBhcmFibGUgdmFsdWUgYWxsb3dpbmcgdG8gY2hlY2sgYm90aCBtYWpvci9taW5vciB2ZXJzaW9uIGF0IG9uY2UgMS40LjEgPiAxLjQuMAogCS8vIDE2IHVuc2lnbmVkIGJpdHMgZm9yIG1ham9yLCB0aGVuIDE2IGJpdHMgZm9yIG1pbm9yCiAJbG9uZyBKREsxXzEgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV8xIDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzM7IC8vIDEuMS4gaXMgNDUuMwogCWxvbmcgSkRLMV8yID0gICgobG9uZylDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzIgPDwgMTYpICsgQ2xhc3NGaWxlQ29uc3RhbnRzLk1JTk9SX1ZFUlNJT05fMDsKIAlsb25nIEpESzFfMyA9ICAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV8zIDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7CiAJbG9uZyBKREsxXzQgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV80IDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7Ci0JbG9uZyBKREsxXzUgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV81IDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7CQotCWxvbmcgSkRLMV82ID0gKChsb25nKUNsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfNiA8PCAxNikgKyBDbGFzc0ZpbGVDb25zdGFudHMuTUlOT1JfVkVSU0lPTl8wOwkKLQlsb25nIEpESzFfNyA9ICgobG9uZylDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzcgPDwgMTYpICsgQ2xhc3NGaWxlQ29uc3RhbnRzLk1JTk9SX1ZFUlNJT05fMDsJCi0JCisJbG9uZyBKREsxXzUgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV81IDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7CisJbG9uZyBKREsxXzYgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV82IDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7CisJbG9uZyBKREsxXzcgPSAoKGxvbmcpQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV83IDw8IDE2KSArIENsYXNzRmlsZUNvbnN0YW50cy5NSU5PUl9WRVJTSU9OXzA7CisKKwkvKgorCSAqIGNsZGMxLjEgaXMgNDUuMywgYnV0IHdlIG1vZGlmeSBpdCB0byBiZSBkaWZmZXJlbnQgZnJvbSBKREsxXzEuCisJICogSW4gdGhlIGNvZGUgZ2VuLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBzYW1lIHRhcmdldCB2YWx1ZSBhcyBKREsxXzEKKwkgKi8KKwlsb25nIENMRENfMV8xID0gKChsb25nKUNsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfMSA8PCAxNikgKyBDbGFzc0ZpbGVDb25zdGFudHMuTUlOT1JfVkVSU0lPTl80OworCiAJLy8gamRrIGxldmVsIHVzZWQgdG8gZGVub3RlIGZ1dHVyZSByZWxlYXNlczogb3B0aW9uYWwgYmVoYXZpb3IgaXMgbm90IGVuYWJsZWQgZm9yIG5vdywgYnV0IG1heSBiZWNvbWUgc28uIEluIG9yZGVyIHRvIGVuYWJsZSB0aGVzZSwKIAkvLyBzZWFyY2ggZm9yIHJlZmVyZW5jZXMgdG8gdGhpcyBjb25zdGFudCwgYW5kIGNoYW5nZSBpdCB0byBvbmUgb2YgdGhlIG9mZmljaWFsIEpEVCBjb25zdGFudHMgYWJvdmUuCiAJbG9uZyBKREtfREVGRVJSRUQgPSBMb25nLk1BWF9WQUxVRTsKLQkKKwogCWludCBJTlRfQVJSQVkgPSAxMDsKIAlpbnQgQllURV9BUlJBWSA9IDg7CiAJaW50IEJPT0xFQU5fQVJSQVkgPSA0OwpAQCAtMTA2LDEwICsxMTMsMTEgQEAKIAlpbnQgTE9OR19BUlJBWSA9IDExOwogCWludCBGTE9BVF9BUlJBWSA9IDY7CiAJaW50IERPVUJMRV9BUlJBWSA9IDc7Ci0JCisKIAkvLyBEZWJ1ZyBhdHRyaWJ1dGVzCi0JaW50IEFUVFJfU09VUkNFID0gMTsgLy8gU291cmNlRmlsZUF0dHJpYnV0ZQotCWludCBBVFRSX0xJTkVTID0gMjsgLy8gTGluZU51bWJlckF0dHJpYnV0ZQotCWludCBBVFRSX1ZBUlMgPSA0OyAvLyBMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUKLQlpbnQgQVRUUl9TVEFDS19NQVAgPSA4OyAvLyBTdGFjayBtYXAgdGFibGUgYXR0cmlidXRlCisJaW50IEFUVFJfU09VUkNFID0gMHgxOyAvLyBTb3VyY2VGaWxlQXR0cmlidXRlCisJaW50IEFUVFJfTElORVMgPSAweDI7IC8vIExpbmVOdW1iZXJBdHRyaWJ1dGUKKwlpbnQgQVRUUl9WQVJTID0gMHg0OyAvLyBMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUKKwlpbnQgQVRUUl9TVEFDS19NQVBfVEFCTEUgPSAweDg7IC8vIFN0YWNrIG1hcCB0YWJsZSBhdHRyaWJ1dGUKKwlpbnQgQVRUUl9TVEFDS19NQVAgPSAweDEwOyAvLyBTdGFjayBtYXAgYXR0cmlidXRlOiBjbGRjCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlUmVhZGVyLmphdmEKaW5kZXggYzE2NmQ4NS4uZDJhMmI2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw2OCArMjQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVSZWFkZXIgZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJQmluYXJ5VHlwZSB7Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRUeXBlTW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKLQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlqYXZhLmlvLlByaW50V3JpdGVyIHByaW50ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIob3V0KTsKIAotCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgIT0gMCkgcHJpbnQucHJpbnQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApIHByaW50LnByaW50KCJwcml2YXRlICIpOyAvLyROT04tTkxTLTEkCi0JaWYgKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpICE9IDApIHByaW50LnByaW50KCJmaW5hbCAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N1cGVyKSAhPSAwKSBwcmludC5wcmludCgic3VwZXIgIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NJbnRlcmZhY2UpICE9IDApIHByaW50LnByaW50KCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCkgIT0gMCkgcHJpbnQucHJpbnQoImFic3RyYWN0ICIpOyAvLyROT04tTkxTLTEkCi0JcHJpbnQuZmx1c2goKTsKLQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gcmVhZChzdHJlYW0sIGZpbGVOYW1lLCBmYWxzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIHJlYWQoZmlsZSwgZmFsc2UpOwotfQotcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgcmVhZChJbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBmdWxseUluaXRpYWxpemUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCWJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSA9IFV0aWwuZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheShzdHJlYW0sIC0xKTsKLQlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgZmlsZU5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JaWYgKGZ1bGx5SW5pdGlhbGl6ZSkgewotCQljbGFzc0ZpbGVSZWFkZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQlyZXR1cm4gY2xhc3NGaWxlUmVhZGVyOwotfQotcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgcmVhZChGaWxlIGZpbGUsIGJvb2xlYW4gZnVsbHlJbml0aWFsaXplKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlieXRlIGNsYXNzRmlsZUJ5dGVzW10gPSBVdGlsLmdldEZpbGVCeXRlQ29udGVudChmaWxlKTsKLQlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS50b0NoYXJBcnJheSgpKTsKLQlpZiAoZnVsbHlJbml0aWFsaXplKSB7Ci0JCWNsYXNzRmlsZVJlYWRlci5pbml0aWFsaXplKCk7Ci0JfQotCXJldHVybiBjbGFzc0ZpbGVSZWFkZXI7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKAotCWphdmEudXRpbC56aXAuWmlwRmlsZSB6aXAsIAotCVN0cmluZyBmaWxlbmFtZSkKLQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVhZCh6aXAsIGZpbGVuYW1lLCBmYWxzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKAotCWphdmEudXRpbC56aXAuWmlwRmlsZSB6aXAsIAotCVN0cmluZyBmaWxlbmFtZSwKLQlib29sZWFuIGZ1bGx5SW5pdGlhbGl6ZSkKLQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCWphdmEudXRpbC56aXAuWmlwRW50cnkgemUgPSB6aXAuZ2V0RW50cnkoZmlsZW5hbWUpOwotCWlmICh6ZSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlieXRlIGNsYXNzRmlsZUJ5dGVzW10gPSBVdGlsLmdldFppcEVudHJ5Qnl0ZUNvbnRlbnQoemUsIHppcCk7Ci0JQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlQnl0ZXMsIGZpbGVuYW1lLnRvQ2hhckFycmF5KCkpOwotCWlmIChmdWxseUluaXRpYWxpemUpIHsKLQkJY2xhc3NGaWxlUmVhZGVyLmluaXRpYWxpemUoKTsKLQl9Ci0JcmV0dXJuIGNsYXNzRmlsZVJlYWRlcjsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlUmVhZGVyIHJlYWQoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCXJldHVybiByZWFkKGZpbGVOYW1lLCBmYWxzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBmdWxseUluaXRpYWxpemUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIHJlYWQobmV3IEZpbGUoZmlsZU5hbWUpLCBmdWxseUluaXRpYWxpemUpOwotfQogCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOwogCXByaXZhdGUgY2hhcltdIGNsYXNzRmlsZU5hbWU7CiAJcHJpdmF0ZSBjaGFyW10gY2xhc3NOYW1lOwpAQCAtOTQsNiArMzMsNyBAQAogCXByaXZhdGUgQW5ub3RhdGlvbkluZm9bXSBhbm5vdGF0aW9uczsKIAlwcml2YXRlIEZpZWxkSW5mb1tdIGZpZWxkczsKIAlwcml2YXRlIGludCBmaWVsZHNDb3VudDsKKwogCS8vIGluaXRpYWxpemVkIGluIGNhc2UgdGhlIC5jbGFzcyBmaWxlIGlzIGEgbmVzdGVkIHR5cGUKIAlwcml2YXRlIElubmVyQ2xhc3NJbmZvIGlubmVySW5mbzsKIAlwcml2YXRlIGludCBpbm5lckluZm9JbmRleDsKQEAgLTEwOCwxMyArNDgsODYgQEAKIAlwcml2YXRlIGNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKIAlwcml2YXRlIGxvbmcgdGFnQml0czsKIAlwcml2YXRlIGxvbmcgdmVyc2lvbjsKLQkKIAlwcml2YXRlIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZTsKKwlwcml2YXRlIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lczsKKwlwcml2YXRlIGludCBlbmNsb3NpbmdOYW1lQW5kVHlwZUluZGV4OworCXByaXZhdGUgY2hhcltdIGVuY2xvc2luZ01ldGhvZDsKKworcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50VHlwZU1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJamF2YS5pby5QcmludFdyaXRlciBwcmludCA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKG91dCk7CisKKwlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMpICE9IDApIHByaW50LnByaW50KCJwdWJsaWMgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKSBwcmludC5wcmludCgicHJpdmF0ZSAiKTsgLy8kTk9OLU5MUy0xJAorCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwKSBwcmludC5wcmludCgiZmluYWwgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdXBlcikgIT0gMCkgcHJpbnQucHJpbnQoInN1cGVyICIpOyAvLyROT04tTkxTLTEkCisJaWYgKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjSW50ZXJmYWNlKSAhPSAwKSBwcmludC5wcmludCgiaW50ZXJmYWNlICIpOyAvLyROT04tTkxTLTEkCisJaWYgKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpICE9IDApIHByaW50LnByaW50KCJhYnN0cmFjdCAiKTsgLy8kTk9OLU5MUy0xJAorCXByaW50LmZsdXNoKCk7CisJcmV0dXJuIG91dC50b1N0cmluZygpOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHJlYWQoZmlsZSwgZmFsc2UpOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKEZpbGUgZmlsZSwgYm9vbGVhbiBmdWxseUluaXRpYWxpemUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCWJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSA9IFV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KGZpbGUpOworCUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzRmlsZUJ5dGVzLCBmaWxlLmdldEFic29sdXRlUGF0aCgpLnRvQ2hhckFycmF5KCkpOworCWlmIChmdWxseUluaXRpYWxpemUpIHsKKwkJY2xhc3NGaWxlUmVhZGVyLmluaXRpYWxpemUoKTsKKwl9CisJcmV0dXJuIGNsYXNzRmlsZVJlYWRlcjsKK30KKworcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgcmVhZChJbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHJlYWQoc3RyZWFtLCBmaWxlTmFtZSwgZmFsc2UpOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGZ1bGx5SW5pdGlhbGl6ZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJYnl0ZSBjbGFzc0ZpbGVCeXRlc1tdID0gVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOworCUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzRmlsZUJ5dGVzLCBmaWxlTmFtZS50b0NoYXJBcnJheSgpKTsKKwlpZiAoZnVsbHlJbml0aWFsaXplKSB7CisJCWNsYXNzRmlsZVJlYWRlci5pbml0aWFsaXplKCk7CisJfQorCXJldHVybiBjbGFzc0ZpbGVSZWFkZXI7Cit9CisKK3B1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlUmVhZGVyIHJlYWQoCisJamF2YS51dGlsLnppcC5aaXBGaWxlIHppcCwKKwlTdHJpbmcgZmlsZW5hbWUpCisJdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHJlYWQoemlwLCBmaWxlbmFtZSwgZmFsc2UpOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKAorCWphdmEudXRpbC56aXAuWmlwRmlsZSB6aXAsCisJU3RyaW5nIGZpbGVuYW1lLAorCWJvb2xlYW4gZnVsbHlJbml0aWFsaXplKQorCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJamF2YS51dGlsLnppcC5aaXBFbnRyeSB6ZSA9IHppcC5nZXRFbnRyeShmaWxlbmFtZSk7CisJaWYgKHplID09IG51bGwpCisJCXJldHVybiBudWxsOworCWJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSA9IFV0aWwuZ2V0WmlwRW50cnlCeXRlQ29udGVudCh6ZSwgemlwKTsKKwlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgZmlsZW5hbWUudG9DaGFyQXJyYXkoKSk7CisJaWYgKGZ1bGx5SW5pdGlhbGl6ZSkgeworCQljbGFzc0ZpbGVSZWFkZXIuaW5pdGlhbGl6ZSgpOworCX0KKwlyZXR1cm4gY2xhc3NGaWxlUmVhZGVyOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwlyZXR1cm4gcmVhZChmaWxlTmFtZSwgZmFsc2UpOworfQorCitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBmdWxseUluaXRpYWxpemUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHJlYWQobmV3IEZpbGUoZmlsZU5hbWUpLCBmdWxseUluaXRpYWxpemUpOworfQogCiAvKioKICAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyBBY3R1YWwgYnl0ZXMgb2YgYSAuY2xhc3MgZmlsZQogICogQHBhcmFtIGZpbGVOYW1lCUFjdHVhbCBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGJ5dGVzLCBjYW4gYmUgbnVsbAotICogCisgKgogICogQGV4Y2VwdGlvbiBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgogICovCiBwdWJsaWMgQ2xhc3NGaWxlUmVhZGVyKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgY2hhcltdIGZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewpAQCAtMTI0LDEwICsxMzcsMTAgQEAKIC8qKgogICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIGJ5dGVbXQogICogCQlBY3R1YWwgYnl0ZXMgb2YgYSAuY2xhc3MgZmlsZQotICogCisgKgogICogQHBhcmFtIGZpbGVOYW1lIGNoYXJbXQogICogCQlBY3R1YWwgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBieXRlcywgY2FuIGJlIG51bGwKLSAqIAorICoKICAqIEBwYXJhbSBmdWxseUluaXRpYWxpemUgYm9vbGVhbgogICogCQlGbGFnIHRvIGZ1bGx5IGluaXRpYWxpemUgdGhlIG5ldyBvYmplY3QKICAqIEBleGNlcHRpb24gQ2xhc3NGb3JtYXRFeGNlcHRpb24KQEAgLTE0MSwxMiArMTU0LDEyIEBACiAJdGhpcy5jbGFzc0ZpbGVOYW1lID0gZmlsZU5hbWU7CiAJaW50IHJlYWRPZmZzZXQgPSAxMDsKIAl0cnkgewotCQl0aGlzLnZlcnNpb24gPSAoKGxvbmcpdGhpcy51MkF0KDYpIDw8IDE2KSArIHRoaXMudTJBdCg0KTsgLy8gbWFqb3I8PDE2ICsgbWlub3IKLQkJY29uc3RhbnRQb29sQ291bnQgPSB0aGlzLnUyQXQoOCk7CisJCXRoaXMudmVyc2lvbiA9ICgobG9uZyl1MkF0KDYpIDw8IDE2KSArIHUyQXQoNCk7IC8vIG1ham9yPDwxNiArIG1pbm9yCisJCXRoaXMuY29uc3RhbnRQb29sQ291bnQgPSB1MkF0KDgpOwogCQkvLyBQYXNzICMxIC0gRmlsbCBpbiBhbGwgcHJpbWl0aXZlIGNvbnN0YW50cwotCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBuZXcgaW50W2NvbnN0YW50UG9vbENvdW50XTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb25zdGFudFBvb2xDb3VudDsgaSsrKSB7Ci0JCQlpbnQgdGFnID0gdGhpcy51MUF0KHJlYWRPZmZzZXQpOworCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBuZXcgaW50W3RoaXMuY29uc3RhbnRQb29sQ291bnRdOworCQlmb3IgKGludCBpID0gMTsgaSA8IHRoaXMuY29uc3RhbnRQb29sQ291bnQ7IGkrKykgeworCQkJaW50IHRhZyA9IHUxQXQocmVhZE9mZnNldCk7CiAJCQlzd2l0Y2ggKHRhZykgewogCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLlV0ZjhUYWcgOgogCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OwpAQCAtMjA4LDcgKzIyMSw3IEBACiAJCS8vIFJlYWQgdGhlIHN1cGVyY2xhc3MgbmFtZSwgY2FuIGJlIG51bGwgZm9yIGphdmEubGFuZy5PYmplY3QKIAkJaW50IHN1cGVyY2xhc3NOYW1lSW5kZXggPSB1MkF0KHJlYWRPZmZzZXQpOwogCQlyZWFkT2Zmc2V0ICs9IDI7Ci0JCS8vIGlmIHN1cGVyY2xhc3NOYW1lSW5kZXggaXMgZXF1YWxzIHRvIDAgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhlIAorCQkvLyBpZiBzdXBlcmNsYXNzTmFtZUluZGV4IGlzIGVxdWFscyB0byAwIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoZQogCQkvLyBmaWVsZCB0aGlzLnN1cGVyY2xhc3NOYW1lLiBudWxsIGlzIGZpbmUuCiAJCWlmIChzdXBlcmNsYXNzTmFtZUluZGV4ICE9IDApIHsKIAkJCXRoaXMuc3VwZXJjbGFzc05hbWUgPSBnZXRDb25zdGFudENsYXNzTmFtZUF0KHN1cGVyY2xhc3NOYW1lSW5kZXgpOwpAQCAtMjMxLDcgKzI0NCw3IEBACiAJCQlGaWVsZEluZm8gZmllbGQ7CiAJCQl0aGlzLmZpZWxkcyA9IG5ldyBGaWVsZEluZm9bdGhpcy5maWVsZHNDb3VudF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZmllbGRzQ291bnQ7IGkrKykgewotCQkJCWZpZWxkID0gRmllbGRJbmZvLmNyZWF0ZUZpZWxkKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KTsKKwkJCQlmaWVsZCA9IEZpZWxkSW5mby5jcmVhdGVGaWVsZCh0aGlzLnJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KTsKIAkJCQl0aGlzLmZpZWxkc1tpXSA9IGZpZWxkOwogCQkJCXJlYWRPZmZzZXQgKz0gZmllbGQuc2l6ZUluQnl0ZXMoKTsKIAkJCX0KQEAgLTI0NCw4ICsyNTcsOCBAQAogCQkJYm9vbGVhbiBpc0Fubm90YXRpb25UeXBlID0gKHRoaXMuYWNjZXNzRmxhZ3MgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQW5ub3RhdGlvbikgIT0gMDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZXRob2RzQ291bnQ7IGkrKykgewogCQkJCXRoaXMubWV0aG9kc1tpXSA9IGlzQW5ub3RhdGlvblR5cGUKLQkJCQkJPyBBbm5vdGF0aW9uTWV0aG9kSW5mby5jcmVhdGVBbm5vdGF0aW9uTWV0aG9kKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KQotCQkJCQk6IE1ldGhvZEluZm8uY3JlYXRlTWV0aG9kKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KTsKKwkJCQkJPyBBbm5vdGF0aW9uTWV0aG9kSW5mby5jcmVhdGVBbm5vdGF0aW9uTWV0aG9kKHRoaXMucmVmZXJlbmNlLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMsIHJlYWRPZmZzZXQpCisJCQkJCTogTWV0aG9kSW5mby5jcmVhdGVNZXRob2QodGhpcy5yZWZlcmVuY2UsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0cywgcmVhZE9mZnNldCk7CiAJCQkJcmVhZE9mZnNldCArPSB0aGlzLm1ldGhvZHNbaV0uc2l6ZUluQnl0ZXMoKTsKIAkJCX0KIAkJfQpAQCAtMjY0LDkgKzI3NywxMCBAQAogCQkJc3dpdGNoKGF0dHJpYnV0ZU5hbWVbMF0gKSB7CiAJCQkJY2FzZSAnRScgOgogCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRW5jbG9zaW5nTWV0aG9kTmFtZSkpIHsKLQkJCQkJCXV0ZjhPZmZzZXQgPSAKLQkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQgKyA2KV0gLSBzdHJ1Y3RPZmZzZXQgKyAxKV0gLSBzdHJ1Y3RPZmZzZXQ7IAotCQkJCQkJdGhpcy5lbmNsb3NpbmdUeXBlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQkJCQkJdXRmOE9mZnNldCA9CisJCQkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQodGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCArIDYpXSArIDEpXTsKKyAJCQkJCQl0aGlzLmVuY2xvc2luZ1R5cGVOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCQkJCQl0aGlzLmVuY2xvc2luZ05hbWVBbmRUeXBlSW5kZXggPSB1MkF0KHJlYWRPZmZzZXQgKyA4KTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlICdEJyA6CkBAIC0yODIsOCArMjk2LDggQEAKIAkJCQkJCQlpbm5lck9mZnNldCs9IDI7CiAJCQkJCQkJdGhpcy5pbm5lckluZm9zID0gbmV3IElubmVyQ2xhc3NJbmZvW251bWJlcl9vZl9jbGFzc2VzXTsKIAkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG51bWJlcl9vZl9jbGFzc2VzOyBqKyspIHsKLQkJCQkJCQkJdGhpcy5pbm5lckluZm9zW2pdID0gCi0JCQkJCQkJCQluZXcgSW5uZXJDbGFzc0luZm8ocmVmZXJlbmNlLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMsIGlubmVyT2Zmc2V0KTsgCisJCQkJCQkJCXRoaXMuaW5uZXJJbmZvc1tqXSA9CisJCQkJCQkJCQluZXcgSW5uZXJDbGFzc0luZm8odGhpcy5yZWZlcmVuY2UsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0cywgaW5uZXJPZmZzZXQpOwogCQkJCQkJCQlpZiAodGhpcy5jbGFzc05hbWVJbmRleCA9PSB0aGlzLmlubmVySW5mb3Nbal0uaW5uZXJDbGFzc05hbWVJbmRleCkgewogCQkJCQkJCQkJdGhpcy5pbm5lckluZm8gPSB0aGlzLmlubmVySW5mb3Nbal07CiAJCQkJCQkJCQl0aGlzLmlubmVySW5mb0luZGV4ID0gajsKQEAgLTI5OCw3ICszMTIsNyBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfSBlbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5JbmNvbnNpc3RlbnRIaWVyYXJjaHkpKSB7Ci0JCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNJbmNvbnNpc3RlbnRIaWVyYXJjaHk7CisJCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlICdTJyA6CkBAIC0zMTgsNyArMzMyLDcgQEAKIAkJCQkJCQljYXNlICdpJyA6CiAJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TaWduYXR1cmVOYW1lKSkgewogCQkJCQkJCQkJdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQgKyA2KV07Ci0JCQkJCQkJCQl0aGlzLnNpZ25hdHVyZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwkJCQkKKwkJCQkJCQkJCXRoaXMuc2lnbmF0dXJlID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtMzMwLDI5ICszNDQsNDYgQEAKIAkJCQkJCWRlY29kZUFubm90YXRpb25zKHJlYWRPZmZzZXQsIGZhbHNlKTsKIAkJCQkJfQogCQkJCQlicmVhazsKKwkJCQljYXNlICdNJyA6CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5NaXNzaW5nVHlwZXNOYW1lKSkgeworCQkJCQkJLy8gZGVjb2RlIHRoZSBtaXNzaW5nIHR5cGVzCisJCQkJCQlpbnQgbWlzc2luZ1R5cGVPZmZzZXQgPSByZWFkT2Zmc2V0ICsgNjsKKwkJCQkJCWludCBudW1iZXJPZk1pc3NpbmdUeXBlcyA9IHUyQXQobWlzc2luZ1R5cGVPZmZzZXQpOworCQkJCQkJaWYgKG51bWJlck9mTWlzc2luZ1R5cGVzICE9IDApIHsKKwkJCQkJCQl0aGlzLm1pc3NpbmdUeXBlTmFtZXMgPSBuZXcgY2hhcltudW1iZXJPZk1pc3NpbmdUeXBlc11bXVtdOworCQkJCQkJCW1pc3NpbmdUeXBlT2Zmc2V0ICs9IDI7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJPZk1pc3NpbmdUeXBlczsgaisrKSB7CisJCQkJCQkJCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdCh0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChtaXNzaW5nVHlwZU9mZnNldCldICsgMSldOworCQkJCQkJCQljaGFyW10gbWlzc2luZ1R5cGVDb25zdGFudFBvb2xOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCQkJCQkJCXRoaXMubWlzc2luZ1R5cGVOYW1lc1tqXSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIG1pc3NpbmdUeXBlQ29uc3RhbnRQb29sTmFtZSk7CisJCQkJCQkJCW1pc3NpbmdUeXBlT2Zmc2V0ICs9IDI7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CiAJCQl9CiAJCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOwogCQl9CiAJCWlmIChmdWxseUluaXRpYWxpemUpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOworCQkJaW5pdGlhbGl6ZSgpOwogCQl9CiAJfSBjYXRjaChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCXRocm93IGU7CiAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKAotCQkJQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyVHJ1bmNhdGVkSW5wdXQsIAotCQkJcmVhZE9mZnNldCk7IAorCQkJQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyVHJ1bmNhdGVkSW5wdXQsCisJCQlyZWFkT2Zmc2V0KTsKIAl9CiB9CiAKIC8qKgotICogCUFuc3dlciB0aGUgcmVjZWl2ZXIncyBhY2Nlc3MgZmxhZ3MuICBUaGUgdmFsdWUgb2YgdGhlIGFjY2Vzc19mbGFncworICogQW5zd2VyIHRoZSByZWNlaXZlcidzIGFjY2VzcyBmbGFncy4gIFRoZSB2YWx1ZSBvZiB0aGUgYWNjZXNzX2ZsYWdzCiAgKglpdGVtIGlzIGEgbWFzayBvZiBtb2RpZmllcnMgdXNlZCB3aXRoIGNsYXNzIGFuZCBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLgotICogIEByZXR1cm4gaW50IAorICogIEByZXR1cm4gaW50CiAgKi8KIHB1YmxpYyBpbnQgYWNjZXNzRmxhZ3MoKSB7CiAJcmV0dXJuIHRoaXMuYWNjZXNzRmxhZ3M7CiB9CisKIHByaXZhdGUgdm9pZCBkZWNvZGVBbm5vdGF0aW9ucyhpbnQgb2Zmc2V0LCBib29sZWFuIHJ1bnRpbWVWaXNpYmxlKSB7CiAJaW50IG51bWJlck9mQW5ub3RhdGlvbnMgPSB1MkF0KG9mZnNldCArIDYpOwogCWlmIChudW1iZXJPZkFubm90YXRpb25zID4gMCkgewpAQCAtMzg4LDYgKzQxOSwxNCBAQAogCQl9CiAJfQogfQorCisvKioKKyAqIEByZXR1cm4gdGhlIGFubm90YXRpb25zIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAqLworcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7CisJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnM7Cit9CisKIC8qKgogICogQW5zd2VyIHRoZSBjaGFyIGFycmF5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnN0YW50IGNsYXNzLgogICogY29uc3RhbnRQb29sSW5kZXggaXMgdGhlIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sIHRoYXQgaXMgYSBjb25zdGFudCBjbGFzcyBlbnRyeS4KQEAgLTM5OSw2ICs0MzgsNyBAQAogCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQodGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2NvbnN0YW50UG9vbEluZGV4XSArIDEpXTsKIAlyZXR1cm4gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiB9CisKIC8qKgogICogQW5zd2VyIHRoZSBpbnQgYXJyYXkgdGhhdCBjb3JyZXNwb25kcyB0byBhbGwgdGhlIG9mZnNldHMgb2YgZWFjaCBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbAogICoKQEAgLTQwNyw2ICs0NDcsMjcgQEAKIHB1YmxpYyBpbnRbXSBnZXRDb25zdGFudFBvb2xPZmZzZXRzKCkgewogCXJldHVybiB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHM7CiB9CisKK3B1YmxpYyBjaGFyW10gZ2V0RW5jbG9zaW5nTWV0aG9kKCkgeworCWlmICh0aGlzLmVuY2xvc2luZ05hbWVBbmRUeXBlSW5kZXggPD0gMCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKHRoaXMuZW5jbG9zaW5nTWV0aG9kID09IG51bGwpIHsKKwkJLy8gcmVhZCB0aGUgbmFtZQorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkKKwkJaW50IG5hbWVBbmRUeXBlT2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3RoaXMuZW5jbG9zaW5nTmFtZUFuZFR5cGVJbmRleF07CisJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQobmFtZUFuZFR5cGVPZmZzZXQgKyAxKV07CisJCWJ1ZmZlci5hcHBlbmQodXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSkpOworCisJCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChuYW1lQW5kVHlwZU9mZnNldCArIDMpXTsKKwkJYnVmZmVyLmFwcGVuZCh1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKSk7CisKKwkJdGhpcy5lbmNsb3NpbmdNZXRob2QgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpLnRvQ2hhckFycmF5KCk7CisJfQorCXJldHVybiB0aGlzLmVuY2xvc2luZ01ldGhvZDsKK30KKwogLyoKICAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgY29tcG91bmROYW1lIG9mIHRoZSBlbmNsb3NpbmcgdHlwZQogICogb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KQEAgLTQxNCw2ICs0NzUsNyBAQAogcHVibGljIGNoYXJbXSBnZXRFbmNsb3NpbmdUeXBlTmFtZSgpIHsKIAlyZXR1cm4gdGhpcy5lbmNsb3NpbmdUeXBlTmFtZTsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgdGhpcy5maWVsZHMgb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCiAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUJpbmFyeUZpZWxkW10KQEAgLTQyMSwxNSArNDgzLDE4IEBACiBwdWJsaWMgSUJpbmFyeUZpZWxkW10gZ2V0RmllbGRzKCkgewogCXJldHVybiB0aGlzLmZpZWxkczsKIH0KKwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSURlcGVuZGVudCNnZXRGaWxlTmFtZSgpCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CiAJcmV0dXJuIHRoaXMuY2xhc3NGaWxlTmFtZTsKIH0KKwogcHVibGljIGNoYXJbXSBnZXRHZW5lcmljU2lnbmF0dXJlKCkgewogCXJldHVybiB0aGlzLnNpZ25hdHVyZTsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdGhlIHNvdXJjZSBuYW1lIGlmIHRoZSByZWNlaXZlciBpcyBhIGlubmVyIHR5cGUuIFJldHVybiBudWxsIGlmIGl0IGlzIGFuIGFub255bW91cyBjbGFzcyBvciBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AtbGV2ZWwgY2xhc3MuCiAgKiBlLmcuCkBAIC00NTYsNiArNTIxLDcgQEAKIAkJcmV0dXJuIHRoaXMuaW5uZXJJbmZvLmdldFNvdXJjZU5hbWUoKTsKIAlyZXR1cm4gbnVsbDsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWVzIG9mIHRoZSByZWNlaXZlcidzIGludGVyZmFjZXMgaW4gdGhlCiAgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjCkBAIC00NzAsMTAgKzUzNiwxMCBAQAogCiAvKioKICAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBuZXN0ZWQgdHlwZXMgb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCi0gKiAKKyAqCiAgKiBUaGlzIG5lc3RlZCB0eXBlIGluZm8gaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlubmVyIGNsYXNzIGF0dHJpYnV0ZXMuIEFzayB0aGUKICAqIG5hbWUgZW52aXJvbm1lbnQgdG8gZmluZCBhIG1lbWJlciB0eXBlIHVzaW5nIGl0cyBjb21wb3VuZCBuYW1lCi0gKiAKKyAqCiAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUJpbmFyeU5lc3RlZFR5cGVbXQogICovCiBwdWJsaWMgSUJpbmFyeU5lc3RlZFR5cGVbXSBnZXRNZW1iZXJUeXBlcygpIHsKQEAgLTQ4Myw4ICs1NDksOCBAQAogCWludCBsZW5ndGggPSB0aGlzLmlubmVySW5mb3MubGVuZ3RoOwogCWludCBzdGFydGluZ0luZGV4ID0gdGhpcy5pbm5lckluZm8gIT0gbnVsbCA/IHRoaXMuaW5uZXJJbmZvSW5kZXggKyAxIDogMDsKIAlpZiAobGVuZ3RoICE9IHN0YXJ0aW5nSW5kZXgpIHsKLQkJSUJpbmFyeU5lc3RlZFR5cGVbXSBtZW1iZXJUeXBlcyA9IAotCQkJbmV3IElCaW5hcnlOZXN0ZWRUeXBlW2xlbmd0aCAtIHRoaXMuaW5uZXJJbmZvSW5kZXhdOyAKKwkJSUJpbmFyeU5lc3RlZFR5cGVbXSBtZW1iZXJUeXBlcyA9CisJCQluZXcgSUJpbmFyeU5lc3RlZFR5cGVbbGVuZ3RoIC0gdGhpcy5pbm5lckluZm9JbmRleF07CiAJCWludCBtZW1iZXJUeXBlSW5kZXggPSAwOwogCQlmb3IgKGludCBpID0gc3RhcnRpbmdJbmRleDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJbm5lckNsYXNzSW5mbyBjdXJyZW50SW5uZXJJbmZvID0gdGhpcy5pbm5lckluZm9zW2ldOwpAQCAtNDk1LDEyICs1NjEsMTIgQEAKIAkJCSAqIGF0dHJpYnV0ZSBlbnRyeSBpcyBhIG1lbWJlciBjbGFzcywgYnV0IGR1ZSB0byB0aGUgYnVnOgogCQkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU5MgogCQkJICogd2UgbmVlZGVkIHRvIGFkZCBhbiBleHRyYSBjaGVjay4gU28gd2UgY2hlY2sgdGhhdCBpbm5lck5hbWVJbmRleCBpcyBkaWZmZXJlbnQgZnJvbSAwIGFzIHdlbGwuCi0JCQkgKiAKKwkJCSAqCiAJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk4NzkKIAkJCSAqIEZyb20gSmF2YU1haWwgMS4yLCB0aGUgY2xhc3MgamF2YXgubWFpbC5Gb2xkZXIgY29udGFpbnMgYW4gYW5vbnltb3VzIGNsYXNzIGluIHRoZQogCQkJICogdGVybWluYXRlUXVldWUoKSBtZXRob2QgZm9yIHdoaWNoIHRoZSBpbm5lciBhdHRyaWJ1dGUgaXMgYm9nZ3VzLgogCQkJICogb3V0ZXJDbGFzc05hbWVJZHggaXMgbm90IDAsIGlubmVyTmFtZUluZGV4IGlzIG5vdCAwLCBidXQgdGhlIHNvdXJjZU5hbWUgbGVuZ3RoIGlzIDAuCi0JCQkgKiBTbyBJIGFkZGVkIHRoaXMgZXh0cmEgY2hlY2sgdG8gZmlsdGVyIG91dCB0aGlzIGFub255bW91cyBjbGFzcyBmcm9tIHRoZSAKKwkJCSAqIFNvIEkgYWRkZWQgdGhpcyBleHRyYSBjaGVjayB0byBmaWx0ZXIgb3V0IHRoaXMgYW5vbnltb3VzIGNsYXNzIGZyb20gdGhlCiAJCQkgKiBtZW1iZXIgdHlwZXMuCiAJCQkgKi8KIAkJCWlmIChvdXRlckNsYXNzTmFtZUlkeCAhPSAwCkBAIC01MTUsMTYgKzU4MSwxNyBAQAogCQkJLy8gd2UgbmVlZCB0byByZXNpemUgdGhlIG1lbWJlclR5cGVzIGFycmF5LiBTb21lIGxvY2FsIG9yIGFub255bW91cyBjbGFzc2VzCiAJCQkvLyBhcmUgcHJlc2VudCBpbiB0aGUgY3VycmVudCBjbGFzcy4KIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJbWVtYmVyVHlwZXMsIAotCQkJCTAsIAotCQkJCShtZW1iZXJUeXBlcyA9IG5ldyBJQmluYXJ5TmVzdGVkVHlwZVttZW1iZXJUeXBlSW5kZXhdKSwgCi0JCQkJMCwgCi0JCQkJbWVtYmVyVHlwZUluZGV4KTsgCisJCQkJbWVtYmVyVHlwZXMsCisJCQkJMCwKKwkJCQkobWVtYmVyVHlwZXMgPSBuZXcgSUJpbmFyeU5lc3RlZFR5cGVbbWVtYmVyVHlwZUluZGV4XSksCisJCQkJMCwKKwkJCQltZW1iZXJUeXBlSW5kZXgpOwogCQl9CiAJCXJldHVybiBtZW1iZXJUeXBlczsKIAl9CiAJcmV0dXJuIG51bGw7CiB9CisKIC8qKgogICogQW5zd2VyIHRoZSByZWNlaXZlcidzIHRoaXMubWV0aG9kcyBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5lbnYuSUJpbmFyeU1ldGhvZFtdCkBAIC01MzIsMTIgKzU5OSw1OCBAQAogcHVibGljIElCaW5hcnlNZXRob2RbXSBnZXRNZXRob2RzKCkgewogCXJldHVybiB0aGlzLm1ldGhvZHM7CiB9Ci0vKioKLSAqIEByZXR1cm4gdGhlIGFubm90YXRpb25zIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLSAqLwotcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnM7CisKKy8qCitwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoICE9IDEpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKCJDbGFzc0ZpbGVSZWFkZXIgPGZpbGVuYW1lPiIpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5leGl0KDEpOworCX0KKwlGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKKwlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gcmVhZChmaWxlLCB0cnVlKTsKKwlpZiAocmVhZGVyLmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVhZGVyLmFubm90YXRpb25zLmxlbmd0aDsgaSsrKQorCQkJU3lzdGVtLmVyci5wcmludGxuKHJlYWRlci5hbm5vdGF0aW9uc1tpXSk7CisJfQorCVN5c3RlbS5lcnIucHJpbnQoImNsYXNzICIpOyAvLyROT04tTkxTLTEkCisJU3lzdGVtLmVyci5wcmludChyZWFkZXIuZ2V0TmFtZSgpKTsKKwljaGFyW10gc3VwZXJjbGFzcyA9IHJlYWRlci5nZXRTdXBlcmNsYXNzTmFtZSgpOworCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJU3lzdGVtLmVyci5wcmludCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLmVyci5wcmludChzdXBlcmNsYXNzKTsKKwl9CisJU3lzdGVtLmVyci5wcmludGxuKCk7CisJY2hhcltdW10gaW50ZXJmYWNlcyA9IHJlYWRlci5nZXRJbnRlcmZhY2VOYW1lcygpOworCWlmIChpbnRlcmZhY2VzICE9IG51bGwgJiYgaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisJCVN5c3RlbS5lcnIucHJpbnQoIiBpbXBsZW1lbnRzICIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGkgIT0gMCkgU3lzdGVtLmVyci5wcmludCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmVyci5wcmludGxuKGludGVyZmFjZXNbaV0pOworCQl9CisJfQorCVN5c3RlbS5lcnIucHJpbnRsbigpOworCVN5c3RlbS5lcnIucHJpbnRsbigneycpOworCWlmIChyZWFkZXIuZmllbGRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXIuZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVhZGVyLmZpZWxkc1tpXSk7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKKwkJfQorCX0KKwlpZiAocmVhZGVyLm1ldGhvZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRlci5tZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVhZGVyLm1ldGhvZHNbaV0pOworCQkJU3lzdGVtLmVyci5wcmludGxuKCk7CisJCX0KKwl9CisJU3lzdGVtLmVyci5wcmludGxuKCk7CisJU3lzdGVtLmVyci5wcmludGxuKCd9Jyk7CiB9CisqLworcHVibGljIGNoYXJbXVtdW10gZ2V0TWlzc2luZ1R5cGVOYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5taXNzaW5nVHlwZU5hbWVzOworfQorCiAvKioKICAqIEFuc3dlciBhbiBpbnQgd2hvc2UgYml0cyBhcmUgc2V0IGFjY29yZGluZyB0aGUgYWNjZXNzIGNvbnN0YW50cwogICogZGVmaW5lZCBieSB0aGUgVk0gc3BlYy4KQEAgLTU0NSwxMSArNjU4LDE3IEBACiAgKiBAcmV0dXJuIGludAogICovCiBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwlpbnQgbW9kaWZpZXJzOwogCWlmICh0aGlzLmlubmVySW5mbyAhPSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLmlubmVySW5mby5nZXRNb2RpZmllcnMoKSB8ICh0aGlzLmFjY2Vzc0ZsYWdzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOworCQltb2RpZmllcnMgPSB0aGlzLmlubmVySW5mby5nZXRNb2RpZmllcnMoKQorCQkJfCAodGhpcy5hY2Nlc3NGbGFncyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKQorCQkJfCAodGhpcy5hY2Nlc3NGbGFncyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpOworCX0gZWxzZSB7CisJCW1vZGlmaWVycyA9IHRoaXMuYWNjZXNzRmxhZ3M7CiAJfQotCXJldHVybiB0aGlzLmFjY2Vzc0ZsYWdzOworCXJldHVybiBtb2RpZmllcnM7CiB9CisKIC8qKgogICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSB0eXBlIGluIHRoZQogICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYy4KQEAgLTU2MCw2ICs2NzksNyBAQAogcHVibGljIGNoYXJbXSBnZXROYW1lKCkgewogCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKIH0KKwogcHVibGljIGNoYXJbXSBnZXRTb3VyY2VOYW1lKCkgewogCWlmICh0aGlzLnNvdXJjZU5hbWUgIT0gbnVsbCkKIAkJcmV0dXJuIHRoaXMuc291cmNlTmFtZTsKQEAgLTU3OSw4ICs2OTksOSBAQAogCQkJbmFtZSA9IG5ld05hbWU7CiAJCX0KIAl9Ci0JcmV0dXJuIHRoaXMuc291cmNlTmFtZSA9IG5hbWU7CQorCXJldHVybiB0aGlzLnNvdXJjZU5hbWUgPSBuYW1lOwogfQorCiAvKioKICAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgbmFtZSBvZiB0aGUgcmVjZWl2ZXIncyBzdXBlcmNsYXNzIGluIHRoZQogICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYwpAQCAtNTkyLDkgKzcxMywxMSBAQAogcHVibGljIGNoYXJbXSBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKIAlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzTmFtZTsKIH0KKwogcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKIAlyZXR1cm4gdGhpcy50YWdCaXRzOwogfQorCiAvKioKICAqIEFuc3dlciB0aGUgbWFqb3IvbWlub3IgdmVyc2lvbiBkZWZpbmVkIGluIHRoaXMgY2xhc3MgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIFZNIHNwZWMuCiAgKiBhcyBhIGxvbmc6IChtYWpvcjw8MTYpK21pbm9yCkBAIC02MDMsNiArNzI2LDcgQEAKIHB1YmxpYyBsb25nIGdldFZlcnNpb24oKSB7CiAJcmV0dXJuIHRoaXMudmVyc2lvbjsKIH0KKwogcHJpdmF0ZSBib29sZWFuIGhhc05vblN5bnRoZXRpY0ZpZWxkQ2hhbmdlcyhGaWVsZEluZm9bXSBjdXJyZW50RmllbGRJbmZvcywgRmllbGRJbmZvW10gb3RoZXJGaWVsZEluZm9zKSB7CiAJaW50IGxlbmd0aDEgPSBjdXJyZW50RmllbGRJbmZvcyA9PSBudWxsID8gMCA6IGN1cnJlbnRGaWVsZEluZm9zLmxlbmd0aDsKIAlpbnQgbGVuZ3RoMiA9IG90aGVyRmllbGRJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyRmllbGRJbmZvcy5sZW5ndGg7CkBAIC02MjgsNiArNzUyLDcgQEAKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorCiBwcml2YXRlIGJvb2xlYW4gaGFzTm9uU3ludGhldGljTWV0aG9kQ2hhbmdlcyhNZXRob2RJbmZvW10gY3VycmVudE1ldGhvZEluZm9zLCBNZXRob2RJbmZvW10gb3RoZXJNZXRob2RJbmZvcykgewogCWludCBsZW5ndGgxID0gY3VycmVudE1ldGhvZEluZm9zID09IG51bGwgPyAwIDogY3VycmVudE1ldGhvZEluZm9zLmxlbmd0aDsKIAlpbnQgbGVuZ3RoMiA9IG90aGVyTWV0aG9kSW5mb3MgPT0gbnVsbCA/IDAgOiBvdGhlck1ldGhvZEluZm9zLmxlbmd0aDsKQEAgLTY1NCw2ICs3NzksNyBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CisKIC8qKgogICogQ2hlY2sgaWYgdGhlIHJlY2VpdmVyIGhhcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgY29tcGFyZSB0byB0aGUgYnl0ZSBhcnJheSBpbiBhcmd1bWVudC4KICAqIFN0cnVjdHVyYWwgY2hhbmdlcyBhcmU6CkBAIC02NjQsNyArNzkwLDcgQEAKICAqIC0gY2hhbmdlcyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKICAqIC0gY2hhbmdlIGZvciB0aGUgc3VwZXIgY2xhc3Mgb3IgYW55IHN1cGVyIGludGVyZmFjZXMuCiAgKiAtIGNoYW5nZXMgZm9yIG1lbWJlciB0eXBlcyBuYW1lIG9yIG1vZGlmaWVycwotICogSWYgYW55IG9mIHRoZXNlIGNoYW5nZXMgb2NjdXJzLCB0aGUgbWV0aG9kIHJldHVybnMgdHJ1ZS4gZmFsc2Ugb3RoZXJ3aXNlLiAKKyAqIElmIGFueSBvZiB0aGVzZSBjaGFuZ2VzIG9jY3VycywgdGhlIG1ldGhvZCByZXR1cm5zIHRydWUuIGZhbHNlIG90aGVyd2lzZS4KICAqIFRoZSBzeW50aGV0aWMgZmllbGRzIGFyZSBpbmNsdWRlZCBhbmQgdGhlIG1lbWJlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzb3J0ZWQuCiAgKiBAcGFyYW0gbmV3Qnl0ZXMgdGhlIGJ5dGVzIG9mIHRoZSAuY2xhc3MgZmlsZSB3ZSB3YW50IHRvIGNvbXBhcmUgdGhlIHJlY2VpdmVyIHRvCiAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlzIHRoZXJlIGlzIGEgc3RydWN0dXJhbCBjaGFuZ2UgYmV0d2VlbiB0aGUgdHdvIC5jbGFzcyBmaWxlcywgZmFsc2Ugb3RoZXJ3aXNlCkBAIC02NzIsNiArNzk4LDcgQEAKIHB1YmxpYyBib29sZWFuIGhhc1N0cnVjdHVyYWxDaGFuZ2VzKGJ5dGVbXSBuZXdCeXRlcykgewogCXJldHVybiBoYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhuZXdCeXRlcywgdHJ1ZSwgdHJ1ZSk7CiB9CisKIC8qKgogICogQ2hlY2sgaWYgdGhlIHJlY2VpdmVyIGhhcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgY29tcGFyZSB0byB0aGUgYnl0ZSBhcnJheSBpbiBhcmd1bWVudC4KICAqIFN0cnVjdHVyYWwgY2hhbmdlcyBhcmU6CkBAIC02OTQsNyArODIxLDcgQEAKIAkJCW5ldyBDbGFzc0ZpbGVSZWFkZXIobmV3Qnl0ZXMsIHRoaXMuY2xhc3NGaWxlTmFtZSk7CiAJCS8vIHR5cGUgbGV2ZWwgY29tcGFyaXNvbgogCQkvLyBtb2RpZmllcnMKLQkJaWYgKHRoaXMuZ2V0TW9kaWZpZXJzKCkgIT0gbmV3Q2xhc3NGaWxlLmdldE1vZGlmaWVycygpKQorCQlpZiAoZ2V0TW9kaWZpZXJzKCkgIT0gbmV3Q2xhc3NGaWxlLmdldE1vZGlmaWVycygpKQogCQkJcmV0dXJuIHRydWU7CiAKIAkJLy8gb25seSBjb25zaWRlciBhIHBvcnRpb24gb2YgdGhlIHRhZ2JpdHMgd2hpY2ggaW5kaWNhdGUgYSBzdHJ1Y3R1cmFsIGNoYW5nZSBmb3IgZGVwZW5kZW50cwpAQCAtNzAyLDE3ICs4MjksMjAgQEAKIAkJbG9uZyBPbmx5U3RydWN0dXJhbFRhZ0JpdHMgPSBUYWdCaXRzLkFubm90YXRpb25UYXJnZXRNQVNLIC8vIGRpZmZlcmVudCBAVGFyZ2V0IHN0YXR1cyA/CiAJCQl8IFRhZ0JpdHMuQW5ub3RhdGlvbkRlcHJlY2F0ZWQgLy8gZGlmZmVyZW50IEBEZXByZWNhdGVkIHN0YXR1cyA/CiAJCQl8IFRhZ0JpdHMuQW5ub3RhdGlvblJldGVudGlvbk1BU0sgLy8gZGlmZmVyZW50IEBSZXRlbnRpb24gc3RhdHVzID8KLQkJCXwgVGFnQml0cy5IYXNJbmNvbnNpc3RlbnRIaWVyYXJjaHk7IC8vIGRpZmZlcmVudCBoaWVyYXJjaHkgc3RhdHVzID8KLQkJCisJCQl8IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7IC8vIGRpZmZlcmVudCBoaWVyYXJjaHkgc3RhdHVzID8KKwogCQkvLyBtZXRhLWFubm90YXRpb25zCi0JCWlmICgodGhpcy5nZXRUYWdCaXRzKCkgJiBPbmx5U3RydWN0dXJhbFRhZ0JpdHMpICE9IChuZXdDbGFzc0ZpbGUuZ2V0VGFnQml0cygpICYgT25seVN0cnVjdHVyYWxUYWdCaXRzKSkKKwkJaWYgKChnZXRUYWdCaXRzKCkgJiBPbmx5U3RydWN0dXJhbFRhZ0JpdHMpICE9IChuZXdDbGFzc0ZpbGUuZ2V0VGFnQml0cygpICYgT25seVN0cnVjdHVyYWxUYWdCaXRzKSkKIAkJCXJldHVybiB0cnVlOwotCQkKKwkJLy8gYW5ub3RhdGlvbnMKKwkJaWYgKGhhc1N0cnVjdHVyYWxBbm5vdGF0aW9uQ2hhbmdlcyhnZXRBbm5vdGF0aW9ucygpLCBuZXdDbGFzc0ZpbGUuZ2V0QW5ub3RhdGlvbnMoKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwogCQkvLyBnZW5lcmljIHNpZ25hdHVyZQotCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpLCBuZXdDbGFzc0ZpbGUuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSkKKwkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhnZXRHZW5lcmljU2lnbmF0dXJlKCksIG5ld0NsYXNzRmlsZS5nZXRHZW5lcmljU2lnbmF0dXJlKCkpKQogCQkJcmV0dXJuIHRydWU7CiAJCS8vIHN1cGVyY2xhc3MKLQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmdldFN1cGVyY2xhc3NOYW1lKCksIG5ld0NsYXNzRmlsZS5nZXRTdXBlcmNsYXNzTmFtZSgpKSkKKwkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhnZXRTdXBlcmNsYXNzTmFtZSgpLCBuZXdDbGFzc0ZpbGUuZ2V0U3VwZXJjbGFzc05hbWUoKSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJLy8gaW50ZXJmYWNlcwogCQljaGFyW11bXSBuZXdJbnRlcmZhY2VzTmFtZXMgPSBuZXdDbGFzc0ZpbGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKQEAgLTcyNiw3ICs4NTYsNyBAQAogCQl9CiAKIAkJLy8gbWVtYmVyIHR5cGVzCi0JCUlCaW5hcnlOZXN0ZWRUeXBlW10gY3VycmVudE1lbWJlclR5cGVzID0gdGhpcy5nZXRNZW1iZXJUeXBlcygpOworCQlJQmluYXJ5TmVzdGVkVHlwZVtdIGN1cnJlbnRNZW1iZXJUeXBlcyA9IGdldE1lbWJlclR5cGVzKCk7CiAJCUlCaW5hcnlOZXN0ZWRUeXBlW10gb3RoZXJNZW1iZXJUeXBlcyA9IG5ld0NsYXNzRmlsZS5nZXRNZW1iZXJUeXBlcygpOwogCQlpZiAoY3VycmVudE1lbWJlclR5cGVzICE9IG90aGVyTWVtYmVyVHlwZXMpIHsgLy8gVHlwZUNvbnN0YW50cy5Ob01lbWJlclR5cGVzCiAJCQlpbnQgY3VycmVudE1lbWJlclR5cGVMZW5ndGggPSBjdXJyZW50TWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBjdXJyZW50TWVtYmVyVHlwZXMubGVuZ3RoOwpAQCAtNzY4LDcgKzg5OCw3IEBACiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyBtZXRob2RzCiAJCU1ldGhvZEluZm9bXSBvdGhlck1ldGhvZEluZm9zID0gKE1ldGhvZEluZm9bXSkgbmV3Q2xhc3NGaWxlLmdldE1ldGhvZHMoKTsKIAkJaW50IG90aGVyTWV0aG9kSW5mb3NMZW5ndGggPSBvdGhlck1ldGhvZEluZm9zID09IG51bGwgPyAwIDogb3RoZXJNZXRob2RJbmZvcy5sZW5ndGg7CkBAIC03ODcsNyArOTE3LDcgQEAKIAkJCQlpZiAodGhpcy5tZXRob2RzQ291bnQgIT0gMCkKIAkJCQkJQXJyYXlzLnNvcnQodGhpcy5tZXRob2RzKTsKIAkJCQlpZiAob3RoZXJNZXRob2RJbmZvc0xlbmd0aCAhPSAwKQotCQkJCQlBcnJheXMuc29ydChvdGhlck1ldGhvZEluZm9zKTsJCisJCQkJCUFycmF5cy5zb3J0KG90aGVyTWV0aG9kSW5mb3MpOwogCQkJfQogCQkJaWYgKGV4Y2x1ZGVzU3ludGhldGljKSB7CiAJCQkJaWYgKGhhc05vblN5bnRoZXRpY01ldGhvZENoYW5nZXModGhpcy5tZXRob2RzLCBvdGhlck1ldGhvZEluZm9zKSkKQEAgLTc5OSwxMSArOTI5LDc3IEBACiAJCQl9CiAJCX0KIAorCQkvLyBtaXNzaW5nIHR5cGVzCisJCWNoYXJbXVtdW10gbWlzc2luZ1R5cGVzID0gZ2V0TWlzc2luZ1R5cGVOYW1lcygpOworCQljaGFyW11bXVtdIG5ld01pc3NpbmdUeXBlcyA9IG5ld0NsYXNzRmlsZS5nZXRNaXNzaW5nVHlwZU5hbWVzKCk7CisJCWlmIChtaXNzaW5nVHlwZXMgIT0gbnVsbCkgeworCQkJaWYgKG5ld01pc3NpbmdUeXBlcyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlpbnQgbGVuZ3RoID0gbWlzc2luZ1R5cGVzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggIT0gbmV3TWlzc2luZ1R5cGVzLmxlbmd0aCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobWlzc2luZ1R5cGVzW2ldLCBuZXdNaXNzaW5nVHlwZXNbaV0pKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChuZXdNaXNzaW5nVHlwZXMgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogfQorCitwcml2YXRlIGJvb2xlYW4gaGFzU3RydWN0dXJhbEFubm90YXRpb25DaGFuZ2VzKElCaW5hcnlBbm5vdGF0aW9uW10gY3VycmVudEFubm90YXRpb25zLCBJQmluYXJ5QW5ub3RhdGlvbltdIG90aGVyQW5ub3RhdGlvbnMpIHsKKwlpZiAoY3VycmVudEFubm90YXRpb25zID09IG90aGVyQW5ub3RhdGlvbnMpCisJCXJldHVybiBmYWxzZTsKKworCWludCBjdXJyZW50QW5ub3RhdGlvbnNMZW5ndGggPSBjdXJyZW50QW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiBjdXJyZW50QW5ub3RhdGlvbnMubGVuZ3RoOworCWludCBvdGhlckFubm90YXRpb25zTGVuZ3RoID0gb3RoZXJBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IG90aGVyQW5ub3RhdGlvbnMubGVuZ3RoOworCWlmIChjdXJyZW50QW5ub3RhdGlvbnNMZW5ndGggIT0gb3RoZXJBbm5vdGF0aW9uc0xlbmd0aCkKKwkJcmV0dXJuIHRydWU7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50QW5ub3RhdGlvbnNMZW5ndGg7IGkrKykgeworCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRBbm5vdGF0aW9uc1tpXS5nZXRUeXBlTmFtZSgpLCBvdGhlckFubm90YXRpb25zW2ldLmdldFR5cGVOYW1lKCkpKQorCQkJcmV0dXJuIHRydWU7CisJCUlCaW5hcnlFbGVtZW50VmFsdWVQYWlyW10gY3VycmVudFBhaXJzID0gY3VycmVudEFubm90YXRpb25zW2ldLmdldEVsZW1lbnRWYWx1ZVBhaXJzKCk7CisJCUlCaW5hcnlFbGVtZW50VmFsdWVQYWlyW10gb3RoZXJQYWlycyA9IG90aGVyQW5ub3RhdGlvbnNbaV0uZ2V0RWxlbWVudFZhbHVlUGFpcnMoKTsKKwkJaW50IGN1cnJlbnRQYWlyc0xlbmd0aCA9IGN1cnJlbnRQYWlycyA9PSBudWxsID8gMCA6IGN1cnJlbnRQYWlycy5sZW5ndGg7CisJCWludCBvdGhlclBhaXJzTGVuZ3RoID0gb3RoZXJQYWlycyA9PSBudWxsID8gMCA6IG90aGVyUGFpcnMubGVuZ3RoOworCQlpZiAoY3VycmVudFBhaXJzTGVuZ3RoICE9IG90aGVyUGFpcnNMZW5ndGgpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50UGFpcnNMZW5ndGg7IGorKykgeworCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50UGFpcnNbal0uZ2V0TmFtZSgpLCBvdGhlclBhaXJzW2pdLmdldE5hbWUoKSkpCisJCQkJcmV0dXJuIHRydWU7CisJCQlmaW5hbCBPYmplY3QgdmFsdWUgPSBjdXJyZW50UGFpcnNbal0uZ2V0VmFsdWUoKTsKKwkJCWZpbmFsIE9iamVjdCB2YWx1ZTIgPSBvdGhlclBhaXJzW2pdLmdldFZhbHVlKCk7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworCQkJCU9iamVjdFtdIGN1cnJlbnRWYWx1ZXMgPSAoT2JqZWN0W10pIHZhbHVlOworCQkJCWlmICh2YWx1ZTIgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworCQkJCQlPYmplY3RbXSBjdXJyZW50VmFsdWVzMiA9IChPYmplY3RbXSkgdmFsdWUyOworCQkJCQlmaW5hbCBpbnQgbGVuZ3RoID0gY3VycmVudFZhbHVlcy5sZW5ndGg7CisJCQkJCWlmIChsZW5ndGggIT0gY3VycmVudFZhbHVlczIubGVuZ3RoKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQlmb3IgKGludCBuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CisJCQkJCQlpZiAoIWN1cnJlbnRWYWx1ZXNbbl0uZXF1YWxzKGN1cnJlbnRWYWx1ZXMyW25dKSkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgaWYgKCF2YWx1ZS5lcXVhbHModmFsdWUyKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogcHJpdmF0ZSBib29sZWFuIGhhc1N0cnVjdHVyYWxGaWVsZENoYW5nZXMoRmllbGRJbmZvIGN1cnJlbnRGaWVsZEluZm8sIEZpZWxkSW5mbyBvdGhlckZpZWxkSW5mbykgewogCS8vIGdlbmVyaWMgc2lnbmF0dXJlCiAJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50RmllbGRJbmZvLmdldEdlbmVyaWNTaWduYXR1cmUoKSwgb3RoZXJGaWVsZEluZm8uZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSkKQEAgLTgxMiw2ICsxMDA4LDggQEAKIAkJcmV0dXJuIHRydWU7CiAJaWYgKChjdXJyZW50RmllbGRJbmZvLmdldFRhZ0JpdHMoKSAmIFRhZ0JpdHMuQW5ub3RhdGlvbkRlcHJlY2F0ZWQpICE9IChvdGhlckZpZWxkSW5mby5nZXRUYWdCaXRzKCkgJiBUYWdCaXRzLkFubm90YXRpb25EZXByZWNhdGVkKSkKIAkJcmV0dXJuIHRydWU7CisJaWYgKGhhc1N0cnVjdHVyYWxBbm5vdGF0aW9uQ2hhbmdlcyhjdXJyZW50RmllbGRJbmZvLmdldEFubm90YXRpb25zKCksIG90aGVyRmllbGRJbmZvLmdldEFubm90YXRpb25zKCkpKQorCQlyZXR1cm4gdHJ1ZTsKIAlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRGaWVsZEluZm8uZ2V0TmFtZSgpLCBvdGhlckZpZWxkSW5mby5nZXROYW1lKCkpKQogCQlyZXR1cm4gdHJ1ZTsKIAlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRGaWVsZEluZm8uZ2V0VHlwZU5hbWUoKSwgb3RoZXJGaWVsZEluZm8uZ2V0VHlwZU5hbWUoKSkpCkBAIC04NDgsNiArMTA0Niw3IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KKwogcHJpdmF0ZSBib29sZWFuIGhhc1N0cnVjdHVyYWxNZXRob2RDaGFuZ2VzKE1ldGhvZEluZm8gY3VycmVudE1ldGhvZEluZm8sIE1ldGhvZEluZm8gb3RoZXJNZXRob2RJbmZvKSB7CiAJLy8gZ2VuZXJpYyBzaWduYXR1cmUKIAlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRNZXRob2RJbmZvLmdldEdlbmVyaWNTaWduYXR1cmUoKSwgb3RoZXJNZXRob2RJbmZvLmdldEdlbmVyaWNTaWduYXR1cmUoKSkpCkBAIC04NTYsNiArMTA1NSw4IEBACiAJCXJldHVybiB0cnVlOwogCWlmICgoY3VycmVudE1ldGhvZEluZm8uZ2V0VGFnQml0cygpICYgVGFnQml0cy5Bbm5vdGF0aW9uRGVwcmVjYXRlZCkgIT0gKG90aGVyTWV0aG9kSW5mby5nZXRUYWdCaXRzKCkgJiBUYWdCaXRzLkFubm90YXRpb25EZXByZWNhdGVkKSkKIAkJcmV0dXJuIHRydWU7CisJaWYgKGhhc1N0cnVjdHVyYWxBbm5vdGF0aW9uQ2hhbmdlcyhjdXJyZW50TWV0aG9kSW5mby5nZXRBbm5vdGF0aW9ucygpLCBvdGhlck1ldGhvZEluZm8uZ2V0QW5ub3RhdGlvbnMoKSkpCisJCXJldHVybiB0cnVlOwogCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudE1ldGhvZEluZm8uZ2V0U2VsZWN0b3IoKSwgb3RoZXJNZXRob2RJbmZvLmdldFNlbGVjdG9yKCkpKQogCQlyZXR1cm4gdHJ1ZTsKIAlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRNZXRob2RJbmZvLmdldE1ldGhvZERlc2NyaXB0b3IoKSwgb3RoZXJNZXRob2RJbmZvLmdldE1ldGhvZERlc2NyaXB0b3IoKSkpCkBAIC04NzYsMzQgKzEwNzcsMzcgQEAKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorCiAvKioKICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZnVsbHkgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVyLiBBbGwgbWV0aG9kaW5mb3MsIGZpZWxkcyBpbmZvcwogICogd2lsbCBiZSB0aGVyZWZvcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBieXRlcy4KICAqLwogcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewogCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZHNDb3VudDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlmaWVsZHNbaV0uaW5pdGlhbGl6ZSgpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5maWVsZHNDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCQl0aGlzLmZpZWxkc1tpXS5pbml0aWFsaXplKCk7CiAJCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHNDb3VudDsgaSA8IG1heDsgaSsrKSB7Ci0JCQltZXRob2RzW2ldLmluaXRpYWxpemUoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubWV0aG9kc0NvdW50OyBpIDwgbWF4OyBpKyspIHsKKwkJCXRoaXMubWV0aG9kc1tpXS5pbml0aWFsaXplKCk7CiAJCX0KLQkJaWYgKGlubmVySW5mb3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGlubmVySW5mb3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpbm5lckluZm9zW2ldLmluaXRpYWxpemUoKTsKKwkJaWYgKHRoaXMuaW5uZXJJbmZvcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5pbm5lckluZm9zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJdGhpcy5pbm5lckluZm9zW2ldLmluaXRpYWxpemUoKTsKIAkJCX0KIAkJfQotCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJYW5ub3RhdGlvbnNbaV0uaW5pdGlhbGl6ZSgpOworCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCXRoaXMuYW5ub3RhdGlvbnNbaV0uaW5pdGlhbGl6ZSgpOwogCQkJfQogCQl9Ci0JCXRoaXMucmVzZXQoKTsKKwkJdGhpcy5nZXRFbmNsb3NpbmdNZXRob2QoKTsKKwkJcmVzZXQoKTsKIAl9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogCQlDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oZSwgdGhpcy5jbGFzc0ZpbGVOYW1lKTsKIAkJdGhyb3cgZXhjZXB0aW9uOwogCX0KIH0KKwogLyoqCiAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYW4gYW5vbnltb3VzIHR5cGUsIGZhbHNlIG90aGVyd2lzZQogICoKQEAgLTkxNCw2ICsxMTE4LDcgQEAKIAljaGFyW10gaW5uZXJTb3VyY2VOYW1lID0gdGhpcy5pbm5lckluZm8uZ2V0U291cmNlTmFtZSgpOwogCXJldHVybiAoaW5uZXJTb3VyY2VOYW1lID09IG51bGwgfHwgaW5uZXJTb3VyY2VOYW1lLmxlbmd0aCA9PSAwKTsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgY29udGFpbnMgdGhlIHJlc29sdmVkIGJpbmFyeSBmb3JtCiAgKiBvciB0aGUgdW5yZXNvbHZlZCBzb3VyY2UgZm9ybSBvZiB0aGUgdHlwZS4KQEAgLTkzMiw4ICsxMTM3LDkgQEAKIAlpZiAodGhpcy5pbm5lckluZm8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCWlmICh0aGlzLmlubmVySW5mby5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpICE9IG51bGwpIHJldHVybiBmYWxzZTsKIAljaGFyW10gaW5uZXJTb3VyY2VOYW1lID0gdGhpcy5pbm5lckluZm8uZ2V0U291cmNlTmFtZSgpOwotCXJldHVybiAoaW5uZXJTb3VyY2VOYW1lICE9IG51bGwgJiYgaW5uZXJTb3VyY2VOYW1lLmxlbmd0aCA+IDApOwkKKwlyZXR1cm4gKGlubmVyU291cmNlTmFtZSAhPSBudWxsICYmIGlubmVyU291cmNlTmFtZS5sZW5ndGggPiAwKTsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBtZW1iZXIgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCiAgKgpAQCAtOTQ1LDYgKzExNTEsNyBAQAogCWNoYXJbXSBpbm5lclNvdXJjZU5hbWUgPSB0aGlzLmlubmVySW5mby5nZXRTb3VyY2VOYW1lKCk7CiAJcmV0dXJuIChpbm5lclNvdXJjZU5hbWUgIT0gbnVsbCAmJiBpbm5lclNvdXJjZU5hbWUubGVuZ3RoID4gMCk7CSAvLyBwcm90ZWN0aW9uIGFnYWluc3QgaWxsLWZvcm1lZCBhdHRyaWJ1dGVzICg2NzYwMCkKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBuZXN0ZWQgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCiAgKgpAQCAtOTUzLDcwICsxMTYwLDI0IEBACiBwdWJsaWMgYm9vbGVhbiBpc05lc3RlZFR5cGUoKSB7CiAJcmV0dXJuIHRoaXMuaW5uZXJJbmZvICE9IG51bGw7CiB9CisKIC8qKgogICogQW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGF0dHJpYnV0ZS4gUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gc291cmNlIGZpbGUgYXR0cmlidXRlIGZvciB0aGUgcmVjZWl2ZXIuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIGNoYXJbXQogICovCiBwdWJsaWMgY2hhcltdIHNvdXJjZUZpbGVOYW1lKCkgewogCXJldHVybiB0aGlzLnNvdXJjZUZpbGVOYW1lOwogfQorCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCWphdmEuaW8uUHJpbnRXcml0ZXIgcHJpbnQgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihvdXQpOwotCXByaW50LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJ7Iik7IC8vJE5PTi1OTFMtMSQKKwlwcmludC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgInsiKTsgLy8kTk9OLU5MUy0xJAogCXByaW50LnByaW50bG4oIiB0aGlzLmNsYXNzTmFtZTogIiArIG5ldyBTdHJpbmcoZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKIAlwcmludC5wcmludGxuKCIgdGhpcy5zdXBlcmNsYXNzTmFtZTogIiArIChnZXRTdXBlcmNsYXNzTmFtZSgpID09IG51bGwgPyAibnVsbCIgOiBuZXcgU3RyaW5nKGdldFN1cGVyY2xhc3NOYW1lKCkpKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCXByaW50LnByaW50bG4oIiBhY2Nlc3NfZmxhZ3M6ICIgKyBwcmludFR5cGVNb2RpZmllcnModGhpcy5hY2Nlc3NGbGFncygpKSArICIoIiArIHRoaXMuYWNjZXNzRmxhZ3MoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCisJcHJpbnQucHJpbnRsbigiIGFjY2Vzc19mbGFnczogIiArIHByaW50VHlwZU1vZGlmaWVycyhhY2Nlc3NGbGFncygpKSArICIoIiArIGFjY2Vzc0ZsYWdzKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJAogCXByaW50LmZsdXNoKCk7CiAJcmV0dXJuIG91dC50b1N0cmluZygpOwogfQotCi0vKgotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCAhPSAxKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiQ2xhc3NGaWxlUmVhZGVyIDxmaWxlbmFtZT4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci0JRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IHJlYWQoZmlsZSwgdHJ1ZSk7Ci0JaWYgKHJlYWRlci5hbm5vdGF0aW9ucyAhPSBudWxsKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRlci5hbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihyZWFkZXIuYW5ub3RhdGlvbnNbaV0pOwotCX0KLQlTeXN0ZW0uZXJyLnByaW50KCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJAotCVN5c3RlbS5lcnIucHJpbnQocmVhZGVyLmdldE5hbWUoKSk7Ci0JY2hhcltdIHN1cGVyY2xhc3MgPSByZWFkZXIuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnQoc3VwZXJjbGFzcyk7Ci0JfQotCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCWNoYXJbXVtdIGludGVyZmFjZXMgPSByZWFkZXIuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKLQlpZiAoaW50ZXJmYWNlcyAhPSBudWxsICYmIGludGVyZmFjZXMubGVuZ3RoID4gMCkgewotCQlTeXN0ZW0uZXJyLnByaW50KCIgaW1wbGVtZW50cyAiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDApIFN5c3RlbS5lcnIucHJpbnQoIiwgIik7IC8vJE5PTi1OTFMtMSQJCQotCQkJU3lzdGVtLmVyci5wcmludGxuKGludGVyZmFjZXNbaV0pOwotCQl9Ci0JfQotCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCVN5c3RlbS5lcnIucHJpbnRsbigneycpOwotCWlmIChyZWFkZXIuZmllbGRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXIuZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVhZGVyLmZpZWxkc1tpXSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKLQkJfQotCX0KLQlpZiAocmVhZGVyLm1ldGhvZHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRlci5tZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVhZGVyLm1ldGhvZHNbaV0pOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JCX0KLQl9Ci0JU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JU3lzdGVtLmVyci5wcmludGxuKCd9Jyk7Ci19Ci0qLwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhCmluZGV4IGRhZTlkNmMuLjk4MmQzZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlU3RydWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNTIgKzE1LDUyIEBACiAJaW50W10gY29uc3RhbnRQb29sT2Zmc2V0czsKIAlpbnQgc3RydWN0T2Zmc2V0OwogcHVibGljIENsYXNzRmlsZVN0cnVjdChieXRlW10gY2xhc3NGaWxlQnl0ZXMsIGludFtdIG9mZnNldHMsIGludCBvZmZzZXQpIHsKLQlyZWZlcmVuY2UgPSBjbGFzc0ZpbGVCeXRlczsKLQljb25zdGFudFBvb2xPZmZzZXRzID0gb2Zmc2V0czsKLQlzdHJ1Y3RPZmZzZXQgPSBvZmZzZXQ7CisJdGhpcy5yZWZlcmVuY2UgPSBjbGFzc0ZpbGVCeXRlczsKKwl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBvZmZzZXRzOworCXRoaXMuc3RydWN0T2Zmc2V0ID0gb2Zmc2V0OwogfQogcHVibGljIGRvdWJsZSBkb3VibGVBdChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQlyZXR1cm4gKERvdWJsZS5sb25nQml0c1RvRG91YmxlKHRoaXMuaThBdChyZWxhdGl2ZU9mZnNldCkpKTsKKwlyZXR1cm4gKERvdWJsZS5sb25nQml0c1RvRG91YmxlKGk4QXQocmVsYXRpdmVPZmZzZXQpKSk7CiB9CiBwdWJsaWMgZmxvYXQgZmxvYXRBdChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQlyZXR1cm4gKEZsb2F0LmludEJpdHNUb0Zsb2F0KHRoaXMuaTRBdChyZWxhdGl2ZU9mZnNldCkpKTsKKwlyZXR1cm4gKEZsb2F0LmludEJpdHNUb0Zsb2F0KGk0QXQocmVsYXRpdmVPZmZzZXQpKSk7CiB9CiBwdWJsaWMgaW50IGk0QXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7Ci0JaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7Ci0JcmV0dXJuICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgMjQpIHwgKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAxNikgfCAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpICsgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKKwlpbnQgcG9zaXRpb24gPSByZWxhdGl2ZU9mZnNldCArIHRoaXMuc3RydWN0T2Zmc2V0OworCXJldHVybiAoKHRoaXMucmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgMjQpIHwgKCh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDE2KSB8ICgodGhpcy5yZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCA4KSArICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKIH0KIHB1YmxpYyBsb25nIGk4QXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7Ci0JaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7Ci0JcmV0dXJuICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgNTYpIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgNDgpIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgNDApIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgMzIpIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgMjQpIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgMTYpIAotCQkJCQl8ICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgOCkgCi0JCQkJCXwgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpOworCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgdGhpcy5zdHJ1Y3RPZmZzZXQ7CisJcmV0dXJuICgoKGxvbmcpICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA1NikKKwkJCQkJfCAoKChsb25nKSAodGhpcy5yZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgNDgpCisJCQkJCXwgKCgobG9uZykgKHRoaXMucmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikpIDw8IDQwKQorCQkJCQl8ICgoKGxvbmcpICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCAzMikKKwkJCQkJfCAoKChsb25nKSAodGhpcy5yZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgMjQpCisJCQkJCXwgKCgobG9uZykgKHRoaXMucmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikpIDw8IDE2KQorCQkJCQl8ICgoKGxvbmcpICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA4KQorCQkJCQl8ICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpOwogfQogcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CiAJdGhpcy5yZWZlcmVuY2UgPSBudWxsOwogCXRoaXMuY29uc3RhbnRQb29sT2Zmc2V0cyA9IG51bGw7CiB9CiBwdWJsaWMgaW50IHUxQXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7Ci0JcmV0dXJuIChyZWZlcmVuY2VbcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXRdICYgMHhGRik7CisJcmV0dXJuICh0aGlzLnJlZmVyZW5jZVtyZWxhdGl2ZU9mZnNldCArIHRoaXMuc3RydWN0T2Zmc2V0XSAmIDB4RkYpOwogfQogcHVibGljIGludCB1MkF0KGludCByZWxhdGl2ZU9mZnNldCkgewotCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OwotCXJldHVybiAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpIHwgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKKwlpbnQgcG9zaXRpb24gPSByZWxhdGl2ZU9mZnNldCArIHRoaXMuc3RydWN0T2Zmc2V0OworCXJldHVybiAoKHRoaXMucmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkgfCAodGhpcy5yZWZlcmVuY2VbcG9zaXRpb25dICYgMHhGRik7CiB9CiBwdWJsaWMgbG9uZyB1NEF0KGludCByZWxhdGl2ZU9mZnNldCkgewotCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OwotCXJldHVybiAoKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGTCkgPDwgMjQpIHwgKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAxNikgfCAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpIHwgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKSk7CisJaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyB0aGlzLnN0cnVjdE9mZnNldDsKKwlyZXR1cm4gKCgodGhpcy5yZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGTCkgPDwgMjQpIHwgKCh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDE2KSB8ICgodGhpcy5yZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCA4KSB8ICh0aGlzLnJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKSk7CiB9CiBwdWJsaWMgY2hhcltdIHV0ZjhBdChpbnQgcmVsYXRpdmVPZmZzZXQsIGludCBieXRlc0F2YWlsYWJsZSkgewogCWludCBsZW5ndGggPSBieXRlc0F2YWlsYWJsZTsKIAljaGFyIG91dHB1dEJ1ZltdID0gbmV3IGNoYXJbYnl0ZXNBdmFpbGFibGVdOwogCWludCBvdXRwdXRQb3MgPSAwOwogCWludCByZWFkT2Zmc2V0ID0gdGhpcy5zdHJ1Y3RPZmZzZXQgKyByZWxhdGl2ZU9mZnNldDsKLQkKKwogCXdoaWxlIChsZW5ndGggIT0gMCkgewogCQlpbnQgeCA9IHRoaXMucmVmZXJlbmNlW3JlYWRPZmZzZXQrK10gJiAweEZGOwogCQlsZW5ndGgtLTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKaW5kZXggN2RjNzFiNS4uZDQ2NWQ5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNyArMTIsNyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIHB1YmxpYyBjbGFzcyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRNYWdpYyA9IDE7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkTWlub3JWZXJzaW9uID0gMjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRNYWpvclZlcnNpb24gPSAzOwpAQCAtNTUsMjcgKzU1LDI3IEBACiAJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKIAl9CiAJcHVibGljIENsYXNzRm9ybWF0RXhjZXB0aW9uKGludCBjb2RlKSB7Ci0JCWVycm9yQ29kZSA9IGNvZGU7CisJCXRoaXMuZXJyb3JDb2RlID0gY29kZTsKIAl9CiAJcHVibGljIENsYXNzRm9ybWF0RXhjZXB0aW9uKGludCBjb2RlLCBpbnQgYnVmUG9zKSB7Ci0JCWVycm9yQ29kZSA9IGNvZGU7Ci0JCWJ1ZmZlclBvc2l0aW9uID0gYnVmUG9zOworCQl0aGlzLmVycm9yQ29kZSA9IGNvZGU7CisJCXRoaXMuYnVmZmVyUG9zaXRpb24gPSBidWZQb3M7CiAJfQogCS8qKgogCSAqIEByZXR1cm4gaW50CiAJICovCiAJcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7Ci0JCXJldHVybiBlcnJvckNvZGU7CisJCXJldHVybiB0aGlzLmVycm9yQ29kZTsKIAl9CiAJLyoqCiAJICogQHJldHVybiBpbnQKIAkgKi8KIAlwdWJsaWMgaW50IGdldEJ1ZmZlclBvc2l0aW9uKCkgewotCQlyZXR1cm4gYnVmZmVyUG9zaXRpb247CisJCXJldHVybiB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIDxjb2RlPlRocm93YWJsZTwvY29kZT4gdGhhdCBjYXVzZWQgdGhlIGZhaWx1cmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB3cmFwcGVyZWQgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgICAgICAgIGlmIHRoZSBkaXJlY3QgY2FzZSBvZiB0aGUgZmFpbHVyZSB3YXMgYXQgdGhlIEphdmEgbW9kZWwgbGF5ZXIKIAkgKi8KQEAgLTg3LDcgKzg3LDcgQEAKIAl9CiAJLyoqCiAJICogUHJpbnRzIHRoaXMgZXhjZXB0aW9uJ3Mgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIHByaW50IHN0cmVhbS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvdXRwdXQKIAkgKiAgICAgICAgICAgIHRoZSBwcmludCBzdHJlYW0KIAkgKiBAc2luY2UgMy4wCkBAIC0xMTAsNyArMTEwLDcgQEAKIAl9CiAJLyoqCiAJICogUHJpbnRzIHRoaXMgZXhjZXB0aW9uJ3Mgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIHByaW50IHdyaXRlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvdXRwdXQKIAkgKiAgICAgICAgICAgIHRoZSBwcmludCB3cml0ZXIKIAkgKiBAc2luY2UgMy4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRWxlbWVudFZhbHVlUGFpckluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9FbGVtZW50VmFsdWVQYWlySW5mby5qYXZhCmluZGV4IDE4ODA1MWIuLjVhNDBjMGQgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9FbGVtZW50VmFsdWVQYWlySW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9FbGVtZW50VmFsdWVQYWlySW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIEJFQSBTeXN0ZW1zLCBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDkgKzcsMTQgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICB0eWV1bmdAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgb2xpdmllcl90aG9tYW5uQGNhLmlibS5jb20gLSBhZGQgaGFzaENvZGUoKSBhbmQgZXF1YWxzKC4uKSBtZXRob2RzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CisKIHB1YmxpYyBjbGFzcyBFbGVtZW50VmFsdWVQYWlySW5mbyBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUVsZW1lbnRWYWx1ZVBhaXIgewogCiAJc3RhdGljIGZpbmFsIEVsZW1lbnRWYWx1ZVBhaXJJbmZvW10gTm9NZW1iZXJzID0gbmV3IEVsZW1lbnRWYWx1ZVBhaXJJbmZvWzBdOwpAQCAtNDUsNCArNTAsMzQgQEAKIAl9CiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwlpbnQgcmVzdWx0ID0gMTsKKwlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIENoYXJPcGVyYXRpb24uaGFzaENvZGUodGhpcy5uYW1lKTsKKwlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGhpcy52YWx1ZSA9PSBudWxsKSA/IDAgOiB0aGlzLnZhbHVlLmhhc2hDb2RlKCkpOworCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCWlmICh0aGlzID09IG9iaikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKG9iaiA9PSBudWxsKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlFbGVtZW50VmFsdWVQYWlySW5mbyBvdGhlciA9IChFbGVtZW50VmFsdWVQYWlySW5mbykgb2JqOworCWlmICghQXJyYXlzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgeworCQlpZiAob3RoZXIudmFsdWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlIGlmICghdGhpcy52YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEKaW5kZXggNzdjMmQyMi4uOGVhZWEwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9GaWVsZEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw4ICsyNiw4IEBACiAJcHJvdGVjdGVkIGNoYXJbXSBuYW1lOwogCXByb3RlY3RlZCBjaGFyW10gc2lnbmF0dXJlOwogCXByb3RlY3RlZCBpbnQgc2lnbmF0dXJlVXRmOE9mZnNldDsKLQlwcm90ZWN0ZWQgbG9uZyB0YWdCaXRzOwkKLQlwcm90ZWN0ZWQgT2JqZWN0IHdyYXBwZWRDb25zdGFudFZhbHVlOwkKKwlwcm90ZWN0ZWQgbG9uZyB0YWdCaXRzOworCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlZENvbnN0YW50VmFsdWU7CiAKIHB1YmxpYyBzdGF0aWMgRmllbGRJbmZvIGNyZWF0ZUZpZWxkKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgaW50IG9mZnNldHNbXSwgaW50IG9mZnNldCkgewogCUZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgRmllbGRJbmZvKGNsYXNzRmlsZUJ5dGVzLCBvZmZzZXRzLCBvZmZzZXQpOwpAQCAtNDQsNyArNDQsNyBAQAogICovCiBwcm90ZWN0ZWQgRmllbGRJbmZvIChieXRlIGNsYXNzRmlsZUJ5dGVzW10sIGludCBvZmZzZXRzW10sIGludCBvZmZzZXQpIHsKIAlzdXBlcihjbGFzc0ZpbGVCeXRlcywgb2Zmc2V0cywgb2Zmc2V0KTsKLQl0aGlzLmFjY2Vzc0ZsYWdzID0gLTE7CQorCXRoaXMuYWNjZXNzRmxhZ3MgPSAtMTsKIAl0aGlzLnNpZ25hdHVyZVV0ZjhPZmZzZXQgPSAtMTsKIH0KIHByaXZhdGUgQW5ub3RhdGlvbkluZm9bXSBkZWNvZGVBbm5vdGF0aW9ucyhpbnQgb2Zmc2V0LCBib29sZWFuIHJ1bnRpbWVWaXNpYmxlKSB7CkBAIC03NiwxMCArNzYsMTYgQEAKIAlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byByZWNvcmQKIH0KIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0TmFtZSgpKS5jb21wYXJlVG8obmV3IFN0cmluZygoKEZpZWxkSW5mbykgbykuZ2V0TmFtZSgpKSk7Cit9CitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAlpZiAoIShvIGluc3RhbmNlb2YgRmllbGRJbmZvKSkgewotCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7CisJCXJldHVybiBmYWxzZTsKIAl9Ci0JcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5nZXROYW1lKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKCgoRmllbGRJbmZvKSBvKS5nZXROYW1lKCkpKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5lcXVhbHMoZ2V0TmFtZSgpLCAoKEZpZWxkSW5mbykgbykuZ2V0TmFtZSgpKTsKK30KK3B1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uaGFzaENvZGUoZ2V0TmFtZSgpKTsKIH0KIC8qKgogICogUmV0dXJuIHRoZSBjb25zdGFudCBvZiB0aGUgZmllbGQuCkBAIC04NywxMSArOTMsMTEgQEAKICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQKICAqLwogcHVibGljIENvbnN0YW50IGdldENvbnN0YW50KCkgewotCWlmIChjb25zdGFudCA9PSBudWxsKSB7CisJaWYgKHRoaXMuY29uc3RhbnQgPT0gbnVsbCkgewogCQkvLyByZWFkIGNvbnN0YW50CiAJCXJlYWRDb25zdGFudEF0dHJpYnV0ZSgpOwogCX0KLQlyZXR1cm4gY29uc3RhbnQ7CisJcmV0dXJuIHRoaXMuY29uc3RhbnQ7CiB9CiBwdWJsaWMgY2hhcltdIGdldEdlbmVyaWNTaWduYXR1cmUoKSB7CiAJaWYgKHRoaXMuc2lnbmF0dXJlVXRmOE9mZnNldCAhPSAtMSkgewpAQCAtMTIyLDEyICsxMjgsMTIgQEAKICAqIEByZXR1cm4gY2hhcltdCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKLQlpZiAobmFtZSA9PSBudWxsKSB7CisJaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CiAJCS8vIHJlYWQgdGhlIG5hbWUKLQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoMildIC0gc3RydWN0T2Zmc2V0OwotCQluYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoMildIC0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CisJCXRoaXMubmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCX0KLQlyZXR1cm4gbmFtZTsKKwlyZXR1cm4gdGhpcy5uYW1lOwogfQogcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKIAlyZXR1cm4gdGhpcy50YWdCaXRzOwpAQCAtMTQ0LDEyICsxNTAsMTIgQEAKICAqIEByZXR1cm4gY2hhcltdCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0VHlwZU5hbWUoKSB7Ci0JaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgeworCWlmICh0aGlzLmRlc2NyaXB0b3IgPT0gbnVsbCkgewogCQkvLyByZWFkIHRoZSBzaWduYXR1cmUKLQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoNCldIC0gc3RydWN0T2Zmc2V0OwotCQlkZXNjcmlwdG9yID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoNCldIC0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CisJCXRoaXMuZGVzY3JpcHRvciA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCX0KLQlyZXR1cm4gZGVzY3JpcHRvcjsKKwlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yOwogfQogLyoqCiAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9ucyBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCkBAIC0yNDksNyArMjU1LDcgQEAKIAkJCQkJCWlmIChhbm5vdGF0aW9ucyA9PSBudWxsKSB7CiAJCQkJCQkJYW5ub3RhdGlvbnMgPSBkZWNvZGVkQW5ub3RhdGlvbnM7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBsZW5ndGggPSBhbm5vdGF0aW9ucy5sZW5ndGg7CQkJCisJCQkJCQkJaW50IGxlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aDsKIAkJCQkJCQlBbm5vdGF0aW9uSW5mb1tdIGNvbWJpbmVkID0gbmV3IEFubm90YXRpb25JbmZvW2xlbmd0aCArIGRlY29kZWRBbm5vdGF0aW9ucy5sZW5ndGhdOwogCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYW5ub3RhdGlvbnMsIDAsIGNvbWJpbmVkLCAwLCBsZW5ndGgpOwogCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVjb2RlZEFubm90YXRpb25zLCAwLCBjb21iaW5lZCwgbGVuZ3RoLCBkZWNvZGVkQW5ub3RhdGlvbnMubGVuZ3RoKTsKQEAgLTI2OCw2OCArMjc0LDY4IEBACiAJaW50IHJlYWRPZmZzZXQgPSA4OwogCWJvb2xlYW4gaXNDb25zdGFudCA9IGZhbHNlOwogCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKLQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCQlpZiAoQ2hhck9wZXJhdGlvbgogCQkJLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db25zdGFudFZhbHVlTmFtZSkpIHsKIAkJCWlzQ29uc3RhbnQgPSB0cnVlOwogCQkJLy8gcmVhZCB0aGUgcmlnaHQgY29uc3RhbnQKLQkJCWludCByZWxhdGl2ZU9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0ICsgNildIC0gc3RydWN0T2Zmc2V0OworCQkJaW50IHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCArIDYpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQkJc3dpdGNoICh1MUF0KHJlbGF0aXZlT2Zmc2V0KSkgewogCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkludGVnZXJUYWcgOgogCQkJCQljaGFyW10gc2lnbiA9IGdldFR5cGVOYW1lKCk7CiAJCQkJCWlmIChzaWduLmxlbmd0aCA9PSAxKSB7CiAJCQkJCQlzd2l0Y2ggKHNpZ25bMF0pIHsKIAkJCQkJCQljYXNlICdaJyA6IC8vIGJvb2xlYW4gY29uc3RhbnQKLQkJCQkJCQkJY29uc3RhbnQgPSBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGk0QXQocmVsYXRpdmVPZmZzZXQgKyAxKSA9PSAxKTsKKwkJCQkJCQkJdGhpcy5jb25zdGFudCA9IEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUoaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpID09IDEpOwogCQkJCQkJCQlicmVhazsKIAkJCQkJCQljYXNlICdJJyA6IC8vIGludGVnZXIgY29uc3RhbnQKLQkJCQkJCQkJY29uc3RhbnQgPSBJbnRDb25zdGFudC5mcm9tVmFsdWUoaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJdGhpcy5jb25zdGFudCA9IEludENvbnN0YW50LmZyb21WYWx1ZShpNEF0KHJlbGF0aXZlT2Zmc2V0ICsgMSkpOwogCQkJCQkJCQlicmVhazsKIAkJCQkJCQljYXNlICdDJyA6IC8vIGNoYXIgY29uc3RhbnQKLQkJCQkJCQkJY29uc3RhbnQgPSBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKSBpNEF0KHJlbGF0aXZlT2Zmc2V0ICsgMSkpOworCQkJCQkJCQl0aGlzLmNvbnN0YW50ID0gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSgoY2hhcikgaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKIAkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJY2FzZSAnQicgOiAvLyBieXRlIGNvbnN0YW50Ci0JCQkJCQkJCWNvbnN0YW50ID0gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSkgaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJdGhpcy5jb25zdGFudCA9IEJ5dGVDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpIGk0QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgJ1MnIDogLy8gc2hvcnQgY29uc3RhbnQKLQkJCQkJCQkJY29uc3RhbnQgPSBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpIGk0QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CisJCQkJCQkJCXRoaXMuY29uc3RhbnQgPSBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpIGk0QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OyAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5GbG9hdFRhZyA6Ci0JCQkJCWNvbnN0YW50ID0gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUoZmxvYXRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJdGhpcy5jb25zdGFudCA9IEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGZsb2F0QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkRvdWJsZVRhZyA6Ci0JCQkJCWNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGRvdWJsZUF0KHJlbGF0aXZlT2Zmc2V0ICsgMSkpOworCQkJCQl0aGlzLmNvbnN0YW50ID0gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGRvdWJsZUF0KHJlbGF0aXZlT2Zmc2V0ICsgMSkpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5Mb25nVGFnIDoKLQkJCQkJY29uc3RhbnQgPSBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGk4QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CisJCQkJCXRoaXMuY29uc3RhbnQgPSBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGk4QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLlN0cmluZ1RhZyA6Ci0JCQkJCXV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVsYXRpdmVPZmZzZXQgKyAxKV0gLSBzdHJ1Y3RPZmZzZXQ7Ci0JCQkJCWNvbnN0YW50ID0gCisJCQkJCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWxhdGl2ZU9mZnNldCArIDEpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OworCQkJCQl0aGlzLmNvbnN0YW50ID0KIAkJCQkJCVN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZSgKLQkJCQkJCQlTdHJpbmcudmFsdWVPZih1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKSkpOyAKKwkJCQkJCQlTdHJpbmcudmFsdWVPZih1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKSkpOwogCQkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOwogCX0KIAlpZiAoIWlzQ29uc3RhbnQpIHsKLQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJfQogfQogcHJpdmF0ZSB2b2lkIHJlYWRNb2RpZmllclJlbGF0ZWRBdHRyaWJ1dGVzKCkgewogCWludCBhdHRyaWJ1dGVzQ291bnQgPSB1MkF0KDYpOwogCWludCByZWFkT2Zmc2V0ID0gODsKIAlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNDb3VudDsgaSsrKSB7Ci0JCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldDsKKwkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0KV0gLSB0aGlzLnN0cnVjdE9mZnNldDsKIAkJY2hhcltdIGF0dHJpYnV0ZU5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJLy8gdGVzdCBhZGRlZCBmb3Igb2JmdXNjYXRlZCAuY2xhc3MgZmlsZS4gU2VlIDc5NzcyCiAJCWlmIChhdHRyaWJ1dGVOYW1lLmxlbmd0aCAhPSAwKSB7CkBAIC0zNDksMTcgKzM1NSwxNyBAQAogfQogLyoqCiAgKiBBbnN3ZXIgdGhlIHNpemUgb2YgdGhlIHJlY2VpdmVyIGluIGJ5dGVzLgotICogCisgKgogICogQHJldHVybiBpbnQKICAqLwogcHVibGljIGludCBzaXplSW5CeXRlcygpIHsKLQlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7CisJcmV0dXJuIHRoaXMuYXR0cmlidXRlQnl0ZXM7CiB9CiBwdWJsaWMgdm9pZCB0aHJvd0Zvcm1hdEV4Y2VwdGlvbigpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckJhZEZpZWxkSW5mbyk7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwkKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CiAJdG9TdHJpbmdDb250ZW50KGJ1ZmZlcik7CiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogfQpAQCAtMzgyLDYgKzM4OCw2IEBACiAJCS5hcHBlbmQoJyAnKQogCQkuYXBwZW5kKGdldENvbnN0YW50KCkpCiAJCS5hcHBlbmQoJ30nKQotCQkudG9TdHJpbmcoKTsgCisJCS50b1N0cmluZygpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mb1dpdGhBbm5vdGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvV2l0aEFubm90YXRpb24uamF2YQppbmRleCA4MjYxYmM2Li40ZTNjNDM1IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvV2l0aEFubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvV2l0aEFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBCRUEgU3lzdGVtcywgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzYsMTMgKzM2LDEzIEBACiAJc3VwZXIuaW5pdGlhbGl6ZSgpOwogfQogcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JaWYgKGFubm90YXRpb25zICE9IG51bGwpCisJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCiAJCQl0aGlzLmFubm90YXRpb25zW2ldLnJlc2V0KCk7CiAJc3VwZXIucmVzZXQoKTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCWlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpIHsKIAkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Jbm5lckNsYXNzSW5mby5qYXZhCmluZGV4IGFhMTU2M2YuLjMyZWZlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Jbm5lckNsYXNzSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Jbm5lckNsYXNzSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQzLDE5ICs0MywxOSBAQAogICogQHJldHVybiBjaGFyW10KICAqLwogcHVibGljIGNoYXJbXSBnZXRFbmNsb3NpbmdUeXBlTmFtZSgpIHsKLQlpZiAoIXJlYWRPdXRlckNsYXNzTmFtZSkgeworCWlmICghdGhpcy5yZWFkT3V0ZXJDbGFzc05hbWUpIHsKIAkJLy8gcmVhZCBvdXRlciBjbGFzcyBuYW1lCi0JCXJlYWRPdXRlckNsYXNzTmFtZSA9IHRydWU7Ci0JCWlmIChvdXRlckNsYXNzTmFtZUluZGV4ICE9IDApIHsKLQkJCWludCB1dGY4T2Zmc2V0ID0gCi0JCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KAotCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW291dGVyQ2xhc3NOYW1lSW5kZXhdIC0gc3RydWN0T2Zmc2V0ICsgMSldCi0JCQkJCS0gc3RydWN0T2Zmc2V0OyAKLQkJCW91dGVyQ2xhc3NOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCXRoaXMucmVhZE91dGVyQ2xhc3NOYW1lID0gdHJ1ZTsKKwkJaWYgKHRoaXMub3V0ZXJDbGFzc05hbWVJbmRleCAhPSAwKSB7CisJCQlpbnQgdXRmOE9mZnNldCA9CisJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoCisJCQkJCXRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t0aGlzLm91dGVyQ2xhc3NOYW1lSW5kZXhdIC0gdGhpcy5zdHJ1Y3RPZmZzZXQgKyAxKV0KKwkJCQkJLSB0aGlzLnN0cnVjdE9mZnNldDsKKwkJCXRoaXMub3V0ZXJDbGFzc05hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJfQogCiAJfQotCXJldHVybiBvdXRlckNsYXNzTmFtZTsKKwlyZXR1cm4gdGhpcy5vdXRlckNsYXNzTmFtZTsKIH0KIC8qKgogICogQW5zd2VyIGFuIGludCB3aG9zZSBiaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRoZSBhY2Nlc3MgY29uc3RhbnRzCkBAIC02MywxMSArNjMsMTEgQEAKICAqIEByZXR1cm4gaW50CiAgKi8KIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCWlmIChhY2Nlc3NGbGFncyA9PSAtMSkgeworCWlmICh0aGlzLmFjY2Vzc0ZsYWdzID09IC0xKSB7CiAJCS8vIHJlYWQgYWNjZXNzIGZsYWcKLQkJYWNjZXNzRmxhZ3MgPSB1MkF0KDYpOworCQl0aGlzLmFjY2Vzc0ZsYWdzID0gdTJBdCg2KTsKIAl9Ci0JcmV0dXJuIGFjY2Vzc0ZsYWdzOworCXJldHVybiB0aGlzLmFjY2Vzc0ZsYWdzOwogfQogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIG1lbWJlciB0eXBlIGluIHRoZQpAQCAtNzcsMTYgKzc3LDE2IEBACiAgKiBAcmV0dXJuIGNoYXJbXQogICovCiBwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7Ci0JaWYgKCFyZWFkSW5uZXJDbGFzc05hbWUpIHsKKwlpZiAoIXRoaXMucmVhZElubmVyQ2xhc3NOYW1lKSB7CiAJCS8vIHJlYWQgdGhlIGlubmVyIGNsYXNzIG5hbWUKLQkJcmVhZElubmVyQ2xhc3NOYW1lID0gdHJ1ZTsKLQkJaWYgKGlubmVyQ2xhc3NOYW1lSW5kZXggIT0gMCkgewotCQkJaW50ICBjbGFzc09mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbaW5uZXJDbGFzc05hbWVJbmRleF0gLSBzdHJ1Y3RPZmZzZXQ7Ci0JCQlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjbGFzc09mZnNldCArIDEpXSAtIHN0cnVjdE9mZnNldDsKLQkJCWlubmVyQ2xhc3NOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCXRoaXMucmVhZElubmVyQ2xhc3NOYW1lID0gdHJ1ZTsKKwkJaWYgKHRoaXMuaW5uZXJDbGFzc05hbWVJbmRleCAhPSAwKSB7CisJCQlpbnQgIGNsYXNzT2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3RoaXMuaW5uZXJDbGFzc05hbWVJbmRleF0gLSB0aGlzLnN0cnVjdE9mZnNldDsKKwkJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoY2xhc3NPZmZzZXQgKyAxKV0gLSB0aGlzLnN0cnVjdE9mZnNldDsKKwkJCXRoaXMuaW5uZXJDbGFzc05hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJfQogCX0KLQlyZXR1cm4gaW5uZXJDbGFzc05hbWU7CisJcmV0dXJuIHRoaXMuaW5uZXJDbGFzc05hbWU7CiB9CiAvKioKICAqIEFuc3dlciB0aGUgc291cmNlIG5hbWUgb2YgdGhlIG1lbWJlciB0eXBlLgpAQCAtOTcsMTIgKzk3LDEyIEBACiBwdWJsaWMgY2hhcltdIGdldFNvdXJjZU5hbWUoKSB7CiAJaWYgKCF0aGlzLnJlYWRJbm5lck5hbWUpIHsKIAkJdGhpcy5yZWFkSW5uZXJOYW1lID0gdHJ1ZTsKLQkJaWYgKGlubmVyTmFtZUluZGV4ICE9IDApIHsKLQkJCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1tpbm5lck5hbWVJbmRleF0gLSBzdHJ1Y3RPZmZzZXQ7Ci0JCQlpbm5lck5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKKwkJaWYgKHRoaXMuaW5uZXJOYW1lSW5kZXggIT0gMCkgeworCQkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdGhpcy5pbm5lck5hbWVJbmRleF0gLSB0aGlzLnN0cnVjdE9mZnNldDsKKwkJCXRoaXMuaW5uZXJOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCX0KIAl9Ci0JcmV0dXJuIGlubmVyTmFtZTsKKwlyZXR1cm4gdGhpcy5pbm5lck5hbWU7CiB9CiAvKioKICAqIEFuc3dlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgpAQCAtMTIxLDcgKzEyMSw3IEBACiAJaWYgKGdldFNvdXJjZU5hbWUoKSAhPSBudWxsKSB7CiAJCWJ1ZmZlci5hcHBlbmQoZ2V0U291cmNlTmFtZSgpKTsKIAl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOyAgIAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KIC8qKgogICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmdWxseSBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZXIuIEFsbCBtZXRob2RpbmZvcywgZmllbGRzIGluZm9zCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm8uamF2YQppbmRleCAxNmY3NjJjLi4yNmRhMDgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDIsNyArNDIsNyBAQAogCQlpbnQgdXRmOE9mZnNldCA9IG1ldGhvZEluZm8uY29uc3RhbnRQb29sT2Zmc2V0c1ttZXRob2RJbmZvLnUyQXQocmVhZE9mZnNldCldIC0gbWV0aG9kSW5mby5zdHJ1Y3RPZmZzZXQ7CiAJCWNoYXJbXSBhdHRyaWJ1dGVOYW1lID0gbWV0aG9kSW5mby51dGY4QXQodXRmOE9mZnNldCArIDMsIG1ldGhvZEluZm8udTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCQlpZiAoYXR0cmlidXRlTmFtZS5sZW5ndGggPiAwKSB7Ci0JCQlzd2l0Y2goYXR0cmlidXRlTmFtZVswXSkgewkJCQkKKwkJCXN3aXRjaChhdHRyaWJ1dGVOYW1lWzBdKSB7CiAJCQkJY2FzZSAnUycgOgogCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU2lnbmF0dXJlTmFtZSwgYXR0cmlidXRlTmFtZSkpCiAJCQkJCQltZXRob2RJbmZvLnNpZ25hdHVyZVV0ZjhPZmZzZXQgPSBtZXRob2RJbmZvLmNvbnN0YW50UG9vbE9mZnNldHNbbWV0aG9kSW5mby51MkF0KHJlYWRPZmZzZXQgKyA2KV0gLSBtZXRob2RJbmZvLnN0cnVjdE9mZnNldDsKQEAgLTUxLDExICs1MSwxMSBAQAogCQkJCQlBbm5vdGF0aW9uSW5mb1tdIG1ldGhvZEFubm90YXRpb25zID0gbnVsbDsKIAkJCQkJQW5ub3RhdGlvbkluZm9bXVtdIHBhcmFtQW5ub3RhdGlvbnMgPSBudWxsOwogCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZVZpc2libGVBbm5vdGF0aW9uc05hbWUpKSB7Ci0JCQkJCQltZXRob2RBbm5vdGF0aW9ucyA9IGRlY29kZU1ldGhvZEFubm90YXRpb25zKHJlYWRPZmZzZXQsIHRydWUsIG1ldGhvZEluZm8pOwkJCQkJCQorCQkJCQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBkZWNvZGVNZXRob2RBbm5vdGF0aW9ucyhyZWFkT2Zmc2V0LCB0cnVlLCBtZXRob2RJbmZvKTsKIAkJCQkJfSBlbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5SdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNOYW1lKSkgewogCQkJCQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBkZWNvZGVNZXRob2RBbm5vdGF0aW9ucyhyZWFkT2Zmc2V0LCBmYWxzZSwgbWV0aG9kSW5mbyk7CiAJCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc05hbWUpKSB7Ci0JCQkJCQlwYXJhbUFubm90YXRpb25zID0gZGVjb2RlUGFyYW1Bbm5vdGF0aW9ucyhyZWFkT2Zmc2V0LCB0cnVlLCBtZXRob2RJbmZvKTsJCQkJCQkKKwkJCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBkZWNvZGVQYXJhbUFubm90YXRpb25zKHJlYWRPZmZzZXQsIHRydWUsIG1ldGhvZEluZm8pOwogCQkJCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc05hbWUpKSB7CiAJCQkJCQlwYXJhbUFubm90YXRpb25zID0gZGVjb2RlUGFyYW1Bbm5vdGF0aW9ucyhyZWFkT2Zmc2V0LCBmYWxzZSwgbWV0aG9kSW5mbyk7CiAJCQkJCX0KQEAgLTEwOCw3ICsxMDgsNyBAQAogCWludCByZWFkT2Zmc2V0ID0gb2Zmc2V0OwogCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZBbm5vdGF0aW9uczsgaSsrKSB7CiAJCXJlc3VsdFtpXSA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXRob2RJbmZvLnJlZmVyZW5jZSwgbWV0aG9kSW5mby5jb25zdGFudFBvb2xPZmZzZXRzLAotCQkJcmVhZE9mZnNldCArIG1ldGhvZEluZm8uc3RydWN0T2Zmc2V0LCBydW50aW1lVmlzaWJsZSwgZmFsc2UpOwkJCisJCQlyZWFkT2Zmc2V0ICsgbWV0aG9kSW5mby5zdHJ1Y3RPZmZzZXQsIHJ1bnRpbWVWaXNpYmxlLCBmYWxzZSk7CiAJCXJlYWRPZmZzZXQgKz0gcmVzdWx0W2ldLnJlYWRPZmZzZXQ7CiAJfQogCXJldHVybiByZXN1bHQ7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAlpZiAobnVtYmVyT2ZBbm5vdGF0aW9ucyA+IDApIHsKIAkJQW5ub3RhdGlvbkluZm9bXSBhbm5vcyA9IGRlY29kZUFubm90YXRpb25zKG9mZnNldCArIDgsIHJ1bnRpbWVWaXNpYmxlLCBudW1iZXJPZkFubm90YXRpb25zLCBtZXRob2RJbmZvKTsKIAkJaWYgKHJ1bnRpbWVWaXNpYmxlKXsKLQkJCWludCBudW1TdGFuZGFyZEFubm90YXRpb25zID0gMDsJCQkKKwkJCWludCBudW1TdGFuZGFyZEFubm90YXRpb25zID0gMDsKIAkJCWZvciggaW50IGk9MDsgaTxudW1iZXJPZkFubm90YXRpb25zOyBpKysgKXsKIAkJCQlsb25nIHN0YW5kYXJkQW5ub1RhZ0JpdHMgPSBhbm5vc1tpXS5zdGFuZGFyZEFubm90YXRpb25UYWdCaXRzOwogCQkJCW1ldGhvZEluZm8udGFnQml0cyB8PSBzdGFuZGFyZEFubm9UYWdCaXRzOwpAQCAtMTMyLDIxICsxMzIsMjEgQEAKIAkJCQlpZiggbnVtU3RhbmRhcmRBbm5vdGF0aW9ucyA9PSBudW1iZXJPZkFubm90YXRpb25zICkKIAkJCQkJcmV0dXJuIG51bGw7CiAKLQkJCQkvLyBuZWVkIHRvIHJlc2l6ZQkJCQorCQkJCS8vIG5lZWQgdG8gcmVzaXplCiAJCQkJQW5ub3RhdGlvbkluZm9bXSB0ZW1wID0gbmV3IEFubm90YXRpb25JbmZvW251bWJlck9mQW5ub3RhdGlvbnMgLSBudW1TdGFuZGFyZEFubm90YXRpb25zIF07CiAJCQkJaW50IHRtcEluZGV4ID0gMDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQW5ub3RhdGlvbnM7IGkrKykKIAkJCQkJaWYgKGFubm9zW2ldICE9IG51bGwpCiAJCQkJCQl0ZW1wW3RtcEluZGV4ICsrXSA9IGFubm9zW2ldOwotCQkJCWFubm9zID0gdGVtcDsJCisJCQkJYW5ub3MgPSB0ZW1wOwogCQkJfQogCQl9CiAJCXJldHVybiBhbm5vczsKIAl9CiAJcmV0dXJuIG51bGw7CiB9Ci1zdGF0aWMgQW5ub3RhdGlvbkluZm9bXVtdIGRlY29kZVBhcmFtQW5ub3RhdGlvbnMoaW50IG9mZnNldCwgYm9vbGVhbiBydW50aW1lVmlzaWJsZSwgTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7CQkKLQlBbm5vdGF0aW9uSW5mb1tdW10gYWxsUGFyYW1Bbm5vdGF0aW9ucyA9IG51bGw7CQorc3RhdGljIEFubm90YXRpb25JbmZvW11bXSBkZWNvZGVQYXJhbUFubm90YXRpb25zKGludCBvZmZzZXQsIGJvb2xlYW4gcnVudGltZVZpc2libGUsIE1ldGhvZEluZm8gbWV0aG9kSW5mbykgeworCUFubm90YXRpb25JbmZvW11bXSBhbGxQYXJhbUFubm90YXRpb25zID0gbnVsbDsKIAlpbnQgbnVtYmVyT2ZQYXJhbWV0ZXJzID0gbWV0aG9kSW5mby51MUF0KG9mZnNldCArIDYpOwogCWlmIChudW1iZXJPZlBhcmFtZXRlcnMgPiAwKSB7CiAJCS8vIHUyIGF0dHJpYnV0ZV9uYW1lX2luZGV4ICsgdTQgYXR0cmlidXRlX2xlbmd0aCArIHUxIG51bV9wYXJhbWV0ZXJzCkBAIC0xNTQsMTMgKzE1NCwxMyBAQAogCQlmb3IgKGludCBpPTAgOyBpIDwgbnVtYmVyT2ZQYXJhbWV0ZXJzOyBpKyspIHsKIAkJCWludCBudW1iZXJPZkFubm90YXRpb25zID0gbWV0aG9kSW5mby51MkF0KHJlYWRPZmZzZXQpOwogCQkJcmVhZE9mZnNldCArPSAyOwotCQkJaWYgKG51bWJlck9mQW5ub3RhdGlvbnMgPiAwKSB7CQorCQkJaWYgKG51bWJlck9mQW5ub3RhdGlvbnMgPiAwKSB7CiAJCQkJaWYgKGFsbFBhcmFtQW5ub3RhdGlvbnMgPT0gbnVsbCkKIAkJCQkJYWxsUGFyYW1Bbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uSW5mb1tudW1iZXJPZlBhcmFtZXRlcnNdW107CiAJCQkJQW5ub3RhdGlvbkluZm9bXSBhbm5vcyA9IGRlY29kZUFubm90YXRpb25zKHJlYWRPZmZzZXQsIHJ1bnRpbWVWaXNpYmxlLCBudW1iZXJPZkFubm90YXRpb25zLCBtZXRob2RJbmZvKTsKIAkJCQlhbGxQYXJhbUFubm90YXRpb25zW2ldID0gYW5ub3M7CiAJCQkJZm9yIChpbnQgYUluZGV4ID0gMDsgYUluZGV4IDwgYW5ub3MubGVuZ3RoOyBhSW5kZXgrKykKLQkJCQkJcmVhZE9mZnNldCArPSBhbm5vc1thSW5kZXhdLnJlYWRPZmZzZXQ7CQkJCQkJCisJCQkJCXJlYWRPZmZzZXQgKz0gYW5ub3NbYUluZGV4XS5yZWFkT2Zmc2V0OwogCQkJfQogCQl9CiAJfQpAQCAtMTc0LDE4ICsxNzQsMjUgQEAKICAqLwogcHJvdGVjdGVkIE1ldGhvZEluZm8gKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgaW50IG9mZnNldHNbXSwgaW50IG9mZnNldCkgewogCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBvZmZzZXRzLCBvZmZzZXQpOwotCXRoaXMuYWNjZXNzRmxhZ3MgPSAtMTsJCisJdGhpcy5hY2Nlc3NGbGFncyA9IC0xOwogCXRoaXMuc2lnbmF0dXJlVXRmOE9mZnNldCA9IC0xOwogfQogcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQlpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kSW5mbykpIHsKLQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwotCX0KLQogCU1ldGhvZEluZm8gb3RoZXJNZXRob2QgPSAoTWV0aG9kSW5mbykgbzsKLQlpbnQgcmVzdWx0ID0gbmV3IFN0cmluZyh0aGlzLmdldFNlbGVjdG9yKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKG90aGVyTWV0aG9kLmdldFNlbGVjdG9yKCkpKTsKKwlpbnQgcmVzdWx0ID0gbmV3IFN0cmluZyhnZXRTZWxlY3RvcigpKS5jb21wYXJlVG8obmV3IFN0cmluZyhvdGhlck1ldGhvZC5nZXRTZWxlY3RvcigpKSk7CiAJaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwotCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZ2V0TWV0aG9kRGVzY3JpcHRvcigpKS5jb21wYXJlVG8obmV3IFN0cmluZyhvdGhlck1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwlyZXR1cm4gbmV3IFN0cmluZyhnZXRNZXRob2REZXNjcmlwdG9yKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKG90aGVyTWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKSkpOworfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJaWYgKCEobyBpbnN0YW5jZW9mIE1ldGhvZEluZm8pKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJTWV0aG9kSW5mbyBvdGhlck1ldGhvZCA9IChNZXRob2RJbmZvKSBvOworCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyhnZXRTZWxlY3RvcigpLCBvdGhlck1ldGhvZC5nZXRTZWxlY3RvcigpKQorCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZ2V0TWV0aG9kRGVzY3JpcHRvcigpLCBvdGhlck1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCkpOworfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShnZXRTZWxlY3RvcigpKSArIENoYXJPcGVyYXRpb24uaGFzaENvZGUoZ2V0TWV0aG9kRGVzY3JpcHRvcigpKTsKIH0KIC8qKgogICogQHJldHVybiB0aGUgYW5ub3RhdGlvbnMgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgpAQCAtMjE0LDEwICsyMjEsMTAgQEAKICAqIEByZXR1cm4gY2hhcltdW10KICAqLwogcHVibGljIGNoYXJbXVtdIGdldEV4Y2VwdGlvblR5cGVOYW1lcygpIHsKLQlpZiAoZXhjZXB0aW9uTmFtZXMgPT0gbnVsbCkgeworCWlmICh0aGlzLmV4Y2VwdGlvbk5hbWVzID09IG51bGwpIHsKIAkJcmVhZEV4Y2VwdGlvbkF0dHJpYnV0ZXMoKTsKIAl9Ci0JcmV0dXJuIGV4Y2VwdGlvbk5hbWVzOworCXJldHVybiB0aGlzLmV4Y2VwdGlvbk5hbWVzOwogfQogcHVibGljIGNoYXJbXSBnZXRHZW5lcmljU2lnbmF0dXJlKCkgewogCWlmICh0aGlzLnNpZ25hdHVyZVV0ZjhPZmZzZXQgIT0gLTEpIHsKQEAgLTIzOSwxMiArMjQ2LDEyIEBACiAgKiBAcmV0dXJuIGNoYXJbXQogICovCiBwdWJsaWMgY2hhcltdIGdldE1ldGhvZERlc2NyaXB0b3IoKSB7Ci0JaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgeworCWlmICh0aGlzLmRlc2NyaXB0b3IgPT0gbnVsbCkgewogCQkvLyByZWFkIHRoZSBuYW1lCi0JCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KDQpXSAtIHN0cnVjdE9mZnNldDsKLQkJZGVzY3JpcHRvciA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KDQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OworCQl0aGlzLmRlc2NyaXB0b3IgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAl9Ci0JcmV0dXJuIGRlc2NyaXB0b3I7CisJcmV0dXJuIHRoaXMuZGVzY3JpcHRvcjsKIH0KIC8qKgogICogQW5zd2VyIGFuIGludCB3aG9zZSBiaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRoZSBhY2Nlc3MgY29uc3RhbnRzCkBAIC0yNzAsMTIgKzI3NywxMiBAQAogICogQHJldHVybiBjaGFyW10KICAqLwogcHVibGljIGNoYXJbXSBnZXRTZWxlY3RvcigpIHsKLQlpZiAobmFtZSA9PSBudWxsKSB7CisJaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CiAJCS8vIHJlYWQgdGhlIG5hbWUKLQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoMildIC0gc3RydWN0T2Zmc2V0OwotCQluYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoMildIC0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CisJCXRoaXMubmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCX0KLQlyZXR1cm4gbmFtZTsKKwlyZXR1cm4gdGhpcy5uYW1lOwogfQogcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKIAlyZXR1cm4gdGhpcy50YWdCaXRzOwpAQCAtMzIwLDcgKzMyNyw3IEBACiAJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoNik7CiAJaW50IHJlYWRPZmZzZXQgPSA4OwogCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKLQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHRoaXMuc3RydWN0T2Zmc2V0OwogCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOwogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRXhjZXB0aW9uc05hbWUpKSB7CiAJCQkvLyByZWFkIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9uIGVudHJpZXMKQEAgLTMyOCwxNSArMzM1LDE1IEBACiAJCQkvLyBwbGFjZSB0aGUgcmVhZE9mZnNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb25zIHRhYmxlCiAJCQlyZWFkT2Zmc2V0ICs9IDg7CiAJCQlpZiAoZW50cmllc051bWJlciA9PSAwKSB7Ci0JCQkJZXhjZXB0aW9uTmFtZXMgPSBub0V4Y2VwdGlvbjsKKwkJCQl0aGlzLmV4Y2VwdGlvbk5hbWVzID0gbm9FeGNlcHRpb247CiAJCQl9IGVsc2UgewotCQkJCWV4Y2VwdGlvbk5hbWVzID0gbmV3IGNoYXJbZW50cmllc051bWJlcl1bXTsKKwkJCQl0aGlzLmV4Y2VwdGlvbk5hbWVzID0gbmV3IGNoYXJbZW50cmllc051bWJlcl1bXTsKIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXNOdW1iZXI7IGorKykgewotCQkJCQl1dGY4T2Zmc2V0ID0gCi0JCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoCi0JCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldCArIDEpXQotCQkJCQkJCS0gc3RydWN0T2Zmc2V0OyAKLQkJCQkJZXhjZXB0aW9uTmFtZXNbal0gPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKKwkJCQkJdXRmOE9mZnNldCA9CisJCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdCgKKwkJCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0KV0gLSB0aGlzLnN0cnVjdE9mZnNldCArIDEpXQorCQkJCQkJCS0gdGhpcy5zdHJ1Y3RPZmZzZXQ7CisJCQkJCXRoaXMuZXhjZXB0aW9uTmFtZXNbal0gPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJCQkJcmVhZE9mZnNldCArPSAyOwogCQkJCX0KIAkJCX0KQEAgLTM0NCwxNSArMzUxLDE1IEBACiAJCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOwogCQl9CiAJfQotCWlmIChleGNlcHRpb25OYW1lcyA9PSBudWxsKSB7Ci0JCWV4Y2VwdGlvbk5hbWVzID0gbm9FeGNlcHRpb247CisJaWYgKHRoaXMuZXhjZXB0aW9uTmFtZXMgPT0gbnVsbCkgeworCQl0aGlzLmV4Y2VwdGlvbk5hbWVzID0gbm9FeGNlcHRpb247CiAJfQogfQogcHJpdmF0ZSB2b2lkIHJlYWRNb2RpZmllclJlbGF0ZWRBdHRyaWJ1dGVzKCkgewogCWludCBhdHRyaWJ1dGVzQ291bnQgPSB1MkF0KDYpOwogCWludCByZWFkT2Zmc2V0ID0gODsKIAlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNDb3VudDsgaSsrKSB7Ci0JCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldDsKKwkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0KV0gLSB0aGlzLnN0cnVjdE9mZnNldDsKIAkJY2hhcltdIGF0dHJpYnV0ZU5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJLy8gdGVzdCBhZGRlZCBmb3Igb2JmdXNjYXRlZCAuY2xhc3MgZmlsZS4gU2VlIDc5NzcyCiAJCWlmIChhdHRyaWJ1dGVOYW1lLmxlbmd0aCAhPSAwKSB7CkBAIC0zNzksMTEgKzM4NiwxMSBAQAogfQogLyoqCiAgKiBBbnN3ZXIgdGhlIHNpemUgb2YgdGhlIHJlY2VpdmVyIGluIGJ5dGVzLgotICogCisgKgogICogQHJldHVybiBpbnQKICAqLwogcHVibGljIGludCBzaXplSW5CeXRlcygpIHsKLQlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7CisJcmV0dXJuIHRoaXMuYXR0cmlidXRlQnl0ZXM7CiB9CiAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0zOTEsOCArMzk4LDggQEAKIAl0b1N0cmluZyhidWZmZXIpOwogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KLXZvaWQgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewkKLQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwkKK3ZvaWQgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCXRvU3RyaW5nQ29udGVudChidWZmZXIpOwogfQogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdDb250ZW50KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKQEAgLTQyMCw3ICs0MjcsNyBAQAogCWludCByZWFkT2Zmc2V0ID0gODsKIAlpZiAoYXR0cmlidXRlc0NvdW50ICE9IDApIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgewotCQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0KV0gLSB0aGlzLnN0cnVjdE9mZnNldDsKIAkJCWNoYXJbXSBhdHRyaWJ1dGVOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpKSB7CiAJCQkJZGVjb2RlQ29kZUF0dHJpYnV0ZShyZWFkT2Zmc2V0KTsKQEAgLTQ0OSw3ICs0NTYsNyBAQAogCWludCBhdHRyaWJ1dGVzQ291bnQgPSB1MkF0KHJlYWRPZmZzZXQpOwogCXJlYWRPZmZzZXQgKz0gMjsKIAlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNDb3VudDsgaSsrKSB7Ci0JCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXSAtIHN0cnVjdE9mZnNldDsKKwkJaW50IHV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0KV0gLSB0aGlzLnN0cnVjdE9mZnNldDsKIAkJY2hhcltdIGF0dHJpYnV0ZU5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpKSB7CiAJCQlkZWNvZGVMb2NhbFZhcmlhYmxlQXR0cmlidXRlKHJlYWRPZmZzZXQsIGNvZGVMZW5ndGgpOwpAQCAtNDY4LDcgKzQ3NSw3IEBACiAJCQlpbnQgc3RhcnRQQyA9IHUyQXQocmVhZE9mZnNldCk7CiAJCQlpZiAoc3RhcnRQQyA9PSAwKSB7CiAJCQkJaW50IG5hbWVJbmRleCA9IHUyQXQoNCArIHJlYWRPZmZzZXQpOwotCQkJCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1tuYW1lSW5kZXhdIC0gc3RydWN0T2Zmc2V0OworCQkJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW25hbWVJbmRleF0gLSB0aGlzLnN0cnVjdE9mZnNldDsKIAkJCQljaGFyW10gbG9jYWxWYXJpYWJsZU5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKIAkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGxvY2FsVmFyaWFibGVOYW1lLCBDb25zdGFudFBvb2wuVGhpcykpIHsKIAkJCQkJdGhpcy5hcmd1bWVudE5hbWVzW3RoaXMuYXJndW1lbnROYW1lc0luZGV4KytdID0gbG9jYWxWYXJpYWJsZU5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mb1dpdGhQYXJhbWV0ZXJBbm5vdGF0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm9XaXRoUGFyYW1ldGVyQW5ub3RhdGlvbnMuamF2YQppbmRleCBmYmI1NjhiLi45ZDg3MWIxIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mb1dpdGhQYXJhbWV0ZXJBbm5vdGF0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvV2l0aFBhcmFtZXRlckFubm90YXRpb25zLmphdmEKQEAgLTEsMjMgKzEsMzYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBCRUEgU3lzdGVtcywgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICAqCiAgKiBDb250cmlidXRvcnM6Ci0gKiAgICB0eWV1bmdAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgdHlldW5nQGJlYS5jb20gIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBmaXggZm9yIGJ1ZyAzNDI3NTcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIGNsYXNzIE1ldGhvZEluZm9XaXRoUGFyYW1ldGVyQW5ub3RhdGlvbnMgZXh0ZW5kcyBNZXRob2RJbmZvV2l0aEFubm90YXRpb25zIHsKIAlwcml2YXRlIEFubm90YXRpb25JbmZvW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9uczsKIAogTWV0aG9kSW5mb1dpdGhQYXJhbWV0ZXJBbm5vdGF0aW9ucyhNZXRob2RJbmZvIG1ldGhvZEluZm8sIEFubm90YXRpb25JbmZvW10gYW5ub3RhdGlvbnMsIEFubm90YXRpb25JbmZvW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucykgewogCXN1cGVyKG1ldGhvZEluZm8sIGFubm90YXRpb25zKTsKLQl0aGlzLnBhcmFtZXRlckFubm90YXRpb25zID0gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CisJaWYgKG1ldGhvZEluZm8uaXNDb25zdHJ1Y3RvcigpKSB7CisJCWludCBwYXJhbWV0ZXJzQ291bnQgPSBVdGlsLmdldFBhcmFtZXRlckNvdW50KG1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpKTsKKwkJaWYgKHBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aCA8IHBhcmFtZXRlcnNDb3VudCkgeworCQkJQW5ub3RhdGlvbkluZm9bXVtdIHRlbXAgPSBuZXcgQW5ub3RhdGlvbkluZm9bcGFyYW1ldGVyc0NvdW50XVtdOworCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJBbm5vdGF0aW9ucywgMCwgdGVtcCwgMSwgcGFyYW1ldGVyQW5ub3RhdGlvbnMubGVuZ3RoKTsKKwkJCXRoaXMucGFyYW1ldGVyQW5ub3RhdGlvbnMgPSB0ZW1wOworCQl9IGVsc2UgeworCQkJdGhpcy5wYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IHBhcmFtZXRlckFubm90YXRpb25zOworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5wYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IHBhcmFtZXRlckFubm90YXRpb25zOworCX0KIH0KIAogcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaW50IGluZGV4KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9BdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YQppbmRleCA5MDlhODAzLi41MWE0ZTgzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9BdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0F0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsNCArMzEsNiBAQAogCWZpbmFsIGNoYXJbXSBTdGFja01hcFRhYmxlTmFtZSA9ICJTdGFja01hcFRhYmxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJZmluYWwgY2hhcltdIEluY29uc2lzdGVudEhpZXJhcmNoeSA9ICJJbmNvbnNpc3RlbnRIaWVyYXJjaHkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlmaW5hbCBjaGFyW10gVmFyYXJnc05hbWUgPSAiVmFyYXJncyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBTdGFja01hcE5hbWUgPSAiU3RhY2tNYXAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gTWlzc2luZ1R5cGVzTmFtZSA9ICJNaXNzaW5nVHlwZXMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0JyYW5jaExhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9CcmFuY2hMYWJlbC5qYXZhCmluZGV4IDg5MWUwNmYuLmNjZjRjYzcgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0JyYW5jaExhYmVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQnJhbmNoTGFiZWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxNiArMTYsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgQnJhbmNoTGFiZWwgZXh0ZW5kcyBMYWJlbCB7Ci0JCisKIAlwcml2YXRlIGludFtdIGZvcndhcmRSZWZlcmVuY2VzID0gbmV3IGludFsxMF07IC8vIEFkZCBhbiBvdmVyZmxvdyBjaGVjayBoZXJlLgogCXByaXZhdGUgaW50IGZvcndhcmRSZWZlcmVuY2VDb3VudCA9IDA7CiAJQnJhbmNoTGFiZWwgZGVsZWdhdGU7IC8vCi0JCisKIAkvLyBMYWJlbCB0YWdiaXRzCiAJcHVibGljIGludCB0YWdCaXRzOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdJREUgPSAxOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVTRUQgPSAyOwotCQorCiBwdWJsaWMgQnJhbmNoTGFiZWwoKSB7CiAJLy8gZm9yIGNyZWF0aW5nIGxhYmVscyBhaGVhZCBvZiBjb2RlIGdlbmVyYXRpb24KIH0KQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWludCBsZW5ndGg7CiAJCQlpZiAoY291bnQgPj0gKGxlbmd0aCA9IHRoaXMuZm9yd2FyZFJlZmVyZW5jZXMubGVuZ3RoKSkKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm9yd2FyZFJlZmVyZW5jZXMsIDAsICh0aGlzLmZvcndhcmRSZWZlcmVuY2VzID0gbmV3IGludFsyKmxlbmd0aF0pLCAwLCBsZW5ndGgpOwotCQkJdGhpcy5mb3J3YXJkUmVmZXJlbmNlc1t0aGlzLmZvcndhcmRSZWZlcmVuY2VDb3VudCsrXSA9IHBvczsJCQkKKwkJCXRoaXMuZm9yd2FyZFJlZmVyZW5jZXNbdGhpcy5mb3J3YXJkUmVmZXJlbmNlQ291bnQrK10gPSBwb3M7CiAJCX0gZWxzZSBpZiAocHJldmlvdXNWYWx1ZSA+IHBvcykgewogCQkJaW50W10gcmVmcyA9IHRoaXMuZm9yd2FyZFJlZmVyZW5jZXM7CiAJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwpAQCAtNzksNyArNzksNyBAQAogcHVibGljIHZvaWQgYmVjb21lRGVsZWdhdGVGb3IoQnJhbmNoTGFiZWwgb3RoZXJMYWJlbCkgewogCS8vIG90aGVyIGxhYmVsIGlzIGRlbGVnYXRpbmcgdG8gcmVjZWl2ZXIgZnJvbSBub3cgb24KIAlvdGhlckxhYmVsLmRlbGVnYXRlID0gdGhpczsKLQkKKwogCS8vIGFsbCBleGlzdGluZyBmb3J3YXJkIHJlZnMgdG8gb3RoZXIgbGFiZWwgYXJlIGlubGluZWQgaW50byBjdXJyZW50IGxhYmVsCiAJZmluYWwgaW50IG90aGVyQ291bnQgPSBvdGhlckxhYmVsLmZvcndhcmRSZWZlcmVuY2VDb3VudDsKIAlpZiAob3RoZXJDb3VudCA9PSAwKSByZXR1cm47CkBAIC0xNTgsMTEgKzE1OCwxMSBAQAogCiBwdWJsaWMgaW50IGZvcndhcmRSZWZlcmVuY2VDb3VudCgpIHsKIAlpZiAodGhpcy5kZWxlZ2F0ZSAhPSBudWxsKSB0aGlzLmRlbGVnYXRlLmZvcndhcmRSZWZlcmVuY2VDb3VudCgpOwotCXJldHVybiBmb3J3YXJkUmVmZXJlbmNlQ291bnQ7CisJcmV0dXJuIHRoaXMuZm9yd2FyZFJlZmVyZW5jZUNvdW50OwogfQogcHVibGljIGludFtdIGZvcndhcmRSZWZlcmVuY2VzKCkgewogCWlmICh0aGlzLmRlbGVnYXRlICE9IG51bGwpIHRoaXMuZGVsZWdhdGUuZm9yd2FyZFJlZmVyZW5jZXMoKTsKLQlyZXR1cm4gZm9yd2FyZFJlZmVyZW5jZXM7CisJcmV0dXJuIHRoaXMuZm9yd2FyZFJlZmVyZW5jZXM7CiB9CiBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvZGVTdHJlYW0gc3RyZWFtKSB7CiAgICAgdGhpcy5jb2RlU3RyZWFtID0gc3RyZWFtOwpAQCAtMTgxLDE4ICsxODEsMTMgQEAKICogUGxhY2UgdGhlIGxhYmVsLiBJZiB3ZSBoYXZlIGZvcndhcmQgcmVmZXJlbmNlcyByZXNvbHZlIHRoZW0uCiAqLwogcHVibGljIHZvaWQgcGxhY2UoKSB7IC8vIEN1cnJlbnRseSBsYWNraW5nIHdpZGUgc3VwcG9ydC4KLQlpZiAoQ29kZVN0cmVhbS5ERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRcdDxwbGFjZSBhdDogIit0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb24rIiAtICIrIHRoaXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIC8vCWlmICgodGhpcy50YWdCaXRzICYgVVNFRCkgPT0gMCAmJiB0aGlzLmZvcndhcmRSZWZlcmVuY2VDb3VudCA9PSAwKSB7CiAvLwkJcmV0dXJuOwogLy8JfQogCiAJLy9UT0RPIGhvdyBjYW4gcG9zaXRpb24gYmUgc2V0IGFscmVhZHkgPyBjYW5ub3QgcGxhY2UgbW9yZSB0aGFuIG9uY2UKIAlpZiAodGhpcy5wb3NpdGlvbiA9PSBMYWJlbC5QT1NfTk9UX1NFVCkgewotCQlpZiAoKHRoaXMudGFnQml0cyAmIEJyYW5jaExhYmVsLlVTRUQpICE9IDAgfHwgdGhpcy5mb3J3YXJkUmVmZXJlbmNlQ291bnQgIT0gMCkgewotCQkJdGhpcy5wb3NpdGlvbiA9IHRoaXMuY29kZVN0cmVhbS5nZXRQb3NpdGlvbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wb3NpdGlvbiA9IHRoaXMuY29kZVN0cmVhbS5wb3NpdGlvbjsKLQkJfQorCQl0aGlzLnBvc2l0aW9uID0gdGhpcy5jb2RlU3RyZWFtLnBvc2l0aW9uOwogCQl0aGlzLmNvZGVTdHJlYW0uYWRkTGFiZWwodGhpcyk7CiAJCWludCBvbGRQb3NpdGlvbiA9IHRoaXMucG9zaXRpb247CiAJCWJvb2xlYW4gaXNPcHRpbWl6ZWRCcmFuY2ggPSBmYWxzZTsKQEAgLTIwOSw3ICsyMDQsNyBAQAogCQkJCQl0aGlzLmNvZGVTdHJlYW0ubGFzdEVudHJ5UEMgPSB0aGlzLnBvc2l0aW9uOwogCQkJCX0KIAkJCQkvLyBlbmQgb2YgbmV3IGNvZGUKLQkJCQlpZiAoKHRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUyB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpICE9IDApIHsKKwkJCQlpZiAoKHRoaXMuY29kZVN0cmVhbS5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUyB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRSB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpICE9IDApIHsKIAkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxzW10gPSB0aGlzLmNvZGVTdHJlYW0ubG9jYWxzOwogCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbG9jYWxzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IGxvY2Fsc1tpXTsKQEAgLTI0OSw3ICsyNDQsNyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgYmFzaWMgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKIAliYXNpYyA9IGJhc2ljLnN1YnN0cmluZyhiYXNpYy5sYXN0SW5kZXhPZignLicpKzEpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2ljKTsgCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzaWMpOwogCWJ1ZmZlci5hcHBlbmQoJ0AnKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7CiAJYnVmZmVyLmFwcGVuZCgiKHBvc2l0aW9uPSIpLmFwcGVuZCh0aGlzLnBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAogCWlmICh0aGlzLmRlbGVnYXRlICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoImRlbGVnYXRlPSIpLmFwcGVuZCh0aGlzLmRlbGVnYXRlKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FjaGVkSW5kZXhFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FjaGVkSW5kZXhFbnRyeS5qYXZhCmluZGV4IDQ0Y2RjNWYuLmIxYWQ4OWIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NhY2hlZEluZGV4RW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DYWNoZWRJbmRleEVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNyArMTMsNyBAQAogcHVibGljIGNsYXNzIENhY2hlZEluZGV4RW50cnkgewogCXB1YmxpYyBjaGFyW10gc2lnbmF0dXJlOwogCXB1YmxpYyBpbnQgaW5kZXg7Ci0JCisKIAlwdWJsaWMgQ2FjaGVkSW5kZXhFbnRyeShjaGFyW10gc2lnbmF0dXJlLCBpbnQgaW5kZXgpIHsKIAkJdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CiAJCXRoaXMuaW5kZXggPSBpbmRleDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Nhc2VMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKaW5kZXggN2NhNDE2MC4uZWQxMTgwYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOSArMTEsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKIAogcHVibGljIGNsYXNzIENhc2VMYWJlbCBleHRlbmRzIEJyYW5jaExhYmVsIHsKLQkKKwogCXB1YmxpYyBpbnQgaW5zdHJ1Y3Rpb25Qb3NpdGlvbiA9IFBPU19OT1RfU0VUOwotCQorCiAvKioKICAqIENhc2VMYWJlbCBjb25zdHJ1Y3RvciBjb21tZW50LgogICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQpAQCAtMjcsMTEgKzI3LDExIEBACiAqICNwbGFjZUluc3RydWN0aW9uKCkgbXVzdCBiZSBwZXJmb3JtZWQgcHJpb3IgdG8gYW55ICNicmFuY2goKQogKi8KIHZvaWQgYnJhbmNoKCkgewotCWlmIChwb3NpdGlvbiA9PSBQT1NfTk9UX1NFVCkgewotCQlhZGRGb3J3YXJkUmVmZXJlbmNlKGNvZGVTdHJlYW0ucG9zaXRpb24pOworCWlmICh0aGlzLnBvc2l0aW9uID09IFBPU19OT1RfU0VUKSB7CisJCWFkZEZvcndhcmRSZWZlcmVuY2UodGhpcy5jb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJLy8gTGVhdmUgNCBieXRlcyBmcmVlIHRvIGdlbmVyYXRlIHRoZSBqdW1wIG9mZnNldCBhZnRlcndhcmRzCi0JCWNvZGVTdHJlYW0ucG9zaXRpb24gKz0gNDsKLQkJY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQgKz0gNDsKKwkJdGhpcy5jb2RlU3RyZWFtLnBvc2l0aW9uICs9IDQ7CisJCXRoaXMuY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQgKz0gNDsKIAl9IGVsc2UgeyAvL1Bvc2l0aW9uIGlzIHNldC4gV3JpdGUgaXQhCiAJCS8qCiAJCSAqIFBvc2l0aW9uIGlzIHNldC4gV3JpdGUgaXQgaWYgaXQgaXMgbm90IGEgd2lkZSBicmFuY2guCkBAIC00NCw3ICs0NCw3IEBACiAqIE5vIHN1cHBvcnQgZm9yIHdpZGUgYnJhbmNoZXMgeWV0CiAqLwogdm9pZCBicmFuY2hXaWRlKCkgewotCXRoaXMuYnJhbmNoKCk7IC8vIGNhc2UgbGFiZWwgYnJhbmNoIGlzIGFscmVhZHkgd2lkZQorCWJyYW5jaCgpOyAvLyBjYXNlIGxhYmVsIGJyYW5jaCBpcyBhbHJlYWR5IHdpZGUKIH0KIAogcHVibGljIGJvb2xlYW4gaXNDYXNlTGFiZWwoKSB7CkBAIC01OCwxOCArNTgsMTggQEAKICovCiBwdWJsaWMgdm9pZCBwbGFjZSgpIHsKIAlpZiAoKHRoaXMudGFnQml0cyAmIFVTRUQpICE9IDApIHsKLQkJcG9zaXRpb24gPSBjb2RlU3RyZWFtLmdldFBvc2l0aW9uKCk7CisJCXRoaXMucG9zaXRpb24gPSB0aGlzLmNvZGVTdHJlYW0uZ2V0UG9zaXRpb24oKTsKIAl9IGVsc2UgewotCQlwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCXRoaXMucG9zaXRpb24gPSB0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb247CiAJfQotCWlmIChpbnN0cnVjdGlvblBvc2l0aW9uICE9IFBPU19OT1RfU0VUKSB7Ci0JCWludCBvZmZzZXQgPSBwb3NpdGlvbiAtIGluc3RydWN0aW9uUG9zaXRpb247CisJaWYgKHRoaXMuaW5zdHJ1Y3Rpb25Qb3NpdGlvbiAhPSBQT1NfTk9UX1NFVCkgeworCQlpbnQgb2Zmc2V0ID0gdGhpcy5wb3NpdGlvbiAtIHRoaXMuaW5zdHJ1Y3Rpb25Qb3NpdGlvbjsKIAkJaW50W10gZm9yd2FyZFJlZnMgPSBmb3J3YXJkUmVmZXJlbmNlcygpOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZm9yd2FyZFJlZmVyZW5jZUNvdW50KCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY29kZVN0cmVhbS53cml0ZVNpZ25lZFdvcmQoZm9yd2FyZFJlZnNbaV0sIG9mZnNldCk7CisJCQl0aGlzLmNvZGVTdHJlYW0ud3JpdGVTaWduZWRXb3JkKGZvcndhcmRSZWZzW2ldLCBvZmZzZXQpOwogCQl9Ci0JCS8vIGFkZCB0aGUgbGFiZWwgaW50IHRoZSBjb2RlU3RyZWFtIGxhYmVscyBjb2xsZWN0aW9uCi0JCWNvZGVTdHJlYW0uYWRkTGFiZWwodGhpcyk7CisJCS8vIGFkZCB0aGUgbGFiZWwgaW4gdGhlIGNvZGVTdHJlYW0gbGFiZWxzIGNvbGxlY3Rpb24KKwkJdGhpcy5jb2RlU3RyZWFtLmFkZExhYmVsKHRoaXMpOwogCX0KIH0KIApAQCAtNzcsOCArNzcsOCBAQAogKiBQdXQgZG93biAgYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5IGF0IHRoZSBsb2NhdGlvbiBpbiB0aGUgY29kZXN0cmVhbS4KICovCiB2b2lkIHBsYWNlSW5zdHJ1Y3Rpb24oKSB7Ci0JaWYgKGluc3RydWN0aW9uUG9zaXRpb24gPT0gUE9TX05PVF9TRVQpIHsKLQkJaW5zdHJ1Y3Rpb25Qb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHRoaXMuaW5zdHJ1Y3Rpb25Qb3NpdGlvbiA9PSBQT1NfTk9UX1NFVCkgeworCQl0aGlzLmluc3RydWN0aW9uUG9zaXRpb24gPSB0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb247CiAJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2hhckFycmF5Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEKaW5kZXggYTIwYWQ5MS4uMTc3ZTVmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2hhckFycmF5Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DaGFyQXJyYXlDYWNoZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDcgKzI4LDcgQEAKIC8qKgogICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCiAgKiBjYXBhY2l0eS4KLSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50IAorICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQKICAqCXRoZSBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzOyBtdXN0IGJlIGxlc3MgdGhhbiBJbnRlZ2VyLk1BWF9WQUxVRSAvIDIKICAqLwogcHVibGljIENoYXJBcnJheUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKQEAgLTUzLDcgKzUzLDcgQEAKICAqIEByZXR1cm4gYm9vbGVhbgogICovCiBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShjaGFyW10ga2V5KSB7Ci0JaW50IGluZGV4ID0gaGFzaENvZGVDaGFyKGtleSksIGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMua2V5VGFibGVbaW5kZXhdLCBrZXkpKQogCQkJcmV0dXJuIHRydWU7CkBAIC03MCw3ICs3MCw3IEBACiAgKglkZWZpbmVkIGluIHRoZSBoYXNoIHRhYmxlLgogICovCiBwdWJsaWMgaW50IGdldChjaGFyW10ga2V5KSB7Ci0JaW50IGluZGV4ID0gaGFzaENvZGVDaGFyKGtleSksIGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMua2V5VGFibGVbaW5kZXhdLCBrZXkpKQogCQkJcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF07CkBAIC04MCwyNiArODAsMTcgQEAKIAl9CiAJcmV0dXJuIC0xOwogfQotcHJpdmF0ZSBpbnQgaGFzaENvZGVDaGFyKGNoYXJbXSB2YWwpIHsKLQlmaW5hbCBpbnQgbGVuZ3RoID0gdmFsLmxlbmd0aDsKLQlpbnQgaGFzaCA9IDA7Ci0JZmluYWwgaW50IG4gPSAzOyAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBza2lwcGVkCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gbikgewotCQloYXNoICs9IHZhbFtpXTsKLQl9Ci0JcmV0dXJuIChoYXNoICYgMHg3RkZGRkZGRikgJSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKLX0KIC8qKgotICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlIGlmIGl0IHdhc24ndCB0aGVyZSBhbHJlYWR5LCAKKyAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSBpZiBpdCB3YXNuJ3QgdGhlcmUgYWxyZWFkeSwKICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogVGhlIGtleSBhbmQgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG51bGwuIAotICogCisgKiBUaGUga2V5IGFuZCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4KKyAqCiAgKiBAcGFyYW0ga2V5IHRoZSBnaXZlbiBrZXkgaW4gdGhlIGhhc2h0YWJsZQogICogQHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQogICogQHJldHVybiBpbnQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUga2V5LCBvciAtdmFsdWUgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KICAqLwogcHVibGljIGludCBwdXRJZkFic2VudChjaGFyW10ga2V5LCBpbnQgdmFsdWUpIHsKLQlpbnQgaW5kZXggPSBoYXNoQ29kZUNoYXIoa2V5KSwgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAl3aGlsZSAodGhpcy5rZXlUYWJsZVtpbmRleF0gIT0gbnVsbCkgewogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5rZXlUYWJsZVtpbmRleF0sIGtleSkpCiAJCQlyZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKQEAgLTExOSwxNCArMTEwLDE0IEBACiAvKioKICAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogVGhlIGtleSBhbmQgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG51bGwuIAotICogCisgKiBUaGUga2V5IGFuZCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4KKyAqCiAgKiBAcGFyYW0ga2V5IDxDT0RFPk9iamVjdDwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGhhc2h0YWJsZQogICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gdGhlIHNwZWNpZmllZCBlbGVtZW50CiAgKiBAcmV0dXJuIGludCB0aGUgb2xkIHZhbHVlIG9mIHRoZSBrZXksIG9yIC0xIGlmIGl0IGRpZCBub3QgaGF2ZSBvbmUuCiAgKi8KLXByaXZhdGUgaW50IHB1dChjaGFyW10ga2V5LCBpbnQgdmFsdWUpIHsgCi0JaW50IGluZGV4ID0gaGFzaENvZGVDaGFyKGtleSksIGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOworcHJpdmF0ZSBpbnQgcHV0KGNoYXJbXSBrZXksIGludCB2YWx1ZSkgeworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMua2V5VGFibGVbaW5kZXhdLCBrZXkpKQogCQkJcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKQEAgLTE2Miw3ICsxNTMsNyBAQAogICogQHBhcmFtIGtleSA8Q09ERT5jaGFyW108L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CiAgKi8KIHB1YmxpYyB2b2lkIHJlbW92ZShjaGFyW10ga2V5KSB7Ci0JaW50IGluZGV4ID0gaGFzaENvZGVDaGFyKGtleSksIGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMua2V5VGFibGVbaW5kZXhdLCBrZXkpKSB7CiAJCQl0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvZGVTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvZGVTdHJlYW0uamF2YQppbmRleCBhYTU2ZWY1Li40MDJkNjQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db2RlU3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29kZVN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDIwICsxNSwyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWxsb2NhdGlvbkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5VbmNvbmRpdGlvbmFsRmxvd0luZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydE1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQ29kZVN0cmVhbSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCisKIAkvLyBJdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB0aGUgZm9sbG93aW5nIGl0ZW1zLgogCS8vIC0+IFRyYWNraW5nIE1heCBTdGFjay4KIApAQCAtNDEsODkgKzQ0LDggQEAKIAlzdGF0aWMgTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBub0xvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tMT0NBTFNfSU5DUkVNRU5UXTsKIAlzdGF0aWMgTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBub1Zpc2libGVMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbTE9DQUxTX0lOQ1JFTUVOVF07CiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblJlc3VsdCBSRVNUQVJUX0lOX1dJREVfTU9ERSA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgoY2hhcltdKW51bGwsIDAsIDAsIDApOwotCS8qKgotCSAqIFRoaXMgbWV0aG9kcyBzZWFyY2hlcyBmb3IgYW4gZXhpc3RpbmcgZW50cnkgaW5zaWRlIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlIHdpdGggYSBwYyBlcXVhbHMgdG8gQHBjLgotCSAqIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGVudHJ5IGl0IHJldHVybnMgLTEgKG5vIGluc2VydGlvbiByZXF1aXJlZCkuCi0JICogT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGluZGV4IHdoZXJlIHRoZSBlbnRyeSBmb3IgdGhlIHBjIGhhcyB0byBiZSBpbnNlcnRlZC4KLQkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUgaXMgc29ydGVkIGFjY29yZGluZyB0byB0aGUgcGMuCi0JICoKLQkgKiBAcGFyYW0gcGNUb1NvdXJjZU1hcCB0aGUgZ2l2ZW4gcGNUb1NvdXJjZU1hcCBhcnJheQotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGdpdmVuIGxlbmd0aAotCSAqIEBwYXJhbSBwYyB0aGUgZ2l2ZW4gcGMKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluc2VydGlvbkluZGV4KGludFtdIHBjVG9Tb3VyY2VNYXAsIGludCBsZW5ndGgsIGludCBwYykgewotCQlpbnQgZyA9IDA7Ci0JCWludCBkID0gbGVuZ3RoIC0gMjsKLQkJaW50IG0gPSAwOwotCQl3aGlsZSAoZyA8PSBkKSB7Ci0JCQltID0gKGcgKyBkKSAvIDI7Ci0JCQkvLyB3ZSBzZWFyY2ggb25seSBvbiBldmVuIGluZGV4ZXMKLQkJCWlmICgobSAmIDEpICE9IDApIC8vIGZhc3RlciB0aGFuICgobSAlIDIpICE9IDApCi0JCQkJbS0tOwotCQkJaW50IGN1cnJlbnRQQyA9IHBjVG9Tb3VyY2VNYXBbbV07Ci0JCQlpZiAocGMgPCBjdXJyZW50UEMpIHsKLQkJCQlkID0gbSAtIDI7Ci0JCQl9IGVsc2UKLQkJCQlpZiAocGMgPiBjdXJyZW50UEMpIHsKLQkJCQkJZyA9IG0gKyAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCX0KLQkJaWYgKHBjIDwgcGNUb1NvdXJjZU1hcFttXSkKLQkJCXJldHVybiBtOwotCQlyZXR1cm4gbSArIDI7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzb3J0KGludFtdIHRhYiwgaW50IGxvMCwgaW50IGhpMCwgaW50W10gcmVzdWx0KSB7Ci0JCWludCBsbyA9IGxvMDsKLQkJaW50IGhpID0gaGkwOwotCQlpbnQgbWlkOwotCQlpZiAoaGkwID4gbG8wKSB7Ci0JCQkvKiBBcmJpdHJhcmlseSBlc3RhYmxpc2hpbmcgcGFydGl0aW9uIGVsZW1lbnQgYXMgdGhlIG1pZHBvaW50IG9mCi0JCQkgICogdGhlIGFycmF5LgotCQkJICAqLwotCQkJbWlkID0gdGFiW2xvMCArIChoaTAgLSBsbzApIC8gMl07Ci0JCQkvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IHVudGlsIGluZGljZXMgY3Jvc3MKLQkJCXdoaWxlIChsbyA8PSBoaSkgewotCQkJCS8qIGZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gCi0JCQkJICogdGhlIHBhcnRpdGlvbiBlbGVtZW50IHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQgSW5kZXguCi0JCQkJICovCi0JCQkJd2hpbGUgKChsbyA8IGhpMCkgJiYgKHRhYltsb10gPCBtaWQpKQotCQkJCQkrK2xvOwotCQkJCS8qIGZpbmQgYW4gZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byAKLQkJCQkgKiB0aGUgcGFydGl0aW9uIGVsZW1lbnQgc3RhcnRpbmcgZnJvbSB0aGUgcmlnaHQgSW5kZXguCi0JCQkJICovCi0JCQkJd2hpbGUgKChoaSA+IGxvMCkgJiYgKHRhYltoaV0gPiBtaWQpKQotCQkJCQktLWhpOwotCQkJCS8vIGlmIHRoZSBpbmRleGVzIGhhdmUgbm90IGNyb3NzZWQsIHN3YXAKLQkJCQlpZiAobG8gPD0gaGkpIHsKLQkJCQkJc3dhcCh0YWIsIGxvLCBoaSwgcmVzdWx0KTsKLQkJCQkJKytsbzsKLQkJCQkJLS1oaTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBJZiB0aGUgcmlnaHQgaW5kZXggaGFzIG5vdCByZWFjaGVkIHRoZSBsZWZ0IHNpZGUgb2YgYXJyYXkKLQkJCSAgKiBtdXN0IG5vdyBzb3J0IHRoZSBsZWZ0IHBhcnRpdGlvbi4KLQkJCSAgKi8KLQkJCWlmIChsbzAgPCBoaSkKLQkJCQlzb3J0KHRhYiwgbG8wLCBoaSwgcmVzdWx0KTsKLQkJCS8qIElmIHRoZSBsZWZ0IGluZGV4IGhhcyBub3QgcmVhY2hlZCB0aGUgcmlnaHQgc2lkZSBvZiBhcnJheQotCQkJICAqIG11c3Qgbm93IHNvcnQgdGhlIHJpZ2h0IHBhcnRpdGlvbi4KLQkJCSAgKi8KLQkJCWlmIChsbyA8IGhpMCkKLQkJCQlzb3J0KHRhYiwgbG8sIGhpMCwgcmVzdWx0KTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHN3YXAoaW50IGFbXSwgaW50IGksIGludCBqLCBpbnQgcmVzdWx0W10pIHsKLQkJaW50IFQ7Ci0JCVQgPSBhW2ldOwotCQlhW2ldID0gYVtqXTsKLQkJYVtqXSA9IFQ7Ci0JCVQgPSByZXN1bHRbal07Ci0JCXJlc3VsdFtqXSA9IHJlc3VsdFtpXTsKLQkJcmVzdWx0W2ldID0gVDsKLQl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblJlc3VsdCBSRVNUQVJUX0NPREVfR0VOX0ZPUl9VTlVTRURfTE9DQUxTX01PREUgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoKGNoYXJbXSludWxsLCAwLCAwLCAwKTsKKwogCXB1YmxpYyBpbnQgYWxsTG9jYWxzQ291bnRlcjsKIAlwdWJsaWMgYnl0ZVtdIGJDb2RlU3RyZWFtOwogCXB1YmxpYyBDbGFzc0ZpbGUgY2xhc3NGaWxlOyAvLyBUaGUgY3VycmVudCBjbGFzc2ZpbGUgaXQgaXMgYXNzb2NpYXRlZCB0by4KQEAgLTEzNSwzMiArNTcsMzkgQEAKIAlwdWJsaWMgaW50IGdlbmVyYXRlQXR0cmlidXRlczsKIAkvLyBzdG9yZSBhbGwgdGhlIGxhYmVscyBwbGFjZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZQogCS8vIGEganVtcCB0byB0aGUgbmV4dCBieXRlY29kZS4KLQlzdGF0aWMgZmluYWwgaW50IExfVU5LTk9XTiA9IDAsIExfT1BUSU1JWkFCTEUgPSAyLCBMX0NBTk5PVF9PUFRJTUlaRSA9IDQ7CQorCXN0YXRpYyBmaW5hbCBpbnQgTF9VTktOT1dOID0gMCwgTF9PUFRJTUlaQUJMRSA9IDIsIExfQ0FOTk9UX09QVElNSVpFID0gNDsKIAlwdWJsaWMgQnJhbmNoTGFiZWxbXSBsYWJlbHMgPSBuZXcgQnJhbmNoTGFiZWxbTEFCRUxTX0lOQ1JFTUVOVF07CiAJcHVibGljIGludCBsYXN0RW50cnlQQzsgLy8gbGFzdCBlbnRyeSByZWNvcmRlZAogCXB1YmxpYyBpbnQgbGFzdEFicnVwdENvbXBsZXRpb247IC8vIHBvc2l0aW9uIG9mIGxhc3QgaW5zdHJ1Y3Rpb24gd2hpY2ggYWJydXB0cyBjb21wbGV0aW9uOiBnb3RvL3JldHVybi9hdGhyb3cKKwogCXB1YmxpYyBpbnRbXSBsaW5lU2VwYXJhdG9yUG9zaXRpb25zOwotCQorCS8vIGxpbmUgbnVtYmVyIG9mIHRoZSBib2R5IHN0YXJ0IGFuZCB0aGUgYm9keSBlbmQKKwlwdWJsaWMgaW50IGxpbmVOdW1iZXJTdGFydDsKKworCXB1YmxpYyBpbnQgbGluZU51bWJlckVuZDsKIAlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBsb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbTE9DQUxTX0lOQ1JFTUVOVF07CiAJcHVibGljIGludCBtYXhGaWVsZENvdW50OwotCQogCXB1YmxpYyBpbnQgbWF4TG9jYWxzOwogCXB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uOwogCXB1YmxpYyBpbnRbXSBwY1RvU291cmNlTWFwID0gbmV3IGludFsyNF07CiAJcHVibGljIGludCBwY1RvU291cmNlTWFwU2l6ZTsKIAlwdWJsaWMgaW50IHBvc2l0aW9uOyAvLyBTbyB3aGVuIGZpcnN0IHNldCBjYW4gYmUgaW5jcmVtZW50ZWQKIAlwdWJsaWMgYm9vbGVhbiBwcmVzZXJ2ZVVudXNlZExvY2FsczsKKwogCXB1YmxpYyBpbnQgc3RhY2tEZXB0aDsgLy8gVXNlIEludHMgdG8ga2VlcCBmcm9tIHVzaW5nIGV4dHJhIGJjIHdoZW4gYWRkaW5nCisKIAlwdWJsaWMgaW50IHN0YWNrTWF4OyAvLyBVc2UgSW50cyB0byBrZWVwIGZyb20gdXNpbmcgZXh0cmEgYmMgd2hlbiBhZGRpbmcKIAlwdWJsaWMgaW50IHN0YXJ0aW5nQ2xhc3NGaWxlT2Zmc2V0OyAvLyBJIG5lZWQgdG8ga2VlcCB0aGUgc3RhcnRpbmcgcG9pbnQgaW5zaWRlIHRoZSBieXRlIGFycmF5Ci0JCiAJLy8gdGFyZ2V0IGxldmVsIHRvIG1hbmFnZSBkaWZmZXJlbnQgY29kZSBnZW5lcmF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHRhcmdldCBsZXZlbHMKLQlwcml2YXRlIGxvbmcgdGFyZ2V0TGV2ZWw7CisJcHJvdGVjdGVkIGxvbmcgdGFyZ2V0TGV2ZWw7CisKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSB2aXNpYmxlTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW0xPQ0FMU19JTkNSRU1FTlRdOworCQkKKwlpbnQgdmlzaWJsZUxvY2Fsc0NvdW50OwogCQotcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nW10gdmlzaWJsZUxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tMT0NBTFNfSU5DUkVNRU5UXTsKLWludCB2aXNpYmxlTG9jYWxzQ291bnQ7Ci0vLyB0byBoYW5kbGUgZ290b193Ci1wdWJsaWMgYm9vbGVhbiB3aWRlTW9kZSA9IGZhbHNlOworCS8vIHRvIGhhbmRsZSBnb3RvX3cKKwlwdWJsaWMgYm9vbGVhbiB3aWRlTW9kZSA9IGZhbHNlOwkKKwkKIHB1YmxpYyBDb2RlU3RyZWFtKENsYXNzRmlsZSBnaXZlbkNsYXNzRmlsZSkgewogCXRoaXMudGFyZ2V0TGV2ZWwgPSBnaXZlbkNsYXNzRmlsZS50YXJnZXRKREs7CiAJdGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgPSBnaXZlbkNsYXNzRmlsZS5wcm9kdWNlQXR0cmlidXRlczsKQEAgLTE2OCw0NSArOTcsMTMzIEBACiAJCXRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9ucyA9IGdpdmVuQ2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpOwogCX0KIH0KKy8qKgorICogVGhpcyBtZXRob2RzIHNlYXJjaGVzIGZvciBhbiBleGlzdGluZyBlbnRyeSBpbnNpZGUgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUgd2l0aCBhIHBjIGVxdWFscyB0byBAcGMuCisgKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSBpdCByZXR1cm5zIC0xIChubyBpbnNlcnRpb24gcmVxdWlyZWQpLgorICogT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGluZGV4IHdoZXJlIHRoZSBlbnRyeSBmb3IgdGhlIHBjIGhhcyB0byBiZSBpbnNlcnRlZC4KKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZSBpcyBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBwYy4KKyAqCisgKiBAcGFyYW0gcGNUb1NvdXJjZU1hcCB0aGUgZ2l2ZW4gcGNUb1NvdXJjZU1hcCBhcnJheQorICogQHBhcmFtIGxlbmd0aCB0aGUgZ2l2ZW4gbGVuZ3RoCisgKiBAcGFyYW0gcGMgdGhlIGdpdmVuIHBjCisgKiBAcmV0dXJuIGludAorICovCitwdWJsaWMgc3RhdGljIGludCBpbnNlcnRpb25JbmRleChpbnRbXSBwY1RvU291cmNlTWFwLCBpbnQgbGVuZ3RoLCBpbnQgcGMpIHsKKwlpbnQgZyA9IDA7CisJaW50IGQgPSBsZW5ndGggLSAyOworCWludCBtID0gMDsKKwl3aGlsZSAoZyA8PSBkKSB7CisJCW0gPSAoZyArIGQpIC8gMjsKKwkJLy8gd2Ugc2VhcmNoIG9ubHkgb24gZXZlbiBpbmRleGVzCisJCWlmICgobSAmIDEpICE9IDApIC8vIGZhc3RlciB0aGFuICgobSAlIDIpICE9IDApCisJCQltLS07CisJCWludCBjdXJyZW50UEMgPSBwY1RvU291cmNlTWFwW21dOworCQlpZiAocGMgPCBjdXJyZW50UEMpIHsKKwkJCWQgPSBtIC0gMjsKKwkJfSBlbHNlCisJCQlpZiAocGMgPiBjdXJyZW50UEMpIHsKKwkJCQlnID0gbSArIDI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwl9CisJaWYgKHBjIDwgcGNUb1NvdXJjZU1hcFttXSkKKwkJcmV0dXJuIG07CisJcmV0dXJuIG0gKyAyOworfQorcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNvcnQoaW50W10gdGFiLCBpbnQgbG8wLCBpbnQgaGkwLCBpbnRbXSByZXN1bHQpIHsKKwlpbnQgbG8gPSBsbzA7CisJaW50IGhpID0gaGkwOworCWludCBtaWQ7CisJaWYgKGhpMCA+IGxvMCkgeworCQkvKiBBcmJpdHJhcmlseSBlc3RhYmxpc2hpbmcgcGFydGl0aW9uIGVsZW1lbnQgYXMgdGhlIG1pZHBvaW50IG9mCisJCSAgKiB0aGUgYXJyYXkuCisJCSAgKi8KKwkJbWlkID0gdGFiW2xvMCArIChoaTAgLSBsbzApIC8gMl07CisJCS8vIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgdW50aWwgaW5kaWNlcyBjcm9zcworCQl3aGlsZSAobG8gPD0gaGkpIHsKKwkJCS8qIGZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKwkJCSAqIHRoZSBwYXJ0aXRpb24gZWxlbWVudCBzdGFydGluZyBmcm9tIHRoZSBsZWZ0IEluZGV4LgorCQkJICovCisJCQl3aGlsZSAoKGxvIDwgaGkwKSAmJiAodGFiW2xvXSA8IG1pZCkpCisJCQkJKytsbzsKKwkJCS8qIGZpbmQgYW4gZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0bworCQkJICogdGhlIHBhcnRpdGlvbiBlbGVtZW50IHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0IEluZGV4LgorCQkJICovCisJCQl3aGlsZSAoKGhpID4gbG8wKSAmJiAodGFiW2hpXSA+IG1pZCkpCisJCQkJLS1oaTsKKwkJCS8vIGlmIHRoZSBpbmRleGVzIGhhdmUgbm90IGNyb3NzZWQsIHN3YXAKKwkJCWlmIChsbyA8PSBoaSkgeworCQkJCXN3YXAodGFiLCBsbywgaGksIHJlc3VsdCk7CisJCQkJKytsbzsKKwkJCQktLWhpOworCQkJfQorCQl9CisJCS8qIElmIHRoZSByaWdodCBpbmRleCBoYXMgbm90IHJlYWNoZWQgdGhlIGxlZnQgc2lkZSBvZiBhcnJheQorCQkgICogbXVzdCBub3cgc29ydCB0aGUgbGVmdCBwYXJ0aXRpb24uCisJCSAgKi8KKwkJaWYgKGxvMCA8IGhpKQorCQkJc29ydCh0YWIsIGxvMCwgaGksIHJlc3VsdCk7CisJCS8qIElmIHRoZSBsZWZ0IGluZGV4IGhhcyBub3QgcmVhY2hlZCB0aGUgcmlnaHQgc2lkZSBvZiBhcnJheQorCQkgICogbXVzdCBub3cgc29ydCB0aGUgcmlnaHQgcGFydGl0aW9uLgorCQkgICovCisJCWlmIChsbyA8IGhpMCkKKwkJCXNvcnQodGFiLCBsbywgaGkwLCByZXN1bHQpOworCX0KK30KKworCitwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHN3YXAoaW50IGFbXSwgaW50IGksIGludCBqLCBpbnQgcmVzdWx0W10pIHsKKwlpbnQgVDsKKwlUID0gYVtpXTsKKwlhW2ldID0gYVtqXTsKKwlhW2pdID0gVDsKKwlUID0gcmVzdWx0W2pdOworCXJlc3VsdFtqXSA9IHJlc3VsdFtpXTsKKwlyZXN1bHRbaV0gPSBUOworfQorCiBwdWJsaWMgdm9pZCBhYWxvYWQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFhbG9hZCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hYWxvYWQ7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hYWxvYWQ7CiB9CisKIHB1YmxpYyB2b2lkIGFhc3RvcmUoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFhc3RvcmUiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDM7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMzsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWFzdG9yZTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Fhc3RvcmU7CiB9CisKIHB1YmxpYyB2b2lkIGFjb25zdF9udWxsKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhY29uc3RfbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KSB7Ci0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkgeworCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hY29uc3RfbnVsbDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Fjb25zdF9udWxsOwogfQorCiBwdWJsaWMgdm9pZCBhZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoU2NvcGUgc2NvcGUsIGludCBpbml0U3RhdGVJbmRleCkgewogCS8vIFJlcXVpcmVkIHRvIGZpeCAxUFIwWFZTOiBMRlJFOldJTk5UIC0gQ29tcGlsZXI6IHZhcmlhYmxlIHRhYmxlIGZvciBtZXRob2QgYXBwZWFycyBpbmNvcnJlY3QKLQlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQorCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUworCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVBfVEFCTEUKKwkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQKSkgPT0gMCkKIAkJcmV0dXJuOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZUxvY2Fsc0NvdW50OyBpKyspIHsKLQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gdmlzaWJsZUxvY2Fsc1tpXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUxvY2Fsc0NvdW50OyBpKyspIHsKKwkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gdGhpcy52aXNpYmxlTG9jYWxzW2ldOwogCQlpZiAobG9jYWxCaW5kaW5nICE9IG51bGwpIHsKIAkJCS8vIENoZWNrIGlmIHRoZSBsb2NhbCBpcyBkZWZpbml0ZWx5IGFzc2lnbmVkCiAJCQlpZiAoaXNEZWZpbml0ZWx5QXNzaWduZWQoc2NvcGUsIGluaXRTdGF0ZUluZGV4LCBsb2NhbEJpbmRpbmcpKSB7CkBAIC0yMjAsMTY3ICsyMzcsMTczIEBACiAJCQkJCSAqIAlmaXJzdCB2YWx1ZSBpcyB0aGUgc3RhcnRQQyBhbmQgc2Vjb25kIHZhbHVlIGlzIHRoZSBlbmRQQy4gLTEgb25lIGZvciB0aGUgbGFzdCB2YWx1ZSBtZWFucyB0aGF0IHRoZSBpbnRlcnZhbAogCQkJCQkgKiAJaXMgbm90IGNsb3NlZCB5ZXQuCiAJCQkJCSAqLwotCQkJCQlsb2NhbEJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKHBvc2l0aW9uKTsKKwkJCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyh0aGlzLnBvc2l0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAl9CiB9Ci1wdWJsaWMgdm9pZCBhZGRMYWJlbChCcmFuY2hMYWJlbCBhTGFiZWwpIHsKLQlpZiAoY291bnRMYWJlbHMgPT0gbGFiZWxzLmxlbmd0aCkKLQkJU3lzdGVtLmFycmF5Y29weShsYWJlbHMsIDAsIGxhYmVscyA9IG5ldyBCcmFuY2hMYWJlbFtjb3VudExhYmVscyArIExBQkVMU19JTkNSRU1FTlRdLCAwLCBjb3VudExhYmVscyk7Ci0JbGFiZWxzW2NvdW50TGFiZWxzKytdID0gYUxhYmVsOwotfQotcHVibGljIHZvaWQgYWRkVmlzaWJsZUxvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nKSB7Ci0JaWYgKCh0aGlzLmdlbmVyYXRlQXR0cmlidXRlcyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9WQVJTIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQKSkgPT0gMCkKLQkJcmV0dXJuOwogCi0JaWYgKHZpc2libGVMb2NhbHNDb3VudCA+PSB2aXNpYmxlTG9jYWxzLmxlbmd0aCkKLQkJU3lzdGVtLmFycmF5Y29weSh2aXNpYmxlTG9jYWxzLCAwLCB2aXNpYmxlTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW3Zpc2libGVMb2NhbHNDb3VudCAqIDJdLCAwLCB2aXNpYmxlTG9jYWxzQ291bnQpOwotCXZpc2libGVMb2NhbHNbdmlzaWJsZUxvY2Fsc0NvdW50KytdID0gbG9jYWxCaW5kaW5nOworcHVibGljIHZvaWQgYWRkTGFiZWwoQnJhbmNoTGFiZWwgYUxhYmVsKSB7CisJaWYgKHRoaXMuY291bnRMYWJlbHMgPT0gdGhpcy5sYWJlbHMubGVuZ3RoKQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubGFiZWxzLCAwLCB0aGlzLmxhYmVscyA9IG5ldyBCcmFuY2hMYWJlbFt0aGlzLmNvdW50TGFiZWxzICsgTEFCRUxTX0lOQ1JFTUVOVF0sIDAsIHRoaXMuY291bnRMYWJlbHMpOworCXRoaXMubGFiZWxzW3RoaXMuY291bnRMYWJlbHMrK10gPSBhTGFiZWw7CiB9CiAKIHB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZykgewogCS8qIGRvIG5vdGhpbmcgKi8KIH0KKworcHVibGljIHZvaWQgYWRkVmlzaWJsZUxvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nKSB7CisJaWYgKCh0aGlzLmdlbmVyYXRlQXR0cmlidXRlcyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9WQVJTCisJCQl8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRQorCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAodGhpcy52aXNpYmxlTG9jYWxzQ291bnQgPj0gdGhpcy52aXNpYmxlTG9jYWxzLmxlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnZpc2libGVMb2NhbHMsIDAsIHRoaXMudmlzaWJsZUxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1t0aGlzLnZpc2libGVMb2NhbHNDb3VudCAqIDJdLCAwLCB0aGlzLnZpc2libGVMb2NhbHNDb3VudCk7CisJdGhpcy52aXNpYmxlTG9jYWxzW3RoaXMudmlzaWJsZUxvY2Fsc0NvdW50KytdID0gbG9jYWxCaW5kaW5nOworfQorCiBwdWJsaWMgdm9pZCBhbG9hZChpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhbG9hZDoiK2lBcmcpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8PSBpQXJnKSB7Ci0JCW1heExvY2FscyA9IGlBcmcgKyAxOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLm1heExvY2FscyA8PSBpQXJnKSB7CisJCXRoaXMubWF4TG9jYWxzID0gaUFyZyArIDE7CiAJfQogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hbG9hZDsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Fsb2FkOwogCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CiAJfSBlbHNlIHsKIAkJLy8gRG9uJ3QgbmVlZCB0byB1c2UgdGhlIHdpZGUgYnl0ZWNvZGUKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Fsb2FkOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWxvYWQ7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGFsb2FkXzAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFsb2FkXzAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkgewotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpIHsKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKIAl9Ci0JaWYgKG1heExvY2FscyA9PSAwKSB7Ci0JCW1heExvY2FscyA9IDE7CisJaWYgKHRoaXMubWF4TG9jYWxzID09IDApIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAxOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hbG9hZF8wOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWxvYWRfMDsKIH0KKwogcHVibGljIHZvaWQgYWxvYWRfMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0YWxvYWRfMSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8PSAxKSB7Ci0JCW1heExvY2FscyA9IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDEpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAyOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hbG9hZF8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWxvYWRfMTsKIH0KKwogcHVibGljIHZvaWQgYWxvYWRfMigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0YWxvYWRfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8PSAyKSB7Ci0JCW1heExvY2FscyA9IDM7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDIpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAzOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hbG9hZF8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWxvYWRfMjsKIH0KKwogcHVibGljIHZvaWQgYWxvYWRfMygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0YWxvYWRfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8PSAzKSB7Ci0JCW1heExvY2FscyA9IDQ7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDMpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA0OwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hbG9hZF8zOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYWxvYWRfMzsKIH0KKwogcHVibGljIHZvaWQgYW5ld2FycmF5KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFuZXdhcnJheTogIiArIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2FuZXdhcnJheTsKLQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUodHlwZUJpbmRpbmcpKTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2FuZXdhcnJheTsKKwl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSh0eXBlQmluZGluZykpOwogfQorCiBwdWJsaWMgdm9pZCBhcmV0dXJuKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhcmV0dXJuIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCS8vIHRoZSBzdGFja0RlcHRoIHNob3VsZCBiZSBlcXVhbCB0byAwIAotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXJldHVybjsKLQl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsJCQorCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXJldHVybjsKKwl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsKIH0KKwogcHVibGljIHZvaWQgYXJyYXlBdChpbnQgdHlwZUJpbmRpbmdJRCkgewogCXN3aXRjaCAodHlwZUJpbmRpbmdJRCkgewogCQljYXNlIFR5cGVJZHMuVF9pbnQgOgotCQkJdGhpcy5pYWxvYWQoKTsKKwkJCWlhbG9hZCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgogCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKLQkJCXRoaXMuYmFsb2FkKCk7CisJCQliYWxvYWQoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6Ci0JCQl0aGlzLnNhbG9hZCgpOworCQkJc2Fsb2FkKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0JCQl0aGlzLmNhbG9hZCgpOworCQkJY2Fsb2FkKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0JCQl0aGlzLmxhbG9hZCgpOworCQkJbGFsb2FkKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotCQkJdGhpcy5mYWxvYWQoKTsKKwkJCWZhbG9hZCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0JCQl0aGlzLmRhbG9hZCgpOworCQkJZGFsb2FkKCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6Ci0JCQl0aGlzLmFhbG9hZCgpOworCQkJYWFsb2FkKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBhcnJheUF0UHV0KGludCBlbGVtZW50VHlwZUlELCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlzd2l0Y2ggKGVsZW1lbnRUeXBlSUQpIHsKIAkJY2FzZSBUeXBlSWRzLlRfaW50IDoKQEAgLTQyNSwxNTggKzQ0OCwxNTkgQEAKIAkJCWFhc3RvcmUoKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGFycmF5bGVuZ3RoKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhcnJheWxlbmd0aCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2FycmF5bGVuZ3RoOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXJyYXlsZW5ndGg7CiB9CisKIHB1YmxpYyB2b2lkIGFzdG9yZShpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhc3RvcmU6IitpQXJnKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA8PSBpQXJnKSB7Ci0JCW1heExvY2FscyA9IGlBcmcgKyAxOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA8PSBpQXJnKSB7CisJCXRoaXMubWF4TG9jYWxzID0gaUFyZyArIDE7CiAJfQogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbis9MjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlOworCQl0aGlzLnBvc2l0aW9uKz0yOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2FzdG9yZTsKIAkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAxID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAxID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbis9MjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbis9MjsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2FzdG9yZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOwogCX0KIH0KKwogcHVibGljIHZvaWQgYXN0b3JlXzAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFzdG9yZV8wIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChtYXhMb2NhbHMgPT0gMCkgewotCQltYXhMb2NhbHMgPSAxOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA9PSAwKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMTsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlXzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hc3RvcmVfMDsKIH0KKwogcHVibGljIHZvaWQgYXN0b3JlXzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFzdG9yZV8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChtYXhMb2NhbHMgPD0gMSkgewotCQltYXhMb2NhbHMgPSAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA8PSAxKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMjsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlXzE7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hc3RvcmVfMTsKIH0KKwogcHVibGljIHZvaWQgYXN0b3JlXzIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFzdG9yZV8yIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChtYXhMb2NhbHMgPD0gMikgewotCQltYXhMb2NhbHMgPSAzOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA8PSAyKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMzsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlXzI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hc3RvcmVfMjsKIH0KKwogcHVibGljIHZvaWQgYXN0b3JlXzMoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGFzdG9yZV8zIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChtYXhMb2NhbHMgPD0gMykgewotCQltYXhMb2NhbHMgPSA0OworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA8PSAzKSB7CisJCXRoaXMubWF4TG9jYWxzID0gNDsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXN0b3JlXzM7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hc3RvcmVfMzsKIH0KKwogcHVibGljIHZvaWQgYXRocm93KCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRhdGhyb3ciKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYXRocm93OwotCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwkJCisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19hdGhyb3c7CisJdGhpcy5sYXN0QWJydXB0Q29tcGxldGlvbiA9IHRoaXMucG9zaXRpb247CiB9CisKIHB1YmxpYyB2b2lkIGJhbG9hZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0YmFsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2JhbG9hZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2JhbG9hZDsKIH0KKwogcHVibGljIHZvaWQgYmFzdG9yZSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0YmFzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMzsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAzOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19iYXN0b3JlOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYmFzdG9yZTsKIH0KKwogcHVibGljIHZvaWQgYmlwdXNoKGJ5dGUgYikgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRiaXB1c2ggIitiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAxID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uICs9IDI7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfYmlwdXNoOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IGI7CisJdGhpcy5wb3NpdGlvbiArPSAyOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19iaXB1c2g7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IGI7CiB9CisKIHB1YmxpYyB2b2lkIGNhbG9hZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Y2Fsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2NhbG9hZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2NhbG9hZDsKIH0KKwogcHVibGljIHZvaWQgY2FzdG9yZSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Y2FzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMzsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAzOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19jYXN0b3JlOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfY2FzdG9yZTsKIH0KKwogcHVibGljIHZvaWQgY2hlY2tjYXN0KGludCBiYXNlSWQpIHsKIAl0aGlzLmNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KIAl0aGlzLnBvc2l0aW9uKys7CkBAIC02MDcsNDI2ICs2MzEsNDI5IEBACiAJCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSkpOwogCX0KIH0KKwogcHVibGljIHZvaWQgY2hlY2tjYXN0KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGNoZWNrY2FzdDoiK3R5cGVCaW5kaW5nLmRlYnVnTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2NoZWNrY2FzdDsKLQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUodHlwZUJpbmRpbmcpKTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2NoZWNrY2FzdDsKKwl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSh0eXBlQmluZGluZykpOwogfQorCiBwdWJsaWMgdm9pZCBkMmYoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGQyZiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kMmY7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kMmY7CiB9CisKIHB1YmxpYyB2b2lkIGQyaSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZDJpIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2QyaTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2QyaTsKIH0KKwogcHVibGljIHZvaWQgZDJsKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkMmwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kMmw7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kMmw7CiB9CisKIHB1YmxpYyB2b2lkIGRhZGQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRhZGQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGFkZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RhZGQ7CiB9CisKIHB1YmxpYyB2b2lkIGRhbG9hZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZGFsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGFsb2FkOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGFsb2FkOwogfQorCiBwdWJsaWMgdm9pZCBkYXN0b3JlKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkYXN0b3JlIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSA0OwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDQ7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rhc3RvcmU7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kYXN0b3JlOwogfQorCiBwdWJsaWMgdm9pZCBkY21wZygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZGNtcGciKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDM7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMzsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGNtcGc7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kY21wZzsKIH0KKwogcHVibGljIHZvaWQgZGNtcGwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRjbXBsIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAzOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDM7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RjbXBsOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGNtcGw7CiB9CisKIHB1YmxpYyB2b2lkIGRjb25zdF8wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkY29uc3RfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggKz0gMjsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGNvbnN0XzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kY29uc3RfMDsKIH0KKwogcHVibGljIHZvaWQgZGNvbnN0XzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRjb25zdF8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kY29uc3RfMTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rjb25zdF8xOwogfQorCiBwdWJsaWMgdm9pZCBkZGl2KCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkZGl2Iik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RkaXY7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kZGl2OwogfQorCiBwdWJsaWMgdm9pZCBkZWNyU3RhY2tTaXplKGludCBvZmZzZXQpIHsKLQlzdGFja0RlcHRoIC09IG9mZnNldDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gb2Zmc2V0OwogfQorCiBwdWJsaWMgdm9pZCBkbG9hZChpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkbG9hZDoiK2lBcmcpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8IGlBcmcgKyAyKSB7Ci0JCW1heExvY2FscyA9IGlBcmcgKyAyOyAvLyArIDIgYmVjYXVzZSBpdCBpcyBhIGRvdWJsZQorCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLm1heExvY2FscyA8IGlBcmcgKyAyKSB7CisJCXRoaXMubWF4TG9jYWxzID0gaUFyZyArIDI7IC8vICsgMiBiZWNhdXNlIGl0IGlzIGEgZG91YmxlCiAJfQogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kbG9hZDsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rsb2FkOwogCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CiAJfSBlbHNlIHsKIAkJLy8gRG9uJ3QgbmVlZCB0byB1c2UgdGhlIHdpZGUgYnl0ZWNvZGUKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rsb2FkOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGxvYWQ7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGRsb2FkXzAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRsb2FkXzAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoICs9IDI7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChtYXhMb2NhbHMgPCAyKSB7Ci0JCW1heExvY2FscyA9IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoICs9IDI7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMubWF4TG9jYWxzIDwgMikgeworCQl0aGlzLm1heExvY2FscyA9IDI7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rsb2FkXzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kbG9hZF8wOwogfQorCiBwdWJsaWMgdm9pZCBkbG9hZF8xKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkbG9hZF8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAobWF4TG9jYWxzIDwgMykgewotCQltYXhMb2NhbHMgPSAzOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLm1heExvY2FscyA8IDMpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAzOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kbG9hZF8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGxvYWRfMTsKIH0KKwogcHVibGljIHZvaWQgZGxvYWRfMigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZGxvYWRfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKG1heExvY2FscyA8IDQpIHsKLQkJbWF4TG9jYWxzID0gNDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggKz0gMjsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPCA0KSB7CisJCXRoaXMubWF4TG9jYWxzID0gNDsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZGxvYWRfMjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rsb2FkXzI7CiB9CisKIHB1YmxpYyB2b2lkIGRsb2FkXzMoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRsb2FkXzMiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoICs9IDI7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChtYXhMb2NhbHMgPCA1KSB7Ci0JCW1heExvY2FscyA9IDU7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoICs9IDI7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMubWF4TG9jYWxzIDwgNSkgeworCQl0aGlzLm1heExvY2FscyA9IDU7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Rsb2FkXzM7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kbG9hZF8zOwogfQorCiBwdWJsaWMgdm9pZCBkbXVsKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkbXVsIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RtdWw7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kbXVsOwogfQorCiBwdWJsaWMgdm9pZCBkbmVnKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkbmVnIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZG5lZzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RuZWc7CiB9CisKIHB1YmxpYyB2b2lkIGRyZW0oKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRyZW0iKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHJlbTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RyZW07CiB9CisKIHB1YmxpYyB2b2lkIGRyZXR1cm4oKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRyZXR1cm4iKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAgCi0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMAorCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kcmV0dXJuOwotCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwkJCisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kcmV0dXJuOworCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwogfQorCiBwdWJsaWMgdm9pZCBkc3RvcmUoaW50IGlBcmcpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZHN0b3JlOiIraUFyZyk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChtYXhMb2NhbHMgPD0gaUFyZyArIDEpIHsKLQkJbWF4TG9jYWxzID0gaUFyZyArIDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IGlBcmcgKyAxKSB7CisJCXRoaXMubWF4TG9jYWxzID0gaUFyZyArIDI7CiAJfQogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3RvcmU7CisJCXRoaXMucG9zaXRpb24gKz0gMjsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3RvcmU7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN0b3JlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN0b3JlOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGlBcmc7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBkc3RvcmVfMCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZHN0b3JlXzAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKG1heExvY2FscyA8IDIpIHsKLQkJbWF4TG9jYWxzID0gMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPCAyKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMjsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN0b3JlXzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3RvcmVfMDsKIH0KKwogcHVibGljIHZvaWQgZHN0b3JlXzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGRzdG9yZV8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChtYXhMb2NhbHMgPCAzKSB7Ci0JCW1heExvY2FscyA9IDM7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMubWF4TG9jYWxzIDwgMykgeworCQl0aGlzLm1heExvY2FscyA9IDM7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RzdG9yZV8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN0b3JlXzE7CiB9CisKIHB1YmxpYyB2b2lkIGRzdG9yZV8yKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkc3RvcmVfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAobWF4TG9jYWxzIDwgNCkgewotCQltYXhMb2NhbHMgPSA0OworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8IDQpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA0OwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3RvcmVfMjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2RzdG9yZV8yOwogfQorCiBwdWJsaWMgdm9pZCBkc3RvcmVfMygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZHN0b3JlXzMiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKG1heExvY2FscyA8IDUpIHsKLQkJbWF4TG9jYWxzID0gNTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPCA1KSB7CisJCXRoaXMubWF4TG9jYWxzID0gNTsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN0b3JlXzM7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3RvcmVfMzsKIH0KKwogcHVibGljIHZvaWQgZHN1YigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZHN1YiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kc3ViOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHN1YjsKIH0KKwogcHVibGljIHZvaWQgZHVwKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkdXAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkgewotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpIHsKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwOwogfQorCiBwdWJsaWMgdm9pZCBkdXBfeDEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGR1cF94MSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwX3gxOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwX3gxOwogfQorCiBwdWJsaWMgdm9pZCBkdXBfeDIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGR1cF94MiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwX3gyOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwX3gyOwogfQorCiBwdWJsaWMgdm9pZCBkdXAyKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRkdXAyIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kdXAyOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwMjsKIH0KKwogcHVibGljIHZvaWQgZHVwMl94MSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZHVwMl94MSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggKz0gMjsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZHVwMl94MTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2R1cDJfeDE7CiB9CisKIHB1YmxpYyB2b2lkIGR1cDJfeDIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGR1cDJfeDIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoICs9IDI7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoICs9IDI7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2R1cDJfeDI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19kdXAyX3gyOwogfQorCiBwdWJsaWMgdm9pZCBleGl0VXNlclNjb3BlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CiAJLy8gbWFyayBhbGwgdGhlIHNjb3BlJ3MgbG9jYWxzIGFzIGxvc2luZyB0aGVpciBkZWZpbml0ZSBhc3NpZ25tZW50Ci0KLQlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQorCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUworCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVBfVEFCTEUKKwkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQKSkgPT0gMCkKIAkJcmV0dXJuOwogCWludCBpbmRleCA9IHRoaXMudmlzaWJsZUxvY2Fsc0NvdW50IC0gMTsKIAl3aGlsZSAoaW5kZXggPj0gMCkgewotCQlMb2NhbFZhcmlhYmxlQmluZGluZyB2aXNpYmxlTG9jYWwgPSB2aXNpYmxlTG9jYWxzW2luZGV4XTsKKwkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdmlzaWJsZUxvY2FsID0gdGhpcy52aXNpYmxlTG9jYWxzW2luZGV4XTsKIAkJaWYgKHZpc2libGVMb2NhbCA9PSBudWxsIHx8IHZpc2libGVMb2NhbC5kZWNsYXJpbmdTY29wZSAhPSBjdXJyZW50U2NvcGUpIHsKIAkJCS8vIGxlZnQgY3VycmVudFNjb3BlCiAJCQlpbmRleC0tOwpAQCAtMTAzNSwxOCArMTA2MiwyMSBAQAogCiAJCS8vIHRoZXJlIG1heSBiZSBzb21lIHByZXNlcnZlZCBsb2NhbHMgbmV2ZXIgaW5pdGlhbGl6ZWQKIAkJaWYgKHZpc2libGVMb2NhbC5pbml0aWFsaXphdGlvbkNvdW50ID4gMCkgewotCQkJdmlzaWJsZUxvY2FsLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEMocG9zaXRpb24pOworCQkJdmlzaWJsZUxvY2FsLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEModGhpcy5wb3NpdGlvbik7CiAJCX0KLQkJdmlzaWJsZUxvY2Fsc1tpbmRleC0tXSA9IG51bGw7IC8vIHRoaXMgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIHZpc2libGUgYWZ0ZXJ3YXJkcworCQl0aGlzLnZpc2libGVMb2NhbHNbaW5kZXgtLV0gPSBudWxsOyAvLyB0aGlzIHZhcmlhYmxlIGlzIG5vIGxvbmdlciB2aXNpYmxlIGFmdGVyd2FyZHMKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGV4aXRVc2VyU2NvcGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIExvY2FsVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcpIHsKIAkvLyBtYXJrIGFsbCB0aGUgc2NvcGUncyBsb2NhbHMgYXMgbG9zaW5nIHRoZWlyIGRlZmluaXRlIGFzc2lnbm1lbnQKLQlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQorCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUworCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVBfVEFCTEUKKwkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQKSkgPT0gMCkKIAkJcmV0dXJuOwogCWludCBpbmRleCA9IHRoaXMudmlzaWJsZUxvY2Fsc0NvdW50IC0gMTsKIAl3aGlsZSAoaW5kZXggPj0gMCkgewotCQlMb2NhbFZhcmlhYmxlQmluZGluZyB2aXNpYmxlTG9jYWwgPSB2aXNpYmxlTG9jYWxzW2luZGV4XTsKKwkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdmlzaWJsZUxvY2FsID0gdGhpcy52aXNpYmxlTG9jYWxzW2luZGV4XTsKIAkJaWYgKHZpc2libGVMb2NhbCA9PSBudWxsIHx8IHZpc2libGVMb2NhbC5kZWNsYXJpbmdTY29wZSAhPSBjdXJyZW50U2NvcGUgfHwgdmlzaWJsZUxvY2FsID09IGJpbmRpbmcpIHsKIAkJCS8vIGxlZnQgY3VycmVudFNjb3BlCiAJCQlpbmRleC0tOwpAQCAtMTA1NCw0NTQgKzEwODQsNTA1IEBACiAJCX0KIAkJLy8gdGhlcmUgbWF5IGJlIHNvbWUgcHJlc2VydmVkIGxvY2FscyBuZXZlciBpbml0aWFsaXplZAogCQlpZiAodmlzaWJsZUxvY2FsLmluaXRpYWxpemF0aW9uQ291bnQgPiAwKSB7Ci0JCQl2aXNpYmxlTG9jYWwucmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyhwb3NpdGlvbik7CisJCQl2aXNpYmxlTG9jYWwucmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyh0aGlzLnBvc2l0aW9uKTsKIAkJfQotCQl2aXNpYmxlTG9jYWxzW2luZGV4LS1dID0gbnVsbDsgLy8gdGhpcyB2YXJpYWJsZSBpcyBubyBsb25nZXIgdmlzaWJsZSBhZnRlcndhcmRzCisJCXRoaXMudmlzaWJsZUxvY2Fsc1tpbmRleC0tXSA9IG51bGw7IC8vIHRoaXMgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIHZpc2libGUgYWZ0ZXJ3YXJkcwogCX0KIH0KKwogcHVibGljIHZvaWQgZjJkKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmMmQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2YyZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2YyZDsKIH0KKwogcHVibGljIHZvaWQgZjJpKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmMmkiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mMmk7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mMmk7CiB9CisKIHB1YmxpYyB2b2lkIGYybCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZjJsIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mMmw7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mMmw7CiB9CisKIHB1YmxpYyB2b2lkIGZhZGQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZhZGQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmFkZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZhZGQ7CiB9CisKIHB1YmxpYyB2b2lkIGZhbG9hZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmFsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZhbG9hZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZhbG9hZDsKIH0KKwogcHVibGljIHZvaWQgZmFzdG9yZSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmFsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAzOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDM7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Zhc3RvcmU7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mYXN0b3JlOwogfQorCiBwdWJsaWMgdm9pZCBmY21wZygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmNtcGciKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmNtcGc7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mY21wZzsKIH0KKwogcHVibGljIHZvaWQgZmNtcGwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZjbXBsIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZjbXBsOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmNtcGw7CiB9CisKIHB1YmxpYyB2b2lkIGZjb25zdF8wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmY29uc3RfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmNvbnN0XzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mY29uc3RfMDsKIH0KKwogcHVibGljIHZvaWQgZmNvbnN0XzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZjb25zdF8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mY29uc3RfMTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Zjb25zdF8xOwogfQorCiBwdWJsaWMgdm9pZCBmY29uc3RfMigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmNvbnN0XzIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Zjb25zdF8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmNvbnN0XzI7CiB9CisKIHB1YmxpYyB2b2lkIGZkaXYoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZkaXYiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmRpdjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZkaXY7CiB9CisKK3B1YmxpYyB2b2lkIGZpZWxkQWNjZXNzKGJ5dGUgb3Bjb2RlLCBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSBkZWNsYXJpbmdDbGFzcyA9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwlpZiAoKGRlY2xhcmluZ0NsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApIHsKKwkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKHRoaXMuY2xhc3NGaWxlLCBkZWNsYXJpbmdDbGFzcyk7CisJfQorCVR5cGVCaW5kaW5nIHJldHVyblR5cGUgPSBmaWVsZEJpbmRpbmcudHlwZTsKKwlpbnQgcmV0dXJuVHlwZVNpemU7CisJc3dpdGNoIChyZXR1cm5UeXBlLmlkKSB7CisJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJcmV0dXJuVHlwZVNpemUgPSAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJcmV0dXJuVHlwZVNpemUgPSAxOworCQkJYnJlYWs7CisJfQorCXRoaXMuZmllbGRBY2Nlc3Mob3Bjb2RlLCByZXR1cm5UeXBlU2l6ZSwgZGVjbGFyaW5nQ2xhc3MuY29uc3RhbnRQb29sTmFtZSgpLCBmaWVsZEJpbmRpbmcubmFtZSwgcmV0dXJuVHlwZS5zaWduYXR1cmUoKSk7Cit9CisKK3ByaXZhdGUgdm9pZCBmaWVsZEFjY2VzcyhieXRlIG9wY29kZSwgaW50IHJldHVyblR5cGVTaXplLCBjaGFyW10gZGVjbGFyaW5nQ2xhc3MsIGNoYXJbXSBmaWVsZE5hbWUsIGNoYXJbXSBzaWduYXR1cmUpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlzd2l0Y2gob3Bjb2RlKSB7CisJCWNhc2UgT3Bjb2Rlcy5PUENfZ2V0ZmllbGQgOgorCQkJaWYgKHJldHVyblR5cGVTaXplID09IDIpIHsKKwkJCQl0aGlzLnN0YWNrRGVwdGgrKzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wY29kZXMuT1BDX2dldHN0YXRpYyA6CisJCQlpZiAocmV0dXJuVHlwZVNpemUgPT0gMikgeworCQkJCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnN0YWNrRGVwdGgrKzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wY29kZXMuT1BDX3B1dGZpZWxkIDoKKwkJCWlmIChyZXR1cm5UeXBlU2l6ZSA9PSAyKSB7CisJCQkJdGhpcy5zdGFja0RlcHRoIC09IDM7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT3Bjb2Rlcy5PUENfcHV0c3RhdGljIDoKKwkJCWlmIChyZXR1cm5UeXBlU2l6ZSA9PSAyKSB7CisJCQkJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuc3RhY2tEZXB0aC0tOworCQkJfQorCX0KKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkgeworCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCX0KKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgpOworCX0KKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IG9wY29kZTsKKwl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yRmllbGQoZGVjbGFyaW5nQ2xhc3MsIGZpZWxkTmFtZSwgc2lnbmF0dXJlKSk7Cit9CisKIHB1YmxpYyB2b2lkIGZsb2FkKGludCBpQXJnKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZsb2FkOiIraUFyZyk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChtYXhMb2NhbHMgPD0gaUFyZykgewotCQltYXhMb2NhbHMgPSBpQXJnICsgMTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gaUFyZykgeworCQl0aGlzLm1heExvY2FscyA9IGlBcmcgKyAxOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CiAJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2Zsb2FkOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWQ7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWQ7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbG9hZDsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOwogCX0KIH0KKwogcHVibGljIHZvaWQgZmxvYWRfMCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmxvYWRfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAobWF4TG9jYWxzID09IDApIHsKLQkJbWF4TG9jYWxzID0gMTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPT0gMCkgeworCQl0aGlzLm1heExvY2FscyA9IDE7CiAJfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbG9hZF8wOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWRfMDsKIH0KKwogcHVibGljIHZvaWQgZmxvYWRfMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmxvYWRfMSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAobWF4TG9jYWxzIDw9IDEpIHsKLQkJbWF4TG9jYWxzID0gMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMSkgeworCQl0aGlzLm1heExvY2FscyA9IDI7CiAJfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbG9hZF8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWRfMTsKIH0KKwogcHVibGljIHZvaWQgZmxvYWRfMigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmxvYWRfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAobWF4TG9jYWxzIDw9IDIpIHsKLQkJbWF4TG9jYWxzID0gMzsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMikgeworCQl0aGlzLm1heExvY2FscyA9IDM7CiAJfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbG9hZF8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWRfMjsKIH0KKwogcHVibGljIHZvaWQgZmxvYWRfMygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0ZmxvYWRfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAobWF4TG9jYWxzIDw9IDMpIHsKLQkJbWF4TG9jYWxzID0gNDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMykgeworCQl0aGlzLm1heExvY2FscyA9IDQ7CiAJfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbG9hZF8zOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZmxvYWRfMzsKIH0KKwogcHVibGljIHZvaWQgZm11bCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Zm11bCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbXVsOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZm11bDsKIH0KKwogcHVibGljIHZvaWQgZm5lZygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Zm5lZyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZuZWc7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mbmVnOwogfQorCiBwdWJsaWMgdm9pZCBmcmVtKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmcmVtIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZyZW07CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mcmVtOwogfQorCiBwdWJsaWMgdm9pZCBmcmV0dXJuKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmcmV0dXJuIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCS8vIHRoZSBzdGFja0RlcHRoIHNob3VsZCBiZSBlcXVhbCB0byAwIAotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnJldHVybjsKLQl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsJCQorCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnJldHVybjsKKwl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsKIH0KKwogcHVibGljIHZvaWQgZnN0b3JlKGludCBpQXJnKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZzdG9yZToiK2lBcmcpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAobWF4TG9jYWxzIDw9IGlBcmcpIHsKLQkJbWF4TG9jYWxzID0gaUFyZyArIDE7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IGlBcmcpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSBpQXJnICsgMTsKIAl9CiAJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZTsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZTsKIAkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAxID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAxID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mc3RvcmU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19mc3RvcmU7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGZzdG9yZV8wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmc3RvcmVfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAobWF4TG9jYWxzID09IDApIHsKLQkJbWF4TG9jYWxzID0gMTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPT0gMCkgeworCQl0aGlzLm1heExvY2FscyA9IDE7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZV8wOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnN0b3JlXzA7CiB9CisKIHB1YmxpYyB2b2lkIGZzdG9yZV8xKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmc3RvcmVfMSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAobWF4TG9jYWxzIDw9IDEpIHsKLQkJbWF4TG9jYWxzID0gMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMSkgeworCQl0aGlzLm1heExvY2FscyA9IDI7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZV8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnN0b3JlXzE7CiB9CisKIHB1YmxpYyB2b2lkIGZzdG9yZV8yKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmc3RvcmVfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAobWF4TG9jYWxzIDw9IDIpIHsKLQkJbWF4TG9jYWxzID0gMzsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMikgeworCQl0aGlzLm1heExvY2FscyA9IDM7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZV8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnN0b3JlXzI7CiB9CisKIHB1YmxpYyB2b2lkIGZzdG9yZV8zKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRmc3RvcmVfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAobWF4TG9jYWxzIDw9IDMpIHsKLQkJbWF4TG9jYWxzID0gNDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gMykgeworCQl0aGlzLm1heExvY2FscyA9IDQ7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdG9yZV8zOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnN0b3JlXzM7CiB9CiAKIHB1YmxpYyB2b2lkIGZzdWIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGZzdWIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfZnN1YjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ZzdWI7CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlQm94aW5nQ29udmVyc2lvbihpbnQgdW5ib3hlZFR5cGVJRCkgewogICAgIHN3aXRjaCAodW5ib3hlZFR5cGVJRCkgewogICAgICAgICBjYXNlIFR5cGVJZHMuVF9ieXRlIDoKICAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLSAgICAJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljIGphdmEubGFuZy5CeXRlLnZhbHVlT2YoYnl0ZSkiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgLy8gaW52b2tlc3RhdGljOiBCeXRlLnZhbHVlT2YoYnl0ZSkKLSAgICAgICAgICAgICAgICB0aGlzLmludm9rZSgKKyAgICAgICAgICAgICAgICBpbnZva2UoCiAgICAgICAgICAgICAgICAgICAgIE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgMSwgLy8gYXJnQ291bnQKKyAgICAgICAgICAgICAgICAgICAgMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogICAgICAgICAgICAgICAgICAgICAxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5KYXZhTGFuZ0J5dGVDb25zdGFudFBvb2xOYW1lLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuVmFsdWVPZiwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLmJ5dGVCeXRlU2lnbmF0dXJlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBuZXcgQnl0ZSggYnl0ZSApCi0gICAgCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXNwZWNpYWwgamF2YS5sYW5nLkJ5dGUoYnl0ZSkiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIG5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gxKCk7CiAgICAgICAgICAgICAgICAgc3dhcCgpOwotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwKLSAgICAgICAgICAgICAgICAgICAgMSwgLy8gYXJnQ291bnQKKyAgICAgICAgICAgICAgICAgICAgMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogICAgICAgICAgICAgICAgICAgICAwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5KYXZhTGFuZ0J5dGVDb25zdGFudFBvb2xOYW1lLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSW5pdCwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkJ5dGVDb25zdHJTaWduYXR1cmUpOwotICAgICAgICAgICAgfSAgICAgICAKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAgICAgICAgICAgICBpZiAoIHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSApIHsKICAgICAgICAgICAgICAgICAvLyBpbnZva2VzdGF0aWM6IFNob3J0LnZhbHVlT2Yoc2hvcnQpCi0gICAgCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXN0YXRpYyBqYXZhLmxhbmcuU2hvcnQudmFsdWVPZihzaG9ydCkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAxLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuVmFsdWVPZiwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLnNob3J0U2hvcnRTaWduYXR1cmUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBuZXcgU2hvcnQoc2hvcnQpCi0gICAgICAgICAgICAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXNwZWNpYWwgamF2YS5sYW5nLlNob3J0KHNob3J0KSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAJbmV3V3JhcHBlckZvcih1bmJveGVkVHlwZUlEKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJbmV3V3JhcHBlckZvcih1bmJveGVkVHlwZUlEKTsKICAgICAgICAgICAgICAgICBkdXBfeDEoKTsKLSAgICAgICAgICAgICAgICBzd2FwKCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIHN3YXAoKTsKKyAgICAgICAgICAgICAgICBpbnZva2UoCiAgICAgICAgICAgICAgICAgICAgIE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsCi0gICAgICAgICAgICAgICAgICAgIDEsIC8vIGFyZ0NvdW50CisgICAgICAgICAgICAgICAgICAgIDIsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKICAgICAgICAgICAgICAgICAgICAgMCwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSmF2YUxhbmdTaG9ydENvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5Jbml0LAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuU2hvcnRDb25zdHJTaWduYXR1cmUpOyAgICAgCisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5TaG9ydENvbnN0clNpZ25hdHVyZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAgICAgICAgICAgICBpZiAoIHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSApIHsKICAgICAgICAgICAgICAgICAvLyBpbnZva2VzdGF0aWM6IENoYXJhY3Rlci52YWx1ZU9mKGNoYXIpCi0gICAgICAgICAgICAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXN0YXRpYyBqYXZhLmxhbmcuQ2hhcmFjdGVyLnZhbHVlT2YoY2hhcikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAxLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLlZhbHVlT2YsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5jaGFyQ2hhcmFjdGVyU2lnbmF0dXJlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gbmV3IENoYXIoIGNoYXIgKQotICAgICAgICAgICAgCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsIGphdmEubGFuZy5DaGFyYWN0ZXIoY2hhcikiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIG5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gxKCk7CiAgICAgICAgICAgICAgICAgc3dhcCgpOwotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwKLSAgICAgICAgICAgICAgICAgICAgMSwgLy8gYXJnQ291bnQKKyAgICAgICAgICAgICAgICAgICAgMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogICAgICAgICAgICAgICAgICAgICAwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5KYXZhTGFuZ0NoYXJhY3RlckNvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5Jbml0LAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuQ2hhckNvbnN0clNpZ25hdHVyZSk7Ci0gICAgICAgICAgICB9ICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2ludCA6ICAgICAgICAgICAgIAorICAgICAgICBjYXNlIFR5cGVJZHMuVF9pbnQgOgogICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogICAgICAgICAgICAgICAgIC8vIGludm9rZXN0YXRpYzogSW50ZWdlci52YWx1ZU9mKGludCkKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2YoaW50KSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgIDEsIC8vIGFyZ0NvdW50CisgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSmF2YUxhbmdJbnRlZ2VyQ29uc3RhbnRQb29sTmFtZSwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLlZhbHVlT2YsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5JbnRJbnRlZ2VyU2lnbmF0dXJlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gbmV3IEludGVnZXIoaW50KQotICAgICAgICAgICAgCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsIGphdmEubGFuZy5JbnRlZ2VyKGludCkiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIG5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gxKCk7Ci0gICAgICAgICAgICAgICAgc3dhcCgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmludm9rZSgKKyAgICAgICAgICAgICAgICBzd2FwKCk7CisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotICAgICAgICAgICAgICAgICAgICAxLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAyLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5Jbml0LApAQCAtMTUwOSwxMDcgKzE1OTAsOTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsgCisgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAgICAgICAgICAgICAgICAgLy8gaW52b2tlc3RhdGljOiBMb25nLnZhbHVlT2YobG9uZykKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljIGphdmEubGFuZy5Mb25nLnZhbHVlT2YobG9uZykiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlKAorICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAyLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAyLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5WYWx1ZU9mLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wubG9uZ0xvbmdTaWduYXR1cmUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBuZXcgTG9uZyggbG9uZyApCi0gICAgICAgICAgICAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXNwZWNpYWwgamF2YS5sYW5nLkxvbmcobG9uZykiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIG5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gyKCk7CiAgICAgICAgICAgICAgICAgZHVwX3gyKCk7CiAgICAgICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotICAgICAgICAgICAgICAgICAgICAyLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAzLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5Jbml0LAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuTG9uZ0NvbnN0clNpZ25hdHVyZSk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKICAgICAgICAgICAgIGlmICggdGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICkgewogICAgICAgICAgICAgICAgIC8vIGludm9rZXN0YXRpYzogRmxvYXQudmFsdWVPZihmbG9hdCkKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljIGphdmEubGFuZy5GbG9hdC52YWx1ZU9mKGZsb2F0KSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgIDEsIC8vIGFyZ0NvdW50CisgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSmF2YUxhbmdGbG9hdENvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5WYWx1ZU9mLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuZmxvYXRGbG9hdFNpZ25hdHVyZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG5ldyBGbG9hdChmbG9hdCkKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3BlY2lhbCBqYXZhLmxhbmcuRmxvYXQoZmxvYXQpIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICBuZXdXcmFwcGVyRm9yKHVuYm94ZWRUeXBlSUQpOwogICAgICAgICAgICAgICAgIGR1cF94MSgpOwotICAgICAgICAgICAgICAgIHN3YXAoKTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisgICAgICAgICAgICAgICAgc3dhcCgpOworICAgICAgICAgICAgICAgIGludm9rZSgKICAgICAgICAgICAgICAgICAgICAgT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwKLSAgICAgICAgICAgICAgICAgICAgMSwgLy8gYXJnQ291bnQKKyAgICAgICAgICAgICAgICAgICAgMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogICAgICAgICAgICAgICAgICAgICAwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5KYXZhTGFuZ0Zsb2F0Q29uc3RhbnRQb29sTmFtZSwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkluaXQsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5GbG9hdENvbnN0clNpZ25hdHVyZSk7Ci0gICAgICAgICAgICB9ICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0gICAgICAgICAgICBpZiAoIHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSApIHsgCisgICAgICAgICAgICBpZiAoIHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSApIHsKICAgICAgICAgICAgICAgICAvLyBpbnZva2VzdGF0aWM6IERvdWJsZS52YWx1ZU9mKGRvdWJsZSkKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljIGphdmEubGFuZy5Eb3VibGUudmFsdWVPZihkb3VibGUpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB0aGlzLmludm9rZSgKKyAgICAgICAgICAgICAgICBpbnZva2UoCiAgICAgICAgICAgICAgICAgICAgIE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgMiwgLy8gYXJnQ291bnQKKyAgICAgICAgICAgICAgICAgICAgMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogICAgICAgICAgICAgICAgICAgICAxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5WYWx1ZU9mLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuZG91YmxlRG91YmxlU2lnbmF0dXJlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gbmV3IERvdWJsZSggZG91YmxlICkKLSAgICAgICAgICAgIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3BlY2lhbCBqYXZhLmxhbmcuRG91YmxlKGRvdWJsZSkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCW5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCW5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gyKCk7CiAgICAgICAgICAgICAgICAgZHVwX3gyKCk7CiAgICAgICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisKKyAgICAgICAgICAgICAgICBpbnZva2UoCiAgICAgICAgICAgICAgICAgICAgIE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsCi0gICAgICAgICAgICAgICAgICAgIDIsIC8vIGFyZ0NvdW50CisgICAgICAgICAgICAgICAgICAgIDMsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKICAgICAgICAgICAgICAgICAgICAgMCwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSmF2YUxhbmdEb3VibGVDb25zdGFudFBvb2xOYW1lLAogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSW5pdCwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkRvdWJsZUNvbnN0clNpZ25hdHVyZSk7Ci0gICAgICAgICAgICB9ICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhazsgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAgICAgICAgICAgICBpZiAoIHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSApIHsKICAgICAgICAgICAgICAgICAvLyBpbnZva2VzdGF0aWM6IEJvb2xlYW4udmFsdWVPZihib29sZWFuKQotICAgICAgICAgICAgCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzdGF0aWMgamF2YS5sYW5nLkJvb2xlYW4udmFsdWVPZihib29sZWFuKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGhpcy5pbnZva2UoCisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgIDEsIC8vIGFyZ0NvdW50CisgICAgICAgICAgICAgICAgICAgIDEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICBDb25zdGFudFBvb2wuSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSwKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLlZhbHVlT2YsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5ib29sZWFuQm9vbGVhblNpZ25hdHVyZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG5ldyBCb29sZWFuKGJvb2xlYW4pCi0gICAgICAgICAgICAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXNwZWNpYWwgamF2YS5sYW5nLkJvb2xlYW4oYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIG5ld1dyYXBwZXJGb3IodW5ib3hlZFR5cGVJRCk7CiAgICAgICAgICAgICAgICAgZHVwX3gxKCk7Ci0gICAgICAgICAgICAgICAgc3dhcCgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmludm9rZSgKKyAgICAgICAgICAgICAgICBzd2FwKCk7CisgICAgICAgICAgICAgICAgaW52b2tlKAogICAgICAgICAgICAgICAgICAgICBPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotICAgICAgICAgICAgICAgICAgICAxLCAvLyBhcmdDb3VudAorICAgICAgICAgICAgICAgICAgICAyLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJldHVybiB0eXBlIHNpemUKICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRQb29sLkphdmFMYW5nQm9vbGVhbkNvbnN0YW50UG9vbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50UG9vbC5Jbml0LApAQCAtMTYxNyw0NiArMTY5MCw0MyBAQAogICAgICAgICAgICAgfQogICAgIH0KIH0KKwogLyoqCiAgKiBNYWNybyBmb3IgYnVpbGRpbmcgYSBjbGFzcyBkZXNjcmlwdG9yIG9iamVjdAogICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUoVHlwZUJpbmRpbmcgYWNjZXNzZWRUeXBlLCBGaWVsZEJpbmRpbmcgc3ludGhldGljRmllbGRCaW5kaW5nKSB7Ci0JQnJhbmNoTGFiZWwgZW5kTGFiZWw7Ci0JRXhjZXB0aW9uTGFiZWwgYW55RXhjZXB0aW9uSGFuZGxlcjsKLQlpbnQgc2F2ZVN0YWNrU2l6ZTsKIAlpZiAoYWNjZXNzZWRUeXBlLmlzQmFzZVR5cGUoKSAmJiBhY2Nlc3NlZFR5cGUgIT0gVHlwZUJpbmRpbmcuTlVMTCkgewotCQl0aGlzLmdldFRZUEUoYWNjZXNzZWRUeXBlLmlkKTsKKwkJZ2V0VFlQRShhY2Nlc3NlZFR5cGUuaWQpOwogCQlyZXR1cm47CiAJfQotCiAJaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogCQkvLyBnZW5lcmF0aW9uIHVzaW5nIHRoZSBuZXcgbGRjX3cgYnl0ZWNvZGUKIAkJdGhpcy5sZGMoYWNjZXNzZWRUeXBlKTsKIAl9IGVsc2UgewotCQllbmRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCh0aGlzKTsKKwkJQnJhbmNoTGFiZWwgZW5kTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwodGhpcyk7CiAJCWlmIChzeW50aGV0aWNGaWVsZEJpbmRpbmcgIT0gbnVsbCkgeyAvLyBub24gaW50ZXJmYWNlIGNhc2UKLQkJCXRoaXMuZ2V0c3RhdGljKHN5bnRoZXRpY0ZpZWxkQmluZGluZyk7Ci0JCQl0aGlzLmR1cCgpOwotCQkJdGhpcy5pZm5vbm51bGwoZW5kTGFiZWwpOwotCQkJdGhpcy5wb3AoKTsKKwkJCWZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgc3ludGhldGljRmllbGRCaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCQkJZHVwKCk7CisJCQlpZm5vbm51bGwoZW5kTGFiZWwpOworCQkJcG9wKCk7CiAJCX0KIAogCQkvKiBNYWNybyBmb3IgYnVpbGRpbmcgYSBjbGFzcyBkZXNjcmlwdG9yIG9iamVjdC4uLiB1c2luZyBvciBub3QgYSBmaWVsZCBjYWNoZSB0byBzdG9yZSBpdCBpbnRvLi4uCiAJCXRoaXMgc2VxdWVuY2UgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSBhY3R1YWwgY2xhc3MgZGVzY3JpcHRvci4KLQkJCisKIAkJSWYgdGhlIGZpZWxkQ2FjaGUgaXMgc2V0LCB0aGVuIGl0IGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBib2R5IG9mIGEgc3ludGhldGljIGFjY2VzcyBtZXRob2QKIAkJZmFjdG9yaW5nIHRoZSBhY3R1YWwgZGVzY3JpcHRvciBjcmVhdGlvbiBvdXQgb2YgdGhlIGludm9jYXRpb24gc2l0ZSAoc2F2aW5nIHNwYWNlKS4KIAkJSWYgdGhlIGZpZWxkQ2FjaGUgaXMgbmlsLCB0aGVuIHdlIGFyZSBkdW1waW5nIHRoZSBieXRlY29kZSBvbiB0aGUgaW52b2NhdGlvbiBzaXRlLCBzaW5jZQogCQl3ZSBoYXZlIG5vIHdheSB0byBnZXQgYSBoYW5kIG9uIHRoZSBmaWVsZCBjYWNoZSB0byBkbyBiZXR0ZXIuICovCi0JCi0JCisKKwogCQkvLyBXcmFwIHRoZSBjb2RlIGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNvbnZlcnQgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGludG8gYSBOb0NsYXNzRGVmRXJyb3IKLQkKLQkJYW55RXhjZXB0aW9uSGFuZGxlciA9IG5ldyBFeGNlcHRpb25MYWJlbCh0aGlzLCBUeXBlQmluZGluZy5OVUxMIC8qIHJlcHJlc2VudHMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiovKTsKLQkJYW55RXhjZXB0aW9uSGFuZGxlci5wbGFjZVN0YXJ0KCk7CisKKwkJRXhjZXB0aW9uTGFiZWwgY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkhhbmRsZXIgPSBuZXcgRXhjZXB0aW9uTGFiZWwodGhpcywgVHlwZUJpbmRpbmcuTlVMTCAvKnJlcHJlc2VudHMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiovKTsKKwkJY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkhhbmRsZXIucGxhY2VTdGFydCgpOwogCQl0aGlzLmxkYyhhY2Nlc3NlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCA/ICJqYXZhLmxhbmcuT2JqZWN0IiA6IFN0cmluZy52YWx1ZU9mKGFjY2Vzc2VkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOwotCQorCQlpbnZva2VDbGFzc0Zvck5hbWUoKTsKKwogCQkvKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3NTY1CiAJCWlmIChhY2Nlc3NlZFR5cGUgPT0gQmFzZVR5cGVzLk51bGxCaW5kaW5nKSB7CiAJCQl0aGlzLmxkYygiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCkBAIC0xNjY5LDQ2ICsxNzM5LDQ2IEBACiAJCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CiAJCWlmICghYWNjZXNzZWRUeXBlLmlzQXJyYXlUeXBlKCkpIHsgLy8gZXh0cmFjdCB0aGUgY29tcG9uZW50IHR5cGUsIHdoaWNoIGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUgY2xhc3MKIAkJCXRoaXMuaW52b2tlSmF2YUxhbmdDbGFzc0dldENvbXBvbmVudFR5cGUoKTsKLQkJfQkKKwkJfQogCQkqLwogCQkvKiBXZSBuZWVkIHRvIHByb3RlY3QgdGhlIHJ1bnRpbWUgY29kZSBmcm9tIGJpbmFyeSBpbmNvbnNpc3RlbmNpZXMKIAkJaW4gY2FzZSB0aGUgYWNjZXNzZWRUeXBlIGlzIG1pc3NpbmcsIHRoZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGhhcyB0byBiZSBjb252ZXJ0ZWQKIAkJaW50byBhIE5vQ2xhc3NEZWZFcnJvcihvbGQgZXggbWVzc2FnZSksIHdlIHRodXMgbmVlZCB0byBidWlsZCBhbiBleGNlcHRpb24gaGFuZGxlciBmb3IgdGhpcyBvbmUuICovCi0JCWFueUV4Y2VwdGlvbkhhbmRsZXIucGxhY2VFbmQoKTsKLQkKKwkJY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkhhbmRsZXIucGxhY2VFbmQoKTsKKwogCQlpZiAoc3ludGhldGljRmllbGRCaW5kaW5nICE9IG51bGwpIHsgLy8gbm9uIGludGVyZmFjZSBjYXNlCi0JCQl0aGlzLmR1cCgpOwotCQkJdGhpcy5wdXRzdGF0aWMoc3ludGhldGljRmllbGRCaW5kaW5nKTsKKwkJCWR1cCgpOworCQkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfcHV0c3RhdGljLCBzeW50aGV0aWNGaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiAJCX0KLQkJdGhpcy5nb3RvXyhlbmRMYWJlbCk7Ci0JCi0JCisJCWdvdG9fKGVuZExhYmVsKTsKKworCQlpbnQgc2F2ZWRTdGFja0RlcHRoID0gdGhpcy5zdGFja0RlcHRoOwogCQkvLyBHZW5lcmF0ZSB0aGUgYm9keSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKLQkJc2F2ZVN0YWNrU2l6ZSA9IHN0YWNrRGVwdGg7Ci0JCXN0YWNrRGVwdGggPSAxOwogCQkvKiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIG9uIHN0YWNrIC0tIHRoZSBjbGFzcyBsaXRlcmFsIGNvdWxkIGJlIGRvaW5nIG1vcmUgdGhpbmdzCiAJCW9uIHRoZSBzdGFjaywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3RhY2sgbWF5IG5vdCBiZSBlbXB0eSBhdCB0aGlzIHBvaW50IGluIHRoZQogCQlhYm92ZSBjb2RlIGdlbi4gU28gd2Ugc2F2ZSBpdHMgc3RhdGUgYW5kIHJlc3RhcnQgaXQgZnJvbSAxLiAqLwotCQotCQlhbnlFeGNlcHRpb25IYW5kbGVyLnBsYWNlKCk7Ci0JCi0JCS8vIFRyYW5zZm9ybSB0aGUgY3VycmVudCBleGNlcHRpb24sIGFuZCByZXB1c2ggYW5kIHRocm93IGEgCisKKwkJcHVzaEV4Y2VwdGlvbk9uU3RhY2soVHlwZUJpbmRpbmcuTlVMTCk7LypyZXByZXNlbnRzIENsYXNzTm90Rm91bmRFeGNlcHRpb24qLworCQljbGFzc05vdEZvdW5kRXhjZXB0aW9uSGFuZGxlci5wbGFjZSgpOworCisJCS8vIFRyYW5zZm9ybSB0aGUgY3VycmVudCBleGNlcHRpb24sIGFuZCByZXB1c2ggYW5kIHRocm93IGEKIAkJLy8gTm9DbGFzc0RlZkZvdW5kRXJyb3IoQ2xhc3NOb3RGb3VuZC5nZXRNZXNzYWdlKCkpCi0JCi0JCXRoaXMubmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKTsKLQkJdGhpcy5kdXBfeDEoKTsKKworCQluZXdOb0NsYXNzRGVmRm91bmRFcnJvcigpOworCQlkdXBfeDEoKTsKIAkJdGhpcy5zd2FwKCk7Ci0JCisKIAkJLy8gUmV0cmlldmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgb2xkIGV4Y2VwdGlvbgotCQl0aGlzLmludm9rZVRocm93YWJsZUdldE1lc3NhZ2UoKTsKLQkKKwkJaW52b2tlVGhyb3dhYmxlR2V0TWVzc2FnZSgpOworCiAJCS8vIFNlbmQgdGhlIGNvbnN0cnVjdG9yIHRha2luZyBhIG1lc3NhZ2Ugc3RyaW5nIGFzIGFuIGFyZ3VtZW50Ci0JCXRoaXMuaW52b2tlTm9DbGFzc0RlZkZvdW5kRXJyb3JTdHJpbmdDb25zdHJ1Y3RvcigpOwotCQl0aGlzLmF0aHJvdygpOwotCQlzdGFja0RlcHRoID0gc2F2ZVN0YWNrU2l6ZTsKKwkJaW52b2tlTm9DbGFzc0RlZkZvdW5kRXJyb3JTdHJpbmdDb25zdHJ1Y3RvcigpOworCQlhdGhyb3coKTsKIAkJZW5kTGFiZWwucGxhY2UoKTsKKwkJdGhpcy5zdGFja0RlcHRoID0gc2F2ZWRTdGFja0RlcHRoOwogCX0KIH0KKwogLyoqCiAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGNvZGUgYXR0cmlidXRlIGJ5dGVjb2RlCiAgKi8KQEAgLTE3MTksNiArMTc4OSw3IEBACiAJaW52b2tlSmF2YUxhbmdFcnJvckNvbnN0cnVjdG9yKCk7CiAJYXRocm93KCk7CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQsIGludCBpbXBsaWNpdENvbnZlcnNpb25Db2RlKSB7CiAJaW50IHRhcmdldFR5cGVJRCA9IChpbXBsaWNpdENvbnZlcnNpb25Db2RlICYgVHlwZUlkcy5JTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7CiAJaWYgKHRhcmdldFR5cGVJRCA9PSAwKSB0YXJnZXRUeXBlSUQgPSBjb25zdGFudC50eXBlSUQoKTsgLy8gdXNlIGRlZmF1bHQgY29uc3RhbnQgdHlwZQpAQCAtMTc1NSwxNjQgKzE4MjYsMTIxIEBACiAJCWdlbmVyYXRlQm94aW5nQ29udmVyc2lvbih0YXJnZXRUeXBlSUQpOwogCX0KIH0KKwogcHVibGljIHZvaWQgZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7Ci0JdGhpcy5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChmaWVsZEJpbmRpbmcpOwogCS8vIHN3YXAgIHRoZSBmaWVsZCB3aXRoIHRoZSByZWNlaXZlcgogCXRoaXMuc3dhcCgpOwotCXRoaXMuaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRHZXR0ZXIoZmllbGRCaW5kaW5nLnR5cGUuaWQpOworCWludm9rZUphdmFMYW5nUmVmbGVjdEZpZWxkR2V0dGVyKGZpZWxkQmluZGluZy50eXBlLmlkKTsKIAlpZiAoIWZpZWxkQmluZGluZy50eXBlLmlzQmFzZVR5cGUoKSkgewogCQl0aGlzLmNoZWNrY2FzdChmaWVsZEJpbmRpbmcudHlwZSk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7Ci0JdGhpcy5pbnZva2VKYXZhTGFuZ1JlZmxlY3RGaWVsZFNldHRlcihmaWVsZEJpbmRpbmcudHlwZS5pZCk7CisJaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRTZXR0ZXIoZmllbGRCaW5kaW5nLnR5cGUuaWQpOwogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUVtdWxhdGlvbkZvckNvbnN0cnVjdG9yKFNjb3BlIHNjb3BlLCBNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKIAkvLyBsZWF2ZSBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIG9iamVjdCBvbiB0aGUgc3RhY2sKIAl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOwotCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJaW52b2tlQ2xhc3NGb3JOYW1lKCk7CiAJaW50IHBhcmFtTGVuZ3RoID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aDsKIAl0aGlzLmdlbmVyYXRlSW5saW5lZFZhbHVlKHBhcmFtTGVuZ3RoKTsKLQl0aGlzLm5ld0FycmF5KHNjb3BlLmNyZWF0ZUFycmF5VHlwZShzY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTLCAzKSwgMSkpOworCW5ld0FycmF5KHNjb3BlLmNyZWF0ZUFycmF5VHlwZShzY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTLCAzKSwgMSkpOwogCWlmIChwYXJhbUxlbmd0aCA+IDApIHsKLQkJdGhpcy5kdXAoKTsKKwkJZHVwKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgewotCQkJdGhpcy5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsJCisJCQl0aGlzLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOwogCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzW2ldOwogCQkJaWYgKHBhcmFtZXRlci5pc0Jhc2VUeXBlKCkpIHsKLQkJCQl0aGlzLmdldFRZUEUocGFyYW1ldGVyLmlkKTsKKwkJCQlnZXRUWVBFKHBhcmFtZXRlci5pZCk7CiAJCQl9IGVsc2UgaWYgKHBhcmFtZXRlci5pc0FycmF5VHlwZSgpKSB7CiAJCQkJQXJyYXlCaW5kaW5nIGFycmF5ID0gKEFycmF5QmluZGluZylwYXJhbWV0ZXI7CiAJCQkJaWYgKGFycmF5LmxlYWZDb21wb25lbnRUeXBlLmlzQmFzZVR5cGUoKSkgewotCQkJCQl0aGlzLmdldFRZUEUoYXJyYXkubGVhZkNvbXBvbmVudFR5cGUuaWQpOworCQkJCQlnZXRUWVBFKGFycmF5LmxlYWZDb21wb25lbnRUeXBlLmlkKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKLQkJCQkJdGhpcy5pbnZva2VDbGFzc0Zvck5hbWUoKTsKKwkJCQkJaW52b2tlQ2xhc3NGb3JOYW1lKCk7CiAJCQkJfQogCQkJCWludCBkaW1lbnNpb25zID0gYXJyYXkuZGltZW5zaW9uczsKIAkJCQl0aGlzLmdlbmVyYXRlSW5saW5lZFZhbHVlKGRpbWVuc2lvbnMpOwotCQkJCXRoaXMubmV3YXJyYXkoVHlwZUlkcy5UX2ludCk7CQotCQkJCXRoaXMuaW52b2tlQXJyYXlOZXdJbnN0YW5jZSgpOwotCQkJCXRoaXMuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKKwkJCQluZXdhcnJheShUeXBlSWRzLlRfaW50KTsKKwkJCQlpbnZva2VBcnJheU5ld0luc3RhbmNlKCk7CisJCQkJaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKIAkJCX0gZWxzZSB7CiAJCQkJLy8gcGFyYW1ldGVyIGlzIGEgcmVmZXJlbmNlIGJpbmRpbmcKIAkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOwotCQkJCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJCQkJaW52b2tlQ2xhc3NGb3JOYW1lKCk7CiAJCQl9Ci0JCQl0aGlzLmFhc3RvcmUoKTsKKwkJCWFhc3RvcmUoKTsKIAkJCWlmIChpIDwgcGFyYW1MZW5ndGggLSAxKSB7Ci0JCQkJdGhpcy5kdXAoKTsKKwkJCQlkdXAoKTsKIAkJCX0KIAkJfQogCX0KLQl0aGlzLmludm9rZUNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpOwotCXRoaXMuZHVwKCk7Ci0JdGhpcy5pY29uc3RfMSgpOwotCXRoaXMuaW52b2tlQWNjZXNzaWJsZU9iamVjdFNldEFjY2Vzc2libGUoKTsKKwlpbnZva2VDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKKwlkdXAoKTsKKwlpY29uc3RfMSgpOworCWludm9rZUFjY2Vzc2libGVPYmplY3RTZXRBY2Nlc3NpYmxlKCk7CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgewogCS8vIGxlYXZlIGEgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgb2JqZWN0IG9uIHRoZSBzdGFjawogCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKLQl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOworCWludm9rZUNsYXNzRm9yTmFtZSgpOwogCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKGZpZWxkQmluZGluZy5uYW1lKSk7Ci0JdGhpcy5pbnZva2VDbGFzc0dldERlY2xhcmVkRmllbGQoKTsKLQl0aGlzLmR1cCgpOwotCXRoaXMuaWNvbnN0XzEoKTsKLQl0aGlzLmludm9rZUFjY2Vzc2libGVPYmplY3RTZXRBY2Nlc3NpYmxlKCk7CisJaW52b2tlQ2xhc3NHZXREZWNsYXJlZEZpZWxkKCk7CisJZHVwKCk7CisJaWNvbnN0XzEoKTsKKwlpbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpOwogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUVtdWxhdGlvbkZvck1ldGhvZChTY29wZSBzY29wZSwgTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CiAJLy8gbGVhdmUgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBvYmplY3Qgb24gdGhlIHN0YWNrCiAJdGhpcy5sZGMoU3RyaW5nLnZhbHVlT2YobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKLQl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOworCWludm9rZUNsYXNzRm9yTmFtZSgpOwogCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IpKTsKIAlpbnQgcGFyYW1MZW5ndGggPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOwogCXRoaXMuZ2VuZXJhdGVJbmxpbmVkVmFsdWUocGFyYW1MZW5ndGgpOwotCXRoaXMubmV3QXJyYXkoc2NvcGUuY3JlYXRlQXJyYXlUeXBlKHNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0xBU1MsIDMpLCAxKSk7CisJbmV3QXJyYXkoc2NvcGUuY3JlYXRlQXJyYXlUeXBlKHNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0xBU1MsIDMpLCAxKSk7CiAJaWYgKHBhcmFtTGVuZ3RoID4gMCkgewotCQl0aGlzLmR1cCgpOworCQlkdXAoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOwkKKwkJCXRoaXMuZ2VuZXJhdGVJbmxpbmVkVmFsdWUoaSk7CiAJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXIgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV07CiAJCQlpZiAocGFyYW1ldGVyLmlzQmFzZVR5cGUoKSkgewotCQkJCXRoaXMuZ2V0VFlQRShwYXJhbWV0ZXIuaWQpOworCQkJCWdldFRZUEUocGFyYW1ldGVyLmlkKTsKIAkJCX0gZWxzZSBpZiAocGFyYW1ldGVyLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQlBcnJheUJpbmRpbmcgYXJyYXkgPSAoQXJyYXlCaW5kaW5nKXBhcmFtZXRlcjsKIAkJCQlpZiAoYXJyYXkubGVhZkNvbXBvbmVudFR5cGUuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJCXRoaXMuZ2V0VFlQRShhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5pZCk7CisJCQkJCWdldFRZUEUoYXJyYXkubGVhZkNvbXBvbmVudFR5cGUuaWQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKGFycmF5LmxlYWZDb21wb25lbnRUeXBlLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOwotCQkJCQl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOworCQkJCQlpbnZva2VDbGFzc0Zvck5hbWUoKTsKIAkJCQl9CiAJCQkJaW50IGRpbWVuc2lvbnMgPSBhcnJheS5kaW1lbnNpb25zOwogCQkJCXRoaXMuZ2VuZXJhdGVJbmxpbmVkVmFsdWUoZGltZW5zaW9ucyk7Ci0JCQkJdGhpcy5uZXdhcnJheShUeXBlSWRzLlRfaW50KTsJCi0JCQkJdGhpcy5pbnZva2VBcnJheU5ld0luc3RhbmNlKCk7Ci0JCQkJdGhpcy5pbnZva2VPYmplY3RHZXRDbGFzcygpOworCQkJCW5ld2FycmF5KFR5cGVJZHMuVF9pbnQpOworCQkJCWludm9rZUFycmF5TmV3SW5zdGFuY2UoKTsKKwkJCQlpbnZva2VPYmplY3RHZXRDbGFzcygpOwogCQkJfSBlbHNlIHsKIAkJCQkvLyBwYXJhbWV0ZXIgaXMgYSByZWZlcmVuY2UgYmluZGluZwogCQkJCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY29uc3RhbnRQb29sTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKSk7Ci0JCQkJdGhpcy5pbnZva2VDbGFzc0Zvck5hbWUoKTsKKwkJCQlpbnZva2VDbGFzc0Zvck5hbWUoKTsKIAkJCX0KLQkJCXRoaXMuYWFzdG9yZSgpOworCQkJYWFzdG9yZSgpOwogCQkJaWYgKGkgPCBwYXJhbUxlbmd0aCAtIDEpIHsKLQkJCQl0aGlzLmR1cCgpOworCQkJCWR1cCgpOwogCQkJfQogCQl9CiAJfQotCXRoaXMuaW52b2tlQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCgpOwotCXRoaXMuZHVwKCk7Ci0JdGhpcy5pY29uc3RfMSgpOwotCXRoaXMuaW52b2tlQWNjZXNzaWJsZU9iamVjdFNldEFjY2Vzc2libGUoKTsKKwlpbnZva2VDbGFzc0dldERlY2xhcmVkTWV0aG9kKCk7CisJZHVwKCk7CisJaWNvbnN0XzEoKTsKKwlpbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpOwogfQotcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRmllbGRBY2Nlc3MoYnl0ZSBvcGNvZGUsIGludCByZXR1cm5UeXBlU2l6ZSwgY2hhcltdIGRlY2xhcmluZ0NsYXNzLCBjaGFyW10gbmFtZSwgY2hhcltdIHNpZ25hdHVyZSkgewotCWNvdW50TGFiZWxzID0gMDsKLQlzd2l0Y2gob3Bjb2RlKSB7Ci0JCWNhc2UgT3Bjb2Rlcy5PUENfZ2V0ZmllbGQgOgotCQkJaWYgKHJldHVyblR5cGVTaXplID09IDIpIHsKLQkJCQlzdGFja0RlcHRoKys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPcGNvZGVzLk9QQ19nZXRzdGF0aWMgOgotCQkJaWYgKHJldHVyblR5cGVTaXplID09IDIpIHsKLQkJCQlzdGFja0RlcHRoICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXN0YWNrRGVwdGgrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9wY29kZXMuT1BDX3B1dGZpZWxkIDoKLQkJCWlmIChyZXR1cm5UeXBlU2l6ZSA9PSAyKSB7Ci0JCQkJc3RhY2tEZXB0aCAtPSAzOwotCQkJfSBlbHNlIHsKLQkJCQlzdGFja0RlcHRoIC09IDI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPcGNvZGVzLk9QQ19wdXRzdGF0aWMgOgotCQkJaWYgKHJldHVyblR5cGVTaXplID09IDIpIHsKLQkJCQlzdGFja0RlcHRoIC09IDI7Ci0JCQl9IGVsc2UgewotCQkJCXN0YWNrRGVwdGgtLTsKLQkJCX0KLQl9Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkgewotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgewotCQlyZXNpemVCeXRlQXJyYXkoKTsKLQl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBvcGNvZGU7Ci0Jd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JGaWVsZChkZWNsYXJpbmdDbGFzcywgbmFtZSwgc2lnbmF0dXJlKSk7Ci19Ci1wcml2YXRlIHZvaWQgZ2VuZXJhdGVGaWVsZEFjY2VzcyhieXRlIG9wY29kZSwgaW50IHJldHVyblR5cGVTaXplLCBSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcsIGNoYXJbXSBuYW1lLCBUeXBlQmluZGluZyB0eXBlKSB7Ci0JaWYgKGJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJdGhpcy5jbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKGJpbmRpbmcpOwotCX0KLQlUeXBlQmluZGluZyBsZWFmQ29tcG9uZW50VHlwZSA9IHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKLQlpZiAobGVhZkNvbXBvbmVudFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJdGhpcy5jbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKGxlYWZDb21wb25lbnRUeXBlKTsKLQl9Ci0JdGhpcy5nZW5lcmF0ZUZpZWxkQWNjZXNzKG9wY29kZSwgcmV0dXJuVHlwZVNpemUsIGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLCBuYW1lLCB0eXBlLnNpZ25hdHVyZSgpKTsKLX0KKwogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gb2YgdGhlIGV4cHJlc3Npb24KICAqIG9uIHRoZSBzdGFjayBpbnRvIGEgZGlmZmVyZW50IHR5cGUgKGUuZy4gbG9uZyBsID0gc29tZUludDsgLS0+IGkybCBtdXN0IGJlIGluc2VydGVkKS4KQEAgLTE5MjYsMTAwICsxOTU0LDExNiBAQAogCX0KIAlzd2l0Y2ggKGltcGxpY2l0Q29udmVyc2lvbkNvZGUgJiBUeXBlSWRzLklNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgewogCQljYXNlIFR5cGVJZHMuRmxvYXQyQ2hhciA6Ci0JCQl0aGlzLmYyaSgpOwotCQkJdGhpcy5pMmMoKTsKKwkJCWYyaSgpOworCQkJaTJjKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLkRvdWJsZTJDaGFyIDoKLQkJCXRoaXMuZDJpKCk7Ci0JCQl0aGlzLmkyYygpOworCQkJZDJpKCk7CisJCQlpMmMoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuSW50MkNoYXIgOgogCQljYXNlIFR5cGVJZHMuU2hvcnQyQ2hhciA6CiAJCWNhc2UgVHlwZUlkcy5CeXRlMkNoYXIgOgotCQkJdGhpcy5pMmMoKTsKKwkJCWkyYygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Mb25nMkNoYXIgOgotCQkJdGhpcy5sMmkoKTsKLQkJCXRoaXMuaTJjKCk7CisJCQlsMmkoKTsKKwkJCWkyYygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5DaGFyMkZsb2F0IDoKIAkJY2FzZSBUeXBlSWRzLlNob3J0MkZsb2F0IDoKIAkJY2FzZSBUeXBlSWRzLkludDJGbG9hdCA6CiAJCWNhc2UgVHlwZUlkcy5CeXRlMkZsb2F0IDoKLQkJCXRoaXMuaTJmKCk7CisJCQlpMmYoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuRG91YmxlMkZsb2F0IDoKLQkJCXRoaXMuZDJmKCk7CisJCQlkMmYoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuTG9uZzJGbG9hdCA6Ci0JCQl0aGlzLmwyZigpOworCQkJbDJmKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLkZsb2F0MkJ5dGUgOgotCQkJdGhpcy5mMmkoKTsKLQkJCXRoaXMuaTJiKCk7CisJCQlmMmkoKTsKKwkJCWkyYigpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Eb3VibGUyQnl0ZSA6Ci0JCQl0aGlzLmQyaSgpOwotCQkJdGhpcy5pMmIoKTsKKwkJCWQyaSgpOworCQkJaTJiKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLkludDJCeXRlIDoKIAkJY2FzZSBUeXBlSWRzLlNob3J0MkJ5dGUgOgogCQljYXNlIFR5cGVJZHMuQ2hhcjJCeXRlIDoKLQkJCXRoaXMuaTJiKCk7CisJCQlpMmIoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuTG9uZzJCeXRlIDoKLQkJCXRoaXMubDJpKCk7Ci0JCQl0aGlzLmkyYigpOworCQkJbDJpKCk7CisJCQlpMmIoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuQnl0ZTJEb3VibGUgOgogCQljYXNlIFR5cGVJZHMuQ2hhcjJEb3VibGUgOgogCQljYXNlIFR5cGVJZHMuU2hvcnQyRG91YmxlIDoKIAkJY2FzZSBUeXBlSWRzLkludDJEb3VibGUgOgotCQkJdGhpcy5pMmQoKTsKKwkJCWkyZCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5GbG9hdDJEb3VibGUgOgotCQkJdGhpcy5mMmQoKTsKKwkJCWYyZCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Mb25nMkRvdWJsZSA6Ci0JCQl0aGlzLmwyZCgpOworCQkJbDJkKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLkJ5dGUyU2hvcnQgOgogCQljYXNlIFR5cGVJZHMuQ2hhcjJTaG9ydCA6CiAJCWNhc2UgVHlwZUlkcy5JbnQyU2hvcnQgOgotCQkJdGhpcy5pMnMoKTsKKwkJCWkycygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Eb3VibGUyU2hvcnQgOgotCQkJdGhpcy5kMmkoKTsKLQkJCXRoaXMuaTJzKCk7CisJCQlkMmkoKTsKKwkJCWkycygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Mb25nMlNob3J0IDoKLQkJCXRoaXMubDJpKCk7Ci0JCQl0aGlzLmkycygpOworCQkJbDJpKCk7CisJCQlpMnMoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuRmxvYXQyU2hvcnQgOgotCQkJdGhpcy5mMmkoKTsKLQkJCXRoaXMuaTJzKCk7CisJCQlmMmkoKTsKKwkJCWkycygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Eb3VibGUySW50IDoKLQkJCXRoaXMuZDJpKCk7CisJCQlkMmkoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuRmxvYXQySW50IDoKLQkJCXRoaXMuZjJpKCk7CisJCQlmMmkoKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuTG9uZzJJbnQgOgotCQkJdGhpcy5sMmkoKTsKKwkJCWwyaSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5JbnQyTG9uZyA6CiAJCWNhc2UgVHlwZUlkcy5DaGFyMkxvbmcgOgogCQljYXNlIFR5cGVJZHMuQnl0ZTJMb25nIDoKIAkJY2FzZSBUeXBlSWRzLlNob3J0MkxvbmcgOgotCQkJdGhpcy5pMmwoKTsKKwkJCWkybCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5Eb3VibGUyTG9uZyA6Ci0JCQl0aGlzLmQybCgpOworCQkJZDJsKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLkZsb2F0MkxvbmcgOgotCQkJdGhpcy5mMmwoKTsKKwkJCWYybCgpOworCQkJYnJlYWs7CisJCWNhc2UgVHlwZUlkcy5PYmplY3QyYm9vbGVhbjoKKwkJY2FzZSBUeXBlSWRzLk9iamVjdDJieXRlOgorCQljYXNlIFR5cGVJZHMuT2JqZWN0MnNob3J0OgorCQljYXNlIFR5cGVJZHMuT2JqZWN0MmludDoKKwkJY2FzZSBUeXBlSWRzLk9iamVjdDJsb25nOgorCQljYXNlIFR5cGVJZHMuT2JqZWN0MmZsb2F0OgorCQljYXNlIFR5cGVJZHMuT2JqZWN0MmNoYXI6CisJCWNhc2UgVHlwZUlkcy5PYmplY3QyZG91YmxlOgorCQkJLy8gc2VlIHRhYmxlIDUuMSBpbiBKTFMgUzUuNQorCQkJLy8gYW4gT2JqZWN0IHRvIHggY29udmVyc2lvbiBzaG91bGQgaGF2ZSBhIGNoZWNrIGNhc3QKKwkJCS8vIGFuZCBhbiB1bmJveGluZyBjb252ZXJzaW9uLgorCQkJaW50IHJ1bnRpbWVUeXBlID0gKGltcGxpY2l0Q29udmVyc2lvbkNvZGUgJiBUeXBlSWRzLklNUExJQ0lUX0NPTlZFUlNJT05fTUFTSykgPj4gNDsKKwkJCWNoZWNrY2FzdChydW50aW1lVHlwZSk7CisJCQlnZW5lcmF0ZVVuYm94aW5nQ29udmVyc2lvbihydW50aW1lVHlwZSk7CisJCQlicmVhazsJCiAJfQogCWlmICgoaW1wbGljaXRDb252ZXJzaW9uQ29kZSAmIFR5cGVJZHMuQk9YSU5HKSAhPSAwKSB7CiAJCS8vIG5lZWQgdG8gdW5ib3gvYm94IHRoZSBjb25zdGFudApAQCAtMjAyNywzOSArMjA3MSw0MCBAQAogCQlnZW5lcmF0ZUJveGluZ0NvbnZlcnNpb24odHlwZUlkKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGJvb2xlYW4gaW5saW5lZFZhbHVlKSB7CiAJaWYgKGlubGluZWRWYWx1ZSkKLQkJdGhpcy5pY29uc3RfMSgpOworCQlpY29uc3RfMSgpOwogCWVsc2UKLQkJdGhpcy5pY29uc3RfMCgpOworCQlpY29uc3RfMCgpOwogfQogCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUlubGluZWRWYWx1ZShieXRlIGlubGluZWRWYWx1ZSkgewogCXN3aXRjaCAoaW5saW5lZFZhbHVlKSB7CiAJCWNhc2UgLTEgOgotCQkJdGhpcy5pY29uc3RfbTEoKTsKKwkJCWljb25zdF9tMSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMCA6Ci0JCQl0aGlzLmljb25zdF8wKCk7CisJCQlpY29uc3RfMCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMSA6Ci0JCQl0aGlzLmljb25zdF8xKCk7CisJCQlpY29uc3RfMSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMiA6Ci0JCQl0aGlzLmljb25zdF8yKCk7CisJCQlpY29uc3RfMigpOwogCQkJYnJlYWs7CiAJCWNhc2UgMyA6Ci0JCQl0aGlzLmljb25zdF8zKCk7CisJCQlpY29uc3RfMygpOwogCQkJYnJlYWs7CiAJCWNhc2UgNCA6Ci0JCQl0aGlzLmljb25zdF80KCk7CisJCQlpY29uc3RfNCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgNSA6Ci0JCQl0aGlzLmljb25zdF81KCk7CisJCQlpY29uc3RfNSgpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgogCQkJaWYgKCgtMTI4IDw9IGlubGluZWRWYWx1ZSkgJiYgKGlubGluZWRWYWx1ZSA8PSAxMjcpKSB7Ci0JCQkJdGhpcy5iaXB1c2goaW5saW5lZFZhbHVlKTsKKwkJCQliaXB1c2goaW5saW5lZFZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJfQpAQCAtMjA2OCwxNDggKzIxMTMsMTU0IEBACiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUlubGluZWRWYWx1ZShjaGFyIGlubGluZWRWYWx1ZSkgewogCXN3aXRjaCAoaW5saW5lZFZhbHVlKSB7CiAJCWNhc2UgMCA6Ci0JCQl0aGlzLmljb25zdF8wKCk7CisJCQlpY29uc3RfMCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMSA6Ci0JCQl0aGlzLmljb25zdF8xKCk7CisJCQlpY29uc3RfMSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMiA6Ci0JCQl0aGlzLmljb25zdF8yKCk7CisJCQlpY29uc3RfMigpOwogCQkJYnJlYWs7CiAJCWNhc2UgMyA6Ci0JCQl0aGlzLmljb25zdF8zKCk7CisJCQlpY29uc3RfMygpOwogCQkJYnJlYWs7CiAJCWNhc2UgNCA6Ci0JCQl0aGlzLmljb25zdF80KCk7CisJCQlpY29uc3RfNCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgNSA6Ci0JCQl0aGlzLmljb25zdF81KCk7CisJCQlpY29uc3RfNSgpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgogCQkJaWYgKCg2IDw9IGlubGluZWRWYWx1ZSkgJiYgKGlubGluZWRWYWx1ZSA8PSAxMjcpKSB7Ci0JCQkJdGhpcy5iaXB1c2goKGJ5dGUpIGlubGluZWRWYWx1ZSk7CisJCQkJYmlwdXNoKChieXRlKSBpbmxpbmVkVmFsdWUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCWlmICgoMTI4IDw9IGlubGluZWRWYWx1ZSkgJiYgKGlubGluZWRWYWx1ZSA8PSAzMjc2NykpIHsKLQkJCQl0aGlzLnNpcHVzaChpbmxpbmVkVmFsdWUpOworCQkJCXNpcHVzaChpbmxpbmVkVmFsdWUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCXRoaXMubGRjKGlubGluZWRWYWx1ZSk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUlubGluZWRWYWx1ZShkb3VibGUgaW5saW5lZFZhbHVlKSB7CiAJaWYgKGlubGluZWRWYWx1ZSA9PSAwLjApIHsKIAkJaWYgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGlubGluZWRWYWx1ZSkgIT0gMEwpCiAJCQl0aGlzLmxkYzJfdyhpbmxpbmVkVmFsdWUpOwogCQllbHNlCi0JCQl0aGlzLmRjb25zdF8wKCk7CisJCQlkY29uc3RfMCgpOwogCQlyZXR1cm47CiAJfQogCWlmIChpbmxpbmVkVmFsdWUgPT0gMS4wKSB7Ci0JCXRoaXMuZGNvbnN0XzEoKTsKKwkJZGNvbnN0XzEoKTsKIAkJcmV0dXJuOwogCX0KIAl0aGlzLmxkYzJfdyhpbmxpbmVkVmFsdWUpOwogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUlubGluZWRWYWx1ZShmbG9hdCBpbmxpbmVkVmFsdWUpIHsKIAlpZiAoaW5saW5lZFZhbHVlID09IDAuMGYpIHsKIAkJaWYgKEZsb2F0LmZsb2F0VG9JbnRCaXRzKGlubGluZWRWYWx1ZSkgIT0gMCkKIAkJCXRoaXMubGRjKGlubGluZWRWYWx1ZSk7CiAJCWVsc2UKLQkJCXRoaXMuZmNvbnN0XzAoKTsKKwkJCWZjb25zdF8wKCk7CiAJCXJldHVybjsKIAl9CiAJaWYgKGlubGluZWRWYWx1ZSA9PSAxLjBmKSB7Ci0JCXRoaXMuZmNvbnN0XzEoKTsKKwkJZmNvbnN0XzEoKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoaW5saW5lZFZhbHVlID09IDIuMGYpIHsKLQkJdGhpcy5mY29uc3RfMigpOworCQlmY29uc3RfMigpOwogCQlyZXR1cm47CiAJfQogCXRoaXMubGRjKGlubGluZWRWYWx1ZSk7CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGludCBpbmxpbmVkVmFsdWUpIHsKIAlzd2l0Y2ggKGlubGluZWRWYWx1ZSkgewogCQljYXNlIC0xIDoKLQkJCXRoaXMuaWNvbnN0X20xKCk7CisJCQlpY29uc3RfbTEoKTsKIAkJCWJyZWFrOwogCQljYXNlIDAgOgotCQkJdGhpcy5pY29uc3RfMCgpOworCQkJaWNvbnN0XzAoKTsKIAkJCWJyZWFrOwogCQljYXNlIDEgOgotCQkJdGhpcy5pY29uc3RfMSgpOworCQkJaWNvbnN0XzEoKTsKIAkJCWJyZWFrOwogCQljYXNlIDIgOgotCQkJdGhpcy5pY29uc3RfMigpOworCQkJaWNvbnN0XzIoKTsKIAkJCWJyZWFrOwogCQljYXNlIDMgOgotCQkJdGhpcy5pY29uc3RfMygpOworCQkJaWNvbnN0XzMoKTsKIAkJCWJyZWFrOwogCQljYXNlIDQgOgotCQkJdGhpcy5pY29uc3RfNCgpOworCQkJaWNvbnN0XzQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDUgOgotCQkJdGhpcy5pY29uc3RfNSgpOworCQkJaWNvbnN0XzUoKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKIAkJCWlmICgoLTEyOCA8PSBpbmxpbmVkVmFsdWUpICYmIChpbmxpbmVkVmFsdWUgPD0gMTI3KSkgewotCQkJCXRoaXMuYmlwdXNoKChieXRlKSBpbmxpbmVkVmFsdWUpOworCQkJCWJpcHVzaCgoYnl0ZSkgaW5saW5lZFZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlpZiAoKC0zMjc2OCA8PSBpbmxpbmVkVmFsdWUpICYmIChpbmxpbmVkVmFsdWUgPD0gMzI3NjcpKSB7Ci0JCQkJdGhpcy5zaXB1c2goaW5saW5lZFZhbHVlKTsKKwkJCQlzaXB1c2goaW5saW5lZFZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQl0aGlzLmxkYyhpbmxpbmVkVmFsdWUpOwogCX0KIH0KKwogcHVibGljIHZvaWQgZ2VuZXJhdGVJbmxpbmVkVmFsdWUobG9uZyBpbmxpbmVkVmFsdWUpIHsKIAlpZiAoaW5saW5lZFZhbHVlID09IDApIHsKLQkJdGhpcy5sY29uc3RfMCgpOworCQlsY29uc3RfMCgpOwogCQlyZXR1cm47CiAJfQogCWlmIChpbmxpbmVkVmFsdWUgPT0gMSkgewotCQl0aGlzLmxjb25zdF8xKCk7CisJCWxjb25zdF8xKCk7CiAJCXJldHVybjsKIAl9CiAJdGhpcy5sZGMyX3coaW5saW5lZFZhbHVlKTsKIH0KKwogcHVibGljIHZvaWQgZ2VuZXJhdGVJbmxpbmVkVmFsdWUoc2hvcnQgaW5saW5lZFZhbHVlKSB7CiAJc3dpdGNoIChpbmxpbmVkVmFsdWUpIHsKIAkJY2FzZSAtMSA6Ci0JCQl0aGlzLmljb25zdF9tMSgpOworCQkJaWNvbnN0X20xKCk7CiAJCQlicmVhazsKIAkJY2FzZSAwIDoKLQkJCXRoaXMuaWNvbnN0XzAoKTsKKwkJCWljb25zdF8wKCk7CiAJCQlicmVhazsKIAkJY2FzZSAxIDoKLQkJCXRoaXMuaWNvbnN0XzEoKTsKKwkJCWljb25zdF8xKCk7CiAJCQlicmVhazsKIAkJY2FzZSAyIDoKLQkJCXRoaXMuaWNvbnN0XzIoKTsKKwkJCWljb25zdF8yKCk7CiAJCQlicmVhazsKIAkJY2FzZSAzIDoKLQkJCXRoaXMuaWNvbnN0XzMoKTsKKwkJCWljb25zdF8zKCk7CiAJCQlicmVhazsKIAkJY2FzZSA0IDoKLQkJCXRoaXMuaWNvbnN0XzQoKTsKKwkJCWljb25zdF80KCk7CiAJCQlicmVhazsKIAkJY2FzZSA1IDoKLQkJCXRoaXMuaWNvbnN0XzUoKTsKKwkJCWljb25zdF81KCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6CiAJCQlpZiAoKC0xMjggPD0gaW5saW5lZFZhbHVlKSAmJiAoaW5saW5lZFZhbHVlIDw9IDEyNykpIHsKLQkJCQl0aGlzLmJpcHVzaCgoYnl0ZSkgaW5saW5lZFZhbHVlKTsKKwkJCQliaXB1c2goKGJ5dGUpIGlubGluZWRWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJdGhpcy5zaXB1c2goaW5saW5lZFZhbHVlKTsKKwkJCXNpcHVzaChpbmxpbmVkVmFsdWUpOwogCX0KIH0KKwogcHVibGljIHZvaWQgZ2VuZXJhdGVPdXRlckFjY2VzcyhPYmplY3RbXSBtYXBwaW5nU2VxdWVuY2UsIEFTVE5vZGUgaW52b2NhdGlvblNpdGUsIEJpbmRpbmcgdGFyZ2V0LCBTY29wZSBzY29wZSkgewogCWlmIChtYXBwaW5nU2VxdWVuY2UgPT0gbnVsbCkgewogCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOyAvL1RPRE8gKHBoaWxpcHBlKSBzaG91bGQgaW1wcm92ZSBsb2NhbCBlbXVsYXRpb24gZmFpbHVyZSByZXBvcnRpbmcKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbihpbnZvY2F0aW9uU2l0ZSk7IC8vVE9ETyAocGhpbGlwcGUpIHNob3VsZCBpbXByb3ZlIGxvY2FsIGVtdWxhdGlvbiBmYWlsdXJlIHJlcG9ydGluZwogCQl9IGVsc2UgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9TdWNoRW5jbG9zaW5nSW5zdGFuY2UoKFJlZmVyZW5jZUJpbmRpbmcpdGFyZ2V0LCBpbnZvY2F0aW9uU2l0ZSwgZmFsc2UpOwogCQl9CkBAIC0yMjIyLDU2ICsyMjczLDU3IEBACiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vU3VjaEVuY2xvc2luZ0luc3RhbmNlKChSZWZlcmVuY2VCaW5kaW5nKXRhcmdldCwgaW52b2NhdGlvblNpdGUsIGZhbHNlKTsKIAkJcmV0dXJuOwogCX0KLQkKKwogCWlmIChtYXBwaW5nU2VxdWVuY2UgPT0gQmxvY2tTY29wZS5FbXVsYXRpb25QYXRoVG9JbXBsaWNpdFRoaXMpIHsKLQkJdGhpcy5hbG9hZF8wKCk7CisJCWFsb2FkXzAoKTsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAobWFwcGluZ1NlcXVlbmNlWzBdIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CiAJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBtYXBwaW5nU2VxdWVuY2VbMF07Ci0JCXRoaXMuYWxvYWRfMCgpOwotCQl0aGlzLmdldGZpZWxkKGZpZWxkQmluZGluZyk7CisJCWFsb2FkXzAoKTsKKwkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGZpZWxkQmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAl9IGVsc2UgewogCQlsb2FkKChMb2NhbFZhcmlhYmxlQmluZGluZykgbWFwcGluZ1NlcXVlbmNlWzBdKTsKIAl9CiAJZm9yIChpbnQgaSA9IDEsIGxlbmd0aCA9IG1hcHBpbmdTZXF1ZW5jZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAobWFwcGluZ1NlcXVlbmNlW2ldIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CiAJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgbWFwcGluZ1NlcXVlbmNlW2ldOwotCQkJdGhpcy5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGZpZWxkQmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuaW52b2tlc3RhdGljKChNZXRob2RCaW5kaW5nKSBtYXBwaW5nU2VxdWVuY2VbaV0pOworCQkJaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgKE1ldGhvZEJpbmRpbmcpIG1hcHBpbmdTZXF1ZW5jZVtpXSwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJfQogCX0KIH0KKwogcHVibGljIHZvaWQgZ2VuZXJhdGVSZXR1cm5CeXRlY29kZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkKIAlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCXRoaXMucmV0dXJuXygpOworCQlyZXR1cm5fKCk7CiAJfSBlbHNlIHsKIAkJZmluYWwgaW50IGltcGxpY2l0Q29udmVyc2lvbiA9IGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uOwogCQlpZiAoKGltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQk9YSU5HKSAhPSAwKSB7Ci0JCQl0aGlzLmFyZXR1cm4oKTsKKwkJCWFyZXR1cm4oKTsKIAkJCXJldHVybjsKIAkJfQogCQlpbnQgcnVudGltZVR5cGUgPSAoaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5JTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQ7CiAJCXN3aXRjaCAocnVudGltZVR5cGUpIHsKIAkJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgogCQkJY2FzZSBUeXBlSWRzLlRfaW50IDoKLQkJCQl0aGlzLmlyZXR1cm4oKTsKKwkJCQlpcmV0dXJuKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFR5cGVJZHMuVF9mbG9hdCA6Ci0JCQkJdGhpcy5mcmV0dXJuKCk7CisJCQkJZnJldHVybigpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0JCQkJdGhpcy5scmV0dXJuKCk7CisJCQkJbHJldHVybigpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLQkJCQl0aGlzLmRyZXR1cm4oKTsKKwkJCQlkcmV0dXJuKCk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0IDoKLQkJCQl0aGlzLmFyZXR1cm4oKTsKKwkJCQlhcmV0dXJuKCk7CiAJCX0KIAl9CiB9CisKIC8qKgogICogVGhlIGVxdWl2YWxlbnQgY29kZSBwZXJmb3JtcyBhIHN0cmluZyBjb252ZXJzaW9uOgogICoKQEAgLTIyODQsODkgKzIzMzYsMTA2IEBACiAJaWYgKG9wZXIxID09IG51bGwpIHsKIAkJLyogT3BlcmFuZCBpcyBhbHJlYWR5IG9uIHRoZSBzdGFjaywgYW5kIG1heWJlIG5pbDoKIAkJbm90ZSB0eXBlMSBpcyBhbHdheXMgdG8gIGphdmEubGFuZy5TdHJpbmcgaGVyZS4qLwotCQl0aGlzLm5ld1N0cmluZ0NvbnRhdGVuYXRpb24oKTsKLQkJdGhpcy5kdXBfeDEoKTsKKwkJbmV3U3RyaW5nQ29udGF0ZW5hdGlvbigpOworCQlkdXBfeDEoKTsKIAkJdGhpcy5zd2FwKCk7Ci0JCS8vIElmIGFyZ3VtZW50IGlzIHJlZmVyZW5jZSB0eXBlLCBuZWVkIHRvIHRyYW5zZm9ybSBpdCAKKwkJLy8gSWYgYXJndW1lbnQgaXMgcmVmZXJlbmNlIHR5cGUsIG5lZWQgdG8gdHJhbnNmb3JtIGl0CiAJCS8vIGludG8gYSBzdHJpbmcgKGhhbmRsZXMgbnVsbCBjYXNlKQotCQl0aGlzLmludm9rZVN0cmluZ1ZhbHVlT2YoVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KTsKLQkJdGhpcy5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uU3RyaW5nQ29uc3RydWN0b3IoKTsKKwkJaW52b2tlU3RyaW5nVmFsdWVPZihUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpOworCQlpbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uU3RyaW5nQ29uc3RydWN0b3IoKTsKIAl9IGVsc2UgewotCQlwYyA9IHBvc2l0aW9uOworCQlwYyA9IHRoaXMucG9zaXRpb247CiAJCW9wZXIxLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQ29uY2F0ZW5hdGlvbkNyZWF0aW9uKGJsb2NrU2NvcGUsIHRoaXMsIG9wZXIxLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCQl0aGlzLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIG9wZXIxLnNvdXJjZVN0YXJ0KTsKIAl9Ci0JcGMgPSBwb3NpdGlvbjsKKwlwYyA9IHRoaXMucG9zaXRpb247CiAJb3BlcjIuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdDb25jYXRlbmF0aW9uKGJsb2NrU2NvcGUsIHRoaXMsIG9wZXIyLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuQ09NUElMRV9UWVBFX01BU0spOwogCXRoaXMucmVjb3JkUG9zaXRpb25zRnJvbShwYywgb3BlcjIuc291cmNlU3RhcnQpOwotCXRoaXMuaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvblRvU3RyaW5nKCk7CisJaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvblRvU3RyaW5nKCk7CiB9CisKIC8qKgogICogQHBhcmFtIGFjY2Vzc0JpbmRpbmcgdGhlIGFjY2VzcyBtZXRob2QgYmluZGluZyB0byBnZW5lcmF0ZQogICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JDb25zdHJ1Y3RvckFjY2VzcyhTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc0JpbmRpbmcpIHsKLQogCWluaXRpYWxpemVNYXhMb2NhbHMoYWNjZXNzQmluZGluZyk7Ci0KIAlNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yQmluZGluZyA9IGFjY2Vzc0JpbmRpbmcudGFyZ2V0TWV0aG9kOwogCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IGNvbnN0cnVjdG9yQmluZGluZy5wYXJhbWV0ZXJzOwogCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKIAlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IDE7Ci0JdGhpcy5hbG9hZF8wKCk7CisJYWxvYWRfMCgpOwogCS8vIHNwZWNpYWwgbmFtZSZvcmRpbmFsIGFyZ3VtZW50IGdlbmVyYXRpb24gZm9yIGVudW0gY29uc3RydWN0b3JzCiAJVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBjb25zdHJ1Y3RvckJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CiAJaWYgKGRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdFbnVtIHx8IGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7Ci0JCXRoaXMuYWxvYWRfMSgpOyAvLyBwYXNzIGFsb25nIG5hbWUgcGFyYW0gYXMgbmFtZSBhcmcKLQkJdGhpcy5pbG9hZF8yKCk7IC8vIHBhc3MgYWxvbmcgb3JkaW5hbCBwYXJhbSBhcyBvcmRpbmFsIGFyZworCQlhbG9hZF8xKCk7IC8vIHBhc3MgYWxvbmcgbmFtZSBwYXJhbSBhcyBuYW1lIGFyZworCQlpbG9hZF8yKCk7IC8vIHBhc3MgYWxvbmcgb3JkaW5hbCBwYXJhbSBhcyBvcmRpbmFsIGFyZwogCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7Ci0JfQkKKwl9CiAJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CiAJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOwogCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IChzeW50aGV0aWNBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoKTsgaSsrKSB7CiAJCQlUeXBlQmluZGluZyB0eXBlOwogCQkJbG9hZCgodHlwZSA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXS50eXBlKSwgcmVzb2x2ZWRQb3NpdGlvbik7Ci0JCQlpZiAoKHR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSB8fCAodHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSkKLQkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7Ci0JCQllbHNlCi0JCQkJcmVzb2x2ZWRQb3NpdGlvbisrOworCQkJc3dpdGNoKHR5cGUuaWQpIHsKKwkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJCQkJCWJyZWFrOworCQkJfQogCQl9CiAJfQogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJbG9hZChwYXJhbWV0ZXJzW2ldLCByZXNvbHZlZFBvc2l0aW9uKTsKLQkJaWYgKChwYXJhbWV0ZXJzW2ldID09IFR5cGVCaW5kaW5nLkRPVUJMRSkgfHwgKHBhcmFtZXRlcnNbaV0gPT0gVHlwZUJpbmRpbmcuTE9ORykpCi0JCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7Ci0JCWVsc2UKLQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyOworCQlsb2FkKHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV0sIHJlc29sdmVkUG9zaXRpb24pOworCQlzd2l0Y2gocGFyYW1ldGVyLmlkKSB7CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJcmVzb2x2ZWRQb3NpdGlvbisrOworCQkJCWJyZWFrOworCQl9CiAJfQotCQorCiAJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CiAJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOwogCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCAoc3ludGhldGljQXJndW1lbnRzID09IG51bGwgPyAwIDogc3ludGhldGljQXJndW1lbnRzLmxlbmd0aCk7IGkrKykgewogCQkJVHlwZUJpbmRpbmcgdHlwZTsKLQkJCWxvYWQoKHR5cGUgPSBzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZSksIHJlc29sdmVkUG9zaXRpb24pOwotCQkJaWYgKCh0eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkgfHwgKHR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykpCi0JCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOwotCQkJZWxzZQotCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJCWxvYWQodHlwZSA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXS50eXBlLCByZXNvbHZlZFBvc2l0aW9uKTsKKwkJCXN3aXRjaCh0eXBlLmlkKSB7CisJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmVzb2x2ZWRQb3NpdGlvbisrOworCQkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KLQl0aGlzLmludm9rZXNwZWNpYWwoY29uc3RydWN0b3JCaW5kaW5nKTsKLQl0aGlzLnJldHVybl8oKTsKKwlpbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwgY29uc3RydWN0b3JCaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCXJldHVybl8oKTsKIH0KKwogLy9zdGF0aWMgWCB2YWx1ZU9mKFN0cmluZyBuYW1lKSB7CiAvLyByZXR1cm4gKFgpIEVudW0udmFsdWVPZihYLmNsYXNzLCBuYW1lKTsKLS8vfQkJCisvL30KIHB1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljQm9keUZvckVudW1WYWx1ZU9mKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewogCWluaXRpYWxpemVNYXhMb2NhbHMobWV0aG9kQmluZGluZyk7CiAJZmluYWwgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JdGhpcy5sZGMoZGVjbGFyaW5nQ2xhc3MpOwotCXRoaXMuYWxvYWRfMCgpOwotCXRoaXMuaW52b2tlSmF2YUxhbmdFbnVtdmFsdWVPZihkZWNsYXJpbmdDbGFzcyk7CisJZ2VuZXJhdGVDbGFzc0xpdGVyYWxBY2Nlc3NGb3JUeXBlKGRlY2xhcmluZ0NsYXNzLCBudWxsKTsKKwlhbG9hZF8wKCk7CisJaW52b2tlSmF2YUxhbmdFbnVtdmFsdWVPZihkZWNsYXJpbmdDbGFzcyk7CiAJdGhpcy5jaGVja2Nhc3QoZGVjbGFyaW5nQ2xhc3MpOwotCXRoaXMuYXJldHVybigpOworCWFyZXR1cm4oKTsKIH0KKwogLy9zdGF0aWMgWFtdIHZhbHVlcygpIHsKIC8vIFhbXSB2YWx1ZXM7CiAvLyBpbnQgbGVuZ3RoOwpAQCAtMjM3NiwzNSArMjQ0NSw1NSBAQAogLy99CiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JFbnVtVmFsdWVzKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewogCUNsYXNzU2NvcGUgc2NvcGUgPSAoKFNvdXJjZVR5cGVCaW5kaW5nKW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLnNjb3BlOwotCUZpZWxkQmluZGluZyBlbnVtVmFsdWVzU3ludGhldGljZmllbGQgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0LmVudW1WYWx1ZXNTeW50aGV0aWNmaWVsZDsKIAlpbml0aWFsaXplTWF4TG9jYWxzKG1ldGhvZEJpbmRpbmcpOwogCVR5cGVCaW5kaW5nIGVudW1BcnJheSA9IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZTsKLQkKLQl0aGlzLmdldHN0YXRpYyhlbnVtVmFsdWVzU3ludGhldGljZmllbGQpOwotCXRoaXMuZHVwKCk7Ci0JdGhpcy5hc3RvcmVfMCgpOwotCXRoaXMuaWNvbnN0XzAoKTsKLQl0aGlzLmFsb2FkXzAoKTsKLQl0aGlzLmFycmF5bGVuZ3RoKCk7Ci0JdGhpcy5kdXAoKTsKLQl0aGlzLmlzdG9yZV8xKCk7Ci0JdGhpcy5uZXdBcnJheSgoQXJyYXlCaW5kaW5nKSBlbnVtQXJyYXkpOwotCXRoaXMuZHVwKCk7Ci0JdGhpcy5hc3RvcmVfMigpOwotCXRoaXMuaWNvbnN0XzAoKTsKLQl0aGlzLmlsb2FkXzEoKTsKLQl0aGlzLmludm9rZVN5c3RlbUFycmF5Y29weSgpOwotCXRoaXMuYWxvYWRfMigpOwotCXRoaXMuYXJldHVybigpOworCWZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgc2NvcGUucmVmZXJlbmNlQ29udGV4dC5lbnVtVmFsdWVzU3ludGhldGljZmllbGQsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJZHVwKCk7CisJYXN0b3JlXzAoKTsKKwlpY29uc3RfMCgpOworCWFsb2FkXzAoKTsKKwlhcnJheWxlbmd0aCgpOworCWR1cCgpOworCWlzdG9yZV8xKCk7CisJbmV3QXJyYXkoKEFycmF5QmluZGluZykgZW51bUFycmF5KTsKKwlkdXAoKTsKKwlhc3RvcmVfMigpOworCWljb25zdF8wKCk7CisJaWxvYWRfMSgpOworCWludm9rZVN5c3RlbUFycmF5Y29weSgpOworCWFsb2FkXzIoKTsKKwlhcmV0dXJuKCk7CiB9Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFJlYWRBY2Nlc3MoU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NCaW5kaW5nKSB7Ci0JaW5pdGlhbGl6ZU1heExvY2FscyhhY2Nlc3NCaW5kaW5nKTsKLQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gYWNjZXNzQmluZGluZy50YXJnZXRSZWFkRmllbGQ7Ci0JaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKQotCQl0aGlzLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOwotCWVsc2UgewotCQl0aGlzLmFsb2FkXzAoKTsKLQkJdGhpcy5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRW51bUluaXRpYWxpemF0aW9uTWV0aG9kKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCS8vIG5vIGxvY2FsIHVzZWQKKwl0aGlzLm1heExvY2FscyA9IDA7CisJLy8gZ2VuZXJhdGUgYWxsIGVudW0gY29uc3RhbnRzCisJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZUJpbmRpbmcgPSAoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHNvdXJjZVR5cGVCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJQmxvY2tTY29wZSBzdGF0aWNJbml0aWFsaXplclNjb3BlID0gdHlwZURlY2xhcmF0aW9uLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7CisJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwlmb3IgKGludCBpID0gbWV0aG9kQmluZGluZy5zdGFydEluZGV4LCBtYXggPSBtZXRob2RCaW5kaW5nLmVuZEluZGV4OyBpIDwgbWF4OyBpKyspIHsKKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSBmaWVsZERlY2xhcmF0aW9uc1tpXTsKKwkJaWYgKGZpZWxkRGVjbC5pc1N0YXRpYygpKSB7CisJCQlpZiAoZmllbGREZWNsLmdldEtpbmQoKSA9PSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVCkgeworCQkJCWZpZWxkRGVjbC5nZW5lcmF0ZUNvZGUoc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwgdGhpcyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuXygpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRmllbGRSZWFkQWNjZXNzKFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWNjZXNzTWV0aG9kKSB7CisJaW5pdGlhbGl6ZU1heExvY2FscyhhY2Nlc3NNZXRob2QpOworCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBhY2Nlc3NNZXRob2QudGFyZ2V0UmVhZEZpZWxkOworCS8vIHRhcmdldCBtZXRob2QgZGVjbGFyaW5nIGNsYXNzIG1heSBub3QgYmUgYWNjZXNzaWJsZSAoMjQ3OTUzKTsKKwlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGFjY2Vzc01ldGhvZC5wdXJwb3NlID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJGaWVsZFJlYWRBY2Nlc3MgCisJCQk/IGFjY2Vzc01ldGhvZC5kZWNsYXJpbmdDbGFzcy5zdXBlcmNsYXNzKCkgCisJCQk6IGFjY2Vzc01ldGhvZC5kZWNsYXJpbmdDbGFzczsKKwlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBmaWVsZEJpbmRpbmcsIGRlY2xhcmluZ0NsYXNzKTsgCisJfSBlbHNlIHsKKwkJYWxvYWRfMCgpOworCQlmaWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRmaWVsZCwgZmllbGRCaW5kaW5nLCBkZWNsYXJpbmdDbGFzcyk7CiAJfQogCXN3aXRjaCAoZmllbGRCaW5kaW5nLnR5cGUuaWQpIHsKIC8vCQljYXNlIFRfdm9pZCA6CkBAIC0yNDE1LDQ4ICsyNTA0LDUzIEBACiAJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6Ci0JCQl0aGlzLmlyZXR1cm4oKTsKKwkJCWlyZXR1cm4oKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCXRoaXMubHJldHVybigpOworCQkJbHJldHVybigpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKLQkJCXRoaXMuZnJldHVybigpOworCQkJZnJldHVybigpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0JCQl0aGlzLmRyZXR1cm4oKTsKKwkJCWRyZXR1cm4oKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKLQkJCXRoaXMuYXJldHVybigpOwotCX0JCisJCQlhcmV0dXJuKCk7CisJfQogfQotcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRmllbGRXcml0ZUFjY2VzcyhTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc0JpbmRpbmcpIHsKLQlpbml0aWFsaXplTWF4TG9jYWxzKGFjY2Vzc0JpbmRpbmcpOwotCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBhY2Nlc3NCaW5kaW5nLnRhcmdldFdyaXRlRmllbGQ7CisKK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljQm9keUZvckZpZWxkV3JpdGVBY2Nlc3MoU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NNZXRob2QpIHsKKwlpbml0aWFsaXplTWF4TG9jYWxzKGFjY2Vzc01ldGhvZCk7CisJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGFjY2Vzc01ldGhvZC50YXJnZXRXcml0ZUZpZWxkOworCS8vIHRhcmdldCBtZXRob2QgZGVjbGFyaW5nIGNsYXNzIG1heSBub3QgYmUgYWNjZXNzaWJsZSAoMjQ3OTUzKTsKKwlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGFjY2Vzc01ldGhvZC5wdXJwb3NlID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJGaWVsZFdyaXRlQWNjZXNzIAorCQkJPyBhY2Nlc3NNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc3VwZXJjbGFzcygpIAorCQkJOiBhY2Nlc3NNZXRob2QuZGVjbGFyaW5nQ2xhc3M7CQogCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewogCQlsb2FkKGZpZWxkQmluZGluZy50eXBlLCAwKTsKLQkJdGhpcy5wdXRzdGF0aWMoZmllbGRCaW5kaW5nKTsKKwkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfcHV0c3RhdGljLCBmaWVsZEJpbmRpbmcsIGRlY2xhcmluZ0NsYXNzKTsKIAl9IGVsc2UgewotCQl0aGlzLmFsb2FkXzAoKTsKKwkJYWxvYWRfMCgpOwogCQlsb2FkKGZpZWxkQmluZGluZy50eXBlLCAxKTsKLQkJdGhpcy5wdXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQlmaWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19wdXRmaWVsZCwgZmllbGRCaW5kaW5nLCBkZWNsYXJpbmdDbGFzcyk7CiAJfQotCXRoaXMucmV0dXJuXygpOworCXJldHVybl8oKTsKIH0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljQm9keUZvck1ldGhvZEFjY2VzcyhTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc01ldGhvZCkgewogCitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JNZXRob2RBY2Nlc3MoU3ludGhldGljTWV0aG9kQmluZGluZyBhY2Nlc3NNZXRob2QpIHsKIAlpbml0aWFsaXplTWF4TG9jYWxzKGFjY2Vzc01ldGhvZCk7CiAJTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QgPSBhY2Nlc3NNZXRob2QudGFyZ2V0TWV0aG9kOwogCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IHRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzOwogCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKLQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IGFjY2Vzc01ldGhvZC5raW5kID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuQnJpZGdlTWV0aG9kIAorCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzID0gYWNjZXNzTWV0aG9kLnB1cnBvc2UgPT0gU3ludGhldGljTWV0aG9kQmluZGluZy5CcmlkZ2VNZXRob2QKIAkJCQkJCQkJCQkJCQk/IGFjY2Vzc01ldGhvZC5wYXJhbWV0ZXJzCiAJCQkJCQkJCQkJCQkJOiBudWxsOwogCWludCByZXNvbHZlZFBvc2l0aW9uOwogCWlmICh0YXJnZXRNZXRob2QuaXNTdGF0aWMoKSkKIAkJcmVzb2x2ZWRQb3NpdGlvbiA9IDA7CiAJZWxzZSB7Ci0JCXRoaXMuYWxvYWRfMCgpOworCQlhbG9hZF8wKCk7CiAJCXJlc29sdmVkUG9zaXRpb24gPSAxOwogCX0KIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0yNDY0LDc4ICsyNTU4LDkxIEBACiAJICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgeyAvLyBmb3IgYnJpZGdlIG1ldGhvZHMKIAkJICAgIFR5cGVCaW5kaW5nIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOwogCQkJbG9hZChhcmd1bWVudCwgcmVzb2x2ZWRQb3NpdGlvbik7Ci0JCQlpZiAoYXJndW1lbnQgIT0gcGFyYW1ldGVyKSAKKwkJCWlmIChhcmd1bWVudCAhPSBwYXJhbWV0ZXIpCiAJCQkgICAgY2hlY2tjYXN0KHBhcmFtZXRlcik7CiAJICAgIH0gZWxzZSB7CiAJCQlsb2FkKHBhcmFtZXRlciwgcmVzb2x2ZWRQb3NpdGlvbik7CiAJCX0KLQkJaWYgKChwYXJhbWV0ZXIgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSB8fCAocGFyYW1ldGVyID09IFR5cGVCaW5kaW5nLkxPTkcpKQotCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOwotCQllbHNlCi0JCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJCXN3aXRjaChwYXJhbWV0ZXIuaWQpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJCQkJYnJlYWs7CisJCX0KIAl9CiAJaWYgKHRhcmdldE1ldGhvZC5pc1N0YXRpYygpKQotCQl0aGlzLmludm9rZXN0YXRpYyh0YXJnZXRNZXRob2QpOworCQlpbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCB0YXJnZXRNZXRob2QsIGFjY2Vzc01ldGhvZC5kZWNsYXJpbmdDbGFzcyk7IC8vIHRhcmdldCBtZXRob2QgZGVjbGFyaW5nIGNsYXNzIG1heSBub3QgYmUgYWNjZXNzaWJsZSAoMTI4NTYzKQogCWVsc2UgewogCQlpZiAodGFyZ2V0TWV0aG9kLmlzQ29uc3RydWN0b3IoKQotCQkJfHwgdGFyZ2V0TWV0aG9kLmlzUHJpdmF0ZSgpCi0JCQkvLyBxdWFsaWZpZWQgc3VwZXIgIlguc3VwZXIuZm9vKCkiIHRhcmdldHMgbWV0aG9kcyBmcm9tIHN1cGVyY2xhc3MKLQkJCXx8IGFjY2Vzc01ldGhvZC5raW5kID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJNZXRob2RBY2Nlc3MpewotCQkJdGhpcy5pbnZva2VzcGVjaWFsKHRhcmdldE1ldGhvZCk7CisJCQkJfHwgdGFyZ2V0TWV0aG9kLmlzUHJpdmF0ZSgpCisJCQkJLy8gcXVhbGlmaWVkIHN1cGVyICJYLnN1cGVyLmZvbygpIiB0YXJnZXRzIG1ldGhvZHMgZnJvbSBzdXBlcmNsYXNzCisJCQkJfHwgYWNjZXNzTWV0aG9kLnB1cnBvc2UgPT0gU3ludGhldGljTWV0aG9kQmluZGluZy5TdXBlck1ldGhvZEFjY2Vzcyl7CisJCQkvLyB0YXJnZXQgbWV0aG9kIGRlY2xhcmluZyBjbGFzcyBtYXkgbm90IGJlIGFjY2Vzc2libGUgKDI0Nzk1Myk7CisJCQlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGFjY2Vzc01ldGhvZC5wdXJwb3NlID09IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJNZXRob2RBY2Nlc3MgCisJCQkJCT8gYWNjZXNzTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKSAKKwkJCQkJOiBhY2Nlc3NNZXRob2QuZGVjbGFyaW5nQ2xhc3M7CQkJCQorCQkJaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsIHRhcmdldE1ldGhvZCwgZGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewogCQkJaWYgKHRhcmdldE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7IC8vIGludGVyZmFjZSBvciBhbm5vdGF0aW9uIHR5cGUKLQkJCQl0aGlzLmludm9rZWludGVyZmFjZSh0YXJnZXRNZXRob2QpOworCQkJCWludm9rZShPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UsIHRhcmdldE1ldGhvZCwgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5pbnZva2V2aXJ0dWFsKHRhcmdldE1ldGhvZCk7CisJCQkJaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsIHRhcmdldE1ldGhvZCwgYWNjZXNzTWV0aG9kLmRlY2xhcmluZ0NsYXNzKTsgLy8gdGFyZ2V0IG1ldGhvZCBkZWNsYXJpbmcgY2xhc3MgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlICgxMjg1NjMpCiAJCQl9CiAJCX0KIAl9CiAJc3dpdGNoICh0YXJnZXRNZXRob2QucmV0dXJuVHlwZS5pZCkgewogCQljYXNlIFR5cGVJZHMuVF92b2lkIDoKLQkJCXRoaXMucmV0dXJuXygpOworCQkJcmV0dXJuXygpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgogCQljYXNlIFR5cGVJZHMuVF9ieXRlIDoKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKIAkJY2FzZSBUeXBlSWRzLlRfaW50IDoKLQkJCXRoaXMuaXJldHVybigpOworCQkJaXJldHVybigpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgotCQkJdGhpcy5scmV0dXJuKCk7CisJCQlscmV0dXJuKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotCQkJdGhpcy5mcmV0dXJuKCk7CisJCQlmcmV0dXJuKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLQkJCXRoaXMuZHJldHVybigpOworCQkJZHJldHVybigpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgogCQkJVHlwZUJpbmRpbmcgYWNjZXNzRXJhc3VyZSA9IGFjY2Vzc01ldGhvZC5yZXR1cm5UeXBlLmVyYXN1cmUoKTsKLQkJCWlmICghdGFyZ2V0TWV0aG9kLnJldHVyblR5cGUuaXNDb21wYXRpYmxlV2l0aChhY2Nlc3NFcmFzdXJlKSkKKwkJCVR5cGVCaW5kaW5nIG1hdGNoID0gdGFyZ2V0TWV0aG9kLnJldHVyblR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShhY2Nlc3NFcmFzdXJlKTsKKwkJCWlmIChtYXRjaCA9PSBudWxsKSB7CiAJCQkJdGhpcy5jaGVja2Nhc3QoYWNjZXNzRXJhc3VyZSk7IC8vIGZvciBicmlkZ2UgbWV0aG9kcwotCQkJdGhpcy5hcmV0dXJuKCk7CisJCQl9CisJCQlhcmV0dXJuKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JTd2l0Y2hUYWJsZShTeW50aGV0aWNNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKIAlDbGFzc1Njb3BlIHNjb3BlID0gKChTb3VyY2VUeXBlQmluZGluZyltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5zY29wZTsKIAlpbml0aWFsaXplTWF4TG9jYWxzKG1ldGhvZEJpbmRpbmcpOwogCWZpbmFsIEJyYW5jaExhYmVsIG51bGxMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCh0aGlzKTsKIAlGaWVsZEJpbmRpbmcgc3ludGhldGljRmllbGRCaW5kaW5nID0gbWV0aG9kQmluZGluZy50YXJnZXRSZWFkRmllbGQ7Ci0KLQl0aGlzLmdldHN0YXRpYyhzeW50aGV0aWNGaWVsZEJpbmRpbmcpOwotCXRoaXMuZHVwKCk7Ci0JdGhpcy5pZm51bGwobnVsbExhYmVsKTsKLQl0aGlzLmFyZXR1cm4oKTsKLQl0aGlzLnB1c2hPblN0YWNrKHN5bnRoZXRpY0ZpZWxkQmluZGluZy50eXBlKTsKKwlmaWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRzdGF0aWMsIHN5bnRoZXRpY0ZpZWxkQmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKKwlkdXAoKTsKKwlpZm51bGwobnVsbExhYmVsKTsKKwlhcmV0dXJuKCk7CisJcHVzaE9uU3RhY2soc3ludGhldGljRmllbGRCaW5kaW5nLnR5cGUpOwogCW51bGxMYWJlbC5wbGFjZSgpOwotCXRoaXMucG9wKCk7CisJcG9wKCk7CiAJUmVmZXJlbmNlQmluZGluZyBlbnVtQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnRhcmdldEVudW1UeXBlOwogCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSBzY29wZS5jcmVhdGVBcnJheVR5cGUoZW51bUJpbmRpbmcsIDEpOwotCXRoaXMuaW52b2tlSmF2YUxhbmdFbnVtVmFsdWVzKGVudW1CaW5kaW5nLCBhcnJheUJpbmRpbmcpOwotCXRoaXMuYXJyYXlsZW5ndGgoKTsKLQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5JTlRfQVJSQVkpOwotCXRoaXMuYXN0b3JlXzAoKTsKKwlpbnZva2VKYXZhTGFuZ0VudW1WYWx1ZXMoZW51bUJpbmRpbmcsIGFycmF5QmluZGluZyk7CisJYXJyYXlsZW5ndGgoKTsKKwluZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuSU5UX0FSUkFZKTsKKwlhc3RvcmVfMCgpOworCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKCIgdGFiIi50b0NoYXJBcnJheSgpLCBzY29wZS5jcmVhdGVBcnJheVR5cGUoVHlwZUJpbmRpbmcuSU5ULCAxKSwgMCwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJYWRkVmFyaWFibGUobG9jYWxWYXJpYWJsZUJpbmRpbmcpOwogCWZpbmFsIEZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IGVudW1CaW5kaW5nLmZpZWxkcygpOwogCWlmIChmaWVsZHMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CkBAIC0yNTQ0LDQwICsyNjUxLDM3IEBACiAJCQkJZmluYWwgQnJhbmNoTGFiZWwgZW5kTGFiZWwgPSBuZXcgQnJhbmNoTGFiZWwodGhpcyk7CiAJCQkJZmluYWwgRXhjZXB0aW9uTGFiZWwgYW55RXhjZXB0aW9uSGFuZGxlciA9IG5ldyBFeGNlcHRpb25MYWJlbCh0aGlzLCBUeXBlQmluZGluZy5MT05HIC8qIHJlcHJlc2VudHMgTm9TdWNoRmllbGRFcnJvciovKTsKIAkJCQlhbnlFeGNlcHRpb25IYW5kbGVyLnBsYWNlU3RhcnQoKTsKLQkJCQl0aGlzLmFsb2FkXzAoKTsKLQkJCQl0aGlzLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOwotCQkJCXRoaXMuaW52b2tlRW51bU9yZGluYWwoZW51bUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJCQlhbG9hZF8wKCk7CisJCQkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBmaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQkJaW52b2tlRW51bU9yZGluYWwoZW51bUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKIAkJCQl0aGlzLmdlbmVyYXRlSW5saW5lZFZhbHVlKGZpZWxkQmluZGluZy5pZCArIDEpOyAvLyB6ZXJvIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgc2VlIGJ1ZyAxNDE4MTAKLQkJCQl0aGlzLmlhc3RvcmUoKTsKKwkJCQlpYXN0b3JlKCk7CiAJCQkJYW55RXhjZXB0aW9uSGFuZGxlci5wbGFjZUVuZCgpOwotCQkJCXRoaXMuZ290b18oZW5kTGFiZWwpOworCQkJCWdvdG9fKGVuZExhYmVsKTsKIAkJCQkvLyBHZW5lcmF0ZSB0aGUgYm9keSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKLQkJCQl0aGlzLnB1c2hPblN0YWNrKHNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCkpOworCQkJCXB1c2hFeGNlcHRpb25PblN0YWNrKFR5cGVCaW5kaW5nLkxPTkcgLypyZXByZXNlbnRzIE5vU3VjaEZpZWxkRXJyb3IqLyk7CiAJCQkJYW55RXhjZXB0aW9uSGFuZGxlci5wbGFjZSgpOwotCQkJCXRoaXMucG9wKCk7IC8vIHdlIGRvbid0IHVzZSBpdCBzbyB3ZSBjYW4gcG9wIGl0Ci0JCQkJZW5kTGFiZWwucGxhY2UoKTsJCQkJCisJCQkJcG9wKCk7IC8vIHdlIGRvbid0IHVzZSBpdCBzbyB3ZSBjYW4gcG9wIGl0CisJCQkJZW5kTGFiZWwucGxhY2UoKTsKIAkJCX0KIAkJfQogCX0KLQl0aGlzLmFsb2FkXzAoKTsKLQl0aGlzLmR1cCgpOwotCXRoaXMucHV0c3RhdGljKHN5bnRoZXRpY0ZpZWxkQmluZGluZyk7CisJYWxvYWRfMCgpOworCWR1cCgpOworCWZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX3B1dHN0YXRpYywgc3ludGhldGljRmllbGRCaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCWFyZXR1cm4oKTsKKwlyZW1vdmVWYXJpYWJsZShsb2NhbFZhcmlhYmxlQmluZGluZyk7CiB9CisKIC8qKgogICogQ29kZSByZXNwb25zaWJsZSB0byBnZW5lcmF0ZSB0aGUgc3VpdGFibGUgY29kZSB0byBzdXBwbHkgdmFsdWVzIGZvciB0aGUgc3ludGhldGljIGVuY2xvc2luZwogICogaW5zdGFuY2UgYXJndW1lbnRzIG9mIGEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBhIG5lc3RlZCB0eXBlLgogICovCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVmFsdWVzKAotCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgCi0JCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgCi0JCUV4cHJlc3Npb24gZW5jbG9zaW5nSW5zdGFuY2UsIAotCQlBU1ROb2RlIGludm9jYXRpb25TaXRlKSB7Ci0KK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VWYWx1ZXMoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgRXhwcmVzc2lvbiBlbmNsb3NpbmdJbnN0YW5jZSwgQVNUTm9kZSBpbnZvY2F0aW9uU2l0ZSkgewogCS8vIHN1cHBseWluZyBlbmNsb3NpbmcgaW5zdGFuY2UgZm9yIHRoZSBhbm9ueW1vdXMgdHlwZSdzIHN1cGVyY2xhc3MKIAlSZWZlcmVuY2VCaW5kaW5nIGNoZWNrZWRUYXJnZXRUeXBlID0gdGFyZ2V0VHlwZS5pc0Fub255bW91c1R5cGUoKSA/IChSZWZlcmVuY2VCaW5kaW5nKXRhcmdldFR5cGUuc3VwZXJjbGFzcygpLmVyYXN1cmUoKSA6IHRhcmdldFR5cGU7CiAJYm9vbGVhbiBoYXNFeHRyYUVuY2xvc2luZ0luc3RhbmNlID0gZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbDsKLQlpZiAoaGFzRXh0cmFFbmNsb3NpbmdJbnN0YW5jZSAKKwlpZiAoaGFzRXh0cmFFbmNsb3NpbmdJbnN0YW5jZQogCQkJJiYgKCFjaGVja2VkVGFyZ2V0VHlwZS5pc05lc3RlZFR5cGUoKSB8fCBjaGVja2VkVGFyZ2V0VHlwZS5pc1N0YXRpYygpKSkgewogCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oZW5jbG9zaW5nSW5zdGFuY2UsIGNoZWNrZWRUYXJnZXRUeXBlKTsKIAkJcmV0dXJuOwpAQCAtMjYwMSwxMCArMjcwNSwxMCBAQAogCQl9IGVsc2UgewogCQkJLy9jb21wbGlhbmNlID49IEpESzFfNQogCQkJZGVueUVuY2xvc2luZ0FyZ0luQ29uc3RydWN0b3JDYWxsID0gKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24KLQkJCQkJfHwgaW52b2NhdGlvblNpdGUgaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCAmJiAoKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKWludm9jYXRpb25TaXRlKS5pc1N1cGVyQWNjZXNzKCkpIAorCQkJCQl8fCBpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsICYmICgoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpaW52b2NhdGlvblNpdGUpLmlzU3VwZXJBY2Nlc3MoKSkKIAkJCQkmJiAhdGFyZ2V0VHlwZS5pc0xvY2FsVHlwZSgpOwogCQl9Ci0JCQorCiAJCWJvb2xlYW4gY29tcGx5VG8xNCA9IGNvbXBsaWFuY2UgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgc3ludGhldGljQXJnVHlwZSA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXNbaV07CkBAIC0yNjE4LDEwICsyNzIyLDEwIEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgoCi0JCQkJCQlzeW50aGV0aWNBcmdUeXBlLCAKKwkJCQkJCXN5bnRoZXRpY0FyZ1R5cGUsCiAJCQkJCQlmYWxzZSAvKm5vdCBvbmx5IGV4YWN0IG1hdGNoICh0aGF0IGlzLCBhbGxvdyBjb21wYXRpYmxlKSovLAogCQkJCQkJZGVueUVuY2xvc2luZ0FyZ0luQ29uc3RydWN0b3JDYWxsKTsKLQkJCQl0aGlzLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgaW52b2NhdGlvblNpdGUsIHN5bnRoZXRpY0FyZ1R5cGUsIGN1cnJlbnRTY29wZSk7CisJCQkJZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCBpbnZvY2F0aW9uU2l0ZSwgc3ludGhldGljQXJnVHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCX0KIAkJfQogCQlpZiAoaGFzRXh0cmFFbmNsb3NpbmdJbnN0YW5jZSl7CkBAIC0yNjI5LDMwICsyNzMzLDMxIEBACiAJCX0KIAl9CiB9CisKIC8qKgogICogQ29kZSByZXNwb25zaWJsZSB0byBnZW5lcmF0ZSB0aGUgc3VpdGFibGUgY29kZSB0byBzdXBwbHkgdmFsdWVzIGZvciB0aGUgc3ludGhldGljIG91dGVyIGxvY2FsCiAgKiB2YXJpYWJsZSBhcmd1bWVudHMgb2YgYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIGEgbmVzdGVkIHR5cGUuCiAgKiAoYnVnIDI2MTIyKSAtIHN5bnRoZXRpYyB2YWx1ZXMgZm9yIG91dGVyIGxvY2FscyBtdXN0IGJlIHBhc3NlZCBhZnRlciB1c2VyIGFyZ3VtZW50cywgZS5nLiBuZXcgWChpID0gMSl7fQogICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY091dGVyQXJndW1lbnRWYWx1ZXMoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgQVNUTm9kZSBpbnZvY2F0aW9uU2l0ZSkgewotCiAJLy8gZ2VuZXJhdGUgdGhlIHN5bnRoZXRpYyBvdXRlciBhcmd1bWVudHMgdGhlbgogCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmd1bWVudHNbXTsKIAlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IHRhcmdldFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpKSAhPSBudWxsKSB7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHRhcmdldFZhcmlhYmxlID0gc3ludGhldGljQXJndW1lbnRzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZTsKIAkJCVZhcmlhYmxlQmluZGluZ1tdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCh0YXJnZXRWYXJpYWJsZSk7Ci0JCQl0aGlzLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgaW52b2NhdGlvblNpdGUsIHRhcmdldFZhcmlhYmxlLCBjdXJyZW50U2NvcGUpOworCQkJZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCBpbnZvY2F0aW9uU2l0ZSwgdGFyZ2V0VmFyaWFibGUsIGN1cnJlbnRTY29wZSk7CiAJCX0KIAl9CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlVW5ib3hpbmdDb252ZXJzaW9uKGludCB1bmJveGVkVHlwZUlEKSB7CiAJc3dpdGNoICh1bmJveGVkVHlwZUlEKSB7CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgogCQkJLy8gaW52b2tldmlydHVhbDogYnl0ZVZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQnl0ZUNvbnN0YW50UG9vbE5hbWUsCiAJCQkJCUNvbnN0YW50UG9vbC5CWVRFVkFMVUVfQllURV9NRVRIT0RfTkFNRSwKQEAgLTI2NjAsOSArMjc2NSw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJLy8gaW52b2tldmlydHVhbDogc2hvcnRWYWx1ZSgpCi0JCQl0aGlzLmludm9rZSgKKwkJCWludm9rZSgKIAkJCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCQkJMCwgLy8gYXJnQ291bnQKKwkJCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ1Nob3J0Q29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLlNIT1JUVkFMVUVfU0hPUlRfTUVUSE9EX05BTUUsCkBAIC0yNjcwLDkgKzI3NzUsOSBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgogCQkJLy8gaW52b2tldmlydHVhbDogY2hhclZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLkNIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EX05BTUUsCkBAIC0yNjgwLDkgKzI3ODUsOSBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBpbnRWYWx1ZSgpCi0JCQl0aGlzLmludm9rZSgKKwkJCWludm9rZSgKIAkJCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCQkJMCwgLy8gYXJnQ291bnQKKwkJCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0ludGVnZXJDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuSU5UVkFMVUVfSU5URUdFUl9NRVRIT0RfTkFNRSwKQEAgLTI2OTAsOSArMjc5NSw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBsb25nVmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMiwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdMb25nQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLkxPTkdWQUxVRV9MT05HX01FVEhPRF9OQU1FLApAQCAtMjcwMCw5ICsyODA1LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9mbG9hdCA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBmbG9hdFZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfTkFNRSwKQEAgLTI3MTAsOSArMjgxNSw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKIAkJCS8vIGludm9rZXZpcnR1YWw6IGRvdWJsZVZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTIsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nRG91YmxlQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLkRPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RfTkFNRSwKQEAgLTI3MjAsMTUgKzI4MjUsMTYgQEAKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKIAkJCS8vIGludm9rZXZpcnR1YWw6IGJvb2xlYW5WYWx1ZSgpCi0JCQl0aGlzLmludm9rZSgKKwkJCWludm9rZSgKIAkJCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCQkJMCwgLy8gYXJnQ291bnQKKwkJCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0Jvb2xlYW5Db25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX05BTUUsCiAJCQkJCUNvbnN0YW50UG9vbC5CT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfU0lHTkFUVVJFKTsKIAl9CiB9CisKIC8qCiAgKiBXaWRlIGNvbmRpdGlvbmFsIGJyYW5jaCBjb21wYXJlLCBpbXByb3ZlZCBieSBzd2FwcGluZyBjb21wYXJpc29uIG9wY29kZQogICogICBpZmVxIFdpZGVUYXJnZXQKQEAgLTI3MzksMjIgKzI4NDUsMjMgQEAKICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChieXRlIHJldmVydGVkT3Bjb2RlLCBCcmFuY2hMYWJlbCB3aWRlVGFyZ2V0KSB7CiAJCUJyYW5jaExhYmVsIGludGVybWVkaWF0ZSA9IG5ldyBCcmFuY2hMYWJlbCh0aGlzKTsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSByZXZlcnRlZE9wY29kZTsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gcmV2ZXJ0ZWRPcGNvZGU7CiAJCWludGVybWVkaWF0ZS5icmFuY2goKTsKLQkJdGhpcy5nb3RvX3cod2lkZVRhcmdldCk7CisJCWdvdG9fdyh3aWRlVGFyZ2V0KTsKIAkJaW50ZXJtZWRpYXRlLnBsYWNlKCk7CiB9CisKIHB1YmxpYyB2b2lkIGdldEJhc2VUeXBlVmFsdWUoaW50IGJhc2VUeXBlSUQpIHsKIAlzd2l0Y2ggKGJhc2VUeXBlSUQpIHsKIAkJY2FzZSBUeXBlSWRzLlRfYnl0ZSA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBieXRlVmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdCeXRlQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLkJZVEVWQUxVRV9CWVRFX01FVEhPRF9OQU1FLApAQCAtMjc2Miw5ICsyODY5LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBzaG9ydFZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfTkFNRSwKQEAgLTI3NzIsOSArMjg3OSw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBjaGFyVmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDaGFyYWN0ZXJDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuQ0hBUlZBTFVFX0NIQVJBQ1RFUl9NRVRIT0RfTkFNRSwKQEAgLTI3ODIsOSArMjg4OSw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfaW50IDoKIAkJCS8vIGludm9rZXZpcnR1YWw6IGludFZhbHVlKCkKLQkJCXRoaXMuaW52b2tlKAorCQkJaW52b2tlKAogCQkJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJCQkwLCAvLyBhcmdDb3VudAorCQkJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUsCiAJCQkJCUNvbnN0YW50UG9vbC5JTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FLApAQCAtMjc5Miw5ICsyODk5LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKIAkJCS8vIGludm9rZXZpcnR1YWw6IGxvbmdWYWx1ZSgpCi0JCQl0aGlzLmludm9rZSgKKwkJCWludm9rZSgKIAkJCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCQkJMCwgLy8gYXJnQ291bnQKKwkJCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJCQkyLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0xvbmdDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuTE9OR1ZBTFVFX0xPTkdfTUVUSE9EX05BTUUsCkBAIC0yODAyLDkgKzI5MDksOSBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCS8vIGludm9rZXZpcnR1YWw6IGZsb2F0VmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdGbG9hdENvbnN0YW50UG9vbE5hbWUsCiAJCQkJCUNvbnN0YW50UG9vbC5GTE9BVFZBTFVFX0ZMT0FUX01FVEhPRF9OQU1FLApAQCAtMjgxMiw5ICsyOTE5LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgogCQkJLy8gaW52b2tldmlydHVhbDogZG91YmxlVmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMiwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdEb3VibGVDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuRE9VQkxFVkFMVUVfRE9VQkxFX01FVEhPRF9OQU1FLApAQCAtMjgyMiwxNjYgKzI5MjksMTg5IEBACiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAJCQkvLyBpbnZva2V2aXJ0dWFsOiBib29sZWFuVmFsdWUoKQotCQkJdGhpcy5pbnZva2UoCisJCQlpbnZva2UoCiAJCQkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkJCTAsIC8vIGFyZ0NvdW50CisJCQkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLkJPT0xFQU5WQUxVRV9CT09MRUFOX01FVEhPRF9OQU1FLAogCQkJCQlDb25zdGFudFBvb2wuQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSk7CiAJfQogfQorCiBmaW5hbCBwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRzKCkgewogCWJ5dGVbXSBjb250ZW50czsKLQlTeXN0ZW0uYXJyYXljb3B5KGJDb2RlU3RyZWFtLCAwLCBjb250ZW50cyA9IG5ldyBieXRlW3Bvc2l0aW9uXSwgMCwgcG9zaXRpb24pOworCVN5c3RlbS5hcnJheWNvcHkodGhpcy5iQ29kZVN0cmVhbSwgMCwgY29udGVudHMgPSBuZXcgYnl0ZVt0aGlzLnBvc2l0aW9uXSwgMCwgdGhpcy5wb3NpdGlvbik7CiAJcmV0dXJuIGNvbnRlbnRzOwogfQotcHVibGljIHZvaWQgZ2V0ZmllbGQoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRmaWVsZDoiK2ZpZWxkQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQlpbnQgcmV0dXJuVHlwZVNpemUgPSAxOwotCWlmICgoZmllbGRCaW5kaW5nLnR5cGUuaWQgPT0gVHlwZUlkcy5UX2RvdWJsZSkgfHwgKGZpZWxkQmluZGluZy50eXBlLmlkID09IFR5cGVJZHMuVF9sb25nKSkgewotCQlyZXR1cm5UeXBlU2l6ZSA9IDI7CisKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSBzdWJzdGl0dXRlZCB0byBvcmlnaW5hbCBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBhcyB0aGUgcHJvcGVyIHJlY2VpdmVyIHR5cGUKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUKKyAqIEBwYXJhbSBjb2RlZ2VuQmluZGluZworICogQHBhcmFtIGFjdHVhbFJlY2VpdmVyVHlwZQorICogQHBhcmFtIGlzSW1wbGljaXRUaGlzUmVjZWl2ZXIKKyAqIEByZXR1cm4gdGhlIHJlY2VpdmVyIHR5cGUgdG8gdXNlIGluIGNvbnN0YW50IHBvb2wKKyAqLworcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyBnZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhTY29wZSBjdXJyZW50U2NvcGUsIEZpZWxkQmluZGluZyBjb2RlZ2VuQmluZGluZywgVHlwZUJpbmRpbmcgYWN0dWFsUmVjZWl2ZXJUeXBlLCBib29sZWFuIGlzSW1wbGljaXRUaGlzUmVjZWl2ZXIpIHsKKwlSZWZlcmVuY2VCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBmaWVsZCBhY2Nlc3MuCisJaWYgKGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzICE9IGFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkKKwkJCSYmICFhY3R1YWxSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQorCQkJJiYgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKKwkJCSYmIGNvZGVnZW5CaW5kaW5nLmNvbnN0YW50KCkgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOworCQlpZiAoKG9wdGlvbnMudGFyZ2V0SkRLID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzIKKwkJCQkJJiYgKG9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgfHwgIShpc0ltcGxpY2l0VGhpc1JlY2VpdmVyICYmIGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKQorCQkJCQkmJiBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcy5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcworCQkJCXx8ICFjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSB7CisKKwkJCXJldHVybiBhY3R1YWxSZWNlaXZlclR5cGUuZXJhc3VyZSgpOworCQl9CisJfQkKKwlyZXR1cm4gY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3M7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSBzdWJzdGl0dXRlZCB0byBvcmlnaW5hbCBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBhcyB0aGUgcHJvcGVyIHJlY2VpdmVyIHR5cGUKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUKKyAqIEBwYXJhbSBjb2RlZ2VuQmluZGluZworICogQHBhcmFtIGFjdHVhbFJlY2VpdmVyVHlwZQorICogQHBhcmFtIGlzSW1wbGljaXRUaGlzUmVjZWl2ZXIKKyAqIEByZXR1cm4gdGhlIHJlY2VpdmVyIHR5cGUgdG8gdXNlIGluIGNvbnN0YW50IHBvb2wKKyAqLworcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyBnZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhTY29wZSBjdXJyZW50U2NvcGUsIE1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcsIFR5cGVCaW5kaW5nIGFjdHVhbFJlY2VpdmVyVHlwZSwgYm9vbGVhbiBpc0ltcGxpY2l0VGhpc1JlY2VpdmVyKSB7CisJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkvLyBQb3N0IDEuNC4wIHRhcmdldCwgYXJyYXkgY2xvbmUoKSBpbnZvY2F0aW9ucyBhcmUgcXVhbGlmaWVkIHdpdGggYXJyYXkgdHlwZQorCS8vIFRoaXMgaXMgaGFuZGxlZCBpbiBhcnJheSB0eXBlICNjbG9uZSBtZXRob2QgYmluZGluZyByZXNvbHV0aW9uIChzZWUgU2NvcGUgYW5kIFVwZGF0ZWRNZXRob2RCaW5kaW5nKQorCWlmIChjb2RlZ2VuQmluZGluZyA9PSBjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5hcnJheUNsb25lKSB7CisJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOworCQlpZiAob3B0aW9ucy5zb3VyY2VMZXZlbCA+IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgKSB7CisJCQljb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IGFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KKwkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4KKwkJaWYgKGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzICE9IGFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkgJiYgIWFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKTsKKwkJCWlmICgob3B0aW9ucy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMgorCQkJCQkJJiYgKG9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgfHwgIShpc0ltcGxpY2l0VGhpc1JlY2VpdmVyICYmIGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKQorCQkJCQkJJiYgY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSAvLyBubyBjaGFuZ2UgZm9yIE9iamVjdCBtZXRob2RzCisJCQkJCXx8ICFjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSB7CisJCQkJY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBhY3R1YWxSZWNlaXZlclR5cGUuZXJhc3VyZSgpOworCQkJfQorCQl9CQkJCQogCX0KLQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAotCQkJT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsCi0JCQlyZXR1cm5UeXBlU2l6ZSwKLQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKLQkJCWZpZWxkQmluZGluZy5uYW1lLAotCQkJZmllbGRCaW5kaW5nLnR5cGUpOworCXJldHVybiBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzczsKIH0KIHByb3RlY3RlZCBpbnQgZ2V0UG9zaXRpb24oKSB7CiAJcmV0dXJuIHRoaXMucG9zaXRpb247CiB9Ci1wdWJsaWMgdm9pZCBnZXRzdGF0aWMoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRzdGF0aWM6IitmaWVsZEJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JaW50IHJldHVyblR5cGVTaXplID0gMTsKLQlpZiAoKGZpZWxkQmluZGluZy50eXBlLmlkID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUeXBlSWRzLlRfbG9uZykpIHsKLQkJcmV0dXJuVHlwZVNpemUgPSAyOwotCX0KLQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAotCQkJT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLAotCQkJcmV0dXJuVHlwZVNpemUsCi0JCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCi0JCQlmaWVsZEJpbmRpbmcubmFtZSwKLQkJCWZpZWxkQmluZGluZy50eXBlKTsKLX0KKwogcHVibGljIHZvaWQgZ2V0VFlQRShpbnQgYmFzZVR5cGVJRCkgewotCWNvdW50TGFiZWxzID0gMDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKIAlzd2l0Y2ggKGJhc2VUeXBlSUQpIHsKIAkJY2FzZSBUeXBlSWRzLlRfYnl0ZSA6Ci0JCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5CeXRlLlRZUEUJCQkKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRzdGF0aWM6IGphdmEubGFuZy5CeXRlLlRZUEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJhdGVGaWVsZEFjY2VzcygKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkJ5dGUuVFlQRQorCQkJZmllbGRBY2Nlc3MoCiAJCQkJCU9wY29kZXMuT1BDX2dldHN0YXRpYywKLQkJCQkJMSwKKwkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdCeXRlQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLlRZUEUsCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6Ci0JCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5TaG9ydC5UWVBFCQkJCi0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Z2V0c3RhdGljOiBqYXZhLmxhbmcuU2hvcnQuVFlQRSIpOyAvLyROT04tTkxTLTEkCi0JCQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAorCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuU2hvcnQuVFlQRQorCQkJZmllbGRBY2Nlc3MoCiAJCQkJCU9wY29kZXMuT1BDX2dldHN0YXRpYywKLQkJCQkJMSwKKwkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdTaG9ydENvbnN0YW50UG9vbE5hbWUsCiAJCQkJCUNvbnN0YW50UG9vbC5UWVBFLAogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0JCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5DaGFyYWN0ZXIuVFlQRQkJCQotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGdldHN0YXRpYzogamF2YS5sYW5nLkNoYXJhY3Rlci5UWVBFIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlRmllbGRBY2Nlc3MoCisJCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5DaGFyYWN0ZXIuVFlQRQorCQkJZmllbGRBY2Nlc3MoCiAJCQkJCU9wY29kZXMuT1BDX2dldHN0YXRpYywKLQkJCQkJMSwKKwkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDaGFyYWN0ZXJDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuVFlQRSwKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NTaWduYXR1cmUpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6Ci0JCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5JbnRlZ2VyLlRZUEUJCQkKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRzdGF0aWM6IGphdmEubGFuZy5JbnRlZ2VyLlRZUEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJhdGVGaWVsZEFjY2VzcygKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkludGVnZXIuVFlQRQorCQkJZmllbGRBY2Nlc3MoCiAJCQkJCU9wY29kZXMuT1BDX2dldHN0YXRpYywKLQkJCQkJMSwKKwkJCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdJbnRlZ2VyQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLlRZUEUsCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkxvbmcuVFlQRQkJCQotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGdldHN0YXRpYzogamF2YS5sYW5nLkxvbmcuVFlQRSIpOyAvLyROT04tTkxTLTEkCi0JCQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAorCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuTG9uZy5UWVBFCisJCQlmaWVsZEFjY2VzcygKIAkJCQkJT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLAotCQkJCQkxLAorCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0xvbmdDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuVFlQRSwKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NTaWduYXR1cmUpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKLQkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkZsb2F0LlRZUEUJCQkKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRzdGF0aWM6IGphdmEubGFuZy5GbG9hdC5UWVBFIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlRmllbGRBY2Nlc3MoCisJCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5GbG9hdC5UWVBFCisJCQlmaWVsZEFjY2VzcygKIAkJCQkJT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLAotCQkJCQkxLAorCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0Zsb2F0Q29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLlRZUEUsCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgotCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuRG91YmxlLlRZUEUJCQkKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRnZXRzdGF0aWM6IGphdmEubGFuZy5Eb3VibGUuVFlQRSIpOyAvLyROT04tTkxTLTEkCi0JCQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAorCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuRG91YmxlLlRZUEUKKwkJCWZpZWxkQWNjZXNzKAogCQkJCQlPcGNvZGVzLk9QQ19nZXRzdGF0aWMsCi0JCQkJCTEsCisJCQkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nRG91YmxlQ29uc3RhbnRQb29sTmFtZSwKIAkJCQkJQ29uc3RhbnRQb29sLlRZUEUsCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKLQkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkJvb2xlYW4uVFlQRQkJCQotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGdldHN0YXRpYzogamF2YS5sYW5nLkJvb2xlYW4uVFlQRSIpOyAvLyROT04tTkxTLTEkCi0JCQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAorCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFCisJCQlmaWVsZEFjY2VzcygKIAkJCQkJT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLAotCQkJCQkxLAorCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0Jvb2xlYW5Db25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuVFlQRSwKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NTaWduYXR1cmUpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX3ZvaWQgOgogCQkJLy8gZ2V0c3RhdGljOiBqYXZhLmxhbmcuVm9pZC5UWVBFCi0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Z2V0c3RhdGljOiBqYXZhLmxhbmcuVm9pZC5UWVBFIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlRmllbGRBY2Nlc3MoCisJCQlmaWVsZEFjY2VzcygKIAkJCQkJT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLAotCQkJCQkxLAorCQkJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ1ZvaWRDb25zdGFudFBvb2xOYW1lLAogCQkJCQlDb25zdGFudFBvb2wuVFlQRSwKIAkJCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NTaWduYXR1cmUpOwogCQkJYnJlYWs7CiAJfQogfQorCiAvKioKICAqIFdlIGRpZG4ndCBjYWxsIGl0IGdvdG8sIGJlY2F1c2UgdGhlcmUgaXMgYSBjb25mbGl0IHdpdGggdGhlIGdvdG8ga2V5d29yZAogICovCiBwdWJsaWMgdm9pZCBnb3RvXyhCcmFuY2hMYWJlbCBsYWJlbCkgewogCWlmICh0aGlzLndpZGVNb2RlKSB7Ci0JCXRoaXMuZ290b193KGxhYmVsKTsKKwkJZ290b193KGxhYmVsKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Z290bzoiK2xhYmVsKTsgLy8kTk9OLU5MUy0xJAotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlib29sZWFuIGNoYWluZWQgPSB0aGlzLmlubGluZUZvcndhcmRSZWZlcmVuY2VzRnJvbUxhYmVsc1RhcmdldGluZyhsYWJlbCwgcG9zaXRpb24pOwotCWlmIChERUJVRyAmJiBjaGFpbmVkKSB7Ci0JCWlmIChERUJVRykgewotCQkJaWYgKHRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPT0gdGhpcy5wb3NpdGlvbikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0XHQ8YnJhbmNoIGNoYWluaW5nIC0gZ290byBlbGltaW5hdGVkIDogIit0aGlzLnBvc2l0aW9uKyIsIitsYWJlbCsiPiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRcdDxicmFuY2ggY2hhaW5pbmcgLSBnb3RvIGlzc3VlZCA6ICIrdGhpcy5wb3NpdGlvbisiLCIrbGFiZWwrIj4iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQkJCi0JfQorCWJvb2xlYW4gY2hhaW5lZCA9IGlubGluZUZvcndhcmRSZWZlcmVuY2VzRnJvbUxhYmVsc1RhcmdldGluZyhsYWJlbCwgdGhpcy5wb3NpdGlvbik7CiAJLyoKIAkgUG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBjb2RlIHN1Y2ggYXM6CiAJIHB1YmxpYyBPYmplY3QgZm9vKCkgewpAQCAtMzAwNSw2MDggKzMxMzUsNjg2IEBACiAJCQlpbnRbXSBmb3J3YXJkUmVmcyA9IGxhYmVsLmZvcndhcmRSZWZlcmVuY2VzKCk7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50KCk7IGkgPCBtYXg7IGkrKykgewogCQkJCXRoaXMud3JpdGVQb3NpdGlvbihsYWJlbCwgZm9yd2FyZFJlZnNbaV0pOwotCQkJfQkJCQkKKwkJCX0KIAkJCXRoaXMuY291bnRMYWJlbHMgPSAwOyAvLyBiYWNrd2FyZCBqdW1wLCBubyBmdXJ0aGVyIGNoYWluaW5nIGFsbG93ZWQKIAkJfQotLy8JCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSAtMTsKIAkJcmV0dXJuOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2dvdG87CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19nb3RvOwogCWxhYmVsLmJyYW5jaCgpOwogCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwogfQorCiBwdWJsaWMgdm9pZCBnb3RvX3coQnJhbmNoTGFiZWwgbGFiZWwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0Z290b3c6IitsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19nb3RvX3c7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19nb3RvX3c7CiAJbGFiZWwuYnJhbmNoV2lkZSgpOwotCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwkKKwl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsKIH0KKwogcHVibGljIHZvaWQgaTJiKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpMmIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pMmI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pMmI7CiB9CisKIHB1YmxpYyB2b2lkIGkyYygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aTJjIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaTJjOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaTJjOwogfQorCiBwdWJsaWMgdm9pZCBpMmQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGkyZCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaTJkOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaTJkOwogfQorCiBwdWJsaWMgdm9pZCBpMmYoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGkyZiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2kyZjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2kyZjsKIH0KKwogcHVibGljIHZvaWQgaTJsKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpMmwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2kybDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2kybDsKIH0KKwogcHVibGljIHZvaWQgaTJzKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpMnMiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pMnM7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pMnM7CiB9CisKIHB1YmxpYyB2b2lkIGlhZGQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlhZGQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWFkZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lhZGQ7CiB9CisKIHB1YmxpYyB2b2lkIGlhbG9hZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWFsb2FkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lhbG9hZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lhbG9hZDsKIH0KKwogcHVibGljIHZvaWQgaWFuZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWFuZCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pYW5kOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWFuZDsKIH0KKwogcHVibGljIHZvaWQgaWFzdG9yZSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWFzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMzsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAzOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pYXN0b3JlOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWFzdG9yZTsKIH0KKwogcHVibGljIHZvaWQgaWNvbnN0XzAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGljb25zdF8wIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfMDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ljb25zdF8wOwogfQorCiBwdWJsaWMgdm9pZCBpY29uc3RfMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWNvbnN0XzEiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ljb25zdF8xOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWNvbnN0XzE7CiB9CisKIHB1YmxpYyB2b2lkIGljb25zdF8yKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpY29uc3RfMiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWNvbnN0XzI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfMjsKIH0KIHB1YmxpYyB2b2lkIGljb25zdF8zKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpY29uc3RfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWNvbnN0XzM7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfMzsKIH0KKwogcHVibGljIHZvaWQgaWNvbnN0XzQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGljb25zdF80Iik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfNDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ljb25zdF80OwogfQorCiBwdWJsaWMgdm9pZCBpY29uc3RfNSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWNvbnN0XzUiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ljb25zdF81OworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWNvbnN0XzU7CiB9CisKIHB1YmxpYyB2b2lkIGljb25zdF9tMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWNvbnN0X20xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfbTE7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pY29uc3RfbTE7CiB9CisKIHB1YmxpYyB2b2lkIGlkaXYoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlkaXYiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWRpdjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lkaXY7CiB9CisKIHB1YmxpYyB2b2lkIGlmX2FjbXBlcShCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZfYWNtcGVxOiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLT0yOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC09MjsKIAlpZiAodGhpcy53aWRlTW9kZSkgewogCQlnZW5lcmF0ZVdpZGVSZXZlcnRlZENvbmRpdGlvbmFsQnJhbmNoKE9wY29kZXMuT1BDX2lmX2FjbXBuZSwgbGJsKTsKLQl9IGVsc2UgewkKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2FjbXBlcTsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZfYWNtcGVxOwogCQlsYmwuYnJhbmNoKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpZl9hY21wbmUoQnJhbmNoTGFiZWwgbGJsKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlmX2FjbXBuZToiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC09MjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtPTI7CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZl9hY21wZXEsIGxibCk7Ci0JfSBlbHNlIHsJCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZl9hY21wbmU7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2FjbXBuZTsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogcHVibGljIHZvaWQgaWZfaWNtcGVxKEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpZl9jbXBlcToiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOwogCWlmICh0aGlzLndpZGVNb2RlKSB7CiAJCWdlbmVyYXRlV2lkZVJldmVydGVkQ29uZGl0aW9uYWxCcmFuY2goT3Bjb2Rlcy5PUENfaWZfaWNtcG5lLCBsYmwpOwotCX0gZWxzZSB7CQotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCX0gZWxzZSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZfaWNtcGVxOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZl9pY21wZXE7CiAJCWxibC5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlmX2ljbXBnZShCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZfaWNtcGdlOiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZl9pY21wbHQsIGxibCk7Ci0JfSBlbHNlIHsJCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZl9pY21wZ2U7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2ljbXBnZTsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogcHVibGljIHZvaWQgaWZfaWNtcGd0KEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpZl9pY21wZ3Q6IitsYmwpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKIAlpZiAodGhpcy53aWRlTW9kZSkgewogCQlnZW5lcmF0ZVdpZGVSZXZlcnRlZENvbmRpdGlvbmFsQnJhbmNoKE9wY29kZXMuT1BDX2lmX2ljbXBsZSwgbGJsKTsKLQl9IGVsc2UgewkKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2ljbXBndDsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZfaWNtcGd0OwogCQlsYmwuYnJhbmNoKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpZl9pY21wbGUoQnJhbmNoTGFiZWwgbGJsKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlmX2ljbXBsZToiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOwogCWlmICh0aGlzLndpZGVNb2RlKSB7CiAJCWdlbmVyYXRlV2lkZVJldmVydGVkQ29uZGl0aW9uYWxCcmFuY2goT3Bjb2Rlcy5PUENfaWZfaWNtcGd0LCBsYmwpOwotCX0gZWxzZSB7CQotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCX0gZWxzZSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZfaWNtcGxlOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZl9pY21wbGU7CiAJCWxibC5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlmX2ljbXBsdChCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZfaWNtcGx0OiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZl9pY21wZ2UsIGxibCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZl9pY21wbHQ7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2ljbXBsdDsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogcHVibGljIHZvaWQgaWZfaWNtcG5lKEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpZl9pY21wbmU6IitsYmwpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKIAlpZiAodGhpcy53aWRlTW9kZSkgewogCQlnZW5lcmF0ZVdpZGVSZXZlcnRlZENvbmRpdGlvbmFsQnJhbmNoKE9wY29kZXMuT1BDX2lmX2ljbXBlcSwgbGJsKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmX2ljbXBuZTsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZfaWNtcG5lOwogCQlsYmwuYnJhbmNoKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpZmVxKEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpZmVxOiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZm5lLCBsYmwpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZlcTsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZlcTsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogcHVibGljIHZvaWQgaWZnZShCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZnZToiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOwogCWlmICh0aGlzLndpZGVNb2RlKSB7CiAJCWdlbmVyYXRlV2lkZVJldmVydGVkQ29uZGl0aW9uYWxCcmFuY2goT3Bjb2Rlcy5PUENfaWZsdCwgbGJsKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmZ2U7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmZ2U7CiAJCWxibC5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlmZ3QoQnJhbmNoTGFiZWwgbGJsKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlmZ3Q6IitsYmwpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKIAlpZiAodGhpcy53aWRlTW9kZSkgewogCQlnZW5lcmF0ZVdpZGVSZXZlcnRlZENvbmRpdGlvbmFsQnJhbmNoKE9wY29kZXMuT1BDX2lmbGUsIGxibCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZmd0OworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZmd0OwogCQlsYmwuYnJhbmNoKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpZmxlKEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpZmxlOiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZmd0LCBsYmwpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZsZTsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZsZTsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogcHVibGljIHZvaWQgaWZsdChCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZsdDoiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOwogCWlmICh0aGlzLndpZGVNb2RlKSB7CiAJCWdlbmVyYXRlV2lkZVJldmVydGVkQ29uZGl0aW9uYWxCcmFuY2goT3Bjb2Rlcy5PUENfaWZnZSwgbGJsKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmbHQ7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmbHQ7CiAJCWxibC5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlmbmUoQnJhbmNoTGFiZWwgbGJsKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlmbmU6IitsYmwpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKIAlpZiAodGhpcy53aWRlTW9kZSkgewogCQlnZW5lcmF0ZVdpZGVSZXZlcnRlZENvbmRpdGlvbmFsQnJhbmNoKE9wY29kZXMuT1BDX2lmZXEsIGxibCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZm5lOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZm5lOwogCQlsYmwuYnJhbmNoKCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpZm5vbm51bGwoQnJhbmNoTGFiZWwgbGJsKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlmbm9ubnVsbDoiK2xibCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOwogCWlmICh0aGlzLndpZGVNb2RlKSB7CiAJCWdlbmVyYXRlV2lkZVJldmVydGVkQ29uZGl0aW9uYWxCcmFuY2goT3Bjb2Rlcy5PUENfaWZudWxsLCBsYmwpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWZub25udWxsOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZm5vbm51bGw7CiAJCWxibC5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlmbnVsbChCcmFuY2hMYWJlbCBsYmwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aWZudWxsOiIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CiAJaWYgKHRoaXMud2lkZU1vZGUpIHsKIAkJZ2VuZXJhdGVXaWRlUmV2ZXJ0ZWRDb25kaXRpb25hbEJyYW5jaChPcGNvZGVzLk9QQ19pZm5vbm51bGwsIGxibCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pZm51bGw7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lmbnVsbDsKIAkJbGJsLmJyYW5jaCgpOwogCX0KIH0KKwogZmluYWwgcHVibGljIHZvaWQgaWluYyhpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpaW5jOiIraW5kZXgrIiwiK3ZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JY291bnRMYWJlbHMgPSAwOworCXRoaXMuY291bnRMYWJlbHMgPSAwOwogCWlmICgoaW5kZXggPiAyNTUpIHx8ICh2YWx1ZSA8IC0xMjggfHwgdmFsdWUgPiAxMjcpKSB7IC8vIGhhdmUgdG8gd2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lpbmM7CisJCXRoaXMucG9zaXRpb24gKz0gMjsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19paW5jOwogCQl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOwogCQl3cml0ZVNpZ25lZFNob3J0KHZhbHVlKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWluYzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4OwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7CisJCXRoaXMucG9zaXRpb24gKz0gMzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lpbmM7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpbG9hZChpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbG9hZDoiK2lBcmcpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAobWF4TG9jYWxzIDw9IGlBcmcpIHsKLQkJbWF4TG9jYWxzID0gaUFyZyArIDE7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IGlBcmcpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSBpQXJnICsgMTsKIAl9Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pbG9hZDsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkOwogCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWxvYWQ7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGlsb2FkXzAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlsb2FkXzAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKG1heExvY2FscyA8PSAwKSB7Ci0JCW1heExvY2FscyA9IDE7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDApIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAxOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWxvYWRfMDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkXzA7CiB9CisKIHB1YmxpYyB2b2lkIGlsb2FkXzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlsb2FkXzEiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKG1heExvY2FscyA8PSAxKSB7Ci0JCW1heExvY2FscyA9IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDEpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAyOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWxvYWRfMTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkXzE7CiB9CisKIHB1YmxpYyB2b2lkIGlsb2FkXzIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlsb2FkXzIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKG1heExvY2FscyA8PSAyKSB7Ci0JCW1heExvY2FscyA9IDM7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDIpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAzOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWxvYWRfMjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkXzI7CiB9CisKIHB1YmxpYyB2b2lkIGlsb2FkXzMoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlsb2FkXzMiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKG1heExvY2FscyA8PSAzKSB7Ci0JCW1heExvY2FscyA9IDQ7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoKys7CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDMpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA0OwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaWxvYWRfMzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lsb2FkXzM7CiB9CisKIHB1YmxpYyB2b2lkIGltdWwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGltdWwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaW11bDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ltdWw7CiB9CisKIHB1YmxpYyBpbnQgaW5kZXhPZlNhbWVMaW5lRW50cnlTaW5jZVBDKGludCBwYywgaW50IGxpbmUpIHsKLQlmb3IgKGludCBpbmRleCA9IHBjLCBtYXggPSBwY1RvU291cmNlTWFwU2l6ZTsgaW5kZXggPCBtYXg7IGluZGV4Kz0yKSB7Ci0JCWlmIChwY1RvU291cmNlTWFwW2luZGV4KzFdID09IGxpbmUpCisJZm9yIChpbnQgaW5kZXggPSBwYywgbWF4ID0gdGhpcy5wY1RvU291cmNlTWFwU2l6ZTsgaW5kZXggPCBtYXg7IGluZGV4Kz0yKSB7CisJCWlmICh0aGlzLnBjVG9Tb3VyY2VNYXBbaW5kZXgrMV0gPT0gbGluZSkKIAkJCXJldHVybiBpbmRleDsKIAl9CiAJcmV0dXJuIC0xOwogfQorCiBwdWJsaWMgdm9pZCBpbmVnKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbmVnIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaW5lZzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2luZWc7CiB9Ci0vKgorCitwdWJsaWMgdm9pZCBpbml0KENsYXNzRmlsZSB0YXJnZXRDbGFzc0ZpbGUpIHsKKwl0aGlzLmNsYXNzRmlsZSA9IHRhcmdldENsYXNzRmlsZTsKKwl0aGlzLmNvbnN0YW50UG9vbCA9IHRhcmdldENsYXNzRmlsZS5jb25zdGFudFBvb2w7CisJdGhpcy5iQ29kZVN0cmVhbSA9IHRhcmdldENsYXNzRmlsZS5jb250ZW50czsKKwl0aGlzLmNsYXNzRmlsZU9mZnNldCA9IHRhcmdldENsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwl0aGlzLnN0YXJ0aW5nQ2xhc3NGaWxlT2Zmc2V0ID0gdGhpcy5jbGFzc0ZpbGVPZmZzZXQ7CisJdGhpcy5wY1RvU291cmNlTWFwU2l6ZSA9IDA7CisJdGhpcy5sYXN0RW50cnlQQyA9IDA7CisJaW50IGxlbmd0aCA9IHRoaXMudmlzaWJsZUxvY2Fscy5sZW5ndGg7CisJaWYgKG5vVmlzaWJsZUxvY2Fscy5sZW5ndGggPCBsZW5ndGgpIHsKKwkJbm9WaXNpYmxlTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW2xlbmd0aF07CisJfQorCVN5c3RlbS5hcnJheWNvcHkobm9WaXNpYmxlTG9jYWxzLCAwLCB0aGlzLnZpc2libGVMb2NhbHMsIDAsIGxlbmd0aCk7CisJdGhpcy52aXNpYmxlTG9jYWxzQ291bnQgPSAwOworCisJbGVuZ3RoID0gdGhpcy5sb2NhbHMubGVuZ3RoOworCWlmIChub0xvY2Fscy5sZW5ndGggPCBsZW5ndGgpIHsKKwkJbm9Mb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbbGVuZ3RoXTsKKwl9CisJU3lzdGVtLmFycmF5Y29weShub0xvY2FscywgMCwgdGhpcy5sb2NhbHMsIDAsIGxlbmd0aCk7CisJdGhpcy5hbGxMb2NhbHNDb3VudGVyID0gMDsKKworCWxlbmd0aCA9IHRoaXMuZXhjZXB0aW9uTGFiZWxzLmxlbmd0aDsKKwlpZiAobm9FeGNlcHRpb25IYW5kbGVycy5sZW5ndGggPCBsZW5ndGgpIHsKKwkJbm9FeGNlcHRpb25IYW5kbGVycyA9IG5ldyBFeGNlcHRpb25MYWJlbFtsZW5ndGhdOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5vRXhjZXB0aW9uSGFuZGxlcnMsIDAsIHRoaXMuZXhjZXB0aW9uTGFiZWxzLCAwLCBsZW5ndGgpOworCXRoaXMuZXhjZXB0aW9uTGFiZWxzQ291bnRlciA9IDA7CisKKwlsZW5ndGggPSB0aGlzLmxhYmVscy5sZW5ndGg7CisJaWYgKG5vTGFiZWxzLmxlbmd0aCA8IGxlbmd0aCkgeworCQlub0xhYmVscyA9IG5ldyBCcmFuY2hMYWJlbFtsZW5ndGhdOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5vTGFiZWxzLCAwLCB0aGlzLmxhYmVscywgMCwgbGVuZ3RoKTsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gLTE7CisKKwl0aGlzLnN0YWNrTWF4ID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggPSAwOworCXRoaXMubWF4TG9jYWxzID0gMDsKKwl0aGlzLnBvc2l0aW9uID0gMDsKK30KKworLyoqCisgKiBAcGFyYW0gbWV0aG9kQmluZGluZyB0aGUgZ2l2ZW4gbWV0aG9kIGJpbmRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgbWF4IGxvY2FscworICovCitwdWJsaWMgdm9pZCBpbml0aWFsaXplTWF4TG9jYWxzKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAwOworCQlyZXR1cm47CisJfQorCXRoaXMubWF4TG9jYWxzID0gbWV0aG9kQmluZGluZy5pc1N0YXRpYygpID8gMCA6IDE7CisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJLy8gdGFrZSBpbnRvIGFjY291bnQgZW51bSBjb25zdHJ1Y3RvciBzeW50aGV0aWMgbmFtZStvcmRpbmFsCisJaWYgKG1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpICYmIGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7CisJCXRoaXMubWF4TG9jYWxzICs9IDI7IC8vIFN0cmluZyBhbmQgaW50IChlbnVtIGNvbnN0YW50IG5hbWUrb3JkaW5hbCkKKwl9CisKKwkvLyB0YWtlIGludG8gYWNjb3VudCB0aGUgc3ludGhldGljIHBhcmFtZXRlcnMKKwlpZiAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkgJiYgZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJdGhpcy5tYXhMb2NhbHMgKz0gZGVjbGFyaW5nQ2xhc3MuZ2V0RW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUoKTsKKwkJdGhpcy5tYXhMb2NhbHMgKz0gZGVjbGFyaW5nQ2xhc3MuZ2V0T3V0ZXJMb2NhbFZhcmlhYmxlc1Nsb3RTaXplKCk7CisJfQorCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXM7CisJaWYgKChwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycykgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCXN3aXRjaCAocGFyYW1ldGVyVHlwZXNbaV0uaWQpIHsKKwkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCQl0aGlzLm1heExvY2FscyArPSAyOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiAKKwkJCQkJdGhpcy5tYXhMb2NhbHMrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCiAgKiBTb21lIHBsYWNlZCBsYWJlbHMgbWlnaHQgYmUgYnJhbmNoaW5nIHRvIGEgZ290byBieXRlY29kZSB3aGljaCB3ZSBjYW4gb3B0aW1pemUgYmV0dGVyLgogICovCiBwdWJsaWMgYm9vbGVhbiBpbmxpbmVGb3J3YXJkUmVmZXJlbmNlc0Zyb21MYWJlbHNUYXJnZXRpbmcoQnJhbmNoTGFiZWwgdGFyZ2V0TGFiZWwsIGludCBnb3RvTG9jYXRpb24pIHsKIAlpZiAodGFyZ2V0TGFiZWwuZGVsZWdhdGUgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBhbHJlYWR5IGlubGluZWQKIAlpbnQgY2hhaW5pbmcgPSBMX1VOS05PV047CiAJZm9yIChpbnQgaSA9IHRoaXMuY291bnRMYWJlbHMgLSAxOyBpID49IDA7IGktLSkgewotCQlCcmFuY2hMYWJlbCBjdXJyZW50TGFiZWwgPSBsYWJlbHNbaV07CisJCUJyYW5jaExhYmVsIGN1cnJlbnRMYWJlbCA9IHRoaXMubGFiZWxzW2ldOwogCQlpZiAoY3VycmVudExhYmVsLnBvc2l0aW9uICE9IGdvdG9Mb2NhdGlvbikgYnJlYWs7CiAJCWlmIChjdXJyZW50TGFiZWwgPT0gdGFyZ2V0TGFiZWwpIHsKIAkJCWNoYWluaW5nIHw9IExfQ0FOTk9UX09QVElNSVpFOyAvLyByZWN1cnNpdmUKIAkJCWNvbnRpbnVlOwotCQl9IAorCQl9CiAJCWlmIChjdXJyZW50TGFiZWwuaXNTdGFuZGFyZExhYmVsKCkpIHsKIAkJCWlmIChjdXJyZW50TGFiZWwuZGVsZWdhdGUgIT0gbnVsbCkgY29udGludWU7IC8vIGlnbm9yZSBzaW5jZSBhbHJlYWR5IGlubGluZWQKIAkJCXRhcmdldExhYmVsLmJlY29tZURlbGVnYXRlRm9yKGN1cnJlbnRMYWJlbCk7CkBAIC0zNjE4LDE2NSArMzgyNiwxNDggQEAKIAl9CiAJcmV0dXJuIChjaGFpbmluZyAmIChMX09QVElNSVpBQkxFfExfQ0FOTk9UX09QVElNSVpFKSkgPT0gTF9PUFRJTUlaQUJMRTsgLy8gY2hlY2sgd2FzIHNvbWUgc3RhbmRhcmRzLCBhbmQgbm8gY2FzZS9yZWN1cnNpdmUKIH0KLXB1YmxpYyB2b2lkIGluaXQoQ2xhc3NGaWxlIHRhcmdldENsYXNzRmlsZSkgewotCXRoaXMuY2xhc3NGaWxlID0gdGFyZ2V0Q2xhc3NGaWxlOwotCXRoaXMuY29uc3RhbnRQb29sID0gdGFyZ2V0Q2xhc3NGaWxlLmNvbnN0YW50UG9vbDsKLQl0aGlzLmJDb2RlU3RyZWFtID0gdGFyZ2V0Q2xhc3NGaWxlLmNvbnRlbnRzOwotCXRoaXMuY2xhc3NGaWxlT2Zmc2V0ID0gdGFyZ2V0Q2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OwotCXRoaXMuc3RhcnRpbmdDbGFzc0ZpbGVPZmZzZXQgPSB0aGlzLmNsYXNzRmlsZU9mZnNldDsKLQlwY1RvU291cmNlTWFwU2l6ZSA9IDA7Ci0JbGFzdEVudHJ5UEMgPSAwOwotCWludCBsZW5ndGggPSB2aXNpYmxlTG9jYWxzLmxlbmd0aDsKLQlpZiAobm9WaXNpYmxlTG9jYWxzLmxlbmd0aCA8IGxlbmd0aCkgewotCQlub1Zpc2libGVMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbbGVuZ3RoXTsKLQl9Ci0JU3lzdGVtLmFycmF5Y29weShub1Zpc2libGVMb2NhbHMsIDAsIHZpc2libGVMb2NhbHMsIDAsIGxlbmd0aCk7Ci0JdmlzaWJsZUxvY2Fsc0NvdW50ID0gMDsKLQkKLQlsZW5ndGggPSBsb2NhbHMubGVuZ3RoOwotCWlmIChub0xvY2Fscy5sZW5ndGggPCBsZW5ndGgpIHsKLQkJbm9Mb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbbGVuZ3RoXTsKLQl9Ci0JU3lzdGVtLmFycmF5Y29weShub0xvY2FscywgMCwgbG9jYWxzLCAwLCBsZW5ndGgpOwotCWFsbExvY2Fsc0NvdW50ZXIgPSAwOwogCi0JbGVuZ3RoID0gZXhjZXB0aW9uTGFiZWxzLmxlbmd0aDsKLQlpZiAobm9FeGNlcHRpb25IYW5kbGVycy5sZW5ndGggPCBsZW5ndGgpIHsKLQkJbm9FeGNlcHRpb25IYW5kbGVycyA9IG5ldyBFeGNlcHRpb25MYWJlbFtsZW5ndGhdOwotCX0KLQlTeXN0ZW0uYXJyYXljb3B5KG5vRXhjZXB0aW9uSGFuZGxlcnMsIDAsIGV4Y2VwdGlvbkxhYmVscywgMCwgbGVuZ3RoKTsKLQlleGNlcHRpb25MYWJlbHNDb3VudGVyID0gMDsKLQkKLQlsZW5ndGggPSBsYWJlbHMubGVuZ3RoOwotCWlmIChub0xhYmVscy5sZW5ndGggPCBsZW5ndGgpIHsKLQkJbm9MYWJlbHMgPSBuZXcgQnJhbmNoTGFiZWxbbGVuZ3RoXTsKLQl9Ci0JU3lzdGVtLmFycmF5Y29weShub0xhYmVscywgMCwgbGFiZWxzLCAwLCBsZW5ndGgpOwotCWNvdW50TGFiZWxzID0gMDsKLQl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gLTE7Ci0KLQlzdGFja01heCA9IDA7Ci0Jc3RhY2tEZXB0aCA9IDA7Ci0JbWF4TG9jYWxzID0gMDsKLQlwb3NpdGlvbiA9IDA7Ci19Ci0vKioKLSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIHRoZSBnaXZlbiBtZXRob2QgYmluZGluZyB0byBpbml0aWFsaXplIHRoZSBtYXggbG9jYWxzCi0gKi8KLXB1YmxpYyB2b2lkIGluaXRpYWxpemVNYXhMb2NhbHMoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0KLQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7Ci0JCXRoaXMubWF4TG9jYWxzID0gMDsKLQkJcmV0dXJuOwotCX0KLQkKLQl0aGlzLm1heExvY2FscyA9IG1ldGhvZEJpbmRpbmcuaXNTdGF0aWMoKSA/IDAgOiAxOwotCQotCS8vIHRha2UgaW50byBhY2NvdW50IGVudW0gY29uc3RydWN0b3Igc3ludGhldGljIG5hbWUrb3JkaW5hbAotCWlmIChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7Ci0JCXRoaXMubWF4TG9jYWxzICs9IDI7IC8vIFN0cmluZyBhbmQgaW50IChlbnVtIGNvbnN0YW50IG5hbWUrb3JkaW5hbCkKLQl9Ci0JCi0JLy8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHN5bnRoZXRpYyBwYXJhbWV0ZXJzCi0JaWYgKG1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpICYmIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdJbnN0YW5jZVR5cGVzW107Ci0JCWlmICgoZW5jbG9zaW5nSW5zdGFuY2VUeXBlcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpKSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW5jbG9zaW5nSW5zdGFuY2VUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCXRoaXMubWF4TG9jYWxzKys7IC8vIGFuIGVuY2xvc2luZ0luc3RhbmNlVHlwZSBjYW4gb25seSBiZSBhIHJlZmVyZW5jZSBiaW5kaW5nLiBJdCBjYW5ub3QgYmUKLQkJCQkvLyBMb25nQmluZGluZyBvciBEb3VibGVCaW5kaW5nCi0JCQl9Ci0JCX0KLQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZ3VtZW50c1tdOwotCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpKSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJVHlwZUJpbmRpbmcgYXJnVHlwZTsKLQkJCQlpZiAoKChhcmdUeXBlID0gc3ludGhldGljQXJndW1lbnRzW2ldLnR5cGUpID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChhcmdUeXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQkJdGhpcy5tYXhMb2NhbHMgKz0gMjsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLm1heExvY2FscysrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKLQlpZiAoKGFyZ3VtZW50cyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycykgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlUeXBlQmluZGluZyBhcmdUeXBlOwotCQkJaWYgKCgoYXJnVHlwZSA9IGFyZ3VtZW50c1tpXSkgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGFyZ1R5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCXRoaXMubWF4TG9jYWxzICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubWF4TG9jYWxzKys7Ci0JCQl9Ci0JCX0KLQl9Ci19CiAvKioKICAqIFdlIGRpZG4ndCBjYWxsIGl0IGluc3RhbmNlb2YgYmVjYXVzZSB0aGVyZSBpcyBhIGNvbmZsaXQgd2l0aCB0aGUKICAqIGluc3RhbmNlb2Yga2V5d29yZAogICovCiBwdWJsaWMgdm9pZCBpbnN0YW5jZV9vZihUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnN0YW5jZV9vZjoiK3R5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2luc3RhbmNlb2Y7Ci0Jd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHR5cGVCaW5kaW5nKSk7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pbnN0YW5jZW9mOworCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHR5cGVCaW5kaW5nKSk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBpbnZva2UoaW50IG9wY29kZSwgaW50IGFyZ3NTaXplLCBpbnQgcmV0dXJuVHlwZVNpemUsIGNoYXJbXSBkZWNsYXJpbmdDbGFzcywgY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gc2lnbmF0dXJlKSB7Ci0JY291bnRMYWJlbHMgPSAwOwotCWludCBhcmdDb3VudCA9IGFyZ3NTaXplOworCitwcm90ZWN0ZWQgdm9pZCBpbnZva2UoYnl0ZSBvcGNvZGUsIGludCByZWNlaXZlckFuZEFyZ3NTaXplLCBpbnQgcmV0dXJuVHlwZVNpemUsIGNoYXJbXSBkZWNsYXJpbmdDbGFzcywgY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gc2lnbmF0dXJlKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKG9wY29kZSA9PSBPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UpIHsKKwkJLy8gaW52b2tlaW50ZXJmYWNlCisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgpOworCQl9CisJCXRoaXMucG9zaXRpb24gKz0zOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gb3Bjb2RlOworCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCBzZWxlY3Rvciwgc2lnbmF0dXJlLCB0cnVlKSk7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgcmVjZWl2ZXJBbmRBcmdzU2l6ZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IDA7CisJfSBlbHNlIHsKKwkJLy8gaW52b2tlc3BlY2lhbAorCQkvLyBpbnZva2VzdGF0aWMKKwkJLy8gaW52b2tldmlydHVhbAorCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoKTsKKwkJfQorCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBvcGNvZGU7CisJCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIHNlbGVjdG9yLCBzaWduYXR1cmUsIGZhbHNlKSk7CisJfQorCXRoaXMuc3RhY2tEZXB0aCArPSByZXR1cm5UeXBlU2l6ZSAtIHJlY2VpdmVyQW5kQXJnc1NpemU7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpIHsKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwl9Cit9CisKK3B1YmxpYyB2b2lkIGludm9rZShieXRlIG9wY29kZSwgTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLCBUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJaWYgKChkZWNsYXJpbmdDbGFzcy50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCVV0aWwucmVjb3JkTmVzdGVkVHlwZSh0aGlzLmNsYXNzRmlsZSwgZGVjbGFyaW5nQ2xhc3MpOworCX0KKwkvLyBjb21wdXRlIHJlY2VpdmVyQW5kQXJnc1NpemUKKwlpbnQgcmVjZWl2ZXJBbmRBcmdzU2l6ZTsKIAlzd2l0Y2gob3Bjb2RlKSB7Ci0JCWNhc2UgT3Bjb2Rlcy5PUENfaW52b2tlaW50ZXJmYWNlIDoKLQkJCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyA0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgewotCQkJCXJlc2l6ZUJ5dGVBcnJheSgpOwotCQkJfQotCQkJcG9zaXRpb24gKz0zOwotCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaW52b2tlaW50ZXJmYWNlOwotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIHNlbGVjdG9yLCBzaWduYXR1cmUsIHRydWUpKTsKLQkJCWFyZ0NvdW50Kys7Ci0JCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgYXJnQ291bnQ7Ci0JCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCA6Ci0JCWNhc2UgT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCA6Ci0JCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKLQkJCQlyZXNpemVCeXRlQXJyYXkoKTsKLQkJCX0KLQkJCXBvc2l0aW9uKys7Ci0JCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgb3Bjb2RlOwotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIHNlbGVjdG9yLCBzaWduYXR1cmUsIGZhbHNlKSk7Ci0JCQlhcmdDb3VudCsrOwotCQkJYnJlYWs7CiAJCWNhc2UgT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljIDoKLQkJCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgewotCQkJCXJlc2l6ZUJ5dGVBcnJheSgpOwotCQkJfQotCQkJcG9zaXRpb24rKzsKLQkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYzsKLQkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCBzZWxlY3Rvciwgc2lnbmF0dXJlLCBmYWxzZSkpOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDA7IC8vIG5vIHJlY2VpdmVyCisJCQlicmVhazsKKwkJY2FzZSBPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UgOgorCQljYXNlIE9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwgOgorCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDE7IC8vIHJlY2VpdmVyCisJCQlicmVhazsKKwkJY2FzZSBPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsIDoKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAxOyAvLyByZWNlaXZlcgorCQkJaWYgKG1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKKwkJCQkJLy8gZW5jbG9zaW5nIGluc3RhbmNlcworCQkJCQlyZWNlaXZlckFuZEFyZ3NTaXplICs9IG5lc3RlZFR5cGUuZ2V0RW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUoKTsKKwkJCQkJLy8gb3V0ZXIgbG9jYWwgdmFyaWFibGVzCisJCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50cyA9IG5lc3RlZFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQkJCQlpZiAoc3ludGhldGljQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlzd2l0Y2ggKHN5bnRoZXRpY0FyZ3VtZW50c1tpXS5pZCkgIHsKKwkJCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJCQkJCQlyZWNlaXZlckFuZEFyZ3NTaXplICs9IDI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDogCisJCQkJCQkJCQlyZWNlaXZlckFuZEFyZ3NTaXplKys7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9ICAgIAkJCQkJCQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeworCQkJCQkvLyBhZGRpbmcgU3RyaW5nIChuYW1lKSBhbmQgaW50IChvcmRpbmFsKQorCQkJCQlyZWNlaXZlckFuZEFyZ3NTaXplICs9IDI7CisJCQkJfQorCQkJfSAgICAJCQorCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJcmV0dXJuOyAvLyBzaG91bGQgbm90IG9jY3VyCisKIAl9Ci0Jc3RhY2tEZXB0aCArPSByZXR1cm5UeXBlU2l6ZSAtIGFyZ0NvdW50OwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpIHsKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCWZvciAoaW50IGkgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJc3dpdGNoIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV0uaWQpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQlyZWNlaXZlckFuZEFyZ3NTaXplICs9IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlyZWNlaXZlckFuZEFyZ3NTaXplICsrOworCQkJCWJyZWFrOworCQl9CiAJfQorCS8vIGNvbXB1dGUgcmV0dXJuIHR5cGUgc2l6ZQorCWludCByZXR1cm5UeXBlU2l6ZTsKKwlzd2l0Y2ggKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCkgeworCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCXJldHVyblR5cGVTaXplID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFR5cGVJZHMuVF92b2lkIDoKKwkJCXJldHVyblR5cGVTaXplID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXJldHVyblR5cGVTaXplID0gMTsKKwkJCWJyZWFrOworCX0KKwlpbnZva2UoCisJCQlvcGNvZGUsIAorCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSwgCisJCQlyZXR1cm5UeXBlU2l6ZSwgCisJCQlkZWNsYXJpbmdDbGFzcy5jb25zdGFudFBvb2xOYW1lKCksIAorCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwgCisJCQltZXRob2RCaW5kaW5nLnNpZ25hdHVyZSh0aGlzLmNsYXNzRmlsZSkpOwogfQorCiBwcm90ZWN0ZWQgdm9pZCBpbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoWilWOwotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkxLCAvLyBhcmdDb3VudAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMCwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkpBVkFMQU5HUkVGTEVDVEFDQ0VTU0lCTEVPQkpFQ1RfQ09OU1RBTlRQT09MTkFNRSwKIAkJCUNvbnN0YW50UG9vbC5TRVRBQ0NFU1NJQkxFX05BTUUsCiAJCQlDb25zdGFudFBvb2wuU0VUQUNDRVNTSUJMRV9TSUdOQVRVUkUpOwogfQorCiBwcm90ZWN0ZWQgdm9pZCBpbnZva2VBcnJheU5ld0luc3RhbmNlKCkgewogCS8vIGludm9rZXN0YXRpYzogamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoTGphdmEubGFuZy5DbGFzcztpbnRbXSlMamF2YS5sYW5nLk9iamVjdDsKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0JCQkyLCAvLyBhcmdDb3VudAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkpBVkFMQU5HUkVGTEVDVEFSUkFZX0NPTlNUQU5UUE9PTE5BTUUsCiAJCQlDb25zdGFudFBvb2wuTmV3SW5zdGFuY2UsCkBAIC0zNzg0LDIxMiArMzk3NSwyMjggQEAKIH0KIHB1YmxpYyB2b2lkIGludm9rZUNsYXNzRm9yTmFtZSgpIHsKIAkvLyBpbnZva2VzdGF0aWM6IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKExqYXZhLmxhbmcuU3RyaW5nOylMamF2YS5sYW5nLkNsYXNzOwotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzdGF0aWM6IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKExqYXZhLmxhbmcuU3RyaW5nOylMamF2YS5sYW5nLkNsYXNzOyIpOyAvLyROT04tTkxTLTEkCi0JdGhpcy5pbnZva2UoCisJaW52b2tlKAogCQlPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0JCTEsIC8vIGFyZ0NvdW50CisJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUsCiAJCUNvbnN0YW50UG9vbC5Gb3JOYW1lLAogCQlDb25zdGFudFBvb2wuRm9yTmFtZVNpZ25hdHVyZSk7CiB9CisKIHByb3RlY3RlZCB2b2lkIGludm9rZUNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuQ2xhc3MgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihbTGphdmEubGFuZy5DbGFzcylMamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0JdGhpcy5pbnZva2UoCisJaW52b2tlKAogCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCTEsIC8vIGFyZ0NvdW50CisJCQkyLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUsCiAJCQlDb25zdGFudFBvb2wuR0VUREVDTEFSRURDT05TVFJVQ1RPUl9OQU1FLAogCQkJQ29uc3RhbnRQb29sLkdFVERFQ0xBUkVEQ09OU1RSVUNUT1JfU0lHTkFUVVJFKTsKIH0KKwogcHJvdGVjdGVkIHZvaWQgaW52b2tlQ2xhc3NHZXREZWNsYXJlZEZpZWxkKCkgewogCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZEZpZWxkKExqYXZhLmxhbmcuU3RyaW5nKUxqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMSwgLy8gYXJnQ291bnQKKwkJCTIsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5HRVRERUNMQVJFREZJRUxEX05BTUUsCiAJCQlDb25zdGFudFBvb2wuR0VUREVDTEFSRURGSUVMRF9TSUdOQVRVUkUpOwogfQorCiBwcm90ZWN0ZWQgdm9pZCBpbnZva2VDbGFzc0dldERlY2xhcmVkTWV0aG9kKCkgewogCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5DbGFzcyBnZXREZWNsYXJlZE1ldGhvZChMamF2YS5sYW5nLlN0cmluZywgW0xqYXZhLmxhbmcuQ2xhc3MpTGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMiwgLy8gYXJnQ291bnQKKwkJCTMsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5HRVRERUNMQVJFRE1FVEhPRF9OQU1FLAogCQkJQ29uc3RhbnRQb29sLkdFVERFQ0xBUkVETUVUSE9EX1NJR05BVFVSRSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZUVudW1PcmRpbmFsKGNoYXJbXSBlbnVtVHlwZUNvbnN0YW50UG9vbE5hbWUpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiA8ZW51bUNvbnN0YW50UG9vbE5hbWU+Lm9yZGluYWwoKQotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2V2aXJ0dWFsOiAiK25ldyBTdHJpbmcoZW51bVR5cGVDb25zdGFudFBvb2xOYW1lKSsiLm9yZGluYWwoKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMCwgLy8gYXJnQ291bnQKKwkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCWVudW1UeXBlQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5PcmRpbmFsLAogCQkJQ29uc3RhbnRQb29sLk9yZGluYWxTaWduYXR1cmUpOwogfQotcHVibGljIHZvaWQgaW52b2tlaW50ZXJmYWNlKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VpbnRlcmZhY2U6ICIgKyBtZXRob2RCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQkvLyBpbml0aWFsaXplZCB0byAxIHRvIHRha2UgaW50byBhY2NvdW50IHRoaXMgIGltbWVkaWF0ZWx5Ci0JaW50IGFyZ0NvdW50ID0gMTsKLQlpbnQgaWQ7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7Ci0JCXJlc2l6ZUJ5dGVBcnJheSgpOworCitwdWJsaWMgdm9pZCBpbnZva2VJdGVyYWJsZUl0ZXJhdG9yKFR5cGVCaW5kaW5nIGl0ZXJhYmxlUmVjZWl2ZXJUeXBlKSB7CisJLy8gaW52b2tldmlydHVhbC9pbnRlcmZhY2U6IDxpdGVyYWJsZVJlY2VpdmVyVHlwZT4uaXRlcmF0b3IoKQorCWlmICgoaXRlcmFibGVSZWNlaXZlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUodGhpcy5jbGFzc0ZpbGUsIGl0ZXJhYmxlUmVjZWl2ZXJUeXBlKTsKIAl9Ci0JcG9zaXRpb24gKz0gMzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2U7Ci0Jd3JpdGVVbnNpZ25lZFNob3J0KAotCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKAotCQkJbWV0aG9kQmluZGluZy5jb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcygpLAotCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwKLQkJCW1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKGNsYXNzRmlsZSksCi0JCQl0cnVlKSk7Ci0JZm9yIChpbnQgaSA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLQkJaWYgKCgoaWQgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV0uaWQpID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChpZCA9PSBUeXBlSWRzLlRfbG9uZykpCi0JCQlhcmdDb3VudCArPSAyOwotCQllbHNlCi0JCQlhcmdDb3VudCArPSAxOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBhcmdDb3VudDsKLQkvLyBHZW5lcmF0ZSBhICAwIGludG8gdGhlIGJ5dGUgYXJyYXkuIExpa2UgdGhlIGFycmF5IGlzIGFscmVhZHkgZmlsbCB3aXRoIDAsIHdlIGp1c3QgbmVlZCB0byBpbmNyZW1lbnQKLQkvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IDA7Ci0JaWYgKCgoaWQgPSBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQpID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChpZCA9PSBUeXBlSWRzLlRfbG9uZykpIHsKLQkJc3RhY2tEZXB0aCArPSAoMiAtIGFyZ0NvdW50KTsKLQl9IGVsc2UgewotCQlpZiAoaWQgPT0gVHlwZUlkcy5UX3ZvaWQpIHsKLQkJCXN0YWNrRGVwdGggLT0gYXJnQ291bnQ7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFja0RlcHRoICs9ICgxIC0gYXJnQ291bnQpOwotCQl9Ci0JfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpIHsKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCX0KKwlpbnZva2UoCisJCQlpdGVyYWJsZVJlY2VpdmVyVHlwZS5pc0ludGVyZmFjZSgpID8gT3Bjb2Rlcy5PUENfaW52b2tlaW50ZXJmYWNlIDogT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKKwkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKKwkJCTEsIC8vIHJldHVyblR5cGVTaXplCisJCQlpdGVyYWJsZVJlY2VpdmVyVHlwZS5jb25zdGFudFBvb2xOYW1lKCksIAorCQkJQ29uc3RhbnRQb29sLklURVJBVE9SX05BTUUsIAorCQkJQ29uc3RhbnRQb29sLklURVJBVE9SX1NJR05BVFVSRSk7CiB9CisKK3B1YmxpYyB2b2lkIGludm9rZUF1dG9DbG9zZWFibGVDbG9zZShUeXBlQmluZGluZyByZXNvdXJjZVR5cGUpIHsKKwkvLyBpbnZva2V2aXJ0dWFsL2ludGVyZmFjZTogPHJlc291cmNlVHlwZT4uY2xvc2UoKQorCWludm9rZSgKKwkJCXJlc291cmNlVHlwZS5pc0ludGVyZmFjZSgpID8gT3Bjb2Rlcy5PUENfaW52b2tlaW50ZXJmYWNlIDogT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKKwkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKKwkJCTAsIC8vIHJldHVyblR5cGVTaXplCisJCQlyZXNvdXJjZVR5cGUuY29uc3RhbnRQb29sTmFtZSgpLCAKKwkJCUNvbnN0YW50UG9vbC5DbG9zZSwgCisJCQlDb25zdGFudFBvb2wuQ2xvc2VTaWduYXR1cmUpOworfQorCitwdWJsaWMgdm9pZCBpbnZva2VUaHJvd2FibGVBZGRTdXBwcmVzc2VkKCkgeworCWludm9rZShPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQorCQkJMCwgLy8gcmV0dXJuVHlwZVNpemUKKwkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUsCisJCQlDb25zdGFudFBvb2wuQWRkU3VwcHJlc3NlZCwgCisJCQlDb25zdGFudFBvb2wuQWRkU3VwcHJlc3NlZFNpZ25hdHVyZSk7Cit9CisKIHB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3RvcihpbnQgdHlwZUJpbmRpbmdJRCkgewogCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvci48aW5pdD4odHlwZUJpbmRpbmdJRClWCi0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvci48aW5pdD4odHlwZUJpbmRpbmdJRClWIik7IC8vJE5PTi1OTFMtMSQKLQlpbnQgYXJnQ291bnQgPSAxOwotCWNoYXJbXSBzaWduYXR1cmUgPSBudWxsOworCWludCByZWNlaXZlckFuZEFyZ3NTaXplOworCWNoYXJbXSBzaWduYXR1cmU7CiAJc3dpdGNoICh0eXBlQmluZGluZ0lEKSB7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuSW50Q29uc3RyU2lnbmF0dXJlOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDI7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuTG9uZ0NvbnN0clNpZ25hdHVyZTsKLQkJCWFyZ0NvdW50ID0gMjsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAzOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5GbG9hdENvbnN0clNpZ25hdHVyZTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuRG91YmxlQ29uc3RyU2lnbmF0dXJlOwotCQkJYXJnQ291bnQgPSAyOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuQ2hhckNvbnN0clNpZ25hdHVyZTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLkJvb2xlYW5Db25zdHJTaWduYXR1cmU7CisJCQlyZWNlaXZlckFuZEFyZ3NTaXplID0gMjsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCA6CiAJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nIDoKIAkJY2FzZSBUeXBlSWRzLlRfbnVsbCA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuT2JqZWN0Q29uc3RyU2lnbmF0dXJlOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDI7CiAJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsgLy8gc2hvdWxkIG5vdCBvY2N1cgogCX0KLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotCQkJYXJnQ291bnQsIC8vIGFyZ0NvdW50CisJCQlyZWNlaXZlckFuZEFyZ3NTaXplLAogCQkJMCwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdGFudFBvb2xOYW1lLAogCQkJQ29uc3RhbnRQb29sLkluaXQsCiAJCQlzaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0Fzc2VydGlvbkVycm9yRGVmYXVsdENvbnN0cnVjdG9yKCkgewogCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvci48aW5pdD4oKVYKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yLjxpbml0PigpViIpOyAvLyROT04tTkxTLTEkCi0JdGhpcy5pbnZva2UoCisJaW52b2tlKAogCQkJT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwKLQkJCTAsIC8vIGFyZ0NvdW50CisJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0YW50UG9vbE5hbWUsCiAJCQlDb25zdGFudFBvb2wuSW5pdCwKIAkJCUNvbnN0YW50UG9vbC5EZWZhdWx0Q29uc3RydWN0b3JTaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0NsYXNzRGVzaXJlZEFzc2VydGlvblN0YXR1cygpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuQ2xhc3MuZGVzaXJlZEFzc2VydGlvblN0YXR1cygpWjsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogamF2YS5sYW5nLkNsYXNzLmRlc2lyZWRBc3NlcnRpb25TdGF0dXMoKVo7Iik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMCwgLy8gYXJnQ291bnQKKwkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5EZXNpcmVkQXNzZXJ0aW9uU3RhdHVzLAogCQkJQ29uc3RhbnRQb29sLkRlc2lyZWRBc3NlcnRpb25TdGF0dXNTaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0VudW12YWx1ZU9mKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZykgewogCS8vIGludm9rZXN0YXRpYzogamF2YS5sYW5nLkVudW0udmFsdWVPZihDbGFzcyxTdHJpbmcpCi0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXN0YXRpYzogamF2YS5sYW5nLkVudW0udmFsdWVPZihMamF2YS9sYW5nL0NsYXNzO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0VudW07Iik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsCi0JCQkyLCAvLyBhcmdDb3VudAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nRW51bUNvbnN0YW50UG9vbE5hbWUsCiAJCQlDb25zdGFudFBvb2wuVmFsdWVPZiwKIAkJCUNvbnN0YW50UG9vbC5WYWx1ZU9mU3RyaW5nQ2xhc3NTaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0VudW1WYWx1ZXMoVHlwZUJpbmRpbmcgZW51bUJpbmRpbmcsIEFycmF5QmluZGluZyBhcnJheUJpbmRpbmcpIHsKIAljaGFyW10gc2lnbmF0dXJlID0gIigpIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJc2lnbmF0dXJlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc2lnbmF0dXJlLCBhcnJheUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKLQl0aGlzLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIDAsIDEsIGVudW1CaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwgVHlwZUNvbnN0YW50cy5WQUxVRVMsIHNpZ25hdHVyZSk7CisJaW52b2tlKAorCQkJT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCAKKwkJCTAsICAvLyByZWNlaXZlckFuZEFyZ3NTaXplCisJCQkxLCAgLy8gcmV0dXJuIHR5cGUgc2l6ZQorCQkJZW51bUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLCAKKwkJCVR5cGVDb25zdGFudHMuVkFMVUVTLCAKKwkJCXNpZ25hdHVyZSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nRXJyb3JDb25zdHJ1Y3RvcigpIHsKIAkvLyBpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuRXJyb3I8aW5pdD4oTGphdmEubGFuZy5TdHJpbmc7KVYKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkVycm9yPGluaXQ+KExqYXZhLmxhbmcuU3RyaW5nOylWIik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotCQkJMSwgLy8gYXJnQ291bnQKKwkJCTIsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTAsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ0Vycm9yQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5Jbml0LAogCQkJQ29uc3RhbnRQb29sLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKTsKIH0KKwogcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3JOZXdJbnN0YW5jZSgpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShbTGphdmEubGFuZy5PYmplY3Q7KUxqYXZhLmxhbmcuT2JqZWN0OwotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkxLCAvLyBhcmdDb3VudAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5OZXdJbnN0YW5jZSwKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3Rvck5ld0luc3RhbmNlU2lnbmF0dXJlKTsKIH0KKwogcHJvdGVjdGVkIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRHZXR0ZXIoaW50IHR5cGVJRCkgewotCWludCByZXR1cm5UeXBlU2l6ZSA9IDE7Ci0JY2hhcltdIHNpZ25hdHVyZSA9IG51bGw7Ci0JY2hhcltdIHNlbGVjdG9yID0gbnVsbDsKKwljaGFyW10gc2VsZWN0b3I7CisJY2hhcltdIHNpZ25hdHVyZTsKKwlpbnQgcmV0dXJuVHlwZVNpemU7CiAJc3dpdGNoICh0eXBlSUQpIHsKIAkJY2FzZSBUeXBlSWRzLlRfaW50IDoKIAkJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sLkdFVF9JTlRfTUVUSE9EX05BTUU7CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuR0VUX0lOVF9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmV0dXJuVHlwZVNpemUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgogCQkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2wuR0VUX0JZVEVfTUVUSE9EX05BTUU7CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuR0VUX0JZVEVfTUVUSE9EX1NJR05BVFVSRTsKKwkJCXJldHVyblR5cGVTaXplID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5HRVRfU0hPUlRfTUVUSE9EX05BTUU7CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuR0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkU7CisJCQlyZXR1cm5UeXBlU2l6ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5HRVRfTE9OR19NRVRIT0RfTkFNRTsKQEAgLTM5OTksNiArNDIwNiw3IEBACiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sLkdFVF9GTE9BVF9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5HRVRfRkxPQVRfTUVUSE9EX1NJR05BVFVSRTsKKwkJCXJldHVyblR5cGVTaXplID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgogCQkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2wuR0VUX0RPVUJMRV9NRVRIT0RfTkFNRTsKQEAgLTQwMDgsMjQwICs0MjE2LDE0OSBAQAogCQljYXNlIFR5cGVJZHMuVF9jaGFyIDoKIAkJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sLkdFVF9DSEFSX01FVEhPRF9OQU1FOwogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLkdFVF9DSEFSX01FVEhPRF9TSUdOQVRVUkU7CisJCQlyZXR1cm5UeXBlU2l6ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5HRVRfQk9PTEVBTl9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5HRVRfQk9PTEVBTl9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmV0dXJuVHlwZVNpemUgPSAxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgogCQkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2wuR0VUX09CSkVDVF9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5HRVRfT0JKRUNUX01FVEhPRF9TSUdOQVRVUkU7CisJCQlyZXR1cm5UeXBlU2l6ZSA9IDE7CiAJCQlicmVhazsKIAl9Ci0JdGhpcy5pbnZva2UoCisJaW52b2tlKAogCQkJT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwKLQkJCTEsIC8vIGFyZ0NvdW50CisJCQkyLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQlyZXR1cm5UeXBlU2l6ZSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkpBVkFMQU5HUkVGTEVDVEZJRUxEX0NPTlNUQU5UUE9PTE5BTUUsCiAJCQlzZWxlY3RvciwKIAkJCXNpZ25hdHVyZSk7CiB9CisKIHByb3RlY3RlZCB2b2lkIGludm9rZUphdmFMYW5nUmVmbGVjdEZpZWxkU2V0dGVyKGludCB0eXBlSUQpIHsKLQlpbnQgYXJnQ291bnQgPSAyOwotCWNoYXJbXSBzaWduYXR1cmUgPSBudWxsOwotCWNoYXJbXSBzZWxlY3RvciA9IG51bGw7CisJY2hhcltdIHNlbGVjdG9yOworCWNoYXJbXSBzaWduYXR1cmU7CisJaW50IHJlY2VpdmVyQW5kQXJnc1NpemU7CiAJc3dpdGNoICh0eXBlSUQpIHsKIAkJY2FzZSBUeXBlSWRzLlRfaW50IDoKIAkJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sLlNFVF9JTlRfTUVUSE9EX05BTUU7CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU0VUX0lOVF9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYnl0ZSA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5TRVRfQllURV9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TRVRfQllURV9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2wuU0VUX1NIT1JUX01FVEhPRF9OQU1FOwogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlNFVF9TSE9SVF9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5TRVRfTE9OR19NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TRVRfTE9OR19NRVRIT0RfU0lHTkFUVVJFOwotCQkJYXJnQ291bnQgPSAzOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDQ7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgogCQkJc2VsZWN0b3IgPSBDb25zdGFudFBvb2wuU0VUX0ZMT0FUX01FVEhPRF9OQU1FOwogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlNFVF9GTE9BVF9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKIAkJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sLlNFVF9ET1VCTEVfTUVUSE9EX05BTUU7CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU0VUX0RPVUJMRV9NRVRIT0RfU0lHTkFUVVJFOwotCQkJYXJnQ291bnQgPSAzOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDQ7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5TRVRfQ0hBUl9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5TRVRfQk9PTEVBTl9NRVRIT0RfTkFNRTsKIAkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TRVRfQk9PTEVBTl9NRVRIT0RfU0lHTkFUVVJFOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6CiAJCQlzZWxlY3RvciA9IENvbnN0YW50UG9vbC5TRVRfT0JKRUNUX01FVEhPRF9OQU1FOwogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlNFVF9PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAzOwogCQkJYnJlYWs7CiAJfQotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQlhcmdDb3VudCwgLy8gYXJnQ291bnQKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUsCiAJCQkwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQlDb25zdGFudFBvb2wuSkFWQUxBTkdSRUZMRUNURklFTERfQ09OU1RBTlRQT09MTkFNRSwKIAkJCXNlbGVjdG9yLAogCQkJc2lnbmF0dXJlKTsKIH0KKwogcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCkgewogCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTGphdmEubGFuZy5PYmplY3Q7W0xqYXZhLmxhbmcuT2JqZWN0OylMamF2YS5sYW5nLk9iamVjdDsKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMiwgLy8gYXJnQ291bnQKKwkJCTMsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KQVZBTEFOR1JFRkxFQ1RNRVRIT0RfQ09OU1RBTlRQT09MTkFNRSwKIAkJCUNvbnN0YW50UG9vbC5JTlZPS0VfTUVUSE9EX01FVEhPRF9OQU1FLAogCQkJQ29uc3RhbnRQb29sLklOVk9LRV9NRVRIT0RfTUVUSE9EX1NJR05BVFVSRSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZUphdmFVdGlsSXRlcmF0b3JIYXNOZXh0KCkgewogCS8vIGludm9rZWludGVyZmFjZSBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpWgotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VpbnRlcmZhY2U6IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KClaIik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UsCi0JCQkwLCAvLyBhcmdDb3VudAorCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFVdGlsSXRlcmF0b3JDb25zdGFudFBvb2xOYW1lLAogCQkJQ29uc3RhbnRQb29sLkhhc05leHQsCiAJCQlDb25zdGFudFBvb2wuSGFzTmV4dFNpZ25hdHVyZSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZUphdmFVdGlsSXRlcmF0b3JOZXh0KCkgewogCS8vIGludm9rZWludGVyZmFjZSBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpamF2YS5sYW5nLk9iamVjdAotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VpbnRlcmZhY2U6IGphdmEudXRpbC5JdGVyYXRvci5uZXh0KClqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UsCi0JCQkwLCAvLyBhcmdDb3VudAorCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFVdGlsSXRlcmF0b3JDb25zdGFudFBvb2xOYW1lLAogCQkJQ29uc3RhbnRQb29sLk5leHQsCiAJCQlDb25zdGFudFBvb2wuTmV4dFNpZ25hdHVyZSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZU5vQ2xhc3NEZWZGb3VuZEVycm9yU3RyaW5nQ29uc3RydWN0b3IoKSB7CiAJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yLjxpbml0PihMamF2YS5sYW5nLlN0cmluZzspVgotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IuPGluaXQ+KExqYXZhLmxhbmcuU3RyaW5nOylWIik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotCQkJMSwgLy8gYXJnQ291bnQKKwkJCTIsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTAsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ05vQ2xhc3NEZWZGb3VuZEVycm9yQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5Jbml0LAogCQkJQ29uc3RhbnRQb29sLlN0cmluZ0NvbnN0cnVjdG9yU2lnbmF0dXJlKTsKIH0KKwogcHVibGljIHZvaWQgaW52b2tlT2JqZWN0R2V0Q2xhc3MoKSB7CiAJLy8gaW52b2tldmlydHVhbDogamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpTGphdmEubGFuZy5DbGFzczsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpTGphdmEubGFuZy5DbGFzczsiKTsgLy8kTk9OLU5MUy0xJAotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkwLCAvLyBhcmdDb3VudAorCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5HZXRDbGFzcywKIAkJCUNvbnN0YW50UG9vbC5HZXRDbGFzc1NpZ25hdHVyZSk7CiB9Ci1wdWJsaWMgdm9pZCBpbnZva2VzcGVjaWFsKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsOiIrbWV0aG9kQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JLy8gaW5pdGlhbGl6ZWQgdG8gMSB0byB0YWtlIGludG8gYWNjb3VudCB0aGlzIGltbWVkaWF0ZWx5Ci0JaW50IGFyZ0NvdW50ID0gMTsKLQlpbnQgaWQ7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDIgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7Ci0JCXJlc2l6ZUJ5dGVBcnJheSgpOwotCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWw7Ci0Jd3JpdGVVbnNpZ25lZFNob3J0KAotCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKAotCQkJbWV0aG9kQmluZGluZy5jb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcygpLAotCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwKLQkJCW1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKGNsYXNzRmlsZSksCi0JCQlmYWxzZSkpOwotCWlmIChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgewotCQlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkvLyBlbmNsb3NpbmcgaW5zdGFuY2VzCi0JCQlUeXBlQmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7Ci0JCQlpZiAoc3ludGhldGljQXJndW1lbnRUeXBlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJaWYgKCgoaWQgPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzW2ldLmlkKSA9PSBUeXBlSWRzLlRfZG91YmxlKSB8fCAoaWQgPT0gVHlwZUlkcy5UX2xvbmcpKSB7Ci0JCQkJCQlhcmdDb3VudCArPSAyOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXJnQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIG91dGVyIGxvY2FsIHZhcmlhYmxlcwotCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOwotCQkJaWYgKHN5bnRoZXRpY0FyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCQlpZiAoKChpZCA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXS50eXBlLmlkKSA9PSBUeXBlSWRzLlRfZG91YmxlKSB8fCAoaWQgPT0gVHlwZUlkcy5UX2xvbmcpKSB7Ci0JCQkJCQlhcmdDb3VudCArPSAyOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXJnQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpIHsKLQkJCS8vIGFkZGluZyBTdHJpbmcgYW5kIGludAotCQkJYXJnQ291bnQgKz0gMjsKLQkJfQotCX0KLQlmb3IgKGludCBpID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotCQlpZiAoKChpZCA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1tpXS5pZCkgPT0gVHlwZUlkcy5UX2RvdWJsZSkgfHwgKGlkID09IFR5cGVJZHMuVF9sb25nKSkKLQkJCWFyZ0NvdW50ICs9IDI7Ci0JCWVsc2UKLQkJCWFyZ0NvdW50Kys7Ci0JaWYgKCgoaWQgPSBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQpID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChpZCA9PSBUeXBlSWRzLlRfbG9uZykpCi0JCXN0YWNrRGVwdGggKz0gKDIgLSBhcmdDb3VudCk7Ci0JZWxzZQotCQlpZiAoaWQgPT0gVHlwZUlkcy5UX3ZvaWQpCi0JCQlzdGFja0RlcHRoIC09IGFyZ0NvdW50OwotCQllbHNlCi0JCQlzdGFja0RlcHRoICs9ICgxIC0gYXJnQ291bnQpOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLX0KLXB1YmxpYyB2b2lkIGludm9rZXN0YXRpYyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljOiIrbWV0aG9kQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkvLyBpbml0aWFsaXplZCB0byAwIHRvIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlcmUgaXMgbm8gdGhpcyBmb3IKLQkvLyBhIHN0YXRpYyBtZXRob2QKLQljb3VudExhYmVscyA9IDA7Ci0JaW50IGFyZ0NvdW50ID0gMDsKLQlpbnQgaWQ7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDIgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7Ci0JCXJlc2l6ZUJ5dGVBcnJheSgpOwotCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYzsKLQl3cml0ZVVuc2lnbmVkU2hvcnQoCi0JCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JNZXRob2QoCi0JCQltZXRob2RCaW5kaW5nLmNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKCksCi0JCQltZXRob2RCaW5kaW5nLnNlbGVjdG9yLAotCQkJbWV0aG9kQmluZGluZy5zaWduYXR1cmUoY2xhc3NGaWxlKSwKLQkJCWZhbHNlKSk7Ci0JZm9yIChpbnQgaSA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLQkJaWYgKCgoaWQgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV0uaWQpID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChpZCA9PSBUeXBlSWRzLlRfbG9uZykpCi0JCQlhcmdDb3VudCArPSAyOwotCQllbHNlCi0JCQlhcmdDb3VudCArPSAxOwotCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSA9PSBUeXBlSWRzLlRfZG91YmxlKSB8fCAoaWQgPT0gVHlwZUlkcy5UX2xvbmcpKQotCQlzdGFja0RlcHRoICs9ICgyIC0gYXJnQ291bnQpOwotCWVsc2UKLQkJaWYgKGlkID09IFR5cGVJZHMuVF92b2lkKQotCQkJc3RhY2tEZXB0aCAtPSBhcmdDb3VudDsKLQkJZWxzZQotCQkJc3RhY2tEZXB0aCArPSAoMSAtIGFyZ0NvdW50KTsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci19CisKIC8qKgogICogVGhlIGVxdWl2YWxlbnQgY29kZSBwZXJmb3JtcyBhIHN0cmluZyBjb252ZXJzaW9uIG9mIHRoZSBUT1MKICAqIEBwYXJhbSB0eXBlSUQgPENPREU+aW50PC9DT0RFPgogICovCiBwdWJsaWMgdm9pZCBpbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kRm9yVHlwZShpbnQgdHlwZUlEKSB7Ci0JaWYgKERFQlVHKSB7Ci0JCWlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKC4uLikiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLmFwcGVuZCguLi4pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQlpbnQgYXJnQ291bnQgPSAxOwotCWludCByZXR1cm5UeXBlID0gMTsKKwlpbnQgcmVjZWl2ZXJBbmRBcmdzU2l6ZTsKIAljaGFyW10gZGVjbGFyaW5nQ2xhc3MgPSBudWxsOwogCWNoYXJbXSBzZWxlY3RvciA9IENvbnN0YW50UG9vbC5BcHBlbmQ7CiAJY2hhcltdIHNpZ25hdHVyZSA9IG51bGw7CkBAIC00MjU2LDYgKzQzNzMsNyBAQAogCQkJCWRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKIAkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVmZmVyQXBwZW5kSW50U2lnbmF0dXJlOwogCQkJfQorCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDI7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CkBAIC00MjY1LDcgKzQzODMsNyBAQAogCQkJCWRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKIAkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVmZmVyQXBwZW5kTG9uZ1NpZ25hdHVyZTsKIAkJCX0KLQkJCWFyZ0NvdW50ID0gMjsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAzOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCWlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKQEAgLTQyNzUsNiArNDM5Myw3IEBACiAJCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOwogCQkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TdHJpbmdCdWZmZXJBcHBlbmRGbG9hdFNpZ25hdHVyZTsKIAkJCX0KKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CiAJCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CkBAIC00Mjg0LDcgKzQ0MDMsNyBAQAogCQkJCWRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKIAkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVmZmVyQXBwZW5kRG91YmxlU2lnbmF0dXJlOwogCQkJfQotCQkJYXJnQ291bnQgPSAyOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDM7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CiAJCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CkBAIC00Mjk0LDYgKzQ0MTMsNyBAQAogCQkJCWRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKIAkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVmZmVyQXBwZW5kQ2hhclNpZ25hdHVyZTsKIAkJCX0KKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgogCQkJaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewpAQCAtNDMwMywxNyArNDQyMyw3IEBACiAJCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOwogCQkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TdHJpbmdCdWZmZXJBcHBlbmRCb29sZWFuU2lnbmF0dXJlOwogCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVHlwZUlkcy5UX3VuZGVmaW5lZCA6Ci0JCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0IDoKLQkJY2FzZSBUeXBlSWRzLlRfbnVsbCA6Ci0JCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWlsZGVyQ29uc3RhbnRQb29sTmFtZTsKLQkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVpbGRlckFwcGVuZE9iamVjdFNpZ25hdHVyZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOwotCQkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TdHJpbmdCdWZmZXJBcHBlbmRPYmplY3RTaWduYXR1cmU7Ci0JCQl9CisJCQlyZWNlaXZlckFuZEFyZ3NTaXplID0gMjsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyA6CiAJCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CkBAIC00MzIzLDgzICs0NDMzLDExMCBAQAogCQkJCWRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKIAkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVmZmVyQXBwZW5kU3RyaW5nU2lnbmF0dXJlOwogCQkJfQorCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWlsZGVyQ29uc3RhbnRQb29sTmFtZTsKKwkJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuU3RyaW5nQnVpbGRlckFwcGVuZE9iamVjdFNpZ25hdHVyZTsKKwkJCX0gZWxzZSB7CisJCQkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOworCQkJCXNpZ25hdHVyZSA9IENvbnN0YW50UG9vbC5TdHJpbmdCdWZmZXJBcHBlbmRPYmplY3RTaWduYXR1cmU7CisJCQl9CisJCQlyZWNlaXZlckFuZEFyZ3NTaXplID0gMjsKIAkJCWJyZWFrOwogCX0KLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJYXJnQ291bnQsIC8vIGFyZ0NvdW50Ci0JCQlyZXR1cm5UeXBlLCAvLyByZXR1cm4gdHlwZSBzaXplCisJCQlyZWNlaXZlckFuZEFyZ3NTaXplLAorCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJZGVjbGFyaW5nQ2xhc3MsCiAJCQlzZWxlY3RvciwKIAkJCXNpZ25hdHVyZSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25EZWZhdWx0Q29uc3RydWN0b3IoKSB7CiAJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oKVYKLQlpZiAoREVCVUcpIHsKLQkJaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci48aW5pdD4oKVYiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLjxpbml0PigpViIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JY2hhcltdIGRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKLQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJLy8gb3IgaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuPGluaXQ+KClWCisJY2hhcltdIGRlY2xhcmluZ0NsYXNzOworCWlmICh0aGlzLnRhcmdldExldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQlkZWNsYXJpbmdDbGFzcyA9IENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0YW50UG9vbE5hbWU7CisJfSBlbHNlIHsKIAkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWlsZGVyQ29uc3RhbnRQb29sTmFtZTsKIAl9Ci0JdGhpcy5pbnZva2UoCisJaW52b2tlKAogCQkJT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwKLQkJCTAsIC8vIGFyZ0NvdW50CisJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQlkZWNsYXJpbmdDbGFzcywKIAkJCUNvbnN0YW50UG9vbC5Jbml0LAogCQkJQ29uc3RhbnRQb29sLkRlZmF1bHRDb25zdHJ1Y3RvclNpZ25hdHVyZSk7CiB9CisKIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25TdHJpbmdDb25zdHJ1Y3RvcigpIHsKLQlpZiAoREVCVUcpIHsKLQkJaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci48aW5pdD4oTGphdmEubGFuZy5TdHJpbmc7KVYiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLjxpbml0PihMamF2YS5sYW5nLlN0cmluZzspViIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JY2hhcltdIGRlY2xhcmluZ0NsYXNzID0gQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZTsKLQlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oamF2YS5sYW5nLlN0cmluZylWCisJLy8gb3IgaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuPGluaXQ+KGphdmEubGFuZy5TdHJpbmcpVgorCWNoYXJbXSBkZWNsYXJpbmdDbGFzczsKKwlpZiAodGhpcy50YXJnZXRMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oKVYKKwkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOworCX0gZWxzZSB7CisJCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5TdHJpbmdTdHJpbmdCdWlsZGVyLjxpbml0PihqYXZhLmxhbmdTdHJpbmcpVgogCQlkZWNsYXJpbmdDbGFzcyA9IENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0J1aWxkZXJDb25zdGFudFBvb2xOYW1lOwogCX0KLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2VzcGVjaWFsLAotCQkJMSwgLy8gYXJnQ291bnQKKwkJCTIsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTAsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCWRlY2xhcmluZ0NsYXNzLAogCQkJQ29uc3RhbnRQb29sLkluaXQsCiAJCQlDb25zdGFudFBvb2wuU3RyaW5nQ29uc3RydWN0b3JTaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uVG9TdHJpbmcoKSB7Ci0JaWYgKERFQlVHKSB7Ci0JCWlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogU3RyaW5nQnVpbGRlci50b1N0cmluZygpTGphdmEubGFuZy5TdHJpbmc7Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogU3RyaW5nQnVmZmVyLnRvU3RyaW5nKClMamF2YS5sYW5nLlN0cmluZzsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCWNoYXJbXSBkZWNsYXJpbmdDbGFzcyA9IENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0YW50UG9vbE5hbWU7Ci0JaWYgKHRoaXMudGFyZ2V0TGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5TdHJpbmdCdWZmZXIudG9TdHJpbmcoKWphdmEubGFuZy5TdHJpbmcKKwkvLyBvciBpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50b1N0cmluZygpamF2YS5sYW5nLlN0cmluZworCWNoYXJbXSBkZWNsYXJpbmdDbGFzczsKKwlpZiAodGhpcy50YXJnZXRMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oKVYKKwkJZGVjbGFyaW5nQ2xhc3MgPSBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lOworCX0gZWxzZSB7CisJCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5TdHJpbmdTdHJpbmdCdWlsZGVyLjxpbml0PihqYXZhLmxhbmdTdHJpbmcpVgogCQlkZWNsYXJpbmdDbGFzcyA9IENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0J1aWxkZXJDb25zdGFudFBvb2xOYW1lOwotCX0KLQl0aGlzLmludm9rZSgKKwl9CQorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkwLCAvLyBhcmdDb3VudAorCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJZGVjbGFyaW5nQ2xhc3MsCiAJCQlDb25zdGFudFBvb2wuVG9TdHJpbmcsCiAJCQlDb25zdGFudFBvb2wuVG9TdHJpbmdTaWduYXR1cmUpOwogfQorcHVibGljIHZvaWQgaW52b2tlU3RyaW5nRXF1YWxzKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKCkKKwlpbnZva2UoCisJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAorCQkJMiwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQorCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQorCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSwKKwkJCUNvbnN0YW50UG9vbC5FcXVhbHMsCisJCQlDb25zdGFudFBvb2wuRXF1YWxzU2lnbmF0dXJlKTsKK30KK3B1YmxpYyB2b2lkIGludm9rZVN0cmluZ0hhc2hDb2RlKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5TdHJpbmcuaGFzaENvZGUoKQorCWludm9rZSgKKwkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCisJCQkxLCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCisJCQkxLCAvLyByZXR1cm4gdHlwZSBzaXplCisJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lLAorCQkJQ29uc3RhbnRQb29sLkhhc2hDb2RlLAorCQkJQ29uc3RhbnRQb29sLkhhc2hDb2RlU2lnbmF0dXJlKTsKK30KIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0ludGVybigpIHsKIAkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuU3RyaW5nLmludGVybigpCi0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5TdHJpbmcuaW50ZXJuKCkiKTsgLy8kTk9OLU5MUy0xJAotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWwsCi0JCQkwLCAvLyBhcmdDb3VudAorCQkJMSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5JbnRlcm4sCkBAIC00NDA3LDEzMyArNDU0NCwxMDggQEAKIH0KIHB1YmxpYyB2b2lkIGludm9rZVN0cmluZ1ZhbHVlT2YoaW50IHR5cGVJRCkgewogCS8vIGludm9rZXN0YXRpYzogamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKGFyZ3VtZW50VHlwZSkKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tlc3RhdGljOiBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoLi4uKSIpOyAvLyROT04tTkxTLTEkCi0JaW50IGFyZ0NvdW50ID0gMTsKLQljaGFyW10gc2lnbmF0dXJlID0gbnVsbDsKKwljaGFyW10gc2lnbmF0dXJlOworCWludCByZWNlaXZlckFuZEFyZ3NTaXplOwogCXN3aXRjaCAodHlwZUlEKSB7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuVmFsdWVPZkludFNpZ25hdHVyZTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlZhbHVlT2ZMb25nU2lnbmF0dXJlOwotCQkJYXJnQ291bnQgPSAyOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDI7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlZhbHVlT2ZGbG9hdFNpZ25hdHVyZTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuVmFsdWVPZkRvdWJsZVNpZ25hdHVyZTsKLQkJCWFyZ0NvdW50ID0gMjsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgogCQkJc2lnbmF0dXJlID0gQ29uc3RhbnRQb29sLlZhbHVlT2ZDaGFyU2lnbmF0dXJlOworCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuVmFsdWVPZkJvb2xlYW5TaWduYXR1cmU7CisJCQlyZWNlaXZlckFuZEFyZ3NTaXplID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCA6CiAJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nIDoKIAkJY2FzZSBUeXBlSWRzLlRfbnVsbCA6CiAJCWNhc2UgVHlwZUlkcy5UX3VuZGVmaW5lZCA6CiAJCQlzaWduYXR1cmUgPSBDb25zdGFudFBvb2wuVmFsdWVPZk9iamVjdFNpZ25hdHVyZTsKKwkJCXJlY2VpdmVyQW5kQXJnc1NpemUgPSAxOwogCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJcmV0dXJuOyAvLyBzaG91bGQgbm90IG9jY3VyCiAJfQotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywKLQkJCWFyZ0NvdW50LCAvLyBhcmdDb3VudAorCQkJcmVjZWl2ZXJBbmRBcmdzU2l6ZSwgLy8gcmVjZWl2ZXJBbmRBcmdzU2l6ZQogCQkJMSwgLy8gcmV0dXJuIHR5cGUgc2l6ZQogCQkJQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSwKIAkJCUNvbnN0YW50UG9vbC5WYWx1ZU9mLAogCQkJc2lnbmF0dXJlKTsKIH0KKwogcHVibGljIHZvaWQgaW52b2tlU3lzdGVtQXJyYXljb3B5KCkgewogCS8vIGludm9rZXN0YXRpYyAjMjEgPE1ldGhvZCBqYXZhL2xhbmcvU3lzdGVtLmFycmF5Y29weShMamF2YS9sYW5nL09iamVjdDtJTGphdmEvbGFuZy9PYmplY3Q7SUkpVj4KLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aW52b2tldmlydHVhbDogamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkoTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJKVYiKTsgLy8kTk9OLU5MUy0xJAotCXRoaXMuaW52b2tlKAorCWludm9rZSgKIAkJCU9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywKLQkJCTUsIC8vIGFyZ0NvdW50CisJCQk1LCAvLyByZWNlaXZlckFuZEFyZ3NTaXplCiAJCQkwLCAvLyByZXR1cm4gdHlwZSBzaXplCiAJCQlDb25zdGFudFBvb2wuSmF2YUxhbmdTeXN0ZW1Db25zdGFudFBvb2xOYW1lLAogCQkJQ29uc3RhbnRQb29sLkFycmF5Q29weSwKIAkJCUNvbnN0YW50UG9vbC5BcnJheUNvcHlTaWduYXR1cmUpOwogfQorCiBwdWJsaWMgdm9pZCBpbnZva2VUaHJvd2FibGVHZXRNZXNzYWdlKCkgewogCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpTGphdmEubGFuZy5TdHJpbmc7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpTGphdmEubGFuZy5TdHJpbmc7Iik7IC8vJE5PTi1OTFMtMSQKLQl0aGlzLmludm9rZSgKKwlpbnZva2UoCiAJCQlPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLAotCQkJMCwgLy8gYXJnQ291bnQKKwkJCTEsIC8vIHJlY2VpdmVyQW5kQXJnc1NpemUKIAkJCTEsIC8vIHJldHVybiB0eXBlIHNpemUKIAkJCUNvbnN0YW50UG9vbC5KYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUsCiAJCQlDb25zdGFudFBvb2wuR2V0TWVzc2FnZSwKIAkJCUNvbnN0YW50UG9vbC5HZXRNZXNzYWdlU2lnbmF0dXJlKTsKIH0KLXB1YmxpYyB2b2lkIGludm9rZXZpcnR1YWwoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGludm9rZXZpcnR1YWw6IittZXRob2RCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQkvLyBpbml0aWFsaXplZCB0byAxIHRvIHRha2UgaW50byBhY2NvdW50IHRoaXMgIGltbWVkaWF0ZWx5Ci0JaW50IGFyZ0NvdW50ID0gMTsKLQlpbnQgaWQ7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDIgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7Ci0JCXJlc2l6ZUJ5dGVBcnJheSgpOwotCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2ludm9rZXZpcnR1YWw7Ci0Jd3JpdGVVbnNpZ25lZFNob3J0KAotCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKAotCQkJbWV0aG9kQmluZGluZy5jb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcygpLAotCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwKLQkJCW1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKGNsYXNzRmlsZSksCi0JCQlmYWxzZSkpOwotCWZvciAoaW50IGkgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0JCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKSA9PSBUeXBlSWRzLlRfZG91YmxlKSB8fCAoaWQgPT0gVHlwZUlkcy5UX2xvbmcpKQotCQkJYXJnQ291bnQgKz0gMjsKLQkJZWxzZQotCQkJYXJnQ291bnQrKzsKLQlpZiAoKChpZCA9IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCkgPT0gVHlwZUlkcy5UX2RvdWJsZSkgfHwgKGlkID09IFR5cGVJZHMuVF9sb25nKSkKLQkJc3RhY2tEZXB0aCArPSAoMiAtIGFyZ0NvdW50KTsKLQllbHNlCi0JCWlmIChpZCA9PSBUeXBlSWRzLlRfdm9pZCkKLQkJCXN0YWNrRGVwdGggLT0gYXJnQ291bnQ7Ci0JCWVsc2UKLQkJCXN0YWNrRGVwdGggKz0gKDEgLSBhcmdDb3VudCk7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotfQorCiBwdWJsaWMgdm9pZCBpb3IoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlvciIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pb3I7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pb3I7CiB9CisKIHB1YmxpYyB2b2lkIGlyZW0oKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlyZW0iKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXJlbTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lyZW07CiB9CisKIHB1YmxpYyB2b2lkIGlyZXR1cm4oKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlyZXR1cm4iKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAgCi0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMAorCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pcmV0dXJuOwotCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwkJCisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pcmV0dXJuOworCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwogfQorCiBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChTY29wZSBzY29wZSwgaW50IGluaXRTdGF0ZUluZGV4LCBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewogCS8vIE1pcnJvciBvZiBVbmNvbmRpdGlvbmFsRmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCiAJaWYgKChsb2NhbC50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSAhPSAwKSB7CkBAIC00NTQxLDcgKzQ2NTMsNyBAQAogCX0KIAlpZiAoaW5pdFN0YXRlSW5kZXggPT0gLTEpCiAJCXJldHVybiBmYWxzZTsKLQlpbnQgbG9jYWxQb3NpdGlvbiA9IGxvY2FsLmlkICsgbWF4RmllbGRDb3VudDsKKwlpbnQgbG9jYWxQb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50OwogCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKIAkvLyBpZCBpcyB6ZXJvLWJhc2VkCiAJaWYgKGxvY2FsUG9zaXRpb24gPCBVbmNvbmRpdGlvbmFsRmxvd0luZm8uQml0Q2FjaGVTaXplKSB7CkBAIC00NTUzLDMyOCArNDY2NSwzMjcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJaW50IHZlY3RvckluZGV4OwogCWlmICgodmVjdG9ySW5kZXggPSAobG9jYWxQb3NpdGlvbiAvIFVuY29uZGl0aW9uYWxGbG93SW5mby5CaXRDYWNoZVNpemUpIC0gMSkgPj0gZXh0cmFJbml0cy5sZW5ndGgpCi0JCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQgCisJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAlyZXR1cm4gKChleHRyYUluaXRzW3ZlY3RvckluZGV4XSkgJiAoMUwgPDwgKGxvY2FsUG9zaXRpb24gJSBVbmNvbmRpdGlvbmFsRmxvd0luZm8uQml0Q2FjaGVTaXplKSkpICE9IDA7CiB9CisKIHB1YmxpYyB2b2lkIGlzaGwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlzaGwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXNobDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzaGw7CiB9CisKIHB1YmxpYyB2b2lkIGlzaHIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGlzaHIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXNocjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzaHI7CiB9CisKIHB1YmxpYyB2b2lkIGlzdG9yZShpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpc3RvcmU6IitpQXJnKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA8PSBpQXJnKSB7Ci0JCW1heExvY2FscyA9IGlBcmcgKyAxOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLm1heExvY2FscyA8PSBpQXJnKSB7CisJCXRoaXMubWF4TG9jYWxzID0gaUFyZyArIDE7CiAJfQogCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAzID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmU7CisJCXRoaXMucG9zaXRpb24gKz0gMjsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmU7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXN0b3JlOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXN0b3JlOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGlBcmc7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBpc3RvcmVfMCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXN0b3JlXzAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA9PSAwKSB7Ci0JCW1heExvY2FscyA9IDE7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMubWF4TG9jYWxzID09IDApIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAxOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmVfMDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzdG9yZV8wOwogfQorCiBwdWJsaWMgdm9pZCBpc3RvcmVfMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXN0b3JlXzEiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA8PSAxKSB7Ci0JCW1heExvY2FscyA9IDI7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDEpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAyOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmVfMTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzdG9yZV8xOwogfQorCiBwdWJsaWMgdm9pZCBpc3RvcmVfMigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXN0b3JlXzIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA8PSAyKSB7Ci0JCW1heExvY2FscyA9IDM7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDIpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAzOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmVfMjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzdG9yZV8yOwogfQorCiBwdWJsaWMgdm9pZCBpc3RvcmVfMygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXN0b3JlXzMiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKG1heExvY2FscyA8PSAzKSB7Ci0JCW1heExvY2FscyA9IDQ7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMubWF4TG9jYWxzIDw9IDMpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA0OwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3RvcmVfMzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzdG9yZV8zOwogfQorCiBwdWJsaWMgdm9pZCBpc3ViKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRpc3ViIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2lzdWI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pc3ViOwogfQorCiBwdWJsaWMgdm9pZCBpdXNocigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXVzaHIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXVzaHI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19pdXNocjsKIH0KKwogcHVibGljIHZvaWQgaXhvcigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0aXhvciIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19peG9yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfaXhvcjsKIH0KKwogZmluYWwgcHVibGljIHZvaWQganNyKEJyYW5jaExhYmVsIGxibCkgewogCWlmICh0aGlzLndpZGVNb2RlKSB7Ci0JCXRoaXMuanNyX3cobGJsKTsKKwkJanNyX3cobGJsKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0anNyIitsYmwpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2pzcjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2pzcjsKIAlsYmwuYnJhbmNoKCk7CiB9CisKIGZpbmFsIHB1YmxpYyB2b2lkIGpzcl93KEJyYW5jaExhYmVsIGxibCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRqc3JfdyIrbGJsKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19qc3JfdzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2pzcl93OwogCWxibC5icmFuY2hXaWRlKCk7CiB9CisKIHB1YmxpYyB2b2lkIGwyZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bDJkIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbDJkOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbDJkOwogfQorCiBwdWJsaWMgdm9pZCBsMmYoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGwyZiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sMmY7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sMmY7CiB9CisKIHB1YmxpYyB2b2lkIGwyaSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bDJpIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2wyaTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2wyaTsKIH0KKwogcHVibGljIHZvaWQgbGFkZCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGFkZCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sYWRkOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGFkZDsKIH0KKwogcHVibGljIHZvaWQgbGFsb2FkKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsYWxvYWQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sYWxvYWQ7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sYWxvYWQ7CiB9CisKIHB1YmxpYyB2b2lkIGxhbmQoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxhbmQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGFuZDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xhbmQ7CiB9CisKIHB1YmxpYyB2b2lkIGxhc3RvcmUoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxhc3RvcmUiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDQ7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gNDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGFzdG9yZTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xhc3RvcmU7CiB9CisKIHB1YmxpYyB2b2lkIGxjbXAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxjbXAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDM7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMzsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGNtcDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xjbXA7CiB9CisKIHB1YmxpYyB2b2lkIGxjb25zdF8wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsY29uc3RfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggKz0gMjsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGNvbnN0XzA7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sY29uc3RfMDsKIH0KKwogcHVibGljIHZvaWQgbGNvbnN0XzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxjb25zdF8xIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sY29uc3RfMTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xjb25zdF8xOwogfQorCiBwdWJsaWMgdm9pZCBsZGMoZmxvYXQgY29uc3RhbnQpIHsKLQljb3VudExhYmVscyA9IDA7Ci0JaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpbnQgaW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQpOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCWlmIChpbmRleCA+IDI1NSkgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGRjX3c6Iitjb25zdGFudCk7IC8vJE5PTi1OTFMtMSQKIAkJLy8gR2VuZXJhdGUgYSBsZGNfdwotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24rKzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGRjX3c7CisJCXRoaXMucG9zaXRpb24rKzsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkY193OwogCQl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOwogCX0gZWxzZSB7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsZGM6Iitjb25zdGFudCk7IC8vJE5PTi1OTFMtMSQKIAkJLy8gR2VuZXJhdGUgYSBsZGMKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkYzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4OworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGM7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBsZGMoaW50IGNvbnN0YW50KSB7Ci0JY291bnRMYWJlbHMgPSAwOwotCWludCBpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQpOwotCXN0YWNrRGVwdGgrKzsKLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaW50IGluZGV4ID0gdGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50KTsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKIAlpZiAoaW5kZXggPiAyNTUpIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxkY193OiIrY29uc3RhbnQpOyAvLyROT04tTkxTLTEkCiAJCS8vIEdlbmVyYXRlIGEgbGRjX3cKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDIgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDIgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uKys7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkY193OworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGNfdzsKIAkJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKIAl9IGVsc2UgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGRjOiIrY29uc3RhbnQpOyAvLyROT04tTkxTLTEkCiAJCS8vIEdlbmVyYXRlIGEgbGRjCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAxID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAxID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGM7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpbmRleDsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGRjOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4OwogCX0KIH0KKwogcHVibGljIHZvaWQgbGRjKFN0cmluZyBjb25zdGFudCkgewotCWNvdW50TGFiZWxzID0gMDsKLQlpbnQgY3VycmVudENvZGVTdHJlYW1Qb3NpdGlvbiA9IHBvc2l0aW9uOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWludCBjdXJyZW50Q29kZVN0cmVhbVBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjsKIAljaGFyW10gY29uc3RhbnRDaGFycyA9IGNvbnN0YW50LnRvQ2hhckFycmF5KCk7Ci0JaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckxkYyhjb25zdGFudENoYXJzKTsKKwlpbnQgaW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JMZGMoY29uc3RhbnRDaGFycyk7CiAJaWYgKGluZGV4ID4gMCkgewogCQkvLyB0aGUgc3RyaW5nIGFscmVhZHkgZXhpc3RzIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbAogCQkvLyB3ZSByZXVzZSB0aGUgc2FtZSBpbmRleAotCQl0aGlzLmxkY0ZvckluZGV4KGluZGV4LCBjb25zdGFudENoYXJzKTsKKwkJbGRjRm9ySW5kZXgoaW5kZXgpOwogCX0gZWxzZSB7CiAJCS8vIHRoZSBzdHJpbmcgaXMgdG9vIGJpZyB0byBiZSB1dGY4LWVuY29kZWQgaW4gb25lIHBhc3MuCiAJCS8vIHdlIGhhdmUgdG8gc3BsaXQgaXQgaW50byBkaWZmZXJlbnQgcGllY2VzLgogCQkvLyBmaXJzdCB3ZSBjbGVhbiBhbGwgc2lkZS1lZmZlY3RzIGR1ZSB0byB0aGUgY29kZSBhYm92ZQogCQkvLyB0aGlzIGNhc2UgaXMgdmVyeSByYXJlLCBzbyB3ZSBjYW4gYWZmb3JkIHRvIGxvc2UgdGltZSB0byBoYW5kbGUgaXQKLQkJcG9zaXRpb24gPSBjdXJyZW50Q29kZVN0cmVhbVBvc2l0aW9uOworCQl0aGlzLnBvc2l0aW9uID0gY3VycmVudENvZGVTdHJlYW1Qb3NpdGlvbjsKIAkJaW50IGkgPSAwOwogCQlpbnQgbGVuZ3RoID0gMDsKIAkJaW50IGNvbnN0YW50TGVuZ3RoID0gY29uc3RhbnQubGVuZ3RoKCk7CkBAIC00OTEyLDggKzUwMjMsOCBAQAogCQljaGFyW10gc3ViQ2hhcnMgPSBuZXcgY2hhcltpXTsKIAkJU3lzdGVtLmFycmF5Y29weShjb25zdGFudENoYXJzLCAwLCBzdWJDaGFycywgMCwgaSk7CiAJCVN5c3RlbS5hcnJheWNvcHkodXRmOGVuY29kaW5nLCAwLCB1dGY4ZW5jb2RpbmcgPSBuZXcgYnl0ZVtsZW5ndGhdLCAwLCBsZW5ndGgpOwotCQlpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3ViQ2hhcnMsIHV0ZjhlbmNvZGluZyk7Ci0JCXRoaXMubGRjRm9ySW5kZXgoaW5kZXgsIHN1YkNoYXJzKTsKKwkJaW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3ViQ2hhcnMsIHV0ZjhlbmNvZGluZyk7CisJCWxkY0ZvckluZGV4KGluZGV4KTsKIAkJLy8gd3JpdGUgdGhlIHJlbWFpbmluZyBwYXJ0CiAJCWludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25TdHJpbmdDb25zdHJ1Y3RvcigpOwogCQl3aGlsZSAoaSA8IGNvbnN0YW50TGVuZ3RoKSB7CkBAIC00OTQ5LDggKzUwNjAsOCBAQAogCQkJc3ViQ2hhcnMgPSBuZXcgY2hhcltuZXdDaGFyTGVuZ3RoXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoY29uc3RhbnRDaGFycywgc3RhcnRJbmRleCwgc3ViQ2hhcnMsIDAsIG5ld0NoYXJMZW5ndGgpOwogCQkJU3lzdGVtLmFycmF5Y29weSh1dGY4ZW5jb2RpbmcsIDAsIHV0ZjhlbmNvZGluZyA9IG5ldyBieXRlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCQlpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3ViQ2hhcnMsIHV0ZjhlbmNvZGluZyk7Ci0JCQl0aGlzLmxkY0ZvckluZGV4KGluZGV4LCBzdWJDaGFycyk7CisJCQlpbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChzdWJDaGFycywgdXRmOGVuY29kaW5nKTsKKwkJCWxkY0ZvckluZGV4KGluZGV4KTsKIAkJCS8vIG5vdyBvbiB0aGUgc3RhY2sgaXQgc2hvdWxkIGJlIGEgU3RyaW5nQnVmZmVyIGFuZCBhIHN0cmluZy4KIAkJCWludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmRGb3JUeXBlKFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZyk7CiAJCX0KQEAgLTQ5NTgsMjA3ICs1MDY5LDIwNyBAQAogCQlpbnZva2VTdHJpbmdJbnRlcm4oKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGxkYyhUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCWNvdW50TGFiZWxzID0gMDsKLQlpbnQgaW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSh0eXBlQmluZGluZyk7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpbnQgaW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHR5cGVCaW5kaW5nKTsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKIAlpZiAoaW5kZXggPiAyNTUpIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxkY193OiIrIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAogCQkvLyBHZW5lcmF0ZSBhIGxkY193Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGNfdzsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGRjX3c7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpbmRleCk7CiAJfSBlbHNlIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxkdzoiKyB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKIAkJLy8gR2VuZXJhdGUgYSBsZGMKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkYzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4OworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGM7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBsZGMyX3coZG91YmxlIGNvbnN0YW50KSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxkYzJfdzoiK2NvbnN0YW50KTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpbnQgaW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGNvbnN0YW50KTsKLQlzdGFja0RlcHRoICs9IDI7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWludCBpbmRleCA9IHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7CisJdGhpcy5zdGFja0RlcHRoICs9IDI7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CiAJLy8gR2VuZXJhdGUgYSBsZGMyX3cKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkYzJfdzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkYzJfdzsKIAl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOwogfQorCiBwdWJsaWMgdm9pZCBsZGMyX3cobG9uZyBjb25zdGFudCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsZGMyX3c6Iitjb25zdGFudCk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwlpbnQgaW5kZXggPSB0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQpOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCS8vIEdlbmVyYXRlIGEgbGRjMl93Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDIgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGMyX3c7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGMyX3c7CiAJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKIH0KLXB1YmxpYyB2b2lkIGxkY0ZvckluZGV4KGludCBpbmRleCwgY2hhcltdIGNvbnN0YW50KSB7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpIHsKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCitwdWJsaWMgdm9pZCBsZGNGb3JJbmRleChpbnQgaW5kZXgpIHsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkgeworCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCX0KIAlpZiAoaW5kZXggPiAyNTUpIHsKIAkJLy8gR2VuZXJhdGUgYSBsZGNfdwotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGRjX3c6IisgbmV3IFN0cmluZyhjb25zdGFudCkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGNfdzsKKwkJdGhpcy5wb3NpdGlvbisrOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGRjX3c7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpbmRleCk7CiAJfSBlbHNlIHsKIAkJLy8gR2VuZXJhdGUgYSBsZGMKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxkYzoiKyBuZXcgU3RyaW5nKGNvbnN0YW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDEgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkYzsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGluZGV4OworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGM7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBsZGl2KCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsZGl2Iik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xkaXY7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sZGl2OwogfQorCiBwdWJsaWMgdm9pZCBsbG9hZChpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsbG9hZDoiK2lBcmcpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAobWF4TG9jYWxzIDw9IGlBcmcgKyAxKSB7Ci0JCW1heExvY2FscyA9IGlBcmcgKyAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8PSBpQXJnICsgMSkgeworCQl0aGlzLm1heExvY2FscyA9IGlBcmcgKyAyOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CiAJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xsb2FkOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ193aWRlOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGxvYWQ7CiAJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKIAl9IGVsc2UgewotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGxvYWQ7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sbG9hZDsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOwogCX0KIH0KKwogcHVibGljIHZvaWQgbGxvYWRfMCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGxvYWRfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAobWF4TG9jYWxzIDwgMikgewotCQltYXhMb2NhbHMgPSAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8IDIpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAyOwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGxvYWRfMDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xsb2FkXzA7CiB9CisKIHB1YmxpYyB2b2lkIGxsb2FkXzEoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxsb2FkXzEiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoICs9IDI7Ci0JaWYgKG1heExvY2FscyA8IDMpIHsKLQkJbWF4TG9jYWxzID0gMzsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggKz0gMjsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPCAzKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMzsKIAl9Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuc3RhY2tEZXB0aCA+IHRoaXMuc3RhY2tNYXgpCisJCXRoaXMuc3RhY2tNYXggPSB0aGlzLnN0YWNrRGVwdGg7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xsb2FkXzE7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sbG9hZF8xOwogfQorCiBwdWJsaWMgdm9pZCBsbG9hZF8yKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsbG9hZF8yIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCArPSAyOwotCWlmIChtYXhMb2NhbHMgPCA0KSB7Ci0JCW1heExvY2FscyA9IDQ7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoICs9IDI7CisJaWYgKHRoaXMubWF4TG9jYWxzIDwgNCkgeworCQl0aGlzLm1heExvY2FscyA9IDQ7CiAJfQotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sbG9hZF8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGxvYWRfMjsKIH0KKwogcHVibGljIHZvaWQgbGxvYWRfMygpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bGxvYWRfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggKz0gMjsKLQlpZiAobWF4TG9jYWxzIDwgNSkgewotCQltYXhMb2NhbHMgPSA1OworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCArPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8IDUpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA1OwogCX0KLQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbGxvYWRfMzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xsb2FkXzM7CiB9CisKIHB1YmxpYyB2b2lkIGxtdWwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxtdWwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbG11bDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xtdWw7CiB9CisKIHB1YmxpYyB2b2lkIGxuZWcoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxuZWciKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sbmVnOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbG5lZzsKIH0KKwogcHVibGljIGZpbmFsIHZvaWQgbG9hZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcpIHsKIAlsb2FkKGxvY2FsQmluZGluZy50eXBlLCBsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbik7CiB9Ci1wdWJsaWMgZmluYWwgdm9pZCBsb2FkKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBpbnQgcmVzb2x2ZWRQb3NpdGlvbikgewotCWNvdW50TGFiZWxzID0gMDsKKworcHJvdGVjdGVkIGZpbmFsIHZvaWQgbG9hZChUeXBlQmluZGluZyB0eXBlQmluZGluZywgaW50IHJlc29sdmVkUG9zaXRpb24pIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKIAkvLyBVc2luZyBkZWRpY2F0ZWQgaW50IGJ5dGVjb2RlCiAJc3dpdGNoKHR5cGVCaW5kaW5nLmlkKSB7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6CkBAIC01MTY4LDExOCArNTI3OSwxMTggQEAKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CiAJCQkJY2FzZSAwIDoKLQkJCQkJdGhpcy5pbG9hZF8wKCk7CisJCQkJCWlsb2FkXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5pbG9hZF8xKCk7CisJCQkJCWlsb2FkXzEoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKLQkJCQkJdGhpcy5pbG9hZF8yKCk7CisJCQkJCWlsb2FkXzIoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzIDoKLQkJCQkJdGhpcy5pbG9hZF8zKCk7CisJCQkJCWlsb2FkXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJLy9jYXNlIC0xIDoKIAkJCQkvLyBpbnRlcm5hbCBmYWlsdXJlOiB0cnlpbmcgdG8gbG9hZCB2YXJpYWJsZSBub3Qgc3VwcG9zZWQgdG8gYmUgZ2VuZXJhdGVkCiAJCQkJLy8JYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuaWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCQkJCWlsb2FkKHJlc29sdmVkUG9zaXRpb24pOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgewogCQkJCWNhc2UgMCA6Ci0JCQkJCXRoaXMuZmxvYWRfMCgpOworCQkJCQlmbG9hZF8wKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMSA6Ci0JCQkJCXRoaXMuZmxvYWRfMSgpOworCQkJCQlmbG9hZF8xKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMiA6Ci0JCQkJCXRoaXMuZmxvYWRfMigpOworCQkJCQlmbG9hZF8yKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMyA6Ci0JCQkJCXRoaXMuZmxvYWRfMygpOworCQkJCQlmbG9hZF8zKCk7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQgOgotCQkJCQl0aGlzLmZsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCQkJCQlmbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKIAkJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgewogCQkJCWNhc2UgMCA6Ci0JCQkJCXRoaXMubGxvYWRfMCgpOworCQkJCQlsbG9hZF8wKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMSA6Ci0JCQkJCXRoaXMubGxvYWRfMSgpOworCQkJCQlsbG9hZF8xKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMiA6Ci0JCQkJCXRoaXMubGxvYWRfMigpOworCQkJCQlsbG9hZF8yKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMyA6Ci0JCQkJCXRoaXMubGxvYWRfMygpOworCQkJCQlsbG9hZF8zKCk7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQgOgotCQkJCQl0aGlzLmxsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCQkJCQlsbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgogCQkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CiAJCQkJY2FzZSAwIDoKLQkJCQkJdGhpcy5kbG9hZF8wKCk7CisJCQkJCWRsb2FkXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5kbG9hZF8xKCk7CisJCQkJCWRsb2FkXzEoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKLQkJCQkJdGhpcy5kbG9hZF8yKCk7CisJCQkJCWRsb2FkXzIoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzIDoKLQkJCQkJdGhpcy5kbG9hZF8zKCk7CisJCQkJCWRsb2FkXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuZGxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCQkJCWRsb2FkKHJlc29sdmVkUG9zaXRpb24pOwogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQgOgogCQkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CiAJCQkJY2FzZSAwIDoKLQkJCQkJdGhpcy5hbG9hZF8wKCk7CisJCQkJCWFsb2FkXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5hbG9hZF8xKCk7CisJCQkJCWFsb2FkXzEoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKLQkJCQkJdGhpcy5hbG9hZF8yKCk7CisJCQkJCWFsb2FkXzIoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzIDoKLQkJCQkJdGhpcy5hbG9hZF8zKCk7CisJCQkJCWFsb2FkXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuYWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCQkJCWFsb2FkKHJlc29sdmVkUG9zaXRpb24pOwogCQkJfQogCX0KIH0KKwogcHVibGljIHZvaWQgbG9va3Vwc3dpdGNoKENhc2VMYWJlbCBkZWZhdWx0TGFiZWwsIGludFtdIGtleXMsIGludFtdIHNvcnRlZEluZGV4ZXMsIENhc2VMYWJlbFtdIGNhc2VzTGFiZWwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bG9va3Vwc3dpdGNoIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aC0tOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOwogCWludCBsZW5ndGggPSBrZXlzLmxlbmd0aDsKLQlpbnQgcG9zID0gcG9zaXRpb247CisJaW50IHBvcyA9IHRoaXMucG9zaXRpb247CiAJZGVmYXVsdExhYmVsLnBsYWNlSW5zdHJ1Y3Rpb24oKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCWNhc2VzTGFiZWxbaV0ucGxhY2VJbnN0cnVjdGlvbigpOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sb29rdXBzd2l0Y2g7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sb29rdXBzd2l0Y2g7CiAJZm9yIChpbnQgaSA9ICgzIC0gKHBvcyAmIDMpKTsgaSA+IDA7IGktLSkgeyAvLyBmYXN0ZXIgdGhhbiAlIDQKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAwOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAwOwogCX0KIAlkZWZhdWx0TGFiZWwuYnJhbmNoKCk7CiAJd3JpdGVTaWduZWRXb3JkKGxlbmd0aCk7CkBAIC01Mjg4LDM4MyArNTM5OSwzNzEgQEAKIAkJY2FzZXNMYWJlbFtzb3J0ZWRJbmRleGVzW2ldXS5icmFuY2goKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGxvcigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bG9yIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xvcjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xvcjsKIH0KKwogcHVibGljIHZvaWQgbHJlbSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bHJlbSIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19scmVtOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHJlbTsKIH0KKwogcHVibGljIHZvaWQgbHJldHVybigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bHJldHVybiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMCAKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCS8vIHRoZSBzdGFja0RlcHRoIHNob3VsZCBiZSBlcXVhbCB0byAwCisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xyZXR1cm47Ci0JdGhpcy5sYXN0QWJydXB0Q29tcGxldGlvbiA9IHRoaXMucG9zaXRpb247CQkKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xyZXR1cm47CisJdGhpcy5sYXN0QWJydXB0Q29tcGxldGlvbiA9IHRoaXMucG9zaXRpb247CiB9CisKIHB1YmxpYyB2b2lkIGxzaGwoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxzaGwiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHNobDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzaGw7CiB9CisKIHB1YmxpYyB2b2lkIGxzaHIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxzaHIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHNocjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzaHI7CiB9CisKIHB1YmxpYyB2b2lkIGxzdG9yZShpbnQgaUFyZykgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsc3RvcmU6IitpQXJnKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKG1heExvY2FscyA8PSBpQXJnICsgMSkgewotCQltYXhMb2NhbHMgPSBpQXJnICsgMjsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPD0gaUFyZyArIDEpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSBpQXJnICsgMjsKIAl9CiAJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdG9yZTsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdG9yZTsKIAkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOwogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAxID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCQlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAxID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbiArPSAyOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3RvcmU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl0aGlzLnBvc2l0aW9uICs9IDI7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3RvcmU7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGxzdG9yZV8wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsc3RvcmVfMCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAobWF4TG9jYWxzIDwgMikgewotCQltYXhMb2NhbHMgPSAyOworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8IDIpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSAyOwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3RvcmVfMDsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdG9yZV8wOwogfQorCiBwdWJsaWMgdm9pZCBsc3RvcmVfMSgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bHN0b3JlXzEiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKG1heExvY2FscyA8IDMpIHsKLQkJbWF4TG9jYWxzID0gMzsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5tYXhMb2NhbHMgPCAzKSB7CisJCXRoaXMubWF4TG9jYWxzID0gMzsKIAl9Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHN0b3JlXzE7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3RvcmVfMTsKIH0KKwogcHVibGljIHZvaWQgbHN0b3JlXzIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdGxzdG9yZV8yIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChtYXhMb2NhbHMgPCA0KSB7Ci0JCW1heExvY2FscyA9IDQ7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMubWF4TG9jYWxzIDwgNCkgeworCQl0aGlzLm1heExvY2FscyA9IDQ7CiAJfQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdG9yZV8yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHN0b3JlXzI7CiB9CisKIHB1YmxpYyB2b2lkIGxzdG9yZV8zKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsc3RvcmVfMyIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAobWF4TG9jYWxzIDwgNSkgewotCQltYXhMb2NhbHMgPSA1OworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLm1heExvY2FscyA8IDUpIHsKKwkJdGhpcy5tYXhMb2NhbHMgPSA1OwogCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3RvcmVfMzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdG9yZV8zOwogfQorCiBwdWJsaWMgdm9pZCBsc3ViKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRsc3ViIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAyOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDI7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX2xzdWI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sc3ViOwogfQorCiBwdWJsaWMgdm9pZCBsdXNocigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bHVzaHIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHVzaHI7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19sdXNocjsKIH0KKwogcHVibGljIHZvaWQgbHhvcigpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bHhvciIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGggLT0gMjsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19seG9yOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbHhvcjsKIH0KKwogcHVibGljIHZvaWQgbW9uaXRvcmVudGVyKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRtb25pdG9yZW50ZXIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbW9uaXRvcmVudGVyOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbW9uaXRvcmVudGVyOwogfQorCiBwdWJsaWMgdm9pZCBtb25pdG9yZXhpdCgpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bW9uaXRvcmV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbW9uaXRvcmV4aXQ7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19tb25pdG9yZXhpdDsKIH0KKwogcHVibGljIHZvaWQgbXVsdGlhbmV3YXJyYXkoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGludCBkaW1lbnNpb25zKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG11bHRpbmV3YXJyYXk6Iit0eXBlQmluZGluZysiLCIrZGltZW5zaW9ucyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoICs9ICgxIC0gZGltZW5zaW9ucyk7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoICs9ICgxIC0gZGltZW5zaW9ucyk7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMyA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24gKz0gMjsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19tdWx0aWFuZXdhcnJheTsKLQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUodHlwZUJpbmRpbmcpKTsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgZGltZW5zaW9uczsKKwl0aGlzLnBvc2l0aW9uICs9IDI7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX211bHRpYW5ld2FycmF5OworCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHR5cGVCaW5kaW5nKSk7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBkaW1lbnNpb25zOwogfQorCiAvLyBXZSBkaWRuJ3QgY2FsbCBpdCBuZXcsIGJlY2F1c2UgdGhlcmUgaXMgYSBjb25mbGl0IHdpdGggdGhlIG5ldyBrZXl3b3JkCiBwdWJsaWMgdm9pZCBuZXdfKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzoiK3R5cGVCaW5kaW5nLmRlYnVnTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDIgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OwotCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZSh0eXBlQmluZGluZykpOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OworCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKHR5cGVCaW5kaW5nKSk7CiB9CisKIHB1YmxpYyB2b2lkIG5ld2FycmF5KGludCBhcnJheV9UeXBlKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ld2FycmF5OiIrYXJyYXlfVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24gKz0gMjsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19uZXdhcnJheTsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgYXJyYXlfVHlwZTsKKwl0aGlzLnBvc2l0aW9uICs9IDI7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ld2FycmF5OworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgYXJyYXlfVHlwZTsKIH0KKwogcHVibGljIHZvaWQgbmV3QXJyYXkoQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZykgewogCVR5cGVCaW5kaW5nIGNvbXBvbmVudCA9IGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUoKTsKIAlzd2l0Y2ggKGNvbXBvbmVudC5pZCkgewogCQljYXNlIFR5cGVJZHMuVF9pbnQgOgotCQkJdGhpcy5uZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuSU5UX0FSUkFZKTsKKwkJCW5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5JTlRfQVJSQVkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJdGhpcy5uZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuQllURV9BUlJBWSk7CisJCQluZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuQllURV9BUlJBWSk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6Ci0JCQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5CT09MRUFOX0FSUkFZKTsKKwkJCW5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5CT09MRUFOX0FSUkFZKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6Ci0JCQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5TSE9SVF9BUlJBWSk7CisJCQluZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuU0hPUlRfQVJSQVkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgotCQkJdGhpcy5uZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuQ0hBUl9BUlJBWSk7CisJCQluZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuQ0hBUl9BUlJBWSk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0JCQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5MT05HX0FSUkFZKTsKKwkJCW5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5MT05HX0FSUkFZKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9mbG9hdCA6Ci0JCQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5GTE9BVF9BUlJBWSk7CisJCQluZXdhcnJheShDbGFzc0ZpbGVDb25zdGFudHMuRkxPQVRfQVJSQVkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0JCQl0aGlzLm5ld2FycmF5KENsYXNzRmlsZUNvbnN0YW50cy5ET1VCTEVfQVJSQVkpOworCQkJbmV3YXJyYXkoQ2xhc3NGaWxlQ29uc3RhbnRzLkRPVUJMRV9BUlJBWSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6Ci0JCQl0aGlzLmFuZXdhcnJheShjb21wb25lbnQpOworCQkJYW5ld2FycmF5KGNvbXBvbmVudCk7CiAJfQogfQorCiBwdWJsaWMgdm9pZCBuZXdKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCkgewogCS8vIG5ldzogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yCi0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ldzsKLQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdGFudFBvb2xOYW1lKSk7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19uZXc7CisJd3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdGFudFBvb2xOYW1lKSk7CiB9CisKIHB1YmxpYyB2b2lkIG5ld0phdmFMYW5nRXJyb3IoKSB7CiAJLy8gbmV3OiBqYXZhLmxhbmcuRXJyb3IKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bmV3OiBqYXZhLmxhbmcuRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDIgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OwotCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdFcnJvckNvbnN0YW50UG9vbE5hbWUpKTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ldzsKKwl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdFcnJvckNvbnN0YW50UG9vbE5hbWUpKTsKIH0KKwogcHVibGljIHZvaWQgbmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKSB7CiAJLy8gbmV3OiBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bmV3OiBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDIgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OwotCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdOb0NsYXNzRGVmRm91bmRFcnJvckNvbnN0YW50UG9vbE5hbWUpKTsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ldzsKKwl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdOb0NsYXNzRGVmRm91bmRFcnJvckNvbnN0YW50UG9vbE5hbWUpKTsKIH0KKwogcHVibGljIHZvaWQgbmV3U3RyaW5nQ29udGF0ZW5hdGlvbigpIHsKIAkvLyBuZXc6IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKIAkvLyBuZXc6IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi0JaWYgKERFQlVHKSB7Ci0JCWlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bmV3OiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzogamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgrKzsKKwlpZiAodGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkgeworCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOwogCX0KLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpIHsKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCX0KLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMiA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgKyAyID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ldzsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX25ldzsKIAlpZiAodGhpcy50YXJnZXRMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWlsZGVyQ29uc3RhbnRQb29sTmFtZSkpOworCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWlsZGVyQ29uc3RhbnRQb29sTmFtZSkpOwogCX0gZWxzZSB7Ci0JCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdCdWZmZXJDb25zdGFudFBvb2xOYW1lKSk7CisJCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0YW50UG9vbE5hbWUpKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIG5ld1dyYXBwZXJGb3IoaW50IHR5cGVJRCkgewotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoKys7Ci0JaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKLQkJc3RhY2tNYXggPSBzdGFja0RlcHRoOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAyID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDIgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfbmV3OwogCXN3aXRjaCAodHlwZUlEKSB7CiAJCWNhc2UgVHlwZUlkcy5UX2ludCA6IC8vIG5ldzogamF2YS5sYW5nLkludGVnZXIKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRuZXc6IGphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdJbnRlZ2VyQ29uc3RhbnRQb29sTmFtZSkpOworCQkJd3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUpKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDogLy8gbmV3OiBqYXZhLmxhbmcuQm9vbGVhbgotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzogamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0Jvb2xlYW5Db25zdGFudFBvb2xOYW1lKSk7CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOiAvLyBuZXc6IGphdmEubGFuZy5CeXRlCi0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bmV3OiBqYXZhLmxhbmcuQnl0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQnl0ZUNvbnN0YW50UG9vbE5hbWUpKTsKKwkJCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0J5dGVDb25zdGFudFBvb2xOYW1lKSk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfY2hhciA6IC8vIG5ldzogamF2YS5sYW5nLkNoYXJhY3RlcgotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzogamF2YS5sYW5nLkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSkpOworCQkJd3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDogLy8gbmV3OiBqYXZhLmxhbmcuRmxvYXQKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRuZXc6IGphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lKSk7CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdGbG9hdENvbnN0YW50UG9vbE5hbWUpKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOiAvLyBuZXc6IGphdmEubGFuZy5Eb3VibGUKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRuZXc6IGphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUpKTsKKwkJCXdyaXRlVW5zaWduZWRTaG9ydCh0aGlzLmNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUpKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6IC8vIG5ldzogamF2YS5sYW5nLlNob3J0Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0bmV3OiBqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ1Nob3J0Q29uc3RhbnRQb29sTmFtZSkpOworCQkJd3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lKSk7CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6IC8vIG5ldzogamF2YS5sYW5nLkxvbmcKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRuZXc6IGphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdMb25nQ29uc3RhbnRQb29sTmFtZSkpOworCQkJd3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvclR5cGUoQ29uc3RhbnRQb29sLkphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUpKTsKIAkJCWJyZWFrOwogCQljYXNlIFR5cGVJZHMuVF92b2lkIDogLy8gbmV3OiBqYXZhLmxhbmcuVm9pZAotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdG5ldzogamF2YS5sYW5nLlZvaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JUeXBlKENvbnN0YW50UG9vbC5KYXZhTGFuZ1ZvaWRDb25zdGFudFBvb2xOYW1lKSk7CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5jb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9yVHlwZShDb25zdGFudFBvb2wuSmF2YUxhbmdWb2lkQ29uc3RhbnRQb29sTmFtZSkpOwogCX0KIH0KKwogcHVibGljIHZvaWQgbm9wKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRub3AiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19ub3A7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19ub3A7CiB9CisKIHB1YmxpYyB2b2lkIG9wdGltaXplQnJhbmNoKGludCBvbGRQb3NpdGlvbiwgQnJhbmNoTGFiZWwgbGJsKSB7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvdW50TGFiZWxzOyBpKyspIHsKIAkJQnJhbmNoTGFiZWwgbGFiZWwgPSB0aGlzLmxhYmVsc1tpXTsKIAkJaWYgKG9sZFBvc2l0aW9uID09IGxhYmVsLnBvc2l0aW9uKSB7Ci0JCQlsYWJlbC5wb3NpdGlvbiA9IHBvc2l0aW9uOworCQkJbGFiZWwucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uOwogCQkJaWYgKGxhYmVsIGluc3RhbmNlb2YgQ2FzZUxhYmVsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBvc2l0aW9uIC0gKChDYXNlTGFiZWwpIGxhYmVsKS5pbnN0cnVjdGlvblBvc2l0aW9uOworCQkJCWludCBvZmZzZXQgPSB0aGlzLnBvc2l0aW9uIC0gKChDYXNlTGFiZWwpIGxhYmVsKS5pbnN0cnVjdGlvblBvc2l0aW9uOwogCQkJCWludFtdIGZvcndhcmRSZWZzID0gbGFiZWwuZm9yd2FyZFJlZmVyZW5jZXMoKTsKIAkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gbGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50KCk7IGogPCBsZW5ndGg7IGorKykgewogCQkJCQlpbnQgZm9yd2FyZFJlZiA9IGZvcndhcmRSZWZzW2pdOwpAQCAtNTY4MCw2NCArNTc3OSw0OCBAQAogCQl9CiAJfQogfQorCiBwdWJsaWMgdm9pZCBwb3AoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdHBvcCIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCXN0YWNrRGVwdGgtLTsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19wb3A7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19wb3A7CiB9CisKIHB1YmxpYyB2b2lkIHBvcDIoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdHBvcDIiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoIC09IDI7Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfcG9wMjsKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3BvcDI7CiB9CisKK3B1YmxpYyB2b2lkIHB1c2hFeGNlcHRpb25PblN0YWNrKFR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKKwl0aGlzLnN0YWNrRGVwdGggPSAxOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworfQorCiBwdWJsaWMgdm9pZCBwdXNoT25TdGFjayhUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JaWYgKCsrc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQotCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKCsrdGhpcy5zdGFja0RlcHRoID4gdGhpcy5zdGFja01heCkKKwkJdGhpcy5zdGFja01heCA9IHRoaXMuc3RhY2tEZXB0aDsKIH0KLXB1YmxpYyB2b2lkIHB1dGZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0cHV0ZmllbGQ6IitmaWVsZEJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JaW50IHJldHVyblR5cGVTaXplID0gMTsKLQlpZiAoKGZpZWxkQmluZGluZy50eXBlLmlkID09IFR5cGVJZHMuVF9kb3VibGUpIHx8IChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUeXBlSWRzLlRfbG9uZykpIHsKLQkJcmV0dXJuVHlwZVNpemUgPSAyOwotCX0KLQlnZW5lcmF0ZUZpZWxkQWNjZXNzKAotCQkJT3Bjb2Rlcy5PUENfcHV0ZmllbGQsCi0JCQlyZXR1cm5UeXBlU2l6ZSwKLQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKLQkJCWZpZWxkQmluZGluZy5uYW1lLAotCQkJZmllbGRCaW5kaW5nLnR5cGUpOwotfQotcHVibGljIHZvaWQgcHV0c3RhdGljKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0cHV0c3RhdGljOiIrZmllbGRCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCWludCByZXR1cm5UeXBlU2l6ZSA9IDE7Ci0JaWYgKChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUeXBlSWRzLlRfZG91YmxlKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUuaWQgPT0gVHlwZUlkcy5UX2xvbmcpKSB7Ci0JCXJldHVyblR5cGVTaXplID0gMjsKLQl9Ci0JZ2VuZXJhdGVGaWVsZEFjY2VzcygKLQkJCU9wY29kZXMuT1BDX3B1dHN0YXRpYywKLQkJCXJldHVyblR5cGVTaXplLAotCQkJZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAotCQkJZmllbGRCaW5kaW5nLm5hbWUsCi0JCQlmaWVsZEJpbmRpbmcudHlwZSk7Ci19CisKIHB1YmxpYyB2b2lkIHJlY29yZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUyB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpID09IDApCisJaWYgKCh0aGlzLmdlbmVyYXRlQXR0cmlidXRlcyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9WQVJTCisJCQl8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRQorCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQogCQlyZXR1cm47Ci0JaWYgKGFsbExvY2Fsc0NvdW50ZXIgPT0gbG9jYWxzLmxlbmd0aCkgeworCWlmICh0aGlzLmFsbExvY2Fsc0NvdW50ZXIgPT0gdGhpcy5sb2NhbHMubGVuZ3RoKSB7CiAJCS8vIHJlc2l6ZSB0aGUgY29sbGVjdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KGxvY2FscywgMCwgbG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW2FsbExvY2Fsc0NvdW50ZXIgKyBMT0NBTFNfSU5DUkVNRU5UXSwgMCwgYWxsTG9jYWxzQ291bnRlcik7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhbHMsIDAsIHRoaXMubG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW3RoaXMuYWxsTG9jYWxzQ291bnRlciArIExPQ0FMU19JTkNSRU1FTlRdLCAwLCB0aGlzLmFsbExvY2Fsc0NvdW50ZXIpOwogCX0KLQlsb2NhbHNbYWxsTG9jYWxzQ291bnRlcisrXSA9IGxvY2FsOworCXRoaXMubG9jYWxzW3RoaXMuYWxsTG9jYWxzQ291bnRlcisrXSA9IGxvY2FsOwogCWxvY2FsLmluaXRpYWxpemF0aW9uUENzID0gbmV3IGludFs0XTsKIAlsb2NhbC5pbml0aWFsaXphdGlvbkNvdW50ID0gMDsKIH0KQEAgLTU3NDUsMzYgKzU4MjgsMjYxIEBACiBwdWJsaWMgdm9pZCByZWNvcmRFeHByZXNzaW9uVHlwZShUeXBlQmluZGluZyB0eXBlQmluZGluZykgewogCS8vIG5vdGhpbmcgdG8gZG8KIH0KKwogcHVibGljIHZvaWQgcmVjb3JkUG9zaXRpb25zRnJvbShpbnQgc3RhcnRQQywgaW50IHNvdXJjZVBvcykgewogCXRoaXMucmVjb3JkUG9zaXRpb25zRnJvbShzdGFydFBDLCBzb3VyY2VQb3MsIGZhbHNlKTsKIH0KLXB1YmxpYyB2b2lkIHJlY29yZFBvc2l0aW9uc0Zyb20oaW50IHN0YXJ0UEMsIGludCBzb3VyY2VQb3MsIGJvb2xlYW4gd2lkZW4pIHsKIAotCS8qIFJlY29yZCBwb3NpdGlvbnMgaW4gdGhlIHRhYmxlLCBvbmx5IGlmIG5vdGhpbmcgaGFzIAotCSAqIGFscmVhZHkgYmVlbiByZWNvcmRlZC4gU2luY2Ugd2Ugb3V0cHV0IHRoZW0gb24gdGhlIHdheSAKK3B1YmxpYyB2b2lkIHJlY29yZFBvc2l0aW9uc0Zyb20oaW50IHN0YXJ0UEMsIGludCBzb3VyY2VQb3MsIGJvb2xlYW4gd2lkZW4pIHsKKwkvKiBSZWNvcmQgcG9zaXRpb25zIGluIHRoZSB0YWJsZSwgb25seSBpZiBub3RoaW5nIGhhcworCSAqIGFscmVhZHkgYmVlbiByZWNvcmRlZC4gU2luY2Ugd2Ugb3V0cHV0IHRoZW0gb24gdGhlIHdheQogCSAqIHVwIChjaGlsZHJlbiBmaXJzdCBmb3IgbW9yZSBzcGVjaWZpYyBpbmZvKQogCSAqIFRoZSBwY1RvU291cmNlTWFwIHRhYmxlIGlzIGFsd2F5cyBzb3J0ZWQuCiAJICovCi0KIAlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfTElORVMpID09IDAKIAkJCXx8IHNvdXJjZVBvcyA9PSAwCi0JCQl8fCAoc3RhcnRQQyA9PSBwb3NpdGlvbiAmJiAhd2lkZW4pKQorCQkJfHwgKHN0YXJ0UEMgPT0gdGhpcy5wb3NpdGlvbiAmJiAhd2lkZW4pKQogCQlyZXR1cm47CiAKIAkvLyBXaWRlbmluZyBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGFscmVhZHkgaGFzIHRoZSBzYW1lIHNvdXJjZSBwb3NpdGlvbnMKLQlpZiAocGNUb1NvdXJjZU1hcFNpemUgKyA0ID4gcGNUb1NvdXJjZU1hcC5sZW5ndGgpIHsKKwlpZiAodGhpcy5wY1RvU291cmNlTWFwU2l6ZSArIDQgPiB0aGlzLnBjVG9Tb3VyY2VNYXAubGVuZ3RoKSB7CiAJCS8vIHJlc2l6ZSB0aGUgYXJyYXkgcGNUb1NvdXJjZU1hcAotCQlTeXN0ZW0uYXJyYXljb3B5KHBjVG9Tb3VyY2VNYXAsIDAsIHBjVG9Tb3VyY2VNYXAgPSBuZXcgaW50W3BjVG9Tb3VyY2VNYXBTaXplIDw8IDFdLCAwLCBwY1RvU291cmNlTWFwU2l6ZSk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wY1RvU291cmNlTWFwLCAwLCB0aGlzLnBjVG9Tb3VyY2VNYXAgPSBuZXcgaW50W3RoaXMucGNUb1NvdXJjZU1hcFNpemUgPDwgMV0sIDAsIHRoaXMucGNUb1NvdXJjZU1hcFNpemUpOwogCX0KLQlpbnQgbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcihzb3VyY2VQb3MsIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMsIDAsIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMubGVuZ3RoLTEpOwogCS8vIGxhc3RFbnRyeVBDIHJlcHJlc2VudHMgdGhlIGVuZFBDIG9mIHRoZSBsYXN0RW50cnkuCi0JaWYgKHBjVG9Tb3VyY2VNYXBTaXplID4gMCkgeworCWlmICh0aGlzLnBjVG9Tb3VyY2VNYXBTaXplID4gMCkgeworCQlpbnQgbGluZU51bWJlcjsKKwkJaW50IHByZXZpb3VzTGluZU51bWJlciA9IHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMV07CisJCWlmICh0aGlzLmxpbmVOdW1iZXJTdGFydCA9PSB0aGlzLmxpbmVOdW1iZXJFbmQpIHsKKwkJCS8vIG1ldGhvZCBvbiBvbmUgbGluZQorCQkJbGluZU51bWJlciA9IHRoaXMubGluZU51bWJlclN0YXJ0OworCQl9IGVsc2UgeworCQkJLy8gQ2hlY2sgbmV4dCBsaW5lIG51bWJlciBpZiB0aGlzIGlzIHRoZSBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yCisJCQlpbnRbXSBsaW5lU2VwYXJhdG9yUG9zaXRpb25zMiA9IHRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9uczsKKwkJCWludCBsZW5ndGggPSBsaW5lU2VwYXJhdG9yUG9zaXRpb25zMi5sZW5ndGg7CisJCQlpZiAocHJldmlvdXNMaW5lTnVtYmVyID09IDEpIHsKKwkJCQlpZiAoc291cmNlUG9zIDwgbGluZVNlcGFyYXRvclBvc2l0aW9uczJbMF0pIHsKKwkJCQkJbGluZU51bWJlciA9IDE7CisJCQkJCS8qIHRoZSBsYXN0IHJlY29yZGVkIGVudHJ5IGlzIG9uIHRoZSBzYW1lIGxpbmUuIEJ1dCBpdCBjb3VsZCBiZSByZWxldmFudCB0byB3aWRlbiB0aGlzIGVudHJ5LgorCQkJCQkgICB3ZSB3YW50IHRvIGV4dGVuZCB0aGlzIGVudHJ5IGZvcndhcmQgaW4gY2FzZSB3ZSBnZW5lcmF0ZWQgc29tZSBieXRlY29kZSBiZWZvcmUgdGhlIGxhc3QgZW50cnkgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYW55IHN0YXRlbWVudAorCQkJCQkqLworCQkJCQlpZiAoc3RhcnRQQyA8IHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMl0pIHsKKwkJCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHRoaXMucGNUb1NvdXJjZU1hcCwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSwgc3RhcnRQQyk7CisJCQkJCQlpZiAoaW5zZXJ0aW9uSW5kZXggIT0gLTEpIHsKKwkJCQkJCQkvLyB3aWRlbiB0aGUgZXhpc3RpbmcgZW50cnkKKwkJCQkJCQkvLyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byBtb3ZlIHRoZSBsYXN0IGVudHJ5IGF0IGFub3RoZXIgbG9jYXRpb24gdG8ga2VlcCBhIHNvcnRlZCB0YWJsZQorCQkJCQkJCS8qIEZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgYXQgdGhlIGluc2VydGlvbiBwb3NpdGlvbiB0aGVyZSBpcyBub3QgYW4gZXhpc3RpbmcgZW50cnkKKwkJCQkJCQkgKiB0aGF0IGluY2x1ZGVzIHRoZSBvbmUgd2Ugd2FudCB0byBpbnNlcnQuIFRoaXMgaXMgdGhlIGNhc2UgaWYgcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCAtIDFdID09IG5ld0xpbmUuCisJCQkJCQkJICogSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSB0YWJsZS4gSWYgbm90LCB3ZSB3YW50IHRvIGluc2VydCBhIG5ldyBlbnRyeS4gUHJpb3IgdG8gaW5zZXJ0aW9uCisJCQkJCQkJICogd2Ugd2FudCB0byBjaGVjayBpZiBpdCBpcyB3b3J0aCBkb2luZyBhbiBhcnJheWNvcHkuIElmIG5vdCB3ZSBzaW1wbHkgdXBkYXRlIHRoZSByZWNvcmRlZCBwYy4KKwkJCQkJCQkgKi8KKwkJCQkJCQlpZiAoISgoaW5zZXJ0aW9uSW5kZXggPiAxKSAmJiAodGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4IC0gMV0gPT0gbGluZU51bWJlcikpKSB7CisJCQkJCQkJCWlmICgodGhpcy5wY1RvU291cmNlTWFwU2l6ZSA+IDQpICYmICh0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDRdID4gc3RhcnRQQykpIHsKKwkJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCwgdGhpcy5wY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCArIDIsIHRoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyIC0gaW5zZXJ0aW9uSW5kZXgpOworCQkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4KytdID0gc3RhcnRQQzsKKwkJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBsaW5lTnVtYmVyOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyXSA9IHN0YXJ0UEM7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdGhpcy5sYXN0RW50cnlQQyA9IHRoaXMucG9zaXRpb247CisJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSAxIHx8IHNvdXJjZVBvcyA8IGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMyWzFdKSB7CisJCQkJCWxpbmVOdW1iZXIgPSAyOworCQkJCQlpZiAoc3RhcnRQQyA8PSB0aGlzLmxhc3RFbnRyeVBDKSB7CisJCQkJCQkvLyB3ZSBmb3Jnb3QgdG8gYWRkIGFuIGVudHJ5LgorCQkJCQkJLy8gc2VhcmNoIGlmIGFuIGV4aXN0aW5nIGVudHJ5IGV4aXN0cyBmb3Igc3RhcnRQQworCQkJCQkJaW50IGluc2VydGlvbkluZGV4ID0gaW5zZXJ0aW9uSW5kZXgodGhpcy5wY1RvU291cmNlTWFwLCB0aGlzLnBjVG9Tb3VyY2VNYXBTaXplLCBzdGFydFBDKTsKKwkJCQkJCWlmIChpbnNlcnRpb25JbmRleCAhPSAtMSkgeworCQkJCQkJCS8vIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGVudHJ5IHN0YXJ0aW5nIHdpdGggc3RhcnRQQy4KKwkJCQkJCQlpbnQgZXhpc3RpbmdFbnRyeUluZGV4ID0gaW5kZXhPZlNhbWVMaW5lRW50cnlTaW5jZVBDKHN0YXJ0UEMsIGxpbmVOdW1iZXIpOyAvLyBpbmRleCBmb3IgUEMKKwkJCQkJCQkvKiB0aGUgZXhpc3RpbmdFbnRyeUluZGV4IGNvcnJlc3BvbmRzIHRvIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbGluZSBhbmQgYSBQQyA+PSBzdGFydFBDLgorCQkJCQkJCQlpbiB0aGlzIGNhc2UgaXQgaXMgcmVsZXZhbnQgdG8gd2lkZW4gdGhpcyBlbnRyeSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KKwkJCQkJCQkJbGluZTE6IHRoaXMoYSwKKwkJCQkJCQkJICBiLAorCQkJCQkJCQkgIGMpOworCQkJCQkJCQl3aXRoIHRoaXMgY29kZSB3ZSBnZW5lcmF0ZSBlYWNoIGFyZ3VtZW50LiBXZSBnZW5lcmF0ZSBhIGFsb2FkMCB0byBpbnZva2UgdGhlIGNvbnN0cnVjdG9yLiBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcworCQkJCQkJCQlhbG9hZDAgYnl0ZWNvZGUuIFRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgb25lIGZvciB0aGUgYXJndW1lbnQgYS4KKwkJCQkJCQkJQnV0IHdlIHdhbnQgdGhlIGNvbnN0cnVjdG9yIGNhbGwgdG8gc3RhcnQgYXQgdGhlIGFsb2FkMCBwYyBhbmQgbm90IGp1c3QgYXQgdGhlIHBjIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKwkJCQkJCQkJU28gd2Ugd2lkZW4gdGhlIGV4aXN0aW5nIGVudHJ5IChpZiB0aGVyZSBpcyBvbmUpIG9yIHdlIGNyZWF0ZSBhIG5ldyBlbnRyeSB3aXRoIHRoZSBzdGFydFBDLgorCQkJCQkJCSovCisJCQkJCQkJaWYgKGV4aXN0aW5nRW50cnlJbmRleCAhPSAtMSkgeworCQkJCQkJCQkvLyB3aWRlbiBleGlzdGluZyBlbnRyeQorCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbZXhpc3RpbmdFbnRyeUluZGV4XSA9IHN0YXJ0UEM7CisJCQkJCQkJfSBlbHNlIGlmIChpbnNlcnRpb25JbmRleCA8IDEgfHwgdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4IC0gMV0gIT0gbGluZU51bWJlcikgeworCQkJCQkJCQkvLyB3ZSBoYXZlIHRvIGFkZCBhbiBlbnRyeSB0aGF0IHdvbid0IGJlIHNvcnRlZC4gU28gd2Ugc29ydCB0aGUgcGNUb1NvdXJjZU1hcC4KKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCB0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4ICsgMiwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4KytdID0gc3RhcnRQQzsKKwkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4XSA9IGxpbmVOdW1iZXI7CisJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFNpemUgKz0gMjsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKHRoaXMucG9zaXRpb24gIT0gdGhpcy5sYXN0RW50cnlQQykgeyAvLyBubyBieXRlY29kZSBzaW5jZSBsYXN0IGVudHJ5IHBjCisJCQkJCQkJaWYgKHRoaXMubGFzdEVudHJ5UEMgPT0gc3RhcnRQQyB8fCB0aGlzLmxhc3RFbnRyeVBDID09IHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMl0pIHsKKwkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSB0aGlzLmxhc3RFbnRyeVBDOworCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSsrXSA9IGxpbmVOdW1iZXI7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICh0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDFdIDwgbGluZU51bWJlciAmJiB3aWRlbikgeworCQkJCQkJCS8vIHNlZSBpZiB3ZSBjYW4gd2lkZW4gdGhlIGV4aXN0aW5nIGVudHJ5CisJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbmV3IGVudHJ5LiBUaGUgZW5kUEMgb2YgdGhlIHByZXZpb3VzIGVudHJ5IGlzIG5vdCBpbiBjb25mbGl0IHdpdGggdGhlIHN0YXJ0UEMgb2YgdGhlIG5ldyBlbnRyeS4KKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gc3RhcnRQQzsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKKwkJCQkJfQorCQkJCQl0aGlzLmxhc3RFbnRyeVBDID0gdGhpcy5wb3NpdGlvbjsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHNpbmNlIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMgaXMgemVyby1iYXNlZCwgd2UgcGFzcyB0aGlzLmxpbmVOdW1iZXJTdGFydCAtIDEgYW5kIHRoaXMubGluZU51bWJlckVuZCAtIDEKKwkJCQkJbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcihzb3VyY2VQb3MsIHRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9ucywgdGhpcy5saW5lTnVtYmVyU3RhcnQgLSAxLCB0aGlzLmxpbmVOdW1iZXJFbmQgLSAxKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHByZXZpb3VzTGluZU51bWJlciA8IGxlbmd0aCkgeworCQkJCWlmIChsaW5lU2VwYXJhdG9yUG9zaXRpb25zMltwcmV2aW91c0xpbmVOdW1iZXIgLSAyXSA8IHNvdXJjZVBvcykgeworCQkJCQlpZiAoc291cmNlUG9zIDwgbGluZVNlcGFyYXRvclBvc2l0aW9uczJbcHJldmlvdXNMaW5lTnVtYmVyIC0gMV0pIHsKKwkJCQkJCWxpbmVOdW1iZXIgPSBwcmV2aW91c0xpbmVOdW1iZXI7CisJCQkJCQkvKiB0aGUgbGFzdCByZWNvcmRlZCBlbnRyeSBpcyBvbiB0aGUgc2FtZSBsaW5lLiBCdXQgaXQgY291bGQgYmUgcmVsZXZhbnQgdG8gd2lkZW4gdGhpcyBlbnRyeS4KKwkJCQkJCSAgIHdlIHdhbnQgdG8gZXh0ZW5kIHRoaXMgZW50cnkgZm9yd2FyZCBpbiBjYXNlIHdlIGdlbmVyYXRlZCBzb21lIGJ5dGVjb2RlIGJlZm9yZSB0aGUgbGFzdCBlbnRyeSB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byBhbnkgc3RhdGVtZW50CisJCQkJCQkqLworCQkJCQkJaWYgKHN0YXJ0UEMgPCB0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDJdKSB7CisJCQkJCQkJaW50IGluc2VydGlvbkluZGV4ID0gaW5zZXJ0aW9uSW5kZXgodGhpcy5wY1RvU291cmNlTWFwLCB0aGlzLnBjVG9Tb3VyY2VNYXBTaXplLCBzdGFydFBDKTsKKwkJCQkJCQlpZiAoaW5zZXJ0aW9uSW5kZXggIT0gLTEpIHsKKwkJCQkJCQkJLy8gd2lkZW4gdGhlIGV4aXN0aW5nIGVudHJ5CisJCQkJCQkJCS8vIHdlIGhhdmUgdG8gZmlndXJlIG91dCBpZiB3ZSBuZWVkIHRvIG1vdmUgdGhlIGxhc3QgZW50cnkgYXQgYW5vdGhlciBsb2NhdGlvbiB0byBrZWVwIGEgc29ydGVkIHRhYmxlCisJCQkJCQkJCS8qIEZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgYXQgdGhlIGluc2VydGlvbiBwb3NpdGlvbiB0aGVyZSBpcyBub3QgYW4gZXhpc3RpbmcgZW50cnkKKwkJCQkJCQkJICogdGhhdCBpbmNsdWRlcyB0aGUgb25lIHdlIHdhbnQgdG8gaW5zZXJ0LiBUaGlzIGlzIHRoZSBjYXNlIGlmIHBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXggLSAxXSA9PSBuZXdMaW5lLgorCQkJCQkJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHRhYmxlLiBJZiBub3QsIHdlIHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVudHJ5LiBQcmlvciB0byBpbnNlcnRpb24KKwkJCQkJCQkJICogd2Ugd2FudCB0byBjaGVjayBpZiBpdCBpcyB3b3J0aCBkb2luZyBhbiBhcnJheWNvcHkuIElmIG5vdCB3ZSBzaW1wbHkgdXBkYXRlIHRoZSByZWNvcmRlZCBwYy4KKwkJCQkJCQkJICovCisJCQkJCQkJCWlmICghKChpbnNlcnRpb25JbmRleCA+IDEpICYmICh0aGlzLnBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXggLSAxXSA9PSBsaW5lTnVtYmVyKSkpIHsKKwkJCQkJCQkJCWlmICgodGhpcy5wY1RvU291cmNlTWFwU2l6ZSA+IDQpICYmICh0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDRdID4gc3RhcnRQQykpIHsKKwkJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXgsIHRoaXMucGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXggKyAyLCB0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMiAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXgrK10gPSBzdGFydFBDOworCQkJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBsaW5lTnVtYmVyOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDJdID0gc3RhcnRQQzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXRoaXMubGFzdEVudHJ5UEMgPSB0aGlzLnBvc2l0aW9uOworCQkJCQkJcmV0dXJuOworCQkJCQl9IGVsc2UgaWYgKHNvdXJjZVBvcyA8IGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMyW3ByZXZpb3VzTGluZU51bWJlcl0pIHsKKwkJCQkJCWxpbmVOdW1iZXIgPSBwcmV2aW91c0xpbmVOdW1iZXIgKyAxOworCQkJCQkJaWYgKHN0YXJ0UEMgPD0gdGhpcy5sYXN0RW50cnlQQykgeworCQkJCQkJCS8vIHdlIGZvcmdvdCB0byBhZGQgYW4gZW50cnkuCisJCQkJCQkJLy8gc2VhcmNoIGlmIGFuIGV4aXN0aW5nIGVudHJ5IGV4aXN0cyBmb3Igc3RhcnRQQworCQkJCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHRoaXMucGNUb1NvdXJjZU1hcCwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSwgc3RhcnRQQyk7CisJCQkJCQkJaWYgKGluc2VydGlvbkluZGV4ICE9IC0xKSB7CisJCQkJCQkJCS8vIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGVudHJ5IHN0YXJ0aW5nIHdpdGggc3RhcnRQQy4KKwkJCQkJCQkJaW50IGV4aXN0aW5nRW50cnlJbmRleCA9IGluZGV4T2ZTYW1lTGluZUVudHJ5U2luY2VQQyhzdGFydFBDLCBsaW5lTnVtYmVyKTsgLy8gaW5kZXggZm9yIFBDCisJCQkJCQkJCS8qIHRoZSBleGlzdGluZ0VudHJ5SW5kZXggY29ycmVzcG9uZHMgdG8gYW4gZW50cnkgd2l0aCB0aGUgc2FtZSBsaW5lIGFuZCBhIFBDID49IHN0YXJ0UEMuCisJCQkJCQkJCQlpbiB0aGlzIGNhc2UgaXQgaXMgcmVsZXZhbnQgdG8gd2lkZW4gdGhpcyBlbnRyeSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KKwkJCQkJCQkJCWxpbmUxOiB0aGlzKGEsCisJCQkJCQkJCQkgIGIsCisJCQkJCQkJCQkgIGMpOworCQkJCQkJCQkJd2l0aCB0aGlzIGNvZGUgd2UgZ2VuZXJhdGUgZWFjaCBhcmd1bWVudC4gV2UgZ2VuZXJhdGUgYSBhbG9hZDAgdG8gaW52b2tlIHRoZSBjb25zdHJ1Y3Rvci4gVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMKKwkJCQkJCQkJCWFsb2FkMCBieXRlY29kZS4gVGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBvbmUgZm9yIHRoZSBhcmd1bWVudCBhLgorCQkJCQkJCQkJQnV0IHdlIHdhbnQgdGhlIGNvbnN0cnVjdG9yIGNhbGwgdG8gc3RhcnQgYXQgdGhlIGFsb2FkMCBwYyBhbmQgbm90IGp1c3QgYXQgdGhlIHBjIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKwkJCQkJCQkJCVNvIHdlIHdpZGVuIHRoZSBleGlzdGluZyBlbnRyeSAoaWYgdGhlcmUgaXMgb25lKSBvciB3ZSBjcmVhdGUgYSBuZXcgZW50cnkgd2l0aCB0aGUgc3RhcnRQQy4KKwkJCQkJCQkJKi8KKwkJCQkJCQkJaWYgKGV4aXN0aW5nRW50cnlJbmRleCAhPSAtMSkgeworCQkJCQkJCQkJLy8gd2lkZW4gZXhpc3RpbmcgZW50cnkKKwkJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtleGlzdGluZ0VudHJ5SW5kZXhdID0gc3RhcnRQQzsKKwkJCQkJCQkJfSBlbHNlIGlmIChpbnNlcnRpb25JbmRleCA8IDEgfHwgdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4IC0gMV0gIT0gbGluZU51bWJlcikgeworCQkJCQkJCQkJLy8gd2UgaGF2ZSB0byBhZGQgYW4gZW50cnkgdGhhdCB3b24ndCBiZSBzb3J0ZWQuIFNvIHdlIHNvcnQgdGhlIHBjVG9Tb3VyY2VNYXAuCisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXgsIHRoaXMucGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXggKyAyLCB0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gaW5zZXJ0aW9uSW5kZXgpOworCQkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4KytdID0gc3RhcnRQQzsKKwkJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBsaW5lTnVtYmVyOworCQkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwU2l6ZSArPSAyOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uICE9IHRoaXMubGFzdEVudHJ5UEMpIHsgLy8gbm8gYnl0ZWNvZGUgc2luY2UgbGFzdCBlbnRyeSBwYworCQkJCQkJCQlpZiAodGhpcy5sYXN0RW50cnlQQyA9PSBzdGFydFBDIHx8IHRoaXMubGFzdEVudHJ5UEMgPT0gdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyXSkgeworCQkJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSsrXSA9IHRoaXMubGFzdEVudHJ5UEM7CisJCQkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSsrXSA9IGxpbmVOdW1iZXI7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMV0gPCBsaW5lTnVtYmVyICYmIHdpZGVuKSB7CisJCQkJCQkJCS8vIHNlZSBpZiB3ZSBjYW4gd2lkZW4gdGhlIGV4aXN0aW5nIGVudHJ5CisJCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMV0gPSBsaW5lTnVtYmVyOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gd2UgY2FuIHNhZmVseSBhZGQgdGhlIG5ldyBlbnRyeS4gVGhlIGVuZFBDIG9mIHRoZSBwcmV2aW91cyBlbnRyeSBpcyBub3QgaW4gY29uZmxpdCB3aXRoIHRoZSBzdGFydFBDIG9mIHRoZSBuZXcgZW50cnkuCisJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSBzdGFydFBDOworCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKKwkJCQkJCX0KKwkJCQkJCXRoaXMubGFzdEVudHJ5UEMgPSB0aGlzLnBvc2l0aW9uOworCQkJCQkJcmV0dXJuOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gc2luY2UgbGluZVNlcGFyYXRvclBvc2l0aW9ucyBpcyB6ZXJvLWJhc2VkLCB3ZSBwYXNzIHRoaXMubGluZU51bWJlclN0YXJ0IC0gMSBhbmQgdGhpcy5saW5lTnVtYmVyRW5kIC0gMQorCQkJCQkJbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcihzb3VyY2VQb3MsIHRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9ucywgdGhpcy5saW5lTnVtYmVyU3RhcnQgLSAxLCB0aGlzLmxpbmVOdW1iZXJFbmQgLSAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIHNpbmNlIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMgaXMgemVyby1iYXNlZCwgd2UgcGFzcyB0aGlzLmxpbmVOdW1iZXJTdGFydCAtIDEgYW5kIHRoaXMubGluZU51bWJlckVuZCAtIDEKKwkJCQkJbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcihzb3VyY2VQb3MsIHRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9ucywgdGhpcy5saW5lTnVtYmVyU3RhcnQgLSAxLCB0aGlzLmxpbmVOdW1iZXJFbmQgLSAxKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMyW2xlbmd0aCAtIDFdIDwgc291cmNlUG9zKSB7CisJCQkJbGluZU51bWJlciA9IGxlbmd0aCArIDE7CisJCQkJaWYgKHN0YXJ0UEMgPD0gdGhpcy5sYXN0RW50cnlQQykgeworCQkJCQkvLyB3ZSBmb3Jnb3QgdG8gYWRkIGFuIGVudHJ5LgorCQkJCQkvLyBzZWFyY2ggaWYgYW4gZXhpc3RpbmcgZW50cnkgZXhpc3RzIGZvciBzdGFydFBDCisJCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHRoaXMucGNUb1NvdXJjZU1hcCwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSwgc3RhcnRQQyk7CisJCQkJCWlmIChpbnNlcnRpb25JbmRleCAhPSAtMSkgeworCQkJCQkJLy8gdGhlcmUgaXMgbm8gZXhpc3RpbmcgZW50cnkgc3RhcnRpbmcgd2l0aCBzdGFydFBDLgorCQkJCQkJaW50IGV4aXN0aW5nRW50cnlJbmRleCA9IGluZGV4T2ZTYW1lTGluZUVudHJ5U2luY2VQQyhzdGFydFBDLCBsaW5lTnVtYmVyKTsgLy8gaW5kZXggZm9yIFBDCisJCQkJCQkvKiB0aGUgZXhpc3RpbmdFbnRyeUluZGV4IGNvcnJlc3BvbmRzIHRvIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbGluZSBhbmQgYSBQQyA+PSBzdGFydFBDLgorCQkJCQkJCWluIHRoaXMgY2FzZSBpdCBpcyByZWxldmFudCB0byB3aWRlbiB0aGlzIGVudHJ5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorCQkJCQkJCWxpbmUxOiB0aGlzKGEsCisJCQkJCQkJICBiLAorCQkJCQkJCSAgYyk7CisJCQkJCQkJd2l0aCB0aGlzIGNvZGUgd2UgZ2VuZXJhdGUgZWFjaCBhcmd1bWVudC4gV2UgZ2VuZXJhdGUgYSBhbG9hZDAgdG8gaW52b2tlIHRoZSBjb25zdHJ1Y3Rvci4gVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMKKwkJCQkJCQlhbG9hZDAgYnl0ZWNvZGUuIFRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgb25lIGZvciB0aGUgYXJndW1lbnQgYS4KKwkJCQkJCQlCdXQgd2Ugd2FudCB0aGUgY29uc3RydWN0b3IgY2FsbCB0byBzdGFydCBhdCB0aGUgYWxvYWQwIHBjIGFuZCBub3QganVzdCBhdCB0aGUgcGMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LgorCQkJCQkJCVNvIHdlIHdpZGVuIHRoZSBleGlzdGluZyBlbnRyeSAoaWYgdGhlcmUgaXMgb25lKSBvciB3ZSBjcmVhdGUgYSBuZXcgZW50cnkgd2l0aCB0aGUgc3RhcnRQQy4KKwkJCQkJCSovCisJCQkJCQlpZiAoZXhpc3RpbmdFbnRyeUluZGV4ICE9IC0xKSB7CisJCQkJCQkJLy8gd2lkZW4gZXhpc3RpbmcgZW50cnkKKwkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbZXhpc3RpbmdFbnRyeUluZGV4XSA9IHN0YXJ0UEM7CisJCQkJCQl9IGVsc2UgaWYgKGluc2VydGlvbkluZGV4IDwgMSB8fCB0aGlzLnBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXggLSAxXSAhPSBsaW5lTnVtYmVyKSB7CisJCQkJCQkJLy8gd2UgaGF2ZSB0byBhZGQgYW4gZW50cnkgdGhhdCB3b24ndCBiZSBzb3J0ZWQuIFNvIHdlIHNvcnQgdGhlIHBjVG9Tb3VyY2VNYXAuCisJCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCB0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4ICsgMiwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXgrK10gPSBzdGFydFBDOworCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBsaW5lTnVtYmVyOworCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFNpemUgKz0gMjsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uICE9IHRoaXMubGFzdEVudHJ5UEMpIHsgLy8gbm8gYnl0ZWNvZGUgc2luY2UgbGFzdCBlbnRyeSBwYworCQkJCQkJaWYgKHRoaXMubGFzdEVudHJ5UEMgPT0gc3RhcnRQQyB8fCB0aGlzLmxhc3RFbnRyeVBDID09IHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMl0pIHsKKwkJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDFdID0gbGluZU51bWJlcjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSB0aGlzLmxhc3RFbnRyeVBDOworCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmICh0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIDFdIDwgbGluZU51bWJlciAmJiB3aWRlbikgeworCQkJCQkJLy8gc2VlIGlmIHdlIGNhbiB3aWRlbiB0aGUgZXhpc3RpbmcgZW50cnkKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMV0gPSBsaW5lTnVtYmVyOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gd2UgY2FuIHNhZmVseSBhZGQgdGhlIG5ldyBlbnRyeS4gVGhlIGVuZFBDIG9mIHRoZSBwcmV2aW91cyBlbnRyeSBpcyBub3QgaW4gY29uZmxpdCB3aXRoIHRoZSBzdGFydFBDIG9mIHRoZSBuZXcgZW50cnkuCisJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gc3RhcnRQQzsKKwkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSBsaW5lTnVtYmVyOworCQkJCX0KKwkJCQl0aGlzLmxhc3RFbnRyeVBDID0gdGhpcy5wb3NpdGlvbjsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCS8vIHNpbmNlIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMgaXMgemVyby1iYXNlZCwgd2UgcGFzcyB0aGlzLmxpbmVOdW1iZXJTdGFydCAtIDEgYW5kIHRoaXMubGluZU51bWJlckVuZCAtIDEKKwkJCQlsaW5lTnVtYmVyID0gVXRpbC5nZXRMaW5lTnVtYmVyKHNvdXJjZVBvcywgdGhpcy5saW5lU2VwYXJhdG9yUG9zaXRpb25zLCB0aGlzLmxpbmVOdW1iZXJTdGFydCAtIDEsIHRoaXMubGluZU51bWJlckVuZCAtIDEpOworCQkJfQorCQl9CiAJCS8vIGluIHRoaXMgY2FzZSB0aGVyZSBpcyBhbHJlYWR5IGFuIGVudHJ5IGluIHRoZSB0YWJsZQotCQlpZiAocGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDFdICE9IGxpbmVOdW1iZXIpIHsKLQkJCWlmIChzdGFydFBDIDw9IGxhc3RFbnRyeVBDKSB7CisJCWlmIChwcmV2aW91c0xpbmVOdW1iZXIgIT0gbGluZU51bWJlcikgeworCQkJaWYgKHN0YXJ0UEMgPD0gdGhpcy5sYXN0RW50cnlQQykgewogCQkJCS8vIHdlIGZvcmdvdCB0byBhZGQgYW4gZW50cnkuCiAJCQkJLy8gc2VhcmNoIGlmIGFuIGV4aXN0aW5nIGVudHJ5IGV4aXN0cyBmb3Igc3RhcnRQQwotCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHBjVG9Tb3VyY2VNYXAsIHBjVG9Tb3VyY2VNYXBTaXplLCBzdGFydFBDKTsKKwkJCQlpbnQgaW5zZXJ0aW9uSW5kZXggPSBpbnNlcnRpb25JbmRleCh0aGlzLnBjVG9Tb3VyY2VNYXAsIHRoaXMucGNUb1NvdXJjZU1hcFNpemUsIHN0YXJ0UEMpOwogCQkJCWlmIChpbnNlcnRpb25JbmRleCAhPSAtMSkgewogCQkJCQkvLyB0aGVyZSBpcyBubyBleGlzdGluZyBlbnRyeSBzdGFydGluZyB3aXRoIHN0YXJ0UEMuCiAJCQkJCWludCBleGlzdGluZ0VudHJ5SW5kZXggPSBpbmRleE9mU2FtZUxpbmVFbnRyeVNpbmNlUEMoc3RhcnRQQywgbGluZU51bWJlcik7IC8vIGluZGV4IGZvciBQQwpAQCAtNTc5MCwzNiArNjA5OCwzNiBAQAogCQkJCQkqLwogCQkJCQlpZiAoZXhpc3RpbmdFbnRyeUluZGV4ICE9IC0xKSB7CiAJCQkJCQkvLyB3aWRlbiBleGlzdGluZyBlbnRyeQotCQkJCQkJcGNUb1NvdXJjZU1hcFtleGlzdGluZ0VudHJ5SW5kZXhdID0gc3RhcnRQQzsKLQkJCQkJfSBlbHNlIGlmIChpbnNlcnRpb25JbmRleCA8IDEgfHwgcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCAtIDFdICE9IGxpbmVOdW1iZXIpIHsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtleGlzdGluZ0VudHJ5SW5kZXhdID0gc3RhcnRQQzsKKwkJCQkJfSBlbHNlIGlmIChpbnNlcnRpb25JbmRleCA8IDEgfHwgdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4IC0gMV0gIT0gbGluZU51bWJlcikgewogCQkJCQkJLy8gd2UgaGF2ZSB0byBhZGQgYW4gZW50cnkgdGhhdCB3b24ndCBiZSBzb3J0ZWQuIFNvIHdlIHNvcnQgdGhlIHBjVG9Tb3VyY2VNYXAuCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCBwY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCArIDIsIHBjVG9Tb3VyY2VNYXBTaXplIC0gaW5zZXJ0aW9uSW5kZXgpOwotCQkJCQkJcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCsrXSA9IHN0YXJ0UEM7Ci0JCQkJCQlwY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4XSA9IGxpbmVOdW1iZXI7Ci0JCQkJCQlwY1RvU291cmNlTWFwU2l6ZSArPSAyOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCB0aGlzLnBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4ICsgMiwgdGhpcy5wY1RvU291cmNlTWFwU2l6ZSAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCsrXSA9IHN0YXJ0UEM7CisJCQkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXhdID0gbGluZU51bWJlcjsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFNpemUgKz0gMjsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAocG9zaXRpb24gIT0gbGFzdEVudHJ5UEMpIHsgLy8gbm8gYnl0ZWNvZGUgc2luY2UgbGFzdCBlbnRyeSBwYwotCQkJCQlpZiAobGFzdEVudHJ5UEMgPT0gc3RhcnRQQyB8fCBsYXN0RW50cnlQQyA9PSBwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplIC0gMl0pIHsKLQkJCQkJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CisJCQkJfSBlbHNlIGlmICh0aGlzLnBvc2l0aW9uICE9IHRoaXMubGFzdEVudHJ5UEMpIHsgLy8gbm8gYnl0ZWNvZGUgc2luY2UgbGFzdCBlbnRyeSBwYworCQkJCQlpZiAodGhpcy5sYXN0RW50cnlQQyA9PSBzdGFydFBDIHx8IHRoaXMubGFzdEVudHJ5UEMgPT0gdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyXSkgeworCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gbGFzdEVudHJ5UEM7Ci0JCQkJCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gdGhpcy5sYXN0RW50cnlQQzsKKwkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAocGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDFdIDwgbGluZU51bWJlciAmJiB3aWRlbikgeworCQkJCX0gZWxzZSBpZiAodGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA8IGxpbmVOdW1iZXIgJiYgd2lkZW4pIHsKIAkJCQkJLy8gc2VlIGlmIHdlIGNhbiB3aWRlbiB0aGUgZXhpc3RpbmcgZW50cnkKLQkJCQkJcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDFdID0gbGluZU51bWJlcjsKKwkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAxXSA9IGxpbmVOdW1iZXI7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvLyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbmV3IGVudHJ5LiBUaGUgZW5kUEMgb2YgdGhlIHByZXZpb3VzIGVudHJ5IGlzIG5vdCBpbiBjb25mbGl0IHdpdGggdGhlIHN0YXJ0UEMgb2YgdGhlIG5ldyBlbnRyeS4KLQkJCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gc3RhcnRQQzsKLQkJCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gbGluZU51bWJlcjsKKwkJCQl0aGlzLnBjVG9Tb3VyY2VNYXBbdGhpcy5wY1RvU291cmNlTWFwU2l6ZSsrXSA9IHN0YXJ0UEM7CisJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSBsaW5lTnVtYmVyOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyogdGhlIGxhc3QgcmVjb3JkZWQgZW50cnkgaXMgb24gdGhlIHNhbWUgbGluZS4gQnV0IGl0IGNvdWxkIGJlIHJlbGV2YW50IHRvIHdpZGVuIHRoaXMgZW50cnkuCiAJCQkgICB3ZSB3YW50IHRvIGV4dGVuZCB0aGlzIGVudHJ5IGZvcndhcmQgaW4gY2FzZSB3ZSBnZW5lcmF0ZWQgc29tZSBieXRlY29kZSBiZWZvcmUgdGhlIGxhc3QgZW50cnkgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYW55IHN0YXRlbWVudAotCQkJKi8JCi0JCQlpZiAoc3RhcnRQQyA8IHBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAyXSkgewotCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHBjVG9Tb3VyY2VNYXAsIHBjVG9Tb3VyY2VNYXBTaXplLCBzdGFydFBDKTsKKwkJCSovCisJCQlpZiAoc3RhcnRQQyA8IHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gMl0pIHsKKwkJCQlpbnQgaW5zZXJ0aW9uSW5kZXggPSBpbnNlcnRpb25JbmRleCh0aGlzLnBjVG9Tb3VyY2VNYXAsIHRoaXMucGNUb1NvdXJjZU1hcFNpemUsIHN0YXJ0UEMpOwogCQkJCWlmIChpbnNlcnRpb25JbmRleCAhPSAtMSkgewogCQkJCQkvLyB3aWRlbiB0aGUgZXhpc3RpbmcgZW50cnkKIAkJCQkJLy8gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gbW92ZSB0aGUgbGFzdCBlbnRyeSBhdCBhbm90aGVyIGxvY2F0aW9uIHRvIGtlZXAgYSBzb3J0ZWQgdGFibGUKQEAgLTU4MjgsNTAgKzYxMzYsNjMgQEAKIAkJCQkJICogSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSB0YWJsZS4gSWYgbm90LCB3ZSB3YW50IHRvIGluc2VydCBhIG5ldyBlbnRyeS4gUHJpb3IgdG8gaW5zZXJ0aW9uCiAJCQkJCSAqIHdlIHdhbnQgdG8gY2hlY2sgaWYgaXQgaXMgd29ydGggZG9pbmcgYW4gYXJyYXljb3B5LiBJZiBub3Qgd2Ugc2ltcGx5IHVwZGF0ZSB0aGUgcmVjb3JkZWQgcGMuCiAJCQkJCSAqLwotCQkJCQlpZiAoISgoaW5zZXJ0aW9uSW5kZXggPiAxKSAmJiAocGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCAtIDFdID09IGxpbmVOdW1iZXIpKSkgewotCQkJCQkJaWYgKChwY1RvU291cmNlTWFwU2l6ZSA+IDQpICYmIChwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplIC0gNF0gPiBzdGFydFBDKSkgewotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXgsIHBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4ICsgMiwgcGNUb1NvdXJjZU1hcFNpemUgLSAyIC0gaW5zZXJ0aW9uSW5kZXgpOwotCQkJCQkJCXBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXgrK10gPSBzdGFydFBDOwotCQkJCQkJCXBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXhdID0gbGluZU51bWJlcjsJCQkJCQkKKwkJCQkJaWYgKCEoKGluc2VydGlvbkluZGV4ID4gMSkgJiYgKHRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCAtIDFdID09IGxpbmVOdW1iZXIpKSkgeworCQkJCQkJaWYgKCh0aGlzLnBjVG9Tb3VyY2VNYXBTaXplID4gNCkgJiYgKHRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplIC0gNF0gPiBzdGFydFBDKSkgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCwgdGhpcy5wY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCArIDIsIHRoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyIC0gaW5zZXJ0aW9uSW5kZXgpOworCQkJCQkJCXRoaXMucGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCsrXSA9IHN0YXJ0UEM7CisJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4XSA9IGxpbmVOdW1iZXI7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAyXSA9IHN0YXJ0UEM7CisJCQkJCQkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUgLSAyXSA9IHN0YXJ0UEM7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJbGFzdEVudHJ5UEMgPSBwb3NpdGlvbjsKKwkJdGhpcy5sYXN0RW50cnlQQyA9IHRoaXMucG9zaXRpb247CiAJfSBlbHNlIHsKKwkJaW50IGxpbmVOdW1iZXIgPSAwOworCQlpZiAodGhpcy5saW5lTnVtYmVyU3RhcnQgPT0gdGhpcy5saW5lTnVtYmVyRW5kKSB7CisJCQkvLyBtZXRob2Qgb24gb25lIGxpbmUKKwkJCWxpbmVOdW1iZXIgPSB0aGlzLmxpbmVOdW1iZXJTdGFydDsKKwkJfSBlbHNlIHsKKwkJCS8vIHNpbmNlIGxpbmVTZXBhcmF0b3JQb3NpdGlvbnMgaXMgemVyby1iYXNlZCwgd2UgcGFzcyB0aGlzLmxpbmVOdW1iZXJTdGFydCAtIDEgYW5kIHRoaXMubGluZU51bWJlckVuZCAtIDEKKwkJCWxpbmVOdW1iZXIgPSBVdGlsLmdldExpbmVOdW1iZXIoc291cmNlUG9zLCB0aGlzLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMsIHRoaXMubGluZU51bWJlclN0YXJ0IC0gMSwgdGhpcy5saW5lTnVtYmVyRW5kIC0gMSk7CisJCX0KIAkJLy8gcmVjb3JkIHRoZSBmaXJzdCBlbnRyeQotCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gc3RhcnRQQzsKLQkJcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSsrXSA9IGxpbmVOdW1iZXI7Ci0JCWxhc3RFbnRyeVBDID0gcG9zaXRpb247CisJCXRoaXMucGNUb1NvdXJjZU1hcFt0aGlzLnBjVG9Tb3VyY2VNYXBTaXplKytdID0gc3RhcnRQQzsKKwkJdGhpcy5wY1RvU291cmNlTWFwW3RoaXMucGNUb1NvdXJjZU1hcFNpemUrK10gPSBsaW5lTnVtYmVyOworCQl0aGlzLmxhc3RFbnRyeVBDID0gdGhpcy5wb3NpdGlvbjsKIAl9CiB9CisKIC8qKgogICogQHBhcmFtIGFuRXhjZXB0aW9uTGFiZWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uRXhjZXB0aW9uTGFiZWwKICAqLwogcHVibGljIHZvaWQgcmVnaXN0ZXJFeGNlcHRpb25IYW5kbGVyKEV4Y2VwdGlvbkxhYmVsIGFuRXhjZXB0aW9uTGFiZWwpIHsKIAlpbnQgbGVuZ3RoOwotCWlmIChleGNlcHRpb25MYWJlbHNDb3VudGVyID09IChsZW5ndGggPSBleGNlcHRpb25MYWJlbHMubGVuZ3RoKSkgeworCWlmICh0aGlzLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXIgPT0gKGxlbmd0aCA9IHRoaXMuZXhjZXB0aW9uTGFiZWxzLmxlbmd0aCkpIHsKIAkJLy8gcmVzaXplIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgdGFibGUKLQkJU3lzdGVtLmFycmF5Y29weShleGNlcHRpb25MYWJlbHMsIDAsIGV4Y2VwdGlvbkxhYmVscyA9IG5ldyBFeGNlcHRpb25MYWJlbFtsZW5ndGggKyBMQUJFTFNfSU5DUkVNRU5UXSwgMCwgbGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4Y2VwdGlvbkxhYmVscywgMCwgdGhpcy5leGNlcHRpb25MYWJlbHMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbbGVuZ3RoICsgTEFCRUxTX0lOQ1JFTUVOVF0sIDAsIGxlbmd0aCk7CiAJfQogCS8vIG5vIG5lZWQgdG8gcmVzaXplLiBTbyBqdXN0IGFkZCB0aGUgbmV3IGV4Y2VwdGlvbiBsYWJlbAotCWV4Y2VwdGlvbkxhYmVsc1tleGNlcHRpb25MYWJlbHNDb3VudGVyKytdID0gYW5FeGNlcHRpb25MYWJlbDsKKwl0aGlzLmV4Y2VwdGlvbkxhYmVsc1t0aGlzLmV4Y2VwdGlvbkxhYmVsc0NvdW50ZXIrK10gPSBhbkV4Y2VwdGlvbkxhYmVsOwogfQorCiBwdWJsaWMgdm9pZCByZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoU2NvcGUgc2NvcGUsIGludCBpbml0U3RhdGVJbmRleCkgewogCS8vIGdpdmVuIHNvbWUgZmxvdyBpbmZvLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBsb29zZSBzb21lIHZhcmlhYmxlcyBpbml0aWFsaXphdGlvbgogCS8vIGlmIHRoaXMgaGFwcGVucywgdGhlbiB3ZSBtdXN0IHVwZGF0ZSB0aGVpciBwYyBlbnRyaWVzIHRvIHJlZmxlY3QgaXQgaW4gZGVidWcgYXR0cmlidXRlcwotCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUyB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpID09IDApCisJaWYgKCh0aGlzLmdlbmVyYXRlQXR0cmlidXRlcyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9WQVJTCisJCQl8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUF9UQUJMRQorCQkJfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVApKSA9PSAwKQogCQlyZXR1cm47Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlTG9jYWxzQ291bnQ7IGkrKykgewotCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSB2aXNpYmxlTG9jYWxzW2ldOworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlTG9jYWxzQ291bnQ7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSB0aGlzLnZpc2libGVMb2NhbHNbaV07CiAJCWlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCAmJiAhaXNEZWZpbml0ZWx5QXNzaWduZWQoc2NvcGUsIGluaXRTdGF0ZUluZGV4LCBsb2NhbEJpbmRpbmcpICYmIGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50ID4gMCkgewotCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEMocG9zaXRpb24pOworCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uRW5kUEModGhpcy5wb3NpdGlvbik7CiAJCX0KIAl9CiB9CisKIC8qKgogICogUmVtb3ZlIGFsbCBlbnRyaWVzIGluIHBjVG9Tb3VyY2VNYXAgdGFibGUgdGhhdCBhcmUgYmV5b25kIHRoaXMucG9zaXRpb24KICAqLwpAQCAtNTg4NSwxNiArNjIwNiwxNyBAQAogcHVibGljIHZvaWQgcmVtb3ZlVmFyaWFibGUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nKSB7CiAJaWYgKGxvY2FsQmluZGluZyA9PSBudWxsKSByZXR1cm47CiAJaWYgKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50ID4gMCkgewotCQlsb2NhbEJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyhwb3NpdGlvbik7CisJCWxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKHRoaXMucG9zaXRpb24pOwogCX0KLQlmb3IgKGludCBpID0gdmlzaWJsZUxvY2Fsc0NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdmlzaWJsZUxvY2FsID0gdmlzaWJsZUxvY2Fsc1tpXTsKKwlmb3IgKGludCBpID0gdGhpcy52aXNpYmxlTG9jYWxzQ291bnQgLSAxOyBpID49IDA7IGktLSkgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyB2aXNpYmxlTG9jYWwgPSB0aGlzLnZpc2libGVMb2NhbHNbaV07CiAJCWlmICh2aXNpYmxlTG9jYWwgPT0gbG9jYWxCaW5kaW5nKXsKLQkJCXZpc2libGVMb2NhbHNbaV0gPSBudWxsOyAvLyB0aGlzIHZhcmlhYmxlIGlzIG5vIGxvbmdlciB2aXNpYmxlIGFmdGVyd2FyZHMKKwkJCXRoaXMudmlzaWJsZUxvY2Fsc1tpXSA9IG51bGw7IC8vIHRoaXMgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIHZpc2libGUgYWZ0ZXJ3YXJkcwogCQkJcmV0dXJuOwogCQl9CiAJfQogfQorCiAvKioKICAqIEBwYXJhbSByZWZlcmVuY2VNZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCiAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3NGaWxlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNsYXNzRmlsZQpAQCAtNTkwMiwxNiArNjIyNCw0MyBAQAogcHVibGljIHZvaWQgcmVzZXQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiByZWZlcmVuY2VNZXRob2QsIENsYXNzRmlsZSB0YXJnZXRDbGFzc0ZpbGUpIHsKIAlpbml0KHRhcmdldENsYXNzRmlsZSk7CiAJdGhpcy5tZXRob2REZWNsYXJhdGlvbiA9IHJlZmVyZW5jZU1ldGhvZDsKKwlpbnRbXSBsaW5lU2VwYXJhdG9yUG9zaXRpb25zMiA9IHRoaXMubGluZVNlcGFyYXRvclBvc2l0aW9uczsKKwlpZiAobGluZVNlcGFyYXRvclBvc2l0aW9uczIgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gbGluZVNlcGFyYXRvclBvc2l0aW9uczIubGVuZ3RoOworCQlpbnQgbGluZVNlcGFyYXRvclBvc2l0aW9uc0VuZCA9IGxlbmd0aCAtIDE7CisJCWlmIChyZWZlcmVuY2VNZXRob2QuaXNDbGluaXQoKQorCQkJCXx8IHJlZmVyZW5jZU1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCXRoaXMubGluZU51bWJlclN0YXJ0ID0gMTsKKwkJCXRoaXMubGluZU51bWJlckVuZCA9IGxlbmd0aCA9PSAwID8gMSA6IGxlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCWludCBzdGFydCA9IFV0aWwuZ2V0TGluZU51bWJlcihyZWZlcmVuY2VNZXRob2QuYm9keVN0YXJ0LCBsaW5lU2VwYXJhdG9yUG9zaXRpb25zMiwgMCwgbGluZVNlcGFyYXRvclBvc2l0aW9uc0VuZCk7CisJCQl0aGlzLmxpbmVOdW1iZXJTdGFydCA9IHN0YXJ0OworCQkJaWYgKHN0YXJ0ID4gbGluZVNlcGFyYXRvclBvc2l0aW9uc0VuZCkgeworCQkJCXRoaXMubGluZU51bWJlckVuZCA9IHN0YXJ0OworCQkJfSBlbHNlIHsKKwkJCQlpbnQgZW5kID0gVXRpbC5nZXRMaW5lTnVtYmVyKHJlZmVyZW5jZU1ldGhvZC5ib2R5RW5kLCBsaW5lU2VwYXJhdG9yUG9zaXRpb25zMiwgc3RhcnQgLSAxLCBsaW5lU2VwYXJhdG9yUG9zaXRpb25zRW5kKTsKKwkJCQlpZiAoZW5kID49IGxpbmVTZXBhcmF0b3JQb3NpdGlvbnNFbmQpIHsKKwkJCQkJZW5kID0gbGVuZ3RoOworCQkJCX0KKwkJCQl0aGlzLmxpbmVOdW1iZXJFbmQgPSBlbmQgPT0gMCA/IDEgOiBlbmQ7CisJCQl9CisJCX0KKwl9CiAJdGhpcy5wcmVzZXJ2ZVVudXNlZExvY2FscyA9IHJlZmVyZW5jZU1ldGhvZC5zY29wZS5jb21waWxlck9wdGlvbnMoKS5wcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzOwogCWluaXRpYWxpemVNYXhMb2NhbHMocmVmZXJlbmNlTWV0aG9kLmJpbmRpbmcpOwogfQorCiBwdWJsaWMgdm9pZCByZXNldChDbGFzc0ZpbGUgZ2l2ZW5DbGFzc0ZpbGUpIHsKIAl0aGlzLnRhcmdldExldmVsID0gZ2l2ZW5DbGFzc0ZpbGUudGFyZ2V0SkRLOwotCXRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzID0gZ2l2ZW5DbGFzc0ZpbGUucHJvZHVjZUF0dHJpYnV0ZXM7Ci0JaWYgKChnaXZlbkNsYXNzRmlsZS5wcm9kdWNlQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX0xJTkVTKSAhPSAwKSB7CisJaW50IHByb2R1Y2VBdHRyaWJ1dGVzID0gZ2l2ZW5DbGFzc0ZpbGUucHJvZHVjZUF0dHJpYnV0ZXM7CisJdGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgPSBwcm9kdWNlQXR0cmlidXRlczsKKwlpZiAoKHByb2R1Y2VBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfTElORVMpICE9IDApIHsKIAkJdGhpcy5saW5lU2VwYXJhdG9yUG9zaXRpb25zID0gZ2l2ZW5DbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5saW5lU2VwYXJhdG9yUG9zaXRpb25zID0gbnVsbDsKIAl9CiB9CisKIC8qKgogICogQHBhcmFtIHRhcmdldENsYXNzRmlsZSBUaGUgZ2l2ZW4gY2xhc3NmaWxlIHRvIHJlc2V0IHRoZSBjb2RlIHN0cmVhbQogICovCkBAIC01OTE5LDY2ICs2MjY4LDc0IEBACiAJaW5pdCh0YXJnZXRDbGFzc0ZpbGUpOwogCWluaXRpYWxpemVNYXhMb2NhbHMobnVsbCk7CiB9Ci1wcml2YXRlIGZpbmFsIHZvaWQgcmVzaXplQnl0ZUFycmF5KCkgewotCWludCBsZW5ndGggPSBiQ29kZVN0cmVhbS5sZW5ndGg7Ci0JaW50IHJlcXVpcmVkU2l6ZSA9IGxlbmd0aCArIGxlbmd0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IHJlcXVpcmVkU2l6ZSkgewotCQkvLyBtdXN0IGJlIHN1cmUgdG8gZ3JvdyBlbm91Z2gKLQkJcmVxdWlyZWRTaXplID0gY2xhc3NGaWxlT2Zmc2V0ICsgbGVuZ3RoOwotCX0KLQlTeXN0ZW0uYXJyYXljb3B5KGJDb2RlU3RyZWFtLCAwLCBiQ29kZVN0cmVhbSA9IG5ldyBieXRlW3JlcXVpcmVkU2l6ZV0sIDAsIGxlbmd0aCk7CisKK3B1YmxpYyB2b2lkIHJlc2V0SW5XaWRlTW9kZSgpIHsKKwl0aGlzLndpZGVNb2RlID0gdHJ1ZTsKIH0KK3B1YmxpYyB2b2lkIHJlc2V0Rm9yQ29kZUdlblVudXNlZExvY2FscygpIHsKKwkvLyBub3RoaW5nIHRvIGRvIGluIHN0YW5kYXJkIGNvZGUgc3RyZWFtCit9Citwcml2YXRlIGZpbmFsIHZvaWQgcmVzaXplQnl0ZUFycmF5KCkgeworCWludCBsZW5ndGggPSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aDsKKwlpbnQgcmVxdWlyZWRTaXplID0gbGVuZ3RoICsgbGVuZ3RoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSByZXF1aXJlZFNpemUpIHsKKwkJLy8gbXVzdCBiZSBzdXJlIHRvIGdyb3cgZW5vdWdoCisJCXJlcXVpcmVkU2l6ZSA9IHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgbGVuZ3RoOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYkNvZGVTdHJlYW0sIDAsIHRoaXMuYkNvZGVTdHJlYW0gPSBuZXcgYnl0ZVtyZXF1aXJlZFNpemVdLCAwLCBsZW5ndGgpOworfQorCiBmaW5hbCBwdWJsaWMgdm9pZCByZXQoaW50IGluZGV4KSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdHJldDoiK2luZGV4KTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKIAlpZiAoaW5kZXggPiAyNTUpIHsgLy8gV2lkZW4KLQkJaWYgKGNsYXNzRmlsZU9mZnNldCArIDMgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCQl9Ci0JCXBvc2l0aW9uICs9IDI7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3dpZGU7Ci0JCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3JldDsKKwkJdGhpcy5wb3NpdGlvbiArPSAyOworCQl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfd2lkZTsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3JldDsKIAkJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKIAl9IGVsc2UgeyAvLyBEb24ndCBXaWRlbgotCQlpZiAoY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQkJcmVzaXplQnl0ZUFycmF5KCk7CiAJCX0KLQkJcG9zaXRpb24gKz0gMjsKLQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfcmV0OwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaW5kZXg7CisJCXRoaXMucG9zaXRpb24gKz0gMjsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3JldDsKKwkJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpbmRleDsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIHJldHVybl8oKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdHJldHVybiIpOyAvLyROT04tTkxTLTEkCi0JY291bnRMYWJlbHMgPSAwOwotCS8vIHRoZSBzdGFja0RlcHRoIHNob3VsZCBiZSBlcXVhbCB0byAwIAotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfcmV0dXJuOwotCXRoaXMubGFzdEFicnVwdENvbXBsZXRpb24gPSB0aGlzLnBvc2l0aW9uOwkKKwl0aGlzLnBvc2l0aW9uKys7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3JldHVybjsKKwl0aGlzLmxhc3RBYnJ1cHRDb21wbGV0aW9uID0gdGhpcy5wb3NpdGlvbjsKIH0KKwogcHVibGljIHZvaWQgc2Fsb2FkKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRzYWxvYWQiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07Ci0JaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwl0aGlzLmNvdW50TGFiZWxzID0gMDsKKwl0aGlzLnN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy5jbGFzc0ZpbGVPZmZzZXQgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uKys7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfc2Fsb2FkOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfc2Fsb2FkOwogfQorCiBwdWJsaWMgdm9pZCBzYXN0b3JlKCkgewotCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKHBvc2l0aW9uICsgIlx0XHRzYXN0b3JlIik7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCAtPSAzOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoIC09IDM7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3Nhc3RvcmU7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19zYXN0b3JlOwogfQorCiAvKioKICAqIEBwYXJhbSBvcGVyYXRvckNvbnN0YW50IGludAogICogQHBhcmFtIHR5cGVfSUQgaW50CkBAIC01OTkyLDEyOCArNjM0OSwxMjggQEAKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJc3dpdGNoIChvcGVyYXRvckNvbnN0YW50KSB7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKLQkJCQkJdGhpcy5pYWRkKCk7CisJCQkJCWlhZGQoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VUyA6Ci0JCQkJCXRoaXMuaXN1YigpOworCQkJCQlpc3ViKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuTVVMVElQTFkgOgotCQkJCQl0aGlzLmltdWwoKTsKKwkJCQkJaW11bCgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLkRJVklERSA6Ci0JCQkJCXRoaXMuaWRpdigpOworCQkJCQlpZGl2KCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuUkVNQUlOREVSIDoKLQkJCQkJdGhpcy5pcmVtKCk7CisJCQkJCWlyZW0oKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5MRUZUX1NISUZUIDoKLQkJCQkJdGhpcy5pc2hsKCk7CisJCQkJCWlzaGwoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5SSUdIVF9TSElGVCA6Ci0JCQkJCXRoaXMuaXNocigpOworCQkJCQlpc2hyKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuVU5TSUdORURfUklHSFRfU0hJRlQgOgotCQkJCQl0aGlzLml1c2hyKCk7CisJCQkJCWl1c2hyKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuQU5EIDoKLQkJCQkJdGhpcy5pYW5kKCk7CisJCQkJCWlhbmQoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5PUiA6Ci0JCQkJCXRoaXMuaW9yKCk7CisJCQkJCWlvcigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLlhPUiA6Ci0JCQkJCXRoaXMuaXhvcigpOworCQkJCQlpeG9yKCk7CiAJCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgogCQkJc3dpdGNoIChvcGVyYXRvckNvbnN0YW50KSB7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKLQkJCQkJdGhpcy5sYWRkKCk7CisJCQkJCWxhZGQoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VUyA6Ci0JCQkJCXRoaXMubHN1YigpOworCQkJCQlsc3ViKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuTVVMVElQTFkgOgotCQkJCQl0aGlzLmxtdWwoKTsKKwkJCQkJbG11bCgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLkRJVklERSA6Ci0JCQkJCXRoaXMubGRpdigpOworCQkJCQlsZGl2KCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuUkVNQUlOREVSIDoKLQkJCQkJdGhpcy5scmVtKCk7CisJCQkJCWxyZW0oKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5MRUZUX1NISUZUIDoKLQkJCQkJdGhpcy5sc2hsKCk7CisJCQkJCWxzaGwoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5SSUdIVF9TSElGVCA6Ci0JCQkJCXRoaXMubHNocigpOworCQkJCQlsc2hyKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuVU5TSUdORURfUklHSFRfU0hJRlQgOgotCQkJCQl0aGlzLmx1c2hyKCk7CisJCQkJCWx1c2hyKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuQU5EIDoKLQkJCQkJdGhpcy5sYW5kKCk7CisJCQkJCWxhbmQoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5PUiA6Ci0JCQkJCXRoaXMubG9yKCk7CisJCQkJCWxvcigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLlhPUiA6Ci0JCQkJCXRoaXMubHhvcigpOworCQkJCQlseG9yKCk7CiAJCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCXN3aXRjaCAob3BlcmF0b3JDb25zdGFudCkgewogCQkJCWNhc2UgT3BlcmF0b3JJZHMuUExVUyA6Ci0JCQkJCXRoaXMuZmFkZCgpOworCQkJCQlmYWRkKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuTUlOVVMgOgotCQkJCQl0aGlzLmZzdWIoKTsKKwkJCQkJZnN1YigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLk1VTFRJUExZIDoKLQkJCQkJdGhpcy5mbXVsKCk7CisJCQkJCWZtdWwoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5ESVZJREUgOgotCQkJCQl0aGlzLmZkaXYoKTsKKwkJCQkJZmRpdigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLlJFTUFJTkRFUiA6Ci0JCQkJCXRoaXMuZnJlbSgpOworCQkJCQlmcmVtKCk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKIAkJCXN3aXRjaCAob3BlcmF0b3JDb25zdGFudCkgewogCQkJCWNhc2UgT3BlcmF0b3JJZHMuUExVUyA6Ci0JCQkJCXRoaXMuZGFkZCgpOworCQkJCQlkYWRkKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgT3BlcmF0b3JJZHMuTUlOVVMgOgotCQkJCQl0aGlzLmRzdWIoKTsKKwkJCQkJZHN1YigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLk1VTFRJUExZIDoKLQkJCQkJdGhpcy5kbXVsKCk7CisJCQkJCWRtdWwoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBPcGVyYXRvcklkcy5ESVZJREUgOgotCQkJCQl0aGlzLmRkaXYoKTsKKwkJCQkJZGRpdigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLlJFTUFJTkRFUiA6Ci0JCQkJCXRoaXMuZHJlbSgpOworCQkJCQlkcmVtKCk7CiAJCQl9CiAJfQogfQogCiBwdWJsaWMgdm9pZCBzaXB1c2goaW50IHMpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0c2lwdXNoOiIrcyk7IC8vJE5PTi1OTFMtMSQKLQljb3VudExhYmVscyA9IDA7Ci0Jc3RhY2tEZXB0aCsrOwotCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCi0JCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCXRoaXMuc3RhY2tEZXB0aCsrOworCWlmICh0aGlzLnN0YWNrRGVwdGggPiB0aGlzLnN0YWNrTWF4KQorCQl0aGlzLnN0YWNrTWF4ID0gdGhpcy5zdGFja0RlcHRoOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19zaXB1c2g7CisJdGhpcy5wb3NpdGlvbisrOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19zaXB1c2g7CiAJd3JpdGVTaWduZWRTaG9ydChzKTsKIH0KKwogcHVibGljIHZvaWQgc3RvcmUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlpbnQgbG9jYWxQb3NpdGlvbiA9IGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uOwogCS8vIFVzaW5nIGRlZGljYXRlZCBpbnQgYnl0ZWNvZGUKQEAgLTYxMjQsMTQ1ICs2NDgxLDE0NSBAQAogCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6CiAJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgogCQkJaWYgKHZhbHVlUmVxdWlyZWQpCi0JCQkJdGhpcy5kdXAoKTsKKwkJCQlkdXAoKTsKIAkJCXN3aXRjaCAobG9jYWxQb3NpdGlvbikgewogCQkJCWNhc2UgMCA6Ci0JCQkJCXRoaXMuaXN0b3JlXzAoKTsKKwkJCQkJaXN0b3JlXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5pc3RvcmVfMSgpOworCQkJCQlpc3RvcmVfMSgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDIgOgotCQkJCQl0aGlzLmlzdG9yZV8yKCk7CisJCQkJCWlzdG9yZV8yKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMyA6Ci0JCQkJCXRoaXMuaXN0b3JlXzMoKTsKKwkJCQkJaXN0b3JlXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJLy9jYXNlIC0xIDoKIAkJCQkvLyBpbnRlcm5hbCBmYWlsdXJlOiB0cnlpbmcgdG8gc3RvcmUgaW50byB2YXJpYWJsZSBub3Qgc3VwcG9zZWQgdG8gYmUgZ2VuZXJhdGVkCiAJCQkJLy8JYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuaXN0b3JlKGxvY2FsUG9zaXRpb24pOworCQkJCQlpc3RvcmUobG9jYWxQb3NpdGlvbik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgogCQkJaWYgKHZhbHVlUmVxdWlyZWQpCi0JCQkJdGhpcy5kdXAoKTsKKwkJCQlkdXAoKTsKIAkJCXN3aXRjaCAobG9jYWxQb3NpdGlvbikgewogCQkJCWNhc2UgMCA6Ci0JCQkJCXRoaXMuZnN0b3JlXzAoKTsKKwkJCQkJZnN0b3JlXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5mc3RvcmVfMSgpOworCQkJCQlmc3RvcmVfMSgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDIgOgotCQkJCQl0aGlzLmZzdG9yZV8yKCk7CisJCQkJCWZzdG9yZV8yKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMyA6Ci0JCQkJCXRoaXMuZnN0b3JlXzMoKTsKKwkJCQkJZnN0b3JlXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuZnN0b3JlKGxvY2FsUG9zaXRpb24pOworCQkJCQlmc3RvcmUobG9jYWxQb3NpdGlvbik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKIAkJCWlmICh2YWx1ZVJlcXVpcmVkKQotCQkJCXRoaXMuZHVwMigpOworCQkJCWR1cDIoKTsKIAkJCXN3aXRjaCAobG9jYWxQb3NpdGlvbikgewogCQkJCWNhc2UgMCA6Ci0JCQkJCXRoaXMuZHN0b3JlXzAoKTsKKwkJCQkJZHN0b3JlXzAoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxIDoKLQkJCQkJdGhpcy5kc3RvcmVfMSgpOworCQkJCQlkc3RvcmVfMSgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDIgOgotCQkJCQl0aGlzLmRzdG9yZV8yKCk7CisJCQkJCWRzdG9yZV8yKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMyA6Ci0JCQkJCXRoaXMuZHN0b3JlXzMoKTsKKwkJCQkJZHN0b3JlXzMoKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdCA6Ci0JCQkJCXRoaXMuZHN0b3JlKGxvY2FsUG9zaXRpb24pOworCQkJCQlkc3RvcmUobG9jYWxQb3NpdGlvbik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCQl0aGlzLmR1cDIoKTsKKwkJCQlkdXAyKCk7CiAJCQlzd2l0Y2ggKGxvY2FsUG9zaXRpb24pIHsKIAkJCQljYXNlIDAgOgotCQkJCQl0aGlzLmxzdG9yZV8wKCk7CisJCQkJCWxzdG9yZV8wKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMSA6Ci0JCQkJCXRoaXMubHN0b3JlXzEoKTsKKwkJCQkJbHN0b3JlXzEoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKLQkJCQkJdGhpcy5sc3RvcmVfMigpOworCQkJCQlsc3RvcmVfMigpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDMgOgotCQkJCQl0aGlzLmxzdG9yZV8zKCk7CisJCQkJCWxzdG9yZV8zKCk7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQgOgotCQkJCQl0aGlzLmxzdG9yZShsb2NhbFBvc2l0aW9uKTsKKwkJCQkJbHN0b3JlKGxvY2FsUG9zaXRpb24pOwogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvLyBSZWZlcmVuY2Ugb2JqZWN0CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCQl0aGlzLmR1cCgpOworCQkJCWR1cCgpOwogCQkJc3dpdGNoIChsb2NhbFBvc2l0aW9uKSB7CiAJCQkJY2FzZSAwIDoKLQkJCQkJdGhpcy5hc3RvcmVfMCgpOworCQkJCQlhc3RvcmVfMCgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDEgOgotCQkJCQl0aGlzLmFzdG9yZV8xKCk7CisJCQkJCWFzdG9yZV8xKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMiA6Ci0JCQkJCXRoaXMuYXN0b3JlXzIoKTsKKwkJCQkJYXN0b3JlXzIoKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzIDoKLQkJCQkJdGhpcy5hc3RvcmVfMygpOworCQkJCQlhc3RvcmVfMygpOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0IDoKLQkJCQkJdGhpcy5hc3RvcmUobG9jYWxQb3NpdGlvbik7CisJCQkJCWFzdG9yZShsb2NhbFBvc2l0aW9uKTsKIAkJCX0KIAl9CiB9CisKIHB1YmxpYyB2b2lkIHN3YXAoKSB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4ocG9zaXRpb24gKyAiXHRcdHN3YXAiKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlpZiAoY2xhc3NGaWxlT2Zmc2V0ID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCXRoaXMuY291bnRMYWJlbHMgPSAwOworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24rKzsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPcGNvZGVzLk9QQ19zd2FwOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfc3dhcDsKIH0KKwogcHVibGljIHZvaWQgdGFibGVzd2l0Y2goQ2FzZUxhYmVsIGRlZmF1bHRMYWJlbCwgaW50IGxvdywgaW50IGhpZ2gsIGludFtdIGtleXMsIGludFtdIHNvcnRlZEluZGV4ZXMsIENhc2VMYWJlbFtdIGNhc2VzTGFiZWwpIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbihwb3NpdGlvbiArICJcdFx0dGFibGVzd2l0Y2giKTsgLy8kTk9OLU5MUy0xJAotCWNvdW50TGFiZWxzID0gMDsKLQlzdGFja0RlcHRoLS07CisJdGhpcy5jb3VudExhYmVscyA9IDA7CisJdGhpcy5zdGFja0RlcHRoLS07CiAJaW50IGxlbmd0aCA9IGNhc2VzTGFiZWwubGVuZ3RoOwotCWludCBwb3MgPSBwb3NpdGlvbjsKKwlpbnQgcG9zID0gdGhpcy5wb3NpdGlvbjsKIAlkZWZhdWx0TGFiZWwucGxhY2VJbnN0cnVjdGlvbigpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAJCWNhc2VzTGFiZWxbaV0ucGxhY2VJbnN0cnVjdGlvbigpOwotCWlmIChjbGFzc0ZpbGVPZmZzZXQgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCXJlc2l6ZUJ5dGVBcnJheSgpOwogCX0KLQlwb3NpdGlvbisrOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9wY29kZXMuT1BDX3RhYmxlc3dpdGNoOworCXRoaXMucG9zaXRpb24rKzsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gT3Bjb2Rlcy5PUENfdGFibGVzd2l0Y2g7CiAJLy8gcGFkZGluZwogCWZvciAoaW50IGkgPSAoMyAtIChwb3MgJiAzKSk7IGkgPiAwOyBpLS0pIHsKLQkJaWYgKGNsYXNzRmlsZU9mZnNldCA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ID49IHRoaXMuYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CiAJCQlyZXNpemVCeXRlQXJyYXkoKTsKIAkJfQotCQlwb3NpdGlvbisrOwotCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAwOworCQl0aGlzLnBvc2l0aW9uKys7CisJCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAwOwogCX0KIAlkZWZhdWx0TGFiZWwuYnJhbmNoKCk7CiAJd3JpdGVTaWduZWRXb3JkKGxvdyk7CiAJd3JpdGVTaWduZWRXb3JkKGhpZ2gpOwogCWludCBpID0gbG93LCBqID0gbG93OwotCS8vIHRoZSBpbmRleCBqIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgaW5kZXggaSBpcyBvbmUgb2YgdGhlIG1pc3NpbmcgZW50cmllcyBpbiBjYXNlIG9mIGFuIAorCS8vIHRoZSBpbmRleCBqIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgaW5kZXggaSBpcyBvbmUgb2YgdGhlIG1pc3NpbmcgZW50cmllcyBpbiBjYXNlIG9mIGFuCiAJLy8gb3B0aW1pemVkIHRhYmxlc3dpdGNoCiAJd2hpbGUgKHRydWUpIHsKIAkJaW50IGluZGV4OwpAQCAtNjI3NywyMiArNjYzNCwyNSBAQAogCQlpKys7CiAJfQogfQorCiBwdWJsaWMgdm9pZCB0aHJvd0FueUV4Y2VwdGlvbihMb2NhbFZhcmlhYmxlQmluZGluZyBhbnlFeGNlcHRpb25WYXJpYWJsZSkgewogCXRoaXMubG9hZChhbnlFeGNlcHRpb25WYXJpYWJsZSk7Ci0JdGhpcy5hdGhyb3coKTsKKwlhdGhyb3coKTsKIH0KKwogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiKCBwb3NpdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQocG9zaXRpb24pOworCWJ1ZmZlci5hcHBlbmQodGhpcy5wb3NpdGlvbik7CiAJYnVmZmVyLmFwcGVuZCgiLFxuc3RhY2tEZXB0aDoiKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQoc3RhY2tEZXB0aCk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnN0YWNrRGVwdGgpOwogCWJ1ZmZlci5hcHBlbmQoIixcbm1heFN0YWNrOiIpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZChzdGFja01heCk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnN0YWNrTWF4KTsKIAlidWZmZXIuYXBwZW5kKCIsXG5tYXhMb2NhbHM6Iik7IC8vJE5PTi1OTFMtMSQKLQlidWZmZXIuYXBwZW5kKG1heExvY2Fscyk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLm1heExvY2Fscyk7CiAJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogfQorCiAvKioKICAqIE5vdGU6IGl0IHdpbGwgd2FsayB0aGUgbG9jYWxzIHRhYmxlIGFuZCBleHRlbmQgdGhlIGVuZCByYW5nZSBmb3IgYWxsIG1hdGNoaW5nIG9uZXMsIG5vIG1hdHRlciBpZgogICogdmlzaWJsZSBvciBub3QuCkBAIC02MzAzLDcgKzY2NjMsNyBAQAogICovCiBwdWJsaWMgdm9pZCB1cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhTY29wZSBzY29wZSwgaW50IHBvcykgewogCi0JLyogVHVuZSBwb3NpdGlvbnMgaW4gdGhlIHRhYmxlLCB0aGlzIGlzIGR1ZSB0byBzb21lIAorCS8qIFR1bmUgcG9zaXRpb25zIGluIHRoZSB0YWJsZSwgdGhpcyBpcyBkdWUgdG8gc29tZQogCSAqIGV4dHJhIGJ5dGVjb2RlcyBiZWluZwogCSAqIGFkZGVkIHRvIHNvbWUgdXNlciBjb2RlIChqdW1wcykuICovCiAJLyoqIE9MRCBDT0RFCkBAIC02MzExLDE0ICs2NjcxLDE2IEBACiAJCQlyZXR1cm47CiAJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAxXVsxXSA9IHBvc2l0aW9uOwogCQkvLyBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZW5kUEMgaW4gY2FzZSBvZiBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMuCi0JCXVwZGF0ZUxvY2FsVmFyaWFibGVzQXR0cmlidXRlKHBvcyk7CQotCSovCQorCQl1cGRhdGVMb2NhbFZhcmlhYmxlc0F0dHJpYnV0ZShwb3MpOworCSovCiAKIAlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfTElORVMpICE9IDApIHsKIAkJdGhpcy5sYXN0RW50cnlQQyA9IHBvczsKIAl9CiAJLy8gbmVlZCB0byB1cGRhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVuZFBDIGluIGNhc2Ugb2YgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzLgotCWlmICgodGhpcy5nZW5lcmF0ZUF0dHJpYnV0ZXMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUyB8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpICE9IDApIHsKKwlpZiAoKHRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMKKwkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQX1RBQkxFCisJCQl8IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUCkpICE9IDApIHsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubG9jYWxzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IHRoaXMubG9jYWxzW2ldOwogCQkJaWYgKGxvY2FsICE9IG51bGwgJiYgbG9jYWwuZGVjbGFyaW5nU2NvcGUgPT0gc2NvcGUgJiYgbG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKQEAgLTYzMjksNiArNjY5MSw3IEBACiAJCX0KIAl9CiB9CisKIHByb3RlY3RlZCB2b2lkIHdyaXRlUG9zaXRpb24oQnJhbmNoTGFiZWwgbGFiZWwpIHsKIAlpbnQgb2Zmc2V0ID0gbGFiZWwucG9zaXRpb24gLSB0aGlzLnBvc2l0aW9uICsgMTsKIAlpZiAoTWF0aC5hYnMob2Zmc2V0KSA+IDB4N0ZGRiAmJiAhdGhpcy53aWRlTW9kZSkgewpAQCAtNjMzOCw4ICs2NzAxLDkgQEAKIAlpbnRbXSBmb3J3YXJkUmVmcyA9IGxhYmVsLmZvcndhcmRSZWZlcmVuY2VzKCk7CiAJZm9yIChpbnQgaSA9IDAsIG1heCA9IGxhYmVsLmZvcndhcmRSZWZlcmVuY2VDb3VudCgpOyBpIDwgbWF4OyBpKyspIHsKIAkJdGhpcy53cml0ZVBvc2l0aW9uKGxhYmVsLCBmb3J3YXJkUmVmc1tpXSk7Ci0JfQkKKwl9CiB9CisKIHByb3RlY3RlZCB2b2lkIHdyaXRlUG9zaXRpb24oQnJhbmNoTGFiZWwgbGFiZWwsIGludCBmb3J3YXJkUmVmZXJlbmNlKSB7CiAJZmluYWwgaW50IG9mZnNldCA9IGxhYmVsLnBvc2l0aW9uIC0gZm9yd2FyZFJlZmVyZW5jZSArIDE7CiAJaWYgKE1hdGguYWJzKG9mZnNldCkgPiAweDdGRkYgJiYgIXRoaXMud2lkZU1vZGUpIHsKQEAgLTYzNTUsNTggKzY3MTksNjQgQEAKIAkJdGhpcy53cml0ZVNpZ25lZFNob3J0KGZvcndhcmRSZWZlcmVuY2UsIG9mZnNldCk7CiAJfQogfQorCiAvKioKICAqIFdyaXRlIGEgc2lnbmVkIDE2IGJpdHMgdmFsdWUgaW50byB0aGUgYnl0ZSBhcnJheQogICogQHBhcmFtIHZhbHVlIHRoZSBzaWduZWQgc2hvcnQKICAqLwogcHJpdmF0ZSBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkU2hvcnQoaW50IHZhbHVlKSB7CiAJLy8gd2Uga2VlcCB0aGUgcmVzaXplIGluIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIG91dHNpZGUgdGhlIGNvZGUgc3RyZWFtCi0JaWYgKGNsYXNzRmlsZU9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaWYgKHRoaXMuY2xhc3NGaWxlT2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JcG9zaXRpb24gKz0gMjsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKKwl0aGlzLnBvc2l0aW9uICs9IDI7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKIH0KKwogcHJpdmF0ZSBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkU2hvcnQoaW50IHBvcywgaW50IHZhbHVlKSB7Ci0JaW50IGN1cnJlbnRPZmZzZXQgPSBzdGFydGluZ0NsYXNzRmlsZU9mZnNldCArIHBvczsKLQlpZiAoY3VycmVudE9mZnNldCArIDEgPj0gYkNvZGVTdHJlYW0ubGVuZ3RoKSB7CisJaW50IGN1cnJlbnRPZmZzZXQgPSB0aGlzLnN0YXJ0aW5nQ2xhc3NGaWxlT2Zmc2V0ICsgcG9zOworCWlmIChjdXJyZW50T2Zmc2V0ICsgMSA+PSB0aGlzLmJDb2RlU3RyZWFtLmxlbmd0aCkgewogCQlyZXNpemVCeXRlQXJyYXkoKTsKIAl9Ci0JYkNvZGVTdHJlYW1bY3VycmVudE9mZnNldF0gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOwotCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQgKyAxXSA9IChieXRlKSB2YWx1ZTsKKwl0aGlzLmJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXRdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwl0aGlzLmJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQgKyAxXSA9IChieXRlKSB2YWx1ZTsKIH0KKwogcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVTaWduZWRXb3JkKGludCB2YWx1ZSkgewogCS8vIHdlIGtlZXAgdGhlIHJlc2l6ZSBpbiBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBvdXRzaWRlIHRoZSBjb2RlIHN0cmVhbQotCWlmIChjbGFzc0ZpbGVPZmZzZXQgKyAzID49IGJDb2RlU3RyZWFtLmxlbmd0aCkgeworCWlmICh0aGlzLmNsYXNzRmlsZU9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCXBvc2l0aW9uICs9IDQ7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMDAwKSA+PiAyNCk7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpOwotCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwKSA+PiA4KTsKLQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlICYgMHhGRik7CisJdGhpcy5wb3NpdGlvbiArPSA0OworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpOworCXRoaXMuYkNvZGVTdHJlYW1bdGhpcy5jbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMCkgPj4gOCk7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKIH0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkV29yZChpbnQgcG9zLCBpbnQgdmFsdWUpIHsKLQlpbnQgY3VycmVudE9mZnNldCA9IHN0YXJ0aW5nQ2xhc3NGaWxlT2Zmc2V0ICsgcG9zOwotCWlmIChjdXJyZW50T2Zmc2V0ICsgMyA+PSBiQ29kZVN0cmVhbS5sZW5ndGgpIHsKKworcHJvdGVjdGVkIHZvaWQgd3JpdGVTaWduZWRXb3JkKGludCBwb3MsIGludCB2YWx1ZSkgeworCWludCBjdXJyZW50T2Zmc2V0ID0gdGhpcy5zdGFydGluZ0NsYXNzRmlsZU9mZnNldCArIHBvczsKKwlpZiAoY3VycmVudE9mZnNldCArIDMgPj0gdGhpcy5iQ29kZVN0cmVhbS5sZW5ndGgpIHsKIAkJcmVzaXplQnl0ZUFycmF5KCk7CiAJfQotCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKLQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpOwotCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMCkgPj4gOCk7Ci0JYkNvZGVTdHJlYW1bY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKKwl0aGlzLmJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKwl0aGlzLmJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwKSA+PiAxNik7CisJdGhpcy5iQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDApID4+IDgpOworCXRoaXMuYkNvZGVTdHJlYW1bY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKIH0KKwogLyoqCiAgKiBXcml0ZSBhIHVuc2lnbmVkIDE2IGJpdHMgdmFsdWUgaW50byB0aGUgYnl0ZSBhcnJheQogICogQHBhcmFtIHZhbHVlIHRoZSB1bnNpZ25lZCBzaG9ydAogICovCiBwcml2YXRlIGZpbmFsIHZvaWQgd3JpdGVVbnNpZ25lZFNob3J0KGludCB2YWx1ZSkgewogCS8vIG5vIGJvdW5kIGNoZWNrIHNpbmNlIHVzZWQgb25seSBmcm9tIHdpdGhpbiBjb2Rlc3RyZWFtIHdoZXJlIGFscmVhZHkgY2hlY2tlZAotCXBvc2l0aW9uICs9IDI7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+Pj4gOCk7Ci0JYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCXRoaXMucG9zaXRpb24gKz0gMjsKKwl0aGlzLmJDb2RlU3RyZWFtW3RoaXMuY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+Pj4gOCk7CisJdGhpcy5iQ29kZVN0cmVhbVt0aGlzLmNsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKIH0KKwogcHJvdGVjdGVkIHZvaWQgd3JpdGVXaWRlUG9zaXRpb24oQnJhbmNoTGFiZWwgbGFiZWwpIHsKIAlpbnQgbGFiZWxQb3MgPSBsYWJlbC5wb3NpdGlvbjsKIAlpbnQgb2Zmc2V0ID0gbGFiZWxQb3MgLSB0aGlzLnBvc2l0aW9uICsgMTsKQEAgLTY0MTYsNiArNjc4Niw2IEBACiAJCWludCBmb3J3YXJkID0gZm9yd2FyZFJlZnNbaV07CiAJCW9mZnNldCA9IGxhYmVsUG9zIC0gZm9yd2FyZCArIDE7CiAJCXRoaXMud3JpdGVTaWduZWRXb3JkKGZvcndhcmQsIG9mZnNldCk7Ci0JfQkKKwl9CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db25zdGFudFBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCmluZGV4IDBmY2U4YTkuLmFjYTM1ZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDEwICsxMywxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIC8qKgogICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMuCiAgKi8KQEAgLTQ0LDYgKzQ2LDcgQEAKIAlwdWJsaWMgYnl0ZVtdIHBvb2xDb250ZW50OwogCXB1YmxpYyBpbnQgY3VycmVudEluZGV4ID0gMTsKIAlwdWJsaWMgaW50IGN1cnJlbnRPZmZzZXQ7CisJcHVibGljIGludFtdIG9mZnNldHM7CiAKIAlwdWJsaWMgQ2xhc3NGaWxlIGNsYXNzRmlsZTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBBcHBlbmQgPSAiYXBwZW5kIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCkBAIC02OCw2ICs3MSw4IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ2xpbml0ID0gIjxjbGluaXQ+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRGVmYXVsdENvbnN0cnVjdG9yU2lnbmF0dXJlID0gIigpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENsaW5pdFNpZ25hdHVyZSA9IERlZmF1bHRDb25zdHJ1Y3RvclNpZ25hdHVyZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDbG9zZSA9ICJjbG9zZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENsb3NlU2lnbmF0dXJlID0gIigpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIERlc2lyZWRBc3NlcnRpb25TdGF0dXMgPSAiZGVzaXJlZEFzc2VydGlvblN0YXR1cyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIERlc2lyZWRBc3NlcnRpb25TdGF0dXNTaWduYXR1cmUgPSAiKClaIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRG91YmxlQ29uc3RyU2lnbmF0dXJlID0gIihEKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKQEAgLTExOSw2ICsxMjQsOCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEhhc05leHRTaWduYXR1cmUgPSAiKClaIi50b0NoYXJBcnJheSgpOy8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBJbml0ID0gIjxpbml0PiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEludENvbnN0clNpZ25hdHVyZSA9ICIoSSlWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSVRFUkFUT1JfTkFNRSA9ICJpdGVyYXRvciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIElURVJBVE9SX1NJR05BVFVSRSA9ICIoKUxqYXZhL3V0aWwvSXRlcmF0b3I7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSW50ZXJuID0gImludGVybiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEludGVyblNpZ25hdHVyZSA9IEdldE1lc3NhZ2VTaWduYXR1cmU7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSW50SW50ZWdlclNpZ25hdHVyZSA9ICIoSSlMamF2YS9sYW5nL0ludGVnZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCkBAIC0yMzcsNjc0ICsyNDQsNzgxIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX0FOTk9UQVRJT05fVEFSR0VUID0gIkxqYXZhL2xhbmcvYW5ub3RhdGlvbi9UYXJnZXQ7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX0RFUFJFQ0FURUQgPSAiTGphdmEvbGFuZy9EZXByZWNhdGVkOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEpBVkFfTEFOR19BTk5PVEFUSU9OX0lOSEVSSVRFRCA9ICJMamF2YS9sYW5nL2Fubm90YXRpb24vSW5oZXJpdGVkOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotLyoqCi0gKiBDb25zdGFudFBvb2wgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIENvbnN0YW50UG9vbChDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7Ci0JdGhpcy5VVEY4Q2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoVVRGOF9JTklUSUFMX1NJWkUpOwotCXRoaXMuc3RyaW5nQ2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoU1RSSU5HX0lOSVRJQUxfU0laRSk7Ci0JdGhpcy5tZXRob2RzQW5kRmllbGRzQ2FjaGUgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoTUVUSE9EU19BTkRfRklFTERTX0lOSVRJQUxfU0laRSk7Ci0JdGhpcy5jbGFzc0NhY2hlID0gbmV3IENoYXJBcnJheUNhY2hlKENMQVNTX0lOSVRJQUxfU0laRSk7Ci0JdGhpcy5uYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzQW5kTWV0aG9kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdChOQU1FQU5EVFlQRV9JTklUSUFMX1NJWkUpOwotCWluaXRpYWxpemUoY2xhc3NGaWxlKTsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3NGaWxlIGdpdmVuQ2xhc3NGaWxlKSB7Ci0JdGhpcy5wb29sQ29udGVudCA9IGdpdmVuQ2xhc3NGaWxlLmhlYWRlcjsKLQl0aGlzLmN1cnJlbnRPZmZzZXQgPSBnaXZlbkNsYXNzRmlsZS5oZWFkZXJPZmZzZXQ7Ci0JLy8gY3VycmVudE9mZnNldCBpcyBpbml0aWFsaXplZCB0byAwIGJ5IGRlZmF1bHQKLQl0aGlzLmN1cnJlbnRJbmRleCA9IDE7Ci0JdGhpcy5jbGFzc0ZpbGUgPSBnaXZlbkNsYXNzRmlsZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSByZWNlaXZlcgotICovCi1wdWJsaWMgYnl0ZVtdIGR1bXBCeXRlcygpIHsKLQlTeXN0ZW0uYXJyYXljb3B5KHBvb2xDb250ZW50LCAwLCAocG9vbENvbnRlbnQgPSBuZXcgYnl0ZVtjdXJyZW50T2Zmc2V0XSksIDAsIGN1cnJlbnRPZmZzZXQpOwotCXJldHVybiBwb29sQ29udGVudDsKLX0KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGJ5dGVbXSB1dGY4ZW5jb2RpbmcsIGNoYXJbXSBzdHJpbmdDaGFyQXJyYXkpIHsKLQlpbnQgaW5kZXg7Ci0JaWYgKChpbmRleCA9IFVURjhDYWNoZS5wdXRJZkFic2VudChzdHJpbmdDaGFyQXJyYXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpPiAweEZGRkYpIHsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJY3VycmVudEluZGV4Kys7Ci0JCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKLQkJd3JpdGVVMShVdGY4VGFnKTsKLQkJaW50IHV0ZjhlbmNvZGluZ0xlbmd0aCA9IHV0ZjhlbmNvZGluZy5sZW5ndGg7Ci0JCWlmIChjdXJyZW50T2Zmc2V0ICsgMiArIHV0ZjhlbmNvZGluZ0xlbmd0aCA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKLQkJCS8vIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBwb29sQ29udGVudCBhcnJheSBiZWNhdXNlIHdlIHdvbid0IGhhdmUKLQkJCS8vIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgbGVuZ3RoCi0JCQlyZXNpemVQb29sQ29udGVudHMoMiArIHV0ZjhlbmNvZGluZ0xlbmd0aCk7Ci0JCX0KLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodXRmOGVuY29kaW5nTGVuZ3RoID4+IDgpOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIHV0ZjhlbmNvZGluZ0xlbmd0aDsKLQkJLy8gYWRkIGluIG9uY2UgdGhlIHdob2xlIGJ5dGUgYXJyYXkKLQkJU3lzdGVtLmFycmF5Y29weSh1dGY4ZW5jb2RpbmcsIDAsIHBvb2xDb250ZW50LCBjdXJyZW50T2Zmc2V0LCB1dGY4ZW5jb2RpbmdMZW5ndGgpOwotCQljdXJyZW50T2Zmc2V0ICs9IHV0ZjhlbmNvZGluZ0xlbmd0aDsKLQl9Ci0JcmV0dXJuIGluZGV4OwotfQotcHVibGljIGludCBsaXRlcmFsSW5kZXgoVHlwZUJpbmRpbmcgYmluZGluZykgewotCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSgpOwotCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkgewotCQl0aGlzLmNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXModHlwZUJpbmRpbmcpOwotCX0KLQlyZXR1cm4gbGl0ZXJhbEluZGV4KGJpbmRpbmcuc2lnbmF0dXJlKCkpOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgotICoKLSAqIEBwYXJhbSB1dGY4Q29uc3RhbnQgY2hhcltdCi0gKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KLSAqLwotcHVibGljIGludCBsaXRlcmFsSW5kZXgoY2hhcltdIHV0ZjhDb25zdGFudCkgewotCWludCBpbmRleDsKLQlpZiAoKGluZGV4ID0gVVRGOENhY2hlLnB1dElmQWJzZW50KHV0ZjhDb25zdGFudCwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKLQkJaW5kZXggPSAtaW5kZXg7Ci0JCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0Ci0JCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKLQkJd3JpdGVVMShVdGY4VGFnKTsKLQkJLy8gVGhlbiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nTmFtZSBhcnJheQotCQlpbnQgc2F2ZWRDdXJyZW50T2Zmc2V0ID0gY3VycmVudE9mZnNldDsKLQkJaWYgKGN1cnJlbnRPZmZzZXQgKyAyID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJLy8gd2UgbmVlZCB0byByZXNpemUgdGhlIHBvb2xDb250ZW50IGFycmF5IGJlY2F1c2Ugd2Ugd29uJ3QgaGF2ZQotCQkJLy8gZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBsZW5ndGgKLQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKLQkJfQotCQljdXJyZW50T2Zmc2V0ICs9IDI7Ci0JCWludCBsZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHV0ZjhDb25zdGFudC5sZW5ndGg7IGkrKykgewotCQkJY2hhciBjdXJyZW50ID0gdXRmOENvbnN0YW50W2ldOwotCQkJaWYgKChjdXJyZW50ID49IDB4MDAwMSkgJiYgKGN1cnJlbnQgPD0gMHgwMDdGKSkgewotCQkJCS8vIHdlIG9ubHkgbmVlZCBvbmUgYnl0ZTogQVNDSUkgdGFibGUKLQkJCQl3cml0ZVUxKGN1cnJlbnQpOwotCQkJCWxlbmd0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3VycmVudCA+IDB4MDdGRikgewotCQkJCQkvLyB3ZSBuZWVkIDMgYnl0ZXMKLQkJCQkJbGVuZ3RoICs9IDM7Ci0JCQkJCXdyaXRlVTEoMHhFMCB8ICgoY3VycmVudCA+PiAxMikgJiAweDBGKSk7IC8vIDB4RTAgPSAxMTEwIDAwMDAKLQkJCQkJd3JpdGVVMSgweDgwIHwgKChjdXJyZW50ID4+IDYpICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCi0JCQkJCXdyaXRlVTEoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2UgY2FuIGJlIDAgb3IgYmV0d2VlbiAweDAwODAgYW5kIDB4MDdGRgotCQkJCQkvLyBJbiB0aGF0IGNhc2Ugd2Ugb25seSBuZWVkIDIgYnl0ZXMKLQkJCQkJbGVuZ3RoICs9IDI7Ci0JCQkJCXdyaXRlVTEoMHhDMCB8ICgoY3VycmVudCA+PiA2KSAmIDB4MUYpKTsgLy8gMHhDMCA9IDExMDAgMDAwMAotCQkJCQl3cml0ZVUxKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobGVuZ3RoID49IDY1NTM1KSB7Ci0JCQljdXJyZW50T2Zmc2V0ID0gc2F2ZWRDdXJyZW50T2Zmc2V0IC0gMTsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JDb25zdGFudCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJY3VycmVudEluZGV4Kys7ICAgICAKLQkJLy8gTm93IHdlIGtub3cgdGhlIGxlbmd0aCB0aGF0IHdlIGhhdmUgdG8gd3JpdGUgaW4gdGhlIGNvbnN0YW50IHBvb2wKLQkJLy8gd2UgdXNlIHNhdmVkQ3VycmVudE9mZnNldCB0byBkbyB0aGF0Ci0JCXBvb2xDb250ZW50W3NhdmVkQ3VycmVudE9mZnNldF0gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKLQkJcG9vbENvbnRlbnRbc2F2ZWRDdXJyZW50T2Zmc2V0ICsgMV0gPSAoYnl0ZSkgbGVuZ3RoOwotCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci1wdWJsaWMgaW50IGxpdGVyYWxJbmRleChjaGFyW10gc3RyaW5nQ2hhckFycmF5LCBieXRlW10gdXRmOGVuY29kaW5nKSB7Ci0JaW50IGluZGV4OwotCWlmICgoaW5kZXggPSBzdHJpbmdDYWNoZS5wdXRJZkFic2VudChzdHJpbmdDaGFyQXJyYXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJLy8gV3JpdGUgdGhlIHRhZyBmaXJzdAotCQl3cml0ZVUxKFN0cmluZ1RhZyk7Ci0JCS8vIFRoZW4gdGhlIHN0cmluZyBpbmRleAotCQlpbnQgc3RyaW5nSW5kZXhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7Ci0JCWlmIChjdXJyZW50T2Zmc2V0ICsgMiA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKLQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKLQkJfQotCQljdXJyZW50T2Zmc2V0Kz0yOworCS8vIGphdmEgNyAgamF2YS5sYW5nLlNhZmVWYXJhcmdzCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX1NBRkVWQVJBUkdTID0gIkxqYXZhL2xhbmcvU2FmZVZhcmFyZ3M7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJLy8gamF2YSA3IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlLmludm9rZUV4YWN0KC4uKS9pbnZva2VHZW5lcmljKC4uKQorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEpBVkFfTEFOR19JTlZPS0VfTUVUSE9ESEFORExFX1BPTFlNT1JQSElDU0lHTkFUVVJFID0gIkxqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZSRQb2x5bW9ycGhpY1NpZ25hdHVyZTsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAotCQlmaW5hbCBpbnQgc3RyaW5nSW5kZXggPSBsaXRlcmFsSW5kZXgodXRmOGVuY29kaW5nLCBzdHJpbmdDaGFyQXJyYXkpOwotCQlwb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldCsrXSA9IChieXRlKSAoc3RyaW5nSW5kZXggPj4gOCk7Ci0JCXBvb2xDb250ZW50W3N0cmluZ0luZGV4T2Zmc2V0XSA9IChieXRlKSBzdHJpbmdJbmRleDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBIYXNoQ29kZSA9ICJoYXNoQ29kZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEhhc2hDb2RlU2lnbmF0dXJlID0gIigpSSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJDsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRXF1YWxzID0gImVxdWFscyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVxdWFsc1NpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVoiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQ7IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEFkZFN1cHByZXNzZWQgPSAiYWRkU3VwcHJlc3NlZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBBZGRTdXBwcmVzc2VkU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1Rocm93YWJsZTspViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbnN0YW50UG9vbCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBDb25zdGFudFBvb2woQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCQl0aGlzLlVURjhDYWNoZSA9IG5ldyBDaGFyQXJyYXlDYWNoZShVVEY4X0lOSVRJQUxfU0laRSk7CisJCXRoaXMuc3RyaW5nQ2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoU1RSSU5HX0lOSVRJQUxfU0laRSk7CisJCXRoaXMubWV0aG9kc0FuZEZpZWxkc0NhY2hlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KE1FVEhPRFNfQU5EX0ZJRUxEU19JTklUSUFMX1NJWkUpOworCQl0aGlzLmNsYXNzQ2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoQ0xBU1NfSU5JVElBTF9TSVpFKTsKKwkJdGhpcy5uYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzQW5kTWV0aG9kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdChOQU1FQU5EVFlQRV9JTklUSUFMX1NJWkUpOworCQl0aGlzLm9mZnNldHMgPSBuZXcgaW50WzVdOworCQlpbml0aWFsaXplKGNsYXNzRmlsZSk7CiAJfQotCXJldHVybiBpbmRleDsKLX0KLS8qKgotICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRvdWJsZQotICogdmFsdWUuIElmIHRoZSBkb3VibGUgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlIAotICogZG91YmxlIGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgotICoKLSAqIEBwYXJhbSBrZXkgPENPREU+ZG91YmxlPC9DT0RFPgotICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+Ci0gKi8KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGRvdWJsZSBrZXkpIHsKLQkvL1JldHJpZXZlIHRoZSBpbmRleCBmcm9tIHRoZSBjYWNoZQotCS8vIFRoZSBkb3VibGUgY29uc3RhbnQgdGFrZXMgdHdvIGluZGV4ZXMgaW50byB0aGUgY29uc3RhbnQgcG9vbCwgYnV0IHdlIG9ubHkgc3RvcmUKLQkvLyB0aGUgZmlyc3QgaW5kZXggaW50byB0aGUgbG9uZyB0YWJsZQotCWludCBpbmRleDsKLQkvLyBsYXp5IGluaXRpYWxpemF0aW9uIGZvciBiYXNlIHR5cGUgY2FjaGVzCi0JLy8gSWYgaXQgaXMgbnVsbCwgaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHVzZSBpdAotCWlmIChkb3VibGVDYWNoZSA9PSBudWxsKSB7Ci0JCQlkb3VibGVDYWNoZSA9IG5ldyBEb3VibGVDYWNoZShET1VCTEVfSU5JVElBTF9TSVpFKTsKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzRmlsZSBnaXZlbkNsYXNzRmlsZSkgeworCQl0aGlzLnBvb2xDb250ZW50ID0gZ2l2ZW5DbGFzc0ZpbGUuaGVhZGVyOworCQl0aGlzLmN1cnJlbnRPZmZzZXQgPSBnaXZlbkNsYXNzRmlsZS5oZWFkZXJPZmZzZXQ7CisJCS8vIGN1cnJlbnRPZmZzZXQgaXMgaW5pdGlhbGl6ZWQgdG8gMCBieSBkZWZhdWx0CisJCXRoaXMuY3VycmVudEluZGV4ID0gMTsKKwkJdGhpcy5jbGFzc0ZpbGUgPSBnaXZlbkNsYXNzRmlsZTsKIAl9Ci0JaWYgKChpbmRleCA9IGRvdWJsZUNhY2hlLnB1dElmQWJzZW50KGtleSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKLQkJaWYgKChpbmRleCA9IC1pbmRleCk+IDB4RkZGRil7Ci0JCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOwotCQl9Ci0JCXRoaXMuY3VycmVudEluZGV4ICs9IDI7IC8vIGEgZG91YmxlIG5lZWRzIGFuIGV4dHJhIHBsYWNlIGludG8gdGhlIGNvbnN0YW50IHBvb2wKLQkJLy8gV3JpdGUgdGhlIGRvdWJsZSBpbnRvIHRoZSBjb25zdGFudCBwb29sCi0JCS8vIEZpcnN0IGFkZCB0aGUgdGFnCi0JCXdyaXRlVTEoRG91YmxlVGFnKTsKLQkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBkb3VibGUKLQkJbG9uZyB0ZW1wID0gamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGtleSk7Ci0JCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7Ci0JCWlmIChjdXJyZW50T2Zmc2V0ICsgOCA+PSBsZW5ndGgpIHsKLQkJCXJlc2l6ZVBvb2xDb250ZW50cyg4KTsKLQkJfQotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiA1Nik7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDQ4KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gNDApOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiAzMik7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDI0KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gMTYpOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiA4KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSB0ZW1wOworCS8qKgorCSAqIFJldHVybiB0aGUgY29udGVudCBvZiB0aGUgcmVjZWl2ZXIKKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGR1bXBCeXRlcygpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBvb2xDb250ZW50LCAwLCAodGhpcy5wb29sQ29udGVudCA9IG5ldyBieXRlW3RoaXMuY3VycmVudE9mZnNldF0pLCAwLCB0aGlzLmN1cnJlbnRPZmZzZXQpOworCQlyZXR1cm4gdGhpcy5wb29sQ29udGVudDsKIAl9Ci0JcmV0dXJuIGluZGV4OwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgZmxvYXQKLSAqIHZhbHVlLiBJZiB0aGUgZmxvYXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlIAotICogaW50IGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgotICoKLSAqIEBwYXJhbSBrZXkgPENPREU+ZmxvYXQ8L0NPREU+Ci0gKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KLSAqLwotcHVibGljIGludCBsaXRlcmFsSW5kZXgoZmxvYXQga2V5KSB7Ci0JLy9SZXRyaWV2ZSB0aGUgaW5kZXggZnJvbSB0aGUgY2FjaGUKLQlpbnQgaW5kZXg7Ci0JLy8gbGF6eSBpbml0aWFsaXphdGlvbiBmb3IgYmFzZSB0eXBlIGNhY2hlcwotCS8vIElmIGl0IGlzIG51bGwsIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB1c2UgaXQKLQlpZiAoZmxvYXRDYWNoZSA9PSBudWxsKSB7Ci0JCWZsb2F0Q2FjaGUgPSBuZXcgRmxvYXRDYWNoZShGTE9BVF9JTklUSUFMX1NJWkUpOwotCX0KLQlpZiAoKGluZGV4ID0gZmxvYXRDYWNoZS5wdXRJZkFic2VudChrZXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJdGhpcy5jdXJyZW50SW5kZXgrKzsKLQkJLy8gV3JpdGUgdGhlIGZsb2F0IGNvbnN0YW50IGVudHJ5IGludG8gdGhlIGNvbnN0YW50IHBvb2wKLQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKLQkJd3JpdGVVMShGbG9hdFRhZyk7Ci0JCS8vIFRoZW4gYWRkIHRoZSA0IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZmxvYXQKLQkJaW50IHRlbXAgPSBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5KTsKLQkJaWYgKGN1cnJlbnRPZmZzZXQgKyA0ID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOwotCQl9Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDI0KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gMTYpOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiA4KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSB0ZW1wOwotCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnQKLSAqIHZhbHVlLiBJZiB0aGUgaW50IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW50byB0aGUgcG9vbCwgaXQgaXMgYWRkZWQuIFRoZSAKLSAqIGludCBjYWNoZSBpcyB1cGRhdGVkIGFuZCBpdCByZXR1cm5zIHRoZSByaWdodCBpbmRleC4KLSAqCi0gKiBAcGFyYW0ga2V5IDxDT0RFPmludDwvQ09ERT4KLSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgotICovCi1wdWJsaWMgaW50IGxpdGVyYWxJbmRleChpbnQga2V5KSB7Ci0JLy9SZXRyaWV2ZSB0aGUgaW5kZXggZnJvbSB0aGUgY2FjaGUKLQlpbnQgaW5kZXg7Ci0JLy8gbGF6eSBpbml0aWFsaXphdGlvbiBmb3IgYmFzZSB0eXBlIGNhY2hlcwotCS8vIElmIGl0IGlzIG51bGwsIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB1c2UgaXQKLQlpZiAoaW50Q2FjaGUgPT0gbnVsbCkgewotCQlpbnRDYWNoZSA9IG5ldyBJbnRlZ2VyQ2FjaGUoSU5UX0lOSVRJQUxfU0laRSk7Ci0JfQotCWlmICgoaW5kZXggPSBpbnRDYWNoZS5wdXRJZkFic2VudChrZXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkvLyBXcml0ZSB0aGUgaW50ZWdlciBjb25zdGFudCBlbnRyeSBpbnRvIHRoZSBjb25zdGFudCBwb29sCi0JCS8vIEZpcnN0IGFkZCB0aGUgdGFnCi0JCXdyaXRlVTEoSW50ZWdlclRhZyk7Ci0JCS8vIFRoZW4gYWRkIHRoZSA0IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgaW50Ci0JCWlmIChjdXJyZW50T2Zmc2V0ICsgNCA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKLQkJCXJlc2l6ZVBvb2xDb250ZW50cyg0KTsKLQkJfQotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDI0KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoa2V5ID4+PiAxNik7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gOCk7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkga2V5OwotCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb25nCi0gKiB2YWx1ZS4gSWYgdGhlIGxvbmcgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlIAotICogbG9uZyBjYWNoZSBpcyB1cGRhdGVkIGFuZCBpdCByZXR1cm5zIHRoZSByaWdodCBpbmRleC4KLSAqCi0gKiBAcGFyYW0ga2V5IDxDT0RFPmxvbmc8L0NPREU+Ci0gKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KLSAqLwotcHVibGljIGludCBsaXRlcmFsSW5kZXgobG9uZyBrZXkpIHsKLQkvLyBSZXRyaWV2ZSB0aGUgaW5kZXggZnJvbSB0aGUgY2FjaGUKLQkvLyBUaGUgbG9uZyBjb25zdGFudCB0YWtlcyB0d28gaW5kZXhlcyBpbnRvIHRoZSBjb25zdGFudCBwb29sLCBidXQgd2Ugb25seSBzdG9yZQotCS8vIHRoZSBmaXJzdCBpbmRleCBpbnRvIHRoZSBsb25nIHRhYmxlCi0JaW50IGluZGV4OwotCS8vIGxhenkgaW5pdGlhbGl6YXRpb24gZm9yIGJhc2UgdHlwZSBjYWNoZXMKLQkvLyBJZiBpdCBpcyBudWxsLCBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdXNlIGl0Ci0JaWYgKGxvbmdDYWNoZSA9PSBudWxsKSB7Ci0JCWxvbmdDYWNoZSA9IG5ldyBMb25nQ2FjaGUoTE9OR19JTklUSUFMX1NJWkUpOwotCX0KLQlpZiAoKGluZGV4ID0gbG9uZ0NhY2hlLnB1dElmQWJzZW50KGtleSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKLQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpewotCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKLQkJfQotCQl0aGlzLmN1cnJlbnRJbmRleCs9IDI7IC8vIGxvbmcgdmFsdWUgbmVlZCBhbiBleHRyYSBwbGFjZSBpbnRvIHRod2UgY29uc3RhbnQgcG9vbAotCQkvLyBXcml0ZSB0aGUgbG9uZyBpbnRvIHRoZSBjb25zdGFudCBwb29sCi0JCS8vIEZpcnN0IGFkZCB0aGUgdGFnCi0JCXdyaXRlVTEoTG9uZ1RhZyk7Ci0JCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZwotCQlpZiAoY3VycmVudE9mZnNldCArIDggPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCQlyZXNpemVQb29sQ29udGVudHMoOCk7Ci0JCX0KLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoa2V5ID4+PiA1Nik7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gNDgpOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDQwKTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoa2V5ID4+PiAzMik7Ci0JCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gMjQpOwotCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDE2KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoa2V5ID4+PiA4KTsKLQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSBrZXk7Ci0JfQotCXJldHVybiBpbmRleDsKLX0KLS8qKgotICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nQ29uc3RhbnQgamF2YS5sYW5nLlN0cmluZwotICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+Ci0gKi8KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KFN0cmluZyBzdHJpbmdDb25zdGFudCkgewotCWludCBpbmRleDsKLQljaGFyW10gc3RyaW5nQ2hhckFycmF5ID0gc3RyaW5nQ29uc3RhbnQudG9DaGFyQXJyYXkoKTsKLQlpZiAoKGluZGV4ID0gc3RyaW5nQ2FjaGUucHV0SWZBYnNlbnQoc3RyaW5nQ2hhckFycmF5LCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgewotCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAotCQljdXJyZW50SW5kZXgrKzsKLQkJaWYgKChpbmRleCAgPSAtaW5kZXgpPiAweEZGRkYpewotCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKLQkJfQotCQkvLyBXcml0ZSB0aGUgdGFnIGZpcnN0Ci0JCXdyaXRlVTEoU3RyaW5nVGFnKTsKLQkJLy8gVGhlbiB0aGUgc3RyaW5nIGluZGV4Ci0JCWludCBzdHJpbmdJbmRleE9mZnNldCA9IHRoaXMuY3VycmVudE9mZnNldDsKLQkJaWYgKGN1cnJlbnRPZmZzZXQgKyAyID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJcmVzaXplUG9vbENvbnRlbnRzKDIpOwotCQl9Ci0JCWN1cnJlbnRPZmZzZXQrPTI7Ci0JCWZpbmFsIGludCBzdHJpbmdJbmRleCA9IGxpdGVyYWxJbmRleChzdHJpbmdDaGFyQXJyYXkpOwotCQlwb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldCsrXSA9IChieXRlKSAoc3RyaW5nSW5kZXggPj4gOCk7Ci0JCXBvb2xDb250ZW50W3N0cmluZ0luZGV4T2Zmc2V0XSA9IChieXRlKSBzdHJpbmdJbmRleDsKLQl9Ci0JcmV0dXJuIGluZGV4OwotfQotcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JUeXBlKGZpbmFsIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKSB7Ci0JaW50IGluZGV4OwotCWlmICgoaW5kZXggPSBjbGFzc0NhY2hlLnB1dElmQWJzZW50KGNvbnN0YW50UG9vbE5hbWUsIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJd3JpdGVVMShDbGFzc1RhZyk7Ci0KLQkJLy8gVGhlbiB0aGUgbmFtZSBpbmRleAotCQlpbnQgbmFtZUluZGV4T2Zmc2V0ID0gdGhpcy5jdXJyZW50T2Zmc2V0OwotCQlpZiAoY3VycmVudE9mZnNldCArIDIgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCQlyZXNpemVQb29sQ29udGVudHMoMik7Ci0JCX0KLQkJY3VycmVudE9mZnNldCs9MjsKLQkJZmluYWwgaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChjb25zdGFudFBvb2xOYW1lKTsKLQkJcG9vbENvbnRlbnRbbmFtZUluZGV4T2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7Ci0JCXBvb2xDb250ZW50W25hbWVJbmRleE9mZnNldF0gPSAoYnl0ZSkgbmFtZUluZGV4OwotCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0vKgotICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvciAKLSAqIGNvcnJlc3BvbmRpbmcgdG8gYSB0eXBlIGNvbnN0YW50IHBvb2wgbmFtZQotICogYmluZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheSB0eXBlLgotICovCi1wdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvclR5cGUoZmluYWwgVHlwZUJpbmRpbmcgYmluZGluZykgewotCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSgpOwotCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkgewotCQl0aGlzLmNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXModHlwZUJpbmRpbmcpOwotCX0KLQlyZXR1cm4gdGhpcy5saXRlcmFsSW5kZXhGb3JUeXBlKGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKLX0KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yTWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdDbGFzcywgY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gc2lnbmF0dXJlLCBib29sZWFuIGlzSW50ZXJmYWNlKSB7Ci0JaW50IGluZGV4OwotCWlmICgoaW5kZXggPSBwdXRJbkNhY2hlSWZBYnNlbnQoZGVjbGFyaW5nQ2xhc3MsIHNlbGVjdG9yLCBzaWduYXR1cmUsIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCS8vIGl0IGRvZXNuJ3QgZXhpc3QgeWV0Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJLy8gV3JpdGUgdGhlIGludGVyZmFjZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKLQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKLQkJd3JpdGVVMShpc0ludGVyZmFjZSA/IEludGVyZmFjZU1ldGhvZFJlZlRhZyA6IE1ldGhvZFJlZlRhZyk7Ci0KLQkJaW50IGNsYXNzSW5kZXhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7Ci0JCWlmIChjdXJyZW50T2Zmc2V0ICsgNCA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKLQkJCXJlc2l6ZVBvb2xDb250ZW50cyg0KTsKLQkJfQotCQljdXJyZW50T2Zmc2V0Kz00OwotCQkKLQkJZmluYWwgaW50IGNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JUeXBlKGRlY2xhcmluZ0NsYXNzKTsKLQkJZmluYWwgaW50IG5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JOYW1lQW5kVHlwZShzZWxlY3Rvciwgc2lnbmF0dXJlKTsKLQotCQlwb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc0luZGV4ID4+IDgpOwotCQlwb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzSW5kZXg7Ci0JCXBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVBbmRUeXBlSW5kZXggPj4gOCk7Ci0JCXBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXRdID0gKGJ5dGUpIG5hbWVBbmRUeXBlSW5kZXg7Ci0JfQotCXJldHVybiBpbmRleDsKLX0KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yTWV0aG9kKFR5cGVCaW5kaW5nIGJpbmRpbmcsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdIHNpZ25hdHVyZSwgYm9vbGVhbiBpc0ludGVyZmFjZSkgewotCWlmIChiaW5kaW5nLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCXRoaXMuY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3NlcyhiaW5kaW5nKTsKLQl9Ci0JcmV0dXJuIHRoaXMubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLCBzZWxlY3Rvciwgc2lnbmF0dXJlLCBpc0ludGVyZmFjZSk7Ci19Ci1wdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvck5hbWVBbmRUeXBlKGNoYXJbXSBuYW1lLCBjaGFyW10gc2lnbmF0dXJlKSB7Ci0JaW50IGluZGV4OwotCWlmICgoaW5kZXggPSBwdXRJbk5hbWVBbmRUeXBlQ2FjaGVJZkFic2VudChuYW1lLCBzaWduYXR1cmUsIGN1cnJlbnRJbmRleCkpIDwgMCkgewotCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAotCQljdXJyZW50SW5kZXgrKzsKLQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpewotCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKLQkJfQotCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKLQkJaW50IG5hbWVJbmRleE9mZnNldCA9IHRoaXMuY3VycmVudE9mZnNldDsKLQkJaWYgKGN1cnJlbnRPZmZzZXQgKyA0ID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOwotCQl9Ci0JCWN1cnJlbnRPZmZzZXQrPTQ7Ci0JCQotCQlmaW5hbCBpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KG5hbWUpOwotCQlmaW5hbCBpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KHNpZ25hdHVyZSk7Ci0JCXBvb2xDb250ZW50W25hbWVJbmRleE9mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOwotCQlwb29sQ29udGVudFtuYW1lSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OwotCQlwb29sQ29udGVudFtuYW1lSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKHR5cGVJbmRleCA+PiA4KTsKLQkJcG9vbENvbnRlbnRbbmFtZUluZGV4T2Zmc2V0XSA9IChieXRlKSB0eXBlSW5kZXg7Ci0JfQotCXJldHVybiBpbmRleDsKLX0KLXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yRmllbGQoY2hhcltdIGRlY2xhcmluZ0NsYXNzLCBjaGFyW10gbmFtZSwgY2hhcltdIHNpZ25hdHVyZSkgewotCWludCBpbmRleDsKLQlpZiAoKGluZGV4ID0gcHV0SW5DYWNoZUlmQWJzZW50KGRlY2xhcmluZ0NsYXNzLCBuYW1lLCBzaWduYXR1cmUsIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCS8vIGRvZXNuJ3QgZXhpc3QgeWV0Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJLy8gV3JpdGUgdGhlIGludGVyZmFjZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKLQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKLQkJd3JpdGVVMShGaWVsZFJlZlRhZyk7Ci0JCWludCBjbGFzc0luZGV4T2Zmc2V0ID0gdGhpcy5jdXJyZW50T2Zmc2V0OwotCQlpZiAoY3VycmVudE9mZnNldCArIDQgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCQlyZXNpemVQb29sQ29udGVudHMoNCk7Ci0JCX0KLQkJY3VycmVudE9mZnNldCs9NDsKLQkJCi0JCWZpbmFsIGludCBjbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9yVHlwZShkZWNsYXJpbmdDbGFzcyk7Ci0JCWZpbmFsIGludCBuYW1lQW5kVHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4Rm9yTmFtZUFuZFR5cGUobmFtZSwgc2lnbmF0dXJlKTsKLQotCQlwb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc0luZGV4ID4+IDgpOwotCQlwb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzSW5kZXg7Ci0JCXBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVBbmRUeXBlSW5kZXggPj4gOCk7Ci0JCXBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXRdID0gKGJ5dGUpIG5hbWVBbmRUeXBlSW5kZXg7CQkKLQl9Ci0JcmV0dXJuIGluZGV4OwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgotICoKLSAqIEBwYXJhbSBzdHJpbmdDaGFyQXJyYXkgY2hhcltdCi0gKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KLSAqLwotcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JMZGMoY2hhcltdIHN0cmluZ0NoYXJBcnJheSkgewotCWludCBzYXZlZEN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4OwotCWludCBzYXZlZEN1cnJlbnRPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7Ci0JaW50IGluZGV4OwotCWlmICgoaW5kZXggPSBzdHJpbmdDYWNoZS5wdXRJZkFic2VudChzdHJpbmdDaGFyQXJyYXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7Ci0JCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0Ci0JCXRoaXMuY3VycmVudEluZGV4Kys7Ci0JCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKLQkJd3JpdGVVMShTdHJpbmdUYWcpOwotCQkKLQkJLy8gVGhlbiB0aGUgc3RyaW5nIGluZGV4Ci0JCWludCBzdHJpbmdJbmRleE9mZnNldCA9IHRoaXMuY3VycmVudE9mZnNldDsKLQkJaWYgKGN1cnJlbnRPZmZzZXQgKyAyID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJcmVzaXplUG9vbENvbnRlbnRzKDIpOwotCQl9Ci0JCWN1cnJlbnRPZmZzZXQrPTI7Ci0KLQkJaW50IHN0cmluZ0luZGV4OwotCQlpZiAoKHN0cmluZ0luZGV4ID0gVVRGOENhY2hlLnB1dElmQWJzZW50KHN0cmluZ0NoYXJBcnJheSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleChieXRlW10gdXRmOGVuY29kaW5nLCBjaGFyW10gc3RyaW5nQ2hhckFycmF5KSB7CisJCWludCBpbmRleDsKKwkJaWYgKChpbmRleCA9IHRoaXMuVVRGOENhY2hlLnB1dElmQWJzZW50KHN0cmluZ0NoYXJBcnJheSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKIAkJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCQlpZiAoKGluZGV4ID0gLWluZGV4KT4gMHhGRkZGKSB7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KIAkJCXRoaXMuY3VycmVudEluZGV4Kys7CiAJCQkvLyBXcml0ZSB0aGUgdGFnIGZpcnN0CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShVdGY4VGFnKTsKKwkJCWludCB1dGY4ZW5jb2RpbmdMZW5ndGggPSB1dGY4ZW5jb2RpbmcubGVuZ3RoOworCQkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDIgKyB1dGY4ZW5jb2RpbmdMZW5ndGggPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCisJCQkJLy8gZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBsZW5ndGgKKwkJCQlyZXNpemVQb29sQ29udGVudHMoMiArIHV0ZjhlbmNvZGluZ0xlbmd0aCk7CisJCQl9CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodXRmOGVuY29kaW5nTGVuZ3RoID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgdXRmOGVuY29kaW5nTGVuZ3RoOworCQkJLy8gYWRkIGluIG9uY2UgdGhlIHdob2xlIGJ5dGUgYXJyYXkKKwkJCVN5c3RlbS5hcnJheWNvcHkodXRmOGVuY29kaW5nLCAwLCB0aGlzLnBvb2xDb250ZW50LCB0aGlzLmN1cnJlbnRPZmZzZXQsIHV0ZjhlbmNvZGluZ0xlbmd0aCk7CisJCQl0aGlzLmN1cnJlbnRPZmZzZXQgKz0gdXRmOGVuY29kaW5nTGVuZ3RoOworCQl9CisJCXJldHVybiBpbmRleDsKKwl9CisJcHVibGljIGludCBsaXRlcmFsSW5kZXgoVHlwZUJpbmRpbmcgYmluZGluZykgeworCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKTsKKwkJaWYgKCh0eXBlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUodGhpcy5jbGFzc0ZpbGUsIHR5cGVCaW5kaW5nKTsKKwkJfQorCQlyZXR1cm4gbGl0ZXJhbEluZGV4KGJpbmRpbmcuc2lnbmF0dXJlKCkpOworCX0KKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorCSAqCisJICogQHBhcmFtIHV0ZjhDb25zdGFudCBjaGFyW10KKwkgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKwkgKi8KKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleChjaGFyW10gdXRmOENvbnN0YW50KSB7CisJCWludCBpbmRleDsKKwkJaWYgKChpbmRleCA9IHRoaXMuVVRGOENhY2hlLnB1dElmQWJzZW50KHV0ZjhDb25zdGFudCwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCWlmICgoaW5kZXggPSAtaW5kZXgpPiAweEZGRkYpIHsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJCWludCBsZW5ndGggPSB0aGlzLm9mZnNldHMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA8PSBpbmRleCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vZmZzZXRzLCAwLCAodGhpcy5vZmZzZXRzID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMub2Zmc2V0c1tpbmRleF0gPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CiAJCQl3cml0ZVUxKFV0ZjhUYWcpOwogCQkJLy8gVGhlbiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nTmFtZSBhcnJheQotCQkJaW50IGxlbmd0aE9mZnNldCA9IGN1cnJlbnRPZmZzZXQ7Ci0JCQlpZiAoY3VycmVudE9mZnNldCArIDIgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQlpbnQgc2F2ZWRDdXJyZW50T2Zmc2V0ID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDIgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKIAkJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCiAJCQkJLy8gZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBsZW5ndGgKIAkJCQlyZXNpemVQb29sQ29udGVudHMoMik7CiAJCQl9Ci0JCQljdXJyZW50T2Zmc2V0ICs9IDI7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ2hhckFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gc3RyaW5nQ2hhckFycmF5W2ldOworCQkJdGhpcy5jdXJyZW50T2Zmc2V0ICs9IDI7CisJCQlsZW5ndGggPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1dGY4Q29uc3RhbnQubGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyIGN1cnJlbnQgPSB1dGY4Q29uc3RhbnRbaV07CiAJCQkJaWYgKChjdXJyZW50ID49IDB4MDAwMSkgJiYgKGN1cnJlbnQgPD0gMHgwMDdGKSkgewogCQkJCQkvLyB3ZSBvbmx5IG5lZWQgb25lIGJ5dGU6IEFTQ0lJIHRhYmxlCisJCQkJCXdyaXRlVTEoY3VycmVudCk7CiAJCQkJCWxlbmd0aCsrOwotCQkJCQlpZiAoY3VycmVudE9mZnNldCArIDEgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCi0JCQkJCQkvLyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGxlbmd0aAotCQkJCQkJcmVzaXplUG9vbENvbnRlbnRzKDEpOwotCQkJCQl9Ci0JCQkJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkoY3VycmVudCk7Ci0JCQkJfSBlbHNlCisJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKGN1cnJlbnQgPiAweDA3RkYpIHsKIAkJCQkJCS8vIHdlIG5lZWQgMyBieXRlcwogCQkJCQkJbGVuZ3RoICs9IDM7Ci0JCQkJCQlpZiAoY3VycmVudE9mZnNldCArIDMgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCQkJCQkJLy8gd2UgbmVlZCB0byByZXNpemUgdGhlIHBvb2xDb250ZW50IGFycmF5IGJlY2F1c2Ugd2Ugd29uJ3QgaGF2ZQotCQkJCQkJCS8vIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgbGVuZ3RoCi0JCQkJCQkJcmVzaXplUG9vbENvbnRlbnRzKDMpOwotCQkJCQkJfQotCQkJCQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoMHhFMCB8ICgoY3VycmVudCA+PiAxMikgJiAweDBGKSk7IC8vIDB4RTAgPSAxMTEwIDAwMDAKLQkJCQkJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKDB4ODAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDNGKSk7IC8vIDB4ODAgPSAxMDAwIDAwMDAKLQkJCQkJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCQkJd3JpdGVVMSgweEUwIHwgKChjdXJyZW50ID4+IDEyKSAmIDB4MEYpKTsgLy8gMHhFMCA9IDExMTAgMDAwMAorCQkJCQkJd3JpdGVVMSgweDgwIHwgKChjdXJyZW50ID4+IDYpICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCQl3cml0ZVUxKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAogCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGN1cnJlbnRPZmZzZXQgKyAyID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBwb29sQ29udGVudCBhcnJheSBiZWNhdXNlIHdlIHdvbid0IGhhdmUKLQkJCQkJCQkvLyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGxlbmd0aAotCQkJCQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKLQkJCQkJCX0KIAkJCQkJCS8vIHdlIGNhbiBiZSAwIG9yIGJldHdlZW4gMHgwMDgwIGFuZCAweDA3RkYKIAkJCQkJCS8vIEluIHRoYXQgY2FzZSB3ZSBvbmx5IG5lZWQgMiBieXRlcwogCQkJCQkJbGVuZ3RoICs9IDI7Ci0JCQkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgweEMwIHwgKChjdXJyZW50ID4+IDYpICYgMHgxRikpOyAvLyAweEMwID0gMTEwMCAwMDAwCi0JCQkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgweDgwIHwgKGN1cnJlbnQgJiAweDNGKSk7IC8vIDB4ODAgPSAxMDAwIDAwMDAKKwkJCQkJCXdyaXRlVTEoMHhDMCB8ICgoY3VycmVudCA+PiA2KSAmIDB4MUYpKTsgLy8gMHhDMCA9IDExMDAgMDAwMAorCQkJCQkJd3JpdGVVMSgweDgwIHwgKGN1cnJlbnQgJiAweDNGKSk7IC8vIDB4ODAgPSAxMDAwIDAwMDAKIAkJCQkJfQorCQkJCX0KIAkJCX0KIAkJCWlmIChsZW5ndGggPj0gNjU1MzUpIHsKLQkJCQl0aGlzLmN1cnJlbnRPZmZzZXQgPSBzYXZlZEN1cnJlbnRPZmZzZXQ7Ci0JCQkJdGhpcy5jdXJyZW50SW5kZXggPSBzYXZlZEN1cnJlbnRJbmRleDsKLQkJCQl0aGlzLnN0cmluZ0NhY2hlLnJlbW92ZShzdHJpbmdDaGFyQXJyYXkpOwotCQkJCXRoaXMuVVRGOENhY2hlLnJlbW92ZShzdHJpbmdDaGFyQXJyYXkpOwotCQkJCXJldHVybiAwOworCQkJCXRoaXMuY3VycmVudE9mZnNldCA9IHNhdmVkQ3VycmVudE9mZnNldCAtIDE7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckNvbnN0YW50KHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKIAkJCX0KLQkJCXBvb2xDb250ZW50W2xlbmd0aE9mZnNldCsrXSA9IChieXRlKSAobGVuZ3RoID4+IDgpOwotCQkJcG9vbENvbnRlbnRbbGVuZ3RoT2Zmc2V0XSA9IChieXRlKSBsZW5ndGg7Ci0JCQlzdHJpbmdJbmRleCA9IC1zdHJpbmdJbmRleDsKKwkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCXRoaXMuY3VycmVudEluZGV4Kys7CisJCQkvLyBOb3cgd2Uga25vdyB0aGUgbGVuZ3RoIHRoYXQgd2UgaGF2ZSB0byB3cml0ZSBpbiB0aGUgY29uc3RhbnQgcG9vbAorCQkJLy8gd2UgdXNlIHNhdmVkQ3VycmVudE9mZnNldCB0byBkbyB0aGF0CisJCQl0aGlzLnBvb2xDb250ZW50W3NhdmVkQ3VycmVudE9mZnNldF0gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbc2F2ZWRDdXJyZW50T2Zmc2V0ICsgMV0gPSAoYnl0ZSkgbGVuZ3RoOwogCQl9Ci0JCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKLQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7Ci0JCX0KLQkJcG9vbENvbnRlbnRbc3RyaW5nSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ0luZGV4ID4+IDgpOwotCQlwb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldF0gPSAoYnl0ZSkgc3RyaW5nSW5kZXg7CisJCXJldHVybiBpbmRleDsKIAl9Ci0JcmV0dXJuIGluZGV4OwotfQotLyoqCi0gKiBAcGFyYW0ga2V5MSB0aGUgZ2l2ZW4gbmFtZQotICogQHBhcmFtIGtleTIgdGhlIGdpdmVuIHNpZ25hdHVyZQotICogQHBhcmFtIHZhbHVlIHRoZSBnaXZlbiBpbmRleAotICogQHJldHVybiB0aGUgbmV3IGluZGV4Ci0gKi8KLXByaXZhdGUgaW50IHB1dEluTmFtZUFuZFR5cGVDYWNoZUlmQWJzZW50KGZpbmFsIGNoYXJbXSBrZXkxLCBmaW5hbCBjaGFyW10ga2V5MiwgaW50IHZhbHVlKSB7Ci0JaW50IGluZGV4IDsKLQlPYmplY3Qga2V5MVZhbHVlID0gdGhpcy5uYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzQW5kTWV0aG9kcy5nZXQoa2V5MSk7Ci0JaWYgKGtleTFWYWx1ZSA9PSBudWxsKSB7Ci0JCUNhY2hlZEluZGV4RW50cnkgY2FjaGVkSW5kZXhFbnRyeSA9IG5ldyBDYWNoZWRJbmRleEVudHJ5KGtleTIsIHZhbHVlKTsKLQkJaW5kZXggPSAtdmFsdWU7Ci0JCXRoaXMubmFtZUFuZFR5cGVDYWNoZUZvckZpZWxkc0FuZE1ldGhvZHMucHV0KGtleTEsIGNhY2hlZEluZGV4RW50cnkpOwotCX0gZWxzZSBpZiAoa2V5MVZhbHVlIGluc3RhbmNlb2YgQ2FjaGVkSW5kZXhFbnRyeSkgewotCQkvLyBhZGRpbmcgYSBzZWNvbmQgZW50cnkKLQkJQ2FjaGVkSW5kZXhFbnRyeSBlbnRyeSA9IChDYWNoZWRJbmRleEVudHJ5KSBrZXkxVmFsdWU7Ci0JCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhrZXkyLCBlbnRyeS5zaWduYXR1cmUpKSB7Ci0JCQlpbmRleCA9IGVudHJ5LmluZGV4OwotCQl9IGVsc2UgewotCQkJQ2hhckFycmF5Q2FjaGUgY2hhckFycmF5Q2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoKTsKLQkJCWNoYXJBcnJheUNhY2hlLnB1dElmQWJzZW50KGVudHJ5LnNpZ25hdHVyZSwgZW50cnkuaW5kZXgpOwotCQkJaW5kZXggPSBjaGFyQXJyYXlDYWNoZS5wdXRJZkFic2VudChrZXkyLCB2YWx1ZSk7Ci0JCQl0aGlzLm5hbWVBbmRUeXBlQ2FjaGVGb3JGaWVsZHNBbmRNZXRob2RzLnB1dChrZXkxLCBjaGFyQXJyYXlDYWNoZSk7CQkJCisJcHVibGljIGludCBsaXRlcmFsSW5kZXgoY2hhcltdIHN0cmluZ0NoYXJBcnJheSwgYnl0ZVtdIHV0ZjhlbmNvZGluZykgeworCQlpbnQgaW5kZXg7CisJCWlmICgoaW5kZXggPSB0aGlzLnN0cmluZ0NhY2hlLnB1dElmQWJzZW50KHN0cmluZ0NoYXJBcnJheSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCQl0aGlzLmN1cnJlbnRJbmRleCsrOworCQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQkvLyBXcml0ZSB0aGUgdGFnIGZpcnN0CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShTdHJpbmdUYWcpOworCQkJLy8gVGhlbiB0aGUgc3RyaW5nIGluZGV4CisJCQlpbnQgc3RyaW5nSW5kZXhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQlpZiAodGhpcy5jdXJyZW50T2Zmc2V0ICsgMiA+PSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aCkgeworCQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKKwkJCX0KKwkJCXRoaXMuY3VycmVudE9mZnNldCs9MjsKKworCQkJZmluYWwgaW50IHN0cmluZ0luZGV4ID0gbGl0ZXJhbEluZGV4KHV0ZjhlbmNvZGluZywgc3RyaW5nQ2hhckFycmF5KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbc3RyaW5nSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ0luZGV4ID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldF0gPSAoYnl0ZSkgc3RyaW5nSW5kZXg7CiAJCX0KLQl9IGVsc2UgewotCQlDaGFyQXJyYXlDYWNoZSBjaGFyQXJyYXlDYWNoZSA9IChDaGFyQXJyYXlDYWNoZSkga2V5MVZhbHVlOwotCQlpbmRleCA9IGNoYXJBcnJheUNhY2hlLnB1dElmQWJzZW50KGtleTIsIHZhbHVlKTsKKwkJcmV0dXJuIGluZGV4OwogCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0vKioKLSAqIEBwYXJhbSBrZXkxIHRoZSBnaXZlbiBkZWNsYXJpbmcgY2xhc3MgbmFtZQotICogQHBhcmFtIGtleTIgdGhlIGdpdmVuIGZpZWxkIG5hbWUgb3IgbWV0aG9kIHNlbGVjdG9yCi0gKiBAcGFyYW0ga2V5MyB0aGUgZ2l2ZW4gc2lnbmF0dXJlCi0gKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBpbmRleAotICogQHJldHVybiB0aGUgZ2l2ZW4gaW5kZXgKLSAqLwotcHJpdmF0ZSBpbnQgcHV0SW5DYWNoZUlmQWJzZW50KGZpbmFsIGNoYXJbXSBrZXkxLCBmaW5hbCBjaGFyW10ga2V5MiwgZmluYWwgY2hhcltdIGtleTMsIGludCB2YWx1ZSkgewotCWludCBpbmRleDsKLQlIYXNodGFibGVPZk9iamVjdCBrZXkxVmFsdWUgPSAoSGFzaHRhYmxlT2ZPYmplY3QpIHRoaXMubWV0aG9kc0FuZEZpZWxkc0NhY2hlLmdldChrZXkxKTsKLQlpZiAoa2V5MVZhbHVlID09IG51bGwpIHsKLQkJa2V5MVZhbHVlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KCk7Ci0JCXRoaXMubWV0aG9kc0FuZEZpZWxkc0NhY2hlLnB1dChrZXkxLCBrZXkxVmFsdWUpOwotCQlDYWNoZWRJbmRleEVudHJ5IGNhY2hlZEluZGV4RW50cnkgPSBuZXcgQ2FjaGVkSW5kZXhFbnRyeShrZXkzLCB2YWx1ZSk7Ci0JCWluZGV4ID0gLXZhbHVlOwotCQlrZXkxVmFsdWUucHV0KGtleTIsIGNhY2hlZEluZGV4RW50cnkpOwotCX0gZWxzZSB7Ci0JCU9iamVjdCBrZXkyVmFsdWUgPSBrZXkxVmFsdWUuZ2V0KGtleTIpOwotCQlpZiAoa2V5MlZhbHVlID09IG51bGwpIHsKLQkJCUNhY2hlZEluZGV4RW50cnkgY2FjaGVkSW5kZXhFbnRyeSA9IG5ldyBDYWNoZWRJbmRleEVudHJ5KGtleTMsIHZhbHVlKTsKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgZG91YmxlCisJICogdmFsdWUuIElmIHRoZSBkb3VibGUgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlCisJICogZG91YmxlIGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgorCSAqCisJICogQHBhcmFtIGtleSA8Q09ERT5kb3VibGU8L0NPREU+CisJICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisJICovCisJcHVibGljIGludCBsaXRlcmFsSW5kZXgoZG91YmxlIGtleSkgeworCQkvL1JldHJpZXZlIHRoZSBpbmRleCBmcm9tIHRoZSBjYWNoZQorCQkvLyBUaGUgZG91YmxlIGNvbnN0YW50IHRha2VzIHR3byBpbmRleGVzIGludG8gdGhlIGNvbnN0YW50IHBvb2wsIGJ1dCB3ZSBvbmx5IHN0b3JlCisJCS8vIHRoZSBmaXJzdCBpbmRleCBpbnRvIHRoZSBsb25nIHRhYmxlCisJCWludCBpbmRleDsKKwkJLy8gbGF6eSBpbml0aWFsaXphdGlvbiBmb3IgYmFzZSB0eXBlIGNhY2hlcworCQkvLyBJZiBpdCBpcyBudWxsLCBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdXNlIGl0CisJCWlmICh0aGlzLmRvdWJsZUNhY2hlID09IG51bGwpIHsKKwkJCXRoaXMuZG91YmxlQ2FjaGUgPSBuZXcgRG91YmxlQ2FjaGUoRE9VQkxFX0lOSVRJQUxfU0laRSk7CisJCX0KKwkJaWYgKChpbmRleCA9IHRoaXMuZG91YmxlQ2FjaGUucHV0SWZBYnNlbnQoa2V5LCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgeworCQkJaWYgKChpbmRleCA9IC1pbmRleCk+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCXRoaXMuY3VycmVudEluZGV4ICs9IDI7IC8vIGEgZG91YmxlIG5lZWRzIGFuIGV4dHJhIHBsYWNlIGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCS8vIFdyaXRlIHRoZSBkb3VibGUgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCWludCBsZW5ndGggPSB0aGlzLm9mZnNldHMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA8PSBpbmRleCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vZmZzZXRzLCAwLCAodGhpcy5vZmZzZXRzID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMub2Zmc2V0c1tpbmRleF0gPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQl3cml0ZVUxKERvdWJsZVRhZyk7CisJCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGRvdWJsZQorCQkJbG9uZyB0ZW1wID0gamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGtleSk7CisJCQlsZW5ndGggPSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aDsKKwkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyA4ID49IGxlbmd0aCkgeworCQkJCXJlc2l6ZVBvb2xDb250ZW50cyg4KTsKKwkJCX0KKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiA1Nik7CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gNDgpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDQwKTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiAzMik7CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gMjQpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDE2KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiA4KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIHRlbXA7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgZmxvYXQKKwkgKiB2YWx1ZS4gSWYgdGhlIGZsb2F0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW50byB0aGUgcG9vbCwgaXQgaXMgYWRkZWQuIFRoZQorCSAqIGludCBjYWNoZSBpcyB1cGRhdGVkIGFuZCBpdCByZXR1cm5zIHRoZSByaWdodCBpbmRleC4KKwkgKgorCSAqIEBwYXJhbSBrZXkgPENPREU+ZmxvYXQ8L0NPREU+CisJICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisJICovCisJcHVibGljIGludCBsaXRlcmFsSW5kZXgoZmxvYXQga2V5KSB7CisJCS8vUmV0cmlldmUgdGhlIGluZGV4IGZyb20gdGhlIGNhY2hlCisJCWludCBpbmRleDsKKwkJLy8gbGF6eSBpbml0aWFsaXphdGlvbiBmb3IgYmFzZSB0eXBlIGNhY2hlcworCQkvLyBJZiBpdCBpcyBudWxsLCBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdXNlIGl0CisJCWlmICh0aGlzLmZsb2F0Q2FjaGUgPT0gbnVsbCkgeworCQkJdGhpcy5mbG9hdENhY2hlID0gbmV3IEZsb2F0Q2FjaGUoRkxPQVRfSU5JVElBTF9TSVpFKTsKKwkJfQorCQlpZiAoKGluZGV4ID0gdGhpcy5mbG9hdENhY2hlLnB1dElmQWJzZW50KGtleSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJdGhpcy5jdXJyZW50SW5kZXgrKzsKKwkJCS8vIFdyaXRlIHRoZSBmbG9hdCBjb25zdGFudCBlbnRyeSBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJaW50IGxlbmd0aCA9IHRoaXMub2Zmc2V0cy5sZW5ndGg7CisJCQlpZiAobGVuZ3RoIDw9IGluZGV4KSB7CisJCQkJLy8gcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm9mZnNldHMsIDAsICh0aGlzLm9mZnNldHMgPSBuZXcgaW50W2luZGV4ICogMl0pLCAwLCBsZW5ndGgpOworCQkJfQorCQkJdGhpcy5vZmZzZXRzW2luZGV4XSA9IHRoaXMuY3VycmVudE9mZnNldDsKKwkJCXdyaXRlVTEoRmxvYXRUYWcpOworCQkJLy8gVGhlbiBhZGQgdGhlIDQgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBmbG9hdAorCQkJaW50IHRlbXAgPSBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5KTsKKwkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyA0ID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOworCQkJfQorCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKHRlbXAgPj4+IDI0KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiAxNik7CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodGVtcCA+Pj4gOCk7CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSB0ZW1wOworCQl9CisJCXJldHVybiBpbmRleDsKKwl9CisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludAorCSAqIHZhbHVlLiBJZiB0aGUgaW50IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW50byB0aGUgcG9vbCwgaXQgaXMgYWRkZWQuIFRoZQorCSAqIGludCBjYWNoZSBpcyB1cGRhdGVkIGFuZCBpdCByZXR1cm5zIHRoZSByaWdodCBpbmRleC4KKwkgKgorCSAqIEBwYXJhbSBrZXkgPENPREU+aW50PC9DT0RFPgorCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGludCBrZXkpIHsKKwkJLy9SZXRyaWV2ZSB0aGUgaW5kZXggZnJvbSB0aGUgY2FjaGUKKwkJaW50IGluZGV4OworCQkvLyBsYXp5IGluaXRpYWxpemF0aW9uIGZvciBiYXNlIHR5cGUgY2FjaGVzCisJCS8vIElmIGl0IGlzIG51bGwsIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB1c2UgaXQKKwkJaWYgKHRoaXMuaW50Q2FjaGUgPT0gbnVsbCkgeworCQkJdGhpcy5pbnRDYWNoZSA9IG5ldyBJbnRlZ2VyQ2FjaGUoSU5UX0lOSVRJQUxfU0laRSk7CisJCX0KKwkJaWYgKChpbmRleCA9IHRoaXMuaW50Q2FjaGUucHV0SWZBYnNlbnQoa2V5LCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgeworCQkJdGhpcy5jdXJyZW50SW5kZXgrKzsKKwkJCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJLy8gV3JpdGUgdGhlIGludGVnZXIgY29uc3RhbnQgZW50cnkgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCWludCBsZW5ndGggPSB0aGlzLm9mZnNldHMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA8PSBpbmRleCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vZmZzZXRzLCAwLCAodGhpcy5vZmZzZXRzID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMub2Zmc2V0c1tpbmRleF0gPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQl3cml0ZVUxKEludGVnZXJUYWcpOworCQkJLy8gVGhlbiBhZGQgdGhlIDQgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBpbnQKKwkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyA0ID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOworCQkJfQorCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gMjQpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gMTYpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKGtleSA+Pj4gOCk7CisJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSBrZXk7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgbG9uZworCSAqIHZhbHVlLiBJZiB0aGUgbG9uZyBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGludG8gdGhlIHBvb2wsIGl0IGlzIGFkZGVkLiBUaGUKKwkgKiBsb25nIGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgorCSAqCisJICogQHBhcmFtIGtleSA8Q09ERT5sb25nPC9DT0RFPgorCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGxvbmcga2V5KSB7CisJCS8vIFJldHJpZXZlIHRoZSBpbmRleCBmcm9tIHRoZSBjYWNoZQorCQkvLyBUaGUgbG9uZyBjb25zdGFudCB0YWtlcyB0d28gaW5kZXhlcyBpbnRvIHRoZSBjb25zdGFudCBwb29sLCBidXQgd2Ugb25seSBzdG9yZQorCQkvLyB0aGUgZmlyc3QgaW5kZXggaW50byB0aGUgbG9uZyB0YWJsZQorCQlpbnQgaW5kZXg7CisJCS8vIGxhenkgaW5pdGlhbGl6YXRpb24gZm9yIGJhc2UgdHlwZSBjYWNoZXMKKwkJLy8gSWYgaXQgaXMgbnVsbCwgaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHVzZSBpdAorCQlpZiAodGhpcy5sb25nQ2FjaGUgPT0gbnVsbCkgeworCQkJdGhpcy5sb25nQ2FjaGUgPSBuZXcgTG9uZ0NhY2hlKExPTkdfSU5JVElBTF9TSVpFKTsKKwkJfQorCQlpZiAoKGluZGV4ID0gdGhpcy5sb25nQ2FjaGUucHV0SWZBYnNlbnQoa2V5LCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgeworCQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQl0aGlzLmN1cnJlbnRJbmRleCs9IDI7IC8vIGxvbmcgdmFsdWUgbmVlZCBhbiBleHRyYSBwbGFjZSBpbnRvIHRod2UgY29uc3RhbnQgcG9vbAorCQkJLy8gV3JpdGUgdGhlIGxvbmcgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCWludCBsZW5ndGggPSB0aGlzLm9mZnNldHMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA8PSBpbmRleCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vZmZzZXRzLCAwLCAodGhpcy5vZmZzZXRzID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMub2Zmc2V0c1tpbmRleF0gPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQl3cml0ZVUxKExvbmdUYWcpOworCQkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCQlpZiAodGhpcy5jdXJyZW50T2Zmc2V0ICsgOCA+PSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aCkgeworCQkJCXJlc2l6ZVBvb2xDb250ZW50cyg4KTsKKwkJCX0KKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDU2KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDQ4KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDQwKTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDMyKTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDI0KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDE2KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbdGhpcy5jdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkga2V5OworCQl9CisJCXJldHVybiBpbmRleDsKKwl9CisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmdDb25zdGFudCBqYXZhLmxhbmcuU3RyaW5nCisJICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisJICovCisJcHVibGljIGludCBsaXRlcmFsSW5kZXgoU3RyaW5nIHN0cmluZ0NvbnN0YW50KSB7CisJCWludCBpbmRleDsKKwkJY2hhcltdIHN0cmluZ0NoYXJBcnJheSA9IHN0cmluZ0NvbnN0YW50LnRvQ2hhckFycmF5KCk7CisJCWlmICgoaW5kZXggPSB0aGlzLnN0cmluZ0NhY2hlLnB1dElmQWJzZW50KHN0cmluZ0NoYXJBcnJheSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCQl0aGlzLmN1cnJlbnRJbmRleCsrOworCQkJaWYgKChpbmRleCAgPSAtaW5kZXgpPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQkvLyBXcml0ZSB0aGUgdGFnIGZpcnN0CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShTdHJpbmdUYWcpOworCQkJLy8gVGhlbiB0aGUgc3RyaW5nIGluZGV4CisJCQlpbnQgc3RyaW5nSW5kZXhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQlpZiAodGhpcy5jdXJyZW50T2Zmc2V0ICsgMiA+PSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aCkgeworCQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKKwkJCX0KKwkJCXRoaXMuY3VycmVudE9mZnNldCs9MjsKKwkJCWZpbmFsIGludCBzdHJpbmdJbmRleCA9IGxpdGVyYWxJbmRleChzdHJpbmdDaGFyQXJyYXkpOworCQkJdGhpcy5wb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldCsrXSA9IChieXRlKSAoc3RyaW5nSW5kZXggPj4gOCk7CisJCQl0aGlzLnBvb2xDb250ZW50W3N0cmluZ0luZGV4T2Zmc2V0XSA9IChieXRlKSBzdHJpbmdJbmRleDsKKwkJfQorCQlyZXR1cm4gaW5kZXg7CisJfQorCXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yVHlwZShmaW5hbCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSkgeworCQlpbnQgaW5kZXg7CisJCWlmICgoaW5kZXggPSB0aGlzLmNsYXNzQ2FjaGUucHV0SWZBYnNlbnQoY29uc3RhbnRQb29sTmFtZSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCQl0aGlzLmN1cnJlbnRJbmRleCsrOworCQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShDbGFzc1RhZyk7CisKKwkJCS8vIFRoZW4gdGhlIG5hbWUgaW5kZXgKKwkJCWludCBuYW1lSW5kZXhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQlpZiAodGhpcy5jdXJyZW50T2Zmc2V0ICsgMiA+PSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aCkgeworCQkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKKwkJCX0KKwkJCXRoaXMuY3VycmVudE9mZnNldCs9MjsKKwkJCWZpbmFsIGludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoY29uc3RhbnRQb29sTmFtZSk7CisJCQl0aGlzLnBvb2xDb250ZW50W25hbWVJbmRleE9mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFtuYW1lSW5kZXhPZmZzZXRdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJfQorCQlyZXR1cm4gaW5kZXg7CisJfQorCS8qCisJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvcgorCSAqIGNvcnJlc3BvbmRpbmcgdG8gYSB0eXBlIGNvbnN0YW50IHBvb2wgbmFtZQorCSAqIGJpbmRpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXkgdHlwZS4KKwkgKi8KKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvclR5cGUoZmluYWwgVHlwZUJpbmRpbmcgYmluZGluZykgeworCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKTsKKwkJaWYgKCh0eXBlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUodGhpcy5jbGFzc0ZpbGUsIHR5cGVCaW5kaW5nKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5saXRlcmFsSW5kZXhGb3JUeXBlKGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKKwl9CisJcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JNZXRob2QoY2hhcltdIGRlY2xhcmluZ0NsYXNzLCBjaGFyW10gc2VsZWN0b3IsIGNoYXJbXSBzaWduYXR1cmUsIGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKwkJaW50IGluZGV4OworCQlpZiAoKGluZGV4ID0gcHV0SW5DYWNoZUlmQWJzZW50KGRlY2xhcmluZ0NsYXNzLCBzZWxlY3Rvciwgc2lnbmF0dXJlLCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgeworCQkJLy8gaXQgZG9lc24ndCBleGlzdCB5ZXQKKwkJCXRoaXMuY3VycmVudEluZGV4Kys7CisJCQlpZiAoKGluZGV4ID0gLWluZGV4KSA+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCS8vIFdyaXRlIHRoZSBpbnRlcmZhY2UgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJaW50IGxlbmd0aCA9IHRoaXMub2Zmc2V0cy5sZW5ndGg7CisJCQlpZiAobGVuZ3RoIDw9IGluZGV4KSB7CisJCQkJLy8gcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm9mZnNldHMsIDAsICh0aGlzLm9mZnNldHMgPSBuZXcgaW50W2luZGV4ICogMl0pLCAwLCBsZW5ndGgpOworCQkJfQorCQkJdGhpcy5vZmZzZXRzW2luZGV4XSA9IHRoaXMuY3VycmVudE9mZnNldDsKKwkJCXdyaXRlVTEoaXNJbnRlcmZhY2UgPyBJbnRlcmZhY2VNZXRob2RSZWZUYWcgOiBNZXRob2RSZWZUYWcpOworCisJCQlpbnQgY2xhc3NJbmRleE9mZnNldCA9IHRoaXMuY3VycmVudE9mZnNldDsKKwkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyA0ID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOworCQkJfQorCQkJdGhpcy5jdXJyZW50T2Zmc2V0Kz00OworCisJCQlmaW5hbCBpbnQgY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvclR5cGUoZGVjbGFyaW5nQ2xhc3MpOworCQkJZmluYWwgaW50IG5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JOYW1lQW5kVHlwZShzZWxlY3Rvciwgc2lnbmF0dXJlKTsKKworCQkJdGhpcy5wb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc0luZGV4ID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFtjbGFzc0luZGV4T2Zmc2V0KytdID0gKGJ5dGUpIGNsYXNzSW5kZXg7CisJCQl0aGlzLnBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVBbmRUeXBlSW5kZXggPj4gOCk7CisJCQl0aGlzLnBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXRdID0gKGJ5dGUpIG5hbWVBbmRUeXBlSW5kZXg7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvck1ldGhvZChUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcywgY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gc2lnbmF0dXJlLCBib29sZWFuIGlzSW50ZXJmYWNlKSB7CisJCWlmICgoZGVjbGFyaW5nQ2xhc3MudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKHRoaXMuY2xhc3NGaWxlLCBkZWNsYXJpbmdDbGFzcyk7CisJCX0KKwkJcmV0dXJuIHRoaXMubGl0ZXJhbEluZGV4Rm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSwgc2VsZWN0b3IsIHNpZ25hdHVyZSwgaXNJbnRlcmZhY2UpOworCX0KKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvck5hbWVBbmRUeXBlKGNoYXJbXSBuYW1lLCBjaGFyW10gc2lnbmF0dXJlKSB7CisJCWludCBpbmRleDsKKwkJaWYgKChpbmRleCA9IHB1dEluTmFtZUFuZFR5cGVDYWNoZUlmQWJzZW50KG5hbWUsIHNpZ25hdHVyZSwgdGhpcy5jdXJyZW50SW5kZXgpKSA8IDApIHsKKwkJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCQl0aGlzLmN1cnJlbnRJbmRleCsrOworCQkJaWYgKChpbmRleCA9IC1pbmRleCkgPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQlpbnQgbmFtZUluZGV4T2Zmc2V0ID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDQgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCQlyZXNpemVQb29sQ29udGVudHMoNCk7CisJCQl9CisJCQl0aGlzLmN1cnJlbnRPZmZzZXQrPTQ7CisKKwkJCWZpbmFsIGludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgobmFtZSk7CisJCQlmaW5hbCBpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KHNpZ25hdHVyZSk7CisJCQl0aGlzLnBvb2xDb250ZW50W25hbWVJbmRleE9mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFtuYW1lSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQkJdGhpcy5wb29sQ29udGVudFtuYW1lSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKHR5cGVJbmRleCA+PiA4KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbbmFtZUluZGV4T2Zmc2V0XSA9IChieXRlKSB0eXBlSW5kZXg7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwlwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckZpZWxkKGNoYXJbXSBkZWNsYXJpbmdDbGFzcywgY2hhcltdIG5hbWUsIGNoYXJbXSBzaWduYXR1cmUpIHsKKwkJaW50IGluZGV4OworCQlpZiAoKGluZGV4ID0gcHV0SW5DYWNoZUlmQWJzZW50KGRlY2xhcmluZ0NsYXNzLCBuYW1lLCBzaWduYXR1cmUsIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7CisJCQl0aGlzLmN1cnJlbnRJbmRleCsrOworCQkJLy8gZG9lc24ndCBleGlzdCB5ZXQKKwkJCWlmICgoaW5kZXggPSAtaW5kZXgpID4gMHhGRkZGKXsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJLy8gV3JpdGUgdGhlIGludGVyZmFjZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQlpbnQgbGVuZ3RoID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPD0gaW5kZXgpIHsKKwkJCQkvLyByZXNpemUKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub2Zmc2V0cywgMCwgKHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm9mZnNldHNbaW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJd3JpdGVVMShGaWVsZFJlZlRhZyk7CisJCQlpbnQgY2xhc3NJbmRleE9mZnNldCA9IHRoaXMuY3VycmVudE9mZnNldDsKKwkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyA0ID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJcmVzaXplUG9vbENvbnRlbnRzKDQpOworCQkJfQorCQkJdGhpcy5jdXJyZW50T2Zmc2V0Kz00OworCisJCQlmaW5hbCBpbnQgY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvclR5cGUoZGVjbGFyaW5nQ2xhc3MpOworCQkJZmluYWwgaW50IG5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JOYW1lQW5kVHlwZShuYW1lLCBzaWduYXR1cmUpOworCisJCQl0aGlzLnBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKGNsYXNzSW5kZXggPj4gOCk7CisJCQl0aGlzLnBvb2xDb250ZW50W2NsYXNzSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgY2xhc3NJbmRleDsKKwkJCXRoaXMucG9vbENvbnRlbnRbY2xhc3NJbmRleE9mZnNldCsrXSA9IChieXRlKSAobmFtZUFuZFR5cGVJbmRleCA+PiA4KTsKKwkJCXRoaXMucG9vbENvbnRlbnRbY2xhc3NJbmRleE9mZnNldF0gPSAoYnl0ZSkgbmFtZUFuZFR5cGVJbmRleDsKKwkJfQorCQlyZXR1cm4gaW5kZXg7CisJfQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisJICoKKwkgKiBAcGFyYW0gc3RyaW5nQ2hhckFycmF5IGNoYXJbXQorCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yTGRjKGNoYXJbXSBzdHJpbmdDaGFyQXJyYXkpIHsKKwkJaW50IHNhdmVkQ3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXg7CisJCWludCBzYXZlZEN1cnJlbnRPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCWludCBpbmRleDsKKwkJaWYgKChpbmRleCA9IHRoaXMuc3RyaW5nQ2FjaGUucHV0SWZBYnNlbnQoc3RyaW5nQ2hhckFycmF5LCB0aGlzLmN1cnJlbnRJbmRleCkpIDwgMCkgeworCQkJaWYgKChpbmRleCA9IC1pbmRleCk+IDB4RkZGRikgeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQkJdGhpcy5jdXJyZW50SW5kZXgrKzsKKwkJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJCWludCBsZW5ndGggPSB0aGlzLm9mZnNldHMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA8PSBpbmRleCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vZmZzZXRzLCAwLCAodGhpcy5vZmZzZXRzID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMub2Zmc2V0c1tpbmRleF0gPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQl3cml0ZVUxKFN0cmluZ1RhZyk7CisKKwkJCS8vIFRoZW4gdGhlIHN0cmluZyBpbmRleAorCQkJaW50IHN0cmluZ0luZGV4T2Zmc2V0ID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDIgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCQlyZXNpemVQb29sQ29udGVudHMoMik7CisJCQl9CisJCQl0aGlzLmN1cnJlbnRPZmZzZXQrPTI7CisKKwkJCWludCBzdHJpbmdJbmRleDsKKwkJCWlmICgoc3RyaW5nSW5kZXggPSB0aGlzLlVURjhDYWNoZS5wdXRJZkFic2VudChzdHJpbmdDaGFyQXJyYXksIHRoaXMuY3VycmVudEluZGV4KSkgPCAwKSB7CisJCQkJaWYgKChzdHJpbmdJbmRleCA9IC1zdHJpbmdJbmRleCk+IDB4RkZGRikgeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQkJCXRoaXMuY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIHRhZyBmaXJzdAorCQkJCWxlbmd0aCA9IHRoaXMub2Zmc2V0cy5sZW5ndGg7CisJCQkJaWYgKGxlbmd0aCA8PSBzdHJpbmdJbmRleCkgeworCQkJCQkvLyByZXNpemUKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm9mZnNldHMsIDAsICh0aGlzLm9mZnNldHMgPSBuZXcgaW50W3N0cmluZ0luZGV4ICogMl0pLCAwLCBsZW5ndGgpOworCQkJCX0KKwkJCQl0aGlzLm9mZnNldHNbc3RyaW5nSW5kZXhdID0gdGhpcy5jdXJyZW50T2Zmc2V0OworCQkJCXdyaXRlVTEoVXRmOFRhZyk7CisJCQkJLy8gVGhlbiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nTmFtZSBhcnJheQorCQkJCWludCBsZW5ndGhPZmZzZXQgPSB0aGlzLmN1cnJlbnRPZmZzZXQ7CisJCQkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDIgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCQkJLy8gd2UgbmVlZCB0byByZXNpemUgdGhlIHBvb2xDb250ZW50IGFycmF5IGJlY2F1c2Ugd2Ugd29uJ3QgaGF2ZQorCQkJCQkvLyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGxlbmd0aAorCQkJCQlyZXNpemVQb29sQ29udGVudHMoMik7CisJCQkJfQorCQkJCXRoaXMuY3VycmVudE9mZnNldCArPSAyOworCQkJCWxlbmd0aCA9IDA7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdDaGFyQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQkJY2hhciBjdXJyZW50ID0gc3RyaW5nQ2hhckFycmF5W2ldOworCQkJCQlpZiAoKGN1cnJlbnQgPj0gMHgwMDAxKSAmJiAoY3VycmVudCA8PSAweDAwN0YpKSB7CisJCQkJCQkvLyB3ZSBvbmx5IG5lZWQgb25lIGJ5dGU6IEFTQ0lJIHRhYmxlCisJCQkJCQlsZW5ndGgrKzsKKwkJCQkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyAxID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJCQkJLy8gd2UgbmVlZCB0byByZXNpemUgdGhlIHBvb2xDb250ZW50IGFycmF5IGJlY2F1c2Ugd2Ugd29uJ3QgaGF2ZQorCQkJCQkJCS8vIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgbGVuZ3RoCisJCQkJCQkJcmVzaXplUG9vbENvbnRlbnRzKDEpOworCQkJCQkJfQorCQkJCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkoY3VycmVudCk7CisJCQkJCX0gZWxzZQorCQkJCQkJaWYgKGN1cnJlbnQgPiAweDA3RkYpIHsKKwkJCQkJCQkvLyB3ZSBuZWVkIDMgYnl0ZXMKKwkJCQkJCQlsZW5ndGggKz0gMzsKKwkJCQkJCQlpZiAodGhpcy5jdXJyZW50T2Zmc2V0ICsgMyA+PSB0aGlzLnBvb2xDb250ZW50Lmxlbmd0aCkgeworCQkJCQkJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCisJCQkJCQkJCS8vIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgbGVuZ3RoCisJCQkJCQkJCXJlc2l6ZVBvb2xDb250ZW50cygzKTsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKDB4RTAgfCAoKGN1cnJlbnQgPj4gMTIpICYgMHgwRikpOyAvLyAweEUwID0gMTExMCAwMDAwCisJCQkJCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKDB4ODAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDNGKSk7IC8vIDB4ODAgPSAxMDAwIDAwMDAKKwkJCQkJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRPZmZzZXQgKyAyID49IHRoaXMucG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBwb29sQ29udGVudCBhcnJheSBiZWNhdXNlIHdlIHdvbid0IGhhdmUKKwkJCQkJCQkJLy8gZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBsZW5ndGgKKwkJCQkJCQkJcmVzaXplUG9vbENvbnRlbnRzKDIpOworCQkJCQkJCX0KKwkJCQkJCQkvLyB3ZSBjYW4gYmUgMCBvciBiZXR3ZWVuIDB4MDA4MCBhbmQgMHgwN0ZGCisJCQkJCQkJLy8gSW4gdGhhdCBjYXNlIHdlIG9ubHkgbmVlZCAyIGJ5dGVzCisJCQkJCQkJbGVuZ3RoICs9IDI7CisJCQkJCQkJdGhpcy5wb29sQ29udGVudFt0aGlzLmN1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKDB4QzAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDFGKSk7IC8vIDB4QzAgPSAxMTAwIDAwMDAKKwkJCQkJCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCQl9CisJCQkJfQorCQkJCWlmIChsZW5ndGggPj0gNjU1MzUpIHsKKwkJCQkJdGhpcy5jdXJyZW50T2Zmc2V0ID0gc2F2ZWRDdXJyZW50T2Zmc2V0OworCQkJCQl0aGlzLmN1cnJlbnRJbmRleCA9IHNhdmVkQ3VycmVudEluZGV4OworCQkJCQl0aGlzLnN0cmluZ0NhY2hlLnJlbW92ZShzdHJpbmdDaGFyQXJyYXkpOworCQkJCQl0aGlzLlVURjhDYWNoZS5yZW1vdmUoc3RyaW5nQ2hhckFycmF5KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCXRoaXMucG9vbENvbnRlbnRbbGVuZ3RoT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7CisJCQkJdGhpcy5wb29sQ29udGVudFtsZW5ndGhPZmZzZXRdID0gKGJ5dGUpIGxlbmd0aDsKKwkJCX0KKwkJCXRoaXMucG9vbENvbnRlbnRbc3RyaW5nSW5kZXhPZmZzZXQrK10gPSAoYnl0ZSkgKHN0cmluZ0luZGV4ID4+IDgpOworCQkJdGhpcy5wb29sQ29udGVudFtzdHJpbmdJbmRleE9mZnNldF0gPSAoYnl0ZSkgc3RyaW5nSW5kZXg7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwkvKioKKwkgKiBAcGFyYW0ga2V5MSB0aGUgZ2l2ZW4gbmFtZQorCSAqIEBwYXJhbSBrZXkyIHRoZSBnaXZlbiBzaWduYXR1cmUKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGdpdmVuIGluZGV4CisJICogQHJldHVybiB0aGUgbmV3IGluZGV4CisJICovCisJcHJpdmF0ZSBpbnQgcHV0SW5OYW1lQW5kVHlwZUNhY2hlSWZBYnNlbnQoZmluYWwgY2hhcltdIGtleTEsIGZpbmFsIGNoYXJbXSBrZXkyLCBpbnQgdmFsdWUpIHsKKwkJaW50IGluZGV4IDsKKwkJT2JqZWN0IGtleTFWYWx1ZSA9IHRoaXMubmFtZUFuZFR5cGVDYWNoZUZvckZpZWxkc0FuZE1ldGhvZHMuZ2V0KGtleTEpOworCQlpZiAoa2V5MVZhbHVlID09IG51bGwpIHsKKwkJCUNhY2hlZEluZGV4RW50cnkgY2FjaGVkSW5kZXhFbnRyeSA9IG5ldyBDYWNoZWRJbmRleEVudHJ5KGtleTIsIHZhbHVlKTsKIAkJCWluZGV4ID0gLXZhbHVlOwotCQkJa2V5MVZhbHVlLnB1dChrZXkyLCBjYWNoZWRJbmRleEVudHJ5KTsKLQkJfSBlbHNlIGlmIChrZXkyVmFsdWUgaW5zdGFuY2VvZiBDYWNoZWRJbmRleEVudHJ5KSB7CisJCQl0aGlzLm5hbWVBbmRUeXBlQ2FjaGVGb3JGaWVsZHNBbmRNZXRob2RzLnB1dChrZXkxLCBjYWNoZWRJbmRleEVudHJ5KTsKKwkJfSBlbHNlIGlmIChrZXkxVmFsdWUgaW5zdGFuY2VvZiBDYWNoZWRJbmRleEVudHJ5KSB7CiAJCQkvLyBhZGRpbmcgYSBzZWNvbmQgZW50cnkKLQkJCUNhY2hlZEluZGV4RW50cnkgZW50cnkgPSAoQ2FjaGVkSW5kZXhFbnRyeSkga2V5MlZhbHVlOwotCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGtleTMsIGVudHJ5LnNpZ25hdHVyZSkpIHsKKwkJCUNhY2hlZEluZGV4RW50cnkgZW50cnkgPSAoQ2FjaGVkSW5kZXhFbnRyeSkga2V5MVZhbHVlOworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGtleTIsIGVudHJ5LnNpZ25hdHVyZSkpIHsKIAkJCQlpbmRleCA9IGVudHJ5LmluZGV4OwogCQkJfSBlbHNlIHsKIAkJCQlDaGFyQXJyYXlDYWNoZSBjaGFyQXJyYXlDYWNoZSA9IG5ldyBDaGFyQXJyYXlDYWNoZSgpOwogCQkJCWNoYXJBcnJheUNhY2hlLnB1dElmQWJzZW50KGVudHJ5LnNpZ25hdHVyZSwgZW50cnkuaW5kZXgpOwotCQkJCWluZGV4ID0gY2hhckFycmF5Q2FjaGUucHV0SWZBYnNlbnQoa2V5MywgdmFsdWUpOwkJCQkKLQkJCQlrZXkxVmFsdWUucHV0KGtleTIsIGNoYXJBcnJheUNhY2hlKTsKKwkJCQlpbmRleCA9IGNoYXJBcnJheUNhY2hlLnB1dElmQWJzZW50KGtleTIsIHZhbHVlKTsKKwkJCQl0aGlzLm5hbWVBbmRUeXBlQ2FjaGVGb3JGaWVsZHNBbmRNZXRob2RzLnB1dChrZXkxLCBjaGFyQXJyYXlDYWNoZSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlDaGFyQXJyYXlDYWNoZSBjaGFyQXJyYXlDYWNoZSA9IChDaGFyQXJyYXlDYWNoZSkga2V5MlZhbHVlOwotCQkJaW5kZXggPSBjaGFyQXJyYXlDYWNoZS5wdXRJZkFic2VudChrZXkzLCB2YWx1ZSk7CQkJCisJCQlDaGFyQXJyYXlDYWNoZSBjaGFyQXJyYXlDYWNoZSA9IChDaGFyQXJyYXlDYWNoZSkga2V5MVZhbHVlOworCQkJaW5kZXggPSBjaGFyQXJyYXlDYWNoZS5wdXRJZkFic2VudChrZXkyLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwkvKioKKwkgKiBAcGFyYW0ga2V5MSB0aGUgZ2l2ZW4gZGVjbGFyaW5nIGNsYXNzIG5hbWUKKwkgKiBAcGFyYW0ga2V5MiB0aGUgZ2l2ZW4gZmllbGQgbmFtZSBvciBtZXRob2Qgc2VsZWN0b3IKKwkgKiBAcGFyYW0ga2V5MyB0aGUgZ2l2ZW4gc2lnbmF0dXJlCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBnaXZlbiBpbmRleAorCSAqLworCXByaXZhdGUgaW50IHB1dEluQ2FjaGVJZkFic2VudChmaW5hbCBjaGFyW10ga2V5MSwgZmluYWwgY2hhcltdIGtleTIsIGZpbmFsIGNoYXJbXSBrZXkzLCBpbnQgdmFsdWUpIHsKKwkJaW50IGluZGV4OworCQlIYXNodGFibGVPZk9iamVjdCBrZXkxVmFsdWUgPSAoSGFzaHRhYmxlT2ZPYmplY3QpIHRoaXMubWV0aG9kc0FuZEZpZWxkc0NhY2hlLmdldChrZXkxKTsKKwkJaWYgKGtleTFWYWx1ZSA9PSBudWxsKSB7CisJCQlrZXkxVmFsdWUgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoKTsKKwkJCXRoaXMubWV0aG9kc0FuZEZpZWxkc0NhY2hlLnB1dChrZXkxLCBrZXkxVmFsdWUpOworCQkJQ2FjaGVkSW5kZXhFbnRyeSBjYWNoZWRJbmRleEVudHJ5ID0gbmV3IENhY2hlZEluZGV4RW50cnkoa2V5MywgdmFsdWUpOworCQkJaW5kZXggPSAtdmFsdWU7CisJCQlrZXkxVmFsdWUucHV0KGtleTIsIGNhY2hlZEluZGV4RW50cnkpOworCQl9IGVsc2UgeworCQkJT2JqZWN0IGtleTJWYWx1ZSA9IGtleTFWYWx1ZS5nZXQoa2V5Mik7CisJCQlpZiAoa2V5MlZhbHVlID09IG51bGwpIHsKKwkJCQlDYWNoZWRJbmRleEVudHJ5IGNhY2hlZEluZGV4RW50cnkgPSBuZXcgQ2FjaGVkSW5kZXhFbnRyeShrZXkzLCB2YWx1ZSk7CisJCQkJaW5kZXggPSAtdmFsdWU7CisJCQkJa2V5MVZhbHVlLnB1dChrZXkyLCBjYWNoZWRJbmRleEVudHJ5KTsKKwkJCX0gZWxzZSBpZiAoa2V5MlZhbHVlIGluc3RhbmNlb2YgQ2FjaGVkSW5kZXhFbnRyeSkgeworCQkJCS8vIGFkZGluZyBhIHNlY29uZCBlbnRyeQorCQkJCUNhY2hlZEluZGV4RW50cnkgZW50cnkgPSAoQ2FjaGVkSW5kZXhFbnRyeSkga2V5MlZhbHVlOworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhrZXkzLCBlbnRyeS5zaWduYXR1cmUpKSB7CisJCQkJCWluZGV4ID0gZW50cnkuaW5kZXg7CisJCQkJfSBlbHNlIHsKKwkJCQkJQ2hhckFycmF5Q2FjaGUgY2hhckFycmF5Q2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoKTsKKwkJCQkJY2hhckFycmF5Q2FjaGUucHV0SWZBYnNlbnQoZW50cnkuc2lnbmF0dXJlLCBlbnRyeS5pbmRleCk7CisJCQkJCWluZGV4ID0gY2hhckFycmF5Q2FjaGUucHV0SWZBYnNlbnQoa2V5MywgdmFsdWUpOworCQkJCQlrZXkxVmFsdWUucHV0KGtleTIsIGNoYXJBcnJheUNhY2hlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUNoYXJBcnJheUNhY2hlIGNoYXJBcnJheUNhY2hlID0gKENoYXJBcnJheUNhY2hlKSBrZXkyVmFsdWU7CisJCQkJaW5kZXggPSBjaGFyQXJyYXlDYWNoZS5wdXRJZkFic2VudChrZXkzLCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNsZWFuIHRoZSByZWNlaXZlciBpbiBjYXNlIG9mIGEgY2xpbml0IGhlYWRlciBpcyBnZW5lcmF0ZWQsIGJ1dCB0aGUKKwkgKiBjbGluaXQgaGFzIG5vIGNvZGUuCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGNsaW5pdCBpcyB0aGUgZmlyc3QgbWV0aG9kIHRvIGJlIGdlbmVyYXRlZC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uI2FkZENsaW5pdCgpCisJICovCisJcHVibGljIHZvaWQgcmVzZXRGb3JDbGluaXQoaW50IGNvbnN0YW50UG9vbEluZGV4LCBpbnQgY29uc3RhbnRQb29sT2Zmc2V0KSB7CisJCXRoaXMuY3VycmVudEluZGV4ID0gY29uc3RhbnRQb29sSW5kZXg7CisJCXRoaXMuY3VycmVudE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldDsKKwkJaWYgKHRoaXMuVVRGOENhY2hlLmdldChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db2RlTmFtZSkgPj0gY29uc3RhbnRQb29sSW5kZXgpIHsKKwkJCXRoaXMuVVRGOENhY2hlLnJlbW92ZShBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db2RlTmFtZSk7CisJCX0KKwkJaWYgKHRoaXMuVVRGOENhY2hlLmdldChDb25zdGFudFBvb2wuQ2xpbml0U2lnbmF0dXJlKSA+PSBjb25zdGFudFBvb2xJbmRleCkgeworCQkJdGhpcy5VVEY4Q2FjaGUucmVtb3ZlKENvbnN0YW50UG9vbC5DbGluaXRTaWduYXR1cmUpOworCQl9CisJCWlmICh0aGlzLlVURjhDYWNoZS5nZXQoQ29uc3RhbnRQb29sLkNsaW5pdCkgPj0gY29uc3RhbnRQb29sSW5kZXgpIHsKKwkJCXRoaXMuVVRGOENhY2hlLnJlbW92ZShDb25zdGFudFBvb2wuQ2xpbml0KTsKIAkJfQogCX0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2xlYW4gdGhlIHJlY2VpdmVyIGluIGNhc2Ugb2YgYSBjbGluaXQgaGVhZGVyIGlzIGdlbmVyYXRlZCwgYnV0IHRoZSAKLSAqIGNsaW5pdCBoYXMgbm8gY29kZS4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBjbGluaXQgaXMgdGhlIGZpcnN0IG1ldGhvZCB0byBiZSBnZW5lcmF0ZWQuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uI2FkZENsaW5pdCgpCi0gKi8KLXB1YmxpYyB2b2lkIHJlc2V0Rm9yQ2xpbml0KGludCBjb25zdGFudFBvb2xJbmRleCwgaW50IGNvbnN0YW50UG9vbE9mZnNldCkgewotCWN1cnJlbnRJbmRleCA9IGNvbnN0YW50UG9vbEluZGV4OwotCWN1cnJlbnRPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXQ7Ci0JaWYgKFVURjhDYWNoZS5nZXQoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpID49IGNvbnN0YW50UG9vbEluZGV4KSB7Ci0JCVVURjhDYWNoZS5yZW1vdmUoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpOwotCX0KLQlpZiAoVVRGOENhY2hlLmdldChDb25zdGFudFBvb2wuQ2xpbml0U2lnbmF0dXJlKSA+PSBjb25zdGFudFBvb2xJbmRleCkgewotCQlVVEY4Q2FjaGUucmVtb3ZlKENvbnN0YW50UG9vbC5DbGluaXRTaWduYXR1cmUpOwotCX0KLQlpZiAoVVRGOENhY2hlLmdldChDb25zdGFudFBvb2wuQ2xpbml0KSA+PSBjb25zdGFudFBvb2xJbmRleCkgewotCQlVVEY4Q2FjaGUucmVtb3ZlKENvbnN0YW50UG9vbC5DbGluaXQpOwotCX0KLX0KIAotLyoqCi0gKiBSZXNpemUgdGhlIHBvb2wgY29udGVudHMKLSAqLwotcHJpdmF0ZSBmaW5hbCB2b2lkIHJlc2l6ZVBvb2xDb250ZW50cyhpbnQgbWluaW1hbFNpemUpIHsKLQlpbnQgbGVuZ3RoID0gcG9vbENvbnRlbnQubGVuZ3RoOwotCWludCB0b0FkZCA9IGxlbmd0aDsKLQlpZiAodG9BZGQgPCBtaW5pbWFsU2l6ZSkKLQkJdG9BZGQgPSBtaW5pbWFsU2l6ZTsKLQlTeXN0ZW0uYXJyYXljb3B5KHBvb2xDb250ZW50LCAwLCBwb29sQ29udGVudCA9IG5ldyBieXRlW2xlbmd0aCArIHRvQWRkXSwgMCwgbGVuZ3RoKTsKLX0KLS8qKgotICogV3JpdGUgYSB1bnNpZ25lZCBieXRlIGludG8gdGhlIGJ5dGUgYXJyYXkKLSAqIAotICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gVGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGJ5dGUgYXJyYXkKLSAqLwotcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVVMShpbnQgdmFsdWUpIHsKLQlpZiAoY3VycmVudE9mZnNldCArIDEgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7Ci0JCXJlc2l6ZVBvb2xDb250ZW50cygxKTsKKwkvKioKKwkgKiBSZXNpemUgdGhlIHBvb2wgY29udGVudHMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIHZvaWQgcmVzaXplUG9vbENvbnRlbnRzKGludCBtaW5pbWFsU2l6ZSkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5wb29sQ29udGVudC5sZW5ndGg7CisJCWludCB0b0FkZCA9IGxlbmd0aDsKKwkJaWYgKHRvQWRkIDwgbWluaW1hbFNpemUpCisJCQl0b0FkZCA9IG1pbmltYWxTaXplOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucG9vbENvbnRlbnQsIDAsIHRoaXMucG9vbENvbnRlbnQgPSBuZXcgYnl0ZVtsZW5ndGggKyB0b0FkZF0sIDAsIGxlbmd0aCk7CiAJfQotCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci19Ci0vKioKLSAqIFdyaXRlIGEgdW5zaWduZWQgYnl0ZSBpbnRvIHRoZSBieXRlIGFycmF5Ci0gKiAKLSAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IFRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBieXRlIGFycmF5Ci0gKi8KLXByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlVTIoaW50IHZhbHVlKSB7Ci0JaWYgKGN1cnJlbnRPZmZzZXQgKyAyID49IHBvb2xDb250ZW50Lmxlbmd0aCkgewotCQlyZXNpemVQb29sQ29udGVudHMoMik7CisJLyoqCisJICogV3JpdGUgYSB1bnNpZ25lZCBieXRlIGludG8gdGhlIGJ5dGUgYXJyYXkKKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IFRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBieXRlIGFycmF5CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVVMShpbnQgdmFsdWUpIHsKKwkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDEgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCXJlc2l6ZVBvb2xDb250ZW50cygxKTsKKwkJfQorCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKIAl9Ci0JcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDgpOwotCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7Ci19Ci1wdWJsaWMgdm9pZCByZXNldCgpIHsKLQlpZiAodGhpcy5kb3VibGVDYWNoZSAhPSBudWxsKSB0aGlzLmRvdWJsZUNhY2hlLmNsZWFyKCk7Ci0JaWYgKHRoaXMuZmxvYXRDYWNoZSAhPSBudWxsKSB0aGlzLmZsb2F0Q2FjaGUuY2xlYXIoKTsKLQlpZiAodGhpcy5pbnRDYWNoZSAhPSBudWxsKSB0aGlzLmludENhY2hlLmNsZWFyKCk7Ci0JaWYgKHRoaXMubG9uZ0NhY2hlICE9IG51bGwpIHRoaXMubG9uZ0NhY2hlLmNsZWFyKCk7Ci0JdGhpcy5VVEY4Q2FjaGUuY2xlYXIoKTsKLQl0aGlzLnN0cmluZ0NhY2hlLmNsZWFyKCk7Ci0JdGhpcy5tZXRob2RzQW5kRmllbGRzQ2FjaGUuY2xlYXIoKTsKLQl0aGlzLmNsYXNzQ2FjaGUuY2xlYXIoKTsKLQl0aGlzLm5hbWVBbmRUeXBlQ2FjaGVGb3JGaWVsZHNBbmRNZXRob2RzLmNsZWFyKCk7Ci0JdGhpcy5jdXJyZW50SW5kZXggPSAxOwotCXRoaXMuY3VycmVudE9mZnNldCA9IDA7Ci19CisJLyoqCisJICogV3JpdGUgYSB1bnNpZ25lZCBieXRlIGludG8gdGhlIGJ5dGUgYXJyYXkKKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IFRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBieXRlIGFycmF5CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVVMihpbnQgdmFsdWUpIHsKKwkJaWYgKHRoaXMuY3VycmVudE9mZnNldCArIDIgPj0gdGhpcy5wb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCXJlc2l6ZVBvb2xDb250ZW50cygyKTsKKwkJfQorCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4+IDgpOworCQl0aGlzLnBvb2xDb250ZW50W3RoaXMuY3VycmVudE9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKKwl9CisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWlmICh0aGlzLmRvdWJsZUNhY2hlICE9IG51bGwpIHRoaXMuZG91YmxlQ2FjaGUuY2xlYXIoKTsKKwkJaWYgKHRoaXMuZmxvYXRDYWNoZSAhPSBudWxsKSB0aGlzLmZsb2F0Q2FjaGUuY2xlYXIoKTsKKwkJaWYgKHRoaXMuaW50Q2FjaGUgIT0gbnVsbCkgdGhpcy5pbnRDYWNoZS5jbGVhcigpOworCQlpZiAodGhpcy5sb25nQ2FjaGUgIT0gbnVsbCkgdGhpcy5sb25nQ2FjaGUuY2xlYXIoKTsKKwkJdGhpcy5VVEY4Q2FjaGUuY2xlYXIoKTsKKwkJdGhpcy5zdHJpbmdDYWNoZS5jbGVhcigpOworCQl0aGlzLm1ldGhvZHNBbmRGaWVsZHNDYWNoZS5jbGVhcigpOworCQl0aGlzLmNsYXNzQ2FjaGUuY2xlYXIoKTsKKwkJdGhpcy5uYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzQW5kTWV0aG9kcy5jbGVhcigpOworCQl0aGlzLmN1cnJlbnRJbmRleCA9IDE7CisJCXRoaXMuY3VycmVudE9mZnNldCA9IDA7CisJfQorCXB1YmxpYyB2b2lkIHJlc2V0Rm9yQXR0cmlidXRlTmFtZShjaGFyW10gYXR0cmlidXRlTmFtZSwgaW50IGNvbnN0YW50UG9vbEluZGV4LCBpbnQgY29uc3RhbnRQb29sT2Zmc2V0KSB7CisJCXRoaXMuY3VycmVudEluZGV4ID0gY29uc3RhbnRQb29sSW5kZXg7CisJCXRoaXMuY3VycmVudE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldDsKKwkJaWYgKHRoaXMuVVRGOENhY2hlLmdldChhdHRyaWJ1dGVOYW1lKSA+PSBjb25zdGFudFBvb2xJbmRleCkgeworCQkJdGhpcy5VVEY4Q2FjaGUucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRG91YmxlQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0RvdWJsZUNhY2hlLmphdmEKaW5kZXggMmJlY2Q0NC4uNDAwMmQ4NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRG91YmxlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Eb3VibGVDYWNoZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDExICsxMiwxMSBAQAogCiBwdWJsaWMgY2xhc3MgRG91YmxlQ2FjaGUgewogCXByaXZhdGUgZG91YmxlIGtleVRhYmxlW107Ci0JcHJpdmF0ZSBpbnQgdmFsdWVUYWJsZVtdOyAKKwlwcml2YXRlIGludCB2YWx1ZVRhYmxlW107CiAJcHJpdmF0ZSBpbnQgZWxlbWVudFNpemU7CiAvKioKICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZS4gQSBkZWZhdWx0IGNhcGFjaXR5IGFuZAotICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IAorICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5CiAgKiBncm93IHdoZW4gaXQgZ2V0cyBmdWxsLgogICovCiBwdWJsaWMgRG91YmxlQ2FjaGUoKSB7CkBAIC03Miw3ICs3Miw3IEBACiAvKioKICAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogCisgKgogICogQHBhcmFtIGtleSA8Q09ERT5kb3VibGU8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKICAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAogICogQHJldHVybiBpbnQgdmFsdWUKQEAgLTkxLDcgKzkxLDcgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCi0gKiAKKyAqCiAgKiBAcGFyYW0ga2V5IDxDT0RFPmRvdWJsZTwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGhhc2h0YWJsZQogICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gdGhlIHNwZWNpZmllZCBlbGVtZW50CiAgKiBAcmV0dXJuIGludCB2YWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRXhjZXB0aW9uTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0V4Y2VwdGlvbkxhYmVsLmphdmEKaW5kZXggMGFiOWM2OC4uN2MyNjM5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRXhjZXB0aW9uTGFiZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9FeGNlcHRpb25MYWJlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDI1ICsxNCwyNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiAKIHB1YmxpYyBjbGFzcyBFeGNlcHRpb25MYWJlbCBleHRlbmRzIExhYmVsIHsKLQkKKwogCXB1YmxpYyBpbnQgcmFuZ2VzW10gPSB7UE9TX05PVF9TRVQsUE9TX05PVF9TRVR9OwotCXB1YmxpYyBpbnQgY291bnQgPSAwOyAvLyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgcGxhY2VTdGFydCBvciBwbGFjZUVuZCBpcyBjYWxsZWQKKwlwcml2YXRlIGludCBjb3VudCA9IDA7IC8vIGluY3JlbWVudGVkIGVhY2ggdGltZSBwbGFjZVN0YXJ0IG9yIHBsYWNlRW5kIGlzIGNhbGxlZAogCXB1YmxpYyBUeXBlQmluZGluZyBleGNlcHRpb25UeXBlOwotCQorCiBwdWJsaWMgRXhjZXB0aW9uTGFiZWwoQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBUeXBlQmluZGluZyBleGNlcHRpb25UeXBlKSB7CiAJc3VwZXIoY29kZVN0cmVhbSk7CiAJdGhpcy5leGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKIH0KLQorcHVibGljIGludCBnZXRDb3VudCgpIHsKKwlyZXR1cm4gdGhpcy5jb3VudDsKK30KIHB1YmxpYyB2b2lkIHBsYWNlKCkgewogCS8vIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGluc2lkZSB0aGUgY29kZVN0cmVhbSB0aGVuIG5vcm1hbCBwbGFjZQotCWNvZGVTdHJlYW0ucmVnaXN0ZXJFeGNlcHRpb25IYW5kbGVyKHRoaXMpOwotCWlmIChDb2RlU3RyZWFtLkRFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdFx0PHBsYWNlIGF0OiAiK2NvZGVTdHJlYW0ucG9zaXRpb24rIiAtICIrIHRoaXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl0aGlzLnBvc2l0aW9uID0gY29kZVN0cmVhbS5nZXRQb3NpdGlvbigpOworCXRoaXMuY29kZVN0cmVhbS5yZWdpc3RlckV4Y2VwdGlvbkhhbmRsZXIodGhpcyk7CisJdGhpcy5wb3NpdGlvbiA9IHRoaXMuY29kZVN0cmVhbS5nZXRQb3NpdGlvbigpOwogfQogCiBwdWJsaWMgdm9pZCBwbGFjZUVuZCgpIHsKLQlpbnQgZW5kUG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWludCBlbmRQb3NpdGlvbiA9IHRoaXMuY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpZiAodGhpcy5yYW5nZXNbdGhpcy5jb3VudC0xXSA9PSBlbmRQb3NpdGlvbikgeyAvLyBzdGFydCA9PSBlbmQgPwogCQkvLyBkaXNjYXJkIGVtcHR5IGV4Y2VwdGlvbiBoYW5kbGVyCiAJCXRoaXMuY291bnQtLTsKQEAgLTQyLDcgKzQzLDcgQEAKIH0KIAogcHVibGljIHZvaWQgcGxhY2VTdGFydCgpIHsKLQlpbnQgc3RhcnRQb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaW50IHN0YXJ0UG9zaXRpb24gPSB0aGlzLmNvZGVTdHJlYW0ucG9zaXRpb247CiAJaWYgKHRoaXMuY291bnQgPiAwICYmIHRoaXMucmFuZ2VzW3RoaXMuY291bnQtMV0gPT0gc3RhcnRQb3NpdGlvbikgeyAvLyBzdGFydCA9PSBwcmV2aW91cyBlbmQgPwogCQkvLyByZW9wZW4gY3VycmVudCBoYW5kbGVyCiAJCXRoaXMuY291bnQtLTsKQEAgLTU4LDE5ICs1OSwxOSBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgYmFzaWMgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKIAliYXNpYyA9IGJhc2ljLnN1YnN0cmluZyhiYXNpYy5sYXN0SW5kZXhPZignLicpKzEpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2ljKTsgCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzaWMpOwogCWJ1ZmZlci5hcHBlbmQoJ0AnKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7CiAJYnVmZmVyLmFwcGVuZCgiKHR5cGU9IikuYXBwZW5kKHRoaXMuZXhjZXB0aW9uVHlwZSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogdGhpcy5leGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQoIiwgcG9zaXRpb249IikuYXBwZW5kKHBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIiwgcG9zaXRpb249IikuYXBwZW5kKHRoaXMucG9zaXRpb24pOyAvLyROT04tTkxTLTEkCiAJYnVmZmVyLmFwcGVuZCgiLCByYW5nZXMgPSAiKTsgLy8kTk9OLU5MUy0xJAogCWlmICh0aGlzLmNvdW50ID09IDApIHsKIAkJYnVmZmVyLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7CiAJCQlpZiAoKGkgJiAxKSA9PSAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiWyIpLmFwcGVuZChyYW5nZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgeyAKLQkJCQlidWZmZXIuYXBwZW5kKCIsIikuYXBwZW5kKHJhbmdlc1tpXSkuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWJ1ZmZlci5hcHBlbmQoIlsiKS5hcHBlbmQodGhpcy5yYW5nZXNbaV0pOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiwiKS5hcHBlbmQodGhpcy5yYW5nZXNbaV0pLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCX0KIAkJfQogCQlpZiAoKHRoaXMuY291bnQgJiAxKSA9PSAxKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEKaW5kZXggYzliNmMyOS4uZTk1YjJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmxvYXRDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Zsb2F0Q2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw3ICsxNiw3IEBACiAJcHJpdmF0ZSBpbnQgZWxlbWVudFNpemU7CiAvKioKICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZS4gQSBkZWZhdWx0IGNhcGFjaXR5IGFuZAotICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IAorICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5CiAgKiBncm93IHdoZW4gaXQgZ2V0cyBmdWxsLgogICovCiBwdWJsaWMgRmxvYXRDYWNoZSgpIHsKQEAgLTcyLDcgKzcyLDcgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCi0gKiAKKyAqCiAgKiBAcGFyYW0ga2V5IDxDT0RFPmZsb2F0PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgaGFzaHRhYmxlCiAgKiBAcGFyYW0gdmFsdWUgPENPREU+aW50PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKICAqIEByZXR1cm4gaW50IHZhbHVlCkBAIC05MSw3ICs5MSw3IEBACiAvKioKICAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogCisgKgogICogQHBhcmFtIGtleSA8Q09ERT5mbG9hdDwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGhhc2h0YWJsZQogICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gdGhlIHNwZWNpZmllZCBlbGVtZW50CiAgKiBAcmV0dXJuIGludCB2YWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vSW50ZWdlckNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YQppbmRleCBjZTc2YTc5Li42YjI0ZjZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxMiArMTIsMTIgQEAKIAogcHVibGljIGNsYXNzIEludGVnZXJDYWNoZSB7CiAJcHVibGljIGludCBrZXlUYWJsZVtdOwotCXB1YmxpYyBpbnQgdmFsdWVUYWJsZVtdOyAKKwlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsKIAlpbnQgZWxlbWVudFNpemU7CiAJaW50IHRocmVzaG9sZDsKIC8qKgogICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlLiBBIGRlZmF1bHQgY2FwYWNpdHkgYW5kCi0gKiBsb2FkIGZhY3RvciBpcyB1c2VkLiBOb3RlIHRoYXQgdGhlIGhhc2h0YWJsZSB3aWxsIGF1dG9tYXRpY2FsbHkgCisgKiBsb2FkIGZhY3RvciBpcyB1c2VkLiBOb3RlIHRoYXQgdGhlIGhhc2h0YWJsZSB3aWxsIGF1dG9tYXRpY2FsbHkKICAqIGdyb3cgd2hlbiBpdCBnZXRzIGZ1bGwuCiAgKi8KIHB1YmxpYyBJbnRlZ2VyQ2FjaGUoKSB7CkBAIC03Miw3ICs3Miw3IEBACiAvKioKICAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAogICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogCisgKgogICogQHBhcmFtIGtleSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKICAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAogICogQHJldHVybiBpbnQgdmFsdWUKQEAgLTk4LDcgKzk4LDcgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlIGlmIGFic2VudCwgdXNpbmcgdGhlIHNwZWNpZmllZAogICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgotICogCisgKgogICogQHBhcmFtIGtleSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKICAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAogICogQHJldHVybiBpbnQgdmFsdWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhCmluZGV4IDkyYTQ3MzMuLmM4NjQzYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xhYmVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTGFiZWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxNSArMTYsMTUgQEAKIAlwdWJsaWMgaW50IHBvc2l0aW9uID0gUE9TX05PVF9TRVQ7IC8vIHBvc2l0aW9uPVBPU19OT1RfU0VUIFRoZW4gaXQncyBwb3MgaXMgbm90IHNldC4KIAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBPU19OT1RfU0VUID0gLTE7Ci0JCisKIHB1YmxpYyBMYWJlbCgpIHsKIAkvLyBmb3IgY3JlYXRpbmcgbGFiZWxzIGFoZWFkIG9mIGNvZGUgZ2VuZXJhdGlvbgotfQkKK30KIAogcHVibGljIExhYmVsKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCXRoaXMuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CiB9Ci0JCisKIC8qCiAqIFBsYWNlIHRoZSBsYWJlbCB0YXJnZXQgcG9zaXRpb24uCiAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTG9uZ0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YQppbmRleCAxODRmYmM1Li5iZDQ3NmViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxMiArMTIsMTIgQEAKIAogcHVibGljIGNsYXNzIExvbmdDYWNoZSB7CiAJcHVibGljIGxvbmcga2V5VGFibGVbXTsKLQlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsgCisJcHVibGljIGludCB2YWx1ZVRhYmxlW107CiAJaW50IGVsZW1lbnRTaXplOwogCWludCB0aHJlc2hvbGQ7CiAvKioKICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZS4gQSBkZWZhdWx0IGNhcGFjaXR5IGFuZAotICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IAorICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5CiAgKiBncm93IHdoZW4gaXQgZ2V0cyBmdWxsLgogICovCiBwdWJsaWMgTG9uZ0NhY2hlKCkgewpAQCAtNTcsNyArNTcsNyBAQAogCQkJcmV0dXJuIHRydWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewogCQkJaW5kZXggPSAwOwotCQl9CQorCQl9CiAJfQogCXJldHVybiBmYWxzZTsKIH0KQEAgLTcyLDcgKzcyLDcgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCi0gKiAKKyAqCiAgKiBAcGFyYW0ga2V5IDxDT0RFPmxvbmc8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKICAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAogICogQHJldHVybiBpbnQgdmFsdWUKQEAgLTk4LDcgKzk4LDcgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCi0gKiAKKyAqCiAgKiBAcGFyYW0ga2V5IDxDT0RFPmxvbmc8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKICAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAogICogQHJldHVybiBpbnQgdmFsdWUKQEAgLTExMCw3ICsxMTAsNyBAQAogCQkJcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF07CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewogCQkJaW5kZXggPSAwOwotCQl9CQorCQl9CiAJfQogCXRoaXMua2V5VGFibGVbaW5kZXhdID0ga2V5OwogCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL011bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTXVsdGlDYXRjaEV4Y2VwdGlvbkxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwZmM1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL011bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlVuaW9uVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIE11bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbCBleHRlbmRzIEV4Y2VwdGlvbkxhYmVsIHsKKworCUV4Y2VwdGlvbkxhYmVsW10gZXhjZXB0aW9uTGFiZWxzOworCisJcHVibGljIE11bHRpQ2F0Y2hFeGNlcHRpb25MYWJlbChDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIFR5cGVCaW5kaW5nIGV4Y2VwdGlvblR5cGUpIHsKKwkJc3VwZXIoY29kZVN0cmVhbSwgZXhjZXB0aW9uVHlwZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVW5pb25UeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpIHsKKwkJVHlwZVJlZmVyZW5jZVtdIHR5cGVSZWZlcmVuY2VzID0gdHlwZVJlZmVyZW5jZS50eXBlUmVmZXJlbmNlczsKKwkJaW50IGxlbmd0aCA9IHR5cGVSZWZlcmVuY2VzLmxlbmd0aDsKKwkJdGhpcy5leGNlcHRpb25MYWJlbHMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJdGhpcy5leGNlcHRpb25MYWJlbHNbaV0gPSBuZXcgRXhjZXB0aW9uTGFiZWwodGhpcy5jb2RlU3RyZWFtLCB0eXBlUmVmZXJlbmNlc1tpXS5yZXNvbHZlZFR5cGUpOworCQl9CisJfQorCXB1YmxpYyB2b2lkIHBsYWNlKCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5leGNlcHRpb25MYWJlbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCXRoaXMuZXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlKCk7CisJCX0KKwl9CisJcHVibGljIHZvaWQgcGxhY2VFbmQoKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmV4Y2VwdGlvbkxhYmVscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJdGhpcy5leGNlcHRpb25MYWJlbHNbaV0ucGxhY2VFbmQoKTsKKwkJfQorCX0KKwlwdWJsaWMgdm9pZCBwbGFjZVN0YXJ0KCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5leGNlcHRpb25MYWJlbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCXRoaXMuZXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlU3RhcnQoKTsKKwkJfQorCX0KKwlwdWJsaWMgaW50IGdldENvdW50KCkgeworCQlpbnQgdGVtcCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmV4Y2VwdGlvbkxhYmVscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJdGVtcCArPSB0aGlzLmV4Y2VwdGlvbkxhYmVsc1tpXS5nZXRDb3VudCgpOworCQl9CisJCXJldHVybiB0ZW1wOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09iamVjdENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PYmplY3RDYWNoZS5qYXZhCmluZGV4IDlmZWI3ODQuLjBjMThmNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09iamVjdENhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04OSwxMyArODksMTMgQEAKIC8qKgogICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCi0gKiBUaGUga2V5IGFuZCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4gCi0gKiAKKyAqIFRoZSBrZXkgYW5kIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLgorICoKICAqIEBwYXJhbSBrZXkgPENPREU+T2JqZWN0PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgaGFzaHRhYmxlCiAgKiBAcGFyYW0gdmFsdWUgPENPREU+aW50PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKICAqIEByZXR1cm4gaW50IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGtleSwgb3IgLTEgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KICAqLwotcHVibGljIGludCBwdXQoT2JqZWN0IGtleSwgaW50IHZhbHVlKSB7IAorcHVibGljIGludCBwdXQoT2JqZWN0IGtleSwgaW50IHZhbHVlKSB7CiAJaW50IGluZGV4ID0gaGFzaENvZGUoa2V5KSwgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CiAJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKIAkJaWYgKHRoaXMua2V5VGFibGVbaW5kZXhdID09IGtleSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1N0YWNrTWFwRnJhbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1N0YWNrTWFwRnJhbWUuamF2YQppbmRleCA2MTRlMDNlLi5hZGQwZGNiIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9TdGFja01hcEZyYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vU3RhY2tNYXBGcmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDcgKzE1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIAotcHVibGljIGNsYXNzIFN0YWNrTWFwRnJhbWUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworcHVibGljIGNsYXNzIFN0YWNrTWFwRnJhbWUgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRUQgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBTUVfRlJBTUUgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT1BfRlJBTUUgPSAxOwpAQCAtMjcsMjIgKzI3LDIzIEBACiAKIAlwdWJsaWMgaW50IHBjOwogCXB1YmxpYyBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zOwotCXByaXZhdGUgaW50IG51bWJlck9mTG9jYWxzOwkKKwlwcml2YXRlIGludCBudW1iZXJPZkxvY2FsczsKIAlwdWJsaWMgaW50IGxvY2FsSW5kZXg7CiAJcHVibGljIFZlcmlmaWNhdGlvblR5cGVJbmZvW10gbG9jYWxzOwogCXB1YmxpYyBWZXJpZmljYXRpb25UeXBlSW5mb1tdIHN0YWNrSXRlbXM7CiAJcHJpdmF0ZSBpbnQgbnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgPSAtMTsKIAlwdWJsaWMgaW50IHRhZ0JpdHM7CiAKLXB1YmxpYyBTdGFja01hcEZyYW1lKCkgeworcHVibGljIFN0YWNrTWFwRnJhbWUoaW50IGluaXRpYWxMb2NhbFNpemUpIHsKKwl0aGlzLmxvY2FscyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mb1tpbml0aWFsTG9jYWxTaXplXTsKIAl0aGlzLm51bWJlck9mTG9jYWxzID0gLTE7CiAJdGhpcy5udW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC0xOwogfQogcHVibGljIGludCBnZXRGcmFtZVR5cGUoU3RhY2tNYXBGcmFtZSBwcmV2RnJhbWUpIHsKLQlmaW5hbCBpbnQgb2Zmc2V0RGVsdGEgPSB0aGlzLmdldE9mZnNldERlbHRhKHByZXZGcmFtZSk7CisJZmluYWwgaW50IG9mZnNldERlbHRhID0gZ2V0T2Zmc2V0RGVsdGEocHJldkZyYW1lKTsKIAlzd2l0Y2godGhpcy5udW1iZXJPZlN0YWNrSXRlbXMpIHsKIAkJY2FzZSAwIDoKLQkJCXN3aXRjaCh0aGlzLm51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSkpIHsKKwkJCXN3aXRjaChudW1iZXJPZkRpZmZlcmVudExvY2FscyhwcmV2RnJhbWUpKSB7CiAJCQkJY2FzZSAwIDoKIAkJCQkJcmV0dXJuIG9mZnNldERlbHRhIDw9IDYzID8gU0FNRV9GUkFNRSA6IFNBTUVfRlJBTUVfRVhURU5ERUQ7CiAJCQkJY2FzZSAxIDoKQEAgLTU2LDcgKzU3LDcgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIDEgOgotCQkJc3dpdGNoKHRoaXMubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMocHJldkZyYW1lKSkgeworCQkJc3dpdGNoKG51bWJlck9mRGlmZmVyZW50TG9jYWxzKHByZXZGcmFtZSkpIHsKIAkJCQljYXNlIDAgOgogCQkJCQlyZXR1cm4gb2Zmc2V0RGVsdGEgPD0gNjMgPyBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1TIDogU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNU19FWFRFTkRFRDsKIAkJCX0KQEAgLTc2LDcgKzc3LDkgQEAKIAl9CiB9CiBwdWJsaWMgdm9pZCBhZGRTdGFja0l0ZW0oVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbykgewotCWlmIChpbmZvID09IG51bGwpIHJldHVybjsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZm8gY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCX0KIAlpZiAodGhpcy5zdGFja0l0ZW1zID09IG51bGwpIHsKIAkJdGhpcy5zdGFja0l0ZW1zID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvWzFdOwogCQl0aGlzLnN0YWNrSXRlbXNbMF0gPSBpbmZvOwpAQCAtOTAsMjIgKzkzLDMyIEBACiAJfQogfQogcHVibGljIHZvaWQgYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQl0aGlzLmFkZFN0YWNrSXRlbShuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oYmluZGluZykpOworCWlmICh0aGlzLnN0YWNrSXRlbXMgPT0gbnVsbCkgeworCQl0aGlzLnN0YWNrSXRlbXMgPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm9bMV07CisJCXRoaXMuc3RhY2tJdGVtc1swXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhiaW5kaW5nKTsKKwkJdGhpcy5udW1iZXJPZlN0YWNrSXRlbXMgPSAxOworCX0gZWxzZSB7CisJCWZpbmFsIGludCBsZW5ndGggPSB0aGlzLnN0YWNrSXRlbXMubGVuZ3RoOworCQlpZiAodGhpcy5udW1iZXJPZlN0YWNrSXRlbXMgPT0gbGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RhY2tJdGVtcywgMCwgdGhpcy5zdGFja0l0ZW1zID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOworCQl9CisJCXRoaXMuc3RhY2tJdGVtc1t0aGlzLm51bWJlck9mU3RhY2tJdGVtcysrXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhiaW5kaW5nKTsKKwl9CiB9Ci1wdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQlTdGFja01hcEZyYW1lIHJlc3VsdCA9IChTdGFja01hcEZyYW1lKSBzdXBlci5jbG9uZSgpOworcHVibGljIFN0YWNrTWFwRnJhbWUgZHVwbGljYXRlKCkgeworCWludCBsZW5ndGggPSB0aGlzLmxvY2Fscy5sZW5ndGg7CisJU3RhY2tNYXBGcmFtZSByZXN1bHQgPSBuZXcgU3RhY2tNYXBGcmFtZShsZW5ndGgpOwogCXJlc3VsdC5udW1iZXJPZkxvY2FscyA9IC0xOwogCXJlc3VsdC5udW1iZXJPZkRpZmZlcmVudExvY2FscyA9IC0xOwogCXJlc3VsdC5wYyA9IHRoaXMucGM7CiAJcmVzdWx0Lm51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMubnVtYmVyT2ZTdGFja0l0ZW1zOwotCQotCWludCBsZW5ndGggPSB0aGlzLmxvY2FscyA9PSBudWxsID8gMCA6IHRoaXMubG9jYWxzLmxlbmd0aDsKKwogCWlmIChsZW5ndGggIT0gMCkgewogCQlyZXN1bHQubG9jYWxzID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvW2xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWZpbmFsIFZlcmlmaWNhdGlvblR5cGVJbmZvIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gdGhpcy5sb2NhbHNbaV07CiAJCQlpZiAodmVyaWZpY2F0aW9uVHlwZUluZm8gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5sb2NhbHNbaV0gPSAoVmVyaWZpY2F0aW9uVHlwZUluZm8pIHZlcmlmaWNhdGlvblR5cGVJbmZvLmNsb25lKCk7CisJCQkJcmVzdWx0LmxvY2Fsc1tpXSA9IHZlcmlmaWNhdGlvblR5cGVJbmZvLmR1cGxpY2F0ZSgpOwogCQkJfQogCQl9CiAJfQpAQCAtMTEzLDE3ICsxMjYsMTEgQEAKIAlpZiAobGVuZ3RoICE9IDApIHsKIAkJcmVzdWx0LnN0YWNrSXRlbXMgPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm9bbGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LnN0YWNrSXRlbXNbaV0gPSAoVmVyaWZpY2F0aW9uVHlwZUluZm8pIHRoaXMuc3RhY2tJdGVtc1tpXS5jbG9uZSgpOworCQkJcmVzdWx0LnN0YWNrSXRlbXNbaV0gPSB0aGlzLnN0YWNrSXRlbXNbaV0uZHVwbGljYXRlKCk7CiAJCX0KIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KLXB1YmxpYyBpbnQgbnVtYmVyT2ZEaWZmZW50U3RhY2tJdGVtcyhTdGFja01hcEZyYW1lIHByZXZGcmFtZSkgewotCWlmIChwcmV2RnJhbWUgPT0gbnVsbCkgewotCQlyZXR1cm4gdGhpcy5udW1iZXJPZlN0YWNrSXRlbXM7Ci0JfQotCXJldHVybiB0aGlzLm51bWJlck9mU3RhY2tJdGVtcyAtIHByZXZGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci19CiBwdWJsaWMgaW50IG51bWJlck9mRGlmZmVyZW50TG9jYWxzKFN0YWNrTWFwRnJhbWUgcHJldkZyYW1lKSB7CiAJaWYgKHRoaXMubnVtYmVyT2ZEaWZmZXJlbnRMb2NhbHMgIT0gLTEpIHJldHVybiB0aGlzLm51bWJlck9mRGlmZmVyZW50TG9jYWxzOwogCWlmIChwcmV2RnJhbWUgPT0gbnVsbCkgewpAQCAtMTM1LDcgKzE0Miw3IEBACiAJaW50IHByZXZMb2NhbHNMZW5ndGggPSBwcmV2TG9jYWxzID09IG51bGwgPyAwIDogcHJldkxvY2Fscy5sZW5ndGg7CiAJaW50IGN1cnJlbnRMb2NhbHNMZW5ndGggPSBjdXJyZW50TG9jYWxzID09IG51bGwgPyAwIDogY3VycmVudExvY2Fscy5sZW5ndGg7CiAJaW50IHByZXZOdW1iZXJPZkxvY2FscyA9IHByZXZGcmFtZS5nZXROdW1iZXJPZkxvY2FscygpOwotCWludCBjdXJyZW50TnVtYmVyT2ZMb2NhbHMgPSB0aGlzLmdldE51bWJlck9mTG9jYWxzKCk7CisJaW50IGN1cnJlbnROdW1iZXJPZkxvY2FscyA9IGdldE51bWJlck9mTG9jYWxzKCk7CiAKIAlpbnQgcmVzdWx0ID0gMDsKIAlpZiAocHJldk51bWJlck9mTG9jYWxzID09IDApIHsKQEAgLTE5Miw3ICsxOTksNyBAQAogCQkJCQkJaW5kZXhJbkN1cnJlbnRMb2NhbHMrKzsgLy8gbmV4dCBlbnRyeSAgaXMgbnVsbAogCQkJCX0KIAkJCX0KLQkJCWZvciAoO2luZGV4SW5QcmV2TG9jYWxzIDwgcHJldkxvY2Fsc0xlbmd0aCAmJiBwcmV2TG9jYWxzQ291bnRlciA8IHByZXZOdW1iZXJPZkxvY2FsczsgaW5kZXhJblByZXZMb2NhbHMrKykgeworCQkJaWYgKGluZGV4SW5QcmV2TG9jYWxzIDwgcHJldkxvY2Fsc0xlbmd0aCAmJiBwcmV2TG9jYWxzQ291bnRlciA8IHByZXZOdW1iZXJPZkxvY2FscykgewogCQkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIHByZXZMb2NhbCA9IHByZXZMb2NhbHNbaW5kZXhJblByZXZMb2NhbHNdOwogCQkJCWlmIChwcmV2TG9jYWwgIT0gbnVsbCkgewogCQkJCQlwcmV2TG9jYWxzQ291bnRlcisrOwpAQCAtMjE0LDcgKzIyMSw3IEBACiAJCQkJCS8vIGxvY2FscyBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcmUgbm90IGVxdWFscyAtIHRoaXMgaGFzIHRvIGJlIGEgZnVsbCBmcmFtZQogCQkJCQlyZXN1bHQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAkJCQkJdGhpcy5udW1iZXJPZkRpZmZlcmVudExvY2FscyA9IHJlc3VsdDsKLQkJCQkJcmV0dXJuIHJlc3VsdDsJCQkJCQkKKwkJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCQl9CiAJCQkJaW5kZXhJblByZXZMb2NhbHMrKzsKIAkJCQljb250aW51ZSBjdXJyZW50TG9jYWxzTG9vcDsKQEAgLTI5OCw3ICszMDUsNyBAQAogCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwogfQogcHJpdmF0ZSB2b2lkIHByaW50RnJhbWUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RhY2tNYXBGcmFtZSBmcmFtZSkgewotCVN0cmluZyBwYXR0ZXJuID0gIltwYyA6IHswfSBsb2NhbHM6IHsxfSBzdGFjayBpdGVtczogezJ9XG57M31cbns0fVxuXSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgcGF0dGVybiA9ICJbcGMgOiB7MH0gbG9jYWxzOiB7MX0gc3RhY2sgaXRlbXM6IHsyfVxubG9jYWxzOiB7M31cbnN0YWNrOiB7NH1cbl0iOyAvLyROT04tTkxTLTEkCiAJaW50IGxvY2Fsc0xlbmd0aCA9IGZyYW1lLmxvY2FscyA9PSBudWxsID8gMCA6IGZyYW1lLmxvY2Fscy5sZW5ndGg7CiAJYnVmZmVyLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJcGF0dGVybiwKQEAgLTMxNyw0NSArMzI0LDE3IEBACiAJaWYgKGluZm9zICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJaWYgKGkgIT0gMCkgYnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJaWYgKGluZm9zW2ldID09IG51bGwpIHsKKwkJCVZlcmlmaWNhdGlvblR5cGVJbmZvIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gaW5mb3NbaV07CisJCQlpZiAodmVyaWZpY2F0aW9uVHlwZUluZm8gPT0gbnVsbCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoInRvcCIpOyAvLyROT04tTkxTLTEkCiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlzd2l0Y2goaW5mb3NbaV0udGFnKSB7Ci0JCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEwgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRURfVEhJUyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoInVuaW5pdGlhbGl6ZWRfdGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9UT1AgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJ0b3AiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoInVuaW5pdGlhbGl6ZWQoIikuYXBwZW5kKGluZm9zW2ldLnJlYWRhYmxlTmFtZSgpKS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoaW5mb3NbaV0ucmVhZGFibGVOYW1lKCkpOwotCQkJfQorCQkJYnVmZmVyLmFwcGVuZCh2ZXJpZmljYXRpb25UeXBlSW5mbyk7CiAJCX0KIAl9CiAJYnVmZmVyLmFwcGVuZCgnXScpOwogCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwogfQotcHVibGljIHZvaWQgc2V0VG9wT2ZTdGFjayhUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCXRoaXMuc3RhY2tJdGVtc1t0aGlzLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdLnNldEJpbmRpbmcodHlwZUJpbmRpbmcpOwotfQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJlY2VpdmVyKCkgewotCWlmICh0aGlzLm51bWJlck9mU3RhY2tJdGVtcyA+IDApIHsKLQkJdGhpcy5zdGFja0l0ZW1zW3RoaXMubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0udGFnID0gVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9PQkpFQ1Q7Ci0JfQotfQotcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxzKGludCByZXNvbHZlZFBvc2l0aW9uKSB7Ci0JaWYgKHRoaXMubG9jYWxzID09IG51bGwgfHwgcmVzb2x2ZWRQb3NpdGlvbiA8IDApIHJldHVybjsKLQlpZiAocmVzb2x2ZWRQb3NpdGlvbiA8IHRoaXMubG9jYWxzLmxlbmd0aCkgewotCQl0aGlzLmxvY2Fsc1tyZXNvbHZlZFBvc2l0aW9uXSA9IG51bGw7Ci0JfQotfQogcHVibGljIHZvaWQgcHV0TG9jYWwoaW50IHJlc29sdmVkUG9zaXRpb24sIFZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8pIHsKIAlpZiAodGhpcy5sb2NhbHMgPT0gbnVsbCkgewogCQl0aGlzLmxvY2FscyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mb1tyZXNvbHZlZFBvc2l0aW9uICsgMV07CkBAIC0zNzAsMTMgKzM0OSw5IEBACiB9CiBwdWJsaWMgdm9pZCByZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCkgewogCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSB0aGlzLnN0YWNrSXRlbXNbdGhpcy5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLQl0cnkgewotCQlWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMiA9IChWZXJpZmljYXRpb25UeXBlSW5mbykgaW5mby5jbG9uZSgpOwotCQlpbmZvMi5yZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCk7Ci0JCXRoaXMuc3RhY2tJdGVtc1t0aGlzLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gaW5mbzI7Ci0JfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkvLyBpZ25vcmUKLQl9CisJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbzIgPSBpbmZvLmR1cGxpY2F0ZSgpOworCWluZm8yLnJlcGxhY2VXaXRoRWxlbWVudFR5cGUoKTsKKwl0aGlzLnN0YWNrSXRlbXNbdGhpcy5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IGluZm8yOwogfQogcHVibGljIGludCBnZXRJbmRleE9mRGlmZmVyZW50TG9jYWxzKGludCBkaWZmZXJlbnRMb2NhbHNDb3VudCkgewogCWZvciAoaW50IGkgPSB0aGlzLmxvY2Fscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewpAQCAtNDAwLDI1ICszNzUsNCBAQAogCWlmIChpbmZvMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIGluZm8uZXF1YWxzKGluZm8yKTsKIH0KLXB1YmxpYyB2b2lkIG1lcmdlTG9jYWxzKFN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lKSB7Ci0JaW50IGN1cnJlbnRGcmFtZUxvY2Fsc0xlbmd0aCA9IGN1cnJlbnRGcmFtZS5sb2NhbHMgPT0gbnVsbCA/IDAgOiBjdXJyZW50RnJhbWUubG9jYWxzLmxlbmd0aDsKLQlpbnQgbG9jYWxzTGVuZ3RoID0gdGhpcy5sb2NhbHMgPT0gbnVsbCA/IDAgOiB0aGlzLmxvY2Fscy5sZW5ndGg7Ci0JZm9yIChpbnQgaSA9IDAsIG1heCA9IE1hdGgubWluKGN1cnJlbnRGcmFtZUxvY2Fsc0xlbmd0aCwgbG9jYWxzTGVuZ3RoKTsgaSA8IG1heDsgaSsrKSB7Ci0JCVZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSB0aGlzLmxvY2Fsc1tpXTsKLQkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbzIgPSBjdXJyZW50RnJhbWUubG9jYWxzW2ldOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQlpZiAoaW5mbzIgIT0gbnVsbCkgewotCQkJCXRoaXMubG9jYWxzW2ldID0gaW5mbzI7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5mbzIgPT0gbnVsbCkgewotCQkJdGhpcy5sb2NhbHNbaV0gPSBudWxsOwotCQl9IGVsc2UgewotCQkJaW50IHRhZzEgPSBpbmZvLnRhZzsKLQkJCWludCB0YWcyID0gaW5mbzIudGFnOwotCQkJaWYgKHRhZzEgIT0gdGFnMikgewotCQkJCXRoaXMubG9jYWxzW2ldID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1N0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9TdGFja01hcEZyYW1lQ29kZVN0cmVhbS5qYXZhCmluZGV4IDQ1OTk4YWMuLmU2MWNkZTMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1N0YWNrTWFwRnJhbWVDb2RlU3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwyMzQyICsxMSw1NjUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlN5bnRoZXRpY0FyZ3VtZW50QmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydE1ldGhvZDsKIAogcHVibGljIGNsYXNzIFN0YWNrTWFwRnJhbWVDb2RlU3RyZWFtIGV4dGVuZHMgQ29kZVN0cmVhbSB7Ci0gICAgcHVibGljIFN0YWNrTWFwRnJhbWUgY3VycmVudEZyYW1lOwotICAgIHB1YmxpYyBBcnJheUxpc3QgZnJhbWVzOworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFya2VyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisJCXB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZTsKKwkJcHVibGljIGludCBwYzsKIAotICAgIHB1YmxpYyBTZXQgZnJhbWVQb3NpdGlvbnM7CisJCXB1YmxpYyBFeGNlcHRpb25NYXJrZXIoaW50IHBjLCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSkgeworCQkJdGhpcy5wYyA9IHBjOworCQkJdGhpcy5jb25zdGFudFBvb2xOYW1lID0gY29uc3RhbnRQb29sTmFtZTsKKwkJfQorCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgeworCQkJaWYgKG8gaW5zdGFuY2VvZiBFeGNlcHRpb25NYXJrZXIpIHsKKwkJCQlyZXR1cm4gdGhpcy5wYyAtICgoRXhjZXB0aW9uTWFya2VyKSBvKS5wYzsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgRXhjZXB0aW9uTWFya2VyKSB7CisJCQkJRXhjZXB0aW9uTWFya2VyIG1hcmtlciA9IChFeGNlcHRpb25NYXJrZXIpIG9iajsKKwkJCQlyZXR1cm4gdGhpcy5wYyA9PSBtYXJrZXIucGMgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5jb25zdGFudFBvb2xOYW1lLCBtYXJrZXIuY29uc3RhbnRQb29sTmFtZSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiB0aGlzLnBjICsgdGhpcy5jb25zdGFudFBvb2xOYW1lLmhhc2hDb2RlKCk7CisJCX0KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIuYXBwZW5kKCcoJykuYXBwZW5kKHRoaXMucGMpLmFwcGVuZCgnLCcpLmFwcGVuZCh0aGlzLmNvbnN0YW50UG9vbE5hbWUpLmFwcGVuZCgnKScpOworCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7CisJCX0KKwl9CiAKLSAgICBwdWJsaWMgQXJyYXlMaXN0IHZhcmlhYmxlc01vZGlmaWNhdGlvbnNQb3NpdGlvbnM7CisJcHVibGljIHN0YXRpYyBjbGFzcyBTdGFja0RlcHRoTWFya2VyIHsKKwkJcHVibGljIGludCBwYzsKKwkJcHVibGljIGludCBkZWx0YTsKKwkJcHVibGljIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOwogCi0gICAgcHVibGljIGludFtdIHN0YXRlSW5kZXhlczsKLSAgICBwdWJsaWMgaW50IHN0YXRlSW5kZXhlc0NvdW50ZXI7CisJCXB1YmxpYyBTdGFja0RlcHRoTWFya2VyKGludCBwYywgaW50IGRlbHRhLCBUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCQkJdGhpcy5wYyA9IHBjOworCQkJdGhpcy50eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nOworCQkJdGhpcy5kZWx0YSA9IGRlbHRhOworCQl9CisKKwkJcHVibGljIFN0YWNrRGVwdGhNYXJrZXIoaW50IHBjLCBpbnQgZGVsdGEpIHsKKwkJCXRoaXMucGMgPSBwYzsKKwkJCXRoaXMuZGVsdGEgPSBkZWx0YTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJYnVmZmVyLmFwcGVuZCgnKCcpLmFwcGVuZCh0aGlzLnBjKS5hcHBlbmQoJywnKS5hcHBlbmQodGhpcy5kZWx0YSk7CisJCQlpZiAodGhpcy50eXBlQmluZGluZyAhPSBudWxsKSB7CisJCQkJYnVmZmVyCisJCQkJCS5hcHBlbmQoJywnKQorCQkJCQkuYXBwZW5kKHRoaXMudHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSkKKwkJCQkJLmFwcGVuZCh0aGlzLnR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCcpJyk7CisJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhY2tNYXJrZXIgeworCQlwdWJsaWMgaW50IHBjOworCQlwdWJsaWMgaW50IGRlc3RpbmF0aW9uUEM7CisJCXB1YmxpYyBWZXJpZmljYXRpb25UeXBlSW5mb1tdIGluZm9zOworCisJCXB1YmxpYyBTdGFja01hcmtlcihpbnQgcGMsIGludCBkZXN0aW5hdGlvblBDKSB7CisJCQl0aGlzLnBjID0gcGM7CisJCQl0aGlzLmRlc3RpbmF0aW9uUEMgPSBkZXN0aW5hdGlvblBDOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0SW5mb3MoVmVyaWZpY2F0aW9uVHlwZUluZm9bXSBpbmZvcykgeworCQkJdGhpcy5pbmZvcyA9IGluZm9zOworCQl9CisKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKCJbY29weSBzdGFjayBpdGVtcyBmcm9tICIpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKHRoaXMucGMpCisJCQkJLmFwcGVuZCgiIHRvICIpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKHRoaXMuZGVzdGluYXRpb25QQyk7CisJCQlpZiAodGhpcy5pbmZvcyE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5pbmZvcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmluZm9zW2ldKTsKKwkJCQl9CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCddJyk7CisJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKKwkJfQorCX0KKworCXN0YXRpYyBjbGFzcyBGcmFtZVBvc2l0aW9uIHsKKwkJaW50IGNvdW50ZXI7CisJfQorCisJcHVibGljIGludFtdIHN0YXRlSW5kZXhlczsKKwlwdWJsaWMgaW50IHN0YXRlSW5kZXhlc0NvdW50ZXI7CisJcHJpdmF0ZSBIYXNoTWFwIGZyYW1lUG9zaXRpb25zOworCXB1YmxpYyBTZXQgZXhjZXB0aW9uTWFya2VyczsKKwlwdWJsaWMgQXJyYXlMaXN0IHN0YWNrRGVwdGhNYXJrZXJzOworCXB1YmxpYyBBcnJheUxpc3Qgc3RhY2tNYXJrZXJzOwogCiBwdWJsaWMgU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0oQ2xhc3NGaWxlIGdpdmVuQ2xhc3NGaWxlKSB7Ci0gICAgc3VwZXIoZ2l2ZW5DbGFzc0ZpbGUpOwotfQotcHVibGljIHZvaWQgYWFsb2FkKCkgewotICAgIHN1cGVyLmFhbG9hZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucmVwbGFjZVdpdGhFbGVtZW50VHlwZSgpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGFhc3RvcmUoKSB7Ci0gICAgc3VwZXIuYWFzdG9yZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMykgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTM7Ci0gICAgfQotfQotcHVibGljIHZvaWQgYWNvbnN0X251bGwoKSB7Ci0gICAgc3VwZXIuYWNvbnN0X251bGwoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuTlVMTCk7CisJc3VwZXIoZ2l2ZW5DbGFzc0ZpbGUpOworCXRoaXMuZ2VuZXJhdGVBdHRyaWJ1dGVzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1NUQUNLX01BUDsKIH0KIHB1YmxpYyB2b2lkIGFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhTY29wZSBzY29wZSwgaW50IGluaXRTdGF0ZUluZGV4KSB7Ci0gICAgLy8gUmVxdWlyZWQgdG8gZml4IDFQUjBYVlM6IExGUkU6V0lOTlQgLSBDb21waWxlcjogdmFyaWFibGUgdGFibGUgZm9yIG1ldGhvZCBhcHBlYXJzIGluY29ycmVjdAotICAgIGxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZUxvY2Fsc0NvdW50OyBpKyspIHsKLSAgICAgICAgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gdmlzaWJsZUxvY2Fsc1tpXTsKLSAgICAgICAgaWYgKGxvY2FsQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbG9jYWwgaXMgZGVmaW5pdGVseSBhc3NpZ25lZAotICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZCA9IGlzRGVmaW5pdGVseUFzc2lnbmVkKHNjb3BlLCBpbml0U3RhdGVJbmRleCwgbG9jYWxCaW5kaW5nKTsKLSAgICAgICAgICAgIGlmICghaXNEZWZpbml0ZWx5QXNzaWduZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZUluZGV4ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgbWF4ID0gdGhpcy5zdGF0ZUluZGV4ZXNDb3VudGVyOyBqIDwgbWF4OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgdGhpcy5zdGF0ZUluZGV4ZXNbal0sIGxvY2FsQmluZGluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWUucHV0TG9jYWwobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhsb2NhbEJpbmRpbmcudHlwZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgPT0gMCkgfHwgKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvblBDc1soKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSAhPSAtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIHR3byBjYXNlczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMSkgdGhlcmUgaXMgbm8gaW5pdGlhbGl6YXRpb24gaW50ZXJ2YWwgb3BlbmVkID09PiBhZGQgYW4gb3BlbmVkIGludGVydmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDIpIHRoZXJlIGlzIGFscmVhZHkgc29tZSBpbml0aWFsaXphdGlvbiBpbnRlcnZhbHMgYnV0IHRoZSBsYXN0IG9uZSBpcyBjbG9zZWQgPT0+IGFkZCBhbiBvcGVuZWQgaW50ZXJ2YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQW4gb3BlbmVkIGludGVydmFsIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGF0IGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvblBDc1tsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCAtIDFdWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIGVxdWFscyB0byAtMS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb25QQ3MgaXMgYSBjb2xsZWN0aW9uIG9mIHBhaXJzIG9mIGludDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCWZpcnN0IHZhbHVlIGlzIHRoZSBzdGFydFBDIGFuZCBzZWNvbmQgdmFsdWUgaXMgdGhlIGVuZFBDLiAtMSBvbmUgZm9yIHRoZSBsYXN0IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGludGVydmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAlpcyBub3QgY2xvc2VkIHlldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMocG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWUucHV0TG9jYWwobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhsb2NhbEJpbmRpbmcudHlwZSkpOwotICAgICAgICAgICAgICAgIGlmICgobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgPT0gMCkgfHwgKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvblBDc1soKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSAhPSAtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIHR3byBjYXNlczoKLSAgICAgICAgICAgICAgICAgICAgICogMSkgdGhlcmUgaXMgbm8gaW5pdGlhbGl6YXRpb24gaW50ZXJ2YWwgb3BlbmVkID09PiBhZGQgYW4gb3BlbmVkIGludGVydmFsCi0gICAgICAgICAgICAgICAgICAgICAqIDIpIHRoZXJlIGlzIGFscmVhZHkgc29tZSBpbml0aWFsaXphdGlvbiBpbnRlcnZhbHMgYnV0IHRoZSBsYXN0IG9uZSBpcyBjbG9zZWQgPT0+IGFkZCBhbiBvcGVuZWQgaW50ZXJ2YWwKLSAgICAgICAgICAgICAgICAgICAgICogQW4gb3BlbmVkIGludGVydmFsIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGF0IGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvblBDc1tsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCAtIDFdWzFdCi0gICAgICAgICAgICAgICAgICAgICAqIGlzIGVxdWFscyB0byAtMS4KLSAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb25QQ3MgaXMgYSBjb2xsZWN0aW9uIG9mIHBhaXJzIG9mIGludDoKLSAgICAgICAgICAgICAgICAgICAgICogCWZpcnN0IHZhbHVlIGlzIHRoZSBzdGFydFBDIGFuZCBzZWNvbmQgdmFsdWUgaXMgdGhlIGVuZFBDLiAtMSBvbmUgZm9yIHRoZSBsYXN0IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGludGVydmFsCi0gICAgICAgICAgICAgICAgICAgICAqIAlpcyBub3QgY2xvc2VkIHlldC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBJbnRlZ2VyIG5ld1ZhbHVlID0gbmV3IEludGVnZXIodGhpcy5wb3NpdGlvbik7Ci0gICAgaWYgKHRoaXMudmFyaWFibGVzTW9kaWZpY2F0aW9uc1Bvc2l0aW9ucy5zaXplKCkgPT0gMCB8fCAhdGhpcy52YXJpYWJsZXNNb2RpZmljYXRpb25zUG9zaXRpb25zLmdldCh0aGlzLnZhcmlhYmxlc01vZGlmaWNhdGlvbnNQb3NpdGlvbnMuc2l6ZSgpIC0gMSkuZXF1YWxzKG5ld1ZhbHVlKSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlc01vZGlmaWNhdGlvbnNQb3NpdGlvbnMuYWRkKG5ld1ZhbHVlKTsKLSAgICB9Ci0gICAgc3RvcmVTdGFja01hcEZyYW1lKCk7CisJLy8gUmVxdWlyZWQgdG8gZml4IDFQUjBYVlM6IExGUkU6V0lOTlQgLSBDb21waWxlcjogdmFyaWFibGUgdGFibGUgZm9yIG1ldGhvZCBhcHBlYXJzIGluY29ycmVjdAorCWxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlTG9jYWxzQ291bnQ7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSB0aGlzLnZpc2libGVMb2NhbHNbaV07CisJCWlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCkgeworCQkJLy8gQ2hlY2sgaWYgdGhlIGxvY2FsIGlzIGRlZmluaXRlbHkgYXNzaWduZWQKKwkJCWJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQgPSBpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgaW5pdFN0YXRlSW5kZXgsIGxvY2FsQmluZGluZyk7CisJCQlpZiAoIWlzRGVmaW5pdGVseUFzc2lnbmVkKSB7CisJCQkJaWYgKHRoaXMuc3RhdGVJbmRleGVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IHRoaXMuc3RhdGVJbmRleGVzQ291bnRlcjsgaiA8IG1heDsgaisrKSB7CisJCQkJCQlpZiAoaXNEZWZpbml0ZWx5QXNzaWduZWQoc2NvcGUsIHRoaXMuc3RhdGVJbmRleGVzW2pdLCBsb2NhbEJpbmRpbmcpKSB7CisJCQkJCQkJaWYgKChsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCA9PSAwKSB8fCAobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uUENzWygobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdICE9IC0xKSkgeworCQkJCQkJCQkvKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorCQkJCQkJCQkgKiAxKSB0aGVyZSBpcyBubyBpbml0aWFsaXphdGlvbiBpbnRlcnZhbCBvcGVuZWQgPT0+IGFkZCBhbiBvcGVuZWQgaW50ZXJ2YWwKKwkJCQkJCQkJICogMikgdGhlcmUgaXMgYWxyZWFkeSBzb21lIGluaXRpYWxpemF0aW9uIGludGVydmFscyBidXQgdGhlIGxhc3Qgb25lIGlzIGNsb3NlZCA9PT4gYWRkIGFuIG9wZW5lZCBpbnRlcnZhbAorCQkJCQkJCQkgKiBBbiBvcGVuZWQgaW50ZXJ2YWwgbWVhbnMgdGhhdCB0aGUgdmFsdWUgYXQgbG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uUENzW2xvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50IC0gMV1bMV0KKwkJCQkJCQkJICogaXMgZXF1YWxzIHRvIC0xLgorCQkJCQkJCQkgKiBpbml0aWFsaXphdGlvblBDcyBpcyBhIGNvbGxlY3Rpb24gb2YgcGFpcnMgb2YgaW50OgorCQkJCQkJCQkgKiAJZmlyc3QgdmFsdWUgaXMgdGhlIHN0YXJ0UEMgYW5kIHNlY29uZCB2YWx1ZSBpcyB0aGUgZW5kUEMuIC0xIG9uZSBmb3IgdGhlIGxhc3QgdmFsdWUgbWVhbnMgdGhhdCB0aGUgaW50ZXJ2YWwKKwkJCQkJCQkJICogCWlzIG5vdCBjbG9zZWQgeWV0LgorCQkJCQkJCQkgKi8KKwkJCQkJCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyh0aGlzLnBvc2l0aW9uKTsKKwkJCQkJCQl9CisJCQkJCQkJY29udGludWUgbG9vcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKChsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCA9PSAwKSB8fCAobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uUENzWygobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdICE9IC0xKSkgeworCQkJCQkvKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorCQkJCQkgKiAxKSB0aGVyZSBpcyBubyBpbml0aWFsaXphdGlvbiBpbnRlcnZhbCBvcGVuZWQgPT0+IGFkZCBhbiBvcGVuZWQgaW50ZXJ2YWwKKwkJCQkJICogMikgdGhlcmUgaXMgYWxyZWFkeSBzb21lIGluaXRpYWxpemF0aW9uIGludGVydmFscyBidXQgdGhlIGxhc3Qgb25lIGlzIGNsb3NlZCA9PT4gYWRkIGFuIG9wZW5lZCBpbnRlcnZhbAorCQkJCQkgKiBBbiBvcGVuZWQgaW50ZXJ2YWwgbWVhbnMgdGhhdCB0aGUgdmFsdWUgYXQgbG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uUENzW2xvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50IC0gMV1bMV0KKwkJCQkJICogaXMgZXF1YWxzIHRvIC0xLgorCQkJCQkgKiBpbml0aWFsaXphdGlvblBDcyBpcyBhIGNvbGxlY3Rpb24gb2YgcGFpcnMgb2YgaW50OgorCQkJCQkgKiAJZmlyc3QgdmFsdWUgaXMgdGhlIHN0YXJ0UEMgYW5kIHNlY29uZCB2YWx1ZSBpcyB0aGUgZW5kUEMuIC0xIG9uZSBmb3IgdGhlIGxhc3QgdmFsdWUgbWVhbnMgdGhhdCB0aGUgaW50ZXJ2YWwKKwkJCQkJICogCWlzIG5vdCBjbG9zZWQgeWV0LgorCQkJCQkgKi8KKwkJCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyh0aGlzLnBvc2l0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CiB9Ci1wdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcpIHsKLSAgICBjdXJyZW50RnJhbWUucHV0TG9jYWwobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhsb2NhbEJpbmRpbmcudHlwZSkpOwotICAgIHN0b3JlU3RhY2tNYXBGcmFtZSgpOwotICAgIHN1cGVyLmFkZFZhcmlhYmxlKGxvY2FsQmluZGluZyk7CitwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb25NYXJrZXIoaW50IHBjLCBUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCWlmICh0aGlzLmV4Y2VwdGlvbk1hcmtlcnMgPT0gbnVsbCkgeworCQl0aGlzLmV4Y2VwdGlvbk1hcmtlcnMgPSBuZXcgSGFzaFNldCgpOworCX0KKwlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQl0aGlzLmV4Y2VwdGlvbk1hcmtlcnMuYWRkKG5ldyBFeGNlcHRpb25NYXJrZXIocGMsIENvbnN0YW50UG9vbC5KYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUpKTsKKwl9IGVsc2UgeworCQlzd2l0Y2godHlwZUJpbmRpbmcuaWQpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX251bGwgOgorCQkJCXRoaXMuZXhjZXB0aW9uTWFya2Vycy5hZGQobmV3IEV4Y2VwdGlvbk1hcmtlcihwYywgQ29uc3RhbnRQb29sLkphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkNvbnN0YW50UG9vbE5hbWUpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCXRoaXMuZXhjZXB0aW9uTWFya2Vycy5hZGQobmV3IEV4Y2VwdGlvbk1hcmtlcihwYywgQ29uc3RhbnRQb29sLkphdmFMYW5nTm9TdWNoRmllbGRFcnJvckNvbnN0YW50UG9vbE5hbWUpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdGhpcy5leGNlcHRpb25NYXJrZXJzLmFkZChuZXcgRXhjZXB0aW9uTWFya2VyKHBjLCB0eXBlQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCkpKTsKKwkJfQorCX0KIH0KLXB1YmxpYyB2b2lkIGFsb2FkKGludCBpQXJnKSB7Ci0gICAgc3VwZXIuYWxvYWQoaUFyZyk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKGlBcmcsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBhbG9hZF8wKCkgewotICAgIHN1cGVyLmFsb2FkXzAoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMCwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGFsb2FkXzEoKSB7Ci0gICAgc3VwZXIuYWxvYWRfMSgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgxLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotCi1wdWJsaWMgdm9pZCBhbG9hZF8yKCkgewotICAgIHN1cGVyLmFsb2FkXzIoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMiwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGFsb2FkXzMoKSB7Ci0gICAgc3VwZXIuYWxvYWRfMygpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgzLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgYW5ld2FycmF5KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0gICAgc3VwZXIuYW5ld2FycmF5KHR5cGVCaW5kaW5nKTsKLSAgICBjaGFyW10gY29uc3RhbnRQb29sTmFtZSA9IHR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKTsKLSAgICBpbnQgbGVuZ3RoID0gY29uc3RhbnRQb29sTmFtZS5sZW5ndGg7Ci0gICAgU3lzdGVtLmFycmF5Y29weShjb25zdGFudFBvb2xOYW1lLCAwLCAoY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDNdKSwgMiwgbGVuZ3RoKTsKLSAgICBjb25zdGFudFBvb2xOYW1lWzBdID0gJ1snOwotICAgIGNvbnN0YW50UG9vbE5hbWVbMV0gPSAnTCc7Ci0gICAgY29uc3RhbnRQb29sTmFtZVtsZW5ndGggKyAyXSA9ICc7JzsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nLmlkLCBjb25zdGFudFBvb2xOYW1lKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBhcmV0dXJuKCkgewotICAgIHN1cGVyLmFyZXR1cm4oKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotICAgIGZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCBhcnJheWxlbmd0aCgpIHsKLSAgICBzdXBlci5hcnJheWxlbmd0aCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBhc3RvcmUoaW50IGlBcmcpIHsKLSAgICBzdXBlci5hc3RvcmUoaUFyZyk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoaUFyZywgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGFzdG9yZV8wKCkgewotICAgIHN1cGVyLmFzdG9yZV8wKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMCwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGFzdG9yZV8xKCkgewotICAgIHN1cGVyLmFzdG9yZV8xKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMSwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGFzdG9yZV8yKCkgewotICAgIHN1cGVyLmFzdG9yZV8yKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMiwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGFzdG9yZV8zKCkgewotICAgIHN1cGVyLmFzdG9yZV8zKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMywgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGF0aHJvdygpIHsKLSAgICBzdXBlci5hdGhyb3coKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotICAgIGZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCBiYWxvYWQoKSB7Ci0gICAgc3VwZXIuYmFsb2FkKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgYmFzdG9yZSgpIHsKLSAgICBzdXBlci5iYXN0b3JlKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAzKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy09MzsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBiaXB1c2goYnl0ZSBiKSB7Ci0gICAgc3VwZXIuYmlwdXNoKGIpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOwotfQotcHVibGljIHZvaWQgY2Fsb2FkKCkgewotICAgIHN1cGVyLmNhbG9hZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucmVwbGFjZVdpdGhFbGVtZW50VHlwZSgpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGNhc3RvcmUoKSB7Ci0gICAgc3VwZXIuY2FzdG9yZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMykgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTM7Ci0gICAgfQotfQotcHVibGljIHZvaWQgY2hlY2tjYXN0KGludCBiYXNlSWQpIHsKLSAgICBzdXBlci5jaGVja2Nhc3QoYmFzZUlkKTsKLSAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gbnVsbDsKLSAgICBzd2l0Y2ggKGJhc2VJZCkgewotICAgICAgICBjYXNlIFR5cGVJZHMuVF9ieXRlIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nQnl0ZSwgQ29uc3RhbnRQb29sLkphdmFMYW5nQnl0ZUNvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nU2hvcnQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ1Nob3J0Q29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0NoYXJhY3RlciwgQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfaW50IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nSW50ZWdlciwgQ29uc3RhbnRQb29sLkphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdMb25nLCBDb25zdGFudFBvb2wuSmF2YUxhbmdMb25nQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdGbG9hdCwgQ29uc3RhbnRQb29sLkphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9kb3VibGUgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdEb3VibGUsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdCb29sZWFuLCBDb25zdGFudFBvb2wuSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKGluZm8gIT0gbnVsbCAmJiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBpbmZvOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGNoZWNrY2FzdChUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotICAgIHN1cGVyLmNoZWNrY2FzdCh0eXBlQmluZGluZyk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyh0eXBlQmluZGluZyk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZDJmKCkgewotICAgIHN1cGVyLmQyZigpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRkxPQVQpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGQyaSgpIHsKLSAgICBzdXBlci5kMmkoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLklOVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZDJsKCkgewotICAgIHN1cGVyLmQybCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuTE9ORyk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZGFkZCgpIHsKLSAgICBzdXBlci5kYWRkKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGRhbG9hZCgpIHsKLSAgICBzdXBlci5kYWxvYWQoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnJlcGxhY2VXaXRoRWxlbWVudFR5cGUoKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkYXN0b3JlKCkgewotICAgIHN1cGVyLmRhc3RvcmUoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDMpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0zOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGRjbXBnKCkgewotICAgIHN1cGVyLmRjbXBnKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy09MjsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZGNtcGwoKSB7Ci0gICAgc3VwZXIuZGNtcGwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkY29uc3RfMCgpIHsKLSAgICBzdXBlci5kY29uc3RfMCgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5ET1VCTEUpOwotfQotcHVibGljIHZvaWQgZGNvbnN0XzEoKSB7Ci0gICAgc3VwZXIuZGNvbnN0XzEoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRE9VQkxFKTsKLX0KLXB1YmxpYyB2b2lkIGRkaXYoKSB7Ci0gICAgc3VwZXIuZGRpdigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkZWNyU3RhY2tTaXplKGludCBvZmZzZXQpIHsKLSAgICBzdXBlci5kZWNyU3RhY2tTaXplKG9mZnNldCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkbG9hZChpbnQgaUFyZykgewotICAgIHN1cGVyLmRsb2FkKGlBcmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbChpQXJnLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgZGxvYWRfMCgpIHsKLSAgICBzdXBlci5kbG9hZF8wKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDAsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBkbG9hZF8xKCkgewotICAgIHN1cGVyLmRsb2FkXzEoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMSwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGRsb2FkXzIoKSB7Ci0gICAgc3VwZXIuZGxvYWRfMigpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgyLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgZGxvYWRfMygpIHsKLSAgICBzdXBlci5kbG9hZF8zKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDMsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBkbXVsKCkgewotICAgIHN1cGVyLmRtdWwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgZHJlbSgpIHsKLSAgICBzdXBlci5kcmVtKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGRyZXR1cm4oKSB7Ci0gICAgc3VwZXIuZHJldHVybigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci0gICAgdGhpcy5mcmFtZVBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIodGhpcy5wb3NpdGlvbikpOwotfQotcHVibGljIHZvaWQgZHN0b3JlKGludCBpQXJnKSB7Ci0gICAgc3VwZXIuZHN0b3JlKGlBcmcpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnB1dExvY2FsKGlBcmcsIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkc3RvcmVfMCgpIHsKLSAgICBzdXBlci5kc3RvcmVfMCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnB1dExvY2FsKDAsIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkc3RvcmVfMSgpIHsKLSAgICBzdXBlci5kc3RvcmVfMSgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnB1dExvY2FsKDEsIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkc3RvcmVfMigpIHsKLSAgICBzdXBlci5kc3RvcmVfMigpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnB1dExvY2FsKDIsIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkc3RvcmVfMygpIHsKLSAgICBzdXBlci5kc3RvcmVfMygpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnB1dExvY2FsKDMsIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0pOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkc3ViKCkgewotICAgIHN1cGVyLmRzdWIoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgZHVwKCkgewotICAgIHN1cGVyLmR1cCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkdXBfeDEoKSB7Ci0gICAgc3VwZXIuZHVwX3gxKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMiA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkdXBfeDIoKSB7Ci0gICAgc3VwZXIuZHVwX3gyKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMiA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICBzd2l0Y2goaW5mbzIuaWQoKSkgewotICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0gICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9kb3VibGUgOgotICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOwotICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgICAgICAgICAgICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMyA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkdXAyKCkgewotICAgIHN1cGVyLmR1cDIoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHN3aXRjaChpbmZvLmlkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0gICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgICAgICAgICAgICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8yID0gdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGR1cDJfeDEoKSB7Ci0gICAgc3VwZXIuZHVwMl94MSgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIFZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8gPSB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbzIgPSB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW3RoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgc3dpdGNoKGluZm8uaWQoKSkgewotICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOwotICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgICAgICAgICAgICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMyA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBkdXAyX3gyKCkgewotICAgIHN1cGVyLmR1cDJfeDIoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIFZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8yID0gdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1t0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHN3aXRjaChpbmZvLmlkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goaW5mbzIuaWQoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gNAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybSAyCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMyA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgICAgICAgICAgICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvblR5cGVJbmZvIGluZm8zID0gdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChpbmZvMy5pZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybSAzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGluZm8zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvNCA9IHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBleGl0VXNlclNjb3BlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7Ci0gICAgaW50IGluZGV4ID0gdGhpcy52aXNpYmxlTG9jYWxzQ291bnQgLSAxOwotICAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIExvY2FsVmFyaWFibGVCaW5kaW5nIHZpc2libGVMb2NhbCA9IHZpc2libGVMb2NhbHNbaW5kZXhdOwotICAgICAgICBpZiAodmlzaWJsZUxvY2FsID09IG51bGwpIHsKLSAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmlzaWJsZUxvY2FsLmRlY2xhcmluZ1Njb3BlICE9IGN1cnJlbnRTY29wZSkgLy8gbGVmdCBjdXJyZW50U2NvcGUKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIHRoZXJlIG1heSBiZSBzb21lIHByZXNlcnZlZCBsb2NhbHMgbmV2ZXIgaW5pdGlhbGl6ZWQKLSAgICAgICAgaWYgKHZpc2libGVMb2NhbC5pbml0aWFsaXphdGlvbkNvdW50ID4gMCl7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZW1vdmVMb2NhbHModmlzaWJsZUxvY2FsLnJlc29sdmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4LS07Ci0gICAgfQotICAgIGlmIChjdXJyZW50U2NvcGUgIT0gbnVsbCkgewotICAgICAgICBpbnQgbG9jYWxJbmRleCA9IGN1cnJlbnRTY29wZS5sb2NhbEluZGV4OwotICAgICAgICBpZiAobG9jYWxJbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsSW5kZXg7IGkrKykgewotICAgICAgICAgICAgICAgIExvY2FsVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGN1cnJlbnRTY29wZS5sb2NhbHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlQmluZGluZyAhPSBudWxsICYmIHZhcmlhYmxlQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQgJiYgdmFyaWFibGVCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucmVtb3ZlTG9jYWxzKHZhcmlhYmxlQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZXhpdFVzZXJTY29wZShjdXJyZW50U2NvcGUpOwotfQotcHVibGljIHZvaWQgZXhpdFVzZXJTY29wZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgYmluZGluZykgewotICAgIGludCBpbmRleCA9IHRoaXMudmlzaWJsZUxvY2Fsc0NvdW50IC0gMTsKLSAgICB3aGlsZSAoaW5kZXggPj0gMCkgewotICAgICAgICBMb2NhbFZhcmlhYmxlQmluZGluZyB2aXNpYmxlTG9jYWwgPSB2aXNpYmxlTG9jYWxzW2luZGV4XTsKLSAgICAgICAgaWYgKHZpc2libGVMb2NhbCA9PSBudWxsIHx8IHZpc2libGVMb2NhbCA9PSBiaW5kaW5nKSB7Ci0gICAgICAgICAgICBpbmRleC0tOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZpc2libGVMb2NhbC5kZWNsYXJpbmdTY29wZSAhPSBjdXJyZW50U2NvcGUpIC8vIGxlZnQgY3VycmVudFNjb3BlCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0aGVyZSBtYXkgYmUgc29tZSBwcmVzZXJ2ZWQgbG9jYWxzIG5ldmVyIGluaXRpYWxpemVkCi0gICAgICAgIGlmICh2aXNpYmxlTG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApewotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucmVtb3ZlTG9jYWxzKHZpc2libGVMb2NhbC5yZXNvbHZlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpbmRleC0tOwotICAgIH0KLSAgICBpZiAoY3VycmVudFNjb3BlICE9IG51bGwpIHsKLSAgICAgICAgaW50IGxvY2FsSW5kZXggPSBjdXJyZW50U2NvcGUubG9jYWxJbmRleDsKLSAgICAgICAgaWYgKGxvY2FsSW5kZXggIT0gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEluZGV4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBMb2NhbFZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBjdXJyZW50U2NvcGUubG9jYWxzW2ldOwotICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUJpbmRpbmcgIT0gbnVsbCAmJiB2YXJpYWJsZUJpbmRpbmcgIT0gYmluZGluZyAmJiB2YXJpYWJsZUJpbmRpbmcudXNlRmxhZyA9PSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEICYmIHZhcmlhYmxlQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnJlbW92ZUxvY2Fscyh2YXJpYWJsZUJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHRoaXMuc3RvcmVTdGFja01hcEZyYW1lKCk7Ci0gICAgc3VwZXIuZXhpdFVzZXJTY29wZShjdXJyZW50U2NvcGUsIGJpbmRpbmcpOwotfQotcHVibGljIHZvaWQgZjJkKCkgewotICAgIHN1cGVyLmYyZCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRE9VQkxFKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBmMmkoKSB7Ci0gICAgc3VwZXIuZjJpKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGYybCgpIHsKLSAgICBzdXBlci5mMmwoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkxPTkcpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZhZGQoKSB7Ci0gICAgc3VwZXIuZmFkZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBmYWxvYWQoKSB7Ci0gICAgc3VwZXIuZmFsb2FkKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZmFzdG9yZSgpIHsKLSAgICBzdXBlci5mYXN0b3JlKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAzKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy09MzsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBmY21wZygpIHsKLSAgICBzdXBlci5mY21wZygpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTI7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZjbXBsKCkgewotICAgIHN1cGVyLmZjbXBsKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy09MjsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZmNvbnN0XzAoKSB7Ci0gICAgc3VwZXIuZmNvbnN0XzAoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRkxPQVQpOwotfQotcHVibGljIHZvaWQgZmNvbnN0XzEoKSB7Ci0gICAgc3VwZXIuZmNvbnN0XzEoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRkxPQVQpOwotfQotcHVibGljIHZvaWQgZmNvbnN0XzIoKSB7Ci0gICAgc3VwZXIuZmNvbnN0XzIoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRkxPQVQpOwotfQotcHVibGljIHZvaWQgZmRpdigpIHsKLSAgICBzdXBlci5mZGl2KCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZsb2FkKGludCBpQXJnKSB7Ci0gICAgc3VwZXIuZmxvYWQoaUFyZyk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKGlBcmcsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBmbG9hZF8wKCkgewotICAgIHN1cGVyLmZsb2FkXzAoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMCwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGZsb2FkXzEoKSB7Ci0gICAgc3VwZXIuZmxvYWRfMSgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgxLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgZmxvYWRfMigpIHsKLSAgICBzdXBlci5mbG9hZF8yKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDIsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBmbG9hZF8zKCkgewotICAgIHN1cGVyLmZsb2FkXzMoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMywgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGZtdWwoKSB7Ci0gICAgc3VwZXIuZm11bCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBmcmVtKCkgewotICAgIHN1cGVyLmZyZW0oKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgZnJldHVybigpIHsKLSAgICBzdXBlci5mcmV0dXJuKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLSAgICB0aGlzLmZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCBmc3RvcmUoaW50IGlBcmcpIHsKLSAgICBzdXBlci5mc3RvcmUoaUFyZyk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoaUFyZywgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZzdG9yZV8wKCkgewotICAgIHN1cGVyLmZzdG9yZV8wKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMCwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZzdG9yZV8xKCkgewotICAgIHN1cGVyLmZzdG9yZV8xKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMSwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZzdG9yZV8yKCkgewotICAgIHN1cGVyLmZzdG9yZV8yKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMiwgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZzdG9yZV8zKCkgewotICAgIHN1cGVyLmZzdG9yZV8zKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoMywgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGZzdWIoKSB7Ci0gICAgc3VwZXIuZnN1YigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZUJveGluZ0NvbnZlcnNpb24oaW50IHVuYm94ZWRUeXBlSUQpIHsKLSAgICBzdXBlci5nZW5lcmF0ZUJveGluZ0NvbnZlcnNpb24odW5ib3hlZFR5cGVJRCk7Ci0gICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IG51bGw7Ci0gICAgc3dpdGNoICh1bmJveGVkVHlwZUlEKSB7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2J5dGUgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdCeXRlLCBDb25zdGFudFBvb2wuSmF2YUxhbmdCeXRlQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdTaG9ydCwgQ29uc3RhbnRQb29sLkphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9jaGFyIDoKLSAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nQ2hhcmFjdGVyLCBDb25zdGFudFBvb2wuSmF2YUxhbmdDaGFyYWN0ZXJDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2ludCA6Ci0gICAgICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0ludGVnZXIsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0ludGVnZXJDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nTG9uZywgQ29uc3RhbnRQb29sLkphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKLSAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nRmxvYXQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0Zsb2F0Q29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nRG91YmxlLCBDb25zdGFudFBvb2wuSmF2YUxhbmdEb3VibGVDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKLSAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nQm9vbGVhbiwgQ29uc3RhbnRQb29sLkphdmFMYW5nQm9vbGVhbkNvbnN0YW50UG9vbE5hbWUpOwotICAgIH0KLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChpbmZvICE9IG51bGwgJiYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gaW5mbzsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZU91dGVyQWNjZXNzKE9iamVjdFtdIG1hcHBpbmdTZXF1ZW5jZSwgQVNUTm9kZSBpbnZvY2F0aW9uU2l0ZSwgQmluZGluZyB0YXJnZXQsIFNjb3BlIHNjb3BlKSB7Ci0gICAgaWYgKG1hcHBpbmdTZXF1ZW5jZSA9PSBudWxsKSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgewotICAgICAgICAgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7IC8vVE9ETyAocGhpbGlwcGUpIHNob3VsZCBpbXByb3ZlIGxvY2FsIGVtdWxhdGlvbiBmYWlsdXJlIHJlcG9ydGluZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9TdWNoRW5jbG9zaW5nSW5zdGFuY2UoKFJlZmVyZW5jZUJpbmRpbmcpdGFyZ2V0LCBpbnZvY2F0aW9uU2l0ZSwgZmFsc2UpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKChSZWZlcmVuY2VCaW5kaW5nKXRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobWFwcGluZ1NlcXVlbmNlID09IEJsb2NrU2NvcGUuTm9FbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsKSB7Ci0gICAgICAgIHNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vU3VjaEVuY2xvc2luZ0luc3RhbmNlKChSZWZlcmVuY2VCaW5kaW5nKXRhcmdldCwgaW52b2NhdGlvblNpdGUsIHRydWUpOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oKFJlZmVyZW5jZUJpbmRpbmcpdGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobWFwcGluZ1NlcXVlbmNlID09IEJsb2NrU2NvcGUuTm9FbmNsb3NpbmdJbnN0YW5jZUluU3RhdGljQ29udGV4dCkgewotICAgICAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub1N1Y2hFbmNsb3NpbmdJbnN0YW5jZSgoUmVmZXJlbmNlQmluZGluZyl0YXJnZXQsIGludm9jYXRpb25TaXRlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSgoUmVmZXJlbmNlQmluZGluZyl0YXJnZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1hcHBpbmdTZXF1ZW5jZSA9PSBCbG9ja1Njb3BlLkVtdWxhdGlvblBhdGhUb0ltcGxpY2l0VGhpcykgewotICAgICAgICB0aGlzLmFsb2FkXzAoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobWFwcGluZ1NlcXVlbmNlWzBdIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7Ci0gICAgICAgIEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBtYXBwaW5nU2VxdWVuY2VbMF07Ci0gICAgICAgIHRoaXMuYWxvYWRfMCgpOwotICAgICAgICB0aGlzLmdldGZpZWxkKGZpZWxkQmluZGluZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbG9hZCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIG1hcHBpbmdTZXF1ZW5jZVswXSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxLCBsZW5ndGggPSBtYXBwaW5nU2VxdWVuY2UubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1hcHBpbmdTZXF1ZW5jZVtpXSBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgewotICAgICAgICAgICAgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIG1hcHBpbmdTZXF1ZW5jZVtpXTsKLSAgICAgICAgICAgIHRoaXMuZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuaW52b2tlc3RhdGljKChNZXRob2RCaW5kaW5nKSBtYXBwaW5nU2VxdWVuY2VbaV0pOwotICAgICAgICB9Ci0gICAgfQotfQotcHVibGljIHZvaWQgZ2VuZXJhdGVVbmJveGluZ0NvbnZlcnNpb24oaW50IHVuYm94ZWRUeXBlSUQpIHsKLSAgICBzdXBlci5nZW5lcmF0ZVVuYm94aW5nQ29udmVyc2lvbih1bmJveGVkVHlwZUlEKTsKLSAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gbnVsbDsKLSAgICBzd2l0Y2ggKHVuYm94ZWRUeXBlSUQpIHsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfYnl0ZSA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkJZVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuU0hPUlQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2NoYXIgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5DSEFSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9pbnQgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5MT05HKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9mbG9hdCA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkZMT0FUKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9kb3VibGUgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5ET1VCTEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5CT09MRUFOKTsKLSAgICB9Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAoaW5mbyAhPSBudWxsICYmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IGluZm87Ci0gICAgfQotfQotcHVibGljIHZvaWQgZ2V0QmFzZVR5cGVWYWx1ZShpbnQgYmFzZVR5cGVJRCkgewotICAgIHN1cGVyLmdldEJhc2VUeXBlVmFsdWUoYmFzZVR5cGVJRCk7Ci0gICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IG51bGw7Ci0gICAgc3dpdGNoIChiYXNlVHlwZUlEKSB7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2J5dGUgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5CWVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9zaG9ydCA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLlNIT1JUKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9jaGFyIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQ0hBUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfaW50IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuTE9ORyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5GTE9BVCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRE9VQkxFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQk9PTEVBTik7Ci0gICAgfQotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKGluZm8gIT0gbnVsbCAmJiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBpbmZvOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGdldGZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKLSAgICBzdXBlci5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oZmllbGRCaW5kaW5nLnR5cGUpOwotICAgIH0KLX0KLXByaXZhdGUgVmVyaWZpY2F0aW9uVHlwZUluZm8gZ2V0TG9jYWwoaW50IHJlc29sdmVkUG9zaXRpb24sIFN0YWNrTWFwRnJhbWUgZnJhbWUpIHsKLSAgICBWZXJpZmljYXRpb25UeXBlSW5mbyB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IGZyYW1lLmxvY2Fsc1tyZXNvbHZlZFBvc2l0aW9uXTsKLQotICAgIGlmICh2ZXJpZmljYXRpb25UeXBlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICB0cnkgewotICAgICAgICBpZiAodmVyaWZpY2F0aW9uVHlwZUluZm8udGFnID09IFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRF9USElTCi0gICAgICAgICAgICAgICAgfHwgdmVyaWZpY2F0aW9uVHlwZUluZm8udGFnID09IFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgcmV0dXJuIHZlcmlmaWNhdGlvblR5cGVJbmZvOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoVmVyaWZpY2F0aW9uVHlwZUluZm8pIHZlcmlmaWNhdGlvblR5cGVJbmZvLmNsb25lKCk7Ci0gICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICByZXR1cm4gdmVyaWZpY2F0aW9uVHlwZUluZm87Ci0gICAgfQotfQotcHJvdGVjdGVkIGludCBnZXRQb3NpdGlvbigpIHsKLSAgICAvLyBuZWVkIHRvIHJlY29yZCBhIG5ldyBzdGFjayBmcmFtZSBhdCB0aGlzIHBvc2l0aW9uCi0gICAgaW50IHBvcyA9IHN1cGVyLmdldFBvc2l0aW9uKCk7Ci0gICAgdGhpcy5mcmFtZVBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIodGhpcy5wb3NpdGlvbikpOwotICAgIHN0b3JlU3RhY2tNYXBGcmFtZSgpOwotICAgIHJldHVybiBwb3M7Ci19Ci1wdWJsaWMgdm9pZCBnZXRzdGF0aWMoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgewotICAgIHN1cGVyLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShmaWVsZEJpbmRpbmcudHlwZSk7Ci19Ci1wdWJsaWMgdm9pZCBnZXRUWVBFKGludCBiYXNlVHlwZUlEKSB7Ci0gICAgc3VwZXIuZ2V0VFlQRShiYXNlVHlwZUlEKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0obmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0NsYXNzLCBDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUpKTsKLX0KLS8qKgotICogV2UgZGlkbid0IGNhbGwgaXQgZ290bywgYmVjYXVzZSB0aGVyZSBpcyBhIGNvbmZsaXQgd2l0aCB0aGUgZ290byBrZXl3b3JkCi0gKi8KLXB1YmxpYyB2b2lkIGdvdG9fKEJyYW5jaExhYmVsIGxhYmVsKSB7Ci0gICAgc3VwZXIuZ290b18obGFiZWwpOwotICAgIHRoaXMuZnJhbWVQb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHRoaXMucG9zaXRpb24pKTsKLX0KLXB1YmxpYyB2b2lkIGdvdG9fdyhCcmFuY2hMYWJlbCBsYWJlbCkgewotICAgIHN1cGVyLmdvdG9fdyhsYWJlbCk7Ci0gICAgdGhpcy5mcmFtZVBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIodGhpcy5wb3NpdGlvbikpOwotfQotcHVibGljIHZvaWQgaTJiKCkgewotICAgIHN1cGVyLmkyYigpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQllURSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaTJjKCkgewotICAgIHN1cGVyLmkyYygpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQ0hBUik7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaTJkKCkgewotICAgIHN1cGVyLmkyZCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRE9VQkxFKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpMmYoKSB7Ci0gICAgc3VwZXIuaTJmKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5GTE9BVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaTJsKCkgewotICAgIHN1cGVyLmkybCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuTE9ORyk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaTJzKCkgewotICAgIHN1cGVyLmkycygpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuU0hPUlQpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlhZGQoKSB7Ci0gICAgc3VwZXIuaWFkZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpYWxvYWQoKSB7Ci0gICAgc3VwZXIuaWFsb2FkKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaWFuZCgpIHsKLSAgICBzdXBlci5pYW5kKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlhc3RvcmUoKSB7Ci0gICAgc3VwZXIuaWFzdG9yZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMykgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTM7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaWNvbnN0XzAoKSB7Ci0gICAgc3VwZXIuaWNvbnN0XzAoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKLX0KLXB1YmxpYyB2b2lkIGljb25zdF8xKCkgewotICAgIHN1cGVyLmljb25zdF8xKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci19Ci1wdWJsaWMgdm9pZCBpY29uc3RfMigpIHsKLSAgICBzdXBlci5pY29uc3RfMigpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOwotfQotcHVibGljIHZvaWQgaWNvbnN0XzMoKSB7Ci0gICAgc3VwZXIuaWNvbnN0XzMoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuSU5UKTsKLX0KLXB1YmxpYyB2b2lkIGljb25zdF80KCkgewotICAgIHN1cGVyLmljb25zdF80KCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci19Ci1wdWJsaWMgdm9pZCBpY29uc3RfNSgpIHsKLSAgICBzdXBlci5pY29uc3RfNSgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOwotfQotcHVibGljIHZvaWQgaWNvbnN0X20xKCkgewotICAgIHN1cGVyLmljb25zdF9tMSgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5JTlQpOwotfQotcHVibGljIHZvaWQgaWRpdigpIHsKLSAgICBzdXBlci5pZGl2KCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2FjbXBlcShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9hY21wZXEobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2FjbXBuZShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9hY21wbmUobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBlcShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wZXEobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBnZShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wZ2UobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBndChCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wZ3QobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBsZShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wbGUobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBsdChCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wbHQobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmX2ljbXBuZShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZl9pY21wbmUobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLT0yOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmZXEoQnJhbmNoTGFiZWwgbGJsKSB7Ci0gICAgc3VwZXIuaWZlcShsYmwpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpZmdlKEJyYW5jaExhYmVsIGxibCkgewotICAgIHN1cGVyLmlmZ2UobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaWZndChCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZmd0KGxibCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmbGUoQnJhbmNoTGFiZWwgbGJsKSB7Ci0gICAgc3VwZXIuaWZsZShsYmwpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpZmx0KEJyYW5jaExhYmVsIGxibCkgewotICAgIHN1cGVyLmlmbHQobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaWZuZShCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZm5lKGxibCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlmbm9ubnVsbChCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5pZm5vbm51bGwobGJsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaWZudWxsKEJyYW5jaExhYmVsIGxibCkgewotICAgIHN1cGVyLmlmbnVsbChsYmwpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbG9hZChpbnQgaUFyZykgewotICAgIHN1cGVyLmlsb2FkKGlBcmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbChpQXJnLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgaWxvYWRfMCgpIHsKLSAgICBzdXBlci5pbG9hZF8wKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDAsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBpbG9hZF8xKCkgewotICAgIHN1cGVyLmlsb2FkXzEoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMSwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGlsb2FkXzIoKSB7Ci0gICAgc3VwZXIuaWxvYWRfMigpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgyLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgaWxvYWRfMygpIHsKLSAgICBzdXBlci5pbG9hZF8zKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDMsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBpbXVsKCkgewotICAgIHN1cGVyLmltdWwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIGJvb2xlYW4gaW5saW5lRm9yd2FyZFJlZmVyZW5jZXNGcm9tTGFiZWxzVGFyZ2V0aW5nKEJyYW5jaExhYmVsIHRhcmdldExhYmVsLCBpbnQgZ290b0xvY2F0aW9uKSB7Ci0gICAgaWYgKHRhcmdldExhYmVsLmRlbGVnYXRlICE9IG51bGwpIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBpbmxpbmVkCi0gICAgaW50IGNoYWluaW5nID0gTF9VTktOT1dOOwotCi0gICAgYm9vbGVhbiByZW1vdmVGcmFtZSA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IHRoaXMuY291bnRMYWJlbHMgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBCcmFuY2hMYWJlbCBjdXJyZW50TGFiZWwgPSBsYWJlbHNbaV07Ci0gICAgICAgIGlmIChjdXJyZW50TGFiZWwucG9zaXRpb24gIT0gZ290b0xvY2F0aW9uKSBicmVhazsKLSAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCA9PSB0YXJnZXRMYWJlbCkgewotICAgICAgICAgICAgY2hhaW5pbmcgfD0gTF9DQU5OT1RfT1BUSU1JWkU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudExhYmVsLmlzU3RhbmRhcmRMYWJlbCgpKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudExhYmVsLmRlbGVnYXRlICE9IG51bGwpIGNvbnRpbnVlOwotICAgICAgICAgICAgY2hhaW5pbmcgfD0gTF9PUFRJTUlaQUJMRTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50KCkgPT0gMCAmJiAoKGN1cnJlbnRMYWJlbC50YWdCaXRzICYgQnJhbmNoTGFiZWwuVVNFRCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVGcmFtZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSBsYWJlbAotICAgICAgICByZW1vdmVGcmFtZSA9IGZhbHNlOwotICAgICAgICBjaGFpbmluZyB8PSBMX0NBTk5PVF9PUFRJTUlaRTsKLSAgICB9Ci0gICAgaWYgKChjaGFpbmluZyAmIExfT1BUSU1JWkFCTEUpICE9IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuY291bnRMYWJlbHMgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgQnJhbmNoTGFiZWwgY3VycmVudExhYmVsID0gbGFiZWxzW2ldOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRMYWJlbC5wb3NpdGlvbiAhPSBnb3RvTG9jYXRpb24pIGJyZWFrOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCA9PSB0YXJnZXRMYWJlbCkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoY3VycmVudExhYmVsLmlzU3RhbmRhcmRMYWJlbCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMYWJlbC5kZWxlZ2F0ZSAhPSBudWxsKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB0YXJnZXRMYWJlbC5iZWNvbWVEZWxlZ2F0ZUZvcihjdXJyZW50TGFiZWwpOwotICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZW1vdmUgdGhlIGZyYW1lIGNvcnJlc3BvbmRpbmcgdG8gb3RoZXJMYWJlbCBwb3NpdGlvbiBpbiBvcmRlciB0byBwcmV2ZW50IHVudXNlZCBzdGFjayBmcmFtZQotICAgICAgICAgICAgICAgIGlmIChyZW1vdmVGcmFtZSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGFiZWwudGFnQml0cyAmPSB+QnJhbmNoTGFiZWwuVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdGFja0ZyYW1lRm9yKGdvdG9Mb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoY2hhaW5pbmcgJiAoTF9PUFRJTUlaQUJMRXxMX0NBTk5PVF9PUFRJTUlaRSkpID09IExfT1BUSU1JWkFCTEU7IC8vIGNoZWNrIHdhcyBzb21lIHN0YW5kYXJkcywgYW5kIG5vIGNhc2UvcmVjdXJzaXZlCi19Ci0KLXB1YmxpYyB2b2lkIGluaXQoQ2xhc3NGaWxlIHRhcmdldENsYXNzRmlsZSkgewotICAgIHN1cGVyLmluaXQodGFyZ2V0Q2xhc3NGaWxlKTsKLSAgICB0aGlzLmZyYW1lcyA9IG51bGw7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUgPSBudWxsOwotfQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZU1heExvY2FscyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLSAgICBzdXBlci5pbml0aWFsaXplTWF4TG9jYWxzKG1ldGhvZEJpbmRpbmcpOwotICAgIFN0YWNrTWFwRnJhbWUgZnJhbWUgPSBuZXcgU3RhY2tNYXBGcmFtZSgpOwotICAgIGZyYW1lLnBjID0gLTE7Ci0KLSAgICBpZiAodGhpcy5tYXhMb2NhbHMgIT0gMCkgewotICAgICAgICBpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IDA7Ci0gICAgICAgIC8vIHRha2UgaW50byBhY2NvdW50IGVudW0gY29uc3RydWN0b3Igc3ludGhldGljIG5hbWUrb3JkaW5hbAotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKTsKLSAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IpIHsKLSAgICAgICAgICAgIGZyYW1lLnB1dExvY2FsKHJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRURfVEhJUywgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykpOwotICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICB9IGVsc2UgaWYgKCFtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpIHsKLSAgICAgICAgICAgIGZyYW1lLnB1dExvY2FsKHJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCwgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykpOwotICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUucHV0TG9jYWwocmVzb2x2ZWRQb3NpdGlvbiwgbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZywgQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVkUG9zaXRpb24rKzsKLSAgICAgICAgICAgICAgICBmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLCBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCB0aGUgc3ludGhldGljIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIGlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdJbnN0YW5jZVR5cGVzW107Ci0gICAgICAgICAgICAgICAgaWYgKChlbmNsb3NpbmdJbnN0YW5jZVR5cGVzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IGVuY2xvc2luZ0luc3RhbmNlVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbmNsb3NpbmdJbnN0YW5jZVR5cGUgY2FuIG9ubHkgYmUgYSByZWZlcmVuY2UgYmluZGluZy4gSXQgY2Fubm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb25nQmluZGluZyBvciBEb3VibGVCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLCBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oZW5jbG9zaW5nSW5zdGFuY2VUeXBlc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgVHlwZUJpbmRpbmdbXSBhcmd1bWVudHM7Ci0gICAgICAgICAgICAgICAgaWYgKChhcmd1bWVudHMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcmd1bWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5wdXRMb2NhbChyZXNvbHZlZFBvc2l0aW9uLCBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8odHlwZUJpbmRpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlQmluZGluZy5pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUG9zaXRpb24gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZ3VtZW50c1tdOwotICAgICAgICAgICAgICAgIGlmICgoc3ludGhldGljQXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnB1dExvY2FsKHJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyh0eXBlQmluZGluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGVCaW5kaW5nLmlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbis9MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICBpZiAoKGFyZ3VtZW50cyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbWF4ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFyZ3VtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnB1dExvY2FsKHJlc29sdmVkUG9zaXRpb24sIG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyh0eXBlQmluZGluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGVCaW5kaW5nLmlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbiArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFBvc2l0aW9uKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKLSAgICAgICAgICAgIGlmICgoYXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFyZ3VtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWUucHV0TG9jYWwocmVzb2x2ZWRQb3NpdGlvbiwgbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKHR5cGVCaW5kaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlQmluZGluZy5pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUG9zaXRpb24gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICAgIHRoaXMuZnJhbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLmZyYW1lcy5hZGQoZnJhbWUuY2xvbmUoKSk7Ci0gICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IGZyYW1lOwotICAgIHRoaXMuZnJhbWVQb3NpdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotICAgIHRoaXMudmFyaWFibGVzTW9kaWZpY2F0aW9uc1Bvc2l0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLX0KLXB1YmxpYyB2b2lkIGluc3RhbmNlX29mKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0gICAgc3VwZXIuaW5zdGFuY2Vfb2YodHlwZUJpbmRpbmcpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICB9Ci19Ci1wcm90ZWN0ZWQgdm9pZCBpbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpIHsKLSAgICBzdXBlci5pbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtPTI7Ci0gICAgfQotfQotcHJvdGVjdGVkIHZvaWQgaW52b2tlQXJyYXlOZXdJbnN0YW5jZSgpIHsKLSAgICBzdXBlci5pbnZva2VBcnJheU5ld0luc3RhbmNlKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW3RoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCwgQ29uc3RhbnRQb29sLkphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlQ2xhc3NGb3JOYW1lKCkgewotICAgIHN1cGVyLmludm9rZUNsYXNzRm9yTmFtZSgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nQ2xhc3MsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0NsYXNzQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotfQotcHJvdGVjdGVkIHZvaWQgaW52b2tlQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yKCkgewotICAgIHN1cGVyLmludm9rZUNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1t0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IsIENvbnN0YW50UG9vbC5KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvckNvbnN0YW50UG9vbE5hbWUpOwotICAgIH0KLX0KLXByb3RlY3RlZCB2b2lkIGludm9rZUNsYXNzR2V0RGVjbGFyZWRGaWVsZCgpIHsKLSAgICBzdXBlci5pbnZva2VDbGFzc0dldERlY2xhcmVkRmllbGQoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nUmVmbGVjdEZpZWxkLCBDb25zdGFudFBvb2wuSkFWQUxBTkdSRUZMRUNURklFTERfQ09OU1RBTlRQT09MTkFNRSk7Ci0gICAgfQotfQotcHJvdGVjdGVkIHZvaWQgaW52b2tlQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCgpIHsKLSAgICBzdXBlci5pbnZva2VDbGFzc0dldERlY2xhcmVkTWV0aG9kKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAzKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy09MjsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1t0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdSZWZsZWN0TWV0aG9kLCBDb25zdGFudFBvb2wuSkFWQUxBTkdSRUZMRUNUTUVUSE9EX0NPTlNUQU5UUE9PTE5BTUUpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUVudW1PcmRpbmFsKGNoYXJbXSBlbnVtVHlwZUNvbnN0YW50UG9vbE5hbWUpIHsKLSAgICBzdXBlci5pbnZva2VFbnVtT3JkaW5hbChlbnVtVHlwZUNvbnN0YW50UG9vbE5hbWUpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VpbnRlcmZhY2UoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0gICAgc3VwZXIuaW52b2tlaW50ZXJmYWNlKG1ldGhvZEJpbmRpbmcpOwotICAgIGludCBhcmdDb3VudCA9IDE7Ci0gICAgYXJnQ291bnQgKz0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aDsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IGFyZ0NvdW50KSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPSBhcmdDb3VudDsKLSAgICB9Ci0gICAgaWYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSAhPSBUeXBlQmluZGluZy5WT0lEKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3RvcihpbnQgdHlwZUJpbmRpbmdJRCkgewotICAgIC8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvci48aW5pdD4odHlwZUJpbmRpbmdJRClWCi0gICAgc3VwZXIuaW52b2tlSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0cnVjdG9yKHR5cGVCaW5kaW5nSUQpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotCSAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLQkgICAgdGhpcy5jdXJyZW50RnJhbWUuaW5pdGlhbGl6ZVJlY2VpdmVyKCk7Ci0JICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOyAvLyByZW1vdmUgdGhlIHRvcCBvZiBzdGFjawotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0gICAgc3VwZXIuaW52b2tlSmF2YUxhbmdBc3NlcnRpb25FcnJvckRlZmF1bHRDb25zdHJ1Y3RvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotCSAgICB0aGlzLmN1cnJlbnRGcmFtZS5pbml0aWFsaXplUmVjZWl2ZXIoKTsKLQkgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07IC8vIHJlbW92ZSB0aGUgdG9wIG9mIHN0YWNrCi0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdDbGFzc0Rlc2lyZWRBc3NlcnRpb25TdGF0dXMoKSB7Ci0gICAgLy8gaW52b2tldmlydHVhbDogamF2YS5sYW5nLkNsYXNzLmRlc2lyZWRBc3NlcnRpb25TdGF0dXMoKVo7Ci0gICAgc3VwZXIuaW52b2tlSmF2YUxhbmdDbGFzc0Rlc2lyZWRBc3NlcnRpb25TdGF0dXMoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkJPT0xFQU4pOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nRW51bXZhbHVlT2YoUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgLy8gaW52b2tlc3RhdGljOiBqYXZhLmxhbmcuRW51bS52YWx1ZU9mKENsYXNzLFN0cmluZykKLSAgICBzdXBlci5pbnZva2VKYXZhTGFuZ0VudW12YWx1ZU9mKGJpbmRpbmcpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGJpbmRpbmcpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nRW51bVZhbHVlcyhUeXBlQmluZGluZyBlbnVtQmluZGluZywgQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZykgewotICAgIHN1cGVyLmludm9rZUphdmFMYW5nRW51bVZhbHVlcyhlbnVtQmluZGluZywgYXJyYXlCaW5kaW5nKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oYXJyYXlCaW5kaW5nKTsKLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nRXJyb3JDb25zdHJ1Y3RvcigpIHsKLSAgICBzdXBlci5pbnZva2VKYXZhTGFuZ0Vycm9yQ29uc3RydWN0b3IoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5pbml0aWFsaXplUmVjZWl2ZXIoKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07IC8vIHJlbW92ZSB0aGUgdG9wIG9mIHN0YWNrCi0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3JOZXdJbnN0YW5jZSgpIHsKLSAgICBzdXBlci5pbnZva2VKYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3Rvck5ld0luc3RhbmNlKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW3RoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCwgQ29uc3RhbnRQb29sLkphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotfQotcHJvdGVjdGVkIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRHZXR0ZXIoaW50IHR5cGVJRCkgewotICAgIHN1cGVyLmludm9rZUphdmFMYW5nUmVmbGVjdEZpZWxkR2V0dGVyKHR5cGVJRCk7Ci0gICAgVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbyA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlSUQpIHsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfaW50IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9ieXRlIDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuQllURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5TSE9SVCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfbG9uZyA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkxPTkcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuRkxPQVQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkRPVUJMRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0gICAgICAgICAgICBpbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkNIQVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgotICAgICAgICAgICAgaW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5CT09MRUFOKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0LCBDb25zdGFudFBvb2wuSmF2YUxhbmdPYmplY3RDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBpbmZvOwotICAgIH0KLX0KLXByb3RlY3RlZCB2b2lkIGludm9rZUphdmFMYW5nUmVmbGVjdEZpZWxkU2V0dGVyKGludCB0eXBlSUQpIHsKLSAgICBzdXBlci5pbnZva2VKYXZhTGFuZ1JlZmxlY3RGaWVsZFNldHRlcih0eXBlSUQpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ1JlZmxlY3RNZXRob2RJbnZva2UoKSB7Ci0gICAgc3VwZXIuaW52b2tlSmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAzKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPSAzOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZUphdmFVdGlsSXRlcmF0b3JIYXNOZXh0KCkgewotICAgIHN1cGVyLmludm9rZUphdmFVdGlsSXRlcmF0b3JIYXNOZXh0KCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5CT09MRUFOKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VKYXZhVXRpbEl0ZXJhdG9yTmV4dCgpIHsKLSAgICAvLyBpbnZva2VpbnRlcmZhY2UgamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKWphdmEubGFuZy5PYmplY3QKLSAgICBzdXBlci5pbnZva2VKYXZhVXRpbEl0ZXJhdG9yTmV4dCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0LCBDb25zdGFudFBvb2wuSmF2YUxhbmdPYmplY3RDb25zdGFudFBvb2xOYW1lKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VOb0NsYXNzRGVmRm91bmRFcnJvclN0cmluZ0NvbnN0cnVjdG9yKCkgewotICAgIHN1cGVyLmludm9rZU5vQ2xhc3NEZWZGb3VuZEVycm9yU3RyaW5nQ29uc3RydWN0b3IoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5pbml0aWFsaXplUmVjZWl2ZXIoKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07IC8vIHJlbW92ZSB0aGUgdG9wIG9mIHN0YWNrCi0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlT2JqZWN0R2V0Q2xhc3MoKSB7Ci0gICAgc3VwZXIuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0NsYXNzLCBDb25zdGFudFBvb2wuSmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZXNwZWNpYWwoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0gICAgc3VwZXIuaW52b2tlc3BlY2lhbChtZXRob2RCaW5kaW5nKTsKLSAgICAvLyBpbml0aWFsaXplIHRvIDAgc2luY2Ugd2Ugd2lsbCBtYW51YWxseSByZW1vdmUgJ3RoaXMnCi0gICAgaW50IGFyZ0NvdW50ID0gMDsKLSAgICBpZiAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKLSAgICAgICAgZmluYWwgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0gICAgICAgIGlmIChkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKSkgewotICAgICAgICAgICAgLy8gZW5jbG9zaW5nIGluc3RhbmNlcwotICAgICAgICAgICAgVHlwZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpOwotICAgICAgICAgICAgaWYgKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ0NvdW50ICs9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3V0ZXIgbG9jYWwgdmFyaWFibGVzCi0gICAgICAgICAgICBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7Ci0gICAgICAgICAgICBpZiAoc3ludGhldGljQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdDb3VudCArPSBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgewotICAgICAgICAgICAgYXJnQ291bnQgKz0gMjsKLSAgICAgICAgfQotICAgICAgICBhcmdDb3VudCArPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOwotICAgICAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IChhcmdDb3VudCArIDEpKSB7Ci0JICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gYXJnQ291bnQ7Ci0JICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5pbml0aWFsaXplUmVjZWl2ZXIoKTsKLQkgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOyAvLyByZW1vdmUgdGhlIHRvcCBvZiBzdGFjawotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXJnQ291bnQgPSAxOwotICAgICAgICBhcmdDb3VudCArPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOwotICAgICAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IGFyZ0NvdW50KSB7Ci0gICAgICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gYXJnQ291bnQ7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBpZiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlICE9IFR5cGVCaW5kaW5nLlZPSUQpIHsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpOwotICAgICAgICB9Ci0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlc3RhdGljKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotICAgIHN1cGVyLmludm9rZXN0YXRpYyhtZXRob2RCaW5kaW5nKTsKLQlpbnQgcGFyYW1ldGVyc0xlbmd0aCA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSBwYXJhbWV0ZXJzTGVuZ3RoKSB7Ci0JCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPSBwYXJhbWV0ZXJzTGVuZ3RoOwotICAgIH0KLSAgICBpZiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlICE9IFR5cGVCaW5kaW5nLlZPSUQpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvbkFwcGVuZEZvclR5cGUoaW50IHR5cGVJRCkgewotICAgIHN1cGVyLmludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25BcHBlbmRGb3JUeXBlKHR5cGVJRCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25EZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0gICAgLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oKVYKLSAgICBzdXBlci5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uRGVmYXVsdENvbnN0cnVjdG9yKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLmluaXRpYWxpemVSZWNlaXZlcigpOwotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsgLy8gcmVtb3ZlIHRoZSB0b3Agb2Ygc3RhY2sKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uU3RyaW5nQ29uc3RydWN0b3IoKSB7Ci0gICAgc3VwZXIuaW52b2tlU3RyaW5nQ29uY2F0ZW5hdGlvblN0cmluZ0NvbnN0cnVjdG9yKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0JICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOyAvLyByZW1vdmUgYXJndW1lbnQKLQkgICAgdGhpcy5jdXJyZW50RnJhbWUuaW5pdGlhbGl6ZVJlY2VpdmVyKCk7Ci0JICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOyAvLyByZW1vdmUgdGhlIHRvcCBvZiBzdGFjawotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZVN0cmluZ0NvbmNhdGVuYXRpb25Ub1N0cmluZygpIHsKLSAgICBzdXBlci5pbnZva2VTdHJpbmdDb25jYXRlbmF0aW9uVG9TdHJpbmcoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZywgQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaW52b2tlU3RyaW5nVmFsdWVPZihpbnQgdHlwZUlEKSB7Ci0gICAgc3VwZXIuaW52b2tlU3RyaW5nVmFsdWVPZih0eXBlSUQpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nLCBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2VTeXN0ZW1BcnJheWNvcHkoKSB7Ci0gICAgc3VwZXIuaW52b2tlU3lzdGVtQXJyYXljb3B5KCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSA1KSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPSA1OwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGludm9rZVRocm93YWJsZUdldE1lc3NhZ2UoKSB7Ci0gICAgc3VwZXIuaW52b2tlVGhyb3dhYmxlR2V0TWVzc2FnZSgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbbnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nLCBDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpbnZva2V2aXJ0dWFsKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotICAgIHN1cGVyLmludm9rZXZpcnR1YWwobWV0aG9kQmluZGluZyk7Ci0gICAgaW50IGFyZ0NvdW50ID0gMTsKLSAgICBhcmdDb3VudCArPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gYXJnQ291bnQpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IGFyZ0NvdW50OwotICAgIH0KLSAgICBpZiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlICE9IFR5cGVCaW5kaW5nLlZPSUQpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgaW9yKCkgewotICAgIHN1cGVyLmlvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBpcmVtKCkgewotICAgIHN1cGVyLmlyZW0oKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXJldHVybigpIHsKLSAgICBzdXBlci5pcmV0dXJuKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLSAgICB0aGlzLmZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCBpc2hsKCkgewotICAgIHN1cGVyLmlzaGwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXNocigpIHsKLSAgICBzdXBlci5pc2hyKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGlzdG9yZShpbnQgaUFyZykgewotICAgIHN1cGVyLmlzdG9yZShpQXJnKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbChpQXJnLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXN0b3JlXzAoKSB7Ci0gICAgc3VwZXIuaXN0b3JlXzAoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgwLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXN0b3JlXzEoKSB7Ci0gICAgc3VwZXIuaXN0b3JlXzEoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgxLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXN0b3JlXzIoKSB7Ci0gICAgc3VwZXIuaXN0b3JlXzIoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgyLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXN0b3JlXzMoKSB7Ci0gICAgc3VwZXIuaXN0b3JlXzMoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgzLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgaXN1YigpIHsKLSAgICBzdXBlci5pc3ViKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGl1c2hyKCkgewotICAgIHN1cGVyLml1c2hyKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGl4b3IoKSB7Ci0gICAgc3VwZXIuaXhvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsMmQoKSB7Ci0gICAgc3VwZXIubDJkKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5ET1VCTEUpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGwyZigpIHsKLSAgICBzdXBlci5sMmYoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVCaW5kaW5nLkZMT0FUKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsMmkoKSB7Ci0gICAgc3VwZXIubDJpKCk7Ci0gICAgaW50IG51bWJlck9mU3RhY2tJdGVtcyA9IHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtczsKLSAgICBpZiAobnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlQmluZGluZy5JTlQpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGxhZGQoKSB7Ci0gICAgc3VwZXIubGFkZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsYWxvYWQoKSB7Ci0gICAgc3VwZXIubGFsb2FkKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZXBsYWNlV2l0aEVsZW1lbnRUeXBlKCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgbGFuZCgpIHsKLSAgICBzdXBlci5sYW5kKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGxhc3RvcmUoKSB7Ci0gICAgc3VwZXIubGFzdG9yZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMykgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMzsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsY21wKCkgewotICAgIHN1cGVyLmxjbXAoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDIpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLnN0YWNrSXRlbXNbdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC0gMV0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUJpbmRpbmcuSU5UKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsY29uc3RfMCgpIHsKLSAgICBzdXBlci5sY29uc3RfMCgpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShUeXBlQmluZGluZy5MT05HKTsKLX0KLXB1YmxpYyB2b2lkIGxjb25zdF8xKCkgewotICAgIHN1cGVyLmxjb25zdF8xKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLkxPTkcpOwotfQotcHVibGljIHZvaWQgbGRjKGZsb2F0IGNvbnN0YW50KSB7Ci0gICAgc3VwZXIubGRjKGNvbnN0YW50KTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRkxPQVQpOwotfQotcHVibGljIHZvaWQgbGRjKGludCBjb25zdGFudCkgewotICAgIHN1cGVyLmxkYyhjb25zdGFudCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci19Ci1wdWJsaWMgdm9pZCBsZGMoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLSAgICBzdXBlci5sZGModHlwZUJpbmRpbmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh0eXBlQmluZGluZyk7Ci19Ci1wdWJsaWMgdm9pZCBsZGMyX3coZG91YmxlIGNvbnN0YW50KSB7Ci0gICAgc3VwZXIubGRjMl93KGNvbnN0YW50KTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuRE9VQkxFKTsKLX0KLXB1YmxpYyB2b2lkIGxkYzJfdyhsb25nIGNvbnN0YW50KSB7Ci0gICAgc3VwZXIubGRjMl93KGNvbnN0YW50KTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oVHlwZUJpbmRpbmcuTE9ORyk7Ci19Ci1wdWJsaWMgdm9pZCBsZGNGb3JJbmRleChpbnQgaW5kZXgsIGNoYXJbXSBjb25zdGFudCkgewotICAgIHN1cGVyLmxkY0ZvckluZGV4KGluZGV4LCBjb25zdGFudCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcsIENvbnN0YW50UG9vbC5KYXZhTGFuZ1N0cmluZ0NvbnN0YW50UG9vbE5hbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGxkaXYoKSB7Ci0gICAgc3VwZXIubGRpdigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBsbG9hZChpbnQgaUFyZykgewotICAgIHN1cGVyLmxsb2FkKGlBcmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbChpQXJnLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgbGxvYWRfMCgpIHsKLSAgICBzdXBlci5sbG9hZF8wKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDAsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBsbG9hZF8xKCkgewotICAgIHN1cGVyLmxsb2FkXzEoKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0oZ2V0TG9jYWwoMSwgdGhpcy5jdXJyZW50RnJhbWUpKTsKLX0KLXB1YmxpYyB2b2lkIGxsb2FkXzIoKSB7Ci0gICAgc3VwZXIubGxvYWRfMigpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShnZXRMb2NhbCgyLCB0aGlzLmN1cnJlbnRGcmFtZSkpOwotfQotcHVibGljIHZvaWQgbGxvYWRfMygpIHsKLSAgICBzdXBlci5sbG9hZF8zKCk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKGdldExvY2FsKDMsIHRoaXMuY3VycmVudEZyYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCBsbXVsKCkgewotICAgIHN1cGVyLmxtdWwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbG9va3Vwc3dpdGNoKENhc2VMYWJlbCBkZWZhdWx0TGFiZWwsIGludFtdIGtleXMsIGludFtdIHNvcnRlZEluZGV4ZXMsIENhc2VMYWJlbFtdIGNhc2VzTGFiZWwpIHsKLSAgICBzdXBlci5sb29rdXBzd2l0Y2goZGVmYXVsdExhYmVsLCBrZXlzLCBzb3J0ZWRJbmRleGVzLCBjYXNlc0xhYmVsKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbG9yKCkgewotICAgIHN1cGVyLmxvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBscmVtKCkgewotICAgIHN1cGVyLmxyZW0oKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHJldHVybigpIHsKLSAgICBzdXBlci5scmV0dXJuKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLSAgICB0aGlzLmZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCBsc2hsKCkgewotICAgIHN1cGVyLmxzaGwoKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IDEpIHsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHNocigpIHsKLSAgICBzdXBlci5sc2hyKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgCXRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGxzdG9yZShpbnQgaUFyZykgewotICAgIHN1cGVyLmxzdG9yZShpQXJnKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbChpQXJnLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHN0b3JlXzAoKSB7Ci0gICAgc3VwZXIubHN0b3JlXzAoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgwLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHN0b3JlXzEoKSB7Ci0gICAgc3VwZXIubHN0b3JlXzEoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgxLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHN0b3JlXzIoKSB7Ci0gICAgc3VwZXIubHN0b3JlXzIoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgyLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHN0b3JlXzMoKSB7Ci0gICAgc3VwZXIubHN0b3JlXzMoKTsKLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5wdXRMb2NhbCgzLCB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdKTsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zLS07Ci0gICAgfQotfQotcHVibGljIHZvaWQgbHN1YigpIHsKLSAgICBzdXBlci5sc3ViKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGx1c2hyKCkgewotICAgIHN1cGVyLmx1c2hyKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIGx4b3IoKSB7Ci0gICAgc3VwZXIubHhvcigpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBtb25pdG9yZW50ZXIoKSB7Ci0gICAgc3VwZXIubW9uaXRvcmVudGVyKCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIG1vbml0b3JleGl0KCkgewotICAgIHN1cGVyLm1vbml0b3JleGl0KCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIG11bHRpYW5ld2FycmF5KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBpbnQgZGltZW5zaW9ucykgewotICAgIHN1cGVyLm11bHRpYW5ld2FycmF5KHR5cGVCaW5kaW5nLCBkaW1lbnNpb25zKTsKLSAgICBpZiAodGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zID49IGRpbWVuc2lvbnMpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zIC09IGRpbWVuc2lvbnM7Ci0gICAgfQotICAgIGNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW2RpbWVuc2lvbnNdOwotICAgIGZvciAoaW50IGkgPSBkaW1lbnNpb25zIC0gMTsgaSA+PSAwOyBpLS0pIGJyYWNrZXRzW2ldID0gJ1snOwotICAgIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoYnJhY2tldHMsIHR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyh0eXBlQmluZGluZy5pZCwgY29uc3RhbnRQb29sTmFtZSkpOwotfQotLy8gV2UgZGlkbid0IGNhbGwgaXQgbmV3LCBiZWNhdXNlIHRoZXJlIGlzIGEgY29uZmxpdCB3aXRoIHRoZSBuZXcga2V5d29yZAotcHVibGljIHZvaWQgbmV3XyhUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotICAgIGludCBwYyA9IHRoaXMucG9zaXRpb247Ci0gICAgc3VwZXIubmV3Xyh0eXBlQmluZGluZyk7Ci0gICAgZmluYWwgVmVyaWZpY2F0aW9uVHlwZUluZm8gdmVyaWZpY2F0aW9uVHlwZUluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCB0eXBlQmluZGluZyk7Ci0gICAgdmVyaWZpY2F0aW9uVHlwZUluZm8ub2Zmc2V0ID0gcGM7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKHZlcmlmaWNhdGlvblR5cGVJbmZvKTsKLX0KLXB1YmxpYyB2b2lkIG5ld2FycmF5KGludCBhcnJheV9UeXBlKSB7Ci0gICAgc3VwZXIubmV3YXJyYXkoYXJyYXlfVHlwZSk7Ci0gICAgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUgPSBudWxsOwotICAgIHN3aXRjaCAoYXJyYXlfVHlwZSkgewotICAgICAgICBjYXNlIENsYXNzRmlsZUNvbnN0YW50cy5JTlRfQVJSQVkgOgotICAgICAgICAgICAgY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW10geyAnWycsICdJJyB9OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkJZVEVfQVJSQVkgOgotICAgICAgICAgICAgY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW10geyAnWycsICdCJyB9OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkJPT0xFQU5fQVJSQVkgOgotICAgICAgICAgICAgY29uc3RhbnRQb29sTmFtZSA9IG5ldyBjaGFyW10geyAnWycsICdaJyB9OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLlNIT1JUX0FSUkFZIDoKLSAgICAgICAgICAgIGNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnUycgfTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENsYXNzRmlsZUNvbnN0YW50cy5DSEFSX0FSUkFZIDoKLSAgICAgICAgICAgIGNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnQycgfTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENsYXNzRmlsZUNvbnN0YW50cy5MT05HX0FSUkFZIDoKLSAgICAgICAgICAgIGNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnSicgfTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENsYXNzRmlsZUNvbnN0YW50cy5GTE9BVF9BUlJBWSA6Ci0gICAgICAgICAgICBjb25zdGFudFBvb2xOYW1lID0gbmV3IGNoYXJbXSB7ICdbJywgJ0YnIH07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuRE9VQkxFX0FSUkFZIDoKLSAgICAgICAgICAgIGNvbnN0YW50UG9vbE5hbWUgPSBuZXcgY2hhcltdIHsgJ1snLCAnRCcgfTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpbnQgbnVtYmVyT2ZTdGFja0l0ZW1zID0gdGhpcy5jdXJyZW50RnJhbWUubnVtYmVyT2ZTdGFja0l0ZW1zOwotICAgIGlmIChudW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCwgY29uc3RhbnRQb29sTmFtZSk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgbmV3SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsKLSAgICBpbnQgcGMgPSB0aGlzLnBvc2l0aW9uOwotICAgIHN1cGVyLm5ld0phdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKLSAgICBmaW5hbCBWZXJpZmljYXRpb25UeXBlSW5mbyB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdBc3NlcnRpb25FcnJvciwgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCBDb25zdGFudFBvb2wuSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0YW50UG9vbE5hbWUpOwotICAgIHZlcmlmaWNhdGlvblR5cGVJbmZvLm9mZnNldCA9IHBjOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh2ZXJpZmljYXRpb25UeXBlSW5mbyk7Ci19Ci1wdWJsaWMgdm9pZCBuZXdKYXZhTGFuZ0Vycm9yKCkgewotICAgIGludCBwYyA9IHRoaXMucG9zaXRpb247Ci0gICAgc3VwZXIubmV3SmF2YUxhbmdFcnJvcigpOwotICAgIGZpbmFsIFZlcmlmaWNhdGlvblR5cGVJbmZvIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0Vycm9yLCBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0Vycm9yQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgdmVyaWZpY2F0aW9uVHlwZUluZm8ub2Zmc2V0ID0gcGM7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKHZlcmlmaWNhdGlvblR5cGVJbmZvKTsKLX0KLXB1YmxpYyB2b2lkIG5ld05vQ2xhc3NEZWZGb3VuZEVycm9yKCkgewotICAgIGludCBwYyA9IHRoaXMucG9zaXRpb247Ci0gICAgc3VwZXIubmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKTsKLSAgICBmaW5hbCBWZXJpZmljYXRpb25UeXBlSW5mbyB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdOb0NsYXNzRGVmRXJyb3IsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCwgQ29uc3RhbnRQb29sLkphdmFMYW5nTm9DbGFzc0RlZkZvdW5kRXJyb3JDb25zdGFudFBvb2xOYW1lKTsKLSAgICB2ZXJpZmljYXRpb25UeXBlSW5mby5vZmZzZXQgPSBwYzsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0odmVyaWZpY2F0aW9uVHlwZUluZm8pOwotfQotcHVibGljIHZvaWQgbmV3U3RyaW5nQ29udGF0ZW5hdGlvbigpIHsKLSAgICBpbnQgcGMgPSB0aGlzLnBvc2l0aW9uOwotICAgIHN1cGVyLm5ld1N0cmluZ0NvbnRhdGVuYXRpb24oKTsKLSAgICAvLyBpbiAxLjYsIHN0cmluZyBjb25jYXRlbmF0aW9uIHVzZXMgU3RyaW5nQnVpbGRlcgotICAgIGZpbmFsIFZlcmlmaWNhdGlvblR5cGVJbmZvIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZ0J1aWxkZXIsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCwgQ29uc3RhbnRQb29sLkphdmFMYW5nU3RyaW5nQnVpbGRlckNvbnN0YW50UG9vbE5hbWUpOwotICAgIHZlcmlmaWNhdGlvblR5cGVJbmZvLm9mZnNldCA9IHBjOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh2ZXJpZmljYXRpb25UeXBlSW5mbyk7Ci19Ci1wdWJsaWMgdm9pZCBuZXdXcmFwcGVyRm9yKGludCB0eXBlSUQpIHsKLSAgICBpbnQgcGMgPSB0aGlzLnBvc2l0aW9uOwotICAgIHN1cGVyLm5ld1dyYXBwZXJGb3IodHlwZUlEKTsKLSAgICBWZXJpZmljYXRpb25UeXBlSW5mbyB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlSUQpIHsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfaW50IDogLy8gbmV3OiBqYXZhLmxhbmcuSW50ZWdlcgotICAgICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZUluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nSW50ZWdlciwgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCBDb25zdGFudFBvb2wuSmF2YUxhbmdJbnRlZ2VyQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0odmVyaWZpY2F0aW9uVHlwZUluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOiAvLyBuZXc6IGphdmEubGFuZy5Cb29sZWFuCi0gICAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdCb29sZWFuLCBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0Jvb2xlYW5Db25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh2ZXJpZmljYXRpb25UeXBlSW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUeXBlSWRzLlRfYnl0ZSA6IC8vIG5ldzogamF2YS5sYW5nLkJ5dGUKLSAgICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0J5dGUsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCwgQ29uc3RhbnRQb29sLkphdmFMYW5nQnl0ZUNvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKHZlcmlmaWNhdGlvblR5cGVJbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9jaGFyIDogLy8gbmV3OiBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0gICAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdDaGFyYWN0ZXIsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCwgQ29uc3RhbnRQb29sLkphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0odmVyaWZpY2F0aW9uVHlwZUluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2Zsb2F0IDogLy8gbmV3OiBqYXZhLmxhbmcuRmxvYXQKLSAgICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFR5cGVJZHMuVF9KYXZhTGFuZ0Zsb2F0LCBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0Zsb2F0Q29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0odmVyaWZpY2F0aW9uVHlwZUluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6IC8vIG5ldzogamF2YS5sYW5nLkRvdWJsZQotICAgICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZUluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nRG91YmxlLCBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKHZlcmlmaWNhdGlvblR5cGVJbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9zaG9ydCA6IC8vIG5ldzogamF2YS5sYW5nLlNob3J0Ci0gICAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdTaG9ydCwgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCBDb25zdGFudFBvb2wuSmF2YUxhbmdTaG9ydENvbnN0YW50UG9vbE5hbWUpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKHZlcmlmaWNhdGlvblR5cGVJbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFR5cGVJZHMuVF9sb25nIDogLy8gbmV3OiBqYXZhLmxhbmcuTG9uZwotICAgICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZUluZm8gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8oVHlwZUlkcy5UX0phdmFMYW5nTG9uZywgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVELCBDb25zdGFudFBvb2wuSmF2YUxhbmdMb25nQ29uc3RhbnRQb29sTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5hZGRTdGFja0l0ZW0odmVyaWZpY2F0aW9uVHlwZUluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVHlwZUlkcy5UX3ZvaWQgOiAvLyBuZXc6IGphdmEubGFuZy5Wb2lkCi0gICAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlSW5mbyA9IG5ldyBWZXJpZmljYXRpb25UeXBlSW5mbyhUeXBlSWRzLlRfSmF2YUxhbmdWb2lkLCBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1VOSU5JVElBTElaRUQsIENvbnN0YW50UG9vbC5KYXZhTGFuZ1ZvaWRDb25zdGFudFBvb2xOYW1lKTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbSh2ZXJpZmljYXRpb25UeXBlSW5mbyk7Ci0gICAgfQotICAgIGlmICh2ZXJpZmljYXRpb25UeXBlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgIHZlcmlmaWNhdGlvblR5cGVJbmZvLm9mZnNldCA9IHBjOwotICAgIH0KK3B1YmxpYyB2b2lkIGFkZEZyYW1lUG9zaXRpb24oaW50IHBjKSB7CisJSW50ZWdlciBuZXdFbnRyeSA9IG5ldyBJbnRlZ2VyKHBjKTsKKwlGcmFtZVBvc2l0aW9uIHZhbHVlOworCWlmICgodmFsdWUgPSAoRnJhbWVQb3NpdGlvbikgdGhpcy5mcmFtZVBvc2l0aW9ucy5nZXQobmV3RW50cnkpKSAhPSBudWxsKSB7CisJCXZhbHVlLmNvdW50ZXIrKzsKKwl9IGVsc2UgeworCQl0aGlzLmZyYW1lUG9zaXRpb25zLnB1dChuZXdFbnRyeSwgbmV3IEZyYW1lUG9zaXRpb24oKSk7CisJfQogfQogcHVibGljIHZvaWQgb3B0aW1pemVCcmFuY2goaW50IG9sZFBvc2l0aW9uLCBCcmFuY2hMYWJlbCBsYmwpIHsKLSAgICBzdXBlci5vcHRpbWl6ZUJyYW5jaChvbGRQb3NpdGlvbiwgbGJsKTsKLSAgICBpbnQgZnJhbWVJbmRleCA9IHRoaXMuZnJhbWVzLnNpemUoKSAtIDE7Ci0gICAgbG9vcDogd2hpbGUoZnJhbWVJbmRleCA+IDApIHsKLSAgICAgICAgU3RhY2tNYXBGcmFtZSBmcmFtZSA9IChTdGFja01hcEZyYW1lKSB0aGlzLmZyYW1lcy5nZXQoZnJhbWVJbmRleCk7Ci0gICAgICAgIGlmIChmcmFtZS5wYyA9PSBvbGRQb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKHRoaXMuZnJhbWVQb3NpdGlvbnMucmVtb3ZlKG5ldyBJbnRlZ2VyKG9sZFBvc2l0aW9uKSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy52YXJpYWJsZXNNb2RpZmljYXRpb25zUG9zaXRpb25zLnJlbW92ZShuZXcgSW50ZWdlcihvbGRQb3NpdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZXNNb2RpZmljYXRpb25zUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcih0aGlzLnBvc2l0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZS5wYyA9IHRoaXMucG9zaXRpb247Ci0gICAgICAgICAgICBTdGFja01hcEZyYW1lIHByZXZpb3VzRnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgdGhpcy5mcmFtZXMuZ2V0KGZyYW1lSW5kZXggLSAxKTsKLSAgICAgICAgICAgIGlmIChwcmV2aW91c0ZyYW1lLnBjID09IHRoaXMucG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgZnJhbWUKLSAgICAgICAgICAgICAgICB0aGlzLmZyYW1lcy5zZXQoZnJhbWVJbmRleCAtIDEsIGZyYW1lKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZyYW1lcy5yZW1vdmUoZnJhbWVJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhayBsb29wOwotICAgICAgICB9IGVsc2UgaWYgKGZyYW1lLnBjID4gb2xkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmcmFtZUluZGV4LS07Ci0gICAgfQorCXN1cGVyLm9wdGltaXplQnJhbmNoKG9sZFBvc2l0aW9uLCBsYmwpOworCXJlbW92ZUZyYW1lUG9zaXRpb24ob2xkUG9zaXRpb24pOwogfQotcHVibGljIHZvaWQgcG9wKCkgewotICAgIHN1cGVyLnBvcCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9CitwdWJsaWMgdm9pZCByZW1vdmVGcmFtZVBvc2l0aW9uKGludCBwYykgeworCUludGVnZXIgZW50cnkgPSBuZXcgSW50ZWdlcihwYyk7CisJRnJhbWVQb3NpdGlvbiB2YWx1ZTsKKwlpZiAoKHZhbHVlID0gKEZyYW1lUG9zaXRpb24pIHRoaXMuZnJhbWVQb3NpdGlvbnMuZ2V0KGVudHJ5KSkgIT0gbnVsbCkgeworCQl2YWx1ZS5jb3VudGVyLS07CisJCWlmICh2YWx1ZS5jb3VudGVyIDw9IDApIHsKKwkJCXRoaXMuZnJhbWVQb3NpdGlvbnMucmVtb3ZlKGVudHJ5KTsKKwkJfQorCX0KIH0KLXB1YmxpYyB2b2lkIHBvcDIoKSB7Ci0gICAgc3VwZXIucG9wMigpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHN3aXRjaCh0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdLmlkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVHlwZUlkcy5UX2xvbmcgOgotICAgICAgICAgICAgY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyAtPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyB2b2lkIGFkZFZhcmlhYmxlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZykgeworCWlmIChsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25QQ3MgPT0gbnVsbCkgeworCQlyZWNvcmQobG9jYWxCaW5kaW5nKTsKKwl9CisJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyh0aGlzLnBvc2l0aW9uKTsKIH0KLXB1YmxpYyB2b2lkIHBvcFN0YXRlSW5kZXgoKSB7Ci0gICAgdGhpcy5zdGF0ZUluZGV4ZXNDb3VudGVyLS07Citwcml2YXRlIHZvaWQgYWRkU3RhY2tNYXJrZXIoaW50IHBjLCBpbnQgZGVzdGluYXRpb25QQykgeworCWlmICh0aGlzLnN0YWNrTWFya2VycyA9PSBudWxsKSB7CisJCXRoaXMuc3RhY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOworCQl0aGlzLnN0YWNrTWFya2Vycy5hZGQobmV3IFN0YWNrTWFya2VyKHBjLCBkZXN0aW5hdGlvblBDKSk7CisJfSBlbHNlIHsKKwkJaW50IHNpemUgPSB0aGlzLnN0YWNrTWFya2Vycy5zaXplKCk7CisJCWlmIChzaXplID09IDAgfHwgKChTdGFja01hcmtlcikgdGhpcy5zdGFja01hcmtlcnMuZ2V0KHNpemUgLSAxKSkucGMgIT0gdGhpcy5wb3NpdGlvbikgeworCQkJdGhpcy5zdGFja01hcmtlcnMuYWRkKG5ldyBTdGFja01hcmtlcihwYywgZGVzdGluYXRpb25QQykpOworCQl9CisJfQogfQotcHVibGljIHZvaWQgcHVzaE9uU3RhY2soVHlwZUJpbmRpbmcgYmluZGluZykgewotICAgIHN1cGVyLnB1c2hPblN0YWNrKGJpbmRpbmcpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLmFkZFN0YWNrSXRlbShiaW5kaW5nKTsKK3ByaXZhdGUgdm9pZCBhZGRTdGFja0RlcHRoTWFya2VyKGludCBwYywgaW50IGRlbHRhLCBUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCWlmICh0aGlzLnN0YWNrRGVwdGhNYXJrZXJzID09IG51bGwpIHsKKwkJdGhpcy5zdGFja0RlcHRoTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdGhpcy5zdGFja0RlcHRoTWFya2Vycy5hZGQobmV3IFN0YWNrRGVwdGhNYXJrZXIocGMsIGRlbHRhLCB0eXBlQmluZGluZykpOworCX0gZWxzZSB7CisJCWludCBzaXplID0gdGhpcy5zdGFja0RlcHRoTWFya2Vycy5zaXplKCk7CisJCWlmIChzaXplID09IDApIHsKKwkJCXRoaXMuc3RhY2tEZXB0aE1hcmtlcnMuYWRkKG5ldyBTdGFja0RlcHRoTWFya2VyKHBjLCBkZWx0YSwgdHlwZUJpbmRpbmcpKTsKKwkJfSBlbHNlIHsKKwkJCVN0YWNrRGVwdGhNYXJrZXIgc3RhY2tEZXB0aE1hcmtlciA9IChTdGFja0RlcHRoTWFya2VyKSB0aGlzLnN0YWNrRGVwdGhNYXJrZXJzLmdldChzaXplIC0gMSk7CisJCQlpZiAoc3RhY2tEZXB0aE1hcmtlci5wYyAhPSB0aGlzLnBvc2l0aW9uKSB7CisJCQkJdGhpcy5zdGFja0RlcHRoTWFya2Vycy5hZGQobmV3IFN0YWNrRGVwdGhNYXJrZXIocGMsIGRlbHRhLCB0eXBlQmluZGluZykpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBXZSByZXBsYWNlIHRoZSByZWNvcmRlZCBzdGFjayBkZXB0aCBtYXJrZXIgd2l0aCBhIG5ldyB2YWx1ZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiB0eXBlQmluZGluZworCQkJCS8vIFRoaXMgY2FzZSBjYW4gaGFwcGVuIHdoZW4gbXVsdGlwbGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhcmUgbmVzdGVkIHNlZSBidWcgMzYyNTkxCisJCQkJdGhpcy5zdGFja0RlcHRoTWFya2Vycy5zZXQoc2l6ZSAtIDEsIG5ldyBTdGFja0RlcHRoTWFya2VyKHBjLCBkZWx0YSwgdHlwZUJpbmRpbmcpKTsKKwkJCX0KKwkJfQorCX0KIH0KLXB1YmxpYyB2b2lkIHB1dGZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKLSAgICBzdXBlci5wdXRmaWVsZChmaWVsZEJpbmRpbmcpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMjsKLSAgICB9Ci19Ci0KLXB1YmxpYyB2b2lkIHB1c2hTdGF0ZUluZGV4KGludCBuYXR1cmFsRXhpdE1lcmdlSW5pdFN0YXRlSW5kZXgpIHsKLSAgICBpZiAodGhpcy5zdGF0ZUluZGV4ZXMgPT0gbnVsbCkgewotICAgICAgICB0aGlzLnN0YXRlSW5kZXhlcyA9IG5ldyBpbnRbM107Ci0gICAgfQotICAgIGludCBsZW5ndGggPSB0aGlzLnN0YXRlSW5kZXhlcy5sZW5ndGg7Ci0gICAgaWYgKGxlbmd0aCA9PSB0aGlzLnN0YXRlSW5kZXhlc0NvdW50ZXIpIHsKLSAgICAgICAgLy8gcmVzaXplCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5zdGF0ZUluZGV4ZXMsIDAsICh0aGlzLnN0YXRlSW5kZXhlcyA9IG5ldyBpbnRbbGVuZ3RoICogMl0pLCAwLCBsZW5ndGgpOwotICAgIH0KLSAgICB0aGlzLnN0YXRlSW5kZXhlc1t0aGlzLnN0YXRlSW5kZXhlc0NvdW50ZXIrK10gPSBuYXR1cmFsRXhpdE1lcmdlSW5pdFN0YXRlSW5kZXg7Ci19Ci1wdWJsaWMgdm9pZCBwdXRzdGF0aWMoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgewotICAgIHN1cGVyLnB1dHN0YXRpYyhmaWVsZEJpbmRpbmcpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMSkgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICB9CitwdWJsaWMgdm9pZCBkZWNyU3RhY2tTaXplKGludCBvZmZzZXQpIHsKKwlzdXBlci5kZWNyU3RhY2tTaXplKG9mZnNldCk7CisJYWRkU3RhY2tEZXB0aE1hcmtlcih0aGlzLnBvc2l0aW9uLCAtMSwgbnVsbCk7CiB9CiBwdWJsaWMgdm9pZCByZWNvcmRFeHByZXNzaW9uVHlwZShUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotICAgIHN1cGVyLnJlY29yZEV4cHJlc3Npb25UeXBlKHR5cGVCaW5kaW5nKTsKLSAgICB0aGlzLmN1cnJlbnRGcmFtZS5zZXRUb3BPZlN0YWNrKHR5cGVCaW5kaW5nKTsKKwlhZGRTdGFja0RlcHRoTWFya2VyKHRoaXMucG9zaXRpb24sIDAsIHR5cGVCaW5kaW5nKTsKIH0KLXB1YmxpYyB2b2lkIHJlbW92ZVZhcmlhYmxlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZykgewotICAgIHRoaXMuY3VycmVudEZyYW1lLnJlbW92ZUxvY2Fscyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbik7Ci0gICAgc3VwZXIucmVtb3ZlVmFyaWFibGUobG9jYWxCaW5kaW5nKTsKKy8qKgorICogTWFjcm8gZm9yIGJ1aWxkaW5nIGEgY2xhc3MgZGVzY3JpcHRvciBvYmplY3QKKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDbGFzc0xpdGVyYWxBY2Nlc3NGb3JUeXBlKFR5cGVCaW5kaW5nIGFjY2Vzc2VkVHlwZSwgRmllbGRCaW5kaW5nIHN5bnRoZXRpY0ZpZWxkQmluZGluZykgeworCWlmIChhY2Nlc3NlZFR5cGUuaXNCYXNlVHlwZSgpICYmIGFjY2Vzc2VkVHlwZSAhPSBUeXBlQmluZGluZy5OVUxMKSB7CisJCWdldFRZUEUoYWNjZXNzZWRUeXBlLmlkKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0aGlzLnRhcmdldExldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJLy8gZ2VuZXJhdGlvbiB1c2luZyB0aGUgbmV3IGxkY193IGJ5dGVjb2RlCisJCXRoaXMubGRjKGFjY2Vzc2VkVHlwZSk7CisJfSBlbHNlIHsKKwkJLy8gdXNlIGluIENMREMgbW9kZQorCQlCcmFuY2hMYWJlbCBlbmRMYWJlbCA9IG5ldyBCcmFuY2hMYWJlbCh0aGlzKTsKKwkJaWYgKHN5bnRoZXRpY0ZpZWxkQmluZGluZyAhPSBudWxsKSB7IC8vIG5vbiBpbnRlcmZhY2UgY2FzZQorCQkJZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBzeW50aGV0aWNGaWVsZEJpbmRpbmcsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQlkdXAoKTsKKwkJCWlmbm9ubnVsbChlbmRMYWJlbCk7CisJCQlwb3AoKTsKKwkJfQorCisJCS8qIE1hY3JvIGZvciBidWlsZGluZyBhIGNsYXNzIGRlc2NyaXB0b3Igb2JqZWN0Li4uIHVzaW5nIG9yIG5vdCBhIGZpZWxkIGNhY2hlIHRvIHN0b3JlIGl0IGludG8uLi4KKwkJdGhpcyBzZXF1ZW5jZSBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIGFjdHVhbCBjbGFzcyBkZXNjcmlwdG9yLgorCisJCUlmIHRoZSBmaWVsZENhY2hlIGlzIHNldCwgdGhlbiBpdCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgYm9keSBvZiBhIHN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kCisJCWZhY3RvcmluZyB0aGUgYWN0dWFsIGRlc2NyaXB0b3IgY3JlYXRpb24gb3V0IG9mIHRoZSBpbnZvY2F0aW9uIHNpdGUgKHNhdmluZyBzcGFjZSkuCisJCUlmIHRoZSBmaWVsZENhY2hlIGlzIG5pbCwgdGhlbiB3ZSBhcmUgZHVtcGluZyB0aGUgYnl0ZWNvZGUgb24gdGhlIGludm9jYXRpb24gc2l0ZSwgc2luY2UKKwkJd2UgaGF2ZSBubyB3YXkgdG8gZ2V0IGEgaGFuZCBvbiB0aGUgZmllbGQgY2FjaGUgdG8gZG8gYmV0dGVyLiAqLworCisKKwkJLy8gV3JhcCB0aGUgY29kZSBpbiBhbiBleGNlcHRpb24gaGFuZGxlciB0byBjb252ZXJ0IGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpbnRvIGEgTm9DbGFzc0RlZkVycm9yCisKKwkJRXhjZXB0aW9uTGFiZWwgY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkhhbmRsZXIgPSBuZXcgRXhjZXB0aW9uTGFiZWwodGhpcywgVHlwZUJpbmRpbmcuTlVMTCAvKnJlcHJlc2VudHMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiovKTsKKwkJY2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkhhbmRsZXIucGxhY2VTdGFydCgpOworCQl0aGlzLmxkYyhhY2Nlc3NlZFR5cGUgPT0gVHlwZUJpbmRpbmcuTlVMTCA/ICJqYXZhLmxhbmcuT2JqZWN0IiA6IFN0cmluZy52YWx1ZU9mKGFjY2Vzc2VkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsgLy8kTk9OLU5MUy0xJAorCQlpbnZva2VDbGFzc0Zvck5hbWUoKTsKKworCQkvKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3NTY1CisJCWlmIChhY2Nlc3NlZFR5cGUgPT0gQmFzZVR5cGVzLk51bGxCaW5kaW5nKSB7CisJCQl0aGlzLmxkYygiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoYWNjZXNzZWRUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCXRoaXMubGRjKFN0cmluZy52YWx1ZU9mKGFjY2Vzc2VkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHdlIG1ha2UgaXQgYW4gYXJyYXkgdHlwZSAodG8gYXZvaWQgY2xhc3MgaW5pdGlhbGl6YXRpb24pCisJCQl0aGlzLmxkYygiW0wiICsgU3RyaW5nLnZhbHVlT2YoYWNjZXNzZWRUeXBlLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykgKyAiOyIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQl9CisJCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJCWlmICghYWNjZXNzZWRUeXBlLmlzQXJyYXlUeXBlKCkpIHsgLy8gZXh0cmFjdCB0aGUgY29tcG9uZW50IHR5cGUsIHdoaWNoIGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUgY2xhc3MKKwkJCXRoaXMuaW52b2tlSmF2YUxhbmdDbGFzc0dldENvbXBvbmVudFR5cGUoKTsKKwkJfQorCQkqLworCQkvKiBXZSBuZWVkIHRvIHByb3RlY3QgdGhlIHJ1bnRpbWUgY29kZSBmcm9tIGJpbmFyeSBpbmNvbnNpc3RlbmNpZXMKKwkJaW4gY2FzZSB0aGUgYWNjZXNzZWRUeXBlIGlzIG1pc3NpbmcsIHRoZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGhhcyB0byBiZSBjb252ZXJ0ZWQKKwkJaW50byBhIE5vQ2xhc3NEZWZFcnJvcihvbGQgZXggbWVzc2FnZSksIHdlIHRodXMgbmVlZCB0byBidWlsZCBhbiBleGNlcHRpb24gaGFuZGxlciBmb3IgdGhpcyBvbmUuICovCisJCWNsYXNzTm90Rm91bmRFeGNlcHRpb25IYW5kbGVyLnBsYWNlRW5kKCk7CisKKwkJaWYgKHN5bnRoZXRpY0ZpZWxkQmluZGluZyAhPSBudWxsKSB7IC8vIG5vbiBpbnRlcmZhY2UgY2FzZQorCQkJZHVwKCk7CisJCQlmaWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19wdXRzdGF0aWMsIHN5bnRoZXRpY0ZpZWxkQmluZGluZywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsKKwkJfQorCQlpbnQgZnJvbVBDID0gdGhpcy5wb3NpdGlvbjsKKwkJZ290b18oZW5kTGFiZWwpOworCQlpbnQgc2F2ZWRTdGFja0RlcHRoID0gdGhpcy5zdGFja0RlcHRoOworCQkvLyBHZW5lcmF0ZSB0aGUgYm9keSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKKwkJLyogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBvbiBzdGFjayAtLSB0aGUgY2xhc3MgbGl0ZXJhbCBjb3VsZCBiZSBkb2luZyBtb3JlIHRoaW5ncworCQlvbiB0aGUgc3RhY2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN0YWNrIG1heSBub3QgYmUgZW1wdHkgYXQgdGhpcyBwb2ludCBpbiB0aGUKKwkJYWJvdmUgY29kZSBnZW4uIFNvIHdlIHNhdmUgaXRzIHN0YXRlIGFuZCByZXN0YXJ0IGl0IGZyb20gMS4gKi8KKworCQlwdXNoRXhjZXB0aW9uT25TdGFjayhUeXBlQmluZGluZy5OVUxMKTsvKnJlcHJlc2VudHMgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiovCisJCWNsYXNzTm90Rm91bmRFeGNlcHRpb25IYW5kbGVyLnBsYWNlKCk7CisKKwkJLy8gVHJhbnNmb3JtIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgYW5kIHJlcHVzaCBhbmQgdGhyb3cgYQorCQkvLyBOb0NsYXNzRGVmRm91bmRFcnJvcihDbGFzc05vdEZvdW5kLmdldE1lc3NhZ2UoKSkKKworCQluZXdOb0NsYXNzRGVmRm91bmRFcnJvcigpOworCQlkdXBfeDEoKTsKKwkJc3dhcCgpOworCisJCS8vIFJldHJpZXZlIHRoZSBtZXNzYWdlIGZyb20gdGhlIG9sZCBleGNlcHRpb24KKwkJaW52b2tlVGhyb3dhYmxlR2V0TWVzc2FnZSgpOworCisJCS8vIFNlbmQgdGhlIGNvbnN0cnVjdG9yIHRha2luZyBhIG1lc3NhZ2Ugc3RyaW5nIGFzIGFuIGFyZ3VtZW50CisJCWludm9rZU5vQ2xhc3NEZWZGb3VuZEVycm9yU3RyaW5nQ29uc3RydWN0b3IoKTsKKwkJYXRocm93KCk7CisJCWVuZExhYmVsLnBsYWNlKCk7CisJCWFkZFN0YWNrTWFya2VyKGZyb21QQywgdGhpcy5wb3NpdGlvbik7CisJCXRoaXMuc3RhY2tEZXB0aCA9IHNhdmVkU3RhY2tEZXB0aDsKKwl9Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZU91dGVyQWNjZXNzKE9iamVjdFtdIG1hcHBpbmdTZXF1ZW5jZSwgQVNUTm9kZSBpbnZvY2F0aW9uU2l0ZSwgQmluZGluZyB0YXJnZXQsIFNjb3BlIHNjb3BlKSB7CisJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMucG9zaXRpb247CisJc3VwZXIuZ2VuZXJhdGVPdXRlckFjY2VzcyhtYXBwaW5nU2VxdWVuY2UsIGludm9jYXRpb25TaXRlLCB0YXJnZXQsIHNjb3BlKTsKKwlpZiAoY3VycmVudFBvc2l0aW9uID09IHRoaXMucG9zaXRpb24pIHsKKwkJLy8gbm8gY29kZSBoYXMgYmVlbiBnZW5lcmF0ZSBkdXJpbmcgb3V0ZXIgYWNjZXNzID0+IG5vIGVuY2xvc2luZyBpbnN0YW5jZSBpcyBhdmFpbGFibGUKKwkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LCBudWxsKTsKKwl9Cit9CitwdWJsaWMgRXhjZXB0aW9uTWFya2VyW10gZ2V0RXhjZXB0aW9uTWFya2VycygpIHsKKwlTZXQgZXhjZXB0aW9uTWFya2VyU2V0ID0gdGhpcy5leGNlcHRpb25NYXJrZXJzOworCWlmICh0aGlzLmV4Y2VwdGlvbk1hcmtlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaW50IHNpemUgPSBleGNlcHRpb25NYXJrZXJTZXQuc2l6ZSgpOworCUV4Y2VwdGlvbk1hcmtlcltdIG1hcmtlcnMgPSBuZXcgRXhjZXB0aW9uTWFya2VyW3NpemVdOworCWludCBuID0gMDsKKwlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9uTWFya2VyU2V0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7CisJCW1hcmtlcnNbbisrXSA9IChFeGNlcHRpb25NYXJrZXIpIGl0ZXJhdG9yLm5leHQoKTsKKwl9CisJQXJyYXlzLnNvcnQobWFya2Vycyk7CisvLyAgU3lzdGVtLm91dC5wcmludCgnWycpOworLy8gIGZvciAoaW50IG4gPSAwOyBuIDwgc2l6ZTsgbisrKSB7CisvLyAgCWlmIChuICE9IDApIFN5c3RlbS5vdXQucHJpbnQoJywnKTsKKy8vICAJU3lzdGVtLm91dC5wcmludChwb3NpdGlvbnNbbl0pOworLy8gIH0KKy8vICBTeXN0ZW0ub3V0LnByaW50bG4oJ10nKTsKKwlyZXR1cm4gbWFya2VyczsKK30KK3B1YmxpYyBpbnRbXSBnZXRGcmFtZVBvc2l0aW9ucygpIHsKKwlTZXQgc2V0ID0gdGhpcy5mcmFtZVBvc2l0aW9ucy5rZXlTZXQoKTsKKwlpbnQgc2l6ZSA9IHNldC5zaXplKCk7CisJaW50W10gcG9zaXRpb25zID0gbmV3IGludFtzaXplXTsKKwlpbnQgbiA9IDA7CisJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgeworCQlwb3NpdGlvbnNbbisrXSA9ICgoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpKS5pbnRWYWx1ZSgpOworCX0KKwlBcnJheXMuc29ydChwb3NpdGlvbnMpOworLy8gIFN5c3RlbS5vdXQucHJpbnQoJ1snKTsKKy8vICBmb3IgKGludCBuID0gMDsgbiA8IHNpemU7IG4rKykgeworLy8gIAlpZiAobiAhPSAwKSBTeXN0ZW0ub3V0LnByaW50KCcsJyk7CisvLyAgCVN5c3RlbS5vdXQucHJpbnQocG9zaXRpb25zW25dKTsKKy8vICB9CisvLyAgU3lzdGVtLm91dC5wcmludGxuKCddJyk7CisJcmV0dXJuIHBvc2l0aW9uczsKK30KK3B1YmxpYyBTdGFja0RlcHRoTWFya2VyW10gZ2V0U3RhY2tEZXB0aE1hcmtlcnMoKSB7CisJaWYgKHRoaXMuc3RhY2tEZXB0aE1hcmtlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaW50IGxlbmd0aCA9IHRoaXMuc3RhY2tEZXB0aE1hcmtlcnMuc2l6ZSgpOworCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisJU3RhY2tEZXB0aE1hcmtlcltdIHJlc3VsdCA9IG5ldyBTdGFja0RlcHRoTWFya2VyW2xlbmd0aF07CisJdGhpcy5zdGFja0RlcHRoTWFya2Vycy50b0FycmF5KHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK3B1YmxpYyBTdGFja01hcmtlcltdIGdldFN0YWNrTWFya2VycygpIHsKKwlpZiAodGhpcy5zdGFja01hcmtlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaW50IGxlbmd0aCA9IHRoaXMuc3RhY2tNYXJrZXJzLnNpemUoKTsKKwlpZiAobGVuZ3RoID09IDApIHJldHVybiBudWxsOworCVN0YWNrTWFya2VyW10gcmVzdWx0ID0gbmV3IFN0YWNrTWFya2VyW2xlbmd0aF07CisJdGhpcy5zdGFja01hcmtlcnMudG9BcnJheShyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgYm9vbGVhbiBoYXNGcmFtZVBvc2l0aW9ucygpIHsKKwlyZXR1cm4gdGhpcy5mcmFtZVBvc2l0aW9ucy5zaXplKCkgIT0gMDsKK30KK3B1YmxpYyB2b2lkIGluaXQoQ2xhc3NGaWxlIHRhcmdldENsYXNzRmlsZSkgeworCXN1cGVyLmluaXQodGFyZ2V0Q2xhc3NGaWxlKTsKKwl0aGlzLnN0YXRlSW5kZXhlc0NvdW50ZXIgPSAwOworCWlmICh0aGlzLmZyYW1lUG9zaXRpb25zICE9IG51bGwpIHsKKwkJdGhpcy5mcmFtZVBvc2l0aW9ucy5jbGVhcigpOworCX0KKwlpZiAodGhpcy5leGNlcHRpb25NYXJrZXJzICE9IG51bGwpIHsKKwkJdGhpcy5leGNlcHRpb25NYXJrZXJzLmNsZWFyKCk7CisJfQorCWlmICh0aGlzLnN0YWNrRGVwdGhNYXJrZXJzICE9IG51bGwpIHsKKwkJdGhpcy5zdGFja0RlcHRoTWFya2Vycy5jbGVhcigpOworCX0KKwlpZiAodGhpcy5zdGFja01hcmtlcnMgIT0gbnVsbCkgeworCQl0aGlzLnN0YWNrTWFya2Vycy5jbGVhcigpOworCX0KK30KKworcHVibGljIHZvaWQgaW5pdGlhbGl6ZU1heExvY2FscyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwlzdXBlci5pbml0aWFsaXplTWF4TG9jYWxzKG1ldGhvZEJpbmRpbmcpOworCWlmICh0aGlzLmZyYW1lUG9zaXRpb25zID09IG51bGwpIHsKKwkJdGhpcy5mcmFtZVBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5mcmFtZVBvc2l0aW9ucy5jbGVhcigpOworCX0KK30KK3B1YmxpYyB2b2lkIHBvcFN0YXRlSW5kZXgoKSB7CisJdGhpcy5zdGF0ZUluZGV4ZXNDb3VudGVyLS07Cit9CitwdWJsaWMgdm9pZCBwdXNoU3RhdGVJbmRleChpbnQgbmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4KSB7CisJaWYgKHRoaXMuc3RhdGVJbmRleGVzID09IG51bGwpIHsKKwkJdGhpcy5zdGF0ZUluZGV4ZXMgPSBuZXcgaW50WzNdOworCX0KKwlpbnQgbGVuZ3RoID0gdGhpcy5zdGF0ZUluZGV4ZXMubGVuZ3RoOworCWlmIChsZW5ndGggPT0gdGhpcy5zdGF0ZUluZGV4ZXNDb3VudGVyKSB7CisJCS8vIHJlc2l6ZQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RhdGVJbmRleGVzLCAwLCAodGhpcy5zdGF0ZUluZGV4ZXMgPSBuZXcgaW50W2xlbmd0aCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwl9CisJdGhpcy5zdGF0ZUluZGV4ZXNbdGhpcy5zdGF0ZUluZGV4ZXNDb3VudGVyKytdID0gbmF0dXJhbEV4aXRNZXJnZUluaXRTdGF0ZUluZGV4OwogfQogcHVibGljIHZvaWQgcmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKFNjb3BlIHNjb3BlLCBpbnQgaW5pdFN0YXRlSW5kZXgpIHsKLSAgICBpbnQgaW5kZXggPSB0aGlzLnZpc2libGVMb2NhbHNDb3VudDsKLSAgICBsb29wIDogZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICAgIExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IHZpc2libGVMb2NhbHNbaV07Ci0gICAgICAgIGlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCAmJiBsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQgPSBpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgaW5pdFN0YXRlSW5kZXgsIGxvY2FsQmluZGluZyk7Ci0gICAgICAgICAgICBpZiAoIWlzRGVmaW5pdGVseUFzc2lnbmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVJbmRleGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIG1heCA9IHRoaXMuc3RhdGVJbmRleGVzQ291bnRlcjsgaiA8IG1heDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbml0ZWx5QXNzaWduZWQoc2NvcGUsIHRoaXMuc3RhdGVJbmRleGVzW2pdLCBsb2NhbEJpbmRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZW1vdmVMb2NhbHMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBJbnRlZ2VyIG5ld1ZhbHVlID0gbmV3IEludGVnZXIodGhpcy5wb3NpdGlvbik7Ci0gICAgaWYgKHRoaXMudmFyaWFibGVzTW9kaWZpY2F0aW9uc1Bvc2l0aW9ucy5zaXplKCkgPT0gMCB8fCAhdGhpcy52YXJpYWJsZXNNb2RpZmljYXRpb25zUG9zaXRpb25zLmdldCh0aGlzLnZhcmlhYmxlc01vZGlmaWNhdGlvbnNQb3NpdGlvbnMuc2l6ZSgpIC0gMSkuZXF1YWxzKG5ld1ZhbHVlKSkgewotICAgICAgICB0aGlzLnZhcmlhYmxlc01vZGlmaWNhdGlvbnNQb3NpdGlvbnMuYWRkKG5ld1ZhbHVlKTsKLSAgICB9Ci0gICAgc3RvcmVTdGFja01hcEZyYW1lKCk7Ci19Ci1wdWJsaWMgdm9pZCBzdG9yZVN0YWNrTWFwRnJhbWUoKSB7Ci0gICAgaW50IGZyYW1lU2l6ZSA9IHRoaXMuZnJhbWVzLnNpemUoKTsKLSAgICBTdGFja01hcEZyYW1lIG1hcEZyYW1lID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBtYXBGcmFtZSA9IChTdGFja01hcEZyYW1lKSB0aGlzLmN1cnJlbnRGcmFtZS5jbG9uZSgpOwotICAgICAgICBtYXBGcmFtZS5wYyA9IHRoaXMucG9zaXRpb247Ci0gICAgfSBjYXRjaChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGlnbm9yZQotICAgIH0KLSAgICBpZiAoZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgICAgIHRoaXMuZnJhbWVzLmFkZChtYXBGcmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU3RhY2tNYXBGcmFtZSBsYXN0RnJhbWUgPSAoU3RhY2tNYXBGcmFtZSkgdGhpcy5mcmFtZXMuZ2V0KGZyYW1lU2l6ZSAtIDEpOwotICAgICAgICBpZiAobGFzdEZyYW1lLnBjID09IHRoaXMucG9zaXRpb24pIHsKLSAgICAgICAgICAgIHRoaXMuZnJhbWVzLnNldChmcmFtZVNpemUgLSAxLCBtYXBGcmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmZyYW1lcy5hZGQobWFwRnJhbWUpOwotICAgICAgICB9Ci0gICAgfQotfQotcHVibGljIHZvaWQgcmV0dXJuXygpIHsKLSAgICBzdXBlci5yZXR1cm5fKCk7Ci0gICAgdGhpcy5mcmFtZVBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIodGhpcy5wb3NpdGlvbikpOwotfQotcHVibGljIHZvaWQgc2Fsb2FkKCkgewotICAgIHN1cGVyLnNhbG9hZCgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMikgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMtLTsKLSAgICAJdGhpcy5jdXJyZW50RnJhbWUucmVwbGFjZVdpdGhFbGVtZW50VHlwZSgpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHNhc3RvcmUoKSB7Ci0gICAgc3VwZXIuc2FzdG9yZSgpOwotICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgPj0gMykgewotICAgIAl0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXMgLT0gMzsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBzaXB1c2goaW50IHMpIHsKLSAgICBzdXBlci5zaXB1c2gocyk7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUuYWRkU3RhY2tJdGVtKFR5cGVCaW5kaW5nLklOVCk7Ci19Ci1wdWJsaWMgdm9pZCBzdG9yZShMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotICAgIHN1cGVyLnN0b3JlKGxvY2FsQmluZGluZywgdmFsdWVSZXF1aXJlZCk7Ci0gICAgZmluYWwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBsb2NhbEJpbmRpbmcudHlwZTsKLSAgICBzd2l0Y2godHlwZUJpbmRpbmcuaWQpIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBvYmplY3QKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lLmxvY2Fsc1tsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbl0gPSBuZXcgVmVyaWZpY2F0aW9uVHlwZUluZm8odHlwZUJpbmRpbmcpOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHN3YXAoKSB7Ci0gICAgc3VwZXIuc3dhcCgpOwotICAgIGludCBudW1iZXJPZlN0YWNrSXRlbXMgPSB0aGlzLmN1cnJlbnRGcmFtZS5udW1iZXJPZlN0YWNrSXRlbXM7Ci0gICAgaWYgKG51bWJlck9mU3RhY2tJdGVtcyA+PSAyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvID0gKFZlcmlmaWNhdGlvblR5cGVJbmZvKSB0aGlzLmN1cnJlbnRGcmFtZS5zdGFja0l0ZW1zW251bWJlck9mU3RhY2tJdGVtcyAtIDFdLmNsb25lKCk7Ci0gICAgICAgICAgICBWZXJpZmljYXRpb25UeXBlSW5mbyBpbmZvMiA9IChWZXJpZmljYXRpb25UeXBlSW5mbykgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAyXS5jbG9uZSgpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAxXSA9IGluZm8yOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUuc3RhY2tJdGVtc1tudW1iZXJPZlN0YWNrSXRlbXMgLSAyXSA9IGluZm87Ci0gICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgfQotfQotcHVibGljIHZvaWQgdGFibGVzd2l0Y2goQ2FzZUxhYmVsIGRlZmF1bHRMYWJlbCwgaW50IGxvdywgaW50IGhpZ2gsIGludFtdIGtleXMsIGludFtdIHNvcnRlZEluZGV4ZXMsIENhc2VMYWJlbFtdIGNhc2VzTGFiZWwpIHsKLSAgICBzdXBlci50YWJsZXN3aXRjaChkZWZhdWx0TGFiZWwsIGxvdywgaGlnaCwga2V5cywgc29ydGVkSW5kZXhlcywgY2FzZXNMYWJlbCk7Ci0gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcyA+PSAxKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEZyYW1lLm51bWJlck9mU3RhY2tJdGVtcy0tOwotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHRocm93QW55RXhjZXB0aW9uKExvY2FsVmFyaWFibGVCaW5kaW5nIGFueUV4Y2VwdGlvblZhcmlhYmxlKSB7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUucHV0TG9jYWwoYW55RXhjZXB0aW9uVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbiwgbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNULCBhbnlFeGNlcHRpb25WYXJpYWJsZS50eXBlKSk7Ci0gICAgc3VwZXIudGhyb3dBbnlFeGNlcHRpb24oYW55RXhjZXB0aW9uVmFyaWFibGUpOwotICAgIHRoaXMuY3VycmVudEZyYW1lLnJlbW92ZUxvY2FscyhhbnlFeGNlcHRpb25WYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uKTsKLX0KLXB1YmxpYyB2b2lkIHJlbW92ZVN0YWNrRnJhbWVGb3IoaW50IHBvcykgewotICAgIC8vIFRPRE8gKG9saXZpZXIpIG5lZWQgdG8gc2VlIGhvdyB0byBnZXQgcmlkIG9mIHNvbWUgdW5uZWNlc3NhcnkgZnJhbWVzCisJaW50IGluZGV4ID0gdGhpcy52aXNpYmxlTG9jYWxzQ291bnQ7CisJbG9vcCA6IGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSB0aGlzLnZpc2libGVMb2NhbHNbaV07CisJCWlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCAmJiBsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKKwkJCWJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQgPSBpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgaW5pdFN0YXRlSW5kZXgsIGxvY2FsQmluZGluZyk7CisJCQlpZiAoIWlzRGVmaW5pdGVseUFzc2lnbmVkKSB7CisJCQkJaWYgKHRoaXMuc3RhdGVJbmRleGVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IHRoaXMuc3RhdGVJbmRleGVzQ291bnRlcjsgaiA8IG1heDsgaisrKSB7CisJCQkJCQlpZiAoaXNEZWZpbml0ZWx5QXNzaWduZWQoc2NvcGUsIHRoaXMuc3RhdGVJbmRleGVzW2pdLCBsb2NhbEJpbmRpbmcpKSB7CisJCQkJCQkJY29udGludWUgbG9vcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlsb2NhbEJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyh0aGlzLnBvc2l0aW9uKTsKKwkJCX0KKwkJfQorCX0KIH0KIHB1YmxpYyB2b2lkIHJlc2V0KENsYXNzRmlsZSBnaXZlbkNsYXNzRmlsZSkgewotICAgIHN1cGVyLnJlc2V0KGdpdmVuQ2xhc3NGaWxlKTsKLSAgICB0aGlzLmZyYW1lcyA9IG51bGw7Ci0gICAgdGhpcy5jdXJyZW50RnJhbWUgPSBudWxsOwotICAgIHRoaXMuZnJhbWVQb3NpdGlvbnMgPSBudWxsOwotICAgIHRoaXMudmFyaWFibGVzTW9kaWZpY2F0aW9uc1Bvc2l0aW9ucyA9IG51bGw7CisJc3VwZXIucmVzZXQoZ2l2ZW5DbGFzc0ZpbGUpOworCXRoaXMuc3RhdGVJbmRleGVzQ291bnRlciA9IDA7CisJaWYgKHRoaXMuZnJhbWVQb3NpdGlvbnMgIT0gbnVsbCkgeworCQl0aGlzLmZyYW1lUG9zaXRpb25zLmNsZWFyKCk7CisJfQorCWlmICh0aGlzLmV4Y2VwdGlvbk1hcmtlcnMgIT0gbnVsbCkgeworCQl0aGlzLmV4Y2VwdGlvbk1hcmtlcnMuY2xlYXIoKTsKKwl9CisJaWYgKHRoaXMuc3RhY2tEZXB0aE1hcmtlcnMgIT0gbnVsbCkgeworCQl0aGlzLnN0YWNrRGVwdGhNYXJrZXJzLmNsZWFyKCk7CisJfQorCWlmICh0aGlzLnN0YWNrTWFya2VycyAhPSBudWxsKSB7CisJCXRoaXMuc3RhY2tNYXJrZXJzLmNsZWFyKCk7CisJfQogfQogcHJvdGVjdGVkIHZvaWQgd3JpdGVQb3NpdGlvbihCcmFuY2hMYWJlbCBsYWJlbCkgewotICAgIHN1cGVyLndyaXRlUG9zaXRpb24obGFiZWwpOwotICAgIGZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihsYWJlbC5wb3NpdGlvbikpOwotfQotcHJvdGVjdGVkIHZvaWQgd3JpdGVXaWRlUG9zaXRpb24oQnJhbmNoTGFiZWwgbGFiZWwpIHsKLSAgICBzdXBlci53cml0ZVdpZGVQb3NpdGlvbihsYWJlbCk7Ci0gICAgZnJhbWVQb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGxhYmVsLnBvc2l0aW9uKSk7CisJc3VwZXIud3JpdGVQb3NpdGlvbihsYWJlbCk7CisJYWRkRnJhbWVQb3NpdGlvbihsYWJlbC5wb3NpdGlvbik7CiB9CiBwcm90ZWN0ZWQgdm9pZCB3cml0ZVBvc2l0aW9uKEJyYW5jaExhYmVsIGxhYmVsLCBpbnQgZm9yd2FyZFJlZmVyZW5jZSkgewotICAgIHN1cGVyLndyaXRlUG9zaXRpb24obGFiZWwsIGZvcndhcmRSZWZlcmVuY2UpOwotICAgIGZyYW1lUG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihsYWJlbC5wb3NpdGlvbikpOworCXN1cGVyLndyaXRlUG9zaXRpb24obGFiZWwsIGZvcndhcmRSZWZlcmVuY2UpOworCWFkZEZyYW1lUG9zaXRpb24obGFiZWwucG9zaXRpb24pOworfQorcHJvdGVjdGVkIHZvaWQgd3JpdGVTaWduZWRXb3JkKGludCBwb3MsIGludCB2YWx1ZSkgeworCXN1cGVyLndyaXRlU2lnbmVkV29yZChwb3MsIHZhbHVlKTsKKwlhZGRGcmFtZVBvc2l0aW9uKHRoaXMucG9zaXRpb24pOworfQorcHJvdGVjdGVkIHZvaWQgd3JpdGVXaWRlUG9zaXRpb24oQnJhbmNoTGFiZWwgbGFiZWwpIHsKKwlzdXBlci53cml0ZVdpZGVQb3NpdGlvbihsYWJlbCk7CisJYWRkRnJhbWVQb3NpdGlvbihsYWJlbC5wb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCBhcmV0dXJuKCkgeworCXN1cGVyLmFyZXR1cm4oKTsKKwlhZGRGcmFtZVBvc2l0aW9uKHRoaXMucG9zaXRpb24pOworfQorcHVibGljIHZvaWQgaXJldHVybigpIHsKKwlzdXBlci5pcmV0dXJuKCk7CisJYWRkRnJhbWVQb3NpdGlvbih0aGlzLnBvc2l0aW9uKTsKK30KK3B1YmxpYyB2b2lkIGxyZXR1cm4oKSB7CisJc3VwZXIubHJldHVybigpOworCWFkZEZyYW1lUG9zaXRpb24odGhpcy5wb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCBmcmV0dXJuKCkgeworCXN1cGVyLmZyZXR1cm4oKTsKKwlhZGRGcmFtZVBvc2l0aW9uKHRoaXMucG9zaXRpb24pOworfQorcHVibGljIHZvaWQgZHJldHVybigpIHsKKwlzdXBlci5kcmV0dXJuKCk7CisJYWRkRnJhbWVQb3NpdGlvbih0aGlzLnBvc2l0aW9uKTsKK30KK3B1YmxpYyB2b2lkIHJldHVybl8oKSB7CisJc3VwZXIucmV0dXJuXygpOworCWFkZEZyYW1lUG9zaXRpb24odGhpcy5wb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCBhdGhyb3coKSB7CisJc3VwZXIuYXRocm93KCk7CisJYWRkRnJhbWVQb3NpdGlvbih0aGlzLnBvc2l0aW9uKTsKK30KK3B1YmxpYyB2b2lkIHB1c2hPblN0YWNrKFR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKKwlzdXBlci5wdXNoT25TdGFjayhiaW5kaW5nKTsKKwlhZGRTdGFja0RlcHRoTWFya2VyKHRoaXMucG9zaXRpb24sIDEsIGJpbmRpbmcpOworfQorcHVibGljIHZvaWQgcHVzaEV4Y2VwdGlvbk9uU3RhY2soVHlwZUJpbmRpbmcgYmluZGluZykgeworCXN1cGVyLnB1c2hFeGNlcHRpb25PblN0YWNrKGJpbmRpbmcpOworCWFkZEV4Y2VwdGlvbk1hcmtlcih0aGlzLnBvc2l0aW9uLCBiaW5kaW5nKTsKK30KK3B1YmxpYyB2b2lkIGdvdG9fKEJyYW5jaExhYmVsIGxhYmVsKSB7CisJc3VwZXIuZ290b18obGFiZWwpOworCWFkZEZyYW1lUG9zaXRpb24odGhpcy5wb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCBnb3RvX3coQnJhbmNoTGFiZWwgbGFiZWwpIHsKKwlzdXBlci5nb3RvX3cobGFiZWwpOworCWFkZEZyYW1lUG9zaXRpb24odGhpcy5wb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCByZXNldEluV2lkZU1vZGUoKSB7CisJdGhpcy5yZXNldFNlY3JldExvY2FscygpOworCXN1cGVyLnJlc2V0SW5XaWRlTW9kZSgpOworfQorcHVibGljIHZvaWQgcmVzZXRGb3JDb2RlR2VuVW51c2VkTG9jYWxzKCkgeworCXRoaXMucmVzZXRTZWNyZXRMb2NhbHMoKTsKKwlzdXBlci5yZXNldEZvckNvZGVHZW5VbnVzZWRMb2NhbHMoKTsKK30KK3B1YmxpYyB2b2lkIHJlc2V0U2VjcmV0TG9jYWxzKCkgeworCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmxvY2Fscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlQmluZGluZyA9IHRoaXMubG9jYWxzW2ldOworCQlpZiAobG9jYWxWYXJpYWJsZUJpbmRpbmcgIT0gbnVsbCAmJiBsb2NhbFZhcmlhYmxlQmluZGluZy5pc1NlY3JldCgpKSB7CisJCQkvLyBhbGwgb3RoZXIgbG9jYWxzIGFyZSByZWluaXRpYWxpemVkIGluc2lkZSB0aGUgY29tcHV0YXRpb24gb2YgdGhlaXIgcmVzb2x2ZWQgcG9zaXRpb25zCisJCQlsb2NhbFZhcmlhYmxlQmluZGluZy5yZXNldEluaXRpYWxpemF0aW9ucygpOworCQl9CisJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vVmVyaWZpY2F0aW9uVHlwZUluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1ZlcmlmaWNhdGlvblR5cGVJbmZvLmphdmEKaW5kZXggZGNlOWJlNi4uMTQ5ZmY2MSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vVmVyaWZpY2F0aW9uVHlwZUluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9WZXJpZmljYXRpb25UeXBlSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIAotcHVibGljIGNsYXNzIFZlcmlmaWNhdGlvblR5cGVJbmZvIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKK3B1YmxpYyBjbGFzcyBWZXJpZmljYXRpb25UeXBlSW5mbyB7CiAJLyoqCiAJICogVGhlIHRhZyB2YWx1ZSByZXByZXNlbnRpbmcgdG9wIHZhcmlhYmxlIGluZm8KIAkgKiBAc2luY2UgMy4yCkBAIC02MCwxOSArNjAsMjIgQEAKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9VTklOSVRJQUxJWkVEID0gODsKLQkKKwogCXB1YmxpYyBpbnQgdGFnOwogCXByaXZhdGUgaW50IGlkOwogCXByaXZhdGUgY2hhcltdIGNvbnN0YW50UG9vbE5hbWU7CiAJcHVibGljIGludCBvZmZzZXQ7CiAKK3ByaXZhdGUgVmVyaWZpY2F0aW9uVHlwZUluZm8oKSB7CisJLy8gZm9yIGR1cGxpY2F0aW9uCit9CiBwdWJsaWMgVmVyaWZpY2F0aW9uVHlwZUluZm8oaW50IGlkLCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSkgewogCXRoaXMoaWQsIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fT0JKRUNULCBjb25zdGFudFBvb2xOYW1lKTsKIH0KIHB1YmxpYyBWZXJpZmljYXRpb25UeXBlSW5mbyhpbnQgaWQsIGludCB0YWcsIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKSB7CiAJdGhpcy5pZCA9IGlkOwotCXRoaXMuY29uc3RhbnRQb29sTmFtZSA9IGNvbnN0YW50UG9vbE5hbWU7CiAJdGhpcy50YWcgPSB0YWc7CisJdGhpcy5jb25zdGFudFBvb2xOYW1lID0gY29uc3RhbnRQb29sTmFtZTsKIH0KIHB1YmxpYyBWZXJpZmljYXRpb25UeXBlSW5mbyhpbnQgdGFnLCBUeXBlQmluZGluZyBiaW5kaW5nKSB7CiAJdGhpcyhiaW5kaW5nKTsKQEAgLTEwMiw4ICsxMDUsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQl0aGlzLnRhZyA9ICBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVDsKKwkJCXRoaXMuY29uc3RhbnRQb29sTmFtZSA9IGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpOwogCX0KLQl0aGlzLmNvbnN0YW50UG9vbE5hbWUgPSBiaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKTsKIH0KIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoVHlwZUJpbmRpbmcgYmluZGluZykgewogCXRoaXMuY29uc3RhbnRQb29sTmFtZSA9IGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpOwpAQCAtMTQwLDE4ICsxNDMsMzcgQEAKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCXN3aXRjaCh0aGlzLnRhZykgewogCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRF9USElTIDoKLQkJCWJ1ZmZlci5hcHBlbmQoInVuaW5pdGlhbGl6ZWRfdGhpcygiKS5hcHBlbmQodGhpcy5yZWFkYWJsZU5hbWUoKSkuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQlidWZmZXIuYXBwZW5kKCJ1bmluaXRpYWxpemVkX3RoaXMoIikuYXBwZW5kKHJlYWRhYmxlTmFtZSgpKS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJCWJyZWFrOwogCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6Ci0JCQlidWZmZXIuYXBwZW5kKCJ1bmluaXRpYWxpemVkKCIpLmFwcGVuZCh0aGlzLnJlYWRhYmxlTmFtZSgpKS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCWJ1ZmZlci5hcHBlbmQoInVuaW5pdGlhbGl6ZWQoIikuYXBwZW5kKHJlYWRhYmxlTmFtZSgpKS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnJlYWRhYmxlTmFtZSgpKTsKKwkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX09CSkVDVCA6CisJCQlidWZmZXIuYXBwZW5kKHJlYWRhYmxlTmFtZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRE9VQkxFIDoKKwkJCWJ1ZmZlci5hcHBlbmQoJ0QnKTsKKwkJCWJyZWFrOworCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fRkxPQVQgOgorCQkJYnVmZmVyLmFwcGVuZCgnRicpOworCQkJYnJlYWs7CisJCWNhc2UgVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9JTlRFR0VSIDoKKwkJCWJ1ZmZlci5hcHBlbmQoJ0knKTsKKwkJCWJyZWFrOworCQljYXNlIFZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fTE9ORyA6CisJCQlidWZmZXIuYXBwZW5kKCdKJyk7CisJCQlicmVhazsKKwkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX05VTEwgOgorCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBWZXJpZmljYXRpb25UeXBlSW5mby5JVEVNX1RPUCA6CisJCQlidWZmZXIuYXBwZW5kKCJ0b3AiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CiAJfQogCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwogfQotcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JZmluYWwgVmVyaWZpY2F0aW9uVHlwZUluZm8gdmVyaWZpY2F0aW9uVHlwZUluZm8gPSAoVmVyaWZpY2F0aW9uVHlwZUluZm8pIHN1cGVyLmNsb25lKCk7CitwdWJsaWMgVmVyaWZpY2F0aW9uVHlwZUluZm8gZHVwbGljYXRlKCkgeworCWZpbmFsIFZlcmlmaWNhdGlvblR5cGVJbmZvIHZlcmlmaWNhdGlvblR5cGVJbmZvID0gbmV3IFZlcmlmaWNhdGlvblR5cGVJbmZvKCk7CiAJdmVyaWZpY2F0aW9uVHlwZUluZm8uaWQgPSB0aGlzLmlkOwogCXZlcmlmaWNhdGlvblR5cGVJbmZvLnRhZyA9IHRoaXMudGFnOwogCXZlcmlmaWNhdGlvblR5cGVJbmZvLmNvbnN0YW50UG9vbE5hbWUgPSB0aGlzLmNvbnN0YW50UG9vbE5hbWU7CkBAIC0xNjEsMTAgKzE4MywxMyBAQAogcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAob2JqIGluc3RhbmNlb2YgVmVyaWZpY2F0aW9uVHlwZUluZm8pIHsKIAkJVmVyaWZpY2F0aW9uVHlwZUluZm8gaW5mbzEgPSAoVmVyaWZpY2F0aW9uVHlwZUluZm8pIG9iajsKLQkJcmV0dXJuIGluZm8xLnRhZyA9PSB0aGlzLnRhZyAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhpbmZvMS5jb25zdGFudFBvb2xOYW1lKCksIHRoaXMuY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJcmV0dXJuIGluZm8xLnRhZyA9PSB0aGlzLnRhZyAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhpbmZvMS5jb25zdGFudFBvb2xOYW1lKCksIGNvbnN0YW50UG9vbE5hbWUoKSk7CiAJfQogCXJldHVybiBmYWxzZTsKIH0KK3B1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIHRoaXMudGFnICsgdGhpcy5pZCArIHRoaXMuY29uc3RhbnRQb29sTmFtZS5sZW5ndGggKyB0aGlzLm9mZnNldDsKK30KIHB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIHsKIAlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2xOYW1lOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9BY2Nlc3NSZXN0cmljdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9BY2Nlc3NSZXN0cmljdGlvbi5qYXZhCmluZGV4IDkyMGEwYzAuLmMxYjZiMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUmVzdHJpY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0FjY2Vzc1Jlc3RyaWN0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMzEgKzEzLDE3IEBACiBwdWJsaWMgY2xhc3MgQWNjZXNzUmVzdHJpY3Rpb24gewogCiAJcHJpdmF0ZSBBY2Nlc3NSdWxlIGFjY2Vzc1J1bGU7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBtZXNzYWdlVGVtcGxhdGVzOwotCXB1YmxpYyBBY2Nlc3NSZXN0cmljdGlvbihBY2Nlc3NSdWxlIGFjY2Vzc1J1bGUsIFN0cmluZyBbXSBtZXNzYWdlVGVtcGxhdGVzKSB7CisJcHVibGljIGJ5dGUgY2xhc3NwYXRoRW50cnlUeXBlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZQorCQlDT01NQU5EX0xJTkUgPSAwLAorCQlQUk9KRUNUID0gMSwKKwkJTElCUkFSWSA9IDI7CisJcHVibGljIFN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWU7CisKKwlwdWJsaWMgQWNjZXNzUmVzdHJpY3Rpb24oQWNjZXNzUnVsZSBhY2Nlc3NSdWxlLCBieXRlIGNsYXNzcGF0aEVudHJ5VHlwZSwgU3RyaW5nIGNsYXNzcGF0aEVudHJ5TmFtZSkgewogCQl0aGlzLmFjY2Vzc1J1bGUgPSBhY2Nlc3NSdWxlOwotCQl0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMgPSBtZXNzYWdlVGVtcGxhdGVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBwcm9ibGVtIHJlcG9ydGluZywgCi0JICogbWVzc2FnZSBpcyBleHBlY3RlZCB0byBjb250YWluIHJvb20gZm9yIHJlc3RyaWN0ZWQgdHlwZSBuYW1lCi0JICogZS5nLiAiezB9IGhhcyByZXN0cmljdGVkIGFjY2VzcyIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZVRlbXBsYXRlc1swXTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb25zdHJ1Y3RvckFjY2Vzc01lc3NhZ2VUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZVRlbXBsYXRlc1sxXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEFjY2Vzc01lc3NhZ2VUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZVRlbXBsYXRlc1syXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkQWNjZXNzTWVzc2FnZVRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlVGVtcGxhdGVzWzNdOworCQl0aGlzLmNsYXNzcGF0aEVudHJ5TmFtZSA9IGNsYXNzcGF0aEVudHJ5TmFtZTsKKwkJdGhpcy5jbGFzc3BhdGhFbnRyeVR5cGUgPSBjbGFzc3BhdGhFbnRyeVR5cGU7CiAJfQogCiAJcHVibGljIGludCBnZXRQcm9ibGVtSWQoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0FjY2Vzc1J1bGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZS5qYXZhCmluZGV4IGYyNDg5N2QuLjYyN2VlMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDI1ICsxNCwyNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogCiBwdWJsaWMgY2xhc3MgQWNjZXNzUnVsZSB7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJZ25vcmVJZkJldHRlciA9IDB4MDIwMDAwMDA7IC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIElQcm9ibGVtI0ZvcmJpZGRlblJlZmVyZW5jZSBhbmQgRGlzY291cmFnZWRSZWZlcmVuY2UKLQkKKwogCXB1YmxpYyBjaGFyW10gcGF0dGVybjsKIAlwdWJsaWMgaW50IHByb2JsZW1JZDsKLQkKKwogCXB1YmxpYyBBY2Nlc3NSdWxlKGNoYXJbXSBwYXR0ZXJuLCBpbnQgcHJvYmxlbUlkKSB7CiAJCXRoaXMocGF0dGVybiwgcHJvYmxlbUlkLCBmYWxzZSk7CiAJfQotCQorCiAJcHVibGljIEFjY2Vzc1J1bGUoY2hhcltdIHBhdHRlcm4sIGludCBwcm9ibGVtSWQsIGJvb2xlYW4ga2VlcExvb2tpbmcpIHsKIAkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJdGhpcy5wcm9ibGVtSWQgPSBrZWVwTG9va2luZyA/IHByb2JsZW1JZCB8IElnbm9yZUlmQmV0dGVyIDogcHJvYmxlbUlkOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiB0aGlzLnByb2JsZW1JZCAqIDE3ICsgQ2hhck9wZXJhdGlvbi5oYXNoQ29kZSh0aGlzLnBhdHRlcm4pOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCWlmICghKG9iaiBpbnN0YW5jZW9mIEFjY2Vzc1J1bGUpKSByZXR1cm4gZmFsc2U7CiAJCUFjY2Vzc1J1bGUgb3RoZXIgPSAoQWNjZXNzUnVsZSkgb2JqOwpAQCAtNDMsNyArNDMsNyBAQAogCXB1YmxpYyBpbnQgZ2V0UHJvYmxlbUlkKCkgewogCQlyZXR1cm4gdGhpcy5wcm9ibGVtSWQgJiB+SWdub3JlSWZCZXR0ZXI7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaWdub3JlSWZCZXR0ZXIoKSB7CiAJCXJldHVybiAodGhpcy5wcm9ibGVtSWQgJiBJZ25vcmVJZkJldHRlcikgIT0gMDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0FjY2Vzc1J1bGVTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZVNldC5qYXZhCmluZGV4IGM4OTRhNTkuLmY5YzI5YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQWNjZXNzUnVsZVNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDY5ICsxOSw2NSBAQAogcHVibGljIGNsYXNzIEFjY2Vzc1J1bGVTZXQgewogCiAJcHJpdmF0ZSBBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXM7Ci0JcHVibGljIFN0cmluZ1tdIG1lc3NhZ2VUZW1wbGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9URU1QTEFURVNfTEVOR1RIID0gNDsKLQkKLQkvKioKLQkgKiBNYWtlIGEgbmV3IHNldCBvZiBhY2Nlc3MgcnVsZXMuCi0JICogQHBhcmFtIGFjY2Vzc1J1bGVzIHRoZSBhY2Nlc3MgcnVsZXMgdG8gYmUgY29udGFpbmVkIGJ5IHRoZSBuZXcgc2V0Ci0JICogQHBhcmFtIG1lc3NhZ2VUZW1wbGF0ZXMgYSBTdGluZ1s0XSBhcnJheSBzcGVjaWZ5aW5nIHRoZSBtZXNzYWdlcyBmb3IgdHlwZSwgCi0JICogY29uc3RydWN0b3IsIG1ldGhvZCBhbmQgZmllbGQgYWNjZXNzIHZpb2xhdGlvbjsgZWFjaCBzaG91bGQgY29udGFpbiBhcyBtYW55Ci0JICogcGxhY2Vob2xkZXJzIGFzIGV4cGVjdGVkIGJ5IHRoZSByZXNwZWN0aXZlIGFjY2VzcyB2aW9sYXRpb24gbWVzc2FnZSAodGhhdCBpcywKLQkgKiBvbmUgZm9yIHR5cGUgYW5kIGNvbnN0cnVjdG9yLCB0d28gZm9yIG1ldGhvZCBhbmQgZmllbGQpOyByZXBsYWNlZCBieSBhCi0JICogZGVmYXVsdCB2YWx1ZSBpZiBudWxsLgotCSAqLwotCXB1YmxpYyBBY2Nlc3NSdWxlU2V0KEFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywgU3RyaW5nW10gbWVzc2FnZVRlbXBsYXRlcykgewotCQl0aGlzLmFjY2Vzc1J1bGVzID0gYWNjZXNzUnVsZXM7Ci0JCWlmIChtZXNzYWdlVGVtcGxhdGVzICE9IG51bGwgJiYgbWVzc2FnZVRlbXBsYXRlcy5sZW5ndGggPT0gTUVTU0FHRV9URU1QTEFURVNfTEVOR1RIKQotCQkJdGhpcy5tZXNzYWdlVGVtcGxhdGVzID0gbWVzc2FnZVRlbXBsYXRlczsKLQkJZWxzZQotCQkJdGhpcy5tZXNzYWdlVGVtcGxhdGVzID0gbmV3IFN0cmluZ1tdIHsiezB9IiwgInswfSIsICJ7MH0gezF9IiwgInswfSB7MX0ifTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gb2JqZWN0KSAKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBBY2Nlc3NSdWxlU2V0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQWNjZXNzUnVsZVNldCBvdGhlclJ1bGVTZXQgPSAoQWNjZXNzUnVsZVNldCkgb2JqZWN0OwotCQlpZiAodGhpcy5tZXNzYWdlVGVtcGxhdGVzLmxlbmd0aCAhPSBNRVNTQUdFX1RFTVBMQVRFU19MRU5HVEggfHwKLQkJCQlvdGhlclJ1bGVTZXQubWVzc2FnZVRlbXBsYXRlcy5sZW5ndGggIT0gTUVTU0FHRV9URU1QTEFURVNfTEVOR1RIKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBndWFyZAotCQlmb3IgKGludCBpID0gMDsgaSA8IE1FU1NBR0VfVEVNUExBVEVTX0xFTkdUSDsgaSsrKSAKLQkJCWlmICghdGhpcy5tZXNzYWdlVGVtcGxhdGVzW2ldLmVxdWFscyhvdGhlclJ1bGVTZXQubWVzc2FnZVRlbXBsYXRlc1tpXSkpIAotCQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHJ1bGVzTGVuZ3RoID0gdGhpcy5hY2Nlc3NSdWxlcy5sZW5ndGg7Ci0JCWlmIChydWxlc0xlbmd0aCAhPSBvdGhlclJ1bGVTZXQuYWNjZXNzUnVsZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVsZXNMZW5ndGg7IGkrKykKLQkJCWlmICghdGhpcy5hY2Nlc3NSdWxlc1tpXS5lcXVhbHMob3RoZXJSdWxlU2V0LmFjY2Vzc1J1bGVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgQWNjZXNzUnVsZVtdIGdldEFjY2Vzc1J1bGVzKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3NSdWxlczsKLQl9Ci0JCisJcHVibGljIGJ5dGUgY2xhc3NwYXRoRW50cnlUeXBlOyAvLyBvbmUgb2YgQWNjZXNzUmVzdHJpY3Rpb24jQ09NTUFORF9MSU5FLCBMSUJSQVJZLCBQUk9KRUNUCisJcHVibGljIFN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWU7CisKIC8qKgotICogU2VsZWN0IHRoZSBmaXJzdCBhY2Nlc3MgcnVsZSB3aGljaCBpcyB2aW9sYXRlZCB3aGVuIGFjY2Vzc2luZyBhIGdpdmVuIHR5cGUsIAorICogTWFrZSBhIG5ldyBzZXQgb2YgYWNjZXNzIHJ1bGVzLgorICogQHBhcmFtIGFjY2Vzc1J1bGVzIHRoZSBhY2Nlc3MgcnVsZXMgdG8gYmUgY29udGFpbmVkIGJ5IHRoZSBuZXcgc2V0CisgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnlUeXBlIG9uZSBvZiB7QGxpbmsgQWNjZXNzUmVzdHJpY3Rpb24jQ09NTUFORF9MSU5FfSwKKyAqICAgICAgICB7QGxpbmsgQWNjZXNzUmVzdHJpY3Rpb24jTElCUkFSWX0sIHtAbGluayBBY2Nlc3NSZXN0cmljdGlvbiNQUk9KRUNUfQorICogICAgICAgIHRoYXQgdGVsbHMgdGhlIGFjY2VzcyByZXN0cmljdGlvbnMgaG93IHRvIHJlbmRlciB0aGUgY2xhc3NwYXRoIGVudHJ5CisgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnlOYW1lIGEgdXNlci1yZWFkYWJsZSBuYW1lIGZvciB0aGUgY2xhc3NwYXRoIGVudHJ5CisgKi8KK3B1YmxpYyBBY2Nlc3NSdWxlU2V0KEFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywgYnl0ZSBjbGFzc3BhdGhFbnRyeVR5cGUsIFN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWUpIHsKKwl0aGlzLmFjY2Vzc1J1bGVzID0gYWNjZXNzUnVsZXM7CisJdGhpcy5jbGFzc3BhdGhFbnRyeVR5cGUgPSBjbGFzc3BhdGhFbnRyeVR5cGU7CisJdGhpcy5jbGFzc3BhdGhFbnRyeU5hbWUgPSBjbGFzc3BhdGhFbnRyeU5hbWU7Cit9CisKKy8qKgorICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICovCitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCWlmICh0aGlzID09IG9iamVjdCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQWNjZXNzUnVsZVNldCkpCisJCXJldHVybiBmYWxzZTsKKwlBY2Nlc3NSdWxlU2V0IG90aGVyUnVsZVNldCA9IChBY2Nlc3NSdWxlU2V0KSBvYmplY3Q7CisJaWYgKHRoaXMuY2xhc3NwYXRoRW50cnlUeXBlICE9IG90aGVyUnVsZVNldC5jbGFzc3BhdGhFbnRyeVR5cGUgfHwKKwkJCXRoaXMuY2xhc3NwYXRoRW50cnlOYW1lID09IG51bGwgJiYgb3RoZXJSdWxlU2V0LmNsYXNzcGF0aEVudHJ5TmFtZSAhPSBudWxsIHx8CisJCQkhIHRoaXMuY2xhc3NwYXRoRW50cnlOYW1lLmVxdWFscyhvdGhlclJ1bGVTZXQuY2xhc3NwYXRoRW50cnlOYW1lKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWludCBydWxlc0xlbmd0aCA9IHRoaXMuYWNjZXNzUnVsZXMubGVuZ3RoOworCWlmIChydWxlc0xlbmd0aCAhPSBvdGhlclJ1bGVTZXQuYWNjZXNzUnVsZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlc0xlbmd0aDsgaSsrKQorCQlpZiAoIXRoaXMuYWNjZXNzUnVsZXNbaV0uZXF1YWxzKG90aGVyUnVsZVNldC5hY2Nlc3NSdWxlc1tpXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK3B1YmxpYyBBY2Nlc3NSdWxlW10gZ2V0QWNjZXNzUnVsZXMoKSB7CisJcmV0dXJuIHRoaXMuYWNjZXNzUnVsZXM7Cit9CisKKy8qKgorICogU2VsZWN0IHRoZSBmaXJzdCBhY2Nlc3MgcnVsZSB3aGljaCBpcyB2aW9sYXRlZCB3aGVuIGFjY2Vzc2luZyBhIGdpdmVuIHR5cGUsCiAgKiBvciBudWxsIGlmIG5vICdub24gYWNjZXNzaWJsZScgYWNjZXNzIHJ1bGUgYXBwbGllcy4KLSAqIEBwYXJhbSB0YXJnZXRUeXBlRmlsZVBhdGggdGhlIHRhcmdldCB0eXBlIGZpbGUgcGF0aCwgZm9ybWVkIGFzOiAKKyAqIEBwYXJhbSB0YXJnZXRUeXBlRmlsZVBhdGggdGhlIHRhcmdldCB0eXBlIGZpbGUgcGF0aCwgZm9ybWVkIGFzOgogICogIm9yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb3JlIgogICogQHJldHVybiB0aGUgZmlyc3QgYWNjZXNzIHJlc3RyaWN0aW9uIHRoYXQgYXBwbGllcyBpZiBhbnksIG51bGwgZWxzZQogICovCiBwdWJsaWMgQWNjZXNzUmVzdHJpY3Rpb24gZ2V0VmlvbGF0ZWRSZXN0cmljdGlvbihjaGFyW10gdGFyZ2V0VHlwZUZpbGVQYXRoKSB7CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuYWNjZXNzUnVsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJQWNjZXNzUnVsZSBhY2Nlc3NSdWxlID0gdGhpcy5hY2Nlc3NSdWxlc1tpXTsKLQkJaWYgKENoYXJPcGVyYXRpb24ucGF0aE1hdGNoKGFjY2Vzc1J1bGUucGF0dGVybiwgdGFyZ2V0VHlwZUZpbGVQYXRoLCAKKwkJaWYgKENoYXJPcGVyYXRpb24ucGF0aE1hdGNoKGFjY2Vzc1J1bGUucGF0dGVybiwgdGFyZ2V0VHlwZUZpbGVQYXRoLAogCQkJCXRydWUvKmNhc2Ugc2Vuc2l0aXZlKi8sICcvJykpIHsKIAkJCXN3aXRjaCAoYWNjZXNzUnVsZS5nZXRQcm9ibGVtSWQoKSkgewogCQkJCWNhc2UgSVByb2JsZW0uRm9yYmlkZGVuUmVmZXJlbmNlOgogCQkJCWNhc2UgSVByb2JsZW0uRGlzY291cmFnZWRSZWZlcmVuY2U6Ci0JCQkJCXJldHVybiBuZXcgQWNjZXNzUmVzdHJpY3Rpb24oYWNjZXNzUnVsZSwgdGhpcy5tZXNzYWdlVGVtcGxhdGVzKTsKKwkJCQkJcmV0dXJuIG5ldyBBY2Nlc3NSZXN0cmljdGlvbihhY2Nlc3NSdWxlLCB0aGlzLmNsYXNzcGF0aEVudHJ5VHlwZSwgdGhpcy5jbGFzc3BhdGhFbnRyeU5hbWUpOwogCQkJCWRlZmF1bHQ6CiAJCQkJCXJldHVybiBudWxsOwogCQkJfQpAQCAtODksMzAgKzg1LDUwIEBACiAJfQogCXJldHVybiBudWxsOwogfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0b1N0cmluZyh0cnVlLyp3cmFwIGxpbmVzKi8pOworCitwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCWZpbmFsIGludCBwcmltZSA9IDMxOworCWludCByZXN1bHQgPSAxOworCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgaGFzaENvZGUodGhpcy5hY2Nlc3NSdWxlcyk7CisJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHRoaXMuY2xhc3NwYXRoRW50cnlOYW1lID09IG51bGwpID8gMCA6IHRoaXMuY2xhc3NwYXRoRW50cnlOYW1lLmhhc2hDb2RlKCkpOworCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdGhpcy5jbGFzc3BhdGhFbnRyeVR5cGU7CisJcmV0dXJuIHJlc3VsdDsKK30KKworcHJpdmF0ZSBpbnQgaGFzaENvZGUoQWNjZXNzUnVsZVtdIHJ1bGVzKSB7CisJZmluYWwgaW50IHByaW1lID0gMzE7CisJaWYgKHJ1bGVzID09IG51bGwpCisJCXJldHVybiAwOworCWludCByZXN1bHQgPSAxOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBydWxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChydWxlc1tpXSA9PSBudWxsID8gMCA6IHJ1bGVzW2ldLmhhc2hDb2RlKCkpOwogCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gd3JhcCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMDApOwotCQlidWZmZXIuYXBwZW5kKCJBY2Nlc3NSdWxlU2V0IHsiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiByZXN1bHQ7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuIHRvU3RyaW5nKHRydWUvKndyYXAgbGluZXMqLyk7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiB3cmFwKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKKwlidWZmZXIuYXBwZW5kKCJBY2Nlc3NSdWxlU2V0IHsiKTsgLy8kTk9OLU5MUy0xJAorCWlmICh3cmFwKQorCQlidWZmZXIuYXBwZW5kKCdcbicpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmFjY2Vzc1J1bGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmICh3cmFwKQorCQkJYnVmZmVyLmFwcGVuZCgnXHQnKTsKKwkJQWNjZXNzUnVsZSBhY2Nlc3NSdWxlID0gdGhpcy5hY2Nlc3NSdWxlc1tpXTsKKwkJYnVmZmVyLmFwcGVuZChhY2Nlc3NSdWxlKTsKIAkJaWYgKHdyYXApCiAJCQlidWZmZXIuYXBwZW5kKCdcbicpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5hY2Nlc3NSdWxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKHdyYXApCi0JCQkJYnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJCUFjY2Vzc1J1bGUgYWNjZXNzUnVsZSA9IHRoaXMuYWNjZXNzUnVsZXNbaV07Ci0JCQlidWZmZXIuYXBwZW5kKGFjY2Vzc1J1bGUpOwotCQkJaWYgKHdyYXApCi0JCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCWVsc2UgaWYgKGkgPCBsZW5ndGgtMSkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgifSBbdGVtcGxhdGVzOlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVGVtcGxhdGVzLmxlbmd0aDsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZCh0aGlzLm1lc3NhZ2VUZW1wbGF0ZXNbaV0pOwotCQlidWZmZXIuYXBwZW5kKCJcIl0iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCWVsc2UgaWYgKGkgPCBsZW5ndGgtMSkKKwkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKIAl9CisJYnVmZmVyLmFwcGVuZCgifSBbY2xhc3NwYXRoIGVudHJ5OiAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5jbGFzc3BhdGhFbnRyeU5hbWUpOworCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9DbGFzc1NpZ25hdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9DbGFzc1NpZ25hdHVyZS5qYXZhCmluZGV4IDZjNjhhMDkuLmYzZTQ2ODUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvQ2xhc3NTaWduYXR1cmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0NsYXNzU2lnbmF0dXJlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsOSArNywxNCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIHR5ZXVuZ0BiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBvbGl2aWVyX3Rob21hbm5AY2EuaWJtLmNvbSAtIGFkZCBoYXNoQ29kZSgpIGFuZCBlcXVhbHMoLi4pIG1ldGhvZHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CisKIC8qKgogICogUmVwcmVzZW50cyBhIGNsYXNzIHJlZmVyZW5jZSBpbiB0aGUgY2xhc3MgZmlsZS4KICAqIE9uZSBvZiB0aGUgcG9zc2libGUgcmVzdWx0cyBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbiBtZXRob2Qgb3IgYW4gZWxlbWVudCB2YWx1ZSBwYWlyLgpAQCAtMzUsNCArNDAsMjUgQEAKIAlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KKworcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwlpbnQgcmVzdWx0ID0gMTsKKwlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIENoYXJPcGVyYXRpb24uaGFzaENvZGUodGhpcy5jbGFzc05hbWUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYgKHRoaXMgPT0gb2JqKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAob2JqID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCUNsYXNzU2lnbmF0dXJlIG90aGVyID0gKENsYXNzU2lnbmF0dXJlKSBvYmo7CisJcmV0dXJuIEFycmF5cy5lcXVhbHModGhpcy5jbGFzc05hbWUsIG90aGVyLmNsYXNzTmFtZSk7Cit9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9FbnVtQ29uc3RhbnRTaWduYXR1cmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvRW51bUNvbnN0YW50U2lnbmF0dXJlLmphdmEKaW5kZXggNjZhODQzNC4uNDM3ZGY5NCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9FbnVtQ29uc3RhbnRTaWduYXR1cmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0VudW1Db25zdGFudFNpZ25hdHVyZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIEJFQSBTeXN0ZW1zLCBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDkgKzcsMTMgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICB0eWV1bmdAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgb2xpdmllcl90aG9tYW5uQGNhLmlibS5jb20gLSBhZGQgaGFzaENvZGUoKSBhbmQgZXF1YWxzKC4uKSBtZXRob2RzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogLyoqCiAgKiBSZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGEgZW51bSBjb25zdGFudCBpbiB0aGUgY2xhc3MgZmlsZS4KICAqIE9uZSBvZiB0aGUgcG9zc2libGUgcmVzdWx0cyBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbiBtZXRob2QuCkBAIC00NSw0ICs0OSwyOSBAQAogCWJ1ZmZlci5hcHBlbmQodGhpcy5jb25zdE5hbWUpOwogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KKworcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwlpbnQgcmVzdWx0ID0gMTsKKwlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIENoYXJPcGVyYXRpb24uaGFzaENvZGUodGhpcy5jb25zdE5hbWUpOworCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgQ2hhck9wZXJhdGlvbi5oYXNoQ29kZSh0aGlzLnR5cGVOYW1lKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCWlmICh0aGlzID09IG9iaikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKG9iaiA9PSBudWxsKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlFbnVtQ29uc3RhbnRTaWduYXR1cmUgb3RoZXIgPSAoRW51bUNvbnN0YW50U2lnbmF0dXJlKSBvYmo7CisJaWYgKCFBcnJheXMuZXF1YWxzKHRoaXMuY29uc3ROYW1lLCBvdGhlci5jb25zdE5hbWUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIEFycmF5cy5lcXVhbHModGhpcy50eXBlTmFtZSwgb3RoZXIudHlwZU5hbWUpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5QW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5QW5ub3RhdGlvbi5qYXZhCmluZGV4IDFhNDI1NDIuLjczODg0MjggMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUFubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlBbm5vdGF0aW9uLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSUJpbmFyeUFubm90YXRpb24gewogCiAvKioKLSAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUuCisgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhlIGFubm90YXRpb24gdHlwZS4KICAqLwogY2hhcltdIGdldFR5cGVOYW1lKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUVsZW1lbnRWYWx1ZVBhaXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUVsZW1lbnRWYWx1ZVBhaXIuamF2YQppbmRleCAwM2I2MGE4Li42YzdjNmM5IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlFbGVtZW50VmFsdWVQYWlyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5RWxlbWVudFZhbHVlUGFpci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IEJFQSBTeXN0ZW1zLCBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw3ICsyNCw3IEBACiAgKiBSZXR1cm4ge0BsaW5rIEVudW1Db25zdGFudFNpZ25hdHVyZX0gaWYgdmFsdWUgaXMgYW4gZW51bSBjb25zdGFudC4KICAqIFJldHVybiB7QGxpbmsgSUJpbmFyeUFubm90YXRpb259IGZvciBhbm5vdGF0aW9uIHR5cGUuCiAgKiBSZXR1cm4ge0BsaW5rIE9iamVjdH1bXSBmb3IgYXJyYXkgdHlwZS4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyIHZhbHVlIHBhaXIKICAqLwogT2JqZWN0IGdldFZhbHVlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5RmllbGQuamF2YQppbmRleCBhMjYzNTY0Li40ZTliNTY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlGaWVsZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUZpZWxkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNyArMTksNyBAQAogSUJpbmFyeUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpOwogCiAvKioKLSAqIAorICoKICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbnN0YW50CiAgKi8KIENvbnN0YW50IGdldENvbnN0YW50KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhCmluZGV4IDQ2MWQ2OTMuLmQ3NTY4NmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDcgKzEyLDcgQEAKIAogLy8gY2xpbml0IG1ldGhvZHMgKHN5bnRoZXRpY3MgdG9vPykgY2FuIGJlIHJldHVybmVkIGZyb20gSUJpbmFyeVR5cGU+PmdldE1ldGhvZHMoKQogLy8gQlVUIGRvIG5vdCBoYXZlIHRvIGJlLi4uIHRoZSBjb21waWxlciB3aWxsIGlnbm9yZSB0aGVtIHdoZW4gYnVpbGRpbmcgdGhlIGJpbmRpbmcuCi0vLyBUaGUgc3ludGhldGljIGFyZ3VtZW50IG9mIGEgbWVtYmVyIHR5cGUncyBjb25zdHJ1Y3RvciAoaWUuIHRoZSBmaXJzdCBhcmcgb2YgYSBub24tc3RhdGljCisvLyBUaGUgc3ludGhldGljIGFyZ3VtZW50IG9mIGEgbWVtYmVyIHR5cGUncyBjb25zdHJ1Y3RvciAoaS5lLiB0aGUgZmlyc3QgYXJnIG9mIGEgbm9uLXN0YXRpYwogLy8gbWVtYmVyIHR5cGUpIGlzIGFsc28gaWdub3JlZCBieSB0aGUgY29tcGlsZXIsIEJVVCBpbiB0aGlzIGNhc2UgaXQgbXVzdCBiZSBpbmNsdWRlZAogLy8gaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgc2lnbmF0dXJlLgogCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBSZXR1cm4ge0BsaW5rIEVudW1Db25zdGFudFNpZ25hdHVyZX0gaWYgdmFsdWUgaXMgYW4gZW51bSBjb25zdGFudC4KICAqIFJldHVybiB7QGxpbmsgSUJpbmFyeUFubm90YXRpb259IGZvciBhbm5vdGF0aW9uIHR5cGUuCiAgKiBSZXR1cm4ge0BsaW5rIE9iamVjdH1bXSBmb3IgYXJyYXkgdHlwZS4KLSAqIAorICoKICAqIEByZXR1cm4gZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24gbWV0aG9kCiAgKi8KIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YQppbmRleCA3ZmVjOWM3Li43NDI0MzI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0LDYgKzI0LDE0IEBACiAKIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKTsKIC8qKgorICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgbWV0aG9kIChpbmNsdWRpbmcgbWV0aG9kIHNlbGVjdG9yIGFuZCBtZXRob2QgZGVzY3JpcHRvciksIG9yCisgKiBudWxsIGlmIG5vbmUuCisgKgorICogRm9yIGV4YW1wbGUsICJmb28oKUxqYXZhL2xhbmcvT2JqZWN0O1YiCisgKi8KKworY2hhcltdIGdldEVuY2xvc2luZ01ldGhvZCgpOworLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB0eXBlIGluIHRoZQogICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYwogICogb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KQEAgLTQxLDcgKzQ5LDcgQEAKICAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUgd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgJgogICogcmV0dXJuIHR5cGVzIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuNC40IG9mIHRoZSBKYXZhIDIgVk0gc3BlYyAzcmQgZWRpdGlvbi4KICAqIFJldHVybnMgbnVsbCBpZiBub25lLgotICogCisgKgogICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUsIG51bGwgaWYgbm9uZQogICovCiBjaGFyW10gZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOwpAQCAtNzIsNiArODAsMTIgQEAKIElCaW5hcnlNZXRob2RbXSBnZXRNZXRob2RzKCk7CiAKIC8qKgorICogQW5zd2VyIHRoZSBsaXN0IG9mIG1pc3NpbmcgdHlwZSBuYW1lcyB3aGljaCB3ZXJlIHJlZmVyZW5jZWQgZnJvbQorICogdGhlIHByb2JsZW0gY2xhc3NmaWxlLiBUaGlzIGxpc3QgaXMgZW5jb2RlZCB2aWEgYW4gZXh0cmEgYXR0cmlidXRlLgorICovCitjaGFyW11bXVtdIGdldE1pc3NpbmdUeXBlTmFtZXMoKTsKKworLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHR5cGUgaW4gdGhlCiAgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjLgogICoKQEAgLTExNSw3ICsxMjksNyBAQAogICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbWVtYmVyIGNsYXNzLgogICogZmFsc2Ugb3RoZXJ3aXNlCiAgKi8KLWJvb2xlYW4gaXNNZW1iZXIoKTsgCitib29sZWFuIGlzTWVtYmVyKCk7CiAKIC8qKgogICogQW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgbm9uZS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggMDhlNDBkMS4uYWRiY2FhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsNyArMjAsNyBAQAogICogSW4gbm9ybWFsIHVzZSwgdGhlIGNvbnRlbnRzIGFyZSByZXF1ZXN0ZWQgdHdpY2UuCiAgKiBPbmNlIGR1cmluZyB0aGUgaW5pdGlhbCBsaXRlIHBhcnNpbmcgc3RlcCwgdGhlbiBhZ2FpbiBmb3IgdGhlCiAgKiBtb3JlIGRldGFpbGVkIHBhcnNpbmcgc3RlcC4KLSAqIEltcGxlbWVudG9ycyBtdXN0IG5ldmVyIHJldHVybiBudWxsIC0gcmV0dXJuIGFuIGVtcHR5IGNoYXJbXSBpbnN0ZWFkLCAKKyAqIEltcGxlbWVudG9ycyBtdXN0IG5ldmVyIHJldHVybiBudWxsIC0gcmV0dXJuIGFuIGVtcHR5IGNoYXJbXSBpbnN0ZWFkLAogICogQ2hhck9wZXJhdGlvbi5OT19DSEFSIGJlaW5nIHRoZSBjYW5kaWRhdGUgb2YgY2hvaWNlLgogICovCiBjaGFyW10gZ2V0Q29udGVudHMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSURlcGVuZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKaW5kZXggZDcwMWE4ZS4uM2Y1MjQ0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsNyArMjcsNyBAQAogICogZS5nLgogICogICJjOlxcc291cmNlXFxjb21cXHBcXFguamF2YSIgb3IKICAqICAiL2NvbS9wL1kuamF2YSIuCi0gKiAKKyAqCiAgKiBUaGUgcGF0aCB0byB0aGUgemlwIG9yIGphciBmaWxlIChvcHRpb25hbCkgbXVzdCBiZSBzZXBhcmF0ZWQKICAqIGZyb20gdGhlIGFjdHVhbCBwYXRoIHBhcnQgYnkgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SLAogICogZS5nLgpAQCAtMzUsOCArMzUsOCBAQAogICogICIvbGliL3NvbWUuemlwfC9jb20vcS9ZLmNsYXNzIi4KICAqCiAgKiBUaGUgcHJvcGVyIGZpbGUgbmFtZSBpbmNsdWRlcyB0aGUgc3VmZml4IGV4dGVuc2lvbiAoZS5nLiZuYnNwOyIuamF2YSIpCi0gKiBlLmcuJm5ic3A7ImM6L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlcmkvZW52L0lEZXBlbmRlbnQuamF2YSIgCi0gKiAKKyAqIGUuZy4mbmJzcDsiYzovb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyaS9lbnYvSURlcGVuZGVudC5qYXZhIgorICoKICAqIFJldHVybiBudWxsIGlmIG5vIGZpbGUgZGVmaW5lcyB0aGUgdHlwZS4KICAqLwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lOYW1lRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCmluZGV4IGFhOWRiMzcuLjUxOTExOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTYyLDcgKzYyLDcgQEAKIC8qKgogICogVGhpcyBtZXRob2QgY2xlYW5zIHRoZSBlbnZpcm9ubWVudCB1by4gSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgbWVtb3J5CiAgKiBhbmQgZnJlZWluZyByZXNvdXJjZXMuIFBhc3NlZCB0aGF0IHBvaW50LCB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBubyBsb25nZXIgdXNhYmxlLgotICogCisgKgogICogQSBuYW1lIGVudmlyb25tZW50IGNhbiBoYXZlIGEgbG9uZyBsaWZlIGN5Y2xlLCB0aGVyZWZvcmUgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCiAgKiB0aGUgY29kZSB3aGljaCBjcmVhdGVkIGl0IHRvIGRlY2lkZSB3aGVuIGl0IGlzIGEgZ29vZCB0aW1lIHRvIGNsZWFuIGl0IHVwLgogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VJbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZUltcG9ydC5qYXZhCmluZGV4IDEyYWJmMjUuLmE1NmNkZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZUltcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZUltcG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDYgKzI3LDYgQEAKICAqIEFuc3dlciBhbiBpbnQgd2hvc2UgYml0cyBhcmUgc2V0IGFjY29yZGluZyB0aGUgYWNjZXNzIGNvbnN0YW50cwogICogZGVmaW5lZCBieSB0aGUgVk0gc3BlYy4KICAqIFNpbmNlIEphdmEgMS41LCBzdGF0aWMgaW1wb3J0cyBjYW4gYmUgZGVmaW5lZC4KLSAqLyAKKyAqLwogaW50IGdldE1vZGlmaWVycygpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvTmFtZUVudmlyb25tZW50QW5zd2VyLmphdmEKaW5kZXggNDgyMGUzOC4uZjQzZjAzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L05hbWVFbnZpcm9ubWVudEFuc3dlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEzICsxMSwxMyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiBwdWJsaWMgY2xhc3MgTmFtZUVudmlyb25tZW50QW5zd2VyIHsKLQkKKwogCS8vIG9ubHkgb25lIG9mIHRoZSB0aHJlZSBjYW4gYmUgc2V0CiAJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZTsKIAlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKIAlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzOwogCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uOwotCQorCiAJcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlcihJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbikgewogCQl0aGlzLmJpbmFyeVR5cGUgPSBiaW5hcnlUeXBlOwogCQl0aGlzLmFjY2Vzc1Jlc3RyaWN0aW9uID0gYWNjZXNzUmVzdHJpY3Rpb247CkBAIC01Nyw3ICs1Nyw3IEBACiAJLyoqCiAJICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIHNvdXJjZSBmb3JtcyBmb3IgdGhlIHR5cGUgb3IgbnVsbCBpZiB0aGUKIAkgKiByZWNlaXZlciByZXByZXNlbnRzIGEgY29tcGlsYXRpb24gdW5pdCBvciBiaW5hcnkgdHlwZS4KLQkgKiAKKwkgKgogCSAqIE11bHRpcGxlIHNvdXJjZSBmb3JtcyBjYW4gYmUgYW5zd2VyZWQgaW4gY2FzZSB0aGUgb3JpZ2luYXRpbmcgY29tcGlsYXRpb24gdW5pdCBkaWQgY29udGFpbgogCSAqIHNldmVyYWwgdHlwZSBhdCBvbmNlLiBUaGVuIHRoZSBmaXJzdCB0eXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHJlcXVlc3RlZCB0eXBlLgogCSAqLwpAQCAtODUsMTEgKzg1LDExIEBACiAJcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlKCkgewogCQlyZXR1cm4gdGhpcy5zb3VyY2VUeXBlcyAhPSBudWxsOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlnbm9yZUlmQmV0dGVyKCkgewogCQlyZXR1cm4gdGhpcy5hY2Nlc3NSZXN0cmljdGlvbiAhPSBudWxsICYmIHRoaXMuYWNjZXNzUmVzdHJpY3Rpb24uaWdub3JlSWZCZXR0ZXIoKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFuc3dlciBpcyBiZXR0ZXIgdGhhbiB0aGUgb3RoZXIgYXdzd2VyLgogCSAqIChhY2Nlc3NpYmxlIGlzIGJldHRlciB0aGFuIGRpc2NvdXJhZ2VkLCB3aGljaCBpcyBiZXR0ZXIgdGhhbgpAQCAtOTgsNyArOTgsNyBAQAogCXB1YmxpYyBib29sZWFuIGlzQmV0dGVyKE5hbWVFbnZpcm9ubWVudEFuc3dlciBvdGhlckFuc3dlcikgewogCQlpZiAob3RoZXJBbnN3ZXIgPT0gbnVsbCkgcmV0dXJuIHRydWU7CiAJCWlmICh0aGlzLmFjY2Vzc1Jlc3RyaWN0aW9uID09IG51bGwpIHJldHVybiB0cnVlOwotCQlyZXR1cm4gb3RoZXJBbnN3ZXIuYWNjZXNzUmVzdHJpY3Rpb24gIT0gbnVsbCAKKwkJcmV0dXJuIG90aGVyQW5zd2VyLmFjY2Vzc1Jlc3RyaWN0aW9uICE9IG51bGwKIAkJCSYmIHRoaXMuYWNjZXNzUmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkgPCBvdGhlckFuc3dlci5hY2Nlc3NSZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Db25kaXRpb25hbEZsb3dJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Db25kaXRpb25hbEZsb3dJbmZvLmphdmEKaW5kZXggNzdiOThkYS4uNWNiNDE2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvQ29uZGl0aW9uYWxGbG93SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzMyNjM3IC0gRGVhZCBDb2RlIGRldGVjdGlvbiByZW1vdmluZyBjb2RlIHRoYXQgaXNuJ3QgZGVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCkBAIC0xOCwxNDggKzE5LDE3NSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRmxvd0luZm8gZXh0ZW5kcyBGbG93SW5mbyB7Ci0JCisKIAlwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZTsKIAlwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2U7Ci0JCisKIENvbmRpdGlvbmFsRmxvd0luZm8oRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UpewotCQorCiAJdGhpcy5pbml0c1doZW5UcnVlID0gaW5pdHNXaGVuVHJ1ZTsKLQl0aGlzLmluaXRzV2hlbkZhbHNlID0gaW5pdHNXaGVuRmFsc2U7IAorCXRoaXMuaW5pdHNXaGVuRmFsc2UgPSBpbml0c1doZW5GYWxzZTsKIH0KIAogcHVibGljIEZsb3dJbmZvIGFkZEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8gb3RoZXJJbml0cykgewotCQorCiAJdGhpcy5pbml0c1doZW5UcnVlLmFkZEluaXRpYWxpemF0aW9uc0Zyb20ob3RoZXJJbml0cyk7CiAJdGhpcy5pbml0c1doZW5GYWxzZS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKG90aGVySW5pdHMpOwogCXJldHVybiB0aGlzOwogfQogCitwdWJsaWMgRmxvd0luZm8gYWRkTnVsbEluZm9Gcm9tKEZsb3dJbmZvIG90aGVySW5pdHMpIHsKKworCXRoaXMuaW5pdHNXaGVuVHJ1ZS5hZGROdWxsSW5mb0Zyb20ob3RoZXJJbml0cyk7CisJdGhpcy5pbml0c1doZW5GYWxzZS5hZGROdWxsSW5mb0Zyb20ob3RoZXJJbml0cyk7CisJcmV0dXJuIHRoaXM7Cit9CisKIHB1YmxpYyBGbG93SW5mbyBhZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKEZsb3dJbmZvIG90aGVySW5pdHMpIHsKLQkKKwogCXRoaXMuaW5pdHNXaGVuVHJ1ZS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKG90aGVySW5pdHMpOwogCXRoaXMuaW5pdHNXaGVuRmFsc2UuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShvdGhlckluaXRzKTsKIAlyZXR1cm4gdGhpczsKIH0KIAogcHVibGljIEZsb3dJbmZvIGFzTmVnYXRlZENvbmRpdGlvbigpIHsKLQkKLQlGbG93SW5mbyBleHRyYSA9IGluaXRzV2hlblRydWU7Ci0JaW5pdHNXaGVuVHJ1ZSA9IGluaXRzV2hlbkZhbHNlOwotCWluaXRzV2hlbkZhbHNlID0gZXh0cmE7CisKKwlGbG93SW5mbyBleHRyYSA9IHRoaXMuaW5pdHNXaGVuVHJ1ZTsKKwl0aGlzLmluaXRzV2hlblRydWUgPSB0aGlzLmluaXRzV2hlbkZhbHNlOworCXRoaXMuaW5pdHNXaGVuRmFsc2UgPSBleHRyYTsKIAlyZXR1cm4gdGhpczsKIH0KIAogcHVibGljIEZsb3dJbmZvIGNvcHkoKSB7Ci0JCi0JcmV0dXJuIG5ldyBDb25kaXRpb25hbEZsb3dJbmZvKGluaXRzV2hlblRydWUuY29weSgpLCBpbml0c1doZW5GYWxzZS5jb3B5KCkpOworCisJcmV0dXJuIG5ldyBDb25kaXRpb25hbEZsb3dJbmZvKHRoaXMuaW5pdHNXaGVuVHJ1ZS5jb3B5KCksIHRoaXMuaW5pdHNXaGVuRmFsc2UuY29weSgpKTsKIH0KIAogcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKCkgewotCQotCXJldHVybiBpbml0c1doZW5GYWxzZTsKKworCXJldHVybiB0aGlzLmluaXRzV2hlbkZhbHNlOwogfQogCiBwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSgpIHsKLQkKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZTsKKworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWU7CiB9Ci0JCisKIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCQotCXJldHVybiBpbml0c1doZW5UcnVlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKSAKLQkJCSYmIGluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKKworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpCisJCQkmJiB0aGlzLmluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKIH0KIAogcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQkKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCkgCi0JCQkmJiBpbml0c1doZW5GYWxzZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCk7CisKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsKQorCQkJJiYgdGhpcy5pbml0c1doZW5GYWxzZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCk7CiB9Ci0JCisKIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseU5vbk51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKSAKLQkJCSYmIGluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpOworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCkKKwkJCSYmIHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CiB9Ci0JCisKIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseU51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSAKLQkJCSYmIGluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseU51bGwobG9jYWwpOworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5TnVsbChsb2NhbCkKKwkJCSYmIHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5TnVsbChsb2NhbCk7CiB9CiAKIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseVVua25vd24oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKSAKLQkJCSYmIGluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseVVua25vd24obG9jYWwpOworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5VW5rbm93bihsb2NhbCkKKwkJCSYmIHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5VW5rbm93bihsb2NhbCk7CiB9Ci0JCisKIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQpIAotCQkJfHwgaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkKTsKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLmlzUG90ZW50aWFsbHlBc3NpZ25lZChmaWVsZCkKKwkJCXx8IHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkKTsKIH0KIAogcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGxvY2FsKSAKLQkJCXx8IGluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbCk7CisJcmV0dXJuIHRoaXMuaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWwpCisJCQl8fCB0aGlzLmluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbCk7CiB9Ci0JCisKIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlOb25OdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUuaXNQb3RlbnRpYWxseU5vbk51bGwobG9jYWwpIAotCQl8fCBpbml0c1doZW5GYWxzZS5pc1BvdGVudGlhbGx5Tm9uTnVsbChsb2NhbCk7Ci19CQotCQorCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUuaXNQb3RlbnRpYWxseU5vbk51bGwobG9jYWwpCisJCXx8IHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseU5vbk51bGwobG9jYWwpOworfQorCiBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5TnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCXJldHVybiBpbml0c1doZW5UcnVlLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKSAKLQkJfHwgaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseU51bGwobG9jYWwpOwotfQkKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKQorCQl8fCB0aGlzLmluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKTsKK30KIAogcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseVVua25vd24oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5VW5rbm93bihsb2NhbCkgCi0JCXx8IGluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlVbmtub3duKGxvY2FsKTsKLX0JCisJcmV0dXJuIHRoaXMuaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5VW5rbm93bihsb2NhbCkKKwkJfHwgdGhpcy5pbml0c1doZW5GYWxzZS5pc1BvdGVudGlhbGx5VW5rbm93bihsb2NhbCk7Cit9CiAKIHB1YmxpYyBib29sZWFuIGlzUHJvdGVjdGVkTm9uTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCXJldHVybiBpbml0c1doZW5UcnVlLmlzUHJvdGVjdGVkTm9uTnVsbChsb2NhbCkgCi0JCSYmIGluaXRzV2hlbkZhbHNlLmlzUHJvdGVjdGVkTm9uTnVsbChsb2NhbCk7Ci19CQkKLQkKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLmlzUHJvdGVjdGVkTm9uTnVsbChsb2NhbCkKKwkJJiYgdGhpcy5pbml0c1doZW5GYWxzZS5pc1Byb3RlY3RlZE5vbk51bGwobG9jYWwpOworfQorCiBwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZE51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1Byb3RlY3RlZE51bGwobG9jYWwpIAotCQkmJiBpbml0c1doZW5GYWxzZS5pc1Byb3RlY3RlZE51bGwobG9jYWwpOwotfQkJCi0JCisJcmV0dXJuIHRoaXMuaW5pdHNXaGVuVHJ1ZS5pc1Byb3RlY3RlZE51bGwobG9jYWwpCisJCSYmIHRoaXMuaW5pdHNXaGVuRmFsc2UuaXNQcm90ZWN0ZWROdWxsKGxvY2FsKTsKK30KKwogcHVibGljIHZvaWQgbWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWluaXRzV2hlblRydWUubWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChsb2NhbCk7Ci0JaW5pdHNXaGVuRmFsc2UubWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChsb2NhbCk7CisJdGhpcy5pbml0c1doZW5UcnVlLm1hcmtBc0NvbXBhcmVkRXF1YWxUb05vbk51bGwobG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UubWFya0FzQ29tcGFyZWRFcXVhbFRvTm9uTnVsbChsb2NhbCk7CiB9CiAKIHB1YmxpYyB2b2lkIG1hcmtBc0NvbXBhcmVkRXF1YWxUb051bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlpbml0c1doZW5UcnVlLm1hcmtBc0NvbXBhcmVkRXF1YWxUb051bGwobG9jYWwpOwotICAgIGluaXRzV2hlbkZhbHNlLm1hcmtBc0NvbXBhcmVkRXF1YWxUb051bGwobG9jYWwpOworCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrQXNDb21wYXJlZEVxdWFsVG9OdWxsKGxvY2FsKTsKKyAgICB0aGlzLmluaXRzV2hlbkZhbHNlLm1hcmtBc0NvbXBhcmVkRXF1YWxUb051bGwobG9jYWwpOwogfQotCQorCiBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7Ci0JaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpOwotCWluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZCk7CQorCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKIH0KIAogcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOwotCWluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCk7CQorCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsKTsKIH0KIAogcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vbk51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlpbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKTsKLQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CQorCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CisJdGhpcy5pbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CiB9CiAKIHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5TnVsbChsb2NhbCk7Ci0JaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseU51bGwobG9jYWwpOwkKKwl0aGlzLmluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseU51bGwobG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseU51bGwobG9jYWwpOworfQorCitwdWJsaWMgdm9pZCByZXNldE51bGxJbmZvKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJdGhpcy5pbml0c1doZW5UcnVlLnJlc2V0TnVsbEluZm8obG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UucmVzZXROdWxsSW5mbyhsb2NhbCk7Cit9CisKK3B1YmxpYyB2b2lkIG1hcmtQb3RlbnRpYWxseU51bGxCaXQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwl0aGlzLmluaXRzV2hlblRydWUubWFya1BvdGVudGlhbGx5TnVsbEJpdChsb2NhbCk7CisJdGhpcy5pbml0c1doZW5GYWxzZS5tYXJrUG90ZW50aWFsbHlOdWxsQml0KGxvY2FsKTsKK30KKworcHVibGljIHZvaWQgbWFya1BvdGVudGlhbGx5Tm9uTnVsbEJpdChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrUG90ZW50aWFsbHlOb25OdWxsQml0KGxvY2FsKTsKKwl0aGlzLmluaXRzV2hlbkZhbHNlLm1hcmtQb3RlbnRpYWxseU5vbk51bGxCaXQobG9jYWwpOwogfQogCiBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5VW5rbm93bihMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseVVua25vd24obG9jYWwpOwotCWluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKTsJCisJdGhpcy5pbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKTsKKwl0aGlzLmluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKTsKK30KKworcHVibGljIHZvaWQgbWFya1BvdGVudGlhbGx5VW5rbm93bkJpdChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrUG90ZW50aWFsbHlVbmtub3duQml0KGxvY2FsKTsKKwl0aGlzLmluaXRzV2hlbkZhbHNlLm1hcmtQb3RlbnRpYWxseVVua25vd25CaXQobG9jYWwpOwogfQogCiBwdWJsaWMgRmxvd0luZm8gc2V0UmVhY2hNb2RlKGludCByZWFjaE1vZGUpIHsKQEAgLTE2NywxMyArMTk1LDEzIEBACiAJCXRoaXMudGFnQml0cyAmPSB+VU5SRUFDSEFCTEU7CiAJfQogCWVsc2UgewotCQl0aGlzLnRhZ0JpdHMgfD0gVU5SRUFDSEFCTEU7CisJCXRoaXMudGFnQml0cyB8PSByZWFjaE1vZGU7CiAJfQotCWluaXRzV2hlblRydWUuc2V0UmVhY2hNb2RlKHJlYWNoTW9kZSk7Ci0JaW5pdHNXaGVuRmFsc2Uuc2V0UmVhY2hNb2RlKHJlYWNoTW9kZSk7CisJdGhpcy5pbml0c1doZW5UcnVlLnNldFJlYWNoTW9kZShyZWFjaE1vZGUpOworCXRoaXMuaW5pdHNXaGVuRmFsc2Uuc2V0UmVhY2hNb2RlKHJlYWNoTW9kZSk7CiAJcmV0dXJuIHRoaXM7CiB9Ci0JCisKIHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gbWVyZ2VkV2l0aChVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cykgewogCXJldHVybiB1bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKG90aGVySW5pdHMpOwogfQpAQCAtMTg0LDM0ICsyMTIsNDkgQEAKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkKLQlyZXR1cm4gIkZsb3dJbmZvPHRydWU6ICIgKyBpbml0c1doZW5UcnVlLnRvU3RyaW5nKCkgKyAiLCBmYWxzZTogIiArIGluaXRzV2hlbkZhbHNlLnRvU3RyaW5nKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCisKKwlyZXR1cm4gIkZsb3dJbmZvPHRydWU6ICIgKyB0aGlzLmluaXRzV2hlblRydWUudG9TdHJpbmcoKSArICIsIGZhbHNlOiAiICsgdGhpcy5pbml0c1doZW5GYWxzZS50b1N0cmluZygpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJAogfQogCiBwdWJsaWMgRmxvd0luZm8gc2FmZUluaXRzV2hlblRydWUoKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWU7CisJcmV0dXJuIHRoaXMuaW5pdHNXaGVuVHJ1ZTsKIH0KIAogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsQ29weSgpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS51bmNvbmRpdGlvbmFsQ29weSgpLgotCQkJbWVyZ2VkV2l0aChpbml0c1doZW5GYWxzZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJcmV0dXJuIHRoaXMuaW5pdHNXaGVuVHJ1ZS51bmNvbmRpdGlvbmFsQ29weSgpLgorCQkJbWVyZ2VkV2l0aCh0aGlzLmluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIH0KIAogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsRmllbGRMZXNzQ29weSgpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS51bmNvbmRpdGlvbmFsRmllbGRMZXNzQ29weSgpLgotCQltZXJnZWRXaXRoKGluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxGaWVsZExlc3NDb3B5KCkpOyAKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxGaWVsZExlc3NDb3B5KCkuCisJCW1lcmdlZFdpdGgodGhpcy5pbml0c1doZW5GYWxzZS51bmNvbmRpdGlvbmFsRmllbGRMZXNzQ29weSgpKTsKIAkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBoZW5jZSBzdWJvcHRpbWFsIGRvZXMgbm90IGh1cnQKIH0KIAogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsSW5pdHMoKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUudW5jb25kaXRpb25hbEluaXRzKCkuCi0JCQltZXJnZWRXaXRoKGluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwlyZXR1cm4gdGhpcy5pbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxJbml0cygpLgorCQkJbWVyZ2VkV2l0aCh0aGlzLmluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIH0KIAogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpIHsKLQkvLyBjYW5ub3QgZG8gYmV0dGVyIGhlcmUgdGhhbiB1bmNvbmRpdGlvbmFsQ29weSAtIGJ1dCBzdGlsbCBhIGRpZmZlcmVudCAKKwkvLyBjYW5ub3QgZG8gYmV0dGVyIGhlcmUgdGhhbiB1bmNvbmRpdGlvbmFsQ29weSAtIGJ1dCBzdGlsbCBhIGRpZmZlcmVudAogCS8vIG9wZXJhdGlvbiBmb3IgVW5jb25kaXRpb25hbEZsb3dJbmZvCi0JcmV0dXJuIGluaXRzV2hlblRydWUudW5jb25kaXRpb25hbENvcHkoKS4KLQkJCW1lcmdlZFdpdGgoaW5pdHNXaGVuRmFsc2UudW5jb25kaXRpb25hbEluaXRzKCkpOworCXJldHVybiB0aGlzLmluaXRzV2hlblRydWUudW5jb25kaXRpb25hbENvcHkoKS4KKwkJCW1lcmdlZFdpdGgodGhpcy5pbml0c1doZW5GYWxzZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Cit9CisKK3B1YmxpYyB2b2lkIG1hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCXRoaXMuaW5pdHNXaGVuVHJ1ZS5tYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UubWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKTsKK30KKworcHVibGljIGJvb2xlYW4gaXNNYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlyZXR1cm4gKHRoaXMuaW5pdHNXaGVuVHJ1ZS5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkKKwkJfHwgdGhpcy5pbml0c1doZW5GYWxzZS5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpOworfQorCitwdWJsaWMgdm9pZCByZXNldEFzc2lnbm1lbnRJbmZvKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJdGhpcy5pbml0c1doZW5UcnVlLnJlc2V0QXNzaWdubWVudEluZm8obG9jYWwpOworCXRoaXMuaW5pdHNXaGVuRmFsc2UucmVzZXRBc3NpZ25tZW50SW5mbyhsb2NhbCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEKaW5kZXggNGY1MzFhZC4uYzk4YWE2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0V4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw2MiArMTQsOTggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlVuaW9uVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN1YlJvdXRpbmVTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UcnlTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLk9iamVjdENhY2hlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNhdGNoUGFyYW1ldGVyQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkV4dHJhQ29tcGlsZXJNb2RpZmllcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIAogLyoqCiAgKiBSZWZsZWN0cyB0aGUgY29udGV4dCBvZiBjb2RlIGFuYWx5c2lzLCBrZWVwaW5nIHRyYWNrIG9mIGVuY2xvc2luZwogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGV4dGVuZHMgRmxvd0NvbnRleHQgewotCQorCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0Q2FjaGVTaXplID0gMzI7IC8vIDMyIGJpdHMgcGVyIGludAotCQorCiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBoYW5kbGVkRXhjZXB0aW9uczsKIAlpbnRbXSBpc1JlYWNoZWQ7CiAJaW50W10gaXNOZWVkZWQ7Ci0JVW5jb25kaXRpb25hbEZsb3dJbmZvW10gaW5pdHNPbkV4Y2VwdGlvbnM7CisJLy8gV0FSTklORzogVGhpcyBpcyBhbiBhcnJheSB0aGF0IG1hcHMgdG8gY2F0Y2ggYmxvY2tzLCBub3QgY2F1Z2h0IGV4Y2VwdGlvbnMgKHdoaWNoIGNvdWxkIGJlIG1vcmUgdGhhbiBjYXRjaCBibG9ja3MgaW4gYSBtdWx0aS1jYXRjaCBibG9jaykKKwlVbmNvbmRpdGlvbmFsRmxvd0luZm9bXSBpbml0c09uRXhjZXB0aW9uczsgCiAJT2JqZWN0Q2FjaGUgaW5kZXhlcyA9IG5ldyBPYmplY3RDYWNoZSgpOwogCWJvb2xlYW4gaXNNZXRob2RDb250ZXh0OwogCiAJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uUmV0dXJuOwotCisJcHVibGljIEZsb3dDb250ZXh0IGluaXRpYWxpemF0aW9uUGFyZW50OyAvLyBzcGVjaWFsIHBhcmVudCByZWxhdGlvbnNoaXAgb25seSBmb3IgaW5pdGlhbGl6YXRpb24gcHVycG9zZQorCQogCS8vIGZvciBkZWFsaW5nIHdpdGggYW5vbnltb3VzIGNvbnN0cnVjdG9yIHRocm93biBleGNlcHRpb25zCiAJcHVibGljIEFycmF5TGlzdCBleHRlbmRlZEV4Y2VwdGlvbnM7Ci0JCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBcmd1bWVudFtdIE5PX0FSR1VNRU5UUyA9IG5ldyBBcmd1bWVudFswXTsKKwlwdWJsaWMgIEFyZ3VtZW50IFtdIGNhdGNoQXJndW1lbnRzOworCisJcHJpdmF0ZSBpbnRbXSBleGNlcHRpb25Ub0NhdGNoQmxvY2tNYXA7CisKK3B1YmxpYyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KAorCQkJRmxvd0NvbnRleHQgcGFyZW50LAorCQkJQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSwKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBoYW5kbGVkRXhjZXB0aW9ucywKKwkJCUZsb3dDb250ZXh0IGluaXRpYWxpemF0aW9uUGFyZW50LAorCQkJQmxvY2tTY29wZSBzY29wZSwKKwkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmbG93SW5mbykgeworCXRoaXMocGFyZW50LCBhc3NvY2lhdGVkTm9kZSwgaGFuZGxlZEV4Y2VwdGlvbnMsIG51bGwsIE5PX0FSR1VNRU5UUywgaW5pdGlhbGl6YXRpb25QYXJlbnQsIHNjb3BlLCBmbG93SW5mbyk7Cit9CiBwdWJsaWMgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKIAkJRmxvd0NvbnRleHQgcGFyZW50LAogCQlBU1ROb2RlIGFzc29jaWF0ZWROb2RlLAogCQlSZWZlcmVuY2VCaW5kaW5nW10gaGFuZGxlZEV4Y2VwdGlvbnMsCisJCWludCBbXSBleGNlcHRpb25Ub0NhdGNoQmxvY2tNYXAsCisJCUFyZ3VtZW50IFtdIGNhdGNoQXJndW1lbnRzLAorCQlGbG93Q29udGV4dCBpbml0aWFsaXphdGlvblBhcmVudCwKIAkJQmxvY2tTY29wZSBzY29wZSwKIAkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKIAlzdXBlcihwYXJlbnQsIGFzc29jaWF0ZWROb2RlKTsKIAl0aGlzLmlzTWV0aG9kQ29udGV4dCA9IHNjb3BlID09IHNjb3BlLm1ldGhvZFNjb3BlKCk7CiAJdGhpcy5oYW5kbGVkRXhjZXB0aW9ucyA9IGhhbmRsZWRFeGNlcHRpb25zOworCXRoaXMuY2F0Y2hBcmd1bWVudHMgPSBjYXRjaEFyZ3VtZW50czsKKwl0aGlzLmV4Y2VwdGlvblRvQ2F0Y2hCbG9ja01hcCA9IGV4Y2VwdGlvblRvQ2F0Y2hCbG9ja01hcDsKIAlpbnQgY291bnQgPSBoYW5kbGVkRXhjZXB0aW9ucy5sZW5ndGgsIGNhY2hlU2l6ZSA9IChjb3VudCAvIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplKSArIDE7CiAJdGhpcy5pc1JlYWNoZWQgPSBuZXcgaW50W2NhY2hlU2l6ZV07IC8vIG5vbmUgaXMgcmVhY2hlZCBieSBkZWZhdWx0CiAJdGhpcy5pc05lZWRlZCA9IG5ldyBpbnRbY2FjaGVTaXplXTsgLy8gbm9uZSBpcyBuZWVkZWQgYnkgZGVmYXVsdAogCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnMgPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvW2NvdW50XTsKKwlib29sZWFuIG1hcmtFeGNlcHRpb25zQW5kVGhyb3dhYmxlQXNSZWFjaGVkID0KKwkJIXRoaXMuaXNNZXRob2RDb250ZXh0IHx8IHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlOwogCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0aGlzLmluZGV4ZXMucHV0KGhhbmRsZWRFeGNlcHRpb25zW2ldLCBpKTsgLy8ga2V5IHR5cGUgIC0+IHZhbHVlIGluZGV4Ci0JCWludCBjYWNoZUluZGV4ID0gaSAvIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplLCBiaXRNYXNrID0gMSA8PCAoaSAlIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplKTsKLQkJaWYgKGhhbmRsZWRFeGNlcHRpb25zW2ldLmlzVW5jaGVja2VkRXhjZXB0aW9uKHRydWUpKSB7Ci0JCQl0aGlzLmlzUmVhY2hlZFtjYWNoZUluZGV4XSB8PSBiaXRNYXNrOwotCQkJdGhpcy5pbml0c09uRXhjZXB0aW9uc1tpXSA9IGZsb3dJbmZvLnVuY29uZGl0aW9uYWxDb3B5KCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgaGFuZGxlZEV4Y2VwdGlvbiA9IGhhbmRsZWRFeGNlcHRpb25zW2ldOworCQlpbnQgY2F0Y2hCbG9jayA9IHRoaXMuZXhjZXB0aW9uVG9DYXRjaEJsb2NrTWFwICE9IG51bGw/IHRoaXMuZXhjZXB0aW9uVG9DYXRjaEJsb2NrTWFwW2ldIDogaTsKKwkJdGhpcy5pbmRleGVzLnB1dChoYW5kbGVkRXhjZXB0aW9uLCBpKTsgLy8ga2V5IHR5cGUgIC0+IHZhbHVlIGluZGV4CisJCWlmIChoYW5kbGVkRXhjZXB0aW9uLmlzVW5jaGVja2VkRXhjZXB0aW9uKHRydWUpKSB7CisJCQlpZiAobWFya0V4Y2VwdGlvbnNBbmRUaHJvd2FibGVBc1JlYWNoZWQgfHwKKwkJCQkJaGFuZGxlZEV4Y2VwdGlvbi5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdUaHJvd2FibGUgJiYKKwkJCQkJaGFuZGxlZEV4Y2VwdGlvbi5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdFeGNlcHRpb24pIHsKKwkJCQl0aGlzLmlzUmVhY2hlZFtpIC8gRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemVdIHw9IDEgPDwgKGkgJSBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZSk7CisJCQl9CisJCQl0aGlzLmluaXRzT25FeGNlcHRpb25zW2NhdGNoQmxvY2tdID0gZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaV0gPSBGbG93SW5mby5ERUFEX0VORDsKKwkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbY2F0Y2hCbG9ja10gPSBGbG93SW5mby5ERUFEX0VORDsKIAkJfQogCX0KLQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaXNSZWFjaGVkLCAwLCB0aGlzLmlzTmVlZGVkLCAwLCBjYWNoZVNpemUpOwotCXRoaXMuaW5pdHNPblJldHVybiA9IEZsb3dJbmZvLkRFQURfRU5EOwkKKwlpZiAoIXRoaXMuaXNNZXRob2RDb250ZXh0KSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pc1JlYWNoZWQsIDAsIHRoaXMuaXNOZWVkZWQsIDAsIGNhY2hlU2l6ZSk7CisJfQorCXRoaXMuaW5pdHNPblJldHVybiA9IEZsb3dJbmZvLkRFQURfRU5EOworCXRoaXMuaW5pdGlhbGl6YXRpb25QYXJlbnQgPSBpbml0aWFsaXphdGlvblBhcmVudDsKIH0KIAogcHVibGljIHZvaWQgY29tcGxhaW5JZlVudXNlZEV4Y2VwdGlvbkhhbmRsZXJzKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CkBAIC03OSwxMyArMTE1LDI4IEBACiAJICAgICAgICAmJiAhc2NvcGUuY29tcGlsZXJPcHRpb25zKCkucmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZykgewogCSAgICByZXR1cm47CiAJfQotCSAgICAKKwogCS8vIHJlcG9ydCBlcnJvcnMgZm9yIHVucmVhY2hhYmxlIGV4Y2VwdGlvbiBoYW5kbGVycwotCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRoaXMuaGFuZGxlZEV4Y2VwdGlvbnMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCVR5cGVCaW5kaW5nW10gZG9jQ29tbWVudFJlZmVyZW5jZXMgPSBudWxsOworCWludCBkb2NDb21tZW50UmVmZXJlbmNlc0xlbmd0aCA9IDA7CisJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLgorCQkJCXJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UgJiYKKwkJCW1ldGhvZC5qYXZhZG9jICE9IG51bGwgJiYKKwkJCW1ldGhvZC5qYXZhZG9jLmV4Y2VwdGlvblJlZmVyZW5jZXMgIT0gbnVsbCAmJgorCQkJKGRvY0NvbW1lbnRSZWZlcmVuY2VzTGVuZ3RoID0gbWV0aG9kLmphdmFkb2MuZXhjZXB0aW9uUmVmZXJlbmNlcy5sZW5ndGgpID4gMCkgeworCQlkb2NDb21tZW50UmVmZXJlbmNlcyA9IG5ldyBUeXBlQmluZGluZ1tkb2NDb21tZW50UmVmZXJlbmNlc0xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jQ29tbWVudFJlZmVyZW5jZXNMZW5ndGg7IGkrKykgeworCQkJZG9jQ29tbWVudFJlZmVyZW5jZXNbaV0gPSBtZXRob2QuamF2YWRvYy5leGNlcHRpb25SZWZlcmVuY2VzW2ldLnJlc29sdmVkVHlwZTsKKwkJfQorCX0KKwluZXh0SGFuZGxlZEV4Y2VwdGlvbjogZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gdGhpcy5oYW5kbGVkRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCWludCBpbmRleCA9IHRoaXMuaW5kZXhlcy5nZXQodGhpcy5oYW5kbGVkRXhjZXB0aW9uc1tpXSk7Ci0JCWludCBjYWNoZUluZGV4ID0gaW5kZXggLyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZTsKLQkJaW50IGJpdE1hc2sgPSAxIDw8IChpbmRleCAlIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplKTsKLQkJaWYgKCh0aGlzLmlzUmVhY2hlZFtjYWNoZUluZGV4XSAmIGJpdE1hc2spID09IDApIHsKKwkJaWYgKCh0aGlzLmlzUmVhY2hlZFtpbmRleCAvIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplXSAmIDEgPDwgKGluZGV4ICUgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemUpKSA9PSAwKSB7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGRvY0NvbW1lbnRSZWZlcmVuY2VzTGVuZ3RoOyBqKyspIHsKKwkJCQlpZiAoZG9jQ29tbWVudFJlZmVyZW5jZXNbal0gPT0gdGhpcy5oYW5kbGVkRXhjZXB0aW9uc1tpXSkgeworCQkJCQljb250aW51ZSBuZXh0SGFuZGxlZEV4Y2VwdGlvbjsKKwkJCQl9CisJCQl9CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbigKIAkJCQl0aGlzLmhhbmRsZWRFeGNlcHRpb25zW2luZGV4XSwKIAkJCQltZXRob2QsCkBAIC05NiwyNCArMTQ3LDQxIEBACiAKIHB1YmxpYyB2b2lkIGNvbXBsYWluSWZVbnVzZWRFeGNlcHRpb25IYW5kbGVycyhCbG9ja1Njb3BlIHNjb3BlLFRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQpIHsKIAkvLyByZXBvcnQgZXJyb3JzIGZvciB1bnJlYWNoYWJsZSBleGNlcHRpb24gaGFuZGxlcnMKLQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0aGlzLmhhbmRsZWRFeGNlcHRpb25zLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleGVzLmdldCh0aGlzLmhhbmRsZWRFeGNlcHRpb25zW2ldKTsKKwlmb3IgKGludCBpbmRleCA9IDAsIGNvdW50ID0gdGhpcy5oYW5kbGVkRXhjZXB0aW9ucy5sZW5ndGg7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKIAkJaW50IGNhY2hlSW5kZXggPSBpbmRleCAvIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplOwogCQlpbnQgYml0TWFzayA9IDEgPDwgKGluZGV4ICUgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemUpOwogCQlpZiAoKHRoaXMuaXNSZWFjaGVkW2NhY2hlSW5kZXhdICYgYml0TWFzaykgPT0gMCkgewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZWFjaGFibGVDYXRjaEJsb2NrKAogCQkJCXRoaXMuaGFuZGxlZEV4Y2VwdGlvbnNbaW5kZXhdLAotCQkJCXRyeVN0YXRlbWVudC5jYXRjaEFyZ3VtZW50c1tpbmRleF0udHlwZSk7CisJCQkJZ2V0RXhjZXB0aW9uVHlwZShpbmRleCkpOwogCQl9IGVsc2UgewogCQkJaWYgKCh0aGlzLmlzTmVlZGVkW2NhY2hlSW5kZXhdICYgYml0TWFzaykgPT0gMCkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmhpZGRlbkNhdGNoQmxvY2soCiAJCQkJCXRoaXMuaGFuZGxlZEV4Y2VwdGlvbnNbaW5kZXhdLAotCQkJCQl0cnlTdGF0ZW1lbnQuY2F0Y2hBcmd1bWVudHNbaW5kZXhdLnR5cGUpOworCQkJCQlnZXRFeGNlcHRpb25UeXBlKGluZGV4KSk7CiAJCQl9CiAJCX0KIAl9CiB9CiAKK3ByaXZhdGUgQVNUTm9kZSBnZXRFeGNlcHRpb25UeXBlKGludCBpbmRleCkgewkKKwlpZiAodGhpcy5leGNlcHRpb25Ub0NhdGNoQmxvY2tNYXAgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5jYXRjaEFyZ3VtZW50c1tpbmRleF0udHlwZTsKKwl9CisJaW50IGNhdGNoQmxvY2sgPSB0aGlzLmV4Y2VwdGlvblRvQ2F0Y2hCbG9ja01hcFtpbmRleF07CisJQVNUTm9kZSBub2RlID0gdGhpcy5jYXRjaEFyZ3VtZW50c1tjYXRjaEJsb2NrXS50eXBlOworCWlmIChub2RlIGluc3RhbmNlb2YgVW5pb25UeXBlUmVmZXJlbmNlKSB7CisJCVR5cGVSZWZlcmVuY2VbXSB0eXBlUmVmcyA9ICgoVW5pb25UeXBlUmVmZXJlbmNlKW5vZGUpLnR5cGVSZWZlcmVuY2VzOworCQlmb3IgKGludCBpID0gMCwgbGVuID0gdHlwZVJlZnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IHR5cGVSZWZzW2ldOworCQkJaWYgKHR5cGVSZWYucmVzb2x2ZWRUeXBlID09IHRoaXMuaGFuZGxlZEV4Y2VwdGlvbnNbaW5kZXhdKSByZXR1cm4gdHlwZVJlZjsKKwkJfQkKKwl9IAorCXJldHVybiBub2RlOworfQorCisKKwogcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7CiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkV4Y2VwdGlvbiBmbG93IGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAogCWludCBsZW5ndGggPSB0aGlzLmhhbmRsZWRFeGNlcHRpb25zLmxlbmd0aDsKQEAgLTEzMCwyNCArMTk4LDIzIEBACiAJCX0gZWxzZSB7CiAJCQlidWZmZXIuYXBwZW5kKCItbm90IHJlYWNoZWQiKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJy0nKS5hcHBlbmQodGhpcy5pbml0c09uRXhjZXB0aW9uc1tpXS50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsKKwkJaW50IGNhdGNoQmxvY2sgPSB0aGlzLmV4Y2VwdGlvblRvQ2F0Y2hCbG9ja01hcCAhPSBudWxsPyB0aGlzLmV4Y2VwdGlvblRvQ2F0Y2hCbG9ja01hcFtpXSA6IGk7CisJCWJ1ZmZlci5hcHBlbmQoJy0nKS5hcHBlbmQodGhpcy5pbml0c09uRXhjZXB0aW9uc1tjYXRjaEJsb2NrXS50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsKIAl9CiAJYnVmZmVyLmFwcGVuZCgiW2luaXRzT25SZXR1cm4gLSIpLmFwcGVuZCh0aGlzLmluaXRzT25SZXR1cm4udG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiAKLXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkV4Y2VwdGlvbihSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUpIHsKLQlpbnQgaW5kZXg7Ci0JaWYgKChpbmRleCA9IHRoaXMuaW5kZXhlcy5nZXQoZXhjZXB0aW9uVHlwZSkpIDwgMCkgewotCQlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7Ci0JfQorLy8gV0FSTklORzogaW5kZXggaXMgdGhlIGNhdGNoIGJsb2NrIGluZGV4IGFzIGluIHRoZSBwcm9ncmFtIG9yZGVyLCBiZWZvcmUgYW55IG5vcm1hbGl6YXRpb24gaXMKKy8vIGFwcGxpZWQgZm9yIG11bHRpIGNhdGNoCitwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGluaXRzT25FeGNlcHRpb24oaW50IGluZGV4KSB7CiAJcmV0dXJuIHRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaW5kZXhdOwogfQogCiBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGluaXRzT25SZXR1cm4oKXsKIAlyZXR1cm4gdGhpcy5pbml0c09uUmV0dXJuOwogfQotCQorCiAvKgogICogQ29tcHV0ZSBhIG1lcmdlZCBsaXN0IG9mIHVuaGFuZGxlZCBleGNlcHRpb24gdHlwZXMgKGtlZXBpbmcgb25seSB0aGUgbW9zdCBnZW5lcmljIG9uZXMpLgogICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWRkIHN5bnRoZXRpYyB0aHJvd24gZXhjZXB0aW9ucyBmb3IgYW5vbnltb3VzIHR5cGUgY29uc3RydWN0b3JzIChKTFMgOC42KS4KQEAgLTE2MCw3ICsyMjcsNyBAQAogCQl9CiAJfQogCWJvb2xlYW4gaXNSZWR1bmRhbnQgPSBmYWxzZTsKLQkKKwogCWZvcihpbnQgaSA9IHRoaXMuZXh0ZW5kZWRFeGNlcHRpb25zLnNpemUoKS0xOyBpID49IDA7IGktLSl7CiAJCXN3aXRjaChTY29wZS5jb21wYXJlVHlwZXMobmV3RXhjZXB0aW9uLCAoVHlwZUJpbmRpbmcpdGhpcy5leHRlbmRlZEV4Y2VwdGlvbnMuZ2V0KGkpKSl7CiAJCQljYXNlIFNjb3BlLk1PUkVfR0VORVJJQyA6CkBAIC0xNzcsMzQgKzI0NCwzOCBAQAogCQl0aGlzLmV4dGVuZGVkRXhjZXB0aW9ucy5hZGQobmV3RXhjZXB0aW9uKTsKIAl9CiB9Ci0JCisKIHB1YmxpYyB2b2lkIHJlY29yZEhhbmRsaW5nRXhjZXB0aW9uKAogCQlSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUsCiAJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmbG93SW5mbywKIAkJVHlwZUJpbmRpbmcgcmFpc2VkRXhjZXB0aW9uLAorCQlUeXBlQmluZGluZyBjYXVnaHRFeGNlcHRpb24sCiAJCUFTVE5vZGUgaW52b2NhdGlvblNpdGUsCiAJCWJvb2xlYW4gd2FzQWxyZWFkeURlZmluaXRlbHlDYXVnaHQpIHsKLQkJCisKIAlpbnQgaW5kZXggPSB0aGlzLmluZGV4ZXMuZ2V0KGV4Y2VwdGlvblR5cGUpOwotCS8vIGlmIGFscmVhZHkgZmxhZ2dlZCBhcyBiZWluZyByZWFjaGVkICh1bmNoZWNrZWQgZXhjZXB0aW9uIGhhbmRsZXIpCiAJaW50IGNhY2hlSW5kZXggPSBpbmRleCAvIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplOwogCWludCBiaXRNYXNrID0gMSA8PCAoaW5kZXggJSBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZSk7CiAJaWYgKCF3YXNBbHJlYWR5RGVmaW5pdGVseUNhdWdodCkgewogCQl0aGlzLmlzTmVlZGVkW2NhY2hlSW5kZXhdIHw9IGJpdE1hc2s7CiAJfQogCXRoaXMuaXNSZWFjaGVkW2NhY2hlSW5kZXhdIHw9IGJpdE1hc2s7Ci0JCi0JdGhpcy5pbml0c09uRXhjZXB0aW9uc1tpbmRleF0gPQotCQkodGhpcy5pbml0c09uRXhjZXB0aW9uc1tpbmRleF0udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSA9PSAwID8KLQkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaW5kZXhdLm1lcmdlZFdpdGgoZmxvd0luZm8pOgorCWludCBjYXRjaEJsb2NrID0gdGhpcy5leGNlcHRpb25Ub0NhdGNoQmxvY2tNYXAgIT0gbnVsbD8gdGhpcy5leGNlcHRpb25Ub0NhdGNoQmxvY2tNYXBbaW5kZXhdIDogaW5kZXg7CisJaWYgKGNhdWdodEV4Y2VwdGlvbiAhPSBudWxsICYmIHRoaXMuY2F0Y2hBcmd1bWVudHMgIT0gbnVsbCAmJiB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgIXdhc0FscmVhZHlEZWZpbml0ZWx5Q2F1Z2h0KSB7CisJCUNhdGNoUGFyYW1ldGVyQmluZGluZyBjYXRjaFBhcmFtZXRlciA9IChDYXRjaFBhcmFtZXRlckJpbmRpbmcpIHRoaXMuY2F0Y2hBcmd1bWVudHNbY2F0Y2hCbG9ja10uYmluZGluZzsKKwkJY2F0Y2hQYXJhbWV0ZXIuc2V0UHJlY2lzZVR5cGUoY2F1Z2h0RXhjZXB0aW9uKTsKKwl9CisJdGhpcy5pbml0c09uRXhjZXB0aW9uc1tjYXRjaEJsb2NrXSA9CisJCSh0aGlzLmluaXRzT25FeGNlcHRpb25zW2NhdGNoQmxvY2tdLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCA/CisJCQl0aGlzLmluaXRzT25FeGNlcHRpb25zW2NhdGNoQmxvY2tdLm1lcmdlZFdpdGgoZmxvd0luZm8pOgogCQkJZmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKTsKIH0KIAogcHVibGljIHZvaWQgcmVjb3JkUmV0dXJuRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKLQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgewotCQlpZiAoKHRoaXMuaW5pdHNPblJldHVybi50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKSB7CisJCWlmICgodGhpcy5pbml0c09uUmV0dXJuLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKSB7CiAJCQl0aGlzLmluaXRzT25SZXR1cm4gPSB0aGlzLmluaXRzT25SZXR1cm4ubWVyZ2VkV2l0aChmbG93SW5mbyk7Ci0JCX0gCisJCX0KIAkJZWxzZSB7CiAJCQl0aGlzLmluaXRzT25SZXR1cm4gPSAoVW5jb25kaXRpb25hbEZsb3dJbmZvKSBmbG93SW5mby5jb3B5KCk7CiAJCX0KQEAgLTIyMSw4ICsyOTIsOCBAQAogcHVibGljIFN1YlJvdXRpbmVTdGF0ZW1lbnQgc3Vicm91dGluZSgpIHsKIAlpZiAodGhpcy5hc3NvY2lhdGVkTm9kZSBpbnN0YW5jZW9mIFN1YlJvdXRpbmVTdGF0ZW1lbnQpIHsKIAkJLy8gZXhjZXB0aW9uIGhhbmRsZXIgY29udGV4dCBtYXkgYmUgY2hpbGQgb2YgSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LCB3aGljaCBtYXBzIHRvIHNhbWUgaGFuZGxlcgotCQlpZiAodGhpcy5wYXJlbnQuc3Vicm91dGluZSgpID09IHRoaXMuYXNzb2NpYXRlZE5vZGUpIAotCQkJcmV0dXJuIG51bGw7CQkKKwkJaWYgKHRoaXMucGFyZW50LnN1YnJvdXRpbmUoKSA9PSB0aGlzLmFzc29jaWF0ZWROb2RlKQorCQkJcmV0dXJuIG51bGw7CiAJCXJldHVybiAoU3ViUm91dGluZVN0YXRlbWVudCkgdGhpcy5hc3NvY2lhdGVkTm9kZTsKIAl9CiAJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GaW5hbGx5Rmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0ZpbmFsbHlGbG93Q29udGV4dC5qYXZhCmluZGV4IDU1NzIzMjkuLjA1OTA1ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0ZpbmFsbHlGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0ZpbmFsbHlGbG93Q29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nOwogCiAvKioKQEAgLTI0LDM4ICsyNSwzOCBAQAogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBGaW5hbGx5Rmxvd0NvbnRleHQgZXh0ZW5kcyBGbG93Q29udGV4dCB7Ci0JCisKIAlSZWZlcmVuY2VbXSBmaW5hbEFzc2lnbm1lbnRzOwogCVZhcmlhYmxlQmluZGluZ1tdIGZpbmFsVmFyaWFibGVzOwogCWludCBhc3NpZ25Db3VudDsKIAotCUxvY2FsVmFyaWFibGVCaW5kaW5nW10gbnVsbExvY2FsczsJCisJTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBudWxsTG9jYWxzOwogCUV4cHJlc3Npb25bXSBudWxsUmVmZXJlbmNlczsKIAlpbnRbXSBudWxsQ2hlY2tUeXBlczsKIAlpbnQgbnVsbENvdW50OwotCQorCiAJcHVibGljIEZpbmFsbHlGbG93Q29udGV4dChGbG93Q29udGV4dCBwYXJlbnQsIEFTVE5vZGUgYXNzb2NpYXRlZE5vZGUpIHsKIAkJc3VwZXIocGFyZW50LCBhc3NvY2lhdGVkTm9kZSk7CiAJfQogCiAvKioKLSAqIEdpdmVuIHNvbWUgY29udGV4dHVhbCBpbml0aWFsaXphdGlvbiBpbmZvIChkZXJpdmVkIGZyb20gYSB0cnkgYmxvY2sgb3IgYSBjYXRjaCBibG9jayksIHRoaXMgCisgKiBHaXZlbiBzb21lIGNvbnRleHR1YWwgaW5pdGlhbGl6YXRpb24gaW5mbyAoZGVyaXZlZCBmcm9tIGEgdHJ5IGJsb2NrIG9yIGEgY2F0Y2ggYmxvY2spLCB0aGlzCiAgKiBjb2RlIHdpbGwgY2hlY2sgdGhhdCB0aGUgc3Vicm91dGluZSBjb250ZXh0IGRvZXMgbm90IGFsc28gaW5pdGlhbGl6ZSBhIGZpbmFsIHZhcmlhYmxlIHBvdGVudGlhbGx5IHNldAogICogcmVkdW5kYW50bHkuCiAgKi8KIHB1YmxpYyB2b2lkIGNvbXBsYWluT25EZWZlcnJlZENoZWNrcyhGbG93SW5mbyBmbG93SW5mbywgQmxvY2tTY29wZSBzY29wZSkgewotCQorCiAJLy8gY2hlY2sgcmVkdW5kYW50IGZpbmFsIGFzc2lnbm1lbnRzCiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFzc2lnbkNvdW50OyBpKyspIHsKIAkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlID0gdGhpcy5maW5hbFZhcmlhYmxlc1tpXTsKIAkJaWYgKHZhcmlhYmxlID09IG51bGwpIGNvbnRpbnVlOwotCQkKKwogCQlib29sZWFuIGNvbXBsYWluZWQgPSBmYWxzZTsgLy8gcmVtZW1iZXIgaWYgaGF2ZSBjb21wbGFpbmVkIG9uIHRoaXMgZmluYWwgYXNzaWdubWVudAogCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKIAkJCS8vIGZpbmFsIGZpZWxkCiAJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKChGaWVsZEJpbmRpbmcpdmFyaWFibGUpKSB7CiAJCQkJY29tcGxhaW5lZCA9IHRydWU7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZCgoRmllbGRCaW5kaW5nKXZhcmlhYmxlLCBmaW5hbEFzc2lnbm1lbnRzW2ldKTsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKChGaWVsZEJpbmRpbmcpdmFyaWFibGUsIHRoaXMuZmluYWxBc3NpZ25tZW50c1tpXSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvLyBmaW5hbCBsb2NhbCB2YXJpYWJsZQpAQCAtNjYsNyArNjcsNyBAQAogCQkJCQl0aGlzLmZpbmFsQXNzaWdubWVudHNbaV0pOwogCQkJfQogCQl9Ci0JCS8vIGFueSByZWZlcmVuY2UgcmVwb3J0ZWQgYXQgdGhpcyBsZXZlbCBpcyByZW1vdmVkIGZyb20gdGhlIHBhcmVudCBjb250ZXh0IAorCQkvLyBhbnkgcmVmZXJlbmNlIHJlcG9ydGVkIGF0IHRoaXMgbGV2ZWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQgY29udGV4dAogCQkvLyB3aGVyZSBpdCBjb3VsZCBhbHNvIGJlIHJlcG9ydGVkIGFnYWluCiAJCWlmIChjb21wbGFpbmVkKSB7CiAJCQlGbG93Q29udGV4dCBjdXJyZW50Q29udGV4dCA9IHRoaXMucGFyZW50OwpAQCAtNzgsMTEgKzc5LDExIEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAkvLyBjaGVjayBpbmNvbnNpc3RlbnQgbnVsbCBjaGVja3MKLQlpZiAodGhpcy5kZWZlck51bGxEaWFnbm9zdGljKSB7IC8vIHdpdGhpbiBhbiBlbmNsb3NpbmcgbG9vcCwgYmUgY29uc2VydmF0aXZlCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ERUZFUl9OVUxMX0RJQUdOT1NUSUMpICE9IDApIHsgLy8gd2l0aGluIGFuIGVuY2xvc2luZyBsb29wLCBiZSBjb25zZXJ2YXRpdmUKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm51bGxDb3VudDsgaSsrKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIHRoaXMubnVsbExvY2Fsc1tpXSwgCisJCQl0aGlzLnBhcmVudC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIHRoaXMubnVsbExvY2Fsc1tpXSwKIAkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSwJdGhpcy5udWxsQ2hlY2tUeXBlc1tpXSwgZmxvd0luZm8pOwogCQl9CiAJfQpAQCAtOTYsMTIgKzk3LDE3IEBACiAJCQkJY2FzZSBDQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OT05fTlVMTDoKIAkJCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpKSB7CiAJCQkJCQlpZiAodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSA9PSAoQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEwpKSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTm9uTnVsbENvbXBhcmVkVG9OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQorCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OVUxMOgogCQkJCWNhc2UgQ0FOX09OTFlfTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEw6CiAJCQkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQVNTSUdOTUVOVDoKQEAgLTEwOSwxMCArMTE1LDIyIEBACiAJCQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkgewogCQkJCQkJc3dpdGNoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDT05URVhUX01BU0spIHsKIAkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJaWYgKCgodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbFJlZmVyZW5jZShsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnRDaGVja09uTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCX0KIAkJCQkJCQkJY29udGludWU7CiAJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgotCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJaWYgKCgodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbFJlZmVyZW5jZShsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQl9CiAJCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJCWNhc2UgRmxvd0NvbnRleHQuSU5fQVNTSUdOTUVOVDoKIAkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudE51bGxBc3NpZ25tZW50KGxvY2FsLCBleHByZXNzaW9uKTsKQEAgLTEyMSw2ICsxMzksMjMgQEAKIAkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxJbnN0YW5jZW9mKGxvY2FsLCBleHByZXNzaW9uKTsKIAkJCQkJCQkJY29udGludWU7CiAJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKSB7CisJCQkJCQlzd2l0Y2godGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENPTlRFWFRfTUFTSykgeworCQkJCQkJCWNhc2UgRmxvd0NvbnRleHQuSU5fQ09NUEFSSVNPTl9OVUxMOgorCQkJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKKwkJCQkJCQkJaWYgKCgodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6CisJCQkJCQkJCXRoaXMubnVsbFJlZmVyZW5jZXNbaV0gPSBudWxsOworCQkJCQkJCQlpZiAoKCh0aGlzLm51bGxDaGVja1R5cGVzW2ldICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgTUFZX05VTEw6CkBAIC0xMzgsNDkgKzE3Myw0OSBAQAogCQl9CiAJfQogfQotCQorCiAJcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7Ci0JCQorCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaW5hbGx5IGZsb3cgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIltmaW5hbEFzc2lnbm1lbnRzIGNvdW50IC0gIikuYXBwZW5kKGFzc2lnbkNvdW50KS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJbbnVsbFJlZmVyZW5jZXMgY291bnQgLSAiKS5hcHBlbmQobnVsbENvdW50KS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbZmluYWxBc3NpZ25tZW50cyBjb3VudCAtICIpLmFwcGVuZCh0aGlzLmFzc2lnbkNvdW50KS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbbnVsbFJlZmVyZW5jZXMgY291bnQgLSAiKS5hcHBlbmQodGhpcy5udWxsQ291bnQpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1N1YlJvdXRpbmUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXByb3RlY3RlZCBib29sZWFuIHJlY29yZEZpbmFsQXNzaWdubWVudCgKIAkJVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcsCiAJCVJlZmVyZW5jZSBmaW5hbEFzc2lnbm1lbnQpIHsKLQkJaWYgKGFzc2lnbkNvdW50ID09IDApIHsKLQkJCWZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlWzVdOwotCQkJZmluYWxWYXJpYWJsZXMgPSBuZXcgVmFyaWFibGVCaW5kaW5nWzVdOworCQlpZiAodGhpcy5hc3NpZ25Db3VudCA9PSAwKSB7CisJCQl0aGlzLmZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlWzVdOworCQkJdGhpcy5maW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbNV07CiAJCX0gZWxzZSB7Ci0JCQlpZiAoYXNzaWduQ291bnQgPT0gZmluYWxBc3NpZ25tZW50cy5sZW5ndGgpCisJCQlpZiAodGhpcy5hc3NpZ25Db3VudCA9PSB0aGlzLmZpbmFsQXNzaWdubWVudHMubGVuZ3RoKQogCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCWZpbmFsQXNzaWdubWVudHMsCisJCQkJCXRoaXMuZmluYWxBc3NpZ25tZW50cywKIAkJCQkJMCwKLQkJCQkJKGZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlW2Fzc2lnbkNvdW50ICogMl0pLAorCQkJCQkodGhpcy5maW5hbEFzc2lnbm1lbnRzID0gbmV3IFJlZmVyZW5jZVt0aGlzLmFzc2lnbkNvdW50ICogMl0pLAogCQkJCQkwLAotCQkJCQlhc3NpZ25Db3VudCk7CisJCQkJCXRoaXMuYXNzaWduQ291bnQpOwogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlmaW5hbFZhcmlhYmxlcywKKwkJCQl0aGlzLmZpbmFsVmFyaWFibGVzLAogCQkJCTAsCi0JCQkJKGZpbmFsVmFyaWFibGVzID0gbmV3IFZhcmlhYmxlQmluZGluZ1thc3NpZ25Db3VudCAqIDJdKSwKKwkJCQkodGhpcy5maW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbdGhpcy5hc3NpZ25Db3VudCAqIDJdKSwKIAkJCQkwLAotCQkJCWFzc2lnbkNvdW50KTsKKwkJCQl0aGlzLmFzc2lnbkNvdW50KTsKIAkJfQotCQlmaW5hbEFzc2lnbm1lbnRzW2Fzc2lnbkNvdW50XSA9IGZpbmFsQXNzaWdubWVudDsKLQkJZmluYWxWYXJpYWJsZXNbYXNzaWduQ291bnQrK10gPSBiaW5kaW5nOworCQl0aGlzLmZpbmFsQXNzaWdubWVudHNbdGhpcy5hc3NpZ25Db3VudF0gPSBmaW5hbEFzc2lnbm1lbnQ7CisJCXRoaXMuZmluYWxWYXJpYWJsZXNbdGhpcy5hc3NpZ25Db3VudCsrXSA9IGJpbmRpbmc7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXB1YmxpYyB2b2lkIHJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShTY29wZSBzY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIAorCXB1YmxpYyB2b2lkIHJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShTY29wZSBzY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsCiAJCQlFeHByZXNzaW9uIHJlZmVyZW5jZSwgaW50IGNoZWNrVHlwZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDAgJiYgIWZsb3dJbmZvLmlzRGVmaW5pdGVseVVua25vd24obG9jYWwpKQl7Ci0JCQlpZiAoZGVmZXJOdWxsRGlhZ25vc3RpYykgeyAvLyB3aXRoaW4gYW4gZW5jbG9zaW5nIGxvb3AsIGJlIGNvbnNlcnZhdGl2ZQorCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ERUZFUl9OVUxMX0RJQUdOT1NUSUMpICE9IDApIHsgLy8gd2l0aGluIGFuIGVuY2xvc2luZyBsb29wLCBiZSBjb25zZXJ2YXRpdmUKIAkJCQlzd2l0Y2ggKGNoZWNrVHlwZSkgewogCQkJCQljYXNlIENBTl9PTkxZX05VTExfTk9OX05VTEwgfCBJTl9DT01QQVJJU09OX05VTEw6CiAJCQkJCWNhc2UgQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEw6CkBAIC0xOTAsMTkgKzIyNSw0NyBAQAogCQkJCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9JTlNUQU5DRU9GOgogCQkJCQkJaWYgKGZsb3dJbmZvLmNhbm5vdEJlTnVsbChsb2NhbCkpIHsKIAkJCQkJCQlpZiAoY2hlY2tUeXBlID09IChDQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OT05fTlVMTCkpIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICghZmxvd0luZm8uaXNNYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpKSB7CisJCQkJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIGlmIChjaGVja1R5cGUgPT0gKENBTl9PTkxZX05VTExfTk9OX05VTEwgfCBJTl9DT01QQVJJU09OX05VTEwpKSB7CisJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU5vbk51bGxDb21wYXJlZFRvTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJCXJldHVybjsKIAkJCQkJCX0KIAkJCQkJCWlmIChmbG93SW5mby5jYW5Pbmx5QmVOdWxsKGxvY2FsKSkgewogCQkJCQkJCXN3aXRjaChjaGVja1R5cGUgJiBDT05URVhUX01BU0spIHsKIAkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05VTEw6Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQlpZiAoKChjaGVja1R5cGUgJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAocmVmZXJlbmNlLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCXJldHVybjsKIAkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UOgogCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudE51bGxBc3NpZ25tZW50KGxvY2FsLCByZWZlcmVuY2UpOwpAQCAtMjExLDYgKzI3NCwyMSBAQAogCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxJbnN0YW5jZW9mKGxvY2FsLCByZWZlcmVuY2UpOwogCQkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKSB7CisJCQkJCQkJc3dpdGNoKGNoZWNrVHlwZSAmIENPTlRFWFRfTUFTSykgeworCQkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCQkJCWlmICgoKGNoZWNrVHlwZSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChyZWZlcmVuY2UuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIE1BWV9OVUxMIDoKQEAgLTIzMiwxMiArMzEwLDIzIEBACiAJCQkJCWNhc2UgQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEw6CiAJCQkJCQlpZiAoZmxvd0luZm8uaXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCkpIHsKIAkJCQkJCQlpZiAoY2hlY2tUeXBlID09IChDQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OT05fTlVMTCkpIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnRDaGVja09uTm9uTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU5vbk51bGxDb21wYXJlZFRvTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJCXJldHVybjsKIAkJCQkJCX0KKwkJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OVUxMOgogCQkJCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9DT01QQVJJU09OX05PTl9OVUxMOgogCQkJCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9BU1NJR05NRU5UOgpAQCAtMjQ1LDEwICszMzQsMjggQEAKIAkJCQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkgewogCQkJCQkJCXN3aXRjaChjaGVja1R5cGUgJiBDT05URVhUX01BU0spIHsKIAkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05VTEw6Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQlpZiAoKChjaGVja1R5cGUgJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAocmVmZXJlbmNlLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6Ci0JCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCXJldHVybjsKIAkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UOgogCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudE51bGxBc3NpZ25tZW50KGxvY2FsLCByZWZlcmVuY2UpOwpAQCAtMjU3LDYgKzM2NCwyMSBAQAogCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxJbnN0YW5jZW9mKGxvY2FsLCByZWZlcmVuY2UpOwogCQkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKSB7CisJCQkJCQkJc3dpdGNoKGNoZWNrVHlwZSAmIENPTlRFWFRfTUFTSykgeworCQkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCQkJCWlmICgoKGNoZWNrVHlwZSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChyZWZlcmVuY2UuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIE1BWV9OVUxMIDoKQEAgLTI3NiwzOCArMzk4LDQ0IEBACiAJCQkJCQkvLyBuZXZlciBoYXBwZW5zCiAJCQkJfQogCQkJfQotCQkJcmVjb3JkTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlLCBjaGVja1R5cGUpOyAKKwkJCS8vIGlmIHRoZSBjb250ZW50aW9uIGlzIGluc2lkZSBhc3NlcnQgc3RhdGVtZW50LCB3ZSB3YW50IHRvIGF2b2lkIG51bGwgd2FybmluZ3Mgb25seSBpbiBjYXNlIG9mCisJCQkvLyBjb21wYXJpc29ucyBhbmQgbm90IGluIGNhc2Ugb2YgYXNzaWdubWVudCwgaW5zdGFuY2VvZiwgb3IgbWF5IGJlIG51bGwuCisJCQlpZigoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHx8IGNoZWNrVHlwZSA9PSBNQVlfTlVMTAorCQkJCQl8fCAoY2hlY2tUeXBlICYgQ09OVEVYVF9NQVNLKSA9PSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UCisJCQkJCXx8IChjaGVja1R5cGUgJiBDT05URVhUX01BU0spID09IEZsb3dDb250ZXh0LklOX0lOU1RBTkNFT0YpIHsKKwkJCQlyZWNvcmROdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UsIGNoZWNrVHlwZSk7CisJCQl9CiAJCQkvLyBwcmVwYXJlIHRvIHJlLWNoZWNrIHdpdGggdHJ5L2NhdGNoIGZsb3cgaW5mbwogCQl9CiAJfQotCQorCiAJdm9pZCByZW1vdmVGaW5hbEFzc2lnbm1lbnRJZkFueShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXNzaWduQ291bnQ7IGkrKykgewotCQkJaWYgKGZpbmFsQXNzaWdubWVudHNbaV0gPT0gcmVmZXJlbmNlKSB7Ci0JCQkJZmluYWxBc3NpZ25tZW50c1tpXSA9IG51bGw7Ci0JCQkJZmluYWxWYXJpYWJsZXNbaV0gPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXNzaWduQ291bnQ7IGkrKykgeworCQkJaWYgKHRoaXMuZmluYWxBc3NpZ25tZW50c1tpXSA9PSByZWZlcmVuY2UpIHsKKwkJCQl0aGlzLmZpbmFsQXNzaWdubWVudHNbaV0gPSBudWxsOworCQkJCXRoaXMuZmluYWxWYXJpYWJsZXNbaV0gPSBudWxsOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCX0KIAotcHJvdGVjdGVkIHZvaWQgcmVjb3JkTnVsbFJlZmVyZW5jZShMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgCitwcm90ZWN0ZWQgdm9pZCByZWNvcmROdWxsUmVmZXJlbmNlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLAogCUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IHN0YXR1cykgewogCWlmICh0aGlzLm51bGxDb3VudCA9PSAwKSB7CiAJCXRoaXMubnVsbExvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1s1XTsKIAkJdGhpcy5udWxsUmVmZXJlbmNlcyA9IG5ldyBFeHByZXNzaW9uWzVdOwogCQl0aGlzLm51bGxDaGVja1R5cGVzID0gbmV3IGludFs1XTsKLQl9IAorCX0KIAllbHNlIGlmICh0aGlzLm51bGxDb3VudCA9PSB0aGlzLm51bGxMb2NhbHMubGVuZ3RoKSB7CiAJCWludCBuZXdMZW5ndGggPSB0aGlzLm51bGxDb3VudCAqIDI7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5udWxsTG9jYWxzLCAwLCAKLQkJCXRoaXMubnVsbExvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tuZXdMZW5ndGhdLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxMb2NhbHMsIDAsCisJCQl0aGlzLm51bGxMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbbmV3TGVuZ3RoXSwgMCwKIAkJCXRoaXMubnVsbENvdW50KTsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxSZWZlcmVuY2VzLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxSZWZlcmVuY2VzLCAwLAogCQkJdGhpcy5udWxsUmVmZXJlbmNlcyA9IG5ldyBFeHByZXNzaW9uW25ld0xlbmd0aF0sIDAsCiAJCQl0aGlzLm51bGxDb3VudCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5udWxsQ2hlY2tUeXBlcywgMCwgCi0JCQl0aGlzLm51bGxDaGVja1R5cGVzID0gbmV3IGludFtuZXdMZW5ndGhdLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxDaGVja1R5cGVzLCAwLAorCQkJdGhpcy5udWxsQ2hlY2tUeXBlcyA9IG5ldyBpbnRbbmV3TGVuZ3RoXSwgMCwKIAkJCXRoaXMubnVsbENvdW50KTsKIAl9CiAJdGhpcy5udWxsTG9jYWxzW3RoaXMubnVsbENvdW50XSA9IGxvY2FsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKaW5kZXggYjg4OGFiNy4uMDM2YjgyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93Q29udGV4dC5qYXZhCkBAIC0xLDMxICsxLDM5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzU4ODI3IC0gWzEuN10gZXhjZXB0aW9uIGFuYWx5c2lzIGZvciB0LXctciBzcG9pbHMgbnVsbCBhbmFseXNpcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTGFiZWxlZFN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdWJSb3V0aW5lU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhyb3dTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UcnlTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5CcmFuY2hMYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nOwogCiAvKioKQEAgLTMzLDIzICs0MSw0OCBAQAogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBGbG93Q29udGV4dCBpbXBsZW1lbnRzIFR5cGVDb25zdGFudHMgewotCQorCiAJLy8gcHJlZW1wdCBtYXJrcyBsb29waW5nIGNvbnRleHRzCiAJcHVibGljIGZpbmFsIHN0YXRpYyBGbG93Q29udGV4dCBOb3RDb250aW51YWJsZUNvbnRleHQgPSBuZXcgRmxvd0NvbnRleHQobnVsbCwgbnVsbCk7Ci0JcHVibGljIEFTVE5vZGUgYXNzb2NpYXRlZE5vZGU7IAotCQlwdWJsaWMgRmxvd0NvbnRleHQgcGFyZW50OwotCXB1YmxpYyBOdWxsSW5mb1JlZ2lzdHJ5IGluaXRzT25GaW5hbGx5OyAKKwlwdWJsaWMgQVNUTm9kZSBhc3NvY2lhdGVkTm9kZTsKKwlwdWJsaWMgRmxvd0NvbnRleHQgcGFyZW50OworCXB1YmxpYyBOdWxsSW5mb1JlZ2lzdHJ5IGluaXRzT25GaW5hbGx5OwogCQkvLyBvbmx5IHVzZWQgd2l0aGluIHRyeSBibG9ja3M7IHJlbWVtYmVycyB1cHN0cmVhbSBmbG93IGluZm8gbWVyZ2VkV2l0aAogCQkvLyBhbnkgbnVsbCByZWxhdGVkIG9wZXJhdGlvbiBoYXBwZW5pbmcgd2l0aGluIHRoZSB0cnkgYmxvY2sKLQkJCi1ib29sZWFuIGRlZmVyTnVsbERpYWdub3N0aWMsIHByZWVtcHROdWxsRGlhZ25vc3RpYzsKKworCXB1YmxpYyBpbnQgdGFnQml0czsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZFUl9OVUxMX0RJQUdOT1NUSUMgPSAweDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRU1QVF9OVUxMX0RJQUdOT1NUSUMgPSAweDI7CisJLyoqCisJICogdXNlZCB0byBoaWRlIG51bGwgY29tcGFyaXNvbiByZWxhdGVkIHdhcm5pbmdzIGluc2lkZSBhc3NlcnQgc3RhdGVtZW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HID0gMHg0OworCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5fT05MWV9OVUxMX05PTl9OVUxMID0gMHgwMDAwOworLy9jaGVjayBhZ2FpbnN0IG51bGwgYW5kIG5vbiBudWxsLCB3aXRoIGRlZmluaXRlIHZhbHVlcyAtLSBjb21wYXJpc29ucworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOX09OTFlfTlVMTCA9IDB4MDAwMTsKKy8vY2hlY2sgYWdhaW5zdCBudWxsLCB3aXRoIGRlZmluaXRlIHZhbHVlcyAtLSBjb21wYXJpc29ucworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOX09OTFlfTk9OX05VTEwgPSAweDAwMDI7CisvL2NoZWNrIGFnYWluc3Qgbm9uIG51bGwsIHdpdGggZGVmaW5pdGUgdmFsdWVzIC0tIGNvbXBhcmlzb25zCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVlfTlVMTCA9IDB4MDAwMzsKKy8vIGNoZWNrIGFnYWluc3QgbnVsbCwgd2l0aCBwb3RlbnRpYWwgdmFsdWVzIC0tIE5QRSBndWFyZAorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfTUFTSyA9IDB4MDBGRjsKK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0NPTVBBUklTT05fTlVMTCA9IDB4MDEwMDsKK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0NPTVBBUklTT05fTk9OX05VTEwgPSAweDAyMDA7CisvLyBjaGVjayBoYXBwZW5lZCBpbiBhIGNvbXBhcmlzb24KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0FTU0lHTk1FTlQgPSAweDAzMDA7CisvLyBjaGVjayBoYXBwZW5lZCBpbiBhbiBhc3NpZ25tZW50CitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9JTlNUQU5DRU9GID0gMHgwNDAwOworLy8gY2hlY2sgaGFwcGVuZWQgaW4gYW4gaW5zdGFuY2VvZiBleHByZXNzaW9uCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URVhUX01BU0sgPSB+Q0hFQ0tfTUFTSzsKIAogcHVibGljIEZsb3dDb250ZXh0KEZsb3dDb250ZXh0IHBhcmVudCwgQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSkgewogCXRoaXMucGFyZW50ID0gcGFyZW50OwogCXRoaXMuYXNzb2NpYXRlZE5vZGUgPSBhc3NvY2lhdGVkTm9kZTsKIAlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJdGhpcy5kZWZlck51bGxEaWFnbm9zdGljID0gCi0JCQlwYXJlbnQuZGVmZXJOdWxsRGlhZ25vc3RpYyB8fCBwYXJlbnQucHJlZW1wdE51bGxEaWFnbm9zdGljOworCQlpZiAoKHBhcmVudC50YWdCaXRzICYgKEZsb3dDb250ZXh0LkRFRkVSX05VTExfRElBR05PU1RJQyB8IEZsb3dDb250ZXh0LlBSRUVNUFRfTlVMTF9ESUFHTk9TVElDKSkgIT0gMCkgeworCQkJdGhpcy50YWdCaXRzIHw9IEZsb3dDb250ZXh0LkRFRkVSX05VTExfRElBR05PU1RJQzsKKwkJfQogCQl0aGlzLmluaXRzT25GaW5hbGx5ID0gcGFyZW50LmluaXRzT25GaW5hbGx5OwogCX0KIH0KQEAgLTU5LDIxICs5Miw0MCBAQAogfQogCiBwdWJsaWMgdm9pZCBjaGVja0V4Y2VwdGlvbkhhbmRsZXJzKFR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbiwgQVNUTm9kZSBsb2NhdGlvbiwgRmxvd0luZm8gZmxvd0luZm8sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwljaGVja0V4Y2VwdGlvbkhhbmRsZXJzKHJhaXNlZEV4Y2VwdGlvbiwgbG9jYXRpb24sIGZsb3dJbmZvLCBzY29wZSwgZmFsc2UpOworfQorLyoqCisgKiBAcGFyYW0gaXNFeGNlcHRpb25PbkF1dG9DbG9zZSBUaGlzIGlzIGZvciBjaGVja2luZyBleGNlcHRpb24gaGFuZGxlcnMgZm9yIGV4Y2VwdGlvbnMgcmFpc2VkIGR1cmluZyB0aGUKKyAqIGF1dG8gY2xvc2Ugb2YgcmVzb3VyY2VzIGluc2lkZSBhIHRyeSB3aXRoIHJlc291cmNlcyBzdGF0ZW1lbnQuIChSZWxldmFudCBmb3IKKyAqIHNvdXJjZSBsZXZlbHMgMS43IGFuZCBhYm92ZSBvbmx5KQorICovCitwdWJsaWMgdm9pZCBjaGVja0V4Y2VwdGlvbkhhbmRsZXJzKFR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbiwgQVNUTm9kZSBsb2NhdGlvbiwgRmxvd0luZm8gZmxvd0luZm8sIEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gaXNFeGNlcHRpb25PbkF1dG9DbG9zZSkgewogCS8vIExJR0hULVZFUlNJT04gT0YgVEhFIEVRVUlWQUxFTlQgV0lUSCBBTiBBUlJBWSBPRiBFWENFUFRJT05TCiAJLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGFyZ3VtZW50IGV4Y2VwdGlvbiB0eXBlcyBhcmUgaGFuZGxlZAotCS8vIEpESyBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIC0gd2hlbiBhbiBleGNlcHRpb24gdHlwZSBpcyB0aHJvd24sIAorCS8vIEpESyBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIC0gd2hlbiBhbiBleGNlcHRpb24gdHlwZSBpcyB0aHJvd24sCiAJLy8gYWxsIHJlbGF0ZWQgY2F0Y2ggYmxvY2tzIGFyZSBtYXJrZWQgYXMgcmVhY2hhYmxlLi4uIGluc3RlYWQgb2YgdGhvc2Ugb25seQogCS8vIHVudGlsIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBzYWZlbHkgaGFuZGxlZCAoU21hcnRlciAtIHNlZSBjb21tZW50IGF0IHRoZSBlbmQpCiAJRmxvd0NvbnRleHQgdHJhdmVyc2VkQ29udGV4dCA9IHRoaXM7CisJQXJyYXlMaXN0IGFicnVwdGx5RXhpdGVkTG9vcHMgPSBudWxsOworCWlmIChzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83ICYmIGxvY2F0aW9uIGluc3RhbmNlb2YgVGhyb3dTdGF0ZW1lbnQpIHsKKwkJRXhwcmVzc2lvbiB0aHJvd0V4cHJlc3Npb24gPSAoKFRocm93U3RhdGVtZW50KWxvY2F0aW9uKS5leGNlcHRpb247CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHRocm93QXJnQmluZGluZyA9IHRocm93RXhwcmVzc2lvbi5sb2NhbFZhcmlhYmxlQmluZGluZygpOworCQlpZiAodGhyb3dFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwMzYxIAorCQkJCSYmIHRocm93QXJnQmluZGluZyBpbnN0YW5jZW9mIENhdGNoUGFyYW1ldGVyQmluZGluZyAmJiB0aHJvd0FyZ0JpbmRpbmcuaXNFZmZlY3RpdmVseUZpbmFsKCkpIHsKKwkJCUNhdGNoUGFyYW1ldGVyQmluZGluZyBwYXJhbWV0ZXIgPSAoQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nKSB0aHJvd0FyZ0JpbmRpbmc7CisJCQljaGVja0V4Y2VwdGlvbkhhbmRsZXJzKHBhcmFtZXRlci5nZXRQcmVjaXNlVHlwZXMoKSwgbG9jYXRpb24sIGZsb3dJbmZvLCBzY29wZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CiAJd2hpbGUgKHRyYXZlcnNlZENvbnRleHQgIT0gbnVsbCkgewogCQlTdWJSb3V0aW5lU3RhdGVtZW50IHN1YjsKIAkJaWYgKCgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJyb3V0aW5lKCkpICE9IG51bGwpICYmIHN1Yi5pc1N1YlJvdXRpbmVFc2NhcGluZygpKSB7Ci0JCQkvLyB0cmF2ZXJzaW5nIGEgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lIG1lYW5zIHRoYXQgYWxsIHVuaGFuZGxlZCAKKwkJCS8vIHRyYXZlcnNpbmcgYSBub24tcmV0dXJuaW5nIHN1YnJvdXRpbmUgbWVhbnMgdGhhdCBhbGwgdW5oYW5kbGVkCiAJCQkvLyBleGNlcHRpb25zIHdpbGwgYWN0dWFsbHkgbmV2ZXIgZ2V0IHNlbnQuLi4KIAkJCXJldHVybjsKIAkJfQotCQkKLQkJLy8gZmlsdGVyIGV4Y2VwdGlvbnMgdGhhdCBhcmUgbG9jYWxseSBjYXVnaHQgZnJvbSB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyAKKworCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nCiAJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVybW9zdCBvbmVzLgogCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKIAkJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgZXhjZXB0aW9uQ29udGV4dCA9CkBAIC04NSwxNSArMTM3LDIyIEBACiAJCQkJCWNhdWdodEluZGV4IDwgY2F1Z2h0Q291bnQ7CiAJCQkJCWNhdWdodEluZGV4KyspIHsKIAkJCQkJUmVmZXJlbmNlQmluZGluZyBjYXVnaHRFeGNlcHRpb24gPSBjYXVnaHRFeGNlcHRpb25zW2NhdWdodEluZGV4XTsKLQkJCQkgICAgaW50IHN0YXRlID0gY2F1Z2h0RXhjZXB0aW9uID09IG51bGwgCisJCQkJICAgIGludCBzdGF0ZSA9IGNhdWdodEV4Y2VwdGlvbiA9PSBudWxsCiAJCQkJICAgIAk/IFNjb3BlLkVRVUFMX09SX01PUkVfU1BFQ0lGSUMgLyogYW55IGV4Y2VwdGlvbiAqLwotCQkJCSAgICAgICAgOiBTY29wZS5jb21wYXJlVHlwZXMocmFpc2VkRXhjZXB0aW9uLCBjYXVnaHRFeGNlcHRpb24pOwkJCQkJCQorCQkJCSAgICAgICAgOiBTY29wZS5jb21wYXJlVHlwZXMocmFpc2VkRXhjZXB0aW9uLCBjYXVnaHRFeGNlcHRpb24pOworCQkJCSAgICBpZiAoYWJydXB0bHlFeGl0ZWRMb29wcyAhPSBudWxsICYmIGNhdWdodEV4Y2VwdGlvbiAhPSBudWxsICYmIHN0YXRlICE9IFNjb3BlLk5PVF9SRUxBVEVEKSB7CisJCQkJICAgIAlmb3IgKGludCBpID0gMCwgYWJydXB0bHlFeGl0ZWRMb29wc0NvdW50ID0gYWJydXB0bHlFeGl0ZWRMb29wcy5zaXplKCk7IGkgPCBhYnJ1cHRseUV4aXRlZExvb3BzQ291bnQ7IGkrKykgeworCQkJCQkJCUxvb3BpbmdGbG93Q29udGV4dCBsb29wID0gKExvb3BpbmdGbG93Q29udGV4dCkgYWJydXB0bHlFeGl0ZWRMb29wcy5nZXQoaSk7CisJCQkJCQkJbG9vcC5yZWNvcmRDYXRjaENvbnRleHRPZkVzY2FwaW5nRXhjZXB0aW9uKGV4Y2VwdGlvbkNvbnRleHQsIGNhdWdodEV4Y2VwdGlvbik7CisJCQkJCQl9CisJCQkJCX0KIAkJCQkJc3dpdGNoIChzdGF0ZSkgewogCQkJCQkJY2FzZSBTY29wZS5FUVVBTF9PUl9NT1JFX1NQRUNJRklDIDoKIAkJCQkJCQlleGNlcHRpb25Db250ZXh0LnJlY29yZEhhbmRsaW5nRXhjZXB0aW9uKAogCQkJCQkJCQljYXVnaHRFeGNlcHRpb24sCiAJCQkJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLAogCQkJCQkJCQlyYWlzZWRFeGNlcHRpb24sCisJCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbiwgLy8gcHJlY2lzZSBleGNlcHRpb24gdGhhdCB3aWxsIGJlIGNhdWdodAogCQkJCQkJCQlsb2NhdGlvbiwKIAkJCQkJCQkJZGVmaW5pdGVseUNhdWdodCk7CiAJCQkJCQkJLy8gd2FzIGl0IGFscmVhZHkgZGVmaW5pdGVseSBjYXVnaHQgPwpAQCAtMTA0LDYgKzE2Myw3IEBACiAJCQkJCQkJCWNhdWdodEV4Y2VwdGlvbiwKIAkJCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCksCiAJCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbiwKKwkJCQkJCQkJY2F1Z2h0RXhjZXB0aW9uLAogCQkJCQkJCQlsb2NhdGlvbiwKIAkJCQkJCQkJZmFsc2UpOwogCQkJCQkJCS8vIHdhcyBub3QgY2F1Z2h0IGFscmVhZHkgcGVyIGNvbnN0cnVjdGlvbgpAQCAtMTE2LDM5ICsxNzYsNTAgQEAKIAkJCWlmIChleGNlcHRpb25Db250ZXh0LmlzTWV0aG9kQ29udGV4dCkgewogCQkJCWlmIChyYWlzZWRFeGNlcHRpb24uaXNVbmNoZWNrZWRFeGNlcHRpb24oZmFsc2UpKQogCQkJCQlyZXR1cm47Ci0JCQkJCQorCiAJCQkJLy8gYW5vbnltb3VzIGNvbnN0cnVjdG9ycyBhcmUgYWxsb3dlZCB0byB0aHJvdyBhbnkgZXhjZXB0aW9ucyAodGhlaXIgdGhyb3duIGV4Y2VwdGlvbnMKIAkJCQkvLyBjbGF1c2Ugd2lsbCBiZSBmaXhlZCB1cCBsYXRlciBhcyBwZXIgSkxTIDguNikuCiAJCQkJaWYgKGV4Y2VwdGlvbkNvbnRleHQuYXNzb2NpYXRlZE5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKIAkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbilleGNlcHRpb25Db250ZXh0LmFzc29jaWF0ZWROb2RlOwogCQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2QuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0Fub255bW91c1R5cGUoKSl7Ci0JCQkJCQkJCQorCiAJCQkJCQlleGNlcHRpb25Db250ZXh0Lm1lcmdlVW5oYW5kbGVkRXhjZXB0aW9uKHJhaXNlZEV4Y2VwdGlvbik7Ci0JCQkJCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gY29tcGxhaW4sIHdpbGwgZml4IHVwIGNvbnN0cnVjdG9yIGV4Y2VwdGlvbnMJCQkJCQkKKwkJCQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byBjb21wbGFpbiwgd2lsbCBmaXggdXAgY29uc3RydWN0b3IgZXhjZXB0aW9ucwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOyAvLyBub3QgaGFuZGxlZCBhbnl3aGVyZSwgdGh1cyBqdW1wIHRvIGVycm9yIGhhbmRsaW5nCiAJCQl9CisJCX0gZWxzZSBpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIExvb3BpbmdGbG93Q29udGV4dCkgeworCQkJaWYgKGFicnVwdGx5RXhpdGVkTG9vcHMgPT0gbnVsbCkgeworCQkJCWFicnVwdGx5RXhpdGVkTG9vcHMgPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJfQorCQkJYWJydXB0bHlFeGl0ZWRMb29wcy5hZGQodHJhdmVyc2VkQ29udGV4dCk7CiAJCX0KIAogCQl0cmF2ZXJzZWRDb250ZXh0LnJlY29yZFJldHVybkZyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwotCQkKLQkJaWYgKHRyYXZlcnNlZENvbnRleHQgaW5zdGFuY2VvZiBJbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQpIHsKLQkJCUFTVE5vZGUgbm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGU7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgewotCQkJCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSAoVHJ5U3RhdGVtZW50KSBub2RlOwotCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMJCQkKKworCQlpZiAoIWlzRXhjZXB0aW9uT25BdXRvQ2xvc2UpIHsKKwkJCWlmICh0cmF2ZXJzZWRDb250ZXh0IGluc3RhbmNlb2YgSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0KSB7CisJCQkJQVNUTm9kZSBub2RlID0gdHJhdmVyc2VkQ29udGV4dC5hc3NvY2lhdGVkTm9kZTsKKwkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCkgeworCQkJCQlUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gKFRyeVN0YXRlbWVudCkgbm9kZTsKKwkJCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlTdGF0ZW1lbnQuc3ViUm91dGluZUluaXRzKTsgLy8gY29sbGVjdCBpbml0cworCQkJCX0KIAkJCX0KIAkJfQogCQl0cmF2ZXJzZWRDb250ZXh0ID0gdHJhdmVyc2VkQ29udGV4dC5wYXJlbnQ7CiAJfQogCS8vIGlmIHJlYWNoZXMgdGhpcyBwb2ludCwgdGhlbiB0aGVyZSBhcmUgc29tZSByZW1haW5pbmcgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0eXBlcy4KLQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmhhbmRsZWRFeGNlcHRpb24ocmFpc2VkRXhjZXB0aW9uLCBsb2NhdGlvbik7CisJaWYgKGlzRXhjZXB0aW9uT25BdXRvQ2xvc2UpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5oYW5kbGVkRXhjZXB0aW9uRnJvbUF1dG9DbG9zZShyYWlzZWRFeGNlcHRpb24sIGxvY2F0aW9uKTsKKwl9IGVsc2UgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmhhbmRsZWRFeGNlcHRpb24ocmFpc2VkRXhjZXB0aW9uLCBsb2NhdGlvbik7CisJfQogfQogCiBwdWJsaWMgdm9pZCBjaGVja0V4Y2VwdGlvbkhhbmRsZXJzKFR5cGVCaW5kaW5nW10gcmFpc2VkRXhjZXB0aW9ucywgQVNUTm9kZSBsb2NhdGlvbiwgRmxvd0luZm8gZmxvd0luZm8sIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBjaGVjayB0aGF0IGFsbCB0aGUgYXJndW1lbnQgZXhjZXB0aW9uIHR5cGVzIGFyZSBoYW5kbGVkCi0JLy8gSkRLIENvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gLSB3aGVuIGFuIGV4Y2VwdGlvbiB0eXBlIGlzIHRocm93biwgCisJLy8gSkRLIENvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gLSB3aGVuIGFuIGV4Y2VwdGlvbiB0eXBlIGlzIHRocm93biwKIAkvLyBhbGwgcmVsYXRlZCBjYXRjaCBibG9ja3MgYXJlIG1hcmtlZCBhcyByZWFjaGFibGUuLi4gaW5zdGVhZCBvZiB0aG9zZSBvbmx5CiAJLy8gdW50aWwgdGhlIHBvaW50IHdoZXJlIGl0IGlzIHNhZmVseSBoYW5kbGVkIChTbWFydGVyIC0gc2VlIGNvbW1lbnQgYXQgdGhlIGVuZCkKIAlpbnQgcmVtYWluaW5nQ291bnQ7IC8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHVuaGFuZGxlZCBleGNlcHRpb25zCkBAIC0xNjgsMTQgKzIzOSwxNSBAQAogCQlyYWlzZWRDb3VudCk7CiAJRmxvd0NvbnRleHQgdHJhdmVyc2VkQ29udGV4dCA9IHRoaXM7CiAKKwlBcnJheUxpc3QgYWJydXB0bHlFeGl0ZWRMb29wcyA9IG51bGw7CiAJd2hpbGUgKHRyYXZlcnNlZENvbnRleHQgIT0gbnVsbCkgewogCQlTdWJSb3V0aW5lU3RhdGVtZW50IHN1YjsKIAkJaWYgKCgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJyb3V0aW5lKCkpICE9IG51bGwpICYmIHN1Yi5pc1N1YlJvdXRpbmVFc2NhcGluZygpKSB7Ci0JCQkvLyB0cmF2ZXJzaW5nIGEgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lIG1lYW5zIHRoYXQgYWxsIHVuaGFuZGxlZCAKKwkJCS8vIHRyYXZlcnNpbmcgYSBub24tcmV0dXJuaW5nIHN1YnJvdXRpbmUgbWVhbnMgdGhhdCBhbGwgdW5oYW5kbGVkCiAJCQkvLyBleGNlcHRpb25zIHdpbGwgYWN0dWFsbHkgbmV2ZXIgZ2V0IHNlbnQuLi4KIAkJCXJldHVybjsKIAkJfQotCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIAorCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nCiAJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVybW9zdCBvbmVzLgogCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKIAkJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgZXhjZXB0aW9uQ29udGV4dCA9CkBAIC0xOTAsMTUgKzI2MiwyMiBAQAogCQkJCQlmb3IgKGludCByYWlzZWRJbmRleCA9IDA7IHJhaXNlZEluZGV4IDwgcmFpc2VkQ291bnQ7IHJhaXNlZEluZGV4KyspIHsKIAkJCQkJCVR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbjsKIAkJCQkJCWlmICgocmFpc2VkRXhjZXB0aW9uID0gcmFpc2VkRXhjZXB0aW9uc1tyYWlzZWRJbmRleF0pICE9IG51bGwpIHsKLQkJCQkJCSAgICBpbnQgc3RhdGUgPSBjYXVnaHRFeGNlcHRpb24gPT0gbnVsbCAKKwkJCQkJCSAgICBpbnQgc3RhdGUgPSBjYXVnaHRFeGNlcHRpb24gPT0gbnVsbAogCQkJCQkJICAgIAk/IFNjb3BlLkVRVUFMX09SX01PUkVfU1BFQ0lGSUMgLyogYW55IGV4Y2VwdGlvbiAqLwogCQkJCQkJICAgICAgICA6IFNjb3BlLmNvbXBhcmVUeXBlcyhyYWlzZWRFeGNlcHRpb24sIGNhdWdodEV4Y2VwdGlvbik7CisJCQkJCQkgICAgaWYgKGFicnVwdGx5RXhpdGVkTG9vcHMgIT0gbnVsbCAmJiBjYXVnaHRFeGNlcHRpb24gIT0gbnVsbCAmJiBzdGF0ZSAhPSBTY29wZS5OT1RfUkVMQVRFRCkgeworCQkJCQkJICAgIAlmb3IgKGludCBpID0gMCwgYWJydXB0bHlFeGl0ZWRMb29wc0NvdW50ID0gYWJydXB0bHlFeGl0ZWRMb29wcy5zaXplKCk7IGkgPCBhYnJ1cHRseUV4aXRlZExvb3BzQ291bnQ7IGkrKykgeworCQkJCQkJCQkJTG9vcGluZ0Zsb3dDb250ZXh0IGxvb3AgPSAoTG9vcGluZ0Zsb3dDb250ZXh0KSBhYnJ1cHRseUV4aXRlZExvb3BzLmdldChpKTsKKwkJCQkJCQkJCWxvb3AucmVjb3JkQ2F0Y2hDb250ZXh0T2ZFc2NhcGluZ0V4Y2VwdGlvbihleGNlcHRpb25Db250ZXh0LCBjYXVnaHRFeGNlcHRpb24pOworCQkJCQkJCQl9CisJCQkJCQkJfQogCQkJCQkJCXN3aXRjaCAoc3RhdGUpIHsKIAkJCQkJCQkJY2FzZSBTY29wZS5FUVVBTF9PUl9NT1JFX1NQRUNJRklDIDoKIAkJCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQucmVjb3JkSGFuZGxpbmdFeGNlcHRpb24oCiAJCQkJCQkJCQkJY2F1Z2h0RXhjZXB0aW9uLAogCQkJCQkJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLAogCQkJCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbiwKKwkJCQkJCQkJCQlyYWlzZWRFeGNlcHRpb24sIC8vIHByZWNpc2UgZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSBjYXVnaHQKIAkJCQkJCQkJCQlsb2NhdGlvbiwKIAkJCQkJCQkJCQlsb2NhbGx5Q2F1Z2h0W3JhaXNlZEluZGV4XSk7CiAJCQkJCQkJCQkvLyB3YXMgYWxyZWFkeSBkZWZpbml0ZWx5IGNhdWdodCA/CkBAIC0yMTMsNiArMjkyLDcgQEAKIAkJCQkJCQkJCQljYXVnaHRFeGNlcHRpb24sCiAJCQkJCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCksCiAJCQkJCQkJCQkJcmFpc2VkRXhjZXB0aW9uLAorCQkJCQkJCQkJCWNhdWdodEV4Y2VwdGlvbiwgCiAJCQkJCQkJCQkJbG9jYXRpb24sCiAJCQkJCQkJCQkJZmFsc2UpOwogCQkJCQkJCQkJLy8gd2FzIG5vdCBjYXVnaHQgYWxyZWFkeSBwZXIgY29uc3RydWN0aW9uCkBAIC0yNDMsNDAgKzMyMyw0NSBAQAogCQkJCWlmIChleGNlcHRpb25Db250ZXh0LmFzc29jaWF0ZWROb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbil7CiAJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pZXhjZXB0aW9uQ29udGV4dC5hc3NvY2lhdGVkTm9kZTsKIAkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgbWV0aG9kLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpewotCQkJCQkJCQorCiAJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKIAkJCQkJCQlUeXBlQmluZGluZyByYWlzZWRFeGNlcHRpb247CiAJCQkJCQkJaWYgKChyYWlzZWRFeGNlcHRpb24gPSByYWlzZWRFeGNlcHRpb25zW2ldKSAhPSBudWxsKSB7CiAJCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQubWVyZ2VVbmhhbmRsZWRFeGNlcHRpb24ocmFpc2VkRXhjZXB0aW9uKTsKIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gY29tcGxhaW4sIHdpbGwgZml4IHVwIGNvbnN0cnVjdG9yIGV4Y2VwdGlvbnMJCQkJCQkKKwkJCQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byBjb21wbGFpbiwgd2lsbCBmaXggdXAgY29uc3RydWN0b3IgZXhjZXB0aW9ucwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOyAvLyBub3QgaGFuZGxlZCBhbnl3aGVyZSwgdGh1cyBqdW1wIHRvIGVycm9yIGhhbmRsaW5nCiAJCQl9CisgICAgICAgIH0gZWxzZSBpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIExvb3BpbmdGbG93Q29udGV4dCkgeworCQkJaWYgKGFicnVwdGx5RXhpdGVkTG9vcHMgPT0gbnVsbCkgeworCQkJCWFicnVwdGx5RXhpdGVkTG9vcHMgPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJfQorCQkJYWJydXB0bHlFeGl0ZWRMb29wcy5hZGQodHJhdmVyc2VkQ29udGV4dCk7CiAJCX0KIAkJaWYgKHJlbWFpbmluZ0NvdW50ID09IDApCiAJCQlyZXR1cm47Ci0JCQkKKwogCQl0cmF2ZXJzZWRDb250ZXh0LnJlY29yZFJldHVybkZyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwotCQkKKwogCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dCkgewogCQkJQVNUTm9kZSBub2RlID0gdHJhdmVyc2VkQ29udGV4dC5hc3NvY2lhdGVkTm9kZTsKIAkJCWlmIChub2RlIGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7CiAJCQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IChUcnlTdGF0ZW1lbnQpIG5vZGU7Ci0JCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlTdGF0ZW1lbnQuc3ViUm91dGluZUluaXRzKTsgLy8gY29sbGVjdCBpbml0cwkJCQorCQkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMKIAkJCX0KLQkJfQkJCisJCX0KIAkJdHJhdmVyc2VkQ29udGV4dCA9IHRyYXZlcnNlZENvbnRleHQucGFyZW50OwogCX0KLQkvLyBpZiByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgYXJlIHNvbWUgcmVtYWluaW5nIHVuaGFuZGxlZCBleGNlcHRpb24gdHlwZXMuCQorCS8vIGlmIHJlYWNoZXMgdGhpcyBwb2ludCwgdGhlbiB0aGVyZSBhcmUgc29tZSByZW1haW5pbmcgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0eXBlcy4KIAluZXh0UmVwb3J0OiBmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKIAkJVHlwZUJpbmRpbmcgZXhjZXB0aW9uOwogCQlpZiAoKGV4Y2VwdGlvbiA9IHJhaXNlZEV4Y2VwdGlvbnNbaV0pICE9IG51bGwpIHsKIAkJCS8vIG9ubHkgb25lIGNvbXBsYWludCBpZiBzYW1lIGV4Y2VwdGlvbiBkZWNsYXJlZCB0byBiZSB0aHJvd24gbW9yZSB0aGFuIG9uY2UKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQkJaWYgKHJhaXNlZEV4Y2VwdGlvbnNbal0gPT0gZXhjZXB0aW9uKSBjb250aW51ZSBuZXh0UmVwb3J0OyAvLyBhbHJlYWR5IHJlcG9ydGVkIAorCQkJCWlmIChyYWlzZWRFeGNlcHRpb25zW2pdID09IGV4Y2VwdGlvbikgY29udGludWUgbmV4dFJlcG9ydDsgLy8gYWxyZWFkeSByZXBvcnRlZAogCQkJfQogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5oYW5kbGVkRXhjZXB0aW9uKGV4Y2VwdGlvbiwgbG9jYXRpb24pOwogCQl9CkBAIC0yODcsNiArMzcyLDI4IEBACiAJcmV0dXJuIG51bGw7CiB9CiAKK3B1YmxpYyBGbG93SW5mbyBnZXRJbml0c0ZvckZpbmFsQmxhbmtJbml0aWFsaXphdGlvbkNoZWNrKFR5cGVCaW5kaW5nIGRlY2xhcmluZ1R5cGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJRmxvd0NvbnRleHQgY3VycmVudCA9IHRoaXM7CisJRmxvd0luZm8gaW5pdHMgPSBmbG93SW5mbzsKKwlkbyB7CisJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCkgeworCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXphdGlvbkNvbnRleHQgPSAoSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCkgY3VycmVudDsKKwkJCWlmICgoKFR5cGVEZWNsYXJhdGlvbilpbml0aWFsaXphdGlvbkNvbnRleHQuYXNzb2NpYXRlZE5vZGUpLmJpbmRpbmcgPT0gZGVjbGFyaW5nVHlwZSkgeworCQkJCXJldHVybiBpbml0czsKKwkJCX0KKwkJCWluaXRzID0gaW5pdGlhbGl6YXRpb25Db250ZXh0LmluaXRzQmVmb3JlQ29udGV4dDsKKwkJCWN1cnJlbnQgPSBpbml0aWFsaXphdGlvbkNvbnRleHQuaW5pdGlhbGl6YXRpb25QYXJlbnQ7CisJCX0gZWxzZSBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKKwkJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgZXhjZXB0aW9uQ29udGV4dCA9IChFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KSBjdXJyZW50OworCQkJY3VycmVudCA9IGV4Y2VwdGlvbkNvbnRleHQuaW5pdGlhbGl6YXRpb25QYXJlbnQgPT0gbnVsbCA/IGV4Y2VwdGlvbkNvbnRleHQucGFyZW50IDogZXhjZXB0aW9uQ29udGV4dC5pbml0aWFsaXphdGlvblBhcmVudDsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwkJfQorCX0gd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCk7CisJLy8gbm90IGZvdW5kCisJcmV0dXJuIG51bGw7Cit9CisKIC8qCiAgKiBsb29rdXAgdGhyb3VnaCBicmVhayBsYWJlbHMKICAqLwpAQCAtMzI2LDE4ICs0MzMsMTggQEAKIAkJCQlsYXN0Q29udGludWFibGUgPSBjdXJyZW50OwogCQkJfQogCQl9Ci0JCQorCiAJCWNoYXJbXSBjdXJyZW50TGFiZWxOYW1lOwogCQlpZiAoKGN1cnJlbnRMYWJlbE5hbWUgPSBjdXJyZW50LmxhYmVsTmFtZSgpKSAhPSBudWxsICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRMYWJlbE5hbWUsIGxhYmVsTmFtZSkpIHsKIAkJCSgoTGFiZWxlZFN0YXRlbWVudCljdXJyZW50LmFzc29jaWF0ZWROb2RlKS5iaXRzIHw9IEFTVE5vZGUuTGFiZWxVc2VkOwogCi0JCQkvLyBtYXRjaGluZyBsYWJlbCBmb3VuZAkJCQkJCisJCQkvLyBtYXRjaGluZyBsYWJlbCBmb3VuZAogCQkJaWYgKChsYXN0Q29udGludWFibGUgIT0gbnVsbCkKIAkJCQkJJiYgKGN1cnJlbnQuYXNzb2NpYXRlZE5vZGUuY29uY3JldGVTdGF0ZW1lbnQoKQk9PSBsYXN0Q29udGludWFibGUuYXNzb2NpYXRlZE5vZGUpKSB7Ci0JCQkgICAgCisKIAkJCQlpZiAobGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPT0gbnVsbCkgcmV0dXJuIGxhc3RDb250aW51YWJsZTsKIAkJCQlyZXR1cm4gbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmU7Ci0JCQl9IAorCQkJfQogCQkJLy8gbGFiZWwgaXMgZm91bmQsIGJ1dCBub3QgYSBjb250aW51YWJsZSBsb2NhdGlvbgogCQkJcmV0dXJuIEZsb3dDb250ZXh0Lk5vdENvbnRpbnVhYmxlQ29udGV4dDsKIAkJfQpAQCAtNDM1LDE4ICs1NDIsMTggQEAKIH0KIAogLyoqCi0gKiBSZWNvcmQgYSBudWxsIHJlZmVyZW5jZSBmb3IgdXNlIGJ5IGRlZmVycmVkIGNoZWNrcy4gT25seSBsb29waW5nIG9yIAorICogUmVjb3JkIGEgbnVsbCByZWZlcmVuY2UgZm9yIHVzZSBieSBkZWZlcnJlZCBjaGVja3MuIE9ubHkgbG9vcGluZyBvcgogICogZmluYWxseSBjb250ZXh0cyByZWFsbHkgcmVjb3JkIHRoYXQgaW5mb3JtYXRpb24uCiAgKiBAcGFyYW0gbG9jYWwgdGhlIGxvY2FsIHZhcmlhYmxlIGludm9sdmVkIGluIHRoZSBjaGVjawogICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gd2l0aGluIHdoaWNoIGxvY2FsIGxheXMKICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBhZ2FpbnN0IHdoaWNoIHRoZSBjaGVjayBtdXN0IGJlIHBlcmZvcm1lZDsgb25lIG9mCi0gKiAJCXtAbGluayAjQ0FOX09OTFlfTlVMTCBDQU5fT05MWV9OVUxMfSwge0BsaW5rICNDQU5fT05MWV9OVUxMX05PTl9OVUxMIAotICogCQlDQU5fT05MWV9OVUxMX05PTl9OVUxMfSwge0BsaW5rICNNQVlfTlVMTCBNQVlfTlVMTH0sIAotICogICAgICB7QGxpbmsgI0NBTl9PTkxZX05PTl9OVUxMIENBTl9PTkxZX05PTl9OVUxMfSwgcG90ZW50aWFsbHkgCisgKiAJCXtAbGluayAjQ0FOX09OTFlfTlVMTCBDQU5fT05MWV9OVUxMfSwge0BsaW5rICNDQU5fT05MWV9OVUxMX05PTl9OVUxMCisgKiAJCUNBTl9PTkxZX05VTExfTk9OX05VTEx9LCB7QGxpbmsgI01BWV9OVUxMIE1BWV9OVUxMfSwKKyAqICAgICAge0BsaW5rICNDQU5fT05MWV9OT05fTlVMTCBDQU5fT05MWV9OT05fTlVMTH0sIHBvdGVudGlhbGx5CiAgKiAgICAgIGNvbWJpbmVkIHdpdGggYSBjb250ZXh0IGluZGljYXRvciAob25lIG9mIHtAbGluayAjSU5fQ09NUEFSSVNPTl9OVUxMfSwKICAqICAgICAge0BsaW5rICNJTl9DT01QQVJJU09OX05PTl9OVUxMfSwge0BsaW5rICNJTl9BU1NJR05NRU5UfSBvciB7QGxpbmsgI0lOX0lOU1RBTkNFT0Z9KQogICovCi1wcm90ZWN0ZWQgdm9pZCByZWNvcmROdWxsUmVmZXJlbmNlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCAKK3Byb3RlY3RlZCB2b2lkIHJlY29yZE51bGxSZWZlcmVuY2UoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsCiAJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgc3RhdHVzKSB7CiAJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogfQpAQCAtNDU2LDcgKzU2Myw3IEBACiB9CiAKIHB1YmxpYyB2b2lkIHJlY29yZFNldHRpbmdGaW5hbChWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUsIFJlZmVyZW5jZSBmaW5hbFJlZmVyZW5jZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkJeworCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApCXsKIAkvLyBmb3IgaW5pdGlhbGl6YXRpb24gaW5zaWRlIGxvb3Bpbmcgc3RhdGVtZW50IHRoYXQgZWZmZWN0aXZlbHkgbG9vcHMKIAlGbG93Q29udGV4dCBjb250ZXh0ID0gdGhpczsKIAl3aGlsZSAoY29udGV4dCAhPSBudWxsKSB7CkBAIC00NjgsMjcgKzU3NSw4IEBACiAJfQogfQogCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCAKLSAgQ0FOX09OTFlfTlVMTF9OT05fTlVMTCA9IDB4MDAwMCwgCi0gIAkvLyBjaGVjayBhZ2FpbnN0IG51bGwgYW5kIG5vbiBudWxsLCB3aXRoIGRlZmluaXRlIHZhbHVlcyAtLSBjb21wYXJpc29ucwotICBDQU5fT05MWV9OVUxMID0gMHgwMDAxLAotICAJLy8gY2hlY2sgYWdhaW5zdCBudWxsLCB3aXRoIGRlZmluaXRlIHZhbHVlcyAtLSBjb21wYXJpc29ucwotICBDQU5fT05MWV9OT05fTlVMTCA9IDB4MDAwMiwKLQkvLyBjaGVjayBhZ2FpbnN0IG5vbiBudWxsLCB3aXRoIGRlZmluaXRlIHZhbHVlcyAtLSBjb21wYXJpc29ucwotICBNQVlfTlVMTCA9IDB4MDAwMywKLQkvLyBjaGVjayBhZ2FpbnN0IG51bGwsIHdpdGggcG90ZW50aWFsIHZhbHVlcyAtLSBOUEUgZ3VhcmQKLSAgQ0hFQ0tfTUFTSyA9IDB4MDBGRiwKLSAgSU5fQ09NUEFSSVNPTl9OVUxMID0gMHgwMTAwLAotICBJTl9DT01QQVJJU09OX05PTl9OVUxMID0gMHgwMjAwLAotICAgIC8vIGNoZWNrIGhhcHBlbmVkIGluIGEgY29tcGFyaXNvbgotICBJTl9BU1NJR05NRU5UID0gMHgwMzAwLAotICAgIC8vIGNoZWNrIGhhcHBlbmVkIGluIGFuIGFzc2lnbm1lbnQKLSAgSU5fSU5TVEFOQ0VPRiA9IDB4MDQwMCwKLSAgICAvLyBjaGVjayBoYXBwZW5lZCBpbiBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24KLSAgQ09OVEVYVF9NQVNLID0gfkNIRUNLX01BU0s7Ci0KIC8qKgotICogUmVjb3JkIGEgbnVsbCByZWZlcmVuY2UgZm9yIHVzZSBieSBkZWZlcnJlZCBjaGVja3MuIE9ubHkgbG9vcGluZyBvciAKKyAqIFJlY29yZCBhIG51bGwgcmVmZXJlbmNlIGZvciB1c2UgYnkgZGVmZXJyZWQgY2hlY2tzLiBPbmx5IGxvb3Bpbmcgb3IKICAqIGZpbmFsbHkgY29udGV4dHMgcmVhbGx5IHJlY29yZCB0aGF0IGluZm9ybWF0aW9uLiBUaGUgY29udGV4dCBtYXkKICAqIGVtaXQgYW4gZXJyb3IgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBzdGF0dXMgb2YgbG9jYWwgYWdhaW5zdAogICogZmxvd0luZm8gYW5kIGl0cyBuYXR1cmUgKG9ubHkgbG9vcGluZyBvZiBmaW5hbGx5IGNvbnRleHRzIGRlZmVyIHBhcnQKQEAgLTQ5OCw5ICs1ODYsOSBAQAogICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbnRvIHdoaWNoIHRoZSBjaGVjayBpcyBwZXJmb3JtZWQKICAqIEBwYXJhbSBsb2NhbCB0aGUgbG9jYWwgdmFyaWFibGUgaW52b2x2ZWQgaW4gdGhlIGNoZWNrCiAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSBleHByZXNzaW9uIHdpdGhpbiB3aGljaCBsb2NhbCBsaWVzCi0gKiBAcGFyYW0gY2hlY2tUeXBlIHRoZSBzdGF0dXMgYWdhaW5zdCB3aGljaCB0aGUgY2hlY2sgbXVzdCBiZSBwZXJmb3JtZWQ7IG9uZSAKLSAqIAkJb2Yge0BsaW5rICNDQU5fT05MWV9OVUxMIENBTl9PTkxZX05VTEx9LCB7QGxpbmsgI0NBTl9PTkxZX05VTExfTk9OX05VTEwgCi0gKiAJCUNBTl9PTkxZX05VTExfTk9OX05VTEx9LCB7QGxpbmsgI01BWV9OVUxMIE1BWV9OVUxMfSwgcG90ZW50aWFsbHkgCisgKiBAcGFyYW0gY2hlY2tUeXBlIHRoZSBzdGF0dXMgYWdhaW5zdCB3aGljaCB0aGUgY2hlY2sgbXVzdCBiZSBwZXJmb3JtZWQ7IG9uZQorICogCQlvZiB7QGxpbmsgI0NBTl9PTkxZX05VTEwgQ0FOX09OTFlfTlVMTH0sIHtAbGluayAjQ0FOX09OTFlfTlVMTF9OT05fTlVMTAorICogCQlDQU5fT05MWV9OVUxMX05PTl9OVUxMfSwge0BsaW5rICNNQVlfTlVMTCBNQVlfTlVMTH0sIHBvdGVudGlhbGx5CiAgKiAgICAgIGNvbWJpbmVkIHdpdGggYSBjb250ZXh0IGluZGljYXRvciAob25lIG9mIHtAbGluayAjSU5fQ09NUEFSSVNPTl9OVUxMfSwKICAqICAgICAge0BsaW5rICNJTl9DT01QQVJJU09OX05PTl9OVUxMfSwge0BsaW5rICNJTl9BU1NJR05NRU5UfSBvciB7QGxpbmsgI0lOX0lOU1RBTkNFT0Z9KQogICogQHBhcmFtIGZsb3dJbmZvIHRoZSBmbG93IGluZm8gYXQgdGhlIGNoZWNrIHBvaW50OyBkZWZlcnJpbmcgY29udGV4dHMgd2lsbApAQCAtNTA4LDkgKzU5Niw5IEBACiAgKiAgCWJlIGtub3duIGF0IHRoZSB0aW1lIG9mIGNhbGxpbmcgdGhpcyBtZXRob2QgKHRoZXkgYXJlIGluZmx1ZW5jZWQgYnkKICAqIAkJY29kZSB0aGF0IGZvbGxvd3MgdGhlIGN1cnJlbnQgcG9pbnQpCiAgKi8KLXB1YmxpYyB2b2lkIHJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShTY29wZSBzY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIAorcHVibGljIHZvaWQgcmVjb3JkVXNpbmdOdWxsUmVmZXJlbmNlKFNjb3BlIHNjb3BlLCBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwKIAkJRXhwcmVzc2lvbiByZWZlcmVuY2UsIGludCBjaGVja1R5cGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDAgfHwgCisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDAgfHwKIAkJCWZsb3dJbmZvLmlzRGVmaW5pdGVseVVua25vd24obG9jYWwpKSB7CiAJCXJldHVybjsKIAl9CkBAIC01MTksMTUgKzYwNywyNiBAQAogCQljYXNlIENBTl9PTkxZX05VTExfTk9OX05VTEwgfCBJTl9DT01QQVJJU09OX05PTl9OVUxMOgogCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpKSB7CiAJCQkJaWYgKGNoZWNrVHlwZSA9PSAoQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEwpKSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnRDaGVja09uTm9uTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk5vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCX0KKwkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCWZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUyk7CisJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTm9uTnVsbENvbXBhcmVkVG9OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCX0KKwkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCWZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJfQogCQkJCX0KIAkJCQlyZXR1cm47CiAJCQl9CiAJCQllbHNlIGlmIChmbG93SW5mby5jYW5ub3RCZURlZmluaXRlbHlOdWxsT3JOb25OdWxsKGxvY2FsKSkgewogCQkJCXJldHVybjsKIAkJCX0KKwkJCS8vJEZBTEwtVEhST1VHSCQKIAkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OVUxMOgogCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9DT01QQVJJU09OX05PTl9OVUxMOgogCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9BU1NJR05NRU5UOgpAQCAtNTM1LDEwICs2MzQsMjggQEAKIAkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkgewogCQkJCXN3aXRjaChjaGVja1R5cGUgJiBDT05URVhUX01BU0spIHsKIAkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05VTEw6Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQlpZiAoKChjaGVja1R5cGUgJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAocmVmZXJlbmNlLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJfQorCQkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJfQogCQkJCQkJcmV0dXJuOwogCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQl9CisJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJCX0KIAkJCQkJCXJldHVybjsKIAkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UOgogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudE51bGxBc3NpZ25tZW50KGxvY2FsLCByZWZlcmVuY2UpOwpAQCAtNTQ3LDYgKzY2NCwyMSBAQAogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxJbnN0YW5jZW9mKGxvY2FsLCByZWZlcmVuY2UpOwogCQkJCQkJcmV0dXJuOwogCQkJCX0KKwkJCX0gZWxzZSBpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKSB7CisJCQkJc3dpdGNoKGNoZWNrVHlwZSAmIENPTlRFWFRfTUFTSykgeworCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCWlmICgoKGNoZWNrVHlwZSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChyZWZlcmVuY2UuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0gZWxzZSBpZiAoZmxvd0luZm8uY2Fubm90QmVEZWZpbml0ZWx5TnVsbE9yTm9uTnVsbChsb2NhbCkpIHsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC01NjUsNyArNjk3LDcgQEAKIAkJCS8vIG5ldmVyIGhhcHBlbnMKIAl9CiAJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJdGhpcy5wYXJlbnQucmVjb3JkVXNpbmdOdWxsUmVmZXJlbmNlKHNjb3BlLCBsb2NhbCwgcmVmZXJlbmNlLCBjaGVja1R5cGUsIAorCQl0aGlzLnBhcmVudC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCByZWZlcmVuY2UsIGNoZWNrVHlwZSwKIAkJCQlmbG93SW5mbyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dJbmZvLmphdmEKaW5kZXggZWFiM2JkYy4uNGRkNDc3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsOSArNywxNCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBDb250cmlidXRpb25zIGZvciAKKyAqICAgICAJCQkJYnVnIDI5MjQ3OCAtIFJlcG9ydCBwb3RlbnRpYWxseSBudWxsIGFjcm9zcyB2YXJpYWJsZSBhc3NpZ25tZW50CisgKiAgICAgCQkJCWJ1ZyAzMzI2MzcgLSBEZWFkIENvZGUgZGV0ZWN0aW9uIHJlbW92aW5nIGNvZGUgdGhhdCBpc24ndCBkZWFkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JZlN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwogCkBAIC0xNywxMyArMjIsMzEgQEAKIAogCXB1YmxpYyBpbnQgdGFnQml0czsgLy8gUkVBQ0hBQkxFIGJ5IGRlZmF1bHQKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRUFDSEFCTEUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOUkVBQ0hBQkxFID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOVUxMX0ZMQUdfTUFTSyA9IDI7CisJLyogdW5yZWFjaGFibGUgY29kZSAKKwkgKiBlZy4gd2hpbGUgKHRydWUpOworCSAqICAgICBpKys7ICAtLT4gdW5yZWFjaGFibGUgY29kZSAKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlJFQUNIQUJMRV9PUl9ERUFEID0gMTsKKwkvKiB1bnJlYWNoYWJsZSBjb2RlIGFzIGluZmVycmVkIGJ5IG51bGwgYW5hbHlzaXMKKwkgKiBlZy4gc3RyID0gbnVsbDsKKwkgKiAgICAgaWYgKHN0ciAhPSBudWxsKSB7CisJICogICAgICAgIC8vIGRlYWQgY29kZQorCSAqICAgICB9CisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTID0gMjsKKwkvKgorCSAqIGNvZGUgdW5yZWFjaGFibGUgaW4gYW55IGZhc2hpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlJFQUNIQUJMRSA9IFVOUkVBQ0hBQkxFX09SX0RFQUQgfCBVTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVM7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTlVMTF9GTEFHX01BU0sgPSA0OwogCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOS05PV04gPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5VTEwgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PTl9OVUxMID0gLTE7Ci0JCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5LTk9XTiA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTlVMTCA9IDI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9OX05VTEwgPSA0OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBPVEVOVElBTExZX1VOS05PV04gPSA4OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBPVEVOVElBTExZX05VTEwgPSAxNjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQT1RFTlRJQUxMWV9OT05fTlVMTCA9IDMyOworCiAJcHVibGljIHN0YXRpYyBmaW5hbCBVbmNvbmRpdGlvbmFsRmxvd0luZm8gREVBRF9FTkQ7IC8vIFJlcHJlc2VudHMgYSBkZWFkIGJyYW5jaCBzdGF0dXMgb2YgaW5pdGlhbGl6YXRpb24KIAlzdGF0aWMgewogCQlERUFEX0VORCA9IG5ldyBVbmNvbmRpdGlvbmFsRmxvd0luZm8oKTsKQEAgLTMzLDE5ICs1NiwyNiBAQAogLyoqCiAgKiBBZGQgb3RoZXIgaW5pdHMgdG8gdGhpcyBmbG93IGluZm8sIHRoZW4gcmV0dXJuIHRoaXMuIFRoZSBvcGVyYXRpb24gc2VtYW50aWNzCiAgKiBhcmUgdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0aGUgYXBwbGljYXRpb24gdG8gdGhpcyBmbG93IGluZm8gb2YgYWxsCi0gKiB0aGUgb3BlcmF0aW9ucyB0aGF0IHJlc3VsdGVkIGludG8gb3RoZXJJbml0cy4gCisgKiB0aGUgb3BlcmF0aW9ucyB0aGF0IHJlc3VsdGVkIGludG8gb3RoZXJJbml0cy4KICAqIEBwYXJhbSBvdGhlckluaXRzIG90aGVyIGluaXRzIHRvIGFkZCB0byB0aGlzCiAgKiBAcmV0dXJuIHRoaXMsIG1vZGlmaWVkIGFjY29yZGluZyB0byBvdGhlckluaXRzIGluZm9ybWF0aW9uCiAgKi8KIGFic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBhZGRJbml0aWFsaXphdGlvbnNGcm9tKEZsb3dJbmZvIG90aGVySW5pdHMpOwogCisvKioKKyAqIEFkZCBhbGwgbnVsbCBpbmZvcm1hdGlvbiBmcm9tIG90aGVySW5pdHMgdG8gdGhpcyBmbG93IGluZm8gYW5kIHJldHVybiB0aGlzLgorICogVGhlIG9wZXJhdGlvbiBtb2RlbHMgdGhlIGVmZmVjdCBvZiBhbiB1bmNvbmRpdGlvbmFsIHNlcXVlbmNlIG9mIHRoaXMgZmxvdyBpbmZvCisgKiBhbmQgb3RoZXJJbml0cy4KKyAqLworYWJzdHJhY3QgcHVibGljIEZsb3dJbmZvIGFkZE51bGxJbmZvRnJvbShGbG93SW5mbyBvdGhlckluaXRzKTsKKwogCiAvKioKICAqIENvbXBvc2Ugb3RoZXIgaW5pdHMgb3ZlciB0aGlzIGZsb3cgaW5mbywgdGhlbiByZXR1cm4gdGhpcy4gVGhlIG9wZXJhdGlvbgogICogc2VtYW50aWNzIGFyZSB0byB3YXZlIGludG8gdGhpcyBmbG93IGluZm8gdGhlIGNvbnNlcXVlbmNlcyBvZiBhIHBvc3NpYmxlCiAgKiBwYXRoIGludG8gdGhlIG9wZXJhdGlvbnMgdGhhdCByZXN1bHRlZCBpbnRvIG90aGVySW5pdHMuIFRoZSBmYWN0IHRoYXQgdGhpcwogICogcGF0aCBtYXkgYmUgbGVmdCB1bmV4ZWN1dGVkIHVuZGVyIHBlY3VsaWFyIGNvbmRpdGlvbnMgcmVzdWx0cyBpbnRvIGxlc3MKLSAqIHNwZWNpZmljIHJlc3VsdHMgdGhhbiB7QGxpbmsgI2FkZEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8pIAorICogc3BlY2lmaWMgcmVzdWx0cyB0aGFuIHtAbGluayAjYWRkSW5pdGlhbGl6YXRpb25zRnJvbShGbG93SW5mbykKICAqIGFkZEluaXRpYWxpemF0aW9uc0Zyb219LgogICogQHBhcmFtIG90aGVySW5pdHMgb3RoZXIgaW5pdHMgdG8gY29tcG9zZSBvdmVyIHRoaXMKICAqIEByZXR1cm4gdGhpcywgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIG90aGVySW5pdHMgaW5mb3JtYXRpb24KQEAgLTU4LDExICs4OCwxMSBAQAogCX0KIAogCXB1YmxpYyBzdGF0aWMgRmxvd0luZm8gY29uZGl0aW9uYWwoRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UpewotCisJCWlmIChpbml0c1doZW5UcnVlID09IGluaXRzV2hlbkZhbHNlKSByZXR1cm4gaW5pdHNXaGVuVHJ1ZTsKIAkJLy8gaWYgKGluaXRzV2hlblRydWUuZXF1YWxzKGluaXRzV2hlbkZhbHNlKSkgcmV0dXJuIGluaXRzV2hlblRydWU7IC0tIGNvdWxkIG9wdGltaXplIGlmICNlcXVhbHMgaXMgZGVmaW5lZAogCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsRmxvd0luZm8oaW5pdHNXaGVuVHJ1ZSwgaW5pdHNXaGVuRmFsc2UpOwogCX0KLQkKKwogLyoqCiAgKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gbG9jYWwgdmFyaWFibGUgaXMga25vd24gdG8gYmUgdW5hYmxlIHRvIGdhaW4gYSBkZWZpbml0ZQogICogbm9uIG51bGwgb3IgZGVmaW5pdGUgbnVsbCBzdGF0dXMgYnkgdGhlIHVzZSBvZiBhbiBlbmNsb3NpbmcgZmxvdyBpbmZvLiBUaGUKQEAgLTcwLDggKzEwMCw4IEBACiAgKiB1bmtub3duIG9yIGVsc2UgYXMgYmVpbmcgYm90aCBwb3RlbnRpYWxseSBudWxsIGFuZCBwb3RlbnRpYWxseSBub24gbnVsbCwKICAqIHRoZW4gaXQgd29uJ3QgZXZlciBiZSBwcm9tb3RlZCBhcyBkZWZpbml0ZWx5IG51bGwgb3IgZGVmaW5pdGVseSBub24gbnVsbC4gKEl0CiAgKiBjb3VsZCBzdGlsbCBnZXQgcHJvbW90ZWQgdG8gZGVmaW5pdGUgdW5rbm93bikuCi0gKiBAcGFyYW0gbG9jYWwgdGhlIHZhcmlhYmxlIHRvIGNrZWNrCi0gKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgZmxvdyBpbmZvIHByZXZlbnRzIGxvY2FsIGZyb20gYmVpbmcgcHJvbW90ZWQgdG8gCisgKiBAcGFyYW0gbG9jYWwgdGhlIHZhcmlhYmxlIHRvIGNoZWNrCisgKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgZmxvdyBpbmZvIHByZXZlbnRzIGxvY2FsIGZyb20gYmVpbmcgcHJvbW90ZWQgdG8KICAqICAgICAgICAgZGVmaW5pdGUgbm9uIG51bGwgb3IgZGVmaW5pdGUgbnVsbCBhZ2FpbnN0IGFuIGVuY2xvc2luZyBmbG93IGluZm8KICAqLwogcHVibGljIGJvb2xlYW4gY2Fubm90QmVEZWZpbml0ZWx5TnVsbE9yTm9uTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewpAQCAtODAsNyArMTEwLDcgQEAKIH0KIAogLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gbG9jYWwgdmFyaWFibGUgaXMga25vd24gdG8gYmUgbm9uIG51bGwsIGVpdGhlciBiZWNhdXNlIAorICogQ2hlY2sgd2hldGhlciBhIGdpdmVuIGxvY2FsIHZhcmlhYmxlIGlzIGtub3duIHRvIGJlIG5vbiBudWxsLCBlaXRoZXIgYmVjYXVzZQogICogaXQgaXMgZGVmaW5pdGVseSBub24gbnVsbCwgb3IgYmVjYXVzZSBpcyBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBub24gbnVsbC4KICAqIEBwYXJhbSBsb2NhbCB0aGUgdmFyaWFibGUgdG8gY2tlY2sKICAqIEByZXR1cm4gdHJ1ZSBpZmYgbG9jYWwgY2Fubm90IGJlIG51bGwgZm9yIHRoaXMgZmxvdyBpbmZvCkBAIC0xMTAsMTEgKzE0MCwxMSBAQAogCQlpbmZvLm1heEZpZWxkQ291bnQgPSBtYXhGaWVsZENvdW50OwogCQlyZXR1cm4gaW5mbzsKIAl9Ci0JCisKIC8qKgogICogUmV0dXJuIHRoZSBmbG93IGluZm8gdGhhdCB3b3VsZCByZXN1bHQgZnJvbSB0aGUgcGF0aCBhc3NvY2lhdGVkIHRvIHRoZQogICogdmFsdWUgZmFsc2UgZm9yIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiB0aGF0IGdlbmVyYXRlZCB0aGlzIGZsb3cgaW5mby4KLSAqIE1heSBiZSB0aGlzIGZsb3cgaW5mbyBpZiBpdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIAorICogTWF5IGJlIHRoaXMgZmxvdyBpbmZvIGlmIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsKICAqIENvbmRpdGlvbmFsRmxvd0luZm99LiBNYXkgaGF2ZSBhIHNpZGUgZWZmZWN0IG9uIHN1YnBhcnRzIG9mIHRoaXMgZmxvdwogICogaW5mbyAoc3VidHJlZXMgZ2V0IG1lcmdlZCkuCiAgKiBAcmV0dXJuIHRoZSBmbG93IGluZm8gYXNzb2NpYXRlZCB0byB0aGUgZmFsc2UgYnJhbmNoIG9mIHRoZSBjb25kaXRpb24KQEAgLTEyNSw3ICsxNTUsNyBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIGZsb3cgaW5mbyB0aGF0IHdvdWxkIHJlc3VsdCBmcm9tIHRoZSBwYXRoIGFzc29jaWF0ZWQgdG8gdGhlCiAgKiB2YWx1ZSB0cnVlIGZvciB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gdGhhdCBnZW5lcmF0ZWQgdGhpcyBmbG93IGluZm8uCi0gKiBNYXkgYmUgdGhpcyBmbG93IGluZm8gaWYgaXQgaXMgbm90IGFuIGluc3RhbmNlIG9mIHtAbGluayAKKyAqIE1heSBiZSB0aGlzIGZsb3cgaW5mbyBpZiBpdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rCiAgKiBDb25kaXRpb25hbEZsb3dJbmZvfS4gTWF5IGhhdmUgYSBzaWRlIGVmZmVjdCBvbiBzdWJwYXJ0cyBvZiB0aGlzIGZsb3cKICAqIGluZm8gKHN1YnRyZWVzIGdldCBtZXJnZWQpLgogICogQHJldHVybiB0aGUgZmxvdyBpbmZvIGFzc29jaWF0ZWQgdG8gdGhlIHRydWUgYnJhbmNoIG9mIHRoZSBjb25kaXRpb24KQEAgLTEzNiw3ICsxNjYsNyBAQAogCS8qKgogCSAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGZpZWxkLgogCSAqLwotCSBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOyAgIAorCSBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOwogCiAJLyoqCiAJICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuCkBAIC0xNjcsMzUgKzE5NywzNSBAQAogCS8qKgogCSAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KIAkgKi8KLQkgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCk7ICAgCisJIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOwogCiAJLyoqCiAJICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGZvciBhIGxvY2FsIHZhcmlhYmxlLgogCSAqLwogCi0JIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBmaWVsZCk7ICAgCisJIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBmaWVsZCk7CiAKIC8qKgotICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBudWxsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuIFJldHVybiB0cnVlIGlmIHRoZXJlIAorICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBudWxsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuIFJldHVybiB0cnVlIGlmIHRoZXJlCiAgKiBpcyBhIHJlYXNvbmFibGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgdmFyaWFibGUgYmUgbm9uIG51bGwgYXQgdGhpcyBwb2ludC4KICAqIEBwYXJhbSBsb2NhbCBMb2NhbFZhcmlhYmxlQmluZGluZyAtIHRoZSBiaW5kaW5nIGZvciB0aGUgY2hlY2tlZCBsb2NhbAotICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVhc29uYWJsZSBleHBlY3RhdGlvbiB0aGF0IGxvY2FsIGJlIG5vbiBudWxsIGF0IAorICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVhc29uYWJsZSBleHBlY3RhdGlvbiB0aGF0IGxvY2FsIGJlIG5vbiBudWxsIGF0CiAgKiB0aGlzIHBvaW50CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUG90ZW50aWFsbHlOb25OdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKLQkKKwogLyoqCi0gKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIG51bGwgYXNzaWdubWVudCBmb3IgYSBsb2NhbC4gUmV0dXJuIHRydWUgaWYgdGhlcmUgCi0gKiBpcyBhIHJlYXNvbmFibGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgdmFyaWFibGUgYmUgbnVsbCBhdCB0aGlzIHBvaW50LiBUaGlzIAorICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBudWxsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuIFJldHVybiB0cnVlIGlmIHRoZXJlCisgKiBpcyBhIHJlYXNvbmFibGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgdmFyaWFibGUgYmUgbnVsbCBhdCB0aGlzIHBvaW50LiBUaGlzCiAgKiBpbmNsdWRlcyB0aGUgcHJvdGVjdGVkIG51bGwgY2FzZSwgc28gYXMgdG8gYXVnbWVudCBkaWFnbm9zdGljcywgYnV0IGRvZXMgbm90CiAgKiByZWFsbHkgY2hlY2sgdGhhdCBzb21lb25lIGRlbGliZXJhdGVseSBhc3NpZ25lZCB0byBudWxsIG9uIGFueSBzcGVjaWZpYwogICogcGF0aAogICogQHBhcmFtIGxvY2FsIExvY2FsVmFyaWFibGVCaW5kaW5nIC0gdGhlIGJpbmRpbmcgZm9yIHRoZSBjaGVja2VkIGxvY2FsCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSByZWFzb25hYmxlIGV4cGVjdGF0aW9uIHRoYXQgbG9jYWwgYmUgbnVsbCBhdCAKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHJlYXNvbmFibGUgZXhwZWN0YXRpb24gdGhhdCBsb2NhbCBiZSBudWxsIGF0CiAgKiB0aGlzIHBvaW50CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUG90ZW50aWFsbHlOdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKLQkKKwogLyoqCiAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbG9jYWwgbWF5IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhbiB1bmtub3duIHZhbHVlLgogICogQHBhcmFtIGxvY2FsIHRoZSBsb2NhbCB0byBjaGVjawpAQCAtMjIzLDEzICsyNTMsMTMgQEAKICAqIEBwYXJhbSBsb2NhbCB0aGUgY2hlY2tlZCBsb2NhbCB2YXJpYWJsZQogICovCiBhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKLQkKKwogLyoqCiAgKiBSZWNvcmQgdGhhdCBhIGxvY2FsIHZhcmlhYmxlIGdvdCBjaGVja2VkIHRvIGJlIG51bGwuCiAgKiBAcGFyYW0gbG9jYWwgdGhlIGNoZWNrZWQgbG9jYWwgdmFyaWFibGUKICAqLwogYWJzdHJhY3QgcHVibGljIHZvaWQgbWFya0FzQ29tcGFyZWRFcXVhbFRvTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7Ci0JCisKIAkvKioKIAkgKiBSZWNvcmQgYSBmaWVsZCBnb3QgZGVmaW5pdGVseSBhc3NpZ25lZC4KIAkgKi8KQEAgLTI0Niw2ICsyNzYsMjYgQEAKIAlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5TnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7CiAKIAkvKioKKwkgKiBSZXNldCBhbGwgbnVsbC1pbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGxvY2FsLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHJlc2V0TnVsbEluZm8oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworCisJLyoqCisJICogUmVjb3JkIGEgbG9jYWwgbWF5IGhhdmUgZ290IGFzc2lnbmVkIHRvIHVua25vd24gKHNldCB0aGUgYml0IG9uIGV4aXN0aW5nIGluZm8pLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtQb3RlbnRpYWxseVVua25vd25CaXQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworCisJLyoqCisJICogUmVjb3JkIGEgbG9jYWwgbWF5IGhhdmUgZ290IGFzc2lnbmVkIHRvIG51bGwgKHNldCB0aGUgYml0IG9uIGV4aXN0aW5nIGluZm8pLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtQb3RlbnRpYWxseU51bGxCaXQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworCisJLyoqCisJICogUmVjb3JkIGEgbG9jYWwgbWF5IGhhdmUgZ290IGFzc2lnbmVkIHRvIG5vbi1udWxsIChzZXQgdGhlIGJpdCBvbiBleGlzdGluZyBpbmZvKS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrUG90ZW50aWFsbHlOb25OdWxsQml0KExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKKworCS8qKgogCSAqIFJlY29yZCBhIGxvY2FsIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgogCSAqLwogCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7CkBAIC0yNTYsNzUgKzMwNiwyMDEgQEAKIGFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlVbmtub3duKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKIAogLyoqCisgKiBNYXJrIHRoZSBudWxsIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbG9jYWwgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdGF0dXMKKyAqIEBwYXJhbSBsb2NhbAorICogQHBhcmFtIG51bGxTdGF0dXMgYml0c2V0IG9mIEZMb3dJbmZvLlVOS05PV04gLi4uIEZsb3dJbmZvLlBPVEVOVElBTExZX05PTl9OVUxMCisgKi8KK3B1YmxpYyB2b2lkIG1hcmtOdWxsU3RhdHVzKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBpbnQgbnVsbFN0YXR1cykgeworCXN3aXRjaChudWxsU3RhdHVzKSB7CisJCS8vIGRlZmluaXRlIHN0YXR1cz8KKwkJY2FzZSBGbG93SW5mby5VTktOT1dOIDoKKwkJCW1hcmtBc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKTsKKwkJCWJyZWFrOworCQljYXNlIEZsb3dJbmZvLk5VTEwgOgorCQkJbWFya0FzRGVmaW5pdGVseU51bGwobG9jYWwpOworCQkJYnJlYWs7CisJCWNhc2UgRmxvd0luZm8uTk9OX05VTEwgOgorCQkJbWFya0FzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvLyBjb2xsZWN0IHBvdGVudGlhbCBzdGF0dXM6CisJCQlyZXNldE51bGxJbmZvKGxvY2FsKTsKKwkJCWlmICgobnVsbFN0YXR1cyAmIEZsb3dJbmZvLlBPVEVOVElBTExZX1VOS05PV04pICE9IDApCisJCQkJbWFya1BvdGVudGlhbGx5VW5rbm93bkJpdChsb2NhbCk7CisJCQlpZiAoKG51bGxTdGF0dXMgJiBGbG93SW5mby5QT1RFTlRJQUxMWV9OVUxMKSAhPSAwKQorCQkJCW1hcmtQb3RlbnRpYWxseU51bGxCaXQobG9jYWwpOworCQkJaWYgKChudWxsU3RhdHVzICYgRmxvd0luZm8uUE9URU5USUFMTFlfTk9OX05VTEwpICE9IDApCisJCQkJbWFya1BvdGVudGlhbGx5Tm9uTnVsbEJpdChsb2NhbCk7CisJCQlpZiAoKG51bGxTdGF0dXMgJiAoRmxvd0luZm8uUE9URU5USUFMTFlfTlVMTHxGbG93SW5mby5QT1RFTlRJQUxMWV9OT05fTlVMTHxGbG93SW5mby5QT1RFTlRJQUxMWV9VTktOT1dOKSkgPT0gMCkKKwkJCQltYXJrQXNEZWZpbml0ZWx5VW5rbm93bihsb2NhbCk7CisJfQorfQorCisvKioKKyAqIEFuc3dlciB0aGUgbnVsbCBzdGF0dXMgb2YgdGhlIGdpdmVuIGxvY2FsCisgKiBAcGFyYW0gbG9jYWwKKyAqIEByZXR1cm4gYml0c2V0IG9mIEZsb3dJbmZvLlVOS05PV04gLi4uIEZsb3dJbmZvLlBPVEVOVElBTExZX05PTl9OVUxMCisgKi8KK3B1YmxpYyBpbnQgbnVsbFN0YXR1cyhMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCWlmIChpc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKSkKKwkJcmV0dXJuIEZsb3dJbmZvLlVOS05PV047CisJaWYgKGlzRGVmaW5pdGVseU51bGwobG9jYWwpKQorCQlyZXR1cm4gRmxvd0luZm8uTlVMTDsKKwlpZiAoaXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCkpCisJCXJldHVybiBGbG93SW5mby5OT05fTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpZiAoaXNQb3RlbnRpYWxseVVua25vd24obG9jYWwpKQorCQlzdGF0dXMgfD0gRmxvd0luZm8uUE9URU5USUFMTFlfVU5LTk9XTjsKKwlpZiAoaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKQorCQlzdGF0dXMgfD0gRmxvd0luZm8uUE9URU5USUFMTFlfTlVMTDsKKwlpZiAoaXNQb3RlbnRpYWxseU5vbk51bGwobG9jYWwpKQorCQlzdGF0dXMgfD0gRmxvd0luZm8uUE9URU5USUFMTFlfTk9OX05VTEw7CisJaWYgKHN0YXR1cyA+IDApCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIEZsb3dJbmZvLlVOS05PV047Cit9CisKKy8qKgogICogTWVyZ2UgYnJhbmNoZXMgdXNpbmcgb3B0aW1pemVkIGJvb2xlYW4gY29uZGl0aW9ucwogICovCiBwdWJsaWMgc3RhdGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRPcHRpbWl6ZWRCcmFuY2hlcygKLQkJRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgYm9vbGVhbiBpc09wdGltaXplZFRydWUsIAotCQlGbG93SW5mbyBpbml0c1doZW5GYWxzZSwgYm9vbGVhbiBpc09wdGltaXplZEZhbHNlLCAKKwkJRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgYm9vbGVhbiBpc09wdGltaXplZFRydWUsCisJCUZsb3dJbmZvIGluaXRzV2hlbkZhbHNlLCBib29sZWFuIGlzT3B0aW1pemVkRmFsc2UsCiAJCWJvb2xlYW4gYWxsb3dGYWtlRGVhZEJyYW5jaCkgewogCVVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRJbmZvOwogCWlmIChpc09wdGltaXplZFRydWUpewogCQlpZiAoaW5pdHNXaGVuVHJ1ZSA9PSBGbG93SW5mby5ERUFEX0VORCAmJiBhbGxvd0Zha2VEZWFkQnJhbmNoKSB7Ci0JCQltZXJnZWRJbmZvID0gaW5pdHNXaGVuRmFsc2Uuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKS4KKwkJCW1lcmdlZEluZm8gPSBpbml0c1doZW5GYWxzZS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkuCiAJCQkJdW5jb25kaXRpb25hbEluaXRzKCk7Ci0JCX0gCisJCX0KIAkJZWxzZSB7Ci0JCQltZXJnZWRJbmZvID0gCisJCQltZXJnZWRJbmZvID0KIAkJCQlpbml0c1doZW5UcnVlLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5pdHNXaGVuRmFsc2UuCiAJCQkJCW51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpLgogCQkJCXVuY29uZGl0aW9uYWxJbml0cygpOwogCQl9Ci0JfSAKKwl9CiAJZWxzZSBpZiAoaXNPcHRpbWl6ZWRGYWxzZSkgewogCQlpZiAoaW5pdHNXaGVuRmFsc2UgPT0gRmxvd0luZm8uREVBRF9FTkQgJiYgYWxsb3dGYWtlRGVhZEJyYW5jaCkgewotCQkJbWVyZ2VkSW5mbyA9IGluaXRzV2hlblRydWUuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKS4KKwkJCW1lcmdlZEluZm8gPSBpbml0c1doZW5UcnVlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKS4KIAkJCQl1bmNvbmRpdGlvbmFsSW5pdHMoKTsKLQkJfSAKKwkJfQogCQllbHNlIHsKLQkJCW1lcmdlZEluZm8gPSAKKwkJCW1lcmdlZEluZm8gPQogCQkJCWluaXRzV2hlbkZhbHNlLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5pdHNXaGVuVHJ1ZS4KIAkJCQkJbnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkuCiAJCQkJdW5jb25kaXRpb25hbEluaXRzKCk7CiAJCX0KLQl9IAorCX0KIAllbHNlIHsKIAkJbWVyZ2VkSW5mbyA9IGluaXRzV2hlblRydWUuCiAJCQltZXJnZWRXaXRoKGluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIAl9CiAJcmV0dXJuIG1lcmdlZEluZm87CiB9Ci0JCisKIC8qKgotICogUmV0dXJuIFJFQUNIQUJMRSBpZiB0aGlzIGZsb3cgaW5mbyBpcyByZWFjaGFibGUsIFVOUkVBQ0hBQkxFCi0gKiBlbHNlLgotICogQHJldHVybiBSRUFDSEFCTEUgaWYgdGhpcyBmbG93IGluZm8gaXMgcmVhY2hhYmxlLCBVTlJFQUNIQUJMRQotICogICAgICAgICBlbHNlCisgKiBNZXJnZSBpZi1lbHNlIGJyYW5jaGVzIHVzaW5nIG9wdGltaXplZCBib29sZWFuIGNvbmRpdGlvbnMKKyAqLworcHVibGljIHN0YXRpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gbWVyZ2VkT3B0aW1pemVkQnJhbmNoZXNJZkVsc2UoCisJCUZsb3dJbmZvIGluaXRzV2hlblRydWUsIGJvb2xlYW4gaXNPcHRpbWl6ZWRUcnVlLAorCQlGbG93SW5mbyBpbml0c1doZW5GYWxzZSwgYm9vbGVhbiBpc09wdGltaXplZEZhbHNlLAorCQlib29sZWFuIGFsbG93RmFrZURlYWRCcmFuY2gsIEZsb3dJbmZvIGZsb3dJbmZvLCBJZlN0YXRlbWVudCBpZlN0YXRlbWVudCkgeworCVVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRJbmZvOworCWlmIChpc09wdGltaXplZFRydWUpeworCQlpZiAoaW5pdHNXaGVuVHJ1ZSA9PSBGbG93SW5mby5ERUFEX0VORCAmJiBhbGxvd0Zha2VEZWFkQnJhbmNoKSB7CisJCQltZXJnZWRJbmZvID0gaW5pdHNXaGVuRmFsc2Uuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpLgorCQkJCXVuY29uZGl0aW9uYWxJbml0cygpOworCQl9CisJCWVsc2UgeworCQkJbWVyZ2VkSW5mbyA9CisJCQkJaW5pdHNXaGVuVHJ1ZS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGluaXRzV2hlbkZhbHNlLgorCQkJCQludWxsSW5mb0xlc3NVbmNvbmRpdGlvbmFsQ29weSgpKS4KKwkJCQl1bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJfQorCX0KKwllbHNlIGlmIChpc09wdGltaXplZEZhbHNlKSB7CisJCWlmIChpbml0c1doZW5GYWxzZSA9PSBGbG93SW5mby5ERUFEX0VORCAmJiBhbGxvd0Zha2VEZWFkQnJhbmNoKSB7CisJCQltZXJnZWRJbmZvID0gaW5pdHNXaGVuVHJ1ZS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkuCisJCQkJdW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0KKwkJZWxzZSB7CisJCQltZXJnZWRJbmZvID0KKwkJCQlpbml0c1doZW5GYWxzZS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGluaXRzV2hlblRydWUuCisJCQkJCW51bGxJbmZvTGVzc1VuY29uZGl0aW9uYWxDb3B5KCkpLgorCQkJCXVuY29uZGl0aW9uYWxJbml0cygpOworCQl9CisJfQorCWVsc2UgaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDAgJiYKKwkJCQkoaWZTdGF0ZW1lbnQuYml0cyAmIEFTVE5vZGUuSXNFbHNlU3RhdGVtZW50VW5yZWFjaGFibGUpICE9IDAgJiYKKwkJCQlpbml0c1doZW5UcnVlICE9IEZsb3dJbmZvLkRFQURfRU5EICYmCisJCQkJaW5pdHNXaGVuRmFsc2UgIT0gRmxvd0luZm8uREVBRF9FTkQpIHsKKwkJLy8gRG9uZSB3aGVuIHRoZSB0aGVuIGJyYW5jaCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCBidXQgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBoYXZlIGEgYm9vbGVhbgorCQkvLyB0cnVlIG9yIGZhbHNlIChpLmUgaWYodHJ1ZSksIGV0YykgZm9yIHN1cmUKKwkJLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiBib3RoIGlmIGFuZCBlbHNlIGJyYW5jaGVzIHRoZW1zZWx2ZXMgYXJlIGluIGFuIHVucmVhY2hhYmxlIGNvZGUKKwkJLy8gb3IgaWYgYW55IG9mIHRoZW0gaXMgYSBERUFEX0VORCAoZS5nLiBjb250YWlucyAncmV0dXJuJyBvciAndGhyb3dzJykKKwkJbWVyZ2VkSW5mbyA9CisJCQlpbml0c1doZW5UcnVlLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5pdHNXaGVuRmFsc2UuCisJCQkJbnVsbEluZm9MZXNzVW5jb25kaXRpb25hbENvcHkoKSkuCisJCQl1bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJLy8gaWYgYSB2YXJpYWJsZSBpcyBvbmx5IGluaXRpYWxpemVkIGluIG9uZSBicmFuY2ggYW5kIG5vdCBpbml0aWFsaXplZCBpbiB0aGUgb3RoZXIsCisJCS8vIHRoZW4gd2UgbmVlZCB0byBjYXN0IGEgZG91YnQgb24gaXRzIGluaXRpYWxpemF0aW9uIGluIHRoZSBtZXJnZWQgaW5mbworCQltZXJnZWRJbmZvLmRlZmluaXRlSW5pdHMgJj0gaW5pdHNXaGVuRmFsc2UudW5jb25kaXRpb25hbENvcHkoKS5kZWZpbml0ZUluaXRzOworCQkKKwl9CisJZWxzZSBpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCAmJgorCQkJKGlmU3RhdGVtZW50LmJpdHMgJiBBU1ROb2RlLklzVGhlblN0YXRlbWVudFVucmVhY2hhYmxlKSAhPSAwICYmIGluaXRzV2hlblRydWUgIT0gRmxvd0luZm8uREVBRF9FTkQKKwkJCSYmIGluaXRzV2hlbkZhbHNlICE9IEZsb3dJbmZvLkRFQURfRU5EKSB7CisJCS8vIERvbmUgd2hlbiB0aGUgZWxzZSBicmFuY2ggd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQgYnV0IHRoZSBjb25kaXRpb24gZG9lcyBub3QgaGF2ZSBhIGJvb2xlYW4KKwkJLy8gdHJ1ZSBvciBmYWxzZSAoaS5lIGlmKHRydWUpLCBldGMpIGZvciBzdXJlCisJCS8vIFdlIGRvbid0IGRvIHRoaXMgaWYgYm90aCBpZiBhbmQgZWxzZSBicmFuY2hlcyB0aGVtc2VsdmVzIGFyZSBpbiBhbiB1bnJlYWNoYWJsZSBjb2RlCisJCS8vIG9yIGlmIGFueSBvZiB0aGVtIGlzIGEgREVBRF9FTkQgKGUuZy4gY29udGFpbnMgJ3JldHVybicgb3IgJ3Rocm93cycpCisJCW1lcmdlZEluZm8gPSAKKwkJCWluaXRzV2hlbkZhbHNlLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oaW5pdHNXaGVuVHJ1ZS4KKwkJCQludWxsSW5mb0xlc3NVbmNvbmRpdGlvbmFsQ29weSgpKS4KKwkJCXVuY29uZGl0aW9uYWxJbml0cygpOworCQkvLyBpZiBhIHZhcmlhYmxlIGlzIG9ubHkgaW5pdGlhbGl6ZWQgaW4gb25lIGJyYW5jaCBhbmQgbm90IGluaXRpYWxpemVkIGluIHRoZSBvdGhlciwKKwkJLy8gdGhlbiB3ZSBuZWVkIHRvIGNhc3QgYSBkb3VidCBvbiBpdHMgaW5pdGlhbGl6YXRpb24gaW4gdGhlIG1lcmdlZCBpbmZvCisJCW1lcmdlZEluZm8uZGVmaW5pdGVJbml0cyAmPSBpbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxDb3B5KCkuZGVmaW5pdGVJbml0czsKKwl9CisJZWxzZSB7CisJCW1lcmdlZEluZm8gPSBpbml0c1doZW5UcnVlLgorCQkJbWVyZ2VkV2l0aChpbml0c1doZW5GYWxzZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJfQorCXJldHVybiBtZXJnZWRJbmZvOworfQorCisvKioKKyAqIEZpbmQgb3V0IHRoZSByZWFjaGFiaWxpdHkgbW9kZSBvZiB0aGlzIGZsb3dJbmZvLgorICogQHJldHVybiBSRUFDSEFCTEUgaWYgdGhpcyBmbG93IGluZm8gaXMgcmVhY2hhYmxlLCBvdGhlcndpc2UKKyAqICAgICAgICAgZWl0aGVyIFVOUkVBQ0hBQkxFX09SX0RFQUQgb3IgVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTLgogICovCiBwdWJsaWMgaW50IHJlYWNoTW9kZSgpIHsKIAlyZXR1cm4gdGhpcy50YWdCaXRzICYgVU5SRUFDSEFCTEU7CiB9Ci0JCisKIC8qKgogICogUmV0dXJuIGEgZmxvdyBpbmZvIHRoYXQgY2FycmllcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgcmVzdWx0IG9mCi0gKiB7QGxpbmsgI2luaXRzV2hlblRydWUoKSBpbml0c1doZW5UcnVlfSwgYnV0IHdhcnJhbnRpZWQgdG8gYmUgZGlmZmVyZW50IAorICoge0BsaW5rICNpbml0c1doZW5UcnVlKCkgaW5pdHNXaGVuVHJ1ZX0sIGJ1dCB3YXJyYW50aWVkIHRvIGJlIGRpZmZlcmVudAogICogZnJvbSB0aGlzLjxicj4KLSAqIENhdmVhdDogc2lkZSBlZmZlY3RzIG9uIHRoZSByZXN1bHQgbWF5IGFmZmVjdCBjb21wb25lbnRzIG9mIHRoaXMuIAorICogQ2F2ZWF0OiBzaWRlIGVmZmVjdHMgb24gdGhlIHJlc3VsdCBtYXkgYWZmZWN0IGNvbXBvbmVudHMgb2YgdGhpcy4KICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbml0c1doZW5UcnVlIG9yIGEgY29weSBvZiBpdAogICovCiBhYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gc2FmZUluaXRzV2hlblRydWUoKTsKIAogLyoqCiAgKiBTZXQgdGhpcyBmbG93IGluZm8gcmVhY2ggbW9kZSBhbmQgcmV0dXJuIHRoaXMuCi0gKiBAcGFyYW0gcmVhY2hNb2RlIG9uZSBvZiB7QGxpbmsgI1JFQUNIQUJMRSBSRUFDSEFCTEV9IG9yIHtAbGluayAjVU5SRUFDSEFCTEUgVU5SRUFDSEFCTEV9CisgKiBAcGFyYW0gcmVhY2hNb2RlIG9uZSBvZiB7QGxpbmsgI1JFQUNIQUJMRSBSRUFDSEFCTEV9LCB7QGxpbmsgI1VOUkVBQ0hBQkxFX09SX0RFQUQgVU5SRUFDSEFCTEVfT1JfREVBRH0sCisgKiB7QGxpbmsgI1VOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUyBVTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVN9IG9yIHtAbGluayAjVU5SRUFDSEFCTEUgVU5SRUFDSEFCTEV9CiAgKiBAcmV0dXJuIHRoaXMsIHdpdGggdGhlIHJlYWNoIG1vZGUgc2V0IHRvIHJlYWNoTW9kZQogICovCiBhYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gc2V0UmVhY2hNb2RlKGludCByZWFjaE1vZGUpOwogCiAvKioKLSAqIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgYW5kIG90aGVySW5pdHMsIHRoYXQgaXMgCisgKiBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCBvdGhlckluaXRzLCB0aGF0IGlzCiAgKiBvbmUgb2Y6PHVsPgogICogICA8bGk+dGhlIHJlY2VpdmVyIHVwZGF0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6PHVsPgotICogICAgIDxsaT5pbnRlcnNlY3Rpb24gb2YgZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMsIAorICogICAgIDxsaT5pbnRlcnNlY3Rpb24gb2YgZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMsCiAgKiAgICAgPGxpPnVuaW9uIG9mIHBvdGVudGlhbGx5IGFzc2lnbmVkIHZhcmlhYmxlcywKICAqICAgICA8bGk+c2ltaWxhciBvcGVyYXRpb25zIGZvciBudWxsLDwvdWw+CiAgKiAgIDxsaT5vciB0aGUgcmVjZWl2ZXIgb3Igb3RoZXJJbml0cyBpZiB0aGUgb3RoZXIgb25lIGlzIG5vbgpAQCAtMzYyLDcgKzUzOCw3IEBACiAKIC8qKgogICogUmV0dXJuIGEgbmV3IGZsb3cgaW5mbyB0aGF0IGhvbGRzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoaXMgd291bGQgYWZ0ZXIKLSAqIGEgY2FsbCB0byB7QGxpbmsgI3VuY29uZGl0aW9uYWxJbml0cygpIHVuY29uZGl0aW9uYWxJbml0c30gZm9sbG93ZWQgYnkgdGhlIAorICogYSBjYWxsIHRvIHtAbGluayAjdW5jb25kaXRpb25hbEluaXRzKCkgdW5jb25kaXRpb25hbEluaXRzfSBmb2xsb3dlZCBieSB0aGUKICAqIGVyYXN1cmUgb2YgZmllbGRzIHNwZWNpZmljIGluZm9ybWF0aW9uLCBidXQgbGVhdmluZyB0aGlzIGZsb3cgaW5mbyB1bmFmZmVjdGVkLgogICogQHJldHVybiBhIG5ldyBmbG93IGluZm8gY2FycnlpbmcgdGhlIHVuY29uZGl0aW9uYWwgZmxvdyBpbmZvIGZvciBsb2NhbCB2YXJpYWJsZXMKICAqLwpAQCAtMzcyLDcgKzU0OCw3IEBACiAgKiBSZXR1cm4gYSBmbG93IGluZm8gdGhhdCBtZXJnZXMgdGhlIHBvc3NpYmxlIHBhdGhzIG9mIGV4ZWN1dGlvbiBkZXNjcmliZWQgYnkKICAqIHRoaXMgZmxvdyBpbmZvLiBJbiBjYXNlIG9mIGFuIHVuY29uZGl0aW9uYWwgZmxvdyBpbmZvLCByZXR1cm4gdGhpcy4gSW4gY2FzZQogICogb2YgYSBjb25kaXRpb25hbCBmbG93IGluZm8sIG1lcmdlIGJyYW5jaGVzIHJlY3Vyc2l2ZWx5LiBDYXZlYXQ6IHRoaXMgbWF5Ci0gKiBiZSBhZmZlY3RlZCwgYW5kIG1vZGlmeWluZyB0aGUgcmVzdWx0IG1heSBhZmZlY3QgdGhpcy4gCisgKiBiZSBhZmZlY3RlZCwgYW5kIG1vZGlmeWluZyB0aGUgcmVzdWx0IG1heSBhZmZlY3QgdGhpcy4KICAqIEByZXR1cm4gYSBmbG93IGluZm8gdGhhdCBtZXJnZXMgdGhlIHBvc3NpYmxlIHBhdGhzIG9mIGV4ZWN1dGlvbiBkZXNjcmliZWQgYnkKICAqIAkJCXRoaXMKICAqLwpAQCAtMzgwLDEwICs1NTYsMzIgQEAKIAogLyoqCiAgKiBSZXR1cm4gYSBuZXcgZmxvdyBpbmZvIHRoYXQgaG9sZHMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhpcyB3b3VsZCBhZnRlcgotICogYSBjYWxsIHRvIHtAbGluayAjdW5jb25kaXRpb25hbEluaXRzKCkgdW5jb25kaXRpb25hbEluaXRzfSwgYnV0IGxlYXZpbmcgCi0gKiB0aGlzIGluZm8gdW5hZmZlY3RlZC4gU2lkZSBlZmZlY3RzIG9uIHRoZSByZXN1bHQgbWlnaHQgYWZmZWN0IHRoaXMgdGhvdWdoIAorICogYSBjYWxsIHRvIHtAbGluayAjdW5jb25kaXRpb25hbEluaXRzKCkgdW5jb25kaXRpb25hbEluaXRzfSwgYnV0IGxlYXZpbmcKKyAqIHRoaXMgaW5mbyB1bmFmZmVjdGVkLiBTaWRlIGVmZmVjdHMgb24gdGhlIHJlc3VsdCBtaWdodCBhZmZlY3QgdGhpcyB0aG91Z2gKICAqIChjb25zaWRlciBpdCBhcyByZWFkIG9ubHkpLgogICogQHJldHVybiBhIGZsb3cgaW5mbyBjYXJyeWluZyB0aGlzIHVuY29uZGl0aW9uYWwgZmxvdyBpbmZvCiAgKi8KIGFic3RyYWN0IHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzV2l0aG91dFNpZGVFZmZlY3QoKTsKKworLyoqCisgKiBUZWxsIHRoZSBmbG93SW5mbyB0aGF0IGEgbG9jYWwgdmFyaWFibGUgZ290IG1hcmtlZCBhcyBub24gbnVsbCBvciBudWxsCisgKiBkdWUgdG8gY29tcGFyaXNvbiB3aXRoIG51bGwgaW5zaWRlIGFuIGFzc2VydCBleHByZXNzaW9uLgorICogVGhpcyBpcyB0byBwcmV2ZW50IG92ZXItYWdncmVzc2l2ZSBjb2RlIGdlbmVyYXRpb24gZm9yIHN1YnNlcXVlbnQgaWYgc3RhdGVtZW50cworICogd2hlcmUgdGhpcyB2YXJpYWJsZSBpcyBiZWluZyBjaGVja2VkIGFnYWluc3QgbnVsbAorICovCisvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAzNDQ4CithYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworCisvKiogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvY2FsIHZhcmlhYmxlIGJlaW5nIGNoZWNrZWQgZm9yIHdhcyBtYXJrZWQgYXMgbnVsbCBvciBub3QgbnVsbAorICogaW5zaWRlIGFuIGFzc2VydCBleHByZXNzaW9uIGR1ZSB0byBjb21wYXJpc29uIGFnYWluc3QgbnVsbC4KKyAqLworLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAzNDQ4CithYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7CisKKy8qKgorICogUmVzZXRzIHRoZSBkZWZpbml0ZSBhbmQgcG90ZW50aWFsIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIHRoZSBnaXZlbiBsb2NhbCB2YXJpYWJsZQorICogQHBhcmFtIGxvY2FsCisgKi8KK2Fic3RyYWN0IHB1YmxpYyB2b2lkIHJlc2V0QXNzaWdubWVudEluZm8oTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dC5qYXZhCmluZGV4IGI1NjdmNDcuLjkyNjFhZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0luaXRpYWxpemF0aW9uRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0LmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMSw3OCArMjEsNzggQEAKICAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgogICovCiBwdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBleHRlbmRzIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgewotCiAJcHVibGljIGludCBleGNlcHRpb25Db3VudDsKIAlwdWJsaWMgVHlwZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVCaW5kaW5nWzVdOwogCXB1YmxpYyBBU1ROb2RlW10gZXhjZXB0aW9uVGhyb3dlcnMgPSBuZXcgQVNUTm9kZVs1XTsKIAlwdWJsaWMgRmxvd0luZm9bXSBleGNlcHRpb25UaHJvd2VyRmxvd0luZm9zID0gbmV3IEZsb3dJbmZvWzVdOworCXB1YmxpYyBGbG93SW5mbwlpbml0c0JlZm9yZUNvbnRleHQ7CiAJCi0JcHVibGljIEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQoCi0JCUZsb3dDb250ZXh0IHBhcmVudCwKLQkJQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSwKLQkJQmxvY2tTY29wZSBzY29wZSkgeworCXB1YmxpYyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KEZsb3dDb250ZXh0IHBhcmVudCwgQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSwgRmxvd0luZm8gaW5pdHNCZWZvcmVDb250ZXh0LCBGbG93Q29udGV4dCBpbml0aWFsaXphdGlvblBhcmVudCwgQmxvY2tTY29wZSBzY29wZSkgewogCQlzdXBlcigKIAkJCXBhcmVudCwKIAkJCWFzc29jaWF0ZWROb2RlLAogCQkJQmluZGluZy5OT19FWENFUFRJT05TLCAvLyBubyBleGNlcHRpb24gYWxsb3dlZCBieSBkZWZhdWx0Ci0JCQlzY29wZSwgCisJCQlpbml0aWFsaXphdGlvblBhcmVudCwKKwkJCXNjb3BlLAogCQkJRmxvd0luZm8uREVBRF9FTkQpOworCQl0aGlzLmluaXRzQmVmb3JlQ29udGV4dCA9IGluaXRzQmVmb3JlQ29udGV4dDsKIAl9CiAKIAlwdWJsaWMgdm9pZCBjaGVja0luaXRpYWxpemVyRXhjZXB0aW9ucygKIAkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCiAJCUZsb3dDb250ZXh0IGluaXRpYWxpemVyQ29udGV4dCwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25Db3VudDsgaSsrKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5leGNlcHRpb25Db3VudDsgaSsrKSB7CiAJCQlpbml0aWFsaXplckNvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycygKLQkJCQl0aHJvd25FeGNlcHRpb25zW2ldLAotCQkJCWV4Y2VwdGlvblRocm93ZXJzW2ldLAotCQkJCWV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3NbaV0sCisJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLAorCQkJCXRoaXMuZXhjZXB0aW9uVGhyb3dlcnNbaV0sCisJCQkJdGhpcy5leGNlcHRpb25UaHJvd2VyRmxvd0luZm9zW2ldLAogCQkJCWN1cnJlbnRTY29wZSk7CiAJCX0KIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKLQkJCisKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkluaXRpYWxpemF0aW9uIGZsb3cgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ291bnQ7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgnWycpLmFwcGVuZCh0aHJvd25FeGNlcHRpb25zW2ldLnJlYWRhYmxlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJy0nKS5hcHBlbmQoZXhjZXB0aW9uVGhyb3dlckZsb3dJbmZvc1tpXS50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4Y2VwdGlvbkNvdW50OyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQodGhpcy50aHJvd25FeGNlcHRpb25zW2ldLnJlYWRhYmxlTmFtZSgpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJy0nKS5hcHBlbmQodGhpcy5leGNlcHRpb25UaHJvd2VyRmxvd0luZm9zW2ldLnRvU3RyaW5nKCkpLmFwcGVuZCgnXScpOwogCQl9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZWNvcmRIYW5kbGluZ0V4Y2VwdGlvbigKIAkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlLAogCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8sCiAJCVR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbiwKKwkJVHlwZUJpbmRpbmcgY2F1Z2h0RXhjZXB0aW9uLAogCQlBU1ROb2RlIGludm9jYXRpb25TaXRlLAogCQlib29sZWFuIHdhc01hc2tlZCkgewotCQkJCisKIAkJLy8gZXZlbiBpZiB1bnJlYWNoYWJsZSBjb2RlLCBuZWVkIHRvIHBlcmZvcm0gdW5oYW5kbGVkIGV4Y2VwdGlvbiBkaWFnbm9zaXMKLQkJaW50IHNpemUgPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKLQkJaWYgKGV4Y2VwdGlvbkNvdW50ID09IHNpemUpIHsKKwkJaW50IHNpemUgPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQlpZiAodGhpcy5leGNlcHRpb25Db3VudCA9PSBzaXplKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRocm93bkV4Y2VwdGlvbnMsCisJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zLAogCQkJCTAsCi0JCQkJKHRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZUJpbmRpbmdbc2l6ZSAqIDJdKSwKKwkJCQkodGhpcy50aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVCaW5kaW5nW3NpemUgKiAyXSksCiAJCQkJMCwKIAkJCQlzaXplKTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJZXhjZXB0aW9uVGhyb3dlcnMsCisJCQkJdGhpcy5leGNlcHRpb25UaHJvd2VycywKIAkJCQkwLAotCQkJCShleGNlcHRpb25UaHJvd2VycyA9IG5ldyBBU1ROb2RlW3NpemUgKiAyXSksCisJCQkJKHRoaXMuZXhjZXB0aW9uVGhyb3dlcnMgPSBuZXcgQVNUTm9kZVtzaXplICogMl0pLAogCQkJCTAsCiAJCQkJc2l6ZSk7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCWV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3MsCisJCQkJdGhpcy5leGNlcHRpb25UaHJvd2VyRmxvd0luZm9zLAogCQkJCTAsCi0JCQkJKGV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3MgPSBuZXcgRmxvd0luZm9bc2l6ZSAqIDJdKSwKKwkJCQkodGhpcy5leGNlcHRpb25UaHJvd2VyRmxvd0luZm9zID0gbmV3IEZsb3dJbmZvW3NpemUgKiAyXSksCiAJCQkJMCwKIAkJCQlzaXplKTsKIAkJfQotCQl0aHJvd25FeGNlcHRpb25zW2V4Y2VwdGlvbkNvdW50XSA9IHJhaXNlZEV4Y2VwdGlvbjsKLQkJZXhjZXB0aW9uVGhyb3dlcnNbZXhjZXB0aW9uQ291bnRdID0gaW52b2NhdGlvblNpdGU7Ci0JCWV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3NbZXhjZXB0aW9uQ291bnQrK10gPSBmbG93SW5mby5jb3B5KCk7Ci0JfQkKKwkJdGhpcy50aHJvd25FeGNlcHRpb25zW3RoaXMuZXhjZXB0aW9uQ291bnRdID0gcmFpc2VkRXhjZXB0aW9uOworCQl0aGlzLmV4Y2VwdGlvblRocm93ZXJzW3RoaXMuZXhjZXB0aW9uQ291bnRdID0gaW52b2NhdGlvblNpdGU7CisJCXRoaXMuZXhjZXB0aW9uVGhyb3dlckZsb3dJbmZvc1t0aGlzLmV4Y2VwdGlvbkNvdW50KytdID0gZmxvd0luZm8uY29weSgpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0luc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEKaW5kZXggYmY5MmM4My4uNGRhYTJjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsNyArMjAsNyBAQAogcHVibGljIGNsYXNzIEluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dCBleHRlbmRzIEZsb3dDb250ZXh0IHsKIAogCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPblJldHVybjsKLQkKKwogcHVibGljIEluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dCgKIAlGbG93Q29udGV4dCBwYXJlbnQsCiAJQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSkgewpAQCAtMzcsMTMgKzM3LDEzIEBACiBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGluaXRzT25SZXR1cm4oKXsKIAlyZXR1cm4gdGhpcy5pbml0c09uUmV0dXJuOwogfQotCQorCiBwdWJsaWMgYm9vbGVhbiBpc05vblJldHVybmluZ0NvbnRleHQoKSB7CiAJcmV0dXJuICgoU3ViUm91dGluZVN0YXRlbWVudCkgdGhpcy5hc3NvY2lhdGVkTm9kZSkuaXNTdWJSb3V0aW5lRXNjYXBpbmcoKTsKIH0KLQkKKwogcHVibGljIHZvaWQgcmVjb3JkUmV0dXJuRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKLQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkJeworCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApCXsKIAlpZiAodGhpcy5pbml0c09uUmV0dXJuID09IEZsb3dJbmZvLkRFQURfRU5EKSB7CiAJCXRoaXMuaW5pdHNPblJldHVybiA9IChVbmNvbmRpdGlvbmFsRmxvd0luZm8pIGZsb3dJbmZvLmNvcHkoKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhCmluZGV4IDczMTk3NTMuLjMzNzQzMTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xhYmVsRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9MYWJlbEZsb3dDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsOSArMjAsOSBAQAogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBMYWJlbEZsb3dDb250ZXh0IGV4dGVuZHMgU3dpdGNoRmxvd0NvbnRleHQgewotCQorCiAJcHVibGljIGNoYXJbXSBsYWJlbE5hbWU7Ci0JCisKIHB1YmxpYyBMYWJlbEZsb3dDb250ZXh0KEZsb3dDb250ZXh0IHBhcmVudCwgQVNUTm9kZSBhc3NvY2lhdGVkTm9kZSwgY2hhcltdIGxhYmVsTmFtZSwgQnJhbmNoTGFiZWwgYnJlYWtMYWJlbCwgQmxvY2tTY29wZSBzY29wZSkgewogCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUsIGJyZWFrTGFiZWwpOwogCXRoaXMubGFiZWxOYW1lID0gbGFiZWxOYW1lOwpAQCAtMzEsMjIgKzMxLDIyIEBACiAKIHZvaWQgY2hlY2tMYWJlbFZhbGlkaXR5KEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBjaGVjayBpZiBsYWJlbCB3YXMgYWxyZWFkeSBkZWZpbmVkIGFib3ZlCi0JRmxvd0NvbnRleHQgY3VycmVudCA9IHBhcmVudDsKKwlGbG93Q29udGV4dCBjdXJyZW50ID0gdGhpcy5wYXJlbnQ7CiAJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogCQljaGFyW10gY3VycmVudExhYmVsTmFtZTsKIAkJaWYgKCgoY3VycmVudExhYmVsTmFtZSA9IGN1cnJlbnQubGFiZWxOYW1lKCkpICE9IG51bGwpCi0JCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50TGFiZWxOYW1lLCBsYWJlbE5hbWUpKSB7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hbHJlYWR5RGVmaW5lZExhYmVsKGxhYmVsTmFtZSwgYXNzb2NpYXRlZE5vZGUpOworCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudExhYmVsTmFtZSwgdGhpcy5sYWJlbE5hbWUpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hbHJlYWR5RGVmaW5lZExhYmVsKHRoaXMubGFiZWxOYW1lLCB0aGlzLmFzc29jaWF0ZWROb2RlKTsKIAkJfQogCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CiAJfQogfQogCiBwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKLQlyZXR1cm4gIkxhYmVsIGZsb3cgY29udGV4dCBbbGFiZWw6IiArIFN0cmluZy52YWx1ZU9mKGxhYmVsTmFtZSkgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiTGFiZWwgZmxvdyBjb250ZXh0IFtsYWJlbDoiICsgU3RyaW5nLnZhbHVlT2YodGhpcy5sYWJlbE5hbWUpICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIH0KIAogcHVibGljIGNoYXJbXSBsYWJlbE5hbWUoKSB7Ci0JcmV0dXJuIGxhYmVsTmFtZTsKKwlyZXR1cm4gdGhpcy5sYWJlbE5hbWU7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Mb29waW5nRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCmluZGV4IDczOWQ5ZTkuLjg4NmZlYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCkBAIC0xLDE1ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gY29udHJpYnV0aW9uIGZvciBCdWcgMzM2NDI4IC0gW2NvbXBpbGVyXVtudWxsXSBib2d1cyB3YXJuaW5nICJyZWR1bmRhbnQgbnVsbCBjaGVjayIgaW4gY29uZGl0aW9uIG9mIGRvIHt9IHdoaWxlKCkgbG9vcAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUmVmZXJlbmNlOwpAQCAtMTcsNyArMTksOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKIAogLyoqCkBAIC0yNSw3ICsyOSw3IEBACiAgKgl0cnkgc3RhdGVtZW50cywgZXhjZXB0aW9uIGhhbmRsZXJzLCBldGMuLi4KICAqLwogcHVibGljIGNsYXNzIExvb3BpbmdGbG93Q29udGV4dCBleHRlbmRzIFN3aXRjaEZsb3dDb250ZXh0IHsKLQkKKwogCXB1YmxpYyBCcmFuY2hMYWJlbCBjb250aW51ZUxhYmVsOwogCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkNvbnRpbnVlID0gRmxvd0luZm8uREVBRF9FTkQ7CiAJcHJpdmF0ZSBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdXBzdHJlYW1OdWxsRmxvd0luZm87CkBAIC0zNCwxOCArMzgsMzUgQEAKIAlwcml2YXRlIGludCBpbm5lckZsb3dDb250ZXh0c0NvdW50ID0gMDsKIAlwcml2YXRlIExhYmVsRmxvd0NvbnRleHQgYnJlYWtUYXJnZXRDb250ZXh0c1tdID0gbnVsbDsKIAlwcml2YXRlIGludCBicmVha1RhcmdldHNDb3VudCA9IDA7Ci0JCisKIAlSZWZlcmVuY2UgZmluYWxBc3NpZ25tZW50c1tdOwogCVZhcmlhYmxlQmluZGluZyBmaW5hbFZhcmlhYmxlc1tdOwogCWludCBhc3NpZ25Db3VudCA9IDA7Ci0JCisKIAlMb2NhbFZhcmlhYmxlQmluZGluZ1tdIG51bGxMb2NhbHM7CiAJRXhwcmVzc2lvbltdIG51bGxSZWZlcmVuY2VzOwogCWludFtdIG51bGxDaGVja1R5cGVzOwogCWludCBudWxsQ291bnQ7Ci0JCisKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxOTI2CisJc3RhdGljIHByaXZhdGUgY2xhc3MgRXNjYXBpbmdFeGNlcHRpb25DYXRjaFNpdGUgeworCQlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGNhdWdodEV4Y2VwdGlvbjsKKwkJZmluYWwgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBjYXRjaGluZ0NvbnRleHQ7CisJCXB1YmxpYyBFc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZShFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGNhdGNoaW5nQ29udGV4dCwJUmVmZXJlbmNlQmluZGluZyBjYXVnaHRFeGNlcHRpb24pIHsKKwkJCXRoaXMuY2F0Y2hpbmdDb250ZXh0ID0gY2F0Y2hpbmdDb250ZXh0OworCQkJdGhpcy5jYXVnaHRFeGNlcHRpb24gPSBjYXVnaHRFeGNlcHRpb247CisJCX0KKwkJdm9pZCBzaW11bGF0ZVRocm93QWZ0ZXJMb29wQmFjayhGbG93SW5mbyBmbG93SW5mbykgeworCQkJdGhpcy5jYXRjaGluZ0NvbnRleHQucmVjb3JkSGFuZGxpbmdFeGNlcHRpb24odGhpcy5jYXVnaHRFeGNlcHRpb24sCisJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLCBudWxsLCAvLyByYWlzZWQgZXhjZXB0aW9uLCBpcnJlbGV2YW50IGhlcmUsCisJCQkJCW51bGwsIG51bGwsIC8qIGludm9jYXRpb24gc2l0ZSwgaXJyZWxldmFudCBoZXJlICovIHRydWUgLy8gd2UgaGF2ZSBubyBidXNpbmVzcyBhbHRlcmluZyB0aGUgbmVlZGVkIHN0YXR1cy4KKwkJCQkJKTsKKwkJfQorCX0KKwlwcml2YXRlIEFycmF5TGlzdCBlc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZXMgPSBudWxsOworCiAJU2NvcGUgYXNzb2NpYXRlZFNjb3BlOwotCQorCiAJcHVibGljIExvb3BpbmdGbG93Q29udGV4dCgKIAkJRmxvd0NvbnRleHQgcGFyZW50LAogCQlGbG93SW5mbyB1cHN0cmVhbU51bGxGbG93SW5mbywKQEAgLTU0LDIzICs3NSwyMyBAQAogCQlCcmFuY2hMYWJlbCBjb250aW51ZUxhYmVsLAogCQlTY29wZSBhc3NvY2lhdGVkU2NvcGUpIHsKIAkJc3VwZXIocGFyZW50LCBhc3NvY2lhdGVkTm9kZSwgYnJlYWtMYWJlbCk7Ci0JCXByZWVtcHROdWxsRGlhZ25vc3RpYyA9IHRydWU7IAotCQkJLy8gY2hpbGRyZW4gd2lsbCBkZWZlciB0byB0aGlzLCB3aGljaCBtYXkgZGVmZXIgdG8gaXRzIG93biBwYXJlbnQgCisJCXRoaXMudGFnQml0cyB8PSBGbG93Q29udGV4dC5QUkVFTVBUX05VTExfRElBR05PU1RJQzsKKwkJCS8vIGNoaWxkcmVuIHdpbGwgZGVmZXIgdG8gdGhpcywgd2hpY2ggbWF5IGRlZmVyIHRvIGl0cyBvd24gcGFyZW50CiAJCXRoaXMuY29udGludWVMYWJlbCA9IGNvbnRpbnVlTGFiZWw7CiAJCXRoaXMuYXNzb2NpYXRlZFNjb3BlID0gYXNzb2NpYXRlZFNjb3BlOwogCQl0aGlzLnVwc3RyZWFtTnVsbEZsb3dJbmZvID0gdXBzdHJlYW1OdWxsRmxvd0luZm8udW5jb25kaXRpb25hbENvcHkoKTsKIAl9CiAKIC8qKgotICogUGVyZm9ybSBkZWZlcnJlZCBjaGVja3MgcmVsYXRpdmUgdG8gZmluYWwgdmFyaWFibGVzIGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbiAKKyAqIFBlcmZvcm0gZGVmZXJyZWQgY2hlY2tzIHJlbGF0aXZlIHRvIGZpbmFsIHZhcmlhYmxlcyBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb24KICAqIG9mIGxhY2sgb2YgaW5pdGlhbGl6YXRpb24uCiAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHRvIHdoaWNoIHRoaXMgY29udGV4dCBpcyBhc3NvY2lhdGVkCiAgKiBAcGFyYW0gZmxvd0luZm8gdGhlIGZsb3cgaW5mbyBhZ2FpbnN0IHdoaWNoIGNoZWNrcyBtdXN0IGJlIHBlcmZvcm1lZAogICovCiBwdWJsaWMgdm9pZCBjb21wbGFpbk9uRGVmZXJyZWRGaW5hbENoZWNrcyhCbG9ja1Njb3BlIHNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewogCS8vIGNvbXBsYWluIG9uIGZpbmFsIGFzc2lnbm1lbnRzIGluIGxvb3BzCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NpZ25Db3VudDsgaSsrKSB7Ci0JCVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IGZpbmFsVmFyaWFibGVzW2ldOworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hc3NpZ25Db3VudDsgaSsrKSB7CisJCVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IHRoaXMuZmluYWxWYXJpYWJsZXNbaV07CiAJCWlmICh2YXJpYWJsZSA9PSBudWxsKSBjb250aW51ZTsKIAkJYm9vbGVhbiBjb21wbGFpbmVkID0gZmFsc2U7IC8vIHJlbWVtYmVyIGlmIGhhdmUgY29tcGxhaW5lZCBvbiB0aGlzIGZpbmFsIGFzc2lnbm1lbnQKIAkJaWYgKHZhcmlhYmxlIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CkBAIC03OCwyMiArOTksMjIgQEAKIAkJCQljb21wbGFpbmVkID0gdHJ1ZTsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAogCQkJCQkoRmllbGRCaW5kaW5nKSB2YXJpYWJsZSwKLQkJCQkJZmluYWxBc3NpZ25tZW50c1tpXSk7CisJCQkJCXRoaXMuZmluYWxBc3NpZ25tZW50c1tpXSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKChMb2NhbFZhcmlhYmxlQmluZGluZykgdmFyaWFibGUpKSB7CiAJCQkJY29tcGxhaW5lZCA9IHRydWU7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoCiAJCQkJCShMb2NhbFZhcmlhYmxlQmluZGluZykgdmFyaWFibGUsCi0JCQkJCWZpbmFsQXNzaWdubWVudHNbaV0pOworCQkJCQl0aGlzLmZpbmFsQXNzaWdubWVudHNbaV0pOwogCQkJfQogCQl9Ci0JCS8vIGFueSByZWZlcmVuY2UgcmVwb3J0ZWQgYXQgdGhpcyBsZXZlbCBpcyByZW1vdmVkIGZyb20gdGhlIHBhcmVudCBjb250ZXh0IHdoZXJlIGl0IAorCQkvLyBhbnkgcmVmZXJlbmNlIHJlcG9ydGVkIGF0IHRoaXMgbGV2ZWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQgY29udGV4dCB3aGVyZSBpdAogCQkvLyBjb3VsZCBhbHNvIGJlIHJlcG9ydGVkIGFnYWluCiAJCWlmIChjb21wbGFpbmVkKSB7Ci0JCQlGbG93Q29udGV4dCBjb250ZXh0ID0gcGFyZW50OworCQkJRmxvd0NvbnRleHQgY29udGV4dCA9IHRoaXMucGFyZW50OwogCQkJd2hpbGUgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQucmVtb3ZlRmluYWxBc3NpZ25tZW50SWZBbnkoZmluYWxBc3NpZ25tZW50c1tpXSk7CisJCQkJY29udGV4dC5yZW1vdmVGaW5hbEFzc2lnbm1lbnRJZkFueSh0aGlzLmZpbmFsQXNzaWdubWVudHNbaV0pOwogCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudDsKIAkJCX0KIAkJfQpAQCAtMTE1LDcgKzEzNiw3IEBACiAJdGhpcy5pbm5lckZsb3dDb250ZXh0c0NvdW50ID0gMDsKIAlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8gPSB0aGlzLnVwc3RyZWFtTnVsbEZsb3dJbmZvLgogCQlhZGRQb3RlbnRpYWxOdWxsSW5mb0Zyb20oY2FsbGVyRmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzV2l0aG91dFNpZGVFZmZlY3QoKSk7Ci0JaWYgKHRoaXMuZGVmZXJOdWxsRGlhZ25vc3RpYykgeworCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuREVGRVJfTlVMTF9ESUFHTk9TVElDKSAhPSAwKSB7CiAJCS8vIGNoZWNrIG9ubHkgaW1tdXRhYmxlIG51bGwgY2hlY2tzIG9uIGlubmVybW9zdCBsb29waW5nIGNvbnRleHQKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm51bGxDb3VudDsgaSsrKSB7CiAJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IHRoaXMubnVsbExvY2Fsc1tpXTsKQEAgLTEyNyw5ICsxNDgsMTMgQEAKIAkJCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpKSB7CiAJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKIAkJCQkJCWlmICh0aGlzLm51bGxDaGVja1R5cGVzW2ldID09IChDQU5fT05MWV9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEwpKSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTm9uTnVsbENvbXBhcmVkVG9OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQpAQCAtMTM5LDE4ICsxNjQsMjYgQEAKIAkJCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpKSB7CiAJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKIAkJCQkJCWlmICh0aGlzLm51bGxDaGVja1R5cGVzW2ldID09IChDQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OT05fTlVMTCkpIHsKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk5vbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk5vbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU5vbk51bGxDb21wYXJlZFRvTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkgewogCQkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSA9IG51bGw7CiAJCQkJCQlpZiAodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSA9PSAoQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTlVMTCkpIHsKLQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxDb21wYXJlZFRvTm9uTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CkBAIC0xNjMsMTAgKzE5NiwyMiBAQAogCQkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSA9IG51bGw7CiAJCQkJCQlzd2l0Y2godGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENPTlRFWFRfTUFTSykgewogCQkJCQkJCWNhc2UgRmxvd0NvbnRleHQuSU5fQ09NUEFSSVNPTl9OVUxMOgotCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQlpZiAoKCh0aGlzLm51bGxDaGVja1R5cGVzW2ldICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJfQogCQkJCQkJCQljb250aW51ZTsKIAkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6Ci0JCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQlpZiAoKCh0aGlzLm51bGxDaGVja1R5cGVzW2ldICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxDb21wYXJlZFRvTm9uTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCX0KIAkJCQkJCQkJY29udGludWU7CiAJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UOgogCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50TnVsbEFzc2lnbm1lbnQobG9jYWwsIGV4cHJlc3Npb24pOwpAQCAtMTc1LDcgKzIyMCwyNCBAQAogCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbEluc3RhbmNlb2YobG9jYWwsIGV4cHJlc3Npb24pOwogCQkJCQkJCQljb250aW51ZTsKIAkJCQkJCX0KLQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKSkgeworCQkJCQkJc3dpdGNoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDT05URVhUX01BU0spIHsKKwkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSA9IG51bGw7CisJCQkJCQkJCWlmICgoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVBvdGVudGlhbE51bGxSZWZlcmVuY2UobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKKwkJCQkJCQkJaWYgKCgodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQkKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBNQVlfTlVMTDoKIAkJCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU51bGwobG9jYWwpKSB7CkBAIC0xODUsOSArMjQ3LDkgQEAKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQkvLyBuZXZlciBoYXBwZW5zCQorCQkJCQkvLyBuZXZlciBoYXBwZW5zCiAJCQl9Ci0JCQl0aGlzLnBhcmVudC5yZWNvcmRVc2luZ051bGxSZWZlcmVuY2Uoc2NvcGUsIGxvY2FsLCBleHByZXNzaW9uLCAKKwkJCXRoaXMucGFyZW50LnJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShzY29wZSwgbG9jYWwsIGV4cHJlc3Npb24sCiAJCQkJCXRoaXMubnVsbENoZWNrVHlwZXNbaV0sIGZsb3dJbmZvKTsKIAkJfQogCX0KQEAgLTIwMywxMiArMjY1LDE3IEBACiAJCQkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKSkgewogCQkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSA9IG51bGw7CiAJCQkJCQlpZiAodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSA9PSAoQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEwpKSB7Ci0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOb25OdWxsQ29tcGFyZWRUb051bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTm9uTnVsbENvbXBhcmVkVG9OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQorCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OVUxMOgogCQkJCWNhc2UgQ0FOX09OTFlfTlVMTCB8IElOX0NPTVBBUklTT05fTk9OX05VTEw6CiAJCQkJY2FzZSBDQU5fT05MWV9OVUxMIHwgSU5fQVNTSUdOTUVOVDoKQEAgLTIxNywxMCArMjg0LDIyIEBACiAJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKIAkJCQkJCXN3aXRjaCh0aGlzLm51bGxDaGVja1R5cGVzW2ldICYgQ09OVEVYVF9NQVNLKSB7CiAJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05VTEw6Ci0JCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnRDaGVja09uTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCWlmICgoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQl9CiAJCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJCWNhc2UgRmxvd0NvbnRleHQuSU5fQ09NUEFSSVNPTl9OT05fTlVMTDoKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxDb21wYXJlZFRvTm9uTnVsbChsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCWlmICgoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCBleHByZXNzaW9uKTsKKwkJCQkJCQkJfQogCQkJCQkJCQljb250aW51ZTsKIAkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0FTU0lHTk1FTlQ6CiAJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnROdWxsQXNzaWdubWVudChsb2NhbCwgZXhwcmVzc2lvbik7CkBAIC0yMjksNiArMzA4LDIzIEBACiAJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsSW5zdGFuY2VvZihsb2NhbCwgZXhwcmVzc2lvbik7CiAJCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKSkgeworCQkJCQkJc3dpdGNoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDT05URVhUX01BU0spIHsKKwkJCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCQkJdGhpcy5udWxsUmVmZXJlbmNlc1tpXSA9IG51bGw7CisJCQkJCQkJCWlmICgoKHRoaXMubnVsbENoZWNrVHlwZXNbaV0gJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVBvdGVudGlhbE51bGxSZWZlcmVuY2UobG9jYWwsIGV4cHJlc3Npb24pOworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJCQl0aGlzLm51bGxSZWZlcmVuY2VzW2ldID0gbnVsbDsKKwkJCQkJCQkJaWYgKCgodGhpcy5udWxsQ2hlY2tUeXBlc1tpXSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgZXhwcmVzc2lvbik7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIE1BWV9OVUxMOgpAQCAtMjQ0LDI2ICszNDAsMjcgQEAKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQkvLyBuZXZlciBoYXBwZW5zCQorCQkJCQkvLyBuZXZlciBoYXBwZW5zCiAJCQl9CiAJCX0KIAl9CiAJLy8gcHJvcGFnYXRlIGJyZWFrcworCXRoaXMuaW5pdHNPbkJyZWFrLmFkZFBvdGVudGlhbE51bGxJbmZvRnJvbShmbG93SW5mbyk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmJyZWFrVGFyZ2V0c0NvdW50OyBpKyspIHsKIAkJdGhpcy5icmVha1RhcmdldENvbnRleHRzW2ldLmluaXRzT25CcmVhay5hZGRQb3RlbnRpYWxOdWxsSW5mb0Zyb20oZmxvd0luZm8pOwogCX0KIH0KLQkKKwogCXB1YmxpYyBCcmFuY2hMYWJlbCBjb250aW51ZUxhYmVsKCkgewotCQlyZXR1cm4gY29udGludWVMYWJlbDsKKwkJcmV0dXJuIHRoaXMuY29udGludWVMYWJlbDsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkxvb3BpbmcgZmxvdyBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiW2luaXRzT25CcmVhayAtICIpLmFwcGVuZChpbml0c09uQnJlYWsudG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiW2luaXRzT25Db250aW51ZSAtICIpLmFwcGVuZChpbml0c09uQ29udGludWUudG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiW2ZpbmFsQXNzaWdubWVudHMgY291bnQgLSAiKS5hcHBlbmQoYXNzaWduQ291bnQpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIltudWxsUmVmZXJlbmNlcyBjb3VudCAtICIpLmFwcGVuZChudWxsQ291bnQpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIltpbml0c09uQnJlYWsgLSAiKS5hcHBlbmQodGhpcy5pbml0c09uQnJlYWsudG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiW2luaXRzT25Db250aW51ZSAtICIpLmFwcGVuZCh0aGlzLmluaXRzT25Db250aW51ZS50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbZmluYWxBc3NpZ25tZW50cyBjb3VudCAtICIpLmFwcGVuZCh0aGlzLmFzc2lnbkNvdW50KS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbbnVsbFJlZmVyZW5jZXMgY291bnQgLSAiKS5hcHBlbmQodGhpcy5udWxsQ291bnQpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9CiAKQEAgLTI3Miw3ICszNjksNyBAQAogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzQ29udGludWVkVG8oKSB7Ci0JCXJldHVybiBpbml0c09uQ29udGludWUgIT0gRmxvd0luZm8uREVBRF9FTkQ7CisJCXJldHVybiB0aGlzLmluaXRzT25Db250aW51ZSAhPSBGbG93SW5mby5ERUFEX0VORDsKIAl9CiAKIHB1YmxpYyB2b2lkIHJlY29yZEJyZWFrVG8oRmxvd0NvbnRleHQgdGFyZ2V0Q29udGV4dCkgewpAQCAtMjg4LDQyICszODUsNDIgQEAKIH0KIAogcHVibGljIHZvaWQgcmVjb3JkQ29udGludWVGcm9tKEZsb3dDb250ZXh0IGlubmVyRmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApCXsKLQlpZiAoKGluaXRzT25Db250aW51ZS50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKLQkJaW5pdHNPbkNvbnRpbnVlID0gaW5pdHNPbkNvbnRpbnVlLgotCQkJbWVyZ2VkV2l0aChmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpKTsKLQl9IAotCWVsc2UgewotCQlpbml0c09uQ29udGludWUgPSBmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpOwotCX0KLQlGbG93Q29udGV4dCBpbm5lciA9IGlubmVyRmxvd0NvbnRleHQ7Ci0Jd2hpbGUgKGlubmVyICE9IHRoaXMgJiYgIShpbm5lciBpbnN0YW5jZW9mIExvb3BpbmdGbG93Q29udGV4dCkpIHsKLQkJaW5uZXIgPSBpbm5lci5wYXJlbnQ7Ci0JfQotCWlmIChpbm5lciA9PSB0aGlzKSB7Ci0JCXRoaXMudXBzdHJlYW1OdWxsRmxvd0luZm8uCisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgPT0gMCkJeworCQlpZiAoKHRoaXMuaW5pdHNPbkNvbnRpbnVlLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKSB7CisJCQl0aGlzLmluaXRzT25Db250aW51ZSA9IHRoaXMuaW5pdHNPbkNvbnRpbnVlLgorCQkJCQltZXJnZWRXaXRoKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0c1dpdGhvdXRTaWRlRWZmZWN0KCkpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5pbml0c09uQ29udGludWUgPSBmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpOworCQl9CisJCUZsb3dDb250ZXh0IGlubmVyID0gaW5uZXJGbG93Q29udGV4dDsKKwkJd2hpbGUgKGlubmVyICE9IHRoaXMgJiYgIShpbm5lciBpbnN0YW5jZW9mIExvb3BpbmdGbG93Q29udGV4dCkpIHsKKwkJCWlubmVyID0gaW5uZXIucGFyZW50OworCQl9CisJCWlmIChpbm5lciA9PSB0aGlzKSB7CisJCQl0aGlzLnVwc3RyZWFtTnVsbEZsb3dJbmZvLgogCQkJYWRkUG90ZW50aWFsTnVsbEluZm9Gcm9tKAotCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0c1dpdGhvdXRTaWRlRWZmZWN0KCkpOwotCX0KLQllbHNlIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmICh0aGlzLmlubmVyRmxvd0NvbnRleHRzID09IG51bGwpIHsKLQkJCXRoaXMuaW5uZXJGbG93Q29udGV4dHMgPSBuZXcgTG9vcGluZ0Zsb3dDb250ZXh0WzVdOwotCQkJdGhpcy5pbm5lckZsb3dJbmZvcyA9IG5ldyBVbmNvbmRpdGlvbmFsRmxvd0luZm9bNV07CisJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0c1dpdGhvdXRTaWRlRWZmZWN0KCkpOwogCQl9Ci0JCWVsc2UgaWYgKHRoaXMuaW5uZXJGbG93Q29udGV4dHNDb3VudCA9PSAKLQkJCQkobGVuZ3RoID0gdGhpcy5pbm5lckZsb3dDb250ZXh0cy5sZW5ndGgpIC0gMSkgewotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlubmVyRmxvd0NvbnRleHRzLCAwLCAKLQkJCQkodGhpcy5pbm5lckZsb3dDb250ZXh0cyA9IG5ldyBMb29waW5nRmxvd0NvbnRleHRbbGVuZ3RoICsgNV0pLCAKLQkJCQkwLCBsZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlubmVyRmxvd0luZm9zLCAwLCAKLQkJCQkodGhpcy5pbm5lckZsb3dJbmZvcz0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mb1tsZW5ndGggKyA1XSksIAotCQkJCTAsIGxlbmd0aCk7CisJCWVsc2UgeworCQkJaW50IGxlbmd0aCA9IDA7CisJCQlpZiAodGhpcy5pbm5lckZsb3dDb250ZXh0cyA9PSBudWxsKSB7CisJCQkJdGhpcy5pbm5lckZsb3dDb250ZXh0cyA9IG5ldyBMb29waW5nRmxvd0NvbnRleHRbNV07CisJCQkJdGhpcy5pbm5lckZsb3dJbmZvcyA9IG5ldyBVbmNvbmRpdGlvbmFsRmxvd0luZm9bNV07CisJCQl9CisJCQllbHNlIGlmICh0aGlzLmlubmVyRmxvd0NvbnRleHRzQ291bnQgPT0KKwkJCQkJKGxlbmd0aCA9IHRoaXMuaW5uZXJGbG93Q29udGV4dHMubGVuZ3RoKSAtIDEpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaW5uZXJGbG93Q29udGV4dHMsIDAsCisJCQkJCQkodGhpcy5pbm5lckZsb3dDb250ZXh0cyA9IG5ldyBMb29waW5nRmxvd0NvbnRleHRbbGVuZ3RoICsgNV0pLAorCQkJCQkJMCwgbGVuZ3RoKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaW5uZXJGbG93SW5mb3MsIDAsCisJCQkJCQkodGhpcy5pbm5lckZsb3dJbmZvcz0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mb1tsZW5ndGggKyA1XSksCisJCQkJCQkwLCBsZW5ndGgpOworCQkJfQorCQkJdGhpcy5pbm5lckZsb3dDb250ZXh0c1t0aGlzLmlubmVyRmxvd0NvbnRleHRzQ291bnRdID0gKExvb3BpbmdGbG93Q29udGV4dCkgaW5uZXI7CisJCQl0aGlzLmlubmVyRmxvd0luZm9zW3RoaXMuaW5uZXJGbG93Q29udGV4dHNDb3VudCsrXSA9CisJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0c1dpdGhvdXRTaWRlRWZmZWN0KCk7CiAJCX0KLQkJdGhpcy5pbm5lckZsb3dDb250ZXh0c1t0aGlzLmlubmVyRmxvd0NvbnRleHRzQ291bnRdID0gKExvb3BpbmdGbG93Q29udGV4dCkgaW5uZXI7Ci0JCXRoaXMuaW5uZXJGbG93SW5mb3NbdGhpcy5pbm5lckZsb3dDb250ZXh0c0NvdW50KytdID0gCi0JCQlmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpOwotCX0KIAl9CiB9CiAKQEAgLTMzNSw1NiArNDMyLDU2IEBACiAJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKIAkJCVNjb3BlIHNjb3BlID0gKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykuZGVjbGFyaW5nU2NvcGU7CiAJCQl3aGlsZSAoKHNjb3BlID0gc2NvcGUucGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNjb3BlID09IGFzc29jaWF0ZWRTY29wZSkKKwkJCQlpZiAoc2NvcGUgPT0gdGhpcy5hc3NvY2lhdGVkU2NvcGUpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJfQotCQlpZiAoYXNzaWduQ291bnQgPT0gMCkgewotCQkJZmluYWxBc3NpZ25tZW50cyA9IG5ldyBSZWZlcmVuY2VbNV07Ci0JCQlmaW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbNV07CisJCWlmICh0aGlzLmFzc2lnbkNvdW50ID09IDApIHsKKwkJCXRoaXMuZmluYWxBc3NpZ25tZW50cyA9IG5ldyBSZWZlcmVuY2VbNV07CisJCQl0aGlzLmZpbmFsVmFyaWFibGVzID0gbmV3IFZhcmlhYmxlQmluZGluZ1s1XTsKIAkJfSBlbHNlIHsKLQkJCWlmIChhc3NpZ25Db3VudCA9PSBmaW5hbEFzc2lnbm1lbnRzLmxlbmd0aCkKKwkJCWlmICh0aGlzLmFzc2lnbkNvdW50ID09IHRoaXMuZmluYWxBc3NpZ25tZW50cy5sZW5ndGgpCiAJCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJZmluYWxBc3NpZ25tZW50cywKKwkJCQkJdGhpcy5maW5hbEFzc2lnbm1lbnRzLAogCQkJCQkwLAotCQkJCQkoZmluYWxBc3NpZ25tZW50cyA9IG5ldyBSZWZlcmVuY2VbYXNzaWduQ291bnQgKiAyXSksCisJCQkJCSh0aGlzLmZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlW3RoaXMuYXNzaWduQ291bnQgKiAyXSksCiAJCQkJCTAsCi0JCQkJCWFzc2lnbkNvdW50KTsKKwkJCQkJdGhpcy5hc3NpZ25Db3VudCk7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCWZpbmFsVmFyaWFibGVzLAorCQkJCXRoaXMuZmluYWxWYXJpYWJsZXMsCiAJCQkJMCwKLQkJCQkoZmluYWxWYXJpYWJsZXMgPSBuZXcgVmFyaWFibGVCaW5kaW5nW2Fzc2lnbkNvdW50ICogMl0pLAorCQkJCSh0aGlzLmZpbmFsVmFyaWFibGVzID0gbmV3IFZhcmlhYmxlQmluZGluZ1t0aGlzLmFzc2lnbkNvdW50ICogMl0pLAogCQkJCTAsCi0JCQkJYXNzaWduQ291bnQpOworCQkJCXRoaXMuYXNzaWduQ291bnQpOwogCQl9Ci0JCWZpbmFsQXNzaWdubWVudHNbYXNzaWduQ291bnRdID0gZmluYWxBc3NpZ25tZW50OwotCQlmaW5hbFZhcmlhYmxlc1thc3NpZ25Db3VudCsrXSA9IGJpbmRpbmc7CisJCXRoaXMuZmluYWxBc3NpZ25tZW50c1t0aGlzLmFzc2lnbkNvdW50XSA9IGZpbmFsQXNzaWdubWVudDsKKwkJdGhpcy5maW5hbFZhcmlhYmxlc1t0aGlzLmFzc2lnbkNvdW50KytdID0gYmluZGluZzsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi1wcm90ZWN0ZWQgdm9pZCByZWNvcmROdWxsUmVmZXJlbmNlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCAKK3Byb3RlY3RlZCB2b2lkIHJlY29yZE51bGxSZWZlcmVuY2UoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsCiAJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgc3RhdHVzKSB7Ci0JaWYgKG51bGxDb3VudCA9PSAwKSB7Ci0JCW51bGxMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbNV07Ci0JCW51bGxSZWZlcmVuY2VzID0gbmV3IEV4cHJlc3Npb25bNV07Ci0JCW51bGxDaGVja1R5cGVzID0gbmV3IGludFs1XTsKLQl9IAotCWVsc2UgaWYgKG51bGxDb3VudCA9PSBudWxsTG9jYWxzLmxlbmd0aCkgewotCQlTeXN0ZW0uYXJyYXljb3B5KG51bGxMb2NhbHMsIDAsIAotCQkJbnVsbExvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tudWxsQ291bnQgKiAyXSwgMCwgbnVsbENvdW50KTsKLQkJU3lzdGVtLmFycmF5Y29weShudWxsUmVmZXJlbmNlcywgMCwgCi0JCQludWxsUmVmZXJlbmNlcyA9IG5ldyBFeHByZXNzaW9uW251bGxDb3VudCAqIDJdLCAwLCBudWxsQ291bnQpOwotCQlTeXN0ZW0uYXJyYXljb3B5KG51bGxDaGVja1R5cGVzLCAwLCAKLQkJCW51bGxDaGVja1R5cGVzID0gbmV3IGludFtudWxsQ291bnQgKiAyXSwgMCwgbnVsbENvdW50KTsKKwlpZiAodGhpcy5udWxsQ291bnQgPT0gMCkgeworCQl0aGlzLm51bGxMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbNV07CisJCXRoaXMubnVsbFJlZmVyZW5jZXMgPSBuZXcgRXhwcmVzc2lvbls1XTsKKwkJdGhpcy5udWxsQ2hlY2tUeXBlcyA9IG5ldyBpbnRbNV07CiAJfQotCW51bGxMb2NhbHNbbnVsbENvdW50XSA9IGxvY2FsOwotCW51bGxSZWZlcmVuY2VzW251bGxDb3VudF0gPSBleHByZXNzaW9uOwotCW51bGxDaGVja1R5cGVzW251bGxDb3VudCsrXSA9IHN0YXR1czsKKwllbHNlIGlmICh0aGlzLm51bGxDb3VudCA9PSB0aGlzLm51bGxMb2NhbHMubGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5udWxsTG9jYWxzLCAwLAorCQkJdGhpcy5udWxsTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW3RoaXMubnVsbENvdW50ICogMl0sIDAsIHRoaXMubnVsbENvdW50KTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxSZWZlcmVuY2VzLCAwLAorCQkJdGhpcy5udWxsUmVmZXJlbmNlcyA9IG5ldyBFeHByZXNzaW9uW3RoaXMubnVsbENvdW50ICogMl0sIDAsIHRoaXMubnVsbENvdW50KTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm51bGxDaGVja1R5cGVzLCAwLAorCQkJdGhpcy5udWxsQ2hlY2tUeXBlcyA9IG5ldyBpbnRbdGhpcy5udWxsQ291bnQgKiAyXSwgMCwgdGhpcy5udWxsQ291bnQpOworCX0KKwl0aGlzLm51bGxMb2NhbHNbdGhpcy5udWxsQ291bnRdID0gbG9jYWw7CisJdGhpcy5udWxsUmVmZXJlbmNlc1t0aGlzLm51bGxDb3VudF0gPSBleHByZXNzaW9uOworCXRoaXMubnVsbENoZWNrVHlwZXNbdGhpcy5udWxsQ291bnQrK10gPSBzdGF0dXM7CiB9Ci0JCisKIHB1YmxpYyB2b2lkIHJlY29yZFVzaW5nTnVsbFJlZmVyZW5jZShTY29wZSBzY29wZSwgTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsCiAJCUV4cHJlc3Npb24gcmVmZXJlbmNlLCBpbnQgY2hlY2tUeXBlLCBGbG93SW5mbyBmbG93SW5mbykgewotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwIHx8IAorCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwIHx8CiAJCQlmbG93SW5mby5pc0RlZmluaXRlbHlVbmtub3duKGxvY2FsKSkgewogCQlyZXR1cm47CiAJfQpAQCAtMzkzLDIyICs0OTAsNTcgQEAKIAkJY2FzZSBDQU5fT05MWV9OVUxMX05PTl9OVUxMIHwgSU5fQ09NUEFSSVNPTl9OT05fTlVMTDoKIAkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOb25OdWxsKGxvY2FsKSkgewogCQkJCWlmIChjaGVja1R5cGUgPT0gKENBTl9PTkxZX05VTExfTk9OX05VTEwgfCBJTl9DT01QQVJJU09OX05PTl9OVUxMKSkgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk5vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQl9CisJCQkJCWlmICghZmxvd0luZm8uaXNNYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpKSB7CisJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU5vbk51bGxDb21wYXJlZFRvTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTm9uTnVsbENvbXBhcmVkVG9OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQl9CisJCQkJCWlmICghZmxvd0luZm8uaXNNYXJrZWRBc051bGxPck5vbk51bGxJbkFzc2VydEV4cHJlc3Npb24obG9jYWwpKSB7CisJCQkJCQlmbG93SW5mby5pbml0c1doZW5UcnVlKCkuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU51bGwobG9jYWwpKSB7CiAJCQkJaWYgKGNoZWNrVHlwZSA9PSAoQ0FOX09OTFlfTlVMTF9OT05fTlVMTCB8IElOX0NPTVBBUklTT05fTlVMTCkpIHsKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQlpZiAoKHRoaXMudGFnQml0cyAmIEZsb3dDb250ZXh0LkhJREVfTlVMTF9DT01QQVJJU09OX1dBUk5JTkcpID09IDApIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVSZWR1bmRhbnRDaGVja09uTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJfQorCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxDb21wYXJlZFRvTm9uTnVsbChsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJfQorCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQl9CiAJCQkJfQotCQkJfSBlbHNlIGlmICghIGZsb3dJbmZvLmNhbm5vdEJlRGVmaW5pdGVseU51bGxPck5vbk51bGwobG9jYWwpKSB7Ci0JCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlOb25OdWxsKGxvY2FsKSkgewotCQkJCQlyZWNvcmROdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UsIENBTl9PTkxZX05PTl9OVUxMIHwgY2hlY2tUeXBlICYgQ09OVEVYVF9NQVNLKTsKLQkJCQl9IGVsc2UgeworCQkJfSBlbHNlIGlmICh0aGlzLnVwc3RyZWFtTnVsbEZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpICYmICFmbG93SW5mby5pc1BvdGVudGlhbGx5TnVsbChsb2NhbCkgJiYgIWZsb3dJbmZvLmlzUG90ZW50aWFsbHlVbmtub3duKGxvY2FsKSkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE0MTgKKwkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5Tm9uTnVsbChsb2NhbCk7CisJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CiAJCQkJCXJlY29yZE51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSwgY2hlY2tUeXBlKTsKIAkJCQl9CisJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmNhbm5vdEJlRGVmaW5pdGVseU51bGxPck5vbk51bGwobG9jYWwpKSB7CisJCQkJcmV0dXJuOyAvLyBubyByZWFzb24gdG8gY29tcGxhaW4sIHNpbmNlIHRoZXJlIGlzIGRlZmluaXRlbHkgc29tZSB1bmNlcnRhaW50eSBtYWtpbmcgdGhlIGNvbXBhcmlzb24gcmVsZXZhbnQuCisJCQl9IGVsc2UgeworCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkvLyBub3RlOiBwb3Qgbm9uLW51bGwgJiBwb3QgbnVsbCBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5IGNhbm5vdEJlRGVmaW5pdGVseU51bGxPck5vbk51bGwoKQorCQkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU5vbk51bGwobG9jYWwpKSB7CisJCQkJCQkvLyBrbm93aW5nICdsb2NhbCcgY2FuIGJlIG5vbi1udWxsLCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIHdoZXRoZXIgaXQgY2FuICpvbmx5KiBiZSBub24tbnVsbCAKKwkJCQkJCXJlY29yZE51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSwgQ0FOX09OTFlfTk9OX05VTEwgfCBjaGVja1R5cGUgJiBDT05URVhUX01BU0spOworCQkJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlOdWxsKGxvY2FsKSkgeworCQkJCQkJLy8ga25vd2luZyAnbG9jYWwnIGNhbiBiZSBudWxsLCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIHdoZXRoZXIgaXQgY2FuICpvbmx5KiBiZSBudWxsCisJCQkJCQlyZWNvcmROdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UsIENBTl9PTkxZX05VTEwgfCBjaGVja1R5cGUgJiBDT05URVhUX01BU0spOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVjb3JkTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlLCBjaGVja1R5cGUpOworCQkJCQl9CisJCQkJfQogCQkJfQogCQkJcmV0dXJuOwogCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9DT01QQVJJU09OX05VTEw6CkBAIC00MTYsMTYgKzU0OCwzNyBAQAogCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9BU1NJR05NRU5UOgogCQljYXNlIENBTl9PTkxZX05VTEwgfCBJTl9JTlNUQU5DRU9GOgogCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlOb25OdWxsKGxvY2FsKQotCQkJCQl8fCBmbG93SW5mby5pc1BvdGVudGlhbGx5VW5rbm93bihsb2NhbCkpIHsKKwkJCQkJfHwgZmxvd0luZm8uaXNQb3RlbnRpYWxseVVua25vd24obG9jYWwpCisJCQkJCXx8IGZsb3dJbmZvLmlzUHJvdGVjdGVkTm9uTnVsbChsb2NhbCkpIHsKKwkJCQkvLyBpZiB2YXJpYWJsZSBpcyBub3QgbnVsbCwgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHJlY29yZGluZyBudWxsIHJlZmVyZW5jZSBmb3IgZGVmZXJyZWQgY2hlY2tzLgorCQkJCS8vIFRoaXMgaXMgYmVjYXVzZSBDQU5fT05MWV9OVUxMIG1lYW5zIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjYXNlcyB3aGVuIHZhcmlhYmxlIGNhbiBiZSBudWxsLgogCQkJCXJldHVybjsKIAkJCX0KIAkJCWlmIChmbG93SW5mby5pc0RlZmluaXRlbHlOdWxsKGxvY2FsKSkgewogCQkJCXN3aXRjaChjaGVja1R5cGUgJiBDT05URVhUX01BU0spIHsKIAkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05VTEw6Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQlpZiAoKChjaGVja1R5cGUgJiBDSEVDS19NQVNLKSA9PSBDQU5fT05MWV9OVUxMKSAmJiAocmVmZXJlbmNlLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDApIHsgLy8gY2hlY2sgZm9yIGF1dG8tdW5ib3hpbmcgZmlyc3QgYW5kIHJlcG9ydCBhcHByb3ByaWF0ZSB3YXJuaW5nCisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwKSB7CisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJfQorCQkJCQkJaWYgKCFmbG93SW5mby5pc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihsb2NhbCkpIHsKKwkJCQkJCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRV9CWV9OVUxMQU5BTFlTSVMpOworCQkJCQkJfQogCQkJCQkJcmV0dXJuOwogCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTk9OX05VTEw6Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlTnVsbENvbXBhcmVkVG9Ob25OdWxsKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCWlmICgodGhpcy50YWdCaXRzICYgRmxvd0NvbnRleHQuSElERV9OVUxMX0NPTVBBUklTT05fV0FSTklORykgPT0gMCkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwobG9jYWwsIHJlZmVyZW5jZSk7CisJCQkJCQl9CisJCQkJCQlpZiAoIWZsb3dJbmZvLmlzTWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKGxvY2FsKSkgeworCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKTsKKwkJCQkJCX0KIAkJCQkJCXJldHVybjsKIAkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UOgogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZVJlZHVuZGFudE51bGxBc3NpZ25tZW50KGxvY2FsLCByZWZlcmVuY2UpOwpAQCAtNDM0LDggKzU4NywyOSBAQAogCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubG9jYWxWYXJpYWJsZU51bGxJbnN0YW5jZW9mKGxvY2FsLCByZWZlcmVuY2UpOwogCQkJCQkJcmV0dXJuOwogCQkJCX0KKwkJCX0gZWxzZSBpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseU51bGwobG9jYWwpKSB7CisJCQkJc3dpdGNoKGNoZWNrVHlwZSAmIENPTlRFWFRfTUFTSykgeworCQkJCQljYXNlIEZsb3dDb250ZXh0LklOX0NPTVBBUklTT05fTlVMTDoKKwkJCQkJCWlmICgoKGNoZWNrVHlwZSAmIENIRUNLX01BU0spID09IENBTl9PTkxZX05VTEwpICYmIChyZWZlcmVuY2UuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkgeyAvLyBjaGVjayBmb3IgYXV0by11bmJveGluZyBmaXJzdCBhbmQgcmVwb3J0IGFwcHJvcHJpYXRlIHdhcm5pbmcKKwkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5sb2NhbFZhcmlhYmxlUG90ZW50aWFsTnVsbFJlZmVyZW5jZShsb2NhbCwgcmVmZXJlbmNlKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBGbG93Q29udGV4dC5JTl9DT01QQVJJU09OX05PTl9OVUxMOgorCQkJCQkJaWYgKCgoY2hlY2tUeXBlICYgQ0hFQ0tfTUFTSykgPT0gQ0FOX09OTFlfTlVMTCkgJiYgKHJlZmVyZW5jZS5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwKSB7IC8vIGNoZWNrIGZvciBhdXRvLXVuYm94aW5nIGZpcnN0IGFuZCByZXBvcnQgYXBwcm9wcmlhdGUgd2FybmluZworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KLQkJCXJlY29yZE51bGxSZWZlcmVuY2UobG9jYWwsIHJlZmVyZW5jZSwgY2hlY2tUeXBlKTsKKwkJCS8vIGlmIHRoZSBjb250ZW50aW9uIGlzIGluc2lkZSBhc3NlcnQgc3RhdGVtZW50LCB3ZSB3YW50IHRvIGF2b2lkIG51bGwgd2FybmluZ3Mgb25seSBpbiBjYXNlIG9mCisJCQkvLyBjb21wYXJpc29ucyBhbmQgbm90IGluIGNhc2Ugb2YgYXNzaWdubWVudCBhbmQgaW5zdGFuY2VvZgorCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBGbG93Q29udGV4dC5ISURFX05VTExfQ09NUEFSSVNPTl9XQVJOSU5HKSA9PSAwIAorCQkJCQl8fCAoY2hlY2tUeXBlICYgQ09OVEVYVF9NQVNLKSA9PSBGbG93Q29udGV4dC5JTl9BU1NJR05NRU5UCisJCQkJCXx8IChjaGVja1R5cGUgJiBDT05URVhUX01BU0spID09IEZsb3dDb250ZXh0LklOX0lOU1RBTkNFT0YpIHsKKwkJCQlyZWNvcmROdWxsUmVmZXJlbmNlKGxvY2FsLCByZWZlcmVuY2UsIGNoZWNrVHlwZSk7CisJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgTUFZX05VTEwgOgogCQkJaWYgKGZsb3dJbmZvLmlzRGVmaW5pdGVseU5vbk51bGwobG9jYWwpKSB7CkBAIC00NTUsMTQgKzYyOSw0MSBAQAogCQkJLy8gbmV2ZXIgaGFwcGVucwogCX0KIH0KLQkKKwogCXZvaWQgcmVtb3ZlRmluYWxBc3NpZ25tZW50SWZBbnkoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFzc2lnbkNvdW50OyBpKyspIHsKLQkJCWlmIChmaW5hbEFzc2lnbm1lbnRzW2ldID09IHJlZmVyZW5jZSkgewotCQkJCWZpbmFsQXNzaWdubWVudHNbaV0gPSBudWxsOwotCQkJCWZpbmFsVmFyaWFibGVzW2ldID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFzc2lnbkNvdW50OyBpKyspIHsKKwkJCWlmICh0aGlzLmZpbmFsQXNzaWdubWVudHNbaV0gPT0gcmVmZXJlbmNlKSB7CisJCQkJdGhpcy5maW5hbEFzc2lnbm1lbnRzW2ldID0gbnVsbDsKKwkJCQl0aGlzLmZpbmFsVmFyaWFibGVzW2ldID0gbnVsbDsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAl9CisKKwkvKiBTaW11bGF0ZSBhIHRocm93IG9mIGFuIGV4Y2VwdGlvbiBmcm9tIGluc2lkZSBhIGxvb3AgaW4gaXRzIHNlY29uZCBvciBzdWJzZXF1ZW50IGl0ZXJhdGlvbi4KKwkgICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTkyNgorCSAqLworCXB1YmxpYyB2b2lkIHNpbXVsYXRlVGhyb3dBZnRlckxvb3BCYWNrKEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCWlmICh0aGlzLmVzY2FwaW5nRXhjZXB0aW9uQ2F0Y2hTaXRlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgZXhjZXB0aW9uQ291bnQgPSB0aGlzLmVzY2FwaW5nRXhjZXB0aW9uQ2F0Y2hTaXRlcy5zaXplKCk7IGkgPCBleGNlcHRpb25Db3VudDsgaSsrKSB7CisJCQkJKChFc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZSkgdGhpcy5lc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZXMuZ2V0KGkpKS5zaW11bGF0ZVRocm93QWZ0ZXJMb29wQmFjayhmbG93SW5mbyk7CisJCQl9CisJCQl0aGlzLmVzY2FwaW5nRXhjZXB0aW9uQ2F0Y2hTaXRlcyA9IG51bGw7IC8vIGRvbid0IGNhcmUgZm9yIGl0IGFueW1vcmUuCisJCX0KKwl9CisKKwkvKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBzb21lIGV4Y2VwdGlvbiB0aHJvd24gYnkgY29kZSB3aXRoaW4gdGhpcyBsb29wCisJICAgaXMgY2F1Z2h0IGJ5IGFuIG91dGVyIGNhdGNoIGJsb2NrLiBUaGlzIGlzIHVzZWQgdG8gcHJvcGFnYXRlIGRhdGEgZmxvdworCSAgIGFsb25nIHRoZSBlZGdlIGJhY2sgdG8gdGhlIG5leHQgaXRlcmF0aW9uLiBTZWUgc2ltdWxhdGVUaHJvd0FmdGVyTG9vcEJhY2sKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWNvcmRDYXRjaENvbnRleHRPZkVzY2FwaW5nRXhjZXB0aW9uKEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgY2F0Y2hpbmdDb250ZXh0LAlSZWZlcmVuY2VCaW5kaW5nIGNhdWdodEV4Y2VwdGlvbikgeworCQlpZiAodGhpcy5lc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZXMgPT0gbnVsbCkgeworCQkJdGhpcy5lc2NhcGluZ0V4Y2VwdGlvbkNhdGNoU2l0ZXMgPSBuZXcgQXJyYXlMaXN0KDUpOworCQl9CisJCXRoaXMuZXNjYXBpbmdFeGNlcHRpb25DYXRjaFNpdGVzLmFkZChuZXcgRXNjYXBpbmdFeGNlcHRpb25DYXRjaFNpdGUoY2F0Y2hpbmdDb250ZXh0LCBjYXVnaHRFeGNlcHRpb24pKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNFc2NhcGluZ0V4Y2VwdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLmVzY2FwaW5nRXhjZXB0aW9uQ2F0Y2hTaXRlcyAhPSBudWxsOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L051bGxJbmZvUmVnaXN0cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L051bGxJbmZvUmVnaXN0cnkuamF2YQppbmRleCBjNmJhZWJmLi4xNDcwNzk1IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9OdWxsSW5mb1JlZ2lzdHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTnVsbEluZm9SZWdpc3RyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMyMDE3MCAgIAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCkBAIC0xOSw3ICsyMCw3IEBACiAgKiBvY2N1cnMgd2l0aGluIHN1Y2ggYSBibG9jayBtaXRpZ2F0ZXMgd2hhdGV2ZXIgd2Uga25vdyBhYm91dCB0aGUgcHJldmlvdXMKICAqIG51bGwgc3RhdHVzIG9mIGludm9sdmVkIHZhcmlhYmxlcy4gTnVsbEluZm9SZWdpc3RyeSBoYW5kbGVzIHRoYXQKICAqIGJ5IG5lZ2F0aW5nIHVwc3RyZWFtIGRlZmluaXRlIGluZm9ybWF0aW9uIHRoYXQgY2xhc2hlcyB3aXRoIHdoYXQgYSBnaXZlbgotICogc3RhdGVtZW50IGNvbnRlbmRzIGFib3V0IHRoZSBzYW1lIHZhcmlhYmxlLiBJdCBhbHNvIGltcGxlbWVudHMgCisgKiBzdGF0ZW1lbnQgY29udGVuZHMgYWJvdXQgdGhlIHNhbWUgdmFyaWFibGUuIEl0IGFsc28gaW1wbGVtZW50cwogICoge0BsaW5rICNtaXRpZ2F0ZU51bGxJbmZvT2YoRmxvd0luZm8pIG1pdGlnYXRlTnVsbEluZm99IHNvIGFzIHRvIGVsYWJvcmF0ZSB0aGUKICAqIGZsb3cgaW5mbyBwcmVzZW50ZWQgaW4gaW5wdXQgb2YgZmluYWxseSBibG9ja3MuCiAgKi8KQEAgLTkwLDE2ICs5MSwxNiBAQAogCQlpZiAodGhpcy5leHRyYSA9PSBudWxsKSB7CiAJCQl0aGlzLmV4dHJhID0gbmV3IGxvbmdbZXh0cmFMZW5ndGhdW107CiAJCQlmb3IgKGludCBpID0gMiwgbGVuZ3RoID0gb3RoZXIuZXh0cmFbMl0ubGVuZ3RoOyBpIDwgZXh0cmFMZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXIuZXh0cmFbaV0sIDAsIAorCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXIuZXh0cmFbaV0sIDAsCiAJCQkJCSh0aGlzLmV4dHJhW2ldID0gbmV3IGxvbmdbbGVuZ3RoXSksIDAsIGxlbmd0aCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpbnQgbGVuZ3RoID0gdGhpcy5leHRyYVsyXS5sZW5ndGgsIG90aGVyTGVuZ3RoID0gb3RoZXIuZXh0cmFbMl0ubGVuZ3RoOwogCQkJaWYgKG90aGVyTGVuZ3RoID4gbGVuZ3RoKSB7CiAJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBleHRyYUxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtpXSwgMCwgCisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtpXSwgMCwKIAkJCQkJCSh0aGlzLmV4dHJhW2ldID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShvdGhlci5leHRyYVtpXSwgbGVuZ3RoLCAKKwkJCQkJU3lzdGVtLmFycmF5Y29weShvdGhlci5leHRyYVtpXSwgbGVuZ3RoLAogCQkJCQkJdGhpcy5leHRyYVtpXSwgbGVuZ3RoLCBvdGhlckxlbmd0aCAtIGxlbmd0aCk7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChvdGhlckxlbmd0aCA8IGxlbmd0aCkgewpAQCAtMTI0LDEwICsxMjUsMTIgQEAKICAgICAJaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgeyAvLyB1c2UgYml0cwogICAgIAkJLy8gc2V0IHByb3RlY3RlZCBub24gbnVsbAogICAgIAkJdGhpcy5udWxsQml0MSB8PSAoMUwgPDwgcG9zaXRpb24pOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMjkwKSB7Ci0gICAgCQkgIAl0aGlzLm51bGxCaXQxID0gMDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMjkwKSB7CisJICAgIAkJICAJdGhpcy5udWxsQml0MSA9IDA7CisgICAgCQkJfQogICAgIAkJfQotICAgIAl9IAorICAgIAl9CiAgICAgCWVsc2UgewogICAgIAkJLy8gdXNlIGV4dHJhIHZlY3RvcgogCQkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CkBAIC0xMzcsMjAgKzE0MCwyMiBAQAogCQkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewogCQkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAkJCQl9Ci0JCQl9IAorCQkJfQogCQkJZWxzZSB7CiAJCQkJaW50IG9sZExlbmd0aDsgLy8gbWlnaHQgbmVlZCB0byBncm93IHRoZSBhcnJheXMKIAkJCQlpZiAodmVjdG9ySW5kZXggPj0gKG9sZExlbmd0aCA9IHRoaXMuZXh0cmFbMl0ubGVuZ3RoKSkgewogCQkJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwgCi0JCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwgCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsCisJCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwKIAkJCQkJCQlvbGRMZW5ndGgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogICAgIAkJdGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleF0gfD0gKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzAwKSB7Ci0gICAgCQkgIAl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworICAgIAkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworICAgIAkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAzMDApIHsKKwkJICAgCQkgIAl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworICAgIAkJCX0KICAgICAJCX0KICAgICAJfQogCX0KQEAgLTE2NSwxMCArMTcwLDEyIEBACiAgICAgCWlmICgocG9zaXRpb24gPSBsb2NhbC5pZCArIHRoaXMubWF4RmllbGRDb3VudCkgPCBCaXRDYWNoZVNpemUpIHsgLy8gdXNlIGJpdHMKICAgICAJCS8vIHNldCBhc3NpZ25lZCBub24gbnVsbAogICAgIAkJdGhpcy5udWxsQml0MyB8PSAoMUwgPDwgcG9zaXRpb24pOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMjkwKSB7Ci0gICAgCQkgIAl0aGlzLm51bGxCaXQxID0gMDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMjkwKSB7CisJICAgIAkJICAJdGhpcy5udWxsQml0MSA9IDA7CisgICAgCQkJfQogICAgIAkJfQotICAgIAl9IAorICAgIAl9CiAgICAgCWVsc2UgewogICAgIAkJLy8gdXNlIGV4dHJhIHZlY3RvcgogCQkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CkBAIC0xNzgsMjAgKzE4NSwyMiBAQAogCQkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewogCQkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAkJCQl9Ci0JCQl9IAorCQkJfQogCQkJZWxzZSB7CiAJCQkJaW50IG9sZExlbmd0aDsgLy8gbWlnaHQgbmVlZCB0byBncm93IHRoZSBhcnJheXMKIAkJCQlpZiAodmVjdG9ySW5kZXggPj0gKG9sZExlbmd0aCA9IHRoaXMuZXh0cmFbMl0ubGVuZ3RoKSkgewogCQkJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwgCi0JCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwgCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsCisJCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwKIAkJCQkJCQlvbGRMZW5ndGgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogICAgIAkJdGhpcy5leHRyYVs0XVt2ZWN0b3JJbmRleF0gfD0gKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzAwKSB7Ci0gICAgCQkgIAl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworICAgIAkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworICAgIAkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAzMDApIHsKKwkgICAgCQkgIAl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworICAgIAkJCX0KICAgICAJCX0KICAgICAJfQogCX0KQEAgLTIwNywxMCArMjE2LDEyIEBACiAgICAgCWlmICgocG9zaXRpb24gPSBsb2NhbC5pZCArIHRoaXMubWF4RmllbGRDb3VudCkgPCBCaXRDYWNoZVNpemUpIHsgLy8gdXNlIGJpdHMKICAgICAJCS8vIHNldCBhc3NpZ25lZCBudWxsCiAgICAgCQl0aGlzLm51bGxCaXQyIHw9ICgxTCA8PCBwb3NpdGlvbik7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyOTApIHsKLSAgICAJCSAgCXRoaXMubnVsbEJpdDEgPSAwOworICAgIAkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworICAgIAkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAyOTApIHsKKwkgICAgCQkgIAl0aGlzLm51bGxCaXQxID0gMDsKKyAgICAJCQl9CiAgICAgCQl9Ci0gICAgCX0gCisgICAgCX0KICAgICAJZWxzZSB7CiAgICAgCQkvLyB1c2UgZXh0cmEgdmVjdG9yCiAJCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKQEAgLTIyMCwyMCArMjMxLDIyIEBACiAJCQkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CiAJCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tsZW5ndGhdOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCQllbHNlIHsKIAkJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cwogCQkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVsyXS5sZW5ndGgpKSB7CiAJCQkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLCAKLQkJCQkJCQkodGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLCAKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwKKwkJCQkJCQkodGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLAogCQkJCQkJCW9sZExlbmd0aCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAgICAgCQl0aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSB8PSAoMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAzMDApIHsKLSAgICAJCSAgCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisgICAgCQkJaWYgKENvdmVyYWdlVGVzdElkID09IDMwMCkgeworCSAgICAJCSAgCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisgICAgCQkJfQogICAgIAkJfQogICAgIAl9CiAJfQpAQCAtMjQ4LDEwICsyNjEsMTIgQEAKICAgICAJaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgeyAvLyB1c2UgYml0cwogICAgIAkJLy8gc2V0IGFzc2lnbmVkIHVua25vd24KICAgICAJCXRoaXMubnVsbEJpdDQgfD0gKDFMIDw8IHBvc2l0aW9uKTsKLSAgICAJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDI5MCkgewotICAgIAkJICAJdGhpcy5udWxsQml0MSA9IDA7CisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisgICAgCQkJaWYgKENvdmVyYWdlVGVzdElkID09IDI5MCkgeworCSAgICAJCSAgCXRoaXMubnVsbEJpdDEgPSAwOworICAgIAkJCX0KICAgICAJCX0KLSAgICAJfSAKKyAgICAJfQogICAgIAllbHNlIHsKICAgICAJCS8vIHVzZSBleHRyYSB2ZWN0b3IKIAkJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOwpAQCAtMjYxLDI3ICsyNzYsMjkgQEAKIAkJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKIAkJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aF07CiAJCQkJfQotCQkJfSAKKwkJCX0KIAkJCWVsc2UgewogCQkJCWludCBvbGRMZW5ndGg7IC8vIG1pZ2h0IG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXlzCiAJCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSB0aGlzLmV4dHJhWzJdLmxlbmd0aCkpIHsKIAkJCQkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAotCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsIAorCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCiAJCQkJCQkJb2xkTGVuZ3RoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KICAgICAJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdIHw9ICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKTsKLSAgICAJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDMwMCkgewotICAgIAkJICAJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSB+MDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMzAwKSB7CisJICAgIAkJICAJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSB+MDsKKyAgICAJCQl9CiAgICAgCQl9CiAgICAgCX0KIAl9CiB9CiAKIC8qKgotICogTWl0aWdhdGUgdGhlIGRlZmluaXRlIGFuZCBwcm90ZWN0ZWQgaW5mbyBvZiBmbG93SW5mbywgZGVwZW5kaW5nIG9uIHdoYXQgCisgKiBNaXRpZ2F0ZSB0aGUgZGVmaW5pdGUgYW5kIHByb3RlY3RlZCBpbmZvIG9mIGZsb3dJbmZvLCBkZXBlbmRpbmcgb24gd2hhdAogICogdGhpcyBudWxsIGluZm8gcmVnaXN0cnkga25vd3MgYWJvdXQgcG90ZW50aWFsIGFzc2lnbm1lbnRzIGFuZCBtZXNzYWdlcwogICogc2VuZHMgaW52b2x2aW5nIGxvY2Fscy4gTWF5IHJldHVybiBmbG93SW5mbyB1bmNoYW5nZWQsIG9yIGEgbW9kaWZpZWQsCiAgKiBmcmVzaCBjb3B5IG9mIGZsb3dJbmZvLgpAQCAtMjk4LDEyICszMTUsMTIgQEAKIAlib29sZWFuIG5ld0NvcHkgPSBmYWxzZTsKIAlVbmNvbmRpdGlvbmFsRmxvd0luZm8gc291cmNlID0gZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCk7CiAJLy8gY2xlYXIgaW5jb21wYXRpYmxlIHByb3RlY3Rpb25zCi0JbTEgPSAoczEgPSBzb3VyY2UubnVsbEJpdDEpICYgKHMzID0gc291cmNlLm51bGxCaXQzKSAKKwltMSA9IChzMSA9IHNvdXJjZS5udWxsQml0MSkgJiAoczMgPSBzb3VyY2UubnVsbEJpdDMpCiAJCQkJJiAoczQgPSBzb3VyY2UubnVsbEJpdDQpCiAJCQkvLyBwcm90LiBub24gbnVsbAogCQkmICgoYTIgPSB0aGlzLm51bGxCaXQyKSB8IChhNCA9IHRoaXMubnVsbEJpdDQpKTsKIAkJCS8vIG51bGwgb3IgdW5rbm93bgotCW0yID0gczEgJiAoczIgPSB0aGlzLm51bGxCaXQyKSAmIChzMyBeIHM0KQorCW0yID0gczEgJiAoczIgPSB0aGlzLm51bGxCaXQyKSAmIChzMyBeIHM0KSAvLyBUT0RPKHN0ZXBoYW4pOiBwb3RlbnRpYWwgdHlwbzogc2hvdWxkIHRoaXMgYmUgInMyID0gc291cmNlLm51bGxCaXQyIj8/PwogCQkJLy8gcHJvdC4gbnVsbAogCQkmICgoYTMgPSB0aGlzLm51bGxCaXQzKSB8IGE0KTsKIAkJCS8vIG5vbiBudWxsIG9yIHVua25vd24KQEAgLTMxMiw3ICszMjksNyBAQAogCS8vIFRPRE8gKG1heGltZSkgY29kZSBleHRlbnNpdmUgaW1wbGVtZW50YXRpb24gdGVzdHMKIAltMyA9IHMxCSYgKHMyICYgKG5zMyA9IH5zMykgJiAobnM0ID0gfnM0KSAmIChhMyB8IGE0KQogCQkJCXwgKG5zMiA9IH5zMikgJiBzMyAmIG5zNCAmIChhMiB8IGE0KQotCQkJCXwgbnMyICYgbnMzICYgczQgJiAoYTIgfCBhMykpOyAKKwkJCQl8IG5zMiAmIG5zMyAmIHM0ICYgKGEyIHwgYTMpKTsKIAlpZiAoKG0gPSAobTEgfCBtMiB8IG0zKSkgIT0gMCkgewogCQluZXdDb3B5ID0gdHJ1ZTsKIAkJc291cmNlID0gc291cmNlLnVuY29uZGl0aW9uYWxDb3B5KCk7CkBAIC0zMjAsNiArMzM3LDE4IEBACiAJCXNvdXJjZS5udWxsQml0MiAmPSAobm0xID0gfm0xKSAmICgobm0yID0gfm0yKSB8IGE0KTsKIAkJc291cmNlLm51bGxCaXQzICY9IChubTEgfCBhMikgJiBubTI7CiAJCXNvdXJjZS5udWxsQml0NCAmPSBubTEgJiBubTI7CisJCS8vIGFueSB2YXJpYWJsZSB0aGF0IGlzIChwb3QgbiwgcG90IG5uLCBwb3QgdW4pIGF0IGVuZCBvZiB0cnkgKGFzIGNhcHR1cmVkIGJ5ICp0aGlzKiBOdWxsSW5mb1JlZ2lzdHJ5KQorCQkvLyBoYXMgdGhlIHNhbWUgdW5jZXJ0YWludHkgYWxzbyBmb3IgdGhlIG1pdGlnYXRlZCBjYXNlIChmdW5jdGlvbiByZXN1bHQpCisJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwMTcwIC0gIFtjb21waWxlcl0gW251bGxdIFdoaXRlYm94IGlzc3VlcyBpbiBudWxsIGFuYWx5c2lzCisJCS8vIGFuZCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uLk51bGxSZWZlcmVuY2VUZXN0LnRlc3QwNTM2X3RyeV9maW5hbGx5KCkKKwkJbG9uZyB4ID0gfnRoaXMubnVsbEJpdDEgJiBhMiAmIGEzICYgYTQ7IC8vIHggaXMgc2V0IGZvciBhbGwgdmFyaWFibGUgaWRzIHRoYXQgaGF2ZSBzdGF0ZSAwMTExIChwb3QgbiwgcG90IG5uLCBwb3QgdW4pCisJCWlmICh4ICE9IDApIHsKKwkJCS8vIHJlc3RvcmUgc3RhdGUgMDExMSBmb3IgYWxsIHZhcmlhYmxlIGlkcyBpbiB4OgorCQkJc291cmNlLm51bGxCaXQxICY9IH54OworCQkJc291cmNlLm51bGxCaXQyIHw9IHg7CisJCQlzb3VyY2UubnVsbEJpdDMgfD0geDsKKwkJCXNvdXJjZS5udWxsQml0NCB8PSB4OworCQl9CiAJfQogCWlmICh0aGlzLmV4dHJhICE9IG51bGwgJiYgc291cmNlLmV4dHJhICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMuZXh0cmFbMl0ubGVuZ3RoLCBzb3VyY2VMZW5ndGggPSBzb3VyY2UuZXh0cmFbMF0ubGVuZ3RoOwpAQCAtMzI3LDE0ICszNTYsMTQgQEAKIAkJCWxlbmd0aCA9IHNvdXJjZUxlbmd0aDsKIAkJfQogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAltMSA9IChzMSA9IHNvdXJjZS5leHRyYVsxICsgMV1baV0pICYgKHMzID0gc291cmNlLmV4dHJhWzMgKyAxXVtpXSkgCisgICAgICAgIAltMSA9IChzMSA9IHNvdXJjZS5leHRyYVsxICsgMV1baV0pICYgKHMzID0gc291cmNlLmV4dHJhWzMgKyAxXVtpXSkKICAgICAgICAgCQkJCSYgKHM0ID0gc291cmNlLmV4dHJhWzQgKyAxXVtpXSkKICAgICAgICAgCQkmICgoYTIgPSB0aGlzLmV4dHJhWzIgKyAxXVtpXSkgfCAoYTQgPSB0aGlzLmV4dHJhWzQgKyAxXVtpXSkpOwogICAgICAgICAJbTIgPSBzMSAmIChzMiA9IHRoaXMuZXh0cmFbMiArIDFdW2ldKSAmIChzMyBeIHM0KQogICAgICAgICAJCSYgKChhMyA9IHRoaXMuZXh0cmFbMyArIDFdW2ldKSB8IGE0KTsKICAgICAgICAgCW0zID0gczEJJiAoczIgJiAobnMzID0gfnMzKSAmIChuczQgPSB+czQpICYgKGEzIHwgYTQpCiAgICAgICAgIAkJCQl8IChuczIgPSB+czIpICYgczMgJiBuczQgJiAoYTIgfCBhNCkKLSAgICAgICAgCQkJCXwgbnMyICYgbnMzICYgczQgJiAoYTIgfCBhMykpOyAKKyAgICAgICAgCQkJCXwgbnMyICYgbnMzICYgczQgJiAoYTIgfCBhMykpOwogICAgICAgICAJaWYgKChtID0gKG0xIHwgbTIgfCBtMykpICE9IDApIHsKICAgICAgICAgCSAgCWlmICghIG5ld0NvcHkpIHsKICAgICAgICAgICAgIAkJbmV3Q29weSA9IHRydWU7CkBAIC0zNjAsOCArMzg5LDggQEAKIAkJU3RyaW5nIG51bGxTID0gIk51bGxJbmZvUmVnaXN0cnk8WyIgKyB0aGlzLm51bGxCaXQxIC8vJE5PTi1OTFMtMSQKIAkJCSsgdGhpcy5udWxsQml0MiArIHRoaXMubnVsbEJpdDMgKyB0aGlzLm51bGxCaXQ0OwogCQkJaW50IGksIGNlaWw7Ci0JCQlmb3IgKGkgPSAwLCBjZWlsID0gdGhpcy5leHRyYVswXS5sZW5ndGggPiAzID8gCi0JCQkJCQkJCTMgOiAKKwkJCWZvciAoaSA9IDAsIGNlaWwgPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCA+IDMgPworCQkJCQkJCQkzIDoKIAkJCQkJCQkJdGhpcy5leHRyYVswXS5sZW5ndGg7CiAJCQkJaSA8IGNlaWw7IGkrKykgewogCQkJCW51bGxTICs9ICIsIiArIHRoaXMuZXh0cmFbMl1baV0gLy8kTk9OLU5MUy0xJApAQCAtMzczLDUgKzQwMiwxNDggQEAKIAkJCXJldHVybiBudWxsUyArICJdPiI7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CisKKy8qKgorICogTWFyayBhIGxvY2FsIGFzIHBvdGVudGlhbGx5IGhhdmluZyBiZWVuIGFzc2lnbmVkIHRvIGFuIHVua25vd24gdmFsdWUuCisgKiBAcGFyYW0gbG9jYWwgdGhlIGxvY2FsIHRvIG1hcmsKKyAqLworcHVibGljIHZvaWQgbWFya1BvdGVudGlhbGx5VW5rbm93bkJpdChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCS8vIHByb3RlY3RlZCBmcm9tIG5vbi1vYmplY3QgbG9jYWxzIGluIGNhbGxpbmcgbWV0aG9kcworCWlmICh0aGlzICE9IERFQURfRU5EKSB7CisJCXRoaXMudGFnQml0cyB8PSBOVUxMX0ZMQUdfTUFTSzsKKyAgICAgICAgaW50IHBvc2l0aW9uOworICAgICAgICBsb25nIG1hc2s7CisgICAgICAgIGlmICgocG9zaXRpb24gPSBsb2NhbC5pZCArIHRoaXMubWF4RmllbGRDb3VudCkgPCBCaXRDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIC8vIHVzZSBiaXRzCisgICAgICAgIAltYXNrID0gMUwgPDwgcG9zaXRpb247CisgICAgICAgIAlpc1RydWUoKHRoaXMubnVsbEJpdDEgJiBtYXNrKSA9PSAwLCAiQWRkaW5nICd1bmtub3duJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhpcy5udWxsQml0NCB8PSBtYXNrOworICAgICAgICAgICAgaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDQ2KSB7CisJCQkJICAJdGhpcy5udWxsQml0NCA9IH4wOworCQkJCX0KKwkJCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKyAgICAJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworICAgIAkJaWYgKHRoaXMuZXh0cmEgPT0gbnVsbCkgeworICAgIAkJCWludCBsZW5ndGggPSB2ZWN0b3JJbmRleCArIDE7CisgICAgCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOworICAgIAkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKKyAgICAJCQl9CisgICAgCQl9IGVsc2UgeworICAgIAkJCWludCBvbGRMZW5ndGg7IC8vIG1pZ2h0IG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXlzCisgICAgCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSB0aGlzLmV4dHJhWzJdLmxlbmd0aCkpIHsKKyAgICAJCQkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CisgICAgCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsCisgICAgCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwKKyAgICAJCQkJCQlvbGRMZW5ndGgpOworICAgIAkJCQl9CisgICAgCQkJfQorICAgIAkJfQorICAgIAkJbWFzayA9IDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSk7CisgICAgCQlpc1RydWUoKHRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXhdICYgbWFzaykgPT0gMCwgIkFkZGluZyAndW5rbm93bicgbWFyayBpbiB1bmV4cGVjdGVkIHN0YXRlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdIHw9IG1hc2s7CisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gNDcpIHsKKwkJCQkJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSB+MDsKKwkJCQl9CisJCQl9CisgICAgCX0KKwl9Cit9CisKK3B1YmxpYyB2b2lkIG1hcmtQb3RlbnRpYWxseU51bGxCaXQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlpZiAodGhpcyAhPSBERUFEX0VORCkgeworCQl0aGlzLnRhZ0JpdHMgfD0gTlVMTF9GTEFHX01BU0s7CisgICAgICAgIGludCBwb3NpdGlvbjsKKyAgICAgICAgbG9uZyBtYXNrOworICAgICAgICBpZiAoKHBvc2l0aW9uID0gbG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQpIDwgQml0Q2FjaGVTaXplKSB7CisgICAgICAgICAgICAvLyB1c2UgYml0cworICAgICAgICAJbWFzayA9IDFMIDw8IHBvc2l0aW9uOworICAgICAgICAJaXNUcnVlKCh0aGlzLm51bGxCaXQxICYgbWFzaykgPT0gMCwgIkFkZGluZyAncG90ZW50aWFsbHkgbnVsbCcgbWFyayBpbiB1bmV4cGVjdGVkIHN0YXRlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRoaXMubnVsbEJpdDIgfD0gbWFzazsKKyAgICAgICAgICAgIGlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSA0MCkgeworCQkJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKwkJCQl9CisJCQl9CisgICAgICAgIH0gZWxzZSB7CisgICAgCQkvLyB1c2UgZXh0cmEgdmVjdG9yCisgICAgCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKKyAgICAJCWlmICh0aGlzLmV4dHJhID09IG51bGwpIHsKKyAgICAJCQlpbnQgbGVuZ3RoID0gdmVjdG9ySW5kZXggKyAxOworICAgIAkJCXRoaXMuZXh0cmEgPSBuZXcgbG9uZ1tleHRyYUxlbmd0aF1bXTsKKyAgICAJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKKyAgICAJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aF07CisgICAgCQkJfQorICAgIAkJfSBlbHNlIHsKKyAgICAJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworICAgIAkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVsyXS5sZW5ndGgpKSB7CisgICAgCQkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorICAgIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisgICAgCQkJCQkJb2xkTGVuZ3RoKTsKKyAgICAJCQkJfQorICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCW1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpOworICAgIAkJdGhpcy5leHRyYVszXVt2ZWN0b3JJbmRleF0gfD0gbWFzazsKKyAgICAJCWlzVHJ1ZSgodGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleF0gJiBtYXNrKSA9PSAwLCAiQWRkaW5nICdwb3RlbnRpYWxseSBudWxsJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgIAkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDQxKSB7CisJCQkJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisJCQkJfQorCQkJfQorICAgIAl9CisJfQorfQorCitwdWJsaWMgdm9pZCBtYXJrUG90ZW50aWFsbHlOb25OdWxsQml0KExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJaWYgKHRoaXMgIT0gREVBRF9FTkQpIHsKKwkJdGhpcy50YWdCaXRzIHw9IE5VTExfRkxBR19NQVNLOworICAgICAgICBpbnQgcG9zaXRpb247CisgICAgICAgIGxvbmcgbWFzazsKKyAgICAgICAgaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgeworICAgICAgICAgICAgLy8gdXNlIGJpdHMKKyAgICAgICAgCW1hc2sgPSAxTCA8PCBwb3NpdGlvbjsKKyAgICAgICAgCWlzVHJ1ZSgodGhpcy5udWxsQml0MSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3BvdGVudGlhbGx5IG5vbi1udWxsJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhpcy5udWxsQml0MyB8PSBtYXNrOworICAgICAgICAgICAgaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDQyKSB7CisJCQkJICAJdGhpcy5udWxsQml0NCA9IH4wOworCQkJCX0KKwkJCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKyAgICAJCWludCB2ZWN0b3JJbmRleCAgPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKKyAgICAJCWlmICh0aGlzLmV4dHJhID09IG51bGwpIHsKKyAgICAJCQlpbnQgbGVuZ3RoID0gdmVjdG9ySW5kZXggKyAxOworICAgIAkJCXRoaXMuZXh0cmEgPSBuZXcgbG9uZ1tleHRyYUxlbmd0aF1bXTsKKyAgICAJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKKyAgICAJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aF07CisgICAgCQkJfQorICAgIAkJfSBlbHNlIHsKKyAgICAJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworICAgIAkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVsyXS5sZW5ndGgpKSB7CisgICAgCQkJCWZvciAoaW50IGogPSAyOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorICAgIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisgICAgCQkJCQkJb2xkTGVuZ3RoKTsKKyAgICAJCQkJfQorICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCW1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpOworICAgIAkJaXNUcnVlKCh0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3BvdGVudGlhbGx5IG5vbi1udWxsJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgIAkJdGhpcy5leHRyYVs0XVt2ZWN0b3JJbmRleF0gfD0gbWFzazsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSA0MykgeworCQkJCQl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworCQkJCX0KKwkJCX0KKyAgICAJfQorCX0KK30KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvU3dpdGNoRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEKaW5kZXggMWViMDA5My4uYzE3ZmE0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvU3dpdGNoRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Td2l0Y2hGbG93Q29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDIyICsxOCwyMiBAQAogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBTd2l0Y2hGbG93Q29udGV4dCBleHRlbmRzIEZsb3dDb250ZXh0IHsKLQkKKwogCXB1YmxpYyBCcmFuY2hMYWJlbCBicmVha0xhYmVsOwogCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkJyZWFrID0gRmxvd0luZm8uREVBRF9FTkQ7Ci0JCisKIHB1YmxpYyBTd2l0Y2hGbG93Q29udGV4dChGbG93Q29udGV4dCBwYXJlbnQsIEFTVE5vZGUgYXNzb2NpYXRlZE5vZGUsIEJyYW5jaExhYmVsIGJyZWFrTGFiZWwpIHsKIAlzdXBlcihwYXJlbnQsIGFzc29jaWF0ZWROb2RlKTsKIAl0aGlzLmJyZWFrTGFiZWwgPSBicmVha0xhYmVsOwogfQogCiBwdWJsaWMgQnJhbmNoTGFiZWwgYnJlYWtMYWJlbCgpIHsKLQlyZXR1cm4gYnJlYWtMYWJlbDsKKwlyZXR1cm4gdGhpcy5icmVha0xhYmVsOwogfQogCiBwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiU3dpdGNoIGZsb3cgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZCgiW2luaXRzT25CcmVhayAtIikuYXBwZW5kKGluaXRzT25CcmVhay50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIltpbml0c09uQnJlYWsgLSIpLmFwcGVuZCh0aGlzLmluaXRzT25CcmVhay50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KIApAQCAtNDIsMTEgKzQyLDExIEBACiB9CiAKIHB1YmxpYyB2b2lkIHJlY29yZEJyZWFrRnJvbShGbG93SW5mbyBmbG93SW5mbykgewotCWlmICgoaW5pdHNPbkJyZWFrLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgPT0gMCkgewotCQlpbml0c09uQnJlYWsgPSBpbml0c09uQnJlYWsubWVyZ2VkV2l0aChmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JfSAKKwlpZiAoKHRoaXMuaW5pdHNPbkJyZWFrLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSA9PSAwKSB7CisJCXRoaXMuaW5pdHNPbkJyZWFrID0gdGhpcy5pbml0c09uQnJlYWsubWVyZ2VkV2l0aChmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJfQogCWVsc2UgewotCQlpbml0c09uQnJlYWsgPSBmbG93SW5mby51bmNvbmRpdGlvbmFsQ29weSgpOworCQl0aGlzLmluaXRzT25CcmVhayA9IGZsb3dJbmZvLnVuY29uZGl0aW9uYWxDb3B5KCk7CiAJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvVW5jb25kaXRpb25hbEZsb3dJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YQppbmRleCA3ZDdiMGExLi5lMDQ5MmE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsMTIgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9ucyBmb3IKKyAqICAgICAJCQkJCQlidWcgMzI1NzU1IC0gW2NvbXBpbGVyXSB3cm9uZyBpbml0aWFsaXphdGlvbiBzdGF0ZSBhZnRlciBjb25kaXRpb25hbCBleHByZXNzaW9uCisgKiAgICAgCQkJCQkJYnVnIDMyMDE3MCAtIFtjb21waWxlcl0gW251bGxdIFdoaXRlYm94IGlzc3VlcyBpbiBudWxsIGFuYWx5c2lzCisgKiAgICAgCQkJCQkJYnVnIDI5MjQ3OCAtIFJlcG9ydCBwb3RlbnRpYWxseSBudWxsIGFjcm9zcyB2YXJpYWJsZSBhc3NpZ25tZW50CisgKiAgICAgCQkJCQkJYnVnIDMzMjYzNyAtIERlYWQgQ29kZSBkZXRlY3Rpb24gcmVtb3ZpbmcgY29kZSB0aGF0IGlzbid0IGRlYWQKKyAqICAgICAJCQkJCQlidWcgMzQxNDk5IC0gW2NvbXBpbGVyXVtudWxsXSBhbGxvY2F0ZSBleHRyYSBiaXRzIGluIGFsbCBtZXRob2RzIG9mIFVuY29uZGl0aW9uYWxGbG93SW5mbwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCkBAIC0yMywzMiArMjksMzAgQEAKICAqIE5vIGNhY2hpbmcgb2YgcHJlLWFsbG9jYXRlZCBpbnN0YW5jZXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gZXh0ZW5kcyBGbG93SW5mbyB7Ci0JLy8gQ292ZXJhZ2UgdGVzdHMKIAkvKioKLQkgKiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gdW5leHBlY3RlZCBiZWhhdmlvciBpcyBkZXRlY3RlZCBkdXJpbmcgY292ZXJhZ2UKLQkgKiB0ZXN0cy4gCisJICogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHVuZXhwZWN0ZWQgYmVoYXZpb3IgaXMgZGV0ZWN0ZWQuCiAJICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTgyNzM1Mjg0MTAzMDA4OTcwM0w7Ci0JCQorCiAJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAJfQotCQorCiAJLy8gQ292ZXJhZ2UgdGVzdHMgbmVlZCB0aGF0IHRoZSBjb2RlIGJlIGluc3RydW1lbnRlZC4gVGhlIGZvbGxvd2luZyBmbGFnCiAJLy8gY29udHJvbHMgd2hldGhlciB0aGUgaW5zdHJ1bWVudGVkIGNvZGUgaXMgY29tcGlsZWQgaW4gb3Igbm90LCBhbmQgd2hldGhlcgogCS8vIHRoZSBjb3ZlcmFnZSB0ZXN0cyBtZXRob2RzIHJ1biBvciBub3QuCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGNvdmVyYWdlVGVzdEZsYWcgPSBmYWxzZTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gQ09WRVJBR0VfVEVTVF9GTEFHID0gZmFsc2U7CiAJLy8gbmV2ZXIgcmVsZWFzZSB3aXRoIHRoZSBjb3ZlcmFnZVRlc3RGbGFnIHNldCB0byB0cnVlCi0JcHVibGljIHN0YXRpYyBpbnQgY292ZXJhZ2VUZXN0SWQ7CisJcHVibGljIHN0YXRpYyBpbnQgQ292ZXJhZ2VUZXN0SWQ7CiAKIAkvLyBhc3NpZ25tZW50IGJpdHMgLSBmaXJzdCBzZWdtZW50CiAJcHVibGljIGxvbmcgZGVmaW5pdGVJbml0czsKIAlwdWJsaWMgbG9uZyBwb3RlbnRpYWxJbml0czsKLQkKKwogCS8vIG51bGwgYml0cyAtIGZpcnN0IHNlZ21lbnQKLQlwdWJsaWMgbG9uZyAKKwlwdWJsaWMgbG9uZwogCQludWxsQml0MSwKIAkJbnVsbEJpdDIsCiAJCW51bGxCaXQzLApAQCAtNjMsNiArNjcsNyBAQAogCQkwMTAwCXBvdC4gbnVsbAogCQkwMTAxCXBvdC4gbiAmIHBvdC4gdW4KIAkJMDExMAlwb3QuIG4gJiBwb3QuIG5uCisJCTAxMTEgICAgcG90LiBuICYgcG90LiBubiAmIHBvdC4gdW4KIAkJMTAwMQlkZWYuIHVua25vd24KIAkJMTAxMAlkZWYuIG5vbiBudWxsCiAJCTEwMTEJcG90LiBubiAmIHByb3QuIG5uCkBAIC03MCw4ICs3NSw4IEBACiAJCTExMDEJcG90LiBuICYgcHJvdC4gbgogCQkxMTEwCXByb3QuIG51bGwKIAkJMTExMQlwcm90LiBub24gbnVsbAotICovCQotCQkKKyAqLworCiAJLy8gZXh0cmEgc2VnbWVudHMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBleHRyYUxlbmd0aCA9IDY7CiAJcHVibGljIGxvbmcgZXh0cmFbXVtdOwpAQCAtODQsMjQgKzg5LDM0IEBACiAKIAkvLyBDb25zdGFudHMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCaXRDYWNoZVNpemUgPSA2NDsgLy8gNjQgYml0cyBpbiBhIGxvbmcuCisJcHVibGljIGludFtdIG51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQ7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM0NDgKIAogcHVibGljIEZsb3dJbmZvIGFkZEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8gaW5pdHMpIHsKKwlyZXR1cm4gYWRkSW5mb0Zyb20oaW5pdHMsIHRydWUpOworfQorcHVibGljIEZsb3dJbmZvIGFkZE51bGxJbmZvRnJvbShGbG93SW5mbyBpbml0cykgeworCXJldHVybiBhZGRJbmZvRnJvbShpbml0cywgZmFsc2UpOworfQorcHJpdmF0ZSBGbG93SW5mbyBhZGRJbmZvRnJvbShGbG93SW5mbyBpbml0cywgYm9vbGVhbiBoYW5kbGVJbml0cykgewogCWlmICh0aGlzID09IERFQURfRU5EKQogCQlyZXR1cm4gdGhpczsKIAlpZiAoaW5pdHMgPT0gREVBRF9FTkQpCiAJCXJldHVybiB0aGlzOwotCVVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzID0gaW5pdHMudW5jb25kaXRpb25hbEluaXRzKCk7CQkKKwlVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cyA9IGluaXRzLnVuY29uZGl0aW9uYWxJbml0cygpOwogCi0JLy8gdW5pb24gb2YgZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMsIAotCXRoaXMuZGVmaW5pdGVJbml0cyB8PSBvdGhlckluaXRzLmRlZmluaXRlSW5pdHM7Ci0JLy8gdW5pb24gb2YgcG90ZW50aWFsbHkgc2V0IG9uZXMKLQl0aGlzLnBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisJaWYgKGhhbmRsZUluaXRzKSB7CisJCS8vIHVuaW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLAorCQl0aGlzLmRlZmluaXRlSW5pdHMgfD0gb3RoZXJJbml0cy5kZWZpbml0ZUluaXRzOworCQkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcworCQl0aGlzLnBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisJfQorCQogCS8vIGNvbWJpbmUgbnVsbCBpbmZvcm1hdGlvbgogCWJvb2xlYW4gdGhpc0hhZE51bGxzID0gKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSAhPSAwLAogCQlvdGhlckhhc051bGxzID0gKG90aGVySW5pdHMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSAhPSAwOwotCWxvbmcgCi0JCWExLCBhMiwgYTMsIGE0LCAKLQkJbmExLCBuYTIsIG5hMywgbmE0LCAKKwlsb25nCisJCWExLCBhMiwgYTMsIGE0LAorCQluYTEsIG5hMiwgbmEzLCBuYTQsCiAJCWIxLCBiMiwgYjMsIGI0LAogCQluYjEsIG5iMiwgbmIzLCBuYjQ7CiAJaWYgKG90aGVySGFzTnVsbHMpIHsKQEAgLTExMCwxNyArMTI1LDE5IEBACiAJCQl0aGlzLm51bGxCaXQyID0gb3RoZXJJbml0cy5udWxsQml0MjsKIAkJCXRoaXMubnVsbEJpdDMgPSBvdGhlckluaXRzLm51bGxCaXQzOwogCQkJdGhpcy5udWxsQml0NCA9IG90aGVySW5pdHMubnVsbEJpdDQ7Ci0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxKSB7Ci0JCQkgIHRoaXMubnVsbEJpdDQgPSB+MDsKKwkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMSkgeworCQkJCSAgdGhpcy5udWxsQml0NCA9IH4wOworCQkJCX0KIAkJCX0KIAkJfQogCQllbHNlIHsKIAkJCXRoaXMubnVsbEJpdDEgPSAoYjEgPSBvdGhlckluaXRzLm51bGxCaXQxKQotICAgICAgICAgICAgICAgIAkJCQl8IChhMSA9IHRoaXMubnVsbEJpdDEpICYgKChhMyA9IHRoaXMubnVsbEJpdDMpIAotICAgICAgICAgICAgICAgIAkJCQkJJiAoYTQgPSB0aGlzLm51bGxCaXQ0KSAmIChuYjIgPSB+KGIyID0gb3RoZXJJbml0cy5udWxsQml0MikpIAorICAgICAgICAgICAgICAgIAkJCQl8IChhMSA9IHRoaXMubnVsbEJpdDEpICYgKChhMyA9IHRoaXMubnVsbEJpdDMpCisgICAgICAgICAgICAgICAgCQkJCQkmIChhNCA9IHRoaXMubnVsbEJpdDQpICYgKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLm51bGxCaXQyKSkKICAgICAgICAgICAgICAgICAJCQkJCSYgKG5iNCA9IH4oYjQgPSBvdGhlckluaXRzLm51bGxCaXQ0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJfCAoKG5hNCA9IH5hNCkgfCAobmEzID0gfmEzKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQkmICgobmEyID0gfihhMiA9IHRoaXMubnVsbEJpdDIpKSAmIG5iMiAKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJfCAoKG5hNCA9IH5hNCkgfCAobmEzID0gfmEzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCSYgKChuYTIgPSB+KGEyID0gdGhpcy5udWxsQml0MikpICYgbmIyCiAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJfCBhMiAmIChuYjMgPSB+KGIzID0gb3RoZXJJbml0cy5udWxsQml0MykpICYgbmI0KSk7CiAJCQl0aGlzLm51bGxCaXQyICA9IGIyICYgKG5iNCB8IG5iMykKICAgICAgICAgICAgICAgICAgICAgCQkJfCBuYTMgJiBuYTQgJiBiMgpAQCAtMTQyLDkgKzE1OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl8IG5hMyAmIGE0ICYgYjIgJiBiMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJfCBuYTEgJiAoYjQJfCAoYTQgfCBhMikgJiBiMiAmIGIzKSkKICAgICAgICAgICAgICAgICAgICAgICAJCQl8IChuYTEgJiAobmEzICYgbmIzIHwgbmEyICYgbmIyKQotICAgICAgICAgICAgICAgICAgICAgIAkJCQl8IGExICYgKG5iMiAmIG5iMyB8IGEyICYgYTMpKSAmIGI0OwkKLQkJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDIpIHsKLQkJCSAgdGhpcy5udWxsQml0NCA9IH4wOworICAgICAgICAgICAgICAgICAgICAgIAkJCQl8IGExICYgKG5iMiAmIG5iMyB8IGEyICYgYTMpKSAmIGI0OworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAyKSB7CisJCQkJICB0aGlzLm51bGxCaXQ0ID0gfjA7CisJCQkJfQogCQkJfQogCQl9CiAJCXRoaXMudGFnQml0cyB8PSBOVUxMX0ZMQUdfTUFTSzsgLy8gaW4gYWxsIGNhc2VzIC0gYXZvaWQgZm9yZ2V0dGluZyBleHRyYXMKQEAgLTE1Niw2MyArMTc1LDc0IEBACiAJCQlpZiAob3RoZXJJbml0cy5leHRyYSAhPSBudWxsKSB7CiAJCQkJLy8gYm90aCBzaWRlcyBoYXZlIGV4dHJhIHN0b3JhZ2UKIAkJCQlpbnQgbGVuZ3RoLCBvdGhlckxlbmd0aDsKLQkJCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSA8IAorCQkJCWlmICgobGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpIDwKIAkJCQkJCShvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFbMF0ubGVuZ3RoKSkgewogCQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAorCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAogCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCQkJfQogCQkJCQltZXJnZUxpbWl0ID0gbGVuZ3RoOwogCQkJCQljb3B5TGltaXQgPSBvdGhlckxlbmd0aDsKLQkJCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMykgewotCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAzKSB7CisJCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMyIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCiAJCQkJCW1lcmdlTGltaXQgPSBvdGhlckxlbmd0aDsKLQkJCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gNCkgewotCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgNCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSA0KSB7CisJCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgNCIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQl9IAorCQkJfQogCQl9IGVsc2UgaWYgKG90aGVySW5pdHMuZXh0cmEgIT0gbnVsbCkgewogCQkJLy8gbm8gc3RvcmFnZSBoZXJlLCBidXQgb3RoZXIgaGFzIGV4dHJhIHN0b3JhZ2UuCiAJCQkvLyBzaG9ydGN1dCByZWd1bGFyIGNvcHkgYmVjYXVzZSBhcnJheSBjb3B5IGlzIGJldHRlcgogCQkJaW50IG90aGVyTGVuZ3RoOwogCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOwotCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLmV4dHJhWzBdLCAwLCAKLQkJCQkodGhpcy5leHRyYVswXSA9IG5ldyBsb25nW290aGVyTGVuZ3RoID0gCi0JCQkJCW90aGVySW5pdHMuZXh0cmFbMF0ubGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsJCQkKLQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVsxXSwgMCwgCisJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFbMF0sIDAsCisJCQkJKHRoaXMuZXh0cmFbMF0gPSBuZXcgbG9uZ1tvdGhlckxlbmd0aCA9CisJCQkJCW90aGVySW5pdHMuZXh0cmFbMF0ubGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVsxXSwgMCwKIAkJCQkodGhpcy5leHRyYVsxXSA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsKIAkJCWlmIChvdGhlckhhc051bGxzKSB7CiAJCQkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVtqXSwgMCwgCisJCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVtqXSwgMCwKIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOwogCQkJCX0KLQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSA1KSB7Ci0JCQkJCXRoaXMuZXh0cmFbNV1bb3RoZXJMZW5ndGggLSAxXSA9IH4wOworCQkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQkJaWYgKENvdmVyYWdlVGVzdElkID09IDUpIHsKKwkJCQkJCXRoaXMuZXh0cmFbNV1bb3RoZXJMZW5ndGggLSAxXSA9IH4wOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJZWxzZSB7CiAJCQkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF07CQkJCisJCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF07CiAJCQkJfQotCQkJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDYpIHsKLQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgNiIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gNikgeworCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgNiIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KIAkJaW50IGk7Ci0JCS8vIG1hbmFnZSBkZWZpbml0ZSBhc3NpZ25tZW50IGluZm8KLQkJZm9yIChpID0gMDsgaSA8IG1lcmdlTGltaXQ7IGkrKykgewotCQkJdGhpcy5leHRyYVswXVtpXSB8PSBvdGhlckluaXRzLmV4dHJhWzBdW2ldOwotCQkJdGhpcy5leHRyYVsxXVtpXSB8PSBvdGhlckluaXRzLmV4dHJhWzFdW2ldOwotCQl9Ci0JCWZvciAoOyBpIDwgY29weUxpbWl0OyBpKyspIHsKLQkJCXRoaXMuZXh0cmFbMF1baV0gPSBvdGhlckluaXRzLmV4dHJhWzBdW2ldOwotCQkJdGhpcy5leHRyYVsxXVtpXSA9IG90aGVySW5pdHMuZXh0cmFbMV1baV07CisJCWlmIChoYW5kbGVJbml0cykgeworCQkJLy8gbWFuYWdlIGRlZmluaXRlIGFzc2lnbm1lbnQgaW5mbworCQkJZm9yIChpID0gMDsgaSA8IG1lcmdlTGltaXQ7IGkrKykgeworCQkJCXRoaXMuZXh0cmFbMF1baV0gfD0gb3RoZXJJbml0cy5leHRyYVswXVtpXTsKKwkJCQl0aGlzLmV4dHJhWzFdW2ldIHw9IG90aGVySW5pdHMuZXh0cmFbMV1baV07CisJCQl9CisJCQlmb3IgKDsgaSA8IGNvcHlMaW1pdDsgaSsrKSB7CisJCQkJdGhpcy5leHRyYVswXVtpXSA9IG90aGVySW5pdHMuZXh0cmFbMF1baV07CisJCQkJdGhpcy5leHRyYVsxXVtpXSA9IG90aGVySW5pdHMuZXh0cmFbMV1baV07CisJCQkKKwkJCX0KIAkJfQogCQkvLyB0d2VhayBsaW1pdHMgZm9yIG51bGxzCiAJCWlmICghdGhpc0hhZE51bGxzKSB7CkBAIC0yMjcsMTEgKzI1NywxMSBAQAogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBtZXJnZUxpbWl0OyBpKyspIHsKIAkJCXRoaXMuZXh0cmFbMSArIDFdW2ldID0gKGIxID0gb3RoZXJJbml0cy5leHRyYVsxICsgMV1baV0pCi0gICAgICAgICAgICAgICAgCQkJCXwgKGExID0gdGhpcy5leHRyYVsxICsgMV1baV0pICYgKChhMyA9IHRoaXMuZXh0cmFbMyArIDFdW2ldKSAKLSAgICAgICAgICAgICAgICAJCQkJCSYgKGE0ID0gdGhpcy5leHRyYVs0ICsgMV1baV0pICYgKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLmV4dHJhWzIgKyAxXVtpXSkpIAorICAgICAgICAgICAgICAgIAkJCQl8IChhMSA9IHRoaXMuZXh0cmFbMSArIDFdW2ldKSAmICgoYTMgPSB0aGlzLmV4dHJhWzMgKyAxXVtpXSkKKyAgICAgICAgICAgICAgICAJCQkJCSYgKGE0ID0gdGhpcy5leHRyYVs0ICsgMV1baV0pICYgKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLmV4dHJhWzIgKyAxXVtpXSkpCiAgICAgICAgICAgICAgICAgCQkJCQkmIChuYjQgPSB+KGI0ID0gb3RoZXJJbml0cy5leHRyYVs0ICsgMV1baV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgCQl8ICgobmE0ID0gfmE0KSB8IChuYTMgPSB+YTMpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCSYgKChuYTIgPSB+KGEyID0gdGhpcy5leHRyYVsyICsgMV1baV0pKSAmIG5iMiAKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJfCAoKG5hNCA9IH5hNCkgfCAobmEzID0gfmEzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCSYgKChuYTIgPSB+KGEyID0gdGhpcy5leHRyYVsyICsgMV1baV0pKSAmIG5iMgogICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXwgYTIgJiAobmIzID0gfihiMyA9IG90aGVySW5pdHMuZXh0cmFbMyArIDFdW2ldKSkgJiBuYjQpKTsKIAkJCXRoaXMuZXh0cmFbMiArIDFdW2ldICA9IGIyICYgKG5iNCB8IG5iMykKICAgICAgICAgICAgICAgICAgICAgCQkJfCBuYTMgJiBuYTQgJiBiMgpAQCAtMjUzLDIwICsyODMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJfCBuYTMgJiBhNCAmIGIyICYgYjMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCXwgbmExICYgKGI0CXwgKGE0IHwgYTIpICYgYjIgJiBiMykpCiAgICAgICAgICAgICAgICAgICAgICAgCQkJfCAobmExICYgKG5hMyAmIG5iMyB8IG5hMiAmIG5iMikKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJfCBhMSAmIChuYjIgJiBuYjMgfCBhMiAmIGEzKSkgJiBiNDsJCi0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSA3KSB7Ci0JCQkgIHRoaXMuZXh0cmFbNV1baV0gPSB+MDsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJfCBhMSAmIChuYjIgJiBuYjMgfCBhMiAmIGEzKSkgJiBiNDsKKwkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gNykgeworCQkJCSAgdGhpcy5leHRyYVs1XVtpXSA9IH4wOworCQkJCX0KIAkJCX0KIAkJfQogCQlmb3IgKDsgaSA8IGNvcHlMaW1pdDsgaSsrKSB7CiAJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKIAkJCQl0aGlzLmV4dHJhW2pdW2ldID0gb3RoZXJJbml0cy5leHRyYVtqXVtpXTsKIAkJCX0KLQkJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDgpIHsKLQkJCSAgdGhpcy5leHRyYVs1XVtpXSA9IH4wOworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSA4KSB7CisJCQkJICB0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQkJfQogCQkJfQogCQl9CiAJfQorCWNvbWJpbmVOdWxsU3RhdHVzQ2hhbmdlSW5Bc3NlcnRJbmZvKG90aGVySW5pdHMpOwogCXJldHVybiB0aGlzOwogfQogCkBAIC0yODgsNyArMzIzLDcgQEAKIAkJCWlmICgobGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpIDwgKG90aGVyTGVuZ3RoID0gb3RoZXJJbml0cy5leHRyYVswXS5sZW5ndGgpKSB7CiAJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIHNob3J0ZXIgLT4gZ3JvdyBjdXJyZW50CiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwgCisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwKIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCQl9CiAJCQkJZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtMjk3LDcgKzMzMiw3IEBACiAJCQkJZm9yICg7IGkgPCBvdGhlckxlbmd0aDsgaSsrKSB7CiAJCQkJCXRoaXMuZXh0cmFbMV1baV0gPSBvdGhlckluaXRzLmV4dHJhWzFdW2ldOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCQllbHNlIHsKIAkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCiAJCQkJZm9yICg7IGkgPCBvdGhlckxlbmd0aDsgaSsrKSB7CkBAIC0zMDUsMjcgKzM0MCwyNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCX0gCisJfQogCWVsc2UgaWYgKG90aGVySW5pdHMuZXh0cmEgIT0gbnVsbCkgewogCQkvLyBubyBzdG9yYWdlIGhlcmUsIGJ1dCBvdGhlciBoYXMgZXh0cmEgc3RvcmFnZS4KIAkJaW50IG90aGVyTGVuZ3RoID0gb3RoZXJJbml0cy5leHRyYVswXS5sZW5ndGg7CiAJCXRoaXMuZXh0cmEgPSBuZXcgbG9uZ1tleHRyYUxlbmd0aF1bXTsKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdOwkJCQorCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW290aGVyTGVuZ3RoXTsKIAkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFbMV0sIDAsIHRoaXMuZXh0cmFbMV0sIDAsIAorCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFbMV0sIDAsIHRoaXMuZXh0cmFbMV0sIDAsCiAJCQlvdGhlckxlbmd0aCk7CiAJfQotCXRoaXMuYWRkUG90ZW50aWFsTnVsbEluZm9Gcm9tKG90aGVySW5pdHMpOworCWFkZFBvdGVudGlhbE51bGxJbmZvRnJvbShvdGhlckluaXRzKTsKIAlyZXR1cm4gdGhpczsKIH0KIAogLyoqCiAgKiBDb21wb3NlIG90aGVyIGluaXRzIG92ZXIgdGhpcyBmbG93IGluZm8sIHRoZW4gcmV0dXJuIHRoaXMuIFRoZSBvcGVyYXRpb24KLSAqIHNlbWFudGljcyBhcmUgdG8gd2F2ZSBpbnRvIHRoaXMgZmxvdyBpbmZvIHRoZSBjb25zZXF1ZW5jZXMgdXBvbiBudWxsIAotICogaW5mb3JtYXRpb24gb2YgYSBwb3NzaWJsZSBwYXRoIGludG8gdGhlIG9wZXJhdGlvbnMgdGhhdCByZXN1bHRlZCBpbnRvIAotICogb3RoZXJJbml0cy4gVGhlIGZhY3QgdGhhdCB0aGlzIHBhdGggbWF5IGJlIGxlZnQgdW5leGVjdXRlZCB1bmRlciBwZWN1bGlhciAKLSAqIGNvbmRpdGlvbnMgcmVzdWx0cyBpbnRvIGxlc3Mgc3BlY2lmaWMgcmVzdWx0cyB0aGFuIAorICogc2VtYW50aWNzIGFyZSB0byB3YXZlIGludG8gdGhpcyBmbG93IGluZm8gdGhlIGNvbnNlcXVlbmNlcyB1cG9uIG51bGwKKyAqIGluZm9ybWF0aW9uIG9mIGEgcG9zc2libGUgcGF0aCBpbnRvIHRoZSBvcGVyYXRpb25zIHRoYXQgcmVzdWx0ZWQgaW50bworICogb3RoZXJJbml0cy4gVGhlIGZhY3QgdGhhdCB0aGlzIHBhdGggbWF5IGJlIGxlZnQgdW5leGVjdXRlZCB1bmRlciBwZWN1bGlhcgorICogY29uZGl0aW9ucyByZXN1bHRzIGludG8gbGVzcyBzcGVjaWZpYyByZXN1bHRzIHRoYW4KICAqIHtAbGluayAjYWRkSW5pdGlhbGl6YXRpb25zRnJvbShGbG93SW5mbykgYWRkSW5pdGlhbGl6YXRpb25zRnJvbX07IG1vcmVvdmVyLAogICogb25seSB0aGUgbnVsbCBpbmZvcm1hdGlvbiBpcyBhZmZlY3RlZC4KICAqIEBwYXJhbSBvdGhlckluaXRzIG90aGVyIG51bGwgaW5pdHMgdG8gY29tcG9zZSBvdmVyIHRoaXMKQEAgLTM0MSwxNyArMzc2LDE3IEBACiAJLy8gaWYgd2UgZ2V0IGhlcmUsIG90aGVySW5pdHMgaGFzIHNvbWUgbnVsbCBpbmZvCiAJYm9vbGVhbiB0aGlzSGFkTnVsbHMgPSAodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spICE9IDAsCiAJCXRoaXNIYXNOdWxscyA9IGZhbHNlOwotCWxvbmcgYTEsIGEyLCBhMywgYTQsICAKLQkJbmExLCBuYTIsIG5hMywgbmE0LCAKKwlsb25nIGExLCBhMiwgYTMsIGE0LAorCQluYTEsIG5hMiwgbmEzLCBuYTQsCiAJCWIxLCBiMiwgYjMsIGI0LAogCQluYjEsIG5iMiwgbmIzLCBuYjQ7CiAJaWYgKHRoaXNIYWROdWxscykgewotCQl0aGlzLm51bGxCaXQxICA9IChhMSA9IHRoaXMubnVsbEJpdDEpIAotCQkJCQkJCQkmICgoYTMgPSB0aGlzLm51bGxCaXQzKSAmIChhNCA9IHRoaXMubnVsbEJpdDQpIAotCQkJCQkJCQkJJiAoKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLm51bGxCaXQyKSkgCi0JCQkJCQkJCQkJJiAobmI0ID0gfihiNCA9IG90aGVySW5pdHMubnVsbEJpdDQpKSAKKwkJdGhpcy5udWxsQml0MSAgPSAoYTEgPSB0aGlzLm51bGxCaXQxKQorCQkJCQkJCQkmICgoYTMgPSB0aGlzLm51bGxCaXQzKSAmIChhNCA9IHRoaXMubnVsbEJpdDQpCisJCQkJCQkJCQkmICgobmIyID0gfihiMiA9IG90aGVySW5pdHMubnVsbEJpdDIpKQorCQkJCQkJCQkJCSYgKG5iNCA9IH4oYjQgPSBvdGhlckluaXRzLm51bGxCaXQ0KSkKIAkJCQkJCQkJCQkJfCAoYjEgPSBvdGhlckluaXRzLm51bGxCaXQxKSAmIChiMyA9IG90aGVySW5pdHMubnVsbEJpdDMpKQotICAgICAgICAgICAgICAgIAkJCXwgKG5hMiA9IH4oYTIgPSB0aGlzLm51bGxCaXQyKSkgCisgICAgICAgICAgICAgICAgCQkJfCAobmEyID0gfihhMiA9IHRoaXMubnVsbEJpdDIpKQogICAgICAgICAgICAgICAgIAkJCQkmIChiMSAmIGIzIHwgKChuYTQgPSB+YTQpIHwgKG5hMyA9IH5hMykpICYgbmIyKQogICAgICAgICAgICAgICAgIAkJCXwgYTIgJiAoKG5hNCB8IG5hMykgJiAoKG5iMyA9IH5iMykgJiBuYjQgfCBiMSAmIGIyKSkpOwogCQl0aGlzLm51bGxCaXQyID0gYjIgJiAobmIzIHwgKG5iMSA9IH5iMSkpCkBAIC0zNjcsMjEgKzQwMiwyNSBAQAogICAgIAkJCXwgbmIyICYgKG5hMyAmIGIxICYgbmIzCXwgbmEyICYgKG5iMSAmIGI0IHwgYjEgJiBuYjMgfCBhNCkpCiAgICAgCQkJfCBhMyAmIChhNCAmIChuYjIgfCBiMSAmIGIzKQogICAgICAgICAgICAgCQkJfCBhMSAmIGEyICYgKG5iMSAmIGI0IHwgbmE0ICYgKGIyIHwgYjEpICYgbmIzKSk7Ci0JCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDkpIHsKLQkJICB0aGlzLm51bGxCaXQ0ID0gfjA7CisJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSA5KSB7CisJCQkgIHRoaXMubnVsbEJpdDQgPSB+MDsKKwkJCX0KIAkJfQogCQlpZiAoKHRoaXMubnVsbEJpdDIgfCB0aGlzLm51bGxCaXQzIHwgdGhpcy5udWxsQml0NCkgIT0gMCkgeyAvLyAgYml0MSBpcyByZWR1bmRhbnQKIAkJICAJdGhpc0hhc051bGxzID0gdHJ1ZTsKIAkJfQogCX0gZWxzZSB7CiAgIAkJdGhpcy5udWxsQml0MSA9IDA7Ci0gIAkJdGhpcy5udWxsQml0MiA9IChiMiA9IG90aGVySW5pdHMubnVsbEJpdDIpIAotICAJCQkJCQkJJiAoKG5iMyA9IH4oYjMgPSBvdGhlckluaXRzLm51bGxCaXQzKSkgfCAKKyAgCQl0aGlzLm51bGxCaXQyID0gKGIyID0gb3RoZXJJbml0cy5udWxsQml0MikKKyAgCQkJCQkJCSYgKChuYjMgPSB+KGIzID0gb3RoZXJJbml0cy5udWxsQml0MykpIHwKICAgCQkJCQkJCQkobmIxID0gfihiMSA9IG90aGVySW5pdHMubnVsbEJpdDEpKSk7CiAgIAkJdGhpcy5udWxsQml0MyA9IGIzICYgKG5iMSB8IChuYjIgPSB+YjIpKTsKICAgCQl0aGlzLm51bGxCaXQ0ID0gfmIxICYgfmIzICYgKGI0ID0gb3RoZXJJbml0cy5udWxsQml0NCkgfCB+YjIgJiAoYjEgJiB+YjMgfCB+YjEgJiBiNCk7Ci0JCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDEwKSB7Ci0JCSAgdGhpcy5udWxsQml0NCA9IH4wOworCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMTApIHsKKwkJCSAgdGhpcy5udWxsQml0NCA9IH4wOworCQkJfQogCQl9CiAJCWlmICgodGhpcy5udWxsQml0MiB8IHRoaXMubnVsbEJpdDMgfCB0aGlzLm51bGxCaXQ0KSAhPSAwKSB7IC8vICBiaXQxIGlzIHJlZHVuZGFudAogCQkgIAl0aGlzSGFzTnVsbHMgPSB0cnVlOwpAQCAtMzk1LDggKzQzNCwxMCBAQAogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CiAJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2NvcHlMaW1pdF07CiAJCQl9Ci0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxMSkgewotCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkNPVkVSQUdFIDExIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMTEpIHsKKwkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMTEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCW1lcmdlTGltaXQgPSBjb3B5TGltaXQ7CkBAIC00MDgsMTAgKzQ0OSwxMiBAQAogCQkJCQkJCW1lcmdlTGltaXQpOwogCQkJCX0KIAkJCQlpZiAoISB0aGlzSGFkTnVsbHMpIHsKLSAgICAJCQkJbWVyZ2VMaW1pdCA9IDA7IAorICAgIAkJCQltZXJnZUxpbWl0ID0gMDsKICAgICAJCQkJLy8gd2lsbCBkbyB3aXRoIGEgY29weSAtLSBjYXZlYXQ6IG9ubHkgdmFsaWQgYmVjYXVzZSBkZWZpbml0ZSBhc3NpZ25tZW50IGJpdHMgY29waWVkIGFib3ZlCi0gICAgICAgIAkJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDEyKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAxMiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIAkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAgICAgCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAxMikgeworCQkJCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkNPVkVSQUdFIDEyIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgCQkJCX0KICAgICAgICAgCQkJfQogCQkJCX0KIAkJCX0KQEAgLTQxOSwxMiArNDYyLDEyIEBACiAJCS8vIFBSRU1BVFVSRSBza2lwIG9wZXJhdGlvbnMgZm9yIGZpZWxkcwogCQlpbnQgaTsKIAkJZm9yIChpID0gMCA7IGkgPCBtZXJnZUxpbWl0IDsgaSsrKSB7Ci0gICAgCQl0aGlzLmV4dHJhWzEgKyAxXVtpXSAgPSAoYTEgPSB0aGlzLmV4dHJhWzEgKyAxXVtpXSkgCi0gICAgCQkJCQkJCQkmICgoYTMgPSB0aGlzLmV4dHJhWzMgKyAxXVtpXSkgJiAoYTQgPSB0aGlzLmV4dHJhWzQgKyAxXVtpXSkgCi0gICAgCQkJCQkJCQkJJiAoKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLmV4dHJhWzIgKyAxXVtpXSkpIAotICAgIAkJCQkJCQkJCQkmIChuYjQgPSB+KGI0ID0gb3RoZXJJbml0cy5leHRyYVs0ICsgMV1baV0pKSAKKyAgICAJCXRoaXMuZXh0cmFbMSArIDFdW2ldICA9IChhMSA9IHRoaXMuZXh0cmFbMSArIDFdW2ldKQorICAgIAkJCQkJCQkJJiAoKGEzID0gdGhpcy5leHRyYVszICsgMV1baV0pICYgKGE0ID0gdGhpcy5leHRyYVs0ICsgMV1baV0pCisgICAgCQkJCQkJCQkJJiAoKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLmV4dHJhWzIgKyAxXVtpXSkpCisgICAgCQkJCQkJCQkJCSYgKG5iNCA9IH4oYjQgPSBvdGhlckluaXRzLmV4dHJhWzQgKyAxXVtpXSkpCiAgICAgCQkJCQkJCQkJCQl8IChiMSA9IG90aGVySW5pdHMuZXh0cmFbMSArIDFdW2ldKSAmIChiMyA9IG90aGVySW5pdHMuZXh0cmFbMyArIDFdW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgCQkJfCAobmEyID0gfihhMiA9IHRoaXMuZXh0cmFbMiArIDFdW2ldKSkgCisgICAgICAgICAgICAgICAgICAgIAkJCXwgKG5hMiA9IH4oYTIgPSB0aGlzLmV4dHJhWzIgKyAxXVtpXSkpCiAgICAgICAgICAgICAgICAgICAgIAkJCQkmIChiMSAmIGIzIHwgKChuYTQgPSB+YTQpIHwgKG5hMyA9IH5hMykpICYgbmIyKQogICAgICAgICAgICAgICAgICAgICAJCQl8IGEyICYgKChuYTQgfCBuYTMpICYgKChuYjMgPSB+YjMpICYgbmI0IHwgYjEgJiBiMikpKTsKICAgICAJCXRoaXMuZXh0cmFbMiArIDFdW2ldID0gYjIgJiAobmIzIHwgKG5iMSA9IH5iMSkpCkBAIC00NDMsMzYgKzQ4Niw0MSBAQAogICAgIAkJaWYgKCh0aGlzLmV4dHJhWzIgKyAxXVtpXSB8IHRoaXMuZXh0cmFbMyArIDFdW2ldIHwgdGhpcy5leHRyYVs0ICsgMV1baV0pICE9IDApIHsgLy8gIGJpdDEgaXMgcmVkdW5kYW50CiAgICAgCQkgIAl0aGlzSGFzTnVsbHMgPSB0cnVlOwogICAgIAkJfQotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMTMpIHsKLQkJCSAgdGhpcy5udWxsQml0NCA9IH4wOworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAxMykgeworCQkJCSAgdGhpcy5udWxsQml0NCA9IH4wOworCQkJCX0KIAkJCX0KIAkJfQogCQlmb3IgKDsgaSA8IGNvcHlMaW1pdDsgaSsrKSB7CiAgICAgCQl0aGlzLmV4dHJhWzEgKyAxXVtpXSA9IDA7Ci0gICAgCQl0aGlzLmV4dHJhWzIgKyAxXVtpXSA9IChiMiA9IG90aGVySW5pdHMuZXh0cmFbMiArIDFdW2ldKSAKLSAgICAJCQkJCQkJJiAoKG5iMyA9IH4oYjMgPSBvdGhlckluaXRzLmV4dHJhWzMgKyAxXVtpXSkpIHwgCisgICAgCQl0aGlzLmV4dHJhWzIgKyAxXVtpXSA9IChiMiA9IG90aGVySW5pdHMuZXh0cmFbMiArIDFdW2ldKQorICAgIAkJCQkJCQkmICgobmIzID0gfihiMyA9IG90aGVySW5pdHMuZXh0cmFbMyArIDFdW2ldKSkgfAogICAgIAkJCQkJCQkJKG5iMSA9IH4oYjEgPSBvdGhlckluaXRzLmV4dHJhWzEgKyAxXVtpXSkpKTsKICAgICAJCXRoaXMuZXh0cmFbMyArIDFdW2ldID0gYjMgJiAobmIxIHwgKG5iMiA9IH5iMikpOwogICAgIAkJdGhpcy5leHRyYVs0ICsgMV1baV0gPSB+YjEgJiB+YjMgJiAoYjQgPSBvdGhlckluaXRzLmV4dHJhWzQgKyAxXVtpXSkgfCB+YjIgJiAoYjEgJiB+YjMgfCB+YjEgJiBiNCk7CiAgICAgCQlpZiAoKHRoaXMuZXh0cmFbMiArIDFdW2ldIHwgdGhpcy5leHRyYVszICsgMV1baV0gfCB0aGlzLmV4dHJhWzQgKyAxXVtpXSkgIT0gMCkgeyAvLyAgYml0MSBpcyByZWR1bmRhbnQKICAgICAJCSAgCXRoaXNIYXNOdWxscyA9IHRydWU7CiAgICAgCQl9Ci0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxNCkgewotCQkJICB0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYgKENvdmVyYWdlVGVzdElkID09IDE0KSB7CisJCQkJICB0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQkJfQogCQkJfQogCQl9CiAJfQorCWNvbWJpbmVOdWxsU3RhdHVzQ2hhbmdlSW5Bc3NlcnRJbmZvKG90aGVySW5pdHMpOwogCWlmICh0aGlzSGFzTnVsbHMpIHsKLQkJdGhpcy50YWdCaXRzIHw9IE5VTExfRkxBR19NQVNLOyAKKwkJdGhpcy50YWdCaXRzIHw9IE5VTExfRkxBR19NQVNLOwogCX0KIAllbHNlIHsKLQkJdGhpcy50YWdCaXRzICY9IE5VTExfRkxBR19NQVNLOyAKKwkJdGhpcy50YWdCaXRzICY9IE5VTExfRkxBR19NQVNLOwogCX0KIAlyZXR1cm4gdGhpczsKIH0KIAogZmluYWwgcHVibGljIGJvb2xlYW4gY2Fubm90QmVEZWZpbml0ZWx5TnVsbE9yTm9uTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWlmICgodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spID09IDAgfHwgCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fAogCQkJKGxvY2FsLnR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSXNCYXNlVHlwZSkgIT0gMCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNDgwLDcgKzUyOCw3IEBACiAJaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgewogCQkvLyB1c2UgYml0cwogCQlyZXR1cm4gKAotCQkJKH50aGlzLm51bGxCaXQxIAorCQkJKH50aGlzLm51bGxCaXQxCiAJCQkJCSYgKHRoaXMubnVsbEJpdDIgJiB0aGlzLm51bGxCaXQzIHwgdGhpcy5udWxsQml0NCkKIAkJCQl8IH50aGlzLm51bGxCaXQyICYgfnRoaXMubnVsbEJpdDMgJiB0aGlzLm51bGxCaXQ0KQogCQkJJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwOwpAQCAtNDkwLDIwICs1MzgsMjAgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0KIAkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CiAJbG9uZyBhMiwgYTMsIGE0OwogCXJldHVybiAoCi0JCQkofnRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXhdIAorCQkJKH50aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XQogCQkJCQkmICgoYTIgPSB0aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSkgJiAoYTMgPSB0aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSkgfCAoYTQgPSB0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSkpCiAJCQkJfCB+YTIgJiB+YTMgJiBhNCkKIAkJICAgICYgKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpKSAhPSAwOwogfQogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBjYW5ub3RCZU51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKLQlpZiAoKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSA9PSAwIHx8IAorCWlmICgodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spID09IDAgfHwKIAkJCShsb2NhbC50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLklzQmFzZVR5cGUpICE9IDApIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTUxOSw3ICs1NjcsNyBAQAogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CiAJaW50IHZlY3RvckluZGV4OwotCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gCisJaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PQogCQkJdGhpcy5leHRyYVswXS5sZW5ndGgpIHsKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiBub3QgZW5vdWdoIHJvb20gaW4gdmVjdG9yLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCX0KQEAgLTUzMCw3ICs1NzgsNyBAQAogfQogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBjYW5Pbmx5QmVOdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaWYgKCh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fCAKKwlpZiAoKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSA9PSAwIHx8CiAJCQkobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSAhPSAwKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC01NDYsNyArNTk0LDcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0KIAkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CkBAIC01NjUsNyArNjEzLDcgQEAKIAljb3B5LmRlZmluaXRlSW5pdHMgPSB0aGlzLmRlZmluaXRlSW5pdHM7CiAJY29weS5wb3RlbnRpYWxJbml0cyA9IHRoaXMucG90ZW50aWFsSW5pdHM7CiAJYm9vbGVhbiBoYXNOdWxsSW5mbyA9ICh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgIT0gMDsKLQlpZiAoaGFzTnVsbEluZm8pIHsgCisJaWYgKGhhc051bGxJbmZvKSB7CiAJCWNvcHkubnVsbEJpdDEgPSB0aGlzLm51bGxCaXQxOwogCQljb3B5Lm51bGxCaXQyID0gdGhpcy5udWxsQml0MjsKIAkJY29weS5udWxsQml0MyA9IHRoaXMubnVsbEJpdDM7CkBAIC01NzYsMTQgKzYyNCwxNCBAQAogCWlmICh0aGlzLmV4dHJhICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aDsKIAkJY29weS5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbMF0sIDAsIAotCQkJKGNvcHkuZXh0cmFbMF0gPSBuZXcgbG9uZ1tsZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aF0pLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhWzBdLCAwLAorCQkJKGNvcHkuZXh0cmFbMF0gPSBuZXcgbG9uZ1tsZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aF0pLCAwLAogCQkJbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhWzFdLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhWzFdLCAwLAogCQkJKGNvcHkuZXh0cmFbMV0gPSBuZXcgbG9uZ1tsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJaWYgKGhhc051bGxJbmZvKSB7CiAJCQlmb3IgKGludCBqID0gMjsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwKIAkJCQkJKGNvcHkuZXh0cmFbal0gPSBuZXcgbG9uZ1tsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCX0KIAkJfQpAQCAtNTkzLDEyICs2NDEsMTMgQEAKIAkJCX0KIAkJfQogCX0KKwljb3B5Lm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQgPSB0aGlzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQ7CiAJcmV0dXJuIGNvcHk7CiB9CiAKIC8qKgogICogRGlzY2FyZCBkZWZpbml0ZSBpbml0cyBhbmQgcG90ZW50aWFsIGluaXRzIGZyb20gdGhpcywgdGhlbiByZXR1cm4gdGhpcy4KLSAqIFRoZSByZXR1cm5lZCBmbG93IGluZm8gb25seSBob2xkcyBudWxsIHJlbGF0ZWQgaW5mb3JtYXRpb24uIAorICogVGhlIHJldHVybmVkIGZsb3cgaW5mbyBvbmx5IGhvbGRzIG51bGwgcmVsYXRlZCBpbmZvcm1hdGlvbi4KICAqIEByZXR1cm4gdGhpcyBmbG93IGluZm8sIG1pbnVzIGRlZmluaXRlIGluaXRzIGFuZCBwb3RlbnRpYWwgaW5pdHMKICAqLwogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBkaXNjYXJkSW5pdGlhbGl6YXRpb25JbmZvKCkgewpAQCAtNjI5LDcgKzY3OCw3IEBACiAJCXRoaXMubnVsbEJpdDIgJj0gbWFzazsKIAkJdGhpcy5udWxsQml0MyAmPSBtYXNrOwogCQl0aGlzLm51bGxCaXQ0ICY9IG1hc2s7Ci0JfSAKKwl9CiAJLy8gdXNlIGV4dHJhIHZlY3RvcgogCWlmICh0aGlzLmV4dHJhID09IG51bGwpIHsKIAkJcmV0dXJuIHRoaXM7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKQEAgLTYzOCw3ICs2ODcsNyBAQAogCWlmICgodmVjdG9ySW5kZXggPSAobGltaXQgLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gbGVuZ3RoKSB7CiAJCXJldHVybiB0aGlzOyAvLyBub3QgZW5vdWdoIHJvb20geWV0CiAJfQotCWlmICh2ZWN0b3JJbmRleCA+PSAwKSB7IAorCWlmICh2ZWN0b3JJbmRleCA+PSAwKSB7CiAJCS8vIGVsc2Ugd2Ugb25seSBoYXZlIGNvbXBsZXRlIG5vbiBmaWVsZCBhcnJheSBpdGVtcyBsZWZ0CiAJCWxvbmcgbWFzayA9ICgxTCA8PCAobGltaXQgJSBCaXRDYWNoZVNpemUpKS0xOwogCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKQEAgLTY2OSwzMiArNzE4LDMyIEBACiBmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7CiAJaWYgKHBvc2l0aW9uIDwgQml0Q2FjaGVTaXplKSB7CiAJCS8vIHVzZSBiaXRzCi0JCXJldHVybiAodGhpcy5kZWZpbml0ZUluaXRzICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMDsgCisJCXJldHVybiAodGhpcy5kZWZpbml0ZUluaXRzICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMDsKIAl9CiAJLy8gdXNlIGV4dHJhIHZlY3RvcgogCWlmICh0aGlzLmV4dHJhID09IG51bGwpCiAJCXJldHVybiBmYWxzZTsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpIAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkKIAkJCT49IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9Ci0JcmV0dXJuICgodGhpcy5leHRyYVswXVt2ZWN0b3JJbmRleF0pICYgCisJcmV0dXJuICgodGhpcy5leHRyYVswXVt2ZWN0b3JJbmRleF0pICYKIAkJCQkoMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSkpICE9IDA7CiB9CiAKIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCS8vIE1pcnJvcmVkIGluIENvZGVTdHJlYW0uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pIAorCS8vIE1pcnJvcmVkIGluIENvZGVTdHJlYW0uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCiAJLy8gZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQotCWlmICgodGhpcy50YWdCaXRzICYgVU5SRUFDSEFCTEUpICE9IDApIHsgCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQuaWQpOyAKKwlyZXR1cm4gaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQuaWQpOwogfQogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewogCS8vIGRvIG5vdCB3YW50IHRvIGNvbXBsYWluIGluIHVucmVhY2hhYmxlIGNvZGUgaWYgbG9jYWwgZGVjbGFyZWQgaW4gcmVhY2hhYmxlIGNvZGUKLQlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSAhPSAwICYmIChsb2NhbC5kZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0xvY2FsRGVjbGFyYXRpb25SZWFjaGFibGUpICE9IDApIHsKKwlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFX09SX0RFQUQpICE9IDAgJiYgKGxvY2FsLmRlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZSkgIT0gMCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJcmV0dXJuIGlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KTsKQEAgLTcwMiwxMSArNzUxLDExIEBACiAKIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseU5vbk51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKIAkvLyBkbyBub3Qgd2FudCB0byBjb21wbGFpbiBpbiB1bnJlYWNoYWJsZSBjb2RlCi0JaWYgKCh0aGlzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRSkgIT0gMCB8fCAKKwlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSAhPSAwIHx8CiAJCQkodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spID09IDApIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQlpZiAoKGxvY2FsLnR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSXNCYXNlVHlwZSkgIT0gMCB8fCAKKwlpZiAoKGxvY2FsLnR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSXNCYXNlVHlwZSkgIT0gMCB8fAogCQkJbG9jYWwuY29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsgLy8gU3RyaW5nIGluc3RhbmNlcwogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC03MjAsNyArNzY5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpICAKKwlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpCiAJCQk+PSB0aGlzLmV4dHJhWzBdLmxlbmd0aCkgewogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQpAQCAtNzMxLDggKzc4MCw4IEBACiAKIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseU51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKIAkvLyBkbyBub3Qgd2FudCB0byBjb21wbGFpbiBpbiB1bnJlYWNoYWJsZSBjb2RlCi0JaWYgKCh0aGlzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRSkgIT0gMCB8fCAKLQkJCSh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fCAKKwlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSAhPSAwIHx8CisJCQkodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spID09IDAgfHwKIAkJCShsb2NhbC50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLklzQmFzZVR5cGUpICE9IDApIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTc0Nyw3ICs3OTYsNyBAQAogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CiAJaW50IHZlY3RvckluZGV4OwotCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gCisJaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PQogCQkJdGhpcy5leHRyYVswXS5sZW5ndGgpIHsKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiBub3QgZW5vdWdoIHJvb20gaW4gdmVjdG9yLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCX0KQEAgLTc1OCw3ICs4MDcsNyBAQAogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlVbmtub3duKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CiAJLy8gZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQotCWlmICgodGhpcy50YWdCaXRzICYgVU5SRUFDSEFCTEUpICE9IDAgfHwgCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRSkgIT0gMCB8fAogCQkJKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSA9PSAwKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC03NzIsNyArODIxLDcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0KIAkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CkBAIC03OTUsMTYgKzg0NCwxNiBAQAogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CiAJaW50IHZlY3RvckluZGV4OwotCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgCisJaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKQogCQkJPj0gdGhpcy5leHRyYVswXS5sZW5ndGgpIHsKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiBub3QgZW5vdWdoIHJvb20gaW4gdmVjdG9yLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCX0KLQlyZXR1cm4gKCh0aGlzLmV4dHJhWzFdW3ZlY3RvckluZGV4XSkgJiAKKwlyZXR1cm4gKCh0aGlzLmV4dHJhWzFdW3ZlY3RvckluZGV4XSkgJgogCQkJKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpKSAhPSAwOwogfQogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7Ci0JcmV0dXJuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChmaWVsZC5pZCk7IAorCXJldHVybiBpc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQuaWQpOwogfQogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKQEAgLTgxNSw4ICs4NjQsOSBAQAogCXJldHVybiBpc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQpOwogfQogCisvLyBUT0RPIChBeXVzaCkgQ2hlY2sgd2h5IHRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiB0cnVlIGZvciBwcm90ZWN0ZWQgbm9uIG51bGwgKDExMTEpCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5Tm9uTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWlmICgodGhpcy50YWdCaXRzICYgTlVMTF9GTEFHX01BU0spID09IDAgfHwgCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fAogCQkJKGxvY2FsLnR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSXNCYXNlVHlwZSkgIT0gMCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtODMxLDcgKzg4MSw3IEBACiAJCXJldHVybiBmYWxzZTsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCX0KIAlpbnQgdmVjdG9ySW5kZXg7Ci0JaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSAKKwlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49CiAJCQl0aGlzLmV4dHJhWzBdLmxlbmd0aCkgewogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQpAQCAtODQwLDggKzg5MCw5IEBACiAJCSAgICAmICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSkgIT0gMDsKIH0KIAorLy8gVE9ETyAoQXl1c2gpIENoZWNrIHdoeSB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgcHJvdGVjdGVkIG51bGwKIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlOdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaWYgKCh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fCAKKwlpZiAoKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSA9PSAwIHx8CiAJCQkobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSAhPSAwKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC04NTYsNyArOTA3LDcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0KIAkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CkBAIC04NjcsMTMgKzkxOCwxMyBAQAogCiBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5VW5rbm93bihMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewogCS8vIGRvIG5vdCB3YW50IHRvIGNvbXBsYWluIGluIHVucmVhY2hhYmxlIGNvZGUKLQlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSAhPSAwIHx8IAorCWlmICgodGhpcy50YWdCaXRzICYgVU5SRUFDSEFCTEUpICE9IDAgfHwKIAkJCSh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWludCBwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50OwogCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgeyAvLyB1c2UgYml0cwotCQlyZXR1cm4gKHRoaXMubnVsbEJpdDQgCisJCXJldHVybiAodGhpcy5udWxsQml0NAogCQkJJiAofnRoaXMubnVsbEJpdDEgfCB+dGhpcy5udWxsQml0MiAmIH50aGlzLm51bGxCaXQzKQogCQkJJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwOwogCX0KQEAgLTg4MiwxMyArOTMzLDEzIEBACiAJCXJldHVybiBmYWxzZTsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAogCX0KIAlpbnQgdmVjdG9ySW5kZXg7Ci0JaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSAKKwlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49CiAJCQl0aGlzLmV4dHJhWzBdLmxlbmd0aCkgewogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCXJldHVybiAodGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0KLQkgICAgICAgICYgKH50aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSAKLQkgICAgICAgICAgICB8IH50aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSAmIH50aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSkgCisJICAgICAgICAmICh+dGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleF0KKwkgICAgICAgICAgICB8IH50aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSAmIH50aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSkKIAkJICAgICYgKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpKSAhPSAwOwogfQogCkBAIC05MDcsMTggKzk1OCwxOCBAQAogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CiAJaW50IHZlY3RvckluZGV4OwotCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gCisJaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PQogCQl0aGlzLmV4dHJhWzBdLmxlbmd0aCkgewogCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQotCXJldHVybiAodGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleF0gCisJcmV0dXJuICh0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XQogCSAgICAgICAgICAgICYgdGhpcy5leHRyYVs0XVt2ZWN0b3JJbmRleF0KIAkgICAgICAgICAgICAmIHRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdCiAJCSAgICAmICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSkgIT0gMDsKIH0KIAogZmluYWwgcHVibGljIGJvb2xlYW4gaXNQcm90ZWN0ZWROdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaWYgKCh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgPT0gMCB8fCAKKwlpZiAoKHRoaXMudGFnQml0cyAmIE5VTExfRkxBR19NQVNLKSA9PSAwIHx8CiAJCQkobG9jYWwudHlwZS50YWdCaXRzICYgVGFnQml0cy5Jc0Jhc2VUeXBlKSAhPSAwKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05MzQsNyArOTg1LDcgQEAKIAkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IAorCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0KIAkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gaWYgbm90IGVub3VnaCByb29tIGluIHZlY3RvciwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKIAl9CkBAIC05NDIsNyArOTkzLDIwIEBACiAJICAgICAgICAmICh0aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSBeIHRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdKQogCQkgICAgJiAoMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSkpICE9IDA7CiB9Ci0KKy8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKKyAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgorICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCisgKgorICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvbWUgb2YgdGhlIGNoZWNrCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCisgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCisgKi8KK3Byb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgeworCWlmICghZXhwcmVzc2lvbikKKwkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGV4cHJlc3Npb247Cit9CiBwdWJsaWMgdm9pZCBtYXJrQXNDb21wYXJlZEVxdWFsVG9Ob25OdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CiAJLy8gcHJvdGVjdGVkIGZyb20gbm9uLW9iamVjdCBsb2NhbHMgaW4gY2FsbGluZyBtZXRob2RzCiAJaWYgKHRoaXMgIT0gREVBRF9FTkQpIHsKQEAgLTk1Myw3ICsxMDE3LDcgQEAKIAkJLy8gcG9zaXRpb24gaXMgemVyby1iYXNlZAogCQlpZiAoKHBvc2l0aW9uID0gbG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQpIDwgQml0Q2FjaGVTaXplKSB7CiAJCQkvLyB1c2UgYml0cwotCQkJaWYgKCgobWFzayA9IDFMIDw8IHBvc2l0aW9uKSAKKwkJCWlmICgoKG1hc2sgPSAxTCA8PCBwb3NpdGlvbikKIAkJCQkmIChhMSA9IHRoaXMubnVsbEJpdDEpCiAJCQkJJiAobmEyID0gfihhMiA9IHRoaXMubnVsbEJpdDIpKQogCQkJCSYgfihhMyA9IHRoaXMubnVsbEJpdDMpCkBAIC05NzIsMTEgKzEwMzYsMTMgQEAKIAkJCSAgCX0KIAkJCX0KIAkJCXRoaXMubnVsbEJpdDEgfD0gbWFzazsKLQkJCXRoaXMubnVsbEJpdDMgfD0gbWFzazsgCi0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxNSkgewotCQkJICAJdGhpcy5udWxsQml0NCA9IH4wOworCQkJdGhpcy5udWxsQml0MyB8PSBtYXNrOworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAxNSkgeworCQkJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKwkJCQl9CiAJCQl9Ci0JCX0gCisJCX0KIAkJZWxzZSB7CiAJCQkvLyB1c2UgZXh0cmEgdmVjdG9yCiAJCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKQEAgLTk4Niw4ICsxMDUyLDEwIEBACiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CiAJCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tsZW5ndGhdOwogCQkJCX0KLQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxNikgewotCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAxNiIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMTYpIHsKKwkJCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkNPVkVSQUdFIDE2Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWVsc2UgewpAQCAtOTk1LDE3ICsxMDYzLDE5IEBACiAJCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCkpIHsKIAkJCQkJaW50IG5ld0xlbmd0aCA9IHZlY3RvckluZGV4ICsgMTsKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAotCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbmV3TGVuZ3RoXSksIDAsIAorCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbmV3TGVuZ3RoXSksIDAsCiAJCQkJCQkJb2xkTGVuZ3RoKTsKIAkJCQkJfQotCQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAxNykgewotCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMTciKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMTcpIHsKKwkJCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAxNyIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQkvLyBNQUNSTyA6J2IsJ2VzL251bGxCaXRcKC5cKS9leHRyYVtcMSArIDFdW3ZlY3RvckluZGV4XS9nYwotCQkJaWYgKCgobWFzayA9IDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpIAorCQkJaWYgKCgobWFzayA9IDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpCiAgIAkJCQkmIChhMSA9IHRoaXMuZXh0cmFbMSArIDFdW3ZlY3RvckluZGV4XSkKICAgCQkJCSYgKG5hMiA9IH4oYTIgPSB0aGlzLmV4dHJhWzIgKyAxXVt2ZWN0b3JJbmRleF0pKQogICAJCQkJJiB+KGEzID0gdGhpcy5leHRyYVszICsgMV1bdmVjdG9ySW5kZXhdKQpAQCAtMTAyNCw5ICsxMDk0LDExIEBACiAgIAkJCSAgCX0KICAgCQkJfQogICAJCQl0aGlzLmV4dHJhWzEgKyAxXVt2ZWN0b3JJbmRleF0gfD0gbWFzazsKLSAgCQkJdGhpcy5leHRyYVszICsgMV1bdmVjdG9ySW5kZXhdIHw9IG1hc2s7IAotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMTgpIHsKLQkJCSAgCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisgIAkJCXRoaXMuZXh0cmFbMyArIDFdW3ZlY3RvckluZGV4XSB8PSBtYXNrOworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmIChDb3ZlcmFnZVRlc3RJZCA9PSAxOCkgeworCQkJCSAgCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMTA0Miw3ICsxMTE0LDcgQEAKIAkJaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgewogCQkJLy8gdXNlIGJpdHMKIAkJCWlmICgoKG1hc2sgPSAxTCA8PCBwb3NpdGlvbikgJiB0aGlzLm51bGxCaXQxKSAhPSAwKSB7Ci0gIAkJCSAgCWlmICgobWFzayAgCisgIAkJCSAgCWlmICgobWFzawogICAJCQkgIAkJJiAofnRoaXMubnVsbEJpdDIgfCB0aGlzLm51bGxCaXQzCiAgIAkJCSAgCQkJfCB+dGhpcy5udWxsQml0NCkpICE9IDApIHsKICAgCQkJICAJICAJdGhpcy5udWxsQml0NCAmPSB+bWFzazsKQEAgLTEwNTgsMTEgKzExMzAsMTMgQEAKICAgICAJCQl9CiAJCQl9CiAJCQl0aGlzLm51bGxCaXQxIHw9IG1hc2s7Ci0JCQl0aGlzLm51bGxCaXQyIHw9IG1hc2s7IAotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMTkpIHsKLQkJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKwkJCXRoaXMubnVsbEJpdDIgfD0gbWFzazsKKwkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZiAoQ292ZXJhZ2VUZXN0SWQgPT0gMTkpIHsKKwkJCQkgIAl0aGlzLm51bGxCaXQ0ID0gfjA7CisJCQkJfQogCQkJfQotCQl9IAorCQl9CiAJCWVsc2UgewogCQkJLy8gdXNlIGV4dHJhIHZlY3RvcgogCQkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CkBAIC0xMDczLDggKzExNDcsMTAgQEAKIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKIAkJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aCBdOwogCQkJCX0KLQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyMCkgewotCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAyMCIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAyMCkgeworCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMjAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJZWxzZSB7CkBAIC0xMDgyLDE3ICsxMTU4LDE5IEBACiAJCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCkpIHsKIAkJCQkJaW50IG5ld0xlbmd0aCA9IHZlY3RvckluZGV4ICsgMTsKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAorCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAogCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbmV3TGVuZ3RoXSksIDAsCiAJCQkJCQkJb2xkTGVuZ3RoKTsKIAkJCQkJfQotCQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyMSkgewotCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMjEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAyMSkgeworCQkJCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkNPVkVSQUdFIDIxIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWlmICgobWFzayAmIHRoaXMuZXh0cmFbMSArIDFdW3ZlY3RvckluZGV4XSkgIT0gMCkgewotICAJCQkgIAlpZiAoKG1hc2sgIAorICAJCQkgIAlpZiAoKG1hc2sKICAgCQkJICAJCSYgKH50aGlzLmV4dHJhWzIgKyAxXVt2ZWN0b3JJbmRleF0gfCB0aGlzLmV4dHJhWzMgKyAxXVt2ZWN0b3JJbmRleF0KICAgCQkJICAJCQl8IH50aGlzLmV4dHJhWzQgKyAxXVt2ZWN0b3JJbmRleF0pKSAhPSAwKSB7CiAgIAkJCSAgCSAgCXRoaXMuZXh0cmFbNCArIDFdW3ZlY3RvckluZGV4XSAmPSB+bWFzazsKQEAgLTExMDgsNyArMTE4Niw3IEBACiAgICAgCQkJfQogCQkJfQogCQkJdGhpcy5leHRyYVsxICsgMV1bdmVjdG9ySW5kZXhdIHw9IG1hc2s7Ci0JCQl0aGlzLmV4dHJhWzIgKyAxXVt2ZWN0b3JJbmRleF0gfD0gbWFzazsgCisJCQl0aGlzLmV4dHJhWzIgKyAxXVt2ZWN0b3JJbmRleF0gfD0gbWFzazsKIAkJfQogCX0KIH0KQEAgLTExMTcsNyArMTE5NSw3IEBACiAgKiBSZWNvcmQgYSBkZWZpbml0ZSBhc3NpZ25tZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24uCiAgKi8KIGZpbmFsIHByaXZhdGUgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7Ci0JCisKIAlpZiAodGhpcyAhPSBERUFEX0VORCkgewogCQkvLyBwb3NpdGlvbiBpcyB6ZXJvLWJhc2VkCiAJCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgewpAQCAtMTEyNSw3ICsxMjAzLDcgQEAKIAkJCWxvbmcgbWFzazsKIAkJCXRoaXMuZGVmaW5pdGVJbml0cyB8PSAobWFzayA9IDFMIDw8IHBvc2l0aW9uKTsKIAkJCXRoaXMucG90ZW50aWFsSW5pdHMgfD0gbWFzazsKLQkJfSAKKwkJfQogCQllbHNlIHsKIAkJCS8vIHVzZSBleHRyYSB2ZWN0b3IKIAkJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOwpAQCAtMTEzNSwxOSArMTIxMywxOSBAQAogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewogCQkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAkJCQl9Ci0JCQl9IAorCQkJfQogCQkJZWxzZSB7CiAJCQkJaW50IG9sZExlbmd0aDsgLy8gbWlnaHQgbmVlZCB0byBncm93IHRoZSBhcnJheXMKIAkJCQlpZiAodmVjdG9ySW5kZXggPj0gKG9sZExlbmd0aCA9IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSkgewogCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwgCi0JCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwgCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsCisJCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwKIAkJCQkJCQlvbGRMZW5ndGgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJbG9uZyBtYXNrOwotCQkJdGhpcy5leHRyYVswXVt2ZWN0b3JJbmRleF0gfD0gCisJCQl0aGlzLmV4dHJhWzBdW3ZlY3RvckluZGV4XSB8PQogCQkJCShtYXNrID0gMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7CiAJCQl0aGlzLmV4dHJhWzFdW3ZlY3RvckluZGV4XSB8PSBtYXNrOwogCQl9CkBAIC0xMTc4LDIwICsxMjU2LDQxIEBACiAgICAgCQkvLyBjbGVhciBvdGhlcnMKICAgICAJCXRoaXMubnVsbEJpdDIgJj0gKG1hc2sgPSB+bWFzayk7CiAgICAgCQl0aGlzLm51bGxCaXQ0ICY9IG1hc2s7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyMikgewotICAgIAkJICAJdGhpcy5udWxsQml0MSA9IDA7CisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisgICAgCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMjIpIHsKKwkgICAgCQkgIAl0aGlzLm51bGxCaXQxID0gMDsKKyAgICAJCQl9CiAgICAgCQl9Ci0gICAgCX0gCisgICAgCX0KICAgICAJZWxzZSB7CiAgICAgCQkvLyB1c2UgZXh0cmEgdmVjdG9yCi0gICAgCQlpbnQgdmVjdG9ySW5kZXggOwotICAgIAkJdGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxXSAKKyAgICAJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworICAgIAkJaWYgKHRoaXMuZXh0cmEgPT0gbnVsbCkgeworICAgIAkJCWludCBsZW5ndGggPSB2ZWN0b3JJbmRleCArIDE7CisgICAgCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOworICAgIAkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCQllbHNlIHsKKyAgICAJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworICAgIAkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpKSB7CisgICAgCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorICAgIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisgICAgCQkJCQkJb2xkTGVuZ3RoKTsKKyAgICAJCQkJfQorICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCXRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXhdCiAgICAgCQkgICAgfD0gKG1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKTsKICAgICAJCXRoaXMuZXh0cmFbNF1bdmVjdG9ySW5kZXhdIHw9IG1hc2s7CiAgICAgCQl0aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSAmPSAobWFzayA9IH5tYXNrKTsKICAgICAJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdICY9IG1hc2s7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyMykgewotICAgIAkJCXRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXhdID0gMDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAyMykgeworCSAgICAJCQl0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSA9IDA7CisgICAgCQkJfQogICAgIAkJfQogICAgIAl9CiAJfQpAQCAtMTIxMSwyMCArMTMxMCw0MSBAQAogICAgIAkJLy8gY2xlYXIgb3RoZXJzCiAgICAgCQl0aGlzLm51bGxCaXQzICY9IChtYXNrID0gfm1hc2spOwogICAgIAkJdGhpcy5udWxsQml0NCAmPSBtYXNrOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMjQpIHsKLSAgICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAyNCkgeworCSAgICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgICAJCQl9CiAgICAgCQl9Ci0gICAgCX0gCisgICAgCX0KICAgICAJZWxzZSB7CiAgICAgCQkvLyB1c2UgZXh0cmEgdmVjdG9yCi0gICAgCQlpbnQgdmVjdG9ySW5kZXggOwotICAgIAkJdGhpcy5leHRyYVsyXVt2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxXSAKKyAgICAJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworICAgIAkJaWYgKHRoaXMuZXh0cmEgPT0gbnVsbCkgeworICAgIAkJCWludCBsZW5ndGggPSB2ZWN0b3JJbmRleCArIDE7CisgICAgCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOworICAgIAkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCQllbHNlIHsKKyAgICAJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworICAgIAkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpKSB7CisgICAgCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworICAgIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorICAgIAkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisgICAgCQkJCQkJb2xkTGVuZ3RoKTsKKyAgICAJCQkJfQorICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCXRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXhdCiAgICAgCQkgICAgfD0gKG1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKTsKICAgICAJCXRoaXMuZXh0cmFbM11bdmVjdG9ySW5kZXhdIHw9IG1hc2s7CiAgICAgCQl0aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSAmPSAobWFzayA9IH5tYXNrKTsKICAgICAJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdICY9IG1hc2s7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAyNSkgewotICAgIAkJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisgICAgCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMjUpIHsKKwkgICAgCQkJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSB+MDsKKyAgICAJCQl9CiAgICAgCQl9CiAgICAgCX0KIAl9CkBAIC0xMjUxLDQwICsxMzcxLDI0MSBAQAogCQkJLy8gY2xlYXIgb3RoZXJzCiAJCQl0aGlzLm51bGxCaXQyICY9IChtYXNrID0gfm1hc2spOwogCQkJdGhpcy5udWxsQml0MyAmPSBtYXNrOwotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMjYpIHsKLQkJCSAgCXRoaXMubnVsbEJpdDQgPSAwOworCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDI2KSB7CisJCQkJICAJdGhpcy5udWxsQml0NCA9IDA7CisJCQkJfQogCQkJfQotCQl9IAorCQl9CiAJCWVsc2UgewogCQkJLy8gdXNlIGV4dHJhIHZlY3RvcgotCQkJaW50IHZlY3RvckluZGV4IDsKLQkJCXRoaXMuZXh0cmFbMl1bdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMV0gCisJCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKKwkJCWlmICh0aGlzLmV4dHJhID09IG51bGwpIHsKKwkJCQlpbnQgbGVuZ3RoID0gdmVjdG9ySW5kZXggKyAxOworCQkJCXRoaXMuZXh0cmEgPSBuZXcgbG9uZ1tleHRyYUxlbmd0aF1bXTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKKwkJCQkJdGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aF07CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaW50IG9sZExlbmd0aDsgLy8gbWlnaHQgbmVlZCB0byBncm93IHRoZSBhcnJheXMKKwkJCQlpZiAodmVjdG9ySW5kZXggPj0gKG9sZExlbmd0aCA9IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSkgeworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVtqXSwgMCwKKwkJCQkJCQkodGhpcy5leHRyYVtqXSA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLAorCQkJCQkJCW9sZExlbmd0aCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XQogCQkJICAgIHw9IChtYXNrID0gMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7CiAJCQl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSB8PSBtYXNrOwogCQkJdGhpcy5leHRyYVszXVt2ZWN0b3JJbmRleF0gJj0gKG1hc2sgPSB+bWFzayk7CiAJCQl0aGlzLmV4dHJhWzRdW3ZlY3RvckluZGV4XSAmPSBtYXNrOwotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMjcpIHsKLQkJCQl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IDA7CisJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMjcpIHsKKwkJCQkJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSAwOworCQkJCX0KIAkJCX0KIAkJfQogCX0KIH0KIAorcHVibGljIHZvaWQgcmVzZXROdWxsSW5mbyhMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCWlmICh0aGlzICE9IERFQURfRU5EKSB7CisJCXRoaXMudGFnQml0cyB8PSBOVUxMX0ZMQUdfTUFTSzsKKyAgICAgICAgaW50IHBvc2l0aW9uOworICAgICAgICBsb25nIG1hc2s7CisgICAgICAgIGlmICgocG9zaXRpb24gPSBsb2NhbC5pZCArIHRoaXMubWF4RmllbGRDb3VudCkgPCBCaXRDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIC8vIHVzZSBiaXRzCisgICAgICAgICAgICB0aGlzLm51bGxCaXQxICY9IChtYXNrID0gfigxTCA8PCBwb3NpdGlvbikpOworICAgICAgICAgICAgdGhpcy5udWxsQml0MiAmPSBtYXNrOworICAgICAgICAgICAgdGhpcy5udWxsQml0MyAmPSBtYXNrOworICAgICAgICAgICAgdGhpcy5udWxsQml0NCAmPSBtYXNrOworICAgICAgICB9IGVsc2UgeworICAgIAkJLy8gdXNlIGV4dHJhIHZlY3RvcgorICAgIAkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CisgICAgCQlpZiAodGhpcy5leHRyYSA9PSBudWxsIHx8IHZlY3RvckluZGV4ID49IHRoaXMuZXh0cmFbMl0ubGVuZ3RoKSB7CisgICAgCQkJLy8gaW4gY2FzZSB3ZSBhdHRlbXB0IHRvIHJlc2V0IHRoZSBudWxsIGluZm8gb2YgYSB2YXJpYWJsZSB0aGF0IGhhcyBub3QgYmVlbiBlbmNvdW50ZXJlZAorICAgIAkJCS8vIGJlZm9yZSBhbmQgZm9yIHdoaWNoIG5vIG51bGwgYml0cyBleGlzdC4KKyAgICAJCQlyZXR1cm47CisgICAgCQl9CisgICAgCQl0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XQorICAgIAkJICAgICY9IChtYXNrID0gfigxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSk7CisgICAgCQl0aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSAmPSBtYXNrOworICAgIAkJdGhpcy5leHRyYVs0XVt2ZWN0b3JJbmRleF0gJj0gbWFzazsKKyAgICAJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdICY9IG1hc2s7CisgICAgCX0KKwl9Cit9CisKKy8qKgorICogTWFyayBhIGxvY2FsIGFzIHBvdGVudGlhbGx5IGhhdmluZyBiZWVuIGFzc2lnbmVkIHRvIGFuIHVua25vd24gdmFsdWUuCisgKiBAcGFyYW0gbG9jYWwgdGhlIGxvY2FsIHRvIG1hcmsKKyAqLworcHVibGljIHZvaWQgbWFya1BvdGVudGlhbGx5VW5rbm93bkJpdChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCS8vIHByb3RlY3RlZCBmcm9tIG5vbi1vYmplY3QgbG9jYWxzIGluIGNhbGxpbmcgbWV0aG9kcworCWlmICh0aGlzICE9IERFQURfRU5EKSB7CisJCXRoaXMudGFnQml0cyB8PSBOVUxMX0ZMQUdfTUFTSzsKKyAgICAgICAgaW50IHBvc2l0aW9uOworICAgICAgICBsb25nIG1hc2s7CisgICAgICAgIGlmICgocG9zaXRpb24gPSBsb2NhbC5pZCArIHRoaXMubWF4RmllbGRDb3VudCkgPCBCaXRDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIC8vIHVzZSBiaXRzCisgICAgICAgIAltYXNrID0gMUwgPDwgcG9zaXRpb247CisgICAgICAgIAlpc1RydWUoKHRoaXMubnVsbEJpdDEgJiBtYXNrKSA9PSAwLCAiQWRkaW5nICd1bmtub3duJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhpcy5udWxsQml0NCB8PSBtYXNrOworICAgICAgICAgICAgaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDQ2KSB7CisJCQkJICAJdGhpcy5udWxsQml0NCA9IH4wOworCQkJCX0KKwkJCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKyAgICAJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworICAgIAkJaWYgKHRoaXMuZXh0cmEgPT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSB2ZWN0b3JJbmRleCArIDE7CisJCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworCQkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworCQkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpKSB7CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisJCQkJCQkJb2xkTGVuZ3RoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyAgICAJCW1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpOworICAgIAkJaXNUcnVlKCh0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3Vua25vd24nIG1hcmsgaW4gdW5leHBlY3RlZCBzdGF0ZSIpOyAvLyROT04tTkxTLTEkCisgICAgCQl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSB8PSBtYXNrOworICAgIAkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDQ3KSB7CisJCQkJCXRoaXMuZXh0cmFbNV1bdmVjdG9ySW5kZXhdID0gfjA7CisJCQkJfQorCQkJfQorICAgIAl9CisJfQorfQorCitwdWJsaWMgdm9pZCBtYXJrUG90ZW50aWFsbHlOdWxsQml0KExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJaWYgKHRoaXMgIT0gREVBRF9FTkQpIHsKKwkJdGhpcy50YWdCaXRzIHw9IE5VTExfRkxBR19NQVNLOworICAgICAgICBpbnQgcG9zaXRpb247CisgICAgICAgIGxvbmcgbWFzazsKKyAgICAgICAgaWYgKChwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50KSA8IEJpdENhY2hlU2l6ZSkgeworICAgICAgICAgICAgLy8gdXNlIGJpdHMKKyAgICAgICAgCW1hc2sgPSAxTCA8PCBwb3NpdGlvbjsKKyAgICAgICAgCWlzVHJ1ZSgodGhpcy5udWxsQml0MSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3BvdGVudGlhbGx5IG51bGwnIG1hcmsgaW4gdW5leHBlY3RlZCBzdGF0ZSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aGlzLm51bGxCaXQyIHw9IG1hc2s7CisgICAgICAgICAgICBpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gNDApIHsKKwkJCQkgIAl0aGlzLm51bGxCaXQ0ID0gfjA7CisJCQkJfQorCQkJfQorICAgICAgICB9IGVsc2UgeworICAgIAkJLy8gdXNlIGV4dHJhIHZlY3RvcgorICAgIAkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CisgICAgCQlpZiAodGhpcy5leHRyYSA9PSBudWxsKSB7CisJCQkJaW50IGxlbmd0aCA9IHZlY3RvckluZGV4ICsgMTsKKwkJCQl0aGlzLmV4dHJhID0gbmV3IGxvbmdbZXh0cmFMZW5ndGhdW107CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CisJCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCWludCBvbGRMZW5ndGg7IC8vIG1pZ2h0IG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXlzCisJCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCkpIHsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsCisJCQkJCQkJKHRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwKKwkJCQkJCQlvbGRMZW5ndGgpOworCQkJCQl9CisJCQkJfQorCQkJfQorICAgIAkJbWFzayA9IDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSk7CisgICAgCQl0aGlzLmV4dHJhWzNdW3ZlY3RvckluZGV4XSB8PSBtYXNrOworICAgIAkJaXNUcnVlKCh0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3BvdGVudGlhbGx5IG51bGwnIG1hcmsgaW4gdW5leHBlY3RlZCBzdGF0ZSIpOyAvLyROT04tTkxTLTEkCisgICAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gNDEpIHsKKwkJCQkJdGhpcy5leHRyYVs1XVt2ZWN0b3JJbmRleF0gPSB+MDsKKwkJCQl9CisJCQl9CisgICAgCX0KKwl9Cit9CisKK3B1YmxpYyB2b2lkIG1hcmtQb3RlbnRpYWxseU5vbk51bGxCaXQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlpZiAodGhpcyAhPSBERUFEX0VORCkgeworCQl0aGlzLnRhZ0JpdHMgfD0gTlVMTF9GTEFHX01BU0s7CisgICAgICAgIGludCBwb3NpdGlvbjsKKyAgICAgICAgbG9uZyBtYXNrOworICAgICAgICBpZiAoKHBvc2l0aW9uID0gbG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQpIDwgQml0Q2FjaGVTaXplKSB7CisgICAgICAgICAgICAvLyB1c2UgYml0cworICAgICAgICAJbWFzayA9IDFMIDw8IHBvc2l0aW9uOworICAgICAgICAJaXNUcnVlKCh0aGlzLm51bGxCaXQxICYgbWFzaykgPT0gMCwgIkFkZGluZyAncG90ZW50aWFsbHkgbm9uLW51bGwnIG1hcmsgaW4gdW5leHBlY3RlZCBzdGF0ZSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aGlzLm51bGxCaXQzIHw9IG1hc2s7CisgICAgICAgICAgICBpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gNDIpIHsKKwkJCQkgIAl0aGlzLm51bGxCaXQ0ID0gfjA7CisJCQkJfQorCQkJfQorICAgICAgICB9IGVsc2UgeworICAgIAkJLy8gdXNlIGV4dHJhIHZlY3RvcgorICAgIAkJaW50IHZlY3RvckluZGV4ICA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworICAgIAkJaWYgKHRoaXMuZXh0cmEgPT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSB2ZWN0b3JJbmRleCArIDE7CisJCQkJdGhpcy5leHRyYSA9IG5ldyBsb25nW2V4dHJhTGVuZ3RoXVtdOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworCQkJCQl0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworCQkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpKSB7CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAorCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsCisJCQkJCQkJb2xkTGVuZ3RoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyAgICAJCW1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpOworICAgIAkJaXNUcnVlKCh0aGlzLmV4dHJhWzJdW3ZlY3RvckluZGV4XSAmIG1hc2spID09IDAsICJBZGRpbmcgJ3BvdGVudGlhbGx5IG5vbi1udWxsJyBtYXJrIGluIHVuZXhwZWN0ZWQgc3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorICAgIAkJdGhpcy5leHRyYVs0XVt2ZWN0b3JJbmRleF0gfD0gbWFzazsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSA0MykgeworCQkJCQl0aGlzLmV4dHJhWzVdW3ZlY3RvckluZGV4XSA9IH4wOworCQkJCX0KKwkJCX0KKyAgICAJfQorCX0KK30KKwogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7Ci0JaWYgKChvdGhlckluaXRzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRSkgIT0gMCAmJiB0aGlzICE9IERFQURfRU5EKSB7Ci0JCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDI4KSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAyOCIpOyAvLyROT04tTkxTLTEkCisJaWYgKChvdGhlckluaXRzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwICYmIHRoaXMgIT0gREVBRF9FTkQpIHsKKwkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMjgpIHsKKwkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAyOCIpOyAvLyROT04tTkxTLTEkCisJCQl9CiAJCX0KKwkJY29tYmluZU51bGxTdGF0dXNDaGFuZ2VJbkFzc2VydEluZm8ob3RoZXJJbml0cyk7CiAJCXJldHVybiB0aGlzOwogCX0KLQlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSAhPSAwKSB7Ci0JCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDI5KSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAyOSIpOyAvLyROT04tTkxTLTEkCisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBVTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSB7CisJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCWlmKENvdmVyYWdlVGVzdElkID09IDI5KSB7CisJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMjkiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogCQl9CisJCW90aGVySW5pdHMuY29tYmluZU51bGxTdGF0dXNDaGFuZ2VJbkFzc2VydEluZm8odGhpcyk7CiAJCXJldHVybiAoVW5jb25kaXRpb25hbEZsb3dJbmZvKSBvdGhlckluaXRzLmNvcHkoKTsgLy8gbWFrZSBzdXJlIG90aGVySW5pdHMgd29uJ3QgYmUgYWZmZWN0ZWQKLQl9IAotCQotCS8vIGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCisJfQorCisJLy8gaW50ZXJzZWN0aW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLAogCXRoaXMuZGVmaW5pdGVJbml0cyAmPSBvdGhlckluaXRzLmRlZmluaXRlSW5pdHM7CiAJLy8gdW5pb24gb2YgcG90ZW50aWFsbHkgc2V0IG9uZXMKIAl0aGlzLnBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CkBAIC0xMjk0LDIwICsxNjE1LDMwIEBACiAJCXRoaXNIYXNOdWxscyA9ICh0aGlzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgIT0gMCwKIAkJb3RoZXJIYXNOdWxscyA9IChvdGhlckluaXRzLnRhZ0JpdHMgJiBOVUxMX0ZMQUdfTUFTSykgIT0gMCwKIAkJdGhpc0hhZE51bGxzID0gdGhpc0hhc051bGxzOwotCWxvbmcgCi0JCWExLCBhMiwgYTMsIGE0LCAgCi0JCW5hMSwgbmEyLCBuYTMsIG5hNCwgCisJbG9uZworCQlhMSwgYTIsIGEzLCBhNCwKKwkJbmExLCBuYTIsIG5hMywgbmE0LAogCQluYjEsIG5iMiwgbmIzLCBuYjQsCiAJCWIxLCBiMiwgYjMsIGI0OwotCWlmICh0aGlzSGFkTnVsbHMpIHsKKwlpZiAoKG90aGVySW5pdHMudGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUykgIT0gMCkgeworCQlvdGhlckhhc051bGxzID0gZmFsc2U7IC8vIHNraXAgbWVyZ2luZywgb3RoZXJJbml0cyBpcyB1bnJlYWNoYWJsZSBieSBudWxsIGFuYWx5c2lzCisJfSBlbHNlIGlmICgodGhpcy50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfQllfTlVMTEFOQUxZU0lTKSAhPSAwKSB7IC8vIGRpcmVjdGx5IGNvcHkgaWYgdGhpcyBpcyB1bnJlYWNoYWJsZSBieSBudWxsIGFuYWx5c2lzCisJCXRoaXMubnVsbEJpdDEgPSBvdGhlckluaXRzLm51bGxCaXQxOworCQl0aGlzLm51bGxCaXQyID0gb3RoZXJJbml0cy5udWxsQml0MjsKKwkJdGhpcy5udWxsQml0MyA9IG90aGVySW5pdHMubnVsbEJpdDM7CisJCXRoaXMubnVsbEJpdDQgPSBvdGhlckluaXRzLm51bGxCaXQ0OworCQl0aGlzSGFkTnVsbHMgPSBmYWxzZTsKKwkJdGhpc0hhc051bGxzID0gb3RoZXJIYXNOdWxsczsKKwkJdGhpcy50YWdCaXRzID0gb3RoZXJJbml0cy50YWdCaXRzOworCX0gZWxzZSBpZiAodGhpc0hhZE51bGxzKSB7CiAgICAgCWlmIChvdGhlckhhc051bGxzKSB7Ci0gICAgCQl0aGlzLm51bGxCaXQxID0gKGEyID0gdGhpcy5udWxsQml0MikgJiAoYTMgPSB0aGlzLm51bGxCaXQzKSAKLSAgICAJCQkJCQkJJiAoYTQgPSB0aGlzLm51bGxCaXQ0KSAmIChiMSA9IG90aGVySW5pdHMubnVsbEJpdDEpIAorICAgIAkJdGhpcy5udWxsQml0MSA9IChhMiA9IHRoaXMubnVsbEJpdDIpICYgKGEzID0gdGhpcy5udWxsQml0MykKKyAgICAJCQkJCQkJJiAoYTQgPSB0aGlzLm51bGxCaXQ0KSAmIChiMSA9IG90aGVySW5pdHMubnVsbEJpdDEpCiAgICAgCQkJCQkJCSYgKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLm51bGxCaXQyKSkKLSAgICAgICAgICAgICAgICAgIAkJCXwgKGExID0gdGhpcy5udWxsQml0MSkgJiAoYjEgJiAoYTMgJiBhNCAmIChiMyA9IG90aGVySW5pdHMubnVsbEJpdDMpIAorICAgICAgICAgICAgICAgICAgCQkJfCAoYTEgPSB0aGlzLm51bGxCaXQxKSAmIChiMSAmIChhMyAmIGE0ICYgKGIzID0gb3RoZXJJbml0cy5udWxsQml0MykKICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkmIChiNCA9IG90aGVySW5pdHMubnVsbEJpdDQpCi0gICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQl8IChuYTIgPSB+YTIpICYgbmIyIAotICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCSYgKChuYjQgPSB+YjQpIHwgKG5hNCA9IH5hNCkgCisgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQl8IChuYTIgPSB+YTIpICYgbmIyCisgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJJiAoKG5iNCA9IH5iNCkgfCAobmE0ID0gfmE0KQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJfCAobmEzID0gfmEzKSAmIChuYjMgPSB+YjMpKQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJfCBhMiAmIGIyICYgKChuYTQgfCBuYTMpICYgKG5iNAl8IG5iMykpKQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQl8IG5hMiAmIGIyICYgYjMgJiBiNCk7CkBAIC0xMzI3LDE3ICsxNjU4LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAJCQl8IG5hMiAmIChuYjMgfCBuYjIpKQogICAgICAgICAgICAgICAgIAkJCXwgbmEyICYgYjMgJiBiNAogICAgICAgICAgICAgICAgIAkJCXwgYTIgJiAobmIxICYgYjQgfCBhMyAmIG5hNCAmIGIxKSAmIG5iMyk7Ci0gICAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAzMCkgewotICAgIAkJICAJdGhpcy5udWxsQml0NCA9IH4wOworICAgIAkJLy8gdGhlIGFib3ZlIGZvcm11bGFlIGRvIG5vdCBoYW5kbGUgdGhlIHN0YXRlIDAxMTEsIGRvIGl0IG5vdyBleHBsaWNpdGx5OgorICAgIAkJbG9uZyBheCA9IH5hMSAmIGEyICYgYTMgJiBhNDsKKyAgICAJCWxvbmcgYnggPSB+YjEgJiBiMiAmIGIzICYgYjQ7CisgICAgCQlsb25nIHggPSBheHxieDsKKyAgICAJCWlmICh4ICE9IDApIHsKKyAgICAJCQkvLyByZXN0b3JlIHN0YXRlIDAxMTEgZm9yIGFsbCB2YXJpYWJsZSBpZHMgaW4geDoKKyAgICAJCQl0aGlzLm51bGxCaXQxICY9IH54OworICAgIAkJCXRoaXMubnVsbEJpdDIgfD0geDsKKyAgICAJCQl0aGlzLm51bGxCaXQzIHw9IHg7CisgICAgCQkJdGhpcy5udWxsQml0NCB8PSB4OwogICAgIAkJfQotICAgIAl9IGVsc2UgeyAvLyBvdGhlciBoYXMgbm8gbnVsbCBpbmZvIAorCQkKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAzMCkgeworCSAgICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCX0gZWxzZSB7IC8vIG90aGVyIGhhcyBubyBudWxsIGluZm8KICAgICAJCWExID0gdGhpcy5udWxsQml0MTsKICAgICAgIAkJdGhpcy5udWxsQml0MSA9IDA7CiAgICAgICAJCXRoaXMubnVsbEJpdDIgPSAoYTIgPSB0aGlzLm51bGxCaXQyKSAmIChuYTMgPSB+KGEzID0gdGhpcy5udWxsQml0MykgfCAobmExID0gfmExKSk7CiAgICAgICAJCXRoaXMubnVsbEJpdDMgPSBhMyAmICgobmEyID0gfmEyKSAmIChhNCA9IHRoaXMubnVsbEJpdDQpIHwgbmExKSB8IGExICYgbmEyICYgfmE0OwogICAgICAgCQl0aGlzLm51bGxCaXQ0ID0gKG5hMyB8IG5hMikgJiBuYTEgJiBhNAl8IGExICYgbmEzICYgbmEyOwotICAgIAkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzEpIHsKLSAgICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgICAJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKyAgICAJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAzMSkgeworCSAgICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgICAJCQl9CiAgICAgCQl9CiAgICAgCX0KIAl9IGVsc2UgaWYgKG90aGVySGFzTnVsbHMpIHsgLy8gb25seSBvdGhlciBoYWQgbnVsbHMKQEAgLTEzNDUsOCArMTY5MiwxMCBAQAogICAJCXRoaXMubnVsbEJpdDIgPSAoYjIgPSBvdGhlckluaXRzLm51bGxCaXQyKSAmIChuYjMgPSB+KGIzID0gb3RoZXJJbml0cy5udWxsQml0MykgfCAobmIxID0gfihiMSA9IG90aGVySW5pdHMubnVsbEJpdDEpKSk7CiAgIAkJdGhpcy5udWxsQml0MyA9IGIzICYgKChuYjIgPSB+YjIpICYgKGI0ID0gb3RoZXJJbml0cy5udWxsQml0NCkgfCBuYjEpIHwgYjEgJiBuYjIgJiB+YjQ7CiAgIAkJdGhpcy5udWxsQml0NCA9IChuYjMgfCBuYjIpICYgbmIxICYgYjQJfCBiMSAmIG5iMyAmIG5iMjsKLSAgCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAzMikgewotICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisgIAkJCWlmKENvdmVyYWdlVGVzdElkID09IDMyKSB7CisJICAJCSAgCXRoaXMubnVsbEJpdDQgPSB+MDsKKyAgCQkJfQogICAJCX0KICAgICAJdGhpc0hhc051bGxzID0KICAgICAJCS8vIHJlZHVuZGFudCB3aXRoIHRoZSB0aHJlZSBmb2xsb3dpbmcgb25lcwpAQCAtMTM2MywzNSArMTcxMiw0MSBAQAogCQkJaWYgKG90aGVySW5pdHMuZXh0cmEgIT0gbnVsbCkgewogCQkJCS8vIGJvdGggc2lkZXMgaGF2ZSBleHRyYSBzdG9yYWdlCiAJCQkJaW50IGxlbmd0aCwgb3RoZXJMZW5ndGg7Ci0JCQkJaWYgKChsZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCkgPCAKKwkJCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSA8CiAJCQkJCQkob3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhWzBdLmxlbmd0aCkpIHsKLQkJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIHNob3J0ZXIgLT4gZ3JvdyBjdXJyZW50IAorCQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIDAsIAorCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCAwLAogCQkJCQkJCSh0aGlzLmV4dHJhW2pdID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJCQkJfQogCQkJCQltZXJnZUxpbWl0ID0gbGVuZ3RoOwogCQkJCQljb3B5TGltaXQgPSBvdGhlckxlbmd0aDsKLQkJCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzMpIHsKLQkJCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkNPVkVSQUdFIDMzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMzMpIHsKKwkJCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAzMyIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IAorCQkJCX0KIAkJCQllbHNlIHsKIAkJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIGxvbmdlcgogCQkJCQltZXJnZUxpbWl0ID0gb3RoZXJMZW5ndGg7CiAJCQkJCXJlc2V0TGltaXQgPSBsZW5ndGg7Ci0JCQkJCWlmIChjb3ZlcmFnZVRlc3RGbGFnICYmIGNvdmVyYWdlVGVzdElkID09IDM0KSB7Ci0JCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAzNCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQkJCWlmKENvdmVyYWdlVGVzdElkID09IDM0KSB7CisJCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMzQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJfSAKKwkJCX0KIAkJCWVsc2UgewogCQkJCXJlc2V0TGltaXQgPSB0aGlzLmV4dHJhWzBdLmxlbmd0aDsKLQkJCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAzNSkgewotCQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAzNSIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKENPVkVSQUdFX1RFU1RfRkxBRykgeworCQkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAzNSkgeworCQkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMzUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IAorCQl9CiAJCWVsc2UgaWYgKG90aGVySW5pdHMuZXh0cmEgIT0gbnVsbCkgewogCQkJLy8gbm8gc3RvcmFnZSBoZXJlLCBidXQgb3RoZXIgaGFzIGV4dHJhIHN0b3JhZ2UuCiAJCQlpbnQgb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhWzBdLmxlbmd0aDsKQEAgLTEzOTksMTEgKzE3NTQsMTMgQEAKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewogCQkJCXRoaXMuZXh0cmFbal0gPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF07CiAJCQl9Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFbMV0sIDAsIAorCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLmV4dHJhWzFdLCAwLAogCQkJCXRoaXMuZXh0cmFbMV0sIDAsIG90aGVyTGVuZ3RoKTsKIAkJCWNvcHlMaW1pdCA9IG90aGVyTGVuZ3RoOwotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzYpIHsKLQkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJDT1ZFUkFHRSAzNiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMzYpIHsKKwkJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ09WRVJBR0UgMzYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KIAkJCX0KIAkJfQogICAgICAgICAvLyBNQUNSTyA6J2IsJ2VzL251bGxCaXRcKC5cKS9leHRyYVtcMSArIDFdW2ldL2cKQEAgLTE0MzEsMTMgKzE3ODgsMTMgQEAKIAkJfQogCQkvLyBjb21wb3NlIG51bGxzCiAJCWZvciAoaSA9IDA7IGkgPCBtZXJnZUxpbWl0OyBpKyspIHsKLSAgICAJCXRoaXMuZXh0cmFbMSArIDFdW2ldID0gKGEyID0gdGhpcy5leHRyYVsyICsgMV1baV0pICYgKGEzID0gdGhpcy5leHRyYVszICsgMV1baV0pIAotICAgIAkJCQkJCQkmIChhNCA9IHRoaXMuZXh0cmFbNCArIDFdW2ldKSAmIChiMSA9IG90aGVySW5pdHMuZXh0cmFbMSArIDFdW2ldKSAKKyAgICAJCXRoaXMuZXh0cmFbMSArIDFdW2ldID0gKGEyID0gdGhpcy5leHRyYVsyICsgMV1baV0pICYgKGEzID0gdGhpcy5leHRyYVszICsgMV1baV0pCisgICAgCQkJCQkJCSYgKGE0ID0gdGhpcy5leHRyYVs0ICsgMV1baV0pICYgKGIxID0gb3RoZXJJbml0cy5leHRyYVsxICsgMV1baV0pCiAgICAgCQkJCQkJCSYgKG5iMiA9IH4oYjIgPSBvdGhlckluaXRzLmV4dHJhWzIgKyAxXVtpXSkpCi0gICAgICAgICAgICAgICAgICAJCQl8IChhMSA9IHRoaXMuZXh0cmFbMSArIDFdW2ldKSAmIChiMSAmIChhMyAmIGE0ICYgKGIzID0gb3RoZXJJbml0cy5leHRyYVszICsgMV1baV0pIAorICAgICAgICAgICAgICAgICAgCQkJfCAoYTEgPSB0aGlzLmV4dHJhWzEgKyAxXVtpXSkgJiAoYjEgJiAoYTMgJiBhNCAmIChiMyA9IG90aGVySW5pdHMuZXh0cmFbMyArIDFdW2ldKQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCSYgKGI0ID0gb3RoZXJJbml0cy5leHRyYVs0ICsgMV1baV0pCi0gICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQl8IChuYTIgPSB+YTIpICYgbmIyIAotICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCSYgKChuYjQgPSB+YjQpIHwgKG5hNCA9IH5hNCkgCisgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQl8IChuYTIgPSB+YTIpICYgbmIyCisgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJJiAoKG5iNCA9IH5iNCkgfCAobmE0ID0gfmE0KQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJfCAobmEzID0gfmEzKSAmIChuYjMgPSB+YjMpKQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJfCBhMiAmIGIyICYgKChuYTQgfCBuYTMpICYgKG5iNAl8IG5iMykpKQogICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQl8IG5hMiAmIGIyICYgYjMgJiBiNCk7CkBAIC0xNDU3LDEyICsxODE0LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAJCQl8IG5hMiAmIChuYjMgfCBuYjIpKQogICAgICAgICAgICAgICAgIAkJCXwgbmEyICYgYjMgJiBiNAogICAgICAgICAgICAgICAgIAkJCXwgYTIgJiAobmIxICYgYjQgfCBhMyAmIG5hNCAmIGIxKSAmIG5iMyk7CisgICAgCQkvLyB0aGUgYWJvdmUgZm9ybXVsYWUgZG8gbm90IGhhbmRsZSB0aGUgc3RhdGUgMDExMSwgZG8gaXQgbm93IGV4cGxpY2l0bHk6CisgICAgCQlsb25nIGF4ID0gfmExICYgYTIgJiBhMyAmIGE0OworICAgIAkJbG9uZyBieCA9IH5iMSAmIGIyICYgYjMgJiBiNDsKKyAgICAJCWxvbmcgeCA9IGF4fGJ4OworICAgIAkJaWYgKHggIT0gMCkgeworICAgIAkJCS8vIHJlc3RvcmUgc3RhdGUgMDExMSBmb3IgYWxsIHZhcmlhYmxlIGlkcyBpbiB4OgorICAgIAkJCXRoaXMuZXh0cmFbMl1baV0gJj0gfng7CisgICAgCQkJdGhpcy5leHRyYVszXVtpXSB8PSB4OworICAgIAkJCXRoaXMuZXh0cmFbNF1baV0gfD0geDsKKyAgICAJCQl0aGlzLmV4dHJhWzVdW2ldIHw9IHg7CisgICAgCQl9CiAJCQl0aGlzSGFzTnVsbHMgPSB0aGlzSGFzTnVsbHMgfHwKIAkJCQl0aGlzLmV4dHJhWzNdW2ldICE9IDAgfHwKIAkJCQl0aGlzLmV4dHJhWzRdW2ldICE9IDAgfHwKIAkJCQl0aGlzLmV4dHJhWzVdW2ldICE9IDAgOwotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzcpIHsKLQkJCQl0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMzcpIHsKKwkJCQkJdGhpcy5leHRyYVs1XVtpXSA9IH4wOworCQkJCX0KIAkJCX0KIAkJfQogCQlmb3IgKDsgaSA8IGNvcHlMaW1pdDsgaSsrKSB7CkBAIC0xNDc0LDggKzE4NDQsMTAgQEAKIAkJCQl0aGlzLmV4dHJhWzNdW2ldICE9IDAgfHwKIAkJCQl0aGlzLmV4dHJhWzRdW2ldICE9IDAgfHwKIAkJCQl0aGlzLmV4dHJhWzVdW2ldICE9IDA7Ci0JCQlpZiAoY292ZXJhZ2VUZXN0RmxhZyAmJiBjb3ZlcmFnZVRlc3RJZCA9PSAzOCkgewotCQkJCXRoaXMuZXh0cmFbNV1baV0gPSB+MDsKKwkJCWlmIChDT1ZFUkFHRV9URVNUX0ZMQUcpIHsKKwkJCQlpZihDb3ZlcmFnZVRlc3RJZCA9PSAzOCkgeworCQkJCQl0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQkJfQogCQkJfQogCQl9CiAJCWZvciAoOyBpIDwgcmVzZXRMaW1pdDsgaSsrKSB7CkBAIC0xNDg4LDExICsxODYwLDE0IEBACiAJCQkJdGhpcy5leHRyYVszXVtpXSAhPSAwIHx8CiAJCQkJdGhpcy5leHRyYVs0XVtpXSAhPSAwIHx8CiAJCQkJdGhpcy5leHRyYVs1XVtpXSAhPSAwOwotCQkJaWYgKGNvdmVyYWdlVGVzdEZsYWcgJiYgY292ZXJhZ2VUZXN0SWQgPT0gMzkpIHsKLQkJCQl0aGlzLmV4dHJhWzVdW2ldID0gfjA7CisJCQlpZiAoQ09WRVJBR0VfVEVTVF9GTEFHKSB7CisJCQkJaWYoQ292ZXJhZ2VUZXN0SWQgPT0gMzkpIHsKKwkJCQkJdGhpcy5leHRyYVs1XVtpXSA9IH4wOworCQkJCX0KIAkJCX0KIAkJfQogCX0KKwljb21iaW5lTnVsbFN0YXR1c0NoYW5nZUluQXNzZXJ0SW5mbyhvdGhlckluaXRzKTsKIAlpZiAodGhpc0hhc051bGxzKSB7CiAJCXRoaXMudGFnQml0cyB8PSBOVUxMX0ZMQUdfTUFTSzsKIAl9CkBAIC0xNTI0LDEzICsxODk5LDE0IEBACiAJY29weS5wb3RlbnRpYWxJbml0cyA9IHRoaXMucG90ZW50aWFsSW5pdHM7CiAJY29weS50YWdCaXRzID0gdGhpcy50YWdCaXRzICYgfk5VTExfRkxBR19NQVNLOwogCWNvcHkubWF4RmllbGRDb3VudCA9IHRoaXMubWF4RmllbGRDb3VudDsKKwljb3B5Lm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQgPSB0aGlzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQ7CiAJaWYgKHRoaXMuZXh0cmEgIT0gbnVsbCkgewogCQlpbnQgbGVuZ3RoOwogCQljb3B5LmV4dHJhID0gbmV3IGxvbmdbZXh0cmFMZW5ndGhdW107Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5leHRyYVswXSwgMCwgCi0JCQkoY29weS5leHRyYVswXSA9IAorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbMF0sIDAsCisJCQkoY29weS5leHRyYVswXSA9CiAJCQkJbmV3IGxvbmdbbGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGhdKSwgMCwgbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhWzFdLCAwLCAKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhWzFdLCAwLAogCQkJKGNvcHkuZXh0cmFbMV0gPSBuZXcgbG9uZ1tsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKIAkJZm9yIChpbnQgaiA9IDI7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7CiAJCQljb3B5LmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXTsKQEAgLTE1NDQsMjIgKzE5MjAsMjYgQEAKIH0KIAogcHVibGljIEZsb3dJbmZvIHNldFJlYWNoTW9kZShpbnQgcmVhY2hNb2RlKSB7Ci0JaWYgKHJlYWNoTW9kZSA9PSBSRUFDSEFCTEUgJiYgdGhpcyAhPSBERUFEX0VORCkgeyAvLyBjYW5ub3QgbW9kaWZ5IERFQURfRU5ECisJaWYgKHRoaXMgPT0gREVBRF9FTkQpIHsvLyBjYW5ub3QgbW9kaWZ5IERFQURfRU5ECisJCXJldHVybiB0aGlzOworCX0JCisJaWYgKHJlYWNoTW9kZSA9PSBSRUFDSEFCTEUgKSB7CiAJCXRoaXMudGFnQml0cyAmPSB+VU5SRUFDSEFCTEU7Ci0JfQotCWVsc2UgeworCX0gZWxzZSBpZiAocmVhY2hNb2RlID09IFVOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUyApIHsKKwkJdGhpcy50YWdCaXRzIHw9IFVOUkVBQ0hBQkxFX0JZX05VTExBTkFMWVNJUzsJLy8gZG8gbm90IGludGVyZmVyZSB3aXRoIGRlZmluaXRlIGFzc2lnbm1lbnQgYW5hbHlzaXMKKwl9IGVsc2UgewogCQlpZiAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSA9PSAwKSB7CiAJCQkvLyByZXNldCBvcHRpb25hbCBpbml0cyB3aGVuIGJlY29taW5nIHVucmVhY2hhYmxlCiAJCQkvLyBzZWUgSW5pdGlhbGl6YXRpb25UZXN0I3Rlc3QwOTAgKGFuZCBvdGhlcnMpCiAJCQl0aGlzLnBvdGVudGlhbEluaXRzID0gMDsKIAkJCWlmICh0aGlzLmV4dHJhICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGg7IAorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmV4dHJhWzBdLmxlbmd0aDsKIAkJCQkJCWkgPCBsZW5ndGg7IGkrKykgewogCQkJCQl0aGlzLmV4dHJhWzFdW2ldID0gMDsKIAkJCQl9CiAJCQl9Ci0JCX0JCQkJCi0JCXRoaXMudGFnQml0cyB8PSBVTlJFQUNIQUJMRTsKKwkJfQorCQl0aGlzLnRhZ0JpdHMgfD0gcmVhY2hNb2RlOwogCX0KIAlyZXR1cm4gdGhpczsKIH0KQEAgLTE1ODQsOCArMTk2NCw4IEBACiAJCQkJbnVsbFMgPSAiLCBudWxsOlsiICsgdGhpcy5udWxsQml0MSAvLyROT04tTkxTLTEkCiAJCQkJCSsgdGhpcy5udWxsQml0MiArIHRoaXMubnVsbEJpdDMgKyB0aGlzLm51bGxCaXQ0OwogCQkJaW50IGksIGNlaWw7Ci0JCQlmb3IgKGkgPSAwLCBjZWlsID0gdGhpcy5leHRyYVswXS5sZW5ndGggPiAzID8gCi0JCQkJCQkJCTMgOiAKKwkJCWZvciAoaSA9IDAsIGNlaWwgPSB0aGlzLmV4dHJhWzBdLmxlbmd0aCA+IDMgPworCQkJCQkJCQkzIDoKIAkJCQkJCQkJdGhpcy5leHRyYVswXS5sZW5ndGg7CiAJCQkJaSA8IGNlaWw7IGkrKykgewogCQkJCWRlZiArPSAiLCIgKyB0aGlzLmV4dHJhWzBdW2ldOyAvLyROT04tTkxTLTEkCkBAIC0xNTk4LDcgKzE5NzgsNyBAQAogCQkJCXBvdCArPSAiLC4uLiI7IC8vJE5PTi1OTFMtMSQKIAkJCQludWxsUyArPSAiLC4uLiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KLQkJCXJldHVybiBkZWYgKyBwb3QgCisJCQlyZXR1cm4gZGVmICsgcG90CiAJCQkJKyAiXSwgcmVhY2hhYmxlOiIgKyAoKHRoaXMudGFnQml0cyAmIFVOUkVBQ0hBQkxFKSA9PSAwKSAvLyROT04tTkxTLTEkCiAJCQkJKyBudWxsUwogCQkJCSsgIl0+IjsgLy8kTk9OLU5MUy0xJApAQCAtMTYxNSw4ICsxOTk1LDggQEAKIAkJCVN0cmluZyBkZWYgPSAiRmxvd0luZm88ZGVmOlsiICsgdGhpcy5kZWZpbml0ZUluaXRzLCAvLyROT04tTkxTLTEkCiAJCQkJcG90ID0gIl0sIHBvdDpbIiArIHRoaXMucG90ZW50aWFsSW5pdHM7IC8vJE5PTi1OTFMtMSQKIAkJCWludCBpLCBjZWlsOwotCQkJZm9yIChpID0gMCwgY2VpbCA9IHRoaXMuZXh0cmFbMF0ubGVuZ3RoID4gMyA/IAotCQkJCQkJCQkzIDogCisJCQlmb3IgKGkgPSAwLCBjZWlsID0gdGhpcy5leHRyYVswXS5sZW5ndGggPiAzID8KKwkJCQkJCQkJMyA6CiAJCQkJCQkJCXRoaXMuZXh0cmFbMF0ubGVuZ3RoOwogCQkJCWkgPCBjZWlsOyBpKyspIHsKIAkJCQlkZWYgKz0gIiwiICsgdGhpcy5leHRyYVswXVtpXTsgLy8kTk9OLU5MUy0xJApAQCAtMTYyNiw3ICsyMDA2LDcgQEAKIAkJCQlkZWYgKz0gIiwuLi4iOyAvLyROT04tTkxTLTEkCiAJCQkJcG90ICs9ICIsLi4uIjsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQkJcmV0dXJuIGRlZiArIHBvdCAKKwkJCXJldHVybiBkZWYgKyBwb3QKIAkJCQkrICJdLCByZWFjaGFibGU6IiArICgodGhpcy50YWdCaXRzICYgVU5SRUFDSEFCTEUpID09IDApIC8vJE5PTi1OTFMtMSQKIAkJCQkrICIsIG5vIG51bGwgaW5mbz4iOyAvLyROT04tTkxTLTEkCiAJCX0KQEAgLTE2MzYsNyArMjAxNiw3IEBACiBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHVuY29uZGl0aW9uYWxDb3B5KCkgewogCXJldHVybiAoVW5jb25kaXRpb25hbEZsb3dJbmZvKSBjb3B5KCk7CiB9Ci0JCisKIHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEZpZWxkTGVzc0NvcHkoKSB7CiAJLy8gVE9ETyAobWF4aW1lKSBtYXkgY29uc2lkZXIgbGV2ZXJhZ2luZyBudWxsIGNvbnRyaWJ1dGlvbiB2ZXJpZmljYXRpb24gYXMgaXQgaXMgZG9uZSBpbiBjb3B5CiAJVW5jb25kaXRpb25hbEZsb3dJbmZvIGNvcHkgPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvKCk7CkBAIC0xNjUxLDEzICsyMDMxLDE0IEBACiAJCWNvcHkubnVsbEJpdDIgPSB0aGlzLm51bGxCaXQyICYgbWFzazsKIAkJY29weS5udWxsQml0MyA9IHRoaXMubnVsbEJpdDMgJiBtYXNrOwogCQljb3B5Lm51bGxCaXQ0ID0gdGhpcy5udWxsQml0NCAmIG1hc2s7Ci0JfSAKKwl9CisJY29weS5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0ID0gdGhpcy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0OwogCS8vIHVzZSBleHRyYSB2ZWN0b3IKIAlpZiAodGhpcy5leHRyYSA9PSBudWxsKSB7CiAJCXJldHVybiBjb3B5OyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCiAJfQogCWludCB2ZWN0b3JJbmRleCwgbGVuZ3RoLCBjb3B5U3RhcnQ7Ci0JaWYgKCh2ZWN0b3JJbmRleCA9IChsaW1pdCAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSAKKwlpZiAoKHZlY3RvckluZGV4ID0gKGxpbWl0IC8gQml0Q2FjaGVTaXplKSAtIDEpID49CiAJCQkobGVuZ3RoID0gdGhpcy5leHRyYVswXS5sZW5ndGgpKSB7CiAJCXJldHVybiBjb3B5OyAvLyBub3QgZW5vdWdoIHJvb20geWV0CiAJfQpAQCAtMTY2Niw4ICsyMDQ3LDggQEAKIAlpZiAoKGNvcHlTdGFydCA9IHZlY3RvckluZGV4ICsgMSkgPCBsZW5ndGgpIHsKIAkJaW50IGNvcHlMZW5ndGggPSBsZW5ndGggLSBjb3B5U3RhcnQ7CiAJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykgewotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhW2pdLCBjb3B5U3RhcnQsIAotCQkJCShjb3B5LmV4dHJhW2pdID0gbmV3IGxvbmdbbGVuZ3RoXSksIGNvcHlTdGFydCwgCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFbal0sIGNvcHlTdGFydCwKKwkJCQkoY29weS5leHRyYVtqXSA9IG5ldyBsb25nW2xlbmd0aF0pLCBjb3B5U3RhcnQsCiAJCQkJY29weUxlbmd0aCk7CiAJCX0KIAl9CkBAIC0xNjc5LDcgKzIwNjAsNyBAQAogCWlmICh2ZWN0b3JJbmRleCA+PSAwKSB7CiAJCW1hc2sgPSB+KCgxTCA8PCAobGltaXQgJSBCaXRDYWNoZVNpemUpKS0xKTsKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUxlbmd0aDsgaisrKSB7Ci0JCQljb3B5LmV4dHJhW2pdW3ZlY3RvckluZGV4XSA9IAorCQkJY29weS5leHRyYVtqXVt2ZWN0b3JJbmRleF0gPQogCQkJCXRoaXMuZXh0cmFbal1bdmVjdG9ySW5kZXhdICYgbWFzazsKIAkJfQogCX0KQEAgLTE2OTQsNSArMjA3NSw4NCBAQAogcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpIHsKIAlyZXR1cm4gdGhpczsKIH0KKworcHVibGljIHZvaWQgbWFya2VkQXNOdWxsT3JOb25OdWxsSW5Bc3NlcnRFeHByZXNzaW9uKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJaW50IHBvc2l0aW9uID0gbG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQ7CisJaW50IG9sZExlbmd0aDsKKwlpZiAodGhpcy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0ID09IG51bGwpIHsKKwkJdGhpcy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0ID0gbmV3IGludFtwb3NpdGlvbiArIDFdOworCX0KKwllbHNlIHsKKwkJaWYocG9zaXRpb24gPj0gKG9sZExlbmd0aCA9IHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydC5sZW5ndGgpKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCwgMCwgKHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCA9IG5ldyBpbnRbcG9zaXRpb24gKyAxXSksIDAsIG9sZExlbmd0aCk7IAorCQl9CisJfQorCXRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydFtwb3NpdGlvbl0gPSAxOworfQorCitwdWJsaWMgYm9vbGVhbiBpc01hcmtlZEFzTnVsbE9yTm9uTnVsbEluQXNzZXJ0RXhwcmVzc2lvbihMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCWludCBwb3NpdGlvbiA9IGxvY2FsLmlkICsgdGhpcy5tYXhGaWVsZENvdW50OworCWlmKHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCA9PSBudWxsIHx8IHBvc2l0aW9uID49IHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydC5sZW5ndGgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZih0aGlzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnRbcG9zaXRpb25dID09IDEpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDb21iaW5lIHRoZSBudWxsIHN0YXR1cyBjaGFuZ2VzIGluIGFzc2VydCBleHByZXNzaW9ucyBpbmZvCisgKiBAcGFyYW0gb3RoZXJJbml0cworICovCisvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzQ0OAorcHJpdmF0ZSB2b2lkIGNvbWJpbmVOdWxsU3RhdHVzQ2hhbmdlSW5Bc3NlcnRJbmZvKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7CisJaWYgKHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCAhPSBudWxsIHx8IG90aGVySW5pdHMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCAhPSBudWxsKSB7CisJCWludCBtZXJnZWRMZW5ndGgsIGxlbmd0aDsKKwkJaWYgKHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCAhPSBudWxsKSB7CisJCQlpZiAob3RoZXJJbml0cy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0ICE9IG51bGwpIHsKKwkJCQlpZihvdGhlckluaXRzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQubGVuZ3RoID4gdGhpcy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0Lmxlbmd0aCkgeworCQkJCQltZXJnZWRMZW5ndGggPSBvdGhlckluaXRzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQubGVuZ3RoOworCQkJCQlsZW5ndGggPSB0aGlzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQubGVuZ3RoOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCwgMCwgKHRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCA9IG5ldyBpbnRbbWVyZ2VkTGVuZ3RoXSksIDAsIGxlbmd0aCk7CisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKyspIHsKKwkJCQkJCXRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydFtpXSB8PSBvdGhlckluaXRzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnRbaV07CisJCQkJCX0KKwkJCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnQsIGxlbmd0aCwgdGhpcy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0LCBsZW5ndGgsIG1lcmdlZExlbmd0aCAtIGxlbmd0aCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IG90aGVySW5pdHMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydC5sZW5ndGg7IGkgKyspIHsKKwkJCQkJCXRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydFtpXSB8PSBvdGhlckluaXRzLm51bGxTdGF0dXNDaGFuZ2VkSW5Bc3NlcnRbaV07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAob3RoZXJJbml0cy5udWxsU3RhdHVzQ2hhbmdlZEluQXNzZXJ0ICE9IG51bGwpIHsKKwkJCXRoaXMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydCA9IG90aGVySW5pdHMubnVsbFN0YXR1c0NoYW5nZWRJbkFzc2VydDsKKwkJfQorCX0KK30KKworcHVibGljIHZvaWQgcmVzZXRBc3NpZ25tZW50SW5mbyhMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCXJlc2V0QXNzaWdubWVudEluZm8obG9jYWwuaWQgKyB0aGlzLm1heEZpZWxkQ291bnQpOworfQorCitwdWJsaWMgdm9pZCByZXNldEFzc2lnbm1lbnRJbmZvKGludCBwb3NpdGlvbikgeworCWlmICh0aGlzICE9IERFQURfRU5EKSB7CisJCS8vIHBvc2l0aW9uIGlzIHplcm8tYmFzZWQKKwkJaWYgKHBvc2l0aW9uIDwgQml0Q2FjaGVTaXplKSB7CisJCQkvLyB1c2UgYml0cworCQkJbG9uZyBtYXNrOworCQkJdGhpcy5kZWZpbml0ZUluaXRzICY9IChtYXNrID0gfigxTCA8PCBwb3NpdGlvbikpOworCQkJdGhpcy5wb3RlbnRpYWxJbml0cyAmPSBtYXNrOworCQl9IGVsc2UgeworCQkJLy8gdXNlIGV4dHJhIHZlY3RvcgorCQkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7CisJCQlpZiAodGhpcy5leHRyYSA9PSBudWxsIHx8IHZlY3RvckluZGV4ID49IHRoaXMuZXh0cmFbMF0ubGVuZ3RoKSByZXR1cm47CS8vIHZhcmlhYmxlIGRvZXNudCBleGlzdCBpbiBmbG93IGluZm8KKwkJCWxvbmcgbWFzazsKKwkJCXRoaXMuZXh0cmFbMF1bdmVjdG9ySW5kZXhdICY9CisJCQkJKG1hc2sgPSB+KDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpKTsKKwkJCXRoaXMuZXh0cmFbMV1bdmVjdG9ySW5kZXhdICY9IG1hc2s7CisJCX0KKwl9Cit9CiB9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Jvb2xlYW5Db25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEKaW5kZXggMTRkODE2Ni4uYWI4ZDYzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMzIgKzEyLDUxIEBACiAKIHB1YmxpYyBjbGFzcyBCb29sZWFuQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAKLXByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKKwlwcml2YXRlIGJvb2xlYW4gdmFsdWU7CiAKLXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5Db25zdGFudCBUUlVFID0gbmV3IEJvb2xlYW5Db25zdGFudCh0cnVlKTsKLXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5Db25zdGFudCBGQUxTRSA9IG5ldyBCb29sZWFuQ29uc3RhbnQoZmFsc2UpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5Db25zdGFudCBUUlVFID0gbmV3IEJvb2xlYW5Db25zdGFudCh0cnVlKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuQ29uc3RhbnQgRkFMU0UgPSBuZXcgQm9vbGVhbkNvbnN0YW50KGZhbHNlKTsKIAotcHVibGljIHN0YXRpYyBCb29sZWFuQ29uc3RhbnQgZnJvbVZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQlyZXR1cm4gdmFsdWUgPyBCb29sZWFuQ29uc3RhbnQuVFJVRSA6IEJvb2xlYW5Db25zdGFudC5GQUxTRTsKLX0KLXByaXZhdGUgQm9vbGVhbkNvbnN0YW50KGJvb2xlYW4gdmFsdWUpIHsKLQl0aGlzLnZhbHVlID0gdmFsdWU7Ci19CisJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworCQlyZXR1cm4gdmFsdWUgPyBCb29sZWFuQ29uc3RhbnQuVFJVRSA6IEJvb2xlYW5Db25zdGFudC5GQUxTRTsKKwl9CiAKLXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7Ci19CisJcHJpdmF0ZSBCb29sZWFuQ29uc3RhbnQoYm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQogCi1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCS8vc3BlYyAxNS4xNy4xMQotCXJldHVybiBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKTsKLX0KKwlwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KIAotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCXJldHVybiAiKGJvb2xlYW4pIiArIHZhbHVlIDsgIC8vJE5PTi1OTFMtMSQKLX0KKwlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCQkvLyBzcGVjIDE1LjE3LjExCisJCXJldHVybiBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKTsKKwl9CiAKLXB1YmxpYyBpbnQgdHlwZUlEKCkgewotCXJldHVybiBUX2Jvb2xlYW47Ci19CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICIoYm9vbGVhbikiICsgdGhpcy52YWx1ZTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBpbnQgdHlwZUlEKCkgeworCQlyZXR1cm4gVF9ib29sZWFuOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlID8gMTIzMSA6IDEyMzc7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8vIGNhbm5vdCBiZSB0cnVlIGFueW1vcmUgYXMgdGhlIGZpcnN0IHRlc3Qgd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlCisJCXJldHVybiBmYWxzZTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0J5dGVDb25zdGFudC5qYXZhCmluZGV4IDYwNzAwODUuLmY1NjM5NjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0J5dGVDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0J5dGVDb25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDQzICsxMSw3MyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIEJ5dGVDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKLQlwcml2YXRlIGJ5dGUgdmFsdWU7Ci0JCi1wdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShieXRlIHZhbHVlKSB7Ci0JcmV0dXJuIG5ldyBCeXRlQ29uc3RhbnQodmFsdWUpOwotfQotcHJpdmF0ZSBCeXRlQ29uc3RhbnQoYnl0ZSB2YWx1ZSkgewotCXRoaXMudmFsdWUgPSB2YWx1ZTsKLX0KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gdGhpcy52YWx1ZTsKLX0KLXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQlyZXR1cm4gKGNoYXIpIHZhbHVlOwotfQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQotfQotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQotfQotcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKLQkvL3NwZWMgMTUuMTcuMTEKLQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewogCi0JcmV0dXJuICIoYnl0ZSkiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQKLXB1YmxpYyBpbnQgdHlwZUlEKCkgewotCXJldHVybiBUX2J5dGU7Ci19CisJcHJpdmF0ZSBieXRlIHZhbHVlOworCisJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoYnl0ZSB2YWx1ZSkgeworCQlyZXR1cm4gbmV3IEJ5dGVDb25zdGFudCh2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBCeXRlQ29uc3RhbnQoYnl0ZSB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7CisJCXJldHVybiAoY2hhcikgdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCX0KKworCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCX0KKworCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCisJfQorCisJcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCX0KKworCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCX0KKworCXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJCS8vIHNwZWMgMTUuMTcuMTEKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiKGJ5dGUpIiArIHRoaXMudmFsdWU7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgaW50IHR5cGVJRCgpIHsKKwkJcmV0dXJuIFRfYnl0ZTsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQnl0ZUNvbnN0YW50IG90aGVyID0gKEJ5dGVDb25zdGFudCkgb2JqOworCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NoYXJDb25zdGFudC5qYXZhCmluZGV4IDkwZjA0NmIuLjZmNzQwZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NoYXJDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NoYXJDb25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDQxICsxNiw2OCBAQAogCiAJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoY2hhciB2YWx1ZSkgewogCQlyZXR1cm4gbmV3IENoYXJDb25zdGFudCh2YWx1ZSk7Ci0JfQkKKwl9CiAKIAlwcml2YXRlIENoYXJDb25zdGFudChjaGFyIHZhbHVlKSB7CiAJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAl9CisKIAlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgdmFsdWU7CisJCXJldHVybiAoYnl0ZSkgdGhpcy52YWx1ZTsKIAl9CisKIAlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7CiAJCXJldHVybiB0aGlzLnZhbHVlOwogCX0KKwogCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogCX0KKwogCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwkJcmV0dXJuIHRoaXMudmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKIAl9CisKIAlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwkJcmV0dXJuIHRoaXMudmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKIAl9CisKIAlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogCX0KKwogCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCQlyZXR1cm4gKHNob3J0KSB2YWx1ZTsKKwkJcmV0dXJuIChzaG9ydCkgdGhpcy52YWx1ZTsKIAl9CisKIAlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCQkvL3NwZWMgMTUuMTcuMTEKKwkJLy8gc3BlYyAxNS4xNy4xMQogCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSk7CiAJfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkKLQkJcmV0dXJuICIoY2hhcikiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiKGNoYXIpIiArIHRoaXMudmFsdWU7IC8vJE5PTi1OTFMtMSQKIAl9CisKIAlwdWJsaWMgaW50IHR5cGVJRCgpIHsKIAkJcmV0dXJuIFRfY2hhcjsKIAl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQ2hhckNvbnN0YW50IG90aGVyID0gKENoYXJDb25zdGFudCkgb2JqOworCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlck9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCmluZGV4IGQ5Y2JlNTMuLjVkNzA1ZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw5IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJlbmphbWluIE11c2thbGxhIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjM5MDY2CisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAyMzYzODUKKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uICAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDI5NTU1MQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCkBAIC03MywxOCArNzYsMjQgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc01ldGhvZFR5cGVQYXJhbWV0ZXJzID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHMgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHkgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZyI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0RmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFVucXVhbGlmaWVkRmllbGRBY2Nlc3MgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFVuY2hlY2tlZFR5cGVPcGVyYXRpb24gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRSYXdUeXBlUmVmZXJlbmNlID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEZpbmFsUGFyYW1ldGVyQm91bmQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nU2VyaWFsVmVyc2lvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRWYXJhcmdzQXJndW1lbnROZWVkQ2FzdCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Tb3VyY2UgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UYXJnZXRQbGF0Zm9ybSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Db21wbGlhbmNlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiOyAvLyROT04tTkxTLTEkCkBAIC0xMDAsMTIgKzEwOSwxNSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRBdXRvYm94aW5nID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZyI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0QW5ub3RhdGlvblN1cGVySW50ZXJmYWNlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEluY29tcGxldGVFbnVtU3dpdGNoID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2giOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEZvcmJpZGRlblJlZmVyZW5jZSA9ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydERpc2NvdXJhZ2VkUmVmZXJlbmNlID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TdXBwcmVzc1dhcm5pbmdzID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3MiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1N1cHByZXNzT3B0aW9uYWxFcnJvcnMgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc09wdGlvbmFsRXJyb3JzIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW4gPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRXYXJuaW5nVG9rZW4gPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRMYWJlbCA9ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRmF0YWxPcHRpb25hbEVycm9yID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvciI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0UGFyYW1ldGVyQXNzaWdubWVudCA9ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJApAQCAtMTEzLDEyICsxMjUsMTggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24gPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24iOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0dlbmVyYXRlQ2xhc3NGaWxlcyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5nZW5lcmF0ZUNsYXNzRmlsZXMiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1Byb2Nlc3NfQW5ub3RhdGlvbnMgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvY2Vzc0Fubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRJbnZhbGlkQW5ub3RhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRBbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nQW5ub3RhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdBbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvYyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jIjsgLy8kTk9OLU5MUy0xJAotCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFJlZHVuZGFudFN1cGVyaW50ZXJmYWNlID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRDb21wYXJpbmdJZGVudGljYWwgPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2QgPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNaXNzaW5nSGFzaENvZGVNZXRob2QgPSAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnREZWFkQ29kZSA9ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCA9ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRUYXNrcyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnRhc2tzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRPYmplY3RBbGxvY2F0aW9uID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkT2JqZWN0QWxsb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0luY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMiOyAgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNZXRob2RDYW5CZVN0YXRpYyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlU3RhdGljIjsgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMiOyAgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRSZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzID0gICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMiOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogUG9zc2libGUgdmFsdWVzIGZvciBjb25maWd1cmFibGUgb3B0aW9ucwogCSAqLwpAQCAtMTMxLDYgKzE0OSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl8xXzMgPSAiMS4zIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV80ID0gIjEuNCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0pTUjE0ID0gImpzcjE0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQ0xEQzFfMSA9ICJjbGRjMS4xIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV81ID0gIjEuNSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfNiA9ICIxLjYiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl8xXzcgPSAiMS43IjsgLy8kTk9OLU5MUy0xJApAQCAtMTQzLDE4OCArMTYyLDIzNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRCA9ICJwcm90ZWN0ZWQiOwkvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICJkZWZhdWx0IjsJLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEUgPSAicHJpdmF0ZSI7CS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fVEFHID0gInJldHVybl90YWciOwkvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fVEFHID0gIm5vX3RhZyI7CS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfU1RBTkRBUkRfVEFHUyA9ICJhbGxfc3RhbmRhcmRfdGFncyI7CS8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIEJpdCBtYXNrIGZvciBjb25maWd1cmFibGUgcHJvYmxlbXMgKGVycm9yL3dhcm5pbmcgdGhyZXNob2xkKQorCSAqIE5vdGU6IGJpdG1hc2sgYXNzdW1lcyAzIGhpZ2hlc3QgYml0cyB0byBkZW5vdGUgaXJyaXRhbnQgZ3JvdXAgKHRvIGFsbG93IHN0b3JpbmcgOCBncm91cHMgb2YgMjkgYml0cyBlYWNoCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgPSBBU1ROb2RlLkJpdDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZCA9IEFTVE5vZGUuQml0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVXNpbmdEZXByZWNhdGVkQVBJID0gQVNUTm9kZS5CaXQzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNYXNrZWRDYXRjaEJsb2NrID0gQVNUTm9kZS5CaXQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbnVzZWRMb2NhbFZhcmlhYmxlID0gQVNUTm9kZS5CaXQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbnVzZWRBcmd1bWVudCA9IEFTVE5vZGUuQml0NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gPSBBU1ROb2RlLkJpdDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFjY2Vzc0VtdWxhdGlvbiA9IEFTVE5vZGUuQml0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTm9uRXh0ZXJuYWxpemVkU3RyaW5nID0gQVNUTm9kZS5CaXQ5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgPSBBU1ROb2RlLkJpdDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbnVzZWRJbXBvcnQgPSBBU1ROb2RlLkJpdDExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpYyA9IEFTVE5vZGUuQml0MTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRhc2sgPSBBU1ROb2RlLkJpdDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBOb0VmZmVjdEFzc2lnbm1lbnQgPSBBU1ROb2RlLkJpdDE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgPSBBU1ROb2RlLkJpdDE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbnVzZWRQcml2YXRlTWVtYmVyID0gQVNUTm9kZS5CaXQxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTG9jYWxWYXJpYWJsZUhpZGluZyA9IEFTVE5vZGUuQml0MTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZpZWxkSGlkaW5nID0gQVNUTm9kZS5CaXQxODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ24gPSBBU1ROb2RlLkJpdDE5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFbXB0eVN0YXRlbWVudCA9IEFTVE5vZGUuQml0MjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1pc3NpbmdKYXZhZG9jQ29tbWVudHMgID0gQVNUTm9kZS5CaXQyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTWlzc2luZ0phdmFkb2NUYWdzID0gQVNUTm9kZS5CaXQyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVW5xdWFsaWZpZWRGaWVsZEFjY2VzcyA9IEFTVE5vZGUuQml0MjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uID0gQVNUTm9kZS5CaXQyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRmluYWxseUJsb2NrTm90Q29tcGxldGluZyA9IEFTVE5vZGUuQml0MjU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEludmFsaWRKYXZhZG9jID0gQVNUTm9kZS5CaXQyNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVW5uZWNlc3NhcnlUeXBlQ2hlY2sgPSBBU1ROb2RlLkJpdDI3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrID0gQVNUTm9kZS5CaXQyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSW5kaXJlY3RTdGF0aWNBY2Nlc3MgPSBBU1ROb2RlLkJpdDI5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVbm5lY2Vzc2FyeUVsc2UgID0gQVNUTm9kZS5CaXQzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVW5jaGVja2VkVHlwZU9wZXJhdGlvbiA9IEFTVE5vZGUuQml0MzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZpbmFsUGFyYW1ldGVyQm91bmQgPSBBU1ROb2RlLkJpdDMyTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTWlzc2luZ1NlcmlhbFZlcnNpb24gPSBBU1ROb2RlLkJpdDMzTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRW51bVVzZWRBc0FuSWRlbnRpZmllciA9IEFTVE5vZGUuQml0MzRMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGb3JiaWRkZW5SZWZlcmVuY2UgPSBBU1ROb2RlLkJpdDM1TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QgPSBBU1ROb2RlLkJpdDM2TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTnVsbFJlZmVyZW5jZSA9IEFTVE5vZGUuQml0MzdMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBdXRvQm94aW5nID0gQVNUTm9kZS5CaXQzOEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFubm90YXRpb25TdXBlckludGVyZmFjZSA9IEFTVE5vZGUuQml0MzlMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUeXBlSGlkaW5nID0gQVNUTm9kZS5CaXQ0MEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24gPSBBU1ROb2RlLkJpdDQxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSW5jb21wbGV0ZUVudW1Td2l0Y2ggPSBBU1ROb2RlLkJpdDQyTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uID0gQVNUTm9kZS5CaXQ0M0w7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERpc2NvdXJhZ2VkUmVmZXJlbmNlID0gQVNUTm9kZS5CaXQ0NEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVuaGFuZGxlZFdhcm5pbmdUb2tlbiA9IEFTVE5vZGUuQml0NDVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBSYXdUeXBlUmVmZXJlbmNlID0gQVNUTm9kZS5CaXQ0Nkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVudXNlZExhYmVsID0gQVNUTm9kZS5CaXQ0N0w7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBhcmFtZXRlckFzc2lnbm1lbnQgPSBBU1ROb2RlLkJpdDQ4TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRmFsbHRocm91Z2hDYXNlID0gQVNUTm9kZS5CaXQ0OUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uID0gQVNUTm9kZS5CaXQ1MEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBvdGVudGlhbE51bGxSZWZlcmVuY2UgPSBBU1ROb2RlLkJpdDUxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUmVkdW5kYW50TnVsbENoZWNrID0gQVNUTm9kZS5CaXQ1Mkw7CisJLy8gZ3JvdXAgMAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVzaW5nRGVwcmVjYXRlZEFQSSA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNYXNrZWRDYXRjaEJsb2NrID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQ0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZExvY2FsVmFyaWFibGUgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW51c2VkQXJndW1lbnQgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjZXNzRW11bGF0aW9uID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQ4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5vbkV4dGVybmFsaXplZFN0cmluZyA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZEltcG9ydCA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTm9uU3RhdGljQWNjZXNzVG9TdGF0aWMgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRhc2sgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDEzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5vRWZmZWN0QXNzaWdubWVudCA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQxNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnVzZWRQcml2YXRlTWVtYmVyID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQxNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMb2NhbFZhcmlhYmxlSGlkaW5nID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQxNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGaWVsZEhpZGluZyA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MTg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ24gPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDE5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVtcHR5U3RhdGVtZW50ID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNaXNzaW5nSmF2YWRvY0NvbW1lbnRzICA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MjE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWlzc2luZ0phdmFkb2NUYWdzID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnF1YWxpZmllZEZpZWxkQWNjZXNzID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MjQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmluYWxseUJsb2NrTm90Q29tcGxldGluZyA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0MjU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW52YWxpZEphdmFkb2MgPSBJcnJpdGFudFNldC5HUk9VUDAgfCBBU1ROb2RlLkJpdDI2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVubmVjZXNzYXJ5VHlwZUNoZWNrID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrID0gSXJyaXRhbnRTZXQuR1JPVVAwIHwgQVNUTm9kZS5CaXQyODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbmRpcmVjdFN0YXRpY0FjY2VzcyA9IElycml0YW50U2V0LkdST1VQMCB8IEFTVE5vZGUuQml0Mjk7CisJCisJLy8gZ3JvdXAgMQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVubmVjZXNzYXJ5RWxzZSAgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5jaGVja2VkVHlwZU9wZXJhdGlvbiA9IElycml0YW50U2V0LkdST1VQMSB8IEFTVE5vZGUuQml0MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGaW5hbFBhcmFtZXRlckJvdW5kID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1pc3NpbmdTZXJpYWxWZXJzaW9uID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQ0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVudW1Vc2VkQXNBbklkZW50aWZpZXIgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRm9yYmlkZGVuUmVmZXJlbmNlID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQ2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0ID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQ3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE51bGxSZWZlcmVuY2UgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQXV0b0JveGluZyA9IElycml0YW50U2V0LkdST1VQMSB8IEFTVE5vZGUuQml0OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFR5cGVIaWRpbmcgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDExOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24gPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEluY29tcGxldGVFbnVtU3dpdGNoID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQxMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24gPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpc2NvdXJhZ2VkUmVmZXJlbmNlID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQxNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbmhhbmRsZWRXYXJuaW5nVG9rZW4gPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDE2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJhd1R5cGVSZWZlcmVuY2UgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDE3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZExhYmVsID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQxODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQYXJhbWV0ZXJBc3NpZ25tZW50ID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQxOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGYWxsdGhyb3VnaENhc2UgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDIwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQyMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQb3RlbnRpYWxOdWxsUmVmZXJlbmNlID0gSXJyaXRhbnRTZXQuR1JPVVAxIHwgQVNUTm9kZS5CaXQyMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWR1bmRhbnROdWxsQ2hlY2sgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24gPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDI0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZFR5cGVBcmd1bWVudHMgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZFdhcm5pbmdUb2tlbiA9IElycml0YW50U2V0LkdST1VQMSB8IEFTVE5vZGUuQml0MjY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UgPSBJcnJpdGFudFNldC5HUk9VUDEgfCBBU1ROb2RlLkJpdDI3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbXBhcmluZ0lkZW50aWNhbCA9IElycml0YW50U2V0LkdST1VQMSB8IEFTVE5vZGUuQml0Mjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWlzc2luZ1N5bmNocm9uaXplZE1vZGlmaWVySW5Jbmhlcml0ZWRNZXRob2Q9IElycml0YW50U2V0LkdST1VQMSB8IEFTVE5vZGUuQml0Mjk7CiAKLQkvLyBNYXA6IFN0cmluZyBvcHRpb25LZXkgLS0+IExvbmcgaXJyaXRhbnQ+Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIE9wdGlvblRvSXJyaXRhbnRzOworCS8vIGdyb3VwIDIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaG91bGRJbXBsZW1lbnRIYXNoY29kZSA9IElycml0YW50U2V0LkdST1VQMiB8IEFTVE5vZGUuQml0MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEZWFkQ29kZSA9IElycml0YW50U2V0LkdST1VQMiB8IEFTVE5vZGUuQml0MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYXNrcyA9IElycml0YW50U2V0LkdST1VQMiB8IEFTVE5vZGUuQml0MzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnVzZWRPYmplY3RBbGxvY2F0aW9uID0gSXJyaXRhbnRTZXQuR1JPVVAyIHwgQVNUTm9kZS5CaXQ0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1ldGhvZENhbkJlU3RhdGljID0gSXJyaXRhbnRTZXQuR1JPVVAyIHwgQVNUTm9kZS5CaXQ1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMgPSBJcnJpdGFudFNldC5HUk9VUDIgfCBBU1ROb2RlLkJpdDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyA9IElycml0YW50U2V0LkdST1VQMiB8IEFTVE5vZGUuQml0NzsKIAotCS8vIERlZmF1bHQgc2V2ZXJpdHkgbGV2ZWwgZm9yIGhhbmRsZXJzCi0JcHVibGljIGxvbmcgZXJyb3JUaHJlc2hvbGQgPSAwOworCS8vIFNldmVyaXR5IGxldmVsIGZvciBoYW5kbGVycworCS8qKiAKKwkgKiBEZWZhdWx0cyBkZWZpbmVkIGF0IHtAbGluayBJcnJpdGFudFNldCNDT01QSUxFUl9ERUZBVUxUX0VSUk9SU30gCisJICogQHNlZSAjcmVzZXREZWZhdWx0cygpCisJICovCisJcHJvdGVjdGVkIElycml0YW50U2V0IGVycm9yVGhyZXNob2xkOworCS8qKiAKKwkgKiBEZWZhdWx0cyBkZWZpbmVkIGF0IHtAbGluayBJcnJpdGFudFNldCNDT01QSUxFUl9ERUZBVUxUX1dBUk5JTkdTfQorCSAqIEBzZWUgI3Jlc2V0RGVmYXVsdHMoKQorCSAqLworCXByb3RlY3RlZCBJcnJpdGFudFNldCB3YXJuaW5nVGhyZXNob2xkOworCQorCS8qKgorCSAqIERlZmF1bHQgc2V0dGluZ3MgYXJlIHRvIGJlIGRlZmluZWQgaW4ge0BsbmsgQ29tcGlsZXJPcHRpb25zI3Jlc2V0RGVmYXVsdHMoKX0KKwkgKi8KKwkKKwkvKiogQ2xhc3NmaWxlIGRlYnVnIGluZm9ybWF0aW9uLCBtYXkgY29udGFpbiBzb3VyY2UgZmlsZSBuYW1lLCBsaW5lIG51bWJlcnMsIGxvY2FsIHZhcmlhYmxlIHRhYmxlcywgZXRjLi4uICovCisJcHVibGljIGludCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzOyAKKwkvKiogQ29tcGxpYW5jZSBsZXZlbCBmb3IgdGhlIGNvbXBpbGVyLCByZWZlcnMgdG8gYSBKREsgdmVyc2lvbiwgZS5nLiB7QGxpbmsgQ2xhc3NGaWxlQ29uc3RhbnRzI0pESzFfNH0gKi8KKwlwdWJsaWMgbG9uZyBjb21wbGlhbmNlTGV2ZWw7CisJLyoqIE9yaWdpbmFsIGNvbXBsaWFuY2UgbGV2ZWwgZm9yIHRoZSBjb21waWxlciwgcmVmZXJzIHRvIGEgSkRLIHZlcnNpb24sIGUuZy4ge0BsaW5rIENsYXNzRmlsZUNvbnN0YW50cyNKREsxXzR9LAorCSAqICBVc3VhbGx5IHNhbWUgYXMgdGhlIGZpZWxkIGNvbXBsaWFuY2VMZXZlbCwgdGhvdWdoIHRoZSBsYXR0ZXIgY291bGQgZGV2aWF0ZSB0byBjcmVhdGUgdGVtcG9yYXJ5IHNhbmRib3gKKwkgKiAgbW9kZXMgZHVyaW5nIHJlY29uY2lsZSBvcGVyYXRpb25zLiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzYzMworCSAqLworCXB1YmxpYyBsb25nIG9yaWdpbmFsQ29tcGxpYW5jZUxldmVsOworCS8qKiBKYXZhIHNvdXJjZSBsZXZlbCwgcmVmZXJzIHRvIGEgSkRLIHZlcnNpb24sIGUuZy4ge0BsaW5rIENsYXNzRmlsZUNvbnN0YW50cyNKREsxXzR9ICovCisJcHVibGljIGxvbmcgc291cmNlTGV2ZWw7CisJLyoqIE9yaWdpbmFsIEphdmEgc291cmNlIGxldmVsLCByZWZlcnMgdG8gYSBKREsgdmVyc2lvbiwgZS5nLiB7QGxpbmsgQ2xhc3NGaWxlQ29uc3RhbnRzI0pESzFfNH0gCisJICogIFVzdWFsbHkgc2FtZSBhcyB0aGUgZmllbGQgc291cmNlTGV2ZWwsIHRob3VnaCB0aGUgbGF0dGVyIGNvdWxkIGRldmlhdGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBzYW5kYm94CisJICogIG1vZGVzIGR1cmluZyByZWNvbmNpbGUgb3BlcmF0aW9ucy4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM2MzMKKwkgKiAqLworCXB1YmxpYyBsb25nIG9yaWdpbmFsU291cmNlTGV2ZWw7CisJLyoqIFZNIHRhcmdldCBsZXZlbCwgcmVmZXJzIHRvIGEgSkRLIHZlcnNpb24sIGUuZy4ge0BsaW5rIENsYXNzRmlsZUNvbnN0YW50cyNKREsxXzR9ICovCisJcHVibGljIGxvbmcgdGFyZ2V0SkRLOworCS8qKiBTb3VyY2UgZW5jb2RpbmcgZm9ybWF0ICovCisJcHVibGljIFN0cmluZyBkZWZhdWx0RW5jb2Rpbmc7CisJLyoqIENvbXBpbGVyIHRyYWNlIHZlcmJvc2l0eSAqLworCXB1YmxpYyBib29sZWFuIHZlcmJvc2U7CisJLyoqIEluZGljYXRlcyB3aGV0aGVyIHJlZmVyZW5jZSBpbmZvIGlzIGRlc2lyZWQgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcm9kdWNlUmVmZXJlbmNlSW5mbzsJCisJLyoqIEluZGljYXRlcyBpZiB1bnVzZWQvb3B0aW1pemFibGUgbG9jYWwgdmFyaWFibGVzIG5lZWQgdG8gYmUgcHJlc2VydmVkIChkZWJ1Z2dpbmcgcHVycG9zZSkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzOworCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBsaXRlcmFsIGV4cHJlc3Npb25zIGFyZSBpbmxpbmVkIGF0IHBhcnNlLXRpbWUgb3Igbm90ICovCisJcHVibGljIGJvb2xlYW4gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50czsKKwkvKiogTWF4IHByb2JsZW1zIHBlciBjb21waWxhdGlvbiB1bml0ICovCisJcHVibGljIGludCBtYXhQcm9ibGVtc1BlclVuaXQ7CisJLyoqIFRhZ3MgdXNlZCB0byByZWNvZ25pemUgdGFza3MgaW4gY29tbWVudHMgKi8KKwlwdWJsaWMgY2hhcltdW10gdGFza1RhZ3M7CisJLyoqIFJlc3BlY3RpdmUgcHJpb3JpdGllcyBvZiByZWNvZ25pemVkIHRhc2sgdGFncyAqLworCXB1YmxpYyBjaGFyW11bXSB0YXNrUHJpb3JpdGllczsKKwkvKiogSW5kaWNhdGUgd2hldGhlciB0YWcgZGV0ZWN0aW9uIGlzIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdCAqLworCXB1YmxpYyBib29sZWFuIGlzVGFza0Nhc2VTZW5zaXRpdmU7CisJLyoqIFNwZWNpZnkgd2hldGhlciBkZXByZWNhdGlvbiBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlIGlzIHRvIGJlIHJlcG9ydGVkICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0RGVwcmVjYXRpb25JbnNpZGVEZXByZWNhdGVkQ29kZTsKKwkvKiogU3BlY2lmeSB3aGV0aGVyIG92ZXJyaWRlIG9mIGRlcHJlY2F0ZWQgbWV0aG9kIGlzIHRvIGJlIHJlcG9ydGVkICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q7CisJLyoqIFNwZWNpZnkgaWYgc2hvdWxkIHJlcG9ydCB1bnVzZWQgcGFyYW1ldGVyIHdoZW4gaW1wbGVtZW50aW5nIGFic3RyYWN0IG1ldGhvZCAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdDsKKwkvKiogU3BlY2lmeSBpZiBzaG91bGQgcmVwb3J0IHVudXNlZCBwYXJhbWV0ZXIgd2hlbiBvdmVycmlkaW5nIGNvbmNyZXRlIG1ldGhvZCAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU7CisJLyoqIFNwZWNpZnkgaWYgc2hvdWxkIHJlcG9ydCBkb2N1bWVudGVkIHVudXNlZCBwYXJhbWV0ZXIgKGluIGphdmFkb2MpICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0VW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U7CisJLyoqIFNwZWNpZnkgaWYgc2hvdWxkIHJlcG9ydGVkIHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uIHdoZW4gb3ZlcnJpZGluZyBtZXRob2QgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nOworCS8qKiBTcGVjaWZ5IGlmIHNob3VsZCByZXBvcnRlZCB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiB3aGVuIGRvY3VtZW50ZWQgaW4gamF2YWRvYyAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U7CisJLyoqIFNwZWNpZnkgaWYgc2hvdWxkIHJlcG9ydGVkIHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uIHdoZW4gRXhjZXB0aW9uIG9yIFRocm93YWJsZSAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlOworCS8qKiBTcGVjaWZ5IHdoZXRoZXIgc2hvdWxkIHJlcG9ydCBjb25zdHJ1Y3Rvci9zZXR0ZXIgbWV0aG9kIHBhcmFtZXRlciBoaWRpbmcgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRTcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ7CisJLyoqIFNwZWNpZnkgd2hldGhlciB0cml2aWFsIGRlYWRjb2RlIHBhdHRlcm4gaXMgdG8gYmUgcmVwb3J0ZWQgKGUuZy4gaWYgKERFQlVHKSAuLi4pICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudDsKKwkvKiogTWFzdGVyIGZsYWcgY29udHJvbGxpbmcgd2hldGhlciBkb2MgY29tbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkICovCisJcHVibGljIGJvb2xlYW4gZG9jQ29tbWVudFN1cHBvcnQ7CisJLyoqIFNwZWNpZnkgaWYgaW52YWxpZCBqYXZhZG9jIHNoYWxsIGJlIHJlcG9ydGVkICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0SW52YWxpZEphdmFkb2NUYWdzOworCS8qKiBPbmx5IHJlcG9ydCBpbnZhbGlkIGphdmFkb2MgYWJvdmUgYSBnaXZlbiBsZXZlbCBvZiB2aXNpYmlsaXR5IG9mIGFzc29jaWF0ZWQgY29uc3RydWN0ICovCisJcHVibGljIGludCByZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5OworCS8qKiBTcGVjaWZ5IGlmIGRlcHJlY2F0ZWQgamF2YWRvYyByZWYgaXMgYWxsb3dlZCAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydEludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY7CisJLyoqIFNwZWNpZnkgaWYgbm9uIHZpc2libGUgamF2YWRvYyByZWYgaXMgYWxsb3dlZCAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydEludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY7CisJLyoqIFNwZWNpZnkgd2hlbiB0byByZXBvcnQgbWlzc2luZyBqYXZhZG9jIHRhZyBkZXNjcmlwdGlvbiAqLworCXB1YmxpYyBTdHJpbmcgcmVwb3J0TWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbjsKKwkvKiogT25seSByZXBvcnQgbWlzc2luZyBqYXZhZG9jIHRhZ3MgYWJvdmUgYSBnaXZlbiBsZXZlbCBvZiB2aXNpYmlsaXR5IG9mIGFzc29jaWF0ZWQgY29uc3RydWN0ICovCisJcHVibGljIGludCByZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5OworCS8qKiBTcGVjaWZ5IGlmIG5lZWQgdG8gZmxhZyBtaXNzaW5nIGphdmFkb2MgdGFncyBmb3Igb3ZlcnJpZGluZyBtZXRob2QgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nOworCS8qKiBTcGVjaWZ5IGlmIG5lZWQgdG8gZmxhZyBtaXNzaW5nIGphdmFkb2MgdGFncyBmb3IgbWV0aG9kIHR5cGUgcGFyYW1ldGVycyAoamF2YSAxLjUgYW5kIGFib3ZlKSovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnM7CisJLyoqIE9ubHkgcmVwb3J0IG1pc3NpbmcgamF2YWRvYyBjb21tZW50IGFib3ZlIGEgZ2l2ZW4gbGV2ZWwgb2YgdmlzaWJpbGl0eSBvZiBhc3NvY2lhdGVkIGNvbnN0cnVjdCAqLworCXB1YmxpYyBpbnQgcmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk7CisJLyoqIFNwZWNpZnkgaWYgbmVlZCB0byBmbGFnIG1pc3NpbmcgamF2YWRvYyBjb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZCAqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nOworCS8qKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBKU1IgYnl0ZWNvZGUgc2hvdWxkIGJlIGlubGluZWQgdG8gYXZvaWQgaXRzIHByZXNlbmNlIGluIGNsYXNzZmlsZSAqLworCXB1YmxpYyBib29sZWFuIGlubGluZUpzckJ5dGVjb2RlOworCS8qKiBJbmRpY2F0ZSBpZiBAU3VwcHJlc3NXYXJuaW5nIGFubm90YXRpb25zIGFyZSBhY3RpdmF0ZWQgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwcmVzc1dhcm5pbmdzOworCS8qKiBJbmRpY2F0ZSBpZiBAU3VwcHJlc3NXYXJuaW5nIGFubm90YXRpb25zIHNob3VsZCBhbHNvIHN1cHByZXNzIG9wdGlvbmFsIGVycm9ycyAqLworCXB1YmxpYyBib29sZWFuIHN1cHByZXNzT3B0aW9uYWxFcnJvcnM7CisJLyoqIFNwZWNpZnkgaWYgc2hvdWxkIHRyZWF0IG9wdGlvbmFsIGVycm9yIGFzIGZhdGFsIG9yIGp1c3QgbGlrZSB3YXJuaW5nICovCisJcHVibGljIGJvb2xlYW4gdHJlYXRPcHRpb25hbEVycm9yQXNGYXRhbDsKKwkvKiogU3BlY2lmeSBpZiBwYXJzZXIgc2hvdWxkIHBlcmZvcm0gc3RydWN0dXJhbCByZWNvdmVyeSBpbiBtZXRob2RzICovCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU1ldGhvZHNGdWxsUmVjb3Zlcnk7CisJLyoqIFNwZWNpZnkgaWYgcGFyc2VyIHBlcmZvcm0gc3RhdGVtZW50cyByZWNvdmVyeSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1TdGF0ZW1lbnRzUmVjb3Zlcnk7CisJLyoqIENvbnRyb2wgd2hldGhlciBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCAqLworCXB1YmxpYyBib29sZWFuIHByb2Nlc3NBbm5vdGF0aW9uczsKKwkvKiogU3RvcmUgYW5ub3RhdGlvbnMgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdG9yZUFubm90YXRpb25zOworCS8qKiBTcGVjaWZ5IGlmIG5lZWQgdG8gcmVwb3J0IG1pc3Npbmcgb3ZlcnJpZGUgYW5ub3RhdGlvbiBmb3IgYSBtZXRob2QgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSBtZXRob2QgKGphdmEgMS42IGFuZCBhYm92ZSkqLworCXB1YmxpYyBib29sZWFuIHJlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbjsKKwkvKiogSW5kaWNhdGUgaWYgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIGdlbmVyYXRlcyBjbGFzc2ZpbGVzICovCisJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVDbGFzc0ZpbGVzOworCS8qKiBJbmRpY2F0ZSBpZiBtZXRob2QgYm9kaWVzIHNob3VsZCBiZSBpZ25vcmVkICovCisJcHVibGljIGJvb2xlYW4gaWdub3JlTWV0aG9kQm9kaWVzOworCS8qKiBSYWlzZSBudWxsIHJlbGF0ZWQgd2FybmluZ3MgZm9yIHZhcmlhYmxlcyB0YWludGVkIGluc2lkZSBhbiBhc3NlcnQgc3RhdGVtZW50IChqYXZhIDEuNCBhbmQgYWJvdmUpKi8KKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0czsKKwkvKiogQ29udHJvbHMgd2hldGhlciBmb3JjZWQgZ2VuZXJpYyB0eXBlIHByb2JsZW1zIGdldCByZXBvcnRlZCAgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXM7CiAKLQlwdWJsaWMgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0KLQkJTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZQotCQl8IFVzaW5nRGVwcmVjYXRlZEFQSQotCQl8IE1hc2tlZENhdGNoQmxvY2sKLQkJfCBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QKLQkJfCBVbnVzZWRJbXBvcnQKLQkJfCBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpYwotCQl8IE5vRWZmZWN0QXNzaWdubWVudAotCQl8IEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZAotCQl8IE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uCi0JCXwgRmluYWxseUJsb2NrTm90Q29tcGxldGluZwotCQl8IEFzc2VydFVzZWRBc0FuSWRlbnRpZmllcgotCQl8IEVudW1Vc2VkQXNBbklkZW50aWZpZXIKLQkJfCBVbmNoZWNrZWRUeXBlT3BlcmF0aW9uCi0JCXwgUmF3VHlwZVJlZmVyZW5jZQotCQl8IE1pc3NpbmdTZXJpYWxWZXJzaW9uCi0JCXwgVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QKLQkJfCBGb3JiaWRkZW5SZWZlcmVuY2UKLQkJfCBEaXNjb3VyYWdlZFJlZmVyZW5jZQotCQl8IEFubm90YXRpb25TdXBlckludGVyZmFjZQotCQl8IFR5cGVIaWRpbmcKLQkJfCBGaW5hbFBhcmFtZXRlckJvdW5kCi0JCXwgVW5oYW5kbGVkV2FybmluZ1Rva2VuCi0JCXwgVW51c2VkTG9jYWxWYXJpYWJsZQotCQl8IFVudXNlZFByaXZhdGVNZW1iZXIKLQkJfCBVbnVzZWRMYWJlbAotCQkvKnwgTnVsbFJlZmVyZW5jZSAtLSBrZWVwIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zIGNvbW1lbnQgaW4gc3luYyAqLzsKLQotCS8vIEJ5IGRlZmF1bHQgb25seSBsaW5lcyBhbmQgc291cmNlIGF0dHJpYnV0ZXMgYXJlIGdlbmVyYXRlZC4KLQlwdWJsaWMgaW50IHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TT1VSQ0UgfCBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUzsKLQotCXB1YmxpYyBsb25nIGNvbXBsaWFuY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7IC8vIGJ5IGRlZmF1bHQgYmUgY29tcGxpYW50IHdpdGggMS40Ci0JcHVibGljIGxvbmcgc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOyAvLzEuMyBzb3VyY2UgYmVoYXZpb3IgYnkgZGVmYXVsdAotCXB1YmxpYyBsb25nIHRhcmdldEpESyA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzI7IC8vIGRlZmF1bHQgZ2VuZXJhdGVzIGZvciBKVk0xLjIKLQotCS8vIHNvdXJjZSBlbmNvZGluZyBmb3JtYXQKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRFbmNvZGluZyA9IG51bGw7IC8vIHdpbGwgdXNlIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nCi0KLQkvLyBwcmludCB3aGF0IHVuaXQgaXMgYmVpbmcgcHJvY2Vzc2VkCi0JcHVibGljIGJvb2xlYW4gdmVyYm9zZSA9IENvbXBpbGVyLkRFQlVHOwotCi0JLy8gaW5kaWNhdGVzIGlmIHJlZmVyZW5jZSBpbmZvIGlzIGRlc2lyZWQKLQlwdWJsaWMgYm9vbGVhbiBwcm9kdWNlUmVmZXJlbmNlSW5mbyA9IGZhbHNlOwotCi0JLy8gaW5kaWNhdGVzIGlmIHVudXNlZC9vcHRpbWl6YWJsZSBsb2NhbCB2YXJpYWJsZXMgbmVlZCB0byBiZSBwcmVzZXJ2ZWQgKGRlYnVnZ2luZyBwdXJwb3NlKQotCXB1YmxpYyBib29sZWFuIHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMgPSBmYWxzZTsKLQotCS8vIGluZGljYXRlcyB3aGV0aGVyIGxpdGVyYWwgZXhwcmVzc2lvbnMgYXJlIGlubGluZWQgYXQgcGFyc2UtdGltZSBvciBub3QKLQlwdWJsaWMgYm9vbGVhbiBwYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzID0gdHJ1ZTsKLQotCS8vIG1heCBwcm9ibGVtcyBwZXIgY29tcGlsYXRpb24gdW5pdAotCXB1YmxpYyBpbnQgbWF4UHJvYmxlbXNQZXJVbml0ID0gMTAwOyAvLyBubyBtb3JlIHRoYW4gMTAwIHByb2JsZW1zIHBlciBkZWZhdWx0Ci0KLQkvLyB0YWdzIHVzZWQgdG8gcmVjb2duaXplIHRhc2tzIGluIGNvbW1lbnRzCi0JcHVibGljIGNoYXJbXVtdIHRhc2tUYWdzID0gbnVsbDsKLQlwdWJsaWMgY2hhcltdW10gdGFza1ByaW9yaXRlcyA9IG51bGw7Ci0JcHVibGljIGJvb2xlYW4gaXNUYXNrQ2FzZVNlbnNpdGl2ZSA9IHRydWU7Ci0KLQkvLyBkZXByZWNhdGlvbiByZXBvcnQKLQlwdWJsaWMgYm9vbGVhbiByZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gcmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QgPSBmYWxzZTsKLQotCS8vIHVudXNlZCBwYXJhbWV0ZXJzIHJlcG9ydAotCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiByZXBvcnRVbnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSA9IHRydWU7Ci0KLQkvLyB1bnVzZWQgZGVjbGFyYXRpb24gb2YgdGhyb3duIGV4Y2VwdGlvbgotCXB1YmxpYyBib29sZWFuIHJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcgPSBmYWxzZTsKLQotCS8vIGNvbnN0cnVjdG9yL3NldHRlciBwYXJhbWV0ZXIgaGlkaW5nCi0JcHVibGljIGJvb2xlYW4gcmVwb3J0U3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkID0gZmFsc2U7Ci0KLQkvLyBjaGVjayBqYXZhZG9jIGNvbW1lbnRzIHRhZ3MKLQlwdWJsaWMgaW50IHJlcG9ydEludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHkgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljOwotCXB1YmxpYyBib29sZWFuIHJlcG9ydEludmFsaWRKYXZhZG9jVGFncyA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIHJlcG9ydEludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWYgPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiByZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmID0gZmFsc2U7Ci0KLQkvLyBjaGVjayBtaXNzaW5nIGphdmFkb2MgdGFncwotCXB1YmxpYyBpbnQgcmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eSA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWM7Ci0JcHVibGljIGJvb2xlYW4gcmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZyA9IGZhbHNlOwotCi0JLy8gY2hlY2sgbWlzc2luZyBqYXZhZG9jIGNvbW1lbnRzCi0JcHVibGljIGludCByZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWM7Ci0JcHVibGljIGJvb2xlYW4gcmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcgPSBmYWxzZTsKLQotCS8vIEpTUiBieXRlY29kZSBpbmxpbmluZwotCXB1YmxpYyBib29sZWFuIGlubGluZUpzckJ5dGVjb2RlID0gZmFsc2U7Ci0KLQkvLyBqYXZhZG9jIGNvbW1lbnQgc3VwcG9ydAotCXB1YmxpYyBib29sZWFuIGRvY0NvbW1lbnRTdXBwb3J0ID0gZmFsc2U7Ci0KLQkvLyBzdXBwcmVzcyB3YXJuaW5nIGFubm90YXRpb24KLQlwdWJsaWMgYm9vbGVhbiBzdXBwcmVzc1dhcm5pbmdzID0gdHJ1ZTsKLQotCS8vIHRyZWF0IG9wdGlvbmFsIGVycm9yIGFzIGZhdGFsIG9yIGp1c3QgbGlrZSB3YXJuaW5nPwotCXB1YmxpYyBib29sZWFuIHRyZWF0T3B0aW9uYWxFcnJvckFzRmF0YWwgPSB0cnVlOwotCi0JLy8gcGFyc2VyIHBlcmZvcm0gc3RhdGVtZW50cyByZWNvdmVyeQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1NZXRob2RzRnVsbFJlY292ZXJ5ID0gdHJ1ZTsKLQotCS8vIHBhcnNlciBwZXJmb3JtIHN0YXRlbWVudHMgcmVjb3ZlcnkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gdHJ1ZTsKLQotCS8vIHN0b3JlIGFubm90YXRpb25zCi0JcHVibGljIGJvb2xlYW4gc3RvcmVBbm5vdGF0aW9ucyA9IGZhbHNlOwotCi0JLy8gYW5ub3RhdGlvbiBwcm9jZXNzaW5nCi0JcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVDbGFzc0ZpbGVzID0gdHJ1ZTsKLQotCS8vIEVuYWJsZSBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGJhdGNoIG1vZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQW5ub3RhdGlvbnMgPSBmYWxzZTsKKwkvLyBrZWVwIGluIHN5bmMgd2l0aCB3YXJuaW5nVG9rZW5Ub0lycml0YW50IGFuZCB3YXJuaW5nVG9rZW5Gcm9tSXJyaXRhbnQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIHdhcm5pbmdUb2tlbnMgPSB7CisJCSJhbGwiLCAvLyROT04tTkxTLTEkCisJCSJib3hpbmciLCAvLyROT04tTkxTLTEkCisJCSJjYXN0IiwgLy8kTk9OLU5MUy0xJAorCQkiZGVwLWFubiIsIC8vJE5PTi1OTFMtMSQKKwkJImRlcHJlY2F0aW9uIiwgLy8kTk9OLU5MUy0xJAorCQkiZmFsbHRocm91Z2giLCAvLyROT04tTkxTLTEkCisJCSJmaW5hbGx5IiwgLy8kTk9OLU5MUy0xJAorCQkiaGlkaW5nIiwgLy8kTk9OLU5MUy0xJAorCQkiaW5jb21wbGV0ZS1zd2l0Y2giLCAvLyROT04tTkxTLTEkCisJCSJqYXZhZG9jIiwgLy8kTk9OLU5MUy0xJAorCQkibmxzIiwgLy8kTk9OLU5MUy0xJAorCQkibnVsbCIsIC8vJE5PTi1OTFMtMSQKKwkJInJlc3RyaWN0aW9uIiwgLy8kTk9OLU5MUy0xJAorCQkicmF3dHlwZXMiLCAvLyROT04tTkxTLTEkCisJCSJzZXJpYWwiLCAvLyROT04tTkxTLTEkCisJCSJzdGF0aWMtYWNjZXNzIiwgLy8kTk9OLU5MUy0xJAorCQkic3RhdGljLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQKKwkJInN1cGVyIiwgLy8kTk9OLU5MUy0xJAorCQkic3ludGhldGljLWFjY2VzcyIsIC8vJE5PTi1OTFMtMSQKKwkJInVuY2hlY2tlZCIsIC8vJE5PTi1OTFMtMSQKKwkJInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIsIC8vJE5PTi1OTFMtMSQKKwkJInVudXNlZCIsIC8vJE5PTi1OTFMtMSQKKwl9OwogCiAJLyoqCiAJICogSW5pdGlhbGl6aW5nIHRoZSBjb21waWxlciBvcHRpb25zIHdpdGggZGVmYXVsdHMKIAkgKi8KIAlwdWJsaWMgQ29tcGlsZXJPcHRpb25zKCl7Ci0JCS8vIHVzZSBkZWZhdWx0IG9wdGlvbnMKKwkJdGhpcyhudWxsKTsgLy8gdXNlIGRlZmF1bHQgb3B0aW9ucwogCX0KIAogCS8qKgpAQCAtMzMyLDkgKzQwMCwxMCBAQAogCSAqIEBwYXJhbSBzZXR0aW5ncwogCSAqLwogCXB1YmxpYyBDb21waWxlck9wdGlvbnMoTWFwIHNldHRpbmdzKXsKLQotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkgcmV0dXJuOwotCQlzZXQoc2V0dGluZ3MpOworCQlyZXNldERlZmF1bHRzKCk7CisJCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7CisJCQlzZXQoc2V0dGluZ3MpOworCQl9CiAJfQogCiAJLyoqCkBAIC0zNDUsNiArNDE0LDQ2MiBAQAogCQl0aGlzLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMgPSBwYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzOwogCX0KIAorCS8qKgorCSAqIFJldHVybiB0aGUgbW9zdCBzcGVjaWZpYyBvcHRpb24ga2V5IGNvbnRyb2xsaW5nIHRoaXMgaXJyaXRhbnQuIE5vdGUgdGhhdCBpbiBzb21lIGNhc2UsIHNvbWUgaXJyaXRhbnQgaXMgY29udHJvbGxlZCBieQorCSAqIG90aGVyIG1hc3RlciBvcHRpb25zIChlLmcuIGphdmFkb2MsIGRlcHJlY2F0aW9uLCBldGMuKS4KKwkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkIGZvciBncm91cGluZyBwdXJwb3NlIChzZXZlcmFsIHByb2JsZW1zIGdvdmVybmVkIGJ5IGEgcnVsZSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25LZXlGcm9tSXJyaXRhbnQoaW50IGlycml0YW50KSB7CisJCS8vIGtlZXAgaW4gc3luYyB3aXRoIHdhcm5pbmdUb2tlbnMgYW5kIHdhcm5pbmdUb2tlblRvSXJyaXRhbnQKKwkJc3dpdGNoIChpcnJpdGFudCkgeworCQkJY2FzZSBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7CisJCQljYXNlIE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZCAgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kOworCQkJY2FzZSBVc2luZ0RlcHJlY2F0ZWRBUEkgOgorCQkJY2FzZSAoSW52YWxpZEphdmFkb2MgfCBVc2luZ0RlcHJlY2F0ZWRBUEkpIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uOworCQkJY2FzZSBNYXNrZWRDYXRjaEJsb2NrICA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrOworCQkJY2FzZSBVbnVzZWRMb2NhbFZhcmlhYmxlIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsOworCQkJY2FzZSBVbnVzZWRBcmd1bWVudCA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXI7CisJCQljYXNlIE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uOworCQkJY2FzZSBBY2Nlc3NFbXVsYXRpb24gOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uOworCQkJY2FzZSBOb25FeHRlcm5hbGl6ZWRTdHJpbmcgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbDsKKwkJCWNhc2UgQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXI7CisJCQljYXNlIFVudXNlZEltcG9ydCA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQ7CisJCQljYXNlIE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljOworCQkJY2FzZSBUYXNrIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1Rhc2tUYWdzOworCQkJY2FzZSBOb0VmZmVjdEFzc2lnbm1lbnQgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0Tm9FZmZlY3RBc3NpZ25tZW50OworCQkJY2FzZSBJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOworCQkJY2FzZSBVbnVzZWRQcml2YXRlTWVtYmVyIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZFByaXZhdGVNZW1iZXI7CisJCQljYXNlIExvY2FsVmFyaWFibGVIaWRpbmcgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TG9jYWxWYXJpYWJsZUhpZGluZzsKKwkJCWNhc2UgRmllbGRIaWRpbmcgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0RmllbGRIaWRpbmc7CisJCQljYXNlIEFjY2lkZW50YWxCb29sZWFuQXNzaWduIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50OworCQkJY2FzZSBFbXB0eVN0YXRlbWVudCA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRFbXB0eVN0YXRlbWVudDsKKwkJCWNhc2UgTWlzc2luZ0phdmFkb2NDb21tZW50cyAgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50czsKKwkJCWNhc2UgTWlzc2luZ0phdmFkb2NUYWdzIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnczsKKwkJCWNhc2UgVW5xdWFsaWZpZWRGaWVsZEFjY2VzcyA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnF1YWxpZmllZEZpZWxkQWNjZXNzOworCQkJY2FzZSBVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nOworCQkJY2FzZSBGaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseTsKKwkJCWNhc2UgSW52YWxpZEphdmFkb2MgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2M7CisJCQljYXNlIFVubmVjZXNzYXJ5VHlwZUNoZWNrIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5VHlwZUNoZWNrOworCQkJY2FzZSBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVuZG9jdW1lbnRlZEVtcHR5QmxvY2s7CisJCQljYXNlIEluZGlyZWN0U3RhdGljQWNjZXNzIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzOworCQkJY2FzZSBVbm5lY2Vzc2FyeUVsc2UgIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5RWxzZTsKKwkJCWNhc2UgVW5jaGVja2VkVHlwZU9wZXJhdGlvbiA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbmNoZWNrZWRUeXBlT3BlcmF0aW9uOworCQkJY2FzZSBGaW5hbFBhcmFtZXRlckJvdW5kIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEZpbmFsUGFyYW1ldGVyQm91bmQ7CisJCQljYXNlIE1pc3NpbmdTZXJpYWxWZXJzaW9uIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdTZXJpYWxWZXJzaW9uIDsKKwkJCWNhc2UgRW51bVVzZWRBc0FuSWRlbnRpZmllciA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRFbnVtSWRlbnRpZmllcjsKKwkJCWNhc2UgRm9yYmlkZGVuUmVmZXJlbmNlIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEZvcmJpZGRlblJlZmVyZW5jZTsKKwkJCWNhc2UgVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q7CisJCQljYXNlIE51bGxSZWZlcmVuY2UgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TnVsbFJlZmVyZW5jZTsKKwkJCWNhc2UgUG90ZW50aWFsTnVsbFJlZmVyZW5jZSA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRQb3RlbnRpYWxOdWxsUmVmZXJlbmNlOworCQkJY2FzZSBSZWR1bmRhbnROdWxsQ2hlY2sgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmVkdW5kYW50TnVsbENoZWNrOworCQkJY2FzZSBBdXRvQm94aW5nIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEF1dG9ib3hpbmc7CisJCQljYXNlIEFubm90YXRpb25TdXBlckludGVyZmFjZSA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U7CisJCQljYXNlIFR5cGVIaWRpbmcgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VHlwZVBhcmFtZXRlckhpZGluZzsKKwkJCWNhc2UgTWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbiA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uOworCQkJY2FzZSBJbmNvbXBsZXRlRW51bVN3aXRjaCA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRJbmNvbXBsZXRlRW51bVN3aXRjaDsKKwkJCWNhc2UgTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbjsKKwkJCWNhc2UgRGlzY291cmFnZWRSZWZlcmVuY2UgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0RGlzY291cmFnZWRSZWZlcmVuY2U7CisJCQljYXNlIFVuaGFuZGxlZFdhcm5pbmdUb2tlbiA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW47CisJCQljYXNlIFJhd1R5cGVSZWZlcmVuY2UgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmF3VHlwZVJlZmVyZW5jZTsKKwkJCWNhc2UgVW51c2VkTGFiZWwgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VW51c2VkTGFiZWw7CisJCQljYXNlIFBhcmFtZXRlckFzc2lnbm1lbnQgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UGFyYW1ldGVyQXNzaWdubWVudDsKKwkJCWNhc2UgRmFsbHRocm91Z2hDYXNlIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEZhbGx0aHJvdWdoQ2FzZTsKKwkJCWNhc2UgT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24gOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb247CisJCQljYXNlIE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24gOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbjsKKwkJCWNhc2UgVW51c2VkVHlwZUFyZ3VtZW50cyA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWRUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbjsKKwkJCWNhc2UgVW51c2VkV2FybmluZ1Rva2VuIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZFdhcm5pbmdUb2tlbjsKKwkJCWNhc2UgUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmVkdW5kYW50U3VwZXJpbnRlcmZhY2U7CisJCQljYXNlIENvbXBhcmluZ0lkZW50aWNhbCA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRDb21wYXJpbmdJZGVudGljYWw7CisJCQljYXNlIE1pc3NpbmdTeW5jaHJvbml6ZWRNb2RpZmllckluSW5oZXJpdGVkTWV0aG9kIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZDsKKwkJCWNhc2UgU2hvdWxkSW1wbGVtZW50SGFzaGNvZGUgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TWlzc2luZ0hhc2hDb2RlTWV0aG9kOworCQkJY2FzZSBEZWFkQ29kZSA6CisJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnREZWFkQ29kZTsKKwkJCWNhc2UgVW51c2VkT2JqZWN0QWxsb2NhdGlvbjoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZE9iamVjdEFsbG9jYXRpb247CisJCQljYXNlIE1ldGhvZENhbkJlU3RhdGljIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlU3RhdGljOworCQkJY2FzZSBNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljIDoKKwkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWM7CisJCQljYXNlIFJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMgOgorCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50czsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uRnJvbUpka0xldmVsKGxvbmcgamRrTGV2ZWwpIHsKKwkJc3dpdGNoICgoaW50KShqZGtMZXZlbD4+MTYpKSB7CisJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfMSA6CisJCQkJaWYgKGpka0xldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzEpCisJCQkJCXJldHVybiBWRVJTSU9OXzFfMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV8yIDoKKwkJCQlpZiAoamRrTGV2ZWwgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMikKKwkJCQkJcmV0dXJuIFZFUlNJT05fMV8yOworCQkJCWJyZWFrOworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzMgOgorCQkJCWlmIChqZGtMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zKQorCQkJCQlyZXR1cm4gVkVSU0lPTl8xXzM7CisJCQkJYnJlYWs7CisJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfNCA6CisJCQkJaWYgKGpka0xldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpCisJCQkJCXJldHVybiBWRVJTSU9OXzFfNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV81IDoKKwkJCQlpZiAoamRrTGV2ZWwgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkKKwkJCQkJcmV0dXJuIFZFUlNJT05fMV81OworCQkJCWJyZWFrOworCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzYgOgorCQkJCWlmIChqZGtMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82KQorCQkJCQlyZXR1cm4gVkVSU0lPTl8xXzY7CisJCQkJYnJlYWs7CisJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfNyA6CisJCQkJaWYgKGpka0xldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpCisJCQkJCXJldHVybiBWRVJTSU9OXzFfNzsKKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7IC8vIHVua25vd24gdmVyc2lvbgorCX0KKworCXB1YmxpYyBzdGF0aWMgbG9uZyB2ZXJzaW9uVG9KZGtMZXZlbChPYmplY3QgdmVyc2lvbklEKSB7CisJCWlmICh2ZXJzaW9uSUQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgdmVyc2lvbklEOworCQkJLy8gdmVyaWZpY2F0aW9uIGlzIG9wdGltaXplZCBmb3IgYWxsIHZlcnNpb25zIHdpdGggc2FtZSBsZW5ndGggYW5kIHNhbWUgIjEuIiBwcmVmaXgKKwkJCWlmICh2ZXJzaW9uLmxlbmd0aCgpID09IDMgJiYgdmVyc2lvbi5jaGFyQXQoMCkgPT0gJzEnICYmIHZlcnNpb24uY2hhckF0KDEpID09ICcuJykgeworCQkJCXN3aXRjaCAodmVyc2lvbi5jaGFyQXQoMikpIHsKKwkJCQkJY2FzZSAnMSc6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMTsKKwkJCQkJY2FzZSAnMic6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMjsKKwkJCQkJY2FzZSAnMyc6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMzsKKwkJCQkJY2FzZSAnNCc6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKKwkJCQkJY2FzZSAnNSc6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJCQkJY2FzZSAnNic6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNjsKKwkJCQkJY2FzZSAnNyc6CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNzsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiAwOyAvLyB1bmtub3duCisJCQkJfQorCQkJfQorCQkJaWYgKFZFUlNJT05fSlNSMTQuZXF1YWxzKHZlcnNpb25JRCkpIHsKKwkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKKwkJCX0KKwkJCWlmIChWRVJTSU9OX0NMREMxXzEuZXF1YWxzKHZlcnNpb25JRCkpIHsKKwkJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkNMRENfMV8xOworCQkJfQorCQl9CisJCXJldHVybiAwOyAvLyB1bmtub3duCisJfQorCisJLyoqCisJICogUmV0dXJuIGFsbCB3YXJuaW5nIG9wdGlvbiBuYW1lcyBmb3IgdXNlIGFzIGtleXMgaW4gY29tcGlsZXIgb3B0aW9ucyBtYXBzLgorCSAqIEByZXR1cm4gYWxsIHdhcm5pbmcgb3B0aW9uIG5hbWVzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSB3YXJuaW5nT3B0aW9uTmFtZXMoKSB7CisJCVN0cmluZ1tdIHJlc3VsdCA9IHsKKwkJCU9QVElPTl9SZXBvcnRBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UsCisJCQlPUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwKKwkJCU9QVElPTl9SZXBvcnRBdXRvYm94aW5nLAorCQkJT1BUSU9OX1JlcG9ydENvbXBhcmluZ0lkZW50aWNhbCwKKwkJCU9QVElPTl9SZXBvcnREZWFkQ29kZSwKKwkJCU9QVElPTl9SZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50LAorCQkJT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLAorCQkJT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwKKwkJCU9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwKKwkJCU9QVElPTl9SZXBvcnREaXNjb3VyYWdlZFJlZmVyZW5jZSwKKwkJCU9QVElPTl9SZXBvcnRFbXB0eVN0YXRlbWVudCwKKwkJCU9QVElPTl9SZXBvcnRFbnVtSWRlbnRpZmllciwKKwkJCU9QVElPTl9SZXBvcnRGYWxsdGhyb3VnaENhc2UsCisJCQlPUFRJT05fUmVwb3J0RmllbGRIaWRpbmcsCisJCQlPUFRJT05fUmVwb3J0RmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5LAorCQkJT1BUSU9OX1JlcG9ydEZpbmFsUGFyYW1ldGVyQm91bmQsCisJCQlPUFRJT05fUmVwb3J0Rm9yYmlkZGVuUmVmZXJlbmNlLAorCQkJT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssCisJCQlPUFRJT05fUmVwb3J0SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kLAorCQkJT1BUSU9OX1JlcG9ydEluY29tcGxldGVFbnVtU3dpdGNoLAorCQkJT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzLAorCQkJT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jLAorCQkJT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFncywKKwkJCU9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmLAorCQkJT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWYsCisJCQlPUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSwKKwkJCU9QVElPTl9SZXBvcnRMb2NhbFZhcmlhYmxlSGlkaW5nLAorCQkJT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMsCisJCQlPUFRJT05fUmVwb3J0TWV0aG9kQ2FuQmVTdGF0aWMsCisJCQlPUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSwKKwkJCU9QVElPTl9SZXBvcnRNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24sCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0hhc2hDb2RlTWV0aG9kLAorCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHMsCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcsCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHksCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbiwKKwkJCU9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3MsCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMsCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZywKKwkJCU9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5LAorCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24sCisJCQlPUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uLAorCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdTZXJpYWxWZXJzaW9uLAorCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZCwKKwkJCU9QVElPTl9SZXBvcnROb0VmZmVjdEFzc2lnbm1lbnQsCisJCQlPUFRJT05fUmVwb3J0Tm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24sCisJCQlPUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKKwkJCU9QVElPTl9SZXBvcnROb25TdGF0aWNBY2Nlc3NUb1N0YXRpYywKKwkJCU9QVElPTl9SZXBvcnROdWxsUmVmZXJlbmNlLAorCQkJT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uLAorCQkJT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwKKwkJCU9QVElPTl9SZXBvcnRQYXJhbWV0ZXJBc3NpZ25tZW50LAorCQkJT1BUSU9OX1JlcG9ydFBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50LAorCQkJT1BUSU9OX1JlcG9ydFBvdGVudGlhbE51bGxSZWZlcmVuY2UsCisJCQlPUFRJT05fUmVwb3J0UmF3VHlwZVJlZmVyZW5jZSwKKwkJCU9QVElPTl9SZXBvcnRSZWR1bmRhbnROdWxsQ2hlY2ssCisJCQlPUFRJT05fUmVwb3J0UmVkdW5kYW50U3VwZXJpbnRlcmZhY2UsCisJCQlPUFRJT05fUmVwb3J0UmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cywKKwkJCU9QVElPTl9SZXBvcnRTcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQsCisJCQlPUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uLAorCQkJT1BUSU9OX1JlcG9ydFRhc2tzLAorCQkJT1BUSU9OX1JlcG9ydFR5cGVQYXJhbWV0ZXJIaWRpbmcsCisJCQlPUFRJT05fUmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zLAorCQkJT1BUSU9OX1JlcG9ydFVuY2hlY2tlZFR5cGVPcGVyYXRpb24sCisJCQlPUFRJT05fUmVwb3J0VW5kb2N1bWVudGVkRW1wdHlCbG9jaywKKwkJCU9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW4sCisJCQlPUFRJT05fUmVwb3J0VW5uZWNlc3NhcnlFbHNlLAorCQkJT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5VHlwZUNoZWNrLAorCQkJT1BUSU9OX1JlcG9ydFVucXVhbGlmaWVkRmllbGRBY2Nlc3MsCisJCQlPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24sCisJCQlPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUsCisJCQlPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nLAorCQkJT1BUSU9OX1JlcG9ydFVudXNlZEltcG9ydCwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRMYWJlbCwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRPYmplY3RBbGxvY2F0aW9uLAorCQkJT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QsCisJCQlPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZSwKKwkJCU9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyLAorCQkJT1BUSU9OX1JlcG9ydFVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uLAorCQkJT1BUSU9OX1JlcG9ydFVudXNlZFdhcm5pbmdUb2tlbiwKKwkJCU9QVElPTl9SZXBvcnRWYXJhcmdzQXJndW1lbnROZWVkQ2FzdCwKKwkJfTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBGb3Igc3VwcHJlc3NhYmxlIHdhcm5pbmdzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgd2FybmluZ1Rva2VuRnJvbUlycml0YW50KGludCBpcnJpdGFudCkgeworCQkvLyBrZWVwIGluIHN5bmMgd2l0aCB3YXJuaW5nVG9rZW5zIGFuZCB3YXJuaW5nVG9rZW5Ub0lycml0YW50CisJCXN3aXRjaCAoaXJyaXRhbnQpIHsKKwkJCWNhc2UgKEludmFsaWRKYXZhZG9jIHwgVXNpbmdEZXByZWNhdGVkQVBJKSA6CisJCQljYXNlIFVzaW5nRGVwcmVjYXRlZEFQSSA6CisJCQkJcmV0dXJuICJkZXByZWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgRmluYWxseUJsb2NrTm90Q29tcGxldGluZyA6CisJCQkJcmV0dXJuICJmaW5hbGx5IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBGaWVsZEhpZGluZyA6CisJCQljYXNlIExvY2FsVmFyaWFibGVIaWRpbmcgOgorCQkJY2FzZSBNYXNrZWRDYXRjaEJsb2NrIDoKKwkJCQlyZXR1cm4gImhpZGluZyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTm9uRXh0ZXJuYWxpemVkU3RyaW5nIDoKKwkJCQlyZXR1cm4gIm5scyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgVW5uZWNlc3NhcnlUeXBlQ2hlY2sgOgorCQkJCXJldHVybiAiY2FzdCI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSW5kaXJlY3RTdGF0aWNBY2Nlc3MgOgorCQkJY2FzZSBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpYyA6CisJCQkJcmV0dXJuICJzdGF0aWMtYWNjZXNzIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBBY2Nlc3NFbXVsYXRpb24gOgorCQkJCXJldHVybiAic3ludGhldGljLWFjY2VzcyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgVW5xdWFsaWZpZWRGaWVsZEFjY2VzcyA6CisJCQkJcmV0dXJuICJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFVuY2hlY2tlZFR5cGVPcGVyYXRpb24gOgorCQkJCXJldHVybiAidW5jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBNaXNzaW5nU2VyaWFsVmVyc2lvbiA6CisJCQkJcmV0dXJuICJzZXJpYWwiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIEF1dG9Cb3hpbmcgOgorCQkJCXJldHVybiAiYm94aW5nIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBUeXBlSGlkaW5nIDoKKwkJCQlyZXR1cm4gImhpZGluZyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSW5jb21wbGV0ZUVudW1Td2l0Y2ggOgorCQkJCXJldHVybiAiaW5jb21wbGV0ZS1zd2l0Y2giOyAvLyROT04tTkxTLTEkCisJCQljYXNlIE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbiA6CisJCQkJcmV0dXJuICJkZXAtYW5uIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBSYXdUeXBlUmVmZXJlbmNlIDoKKwkJCQlyZXR1cm4gInJhd3R5cGVzIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBVbnVzZWRMYWJlbCA6CisJCQljYXNlIFVudXNlZFR5cGVBcmd1bWVudHMgOgorCQkJY2FzZSBSZWR1bmRhbnRTdXBlcmludGVyZmFjZSA6CisJCQljYXNlIFVudXNlZExvY2FsVmFyaWFibGUgOgorCQkJY2FzZSBVbnVzZWRBcmd1bWVudCA6CisJCQljYXNlIFVudXNlZEltcG9ydCA6CisJCQljYXNlIFVudXNlZFByaXZhdGVNZW1iZXIgOgorCQkJY2FzZSBVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiA6CisJCQljYXNlIERlYWRDb2RlIDoKKwkJCWNhc2UgVW51c2VkT2JqZWN0QWxsb2NhdGlvbiA6CisJCQljYXNlIFJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMgOgorCQkJCXJldHVybiAidW51c2VkIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBEaXNjb3VyYWdlZFJlZmVyZW5jZSA6CisJCQljYXNlIEZvcmJpZGRlblJlZmVyZW5jZSA6CisJCQkJcmV0dXJuICJyZXN0cmljdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTnVsbFJlZmVyZW5jZSA6CisJCQljYXNlIFBvdGVudGlhbE51bGxSZWZlcmVuY2UgOgorCQkJY2FzZSBSZWR1bmRhbnROdWxsQ2hlY2sgOgorCQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgRmFsbHRocm91Z2hDYXNlIDoKKwkJCQlyZXR1cm4gImZhbGx0aHJvdWdoIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBPdmVycmlkaW5nTWV0aG9kV2l0aG91dFN1cGVySW52b2NhdGlvbiA6CisJCQkJcmV0dXJuICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTWV0aG9kQ2FuQmVTdGF0aWMgOgorCQkJY2FzZSBNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljIDoKKwkJCQlyZXR1cm4gInN0YXRpYy1tZXRob2QiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIEludmFsaWRKYXZhZG9jIDoKKwkJCWNhc2UgTWlzc2luZ0phdmFkb2NDb21tZW50cyA6CisJCQljYXNlIE1pc3NpbmdKYXZhZG9jVGFnczoKKwkJCQlyZXR1cm4gImphdmFkb2MiOyAvLyROT04tTkxTLTEkCQkJCQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgSXJyaXRhbnRTZXQgd2FybmluZ1Rva2VuVG9JcnJpdGFudHMoU3RyaW5nIHdhcm5pbmdUb2tlbikgeworCQkvLyBrZWVwIGluIHN5bmMgd2l0aCB3YXJuaW5nVG9rZW5zIGFuZCB3YXJuaW5nVG9rZW5Gcm9tSXJyaXRhbnQKKwkJaWYgKHdhcm5pbmdUb2tlbiA9PSBudWxsIHx8IHdhcm5pbmdUb2tlbi5sZW5ndGgoKSA9PSAwKSByZXR1cm4gbnVsbDsKKwkJc3dpdGNoICh3YXJuaW5nVG9rZW4uY2hhckF0KDApKSB7CisJCQljYXNlICdhJyA6CisJCQkJaWYgKCJhbGwiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBJcnJpdGFudFNldC5BTEw7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJyA6CisJCQkJaWYgKCJib3hpbmciLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBJcnJpdGFudFNldC5CT1hJTkc7CisJCQkJYnJlYWs7CisJCQljYXNlICdjJyA6CisJCQkJaWYgKCJjYXN0Ii5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuQ0FTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnIDoKKwkJCQlpZiAoImRlcHJlY2F0aW9uIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuREVQUkVDQVRJT047CisJCQkJaWYgKCJkZXAtYW5uIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuREVQX0FOTjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnIDoKKwkJCQlpZiAoImZhbGx0aHJvdWdoIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuRkFMTFRIUk9VR0g7CisJCQkJaWYgKCJmaW5hbGx5Ii5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuRklOQUxMWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2gnIDoKKwkJCQlpZiAoImhpZGluZyIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LkhJRElORzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knIDoKKwkJCQlpZiAoImluY29tcGxldGUtc3dpdGNoIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuSU5DT01QTEVURV9TV0lUQ0g7CisJCQkJYnJlYWs7CisJCQljYXNlICdqJyA6CisJCQkJaWYgKCJqYXZhZG9jIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuSkFWQURPQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nIDoKKwkJCQlpZiAoIm5scyIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0Lk5MUzsKKwkJCQlpZiAoIm51bGwiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBJcnJpdGFudFNldC5OVUxMOworCQkJCWJyZWFrOworCQkJY2FzZSAncicgOgorCQkJCWlmICgicmF3dHlwZXMiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBJcnJpdGFudFNldC5SQVc7CisJCQkJaWYgKCJyZXN0cmljdGlvbiIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlJFU1RSSUNUSU9OOworCQkJCWJyZWFrOworCQkJY2FzZSAncycgOgorCQkJCWlmICgic2VyaWFsIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuU0VSSUFMOworCQkJCWlmICgic3RhdGljLWFjY2VzcyIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlNUQVRJQ19BQ0NFU1M7CisJCQkJaWYgKCJzdGF0aWMtbWV0aG9kIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gSXJyaXRhbnRTZXQuU1RBVElDX01FVEhPRDsKKwkJCQlpZiAoInN5bnRoZXRpYy1hY2Nlc3MiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBJcnJpdGFudFNldC5TWU5USEVUSUNfQUNDRVNTOworCQkJCWlmICgic3VwZXIiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlNVUEVSOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnIDoKKwkJCQlpZiAoInVudXNlZCIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlVOVVNFRDsKKwkJCQlpZiAoInVuY2hlY2tlZCIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlVOQ0hFQ0tFRDsKKwkJCQlpZiAoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIElycml0YW50U2V0LlVOUVVBTElGSUVEX0ZJRUxEX0FDQ0VTUzsKKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkKIAlwdWJsaWMgTWFwIGdldE1hcCgpIHsKIAkJTWFwIG9wdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgzMCk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLCAodGhpcy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfVkFSUykgIT0gMCA/IEdFTkVSQVRFIDogRE9fTk9UX0dFTkVSQVRFKTsKQEAgLTM5MCwxMyArOTE1LDE4IEBACiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3MsIGdldFNldmVyaXR5U3RyaW5nKE1pc3NpbmdKYXZhZG9jVGFncykpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eSwgZ2V0VmlzaWJpbGl0eVN0cmluZyh0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHkpKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmcsIHRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NNZXRob2RUeXBlUGFyYW1ldGVycywgdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NNZXRob2RUeXBlUGFyYW1ldGVycyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzLCBnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nSmF2YWRvY0NvbW1lbnRzKSk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uLCB0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24pOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHksIGdldFZpc2liaWxpdHlTdHJpbmcodGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSkpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcsIHRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcgPyBFTkFCTEVEIDogRElTQUJMRUQpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0RmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5LCBnZXRTZXZlcml0eVN0cmluZyhGaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiwgZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24pKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcsIHRoaXMucmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlLCB0aGlzLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UgPyBFTkFCTEVEIDogRElTQUJMRUQpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUsIHRoaXMucmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUgPyBFTkFCTEVEIDogRElTQUJMRUQpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW5xdWFsaWZpZWRGaWVsZEFjY2VzcywgZ2V0U2V2ZXJpdHlTdHJpbmcoVW5xdWFsaWZpZWRGaWVsZEFjY2VzcykpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zLCB0aGlzLnJlcG9ydFVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRVbmNoZWNrZWRUeXBlT3BlcmF0aW9uLCBnZXRTZXZlcml0eVN0cmluZyhVbmNoZWNrZWRUeXBlT3BlcmF0aW9uKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRSYXdUeXBlUmVmZXJlbmNlLCBnZXRTZXZlcml0eVN0cmluZyhSYXdUeXBlUmVmZXJlbmNlKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRGaW5hbFBhcmFtZXRlckJvdW5kLCBnZXRTZXZlcml0eVN0cmluZyhGaW5hbFBhcmFtZXRlckJvdW5kKSk7CkBAIC00MDUsOSArOTM1LDExIEBACiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnREaXNjb3VyYWdlZFJlZmVyZW5jZSwgZ2V0U2V2ZXJpdHlTdHJpbmcoRGlzY291cmFnZWRSZWZlcmVuY2UpKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0LCBnZXRTZXZlcml0eVN0cmluZyhWYXJhcmdzQXJndW1lbnROZWVkQ2FzdCkpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbiwgZ2V0U2V2ZXJpdHlTdHJpbmcoTWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbikpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uLCB0aGlzLnJlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbiA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24sIGdldFNldmVyaXR5U3RyaW5nKE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbikpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0SW5jb21wbGV0ZUVudW1Td2l0Y2gsIGdldFNldmVyaXR5U3RyaW5nKEluY29tcGxldGVFbnVtU3dpdGNoKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRVbnVzZWRMYWJlbCwgZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkTGFiZWwpKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uLCBnZXRTZXZlcml0eVN0cmluZyhVbnVzZWRUeXBlQXJndW1lbnRzKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9Db21wbGlhbmNlLCB2ZXJzaW9uRnJvbUpka0xldmVsKHRoaXMuY29tcGxpYW5jZUxldmVsKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9Tb3VyY2UsIHZlcnNpb25Gcm9tSmRrTGV2ZWwodGhpcy5zb3VyY2VMZXZlbCkpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fVGFyZ2V0UGxhdGZvcm0sIHZlcnNpb25Gcm9tSmRrTGV2ZWwodGhpcy50YXJnZXRKREspKTsKQEAgLTQxNiw3ICs5NDgsNyBAQAogCQkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX0VuY29kaW5nLCB0aGlzLmRlZmF1bHRFbmNvZGluZyk7CiAJCX0KIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1Rhc2tUYWdzLCB0aGlzLnRhc2tUYWdzID09IG51bGwgPyBVdGlsLkVNUFRZX1NUUklORyA6IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMudGFza1RhZ3MsJywnKSkpOwotCQlvcHRpb25zTWFwLnB1dChPUFRJT05fVGFza1ByaW9yaXRpZXMsIHRoaXMudGFza1ByaW9yaXRlcyA9PSBudWxsID8gVXRpbC5FTVBUWV9TVFJJTkcgOiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnRhc2tQcmlvcml0ZXMsJywnKSkpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fVGFza1ByaW9yaXRpZXMsIHRoaXMudGFza1ByaW9yaXRpZXMgPT0gbnVsbCA/IFV0aWwuRU1QVFlfU1RSSU5HIDogbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy50YXNrUHJpb3JpdGllcywnLCcpKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9UYXNrQ2FzZVNlbnNpdGl2ZSwgdGhpcy5pc1Rhc2tDYXNlU2Vuc2l0aXZlID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCwgdGhpcy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QgPyBFTkFCTEVEIDogRElTQUJMRUQpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZSwgdGhpcy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKQEAgLTQyOCwxNzIgKzk2MCw1MSBAQAogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0UG90ZW50aWFsTnVsbFJlZmVyZW5jZSwgZ2V0U2V2ZXJpdHlTdHJpbmcoUG90ZW50aWFsTnVsbFJlZmVyZW5jZSkpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0UmVkdW5kYW50TnVsbENoZWNrLCBnZXRTZXZlcml0eVN0cmluZyhSZWR1bmRhbnROdWxsQ2hlY2spKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1N1cHByZXNzV2FybmluZ3MsIHRoaXMuc3VwcHJlc3NXYXJuaW5ncyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9TdXBwcmVzc09wdGlvbmFsRXJyb3JzLCB0aGlzLnN1cHByZXNzT3B0aW9uYWxFcnJvcnMgPyBFTkFCTEVEIDogRElTQUJMRUQpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW5oYW5kbGVkV2FybmluZ1Rva2VuLCBnZXRTZXZlcml0eVN0cmluZyhVbmhhbmRsZWRXYXJuaW5nVG9rZW4pKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFVudXNlZFdhcm5pbmdUb2tlbiwgZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkV2FybmluZ1Rva2VuKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRQYXJhbWV0ZXJBc3NpZ25tZW50LCBnZXRTZXZlcml0eVN0cmluZyhQYXJhbWV0ZXJBc3NpZ25tZW50KSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRGYWxsdGhyb3VnaENhc2UsIGdldFNldmVyaXR5U3RyaW5nKEZhbGx0aHJvdWdoQ2FzZSkpOwogCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24sIGdldFNldmVyaXR5U3RyaW5nKE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uKSk7CiAJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9HZW5lcmF0ZUNsYXNzRmlsZXMsIHRoaXMuZ2VuZXJhdGVDbGFzc0ZpbGVzID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKIAkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1Byb2Nlc3NfQW5ub3RhdGlvbnMsIHRoaXMucHJvY2Vzc0Fubm90YXRpb25zID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFJlZHVuZGFudFN1cGVyaW50ZXJmYWNlLCBnZXRTZXZlcml0eVN0cmluZyhSZWR1bmRhbnRTdXBlcmludGVyZmFjZSkpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0Q29tcGFyaW5nSWRlbnRpY2FsLCBnZXRTZXZlcml0eVN0cmluZyhDb21wYXJpbmdJZGVudGljYWwpKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZCwgZ2V0U2V2ZXJpdHlTdHJpbmcoTWlzc2luZ1N5bmNocm9uaXplZE1vZGlmaWVySW5Jbmhlcml0ZWRNZXRob2QpKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdIYXNoQ29kZU1ldGhvZCwgZ2V0U2V2ZXJpdHlTdHJpbmcoU2hvdWxkSW1wbGVtZW50SGFzaGNvZGUpKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydERlYWRDb2RlLCBnZXRTZXZlcml0eVN0cmluZyhEZWFkQ29kZSkpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCwgdGhpcy5yZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50ID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKKwkJb3B0aW9uc01hcC5wdXQoT1BUSU9OX1JlcG9ydFRhc2tzLCBnZXRTZXZlcml0eVN0cmluZyhUYXNrcykpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0VW51c2VkT2JqZWN0QWxsb2NhdGlvbiwgZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkT2JqZWN0QWxsb2NhdGlvbikpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fSW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMsIHRoaXMuaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMgPyBFTkFCTEVEIDogRElTQUJMRUQpOworCQlvcHRpb25zTWFwLnB1dChPUFRJT05fUmVwb3J0TWV0aG9kQ2FuQmVTdGF0aWMsIGdldFNldmVyaXR5U3RyaW5nKE1ldGhvZENhbkJlU3RhdGljKSk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljLCBnZXRTZXZlcml0eVN0cmluZyhNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljKSk7CisJCW9wdGlvbnNNYXAucHV0KE9QVElPTl9SZXBvcnRSZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzLCBnZXRTZXZlcml0eVN0cmluZyhSZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKSk7CiAJCXJldHVybiBvcHRpb25zTWFwOwogCX0KIAotCS8qKgotCSAqIFJldHVybiB0aGUgbW9zdCBzcGVjaWZpYyBvcHRpb24ga2V5IGNvbnRyb2xsaW5nIHRoaXMgaXJyaXRhbnQuIE5vdGUgdGhhdCBpbiBzb21lIGNhc2UsIHNvbWUgaXJyaXRhbnQgaXMgY29udHJvbGxlZCBieQotCSAqIG90aGVyIG1hc3RlciBvcHRpb25zIChlLmcuIGphdmFkb2MsIGRlcHJlY2F0aW9uLCBldGMuKS4KLQkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkIGZvciBncm91cGluZyBwdXJwb3NlIChzZXZlcmFsIHByb2JsZW1zIGdvdmVybmVkIGJ5IGEgcnVsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25LZXlGcm9tSXJyaXRhbnQobG9uZyBpcnJpdGFudCkgewotCQkvLyBrZWVwIGluIHN5bmMgd2l0aCB3YXJuaW5nVG9rZW5zIGFuZCB3YXJuaW5nVG9rZW5Ub0lycml0YW50Ci0JCWludCBpcnJpdGFudEludCA9IChpbnQpIGlycml0YW50OwotCQlpZiAoaXJyaXRhbnRJbnQgPT0gaXJyaXRhbnQpIHsKLQkJCXN3aXRjaCAoaXJyaXRhbnRJbnQpIHsKLQkJCQljYXNlIChpbnQpIE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7Ci0JCQkJY2FzZSAoaW50KSBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QgIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q7Ci0JCQkJY2FzZSAoaW50KSBVc2luZ0RlcHJlY2F0ZWRBUEkgOgotCQkJCWNhc2UgKGludCkgKEludmFsaWRKYXZhZG9jIHwgVXNpbmdEZXByZWNhdGVkQVBJKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0RGVwcmVjYXRpb247Ci0JCQkJY2FzZSAoaW50KSBNYXNrZWRDYXRjaEJsb2NrICA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jazsKLQkJCQljYXNlIChpbnQpIFVudXNlZExvY2FsVmFyaWFibGUgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsOwotCQkJCWNhc2UgKGludCkgVW51c2VkQXJndW1lbnQgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcjsKLQkJCQljYXNlIChpbnQpIE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbjsKLQkJCQljYXNlIChpbnQpIEFjY2Vzc0VtdWxhdGlvbiA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uOwotCQkJCWNhc2UgKGludCkgTm9uRXh0ZXJuYWxpemVkU3RyaW5nIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsOwotCQkJCWNhc2UgKGludCkgQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRBc3NlcnRJZGVudGlmaWVyOwotCQkJCWNhc2UgKGludCkgVW51c2VkSW1wb3J0IDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQ7Ci0JCQkJY2FzZSAoaW50KSBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpYyA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0Tm9uU3RhdGljQWNjZXNzVG9TdGF0aWM7Ci0JCQkJY2FzZSAoaW50KSBUYXNrIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9UYXNrVGFnczsKLQkJCQljYXNlIChpbnQpIE5vRWZmZWN0QXNzaWdubWVudCA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0Tm9FZmZlY3RBc3NpZ25tZW50OwotCQkJCWNhc2UgKGludCkgSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7Ci0JCQkJY2FzZSAoaW50KSBVbnVzZWRQcml2YXRlTWVtYmVyIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyOwotCQkJCWNhc2UgKGludCkgTG9jYWxWYXJpYWJsZUhpZGluZyA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TG9jYWxWYXJpYWJsZUhpZGluZzsKLQkJCQljYXNlIChpbnQpIEZpZWxkSGlkaW5nIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRGaWVsZEhpZGluZzsKLQkJCQljYXNlIChpbnQpIEFjY2lkZW50YWxCb29sZWFuQXNzaWduIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRQb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudDsKLQkJCQljYXNlIChpbnQpIEVtcHR5U3RhdGVtZW50IDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRFbXB0eVN0YXRlbWVudDsKLQkJCQljYXNlIChpbnQpIE1pc3NpbmdKYXZhZG9jQ29tbWVudHMgIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzOwotCQkJCWNhc2UgKGludCkgTWlzc2luZ0phdmFkb2NUYWdzIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3M7Ci0JCQkJY2FzZSAoaW50KSBVbnF1YWxpZmllZEZpZWxkQWNjZXNzIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbnF1YWxpZmllZEZpZWxkQWNjZXNzOwotCQkJCWNhc2UgKGludCkgVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24gOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc7Ci0JCQkJY2FzZSAoaW50KSBGaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRGaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk7Ci0JCQkJY2FzZSAoaW50KSBJbnZhbGlkSmF2YWRvYyA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2M7Ci0JCQkJY2FzZSAoaW50KSBVbm5lY2Vzc2FyeVR5cGVDaGVjayA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VW5uZWNlc3NhcnlUeXBlQ2hlY2s7Ci0JCQkJY2FzZSAoaW50KSBVbmRvY3VtZW50ZWRFbXB0eUJsb2NrIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRVbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwotCQkJCWNhc2UgKGludCkgSW5kaXJlY3RTdGF0aWNBY2Nlc3MgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEluZGlyZWN0U3RhdGljQWNjZXNzOwotCQkJCWNhc2UgKGludCkgVW5uZWNlc3NhcnlFbHNlICA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VW5uZWNlc3NhcnlFbHNlOwotCQkJCWNhc2UgKGludCkgVW5jaGVja2VkVHlwZU9wZXJhdGlvbiA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VW5jaGVja2VkVHlwZU9wZXJhdGlvbjsKLQkJCQljYXNlIChpbnQpIEZpbmFsUGFyYW1ldGVyQm91bmQgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEZpbmFsUGFyYW1ldGVyQm91bmQ7CisJcHVibGljIGludCBnZXRTZXZlcml0eShpbnQgaXJyaXRhbnQpIHsKKwkJaWYgKHRoaXMuZXJyb3JUaHJlc2hvbGQuaXNTZXQoaXJyaXRhbnQpKSB7CisJCQlpZiAoKGlycml0YW50ICYgKElycml0YW50U2V0LkdST1VQX01BU0sgfCBVbnVzZWRXYXJuaW5nVG9rZW4pKSA9PSBVbnVzZWRXYXJuaW5nVG9rZW4pIHsKKwkJCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuRXJyb3IgfCBQcm9ibGVtU2V2ZXJpdGllcy5PcHRpb25hbDsgLy8gY2Fubm90IGJlIHRyZWF0ZWQgYXMgZmF0YWwgLSBjb2RlZ2VuIGFscmVhZHkgb2NjdXJyZWQKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCWlycml0YW50SW50ID0gKGludCkoaXJyaXRhbnQgPj4+IDMyKTsKLQkJCXN3aXRjaCAoaXJyaXRhbnRJbnQpIHsKLQkJCQljYXNlIChpbnQpKE1pc3NpbmdTZXJpYWxWZXJzaW9uID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdTZXJpYWxWZXJzaW9uIDsKLQkJCQljYXNlIChpbnQpKEVudW1Vc2VkQXNBbklkZW50aWZpZXIgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0RW51bUlkZW50aWZpZXI7Ci0JCQkJY2FzZSAoaW50KShGb3JiaWRkZW5SZWZlcmVuY2UgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0Rm9yYmlkZGVuUmVmZXJlbmNlOwotCQkJCWNhc2UgKGludCkoVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q7Ci0JCQkJY2FzZSAoaW50KShOdWxsUmVmZXJlbmNlID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE51bGxSZWZlcmVuY2U7Ci0JCQkJY2FzZSAoaW50KShQb3RlbnRpYWxOdWxsUmVmZXJlbmNlID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFBvdGVudGlhbE51bGxSZWZlcmVuY2U7Ci0JCQkJY2FzZSAoaW50KShSZWR1bmRhbnROdWxsQ2hlY2sgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmVkdW5kYW50TnVsbENoZWNrOwotCQkJCWNhc2UgKGludCkoQXV0b0JveGluZyA+Pj4gMzIpIDoKLQkJCQkJcmV0dXJuIE9QVElPTl9SZXBvcnRBdXRvYm94aW5nOwotCQkJCWNhc2UgKGludCkoQW5ub3RhdGlvblN1cGVySW50ZXJmYWNlID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEFubm90YXRpb25TdXBlckludGVyZmFjZTsKLQkJCQljYXNlIChpbnQpKFR5cGVIaWRpbmcgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0VHlwZVBhcmFtZXRlckhpZGluZzsKLQkJCQljYXNlIChpbnQpKE1pc3NpbmdPdmVycmlkZUFubm90YXRpb24gPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbjsKLQkJCQljYXNlIChpbnQpKEluY29tcGxldGVFbnVtU3dpdGNoID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydEluY29tcGxldGVFbnVtU3dpdGNoOwotCQkJCWNhc2UgKGludCkoTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbjsKLQkJCQljYXNlIChpbnQpKERpc2NvdXJhZ2VkUmVmZXJlbmNlID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydERpc2NvdXJhZ2VkUmVmZXJlbmNlOwotCQkJCWNhc2UgKGludCkoVW5oYW5kbGVkV2FybmluZ1Rva2VuID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVuaGFuZGxlZFdhcm5pbmdUb2tlbjsKLQkJCQljYXNlIChpbnQpKFJhd1R5cGVSZWZlcmVuY2UgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0UmF3VHlwZVJlZmVyZW5jZTsKLQkJCQljYXNlIChpbnQpKFVudXNlZExhYmVsID4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFVudXNlZExhYmVsOwotCQkJCWNhc2UgKGludCkoUGFyYW1ldGVyQXNzaWdubWVudD4+PiAzMikgOgotCQkJCQlyZXR1cm4gT1BUSU9OX1JlcG9ydFBhcmFtZXRlckFzc2lnbm1lbnQ7Ci0JCQkJY2FzZSAoaW50KShGYWxsdGhyb3VnaENhc2UgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0RmFsbHRocm91Z2hDYXNlOwotCQkJCWNhc2UgKGludCkoT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24gPj4+IDMyKSA6Ci0JCQkJCXJldHVybiBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIG9wdGlvbktleVRvSXJyaXRhbnQoU3RyaW5nIG9wdGlvbk5hbWUpIHsKLQkJaWYgKE9wdGlvblRvSXJyaXRhbnRzID09IG51bGwpIHsKLQkJCWxvbmcgaXJyaXRhbnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCQkJaXJyaXRhbnQgPDw9IDE7Ci0JCQkJU3RyaW5nIG9wdGlvbktleSA9IG9wdGlvbktleUZyb21JcnJpdGFudChpcnJpdGFudCk7Ci0JCQkJaWYgKG9wdGlvbktleSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQlPcHRpb25Ub0lycml0YW50cy5wdXQob3B0aW9uS2V5LCBuZXcgTG9uZyhpcnJpdGFudCkpOwotCQkJfQotCQl9Ci0JCUxvbmcgaXJyaXRhbnQgPSAoTG9uZylPcHRpb25Ub0lycml0YW50cy5nZXQob3B0aW9uTmFtZSk7Ci0JCXJldHVybiBpcnJpdGFudCA9PSBudWxsID8gMCA6IGlycml0YW50LmxvbmdWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkobG9uZyBpcnJpdGFudCkgewotCQlpZigodGhpcy5lcnJvclRocmVzaG9sZCAmIGlycml0YW50KSAhPSAwKSB7CiAJCQlyZXR1cm4gdGhpcy50cmVhdE9wdGlvbmFsRXJyb3JBc0ZhdGFsCiAJCQkJPyBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciB8IFByb2JsZW1TZXZlcml0aWVzLk9wdGlvbmFsIHwgUHJvYmxlbVNldmVyaXRpZXMuRmF0YWwKIAkJCQk6IFByb2JsZW1TZXZlcml0aWVzLkVycm9yIHwgUHJvYmxlbVNldmVyaXRpZXMuT3B0aW9uYWw7CiAJCX0KLQkJaWYoKHRoaXMud2FybmluZ1RocmVzaG9sZCAmIGlycml0YW50KSAhPSAwKQorCQlpZiAodGhpcy53YXJuaW5nVGhyZXNob2xkLmlzU2V0KGlycml0YW50KSkgewogCQkJcmV0dXJuIFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmcgfCBQcm9ibGVtU2V2ZXJpdGllcy5PcHRpb25hbDsKKwkJfQogCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlOwogCX0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0U2V2ZXJpdHlTdHJpbmcobG9uZyBpcnJpdGFudCkgewotCQlpZigodGhpcy53YXJuaW5nVGhyZXNob2xkICYgaXJyaXRhbnQpICE9IDApCi0JCQlyZXR1cm4gV0FSTklORzsKLQkJaWYoKHRoaXMuZXJyb3JUaHJlc2hvbGQgJiBpcnJpdGFudCkgIT0gMCkKKwlwdWJsaWMgU3RyaW5nIGdldFNldmVyaXR5U3RyaW5nKGludCBpcnJpdGFudCkgeworCQlpZih0aGlzLmVycm9yVGhyZXNob2xkLmlzU2V0KGlycml0YW50KSkKIAkJCXJldHVybiBFUlJPUjsKKwkJaWYodGhpcy53YXJuaW5nVGhyZXNob2xkLmlzU2V0KGlycml0YW50KSkKKwkJCXJldHVybiBXQVJOSU5HOwogCQlyZXR1cm4gSUdOT1JFOwogCX0KLQogCXB1YmxpYyBTdHJpbmcgZ2V0VmlzaWJpbGl0eVN0cmluZyhpbnQgbGV2ZWwpIHsKIAkJc3dpdGNoIChsZXZlbCAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0spIHsKIAkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYzoKQEAgLTYwNyw4ICsxMDE4LDEyMSBAQAogCQl9CiAJfQogCi0JcHVibGljIHZvaWQgc2V0KE1hcCBvcHRpb25zTWFwKSB7CisJcHVibGljIGJvb2xlYW4gaXNBbnlFbmFibGVkKElycml0YW50U2V0IGlycml0YW50cykgeworCQlyZXR1cm4gdGhpcy53YXJuaW5nVGhyZXNob2xkLmlzQW55U2V0KGlycml0YW50cykgfHwgdGhpcy5lcnJvclRocmVzaG9sZC5pc0FueVNldChpcnJpdGFudHMpOworCX0KIAorCXByb3RlY3RlZCB2b2lkIHJlc2V0RGVmYXVsdHMoKSB7CisJCS8vIHByb2JsZW0gZGVmYXVsdCBzZXZlcml0aWVzIGRlZmluZWQgb24gSXJyaXRhbnRTZXQKKwkJdGhpcy5lcnJvclRocmVzaG9sZCA9IG5ldyBJcnJpdGFudFNldChJcnJpdGFudFNldC5DT01QSUxFUl9ERUZBVUxUX0VSUk9SUyk7CisJCXRoaXMud2FybmluZ1RocmVzaG9sZCA9IG5ldyBJcnJpdGFudFNldChJcnJpdGFudFNldC5DT01QSUxFUl9ERUZBVUxUX1dBUk5JTkdTKTsKKwkJCisJCS8vIGJ5IGRlZmF1bHQgb25seSBsaW5lcyBhbmQgc291cmNlIGF0dHJpYnV0ZXMgYXJlIGdlbmVyYXRlZC4KKwkJdGhpcy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU09VUkNFIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfTElORVM7CisJCXRoaXMuY29tcGxpYW5jZUxldmVsID0gdGhpcy5vcmlnaW5hbENvbXBsaWFuY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7IC8vIGJ5IGRlZmF1bHQgYmUgY29tcGxpYW50IHdpdGggMS40CisJCXRoaXMuc291cmNlTGV2ZWwgPSB0aGlzLm9yaWdpbmFsU291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOyAvLzEuMyBzb3VyY2UgYmVoYXZpb3IgYnkgZGVmYXVsdAorCQl0aGlzLnRhcmdldEpESyA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzI7IC8vIGRlZmF1bHQgZ2VuZXJhdGVzIGZvciBKVk0xLjIKKworCQl0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG51bGw7IC8vIHdpbGwgdXNlIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nCisKKwkJLy8gcHJpbnQgd2hhdCB1bml0IGlzIGJlaW5nIHByb2Nlc3NlZAorCQl0aGlzLnZlcmJvc2UgPSBDb21waWxlci5ERUJVRzsKKworCQl0aGlzLnByb2R1Y2VSZWZlcmVuY2VJbmZvID0gZmFsc2U7IC8vIG5vIHJlZmVyZW5jZSBpbmZvIGJ5IGRlZmF1bHQKKworCQkvLyBpbmRpY2F0ZXMgaWYgdW51c2VkL29wdGltaXphYmxlIGxvY2FsIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHByZXNlcnZlZCAoZGVidWdnaW5nIHB1cnBvc2UpCisJCXRoaXMucHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcyA9IGZhbHNlOworCisJCS8vIGluZGljYXRlcyB3aGV0aGVyIGxpdGVyYWwgZXhwcmVzc2lvbnMgYXJlIGlubGluZWQgYXQgcGFyc2UtdGltZSBvciBub3QKKwkJdGhpcy5wYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzID0gdHJ1ZTsKKworCQkvLyBtYXggcHJvYmxlbXMgcGVyIGNvbXBpbGF0aW9uIHVuaXQKKwkJdGhpcy5tYXhQcm9ibGVtc1BlclVuaXQgPSAxMDA7IC8vIG5vIG1vcmUgdGhhbiAxMDAgcHJvYmxlbXMgcGVyIGRlZmF1bHQKKworCQkvLyB0YWdzIHVzZWQgdG8gcmVjb2duaXplIHRhc2tzIGluIGNvbW1lbnRzCisJCXRoaXMudGFza1RhZ3MgPSBudWxsOworCQl0aGlzLnRhc2tQcmlvcml0aWVzID0gbnVsbDsKKwkJdGhpcy5pc1Rhc2tDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKworCQkvLyBkZXByZWNhdGlvbiByZXBvcnQKKwkJdGhpcy5yZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlID0gZmFsc2U7CisJCXRoaXMucmVwb3J0RGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QgPSBmYWxzZTsKKwkJCisJCS8vIHVudXNlZCBwYXJhbWV0ZXJzIHJlcG9ydAorCQl0aGlzLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCA9IGZhbHNlOworCQl0aGlzLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUgPSBmYWxzZTsKKwkJdGhpcy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSA9IHRydWU7CisJCQorCQkvLyB1bnVzZWQgZGVjbGFyYXRpb24gb2YgdGhyb3duIGV4Y2VwdGlvbgorCQl0aGlzLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcgPSBmYWxzZTsKKwkJdGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlID0gdHJ1ZTsKKwkJdGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZSA9IHRydWU7CisJCQorCQkvLyBjb25zdHJ1Y3Rvci9zZXR0ZXIgcGFyYW1ldGVyIGhpZGluZworCQl0aGlzLnJlcG9ydFNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCA9IGZhbHNlOworCisJCXRoaXMucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zID0gdHJ1ZTsKKworCQkvLyBjaGVjayBqYXZhZG9jIGNvbW1lbnRzIHRhZ3MKKwkJdGhpcy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYzsKKwkJdGhpcy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3MgPSBmYWxzZTsKKwkJdGhpcy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmID0gZmFsc2U7CisJCXRoaXMucmVwb3J0SW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZiA9IGZhbHNlOworCQl0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24gPSBSRVRVUk5fVEFHOworCQkKKwkJLy8gY2hlY2sgbWlzc2luZyBqYXZhZG9jIHRhZ3MKKwkJdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYzsKKwkJdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nID0gZmFsc2U7CisJCXRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMgPSBmYWxzZTsKKworCQkvLyBjaGVjayBtaXNzaW5nIGphdmFkb2MgY29tbWVudHMKKwkJdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWM7CisJCXRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcgPSBmYWxzZTsKKwkJCisJCS8vIEpTUiBieXRlY29kZSBpbmxpbmluZworCQl0aGlzLmlubGluZUpzckJ5dGVjb2RlID0gZmFsc2U7CisKKwkJLy8gamF2YWRvYyBjb21tZW50IHN1cHBvcnQKKwkJdGhpcy5kb2NDb21tZW50U3VwcG9ydCA9IGZhbHNlOworCisJCS8vIHN1cHByZXNzIHdhcm5pbmcgYW5ub3RhdGlvbgorCQl0aGlzLnN1cHByZXNzV2FybmluZ3MgPSB0cnVlOworCisJCS8vIHN1cHByZXNzIGFsc28gb3B0aW9uYWwgZXJyb3JzCisJCXRoaXMuc3VwcHJlc3NPcHRpb25hbEVycm9ycyA9IGZhbHNlOworCisJCS8vIHRyZWF0IG9wdGlvbmFsIGVycm9yIGFzIG5vbiBmYXRhbAorCQl0aGlzLnRyZWF0T3B0aW9uYWxFcnJvckFzRmF0YWwgPSBmYWxzZTsKKworCQkvLyBwYXJzZXIgcGVyZm9ybSBzdGF0ZW1lbnRzIHJlY292ZXJ5CisJCXRoaXMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkgPSB0cnVlOworCisJCS8vIHBhcnNlciBwZXJmb3JtIHN0YXRlbWVudHMgcmVjb3ZlcnkKKwkJdGhpcy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gdHJ1ZTsKKworCQkvLyBzdG9yZSBhbm5vdGF0aW9ucworCQl0aGlzLnN0b3JlQW5ub3RhdGlvbnMgPSBmYWxzZTsKKworCQkvLyBhbm5vdGF0aW9uIHByb2Nlc3NpbmcKKwkJdGhpcy5nZW5lcmF0ZUNsYXNzRmlsZXMgPSB0cnVlOworCisJCS8vIGVuYWJsZSBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGJhdGNoIG1vZGUKKwkJdGhpcy5wcm9jZXNzQW5ub3RhdGlvbnMgPSBmYWxzZTsKKwkJCisJCS8vIGRpc2FibGUgbWlzc2luZyBvdmVycmlkZSBhbm5vdGF0aW9uIHJlcG9ydGluZyBmb3IgaW50ZXJmYWNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgorCQl0aGlzLnJlcG9ydE1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbiA9IHRydWU7CisJCQorCQkvLyBkZWFkIGNvZGUgZGV0ZWN0aW9uCisJCXRoaXMucmVwb3J0RGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCA9IGZhbHNlOworCQkKKwkJLy8gaWdub3JlIG1ldGhvZCBib2RpZXMKKwkJdGhpcy5pZ25vcmVNZXRob2RCb2RpZXMgPSBmYWxzZTsKKwkJCisJCS8vIGFsbG93IG51bGwgaW5mbyBmcm9tIGFzc2VydHMgdG8gYmUgY29uc2lkZXJlZCBkb3duc3RyZWFtIGJ5IGRlZmF1bHQKKwkJdGhpcy5pbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0cyA9IGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldChNYXAgb3B0aW9uc01hcCkgewogCQlPYmplY3Qgb3B0aW9uVmFsdWU7CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSkpICE9IG51bGwpIHsKIAkJCWlmIChHRU5FUkFURS5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CkBAIC02NTksMTcgKzExODMsMzMgQEAKIAkJCQl0aGlzLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcgPSBmYWxzZTsKIAkJCX0KIAkJfQorCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UpKSAhPSBudWxsKSB7CisJCQlpZiAoRU5BQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoRElTQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgeworCQkJCXRoaXMucmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSA9IGZhbHNlOworCQkJfQorCQl9CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUpKSAhPSBudWxsKSB7CisJCQlpZiAoRU5BQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKERJU0FCTEVELmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKKwkJCQl0aGlzLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlID0gZmFsc2U7CisJCQl9CisJCX0KIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9Db21wbGlhbmNlKSkgIT0gbnVsbCkgewogCQkJbG9uZyBsZXZlbCA9IHZlcnNpb25Ub0pka0xldmVsKG9wdGlvblZhbHVlKTsKLQkJCWlmIChsZXZlbCAhPSAwKSB0aGlzLmNvbXBsaWFuY2VMZXZlbCA9IGxldmVsOworCQkJaWYgKGxldmVsICE9IDApIHRoaXMuY29tcGxpYW5jZUxldmVsID0gdGhpcy5vcmlnaW5hbENvbXBsaWFuY2VMZXZlbCA9IGxldmVsOwogCQl9CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fU291cmNlKSkgIT0gbnVsbCkgewogCQkJbG9uZyBsZXZlbCA9IHZlcnNpb25Ub0pka0xldmVsKG9wdGlvblZhbHVlKTsKLQkJCWlmIChsZXZlbCAhPSAwKSB0aGlzLnNvdXJjZUxldmVsID0gbGV2ZWw7CisJCQlpZiAobGV2ZWwgIT0gMCkgdGhpcy5zb3VyY2VMZXZlbCA9IHRoaXMub3JpZ2luYWxTb3VyY2VMZXZlbCA9IGxldmVsOwogCQl9CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fVGFyZ2V0UGxhdGZvcm0pKSAhPSBudWxsKSB7CiAJCQlsb25nIGxldmVsID0gdmVyc2lvblRvSmRrTGV2ZWwob3B0aW9uVmFsdWUpOwotCQkJaWYgKGxldmVsICE9IDApIHRoaXMudGFyZ2V0SkRLID0gbGV2ZWw7CisJCQlpZiAobGV2ZWwgIT0gMCkgeworCQkJCXRoaXMudGFyZ2V0SkRLID0gbGV2ZWw7CisJCQl9CiAJCQlpZiAodGhpcy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgdGhpcy5pbmxpbmVKc3JCeXRlY29kZSA9IHRydWU7IC8vIGZvcmNlZCBmcm9tIDEuNSBtb2RlIG9uCiAJCX0KIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9FbmNvZGluZykpICE9IG51bGwpIHsKQEAgLTcwNiw3ICsxMjQ2LDcgQEAKIAkJCX0gZWxzZSBpZiAoRElTQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgewogCQkJCXRoaXMucmVwb3J0VW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UgPSBmYWxzZTsKIAkJCX0KLQkJfQkJCisJCX0KIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRTcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQpKSAhPSBudWxsKSB7CiAJCQlpZiAoRU5BQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CiAJCQkJdGhpcy5yZXBvcnRTcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQgPSB0cnVlOwpAQCAtNzE0LDYgKzEyNTQsMjAgQEAKIAkJCQl0aGlzLnJlcG9ydFNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCA9IGZhbHNlOwogCQkJfQogCQl9CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zKSkgIT0gbnVsbCkgeworCQkJaWYgKEVOQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgeworCQkJCXRoaXMucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoRElTQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgeworCQkJCXRoaXMucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zID0gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50ICkpICE9IG51bGwpIHsKKwkJCWlmIChFTkFCTEVELmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKKwkJCQl0aGlzLnJlcG9ydERlYWRDb2RlSW5Ucml2aWFsSWZTdGF0ZW1lbnQgPSB0cnVlOworCQkJfSBlbHNlIGlmIChESVNBQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50ID0gZmFsc2U7CisJCQl9CisJCX0JCQogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX01heFByb2JsZW1QZXJVbml0KSkgIT0gbnVsbCkgewogCQkJaWYgKG9wdGlvblZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAJCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgb3B0aW9uVmFsdWU7CkBAIC03MzksOSArMTI5Myw5IEBACiAJCQlpZiAob3B0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKIAkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKIAkJCQlpZiAoc3RyaW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl0aGlzLnRhc2tQcmlvcml0ZXMgPSBudWxsOworCQkJCQl0aGlzLnRhc2tQcmlvcml0aWVzID0gbnVsbDsKIAkJCQl9IGVsc2UgewotCQkJCQl0aGlzLnRhc2tQcmlvcml0ZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJCXRoaXMudGFza1ByaW9yaXRpZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgc3RyaW5nVmFsdWUudG9DaGFyQXJyYXkoKSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC03NjgsNiArMTMyMiwxMyBAQAogCQkJCXRoaXMuc3VwcHJlc3NXYXJuaW5ncyA9IGZhbHNlOwogCQkJfQogCQl9CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fU3VwcHJlc3NPcHRpb25hbEVycm9ycykpICE9IG51bGwpIHsKKwkJCWlmIChFTkFCTEVELmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKKwkJCQl0aGlzLnN1cHByZXNzT3B0aW9uYWxFcnJvcnMgPSB0cnVlOworCQkJfSBlbHNlIGlmIChESVNBQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5zdXBwcmVzc09wdGlvbmFsRXJyb3JzID0gZmFsc2U7CisJCQl9CisJCX0KIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9GYXRhbE9wdGlvbmFsRXJyb3IpKSAhPSBudWxsKSB7CiAJCQlpZiAoRU5BQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CiAJCQkJdGhpcy50cmVhdE9wdGlvbmFsRXJyb3JBc0ZhdGFsID0gdHJ1ZTsKQEAgLTc3NSw2ICsxMzM2LDIwIEBACiAJCQkJdGhpcy50cmVhdE9wdGlvbmFsRXJyb3JBc0ZhdGFsID0gZmFsc2U7CiAJCQl9CiAJCX0KKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24pKSAhPSBudWxsKSB7CisJCQlpZiAoRU5BQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24gPSB0cnVlOworCQkJfSBlbHNlIGlmIChESVNBQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24gPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX0luY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzKSkgIT0gbnVsbCkgeworCQkJaWYgKEVOQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgeworCQkJCXRoaXMuaW5jbHVkZU51bGxJbmZvRnJvbUFzc2VydHMgPSB0cnVlOworCQkJfSBlbHNlIGlmIChESVNBQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5pbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0cyA9IGZhbHNlOworCQkJfQorCQl9CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSkpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUsIG9wdGlvblZhbHVlKTsKIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QpKSAhPSBudWxsKSB1cGRhdGVTZXZlcml0eShPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QsIG9wdGlvblZhbHVlKTsKIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnREZXByZWNhdGlvbikpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFVzaW5nRGVwcmVjYXRlZEFQSSwgb3B0aW9uVmFsdWUpOwpAQCAtODE5LDEwICsxMzk0LDIyIEBACiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0TWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uLCBvcHRpb25WYWx1ZSk7CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0SW5jb21wbGV0ZUVudW1Td2l0Y2gpKSAhPSBudWxsKSB1cGRhdGVTZXZlcml0eShJbmNvbXBsZXRlRW51bVN3aXRjaCwgb3B0aW9uVmFsdWUpOwogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydFVuaGFuZGxlZFdhcm5pbmdUb2tlbikpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFVuaGFuZGxlZFdhcm5pbmdUb2tlbiwgb3B0aW9uVmFsdWUpOworCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydFVudXNlZFdhcm5pbmdUb2tlbikpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFVudXNlZFdhcm5pbmdUb2tlbiwgb3B0aW9uVmFsdWUpOwogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydFVudXNlZExhYmVsKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoVW51c2VkTGFiZWwsIG9wdGlvblZhbHVlKTsKIAkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRQYXJhbWV0ZXJBc3NpZ25tZW50KSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoUGFyYW1ldGVyQXNzaWdubWVudCwgb3B0aW9uVmFsdWUpOwogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydEZhbGx0aHJvdWdoQ2FzZSkpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KEZhbGx0aHJvdWdoQ2FzZSwgb3B0aW9uVmFsdWUpOwogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24sIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRVbnVzZWRUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbikpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFVudXNlZFR5cGVBcmd1bWVudHMsIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRSZWR1bmRhbnRTdXBlcmludGVyZmFjZSkpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFJlZHVuZGFudFN1cGVyaW50ZXJmYWNlLCBvcHRpb25WYWx1ZSk7CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0Q29tcGFyaW5nSWRlbnRpY2FsKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoQ29tcGFyaW5nSWRlbnRpY2FsLCBvcHRpb25WYWx1ZSk7CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0TWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoTWlzc2luZ1N5bmNocm9uaXplZE1vZGlmaWVySW5Jbmhlcml0ZWRNZXRob2QsIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRNaXNzaW5nSGFzaENvZGVNZXRob2QpKSAhPSBudWxsKSB1cGRhdGVTZXZlcml0eShTaG91bGRJbXBsZW1lbnRIYXNoY29kZSwgb3B0aW9uVmFsdWUpOworCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydERlYWRDb2RlKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoRGVhZENvZGUsIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRUYXNrcykpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFRhc2tzLCBvcHRpb25WYWx1ZSk7CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0VW51c2VkT2JqZWN0QWxsb2NhdGlvbikpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KFVudXNlZE9iamVjdEFsbG9jYXRpb24sIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRNZXRob2RDYW5CZVN0YXRpYykpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KE1ldGhvZENhbkJlU3RhdGljLCBvcHRpb25WYWx1ZSk7CisJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0TWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYykpICE9IG51bGwpIHVwZGF0ZVNldmVyaXR5KE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMsIG9wdGlvblZhbHVlKTsKKwkJaWYgKChvcHRpb25WYWx1ZSA9IG9wdGlvbnNNYXAuZ2V0KE9QVElPTl9SZXBvcnRSZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKSkgIT0gbnVsbCkgdXBkYXRlU2V2ZXJpdHkoUmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cywgb3B0aW9uVmFsdWUpOwogCiAJCS8vIEphdmFkb2Mgb3B0aW9ucwogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX0RvY0NvbW1lbnRTdXBwb3J0KSkgIT0gbnVsbCkgewpAQCAtODg4LDkgKzE0NzUsMTkgQEAKIAkJCQl0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmcgPSBmYWxzZTsKIAkJCX0KIAkJfQorCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc01ldGhvZFR5cGVQYXJhbWV0ZXJzKSkgIT0gbnVsbCkgeworCQkJaWYgKEVOQUJMRUQuZXF1YWxzKG9wdGlvblZhbHVlKSkgeworCQkJCXRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMgPSB0cnVlOworCQkJfSBlbHNlIGlmIChESVNBQkxFRC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CisJCQkJdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3NNZXRob2RUeXBlUGFyYW1ldGVycyA9IGZhbHNlOworCQkJfQorCQl9CiAJCWlmICgob3B0aW9uVmFsdWUgPSBvcHRpb25zTWFwLmdldChPUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50cykpICE9IG51bGwpIHsKIAkJCXVwZGF0ZVNldmVyaXR5KE1pc3NpbmdKYXZhZG9jQ29tbWVudHMsIG9wdGlvblZhbHVlKTsKIAkJfQorCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24pKSAhPSBudWxsKSB7CisJCQl0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24gPSAoU3RyaW5nKSBvcHRpb25WYWx1ZTsKKwkJfQogCQlpZiAoKG9wdGlvblZhbHVlID0gb3B0aW9uc01hcC5nZXQoT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5KSkgIT0gbnVsbCkgewogCQkJaWYgKFBVQkxJQy5lcXVhbHMob3B0aW9uVmFsdWUpKSB7CiAJCQkJdGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWM7CkBAIC05MjAsMTYgKzE1MTcsMTMgQEAKIAkJCWlmIChFTkFCTEVELmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKIAkJCQl0aGlzLnByb2Nlc3NBbm5vdGF0aW9ucyA9IHRydWU7CiAJCQkJdGhpcy5zdG9yZUFubm90YXRpb25zID0gdHJ1ZTsgLy8gYW5ub3RhdGlvbiBwcm9jZXNzaW5nIHJlcXVpcmVzIGFubm90YXRpb24gdG8gYmUgc3RvcmVkCi0JCQkJdGhpcy5kb2NDb21tZW50U3VwcG9ydCA9IHRydWU7ICAvLyBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgcmVxdWlyZXMgamF2YWRvYyBwcm9jZXNzaW5nCiAJCQl9IGVsc2UgaWYgKERJU0FCTEVELmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKIAkJCQl0aGlzLnByb2Nlc3NBbm5vdGF0aW9ucyA9IGZhbHNlOwogCQkJCXRoaXMuc3RvcmVBbm5vdGF0aW9ucyA9IGZhbHNlOwogCQkJfQogCQl9CiAJfQotCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQogCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQ29tcGlsZXJPcHRpb25zOiIpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIGxvY2FsIHZhcmlhYmxlcyBkZWJ1ZyBhdHRyaWJ1dGVzOiAiKS5hcHBlbmQoKHRoaXMucHJvZHVjZURlYnVnQXR0cmlidXRlcyAmIENsYXNzRmlsZUNvbnN0YW50cy5BVFRSX1ZBUlMpICE9IDAgPyAiT04iIDogIiBPRkYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gbGluZSBudW1iZXIgZGVidWcgYXR0cmlidXRlczogIikuYXBwZW5kKCh0aGlzLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9MSU5FUykgIT0gMCA/ICJPTiIgOiAiIE9GRiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJApAQCAtOTY0LDEzICsxNTU4LDE3IEBACiAJCWJ1Zi5hcHBlbmQoIlxuXHRcdCsgdmlzaWJpbGl0eSBsZXZlbCB0byByZXBvcnQgaW52YWxpZCBqYXZhZG9jIHRhZ3M6ICIpLmFwcGVuZChnZXRWaXNpYmlsaXR5U3RyaW5nKHRoaXMucmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHRcdCsgbWlzc2luZyBqYXZhZG9jIHRhZ3M6ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nSmF2YWRvY1RhZ3MpKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0XHQrIHZpc2liaWxpdHkgbGV2ZWwgdG8gcmVwb3J0IG1pc3NpbmcgamF2YWRvYyB0YWdzOiAiKS5hcHBlbmQoZ2V0VmlzaWJpbGl0eVN0cmluZyh0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHkpKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0XHQrIHJlcG9ydCBtaXNzaW5nIGphdmFkb2MgdGFncyBmb3IgbWV0aG9kIHR5cGUgcGFyYW1ldGVyczogIikuYXBwZW5kKHRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzTWV0aG9kVHlwZVBhcmFtZXRlcnMgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHRcdCsgcmVwb3J0IG1pc3NpbmcgamF2YWRvYyB0YWdzIGluIG92ZXJyaWRpbmcgbWV0aG9kczogIikuYXBwZW5kKHRoaXMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdFx0KyBtaXNzaW5nIGphdmFkb2MgY29tbWVudHM6ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nSmF2YWRvY0NvbW1lbnRzKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdFx0KyByZXBvcnQgbWlzc2luZyB0YWcgZGVzY3JpcHRpb24gb3B0aW9uOiAiKS5hcHBlbmQodGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0XHQrIHZpc2liaWxpdHkgbGV2ZWwgdG8gcmVwb3J0IG1pc3NpbmcgamF2YWRvYyBjb21tZW50czogIikuYXBwZW5kKGdldFZpc2liaWxpdHlTdHJpbmcodGhpcy5yZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHRcdCsgcmVwb3J0IG1pc3NpbmcgamF2YWRvYyBjb21tZW50cyBpbiBvdmVycmlkaW5nIG1ldGhvZHM6ICIpLmFwcGVuZCh0aGlzLnJlcG9ydE1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSBmaW5hbGx5IGJsb2NrIG5vdCBjb21wbGV0aW5nIG5vcm1hbGx5OiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoRmluYWxseUJsb2NrTm90Q29tcGxldGluZykpOyAvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQoIlxuXHQtIHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uOiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24pKTsgLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcblx0LSB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiB3aGVuIG92ZXJyaWRpbmc6ICIpLmFwcGVuZCh0aGlzLnJlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIHJlcG9ydCB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbjogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gcmVwb3J0IHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uIHdoZW4gb3ZlcnJpZGluZzogIikuYXBwZW5kKHRoaXMucmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gcmVwb3J0IHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uIGluY2x1ZGUgZG9jIGNvbW1lbnQgcmVmZXJlbmNlOiAiKS5hcHBlbmQodGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSByZXBvcnQgdW51c2VkIGRlY2xhcmVkIHRocm93biBleGNlcHRpb24gZXhlbXB0IGV4Y2VwdGlvbiBhbmQgdGhyb3dhYmxlOiAiKS5hcHBlbmQodGhpcy5yZXBvcnRVbnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gdW5uZWNlc3NhcnkgZWxzZTogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFVubmVjZXNzYXJ5RWxzZSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIEpESyBjb21wbGlhbmNlIGxldmVsOiAiKyB2ZXJzaW9uRnJvbUpka0xldmVsKHRoaXMuY29tcGxpYW5jZUxldmVsKSk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gSkRLIHNvdXJjZSBsZXZlbDogIisgdmVyc2lvbkZyb21KZGtMZXZlbCh0aGlzLnNvdXJjZUxldmVsKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTk4MCw3ICsxNTc4LDcgQEAKIAkJYnVmLmFwcGVuZCgiXG5cdC0gcGFyc2UgbGl0ZXJhbCBleHByZXNzaW9ucyBhcyBjb25zdGFudHMgOiAiKS5hcHBlbmQodGhpcy5wYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzID8gIk9OIiA6ICJPRkYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gZW5jb2RpbmcgOiAiKS5hcHBlbmQodGhpcy5kZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCA/ICI8ZGVmYXVsdD4iIDogdGhpcy5kZWZhdWx0RW5jb2RpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gdGFzayB0YWdzOiAiKS5hcHBlbmQodGhpcy50YXNrVGFncyA9PSBudWxsID8gVXRpbC5FTVBUWV9TVFJJTkcgOiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnRhc2tUYWdzLCcsJykpKTsgIC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiXG5cdC0gdGFzayBwcmlvcml0aWVzIDogIikuYXBwZW5kKHRoaXMudGFza1ByaW9yaXRlcyA9PSBudWxsID8gVXRpbC5FTVBUWV9TVFJJTkcgOiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnRhc2tQcmlvcml0ZXMsJywnKSkpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIHRhc2sgcHJpb3JpdGllcyA6ICIpLmFwcGVuZCh0aGlzLnRhc2tQcmlvcml0aWVzID09IG51bGwgPyBVdGlsLkVNUFRZX1NUUklORyA6IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMudGFza1ByaW9yaXRpZXMsJywnKSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHJlcG9ydCBkZXByZWNhdGlvbiBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlIDogIikuYXBwZW5kKHRoaXMucmVwb3J0RGVwcmVjYXRpb25JbnNpZGVEZXByZWNhdGVkQ29kZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gcmVwb3J0IGRlcHJlY2F0aW9uIHdoZW4gb3ZlcnJpZGluZyBkZXByZWNhdGVkIG1ldGhvZCA6ICIpLmFwcGVuZCh0aGlzLnJlcG9ydERlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSByZXBvcnQgdW51c2VkIHBhcmFtZXRlciB3aGVuIGltcGxlbWVudGluZyBhYnN0cmFjdCBtZXRob2QgOiAiKS5hcHBlbmQodGhpcy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCkBAIC05ODgsNiArMTU4Niw3IEBACiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHJlcG9ydCB1bnVzZWQgcGFyYW1ldGVyIGluY2x1ZGUgZG9jIGNvbW1lbnQgcmVmZXJlbmNlIDogIikuYXBwZW5kKHRoaXMucmVwb3J0VW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHJlcG9ydCBjb25zdHJ1Y3Rvci9zZXR0ZXIgcGFyYW1ldGVyIGhpZGluZyBleGlzdGluZyBmaWVsZCA6ICIpLmFwcGVuZCh0aGlzLnJlcG9ydFNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gaW5saW5lIEpTUiBieXRlY29kZSA6ICIpLmFwcGVuZCh0aGlzLmlubGluZUpzckJ5dGVjb2RlID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSByZXBvcnQgdW5hdm9pZGFibGUgZ2VuZXJpYyB0eXBlIHByb2JsZW1zIDogIikuYXBwZW5kKHRoaXMucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSB1bnNhZmUgdHlwZSBvcGVyYXRpb246ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhVbmNoZWNrZWRUeXBlT3BlcmF0aW9uKSk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gdW5zYWZlIHJhdyB0eXBlOiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoUmF3VHlwZVJlZmVyZW5jZSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIGZpbmFsIGJvdW5kIGZvciB0eXBlIHBhcmFtZXRlcjogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKEZpbmFsUGFyYW1ldGVyQm91bmQpKTsgLy8kTk9OLU5MUy0xJApAQCAtMTAwMSwzMDggKzE2MDAsNDQgQEAKIAkJYnVmLmFwcGVuZCgiXG5cdC0gYXV0b2JveGluZzogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKEF1dG9Cb3hpbmcpKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSBhbm5vdGF0aW9uIHN1cGVyIGludGVyZmFjZTogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKEFubm90YXRpb25TdXBlckludGVyZmFjZSkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIG1pc3NpbmcgQE92ZXJyaWRlIGFubm90YXRpb246ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gbWlzc2luZyBAT3ZlcnJpZGUgYW5ub3RhdGlvbiBmb3IgaW50ZXJmYWNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbjogIikuYXBwZW5kKHRoaXMucmVwb3J0TWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSBtaXNzaW5nIEBEZXByZWNhdGVkIGFubm90YXRpb246ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24pKTsgLy8kTk9OLU5MUy0xJAogCQlidWYuYXBwZW5kKCJcblx0LSBpbmNvbXBsZXRlIGVudW0gc3dpdGNoOiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoSW5jb21wbGV0ZUVudW1Td2l0Y2gpKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSByYWlzZSBudWxsIHJlbGF0ZWQgd2FybmluZ3MgZm9yIHZhcmlhYmxlcyB0YWludGVkIGluIGFzc2VydCBzdGF0ZW1lbnRzOiAiKS5hcHBlbmQodGhpcy5pbmNsdWRlTnVsbEluZm9Gcm9tQXNzZXJ0cyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gc3VwcHJlc3Mgd2FybmluZ3M6ICIpLmFwcGVuZCh0aGlzLnN1cHByZXNzV2FybmluZ3MgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIHN1cHByZXNzIG9wdGlvbmFsIGVycm9yczogIikuYXBwZW5kKHRoaXMuc3VwcHJlc3NPcHRpb25hbEVycm9ycyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gdW5oYW5kbGVkIHdhcm5pbmcgdG9rZW46ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhVbmhhbmRsZWRXYXJuaW5nVG9rZW4pKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSB1bnVzZWQgd2FybmluZyB0b2tlbjogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFVudXNlZFdhcm5pbmdUb2tlbikpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHVudXNlZCBsYWJlbDogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFVudXNlZExhYmVsKSk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG5cdC0gdHJlYXQgb3B0aW9uYWwgZXJyb3IgYXMgZmF0YWw6ICIpLmFwcGVuZCh0aGlzLnRyZWF0T3B0aW9uYWxFcnJvckFzRmF0YWwgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHBhcmFtZXRlciBhc3NpZ25tZW50OiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoUGFyYW1ldGVyQXNzaWdubWVudCkpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIGdlbmVyYXRlIGNsYXNzIGZpbGVzOiAiKS5hcHBlbmQodGhpcy5nZW5lcmF0ZUNsYXNzRmlsZXMgPyBFTkFCTEVEIDogRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCiAJCWJ1Zi5hcHBlbmQoIlxuXHQtIHByb2Nlc3MgYW5ub3RhdGlvbnM6ICIpLmFwcGVuZCh0aGlzLnByb2Nlc3NBbm5vdGF0aW9ucyA/IEVOQUJMRUQgOiBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gdW51c2VkIHR5cGUgYXJndW1lbnRzIGZvciBtZXRob2QvY29uc3RydWN0b3IgaW52b2NhdGlvbjogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFVudXNlZFR5cGVBcmd1bWVudHMpKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSByZWR1bmRhbnQgc3VwZXJpbnRlcmZhY2U6ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhSZWR1bmRhbnRTdXBlcmludGVyZmFjZSkpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIGNvbXBhcmluZyBpZGVudGljYWwgZXhwcjogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKENvbXBhcmluZ0lkZW50aWNhbCkpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIG1pc3Npbmcgc3luY2hyb25pemVkIG9uIGluaGVyaXRlZCBtZXRob2Q6ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhNaXNzaW5nU3luY2hyb25pemVkTW9kaWZpZXJJbkluaGVyaXRlZE1ldGhvZCkpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIHNob3VsZCBpbXBsZW1lbnQgaGFzaENvZGUoKSBtZXRob2Q6ICIpLmFwcGVuZChnZXRTZXZlcml0eVN0cmluZyhTaG91bGRJbXBsZW1lbnRIYXNoY29kZSkpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIGRlYWQgY29kZTogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKERlYWRDb2RlKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gZGVhZCBjb2RlIGluIHRyaXZpYWwgaWYgc3RhdGVtZW50OiAiKS5hcHBlbmQodGhpcy5yZXBvcnREZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50ID8gRU5BQkxFRCA6IERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSB0YXNrcyBzZXZlcml0eTogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFRhc2tzKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG5cdC0gdW51c2VkIG9iamVjdCBhbGxvY2F0aW9uOiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoVW51c2VkT2JqZWN0QWxsb2NhdGlvbikpOyAvLyROT04tTkxTLTEkCisJCWJ1Zi5hcHBlbmQoIlxuXHQtIG1ldGhvZCBjYW4gYmUgc3RhdGljOiAiKS5hcHBlbmQoZ2V0U2V2ZXJpdHlTdHJpbmcoTWV0aG9kQ2FuQmVTdGF0aWMpKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSBtZXRob2QgY2FuIGJlIHBvdGVudGlhbGx5IHN0YXRpYzogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMpKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKCJcblx0LSByZWR1bmRhbnQgc3BlY2lmaWNhdGlvbiBvZiB0eXBlIGFyZ3VtZW50czogIikuYXBwZW5kKGdldFNldmVyaXR5U3RyaW5nKFJlZHVuZGFudFNwZWNpZmljYXRpb25PZlR5cGVBcmd1bWVudHMpKTsgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJfQotCi0Jdm9pZCB1cGRhdGVTZXZlcml0eShsb25nIGlycml0YW50LCBPYmplY3Qgc2V2ZXJpdHlTdHJpbmcpIHsKKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXZlcml0eShpbnQgaXJyaXRhbnQsIE9iamVjdCBzZXZlcml0eVN0cmluZykgewogCQlpZiAoRVJST1IuZXF1YWxzKHNldmVyaXR5U3RyaW5nKSkgewotCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBpcnJpdGFudDsKLQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+aXJyaXRhbnQ7CisJCQl0aGlzLmVycm9yVGhyZXNob2xkLnNldChpcnJpdGFudCk7CisJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQuY2xlYXIoaXJyaXRhbnQpOwogCQl9IGVsc2UgaWYgKFdBUk5JTkcuZXF1YWxzKHNldmVyaXR5U3RyaW5nKSkgewotCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+aXJyaXRhbnQ7Ci0JCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gaXJyaXRhbnQ7CisJCQl0aGlzLmVycm9yVGhyZXNob2xkLmNsZWFyKGlycml0YW50KTsKKwkJCXRoaXMud2FybmluZ1RocmVzaG9sZC5zZXQoaXJyaXRhbnQpOwogCQl9IGVsc2UgaWYgKElHTk9SRS5lcXVhbHMoc2V2ZXJpdHlTdHJpbmcpKSB7Ci0JCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5pcnJpdGFudDsKLQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+aXJyaXRhbnQ7CisJCQl0aGlzLmVycm9yVGhyZXNob2xkLmNsZWFyKGlycml0YW50KTsKKwkJCXRoaXMud2FybmluZ1RocmVzaG9sZC5jbGVhcihpcnJpdGFudCk7CiAJCX0KIAl9Ci0JcHVibGljIHN0YXRpYyBsb25nIHZlcnNpb25Ub0pka0xldmVsKE9iamVjdCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHZlcnNpb25JRCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSB2ZXJzaW9uSUQ7Ci0JCQkvLyB2ZXJpZmljYXRpb24gaXMgb3B0aW1pemVkIGZvciBhbGwgdmVyc2lvbnMgd2l0aCBzYW1lIGxlbmd0aCBhbmQgc2FtZSAiMS4iIHByZWZpeAotCQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPT0gMyAmJiB2ZXJzaW9uLmNoYXJBdCgwKSA9PSAnMScgJiYgdmVyc2lvbi5jaGFyQXQoMSkgPT0gJy4nKSB7Ci0JCQkJc3dpdGNoICh2ZXJzaW9uLmNoYXJBdCgyKSkgewotCQkJCQljYXNlICcxJzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8xOwotCQkJCQljYXNlICcyJzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8yOwotCQkJCQljYXNlICczJzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOwotCQkJCQljYXNlICc0JzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwotCQkJCQljYXNlICc1JzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwotCQkJCQljYXNlICc2JzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82OwotCQkJCQljYXNlICc3JzoKLQkJCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83OwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIDA7IC8vIHVua25vd24KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoVkVSU0lPTl9KU1IxNC5lcXVhbHModmVyc2lvbklEKSkgewotCQkJCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwotCQkJfQotCQl9Ci0JCXJldHVybiAwOyAvLyB1bmtub3duCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkZyb21KZGtMZXZlbChsb25nIGpka0xldmVsKSB7Ci0JCXN3aXRjaCAoKGludCkoamRrTGV2ZWw+PjE2KSkgewotCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzEgOgotCQkJCWlmIChqZGtMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8xKQotCQkJCQlyZXR1cm4gVkVSU0lPTl8xXzE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfMiA6Ci0JCQkJaWYgKGpka0xldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzIpCi0JCQkJCXJldHVybiBWRVJTSU9OXzFfMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV8zIDoKLQkJCQlpZiAoamRrTGV2ZWwgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMykKLQkJCQkJcmV0dXJuIFZFUlNJT05fMV8zOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzQgOgotCQkJCWlmIChqZGtMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KQotCQkJCQlyZXR1cm4gVkVSU0lPTl8xXzQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NQUpPUl9WRVJTSU9OXzFfNSA6Ci0JCQkJaWYgKGpka0xldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpCi0JCQkJCXJldHVybiBWRVJTSU9OXzFfNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT05fMV82IDoKLQkJCQlpZiAoamRrTGV2ZWwgPT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNikKLQkJCQkJcmV0dXJuIFZFUlNJT05fMV82OwotCQkJCWJyZWFrOwotCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuTUFKT1JfVkVSU0lPTl8xXzcgOgotCQkJCWlmIChqZGtMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KQotCQkJCQlyZXR1cm4gVkVSU0lPTl8xXzc7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOyAvLyB1bmtub3duIHZlcnNpb24KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHdhcm5pbmcgb3B0aW9uIG5hbWVzIGZvciB1c2UgYXMga2V5cyBpbiBjb21waWxlciBvcHRpb25zIG1hcHMuCi0JICogQHJldHVybiBhbGwgd2FybmluZyBvcHRpb24gbmFtZXMKLQkgKiBUT0RPIChtYXhpbWUpIHJldmlzZSBmb3IgZW5zdXJpbmcgY29tcGxldGVuZXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB3YXJuaW5nT3B0aW9uTmFtZXMoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IHsKLQkJCU9QVElPTl9SZXBvcnRBbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UsCi0JCQlPUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwKLQkJCU9QVElPTl9SZXBvcnRBdXRvYm94aW5nLAotCQkJT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLAotCQkJT1BUSU9OX1JlcG9ydERpc2NvdXJhZ2VkUmVmZXJlbmNlLAotCQkJT1BUSU9OX1JlcG9ydEVtcHR5U3RhdGVtZW50LAotCQkJT1BUSU9OX1JlcG9ydEVudW1JZGVudGlmaWVyLAotCQkJT1BUSU9OX1JlcG9ydEZhbGx0aHJvdWdoQ2FzZSwKLQkJCU9QVElPTl9SZXBvcnRGaWVsZEhpZGluZywKLQkJCU9QVElPTl9SZXBvcnRGaW5hbFBhcmFtZXRlckJvdW5kLAotCQkJT1BUSU9OX1JlcG9ydEZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseSwKLQkJCU9QVElPTl9SZXBvcnRGb3JiaWRkZW5SZWZlcmVuY2UsCi0JCQlPUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywKLQkJCU9QVElPTl9SZXBvcnRJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QsCi0JCQlPUFRJT05fUmVwb3J0SW5jb21wbGV0ZUVudW1Td2l0Y2gsCi0JCQlPUFRJT05fUmVwb3J0SW5kaXJlY3RTdGF0aWNBY2Nlc3MsCi0JCQlPUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2MsCi0JCQlPUFRJT05fUmVwb3J0TG9jYWxWYXJpYWJsZUhpZGluZywKLQkJCU9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLAotCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbiwKLQkJCU9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY0NvbW1lbnRzLAotCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdKYXZhZG9jVGFncywKLQkJCU9QVElPTl9SZXBvcnRNaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uLAotCQkJT1BUSU9OX1JlcG9ydE1pc3NpbmdTZXJpYWxWZXJzaW9uLAotCQkJT1BUSU9OX1JlcG9ydE5vRWZmZWN0QXNzaWdubWVudCwKLQkJCU9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwKLQkJCU9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsLAotCQkJT1BUSU9OX1JlcG9ydE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljLAotCQkJT1BUSU9OX1JlcG9ydE51bGxSZWZlcmVuY2UsCi0JCQlPUFRJT05fUmVwb3J0UG90ZW50aWFsTnVsbFJlZmVyZW5jZSwKLQkJCU9QVElPTl9SZXBvcnRSZWR1bmRhbnROdWxsQ2hlY2ssCi0JCQlPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLAotCQkJT1BUSU9OX1JlcG9ydFBhcmFtZXRlckFzc2lnbm1lbnQsCi0JCQlPUFRJT05fUmVwb3J0UG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQsCi0JCQlPUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uLAotCQkJT1BUSU9OX1JlcG9ydFR5cGVQYXJhbWV0ZXJIaWRpbmcsCi0JCQlPUFRJT05fUmVwb3J0VW5jaGVja2VkVHlwZU9wZXJhdGlvbiwKLQkJCU9QVElPTl9SZXBvcnRVbmRvY3VtZW50ZWRFbXB0eUJsb2NrLAotCQkJT1BUSU9OX1JlcG9ydFVubmVjZXNzYXJ5RWxzZSwKLQkJCU9QVElPTl9SZXBvcnRVbm5lY2Vzc2FyeVR5cGVDaGVjaywKLQkJCU9QVElPTl9SZXBvcnRVbnF1YWxpZmllZEZpZWxkQWNjZXNzLAotCQkJT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uLAotCQkJT1BUSU9OX1JlcG9ydFVudXNlZEltcG9ydCwKLQkJCU9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwKLQkJCU9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsCi0JCQlPUFRJT05fUmVwb3J0VW51c2VkUHJpdmF0ZU1lbWJlciwKLQkJCU9QVElPTl9SZXBvcnRWYXJhcmdzQXJndW1lbnROZWVkQ2FzdCwKLQkJCU9QVElPTl9SZXBvcnRVbmhhbmRsZWRXYXJuaW5nVG9rZW4sCi0JCQlPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24KLQkJfTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nVG9rZW5Gcm9tSXJyaXRhbnQobG9uZyBpcnJpdGFudCkgewotCQkvLyBrZWVwIGluIHN5bmMgd2l0aCB3YXJuaW5nVG9rZW5zIGFuZCB3YXJuaW5nVG9rZW5Ub0lycml0YW50Ci0JCWludCBpcnJpdGFudEludCA9IChpbnQpIGlycml0YW50OwotCQlpZiAoaXJyaXRhbnRJbnQgPT0gaXJyaXRhbnQpIHsKLQkJCXN3aXRjaCAoaXJyaXRhbnRJbnQpIHsKLQkJCQljYXNlIChpbnQpIChJbnZhbGlkSmF2YWRvYyB8IFVzaW5nRGVwcmVjYXRlZEFQSSkgOgotCQkJCWNhc2UgKGludCkgVXNpbmdEZXByZWNhdGVkQVBJIDoKLQkJCQkJcmV0dXJuICJkZXByZWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIChpbnQpIEZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmcgOgotCQkJCQlyZXR1cm4gImZpbmFsbHkiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSBGaWVsZEhpZGluZyA6Ci0JCQkJY2FzZSAoaW50KSBMb2NhbFZhcmlhYmxlSGlkaW5nIDoKLQkJCQljYXNlIChpbnQpIE1hc2tlZENhdGNoQmxvY2sgOgotCQkJCQlyZXR1cm4gImhpZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIChpbnQpIE5vbkV4dGVybmFsaXplZFN0cmluZyA6Ci0JCQkJCXJldHVybiAibmxzIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgKGludCkgVW5uZWNlc3NhcnlUeXBlQ2hlY2sgOgotCQkJCQlyZXR1cm4gImNhc3QiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSBVbnVzZWRMb2NhbFZhcmlhYmxlIDoKLQkJCQljYXNlIChpbnQpIFVudXNlZEFyZ3VtZW50IDoKLQkJCQljYXNlIChpbnQpIFVudXNlZEltcG9ydCA6Ci0JCQkJY2FzZSAoaW50KSBVbnVzZWRQcml2YXRlTWVtYmVyOgotCQkJCWNhc2UgKGludCkgVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb246Ci0JCQkJCXJldHVybiAidW51c2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgKGludCkgSW5kaXJlY3RTdGF0aWNBY2Nlc3MgOgotCQkJCWNhc2UgKGludCkgTm9uU3RhdGljQWNjZXNzVG9TdGF0aWMgOgotCQkJCQlyZXR1cm4gInN0YXRpYy1hY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSBBY2Nlc3NFbXVsYXRpb24gOgotCQkJCQlyZXR1cm4gInN5bnRoZXRpYy1hY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSBVbnF1YWxpZmllZEZpZWxkQWNjZXNzIDoKLQkJCQkJcmV0dXJuICJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSBVbmNoZWNrZWRUeXBlT3BlcmF0aW9uIDoKLQkJCQkJcmV0dXJuICJ1bmNoZWNrZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpcnJpdGFudEludCA9IChpbnQpKGlycml0YW50ID4+PiAzMik7Ci0JCQlzd2l0Y2ggKGlycml0YW50SW50KSB7Ci0JCQkJY2FzZSAoaW50KShNaXNzaW5nU2VyaWFsVmVyc2lvbiA+Pj4gMzIpIDoKLQkJCQkJcmV0dXJuICJzZXJpYWwiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KShBdXRvQm94aW5nID4+PiAzMikgOgotCQkJCQlyZXR1cm4gImJveGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIChpbnQpKFR5cGVIaWRpbmcgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAiaGlkaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgKGludCkoSW5jb21wbGV0ZUVudW1Td2l0Y2ggPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAiaW5jb21wbGV0ZS1zd2l0Y2giOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KShNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24gPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAiZGVwLWFubiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIChpbnQpKFJhd1R5cGVSZWZlcmVuY2UgPj4+IDMyKToKLQkJCQkJcmV0dXJuICJ1bmNoZWNrZWQiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSAoVW51c2VkTGFiZWwgPj4+IDMyKToKLQkJCQkJcmV0dXJuICJ1bnVzZWQiOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSAoRGlzY291cmFnZWRSZWZlcmVuY2UgPj4+IDMyKSA6Ci0JCQkJY2FzZSAoaW50KSAoRm9yYmlkZGVuUmVmZXJlbmNlID4+PiAzMikgOgotCQkJCQlyZXR1cm4gInJlc3RyaWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgKGludCkgKE51bGxSZWZlcmVuY2UgPj4+IDMyKSA6Ci0JCQkJY2FzZSAoaW50KSAoUG90ZW50aWFsTnVsbFJlZmVyZW5jZSA+Pj4gMzIpIDoKLQkJCQljYXNlIChpbnQpIChSZWR1bmRhbnROdWxsQ2hlY2sgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIChpbnQpIChGYWxsdGhyb3VnaENhc2UgPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAiZmFsbHRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAoaW50KSAoT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24gPj4+IDMyKSA6Ci0JCQkJCXJldHVybiAic3VwZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8vIGtlZXAgaW4gc3luYyB3aXRoIHdhcm5pbmdUb2tlblRvSXJyaXRhbnQgYW5kIHdhcm5pbmdUb2tlbkZyb21JcnJpdGFudAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gd2FybmluZ1Rva2VucyA9IHsKLQkJImFsbCIsIC8vJE5PTi1OTFMtMSQKLQkJImJveGluZyIsIC8vJE5PTi1OTFMtMSQKLQkJImNhc3QiLCAvLyROT04tTkxTLTEkCi0JCSJkZXAtYW5uIiwgLy8kTk9OLU5MUy0xJAotCQkiZGVwcmVjYXRpb24iLCAvLyROT04tTkxTLTEkCi0JCSJmYWxsdGhyb3VnaCIsIC8vJE5PTi1OTFMtMSQKLQkJImZpbmFsbHkiLCAvLyROT04tTkxTLTEkCi0JCSJoaWRpbmciLCAvLyROT04tTkxTLTEkCi0JCSJpbmNvbXBsZXRlLXN3aXRjaCIsIC8vJE5PTi1OTFMtMSQKLQkJIm5scyIsIC8vJE5PTi1OTFMtMSQKLQkJIm51bGwiLCAvLyROT04tTkxTLTEkCi0JCSJyZXN0cmljdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJInNlcmlhbCIsIC8vJE5PTi1OTFMtMSQKLQkJInN0YXRpYy1hY2Nlc3MiLCAvLyROT04tTkxTLTEkCi0JCSJzdXBlciIsIC8vJE5PTi1OTFMtMSQKLQkJInN5bnRoZXRpYy1hY2Nlc3MiLCAvLyROT04tTkxTLTEkCi0JCSJ1bmNoZWNrZWQiLCAvLyROT04tTkxTLTEkCi0JCSJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiLCAvLyROT04tTkxTLTEkCi0JCSJ1bnVzZWQiLCAvLyROT04tTkxTLTEkCi0JfTsKLQlwdWJsaWMgc3RhdGljIGxvbmcgd2FybmluZ1Rva2VuVG9JcnJpdGFudChTdHJpbmcgd2FybmluZ1Rva2VuKSB7Ci0JCS8vIGtlZXAgaW4gc3luYyB3aXRoIHdhcm5pbmdUb2tlbnMgYW5kIHdhcm5pbmdUb2tlbkZyb21JcnJpdGFudAotCQlpZiAod2FybmluZ1Rva2VuID09IG51bGwgfHwgd2FybmluZ1Rva2VuLmxlbmd0aCgpID09IDApIHJldHVybiAwOwotCQlzd2l0Y2ggKHdhcm5pbmdUb2tlbi5jaGFyQXQoMCkpIHsKLQkJCWNhc2UgJ2EnIDoKLQkJCQlpZiAoImFsbCIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIDB4RkZGRkZGRkZGRkZGRkZGRmw7IC8vIHN1cHByZXNzIGFsbCB3YXJuaW5ncwotCQkJCWJyZWFrOwotCQkJY2FzZSAnYicgOgotCQkJCWlmICgiYm94aW5nIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gQXV0b0JveGluZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2MnIDoKLQkJCQlpZiAoImNhc3QiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBVbm5lY2Vzc2FyeVR5cGVDaGVjazsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2QnIDoKLQkJCQlpZiAoImRlcHJlY2F0aW9uIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVXNpbmdEZXByZWNhdGVkQVBJOwotCQkJCWlmICgiZGVwLWFubiIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2YnIDoKLQkJCQlpZiAoImZhbGx0aHJvdWdoIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gRmFsbHRocm91Z2hDYXNlOwotCQkJCWlmICgiZmluYWxseSIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdoJyA6Ci0JCQkJaWYgKCJoaWRpbmciLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBGaWVsZEhpZGluZyB8IExvY2FsVmFyaWFibGVIaWRpbmcgfCBNYXNrZWRDYXRjaEJsb2NrIHwgVHlwZUhpZGluZzsKLQkJCWNhc2UgJ2knIDoKLQkJCQlpZiAoImluY29tcGxldGUtc3dpdGNoIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSW5jb21wbGV0ZUVudW1Td2l0Y2g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICduJyA6Ci0JCQkJaWYgKCJubHMiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBOb25FeHRlcm5hbGl6ZWRTdHJpbmc7Ci0JCQkJaWYgKCJudWxsIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gTnVsbFJlZmVyZW5jZSB8IFBvdGVudGlhbE51bGxSZWZlcmVuY2UgfCBSZWR1bmRhbnROdWxsQ2hlY2s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdyJyA6Ci0JCQkJaWYgKCJyZXN0cmljdGlvbiIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIERpc2NvdXJhZ2VkUmVmZXJlbmNlIHwgRm9yYmlkZGVuUmVmZXJlbmNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncycgOgotCQkJCWlmICgic2VyaWFsIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gTWlzc2luZ1NlcmlhbFZlcnNpb247Ci0JCQkJaWYgKCJzdGF0aWMtYWNjZXNzIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSW5kaXJlY3RTdGF0aWNBY2Nlc3MgfCBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpYzsKLQkJCQlpZiAoInN5bnRoZXRpYy1hY2Nlc3MiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBBY2Nlc3NFbXVsYXRpb247Ci0JCQkJaWYgKCJzdXBlciIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb247Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAndScgOgotCQkJCWlmICgidW51c2VkIi5lcXVhbHMod2FybmluZ1Rva2VuKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVW51c2VkTG9jYWxWYXJpYWJsZSB8IFVudXNlZEFyZ3VtZW50IHwgVW51c2VkUHJpdmF0ZU1lbWJlciB8IFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uIHwgVW51c2VkTGFiZWwgfCBVbnVzZWRJbXBvcnQ7Ci0JCQkJaWYgKCJ1bmNoZWNrZWQiLmVxdWFscyh3YXJuaW5nVG9rZW4pKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBVbmNoZWNrZWRUeXBlT3BlcmF0aW9uIHwgUmF3VHlwZVJlZmVyZW5jZTsKLQkJCQlpZiAoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIuZXF1YWxzKHdhcm5pbmdUb2tlbikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFVucXVhbGlmaWVkRmllbGRBY2Nlc3M7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29tcGlsZXJTdGF0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29tcGlsZXJTdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMWI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlclN0YXRzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgQ29tcGlsZXJTdGF0cyBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworCisJLy8gb3ZlcmFsbAorCXB1YmxpYyBsb25nIHN0YXJ0VGltZTsKKwlwdWJsaWMgbG9uZyBlbmRUaW1lOworCXB1YmxpYyBsb25nIGxpbmVDb3VudDsKKworCS8vIGNvbXBpbGUgcGhhc2VzCisJcHVibGljIGxvbmcgcGFyc2VUaW1lOworCXB1YmxpYyBsb25nIHJlc29sdmVUaW1lOworCXB1YmxpYyBsb25nIGFuYWx5emVUaW1lOworCXB1YmxpYyBsb25nIGdlbmVyYXRlVGltZTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSB0b3RhbCBlbGFwc2VkIHRpbWUgKGJldHdlZW4gc3RhcnQgYW5kIGVuZCkKKyAqIEByZXR1cm4gdGhlIHRpbWUgc3BlbnQgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKi8KK3B1YmxpYyBsb25nIGVsYXBzZWRUaW1lKCkgeworCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKK30KKworLyoqCisgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorICovCitwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgeworCUNvbXBpbGVyU3RhdHMgb3RoZXJTdGF0cyA9IChDb21waWxlclN0YXRzKSBvOworCWxvbmcgdGltZTEgPSBlbGFwc2VkVGltZSgpOworCWxvbmcgdGltZTIgPSBvdGhlclN0YXRzLmVsYXBzZWRUaW1lKCk7CisJcmV0dXJuIHRpbWUxIDwgdGltZTIgPyAtMSA6ICh0aW1lMSA9PSB0aW1lMiA/IDAgOiAxKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db25zdGFudC5qYXZhCmluZGV4IDNlODc3ODcuLjg1ZDdkMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbnN0YW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxNiArMTYsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NZXNzYWdlczsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0YW50IGltcGxlbWVudHMgVHlwZUlkcywgT3BlcmF0b3JJZHMgewotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBOb3RBQ29uc3RhbnQgPSBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUoRG91YmxlLk5hTik7Ci0KKwkKIAlwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0KIAkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbnN0YW50X2Nhbm5vdENhc3RlZEludG8sIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lKCksICJib29sZWFuIiB9KSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0KIAkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbnN0YW50X2Nhbm5vdENhc3RlZEludG8sIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lKCksICJieXRlIiB9KSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTMzLDE4MSArMzEsMTc4IEBACiAJCS8vdGhlIGNhc3QgaXMgYW4gaW50IG9mIHRoZSBmb3JtCiAJCS8vIChjYXN0SWQ8PDQpK3R5cGVJZCAoaW4gb3JkZXIgdG8gZm9sbG93IHRoZQogCQkvL3VzZXIgd3JpdHRlbiBzdHlsZSAoY2FzdClleHByZXNzaW9uIC4uLi4KLQkKKwogCQlpZiAodGhpcyA9PSBOb3RBQ29uc3RhbnQpIHJldHVybiBOb3RBQ29uc3RhbnQ7CiAJCXN3aXRjaChjb252ZXJzaW9uVG9UYXJnZXRUeXBlKXsKIAkJCWNhc2UgVF91bmRlZmluZWQgOiAJCQkJCQlyZXR1cm4gdGhpczsKIAkvLyAgICAgICAgICAgIFRBUkdFVCBUWVBFICA8LSBGUk9NIFRZUEUKLQkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9PYmplY3QgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9kb3VibGUgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkKLQkvLwkgICAgY2FzZSAoVF9ieXRlPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gdGhpczsgIAotCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIEJ5dGVDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5sb25nVmFsdWUoKSk7IAotCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBCeXRlQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuc2hvcnRWYWx1ZSgpKTsgICAgCi0JLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfZG91YmxlICAJIAkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmRvdWJsZVZhbHVlKCkpOyAgICAKLQkJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmZsb2F0VmFsdWUoKSk7ICAgIAotCS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmNoYXJWYWx1ZSgpKTsgICAgCi0JCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfaW50ICAJCSA6IHJldHVybiBCeXRlQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuaW50VmFsdWUoKSk7ICAgIAotCQotCS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKHRoaXMuYnl0ZVZhbHVlKCkpOyAKLQkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9sb25nICAJCSA6IHJldHVybiB0aGlzOyAKLQkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSh0aGlzLnNob3J0VmFsdWUoKSk7IAotCS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfU3RyaW5nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9PYmplY3QgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9kb3VibGUgIAkJIDogcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5kb3VibGVWYWx1ZSgpKTsgICAKLQkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmZsb2F0VmFsdWUoKSk7ICAKLQkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUodGhpcy5jaGFyVmFsdWUoKSk7IAotCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmludFZhbHVlKCkpOyAKLQkKLQkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmJ5dGVWYWx1ZSgpKTsKLQkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gU2hvcnRDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMubG9uZ1ZhbHVlKCkpOyAKLQkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIHRoaXM7ICAKLQkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfU3RyaW5nICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9PYmplY3QgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9kb3VibGUgIAkgOiByZXR1cm4gU2hvcnRDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCi0JCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5mbG9hdFZhbHVlKCkpOyAgIAotCS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIFNob3J0Q29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmNoYXJWYWx1ZSgpKTsgIAotCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIFNob3J0Q29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmludFZhbHVlKCkpOyAgCi0JCi0JLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX1N0cmluZyAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX09iamVjdCAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2RvdWJsZSAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQotCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF91bmRlZmluZWQgICA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9zaG9ydCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfSmF2YUxhbmdTdHJpbmcgIAkgOiByZXR1cm4gdGhpczsgICAKLQkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfZmxvYXQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF91bmRlZmluZWQgICAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9ieXRlICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9sb25nICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9zaG9ydCAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF92b2lkICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9TdHJpbmcgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9PYmplY3QgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9kb3VibGUgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9mbG9hdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2Jvb2xlYW4gCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2NoYXIgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2ludCAgCQkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQotCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF91bmRlZmluZWQgIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9ieXRlICAJCSAJOiByZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHRoaXMuYnl0ZVZhbHVlKCkpOyAgIAotCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfbG9uZyAgCQkgCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmxvbmdWYWx1ZSgpKTsgICAKLQkJICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX3Nob3J0ICAJCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZSh0aGlzLnNob3J0VmFsdWUoKSk7ICAgCi0JLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX3ZvaWQgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX1N0cmluZyAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX09iamVjdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9kb3VibGUgIAkJOiByZXR1cm4gdGhpczsgICAKLQkJICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2Zsb2F0ICAJCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmZsb2F0VmFsdWUoKSk7ICAgCi0JLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2Jvb2xlYW4gIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfY2hhciAgCQkgCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmNoYXJWYWx1ZSgpKTsgICAKLQkJICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2ludCAgCQkJOiByZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKHRoaXMuaW50VmFsdWUoKSk7ICAKLQkKLQkvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmJ5dGVWYWx1ZSgpKTsgICAKLQkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUodGhpcy5sb25nVmFsdWUoKSk7ICAgCi0JCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLnNob3J0VmFsdWUoKSk7ICAgCi0JLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX1N0cmluZyAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmRvdWJsZVZhbHVlKCkpOyAgIAotCQkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gdGhpczsgICAKLQkvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmNoYXJWYWx1ZSgpKTsgICAKLQkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmludFZhbHVlKCkpOyAgIAotCQotCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9ieXRlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfbG9uZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX3Nob3J0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1Rfdm9pZCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX1N0cmluZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX09iamVjdCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2RvdWJsZSAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Zsb2F0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW4gIAkJCSA6IHJldHVybiB0aGlzOyAgCi0JLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9jaGFyICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfaW50ICAJCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJCi0JLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENoYXJDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5ieXRlVmFsdWUoKSk7ICAKLQkJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMubG9uZ1ZhbHVlKCkpOyAgCi0JCSAgICBjYXNlIChUX2NoYXI8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENoYXJDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5zaG9ydFZhbHVlKCkpOyAgCi0JLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9TdHJpbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmRvdWJsZVZhbHVlKCkpOyAgIAotCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuZmxvYXRWYWx1ZSgpKTsgICAKLQkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIHRoaXM7ICAKLQkJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIENoYXJDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5pbnRWYWx1ZSgpKTsgIAotCQkKLQkvLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfaW50PDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmJ5dGVWYWx1ZSgpKTsgIAotCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKChpbnQpIHRoaXMubG9uZ1ZhbHVlKCkpOyAgCi0JCSAgICBjYXNlIChUX2ludDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKHRoaXMuc2hvcnRWYWx1ZSgpKTsgIAotCS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCi0JLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAotCS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF9PYmplY3QgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfaW50PDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKChpbnQpIHRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCi0JCSAgICBjYXNlIChUX2ludDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKChpbnQpIHRoaXMuZmxvYXRWYWx1ZSgpKTsgICAKLQkvLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfYm9vbGVhbiAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKLQkJICAgIGNhc2UgKFRfaW50PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZSh0aGlzLmNoYXJWYWx1ZSgpKTsgIAotCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfaW50ICAJCSAJIDogcmV0dXJuIHRoaXM7ICAKLQkKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfU3RyaW5nICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfYm9vbGVhbiAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKworCS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9ieXRlICAJCSA6IHJldHVybiB0aGlzOworCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIEJ5dGVDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpbG9uZ1ZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBCeXRlQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXNob3J0VmFsdWUoKSk7CisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfZG91YmxlICAJIAkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSlkb3VibGVWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSlmbG9hdFZhbHVlKCkpOworCS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gQnl0ZUNvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSljaGFyVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfaW50ICAJCSA6IHJldHVybiBCeXRlQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKWludFZhbHVlKCkpOworCisJLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUoYnl0ZVZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIHRoaXM7CisJCSAgICBjYXNlIChUX2xvbmc8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUoc2hvcnRWYWx1ZSgpKTsKKwkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfT2JqZWN0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKWRvdWJsZVZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKWZsb2F0VmFsdWUoKSk7CisJLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGNoYXJWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUoaW50VmFsdWUoKSk7CisKKwkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZShieXRlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIFNob3J0Q29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydClsb25nVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiB0aGlzOworCS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpZG91YmxlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpZmxvYXRWYWx1ZSgpKTsKKwkvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBTaG9ydENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpY2hhclZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIFNob3J0Q29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydClpbnRWYWx1ZSgpKTsKKworCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9kb3VibGUgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKworCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF91bmRlZmluZWQgICA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9zaG9ydCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJICAgIGNhc2UgKFRfSmF2YUxhbmdTdHJpbmc8PDQpK1RfSmF2YUxhbmdTdHJpbmcgIAkgOiByZXR1cm4gdGhpczsKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfZmxvYXQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZCAgIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2J5dGUgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2xvbmcgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3Nob3J0IAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3ZvaWQgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX1N0cmluZyAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX09iamVjdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2RvdWJsZSAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2Zsb2F0ICAJCTogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbiAJCTogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfY2hhciAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfaW50ICAJCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisKKwkvLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkICAJOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfYnl0ZSAgCQkgCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShieXRlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9sb25nICAJCSAJOiByZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxvbmdWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX3Nob3J0ICAJCTogcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShzaG9ydFZhbHVlKCkpOworCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF92b2lkICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9TdHJpbmcgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9PYmplY3QgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfZG91YmxlICAJCTogcmV0dXJuIHRoaXM7CisJCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9mbG9hdCAgCQk6IHJldHVybiBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUoZmxvYXRWYWx1ZSgpKTsKKwkvLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfYm9vbGVhbiAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9jaGFyICAJCSAJOiByZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGNoYXJWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2ludCAgCQkJOiByZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGludFZhbHVlKCkpOworCisJLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUoYnl0ZVZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsb25nVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShzaG9ydFZhbHVlKCkpOworCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpZG91YmxlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiB0aGlzOworCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGNoYXJWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShpbnRWYWx1ZSgpKTsKKworCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9ieXRlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfbG9uZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX3Nob3J0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1Rfdm9pZCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX1N0cmluZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX09iamVjdCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2RvdWJsZSAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Zsb2F0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW4gIAkJCSA6IHJldHVybiB0aGlzOworCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfY2hhciAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2ludCAgCQkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisKKwkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSgoY2hhcilieXRlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSgoY2hhcilsb25nVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENoYXJDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpc2hvcnRWYWx1ZSgpKTsKKwkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCS8vCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfT2JqZWN0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKWRvdWJsZVZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDaGFyQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKWZsb2F0VmFsdWUoKSk7CisJLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9jaGFyICAJCSA6IHJldHVybiB0aGlzOworCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2ludCAgCQkgOiByZXR1cm4gQ2hhckNvbnN0YW50LmZyb21WYWx1ZSgoY2hhcilpbnRWYWx1ZSgpKTsKKworCS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGJ5dGVWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfaW50PDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZSgoaW50KSBsb25nVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2ludDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKHNob3J0VmFsdWUoKSk7CisJLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsKKwkvLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfU3RyaW5nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUoKGludCkgZG91YmxlVmFsdWUoKSk7CisJCSAgICBjYXNlIChUX2ludDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKChpbnQpIGZsb2F0VmFsdWUoKSk7CisJLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX2Jvb2xlYW4gIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCSAgICBjYXNlIChUX2ludDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUoY2hhclZhbHVlKCkpOworCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfaW50ICAJCSAJIDogcmV0dXJuIHRoaXM7CisKIAkJfQotCQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwogCX0KLQkKKwogCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQkJCiAJCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb25zdGFudF9jYW5ub3RDYXN0ZWRJbnRvLCBuZXcgU3RyaW5nW10geyB0eXBlTmFtZSgpLCAiY2hhciIgfSkpOyAvLyROT04tTkxTLTEkCiAJfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGNzdCwgaW50IGlkLCBpbnQgb3BlcmF0b3IpIHsKIAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGNzdCwgaW50IGlkLCBpbnQgb3BlcmF0b3IpIHsKIAkJc3dpdGNoIChvcGVyYXRvcikgewotCQkJY2FzZSBOT1QJOiAJCisJCQljYXNlIE5PVAk6CiAJCQkJCQkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUoIWNzdC5ib29sZWFuVmFsdWUoKSk7CiAJCQljYXNlIFBMVVMJOgogCQkJCQkJCXJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25QTFVTKEludENvbnN0YW50LmZyb21WYWx1ZSgwKSxUX2ludCxjc3QsaWQpOwpAQCAtMjMxLDcgKzIyNiw3IEBACiAJCQkJCQkJCQkJCQlicmVhazsgLy9kZWZhdWx0IGNhc2UKIAkJCQkJCQl9CiAJCQkJCQkJcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1JTlVTKEludENvbnN0YW50LmZyb21WYWx1ZSgwKSxUX2ludCxjc3QsaWQpOwotCQkJY2FzZSBUV0lERExFOgkKKwkJCWNhc2UgVFdJRERMRToKIAkJCQlzd2l0Y2ggKGlkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmNoYXJWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuYnl0ZVZhbHVlKCkpOwpAQCAtMjM5LDEzICsyMzQsMTIgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZSh+IGNzdC5sb25nVmFsdWUoKSk7CiAJCQkJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50OwotCQkJCX0gCisJCQkJfQogCQkJZGVmYXVsdCA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CiAJCX0KLQl9IAorCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0KIAkJc3dpdGNoIChvcGVyYXRvcikgewogCQkJY2FzZSBBTkQJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORAkJKGxlZnQsbGVmdElkLHJpZ2h0LHJpZ2h0SWQpOwogCQkJY2FzZSBBTkRfQU5ECTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORF9BTkQJKGxlZnQsbGVmdElkLHJpZ2h0LHJpZ2h0SWQpOwpAQCAtMjY0LDEzICsyNTgsMTEgQEAKIAkJCWNhc2UgUklHSFRfU0hJRlQ6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SSUdIVF9TSElGVChsZWZ0LGxlZnRJZCxyaWdodCxyaWdodElkKTsKIAkJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQ6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25VTlNJR05FRF9SSUdIVF9TSElGVChsZWZ0LGxlZnRJZCxyaWdodCxyaWdodElkKTsKIAkJCWNhc2UgWE9SCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25YT1IJCShsZWZ0LGxlZnRJZCxyaWdodCxyaWdodElkKTsKLQkKIAkJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50OwogCQl9CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkQoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7CiAJCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpICYgcmlnaHQuYm9vbGVhblZhbHVlKCkpOwogCQkJY2FzZSBUX2NoYXIgOgpAQCAtMjgxLDcgKzI3Myw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0yOTAsNyArMjgyLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMjk5LDcgKzI5MSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9pbnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0zMDgsNyArMzAwLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICYgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMzE3LDE5ICszMDksMTYgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJfQotCQkKKwkJfQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwotCX0gCi0JCQorCX0KKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uQU5EX0FORChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkKIAkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSAmJiByaWdodC5ib29sZWFuVmFsdWUoKSk7CiAJfQotCQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRElWSURFKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewogCQkvLyBkaXZpc2lvbiBieSB6ZXJvIG11c3QgYmUgaGFuZGxlZCBvdXRzaWRlIHRoaXMgbWV0aG9kIChlcnJvciByZXBvcnRpbmcpCi0JCiAJCXN3aXRjaCAobGVmdElkKXsKIAkJCWNhc2UgVF9jaGFyIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewpAQCAtMzQxLDcgKzMzMCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMzUyLDcgKzM0MSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9kb3VibGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0zNjMsNyArMzUyLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9ieXRlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTM3NCw3ICszNjMsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0zODUsNyArMzc0LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTM5Niw3ICszODUsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC00MDcsMjAgKzM5NiwxNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCi0JCQl9Ci0JCQorCQl9CiAJCXJldHVybiBOb3RBQ29uc3RhbnQ7Ci0JfSAKLQkJCisJfQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25FUVVBTF9FUVVBTChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkJCiAJCXN3aXRjaCAobGVmdElkKXsKIAkJCWNhc2UgVF9ib29sZWFuIDoKIAkJCQlpZiAocmlnaHRJZCA9PSBUX2Jvb2xlYW4pIHsKIAkJCQkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSA9PSByaWdodC5ib29sZWFuVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfY2hhciA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTQzMCw3ICs0MTYsNyBAQAogCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTt9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9mbG9hdCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC00NDEsNyArNDI3LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID09IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNDUyLDcgKzQzOCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC00NjMsNyArNDQ5LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsJCQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC00NzQsNyArNDYwLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID09IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNDg1LDcgKzQ3MSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTQ5NiwzMSArNDgyLDI5IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgogCQkJCWlmIChyaWdodElkID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKIAkJCQkJLy9TdHJpbmcgYXJlIGludGVybmVkIGluIHRoIGNvbXBpbGVyPT0+dGh1cyBpZiB0d28gc3RyaW5nIGNvbnN0YW50CiAJCQkJCS8vZ2V0IHRvIGJlIGNvbXBhcmVkLCBpdCBpcyBhbiBlcXVhbCBvbiB0aGUgdmFsZSB3aGljaCBpcyBkb25lCiAJCQkJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKCgoU3RyaW5nQ29uc3RhbnQpbGVmdCkuaGFzU2FtZVZhbHVlKHJpZ2h0KSk7CiAJCQkJfQotCQkJYnJlYWs7CQorCQkJCWJyZWFrOwogCQkJY2FzZSBUX251bGwgOgotCQkJCWlmIChyaWdodElkID09IFRfSmF2YUxhbmdTdHJpbmcpIHsgCisJCQkJaWYgKHJpZ2h0SWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgewogCQkJCQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShmYWxzZSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJpZ2h0SWQgPT0gVF9udWxsKSB7IAorCQkJCQlpZiAocmlnaHRJZCA9PSBUX251bGwpIHsKIAkJCQkJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKHRydWUpOwogCQkJCQl9CiAJCQkJfQotCQkJfQotCQkKKwkJfQogCQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShmYWxzZSk7CiAJfQotCQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uR1JFQVRFUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkJCiAJCXN3aXRjaCAobGVmdElkKXsKLQkJCWNhc2UgVF9jaGFyIDogCisJCQljYXNlIFRfY2hhciA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpOwogCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpOwpAQCAtNTMwLDcgKzUxNCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2Zsb2F0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNTQxLDcgKzUyNSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZG91YmxlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTU1Miw3ICs1MzYsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNTYzLDcgKzU0Nyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkJCQorCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNTc0LDcgKzU1OCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfaW50IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTU4NSw3ICs1NjksNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC01OTYsMTYgKzU4MCwxNCBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQorCisJCX0KIAkJcmV0dXJuIE5vdEFDb25zdGFudDsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVJfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCQljYXNlIFRfY2hhciA6IAorCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpOwpAQCAtNjE1LDcgKzU5Nyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNjI2LDcgKzYwOCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9kb3VibGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTYzNyw3ICs2MTksNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9ieXRlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNjQ4LDcgKzYzMCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFRfc2hvcnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNjU5LDcgKzY0MSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9pbnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTY3MCw3ICs2NTIsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsJCQorCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC02ODEsMTQgKzY2MywxMSBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCQkKLQkJCX0KLQkJCisJCX0KIAkJcmV0dXJuIE5vdEFDb25zdGFudDsKLQl9ICAKLQkJCisJfQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRUZUX1NISUZUKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCQkKIAkJc3dpdGNoIChsZWZ0SWQpewogCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CkBAIC02OTgsNyArNjc3LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNzA3LDcgKzY4Niw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtNzE2LDcgKzY5NSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfaW50IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTcyNSw3ICs3MDQsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTczNCwxNiArNzEzLDEzIEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQotCQkJfQotCQorCQl9CiAJCXJldHVybiBOb3RBQ29uc3RhbnQ7Ci0JfSAKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeyAKLQkJCisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewogCQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCQljYXNlIFRfY2hhciA6IAorCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKQEAgLTc1Myw3ICs3MjksNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9mbG9hdCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTc2NCw3ICs3NDAsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC03NzUsNyArNzUxLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTc4Niw3ICs3NjIsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsJCQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTc5Nyw3ICs3NzMsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC04MDgsNyArNzg0LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtODE5LDE2ICs3OTUsMTMgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJCQotCQkJfQotCQkKKwkJfQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwogCX0KLQkJCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1NfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCQljYXNlIFRfY2hhciA6IAorCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpOwpAQCAtODM4LDcgKzgxMSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtODQ5LDcgKzgyMiw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9kb3VibGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTg2MCw3ICs4MzMsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9ieXRlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtODcxLDcgKzg0NCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFRfc2hvcnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtODkzLDcgKzg2Niw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTkwNCwxNSArODc3LDEzIEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQm9vbGVhbkNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEJvb2xlYW5Db25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJfQotCQkKKwkJfQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwotCX0gIAotCQorCX0KKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTUlOVVMoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCQljYXNlIFRfY2hhciA6IAorCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOwogCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKQEAgLTkyMiw3ICs4OTMsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2Zsb2F0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTkzMyw3ICs5MDQsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZG91YmxlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtOTQ0LDcgKzkxNSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC05NTUsNyArOTI2LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsJCQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtOTY2LDcgKzkzNyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9pbnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC05NzcsNyArOTQ4LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC05ODgsMTQgKzk1OSwxMSBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQorCQl9CiAJCXJldHVybiBOb3RBQ29uc3RhbnQ7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NVUxUSVBMWShDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkKIAkJc3dpdGNoIChsZWZ0SWQpewogCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CkBAIC0xMDA3LDcgKzk3NSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTAxOCw3ICs5ODYsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZG91YmxlIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTAyOSw3ICs5OTcsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBEb3VibGVDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTA0MCw3ICsxMDA4LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTA1MSw3ICsxMDE5LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTEwNjIsNyArMTAzMCw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTEwNzMsMTMgKzEwNDEsMTEgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJfQotCQorCQl9CiAJCXJldHVybiBOb3RBQ29uc3RhbnQ7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkJCiAJCXN3aXRjaCAobGVmdElkKXsKIAkJCWNhc2UgVF9ib29sZWFuIDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgfCByaWdodC5ib29sZWFuVmFsdWUoKSk7CiAJCQljYXNlIFRfY2hhciA6CkBAIC0xMDkwLDcgKzEwNTYsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTA5OSw3ICsxMDY1LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTEwOCw3ICsxMDc0LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTExMTcsNyArMTA4Myw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTExMjYsMjkgKzEwOTIsMjYgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQotCQkJfQkKLQkKKwkJfQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uT1JfT1IoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCiAJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgfHwgcmlnaHQuYm9vbGVhblZhbHVlKCkpOwogCX0KLQkJCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblBMVVMoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7CiAJCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgogCQkJCWlmIChyaWdodElkID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKIAkJCQkJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKIAkJCQl9CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYm9vbGVhbiA6CiAJCQkJaWYgKHJpZ2h0SWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgewogCQkJCQlyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTE2MCw3ICsxMTIzLDcgQEAKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZzoJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9mbG9hdCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMTcwLDkgKzExMzMsOSBAQAogCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gRmxvYXRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKLQkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKwkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSArIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTExODQsNyArMTE0Nyw3IEBACiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTE5NCwxMCArMTE1Nyw5IEBACiAJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKLQkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKwkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOwogCQkJCX0KLQkKLQkJCWJyZWFrOwkJCQorCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMjA5LDcgKzExNzEsNyBAQAogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZzoJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9pbnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMjIxLDcgKzExODMsNyBAQAogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmc6CXJldHVybiBTdHJpbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMjMxLDkgKzExOTMsOSBAQAogCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpOwogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKLQkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKwkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBTdHJpbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgU3RyaW5nLnZhbHVlT2YocmlnaHQuY2hhclZhbHVlKCkpKTsKQEAgLTEyNDMsMTAgKzEyMDUsMTAgQEAKIAkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIFN0cmluZy52YWx1ZU9mKHJpZ2h0LnNob3J0VmFsdWUoKSkpOwogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyBTdHJpbmcudmFsdWVPZihyaWdodC5pbnRWYWx1ZSgpKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gU3RyaW5nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIFN0cmluZy52YWx1ZU9mKHJpZ2h0LmxvbmdWYWx1ZSgpKSk7Ci0JCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZzoJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsgCisJCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZzoJcmV0dXJuIFN0cmluZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2Jvb2xlYW46CXJldHVybiBTdHJpbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuYm9vbGVhblZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkKKwkJCQlicmVhazsKIC8vCQkJY2FzZSBUX251bGwgOgogLy8JCQkJc3dpdGNoIChyaWdodElkKXsKIC8vCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgU3RyaW5nLnZhbHVlT2YocmlnaHQuY2hhclZhbHVlKCkpKTsKQEAgLTEyNTYsMTggKzEyMTgsMTYgQEAKIC8vCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgU3RyaW5nLnZhbHVlT2YocmlnaHQuc2hvcnRWYWx1ZSgpKSk7CiAvLwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgU3RyaW5nLnZhbHVlT2YocmlnaHQuaW50VmFsdWUoKSkpOwogLy8JCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIFN0cmluZy52YWx1ZU9mKHJpZ2h0LmxvbmdWYWx1ZSgpKSk7Ci0vLwkJCQkJY2FzZSBUX0phdmFMYW5nU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKy8vCQkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CiAvLwkJCQkJY2FzZSBUX2Jvb2xlYW46CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuYm9vbGVhblZhbHVlKCkpOwotLy8JCQkJfQkJCQkKLQkJCX0KLQkJCisvLwkJCQl9CisJCX0KIAkJcmV0dXJuIE5vdEFDb25zdGFudDsKIAl9Ci0JCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SRU1BSU5ERVIoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCQljYXNlIFRfY2hhciA6IAorCQkJY2FzZSBUX2NoYXIgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOwogCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKQEAgLTEyNzcsNyArMTIzNyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfZmxvYXQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTI4OCw3ICsxMjQ4LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBGbG9hdENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEZsb2F0Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTEyOTksNyArMTI1OSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gRG91YmxlQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIERvdWJsZUNvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMzEwLDcgKzEyNzAsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOwkJCQorCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMzIxLDcgKzEyODEsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfaW50IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTMzMiw3ICsxMjkyLDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CQkKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMzQzLDE0ICsxMzAzLDExIEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCQkKLQkJCX0KLQkJCisJCX0KIAkJcmV0dXJuIE5vdEFDb25zdGFudDsKLQl9IAotCQorCX0KKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uUklHSFRfU0hJRlQoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7CiAJCQljYXNlIFRfY2hhciA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKQEAgLTEzNjAsNyArMTMxNyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTEzNjksNyArMTMyNiw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX3Nob3J0IDoKIAkJCQlzd2l0Y2ggKHJpZ2h0SWQpewogCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTM3OCw3ICsxMzM1LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9pbnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTM4Nyw3ICsxMzQ0LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xMzk2LDE0ICsxMzUzLDExIEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQotCQkJfQotCQkKKwkJfQogCQlyZXR1cm4gTm90QUNvbnN0YW50OwogCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uVU5TSUdORURfUklHSFRfU0hJRlQoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JCQogCQlzd2l0Y2ggKGxlZnRJZCl7CiAJCQljYXNlIFRfY2hhciA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKQEAgLTE0MTMsNyArMTM2Nyw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfYnl0ZSA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTE0MjIsNyArMTM3Niw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfc2hvcnQgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTQzMSw3ICsxMzg1LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTQ0MCw3ICsxMzk0LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJYnJlYWs7CisJCQkJYnJlYWs7CiAJCQljYXNlIFRfbG9uZyA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSk7CkBAIC0xNDQ5LDE0ICsxNDAzLDExIEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCi0JCQl9Ci0JCisJCX0KIAkJcmV0dXJuIE5vdEFDb25zdGFudDsKIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblhPUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkJCiAJCXN3aXRjaCAobGVmdElkKXsKIAkJCWNhc2UgVF9ib29sZWFuIDoJCXJldHVybiBCb29sZWFuQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgXiByaWdodC5ib29sZWFuVmFsdWUoKSk7CiAJCQljYXNlIFRfY2hhciA6CkBAIC0xNDY3LDcgKzE0MTgsNyBAQAogCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQuaW50VmFsdWUoKSk7CiAJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gTG9uZ0NvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIEludENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTQ3Niw3ICsxNDI3LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9Ci0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOwpAQCAtMTQ4NSw3ICsxNDM2LDcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBJbnRDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6CiAJCQkJc3dpdGNoIChyaWdodElkKXsKIAkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTE0OTQsNyArMTQ0NSw3IEBACiAJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gSW50Q29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpOwogCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpOwogCQkJCX0KLQkJCWJyZWFrOworCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgogCQkJCXN3aXRjaCAocmlnaHRJZCl7CiAJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIExvbmdDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKQEAgLTE1MDMsMjkgKzE0NTQsMjcgQEAKIAkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKIAkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBMb25nQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSk7CiAJCQkJfQotCQkJfQotCQorCQl9CiAJCXJldHVybiBOb3RBQ29uc3RhbnQ7CiAJfQogCiAJcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQogCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29uc3RhbnRfY2Fubm90Q2FzdGVkSW50bywgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUoKSwgImRvdWJsZSIgfSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0KIAkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbnN0YW50X2Nhbm5vdENhc3RlZEludG8sIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lKCksICJmbG9hdCIgfSkpOyAvLyROT04tTkxTLTEkCiAJfQorCQogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGNvbnN0YW50cyBoYXZlIHRoZSBzYW1lIHR5cGUgYW5kIHRoZSBzYW1lIGFjdHVhbCB2YWx1ZQogCSAqIEBwYXJhbSBvdGhlckNvbnN0YW50CiAJICovCiAJcHVibGljIGJvb2xlYW4gaGFzU2FtZVZhbHVlKENvbnN0YW50IG90aGVyQ29uc3RhbnQpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXJDb25zdGFudCkgCisJCWlmICh0aGlzID09IG90aGVyQ29uc3RhbnQpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaW50IHR5cGVJRDsKLQkJaWYgKCh0eXBlSUQgPSB0eXBlSUQoKSkgIT0gb3RoZXJDb25zdGFudC50eXBlSUQoKSkgCisJCWlmICgodHlwZUlEID0gdHlwZUlEKCkpICE9IG90aGVyQ29uc3RhbnQudHlwZUlEKCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXN3aXRjaCAodHlwZUlEKSB7CiAJCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuOgpAQCAtMTU0NiwzNSArMTQ5NSwzMCBAQAogCQkJCXJldHVybiBsb25nVmFsdWUoKSA9PSBvdGhlckNvbnN0YW50LmxvbmdWYWx1ZSgpOwogCQkJY2FzZSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmc6CiAJCQkJU3RyaW5nIHZhbHVlID0gc3RyaW5nVmFsdWUoKTsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCAKKwkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbAogCQkJCQk/IG90aGVyQ29uc3RhbnQuc3RyaW5nVmFsdWUoKSA9PSBudWxsCiAJCQkJCTogdmFsdWUuZXF1YWxzKG90aGVyQ29uc3RhbnQuc3RyaW5nVmFsdWUoKSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKLQlwdWJsaWMgaW50IGludFZhbHVlKCkgewogCisJcHVibGljIGludCBpbnRWYWx1ZSgpIHsKIAkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbnN0YW50X2Nhbm5vdENhc3RlZEludG8sIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lKCksICJpbnQiIH0pKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQogCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29uc3RhbnRfY2Fubm90Q2FzdGVkSW50bywgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUoKSwgImxvbmciIH0pKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCiAJCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb25zdGFudF9jYW5ub3RDb252ZXJ0ZWRUbywgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUoKSwgInNob3J0IiB9KSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCiAJCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb25zdGFudF9jYW5ub3RDb252ZXJ0ZWRUbywgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUoKSwgIlN0cmluZyIgfSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQogCQlpZiAodGhpcyA9PSBOb3RBQ29uc3RhbnQpIHJldHVybiAiKENvbnN0YW50KSBOb3RBQ29uc3RhbnQiOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzdXBlci50b1N0cmluZygpOyB9CiAKQEAgLTE1OTEsNyArMTUzNSw2IEBACiAJCQljYXNlIFRfYm9vbGVhbiA6IHJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKIAkJCWNhc2UgVF9sb25nIDogcmV0dXJuICJsb25nIjsvLyROT04tTkxTLTEkCiAJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFRfbnVsbCA6IHJldHVybiAibnVsbCI7CSAvLyROT04tTkxTLTEkCiAJCQlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRG91YmxlQ29uc3RhbnQuamF2YQppbmRleCA2MjRhNWJjLi5lZjg0MWNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0RvdWJsZUNvbnN0YW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNTcgKzExLDc1IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgRG91YmxlQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7Ci0JCisKIAlwcml2YXRlIGRvdWJsZSB2YWx1ZTsKIAogCXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGRvdWJsZSB2YWx1ZSkgewotCiAJCXJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQodmFsdWUpOwogCX0KIAogCXByaXZhdGUgRG91YmxlQ29uc3RhbnQoZG91YmxlIHZhbHVlKSB7CiAJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgdmFsdWU7CisJCXJldHVybiAoYnl0ZSkgdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7Ci0JCXJldHVybiAoY2hhcikgdmFsdWU7CisJCXJldHVybiAoY2hhcikgdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQkJcmV0dXJuIChmbG9hdCkgdmFsdWU7CisJCXJldHVybiAoZmxvYXQpIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChpbnQpIHZhbHVlOworCQlyZXR1cm4gKGludCkgdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCXJldHVybiAobG9uZykgdmFsdWU7CisJCXJldHVybiAobG9uZykgdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChzaG9ydCkgdmFsdWU7CisJCXJldHVybiAoc2hvcnQpIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKIAkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmICh0aGlzID09IE5vdEFDb25zdGFudCkKIAkJCXJldHVybiAiKENvbnN0YW50KSBOb3RBQ29uc3RhbnQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiKGRvdWJsZSkiICsgdmFsdWU7ICAvLyROT04tTkxTLTEkCisJCXJldHVybiAiKGRvdWJsZSkiICsgdGhpcy52YWx1ZTsgIC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgaW50IHR5cGVJRCgpIHsKIAkJcmV0dXJuIFRfZG91YmxlOwogCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWxvbmcgdGVtcCA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpOworCQlyZXR1cm4gKGludCkgKHRlbXAgXiAodGVtcCA+Pj4gMzIpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRG91YmxlQ29uc3RhbnQgb3RoZXIgPSAoRG91YmxlQ29uc3RhbnQpIG9iajsKKwkJcmV0dXJuIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID09IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKG90aGVyLnZhbHVlKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9GbG9hdENvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9GbG9hdENvbnN0YW50LmphdmEKaW5kZXggYjdlYmY2Yi4uNDFjZWQyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRmxvYXRDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw5ICsxMSw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgRmxvYXRDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKLQkKKwogCWZsb2F0IHZhbHVlOwotCQorCiAJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoZmxvYXQgdmFsdWUpIHsKIAkJcmV0dXJuIG5ldyBGbG9hdENvbnN0YW50KHZhbHVlKTsKIAl9CkBAIC0yMSw0NCArMjEsNjIgQEAKIAlwcml2YXRlIEZsb2F0Q29uc3RhbnQoZmxvYXQgdmFsdWUpIHsKIAkJdGhpcy52YWx1ZSA9IHZhbHVlOwogCX0KLQkKKwogCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIChieXRlKSB2YWx1ZTsKKwkJcmV0dXJuIChieXRlKSB0aGlzLnZhbHVlOwogCX0KLQkKKwogCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQkJcmV0dXJuIChjaGFyKSB2YWx1ZTsKKwkJcmV0dXJuIChjaGFyKSB0aGlzLnZhbHVlOwogCX0KLQkKKwogCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogCX0KLQkKKwogCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGludFZhbHVlKCkgewotCQlyZXR1cm4gKGludCkgdmFsdWU7CisJCXJldHVybiAoaW50KSB0aGlzLnZhbHVlOwogCX0KLQkKKwogCXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQkJcmV0dXJuIChsb25nKSB2YWx1ZTsKKwkJcmV0dXJuIChsb25nKSB0aGlzLnZhbHVlOwogCX0KLQkKKwogCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCQlyZXR1cm4gKHNob3J0KSB2YWx1ZTsKKwkJcmV0dXJuIChzaG9ydCkgdGhpcy52YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewogCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSk7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoZmxvYXQpIiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JfSAKKwkJcmV0dXJuICIoZmxvYXQpIiArIHRoaXMudmFsdWU7IC8vJE5PTi1OTFMtMSQKKwl9CiAKIAlwdWJsaWMgaW50IHR5cGVJRCgpIHsKIAkJcmV0dXJuIFRfZmxvYXQ7CiAJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIEZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlGbG9hdENvbnN0YW50IG90aGVyID0gKEZsb2F0Q29uc3RhbnQpIG9iajsKKwkJcmV0dXJuIEZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLnZhbHVlKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JVHlwZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YQppbmRleCBlNDVlNWMwLi41MmNmNjFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JVHlwZVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lUeXBlUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsNyArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSVR5cGVSZXF1ZXN0b3IgewotCQorCiAJLyoqCiAJICogQWNjZXB0IHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybSBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSW50Q29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0ludENvbnN0YW50LmphdmEKaW5kZXggMGIwNTdlNy4uMDFmYjA0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSW50Q29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDkgKzExLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgSW50Q29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7Ci0JCisKIAlpbnQgdmFsdWU7Ci0JCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBNSU5fVkFMVUUgPSBuZXcgSW50Q29uc3RhbnQoSW50ZWdlci5NSU5fVkFMVUUpOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIEludENvbnN0YW50IE1JTlVTX0ZPVVIgPSBuZXcgSW50Q29uc3RhbnQoLTQpOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIEludENvbnN0YW50IE1JTlVTX1RIUkVFID0gbmV3IEludENvbnN0YW50KC0zKTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBNSU5VU19UV08gPSBuZXcgSW50Q29uc3RhbnQoLTIpOwpAQCAtMjksMTAgKzMwLDEwIEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50Q29uc3RhbnQgRUlHSFQ9IG5ldyBJbnRDb25zdGFudCg4KTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBOSU5FID0gbmV3IEludENvbnN0YW50KDkpOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIEludENvbnN0YW50IFRFTiA9IG5ldyBJbnRDb25zdGFudCgxMCk7Ci0JCi0JcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoaW50IHZhbHVlKSB7CiAKKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShpbnQgdmFsdWUpIHsKIAkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBJbnRlZ2VyLk1JTl9WQUxVRSA6IHJldHVybiBJbnRDb25zdGFudC5NSU5fVkFMVUU7CiAJCQljYXNlIC00IDogcmV0dXJuIEludENvbnN0YW50Lk1JTlVTX0ZPVVI7CiAJCQljYXNlIC0zIDogcmV0dXJuIEludENvbnN0YW50Lk1JTlVTX1RIUkVFOwogCQkJY2FzZSAtMiA6IHJldHVybiBJbnRDb25zdGFudC5NSU5VU19UV087CkBAIC01MSw0OSArNTIsNjcgQEAKIAkJfQogCQlyZXR1cm4gbmV3IEludENvbnN0YW50KHZhbHVlKTsKIAl9Ci0JCisKIAlwcml2YXRlIEludENvbnN0YW50KGludCB2YWx1ZSkgewogCQl0aGlzLnZhbHVlID0gdmFsdWU7CiAJfQotCQorCiAJcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCQlyZXR1cm4gKGJ5dGUpIHZhbHVlOworCQlyZXR1cm4gKGJ5dGUpIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCQlyZXR1cm4gKGNoYXIpIHZhbHVlOworCQlyZXR1cm4gKGNoYXIpIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCisJCXJldHVybiB0aGlzLnZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCiAJfQotCQorCiAJcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQorCQlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogCX0KLQkKKwogCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwkJcmV0dXJuIHRoaXMudmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKIAl9Ci0JCisKIAlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChzaG9ydCkgdmFsdWU7CisJCXJldHVybiAoc2hvcnQpIHRoaXMudmFsdWU7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKIAkJLy9zcGVjIDE1LjE3LjExCiAJCXJldHVybiBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIihpbnQpIiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JfSAKKwkJcmV0dXJuICIoaW50KSIgKyB0aGlzLnZhbHVlOyAvLyROT04tTkxTLTEkCisJfQogCiAJcHVibGljIGludCB0eXBlSUQoKSB7CiAJCXJldHVybiBUX2ludDsKIAl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSW50Q29uc3RhbnQgb3RoZXIgPSAoSW50Q29uc3RhbnQpIG9iajsKKwkJcmV0dXJuIHRoaXMudmFsdWUgPT0gb3RoZXIudmFsdWU7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSXJyaXRhbnRTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lycml0YW50U2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxODIzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lycml0YW50U2V0LmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOworCisvKioKKyAqIFJlcHJlc2VudCBhIHNldCBvZiBpcnJpdGFudCBmbGFncy4gSXJyaXRhbnRzIGFyZSBvcmdhbml6ZWQgaW4gdXAgdG8gOCBncm91cAorICogb2YgMjksIGFsbG93aW5nIGZvciBhIG1heGltdW0gb2YgMjMyIGRpc3RpbmN0IGlycml0YW50cy4KKyAqLworcHVibGljIGNsYXNzIElycml0YW50U2V0IHsKKworCS8vIFJlc2VydmUgdHdvIGhpZ2ggYml0cyBmb3Igc2VsZWN0aW5nIHRoZSByaWdodCBiaXQgcGF0dGVybgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQX01BU0sgPSBBU1ROb2RlLkJpdDMyIHwgQVNUTm9kZS5CaXQzMSB8IEFTVE5vZGUuQml0MzA7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVBfU0hJRlQgPSAyOTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBHUk9VUF9NQVggPSAzOyAvLyBjYW4gYmUgaW5jcmVhc2VkIHVwIHRvIDgKKworCS8vIEdyb3VwIHByZWZpeCBmb3IgaXJyaXRhbnRzCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVAwID0gMCA8PCBHUk9VUF9TSElGVDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBHUk9VUDEgPSAxIDw8IEdST1VQX1NISUZUOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQMiA9IDIgPDwgR1JPVVBfU0hJRlQ7CisJLy8gcmV2ZWFsIHN1YnNlcXVlbnQgZ3JvdXBzIGFzIG5lZWRlZAorCS8vIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQMyA9IDMgPDwgR1JPVVBfU0hJRlQ7CisJLy8gcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVA0ID0gNCA8PCBHUk9VUF9TSElGVDsKKwkvLyBwdWJsaWMgZmluYWwgc3RhdGljIGludCBHUk9VUDUgPSA1IDw8IEdST1VQX1NISUZUOworCS8vIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQNiA9IDYgPDwgR1JPVVBfU0hJRlQ7CisJLy8gcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVA3ID0gNyA8PCBHUk9VUF9TSElGVDsKKworCS8vIFByZWRlZmluZSBzZXRzIG9mIGlycml0YW50cyBtYXRjaGluZyB3YXJuaW5nIHRva2VucworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgQUxMID0gbmV3IElycml0YW50U2V0KDB4RkZGRkZGRkYgJiB+R1JPVVBfTUFTSyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBCT1hJTkcgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLkF1dG9Cb3hpbmcpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgQ0FTVCA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlUeXBlQ2hlY2spOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgREVQUkVDQVRJT04gPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLlVzaW5nRGVwcmVjYXRlZEFQSSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBERVBfQU5OID0gbmV3IElycml0YW50U2V0KENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24pOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgRkFMTFRIUk9VR0ggPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLkZhbGx0aHJvdWdoQ2FzZSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBGSU5BTExZID0gbmV3IElycml0YW50U2V0KENvbXBpbGVyT3B0aW9ucy5GaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IEhJRElORyA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuTWFza2VkQ2F0Y2hCbG9jayk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBJTkNPTVBMRVRFX1NXSVRDSCA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuSW5jb21wbGV0ZUVudW1Td2l0Y2gpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgTkxTID0gbmV3IElycml0YW50U2V0KENvbXBpbGVyT3B0aW9ucy5Ob25FeHRlcm5hbGl6ZWRTdHJpbmcpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgTlVMTCA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuTnVsbFJlZmVyZW5jZSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBSQVcgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2UpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgUkVTVFJJQ1RJT04gPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLkZvcmJpZGRlblJlZmVyZW5jZSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBTRVJJQUwgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdTZXJpYWxWZXJzaW9uKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IFNUQVRJQ19BQ0NFU1MgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLkluZGlyZWN0U3RhdGljQWNjZXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IFNUQVRJQ19NRVRIT0QgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLk1ldGhvZENhbkJlU3RhdGljKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IFNZTlRIRVRJQ19BQ0NFU1MgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLkFjY2Vzc0VtdWxhdGlvbik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBTVVBFUiA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24pOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSXJyaXRhbnRTZXQgVU5VU0VEID0gbmV3IElycml0YW50U2V0KENvbXBpbGVyT3B0aW9ucy5VbnVzZWRMb2NhbFZhcmlhYmxlKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IFVOQ0hFQ0tFRCA9IG5ldyBJcnJpdGFudFNldChDb21waWxlck9wdGlvbnMuVW5jaGVja2VkVHlwZU9wZXJhdGlvbik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBVTlFVQUxJRklFRF9GSUVMRF9BQ0NFU1MgPSBuZXcgSXJyaXRhbnRTZXQoQ29tcGlsZXJPcHRpb25zLlVucXVhbGlmaWVkRmllbGRBY2Nlc3MpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBKQVZBRE9DID0gbmV3IElycml0YW50U2V0KENvbXBpbGVyT3B0aW9ucy5JbnZhbGlkSmF2YWRvYyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJcnJpdGFudFNldCBDT01QSUxFUl9ERUZBVUxUX0VSUk9SUyA9IG5ldyBJcnJpdGFudFNldCgwKTsgLy8gbm8gb3B0aW9uYWwgZXJyb3IgYnkgZGVmYXVsdAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElycml0YW50U2V0IENPTVBJTEVSX0RFRkFVTFRfV0FSTklOR1MgPSBuZXcgSXJyaXRhbnRTZXQoMCk7IC8vIHNlZSBzdGF0aWMgaW5pdGlhbGl6ZXIgYmVsb3cKKwlzdGF0aWMgeworCQlDT01QSUxFUl9ERUZBVUxUX1dBUk5JTkdTCisJCQkvLyBncm91cC0wIHdhcm5pbmdzIGVuYWJsZWQgYnkgZGVmYXVsdAorCQkJLnNldCgKKwkJCQlDb21waWxlck9wdGlvbnMuTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZQorCQkJCXwgQ29tcGlsZXJPcHRpb25zLk92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZAorCQkJCXwgQ29tcGlsZXJPcHRpb25zLlVzaW5nRGVwcmVjYXRlZEFQSQorCQkJCXwgQ29tcGlsZXJPcHRpb25zLk1hc2tlZENhdGNoQmxvY2sKKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5VbnVzZWRMb2NhbFZhcmlhYmxlCisJCQkJfCBDb21waWxlck9wdGlvbnMuTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24KKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5Bc3NlcnRVc2VkQXNBbklkZW50aWZpZXIKKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQKKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5Ob25TdGF0aWNBY2Nlc3NUb1N0YXRpYworCQkJCXwgQ29tcGlsZXJPcHRpb25zLk5vRWZmZWN0QXNzaWdubWVudAorCQkJCXwgQ29tcGlsZXJPcHRpb25zLkluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZAorCQkJCXwgQ29tcGlsZXJPcHRpb25zLlVudXNlZFByaXZhdGVNZW1iZXIKKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5GaW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nKQorCQkJLy8gZ3JvdXAtMSB3YXJuaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKKwkJCS5zZXQoCisJCQkJQ29tcGlsZXJPcHRpb25zLlVuY2hlY2tlZFR5cGVPcGVyYXRpb24KKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5GaW5hbFBhcmFtZXRlckJvdW5kCisJCQkJfCBDb21waWxlck9wdGlvbnMuTWlzc2luZ1NlcmlhbFZlcnNpb24KKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5FbnVtVXNlZEFzQW5JZGVudGlmaWVyCisJCQkJfCBDb21waWxlck9wdGlvbnMuRm9yYmlkZGVuUmVmZXJlbmNlCisJCQkJfCBDb21waWxlck9wdGlvbnMuVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QKKwkJCQl8IENvbXBpbGVyT3B0aW9ucy5OdWxsUmVmZXJlbmNlCisJCQkJfCBDb21waWxlck9wdGlvbnMuQW5ub3RhdGlvblN1cGVySW50ZXJmYWNlCisJCQkJfCBDb21waWxlck9wdGlvbnMuVHlwZUhpZGluZworCQkJCXwgQ29tcGlsZXJPcHRpb25zLkRpc2NvdXJhZ2VkUmVmZXJlbmNlCisJCQkJfCBDb21waWxlck9wdGlvbnMuVW5oYW5kbGVkV2FybmluZ1Rva2VuCisJCQkJfCBDb21waWxlck9wdGlvbnMuUmF3VHlwZVJlZmVyZW5jZQorCQkJCXwgQ29tcGlsZXJPcHRpb25zLlVudXNlZExhYmVsCisJCQkJfCBDb21waWxlck9wdGlvbnMuVW51c2VkVHlwZUFyZ3VtZW50cworCQkJCXwgQ29tcGlsZXJPcHRpb25zLlVudXNlZFdhcm5pbmdUb2tlbgorCQkJCXwgQ29tcGlsZXJPcHRpb25zLkNvbXBhcmluZ0lkZW50aWNhbCkKKwkJCS8vIGdyb3VwLTIgd2FybmluZ3MgZW5hYmxlZCBieSBkZWZhdWx0CisJCQkuc2V0KAorCQkJCUNvbXBpbGVyT3B0aW9ucy5EZWFkQ29kZQorCQkJCXxDb21waWxlck9wdGlvbnMuVGFza3MpOworCQkJCisJCUFMTC5zZXRBbGwoKTsKKwkJSElESU5HCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5GaWVsZEhpZGluZykKKwkJCS5zZXQoQ29tcGlsZXJPcHRpb25zLkxvY2FsVmFyaWFibGVIaWRpbmcpCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5UeXBlSGlkaW5nKTsKKwkJTlVMTAorCQkJLnNldChDb21waWxlck9wdGlvbnMuUG90ZW50aWFsTnVsbFJlZmVyZW5jZSkKKwkJCS5zZXQoQ29tcGlsZXJPcHRpb25zLlJlZHVuZGFudE51bGxDaGVjayk7CisJCVJFU1RSSUNUSU9OLnNldChDb21waWxlck9wdGlvbnMuRGlzY291cmFnZWRSZWZlcmVuY2UpOworCQlTVEFUSUNfQUNDRVNTLnNldChDb21waWxlck9wdGlvbnMuTm9uU3RhdGljQWNjZXNzVG9TdGF0aWMpOworCQlVTlVTRUQKKwkJCS5zZXQoQ29tcGlsZXJPcHRpb25zLlVudXNlZEFyZ3VtZW50KQorCQkJLnNldChDb21waWxlck9wdGlvbnMuVW51c2VkUHJpdmF0ZU1lbWJlcikKKwkJCS5zZXQoQ29tcGlsZXJPcHRpb25zLlVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uKQorCQkJLnNldChDb21waWxlck9wdGlvbnMuVW51c2VkTGFiZWwpCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQpCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5VbnVzZWRUeXBlQXJndW1lbnRzKQorCQkJLnNldChDb21waWxlck9wdGlvbnMuUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UpCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5EZWFkQ29kZSkKKwkJCS5zZXQoQ29tcGlsZXJPcHRpb25zLlVudXNlZE9iamVjdEFsbG9jYXRpb24pCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5SZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKTsKKwkJU1RBVElDX01FVEhPRAorCQkgICAgLnNldChDb21waWxlck9wdGlvbnMuTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYyk7CisJCVN0cmluZyBzdXBwcmVzc1Jhd1doZW5VbmNoZWNrZWQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1cHByZXNzUmF3V2hlblVuY2hlY2tlZCIpOyAvLyROT04tTkxTLTEkCisJCWlmIChzdXBwcmVzc1Jhd1doZW5VbmNoZWNrZWQgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShzdXBwcmVzc1Jhd1doZW5VbmNoZWNrZWQpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCVVOQ0hFQ0tFRC5zZXQoQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2UpOworCQl9CisJCQorCQlKQVZBRE9DCisJCQkuc2V0KENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nSmF2YWRvY0NvbW1lbnRzKQorCQkJLnNldChDb21waWxlck9wdGlvbnMuTWlzc2luZ0phdmFkb2NUYWdzKTsKKwl9CisKKwkvLyBJbnRlcm5hbCBzdGF0ZQorCXByaXZhdGUgaW50W10gYml0cyA9IG5ldyBpbnRbR1JPVVBfTUFYXTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIHdpdGggaW5pdGlhbCBpcnJpdGFudCBzZXQKKwkgKi8KKwlwdWJsaWMgSXJyaXRhbnRTZXQoaW50IHNpbmdsZUdyb3VwSXJyaXRhbnRzKSB7CisJCWluaXRpYWxpemUoc2luZ2xlR3JvdXBJcnJpdGFudHMpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIHdpdGggaW5pdGlhbCBpcnJpdGFudCBzZXQKKwkgKi8KKwlwdWJsaWMgSXJyaXRhbnRTZXQoSXJyaXRhbnRTZXQgb3RoZXIpIHsKKwkJaW5pdGlhbGl6ZShvdGhlcik7CisJfQorCisJcHVibGljIGJvb2xlYW4gYXJlQWxsU2V0KCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IEdST1VQX01BWDsgaSsrKSB7CisJCQlpZiAodGhpcy5iaXRzW2ldICE9ICgweEZGRkZGRkZGICYgfkdST1VQX01BU0spKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgSXJyaXRhbnRTZXQgY2xlYXIoaW50IHNpbmdsZUdyb3VwSXJyaXRhbnRzKSB7CisJCWludCBncm91cCA9IChzaW5nbGVHcm91cElycml0YW50cyAmIEdST1VQX01BU0spID4+IEdST1VQX1NISUZUOworCQl0aGlzLmJpdHNbZ3JvdXBdICY9IH5zaW5nbGVHcm91cElycml0YW50czsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIElycml0YW50U2V0IGNsZWFyQWxsKCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IEdST1VQX01BWDsgaSsrKSB7CisJCQl0aGlzLmJpdHNbaV0gPSAwOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemUgYSBzZXQgb2YgaXJyaXRhbnRzIGluIG9uZSBncm91cAorCSAqIAorCSAqIEBwYXJhbSBzaW5nbGVHcm91cElycml0YW50cworCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IHNpbmdsZUdyb3VwSXJyaXRhbnRzKSB7CisJCWlmIChzaW5nbGVHcm91cElycml0YW50cyA9PSAwKQorCQkJcmV0dXJuOworCQlpbnQgZ3JvdXAgPSAoc2luZ2xlR3JvdXBJcnJpdGFudHMgJiBHUk9VUF9NQVNLKSA+PiBHUk9VUF9TSElGVDsKKwkJdGhpcy5iaXRzW2dyb3VwXSA9IHNpbmdsZUdyb3VwSXJyaXRhbnRzICYgfkdST1VQX01BU0s7IC8vIGVyYXNlIGdyb3VwIGluZm9ybWF0aW9uCisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJcnJpdGFudFNldCBvdGhlcikgeworCQlpZiAob3RoZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJU3lzdGVtLmFycmF5Y29weShvdGhlci5iaXRzLCAwLCB0aGlzLmJpdHMgPSBuZXcgaW50W0dST1VQX01BWF0sIDAsIEdST1VQX01BWCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgaXJyaXRhbnRzIGluIGdpdmVuIG90aGVyIHNldCBpcyBwb3NpdGlvbm5lZCBpbiByZWNlaXZlcgorCSAqIEBwYXJhbSBvdGhlcgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQW55U2V0KElycml0YW50U2V0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IEdST1VQX01BWDsgaSsrKSB7CisJCQlpZiAoKHRoaXMuYml0c1tpXSAmIG90aGVyLmJpdHNbaV0pICE9IDApCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGlycml0YW50cyBpbiB0aGUgZ2l2ZW4gaXJyaXRhbnQgc2V0IGFyZSBzZXQgaW4gcmVjZWl2ZXIKKwkgKiBAcGFyYW0gaXJyaXRhbnRTZXQgdGhlIGdpdmVuIGlycml0YW50IHNldAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1NhbWVJcnJpdGFudHMoSXJyaXRhbnRTZXQgaXJyaXRhbnRTZXQpIHsKKwkJaWYgKGlycml0YW50U2V0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgR1JPVVBfTUFYOyBpKyspIHsKKwkJCWlmICh0aGlzLmJpdHNbaV0gIT0gaXJyaXRhbnRTZXQuYml0c1tpXSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTZXQoaW50IHNpbmdsZUdyb3VwSXJyaXRhbnRzKSB7CisJCWludCBncm91cCA9IChzaW5nbGVHcm91cElycml0YW50cyAmIEdST1VQX01BU0spID4+IEdST1VQX1NISUZUOworCQlyZXR1cm4gKHRoaXMuYml0c1tncm91cF0gJiBzaW5nbGVHcm91cElycml0YW50cykgIT0gMDsKKwl9CisKKwlwdWJsaWMgSXJyaXRhbnRTZXQgc2V0KGludCBzaW5nbGVHcm91cElycml0YW50cykgeworCQlpbnQgZ3JvdXAgPSAoc2luZ2xlR3JvdXBJcnJpdGFudHMgJiBHUk9VUF9NQVNLKSA+PiBHUk9VUF9TSElGVDsKKwkJdGhpcy5iaXRzW2dyb3VwXSB8PSAoc2luZ2xlR3JvdXBJcnJpdGFudHMgJiB+R1JPVVBfTUFTSyk7IC8vIGVyYXNlIHRoZSBncm91cCBiaXRzCisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybiB1cGRhdGVkIGlycml0YW50U2V0IG9yIG51bGwgaWYgaXQgd2FzIGEgbm8tb3AKKwkgKiAKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKi8KKwlwdWJsaWMgSXJyaXRhbnRTZXQgc2V0KElycml0YW50U2V0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSBudWxsKQorCQkJcmV0dXJuIHRoaXM7CisJCWJvb2xlYW4gd2FzTm9PcCA9IHRydWU7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgR1JPVVBfTUFYOyBpKyspIHsKKwkJCWludCBvdGhlcklycml0YW50ID0gb3RoZXIuYml0c1tpXSAmIH5HUk9VUF9NQVNLOyAvLyBlcmFzZSB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJLy8gZ3JvdXAKKwkJCQkJCQkJCQkJCQkJCQkJLy8gYml0cworCQkJaWYgKCh0aGlzLmJpdHNbaV0gJiBvdGhlcklycml0YW50KSAhPSBvdGhlcklycml0YW50KSB7CisJCQkJd2FzTm9PcCA9IGZhbHNlOworCQkJCXRoaXMuYml0c1tpXSB8PSBvdGhlcklycml0YW50OworCQkJfQorCQl9CisJCXJldHVybiB3YXNOb09wID8gbnVsbCA6IHRoaXM7CisJfQorCQorCXB1YmxpYyBJcnJpdGFudFNldCBzZXRBbGwoKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgR1JPVVBfTUFYOyBpKyspIHsKKwkJCXRoaXMuYml0c1tpXSB8PSAweEZGRkZGRkZGICYgfkdST1VQX01BU0s7IC8vIGVyYXNlIHRoZSBncm91cAorCQkJCQkJCQkJCQkJCQkJLy8gYml0czsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Mb25nQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhCmluZGV4IGY1NjFmZGUuLjk5ZjlmOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDQ4ICsxMSw4MiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIExvbmdDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKLXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdDb25zdGFudCBaRVJPID0gbmV3IExvbmdDb25zdGFudCgwTCk7CiAKLXByaXZhdGUgbG9uZyB2YWx1ZTsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ0NvbnN0YW50IFpFUk8gPSBuZXcgTG9uZ0NvbnN0YW50KDBMKTsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ0NvbnN0YW50IE1JTl9WQUxVRSA9IG5ldyBMb25nQ29uc3RhbnQoTG9uZy5NSU5fVkFMVUUpOworCQkKKwkJcHJpdmF0ZSBsb25nIHZhbHVlOwogCiBwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShsb25nIHZhbHVlKSB7CiAJaWYgKHZhbHVlID09IDBMKSB7CiAJCXJldHVybiBaRVJPOworCX0gZWxzZSBpZiAodmFsdWUgPT0gTG9uZy5NSU5fVkFMVUUpIHsKKwkJcmV0dXJuIE1JTl9WQUxVRTsKIAl9CiAJcmV0dXJuIG5ldyBMb25nQ29uc3RhbnQodmFsdWUpOwogfQorCiBwcml2YXRlIExvbmdDb25zdGFudChsb25nIHZhbHVlKSB7CiAJdGhpcy52YWx1ZSA9IHZhbHVlOwogfQorCiBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSB2YWx1ZTsKKwlyZXR1cm4gKGJ5dGUpIHRoaXMudmFsdWU7CiB9CisKIHB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQlyZXR1cm4gKGNoYXIpIHZhbHVlOworCXJldHVybiAoY2hhcikgdGhpcy52YWx1ZTsKIH0KKwogcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogfQorCiBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwlyZXR1cm4gdGhpcy52YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQogfQorCiBwdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiAoaW50KSB2YWx1ZTsKKwlyZXR1cm4gKGludCkgdGhpcy52YWx1ZTsKIH0KKwogcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCXJldHVybiB2YWx1ZTsgCisJcmV0dXJuIHRoaXMudmFsdWU7CiB9CisKIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiAoc2hvcnQpIHZhbHVlOworCXJldHVybiAoc2hvcnQpIHRoaXMudmFsdWU7CiB9CisKIHB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CiAJLy9zcGVjIDE1LjE3LjExCiAJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpOwogfQorCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CiAKLQlyZXR1cm4gIihsb25nKSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJAorCXJldHVybiAiKGxvbmcpIiArIHRoaXMudmFsdWUgOyAvLyROT04tTkxTLTEkCit9CisKIHB1YmxpYyBpbnQgdHlwZUlEKCkgewogCXJldHVybiBUX2xvbmc7CiB9CisKK3B1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSk7Cit9CisKK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYgKHRoaXMgPT0gb2JqKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAob2JqID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCUxvbmdDb25zdGFudCBvdGhlciA9IChMb25nQ29uc3RhbnQpIG9iajsKKwlyZXR1cm4gdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1JlZmVyZW5jZUNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1JlZmVyZW5jZUNvbnRleHQuamF2YQppbmRleCAzNTFhZTc1Li5lYzNmNzJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9SZWZlcmVuY2VDb250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvUmVmZXJlbmNlQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTksNiArOSw3IEBACiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CisKIC8qCiAgKiBJbXBsZW1lbnRvcnMgYXJlIHZhbGlkIGNvbXBpbGF0aW9uIGNvbnRleHRzIGZyb20gd2hpY2ggd2UgY2FuCiAgKiBlc2NhcGUgaW4gY2FzZSBvZiBlcnJvcjoKQEAgLTE5LDggKzIwLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwogCiBwdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZUNvbnRleHQgeworCiAJdm9pZCBhYm9ydChpbnQgYWJvcnRMZXZlbCwgQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0pOworCiAJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQoKTsKKwogCWJvb2xlYW4gaGFzRXJyb3JzKCk7CisKIAl2b2lkIHRhZ0FzSGF2aW5nRXJyb3JzKCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TaG9ydENvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TaG9ydENvbnN0YW50LmphdmEKaW5kZXggYmY1NmIxZi4uNmYxMDdhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1Nob3J0Q29uc3RhbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw0MyArMTEsNzQgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CiAKIHB1YmxpYyBjbGFzcyBTaG9ydENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewotcHJpdmF0ZSBzaG9ydCB2YWx1ZTsKKwkKKwlwcml2YXRlIHNob3J0IHZhbHVlOwogCi1wdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShzaG9ydCB2YWx1ZSkgewotCXJldHVybiBuZXcgU2hvcnRDb25zdGFudCh2YWx1ZSk7Ci19Ci1wcml2YXRlIFNob3J0Q29uc3RhbnQoc2hvcnQgdmFsdWUpIHsKLQl0aGlzLnZhbHVlID0gdmFsdWU7Ci19Ci1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSB2YWx1ZTsKLX0KLXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQlyZXR1cm4gKGNoYXIpIHZhbHVlOwotfQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiB2YWx1ZTsgLy8gaW1wbGljaXQgY2FzdCB0byByZXR1cm4gdHlwZQotfQotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gdmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKLX0KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiB2YWx1ZTsKLX0KLXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7Ci0JLy9zcGVjIDE1LjE3LjExCi0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKHNob3J0IHZhbHVlKSB7CisJCXJldHVybiBuZXcgU2hvcnRDb25zdGFudCh2YWx1ZSk7CisJfQogCi0JcmV0dXJuICIoc2hvcnQpIiArIHZhbHVlIDsgfSAvLyROT04tTkxTLTEkCi1wdWJsaWMgaW50IHR5cGVJRCgpIHsKLQlyZXR1cm4gVF9zaG9ydDsKLX0KKwlwcml2YXRlIFNob3J0Q29uc3RhbnQoc2hvcnQgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKKwkJcmV0dXJuIChieXRlKSB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwkJcmV0dXJuIChjaGFyKSB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCisJfQorCisJcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCisJfQorCisJcHVibGljIGludCBpbnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7IC8vIGltcGxpY2l0IGNhc3QgdG8gcmV0dXJuIHR5cGUKKwl9CisKKwlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOyAvLyBpbXBsaWNpdCBjYXN0IHRvIHJldHVybiB0eXBlCisJfQorCisJcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJCS8vIHNwZWMgMTUuMTcuMTEKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwkJcmV0dXJuICIoc2hvcnQpIiArIHRoaXMudmFsdWU7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgaW50IHR5cGVJRCgpIHsKKwkJcmV0dXJuIFRfc2hvcnQ7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVNob3J0Q29uc3RhbnQgb3RoZXIgPSAoU2hvcnRDb25zdGFudCkgb2JqOworCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TdHJpbmdDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU3RyaW5nQ29uc3RhbnQuamF2YQppbmRleCBiODAzMzg4Li4zN2Q0OTNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TdHJpbmdDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMzYgKzExLDU3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgU3RyaW5nQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7Ci1wcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAKIAotcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZSk7Ci19CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CiAKLXByaXZhdGUgU3RyaW5nQ29uc3RhbnQoU3RyaW5nIHZhbHVlKSB7Ci0JdGhpcy52YWx1ZSA9IHZhbHVlIDsKLX0KKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZSk7CisJfQogCi1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCS8vc3BlYyAxNS4xNy4xMQorCXByaXZhdGUgU3RyaW5nQ29uc3RhbnQoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CiAKLQkvL3RoZSBuZXh0IGxpbmUgZG8gbm90IGdvIGludG8gdGhlIHRvU3RyaW5nKCkgc2VuZC4uLi4hCi0JcmV0dXJuIHZhbHVlIDsKKwlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCQkvLyBzcGVjIDE1LjE3LjExCiAKLQkvKgotCVN0cmluZyBzID0gdmFsdWUudG9TdHJpbmcoKSA7Ci0JaWYgKHMgPT0gbnVsbCkKLQkJcmV0dXJuICJudWxsIjsKLQllbHNlCi0JCXJldHVybiBzOwotCSovCi0JCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJCS8vIHRoZSBuZXh0IGxpbmUgZG8gbm90IGdvIGludG8gdGhlIHRvU3RyaW5nKCkgc2VuZC4uLi4hCisJCXJldHVybiB0aGlzLnZhbHVlOworCQkvKgorCQkgKiBTdHJpbmcgcyA9IHZhbHVlLnRvU3RyaW5nKCkgOyBpZiAocyA9PSBudWxsKSByZXR1cm4gIm51bGwiOyBlbHNlIHJldHVybiBzOworCQkgKi8KKwl9CiAKLQlyZXR1cm4gIihTdHJpbmcpXCIiICsgdmFsdWUgKyJcIiI7IH0gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi1wdWJsaWMgaW50IHR5cGVJRCgpIHsKLQlyZXR1cm4gVF9KYXZhTGFuZ1N0cmluZzsKLX0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIihTdHJpbmcpXCIiICsgdGhpcy52YWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBpbnQgdHlwZUlEKCkgeworCQlyZXR1cm4gVF9KYXZhTGFuZ1N0cmluZzsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IHRoaXMudmFsdWUuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVN0cmluZ0NvbnN0YW50IG90aGVyID0gKFN0cmluZ0NvbnN0YW50KSBvYmo7CisJCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBvdGhlci52YWx1ZSA9PSBudWxsOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMudmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQW5ub3RhdGlvbkJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQW5ub3RhdGlvbkJpbmRpbmcuamF2YQppbmRleCA2NGJhMjZjLi42ZmU0MTQxIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Fubm90YXRpb25CaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Bbm5vdGF0aW9uQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDcgKzE0LDcgQEAKIAogLyoqCiAgKiBSZXByZXNlbnRzIEpTUiAxNzUgQW5ub3RhdGlvbiBpbnN0YW5jZXMgaW4gdGhlIHR5cGUtc3lzdGVtLgotICovIAorICovCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkJpbmRpbmcgewogCS8vIGRvIG5vdCBhY2Nlc3MgZGlyZWN0bHkgLSB1c2UgZ2V0dGVycyBpbnN0ZWFkIChVbnJlc29sdmVkQW5ub3RhdGlvbkJpbmRpbmcKIAkvLyByZXNvbHZlcyB0eXBlcyBmb3IgdHlwZSBhbmQgcGFpciBjb250ZW50cyBqdXN0IGluIHRpbWUpCkBAIC0yMyw3ICsyMyw3IEBACiAKIC8qKgogICogQWRkIHRoZSBzdGFuZGFyZCBhbm5vdGF0aW9ucyBlbmNvZGVkIGluIHRoZSB0YWcgYml0cyB0byB0aGUgcmVjb3JkZWQgYW5ub3RhdGlvbnMuCi0gKiAKKyAqCiAgKiBAcGFyYW0gcmVjb3JkZWRBbm5vdGF0aW9ucyBleGlzdGluZyBhbm5vdGF0aW9ucyBhbHJlYWR5IGNyZWF0ZWQKICAqIEBwYXJhbSBhbm5vdGF0aW9uVGFnQml0cwogICogQHBhcmFtIGVudgpAQCAtNDcsNiArNDcsMTAgQEAKIAkJY291bnQrKzsKIAlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU3VwcHJlc3NXYXJuaW5ncykgIT0gMCkKIAkJY291bnQrKzsKKwlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUG9seW1vcnBoaWNTaWduYXR1cmUpICE9IDApCisJCWNvdW50Kys7CisJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblNhZmVWYXJhcmdzKSAhPSAwKQorCQljb3VudCsrOwogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gcmVjb3JkZWRBbm5vdGF0aW9uczsKIApAQCAtNjcsMjggKzcxLDQzIEBACiAJCXJlc3VsdFtpbmRleCsrXSA9IGJ1aWxkTWFya2VyQW5ub3RhdGlvbihUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PVkVSUklERSwgZW52KTsKIAlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU3VwcHJlc3NXYXJuaW5ncykgIT0gMCkKIAkJcmVzdWx0W2luZGV4KytdID0gYnVpbGRNYXJrZXJBbm5vdGF0aW9uKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1MsIGVudik7CisJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlKSAhPSAwKQorCQlyZXN1bHRbaW5kZXgrK10gPSBidWlsZE1hcmtlckFubm90YXRpb25Gb3JNZW1iZXJUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVk9LRV9NRVRIT0RIQU5ETEVfJF9QT0xZTU9SUEhJQ1NJR05BVFVSRSwgZW52KTsKKwlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpICE9IDApCisJCXJlc3VsdFtpbmRleCsrXSA9IGJ1aWxkTWFya2VyQW5ub3RhdGlvbihUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TQUZFVkFSQVJHUywgZW52KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCitwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uQmluZGluZyBidWlsZE1hcmtlckFubm90YXRpb25Gb3JNZW1iZXJUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CisJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52LmdldFJlc29sdmVkVHlwZShjb21wb3VuZE5hbWUsIG51bGwpOworCS8vIHNpbmNlIHRoaXMgaXMgYSBtZW1iZXIgdHlwZSBuYW1lIHVzaW5nICckJyB0aGUgcmV0dXJuIGJpbmRpbmcgaXMgYQorCS8vIHByb2JsZW0gcmVmZXJlbmNlIGJpbmRpbmcgd2l0aCByZWFzb24gUHJvYmxlbVJlYXNvbnMuSW50ZXJuYWxOYW1lUHJvdmlkZWQKKwlpZiAoIXR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQl0eXBlID0gKChQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgdHlwZSkuY2xvc2VzdE1hdGNoOworCX0KKwlyZXR1cm4gZW52LmNyZWF0ZUFubm90YXRpb24odHlwZSwgQmluZGluZy5OT19FTEVNRU5UX1ZBTFVFX1BBSVJTKTsKK30KKwogcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbkJpbmRpbmcgYnVpbGRNYXJrZXJBbm5vdGF0aW9uKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CiAJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52LmdldFJlc29sdmVkVHlwZShjb21wb3VuZE5hbWUsIG51bGwpOwogCXJldHVybiBlbnYuY3JlYXRlQW5ub3RhdGlvbih0eXBlLCBCaW5kaW5nLk5PX0VMRU1FTlRfVkFMVUVfUEFJUlMpOwogfQogCiBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uQmluZGluZyBidWlsZFJldGVudGlvbkFubm90YXRpb24obG9uZyBiaXRzLCBMb29rdXBFbnZpcm9ubWVudCBlbnYpIHsKLQlSZWZlcmVuY2VCaW5kaW5nIHJldGVudGlvblBvbGljeSA9IAotCQllbnYuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OUE9MSUNZLCAKKwlSZWZlcmVuY2VCaW5kaW5nIHJldGVudGlvblBvbGljeSA9CisJCWVudi5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9SRVRFTlRJT05QT0xJQ1ksCiAJCQludWxsKTsKIAlPYmplY3QgdmFsdWUgPSBudWxsOwotCWlmICgoYml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb24pICE9IDApCisJaWYgKChiaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUnVudGltZVJldGVudGlvbikgPT0gVGFnQml0cy5Bbm5vdGF0aW9uUnVudGltZVJldGVudGlvbikgewogCQl2YWx1ZSA9IHJldGVudGlvblBvbGljeS5nZXRGaWVsZChUeXBlQ29uc3RhbnRzLlVQUEVSX1JVTlRJTUUsIHRydWUpOwotCWVsc2UgaWYgKChiaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uQ2xhc3NSZXRlbnRpb24pICE9IDApCisJfSBlbHNlIGlmICgoYml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkNsYXNzUmV0ZW50aW9uKSAhPSAwKSB7CiAJCXZhbHVlID0gcmV0ZW50aW9uUG9saWN5LmdldEZpZWxkKFR5cGVDb25zdGFudHMuVVBQRVJfQ0xBU1MsIHRydWUpOwotCWVsc2UgaWYgKChiaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU291cmNlUmV0ZW50aW9uKSAhPSAwKQorCX0gZWxzZSBpZiAoKGJpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Tb3VyY2VSZXRlbnRpb24pICE9IDApIHsKIAkJdmFsdWUgPSByZXRlbnRpb25Qb2xpY3kuZ2V0RmllbGQoVHlwZUNvbnN0YW50cy5VUFBFUl9TT1VSQ0UsIHRydWUpOworCX0KIAlyZXR1cm4gZW52LmNyZWF0ZUFubm90YXRpb24oCiAJCWVudi5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9SRVRFTlRJT04sIG51bGwpLAotCQluZXcgRWxlbWVudFZhbHVlUGFpcltdIHsgCisJCW5ldyBFbGVtZW50VmFsdWVQYWlyW10gewogCQkJbmV3IEVsZW1lbnRWYWx1ZVBhaXIoVHlwZUNvbnN0YW50cy5WQUxVRSwgdmFsdWUsIG51bGwpCiAJCX0pOwogfQpAQCAtMTUyLDYgKzE3MSwyMSBAQAogCXRoaXMoKFJlZmVyZW5jZUJpbmRpbmcpIGFzdEFubm90YXRpb24ucmVzb2x2ZWRUeXBlLCBhc3RBbm5vdGF0aW9uLmNvbXB1dGVFbGVtZW50VmFsdWVQYWlycygpKTsKIH0KIAorLyoKKyAqIENvbXB1dGVzIGEga2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGJpbmRpbmcsIHVzaW5nIHRoZSBnaXZlbiByZWNpcGllbnQncyB1bmlxdWUga2V5LgorICogcmVjaXBpZW50S2V5IEAgdHlwZUtleQorICogQE15QW5ub3Qgdm9pZCBiYXIoKSAtLT4gTHAvWDsuYmFyKClWQExwL015QW5ub3Q7CisgKi8KK3B1YmxpYyBjaGFyW10gY29tcHV0ZVVuaXF1ZUtleShjaGFyW10gcmVjaXBpZW50S2V5KSB7CisJY2hhcltdIHR5cGVLZXkgPSB0aGlzLnR5cGUuY29tcHV0ZVVuaXF1ZUtleShmYWxzZSk7CisJaW50IHJlY2lwaWVudEtleUxlbmd0aCA9IHJlY2lwaWVudEtleS5sZW5ndGg7CisJY2hhcltdIHVuaXF1ZUtleSA9IG5ldyBjaGFyW3JlY2lwaWVudEtleUxlbmd0aCsxK3R5cGVLZXkubGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KHJlY2lwaWVudEtleSwgMCwgdW5pcXVlS2V5LCAwLCByZWNpcGllbnRLZXlMZW5ndGgpOworCXVuaXF1ZUtleVtyZWNpcGllbnRLZXlMZW5ndGhdID0gJ0AnOworCVN5c3RlbS5hcnJheWNvcHkodHlwZUtleSwgMCwgdW5pcXVlS2V5LCByZWNpcGllbnRLZXlMZW5ndGgrMSwgdHlwZUtleS5sZW5ndGgpOworCXJldHVybiB1bmlxdWVLZXk7Cit9CisKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldEFubm90YXRpb25UeXBlKCkgewogCXJldHVybiB0aGlzLnR5cGU7CiB9CkBAIC0xNzAsNCArMjA0LDE4IEBACiAJCQlwYWlyLnNldE1ldGhvZEJpbmRpbmcobWV0aG9kc1swXSk7CiAJfQogfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDUpOworCWJ1ZmZlci5hcHBlbmQoJ0AnKS5hcHBlbmQodGhpcy50eXBlLnNvdXJjZU5hbWUpOworCWlmICh0aGlzLnBhaXJzICE9IG51bGwgJiYgdGhpcy5wYWlycy5sZW5ndGggPiAwKSB7CisJCWJ1ZmZlci5hcHBlbmQoInsgIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucGFpcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChpID4gMCkgYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnBhaXJzW2ldKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCd9Jyk7CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQW5ub3RhdGlvbkhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Bbm5vdGF0aW9uSG9sZGVyLmphdmEKaW5kZXggMDU5MzNlMy4uNTZmOGQ5NiAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Bbm5vdGF0aW9uSG9sZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Bbm5vdGF0aW9uSG9sZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNyArMTMsNyBAQAogcHVibGljIGNsYXNzIEFubm90YXRpb25Ib2xkZXIgewogCUFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbnM7CiAKLXN0YXRpYyBBbm5vdGF0aW9uSG9sZGVyIHN0b3JlQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9ucywgQW5ub3RhdGlvbkJpbmRpbmdbXVtdIHBhcmFtZXRlckFubm90YXRpb25zLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CitzdGF0aWMgQW5ub3RhdGlvbkhvbGRlciBzdG9yZUFubm90YXRpb25zKEFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbnMsIEFubm90YXRpb25CaW5kaW5nW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgTG9va3VwRW52aXJvbm1lbnQgb3B0aW9uYWxFbnYpIHsKIAlpZiAocGFyYW1ldGVyQW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQlib29sZWFuIGlzRW1wdHkgPSB0cnVlOwogCQlmb3IgKGludCBpID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMubGVuZ3RoOyBpc0VtcHR5ICYmIC0taSA+PSAwOykKQEAgLTI0LDcgKzI0LDcgQEAKIAl9CiAKIAlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCi0JCXJldHVybiBuZXcgQW5ub3RhdGlvbk1ldGhvZEhvbGRlcihhbm5vdGF0aW9ucywgcGFyYW1ldGVyQW5ub3RhdGlvbnMsIGRlZmF1bHRWYWx1ZSk7CisJCXJldHVybiBuZXcgQW5ub3RhdGlvbk1ldGhvZEhvbGRlcihhbm5vdGF0aW9ucywgcGFyYW1ldGVyQW5ub3RhdGlvbnMsIGRlZmF1bHRWYWx1ZSwgb3B0aW9uYWxFbnYpOwogCWlmIChwYXJhbWV0ZXJBbm5vdGF0aW9ucyAhPSBudWxsKQogCQlyZXR1cm4gbmV3IE1ldGhvZEhvbGRlcihhbm5vdGF0aW9ucywgcGFyYW1ldGVyQW5ub3RhdGlvbnMpOwogCXJldHVybiBuZXcgQW5ub3RhdGlvbkhvbGRlcigpLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKQEAgLTczLDEyICs3MywxOSBAQAogCiBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbk1ldGhvZEhvbGRlciBleHRlbmRzIE1ldGhvZEhvbGRlciB7CiAJT2JqZWN0IGRlZmF1bHRWYWx1ZTsKKwlMb29rdXBFbnZpcm9ubWVudCBlbnY7CiAKLUFubm90YXRpb25NZXRob2RIb2xkZXIoQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9ucywgQW5ub3RhdGlvbkJpbmRpbmdbXVtdIHBhcmFtZXRlckFubm90YXRpb25zLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CitBbm5vdGF0aW9uTWV0aG9kSG9sZGVyKEFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbnMsIEFubm90YXRpb25CaW5kaW5nW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgTG9va3VwRW52aXJvbm1lbnQgb3B0aW9uYWxFbnYpIHsKIAlzdXBlcihhbm5vdGF0aW9ucywgcGFyYW1ldGVyQW5ub3RhdGlvbnMpOwogCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworCXRoaXMuZW52ID0gb3B0aW9uYWxFbnY7CiB9CiBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCkgeworCWlmICh0aGlzLmRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB7CisJCWlmICh0aGlzLmVudiA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9ICgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuZGVmYXVsdFZhbHVlKS5yZXNvbHZlKHRoaXMuZW52LCBmYWxzZSk7CisJfQogCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0FycmF5QmluZGluZy5qYXZhCmluZGV4IDIyM2UwOTEuLjZiYmJjOTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9BcnJheUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw2ICsxMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwpAQCAtMjEsMTAgKzIzLDEwIEBACiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgbGVhZkNvbXBvbmVudFR5cGU7CiAJcHVibGljIGludCBkaW1lbnNpb25zOwotCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OwkKKwlMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKIAljaGFyW10gY29uc3RhbnRQb29sTmFtZTsKIAljaGFyW10gZ2VuZXJpY1R5cGVTaWduYXR1cmU7Ci0JCisKIHB1YmxpYyBBcnJheUJpbmRpbmcoVHlwZUJpbmRpbmcgdHlwZSwgaW50IGRpbWVuc2lvbnMsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNBcnJheVR5cGU7CiAJdGhpcy5sZWFmQ29tcG9uZW50VHlwZSA9IHR5cGU7CkBAIC0zMyw3ICszNSwyOCBAQAogCWlmICh0eXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCiAJCSgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIHR5cGUpLmFkZFdyYXBwZXIodGhpcywgZW52aXJvbm1lbnQpOwogCWVsc2UKLSAgICAJdGhpcy50YWdCaXRzIHw9IHR5cGUudGFnQml0cyAmIChUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSB8IFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpOworCQl0aGlzLnRhZ0JpdHMgfD0gdHlwZS50YWdCaXRzICYgKFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlIHwgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCB8IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUgfCBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpOworfQorCitwdWJsaWMgVHlwZUJpbmRpbmcgY2xvc2VzdE1hdGNoKCkgeworCWlmIChpc1ZhbGlkQmluZGluZygpKSB7CisJCXJldHVybiB0aGlzOworCX0KKwlUeXBlQmluZGluZyBsZWFmQ2xvc2VzdE1hdGNoID0gdGhpcy5sZWFmQ29tcG9uZW50VHlwZS5jbG9zZXN0TWF0Y2goKTsKKwlpZiAobGVhZkNsb3Nlc3RNYXRjaCA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVBcnJheVR5cGUodGhpcy5sZWFmQ29tcG9uZW50VHlwZS5jbG9zZXN0TWF0Y2goKSwgdGhpcy5kaW1lbnNpb25zKTsKK30KKworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjY29sbGVjdE1pc3NpbmdUeXBlcyhqYXZhLnV0aWwuTGlzdCkKKyAqLworcHVibGljIExpc3QgY29sbGVjdE1pc3NpbmdUeXBlcyhMaXN0IG1pc3NpbmdUeXBlcykgeworCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQltaXNzaW5nVHlwZXMgPSB0aGlzLmxlYWZDb21wb25lbnRUeXBlLmNvbGxlY3RNaXNzaW5nVHlwZXMobWlzc2luZ1R5cGVzKTsKKwl9CisJcmV0dXJuIG1pc3NpbmdUeXBlczsKIH0KIAogLyoqCkBAIC00NSwxMCArNjgsMTAgQEAKICAqICAgQSA+PiBGICAgY29ycmVzcG9uZHMgdG86ICAgRi5jb2xsZWN0U3Vic3RpdHV0ZXMoLi4uLCBBLCAuLi4sIENPTlNUUkFJTlRfU1VQRVIgKDIpKQogKi8KIHB1YmxpYyB2b2lkIGNvbGxlY3RTdWJzdGl0dXRlcyhTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgYWN0dWFsVHlwZSwgSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0LCBpbnQgY29uc3RyYWludCkgewotCQorCiAJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgPT0gMCkgcmV0dXJuOwogCWlmIChhY3R1YWxUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpIHJldHVybjsKLQkKKwogCXN3aXRjaChhY3R1YWxUeXBlLmtpbmQoKSkgewogCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CiAJICAgICAgICBpbnQgYWN0dWFsRGltID0gYWN0dWFsVHlwZS5kaW1lbnNpb25zKCk7CkBAIC03MSwyOSArOTQsMjkgQEAKICAqIHAuWFtdW10gLS0+IFtbTHAvWDsKICAqLwogcHVibGljIGNoYXJbXSBjb21wdXRlVW5pcXVlS2V5KGJvb2xlYW4gaXNMZWFmKSB7Ci0JY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbZGltZW5zaW9uc107Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgLSAxOyBpID49IDA7IGktLSkgYnJhY2tldHNbaV0gPSAnWyc7CisJY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbdGhpcy5kaW1lbnNpb25zXTsKKwlmb3IgKGludCBpID0gdGhpcy5kaW1lbnNpb25zIC0gMTsgaSA+PSAwOyBpLS0pIGJyYWNrZXRzW2ldID0gJ1snOwogCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChicmFja2V0cywgdGhpcy5sZWFmQ29tcG9uZW50VHlwZS5jb21wdXRlVW5pcXVlS2V5KGlzTGVhZikpOwogIH0KLQkKKwogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgogICogTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCiAgKiBlLmcuICdbTGphdmEvbGFuZy9PYmplY3Q7JwogICovCiBwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSB7Ci0JaWYgKGNvbnN0YW50UG9vbE5hbWUgIT0gbnVsbCkKLQkJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWU7CisJaWYgKHRoaXMuY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2xOYW1lOwogCi0JY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbZGltZW5zaW9uc107Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgLSAxOyBpID49IDA7IGktLSkgYnJhY2tldHNbaV0gPSAnWyc7Ci0JcmV0dXJuIGNvbnN0YW50UG9vbE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChicmFja2V0cywgbGVhZkNvbXBvbmVudFR5cGUuc2lnbmF0dXJlKCkpOworCWNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW3RoaXMuZGltZW5zaW9uc107CisJZm9yIChpbnQgaSA9IHRoaXMuZGltZW5zaW9ucyAtIDE7IGkgPj0gMDsgaS0tKSBicmFja2V0c1tpXSA9ICdbJzsKKwlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2xOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoYnJhY2tldHMsIHRoaXMubGVhZkNvbXBvbmVudFR5cGUuc2lnbmF0dXJlKCkpOwogfQogcHVibGljIFN0cmluZyBkZWJ1Z05hbWUoKSB7Ci0JU3RyaW5nQnVmZmVyIGJyYWNrZXRzID0gbmV3IFN0cmluZ0J1ZmZlcihkaW1lbnNpb25zICogMik7Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnM7IC0taSA+PSAwOykKKwlTdHJpbmdCdWZmZXIgYnJhY2tldHMgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZGltZW5zaW9ucyAqIDIpOworCWZvciAoaW50IGkgPSB0aGlzLmRpbWVuc2lvbnM7IC0taSA+PSAwOykKIAkJYnJhY2tldHMuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLmRlYnVnTmFtZSgpICsgYnJhY2tldHMudG9TdHJpbmcoKTsKKwlyZXR1cm4gdGhpcy5sZWFmQ29tcG9uZW50VHlwZS5kZWJ1Z05hbWUoKSArIGJyYWNrZXRzLnRvU3RyaW5nKCk7CiB9CiBwdWJsaWMgaW50IGRpbWVuc2lvbnMoKSB7CiAJcmV0dXJuIHRoaXMuZGltZW5zaW9uczsKQEAgLTEyMiwxNyArMTQ1LDE3IEBACiB9CiAKIHB1YmxpYyBjaGFyW10gZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSB7Ci0JCisKICAgICBpZiAodGhpcy5nZW5lcmljVHlwZVNpZ25hdHVyZSA9PSBudWxsKSB7Ci0JCWNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW2RpbWVuc2lvbnNdOwotCQlmb3IgKGludCBpID0gZGltZW5zaW9ucyAtIDE7IGkgPj0gMDsgaS0tKSBicmFja2V0c1tpXSA9ICdbJzsKLQkJdGhpcy5nZW5lcmljVHlwZVNpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGJyYWNrZXRzLCBsZWFmQ29tcG9uZW50VHlwZS5nZW5lcmljVHlwZVNpZ25hdHVyZSgpKTsKKwkJY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbdGhpcy5kaW1lbnNpb25zXTsKKwkJZm9yIChpbnQgaSA9IHRoaXMuZGltZW5zaW9ucyAtIDE7IGkgPj0gMDsgaS0tKSBicmFja2V0c1tpXSA9ICdbJzsKKwkJdGhpcy5nZW5lcmljVHlwZVNpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGJyYWNrZXRzLCB0aGlzLmxlYWZDb21wb25lbnRUeXBlLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOwogICAgIH0KICAgICByZXR1cm4gdGhpcy5nZW5lcmljVHlwZVNpZ25hdHVyZTsKIH0KIAogcHVibGljIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoKSB7Ci0JcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLmdldFBhY2thZ2UoKTsKKwlyZXR1cm4gdGhpcy5sZWFmQ29tcG9uZW50VHlwZS5nZXRQYWNrYWdlKCk7CiB9CiAKIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CkBAIC0xNTAsMjQgKzE3MywyNSBAQAogCQkJQXJyYXlCaW5kaW5nIG90aGVyQXJyYXkgPSAoQXJyYXlCaW5kaW5nKSBvdGhlclR5cGU7CiAJCQlpZiAob3RoZXJBcnJheS5sZWFmQ29tcG9uZW50VHlwZS5pc0Jhc2VUeXBlKCkpCiAJCQkJcmV0dXJuIGZhbHNlOyAvLyByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgYWxsIGVxdWFsIGFycmF5cyBhcmUgaWRlbnRpY2FsCi0JCQlpZiAoZGltZW5zaW9ucyA9PSBvdGhlckFycmF5LmRpbWVuc2lvbnMpCi0JCQkJcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgob3RoZXJBcnJheS5sZWFmQ29tcG9uZW50VHlwZSk7Ci0JCQlpZiAoZGltZW5zaW9ucyA8IG90aGVyQXJyYXkuZGltZW5zaW9ucykKKwkJCWlmICh0aGlzLmRpbWVuc2lvbnMgPT0gb3RoZXJBcnJheS5kaW1lbnNpb25zKQorCQkJCXJldHVybiB0aGlzLmxlYWZDb21wb25lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgob3RoZXJBcnJheS5sZWFmQ29tcG9uZW50VHlwZSk7CisJCQlpZiAodGhpcy5kaW1lbnNpb25zIDwgb3RoZXJBcnJheS5kaW1lbnNpb25zKQogCQkJCXJldHVybiBmYWxzZTsgLy8gY2Fubm90IGFzc2lnbiAnU3RyaW5nW10nIGludG8gJ09iamVjdFtdW10nIGJ1dCBjYW4gYXNzaWduICdieXRlW11bXScgaW50byAnT2JqZWN0W10nCiAJCQlicmVhazsKIAkJY2FzZSBCaW5kaW5nLkJBU0VfVFlQRSA6CiAJCQlyZXR1cm4gZmFsc2U7CiAJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKIAkJICAgIHJldHVybiAoKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlKS5ib3VuZENoZWNrKHRoaXMpOwotCQkgICAgCisKIAkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKIAkJCS8vIGNoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBjYXB0dXJlIG9mID8gc3VwZXIgWAogCQkJaWYgKG90aGVyVHlwZS5pc0NhcHR1cmUoKSkgewogCQkJCUNhcHR1cmVCaW5kaW5nIG90aGVyQ2FwdHVyZSA9IChDYXB0dXJlQmluZGluZykgb3RoZXJUeXBlOwogCQkJCVR5cGVCaW5kaW5nIG90aGVyTG93ZXJCb3VuZDsKIAkJCQlpZiAoKG90aGVyTG93ZXJCb3VuZCA9IG90aGVyQ2FwdHVyZS5sb3dlckJvdW5kKSAhPSBudWxsKSB7Ci0JCQkJCWlmICghb3RoZXJMb3dlckJvdW5kLmlzQXJyYXlUeXBlKCkpIHJldHVybiBmYWxzZTsJCQkJCQotCQkJCQlyZXR1cm4gdGhpcy5pc0NvbXBhdGlibGVXaXRoKG90aGVyTG93ZXJCb3VuZCk7CisJCQkJCWlmICghb3RoZXJMb3dlckJvdW5kLmlzQXJyYXlUeXBlKCkpIHJldHVybiBmYWxzZTsKKwkJCQkJcmV0dXJuIGlzQ29tcGF0aWJsZVdpdGgob3RoZXJMb3dlckJvdW5kKTsKIAkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0xODksNyArMjEzLDcgQEAKIH0KIAogcHVibGljIFR5cGVCaW5kaW5nIGxlYWZDb21wb25lbnRUeXBlKCl7Ci0JcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlOworCXJldHVybiB0aGlzLmxlYWZDb21wb25lbnRUeXBlOwogfQogCiAvKiBBUEkKQEAgLTE5Nyw3ICsyMjEsNyBAQAogKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCiAqLwogcHVibGljIGludCBwcm9ibGVtSWQoKSB7Ci0JcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLnByb2JsZW1JZCgpOworCXJldHVybiB0aGlzLmxlYWZDb21wb25lbnRUeXBlLnByb2JsZW1JZCgpOwogfQogLyoqCiAqIEFuc3dlciB0aGUgc291cmNlIG5hbWUgZm9yIHRoZSB0eXBlLgpAQCAtMjA2LDQ0ICsyMzAsNDQgQEAKICovCiAKIHB1YmxpYyBjaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSgpIHsKLQljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhclt0aGlzLmRpbWVuc2lvbnMgKiAyXTsKKwlmb3IgKGludCBpID0gdGhpcy5kaW1lbnNpb25zICogMiAtIDE7IGkgPj0gMDsgaSAtPSAyKSB7CiAJCWJyYWNrZXRzW2ldID0gJ10nOwogCQlicmFja2V0c1tpIC0gMV0gPSAnWyc7CiAJfQotCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChsZWFmQ29tcG9uZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksIGJyYWNrZXRzKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5sZWFmQ29tcG9uZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksIGJyYWNrZXRzKTsKIH0KIHB1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgLyogamF2YS5sYW5nLk9iamVjdFtdICovIHsKLQljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhclt0aGlzLmRpbWVuc2lvbnMgKiAyXTsKKwlmb3IgKGludCBpID0gdGhpcy5kaW1lbnNpb25zICogMiAtIDE7IGkgPj0gMDsgaSAtPSAyKSB7CiAJCWJyYWNrZXRzW2ldID0gJ10nOwogCQlicmFja2V0c1tpIC0gMV0gPSAnWyc7CiAJfQotCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChsZWFmQ29tcG9uZW50VHlwZS5yZWFkYWJsZU5hbWUoKSwgYnJhY2tldHMpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLmxlYWZDb21wb25lbnRUeXBlLnJlYWRhYmxlTmFtZSgpLCBicmFja2V0cyk7CiB9CiBwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCl7Ci0JY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbZGltZW5zaW9ucyAqIDJdOwotCWZvciAoaW50IGkgPSBkaW1lbnNpb25zICogMiAtIDE7IGkgPj0gMDsgaSAtPSAyKSB7CisJY2hhcltdIGJyYWNrZXRzID0gbmV3IGNoYXJbdGhpcy5kaW1lbnNpb25zICogMl07CisJZm9yIChpbnQgaSA9IHRoaXMuZGltZW5zaW9ucyAqIDIgLSAxOyBpID49IDA7IGkgLT0gMikgewogCQlicmFja2V0c1tpXSA9ICddJzsKIAkJYnJhY2tldHNbaSAtIDFdID0gJ1snOwogCX0KLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQobGVhZkNvbXBvbmVudFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSwgYnJhY2tldHMpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLmxlYWZDb21wb25lbnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCksIGJyYWNrZXRzKTsKIH0KIHB1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKLQljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07Ci0JZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhclt0aGlzLmRpbWVuc2lvbnMgKiAyXTsKKwlmb3IgKGludCBpID0gdGhpcy5kaW1lbnNpb25zICogMiAtIDE7IGkgPj0gMDsgaSAtPSAyKSB7CiAJCWJyYWNrZXRzW2ldID0gJ10nOwogCQlicmFja2V0c1tpIC0gMV0gPSAnWyc7CiAJfQotCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChsZWFmQ29tcG9uZW50VHlwZS5zb3VyY2VOYW1lKCksIGJyYWNrZXRzKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5sZWFmQ29tcG9uZW50VHlwZS5zb3VyY2VOYW1lKCksIGJyYWNrZXRzKTsKIH0KIHB1YmxpYyB2b2lkIHN3YXBVbnJlc29sdmVkKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nIHVucmVzb2x2ZWRUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmVkVHlwZSwgTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CiAJaWYgKHRoaXMubGVhZkNvbXBvbmVudFR5cGUgPT0gdW5yZXNvbHZlZFR5cGUpIHsKIAkJdGhpcy5sZWFmQ29tcG9uZW50VHlwZSA9IGVudi5jb252ZXJ0VW5yZXNvbHZlZEJpbmFyeVRvUmF3VHlwZShyZXNvbHZlZFR5cGUpOwotCQl0aGlzLnRhZ0JpdHMgfD0gdGhpcy5sZWFmQ29tcG9uZW50VHlwZS50YWdCaXRzICYgKFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlIHwgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCk7CisJCXRoaXMudGFnQml0cyB8PSB0aGlzLmxlYWZDb21wb25lbnRUeXBlLnRhZ0JpdHMgJiAoVGFnQml0cy5IYXNUeXBlVmFyaWFibGUgfCBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkIHwgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSk7CiAJfQogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gbGVhZkNvbXBvbmVudFR5cGUgIT0gbnVsbCA/IGRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSBBUlJBWSI7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gdGhpcy5sZWFmQ29tcG9uZW50VHlwZSAhPSBudWxsID8gZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIEFSUkFZIjsgLy8kTk9OLU5MUy0xJAogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVCaW5kaW5nLmphdmEKaW5kZXggNzI5NzYxOC4uNDBjOTA3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDEzICsxMCwxMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOworCiBwdWJsaWMgZmluYWwgY2xhc3MgQmFzZVR5cGVCaW5kaW5nIGV4dGVuZHMgVHlwZUJpbmRpbmcgewogCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDT05WRVJTSU9OUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJREVOVElUWSA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lERU5JTkcgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BUlJPV0lORyA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTlZFUlNJT05TID0gMTYqMTY7IC8vIHdlbGwta25vd24geCB3ZWxsLWtub3duCisJCisJc3RhdGljIHsKKwkJQ09OVkVSU0lPTlMJID0gaW5pdGlhbGl6ZUNvbnZlcnNpb25zKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gaW5pdGlhbGl6ZUNvbnZlcnNpb25zKCl7CisJCS8vIGZyb21UeXBlICAgZGVzdFR5cGUgLS0+IGNvbnZlcnNpb24KKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIAkJCQkwMDAwCisKKwkJaW50W10gdGFibGUgID0gbmV3IGludFtNQVhfQ09OVkVSU0lPTlNdOworCQkKKwkJdGFibGVbVHlwZUlkcy5Cb29sZWFuMkJvb2xlYW5dID0gSURFTlRJVFk7CisKKwkJdGFibGVbVHlwZUlkcy5CeXRlMkJ5dGVdIAkJPSBJREVOVElUWTsKKwkJdGFibGVbVHlwZUlkcy5CeXRlMlNob3J0XSAJCT0gV0lERU5JTkc7CisJCXRhYmxlW1R5cGVJZHMuQnl0ZTJDaGFyXSAJCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLkJ5dGUySW50XSAJCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkJ5dGUyTG9uZ10gCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkJ5dGUyRmxvYXRdIAkJPSBXSURFTklORzsKKwkJdGFibGVbVHlwZUlkcy5CeXRlMkRvdWJsZV0gCT0gV0lERU5JTkc7CisKKwkJdGFibGVbVHlwZUlkcy5TaG9ydDJCeXRlXSAJCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLlNob3J0MlNob3J0XSAJCT0gSURFTlRJVFk7CisJCXRhYmxlW1R5cGVJZHMuU2hvcnQyQ2hhcl0gCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5TaG9ydDJJbnRdIAkJCT0gV0lERU5JTkc7CisJCXRhYmxlW1R5cGVJZHMuU2hvcnQyTG9uZ10gCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLlNob3J0MkZsb2F0XQkgCT0gV0lERU5JTkc7CisJCXRhYmxlW1R5cGVJZHMuU2hvcnQyRG91YmxlXSAJPSBXSURFTklORzsKKworCQl0YWJsZVtUeXBlSWRzLkNoYXIyQnl0ZV0gCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5DaGFyMlNob3J0XSAJCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLkNoYXIyQ2hhcl0gCQk9IElERU5USVRZOworCQl0YWJsZVtUeXBlSWRzLkNoYXIySW50XSAJCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkNoYXIyTG9uZ10gCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkNoYXIyRmxvYXRdIAkJPSBXSURFTklORzsKKwkJdGFibGVbVHlwZUlkcy5DaGFyMkRvdWJsZV0gCT0gV0lERU5JTkc7CisKKwkJdGFibGVbVHlwZUlkcy5JbnQyQnl0ZV0gCQkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuSW50MlNob3J0XSAJCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5JbnQyQ2hhcl0gCQkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuSW50MkludF0gCQkJCT0gSURFTlRJVFk7CisJCXRhYmxlW1R5cGVJZHMuSW50MkxvbmddIAkJCT0gV0lERU5JTkc7CisJCXRhYmxlW1R5cGVJZHMuSW50MkZsb2F0XSAJCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkludDJEb3VibGVdIAkJPSBXSURFTklORzsKKworCQl0YWJsZVtUeXBlSWRzLkxvbmcyQnl0ZV0gCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Mb25nMlNob3J0XSAJCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLkxvbmcyQ2hhcl0gCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Mb25nMkludF0gCQkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuTG9uZzJMb25nXSAJCT0gSURFTlRJVFk7CisJCXRhYmxlW1R5cGVJZHMuTG9uZzJGbG9hdF0gCQk9IFdJREVOSU5HOworCQl0YWJsZVtUeXBlSWRzLkxvbmcyRG91YmxlXSAJPSBXSURFTklORzsKKworCQl0YWJsZVtUeXBlSWRzLkZsb2F0MkJ5dGVdIAkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuRmxvYXQyU2hvcnRdIAkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuRmxvYXQyQ2hhcl0gCQk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5GbG9hdDJJbnRdIAkJCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLkZsb2F0MkxvbmddIAkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuRmxvYXQyRmxvYXRdIAkJPSBJREVOVElUWTsKKwkJdGFibGVbVHlwZUlkcy5GbG9hdDJEb3VibGVdIAk9IFdJREVOSU5HOworCisJCXRhYmxlW1R5cGVJZHMuRG91YmxlMkJ5dGVdIAk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Eb3VibGUyU2hvcnRdIAk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Eb3VibGUyQ2hhcl0gCT0gTkFSUk9XSU5HOworCQl0YWJsZVtUeXBlSWRzLkRvdWJsZTJJbnRdIAkJPSBOQVJST1dJTkc7CisJCXRhYmxlW1R5cGVJZHMuRG91YmxlMkxvbmddIAk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Eb3VibGUyRmxvYXRdIAk9IE5BUlJPV0lORzsKKwkJdGFibGVbVHlwZUlkcy5Eb3VibGUyRG91YmxlXT0gSURFTlRJVFk7CisJCQorCQlyZXR1cm4gdGFibGU7CisJfQorCS8qKgorCSAqIFByZWRpY2F0ZSB0ZWxsaW5nIHdoZXRoZXIgImxlZnQiIGNhbiBzdG9yZSBhICJyaWdodCIgdXNpbmcgc29tZSBuYXJyb3dpbmcgY29udmVyc2lvbgorCSAqKGlzIGxlZnQgc21hbGxlciB0aGFuIHJpZ2h0KQorCSAqIEBwYXJhbSBsZWZ0IC0gdGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG8KKwkgKiBAcGFyYW0gcmlnaHQgLSB0aGUgYWN0dWFsIHR5cGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgbGVnYWwgbmFycm93aW5nIGNvbnZlcnNpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNOYXJyb3dpbmcoaW50IGxlZnQsIGludCByaWdodCkgeworCQlpbnQgcmlnaHQybGVmdCA9IHJpZ2h0ICsgKGxlZnQ8PDQpOworCQlyZXR1cm4gcmlnaHQybGVmdCA+PSAwIAorCQkJCQkJJiYgcmlnaHQybGVmdCA8IE1BWF9DT05WRVJTSU9OUyAKKwkJCQkJCSYmIChDT05WRVJTSU9OU1tyaWdodDJsZWZ0XSAmIChJREVOVElUWXxOQVJST1dJTkcpKSAhPSAwOworCX0KKworCS8qKgorCSAqIFByZWRpY2F0ZSB0ZWxsaW5nIHdoZXRoZXIgImxlZnQiIGNhbiBzdG9yZSBhICJyaWdodCIgdXNpbmcgc29tZSB3aWRlbmluZyBjb252ZXJzaW9uCisJICooaXMgbGVmdCBiaWdnZXIgdGhhbiByaWdodCkKKwkgKiBAcGFyYW0gbGVmdCAtIHRoZSB0YXJnZXQgdHlwZSB0byBjb252ZXJ0IHRvCisJICogQHBhcmFtIHJpZ2h0IC0gdGhlIGFjdHVhbCB0eXBlCisJICogQHJldHVybiB0cnVlIGlmIGxlZ2FsIHdpZGVuaW5nIGNvbnZlcnNpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaWRlbmluZyhpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisJCWludCByaWdodDJsZWZ0ID0gcmlnaHQgKyAobGVmdDw8NCk7CisJCXJldHVybiByaWdodDJsZWZ0ID49IDAgCisJCQkJCQkmJiByaWdodDJsZWZ0IDwgTUFYX0NPTlZFUlNJT05TIAorCQkJCQkJJiYgKENPTlZFUlNJT05TW3JpZ2h0MmxlZnRdICYgKElERU5USVRZfFdJREVOSU5HKSkgIT0gMDsKKwl9CisJCiAJcHVibGljIGNoYXJbXSBzaW1wbGVOYW1lOworCiAJcHJpdmF0ZSBjaGFyW10gY29uc3RhbnRQb29sTmFtZTsKIAogCUJhc2VUeXBlQmluZGluZyhpbnQgaWQsIGNoYXJbXSBuYW1lLCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSkgewotCiAJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLklzQmFzZVR5cGU7CiAJCXRoaXMuaWQgPSBpZDsKIAkJdGhpcy5zaW1wbGVOYW1lID0gbmFtZTsKQEAgLTI5LDExMyArMTM1LDMyIEBACiAJcHVibGljIGNoYXJbXSBjb21wdXRlVW5pcXVlS2V5KGJvb2xlYW4gaXNMZWFmKSB7CiAJCXJldHVybiBjb25zdGFudFBvb2xOYW1lKCk7CiAJfQotCQorCiAJLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGNvbnN0YW50IHBvb2wgbmFtZS4KIAkqLwogCXB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIHsKIAotCQlyZXR1cm4gY29uc3RhbnRQb29sTmFtZTsKKwkJcmV0dXJuIHRoaXMuY29uc3RhbnRQb29sTmFtZTsKIAl9CiAKIAlwdWJsaWMgUGFja2FnZUJpbmRpbmcgZ2V0UGFja2FnZSgpIHsKIAogCQlyZXR1cm4gbnVsbDsKIAl9Ci0KKwkKIAkvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgKHJpZ2h0KQogCSovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZyByaWdodCkgewotCi0JCWlmICh0aGlzID09IHJpZ2h0KQorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGgoVHlwZUJpbmRpbmcgbGVmdCkgeworCQlpZiAodGhpcyA9PSBsZWZ0KQogCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghcmlnaHQuaXNCYXNlVHlwZSgpKQotCQkJcmV0dXJuIHRoaXMgPT0gVHlwZUJpbmRpbmcuTlVMTDsKLQotCQlzd2l0Y2ggKHJpZ2h0LmlkKSB7Ci0JCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKLQkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLQkJCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9jaGFyIDoKLQkJCQkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9pbnQgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCQkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKLQkJCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9jaGFyIDoKLQkJCQkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9pbnQgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9jaGFyIDoKLQkJCQkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgotCQkJCQljYXNlIFR5cGVJZHMuVF9pbnQgOgotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCWNhc2UgVHlwZUlkcy5UX2ludCA6Ci0JCQkJc3dpdGNoIChpZCkgewotCQkJCQljYXNlIFR5cGVJZHMuVF9ieXRlIDoKLQkJCQkJY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0JCQkJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQljYXNlIFR5cGVJZHMuVF9zaG9ydCA6Ci0JCQkJcmV0dXJuIChpZCA9PSBUeXBlSWRzLlRfYnl0ZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOworCQlpbnQgcmlnaHQybGVmdCA9IHRoaXMuaWQgKyAobGVmdC5pZDw8NCk7CisJCWlmIChyaWdodDJsZWZ0ID49IDAgCisJCQkJJiYgcmlnaHQybGVmdCA8IE1BWF9DT05WRVJTSU9OUyAKKwkJCQkmJiAoQ09OVkVSU0lPTlNbcmlnaHQybGVmdF0gJiAoSURFTlRJVFl8V0lERU5JTkcpKSAhPSAwKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiB0aGlzID09IFR5cGVCaW5kaW5nLk5VTEwgJiYgIWxlZnQuaXNCYXNlVHlwZSgpOwogCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc05hcnJvd2luZyhpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0KLQkJLy9jYW4gImxlZnQiIHN0b3JlIGEgInJpZ2h0IiB1c2luZyBzb21lIG5hcnJvd2luZyBjb252ZXJzaW9uCi0JCS8vKGlzIGxlZnQgc21hbGxlciB0aGFuIHJpZ2h0KQotCQlzd2l0Y2ggKGxlZnQpIHsKLQkJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgotCQkJCXJldHVybiByaWdodCA9PSBUeXBlSWRzLlRfYm9vbGVhbjsKLQkJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgotCQkJY2FzZSBUeXBlSWRzLlRfYnl0ZSA6Ci0JCQkJaWYgKHJpZ2h0ID09IFR5cGVJZHMuVF9ieXRlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX3Nob3J0KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2NoYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBUeXBlSWRzLlRfaW50IDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2ludCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2xvbmcpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgotCQkJCWlmIChyaWdodCA9PSBUeXBlSWRzLlRfZmxvYXQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2RvdWJsZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9CisJCiAJLyoqCiAJICogVF9udWxsIGlzIGFjdGluZyBhcyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2lzVW5jaGVja2VkRXhjZXB0aW9uKGJvb2xlYW4pCkBAIC0xNDMsMzkgKzE2OCw3IEBACiAJcHVibGljIGJvb2xlYW4gaXNVbmNoZWNrZWRFeGNlcHRpb24oYm9vbGVhbiBpbmNsdWRlU3VwZXJ0eXBlKSB7CiAJCXJldHVybiB0aGlzID09IFR5cGVCaW5kaW5nLk5VTEw7CiAJfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1dpZGVuaW5nKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKIAotCQkvL2NhbiAibGVmdCIgc3RvcmUgYSAicmlnaHQiIHVzaW5nIHNvbWUgd2lkZW5pbmcgY29udmVyc2lvbgotCQkvLyhpcyBsZWZ0ICJiaWdnZXIiIHRoYW4gcmlnaHQpCi0JCXN3aXRjaCAobGVmdCkgewotCQkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6Ci0JCQkJcmV0dXJuIHJpZ2h0ID09IFR5cGVJZHMuVF9ib29sZWFuOwotCQkJY2FzZSBUeXBlSWRzLlRfY2hhciA6Ci0JCQkJcmV0dXJuIHJpZ2h0ID09IFR5cGVJZHMuVF9jaGFyOwotCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2RvdWJsZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFR5cGVJZHMuVF9mbG9hdCA6Ci0JCQkJaWYgKHJpZ2h0ID09IFR5cGVJZHMuVF9mbG9hdCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2xvbmcpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBUeXBlSWRzLlRfaW50IDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX2ludCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKHJpZ2h0ID09IFR5cGVJZHMuVF9jaGFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKLQkJCQlpZiAocmlnaHQgPT0gVHlwZUlkcy5UX3Nob3J0KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgotCQkJCWlmIChyaWdodCA9PSBUeXBlSWRzLlRfYnl0ZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9CiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmcja2luZCgpCiAJICovCkBAIC0xODMsMjIgKzE3NiwyMiBAQAogCQlyZXR1cm4gQmluZGluZy5CQVNFX1RZUEU7CiAJfQogCXB1YmxpYyBjaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIHNpbXBsZU5hbWU7CisJCXJldHVybiB0aGlzLnNpbXBsZU5hbWU7CiAJfQogCiAJcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBzaW1wbGVOYW1lOworCQlyZXR1cm4gdGhpcy5zaW1wbGVOYW1lOwogCX0KIAogCXB1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBzaW1wbGVOYW1lOworCQlyZXR1cm4gdGhpcy5zaW1wbGVOYW1lOwogCX0KIAogCXB1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIHNpbXBsZU5hbWU7CisJCXJldHVybiB0aGlzLnNpbXBsZU5hbWU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29uc3RhbnRQb29sTmFtZSkgKyAiIChpZD0iICsgaWQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmNvbnN0YW50UG9vbE5hbWUpICsgIiAoaWQ9IiArIHRoaXMuaWQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5TG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5TG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFhZGQ3MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeUxvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKLQotcHVibGljIGNsYXNzIEJpbmFyeUxvY2FsVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgewotCUFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbkJpbmRpbmdzOwotCQotCXB1YmxpYyBCaW5hcnlMb2NhbFZhcmlhYmxlQmluZGluZyhjaGFyW10gbmFtZSwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9uQmluZGluZ3MpIHsKLQkJc3VwZXIobmFtZSwgdHlwZSwgbW9kaWZpZXJzLCB0cnVlKTsKLQkJdGhpcy5hbm5vdGF0aW9uQmluZGluZ3MgPSBhbm5vdGF0aW9uQmluZGluZ3MgPT0gbnVsbCA/IEJpbmRpbmcuTk9fQU5OT1RBVElPTlMgOiBhbm5vdGF0aW9uQmluZGluZ3M7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uQmluZGluZ1tdIGdldEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uQmluZGluZ3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhCmluZGV4IDBmNTM4MzAuLjcxZTI5NzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeVR5cGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDYsMTkgKzQ2LDE4IEBACiAKIAlwcm90ZWN0ZWQgU2ltcGxlTG9va3VwVGFibGUgc3RvcmVkQW5ub3RhdGlvbnMgPSBudWxsOyAvLyBrZXlzIGFyZSB0aGlzIFJlZmVyZW5jZUJpbmRpbmcgJiBpdHMgZmllbGRzIGFuZCBtZXRob2RzLCB2YWx1ZSBpcyBhbiBBbm5vdGF0aW9uSG9sZGVyCiAKLXN0YXRpYyBPYmplY3QgY29udmVydE1lbWJlclZhbHVlKE9iamVjdCBiaW5hcnlWYWx1ZSwgTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CitzdGF0aWMgT2JqZWN0IGNvbnZlcnRNZW1iZXJWYWx1ZShPYmplY3QgYmluYXJ5VmFsdWUsIExvb2t1cEVudmlyb25tZW50IGVudiwgY2hhcltdW11bXSBtaXNzaW5nVHlwZU5hbWVzKSB7CiAJaWYgKGJpbmFyeVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogCWlmIChiaW5hcnlWYWx1ZSBpbnN0YW5jZW9mIENvbnN0YW50KQogCQlyZXR1cm4gYmluYXJ5VmFsdWU7CiAJaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgQ2xhc3NTaWduYXR1cmUpCi0JCXJldHVybiBlbnYuZ2V0VHlwZUZyb21TaWduYXR1cmUoKChDbGFzc1NpZ25hdHVyZSkgYmluYXJ5VmFsdWUpLmdldFR5cGVOYW1lKCksIDAsIC0xLCBmYWxzZSwgbnVsbCk7CisJCXJldHVybiBlbnYuZ2V0VHlwZUZyb21TaWduYXR1cmUoKChDbGFzc1NpZ25hdHVyZSkgYmluYXJ5VmFsdWUpLmdldFR5cGVOYW1lKCksIDAsIC0xLCBmYWxzZSwgbnVsbCwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgSUJpbmFyeUFubm90YXRpb24pCi0JCXJldHVybiBjcmVhdGVBbm5vdGF0aW9uKChJQmluYXJ5QW5ub3RhdGlvbikgYmluYXJ5VmFsdWUsIGVudik7CisJCXJldHVybiBjcmVhdGVBbm5vdGF0aW9uKChJQmluYXJ5QW5ub3RhdGlvbikgYmluYXJ5VmFsdWUsIGVudiwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgRW51bUNvbnN0YW50U2lnbmF0dXJlKSB7CiAJCUVudW1Db25zdGFudFNpZ25hdHVyZSByZWYgPSAoRW51bUNvbnN0YW50U2lnbmF0dXJlKSBiaW5hcnlWYWx1ZTsKLQkJUmVmZXJlbmNlQmluZGluZyBlbnVtVHlwZSA9Ci0JCQkoUmVmZXJlbmNlQmluZGluZykgZW52LmdldFR5cGVGcm9tU2lnbmF0dXJlKHJlZi5nZXRUeXBlTmFtZSgpLCAwLCAtMSwgZmFsc2UsIG51bGwpOwotCQllbnVtVHlwZSA9IHJlc29sdmVUeXBlKGVudW1UeXBlLCBlbnYsIGZhbHNlKTsKKwkJUmVmZXJlbmNlQmluZGluZyBlbnVtVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBlbnYuZ2V0VHlwZUZyb21TaWduYXR1cmUocmVmLmdldFR5cGVOYW1lKCksIDAsIC0xLCBmYWxzZSwgbnVsbCwgbWlzc2luZ1R5cGVOYW1lcyk7CisJCWVudW1UeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVUeXBlKGVudW1UeXBlLCBlbnYsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uICovKTsKIAkJcmV0dXJuIGVudW1UeXBlLmdldEZpZWxkKHJlZi5nZXRFbnVtQ29uc3RhbnROYW1lKCksIGZhbHNlKTsKIAl9CiAJaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKQEAgLTY3LDY4ICs2Niw2MyBAQAogCQlpZiAobGVuZ3RoID09IDApIHJldHVybiBvYmplY3RzOwogCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQl2YWx1ZXNbaV0gPSBjb252ZXJ0TWVtYmVyVmFsdWUob2JqZWN0c1tpXSwgZW52KTsKKwkJCXZhbHVlc1tpXSA9IGNvbnZlcnRNZW1iZXJWYWx1ZShvYmplY3RzW2ldLCBlbnYsIG1pc3NpbmdUeXBlTmFtZXMpOwogCQlyZXR1cm4gdmFsdWVzOwogCX0KIAogCS8vIHNob3VsZCBuZXZlciByZWFjaCBoZXJlLgogCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKIH0KLXN0YXRpYyBBbm5vdGF0aW9uQmluZGluZyBjcmVhdGVBbm5vdGF0aW9uKElCaW5hcnlBbm5vdGF0aW9uIGFubm90YXRpb25JbmZvLCBMb29rdXBFbnZpcm9ubWVudCBlbnYpIHsKKworc3RhdGljIEFubm90YXRpb25CaW5kaW5nIGNyZWF0ZUFubm90YXRpb24oSUJpbmFyeUFubm90YXRpb24gYW5ub3RhdGlvbkluZm8sIExvb2t1cEVudmlyb25tZW50IGVudiwgY2hhcltdW11bXSBtaXNzaW5nVHlwZU5hbWVzKSB7CiAJSUJpbmFyeUVsZW1lbnRWYWx1ZVBhaXJbXSBiaW5hcnlQYWlycyA9IGFubm90YXRpb25JbmZvLmdldEVsZW1lbnRWYWx1ZVBhaXJzKCk7CiAJaW50IGxlbmd0aCA9IGJpbmFyeVBhaXJzID09IG51bGwgPyAwIDogYmluYXJ5UGFpcnMubGVuZ3RoOwogCUVsZW1lbnRWYWx1ZVBhaXJbXSBwYWlycyA9IGxlbmd0aCA9PSAwID8gQmluZGluZy5OT19FTEVNRU5UX1ZBTFVFX1BBSVJTIDogbmV3IEVsZW1lbnRWYWx1ZVBhaXJbbGVuZ3RoXTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQlwYWlyc1tpXSA9IG5ldyBFbGVtZW50VmFsdWVQYWlyKGJpbmFyeVBhaXJzW2ldLmdldE5hbWUoKSwgY29udmVydE1lbWJlclZhbHVlKGJpbmFyeVBhaXJzW2ldLmdldFZhbHVlKCksIGVudiksIG51bGwpOworCQlwYWlyc1tpXSA9IG5ldyBFbGVtZW50VmFsdWVQYWlyKGJpbmFyeVBhaXJzW2ldLmdldE5hbWUoKSwgY29udmVydE1lbWJlclZhbHVlKGJpbmFyeVBhaXJzW2ldLmdldFZhbHVlKCksIGVudiwgbWlzc2luZ1R5cGVOYW1lcyksIG51bGwpOwogCiAJY2hhcltdIHR5cGVOYW1lID0gYW5ub3RhdGlvbkluZm8uZ2V0VHlwZU5hbWUoKTsKLQlSZWZlcmVuY2VCaW5kaW5nIGFubm90YXRpb25UeXBlID0gZW52LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZSh0eXBlTmFtZSwgMSwgdHlwZU5hbWUubGVuZ3RoIC0gMSwgZmFsc2UpOworCVJlZmVyZW5jZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSBlbnYuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKHR5cGVOYW1lLCAxLCB0eXBlTmFtZS5sZW5ndGggLSAxLCBmYWxzZSwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJcmV0dXJuIG5ldyBVbnJlc29sdmVkQW5ub3RhdGlvbkJpbmRpbmcoYW5ub3RhdGlvblR5cGUsIHBhaXJzLCBlbnYpOwogfQotcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uQmluZGluZ1tdIGNyZWF0ZUFubm90YXRpb25zKElCaW5hcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbkluZm9zLCBMb29rdXBFbnZpcm9ubWVudCBlbnYpIHsKKworcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uQmluZGluZ1tdIGNyZWF0ZUFubm90YXRpb25zKElCaW5hcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbkluZm9zLCBMb29rdXBFbnZpcm9ubWVudCBlbnYsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCWludCBsZW5ndGggPSBhbm5vdGF0aW9uSW5mb3MgPT0gbnVsbCA/IDAgOiBhbm5vdGF0aW9uSW5mb3MubGVuZ3RoOwogCUFubm90YXRpb25CaW5kaW5nW10gcmVzdWx0ID0gbGVuZ3RoID09IDAgPyBCaW5kaW5nLk5PX0FOTk9UQVRJT05TIDogbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJcmVzdWx0W2ldID0gY3JlYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uSW5mb3NbaV0sIGVudik7CisJCXJlc3VsdFtpXSA9IGNyZWF0ZUFubm90YXRpb24oYW5ub3RhdGlvbkluZm9zW2ldLCBlbnYsIG1pc3NpbmdUeXBlTmFtZXMpOwogCXJldHVybiByZXN1bHQ7CiB9Ci1wdWJsaWMgc3RhdGljIFJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZVR5cGUoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgYm9vbGVhbiBjb252ZXJ0R2VuZXJpY1RvUmF3VHlwZSkgewotCWlmICh0eXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCi0JCXJldHVybiAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB0eXBlKS5yZXNvbHZlKGVudmlyb25tZW50LCBjb252ZXJ0R2VuZXJpY1RvUmF3VHlwZSk7Ci0JaWYgKHR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQotCQlyZXR1cm4gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHR5cGUpLnJlc29sdmUoKTsKLQlpZiAodHlwZS5pc1dpbGRjYXJkKCkpCi0JCXJldHVybiAoKFdpbGRjYXJkQmluZGluZykgdHlwZSkucmVzb2x2ZSgpOwogCi0JaWYgKGNvbnZlcnRHZW5lcmljVG9SYXdUeXBlKSAvLyByYXcgcmVmZXJlbmNlIHRvIGdlbmVyaWMgPwotCQlyZXR1cm4gKFJlZmVyZW5jZUJpbmRpbmcpIGVudmlyb25tZW50LmNvbnZlcnRVbnJlc29sdmVkQmluYXJ5VG9SYXdUeXBlKHR5cGUpOwotCXJldHVybiB0eXBlOwotfQotcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlQmluZGluZyB0eXBlLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtZXRlcml6ZWRUeXBlLCBpbnQgcmFuaykgeworcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlQmluZGluZyB0eXBlLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgYm9vbGVhbiBjb252ZXJ0R2VuZXJpY1RvUmF3VHlwZSkgewogCXN3aXRjaCAodHlwZS5raW5kKCkpIHsKLQkJCiAJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgotCQkJcmV0dXJuICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0eXBlKS5yZXNvbHZlKCk7Ci0JCQkKKwkJCSgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0eXBlKS5yZXNvbHZlKCk7CisJCQlicmVhazsKKwogCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CiAJCQlyZXR1cm4gKChXaWxkY2FyZEJpbmRpbmcpIHR5cGUpLnJlc29sdmUoKTsKLQkJCQorCiAJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKLQkJCXJlc29sdmVUeXBlKCgoQXJyYXlCaW5kaW5nKSB0eXBlKS5sZWFmQ29tcG9uZW50VHlwZSwgZW52aXJvbm1lbnQsIHBhcmFtZXRlcml6ZWRUeXBlLCByYW5rKTsKKwkJCXJlc29sdmVUeXBlKCgoQXJyYXlCaW5kaW5nKSB0eXBlKS5sZWFmQ29tcG9uZW50VHlwZSwgZW52aXJvbm1lbnQsIGNvbnZlcnRHZW5lcmljVG9SYXdUeXBlKTsKIAkJCWJyZWFrOwotCQkJCisKIAkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKLQkJCSgoVHlwZVZhcmlhYmxlQmluZGluZykgdHlwZSkucmVzb2x2ZShlbnZpcm9ubWVudCk7CisJCQkoKFR5cGVWYXJpYWJsZUJpbmRpbmcpIHR5cGUpLnJlc29sdmUoKTsKIAkJCWJyZWFrOwotCQkJCQkJCisKIAkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6Ci0JCQlpZiAocGFyYW1ldGVyaXplZFR5cGUgPT0gbnVsbCkgLy8gcmF3IHJlZmVyZW5jZSB0byBnZW5lcmljID8KKwkJCWlmIChjb252ZXJ0R2VuZXJpY1RvUmF3VHlwZSkgLy8gcmF3IHJlZmVyZW5jZSB0byBnZW5lcmljID8KIAkJCQlyZXR1cm4gZW52aXJvbm1lbnQuY29udmVydFVucmVzb2x2ZWRCaW5hcnlUb1Jhd1R5cGUodHlwZSk7CiAJCQlicmVhazsKLQkJCQotCQlkZWZhdWx0OgkJCQorCisJCWRlZmF1bHQ6CiAJCQlpZiAodHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQotCQkJCXJldHVybiAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB0eXBlKS5yZXNvbHZlKGVudmlyb25tZW50LCBwYXJhbWV0ZXJpemVkVHlwZSA9PSBudWxsKTsKKwkJCQlyZXR1cm4gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgdHlwZSkucmVzb2x2ZShlbnZpcm9ubWVudCwgY29udmVydEdlbmVyaWNUb1Jhd1R5cGUpOworCQkJaWYgKGNvbnZlcnRHZW5lcmljVG9SYXdUeXBlKSAvLyByYXcgcmVmZXJlbmNlIHRvIGdlbmVyaWMgPworCQkJCXJldHVybiBlbnZpcm9ubWVudC5jb252ZXJ0VW5yZXNvbHZlZEJpbmFyeVRvUmF3VHlwZSh0eXBlKTsKKwkJCWJyZWFrOwogCX0KIAlyZXR1cm4gdHlwZTsKIH0KQEAgLTE1NSw3ICsxNDksMTIgQEAKIAl0aGlzLmZQYWNrYWdlID0gcGFja2FnZUJpbmRpbmc7CiAJdGhpcy5maWxlTmFtZSA9IGJpbmFyeVR5cGUuZ2V0RmlsZU5hbWUoKTsKIAotCWNoYXJbXSB0eXBlU2lnbmF0dXJlID0gZW52aXJvbm1lbnQuZ2xvYmFsT3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ID8gYmluYXJ5VHlwZS5nZXRHZW5lcmljU2lnbmF0dXJlKCkgOiBudWxsOworCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAsIGV2ZW4gaW4gYSAxLjQgcHJvamVjdCwgd2UKKwkgICBtdXN0IGludGVybmFsaXplIHR5cGUgdmFyaWFibGVzIGFuZCBvYnNlcnZlIGFueSBwYXJhbWV0ZXJpemF0aW9uIG9mIHN1cGVyIGNsYXNzCisJICAgYW5kL29yIHN1cGVyIGludGVyZmFjZXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkZXRlY3Qgb3ZlcnJpZGluZyBpbiB0aGUgcHJlc2VuY2UKKwkgICBvZiBnZW5lcmljcy4KKwkgKi8KKwljaGFyW10gdHlwZVNpZ25hdHVyZSA9IGJpbmFyeVR5cGUuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOwogCXRoaXMudHlwZVZhcmlhYmxlcyA9IHR5cGVTaWduYXR1cmUgIT0gbnVsbCAmJiB0eXBlU2lnbmF0dXJlLmxlbmd0aCA+IDAgJiYgdHlwZVNpZ25hdHVyZVswXSA9PSAnPCcKIAkJPyBudWxsIC8vIGlzIGluaXRpYWxpemVkIGluIGNhY2hlUGFydHNGcm9tIChjYWxsZWQgZnJvbSBMb29rdXBFbnZpcm9ubWVudC5jcmVhdGVCaW5hcnlUeXBlRnJvbSgpKS4uLiBtdXN0IHNldCB0byBudWxsIHNvIGlzR2VuZXJpY1R5cGUoKSBhbnN3ZXJzIHRydWUKIAkJOiBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOwpAQCAtMTYzLDkgKzE2Miw5IEBACiAJdGhpcy5zb3VyY2VOYW1lID0gYmluYXJ5VHlwZS5nZXRTb3VyY2VOYW1lKCk7CiAJdGhpcy5tb2RpZmllcnMgPSBiaW5hcnlUeXBlLmdldE1vZGlmaWVycygpOwogCi0JaWYgKChiaW5hcnlUeXBlLmdldFRhZ0JpdHMoKSAmIFRhZ0JpdHMuSGFzSW5jb25zaXN0ZW50SGllcmFyY2h5KSAhPSAwKQorCWlmICgoYmluYXJ5VHlwZS5nZXRUYWdCaXRzKCkgJiBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zKSAhPSAwKQogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKLQkJCisKIAlpZiAoYmluYXJ5VHlwZS5pc0Fub255bW91cygpKSB7CiAJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkFub255bW91c1R5cGVNYXNrOwogCX0gZWxzZSBpZiAoYmluYXJ5VHlwZS5pc0xvY2FsKCkpIHsKQEAgLTE3NywxNCArMTc2LDE0IEBACiAJY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lID0gYmluYXJ5VHlwZS5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpOwogCWlmIChlbmNsb3NpbmdUeXBlTmFtZSAhPSBudWxsKSB7CiAJCS8vIGF0dGVtcHQgdG8gZmluZCB0aGUgZW5jbG9zaW5nIHR5cGUgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZSAob3RoZXJ3aXNlIC0gcmVzb2x2ZSBpdCB3aGVuIHJlcXVlc3RlZCkKLQkJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKGVuY2xvc2luZ1R5cGVOYW1lLCAwLCAtMSwgdHJ1ZSk7IC8vIHByZXRlbmQgcGFyYW1ldGVyaXplZCB0byBhdm9pZCByYXcKKwkJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKGVuY2xvc2luZ1R5cGVOYW1lLCAwLCAtMSwgdHJ1ZSwgbnVsbCAvKiBjb3VsZCBub3QgYmUgbWlzc2luZyAqLyk7IC8vIHByZXRlbmQgcGFyYW1ldGVyaXplZCB0byBhdm9pZCByYXcKIAkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuTWVtYmVyVHlwZU1hc2s7ICAgLy8gbXVzdCBiZSBhIG1lbWJlciB0eXBlIG5vdCBhIHRvcC1sZXZlbCBvciBsb2NhbCB0eXBlCiAJCXRoaXMudGFnQml0cyB8PSAJVGFnQml0cy5IYXNVbnJlc29sdmVkRW5jbG9zaW5nVHlwZTsKLQkJaWYgKHRoaXMuZW5jbG9zaW5nVHlwZSgpLmlzU3RyaWN0ZnAoKSkKKwkJaWYgKGVuY2xvc2luZ1R5cGUoKS5pc1N0cmljdGZwKCkpCiAJCQl0aGlzLm1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnA7Ci0JCWlmICh0aGlzLmVuY2xvc2luZ1R5cGUoKS5pc0RlcHJlY2F0ZWQoKSkKKwkJaWYgKGVuY2xvc2luZ1R5cGUoKS5pc0RlcHJlY2F0ZWQoKSkKIAkJCXRoaXMubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7Ci0JfQkKKwl9CiB9CiAKIC8qKgpAQCAtMTkyLDcgKzE5MSw3IEBACiAgKi8KIHB1YmxpYyBGaWVsZEJpbmRpbmdbXSBhdmFpbGFibGVGaWVsZHMoKSB7CiAJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZUZpZWxkc0NvbXBsZXRlKSAhPSAwKQotCQlyZXR1cm4gZmllbGRzOworCQlyZXR1cm4gdGhpcy5maWVsZHM7CiAKIAkvLyBsYXppbHkgc29ydCBmaWVsZHMKIAlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlRmllbGRzU29ydGVkKSA9PSAwKSB7CkBAIC0yMDEsMTEgKzIwMCwxMSBAQAogCQkJUmVmZXJlbmNlQmluZGluZy5zb3J0RmllbGRzKHRoaXMuZmllbGRzLCAwLCBsZW5ndGgpOwogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVGaWVsZHNTb3J0ZWQ7CiAJfQotCUZpZWxkQmluZGluZ1tdIGF2YWlsYWJsZUZpZWxkcyA9IG5ldyBGaWVsZEJpbmRpbmdbZmllbGRzLmxlbmd0aF07CisJRmllbGRCaW5kaW5nW10gYXZhaWxhYmxlRmllbGRzID0gbmV3IEZpZWxkQmluZGluZ1t0aGlzLmZpZWxkcy5sZW5ndGhdOwogCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAJCXRyeSB7Ci0JCQlhdmFpbGFibGVGaWVsZHNbY291bnRdID0gcmVzb2x2ZVR5cGVGb3IoZmllbGRzW2ldKTsKKwkJCWF2YWlsYWJsZUZpZWxkc1tjb3VudF0gPSByZXNvbHZlVHlwZUZvcih0aGlzLmZpZWxkc1tpXSk7CiAJCQljb3VudCsrOwogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGEpewogCQkJLy8gc2lsZW50IGFib3J0CkBAIC0yMTYsMTIgKzIxNSwzNyBAQAogCXJldHVybiBhdmFpbGFibGVGaWVsZHM7CiB9CiAKK3ByaXZhdGUgVHlwZVZhcmlhYmxlQmluZGluZ1tdIGFkZE1ldGhvZFR5cGVWYXJpYWJsZXMoVHlwZVZhcmlhYmxlQmluZGluZ1tdIG1ldGhvZFR5cGVWYXJzKSB7CisJaWYgKHRoaXMudHlwZVZhcmlhYmxlcyA9PSBudWxsIHx8IHRoaXMudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CisJCXJldHVybiBtZXRob2RUeXBlVmFyczsKKwl9IAorCWlmIChtZXRob2RUeXBlVmFycyA9PSBudWxsIHx8IG1ldGhvZFR5cGVWYXJzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlczsKKwl9CisJLy8gdW5pcS1tZXJnZSBib3RoIHRoZSBhcnJheXMKKwlpbnQgdG90YWwgPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoICsgbWV0aG9kVHlwZVZhcnMubGVuZ3RoOworCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSBjb21iaW5lZFR5cGVWYXJzID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmdbdG90YWxdOworCVN5c3RlbS5hcnJheWNvcHkodGhpcy50eXBlVmFyaWFibGVzLCAwLCBjb21iaW5lZFR5cGVWYXJzLCAwLCB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKKwlpbnQgc2l6ZSA9IHRoaXMudHlwZVZhcmlhYmxlcy5sZW5ndGg7CisJbG9vcDogZm9yIChpbnQgaSA9IDAsIGxlbiA9IG1ldGhvZFR5cGVWYXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisJCWZvciAoaW50IGogPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoIC0xIDsgaiA+PSAwOyBqLS0pIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RUeXBlVmFyc1tpXS5zb3VyY2VOYW1lLCB0aGlzLnR5cGVWYXJpYWJsZXNbal0uc291cmNlTmFtZSkpCisJCQkJY29udGludWUgbG9vcDsKKwkJfQorCQljb21iaW5lZFR5cGVWYXJzW3NpemUrK10gPSBtZXRob2RUeXBlVmFyc1tpXTsKKwl9CisJaWYgKHNpemUgIT0gdG90YWwpIHsKKwkJU3lzdGVtLmFycmF5Y29weShjb21iaW5lZFR5cGVWYXJzLCAwLCBjb21iaW5lZFR5cGVWYXJzID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmdbc2l6ZV0sIDAsIHNpemUpOworCX0KKwlyZXR1cm4gY29tYmluZWRUeXBlVmFyczsKK30KKwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyNhdmFpbGFibGVNZXRob2RzKCkKICAqLwogcHVibGljIE1ldGhvZEJpbmRpbmdbXSBhdmFpbGFibGVNZXRob2RzKCkgewogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApCi0JCXJldHVybiBtZXRob2RzOworCQlyZXR1cm4gdGhpcy5tZXRob2RzOwogCiAJLy8gbGF6aWx5IHNvcnQgbWV0aG9kcwogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzU29ydGVkKSA9PSAwKSB7CkBAIC0yMzAsMTEgKzI1NCwxMSBAQAogCQkJUmVmZXJlbmNlQmluZGluZy5zb3J0TWV0aG9kcyh0aGlzLm1ldGhvZHMsIDAsIGxlbmd0aCk7CiAJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkFyZU1ldGhvZHNTb3J0ZWQ7CiAJfQotCU1ldGhvZEJpbmRpbmdbXSBhdmFpbGFibGVNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbWV0aG9kcy5sZW5ndGhdOworCU1ldGhvZEJpbmRpbmdbXSBhdmFpbGFibGVNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbdGhpcy5tZXRob2RzLmxlbmd0aF07CiAJaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGkrKykgewogCQl0cnkgewotCQkJYXZhaWxhYmxlTWV0aG9kc1tjb3VudF0gPSByZXNvbHZlVHlwZXNGb3IobWV0aG9kc1tpXSk7CisJCQlhdmFpbGFibGVNZXRob2RzW2NvdW50XSA9IHJlc29sdmVUeXBlc0Zvcih0aGlzLm1ldGhvZHNbaV0pOwogCQkJY291bnQrKzsKIAkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBhKXsKIAkJCS8vIHNpbGVudCBhYm9ydApAQCAtMjQ0LDEyNCArMjY4LDE1OCBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KGF2YWlsYWJsZU1ldGhvZHMsIDAsIGF2YWlsYWJsZU1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsKIAlyZXR1cm4gYXZhaWxhYmxlTWV0aG9kczsKIH0KKwogdm9pZCBjYWNoZVBhcnRzRnJvbShJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzKSB7Ci0JLy8gZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3Igc3VwZXItaW50ZXJmYWNlcyBlYXJseSwgaW4gY2FzZSBzb21lIGFib3J0aW5nIGNvbXBpbGF0aW9uIGVycm9yIG9jY3VycywKLQkvLyBhbmQgc3RpbGwgd2FudCB0byB1c2UgYmluYXJpZXMgcGFzc2VkIHRoYXQgcG9pbnQgKGUuZy4gdHlwZSBoaWVyYXJjaHkgcmVzb2x2ZXIsIHNlZSBidWcgNjM3NDgpLgotCXRoaXMudHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7Ci0JdGhpcy5zdXBlckludGVyZmFjZXMgPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUzsKLQotCS8vIG11c3QgcmV0cmlldmUgbWVtYmVyIHR5cGVzIGluIGNhc2Ugc3VwZXJjbGFzcy9pbnRlcmZhY2VzIG5lZWQgdGhlbQotCXRoaXMubWVtYmVyVHlwZXMgPSBCaW5kaW5nLk5PX01FTUJFUl9UWVBFUzsKLQlJQmluYXJ5TmVzdGVkVHlwZVtdIG1lbWJlclR5cGVTdHJ1Y3R1cmVzID0gYmluYXJ5VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWlmIChtZW1iZXJUeXBlU3RydWN0dXJlcyAhPSBudWxsKSB7Ci0JCWludCBzaXplID0gbWVtYmVyVHlwZVN0cnVjdHVyZXMubGVuZ3RoOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCXRoaXMubWVtYmVyVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCS8vIGF0dGVtcHQgdG8gZmluZCBlYWNoIG1lbWJlciB0eXBlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCi0JCQkJdGhpcy5tZW1iZXJUeXBlc1tpXSA9IGVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShtZW1iZXJUeXBlU3RydWN0dXJlc1tpXS5nZXROYW1lKCksIDAsIC0xLCBmYWxzZSk7Ci0JCQl0aGlzLnRhZ0JpdHMgfD0gCVRhZ0JpdHMuSGFzVW5yZXNvbHZlZE1lbWJlclR5cGVzOwotCQl9Ci0JfQotCi0JbG9uZyBzb3VyY2VMZXZlbCA9IGVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuc291cmNlTGV2ZWw7Ci0JY2hhcltdIHR5cGVTaWduYXR1cmUgPSBudWxsOwotCWlmIChzb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCXR5cGVTaWduYXR1cmUgPSBiaW5hcnlUeXBlLmdldEdlbmVyaWNTaWduYXR1cmUoKTsKLQkJdGhpcy50YWdCaXRzIHw9IGJpbmFyeVR5cGUuZ2V0VGFnQml0cygpOwotCX0KLQlpZiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSB7Ci0JCWNoYXJbXSBzdXBlcmNsYXNzTmFtZSA9IGJpbmFyeVR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCS8vIGF0dGVtcHQgdG8gZmluZCB0aGUgc3VwZXJjbGFzcyBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlIChvdGhlcndpc2UgLSByZXNvbHZlIGl0IHdoZW4gcmVxdWVzdGVkKQotCQkJdGhpcy5zdXBlcmNsYXNzID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKHN1cGVyY2xhc3NOYW1lLCAwLCAtMSwgZmFsc2UpOwotCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzVW5yZXNvbHZlZFN1cGVyY2xhc3M7Ci0JCX0KLQorCXRyeSB7CisJCS8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZm9yIHN1cGVyLWludGVyZmFjZXMgZWFybHksIGluIGNhc2Ugc29tZSBhYm9ydGluZyBjb21waWxhdGlvbiBlcnJvciBvY2N1cnMsCisJCS8vIGFuZCBzdGlsbCB3YW50IHRvIHVzZSBiaW5hcmllcyBwYXNzZWQgdGhhdCBwb2ludCAoZS5nLiB0eXBlIGhpZXJhcmNoeSByZXNvbHZlciwgc2VlIGJ1ZyA2Mzc0OCkuCisJCXRoaXMudHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CiAJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7Ci0JCWNoYXJbXVtdIGludGVyZmFjZU5hbWVzID0gYmluYXJ5VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpOwotCQlpZiAoaW50ZXJmYWNlTmFtZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisKKwkJLy8gbXVzdCByZXRyaWV2ZSBtZW1iZXIgdHlwZXMgaW4gY2FzZSBzdXBlcmNsYXNzL2ludGVyZmFjZXMgbmVlZCB0aGVtCisJCXRoaXMubWVtYmVyVHlwZXMgPSBCaW5kaW5nLk5PX01FTUJFUl9UWVBFUzsKKwkJSUJpbmFyeU5lc3RlZFR5cGVbXSBtZW1iZXJUeXBlU3RydWN0dXJlcyA9IGJpbmFyeVR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKKwkJaWYgKG1lbWJlclR5cGVTdHJ1Y3R1cmVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gbWVtYmVyVHlwZVN0cnVjdHVyZXMubGVuZ3RoOwogCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJCQl0aGlzLm1lbWJlclR5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCS8vIGF0dGVtcHQgdG8gZmluZCBlYWNoIHN1cGVyaW50ZXJmYWNlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCi0JCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKGludGVyZmFjZU5hbWVzW2ldLCAwLCAtMSwgZmFsc2UpOworCQkJCQkvLyBhdHRlbXB0IHRvIGZpbmQgZWFjaCBtZW1iZXIgdHlwZSBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlIChvdGhlcndpc2UgLSByZXNvbHZlIGl0IHdoZW4gcmVxdWVzdGVkKQorCQkJCQl0aGlzLm1lbWJlclR5cGVzW2ldID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUobWVtYmVyVHlwZVN0cnVjdHVyZXNbaV0uZ2V0TmFtZSgpLCAwLCAtMSwgZmFsc2UsIG51bGwgLyogY291bGQgbm90IGJlIG1pc3NpbmcgKi8pOworCQkJCXRoaXMudGFnQml0cyB8PSAJVGFnQml0cy5IYXNVbnJlc29sdmVkTWVtYmVyVHlwZXM7CisJCQl9CisJCX0KKworCQlsb25nIHNvdXJjZUxldmVsID0gdGhpcy5lbnZpcm9ubWVudC5nbG9iYWxPcHRpb25zLm9yaWdpbmFsU291cmNlTGV2ZWw7CisJCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAsIGV2ZW4gaW4gYSAxLjQgcHJvamVjdCwgd2UKKwkJICAgbXVzdCBpbnRlcm5hbGl6ZSB0eXBlIHZhcmlhYmxlcyBhbmQgb2JzZXJ2ZSBhbnkgcGFyYW1ldGVyaXphdGlvbiBvZiBzdXBlciBjbGFzcworCQkgICBhbmQvb3Igc3VwZXIgaW50ZXJmYWNlcyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGRldGVjdCBvdmVycmlkaW5nIGluIHRoZSBwcmVzZW5jZQorCQkgICBvZiBnZW5lcmljcy4KKwkJICovCisJCWNoYXJbXSB0eXBlU2lnbmF0dXJlID0gYmluYXJ5VHlwZS5nZXRHZW5lcmljU2lnbmF0dXJlKCk7IC8vIHVzZSBnZW5lcmljIHNpZ25hdHVyZSBldmVuIGluIDEuNAorCQl0aGlzLnRhZ0JpdHMgfD0gYmluYXJ5VHlwZS5nZXRUYWdCaXRzKCk7CisJCQorCQljaGFyW11bXVtdIG1pc3NpbmdUeXBlTmFtZXMgPSBiaW5hcnlUeXBlLmdldE1pc3NpbmdUeXBlTmFtZXMoKTsKKwkJU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKwkJaWYgKHR5cGVTaWduYXR1cmUgIT0gbnVsbCkgeworCQkJLy8gQ2xhc3NTaWduYXR1cmUgPSBQYXJhbWV0ZXJQYXJ0KG9wdGlvbmFsKSBzdXBlcl9UeXBlU2lnbmF0dXJlIGludGVyZmFjZV9zaWduYXR1cmUKKwkJCXdyYXBwZXIgPSBuZXcgU2lnbmF0dXJlV3JhcHBlcih0eXBlU2lnbmF0dXJlKTsKKwkJCWlmICh3cmFwcGVyLnNpZ25hdHVyZVt3cmFwcGVyLnN0YXJ0XSA9PSAnPCcpIHsKKwkJCQkvLyBQYXJhbWV0ZXJQYXJ0ID0gJzwnIFBhcmFtZXRlclNpZ25hdHVyZShzKSAnPicKKwkJCQl3cmFwcGVyLnN0YXJ0Kys7IC8vIHNraXAgJzwnCisJCQkJdGhpcy50eXBlVmFyaWFibGVzID0gY3JlYXRlVHlwZVZhcmlhYmxlcyh3cmFwcGVyLCB0cnVlLCBtaXNzaW5nVHlwZU5hbWVzKTsKKwkJCQl3cmFwcGVyLnN0YXJ0Kys7IC8vIHNraXAgJz4nCisJCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc1VucmVzb2x2ZWRUeXBlVmFyaWFibGVzOworCQkJCXRoaXMubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsKKwkJCX0KKwkJfQorCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcnMgPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOworCQljaGFyW10gbWV0aG9kRGVzY3JpcHRvciA9IGJpbmFyeVR5cGUuZ2V0RW5jbG9zaW5nTWV0aG9kKCk7CisJCWlmIChtZXRob2REZXNjcmlwdG9yICE9IG51bGwpIHsKKwkJCU1ldGhvZEJpbmRpbmcgZW5jbG9zaW5nTWV0aG9kID0gZmluZE1ldGhvZChtZXRob2REZXNjcmlwdG9yLCBtaXNzaW5nVHlwZU5hbWVzKTsKKwkJCWlmIChlbmNsb3NpbmdNZXRob2QgIT0gbnVsbCkgeworCQkJCXR5cGVWYXJzID0gZW5jbG9zaW5nTWV0aG9kLnR5cGVWYXJpYWJsZXM7CisJCQkJdGhpcy50eXBlVmFyaWFibGVzID0gYWRkTWV0aG9kVHlwZVZhcmlhYmxlcyh0eXBlVmFycyk7CQkJCisJCQl9CisJCX0KKwkJaWYgKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgIHsKKwkJCWNoYXJbXSBzdXBlcmNsYXNzTmFtZSA9IGJpbmFyeVR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwkJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQkJLy8gYXR0ZW1wdCB0byBmaW5kIHRoZSBzdXBlcmNsYXNzIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCQkJdGhpcy5zdXBlcmNsYXNzID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoc3VwZXJjbGFzc05hbWUsIDAsIC0xLCBmYWxzZSwgbWlzc2luZ1R5cGVOYW1lcyk7CisJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzVW5yZXNvbHZlZFN1cGVyY2xhc3M7CisJCQl9CisKKwkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CisJCQljaGFyW11bXSBpbnRlcmZhY2VOYW1lcyA9IGJpbmFyeVR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwkJCWlmIChpbnRlcmZhY2VOYW1lcyAhPSBudWxsKSB7CisJCQkJaW50IHNpemUgPSBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisJCQkJaWYgKHNpemUgPiAwKSB7CisJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCQkJLy8gYXR0ZW1wdCB0byBmaW5kIGVhY2ggc3VwZXJpbnRlcmZhY2UgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZSAob3RoZXJ3aXNlIC0gcmVzb2x2ZSBpdCB3aGVuIHJlcXVlc3RlZCkKKwkJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoaW50ZXJmYWNlTmFtZXNbaV0sIDAsIC0xLCBmYWxzZSwgbWlzc2luZ1R5cGVOYW1lcyk7CisJCQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmludGVyZmFjZXM7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gYXR0ZW1wdCB0byBmaW5kIHRoZSBzdXBlcmNsYXNzIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCQl0aGlzLnN1cGVyY2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgdHlwZVZhcnMsIHRoaXMsIG1pc3NpbmdUeXBlTmFtZXMpOworCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzVW5yZXNvbHZlZFN1cGVyY2xhc3M7CisKKwkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CisJCQlpZiAoIXdyYXBwZXIuYXRFbmQoKSkgeworCQkJCS8vIGF0dGVtcHQgdG8gZmluZCBlYWNoIHN1cGVyaW50ZXJmYWNlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCQkJamF2YS51dGlsLkFycmF5TGlzdCB0eXBlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KDIpOworCQkJCWRvIHsKKwkJCQkJdHlwZXMuYWRkKHRoaXMuZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHR5cGVWYXJzLCB0aGlzLCBtaXNzaW5nVHlwZU5hbWVzKSk7CisJCQkJfSB3aGlsZSAoIXdyYXBwZXIuYXRFbmQoKSk7CisJCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1t0eXBlcy5zaXplKCldOworCQkJCXR5cGVzLnRvQXJyYXkodGhpcy5zdXBlckludGVyZmFjZXMpOwogCQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmludGVyZmFjZXM7CiAJCQl9CiAJCX0KLQl9IGVsc2UgewotCQkvLyBDbGFzc1NpZ25hdHVyZSA9IFBhcmFtZXRlclBhcnQob3B0aW9uYWwpIHN1cGVyX1R5cGVTaWduYXR1cmUgaW50ZXJmYWNlX3NpZ25hdHVyZQotCQlTaWduYXR1cmVXcmFwcGVyIHdyYXBwZXIgPSBuZXcgU2lnbmF0dXJlV3JhcHBlcih0eXBlU2lnbmF0dXJlKTsKLQkJaWYgKHdyYXBwZXIuc2lnbmF0dXJlW3dyYXBwZXIuc3RhcnRdID09ICc8JykgewotCQkJLy8gUGFyYW1ldGVyUGFydCA9ICc8JyBQYXJhbWV0ZXJTaWduYXR1cmUocykgJz4nCi0JCQl3cmFwcGVyLnN0YXJ0Kys7IC8vIHNraXAgJzwnCi0JCQl0aGlzLnR5cGVWYXJpYWJsZXMgPSBjcmVhdGVUeXBlVmFyaWFibGVzKHdyYXBwZXIsIHRydWUpOwotCQkJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICc+JwotCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc1VucmVzb2x2ZWRUeXBlVmFyaWFibGVzOwotCQkJdGhpcy5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlOworCisJCWlmIChuZWVkRmllbGRzQW5kTWV0aG9kcykgeworCQkJY3JlYXRlRmllbGRzKGJpbmFyeVR5cGUuZ2V0RmllbGRzKCksIHNvdXJjZUxldmVsLCBtaXNzaW5nVHlwZU5hbWVzKTsKKwkJCWNyZWF0ZU1ldGhvZHMoYmluYXJ5VHlwZS5nZXRNZXRob2RzKCksIHNvdXJjZUxldmVsLCBtaXNzaW5nVHlwZU5hbWVzKTsKKwkJCWJvb2xlYW4gaXNWaWV3ZWRBc0RlcHJlY2F0ZWQgPSBpc1ZpZXdlZEFzRGVwcmVjYXRlZCgpOworCQkJaWYgKGlzVmlld2VkQXNEZXByZWNhdGVkKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IHRoaXMuZmllbGRzW2ldOworCQkJCQlpZiAoIWZpZWxkLmlzRGVwcmVjYXRlZCgpKSB7CisJCQkJCQlmaWVsZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZXByZWNhdGVkSW1wbGljaXRseTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ldOworCQkJCQlpZiAoIW1ldGhvZC5pc0RlcHJlY2F0ZWQoKSkgeworCQkJCQkJbWV0aG9kLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5OworCQkJCQl9CisJCQkJfQorCQkJfQogCQl9Ci0KLQkJLy8gYXR0ZW1wdCB0byBmaW5kIHRoZSBzdXBlcmNsYXNzIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCi0JCXRoaXMuc3VwZXJjbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUywgdGhpcyk7Ci0JCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmNsYXNzOwotCi0JCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7Ci0JCWlmICghd3JhcHBlci5hdEVuZCgpKSB7Ci0JCQkvLyBhdHRlbXB0IHRvIGZpbmQgZWFjaCBzdXBlcmludGVyZmFjZSBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlIChvdGhlcndpc2UgLSByZXNvbHZlIGl0IHdoZW4gcmVxdWVzdGVkKQotCQkJamF2YS51dGlsLkFycmF5TGlzdCB0eXBlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KDIpOwotCQkJZG8gewotCQkJCXR5cGVzLmFkZChlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUywgdGhpcykpOwotCQkJfSB3aGlsZSAoIXdyYXBwZXIuYXRFbmQoKSk7Ci0JCQl0aGlzLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3R5cGVzLnNpemUoKV07Ci0JCQl0eXBlcy50b0FycmF5KHRoaXMuc3VwZXJJbnRlcmZhY2VzKTsKLQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmludGVyZmFjZXM7Ci0JCX0KKwkJaWYgKHRoaXMuZW52aXJvbm1lbnQuZ2xvYmFsT3B0aW9ucy5zdG9yZUFubm90YXRpb25zKQorCQkJc2V0QW5ub3RhdGlvbnMoY3JlYXRlQW5ub3RhdGlvbnMoYmluYXJ5VHlwZS5nZXRBbm5vdGF0aW9ucygpLCB0aGlzLmVudmlyb25tZW50LCBtaXNzaW5nVHlwZU5hbWVzKSk7CisJfSBmaW5hbGx5IHsKKwkJLy8gcHJvdGVjdCBhZ2FpbnN0IGluY29ycmVjdCB1c2Ugb2YgdGhlIG5lZWRGaWVsZHNBbmRNZXRob2RzIGZsYWcsIHNlZSA0ODQ1OQorCQlpZiAodGhpcy5maWVsZHMgPT0gbnVsbCkKKwkJCXRoaXMuZmllbGRzID0gQmluZGluZy5OT19GSUVMRFM7CisJCWlmICh0aGlzLm1ldGhvZHMgPT0gbnVsbCkKKwkJCXRoaXMubWV0aG9kcyA9IEJpbmRpbmcuTk9fTUVUSE9EUzsKIAl9Ci0KLQlpZiAobmVlZEZpZWxkc0FuZE1ldGhvZHMpIHsKLQkJY3JlYXRlRmllbGRzKGJpbmFyeVR5cGUuZ2V0RmllbGRzKCksIHNvdXJjZUxldmVsKTsKLQkJY3JlYXRlTWV0aG9kcyhiaW5hcnlUeXBlLmdldE1ldGhvZHMoKSwgc291cmNlTGV2ZWwpOwotCX0gZWxzZSB7IC8vIHByb3RlY3QgYWdhaW5zdCBpbmNvcnJlY3QgdXNlIG9mIHRoZSBuZWVkRmllbGRzQW5kTWV0aG9kcyBmbGFnLCBzZWUgNDg0NTkKLQkJdGhpcy5maWVsZHMgPSBCaW5kaW5nLk5PX0ZJRUxEUzsKLQkJdGhpcy5tZXRob2RzID0gQmluZGluZy5OT19NRVRIT0RTOwotCX0KLQlpZiAodGhpcy5lbnZpcm9ubWVudC5nbG9iYWxPcHRpb25zLnN0b3JlQW5ub3RhdGlvbnMpCi0JCXNldEFubm90YXRpb25zKGNyZWF0ZUFubm90YXRpb25zKGJpbmFyeVR5cGUuZ2V0QW5ub3RhdGlvbnMoKSwgdGhpcy5lbnZpcm9ubWVudCkpOwkKIH0KLXByaXZhdGUgdm9pZCBjcmVhdGVGaWVsZHMoSUJpbmFyeUZpZWxkW10gaUZpZWxkcywgbG9uZyBzb3VyY2VMZXZlbCkgeworCitwcml2YXRlIHZvaWQgY3JlYXRlRmllbGRzKElCaW5hcnlGaWVsZFtdIGlGaWVsZHMsIGxvbmcgc291cmNlTGV2ZWwsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCXRoaXMuZmllbGRzID0gQmluZGluZy5OT19GSUVMRFM7CiAJaWYgKGlGaWVsZHMgIT0gbnVsbCkgewogCQlpbnQgc2l6ZSA9IGlGaWVsZHMubGVuZ3RoOwogCQlpZiAoc2l6ZSA+IDApIHsKIAkJCXRoaXMuZmllbGRzID0gbmV3IEZpZWxkQmluZGluZ1tzaXplXTsKIAkJCWJvb2xlYW4gdXNlMTVzcGVjaWZpY3MgPSBzb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwotCQkJYm9vbGVhbiBpc1ZpZXdlZEFzRGVwcmVjYXRlZCA9IGlzVmlld2VkQXNEZXByZWNhdGVkKCk7CiAJCQlib29sZWFuIGhhc1Jlc3RyaWN0ZWRBY2Nlc3MgPSBoYXNSZXN0cmljdGVkQWNjZXNzKCk7CiAJCQlpbnQgZmlyc3RBbm5vdGF0ZWRGaWVsZEluZGV4ID0gLTE7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJCUlCaW5hcnlGaWVsZCBiaW5hcnlGaWVsZCA9IGlGaWVsZHNbaV07CiAJCQkJY2hhcltdIGZpZWxkU2lnbmF0dXJlID0gdXNlMTVzcGVjaWZpY3MgPyBiaW5hcnlGaWVsZC5nZXRHZW5lcmljU2lnbmF0dXJlKCkgOiBudWxsOwotCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBmaWVsZFNpZ25hdHVyZSA9PSBudWxsIAotCQkJCQk/IGVudmlyb25tZW50LmdldFR5cGVGcm9tU2lnbmF0dXJlKGJpbmFyeUZpZWxkLmdldFR5cGVOYW1lKCksIDAsIC0xLCBmYWxzZSwgdGhpcykgCi0JCQkJCTogZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKG5ldyBTaWduYXR1cmVXcmFwcGVyKGZpZWxkU2lnbmF0dXJlKSwgQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUywgdGhpcyk7Ci0JCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gCisJCQkJVHlwZUJpbmRpbmcgdHlwZSA9IGZpZWxkU2lnbmF0dXJlID09IG51bGwKKwkJCQkJPyB0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tU2lnbmF0dXJlKGJpbmFyeUZpZWxkLmdldFR5cGVOYW1lKCksIDAsIC0xLCBmYWxzZSwgdGhpcywgbWlzc2luZ1R5cGVOYW1lcykKKwkJCQkJOiB0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tVHlwZVNpZ25hdHVyZShuZXcgU2lnbmF0dXJlV3JhcHBlcihmaWVsZFNpZ25hdHVyZSksIEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMsIHRoaXMsIG1pc3NpbmdUeXBlTmFtZXMpOworCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9CiAJCQkJCW5ldyBGaWVsZEJpbmRpbmcoCi0JCQkJCQliaW5hcnlGaWVsZC5nZXROYW1lKCksIAotCQkJCQkJdHlwZSwgCi0JCQkJCQliaW5hcnlGaWVsZC5nZXRNb2RpZmllcnMoKSB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZCwgCi0JCQkJCQl0aGlzLCAKKwkJCQkJCWJpbmFyeUZpZWxkLmdldE5hbWUoKSwKKwkJCQkJCXR5cGUsCisJCQkJCQliaW5hcnlGaWVsZC5nZXRNb2RpZmllcnMoKSB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZCwKKwkJCQkJCXRoaXMsCiAJCQkJCQliaW5hcnlGaWVsZC5nZXRDb25zdGFudCgpKTsKIAkJCQlpZiAoZmlyc3RBbm5vdGF0ZWRGaWVsZEluZGV4IDwgMAotCQkJCQkJJiYgdGhpcy5lbnZpcm9ubWVudC5nbG9iYWxPcHRpb25zLnN0b3JlQW5ub3RhdGlvbnMgCisJCQkJCQkmJiB0aGlzLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuc3RvcmVBbm5vdGF0aW9ucwogCQkJCQkJJiYgYmluYXJ5RmllbGQuZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CiAJCQkJCWZpcnN0QW5ub3RhdGVkRmllbGRJbmRleCA9IGk7CiAJCQkJfQogCQkJCWZpZWxkLmlkID0gaTsgLy8gb3JkaW5hbAogCQkJCWlmICh1c2UxNXNwZWNpZmljcykKIAkJCQkJZmllbGQudGFnQml0cyB8PSBiaW5hcnlGaWVsZC5nZXRUYWdCaXRzKCk7Ci0JCQkJaWYgKGlzVmlld2VkQXNEZXByZWNhdGVkICYmICFmaWVsZC5pc0RlcHJlY2F0ZWQoKSkKLQkJCQkJZmllbGQubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CiAJCQkJaWYgKGhhc1Jlc3RyaWN0ZWRBY2Nlc3MpCiAJCQkJCWZpZWxkLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1Jlc3RyaWN0ZWRBY2Nlc3M7CiAJCQkJaWYgKGZpZWxkU2lnbmF0dXJlICE9IG51bGwpCkBAIC0zNzEsMjkgKzQyOSwzNiBAQAogCQkJLy8gc2Vjb25kIHBhc3MgZm9yIHJlaWZ5aW5nIGFubm90YXRpb25zLCBzaW5jZSBtYXkgcmVmZXIgdG8gZmllbGRzIGJlaW5nIGNvbnN0cnVjdGVkICgxNDc4NzUpCiAJCQlpZiAoZmlyc3RBbm5vdGF0ZWRGaWVsZEluZGV4ID49IDApIHsKIAkJCQlmb3IgKGludCBpID0gZmlyc3RBbm5vdGF0ZWRGaWVsZEluZGV4OyBpIDxzaXplOyBpKyspIHsKLQkJCQkJdGhpcy5maWVsZHNbaV0uc2V0QW5ub3RhdGlvbnMoY3JlYXRlQW5ub3RhdGlvbnMoaUZpZWxkc1tpXS5nZXRBbm5vdGF0aW9ucygpLCB0aGlzLmVudmlyb25tZW50KSk7CisJCQkJCUlCaW5hcnlGaWVsZCBiaW5hcnlGaWVsZCA9IGlGaWVsZHNbaV07CisJCQkJCXRoaXMuZmllbGRzW2ldLnNldEFubm90YXRpb25zKGNyZWF0ZUFubm90YXRpb25zKGJpbmFyeUZpZWxkLmdldEFubm90YXRpb25zKCksIHRoaXMuZW52aXJvbm1lbnQsIG1pc3NpbmdUeXBlTmFtZXMpKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAl9CiB9Ci1wcml2YXRlIE1ldGhvZEJpbmRpbmcgY3JlYXRlTWV0aG9kKElCaW5hcnlNZXRob2QgbWV0aG9kLCBsb25nIHNvdXJjZUxldmVsKSB7CisKK3ByaXZhdGUgTWV0aG9kQmluZGluZyBjcmVhdGVNZXRob2QoSUJpbmFyeU1ldGhvZCBtZXRob2QsIGxvbmcgc291cmNlTGV2ZWwsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCWludCBtZXRob2RNb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQ7CiAJaWYgKHNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkKIAkJbWV0aG9kTW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJnczsgLy8gdmFyYXJnIG1ldGhvZHMgYXJlIG5vdCByZWNvZ25pemVkIHVudGlsIDEuNQogCVJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOwogCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUzsKIAlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcnMgPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOwotCUFubm90YXRpb25CaW5kaW5nW11bXSBwYXJhbUFubm90YXRpb25zID0gbnVsbDsgCisJQW5ub3RhdGlvbkJpbmRpbmdbXVtdIHBhcmFtQW5ub3RhdGlvbnMgPSBudWxsOwogCVR5cGVCaW5kaW5nIHJldHVyblR5cGUgPSBudWxsOwogCiAJZmluYWwgYm9vbGVhbiB1c2UxNXNwZWNpZmljcyA9IHNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7Ci0JY2hhcltdIG1ldGhvZFNpZ25hdHVyZSA9IHVzZTE1c3BlY2lmaWNzID8gbWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSA6IG51bGw7CisJLyogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg1MCwgU2luY2UgYSAxLjQgcHJvamVjdCBjYW4gaGF2ZSBhIDEuNQorCSAgIHR5cGUgYXMgYSBzdXBlciB0eXBlIGFuZCB0aGUgMS41IHR5cGUgY291bGQgYmUgZ2VuZXJpYywgd2UgbXVzdCBpbnRlcm5hbGl6ZSB1c2FnZXMgb2YgdHlwZQorCSAgIHZhcmlhYmxlcyBwcm9wZXJseSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFwcGx5IHN1YnN0aXR1dGlvbnMgYW5kIHRodXMgYmUgYWJsZSB0byBkZXRlY3QKKwkgICBvdmVycmlkaW5nIGluIHRoZSBwcmVzZW5jZSBvZiBnZW5lcmljcy4gU2VlaW5nIHRoZSBlcmFzZWQgZm9ybSBpcyBub3QgZ29vZCBlbm91Z2guCisJICovCisJY2hhcltdIG1ldGhvZFNpZ25hdHVyZSA9IG1ldGhvZC5nZXRHZW5lcmljU2lnbmF0dXJlKCk7IC8vIGFsd2F5cyB1c2UgZ2VuZXJpYyBzaWduYXR1cmUsIGV2ZW4gaW4gMS40CiAJaWYgKG1ldGhvZFNpZ25hdHVyZSA9PSBudWxsKSB7IC8vIG5vIGdlbmVyaWNzCiAJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gbWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKTsgICAvLyBvZiB0aGUgZm9ybSAoSVtMamF2YS9qYW5nL1N0cmluZzspVgogCQlpbnQgbnVtT2ZQYXJhbXMgPSAwOwogCQljaGFyIG5leHRDaGFyOwotCQlpbnQgaW5kZXggPSAwOyAgIC8vIGZpcnN0IGNoYXJhY3RlciBpcyBhbHdheXMgJygnIHNvIHNraXAgaXQKKwkJaW50IGluZGV4ID0gMDsgLy8gZmlyc3QgY2hhcmFjdGVyIGlzIGFsd2F5cyAnKCcgc28gc2tpcCBpdAogCQl3aGlsZSAoKG5leHRDaGFyID0gbWV0aG9kRGVzY3JpcHRvclsrK2luZGV4XSkgIT0gJyknKSB7CiAJCQlpZiAobmV4dENoYXIgIT0gJ1snKSB7CiAJCQkJbnVtT2ZQYXJhbXMrKzsKQEAgLTQwMiw4ICs0NjcsMTggQEAKIAkJCX0KIAkJfQogCi0JCS8vIElnbm9yZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIG1lbWJlciB0eXBlcy4KLQkJaW50IHN0YXJ0SW5kZXggPSAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiBpc01lbWJlclR5cGUoKSAmJiAhaXNTdGF0aWMoKSkgPyAxIDogMDsKKwkJLy8gSWdub3JlIHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgbWVtYmVyIHR5cGVzIG9yIGVudW0gdHlwZXMuCisJCWludCBzdGFydEluZGV4ID0gMDsKKwkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCWlmIChpc01lbWJlclR5cGUoKSAmJiAhaXNTdGF0aWMoKSkgeworCQkJCS8vIGVuY2xvc2luZyB0eXBlCisJCQkJc3RhcnRJbmRleCsrOworCQkJfQorCQkJaWYgKGlzRW51bSgpKSB7CisJCQkJLy8gc3ludGhldGljIGFyZ3VtZW50cyAoU3RyaW5nLCBpbnQpCisJCQkJc3RhcnRJbmRleCArPSAyOworCQkJfQorCQl9CiAJCWludCBzaXplID0gbnVtT2ZQYXJhbXMgLSBzdGFydEluZGV4OwogCQlpZiAoc2l6ZSA+IDApIHsKIAkJCXBhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbc2l6ZV07CkBAIC00MTcsMTEgKzQ5MiwxMSBAQAogCQkJCQl3aGlsZSAoKG5leHRDaGFyID0gbWV0aG9kRGVzY3JpcHRvclsrK2VuZF0pICE9ICc7Jyl7LyplbXB0eSovfQogCiAJCQkJaWYgKGkgPj0gc3RhcnRJbmRleCkgeyAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyBhcmcgaWYgbmVjZXNzYXJ5Ci0JCQkJCXBhcmFtZXRlcnNbaSAtIHN0YXJ0SW5kZXhdID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21TaWduYXR1cmUobWV0aG9kRGVzY3JpcHRvciwgaW5kZXgsIGVuZCwgZmFsc2UsIHRoaXMpOworCQkJCQlwYXJhbWV0ZXJzW2kgLSBzdGFydEluZGV4XSA9IHRoaXMuZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21TaWduYXR1cmUobWV0aG9kRGVzY3JpcHRvciwgaW5kZXgsIGVuZCwgZmFsc2UsIHRoaXMsIG1pc3NpbmdUeXBlTmFtZXMpOwogCQkJCQkvLyAncGFyYW1Bbm5vdGF0aW9ucycgbGluZSB1cCB3aXRoICdwYXJhbWV0ZXJzJwogCQkJCQkvLyBpbnQgcGFyYW1ldGVyIHRvIG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpIGluY2x1ZGUgdGhlIHN5bnRoZXRpYyBhcmcKIAkJCQkJaWYgKHBhcmFtQW5ub3RhdGlvbnMgIT0gbnVsbCkKLQkJCQkJCXBhcmFtQW5ub3RhdGlvbnNbaSAtIHN0YXJ0SW5kZXhdID0gY3JlYXRlQW5ub3RhdGlvbnMobWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKGkpLCB0aGlzLmVudmlyb25tZW50KTsKKwkJCQkJCXBhcmFtQW5ub3RhdGlvbnNbaSAtIHN0YXJ0SW5kZXhdID0gY3JlYXRlQW5ub3RhdGlvbnMobWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKGkgLSBzdGFydEluZGV4KSwgdGhpcy5lbnZpcm9ubWVudCwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJCQkJfQogCQkJCWluZGV4ID0gZW5kICsgMTsKIAkJCX0KQEAgLTQzMywyMSArNTA4LDIxIEBACiAJCQlpZiAoc2l6ZSA+IDApIHsKIAkJCQlleGNlcHRpb25zID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWV4Y2VwdGlvbnNbaV0gPSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoZXhjZXB0aW9uVHlwZXNbaV0sIDAsIC0xLCBmYWxzZSk7CisJCQkJCWV4Y2VwdGlvbnNbaV0gPSB0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShleGNlcHRpb25UeXBlc1tpXSwgMCwgLTEsIGZhbHNlLCBtaXNzaW5nVHlwZU5hbWVzKTsKIAkJCX0KIAkJfQogCiAJCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkKLQkJCXJldHVyblR5cGUgPSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVNpZ25hdHVyZShtZXRob2REZXNjcmlwdG9yLCBpbmRleCArIDEsIC0xLCBmYWxzZSwgdGhpcyk7ICAgLy8gaW5kZXggaXMgY3VycmVudGx5IHBvaW50aW5nIGF0IHRoZSAnKScKKwkJCXJldHVyblR5cGUgPSB0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tU2lnbmF0dXJlKG1ldGhvZERlc2NyaXB0b3IsIGluZGV4ICsgMSwgLTEsIGZhbHNlLCB0aGlzLCBtaXNzaW5nVHlwZU5hbWVzKTsgICAvLyBpbmRleCBpcyBjdXJyZW50bHkgcG9pbnRpbmcgYXQgdGhlICcpJwogCX0gZWxzZSB7CiAJCW1ldGhvZE1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7CiAJCS8vIE1ldGhvZFR5cGVTaWduYXR1cmUgPSBQYXJhbWV0ZXJQYXJ0KG9wdGlvbmFsKSAnKCcgVHlwZVNpZ25hdHVyZXMgJyknIHJldHVybl90eXBlU2lnbmF0dXJlIFsnXicgVHlwZVNpZ25hdHVyZSAob3B0aW9uYWwpXQotCQlTaWduYXR1cmVXcmFwcGVyIHdyYXBwZXIgPSBuZXcgU2lnbmF0dXJlV3JhcHBlcihtZXRob2RTaWduYXR1cmUpOworCQlTaWduYXR1cmVXcmFwcGVyIHdyYXBwZXIgPSBuZXcgU2lnbmF0dXJlV3JhcHBlcihtZXRob2RTaWduYXR1cmUsIHVzZTE1c3BlY2lmaWNzKTsKIAkJaWYgKHdyYXBwZXIuc2lnbmF0dXJlW3dyYXBwZXIuc3RhcnRdID09ICc8JykgewogCQkJLy8gPEE6OkxqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz4oTGphdmEvbGFuZy9DbGFzczxUQTs+OylUQTsKIAkJCS8vIFBhcmFtZXRlclBhcnQgPSAnPCcgUGFyYW1ldGVyU2lnbmF0dXJlKHMpICc+JwogCQkJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICc8JwotCQkJdHlwZVZhcnMgPSBjcmVhdGVUeXBlVmFyaWFibGVzKHdyYXBwZXIsIGZhbHNlKTsKKwkJCXR5cGVWYXJzID0gY3JlYXRlVHlwZVZhcmlhYmxlcyh3cmFwcGVyLCBmYWxzZSwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJCQl3cmFwcGVyLnN0YXJ0Kys7IC8vIHNraXAgJz4nCiAJCX0KIApAQCAtNDU4LDcgKzUzMyw3IEBACiAJCQl9IGVsc2UgewogCQkJCWphdmEudXRpbC5BcnJheUxpc3QgdHlwZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgyKTsKIAkJCQl3aGlsZSAod3JhcHBlci5zaWduYXR1cmVbd3JhcHBlci5zdGFydF0gIT0gJyknKQotCQkJCQl0eXBlcy5hZGQoZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHR5cGVWYXJzLCB0aGlzKSk7CisJCQkJCXR5cGVzLmFkZCh0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tVHlwZVNpZ25hdHVyZSh3cmFwcGVyLCB0eXBlVmFycywgdGhpcywgbWlzc2luZ1R5cGVOYW1lcykpOwogCQkJCXdyYXBwZXIuc3RhcnQrKzsgLy8gc2tpcCAnKScKIAkJCQlpbnQgbnVtUGFyYW0gPSB0eXBlcy5zaXplKCk7CiAJCQkJcGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1tudW1QYXJhbV07CkBAIC00NjYsMjAgKzU0MSwyMCBAQAogCQkJCWlmICh0aGlzLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuc3RvcmVBbm5vdGF0aW9ucykgewogCQkJCQlwYXJhbUFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25CaW5kaW5nW251bVBhcmFtXVtdOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBhcmFtOyBpKyspCi0JCQkJCQlwYXJhbUFubm90YXRpb25zW2ldID0gY3JlYXRlQW5ub3RhdGlvbnMobWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKGkpLCB0aGlzLmVudmlyb25tZW50KTsKKwkJCQkJCXBhcmFtQW5ub3RhdGlvbnNbaV0gPSBjcmVhdGVBbm5vdGF0aW9ucyhtZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaSksIHRoaXMuZW52aXJvbm1lbnQsIG1pc3NpbmdUeXBlTmFtZXMpOwogCQkJCX0KIAkJCX0KIAkJfQogCiAJCS8vIGFsd2F5cyByZXRyaWV2ZSByZXR1cm4gdHlwZSAoZm9yIGNvbnN0cnVjdG9ycywgaXRzIFYgZm9yIHZvaWQgLSB3aWxsIGJlIGlnbm9yZWQpCi0JCXJldHVyblR5cGUgPSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgdHlwZVZhcnMsIHRoaXMpOworCQlyZXR1cm5UeXBlID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgdHlwZVZhcnMsIHRoaXMsIG1pc3NpbmdUeXBlTmFtZXMpOwogCiAJCWlmICghd3JhcHBlci5hdEVuZCgpICYmIHdyYXBwZXIuc2lnbmF0dXJlW3dyYXBwZXIuc3RhcnRdID09ICdeJykgewogCQkJLy8gYXR0ZW1wdCB0byBmaW5kIGVhY2ggZXhjZXB0aW9uIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCiAJCQlqYXZhLnV0aWwuQXJyYXlMaXN0IHR5cGVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoMik7CiAJCQlkbyB7CiAJCQkJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICdeJwotCQkJCXR5cGVzLmFkZChlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgdHlwZVZhcnMsIHRoaXMpKTsKKwkJCQl0eXBlcy5hZGQodGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgdHlwZVZhcnMsIHRoaXMsIG1pc3NpbmdUeXBlTmFtZXMpKTsKIAkJCX0gd2hpbGUgKCF3cmFwcGVyLmF0RW5kKCkgJiYgd3JhcHBlci5zaWduYXR1cmVbd3JhcHBlci5zdGFydF0gPT0gJ14nKTsKIAkJCWV4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1t0eXBlcy5zaXplKCldOwogCQkJdHlwZXMudG9BcnJheShleGNlcHRpb25zKTsKQEAgLTQ5MCw3ICs1NjUsNyBAQAogCQkJCWlmIChzaXplID4gMCkgewogCQkJCQlleGNlcHRpb25zID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJZXhjZXB0aW9uc1tpXSA9IGVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShleGNlcHRpb25UeXBlc1tpXSwgMCwgLTEsIGZhbHNlKTsKKwkJCQkJCWV4Y2VwdGlvbnNbaV0gPSB0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShleGNlcHRpb25UeXBlc1tpXSwgMCwgLTEsIGZhbHNlLCBtaXNzaW5nVHlwZU5hbWVzKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUwMSw5ICs1NzYsMTAgQEAKIAkJOiBuZXcgTWV0aG9kQmluZGluZyhtZXRob2RNb2RpZmllcnMsIG1ldGhvZC5nZXRTZWxlY3RvcigpLCByZXR1cm5UeXBlLCBwYXJhbWV0ZXJzLCBleGNlcHRpb25zLCB0aGlzKTsKIAlpZiAodGhpcy5lbnZpcm9ubWVudC5nbG9iYWxPcHRpb25zLnN0b3JlQW5ub3RhdGlvbnMpCiAJCXJlc3VsdC5zZXRBbm5vdGF0aW9ucygKLQkJCWNyZWF0ZUFubm90YXRpb25zKG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpLCB0aGlzLmVudmlyb25tZW50KSwKKwkJCWNyZWF0ZUFubm90YXRpb25zKG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpLCB0aGlzLmVudmlyb25tZW50LCBtaXNzaW5nVHlwZU5hbWVzKSwKIAkJCXBhcmFtQW5ub3RhdGlvbnMsCi0JCQlpc0Fubm90YXRpb25UeXBlKCkgPyBjb252ZXJ0TWVtYmVyVmFsdWUobWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpLCB0aGlzLmVudmlyb25tZW50KSA6IG51bGwpOworCQkJaXNBbm5vdGF0aW9uVHlwZSgpID8gY29udmVydE1lbWJlclZhbHVlKG1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKSwgdGhpcy5lbnZpcm9ubWVudCwgbWlzc2luZ1R5cGVOYW1lcykgOiBudWxsLAorCQkJdGhpcy5lbnZpcm9ubWVudCk7CiAKIAlpZiAodXNlMTVzcGVjaWZpY3MpCiAJCXJlc3VsdC50YWdCaXRzIHw9IG1ldGhvZC5nZXRUYWdCaXRzKCk7CkBAIC01MTMsMTYgKzU4OSwxNiBAQAogCQl0eXBlVmFyc1tpXS5kZWNsYXJpbmdFbGVtZW50ID0gcmVzdWx0OwogCXJldHVybiByZXN1bHQ7CiB9CisKIC8qKgogICogQ3JlYXRlIG1ldGhvZCBiaW5kaW5ncyBmb3IgYmluYXJ5IHR5cGUsIGZpbHRlcmluZyBvdXQgPGNsaW5pdD4gYW5kIHN5bnRoZXRpY3MKICAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZU1ldGhvZHMoSUJpbmFyeU1ldGhvZFtdIGlNZXRob2RzLCBsb25nIHNvdXJjZUxldmVsKSB7Citwcml2YXRlIHZvaWQgY3JlYXRlTWV0aG9kcyhJQmluYXJ5TWV0aG9kW10gaU1ldGhvZHMsIGxvbmcgc291cmNlTGV2ZWwsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCWludCB0b3RhbCA9IDAsIGluaXRpYWxUb3RhbCA9IDAsIGlDbGluaXQgPSAtMTsKIAlpbnRbXSB0b1NraXAgPSBudWxsOwogCWlmIChpTWV0aG9kcyAhPSBudWxsKSB7CiAJCXRvdGFsID0gaW5pdGlhbFRvdGFsID0gaU1ldGhvZHMubGVuZ3RoOwotCQlib29sZWFuIGtlZXBCcmlkZ2VNZXRob2RzID0gc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81Ci0JCQkmJiB0aGlzLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7CisJCWJvb2xlYW4ga2VlcEJyaWRnZU1ldGhvZHMgPSBzb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzAzNDcKIAkJZm9yIChpbnQgaSA9IHRvdGFsOyAtLWkgPj0gMDspIHsKIAkJCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gaU1ldGhvZHNbaV07CiAJCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICE9IDApIHsKQEAgLTU0NywxNCArNjIzLDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlib29sZWFuIGlzVmlld2VkQXNEZXByZWNhdGVkID0gaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKTsKIAlib29sZWFuIGhhc1Jlc3RyaWN0ZWRBY2Nlc3MgPSBoYXNSZXN0cmljdGVkQWNjZXNzKCk7CiAJdGhpcy5tZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbdG90YWxdOwogCWlmICh0b3RhbCA9PSBpbml0aWFsVG90YWwpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsVG90YWw7IGkrKykgewotCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBjcmVhdGVNZXRob2QoaU1ldGhvZHNbaV0sIHNvdXJjZUxldmVsKTsKLQkJCWlmIChpc1ZpZXdlZEFzRGVwcmVjYXRlZCAmJiAhbWV0aG9kLmlzRGVwcmVjYXRlZCgpKQotCQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZXByZWNhdGVkSW1wbGljaXRseTsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gY3JlYXRlTWV0aG9kKGlNZXRob2RzW2ldLCBzb3VyY2VMZXZlbCwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJCQlpZiAoaGFzUmVzdHJpY3RlZEFjY2VzcykKIAkJCQltZXRob2QubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjUmVzdHJpY3RlZEFjY2VzczsKIAkJCXRoaXMubWV0aG9kc1tpXSA9IG1ldGhvZDsKQEAgLTU2Miw5ICs2MzUsNyBAQAogCX0gZWxzZSB7CiAJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBpbml0aWFsVG90YWw7IGkrKykgewogCQkJaWYgKGlDbGluaXQgIT0gaSAmJiAodG9Ta2lwID09IG51bGwgfHwgdG9Ta2lwW2ldICE9IC0xKSkgewotCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gY3JlYXRlTWV0aG9kKGlNZXRob2RzW2ldLCBzb3VyY2VMZXZlbCk7Ci0JCQkJaWYgKGlzVmlld2VkQXNEZXByZWNhdGVkICYmICFtZXRob2QuaXNEZXByZWNhdGVkKCkpCi0JCQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZXByZWNhdGVkSW1wbGljaXRseTsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZChpTWV0aG9kc1tpXSwgc291cmNlTGV2ZWwsIG1pc3NpbmdUeXBlTmFtZXMpOwogCQkJCWlmIChoYXNSZXN0cmljdGVkQWNjZXNzKQogCQkJCQltZXRob2QubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjUmVzdHJpY3RlZEFjY2VzczsKIAkJCQl0aGlzLm1ldGhvZHNbaW5kZXgrK10gPSBtZXRob2Q7CkBAIC01NzIsNyArNjQzLDggQEAKIAkJfQogCX0KIH0KLXByaXZhdGUgVHlwZVZhcmlhYmxlQmluZGluZ1tdIGNyZWF0ZVR5cGVWYXJpYWJsZXMoU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLCBib29sZWFuIGFzc2lnblZhcmlhYmxlcykgeworCitwcml2YXRlIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSBjcmVhdGVUeXBlVmFyaWFibGVzKFNpZ25hdHVyZVdyYXBwZXIgd3JhcHBlciwgYm9vbGVhbiBhc3NpZ25WYXJpYWJsZXMsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCS8vIGRldGVjdCBhbGwgdHlwZSB2YXJpYWJsZXMgZmlyc3QKIAljaGFyW10gdHlwZVNpZ25hdHVyZSA9IHdyYXBwZXIuc2lnbmF0dXJlOwogCWludCBkZXB0aCA9IDAsIGxlbmd0aCA9IHR5cGVTaWduYXR1cmUubGVuZ3RoOwpAQCAtNTgzLDEwICs2NTUsMTAgQEAKIAljcmVhdGVWYXJpYWJsZXM6IHsKIAkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJc3dpdGNoKHR5cGVTaWduYXR1cmVbaV0pIHsKLQkJCQljYXNlICc8JyA6IAorCQkJCWNhc2UgJzwnIDoKIAkJCQkJZGVwdGgrKzsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOiAKKwkJCQljYXNlICc+JyA6CiAJCQkJCWlmICgtLWRlcHRoIDwgMCkKIAkJCQkJCWJyZWFrIGNyZWF0ZVZhcmlhYmxlczsKIAkJCQkJYnJlYWs7CkBAIC01OTksNyArNjcxLDcgQEAKIAkJCQkJCXBlbmRpbmdWYXJpYWJsZSA9IGZhbHNlOwogCQkJCQkJaW50IGNvbG9uID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc6JywgdHlwZVNpZ25hdHVyZSwgaSk7CiAJCQkJCQljaGFyW10gdmFyaWFibGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0eXBlU2lnbmF0dXJlLCBpLCBjb2xvbik7Ci0JCQkJCQl2YXJpYWJsZXMuYWRkKG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKHZhcmlhYmxlTmFtZSwgdGhpcywgcmFuaysrKSk7CisJCQkJCQl2YXJpYWJsZXMuYWRkKG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKHZhcmlhYmxlTmFtZSwgdGhpcywgcmFuaysrLCB0aGlzLmVudmlyb25tZW50KSk7CiAJCQkJCX0KIAkJCX0KIAkJfQpAQCAtNjEyLDEwICs2ODQsMTEgQEAKIAlpZiAoYXNzaWduVmFyaWFibGVzKQogCQl0aGlzLnR5cGVWYXJpYWJsZXMgPSByZXN1bHQ7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHsKLQkJaW5pdGlhbGl6ZVR5cGVWYXJpYWJsZShyZXN1bHRbaV0sIHJlc3VsdCwgd3JhcHBlcik7CisJCWluaXRpYWxpemVUeXBlVmFyaWFibGUocmVzdWx0W2ldLCByZXN1bHQsIHdyYXBwZXIsIG1pc3NpbmdUeXBlTmFtZXMpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQorCiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZW5jbG9zaW5nIHR5cGUuLi4gbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KICoKICogTk9URTogZW5jbG9zaW5nVHlwZSBvZiBhIGJpbmFyeSB0eXBlIGlzIHJlc29sdmVkIHdoZW4gbmVlZGVkCkBAIC02MjUsMTQgKzY5OCwxNCBAQAogCQlyZXR1cm4gdGhpcy5lbmNsb3NpbmdUeXBlOwogCiAJLy8gZmluaXNoIHJlc29sdmluZyB0aGUgdHlwZQotCXRoaXMuZW5jbG9zaW5nVHlwZSA9IHJlc29sdmVUeXBlKHRoaXMuZW5jbG9zaW5nVHlwZSwgdGhpcy5lbnZpcm9ubWVudCwgZmFsc2UpOworCXRoaXMuZW5jbG9zaW5nVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZXNvbHZlVHlwZSh0aGlzLmVuY2xvc2luZ1R5cGUsIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uICovKTsKIAl0aGlzLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSGFzVW5yZXNvbHZlZEVuY2xvc2luZ1R5cGU7CiAJcmV0dXJuIHRoaXMuZW5jbG9zaW5nVHlwZTsKIH0KIC8vIE5PVEU6IHRoZSB0eXBlIG9mIGVhY2ggZmllbGQgb2YgYSBiaW5hcnkgdHlwZSBpcyByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIEZpZWxkQmluZGluZ1tdIGZpZWxkcygpIHsKIAlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlRmllbGRzQ29tcGxldGUpICE9IDApCi0JCXJldHVybiBmaWVsZHM7CisJCXJldHVybiB0aGlzLmZpZWxkczsKIAogCS8vIGxhemlseSBzb3J0IGZpZWxkcwogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVGaWVsZHNTb3J0ZWQpID09IDApIHsKQEAgLTY0MSwxNyArNzE0LDc0IEBACiAJCQlSZWZlcmVuY2VCaW5kaW5nLnNvcnRGaWVsZHModGhpcy5maWVsZHMsIDAsIGxlbmd0aCk7CiAJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkFyZUZpZWxkc1NvcnRlZDsKIAl9Ci0JZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJcmVzb2x2ZVR5cGVGb3IoZmllbGRzW2ldKTsKKwlmb3IgKGludCBpID0gdGhpcy5maWVsZHMubGVuZ3RoOyAtLWkgPj0gMDspCisJCXJlc29sdmVUeXBlRm9yKHRoaXMuZmllbGRzW2ldKTsKIAl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVGaWVsZHNDb21wbGV0ZTsKLQlyZXR1cm4gZmllbGRzOworCXJldHVybiB0aGlzLmZpZWxkczsKIH0KKworcHJpdmF0ZSBNZXRob2RCaW5kaW5nIGZpbmRNZXRob2QoY2hhcltdIG1ldGhvZERlc2NyaXB0b3IsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgeworCWludCBpbmRleCA9IC0xOworCXdoaWxlIChtZXRob2REZXNjcmlwdG9yWysraW5kZXhdICE9ICcoJykgeworCQkvLyBlbXB0eQorCX0KKwljaGFyW10gc2VsZWN0b3IgPSBuZXcgY2hhcltpbmRleF07CisJU3lzdGVtLmFycmF5Y29weShtZXRob2REZXNjcmlwdG9yLCAwLCBzZWxlY3RvciwgMCwgaW5kZXgpOworCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUzsKKwlpbnQgbnVtT2ZQYXJhbXMgPSAwOworCWNoYXIgbmV4dENoYXI7CisJaW50IHBhcmFtU3RhcnQgPSBpbmRleDsKKwl3aGlsZSAoKG5leHRDaGFyID0gbWV0aG9kRGVzY3JpcHRvclsrK2luZGV4XSkgIT0gJyknKSB7CisJCWlmIChuZXh0Q2hhciAhPSAnWycpIHsKKwkJCW51bU9mUGFyYW1zKys7CisJCQlpZiAobmV4dENoYXIgPT0gJ0wnKQorCQkJCXdoaWxlICgobmV4dENoYXIgPSBtZXRob2REZXNjcmlwdG9yWysraW5kZXhdKSAhPSAnOycpey8qZW1wdHkqL30KKwkJfQorCX0KKwlpZiAobnVtT2ZQYXJhbXMgPiAwKSB7CisJCXBhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbbnVtT2ZQYXJhbXNdOworCQlpbmRleCA9IHBhcmFtU3RhcnQgKyAxOworCQlpbnQgZW5kID0gcGFyYW1TdGFydDsgLy8gZmlyc3QgY2hhcmFjdGVyIGlzIGFsd2F5cyAnKCcgc28gc2tpcCBpdAorCQlmb3IgKGludCBpID0gMDsgaSA8IG51bU9mUGFyYW1zOyBpKyspIHsKKwkJCXdoaWxlICgobmV4dENoYXIgPSBtZXRob2REZXNjcmlwdG9yWysrZW5kXSkgPT0gJ1snKXsvKmVtcHR5Ki99CisJCQlpZiAobmV4dENoYXIgPT0gJ0wnKQorCQkJCXdoaWxlICgobmV4dENoYXIgPSBtZXRob2REZXNjcmlwdG9yWysrZW5kXSkgIT0gJzsnKXsvKmVtcHR5Ki99CisKKwkJCVR5cGVCaW5kaW5nIHBhcmFtID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlRnJvbVNpZ25hdHVyZShtZXRob2REZXNjcmlwdG9yLCBpbmRleCwgZW5kLCBmYWxzZSwgdGhpcywgbWlzc2luZ1R5cGVOYW1lcyk7CisJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgeworCQkJCXBhcmFtID0gcmVzb2x2ZVR5cGUocGFyYW0sIHRoaXMuZW52aXJvbm1lbnQsIHRydWUgLyogcmF3IGNvbnZlcnNpb24gKi8pOworCQkJfQorCQkJcGFyYW1ldGVyc1tpXSA9IHBhcmFtOworCQkJaW5kZXggPSBlbmQgKyAxOworCQl9CisJfQorCisJaW50IHBhcmFtZXRlckxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzMiA9IHRoaXMuZW5jbG9zaW5nVHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yLCBwYXJhbWV0ZXJMZW5ndGgpOworCS8vIGZpbmQgbWF0Y2hpbmcgbWV0aG9kIHVzaW5nIHBhcmFtZXRlcnMKKwlsb29wOiBmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kczIubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kID0gbWV0aG9kczJbaV07CisJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyczIgPSBjdXJyZW50TWV0aG9kLnBhcmFtZXRlcnM7CisJCWludCBjdXJyZW50TWV0aG9kUGFyYW1ldGVyTGVuZ3RoID0gcGFyYW1ldGVyczIubGVuZ3RoOworCQlpZiAocGFyYW1ldGVyTGVuZ3RoID09IGN1cnJlbnRNZXRob2RQYXJhbWV0ZXJMZW5ndGgpIHsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudE1ldGhvZFBhcmFtZXRlckxlbmd0aDsgaisrKSB7CisJCQkJaWYgKHBhcmFtZXRlcnNbal0gIT0gcGFyYW1ldGVyczJbal0gJiYgcGFyYW1ldGVyc1tqXS5lcmFzdXJlKCkgIT0gcGFyYW1ldGVyczJbal0uZXJhc3VyZSgpKSB7CisJCQkJCWNvbnRpbnVlIGxvb3A7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGN1cnJlbnRNZXRob2Q7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisKIC8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2dlbmVyaWNUeXBlU2lnbmF0dXJlKCkKICAqLwogcHVibGljIGNoYXJbXSBnZW5lcmljVHlwZVNpZ25hdHVyZSgpIHsKIAlyZXR1cm4gY29tcHV0ZUdlbmVyaWNUeXBlU2lnbmF0dXJlKHRoaXMudHlwZVZhcmlhYmxlcyk7CiB9CisKIC8vTk9URTogdGhlIHJldHVybiB0eXBlLCBhcmcgJiBleGNlcHRpb24gdHlwZXMgb2YgZWFjaCBtZXRob2Qgb2YgYSBiaW5hcnkgdHlwZSBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKIHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldEV4YWN0Q29uc3RydWN0b3IoVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzKSB7CiAKQEAgLTY2NSw4ICs3OTUsOCBAQAogCWludCBhcmdDb3VudCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOwogCWxvbmcgcmFuZ2U7CiAJaWYgKChyYW5nZSA9IFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoKFR5cGVDb25zdGFudHMuSU5JVCwgdGhpcy5tZXRob2RzKSkgPj0gMCkgewotCQluZXh0TWV0aG9kOiBmb3IgKGludCBpbWV0aG9kID0gKGludClyYW5nZSwgZW5kID0gKGludCkocmFuZ2UgPj4gMzIpOyBpbWV0aG9kIDw9IGVuZDsgaW1ldGhvZCsrKSB7CQotCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ltZXRob2RdOworCQluZXh0TWV0aG9kOiBmb3IgKGludCBpbWV0aG9kID0gKGludClyYW5nZSwgZW5kID0gKGludCkocmFuZ2UgPj4gMzIpOyBpbWV0aG9kIDw9IGVuZDsgaW1ldGhvZCsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IHRoaXMubWV0aG9kc1tpbWV0aG9kXTsKIAkJCWlmIChtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT0gYXJnQ291bnQpIHsKIAkJCQlyZXNvbHZlVHlwZXNGb3IobWV0aG9kKTsKIAkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKQEAgLTY3NSw3ICs4MDUsNyBAQAogCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKIAkJCQlyZXR1cm4gbWV0aG9kOwogCQkJfQotCQl9CQorCQl9CiAJfQogCXJldHVybiBudWxsOwogfQpAQCAtNjg0LDcgKzgxNCw3IEBACiAvL3NlYXJjaGVzIHVwIHRoZSBoaWVyYXJjaHkgYXMgbG9uZyBhcyBubyBwb3RlbnRpYWwgKGJ1dCBub3QgZXhhY3QpIG1hdGNoIHdhcyBmb3VuZC4KIHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldEV4YWN0TWV0aG9kKGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBDb21waWxhdGlvblVuaXRTY29wZSByZWZTY29wZSkgewogCS8vIHNlbmRlciBmcm9tIHJlZlNjb3BlIGNhbGxzIHJlY29yZFR5cGVSZWZlcmVuY2UodGhpcykKLQkKKwogCS8vIGxhemlseSBzb3J0IG1ldGhvZHMKIAlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlTWV0aG9kc1NvcnRlZCkgPT0gMCkgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5tZXRob2RzLmxlbmd0aDsKQEAgLTY5OCw4ICs4MjgsOCBAQAogCiAJbG9uZyByYW5nZTsKIAlpZiAoKHJhbmdlID0gUmVmZXJlbmNlQmluZGluZy5iaW5hcnlTZWFyY2goc2VsZWN0b3IsIHRoaXMubWV0aG9kcykpID49IDApIHsKLQkJbmV4dE1ldGhvZDogZm9yIChpbnQgaW1ldGhvZCA9IChpbnQpcmFuZ2UsIGVuZCA9IChpbnQpKHJhbmdlID4+IDMyKTsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgewkKLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpbWV0aG9kXTsKKwkJbmV4dE1ldGhvZDogZm9yIChpbnQgaW1ldGhvZCA9IChpbnQpcmFuZ2UsIGVuZCA9IChpbnQpKHJhbmdlID4+IDMyKTsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgeworCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSB0aGlzLm1ldGhvZHNbaW1ldGhvZF07CiAJCQlmb3VuZE5vdGhpbmcgPSBmYWxzZTsgLy8gaW5uZXIgdHlwZSBsb29rdXBzIG11c3Qga25vdyB0aGF0IGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGV4aXN0cwogCQkJaWYgKG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PSBhcmdDb3VudCkgewogCQkJCXJlc29sdmVUeXBlc0ZvcihtZXRob2QpOwpAQCAtNzE1LDEzICs4NDUsMTMgQEAKIAkJaWYgKGlzSW50ZXJmYWNlKCkpIHsKIAkJCSBpZiAoc3VwZXJJbnRlcmZhY2VzKCkubGVuZ3RoID09IDEpIHsgLy8gZW5zdXJlIHN1cGVyaW50ZXJmYWNlcyBhcmUgcmVzb2x2ZWQgYmVmb3JlIGNoZWNraW5nCiAJCQkJaWYgKHJlZlNjb3BlICE9IG51bGwpCi0JCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2Uoc3VwZXJJbnRlcmZhY2VzWzBdKTsKLQkJCQlyZXR1cm4gc3VwZXJJbnRlcmZhY2VzWzBdLmdldEV4YWN0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCByZWZTY29wZSk7CisJCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2UodGhpcy5zdXBlckludGVyZmFjZXNbMF0pOworCQkJCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlc1swXS5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgcmVmU2NvcGUpOwogCQkJIH0KIAkJfSBlbHNlIGlmIChzdXBlcmNsYXNzKCkgIT0gbnVsbCkgeyAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZXNvbHZlZCBiZWZvcmUgY2hlY2tpbmcKIAkJCWlmIChyZWZTY29wZSAhPSBudWxsKQotCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2Uoc3VwZXJjbGFzcyk7Ci0JCQlyZXR1cm4gc3VwZXJjbGFzcy5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgcmVmU2NvcGUpOworCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2UodGhpcy5zdXBlcmNsYXNzKTsKKwkJCXJldHVybiB0aGlzLnN1cGVyY2xhc3MuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHJlZlNjb3BlKTsKIAkJfQogCX0KIAlyZXR1cm4gbnVsbDsKQEAgLTc0OSw3ICs4NzksNyBAQAogCQkJaW50IHByZWZpeExlbmd0aCA9IHRoaXMuY29tcG91bmROYW1lW3RoaXMuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLmxlbmd0aCArIDE7IC8vIGVuY2xvc2luZyQKIAkJCWlmIChuYW1lLmxlbmd0aCA9PSAocHJlZml4TGVuZ3RoICsgdHlwZU5hbWUubGVuZ3RoKSkgLy8gZW5jbG9zaW5nICQgdHlwZU5hbWUKIAkJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyh0eXBlTmFtZSwgbmFtZSwgcHJlZml4TGVuZ3RoLCB0cnVlKSkgLy8gb25seSBjaGVjayB0cmFpbGluZyBwb3J0aW9uCi0JCQkJCXJldHVybiB0aGlzLm1lbWJlclR5cGVzW2ldID0gcmVzb2x2ZVR5cGUobWVtYmVyVHlwZSwgdGhpcy5lbnZpcm9ubWVudCwgZmFsc2UpOyAvLyBubyByYXcgY29udmVyc2lvbiBmb3Igbm93CisJCQkJCXJldHVybiB0aGlzLm1lbWJlclR5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVUeXBlKG1lbWJlclR5cGUsIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uIGZvciBub3cgKi8pOwogCSAgICB9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBtZW1iZXJUeXBlLnNvdXJjZU5hbWUpKSB7CiAJICAgICAgICByZXR1cm4gbWVtYmVyVHlwZTsKIAkgICAgfQpAQCAtNzY1LDcgKzg5NSw3IEBACiAJCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQgKyAxOwogCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZSkgIT0gMCkgewogCQkJCS8vIHNpbXBseSBjbG9uZSBtZXRob2Qgc3Vic2V0Ci0JCQkJTWV0aG9kQmluZGluZ1tdIHJlc3VsdDsJCQkJCisJCQkJTWV0aG9kQmluZGluZ1tdIHJlc3VsdDsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kcywgc3RhcnQsIHJlc3VsdCA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KQEAgLTc4NiwyMSArOTE2LDYyIEBACiAJCU1ldGhvZEJpbmRpbmdbXSByZXN1bHQgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGhdOwogCQkvLyBpdGVyYXRlIG1ldGhvZHMgdG8gcmVzb2x2ZSB0aGVtCiAJCWZvciAoaW50IGkgPSBzdGFydCwgaW5kZXggPSAwOyBpIDw9IGVuZDsgaSsrLCBpbmRleCsrKQotCQkJcmVzdWx0W2luZGV4XSA9IHJlc29sdmVUeXBlc0ZvcihtZXRob2RzW2ldKTsKKwkJCXJlc3VsdFtpbmRleF0gPSByZXNvbHZlVHlwZXNGb3IodGhpcy5tZXRob2RzW2ldKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsKIH0KKy8vIEFuc3dlciBtZXRob2RzIG5hbWVkIHNlbGVjdG9yLCB3aGljaCB0YWtlIG5vIG1vcmUgdGhhbiB0aGUgc3VnZ2VzdGVkUGFyYW1ldGVyTGVuZ3RoLgorLy8gVGhlIHN1Z2dlc3RlZCBwYXJhbWV0ZXIgbGVuZ3RoIGlzIG9wdGlvbmFsIGFuZCBtYXkgbm90IGJlIGd1YXJhbnRlZWQgYnkgZXZlcnkgdHlwZS4KK3B1YmxpYyBNZXRob2RCaW5kaW5nW10gZ2V0TWV0aG9kcyhjaGFyW10gc2VsZWN0b3IsIGludCBzdWdnZXN0ZWRQYXJhbWV0ZXJMZW5ndGgpIHsKKwlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlTWV0aG9kc0NvbXBsZXRlKSAhPSAwKQorCQlyZXR1cm4gZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CisJLy8gbGF6aWx5IHNvcnQgbWV0aG9kcworCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzU29ydGVkKSA9PSAwKSB7CisJCWludCBsZW5ndGggPSB0aGlzLm1ldGhvZHMubGVuZ3RoOworCQlpZiAobGVuZ3RoID4gMSkKKwkJCVJlZmVyZW5jZUJpbmRpbmcuc29ydE1ldGhvZHModGhpcy5tZXRob2RzLCAwLCBsZW5ndGgpOworCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVNZXRob2RzU29ydGVkOworCX0KKwlsb25nIHJhbmdlOworCWlmICgocmFuZ2UgPSBSZWZlcmVuY2VCaW5kaW5nLmJpbmFyeVNlYXJjaChzZWxlY3RvciwgdGhpcy5tZXRob2RzKSkgPj0gMCkgeworCQlpbnQgc3RhcnQgPSAoaW50KSByYW5nZSwgZW5kID0gKGludCkgKHJhbmdlID4+IDMyKTsKKwkJaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisJCQlpbnQgbGVuID0gdGhpcy5tZXRob2RzW2ldLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJaWYgKGxlbiA8PSBzdWdnZXN0ZWRQYXJhbWV0ZXJMZW5ndGggfHwgKHRoaXMubWV0aG9kc1tpXS5pc1ZhcmFyZ3MoKSAmJiBsZW4gPT0gc3VnZ2VzdGVkUGFyYW1ldGVyTGVuZ3RoICsgMSkpCisJCQkJY291bnQrKzsKKwkJfQorCQlpZiAoY291bnQgPT0gMCkgeworCQkJTWV0aG9kQmluZGluZ1tdIHJlc3VsdCA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF07CisJCQkvLyBpdGVyYXRlIG1ldGhvZHMgdG8gcmVzb2x2ZSB0aGVtCisJCQlmb3IgKGludCBpID0gc3RhcnQsIGluZGV4ID0gMDsgaSA8PSBlbmQ7IGkrKykKKwkJCQlyZXN1bHRbaW5kZXgrK10gPSByZXNvbHZlVHlwZXNGb3IodGhpcy5tZXRob2RzW2ldKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlNZXRob2RCaW5kaW5nW10gcmVzdWx0ID0gbmV3IE1ldGhvZEJpbmRpbmdbY291bnRdOworCQkJLy8gaXRlcmF0ZSBtZXRob2RzIHRvIHJlc29sdmUgdGhlbQorCQkJZm9yIChpbnQgaSA9IHN0YXJ0LCBpbmRleCA9IDA7IGkgPD0gZW5kOyBpKyspIHsKKwkJCQlpbnQgbGVuID0gdGhpcy5tZXRob2RzW2ldLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJCWlmIChsZW4gPD0gc3VnZ2VzdGVkUGFyYW1ldGVyTGVuZ3RoIHx8ICh0aGlzLm1ldGhvZHNbaV0uaXNWYXJhcmdzKCkgJiYgbGVuID09IHN1Z2dlc3RlZFBhcmFtZXRlckxlbmd0aCArIDEpKQorCQkJCQlyZXN1bHRbaW5kZXgrK10gPSByZXNvbHZlVHlwZXNGb3IodGhpcy5tZXRob2RzW2ldKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisJcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsKK30KIHB1YmxpYyBib29sZWFuIGhhc01lbWJlclR5cGVzKCkgewogICAgIHJldHVybiB0aGlzLm1lbWJlclR5cGVzLmxlbmd0aCA+IDA7CiB9CiAvLyBOT1RFOiBtZW1iZXIgdHlwZXMgb2YgYmluYXJ5IHR5cGVzIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIFR5cGVWYXJpYWJsZUJpbmRpbmcgZ2V0VHlwZVZhcmlhYmxlKGNoYXJbXSB2YXJpYWJsZU5hbWUpIHsKIAlUeXBlVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlID0gc3VwZXIuZ2V0VHlwZVZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7Ci0JdmFyaWFibGUucmVzb2x2ZSh0aGlzLmVudmlyb25tZW50KTsKKwl2YXJpYWJsZS5yZXNvbHZlKCk7CiAJcmV0dXJuIHZhcmlhYmxlOwogfQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSwgVHlwZVZhcmlhYmxlQmluZGluZ1tdIGV4aXN0aW5nVmFyaWFibGVzLCBTaWduYXR1cmVXcmFwcGVyIHdyYXBwZXIpIHsKK3ByaXZhdGUgdm9pZCBpbml0aWFsaXplVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUsIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSBleGlzdGluZ1ZhcmlhYmxlcywgU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLCBjaGFyW11bXVtdIG1pc3NpbmdUeXBlTmFtZXMpIHsKIAkvLyBQYXJhbWV0ZXJTaWduYXR1cmUgPSBJZGVudGlmaWVyICc6JyBUeXBlU2lnbmF0dXJlCiAJLy8gICBvciBJZGVudGlmaWVyICc6JyBUeXBlU2lnbmF0dXJlKG9wdGlvbmFsKSBJbnRlcmZhY2VCb3VuZChzKQogCS8vIEludGVyZmFjZUJvdW5kID0gJzonIFR5cGVTaWduYXR1cmUKQEAgLTgwOCw5ICs5NzksMTUgQEAKIAl3cmFwcGVyLnN0YXJ0ID0gY29sb24gKyAxOyAvLyBza2lwIG5hbWUgKyAnOicKIAlSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIGZpcnN0Qm91bmQgPSBudWxsOwogCWlmICh3cmFwcGVyLnNpZ25hdHVyZVt3cmFwcGVyLnN0YXJ0XSA9PSAnOicpIHsKLQkJdHlwZSA9IGVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIG51bGwpOworCQl0eXBlID0gdGhpcy5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCBudWxsKTsKIAl9IGVsc2UgewotCQl0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGVudmlyb25tZW50LmdldFR5cGVGcm9tVHlwZVNpZ25hdHVyZSh3cmFwcGVyLCBleGlzdGluZ1ZhcmlhYmxlcywgdGhpcyk7CisJCVR5cGVCaW5kaW5nIHR5cGVGcm9tVHlwZVNpZ25hdHVyZSA9IHRoaXMuZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKHdyYXBwZXIsIGV4aXN0aW5nVmFyaWFibGVzLCB0aGlzLCBtaXNzaW5nVHlwZU5hbWVzKTsKKwkJaWYgKHR5cGVGcm9tVHlwZVNpZ25hdHVyZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCXR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZUZyb21UeXBlU2lnbmF0dXJlOworCQl9IGVsc2UgeworCQkJLy8gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JydXB0ZWQgKDMzMjQyMykKKwkJCXR5cGUgPSB0aGlzLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIG51bGwpOworCQl9CiAJCWZpcnN0Qm91bmQgPSB0eXBlOwogCX0KIApAQCAtODIzLDcgKzEwMDAsNyBAQAogCQlqYXZhLnV0aWwuQXJyYXlMaXN0IHR5cGVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoMik7CiAJCWRvIHsKIAkJCXdyYXBwZXIuc3RhcnQrKzsgLy8gc2tpcCAnOicKLQkJCXR5cGVzLmFkZChlbnZpcm9ubWVudC5nZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgZXhpc3RpbmdWYXJpYWJsZXMsIHRoaXMpKTsKKwkJCXR5cGVzLmFkZCh0aGlzLmVudmlyb25tZW50LmdldFR5cGVGcm9tVHlwZVNpZ25hdHVyZSh3cmFwcGVyLCBleGlzdGluZ1ZhcmlhYmxlcywgdGhpcywgbWlzc2luZ1R5cGVOYW1lcykpOwogCQl9IHdoaWxlICh3cmFwcGVyLnNpZ25hdHVyZVt3cmFwcGVyLnN0YXJ0XSA9PSAnOicpOwogCQlib3VuZHMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1t0eXBlcy5zaXplKCldOwogCQl0eXBlcy50b0FycmF5KGJvdW5kcyk7CkBAIC04NDQsNyArMTAyMSwxNiBAQAogCWlmIChvdGhlclR5cGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCXN3aXRjaChvdGhlclR5cGUua2luZCgpKSB7CiAJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKIAkJCXJldHVybiAoKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlKS5ib3VuZENoZWNrKHRoaXMpOworCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFOgorCQkvKiBXaXRoIHRoZSBoeWJyaWQgMS40LzEuNSsgcHJvamVjdHMgbW9kZXMsIHdoaWxlIGVzdGFibGlzaGluZyB0eXBlIGVxdWl2YWxlbmNlLCB3ZSBuZWVkIHRvCisJICAgICAgIGJlIHByZXBhcmVkIGZvciBhIHR5cGUgc3VjaCBhcyBNYXAgYXBwZWFyaW5nIGluIG9uZSBvZiB0aHJlZSBmb3JtczogQXMgKGEpIGEgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIAorCSAgICAgICBlLmcgTWFwPFN0cmluZywgU3RyaW5nPiwgKGIpIGFzIFJhd1R5cGVCaW5kaW5nIE1hcCNSQVcgYW5kIGZpbmFsbHkgKGMpIGFzIGEgQmluYXJ5VHlwZUJpbmRpbmcgCisJICAgICAgIFdoZW4gdGhlIHVzYWdlIG9mIGEgdHlwZSBsYWNrcyB0eXBlIHBhcmFtZXRlcnMsIHdoZXRoZXIgd2UgbGFuZCB1cCB3aXRoIHRoZSByYXcgZm9ybSBvciBub3QgZGVwZW5kcworCSAgICAgICBvbiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHR5cGUgd2FzICJzZWVuIHRvIGJlIiBhIGdlbmVyaWMgdHlwZSBpbiB0aGUgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudCBvcgorCSAgICAgICBub3QuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NTY1ICYmIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg4MjcgCisJCSovIAogCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgogCQkJcmV0dXJuIG90aGVyVHlwZS5lcmFzdXJlKCkgPT0gdGhpczsKIAl9CkBAIC04NTMsMjUgKzEwMzksMjggQEAKIHB1YmxpYyBib29sZWFuIGlzR2VuZXJpY1R5cGUoKSB7CiAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTOwogfQorcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaHlDb25uZWN0ZWQoKSB7CisJcmV0dXJuICh0aGlzLnRhZ0JpdHMgJiAoVGFnQml0cy5IYXNVbnJlc29sdmVkU3VwZXJjbGFzcyB8IFRhZ0JpdHMuSGFzVW5yZXNvbHZlZFN1cGVyaW50ZXJmYWNlcykpID09IDA7Cit9CiBwdWJsaWMgaW50IGtpbmQoKSB7CiAJaWYgKHRoaXMudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQogCQlyZXR1cm4gQmluZGluZy5HRU5FUklDX1RZUEU7CiAJcmV0dXJuIEJpbmRpbmcuVFlQRTsKLX0JCit9CiAvLyBOT1RFOiBtZW1iZXIgdHlwZXMgb2YgYmluYXJ5IHR5cGVzIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcygpIHsKICAJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1VucmVzb2x2ZWRNZW1iZXJUeXBlcykgPT0gMCkKIAkJcmV0dXJuIHRoaXMubWVtYmVyVHlwZXM7CiAKIAlmb3IgKGludCBpID0gdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJdGhpcy5tZW1iZXJUeXBlc1tpXSA9IHJlc29sdmVUeXBlKHRoaXMubWVtYmVyVHlwZXNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlKTsgLy8gbm8gcmF3IGNvbnZlcnNpb24gZm9yIG5vdworCQl0aGlzLm1lbWJlclR5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVUeXBlKHRoaXMubWVtYmVyVHlwZXNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uIGZvciBub3cgKi8pOwogCXRoaXMudGFnQml0cyAmPSB+VGFnQml0cy5IYXNVbnJlc29sdmVkTWVtYmVyVHlwZXM7CiAJcmV0dXJuIHRoaXMubWVtYmVyVHlwZXM7CiB9CiAvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIGJpbmFyeSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzKCkgewogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApCi0JCXJldHVybiBtZXRob2RzOworCQlyZXR1cm4gdGhpcy5tZXRob2RzOwogCiAJLy8gbGF6aWx5IHNvcnQgbWV0aG9kcwogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzU29ydGVkKSA9PSAwKSB7CkBAIC04ODAsMTYgKzEwNjksMjAgQEAKIAkJCVJlZmVyZW5jZUJpbmRpbmcuc29ydE1ldGhvZHModGhpcy5tZXRob2RzLCAwLCBsZW5ndGgpOwogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVNZXRob2RzU29ydGVkOwogCX0KLQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJcmVzb2x2ZVR5cGVzRm9yKG1ldGhvZHNbaV0pOworCWZvciAoaW50IGkgPSB0aGlzLm1ldGhvZHMubGVuZ3RoOyAtLWkgPj0gMDspCisJCXJlc29sdmVUeXBlc0Zvcih0aGlzLm1ldGhvZHNbaV0pOwogCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZTsKLQlyZXR1cm4gbWV0aG9kczsKKwlyZXR1cm4gdGhpcy5tZXRob2RzOwogfQogcHJpdmF0ZSBGaWVsZEJpbmRpbmcgcmVzb2x2ZVR5cGVGb3IoRmllbGRCaW5kaW5nIGZpZWxkKSB7CiAJaWYgKChmaWVsZC5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQpID09IDApCiAJCXJldHVybiBmaWVsZDsKIAotCWZpZWxkLnR5cGUgPSByZXNvbHZlVHlwZShmaWVsZC50eXBlLCB0aGlzLmVudmlyb25tZW50LCBudWxsLCAwKTsKKwlUeXBlQmluZGluZyByZXNvbHZlZFR5cGUgPSByZXNvbHZlVHlwZShmaWVsZC50eXBlLCB0aGlzLmVudmlyb25tZW50LCB0cnVlIC8qIHJhdyBjb252ZXJzaW9uICovKTsKKwlmaWVsZC50eXBlID0gcmVzb2x2ZWRUeXBlOworCWlmICgocmVzb2x2ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCWZpZWxkLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwl9CiAJZmllbGQubW9kaWZpZXJzICY9IH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQ7CiAJcmV0dXJuIGZpZWxkOwogfQpAQCAtODk3LDE0ICsxMDkwLDMwIEBACiAJaWYgKChtZXRob2QubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NVbnJlc29sdmVkKSA9PSAwKQogCQlyZXR1cm4gbWV0aG9kOwogCi0JaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQltZXRob2QucmV0dXJuVHlwZSA9IHJlc29sdmVUeXBlKG1ldGhvZC5yZXR1cm5UeXBlLCB0aGlzLmVudmlyb25tZW50LCBudWxsLCAwKTsKLQlmb3IgKGludCBpID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCW1ldGhvZC5wYXJhbWV0ZXJzW2ldID0gcmVzb2x2ZVR5cGUobWV0aG9kLnBhcmFtZXRlcnNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIG51bGwsIDApOwotCWZvciAoaW50IGkgPSBtZXRob2QudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IC0taSA+PSAwOykKLQkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnNbaV0gPSByZXNvbHZlVHlwZShtZXRob2QudGhyb3duRXhjZXB0aW9uc1tpXSwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSk7Ci0JZm9yIChpbnQgaSA9IG1ldGhvZC50eXBlVmFyaWFibGVzLmxlbmd0aDsgLS1pID49IDA7KQotCQltZXRob2QudHlwZVZhcmlhYmxlc1tpXS5yZXNvbHZlKHRoaXMuZW52aXJvbm1lbnQpOworCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgeworCQlUeXBlQmluZGluZyByZXNvbHZlZFR5cGUgPSByZXNvbHZlVHlwZShtZXRob2QucmV0dXJuVHlwZSwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSAvKiByYXcgY29udmVyc2lvbiAqLyk7CisJCW1ldGhvZC5yZXR1cm5UeXBlID0gcmVzb2x2ZWRUeXBlOworCQlpZiAoKHJlc29sdmVkVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJbWV0aG9kLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJfQorCX0KKwlmb3IgKGludCBpID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZVR5cGUobWV0aG9kLnBhcmFtZXRlcnNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIHRydWUgLyogcmF3IGNvbnZlcnNpb24gKi8pOworCQltZXRob2QucGFyYW1ldGVyc1tpXSA9IHJlc29sdmVkVHlwZTsKKwkJaWYgKChyZXNvbHZlZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCW1ldGhvZC50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCX0KKwl9CisJZm9yIChpbnQgaSA9IG1ldGhvZC50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVUeXBlKG1ldGhvZC50aHJvd25FeGNlcHRpb25zW2ldLCB0aGlzLmVudmlyb25tZW50LCB0cnVlIC8qIHJhdyBjb252ZXJzaW9uICovKTsKKwkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnNbaV0gPSByZXNvbHZlZFR5cGU7CisJCWlmICgocmVzb2x2ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQltZXRob2QudGFnQml0cyB8PSBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQl9CisJfQorCWZvciAoaW50IGkgPSBtZXRob2QudHlwZVZhcmlhYmxlcy5sZW5ndGg7IC0taSA+PSAwOykgeworCQltZXRob2QudHlwZVZhcmlhYmxlc1tpXS5yZXNvbHZlKCk7CisJfQogCW1ldGhvZC5tb2RpZmllcnMgJj0gfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZDsKIAlyZXR1cm4gbWV0aG9kOwogfQpAQCAtOTI4LDcgKzExMzcsNyBAQAogCQlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzOwogCiAJLy8gZmluaXNoIHJlc29sdmluZyB0aGUgdHlwZQotCXRoaXMuc3VwZXJjbGFzcyA9IHJlc29sdmVUeXBlKHRoaXMuc3VwZXJjbGFzcywgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSk7CisJdGhpcy5zdXBlcmNsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlc29sdmVUeXBlKHRoaXMuc3VwZXJjbGFzcywgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSAvKiByYXcgY29udmVyc2lvbiAqLyk7CiAJdGhpcy50YWdCaXRzICY9IH5UYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmNsYXNzOwogCWlmICh0aGlzLnN1cGVyY2xhc3MucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpCiAJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOyAvLyBwcm9wYWdhdGUgdHlwZSBpbmNvbnNpc3RlbmN5CkBAIC05NDAsNyArMTE0OSw3IEBACiAJCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlczsKIAogCWZvciAoaW50IGkgPSB0aGlzLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IC0taSA+PSAwOykgewotCQl0aGlzLnN1cGVySW50ZXJmYWNlc1tpXSA9IHJlc29sdmVUeXBlKHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldLCB0aGlzLmVudmlyb25tZW50LCB0cnVlKTsKKwkJdGhpcy5zdXBlckludGVyZmFjZXNbaV0gPSAoUmVmZXJlbmNlQmluZGluZykgcmVzb2x2ZVR5cGUodGhpcy5zdXBlckludGVyZmFjZXNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIHRydWUgLyogcmF3IGNvbnZlcnNpb24gKi8pOwogCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXNbaV0ucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpCiAJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsgLy8gcHJvcGFnYXRlIHR5cGUgaW5jb25zaXN0ZW5jeQogCX0KQEAgLTk1Miw3ICsxMTYxLDcgQEAKIAkJcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlczsKIAogIAlmb3IgKGludCBpID0gdGhpcy50eXBlVmFyaWFibGVzLmxlbmd0aDsgLS1pID49IDA7KQotCQl0aGlzLnR5cGVWYXJpYWJsZXNbaV0ucmVzb2x2ZSh0aGlzLmVudmlyb25tZW50KTsKKwkJdGhpcy50eXBlVmFyaWFibGVzW2ldLnJlc29sdmUoKTsKIAl0aGlzLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSGFzVW5yZXNvbHZlZFR5cGVWYXJpYWJsZXM7CiAJcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlczsKIH0KQEAgLTk3MCw1NSArMTE3OSw3MCBAQAogCWlmIChpc0VudW0oKSkgYnVmZmVyLmFwcGVuZCgiZW51bSAiKTsgLy8kTk9OLU5MUy0xJAogCWVsc2UgaWYgKGlzQW5ub3RhdGlvblR5cGUoKSkgYnVmZmVyLmFwcGVuZCgiQGludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAogCWVsc2UgaWYgKGlzQ2xhc3MoKSkgYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKLQllbHNlIGJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAkKLQlidWZmZXIuYXBwZW5kKChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKKwllbHNlIGJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoKHRoaXMuY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyh0aGlzLmNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKIAorCWlmICh0aGlzLnR5cGVWYXJpYWJsZXMgPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCI8TlVMTCBUWVBFIFZBUklBQkxFUz4iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSBpZiAodGhpcy50eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJYnVmZmVyLmFwcGVuZCgiPCIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpICA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh0aGlzLnR5cGVWYXJpYWJsZXNbaV0gPT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIk5VTEwgVFlQRSBWQVJJQUJMRSIpOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisJCQljaGFyW10gdmFyQ2hhcnMgPSB0aGlzLnR5cGVWYXJpYWJsZXNbaV0udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJYnVmZmVyLmFwcGVuZCh2YXJDaGFycywgMSwgdmFyQ2hhcnMubGVuZ3RoIC0gMik7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJfQogCWJ1ZmZlci5hcHBlbmQoIlxuXHRleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZCgoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCh0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCkgPyB0aGlzLnN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKIAotCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgewotCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CiAJCQlidWZmZXIuYXBwZW5kKCJcblx0aW1wbGVtZW50cyA6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoaSAgPiAwKQogCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZCgoc3VwZXJJbnRlcmZhY2VzW2ldICE9IG51bGwpID8gc3VwZXJJbnRlcmZhY2VzW2ldLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnVmZmVyLmFwcGVuZCgodGhpcy5zdXBlckludGVyZmFjZXNbaV0gIT0gbnVsbCkgPyB0aGlzLnN1cGVySW50ZXJmYWNlc1tpXS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZCgiTlVMTCBTVVBFUklOVEVSRkFDRVMiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKKwlpZiAodGhpcy5lbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKIAkJYnVmZmVyLmFwcGVuZCgiXG5cdGVuY2xvc2luZyB0eXBlIDogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChlbmNsb3NpbmdUeXBlLmRlYnVnTmFtZSgpKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmVuY2xvc2luZ1R5cGUuZGVidWdOYW1lKCkpOwogCX0KIAotCWlmIChmaWVsZHMgIT0gbnVsbCkgewotCQlpZiAoZmllbGRzICE9IEJpbmRpbmcuTk9fRklFTERTKSB7CisJaWYgKHRoaXMuZmllbGRzICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuZmllbGRzICE9IEJpbmRpbmcuTk9fRklFTERTKSB7CiAJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgZmllbGRzICAgKi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlidWZmZXIuYXBwZW5kKChmaWVsZHNbaV0gIT0gbnVsbCkgPyAiXG4iICsgZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIEZJRUxEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCWJ1ZmZlci5hcHBlbmQoKHRoaXMuZmllbGRzW2ldICE9IG51bGwpID8gIlxuIiArIHRoaXMuZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIEZJRUxEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZCgiTlVMTCBGSUVMRFMiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJaWYgKG1ldGhvZHMgIT0gQmluZGluZy5OT19NRVRIT0RTKSB7CisJaWYgKHRoaXMubWV0aG9kcyAhPSBudWxsKSB7CisJCWlmICh0aGlzLm1ldGhvZHMgIT0gQmluZGluZy5OT19NRVRIT0RTKSB7CiAJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgbWV0aG9kcyAgICovIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJCWJ1ZmZlci5hcHBlbmQoKG1ldGhvZHNbaV0gIT0gbnVsbCkgPyAiXG4iICsgbWV0aG9kc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBNRVRIT0QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCWJ1ZmZlci5hcHBlbmQoKHRoaXMubWV0aG9kc1tpXSAhPSBudWxsKSA/ICJcbiIgKyB0aGlzLm1ldGhvZHNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgTUVUSE9EIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZCgiTlVMTCBNRVRIT0RTIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgewotCQlpZiAobWVtYmVyVHlwZXMgIT0gQmluZGluZy5OT19NRU1CRVJfVFlQRVMpIHsKKwlpZiAodGhpcy5tZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCWlmICh0aGlzLm1lbWJlclR5cGVzICE9IEJpbmRpbmcuTk9fTUVNQkVSX1RZUEVTKSB7CiAJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgbWVtYmVycyAgICovIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlidWZmZXIuYXBwZW5kKChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBUWVBFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJYnVmZmVyLmFwcGVuZCgodGhpcy5tZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/ICJcbiIgKyB0aGlzLm1lbWJlclR5cGVzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIFRZUEUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9IGVsc2UgewogCQlidWZmZXIuYXBwZW5kKCJOVUxMIE1FTUJFUiBUWVBFUyIpOyAvLyROT04tTkxTLTEkCkBAIC0xMDI4LDYgKzEyNTIsMTAgQEAKIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiBNZXRob2RCaW5kaW5nW10gdW5SZXNvbHZlZE1ldGhvZHMoKSB7IC8vIGZvciB0aGUgTWV0aG9kVmVyaWZpZXIgc28gaXQgZG9lc24ndCByZXNvbHZlIHR5cGVzCi0JcmV0dXJuIG1ldGhvZHM7CisJcmV0dXJuIHRoaXMubWV0aG9kczsKK30KKworcHVibGljIEZpZWxkQmluZGluZ1tdIHVuUmVzb2x2ZWRGaWVsZHMoKSB7CisJcmV0dXJuIHRoaXMuZmllbGRzOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmcuamF2YQppbmRleCBiODdjZDNhLi5kMGU3NjllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSw3ICsyOSw4IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFXX1RZUEUgPSBUWVBFIHwgQVNUTm9kZS5CaXQxMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX1RZUEUgPSBUWVBFIHwgQVNUTm9kZS5CaXQxMjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BBUkFNRVRFUiA9IFRZUEUgfCBBU1ROb2RlLkJpdDEzOwotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSU0VDVElPTl9UWVBFID0gVFlQRSB8IEFTVE5vZGUuQml0MTQ7CisKIAkvLyBTaGFyZWQgYmluZGluZyBjb2xsZWN0aW9ucwogCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUJpbmRpbmdbXSBOT19UWVBFUyA9IG5ldyBUeXBlQmluZGluZ1swXTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVCaW5kaW5nW10gTk9fUEFSQU1FVEVSUyA9IG5ldyBUeXBlQmluZGluZ1swXTsKQEAgLTQzLDYgKzQ0LDEwIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uQmluZGluZ1tdIE5PX0FOTk9UQVRJT05TID0gbmV3IEFubm90YXRpb25CaW5kaW5nWzBdOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgRWxlbWVudFZhbHVlUGFpcltdIE5PX0VMRU1FTlRfVkFMVUVfUEFJUlMgPSBuZXcgRWxlbWVudFZhbHVlUGFpclswXTsKIAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRmllbGRCaW5kaW5nW10gVU5JTklUSUFMSVpFRF9GSUVMRFMgPSBuZXcgRmllbGRCaW5kaW5nWzBdOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kQmluZGluZ1tdIFVOSU5JVElBTElaRURfTUVUSE9EUyA9IG5ldyBNZXRob2RCaW5kaW5nWzBdOworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlQmluZGluZ1tdIFVOSU5JVElBTElaRURfUkVGRVJFTkNFX1RZUEVTID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbMF07CisKIAkvKgogCSogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgogCSovCkBAIC01NSwxMyArNjAsMTMgQEAKIAkJcmV0dXJuIGNvbXB1dGVVbmlxdWVLZXkodHJ1ZS8qbGVhZiovKTsKIAl9CiAJLyoKLQkgKiBDb21wdXRlcyBhIGtleSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBiaW5kaW5nLiBPcHRpbmFseSBpbmNsdWRlIGFjY2VzcyBmbGFncy4KKwkgKiBDb21wdXRlcyBhIGtleSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBiaW5kaW5nLiBPcHRpb25hbGx5IGluY2x1ZGUgYWNjZXNzIGZsYWdzLgogCSAqIFJldHVybnMgbnVsbCBpZiBiaW5kaW5nIGlzIG5vdCBhIFR5cGVCaW5kaW5nLCBhIE1ldGhvZEJpbmRpbmcsIGEgRmllbGRCaW5kaW5nIG9yIGEgUGFja2FnZUJpbmRpbmcuCiAJICovCiAJcHVibGljIGNoYXJbXSBjb21wdXRlVW5pcXVlS2V5KGJvb2xlYW4gaXNMZWFmKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIENvbXB1dGUgdGhlIHRhZ2JpdHMgZm9yIHN0YW5kYXJkIGFubm90YXRpb25zLiBGb3Igc291cmNlIHR5cGVzLCB0aGVzZSBjb3VsZCByZXF1aXJlCiAJICogbGF6aWx5IHJlc29sdmluZyBjb3JyZXNwb25kaW5nIGFubm90YXRpb24gbm9kZXMsIGluIGNhc2Ugb2YgZm9yd2FyZCByZWZlcmVuY2VzLgpAQCAtNzAsNyArNzUsNyBAQAogCXB1YmxpYyBsb25nIGdldEFubm90YXRpb25UYWdCaXRzKCkgewogCQlyZXR1cm4gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb21wdXRlIHRoZSB0YWcgYml0cyBmb3IgQERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMsIGF2b2lkaW5nIHJlc29sdmluZwogCSAqIGVudGlyZSBhbm5vdGF0aW9uIGlmIG5vdCBuZWNlc3NhcnkuCkBAIC03OCw3ICs4Myw3IEBACiAJICovCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlcHJlY2F0ZWRBbm5vdGF0aW9uVGFnQml0cygpIHsKIAkJLy8gZW1wdHkgYmxvY2sKLQl9CQorCX0KIAogCS8qIEFQSQogCSogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIG5vdCBhIHByb2JsZW0gYmluZGluZwpAQCAtODYsOSArOTEsMTYgQEAKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkQmluZGluZygpIHsKIAkJcmV0dXJuIHByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vRXJyb3I7CiAJfQorCXB1YmxpYyBib29sZWFuIGlzVm9sYXRpbGUoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CiAJLyogQVBJCiAJKiBBbnN3ZXIgdGhlIHByb2JsZW0gaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KIAkqIE5vRXJyb3IgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdmFsaWQgYmluZGluZy4KKwkqIE5vdGU6IGEgcGFyYW1ldGVyaXplZCB0eXBlIG9yIGFuIGFycmF5IHR5cGUgYXJlIGFsd2F5cyB2YWxpZCwgYnV0IG1heSBiZSBmb3JtZWQgb2YgaW52YWxpZCBwaWVjZXMuCiAJKi8KIAkvLyBUT0RPIChwaGlsaXBwZSkgc2hvdWxkIHJlbmFtZSBpbnRvIHByb2JsZW1SZWFzb24oKQogCXB1YmxpYyBpbnQgcHJvYmxlbUlkKCkgewpAQCAtOTgsNyArMTEwLDcgQEAKIAkqLwogCXB1YmxpYyBhYnN0cmFjdCBjaGFyW10gcmVhZGFibGVOYW1lKCk7CiAJLyogU2hvcnRlciBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyIChubyBxdWFsaWZpZWQgdHlwZSkKLQkgKi8JCisJICovCiAJcHVibGljIGNoYXJbXSBzaG9ydFJlYWRhYmxlTmFtZSgpewogCQlyZXR1cm4gcmVhZGFibGVOYW1lKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jsb2NrU2NvcGUuamF2YQppbmRleCAyMWI5MDM5Li5iMzYxM2E3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jsb2NrU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jsb2NrU2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCw3ICsyOCw3IEBACiAKIAkvLyBmaW5hbGx5IHNjb3BlcyBtdXN0IGJlIHNoaWZ0ZWQgYmVoaW5kIHJlc3BlY3RpdmUgdHJ5JmNhdGNoIHNjb3BlKHMpIHNvIGFzIHRvIGF2b2lkCiAJLy8gY29sbGlzaW9ucyBvZiBzZWNyZXQgdmFyaWFibGVzIChyZXR1cm4gYWRkcmVzcywgc2F2ZSB2YWx1ZSkuCi0JcHVibGljIEJsb2NrU2NvcGVbXSBzaGlmdFNjb3BlczsgCisJcHVibGljIEJsb2NrU2NvcGVbXSBzaGlmdFNjb3BlczsKIAogCXB1YmxpYyBTY29wZVtdIHN1YnNjb3BlcyA9IG5ldyBTY29wZVsxXTsgLy8gbmVlZCBhY2Nlc3MgZnJvbSBjb2RlIGFzc2lzdAogCXB1YmxpYyBpbnQgc3Vic2NvcGVDb3VudCA9IDA7IC8vIG5lZWQgYWNjZXNzIGZyb20gY29kZSBhc3Npc3QKQEAgLTk0LDkgKzk0LDkgQEAKIAkJCXRoaXMubG9jYWxJbmRleCk7CiAJdGhpcy5sb2NhbHNbdGhpcy5sb2NhbEluZGV4KytdID0gYmluZGluZzsKIAotCS8vIHVwZGF0ZSBsb2NhbCB2YXJpYWJsZSBiaW5kaW5nIAorCS8vIHVwZGF0ZSBsb2NhbCB2YXJpYWJsZSBiaW5kaW5nCiAJYmluZGluZy5kZWNsYXJpbmdTY29wZSA9IHRoaXM7Ci0JYmluZGluZy5pZCA9IHRoaXMub3V0ZXJNb3N0TWV0aG9kU2NvcGUoKS5hbmFseXNpc0luZGV4Kys7CisJYmluZGluZy5pZCA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkuYW5hbHlzaXNJbmRleCsrOwogCS8vIHNoYXJlIHRoZSBvdXRlcm1vc3QgbWV0aG9kIHNjb3BlIGFuYWx5c2lzSW5kZXgKIH0KIApAQCAtMTExLDkgKzExMSw5IEBACiAJdGhpcy5zdWJzY29wZXNbdGhpcy5zdWJzY29wZUNvdW50KytdID0gY2hpbGRTY29wZTsKIH0KIAotLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHN1aXRhYmxlIGZvciBhc3NpZ25pbmcgZmluYWwgYmxhbmsgZmllbGRzLgotICoKLSAqIGluIG90aGVyIHdvcmRzLCBpdCBpcyBpbnNpZGUgYW4gaW5pdGlhbGl6ZXIsIGEgY29uc3RydWN0b3Igb3IgYSBjbGluaXQgCisvKioKKyAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBzdWl0YWJsZSBmb3IgYXNzaWduaW5nIGZpbmFsIGJsYW5rIGZpZWxkcy4KKyAqIGluIG90aGVyIHdvcmRzLCBpdCBpcyBpbnNpZGUgYW4gaW5pdGlhbGl6ZXIsIGEgY29uc3RydWN0b3Igb3IgYSBjbGluaXQKICAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KEZpZWxkQmluZGluZyBiaW5kaW5nKSB7CiAJaWYgKGVuY2xvc2luZ1JlY2VpdmVyVHlwZSgpICE9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCkBAIC0xNDYsOSArMTQ2LDkgQEAKIAkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTW9kaWZpZXJGb3JWYXJpYWJsZSh2YXJCaW5kaW5nLmRlY2xhcmF0aW9uLCB0aGlzIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpOwogCX0KIAlpbnQgcmVhbE1vZGlmaWVycyA9IG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWc7Ci0JCisKIAlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWw7Ci0JaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCAmJiB2YXJCaW5kaW5nLmRlY2xhcmF0aW9uICE9IG51bGwpeyAKKwlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwICYmIHZhckJpbmRpbmcuZGVjbGFyYXRpb24gIT0gbnVsbCl7CiAJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvclZhcmlhYmxlKHZhckJpbmRpbmcuZGVjbGFyYXRpb24sIHRoaXMgaW5zdGFuY2VvZiBNZXRob2RTY29wZSk7CiAJfQogCXZhckJpbmRpbmcubW9kaWZpZXJzID0gbW9kaWZpZXJzOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIC8qIENvbXB1dGUgdmFyaWFibGUgcG9zaXRpb25zIGluIHNjb3BlcyBnaXZlbiBhbiBpbml0aWFsIHBvc2l0aW9uIG9mZnNldAogICogaWdub3JpbmcgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLSAqIAorICoKICAqIE5vIGFyZ3VtZW50IGlzIGV4cGVjdGVkIGhlcmUgKGlsb2NhbCBpcyB0aGUgZmlyc3Qgbm9uLWFyZ3VtZW50IGxvY2FsIG9mIHRoZSBvdXRlcm1vc3Qgc2NvcGUpCiAgKiBBcmd1bWVudHMgYXJlIG1hbmFnZWQgYnkgdGhlIE1ldGhvZFNjb3BlIG1ldGhvZAogICovCkBAIC0xODYsMzAgKzE4NiwzMSBAQAogCQkJfQogCQkJaGFzTW9yZVNjb3BlcyA9ICsraXNjb3BlIDwgbWF4U2NvcGVzOwogCQl9IGVsc2UgewotCQkJCisKIAkJCS8vIGNvbnNpZGVyIHZhcmlhYmxlIGZpcnN0CiAJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IHRoaXMubG9jYWxzW2lsb2NhbF07IC8vIGlmIG5vIGxvY2FsIGF0IGFsbCwgd2lsbCBiZSBsb2NhbHNbaWxvY2FsXT09bnVsbAotCQkJCisKIAkJCS8vIGNoZWNrIGlmIHZhcmlhYmxlIGlzIGFjdHVhbGx5IHVzZWQsIGFuZCBtYXkgZm9yY2UgaXQgdG8gYmUgcHJlc2VydmVkCi0JCQlib29sZWFuIGdlbmVyYXRlQ3VycmVudExvY2FsVmFyID0gKGxvY2FsLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRCAmJiBsb2NhbC5jb25zdGFudCgpID09IENvbnN0YW50Lk5vdEFDb25zdGFudCk7Ci0JCQkJCisJCQlib29sZWFuIGdlbmVyYXRlQ3VycmVudExvY2FsVmFyID0gKGxvY2FsLnVzZUZsYWcgPiBMb2NhbFZhcmlhYmxlQmluZGluZy5VTlVTRUQgJiYgbG9jYWwuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpOworCiAJCQkvLyBkbyBub3QgcmVwb3J0IGZha2UgdXNlZCB2YXJpYWJsZQogCQkJaWYgKGxvY2FsLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVU5VU0VECiAJCQkJJiYgKGxvY2FsLmRlY2xhcmF0aW9uICE9IG51bGwpIC8vIHVudXNlZCAoYW5kIG5vbiBzZWNyZXQpIGxvY2FsCiAJCQkJJiYgKChsb2NhbC5kZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0xvY2FsRGVjbGFyYXRpb25SZWFjaGFibGUpICE9IDApKSB7IC8vIGRlY2xhcmF0aW9uIGlzIHJlYWNoYWJsZQotCQkJCQkKLQkJCQlpZiAoIShsb2NhbC5kZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFyZ3VtZW50KSkgIC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIGNhdGNoIGFyZ3VtZW50cwotCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZExvY2FsVmFyaWFibGUobG9jYWwuZGVjbGFyYXRpb24pOworCisJCQkJaWYgKCEobG9jYWwuZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBcmd1bWVudCkpIC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIGNhdGNoIGFyZ3VtZW50cworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRMb2NhbFZhcmlhYmxlKGxvY2FsLmRlY2xhcmF0aW9uKTsKIAkJCX0KLQkJCQorCiAJCQkvLyBjb3VsZCBiZSBvcHRpbWl6ZWQgb3V0LCBidXQgZG9lcyBuZWVkIHRvIHByZXNlcnZlIHVucmVhZCB2YXJpYWJsZXMgPwogCQkJaWYgKCFnZW5lcmF0ZUN1cnJlbnRMb2NhbFZhcikgewogCQkJCWlmIChsb2NhbC5kZWNsYXJhdGlvbiAhPSBudWxsICYmIGNvbXBpbGVyT3B0aW9ucygpLnByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMpIHsKIAkJCQkJZ2VuZXJhdGVDdXJyZW50TG9jYWxWYXIgPSB0cnVlOyAvLyBmb3JjZSBpdCB0byBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCi0JCQkJCWxvY2FsLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQkJCQlpZiAobG9jYWwudXNlRmxhZyA9PSBMb2NhbFZhcmlhYmxlQmluZGluZy5VTlVTRUQpCisJCQkJCQlsb2NhbC51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJLy8gYWxsb2NhdGUgdmFyaWFibGUKIAkJCWlmIChnZW5lcmF0ZUN1cnJlbnRMb2NhbFZhcikgewogCkBAIC0yMjUsOSArMjI2LDkgQEAKIAkJCQkJdGhpcy5vZmZzZXQrKzsKIAkJCQl9CiAJCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRkZGKSB7IC8vIG5vIG1vcmUgdGhhbiA2NTUzNSB3b3JkcyBvZiBsb2NhbHMKLQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckxvY2FsKAotCQkJCQkJbG9jYWwsIAotCQkJCQkJbG9jYWwuZGVjbGFyYXRpb24gPT0gbnVsbCA/IChBU1ROb2RlKXRoaXMubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0IDogbG9jYWwuZGVjbGFyYXRpb24pOworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckxvY2FsKAorCQkJCQkJbG9jYWwsCisJCQkJCQlsb2NhbC5kZWNsYXJhdGlvbiA9PSBudWxsID8gKEFTVE5vZGUpbWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0IDogbG9jYWwuZGVjbGFyYXRpb24pOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJbG9jYWwucmVzb2x2ZWRQb3NpdGlvbiA9IC0xOyAvLyBub3QgZ2VuZXJhdGVkCkBAIC0yNTAsOSArMjUxLDkgQEAKIAlCbG9ja1Njb3BlIG91dGVyVmFyaWFibGVTY29wZSA9IG91dGVyTG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZTsKIAlpZiAob3V0ZXJWYXJpYWJsZVNjb3BlID09IG51bGwpCiAJCXJldHVybjsgLy8gbm8gbmVlZCB0byBmdXJ0aGVyIGVtdWxhdGUgYXMgYWxyZWFkeSBpbnNlcnRlZCAodmFsJHRoaXMkMCkKLQlNZXRob2RTY29wZSBjdXJyZW50TWV0aG9kU2NvcGUgPSB0aGlzLm1ldGhvZFNjb3BlKCk7CisJTWV0aG9kU2NvcGUgY3VycmVudE1ldGhvZFNjb3BlID0gbWV0aG9kU2NvcGUoKTsKIAlpZiAob3V0ZXJWYXJpYWJsZVNjb3BlLm1ldGhvZFNjb3BlKCkgIT0gY3VycmVudE1ldGhvZFNjb3BlKSB7Ci0JCU5lc3RlZFR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJTmVzdGVkVHlwZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKIAogCQkvL2RvIG5vdGhpbmcgZm9yIG1lbWJlciB0eXBlcywgcHJlIGVtdWxhdGlvbiB3YXMgcGVyZm9ybWVkIGFscmVhZHkKIAkJaWYgKCFjdXJyZW50VHlwZS5pc0xvY2FsVHlwZSgpKSB7CkBAIC0yOTEsOSArMjkyLDkgQEAKIAlmb3IgKGludCBpID0gdGhpcy5zdWJzY29wZUNvdW50LTE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmICh0aGlzLnN1YnNjb3Blc1tpXSBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsKIAkJCUxvY2FsVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChMb2NhbFR5cGVCaW5kaW5nKSgoQ2xhc3NTY29wZSkgdGhpcy5zdWJzY29wZXNbaV0pLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKLQkJCS8vIGZyb20gMS40IG9uLCBsb2NhbCB0eXBlcyBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGFjcm9zcyBzd2l0Y2ggY2FzZSBibG9ja3MgKDUyMjIxKQkJCQkKKwkJCS8vIGZyb20gMS40IG9uLCBsb2NhbCB0eXBlcyBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGFjcm9zcyBzd2l0Y2ggY2FzZSBibG9ja3MgKDUyMjIxKQogCQkJaWYgKGNvbXBsaWFuY2UgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCAmJiBzb3VyY2VUeXBlLmVuY2xvc2luZ0Nhc2UgIT0gbnVsbCkgewotCQkJCWlmICghdGhpcy5pc0luc2lkZUNhc2Uoc291cmNlVHlwZS5lbmNsb3NpbmdDYXNlKSkgeworCQkJCWlmICghaXNJbnNpZGVDYXNlKHNvdXJjZVR5cGUuZW5jbG9zaW5nQ2FzZSkpIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJfQpAQCAtMzg1LDcgKzM4Niw3IEBACiAgKgkJT25seSBpZiBhbGwgb2YgdGhlIGlucHV0IGlzIGNvbnN1bWVkIGlzIHRoZSB0eXBlIGFuc3dlcmVkCiAgKgogICoJQWxsIG90aGVyIGNvbmRpdGlvbnMgYXJlIGVycm9ycywgYW5kIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLgotICoJCisgKgogICoJTk9URTogSWYgYSBwcm9ibGVtIGJpbmRpbmcgaXMgcmV0dXJuZWQsIHNlbmRlcnMgc2hvdWxkIGV4dHJhY3QgdGhlIGNvbXBvdW5kIG5hbWUKICAqCWZyb20gdGhlIGJpbmRpbmcgJiBub3QgYXNzdW1lIHRoZSBwcm9ibGVtIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb3VuZE5hbWUuCiAgKgpAQCAtNDM2LDcgKzQzNyw3IEBACiAJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCiAJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCiAJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKLQkJCQkJCSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKIAkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwogCQkJCWlmICghKChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nKS5jYW5CZVNlZW5CeSh0aGlzKSkKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKQEAgLTQ1Nyw0NiArNDU4LDY1IEBACiAKIAkvLyBrbm93IGJpbmRpbmcgaXMgbm93IGEgUmVmZXJlbmNlQmluZGluZwogCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwotCWJpbmRpbmcgPSBlbnZpcm9ubWVudCgpLmNvbnZlcnRUb1Jhd1R5cGUocmVmZXJlbmNlQmluZGluZyk7CisJYmluZGluZyA9IGVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZShyZWZlcmVuY2VCaW5kaW5nLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKIAlpZiAoaW52b2NhdGlvblNpdGUgaW5zdGFuY2VvZiBBU1ROb2RlKSB7CiAJCUFTVE5vZGUgaW52b2NhdGlvbk5vZGUgPSAoQVNUTm9kZSkgaW52b2NhdGlvblNpdGU7CiAJCWlmIChpbnZvY2F0aW9uTm9kZS5pc1R5cGVVc2VEZXByZWNhdGVkKHJlZmVyZW5jZUJpbmRpbmcsIHRoaXMpKSB7CiAJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZShyZWZlcmVuY2VCaW5kaW5nLCBpbnZvY2F0aW9uTm9kZSk7CiAJCX0KIAl9CisJQmluZGluZyBwcm9ibGVtRmllbGRCaW5kaW5nID0gbnVsbDsKIAl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CiAJCXJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKIAkJY2hhcltdIG5leHROYW1lID0gY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXTsKIAkJaW52b2NhdGlvblNpdGUuc2V0RmllbGRJbmRleChjdXJyZW50SW5kZXgpOwogCQlpbnZvY2F0aW9uU2l0ZS5zZXRBY3R1YWxSZWNlaXZlclR5cGUocmVmZXJlbmNlQmluZGluZyk7CiAJCWlmICgobWFzayAmIEJpbmRpbmcuRklFTEQpICE9IDAgJiYgKGJpbmRpbmcgPSBmaW5kRmllbGQocmVmZXJlbmNlQmluZGluZywgbmV4dE5hbWUsIGludm9jYXRpb25TaXRlLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgewotCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCi0JCQkJCSgoUHJvYmxlbUZpZWxkQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2gsCi0JCQkJCSgoUHJvYmxlbUZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKLQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCAnLicpLAotCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkJCWlmIChiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlicmVhazsgLy8gYmluZGluZyBpcyBub3cgYSBmaWVsZAogCQkJfQotCQkJYnJlYWs7IC8vIGJpbmRpbmcgaXMgbm93IGEgZmllbGQKKwkJCXByb2JsZW1GaWVsZEJpbmRpbmcgPSBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKKwkJCQkoKFByb2JsZW1GaWVsZEJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoLAorCQkJCSgoUHJvYmxlbUZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksICcuJyksCisJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7IAorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzg1OCA6IElmIGZpZWxkIGlzIGluYWNjZXNzaWJsZSwKKwkJCS8vIGRvbid0IGdpdmUgdXAgeWV0LCBjb250aW51ZSB0byBsb29rIGZvciBhIHZpc2libGUgbWVtYmVyIHR5cGUgCisJCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSAhPSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSB7ICAKKwkJCQlyZXR1cm4gcHJvYmxlbUZpZWxkQmluZGluZzsKKwkJCX0KIAkJfQogCQlpZiAoKGJpbmRpbmcgPSBmaW5kTWVtYmVyVHlwZShuZXh0TmFtZSwgcmVmZXJlbmNlQmluZGluZykpID09IG51bGwpIHsKKwkJCWlmIChwcm9ibGVtRmllbGRCaW5kaW5nICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcHJvYmxlbUZpZWxkQmluZGluZzsKKwkJCX0KIAkJCWlmICgobWFzayAmIEJpbmRpbmcuRklFTEQpICE9IDApIHsKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJCQludWxsLAorCQkJCQkJcmVmZXJlbmNlQmluZGluZywKKwkJCQkJCW5leHROYW1lLAorCQkJCQkJUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOworCQkJfSBlbHNlIGlmICgobWFzayAmIEJpbmRpbmcuVkFSSUFCTEUpICE9IDApIHsKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKAogCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKIAkJCQkJcmVmZXJlbmNlQmluZGluZywKIAkJCQkJUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwotCQkJfSAKKwkJCX0KIAkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCiAJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCiAJCQkJcmVmZXJlbmNlQmluZGluZywKIAkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCX0KIAkJLy8gYmluZGluZyBpcyBhIFJlZmVyZW5jZUJpbmRpbmcKLQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlpZiAocHJvYmxlbUZpZWxkQmluZGluZyAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHByb2JsZW1GaWVsZEJpbmRpbmc7CisJCQl9CiAJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAotCQkJCSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKKwkJCQkoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCksCiAJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCX0KIAkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgQVNUTm9kZSkgewogCQkJcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwogCQkJQVNUTm9kZSBpbnZvY2F0aW9uTm9kZSA9IChBU1ROb2RlKSBpbnZvY2F0aW9uU2l0ZTsKQEAgLTUzNSw3ICs1NTUsNyBAQAogCQlnZXRCaW5kaW5nKAogCQkJY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSwKIAkJCUJpbmRpbmcuVkFSSUFCTEUgfCBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlBBQ0tBR0UsCi0JCQlpbnZvY2F0aW9uU2l0ZSwgCisJCQlpbnZvY2F0aW9uU2l0ZSwKIAkJCXRydWUgLypyZXNvbHZlKi8pOwogCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQogCQlyZXR1cm4gYmluZGluZzsKQEAgLTU2MCwxMiArNTgwLDEyIEBACiAJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCiAJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCiAJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKLQkJCQkJCSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKIAkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwogCQkJCWlmICghKChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nKS5jYW5CZVNlZW5CeSh0aGlzKSkKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKIAkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAotCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcsIAorCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcsCiAJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKIAkJCQlicmVhayBmb3VuZFR5cGU7CiAJCQl9CkBAIC01NzcsNyArNTk3LDggQEAKIAkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IGxlbmd0aCkgewogCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwogCQkJY2hhcltdIG5leHROYW1lID0gY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXTsKLQkJCWlmICgoYmluZGluZyA9IGZpbmRGaWVsZCh0eXBlQmluZGluZywgbmV4dE5hbWUsIGludm9jYXRpb25TaXRlLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgeworCQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gdHlwZUJpbmRpbmcuY2FwdHVyZSh0aGlzLCBpbnZvY2F0aW9uU2l0ZS5zb3VyY2VFbmQoKSk7CisJCQlpZiAoKGJpbmRpbmcgPSBmaW5kRmllbGQocmVjZWl2ZXJUeXBlLCBuZXh0TmFtZSwgaW52b2NhdGlvblNpdGUsIHRydWUgLypyZXNvbHZlKi8pKSAhPSBudWxsKSB7CiAJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAogCQkJCQkJKEZpZWxkQmluZGluZykgYmluZGluZywKQEAgLTYwMiw3ICs2MjMsNyBAQAogCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKLQkJCQkJKChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLmNsb3Nlc3RNYXRjaCgpLAorCQkJCQkoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCksCiAJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwogCQkJfQogCQl9CkBAIC02MTksMTEgKzY0MCwxMiBAQAogCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgJy4nKSwKIAkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCX0KLQkJdmFyaWFibGVCaW5kaW5nID0gZmluZEZpZWxkKHR5cGVCaW5kaW5nLCBjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSAvKnJlc29sdmUqLyk7CisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IHR5cGVCaW5kaW5nLmNhcHR1cmUodGhpcywgaW52b2NhdGlvblNpdGUuc291cmNlRW5kKCkpOworCQl2YXJpYWJsZUJpbmRpbmcgPSBmaW5kRmllbGQocmVjZWl2ZXJUeXBlLCBjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSAvKnJlc29sdmUqLyk7CiAJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAogCQkJCW51bGwsCi0JCQkJbnVsbCwKKwkJCQlyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nID8gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSA6IG51bGwsCiAJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCAnLicpLAogCQkJCVByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKIAkJfQpAQCAtNjM2LDcgKzY1OCw3IEBACiAvKgogICogVGhpcyByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50IHRoYXQgbWFwcyB0byBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhlIHN1aXRhYmxlIHR5cGUsCiAgKiAJaWYgbm90IGZvdW5kIHRoZW4gYW5zd2VycyBuaWwgLS0gZG8gbm90IGNyZWF0ZSBvbmUKLSAqCQorICoKICAqCQkjaW1wbGljaXRUaGlzCQkgIAkgCQkJOiB0aGUgaW1wbGljaXQgdGhpcyB3aWxsIGJlIG9rCiAgKgkJIygoYXJnKSB0aGlzJG4pCQkJCQkJOiBhdmFpbGFibGUgYXMgYSBjb25zdHJ1Y3RvciBhcmcKICAqIAkJIygoYXJnKSB0aGlzJG4gLi4uIHRoaXMkcCkgCQkJOiBhdmFpbGFibGUgYXMgYXMgYSBjb25zdHJ1Y3RvciBhcmcgKyBhIHNlcXVlbmNlIG9mIGZpZWxkcwpAQCAtNjUxLDcgKzY3Myw3IEBACiAgKiAJCXRodXMgdGhlIGNvZGUgZ2VuZXJhdGlvbiB3aWxsIGJlIG1vcmUgY29tcGFjdCBhbmQgcnVudGltZSBmYXN0ZXIKICAqLwogcHVibGljIFZhcmlhYmxlQmluZGluZ1tdIGdldEVtdWxhdGlvblBhdGgoTG9jYWxWYXJpYWJsZUJpbmRpbmcgb3V0ZXJMb2NhbFZhcmlhYmxlKSB7Ci0JTWV0aG9kU2NvcGUgY3VycmVudE1ldGhvZFNjb3BlID0gdGhpcy5tZXRob2RTY29wZSgpOworCU1ldGhvZFNjb3BlIGN1cnJlbnRNZXRob2RTY29wZSA9IG1ldGhvZFNjb3BlKCk7CiAJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IGN1cnJlbnRNZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CiAKIAkvLyBpZGVudGl0eSBjaGVjawpAQCAtNjkwLDEyICs3MTIsMTIgQEAKICAqCWpscyAxNS45LjIgKyBodHRwOi8vd3d3LmVyZ25vc2lzLmNvbS9qYXZhLXNwZWMtcmVwb3J0L2phdmEtbGFuZ3VhZ2UvamxzLTguOC41LjEtZC5odG1sCiAgKi8KIHB1YmxpYyBPYmplY3RbXSBnZXRFbXVsYXRpb25QYXRoKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSwgYm9vbGVhbiBvbmx5RXhhY3RNYXRjaCwgYm9vbGVhbiBkZW55RW5jbG9zaW5nQXJnSW5Db25zdHJ1Y3RvckNhbGwpIHsKLQlNZXRob2RTY29wZSBjdXJyZW50TWV0aG9kU2NvcGUgPSB0aGlzLm1ldGhvZFNjb3BlKCk7CisJTWV0aG9kU2NvcGUgY3VycmVudE1ldGhvZFNjb3BlID0gbWV0aG9kU2NvcGUoKTsKIAlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gY3VycmVudE1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKIAogCS8vIHVzZSAndGhpcycgaWYgcG9zc2libGUKIAlpZiAoIWN1cnJlbnRNZXRob2RTY29wZS5pc1N0YXRpYyAmJiAhY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsKSB7Ci0JCWlmIChzb3VyY2VUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUgfHwgKCFvbmx5RXhhY3RNYXRjaCAmJiBzb3VyY2VUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUodGFyZ2V0RW5jbG9zaW5nVHlwZSkgIT0gbnVsbCkpIHsKKwkJaWYgKHNvdXJjZVR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSB8fCAoIW9ubHlFeGFjdE1hdGNoICYmIHNvdXJjZVR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0YXJnZXRFbmNsb3NpbmdUeXBlKSAhPSBudWxsKSkgewogCQkJcmV0dXJuIEJsb2NrU2NvcGUuRW11bGF0aW9uUGF0aFRvSW1wbGljaXRUaGlzOyAvLyBpbXBsaWNpdCB0aGlzIGlzIGdvb2QgZW5vdWdoCiAJCX0KIAl9CkBAIC03MTQsOCArNzM2LDggQEAKIAkJaWYgKChzeW50aGV0aWNBcmcgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlLCBvbmx5RXhhY3RNYXRjaCkpICE9IG51bGwpIHsKIAkJCS8vIHJlamVjdCBhbGxvY2F0aW9uIGFuZCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsCiAJCQlpZiAoZGVueUVuY2xvc2luZ0FyZ0luQ29uc3RydWN0b3JDYWxsCi0JCQkJCSYmIGN1cnJlbnRNZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbCAKLQkJCQkJJiYgKHNvdXJjZVR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSB8fCAoIW9ubHlFeGFjdE1hdGNoICYmIHNvdXJjZVR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZSh0YXJnZXRFbmNsb3NpbmdUeXBlKSAhPSBudWxsKSkpIHsKKwkJCQkJJiYgY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsCisJCQkJCSYmIChzb3VyY2VUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUgfHwgKCFvbmx5RXhhY3RNYXRjaCAmJiBzb3VyY2VUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20odGFyZ2V0RW5jbG9zaW5nVHlwZSkgIT0gbnVsbCkpKSB7CiAJCQkJcmV0dXJuIEJsb2NrU2NvcGUuTm9FbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsOwogCQkJfQogCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHN5bnRoZXRpY0FyZyB9OwpAQCAtNzM0LDcgKzc1Niw3IEBACiAJCQlpZiAoZW5jbG9zaW5nQXJndW1lbnQgIT0gbnVsbCkgewogCQkJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZCA9IHNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQoZW5jbG9zaW5nQXJndW1lbnQpOwogCQkJCWlmIChzeW50aGV0aWNGaWVsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChzeW50aGV0aWNGaWVsZC50eXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUgfHwgKCFvbmx5RXhhY3RNYXRjaCAmJiAoKFJlZmVyZW5jZUJpbmRpbmcpc3ludGhldGljRmllbGQudHlwZSkuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZSh0YXJnZXRFbmNsb3NpbmdUeXBlKSAhPSBudWxsKSkKKwkJCQkJaWYgKHN5bnRoZXRpY0ZpZWxkLnR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSB8fCAoIW9ubHlFeGFjdE1hdGNoICYmICgoUmVmZXJlbmNlQmluZGluZylzeW50aGV0aWNGaWVsZC50eXBlKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKHRhcmdldEVuY2xvc2luZ1R5cGUpICE9IG51bGwpKQogCQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHN5bnRoZXRpY0ZpZWxkIH07CiAJCQkJfQogCQkJfQpAQCAtNzYwLDE0ICs3ODIsMTQgQEAKIAkJcGF0aFswXSA9IHNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQoY3VycmVudFR5cGUsIG9ubHlFeGFjdE1hdGNoKTsKIAl9CiAJaWYgKHBhdGhbMF0gIT0gbnVsbCkgeyAvLyBrZWVwIGFjY3VtdWxhdGluZwotCQkKKwogCQlpbnQgY291bnQgPSAxOwogCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRFbmNsb3NpbmdUeXBlOwogCQl3aGlsZSAoKGN1cnJlbnRFbmNsb3NpbmdUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSB7CiAKIAkJCS8vZG9uZT8KIAkJCWlmIChjdXJyZW50VHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlCi0JCQkJfHwgKCFvbmx5RXhhY3RNYXRjaCAmJiBjdXJyZW50VHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKHRhcmdldEVuY2xvc2luZ1R5cGUpICE9IG51bGwpKQlicmVhazsKKwkJCQl8fCAoIW9ubHlFeGFjdE1hdGNoICYmIGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20odGFyZ2V0RW5jbG9zaW5nVHlwZSkgIT0gbnVsbCkpCWJyZWFrOwogCiAJCQlpZiAoY3VycmVudE1ldGhvZFNjb3BlICE9IG51bGwpIHsKIAkJCQljdXJyZW50TWV0aG9kU2NvcGUgPSBjdXJyZW50TWV0aG9kU2NvcGUuZW5jbG9zaW5nTWV0aG9kU2NvcGUoKTsKQEAgLTc3OCw3ICs4MDAsNyBAQAogCQkJCQlyZXR1cm4gQmxvY2tTY29wZS5Ob0VuY2xvc2luZ0luc3RhbmNlSW5TdGF0aWNDb250ZXh0OwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlzeW50aGV0aWNGaWVsZCA9ICgoTmVzdGVkVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlKS5nZXRTeW50aGV0aWNGaWVsZChjdXJyZW50RW5jbG9zaW5nVHlwZSwgb25seUV4YWN0TWF0Y2gpOwogCQkJaWYgKHN5bnRoZXRpY0ZpZWxkID09IG51bGwpIGJyZWFrOwogCkBAIC03ODcsMTEgKzgwOSwxMSBAQAogCQkJCVN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgKHBhdGggPSBuZXcgT2JqZWN0W2NvdW50ICsgMV0pLCAwLCBjb3VudCk7CiAJCQl9CiAJCQkvLyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIHN5bnRoZXRpYyBmaWVsZCBpcyBwcml2YXRlCi0JCQlwYXRoW2NvdW50KytdID0gKChTb3VyY2VUeXBlQmluZGluZykgc3ludGhldGljRmllbGQuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChzeW50aGV0aWNGaWVsZCwgdHJ1ZSk7CisJCQlwYXRoW2NvdW50KytdID0gKChTb3VyY2VUeXBlQmluZGluZykgc3ludGhldGljRmllbGQuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChzeW50aGV0aWNGaWVsZCwgdHJ1ZS8qcmVhZCovLCBmYWxzZSAvKm5vdCBzdXBlciBhY2Nlc3MqLyk7CiAJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRFbmNsb3NpbmdUeXBlOwogCQl9CiAJCWlmIChjdXJyZW50VHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlCi0JCQl8fCAoIW9ubHlFeGFjdE1hdGNoICYmIGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUodGFyZ2V0RW5jbG9zaW5nVHlwZSkgIT0gbnVsbCkpIHsKKwkJCXx8ICghb25seUV4YWN0TWF0Y2ggJiYgY3VycmVudFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0YXJnZXRFbmNsb3NpbmdUeXBlKSAhPSBudWxsKSkgewogCQkJcmV0dXJuIHBhdGg7CiAJCX0KIAl9CkBAIC04MTYsOCArODM4LDEwIEBACiAJaW50IG1heCA9IC0xOwogCWlmICh0aGlzLnNoaWZ0U2NvcGVzICE9IG51bGwpewogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zaGlmdFNjb3Blcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7Ci0JCQlpbnQgc3ViTWF4T2Zmc2V0ID0gdGhpcy5zaGlmdFNjb3Blc1tpXS5tYXhPZmZzZXQ7Ci0JCQlpZiAoc3ViTWF4T2Zmc2V0ID4gbWF4KSBtYXggPSBzdWJNYXhPZmZzZXQ7CisJCQlpZiAodGhpcy5zaGlmdFNjb3Blc1tpXSAhPSBudWxsKSB7CisJCQkJaW50IHN1Yk1heE9mZnNldCA9IHRoaXMuc2hpZnRTY29wZXNbaV0ubWF4T2Zmc2V0OworCQkJCWlmIChzdWJNYXhPZmZzZXQgPiBtYXgpIG1heCA9IHN1Yk1heE9mZnNldDsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gbWF4OwpAQCAtODI1LDcgKzg0OSw3IEBACiAKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIHRvIGNoZWNrIGluaXRpYWxpemF0aW9uIG9mIGZpbmFsIGJsYW5rIGZpZWxkcy4KLSAqIGluIG90aGVyIHdvcmRzLCBpdCBpcyBpbnNpZGUgYW4gaW5pdGlhbGl6ZXIsIGEgY29uc3RydWN0b3Igb3IgYSBjbGluaXQgCisgKiBpbiBvdGhlciB3b3JkcywgaXQgaXMgaW5zaWRlIGFuIGluaXRpYWxpemVyLCBhIGNvbnN0cnVjdG9yIG9yIGEgY2xpbml0CiAgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIG5lZWRCbGFua0ZpbmFsRmllbGRJbml0aWFsaXphdGlvbkNoZWNrKEZpZWxkQmluZGluZyBiaW5kaW5nKSB7CiAJYm9vbGVhbiBpc1N0YXRpYyA9IGJpbmRpbmcuaXNTdGF0aWMoKTsKQEAgLTgzOSw5ICs4NjMsMTMgQEAKIAkJCQkmJiAhKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0KS5pc0luaXRpYWxpemF0aW9uTWV0aG9kKCkpIHsgLy8gaW5zaWRlIGNvbnN0cnVjdG9yIG9yIGNsaW5pdAogCQkJcmV0dXJuIGZhbHNlOyAvLyBmb3VuZCBzb21lIG5vbi1pbml0aWFsaXplciBjb250ZXh0CiAJCX0KLQkJaWYgKGZpZWxkRGVjbGFyaW5nQ2xhc3MgPT0gbWV0aG9kU2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCkpIHsKKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gbWV0aG9kU2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCk7CisJCWlmIChlbmNsb3NpbmdUeXBlID09IGZpZWxkRGVjbGFyaW5nQ2xhc3MpIHsKIAkJCXJldHVybiB0cnVlOyAvLyBmb3VuZCB0aGUgZmllbGQgY29udGV4dCwgbm8gbmVlZCB0byBjaGVjayBhbnkgZnVydGhlcgogCQl9CisJCWlmICghZW5jbG9zaW5nVHlwZS5lcmFzdXJlKCkuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gb25seSBjaGVjayBpbnNpZGUgYW5vbnltb3VzIHR5cGUKKwkJfQogCQltZXRob2RTY29wZSA9IG1ldGhvZFNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCk7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTg1NCw3ICs4ODIsNyBAQAogICogdG8gYWJvcnQuCiAgKi8KIHB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCkgewotCXJldHVybiBvdXRlck1vc3RNZXRob2RTY29wZSgpLnByb2JsZW1SZXBvcnRlcigpOworCXJldHVybiBtZXRob2RTY29wZSgpLnByb2JsZW1SZXBvcnRlcigpOwogfQogCiAvKgpAQCAtODYzLDcgKzg5MSw3IEBACiAgKi8KIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgYm9vbGVhbiBpc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpIHsKIAkvLyBubyBuZWVkIHRvIHByb3BhZ2F0ZSBlbmNsb3NpbmcgaW5zdGFuY2VzLCB0aGV5IGdvdCBlYWdlcmx5IGFsbG9jYXRlZCBhbHJlYWR5LgotCQorCiAJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzOwogCWlmICgoc3ludGhldGljQXJndW1lbnRzID0gdGFyZ2V0VHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkpICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtODcxLDcgKzg5OSw3IEBACiAJCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgdGhlIG9uZSB0aGF0IGNvdWxkIG1hdGNoIGEgc3VwcGxpZWQgZW5jbG9zaW5nIGluc3RhbmNlCiAJCQlpZiAoIShpc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQKIAkJCQkmJiAoc3ludGhldGljQXJnLnR5cGUgPT0gdGFyZ2V0VHlwZS5lbmNsb3NpbmdUeXBlKCkpKSkgewotCQkJCXRoaXMuZW11bGF0ZU91dGVyQWNjZXNzKHN5bnRoZXRpY0FyZy5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOworCQkJCWVtdWxhdGVPdXRlckFjY2VzcyhzeW50aGV0aWNBcmcuYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTkxNSw0ICs5NDMsMTggQEAKIAkJCXMgKz0gKChCbG9ja1Njb3BlKSB0aGlzLnN1YnNjb3Blc1tpXSkudG9TdHJpbmcodGFiICsgMSkgKyAiXG4iOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9CisvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NjgyCitwdWJsaWMgdm9pZCByZXNldEVuY2xvc2luZ01ldGhvZFN0YXRpY0ZsYWcoKSB7CisJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBtZXRob2RTY29wZSgpOworCXdoaWxlIChtZXRob2RTY29wZSAhPSBudWxsICYmIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbj0gKE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQltZXRob2REZWNsYXJhdGlvbi5iaXRzICY9IH5BU1ROb2RlLkNhbkJlU3RhdGljOworCQlDbGFzc1Njb3BlIGVuY2xvc2luZ0NsYXNzU2NvcGUgPSBtZXRob2RTY29wZS5lbmNsb3NpbmdDbGFzc1Njb3BlKCk7CisJCWlmIChlbmNsb3NpbmdDbGFzc1Njb3BlICE9IG51bGwpIHsKKwkJCW1ldGhvZFNjb3BlID0gZW5jbG9zaW5nQ2xhc3NTY29wZS5tZXRob2RTY29wZSgpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NhcHR1cmVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NhcHR1cmVCaW5kaW5nLmphdmEKaW5kZXggYjFkZWU1My4uNjFjNmU2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DYXB0dXJlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2FwdHVyZUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxNyArMTUsMTcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogCiBwdWJsaWMgY2xhc3MgQ2FwdHVyZUJpbmRpbmcgZXh0ZW5kcyBUeXBlVmFyaWFibGVCaW5kaW5nIHsKLQkKKwogCXB1YmxpYyBUeXBlQmluZGluZyBsb3dlckJvdW5kOwogCXB1YmxpYyBXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQ7CiAJcHVibGljIGludCBjYXB0dXJlSUQ7Ci0JCisKIAkvKiBpbmZvcm1hdGlvbiB0byBjb21wdXRlIHVuaXF1ZSBiaW5kaW5nIGtleSAqLwogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHNvdXJjZVR5cGU7CiAJcHVibGljIGludCBwb3NpdGlvbjsKLQkKKwogCXB1YmxpYyBDYXB0dXJlQmluZGluZyhXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQsIFJlZmVyZW5jZUJpbmRpbmcgc291cmNlVHlwZSwgaW50IHBvc2l0aW9uLCBpbnQgY2FwdHVyZUlEKSB7Ci0JCXN1cGVyKFR5cGVDb25zdGFudHMuV0lMRENBUkRfQ0FQVFVSRV9OQU1FX1BSRUZJWCwgbnVsbCwgMCk7CisJCXN1cGVyKFR5cGVDb25zdGFudHMuV0lMRENBUkRfQ0FQVFVSRV9OQU1FX1BSRUZJWCwgbnVsbCwgMCwgd2lsZGNhcmQuZW52aXJvbm1lbnQpOwogCQl0aGlzLndpbGRjYXJkID0gd2lsZGNhcmQ7CiAJCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsgLy8gdHJlYXQgY2FwdHVyZSBhcyBwdWJsaWMKIAkJdGhpcy5mUGFja2FnZSA9IHdpbGRjYXJkLmZQYWNrYWdlOwpAQCAtNTMsNyArNTMsNyBAQAogCQljaGFyW10gdW5pcXVlS2V5ID0gbmV3IGNoYXJbbGVuZ3RoXTsKIAkJYnVmZmVyLmdldENoYXJzKDAsIGxlbmd0aCwgdW5pcXVlS2V5LCAwKTsKIAkJcmV0dXJuIHVuaXF1ZUtleTsKLQl9CQorCX0KIAogCXB1YmxpYyBTdHJpbmcgZGVidWdOYW1lKCkgewogCkBAIC02OCw3ICs2OCw3IEBACiAJCX0KIAkJcmV0dXJuIHN1cGVyLmRlYnVnTmFtZSgpOwogCX0KLQkKKwogCXB1YmxpYyBjaGFyW10gZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSB7CiAJCWlmICh0aGlzLmdlbmVyaWNUeXBlU2lnbmF0dXJlID09IG51bGwpIHsKIAkJCXRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLldJTERDQVJEX0NBUFRVUkUsIHRoaXMud2lsZGNhcmQuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7CkBAIC04MSwxMyArODEsNTMgQEAKIAkgKiBlLmcuIGdpdmVuIFg8VSwgViBleHRlbmRzIFg8VSwgVj4+LCAgICAgY2FwdHVyZShYPEUsPz4pID0gWDxFLGNhcHR1cmU+LCB3aGVyZSBjYXB0dXJlIGV4dGVuZHMgWDxFLGNhcHR1cmU+CiAJICovCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcyhTY29wZSBzY29wZSwgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGNhcHR1cmVkUGFyYW1ldGVyaXplZFR5cGUpIHsKLQkJVHlwZVZhcmlhYmxlQmluZGluZyB3aWxkY2FyZFZhcmlhYmxlID0gd2lsZGNhcmQudHlwZVZhcmlhYmxlKCk7CisJCVR5cGVWYXJpYWJsZUJpbmRpbmcgd2lsZGNhcmRWYXJpYWJsZSA9IHRoaXMud2lsZGNhcmQudHlwZVZhcmlhYmxlKCk7CisJCWlmICh3aWxkY2FyZFZhcmlhYmxlID09IG51bGwpIHsKKwkJCS8vIGVycm9yIHJlc2lsaWVuY2Ugd2hlbiBjYXB0dXJpbmcgWm9yazw/PgorCQkJLy8gbm8gc3Vic3RpdHV0aW9uIGZvciB3aWxkY2FyZCBib3VuZCAob25seSBmb3JtYWwgYm91bmRzIGZyb20gdHlwZSB2YXJpYWJsZXMgYXJlIHRvIGJlIHN1YnN0aXR1dGVkOiAxMDQwODIpCisJCQlUeXBlQmluZGluZyBvcmlnaW5hbFdpbGRjYXJkQm91bmQgPSB0aGlzLndpbGRjYXJkLmJvdW5kOworCQkJc3dpdGNoICh0aGlzLndpbGRjYXJkLmJvdW5kS2luZCkgeworCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUyA6CisJCQkJCS8vIHN0aWxsIG5lZWQgdG8gY2FwdHVyZSBib3VuZCBzdXBlcnR5cGUgYXMgd2VsbCBzbyBhcyBub3QgdG8gZXhwb3NlIHdpbGRjYXJkcyB0byB0aGUgb3V0c2lkZSAoMTExMjA4KQorCQkJCQlUeXBlQmluZGluZyBjYXB0dXJlZFdpbGRjYXJkQm91bmQgPSBvcmlnaW5hbFdpbGRjYXJkQm91bmQuY2FwdHVyZShzY29wZSwgdGhpcy5wb3NpdGlvbik7CisJCQkJCWlmIChvcmlnaW5hbFdpbGRjYXJkQm91bmQuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJdGhpcy5zdXBlcmNsYXNzID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7IChSZWZlcmVuY2VCaW5kaW5nKSBjYXB0dXJlZFdpbGRjYXJkQm91bmQgfTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHRoZSB3aWxkY2FyZCBib3VuZCBzaG91bGQgYmUgYSBzdWJ0eXBlIG9mIHZhcmlhYmxlIHN1cGVyY2xhc3MKKwkJCQkJCS8vIGl0IG1heSBvY2N1ciB0aGF0IHRoZSBib3VuZCBpcyBsZXNzIHNwZWNpZmljLCB0aGVuIGNvbnNpZGVyIGdsYiAoMjAyNDA0KQorCQkJCQkJaWYgKGNhcHR1cmVkV2lsZGNhcmRCb3VuZC5pc0FycmF5VHlwZSgpIHx8IGNhcHR1cmVkV2lsZGNhcmRCb3VuZCA9PSB0aGlzKSB7CisJCQkJCQkJdGhpcy5zdXBlcmNsYXNzID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5zdXBlcmNsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIGNhcHR1cmVkV2lsZGNhcmRCb3VuZDsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CisJCQkJCX0KKwkJCQkJdGhpcy5maXJzdEJvdW5kID0gIGNhcHR1cmVkV2lsZGNhcmRCb3VuZDsKKwkJCQkJaWYgKChjYXB0dXJlZFdpbGRjYXJkQm91bmQudGFnQml0cyAmIFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlKSA9PSAwKQorCQkJCQkJdGhpcy50YWdCaXRzICY9IH5UYWdCaXRzLkhhc1R5cGVWYXJpYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKKwkJCQkJdGhpcy5zdXBlcmNsYXNzID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUzsKKwkJCQkJdGhpcy50YWdCaXRzICY9IH5UYWdCaXRzLkhhc1R5cGVWYXJpYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6CisJCQkJCXRoaXMuc3VwZXJjbGFzcyA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CisJCQkJCXRoaXMubG93ZXJCb3VuZCA9IHRoaXMud2lsZGNhcmQuYm91bmQ7CisJCQkJCWlmICgob3JpZ2luYWxXaWxkY2FyZEJvdW5kLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgPT0gMCkKKwkJCQkJCXRoaXMudGFnQml0cyAmPSB+VGFnQml0cy5IYXNUeXBlVmFyaWFibGU7CisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuOworCQl9CiAJCVJlZmVyZW5jZUJpbmRpbmcgb3JpZ2luYWxWYXJpYWJsZVN1cGVyY2xhc3MgPSB3aWxkY2FyZFZhcmlhYmxlLnN1cGVyY2xhc3M7CiAJCVJlZmVyZW5jZUJpbmRpbmcgc3Vic3RpdHV0ZWRWYXJpYWJsZVN1cGVyY2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgU2NvcGUuc3Vic3RpdHV0ZShjYXB0dXJlZFBhcmFtZXRlcml6ZWRUeXBlLCBvcmlnaW5hbFZhcmlhYmxlU3VwZXJjbGFzcyk7CiAJCS8vIHByZXZlbnQgY3ljbGljIGNhcHR1cmU6IGdpdmVuIFg8VD4sIGNhcHR1cmUoWDw/IGV4dGVuZHMgVD4gY291bGQgeWllbGQgYSBjaXJjdWxhciB0eXBlCiAJCWlmIChzdWJzdGl0dXRlZFZhcmlhYmxlU3VwZXJjbGFzcyA9PSB0aGlzKSBzdWJzdGl0dXRlZFZhcmlhYmxlU3VwZXJjbGFzcyA9IG9yaWdpbmFsVmFyaWFibGVTdXBlcmNsYXNzOwotCQkKLQkJUmVmZXJlbmNlQmluZGluZ1tdIG9yaWdpbmFsVmFyaWFibGVJbnRlcmZhY2VzID0gd2lsZGNhcmRWYXJpYWJsZS5zdXBlckludGVyZmFjZXMoKTsJCQorCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBvcmlnaW5hbFZhcmlhYmxlSW50ZXJmYWNlcyA9IHdpbGRjYXJkVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzKCk7CiAJCVJlZmVyZW5jZUJpbmRpbmdbXSBzdWJzdGl0dXRlZFZhcmlhYmxlSW50ZXJmYWNlcyA9IFNjb3BlLnN1YnN0aXR1dGUoY2FwdHVyZWRQYXJhbWV0ZXJpemVkVHlwZSwgb3JpZ2luYWxWYXJpYWJsZUludGVyZmFjZXMpOwogCQlpZiAoc3Vic3RpdHV0ZWRWYXJpYWJsZUludGVyZmFjZXMgIT0gb3JpZ2luYWxWYXJpYWJsZUludGVyZmFjZXMpIHsKIAkJCS8vIHByZXZlbnQgY3ljbGljIGNhcHR1cmU6IGdpdmVuIFg8VD4sIGNhcHR1cmUoWDw/IGV4dGVuZHMgVD4gY291bGQgeWllbGQgYSBjaXJjdWxhciB0eXBlCkBAIC05NiwxMyArMTM2LDEzIEBACiAJCQl9CiAJCX0KIAkJLy8gbm8gc3Vic3RpdHV0aW9uIGZvciB3aWxkY2FyZCBib3VuZCAob25seSBmb3JtYWwgYm91bmRzIGZyb20gdHlwZSB2YXJpYWJsZXMgYXJlIHRvIGJlIHN1YnN0aXR1dGVkOiAxMDQwODIpCi0JCVR5cGVCaW5kaW5nIG9yaWdpbmFsV2lsZGNhcmRCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOwotCQkKLQkJc3dpdGNoICh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJVHlwZUJpbmRpbmcgb3JpZ2luYWxXaWxkY2FyZEJvdW5kID0gdGhpcy53aWxkY2FyZC5ib3VuZDsKKworCQlzd2l0Y2ggKHRoaXMud2lsZGNhcmQuYm91bmRLaW5kKSB7CiAJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgogCQkJCS8vIHN0aWxsIG5lZWQgdG8gY2FwdHVyZSBib3VuZCBzdXBlcnR5cGUgYXMgd2VsbCBzbyBhcyBub3QgdG8gZXhwb3NlIHdpbGRjYXJkcyB0byB0aGUgb3V0c2lkZSAoMTExMjA4KQogCQkJCVR5cGVCaW5kaW5nIGNhcHR1cmVkV2lsZGNhcmRCb3VuZCA9IG9yaWdpbmFsV2lsZGNhcmRCb3VuZC5jYXB0dXJlKHNjb3BlLCB0aGlzLnBvc2l0aW9uKTsKLQkJCQlpZiAod2lsZGNhcmQuYm91bmQuaXNJbnRlcmZhY2UoKSkgeworCQkJCWlmIChvcmlnaW5hbFdpbGRjYXJkQm91bmQuaXNJbnRlcmZhY2UoKSkgewogCQkJCQl0aGlzLnN1cGVyY2xhc3MgPSBzdWJzdGl0dXRlZFZhcmlhYmxlU3VwZXJjbGFzczsKIAkJCQkJLy8gbWVyZ2Ugd2lsZGNhcmQgYm91bmQgaW50byB2YXJpYWJsZSBzdXBlcmludGVyZmFjZXMgdXNpbmcgZ2xiCiAJCQkJCWlmIChzdWJzdGl0dXRlZFZhcmlhYmxlSW50ZXJmYWNlcyA9PSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewpAQCAtMTQ1LDE2ICsxODUsMTYgQEAKIAkJCQlpZiAoKG9yaWdpbmFsV2lsZGNhcmRCb3VuZC50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpID09IDApCiAJCQkJCXRoaXMudGFnQml0cyAmPSB+VGFnQml0cy5IYXNUeXBlVmFyaWFibGU7CiAJCQkJYnJlYWs7Ci0JCX0JCQorCQl9CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2lzQ2FwdHVyZSgpCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNDYXB0dXJlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIFR5cGVCaW5kaW5nI2lzRXF1aXZhbGVudFRvKFR5cGVCaW5kaW5nKQogCSAqLwpAQCAtMTY2LDggKzIwNiwxMSBAQAogCQkJaWYgKHRoaXMuZmlyc3RCb3VuZC5pc0NvbXBhdGlibGVXaXRoKG90aGVyVHlwZSkpCiAJCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkgICAgaWYgKG90aGVyVHlwZS5pc1dpbGRjYXJkKCkpIC8vIHdpbGRjYXJkCi0JCQlyZXR1cm4gKChXaWxkY2FyZEJpbmRpbmcpIG90aGVyVHlwZSkuYm91bmRDaGVjayh0aGlzKTsKKwkJc3dpdGNoIChvdGhlclR5cGUua2luZCgpKSB7CisJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOgorCQkJCXJldHVybiAoKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlKS5ib3VuZENoZWNrKHRoaXMpOworCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTE4Niw3ICsyMjksNyBAQAogCQl9CiAJCXJldHVybiBzdXBlci5yZWFkYWJsZU5hbWUoKTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCkgewogCQlpZiAodGhpcy53aWxkY2FyZCAhPSBudWxsKSB7CiAJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CkBAIC0yMDAsOSArMjQzLDkgQEAKIAkJCWJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIG5hbWUsIDApOwogCQkJcmV0dXJuIG5hbWU7CiAJCX0KLQkJcmV0dXJuIHN1cGVyLnNob3J0UmVhZGFibGVOYW1lKCk7CQkKKwkJcmV0dXJuIHN1cGVyLnNob3J0UmVhZGFibGVOYW1lKCk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKHRoaXMud2lsZGNhcmQgIT0gbnVsbCkgewogCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwpAQCAtMjE0LDUgKzI1Nyw1IEBACiAJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQkJCisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DYXRjaFBhcmFtZXRlckJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5NjU1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nIGV4dGVuZHMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgeworCQorCVR5cGVCaW5kaW5nIFtdIHByZWNpc2VUeXBlcyA9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUzsgIC8vIHRoZSBjYXRjaCBibG9jayBjYW4gYmUgZW50ZXJlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIHNldCB0byB0aGVzZSB0eXBlcy4KKwkKKwlwdWJsaWMgQ2F0Y2hQYXJhbWV0ZXJCaW5kaW5nKExvY2FsRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNBcmd1bWVudCkgeworCQlzdXBlcihkZWNsYXJhdGlvbiwgdHlwZSwgbW9kaWZpZXJzLCBpc0FyZ3VtZW50KTsKKwl9CisJCisJcHVibGljIFR5cGVCaW5kaW5nIFtdIGdldFByZWNpc2VUeXBlcygpIHsKKwkJcmV0dXJuIHRoaXMucHJlY2lzZVR5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByZWNpc2VUeXBlKFR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbikgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5wcmVjaXNlVHlwZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisJCQlpZiAodGhpcy5wcmVjaXNlVHlwZXNbaV0gPT0gcmFpc2VkRXhjZXB0aW9uKQorCQkJCXJldHVybjsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucHJlY2lzZVR5cGVzLCAwLCB0aGlzLnByZWNpc2VUeXBlcyA9IG5ldyBUeXBlQmluZGluZyBbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CisJCXRoaXMucHJlY2lzZVR5cGVzW2xlbmd0aF0gPSByYWlzZWRFeGNlcHRpb247CisJCXJldHVybjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NsYXNzU2NvcGUuamF2YQppbmRleCBmNWJmNWNhLi5lYjg2NWJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NsYXNzU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NsYXNzU2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDEwICs3LDE2IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbnMgZm9yIAorICogICAgIAkJCQkJCUJ1ZyAzMjgyODEgLSB2aXNpYmlsaXR5IGxlYWtzIG5vdCBkZXRlY3RlZCB3aGVuIGFuYWx5emluZyB1bnVzZWQgZmllbGQgaW4gcHJpdmF0ZSBjbGFzcworICogICAgIAkJCQkJCUJ1ZyAzMDA1NzYgLSBOUEUgQ29tcHV0aW5nIHR5cGUgaGllcmFyY2h5IHdoZW4gY29tcGxpYW5jZSBkb2Vzbid0IG1hdGNoIGxpYnJhcmllcworICogICAgIAkJCQkJCUJ1ZyAzNTQ1MzYgLSBjb21waWxpbmcgcGFja2FnZS1pbmZvLmphdmEgc3RpbGwgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgY29tcGlsYXRpb24gdW5pdHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKQEAgLTI4LDM5ICszNCw2NiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogCiBwdWJsaWMgY2xhc3MgQ2xhc3NTY29wZSBleHRlbmRzIFNjb3BlIHsKLQkKKwogCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24gcmVmZXJlbmNlQ29udGV4dDsKIAlwdWJsaWMgVHlwZVJlZmVyZW5jZSBzdXBlclR5cGVSZWZlcmVuY2U7CisJamF2YS51dGlsLkFycmF5TGlzdCBkZWZlcnJlZEJvdW5kQ2hlY2tzOwogCiAJcHVibGljIENsYXNzU2NvcGUoU2NvcGUgcGFyZW50LCBUeXBlRGVjbGFyYXRpb24gY29udGV4dCkgewotCQlzdXBlcihDTEFTU19TQ09QRSwgcGFyZW50KTsKKwkJc3VwZXIoU2NvcGUuQ0xBU1NfU0NPUEUsIHBhcmVudCk7CiAJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMuZGVmZXJyZWRCb3VuZENoZWNrcyA9IG51bGw7IC8vIGluaXRpYWxpemVkIGlmIHJlcXVpcmVkCiAJfQotCQorCiAJdm9pZCBidWlsZEFub255bW91c1R5cGVCaW5kaW5nKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJ0eXBlKSB7CiAJCUxvY2FsVHlwZUJpbmRpbmcgYW5vbnltb3VzVHlwZSA9IGJ1aWxkTG9jYWxUeXBlKGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1R5cGUuZlBhY2thZ2UpOwotCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlhbm9ueW1vdXNUeXBlLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOyAvLyB0YWcgYWxsIGFub255bW91cyB0eXBlcyBhcyB1c2VkIGxvY2FsbHkKIAkJaWYgKHN1cGVydHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOwotCQkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tdIHsgc3VwZXJ0eXBlIH07CisJCQlhbm9ueW1vdXNUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOworCQkJYW5vbnltb3VzVHlwZS5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tdIHsgc3VwZXJ0eXBlIH07CisJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYWxsb2NhdGlvbi50eXBlOworCQkJaWYgKHR5cGVSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCWlmICgoc3VwZXJ0eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkKSAhPSAwKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLnN1cGVyVHlwZUNhbm5vdFVzZVdpbGRjYXJkKGFub255bW91c1R5cGUsIHR5cGVSZWZlcmVuY2UsIHN1cGVydHlwZSk7CisJCQkJCWFub255bW91c1R5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQlhbm9ueW1vdXNUeXBlLnN1cGVySW50ZXJmYWNlcyA9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTOworCQkJCX0KKwkJCX0KIAkJfSBlbHNlIHsKLQkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IHN1cGVydHlwZTsKLQkJCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CisJCQlhbm9ueW1vdXNUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcnR5cGU7CisJCQlhbm9ueW1vdXNUeXBlLnN1cGVySW50ZXJmYWNlcyA9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTOworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmFsbG9jYXRpb24udHlwZTsKKwkJCWlmICh0eXBlUmVmZXJlbmNlICE9IG51bGwpIHsgLy8gbm8gY2hlY2sgZm9yIGVudW0gY29uc3RhbnQgYm9keQorCQkJCWlmIChzdXBlcnR5cGUuZXJhc3VyZSgpLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ0VudW0pIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90RXh0ZW5kRW51bShhbm9ueW1vdXNUeXBlLCB0eXBlUmVmZXJlbmNlLCBzdXBlcnR5cGUpOworCQkJCQlhbm9ueW1vdXNUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJYW5vbnltb3VzVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQl9IGVsc2UgaWYgKHN1cGVydHlwZS5pc0ZpbmFsKCkpIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKHR5cGVSZWZlcmVuY2UsIHN1cGVydHlwZSk7CisJCQkJCWFub255bW91c1R5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQlhbm9ueW1vdXNUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOworCQkJCX0gZWxzZSBpZiAoKHN1cGVydHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgIT0gMCkgeworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5zdXBlclR5cGVDYW5ub3RVc2VXaWxkY2FyZChhbm9ueW1vdXNUeXBlLCB0eXBlUmVmZXJlbmNlLCBzdXBlcnR5cGUpOworCQkJCQlhbm9ueW1vdXNUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJYW5vbnltb3VzVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQl9CisJCQl9CiAJCX0KIAkJY29ubmVjdE1lbWJlclR5cGVzKCk7CiAJCWJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOwogCQlhbm9ueW1vdXNUeXBlLmZhdWx0SW5UeXBlc0ZvckZpZWxkc0FuZE1ldGhvZHMoKTsKLQkJc291cmNlVHlwZS52ZXJpZnlNZXRob2RzKGVudmlyb25tZW50KCkubWV0aG9kVmVyaWZpZXIoKSk7CisJCWFub255bW91c1R5cGUudmVyaWZ5TWV0aG9kcyhlbnZpcm9ubWVudCgpLm1ldGhvZFZlcmlmaWVyKCkpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRGaWVsZHMoKSB7Ci0JCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CQkKLQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuZmllbGRzID09IG51bGwpIHsKKworCXZvaWQgYnVpbGRGaWVsZHMoKSB7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKHNvdXJjZVR5cGUuYXJlRmllbGRzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuOworCQlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0LmZpZWxkcyA9PSBudWxsKSB7CiAJCQlzb3VyY2VUeXBlLnNldEZpZWxkcyhCaW5kaW5nLk5PX0ZJRUxEUyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJLy8gY291bnQgdGhlIG51bWJlciBvZiBmaWVsZHMgdnMuIGluaXRpYWxpemVycwotCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gcmVmZXJlbmNlQ29udGV4dC5maWVsZHM7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOwogCQlpbnQgc2l6ZSA9IGZpZWxkcy5sZW5ndGg7CiAJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC03NCwxMyArMTA3LDEyIEBACiAJCS8vIGl0ZXJhdGUgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyB0byBjcmVhdGUgdGhlIGJpbmRpbmdzLCBsb3NlIGFsbCBkdXBsaWNhdGVzCiAJCUZpZWxkQmluZGluZ1tdIGZpZWxkQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2NvdW50XTsKIAkJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25GaWVsZE5hbWVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGNvdW50KTsKLQkJYm9vbGVhbiBkdXBsaWNhdGUgPSBmYWxzZTsKIAkJY291bnQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKIAkJCWlmIChmaWVsZC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSKSB7Ci0JCQkJaWYgKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKSkKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW50ZXJmYWNlQ2Fubm90SGF2ZUluaXRpYWxpemVycyhzb3VyY2VUeXBlLCBmaWVsZCk7CisJCQkJLy8gV2UgdXNlZCB0byByZXBvcnQgYW4gZXJyb3IgZm9yIGluaXRpYWxpemVycyBkZWNsYXJlZCBpbnNpZGUgaW50ZXJmYWNlcywgYnV0CisJCQkJLy8gbm93IHRoaXMgZXJyb3IgcmVwb3J0aW5nIGlzIG1vdmVkIGludG8gdGhlIHBhcnNlciBpdHNlbGYuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEyNzEzCiAJCQl9IGVsc2UgewogCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBuZXcgRmllbGRCaW5kaW5nKGZpZWxkLCBudWxsLCBmaWVsZC5tb2RpZmllcnMgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQsIHNvdXJjZVR5cGUpOwogCQkJCWZpZWxkQmluZGluZy5pZCA9IGNvdW50OwpAQCAtODgsMTQgKzEyMCwxMiBAQAogCQkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yRmllbGQoZmllbGRCaW5kaW5nLCBmaWVsZCk7CiAKIAkJCQlpZiAoa25vd25GaWVsZE5hbWVzLmNvbnRhaW5zS2V5KGZpZWxkLm5hbWUpKSB7Ci0JCQkJCWR1cGxpY2F0ZSA9IHRydWU7CiAJCQkJCUZpZWxkQmluZGluZyBwcmV2aW91c0JpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBrbm93bkZpZWxkTmFtZXMuZ2V0KGZpZWxkLm5hbWUpOwogCQkJCQlpZiAocHJldmlvdXNCaW5kaW5nICE9IG51bGwpIHsKIAkJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgaTsgZisrKSB7CiAJCQkJCQkJRmllbGREZWNsYXJhdGlvbiBwcmV2aW91c0ZpZWxkID0gZmllbGRzW2ZdOwogCQkJCQkJCWlmIChwcmV2aW91c0ZpZWxkLmJpbmRpbmcgPT0gcHJldmlvdXNCaW5kaW5nKSB7CiAJCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUZpZWxkSW5UeXBlKHNvdXJjZVR5cGUsIHByZXZpb3VzRmllbGQpOwotCQkJCQkJCQlwcmV2aW91c0ZpZWxkLmJpbmRpbmcgPSBudWxsOwogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC0xMTEsMzEgKzE0MSwyMCBAQAogCQkJfQogCQl9CiAJCS8vIHJlbW92ZSBkdXBsaWNhdGUgZmllbGRzCi0JCWlmIChkdXBsaWNhdGUpIHsKLQkJCUZpZWxkQmluZGluZ1tdIG5ld0ZpZWxkQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2ZpZWxkQmluZGluZ3MubGVuZ3RoXTsKLQkJCS8vIHdlIGtub3cgd2UnbGwgYmUgcmVtb3ZpbmcgYXQgbGVhc3QgMSBkdXBsaWNhdGUgbmFtZQotCQkJc2l6ZSA9IGNvdW50OwotCQkJY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gZmllbGRCaW5kaW5nc1tpXTsKLQkJCQlpZiAoa25vd25GaWVsZE5hbWVzLmdldChmaWVsZEJpbmRpbmcubmFtZSkgIT0gbnVsbCkgewotCQkJCQlmaWVsZEJpbmRpbmcuaWQgPSBjb3VudDsKLQkJCQkJbmV3RmllbGRCaW5kaW5nc1tjb3VudCsrXSA9IGZpZWxkQmluZGluZzsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWVsZEJpbmRpbmdzID0gbmV3RmllbGRCaW5kaW5nczsKLQkJfQogCQlpZiAoY291bnQgIT0gZmllbGRCaW5kaW5ncy5sZW5ndGgpCiAJCQlTeXN0ZW0uYXJyYXljb3B5KGZpZWxkQmluZGluZ3MsIDAsIGZpZWxkQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOwotCQlzb3VyY2VUeXBlLnRhZ0JpdHMgJj0gfihUYWdCaXRzLkFyZUZpZWxkc1NvcnRlZHxUYWdCaXRzLkFyZUZpZWxkc0NvbXBsZXRlKTsgLy8gaW4gY2FzZSBzb21lIHN0YXRpYyBpbXBvcnRzIHJlYWNoZWQgYWxyZWFkeSBpbnRvIHRoaXMgdHlwZQkJCisJCXNvdXJjZVR5cGUudGFnQml0cyAmPSB+KFRhZ0JpdHMuQXJlRmllbGRzU29ydGVkfFRhZ0JpdHMuQXJlRmllbGRzQ29tcGxldGUpOyAvLyBpbiBjYXNlIHNvbWUgc3RhdGljIGltcG9ydHMgcmVhY2hlZCBhbHJlYWR5IGludG8gdGhpcyB0eXBlCiAJCXNvdXJjZVR5cGUuc2V0RmllbGRzKGZpZWxkQmluZGluZ3MpOwogCX0KLQkKKwogCXZvaWQgYnVpbGRGaWVsZHNBbmRNZXRob2RzKCkgewogCQlidWlsZEZpZWxkcygpOwogCQlidWlsZE1ldGhvZHMoKTsKIAotCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCWlmICghc291cmNlVHlwZS5pc1ByaXZhdGUoKSAmJiBzb3VyY2VUeXBlLnN1cGVyY2xhc3MgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZyAmJiBzb3VyY2VUeXBlLnN1cGVyY2xhc3MuaXNQcml2YXRlKCkpCisJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlLnN1cGVyY2xhc3MpLnRhZ0luZGlyZWN0bHlBY2Nlc3NpYmxlTWVtYmVycygpOworCiAJCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpICYmICFzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpCiAJCQkgKChNZW1iZXJUeXBlQmluZGluZykgc291cmNlVHlwZSkuY2hlY2tTeW50aGV0aWNBcmdzQW5kRmllbGRzKCk7CiAKQEAgLTE0MywyNyArMTYyLDI3IEBACiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKIAkJCSAoKFNvdXJjZVR5cGVCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkuc2NvcGUuYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7CiAJfQotCQorCiAJcHJpdmF0ZSBMb2NhbFR5cGVCaW5kaW5nIGJ1aWxkTG9jYWxUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7Ci0JICAgIAotCQlyZWZlcmVuY2VDb250ZXh0LnNjb3BlID0gdGhpczsKLQkJcmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIHRydWUpOwotCQlyZWZlcmVuY2VDb250ZXh0LmluaXRpYWxpemVyU2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgcmVmZXJlbmNlQ29udGV4dCwgZmFsc2UpOworCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5zY29wZSA9IHRoaXM7CisJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHRoaXMucmVmZXJlbmNlQ29udGV4dCwgdHJ1ZSk7CisJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5pbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHRoaXMucmVmZXJlbmNlQ29udGV4dCwgZmFsc2UpOwogCiAJCS8vIGJ1aWxkIHRoZSBiaW5kaW5nIG9yIHRoZSBsb2NhbCB0eXBlCi0JCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbmV3IExvY2FsVHlwZUJpbmRpbmcodGhpcywgZW5jbG9zaW5nVHlwZSwgdGhpcy5pbm5lcm1vc3RTd2l0Y2hDYXNlKCkpOwotCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBsb2NhbFR5cGU7CisJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbmV3IExvY2FsVHlwZUJpbmRpbmcodGhpcywgZW5jbG9zaW5nVHlwZSwgaW5uZXJtb3N0U3dpdGNoQ2FzZSgpKTsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBsb2NhbFR5cGU7CiAJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKCk7CiAJCWJ1aWxkVHlwZVZhcmlhYmxlcygpOwotCQkKKwogCQkvLyBMb29rIGF0IG1lbWJlciB0eXBlcwogCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZUJpbmRpbmdzID0gQmluZGluZy5OT19NRU1CRVJfVFlQRVM7Ci0JCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcy5sZW5ndGg7CisJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMubGVuZ3RoOwogCQkJbWVtYmVyVHlwZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZV07CiAJCQlpbnQgY291bnQgPSAwOwogCQkJbmV4dE1lbWJlciA6IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlckNvbnRleHQgPSByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldOworCQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJDb250ZXh0ID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldOwogCQkJCXN3aXRjaChUeXBlRGVjbGFyYXRpb24ua2luZChtZW1iZXJDb250ZXh0Lm1vZGlmaWVycykpIHsKIAkJCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wgOgogCQkJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCA6CkBAIC0xODEsMTIgKzIwMCwxMiBAQAogCQkJCX0gd2hpbGUgKHR5cGUgIT0gbnVsbCk7CiAJCQkJLy8gY2hlY2sgdGhlIG1lbWJlciB0eXBlIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW5vdGhlciBzaWJsaW5nIG1lbWJlciB0eXBlCiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbal0ubmFtZSwgbWVtYmVyQ29udGV4dC5uYW1lKSkgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5yZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsKIAkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU5lc3RlZFR5cGUobWVtYmVyQ29udGV4dCk7CiAJCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOwogCQkJCQl9CiAJCQkJfQotCQkJCUNsYXNzU2NvcGUgbWVtYmVyU2NvcGUgPSBuZXcgQ2xhc3NTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldKTsKKwkJCQlDbGFzc1Njb3BlIG1lbWJlclNjb3BlID0gbmV3IENsYXNzU2NvcGUodGhpcywgdGhpcy5yZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldKTsKIAkJCQlMb2NhbFR5cGVCaW5kaW5nIG1lbWJlckJpbmRpbmcgPSBtZW1iZXJTY29wZS5idWlsZExvY2FsVHlwZShsb2NhbFR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKIAkJCQltZW1iZXJCaW5kaW5nLnNldEFzTWVtYmVyVHlwZSgpOwogCQkJCW1lbWJlclR5cGVCaW5kaW5nc1tjb3VudCsrXSA9IG1lbWJlckJpbmRpbmc7CkBAIC0xOTcsMjYgKzIxNiwzMCBAQAogCQlsb2NhbFR5cGUubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlQmluZGluZ3M7CiAJCXJldHVybiBsb2NhbFR5cGU7CiAJfQotCQorCiAJdm9pZCBidWlsZExvY2FsVHlwZUJpbmRpbmcoU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgewogCiAJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gYnVpbGRMb2NhbFR5cGUoZW5jbG9zaW5nVHlwZSwgZW5jbG9zaW5nVHlwZS5mUGFja2FnZSk7CiAJCWNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisJCWlmIChjb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQljaGVja1BhcmFtZXRlcml6ZWRUeXBlQm91bmRzKCk7CisJCQljaGVja1BhcmFtZXRlcml6ZWRTdXBlclR5cGVDb2xsaXNpb25zKCk7CisJCX0KIAkJYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7CiAJCWxvY2FsVHlwZS5mYXVsdEluVHlwZXNGb3JGaWVsZHNBbmRNZXRob2RzKCk7CiAKLQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnZlcmlmeU1ldGhvZHMoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpKTsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcudmVyaWZ5TWV0aG9kcyhlbnZpcm9ubWVudCgpLm1ldGhvZFZlcmlmaWVyKCkpOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBidWlsZE1lbWJlclR5cGVzKEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7Ci0JICAgIFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJICAgIFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKIAkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVCaW5kaW5ncyA9IEJpbmRpbmcuTk9fTUVNQkVSX1RZUEVTOwotCQlpZiAocmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcy5sZW5ndGg7CisJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcy5sZW5ndGg7CiAJCQltZW1iZXJUeXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOwogCQkJaW50IGNvdW50ID0gMDsKIAkJCW5leHRNZW1iZXIgOiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlckNvbnRleHQgPSByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldOworCQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJDb250ZXh0ID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldOwogCQkJCXN3aXRjaChUeXBlRGVjbGFyYXRpb24ua2luZChtZW1iZXJDb250ZXh0Lm1vZGlmaWVycykpIHsKIAkJCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wgOgogCQkJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCA6CkBAIC0yMjYsNyArMjQ5LDcgQEAKIAkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTG9jYWxUeXBlRGVjbGFyYXRpb24obWVtYmVyQ29udGV4dCk7CiAJCQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsKIAkJCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkJCisJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBzb3VyY2VUeXBlOwogCQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlCkBAIC0yMzksNyArMjYyLDcgQEAKIAkJCQl9IHdoaWxlICh0eXBlICE9IG51bGwpOwogCQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciB0eXBlIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW5vdGhlciBzaWJsaW5nIG1lbWJlciB0eXBlCiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbal0ubmFtZSwgbWVtYmVyQ29udGV4dC5uYW1lKSkgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5yZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsKIAkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU5lc3RlZFR5cGUobWVtYmVyQ29udGV4dCk7CiAJCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOwogCQkJCQl9CkBAIC0yNTMsMTYgKzI3NiwxOSBAQAogCQl9CiAJCXNvdXJjZVR5cGUubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlQmluZGluZ3M7CiAJfQotCQotCXByaXZhdGUgdm9pZCBidWlsZE1ldGhvZHMoKSB7Ci0JCWJvb2xlYW4gaXNFbnVtID0gVHlwZURlY2xhcmF0aW9uLmtpbmQocmVmZXJlbmNlQ29udGV4dC5tb2RpZmllcnMpID09IFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0w7Ci0JCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHMgPT0gbnVsbCAmJiAhaXNFbnVtKSB7Ci0JCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcuc2V0TWV0aG9kcyhCaW5kaW5nLk5PX01FVEhPRFMpOworCisJdm9pZCBidWlsZE1ldGhvZHMoKSB7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKHNvdXJjZVR5cGUuYXJlTWV0aG9kc0luaXRpYWxpemVkKCkpIHJldHVybjsKKworCQlib29sZWFuIGlzRW51bSA9IFR5cGVEZWNsYXJhdGlvbi5raW5kKHRoaXMucmVmZXJlbmNlQ29udGV4dC5tb2RpZmllcnMpID09IFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0w7CisJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQubWV0aG9kcyA9PSBudWxsICYmICFpc0VudW0pIHsKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnNldE1ldGhvZHMoQmluZGluZy5OT19NRVRIT0RTKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCS8vIGl0ZXJhdGUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMgdG8gY3JlYXRlIHRoZSBiaW5kaW5ncwotCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsKIAkJaW50IHNpemUgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CiAJCS8vIGxvb2sgZm9yIDxjbGluaXQ+IG1ldGhvZAogCQlpbnQgY2xpbml0SW5kZXggPSAtMTsKQEAgLTI3NiwzOSArMzAyLDY5IEBACiAJCWludCBjb3VudCA9IGlzRW51bSA/IDIgOiAwOyAvLyByZXNlcnZlIDIgc2xvdHMgZm9yIHNwZWNpYWwgZW51bSBtZXRob2RzOiAjdmFsdWVzKCkgYW5kICN2YWx1ZU9mKFN0cmluZykKIAkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZEJpbmRpbmdzID0gbmV3IE1ldGhvZEJpbmRpbmdbKGNsaW5pdEluZGV4ID09IC0xID8gc2l6ZSA6IHNpemUgLSAxKSArIGNvdW50XTsKIAkJLy8gY3JlYXRlIHNwZWNpYWwgbWV0aG9kcyBmb3IgZW51bXMKLQkgICAgU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKIAkJaWYgKGlzRW51bSkgewotCQkJbWV0aG9kQmluZGluZ3NbMF0gPSBzb3VyY2VUeXBlLmFkZFN5bnRoZXRpY0VudW1NZXRob2QoVHlwZUNvbnN0YW50cy5WQUxVRVMpOyAvLyBhZGQgPEVudW1UeXBlPltdIHZhbHVlcygpIAotCQkJbWV0aG9kQmluZGluZ3NbMV0gPSBzb3VyY2VUeXBlLmFkZFN5bnRoZXRpY0VudW1NZXRob2QoVHlwZUNvbnN0YW50cy5WQUxVRU9GKTsgLy8gYWRkIDxFbnVtVHlwZT4gdmFsdWVPZigpIAorCQkJbWV0aG9kQmluZGluZ3NbMF0gPSBzb3VyY2VUeXBlLmFkZFN5bnRoZXRpY0VudW1NZXRob2QoVHlwZUNvbnN0YW50cy5WQUxVRVMpOyAvLyBhZGQgPEVudW1UeXBlPltdIHZhbHVlcygpCisJCQltZXRob2RCaW5kaW5nc1sxXSA9IHNvdXJjZVR5cGUuYWRkU3ludGhldGljRW51bU1ldGhvZChUeXBlQ29uc3RhbnRzLlZBTFVFT0YpOyAvLyBhZGQgPEVudW1UeXBlPiB2YWx1ZU9mKCkKIAkJfQogCQkvLyBjcmVhdGUgYmluZGluZ3MgZm9yIHNvdXJjZSBtZXRob2RzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaSAhPSBjbGluaXRJbmRleCkgewotCQkJCU1ldGhvZFNjb3BlIHNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIG1ldGhvZHNbaV0sIGZhbHNlKTsKLQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBzY29wZS5jcmVhdGVNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgLy8gaXMgbnVsbCBpZiBiaW5kaW5nIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JCQkJCW1ldGhvZEJpbmRpbmdzW2NvdW50KytdID0gbWV0aG9kQmluZGluZzsKKwkJYm9vbGVhbiBoYXNOYXRpdmVNZXRob2RzID0gZmFsc2U7CisJCWlmIChzb3VyY2VUeXBlLmlzQWJzdHJhY3QoKSkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlpZiAoaSAhPSBjbGluaXRJbmRleCkgeworCQkJCQlNZXRob2RTY29wZSBzY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCBtZXRob2RzW2ldLCBmYWxzZSk7CisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHNjb3BlLmNyZWF0ZU1ldGhvZChtZXRob2RzW2ldKTsKKwkJCQkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgeyAvLyBpcyBudWxsIGlmIGJpbmRpbmcgY291bGQgbm90IGJlIGNyZWF0ZWQKKwkJCQkJCW1ldGhvZEJpbmRpbmdzW2NvdW50KytdID0gbWV0aG9kQmluZGluZzsKKwkJCQkJCWhhc05hdGl2ZU1ldGhvZHMgPSBoYXNOYXRpdmVNZXRob2RzIHx8IG1ldGhvZEJpbmRpbmcuaXNOYXRpdmUoKTsKKwkJCQkJfQorCQkJCX0KIAkJCX0KKwkJfSBlbHNlIHsKKwkJCWJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzID0gZmFsc2U7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWlmIChpICE9IGNsaW5pdEluZGV4KSB7CisJCQkJCU1ldGhvZFNjb3BlIHNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIG1ldGhvZHNbaV0sIGZhbHNlKTsKKwkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gc2NvcGUuY3JlYXRlTWV0aG9kKG1ldGhvZHNbaV0pOworCQkJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7IC8vIGlzIG51bGwgaWYgYmluZGluZyBjb3VsZCBub3QgYmUgY3JlYXRlZAorCQkJCQkJbWV0aG9kQmluZGluZ3NbY291bnQrK10gPSBtZXRob2RCaW5kaW5nOworCQkJCQkJaGFzQWJzdHJhY3RNZXRob2RzID0gaGFzQWJzdHJhY3RNZXRob2RzIHx8IG1ldGhvZEJpbmRpbmcuaXNBYnN0cmFjdCgpOworCQkJCQkJaGFzTmF0aXZlTWV0aG9kcyA9IGhhc05hdGl2ZU1ldGhvZHMgfHwgbWV0aG9kQmluZGluZy5pc05hdGl2ZSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGhhc0Fic3RyYWN0TWV0aG9kcykKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZEluQ29uY3JldGVDbGFzcyhzb3VyY2VUeXBlKTsKIAkJfQogCQlpZiAoY291bnQgIT0gbWV0aG9kQmluZGluZ3MubGVuZ3RoKQogCQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RCaW5kaW5ncywgMCwgbWV0aG9kQmluZGluZ3MgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsKIAkJc291cmNlVHlwZS50YWdCaXRzICY9IH4oVGFnQml0cy5BcmVNZXRob2RzU29ydGVkfFRhZ0JpdHMuQXJlTWV0aG9kc0NvbXBsZXRlKTsgLy8gaW4gY2FzZSBzb21lIHN0YXRpYyBpbXBvcnRzIHJlYWNoZWQgYWxyZWFkeSBpbnRvIHRoaXMgdHlwZQogCQlzb3VyY2VUeXBlLnNldE1ldGhvZHMobWV0aG9kQmluZGluZ3MpOworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzOTE3LCBjb25zZXJ2YXRpdmVseSB0YWcgYWxsIG1ldGhvZHMgYW5kIGZpZWxkcyBhcworCQkvLyBiZWluZyBpbiB1c2UgaWYgdGhlcmUgaXMgYSBuYXRpdmUgbWV0aG9kIGluIHRoZSBjbGFzcy4KKwkJaWYgKGhhc05hdGl2ZU1ldGhvZHMpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQmluZGluZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQltZXRob2RCaW5kaW5nc1tpXS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKKwkJCX0KKwkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHNvdXJjZVR5cGUudW5SZXNvbHZlZEZpZWxkcygpOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxNjgzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJCWZpZWxkc1tpXS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsJCisJCQl9CisJCX0KIAl9Ci0JCisKIAlTb3VyY2VUeXBlQmluZGluZyBidWlsZFR5cGUoU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcsIEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7CiAJCS8vIHByb3ZpZGUgdGhlIHR5cGVEZWNsYXJhdGlvbiB3aXRoIG5lZWRlZCBzY29wZXMKLQkJcmVmZXJlbmNlQ29udGV4dC5zY29wZSA9IHRoaXM7Ci0JCXJlZmVyZW5jZUNvbnRleHQuc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCB0cnVlKTsKLQkJcmVmZXJlbmNlQ29udGV4dC5pbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIGZhbHNlKTsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LnNjb3BlID0gdGhpczsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LnN0YXRpY0luaXRpYWxpemVyU2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgdGhpcy5yZWZlcmVuY2VDb250ZXh0LCB0cnVlKTsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmluaXRpYWxpemVyU2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgdGhpcy5yZWZlcmVuY2VDb250ZXh0LCBmYWxzZSk7CiAKIAkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgewotCQkJY2hhcltdW10gY2xhc3NOYW1lID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUsIHJlZmVyZW5jZUNvbnRleHQubmFtZSk7Ci0JCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgU291cmNlVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCBwYWNrYWdlQmluZGluZywgdGhpcyk7CisJCQljaGFyW11bXSBjbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgdGhpcy5yZWZlcmVuY2VDb250ZXh0Lm5hbWUpOworCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgU291cmNlVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCBwYWNrYWdlQmluZGluZywgdGhpcyk7CiAJCX0gZWxzZSB7CiAJCQljaGFyW11bXSBjbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmRlZXBDb3B5KGVuY2xvc2luZ1R5cGUuY29tcG91bmROYW1lKTsKIAkJCWNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV0gPQotCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KGNsYXNzTmFtZVtjbGFzc05hbWUubGVuZ3RoIC0gMV0sIHJlZmVyZW5jZUNvbnRleHQubmFtZSwgJyQnKTsKKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWVbY2xhc3NOYW1lLmxlbmd0aCAtIDFdLCB0aGlzLnJlZmVyZW5jZUNvbnRleHQubmFtZSwgJyQnKTsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZXhpc3RpbmdUeXBlID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZTAoY2xhc3NOYW1lW2NsYXNzTmFtZS5sZW5ndGggLSAxXSk7CiAJCQlpZiAoZXhpc3RpbmdUeXBlICE9IG51bGwpIHsKIAkJCQlpZiAoZXhpc3RpbmdUeXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIHsKQEAgLTMxNiw0MyArMzcyLDQyIEBACiAJCQkJCS8vIHNvIGp1c3QgcmVwbGFjZSB0aGUgdW5yZXNvbHZlZCB0eXBlIHdpdGggYSBuZXcgbWVtYmVyIHR5cGUKIAkJCQl9IGVsc2UgewogCQkJCQkvLyByZXBvcnQgdGhlIGVycm9yIGFnYWluc3QgdGhlIHBhcmVudCAtIGl0cyBzdGlsbCBzYWZlIHRvIGFuc3dlciB0aGUgbWVtYmVyIHR5cGUKLQkJCQkJdGhpcy5wYXJlbnQucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTmVzdGVkVHlwZShyZWZlcmVuY2VDb250ZXh0KTsKKwkJCQkJdGhpcy5wYXJlbnQucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTmVzdGVkVHlwZSh0aGlzLnJlZmVyZW5jZUNvbnRleHQpOwogCQkJCX0KIAkJCX0KLQkJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZyA9IG5ldyBNZW1iZXJUeXBlQmluZGluZyhjbGFzc05hbWUsIHRoaXMsIGVuY2xvc2luZ1R5cGUpOworCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcgPSBuZXcgTWVtYmVyVHlwZUJpbmRpbmcoY2xhc3NOYW1lLCB0aGlzLCBlbmNsb3NpbmdUeXBlKTsKIAkJfQogCi0JCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7Ci0JCWVudmlyb25tZW50KCkuc2V0QWNjZXNzUmVzdHJpY3Rpb24oc291cmNlVHlwZSwgYWNjZXNzUmVzdHJpY3Rpb24pOwkJCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJZW52aXJvbm1lbnQoKS5zZXRBY2Nlc3NSZXN0cmljdGlvbihzb3VyY2VUeXBlLCBhY2Nlc3NSZXN0cmljdGlvbik7CiAJCXNvdXJjZVR5cGUuZlBhY2thZ2UuYWRkVHlwZShzb3VyY2VUeXBlKTsKIAkJY2hlY2tBbmRTZXRNb2RpZmllcnMoKTsKIAkJYnVpbGRUeXBlVmFyaWFibGVzKCk7CiAJCWJ1aWxkTWVtYmVyVHlwZXMoYWNjZXNzUmVzdHJpY3Rpb24pOwogCQlyZXR1cm4gc291cmNlVHlwZTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgYnVpbGRUeXBlVmFyaWFibGVzKCkgewotCSAgICAKLQkgICAgU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKLQkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gcmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVyczsKLQkJCi0JICAgIC8vIGRvIG5vdCBjb25zdHJ1Y3QgdHlwZSB2YXJpYWJsZXMgaWYgc291cmNlIDwgMS41Ci0JCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCisJICAgIFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LnR5cGVQYXJhbWV0ZXJzOworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODUwLCBJZiB0aGV5IGV4aXN0IGF0IGFsbCwgcHJvY2VzcyB0eXBlIHBhcmFtZXRlcnMgaXJyZXNwZWN0aXZlIG9mIHNvdXJjZSBsZXZlbC4KKwkJaWYgKHR5cGVQYXJhbWV0ZXJzID09IG51bGwgfHwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IDApIHsKIAkJICAgIHNvdXJjZVR5cGUudHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CiAJCSAgICByZXR1cm47CiAJCX0KIAkJc291cmNlVHlwZS50eXBlVmFyaWFibGVzID0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUzsgLy8gc2FmZXR5CiAKLQkJaWYgKHNvdXJjZVR5cGUuaWQgPT0gVF9KYXZhTGFuZ09iamVjdCkgeyAvLyBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVkZWZpbmluZyBqYXZhLmxhbmcuT2JqZWN0IHVwIGZyb250Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5vYmplY3RDYW5ub3RCZUdlbmVyaWMocmVmZXJlbmNlQ29udGV4dCk7Ci0JCQlyZXR1cm47IAorCQlpZiAoc291cmNlVHlwZS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsgLy8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlZGVmaW5pbmcgamF2YS5sYW5nLk9iamVjdCB1cCBmcm9udAorCQkJcHJvYmxlbVJlcG9ydGVyKCkub2JqZWN0Q2Fubm90QmVHZW5lcmljKHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CisJCQlyZXR1cm47CiAJCX0KIAkJc291cmNlVHlwZS50eXBlVmFyaWFibGVzID0gY3JlYXRlVHlwZVZhcmlhYmxlcyh0eXBlUGFyYW1ldGVycywgc291cmNlVHlwZSk7CiAJCXNvdXJjZVR5cGUubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnMoKSB7Ci0JCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKIAkJaW50IG1vZGlmaWVycyA9IHNvdXJjZVR5cGUubW9kaWZpZXJzOwogCQlpZiAoKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSAhPSAwKQogCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTW9kaWZpZXJGb3JUeXBlKHNvdXJjZVR5cGUpOwpAQCAtMzY5LDE4ICs0MjQsMTYgQEAKIAkJCQllbHNlCiAJCQkJCW1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljOwogCQkJfQotCQkJaWYgKGVuY2xvc2luZ1R5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhc291cmNlVHlwZS5pc0RlcHJlY2F0ZWQoKSkKLQkJCQltb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZXByZWNhdGVkSW1wbGljaXRseTsKIAkJfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpIHsKIAkJCWlmIChzb3VyY2VUeXBlLmlzRW51bSgpKSB7Ci0JCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbExvY2FsVHlwZURlY2xhcmF0aW9uKHJlZmVyZW5jZUNvbnRleHQpOworCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLnJlZmVyZW5jZUNvbnRleHQpOwogCQkJCXNvdXJjZVR5cGUubW9kaWZpZXJzID0gMDsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlpZiAoc291cmNlVHlwZS5pc0Fub255bW91c1R5cGUoKSkgewogCQkJICAgIG1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWw7CiAJCQkgICAgLy8gc2V0IEFjY0VudW0gZmxhZyBmb3IgYW5vbnltb3VzIGJvZHkgb2YgZW51bSBjb25zdGFudHMKLQkJCSAgICBpZiAocmVmZXJlbmNlQ29udGV4dC5hbGxvY2F0aW9uLnR5cGUgPT0gbnVsbCkKKwkJCSAgICBpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0LmFsbG9jYXRpb24udHlwZSA9PSBudWxsKQogCQkJICAgIAltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW07CiAJCQl9CiAJCQlTY29wZSBzY29wZSA9IHRoaXM7CkBAIC0zOTAsNyArNDQzLDcgQEAKIAkJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsKIAkJCQkJCWlmIChtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyKCkpIHsKIAkJCQkJCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlID0gKChUeXBlRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmc7Ci0JCQkKKwogCQkJCQkJCS8vIGluc2lkZSBmaWVsZCBkZWNsYXJhdGlvbiA/IGNoZWNrIGZpZWxkIG1vZGlmaWVyIHRvIHNlZSBpZiBkZXByZWNhdGVkCiAJCQkJCQkJaWYgKG1ldGhvZFNjb3BlLmluaXRpYWxpemVkRmllbGQgIT0gbnVsbCkgewogCQkJCQkJCQkJLy8gY3VycmVudGx5IGluc2lkZSB0aGlzIGZpZWxkIGluaXRpYWxpemF0aW9uCkBAIC0zOTksOSArNDUyLDkgQEAKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlpZiAodHlwZS5pc1N0cmljdGZwKCkpCiAJCQkJCQkJCQltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwOwotCQkJCQkJCQlpZiAodHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmICFzb3VyY2VUeXBlLmlzRGVwcmVjYXRlZCgpKSAKKwkJCQkJCQkJaWYgKHR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhc291cmNlVHlwZS5pc0RlcHJlY2F0ZWQoKSkKIAkJCQkJCQkJCW1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5OwotCQkJCQkJCX0JCQkJCQorCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmc7CiAJCQkJCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7CkBAIC00NTMsMTcgKzUwNiwyNiBAQAogCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlKHNvdXJjZVR5cGUpOwogCQkJCX0KIAkJCX0KKwkJCS8qCisJCQkgKiBBY2NTeW50aGV0aWMgbXVzdCBiZSBzZXQgaWYgdGhlIHRhcmdldCBpcyBncmVhdGVyIHRoYW4gMS41LiAxLjUgVk0gZG9uJ3Qgc3VwcG9ydCBBY2NTeW50aGV0aWNzIGZsYWcuCisJCQkgKi8KKwkJCWlmIChzb3VyY2VUeXBlLnNvdXJjZU5hbWUgPT0gVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSAmJiBjb21waWxlck9wdGlvbnMoKS50YXJnZXRKREsgPiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJbW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWM7CisJCQl9CiAJCQltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0OwogCQl9IGVsc2UgaWYgKChyZWFsTW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0pICE9IDApIHsKIAkJCS8vIGRldGVjdCBhYm5vcm1hbCBjYXNlcyBmb3IgZW51bXMKIAkJCWlmIChpc01lbWJlclR5cGUpIHsgLy8gaW5jbHVkZXMgbWVtYmVyIHR5cGVzIGRlZmluZWQgaW5zaWRlIGxvY2FsIHR5cGVzCiAJCQkJZmluYWwgaW50IFVORVhQRUNURURfTU9ESUZJRVJTID0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKTsKLQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkKKwkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkgewogCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJFbnVtKHNvdXJjZVR5cGUpOwotCQkJfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpIHsgLy8gZWFjaCBlbnVtIGNvbnN0YW50IGlzIGFuIGFub255bW91cyBsb2NhbCB0eXBlCi0JCQkJZmluYWwgaW50IFVORVhQRUNURURfTU9ESUZJRVJTID0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnAgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bSk7IC8vIGFkZCBmaW5hbCBzaW5jZSBpbXBsaWNpdGx5IHNldCBmb3IgYW5vbnltb3VzIHR5cGUKLQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTG9jYWxFbnVtKHNvdXJjZVR5cGUpOworCQkJCQltb2RpZmllcnMgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdDsgLy8gYXZvaWQgbGVha2luZyBhYnN0cmFjdCBtb2RpZmllcgorCQkJCQlyZWFsTW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3Q7CisvLwkJCQkJbW9kaWZpZXJzICY9IH4ocmVhbE1vZGlmaWVycyAmIFVORVhQRUNURURfTU9ESUZJRVJTKTsKKy8vCQkJCQlyZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQkJCS8vIGVhY2ggZW51bSBjb25zdGFudCBpcyBhbiBhbm9ueW1vdXMgbG9jYWwgdHlwZSBhbmQgaXRzIG1vZGlmaWVycyB3ZXJlIGFscmVhZHkgY2hlY2tlZCBhcyBhbiBlbnVtIGNvbnN0YW50IGZpZWxkCiAJCQl9IGVsc2UgewogCQkJCWZpbmFsIGludCBVTkVYUEVDVEVEX01PRElGSUVSUyA9IH4oQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKTsKIAkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkKQEAgLTQ3MiwxMCArNTM0LDEwIEBACiAJCQlpZiAoIXNvdXJjZVR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsKIAkJCQljaGVja0Fic3RyYWN0RW51bTogewogCQkJCQkvLyBkb2VzIGRlZmluZSBhYnN0cmFjdCBtZXRob2RzID8KLQkJCQkJaWYgKChyZWZlcmVuY2VDb250ZXh0LmJpdHMgJiBBU1ROb2RlLkhhc0Fic3RyYWN0TWV0aG9kcykgIT0gMCkgeworCQkJCQlpZiAoKHRoaXMucmVmZXJlbmNlQ29udGV4dC5iaXRzICYgQVNUTm9kZS5IYXNBYnN0cmFjdE1ldGhvZHMpICE9IDApIHsKIAkJCQkJCW1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3Q7CiAJCQkJCQlicmVhayBjaGVja0Fic3RyYWN0RW51bTsKLQkJCQkJfSAJCQkJCQorCQkJCQl9CiAJCQkJCS8vIGJvZHkgb2YgZW51bSBjb25zdGFudCBtdXN0IGltcGxlbWVudCBhbnkgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKIAkJCQkJLy8gZW51bSB0eXBlIG5lZWRzIHRvIGltcGxlbWVudCBhYnN0cmFjdCBtZXRob2RzIGlmIG9uZSBvZiBpdHMgY29uc3RhbnRzIGRvZXMgbm90IHN1cHBseSBhIGJvZHkKIAkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMucmVmZXJlbmNlQ29udGV4dDsKQEAgLTUwMSw3ICs1NjMsNyBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJCS8vIHRhZyB0aGlzIGVudW0gYXMgYWJzdHJhY3Qgc2luY2UgYW4gYWJzdHJhY3QgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgQU5EIGFsbCBlbnVtIGNvbnN0YW50cyBkZWZpbmUgYW4gYW5vbnltb3VzIGJvZHkKLQkJCQkJLy8gYXMgYSByZXN1bHQsIGVhY2ggb2YgaXRzIGFub255bW91cyBjb25zdGFudHMgd2lsbCBzZWUgaXQgYXMgYWJzdHJhY3QgYW5kIG11c3QgaW1wbGVtZW50IGVhY2ggaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZAkJCQkJCisJCQkJCS8vIGFzIGEgcmVzdWx0LCBlYWNoIG9mIGl0cyBhbm9ueW1vdXMgY29uc3RhbnRzIHdpbGwgc2VlIGl0IGFzIGFic3RyYWN0IGFuZCBtdXN0IGltcGxlbWVudCBlYWNoIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QKIAkJCQkJaWYgKG5lZWRBYnN0cmFjdEJpdCkgewogCQkJCQkJbW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdDsKIAkJCQkJfQpAQCAtNTIxLDcgKzU4Myw3IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJbW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbDsKLQkJCQl9CQkJCisJCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJLy8gZGV0ZWN0IGFibm9ybWFsIGNhc2VzIGZvciBjbGFzc2VzCkBAIC01ODUsNyArNjQ3LDcgQEAKIAogCQlzb3VyY2VUeXBlLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKIAl9Ci0JCisKIAkvKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIG1vZGlmaWVycyBvZiBhIGZpZWxkLgogCSoKIAkqIDkuMyAmIDguMwpAQCAtNjE3LDkgKzY3OSwxMyBAQAogCQkJLy8gY2hlY2sgdGhhdCB0aGV5IGFyZSBub3QgbW9kaWZpZXJzIGluIHNvdXJjZQogCQkJaWYgKChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnKSAhPSAwKQogCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckVudW1Db25zdGFudChkZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsKLQkJCisKIAkJCS8vIHNldCB0aGUgbW9kaWZpZXJzCi0JCQlmaW5hbCBpbnQgSU1QTElDSVRfTU9ESUZJRVJTID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bTsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc2NzAuIEZvcmNlIGFsbCBlbnVtZXJhdG9ycyB0byBiZSBtYXJrZWQKKwkJCS8vIGFzIHVzZWQgbG9jYWxseS4gV2UgYXJlIHVuYWJsZSB0byB0cmFjayB0aGUgdXNhZ2Ugb2YgdGhlc2UgcmVsaWFibHkgYXMgdGhleSBjb3VsZCBiZSB1c2VkCisJCQkvLyBpbiBub24gb2J2aW91cyB3YXlzIHZpYSB0aGUgc3ludGhlc2l6ZWQgbWV0aG9kcyB2YWx1ZXMoKSBhbmQgdmFsdWVPZihTdHJpbmcpIG9yIGJ5IHVzaW5nIAorCQkJLy8gRW51bS52YWx1ZU9mKENsYXNzPFQ+LCBTdHJpbmcpLgorCQkJZmluYWwgaW50IElNUExJQ0lUX01PRElGSUVSUyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0gfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOwogCQkJZmllbGRCaW5kaW5nLm1vZGlmaWVyc3w9IElNUExJQ0lUX01PRElGSUVSUzsKIAkJCXJldHVybjsKIAkJfQpAQCAtNjU3LDE5ICs3MjMsMTkgQEAKIAogCXB1YmxpYyB2b2lkIGNoZWNrUGFyYW1ldGVyaXplZFN1cGVyVHlwZUNvbGxpc2lvbnMoKSB7CiAJCS8vIGNoZWNrIGZvciBwYXJhbWV0ZXJpemVkIGludGVyZmFjZSBjb2xsaXNpb25zICh3aGVuIGRpZmZlcmVudCBwYXJhbWV0ZXJpemF0aW9ucyBvY2N1cikKLQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwogCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IHNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzOwogCQlNYXAgaW52b2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgyKTsKIAkJUmVmZXJlbmNlQmluZGluZyBpdHNTdXBlcmNsYXNzID0gc291cmNlVHlwZS5pc0ludGVyZmFjZSgpID8gbnVsbCA6IHNvdXJjZVR5cGUuc3VwZXJjbGFzczsKIAkJbmV4dEludGVyZmFjZTogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgb25lID0gIGludGVyZmFjZXNbaV07CiAJCQlpZiAob25lID09IG51bGwpIGNvbnRpbnVlIG5leHRJbnRlcmZhY2U7Ci0JCQlpZiAoaXRzU3VwZXJjbGFzcyAhPSBudWxsICYmIGhhc0VyYXNlZENhbmRpZGF0ZXNDb2xsaXNpb25zKGl0c1N1cGVyY2xhc3MsIG9uZSwgaW52b2NhdGlvbnMsIHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQpKQorCQkJaWYgKGl0c1N1cGVyY2xhc3MgIT0gbnVsbCAmJiBoYXNFcmFzZWRDYW5kaWRhdGVzQ29sbGlzaW9ucyhpdHNTdXBlcmNsYXNzLCBvbmUsIGludm9jYXRpb25zLCBzb3VyY2VUeXBlLCB0aGlzLnJlZmVyZW5jZUNvbnRleHQpKQogCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CiAJCQluZXh0T3RoZXJJbnRlcmZhY2U6IGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJUmVmZXJlbmNlQmluZGluZyB0d28gPSBpbnRlcmZhY2VzW2pdOwogCQkJCWlmICh0d28gPT0gbnVsbCkgY29udGludWUgbmV4dE90aGVySW50ZXJmYWNlOwotCQkJCWlmIChoYXNFcmFzZWRDYW5kaWRhdGVzQ29sbGlzaW9ucyhvbmUsIHR3bywgaW52b2NhdGlvbnMsIHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQpKQorCQkJCWlmIChoYXNFcmFzZWRDYW5kaWRhdGVzQ29sbGlzaW9ucyhvbmUsIHR3bywgaW52b2NhdGlvbnMsIHNvdXJjZVR5cGUsIHRoaXMucmVmZXJlbmNlQ29udGV4dCkpCiAJCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CiAJCQl9CiAJCX0KQEAgLTcwMCw3ICs3NjYsNyBAQAogCQkJfQogCQl9CiAKLQkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLm1lbWJlclR5cGVzOworCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZW1iZXJUeXBlczsKIAkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMgIT0gQmluZGluZy5OT19NRU1CRVJfVFlQRVMpCiAJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IHNpemU7IGkrKykKIAkJCQkgKChTb3VyY2VUeXBlQmluZGluZykgbWVtYmVyVHlwZXNbaV0pLnNjb3BlLmNoZWNrUGFyYW1ldGVyaXplZFN1cGVyVHlwZUNvbGxpc2lvbnMoKTsKQEAgLTc3NywyOCArODQzLDE4IEBACiAKIAkvLyBQZXJmb3JtIGRlZmVycmVkIGJvdW5kIGNoZWNrcyBmb3IgcGFyYW1ldGVyaXplZCB0eXBlIHJlZmVyZW5jZXMgKG9ubHkgZG9uZSBhZnRlciBoaWVyYXJjaHkgaXMgY29ubmVjdGVkKQogCXB1YmxpYyB2b2lkICBjaGVja1BhcmFtZXRlcml6ZWRUeXBlQm91bmRzKCkgewotCQlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSByZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3M7Ci0JCWlmIChzdXBlcmNsYXNzICE9IG51bGwpCi0JCQlzdXBlcmNsYXNzLmNoZWNrQm91bmRzKHRoaXMpOworCQlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMuZGVmZXJyZWRCb3VuZENoZWNrcyA9PSBudWxsID8gMCA6IHRoaXMuZGVmZXJyZWRCb3VuZENoZWNrcy5zaXplKCk7IGkgPCBsOyBpKyspCisJCQkoKFR5cGVSZWZlcmVuY2UpIHRoaXMuZGVmZXJyZWRCb3VuZENoZWNrcy5nZXQoaSkpLmNoZWNrQm91bmRzKHRoaXMpOworCQl0aGlzLmRlZmVycmVkQm91bmRDaGVja3MgPSBudWxsOwogCi0JCVR5cGVSZWZlcmVuY2VbXSBzdXBlcmludGVyZmFjZXMgPSByZWZlcmVuY2VDb250ZXh0LnN1cGVySW50ZXJmYWNlczsKLQkJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlzdXBlcmludGVyZmFjZXNbaV0uY2hlY2tCb3VuZHModGhpcyk7Ci0KLQkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gcmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVyczsKLQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMCwgcGFyYW1MZW5ndGggPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKQotCQkJCXR5cGVQYXJhbWV0ZXJzW2ldLmNoZWNrQm91bmRzKHRoaXMpOwotCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcyA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZW1iZXJUeXBlczsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcubWVtYmVyVHlwZXM7CiAJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzICE9IEJpbmRpbmcuTk9fTUVNQkVSX1RZUEVTKQogCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBzaXplOyBpKyspCiAJCQkJICgoU291cmNlVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKS5zY29wZS5jaGVja1BhcmFtZXRlcml6ZWRUeXBlQm91bmRzKCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGNvbm5lY3RNZW1iZXJUeXBlcygpIHsKLQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwogCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSBzb3VyY2VUeXBlLm1lbWJlclR5cGVzOwogCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCAmJiBtZW1iZXJUeXBlcyAhPSBCaW5kaW5nLk5PX01FTUJFUl9UWVBFUykgewogCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBzaXplOyBpKyspCkBAIC04MDksNDEgKzg2NSw0NiBAQAogCQlPdXIgY3VycmVudCBiZWxpZWYgYmFzZWQgb24gYXZhaWxhYmxlIEpDSyB0ZXN0cyBpczoKIAkJCWluaGVyaXRlZCBtZW1iZXIgdHlwZXMgYXJlIHZpc2libGUgYXMgYSBwb3RlbnRpYWwgc3VwZXJjbGFzcy4KIAkJCWluaGVyaXRlZCBpbnRlcmZhY2VzIGFyZSBub3QgdmlzaWJsZSB3aGVuIGRlZmluaW5nIGEgc3VwZXJpbnRlcmZhY2UuCi0JCisKIAkJRXJyb3IgcmVjb3Zlcnkgc3Rvcnk6CiAJCQllbnN1cmUgdGhlIHN1cGVyY2xhc3MgaXMgc2V0IHRvIGphdmEubGFuZy5PYmplY3QgaWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkCiAJCQlyZXNvbHZpbmcgdGhlIHN1cGVyY2xhc3MuCi0JCisKIAkJQW5zd2VyIGZhbHNlIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZCBhZ2FpbnN0IHRoZSBzb3VyY2VUeXBlLgogCSovCiAJcHJpdmF0ZSBib29sZWFuIGNvbm5lY3RTdXBlcmNsYXNzKCkgewotCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwotCQlpZiAoc291cmNlVHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0KSB7IC8vIGhhbmRsZSB0aGUgY2FzZSBvZiByZWRlZmluaW5nIGphdmEubGFuZy5PYmplY3QgdXAgZnJvbnQKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlpZiAoc291cmNlVHlwZS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsgLy8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlZGVmaW5pbmcgamF2YS5sYW5nLk9iamVjdCB1cCBmcm9udAogCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gbnVsbDsKIAkJCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CiAJCQlpZiAoIXNvdXJjZVR5cGUuaXNDbGFzcygpKQogCQkJCXByb2JsZW1SZXBvcnRlcigpLm9iamVjdE11c3RCZUNsYXNzKHNvdXJjZVR5cGUpOwotCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcyAhPSBudWxsIHx8IChyZWZlcmVuY2VDb250ZXh0LnN1cGVySW50ZXJmYWNlcyAhPSBudWxsICYmIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCA+IDApKQorCQkJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzICE9IG51bGwgfHwgKHRoaXMucmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiB0aGlzLnJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCA+IDApKQogCQkJCXByb2JsZW1SZXBvcnRlcigpLm9iamVjdENhbm5vdEhhdmVTdXBlclR5cGVzKHNvdXJjZVR5cGUpOwogCQkJcmV0dXJuIHRydWU7IC8vIGRvIG5vdCBwcm9wYWdhdGUgT2JqZWN0J3MgaGllcmFyY2h5IHByb2JsZW1zIGRvd24gdG8gZXZlcnkgc3VidHlwZQogCQl9Ci0JCWlmIChyZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MgPT0gbnVsbCkgeworCQlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MgPT0gbnVsbCkgewogCQkJaWYgKHNvdXJjZVR5cGUuaXNFbnVtKCkgJiYgY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgLy8gZG8gbm90IGNvbm5lY3QgaWYgc291cmNlIDwgMS41IGFzIGVudW0gYWxyZWFkeSBnb3QgZmxhZ2dlZCBhcyBzeW50YXggZXJyb3IKIAkJCQlyZXR1cm4gY29ubmVjdEVudW1TdXBlcmNsYXNzKCk7CiAJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOwogCQkJcmV0dXJuICFkZXRlY3RIaWVyYXJjaHlDeWNsZShzb3VyY2VUeXBlLCBzb3VyY2VUeXBlLnN1cGVyY2xhc3MsIG51bGwpOwogCQl9Ci0JCVR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzc1JlZiA9IHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzczsKKwkJVHlwZVJlZmVyZW5jZSBzdXBlcmNsYXNzUmVmID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3M7CiAJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IGZpbmRTdXBlcnR5cGUoc3VwZXJjbGFzc1JlZik7CiAJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsgLy8gaXMgbnVsbCBpZiBhIGN5Y2xlIHdhcyBkZXRlY3RlZCBjeWNsZSBvciBhIHByb2JsZW0KLQkJCWlmICghc3VwZXJjbGFzcy5pc0NsYXNzKCkpIHsKKwkJCWlmICghc3VwZXJjbGFzcy5pc0NsYXNzKCkgJiYgKHN1cGVyY2xhc3MudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApIHsKIAkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5zdXBlcmNsYXNzTXVzdEJlQUNsYXNzKHNvdXJjZVR5cGUsIHN1cGVyY2xhc3NSZWYsIHN1cGVyY2xhc3MpOwogCQkJfSBlbHNlIGlmIChzdXBlcmNsYXNzLmlzRmluYWwoKSkgewogCQkJCXByb2JsZW1SZXBvcnRlcigpLmNsYXNzRXh0ZW5kRmluYWxDbGFzcyhzb3VyY2VUeXBlLCBzdXBlcmNsYXNzUmVmLCBzdXBlcmNsYXNzKTsKIAkJCX0gZWxzZSBpZiAoKHN1cGVyY2xhc3MudGFnQml0cyAmIFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpICE9IDApIHsKIAkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5zdXBlclR5cGVDYW5ub3RVc2VXaWxkY2FyZChzb3VyY2VUeXBlLCBzdXBlcmNsYXNzUmVmLCBzdXBlcmNsYXNzKTsKLQkJCX0gZWxzZSBpZiAoc3VwZXJjbGFzcy5lcmFzdXJlKCkuaWQgPT0gVF9KYXZhTGFuZ0VudW0pIHsKKwkJCX0gZWxzZSBpZiAoc3VwZXJjbGFzcy5lcmFzdXJlKCkuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nRW51bSkgewogCQkJCXByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEV4dGVuZEVudW0oc291cmNlVHlwZSwgc3VwZXJjbGFzc1JlZiwgc3VwZXJjbGFzcyk7CisJCQl9IGVsc2UgaWYgKChzdXBlcmNsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zKSAhPSAwCisJCQkJCXx8ICFzdXBlcmNsYXNzUmVmLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gc3VwZXJjbGFzczsKKwkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsgLy8gcHJvcGFnYXRlIGlmIG1pc3Npbmcgc3VwZXJ0eXBlCisJCQkJcmV0dXJuIHN1cGVyY2xhc3NSZWYucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCk7IC8vIHJlcG9ydGVkIHNvbWUgZXJyb3IgYWdhaW5zdCB0aGUgc291cmNlIHR5cGUgPwogCQkJfSBlbHNlIHsKIAkJCQkvLyBvbmx5IHdhbnQgdG8gcmVhY2ggaGVyZSB3aGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQKIAkJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOwpAQCAtODYxLDI1ICs5MjIsMzYgQEAKIAkgKiAgZW51bSBYIChpbXBsaWNpdGx5KSBleHRlbmRzIEVudW08WD4KIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gY29ubmVjdEVudW1TdXBlcmNsYXNzKCkgewotCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CiAJCVJlZmVyZW5jZUJpbmRpbmcgcm9vdEVudW1UeXBlID0gZ2V0SmF2YUxhbmdFbnVtKCk7CisJCWlmICgocm9vdEVudW1UeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsgLy8gbWFyayBtaXNzaW5nIHN1cGVydHB5ZQorCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gcm9vdEVudW1UeXBlOworCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJCWJvb2xlYW4gZm91bmRDeWNsZSA9IGRldGVjdEhpZXJhcmNoeUN5Y2xlKHNvdXJjZVR5cGUsIHJvb3RFbnVtVHlwZSwgbnVsbCk7CiAJCS8vIGFyaXR5IGNoZWNrIGZvciB3ZWxsLWtub3duIEVudW08RT4KIAkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHJlZlR5cGVWYXJpYWJsZXMgPSByb290RW51bVR5cGUudHlwZVZhcmlhYmxlcygpOwogCQlpZiAocmVmVHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7IC8vIGNoZWNrIGdlbmVyaWMKLQkJCXByb2JsZW1SZXBvcnRlcigpLm5vbkdlbmVyaWNUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkKG51bGwsIHJvb3RFbnVtVHlwZSwgbmV3IFR5cGVCaW5kaW5nW117IHNvdXJjZVR5cGUgfSk7CisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub25HZW5lcmljVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZCgwLCBudWxsLCByb290RW51bVR5cGUsIG5ldyBUeXBlQmluZGluZ1tdeyBzb3VyY2VUeXBlIH0pOwogCQkJcmV0dXJuIGZhbHNlOyAvLyBjYW5ub3QgcmVhY2ggaGVyZSBhcyBBYm9ydENvbXBpbGF0aW9uIGlzIHRocm93bgogCQl9IGVsc2UgaWYgKDEgIT0gcmVmVHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsgLy8gY2hlY2sgYXJpdHkKIAkJCXByb2JsZW1SZXBvcnRlcigpLmluY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZFR5cGUobnVsbCwgcm9vdEVudW1UeXBlLCBuZXcgVHlwZUJpbmRpbmdbXXsgc291cmNlVHlwZSB9KTsKIAkJCXJldHVybiBmYWxzZTsgLy8gY2Fubm90IHJlYWNoIGhlcmUgYXMgQWJvcnRDb21waWxhdGlvbiBpcyB0aHJvd24KLQkJfQkJCQorCQl9CiAJCS8vIGNoZWNrIGFyZ3VtZW50IHR5cGUgY29tcGF0aWJpbGl0eQotCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgIHN1cGVyVHlwZSA9IGVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUocm9vdEVudW1UeXBlLCBuZXcgVHlwZUJpbmRpbmdbXXsgZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHNvdXJjZVR5cGUpIH0gLCBudWxsKTsKKwkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nICBzdXBlclR5cGUgPSBlbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKAorCQkJcm9vdEVudW1UeXBlLAorCQkJbmV3IFR5cGVCaW5kaW5nW117CisJCQkJZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHNvdXJjZVR5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pLAorCQkJfSAsCisJCQludWxsKTsKKwkJc291cmNlVHlwZS50YWdCaXRzIHw9IChzdXBlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXMpOyAvLyBwcm9wYWdhdGUgaWYgbWlzc2luZyBzdXBlcnRweWUKIAkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gc3VwZXJUeXBlOwogCQkvLyBib3VuZCBjaGVjayAoaW4gY2FzZSBvZiBib2d1cyBkZWZpbml0aW9uIG9mIEVudW0gdHlwZSkKIAkJaWYgKHJlZlR5cGVWYXJpYWJsZXNbMF0uYm91bmRDaGVjayhzdXBlclR5cGUsIHNvdXJjZVR5cGUpICE9IFR5cGVDb25zdGFudHMuT0spIHsKIAkJCXByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHJvb3RFbnVtVHlwZSwgcmVmVHlwZVZhcmlhYmxlc1swXSwgc291cmNlVHlwZSwgbnVsbCk7Ci0JCX0JCQorCQl9CiAJCXJldHVybiAhZm91bmRDeWNsZTsKIAl9CiAKQEAgLTg4NywxNiArOTU5LDE2IEBACiAJCU91ciBjdXJyZW50IGJlbGllZiBiYXNlZCBvbiBhdmFpbGFibGUgSkNLIDEuMyB0ZXN0cyBpczoKIAkJCWluaGVyaXRlZCBtZW1iZXIgdHlwZXMgYXJlIHZpc2libGUgYXMgYSBwb3RlbnRpYWwgc3VwZXJjbGFzcy4KIAkJCWluaGVyaXRlZCBpbnRlcmZhY2VzIGFyZSB2aXNpYmxlIHdoZW4gZGVmaW5pbmcgYSBzdXBlcmludGVyZmFjZS4KLQkKKwogCQlFcnJvciByZWNvdmVyeSBzdG9yeToKIAkJCWVuc3VyZSB0aGUgc3VwZXJpbnRlcmZhY2VzIGNvbnRhaW4gb25seSB2YWxpZCB2aXNpYmxlIGludGVyZmFjZXMuCi0JCisKIAkJQW5zd2VyIGZhbHNlIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZCBhZ2FpbnN0IHRoZSBzb3VyY2VUeXBlLgogCSovCiAJcHJpdmF0ZSBib29sZWFuIGNvbm5lY3RTdXBlckludGVyZmFjZXMoKSB7Ci0JCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKIAkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUzsKLQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzID09IG51bGwpIHsKKwkJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMgPT0gbnVsbCkgewogCQkJaWYgKHNvdXJjZVR5cGUuaXNBbm5vdGF0aW9uVHlwZSgpICYmIGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsgLy8gZG8gbm90IGNvbm5lY3QgaWYgc291cmNlIDwgMS41IGFzIGFubm90YXRpb24gYWxyZWFkeSBnb3QgZmxhZ2dlZCBhcyBzeW50YXggZXJyb3IpIHsKIAkJCQlSZWZlcmVuY2VCaW5kaW5nIGFubm90YXRpb25UeXBlID0gZ2V0SmF2YUxhbmdBbm5vdGF0aW9uQW5ub3RhdGlvbigpOwogCQkJCWJvb2xlYW4gZm91bmRDeWNsZSA9IGRldGVjdEhpZXJhcmNoeUN5Y2xlKHNvdXJjZVR5cGUsIGFubm90YXRpb25UeXBlLCBudWxsKTsKQEAgLTkwNSwzMSArOTc3LDMzIEBACiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQlpZiAoc291cmNlVHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0KSAvLyBhbHJlYWR5IGhhbmRsZWQgdGhlIGNhc2Ugb2YgcmVkZWZpbmluZyBqYXZhLmxhbmcuT2JqZWN0CisJCWlmIChzb3VyY2VUeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkgLy8gYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIG9mIHJlZGVmaW5pbmcgamF2YS5sYW5nLk9iamVjdAogCQkJcmV0dXJuIHRydWU7CiAKIAkJYm9vbGVhbiBub1Byb2JsZW1zID0gdHJ1ZTsKLQkJaW50IGxlbmd0aCA9IHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMubGVuZ3RoOwogCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOwogCQlpbnQgY291bnQgPSAwOwogCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkgICAgVHlwZVJlZmVyZW5jZSBzdXBlckludGVyZmFjZVJlZiA9IHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzW2ldOworCQkgICAgVHlwZVJlZmVyZW5jZSBzdXBlckludGVyZmFjZVJlZiA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV07CiAJCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVySW50ZXJmYWNlID0gZmluZFN1cGVydHlwZShzdXBlckludGVyZmFjZVJlZik7CiAJCQlpZiAoc3VwZXJJbnRlcmZhY2UgPT0gbnVsbCkgeyAvLyBkZXRlY3RlZCBjeWNsZQogCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOwogCQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsKIAkJCQljb250aW51ZSBuZXh0SW50ZXJmYWNlOwogCQkJfQotCQkJc3VwZXJJbnRlcmZhY2VSZWYucmVzb2x2ZWRUeXBlID0gc3VwZXJJbnRlcmZhY2U7IC8vIGhvbGQgb250byB0aGUgcHJvYmxlbSB0eXBlCi0JCQkvLyBjaGVjayBmb3Igc2ltcGxlIGludGVyZmFjZSBjb2xsaXNpb25zIAotCQkJLy8gQ2hlY2sgZm9yIGEgZHVwbGljYXRlIGludGVyZmFjZSBvbmNlIHRoZSBuYW1lIGlzIHJlc29sdmVkLCBvdGhlcndpc2Ugd2UgbWF5IGJlIGNvbmZ1c2VkIChpZSA6IGEuYi5JIGFuZCBjLmQuSSkKKworCQkJLy8gY2hlY2sgZm9yIHNpbXBsZSBpbnRlcmZhY2UgY29sbGlzaW9ucworCQkJLy8gQ2hlY2sgZm9yIGEgZHVwbGljYXRlIGludGVyZmFjZSBvbmNlIHRoZSBuYW1lIGlzIHJlc29sdmVkLCBvdGhlcndpc2Ugd2UgbWF5IGJlIGNvbmZ1c2VkIChpLmUuIGEuYi5JIGFuZCBjLmQuSSkKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJaWYgKGludGVyZmFjZUJpbmRpbmdzW2pdID09IHN1cGVySW50ZXJmYWNlKSB7CiAJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZVN1cGVyaW50ZXJmYWNlKHNvdXJjZVR5cGUsIHN1cGVySW50ZXJmYWNlUmVmLCBzdXBlckludGVyZmFjZSk7CisJCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQlub1Byb2JsZW1zID0gZmFsc2U7CiAJCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CiAJCQkJfQogCQkJfQotCQkJaWYgKCFzdXBlckludGVyZmFjZS5pc0ludGVyZmFjZSgpKSB7CisJCQlpZiAoIXN1cGVySW50ZXJmYWNlLmlzSW50ZXJmYWNlKCkgJiYgKHN1cGVySW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CiAJCQkJcHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJpbnRlcmZhY2VNdXN0QmVBbkludGVyZmFjZShzb3VyY2VUeXBlLCBzdXBlckludGVyZmFjZVJlZiwgc3VwZXJJbnRlcmZhY2UpOwogCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOwogCQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsKQEAgLTk0Myw2ICsxMDE3LDExIEBACiAJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOwogCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CiAJCQl9CisJCQlpZiAoKHN1cGVySW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zKSAhPSAwCisJCQkJCXx8ICFzdXBlckludGVyZmFjZVJlZi5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOyAvLyBwcm9wYWdhdGUgaWYgbWlzc2luZyBzdXBlcnR5cGUKKwkJCQlub1Byb2JsZW1zICY9IHN1cGVySW50ZXJmYWNlUmVmLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpOworCQkJfQogCQkJLy8gb25seSB3YW50IHRvIHJlYWNoIGhlcmUgd2hlbiBubyBlcnJvcnMgYXJlIHJlcG9ydGVkCiAJCQlpbnRlcmZhY2VCaW5kaW5nc1tjb3VudCsrXSA9IHN1cGVySW50ZXJmYWNlOwogCQl9CkBAIC05NTQsMTUgKzEwMzMsMTcgQEAKIAkJfQogCQlyZXR1cm4gbm9Qcm9ibGVtczsKIAl9Ci0JCisKIAl2b2lkIGNvbm5lY3RUeXBlSGllcmFyY2h5KCkgewotCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CiAJCWlmICgoc291cmNlVHlwZS50YWdCaXRzICYgVGFnQml0cy5CZWdpbkhpZXJhcmNoeUNoZWNrKSA9PSAwKSB7CiAJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5CZWdpbkhpZXJhcmNoeUNoZWNrOworCQkJZW52aXJvbm1lbnQoKS50eXBlc0JlaW5nQ29ubmVjdGVkLmFkZChzb3VyY2VUeXBlKTsKIAkJCWJvb2xlYW4gbm9Qcm9ibGVtcyA9IGNvbm5lY3RTdXBlcmNsYXNzKCk7CiAJCQlub1Byb2JsZW1zICY9IGNvbm5lY3RTdXBlckludGVyZmFjZXMoKTsKKwkJCWVudmlyb25tZW50KCkudHlwZXNCZWluZ0Nvbm5lY3RlZC5yZW1vdmUoc291cmNlVHlwZSk7CiAJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5FbmRIaWVyYXJjaHlDaGVjazsKLQkJCW5vUHJvYmxlbXMgJj0gY29ubmVjdFR5cGVWYXJpYWJsZXMocmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVycywgZmFsc2UpOworCQkJbm9Qcm9ibGVtcyAmPSBjb25uZWN0VHlwZVZhcmlhYmxlcyh0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZVBhcmFtZXRlcnMsIGZhbHNlKTsKIAkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBUYWdCaXRzLlR5cGVWYXJpYWJsZXNBcmVDb25uZWN0ZWQ7CiAJCQlpZiAobm9Qcm9ibGVtcyAmJiBzb3VyY2VUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCiAJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5SGFzUHJvYmxlbXMoc291cmNlVHlwZSk7CkBAIC05NzAsMzYgKzEwNTEsMzggQEAKIAkJY29ubmVjdE1lbWJlclR5cGVzKCk7CiAJCUxvb2t1cEVudmlyb25tZW50IGVudiA9IGVudmlyb25tZW50KCk7CiAJCXRyeSB7Ci0JCQllbnYubWlzc2luZ0NsYXNzRmlsZUxvY2F0aW9uID0gcmVmZXJlbmNlQ29udGV4dDsKKwkJCWVudi5taXNzaW5nQ2xhc3NGaWxlTG9jYXRpb24gPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQ7CiAJCQljaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKHNvdXJjZVR5cGUpOwogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKLQkJCWUudXBkYXRlQ29udGV4dChyZWZlcmVuY2VDb250ZXh0LCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CisJCQllLnVwZGF0ZUNvbnRleHQodGhpcy5yZWZlcmVuY2VDb250ZXh0LCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CiAJCQl0aHJvdyBlOwogCQl9IGZpbmFsbHkgewogCQkJZW52Lm1pc3NpbmdDbGFzc0ZpbGVMb2NhdGlvbiA9IG51bGw7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgY29ubmVjdFR5cGVIaWVyYXJjaHlXaXRob3V0TWVtYmVycygpIHsKIAkJLy8gbXVzdCBlbnN1cmUgdGhlIGltcG9ydHMgYXJlIHJlc29sdmVkCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXRTY29wZSkgewotCQkJaWYgKCgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHBhcmVudCkuaW1wb3J0cyA9PSBudWxsKQotCQkJCSAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBwYXJlbnQpLmNoZWNrQW5kU2V0SW1wb3J0cygpOwotCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsKKwkJaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0U2NvcGUpIHsKKwkJCWlmICgoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB0aGlzLnBhcmVudCkuaW1wb3J0cyA9PSBudWxsKQorCQkJCSAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB0aGlzLnBhcmVudCkuY2hlY2tBbmRTZXRJbXBvcnRzKCk7CisJCX0gZWxzZSBpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBDbGFzc1Njb3BlKSB7CiAJCQkvLyBlbnN1cmUgdGhhdCB0aGUgZW5jbG9zaW5nIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkCi0JCQkgKChDbGFzc1Njb3BlKSBwYXJlbnQpLmNvbm5lY3RUeXBlSGllcmFyY2h5V2l0aG91dE1lbWJlcnMoKTsKKwkJCSAoKENsYXNzU2NvcGUpIHRoaXMucGFyZW50KS5jb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCk7CiAJCX0KIAogCQkvLyBkb3VibGUgY2hlY2sgdGhhdCB0aGUgaGllcmFyY2h5IHNlYXJjaCBoYXMgbm90IGFscmVhZHkgYmVndW4uLi4KLQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwogCQlpZiAoKHNvdXJjZVR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQmVnaW5IaWVyYXJjaHlDaGVjaykgIT0gMCkKIAkJCXJldHVybjsKIAogCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5CZWdpbkhpZXJhcmNoeUNoZWNrOworCQllbnZpcm9ubWVudCgpLnR5cGVzQmVpbmdDb25uZWN0ZWQuYWRkKHNvdXJjZVR5cGUpOwogCQlib29sZWFuIG5vUHJvYmxlbXMgPSBjb25uZWN0U3VwZXJjbGFzcygpOwogCQlub1Byb2JsZW1zICY9IGNvbm5lY3RTdXBlckludGVyZmFjZXMoKTsKKwkJZW52aXJvbm1lbnQoKS50eXBlc0JlaW5nQ29ubmVjdGVkLnJlbW92ZShzb3VyY2VUeXBlKTsKIAkJc291cmNlVHlwZS50YWdCaXRzIHw9IFRhZ0JpdHMuRW5kSGllcmFyY2h5Q2hlY2s7Ci0JCW5vUHJvYmxlbXMgJj0gY29ubmVjdFR5cGVWYXJpYWJsZXMocmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVycywgZmFsc2UpOworCQlub1Byb2JsZW1zICY9IGNvbm5lY3RUeXBlVmFyaWFibGVzKHRoaXMucmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVycywgZmFsc2UpOwogCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5UeXBlVmFyaWFibGVzQXJlQ29ubmVjdGVkOwogCQlpZiAobm9Qcm9ibGVtcyAmJiBzb3VyY2VUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCiAJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlIYXNQcm9ibGVtcyhzb3VyY2VUeXBlKTsKQEAgLTEwMTYsMTIgKzEwOTksMTQgQEAKIAkJCWlmIChzdXBlclR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQogCQkJCXN1cGVyVHlwZSA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBzdXBlclR5cGUpLmdlbmVyaWNUeXBlKCk7CiAJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFN1cGVyVHlwZVJlZmVyZW5jZShzdXBlclR5cGUpOyAvLyB0byByZWNvcmQgc3VwZXJ0eXBlcwotCQkJcmV0dXJuIGRldGVjdEhpZXJhcmNoeUN5Y2xlKHJlZmVyZW5jZUNvbnRleHQuYmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZSwgcmVmZXJlbmNlKTsKKwkJCXJldHVybiBkZXRlY3RIaWVyYXJjaHlDeWNsZSh0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZSwgcmVmZXJlbmNlKTsKIAkJfQotCisJCS8vIFJlaW5zdGF0ZSB0aGUgY29kZSBkZWxldGVkIGJ5IHRoZSBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDUyMzUKKwkJLy8gRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0MDU3LiAKIAkJaWYgKChzdXBlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQmVnaW5IaWVyYXJjaHlDaGVjaykgPT0gMCAmJiBzdXBlclR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykKIAkJCS8vIGVuc3VyZSBpZiB0aGlzIGlzIGEgc291cmNlIHN1cGVyY2xhc3MgdGhhdCBpdCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQKIAkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHN1cGVyVHlwZSkuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHlXaXRob3V0TWVtYmVycygpOworCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEwNDAsNyArMTEyNSw3IEBACiAJCWlmIChzdXBlclR5cGUuaXNNZW1iZXJUeXBlKCkpIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudCA9IHN1cGVyVHlwZS5lbmNsb3NpbmdUeXBlKCk7CiAJCQlkbyB7Ci0JCQkJaWYgKGN1cnJlbnQuaXNIaWVyYXJjaHlCZWluZ0Nvbm5lY3RlZCgpICYmIGN1cnJlbnQgPT0gc291cmNlVHlwZSkgeworCQkJCWlmIChjdXJyZW50LmlzSGllcmFyY2h5QmVpbmdBY3RpdmVseUNvbm5lY3RlZCgpICYmIGN1cnJlbnQgPT0gc291cmNlVHlwZSkgewogCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eShzb3VyY2VUeXBlLCBjdXJyZW50LCByZWZlcmVuY2UpOwogCQkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKIAkJCQkJY3VycmVudC50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7CkBAIC0xMDkzLDE2ICsxMTc4LDMwIEBACiAJCQlyZXR1cm4gaGFzQ3ljbGU7CiAJCX0KIAotCQlpZiAoc3VwZXJUeXBlLmlzSGllcmFyY2h5QmVpbmdDb25uZWN0ZWQoKSkgeworCQlpZiAoc3VwZXJUeXBlLmlzSGllcmFyY2h5QmVpbmdBY3RpdmVseUNvbm5lY3RlZCgpKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2UgcmVmID0gKChTb3VyY2VUeXBlQmluZGluZykgc3VwZXJUeXBlKS5zY29wZS5zdXBlclR5cGVSZWZlcmVuY2U7CiAJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMDcxCiAJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNzM0Ci0JCQlpZiAocmVmICE9IG51bGwgJiYgKHJlZi5yZXNvbHZlZFR5cGUgPT0gbnVsbCB8fCAoKFJlZmVyZW5jZUJpbmRpbmcpIHJlZi5yZXNvbHZlZFR5cGUpLmlzSGllcmFyY2h5QmVpbmdDb25uZWN0ZWQoKSkpIHsKKwkJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYucmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgKChSZWZlcmVuY2VCaW5kaW5nKSByZWYucmVzb2x2ZWRUeXBlKS5pc0hpZXJhcmNoeUJlaW5nQWN0aXZlbHlDb25uZWN0ZWQoKSkgewogCQkJCXByb2JsZW1SZXBvcnRlcigpLmhpZXJhcmNoeUNpcmN1bGFyaXR5KHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgcmVmZXJlbmNlKTsKIAkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKIAkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQorCQkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk4ODUgRG9uJ3QgY3J5IGZvdWwgcHJlbWF0dXJlbHkuCisJCQkJLy8gQ2hlY2sgdGhlIGVkZ2VzIHRyYXZlcnNlZCB0byBzZWUgaWYgdGhlcmUgcmVhbGx5IGlzIGEgY3ljbGUuCisJCQkJY2hhciBbXSByZWZlcnJlZE5hbWUgPSByZWYuZ2V0TGFzdFRva2VuKCk7IAorCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVudmlyb25tZW50KCkudHlwZXNCZWluZ0Nvbm5lY3RlZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgdHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgaXRlci5uZXh0KCk7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyZWZlcnJlZE5hbWUsIHR5cGUuc291cmNlTmFtZSgpKSkgeworCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOworCQkJCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCX0KIAkJaWYgKChzdXBlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQmVnaW5IaWVyYXJjaHlDaGVjaykgPT0gMCkKIAkJCS8vIGVuc3VyZSBpZiB0aGlzIGlzIGEgc291cmNlIHN1cGVyY2xhc3MgdGhhdCBpdCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQKQEAgLTExNDMsNyArMTI0Miw3IEBACiAJCU1ldGhvZFNjb3BlIG91dGVyTWV0aG9kU2NvcGU7CiAJCWlmICgob3V0ZXJNZXRob2RTY29wZSA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkpID09IG51bGwpIHsKIAkJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5wcm9ibGVtUmVwb3J0ZXI7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7CisJCQlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dDsKIAkJCXJldHVybiBwcm9ibGVtUmVwb3J0ZXI7CiAJCX0KIAkJcmV0dXJuIG91dGVyTWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7CkBAIC0xMTUzLDEzICsxMjUyLDEzIEBACiAJKiBJdCBpcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLgogCSovCiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlQ29udGV4dDsKKwkJcmV0dXJuIHRoaXMucmVmZXJlbmNlQ29udGV4dDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAocmVmZXJlbmNlQ29udGV4dCAhPSBudWxsKQorCQlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0ICE9IG51bGwpCiAJCQlyZXR1cm4gIi0tLSBDbGFzcyBTY29wZSAtLS1cblxuIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnRvU3RyaW5nKCk7CisJCQkJCQkJKyB0aGlzLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZy50b1N0cmluZygpOwogCQlyZXR1cm4gIi0tLSBDbGFzcyBTY29wZSAtLS1cblxuIEJpbmRpbmcgbm90IGluaXRpYWxpemVkIiA7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEKaW5kZXggMzQ0ODhmOS4uMzJjY2ZkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxhdGlvblVuaXRTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsYXRpb25Vbml0U2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwyNCArMTksMjUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0U2NvcGUgZXh0ZW5kcyBTY29wZSB7Ci0JCisKIAlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CiAJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlZmVyZW5jZUNvbnRleHQ7CiAJcHVibGljIGNoYXJbXVtdIGN1cnJlbnRQYWNrYWdlTmFtZTsKIAlwdWJsaWMgUGFja2FnZUJpbmRpbmcgZlBhY2thZ2U7CiAJcHVibGljIEltcG9ydEJpbmRpbmdbXSBpbXBvcnRzOwogCXB1YmxpYyBIYXNodGFibGVPZk9iamVjdCB0eXBlT3JQYWNrYWdlQ2FjaGU7IC8vIHVzZWQgaW4gU2NvcGUuZ2V0VHlwZU9yUGFja2FnZSgpCi0JCisKIAlwdWJsaWMgU291cmNlVHlwZUJpbmRpbmdbXSB0b3BMZXZlbFR5cGVzOwotCQorCiAJcHJpdmF0ZSBDb21wb3VuZE5hbWVWZWN0b3IgcXVhbGlmaWVkUmVmZXJlbmNlczsKIAlwcml2YXRlIFNpbXBsZU5hbWVWZWN0b3Igc2ltcGxlTmFtZVJlZmVyZW5jZXM7CisJcHJpdmF0ZSBTaW1wbGVOYW1lVmVjdG9yIHJvb3RSZWZlcmVuY2VzOwogCXByaXZhdGUgT2JqZWN0VmVjdG9yIHJlZmVyZW5jZWRUeXBlczsKIAlwcml2YXRlIE9iamVjdFZlY3RvciByZWZlcmVuY2VkU3VwZXJUeXBlczsKLQkKKwogCUhhc2h0YWJsZU9mVHlwZSBjb25zdGFudFBvb2xOYW1lVXNhZ2U7CiAJcHJpdmF0ZSBpbnQgY2FwdHVyZUlEID0gMTsKLQorCQogcHVibGljIENvbXBpbGF0aW9uVW5pdFNjb3BlKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAJc3VwZXIoQ09NUElMQVRJT05fVU5JVF9TQ09QRSwgbnVsbCk7CiAJdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwpAQCAtNDcsMTE0ICs0OCwxMjMgQEAKIAlpZiAoY29tcGlsZXJPcHRpb25zKCkucHJvZHVjZVJlZmVyZW5jZUluZm8pIHsKIAkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VzID0gbmV3IENvbXBvdW5kTmFtZVZlY3RvcigpOwogCQl0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzID0gbmV3IFNpbXBsZU5hbWVWZWN0b3IoKTsKKwkJdGhpcy5yb290UmVmZXJlbmNlcyA9IG5ldyBTaW1wbGVOYW1lVmVjdG9yKCk7CiAJCXRoaXMucmVmZXJlbmNlZFR5cGVzID0gbmV3IE9iamVjdFZlY3RvcigpOwogCQl0aGlzLnJlZmVyZW5jZWRTdXBlclR5cGVzID0gbmV3IE9iamVjdFZlY3RvcigpOwogCX0gZWxzZSB7CiAJCXRoaXMucXVhbGlmaWVkUmVmZXJlbmNlcyA9IG51bGw7IC8vIHVzZWQgdG8gdGVzdCBpZiBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHJlY29yZGVkCiAJCXRoaXMuc2ltcGxlTmFtZVJlZmVyZW5jZXMgPSBudWxsOworCQl0aGlzLnJvb3RSZWZlcmVuY2VzID0gbnVsbDsKIAkJdGhpcy5yZWZlcmVuY2VkVHlwZXMgPSBudWxsOwogCQl0aGlzLnJlZmVyZW5jZWRTdXBlclR5cGVzID0gbnVsbDsKIAl9CiB9CiB2b2lkIGJ1aWxkRmllbGRzQW5kTWV0aG9kcygpIHsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJdG9wTGV2ZWxUeXBlc1tpXS5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy50b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQl0aGlzLnRvcExldmVsVHlwZXNbaV0uc2NvcGUuYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7CiB9CiB2b2lkIGJ1aWxkVHlwZUJpbmRpbmdzKEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7Ci0JdG9wTGV2ZWxUeXBlcyA9IG5ldyBTb3VyY2VUeXBlQmluZGluZ1swXTsgLy8gd2FudCBpdCBpbml0aWFsaXplZCBpZiB0aGUgcGFja2FnZSBjYW5ub3QgYmUgcmVzb2x2ZWQKKwl0aGlzLnRvcExldmVsVHlwZXMgPSBuZXcgU291cmNlVHlwZUJpbmRpbmdbMF07IC8vIHdhbnQgaXQgaW5pdGlhbGl6ZWQgaWYgdGhlIHBhY2thZ2UgY2Fubm90IGJlIHJlc29sdmVkCiAJYm9vbGVhbiBmaXJzdElzU3ludGhldGljID0gZmFsc2U7Ci0JaWYgKHJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IHJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2VOYW1lKCk7Ci0JCWlmIChleHBlY3RlZFBhY2thZ2VOYW1lICE9IG51bGwgCi0JCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRQYWNrYWdlTmFtZSwgZXhwZWN0ZWRQYWNrYWdlTmFtZSkpIHsKKwlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7CisJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2VOYW1lKCk7CisJCWlmIChleHBlY3RlZFBhY2thZ2VOYW1lICE9IG51bGwKKwkJCQkmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5jdXJyZW50UGFja2FnZU5hbWUsIGV4cGVjdGVkUGFja2FnZU5hbWUpKSB7CiAKIAkJCS8vIG9ubHkgcmVwb3J0IGlmIHRoZSB1bml0IGlzbid0IHN0cnVjdHVyYWxseSBlbXB0eQotCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCAKLQkJCQkJfHwgcmVmZXJlbmNlQ29udGV4dC50eXBlcyAhPSBudWxsIAotCQkJCQl8fCByZWZlcmVuY2VDb250ZXh0LmltcG9ydHMgIT0gbnVsbCkgewotCQkJCXByb2JsZW1SZXBvcnRlcigpLnBhY2thZ2VJc05vdEV4cGVjdGVkUGFja2FnZShyZWZlcmVuY2VDb250ZXh0KTsKKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQuY3VycmVudFBhY2thZ2UgIT0gbnVsbAorCQkJCQl8fCB0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZXMgIT0gbnVsbAorCQkJCQl8fCB0aGlzLnJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cyAhPSBudWxsKSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkucGFja2FnZUlzTm90RXhwZWN0ZWRQYWNrYWdlKHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CiAJCQl9Ci0JCQljdXJyZW50UGFja2FnZU5hbWUgPSBleHBlY3RlZFBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBleHBlY3RlZFBhY2thZ2VOYW1lOworCQkJdGhpcy5jdXJyZW50UGFja2FnZU5hbWUgPSBleHBlY3RlZFBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBleHBlY3RlZFBhY2thZ2VOYW1lOwogCQl9CiAJfQotCWlmIChjdXJyZW50UGFja2FnZU5hbWUgPT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpIHsKLQkJaWYgKChmUGFja2FnZSA9IGVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlKSA9PSBudWxsKSB7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5tdXN0U3BlY2lmeVBhY2thZ2UocmVmZXJlbmNlQ29udGV4dCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwlpZiAodGhpcy5jdXJyZW50UGFja2FnZU5hbWUgPT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpIHsKKwkJLy8gZW52aXJvbm1lbnQgZGVmYXVsdCBwYWNrYWdlIGlzIG5ldmVyIG51bGwKKwkJdGhpcy5mUGFja2FnZSA9IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2U7CiAJfSBlbHNlIHsKLQkJaWYgKChmUGFja2FnZSA9IGVudmlyb25tZW50LmNyZWF0ZVBhY2thZ2UoY3VycmVudFBhY2thZ2VOYW1lKSkgPT0gbnVsbCkgewotCQkJcHJvYmxlbVJlcG9ydGVyKCkucGFja2FnZUNvbGxpZGVzV2l0aFR5cGUocmVmZXJlbmNlQ29udGV4dCk7CisJCWlmICgodGhpcy5mUGFja2FnZSA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlUGFja2FnZSh0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSkpID09IG51bGwpIHsKKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLnBhY2thZ2VDb2xsaWRlc1dpdGhUeXBlKHRoaXMucmVmZXJlbmNlQ29udGV4dCk7IC8vIG9ubHkgcmVwb3J0IHdoZW4gdGhlIHVuaXQgaGFzIGEgcGFja2FnZSBzdGF0ZW1lbnQKKwkJCX0KKwkJCS8vIGVuc3VyZSBmUGFja2FnZSBpcyBub3QgbnVsbAorCQkJdGhpcy5mUGFja2FnZSA9IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2U7CiAJCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAocmVmZXJlbmNlQ29udGV4dC5pc1BhY2thZ2VJbmZvKCkpIHsKLQkJCS8vIHJlc29sdmUgcGFja2FnZSBhbm5vdGF0aW9ucyBub3cgaWYgdGhpcyBpcyAicGFja2FnZS1pbmZvLmphdmEiLgkJCQkKLQkJCWlmIChyZWZlcmVuY2VDb250ZXh0LnR5cGVzID09IG51bGwgfHwgcmVmZXJlbmNlQ29udGV4dC50eXBlcy5sZW5ndGggPT0gMCkgewotCQkJCXJlZmVyZW5jZUNvbnRleHQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzFdOwotCQkJCVR5cGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG5ldyBUeXBlRGVjbGFyYXRpb24ocmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCQkJcmVmZXJlbmNlQ29udGV4dC50eXBlc1swXSA9IGRlY2xhcmF0aW9uOwotCQkJCWRlY2xhcmF0aW9uLm5hbWUgPSBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FOwotCQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKKwkJfSBlbHNlIGlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQuaXNQYWNrYWdlSW5mbygpKSB7CisJCQkvLyByZXNvbHZlIHBhY2thZ2UgYW5ub3RhdGlvbnMgbm93IGlmIHRoaXMgaXMgInBhY2thZ2UtaW5mby5qYXZhIi4KKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZXMgPT0gbnVsbCB8fCB0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZXMubGVuZ3RoID09IDApIHsKKwkJCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzFdOworCQkJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5jcmVhdGVQYWNrYWdlSW5mb1R5cGUoKTsKIAkJCQlmaXJzdElzU3ludGhldGljID0gdHJ1ZTsKIAkJCX0KKwkJCS8vIGVuc3VyZSB0aGUgcGFja2FnZSBhbm5vdGF0aW9ucyBhcmUgY29waWVkIG92ZXIgYmVmb3JlIHJlc29sdXRpb24KKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCkKKwkJCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQudHlwZXNbMF0uYW5ub3RhdGlvbnMgPSB0aGlzLnJlZmVyZW5jZUNvbnRleHQuY3VycmVudFBhY2thZ2UuYW5ub3RhdGlvbnM7CiAJCX0KLQkJcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKGN1cnJlbnRQYWNrYWdlTmFtZSk7IC8vIGFsd2F5cyBkZXBlbmRlbnQgb24geW91ciBvd24gcGFja2FnZQorCQlyZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UodGhpcy5jdXJyZW50UGFja2FnZU5hbWUpOyAvLyBhbHdheXMgZGVwZW5kZW50IG9uIHlvdXIgb3duIHBhY2thZ2UKIAl9CiAKIAkvLyBTa2lwIHR5cGVEZWNsYXJhdGlvbnMgd2hpY2gga25vdyBvZiBwcmV2aW91c2x5IHJlcG9ydGVkIGVycm9ycwotCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gcmVmZXJlbmNlQ29udGV4dC50eXBlczsKKwlUeXBlRGVjbGFyYXRpb25bXSB0eXBlcyA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC50eXBlczsKIAlpbnQgdHlwZUxlbmd0aCA9ICh0eXBlcyA9PSBudWxsKSA/IDAgOiB0eXBlcy5sZW5ndGg7Ci0JdG9wTGV2ZWxUeXBlcyA9IG5ldyBTb3VyY2VUeXBlQmluZGluZ1t0eXBlTGVuZ3RoXTsKKwl0aGlzLnRvcExldmVsVHlwZXMgPSBuZXcgU291cmNlVHlwZUJpbmRpbmdbdHlwZUxlbmd0aF07CiAJaW50IGNvdW50ID0gMDsKIAluZXh0VHlwZTogZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTGVuZ3RoOyBpKyspIHsKIAkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZXNbaV07Ci0JCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBmUGFja2FnZS5nZXRUeXBlMCh0eXBlRGVjbC5uYW1lKTsKKwkJaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNQcm9jZXNzaW5nQW5ub3RhdGlvbnMgJiYgdGhpcy5lbnZpcm9ubWVudC5pc01pc3NpbmdUeXBlKHR5cGVEZWNsLm5hbWUpKQorCQkJdGhyb3cgbmV3IFNvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24oKTsgLy8gcmVzb2x2ZWQgYSB0eXBlIHJlZiBiZWZvcmUgQVBUIGdlbmVyYXRlZCB0aGUgdHlwZQorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5mUGFja2FnZS5nZXRUeXBlMCh0eXBlRGVjbC5uYW1lKTsKIAkJcmVjb3JkU2ltcGxlUmVmZXJlbmNlKHR5cGVEZWNsLm5hbWUpOyAvLyBuZWVkZWQgdG8gZGV0ZWN0IGNvbGxpc2lvbiBjYXNlcwogCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiB0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpICYmICEodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykpIHsKKwkJCS8vIGlmIGl0cyBhbiB1bnJlc29sdmVkIGJpbmRpbmcgLSBpdHMgZml4ZWQgdXAgd2hlbmV2ZXIgaXRzIG5lZWRlZCwgc2VlIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLnJlc29sdmUoKQorCQkJaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNQcm9jZXNzaW5nQW5ub3RhdGlvbnMpCisJCQkJdGhyb3cgbmV3IFNvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24oKTsgLy8gcmVzb2x2ZWQgYSB0eXBlIHJlZiBiZWZvcmUgQVBUIGdlbmVyYXRlZCB0aGUgdHlwZQogCQkJLy8gaWYgYSB0eXBlIGV4aXN0cywgY2hlY2sgdGhhdCBpdHMgYSB2YWxpZCB0eXBlCiAJCQkvLyBpdCBjYW4gYmUgYSBOb3RGb3VuZCBwcm9ibGVtIHR5cGUgaWYgaXRzIGEgc2Vjb25kYXJ5IHR5cGUgcmVmZXJlbmNlZCBiZWZvcmUgaXRzIHByaW1hcnkgdHlwZSBmb3VuZCBpbiBhZGRpdGlvbmFsIHVuaXRzCiAJCQkvLyBhbmQgaXQgY2FuIGJlIGFuIHVucmVzb2x2ZWQgdHlwZSB3aGljaCBpcyBub3cgYmVpbmcgZGVmaW5lZAotCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlVHlwZXMocmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOworCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlVHlwZXModGhpcy5yZWZlcmVuY2VDb250ZXh0LCB0eXBlRGVjbCk7CiAJCQljb250aW51ZSBuZXh0VHlwZTsKIAkJfQotCQlpZiAoZlBhY2thZ2UgIT0gZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2UgJiYgZlBhY2thZ2UuZ2V0UGFja2FnZSh0eXBlRGVjbC5uYW1lKSAhPSBudWxsKSB7CisJCWlmICh0aGlzLmZQYWNrYWdlICE9IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2UgJiYgdGhpcy5mUGFja2FnZS5nZXRQYWNrYWdlKHR5cGVEZWNsLm5hbWUpICE9IG51bGwpIHsKIAkJCS8vIGlmIGEgcGFja2FnZSBleGlzdHMsIGl0IG11c3QgYmUgYSB2YWxpZCBwYWNrYWdlIC0gY2Fubm90IGJlIGEgTm90Rm91bmQgcHJvYmxlbSBwYWNrYWdlCiAJCQkvLyB0aGlzIGlzIG5vdyBhIHdhcm5pbmcgc2luY2UgYSBwYWNrYWdlIGRvZXMgbm90IHJlYWxseSAnZXhpc3QnIHVudGlsIGl0IGNvbnRhaW5zIGEgdHlwZSwgc2VlIEpMUyB2MiwgNy40LjMKLQkJCXByb2JsZW1SZXBvcnRlcigpLnR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlKHJlZmVyZW5jZUNvbnRleHQsIHR5cGVEZWNsKTsKKwkJCXByb2JsZW1SZXBvcnRlcigpLnR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlKHRoaXMucmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOwogCQl9CiAKIAkJaWYgKCh0eXBlRGVjbC5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSAhPSAwKSB7CiAJCQljaGFyW10gbWFpblR5cGVOYW1lOwotCQkJaWYgKChtYWluVHlwZU5hbWUgPSByZWZlcmVuY2VDb250ZXh0LmdldE1haW5UeXBlTmFtZSgpKSAhPSBudWxsIC8vIG1haW5UeXBlTmFtZSA9PSBudWxsIG1lYW5zIHRoYXQgaW1wbGVtZW50b3Igb2YgSUNvbXBpbGF0aW9uVW5pdCBkZWNpZGVkIHRvIHJldHVybiBudWxsCisJCQlpZiAoKG1haW5UeXBlTmFtZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5nZXRNYWluVHlwZU5hbWUoKSkgIT0gbnVsbCAvLyBtYWluVHlwZU5hbWUgPT0gbnVsbCBtZWFucyB0aGF0IGltcGxlbWVudG9yIG9mIElDb21waWxhdGlvblVuaXQgZGVjaWRlZCB0byByZXR1cm4gbnVsbAogCQkJCQkmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMobWFpblR5cGVOYW1lLCB0eXBlRGVjbC5uYW1lKSkgewotCQkJCXByb2JsZW1SZXBvcnRlcigpLnB1YmxpY0NsYXNzTXVzdE1hdGNoRmlsZU5hbWUocmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOworCQkJCXByb2JsZW1SZXBvcnRlcigpLnB1YmxpY0NsYXNzTXVzdE1hdGNoRmlsZU5hbWUodGhpcy5yZWZlcmVuY2VDb250ZXh0LCB0eXBlRGVjbCk7CiAJCQkJLy8gdG9sZXJhdGUgZmF1bHR5IG1haW4gdHlwZSBuYW1lICg5MTA5MSksIGFsbG93IHRvIHByb2NlZWQgaW50byB0eXBlIGNvbnN0cnVjdGlvbgogCQkJfQogCQl9CiAKIAkJQ2xhc3NTY29wZSBjaGlsZCA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIHR5cGVEZWNsKTsKLQkJU291cmNlVHlwZUJpbmRpbmcgdHlwZSA9IGNoaWxkLmJ1aWxkVHlwZShudWxsLCBmUGFja2FnZSwgYWNjZXNzUmVzdHJpY3Rpb24pOworCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlID0gY2hpbGQuYnVpbGRUeXBlKG51bGwsIHRoaXMuZlBhY2thZ2UsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAkJaWYgKGZpcnN0SXNTeW50aGV0aWMgJiYgaSA9PSAwKQogCQkJdHlwZS5tb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYzsKIAkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXRvcExldmVsVHlwZXNbY291bnQrK10gPSB0eXBlOworCQkJdGhpcy50b3BMZXZlbFR5cGVzW2NvdW50KytdID0gdHlwZTsKIAl9CiAKIAkvLyBzaHJpbmsgdG9wTGV2ZWxUeXBlcy4uLiBvbmx5IGhhcHBlbnMgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkCi0JaWYgKGNvdW50ICE9IHRvcExldmVsVHlwZXMubGVuZ3RoKQotCQlTeXN0ZW0uYXJyYXljb3B5KHRvcExldmVsVHlwZXMsIDAsIHRvcExldmVsVHlwZXMgPSBuZXcgU291cmNlVHlwZUJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJaWYgKGNvdW50ICE9IHRoaXMudG9wTGV2ZWxUeXBlcy5sZW5ndGgpCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50b3BMZXZlbFR5cGVzLCAwLCB0aGlzLnRvcExldmVsVHlwZXMgPSBuZXcgU291cmNlVHlwZUJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CiB9CiB2b2lkIGNoZWNrQW5kU2V0SW1wb3J0cygpIHsKLQlpZiAocmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzID09IG51bGwpIHsKLQkJaW1wb3J0cyA9IGdldERlZmF1bHRJbXBvcnRzKCk7CisJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzID09IG51bGwpIHsKKwkJdGhpcy5pbXBvcnRzID0gZ2V0RGVmYXVsdEltcG9ydHMoKTsKIAkJcmV0dXJuOwogCX0KIAogCS8vIGFsbG9jYXRlIHRoZSBpbXBvcnQgYXJyYXksIGFkZCBqYXZhLmxhbmcuKiBieSBkZWZhdWx0Ci0JaW50IG51bWJlck9mU3RhdGVtZW50cyA9IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cy5sZW5ndGg7CisJaW50IG51bWJlck9mU3RhdGVtZW50cyA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzLmxlbmd0aDsKIAlpbnQgbnVtYmVyT2ZJbXBvcnRzID0gbnVtYmVyT2ZTdGF0ZW1lbnRzICsgMTsKIAlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhdGVtZW50czsgaSsrKSB7Ci0JCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSByZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV07Ci0JCWlmICgoKGltcG9ydFJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5PbkRlbWFuZCkgIT0gMCkgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zKSAmJiAhaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkpIHsKKwkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzW2ldOworCQlpZiAoKChpbXBvcnRSZWZlcmVuY2UuYml0cyAmIEFTVE5vZGUuT25EZW1hbmQpICE9IDApICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zKSAmJiAhaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkpIHsKIAkJCW51bWJlck9mSW1wb3J0cy0tOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2NCw3ICsxNzQsNyBAQAogCWludCBpbmRleCA9IDE7CiAKIAluZXh0SW1wb3J0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlN0YXRlbWVudHM7IGkrKykgewotCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gcmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzW2ldOworCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV07CiAJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IGltcG9ydFJlZmVyZW5jZS50b2tlbnM7CiAKIAkJLy8gc2tpcCBkdXBsaWNhdGVzIG9yIGltcG9ydHMgb2YgdGhlIGN1cnJlbnQgcGFja2FnZQpAQCAtMTc2LDcgKzE4Niw3IEBACiAJCX0KIAogCQlpZiAoKGltcG9ydFJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5PbkRlbWFuZCkgIT0gMCkgewotCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNvbXBvdW5kTmFtZSwgY3VycmVudFBhY2thZ2VOYW1lKSkKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZE5hbWUsIHRoaXMuY3VycmVudFBhY2thZ2VOYW1lKSkKIAkJCQljb250aW51ZSBuZXh0SW1wb3J0OwogCiAJCQlCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBmaW5kSW1wb3J0KGNvbXBvdW5kTmFtZSwgY29tcG91bmROYW1lLmxlbmd0aCk7CkBAIC0xOTIsNyArMjAyLDcgQEAKIAkvLyBzaHJpbmsgcmVzb2x2ZWRJbXBvcnRzLi4uIG9ubHkgaGFwcGVucyBpZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQKIAlpZiAocmVzb2x2ZWRJbXBvcnRzLmxlbmd0aCA+IGluZGV4KQogCQlTeXN0ZW0uYXJyYXljb3B5KHJlc29sdmVkSW1wb3J0cywgMCwgcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbaW5kZXhdLCAwLCBpbmRleCk7Ci0JaW1wb3J0cyA9IHJlc29sdmVkSW1wb3J0czsKKwl0aGlzLmltcG9ydHMgPSByZXNvbHZlZEltcG9ydHM7CiB9CiAKIC8qKgpAQCAtMjAxLDggKzIxMSw4IEBACiB2b2lkIGNoZWNrUGFyYW1ldGVyaXplZFR5cGVzKCkgewogCWlmIChjb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHJldHVybjsKIAotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzU2NvcGUgc2NvcGUgPSB0b3BMZXZlbFR5cGVzW2ldLnNjb3BlOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnRvcExldmVsVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJQ2xhc3NTY29wZSBzY29wZSA9IHRoaXMudG9wTGV2ZWxUeXBlc1tpXS5zY29wZTsKIAkJc2NvcGUuY2hlY2tQYXJhbWV0ZXJpemVkVHlwZUJvdW5kcygpOwogCQlzY29wZS5jaGVja1BhcmFtZXRlcml6ZWRTdXBlclR5cGVDb2xsaXNpb25zKCk7CiAJfQpAQCAtMjEzLDE2ICsyMjMsMTYgQEAKICAqIGJlIGFjdHVhbGx5IG91dHB1dGVkIGlmIHNpdHRpbmcgaW5zaWRlIHVucmVhY2hhYmxlIGNvZGUuCiAgKi8KIHB1YmxpYyBjaGFyW10gY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUpIHsKLQlpZiAobG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoKSAhPSBudWxsKSB7Ci0JCXJldHVybiBsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpOworCWlmIChsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKSB7CisJCXJldHVybiBsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZTsKIAl9CiAJLy8gZGVsZWdhdGVzIHRvIHRoZSBvdXRlcm1vc3QgZW5jbG9zaW5nIGNsYXNzZmlsZSwgc2luY2UgaXQgaXMgdGhlIG9ubHkgb25lIHdpdGggYSBnbG9iYWwgdmlzaW9uIG9mIGl0cyBpbm5lcnR5cGVzLgogCi0JaWYgKGNvbnN0YW50UG9vbE5hbWVVc2FnZSA9PSBudWxsKQotCQljb25zdGFudFBvb2xOYW1lVXNhZ2UgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKCk7CisJaWYgKHRoaXMuY29uc3RhbnRQb29sTmFtZVVzYWdlID09IG51bGwpCisJCXRoaXMuY29uc3RhbnRQb29sTmFtZVVzYWdlID0gbmV3IEhhc2h0YWJsZU9mVHlwZSgpOwogCiAJUmVmZXJlbmNlQmluZGluZyBvdXRlck1vc3RFbmNsb3NpbmdUeXBlID0gbG9jYWxUeXBlLnNjb3BlLm91dGVyTW9zdENsYXNzU2NvcGUoKS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCisKIAkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGxvY2FsIHR5cGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSB1c2VyCiAJaW50IGluZGV4ID0gMDsKIAljaGFyW10gY2FuZGlkYXRlTmFtZTsKQEAgLTI3NCwxMSArMjg0LDExIEBACiAJCQkJCSckJywKIAkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUpOwogCQkJfQotCQl9CQkJCQkJCi0JCWlmIChjb25zdGFudFBvb2xOYW1lVXNhZ2UuZ2V0KGNhbmRpZGF0ZU5hbWUpICE9IG51bGwpIHsKKwkJfQorCQlpZiAodGhpcy5jb25zdGFudFBvb2xOYW1lVXNhZ2UuZ2V0KGNhbmRpZGF0ZU5hbWUpICE9IG51bGwpIHsKIAkJCWluZGV4ICsrOwogCQl9IGVsc2UgewotCQkJY29uc3RhbnRQb29sTmFtZVVzYWdlLnB1dChjYW5kaWRhdGVOYW1lLCBsb2NhbFR5cGUpOworCQkJdGhpcy5jb25zdGFudFBvb2xOYW1lVXNhZ2UucHV0KGNhbmRpZGF0ZU5hbWUsIGxvY2FsVHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI4NiwyNSArMjk2LDI1IEBACiB9CiAKIHZvaWQgY29ubmVjdFR5cGVIaWVyYXJjaHkoKSB7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRvcExldmVsVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCXRvcExldmVsVHlwZXNbaV0uc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy50b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQl0aGlzLnRvcExldmVsVHlwZXNbaV0uc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKIH0KIHZvaWQgZmF1bHRJbkltcG9ydHMoKSB7CiAJaWYgKHRoaXMudHlwZU9yUGFja2FnZUNhY2hlICE9IG51bGwpCiAJCXJldHVybjsgLy8gY2FuIGJlIGNhbGxlZCB3aGVuIGEgZmllbGQgY29uc3RhbnQgaXMgcmVzb2x2ZWQgYmVmb3JlIHN0YXRpYyBpbXBvcnRzCi0JaWYgKHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cyA9PSBudWxsKSB7CisJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzID09IG51bGwpIHsKIAkJdGhpcy50eXBlT3JQYWNrYWdlQ2FjaGUgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoMSk7CiAJCXJldHVybjsKIAl9CiAKIAkvLyBjb2xsZWN0IHRoZSB0b3AgbGV2ZWwgdHlwZSBuYW1lcyBpZiBhIHNpbmdsZSB0eXBlIGltcG9ydCBleGlzdHMKLQlpbnQgbnVtYmVyT2ZTdGF0ZW1lbnRzID0gcmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzLmxlbmd0aDsKKwlpbnQgbnVtYmVyT2ZTdGF0ZW1lbnRzID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmltcG9ydHMubGVuZ3RoOwogCUhhc2h0YWJsZU9mVHlwZSB0eXBlc0J5U2ltcGxlTmFtZXMgPSBudWxsOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGF0ZW1lbnRzOyBpKyspIHsKLQkJaWYgKChyZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV0uYml0cyAmIEFTVE5vZGUuT25EZW1hbmQpID09IDApIHsKLQkJCXR5cGVzQnlTaW1wbGVOYW1lcyA9IG5ldyBIYXNodGFibGVPZlR5cGUodG9wTGV2ZWxUeXBlcy5sZW5ndGggKyBudW1iZXJPZlN0YXRlbWVudHMpOwotCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IHRvcExldmVsVHlwZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspCi0JCQkJdHlwZXNCeVNpbXBsZU5hbWVzLnB1dCh0b3BMZXZlbFR5cGVzW2pdLnNvdXJjZU5hbWUsIHRvcExldmVsVHlwZXNbal0pOworCQlpZiAoKHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzW2ldLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSA9PSAwKSB7CisJCQl0eXBlc0J5U2ltcGxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKHRoaXMudG9wTGV2ZWxUeXBlcy5sZW5ndGggKyBudW1iZXJPZlN0YXRlbWVudHMpOworCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IHRoaXMudG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykKKwkJCQl0eXBlc0J5U2ltcGxlTmFtZXMucHV0KHRoaXMudG9wTGV2ZWxUeXBlc1tqXS5zb3VyY2VOYW1lLCB0aGlzLnRvcExldmVsVHlwZXNbal0pOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zMTIsOCArMzIyLDggQEAKIAkvLyBhbGxvY2F0ZSB0aGUgaW1wb3J0IGFycmF5LCBhZGQgamF2YS5sYW5nLiogYnkgZGVmYXVsdAogCWludCBudW1iZXJPZkltcG9ydHMgPSBudW1iZXJPZlN0YXRlbWVudHMgKyAxOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGF0ZW1lbnRzOyBpKyspIHsKLQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0c1tpXTsKLQkJaWYgKCgoaW1wb3J0UmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkcsIGltcG9ydFJlZmVyZW5jZS50b2tlbnMpICYmICFpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKSkgeworCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV07CisJCWlmICgoKGltcG9ydFJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5PbkRlbWFuZCkgIT0gMCkgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkcsIGltcG9ydFJlZmVyZW5jZS50b2tlbnMpICYmICFpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKSkgewogCQkJbnVtYmVyT2ZJbXBvcnRzLS07CiAJCQlicmVhazsKIAkJfQpAQCAtMzI2LDcgKzMzNiw3IEBACiAJLy8gb24gZGVtYW5kIGltcG9ydHMgY29udGludWUgdG8gYmUgcGFja2FnZXMgJiB0eXBlcy4gbmVlZCB0byBjaGVjayBvbiBkZW1hbmQgdHlwZSBpbXBvcnRzIGZvciBmaWVsZHMvbWV0aG9kcwogCS8vIHNpbmdsZSBpbXBvcnRzIGNoYW5nZSBmcm9tIGJlaW5nIGp1c3QgdHlwZXMgdG8gdHlwZXMgb3IgZmllbGRzCiAJbmV4dEltcG9ydCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGF0ZW1lbnRzOyBpKyspIHsKLQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0c1tpXTsKKwkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzW2ldOwogCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBpbXBvcnRSZWZlcmVuY2UudG9rZW5zOwogCiAJCS8vIHNraXAgZHVwbGljYXRlcyBvciBpbXBvcnRzIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UKQEAgLTM0MCw3ICszNTAsNyBAQAogCQkJfQogCQl9CiAJCWlmICgoaW1wb3J0UmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwKSB7Ci0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcG91bmROYW1lLCBjdXJyZW50UGFja2FnZU5hbWUpKSB7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcG91bmROYW1lLCB0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSkpIHsKIAkJCQlwcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRJbXBvcnQoaW1wb3J0UmVmZXJlbmNlKTsgLy8gc2luY2Ugc2tpcHBlZCwgbXVzdCBiZSByZXBvcnRlZCBub3cKIAkJCQljb250aW51ZSBuZXh0SW1wb3J0OwogCQkJfQpAQCAtMzU2LDEwICszNjYsMTQgQEAKIAkJCX0KIAkJCXJlc29sdmVkSW1wb3J0c1tpbmRleCsrXSA9IG5ldyBJbXBvcnRCaW5kaW5nKGNvbXBvdW5kTmFtZSwgdHJ1ZSwgaW1wb3J0QmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKIAkJfSBlbHNlIHsKLQkJCUJpbmRpbmcgaW1wb3J0QmluZGluZyA9IGZpbmRTaW5nbGVJbXBvcnQoY29tcG91bmROYW1lLCBpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKSk7CisJCQlCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBmaW5kU2luZ2xlSW1wb3J0KGNvbXBvdW5kTmFtZSwgQmluZGluZy5UWVBFIHwgQmluZGluZy5GSUVMRCB8IEJpbmRpbmcuTUVUSE9ELCBpbXBvcnRSZWZlcmVuY2UuaXNTdGF0aWMoKSk7CiAJCQlpZiAoIWltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCXByb2JsZW1SZXBvcnRlcigpLmltcG9ydFByb2JsZW0oaW1wb3J0UmVmZXJlbmNlLCBpbXBvcnRCaW5kaW5nKTsKLQkJCQljb250aW51ZSBuZXh0SW1wb3J0OworCQkJCWlmIChpbXBvcnRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLkFtYmlndW91cykgeworCQkJCQkvLyBrZWVwIGl0IHVubGVzcyBhIGR1cGxpY2F0ZSBjYW4gYmUgZm91bmQgYmVsb3cKKwkJCQl9IGVsc2UgeworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbXBvcnRQcm9ibGVtKGltcG9ydFJlZmVyZW5jZSwgaW1wb3J0QmluZGluZyk7CisJCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisJCQkJfQogCQkJfQogCQkJaWYgKGltcG9ydEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgewogCQkJCXByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEltcG9ydFBhY2thZ2UoaW1wb3J0UmVmZXJlbmNlKTsKQEAgLTM2OCwyMyArMzgyLDQ3IEBACiAJCQlSZWZlcmVuY2VCaW5kaW5nIGNvbmZsaWN0aW5nVHlwZSA9IG51bGw7CiAJCQlpZiAoaW1wb3J0QmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKIAkJCQljb25mbGljdGluZ1R5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgZ2V0VHlwZShjb21wb3VuZE5hbWUsIGNvbXBvdW5kTmFtZS5sZW5ndGgpOwotCQkJCWlmICghY29uZmxpY3RpbmdUeXBlLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJaWYgKCFjb25mbGljdGluZ1R5cGUuaXNWYWxpZEJpbmRpbmcoKSB8fCAoaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkgJiYgIWNvbmZsaWN0aW5nVHlwZS5pc1N0YXRpYygpKSkKIAkJCQkJY29uZmxpY3RpbmdUeXBlID0gbnVsbDsKIAkJCX0KIAkJCS8vIGNvbGxpc2lvbnMgYmV0d2VlbiBhbiBpbXBvcnRlZCBzdGF0aWMgZmllbGQgJiBhIHR5cGUgc2hvdWxkIGJlIGNoZWNrZWQgYWNjb3JkaW5nIHRvIHNwZWMuLi4gYnV0IGN1cnJlbnRseSBub3QgYnkgamF2YWMKIAkJCWlmIChpbXBvcnRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyB8fCBjb25mbGljdGluZ1R5cGUgIT0gbnVsbCkgewogCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IGNvbmZsaWN0aW5nVHlwZSA9PSBudWxsID8gKFJlZmVyZW5jZUJpbmRpbmcpIGltcG9ydEJpbmRpbmcgOiBjb25mbGljdGluZ1R5cGU7Ci0JCQkJaWYgKGltcG9ydFJlZmVyZW5jZS5pc1R5cGVVc2VEZXByZWNhdGVkKHJlZmVyZW5jZUJpbmRpbmcsIHRoaXMpKQotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZShyZWZlcmVuY2VCaW5kaW5nLCBpbXBvcnRSZWZlcmVuY2UpOworCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZVRvQ2hlY2sgPSByZWZlcmVuY2VCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLkFtYmlndW91cworCQkJCQk/ICgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpLmNsb3Nlc3RNYXRjaAorCQkJCQk6IHJlZmVyZW5jZUJpbmRpbmc7CisJCQkJaWYgKGltcG9ydFJlZmVyZW5jZS5pc1R5cGVVc2VEZXByZWNhdGVkKHR5cGVUb0NoZWNrLCB0aGlzKSkKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUodHlwZVRvQ2hlY2ssIGltcG9ydFJlZmVyZW5jZSk7CiAKIAkJCQlSZWZlcmVuY2VCaW5kaW5nIGV4aXN0aW5nVHlwZSA9IHR5cGVzQnlTaW1wbGVOYW1lcy5nZXQoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7CiAJCQkJaWYgKGV4aXN0aW5nVHlwZSAhPSBudWxsKSB7CiAJCQkJCS8vIGR1cGxpY2F0ZSB0ZXN0IGFib3ZlIHNob3VsZCBoYXZlIGNhdWdodCB0aGlzIGNhc2UsIGJ1dCBtYWtlIHN1cmUKLQkJCQkJaWYgKGV4aXN0aW5nVHlwZSA9PSByZWZlcmVuY2VCaW5kaW5nKQorCQkJCQlpZiAoZXhpc3RpbmdUeXBlID09IHJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDI4NjUKKwkJCQkJCS8vIENoZWNrIGFsbCByZXNvbHZlZCBpbXBvcnRzIHRvIHNlZSBpZiB0aGlzIGltcG9ydCBxdWFsaWZpZXMgYXMgYSBkdXBsaWNhdGUKKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZXg7IGorKykgeworCQkJCQkJCUltcG9ydEJpbmRpbmcgcmVzb2x2ZWQgPSByZXNvbHZlZEltcG9ydHNbal07CisJCQkJCQkJaWYgKHJlc29sdmVkIGluc3RhbmNlb2YgSW1wb3J0Q29uZmxpY3RCaW5kaW5nKSB7CisJCQkJCQkJCUltcG9ydENvbmZsaWN0QmluZGluZyBpbXBvcnRDb25mbGljdEJpbmRpbmcgPSAoSW1wb3J0Q29uZmxpY3RCaW5kaW5nKSByZXNvbHZlZDsKKwkJCQkJCQkJaWYgKGltcG9ydENvbmZsaWN0QmluZGluZy5jb25mbGljdGluZ1R5cGVCaW5kaW5nID09IHJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCQkJCWlmICghaW1wb3J0UmVmZXJlbmNlLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCQkvLyByZXNvbHZlZCBpcyBpbXBsaWNpdGx5IHN0YXRpYworCQkJCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUltcG9ydChpbXBvcnRSZWZlcmVuY2UpOworCQkJCQkJCQkJCXJlc29sdmVkSW1wb3J0c1tpbmRleCsrXSA9IG5ldyBJbXBvcnRCaW5kaW5nKGNvbXBvdW5kTmFtZSwgZmFsc2UsIGltcG9ydEJpbmRpbmcsIGltcG9ydFJlZmVyZW5jZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKHJlc29sdmVkLnJlc29sdmVkSW1wb3J0ID09IHJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZS5pc1N0YXRpYygpICE9IHJlc29sdmVkLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUltcG9ydChpbXBvcnRSZWZlcmVuY2UpOworCQkJCQkJCQkJcmVzb2x2ZWRJbXBvcnRzW2luZGV4KytdID0gbmV3IEltcG9ydEJpbmRpbmcoY29tcG91bmROYW1lLCBmYWxzZSwgaW1wb3J0QmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisJCQkJCX0KIAkJCQkJLy8gZWl0aGVyIHRoZSB0eXBlIGNvbGxpZGVzIHdpdGggYSB0b3AgbGV2ZWwgdHlwZSBvciBhbm90aGVyIGltcG9ydGVkIHR5cGUKLQkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IHRvcExldmVsVHlwZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0b3BMZXZlbFR5cGVzW2pdLnNvdXJjZU5hbWUsIGV4aXN0aW5nVHlwZS5zb3VyY2VOYW1lKSkgeworCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gdGhpcy50b3BMZXZlbFR5cGVzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy50b3BMZXZlbFR5cGVzW2pdLnNvdXJjZU5hbWUsIGV4aXN0aW5nVHlwZS5zb3VyY2VOYW1lKSkgewogCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmNvbmZsaWN0aW5nSW1wb3J0KGltcG9ydFJlZmVyZW5jZSk7CiAJCQkJCQkJY29udGludWUgbmV4dEltcG9ydDsKIAkJCQkJCX0KQEAgLTQxNCwxMiArNDUyLDEyIEBACiAJLy8gc2hyaW5rIHJlc29sdmVkSW1wb3J0cy4uLiBvbmx5IGhhcHBlbnMgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkCiAJaWYgKHJlc29sdmVkSW1wb3J0cy5sZW5ndGggPiBpbmRleCkKIAkJU3lzdGVtLmFycmF5Y29weShyZXNvbHZlZEltcG9ydHMsIDAsIHJlc29sdmVkSW1wb3J0cyA9IG5ldyBJbXBvcnRCaW5kaW5nW2luZGV4XSwgMCwgaW5kZXgpOwotCWltcG9ydHMgPSByZXNvbHZlZEltcG9ydHM7CisJdGhpcy5pbXBvcnRzID0gcmVzb2x2ZWRJbXBvcnRzOwogCi0JaW50IGxlbmd0aCA9IGltcG9ydHMubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmltcG9ydHMubGVuZ3RoOwogCXRoaXMudHlwZU9yUGFja2FnZUNhY2hlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGxlbmd0aCk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlJbXBvcnRCaW5kaW5nIGJpbmRpbmcgPSBpbXBvcnRzW2ldOworCQlJbXBvcnRCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmltcG9ydHNbaV07CiAJCWlmICghYmluZGluZy5vbkRlbWFuZCAmJiBiaW5kaW5nLnJlc29sdmVkSW1wb3J0IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyB8fCBiaW5kaW5nIGluc3RhbmNlb2YgSW1wb3J0Q29uZmxpY3RCaW5kaW5nKQogCQkJdGhpcy50eXBlT3JQYWNrYWdlQ2FjaGUucHV0KGJpbmRpbmcuY29tcG91bmROYW1lW2JpbmRpbmcuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLCBiaW5kaW5nKTsKIAl9CkBAIC00MjcsMjEgKzQ2NSwyMSBAQAogcHVibGljIHZvaWQgZmF1bHRJblR5cGVzKCkgewogCWZhdWx0SW5JbXBvcnRzKCk7CiAKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJdG9wTGV2ZWxUeXBlc1tpXS5mYXVsdEluVHlwZXNGb3JGaWVsZHNBbmRNZXRob2RzKCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJdGhpcy50b3BMZXZlbFR5cGVzW2ldLmZhdWx0SW5UeXBlc0ZvckZpZWxkc0FuZE1ldGhvZHMoKTsKIH0KIC8vIHRoaXMgQVBJIGlzIGZvciBjb2RlIGFzc2lzdCBwdXJwb3NlCiBwdWJsaWMgQmluZGluZyBmaW5kSW1wb3J0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgYm9vbGVhbiBmaW5kU3RhdGljSW1wb3J0cywgYm9vbGVhbiBvbkRlbWFuZCkgewogCWlmKG9uRGVtYW5kKSB7CiAJCXJldHVybiBmaW5kSW1wb3J0KGNvbXBvdW5kTmFtZSwgY29tcG91bmROYW1lLmxlbmd0aCk7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIGZpbmRTaW5nbGVJbXBvcnQoY29tcG91bmROYW1lLCBmaW5kU3RhdGljSW1wb3J0cyk7CisJCXJldHVybiBmaW5kU2luZ2xlSW1wb3J0KGNvbXBvdW5kTmFtZSwgQmluZGluZy5UWVBFIHwgQmluZGluZy5GSUVMRCB8IEJpbmRpbmcuTUVUSE9ELCBmaW5kU3RhdGljSW1wb3J0cyk7CiAJfQogfQogcHJpdmF0ZSBCaW5kaW5nIGZpbmRJbXBvcnQoY2hhcltdW10gY29tcG91bmROYW1lLCBpbnQgbGVuZ3RoKSB7CiAJcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKGNvbXBvdW5kTmFtZSk7CiAKLQlCaW5kaW5nIGJpbmRpbmcgPSBlbnZpcm9ubWVudC5nZXRUb3BMZXZlbFBhY2thZ2UoY29tcG91bmROYW1lWzBdKTsKKwlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShjb21wb3VuZE5hbWVbMF0pOwogCWludCBpID0gMTsKIAlmb3VuZE5vdGhpbmdPclR5cGU6IGlmIChiaW5kaW5nICE9IG51bGwpIHsKIAkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7CkBAIC00NjEsOSArNDk5LDkgQEAKIAogCVJlZmVyZW5jZUJpbmRpbmcgdHlwZTsKIAlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCWlmIChlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KQorCQlpZiAoY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBpKSwgbnVsbCwgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwotCQl0eXBlID0gZmluZFR5cGUoY29tcG91bmROYW1lWzBdLCBlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSwgZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2UpOworCQl0eXBlID0gZmluZFR5cGUoY29tcG91bmROYW1lWzBdLCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlLCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlKTsKIAkJaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5pc1ZhbGlkQmluZGluZygpKQogCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgaSksIG51bGwsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKIAkJaSA9IDE7IC8vIHJlc2V0IHRvIGxvb2sgZm9yIG1lbWJlciB0eXBlcyBpbnNpZGUgdGhlIGRlZmF1bHQgcGFja2FnZSB0eXBlCkBAIC00NzIsOCArNTEwLDggQEAKIAl9CiAKIAl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQl0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZSh0eXBlKTsgLy8gdHlwZSBpbXBvcnRzIGFyZSBuZWNlc3NhcmlseSByYXcgZm9yIGFsbCBleGNlcHQgbGFzdAotCQlpZiAoIXR5cGUuY2FuQmVTZWVuQnkoZlBhY2thZ2UpKQorCQl0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5lbnZpcm9ubWVudC5jb252ZXJ0VG9SYXdUeXBlKHR5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOyAvLyB0eXBlIGltcG9ydHMgYXJlIG5lY2Vzc2FyaWx5IHJhdyBmb3IgYWxsIGV4Y2VwdCBsYXN0CisJCWlmICghdHlwZS5jYW5CZVNlZW5CeSh0aGlzLmZQYWNrYWdlKSkKIAkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGkpLCB0eXBlLCBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKIAogCQljaGFyW10gbmFtZSA9IGNvbXBvdW5kTmFtZVtpKytdOwpAQCAtNDgyLDI3ICs1MjAsMjcgQEAKIAkJaWYgKHR5cGUgPT0gbnVsbCkKIAkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGkpLCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJfQotCWlmICghdHlwZS5jYW5CZVNlZW5CeShmUGFja2FnZSkpCisJaWYgKCF0eXBlLmNhbkJlU2VlbkJ5KHRoaXMuZlBhY2thZ2UpKQogCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNvbXBvdW5kTmFtZSwgdHlwZSwgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSk7CiAJcmV0dXJuIHR5cGU7CiB9Ci1wcml2YXRlIEJpbmRpbmcgZmluZFNpbmdsZUltcG9ydChjaGFyW11bXSBjb21wb3VuZE5hbWUsIGJvb2xlYW4gZmluZFN0YXRpY0ltcG9ydHMpIHsKK3ByaXZhdGUgQmluZGluZyBmaW5kU2luZ2xlSW1wb3J0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgaW50IG1hc2ssIGJvb2xlYW4gZmluZFN0YXRpY0ltcG9ydHMpIHsKIAlpZiAoY29tcG91bmROYW1lLmxlbmd0aCA9PSAxKSB7CiAJCS8vIGZpbmRUeXBlIHJlY29yZHMgdGhlIHJlZmVyZW5jZQogCQkvLyB0aGUgbmFtZSBjYW5ub3QgYmUgYSBwYWNrYWdlCi0JCWlmIChlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KQorCQlpZiAoY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNvbXBvdW5kTmFtZSwgbnVsbCwgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwotCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gZmluZFR5cGUoY29tcG91bmROYW1lWzBdLCBlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSwgZlBhY2thZ2UpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gZmluZFR5cGUoY29tcG91bmROYW1lWzBdLCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlLCB0aGlzLmZQYWNrYWdlKTsKIAkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNvbXBvdW5kTmFtZSwgbnVsbCwgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwogCQlyZXR1cm4gdHlwZUJpbmRpbmc7CiAJfQogCiAJaWYgKGZpbmRTdGF0aWNJbXBvcnRzKQotCQlyZXR1cm4gZmluZFNpbmdsZVN0YXRpY0ltcG9ydChjb21wb3VuZE5hbWUpOworCQlyZXR1cm4gZmluZFNpbmdsZVN0YXRpY0ltcG9ydChjb21wb3VuZE5hbWUsIG1hc2spOwogCXJldHVybiBmaW5kSW1wb3J0KGNvbXBvdW5kTmFtZSwgY29tcG91bmROYW1lLmxlbmd0aCk7CiB9Ci1wcml2YXRlIEJpbmRpbmcgZmluZFNpbmdsZVN0YXRpY0ltcG9ydChjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsKK3ByaXZhdGUgQmluZGluZyBmaW5kU2luZ2xlU3RhdGljSW1wb3J0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgaW50IG1hc2spIHsKIAlCaW5kaW5nIGJpbmRpbmcgPSBmaW5kSW1wb3J0KGNvbXBvdW5kTmFtZSwgY29tcG91bmROYW1lLmxlbmd0aCAtIDEpOwogCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSByZXR1cm4gYmluZGluZzsKIApAQCAtNTE2LDEyICs1NTQsMTYgQEAKIAogCS8vIGxvb2sgdG8gc2VlIGlmIGl0cyBhIHN0YXRpYyBmaWVsZCBmaXJzdAogCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwotCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpbmRGaWVsZCh0eXBlLCBuYW1lLCBudWxsLCB0cnVlKTsKLQlpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5pc1ZhbGlkQmluZGluZygpICYmIGZpZWxkLmlzU3RhdGljKCkgJiYgZmllbGQuY2FuQmVTZWVuQnkodHlwZSwgbnVsbCwgdGhpcykpCi0JCXJldHVybiBmaWVsZDsKKwlGaWVsZEJpbmRpbmcgZmllbGQgPSAobWFzayAmIEJpbmRpbmcuRklFTEQpICE9IDAgPyBmaW5kRmllbGQodHlwZSwgbmFtZSwgbnVsbCwgdHJ1ZSkgOiBudWxsOworCWlmIChmaWVsZCAhPSBudWxsKSB7CisJCWlmIChmaWVsZC5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMgJiYgKChQcm9ibGVtRmllbGRCaW5kaW5nKSBmaWVsZCkuY2xvc2VzdE1hdGNoLmlzU3RhdGljKCkpCisJCQlyZXR1cm4gZmllbGQ7IC8vIGtlZXAgdGhlIGFtYmlndW91cyBmaWVsZCBpbnN0ZWFkIG9mIGEgcG9zc2libGUgbWV0aG9kIG1hdGNoCisJCWlmIChmaWVsZC5pc1ZhbGlkQmluZGluZygpICYmIGZpZWxkLmlzU3RhdGljKCkgJiYgZmllbGQuY2FuQmVTZWVuQnkodHlwZSwgbnVsbCwgdGhpcykpCisJCQlyZXR1cm4gZmllbGQ7CisJfQogCiAJLy8gbG9vayB0byBzZWUgaWYgdGhlcmUgaXMgYSBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2VsZWN0b3IKLQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IGZpbmRTdGF0aWNNZXRob2QodHlwZSwgbmFtZSk7CisJTWV0aG9kQmluZGluZyBtZXRob2QgPSAobWFzayAmIEJpbmRpbmcuTUVUSE9EKSAhPSAwID8gZmluZFN0YXRpY01ldGhvZCh0eXBlLCBuYW1lKSA6IG51bGw7CiAJaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kOwogCiAJdHlwZSA9IGZpbmRNZW1iZXJUeXBlKG5hbWUsIHR5cGUpOwpAQCAtNTMwLDQ5ICs1NzIsNTUgQEAKIAkJCXJldHVybiBmaWVsZDsKIAkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIHR5cGUsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKIAl9Ci0JaWYgKCF0eXBlLmNhbkJlU2VlbkJ5KGZQYWNrYWdlKSkKKwlpZiAodHlwZS5pc1ZhbGlkQmluZGluZygpICYmICF0eXBlLmNhbkJlU2VlbkJ5KHRoaXMuZlBhY2thZ2UpKQogCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNvbXBvdW5kTmFtZSwgdHlwZSwgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSk7CisJaWYgKHR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkgLy8gZW5zdXJlIGNvbXBvdW5kTmFtZSBpcyBjb3JyZWN0CisJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCAoKFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB0eXBlKS5jbG9zZXN0TWF0Y2gsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOwogCXJldHVybiB0eXBlOwogfQotTWV0aG9kQmluZGluZyBmaW5kU3RhdGljTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsIGNoYXJbXSBzZWxlY3RvcikgeworLy8gaGVscGVyIG1ldGhvZCBmb3IgZmluZFNpbmdsZVN0YXRpY0ltcG9ydCgpCitwcml2YXRlIE1ldGhvZEJpbmRpbmcgZmluZFN0YXRpY01ldGhvZChSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlLCBjaGFyW10gc2VsZWN0b3IpIHsKIAlpZiAoIWN1cnJlbnRUeXBlLmNhbkJlU2VlbkJ5KHRoaXMpKQogCQlyZXR1cm4gbnVsbDsKIAogCWRvIHsKKwkJY3VycmVudFR5cGUuaW5pdGlhbGl6ZUZvclN0YXRpY0ltcG9ydHMoKTsKIAkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsKIAkJaWYgKG1ldGhvZHMgIT0gQmluZGluZy5OT19NRVRIT0RTKSB7CiAJCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykgewogCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCQlpZiAobWV0aG9kLmlzU3RhdGljKCkgJiYgbWV0aG9kLmNhbkJlU2VlbkJ5KGZQYWNrYWdlKSkKKwkJCQlpZiAobWV0aG9kLmlzU3RhdGljKCkgJiYgbWV0aG9kLmNhbkJlU2VlbkJ5KHRoaXMuZlBhY2thZ2UpKQogCQkJCQlyZXR1cm4gbWV0aG9kOwogCQkJfQogCQl9Ci0JCWlmIChjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKSA9PSBudWxsKSAvLyBuZWVkZWQgZm9yIHN0YXRpY2FsbHkgaW1wb3J0ZWQgdHlwZXMgd2hpY2ggZG9uJ3Qga25vdyB0aGVpciBoaWVyYXJjaHkgeWV0Ci0JCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSkuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKIAl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBudWxsOwogfQogSW1wb3J0QmluZGluZ1tdIGdldERlZmF1bHRJbXBvcnRzKCkgewogCS8vIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW1wb3J0cyBpZiBuZWNlc3NhcnkuLi4gc2hhcmUgdGhlIGRlZmF1bHQgamF2YS5sYW5nLiogaW1wb3J0Ci0JaWYgKGVudmlyb25tZW50LmRlZmF1bHRJbXBvcnRzICE9IG51bGwpIHJldHVybiBlbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0czsKKwlpZiAodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0cyAhPSBudWxsKSByZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0czsKIAotCUJpbmRpbmcgaW1wb3J0QmluZGluZyA9IGVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShKQVZBKTsKKwlCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShUeXBlQ29uc3RhbnRzLkpBVkEpOwogCWlmIChpbXBvcnRCaW5kaW5nICE9IG51bGwpCi0JCWltcG9ydEJpbmRpbmcgPSAoKFBhY2thZ2VCaW5kaW5nKSBpbXBvcnRCaW5kaW5nKS5nZXRUeXBlT3JQYWNrYWdlKEpBVkFfTEFOR1sxXSk7CisJCWltcG9ydEJpbmRpbmcgPSAoKFBhY2thZ2VCaW5kaW5nKSBpbXBvcnRCaW5kaW5nKS5nZXRUeXBlT3JQYWNrYWdlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HWzFdKTsKIAogCWlmIChpbXBvcnRCaW5kaW5nID09IG51bGwgfHwgIWltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkvLyBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIG1pc3NpbmcgQmluYXJ5VHlwZQotCQlCaW5hcnlUeXBlQmluZGluZyBtaXNzaW5nT2JqZWN0ID0gZW52aXJvbm1lbnQuY2FjaGVNaXNzaW5nQmluYXJ5VHlwZShKQVZBX0xBTkdfT0JKRUNULCB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoCisJCQkJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULAorCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LAorCQkJdGhpcy5lbnZpcm9ubWVudC5taXNzaW5nQ2xhc3NGaWxlTG9jYXRpb24pOworCQlCaW5hcnlUeXBlQmluZGluZyBtaXNzaW5nT2JqZWN0ID0gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVNaXNzaW5nVHlwZShudWxsLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QpOwogCQlpbXBvcnRCaW5kaW5nID0gbWlzc2luZ09iamVjdC5mUGFja2FnZTsKIAl9CiAKLQlyZXR1cm4gZW52aXJvbm1lbnQuZGVmYXVsdEltcG9ydHMgPSBuZXcgSW1wb3J0QmluZGluZ1tdIHtuZXcgSW1wb3J0QmluZGluZyhKQVZBX0xBTkcsIHRydWUsIGltcG9ydEJpbmRpbmcsIG51bGwpfTsKKwlyZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0cyA9IG5ldyBJbXBvcnRCaW5kaW5nW10ge25ldyBJbXBvcnRCaW5kaW5nKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HLCB0cnVlLCBpbXBvcnRCaW5kaW5nLCBudWxsKX07CiB9CiAvLyBOT1QgUHVibGljIEFQSQogcHVibGljIGZpbmFsIEJpbmRpbmcgZ2V0SW1wb3J0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgYm9vbGVhbiBvbkRlbWFuZCwgYm9vbGVhbiBpc1N0YXRpY0ltcG9ydCkgewogCWlmIChvbkRlbWFuZCkKIAkJcmV0dXJuIGZpbmRJbXBvcnQoY29tcG91bmROYW1lLCBjb21wb3VuZE5hbWUubGVuZ3RoKTsKLQlyZXR1cm4gZmluZFNpbmdsZUltcG9ydChjb21wb3VuZE5hbWUsIGlzU3RhdGljSW1wb3J0KTsKKwlyZXR1cm4gZmluZFNpbmdsZUltcG9ydChjb21wb3VuZE5hbWUsIEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuRklFTEQgfCBCaW5kaW5nLk1FVEhPRCwgaXNTdGF0aWNJbXBvcnQpOwogfQogCiBwdWJsaWMgaW50IG5leHRDYXB0dXJlSUQoKSB7CkBAIC01ODYsOCArNjM0LDggQEAKICogdG8gYWJvcnQuCiAqLwogcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7Ci0JUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IHJlZmVyZW5jZUNvbnRleHQucHJvYmxlbVJlcG9ydGVyOwotCXByb2JsZW1SZXBvcnRlci5yZWZlcmVuY2VDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dDsKKwlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LnByb2JsZW1SZXBvcnRlcjsKKwlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dDsKIAlyZXR1cm4gcHJvYmxlbVJlcG9ydGVyOwogfQogCkBAIC02MjgsMTIgKzY3NiwxMyBAQAogIGFuZCBjYW4gaGFuZGxlIGNvbGxpc2lvbiBjYXNlcy4KICovCiB2b2lkIHJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShjaGFyW11bXSBxdWFsaWZpZWROYW1lKSB7Ci0JaWYgKHF1YWxpZmllZFJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcmVjb3JkaW5nIGRlcGVuZGVuY2llcworCWlmICh0aGlzLnF1YWxpZmllZFJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcmVjb3JkaW5nIGRlcGVuZGVuY2llcwogCiAJaW50IGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOwogCWlmIChsZW5ndGggPiAxKSB7Ci0JCXdoaWxlICghcXVhbGlmaWVkUmVmZXJlbmNlcy5jb250YWlucyhxdWFsaWZpZWROYW1lKSkgewotCQkJcXVhbGlmaWVkUmVmZXJlbmNlcy5hZGQocXVhbGlmaWVkTmFtZSk7CisJCXJlY29yZFJvb3RSZWZlcmVuY2UocXVhbGlmaWVkTmFtZVswXSk7CisJCXdoaWxlICghdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VzLmNvbnRhaW5zKHF1YWxpZmllZE5hbWUpKSB7CisJCQl0aGlzLnF1YWxpZmllZFJlZmVyZW5jZXMuYWRkKHF1YWxpZmllZE5hbWUpOwogCQkJaWYgKGxlbmd0aCA9PSAyKSB7CiAJCQkJcmVjb3JkU2ltcGxlUmVmZXJlbmNlKHF1YWxpZmllZE5hbWVbMF0pOwogCQkJCXJlY29yZFNpbXBsZVJlZmVyZW5jZShxdWFsaWZpZWROYW1lWzFdKTsKQEAgLTY0NCwxMSArNjkzLDE0IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KHF1YWxpZmllZE5hbWUsIDAsIHF1YWxpZmllZE5hbWUgPSBuZXcgY2hhcltsZW5ndGhdW10sIDAsIGxlbmd0aCk7CiAJCX0KIAl9IGVsc2UgaWYgKGxlbmd0aCA9PSAxKSB7CisJCXJlY29yZFJvb3RSZWZlcmVuY2UocXVhbGlmaWVkTmFtZVswXSk7CiAJCXJlY29yZFNpbXBsZVJlZmVyZW5jZShxdWFsaWZpZWROYW1lWzBdKTsKIAl9CiB9CiB2b2lkIHJlY29yZFJlZmVyZW5jZShjaGFyW11bXSBxdWFsaWZpZWRFbmNsb3NpbmdOYW1lLCBjaGFyW10gc2ltcGxlTmFtZSkgewogCXJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShxdWFsaWZpZWRFbmNsb3NpbmdOYW1lKTsKKwlpZiAocXVhbGlmaWVkRW5jbG9zaW5nTmFtZS5sZW5ndGggPT0gMCkKKwkJcmVjb3JkUm9vdFJlZmVyZW5jZShzaW1wbGVOYW1lKTsKIAlyZWNvcmRTaW1wbGVSZWZlcmVuY2Uoc2ltcGxlTmFtZSk7CiB9CiB2b2lkIHJlY29yZFJlZmVyZW5jZShSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIGNoYXJbXSBzaW1wbGVOYW1lKSB7CkBAIC02NTYsNDcgKzcwOCw1NSBAQAogCWlmIChhY3R1YWxUeXBlICE9IG51bGwpCiAJCXJlY29yZFJlZmVyZW5jZShhY3R1YWxUeXBlLmNvbXBvdW5kTmFtZSwgc2ltcGxlTmFtZSk7CiB9Ci12b2lkIHJlY29yZFNpbXBsZVJlZmVyZW5jZShjaGFyW10gc2ltcGxlTmFtZSkgewotCWlmIChzaW1wbGVOYW1lUmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCit2b2lkIHJlY29yZFJvb3RSZWZlcmVuY2UoY2hhcltdIHNpbXBsZU5hbWUpIHsKKwlpZiAodGhpcy5yb290UmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCiAKLQlpZiAoIXNpbXBsZU5hbWVSZWZlcmVuY2VzLmNvbnRhaW5zKHNpbXBsZU5hbWUpKQotCQlzaW1wbGVOYW1lUmVmZXJlbmNlcy5hZGQoc2ltcGxlTmFtZSk7CisJaWYgKCF0aGlzLnJvb3RSZWZlcmVuY2VzLmNvbnRhaW5zKHNpbXBsZU5hbWUpKQorCQl0aGlzLnJvb3RSZWZlcmVuY2VzLmFkZChzaW1wbGVOYW1lKTsKK30KK3ZvaWQgcmVjb3JkU2ltcGxlUmVmZXJlbmNlKGNoYXJbXSBzaW1wbGVOYW1lKSB7CisJaWYgKHRoaXMuc2ltcGxlTmFtZVJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcmVjb3JkaW5nIGRlcGVuZGVuY2llcworCisJaWYgKCF0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzLmNvbnRhaW5zKHNpbXBsZU5hbWUpKQorCQl0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzLmFkZChzaW1wbGVOYW1lKTsKIH0KIHZvaWQgcmVjb3JkU3VwZXJUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nIHR5cGUpIHsKLQlpZiAocmVmZXJlbmNlZFN1cGVyVHlwZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcmVjb3JkaW5nIGRlcGVuZGVuY2llcworCWlmICh0aGlzLnJlZmVyZW5jZWRTdXBlclR5cGVzID09IG51bGwpIHJldHVybjsgLy8gbm90IHJlY29yZGluZyBkZXBlbmRlbmNpZXMKIAogCVJlZmVyZW5jZUJpbmRpbmcgYWN0dWFsVHlwZSA9IHR5cGVUb1JlY29yZCh0eXBlKTsKLQlpZiAoYWN0dWFsVHlwZSAhPSBudWxsICYmICFyZWZlcmVuY2VkU3VwZXJUeXBlcy5jb250YWluc0lkZW50aWNhbChhY3R1YWxUeXBlKSkKLQkJcmVmZXJlbmNlZFN1cGVyVHlwZXMuYWRkKGFjdHVhbFR5cGUpOworCWlmIChhY3R1YWxUeXBlICE9IG51bGwgJiYgIXRoaXMucmVmZXJlbmNlZFN1cGVyVHlwZXMuY29udGFpbnNJZGVudGljYWwoYWN0dWFsVHlwZSkpCisJCXRoaXMucmVmZXJlbmNlZFN1cGVyVHlwZXMuYWRkKGFjdHVhbFR5cGUpOwogfQogcHVibGljIHZvaWQgcmVjb3JkVHlwZUNvbnZlcnNpb24oVHlwZUJpbmRpbmcgc3VwZXJUeXBlLCBUeXBlQmluZGluZyBzdWJUeXBlKSB7CiAJcmVjb3JkU3VwZXJUeXBlUmVmZXJlbmNlKHN1YlR5cGUpOyAvLyBtdXN0IHJlY29yZCB0aGUgaGllcmFyY2h5IG9mIHRoZSBzdWJUeXBlIHRoYXQgaXMgY29udmVydGVkIHRvIHRoZSBzdXBlclR5cGUKIH0KIHZvaWQgcmVjb3JkVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZyB0eXBlKSB7Ci0JaWYgKHJlZmVyZW5jZWRUeXBlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCisJaWYgKHRoaXMucmVmZXJlbmNlZFR5cGVzID09IG51bGwpIHJldHVybjsgLy8gbm90IHJlY29yZGluZyBkZXBlbmRlbmNpZXMKIAogCVJlZmVyZW5jZUJpbmRpbmcgYWN0dWFsVHlwZSA9IHR5cGVUb1JlY29yZCh0eXBlKTsKLQlpZiAoYWN0dWFsVHlwZSAhPSBudWxsICYmICFyZWZlcmVuY2VkVHlwZXMuY29udGFpbnNJZGVudGljYWwoYWN0dWFsVHlwZSkpCi0JCXJlZmVyZW5jZWRUeXBlcy5hZGQoYWN0dWFsVHlwZSk7CisJaWYgKGFjdHVhbFR5cGUgIT0gbnVsbCAmJiAhdGhpcy5yZWZlcmVuY2VkVHlwZXMuY29udGFpbnNJZGVudGljYWwoYWN0dWFsVHlwZSkpCisJCXRoaXMucmVmZXJlbmNlZFR5cGVzLmFkZChhY3R1YWxUeXBlKTsKIH0KIHZvaWQgcmVjb3JkVHlwZVJlZmVyZW5jZXMoVHlwZUJpbmRpbmdbXSB0eXBlcykgewotCWlmIChyZWZlcmVuY2VkVHlwZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcmVjb3JkaW5nIGRlcGVuZGVuY2llcworCWlmICh0aGlzLnJlZmVyZW5jZWRUeXBlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCiAJaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApIHJldHVybjsKIAogCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkvLyBObyBuZWVkIHRvIHJlY29yZCBzdXBlcnR5cGVzIG9mIG1ldGhvZCBhcmd1bWVudHMgJiB0aHJvd24gZXhjZXB0aW9ucywganVzdCB0aGUgY29tcG91bmROYW1lCiAJCS8vIElmIGEgZmllbGQvbWV0aG9kIGlzIHJldHJpZXZlZCBmcm9tIHN1Y2ggYSB0eXBlIHRoZW4gYSBzZXBhcmF0ZSBjYWxsIGRvZXMgdGhlIGpvYgogCQlSZWZlcmVuY2VCaW5kaW5nIGFjdHVhbFR5cGUgPSB0eXBlVG9SZWNvcmQodHlwZXNbaV0pOwotCQlpZiAoYWN0dWFsVHlwZSAhPSBudWxsICYmICFyZWZlcmVuY2VkVHlwZXMuY29udGFpbnNJZGVudGljYWwoYWN0dWFsVHlwZSkpCi0JCQlyZWZlcmVuY2VkVHlwZXMuYWRkKGFjdHVhbFR5cGUpOworCQlpZiAoYWN0dWFsVHlwZSAhPSBudWxsICYmICF0aGlzLnJlZmVyZW5jZWRUeXBlcy5jb250YWluc0lkZW50aWNhbChhY3R1YWxUeXBlKSkKKwkJCXRoaXMucmVmZXJlbmNlZFR5cGVzLmFkZChhY3R1YWxUeXBlKTsKIAl9CiB9Ci1CaW5kaW5nIHJlc29sdmVTaW5nbGVJbXBvcnQoSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nKSB7CitCaW5kaW5nIHJlc29sdmVTaW5nbGVJbXBvcnQoSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nLCBpbnQgbWFzaykgewogCWlmIChpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0ID09IG51bGwpIHsKLQkJaW1wb3J0QmluZGluZy5yZXNvbHZlZEltcG9ydCA9IGZpbmRTaW5nbGVJbXBvcnQoaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWUsIGltcG9ydEJpbmRpbmcuaXNTdGF0aWMoKSk7CisJCWltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQgPSBmaW5kU2luZ2xlSW1wb3J0KGltcG9ydEJpbmRpbmcuY29tcG91bmROYW1lLCBtYXNrLCBpbXBvcnRCaW5kaW5nLmlzU3RhdGljKCkpOwogCQlpZiAoIWltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQuaXNWYWxpZEJpbmRpbmcoKSB8fCBpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0IGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJCWlmIChpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0LnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLkFtYmlndW91cykKKwkJCQlyZXR1cm4gaW1wb3J0QmluZGluZy5yZXNvbHZlZEltcG9ydDsKIAkJCWlmICh0aGlzLmltcG9ydHMgIT0gbnVsbCkgewotCQkJCUltcG9ydEJpbmRpbmdbXSBuZXdJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbaW1wb3J0cy5sZW5ndGggLSAxXTsKKwkJCQlJbXBvcnRCaW5kaW5nW10gbmV3SW1wb3J0cyA9IG5ldyBJbXBvcnRCaW5kaW5nW3RoaXMuaW1wb3J0cy5sZW5ndGggLSAxXTsKIAkJCQlmb3IgKGludCBpID0gMCwgbiA9IDAsIG1heCA9IHRoaXMuaW1wb3J0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykKIAkJCQkJaWYgKHRoaXMuaW1wb3J0c1tpXSAhPSBpbXBvcnRCaW5kaW5nKQogCQkJCQkJbmV3SW1wb3J0c1tuKytdID0gdGhpcy5pbXBvcnRzW2ldOwpAQCAtNzEwLDEwICs3NzAsMTAgQEAKIHB1YmxpYyB2b2lkIHN0b3JlRGVwZW5kZW5jeUluZm8oKSB7CiAJLy8gYWRkIHRoZSB0eXBlIGhpZXJhcmNoeSBvZiBlYWNoIHJlZmVyZW5jZWQgc3VwZXJ0eXBlCiAJLy8gY2Fubm90IGRvIGVhcmx5IHNpbmNlIHRoZSBoaWVyYXJjaHkgbWF5IG5vdCBiZSBmdWxseSByZXNvbHZlZAotCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZFN1cGVyVHlwZXMuc2l6ZTsgaSsrKSB7IC8vIGdyb3dzIGFzIG1vcmUgdHlwZXMgYXJlIGFkZGVkCi0JCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWZlcmVuY2VkU3VwZXJUeXBlcy5lbGVtZW50QXQoaSk7Ci0JCWlmICghcmVmZXJlbmNlZFR5cGVzLmNvbnRhaW5zSWRlbnRpY2FsKHR5cGUpKQotCQkJcmVmZXJlbmNlZFR5cGVzLmFkZCh0eXBlKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucmVmZXJlbmNlZFN1cGVyVHlwZXMuc2l6ZTsgaSsrKSB7IC8vIGdyb3dzIGFzIG1vcmUgdHlwZXMgYXJlIGFkZGVkCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlZmVyZW5jZWRTdXBlclR5cGVzLmVsZW1lbnRBdChpKTsKKwkJaWYgKCF0aGlzLnJlZmVyZW5jZWRUeXBlcy5jb250YWluc0lkZW50aWNhbCh0eXBlKSkKKwkJCXRoaXMucmVmZXJlbmNlZFR5cGVzLmFkZCh0eXBlKTsKIAogCQlpZiAoIXR5cGUuaXNMb2NhbFR5cGUoKSkgewogCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSB0eXBlLmVuY2xvc2luZ1R5cGUoKTsKQEAgLTcyOSwyOCArNzg5LDM0IEBACiAJCQkJcmVjb3JkU3VwZXJUeXBlUmVmZXJlbmNlKGludGVyZmFjZXNbal0pOwogCX0KIAotCWZvciAoaW50IGkgPSAwLCBsID0gcmVmZXJlbmNlZFR5cGVzLnNpemU7IGkgPCBsOyBpKyspIHsKLQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlZmVyZW5jZWRUeXBlcy5lbGVtZW50QXQoaSk7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnJlZmVyZW5jZWRUeXBlcy5zaXplOyBpIDwgbDsgaSsrKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlZmVyZW5jZWRUeXBlcy5lbGVtZW50QXQoaSk7CiAJCWlmICghdHlwZS5pc0xvY2FsVHlwZSgpKQogCQkJcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKHR5cGUuaXNNZW1iZXJUeXBlKCkKIAkJCQk/IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGUucmVhZGFibGVOYW1lKCkpCiAJCQkJOiB0eXBlLmNvbXBvdW5kTmFtZSk7CiAJfQogCi0JaW50IHNpemUgPSBxdWFsaWZpZWRSZWZlcmVuY2VzLnNpemU7CisJaW50IHNpemUgPSB0aGlzLnF1YWxpZmllZFJlZmVyZW5jZXMuc2l6ZTsKIAljaGFyW11bXVtdIHF1YWxpZmllZFJlZnMgPSBuZXcgY2hhcltzaXplXVtdW107CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCXF1YWxpZmllZFJlZnNbaV0gPSBxdWFsaWZpZWRSZWZlcmVuY2VzLmVsZW1lbnRBdChpKTsKLQlyZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LnF1YWxpZmllZFJlZmVyZW5jZXMgPSBxdWFsaWZpZWRSZWZzOworCQlxdWFsaWZpZWRSZWZzW2ldID0gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VzLmVsZW1lbnRBdChpKTsKKwl0aGlzLnJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQucXVhbGlmaWVkUmVmZXJlbmNlcyA9IHF1YWxpZmllZFJlZnM7CiAKLQlzaXplID0gc2ltcGxlTmFtZVJlZmVyZW5jZXMuc2l6ZTsKKwlzaXplID0gdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcy5zaXplOwogCWNoYXJbXVtdIHNpbXBsZVJlZnMgPSBuZXcgY2hhcltzaXplXVtdOwogCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlzaW1wbGVSZWZzW2ldID0gc2ltcGxlTmFtZVJlZmVyZW5jZXMuZWxlbWVudEF0KGkpOwotCXJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXMgPSBzaW1wbGVSZWZzOworCQlzaW1wbGVSZWZzW2ldID0gdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcy5lbGVtZW50QXQoaSk7CisJdGhpcy5yZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LnNpbXBsZU5hbWVSZWZlcmVuY2VzID0gc2ltcGxlUmVmczsKKworCXNpemUgPSB0aGlzLnJvb3RSZWZlcmVuY2VzLnNpemU7CisJY2hhcltdW10gcm9vdFJlZnMgPSBuZXcgY2hhcltzaXplXVtdOworCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlyb290UmVmc1tpXSA9IHRoaXMucm9vdFJlZmVyZW5jZXMuZWxlbWVudEF0KGkpOworCXRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdC5yb290UmVmZXJlbmNlcyA9IHJvb3RSZWZzOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIi0tLSBDb21waWxhdGlvblVuaXQgU2NvcGUgOiAiICsgbmV3IFN0cmluZyhyZWZlcmVuY2VDb250ZXh0LmdldEZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuICItLS0gQ29tcGlsYXRpb25Vbml0IFNjb3BlIDogIiArIG5ldyBTdHJpbmcodGhpcy5yZWZlcmVuY2VDb250ZXh0LmdldEZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCiB9CiBwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmcgdHlwZVRvUmVjb3JkKFR5cGVCaW5kaW5nIHR5cGUpIHsKIAlpZiAodHlwZS5pc0FycmF5VHlwZSgpKQpAQCAtNzYwLDYgKzgyNiw3IEBACiAJCWNhc2UgQmluZGluZy5CQVNFX1RZUEUgOgogCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgogCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CiAJCQlyZXR1cm4gbnVsbDsKIAkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6CiAJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CkBAIC03NzAsNyArODM3LDcgQEAKIAlyZXR1cm4gcmVmVHlwZTsKIH0KIHB1YmxpYyB2b2lkIHZlcmlmeU1ldGhvZHMoTWV0aG9kVmVyaWZpZXIgdmVyaWZpZXIpIHsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJdG9wTGV2ZWxUeXBlc1tpXS52ZXJpZnlNZXRob2RzKHZlcmlmaWVyKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy50b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQl0aGlzLnRvcExldmVsVHlwZXNbaV0udmVyaWZ5TWV0aG9kcyh2ZXJpZmllcik7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0VsZW1lbnRWYWx1ZVBhaXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRWxlbWVudFZhbHVlUGFpci5qYXZhCmluZGV4IDNkNzI3NTkuLjVhNDY5ZDYgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRWxlbWVudFZhbHVlUGFpci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRWxlbWVudFZhbHVlUGFpci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwMCw0ICsxMDAsMTEgQEAKIAkvLyBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIGlmIGhvbGRpbmcgYW4gdW5yZXNvbHZlZCByZWYKIAl0aGlzLnZhbHVlID0gdmFsdWU7CiB9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMudmFsdWUpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRXh0cmFDb21waWxlck1vZGlmaWVycy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLmphdmEKaW5kZXggZGQxMmIyYS4uOTkyN2FhYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzI4MjgxIC0gdmlzaWJpbGl0eSBsZWFrcyBub3QgZGV0ZWN0ZWQgd2hlbiBhbmFseXppbmcgdW51c2VkIGZpZWxkIGluIHByaXZhdGUgY2xhc3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCkBAIC0yMCwyMCArMjEsMjMgQEAKIAogCS8vIGJpdDE3IC0gZnJlZQogCS8vIGJpdDE4IC0gdXNlIGJ5IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uRGVmYXVsdAotCWZpbmFsIGludCBBY2NSZXN0cmljdGVkQWNjZXNzID0gQVNUTm9kZS5CaXQxOTsgCi0JZmluYWwgaW50IEFjY0Zyb21DbGFzc0ZpbGUgPSBBU1ROb2RlLkJpdDIwOyAKLQlmaW5hbCBpbnQgQWNjRGVmYXVsdEFic3RyYWN0ID0gQVNUTm9kZS5CaXQyMDsgCisJZmluYWwgaW50IEFjY1Jlc3RyaWN0ZWRBY2Nlc3MgPSBBU1ROb2RlLkJpdDE5OworCWZpbmFsIGludCBBY2NGcm9tQ2xhc3NGaWxlID0gQVNUTm9kZS5CaXQyMDsKKwlmaW5hbCBpbnQgQWNjRGVmYXVsdEFic3RyYWN0ID0gQVNUTm9kZS5CaXQyMDsKIAkvLyBiaXQyMSAtIHVzZSBieSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZAogCWZpbmFsIGludCBBY2NEZXByZWNhdGVkSW1wbGljaXRseSA9IEFTVE5vZGUuQml0MjI7IC8vIHJlY29yZCB3aGV0aGVyIGRlcHJlY2F0ZWQgaXRzZWxmIG9yIGNvbnRhaW5lZCBieSBhIGRlcHJlY2F0ZWQgdHlwZQotCWZpbmFsIGludCBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gPSBBU1ROb2RlLkJpdDIzOyAKLQlmaW5hbCBpbnQgQWNjTW9kaWZpZXJQcm9ibGVtID0gQVNUTm9kZS5CaXQyNDsgCi0JZmluYWwgaW50IEFjY1NlbWljb2xvbkJvZHkgPSBBU1ROb2RlLkJpdDI1OyAKLQlmaW5hbCBpbnQgQWNjVW5yZXNvbHZlZCA9IEFTVE5vZGUuQml0MjY7IAorCWZpbmFsIGludCBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gPSBBU1ROb2RlLkJpdDIzOworCWZpbmFsIGludCBBY2NNb2RpZmllclByb2JsZW0gPSBBU1ROb2RlLkJpdDI0OworCWZpbmFsIGludCBBY2NTZW1pY29sb25Cb2R5ID0gQVNUTm9kZS5CaXQyNTsKKwlmaW5hbCBpbnQgQWNjVW5yZXNvbHZlZCA9IEFTVE5vZGUuQml0MjY7CiAJZmluYWwgaW50IEFjY0JsYW5rRmluYWwgPSBBU1ROb2RlLkJpdDI3OyAvLyBmb3IgYmxhbmsgZmluYWwgdmFyaWFibGVzCiAJZmluYWwgaW50IEFjY0lzRGVmYXVsdENvbnN0cnVjdG9yID0gQVNUTm9kZS5CaXQyNzsgLy8gZm9yIGRlZmF1bHQgY29uc3RydWN0b3IKLQlmaW5hbCBpbnQgQWNjTG9jYWxseVVzZWQgPSBBU1ROb2RlLkJpdDI4OyAvLyB1c2VkIHRvIGRpYWdub3NlIHVudXNlZCBwcml2YXRlL2xvY2FsIG1lbWJlcnMKKwlmaW5hbCBpbnQgQWNjTG9jYWxseVVzZWQgPSBBU1ROb2RlLkJpdDI4OyAvLyB1c2VkIHRvIGRpYWdub3NlIHVudXNlZCAoYSkgcHJpdmF0ZS9sb2NhbCBtZW1iZXJzIG9yIChiKSBtZW1iZXJzIG9mIHByaXZhdGUgY2xhc3NlcworCQkJCQkJCQkJCQkgIC8vIGdlbmVyYWxseSBzZXQgd2hlbiBhY3R1YWwgdXNhZ2UgaGFzIGJlZW4gZGV0ZWN0ZWQgCisJCQkJCQkJCQkJCSAgLy8gb3IsIChiKSB3aGVuIG1lbWJlciBvZiBhIHByaXZhdGUgY2xhc3MgaXMgZXhwb3NlZCB2aWEgYSBub24tcHJpdmF0ZSBzdWJjbGFzcworCQkJCQkJCQkJCQkgIC8vICAgICBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODI4MQogCWZpbmFsIGludCBBY2NWaXNpYmlsaXR5TUFTSyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7Ci0JCisKIAlmaW5hbCBpbnQgQWNjT3ZlcnJpZGluZyA9IEFTVE5vZGUuQml0Mjk7IC8vIHJlY29yZCBmYWN0IGEgbWV0aG9kIG92ZXJyaWRlcyBhbm90aGVyIG9uZQogCWZpbmFsIGludCBBY2NJbXBsZW1lbnRpbmcgPSBBU1ROb2RlLkJpdDMwOyAvLyByZWNvcmQgZmFjdCBhIG1ldGhvZCBpbXBsZW1lbnRzIGFub3RoZXIgb25lIChpdCBpcyBjb25jcmV0ZSBhbmQgb3ZlcnJpZGVzIGFuIGFic3RyYWN0IG9uZSkKIAlmaW5hbCBpbnQgQWNjR2VuZXJpY1NpZ25hdHVyZSA9IEFTVE5vZGUuQml0MzE7IC8vIHJlY29yZCBmYWN0IGEgdHlwZS9tZXRob2QvZmllbGQgaW52b2x2ZXMgZ2VuZXJpY3MgaW4gaXRzIHNpZ25hdHVyZSAoYW5kIG5lZWQgc3BlY2lhbCBzaWduYXR1cmUgYXR0cikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRmllbGRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ZpZWxkQmluZGluZy5qYXZhCmluZGV4IDI4MmVmNjEuLjJjNDRkNWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRmllbGRCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9GaWVsZEJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxODU2ODIgLSBJbmNyZW1lbnQvZGVjcmVtZW50IG9wZXJhdG9ycyBtYXJrIGxvY2FsIHZhcmlhYmxlcyBhcyByZWFkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIApAQCAtMTksNiArMjAsOCBAQAogCiBwdWJsaWMgY2xhc3MgRmllbGRCaW5kaW5nIGV4dGVuZHMgVmFyaWFibGVCaW5kaW5nIHsKIAlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzczsKKwlwdWJsaWMgaW50IGNvbXBvdW5kVXNlRmxhZyA9IDA7IC8vIG51bWJlciBvciBhY2Nlc3NlcyB2aWEgcG9zdEluY3JlbWVudCBvciBjb21wb3VuZEFzc2lnbm1lbnQKKwkKIHByb3RlY3RlZCBGaWVsZEJpbmRpbmcoKSB7CiAJc3VwZXIobnVsbCwgbnVsbCwgMCwgbnVsbCk7CiAJLy8gZm9yIGNyZWF0aW5nIHByb2JsZW0gZmllbGQKQEAgLTI3LDEwICszMCw2IEBACiAJc3VwZXIobmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBjb25zdGFudCk7CiAJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwogfQotcHVibGljIEZpZWxkQmluZGluZyhGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBUeXBlQmluZGluZyB0eXBlLCBpbnQgbW9kaWZpZXJzLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7Ci0JdGhpcyhmaWVsZC5uYW1lLCB0eXBlLCBtb2RpZmllcnMsIGRlY2xhcmluZ0NsYXNzLCBudWxsKTsKLQlmaWVsZC5iaW5kaW5nID0gdGhpczsgLy8gcmVjb3JkIGJpbmRpbmcgaW4gZGVjbGFyYXRpb24KLX0KIC8vIHNwZWNpYWwgQVBJIHVzZWQgdG8gY2hhbmdlIGZpZWxkIGRlY2xhcmluZyBjbGFzcyBmb3IgcnVudGltZSB2aXNpYmlsaXR5IGNoZWNrCiBwdWJsaWMgRmllbGRCaW5kaW5nKEZpZWxkQmluZGluZyBpbml0aWFsRmllbGRCaW5kaW5nLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7CiAJc3VwZXIoaW5pdGlhbEZpZWxkQmluZGluZy5uYW1lLCBpbml0aWFsRmllbGRCaW5kaW5nLnR5cGUsIGluaXRpYWxGaWVsZEJpbmRpbmcubW9kaWZpZXJzLCBpbml0aWFsRmllbGRCaW5kaW5nLmNvbnN0YW50KCkpOwpAQCAtNDEsMTkgKzQwLDE3IEBACiAvKiBBUEkKICogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgogKi8KLQotcHVibGljIGZpbmFsIGludCBraW5kKCkgewotCXJldHVybiBGSUVMRDsKK3B1YmxpYyBGaWVsZEJpbmRpbmcoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCXRoaXMoZmllbGQubmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBkZWNsYXJpbmdDbGFzcywgbnVsbCk7CisJZmllbGQuYmluZGluZyA9IHRoaXM7IC8vIHJlY29yZCBiaW5kaW5nIGluIGRlY2xhcmF0aW9uCiB9Ci0vKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgaW52b2NhdGlvblBhY2thZ2UuCi0qLwogCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShQYWNrYWdlQmluZGluZyBpbnZvY2F0aW9uUGFja2FnZSkgewogCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKIAlpZiAoaXNQcml2YXRlKCkpIHJldHVybiBmYWxzZTsKIAogCS8vIGlzUHJvdGVjdGVkKCkgb3IgaXNEZWZhdWx0KCkKLQlyZXR1cm4gaW52b2NhdGlvblBhY2thZ2UgPT0gZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpOworCXJldHVybiBpbnZvY2F0aW9uUGFja2FnZSA9PSB0aGlzLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKTsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSB0eXBlIHByb3ZpZGVkIGJ5IHRoZSBzY29wZS4KICogSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cyBpc1N1cGVyQWNjZXNzKCkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC02NiwxMCArNjMsMTAgQEAKIAlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CiAKIAlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgJiYgaW52b2NhdGlvblR5cGUgPT0gcmVjZWl2ZXJUeXBlKSByZXR1cm4gdHJ1ZTsKKwlpZiAoaW52b2NhdGlvblR5cGUgPT0gdGhpcy5kZWNsYXJpbmdDbGFzcyAmJiBpbnZvY2F0aW9uVHlwZSA9PSByZWNlaXZlclR5cGUpIHJldHVybiB0cnVlOwogCiAJaWYgKGludm9jYXRpb25UeXBlID09IG51bGwpIC8vIHN0YXRpYyBpbXBvcnQgY2FsbAotCQlyZXR1cm4gIWlzUHJpdmF0ZSgpICYmIHNjb3BlLmdldEN1cnJlbnRQYWNrYWdlKCkgPT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJCXJldHVybiAhaXNQcml2YXRlKCkgJiYgc2NvcGUuZ2V0Q3VycmVudFBhY2thZ2UoKSA9PSB0aGlzLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlOwogCiAJaWYgKGlzUHJvdGVjdGVkKCkpIHsKIAkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIGludm9jYXRpb25UeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcyBvciB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlCkBAIC03NywxNSArNzQsMTUgQEAKIAkJLy8gICAgQU5EIHRoZSByZWNlaXZlclR5cGUgaXMgdGhlIGludm9jYXRpb25UeXBlIG9yIGl0cyBzdWJjbGFzcwogCQkvLyAgICBPUiB0aGUgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQogCQkvLyAgICBPUiBwcmV2aW91cyBhc3NlcnRpb25zIGFyZSB0cnVlIGZvciBvbmUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCi0JCWlmIChpbnZvY2F0aW9uVHlwZSA9PSBkZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7Ci0JCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisJCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzLmRlY2xhcmluZ0NsYXNzKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IHRoaXMuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UpIHJldHVybiB0cnVlOwogCiAJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBpbnZvY2F0aW9uVHlwZTsKIAkJaW50IGRlcHRoID0gMDsKIAkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlckVyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUuZXJhc3VyZSgpOwotCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0VyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpOworCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0VyYXN1cmUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CiAJCWRvIHsKLQkJCWlmIChjdXJyZW50VHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGRlY2xhcmluZ0VyYXN1cmUpICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50VHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGRlY2xhcmluZ0VyYXN1cmUpICE9IG51bGwpIHsKIAkJCQlpZiAoaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkvLyByZWNlaXZlclR5cGUgY2FuIGJlIGFuIGFycmF5IGJpbmRpbmcgaW4gb25lIGNhc2UuLi4gc2VlIGlmIHlvdSBjYW4gY2hhbmdlIGl0CkBAIC05NSw3ICs5Miw3IEBACiAJCQkJCWlmIChkZXB0aCA+IDApIGludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKIAkJCQkJcmV0dXJuIHRydWU7IC8vIHNlZSAxRk1FUERMIC0gcmV0dXJuIGludm9jYXRpb25TaXRlLmlzVHlwZUFjY2VzcygpOwogCQkJCX0KLQkJCQlpZiAoY3VycmVudFR5cGUgPT0gcmVjZWl2ZXJFcmFzdXJlIHx8IHJlY2VpdmVyRXJhc3VyZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGN1cnJlbnRUeXBlKSAhPSBudWxsKSB7CisJCQkJaWYgKGN1cnJlbnRUeXBlID09IHJlY2VpdmVyRXJhc3VyZSB8fCByZWNlaXZlckVyYXN1cmUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShjdXJyZW50VHlwZSkgIT0gbnVsbCkgewogCQkJCQlpZiAoZGVwdGggPiAwKSBpbnZvY2F0aW9uU2l0ZS5zZXREZXB0aChkZXB0aCk7CiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KQEAgLTExMCwxNSArMTA3LDE1IEBACiAJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlclR5cGUgaXMgdGhlIGRlY2xhcmluZ0NsYXNzCiAJCS8vIEFORCB0aGUgaW52b2NhdGlvblR5cGUgYW5kIHRoZSBkZWNsYXJpbmdDbGFzcyBoYXZlIGEgY29tbW9uIGVuY2xvc2luZ1R5cGUKIAkJcmVjZWl2ZXJDaGVjazogewotCQkJaWYgKHJlY2VpdmVyVHlwZSAhPSBkZWNsYXJpbmdDbGFzcykgewotCQkJCS8vIHNwZWNpYWwgdG9sZXJhbmNlIGZvciB0eXBlIHZhcmlhYmxlIGRpcmVjdCBib3VuZHMKLQkJCQlpZiAocmVjZWl2ZXJUeXBlLmlzVHlwZVZhcmlhYmxlKCkgJiYgKChUeXBlVmFyaWFibGVCaW5kaW5nKSByZWNlaXZlclR5cGUpLmlzRXJhc3VyZUJvdW5kVG8oZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpKSkKKwkJCWlmIChyZWNlaXZlclR5cGUgIT0gdGhpcy5kZWNsYXJpbmdDbGFzcykgeworCQkJCS8vIHNwZWNpYWwgdG9sZXJhbmNlIGZvciB0eXBlIHZhcmlhYmxlIGRpcmVjdCBib3VuZHMsIGJ1dCBvbmx5IGlmIGNvbXBsaWFuY2UgPD0gMS42LCBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ2MjIKKwkJCQlpZiAoc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYgJiYgcmVjZWl2ZXJUeXBlLmlzVHlwZVZhcmlhYmxlKCkgJiYgKChUeXBlVmFyaWFibGVCaW5kaW5nKSByZWNlaXZlclR5cGUpLmlzRXJhc3VyZUJvdW5kVG8odGhpcy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpKQogCQkJCQlicmVhayByZWNlaXZlckNoZWNrOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJfQogCi0JCWlmIChpbnZvY2F0aW9uVHlwZSAhPSBkZWNsYXJpbmdDbGFzcykgeworCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gdGhpcy5kZWNsYXJpbmdDbGFzcykgewogCQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckludm9jYXRpb25UeXBlID0gaW52b2NhdGlvblR5cGU7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIHRlbXAgPSBvdXRlckludm9jYXRpb25UeXBlLmVuY2xvc2luZ1R5cGUoKTsKIAkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKQEAgLTEyNiw3ICsxMjMsNyBAQAogCQkJCXRlbXAgPSB0ZW1wLmVuY2xvc2luZ1R5cGUoKTsKIAkJCX0KIAotCQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKIAkJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKIAkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKIAkJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKQEAgLTEzOCw0MCArMTM1LDQ2IEBACiAJfQogCiAJLy8gaXNEZWZhdWx0KCkKLQlQYWNrYWdlQmluZGluZyBkZWNsYXJpbmdQYWNrYWdlID0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJUGFja2FnZUJpbmRpbmcgZGVjbGFyaW5nUGFja2FnZSA9IHRoaXMuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CiAJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlICE9IGRlY2xhcmluZ1BhY2thZ2UpIHJldHVybiBmYWxzZTsKIAogCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKIAlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKQogCQlyZXR1cm4gZmFsc2U7CisJVHlwZUJpbmRpbmcgb3JpZ2luYWxEZWNsYXJpbmdDbGFzcyA9IHRoaXMuZGVjbGFyaW5nQ2xhc3Mub3JpZ2luYWwoKTsKIAlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKIAlkbyB7Ci0JCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50VHlwZSkgcmV0dXJuIHRydWU7CisJCWlmIChjdXJyZW50VHlwZS5pc0NhcHR1cmUoKSkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1MDAyCisJCQlpZiAob3JpZ2luYWxEZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50VHlwZS5lcmFzdXJlKCkub3JpZ2luYWwoKSkgcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQlpZiAob3JpZ2luYWxEZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50VHlwZS5vcmlnaW5hbCgpKSByZXR1cm4gdHJ1ZTsKKwkJfQogCQlQYWNrYWdlQmluZGluZyBjdXJyZW50UGFja2FnZSA9IGN1cnJlbnRUeXBlLmZQYWNrYWdlOwogCQkvLyBwYWNrYWdlIGNvdWxkIGJlIG51bGwgZm9yIHdpbGRjYXJkcy9pbnRlcnNlY3Rpb24gdHlwZXMsIGlnbm9yZSBhbmQgcmVjdXJzZSBpbiBzdXBlcmNsYXNzCiAJCWlmIChjdXJyZW50UGFja2FnZSAhPSBudWxsICYmIGN1cnJlbnRQYWNrYWdlICE9IGRlY2xhcmluZ1BhY2thZ2UpIHJldHVybiBmYWxzZTsKIAl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBmYWxzZTsKIH0KKwogLyoKICAqIGRlY2xhcmluZ1VuaXF1ZUtleSBkb3QgZmllbGROYW1lICkgcmV0dXJuVHlwZVVuaXF1ZUtleQogICogcC5YIHsgWDxUPiB4fSAtLT4gTHAvWDsueClwL1g8VFQ7PjsKICAqLwogcHVibGljIGNoYXJbXSBjb21wdXRlVW5pcXVlS2V5KGJvb2xlYW4gaXNMZWFmKSB7CiAJLy8gZGVjbGFyaW5nIGtleQotCWNoYXJbXSBkZWNsYXJpbmdLZXkgPSAKLQkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsIC8qY2FzZSBvZiBsZW5ndGggZmllbGQgZm9yIGFuIGFycmF5Ki8gCi0JCQk/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiAKKwljaGFyW10gZGVjbGFyaW5nS2V5ID0KKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsIC8qY2FzZSBvZiBsZW5ndGggZmllbGQgZm9yIGFuIGFycmF5Ki8KKwkJCT8gQ2hhck9wZXJhdGlvbi5OT19DSEFSCiAJCQk6IHRoaXMuZGVjbGFyaW5nQ2xhc3MuY29tcHV0ZVVuaXF1ZUtleShmYWxzZS8qbm90IGEgbGVhZiovKTsKIAlpbnQgZGVjbGFyaW5nTGVuZ3RoID0gZGVjbGFyaW5nS2V5Lmxlbmd0aDsKLQkKKwogCS8vIG5hbWUKIAlpbnQgbmFtZUxlbmd0aCA9IHRoaXMubmFtZS5sZW5ndGg7Ci0JCisKIAkvLyByZXR1cm4gdHlwZQogCWNoYXJbXSByZXR1cm5UeXBlS2V5ID0gdGhpcy50eXBlID09IG51bGwgPyBuZXcgY2hhcltdIHsnVid9IDogdGhpcy50eXBlLmNvbXB1dGVVbmlxdWVLZXkoZmFsc2UvKm5vdCBhIGxlYWYqLyk7CiAJaW50IHJldHVyblR5cGVMZW5ndGggPSByZXR1cm5UeXBlS2V5Lmxlbmd0aDsKLQkKKwogCWNoYXJbXSB1bmlxdWVLZXkgPSBuZXcgY2hhcltkZWNsYXJpbmdMZW5ndGggKyAxICsgbmFtZUxlbmd0aCArIDEgKyByZXR1cm5UeXBlTGVuZ3RoXTsKIAlpbnQgaW5kZXggPSAwOwogCVN5c3RlbS5hcnJheWNvcHkoZGVjbGFyaW5nS2V5LCAwLCB1bmlxdWVLZXksIGluZGV4LCBkZWNsYXJpbmdMZW5ndGgpOwpAQCAtMTgzLDI4ICsxODYsMzIgQEAKIAlTeXN0ZW0uYXJyYXljb3B5KHJldHVyblR5cGVLZXksIDAsIHVuaXF1ZUtleSwgaW5kZXgsIHJldHVyblR5cGVMZW5ndGgpOwogCXJldHVybiB1bmlxdWVLZXk7CiB9Ci0KIHB1YmxpYyBDb25zdGFudCBjb25zdGFudCgpIHsKIAlDb25zdGFudCBmaWVsZENvbnN0YW50ID0gdGhpcy5jb25zdGFudDsKIAlpZiAoZmllbGRDb25zdGFudCA9PSBudWxsKSB7Ci0JCWlmICh0aGlzLmlzRmluYWwoKSkgeworCQlpZiAoaXNGaW5hbCgpKSB7CiAJCQkvL1RoZSBmaWVsZCBoYXMgbm90IGJlZW4geWV0IHR5cGUgY2hlY2tlZC4KIAkJCS8vSXQgYWxzbyBtZWFucyB0aGF0IHRoZSBmaWVsZCBpcyBub3QgY29taW5nIGZyb20gYSBjbGFzcyB0aGF0CiAJCQkvL2hhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQuIEl0IGNhbiBvbmx5IGJlIGZyb20gYSBjbGFzcyB3aXRoaW4KIAkJCS8vY29tcGlsYXRpb24gdW5pdHMgdG8gcHJvY2Vzcy4gVGh1cyB0aGUgZmllbGQgaXMgTk9UIGZyb20gYSBCaW5hcnlUeXBlQmluYmluZwotCQkJRmllbGRCaW5kaW5nIG9yaWdpbmFsRmllbGQgPSB0aGlzLm9yaWdpbmFsKCk7CisJCQlGaWVsZEJpbmRpbmcgb3JpZ2luYWxGaWVsZCA9IG9yaWdpbmFsKCk7CiAJCQlpZiAob3JpZ2luYWxGaWVsZC5kZWNsYXJpbmdDbGFzcyBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nKSB7CiAJCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgb3JpZ2luYWxGaWVsZC5kZWNsYXJpbmdDbGFzczsKIAkJCQlpZiAoc291cmNlVHlwZS5zY29wZSAhPSBudWxsKSB7CiAJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKIAkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSB0eXBlRGVjbC5kZWNsYXJhdGlvbk9mKG9yaWdpbmFsRmllbGQpOwotCQkJCQlmaWVsZERlY2wucmVzb2x2ZShvcmlnaW5hbEZpZWxkLmlzU3RhdGljKCkgLy9zaWRlIGVmZmVjdCBvbiBiaW5kaW5nIAotCQkJCQkJCT8gdHlwZURlY2wuc3RhdGljSW5pdGlhbGl6ZXJTY29wZQotCQkJCQkJCTogdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZSk7Ci0JCQkJCWZpZWxkQ29uc3RhbnQgPSBvcmlnaW5hbEZpZWxkLmNvbnN0YW50KCk7CisJCQkJCU1ldGhvZFNjb3BlIGluaXRTY29wZSA9IG9yaWdpbmFsRmllbGQuaXNTdGF0aWMoKSA/IHR5cGVEZWNsLnN0YXRpY0luaXRpYWxpemVyU2NvcGUgOiB0eXBlRGVjbC5pbml0aWFsaXplclNjb3BlOworCQkJCQlib29sZWFuIG9sZCA9IGluaXRTY29wZS5pbnNpZGVUeXBlQW5ub3RhdGlvbjsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluaXRTY29wZS5pbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOworCQkJCQkJZmllbGREZWNsLnJlc29sdmUoaW5pdFNjb3BlKTsgLy9zaWRlIGVmZmVjdCBvbiBiaW5kaW5nCisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlpbml0U2NvcGUuaW5zaWRlVHlwZUFubm90YXRpb24gPSBvbGQ7CisJCQkJCX0KKwkJCQkJZmllbGRDb25zdGFudCA9IG9yaWdpbmFsRmllbGQuY29uc3RhbnQgPT0gbnVsbCA/IENvbnN0YW50Lk5vdEFDb25zdGFudCA6IG9yaWdpbmFsRmllbGQuY29uc3RhbnQ7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZmllbGRDb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsgLy8gc2hvdWxkbid0IG9jY3VyIHBlciBjb25zdHJ1Y3Rpb24gKHBhcmFub2lkIG51bGwgY2hlY2spCi0JCQkJfSAKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWZpZWxkQ29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7IC8vIHNob3VsZG4ndCBvY2N1ciBwZXIgY29uc3RydWN0aW9uIChwYXJhbm9pZCBudWxsIGNoZWNrKQogCQkJfQpAQCAtMjE1LDYgKzIyMiw3IEBACiAJfQogCXJldHVybiBmaWVsZENvbnN0YW50OwogfQorCiAvKioKICAqIFg8VD4gdCAgIC0tPiAgTFg8VFQ7PjsKICAqLwpAQCAtMjIyLDkgKzIzMCwxNyBAQAogICAgIGlmICgodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpID09IDApIHJldHVybiBudWxsOwogICAgIHJldHVybiB0aGlzLnR5cGUuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKIH0KLQogcHVibGljIGZpbmFsIGludCBnZXRBY2Nlc3NGbGFncygpIHsKLQlyZXR1cm4gbW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwlyZXR1cm4gdGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworfQorCitwdWJsaWMgQW5ub3RhdGlvbkJpbmRpbmdbXSBnZXRBbm5vdGF0aW9ucygpIHsKKwlGaWVsZEJpbmRpbmcgb3JpZ2luYWxGaWVsZCA9IG9yaWdpbmFsKCk7CisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPSBvcmlnaW5hbEZpZWxkLmRlY2xhcmluZ0NsYXNzOworCWlmIChkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPT0gbnVsbCkgeworCQlyZXR1cm4gQmluZGluZy5OT19BTk5PVEFUSU9OUzsKKwl9CisJcmV0dXJuIGRlY2xhcmluZ0NsYXNzQmluZGluZy5yZXRyaWV2ZUFubm90YXRpb25zKG9yaWdpbmFsRmllbGQpOwogfQogCiAvKioKQEAgLTIzMyw3ICsyNDksNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmcjZ2V0QW5ub3RhdGlvblRhZ0JpdHMoKQogICovCiBwdWJsaWMgbG9uZyBnZXRBbm5vdGF0aW9uVGFnQml0cygpIHsKLQlGaWVsZEJpbmRpbmcgb3JpZ2luYWxGaWVsZCA9IHRoaXMub3JpZ2luYWwoKTsKKwlGaWVsZEJpbmRpbmcgb3JpZ2luYWxGaWVsZCA9IG9yaWdpbmFsKCk7CiAJaWYgKChvcmlnaW5hbEZpZWxkLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCkgPT0gMCAmJiBvcmlnaW5hbEZpZWxkLmRlY2xhcmluZ0NsYXNzIGluc3RhbmNlb2YgU291cmNlVHlwZUJpbmRpbmcpIHsKIAkJQ2xhc3NTY29wZSBzY29wZSA9ICgoU291cmNlVHlwZUJpbmRpbmcpIG9yaWdpbmFsRmllbGQuZGVjbGFyaW5nQ2xhc3MpLnNjb3BlOwogCQlpZiAoc2NvcGUgPT0gbnVsbCkgeyAvLyBzeW50aGV0aWMgZmllbGRzIGRvIG5vdCBoYXZlIGEgc2NvcGUgbm9yIGFueSBhbm5vdGF0aW9ucwpAQCAtMjQ1LDcgKzI2MSw3IEBACiAJCWlmIChmaWVsZERlY2wgIT0gbnVsbCkgewogCQkJTWV0aG9kU2NvcGUgaW5pdGlhbGl6YXRpb25TY29wZSA9IGlzU3RhdGljKCkgPyB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlIDogdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKIAkJCUZpZWxkQmluZGluZyBwcmV2aW91c0ZpZWxkID0gaW5pdGlhbGl6YXRpb25TY29wZS5pbml0aWFsaXplZEZpZWxkOwotCQkJaW50IHByZXZpb3VzRmllbGRJRCA9IGluaXRpYWxpemF0aW9uU2NvcGUubGFzdFZpc2libGVGaWVsZElEOwkJCQorCQkJaW50IHByZXZpb3VzRmllbGRJRCA9IGluaXRpYWxpemF0aW9uU2NvcGUubGFzdFZpc2libGVGaWVsZElEOwogCQkJdHJ5IHsKIAkJCQlpbml0aWFsaXphdGlvblNjb3BlLmluaXRpYWxpemVkRmllbGQgPSBvcmlnaW5hbEZpZWxkOwogCQkJCWluaXRpYWxpemF0aW9uU2NvcGUubGFzdFZpc2libGVGaWVsZElEID0gb3JpZ2luYWxGaWVsZC5pZDsKQEAgLTI1OSw4MSArMjc1LDkyIEBACiAJcmV0dXJuIG9yaWdpbmFsRmllbGQudGFnQml0czsKIH0KIAotcHVibGljIEFubm90YXRpb25CaW5kaW5nW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JRmllbGRCaW5kaW5nIG9yaWdpbmFsRmllbGQgPSB0aGlzLm9yaWdpbmFsKCk7Ci0JUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPSBvcmlnaW5hbEZpZWxkLmRlY2xhcmluZ0NsYXNzOwotCWlmIChkZWNsYXJpbmdDbGFzc0JpbmRpbmcgPT0gbnVsbCkgewotCQlyZXR1cm4gQmluZGluZy5OT19BTk5PVEFUSU9OUzsKLQl9CQotCXJldHVybiBkZWNsYXJpbmdDbGFzc0JpbmRpbmcucmV0cmlldmVBbm5vdGF0aW9ucyhvcmlnaW5hbEZpZWxkKTsKLX0KLQotLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBkZWZhdWx0IHZpc2liaWxpdHkKLSovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdCgpIHsKIAlyZXR1cm4gIWlzUHVibGljKCkgJiYgIWlzUHJvdGVjdGVkKCkgJiYgIWlzUHJpdmF0ZSgpOwogfQogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgZGVwcmVjYXRlZCBmaWVsZAogKi8KIAorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBkZWZhdWx0IHZpc2liaWxpdHkKKyovCisKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCkgIT0gMDsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJpdmF0ZSB2aXNpYmlsaXR5CiAqLwogCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaXZhdGUoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eSBvciBpcyBlbmNsb3NlZCBieSBhIGNsYXNzIHRoYXQgZG9lcy4KKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSB7CisJaWYgKCh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gdGhpcy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmIHRoaXMuZGVjbGFyaW5nQ2xhc3MuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpOwogfQogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcml2YXRlIHZpc2liaWxpdHkgYW5kIGlzIHVzZWQgbG9jYWxseQogKi8KIAotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNVc2VkKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZCkgIT0gMDsKLX0KLS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJvdGVjdGVkIHZpc2liaWxpdHkKLSovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJvdGVjdGVkKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgIT0gMDsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHVibGljIHZpc2liaWxpdHkKICovCiAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHVibGljKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgIT0gMDsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHN0YXRpYyBmaWVsZAogKi8KIAogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwOwogfQogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzb3VyY2Ugb2YgdGhlIGRlY2xhcmluZ0NsYXNzCiAqLwogCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICE9IDA7CisJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICE9IDA7CiB9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0cmFuc2llbnQgZmllbGQKICovCiAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1RyYW5zaWVudCkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1RyYW5zaWVudCkgIT0gMDsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlcidzIGRlY2xhcmluZyB0eXBlIGlzIGRlcHJlY2F0ZWQgKG9yIGFueSBvZiBpdHMgZW5jbG9zaW5nIHR5cGVzKQogKi8KIAorcHVibGljIGZpbmFsIGJvb2xlYW4gaXNVc2VkKCkgeworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkKSAhPSAwIHx8IHRoaXMuY29tcG91bmRVc2VGbGFnID4gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSBvbmx5IHVzZSBvZiB0aGlzIGZpZWxkIGlzIGluIGNvbXBvdW5kIGFzc2lnbm1lbnQgb3IgcG9zdCBpbmNyZW1lbnQKKyAqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1VzZWRPbmx5SW5Db21wb3VuZCgpIHsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZCkgPT0gMCAmJiB0aGlzLmNvbXBvdW5kVXNlRmxhZyA+IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CisqLworCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZpZXdlZEFzRGVwcmVjYXRlZCgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkpKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5KSkgIT0gMDsKIH0KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHZvbGF0aWxlIGZpZWxkCiAqLwogCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZvbGF0aWxlKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ZvbGF0aWxlKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVm9sYXRpbGUpICE9IDA7CiB9CisKK3B1YmxpYyBmaW5hbCBpbnQga2luZCgpIHsKKwlyZXR1cm4gRklFTEQ7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgaW52b2NhdGlvblBhY2thZ2UuCisqLwogLyoqCiAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBmaWVsZCAoYXMgb3Bwb3NlZCB0byBwYXJhbWV0ZXJpemVkIGluc3RhbmNlcykKICAqLwpAQCAtMzQ2LDkgKzM3Myw5IEBACiBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBzb3VyY2VGaWVsZCgpIHsKIAlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlOwogCXRyeSB7Ci0JCXNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCQlzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSB0aGlzLmRlY2xhcmluZ0NsYXNzOwogCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwkJCisJCXJldHVybiBudWxsOwogCX0KIAogCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOwpAQCAtMzU3LDYgKzM4NCw2IEBACiAJCQlpZiAodGhpcyA9PSBmaWVsZHNbaV0uYmluZGluZykKIAkJCQlyZXR1cm4gZmllbGRzW2ldOwogCX0KLQlyZXR1cm4gbnVsbDsJCQorCXJldHVybiBudWxsOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbXBvcnRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YQppbmRleCBjOTdjYTNlLi4xZDEwNzNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw3ICsxOSw3IEBACiAJcHVibGljIEltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2U7CiAKIAlwdWJsaWMgQmluZGluZyByZXNvbHZlZEltcG9ydDsgLy8gbXVzdCBlbnN1cmUgdGhlIGltcG9ydCBpcyByZXNvbHZlZAotCQorCiBwdWJsaWMgSW1wb3J0QmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIGJvb2xlYW4gaXNPbkRlbWFuZCwgQmluZGluZyBiaW5kaW5nLCBJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CiAJdGhpcy5vbkRlbWFuZCA9IGlzT25EZW1hbmQ7CkBAIC0zNywxMCArMzcsMTAgQEAKIAlyZXR1cm4gdGhpcy5yZWZlcmVuY2UgIT0gbnVsbCAmJiB0aGlzLnJlZmVyZW5jZS5pc1N0YXRpYygpOwogfQogcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSB7Ci0JaWYgKG9uRGVtYW5kKQotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKSwgIi4qIi50b0NoYXJBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLm9uRGVtYW5kKQorCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuY29tcG91bmROYW1lLCAnLicpLCAiLioiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCiAJZWxzZQotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmNvbXBvdW5kTmFtZSwgJy4nKTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuICJpbXBvcnQgOiAiICsgbmV3IFN0cmluZyhyZWFkYWJsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0Q29uZmxpY3RCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydENvbmZsaWN0QmluZGluZy5qYXZhCmluZGV4IDU0MDliNDEuLjIxMjEzYTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0Q29uZmxpY3RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbXBvcnRDb25mbGljdEJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxMyArMTUsMTMgQEAKIAogcHVibGljIGNsYXNzIEltcG9ydENvbmZsaWN0QmluZGluZyBleHRlbmRzIEltcG9ydEJpbmRpbmcgewogcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgY29uZmxpY3RpbmdUeXBlQmluZGluZzsgLy8gbXVzdCBlbnN1cmUgdGhlIGltcG9ydCBpcyByZXNvbHZlZAotCQorCiBwdWJsaWMgSW1wb3J0Q29uZmxpY3RCaW5kaW5nKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgQmluZGluZyBtZXRob2RCaW5kaW5nLCBSZWZlcmVuY2VCaW5kaW5nIGNvbmZsaWN0aW5nVHlwZUJpbmRpbmcsIEltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKIAlzdXBlcihjb21wb3VuZE5hbWUsIGZhbHNlLCBtZXRob2RCaW5kaW5nLCByZWZlcmVuY2UpOwogCXRoaXMuY29uZmxpY3RpbmdUeXBlQmluZGluZyA9IGNvbmZsaWN0aW5nVHlwZUJpbmRpbmc7CiB9CiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuY29tcG91bmROYW1lLCAnLicpOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlyZXR1cm4gIm1ldGhvZCBpbXBvcnQgOiAiICsgbmV3IFN0cmluZyhyZWFkYWJsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW5mZXJlbmNlQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbmZlcmVuY2VDb250ZXh0LmphdmEKaW5kZXggOWFhMDUwOS4uZjBlMDNiZiAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbmZlcmVuY2VDb250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbmZlcmVuY2VDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTcgKzE0LDE3IEBACiAgKiBDb250ZXh0IHVzZWQgZHVyaW5nIHR5cGUgaW5mZXJlbmNlIGZvciBhIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24KICAqLwogcHVibGljIGNsYXNzIEluZmVyZW5jZUNvbnRleHQgewotCQorCiAJcHJpdmF0ZSBUeXBlQmluZGluZ1tdW11bXSBjb2xsZWN0ZWRTdWJzdGl0dXRlczsKIAlNZXRob2RCaW5kaW5nIGdlbmVyaWNNZXRob2Q7CiAJaW50IGRlcHRoOwogCWludCBzdGF0dXM7CiAJVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlOwogCWJvb2xlYW4gaGFzRXhwbGljaXRFeHBlY3RlZFR5cGU7IC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHBlY3RlZFR5cGUgKGlmIHNldCkgd2FzIGV4cGxpY2l0IGluIGNvZGUsIG9yIHNldCBieSBkZWZhdWx0CisgICAgcHVibGljIGJvb2xlYW4gaXNVbmNoZWNrZWQ7CiAJVHlwZUJpbmRpbmdbXSBzdWJzdGl0dXRlczsKIAlmaW5hbCBzdGF0aWMgaW50IEZBSUxFRCA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBSQVdfU1VCU1RJVFVUSU9OID0gMjsKLQkKKwogcHVibGljIEluZmVyZW5jZUNvbnRleHQoTWV0aG9kQmluZGluZyBnZW5lcmljTWV0aG9kKSB7CiAJdGhpcy5nZW5lcmljTWV0aG9kID0gZ2VuZXJpY01ldGhvZDsKIAlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IGdlbmVyaWNNZXRob2QudHlwZVZhcmlhYmxlczsKQEAgLTMzLDE2ICszMyw2IEBACiAJdGhpcy5zdWJzdGl0dXRlcyA9IG5ldyBUeXBlQmluZGluZ1t2YXJMZW5ndGhdOwogfQogCi1wdWJsaWMgYm9vbGVhbiBjaGVja1Jhd1N1YnN0aXR1dGlvbigpIHsKLQkvLyBvbmx5IGF0IGZpcnN0IGxldmVsLCBkdXJpbmcgaW5mZXJlbmNlIGZyb20gYXJndW1lbnRzCi0JaWYgKGRlcHRoID4gMCkgcmV0dXJuIGZhbHNlOwotLy8JaWYgKHRoaXMuYXJndW1lbnRJbmRleCA8IDAgfHwgdGhpcy5kZXB0aCAhPSAwKSB7Ci0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotCXRoaXMuc3RhdHVzID0gUkFXX1NVQlNUSVRVVElPTjsKLQlyZXR1cm4gdHJ1ZTsKLX0JCQotCiBwdWJsaWMgVHlwZUJpbmRpbmdbXSBnZXRTdWJzdGl0dXRlcyhUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSwgaW50IGNvbnN0cmFpbnQpIHsKIAlyZXR1cm4gdGhpcy5jb2xsZWN0ZWRTdWJzdGl0dXRlc1t0eXBlVmFyaWFibGUucmFua11bY29uc3RyYWludF07CiB9CkBAIC01Nyw3ICs0Nyw3IEBACiAJCX0KIAl9CiAJcmV0dXJuIGZhbHNlOwotfQkJCit9CiAKIHB1YmxpYyB2b2lkIHJlY29yZFN1YnN0aXR1dGUoVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUsIFR5cGVCaW5kaW5nIGFjdHVhbFR5cGUsIGludCBjb25zdHJhaW50KSB7CiAgICAgVHlwZUJpbmRpbmdbXVtdIHZhcmlhYmxlU3Vic3RpdHV0ZXMgPSB0aGlzLmNvbGxlY3RlZFN1YnN0aXR1dGVzW3R5cGVWYXJpYWJsZS5yYW5rXTsKQEAgLTkwLDcgKzgwLDcgQEAKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5nZW5lcmljTWV0aG9kLnR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJYnVmZmVyLmFwcGVuZCh0aGlzLmdlbmVyaWNNZXRob2QudHlwZVZhcmlhYmxlc1tpXSk7CiAJfQotCWJ1ZmZlci5hcHBlbmQodGhpcy5nZW5lcmljTWV0aG9kKTsgCisJYnVmZmVyLmFwcGVuZCh0aGlzLmdlbmVyaWNNZXRob2QpOwogCWJ1ZmZlci5hcHBlbmQoIlxuXHRbc3RhdHVzPSIpOy8vJE5PTi1OTFMtMSQKIAlzd2l0Y2godGhpcy5zdGF0dXMpIHsKIAkJY2FzZSAwIDoKQEAgLTk5LDkgKzg5LDYgQEAKIAkJY2FzZSBGQUlMRUQgOgogCQkJYnVmZmVyLmFwcGVuZCgiZmFpbGVkXSIpOy8vJE5PTi1OTFMtMSQKIAkJCWJyZWFrOwotCQljYXNlIFJBV19TVUJTVElUVVRJT04gOgotCQkJYnVmZmVyLmFwcGVuZCgicmF3LXN1YnN0XSIpOy8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwogCX0KIAlpZiAodGhpcy5leHBlY3RlZFR5cGUgPT0gbnVsbCkgewogCQlidWZmZXIuYXBwZW5kKCIgW2V4cGVjdGVkVHlwZT1udWxsXSIpOyAvLyROT04tTkxTLTEkCkBAIC0xMzAsNyArMTE3LDcgQEAKIAkJCQkJfQogCQkJCQlpZiAoY29uc3RyYWludENvbGxlY3RlZFtrXSAhPSBudWxsKSB7CiAJCQkJCQlidWZmZXIuYXBwZW5kKGNvbnN0cmFpbnRDb2xsZWN0ZWRba10uc2hvcnRSZWFkYWJsZU5hbWUoKSk7Ci0JCQkJCX0JCQkJCQorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0lubmVyRW11bGF0aW9uRGVwZW5kZW5jeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Jbm5lckVtdWxhdGlvbkRlcGVuZGVuY3kuamF2YQppbmRleCBlOTk1OWJmLi45ZmE2ODhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0lubmVyRW11bGF0aW9uRGVwZW5kZW5jeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNyArMTQsNyBAQAogCiAJcHVibGljIEJsb2NrU2NvcGUgc2NvcGU7CiAJcHVibGljIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZDsKLSAgICAKKwogCXB1YmxpYyBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3koQmxvY2tTY29wZSBzY29wZSwgYm9vbGVhbiB3YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkKSB7CiAJCXRoaXMuc2NvcGUgPSBzY29wZTsKIAkJdGhpcy53YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkID0gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YQppbmRleCBhZDRjYzQyLi5hMDliMDU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ludm9jYXRpb25TaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbnZvY2F0aW9uU2l0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE4ICsxMSwxOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBwdWJsaWMgaW50ZXJmYWNlIEludm9jYXRpb25TaXRlIHsKLQkKKwogCVR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKTsKIAlib29sZWFuIGlzU3VwZXJBY2Nlc3MoKTsKIAlib29sZWFuIGlzVHlwZUFjY2VzcygpOwotCXZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKTsKLQl2b2lkIHNldEZpZWxkSW5kZXgoaW50IGRlcHRoKTsKLQkKLQkvLyBpbiBjYXNlIHRoZSByZWNlaXZlciB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgcmVjZWl2ZXIgdHlwZSAKLQkvLyBlLmcuIHBrZy5UeXBlLkMgKHJlY2VpdmVyIHR5cGUgb2YgQyBpcyB0eXBlIG9mIHNvdXJjZSBjb250ZXh0LCAKKwkvLyBpbiBjYXNlIHRoZSByZWNlaXZlciB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgcmVjZWl2ZXIgdHlwZQorCS8vIGUuZy4gcGtnLlR5cGUuQyAocmVjZWl2ZXIgdHlwZSBvZiBDIGlzIHR5cGUgb2Ygc291cmNlIGNvbnRleHQsCiAJLy8JCWJ1dCBhY3R1YWwgcmVjZWl2ZXIgdHlwZSBpcyBwa2cuVHlwZSkKIAkvLyBlLmcyLiBpbiBwcmVzZW5jZSBvZiBpbXBsaWNpdCBhY2Nlc3MgdG8gZW5jbG9zaW5nIHR5cGUKIAl2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSk7Ci0JaW50IHNvdXJjZVN0YXJ0KCk7CisJdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpOworCXZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpOwogCWludCBzb3VyY2VFbmQoKTsKKwlpbnQgc291cmNlU3RhcnQoKTsKKwlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKaW5kZXggZTZiZDM0Yy4uM2NmMzE4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOCArMTEsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc2VTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxUeXBlQmluZGluZyBleHRlbmRzIE5lc3RlZFR5cGVCaW5kaW5nIHsKIAlmaW5hbCBzdGF0aWMgY2hhcltdIExvY2FsVHlwZVByZWZpeCA9IHsgJyQnLCAnTCcsICdvJywgJ2MnLCAnYScsICdsJywgJyQnIH07CkBAIC0yMiw0NSArMjUsNjYgQEAKIAlwdWJsaWMgQ2FzZVN0YXRlbWVudCBlbmNsb3NpbmdDYXNlOyAvLyBmcm9tIDEuNCBvbiwgbG9jYWwgdHlwZXMgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBhY3Jvc3Mgc3dpdGNoIGNhc2UgYmxvY2tzICg1MjIyMSkKIAlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0OyAvLyB1c2VkIGJ5IGNvbXB1dGVVbmlxdWVLZXkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBiaW5kaW5nCiAJcHVibGljIE1ldGhvZEJpbmRpbmcgZW5jbG9zaW5nTWV0aG9kOwotCQorCiBwdWJsaWMgTG9jYWxUeXBlQmluZGluZyhDbGFzc1Njb3BlIHNjb3BlLCBTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlLCBDYXNlU3RhdGVtZW50IHN3aXRjaENhc2UpIHsKIAlzdXBlcigKLQkJbmV3IGNoYXJbXVtdIHtDaGFyT3BlcmF0aW9uLmNvbmNhdChMb2NhbFR5cGVQcmVmaXgsIHNjb3BlLnJlZmVyZW5jZUNvbnRleHQubmFtZSl9LAorCQluZXcgY2hhcltdW10ge0NoYXJPcGVyYXRpb24uY29uY2F0KExvY2FsVHlwZUJpbmRpbmcuTG9jYWxUeXBlUHJlZml4LCBzY29wZS5yZWZlcmVuY2VDb250ZXh0Lm5hbWUpfSwKIAkJc2NvcGUsCiAJCWVuY2xvc2luZ1R5cGUpOwotCQotCWlmICh0aGlzLnNvdXJjZU5hbWUgPT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSKQorCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0OworCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCkgewogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5Bbm9ueW1vdXNUeXBlTWFzazsKLQllbHNlCisJfSBlbHNlIHsKIAkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuTG9jYWxUeXBlTWFzazsKKwl9CiAJdGhpcy5lbmNsb3NpbmdDYXNlID0gc3dpdGNoQ2FzZTsKLQl0aGlzLnNvdXJjZVN0YXJ0ID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zb3VyY2VTdGFydDsKKwl0aGlzLnNvdXJjZVN0YXJ0ID0gdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OwogCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUuZW5jbG9zaW5nTWV0aG9kU2NvcGUoKTsKLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbWV0aG9kU2NvcGUucmVmZXJlbmNlTWV0aG9kKCk7Ci0JaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJdGhpcy5lbmNsb3NpbmdNZXRob2QgPSBkZWNsYXJhdGlvbi5iaW5kaW5nOworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RTY29wZS5yZWZlcmVuY2VNZXRob2QoKTsKKwlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQl0aGlzLmVuY2xvc2luZ01ldGhvZCA9IG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmc7CiAJfQogfQorCiAvKiBSZWNvcmQgYSBkZXBlbmRlbmN5IG9udG8gYSBzb3VyY2UgdGFyZ2V0IHR5cGUgd2hpY2ggbWF5IGJlIGFsdGVyZWQKICogYnkgdGhlIGVuZCBvZiB0aGUgaW5uZXJjbGFzcyBlbXVsYXRpb24uIExhdGVyIG9uLCB3ZSB3aWxsIHJldmlzaXQKICogYWxsIGl0cyBkZXBlbmRlbnRzIHNvIGFzIHRvIHVwZGF0ZSB0aGVtIChzZWUgdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCkpLgogKi8KLQogcHVibGljIHZvaWQgYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoQmxvY2tTY29wZSBkZXBlbmRlbnRTY29wZSwgYm9vbGVhbiB3YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkKSB7CiAJaW50IGluZGV4OwotCWlmIChkZXBlbmRlbnRzID09IG51bGwpIHsKKwlpZiAodGhpcy5kZXBlbmRlbnRzID09IG51bGwpIHsKIAkJaW5kZXggPSAwOwotCQlkZXBlbmRlbnRzID0gbmV3IElubmVyRW11bGF0aW9uRGVwZW5kZW5jeVsxXTsKKwkJdGhpcy5kZXBlbmRlbnRzID0gbmV3IElubmVyRW11bGF0aW9uRGVwZW5kZW5jeVsxXTsKIAl9IGVsc2UgewotCQlpbmRleCA9IGRlcGVuZGVudHMubGVuZ3RoOworCQlpbmRleCA9IHRoaXMuZGVwZW5kZW50cy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKLQkJCWlmIChkZXBlbmRlbnRzW2ldLnNjb3BlID09IGRlcGVuZGVudFNjb3BlKQorCQkJaWYgKHRoaXMuZGVwZW5kZW50c1tpXS5zY29wZSA9PSBkZXBlbmRlbnRTY29wZSkKIAkJCQlyZXR1cm47IC8vIGFscmVhZHkgc3RvcmVkCi0JCVN5c3RlbS5hcnJheWNvcHkoZGVwZW5kZW50cywgMCwgKGRlcGVuZGVudHMgPSBuZXcgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5W2luZGV4ICsgMV0pLCAwLCBpbmRleCk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5kZXBlbmRlbnRzLCAwLCAodGhpcy5kZXBlbmRlbnRzID0gbmV3IElubmVyRW11bGF0aW9uRGVwZW5kZW5jeVtpbmRleCArIDFdKSwgMCwgaW5kZXgpOwogCX0KLQlkZXBlbmRlbnRzW2luZGV4XSA9IG5ldyBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3koZGVwZW5kZW50U2NvcGUsIHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpOworCXRoaXMuZGVwZW5kZW50c1tpbmRleF0gPSBuZXcgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5KGRlcGVuZGVudFNjb3BlLCB3YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkKTsKIAkvLyAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgZGVwZW5kZW5jeTogIisgbmV3IFN0cmluZyhzY29wZS5lbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCkpICsgIiAtLT4gIiArIG5ldyBTdHJpbmcodGhpcy5yZWFkYWJsZU5hbWUoKSkpOwogfQorCisvKgorICogUmV0dXJucyB0aGUgYW5vbnltb3VzIG9yaWdpbmFsIHN1cGVyIHR5cGUgKGluIHNvbWUgZXJyb3IgY2FzZXMsIHN1cGVyY2xhc3MgbWF5IGdldCBzdWJzdGl0dXRlZCB3aXRoIE9iamVjdCkKKyAqLworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgYW5vbnltb3VzT3JpZ2luYWxTdXBlclR5cGUoKSB7CisJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlc1swXTsKKwl9CisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zKSA9PSAwKSB7CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3M7CisJfQorCWlmICh0aGlzLnNjb3BlICE9IG51bGwpIHsKKwkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy5zY29wZS5yZWZlcmVuY2VDb250ZXh0LmFsbG9jYXRpb24udHlwZTsKKwkJaWYgKHR5cGVSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJcmV0dXJuIChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlUmVmZXJlbmNlLnJlc29sdmVkVHlwZTsKKwkJfQorCX0KKwlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzOyAvLyBkZWZhdWx0IGFuc3dlcgorfQorCiBwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKIAljaGFyW10gb3V0ZXJLZXkgPSBvdXRlcm1vc3RFbmNsb3NpbmdUeXBlKCkuY29tcHV0ZVVuaXF1ZUtleShpc0xlYWYpOwogCWludCBzZW1pY29sb24gPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCc7Jywgb3V0ZXJLZXkpOwpAQCAtNzEsNDEgKzk1LDQ1IEBACiAJLy8gaW5zZXJ0ICRzb3VyY2VTdGFydAogCXNpZy5hcHBlbmQoJyQnKTsKIAlzaWcuYXBwZW5kKFN0cmluZy52YWx1ZU9mKHRoaXMuc291cmNlU3RhcnQpKTsKLQkKKwogCS8vIGluc2VydCAkTG9jYWxOYW1lIGlmIGxvY2FsCiAJaWYgKCFpc0Fub255bW91c1R5cGUoKSkgewogCQlzaWcuYXBwZW5kKCckJyk7CiAJCXNpZy5hcHBlbmQodGhpcy5zb3VyY2VOYW1lKTsKIAl9Ci0JCisKIAkvLyBpbnNlcnQgcmVtYWluaW5nIGZyb20gb3V0ZXIga2V5CiAJc2lnLmFwcGVuZChvdXRlcktleSwgc2VtaWNvbG9uLCBvdXRlcktleS5sZW5ndGgtc2VtaWNvbG9uKTsKLQkKKwogCWludCBzaWdMZW5ndGggPSBzaWcubGVuZ3RoKCk7CiAJY2hhcltdIHVuaXF1ZUtleSA9IG5ldyBjaGFyW3NpZ0xlbmd0aF07Ci0Jc2lnLmdldENoYXJzKDAsIHNpZ0xlbmd0aCwgdW5pcXVlS2V5LCAwKTsJCQkKKwlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCB1bmlxdWVLZXksIDApOwogCXJldHVybiB1bmlxdWVLZXk7CiB9CiAKIHB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIC8qIGphdmEvbGFuZy9PYmplY3QgKi8gewotCXJldHVybiBjb25zdGFudFBvb2xOYW1lOworCWlmICh0aGlzLmNvbnN0YW50UG9vbE5hbWUgPT0gbnVsbCAmJiB0aGlzLnNjb3BlICE9IG51bGwpIHsKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjE1NCwgd2UgZG8gaGF2ZSBzb21lCisJCS8vIGNhc2VzIHdoZXJlIHRoZSBsZWZ0IGhhbmQgZG9lcyBub3Qga25vdyB3aGF0IHRoZSByaWdodCBpcyBkb2luZy4KKwkJdGhpcy5jb25zdGFudFBvb2xOYW1lID0gdGhpcy5zY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLmNvbXB1dGVDb25zdGFudFBvb2xOYW1lKHRoaXMpOworCX0KKwlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2xOYW1lOwkKIH0KIAogQXJyYXlCaW5kaW5nIGNyZWF0ZUFycmF5VHlwZShpbnQgZGltZW5zaW9uQ291bnQsIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50KSB7Ci0JaWYgKGxvY2FsQXJyYXlCaW5kaW5ncyA9PSBudWxsKSB7Ci0JCWxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbXSB7bmV3IEFycmF5QmluZGluZyh0aGlzLCBkaW1lbnNpb25Db3VudCwgbG9va3VwRW52aXJvbm1lbnQpfTsKLQkJcmV0dXJuIGxvY2FsQXJyYXlCaW5kaW5nc1swXTsKKwlpZiAodGhpcy5sb2NhbEFycmF5QmluZGluZ3MgPT0gbnVsbCkgeworCQl0aGlzLmxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbXSB7bmV3IEFycmF5QmluZGluZyh0aGlzLCBkaW1lbnNpb25Db3VudCwgbG9va3VwRW52aXJvbm1lbnQpfTsKKwkJcmV0dXJuIHRoaXMubG9jYWxBcnJheUJpbmRpbmdzWzBdOwogCX0KLQogCS8vIGZpbmQgdGhlIGNhY2hlZCBhcnJheSBiaW5kaW5nIGZvciB0aGlzIGRpbWVuc2lvbkNvdW50IChpZiBhbnkpCi0JaW50IGxlbmd0aCA9IGxvY2FsQXJyYXlCaW5kaW5ncy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMubG9jYWxBcnJheUJpbmRpbmdzLmxlbmd0aDsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQlpZiAobG9jYWxBcnJheUJpbmRpbmdzW2ldLmRpbWVuc2lvbnMgPT0gZGltZW5zaW9uQ291bnQpCi0JCQlyZXR1cm4gbG9jYWxBcnJheUJpbmRpbmdzW2ldOworCQlpZiAodGhpcy5sb2NhbEFycmF5QmluZGluZ3NbaV0uZGltZW5zaW9ucyA9PSBkaW1lbnNpb25Db3VudCkKKwkJCXJldHVybiB0aGlzLmxvY2FsQXJyYXlCaW5kaW5nc1tpXTsKIAogCS8vIG5vIG1hdGNoaW5nIGFycmF5Ci0JU3lzdGVtLmFycmF5Y29weShsb2NhbEFycmF5QmluZGluZ3MsIDAsIGxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7IAotCXJldHVybiBsb2NhbEFycmF5QmluZGluZ3NbbGVuZ3RoXSA9IG5ldyBBcnJheUJpbmRpbmcodGhpcywgZGltZW5zaW9uQ291bnQsIGxvb2t1cEVudmlyb25tZW50KTsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubG9jYWxBcnJheUJpbmRpbmdzLCAwLCB0aGlzLmxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CisJcmV0dXJuIHRoaXMubG9jYWxBcnJheUJpbmRpbmdzW2xlbmd0aF0gPSBuZXcgQXJyYXlCaW5kaW5nKHRoaXMsIGRpbWVuc2lvbkNvdW50LCBsb29rdXBFbnZpcm9ubWVudCk7CiB9CiAKIC8qCkBAIC0xMTQsNyArMTQyLDcgQEAKICAqIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5Njg2KQogICovCiBwdWJsaWMgY2hhcltdIGdlbmVyaWNUeXBlU2lnbmF0dXJlKCkgewotCWlmICh0aGlzLmdlbmVyaWNSZWZlcmVuY2VUeXBlU2lnbmF0dXJlID09IG51bGwgJiYgY29uc3RhbnRQb29sTmFtZSgpID09IG51bGwpIHsKKwlpZiAodGhpcy5nZW5lcmljUmVmZXJlbmNlVHlwZVNpZ25hdHVyZSA9PSBudWxsICYmIHRoaXMuY29uc3RhbnRQb29sTmFtZSA9PSBudWxsKSB7CiAJCWlmIChpc0Fub255bW91c1R5cGUoKSkKIAkJCXNldENvbnN0YW50UG9vbE5hbWUoc3VwZXJjbGFzcygpLnNvdXJjZU5hbWUoKSk7CiAJCWVsc2UKQEAgLTEyNiwxNyArMTU0LDE0IEBACiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIC8qamF2YS5sYW5nLk9iamVjdCwgIHAuWDxUPiAqLyB7CiAgICAgY2hhcltdIHJlYWRhYmxlTmFtZTsKIAlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpIHsKLQkJaWYgKHN1cGVySW50ZXJmYWNlcyA9PSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykKLQkJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuQU5PTllNX1BSRUZJWCwgc3VwZXJjbGFzcy5yZWFkYWJsZU5hbWUoKSwgVHlwZUNvbnN0YW50cy5BTk9OWU1fU1VGRklYKTsKLQkJZWxzZQotCQkJcmVhZGFibGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5BTk9OWU1fUFJFRklYLCBzdXBlckludGVyZmFjZXNbMF0ucmVhZGFibGVOYW1lKCksIFR5cGVDb25zdGFudHMuQU5PTllNX1NVRkZJWCk7CisJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuQU5PTllNX1BSRUZJWCwgYW5vbnltb3VzT3JpZ2luYWxTdXBlclR5cGUoKS5yZWFkYWJsZU5hbWUoKSwgVHlwZUNvbnN0YW50cy5BTk9OWU1fU1VGRklYKTsKIAl9IGVsc2UgaWYgKGlzTWVtYmVyVHlwZSgpKSB7CiAJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSwgdGhpcy5zb3VyY2VOYW1lLCAnLicpOwogCX0gZWxzZSB7CiAJCXJlYWRhYmxlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKLQl9ICAgIAorCX0KIAlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcnM7Ci0JaWYgKCh0eXBlVmFycyA9IHRoaXMudHlwZVZhcmlhYmxlcygpKSAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CisJaWYgKCh0eXBlVmFycyA9IHR5cGVWYXJpYWJsZXMoKSkgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgewogCSAgICBTdHJpbmdCdWZmZXIgbmFtZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwogCSAgICBuYW1lQnVmZmVyLmFwcGVuZChyZWFkYWJsZU5hbWUpLmFwcGVuZCgnPCcpOwogCSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZVZhcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTE1NCwxNyArMTc5LDE0IEBACiBwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCkgLypPYmplY3QqLyB7CiAgICAgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lOwogCWlmIChpc0Fub255bW91c1R5cGUoKSkgewotCQlpZiAoc3VwZXJJbnRlcmZhY2VzID09IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKQotCQkJc2hvcnRSZWFkYWJsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLkFOT05ZTV9QUkVGSVgsIHN1cGVyY2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSwgVHlwZUNvbnN0YW50cy5BTk9OWU1fU1VGRklYKTsKLQkJZWxzZQotCQkJc2hvcnRSZWFkYWJsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLkFOT05ZTV9QUkVGSVgsIHN1cGVySW50ZXJmYWNlc1swXS5zaG9ydFJlYWRhYmxlTmFtZSgpLCBUeXBlQ29uc3RhbnRzLkFOT05ZTV9TVUZGSVgpOworCQlzaG9ydFJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuQU5PTllNX1BSRUZJWCwgYW5vbnltb3VzT3JpZ2luYWxTdXBlclR5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpLCBUeXBlQ29uc3RhbnRzLkFOT05ZTV9TVUZGSVgpOwogCX0gZWxzZSBpZiAoaXNNZW1iZXJUeXBlKCkpIHsKLQkJc2hvcnRSZWFkYWJsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSwgc291cmNlTmFtZSwgJy4nKTsKKwkJc2hvcnRSZWFkYWJsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5zb3VyY2VOYW1lLCAnLicpOwogCX0gZWxzZSB7Ci0JCXNob3J0UmVhZGFibGVOYW1lID0gc291cmNlTmFtZTsKKwkJc2hvcnRSZWFkYWJsZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CiAJfQogCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyczsKLQlpZiAoKHR5cGVWYXJzID0gdGhpcy50eXBlVmFyaWFibGVzKCkpICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwlpZiAoKHR5cGVWYXJzID0gdHlwZVZhcmlhYmxlcygpKSAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CiAJICAgIFN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CiAJICAgIG5hbWVCdWZmZXIuYXBwZW5kKHNob3J0UmVhZGFibGVOYW1lKS5hcHBlbmQoJzwnKTsKIAkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVWYXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0xNzQsNyArMTk2LDcgQEAKIAkgICAgbmFtZUJ1ZmZlci5hcHBlbmQoJz4nKTsKIAkJaW50IG5hbWVMZW5ndGggPSBuYW1lQnVmZmVyLmxlbmd0aCgpOwogCQlzaG9ydFJlYWRhYmxlTmFtZSA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOwotCQluYW1lQnVmZmVyLmdldENoYXJzKDAsIG5hbWVMZW5ndGgsIHNob3J0UmVhZGFibGVOYW1lLCAwKTsJICAgIAorCQluYW1lQnVmZmVyLmdldENoYXJzKDAsIG5hbWVMZW5ndGgsIHNob3J0UmVhZGFibGVOYW1lLCAwKTsKIAl9CiAJcmV0dXJuIHNob3J0UmVhZGFibGVOYW1lOwogfQpAQCAtMTg3LDEzICsyMDksMTQgQEAKIHB1YmxpYyB2b2lkIHNldENvbnN0YW50UG9vbE5hbWUoY2hhcltdIGNvbXB1dGVkQ29uc3RhbnRQb29sTmFtZSkgLyogamF2YS9sYW5nL09iamVjdCAqLyB7CiAJdGhpcy5jb25zdGFudFBvb2xOYW1lID0gY29tcHV0ZWRDb25zdGFudFBvb2xOYW1lOwogfQorCiAvKgogICogT3ZlcnJpZGVuIGZvciBjb2RlIGFzc2lzdC4gSW4gdGhpcyBjYXNlLCB0aGUgY29uc3RhbnRQb29sTmFtZSgpIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuCiAgKiBTbGFtIHRoZSBzb3VyY2UgbmFtZSBzbyB0aGF0IHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0LgogICogKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjg0KQogICovCiBwdWJsaWMgY2hhcltdIHNpZ25hdHVyZSgpIHsKLQlpZiAodGhpcy5zaWduYXR1cmUgPT0gbnVsbCAmJiBjb25zdGFudFBvb2xOYW1lKCkgPT0gbnVsbCkgeworCWlmICh0aGlzLnNpZ25hdHVyZSA9PSBudWxsICYmIHRoaXMuY29uc3RhbnRQb29sTmFtZSA9PSBudWxsKSB7CiAJCWlmIChpc0Fub255bW91c1R5cGUoKSkKIAkJCXNldENvbnN0YW50UG9vbE5hbWUoc3VwZXJjbGFzcygpLnNvdXJjZU5hbWUoKSk7CiAJCWVsc2UKQEAgLTIwMSwxNiArMjI0LDE0IEBACiAJfQogCXJldHVybiBzdXBlci5zaWduYXR1cmUoKTsKIH0KKwogcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lKCkgewogCWlmIChpc0Fub255bW91c1R5cGUoKSkgewotCQlpZiAoc3VwZXJJbnRlcmZhY2VzID09IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKQotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuQU5PTllNX1BSRUZJWCwgc3VwZXJjbGFzcy5zb3VyY2VOYW1lKCksIFR5cGVDb25zdGFudHMuQU5PTllNX1NVRkZJWCk7Ci0JCWVsc2UKLQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLkFOT05ZTV9QUkVGSVgsIHN1cGVySW50ZXJmYWNlc1swXS5zb3VyY2VOYW1lKCksIFR5cGVDb25zdGFudHMuQU5PTllNX1NVRkZJWCk7Ci0JCQkKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuQU5PTllNX1BSRUZJWCwgYW5vbnltb3VzT3JpZ2luYWxTdXBlclR5cGUoKS5zb3VyY2VOYW1lKCksIFR5cGVDb25zdGFudHMuQU5PTllNX1NVRkZJWCk7CiAJfSBlbHNlCi0JCXJldHVybiBzb3VyY2VOYW1lOworCQlyZXR1cm4gdGhpcy5zb3VyY2VOYW1lOwogfQorCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCWlmIChpc0Fub255bW91c1R5cGUoKSkKIAkJcmV0dXJuICJBbm9ueW1vdXMgdHlwZSA6ICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCkBAIC0yMTgsMTQgKzIzOSwxNCBAQAogCQlyZXR1cm4gIkxvY2FsIG1lbWJlciB0eXBlIDogIiArIG5ldyBTdHJpbmcoc291cmNlTmFtZSgpKSArICIgIiArIHN1cGVyLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAogCXJldHVybiAiTG9jYWwgdHlwZSA6ICIgKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIH0KKwogLyogVHJpZ2dlciB0aGUgZGVwZW5kZW5jeSBtZWNoYW5pc20gZm9yY2luZyB0aGUgaW5uZXJjbGFzcyBlbXVsYXRpb24KICogdG8gYmUgcHJvcGFnYXRlZCB0byBhbGwgZGVwZW5kZW50IHNvdXJjZSB0eXBlcy4KICovCi0KIHB1YmxpYyB2b2lkIHVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpIHsKLQlpZiAoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgewotCQkJSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBkZXBlbmRlbnRzW2ldOworCWlmICh0aGlzLmRlcGVuZGVudHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgeworCQkJSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSB0aGlzLmRlcGVuZGVudHNbaV07CiAJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nICIgKyBuZXcgU3RyaW5nKHRoaXMucmVhZGFibGVOYW1lKCkpICsgIiAtLT4gIiArIG5ldyBTdHJpbmcoZGVwZW5kZW5jeS5zY29wZS5lbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCkpKTsKIAkJCWRlcGVuZGVuY3kuc2NvcGUucHJvcGFnYXRlSW5uZXJFbXVsYXRpb24odGhpcywgZGVwZW5kZW5jeS53YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IGU5N2M2YWMuLmQwYmQ4NDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTEsMTUgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDE4NTY4MiAtIEluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIG1hcmsgbG9jYWwgdmFyaWFibGVzIGFzIHJlYWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbjsKQEAgLTIxLDUwICsyMyw1MiBAQAogcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgVmFyaWFibGVCaW5kaW5nIHsKIAogCXB1YmxpYyBpbnQgcmVzb2x2ZWRQb3NpdGlvbjsgLy8gZm9yIGNvZGUgZ2VuZXJhdGlvbiAocG9zaXRpb24gaW4gbWV0aG9kIGNvbnRleHQpCi0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlVTRUQgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRUQgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBS0VfVVNFRCA9IDI7Ci0JcHVibGljIGludCB1c2VGbGFnOyAvLyBmb3IgZmxvdyBhbmFseXNpcyAoZGVmYXVsdCBpcyBVTlVTRUQpCi0JCisJcHVibGljIGludCB1c2VGbGFnOyAvLyBmb3IgZmxvdyBhbmFseXNpcyAoZGVmYXVsdCBpcyBVTlVTRUQpLCB2YWx1ZXMgPCAwIGluZGljYXRlIHRoZSBudW1iZXIgb2YgY29tcG91bmQgdXNlcyAocG9zdEluY3JlbWVudCBvciBjb21wb3VuZEFzc2lnbm1lbnQpCisKIAlwdWJsaWMgQmxvY2tTY29wZSBkZWNsYXJpbmdTY29wZTsgLy8gYmFjay1wb2ludGVyIHRvIGl0cyBkZWNsYXJpbmcgc2NvcGUKIAlwdWJsaWMgTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsgLy8gZm9yIHNvdXJjZS1wb3NpdGlvbnMKIAogCXB1YmxpYyBpbnRbXSBpbml0aWFsaXphdGlvblBDczsKIAlwdWJsaWMgaW50IGluaXRpYWxpemF0aW9uQ291bnQgPSAwOwogCi0JLy8gZm9yIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZXMJCisJLy8gZm9yIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZXMKIAkvLyBpZiBkZWNsYXJhdGlvbiBzbG90IGlzIG5vdCBwb3NpdGlvbm5lZCwgdGhlIHZhcmlhYmxlIHdpbGwgbm90IGJlIGxpc3RlZCBpbiBhdHRyaWJ1dGUKIAkvLyBub3RlIHRoYXQgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBzaG91bGQgYmUgY2hvc2VuIHNvIGFzIG5vdCB0byBjb25mbGljdCB3aXRoIHVzZXIgb25lcyAodXN1YWxseSBzdGFydGluZyB3aXRoIGEgc3BhY2UgY2hhciBpcyBhbGwgbmVlZGVkKQogCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyhjaGFyW10gbmFtZSwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBpc0FyZ3VtZW50KSB7CiAJCXN1cGVyKG5hbWUsIHR5cGUsIG1vZGlmaWVycywgaXNBcmd1bWVudCA/IENvbnN0YW50Lk5vdEFDb25zdGFudCA6IG51bGwpOwogCQlpZiAoaXNBcmd1bWVudCkgdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNBcmd1bWVudDsKKwkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNFZmZlY3RpdmVseUZpbmFsOwogCX0KLQkKKwogCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgb3IgYXJndW1lbnQKIAlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcoTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBpc0FyZ3VtZW50KSB7CiAKIAkJdGhpcyhkZWNsYXJhdGlvbi5uYW1lLCB0eXBlLCBtb2RpZmllcnMsIGlzQXJndW1lbnQpOwogCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CisJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLklzRWZmZWN0aXZlbHlGaW5hbDsKIAl9CiAKIAkvKiBBUEkKIAkqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBiaW5kaW5nIHR5cGUgZnJvbSBCaW5kaW5nLkJpbmRpbmdJRC4KIAkqLwogCXB1YmxpYyBmaW5hbCBpbnQga2luZCgpIHsKLQogCQlyZXR1cm4gTE9DQUw7CiAJfQotCQorCiAJLyoKLQkgKiBkZWNsYXJpbmdVbmlxdWVLZXkgIyBzY29wZUluZGV4IC8gdmFyTmFtZQotCSAqIHAuWCB7IHZvaWQgZm9vKCkgeyBpbnQgbG9jYWw7IH0gfSAtLT4gTHAvWDsuZm9vKClWIzEvbG9jYWwKKwkgKiBkZWNsYXJpbmdVbmlxdWVLZXkgIyBzY29wZUluZGV4KDAtYmFzZWQpICMgdmFyTmFtZSBbIyBvY2N1cnJlbmNlQ291bnQoMC1iYXNlZCldCisJICogcC5YIHsgdm9pZCBmb28oKSB7IGludCBsb2NhbDsgaW50IGxvY2FsO30gfSAtLT4gTHAvWDsuZm9vKClWIzEjbG9jYWwjMQogCSAqLwogCXB1YmxpYyBjaGFyW10gY29tcHV0ZVVuaXF1ZUtleShib29sZWFuIGlzTGVhZikgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKKwogCQkvLyBkZWNsYXJpbmcgbWV0aG9kIG9yIHR5cGUKIAkJQmxvY2tTY29wZSBzY29wZSA9IHRoaXMuZGVjbGFyaW5nU2NvcGU7CisJCWludCBvY2N1cmVuY2VDb3VudCA9IDA7CiAJCWlmIChzY29wZSAhPSBudWxsKSB7CiAJCQkvLyB0aGUgc2NvcGUgY2FuIGJlIG51bGwuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MTI5CiAJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUgPyAoTWV0aG9kU2NvcGUpIHNjb3BlIDogc2NvcGUuZW5jbG9zaW5nTWV0aG9kU2NvcGUoKTsKQEAgLTgwLDE0ICs4NCwzMiBAQAogCQkJCQlidWZmZXIuYXBwZW5kKHR5cGVCaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkoZmFsc2UvKm5vdCBhIGxlYWYqLykpOwogCQkJCX0KIAkJCX0KLQkKKwogCQkJLy8gc2NvcGUgaW5kZXgKIAkJCWdldFNjb3BlS2V5KHNjb3BlLCBidWZmZXIpOworCisJCQkvLyBmaW5kIG51bWJlciBvZiBvY2N1cmVuY2VzIG9mIGEgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzY29wZQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBsb2NhbHMgPSBzY29wZS5sb2NhbHM7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlLmxvY2FsSW5kZXg7IGkrKykgeyAvLyB1c2UgbGluZWFyIHNlYXJjaCBhc3N1bWluZyB0aGUgbnVtYmVyIG9mIGxvY2FscyBwZXIgc2NvcGUgaXMgbG93CisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBsb2NhbHNbaV07CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMubmFtZSwgbG9jYWwubmFtZSkpIHsKKwkJCQkJaWYgKHRoaXMgPT0gbG9jYWwpCisJCQkJCQlicmVhazsKKwkJCQkJb2NjdXJlbmNlQ291bnQrKzsKKwkJCQl9CisJCQl9CiAJCX0KIAkJLy8gdmFyaWFibGUgbmFtZQogCQlidWZmZXIuYXBwZW5kKCcjJyk7CiAJCWJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lKTsKLQkJCisKKwkJLy8gYWRkIG9jY3VyZW5jZSBjb3VudCB0byBhdm9pZCBzYW1lIGtleSBmb3IgZHVwbGljYXRlIHZhcmlhYmxlcworCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1OTApCisJCWlmIChvY2N1cmVuY2VDb3VudCA+IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJyMnKTsKKwkJCWJ1ZmZlci5hcHBlbmQob2NjdXJlbmNlQ291bnQpOworCQl9CisKIAkJaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKIAkJY2hhcltdIHVuaXF1ZUtleSA9IG5ldyBjaGFyW2xlbmd0aF07CiAJCWJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIHVuaXF1ZUtleSwgMCk7CkBAIC0xMjQsNyArMTQ2LDcgQEAKIAkJQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9ucyA9IHNvdXJjZVR5cGUucmV0cmlldmVBbm5vdGF0aW9ucyh0aGlzKTsKIAkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCkgPT0gMCkgewogCQkJaWYgKCgodGhpcy50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSAhPSAwKSAmJiB0aGlzLmRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbk5vZGVzID0gZGVjbGFyYXRpb24uYW5ub3RhdGlvbnM7CisJCQkJQW5ub3RhdGlvbltdIGFubm90YXRpb25Ob2RlcyA9IHRoaXMuZGVjbGFyYXRpb24uYW5ub3RhdGlvbnM7CiAJCQkJaWYgKGFubm90YXRpb25Ob2RlcyAhPSBudWxsKSB7CiAJCQkJCWludCBsZW5ndGggPSBhbm5vdGF0aW9uTm9kZXMubGVuZ3RoOwogCQkJCQlBU1ROb2RlLnJlc29sdmVBbm5vdGF0aW9ucyh0aGlzLmRlY2xhcmluZ1Njb3BlLCBhbm5vdGF0aW9uTm9kZXMsIHRoaXMpOwpAQCAtMTQ2LDQxICsxNjgsNDMgQEAKIAkJCWJ1ZmZlci5hcHBlbmQoc2NvcGVJbmRleCk7CiAJCX0KIAl9Ci0JCisKIAkvLyBBbnN3ZXIgd2hldGhlciB0aGUgdmFyaWFibGUgYmluZGluZyBpcyBhIHNlY3JldCB2YXJpYWJsZSBhZGRlZCBmb3IgY29kZSBnZW4gcHVycG9zZXMKIAlwdWJsaWMgYm9vbGVhbiBpc1NlY3JldCgpIHsKIAotCQlyZXR1cm4gZGVjbGFyYXRpb24gPT0gbnVsbCAmJiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSA9PSAwOworCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbiA9PSBudWxsICYmICh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLklzQXJndW1lbnQpID09IDA7CiAJfQogCiAJcHVibGljIHZvaWQgcmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyhpbnQgcGMpIHsKIAotCQlpZiAoaW5pdGlhbGl6YXRpb25QQ3NbKChpbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSA9PSAtMSkKLQkJCWluaXRpYWxpemF0aW9uUENzWygoaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSBwYzsKKwkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbKCh0aGlzLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IC0xKQorCQkJdGhpcy5pbml0aWFsaXphdGlvblBDc1soKHRoaXMuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSBwYzsKIAl9CiAKIAlwdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoaW50IHBjKSB7CiAKLQkJaWYgKGluaXRpYWxpemF0aW9uUENzID09IG51bGwpIAlyZXR1cm47Ci0JCWlmIChpbml0aWFsaXphdGlvbkNvdW50ID4gMCkgewotCQkJaW50IHByZXZpb3VzRW5kUEMgPSBpbml0aWFsaXphdGlvblBDc1sgKChpbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXTsKKwkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25QQ3MgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uQ291bnQgPiAwKSB7CisJCQlpbnQgcHJldmlvdXNFbmRQQyA9IHRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbICgodGhpcy5pbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXTsKIAkJCSAvLyBpbnRlcnZhbCBzdGlsbCBvcGVuLCBrZWVwIHVzaW5nIGl0ICgxMDgxODApCiAJCQlpZiAocHJldmlvdXNFbmRQQyA9PSAtMSkgewogCQkJCXJldHVybjsKIAkJCX0KIAkJCS8vIG9wdGltaXplIGNhc2VzIHdoZXJlIHJlb3BlbmluZyBhIGNvbnRpZ3VvdXMgaW50ZXJ2YWwKIAkJCWlmIChwcmV2aW91c0VuZFBDID09IHBjKSB7Ci0JCQkJaW5pdGlhbGl6YXRpb25QQ3NbICgoaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSAtMTsgLy8gcmV1c2UgcHJldmlvdXMgaW50ZXJ2YWwgKGl0cyByYW5nZSB3aWxsIGJlIGF1Z21lbnRlZCkKKwkJCQl0aGlzLmluaXRpYWxpemF0aW9uUENzWyAoKHRoaXMuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSAtMTsgLy8gcmV1c2UgcHJldmlvdXMgaW50ZXJ2YWwgKGl0cyByYW5nZSB3aWxsIGJlIGF1Z21lbnRlZCkKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KLQkJaW50IGluZGV4ID0gaW5pdGlhbGl6YXRpb25Db3VudCA8PCAxOwotCQlpZiAoaW5kZXggPT0gaW5pdGlhbGl6YXRpb25QQ3MubGVuZ3RoKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGluaXRpYWxpemF0aW9uUENzLCAwLCAoaW5pdGlhbGl6YXRpb25QQ3MgPSBuZXcgaW50W2luaXRpYWxpemF0aW9uQ291bnQgPDwgMl0pLCAwLCBpbmRleCk7CisJCWludCBpbmRleCA9IHRoaXMuaW5pdGlhbGl6YXRpb25Db3VudCA8PCAxOworCQlpZiAoaW5kZXggPT0gdGhpcy5pbml0aWFsaXphdGlvblBDcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pbml0aWFsaXphdGlvblBDcywgMCwgKHRoaXMuaW5pdGlhbGl6YXRpb25QQ3MgPSBuZXcgaW50W3RoaXMuaW5pdGlhbGl6YXRpb25Db3VudCA8PCAyXSksIDAsIGluZGV4KTsKIAkJfQotCQlpbml0aWFsaXphdGlvblBDc1tpbmRleF0gPSBwYzsKLQkJaW5pdGlhbGl6YXRpb25QQ3NbaW5kZXggKyAxXSA9IC0xOwotCQlpbml0aWFsaXphdGlvbkNvdW50Kys7CisJCXRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbaW5kZXhdID0gcGM7CisJCXRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbaW5kZXggKyAxXSA9IC0xOworCQl0aGlzLmluaXRpYWxpemF0aW9uQ291bnQrKzsKIAl9CiAKIAlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9ucyhBbm5vdGF0aW9uQmluZGluZ1tdIGFubm90YXRpb25zKSB7CkBAIC0xOTEsMTIgKzIxNSwxNyBAQAogCQkJc291cmNlVHlwZS5zdG9yZUFubm90YXRpb25zKHRoaXMsIGFubm90YXRpb25zKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCByZXNldEluaXRpYWxpemF0aW9ucygpIHsKKwkJdGhpcy5pbml0aWFsaXphdGlvbkNvdW50ID0gMDsKKwkJdGhpcy5pbml0aWFsaXphdGlvblBDcyA9IG51bGw7CisJfQorCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAogCQlTdHJpbmcgcyA9IHN1cGVyLnRvU3RyaW5nKCk7Ci0JCXN3aXRjaCAodXNlRmxhZyl7CisJCXN3aXRjaCAodGhpcy51c2VGbGFnKXsKIAkJCWNhc2UgVVNFRDoKLQkJCQlzICs9ICJbcG9zOiAiICsgU3RyaW5nLnZhbHVlT2YocmVzb2x2ZWRQb3NpdGlvbikgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJCXMgKz0gIltwb3M6ICIgKyBTdHJpbmcudmFsdWVPZih0aGlzLnJlc29sdmVkUG9zaXRpb24pICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIAkJCQlicmVhazsKIAkJCWNhc2UgVU5VU0VEOgogCQkJCXMgKz0gIltwb3M6IHVudXNlZF0iOyAvLyROT04tTkxTLTEkCkBAIC0yMDUsMTYgKzIzNCwyMCBAQAogCQkJCXMgKz0gIltwb3M6IGZha2VfdXNlZF0iOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CiAJCX0KLQkJcyArPSAiW2lkOiIgKyBTdHJpbmcudmFsdWVPZihpZCkgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKKwkJcyArPSAiW2lkOiIgKyBTdHJpbmcudmFsdWVPZih0aGlzLmlkKSArICJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uQ291bnQgPiAwKSB7CiAJCQlzICs9ICJbcGM6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25Db3VudDsgaSsrKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW5pdGlhbGl6YXRpb25Db3VudDsgaSsrKSB7CiAJCQkJaWYgKGkgPiAwKQogCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQkJCQlzICs9IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzW2kgPDwgMV0pICsgIi0iICsgKChpbml0aWFsaXphdGlvblBDc1soaSA8PCAxKSArIDFdID09IC0xKSA/ICI/IiA6IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzWyhpPDwgMSkgKyAxXSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQlzICs9IFN0cmluZy52YWx1ZU9mKHRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbaSA8PCAxXSkgKyAiLSIgKyAoKHRoaXMuaW5pdGlhbGl6YXRpb25QQ3NbKGkgPDwgMSkgKyAxXSA9PSAtMSkgPyAiPyIgOiBTdHJpbmcudmFsdWVPZih0aGlzLmluaXRpYWxpemF0aW9uUENzWyhpPDwgMSkgKyAxXSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCXMgKz0gIl0iOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJcmV0dXJuIHM7CiAJfQorCisJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7CisJCXJldHVybiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSXNBcmd1bWVudCkgIT0gMCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhCmluZGV4IGU1OTI3MGEuLjg0ZDNlNzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvb2t1cEVudmlyb25tZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywxMSArNywxNSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gY29udHJpYnV0aW9uIGZvciBidWcgMzM3ODY4IC0gW2NvbXBpbGVyXVttb2RlbF0gaW5jb21wbGV0ZSBzdXBwb3J0IGZvciBwYWNrYWdlLWluZm8uamF2YSB3aGVuIHVzaW5nIFNlYXJjaGFibGVFbnZpcm9ubWVudAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZVBvb2w7CkBAIC0yMSwyNSArMjUsMTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLklUeXBlUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIAogcHVibGljIGNsYXNzIExvb2t1cEVudmlyb25tZW50IGltcGxlbWVudHMgUHJvYmxlbVJlYXNvbnMsIFR5cGVDb25zdGFudHMgewotCQotCWZpbmFsIHN0YXRpYyBpbnQgQlVJTERfRklFTERTX0FORF9NRVRIT0RTID0gNDsKLQlmaW5hbCBzdGF0aWMgaW50IEJVSUxEX1RZUEVfSElFUkFSQ0hZID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IENIRUNLX0FORF9TRVRfSU1QT1JUUyA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBDT05ORUNUX1RZUEVfSElFUkFSQ0hZID0gMzsKLQlzdGF0aWMgZmluYWwgUHJvYmxlbVBhY2thZ2VCaW5kaW5nIFRoZU5vdEZvdW5kUGFja2FnZSA9IG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSLCBOb3RGb3VuZCk7Ci0Jc3RhdGljIGZpbmFsIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIFRoZU5vdEZvdW5kVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIG51bGwsIE5vdEZvdW5kKTsKLQkKKwogCS8qKgogCSAqIE1hcCBmcm9tIHR5cGVCaW5kaW5nIC0+IGFjY2Vzc1Jlc3RyaWN0aW9uIHJ1bGUKIAkgKi8KIAlwcml2YXRlIE1hcCBhY2Nlc3NSZXN0cmljdGlvbnM7CiAJSW1wb3J0QmluZGluZ1tdIGRlZmF1bHRJbXBvcnRzOwotCiAJcHVibGljIFBhY2thZ2VCaW5kaW5nIGRlZmF1bHRQYWNrYWdlOwogCUhhc2h0YWJsZU9mUGFja2FnZSBrbm93blBhY2thZ2VzOwogCXByaXZhdGUgaW50IGxhc3RDb21wbGV0ZWRVbml0SW5kZXggPSAtMTsKQEAgLTQ3LDI4ICs0NCw0NSBAQAogCiAJcHVibGljIElOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50OwogCXB1YmxpYyBDb21waWxlck9wdGlvbnMgZ2xvYmFsT3B0aW9uczsKKwogCXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOwotCiAJcHVibGljIENsYXNzRmlsZVBvb2wgY2xhc3NGaWxlUG9vbDsKLQogCS8vIGluZGljYXRlIGluIHdoaWNoIHN0ZXAgb24gdGhlIGNvbXBpbGF0aW9uIHdlIGFyZS4KIAkvLyBzdGVwIDEgOiBidWlsZCB0aGUgcmVmZXJlbmNlIGJpbmRpbmcKIAkvLyBzdGVwIDIgOiBjb25lY3QgdGhlIGhpZXJhcmNoeSAoY29ubmVjdCBiaW5kaW5ncykKIAkvLyBzdGVwIDMgOiBidWlsZCBmaWVsZHMgYW5kIG1ldGhvZCBiaW5kaW5ncy4KIAlwcml2YXRlIGludCBzdGVwQ29tcGxldGVkOwogCXB1YmxpYyBJVHlwZVJlcXVlc3RvciB0eXBlUmVxdWVzdG9yOworCiAJcHJpdmF0ZSBBcnJheUJpbmRpbmdbXVtdIHVuaXF1ZUFycmF5QmluZGluZ3M7CiAJcHJpdmF0ZSBTaW1wbGVMb29rdXBUYWJsZSB1bmlxdWVQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmdzOwogCXByaXZhdGUgU2ltcGxlTG9va3VwVGFibGUgdW5pcXVlUmF3VHlwZUJpbmRpbmdzOwogCXByaXZhdGUgU2ltcGxlTG9va3VwVGFibGUgdW5pcXVlV2lsZGNhcmRCaW5kaW5nczsKIAlwcml2YXRlIFNpbXBsZUxvb2t1cFRhYmxlIHVuaXF1ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZ3M7CiAJCisJLy8ga2V5IGlzIGEgc3RyaW5nIHdpdGggdGhlIG1ldGhvZCBzZWxlY3RvciB2YWx1ZSBpcyBhbiBhcnJheSBvZiBtZXRob2QgYmluZGluZ3MKKwlwcml2YXRlIFNpbXBsZUxvb2t1cFRhYmxlIHVuaXF1ZVBvbHltb3JwaGljTWV0aG9kQmluZGluZ3M7CisJcHJpdmF0ZSBTaW1wbGVMb29rdXBUYWJsZSB1bmlxdWVHZXRDbGFzc01ldGhvZEJpbmRpbmc7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDA3MzQKKwogCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0QmVpbmdDb21wbGV0ZWQgPSBudWxsOyAvLyBvbmx5IHNldCB3aGlsZSBjb21wbGV0aW5nIHVuaXRzCiAJcHVibGljIE9iamVjdCBtaXNzaW5nQ2xhc3NGaWxlTG9jYXRpb24gPSBudWxsOyAvLyBvbmx5IHNldCB3aGVuIHJlc29sdmluZyBjZXJ0YWluIHJlZmVyZW5jZXMsIHRvIGhlbHAgbG9jYXRpbmcgcHJvYmxlbXMKLQogCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bXSB1bml0cyA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbls0XTsKIAlwcml2YXRlIE1ldGhvZFZlcmlmaWVyIHZlcmlmaWVyOwogCisJcHVibGljIE1ldGhvZEJpbmRpbmcgYXJyYXlDbG9uZTsKKworCXByaXZhdGUgQXJyYXlMaXN0IG1pc3NpbmdUeXBlczsKKwlTZXQgdHlwZXNCZWluZ0Nvbm5lY3RlZDsKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NpbmdBbm5vdGF0aW9ucyA9IGZhbHNlOworCisJZmluYWwgc3RhdGljIGludCBCVUlMRF9GSUVMRFNfQU5EX01FVEhPRFMgPSA0OworCWZpbmFsIHN0YXRpYyBpbnQgQlVJTERfVFlQRV9ISUVSQVJDSFkgPSAxOworCWZpbmFsIHN0YXRpYyBpbnQgQ0hFQ0tfQU5EX1NFVF9JTVBPUlRTID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IENPTk5FQ1RfVFlQRV9ISUVSQVJDSFkgPSAzOworCisJc3RhdGljIGZpbmFsIFByb2JsZW1QYWNrYWdlQmluZGluZyBUaGVOb3RGb3VuZFBhY2thZ2UgPSBuZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKENoYXJPcGVyYXRpb24uTk9fQ0hBUiwgTm90Rm91bmQpOworCXN0YXRpYyBmaW5hbCBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBUaGVOb3RGb3VuZFR5cGUgPSBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsIG51bGwsIE5vdEZvdW5kKTsKKwogcHVibGljIExvb2t1cEVudmlyb25tZW50KElUeXBlUmVxdWVzdG9yIHR5cGVSZXF1ZXN0b3IsIENvbXBpbGVyT3B0aW9ucyBnbG9iYWxPcHRpb25zLCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudCkgewogCXRoaXMudHlwZVJlcXVlc3RvciA9IHR5cGVSZXF1ZXN0b3I7CiAJdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9uczsKQEAgLTgzLDggKzk3LDExIEBACiAJdGhpcy51bmlxdWVSYXdUeXBlQmluZGluZ3MgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CiAJdGhpcy51bmlxdWVXaWxkY2FyZEJpbmRpbmdzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOwogCXRoaXMudW5pcXVlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5ncyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKKwl0aGlzLnVuaXF1ZVBvbHltb3JwaGljTWV0aG9kQmluZGluZ3MgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CisJdGhpcy5taXNzaW5nVHlwZXMgPSBudWxsOwogCXRoaXMuYWNjZXNzUmVzdHJpY3Rpb25zID0gbmV3IEhhc2hNYXAoMyk7CiAJdGhpcy5jbGFzc0ZpbGVQb29sID0gQ2xhc3NGaWxlUG9vbC5uZXdJbnN0YW5jZSgpOworCXRoaXMudHlwZXNCZWluZ0Nvbm5lY3RlZCA9IG5ldyBIYXNoU2V0KCk7CiB9CiAKIC8qKgpAQCAtOTMsMjAgKzExMCwxOSBAQAogICovCiAKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGFza0ZvclR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7Ci0JTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IG5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShjb21wb3VuZE5hbWUpOwotCWlmIChhbnN3ZXIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7CisJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IHRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlKGNvbXBvdW5kTmFtZSk7CisJaWYgKGFuc3dlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAotCWlmIChhbnN3ZXIuaXNCaW5hcnlUeXBlKCkpCisJaWYgKGFuc3dlci5pc0JpbmFyeVR5cGUoKSkgewogCQkvLyB0aGUgdHlwZSB3YXMgZm91bmQgYXMgYSAuY2xhc3MgZmlsZQotCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0QmluYXJ5VHlwZSgpLCBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lKSwgYW5zd2VyLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKCkpOwotCWVsc2UgaWYgKGFuc3dlci5pc0NvbXBpbGF0aW9uVW5pdCgpKQorCQl0aGlzLnR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRCaW5hcnlUeXBlKCksIGNvbXB1dGVQYWNrYWdlRnJvbShjb21wb3VuZE5hbWUsIGZhbHNlIC8qIHZhbGlkIHBrZyAqLyksIGFuc3dlci5nZXRBY2Nlc3NSZXN0cmljdGlvbigpKTsKKwl9IGVsc2UgaWYgKGFuc3dlci5pc0NvbXBpbGF0aW9uVW5pdCgpKSB7CiAJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIC5qYXZhIGZpbGUsIHRyeSB0byBidWlsZCBpdCB0aGVuIHNlYXJjaCB0aGUgY2FjaGUKLQkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldENvbXBpbGF0aW9uVW5pdCgpLCBhbnN3ZXIuZ2V0QWNjZXNzUmVzdHJpY3Rpb24oKSk7Ci0JZWxzZSBpZiAoYW5zd2VyLmlzU291cmNlVHlwZSgpKQorCQl0aGlzLnR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRDb21waWxhdGlvblVuaXQoKSwgYW5zd2VyLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKCkpOworCX0gZWxzZSBpZiAoYW5zd2VyLmlzU291cmNlVHlwZSgpKSB7CiAJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIHNvdXJjZSBtb2RlbAotCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0U291cmNlVHlwZXMoKSwgY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSksIGFuc3dlci5nZXRBY2Nlc3NSZXN0cmljdGlvbigpKTsKLQorCQl0aGlzLnR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRTb3VyY2VUeXBlcygpLCBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lLCBmYWxzZSAvKiB2YWxpZCBwa2cgKi8pLCBhbnN3ZXIuZ2V0QWNjZXNzUmVzdHJpY3Rpb24oKSk7CisJfQogCXJldHVybiBnZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7CiB9CiAvKiBBc2sgdGhlIG9yYWNsZSBmb3IgYSB0eXBlIG5hbWVkIG5hbWUgaW4gdGhlIHBhY2thZ2VCaW5kaW5nLgpAQCAtMTE1LDg0ICsxMzEsOTIgQEAKIAogUmVmZXJlbmNlQmluZGluZyBhc2tGb3JUeXBlKFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBjaGFyW10gbmFtZSkgewogCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsKSB7Ci0JCWlmIChkZWZhdWx0UGFja2FnZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXBhY2thZ2VCaW5kaW5nID0gZGVmYXVsdFBhY2thZ2U7CisJCXBhY2thZ2VCaW5kaW5nID0gdGhpcy5kZWZhdWx0UGFja2FnZTsKIAl9Ci0JTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IG5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShuYW1lLCBwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUpOworCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXIgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShuYW1lLCBwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUpOwogCWlmIChhbnN3ZXIgPT0gbnVsbCkKIAkJcmV0dXJuIG51bGw7CiAKLQlpZiAoYW5zd2VyLmlzQmluYXJ5VHlwZSgpKQorCWlmIChhbnN3ZXIuaXNCaW5hcnlUeXBlKCkpIHsKIAkJLy8gdGhlIHR5cGUgd2FzIGZvdW5kIGFzIGEgLmNsYXNzIGZpbGUKLQkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldEJpbmFyeVR5cGUoKSwgcGFja2FnZUJpbmRpbmcsIGFuc3dlci5nZXRBY2Nlc3NSZXN0cmljdGlvbigpKTsKLQllbHNlIGlmIChhbnN3ZXIuaXNDb21waWxhdGlvblVuaXQoKSkKKwkJdGhpcy50eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0QmluYXJ5VHlwZSgpLCBwYWNrYWdlQmluZGluZywgYW5zd2VyLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKCkpOworCX0gZWxzZSBpZiAoYW5zd2VyLmlzQ29tcGlsYXRpb25Vbml0KCkpIHsKIAkJLy8gdGhlIHR5cGUgd2FzIGZvdW5kIGFzIGEgLmphdmEgZmlsZSwgdHJ5IHRvIGJ1aWxkIGl0IHRoZW4gc2VhcmNoIHRoZSBjYWNoZQotCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGFuc3dlci5nZXRBY2Nlc3NSZXN0cmljdGlvbigpKTsKLQllbHNlIGlmIChhbnN3ZXIuaXNTb3VyY2VUeXBlKCkpCisJCXRyeSB7CisJCQl0aGlzLnR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRDb21waWxhdGlvblVuaXQoKSwgYW5zd2VyLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKCkpOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGFib3J0KSB7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkpCisJCQkJcmV0dXJuIG51bGw7IC8vIHNpbGVudGx5LCByZXF1ZXN0b3IgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZSBjb21waWxhdGlvbiB1bml0cyAoSGllcmFyY2h5UmVzb2x2ZXIpCisJCQl0aHJvdyBhYm9ydDsKKwkJfQorCX0gZWxzZSBpZiAoYW5zd2VyLmlzU291cmNlVHlwZSgpKSB7CiAJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIHNvdXJjZSBtb2RlbAotCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0U291cmNlVHlwZXMoKSwgcGFja2FnZUJpbmRpbmcsIGFuc3dlci5nZXRBY2Nlc3NSZXN0cmljdGlvbigpKTsKLQorCQl0aGlzLnR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRTb3VyY2VUeXBlcygpLCBwYWNrYWdlQmluZGluZywgYW5zd2VyLmdldEFjY2Vzc1Jlc3RyaWN0aW9uKCkpOworCX0KIAlyZXR1cm4gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZTAobmFtZSk7CiB9CisKIC8qIENyZWF0ZSB0aGUgaW5pdGlhbCB0eXBlIGJpbmRpbmdzIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4KICoKICogU2VlIGNvbXBsZXRlVHlwZUJpbmRpbmdzKCkgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlbWFpbmluZyBzdGVwcwogKgogKiBOT1RFOiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIGFkZGl0aW9uYWwgc291cmNlIGZpbGVzIGFyZSBuZWVkZWQKICovCi0KIHB1YmxpYyB2b2lkIGJ1aWxkVHlwZUJpbmRpbmdzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsIEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7CiAJQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUgPSBuZXcgQ29tcGlsYXRpb25Vbml0U2NvcGUodW5pdCwgdGhpcyk7CiAJc2NvcGUuYnVpbGRUeXBlQmluZGluZ3MoYWNjZXNzUmVzdHJpY3Rpb24pOwotCi0JaW50IHVuaXRzTGVuZ3RoID0gdW5pdHMubGVuZ3RoOwotCWlmICgrK2xhc3RVbml0SW5kZXggPj0gdW5pdHNMZW5ndGgpCi0JCVN5c3RlbS5hcnJheWNvcHkodW5pdHMsIDAsIHVuaXRzID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uWzIgKiB1bml0c0xlbmd0aF0sIDAsIHVuaXRzTGVuZ3RoKTsKLQl1bml0c1tsYXN0VW5pdEluZGV4XSA9IHVuaXQ7CisJaW50IHVuaXRzTGVuZ3RoID0gdGhpcy51bml0cy5sZW5ndGg7CisJaWYgKCsrdGhpcy5sYXN0VW5pdEluZGV4ID49IHVuaXRzTGVuZ3RoKQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudW5pdHMsIDAsIHRoaXMudW5pdHMgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bMiAqIHVuaXRzTGVuZ3RoXSwgMCwgdW5pdHNMZW5ndGgpOworCXRoaXMudW5pdHNbdGhpcy5sYXN0VW5pdEluZGV4XSA9IHVuaXQ7CiB9CisKIC8qIENhY2hlIHRoZSBiaW5hcnkgdHlwZSBzaW5jZSB3ZSBrbm93IGl0IGlzIG5lZWRlZCBkdXJpbmcgdGhpcyBjb21waWxlLgogKgogKiBBbnN3ZXIgdGhlIGNyZWF0ZWQgQmluYXJ5VHlwZUJpbmRpbmcgb3IgbnVsbCBpZiB0aGUgdHlwZSBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZS4KICovCi0KIHB1YmxpYyBCaW5hcnlUeXBlQmluZGluZyBjYWNoZUJpbmFyeVR5cGUoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKIAlyZXR1cm4gY2FjaGVCaW5hcnlUeXBlKGJpbmFyeVR5cGUsIHRydWUsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIH0KKwogLyogQ2FjaGUgdGhlIGJpbmFyeSB0eXBlIHNpbmNlIHdlIGtub3cgaXQgaXMgbmVlZGVkIGR1cmluZyB0aGlzIGNvbXBpbGUuCiAqCiAqIEFuc3dlciB0aGUgY3JlYXRlZCBCaW5hcnlUeXBlQmluZGluZyBvciBudWxsIGlmIHRoZSB0eXBlIGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlLgogKi8KLQogcHVibGljIEJpbmFyeVR5cGVCaW5kaW5nIGNhY2hlQmluYXJ5VHlwZShJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbikgewogCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIGJpbmFyeVR5cGUuZ2V0TmFtZSgpKTsKIAlSZWZlcmVuY2VCaW5kaW5nIGV4aXN0aW5nVHlwZSA9IGdldENhY2hlZFR5cGUoY29tcG91bmROYW1lKTsKIAogCWlmIChleGlzdGluZ1R5cGUgPT0gbnVsbCB8fCBleGlzdGluZ1R5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKIAkJLy8gb25seSBhZGQgdGhlIGJpbmFyeSB0eXBlIGlmIGl0cyBub3QgYWxyZWFkeSBpbiB0aGUgY2FjaGUKLQkJcmV0dXJuIGNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIGNvbXB1dGVQYWNrYWdlRnJvbShjb21wb3VuZE5hbWUpLCBuZWVkRmllbGRzQW5kTWV0aG9kcywgYWNjZXNzUmVzdHJpY3Rpb24pOworCQlyZXR1cm4gY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSwgZmFsc2UgLyogdmFsaWQgcGtnICovKSwgbmVlZEZpZWxkc0FuZE1ldGhvZHMsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAlyZXR1cm4gbnVsbDsgLy8gdGhlIHR5cGUgYWxyZWFkeSBleGlzdHMgJiBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhY2hlCiB9Ci1wdWJsaWMgQmluYXJ5VHlwZUJpbmRpbmcgY2FjaGVNaXNzaW5nQmluYXJ5VHlwZShjaGFyW11bXSBjb21wb3VuZE5hbWUsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKLQkvLyByZXBvcnQgdGhlIG1pc3NpbmcgY2xhc3MgZmlsZSBmaXJzdAotCXByb2JsZW1SZXBvcnRlci5pc0NsYXNzUGF0aENvcnJlY3QoCi0JCWNvbXBvdW5kTmFtZSwgCi0JCXVuaXQgPT0gbnVsbCA/IHRoaXMudW5pdEJlaW5nQ29tcGxldGVkIDogdW5pdCwgCi0JCXRoaXMubWlzc2luZ0NsYXNzRmlsZUxvY2F0aW9uKTsKIAotCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSk7Ci0JLy8gY3JlYXRlIGEgcHJveHkgZm9yIHRoZSBtaXNzaW5nIEJpbmFyeVR5cGUKLQlNaXNzaW5nQmluYXJ5VHlwZUJpbmRpbmcgdHlwZSA9IG5ldyBNaXNzaW5nQmluYXJ5VHlwZUJpbmRpbmcocGFja2FnZUJpbmRpbmcsIGNvbXBvdW5kTmFtZSwgdGhpcyk7Ci0JaWYgKHR5cGUuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7Ci0JCS8vIG1ha2UgT2JqZWN0IGJlIGl0cyBzdXBlcmNsYXNzIC0gaXQgY291bGQgaW4gdHVybiBiZSBtaXNzaW5nIGFzIHdlbGwKLQkJUmVmZXJlbmNlQmluZGluZyBvYmplY3RUeXBlID0gZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QpOwotCQlpZiAob2JqZWN0VHlwZSA9PSBudWxsKQotCQkJb2JqZWN0VHlwZSA9IGNhY2hlTWlzc2luZ0JpbmFyeVR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCB1bml0KTsJLy8gY3JlYXRlIGEgcHJveHkgZm9yIHRoZSBtaXNzaW5nIE9iamVjdCB0eXBlCQkKLQkJdHlwZS5zZXRNaXNzaW5nU3VwZXJjbGFzcyhvYmplY3RUeXBlKTsKK3B1YmxpYyB2b2lkIGNvbXBsZXRlVHlwZUJpbmRpbmdzKCkgeworCXRoaXMuc3RlcENvbXBsZXRlZCA9IEJVSUxEX1RZUEVfSElFUkFSQ0hZOworCisJZm9yIChpbnQgaSA9IHRoaXMubGFzdENvbXBsZXRlZFVuaXRJbmRleCArIDE7IGkgPD0gdGhpcy5sYXN0VW5pdEluZGV4OyBpKyspIHsKKwkgICAgKHRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gdGhpcy51bml0c1tpXSkuc2NvcGUuY2hlY2tBbmRTZXRJbXBvcnRzKCk7CiAJfQotCXBhY2thZ2VCaW5kaW5nLmFkZFR5cGUodHlwZSk7Ci0JcmV0dXJuIHR5cGU7CQorCXRoaXMuc3RlcENvbXBsZXRlZCA9IENIRUNLX0FORF9TRVRfSU1QT1JUUzsKKworCWZvciAoaW50IGkgPSB0aGlzLmxhc3RDb21wbGV0ZWRVbml0SW5kZXggKyAxOyBpIDw9IHRoaXMubGFzdFVuaXRJbmRleDsgaSsrKSB7CisJICAgICh0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IHRoaXMudW5pdHNbaV0pLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisJfQorCXRoaXMuc3RlcENvbXBsZXRlZCA9IENPTk5FQ1RfVFlQRV9ISUVSQVJDSFk7CisKKwlmb3IgKGludCBpID0gdGhpcy5sYXN0Q29tcGxldGVkVW5pdEluZGV4ICsgMTsgaSA8PSB0aGlzLmxhc3RVbml0SW5kZXg7IGkrKykgeworCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSAodGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSB0aGlzLnVuaXRzW2ldKS5zY29wZTsKKwkJdW5pdFNjb3BlLmNoZWNrUGFyYW1ldGVyaXplZFR5cGVzKCk7CisJCXVuaXRTY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsKKwkJdGhpcy51bml0c1tpXSA9IG51bGw7IC8vIHJlbGVhc2UgdW5uZWNlc3NhcnkgcmVmZXJlbmNlIHRvIHRoZSBwYXJzZWQgdW5pdAorCX0KKwl0aGlzLnN0ZXBDb21wbGV0ZWQgPSBCVUlMRF9GSUVMRFNfQU5EX01FVEhPRFM7CisJdGhpcy5sYXN0Q29tcGxldGVkVW5pdEluZGV4ID0gdGhpcy5sYXN0VW5pdEluZGV4OworCXRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gbnVsbDsKIH0KKwogLyoKICogMS4gQ29ubmVjdCB0aGUgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSB0eXBlIGJpbmRpbmdzIGNyZWF0ZWQgZm9yIHBhcnNlZFVuaXRzLgogKiAyLiBDcmVhdGUgdGhlIGZpZWxkIGJpbmRpbmdzCkBAIC0yMDUsMzEgKzIyOSwyOCBAQAogKiBjYXNlIGVpdGhlciB0aGUgZmF1bHR5IGltcG9ydC9zdXBlcmludGVyZmFjZS9maWVsZC9tZXRob2Qgd2lsbCBiZSBza2lwcGVkIG9yIGEKICogc3VpdGFibGUgcmVwbGFjZW1lbnQgd2lsbCBiZSBzdWJzdGl0dXRlZCAoc3VjaCBhcyBPYmplY3QgZm9yIGEgbWlzc2luZyBzdXBlcmNsYXNzKQogKi8KK3B1YmxpYyB2b2lkIGNvbXBsZXRlVHlwZUJpbmRpbmdzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQpIHsKKwlpZiAodGhpcy5zdGVwQ29tcGxldGVkID09IEJVSUxEX0ZJRUxEU19BTkRfTUVUSE9EUykgeworCQkvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBiZWNhdXNlIHRoZSBvcmlnaW5hbCBzZXQgb2YgdW5pdHMgYXJlIGNvbXBsZXRlbHkgYnVpbHQgYW5kCisJCS8vIGFyZSBub3cgYmVpbmcgcHJvY2Vzc2VkLCBzbyB3ZSB3YW50IHRvIHRyZWF0IGFsbCB0aGUgYWRkaXRpb25hbCB1bml0cyBhcyBhIGdyb3VwCisJCS8vIHVudGlsIHRoZXkgdG9vIGFyZSBjb21wbGV0ZWx5IHByb2Nlc3NlZC4KKwkJY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwl9IGVsc2UgeworCQlpZiAocGFyc2VkVW5pdC5zY29wZSA9PSBudWxsKSByZXR1cm47IC8vIHBhcnNpbmcgZXJyb3JzIHdlcmUgdG9vIHNldmVyZQogCi1wdWJsaWMgdm9pZCBjb21wbGV0ZVR5cGVCaW5kaW5ncygpIHsKLQlzdGVwQ29tcGxldGVkID0gQlVJTERfVFlQRV9ISUVSQVJDSFk7Ci0JCi0JZm9yIChpbnQgaSA9IHRoaXMubGFzdENvbXBsZXRlZFVuaXRJbmRleCArIDE7IGkgPD0gdGhpcy5sYXN0VW5pdEluZGV4OyBpKyspIHsKLQkgICAgKHRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gdGhpcy51bml0c1tpXSkuc2NvcGUuY2hlY2tBbmRTZXRJbXBvcnRzKCk7Ci0JfQotCXN0ZXBDb21wbGV0ZWQgPSBDSEVDS19BTkRfU0VUX0lNUE9SVFM7CisJCWlmICh0aGlzLnN0ZXBDb21wbGV0ZWQgPj0gQ0hFQ0tfQU5EX1NFVF9JTVBPUlRTKQorCQkJKHRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gcGFyc2VkVW5pdCkuc2NvcGUuY2hlY2tBbmRTZXRJbXBvcnRzKCk7CiAKLQlmb3IgKGludCBpID0gdGhpcy5sYXN0Q29tcGxldGVkVW5pdEluZGV4ICsgMTsgaSA8PSB0aGlzLmxhc3RVbml0SW5kZXg7IGkrKykgewotCSAgICAodGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSB0aGlzLnVuaXRzW2ldKS5zY29wZS5jb25uZWN0VHlwZUhpZXJhcmNoeSgpOwotCX0KLQlzdGVwQ29tcGxldGVkID0gQ09OTkVDVF9UWVBFX0hJRVJBUkNIWTsKKwkJaWYgKHRoaXMuc3RlcENvbXBsZXRlZCA+PSBDT05ORUNUX1RZUEVfSElFUkFSQ0hZKQorCQkJKHRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gcGFyc2VkVW5pdCkuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKIAotCWZvciAoaW50IGkgPSB0aGlzLmxhc3RDb21wbGV0ZWRVbml0SW5kZXggKyAxOyBpIDw9IHRoaXMubGFzdFVuaXRJbmRleDsgaSsrKSB7Ci0JCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSA9ICh0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IHRoaXMudW5pdHNbaV0pLnNjb3BlOwotCQl1bml0U2NvcGUuY2hlY2tQYXJhbWV0ZXJpemVkVHlwZXMoKTsKLQkJdW5pdFNjb3BlLmJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOwotCQl0aGlzLnVuaXRzW2ldID0gbnVsbDsgLy8gcmVsZWFzZSB1bm5lY2Vzc2FyeSByZWZlcmVuY2UgdG8gdGhlIHBhcnNlZCB1bml0CisJCXRoaXMudW5pdEJlaW5nQ29tcGxldGVkID0gbnVsbDsKIAl9Ci0Jc3RlcENvbXBsZXRlZCA9IEJVSUxEX0ZJRUxEU19BTkRfTUVUSE9EUzsKLQl0aGlzLmxhc3RDb21wbGV0ZWRVbml0SW5kZXggPSB0aGlzLmxhc3RVbml0SW5kZXg7Ci0JdGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSBudWxsOwogfQorCiAvKgorKiBVc2VkIGJ5IG90aGVyIGNvbXBpbGVyIHRvb2xzIHdoaWNoIGRvIG5vdCBzdGFydCBieSBjYWxsaW5nIGNvbXBsZXRlVHlwZUJpbmRpbmdzKCkuCisqCiAqIDEuIENvbm5lY3QgdGhlIHR5cGUgaGllcmFyY2h5IGZvciB0aGUgdHlwZSBiaW5kaW5ncyBjcmVhdGVkIGZvciBwYXJzZWRVbml0cy4KICogMi4gQ3JlYXRlIHRoZSBmaWVsZCBiaW5kaW5ncwogKiAzLiBDcmVhdGUgdGhlIG1ldGhvZCBiaW5kaW5ncwpAQCAtMjQwLDQzICsyNjEsNjIgQEAKICogY2FzZSBlaXRoZXIgdGhlIGZhdWx0eSBpbXBvcnQvc3VwZXJpbnRlcmZhY2UvZmllbGQvbWV0aG9kIHdpbGwgYmUgc2tpcHBlZCBvciBhCiAqIHN1aXRhYmxlIHJlcGxhY2VtZW50IHdpbGwgYmUgc3Vic3RpdHV0ZWQgKHN1Y2ggYXMgT2JqZWN0IGZvciBhIG1pc3Npbmcgc3VwZXJjbGFzcykKICovCi0KLXB1YmxpYyB2b2lkIGNvbXBsZXRlVHlwZUJpbmRpbmdzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQpIHsKLQlpZiAoc3RlcENvbXBsZXRlZCA9PSBCVUlMRF9GSUVMRFNfQU5EX01FVEhPRFMpIHsKLQkJLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gYmVjYXVzZSB0aGUgb3JpZ2luYWwgc2V0IG9mIHVuaXRzIGFyZSBjb21wbGV0ZWx5IGJ1aWx0IGFuZAotCQkvLyBhcmUgbm93IGJlaW5nIHByb2Nlc3NlZCwgc28gd2Ugd2FudCB0byB0cmVhdCBhbGwgdGhlIGFkZGl0aW9uYWwgdW5pdHMgYXMgYSBncm91cAotCQkvLyB1bnRpbCB0aGV5IHRvbyBhcmUgY29tcGxldGVseSBwcm9jZXNzZWQuCi0JCWNvbXBsZXRlVHlwZUJpbmRpbmdzKCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcnNlZFVuaXQuc2NvcGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBwYXJzaW5nIGVycm9ycyB3ZXJlIHRvbyBzZXZlcmUKLQkJCi0JCWlmIChzdGVwQ29tcGxldGVkID49IENIRUNLX0FORF9TRVRfSU1QT1JUUykKLQkJCSh0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IHBhcnNlZFVuaXQpLnNjb3BlLmNoZWNrQW5kU2V0SW1wb3J0cygpOwotCi0JCWlmIChzdGVwQ29tcGxldGVkID49IENPTk5FQ1RfVFlQRV9ISUVSQVJDSFkpCi0JCQkodGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSBwYXJzZWRVbml0KS5zY29wZS5jb25uZWN0VHlwZUhpZXJhcmNoeSgpOwotCQkKLQkJdGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSBudWxsOwotCX0KLX0KLS8qCi0qIFVzZWQgYnkgb3RoZXIgY29tcGlsZXIgdG9vbHMgd2hpY2ggZG8gbm90IHN0YXJ0IGJ5IGNhbGxpbmcgY29tcGxldGVUeXBlQmluZGluZ3MoKS4KLSoKLSogMS4gQ29ubmVjdCB0aGUgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSB0eXBlIGJpbmRpbmdzIGNyZWF0ZWQgZm9yIHBhcnNlZFVuaXRzLgotKiAyLiBDcmVhdGUgdGhlIGZpZWxkIGJpbmRpbmdzCi0qIDMuIENyZWF0ZSB0aGUgbWV0aG9kIGJpbmRpbmdzCi0qLwotCiBwdWJsaWMgdm9pZCBjb21wbGV0ZVR5cGVCaW5kaW5ncyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0LCBib29sZWFuIGJ1aWxkRmllbGRzQW5kTWV0aG9kcykgewogCWlmIChwYXJzZWRVbml0LnNjb3BlID09IG51bGwpIHJldHVybjsgLy8gcGFyc2luZyBlcnJvcnMgd2VyZSB0b28gc2V2ZXJlCiAKIAkodGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSBwYXJzZWRVbml0KS5zY29wZS5jaGVja0FuZFNldEltcG9ydHMoKTsKIAlwYXJzZWRVbml0LnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7Ci0JcGFyc2VkVW5pdC5zY29wZS5jaGVja1BhcmFtZXRlcml6ZWRUeXBlcygpOwkKKwlwYXJzZWRVbml0LnNjb3BlLmNoZWNrUGFyYW1ldGVyaXplZFR5cGVzKCk7CiAJaWYgKGJ1aWxkRmllbGRzQW5kTWV0aG9kcykKIAkJcGFyc2VkVW5pdC5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsKIAl0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IG51bGw7CiB9CisKKy8qCisqIFVzZWQgYnkgb3RoZXIgY29tcGlsZXIgdG9vbHMgd2hpY2ggZG8gbm90IHN0YXJ0IGJ5IGNhbGxpbmcgY29tcGxldGVUeXBlQmluZGluZ3MoKQorKiBhbmQgaGF2ZSBtb3JlIHRoYW4gMSB1bml0IHRvIGNvbXBsZXRlLgorKgorKiAxLiBDb25uZWN0IHRoZSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhlIHR5cGUgYmluZGluZ3MgY3JlYXRlZCBmb3IgcGFyc2VkVW5pdHMuCisqIDIuIENyZWF0ZSB0aGUgZmllbGQgYmluZGluZ3MKKyogMy4gQ3JlYXRlIHRoZSBtZXRob2QgYmluZGluZ3MKKyovCitwdWJsaWMgdm9pZCBjb21wbGV0ZVR5cGVCaW5kaW5ncyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHBhcnNlZFVuaXRzLCBib29sZWFuW10gYnVpbGRGaWVsZHNBbmRNZXRob2RzLCBpbnQgdW5pdENvdW50KSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0Q291bnQ7IGkrKykgeworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2VkVW5pdHNbaV07CisJCWlmIChwYXJzZWRVbml0LnNjb3BlICE9IG51bGwpCisJCQkodGhpcy51bml0QmVpbmdDb21wbGV0ZWQgPSBwYXJzZWRVbml0KS5zY29wZS5jaGVja0FuZFNldEltcG9ydHMoKTsKKwl9CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRDb3VudDsgaSsrKSB7CisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZWRVbml0c1tpXTsKKwkJaWYgKHBhcnNlZFVuaXQuc2NvcGUgIT0gbnVsbCkKKwkJCSh0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IHBhcnNlZFVuaXQpLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisJfQorCisJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0Q291bnQ7IGkrKykgeworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2VkVW5pdHNbaV07CisJCWlmIChwYXJzZWRVbml0LnNjb3BlICE9IG51bGwpIHsKKwkJCSh0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IHBhcnNlZFVuaXQpLnNjb3BlLmNoZWNrUGFyYW1ldGVyaXplZFR5cGVzKCk7CisJCQlpZiAoYnVpbGRGaWVsZHNBbmRNZXRob2RzW2ldKQorCQkJCXBhcnNlZFVuaXQuc2NvcGUuYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7CisJCX0KKwl9CisKKwl0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCA9IG51bGw7Cit9CitwdWJsaWMgTWV0aG9kQmluZGluZyBjb21wdXRlQXJyYXlDbG9uZShNZXRob2RCaW5kaW5nIG9iamVjdENsb25lKSB7CisJaWYgKHRoaXMuYXJyYXlDbG9uZSA9PSBudWxsKSB7CisJCXRoaXMuYXJyYXlDbG9uZSA9IG5ldyBNZXRob2RCaW5kaW5nKAorCQkJCShvYmplY3RDbG9uZS5tb2RpZmllcnMgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljLAorCQkJCVR5cGVDb25zdGFudHMuQ0xPTkUsCisJCQkJb2JqZWN0Q2xvbmUucmV0dXJuVHlwZSwKKwkJCQlCaW5kaW5nLk5PX1BBUkFNRVRFUlMsCisJCQkJQmluZGluZy5OT19FWENFUFRJT05TLCAvLyBubyBleGNlcHRpb24gZm9yIGFycmF5IHNwZWNpZmljIG1ldGhvZAorCQkJCShSZWZlcmVuY2VCaW5kaW5nKW9iamVjdENsb25lLnJldHVyblR5cGUpOworCX0KKwlyZXR1cm4gdGhpcy5hcnJheUNsb25lOworCQorfQogcHVibGljIFR5cGVCaW5kaW5nIGNvbXB1dGVCb3hpbmdUeXBlKFR5cGVCaW5kaW5nIHR5cGUpIHsKIAlUeXBlQmluZGluZyBib3hlZFR5cGU7CiAJc3dpdGNoICh0eXBlLmlkKSB7CkBAIC0zMDAsMzUgKzM0MCwzNSBAQAogCQljYXNlIFR5cGVJZHMuVF9pbnQgOgogCQkJYm94ZWRUeXBlID0gZ2V0VHlwZShKQVZBX0xBTkdfSU5URUdFUik7CiAJCQlpZiAoYm94ZWRUeXBlICE9IG51bGwpIHJldHVybiBib3hlZFR5cGU7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19JTlRFR0VSLCBudWxsLCBOb3RGb3VuZCk7CQkJCQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhKQVZBX0xBTkdfSU5URUdFUiwgbnVsbCwgTm90Rm91bmQpOwogCQljYXNlIFR5cGVJZHMuVF9ieXRlIDoKIAkJCWJveGVkVHlwZSA9IGdldFR5cGUoSkFWQV9MQU5HX0JZVEUpOwogCQkJaWYgKGJveGVkVHlwZSAhPSBudWxsKSByZXR1cm4gYm94ZWRUeXBlOwotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhKQVZBX0xBTkdfQllURSwgbnVsbCwgTm90Rm91bmQpOwkJCQkKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoSkFWQV9MQU5HX0JZVEUsIG51bGwsIE5vdEZvdW5kKTsKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJYm94ZWRUeXBlID0gZ2V0VHlwZShKQVZBX0xBTkdfU0hPUlQpOwogCQkJaWYgKGJveGVkVHlwZSAhPSBudWxsKSByZXR1cm4gYm94ZWRUeXBlOwotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhKQVZBX0xBTkdfU0hPUlQsIG51bGwsIE5vdEZvdW5kKTsJCQkJCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19TSE9SVCwgbnVsbCwgTm90Rm91bmQpOwogCQljYXNlIFR5cGVJZHMuVF9jaGFyIDoKIAkJCWJveGVkVHlwZSA9IGdldFR5cGUoSkFWQV9MQU5HX0NIQVJBQ1RFUik7CiAJCQlpZiAoYm94ZWRUeXBlICE9IG51bGwpIHJldHVybiBib3hlZFR5cGU7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19DSEFSQUNURVIsIG51bGwsIE5vdEZvdW5kKTsJCQkJCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19DSEFSQUNURVIsIG51bGwsIE5vdEZvdW5kKTsKIAkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CiAJCQlib3hlZFR5cGUgPSBnZXRUeXBlKEpBVkFfTEFOR19MT05HKTsKIAkJCWlmIChib3hlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIGJveGVkVHlwZTsKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoSkFWQV9MQU5HX0xPTkcsIG51bGwsIE5vdEZvdW5kKTsJCQkJCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19MT05HLCBudWxsLCBOb3RGb3VuZCk7CiAJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKIAkJCWJveGVkVHlwZSA9IGdldFR5cGUoSkFWQV9MQU5HX0ZMT0FUKTsKIAkJCWlmIChib3hlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIGJveGVkVHlwZTsKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoSkFWQV9MQU5HX0ZMT0FULCBudWxsLCBOb3RGb3VuZCk7CQkJCQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhKQVZBX0xBTkdfRkxPQVQsIG51bGwsIE5vdEZvdW5kKTsKIAkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKIAkJCWJveGVkVHlwZSA9IGdldFR5cGUoSkFWQV9MQU5HX0RPVUJMRSk7CiAJCQlpZiAoYm94ZWRUeXBlICE9IG51bGwpIHJldHVybiBib3hlZFR5cGU7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19ET1VCTEUsIG51bGwsIE5vdEZvdW5kKTsJCQkJCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19ET1VCTEUsIG51bGwsIE5vdEZvdW5kKTsKIAkJY2FzZSBUeXBlSWRzLlRfYm9vbGVhbiA6CiAJCQlib3hlZFR5cGUgPSBnZXRUeXBlKEpBVkFfTEFOR19CT09MRUFOKTsKIAkJCWlmIChib3hlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIGJveGVkVHlwZTsKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoSkFWQV9MQU5HX0JPT0xFQU4sIG51bGwsIE5vdEZvdW5kKTsJCQkJCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKEpBVkFfTEFOR19CT09MRUFOLCBudWxsLCBOb3RGb3VuZCk7CiAvLwkJY2FzZSBUeXBlSWRzLlRfaW50IDoKIC8vCQkJcmV0dXJuIGdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfSU5URUdFUiwgbnVsbCk7CiAvLwkJY2FzZSBUeXBlSWRzLlRfYnl0ZSA6CkBAIC0zNDksNiArMzg5LDcgQEAKIAkvLyBhbGxvdyBpbmRpcmVjdCB1bmJveGluZyBjb252ZXJzaW9uIGZvciB3aWxkY2FyZHMgYW5kIHR5cGUgcGFyYW1ldGVycwogCXN3aXRjaCAodHlwZS5raW5kKCkpIHsKIAkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOgogCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgogCQkJc3dpdGNoICh0eXBlLmVyYXN1cmUoKS5pZCkgewogCQkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nQm9vbGVhbiA6CkBAIC0zNzAsMjEgKzQxMSwyNiBAQAogCQkJfQogCX0KIAlyZXR1cm4gdHlwZTsKLX0JCi1wcml2YXRlIFBhY2thZ2VCaW5kaW5nIGNvbXB1dGVQYWNrYWdlRnJvbShjaGFyW11bXSBjb25zdGFudFBvb2xOYW1lKSB7Cit9CisKK3ByaXZhdGUgUGFja2FnZUJpbmRpbmcgY29tcHV0ZVBhY2thZ2VGcm9tKGNoYXJbXVtdIGNvbnN0YW50UG9vbE5hbWUsIGJvb2xlYW4gaXNNaXNzaW5nKSB7CiAJaWYgKGNvbnN0YW50UG9vbE5hbWUubGVuZ3RoID09IDEpCi0JCXJldHVybiBkZWZhdWx0UGFja2FnZTsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFBhY2thZ2U7CiAKIAlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbnN0YW50UG9vbE5hbWVbMF0pOwogCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IFRoZU5vdEZvdW5kUGFja2FnZSkgewogCQlwYWNrYWdlQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyhjb25zdGFudFBvb2xOYW1lWzBdLCB0aGlzKTsKLQkJa25vd25QYWNrYWdlcy5wdXQoY29uc3RhbnRQb29sTmFtZVswXSwgcGFja2FnZUJpbmRpbmcpOworCQlpZiAoaXNNaXNzaW5nKSBwYWNrYWdlQmluZGluZy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCXRoaXMua25vd25QYWNrYWdlcy5wdXQoY29uc3RhbnRQb29sTmFtZVswXSwgcGFja2FnZUJpbmRpbmcpOwogCX0KIAogCWZvciAoaW50IGkgPSAxLCBsZW5ndGggPSBjb25zdGFudFBvb2xOYW1lLmxlbmd0aCAtIDE7IGkgPCBsZW5ndGg7IGkrKykgewogCQlQYWNrYWdlQmluZGluZyBwYXJlbnQgPSBwYWNrYWdlQmluZGluZzsKIAkJaWYgKChwYWNrYWdlQmluZGluZyA9IHBhcmVudC5nZXRQYWNrYWdlMChjb25zdGFudFBvb2xOYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpIHsKIAkJCXBhY2thZ2VCaW5kaW5nID0gbmV3IFBhY2thZ2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29uc3RhbnRQb29sTmFtZSwgMCwgaSArIDEpLCBwYXJlbnQsIHRoaXMpOworCQkJaWYgKGlzTWlzc2luZykgeworCQkJCXBhY2thZ2VCaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCX0KIAkJCXBhcmVudC5hZGRQYWNrYWdlKHBhY2thZ2VCaW5kaW5nKTsKIAkJfQogCX0KQEAgLTQwMiw4ICs0NDgsOCBAQAogCQlSZWZlcmVuY2VCaW5kaW5nIGNvbnZlcnRlZEVuY2xvc2luZ1R5cGUgPSBvcmlnaW5hbEVuY2xvc2luZ1R5cGU7CiAJCWJvb2xlYW4gbmVlZFRvQ29udmVydCA9IGlzR2VuZXJpYzsKIAkJaWYgKG9yaWdpbmFsRW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQljb252ZXJ0ZWRFbmNsb3NpbmdUeXBlID0gb3JpZ2luYWxUeXBlLmlzU3RhdGljKCkgCi0JCQkJPyAoUmVmZXJlbmNlQmluZGluZykgY29udmVydFRvUmF3VHlwZShvcmlnaW5hbEVuY2xvc2luZ1R5cGUpIAorCQkJY29udmVydGVkRW5jbG9zaW5nVHlwZSA9IG9yaWdpbmFsVHlwZS5pc1N0YXRpYygpCisJCQkJPyAoUmVmZXJlbmNlQmluZGluZykgY29udmVydFRvUmF3VHlwZShvcmlnaW5hbEVuY2xvc2luZ1R5cGUsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pCiAJCQkJOiBjb252ZXJ0VG9QYXJhbWV0ZXJpemVkVHlwZShvcmlnaW5hbEVuY2xvc2luZ1R5cGUpOwogCQkJbmVlZFRvQ29udmVydCB8PSBvcmlnaW5hbEVuY2xvc2luZ1R5cGUgIT0gY29udmVydGVkRW5jbG9zaW5nVHlwZTsKIAkJfQpAQCAtNDE0LDEzICs0NjAsMjAgQEAKIAlyZXR1cm4gb3JpZ2luYWxUeXBlOwogfQogCi1wdWJsaWMgVHlwZUJpbmRpbmcgY29udmVydFRvUmF3VHlwZShUeXBlQmluZGluZyB0eXBlKSB7CisvKioKKyAqIFJldHVybnMgdGhlIGdpdmVuIGJpbmRpbmcncyByYXcgdHlwZSBiaW5kaW5nLgorICogQHBhcmFtIHR5cGUgdGhlIFR5cGVCaW5kaW5nIHRvIHJhdyBjb252ZXJ0CisgKiBAcGFyYW0gZm9yY2VSYXdFbmNsb3NpbmdUeXBlIGZvcmNlcyByZWN1cnNpdmUgcmF3IGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzICh1c2VkIGluIEphdmFkb2MgcmVmZXJlbmNlcyBvbmx5KQorICogQHJldHVybiBUeXBlQmluZGluZyB0aGUgcmF3IGNvbnZlcnRlZCBUeXBlQmluZGluZworICovCitwdWJsaWMgVHlwZUJpbmRpbmcgY29udmVydFRvUmF3VHlwZShUeXBlQmluZGluZyB0eXBlLCBib29sZWFuIGZvcmNlUmF3RW5jbG9zaW5nVHlwZSkgewogCWludCBkaW1lbnNpb247CiAJVHlwZUJpbmRpbmcgb3JpZ2luYWxUeXBlOwogCXN3aXRjaCh0eXBlLmtpbmQoKSkgewogCQljYXNlIEJpbmRpbmcuQkFTRV9UWVBFIDoKIAkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgogCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQljYXNlIEJpbmRpbmcuUkFXX1RZUEU6CiAJCQlyZXR1cm4gdHlwZTsKIAkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEU6CkBAIC00MjgsNyArNDgxLDcgQEAKIAkJCW9yaWdpbmFsVHlwZSA9IHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJaWYgKHR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSAKKwkJCWlmICh0eXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkKIAkJCQlyZXR1cm4gdHlwZTsgLy8gT2JqZWN0IGlzIG5vdCBnZW5lcmljCiAJCQlkaW1lbnNpb24gPSAwOwogCQkJb3JpZ2luYWxUeXBlID0gdHlwZTsKQEAgLTQ1Nyw4ICs1MTAsMTEgQEAKIAkJaWYgKG9yaWdpbmFsRW5jbG9zaW5nLmtpbmQoKSA9PSBCaW5kaW5nLlJBV19UWVBFKSB7CiAJCQluZWVkVG9Db252ZXJ0IHw9ICEoKFJlZmVyZW5jZUJpbmRpbmcpb3JpZ2luYWxUeXBlKS5pc1N0YXRpYygpOwogCQkJY29udmVydGVkRW5jbG9zaW5nID0gb3JpZ2luYWxFbmNsb3Npbmc7CisJCX0gZWxzZSBpZiAoZm9yY2VSYXdFbmNsb3NpbmdUeXBlICYmICFuZWVkVG9Db252ZXJ0LypzdG9wIHJlY3Vyc2lvbiB3aGVuIGNvbnZlcnNpb24gb2NjdXJzKi8pIHsKKwkJCWNvbnZlcnRlZEVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBjb252ZXJ0VG9SYXdUeXBlKG9yaWdpbmFsRW5jbG9zaW5nLCBmb3JjZVJhd0VuY2xvc2luZ1R5cGUpOworCQkJbmVlZFRvQ29udmVydCA9IG9yaWdpbmFsRW5jbG9zaW5nICE9IGNvbnZlcnRlZEVuY2xvc2luZzsgLy8gb25seSBjb252ZXJ0IGdlbmVyaWMgb3IgcGFyYW1ldGVyaXplZCB0eXBlcwogCQl9IGVsc2UgaWYgKG5lZWRUb0NvbnZlcnQgfHwgKChSZWZlcmVuY2VCaW5kaW5nKW9yaWdpbmFsVHlwZSkuaXNTdGF0aWMoKSkgewotCQkJY29udmVydGVkRW5jbG9zaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGNvbnZlcnRUb1Jhd1R5cGUob3JpZ2luYWxFbmNsb3NpbmcpOworCQkJY29udmVydGVkRW5jbG9zaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGNvbnZlcnRUb1Jhd1R5cGUob3JpZ2luYWxFbmNsb3NpbmcsIGZhbHNlKTsKIAkJfSBlbHNlIHsKIAkJCWNvbnZlcnRlZEVuY2xvc2luZyA9IGNvbnZlcnRUb1BhcmFtZXRlcml6ZWRUeXBlKG9yaWdpbmFsRW5jbG9zaW5nKTsKIAkJfQpAQCAtNDc2LDYgKzUzMiwyOCBAQAogCXJldHVybiB0eXBlOwogfQogCisvKioKKyAqIENvbnZlcnQgYW4gYXJyYXkgb2YgdHlwZXMgaW4gcmF3IGZvcm1zLgorICogT25seSBhbGxvY2F0ZSBhbiBhcnJheSBpZiBhbnl0aGluZyBpcyBkaWZmZXJlbnQuCisgKi8KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gY29udmVydFRvUmF3VHlwZXMoUmVmZXJlbmNlQmluZGluZ1tdIG9yaWdpbmFsVHlwZXMsIGJvb2xlYW4gZm9yY2VFcmFzdXJlLCBib29sZWFuIGZvcmNlUmF3RW5jbG9zaW5nVHlwZSkgeworCWlmIChvcmlnaW5hbFR5cGVzID09IG51bGwpIHJldHVybiBudWxsOworICAgIFJlZmVyZW5jZUJpbmRpbmdbXSBjb252ZXJ0ZWRUeXBlcyA9IG9yaWdpbmFsVHlwZXM7CisgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9yaWdpbmFsVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgUmVmZXJlbmNlQmluZGluZyBvcmlnaW5hbFR5cGUgPSBvcmlnaW5hbFR5cGVzW2ldOworICAgICAgICBSZWZlcmVuY2VCaW5kaW5nIGNvbnZlcnRlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgY29udmVydFRvUmF3VHlwZShmb3JjZUVyYXN1cmUgPyBvcmlnaW5hbFR5cGUuZXJhc3VyZSgpIDogb3JpZ2luYWxUeXBlLCBmb3JjZVJhd0VuY2xvc2luZ1R5cGUpOworICAgICAgICBpZiAoY29udmVydGVkVHlwZSAhPSBvcmlnaW5hbFR5cGUpIHsgICAgICAgIAorICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFR5cGVzID09IG9yaWdpbmFsVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVHlwZXMsIDAsIGNvbnZlcnRlZFR5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXSwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb252ZXJ0ZWRUeXBlc1tpXSA9IGNvbnZlcnRlZFR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoY29udmVydGVkVHlwZXMgIT0gb3JpZ2luYWxUeXBlcykgeworICAgICAgICAgICAgY29udmVydGVkVHlwZXNbaV0gPSBvcmlnaW5hbFR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbnZlcnRlZFR5cGVzOworfQorCiAvLyB2YXJpYXRpb24gZm9yIHVucmVzb2x2ZWQgdHlwZXMgaW4gYmluYXJpZXMgKGNvbnNpZGVyIGdlbmVyaWMgdHlwZSBhcyByYXcpCiBwdWJsaWMgVHlwZUJpbmRpbmcgY29udmVydFVucmVzb2x2ZWRCaW5hcnlUb1Jhd1R5cGUoVHlwZUJpbmRpbmcgdHlwZSkgewogCWludCBkaW1lbnNpb247CkBAIC00ODQsNiArNTYyLDcgQEAKIAkJY2FzZSBCaW5kaW5nLkJBU0VfVFlQRSA6CiAJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUjoKIAkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEU6CisJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRToKIAkJY2FzZSBCaW5kaW5nLlJBV19UWVBFOgogCQkJcmV0dXJuIHR5cGU7CiAJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFOgpAQCAtNDkxLDcgKzU3MCw3IEBACiAJCQlvcmlnaW5hbFR5cGUgPSB0eXBlLmxlYWZDb21wb25lbnRUeXBlKCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWlmICh0eXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkgCisJCQlpZiAodHlwZS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpCiAJCQkJcmV0dXJuIHR5cGU7IC8vIE9iamVjdCBpcyBub3QgZ2VuZXJpYwogCQkJZGltZW5zaW9uID0gMDsKIAkJCW9yaWdpbmFsVHlwZSA9IHR5cGU7CkBAIC01MjYsNyArNjA1LDcgQEAKIAkJCWNvbnZlcnRlZFR5cGUgPSBjcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgoUmVmZXJlbmNlQmluZGluZykgb3JpZ2luYWxUeXBlLmVyYXN1cmUoKSwgbnVsbCwgY29udmVydGVkRW5jbG9zaW5nKTsKIAkJfSBlbHNlIHsKIAkJCWNvbnZlcnRlZFR5cGUgPSBvcmlnaW5hbFR5cGU7Ci0JCX0JCQorCQl9CiAJfQogCWlmIChvcmlnaW5hbFR5cGUgIT0gY29udmVydGVkVHlwZSkgewogCQlyZXR1cm4gZGltZW5zaW9uID4gMCA/IChUeXBlQmluZGluZyljcmVhdGVBcnJheVR5cGUoY29udmVydGVkVHlwZSwgZGltZW5zaW9uKSA6IGNvbnZlcnRlZFR5cGU7CkBAIC01NTIsMTcgKzYzMSwxNyBAQAogCiAJLy8gZmluZCB0aGUgYXJyYXkgYmluZGluZyBjYWNoZSBmb3IgdGhpcyBkaW1lbnNpb24KIAlpbnQgZGltSW5kZXggPSBkaW1lbnNpb25Db3VudCAtIDE7Ci0JaW50IGxlbmd0aCA9IHVuaXF1ZUFycmF5QmluZGluZ3MubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLnVuaXF1ZUFycmF5QmluZGluZ3MubGVuZ3RoOwogCUFycmF5QmluZGluZ1tdIGFycmF5QmluZGluZ3M7CiAJaWYgKGRpbUluZGV4IDwgbGVuZ3RoKSB7Ci0JCWlmICgoYXJyYXlCaW5kaW5ncyA9IHVuaXF1ZUFycmF5QmluZGluZ3NbZGltSW5kZXhdKSA9PSBudWxsKQotCQkJdW5pcXVlQXJyYXlCaW5kaW5nc1tkaW1JbmRleF0gPSBhcnJheUJpbmRpbmdzID0gbmV3IEFycmF5QmluZGluZ1sxMF07CisJCWlmICgoYXJyYXlCaW5kaW5ncyA9IHRoaXMudW5pcXVlQXJyYXlCaW5kaW5nc1tkaW1JbmRleF0pID09IG51bGwpCisJCQl0aGlzLnVuaXF1ZUFycmF5QmluZGluZ3NbZGltSW5kZXhdID0gYXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbMTBdOwogCX0gZWxzZSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl1bmlxdWVBcnJheUJpbmRpbmdzLCAwLCAKLQkJCXVuaXF1ZUFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nW2RpbWVuc2lvbkNvdW50XVtdLCAwLCAKLQkJCWxlbmd0aCk7IAotCQl1bmlxdWVBcnJheUJpbmRpbmdzW2RpbUluZGV4XSA9IGFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nWzEwXTsKKwkJCXRoaXMudW5pcXVlQXJyYXlCaW5kaW5ncywgMCwKKwkJCXRoaXMudW5pcXVlQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbZGltZW5zaW9uQ291bnRdW10sIDAsCisJCQlsZW5ndGgpOworCQl0aGlzLnVuaXF1ZUFycmF5QmluZGluZ3NbZGltSW5kZXhdID0gYXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbMTBdOwogCX0KIAogCS8vIGZpbmQgdGhlIGNhY2hlZCBhcnJheSBiaW5kaW5nIGZvciB0aGlzIGxlYWYgY29tcG9uZW50IHR5cGUgKGlmIGFueSkKQEAgLTU4MCwxNiArNjU5LDE3IEBACiAJU3lzdGVtLmFycmF5Y29weSgKIAkJYXJyYXlCaW5kaW5ncywgMCwKIAkJKGFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nW2xlbmd0aCAqIDJdKSwgMCwKLQkJbGVuZ3RoKTsgCi0JdW5pcXVlQXJyYXlCaW5kaW5nc1tkaW1JbmRleF0gPSBhcnJheUJpbmRpbmdzOworCQlsZW5ndGgpOworCXRoaXMudW5pcXVlQXJyYXlCaW5kaW5nc1tkaW1JbmRleF0gPSBhcnJheUJpbmRpbmdzOwogCXJldHVybiBhcnJheUJpbmRpbmdzW2xlbmd0aF0gPSBuZXcgQXJyYXlCaW5kaW5nKGxlYWZDb21wb25lbnRUeXBlLCBkaW1lbnNpb25Db3VudCwgdGhpcyk7CiB9CiBwdWJsaWMgQmluYXJ5VHlwZUJpbmRpbmcgY3JlYXRlQmluYXJ5VHlwZUZyb20oSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcsIEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7CiAJcmV0dXJuIGNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nLCB0cnVlLCBhY2Nlc3NSZXN0cmljdGlvbik7CiB9CisKIHB1YmxpYyBCaW5hcnlUeXBlQmluZGluZyBjcmVhdGVCaW5hcnlUeXBlRnJvbShJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZywgYm9vbGVhbiBuZWVkRmllbGRzQW5kTWV0aG9kcywgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKIAlCaW5hcnlUeXBlQmluZGluZyBiaW5hcnlCaW5kaW5nID0gbmV3IEJpbmFyeVR5cGVCaW5kaW5nKHBhY2thZ2VCaW5kaW5nLCBiaW5hcnlUeXBlLCB0aGlzKTsKLQkKKwogCS8vIHJlc29sdmUgYW55IGFycmF5IGJpbmRpbmdzIHdoaWNoIHJlZmVyZW5jZSB0aGUgdW5yZXNvbHZlZFR5cGUKIAlSZWZlcmVuY2VCaW5kaW5nIGNhY2hlZFR5cGUgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlMChiaW5hcnlCaW5kaW5nLmNvbXBvdW5kTmFtZVtiaW5hcnlCaW5kaW5nLmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7CiAJaWYgKGNhY2hlZFR5cGUgIT0gbnVsbCkgeyAvLyB1cGRhdGUgcmVmZXJlbmNlIHRvIHVucmVzb2x2ZWQgYmluZGluZyBhZnRlciBoYXZpbmcgcmVhZCBjbGFzc2ZpbGUgKGtub3dzIHdoZXRoZXIgZ2VuZXJpYyBmb3IgcmF3IGNvbnZlcnNpb24pCkBAIC02MDMsMjAgKzY4Myw0OSBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9Ci0KIAlwYWNrYWdlQmluZGluZy5hZGRUeXBlKGJpbmFyeUJpbmRpbmcpOwogCXNldEFjY2Vzc1Jlc3RyaWN0aW9uKGJpbmFyeUJpbmRpbmcsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAliaW5hcnlCaW5kaW5nLmNhY2hlUGFydHNGcm9tKGJpbmFyeVR5cGUsIG5lZWRGaWVsZHNBbmRNZXRob2RzKTsKIAlyZXR1cm4gYmluYXJ5QmluZGluZzsKIH0KLS8qIFVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGZyb20gdGhlIHBhY2thZ2Ugc3RhdGVtZW50LgotKi8KIAorLyoKKyAqIFVzZWQgdG8gY3JlYXRlIHR5cGVzIGRlbm90aW5nIG1pc3NpbmcgdHlwZXMuCisgKiBJZiBwYWNrYWdlIGlzIGdpdmVuLCB0aGVuIHJldXNlIHRoZSBwYWNrYWdlOyBpZiBub3QgdGhlbiBpbmZlciBhIHBhY2thZ2UgZnJvbSBjb21wb3VuZCBuYW1lLgorICogSWYgdGhlIHBhY2thZ2UgaXMgZXhpc3RpbmcsIHRoZW4gaW5zdGFsbCB0aGUgbWlzc2luZyB0eXBlIGluIHR5cGUgY2FjaGUKKyovCitwdWJsaWMgTWlzc2luZ1R5cGVCaW5kaW5nIGNyZWF0ZU1pc3NpbmdUeXBlKFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsKKwkvLyBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIG1pc3NpbmcgQmluYXJ5VHlwZQorCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsKSB7CisJCXBhY2thZ2VCaW5kaW5nID0gY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSwgdHJ1ZSAvKiBtaXNzaW5nICovKTsKKwkJaWYgKHBhY2thZ2VCaW5kaW5nID09IFRoZU5vdEZvdW5kUGFja2FnZSkgcGFja2FnZUJpbmRpbmcgPSB0aGlzLmRlZmF1bHRQYWNrYWdlOworCX0KKwlNaXNzaW5nVHlwZUJpbmRpbmcgbWlzc2luZ1R5cGUgPSBuZXcgTWlzc2luZ1R5cGVCaW5kaW5nKHBhY2thZ2VCaW5kaW5nLCBjb21wb3VuZE5hbWUsIHRoaXMpOworCWlmIChtaXNzaW5nVHlwZS5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsKKwkJLy8gbWFrZSBPYmplY3QgYmUgaXRzIHN1cGVyY2xhc3MgLSBpdCBjb3VsZCBpbiB0dXJuIGJlIG1pc3NpbmcgYXMgd2VsbAorCQlSZWZlcmVuY2VCaW5kaW5nIG9iamVjdFR5cGUgPSBnZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCk7CisJCWlmIChvYmplY3RUeXBlID09IG51bGwpIHsKKwkJCW9iamVjdFR5cGUgPSBjcmVhdGVNaXNzaW5nVHlwZShudWxsLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QpOwkvLyBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIG1pc3NpbmcgT2JqZWN0IHR5cGUKKwkJfQorCQltaXNzaW5nVHlwZS5zZXRNaXNzaW5nU3VwZXJjbGFzcyhvYmplY3RUeXBlKTsKKwl9CisJcGFja2FnZUJpbmRpbmcuYWRkVHlwZShtaXNzaW5nVHlwZSk7CisJaWYgKHRoaXMubWlzc2luZ1R5cGVzID09IG51bGwpCisJCXRoaXMubWlzc2luZ1R5cGVzID0gbmV3IEFycmF5TGlzdCgzKTsKKwl0aGlzLm1pc3NpbmdUeXBlcy5hZGQobWlzc2luZ1R5cGUpOworCXJldHVybiBtaXNzaW5nVHlwZTsKK30KKworLyoKKyogMS4gQ29ubmVjdCB0aGUgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSB0eXBlIGJpbmRpbmdzIGNyZWF0ZWQgZm9yIHBhcnNlZFVuaXRzLgorKiAyLiBDcmVhdGUgdGhlIGZpZWxkIGJpbmRpbmdzCisqIDMuIENyZWF0ZSB0aGUgbWV0aG9kIGJpbmRpbmdzCisqLwogcHVibGljIFBhY2thZ2VCaW5kaW5nIGNyZWF0ZVBhY2thZ2UoY2hhcltdW10gY29tcG91bmROYW1lKSB7CiAJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlMChjb21wb3VuZE5hbWVbMF0pOwogCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IFRoZU5vdEZvdW5kUGFja2FnZSkgewogCQlwYWNrYWdlQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIHRoaXMpOwotCQlrbm93blBhY2thZ2VzLnB1dChjb21wb3VuZE5hbWVbMF0sIHBhY2thZ2VCaW5kaW5nKTsKKwkJdGhpcy5rbm93blBhY2thZ2VzLnB1dChjb21wb3VuZE5hbWVbMF0sIHBhY2thZ2VCaW5kaW5nKTsKIAl9CiAKIAlmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC02MzYsNyArNzQ1LDcgQEAKIAkJCS8vIGNhdGNoZXMgdGhlIGNhc2Ugb2YgYSBwYWNrYWdlIHN0YXRlbWVudCBvZjogcGFja2FnZSBqYXZhLmxhbmcuT2JqZWN0OwogCQkJLy8gc2luY2UgdGhlIHBhY2thZ2UgY2FuIGJlIGFkZGVkIGFmdGVyIGEgc2V0IG9mIHNvdXJjZSBmaWxlcyBoYXZlIGFscmVhZHkgYmVlbiBjb21waWxlZCwKIAkJCS8vIHdlIG5lZWQgdG8gY2hlY2sgd2hlbmV2ZXIgYSBwYWNrYWdlIGlzIGNyZWF0ZWQKLQkJCWlmIChuYW1lRW52aXJvbm1lbnQuZmluZFR5cGUoY29tcG91bmROYW1lW2ldLCBwYXJlbnQuY29tcG91bmROYW1lKSAhPSBudWxsKQorCQkJaWYgKHRoaXMubmFtZUVudmlyb25tZW50LmZpbmRUeXBlKGNvbXBvdW5kTmFtZVtpXSwgcGFyZW50LmNvbXBvdW5kTmFtZSkgIT0gbnVsbCkKIAkJCQlyZXR1cm4gbnVsbDsKIAogCQkJcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGkgKyAxKSwgcGFyZW50LCB0aGlzKTsKQEAgLTY0NywxMyArNzU2LDEyIEBACiB9CiAKIHB1YmxpYyBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgY3JlYXRlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2QoTWV0aG9kQmluZGluZyBnZW5lcmljTWV0aG9kLCBSYXdUeXBlQmluZGluZyByYXdUeXBlKSB7Ci0KIAkvLyBjYWNoZWQgaW5mbyBpcyBhcnJheSBvZiBhbHJlYWR5IGNyZWF0ZWQgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyB0eXBlCiAJUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nW10gY2FjaGVkSW5mbyA9IChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmdbXSl0aGlzLnVuaXF1ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZ3MuZ2V0KGdlbmVyaWNNZXRob2QpOwogCWJvb2xlYW4gbmVlZFRvR3JvdyA9IGZhbHNlOwogCWludCBpbmRleCA9IDA7CiAJaWYgKGNhY2hlZEluZm8gIT0gbnVsbCl7Ci0JCW5leHRDYWNoZWRNZXRob2QgOiAKKwkJbmV4dENhY2hlZE1ldGhvZCA6CiAJCQkvLyBpdGVyYXRlIGV4aXN0aW5nIHBhcmFtZXRlcml6ZWQgZm9yIHJldXNpbmcgb25lIHdpdGggc2FtZSB0eXBlIGFyZ3VtZW50cyBpZiBhbnkKIAkJCWZvciAoaW50IG1heCA9IGNhY2hlZEluZm8ubGVuZ3RoOyBpbmRleCA8IG1heDsgaW5kZXgrKyl7CiAJCQkJUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIGNhY2hlZE1ldGhvZCA9IGNhY2hlZEluZm9baW5kZXhdOwpAQCAtNjgwLDE0ICs3ODgsMTMgQEAKIH0KIAogcHVibGljIFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZyBjcmVhdGVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZChNZXRob2RCaW5kaW5nIGdlbmVyaWNNZXRob2QsIFR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cykgewotCiAJLy8gY2FjaGVkIGluZm8gaXMgYXJyYXkgb2YgYWxyZWFkeSBjcmVhdGVkIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgdHlwZQogCVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZ1tdIGNhY2hlZEluZm8gPSAoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nW10pdGhpcy51bmlxdWVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmdzLmdldChnZW5lcmljTWV0aG9kKTsKIAlpbnQgYXJnTGVuZ3RoID0gdHlwZUFyZ3VtZW50cyA9PSBudWxsID8gMDogdHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAJYm9vbGVhbiBuZWVkVG9Hcm93ID0gZmFsc2U7CiAJaW50IGluZGV4ID0gMDsKIAlpZiAoY2FjaGVkSW5mbyAhPSBudWxsKXsKLQkJbmV4dENhY2hlZE1ldGhvZCA6IAorCQluZXh0Q2FjaGVkTWV0aG9kIDoKIAkJCS8vIGl0ZXJhdGUgZXhpc3RpbmcgcGFyYW1ldGVyaXplZCBmb3IgcmV1c2luZyBvbmUgd2l0aCBzYW1lIHR5cGUgYXJndW1lbnRzIGlmIGFueQogCQkJZm9yIChpbnQgbWF4ID0gY2FjaGVkSW5mby5sZW5ndGg7IGluZGV4IDwgbWF4OyBpbmRleCsrKXsKIAkJCQlQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgY2FjaGVkTWV0aG9kID0gY2FjaGVkSW5mb1tpbmRleF07CkBAIC03MTgsMTYgKzgyNSwxMTMgQEAKIAljYWNoZWRJbmZvW2luZGV4XSA9IHBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kOwogCXJldHVybiBwYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZDsKIH0KK3B1YmxpYyBQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmcgY3JlYXRlUG9seW1vcnBoaWNNZXRob2QoTWV0aG9kQmluZGluZyBvcmlnaW5hbFBvbHltb3JwaGljTWV0aG9kLCBUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMpIHsKKwkvLyBjYWNoZWQgaW5mbyBpcyBhcnJheSBvZiBhbHJlYWR5IGNyZWF0ZWQgcG9seW1vcnBoaWMgbWV0aG9kcyBmb3IgdGhpcyB0eXBlCisJU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcob3JpZ2luYWxQb2x5bW9ycGhpY01ldGhvZC5zZWxlY3Rvcik7CisJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nW10gY2FjaGVkSW5mbyA9IChQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmdbXSkgdGhpcy51bmlxdWVQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmdzLmdldChrZXkpOworCWludCBwYXJhbWV0ZXJzTGVuZ3RoID0gcGFyYW1ldGVycyA9PSBudWxsID8gMDogcGFyYW1ldGVycy5sZW5ndGg7CisJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzVHlwZUJpbmRpbmcgPSBuZXcgVHlwZUJpbmRpbmdbcGFyYW1ldGVyc0xlbmd0aF07IAorCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyc0xlbmd0aDsgaSsrKSB7CisJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGVCaW5kaW5nID0gcGFyYW1ldGVyc1tpXTsKKwkJaWYgKHBhcmFtZXRlclR5cGVCaW5kaW5nLmlkID09IFR5cGVJZHMuVF9udWxsKSB7CisJCQlwYXJhbWV0ZXJzVHlwZUJpbmRpbmdbaV0gPSBnZXRUeXBlKEpBVkFfTEFOR19WT0lEKTsKKwkJfSBlbHNlIHsKKwkJCXBhcmFtZXRlcnNUeXBlQmluZGluZ1tpXSA9IHBhcmFtZXRlclR5cGVCaW5kaW5nLmVyYXN1cmUoKTsKKwkJfQorCX0KKwlib29sZWFuIG5lZWRUb0dyb3cgPSBmYWxzZTsKKwlpbnQgaW5kZXggPSAwOworCWlmIChjYWNoZWRJbmZvICE9IG51bGwpIHsKKwkJbmV4dENhY2hlZE1ldGhvZCA6CisJCQkvLyBpdGVyYXRlIGV4aXN0aW5nIHBvbHltb3JwaGljIG1ldGhvZCBmb3IgcmV1c2luZyBvbmUgd2l0aCBzYW1lIHR5cGUgYXJndW1lbnRzIGlmIGFueQorCQkJZm9yIChpbnQgbWF4ID0gY2FjaGVkSW5mby5sZW5ndGg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7CisJCQkJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nIGNhY2hlZE1ldGhvZCA9IGNhY2hlZEluZm9baW5kZXhdOworCQkJCWlmIChjYWNoZWRNZXRob2QgPT0gbnVsbCkgeworCQkJCQlicmVhayBuZXh0Q2FjaGVkTWV0aG9kOworCQkJCX0KKwkJCQlpZiAoY2FjaGVkTWV0aG9kLm1hdGNoZXMocGFyYW1ldGVyc1R5cGVCaW5kaW5nLCBvcmlnaW5hbFBvbHltb3JwaGljTWV0aG9kLnJldHVyblR5cGUpKSB7CisJCQkJCXJldHVybiBjYWNoZWRNZXRob2Q7CisJCQkJfQorCQl9CisJCW5lZWRUb0dyb3cgPSB0cnVlOworCX0gZWxzZSB7CisJCWNhY2hlZEluZm8gPSBuZXcgUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nWzVdOworCQl0aGlzLnVuaXF1ZVBvbHltb3JwaGljTWV0aG9kQmluZGluZ3MucHV0KGtleSwgY2FjaGVkSW5mbyk7CisJfQorCS8vIGdyb3cgY2FjaGUgPworCWludCBsZW5ndGggPSBjYWNoZWRJbmZvLmxlbmd0aDsKKwlpZiAobmVlZFRvR3JvdyAmJiBpbmRleCA9PSBsZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weShjYWNoZWRJbmZvLCAwLCBjYWNoZWRJbmZvID0gbmV3IFBvbHltb3JwaGljTWV0aG9kQmluZGluZ1tsZW5ndGgqMl0sIDAsIGxlbmd0aCk7CisJCXRoaXMudW5pcXVlUG9seW1vcnBoaWNNZXRob2RCaW5kaW5ncy5wdXQoa2V5LCBjYWNoZWRJbmZvKTsKKwl9CisJLy8gYWRkIG5ldyBiaW5kaW5nCisJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nIHBvbHltb3JwaGljTWV0aG9kID0gbmV3IFBvbHltb3JwaGljTWV0aG9kQmluZGluZygKKwkJCW9yaWdpbmFsUG9seW1vcnBoaWNNZXRob2QsCisJCQlwYXJhbWV0ZXJzVHlwZUJpbmRpbmcpOworCWNhY2hlZEluZm9baW5kZXhdID0gcG9seW1vcnBoaWNNZXRob2Q7CisJcmV0dXJuIHBvbHltb3JwaGljTWV0aG9kOworfQorcHVibGljIE1ldGhvZEJpbmRpbmcgdXBkYXRlUG9seW1vcnBoaWNNZXRob2RSZXR1cm5UeXBlKFBvbHltb3JwaGljTWV0aG9kQmluZGluZyBiaW5kaW5nLCBUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCS8vIHVwZGF0ZSB0aGUgcmV0dXJuIHR5cGUgdG8gYmUgdGhlIGdpdmVuIHJldHVybiB0eXBlLCBidXQgcmV1c2UgZXhpc3RpbmcgYmluZGluZyBpZiBvbmUgY2FuIG1hdGNoCisJU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcoYmluZGluZy5zZWxlY3Rvcik7CisJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nW10gY2FjaGVkSW5mbyA9IChQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmdbXSkgdGhpcy51bmlxdWVQb2x5bW9ycGhpY01ldGhvZEJpbmRpbmdzLmdldChrZXkpOworCWJvb2xlYW4gbmVlZFRvR3JvdyA9IGZhbHNlOworCWludCBpbmRleCA9IDA7CisJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gYmluZGluZy5wYXJhbWV0ZXJzOworCWlmIChjYWNoZWRJbmZvICE9IG51bGwpIHsKKwkJbmV4dENhY2hlZE1ldGhvZCA6CisJCQkvLyBpdGVyYXRlIGV4aXN0aW5nIHBvbHltb3JwaGljIG1ldGhvZCBmb3IgcmV1c2luZyBvbmUgd2l0aCBzYW1lIHR5cGUgYXJndW1lbnRzIGlmIGFueQorCQkJZm9yIChpbnQgbWF4ID0gY2FjaGVkSW5mby5sZW5ndGg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7CisJCQkJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nIGNhY2hlZE1ldGhvZCA9IGNhY2hlZEluZm9baW5kZXhdOworCQkJCWlmIChjYWNoZWRNZXRob2QgPT0gbnVsbCkgeworCQkJCQlicmVhayBuZXh0Q2FjaGVkTWV0aG9kOworCQkJCX0KKwkJCQlpZiAoY2FjaGVkTWV0aG9kLm1hdGNoZXMocGFyYW1ldGVycywgdHlwZUJpbmRpbmcpKSB7CisJCQkJCXJldHVybiBjYWNoZWRNZXRob2Q7CisJCQkJfQorCQl9CisJCW5lZWRUb0dyb3cgPSB0cnVlOworCX0gZWxzZSB7CisJCWNhY2hlZEluZm8gPSBuZXcgUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nWzVdOworCQl0aGlzLnVuaXF1ZVBvbHltb3JwaGljTWV0aG9kQmluZGluZ3MucHV0KGtleSwgY2FjaGVkSW5mbyk7CisJfQorCS8vIGdyb3cgY2FjaGUgPworCWludCBsZW5ndGggPSBjYWNoZWRJbmZvLmxlbmd0aDsKKwlpZiAobmVlZFRvR3JvdyAmJiBpbmRleCA9PSBsZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weShjYWNoZWRJbmZvLCAwLCBjYWNoZWRJbmZvID0gbmV3IFBvbHltb3JwaGljTWV0aG9kQmluZGluZ1tsZW5ndGgqMl0sIDAsIGxlbmd0aCk7CisJCXRoaXMudW5pcXVlUG9seW1vcnBoaWNNZXRob2RCaW5kaW5ncy5wdXQoa2V5LCBjYWNoZWRJbmZvKTsKKwl9CisJLy8gYWRkIG5ldyBiaW5kaW5nCisJUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nIHBvbHltb3JwaGljTWV0aG9kID0gbmV3IFBvbHltb3JwaGljTWV0aG9kQmluZGluZygKKwkJCWJpbmRpbmcub3JpZ2luYWwoKSwKKwkJCXR5cGVCaW5kaW5nLAorCQkJcGFyYW1ldGVycyk7CisJY2FjaGVkSW5mb1tpbmRleF0gPSBwb2x5bW9ycGhpY01ldGhvZDsKKwlyZXR1cm4gcG9seW1vcnBoaWNNZXRob2Q7Cit9CitwdWJsaWMgUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcgY3JlYXRlR2V0Q2xhc3NNZXRob2QoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kLCBTY29wZSBzY29wZSkgeworCS8vIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgY2FjaGVkIHRoaXMgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gcmVjZWl2ZXIgdHlwZS4KKwlQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZyByZXRWYWwgPSBudWxsOworCWlmICh0aGlzLnVuaXF1ZUdldENsYXNzTWV0aG9kQmluZGluZyA9PSBudWxsKSB7CisJCXRoaXMudW5pcXVlR2V0Q2xhc3NNZXRob2RCaW5kaW5nID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOworCX0gZWxzZSB7CisJCXJldFZhbCA9IChQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZyl0aGlzLnVuaXF1ZUdldENsYXNzTWV0aG9kQmluZGluZy5nZXQocmVjZWl2ZXJUeXBlKTsKKwl9CisJaWYgKHJldFZhbCA9PSBudWxsKSB7CisJCXJldFZhbCA9IFBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nLmluc3RhbnRpYXRlR2V0Q2xhc3MocmVjZWl2ZXJUeXBlLCBvcmlnaW5hbE1ldGhvZCwgc2NvcGUpOworCQl0aGlzLnVuaXF1ZUdldENsYXNzTWV0aG9kQmluZGluZy5wdXQocmVjZWl2ZXJUeXBlLCByZXRWYWwpOworCX0KKwlyZXR1cm4gcmV0VmFsOworfQogCiBwdWJsaWMgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIGNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsIFR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cywgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7Ci0KIAkvLyBjYWNoZWQgaW5mbyBpcyBhcnJheSBvZiBhbHJlYWR5IGNyZWF0ZWQgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyB0eXBlCiAJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nW10gY2FjaGVkSW5mbyA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmdbXSl0aGlzLnVuaXF1ZVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZ3MuZ2V0KGdlbmVyaWNUeXBlKTsKIAlpbnQgYXJnTGVuZ3RoID0gdHlwZUFyZ3VtZW50cyA9PSBudWxsID8gMDogdHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAJYm9vbGVhbiBuZWVkVG9Hcm93ID0gZmFsc2U7CiAJaW50IGluZGV4ID0gMDsKIAlpZiAoY2FjaGVkSW5mbyAhPSBudWxsKXsKLQkJbmV4dENhY2hlZFR5cGUgOiAKKwkJbmV4dENhY2hlZFR5cGUgOgogCQkJLy8gaXRlcmF0ZSBleGlzdGluZyBwYXJhbWV0ZXJpemVkIGZvciByZXVzaW5nIG9uZSB3aXRoIHNhbWUgdHlwZSBhcmd1bWVudHMgaWYgYW55CiAJCQlmb3IgKGludCBtYXggPSBjYWNoZWRJbmZvLmxlbmd0aDsgaW5kZXggPCBtYXg7IGluZGV4KyspewogCQkJICAgIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBjYWNoZWRUeXBlID0gY2FjaGVkSW5mb1tpbmRleF07CkBAIC03NjYsNyArOTcwLDcgQEAKIAlib29sZWFuIG5lZWRUb0dyb3cgPSBmYWxzZTsKIAlpbnQgaW5kZXggPSAwOwogCWlmIChjYWNoZWRJbmZvICE9IG51bGwpewotCQluZXh0Q2FjaGVkVHlwZSA6IAorCQluZXh0Q2FjaGVkVHlwZSA6CiAJCQkvLyBpdGVyYXRlIGV4aXN0aW5nIHBhcmFtZXRlcml6ZWQgZm9yIHJldXNpbmcgb25lIHdpdGggc2FtZSB0eXBlIGFyZ3VtZW50cyBpZiBhbnkKIAkJCWZvciAoaW50IG1heCA9IGNhY2hlZEluZm8ubGVuZ3RoOyBpbmRleCA8IG1heDsgaW5kZXgrKyl7CiAJCQkgICAgUmF3VHlwZUJpbmRpbmcgY2FjaGVkVHlwZSA9IGNhY2hlZEluZm9baW5kZXhdOwpAQCAtNzkxLDExICs5OTUsMTAgQEAKIAlSYXdUeXBlQmluZGluZyByYXdUeXBlID0gbmV3IFJhd1R5cGVCaW5kaW5nKGdlbmVyaWNUeXBlLCBlbmNsb3NpbmdUeXBlLCB0aGlzKTsKIAljYWNoZWRJbmZvW2luZGV4XSA9IHJhd1R5cGU7CiAJcmV0dXJuIHJhd1R5cGU7Ci0JCisKIH0KIAogcHVibGljIFdpbGRjYXJkQmluZGluZyBjcmVhdGVXaWxkY2FyZChSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlLCBpbnQgcmFuaywgVHlwZUJpbmRpbmcgYm91bmQsIFR5cGVCaW5kaW5nW10gb3RoZXJCb3VuZHMsIGludCBib3VuZEtpbmQpIHsKLQkKIAkvLyBjYWNoZWQgaW5mbyBpcyBhcnJheSBvZiBhbHJlYWR5IGNyZWF0ZWQgd2lsZGNhcmQgIHR5cGVzIGZvciB0aGlzIHR5cGUKIAlpZiAoZ2VuZXJpY1R5cGUgPT0gbnVsbCkgLy8gcHNldWRvIHdpbGRjYXJkIGRlbm90aW5nIGNvbXBvc2l0ZSBib3VuZHMgZm9yIGx1YiBjb21wdXRhdGlvbgogCQlnZW5lcmljVHlwZSA9IFJlZmVyZW5jZUJpbmRpbmcuTFVCX0dFTkVSSUM7CkBAIC04MDMsNyArMTAwNiw3IEBACiAJYm9vbGVhbiBuZWVkVG9Hcm93ID0gZmFsc2U7CiAJaW50IGluZGV4ID0gMDsKIAlpZiAoY2FjaGVkSW5mbyAhPSBudWxsKXsKLQkJbmV4dENhY2hlZFR5cGUgOiAKKwkJbmV4dENhY2hlZFR5cGUgOgogCQkJLy8gaXRlcmF0ZSBleGlzdGluZyB3aWxkY2FyZHMgZm9yIHJldXNpbmcgb25lIHdpdGggc2FtZSBpbmZvcm1hdGlvbiBpZiBhbnkKIAkJCWZvciAoaW50IG1heCA9IGNhY2hlZEluZm8ubGVuZ3RoOyBpbmRleCA8IG1heDsgaW5kZXgrKyl7CiAJCQkgICAgV2lsZGNhcmRCaW5kaW5nIGNhY2hlZFR5cGUgPSBjYWNoZWRJbmZvW2luZGV4XTsKQEAgLTg1NSwxNCArMTA1OCwxMCBAQAogICogTk9URTogRG8gbm90IHVzZSBmb3IgbmVzdGVkIHR5cGVzLi4uIHRoZSBhbnN3ZXIgaXMgTk9UIHRoZSBzYW1lIGZvciBhLmIuQyBvciBhLmIuQy5ELkUKICAqIGFzc3VtaW5nIEMgaXMgYSB0eXBlIGluIGJvdGggY2FzZXMuIEluIHRoZSBhLmIuQy5ELkUgY2FzZSwgbnVsbCBpcyB0aGUgYW5zd2VyLgogICovCi0KIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldENhY2hlZFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CiAJaWYgKGNvbXBvdW5kTmFtZS5sZW5ndGggPT0gMSkgewotCQlpZiAoZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZGVmYXVsdFBhY2thZ2UuZ2V0VHlwZTAoY29tcG91bmROYW1lWzBdKTsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFBhY2thZ2UuZ2V0VHlwZTAoY29tcG91bmROYW1lWzBdKTsKIAl9Ci0KIAlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVswXSk7CiAJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwgfHwgcGFja2FnZUJpbmRpbmcgPT0gVGhlTm90Rm91bmRQYWNrYWdlKQogCQlyZXR1cm4gbnVsbDsKQEAgLTg3Miw2ICsxMDcxLDcgQEAKIAkJCXJldHVybiBudWxsOwogCXJldHVybiBwYWNrYWdlQmluZGluZy5nZXRUeXBlMChjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aCAtIDFdKTsKIH0KKwogLyogQW5zd2VyIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSBuYW1lZCBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUuCiAqIEFuc3dlciB0aGVOb3RGb3VuZFBhY2thZ2UgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRoZSBmaXJzdCB0aW1lCiAqIGl0IHdhcyBsb29rZWQgdXAsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KQEAgLTg3OSwxMCArMTA3OSwxMCBAQAogKiBOT1RFOiBTZW5kZXJzIG11c3QgY29udmVydCB0aGVOb3RGb3VuZFBhY2thZ2UgaW50byBhIHJlYWwgcHJvYmxlbQogKiBwYWNrYWdlIGlmIGl0cyB0byByZXR1cm5lZC4KICovCi0KIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UwKGNoYXJbXSBuYW1lKSB7Ci0JcmV0dXJuIGtub3duUGFja2FnZXMuZ2V0KG5hbWUpOworCXJldHVybiB0aGlzLmtub3duUGFja2FnZXMuZ2V0KG5hbWUpOwogfQorCiAvKiBBbnN3ZXIgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmROYW1lLgogKiBBc2sgdGhlIG5hbWUgZW52aXJvbm1lbnQgZm9yIHRoZSB0eXBlIGlmIGl0cyBub3QgaW4gdGhlIGNhY2hlLgogKiBGYWlsIHdpdGggYSBjbGFzc3BhdGggZXJyb3IgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGZvdW5kLgpAQCAtODkyLDE1ICsxMDkyLDE4IEBACiAJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CiAKIAkvLyBjcmVhdGUgYSBwcm94eSBmb3IgdGhlIG1pc3NpbmcgQmluYXJ5VHlwZQotCXJldHVybiBjYWNoZU1pc3NpbmdCaW5hcnlUeXBlKAotCQljb21wb3VuZE5hbWUsIAotCQlzY29wZSA9PSBudWxsID8gdGhpcy51bml0QmVpbmdDb21wbGV0ZWQgOiBzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7CisJLy8gcmVwb3J0IHRoZSBtaXNzaW5nIGNsYXNzIGZpbGUgZmlyc3QKKwl0aGlzLnByb2JsZW1SZXBvcnRlci5pc0NsYXNzUGF0aENvcnJlY3QoCisJCWNvbXBvdW5kTmFtZSwKKwkJc2NvcGUgPT0gbnVsbCA/IHRoaXMudW5pdEJlaW5nQ29tcGxldGVkIDogc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCksCisJCXRoaXMubWlzc2luZ0NsYXNzRmlsZUxvY2F0aW9uKTsKKwlyZXR1cm4gY3JlYXRlTWlzc2luZ1R5cGUobnVsbCwgY29tcG91bmROYW1lKTsKIH0KKwogLyogQW5zd2VyIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSBuYW1lZCBuYW1lLgogKiBBc2sgdGhlIG9yYWNsZSBmb3IgdGhlIHBhY2thZ2UgaWYgaXRzIG5vdCBpbiB0aGUgY2FjaGUuCiAqIEFuc3dlciBudWxsIGlmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSBmb3VuZC4KICovCi0KIFBhY2thZ2VCaW5kaW5nIGdldFRvcExldmVsUGFja2FnZShjaGFyW10gbmFtZSkgewogCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAobmFtZSk7CiAJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKQEAgLTkwOSwzMSArMTExMiwyOCBAQAogCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CiAJfQogCi0JaWYgKG5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UobnVsbCwgbmFtZSkpIHsKLQkJa25vd25QYWNrYWdlcy5wdXQobmFtZSwgcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcobmFtZSwgdGhpcykpOworCWlmICh0aGlzLm5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UobnVsbCwgbmFtZSkpIHsKKwkJdGhpcy5rbm93blBhY2thZ2VzLnB1dChuYW1lLCBwYWNrYWdlQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyhuYW1lLCB0aGlzKSk7CiAJCXJldHVybiBwYWNrYWdlQmluZGluZzsKIAl9CiAKLQlrbm93blBhY2thZ2VzLnB1dChuYW1lLCBUaGVOb3RGb3VuZFBhY2thZ2UpOyAvLyBzYXZlcyBhc2tpbmcgdGhlIG9yYWNsZSBuZXh0IHRpbWUKKwl0aGlzLmtub3duUGFja2FnZXMucHV0KG5hbWUsIFRoZU5vdEZvdW5kUGFja2FnZSk7IC8vIHNhdmVzIGFza2luZyB0aGUgb3JhY2xlIG5leHQgdGltZQogCXJldHVybiBudWxsOwogfQorCiAvKiBBbnN3ZXIgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmROYW1lLgogKiBBc2sgdGhlIG5hbWUgZW52aXJvbm1lbnQgZm9yIHRoZSB0eXBlIGlmIGl0cyBub3QgaW4gdGhlIGNhY2hlLgogKiBBbnN3ZXIgbnVsbCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgZm91bmQuCiAqLwotCiBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBnZXRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgewogCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZzsKIAogCWlmIChjb21wb3VuZE5hbWUubGVuZ3RoID09IDEpIHsKLQkJaWYgKGRlZmF1bHRQYWNrYWdlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoKHJlZmVyZW5jZUJpbmRpbmcgPSBkZWZhdWx0UGFja2FnZS5nZXRUeXBlMChjb21wb3VuZE5hbWVbMF0pKSA9PSBudWxsKSB7CisJCWlmICgocmVmZXJlbmNlQmluZGluZyA9IHRoaXMuZGVmYXVsdFBhY2thZ2UuZ2V0VHlwZTAoY29tcG91bmROYW1lWzBdKSkgPT0gbnVsbCkgewogCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlMChjb21wb3VuZE5hbWVbMF0pOwogCQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwgJiYgcGFja2FnZUJpbmRpbmcgIT0gVGhlTm90Rm91bmRQYWNrYWdlKQogCQkJCXJldHVybiBudWxsOyAvLyBjb2xsaWRlcyB3aXRoIGEga25vd24gcGFja2FnZS4uLiBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QgaW4gc3VjaCBhIGNhc2UKLQkJCXJlZmVyZW5jZUJpbmRpbmcgPSBhc2tGb3JUeXBlKGRlZmF1bHRQYWNrYWdlLCBjb21wb3VuZE5hbWVbMF0pOworCQkJcmVmZXJlbmNlQmluZGluZyA9IGFza0ZvclR5cGUodGhpcy5kZWZhdWx0UGFja2FnZSwgY29tcG91bmROYW1lWzBdKTsKIAkJfQogCX0gZWxzZSB7CiAJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAoY29tcG91bmROYW1lWzBdKTsKQEAgLTk1Nyw2OCArMTE1Nyw4MiBAQAogCiAJaWYgKHJlZmVyZW5jZUJpbmRpbmcgPT0gbnVsbCB8fCByZWZlcmVuY2VCaW5kaW5nID09IFRoZU5vdEZvdW5kVHlwZSkKIAkJcmV0dXJuIG51bGw7Ci0JcmVmZXJlbmNlQmluZGluZyA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHJlZmVyZW5jZUJpbmRpbmcsIHRoaXMsIGZhbHNlKTsgLy8gbm8gcmF3IGNvbnZlcnNpb24gZm9yIG5vdworCXJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUocmVmZXJlbmNlQmluZGluZywgdGhpcywgZmFsc2UgLyogbm8gcmF3IGNvbnZlcnNpb24gZm9yIG5vdyAqLyk7CiAKIAkvLyBjb21wb3VuZE5hbWUgcmVmZXJzIHRvIGEgbmVzdGVkIHR5cGUgaW5jb3JyZWN0bHkgKGZvciBleGFtcGxlLCBwYWNrYWdlMS5BJEIpCiAJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpCiAJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCByZWZlcmVuY2VCaW5kaW5nLCBJbnRlcm5hbE5hbWVQcm92aWRlZCk7CiAJcmV0dXJuIHJlZmVyZW5jZUJpbmRpbmc7CiB9Ci1wcml2YXRlIFR5cGVCaW5kaW5nW10gZ2V0VHlwZUFyZ3VtZW50c0Zyb21TaWduYXR1cmUoU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLCBUeXBlVmFyaWFibGVCaW5kaW5nW10gc3RhdGljVmFyaWFibGVzLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUpIHsKKworcHJpdmF0ZSBUeXBlQmluZGluZ1tdIGdldFR5cGVBcmd1bWVudHNGcm9tU2lnbmF0dXJlKFNpZ25hdHVyZVdyYXBwZXIgd3JhcHBlciwgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHN0YXRpY1ZhcmlhYmxlcywgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlLCBjaGFyW11bXVtdIG1pc3NpbmdUeXBlTmFtZXMpIHsKIAlqYXZhLnV0aWwuQXJyYXlMaXN0IGFyZ3MgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgyKTsKIAlpbnQgcmFuayA9IDA7CiAJZG8gewotCQlhcmdzLmFkZChnZXRUeXBlRnJvbVZhcmlhbnRUeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHN0YXRpY1ZhcmlhYmxlcywgZW5jbG9zaW5nVHlwZSwgZ2VuZXJpY1R5cGUsIHJhbmsrKykpOworCQlhcmdzLmFkZChnZXRUeXBlRnJvbVZhcmlhbnRUeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHN0YXRpY1ZhcmlhYmxlcywgZW5jbG9zaW5nVHlwZSwgZ2VuZXJpY1R5cGUsIHJhbmsrKywgbWlzc2luZ1R5cGVOYW1lcykpOwogCX0gd2hpbGUgKHdyYXBwZXIuc2lnbmF0dXJlW3dyYXBwZXIuc3RhcnRdICE9ICc+Jyk7CiAJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICc+JwogCVR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1thcmdzLnNpemUoKV07CiAJYXJncy50b0FycmF5KHR5cGVBcmd1bWVudHMpOwogCXJldHVybiB0eXBlQXJndW1lbnRzOwogfQorCiAvKiBBbnN3ZXIgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmQgbmFtZS4KICogRG9lcyBub3QgYXNrIHRoZSBvcmFjbGUgZm9yIHRoZSB0eXBlIGlmIGl0cyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLi4uIGluc3RlYWQgYW4KICogdW5yZXNvbHZlZCB0eXBlIGlzIHJldHVybmVkIHdoaWNoIG11c3QgYmUgcmVzb2x2ZWQgYmVmb3JlIHVzZWQuCiAqCiAqIE5PVEU6IERvZXMgTk9UIGFuc3dlciBiYXNlIHR5cGVzIG5vciBhcnJheSB0eXBlcyEKICovCi0KLVJlZmVyZW5jZUJpbmRpbmcgZ2V0VHlwZUZyb21Db21wb3VuZE5hbWUoY2hhcltdW10gY29tcG91bmROYW1lLCBib29sZWFuIGlzUGFyYW1ldGVyaXplZCkgeworcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGVGcm9tQ29tcG91bmROYW1lKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWQsIGJvb2xlYW4gd2FzTWlzc2luZ1R5cGUpIHsKIAlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSBnZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7CiAJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGNvbXB1dGVQYWNrYWdlRnJvbShjb21wb3VuZE5hbWUpOworCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGNvbXB1dGVQYWNrYWdlRnJvbShjb21wb3VuZE5hbWUsIGZhbHNlIC8qIHZhbGlkIHBrZyAqLyk7CiAJCWJpbmRpbmcgPSBuZXcgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCBwYWNrYWdlQmluZGluZyk7CisJCWlmICh3YXNNaXNzaW5nVHlwZSkgeworCQkJYmluZGluZy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7IC8vIHJlY29yZCBpdCB3YXMgYm91bmQgdG8gYSBtaXNzaW5nIHR5cGUKKwkJfQogCQlwYWNrYWdlQmluZGluZy5hZGRUeXBlKGJpbmRpbmcpOwogCX0gZWxzZSBpZiAoYmluZGluZyA9PSBUaGVOb3RGb3VuZFR5cGUpIHsKKwkJLy8gcmVwb3J0IHRoZSBtaXNzaW5nIGNsYXNzIGZpbGUgZmlyc3QKKwkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuaXNDbGFzc1BhdGhDb3JyZWN0KGNvbXBvdW5kTmFtZSwgdGhpcy51bml0QmVpbmdDb21wbGV0ZWQsIHRoaXMubWlzc2luZ0NsYXNzRmlsZUxvY2F0aW9uKTsKIAkJLy8gY3JlYXRlIGEgcHJveHkgZm9yIHRoZSBtaXNzaW5nIEJpbmFyeVR5cGUKLQkJYmluZGluZyA9IGNhY2hlTWlzc2luZ0JpbmFyeVR5cGUoY29tcG91bmROYW1lLCB0aGlzLnVuaXRCZWluZ0NvbXBsZXRlZCk7CisJCWJpbmRpbmcgPSBjcmVhdGVNaXNzaW5nVHlwZShudWxsLCBjb21wb3VuZE5hbWUpOwogCX0gZWxzZSBpZiAoIWlzUGFyYW1ldGVyaXplZCkgewogCSAgICAvLyBjaGVjayByYXcgdHlwZSwgb25seSBmb3IgcmVzb2x2ZWQgdHlwZXMKICAgICAgICAgYmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBjb252ZXJ0VW5yZXNvbHZlZEJpbmFyeVRvUmF3VHlwZShiaW5kaW5nKTsKIAl9CiAJcmV0dXJuIGJpbmRpbmc7CiB9CisKIC8qIEFuc3dlciB0aGUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYW1lIGZyb20gdGhlIGJpbmFyeSBmaWxlLgogKiBEb2VzIG5vdCBhc2sgdGhlIG9yYWNsZSBmb3IgdGhlIHR5cGUgaWYgaXRzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuLi4gaW5zdGVhZCBhbgogKiB1bnJlc29sdmVkIHR5cGUgaXMgcmV0dXJuZWQgd2hpY2ggbXVzdCBiZSByZXNvbHZlZCBiZWZvcmUgdXNlZC4KICoKICogTk9URTogRG9lcyBOT1QgYW5zd2VyIGJhc2UgdHlwZXMgbm9yIGFycmF5IHR5cGVzIQogKi8KLQotUmVmZXJlbmNlQmluZGluZyBnZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoY2hhcltdIHNpZ25hdHVyZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sZWFuIGlzUGFyYW1ldGVyaXplZCkgeworUmVmZXJlbmNlQmluZGluZyBnZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoY2hhcltdIHNpZ25hdHVyZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sZWFuIGlzUGFyYW1ldGVyaXplZCwgY2hhcltdW11bXSBtaXNzaW5nVHlwZU5hbWVzKSB7CiAJaWYgKGVuZCA9PSAtMSkKIAkJZW5kID0gc2lnbmF0dXJlLmxlbmd0aDsKLQogCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCk7Ci0JcmV0dXJuIGdldFR5cGVGcm9tQ29tcG91bmROYW1lKGNvbXBvdW5kTmFtZSwgaXNQYXJhbWV0ZXJpemVkKTsKKwlib29sZWFuIHdhc01pc3NpbmdUeXBlID0gZmFsc2U7CisJaWYgKG1pc3NpbmdUeXBlTmFtZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWlzc2luZ1R5cGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNvbXBvdW5kTmFtZSwgbWlzc2luZ1R5cGVOYW1lc1tpXSkpIHsKKwkJCQl3YXNNaXNzaW5nVHlwZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGdldFR5cGVGcm9tQ29tcG91bmROYW1lKGNvbXBvdW5kTmFtZSwgaXNQYXJhbWV0ZXJpemVkLCB3YXNNaXNzaW5nVHlwZSk7CiB9CisKIC8qIEFuc3dlciB0aGUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzaWduYXR1cmUgZnJvbSB0aGUgYmluYXJ5IGZpbGUuCiAqIERvZXMgbm90IGFzayB0aGUgb3JhY2xlIGZvciB0aGUgdHlwZSBpZiBpdHMgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4uLiBpbnN0ZWFkIGFuCiAqIHVucmVzb2x2ZWQgdHlwZSBpcyByZXR1cm5lZCB3aGljaCBtdXN0IGJlIHJlc29sdmVkIGJlZm9yZSB1c2VkLgogKgogKiBOT1RFOiBEb2VzIGFuc3dlciBiYXNlIHR5cGVzICYgYXJyYXkgdHlwZXMuCiAqLwotCi1UeXBlQmluZGluZyBnZXRUeXBlRnJvbVNpZ25hdHVyZShjaGFyW10gc2lnbmF0dXJlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkLCBUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CitUeXBlQmluZGluZyBnZXRUeXBlRnJvbVNpZ25hdHVyZShjaGFyW10gc2lnbmF0dXJlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkLCBUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlLCBjaGFyW11bXVtdIG1pc3NpbmdUeXBlTmFtZXMpIHsKIAlpbnQgZGltZW5zaW9uID0gMDsKIAl3aGlsZSAoc2lnbmF0dXJlW3N0YXJ0XSA9PSAnWycpIHsKIAkJc3RhcnQrKzsKQEAgLTEwNTksMTggKzEyNzMsMTkgQEAKIAkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuU0hPUlQ7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0IDoKLQkJCQlwcm9ibGVtUmVwb3J0ZXIuY29ycnVwdGVkU2lnbmF0dXJlKGVuY2xvc2luZ1R5cGUsIHNpZ25hdHVyZSwgc3RhcnQpOworCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmNvcnJ1cHRlZFNpZ25hdHVyZShlbmNsb3NpbmdUeXBlLCBzaWduYXR1cmUsIHN0YXJ0KTsKIAkJCQkvLyB3aWxsIG5ldmVyIHJlYWNoIGhlcmUsIHNpbmNlIGVycm9yIHdpbGwgY2F1c2UgYWJvcnQKIAkJfQogCX0gZWxzZSB7Ci0JCWJpbmRpbmcgPSBnZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoc2lnbmF0dXJlLCBzdGFydCArIDEsIGVuZCwgaXNQYXJhbWV0ZXJpemVkKTsgLy8gc2tpcCBsZWFkaW5nICdMJyBvciAnVCcKKwkJYmluZGluZyA9IGdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShzaWduYXR1cmUsIHN0YXJ0ICsgMSwgZW5kLCBpc1BhcmFtZXRlcml6ZWQsIG1pc3NpbmdUeXBlTmFtZXMpOyAvLyBza2lwIGxlYWRpbmcgJ0wnIG9yICdUJwogCX0KIAogCWlmIChkaW1lbnNpb24gPT0gMCkKIAkJcmV0dXJuIGJpbmRpbmc7CiAJcmV0dXJuIGNyZWF0ZUFycmF5VHlwZShiaW5kaW5nLCBkaW1lbnNpb24pOwogfQotVHlwZUJpbmRpbmcgZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKFNpZ25hdHVyZVdyYXBwZXIgd3JhcHBlciwgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHN0YXRpY1ZhcmlhYmxlcywgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisKK3B1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUoU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLCBUeXBlVmFyaWFibGVCaW5kaW5nW10gc3RhdGljVmFyaWFibGVzLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIGNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcykgewogCS8vIFR5cGVWYXJpYWJsZVNpZ25hdHVyZSA9ICdUJyBJZGVudGlmaWVyICc7JwogCS8vIEFycmF5VHlwZVNpZ25hdHVyZSA9ICdbJyBUeXBlU2lnbmF0dXJlCiAJLy8gQ2xhc3NUeXBlU2lnbmF0dXJlID0gJ0wnIElkZW50aWZpZXIgVHlwZUFyZ3Mob3B0aW9uYWwpICc7JwpAQCAtMTA4MSw3ICsxMjk2LDYgQEAKIAkJd3JhcHBlci5zdGFydCsrOwogCQlkaW1lbnNpb24rKzsKIAl9Ci0KIAlpZiAod3JhcHBlci5zaWduYXR1cmVbd3JhcHBlci5zdGFydF0gPT0gJ1QnKSB7CiAJICAgIGludCB2YXJTdGFydCA9IHdyYXBwZXIuc3RhcnQgKyAxOwogCSAgICBpbnQgdmFyRW5kID0gd3JhcHBlci5jb21wdXRlRW5kKCk7CkBAIC0xMDkwLDM4ICsxMzA0LDQ4IEBACiAJCQkJcmV0dXJuIGRpbWVuc2lvbiA9PSAwID8gKFR5cGVCaW5kaW5nKSBzdGF0aWNWYXJpYWJsZXNbaV0gOiBjcmVhdGVBcnJheVR5cGUoc3RhdGljVmFyaWFibGVzW2ldLCBkaW1lbnNpb24pOwogCSAgICBSZWZlcmVuY2VCaW5kaW5nIGluaXRpYWxUeXBlID0gZW5jbG9zaW5nVHlwZTsKIAkJZG8gewotCQkgICAgaWYgKGVuY2xvc2luZ1R5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlQmluZGluZykgeyAvLyBwZXIgY29uc3RydWN0aW9uIGNhbiBvbmx5IGJlIGJpbmFyeSB0eXBlIGJpbmRpbmcKLQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gZW5jbG9zaW5nVmFyaWFibGVzID0gKChCaW5hcnlUeXBlQmluZGluZyllbmNsb3NpbmdUeXBlKS50eXBlVmFyaWFibGVzOyAvLyBkbyBub3QgdHJpZ2dlciByZXNvbHV0aW9uIG9mIHZhcmlhYmxlcwotCQkJCWZvciAoaW50IGkgPSBlbmNsb3NpbmdWYXJpYWJsZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbmNsb3NpbmdWYXJpYWJsZXNbaV0uc291cmNlTmFtZSwgd3JhcHBlci5zaWduYXR1cmUsIHZhclN0YXJ0LCB2YXJFbmQpKQotCQkJCQkJcmV0dXJuIGRpbWVuc2lvbiA9PSAwID8gKFR5cGVCaW5kaW5nKSBlbmNsb3NpbmdWYXJpYWJsZXNbaV0gOiBjcmVhdGVBcnJheVR5cGUoZW5jbG9zaW5nVmFyaWFibGVzW2ldLCBkaW1lbnNpb24pOwotCQkgICAgfQorCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIGVuY2xvc2luZ1R5cGVWYXJpYWJsZXM7CisJCQlpZiAoZW5jbG9zaW5nVHlwZSBpbnN0YW5jZW9mIEJpbmFyeVR5cGVCaW5kaW5nKSB7IC8vIGNvbXBpbGVyIG5vcm1hbCBjYXNlLCBubyBlYWdlciByZXNvbHV0aW9uIG9mIGJpbmFyeSB2YXJpYWJsZXMKKwkJCQllbmNsb3NpbmdUeXBlVmFyaWFibGVzID0gKChCaW5hcnlUeXBlQmluZGluZyllbmNsb3NpbmdUeXBlKS50eXBlVmFyaWFibGVzOyAvLyBkbyBub3QgdHJpZ2dlciByZXNvbHV0aW9uIG9mIHZhcmlhYmxlcworCQkJfSBlbHNlIHsgLy8gY29kZXBhdGggb25seSB1c2UgYnkgY29kZWFzc2lzdCBmb3IgZGVjb2Rpbmcgc2lnbmF0dXJlcworCQkJCWVuY2xvc2luZ1R5cGVWYXJpYWJsZXMgPSBlbmNsb3NpbmdUeXBlLnR5cGVWYXJpYWJsZXMoKTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSBlbmNsb3NpbmdUeXBlVmFyaWFibGVzLmxlbmd0aDsgLS1pID49IDA7KQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbmNsb3NpbmdUeXBlVmFyaWFibGVzW2ldLnNvdXJjZU5hbWUsIHdyYXBwZXIuc2lnbmF0dXJlLCB2YXJTdGFydCwgdmFyRW5kKSkKKwkJCQkJcmV0dXJuIGRpbWVuc2lvbiA9PSAwID8gKFR5cGVCaW5kaW5nKSBlbmNsb3NpbmdUeXBlVmFyaWFibGVzW2ldIDogY3JlYXRlQXJyYXlUeXBlKGVuY2xvc2luZ1R5cGVWYXJpYWJsZXNbaV0sIGRpbWVuc2lvbik7CiAJCX0gd2hpbGUgKChlbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpOwotCQlwcm9ibGVtUmVwb3J0ZXIudW5kZWZpbmVkVHlwZVZhcmlhYmxlU2lnbmF0dXJlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkod3JhcHBlci5zaWduYXR1cmUsIHZhclN0YXJ0LCB2YXJFbmQpLCBpbml0aWFsVHlwZSk7CisJCXRoaXMucHJvYmxlbVJlcG9ydGVyLnVuZGVmaW5lZFR5cGVWYXJpYWJsZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdyYXBwZXIuc2lnbmF0dXJlLCB2YXJTdGFydCwgdmFyRW5kKSwgaW5pdGlhbFR5cGUpOwogCQlyZXR1cm4gbnVsbDsgLy8gY2Fubm90IHJlYWNoIHRoaXMsIHNpbmNlIHByZXZpb3VzIHByb2JsZW0gd2lsbCBhYm9ydCBjb21waWxhdGlvbgogCX0KIAlib29sZWFuIGlzUGFyYW1ldGVyaXplZDsKLQlUeXBlQmluZGluZyB0eXBlID0gZ2V0VHlwZUZyb21TaWduYXR1cmUod3JhcHBlci5zaWduYXR1cmUsIHdyYXBwZXIuc3RhcnQsIHdyYXBwZXIuY29tcHV0ZUVuZCgpLCBpc1BhcmFtZXRlcml6ZWQgPSAod3JhcHBlci5lbmQgPT0gd3JhcHBlci5icmFja2V0KSwgZW5jbG9zaW5nVHlwZSk7CisJVHlwZUJpbmRpbmcgdHlwZSA9IGdldFR5cGVGcm9tU2lnbmF0dXJlKHdyYXBwZXIuc2lnbmF0dXJlLCB3cmFwcGVyLnN0YXJ0LCB3cmFwcGVyLmNvbXB1dGVFbmQoKSwgaXNQYXJhbWV0ZXJpemVkID0gKHdyYXBwZXIuZW5kID09IHdyYXBwZXIuYnJhY2tldCksIGVuY2xvc2luZ1R5cGUsIG1pc3NpbmdUeXBlTmFtZXMpOwogCWlmICghaXNQYXJhbWV0ZXJpemVkKQogCQlyZXR1cm4gZGltZW5zaW9uID09IDAgPyB0eXBlIDogY3JlYXRlQXJyYXlUeXBlKHR5cGUsIGRpbWVuc2lvbik7CiAKIAkvLyB0eXBlIG11c3QgYmUgYSBSZWZlcmVuY2VCaW5kaW5nIGF0IHRoaXMgcG9pbnQsIGNhbm5vdCBiZSBhIEJhc2VUeXBlQmluZGluZyBvciBBcnJheVR5cGVCaW5kaW5nCiAJUmVmZXJlbmNlQmluZGluZyBhY3R1YWxUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGU7Ci0JVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gZ2V0VHlwZUFyZ3VtZW50c0Zyb21TaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlLCBhY3R1YWxUeXBlKTsKKwlpZiAoYWN0dWFsVHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQorCQlpZiAoQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgYWN0dWFsVHlwZS5jb21wb3VuZE5hbWVbYWN0dWFsVHlwZS5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pID4gMCkKKwkJCWFjdHVhbFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUoYWN0dWFsVHlwZSwgdGhpcywgZmFsc2UgLyogbm8gcmF3IGNvbnZlcnNpb24gKi8pOyAvLyBtdXN0IHJlc29sdmUgbWVtYmVyIHR5cGVzIGJlZm9yZSBhc2tpbmcgZm9yIGVuY2xvc2luZ1R5cGUKIAlSZWZlcmVuY2VCaW5kaW5nIGFjdHVhbEVuY2xvc2luZyA9IGFjdHVhbFR5cGUuZW5jbG9zaW5nVHlwZSgpOwogCWlmIChhY3R1YWxFbmNsb3NpbmcgIT0gbnVsbCkgeyAvLyBjb252ZXJ0IG5lZWRlZCBpZiByZWFkIHNvbWUgc3RhdGljIG1lbWJlciB0eXBlCi0JCWFjdHVhbEVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBjb252ZXJ0VG9SYXdUeXBlKGFjdHVhbEVuY2xvc2luZyk7CisJCWFjdHVhbEVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBjb252ZXJ0VG9SYXdUeXBlKGFjdHVhbEVuY2xvc2luZywgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CiAJfQorCVR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cyA9IGdldFR5cGVBcmd1bWVudHNGcm9tU2lnbmF0dXJlKHdyYXBwZXIsIHN0YXRpY1ZhcmlhYmxlcywgZW5jbG9zaW5nVHlwZSwgYWN0dWFsVHlwZSwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtZXRlcml6ZWRUeXBlID0gY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoYWN0dWFsVHlwZSwgdHlwZUFyZ3VtZW50cywgYWN0dWFsRW5jbG9zaW5nKTsKIAogCXdoaWxlICh3cmFwcGVyLnNpZ25hdHVyZVt3cmFwcGVyLnN0YXJ0XSA9PSAnLicpIHsKIAkJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICcuJworCQlpbnQgbWVtYmVyU3RhcnQgPSB3cmFwcGVyLnN0YXJ0OwogCQljaGFyW10gbWVtYmVyTmFtZSA9IHdyYXBwZXIubmV4dFdvcmQoKTsKIAkJQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUocGFyYW1ldGVyaXplZFR5cGUsIHRoaXMsIGZhbHNlKTsKIAkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gcGFyYW1ldGVyaXplZFR5cGUuZ2VuZXJpY1R5cGUoKS5nZXRNZW1iZXJUeXBlKG1lbWJlck5hbWUpOworCQkvLyBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgbWVtYmVyIHR5cGUgYmVpbmcgbnVsbCB3aGVuIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZAorCQlpZiAobWVtYmVyVHlwZSA9PSBudWxsKQorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuY29ycnVwdGVkU2lnbmF0dXJlKHBhcmFtZXRlcml6ZWRUeXBlLCB3cmFwcGVyLnNpZ25hdHVyZSwgbWVtYmVyU3RhcnQpOyAvLyBhYm9ydHMKIAkJaWYgKHdyYXBwZXIuc2lnbmF0dXJlW3dyYXBwZXIuc3RhcnRdID09ICc8JykgewogCQkJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICc8JwotCQkJdHlwZUFyZ3VtZW50cyA9IGdldFR5cGVBcmd1bWVudHNGcm9tU2lnbmF0dXJlKHdyYXBwZXIsIHN0YXRpY1ZhcmlhYmxlcywgZW5jbG9zaW5nVHlwZSwgbWVtYmVyVHlwZSk7CisJCQl0eXBlQXJndW1lbnRzID0gZ2V0VHlwZUFyZ3VtZW50c0Zyb21TaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlLCBtZW1iZXJUeXBlLCBtaXNzaW5nVHlwZU5hbWVzKTsKIAkJfSBlbHNlIHsKIAkJCXR5cGVBcmd1bWVudHMgPSBudWxsOwogCQl9CkBAIC0xMTMwLDEyICsxMzU0LDE0IEBACiAJd3JhcHBlci5zdGFydCsrOyAvLyBza2lwICc7JwogCXJldHVybiBkaW1lbnNpb24gPT0gMCA/IChUeXBlQmluZGluZykgcGFyYW1ldGVyaXplZFR5cGUgOiBjcmVhdGVBcnJheVR5cGUocGFyYW1ldGVyaXplZFR5cGUsIGRpbWVuc2lvbik7CiB9CisKIFR5cGVCaW5kaW5nIGdldFR5cGVGcm9tVmFyaWFudFR5cGVTaWduYXR1cmUoCi0JU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLAotCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSBzdGF0aWNWYXJpYWJsZXMsCi0JUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlLAotCVJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsCi0JaW50IHJhbmspIHsKKwkJU2lnbmF0dXJlV3JhcHBlciB3cmFwcGVyLAorCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gc3RhdGljVmFyaWFibGVzLAorCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsCisJCVJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsCisJCWludCByYW5rLAorCQljaGFyW11bXVtdIG1pc3NpbmdUeXBlTmFtZXMpIHsKIAkvLyBWYXJpYW50VHlwZVNpZ25hdHVyZSA9ICctJyBUeXBlU2lnbmF0dXJlCiAJLy8gICBvciAnKycgVHlwZVNpZ25hdHVyZQogCS8vICAgb3IgVHlwZVNpZ25hdHVyZQpAQCAtMTE0NCwzOCArMTM3MCw1OSBAQAogCQljYXNlICctJyA6CiAJCQkvLyA/IHN1cGVyIGFUeXBlCiAJCQl3cmFwcGVyLnN0YXJ0Kys7Ci0JCQlUeXBlQmluZGluZyBib3VuZCA9IGdldFR5cGVGcm9tVHlwZVNpZ25hdHVyZSh3cmFwcGVyLCBzdGF0aWNWYXJpYWJsZXMsIGVuY2xvc2luZ1R5cGUpOworCQkJVHlwZUJpbmRpbmcgYm91bmQgPSBnZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlLCBtaXNzaW5nVHlwZU5hbWVzKTsKIAkJCXJldHVybiBjcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgYm91bmQsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5TVVBFUik7CiAJCWNhc2UgJysnIDoKIAkJCS8vID8gZXh0ZW5kcyBhVHlwZQogCQkJd3JhcHBlci5zdGFydCsrOwotCQkJYm91bmQgPSBnZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlKTsKKwkJCWJvdW5kID0gZ2V0VHlwZUZyb21UeXBlU2lnbmF0dXJlKHdyYXBwZXIsIHN0YXRpY1ZhcmlhYmxlcywgZW5jbG9zaW5nVHlwZSwgbWlzc2luZ1R5cGVOYW1lcyk7CiAJCQlyZXR1cm4gY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIGJvdW5kLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywgV2lsZGNhcmQuRVhURU5EUyk7CiAJCWNhc2UgJyonIDoKIAkJCS8vID8KIAkJCXdyYXBwZXIuc3RhcnQrKzsKIAkJCXJldHVybiBjcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgbnVsbCwgbnVsbCAvKm5vIGV4dHJhIGJvdW5kKi8sIFdpbGRjYXJkLlVOQk9VTkQpOwogCQlkZWZhdWx0IDoKLQkJCXJldHVybiBnZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlKTsKKwkJCXJldHVybiBnZXRUeXBlRnJvbVR5cGVTaWduYXR1cmUod3JhcHBlciwgc3RhdGljVmFyaWFibGVzLCBlbmNsb3NpbmdUeXBlLCBtaXNzaW5nVHlwZU5hbWVzKTsKIAl9CiB9CiAKK2Jvb2xlYW4gaXNNaXNzaW5nVHlwZShjaGFyW10gdHlwZU5hbWUpIHsKKwlmb3IgKGludCBpID0gdGhpcy5taXNzaW5nVHlwZXMgPT0gbnVsbCA/IDAgOiB0aGlzLm1pc3NpbmdUeXBlcy5zaXplKCk7IC0taSA+PSAwOykgeworCQlNaXNzaW5nVHlwZUJpbmRpbmcgbWlzc2luZ1R5cGUgPSAoTWlzc2luZ1R5cGVCaW5kaW5nKSB0aGlzLm1pc3NpbmdUeXBlcy5nZXQoaSk7CisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtaXNzaW5nVHlwZS5zb3VyY2VOYW1lLCB0eXBlTmFtZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiAvKiBBc2sgdGhlIG9yYWNsZSBpZiBhIHBhY2thZ2UgZXhpc3RzIG5hbWVkIG5hbWUgaW4gdGhlIHBhY2thZ2UgbmFtZWQgY29tcG91bmROYW1lLgogKi8KIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgY2hhcltdIG5hbWUpIHsKIAlpZiAoY29tcG91bmROYW1lID09IG51bGwgfHwgY29tcG91bmROYW1lLmxlbmd0aCA9PSAwKQotCQlyZXR1cm4gbmFtZUVudmlyb25tZW50LmlzUGFja2FnZShudWxsLCBuYW1lKTsKLQlyZXR1cm4gbmFtZUVudmlyb25tZW50LmlzUGFja2FnZShjb21wb3VuZE5hbWUsIG5hbWUpOworCQlyZXR1cm4gdGhpcy5uYW1lRW52aXJvbm1lbnQuaXNQYWNrYWdlKG51bGwsIG5hbWUpOworCXJldHVybiB0aGlzLm5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UoY29tcG91bmROYW1lLCBuYW1lKTsKIH0KIC8vIFRoZSBtZXRob2QgdmVyaWZpZXIgaXMgbGF6aWx5IGluaXRpYWxpemVkIHRvIGd1YXJhbnRlZSB0aGUgcmVjZWl2ZXIsIHRoZSBjb21waWxlciAmIHRoZSBvcmFjbGUgYXJlIHJlYWR5LgotCiBwdWJsaWMgTWV0aG9kVmVyaWZpZXIgbWV0aG9kVmVyaWZpZXIoKSB7Ci0JaWYgKHZlcmlmaWVyID09IG51bGwpCi0JCXZlcmlmaWVyID0gdGhpcy5nbG9iYWxPcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNQotCQkJPyBuZXcgTWV0aG9kVmVyaWZpZXIodGhpcykKLQkJCTogbmV3IE1ldGhvZFZlcmlmaWVyMTUodGhpcyk7IC8vIGNvdmFyaWFuY2Ugb25seSBpZiBzb3VyY2VMZXZlbCBpcyA+PSAxLjUKLQlyZXR1cm4gdmVyaWZpZXI7CisJaWYgKHRoaXMudmVyaWZpZXIgPT0gbnVsbCkKKwkJdGhpcy52ZXJpZmllciA9IG5ld01ldGhvZFZlcmlmaWVyKCk7CisJcmV0dXJuIHRoaXMudmVyaWZpZXI7CiB9CisKK3B1YmxpYyBNZXRob2RWZXJpZmllciBuZXdNZXRob2RWZXJpZmllcigpIHsKKwkvKiBBbHdheXMgdXNlIE1ldGhvZFZlcmlmaWVyMTUuIEV2ZW4gaW4gYSAxLjQgcHJvamVjdCwgd2UgbXVzdCBpbnRlcm5hbGl6ZSB0eXBlIHZhcmlhYmxlcyBhbmQKKwkgICBvYnNlcnZlIGFueSBwYXJhbWV0ZXJpemF0aW9uIG9mIHN1cGVyIGNsYXNzIGFuZC9vciBzdXBlciBpbnRlcmZhY2VzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KKwkgICBkZXRlY3Qgb3ZlcnJpZGluZyBpbiB0aGUgcHJlc2VuY2Ugb2YgZ2VuZXJpY3MuCisJICAgU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAKKwkgKi8KKwlyZXR1cm4gbmV3IE1ldGhvZFZlcmlmaWVyMTUodGhpcyk7Cit9CisKK3B1YmxpYyB2b2lkIHJlbGVhc2VDbGFzc0ZpbGVzKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzKSB7CisJZm9yIChpbnQgaSA9IDAsIGZpbGVDb3VudCA9IGNsYXNzRmlsZXMubGVuZ3RoOyBpIDwgZmlsZUNvdW50OyBpKyspCisJCXRoaXMuY2xhc3NGaWxlUG9vbC5yZWxlYXNlKGNsYXNzRmlsZXNbaV0pOworfQorCiBwdWJsaWMgdm9pZCByZXNldCgpIHsKIAl0aGlzLmRlZmF1bHRQYWNrYWdlID0gbmV3IFBhY2thZ2VCaW5kaW5nKHRoaXMpOyAvLyBhc3N1bWUgdGhlIGRlZmF1bHQgcGFja2FnZSBhbHdheXMgZXhpc3RzCiAJdGhpcy5kZWZhdWx0SW1wb3J0cyA9IG51bGw7CkBAIC0xMTg5LDExICsxNDM2LDE2IEBACiAJCQlmb3IgKGludCBqID0gYXJyYXlCaW5kaW5ncy5sZW5ndGg7IC0taiA+PSAwOykKIAkJCQlhcnJheUJpbmRpbmdzW2pdID0gbnVsbDsKIAl9CisJLy8gTk9URTogcmVtZW1iZXIgdG8gZml4ICN1cGRhdGVDYWNoZXMoLi4uKSB3aGVuIGFkZGluZyB1bmlxdWUgYmluZGluZyBjYWNoZXMKIAl0aGlzLnVuaXF1ZVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZ3MgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CiAJdGhpcy51bmlxdWVSYXdUeXBlQmluZGluZ3MgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CiAJdGhpcy51bmlxdWVXaWxkY2FyZEJpbmRpbmdzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOwogCXRoaXMudW5pcXVlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5ncyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKLQkKKwl0aGlzLnVuaXF1ZVBvbHltb3JwaGljTWV0aG9kQmluZGluZ3MgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CisJdGhpcy51bmlxdWVHZXRDbGFzc01ldGhvZEJpbmRpbmcgPSBudWxsOworCXRoaXMubWlzc2luZ1R5cGVzID0gbnVsbDsKKwl0aGlzLnR5cGVzQmVpbmdDb25uZWN0ZWQgPSBuZXcgSGFzaFNldCgpOworCiAJZm9yIChpbnQgaSA9IHRoaXMudW5pdHMubGVuZ3RoOyAtLWkgPj0gMDspCiAJCXRoaXMudW5pdHNbaV0gPSBudWxsOwogCXRoaXMubGFzdFVuaXRJbmRleCA9IC0xOwpAQCAtMTIwNCw2ICsxNDU2LDcgQEAKIAkvLyBuYW1lIGVudmlyb25tZW50IGhhcyBhIGxvbmdlciBsaWZlIGN5Y2xlLCBhbmQgbXVzdCBiZSByZXNldCBpbgogCS8vIHRoZSBjb2RlIHdoaWNoIGNyZWF0ZWQgaXQuCiB9CisKIC8qKgogICogQXNzb2NpYXRlIGEgZ2l2ZW4gdHlwZSB3aXRoIHNvbWUgYWNjZXNzIHJlc3RyaWN0aW9uCiAgKiAoZGlkIG5vdCBzdG9yZSB0aGUgcmVzdHJpY3Rpb24gZGlyZWN0bHkgaW50byBiaW5kaW5nLCBzaW5jZSBzcGFyc2UgaW5mb3JtYXRpb24pCkBAIC0xMjI2LDcgKzE0NzksMTUgQEAKIAkJCX0KIAkJfQogCX0KLQorCWlmICh0aGlzLnVuaXF1ZVJhd1R5cGVCaW5kaW5ncy5nZXQodW5yZXNvbHZlZFR5cGUpICE9IG51bGwpIHsgLy8gdXBkYXRlIHRoZSBrZXkKKwkJT2JqZWN0W10ga2V5cyA9IHRoaXMudW5pcXVlUmF3VHlwZUJpbmRpbmdzLmtleVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlpZiAoa2V5c1tpXSA9PSB1bnJlc29sdmVkVHlwZSkgeworCQkJCWtleXNbaV0gPSByZXNvbHZlZFR5cGU7IC8vIGhhc2hDb2RlIGlzIGJhc2VkIG9uIGNvbXBvdW5kTmFtZSBzbyB0aGlzIHdvcmtzCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CiAJaWYgKHRoaXMudW5pcXVlV2lsZGNhcmRCaW5kaW5ncy5nZXQodW5yZXNvbHZlZFR5cGUpICE9IG51bGwpIHsgLy8gdXBkYXRlIHRoZSBrZXkKIAkJT2JqZWN0W10ga2V5cyA9IHRoaXMudW5pcXVlV2lsZGNhcmRCaW5kaW5ncy5rZXlUYWJsZTsKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhCmluZGV4IDkyNTIwYzEuLjA4MGNjNWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWVtYmVyVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01lbWJlclR5cGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsOCArMTgsOCBAQAogCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLk1lbWJlclR5cGVNYXNrOwogfQogdm9pZCBjaGVja1N5bnRoZXRpY0FyZ3NBbmRGaWVsZHMoKSB7Ci0JaWYgKHRoaXMuaXNTdGF0aWMoKSkgcmV0dXJuOwotCWlmICh0aGlzLmlzSW50ZXJmYWNlKCkpIHJldHVybjsKKwlpZiAoaXNTdGF0aWMoKSkgcmV0dXJuOworCWlmIChpc0ludGVyZmFjZSgpKSByZXR1cm47CiAJdGhpcy5hZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKHRoaXMuZW5jbG9zaW5nVHlwZSk7CiB9CiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgpAQCAtMjgsMTAgKzI4LDEwIEBACiAqLwogCiBwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKLQlpZiAoY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKQotCQlyZXR1cm4gY29uc3RhbnRQb29sTmFtZTsKKwlpZiAodGhpcy5jb25zdGFudFBvb2xOYW1lICE9IG51bGwpCisJCXJldHVybiB0aGlzLmNvbnN0YW50UG9vbE5hbWU7CiAKLQlyZXR1cm4gY29uc3RhbnRQb29sTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCksIHNvdXJjZU5hbWUsICckJyk7CisJcmV0dXJuIHRoaXMuY29uc3RhbnRQb29sTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCksIHRoaXMuc291cmNlTmFtZSwgJyQnKTsKIH0KIAogLyoqCkBAIC00Myw3ICs0Myw3IEBACiAJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRGVwcmVjYXRlZCkgPT0gMCkgewogCQkJLy8gY2hlY2sgZW5jbG9zaW5nIHR5cGUKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nOwotCQkJaWYgKCgoZW5jbG9zaW5nID0gdGhpcy5lbmNsb3NpbmdUeXBlKCkpLnRhZ0JpdHMgJiBUYWdCaXRzLkRlcHJlY2F0ZWRBbm5vdGF0aW9uUmVzb2x2ZWQpID09IDApIHsKKwkJCWlmICgoKGVuY2xvc2luZyA9IGVuY2xvc2luZ1R5cGUoKSkudGFnQml0cyAmIFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCkgPT0gMCkgewogCQkJCWVuY2xvc2luZy5pbml0aWFsaXplRGVwcmVjYXRlZEFubm90YXRpb25UYWdCaXRzKCk7CiAJCQl9CiAJCQlpZiAoZW5jbG9zaW5nLmlzVmlld2VkQXNEZXByZWNhdGVkKCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKaW5kZXggNjM0YjkxNC4uMzNjNTZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsMjUgKzEsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIE1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIHsKLQkKKwogCXB1YmxpYyBpbnQgbW9kaWZpZXJzOwogCXB1YmxpYyBjaGFyW10gc2VsZWN0b3I7CiAJcHVibGljIFR5cGVCaW5kaW5nIHJldHVyblR5cGU7CkBAIC0yOSw3ICszMyw3IEBACiAJcHVibGljIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUzsKIAljaGFyW10gc2lnbmF0dXJlOwogCXB1YmxpYyBsb25nIHRhZ0JpdHM7Ci0JCisKIHByb3RlY3RlZCBNZXRob2RCaW5kaW5nKCkgewogCS8vIGZvciBjcmVhdGluZyBwcm9ibGVtIG9yIHN5bnRoZXRpYyBtZXRob2QKIH0KQEAgLTQwLDcgKzQ0LDcgQEAKIAl0aGlzLnBhcmFtZXRlcnMgPSAocGFyYW1ldGVycyA9PSBudWxsIHx8IHBhcmFtZXRlcnMubGVuZ3RoID09IDApID8gQmluZGluZy5OT19QQVJBTUVURVJTIDogcGFyYW1ldGVyczsKIAl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSAodGhyb3duRXhjZXB0aW9ucyA9PSBudWxsIHx8IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoID09IDApID8gQmluZGluZy5OT19FWENFUFRJT05TIDogdGhyb3duRXhjZXB0aW9uczsKIAl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7Ci0JCisKIAkvLyBwcm9wYWdhdGUgdGhlIHN0cmljdGZwICYgZGVwcmVjYXRlZCBtb2RpZmllcnMKIAlpZiAodGhpcy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7CiAJCWlmICh0aGlzLmRlY2xhcmluZ0NsYXNzLmlzU3RyaWN0ZnAoKSkKQEAgLTY1LDMxICs2OSwxNSBAQAogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKIAlUeXBlQmluZGluZ1tdIGFyZ3MgPSBtZXRob2QucGFyYW1ldGVyczsKLQlpZiAocGFyYW1ldGVycyA9PSBhcmdzKQorCWlmICh0aGlzLnBhcmFtZXRlcnMgPT0gYXJncykKIAkJcmV0dXJuIHRydWU7CiAKLQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7CiAJaWYgKGxlbmd0aCAhPSBhcmdzLmxlbmd0aCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJaWYgKHBhcmFtZXRlcnNbaV0gIT0gYXJnc1tpXSAmJiBwYXJhbWV0ZXJzW2ldLmVyYXN1cmUoKSAhPSBhcmdzW2ldLmVyYXN1cmUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qIEFuc3dlciB0cnVlIGlmIHRoZSBhcmd1bWVudCB0eXBlcyAmIHRoZSByZWNlaXZlcidzIHBhcmFtZXRlcnMgYXJlIGVxdWFsCi0qLwotcHVibGljIGZpbmFsIGJvb2xlYW4gYXJlUGFyYW1ldGVyc0VxdWFsKE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7Ci0JVHlwZUJpbmRpbmdbXSBhcmdzID0gbWV0aG9kLnBhcmFtZXRlcnM7Ci0JaWYgKHBhcmFtZXRlcnMgPT0gYXJncykKLQkJcmV0dXJuIHRydWU7Ci0KLQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7Ci0JaWYgKGxlbmd0aCAhPSBhcmdzLmxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmIChwYXJhbWV0ZXJzW2ldICE9IGFyZ3NbaV0pCisJCWlmICh0aGlzLnBhcmFtZXRlcnNbaV0gIT0gYXJnc1tpXSAmJiB0aGlzLnBhcmFtZXRlcnNbaV0uZXJhc3VyZSgpICE9IGFyZ3NbaV0uZXJhc3VyZSgpKQogCQkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQpAQCAtMTA1LDEyICs5MywxMiBAQAogCWlmIChpc1ZhcmFyZ3MoKSkgewogCQlsYXN0SW5kZXggPSBwYXJhbUxlbmd0aCAtIDE7CiAJCWlmIChwYXJhbUxlbmd0aCA9PSBhcmdMZW5ndGgpIHsgLy8gYWNjZXB0IFhbXSBidXQgbm90IFggb3IgWFtdW10KLQkJCVR5cGVCaW5kaW5nIHZhckFyZ1R5cGUgPSBwYXJhbWV0ZXJzW2xhc3RJbmRleF07IC8vIGlzIGFuIEFycmF5QmluZGluZyBieSBkZWZpbml0aW9uCisJCQlUeXBlQmluZGluZyB2YXJBcmdUeXBlID0gdGhpcy5wYXJhbWV0ZXJzW2xhc3RJbmRleF07IC8vIGlzIGFuIEFycmF5QmluZGluZyBieSBkZWZpbml0aW9uCiAJCQlUeXBlQmluZGluZyBsYXN0QXJndW1lbnQgPSBhcmd1bWVudHNbbGFzdEluZGV4XTsKIAkJCWlmICh2YXJBcmdUeXBlICE9IGxhc3RBcmd1bWVudCAmJiAhbGFzdEFyZ3VtZW50LmlzQ29tcGF0aWJsZVdpdGgodmFyQXJnVHlwZSkpCiAJCQkJcmV0dXJuIGZhbHNlOwogCQl9IGVsc2UgaWYgKHBhcmFtTGVuZ3RoIDwgYXJnTGVuZ3RoKSB7IC8vIGFsbCByZW1haW5pZyBhcmd1bWVudCB0eXBlcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZWxlbWVudHNUeXBlIG9mIHZhckFyZ1R5cGUKLQkJCVR5cGVCaW5kaW5nIHZhckFyZ1R5cGUgPSAoKEFycmF5QmluZGluZykgcGFyYW1ldGVyc1tsYXN0SW5kZXhdKS5lbGVtZW50c1R5cGUoKTsKKwkJCVR5cGVCaW5kaW5nIHZhckFyZ1R5cGUgPSAoKEFycmF5QmluZGluZykgdGhpcy5wYXJhbWV0ZXJzW2xhc3RJbmRleF0pLmVsZW1lbnRzVHlwZSgpOwogCQkJZm9yIChpbnQgaSA9IGxhc3RJbmRleDsgaSA8IGFyZ0xlbmd0aDsgaSsrKQogCQkJCWlmICh2YXJBcmdUeXBlICE9IGFyZ3VtZW50c1tpXSAmJiAhYXJndW1lbnRzW2ldLmlzQ29tcGF0aWJsZVdpdGgodmFyQXJnVHlwZSkpCiAJCQkJCXJldHVybiBmYWxzZTsKQEAgLTEyMCw3ICsxMDgsMjMgQEAKIAkJLy8gbm93IGNvbXBhcmUgc3RhbmRhcmQgYXJndW1lbnRzIGZyb20gMCB0byBsYXN0SW5kZXgKIAl9CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0SW5kZXg7IGkrKykKLQkJaWYgKHBhcmFtZXRlcnNbaV0gIT0gYXJndW1lbnRzW2ldICYmICFhcmd1bWVudHNbaV0uaXNDb21wYXRpYmxlV2l0aChwYXJhbWV0ZXJzW2ldKSkKKwkJaWYgKHRoaXMucGFyYW1ldGVyc1tpXSAhPSBhcmd1bWVudHNbaV0gJiYgIWFyZ3VtZW50c1tpXS5pc0NvbXBhdGlibGVXaXRoKHRoaXMucGFyYW1ldGVyc1tpXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgdHlwZXMgJiB0aGUgcmVjZWl2ZXIncyBwYXJhbWV0ZXJzIGFyZSBlcXVhbAorKi8KK3B1YmxpYyBmaW5hbCBib29sZWFuIGFyZVBhcmFtZXRlcnNFcXVhbChNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCVR5cGVCaW5kaW5nW10gYXJncyA9IG1ldGhvZC5wYXJhbWV0ZXJzOworCWlmICh0aGlzLnBhcmFtZXRlcnMgPT0gYXJncykKKwkJcmV0dXJuIHRydWU7CisKKwlpbnQgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsKKwlpZiAobGVuZ3RoICE9IGFyZ3MubGVuZ3RoKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAodGhpcy5wYXJhbWV0ZXJzW2ldICE9IGFyZ3NbaV0pCiAJCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xMjksMTkgKzEzMyw2IEBACiAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBiaW5kaW5nIHR5cGUgZnJvbSBCaW5kaW5nLkJpbmRpbmdJRC4KICovCiAKLXB1YmxpYyBmaW5hbCBpbnQga2luZCgpIHsKLQlyZXR1cm4gQmluZGluZy5NRVRIT0Q7Ci19Ci0vKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgaW52b2NhdGlvblBhY2thZ2UuCi0qLwotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShQYWNrYWdlQmluZGluZyBpbnZvY2F0aW9uUGFja2FnZSkgewotCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKLQlpZiAoaXNQcml2YXRlKCkpIHJldHVybiBmYWxzZTsKLQotCS8vIGlzUHJvdGVjdGVkKCkgb3IgaXNEZWZhdWx0KCkKLQlyZXR1cm4gaW52b2NhdGlvblBhY2thZ2UgPT0gZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpOwotfQogLyogQW5zd2VyIHRydWUgaWYgdGhlIHR5cGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgZXJhc3VyZQogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGFyZVR5cGVWYXJpYWJsZUVyYXN1cmVzRXF1YWwoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKQEAgLTE1OCw2ICsxNDksMzggQEAKIAkJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKIH0KK01ldGhvZEJpbmRpbmcgYXNSYXdNZXRob2QoTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CisJaWYgKHRoaXMudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSByZXR1cm4gdGhpczsKKworCS8vIHN1YnN0aXR1dGUgdHlwZSBhcmd1bWVudHMgd2l0aCByYXcgdHlwZXMKKwlpbnQgbGVuZ3RoID0gdGhpcy50eXBlVmFyaWFibGVzLmxlbmd0aDsKKwlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJVHlwZVZhcmlhYmxlQmluZGluZyB2YXIgPSB0aGlzLnR5cGVWYXJpYWJsZXNbaV07CisJCWlmICh2YXIuYm91bmRzQ291bnQoKSA8PSAxKSB7CisJCQlhcmd1bWVudHNbaV0gPSBlbnYuY29udmVydFRvUmF3VHlwZSh2YXIudXBwZXJCb3VuZCgpLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHVzZSBhbiBpbnRlcnNlY3Rpb24gdHlwZSB0byByZXRhaW4gZnVsbCBib3VuZCBpbmZvcm1hdGlvbiBpZiBtb3JlIHRoYW4gMSBib3VuZAorCQkJVHlwZUJpbmRpbmdbXSBpdHNTdXBlcmludGVyZmFjZXMgPSB2YXIuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpbnQgc3VwZXJMZW5ndGggPSBpdHNTdXBlcmludGVyZmFjZXMubGVuZ3RoOworCQkJVHlwZUJpbmRpbmcgcmF3Rmlyc3RCb3VuZCA9IG51bGw7CisJCQlUeXBlQmluZGluZ1tdIHJhd090aGVyQm91bmRzID0gbnVsbDsKKwkJCWlmICh2YXIuYm91bmRzQ291bnQoKSA9PSBzdXBlckxlbmd0aCkgeworCQkJCXJhd0ZpcnN0Qm91bmQgPSBlbnYuY29udmVydFRvUmF3VHlwZShpdHNTdXBlcmludGVyZmFjZXNbMF0sIGZhbHNlKTsKKwkJCQlyYXdPdGhlckJvdW5kcyA9IG5ldyBUeXBlQmluZGluZ1tzdXBlckxlbmd0aCAtIDFdOworCQkJCWZvciAoaW50IHMgPSAxOyBzIDwgc3VwZXJMZW5ndGg7IHMrKykKKwkJCQkJcmF3T3RoZXJCb3VuZHNbcyAtIDFdID0gZW52LmNvbnZlcnRUb1Jhd1R5cGUoaXRzU3VwZXJpbnRlcmZhY2VzW3NdLCBmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCXJhd0ZpcnN0Qm91bmQgPSBlbnYuY29udmVydFRvUmF3VHlwZSh2YXIuc3VwZXJjbGFzcygpLCBmYWxzZSk7CisJCQkJcmF3T3RoZXJCb3VuZHMgPSBuZXcgVHlwZUJpbmRpbmdbc3VwZXJMZW5ndGhdOworCQkJCWZvciAoaW50IHMgPSAwOyBzIDwgc3VwZXJMZW5ndGg7IHMrKykKKwkJCQkJcmF3T3RoZXJCb3VuZHNbc10gPSBlbnYuY29udmVydFRvUmF3VHlwZShpdHNTdXBlcmludGVyZmFjZXNbc10sIGZhbHNlKTsKKwkJCX0KKwkJCWFyZ3VtZW50c1tpXSA9IGVudi5jcmVhdGVXaWxkY2FyZChudWxsLCAwLCByYXdGaXJzdEJvdW5kLCByYXdPdGhlckJvdW5kcywgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaWxkY2FyZC5FWFRFTkRTKTsKKwkJfQorCX0KKwlyZXR1cm4gZW52LmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKHRoaXMsIGFyZ3VtZW50cyk7Cit9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCiAqIEludm9jYXRpb25TaXRlIGltcGxlbWVudHMgaXNTdXBlckFjY2VzcygpIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiBpZiB0aGUgcmVjZWl2ZXIgaXMgcHJvdGVjdGVkLgpAQCAtMTcxLDExICsxOTQsMTEgQEAKIAlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CiAKIAlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiB0cnVlOworCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzLmRlY2xhcmluZ0NsYXNzKSByZXR1cm4gdHJ1ZTsKIAogCWlmIChpc1Byb3RlY3RlZCgpKSB7CiAJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBpbnZvY2F0aW9uVHlwZQotCQlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UpIHJldHVybiB0cnVlOworCQlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gdGhpcy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CiAJCXJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1N1cGVyQWNjZXNzKCk7CiAJfQogCkBAIC0xODksNyArMjEyLDcgQEAKIAkJCXRlbXAgPSB0ZW1wLmVuY2xvc2luZ1R5cGUoKTsKIAkJfQogCi0JCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKWRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKKwkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CiAJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKIAkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewogCQkJb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRlbXA7CkBAIC0xOTksOCArMjIyLDE2IEBACiAJfQogCiAJLy8gaXNEZWZhdWx0KCkKLQlyZXR1cm4gaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJcmV0dXJuIGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IHRoaXMuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CiB9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShQYWNrYWdlQmluZGluZyBpbnZvY2F0aW9uUGFja2FnZSkgeworCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKKwlpZiAoaXNQcml2YXRlKCkpIHJldHVybiBmYWxzZTsKKworCS8vIGlzUHJvdGVjdGVkKCkgb3IgaXNEZWZhdWx0KCkKKwlyZXR1cm4gaW52b2NhdGlvblBhY2thZ2UgPT0gdGhpcy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCk7Cit9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSB0eXBlIHByb3ZpZGVkIGJ5IHRoZSBzY29wZS4KICogSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cyBpc1N1cGVyQWNjZXNzKCkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIGlmIHRoZSByZWNlaXZlciBpcyBwcm90ZWN0ZWQuCkBAIC0yMTEsMTAgKzI0MiwxMCBAQAogCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKIAogCVNvdXJjZVR5cGVCaW5kaW5nIGludm9jYXRpb25UeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCWlmIChpbnZvY2F0aW9uVHlwZSA9PSBkZWNsYXJpbmdDbGFzcyAmJiBpbnZvY2F0aW9uVHlwZSA9PSByZWNlaXZlclR5cGUpIHJldHVybiB0cnVlOworCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzLmRlY2xhcmluZ0NsYXNzICYmIGludm9jYXRpb25UeXBlID09IHJlY2VpdmVyVHlwZSkgcmV0dXJuIHRydWU7CiAKIAlpZiAoaW52b2NhdGlvblR5cGUgPT0gbnVsbCkgLy8gc3RhdGljIGltcG9ydCBjYWxsCi0JCXJldHVybiAhaXNQcml2YXRlKCkgJiYgc2NvcGUuZ2V0Q3VycmVudFBhY2thZ2UoKSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZTsKKwkJcmV0dXJuICFpc1ByaXZhdGUoKSAmJiBzY29wZS5nZXRDdXJyZW50UGFja2FnZSgpID09IHRoaXMuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CiAKIAlpZiAoaXNQcm90ZWN0ZWQoKSkgewogCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgaW52b2NhdGlvblR5cGUgaXMgdGhlIGRlY2xhcmluZ0NsYXNzIG9yIHRoZXkgYXJlIGluIHRoZSBzYW1lIHBhY2thZ2UKQEAgLTIyMiwxNSArMjUzLDE1IEBACiAJCS8vICAgIEFORCB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSBpbnZvY2F0aW9uVHlwZSBvciBpdHMgc3ViY2xhc3MKIAkJLy8gICAgT1IgdGhlIG1ldGhvZCBpcyBhIHN0YXRpYyBtZXRob2QgYWNjZXNzZWQgZGlyZWN0bHkgdGhyb3VnaCBhIHR5cGUKIAkJLy8gICAgT1IgcHJldmlvdXMgYXNzZXJ0aW9ucyBhcmUgdHJ1ZSBmb3Igb25lIG9mIHRoZSBlbmNsb3NpbmcgdHlwZQotCQlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiB0cnVlOwotCQlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UpIHJldHVybiB0cnVlOwotCQkKKwkJaWYgKGludm9jYXRpb25UeXBlID09IHRoaXMuZGVjbGFyaW5nQ2xhc3MpIHJldHVybiB0cnVlOworCQlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gdGhpcy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisKIAkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGludm9jYXRpb25UeXBlOwotCQlUeXBlQmluZGluZyByZWNlaXZlckVyYXN1cmUgPSByZWNlaXZlclR5cGUuZXJhc3VyZSgpOwkJCi0JCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nRXJhc3VyZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBkZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7CisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyRXJhc3VyZSA9IHJlY2VpdmVyVHlwZS5lcmFzdXJlKCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nRXJhc3VyZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKIAkJaW50IGRlcHRoID0gMDsKIAkJZG8gewotCQkJaWYgKGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoZGVjbGFyaW5nRXJhc3VyZSkgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZGVjbGFyaW5nRXJhc3VyZSkgIT0gbnVsbCkgewogCQkJCWlmIChpbnZvY2F0aW9uU2l0ZS5pc1N1cGVyQWNjZXNzKCkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKQEAgLTI0MCw3ICsyNzEsNyBAQAogCQkJCQlpZiAoZGVwdGggPiAwKSBpbnZvY2F0aW9uU2l0ZS5zZXREZXB0aChkZXB0aCk7CiAJCQkJCXJldHVybiB0cnVlOyAvLyBzZWUgMUZNRVBETCAtIHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1R5cGVBY2Nlc3MoKTsKIAkJCQl9Ci0JCQkJaWYgKGN1cnJlbnRUeXBlID09IHJlY2VpdmVyRXJhc3VyZSB8fCByZWNlaXZlckVyYXN1cmUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShjdXJyZW50VHlwZSkgIT0gbnVsbCkgeworCQkJCWlmIChjdXJyZW50VHlwZSA9PSByZWNlaXZlckVyYXN1cmUgfHwgcmVjZWl2ZXJFcmFzdXJlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oY3VycmVudFR5cGUpICE9IG51bGwpIHsKIAkJCQkJaWYgKGRlcHRoID4gMCkgaW52b2NhdGlvblNpdGUuc2V0RGVwdGgoZGVwdGgpOwogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9CkBAIC0yNTUsMTUgKzI4NiwxNSBAQAogCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcwogCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgZGVjbGFyaW5nQ2xhc3MgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCiAJCXJlY2VpdmVyQ2hlY2s6IHsKLQkJCWlmIChyZWNlaXZlclR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHsKLQkJCQkvLyBzcGVjaWFsIHRvbGVyYW5jZSBmb3IgdHlwZSB2YXJpYWJsZSBkaXJlY3QgYm91bmRzCi0JCQkJaWYgKHJlY2VpdmVyVHlwZS5pc1R5cGVWYXJpYWJsZSgpICYmICgoVHlwZVZhcmlhYmxlQmluZGluZykgcmVjZWl2ZXJUeXBlKS5pc0VyYXN1cmVCb3VuZFRvKGRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKSkpCisJCQlpZiAocmVjZWl2ZXJUeXBlICE9IHRoaXMuZGVjbGFyaW5nQ2xhc3MpIHsKKwkJCQkvLyBzcGVjaWFsIHRvbGVyYW5jZSBmb3IgdHlwZSB2YXJpYWJsZSBkaXJlY3QgYm91bmRzLCBidXQgb25seSBpZiBjb21wbGlhbmNlIDw9IDEuNiwgc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NjIyCisJCQkJaWYgKHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82ICYmIHJlY2VpdmVyVHlwZS5pc1R5cGVWYXJpYWJsZSgpICYmICgoVHlwZVZhcmlhYmxlQmluZGluZykgcmVjZWl2ZXJUeXBlKS5pc0VyYXN1cmVCb3VuZFRvKHRoaXMuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpKSkKIAkJCQkJYnJlYWsgcmVjZWl2ZXJDaGVjazsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KIAotCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHsKKwkJaWYgKGludm9jYXRpb25UeXBlICE9IHRoaXMuZGVjbGFyaW5nQ2xhc3MpIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IGludm9jYXRpb25UeXBlOwogCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CiAJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CkBAIC0yNzEsNyArMzAyLDcgQEAKIAkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CiAJCQl9CiAKLQkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKWRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpOwogCQkJdGVtcCA9IG91dGVyRGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpOwogCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewogCQkJCW91dGVyRGVjbGFyaW5nQ2xhc3MgPSB0ZW1wOwpAQCAtMjgzLDIxICszMTQsNDggQEAKIAl9CiAKIAkvLyBpc0RlZmF1bHQoKQotCVBhY2thZ2VCaW5kaW5nIGRlY2xhcmluZ1BhY2thZ2UgPSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZTsKKwlQYWNrYWdlQmluZGluZyBkZWNsYXJpbmdQYWNrYWdlID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZTsKIAlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgIT0gZGVjbGFyaW5nUGFja2FnZSkgcmV0dXJuIGZhbHNlOwogCiAJLy8gcmVjZWl2ZXJUeXBlIGNhbiBiZSBhbiBhcnJheSBiaW5kaW5nIGluIG9uZSBjYXNlLi4uIHNlZSBpZiB5b3UgY2FuIGNoYW5nZSBpdAogCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpCiAJCXJldHVybiBmYWxzZTsKLQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwlUeXBlQmluZGluZyBvcmlnaW5hbERlY2xhcmluZ0NsYXNzID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5vcmlnaW5hbCgpOworCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgKHJlY2VpdmVyVHlwZSk7CiAJZG8gewotCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gY3VycmVudFR5cGUpIHJldHVybiB0cnVlOworCQlpZiAoY3VycmVudFR5cGUuaXNDYXB0dXJlKCkpIHsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTAwMgorCQkJaWYgKG9yaWdpbmFsRGVjbGFyaW5nQ2xhc3MgPT0gY3VycmVudFR5cGUuZXJhc3VyZSgpLm9yaWdpbmFsKCkpIHJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJaWYgKG9yaWdpbmFsRGVjbGFyaW5nQ2xhc3MgPT0gY3VycmVudFR5cGUub3JpZ2luYWwoKSkgcmV0dXJuIHRydWU7CisJCX0KIAkJUGFja2FnZUJpbmRpbmcgY3VycmVudFBhY2thZ2UgPSBjdXJyZW50VHlwZS5mUGFja2FnZTsKIAkJLy8gcGFja2FnZSBjb3VsZCBiZSBudWxsIGZvciB3aWxkY2FyZHMvaW50ZXJzZWN0aW9uIHR5cGVzLCBpZ25vcmUgYW5kIHJlY3Vyc2UgaW4gc3VwZXJjbGFzcwogCQlpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCAmJiBjdXJyZW50UGFja2FnZSAhPSBkZWNsYXJpbmdQYWNrYWdlKSByZXR1cm4gZmFsc2U7CiAJfSB3aGlsZSAoKGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKIAlyZXR1cm4gZmFsc2U7CiB9CisKK3B1YmxpYyBMaXN0IGNvbGxlY3RNaXNzaW5nVHlwZXMoTGlzdCBtaXNzaW5nVHlwZXMpIHsKKwlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJbWlzc2luZ1R5cGVzID0gdGhpcy5yZXR1cm5UeXBlLmNvbGxlY3RNaXNzaW5nVHlwZXMobWlzc2luZ1R5cGVzKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJbWlzc2luZ1R5cGVzID0gdGhpcy5wYXJhbWV0ZXJzW2ldLmNvbGxlY3RNaXNzaW5nVHlwZXMobWlzc2luZ1R5cGVzKTsKKwkJfQorCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQltaXNzaW5nVHlwZXMgPSB0aGlzLnRocm93bkV4Y2VwdGlvbnNbaV0uY29sbGVjdE1pc3NpbmdUeXBlcyhtaXNzaW5nVHlwZXMpOworCQl9CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSB0aGlzLnR5cGVWYXJpYWJsZXNbaV07CisJCQltaXNzaW5nVHlwZXMgPSB2YXJpYWJsZS5zdXBlcmNsYXNzKCkuY29sbGVjdE1pc3NpbmdUeXBlcyhtaXNzaW5nVHlwZXMpOworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSB2YXJpYWJsZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJbWlzc2luZ1R5cGVzID0gaW50ZXJmYWNlc1tqXS5jb2xsZWN0TWlzc2luZ1R5cGVzKG1pc3NpbmdUeXBlcyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG1pc3NpbmdUeXBlczsKK30KKwogTWV0aG9kQmluZGluZyBjb21wdXRlU3Vic3RpdHV0ZWRNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QsIExvb2t1cEVudmlyb25tZW50IGVudikgewogCWludCBsZW5ndGggPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB2YXJzID0gbWV0aG9kLnR5cGVWYXJpYWJsZXM7CkBAIC0zMTQsMjQgKzM3MiwyNSBAQAogCQkJcmV0dXJuIG51bGw7CiAJcmV0dXJuIHN1YnN0aXR1dGU7CiB9CisKIC8qCiAgKiBkZWNsYXJpbmdVbmlxdWVLZXkgZG90IHNlbGVjdG9yIGdlbmVyaWNTaWduYXR1cmUKICAqIHAuWCB7IDxUPiB2b2lkIGJhcihYPFQ+IHQpIH0gLS0+IExwL1g7LmJhcjxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTFg8VFQ7PjspVgogICovCiBwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKLQkvLyBkZWNsYXJpbmcgY2xhc3MgCisJLy8gZGVjbGFyaW5nIGNsYXNzCiAJY2hhcltdIGRlY2xhcmluZ0tleSA9IHRoaXMuZGVjbGFyaW5nQ2xhc3MuY29tcHV0ZVVuaXF1ZUtleShmYWxzZS8qbm90IGEgbGVhZiovKTsKIAlpbnQgZGVjbGFyaW5nTGVuZ3RoID0gZGVjbGFyaW5nS2V5Lmxlbmd0aDsKLQkKKwogCS8vIHNlbGVjdG9yCiAJaW50IHNlbGVjdG9yTGVuZ3RoID0gdGhpcy5zZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLklOSVQgPyAwIDogdGhpcy5zZWxlY3Rvci5sZW5ndGg7Ci0JCisKIAkvLyBnZW5lcmljIHNpZ25hdHVyZQogCWNoYXJbXSBzaWcgPSBnZW5lcmljU2lnbmF0dXJlKCk7CiAJYm9vbGVhbiBpc0dlbmVyaWMgPSBzaWcgIT0gbnVsbDsKIAlpZiAoIWlzR2VuZXJpYykgc2lnID0gc2lnbmF0dXJlKCk7CiAJaW50IHNpZ25hdHVyZUxlbmd0aCA9IHNpZy5sZW5ndGg7Ci0JCisKIAkvLyB0aHJvd24gZXhjZXB0aW9ucwogCWludCB0aHJvd25FeGNlcHRpb25zTGVuZ3RoID0gdGhpcy50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKIAlpbnQgdGhyb3duRXhjZXB0aW9uc1NpZ25hdHVyZUxlbmd0aCA9IDA7CkBAIC0zNDYsNyArNDA1LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCWNoYXJbXSB1bmlxdWVLZXkgPSBuZXcgY2hhcltkZWNsYXJpbmdMZW5ndGggKyAxICsgc2VsZWN0b3JMZW5ndGggKyBzaWduYXR1cmVMZW5ndGggKyB0aHJvd25FeGNlcHRpb25zU2lnbmF0dXJlTGVuZ3RoXTsKIAlpbnQgaW5kZXggPSAwOwogCVN5c3RlbS5hcnJheWNvcHkoZGVjbGFyaW5nS2V5LCAwLCB1bmlxdWVLZXksIGluZGV4LCBkZWNsYXJpbmdMZW5ndGgpOwpAQCAtMzY3LDE2ICs0MjYsOSBAQAogCQkJfQogCQl9CiAJfQotCiAJcmV0dXJuIHVuaXF1ZUtleTsKIH0KLS8qIAotICogQW5zd2VyIHRoZSBkZWNsYXJpbmcgY2xhc3MgdG8gdXNlIGluIHRoZSBjb25zdGFudCBwb29sCi0gKiBtYXkgbm90IGJlIGEgcmVmZXJlbmNlIGJpbmRpbmcgKHNlZSBzdWJ0eXBlcykKLSAqLwotcHVibGljIFR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKCkgewotCXJldHVybiB0aGlzLmRlY2xhcmluZ0NsYXNzOwotfQorCiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgogKgogKiA8aW5pdD4gZm9yIGNvbnN0cnVjdG9ycwpAQCAtMzg0LDEzICs0MzYsMzEgQEAKICogb3IgdGhlIHNvdXJjZSBuYW1lIG9mIHRoZSBtZXRob2QKICovCiBwdWJsaWMgZmluYWwgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSB7Ci0JcmV0dXJuIHNlbGVjdG9yOworCXJldHVybiB0aGlzLnNlbGVjdG9yOwogfQorCitwdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kT3JpZ2luYWxJbmhlcml0ZWRNZXRob2QoTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE9yaWdpbmFsID0gaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCk7CisJVHlwZUJpbmRpbmcgc3VwZXJUeXBlID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGluaGVyaXRlZE9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzKTsKKwlpZiAoc3VwZXJUeXBlID09IG51bGwgfHwgIShzdXBlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgcmV0dXJuIG51bGw7CisKKwlpZiAoaW5oZXJpdGVkT3JpZ2luYWwuZGVjbGFyaW5nQ2xhc3MgIT0gc3VwZXJUeXBlKSB7CisJCS8vIG11c3QgZmluZCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggdGhlIHNhbWUgc3Vic3RpdHV0ZWQgdmFyaWFibGVzCisJCU1ldGhvZEJpbmRpbmdbXSBzdXBlck1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZSkuZ2V0TWV0aG9kcyhpbmhlcml0ZWRPcmlnaW5hbC5zZWxlY3RvciwgaW5oZXJpdGVkT3JpZ2luYWwucGFyYW1ldGVycy5sZW5ndGgpOworCQlmb3IgKGludCBtID0gMCwgbCA9IHN1cGVyTWV0aG9kcy5sZW5ndGg7IG0gPCBsOyBtKyspCisJCQlpZiAoc3VwZXJNZXRob2RzW21dLm9yaWdpbmFsKCkgPT0gaW5oZXJpdGVkT3JpZ2luYWwpCisJCQkJcmV0dXJuIHN1cGVyTWV0aG9kc1ttXTsKKwl9CisJcmV0dXJuIGluaGVyaXRlZE9yaWdpbmFsOworfQorCiAvKioKKyAqIDxwcmU+CiAgKjx0eXBlUGFyYW0xIC4uLiB0eXBlUGFyYW1NPihwYXJhbTEgLi4uIHBhcmFtTilyZXR1cm5UeXBlIHRocm93bkV4Y2VwdGlvbjEgLi4uIHRocm93bkV4Y2VwdGlvblAKICAqIFQgZm9vKFQgdCkgdGhyb3dzIFg8VD4gICAtLS0+ICAgKFRUOylUVDtMWDxUVDs+OwogICogdm9pZCBiYXIoWDxUPiB0KSAgIC0tPiAgIChMWDxUVDs+OylWCiAgKiA8VD4gdm9pZCBiYXIoWDxUPiB0KSAgIC0tPiAgPFQ6TGphdmEubGFuZy5PYmplY3Q7PihMWDxUVDs+OylWCisgKiA8L3ByZT4KICAqLwogcHVibGljIGNoYXJbXSBnZW5lcmljU2lnbmF0dXJlKCkgewogCWlmICgodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpID09IDApIHJldHVybiBudWxsOwpAQCAtNDA5LDcgKzQ3OSw3IEBACiAJc2lnLmFwcGVuZCgnKScpOwogCWlmICh0aGlzLnJldHVyblR5cGUgIT0gbnVsbCkKIAkJc2lnLmFwcGVuZCh0aGlzLnJldHVyblR5cGUuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSk7Ci0JCisKIAkvLyBvbmx5IGFwcGVuZCB0aHJvd24gZXhjZXB0aW9ucyBpZiBhbnkgaXMgZ2VuZXJpYy9wYXJhbWV0ZXJpemVkCiAJYm9vbGVhbiBuZWVkRXhjZXB0aW9uU2lnbmF0dXJlcyA9IGZhbHNlOwogCWludCBsZW5ndGggPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOwpAQCAtNDI3LDI1ICs0OTcsMTcgQEAKIAl9CiAJaW50IHNpZ0xlbmd0aCA9IHNpZy5sZW5ndGgoKTsKIAljaGFyW10gZ2VuZXJpY1NpZ25hdHVyZSA9IG5ldyBjaGFyW3NpZ0xlbmd0aF07Ci0Jc2lnLmdldENoYXJzKDAsIHNpZ0xlbmd0aCwgZ2VuZXJpY1NpZ25hdHVyZSwgMCk7CQorCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIGdlbmVyaWNTaWduYXR1cmUsIDApOwogCXJldHVybiBnZW5lcmljU2lnbmF0dXJlOwogfQotcHVibGljIEFubm90YXRpb25CaW5kaW5nW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCA9IHRoaXMub3JpZ2luYWwoKTsKLQlyZXR1cm4gb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmV0cmlldmVBbm5vdGF0aW9ucyhvcmlnaW5hbE1ldGhvZCk7Ci19Ci0vKioKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBvZiBpbnRlcmVzdAotICogQHJldHVybiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIDxjb2RlPmluZGV4PC9jb2RlPnRoIHBhcmFtZXRlcgotICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiA8Y29kZT5pbmRleDwvY29kZT4gaXMgbm90IHZhbGlkIAotICovCi1wdWJsaWMgQW5ub3RhdGlvbkJpbmRpbmdbXSBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhpbnQgaW5kZXgpIHsKLQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kID0gdGhpcy5vcmlnaW5hbCgpOwotCUFubm90YXRpb25Ib2xkZXIgaG9sZGVyID0gb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmV0cmlldmVBbm5vdGF0aW9uSG9sZGVyKG9yaWdpbmFsTWV0aG9kLCB0cnVlKTsKLQlyZXR1cm4gaG9sZGVyID09IG51bGwgPyBCaW5kaW5nLk5PX0FOTk9UQVRJT05TIDogaG9sZGVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKGluZGV4KTsKLX0KKwogcHVibGljIGZpbmFsIGludCBnZXRBY2Nlc3NGbGFncygpIHsKLQlyZXR1cm4gbW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwlyZXR1cm4gdGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworfQorCitwdWJsaWMgQW5ub3RhdGlvbkJpbmRpbmdbXSBnZXRBbm5vdGF0aW9ucygpIHsKKwlNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kID0gb3JpZ2luYWwoKTsKKwlyZXR1cm4gb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmV0cmlldmVBbm5vdGF0aW9ucyhvcmlnaW5hbE1ldGhvZCk7CiB9CiAKIC8qKgpAQCAtNDU0LDcgKzUxNiw3IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZyNnZXRBbm5vdGF0aW9uVGFnQml0cygpCiAgKi8KIHB1YmxpYyBsb25nIGdldEFubm90YXRpb25UYWdCaXRzKCkgewotCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QgPSB0aGlzLm9yaWdpbmFsKCk7CisJTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsKCk7CiAJaWYgKChvcmlnaW5hbE1ldGhvZC50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQpID09IDAgJiYgb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykgewogCQlDbGFzc1Njb3BlIHNjb3BlID0gKChTb3VyY2VUeXBlQmluZGluZykgb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MpLnNjb3BlOwogCQlpZiAoc2NvcGUgIT0gbnVsbCkgewpAQCAtNDY2LDExICs1MjgsMTIgQEAKIAl9CiAJcmV0dXJuIG9yaWdpbmFsTWV0aG9kLnRhZ0JpdHM7CiB9CisKIC8qKgogICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhbm5vdGF0aW9uIG1ldGhvZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlCiAgKi8KIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCkgewotCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QgPSB0aGlzLm9yaWdpbmFsKCk7CisJTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsKCk7CiAJaWYgKChvcmlnaW5hbE1ldGhvZC50YWdCaXRzICYgVGFnQml0cy5EZWZhdWx0VmFsdWVSZXNvbHZlZCkgPT0gMCkgewogCQkvL1RoZSBtZXRob2QgaGFzIG5vdCBiZWVuIHJlc29sdmVkIG5vciBoYXMgaXRzIGNsYXNzIGJlZW4gcmVzb2x2ZWQuCiAJCS8vSXQgY2FuIG9ubHkgYmUgZnJvbSBhIHNvdXJjZSB0eXBlIHdpdGhpbiBjb21waWxhdGlvbiB1bml0cyB0byBwcm9jZXNzLgpAQCAtNDg4LDEyICs1NTEsNTcgQEAKIAlBbm5vdGF0aW9uSG9sZGVyIGhvbGRlciA9IG9yaWdpbmFsTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJldHJpZXZlQW5ub3RhdGlvbkhvbGRlcihvcmlnaW5hbE1ldGhvZCwgdHJ1ZSk7CiAJcmV0dXJuIGhvbGRlciA9PSBudWxsID8gbnVsbCA6IGhvbGRlci5nZXREZWZhdWx0VmFsdWUoKTsKIH0KKworLyoqCisgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9ucyBmb3IgZWFjaCBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgb3IgPGNvZGU+bnVsbD48L2NvZGU+CisgKiAJaWYgdGhlcmUncyBubyBwYXJhbWV0ZXIgb3Igbm8gYW5ub3RhdGlvbiBhdCBhbGwuCisgKi8KK3B1YmxpYyBBbm5vdGF0aW9uQmluZGluZ1tdW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSB7CisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGgpID09IDApIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbCgpOworCUFubm90YXRpb25Ib2xkZXIgaG9sZGVyID0gb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmV0cmlldmVBbm5vdGF0aW9uSG9sZGVyKG9yaWdpbmFsTWV0aG9kLCB0cnVlKTsKKwlBbm5vdGF0aW9uQmluZGluZ1tdW10gYWxsUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBob2xkZXIgPT0gbnVsbCA/IG51bGwgOiBob2xkZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKTsKKwlpZiAoYWxsUGFyYW1ldGVyQW5ub3RhdGlvbnMgPT0gbnVsbCAmJiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNQYXJhbWV0ZXJBbm5vdGF0aW9ucykgIT0gMCkgeworCQlhbGxQYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uQmluZGluZ1tsZW5ndGhdW107CisJCS8vIGZvcndhcmQgcmVmZXJlbmNlIHRvIG1ldGhvZCwgd2hlcmUgcGFyYW0gYW5ub3RhdGlvbnMgaGF2ZSBub3QgeWV0IGJlZW4gYXNzb2NpYXRlZCB0byBtZXRob2QKKwkJaWYgKHRoaXMuZGVjbGFyaW5nQ2xhc3MgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykgeworCQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgdGhpcy5kZWNsYXJpbmdDbGFzczsKKwkJCWlmIChzb3VyY2VUeXBlLnNjb3BlICE9IG51bGwpIHsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5kZWNsYXJhdGlvbk9mKHRoaXMpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJQXJndW1lbnQgYXJndW1lbnQgPSBtZXRob2REZWNsLmFyZ3VtZW50c1tpXTsKKwkJCQkJaWYgKGFyZ3VtZW50LmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQkJCUFTVE5vZGUucmVzb2x2ZUFubm90YXRpb25zKG1ldGhvZERlY2wuc2NvcGUsIGFyZ3VtZW50LmFubm90YXRpb25zLCBhcmd1bWVudC5iaW5kaW5nKTsKKwkJCQkJCWFsbFBhcmFtZXRlckFubm90YXRpb25zW2ldID0gYXJndW1lbnQuYmluZGluZy5nZXRBbm5vdGF0aW9ucygpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYWxsUGFyYW1ldGVyQW5ub3RhdGlvbnNbaV0gPSBCaW5kaW5nLk5PX0FOTk9UQVRJT05TOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWFsbFBhcmFtZXRlckFubm90YXRpb25zW2ldID0gQmluZGluZy5OT19BTk5PVEFUSU9OUzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJYWxsUGFyYW1ldGVyQW5ub3RhdGlvbnNbaV0gPSBCaW5kaW5nLk5PX0FOTk9UQVRJT05TOworCQkJfQorCQl9CisJCXNldFBhcmFtZXRlckFubm90YXRpb25zKGFsbFBhcmFtZXRlckFubm90YXRpb25zKTsKKwl9CisJcmV0dXJuIGFsbFBhcmFtZXRlckFubm90YXRpb25zOworfQorCiBwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZyBnZXRUeXBlVmFyaWFibGUoY2hhcltdIHZhcmlhYmxlTmFtZSkgewogCWZvciAoaW50IGkgPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOyAtLWkgPj0gMDspCiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnR5cGVWYXJpYWJsZXNbaV0uc291cmNlTmFtZSwgdmFyaWFibGVOYW1lKSkKIAkJCXJldHVybiB0aGlzLnR5cGVWYXJpYWJsZXNbaV07CiAJcmV0dXJuIG51bGw7CiB9CisKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIG1ldGhvZCBnb3Qgc3Vic3RpdHV0ZWQgcGFyYW1ldGVyIHR5cGVzCiAgKiAoc2VlIFBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nKQpAQCAtNTExLDE5ICs2MTksMTkgQEAKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhbiBhYnN0cmFjdCBtZXRob2QKICovCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpICE9IDA7CiB9CiAKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGJyaWRnZSBtZXRob2QKICovCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JyaWRnZSgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NCcmlkZ2UpICE9IDA7CisJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NCcmlkZ2UpICE9IDA7CiB9CiAKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGNvbnN0cnVjdG9yCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQlyZXR1cm4gc2VsZWN0b3IgPT0gVHlwZUNvbnN0YW50cy5JTklUOworCXJldHVybiB0aGlzLnNlbGVjdG9yID09IFR5cGVDb25zdGFudHMuSU5JVDsKIH0KIAogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBkZWZhdWx0IHZpc2liaWxpdHkKQEAgLTUzNSwxOSArNjQzLDE5IEBACiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzeXN0ZW0gZ2VuZXJhdGVkIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0QWJzdHJhY3QoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlZmF1bHRBYnN0cmFjdCkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0QWJzdHJhY3QpICE9IDA7CiB9CiAKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRlcHJlY2F0ZWQgbWV0aG9kCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDA7CisJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZmluYWwgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgaW1wbGVtZW50aW5nIGFub3RoZXIgbWV0aG9kCkBAIC01NTUsMjggKzY2MywxNiBAQAogICogT25seSBzZXQgZm9yIHNvdXJjZSBtZXRob2RzCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRpbmcoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0ltcGxlbWVudGluZykgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NJbXBsZW1lbnRpbmcpICE9IDA7CiB9CiAKLS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIG5hdGl2ZSBtZXRob2QKLSovCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc05hdGl2ZSgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUpICE9IDA7Ci19Ci0KLS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBvdmVycmlkaW5nIGFub3RoZXIgbWV0aG9kCi0gKiBPbmx5IHNldCBmb3Igc291cmNlIG1ldGhvZHMKLSovCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc092ZXJyaWRpbmcoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpICE9IDA7Ci19CiAvKgogICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdKSIgbWV0aG9kCiAgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWFpbigpIHsKIAlpZiAodGhpcy5zZWxlY3Rvci5sZW5ndGggPT0gNCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLk1BSU4pCiAJCQkmJiAoKHRoaXMubW9kaWZpZXJzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSkgIT0gMCkKLQkJCSYmIFR5cGVCaW5kaW5nLlZPSUQgPT0gdGhpcy5yZXR1cm5UeXBlICAKKwkJCSYmIFR5cGVCaW5kaW5nLlZPSUQgPT0gdGhpcy5yZXR1cm5UeXBlCiAJCQkmJiB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpIHsKIAkJVHlwZUJpbmRpbmcgcGFyYW1UeXBlID0gdGhpcy5wYXJhbWV0ZXJzWzBdOwogCQlpZiAocGFyYW1UeXBlLmRpbWVuc2lvbnMoKSA9PSAxICYmIHBhcmFtVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgewpAQCAtNTg1LDg1ICs2ODEsMTE0IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KKworLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbmF0aXZlIG1ldGhvZAorKi8KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzTmF0aXZlKCkgeworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlKSAhPSAwOworfQorCisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgb3ZlcnJpZGluZyBhbm90aGVyIG1ldGhvZAorICogT25seSBzZXQgZm9yIHNvdXJjZSBtZXRob2RzCisqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPdmVycmlkaW5nKCkgeworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpICE9IDA7Cit9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eQogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpdmF0ZSgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMDsKIH0KIAotLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcml2YXRlIHZpc2liaWxpdHkgYW5kIGlzIHVzZWQgbG9jYWxseQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcml2YXRlIHZpc2liaWxpdHkgb3IgaWYgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMgZG8uCiAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNVc2VkKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZCkgIT0gMDsKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUoKSB7CisJaWYgKCh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gdGhpcy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsICYmIHRoaXMuZGVjbGFyaW5nQ2xhc3MuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcm90ZWN0ZWQoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkKSAhPSAwOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHB1YmxpYyB2aXNpYmlsaXR5CiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSAhPSAwOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzdGF0aWMgbWV0aG9kCiAqLwogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwOwogfQogCiAvKiBBbnN3ZXIgdHJ1ZSBpZiBhbGwgZmxvYXQgb3BlcmF0aW9ucyBtdXN0IGFkaGVyIHRvIElFRUUgNzU0IGZsb2F0L2RvdWJsZSBydWxlcwogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RyaWN0ZnAoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnApICE9IDA7CisJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCkgIT0gMDsKIH0KIAogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgc3luY2hyb25pemVkIG1ldGhvZAogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCkgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCkgIT0gMDsKIH0KIAogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQogKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3ludGhldGljKCkgewotCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYykgIT0gMDsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYykgIT0gMDsKK30KKworLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcml2YXRlIHZpc2liaWxpdHkgYW5kIGlzIHVzZWQgbG9jYWxseQorKi8KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzVXNlZCgpIHsKKwlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZCkgIT0gMDsKIH0KIAogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIG1ldGhvZCBoYXMgdmFyYXJncwogKi8KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVmFyYXJncygpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NWYXJhcmdzKSAhPSAwOworcHVibGljIGJvb2xlYW4gaXNWYXJhcmdzKCkgeworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJncykgIT0gMDsKIH0KLQorcHVibGljIGJvb2xlYW4gaXNQb2x5bW9ycGhpYygpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIncyBkZWNsYXJpbmcgdHlwZSBpcyBkZXByZWNhdGVkIChvciBhbnkgb2YgaXRzIGVuY2xvc2luZyB0eXBlcykKICovCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZpZXdlZEFzRGVwcmVjYXRlZCgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkpKSAhPSAwOworCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5KSkgIT0gMDsKIH0KIAorcHVibGljIGZpbmFsIGludCBraW5kKCkgeworCXJldHVybiBCaW5kaW5nLk1FVEhPRDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSBpbnZvY2F0aW9uUGFja2FnZS4KKyovCisKIC8qKgotICogUmV0dXJucyB0aGUgb3JpZ2luYWwgbWV0aG9kIChhcyBvcHBvc2VkIHRvIHBhcmFtZXRlcml6ZWQgaW5zdGFuY2VzKQorICogUmV0dXJucyB0aGUgb3JpZ2luYWwgbWV0aG9kIChhcyBvcHBvc2VkIHRvIHBhcmFtZXRlcml6ZWQvcG9seW1vcnBoaWMgaW5zdGFuY2VzKQogICovCiBwdWJsaWMgTWV0aG9kQmluZGluZyBvcmlnaW5hbCgpIHsKIAlyZXR1cm4gdGhpczsKIH0KIAogcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSAvKiBmb28oaW50LCBUaHJlYWQpICovIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CiAJaWYgKGlzQ29uc3RydWN0b3IoKSkKLQkJYnVmZmVyLmFwcGVuZChkZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpOworCQlidWZmZXIuYXBwZW5kKHRoaXMuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKTsKIAllbHNlCi0JCWJ1ZmZlci5hcHBlbmQoc2VsZWN0b3IpOworCQlidWZmZXIuYXBwZW5kKHRoaXMuc2VsZWN0b3IpOwogCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQlpZiAocGFyYW1ldGVycyAhPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlMpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwlpZiAodGhpcy5wYXJhbWV0ZXJzICE9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUykgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzW2ldLnNvdXJjZU5hbWUoKSk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMucGFyYW1ldGVyc1tpXS5zb3VyY2VOYW1lKCkpOwogCQl9CiAJfQogCWJ1ZmZlci5hcHBlbmQoJyknKTsKQEAgLTY3Miw1NSArNzk3LDU1IEBACiBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9ucyhBbm5vdGF0aW9uQmluZGluZ1tdIGFubm90YXRpb25zKSB7CiAJdGhpcy5kZWNsYXJpbmdDbGFzcy5zdG9yZUFubm90YXRpb25zKHRoaXMsIGFubm90YXRpb25zKTsKIH0KLXB1YmxpYyB2b2lkIHNldEFubm90YXRpb25zKEFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbnMsIEFubm90YXRpb25CaW5kaW5nW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCXRoaXMuZGVjbGFyaW5nQ2xhc3Muc3RvcmVBbm5vdGF0aW9uSG9sZGVyKHRoaXMsICBBbm5vdGF0aW9uSG9sZGVyLnN0b3JlQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMsIHBhcmFtZXRlckFubm90YXRpb25zLCBkZWZhdWx0VmFsdWUpKTsKK3B1YmxpYyB2b2lkIHNldEFubm90YXRpb25zKEFubm90YXRpb25CaW5kaW5nW10gYW5ub3RhdGlvbnMsIEFubm90YXRpb25CaW5kaW5nW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgTG9va3VwRW52aXJvbm1lbnQgb3B0aW9uYWxFbnYpIHsKKwl0aGlzLmRlY2xhcmluZ0NsYXNzLnN0b3JlQW5ub3RhdGlvbkhvbGRlcih0aGlzLCAgQW5ub3RhdGlvbkhvbGRlci5zdG9yZUFubm90YXRpb25zKGFubm90YXRpb25zLCBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgZGVmYXVsdFZhbHVlLCBvcHRpb25hbEVudikpOwogfQogcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kID0gdGhpcy5vcmlnaW5hbCgpOworCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbCgpOwogCW9yaWdpbmFsTWV0aG9kLnRhZ0JpdHMgfD0gVGFnQml0cy5EZWZhdWx0VmFsdWVSZXNvbHZlZDsKIAogCUFubm90YXRpb25Ib2xkZXIgaG9sZGVyID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5yZXRyaWV2ZUFubm90YXRpb25Ib2xkZXIodGhpcywgZmFsc2UpOwogCWlmIChob2xkZXIgPT0gbnVsbCkKLQkJc2V0QW5ub3RhdGlvbnMobnVsbCwgbnVsbCwgZGVmYXVsdFZhbHVlKTsKKwkJc2V0QW5ub3RhdGlvbnMobnVsbCwgbnVsbCwgZGVmYXVsdFZhbHVlLCBudWxsKTsKIAllbHNlCi0JCXNldEFubm90YXRpb25zKGhvbGRlci5nZXRBbm5vdGF0aW9ucygpLCBob2xkZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSwgZGVmYXVsdFZhbHVlKTsKKwkJc2V0QW5ub3RhdGlvbnMoaG9sZGVyLmdldEFubm90YXRpb25zKCksIGhvbGRlci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpLCBkZWZhdWx0VmFsdWUsIG51bGwpOwogfQogcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkJpbmRpbmdbXVtdIHBhcmFtZXRlckFubm90YXRpb25zKSB7CiAJQW5ub3RhdGlvbkhvbGRlciBob2xkZXIgPSB0aGlzLmRlY2xhcmluZ0NsYXNzLnJldHJpZXZlQW5ub3RhdGlvbkhvbGRlcih0aGlzLCBmYWxzZSk7CiAJaWYgKGhvbGRlciA9PSBudWxsKQotCQlzZXRBbm5vdGF0aW9ucyhudWxsLCBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgbnVsbCk7CisJCXNldEFubm90YXRpb25zKG51bGwsIHBhcmFtZXRlckFubm90YXRpb25zLCBudWxsLCBudWxsKTsKIAllbHNlCi0JCXNldEFubm90YXRpb25zKGhvbGRlci5nZXRBbm5vdGF0aW9ucygpLCBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgaG9sZGVyLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJc2V0QW5ub3RhdGlvbnMoaG9sZGVyLmdldEFubm90YXRpb25zKCksIHBhcmFtZXRlckFubm90YXRpb25zLCBob2xkZXIuZ2V0RGVmYXVsdFZhbHVlKCksIG51bGwpOwogfQorcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VsZWN0b3IoY2hhcltdIHNlbGVjdG9yKSB7CisJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCXRoaXMuc2lnbmF0dXJlID0gbnVsbDsKK30KKwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZyNzaG9ydFJlYWRhYmxlTmFtZSgpCiAgKi8KIHB1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocGFyYW1ldGVycy5sZW5ndGggKyAxICogMjApOworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMucGFyYW1ldGVycy5sZW5ndGggKyAxICogMjApOwogCWlmIChpc0NvbnN0cnVjdG9yKCkpCi0JCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKTsKIAllbHNlCi0JCWJ1ZmZlci5hcHBlbmQoc2VsZWN0b3IpOworCQlidWZmZXIuYXBwZW5kKHRoaXMuc2VsZWN0b3IpOwogCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQlpZiAocGFyYW1ldGVycyAhPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlMpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwlpZiAodGhpcy5wYXJhbWV0ZXJzICE9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUykgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzW2ldLnNob3J0UmVhZGFibGVOYW1lKCkpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnBhcmFtZXRlcnNbaV0uc2hvcnRSZWFkYWJsZU5hbWUoKSk7CiAJCX0KIAl9CiAJYnVmZmVyLmFwcGVuZCgnKScpOwogCWludCBuYW1lTGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOwogCWNoYXJbXSBzaG9ydFJlYWRhYmxlTmFtZSA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOwotCWJ1ZmZlci5nZXRDaGFycygwLCBuYW1lTGVuZ3RoLCBzaG9ydFJlYWRhYmxlTmFtZSwgMCk7CSAgICAKKwlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgc2hvcnRSZWFkYWJsZU5hbWUsIDApOwogCXJldHVybiBzaG9ydFJlYWRhYmxlTmFtZTsKIH0KIAotcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VsZWN0b3IoY2hhcltdIHNlbGVjdG9yKSB7Ci0JdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwotCXRoaXMuc2lnbmF0dXJlID0gbnVsbDsKLX0KLQogLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIHNpZ25hdHVyZS4KICoKICogTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCkBAIC03MjgsMjggKzg1MywyOCBAQAogKiB0eXBlIGNoYW5nZXMsIHRoZSBjYWNoZWQgc3RhdGUgaXMgaW52YWxpZC4KICovCiBwdWJsaWMgZmluYWwgY2hhcltdIHNpZ25hdHVyZSgpIC8qIChJTGphdmEvbGFuZy9UaHJlYWQ7KUxqYXZhL2xhbmcvT2JqZWN0OyAqLyB7Ci0JaWYgKHNpZ25hdHVyZSAhPSBudWxsKQotCQlyZXR1cm4gc2lnbmF0dXJlOworCWlmICh0aGlzLnNpZ25hdHVyZSAhPSBudWxsKQorCQlyZXR1cm4gdGhpcy5zaWduYXR1cmU7CiAKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CiAJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQorCiAJVHlwZUJpbmRpbmdbXSB0YXJnZXRQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwogCWJvb2xlYW4gaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3IoKTsKLQlpZiAoaXNDb25zdHJ1Y3RvciAmJiBkZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeyAvLyBpbnNlcnQgU3RyaW5nIG5hbWUsaW50IG9yZGluYWwgCisJaWYgKGlzQ29uc3RydWN0b3IgJiYgdGhpcy5kZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeyAvLyBpbnNlcnQgU3RyaW5nIG5hbWUsaW50IG9yZGluYWwKIAkJYnVmZmVyLmFwcGVuZChDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdTaWduYXR1cmUpOwogCQlidWZmZXIuYXBwZW5kKFR5cGVCaW5kaW5nLklOVC5zaWduYXR1cmUoKSk7CiAJfQotCWJvb2xlYW4gbmVlZFN5bnRoZXRpY3MgPSBpc0NvbnN0cnVjdG9yICYmIGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpOworCWJvb2xlYW4gbmVlZFN5bnRoZXRpY3MgPSBpc0NvbnN0cnVjdG9yICYmIHRoaXMuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCk7CiAJaWYgKG5lZWRTeW50aGV0aWNzKSB7CiAJCS8vIHRha2UgaW50byBhY2NvdW50IHRoZSBzeW50aGV0aWMgYXJndW1lbnQgdHlwZSBzaWduYXR1cmVzIGFzIHdlbGwKLQkJUmVmZXJlbmNlQmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CiAJCWlmIChzeW50aGV0aWNBcmd1bWVudFR5cGVzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewogCQkJCWJ1ZmZlci5hcHBlbmQoc3ludGhldGljQXJndW1lbnRUeXBlc1tpXS5zaWduYXR1cmUoKSk7CiAJCQl9CiAJCX0KLQkJCisKIAkJaWYgKHRoaXMgaW5zdGFuY2VvZiBTeW50aGV0aWNNZXRob2RCaW5kaW5nKSB7CiAJCQl0YXJnZXRQYXJhbWV0ZXJzID0gKChTeW50aGV0aWNNZXRob2RCaW5kaW5nKXRoaXMpLnRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzOwogCQl9CkBAIC03NjEsNDYgKzg4Niw0NiBAQAogCQl9CiAJfQogCWlmIChuZWVkU3ludGhldGljcykgewotCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNPdXRlckFyZ3VtZW50cyA9IGRlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljT3V0ZXJBcmd1bWVudHMgPSB0aGlzLmRlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKIAkJaW50IGNvdW50ID0gc3ludGhldGljT3V0ZXJBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNPdXRlckFyZ3VtZW50cy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQkJYnVmZmVyLmFwcGVuZChzeW50aGV0aWNPdXRlckFyZ3VtZW50c1tpXS50eXBlLnNpZ25hdHVyZSgpKTsKIAkJfQotCQkvLyBtb3ZlIHRoZSBleHRyYSBwYWRkaW5nIGFyZ3VtZW50cyBvZiB0aGUgc3ludGhldGljIGNvbnN0cnVjdG9yIGludm9jYXRpb24gdG8gdGhlIGVuZAkJCi0JCWZvciAoaW50IGkgPSB0YXJnZXRQYXJhbWV0ZXJzLmxlbmd0aCwgZXh0cmFMZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGV4dHJhTGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyc1tpXS5zaWduYXR1cmUoKSk7CisJCS8vIG1vdmUgdGhlIGV4dHJhIHBhZGRpbmcgYXJndW1lbnRzIG9mIHRoZSBzeW50aGV0aWMgY29uc3RydWN0b3IgaW52b2NhdGlvbiB0byB0aGUgZW5kCisJCWZvciAoaW50IGkgPSB0YXJnZXRQYXJhbWV0ZXJzLmxlbmd0aCwgZXh0cmFMZW5ndGggPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgZXh0cmFMZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnBhcmFtZXRlcnNbaV0uc2lnbmF0dXJlKCkpOwogCQl9CiAJfQogCWJ1ZmZlci5hcHBlbmQoJyknKTsKIAlpZiAodGhpcy5yZXR1cm5UeXBlICE9IG51bGwpCiAJCWJ1ZmZlci5hcHBlbmQodGhpcy5yZXR1cm5UeXBlLnNpZ25hdHVyZSgpKTsKIAlpbnQgbmFtZUxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQlzaWduYXR1cmUgPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKLQlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgc2lnbmF0dXJlLCAwKTsJICAgIAotCQotCXJldHVybiBzaWduYXR1cmU7CisJdGhpcy5zaWduYXR1cmUgPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKKwlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgdGhpcy5zaWduYXR1cmUsIDApOworCisJcmV0dXJuIHRoaXMuc2lnbmF0dXJlOwogfQogLyoKICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVjb3JkIHJlZmVyZW5jZXMgdG8gbmVzdGVkIHR5cGVzIGluc2lkZSB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KICAqIFRoaXMgaXMgdGhlIG9uZSB0aGF0IG11c3QgYmUgdXNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotICogCisgKgogICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzExODQKICAqLwogcHVibGljIGZpbmFsIGNoYXJbXSBzaWduYXR1cmUoQ2xhc3NGaWxlIGNsYXNzRmlsZSkgewotCWlmIChzaWduYXR1cmUgIT0gbnVsbCkgewotCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlc0luU2lnbmF0dXJlKSAhPSAwKSB7CisJaWYgKHRoaXMuc2lnbmF0dXJlICE9IG51bGwpIHsKKwkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApIHsKIAkJCS8vIHdlIG5lZWQgdG8gcmVjb3JkIGlubmVyIGNsYXNzZXMgcmVmZXJlbmNlcwogCQkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gaXNDb25zdHJ1Y3RvcigpOwogCQkJVHlwZUJpbmRpbmdbXSB0YXJnZXRQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwotCQkJYm9vbGVhbiBuZWVkU3ludGhldGljcyA9IGlzQ29uc3RydWN0b3IgJiYgZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCk7CisJCQlib29sZWFuIG5lZWRTeW50aGV0aWNzID0gaXNDb25zdHJ1Y3RvciAmJiB0aGlzLmRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpOwogCQkJaWYgKG5lZWRTeW50aGV0aWNzKSB7CiAJCQkJLy8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHN5bnRoZXRpYyBhcmd1bWVudCB0eXBlIHNpZ25hdHVyZXMgYXMgd2VsbAotCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpOworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CiAJCQkJaWYgKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgIT0gbnVsbCkgewogCQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3ludGhldGljQXJndW1lbnRUeXBlID0gc3ludGhldGljQXJndW1lbnRUeXBlc1tpXTsKLQkJCQkJCWlmIChzeW50aGV0aWNBcmd1bWVudFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJCQkJCQljbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKHN5bnRoZXRpY0FyZ3VtZW50VHlwZSk7CisJCQkJCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50VHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgc3ludGhldGljQXJndW1lbnRUeXBlKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KQEAgLTgxMCw4NyArOTM1LDg3IEBACiAJCQl9CiAKIAkJCWlmICh0YXJnZXRQYXJhbWV0ZXJzICE9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0UGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0YXJnZXRQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCVR5cGVCaW5kaW5nIHRhcmdldFBhcmFtZXRlciA9IHRhcmdldFBhcmFtZXRlcnNbaV07CiAJCQkJCVR5cGVCaW5kaW5nIGxlYWZUYXJnZXRQYXJhbWV0ZXJUeXBlID0gdGFyZ2V0UGFyYW1ldGVyLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCQkJCWlmIChsZWFmVGFyZ2V0UGFyYW1ldGVyVHlwZS5pc05lc3RlZFR5cGUoKSkgewotCQkJCQkJY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3NlcyhsZWFmVGFyZ2V0UGFyYW1ldGVyVHlwZSk7CisJCQkJCWlmICgobGVhZlRhcmdldFBhcmFtZXRlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgbGVhZlRhcmdldFBhcmFtZXRlclR5cGUpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYgKG5lZWRTeW50aGV0aWNzKSB7Ci0JCQkJLy8gbW92ZSB0aGUgZXh0cmEgcGFkZGluZyBhcmd1bWVudHMgb2YgdGhlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHRvIHRoZSBlbmQJCQotCQkJCWZvciAoaW50IGkgPSB0YXJnZXRQYXJhbWV0ZXJzLmxlbmd0aCwgZXh0cmFMZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGV4dHJhTGVuZ3RoOyBpKyspIHsKLQkJCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKKwkJCQkvLyBtb3ZlIHRoZSBleHRyYSBwYWRkaW5nIGFyZ3VtZW50cyBvZiB0aGUgc3ludGhldGljIGNvbnN0cnVjdG9yIGludm9jYXRpb24gdG8gdGhlIGVuZAorCQkJCWZvciAoaW50IGkgPSB0YXJnZXRQYXJhbWV0ZXJzLmxlbmd0aCwgZXh0cmFMZW5ndGggPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgZXh0cmFMZW5ndGg7IGkrKykgeworCQkJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnNbaV07CiAJCQkJCVR5cGVCaW5kaW5nIGxlYWZQYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCQkJCWlmIChsZWFmUGFyYW1ldGVyVHlwZS5pc05lc3RlZFR5cGUoKSkgewotCQkJCQkJY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3NlcyhsZWFmUGFyYW1ldGVyVHlwZSk7CisJCQkJCWlmICgobGVhZlBhcmFtZXRlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgbGVhZlBhcmFtZXRlclR5cGUpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYgKHRoaXMucmV0dXJuVHlwZSAhPSBudWxsKSB7CiAJCQkJVHlwZUJpbmRpbmcgcmV0ID0gdGhpcy5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCQkJaWYgKHJldC5pc05lc3RlZFR5cGUoKSkgewotCQkJCQljbGFzc0ZpbGUucmVjb3JkSW5uZXJDbGFzc2VzKHJldCk7CisJCQkJaWYgKChyZXQudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUoY2xhc3NGaWxlLCByZXQpOwogCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gc2lnbmF0dXJlOworCQlyZXR1cm4gdGhpcy5zaWduYXR1cmU7CiAJfQogCi0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocGFyYW1ldGVycy5sZW5ndGggKyAxICogMjApOworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCh0aGlzLnBhcmFtZXRlcnMubGVuZ3RoICsgMSkgKiAyMCk7CiAJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQorCiAJVHlwZUJpbmRpbmdbXSB0YXJnZXRQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwogCWJvb2xlYW4gaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3IoKTsKLQlpZiAoaXNDb25zdHJ1Y3RvciAmJiBkZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeyAvLyBpbnNlcnQgU3RyaW5nIG5hbWUsaW50IG9yZGluYWwgCisJaWYgKGlzQ29uc3RydWN0b3IgJiYgdGhpcy5kZWNsYXJpbmdDbGFzcy5pc0VudW0oKSkgeyAvLyBpbnNlcnQgU3RyaW5nIG5hbWUsaW50IG9yZGluYWwKIAkJYnVmZmVyLmFwcGVuZChDb25zdGFudFBvb2wuSmF2YUxhbmdTdHJpbmdTaWduYXR1cmUpOwogCQlidWZmZXIuYXBwZW5kKFR5cGVCaW5kaW5nLklOVC5zaWduYXR1cmUoKSk7CiAJfQotCWJvb2xlYW4gbmVlZFN5bnRoZXRpY3MgPSBpc0NvbnN0cnVjdG9yICYmIGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpOworCWJvb2xlYW4gbmVlZFN5bnRoZXRpY3MgPSBpc0NvbnN0cnVjdG9yICYmIHRoaXMuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCk7CiAJaWYgKG5lZWRTeW50aGV0aWNzKSB7CiAJCS8vIHRha2UgaW50byBhY2NvdW50IHRoZSBzeW50aGV0aWMgYXJndW1lbnQgdHlwZSBzaWduYXR1cmVzIGFzIHdlbGwKLQkJUmVmZXJlbmNlQmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gdGhpcy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CiAJCWlmIChzeW50aGV0aWNBcmd1bWVudFR5cGVzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewogCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3ludGhldGljQXJndW1lbnRUeXBlID0gc3ludGhldGljQXJndW1lbnRUeXBlc1tpXTsKLQkJCQlpZiAoc3ludGhldGljQXJndW1lbnRUeXBlLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZXNJblNpZ25hdHVyZTsKLQkJCQkJY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3NlcyhzeW50aGV0aWNBcmd1bWVudFR5cGUpOworCQkJCWlmICgoc3ludGhldGljQXJndW1lbnRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApIHsKKwkJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlczsKKwkJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgc3ludGhldGljQXJndW1lbnRUeXBlKTsKIAkJCQl9CiAJCQkJYnVmZmVyLmFwcGVuZChzeW50aGV0aWNBcmd1bWVudFR5cGUuc2lnbmF0dXJlKCkpOwogCQkJfQogCQl9Ci0JCQorCiAJCWlmICh0aGlzIGluc3RhbmNlb2YgU3ludGhldGljTWV0aG9kQmluZGluZykgewogCQkJdGFyZ2V0UGFyYW1ldGVycyA9ICgoU3ludGhldGljTWV0aG9kQmluZGluZyl0aGlzKS50YXJnZXRNZXRob2QucGFyYW1ldGVyczsKIAkJfQogCX0KIAogCWlmICh0YXJnZXRQYXJhbWV0ZXJzICE9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRhcmdldFBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCVR5cGVCaW5kaW5nIHRhcmdldFBhcmFtZXRlciA9IHRhcmdldFBhcmFtZXRlcnNbaV07CiAJCQlUeXBlQmluZGluZyBsZWFmVGFyZ2V0UGFyYW1ldGVyVHlwZSA9IHRhcmdldFBhcmFtZXRlci5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGxlYWZUYXJnZXRQYXJhbWV0ZXJUeXBlLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlc0luU2lnbmF0dXJlOwotCQkJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXMobGVhZlRhcmdldFBhcmFtZXRlclR5cGUpOworCQkJaWYgKChsZWFmVGFyZ2V0UGFyYW1ldGVyVHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlczsKKwkJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUoY2xhc3NGaWxlLCBsZWFmVGFyZ2V0UGFyYW1ldGVyVHlwZSk7CiAJCQl9CiAJCQlidWZmZXIuYXBwZW5kKHRhcmdldFBhcmFtZXRlci5zaWduYXR1cmUoKSk7CiAJCX0KIAl9CiAJaWYgKG5lZWRTeW50aGV0aWNzKSB7Ci0JCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY091dGVyQXJndW1lbnRzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNPdXRlckFyZ3VtZW50cyA9IHRoaXMuZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOwogCQlpbnQgY291bnQgPSBzeW50aGV0aWNPdXRlckFyZ3VtZW50cyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY091dGVyQXJndW1lbnRzLmxlbmd0aDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQlidWZmZXIuYXBwZW5kKHN5bnRoZXRpY091dGVyQXJndW1lbnRzW2ldLnR5cGUuc2lnbmF0dXJlKCkpOwogCQl9Ci0JCS8vIG1vdmUgdGhlIGV4dHJhIHBhZGRpbmcgYXJndW1lbnRzIG9mIHRoZSBzeW50aGV0aWMgY29uc3RydWN0b3IgaW52b2NhdGlvbiB0byB0aGUgZW5kCQkKLQkJZm9yIChpbnQgaSA9IHRhcmdldFBhcmFtZXRlcnMubGVuZ3RoLCBleHRyYUxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgZXh0cmFMZW5ndGg7IGkrKykgewotCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKKwkJLy8gbW92ZSB0aGUgZXh0cmEgcGFkZGluZyBhcmd1bWVudHMgb2YgdGhlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHRvIHRoZSBlbmQKKwkJZm9yIChpbnQgaSA9IHRhcmdldFBhcmFtZXRlcnMubGVuZ3RoLCBleHRyYUxlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBleHRyYUxlbmd0aDsgaSsrKSB7CisJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnNbaV07CiAJCQlUeXBlQmluZGluZyBsZWFmUGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlci5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGxlYWZQYXJhbWV0ZXJUeXBlLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlc0luU2lnbmF0dXJlOwotCQkJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXMobGVhZlBhcmFtZXRlclR5cGUpOworCQkJaWYgKChsZWFmUGFyYW1ldGVyVHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlczsKKwkJCQlVdGlsLnJlY29yZE5lc3RlZFR5cGUoY2xhc3NGaWxlLCBsZWFmUGFyYW1ldGVyVHlwZSk7CiAJCQl9CiAJCQlidWZmZXIuYXBwZW5kKHBhcmFtZXRlci5zaWduYXR1cmUoKSk7CiAJCX0KQEAgLTg5OCwxNyArMTAyMywxNyBAQAogCWJ1ZmZlci5hcHBlbmQoJyknKTsKIAlpZiAodGhpcy5yZXR1cm5UeXBlICE9IG51bGwpIHsKIAkJVHlwZUJpbmRpbmcgcmV0ID0gdGhpcy5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCWlmIChyZXQuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZXNJblNpZ25hdHVyZTsKLQkJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXMocmV0KTsKKwkJaWYgKChyZXQudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlczsKKwkJCVV0aWwucmVjb3JkTmVzdGVkVHlwZShjbGFzc0ZpbGUsIHJldCk7CiAJCX0KIAkJYnVmZmVyLmFwcGVuZCh0aGlzLnJldHVyblR5cGUuc2lnbmF0dXJlKCkpOwogCX0KIAlpbnQgbmFtZUxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQlzaWduYXR1cmUgPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKLQlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgc2lnbmF0dXJlLCAwKTsJICAgIAotCQotCXJldHVybiBzaWduYXR1cmU7CisJdGhpcy5zaWduYXR1cmUgPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKKwlidWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgdGhpcy5zaWduYXR1cmUsIDApOworCisJcmV0dXJuIHRoaXMuc2lnbmF0dXJlOwogfQogcHVibGljIGZpbmFsIGludCBzb3VyY2VFbmQoKSB7CiAJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBzb3VyY2VNZXRob2QoKTsKQEAgLTkyMCwxOCArMTA0NSwyMyBAQAogCXJldHVybiBtZXRob2Quc291cmNlRW5kOwogfQogcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gc291cmNlTWV0aG9kKCkgeworCWlmIChpc1N5bnRoZXRpYygpKSB7CisJCXJldHVybiBudWxsOworCX0KIAlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlOwogCXRyeSB7Ci0JCXNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCQlzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSB0aGlzLmRlY2xhcmluZ0NsYXNzOwogCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwkJCisJCXJldHVybiBudWxsOwogCX0KIAogCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gc291cmNlVHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7Ci0JZm9yIChpbnQgaSA9IG1ldGhvZHMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICh0aGlzID09IG1ldGhvZHNbaV0uYmluZGluZykKLQkJCXJldHVybiBtZXRob2RzW2ldOwotCXJldHVybiBudWxsOwkJCisJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICh0aGlzID09IG1ldGhvZHNbaV0uYmluZGluZykKKwkJCQlyZXR1cm4gbWV0aG9kc1tpXTsKKwl9CisJcmV0dXJuIG51bGw7CiB9CiBwdWJsaWMgZmluYWwgaW50IHNvdXJjZVN0YXJ0KCkgewogCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gc291cmNlTWV0aG9kKCk7CkBAIC05NDMsMzkgKzEwNzMsNiBAQAogCXJldHVybiBtZXRob2Quc291cmNlU3RhcnQ7CiB9CiAKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JU3RyaW5nIHMgPSAocmV0dXJuVHlwZSAhPSBudWxsKSA/IHJldHVyblR5cGUuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJAotCXMgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JcyArPSAoc2VsZWN0b3IgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKHNlbGVjdG9yKSA6ICJVTk5BTUVEIE1FVEhPRCI7IC8vJE5PTi1OTFMtMSQKLQotCXMgKz0gIigiOyAvLyROT04tTkxTLTEkCi0JaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewotCQlpZiAocGFyYW1ldGVycyAhPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlMpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgID4gMCkKLQkJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJcyArPSAocGFyYW1ldGVyc1tpXSAhPSBudWxsKSA/IHBhcmFtZXRlcnNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcyArPSAiTlVMTCBQQVJBTUVURVJTIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlzICs9ICIpICI7IC8vJE5PTi1OTFMtMSQKLQotCWlmICh0aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKLQkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gQmluZGluZy5OT19FWENFUFRJT05TKSB7Ci0JCQlzICs9ICJ0aHJvd3MgIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAgPiAwKQotCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQkJCQlzICs9ICh0aHJvd25FeGNlcHRpb25zW2ldICE9IG51bGwpID8gdGhyb3duRXhjZXB0aW9uc1tpXS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlzICs9ICJOVUxMIFRIUk9XTiBFWENFUFRJT05TIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gczsKLX0KIC8qKgogICogUmV0dXJucyB0aGUgbWV0aG9kIHRvIHVzZSBkdXJpbmcgdGllYnJlYWsgKHVzdWFsbHkgdGhlIG1ldGhvZCBpdHNlbGYpLgogICogRm9yIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb25zLCB0aWVicmVhayBuZWVkcyB0byB1c2UgZ2VuZXJpYyBtZXRob2Qgd2l0aCBlcmFzdXJlIHN1YnN0aXR1dGVzLgpAQCAtOTgzLDYgKzEwODAsNDMgQEAKIHB1YmxpYyBNZXRob2RCaW5kaW5nIHRpZWJyZWFrTWV0aG9kKCkgewogCXJldHVybiB0aGlzOwogfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJaWYgKCh0aGlzLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZCkgIT0gMCkgeworCQlvdXRwdXQuYXBwZW5kKCJbdW5yZXNvbHZlZF0gIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJQVNUTm9kZS5wcmludE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgb3V0cHV0KTsKKwlvdXRwdXQuYXBwZW5kKHRoaXMucmV0dXJuVHlwZSAhPSBudWxsID8gdGhpcy5yZXR1cm5UeXBlLmRlYnVnTmFtZSgpIDogIjxubyB0eXBlPiIpOyAvLyROT04tTkxTLTEkCisJb3V0cHV0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJb3V0cHV0LmFwcGVuZCh0aGlzLnNlbGVjdG9yICE9IG51bGwgPyBuZXcgU3RyaW5nKHRoaXMuc2VsZWN0b3IpIDogIjxubyBzZWxlY3Rvcj4iKTsgLy8kTk9OLU5MUy0xJAorCW91dHB1dC5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLnBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQlpZiAodGhpcy5wYXJhbWV0ZXJzICE9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUykgeworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChpICA+IDApCisJCQkJCW91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXQuYXBwZW5kKHRoaXMucGFyYW1ldGVyc1tpXSAhPSBudWxsID8gdGhpcy5wYXJhbWV0ZXJzW2ldLmRlYnVnTmFtZSgpIDogIjxubyBhcmd1bWVudCB0eXBlPiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlvdXRwdXQuYXBwZW5kKCI8bm8gYXJndW1lbnQgdHlwZXM+Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisJb3V0cHV0LmFwcGVuZCgiKSAiKTsgLy8kTk9OLU5MUy0xJAorCisJaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCWlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgIT0gQmluZGluZy5OT19FWENFUFRJT05TKSB7CisJCQlvdXRwdXQuYXBwZW5kKCJ0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaSAgPiAwKQorCQkJCQlvdXRwdXQuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQkJb3V0cHV0LmFwcGVuZCgodGhpcy50aHJvd25FeGNlcHRpb25zW2ldICE9IG51bGwpID8gdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLmRlYnVnTmFtZSgpIDogIjxubyBleGNlcHRpb24gdHlwZT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJb3V0cHV0LmFwcGVuZCgiPG5vIGV4Y2VwdGlvbiB0eXBlcz4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Cit9CiBwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMoKSB7CiAJcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlczsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YQppbmRleCAxNzcyZGVhLi42NDIzODhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFNjb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RTY29wZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CiAKIC8qKgotICogUGFydGljdWxhciBibG9jayBzY29wZSB1c2VkIGZvciBtZXRob2RzLCBjb25zdHJ1Y3RvcnMgb3IgY2xpbml0cywgcmVwcmVzZW50aW5nCisgKiBTcGVjaWZpYyBibG9jayBzY29wZSB1c2VkIGZvciBtZXRob2RzLCBjb25zdHJ1Y3RvcnMgb3IgY2xpbml0cywgcmVwcmVzZW50aW5nCiAgKiBpdHMgb3V0ZXJtb3N0IGJsb2Nrc2NvcGUuIE5vdGUgYWxzbyB0aGF0IHN1Y2ggYSBzY29wZSB3aWxsIGJlIHByb3ZpZGVkIHRvIGVuY2xvc2UKICAqIGZpZWxkIGluaXRpYWxpemVycyBzdWJzY29wZXMgYXMgd2VsbC4KICAqLwpAQCAtMjksOSArMjksOSBAQAogCXB1YmxpYyBib29sZWFuIGlzU3RhdGljOyAvLyBtZXRob2QgbW9kaWZpZXIgb3IgaW5pdGlhbGl6ZXIgb25lCiAKIAkvL2ZpZWxkcyB1c2VkIGR1cmluZyBuYW1lIHJlc29sdXRpb24KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOyAKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOwogCXB1YmxpYyBGaWVsZEJpbmRpbmcgaW5pdGlhbGl6ZWRGaWVsZDsgLy8gdGhlIGZpZWxkIGJlaW5nIGluaXRpYWxpemVkCi0JcHVibGljIGludCBsYXN0VmlzaWJsZUZpZWxkSUQgPSAtMTsgLy8gdGhlIElEIG9mIHRoZSBsYXN0IGZpZWxkIHdoaWNoIGdvdCBkZWNsYXJlZCAKKwlwdWJsaWMgaW50IGxhc3RWaXNpYmxlRmllbGRJRCA9IC0xOyAvLyB0aGUgSUQgb2YgdGhlIGxhc3QgZmllbGQgd2hpY2ggZ290IGRlY2xhcmVkCiAJLy8gbm90ZSB0aGF0ICNpbml0aWFsaXplZEZpZWxkIGNhbiBiZSBudWxsIEFORCBsYXN0VmlzaWJsZUZpZWxkSUQgPj0gMCwgd2hlbiBwcm9jZXNzaW5nIGluc3RhbmNlIGZpZWxkIGluaXRpYWxpemVycy4KIAogCS8vIGZsb3cgYW5hbHlzaXMKQEAgLTQ1LDQ1MyArNDUsNDM4IEBACiAKIAkvLyBhbm5vdGF0aW9uIHN1cHBvcnQKIAlwdWJsaWMgYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOwotCQorCiAJLy8gaW5uZXItZW11bGF0aW9uCiAJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIGV4dHJhU3ludGhldGljQXJndW1lbnRzOwotCQotCXB1YmxpYyBNZXRob2RTY29wZShDbGFzc1Njb3BlIHBhcmVudCwgUmVmZXJlbmNlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGlzU3RhdGljKSB7CiAKLQkJc3VwZXIoTUVUSE9EX1NDT1BFLCBwYXJlbnQpOwotCQlsb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbNV07Ci0JCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKLQkJdGhpcy5zdGFydEluZGV4ID0gMDsKK3B1YmxpYyBNZXRob2RTY29wZShDbGFzc1Njb3BlIHBhcmVudCwgUmVmZXJlbmNlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGlzU3RhdGljKSB7CisJc3VwZXIoTUVUSE9EX1NDT1BFLCBwYXJlbnQpOworCXRoaXMubG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nWzVdOworCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7CisJdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworCXRoaXMuc3RhcnRJbmRleCA9IDA7Cit9CisKK1N0cmluZyBiYXNpY1RvU3RyaW5nKGludCB0YWIpIHsKKwlTdHJpbmcgbmV3TGluZSA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gdGFiOyAtLWkgPj0gMDspCisJCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIHMgPSBuZXdMaW5lICsgIi0tLSBNZXRob2QgU2NvcGUgLS0tIjsgLy8kTk9OLU5MUy0xJAorCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJAorCXMgKz0gbmV3TGluZSArICJsb2NhbHM6IjsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sb2NhbEluZGV4OyBpKyspCisJCXMgKz0gbmV3TGluZSArICJcdCIgKyB0aGlzLmxvY2Fsc1tpXS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJcyArPSBuZXdMaW5lICsgInN0YXJ0SW5kZXggPSAiICsgdGhpcy5zdGFydEluZGV4OyAvLyROT04tTkxTLTEkCisJcyArPSBuZXdMaW5lICsgImlzQ29uc3RydWN0b3JDYWxsID0gIiArIHRoaXMuaXNDb25zdHJ1Y3RvckNhbGw7IC8vJE5PTi1OTFMtMSQKKwlzICs9IG5ld0xpbmUgKyAiaW5pdGlhbGl6ZWRGaWVsZCA9ICIgKyB0aGlzLmluaXRpYWxpemVkRmllbGQ7IC8vJE5PTi1OTFMtMSQKKwlzICs9IG5ld0xpbmUgKyAibGFzdFZpc2libGVGaWVsZElEID0gIiArIHRoaXMubGFzdFZpc2libGVGaWVsZElEOyAvLyROT04tTkxTLTEkCisJcyArPSBuZXdMaW5lICsgInJlZmVyZW5jZUNvbnRleHQgPSAiICsgdGhpcy5yZWZlcmVuY2VDb250ZXh0OyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7Cit9CisKKy8qKgorICogU3BlYyA6IDguNC4zICYgOS40CisgKi8KK3ByaXZhdGUgdm9pZCBjaGVja0FuZFNldE1vZGlmaWVyc0ZvckNvbnN0cnVjdG9yKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCWludCBtb2RpZmllcnMgPSBtZXRob2RCaW5kaW5nLm1vZGlmaWVyczsKKwlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwlpZiAoKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSAhPSAwKQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNb2RpZmllckZvck1ldGhvZChkZWNsYXJpbmdDbGFzcywgKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CisKKwlpZiAoKCgoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5iaXRzICYgQVNUTm9kZS5Jc0RlZmF1bHRDb25zdHJ1Y3RvcikgIT0gMCkgeworCQkvLyBjZXJ0YWluIGZsYWdzIGFyZSBwcm9wYWdhdGVkIGZyb20gZGVjbGFyaW5nIGNsYXNzIG9udG8gY29uc3RydWN0b3IKKwkJZmluYWwgaW50IERFQ0xBUklOR19GTEFHUyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtfENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWN8Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZDsKKwkJZmluYWwgaW50IFZJU0lCSUxJVFlfRkxBR1MgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZXxDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljfENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQ7CisJCWludCBmbGFnczsKKwkJaWYgKChmbGFncyA9IGRlY2xhcmluZ0NsYXNzLm1vZGlmaWVycyAmIERFQ0xBUklOR19GTEFHUykgIT0gMCkgeworCQkJaWYgKChmbGFncyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKSAhPSAwKSB7CisJCQkJbW9kaWZpZXJzICY9IH5WSVNJQklMSVRZX0ZMQUdTOworCQkJCW1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZTsgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBpbXBsaWNpdGx5IHByaXZhdGUgaW4gZW51bQorCQkJfSBlbHNlIHsKKwkJCQltb2RpZmllcnMgJj0gflZJU0lCSUxJVFlfRkxBR1M7CisJCQkJbW9kaWZpZXJzIHw9IGZsYWdzOyAvLyBwcm9wYWdhdGUgcHVibGljL3Byb3RlY3RlZAorCQkJfQorCQl9CiAJfQogCi0JLyogU3BlYyA6IDguNC4zICYgOS40Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yQ29uc3RydWN0b3IoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCQotCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kQmluZGluZy5tb2RpZmllcnM7Ci0JCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwotCQlpZiAoKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSAhPSAwKQotCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTW9kaWZpZXJGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKwkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4KKwlpbnQgcmVhbE1vZGlmaWVycyA9IG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWc7CiAKLQkJaWYgKCgoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpLmJpdHMgJiBBU1ROb2RlLklzRGVmYXVsdENvbnN0cnVjdG9yKSAhPSAwKSB7Ci0JCQkvLyBjZXJ0YWluIGZsYWdzIGFyZSBwcm9wYWdhdGVkIGZyb20gZGVjbGFyaW5nIGNsYXNzIG9udG8gY29uc3RydWN0b3IKLQkJCWZpbmFsIGludCBERUNMQVJJTkdfRkxBR1MgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bXxDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljfENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQ7Ci0JCQlmaW5hbCBpbnQgVklTSUJJTElUWV9GTEFHUyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlfENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWN8Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZDsKLQkJCWludCBmbGFnczsKLQkJCWlmICgoZmxhZ3MgPSBkZWNsYXJpbmdDbGFzcy5tb2RpZmllcnMgJiBERUNMQVJJTkdfRkxBR1MpICE9IDApIHsKLQkJCQlpZiAoKGZsYWdzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW0pICE9IDApIHsKLQkJCQkJbW9kaWZpZXJzICY9IH5WSVNJQklMSVRZX0ZMQUdTOwotCQkJCQltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7IC8vIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgaW1wbGljaXRseSBwcml2YXRlIGluIGVudW0KLQkJCQl9IGVsc2UgewotCQkJCQltb2RpZmllcnMgJj0gflZJU0lCSUxJVFlfRkxBR1M7Ci0JCQkJCW1vZGlmaWVycyB8PSBmbGFnczsgLy8gcHJvcGFnYXRlIHB1YmxpYy9wcm90ZWN0ZWQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4KLQkJaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOwotCi0JCS8vIGNoZWNrIGZvciBhYm5vcm1hbCBtb2RpZmllcnMKLQkJZmluYWwgaW50IFVORVhQRUNURURfTU9ESUZJRVJTID0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKLQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzRW51bSgpICYmICgoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpLmJpdHMgJiBBU1ROb2RlLklzRGVmYXVsdENvbnN0cnVjdG9yKSA9PSAwKSB7Ci0JCQlmaW5hbCBpbnQgVU5FWFBFQ1RFRF9FTlVNX0NPTlNUUl9NT0RJRklFUlMgPSB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKLQkJCWlmICgocmVhbE1vZGlmaWVycyAmIFVORVhQRUNURURfRU5VTV9DT05TVFJfTU9ESUZJRVJTKSAhPSAwKSB7Ci0JCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yRW51bUNvbnN0cnVjdG9yKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQkJCQltb2RpZmllcnMgJj0gfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcgfCB+VU5FWFBFQ1RFRF9FTlVNX0NPTlNUUl9NT0RJRklFUlM7Ci0JCQl9IGVsc2UgaWYgKCgoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCkgIT0gMCkgewotCQkJCS8vIG11c3QgY2hlY2sgdGhlIHBhcnNlIG5vZGUgZXhwbGljaXRseQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvck1ldGhvZCgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7Ci0JCQl9Ci0JCQltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7IC8vIGVudW0gY29uc3RydWN0b3IgaXMgaW1wbGljaXRseSBwcml2YXRlCi0JCX0gZWxzZSBpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkgewotCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQkJCW1vZGlmaWVycyAmPSB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZyB8IH5VTkVYUEVDVEVEX01PRElGSUVSUzsKLQkJfSBlbHNlIGlmICgoKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KS5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnApICE9IDApIHsKKwkvLyBjaGVjayBmb3IgYWJub3JtYWwgbW9kaWZpZXJzCisJZmluYWwgaW50IFVORVhQRUNURURfTU9ESUZJRVJTID0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKKwlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkgJiYgKCgoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5iaXRzICYgQVNUTm9kZS5Jc0RlZmF1bHRDb25zdHJ1Y3RvcikgPT0gMCkgeworCQlmaW5hbCBpbnQgVU5FWFBFQ1RFRF9FTlVNX0NPTlNUUl9NT0RJRklFUlMgPSB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKKwkJaWYgKChyZWFsTW9kaWZpZXJzICYgVU5FWFBFQ1RFRF9FTlVNX0NPTlNUUl9NT0RJRklFUlMpICE9IDApIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckVudW1Db25zdHJ1Y3RvcigoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KTsKKwkJCW1vZGlmaWVycyAmPSB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZyB8IH5VTkVYUEVDVEVEX0VOVU1fQ09OU1RSX01PRElGSUVSUzsKKwkJfSBlbHNlIGlmICgoKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCkgIT0gMCkgewogCQkJLy8gbXVzdCBjaGVjayB0aGUgcGFyc2Ugbm9kZSBleHBsaWNpdGx5Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOwogCQl9CisJCW1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZTsgLy8gZW51bSBjb25zdHJ1Y3RvciBpcyBpbXBsaWNpdGx5IHByaXZhdGUKKwl9IGVsc2UgaWYgKChyZWFsTW9kaWZpZXJzICYgVU5FWFBFQ1RFRF9NT0RJRklFUlMpICE9IDApIHsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCQltb2RpZmllcnMgJj0gfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcgfCB+VU5FWFBFQ1RFRF9NT0RJRklFUlM7CisJfSBlbHNlIGlmICgoKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcCkgIT0gMCkgeworCQkvLyBtdXN0IGNoZWNrIHRoZSBwYXJzZSBub2RlIGV4cGxpY2l0bHkKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCX0KIAotCQkvLyBjaGVjayBmb3IgaW5jb21wYXRpYmxlIG1vZGlmaWVycyBpbiB0aGUgdmlzaWJpbGl0eSBiaXRzLCBpc29sYXRlIHRoZSB2aXNpYmlsaXR5IGJpdHMKLQkJaW50IGFjY2Vzc29yQml0cyA9IHJlYWxNb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSk7Ci0JCWlmICgoYWNjZXNzb3JCaXRzICYgKGFjY2Vzc29yQml0cyAtIDEpKSAhPSAwKSB7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKwkvLyBjaGVjayBmb3IgaW5jb21wYXRpYmxlIG1vZGlmaWVycyBpbiB0aGUgdmlzaWJpbGl0eSBiaXRzLCBpc29sYXRlIHRoZSB2aXNpYmlsaXR5IGJpdHMKKwlpbnQgYWNjZXNzb3JCaXRzID0gcmVhbE1vZGlmaWVycyAmIChDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKTsKKwlpZiAoKGFjY2Vzc29yQml0cyAmIChhY2Nlc3NvckJpdHMgLSAxKSkgIT0gMCkgeworCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOwogCi0JCQkvLyBuZWVkIHRvIGtlZXAgdGhlIGxlc3MgcmVzdHJpY3RpdmUgc28gZGlzYWJsZSBQcm90ZWN0ZWQvUHJpdmF0ZSBhcyBuZWNlc3NhcnkKLQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgIT0gMCkgewotCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgIT0gMCkKLQkJCQkJbW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkOwotCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApCi0JCQkJCW1vZGlmaWVycyAmPSB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7Ci0JCQl9IGVsc2UgaWYgKChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkKSAhPSAwICYmIChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMCkgeworCQkvLyBuZWVkIHRvIGtlZXAgdGhlIGxlc3MgcmVzdHJpY3RpdmUgc28gZGlzYWJsZSBQcm90ZWN0ZWQvUHJpdmF0ZSBhcyBuZWNlc3NhcnkKKwkJaWYgKChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSAhPSAwKSB7CisJCQlpZiAoKGFjY2Vzc29yQml0cyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQpICE9IDApCisJCQkJbW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkOworCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMCkKIAkJCQltb2RpZmllcnMgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlOwotCQkJfQorCQl9IGVsc2UgaWYgKChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkKSAhPSAwICYmIChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSkgIT0gMCkgeworCQkJbW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZTsKIAkJfQorCX0KIAogLy8JCS8vIGlmIHRoZSByZWNlaXZlcidzIGRlY2xhcmluZyBjbGFzcyBpcyBhIHByaXZhdGUgbmVzdGVkIHR5cGUsIHRoZW4gbWFrZSBzdXJlIHRoZSByZWNlaXZlciBpcyBub3QgcHJpdmF0ZSAoY2F1c2VzIHByb2JsZW1zIGZvciBpbm5lciB0eXBlIGVtdWxhdGlvbikKIC8vCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNQcml2YXRlKCkgJiYgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKQogLy8JCQltb2RpZmllcnMgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlOwogCi0JCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gbW9kaWZpZXJzOworfQorCisvKioKKyAqIFNwZWMgOiA4LjQuMyAmIDkuNAorICovCitwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJaW50IG1vZGlmaWVycyA9IG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzOworCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCWlmICgobW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pICE9IDApCisJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KTsKKworCS8vIGFmdGVyIHRoaXMgcG9pbnQsIHRlc3RzIG9uIHRoZSAxNiBiaXRzIHJlc2VydmVkLgorCWludCByZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKworCS8vIHNldCB0aGUgcmVxdWVzdGVkIG1vZGlmaWVycyBmb3IgYSBtZXRob2QgaW4gYW4gaW50ZXJmYWNlL2Fubm90YXRpb24KKwlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QpKSAhPSAwKSB7CisJCQlpZiAoKGRlY2xhcmluZ0NsYXNzLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uKSAhPSAwKQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckFubm90YXRpb25NZW1iZXIoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CisJCQllbHNlCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCQl9CisJCXJldHVybjsKIAl9Ci0JCi0JLyogU3BlYyA6IDguNC4zICYgOS40Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yTWV0aG9kKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQkKLQkJaW50IG1vZGlmaWVycyA9IG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzOwotCQlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJaWYgKChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCkKLQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7CiAKLQkJLy8gYWZ0ZXIgdGhpcyBwb2ludCwgdGVzdHMgb24gdGhlIDE2IGJpdHMgcmVzZXJ2ZWQuCi0JCWludCByZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwkvLyBjaGVjayBmb3IgYWJub3JtYWwgbW9kaWZpZXJzCisJZmluYWwgaW50IFVORVhQRUNURURfTU9ESUZJRVJTID0gfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkCisJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW5jaHJvbml6ZWQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKKwlpZiAoKHJlYWxNb2RpZmllcnMgJiBVTkVYUEVDVEVEX01PRElGSUVSUykgIT0gMCkgeworCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CisJCW1vZGlmaWVycyAmPSB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZyB8IH5VTkVYUEVDVEVEX01PRElGSUVSUzsKKwl9CiAKLQkJLy8gc2V0IHRoZSByZXF1ZXN0ZWQgbW9kaWZpZXJzIGZvciBhIG1ldGhvZCBpbiBhbiBpbnRlcmZhY2UvYW5ub3RhdGlvbgotCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSkgIT0gMCkgewotCQkJCWlmICgoZGVjbGFyaW5nQ2xhc3MubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pICE9IDApCi0JCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckFubm90YXRpb25NZW1iZXIoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOwotCQkJCWVsc2UKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQorCS8vIGNoZWNrIGZvciBpbmNvbXBhdGlibGUgbW9kaWZpZXJzIGluIHRoZSB2aXNpYmlsaXR5IGJpdHMsIGlzb2xhdGUgdGhlIHZpc2liaWxpdHkgYml0cworCWludCBhY2Nlc3NvckJpdHMgPSByZWFsTW9kaWZpZXJzICYgKENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpOworCWlmICgoYWNjZXNzb3JCaXRzICYgKGFjY2Vzc29yQml0cyAtIDEpKSAhPSAwKSB7CisJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZChkZWNsYXJpbmdDbGFzcywgKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCk7CiAKLQkJLy8gY2hlY2sgZm9yIGFibm9ybWFsIG1vZGlmaWVycwotCQlmaW5hbCBpbnQgVU5FWFBFQ1RFRF9NT0RJRklFUlMgPSB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQKLQkJCXwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW5jaHJvbml6ZWQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKTsKLQkJaWYgKChyZWFsTW9kaWZpZXJzICYgVU5FWFBFQ1RFRF9NT0RJRklFUlMpICE9IDApIHsKLQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvck1ldGhvZCgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7Ci0JCQltb2RpZmllcnMgJj0gfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcgfCB+VU5FWFBFQ1RFRF9NT0RJRklFUlM7Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgaW5jb21wYXRpYmxlIG1vZGlmaWVycyBpbiB0aGUgdmlzaWJpbGl0eSBiaXRzLCBpc29sYXRlIHRoZSB2aXNpYmlsaXR5IGJpdHMKLQkJaW50IGFjY2Vzc29yQml0cyA9IHJlYWxNb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSk7Ci0JCWlmICgoYWNjZXNzb3JCaXRzICYgKGFjY2Vzc29yQml0cyAtIDEpKSAhPSAwKSB7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQotCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlIHNvIGRpc2FibGUgUHJvdGVjdGVkL1ByaXZhdGUgYXMgbmVjZXNzYXJ5Ci0JCQlpZiAoKGFjY2Vzc29yQml0cyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMpICE9IDApIHsKLQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQpICE9IDApCi0JCQkJCW1vZGlmaWVycyAmPSB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZDsKLQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSAhPSAwKQotCQkJCQltb2RpZmllcnMgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlOwotCQkJfSBlbHNlIGlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgIT0gMCAmJiAoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApIHsKKwkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlIHNvIGRpc2FibGUgUHJvdGVjdGVkL1ByaXZhdGUgYXMgbmVjZXNzYXJ5CisJCWlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYykgIT0gMCkgeworCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkKSAhPSAwKQorCQkJCW1vZGlmaWVycyAmPSB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZDsKKwkJCWlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApCiAJCQkJbW9kaWZpZXJzICY9IH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZTsKLQkJCX0KKwkJfSBlbHNlIGlmICgoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgIT0gMCAmJiAoYWNjZXNzb3JCaXRzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApIHsKKwkJCW1vZGlmaWVycyAmPSB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7CiAJCX0KLQotCQkvLyBjaGVjayBmb3IgbW9kaWZpZXJzIGluY29tcGF0aWJsZSB3aXRoIGFic3RyYWN0IG1vZGlmaWVyCi0JCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSAhPSAwKSB7Ci0JCQlpbnQgaW5jb21wYXRpYmxlV2l0aEFic3RyYWN0ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnA7Ci0JCQlpZiAoKG1vZGlmaWVycyAmIGluY29tcGF0aWJsZVdpdGhBYnN0cmFjdCkgIT0gMCkKLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsQWJzdHJhY3RNb2RpZmllckNvbWJpbmF0aW9uRm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7Ci0JCQlpZiAoIW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQkJfQotCi0JCS8qIERJU0FCTEVEIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggamF2YWMgKGlmIGVuYWJsZWQgc2hvdWxkIGFsc28gbWFyayBwcml2YXRlIG1ldGhvZHMgYXMgZmluYWwpCi0JCS8vIG1ldGhvZHMgZnJvbSBhIGZpbmFsIGNsYXNzIGFyZSBmaW5hbCA6IDguNC4zLjMgCi0JCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzRmluYWwoKSkKLQkJCW1vZGlmaWVycyB8PSBBY2NGaW5hbDsKLQkJKi8KLQkJLy8gbmF0aXZlIG1ldGhvZHMgY2Fubm90IGFsc28gYmUgdGFnZ2VkIGFzIHN0cmljdGZwCi0JCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSkgIT0gMCAmJiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwKSAhPSAwKQotCQkJcHJvYmxlbVJlcG9ydGVyKCkubmF0aXZlTWV0aG9kc0Nhbm5vdEJlU3RyaWN0ZnAoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQotCQkvLyBzdGF0aWMgbWVtYmVycyBhcmUgb25seSBhdXRob3JpemVkIGluIGEgc3RhdGljIG1lbWJlciBvciB0b3AgbGV2ZWwgdHlwZQotCQlpZiAoKChyZWFsTW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMCkgJiYgZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkgJiYgIWRlY2xhcmluZ0NsYXNzLmlzU3RhdGljKCkpCi0JCQlwcm9ibGVtUmVwb3J0ZXIoKS51bmV4cGVjdGVkU3RhdGljTW9kaWZpZXJGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKLQotCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKIAl9Ci0JCi0JLyogQ29tcHV0ZSB2YXJpYWJsZSBwb3NpdGlvbnMgaW4gc2NvcGVzIGdpdmVuIGFuIGluaXRpYWwgcG9zaXRpb24gb2Zmc2V0Ci0JICogaWdub3JpbmcgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkgKiAKLQkgKiBEZWFsIHdpdGggYXJndW1lbnRzIGhlcmUsIGxvY2FscyBhbmQgc3Vic2NvcGVzIGFyZSBwcm9jZXNzZWQgaW4gQmxvY2tTY29wZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucyhpbnQgaW5pdE9mZnNldCwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAKLQkJYm9vbGVhbiBpc1JlcG9ydGluZ1VudXNlZEFyZ3VtZW50ID0gZmFsc2U7CisJLy8gY2hlY2sgZm9yIG1vZGlmaWVycyBpbmNvbXBhdGlibGUgd2l0aCBhYnN0cmFjdCBtb2RpZmllcgorCWlmICgobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0KSAhPSAwKSB7CisJCWludCBpbmNvbXBhdGlibGVXaXRoQWJzdHJhY3QgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJpdmF0ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3luY2hyb25pemVkIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY05hdGl2ZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdHJpY3RmcDsKKwkJaWYgKChtb2RpZmllcnMgJiBpbmNvbXBhdGlibGVXaXRoQWJzdHJhY3QpICE9IDApCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsQWJzdHJhY3RNb2RpZmllckNvbWJpbmF0aW9uRm9yTWV0aG9kKGRlY2xhcmluZ0NsYXNzLCAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KTsKKwkJaWYgKCFtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzQWJzdHJhY3QoKSkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCX0KIAotCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXJlZmVyZW5jZUNvbnRleHQ7Ci0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZERlY2wuYmluZGluZzsKLQkJCWlmICghKG1ldGhvZC5pc0Fic3RyYWN0KCkKLQkJCQkJfHwgKG1ldGhvZC5pc0ltcGxlbWVudGluZygpICYmICFjb21waWxlck9wdGlvbnMoKS5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QpIAotCQkJCQl8fCAobWV0aG9kLmlzT3ZlcnJpZGluZygpICYmICFtZXRob2QuaXNJbXBsZW1lbnRpbmcoKSAmJiAhY29tcGlsZXJPcHRpb25zKCkucmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZSkKLQkJCQkJfHwgbWV0aG9kLmlzTWFpbigpKSkgewotCQkJCWlzUmVwb3J0aW5nVW51c2VkQXJndW1lbnQgPSB0cnVlOwotCQkJfQorCS8qIERJU0FCTEVEIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggamF2YWMgKGlmIGVuYWJsZWQgc2hvdWxkIGFsc28gbWFyayBwcml2YXRlIG1ldGhvZHMgYXMgZmluYWwpCisJLy8gbWV0aG9kcyBmcm9tIGEgZmluYWwgY2xhc3MgYXJlIGZpbmFsIDogOC40LjMuMworCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzRmluYWwoKSkKKwkJbW9kaWZpZXJzIHw9IEFjY0ZpbmFsOworCSovCisJLy8gbmF0aXZlIG1ldGhvZHMgY2Fubm90IGFsc28gYmUgdGFnZ2VkIGFzIHN0cmljdGZwCisJaWYgKChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlKSAhPSAwICYmIChtb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RyaWN0ZnApICE9IDApCisJCXByb2JsZW1SZXBvcnRlcigpLm5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwKGRlY2xhcmluZ0NsYXNzLCAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5yZWZlcmVuY2VDb250ZXh0KTsKKworCS8vIHN0YXRpYyBtZW1iZXJzIGFyZSBvbmx5IGF1dGhvcml6ZWQgaW4gYSBzdGF0aWMgbWVtYmVyIG9yIHRvcCBsZXZlbCB0eXBlCisJaWYgKCgocmVhbE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDApICYmIGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpICYmICFkZWNsYXJpbmdDbGFzcy5pc1N0YXRpYygpKQorCQlwcm9ibGVtUmVwb3J0ZXIoKS51bmV4cGVjdGVkU3RhdGljTW9kaWZpZXJGb3JNZXRob2QoZGVjbGFyaW5nQ2xhc3MsIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQpOworCisJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Cit9CisKK3B1YmxpYyB2b2lkIGNoZWNrVW51c2VkUGFyYW1ldGVycyhNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCWlmIChtZXRob2QuaXNBYnN0cmFjdCgpCisJCQl8fCAobWV0aG9kLmlzSW1wbGVtZW50aW5nKCkgJiYgIWNvbXBpbGVyT3B0aW9ucygpLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCkKKwkJCXx8IChtZXRob2QuaXNPdmVycmlkaW5nKCkgJiYgIW1ldGhvZC5pc0ltcGxlbWVudGluZygpICYmICFjb21waWxlck9wdGlvbnMoKS5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlKQorCQkJfHwgbWV0aG9kLmlzTWFpbigpKSB7CisJCS8vIGRvIG5vdCB3YW50IHRvIGNoZWNrCisJCXJldHVybjsKKwl9CisJZm9yIChpbnQgaSA9IDAsIG1heExvY2FscyA9IHRoaXMubG9jYWxJbmRleDsgaSA8IG1heExvY2FsczsgaSsrKSB7CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gdGhpcy5sb2NhbHNbaV07CisJCWlmIChsb2NhbCA9PSBudWxsIHx8ICgobG9jYWwudGFnQml0cyAmIFRhZ0JpdHMuSXNBcmd1bWVudCkgPT0gMCkpIHsKKwkJCWJyZWFrOyAvLyBkb25lIHdpdGggYXJndW1lbnRzCiAJCX0KLQkJdGhpcy5vZmZzZXQgPSBpbml0T2Zmc2V0OwotCQl0aGlzLm1heE9mZnNldCA9IGluaXRPZmZzZXQ7CisJCWlmIChsb2NhbC51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCAmJgorCQkJCS8vIGRvIG5vdCByZXBvcnQgZmFrZSB1c2VkIHZhcmlhYmxlCisJCQkJKChsb2NhbC5kZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0xvY2FsRGVjbGFyYXRpb25SZWFjaGFibGUpICE9IDApKSB7IC8vIGRlY2xhcmF0aW9uIGlzIHJlYWNoYWJsZQorCQkJcHJvYmxlbVJlcG9ydGVyKCkudW51c2VkQXJndW1lbnQobG9jYWwuZGVjbGFyYXRpb24pOworCQl9CisJfQorfQogCi0JCS8vIG1hbmFnZSBhcmd1bWVudHMJCi0JCWludCBpbG9jYWwgPSAwLCBtYXhMb2NhbHMgPSB0aGlzLmxvY2FsSW5kZXg7CQotCQl3aGlsZSAoaWxvY2FsIDwgbWF4TG9jYWxzKSB7Ci0JCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IGxvY2Fsc1tpbG9jYWxdOwotCQkJaWYgKGxvY2FsID09IG51bGwgfHwgKChsb2NhbC50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSA9PSAwKSkgYnJlYWs7IC8vIGRvbmUgd2l0aCBhcmd1bWVudHMKKy8qKgorICogQ29tcHV0ZSB2YXJpYWJsZSBwb3NpdGlvbnMgaW4gc2NvcGVzIGdpdmVuIGFuIGluaXRpYWwgcG9zaXRpb24gb2Zmc2V0CisgKiBpZ25vcmluZyB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgorICoKKyAqIERlYWwgd2l0aCBhcmd1bWVudHMgaGVyZSwgbG9jYWxzIGFuZCBzdWJzY29wZXMgYXJlIHByb2Nlc3NlZCBpbiBCbG9ja1Njb3BlIG1ldGhvZAorICovCitwdWJsaWMgdm9pZCBjb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucyhpbnQgaW5pdE9mZnNldCwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJdGhpcy5vZmZzZXQgPSBpbml0T2Zmc2V0OworCXRoaXMubWF4T2Zmc2V0ID0gaW5pdE9mZnNldDsKIAotCQkJLy8gZG8gbm90IHJlcG9ydCBmYWtlIHVzZWQgdmFyaWFibGUKLQkJCWlmIChpc1JlcG9ydGluZ1VudXNlZEFyZ3VtZW50Ci0JCQkJCSYmIGxvY2FsLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVU5VU0VECi0JCQkJCSYmICgobG9jYWwuZGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlKSAhPSAwKSkgeyAvLyBkZWNsYXJhdGlvbiBpcyByZWFjaGFibGUKLQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZEFyZ3VtZW50KGxvY2FsLmRlY2xhcmF0aW9uKTsKLQkJCX0KKwkvLyBtYW5hZ2UgYXJndW1lbnRzCisJaW50IGlsb2NhbCA9IDAsIG1heExvY2FscyA9IHRoaXMubG9jYWxJbmRleDsKKwl3aGlsZSAoaWxvY2FsIDwgbWF4TG9jYWxzKSB7CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gdGhpcy5sb2NhbHNbaWxvY2FsXTsKKwkJaWYgKGxvY2FsID09IG51bGwgfHwgKChsb2NhbC50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSA9PSAwKSkgYnJlYWs7IC8vIGRvbmUgd2l0aCBhcmd1bWVudHMKIAotCQkJLy8gcmVjb3JkIHVzZXItZGVmaW5lZCBhcmd1bWVudCBmb3IgYXR0cmlidXRlIGdlbmVyYXRpb24KLQkJCWNvZGVTdHJlYW0ucmVjb3JkKGxvY2FsKTsgCisJCS8vIHJlY29yZCB1c2VyLWRlZmluZWQgYXJndW1lbnQgZm9yIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCisJCWNvZGVTdHJlYW0ucmVjb3JkKGxvY2FsKTsKIAotCQkJLy8gYXNzaWduIHZhcmlhYmxlIHBvc2l0aW9uCi0JCQlsb2NhbC5yZXNvbHZlZFBvc2l0aW9uID0gdGhpcy5vZmZzZXQ7CisJCS8vIGFzc2lnbiB2YXJpYWJsZSBwb3NpdGlvbgorCQlsb2NhbC5yZXNvbHZlZFBvc2l0aW9uID0gdGhpcy5vZmZzZXQ7CiAKLQkJCWlmICgobG9jYWwudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobG9jYWwudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7CisJCWlmICgobG9jYWwudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobG9jYWwudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7CisJCQl0aGlzLm9mZnNldCArPSAyOworCQl9IGVsc2UgeworCQkJdGhpcy5vZmZzZXQrKzsKKwkJfQorCQkvLyBjaGVjayBmb3IgdG9vIG1hbnkgYXJndW1lbnRzL2xvY2FsIHZhcmlhYmxlcworCQlpZiAodGhpcy5vZmZzZXQgPiAweEZGKSB7IC8vIG5vIG1vcmUgdGhhbiAyNTUgd29yZHMgb2YgYXJndW1lbnRzCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckFyZ3VtZW50KGxvY2FsLCBsb2NhbC5kZWNsYXJhdGlvbik7CisJCX0KKwkJaWxvY2FsKys7CisJfQorCisJLy8gc25lYWsgaW4gZXh0cmEgYXJndW1lbnQgYmVmb3JlIG90aGVyIGxvY2FsIHZhcmlhYmxlcworCWlmICh0aGlzLmV4dHJhU3ludGhldGljQXJndW1lbnRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaWFyZyA9IDAsIG1heEFyZ3VtZW50cyA9IHRoaXMuZXh0cmFTeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpYXJnIDwgbWF4QXJndW1lbnRzOyBpYXJnKyspeworCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFyZ3VtZW50ID0gdGhpcy5leHRyYVN5bnRoZXRpY0FyZ3VtZW50c1tpYXJnXTsKKwkJCWFyZ3VtZW50LnJlc29sdmVkUG9zaXRpb24gPSB0aGlzLm9mZnNldDsKKwkJCWlmICgoYXJndW1lbnQudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoYXJndW1lbnQudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKXsKIAkJCQl0aGlzLm9mZnNldCArPSAyOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLm9mZnNldCsrOwogCQkJfQotCQkJLy8gY2hlY2sgZm9yIHRvbyBtYW55IGFyZ3VtZW50cy9sb2NhbCB2YXJpYWJsZXMKIAkJCWlmICh0aGlzLm9mZnNldCA+IDB4RkYpIHsgLy8gbm8gbW9yZSB0aGFuIDI1NSB3b3JkcyBvZiBhcmd1bWVudHMKLQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yQXJndW1lbnQobG9jYWwsIGxvY2FsLmRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJCWlsb2NhbCsrOwotCQl9Ci0JCQotCQkvLyBzbmVhayBpbiBleHRyYSBhcmd1bWVudCBiZWZvcmUgb3RoZXIgbG9jYWwgdmFyaWFibGVzCi0JCWlmIChleHRyYVN5bnRoZXRpY0FyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpYXJnID0gMCwgbWF4QXJndW1lbnRzID0gZXh0cmFTeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpYXJnIDwgbWF4QXJndW1lbnRzOyBpYXJnKyspewotCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBhcmd1bWVudCA9IGV4dHJhU3ludGhldGljQXJndW1lbnRzW2lhcmddOwotCQkJCWFyZ3VtZW50LnJlc29sdmVkUG9zaXRpb24gPSB0aGlzLm9mZnNldDsKLQkJCQlpZiAoKGFyZ3VtZW50LnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGFyZ3VtZW50LnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSl7Ci0JCQkJCXRoaXMub2Zmc2V0ICs9IDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5vZmZzZXQrKzsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cwotCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yQXJndW1lbnQoYXJndW1lbnQsIChBU1ROb2RlKXRoaXMucmVmZXJlbmNlQ29udGV4dCk7IAotCQkJCX0KKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckFyZ3VtZW50KGFyZ3VtZW50LCAoQVNUTm9kZSl0aGlzLnJlZmVyZW5jZUNvbnRleHQpOwogCQkJfQogCQl9Ci0JCXRoaXMuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoaWxvY2FsLCB0aGlzLm9mZnNldCwgY29kZVN0cmVhbSk7CisJfQorCXRoaXMuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoaWxvY2FsLCB0aGlzLm9mZnNldCwgY29kZVN0cmVhbSk7Cit9CisKKy8qKgorICogRXJyb3IgbWFuYWdlbWVudDoKKyAqIAkJa2VlcCBudWxsIGZvciBhbGwgdGhlIGVycm9ycyB0aGF0IHByZXZlbnQgdGhlIG1ldGhvZCB0byBiZSBjcmVhdGVkCisgKiAJCW90aGVyd2lzZSByZXR1cm4gYSBjb3JyZWN0IG1ldGhvZCBiaW5kaW5nIChidXQgd2l0aG91dCB0aGUgZWxlbWVudAorICoJCXRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtKSA6IGkuZS4gSW5jb3JyZWN0IHRocm93biBleGNlcHRpb24KKyAqLworTWV0aG9kQmluZGluZyBjcmVhdGVNZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKwkvLyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGVycm9yIHJlcG9ydGluZworCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IG1ldGhvZDsKKwltZXRob2Quc2NvcGUgPSB0aGlzOworCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gcmVmZXJlbmNlVHlwZSgpLmJpbmRpbmc7CisJaW50IG1vZGlmaWVycyA9IG1ldGhvZC5tb2RpZmllcnMgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQ7CisJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJaWYgKG1ldGhvZC5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpKQorCQkJbW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSXNEZWZhdWx0Q29uc3RydWN0b3I7CisJCW1ldGhvZC5iaW5kaW5nID0gbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBudWxsLCBudWxsLCBkZWNsYXJpbmdDbGFzcyk7CisJCWNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yQ29uc3RydWN0b3IobWV0aG9kLmJpbmRpbmcpOworCX0gZWxzZSB7CisJCWlmIChkZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSAvLyBpbnRlcmZhY2Ugb3IgYW5ub3RhdGlvbiB0eXBlCisJCQltb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdDsKKwkJbWV0aG9kLmJpbmRpbmcgPQorCQkJbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBtZXRob2Quc2VsZWN0b3IsIG51bGwsIG51bGwsIG51bGwsIGRlY2xhcmluZ0NsYXNzKTsKKwkJY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JNZXRob2QobWV0aG9kLmJpbmRpbmcpOworCX0KKwl0aGlzLmlzU3RhdGljID0gbWV0aG9kLmJpbmRpbmcuaXNTdGF0aWMoKTsKKworCUFyZ3VtZW50W10gYXJnVHlwZXMgPSBtZXRob2QuYXJndW1lbnRzOworCWludCBhcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsKKwlpZiAoYXJnTGVuZ3RoID4gMCAmJiBjb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCWlmIChhcmdUeXBlc1stLWFyZ0xlbmd0aF0uaXNWYXJBcmdzKCkpCisJCQltZXRob2QuYmluZGluZy5tb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ZhcmFyZ3M7CisJCXdoaWxlICgtLWFyZ0xlbmd0aCA+PSAwKSB7CisJCQlpZiAoYXJnVHlwZXNbYXJnTGVuZ3RoXS5pc1ZhckFyZ3MoKSkKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsVmFyYXJnKGFyZ1R5cGVzW2FyZ0xlbmd0aF0sIG1ldGhvZCk7CisJCX0KIAl9CiAKLQkvKiBFcnJvciBtYW5hZ2VtZW50OgotCSAqIAkJa2VlcCBudWxsIGZvciBhbGwgdGhlIGVycm9ycyB0aGF0IHByZXZlbnQgdGhlIG1ldGhvZCB0byBiZSBjcmVhdGVkCi0JICogCQlvdGhlcndpc2UgcmV0dXJuIGEgY29ycmVjdCBtZXRob2QgYmluZGluZyAoYnV0IHdpdGhvdXQgdGhlIGVsZW1lbnQKLQkgKgkJdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0pIDogaWUgOiBJbmNvcnJlY3QgdGhyb3duIGV4Y2VwdGlvbgotCSAqLwotCU1ldGhvZEJpbmRpbmcgY3JlYXRlTWV0aG9kKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7Ci0KLQkJLy8gaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBlcnJvciByZXBvcnRpbmcKLQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gbWV0aG9kOwotCQltZXRob2Quc2NvcGUgPSB0aGlzOwotCQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IHJlZmVyZW5jZVR5cGUoKS5iaW5kaW5nOwotCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLm1vZGlmaWVycyB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZDsKLQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCWlmIChtZXRob2QuaXNEZWZhdWx0Q29uc3RydWN0b3IoKSkKLQkJCQltb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NJc0RlZmF1bHRDb25zdHJ1Y3RvcjsKLQkJCW1ldGhvZC5iaW5kaW5nID0gbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBudWxsLCBudWxsLCBkZWNsYXJpbmdDbGFzcyk7Ci0JCQljaGVja0FuZFNldE1vZGlmaWVyc0ZvckNvbnN0cnVjdG9yKG1ldGhvZC5iaW5kaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSAvLyBpbnRlcmZhY2Ugb3IgYW5ub3RhdGlvbiB0eXBlCi0JCQkJbW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3Q7Ci0JCQltZXRob2QuYmluZGluZyA9Ci0JCQkJbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBtZXRob2Quc2VsZWN0b3IsIG51bGwsIG51bGwsIG51bGwsIGRlY2xhcmluZ0NsYXNzKTsKLQkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yTWV0aG9kKG1ldGhvZC5iaW5kaW5nKTsKLQkJfQotCQl0aGlzLmlzU3RhdGljID0gbWV0aG9kLmJpbmRpbmcuaXNTdGF0aWMoKTsKLQotCQlBcmd1bWVudFtdIGFyZ1R5cGVzID0gbWV0aG9kLmFyZ3VtZW50czsKLQkJaW50IGFyZ0xlbmd0aCA9IGFyZ1R5cGVzID09IG51bGwgPyAwIDogYXJnVHlwZXMubGVuZ3RoOwotCQlpZiAoYXJnTGVuZ3RoID4gMCAmJiBjb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCQlpZiAoYXJnVHlwZXNbLS1hcmdMZW5ndGhdLmlzVmFyQXJncygpKQotCQkJCW1ldGhvZC5iaW5kaW5nLm1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJnczsKLQkJCXdoaWxlICgtLWFyZ0xlbmd0aCA+PSAwKSB7Ci0JCQkJaWYgKGFyZ1R5cGVzW2FyZ0xlbmd0aF0uaXNWYXJBcmdzKCkpCi0JCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWYXJhcmcoYXJnVHlwZXNbYXJnTGVuZ3RoXSwgbWV0aG9kKTsKLQkJCX0KLQkJfQotCQkKLQkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLnR5cGVQYXJhbWV0ZXJzKCk7Ci0JICAgIC8vIGRvIG5vdCBjb25zdHJ1Y3QgdHlwZSB2YXJpYWJsZXMgaWYgc291cmNlIDwgMS41Ci0JCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkgICAgbWV0aG9kLmJpbmRpbmcudHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7Ci0JCX0gZWxzZSB7Ci0JCQltZXRob2QuYmluZGluZy50eXBlVmFyaWFibGVzID0gY3JlYXRlVHlwZVZhcmlhYmxlcyh0eXBlUGFyYW1ldGVycywgbWV0aG9kLmJpbmRpbmcpOwotCQkJbWV0aG9kLmJpbmRpbmcubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kLmJpbmRpbmc7CisJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLnR5cGVQYXJhbWV0ZXJzKCk7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg1MCwgSWYgdGhleSBleGlzdCBhdCBhbGwsIHByb2Nlc3MgdHlwZSBwYXJhbWV0ZXJzIGlycmVzcGVjdGl2ZSBvZiBzb3VyY2UgbGV2ZWwuCisgICAgaWYgKHR5cGVQYXJhbWV0ZXJzID09IG51bGwgfHwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IDApIHsKKwkgICAgbWV0aG9kLmJpbmRpbmcudHlwZVZhcmlhYmxlcyA9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CisJfSBlbHNlIHsKKwkJbWV0aG9kLmJpbmRpbmcudHlwZVZhcmlhYmxlcyA9IGNyZWF0ZVR5cGVWYXJpYWJsZXModHlwZVBhcmFtZXRlcnMsIG1ldGhvZC5iaW5kaW5nKTsKKwkJbWV0aG9kLmJpbmRpbmcubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsKIAl9CisJcmV0dXJuIG1ldGhvZC5iaW5kaW5nOworfQogCi0JLyogT3ZlcnJpZGRlbiB0byBkZXRlY3QgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGw6Ci0JCi0JY2xhc3MgWCB7Ci0JCWludCBpOwotCQlYIG15WDsKLQkJWChYIHgpIHsKLQkJCXRoaXMoaSwgbXlYLmksIHguaSk7IC8vIHNhbWUgZm9yIHN1cGVyIGNhbGxzLi4uIG9ubHkgdGhlIGZpcnN0IDIgZmllbGQgYWNjZXNzZXMgYXJlIGVycm9ycwotCQl9CisvKioKKyAqIE92ZXJyaWRkZW4gdG8gZGV0ZWN0IHRoZSBlcnJvciBjYXNlIGluc2lkZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsOgorY2xhc3MgWCB7CisJaW50IGk7CisJWCBteVg7CisJWChYIHgpIHsKKwkJdGhpcyhpLCBteVguaSwgeC5pKTsgLy8gc2FtZSBmb3Igc3VwZXIgY2FsbHMuLi4gb25seSB0aGUgZmlyc3QgMiBmaWVsZCBhY2Nlc3NlcyBhcmUgZXJyb3JzCiAJfQotCSovCi0JcHVibGljIEZpZWxkQmluZGluZyBmaW5kRmllbGQoCi0JCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJY2hhcltdIGZpZWxkTmFtZSwKLQkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCi0JCWJvb2xlYW4gbmVlZFJlc29sdmUpIHsKK30KKyAqLworcHVibGljIEZpZWxkQmluZGluZyBmaW5kRmllbGQoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBjaGFyW10gZmllbGROYW1lLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgYm9vbGVhbiBuZWVkUmVzb2x2ZSkgewogCi0JCUZpZWxkQmluZGluZyBmaWVsZCA9IHN1cGVyLmZpbmRGaWVsZChyZWNlaXZlclR5cGUsIGZpZWxkTmFtZSwgaW52b2NhdGlvblNpdGUsIG5lZWRSZXNvbHZlKTsKLQkJaWYgKGZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFmaWVsZC5pc1ZhbGlkQmluZGluZygpKQotCQkJcmV0dXJuIGZpZWxkOyAvLyBhbnN3ZXIgdGhlIGVycm9yIGZpZWxkCi0JCWlmIChmaWVsZC5pc1N0YXRpYygpKQotCQkJcmV0dXJuIGZpZWxkOyAvLyBzdGF0aWMgZmllbGRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZQorCUZpZWxkQmluZGluZyBmaWVsZCA9IHN1cGVyLmZpbmRGaWVsZChyZWNlaXZlclR5cGUsIGZpZWxkTmFtZSwgaW52b2NhdGlvblNpdGUsIG5lZWRSZXNvbHZlKTsKKwlpZiAoZmllbGQgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJaWYgKCFmaWVsZC5pc1ZhbGlkQmluZGluZygpKQorCQlyZXR1cm4gZmllbGQ7IC8vIGFuc3dlciB0aGUgZXJyb3IgZmllbGQKKwlpZiAoZmllbGQuaXNTdGF0aWMoKSkKKwkJcmV0dXJuIGZpZWxkOyAvLyBzdGF0aWMgZmllbGRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZQogCi0JCWlmICghaXNDb25zdHJ1Y3RvckNhbGwgfHwgcmVjZWl2ZXJUeXBlICE9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKSkKLQkJCXJldHVybiBmaWVsZDsKKwlpZiAoIXRoaXMuaXNDb25zdHJ1Y3RvckNhbGwgfHwgcmVjZWl2ZXJUeXBlICE9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKSkKKwkJcmV0dXJuIGZpZWxkOwogCi0JCWlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpCisJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkKKwkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJZmllbGQsIC8vIGNsb3Nlc3QgbWF0Y2gKKwkJCWZpZWxkLmRlY2xhcmluZ0NsYXNzLAorCQkJZmllbGROYW1lLAorCQkJUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24pOworCWlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJLy8gbG9vayB0byBzZWUgaWYgdGhlIGZpZWxkIGlzIHRoZSBmaXJzdCBiaW5kaW5nCisJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgbmFtZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBpbnZvY2F0aW9uU2l0ZTsKKwkJaWYgKG5hbWUuYmluZGluZyA9PSBudWxsKQorCQkJLy8gb25seSB0cnVlIHdoZW4gdGhlIGZpZWxkIGlzIHRoZSBmaWVsZGJpbmRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBuYW1lJ3MgdG9rZW5zCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCiAJCQkJZmllbGQsIC8vIGNsb3Nlc3QgbWF0Y2gKIAkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcywKIAkJCQlmaWVsZE5hbWUsCiAJCQkJUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24pOwotCQlpZiAoaW52b2NhdGlvblNpdGUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7Ci0JCQkvLyBsb29rIHRvIHNlZSBpZiB0aGUgZmllbGQgaXMgdGhlIGZpcnN0IGJpbmRpbmcKLQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgbmFtZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBpbnZvY2F0aW9uU2l0ZTsKLQkJCWlmIChuYW1lLmJpbmRpbmcgPT0gbnVsbCkKLQkJCQkvLyBvbmx5IHRydWUgd2hlbiB0aGUgZmllbGQgaXMgdGhlIGZpZWxkYmluZGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIG5hbWUncyB0b2tlbnMKLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCi0JCQkJCWZpZWxkLCAvLyBjbG9zZXN0IG1hdGNoCi0JCQkJCWZpZWxkLmRlY2xhcmluZ0NsYXNzLAotCQkJCQlmaWVsZE5hbWUsCi0JCQkJCVByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmllbGQ7CiAJfQorCXJldHVybiBmaWVsZDsKK30KIAotCXB1YmxpYyBib29sZWFuIGlzSW5zaWRlQ29uc3RydWN0b3IoKSB7CitwdWJsaWMgYm9vbGVhbiBpc0luc2lkZUNvbnN0cnVjdG9yKCkgeworCXJldHVybiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7Cit9CiAKLQkJcmV0dXJuIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW5zaWRlSW5pdGlhbGl6ZXIoKSB7CitwdWJsaWMgYm9vbGVhbiBpc0luc2lkZUluaXRpYWxpemVyKCkgeworCXJldHVybiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsKK30KIAotCQlyZXR1cm4gKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOwotCX0KK3B1YmxpYyBib29sZWFuIGlzSW5zaWRlSW5pdGlhbGl6ZXJPckNvbnN0cnVjdG9yKCkgeworCXJldHVybiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKQorCQl8fCAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7Cit9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpIHsKKy8qKgorICogQW5zd2VyIHRoZSBwcm9ibGVtIHJlcG9ydGVyIHRvIHVzZSBmb3IgcmFpc2luZyBuZXcgcHJvYmxlbXMuCisgKgorICogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dAorICogKHVuaXQsIHR5cGUgb3IgbWV0aG9kKSBpbiBjYXNlIHRoZSBwcm9ibGVtIGhhbmRsZXIgZGVjaWRlcyBpdCBpcyBuZWNlc3NhcnkKKyAqIHRvIGFib3J0LgorICovCitwdWJsaWMgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcigpIHsKKwlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucHJvYmxlbVJlcG9ydGVyOworCXByb2JsZW1SZXBvcnRlci5yZWZlcmVuY2VDb250ZXh0ID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0OworCXJldHVybiBwcm9ibGVtUmVwb3J0ZXI7Cit9CiAKLQkJcmV0dXJuIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKQotCQkJfHwgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKiBBbnN3ZXIgdGhlIHByb2JsZW0gcmVwb3J0ZXIgdG8gdXNlIGZvciByYWlzaW5nIG5ldyBwcm9ibGVtcy4KLQkgKgotCSAqIE5vdGUgdGhhdCBhcyBhIHNpZGUtZWZmZWN0LCB0aGlzIHVwZGF0ZXMgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGNvbnRleHQKLQkgKiAodW5pdCwgdHlwZSBvciBtZXRob2QpIGluIGNhc2UgdGhlIHByb2JsZW0gaGFuZGxlciBkZWNpZGVzIGl0IGlzIG5lY2Vzc2FyeQotCSAqIHRvIGFib3J0LgotCSAqLwotCXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCkgewotCi0JCU1ldGhvZFNjb3BlIG91dGVyTWV0aG9kU2NvcGU7Ci0JCWlmICgob3V0ZXJNZXRob2RTY29wZSA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkpID09IHRoaXMpIHsKLQkJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5wcm9ibGVtUmVwb3J0ZXI7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7Ci0JCQlyZXR1cm4gcHJvYmxlbVJlcG9ydGVyOwotCQl9Ci0JCXJldHVybiBvdXRlck1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgcmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoRmxvd0luZm8gZmxvd0luZm8pIHsKLQotCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgcmV0dXJuIC0xOwotCi0JCVVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsRmxvd0luZm8gPSBmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpOwotCQlsb25nW10gZXh0cmFJbml0cyA9IHVuY29uZGl0aW9uYWxGbG93SW5mby5leHRyYSA9PSBudWxsID8KLQkJCQludWxsIDogdW5jb25kaXRpb25hbEZsb3dJbmZvLmV4dHJhWzBdOwotCQlsb25nIGluaXRzID0gdW5jb25kaXRpb25hbEZsb3dJbmZvLmRlZmluaXRlSW5pdHM7Ci0JCWNoZWNrTmV4dEVudHJ5IDogZm9yIChpbnQgaSA9IGxhc3RJbmRleDsgLS1pID49IDA7KSB7Ci0JCQlpZiAoZGVmaW5pdGVJbml0c1tpXSA9PSBpbml0cykgewotCQkJCWxvbmdbXSBvdGhlckluaXRzID0gZXh0cmFEZWZpbml0ZUluaXRzW2ldOwotCQkJCWlmICgoZXh0cmFJbml0cyAhPSBudWxsKSAmJiAob3RoZXJJbml0cyAhPSBudWxsKSkgewotCQkJCQlpZiAoZXh0cmFJbml0cy5sZW5ndGggPT0gb3RoZXJJbml0cy5sZW5ndGgpIHsKLQkJCQkJCWludCBqLCBtYXg7Ci0JCQkJCQlmb3IgKGogPSAwLCBtYXggPSBleHRyYUluaXRzLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7Ci0JCQkJCQkJaWYgKGV4dHJhSW5pdHNbal0gIT0gb3RoZXJJbml0c1tqXSkgewotCQkJCQkJCQljb250aW51ZSBjaGVja05leHRFbnRyeTsKLQkJCQkJCQl9CitwdWJsaWMgZmluYWwgaW50IHJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEVfT1JfREVBRCkgIT0gMCkgcmV0dXJuIC0xOworCVVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsRmxvd0luZm8gPSBmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHNXaXRob3V0U2lkZUVmZmVjdCgpOworCWxvbmdbXSBleHRyYUluaXRzID0gdW5jb25kaXRpb25hbEZsb3dJbmZvLmV4dHJhID09IG51bGwgPworCQkJbnVsbCA6IHVuY29uZGl0aW9uYWxGbG93SW5mby5leHRyYVswXTsKKwlsb25nIGluaXRzID0gdW5jb25kaXRpb25hbEZsb3dJbmZvLmRlZmluaXRlSW5pdHM7CisJY2hlY2tOZXh0RW50cnkgOiBmb3IgKGludCBpID0gdGhpcy5sYXN0SW5kZXg7IC0taSA+PSAwOykgeworCQlpZiAodGhpcy5kZWZpbml0ZUluaXRzW2ldID09IGluaXRzKSB7CisJCQlsb25nW10gb3RoZXJJbml0cyA9IHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW2ldOworCQkJaWYgKChleHRyYUluaXRzICE9IG51bGwpICYmIChvdGhlckluaXRzICE9IG51bGwpKSB7CisJCQkJaWYgKGV4dHJhSW5pdHMubGVuZ3RoID09IG90aGVySW5pdHMubGVuZ3RoKSB7CisJCQkJCWludCBqLCBtYXg7CisJCQkJCWZvciAoaiA9IDAsIG1heCA9IGV4dHJhSW5pdHMubGVuZ3RoOyBqIDwgbWF4OyBqKyspIHsKKwkJCQkJCWlmIChleHRyYUluaXRzW2pdICE9IG90aGVySW5pdHNbal0pIHsKKwkJCQkJCQljb250aW51ZSBjaGVja05leHRFbnRyeTsKIAkJCQkJCX0KLQkJCQkJCXJldHVybiBpOwogCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChleHRyYUluaXRzID09IG51bGwpICYmIChvdGhlckluaXRzID09IG51bGwpKSB7Ci0JCQkJCQlyZXR1cm4gaTsKLQkJCQkJfQorCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoZXh0cmFJbml0cyA9PSBudWxsKSAmJiAob3RoZXJJbml0cyA9PSBudWxsKSkgeworCQkJCQlyZXR1cm4gaTsKIAkJCQl9CiAJCQl9CiAJCX0KLQotCQkvLyBhZGQgYSBuZXcgZW50cnkKLQkJaWYgKGRlZmluaXRlSW5pdHMubGVuZ3RoID09IGxhc3RJbmRleCkgewotCQkJLy8gbmVlZCBhIHJlc2l6ZQotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlkZWZpbml0ZUluaXRzLAotCQkJCTAsCi0JCQkJKGRlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tsYXN0SW5kZXggKyAyMF0pLAotCQkJCTAsCi0JCQkJbGFzdEluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJZXh0cmFEZWZpbml0ZUluaXRzLAotCQkJCTAsCi0JCQkJKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW2xhc3RJbmRleCArIDIwXVtdKSwKLQkJCQkwLAotCQkJCWxhc3RJbmRleCk7Ci0JCX0KLQkJZGVmaW5pdGVJbml0c1tsYXN0SW5kZXhdID0gaW5pdHM7Ci0JCWlmIChleHRyYUluaXRzICE9IG51bGwpIHsKLQkJCWV4dHJhRGVmaW5pdGVJbml0c1tsYXN0SW5kZXhdID0gbmV3IGxvbmdbZXh0cmFJbml0cy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlleHRyYUluaXRzLAotCQkJCTAsCi0JCQkJZXh0cmFEZWZpbml0ZUluaXRzW2xhc3RJbmRleF0sCi0JCQkJMCwKLQkJCQlleHRyYUluaXRzLmxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIGxhc3RJbmRleCsrOwogCX0KIAotCS8qIEFuc3dlciB0aGUgcmVmZXJlbmNlIG1ldGhvZCBvZiB0aGlzIHNjb3BlLCBvciBudWxsIGlmIGluaXRpYWxpemF0aW9uIHNjb29wZS4KLQkqLwotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHJlZmVyZW5jZU1ldGhvZCgpIHsKLQotCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJldHVybiAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKLQkJcmV0dXJuIG51bGw7CisJLy8gYWRkIGEgbmV3IGVudHJ5CisJaWYgKHRoaXMuZGVmaW5pdGVJbml0cy5sZW5ndGggPT0gdGhpcy5sYXN0SW5kZXgpIHsKKwkJLy8gbmVlZCBhIHJlc2l6ZQorCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5kZWZpbml0ZUluaXRzLAorCQkJMCwKKwkJCSh0aGlzLmRlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1t0aGlzLmxhc3RJbmRleCArIDIwXSksCisJCQkwLAorCQkJdGhpcy5sYXN0SW5kZXgpOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5leHRyYURlZmluaXRlSW5pdHMsCisJCQkwLAorCQkJKHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbdGhpcy5sYXN0SW5kZXggKyAyMF1bXSksCisJCQkwLAorCQkJdGhpcy5sYXN0SW5kZXgpOwogCX0KLQotCS8qIEFuc3dlciB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgdGhpcyBzY29wZS4KLQkqCi0JKiBJdCBpcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLgotCSovCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgewotCi0JCXJldHVybiAoKENsYXNzU2NvcGUpIHBhcmVudCkucmVmZXJlbmNlQ29udGV4dDsKKwl0aGlzLmRlZmluaXRlSW5pdHNbdGhpcy5sYXN0SW5kZXhdID0gaW5pdHM7CisJaWYgKGV4dHJhSW5pdHMgIT0gbnVsbCkgeworCQl0aGlzLmV4dHJhRGVmaW5pdGVJbml0c1t0aGlzLmxhc3RJbmRleF0gPSBuZXcgbG9uZ1tleHRyYUluaXRzLmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlleHRyYUluaXRzLAorCQkJMCwKKwkJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW3RoaXMubGFzdEluZGV4XSwKKwkJCTAsCisJCQlleHRyYUluaXRzLmxlbmd0aCk7CiAJfQorCXJldHVybiB0aGlzLmxhc3RJbmRleCsrOworfQogCi0JU3RyaW5nIGJhc2ljVG9TdHJpbmcoaW50IHRhYikgeworLyoqCisgKiAgQW5zd2VyIHRoZSByZWZlcmVuY2UgbWV0aG9kIG9mIHRoaXMgc2NvcGUsIG9yIG51bGwgaWYgaW5pdGlhbGl6YXRpb24gc2NvcGUuCisgKi8KK3B1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHJlZmVyZW5jZU1ldGhvZCgpIHsKKwlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmV0dXJuIChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLnJlZmVyZW5jZUNvbnRleHQ7CisJcmV0dXJuIG51bGw7Cit9CiAKLQkJU3RyaW5nIG5ld0xpbmUgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSB0YWI7IC0taSA+PSAwOykKLQkJCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBzID0gbmV3TGluZSArICItLS0gTWV0aG9kIFNjb3BlIC0tLSI7IC8vJE5PTi1OTFMtMSQKLQkJbmV3TGluZSArPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JCXMgKz0gbmV3TGluZSArICJsb2NhbHM6IjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsSW5kZXg7IGkrKykKLQkJCXMgKz0gbmV3TGluZSArICJcdCIgKyBsb2NhbHNbaV0udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlzICs9IG5ld0xpbmUgKyAic3RhcnRJbmRleCA9ICIgKyBzdGFydEluZGV4OyAvLyROT04tTkxTLTEkCi0JCXMgKz0gbmV3TGluZSArICJpc0NvbnN0cnVjdG9yQ2FsbCA9ICIgKyBpc0NvbnN0cnVjdG9yQ2FsbDsgLy8kTk9OLU5MUy0xJAotCQlzICs9IG5ld0xpbmUgKyAiaW5pdGlhbGl6ZWRGaWVsZCA9ICIgKyBpbml0aWFsaXplZEZpZWxkOyAvLyROT04tTkxTLTEkCi0JCXMgKz0gbmV3TGluZSArICJsYXN0VmlzaWJsZUZpZWxkSUQgPSAiICsgbGFzdFZpc2libGVGaWVsZElEOyAvLyROT04tTkxTLTEkCi0JCXMgKz0gbmV3TGluZSArICJyZWZlcmVuY2VDb250ZXh0ID0gIiArIHJlZmVyZW5jZUNvbnRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHM7Ci0JfQotCisvKioKKyAqICBBbnN3ZXIgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgc2NvcGUuCisgKiBJdCBpcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLgorICovCitwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHJlZmVyZW5jZVR5cGUoKSB7CisJcmV0dXJuICgoQ2xhc3NTY29wZSkgdGhpcy5wYXJlbnQpLnJlZmVyZW5jZUNvbnRleHQ7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEKaW5kZXggNzM3ZDhkOS4uYWNlZDZhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RWZXJpZmllci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDExICs3LDExIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJlbmphbWluIE11c2thbGxhIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjM5MDY2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKQEAgLTM1LDcgKzM1LDcgQEAKIAkJLSBleHRlbmRpbmcgYSBmaW5hbCBjbGFzcwogCQktIGV4dGVuZGluZyBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzCiAJCS0gaW1wbGVtZW50aW5nIGEgY2xhc3MgaW5zdGVhZCBvZiBhbiBpbnRlcmZhY2UKLQkJLSBpbXBsZW1lbnRpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIG1vcmUgdGhhbiBvbmNlIChpZS4gZHVwbGljYXRlIGludGVyZmFjZXMpCisJCS0gaW1wbGVtZW50aW5nIHRoZSBzYW1lIGludGVyZmFjZSBtb3JlIHRoYW4gb25jZSAoaS5lLiBkdXBsaWNhdGUgaW50ZXJmYWNlcykKIAktIHdpdGggbmVzdGVkIHR5cGVzOgogCQktIHNoYWRvd2luZyBhbiBlbmNsb3NpbmcgdHlwZSdzIHNvdXJjZSBuYW1lCiAJCS0gZGVmaW5pbmcgYSBzdGF0aWMgY2xhc3Mgb3IgaW50ZXJmYWNlIGluc2lkZSBhIG5vbi1zdGF0aWMgbmVzdGVkIGNsYXNzCkBAIC01MSw3ICs1MSw3IEBACiAJCQkmJiBlbnZpcm9ubWVudC5nbG9iYWxPcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKIH0KIGJvb2xlYW4gYXJlTWV0aG9kc0NvbXBhdGlibGUoTWV0aG9kQmluZGluZyBvbmUsIE1ldGhvZEJpbmRpbmcgdHdvKSB7Ci0JcmV0dXJuIGRvZXNNZXRob2RPdmVycmlkZShvbmUsIHR3bykgJiYgYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlKG9uZSwgdHdvKTsKKwlyZXR1cm4gaXNQYXJhbWV0ZXJTdWJzaWduYXR1cmUob25lLCB0d28pICYmIGFyZVJldHVyblR5cGVzQ29tcGF0aWJsZShvbmUsIHR3byk7CiB9CiBib29sZWFuIGFyZVBhcmFtZXRlcnNFcXVhbChNZXRob2RCaW5kaW5nIG9uZSwgTWV0aG9kQmluZGluZyB0d28pIHsKIAlUeXBlQmluZGluZ1tdIG9uZUFyZ3MgPSBvbmUucGFyYW1ldGVyczsKQEAgLTY5LDcgKzY5LDcgQEAKIAlpZiAob25lLnJldHVyblR5cGUgPT0gdHdvLnJldHVyblR5cGUpIHJldHVybiB0cnVlOwogCiAJaWYgKGFyZVR5cGVzRXF1YWwob25lLnJldHVyblR5cGUsIHR3by5yZXR1cm5UeXBlKSkgcmV0dXJuIHRydWU7Ci0JCisKIAkvLyB3aGVuIHNvdXJjZUxldmVsIDwgMS41IGJ1dCBjb21wbGlhbmNlID49IDEuNSwgYWxsb3cgcmV0dXJuIHR5cGVzIGluIGJpbmFyaWVzIHRvIGJlIGNvbXBhdGlibGUgaW5zdGVhZCBvZiBqdXN0IGVxdWFsCiAJaWYgKHRoaXMuYWxsb3dDb21wYXRpYmxlUmV0dXJuVHlwZXMgJiYKIAkJCW9uZS5kZWNsYXJpbmdDbGFzcyBpbnN0YW5jZW9mIEJpbmFyeVR5cGVCaW5kaW5nICYmCkBAIC04MiwyNSArODIsMTAgQEAKIAkvLyBzaG9ydCBpcyBjb21wYXRpYmxlIHdpdGggaW50LCBidXQgYXMgZmFyIGFzIGNvdmFyaWFuY2UgaXMgY29uY2VybmVkLCBpdHMgbm90CiAJaWYgKG9uZS5yZXR1cm5UeXBlLmlzQmFzZVR5cGUoKSkgcmV0dXJuIGZhbHNlOwogCi0JaWYgKCFvbmUuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotCQlpZiAob25lLmRlY2xhcmluZ0NsYXNzLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkKLQkJCXJldHVybiB0d28ucmV0dXJuVHlwZS5pc0NvbXBhdGlibGVXaXRoKG9uZS5yZXR1cm5UeXBlKTsgLy8gaW50ZXJmYWNlIG1ldGhvZHMgaW5oZXJpdCBmcm9tIE9iamVjdAotCQlyZXR1cm4gb25lLnJldHVyblR5cGUuaXNDb21wYXRpYmxlV2l0aCh0d28ucmV0dXJuVHlwZSk7Ci0JfQorCWlmICghb25lLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkgJiYgb25lLmRlY2xhcmluZ0NsYXNzLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkKKwkJcmV0dXJuIHR3by5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgob25lLnJldHVyblR5cGUpOyAvLyBpbnRlcmZhY2UgbWV0aG9kcyBpbmhlcml0IGZyb20gT2JqZWN0CiAKLQkvLyBjaGVjayBmb3IgbWV0aG9kcyBmcm9tIE9iamVjdCwgZXZlcnkgaW50ZXJmYWNlIGluaGVyaXRzIGZyb20gT2JqZWN0Ci0JaWYgKHR3by5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpCi0JCXJldHVybiBvbmUucmV0dXJuVHlwZS5pc0NvbXBhdGlibGVXaXRoKHR3by5yZXR1cm5UeXBlKTsKLQotCS8vIGJvdGggYXJlIGludGVyZmFjZXMsIHNlZSBpZiB0aGV5J3JlIHJlbGF0ZWQKLQlpZiAob25lLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UodHdvLmRlY2xhcmluZ0NsYXNzLCB0cnVlKSkKLQkJcmV0dXJuIG9uZS5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgodHdvLnJldHVyblR5cGUpOwotCWlmICh0d28uZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShvbmUuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQotCQlyZXR1cm4gdHdvLnJldHVyblR5cGUuaXNDb21wYXRpYmxlV2l0aChvbmUucmV0dXJuVHlwZSk7Ci0KLQkvLyB1bnJlbGF0ZWQgaW50ZXJmYWNlcy4uLiBvbmUgbXVzdCBiZSBhIHN1YnR5cGUgb2YgdGhlIG90aGVyCi0JcmV0dXJuIG9uZS5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgodHdvLnJldHVyblR5cGUpCi0JCXx8IHR3by5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgob25lLnJldHVyblR5cGUpOworCXJldHVybiBvbmUucmV0dXJuVHlwZS5pc0NvbXBhdGlibGVXaXRoKHR3by5yZXR1cm5UeXBlKTsKIH0KIGJvb2xlYW4gYXJlVHlwZXNFcXVhbChUeXBlQmluZGluZyBvbmUsIFR5cGVCaW5kaW5nIHR3bykgewogCWlmIChvbmUgPT0gdHdvKSByZXR1cm4gdHJ1ZTsKQEAgLTE0MCw3ICsxMjUsNyBAQAogCQlwcm9ibGVtUmVwb3J0ZXIoKS5hbm5vdGF0aW9uQ2Fubm90T3ZlcnJpZGVNZXRob2QoY3VycmVudE1ldGhvZCwgbWV0aG9kc1tsZW5ndGggLSAxXSk7CiAJCXJldHVybjsgLy8gZG8gbm90IHJlcG9vcnQgYWdhaW5zdCBzdWJzZXF1ZW50IGluaGVyaXRlZCBtZXRob2RzCiAJfQotCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gdHlwZS5zY29wZS5jb21waWxlck9wdGlvbnMoKTsKKwlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IHRoaXMudHlwZS5zY29wZS5jb21waWxlck9wdGlvbnMoKTsKIAkvLyBuZWVkIHRvIGZpbmQgdGhlIG92ZXJyaWRkZW4gbWV0aG9kcyB0byBhdm9pZCBibGFtaW5nIHRoaXMgdHlwZSBmb3IgaXNzdWVzIHdoaWNoIGFyZSBhbHJlYWR5IHJlcG9ydGVkIGFnYWluc3QgYSBzdXBlcnR5cGUKIAkvLyBidXQgY2Fubm90IGlnbm9yZSBhbiBvdmVycmlkZGVuIGluaGVyaXRlZCBtZXRob2QgY29tcGxldGVseSB3aGVuIGl0IGNvbWVzIHRvIGNoZWNraW5nIGZvciBicmlkZ2UgbWV0aG9kcwogCWludFtdIG92ZXJyaWRkZW5Jbmhlcml0ZWRNZXRob2RzID0gbGVuZ3RoID4gMSA/IGZpbmRPdmVycmlkZGVuSW5oZXJpdGVkTWV0aG9kcyhtZXRob2RzLCBsZW5ndGgpIDogbnVsbDsKQEAgLTE2MywyMCArMTQ4LDI2IEBACiAvLwkJCWlmICghY3VycmVudE1ldGhvZC5pc0Fic3RyYWN0KCkgJiYgaW5oZXJpdGVkTWV0aG9kLmlzQWJzdHJhY3QoKSkgewogLy8JCQkJaWYgKChjdXJyZW50TWV0aG9kLm1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmcpID09IDApCiAvLwkJCQkJY3VycmVudE1ldGhvZC5tb2RpZmllcnMgfD0gQ29tcGlsZXJNb2RpZmllcnMuQWNjSW1wbGVtZW50aW5nOwotCQkJfSBlbHNlIHsKKwkJCX0gZWxzZSBpZiAoaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkgfHwgIXRoaXMudHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQkJLy8gaW50ZXJmYWNlIEkgeyBAT3ZlcnJpZGUgT2JqZWN0IGNsb25lKCk7IH0gZG9lcyBub3Qgb3ZlcnJpZGUgT2JqZWN0I2Nsb25lKCkKIAkJCQljdXJyZW50TWV0aG9kLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY092ZXJyaWRpbmc7CiAJCQl9Ci0JCi0JCQlpZiAoIWFyZVJldHVyblR5cGVzQ29tcGF0aWJsZShjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpKQorCisJCQlpZiAoIWFyZVJldHVyblR5cGVzQ29tcGF0aWJsZShjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpCisJCQkJCSYmIChjdXJyZW50TWV0aG9kLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApIHsKIAkJCQlpZiAocmVwb3J0SW5jb21wYXRpYmxlUmV0dXJuVHlwZUVycm9yKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkpCiAJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCisJCQl9CisJCQlyZXBvcnRSYXdSZWZlcmVuY2VzKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7IC8vIGlmIHRoZXkgd2VyZSBkZWZlcnJlZCwgZW1pdCB0aGVtIG5vdy4KIAkJCWlmIChjdXJyZW50TWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgIT0gQmluZGluZy5OT19FWENFUFRJT05TKQogCQkJCWNoZWNrRXhjZXB0aW9ucyhjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOwogCQkJaWYgKGluaGVyaXRlZE1ldGhvZC5pc0ZpbmFsKCkpCiAJCQkJcHJvYmxlbVJlcG9ydGVyKGN1cnJlbnRNZXRob2QpLmZpbmFsTWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7CiAJCQlpZiAoIWlzQXNWaXNpYmxlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkpCiAJCQkJcHJvYmxlbVJlcG9ydGVyKGN1cnJlbnRNZXRob2QpLnZpc2liaWxpdHlDb25mbGljdChjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOworCQkJaWYoaW5oZXJpdGVkTWV0aG9kLmlzU3luY2hyb25pemVkKCkgJiYgIWN1cnJlbnRNZXRob2QuaXNTeW5jaHJvbml6ZWQoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2QoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKKwkJCX0KIAkJCWlmIChvcHRpb25zLnJlcG9ydERlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kICYmIGluaGVyaXRlZE1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSB7CiAJCQkJaWYgKCFjdXJyZW50TWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgfHwgb3B0aW9ucy5yZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlKSB7CiAJCQkJCS8vIGNoZWNrIGFnYWluc3QgdGhlIG90aGVyIGluaGVyaXRlZCBtZXRob2RzIHRvIHNlZSBpZiB0aGV5IGhpZGUgdGhpcyBpbmhlcml0ZWRNZXRob2QKQEAgLTE4NSw3ICsxNzYsNyBAQAogCQkJCQkJZm9yIChpbnQgaiA9IGxlbmd0aDsgLS1qID49IDA7KQogCQkJCQkJCWlmIChpICE9IGogJiYgbWV0aG9kc1tqXS5kZWNsYXJpbmdDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKGRlY2xhcmluZ0NsYXNzLCBmYWxzZSkpCiAJCQkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCisKIAkJCQkJcHJvYmxlbVJlcG9ydGVyKGN1cnJlbnRNZXRob2QpLm92ZXJyaWRlc0RlcHJlY2F0ZWRNZXRob2QoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKIAkJCQl9CiAJCQl9CkBAIC0xOTMsMTEgKzE4NCwxNSBAQAogCQljaGVja0ZvckJyaWRnZU1ldGhvZChjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QsIGFsbEluaGVyaXRlZE1ldGhvZHMpOwogCX0KIH0KKworcHVibGljIHZvaWQgcmVwb3J0UmF3UmVmZXJlbmNlcyhNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJLy8gbm90aGluZyB0byBkbyBoZXJlLiBSZWFsIGFjdGlvbiBoYXBwZW5zIGF0IDEuNSsKK30KIHZvaWQgY2hlY2tDb25jcmV0ZUluaGVyaXRlZE1ldGhvZChNZXRob2RCaW5kaW5nIGNvbmNyZXRlTWV0aG9kLCBNZXRob2RCaW5kaW5nW10gYWJzdHJhY3RNZXRob2RzKSB7CiAJLy8gUmVtZW1iZXIgdGhhdCBpbnRlcmZhY2VzIGNhbiBvbmx5IGRlZmluZSBwdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwogCWlmIChjb25jcmV0ZU1ldGhvZC5pc1N0YXRpYygpKQogCQkvLyBDYW5ub3QgaW5oZXJpdCBhIHN0YXRpYyBtZXRob2Qgd2hpY2ggaXMgc3BlY2lmaWVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCBieSBhbiBpbnRlcmZhY2UKLQkJcHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljSW5oZXJpdGVkTWV0aG9kQ29uZmxpY3RzKHR5cGUsIGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZHMpOwkKKwkJcHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljSW5oZXJpdGVkTWV0aG9kQ29uZmxpY3RzKHRoaXMudHlwZSwgY29uY3JldGVNZXRob2QsIGFic3RyYWN0TWV0aG9kcyk7CiAJaWYgKCFjb25jcmV0ZU1ldGhvZC5pc1B1YmxpYygpKSB7CiAJCWludCBpbmRleCA9IDAsIGxlbmd0aCA9IGFic3RyYWN0TWV0aG9kcy5sZW5ndGg7CiAJCWlmIChjb25jcmV0ZU1ldGhvZC5pc1Byb3RlY3RlZCgpKSB7CkBAIC0yMDgsMTIgKzIwMywxOCBAQAogCQkJCWlmICghYWJzdHJhY3RNZXRob2RzW2luZGV4XS5pc0RlZmF1bHQoKSkgYnJlYWs7CiAJCX0KIAkJaWYgKGluZGV4IDwgbGVuZ3RoKQotCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW5oZXJpdGVkTWV0aG9kUmVkdWNlc1Zpc2liaWxpdHkodHlwZSwgY29uY3JldGVNZXRob2QsIGFic3RyYWN0TWV0aG9kcyk7CisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbmhlcml0ZWRNZXRob2RSZWR1Y2VzVmlzaWJpbGl0eSh0aGlzLnR5cGUsIGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZHMpOwogCX0KIAlpZiAoY29uY3JldGVNZXRob2QudGhyb3duRXhjZXB0aW9ucyAhPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlMpCiAJCWZvciAoaW50IGkgPSBhYnN0cmFjdE1ldGhvZHMubGVuZ3RoOyAtLWkgPj0gMDspCiAJCQljaGVja0V4Y2VwdGlvbnMoY29uY3JldGVNZXRob2QsIGFic3RyYWN0TWV0aG9kc1tpXSk7CisKKwkvLyBBIHN1YmNsYXNzIGluaGVyaXRpbmcgdGhpcyBtZXRob2QgYW5kIHB1dHRpbmcgaXQgdXAgYXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIG1lZXQgaXRzIG93bgorCS8vIG9ibGlnYXRpb25zIHNob3VsZCBxdWFsaWZ5IGFzIGEgdXNlLgorCWlmIChjb25jcmV0ZU1ldGhvZC5pc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlKCkpCisJCWNvbmNyZXRlTWV0aG9kLm9yaWdpbmFsKCkubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CiB9CisKIC8qCiAiOC40LjQiCiBWZXJpZnkgdGhhdCBuZXdFeGNlcHRpb25zIGFyZSBhbGwgaW5jbHVkZWQgaW4gaW5oZXJpdGVkRXhjZXB0aW9ucy4KQEAgLTIyOCw4NiArMjI5LDIwNiBAQAogCQlpbnQgaiA9IGluaGVyaXRlZEV4Y2VwdGlvbnMubGVuZ3RoOwogCQl3aGlsZSAoLS1qID4gLTEgJiYgIWlzU2FtZUNsYXNzT3JTdWJjbGFzc09mKG5ld0V4Y2VwdGlvbiwgaW5oZXJpdGVkRXhjZXB0aW9uc1tqXSkpey8qZW1wdHkqL30KIAkJaWYgKGogPT0gLTEpCi0JCQlpZiAoIW5ld0V4Y2VwdGlvbi5pc1VuY2hlY2tlZEV4Y2VwdGlvbihmYWxzZSkpCisJCQlpZiAoIW5ld0V4Y2VwdGlvbi5pc1VuY2hlY2tlZEV4Y2VwdGlvbihmYWxzZSkKKwkJCQkJJiYgKG5ld0V4Y2VwdGlvbi50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgPT0gMCkgewogCQkJCXByb2JsZW1SZXBvcnRlcihuZXdNZXRob2QpLmluY29tcGF0aWJsZUV4Y2VwdGlvbkluVGhyb3dzQ2xhdXNlKHRoaXMudHlwZSwgbmV3TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QsIG5ld0V4Y2VwdGlvbik7CisJCQl9CiAJfQogfQorCiB2b2lkIGNoZWNrRm9yQnJpZGdlTWV0aG9kKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QsIE1ldGhvZEJpbmRpbmdbXSBhbGxJbmhlcml0ZWRNZXRob2RzKSB7CiAJLy8gbm8gb3AgYmVmb3JlIDEuNQogfQotdm9pZCBjaGVja0luaGVyaXRlZE1ldGhvZHMoTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKLQlpZiAobGVuZ3RoID4gMSkgewotCQlpbnRbXSBvdmVycmlkZGVuSW5oZXJpdGVkTWV0aG9kcyA9IGZpbmRPdmVycmlkZGVuSW5oZXJpdGVkTWV0aG9kcyhtZXRob2RzLCBsZW5ndGgpOwotCQlpZiAob3ZlcnJpZGRlbkluaGVyaXRlZE1ldGhvZHMgIT0gbnVsbCkgewotCQkJLy8gZGV0ZWN0ZWQgc29tZSBvdmVycmlkZGVuIG1ldGhvZHMgdGhhdCBjYW4gYmUgaWdub3JlZCB3aGVuIGNoZWNraW5nIHJldHVybiB0eXBlcwotCQkJLy8gYnV0IGNhbm5vdCBpZ25vcmUgYW4gb3ZlcnJpZGRlbiBpbmhlcml0ZWQgbWV0aG9kIGNvbXBsZXRlbHkgd2hlbiBpdCBjb21lcyB0byBjaGVja2luZyBmb3IgYnJpZGdlIG1ldGhvZHMKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlNZXRob2RCaW5kaW5nW10gY2xvc2VzdE1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlpZiAob3ZlcnJpZGRlbkluaGVyaXRlZE1ldGhvZHNbaV0gPT0gMCkKLQkJCQkJY2xvc2VzdE1ldGhvZHNbaW5kZXgrK10gPSBtZXRob2RzW2ldOwotCQkJaWYgKGluZGV4ID4gMSAmJiAhY2hlY2tJbmhlcml0ZWRSZXR1cm5UeXBlcyhjbG9zZXN0TWV0aG9kcywgaW5kZXgpKQotCQkJCXJldHVybjsKLQkJfSBlbHNlIGlmICghY2hlY2tJbmhlcml0ZWRSZXR1cm5UeXBlcyhtZXRob2RzLCBsZW5ndGgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CiAKLQlNZXRob2RCaW5kaW5nIGNvbmNyZXRlTWV0aG9kID0gbnVsbDsKLQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSkgeyAgLy8gaWdub3JlIGNvbmNyZXRlIG1ldGhvZHMgZm9yIGludGVyZmFjZXMKLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7ICAvLyBSZW1lbWJlciB0aGF0IG9ubHkgb25lIG9mIHRoZSBtZXRob2RzIGNhbiBiZSBub24tYWJzdHJhY3QKLQkJCWlmICghbWV0aG9kc1tpXS5pc0Fic3RyYWN0KCkpIHsKLQkJCQljb25jcmV0ZU1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KK3ZvaWQgY2hlY2tGb3JNaXNzaW5nSGFzaENvZGVNZXRob2QoKSB7CisJTWV0aG9kQmluZGluZ1tdIGNob2ljZXMgPSB0aGlzLnR5cGUuZ2V0TWV0aG9kcyhUeXBlQ29uc3RhbnRzLkVRVUFMUyk7CisJYm9vbGVhbiBvdmVycmlkZXNFcXVhbHMgPSBmYWxzZTsKKwlmb3IgKGludCBpID0gY2hvaWNlcy5sZW5ndGg7ICFvdmVycmlkZXNFcXVhbHMgJiYgLS1pID49IDA7KQorCQlvdmVycmlkZXNFcXVhbHMgPSBjaG9pY2VzW2ldLnBhcmFtZXRlcnMubGVuZ3RoID09IDEgJiYgY2hvaWNlc1tpXS5wYXJhbWV0ZXJzWzBdLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdDsKKwlpZiAob3ZlcnJpZGVzRXF1YWxzKSB7CisJCU1ldGhvZEJpbmRpbmcgaGFzaENvZGVNZXRob2QgPSB0aGlzLnR5cGUuZ2V0RXhhY3RNZXRob2QoVHlwZUNvbnN0YW50cy5IQVNIQ09ERSwgQmluZGluZy5OT19QQVJBTUVURVJTLCBudWxsKTsKKwkJaWYgKGhhc2hDb2RlTWV0aG9kICE9IG51bGwgJiYgaGFzaENvZGVNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KQorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5zaG91bGRJbXBsZW1lbnRIYXNoY29kZSh0aGlzLnR5cGUpOwogCX0KLQlpZiAoY29uY3JldGVNZXRob2QgPT0gbnVsbCkgewotCQlpZiAoIXRoaXMudHlwZS5pc0Fic3RyYWN0KCkpIHsKLQkJCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+PSAwOykgewotCQkJCWlmIChtdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2QobWV0aG9kc1tpXS5kZWNsYXJpbmdDbGFzcykpIHsKLQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQkJCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1pc3NpbmdBYnN0cmFjdE1ldGhvZCA9IHR5cGVEZWNsYXJhdGlvbi5hZGRNaXNzaW5nQWJzdHJhY3RNZXRob2RGb3IobWV0aG9kc1swXSk7Ci0JCQkJCQltaXNzaW5nQWJzdHJhY3RNZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOworfQorCit2b2lkIGNoZWNrRm9yUmVkdW5kYW50U3VwZXJpbnRlcmZhY2VzKFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcywgUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcykgeworCWlmIChzdXBlckludGVyZmFjZXMgPT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHJldHVybjsKKworCVNpbXBsZVNldCBpbnRlcmZhY2VzVG9DaGVjayA9IG5ldyBTaW1wbGVTZXQoc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCk7CisJU2ltcGxlU2V0IHJlZHVuZGFudEludGVyZmFjZXMgPSBudWxsOyAgLy8gYmFyayBidXQgb25jZS4KKwlmb3IgKGludCBpID0gMCwgbCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJUmVmZXJlbmNlQmluZGluZyB0b0NoZWNrID0gc3VwZXJJbnRlcmZhY2VzW2ldOworCQlmb3IgKGludCBqID0gMDsgaiA8IGw7IGorKykgeworCQkJUmVmZXJlbmNlQmluZGluZyBpbXBsZW1lbnRlZEludGVyZmFjZSA9IHN1cGVySW50ZXJmYWNlc1tqXTsKKwkJCWlmIChpICE9IGogJiYgdG9DaGVjay5pbXBsZW1lbnRzSW50ZXJmYWNlKGltcGxlbWVudGVkSW50ZXJmYWNlLCB0cnVlKSkgeworCQkJCWlmIChyZWR1bmRhbnRJbnRlcmZhY2VzID09IG51bGwpIHsKKwkJCQkJcmVkdW5kYW50SW50ZXJmYWNlcyA9IG5ldyBTaW1wbGVTZXQoMyk7CisJCQkJfSBlbHNlIGlmIChyZWR1bmRhbnRJbnRlcmZhY2VzLmluY2x1ZGVzKGltcGxlbWVudGVkSW50ZXJmYWNlKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmVkdW5kYW50SW50ZXJmYWNlcy5hZGQoaW1wbGVtZW50ZWRJbnRlcmZhY2UpOworCQkJCVR5cGVSZWZlcmVuY2VbXSByZWZzID0gdGhpcy50eXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzOworCQkJCWZvciAoaW50IHIgPSAwLCBybCA9IHJlZnMubGVuZ3RoOyByIDwgcmw7IHIrKykgeworCQkJCQlpZiAocmVmc1tyXS5yZXNvbHZlZFR5cGUgPT0gdG9DaGVjaykgeworCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkucmVkdW5kYW50U3VwZXJJbnRlcmZhY2UodGhpcy50eXBlLCByZWZzW2pdLCBpbXBsZW1lbnRlZEludGVyZmFjZSwgdG9DaGVjayk7CisJCQkJCQlicmVhazsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDkxMQogCQkJCQl9Ci0JCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CiAJCX0KKwkJaW50ZXJmYWNlc1RvQ2hlY2suYWRkKHRvQ2hlY2spOworCX0KKworCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gbnVsbDsKKwlTaW1wbGVTZXQgaW5oZXJpdGVkSW50ZXJmYWNlcyA9IG5ldyBTaW1wbGVTZXQoNSk7CisJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUgPSBzdXBlcmNsYXNzOworCXdoaWxlIChzdXBlclR5cGUgIT0gbnVsbCAmJiBzdXBlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQlpZiAoKGl0c0ludGVyZmFjZXMgPSBzdXBlclR5cGUuc3VwZXJJbnRlcmZhY2VzKCkpICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQlmb3IgKGludCBpID0gMCwgbCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBpbmhlcml0ZWRJbnRlcmZhY2UgPSBpdHNJbnRlcmZhY2VzW2ldOworCQkJCWlmICghaW5oZXJpdGVkSW50ZXJmYWNlcy5pbmNsdWRlcyhpbmhlcml0ZWRJbnRlcmZhY2UpICYmIGluaGVyaXRlZEludGVyZmFjZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCWlmIChpbnRlcmZhY2VzVG9DaGVjay5pbmNsdWRlcyhpbmhlcml0ZWRJbnRlcmZhY2UpKSB7CisJCQkJCQlpZiAocmVkdW5kYW50SW50ZXJmYWNlcyA9PSBudWxsKSB7CisJCQkJCQkJcmVkdW5kYW50SW50ZXJmYWNlcyA9IG5ldyBTaW1wbGVTZXQoMyk7CisJCQkJCQl9IGVsc2UgaWYgKHJlZHVuZGFudEludGVyZmFjZXMuaW5jbHVkZXMoaW5oZXJpdGVkSW50ZXJmYWNlKSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJcmVkdW5kYW50SW50ZXJmYWNlcy5hZGQoaW5oZXJpdGVkSW50ZXJmYWNlKTsKKwkJCQkJCVR5cGVSZWZlcmVuY2VbXSByZWZzID0gdGhpcy50eXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzOworCQkJCQkJZm9yIChpbnQgciA9IDAsIHJsID0gcmVmcy5sZW5ndGg7IHIgPCBybDsgcisrKSB7CisJCQkJCQkJaWYgKHJlZnNbcl0ucmVzb2x2ZWRUeXBlID09IGluaGVyaXRlZEludGVyZmFjZSkgeworCQkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5yZWR1bmRhbnRTdXBlckludGVyZmFjZSh0aGlzLnR5cGUsIHJlZnNbcl0sIGluaGVyaXRlZEludGVyZmFjZSwgc3VwZXJUeXBlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaW5oZXJpdGVkSW50ZXJmYWNlcy5hZGQoaW5oZXJpdGVkSW50ZXJmYWNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlzdXBlclR5cGUgPSBzdXBlclR5cGUuc3VwZXJjbGFzcygpOworCX0KKworCWludCBuZXh0UG9zaXRpb24gPSBpbmhlcml0ZWRJbnRlcmZhY2VzLmVsZW1lbnRTaXplOworCWlmIChuZXh0UG9zaXRpb24gPT0gMCkgcmV0dXJuOworCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbl07CisJaW5oZXJpdGVkSW50ZXJmYWNlcy5hc0FycmF5KGludGVyZmFjZXNUb1Zpc2l0KTsKKwlmb3IgKGludCBpID0gMDsgaSA8IG5leHRQb3NpdGlvbjsgaSsrKSB7CisJCXN1cGVyVHlwZSA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCQlpZiAoKGl0c0ludGVyZmFjZXMgPSBzdXBlclR5cGUuc3VwZXJJbnRlcmZhY2VzKCkpICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQlpZiAobmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoID49IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOworCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBpdHNMZW5ndGg7IGErKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgaW5oZXJpdGVkSW50ZXJmYWNlID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQlpZiAoIWluaGVyaXRlZEludGVyZmFjZXMuaW5jbHVkZXMoaW5oZXJpdGVkSW50ZXJmYWNlKSAmJiBpbmhlcml0ZWRJbnRlcmZhY2UuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlpZiAoaW50ZXJmYWNlc1RvQ2hlY2suaW5jbHVkZXMoaW5oZXJpdGVkSW50ZXJmYWNlKSkgeworCQkJCQkJaWYgKHJlZHVuZGFudEludGVyZmFjZXMgPT0gbnVsbCkgeworCQkJCQkJCXJlZHVuZGFudEludGVyZmFjZXMgPSBuZXcgU2ltcGxlU2V0KDMpOworCQkJCQkJfSBlbHNlIGlmIChyZWR1bmRhbnRJbnRlcmZhY2VzLmluY2x1ZGVzKGluaGVyaXRlZEludGVyZmFjZSkpIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCXJlZHVuZGFudEludGVyZmFjZXMuYWRkKGluaGVyaXRlZEludGVyZmFjZSk7CisJCQkJCQlUeXBlUmVmZXJlbmNlW10gcmVmcyA9IHRoaXMudHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0LnN1cGVySW50ZXJmYWNlczsKKwkJCQkJCWZvciAoaW50IHIgPSAwLCBybCA9IHJlZnMubGVuZ3RoOyByIDwgcmw7IHIrKykgeworCQkJCQkJCWlmIChyZWZzW3JdLnJlc29sdmVkVHlwZSA9PSBpbmhlcml0ZWRJbnRlcmZhY2UpIHsKKwkJCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkucmVkdW5kYW50U3VwZXJJbnRlcmZhY2UodGhpcy50eXBlLCByZWZzW3JdLCBpbmhlcml0ZWRJbnRlcmZhY2UsIHN1cGVyVHlwZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWluaGVyaXRlZEludGVyZmFjZXMuYWRkKGluaGVyaXRlZEludGVyZmFjZSk7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBpbmhlcml0ZWRJbnRlcmZhY2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgY2hlY2tJbmhlcml0ZWRNZXRob2RzKE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLCBpbnQgbGVuZ3RoKSB7CisJLyoKKwkxLiBmaW5kIGNvbmNyZXRlIG1ldGhvZAorCTIuIGlmIGl0IGRvZXNuJ3QgZXhpc3QgdGhlbiBmaW5kIGZpcnN0IGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2Qgd2hvc2UgcmV0dXJuIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlcnMKKwkgICBpZiBubyBzdWNoIG1ldGhvZCBleGlzdHMgdGhlbiByZXBvcnQgaW5jb21wYXRpYmxlIHJldHVybiB0eXBlIGVycm9yCisJICAgb3RoZXJ3aXNlIHJlcG9ydCBhYnN0cmFjdCBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZAorCTMuIGlmIGNvbmNyZXRlIG1ldGhvZCBleGlzdHMsIGNoZWNrIHRvIHNlZSBpZiBpdHMgcmV0dXJuIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlcnMKKwkgICBpZiBpdCBpcyB0aGVuIGNoZWNrIGNvbmNyZXRlIG1ldGhvZCBhZ2FpbnN0IGFic3RyYWN0IG1ldGhvZHMKKwkgICBpZiBpdHMgbm90LCB0aGVuIGZpbmQgbW9zdCBzcGVjaWZpYyBhYnN0cmFjdCBtZXRob2QgJiByZXBvcnQgYWJzdHJhY3QgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgc2luY2UgY29uY3JldGUgbWV0aG9kIGlzIGluc3VmZmljaWVudAorCSAgIGlmIG5vIG1vc3Qgc3BlY2lmaWMgcmV0dXJuIHR5cGUgYWJzdHJhY3QgbWV0aG9kIGV4aXN0cywgdGhlbiByZXBvcnQgaW5jb21wYXRpYmxlIHJldHVybiB0eXBlIHdpdGggYWxsIGluaGVyaXRlZCBtZXRob2RzIAorCSovCisKKwlNZXRob2RCaW5kaW5nIGNvbmNyZXRlTWV0aG9kID0gdGhpcy50eXBlLmlzSW50ZXJmYWNlKCkgfHwgbWV0aG9kc1swXS5pc0Fic3RyYWN0KCkgPyBudWxsIDogbWV0aG9kc1swXTsKKwlpZiAoY29uY3JldGVNZXRob2QgPT0gbnVsbCkgeworCQlNZXRob2RCaW5kaW5nIGJlc3RBYnN0cmFjdE1ldGhvZCA9IGxlbmd0aCA9PSAxID8gbWV0aG9kc1swXSA6IGZpbmRCZXN0SW5oZXJpdGVkQWJzdHJhY3RNZXRob2QobWV0aG9kcywgbGVuZ3RoKTsKKwkJYm9vbGVhbiBub01hdGNoID0gYmVzdEFic3RyYWN0TWV0aG9kID09IG51bGw7CisJCWlmIChub01hdGNoKQorCQkJYmVzdEFic3RyYWN0TWV0aG9kID0gbWV0aG9kc1swXTsKKwkJaWYgKG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZChiZXN0QWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MpKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdGhpcy50eXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQlNZXRob2RCaW5kaW5nIHN1cGVyY2xhc3NBYnN0cmFjdE1ldGhvZCA9IG1ldGhvZHNbMF07CisJCQlpZiAoc3VwZXJjbGFzc0Fic3RyYWN0TWV0aG9kID09IGJlc3RBYnN0cmFjdE1ldGhvZCB8fCBzdXBlcmNsYXNzQWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtaXNzaW5nQWJzdHJhY3RNZXRob2QgPSB0eXBlRGVjbGFyYXRpb24uYWRkTWlzc2luZ0Fic3RyYWN0TWV0aG9kRm9yKGJlc3RBYnN0cmFjdE1ldGhvZCk7CisJCQkJCW1pc3NpbmdBYnN0cmFjdE1ldGhvZC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKHRoaXMudHlwZSwgYmVzdEFic3RyYWN0TWV0aG9kKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKHRoaXMudHlwZSwgYmVzdEFic3RyYWN0TWV0aG9kKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtaXNzaW5nQWJzdHJhY3RNZXRob2QgPSB0eXBlRGVjbGFyYXRpb24uYWRkTWlzc2luZ0Fic3RyYWN0TWV0aG9kRm9yKGJlc3RBYnN0cmFjdE1ldGhvZCk7CisJCQkJCW1pc3NpbmdBYnN0cmFjdE1ldGhvZC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKHRoaXMudHlwZSwgYmVzdEFic3RyYWN0TWV0aG9kLCBzdXBlcmNsYXNzQWJzdHJhY3RNZXRob2QpOworCQkJCX0gZWxzZSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQodGhpcy50eXBlLCBiZXN0QWJzdHJhY3RNZXRob2QsIHN1cGVyY2xhc3NBYnN0cmFjdE1ldGhvZCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG5vTWF0Y2gpIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZHNIYXZlSW5jb21wYXRpYmxlUmV0dXJuVHlwZXModGhpcy50eXBlLCBtZXRob2RzLCBsZW5ndGgpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGxlbmd0aCA8IDIpIHJldHVybjsgLy8gbm90aGluZyBlbHNlIHRvIGNoZWNrCisKKwlpbnQgaW5kZXggPSBsZW5ndGg7CisJd2hpbGUgKC0taW5kZXggPiAwICYmIGNoZWNrSW5oZXJpdGVkUmV0dXJuVHlwZXMoY29uY3JldGVNZXRob2QsIG1ldGhvZHNbaW5kZXhdKSkgey8qZW1wdHkqL30KKwlpZiAoaW5kZXggPiAwKSB7CisJCS8vIGNvbmNyZXRlTWV0aG9kIGlzIG5vdCB0aGUgYmVzdCBtYXRjaAorCQlNZXRob2RCaW5kaW5nIGJlc3RBYnN0cmFjdE1ldGhvZCA9IGZpbmRCZXN0SW5oZXJpdGVkQWJzdHJhY3RNZXRob2QobWV0aG9kcywgbGVuZ3RoKTsKKwkJaWYgKGJlc3RBYnN0cmFjdE1ldGhvZCA9PSBudWxsKQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW5oZXJpdGVkTWV0aG9kc0hhdmVJbmNvbXBhdGlibGVSZXR1cm5UeXBlcyh0aGlzLnR5cGUsIG1ldGhvZHMsIGxlbmd0aCk7CisJCWVsc2UgLy8gY2FuIG9ubHkgaGFwcGVuIGluID49IDEuNSBzaW5jZSByZXR1cm4gdHlwZXMgbXVzdCBiZSBlcXVhbCBwcmlvciB0byAxLjUKKwkJCXByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQodGhpcy50eXBlLCBiZXN0QWJzdHJhY3RNZXRob2QsIGNvbmNyZXRlTWV0aG9kKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChsZW5ndGggPiAxKSB7Ci0JCU1ldGhvZEJpbmRpbmdbXSBhYnN0cmFjdE1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGggLSAxXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KQotCQkJaWYgKG1ldGhvZHNbaV0gIT0gY29uY3JldGVNZXRob2QpCi0JCQkJYWJzdHJhY3RNZXRob2RzW2luZGV4KytdID0gbWV0aG9kc1tpXTsKLQkJY2hlY2tDb25jcmV0ZUluaGVyaXRlZE1ldGhvZChjb25jcmV0ZU1ldGhvZCwgYWJzdHJhY3RNZXRob2RzKTsKLQl9CisJTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aCAtIDFdOworCWluZGV4ID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAobWV0aG9kc1tpXS5pc0Fic3RyYWN0KCkpCisJCQlhYnN0cmFjdE1ldGhvZHNbaW5kZXgrK10gPSBtZXRob2RzW2ldOworCWlmIChpbmRleCA9PSAwKSByZXR1cm47IC8vIGNhbiBoYXBwZW4gd2l0aCBtZXRob2RzIHRoYXQgY29udGFpbiAnZXF1YWwnIE1pc3NpbmcgVHlwZXMsIHNlZSBidWcgMjU3Mzg0CisJaWYgKGluZGV4IDwgYWJzdHJhY3RNZXRob2RzLmxlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weShhYnN0cmFjdE1ldGhvZHMsIDAsIGFic3RyYWN0TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2luZGV4XSwgMCwgaW5kZXgpOworCWNoZWNrQ29uY3JldGVJbmhlcml0ZWRNZXRob2QoY29uY3JldGVNZXRob2QsIGFic3RyYWN0TWV0aG9kcyk7CiB9Ci1ib29sZWFuIGNoZWNrSW5oZXJpdGVkUmV0dXJuVHlwZXMoTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKLQlNZXRob2RCaW5kaW5nIGZpcnN0ID0gbWV0aG9kc1swXTsKLQlpbnQgaW5kZXggPSBsZW5ndGg7Ci0Jd2hpbGUgKC0taW5kZXggPiAwICYmIGFyZVJldHVyblR5cGVzQ29tcGF0aWJsZShmaXJzdCwgbWV0aG9kc1tpbmRleF0pKXsvKmVtcHR5Ki99Ci0JaWYgKGluZGV4ID09IDApIAotCQlyZXR1cm4gdHJ1ZTsKIAotCS8vIEFsbCBpbmhlcml0ZWQgbWV0aG9kcyBkbyBOT1QgaGF2ZSB0aGUgc2FtZSB2bVNpZ25hdHVyZQotCWlmICh0aGlzLnR5cGUuaXNJbnRlcmZhY2UoKSkKLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KQotCQkJaWYgKG1ldGhvZHNbaV0uZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KQotCQkJCXJldHVybiBmYWxzZTsgLy8gZG8gbm90IGNvbXBsYWluIHNpbmNlIHRoZSBzdXBlciBpbnRlcmZhY2UgYWxyZWFkeSBnb3QgYmxhbWVkCi0JcHJvYmxlbVJlcG9ydGVyKCkuaW5oZXJpdGVkTWV0aG9kc0hhdmVJbmNvbXBhdGlibGVSZXR1cm5UeXBlcyh0aGlzLnR5cGUsIG1ldGhvZHMsIGxlbmd0aCk7Citib29sZWFuIGNoZWNrSW5oZXJpdGVkUmV0dXJuVHlwZXMoTWV0aG9kQmluZGluZyBtZXRob2QsIE1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QpIHsKKwlpZiAoYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlKG1ldGhvZCwgb3RoZXJNZXRob2QpKSByZXR1cm4gdHJ1ZTsKKworCWlmICghdGhpcy50eXBlLmlzSW50ZXJmYWNlKCkpCisJCWlmIChtZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNDbGFzcygpIHx8ICF0aGlzLnR5cGUuaW1wbGVtZW50c0ludGVyZmFjZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MsIGZhbHNlKSkKKwkJCWlmIChvdGhlck1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0NsYXNzKCkgfHwgIXRoaXMudHlwZS5pbXBsZW1lbnRzSW50ZXJmYWNlKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzLCBmYWxzZSkpCisJCQkJcmV0dXJuIHRydWU7IC8vIGRvIG5vdCBjb21wbGFpbiBzaW5jZSB0aGUgc3VwZXJjbGFzcyBhbHJlYWR5IGdvdCBibGFtZWQKKwogCXJldHVybiBmYWxzZTsKIH0KKwogLyoKIEZvciBlYWNoIGluaGVyaXRlZCBtZXRob2QgaWRlbnRpZmllciAobWVzc2FnZSBwYXR0ZXJuIC0gdm0gc2lnbmF0dXJlIG1pbnVzIHRoZSByZXR1cm4gdHlwZSkKIAlpZiBjdXJyZW50IG1ldGhvZCBleGlzdHMKLQkJaWYgY3VycmVudCdzIHZtIHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBhbiBpbmhlcml0ZWQgc2lnbmF0dXJlIHRoZW4gY29tcGxhaW4gCisJCWlmIGN1cnJlbnQncyB2bSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggYW4gaW5oZXJpdGVkIHNpZ25hdHVyZSB0aGVuIGNvbXBsYWluCiAJCWVsc2UgY29tcGFyZSBjdXJyZW50J3MgZXhjZXB0aW9ucyAmIHZpc2liaWxpdHkgYWdhaW5zdCBlYWNoIGluaGVyaXRlZCBtZXRob2QKIAllbHNlCiAJCWlmIGluaGVyaXRlZCBtZXRob2RzID0gMQpAQCAtMzI1LDE1ICs0NDYsMjYgQEAKIHZvaWQgY2hlY2tNZXRob2RzKCkgewogCWJvb2xlYW4gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyA9IG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKTsKIAlib29sZWFuIHNraXBJbmhlcml0ZWRNZXRob2RzID0gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyAmJiBjYW5Ta2lwSW5oZXJpdGVkTWV0aG9kcygpOyAvLyBoYXZlIGEgc2luZ2xlIGNvbmNyZXRlIHN1cGVyY2xhc3Mgc28gb25seSBjaGVjayBvdmVycmlkZGVuIG1ldGhvZHMKKwlib29sZWFuIGlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUgPSB0aGlzLnR5cGUuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpOwogCWNoYXJbXVtdIG1ldGhvZFNlbGVjdG9ycyA9IHRoaXMuaW5oZXJpdGVkTWV0aG9kcy5rZXlUYWJsZTsKIAluZXh0U2VsZWN0b3IgOiBmb3IgKGludCBzID0gbWV0aG9kU2VsZWN0b3JzLmxlbmd0aDsgLS1zID49IDA7KSB7CiAJCWlmIChtZXRob2RTZWxlY3RvcnNbc10gPT0gbnVsbCkgY29udGludWUgbmV4dFNlbGVjdG9yOwogCiAJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50ID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5jdXJyZW50TWV0aG9kcy5nZXQobWV0aG9kU2VsZWN0b3JzW3NdKTsKKwkJTWV0aG9kQmluZGluZ1tdIGluaGVyaXRlZCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuaW5oZXJpdGVkTWV0aG9kcy52YWx1ZVRhYmxlW3NdOworCQkKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjY2MCwgaWYgY3VycmVudCB0eXBlIGlzIGV4cG9zZWQsCisJCS8vIGluaGVyaXRlZCBtZXRob2RzIG9mIHN1cGVyIGNsYXNzZXMgYXJlIHRvby4gY3VycmVudCAhPSBudWxsIGNhc2UgaGFuZGxlZCBiZWxvdy4KKwkJaWYgKGN1cnJlbnQgPT0gbnVsbCAmJiAhaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSkgeworCQkJaW50IGxlbmd0aCA9IGluaGVyaXRlZC5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCQlpbmhlcml0ZWRbaV0ub3JpZ2luYWwoKS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKKwkJCX0KKwkJfQorCiAJCWlmIChjdXJyZW50ID09IG51bGwgJiYgc2tpcEluaGVyaXRlZE1ldGhvZHMpCiAJCQljb250aW51ZSBuZXh0U2VsZWN0b3I7CiAKLQkJTWV0aG9kQmluZGluZ1tdIGluaGVyaXRlZCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuaW5oZXJpdGVkTWV0aG9kcy52YWx1ZVRhYmxlW3NdOwogCQlpZiAoaW5oZXJpdGVkLmxlbmd0aCA9PSAxICYmIGN1cnJlbnQgPT0gbnVsbCkgeyAvLyBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlCiAJCQlpZiAobXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyAmJiBpbmhlcml0ZWRbMF0uaXNBYnN0cmFjdCgpKQogCQkJCWNoZWNrQWJzdHJhY3RNZXRob2QoaW5oZXJpdGVkWzBdKTsKQEAgLTM0OCw3ICs0ODAsNyBAQAogCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gaW5oZXJpdGVkLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgewogCQkJCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IGNvbXB1dGVTdWJzdGl0dXRlTWV0aG9kKGluaGVyaXRlZFtqXSwgY3VycmVudE1ldGhvZCk7CiAJCQkJCWlmIChpbmhlcml0ZWRNZXRob2QgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRvZXNNZXRob2RPdmVycmlkZShjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpKSB7CisJCQkJCQlpZiAoaXNQYXJhbWV0ZXJTdWJzaWduYXR1cmUoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkgewogCQkJCQkJCW1hdGNoaW5nSW5oZXJpdGVkWysraW5kZXhdID0gaW5oZXJpdGVkTWV0aG9kOwogCQkJCQkJCWluaGVyaXRlZFtqXSA9IG51bGw7IC8vIGRvIG5vdCB3YW50IHRvIGZpbmQgaXQgYWdhaW4KIAkJCQkJCX0KQEAgLTM2NCw3ICs0OTYsMTEgQEAKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluaGVyaXRlZC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QgPSBpbmhlcml0ZWRbaV07CiAJCQlpZiAoaW5oZXJpdGVkTWV0aG9kID09IG51bGwpIGNvbnRpbnVlOwotCisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2NjYwLCBpZiBjdXJyZW50IHR5cGUgaXMgZXhwb3NlZCwKKwkJCS8vIGluaGVyaXRlZCBtZXRob2RzIG9mIHN1cGVyIGNsYXNzZXMgYXJlIHRvby4gY3VycmVudCA9PSBudWxsIGNhc2UgaGFuZGxlZCBhbHJlYWR5LgorCQkJaWYgKCFpc09yRW5jbG9zZWRCeVByaXZhdGVUeXBlICYmIGN1cnJlbnQgIT0gbnVsbCkgeworCQkJCWluaGVyaXRlZE1ldGhvZC5vcmlnaW5hbCgpLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOworCQkJfQogCQkJbWF0Y2hpbmdJbmhlcml0ZWRbKytpbmRleF0gPSBpbmhlcml0ZWRNZXRob2Q7CiAJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBsZW5ndGg7IGorKykgewogCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJJbmhlcml0ZWRNZXRob2QgPSBpbmhlcml0ZWRbal07CkBAIC0zNzIsNyArNTA4LDcgQEAKIAkJCQkJY29udGludWU7CiAJCQkJb3RoZXJJbmhlcml0ZWRNZXRob2QgPSBjb21wdXRlU3Vic3RpdHV0ZU1ldGhvZChvdGhlckluaGVyaXRlZE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKIAkJCQlpZiAob3RoZXJJbmhlcml0ZWRNZXRob2QgIT0gbnVsbCkgewotCQkJCQlpZiAoZG9lc01ldGhvZE92ZXJyaWRlKGluaGVyaXRlZE1ldGhvZCwgb3RoZXJJbmhlcml0ZWRNZXRob2QpKSB7CisJCQkJCWlmIChpc1BhcmFtZXRlclN1YnNpZ25hdHVyZShpbmhlcml0ZWRNZXRob2QsIG90aGVySW5oZXJpdGVkTWV0aG9kKSkgewogCQkJCQkJbWF0Y2hpbmdJbmhlcml0ZWRbKytpbmRleF0gPSBvdGhlckluaGVyaXRlZE1ldGhvZDsKIAkJCQkJCWluaGVyaXRlZFtqXSA9IG51bGw7IC8vIGRvIG5vdCB3YW50IHRvIGZpbmQgaXQgYWdhaW4KIAkJCQkJfQpAQCAtMzg3LDYgKzUyMyw3IEBACiAJCX0KIAl9CiB9CisKIHZvaWQgY2hlY2tQYWNrYWdlUHJpdmF0ZUFic3RyYWN0TWV0aG9kKE1ldGhvZEJpbmRpbmcgYWJzdHJhY3RNZXRob2QpIHsKIAkvLyBjaGVjayB0aGF0IHRoZSBpbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kIChwYWNrYWdlIHByaXZhdGUgdmlzaWJpbGl0eSkgaXMgaW1wbGVtZW50ZWQgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UKIAlQYWNrYWdlQmluZGluZyBuZWNlc3NhcnlQYWNrYWdlID0gYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CkBAIC00MTMsMTIgKzU1MCwxNSBAQAogCS8vIG5vbiB2aXNpYmxlIGFic3RyYWN0IG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4gc28gdGhlIHR5cGUgbXVzdCBiZSBkZWZpbmVkIGFic3RyYWN0CiAJcHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RDYW5ub3RCZU92ZXJyaWRkZW4odGhpcy50eXBlLCBhYnN0cmFjdE1ldGhvZCk7CiB9CisKIHZvaWQgY29tcHV0ZUluaGVyaXRlZE1ldGhvZHMoKSB7CiAJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gdGhpcy50eXBlLmlzSW50ZXJmYWNlKCkKIAkJPyB0aGlzLnR5cGUuc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSAvLyBjaGVjayBpbnRlcmZhY2UgbWV0aG9kcyBhZ2FpbnN0IE9iamVjdAogCQk6IHRoaXMudHlwZS5zdXBlcmNsYXNzKCk7IC8vIGNsYXNzIG9yIGVudW0KLQljb21wdXRlSW5oZXJpdGVkTWV0aG9kcyhzdXBlcmNsYXNzLCB0eXBlLnN1cGVySW50ZXJmYWNlcygpKTsKKwljb21wdXRlSW5oZXJpdGVkTWV0aG9kcyhzdXBlcmNsYXNzLCB0aGlzLnR5cGUuc3VwZXJJbnRlcmZhY2VzKCkpOworCWNoZWNrRm9yUmVkdW5kYW50U3VwZXJpbnRlcmZhY2VzKHN1cGVyY2xhc3MsIHRoaXMudHlwZS5zdXBlckludGVyZmFjZXMoKSk7CiB9CisKIC8qCiBCaW5kaW5nIGNyZWF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmc6CiAJLSBhbGwgbW9kaWZpZXIgcHJvYmxlbXMgKGR1cGxpY2F0ZXMgJiBtdWx0aXBsZSB2aXNpYmlsaXR5IG1vZGlmaWVycyArIGluY29tcGF0aWJsZSBjb21iaW5hdGlvbnMpCkBAIC00MzMsOCArNTczLDggQEAKICovCiB2b2lkIGNvbXB1dGVJbmhlcml0ZWRNZXRob2RzKFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcywgUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcykgewogCS8vIG9ubHkgd2FudCB0byByZW1lbWJlciBpbmhlcml0ZWRNZXRob2RzIHRoYXQgY2FuIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBjdXJyZW50IHR5cGUKLQkvLyBpZiBhbiBpbmhlcml0ZWRNZXRob2QgaGFzIGJlZW4gJ3JlcGxhY2VkJyBieSBhIHN1cGVydHlwZSdzIG1ldGhvZCB0aGVuIHNraXAgaXQKLQorCS8vIGlmIGFuIGluaGVyaXRlZE1ldGhvZCBoYXMgYmVlbiAncmVwbGFjZWQnIGJ5IGEgc3VwZXJ0eXBlJ3MgbWV0aG9kIHRoZW4gc2tpcCBpdCwgaG93ZXZlcgorICAgIC8vIHNlZSB1c2FnZSBvZiBjYW5PdmVycmlkaW5nTWV0aG9kRGlmZmVySW5FcmFzdXJlIGJlbG93LgogCXRoaXMuaW5oZXJpdGVkTWV0aG9kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCg1MSk7IC8vIG1hcHMgbWV0aG9kIHNlbGVjdG9ycyB0byBhbiBhcnJheSBvZiBtZXRob2RzLi4uIG11c3Qgc2VhcmNoIHRvIG1hdGNoIHBhcmFtYXRlcnMgJiByZXR1cm4gdHlwZQogCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CiAJaW50IG5leHRQb3NpdGlvbiA9IDA7CkBAIC00NDYsMzAgKzU4NiwyNCBAQAogCiAJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUgPSBzdXBlcmNsYXNzOwogCUhhc2h0YWJsZU9mT2JqZWN0IG5vblZpc2libGVEZWZhdWx0TWV0aG9kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgzKTsgLy8gbWFwcyBtZXRob2Qgc2VsZWN0b3JzIHRvIGFuIGFycmF5IG9mIG1ldGhvZHMKLQlib29sZWFuIGFsbFN1cGVyY2xhc3Nlc0FyZUFic3RyYWN0ID0gdHJ1ZTsKIAogCXdoaWxlIChzdXBlclR5cGUgIT0gbnVsbCAmJiBzdXBlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewotCSAgICBpZiAoYWxsU3VwZXJjbGFzc2VzQXJlQWJzdHJhY3QpIHsKLQkJICAgIGlmIChzdXBlclR5cGUuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJLy8gb25seSBuZWVkIHRvIGluY2x1ZGUgc3VwZXJpbnRlcmZhY2VzIGlmIGltbWVkaWF0ZSBzdXBlcmNsYXNzZXMgYXJlIGFic3RyYWN0Ci0JCQkJaWYgKChpdHNJbnRlcmZhY2VzID0gc3VwZXJUeXBlLnN1cGVySW50ZXJmYWNlcygpKSAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewotCQkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgewotCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOwotCQkJCQkJbmV4dFBvc2l0aW9uID0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW50IGl0c0xlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOwotCQkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCi0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tuZXh0UG9zaXRpb24gKyBpdHNMZW5ndGggKyA1XSwgMCwgbmV4dFBvc2l0aW9uKTsKLQkJCQkJCW5leHRJbnRlcmZhY2UgOiBmb3IgKGludCBhID0gMDsgYSA8IGl0c0xlbmd0aDsgYSsrKSB7Ci0JCQkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKLQkJCQkJCQlmb3IgKGludCBiID0gMDsgYiA8IG5leHRQb3NpdGlvbjsgYisrKQotCQkJCQkJCQlpZiAobmV4dCA9PSBpbnRlcmZhY2VzVG9WaXNpdFtiXSkgY29udGludWUgbmV4dEludGVyZmFjZTsKLQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQorCQkvLyBXZSB1c2VkIHRvIG9ubHkgaW5jbHVkZSBzdXBlcmludGVyZmFjZXMgaWYgaW1tZWRpYXRlIHN1cGVyY2xhc3NlcyBhcmUgYWJzdHJhY3QKKwkJLy8gYnV0IHRoYXQgaXMgcHJvYmxlbWF0aWMuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMzU4CisJCWlmICgoaXRzSW50ZXJmYWNlcyA9IHN1cGVyVHlwZS5zdXBlckludGVyZmFjZXMoKSkgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKSB7CisJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOworCQkJCW5leHRQb3NpdGlvbiA9IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aDsKIAkJCX0gZWxzZSB7Ci0JCQkgICAgYWxsU3VwZXJjbGFzc2VzQXJlQWJzdHJhY3QgPSBmYWxzZTsKKwkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoICsgNV0sIDAsIG5leHRQb3NpdGlvbik7CisJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBuZXh0UG9zaXRpb247IGIrKykKKwkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCX0KIAkJCX0KIAkJfQogCkBAIC00ODAsMjEgKzYxNCwyNSBAQAogCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CiAJCQlNZXRob2RCaW5kaW5nW10gZXhpc3RpbmdNZXRob2RzID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5pbmhlcml0ZWRNZXRob2RzLmdldChpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpOwogCQkJaWYgKGV4aXN0aW5nTWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGV4aXN0aW5nTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZXhpc3RpbmdNZXRob2RzW2ldLmRlY2xhcmluZ0NsYXNzICE9IGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcyAmJiBhcmVNZXRob2RzQ29tcGF0aWJsZShleGlzdGluZ01ldGhvZHNbaV0sIGluaGVyaXRlZE1ldGhvZCkpIHsKLQkJCQkJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNEZWZhdWx0KCkgJiYgaW5oZXJpdGVkTWV0aG9kLmlzQWJzdHJhY3QoKSkKLQkJCQkJCQljaGVja1BhY2thZ2VQcml2YXRlQWJzdHJhY3RNZXRob2QoaW5oZXJpdGVkTWV0aG9kKTsKKwkJCQlleGlzdGluZyA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBleGlzdGluZ01ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJTWV0aG9kQmluZGluZyBleGlzdGluZ01ldGhvZCA9IGV4aXN0aW5nTWV0aG9kc1tpXTsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjM1OCwgc2tpcCBpbmhlcml0ZWQgbWV0aG9kIG9ubHkgaWYgYW55IG92ZXJyaWRpbmcgdmVyc2lvbgorCQkJCQkvLyBpbiBhIHN1YmNsYXNzIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBlcmFzdXJlIGFzIGFuIGV4aXN0aW5nIG1ldGhvZC4KKwkJCQkJaWYgKGV4aXN0aW5nTWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcyAmJiBhcmVNZXRob2RzQ29tcGF0aWJsZShleGlzdGluZ01ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSAmJiAhY2FuT3ZlcnJpZGluZ01ldGhvZERpZmZlckluRXJhc3VyZShleGlzdGluZ01ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkgeworCQkJCQkJaWYgKGluaGVyaXRlZE1ldGhvZC5pc0RlZmF1bHQoKSkgeworCQkJCQkJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNBYnN0cmFjdCgpKSB7CisJCQkJCQkJCWNoZWNrUGFja2FnZVByaXZhdGVBYnN0cmFjdE1ldGhvZChpbmhlcml0ZWRNZXRob2QpOworCQkJCQkJCX0gZWxzZSBpZiAoZXhpc3RpbmdNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UgIT0gaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlKSB7CisJCQkJCQkJCWlmICh0aGlzLnR5cGUuZlBhY2thZ2UgPT0gaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlICYmICFhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUoaW5oZXJpdGVkTWV0aG9kLCBleGlzdGluZ01ldGhvZCkpCisJCQkJCQkJCQljb250aW51ZSBleGlzdGluZzsgLy8gbWF5IG5lZWQgdG8gcmVjb3JkIGluY29tcGF0aWJsZSByZXR1cm4gdHlwZQorCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlNZXRob2RCaW5kaW5nW10gbm9uVmlzaWJsZSA9IChNZXRob2RCaW5kaW5nW10pIG5vblZpc2libGVEZWZhdWx0TWV0aG9kcy5nZXQoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yKTsKLQkJCWlmIChub25WaXNpYmxlICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBub25WaXNpYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJCQkJaWYgKGFyZU1ldGhvZHNDb21wYXRpYmxlKG5vblZpc2libGVbaV0sIGluaGVyaXRlZE1ldGhvZCkpCi0JCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOwogCi0JCQlpZiAoIWluaGVyaXRlZE1ldGhvZC5pc0RlZmF1bHQoKSB8fCBpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UgPT0gdHlwZS5mUGFja2FnZSkgeworCQkJaWYgKCFpbmhlcml0ZWRNZXRob2QuaXNEZWZhdWx0KCkgfHwgaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlID09IHRoaXMudHlwZS5mUGFja2FnZSkgewogCQkJCWlmIChleGlzdGluZ01ldGhvZHMgPT0gbnVsbCkgewogCQkJCQlleGlzdGluZ01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tdIHtpbmhlcml0ZWRNZXRob2R9OwogCQkJCX0gZWxzZSB7CkBAIC01MDQsNiArNjQyLDExIEBACiAJCQkJfQogCQkJCXRoaXMuaW5oZXJpdGVkTWV0aG9kcy5wdXQoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yLCBleGlzdGluZ01ldGhvZHMpOwogCQkJfSBlbHNlIHsKKwkJCQlNZXRob2RCaW5kaW5nW10gbm9uVmlzaWJsZSA9IChNZXRob2RCaW5kaW5nW10pIG5vblZpc2libGVEZWZhdWx0TWV0aG9kcy5nZXQoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yKTsKKwkJCQlpZiAobm9uVmlzaWJsZSAhPSBudWxsKQorCQkJCQlmb3IgKGludCBpID0gMCwgbCA9IG5vblZpc2libGUubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQkJCQkJaWYgKGFyZU1ldGhvZHNDb21wYXRpYmxlKG5vblZpc2libGVbaV0sIGluaGVyaXRlZE1ldGhvZCkpCisJCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKIAkJCQlpZiAobm9uVmlzaWJsZSA9PSBudWxsKSB7CiAJCQkJCW5vblZpc2libGUgPSBuZXcgTWV0aG9kQmluZGluZ1tdIHtpbmhlcml0ZWRNZXRob2R9OwogCQkJCX0gZWxzZSB7CkBAIC01MTcsOSArNjYwLDkgQEAKIAkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RDYW5ub3RCZU92ZXJyaWRkZW4odGhpcy50eXBlLCBpbmhlcml0ZWRNZXRob2QpOwogCiAJCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnQgPSAoTWV0aG9kQmluZGluZ1tdKSB0aGlzLmN1cnJlbnRNZXRob2RzLmdldChpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpOwotCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsgLy8gbm9uIHZpc2libGUgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBzbyBhIHdhcm5pbmcgaXMgaXNzdWVkCisJCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAhaW5oZXJpdGVkTWV0aG9kLmlzU3RhdGljKCkpIHsgLy8gbm9uIHZpc2libGUgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBzbyBhIHdhcm5pbmcgaXMgaXNzdWVkCiAJCQkJCWZvdW5kTWF0Y2ggOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY3VycmVudC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGFyZU1ldGhvZHNDb21wYXRpYmxlKGN1cnJlbnRbaV0sIGluaGVyaXRlZE1ldGhvZCkpIHsKKwkJCQkJCWlmICghY3VycmVudFtpXS5pc1N0YXRpYygpICYmIGFyZU1ldGhvZHNDb21wYXRpYmxlKGN1cnJlbnRbaV0sIGluaGVyaXRlZE1ldGhvZCkpIHsKIAkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5vdmVycmlkZXNQYWNrYWdlRGVmYXVsdE1ldGhvZChjdXJyZW50W2ldLCBpbmhlcml0ZWRNZXRob2QpOwogCQkJCQkJCWJyZWFrIGZvdW5kTWF0Y2g7CiAJCQkJCQl9CkBAIC01NTcsOCArNzAwLDEwIEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJaW50IGxlbmd0aCA9IGV4aXN0aW5nTWV0aG9kcy5sZW5ndGg7CiAJCQkJCS8vIGxvb2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgZXhpc3RpbmdNZXRob2RzIGltcGxlbWVudCB0aGlzIGluaGVyaXRlZE1ldGhvZAorCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMzU4LCBza2lwIGluaGVyaXRlZCBtZXRob2Qgb25seSBpZiBhbnkgb3ZlcnJpZGluZyB2ZXJzaW9uCisJCQkJCS8vIGluIGEgc3ViY2xhc3MgaXMgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIGVyYXN1cmUgYXMgYW4gZXhpc3RpbmcgbWV0aG9kLgogCQkJCQlmb3IgKGludCBlID0gMDsgZSA8IGxlbmd0aDsgZSsrKQotCQkJCQkJaWYgKGlzSW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50ZWQoaW5oZXJpdGVkTWV0aG9kLCBleGlzdGluZ01ldGhvZHNbZV0sIHN1cGVyVHlwZSkpCisJCQkJCQlpZiAoaXNJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRlZChpbmhlcml0ZWRNZXRob2QsIGV4aXN0aW5nTWV0aG9kc1tlXSwgc3VwZXJUeXBlKSAmJiAhY2FuT3ZlcnJpZGluZ01ldGhvZERpZmZlckluRXJhc3VyZShleGlzdGluZ01ldGhvZHNbZV0sIGluaGVyaXRlZE1ldGhvZCkpCiAJCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsgLy8gc2tpcCBpbnRlcmZhY2UgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGlmIHZpc2libGUgdG8gaXRzIGRlY2xhcmluZ0NsYXNzCiAJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdNZXRob2RzLCAwLCBleGlzdGluZ01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKIAkJCQkJZXhpc3RpbmdNZXRob2RzW2xlbmd0aF0gPSBpbmhlcml0ZWRNZXRob2Q7CkBAIC01NjgsOCArNzEzLDE0IEBACiAJCX0KIAl9CiB9CisKKy8vIEdpdmVuIGBvdmVycmlkaW5nTWV0aG9kJyB3aGljaCBvdmVycmlkZXMgYGluaGVyaXRlZE1ldGhvZCcgYW5zd2VyIHdoZXRoZXIgc29tZSBzdWJjbGFzcyBtZXRob2QgdGhhdAorLy8gZGlmZmVycyBpbiBlcmFzdXJlIGZyb20gb3ZlcnJpZGluZ01ldGhvZCBjb3VsZCBvdmVycmlkZSBgaW5oZXJpdGVkTWV0aG9kJworcHJvdGVjdGVkIGJvb2xlYW4gY2FuT3ZlcnJpZGluZ01ldGhvZERpZmZlckluRXJhc3VyZShNZXRob2RCaW5kaW5nIG92ZXJyaWRpbmdNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJcmV0dXJuIGZhbHNlOyAgIC8vIHRoZSBjYXNlIGZvciA8PSAxLjQgIChjYW5ub3QgZGlmZmVyKQorfQogdm9pZCBjb21wdXRlTWV0aG9kcygpIHsKLQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGUubWV0aG9kcygpOworCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdGhpcy50eXBlLm1ldGhvZHMoKTsKIAlpbnQgc2l6ZSA9IG1ldGhvZHMubGVuZ3RoOwogCXRoaXMuY3VycmVudE1ldGhvZHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3Qoc2l6ZSA9PSAwID8gMSA6IHNpemUpOyAvLyBtYXBzIG1ldGhvZCBzZWxlY3RvcnMgdG8gYW4gYXJyYXkgb2YgbWV0aG9kcy4uLiBtdXN0IHNlYXJjaCB0byBtYXRjaCBwYXJhbWF0ZXJzICYgcmV0dXJuIHR5cGUKIAlmb3IgKGludCBtID0gc2l6ZTsgLS1tID49IDA7KSB7CkBAIC01ODYsMTcgKzczNyw2NyBAQAogCQl9CiAJfQogfQorCiBNZXRob2RCaW5kaW5nIGNvbXB1dGVTdWJzdGl0dXRlTWV0aG9kKE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kLCBNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QpIHsKIAlpZiAoaW5oZXJpdGVkTWV0aG9kID09IG51bGwpIHJldHVybiBudWxsOwogCWlmIChjdXJyZW50TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoICE9IGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCkgcmV0dXJuIG51bGw7IC8vIG5vIG1hdGNoCiAJcmV0dXJuIGluaGVyaXRlZE1ldGhvZDsKIH0KLXB1YmxpYyBib29sZWFuIGRvZXNNZXRob2RPdmVycmlkZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKLQlyZXR1cm4gYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKKworYm9vbGVhbiBjb3VsZE1ldGhvZE92ZXJyaWRlKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgeworCWlmICghb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKG1ldGhvZCA9PSBpbmhlcml0ZWRNZXRob2QgfHwgbWV0aG9kLmlzU3RhdGljKCkgfHwgaW5oZXJpdGVkTWV0aG9kLmlzU3RhdGljKCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoaW5oZXJpdGVkTWV0aG9kLmlzUHJpdmF0ZSgpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGluaGVyaXRlZE1ldGhvZC5pc0RlZmF1bHQoKSAmJiBtZXRob2QuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpICE9IGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIW1ldGhvZC5pc1B1YmxpYygpKSB7IC8vIGluaGVyaXRlZE1ldGhvZCBpcyBlaXRoZXIgcHVibGljIG9yIHByb3RlY3RlZCAmIG1ldGhvZCBpcyBsZXNzIHRoYW4gcHVibGljCisJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNQdWJsaWMoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGluaGVyaXRlZE1ldGhvZC5pc1Byb3RlY3RlZCgpICYmICFtZXRob2QuaXNQcm90ZWN0ZWQoKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CiB9CisKKy8vIEFuc3dlciB3aGV0aGVyIHRoZSBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBpbmhlcml0ZWRNZXRob2QKKy8vIENoZWNrIHRoZSBuZWNlc3NhcnkgdmlzaWJpbGl0eSBydWxlcyAmIGluaGVyaXRhbmNlIGZyb20gdGhlIGluaGVyaXRlZE1ldGhvZCdzIGRlY2xhcmluZ0NsYXNzCisvLyBTZWUgaXNNZXRob2RTdWJzaWduYXR1cmUoKSBmb3IgcGFyYW1ldGVyIGNvbXBhcmlzb25zCitwdWJsaWMgYm9vbGVhbiBkb2VzTWV0aG9kT3ZlcnJpZGUoTWV0aG9kQmluZGluZyBtZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJaWYgKCFjb3VsZE1ldGhvZE92ZXJyaWRlKG1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5oZXJpdGVkTWV0aG9kID0gaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCk7CisJVHlwZUJpbmRpbmcgbWF0Y2ggPSBtZXRob2QuZGVjbGFyaW5nQ2xhc3MuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCWlmICghKG1hdGNoIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpCisJCXJldHVybiBmYWxzZTsgLy8gbWV0aG9kJ3MgZGVjbGFyaW5nQ2xhc3MgZG9lcyBub3QgaW5oZXJpdCBmcm9tIGluaGVyaXRlZE1ldGhvZCdzCisKKwlyZXR1cm4gaXNQYXJhbWV0ZXJTdWJzaWduYXR1cmUobWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOworfQorCiBTaW1wbGVTZXQgZmluZFN1cGVyaW50ZXJmYWNlQ29sbGlzaW9ucyhSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MsIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMpIHsKIAlyZXR1cm4gbnVsbDsgLy8gbm9vcCBpbiAxLjQKIH0KKworTWV0aG9kQmluZGluZyBmaW5kQmVzdEluaGVyaXRlZEFic3RyYWN0TWV0aG9kKE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLCBpbnQgbGVuZ3RoKSB7CisJZmluZE1ldGhvZCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOworCQlpZiAoIW1ldGhvZC5pc0Fic3RyYWN0KCkpIGNvbnRpbnVlIGZpbmRNZXRob2Q7CisJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCWlmIChpID09IGopIGNvbnRpbnVlOworCQkJaWYgKCFjaGVja0luaGVyaXRlZFJldHVyblR5cGVzKG1ldGhvZCwgbWV0aG9kc1tqXSkpIHsKKwkJCQlpZiAodGhpcy50eXBlLmlzSW50ZXJmYWNlKCkgJiYgbWV0aG9kc1tqXS5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpCisJCQkJCXJldHVybiBtZXRob2Q7IC8vIGRvIG5vdCBjb21wbGFpbiBzaW5jZSB0aGUgc3VwZXIgaW50ZXJmYWNlIGFscmVhZHkgZ290IGJsYW1lZAorCQkJCWNvbnRpbnVlIGZpbmRNZXRob2Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1ldGhvZDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisKIGludFtdIGZpbmRPdmVycmlkZGVuSW5oZXJpdGVkTWV0aG9kcyhNZXRob2RCaW5kaW5nW10gbWV0aG9kcywgaW50IGxlbmd0aCkgewogCS8vIE5PVEUgYXNzdW1lcyBsZW5ndGggPiAxCiAJLy8gaW5oZXJpdGVkIG1ldGhvZHMgYXJlIGFkZGVkIGFzIHdlIHdhbGsgdXAgdGhlIHN1cGVyY2xhc3MgaGllcmFyY2h5LCB0aGVuIGVhY2ggc3VwZXJpbnRlcmZhY2UKQEAgLTYxNiw2ICs4MTcsNyBAQAogCQl9CiAJCWlmICghZGVjbGFyaW5nQ2xhc3MyLmlzSW50ZXJmYWNlKCkpIHsKIAkJCS8vIHNraXAgYWxsIG1ldGhvZHMgZnJvbSBkaWZmZXJlbnQgc3VwZXJjbGFzc2VzCisJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UgIT0gZGVjbGFyaW5nQ2xhc3MyLmZQYWNrYWdlICYmIG1ldGhvZHNbaV0uaXNEZWZhdWx0KCkpIHJldHVybiBudWxsOwogCQkJdG9Ta2lwID0gbmV3IGludFtsZW5ndGhdOwogCQkJZG8gewogCQkJCXRvU2tpcFtpXSA9IC0xOwpAQCAtNjQ3LDYgKzg0OSw3IEBACiAJfQogCXJldHVybiB0b1NraXA7CiB9CisKIGJvb2xlYW4gaXNBc1Zpc2libGUoTWV0aG9kQmluZGluZyBuZXdNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CiAJaWYgKGluaGVyaXRlZE1ldGhvZC5tb2RpZmllcnMgPT0gbmV3TWV0aG9kLm1vZGlmaWVycykgcmV0dXJuIHRydWU7CiAKQEAgLTY1OCw0OSArODYxLDY0IEBACiAKIAlyZXR1cm4gIW5ld01ldGhvZC5pc1ByaXZhdGUoKTsJCS8vIFRoZSBpbmhlcml0ZWRNZXRob2QgY2Fubm90IGJlIHByaXZhdGUgc2luY2UgaXQgd291bGQgbm90IGJlIHZpc2libGUKIH0KKwogYm9vbGVhbiBpc0ludGVyZmFjZU1ldGhvZEltcGxlbWVudGVkKE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kLCBNZXRob2RCaW5kaW5nIGV4aXN0aW5nTWV0aG9kLCBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZSkgewogCS8vIHNraXAgaW50ZXJmYWNlIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBpZiB2aXNpYmxlIHRvIGl0cyBkZWNsYXJpbmdDbGFzcwogCXJldHVybiBhcmVQYXJhbWV0ZXJzRXF1YWwoZXhpc3RpbmdNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkgJiYgZXhpc3RpbmdNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShzdXBlclR5cGUsIHRydWUpOwogfQorCitwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFN1YnNpZ25hdHVyZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpCisJCSYmIGlzUGFyYW1ldGVyU3Vic2lnbmF0dXJlKG1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKK30KKworYm9vbGVhbiBpc1BhcmFtZXRlclN1YnNpZ25hdHVyZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlyZXR1cm4gYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKK30KKwogYm9vbGVhbiBpc1NhbWVDbGFzc09yU3ViY2xhc3NPZihSZWZlcmVuY2VCaW5kaW5nIHRlc3RDbGFzcywgUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzKSB7CiAJZG8gewogCQlpZiAodGVzdENsYXNzID09IHN1cGVyY2xhc3MpIHJldHVybiB0cnVlOwogCX0gd2hpbGUgKCh0ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3Muc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKIAlyZXR1cm4gZmFsc2U7CiB9CisKIGJvb2xlYW4gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKIAkvLyBpZiB0aGUgdHlwZSdzIHN1cGVyY2xhc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MsIHRoZW4gYWxsIGFic3RyYWN0IG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZAogCS8vIG90aGVyd2lzZSwgc2tpcCBpdCBpZiB0aGUgdHlwZSdzIHN1cGVyY2xhc3MgbXVzdCBpbXBsZW1lbnQgYW55IG9mIHRoZSBpbmhlcml0ZWQgbWV0aG9kcworCWlmICghbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcygpKSByZXR1cm4gZmFsc2U7CiAJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gdGhpcy50eXBlLnN1cGVyY2xhc3MoKTsKIAlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNDbGFzcygpKSB7CiAJCXdoaWxlIChzdXBlcmNsYXNzLmlzQWJzdHJhY3QoKSAmJiBzdXBlcmNsYXNzICE9IGRlY2xhcmluZ0NsYXNzKQogCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3Muc3VwZXJjbGFzcygpOyAvLyBmaW5kIHRoZSBmaXJzdCBjb25jcmV0ZSBzdXBlcmNsYXNzIG9yIHRoZSBhYnN0cmFjdCBkZWNsYXJpbmdDbGFzcwogCX0gZWxzZSB7Ci0JCWlmICh0aGlzLnR5cGUuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgZmFsc2UpKSB7Ci0JCQlpZiAodGhpcy50eXBlLmlzQWJzdHJhY3QoKSkgcmV0dXJuIGZhbHNlOyAvLyBsZWF2ZSBpdCBmb3IgdGhlIHN1YmNsYXNzZXMKKwkJaWYgKHRoaXMudHlwZS5pbXBsZW1lbnRzSW50ZXJmYWNlKGRlY2xhcmluZ0NsYXNzLCBmYWxzZSkpCiAJCQlpZiAoIXN1cGVyY2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgdHJ1ZSkpIC8vIG9ubHkgaWYgYSBzdXBlcmNsYXNzIGRvZXMgbm90IGFsc28gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQogCQl3aGlsZSAoc3VwZXJjbGFzcy5pc0Fic3RyYWN0KCkgJiYgIXN1cGVyY2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgZmFsc2UpKQogCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3Muc3VwZXJjbGFzcygpOyAvLyBmaW5kIHRoZSBmaXJzdCBjb25jcmV0ZSBzdXBlcmNsYXNzIG9yIHRoZSBzdXBlcmNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIGludGVyZmFjZQogCX0KIAlyZXR1cm4gc3VwZXJjbGFzcy5pc0Fic3RyYWN0KCk7CQkvLyBpZiBpdCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoZW4gd2UgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIHByb2JsZW0gYWdhaW5zdCBpdAogfQorCiBib29sZWFuIG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKSB7CiAJcmV0dXJuICF0aGlzLnR5cGUuaXNJbnRlcmZhY2UoKSAmJiAhdGhpcy50eXBlLmlzQWJzdHJhY3QoKTsKIH0KKwogUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcigpIHsKIAlyZXR1cm4gdGhpcy50eXBlLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpOwogfQorCiBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCkgewogCVByb2JsZW1SZXBvcnRlciByZXBvcnRlciA9IHByb2JsZW1SZXBvcnRlcigpOwotCWlmIChjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzID09IHR5cGUgJiYgY3VycmVudE1ldGhvZC5zb3VyY2VNZXRob2QoKSAhPSBudWxsKQkvLyBvbmx5IHJlcG9ydCBhZ2FpbnN0IHRoZSBjdXJyZW50TWV0aG9kIGlmIGl0cyBpbXBsZW1lbnRlZCBieSB0aGUgdHlwZQorCWlmIChjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzID09IHRoaXMudHlwZSAmJiBjdXJyZW50TWV0aG9kLnNvdXJjZU1ldGhvZCgpICE9IG51bGwpCS8vIG9ubHkgcmVwb3J0IGFnYWluc3QgdGhlIGN1cnJlbnRNZXRob2QgaWYgaXRzIGltcGxlbWVudGVkIGJ5IHRoZSB0eXBlCiAJCXJlcG9ydGVyLnJlZmVyZW5jZUNvbnRleHQgPSBjdXJyZW50TWV0aG9kLnNvdXJjZU1ldGhvZCgpOwogCXJldHVybiByZXBvcnRlcjsKIH0KKwogLyoqCiAgKiBSZXR1cm4gdHJ1ZSBhbmQgcmVwb3J0IGFuIGluY29tcGF0aWJsZVJldHVyblR5cGUgZXJyb3IgaWYgY3VycmVudE1ldGhvZCdzCi0gKiByZXR1cm4gdHlwZSBpcyBzdHJpY3RseSBpbmNvbXBhdGlibGUgd2l0aCBpbmhlcml0ZWRNZXRob2QncywgZWxzZSByZXR1cm4gCisgKiByZXR1cm4gdHlwZSBpcyBzdHJpY3RseSBpbmNvbXBhdGlibGUgd2l0aCBpbmhlcml0ZWRNZXRob2QncywgZWxzZSByZXR1cm4KICAqIGZhbHNlIGFuZCByZXBvcnQgYW4gdW5jaGVja2VkIGNvbnZlcnNpb24gd2FybmluZy4gRG8gbm90IGNhbGwgd2hlbgogICogYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkgcmV0dXJucyB0cnVlLgogICogQHBhcmFtIGN1cnJlbnRNZXRob2QgdGhlIChwb3RlbnRpYWxseSkgaW5oZXJpdGluZyBtZXRob2QKQEAgLTcxMiw2ICs5MzAsNyBAQAogCXByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS5pbmNvbXBhdGlibGVSZXR1cm5UeXBlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7CiAJcmV0dXJuIHRydWU7CiB9CisKIFJlZmVyZW5jZUJpbmRpbmdbXSByZXNvbHZlZEV4Y2VwdGlvblR5cGVzRm9yKE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CiAJUmVmZXJlbmNlQmluZGluZ1tdIGV4Y2VwdGlvbnMgPSBtZXRob2QudGhyb3duRXhjZXB0aW9uczsKIAlpZiAoKG1ldGhvZC5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQpID09IDApCkBAIC03MjEsMTkgKzk0MCwzNSBAQAogCQlyZXR1cm4gQmluZGluZy5OT19FWENFUFRJT05TOyAvLyBzYWZldHkgY2hlY2sKIAogCWZvciAoaW50IGkgPSBleGNlcHRpb25zLmxlbmd0aDsgLS1pID49IDA7KQotCQlleGNlcHRpb25zW2ldID0gQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUoZXhjZXB0aW9uc1tpXSwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSk7CisJCWV4Y2VwdGlvbnNbaV0gPSAoUmVmZXJlbmNlQmluZGluZykgQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUoZXhjZXB0aW9uc1tpXSwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSAvKiByYXcgY29udmVyc2lvbiAqLyk7CiAJcmV0dXJuIGV4Y2VwdGlvbnM7CiB9Ci12b2lkIHZlcmlmeShTb3VyY2VUeXBlQmluZGluZyBzb21lVHlwZSkgewotCXRoaXMudHlwZSA9IHNvbWVUeXBlOworCit2b2lkIHZlcmlmeSgpIHsKIAljb21wdXRlTWV0aG9kcygpOwogCWNvbXB1dGVJbmhlcml0ZWRNZXRob2RzKCk7CiAJY2hlY2tNZXRob2RzKCk7CisJaWYgKHRoaXMudHlwZS5pc0NsYXNzKCkpCisJCWNoZWNrRm9yTWlzc2luZ0hhc2hDb2RlTWV0aG9kKCk7CiB9CisKK3ZvaWQgdmVyaWZ5KFNvdXJjZVR5cGVCaW5kaW5nIHNvbWVUeXBlKSB7CisJaWYgKHRoaXMudHlwZSA9PSBudWxsKSB7CisJCXRyeSB7CisJCQl0aGlzLnR5cGUgPSBzb21lVHlwZTsKKwkJCXZlcmlmeSgpOworCQl9IGZpbmFsbHkgeworCQkJdGhpcy50eXBlID0gbnVsbDsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuZW52aXJvbm1lbnQubmV3TWV0aG9kVmVyaWZpZXIoKS52ZXJpZnkoc29tZVR5cGUpOworCX0KK30KKwogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CiAJYnVmZmVyLmFwcGVuZCgiTWV0aG9kVmVyaWZpZXIgZm9yIHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZCh0eXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMudHlwZS5yZWFkYWJsZU5hbWUoKSk7CiAJYnVmZmVyLmFwcGVuZCgnXG4nKTsKIAlidWZmZXIuYXBwZW5kKCJcdC1pbmhlcml0ZWQgbWV0aG9kczogIik7IC8vJE5PTi1OTFMtMSQKIAlidWZmZXIuYXBwZW5kKHRoaXMuaW5oZXJpdGVkTWV0aG9kcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyMTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIxNS5qYXZhCmluZGV4IGM4MmQ4NmQuLjQ0MjEwMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIxNS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIxNS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDcgKzEwLDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAorCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldDsKIApAQCAtMjAsOCArMzAsMTQgQEAKIAlzdXBlcihlbnZpcm9ubWVudCk7CiB9CiBib29sZWFuIGFyZU1ldGhvZHNDb21wYXRpYmxlKE1ldGhvZEJpbmRpbmcgb25lLCBNZXRob2RCaW5kaW5nIHR3bykgewotCU1ldGhvZEJpbmRpbmcgc3ViID0gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QodHdvLCBvbmUpOwotCXJldHVybiBzdWIgIT0gbnVsbCAmJiBkb2VzU3Vic3RpdHV0ZU1ldGhvZE92ZXJyaWRlKG9uZSwgc3ViKSAmJiBhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUob25lLCBzdWIpOworCS8vIHVzZSB0aGUgb3JpZ2luYWwgbWV0aG9kcyB0byB0ZXN0IGNvbXBhdGliaWxpdHksIGJ1dCBkbyBub3QgY2hlY2sgdmlzaWJpbGl0eSwgZXRjCisJb25lID0gb25lLm9yaWdpbmFsKCk7CisJdHdvID0gb25lLmZpbmRPcmlnaW5hbEluaGVyaXRlZE1ldGhvZCh0d28pOworCisJaWYgKHR3byA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7IC8vIG1ldGhvZCdzIGRlY2xhcmluZ0NsYXNzIGRvZXMgbm90IGluaGVyaXQgZnJvbSBpbmhlcml0ZWRNZXRob2QncworCisJcmV0dXJuIGlzUGFyYW1ldGVyU3Vic2lnbmF0dXJlKG9uZSwgdHdvKTsKIH0KIGJvb2xlYW4gYXJlUGFyYW1ldGVyc0VxdWFsKE1ldGhvZEJpbmRpbmcgb25lLCBNZXRob2RCaW5kaW5nIHR3bykgewogCVR5cGVCaW5kaW5nW10gb25lQXJncyA9IG9uZS5wYXJhbWV0ZXJzOwpAQCAtMzEsNTMgKzQ3LDcwIEBACiAJaW50IGxlbmd0aCA9IG9uZUFyZ3MubGVuZ3RoOwogCWlmIChsZW5ndGggIT0gdHdvQXJncy5sZW5ndGgpIHJldHVybiBmYWxzZTsKIAotCWlmIChvbmUuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJaWYgKCFhcmVUeXBlc0VxdWFsKG9uZUFyZ3NbaV0sIHR3b0FyZ3NbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgewotCQkvLyBtZXRob2RzIHdpdGggcmF3IHBhcmFtZXRlcnMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgdG8gaW5oZXJpdGVkIG1ldGhvZHMKLQkJLy8gd2l0aCBwYXJhbWV0ZXJpemVkIHBhcmFtZXRlcnMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBuZWVkIGEgbW9yZSBjb21wbGV4IGNoZWNrCi0JCWludCBpOwotCQlmb3VuZFJBVzogZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWFyZVR5cGVzRXF1YWwob25lQXJnc1tpXSwgdHdvQXJnc1tpXSkpIHsKLQkJCQlpZiAob25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpKSB7Ci0JCQkJCWlmIChvbmVBcmdzW2ldLmRpbWVuc2lvbnMoKSA9PSB0d29BcmdzW2ldLmRpbWVuc2lvbnMoKSAmJiBvbmVBcmdzW2ldLmxlYWZDb21wb25lbnRUeXBlKCkuaXNFcXVpdmFsZW50VG8odHdvQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpKSkgewotCQkJCQkJLy8gcmF3IG1vZGUgZG9lcyBub3QgYXBwbHkgaWYgdGhlIG1ldGhvZCBkZWZpbmVzIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMKLQkJCQkJCWlmIChvbmUudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQorCQorCS8vIG1ldGhvZHMgd2l0aCByYXcgcGFyYW1ldGVycyBhcmUgY29uc2lkZXJlZCBlcXVhbCB0byBpbmhlcml0ZWQgbWV0aG9kcworCS8vIHdpdGggcGFyYW1ldGVyaXplZCBwYXJhbWV0ZXJzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgbmVlZCBhIG1vcmUgY29tcGxleCBjaGVjaworCWludCBpOworCWZvdW5kUkFXOiBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKCFhcmVUeXBlc0VxdWFsKG9uZUFyZ3NbaV0sIHR3b0FyZ3NbaV0pKSB7CisJCQlpZiAob25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpKSB7CisJCQkJaWYgKG9uZUFyZ3NbaV0uZGltZW5zaW9ucygpID09IHR3b0FyZ3NbaV0uZGltZW5zaW9ucygpICYmIG9uZUFyZ3NbaV0ubGVhZkNvbXBvbmVudFR5cGUoKS5pc0VxdWl2YWxlbnRUbyh0d29BcmdzW2ldLmxlYWZDb21wb25lbnRUeXBlKCkpKSB7CisJCQkJCS8vIHJhdyBtb2RlIGRvZXMgbm90IGFwcGx5IGlmIHRoZSBtZXRob2QgZGVmaW5lcyBpdHMgb3duIHR5cGUgdmFyaWFibGVzCisJCQkJCWlmIChvbmUudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkvLyBvbmUgcGFyYW1ldGVyIHR5cGUgaXMgcmF3LCBoZW5jZSBhbGwgcGFyYW1ldGVycyB0eXBlcyBtdXN0IGJlIHJhdyBvciBub24gZ2VuZXJpYworCQkJCQkvLyBvdGhlcndpc2Ugd2UgaGF2ZSBhIG1pc21hdGNoIGNoZWNrIGJhY2t3YXJkcworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJCWlmIChvbmVBcmdzW2pdLmxlYWZDb21wb25lbnRUeXBlKCkuaXNQYXJhbWV0ZXJpemVkVHlwZVdpdGhBY3R1YWxBcmd1bWVudHMoKSkKIAkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkvLyBvbmUgcGFyYW1ldGVyIHR5cGUgaXMgcmF3LCBoZW5jZSBhbGwgcGFyYW1ldGVycyB0eXBlcyBtdXN0IGJlIHJhdyBvciBub24gZ2VuZXJpYwotCQkJCQkJLy8gb3RoZXJ3aXNlIHdlIGhhdmUgYSBtaXNtYXRjaCBjaGVjayBiYWNrd2FyZHMKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQkJCWlmIChvbmVBcmdzW2pdLmxlYWZDb21wb25lbnRUeXBlKCkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkvLyBzd2l0Y2ggdG8gYWxsIHJhdyBtb2RlCi0JCQkJCQlicmVhayBmb3VuZFJBVzsKLQkJCQkJfQorCQkJCQkvLyBzd2l0Y2ggdG8gYWxsIHJhdyBtb2RlCisJCQkJCWJyZWFrIGZvdW5kUkFXOwogCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJLy8gYWxsIHJhdyBtb2RlIGZvciByZW1haW5pbmcgcGFyYW1ldGVycyAoaWYgYW55KQotCQlmb3IgKGkrKzsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWFyZVR5cGVzRXF1YWwob25lQXJnc1tpXSwgdHdvQXJnc1tpXSkpIHsKLQkJCQlpZiAob25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpKQotCQkJCQlpZiAob25lQXJnc1tpXS5kaW1lbnNpb25zKCkgPT0gdHdvQXJnc1tpXS5kaW1lbnNpb25zKCkgJiYgb25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzRXF1aXZhbGVudFRvKHR3b0FyZ3NbaV0ubGVhZkNvbXBvbmVudFR5cGUoKSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKG9uZUFyZ3NbaV0ubGVhZkNvbXBvbmVudFR5cGUoKS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIG5vIHJlbWFpbmluZyBwYXJhbWV0ZXIgY2FuIGJlIGEgUGFyYW1ldGVyaXplZCB0eXBlIChpZiBvbmUgaGFzIGJlZW4gY29udmVydGVkIHRoZW4gYWxsIFJBVyB0eXBlcyBtdXN0IGJlIGNvbnZlcnRlZCkKLQkJCX0KKwl9CisJLy8gYWxsIHJhdyBtb2RlIGZvciByZW1haW5pbmcgcGFyYW1ldGVycyAoaWYgYW55KQorCWZvciAoaSsrOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKCFhcmVUeXBlc0VxdWFsKG9uZUFyZ3NbaV0sIHR3b0FyZ3NbaV0pKSB7CisJCQlpZiAob25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpKQorCQkJCWlmIChvbmVBcmdzW2ldLmRpbWVuc2lvbnMoKSA9PSB0d29BcmdzW2ldLmRpbWVuc2lvbnMoKSAmJiBvbmVBcmdzW2ldLmxlYWZDb21wb25lbnRUeXBlKCkuaXNFcXVpdmFsZW50VG8odHdvQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpKSkKKwkJCQkJY29udGludWU7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAob25lQXJnc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUGFyYW1ldGVyaXplZFR5cGVXaXRoQWN0dWFsQXJndW1lbnRzKCkpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gbm8gcmVtYWluaW5nIHBhcmFtZXRlciBjYW4gYmUgYSBQYXJhbWV0ZXJpemVkIHR5cGUgKGlmIG9uZSBoYXMgYmVlbiBjb252ZXJ0ZWQgdGhlbiBhbGwgUkFXIHR5cGVzIG11c3QgYmUgY29udmVydGVkKQogCQl9CiAJfQogCXJldHVybiB0cnVlOwogfQogYm9vbGVhbiBhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUoTWV0aG9kQmluZGluZyBvbmUsIE1ldGhvZEJpbmRpbmcgdHdvKSB7CiAJaWYgKG9uZS5yZXR1cm5UeXBlID09IHR3by5yZXR1cm5UeXBlKSByZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlMChvbmUsIHR3byk7CisJaWYgKHRoaXMudHlwZS5zY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCXJldHVybiBhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUwKG9uZSwgdHdvKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gYXJlVHlwZXNFcXVhbChvbmUucmV0dXJuVHlwZS5lcmFzdXJlKCksIHR3by5yZXR1cm5UeXBlLmVyYXN1cmUoKSk7CisJfQogfQogYm9vbGVhbiBhcmVUeXBlc0VxdWFsKFR5cGVCaW5kaW5nIG9uZSwgVHlwZUJpbmRpbmcgdHdvKSB7CiAJaWYgKG9uZSA9PSB0d28pIHJldHVybiB0cnVlOworCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1ODQKKwlzd2l0Y2gob25lLmtpbmQoKSkgeworCQljYXNlIEJpbmRpbmcuVFlQRToKKwkJCXN3aXRjaCAodHdvLmtpbmQoKSkgeworCQkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEU6CisJCQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFOgorCQkJCQlpZiAob25lID09IHR3by5lcmFzdXJlKCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJpbmRpbmcuUkFXX1RZUEU6CisJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEU6CisJCQlzd2l0Y2godHdvLmtpbmQoKSkgeworCQkJCWNhc2UgQmluZGluZy5UWVBFOgorCQkJCQlpZiAob25lLmVyYXN1cmUoKSA9PSB0d28pCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwl9CiAKIAkvLyBuZWVkIHRvIGNvbnNpZGVyIFg8Pz4gYW5kIFg8PyBleHRlbmRzIE9iamVjdD4gYXMgdGhlIHNhbWUgJ3R5cGUnCiAJaWYgKG9uZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgJiYgdHdvLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkKQEAgLTkwLDYgKzEyMywxNSBAQAogCS8vCQlyZXR1cm4gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgdHdvKS5yZXNvbHZlZFR5cGUgPT0gb25lOwogCXJldHVybiBmYWxzZTsgLy8gYWxsIG90aGVyIHR5cGUgYmluZGluZ3MgYXJlIGlkZW50aWNhbAogfQorLy8gR2l2ZW4gYG92ZXJyaWRpbmdNZXRob2QnIHdoaWNoIG92ZXJyaWRlcyBgaW5oZXJpdGVkTWV0aG9kJyBhbnN3ZXIgd2hldGhlciBzb21lIHN1YmNsYXNzIG1ldGhvZCB0aGF0CisvLyBkaWZmZXJzIGluIGVyYXN1cmUgZnJvbSBvdmVycmlkaW5nTWV0aG9kIGNvdWxkIG92ZXJyaWRlIGBpbmhlcml0ZWRNZXRob2QnCitwcm90ZWN0ZWQgYm9vbGVhbiBjYW5PdmVycmlkaW5nTWV0aG9kRGlmZmVySW5FcmFzdXJlKE1ldGhvZEJpbmRpbmcgb3ZlcnJpZGluZ01ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlpZiAob3ZlcnJpZGluZ01ldGhvZC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKGluaGVyaXRlZE1ldGhvZCkpCisJCXJldHVybiBmYWxzZTsgIC8vIG5vIGZ1cnRoZXIgY2hhbmdlIGluIHNpZ25hdHVyZSBpcyBwb3NzaWJsZSBkdWUgdG8gcGFyYW1ldGVyaXphdGlvbi4KKwlpZiAob3ZlcnJpZGluZ01ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSkKKwkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gcGFyYW1ldGVyaXphdGlvbiBpcyBoYXBwZW5pbmcgYW55d2F5cy4KKwlyZXR1cm4gdHJ1ZTsKK30KIGJvb2xlYW4gY2FuU2tpcEluaGVyaXRlZE1ldGhvZHMoKSB7CiAJaWYgKHRoaXMudHlwZS5zdXBlcmNsYXNzKCkgIT0gbnVsbCkKIAkJaWYgKHRoaXMudHlwZS5zdXBlcmNsYXNzKCkuaXNBYnN0cmFjdCgpIHx8IHRoaXMudHlwZS5zdXBlcmNsYXNzKCkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQpAQCAtMTEwLDIyICsxNTIsMTggQEAKIAogCQkvLyBzbyB0aGUgcGFyYW1ldGVycyBhcmUgZXF1YWwgYW5kIHRoZSByZXR1cm4gdHlwZSBpcyBjb21wYXRpYmxlIGIvdyB0aGUgY3VycmVudE1ldGhvZCAmIHRoZSBzdWJzdGl0dXRlZCBpbmhlcml0ZWRNZXRob2QKIAkJTWV0aG9kQmluZGluZyBvcmlnaW5hbEluaGVyaXRlZCA9IGFic3RyYWN0TWV0aG9kLm9yaWdpbmFsKCk7Ci0JCWlmIChvcmlnaW5hbEluaGVyaXRlZC5yZXR1cm5UeXBlICE9IGNvbmNyZXRlTWV0aG9kLnJldHVyblR5cGUpIHsKLQkJCWlmIChhYnN0cmFjdE1ldGhvZC5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCQkJaWYgKGNvbmNyZXRlTWV0aG9kLnJldHVyblR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1Jhd1R5cGUoKSkKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKGNvbmNyZXRlTWV0aG9kLCBvcmlnaW5hbEluaGVyaXRlZCwgdGhpcy50eXBlKTsKLQkJCX0gZWxzZSBpZiAoYWJzdHJhY3RNZXRob2QuaGFzU3Vic3RpdHV0ZWRSZXR1cm5UeXBlKCkgJiYgb3JpZ2luYWxJbmhlcml0ZWQucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzVHlwZVZhcmlhYmxlKCkpIHsKLQkJCQlpZiAoKChUeXBlVmFyaWFibGVCaW5kaW5nKSBvcmlnaW5hbEluaGVyaXRlZC5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpLmRlY2xhcmluZ0VsZW1lbnQgPT0gb3JpZ2luYWxJbmhlcml0ZWQpIHsgLy8gc2VlIDgxNjE4IC0gdHlwZSB2YXJpYWJsZSBmcm9tIGluaGVyaXRlZCBtZXRob2QKLQkJCQkJVHlwZUJpbmRpbmcgY3VycmVudFJldHVyblR5cGUgPSBjb25jcmV0ZU1ldGhvZC5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCQkJCWlmICghY3VycmVudFJldHVyblR5cGUuaXNUeXBlVmFyaWFibGUoKSB8fCAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpIGN1cnJlbnRSZXR1cm5UeXBlKS5kZWNsYXJpbmdFbGVtZW50ICE9IGNvbmNyZXRlTWV0aG9kKQotCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKGNvbmNyZXRlTWV0aG9kLCBvcmlnaW5hbEluaGVyaXRlZCwgdGhpcy50eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJaWYgKG9yaWdpbmFsSW5oZXJpdGVkLnJldHVyblR5cGUgIT0gY29uY3JldGVNZXRob2QucmV0dXJuVHlwZSkKKwkJCWlmICghaXNBY2NlcHRhYmxlUmV0dXJuVHlwZU92ZXJyaWRlKGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZCkpCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKGNvbmNyZXRlTWV0aG9kLCBvcmlnaW5hbEluaGVyaXRlZCwgdGhpcy50eXBlKTsKKwogCQkvLyBjaGVjayB3aGV0aGVyIGJyaWRnZSBtZXRob2QgaXMgYWxyZWFkeSBkZWZpbmVkIGFib3ZlIGZvciBpbnRlcmZhY2UgbWV0aG9kcwotCQlpZiAob3JpZ2luYWxJbmhlcml0ZWQuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKQotCQkJCSYmIHRoaXMudHlwZS5zdXBlcmNsYXNzLmVyYXN1cmUoKS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKG9yaWdpbmFsSW5oZXJpdGVkLmRlY2xhcmluZ0NsYXNzKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnR5cGUuYWRkU3ludGhldGljQnJpZGdlTWV0aG9kKG9yaWdpbmFsSW5oZXJpdGVkLCBjb25jcmV0ZU1ldGhvZC5vcmlnaW5hbCgpKTsKKwkJLy8gc2tpcCBnZW5lcmF0aW9uIG9mIGJyaWRnZSBtZXRob2QgZm9yIGN1cnJlbnQgY2xhc3MgJiBtZXRob2QgaWYgYW4gZXF1aXZhbGVudAorCQkvLyBicmlkZ2Ugd2lsbCBiZS93b3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBzdXBlciBjbGFzcyBzaW5jZQorCQkvLyB0aGUgYnJpZGdlIGl0c2VsZiB3aWxsIGJlIGluaGVyaXRlZC4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgzNjIKKwkJaWYgKG9yaWdpbmFsSW5oZXJpdGVkLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCWlmICgoY29uY3JldGVNZXRob2QuZGVjbGFyaW5nQ2xhc3MgPT0gdGhpcy50eXBlLnN1cGVyY2xhc3MgJiYgdGhpcy50eXBlLnN1cGVyY2xhc3MuaXNQYXJhbWV0ZXJpemVkVHlwZSgpICYmICFhcmVNZXRob2RzQ29tcGF0aWJsZShjb25jcmV0ZU1ldGhvZCwgb3JpZ2luYWxJbmhlcml0ZWQpKQorCQkJCXx8IHRoaXMudHlwZS5zdXBlcmNsYXNzLmVyYXN1cmUoKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKG9yaWdpbmFsSW5oZXJpdGVkLmRlY2xhcmluZ0NsYXNzKSA9PSBudWxsKQorCQkJCQl0aGlzLnR5cGUuYWRkU3ludGhldGljQnJpZGdlTWV0aG9kKG9yaWdpbmFsSW5oZXJpdGVkLCBjb25jcmV0ZU1ldGhvZC5vcmlnaW5hbCgpKTsKIAkJfQogCX0KIH0KQEAgLTEzNSwzNCArMTczLDI5IEBACiAKIAkvLyBzbyB0aGUgcGFyYW1ldGVycyBhcmUgZXF1YWwgYW5kIHRoZSByZXR1cm4gdHlwZSBpcyBjb21wYXRpYmxlIGIvdyB0aGUgY3VycmVudE1ldGhvZCAmIHRoZSBzdWJzdGl0dXRlZCBpbmhlcml0ZWRNZXRob2QKIAlNZXRob2RCaW5kaW5nIG9yaWdpbmFsSW5oZXJpdGVkID0gaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCk7Ci0JaWYgKG9yaWdpbmFsSW5oZXJpdGVkLnJldHVyblR5cGUgIT0gY3VycmVudE1ldGhvZC5yZXR1cm5UeXBlKSB7Ci0vLwkJaWYgKGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZS5uZWVkc1VuY2hlY2tlZENvbnZlcnNpb24oaW5oZXJpdGVkTWV0aG9kLnJldHVyblR5cGUpKSB7Ci0vLwkJCXByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS51bnNhZmVSZXR1cm5UeXBlT3ZlcnJpZGUoY3VycmVudE1ldGhvZCwgb3JpZ2luYWxJbmhlcml0ZWQsIHRoaXMudHlwZSk7Ci0JCWlmIChpbmhlcml0ZWRNZXRob2QucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUGFyYW1ldGVyaXplZFR5cGUoKSAmJiBjdXJyZW50TWV0aG9kLnJldHVyblR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1Jhd1R5cGUoKSkgeworCWlmIChvcmlnaW5hbEluaGVyaXRlZC5yZXR1cm5UeXBlICE9IGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZSkKKwkJaWYgKCFpc0FjY2VwdGFibGVSZXR1cm5UeXBlT3ZlcnJpZGUoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkKIAkJCXByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS51bnNhZmVSZXR1cm5UeXBlT3ZlcnJpZGUoY3VycmVudE1ldGhvZCwgb3JpZ2luYWxJbmhlcml0ZWQsIHRoaXMudHlwZSk7Ci0JCX0gZWxzZSBpZiAoaW5oZXJpdGVkTWV0aG9kLmhhc1N1YnN0aXR1dGVkUmV0dXJuVHlwZSgpICYmIG9yaWdpbmFsSW5oZXJpdGVkLnJldHVyblR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7Ci0JCQlpZiAoKChUeXBlVmFyaWFibGVCaW5kaW5nKSBvcmlnaW5hbEluaGVyaXRlZC5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpLmRlY2xhcmluZ0VsZW1lbnQgPT0gb3JpZ2luYWxJbmhlcml0ZWQpIHsgLy8gc2VlIDgxNjE4IC0gdHlwZSB2YXJpYWJsZSBmcm9tIGluaGVyaXRlZCBtZXRob2QKLQkJCQlUeXBlQmluZGluZyBjdXJyZW50UmV0dXJuVHlwZSA9IGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQkJCWlmICghY3VycmVudFJldHVyblR5cGUuaXNUeXBlVmFyaWFibGUoKSB8fCAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpIGN1cnJlbnRSZXR1cm5UeXBlKS5kZWNsYXJpbmdFbGVtZW50ICE9IGN1cnJlbnRNZXRob2QpCi0JCQkJCXByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS51bnNhZmVSZXR1cm5UeXBlT3ZlcnJpZGUoY3VycmVudE1ldGhvZCwgb3JpZ2luYWxJbmhlcml0ZWQsIHRoaXMudHlwZSk7Ci0JCQl9Ci0JCX0KLQl9CiAKLQlpZiAodGhpcy50eXBlLmFkZFN5bnRoZXRpY0JyaWRnZU1ldGhvZChvcmlnaW5hbEluaGVyaXRlZCwgY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpKSAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsID0gYWxsSW5oZXJpdGVkTWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJJbmhlcml0ZWRNZXRob2QgPSBhbGxJbmhlcml0ZWRNZXRob2RzW2ldOwotCQkJTWV0aG9kQmluZGluZyBvdGhlck9yaWdpbmFsID0gb3RoZXJJbmhlcml0ZWRNZXRob2Qub3JpZ2luYWwoKTsKLQkJCS8vIG9ubHkgY2hlY2sgaW5oZXJpdGVkIG1ldGhvZHMgdGhhdCBhcmUgZGlmZmVyZW50ICYgY29tZSBmcm9tIHNlcGFyYXRlIGluaGVyaXRhbmNlIHBhdGhzCi0JCQlpZiAob3RoZXJPcmlnaW5hbCA9PSBvcmlnaW5hbEluaGVyaXRlZCB8fCBvdGhlck9yaWdpbmFsID09IG90aGVySW5oZXJpdGVkTWV0aG9kKSBjb250aW51ZTsKLQkJCWlmIChpbmhlcml0ZWRNZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKG90aGVySW5oZXJpdGVkTWV0aG9kKSkgY29udGludWU7Ci0JCQkvLyBza2lwIGl0IGlmIG90aGVySW5oZXJpdGVkTWV0aG9kIGlzIGRlZmluZWQgYnkgYSBzdWJ0eXBlIG9mIGluaGVyaXRlZE1ldGhvZCdzIGRlY2xhcmluZ0NsYXNzCi0JCQlpZiAob3RoZXJJbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpICE9IGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpCi0JCQkJaWYgKG90aGVySW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzKSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCWlmIChkZXRlY3RJbmhlcml0ZWROYW1lQ2xhc2gob3JpZ2luYWxJbmhlcml0ZWQsIG90aGVyT3JpZ2luYWwpKQorCU1ldGhvZEJpbmRpbmcgYnJpZGdlID0gdGhpcy50eXBlLmFkZFN5bnRoZXRpY0JyaWRnZU1ldGhvZChvcmlnaW5hbEluaGVyaXRlZCwgY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpKTsKKwlpZiAoYnJpZGdlICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBhbGxJbmhlcml0ZWRNZXRob2RzID09IG51bGwgPyAwIDogYWxsSW5oZXJpdGVkTWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCWlmIChhbGxJbmhlcml0ZWRNZXRob2RzW2ldICE9IG51bGwgJiYgZGV0ZWN0SW5oZXJpdGVkTmFtZUNsYXNoKG9yaWdpbmFsSW5oZXJpdGVkLCBhbGxJbmhlcml0ZWRNZXRob2RzW2ldLm9yaWdpbmFsKCkpKQogCQkJCXJldHVybjsKIAkJfQorCQkvLyBTZWUgaWYgdGhlIG5ldyBicmlkZ2UgY2xhc2hlcyB3aXRoIGFueSBvZiB0aGUgdXNlciBtZXRob2RzIG9mIHRoZSBjbGFzcy4gRm9yIHRoaXMgY2hlY2sKKwkJLy8gd2Ugc2hvdWxkIGNoZWNrIGZvciAibWV0aG9kIGRlc2NyaXB0b3IgY2xhc2giIGFuZCBub3QganVzdCAibWV0aG9kIHNpZ25hdHVyZSBjbGFzaCIuIFJlYWxseQorCQkvLyB3aGF0IHdlIGFyZSBjaGVja2luZyBpcyB3aGV0aGVyIHRoZXJlIGlzIGEgY29udGVudGlvbiBmb3IgdGhlIG1ldGhvZCBkaXNwYXRjaCB0YWJsZSBzbG90LgorCQkvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzYxNS4KKwkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnQgPSAoTWV0aG9kQmluZGluZ1tdKSB0aGlzLmN1cnJlbnRNZXRob2RzLmdldChicmlkZ2Uuc2VsZWN0b3IpOworCQlmb3IgKGludCBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworCQkJZmluYWwgTWV0aG9kQmluZGluZyB0aGlzTWV0aG9kID0gY3VycmVudFtpXTsKKwkJCWlmICh0aGlzTWV0aG9kLmFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwoYnJpZGdlKSAmJiB0aGlzTWV0aG9kLnJldHVyblR5cGUuZXJhc3VyZSgpID09IGJyaWRnZS5yZXR1cm5UeXBlLmVyYXN1cmUoKSkgeworCQkJCS8vIHVzZSBpbmhlcml0ZWQgbWV0aG9kIGZvciBwcm9ibGVtIHJlcG9ydGluZy4KKwkJCQlwcm9ibGVtUmVwb3J0ZXIodGhpc01ldGhvZCkubWV0aG9kTmFtZUNsYXNoKHRoaXNNZXRob2QsIGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSA/IGluaGVyaXRlZE1ldGhvZCA6IGluaGVyaXRlZE1ldGhvZC5vcmlnaW5hbCgpLCBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcik7CisJCQkJcmV0dXJuOwkKKwkJCX0KKwkJfQogCX0KIH0KIHZvaWQgY2hlY2tGb3JOYW1lQ2xhc2goTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgewpAQCAtMTk4LDkgKzIzMSw5IEBACiAJLy8JCWNsYXNzIEEgaW1wbGVtZW50cyBJPEludGVnZXI+IHsgcHVibGljIHZvaWQgdGVzdChJbnRlZ2VyIGkpIHt9IH0KIAkvLwkJY2xhc3MgQiBleHRlbmRzIEEgeyBwdWJsaWMgdm9pZCB0ZXN0KENvbXBhcmFibGUgaSkge30gfQogCi0JaWYgKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSB8fCBjdXJyZW50TWV0aG9kLmlzU3RhdGljKCkpIHJldHVybjsKKwlpZiAoaW5oZXJpdGVkTWV0aG9kLmlzU3RhdGljKCkpIHJldHVybjsKIAotCWlmICghZGV0ZWN0TmFtZUNsYXNoKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkpIHsgLy8gY2hlY2sgdXAgdGhlIGhpZXJhcmNoeSBmb3Igc2tpcHBlZCBpbmhlcml0ZWQgbWV0aG9kcworCWlmICghZGV0ZWN0TmFtZUNsYXNoKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCwgZmFsc2UpKSB7IC8vIGNoZWNrIHVwIHRoZSBoaWVyYXJjaHkgZm9yIHNraXBwZWQgaW5oZXJpdGVkIG1ldGhvZHMKIAkJVHlwZUJpbmRpbmdbXSBjdXJyZW50UGFyYW1zID0gY3VycmVudE1ldGhvZC5wYXJhbWV0ZXJzOwogCQlUeXBlQmluZGluZ1tdIGluaGVyaXRlZFBhcmFtcyA9IGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzOwogCQlpbnQgbGVuZ3RoID0gY3VycmVudFBhcmFtcy5sZW5ndGg7CkBAIC0yMjQsNyArMjU3LDcgQEAKIAkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gc3VwZXJUeXBlLmdldE1ldGhvZHMoY3VycmVudE1ldGhvZC5zZWxlY3Rvcik7CiAJCQlmb3IgKGludCBtID0gMCwgbiA9IG1ldGhvZHMubGVuZ3RoOyBtIDwgbjsgbSsrKSB7CiAJCQkJTWV0aG9kQmluZGluZyBzdWJzdGl0dXRlID0gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QobWV0aG9kc1ttXSwgY3VycmVudE1ldGhvZCk7Ci0JCQkJaWYgKHN1YnN0aXR1dGUgIT0gbnVsbCAmJiAhZG9lc1N1YnN0aXR1dGVNZXRob2RPdmVycmlkZShjdXJyZW50TWV0aG9kLCBzdWJzdGl0dXRlKSAmJiBkZXRlY3ROYW1lQ2xhc2goY3VycmVudE1ldGhvZCwgc3Vic3RpdHV0ZSkpCisJCQkJaWYgKHN1YnN0aXR1dGUgIT0gbnVsbCAmJiAhaXNTdWJzdGl0dXRlUGFyYW1ldGVyU3Vic2lnbmF0dXJlKGN1cnJlbnRNZXRob2QsIHN1YnN0aXR1dGUpICYmIGRldGVjdE5hbWVDbGFzaChjdXJyZW50TWV0aG9kLCBzdWJzdGl0dXRlLCB0cnVlKSkKIAkJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKChpdHNJbnRlcmZhY2VzID0gc3VwZXJUeXBlLnN1cGVySW50ZXJmYWNlcygpKSAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewpAQCAtMjUyLDcgKzI4NSw3IEBACiAJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBzdXBlclR5cGUuZ2V0TWV0aG9kcyhjdXJyZW50TWV0aG9kLnNlbGVjdG9yKTsKIAkJCQlmb3IgKGludCBtID0gMCwgbiA9IG1ldGhvZHMubGVuZ3RoOyBtIDwgbjsgbSsrKXsKIAkJCQkJTWV0aG9kQmluZGluZyBzdWJzdGl0dXRlID0gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QobWV0aG9kc1ttXSwgY3VycmVudE1ldGhvZCk7Ci0JCQkJCWlmIChzdWJzdGl0dXRlICE9IG51bGwgJiYgIWRvZXNTdWJzdGl0dXRlTWV0aG9kT3ZlcnJpZGUoY3VycmVudE1ldGhvZCwgc3Vic3RpdHV0ZSkgJiYgZGV0ZWN0TmFtZUNsYXNoKGN1cnJlbnRNZXRob2QsIHN1YnN0aXR1dGUpKQorCQkJCQlpZiAoc3Vic3RpdHV0ZSAhPSBudWxsICYmICFpc1N1YnN0aXR1dGVQYXJhbWV0ZXJTdWJzaWduYXR1cmUoY3VycmVudE1ldGhvZCwgc3Vic3RpdHV0ZSkgJiYgZGV0ZWN0TmFtZUNsYXNoKGN1cnJlbnRNZXRob2QsIHN1YnN0aXR1dGUsIHRydWUpKQogCQkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCQlpZiAoKGl0c0ludGVyZmFjZXMgPSBzdXBlclR5cGUuc3VwZXJJbnRlcmZhY2VzKCkpICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CkBAIC0yNzEsMTYgKzMwNCw2IEBACiAJfQogfQogdm9pZCBjaGVja0luaGVyaXRlZE1ldGhvZHMoTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QsIE1ldGhvZEJpbmRpbmcgb3RoZXJJbmhlcml0ZWRNZXRob2QpIHsKLQkvLyBzZW50IGZyb20gY2hlY2tNZXRob2RzKCkgdG8gY29tcGFyZSAyIGluaGVyaXRlZCBtZXRob2RzIHRoYXQgYXJlIG5vdCAnZXF1YWwnCi0JaWYgKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkgPT0gb3RoZXJJbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpKSB7Ci0JCWlmIChpbmhlcml0ZWRNZXRob2QuYXJlUGFyYW1ldGVyRXJhc3VyZXNFcXVhbChvdGhlckluaGVyaXRlZE1ldGhvZCkpIHsKLQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUluaGVyaXRlZE1ldGhvZHModGhpcy50eXBlLCBpbmhlcml0ZWRNZXRob2QsIG90aGVySW5oZXJpdGVkTWV0aG9kKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSBpZiAoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUob3RoZXJJbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MpICE9IG51bGwpIHsKLQkJLy8gc2tpcCBpdCBpZiBpbmhlcml0ZWRNZXRob2QgaXMgZGVmaW5lZCBieSBhIHN1YnR5cGUgb2Ygb3RoZXJJbmhlcml0ZWRNZXRob2QgZGVjbGFyaW5nQ2xhc3MKLQkJcmV0dXJuOwotCX0KIAogCS8vIHRoZSAyIGluaGVyaXRlZCBtZXRob2RzIGNsYXNoIGJlY2F1c2Ugb2YgYSBwYXJhbWV0ZXJpemVkIHR5cGUgb3ZlcnJpZGVzIGEgcmF3IHR5cGUKIAkvLwkJaW50ZXJmYWNlIEkgeyB2b2lkIGZvbyhBIGEpOyB9CkBAIC0yOTYsMTE2ICszMTksMTYxIEBACiAKIAlkZXRlY3RJbmhlcml0ZWROYW1lQ2xhc2goaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCksIG90aGVySW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCkpOwogfQorLy8gOC40LjguNAogdm9pZCBjaGVja0luaGVyaXRlZE1ldGhvZHMoTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKLQlpbnQgY291bnQgPSBsZW5ndGg7Ci0JaW50W10gc2tpcCA9IG5ldyBpbnRbY291bnRdOwotCW5leHRNZXRob2QgOiBmb3IgKGludCBpID0gMCwgbCA9IGxlbmd0aCAtIDE7IGkgPCBsOyBpKyspIHsKLQkJaWYgKHNraXBbaV0gPT0gLTEpIGNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJTWV0aG9kQmluZGluZ1tdIGR1cGxpY2F0ZXMgPSBudWxsOwotCQlmb3IgKGludCBqID0gaSArIDE7IGogPD0gbDsgaisrKSB7Ci0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZDIgPSBtZXRob2RzW2pdOwotCQkJaWYgKG1ldGhvZC5kZWNsYXJpbmdDbGFzcyA9PSBtZXRob2QyLmRlY2xhcmluZ0NsYXNzICYmIGFyZU1ldGhvZHNDb21wYXRpYmxlKG1ldGhvZCwgbWV0aG9kMikpIHsKLQkJCQlza2lwW2pdID0gLTE7Ci0JCQkJaWYgKGR1cGxpY2F0ZXMgPT0gbnVsbCkKLQkJCQkJZHVwbGljYXRlcyA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF07Ci0JCQkJZHVwbGljYXRlc1tqXSA9IG1ldGhvZDI7CisJYm9vbGVhbiBjb250aW51ZUludmVzdGlnYXRpb24gPSB0cnVlOworCU1ldGhvZEJpbmRpbmcgY29uY3JldGVNZXRob2QgPSBudWxsOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKCFtZXRob2RzW2ldLmlzQWJzdHJhY3QoKSkgeworCQkJaWYgKGNvbmNyZXRlTWV0aG9kICE9IG51bGwpIHsKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbmhlcml0ZWRNZXRob2RzKHRoaXMudHlwZSwgY29uY3JldGVNZXRob2QsIG1ldGhvZHNbaV0pOworCQkJCWNvbnRpbnVlSW52ZXN0aWdhdGlvbiA9IGZhbHNlOwogCQkJfQotCQl9Ci0JCWlmIChkdXBsaWNhdGVzICE9IG51bGwpIHsKLQkJCS8vIGZvdW5kIGFuIGluaGVyaXRlZCBQYXJhbWV0ZXJpemVkVHlwZSB0aGF0IGRlZmluZXMgZHVwbGljYXRlIG1ldGhvZHMKLQkJCS8vIGlmIGFsbCBtZXRob2RzIGFyZSBhYnN0cmFjdCBvciBtb3JlIHRoYW4gMSBjb25jcmV0ZSBtZXRob2QgZXhpc3RzLCB0aGVuIGNvbnNpZGVyIHRoZW0gdG8gYmUgZHVwbGljYXRlcwotCQkJLy8gaWYgYSBzaW5nbGUgY29uY3JldGUgbWV0aG9kICdpbXBsZW1lbnRzJyB0aGUgYWJzdHJhY3QgbWV0aG9kcywgdGhlbiBkbyBub3QgcmVwb3J0IGEgZHVwbGljYXRlIGVycm9yCi0JCQlpbnQgY29uY3JldGVDb3VudCA9IG1ldGhvZC5pc0Fic3RyYWN0KCkgPyAwIDogMTsKLQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kVG9LZWVwID0gbWV0aG9kOyAvLyBpZiBhIGNvbmNyZXRlIG1ldGhvZCBleGlzdHMsIGtlZXAgaXQsIG90aGVyd2lzZSBrZWVwIHRoZSBmaXJzdCBtZXRob2QKLQkJCWZvciAoaW50IG0gPSAwLCBzID0gZHVwbGljYXRlcy5sZW5ndGg7IG0gPCBzOyBtKyspIHsKLQkJCQlpZiAoZHVwbGljYXRlc1ttXSAhPSBudWxsKSB7Ci0JCQkJCWlmICghZHVwbGljYXRlc1ttXS5pc0Fic3RyYWN0KCkpIHsKLQkJCQkJCW1ldGhvZFRvS2VlcCA9IGR1cGxpY2F0ZXNbbV07Ci0JCQkJCQljb25jcmV0ZUNvdW50Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29uY3JldGVDb3VudCAhPSAxKSB7Ci0JCQkJZm9yIChpbnQgbSA9IDAsIHMgPSBkdXBsaWNhdGVzLmxlbmd0aDsgbSA8IHM7IG0rKykgewotCQkJCQlpZiAoZHVwbGljYXRlc1ttXSAhPSBudWxsKSB7Ci0JCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbmhlcml0ZWRNZXRob2RzKHRoaXMudHlwZSwgbWV0aG9kLCBkdXBsaWNhdGVzW21dKTsKLQkJCQkJCWNvdW50LS07Ci0JCQkJCQlpZiAobWV0aG9kVG9LZWVwID09IGR1cGxpY2F0ZXNbbV0pCi0JCQkJCQkJbWV0aG9kc1tpXSA9IG51bGw7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbWV0aG9kc1ttXSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisJCQljb25jcmV0ZU1ldGhvZCA9IG1ldGhvZHNbaV07CiAJCX0KIAl9Ci0JaWYgKGNvdW50IDwgbGVuZ3RoKSB7Ci0JCWlmIChjb3VudCA9PSAxKSByZXR1cm47IC8vIG5vIG5lZWQgdG8gY29udGludWUgc2luY2Ugb25seSAxIGluaGVyaXRlZCBtZXRob2QgaXMgbGVmdAotCQlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KQotCQkJaWYgKG1ldGhvZHNbaV0gIT0gbnVsbCkKLQkJCQluZXdNZXRob2RzWy0tY291bnRdID0gbWV0aG9kc1tpXTsKLQkJbWV0aG9kcyA9IG5ld01ldGhvZHM7Ci0JCWxlbmd0aCA9IG5ld01ldGhvZHMubGVuZ3RoOworCWlmIChjb250aW51ZUludmVzdGlnYXRpb24pIHsKKwkJc3VwZXIuY2hlY2tJbmhlcml0ZWRNZXRob2RzKG1ldGhvZHMsIGxlbmd0aCk7CiAJfQotCi0Jc3VwZXIuY2hlY2tJbmhlcml0ZWRNZXRob2RzKG1ldGhvZHMsIGxlbmd0aCk7CiB9Ci1ib29sZWFuIGNoZWNrSW5oZXJpdGVkUmV0dXJuVHlwZXMoTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKLQkvLyBhc3N1bWVzIGxlbmd0aCA+IDEKLQkvLyBpdHMgcG9zc2libGUgaW4gMS41IHRoYXQgQSBpcyBjb21wYXRpYmxlIHdpdGggQiAmIEMsIGJ1dCBCIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQwotCWludFtdIGFyZUluY29tcGF0aWJsZSA9IG51bGw7Ci0JLy8gYWJzdHJhY3QgY2xhc3NlcyBtdXN0IGNoZWNrIGV2ZXJ5IG1ldGhvZCBhZ2FpbnN0IGVhY2ggb3RoZXIKLQlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMudHlwZS5pc0Fic3RyYWN0KCkgPyBsZW5ndGggLSAyIDogMDsgaSA8PSBsOykgewotCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaSsrXTsKLQkJbmV4dE1ldGhvZCA6IGZvciAoaW50IGogPSBpOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCWlmICghYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlKG1ldGhvZCwgbWV0aG9kc1tqXSkpIHsKLQkJCQlpZiAodGhpcy50eXBlLmlzSW50ZXJmYWNlKCkpCi0JCQkJCWZvciAoaW50IG0gPSBsZW5ndGg7IC0tbSA+PSAwOykKLQkJCQkJCWlmIChtZXRob2RzW21dLmRlY2xhcmluZ0NsYXNzLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCkKLQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOyAvLyBkbyBub3QgY29tcGxhaW4gc2luY2UgdGhlIHN1cGVyIGludGVyZmFjZSBhbHJlYWR5IGdvdCBibGFtZWQKLQkJCQkvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBqdXN0IGEgd2FybmluZywgaWYgc28gcmVwb3J0IGl0ICYgc2tpcCB0byBuZXh0IG1ldGhvZAotCQkJCWlmIChpc1Vuc2FmZVJldHVyblR5cGVPdmVycmlkZShtZXRob2QsIG1ldGhvZHNbal0pKSB7Ci0JCQkJCXByb2JsZW1SZXBvcnRlcihtZXRob2QpLnVuc2FmZVJldHVyblR5cGVPdmVycmlkZShtZXRob2QsIG1ldGhvZHNbal0sIHRoaXMudHlwZSk7Ci0JCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCQkJfQotCQkJCWlmIChhcmVJbmNvbXBhdGlibGUgPT0gbnVsbCkKLQkJCQkJYXJlSW5jb21wYXRpYmxlID0gbmV3IGludFtsZW5ndGhdOwotCQkJCWFyZUluY29tcGF0aWJsZVtpIC0gMV0gPSAtMTsKLQkJCQlhcmVJbmNvbXBhdGlibGVbal0gPSAtMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoYXJlSW5jb21wYXRpYmxlID09IG51bGwpCi0JCXJldHVybiB0cnVlOworYm9vbGVhbiBjaGVja0luaGVyaXRlZFJldHVyblR5cGVzKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kKSB7CisJaWYgKGFyZVJldHVyblR5cGVzQ29tcGF0aWJsZShtZXRob2QsIG90aGVyTWV0aG9kKSkgcmV0dXJuIHRydWU7CiAKLQlpbnQgY291bnQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmIChhcmVJbmNvbXBhdGlibGVbaV0gPT0gLTEpIGNvdW50Kys7Ci0JaWYgKGNvdW50ID09IGxlbmd0aCkgewotCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbmhlcml0ZWRNZXRob2RzSGF2ZUluY29tcGF0aWJsZVJldHVyblR5cGVzKHRoaXMudHlwZSwgbWV0aG9kcywgbGVuZ3RoKTsKLQkJcmV0dXJuIGZhbHNlOworCS8qIFdlIHVzZWQgdG8gaGF2ZSBzb21lIGNoZWNrcyBoZXJlIHRvIHNlZSBpZiB3ZSB3b3VsZCBoYXZlIGFscmVhZHkgYmxhbWVkIHRoZSBzdXBlciB0eXBlIGFuZCBpZiBzbyBhdm9pZCBibGFtaW5nCisJICAgdGhlIGN1cnJlbnQgdHlwZSBhZ2Fpbi4gSSBoYXZlIGdvdHRlbiByaWQgb2YgdGhlbSBhcyB0aGV5IGluIGZhY3Qgc2hvcnQgY2lyY3VpdCBlcnJvciByZXBvcnRpbmcgaW4gY2FzZXMgd2hlcmUKKwkgICB0aGV5IHNob3VsZCBub3QuIFRoaXMgbWVhbnMgdGhhdCBvY2Nhc2lvbmFsbHkgd2Ugd291bGQgcmVwb3J0IHRoZSBlcnJvciB0d2ljZSAtIHRoZSBkaWFnbm9zdGljcyBpcyB2YWxpZCBob3dldmVyLAorCSAgIGFsYmVpdCBhcmd1YWJseSByZWR1bmRhbnQuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MzEzLiBGb3IgYW4gZXhhbXBsZSBvZiBhIHRlc3QKKwkgICB3aGVyZSB3ZSBkbyB0aGlzIGV4dHJhIHJlcG9ydGluZyBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbi5NZXRob2RWZXJpZnlUZXN0LnRlc3QxNTkoKQorCSAqLworCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGp1c3QgYSB3YXJuaW5nLCBpZiBzbyByZXBvcnQgaXQgJiBza2lwIHRvIG5leHQgbWV0aG9kCisJaWYgKGlzVW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKG1ldGhvZCwgb3RoZXJNZXRob2QpKSB7CisJCWlmICghbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MsIGZhbHNlKSkKKwkJCXByb2JsZW1SZXBvcnRlcihtZXRob2QpLnVuc2FmZVJldHVyblR5cGVPdmVycmlkZShtZXRob2QsIG90aGVyTWV0aG9kLCB0aGlzLnR5cGUpOworCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JTWV0aG9kQmluZGluZ1tdIG1ldGhvZHNUb1JlcG9ydCA9IG5ldyBNZXRob2RCaW5kaW5nW2NvdW50XTsKLQlmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmIChhcmVJbmNvbXBhdGlibGVbaV0gPT0gLTEpCi0JCQltZXRob2RzVG9SZXBvcnRbaW5kZXgrK10gPSBtZXRob2RzW2ldOwotCXByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZHNIYXZlSW5jb21wYXRpYmxlUmV0dXJuVHlwZXModGhpcy50eXBlLCBtZXRob2RzVG9SZXBvcnQsIGNvdW50KTsKKwogCXJldHVybiBmYWxzZTsKIH0KKwordm9pZCByZXBvcnRSYXdSZWZlcmVuY2VzKCkgeworCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSB0aGlzLnR5cGUuc2NvcGUuY29tcGlsZXJPcHRpb25zKCk7CisJaWYgKGNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgLy8gc2hvdWxkbid0IHdoaW5lIGF0IGFsbAorCQkJfHwgY29tcGlsZXJPcHRpb25zLnJlcG9ydFVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcykgeyAvLyBtdXN0IGhhdmUgYWxyZWFkeSB3aGluZWQgCisJCXJldHVybjsKKwl9CisJLyogQ29kZSBiZWxvdyBpcyBvbmx5IGZvciBhIG1ldGhvZCB0aGF0IGRvZXMgbm90IG92ZXJyaWRlL2ltcGxlbWVudCBhIHN1cGVyIHR5cGUgbWV0aG9kLiBJZiBpdCB3ZXJlIHRvLAorCSAgIGl0IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGluIGNoZWNrQWdhaW5zdEluaGVyaXRlZE1ldGhvZHMuCisJKi8KKwlPYmplY3QgW10gbWV0aG9kQXJyYXkgPSB0aGlzLmN1cnJlbnRNZXRob2RzLnZhbHVlVGFibGU7CisJZm9yIChpbnQgcyA9IG1ldGhvZEFycmF5Lmxlbmd0aDsgLS1zID49IDA7KSB7CisJCWlmIChtZXRob2RBcnJheVtzXSA9PSBudWxsKSBjb250aW51ZTsKKwkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnQgPSAoTWV0aG9kQmluZGluZ1tdKSBtZXRob2RBcnJheVtzXTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGN1cnJlbnQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCU1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCA9IGN1cnJlbnRbaV07CisJCQlpZiAoKGN1cnJlbnRNZXRob2QubW9kaWZpZXJzICYgKEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSW1wbGVtZW50aW5nIHwgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NPdmVycmlkaW5nKSkgPT0gMCkgeworCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IGN1cnJlbnRNZXRob2Quc291cmNlTWV0aG9kKCk7CisJCQkJaWYgKG1ldGhvZERlY2wgPT0gbnVsbCkgcmV0dXJuOworCQkJCVR5cGVCaW5kaW5nIFtdIHBhcmFtZXRlclR5cGVzID0gY3VycmVudE1ldGhvZC5wYXJhbWV0ZXJzOworCQkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbC5hcmd1bWVudHM7CisJCQkJZm9yIChpbnQgaiA9IDAsIHNpemUgPSBjdXJyZW50TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyBqIDwgc2l6ZTsgaisrKSB7CisJCQkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tqXTsKKwkJCQkJQXJndW1lbnQgYXJnID0gYXJndW1lbnRzW2pdOworCQkJCQlpZiAocGFyYW1ldGVyVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpCisJCQkJCQkmJiBjb21waWxlck9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2UpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZQorCQkJICAgICAgCQkmJiAoYXJnLnR5cGUuYml0cyAmIEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrKSA9PSAwKSB7CisJCQkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJhd1R5cGVSZWZlcmVuY2UoYXJnLnR5cGUsIHBhcmFtZXRlclR5cGUpOworCQkJICAgIAl9CisJCQkJfQorCQkJCWlmICghbWV0aG9kRGVjbC5pc0NvbnN0cnVjdG9yKCkgJiYgbWV0aG9kRGVjbCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkJCVR5cGVSZWZlcmVuY2UgcmV0dXJuVHlwZSA9ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2wpLnJldHVyblR5cGU7CisJCQkJCVR5cGVCaW5kaW5nIG1ldGhvZFR5cGUgPSBjdXJyZW50TWV0aG9kLnJldHVyblR5cGU7CisJCQkJCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKKwkJCQkJCWlmIChtZXRob2RUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkKKwkJCQkJCQkJJiYgY29tcGlsZXJPcHRpb25zLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5SYXdUeXBlUmVmZXJlbmNlKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUKKwkJCQkJCQkJJiYgKHJldHVyblR5cGUuYml0cyAmIEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrKSA9PSAwKSB7CisJCQkJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yYXdUeXBlUmVmZXJlbmNlKHJldHVyblR5cGUsIG1ldGhvZFR5cGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorcHVibGljIHZvaWQgcmVwb3J0UmF3UmVmZXJlbmNlcyhNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IHRoaXMudHlwZS5zY29wZS5jb21waWxlck9wdGlvbnMoKTsKKwlpZiAoY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvLyBzaG91bGRuJ3Qgd2hpbmUgYXQgYWxsCisJCQl8fCBjb21waWxlck9wdGlvbnMucmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zKSB7IC8vIG11c3QgaGF2ZSBhbHJlYWR5IHdoaW5lZCAKKwkJcmV0dXJuOworCX0KKwlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBjdXJyZW50TWV0aG9kLnNvdXJjZU1ldGhvZCgpOworCWlmIChtZXRob2REZWNsID09IG51bGwpIHJldHVybjsKKwlUeXBlQmluZGluZyBbXSBwYXJhbWV0ZXJUeXBlcyA9IGN1cnJlbnRNZXRob2QucGFyYW1ldGVyczsKKwlUeXBlQmluZGluZyBbXSBpbmhlcml0ZWRQYXJhbWV0ZXJUeXBlcyA9IGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzOworCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbC5hcmd1bWVudHM7CisJZm9yIChpbnQgaiA9IDAsIHNpemUgPSBjdXJyZW50TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyBqIDwgc2l6ZTsgaisrKSB7CisJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tqXTsKKwkJVHlwZUJpbmRpbmcgaW5oZXJpdGVkUGFyYW1ldGVyVHlwZSA9IGluaGVyaXRlZFBhcmFtZXRlclR5cGVzW2pdOworCQlBcmd1bWVudCBhcmcgPSBhcmd1bWVudHNbal07CisJCWlmIChwYXJhbWV0ZXJUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkpIHsKKwkJCWlmIChpbmhlcml0ZWRQYXJhbWV0ZXJUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkpIHsKKwkJCQlhcmcuYmluZGluZy50YWdCaXRzIHw9IFRhZ0JpdHMuRm9yY2VkVG9CZVJhd1R5cGU7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb21waWxlck9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2UpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZQorCQkJCQkJJiYgKGFyZy50eXBlLmJpdHMgJiBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjaykgPT0gMCkgeworCQkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJhd1R5cGVSZWZlcmVuY2UoYXJnLnR5cGUsIHBhcmFtZXRlclR5cGUpOworCQkJCX0KKwkJCX0KKyAgICAJfQorICAgIH0KKwlUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUgPSBudWxsOworCWlmICghbWV0aG9kRGVjbC5pc0NvbnN0cnVjdG9yKCkgJiYgbWV0aG9kRGVjbCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICYmIChyZXR1cm5UeXBlID0gKChNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbCkucmV0dXJuVHlwZSkgIT0gbnVsbCkgeworCQlmaW5hbCBUeXBlQmluZGluZyBpbmhlcml0ZWRNZXRob2RUeXBlID0gaW5oZXJpdGVkTWV0aG9kLnJldHVyblR5cGU7CisJCWZpbmFsIFR5cGVCaW5kaW5nIG1ldGhvZFR5cGUgPSBjdXJyZW50TWV0aG9kLnJldHVyblR5cGU7CisJCWlmIChtZXRob2RUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkpIHsKKwkJCWlmIChpbmhlcml0ZWRNZXRob2RUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkpIHsKKwkJCQkvLyAKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChyZXR1cm5UeXBlLmJpdHMgJiBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjaykgPT0gMAorCQkJCQkJJiYgY29tcGlsZXJPcHRpb25zLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5SYXdUeXBlUmVmZXJlbmNlKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHsKKwkJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yYXdUeXBlUmVmZXJlbmNlKHJldHVyblR5cGUsIG1ldGhvZFR5cGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyB9CisKIHZvaWQgY2hlY2tNZXRob2RzKCkgewogCWJvb2xlYW4gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyA9IG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKTsKIAlib29sZWFuIHNraXBJbmhlcml0ZWRNZXRob2RzID0gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyAmJiBjYW5Ta2lwSW5oZXJpdGVkTWV0aG9kcygpOyAvLyBoYXZlIGEgc2luZ2xlIGNvbmNyZXRlIHN1cGVyY2xhc3Mgc28gb25seSBjaGVjayBvdmVycmlkZGVuIG1ldGhvZHMKKwlib29sZWFuIGlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUgPSB0aGlzLnR5cGUuaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpOwogCWNoYXJbXVtdIG1ldGhvZFNlbGVjdG9ycyA9IHRoaXMuaW5oZXJpdGVkTWV0aG9kcy5rZXlUYWJsZTsKIAluZXh0U2VsZWN0b3IgOiBmb3IgKGludCBzID0gbWV0aG9kU2VsZWN0b3JzLmxlbmd0aDsgLS1zID49IDA7KSB7CiAJCWlmIChtZXRob2RTZWxlY3RvcnNbc10gPT0gbnVsbCkgY29udGludWUgbmV4dFNlbGVjdG9yOwogCiAJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50ID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5jdXJyZW50TWV0aG9kcy5nZXQobWV0aG9kU2VsZWN0b3JzW3NdKTsKKwkJTWV0aG9kQmluZGluZ1tdIGluaGVyaXRlZCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuaW5oZXJpdGVkTWV0aG9kcy52YWx1ZVRhYmxlW3NdOworCQkKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjY2MCwgaWYgY3VycmVudCB0eXBlIGlzIGV4cG9zZWQsCisJCS8vIGluaGVyaXRlZCBtZXRob2RzIG9mIHN1cGVyIGNsYXNzZXMgYXJlIHRvby4gY3VycmVudCAhPSBudWxsIGNhc2UgaGFuZGxlZCBiZWxvdy4KKwkJaWYgKGN1cnJlbnQgPT0gbnVsbCAmJiAhaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSkgeworCQkJaW50IGxlbmd0aCA9IGluaGVyaXRlZC5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCQlpbmhlcml0ZWRbaV0ub3JpZ2luYWwoKS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsKKwkJCX0KKwkJfQorCQlpZiAoY3VycmVudCA9PSBudWxsICYmIHRoaXMudHlwZS5pc1B1YmxpYygpKSB7CisJCQlpbnQgbGVuZ3RoID0gaW5oZXJpdGVkLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IGluaGVyaXRlZFtpXTsKKwkJCQlpZiAoaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkgJiYgIWluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1B1YmxpYygpKQorCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIpKSAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzMDYwCisJCQkJCQl0aGlzLnR5cGUuYWRkU3ludGhldGljQnJpZGdlTWV0aG9kKGluaGVyaXRlZE1ldGhvZC5vcmlnaW5hbCgpKTsKKwkJCX0KKwkJfQorCiAJCWlmIChjdXJyZW50ID09IG51bGwgJiYgc2tpcEluaGVyaXRlZE1ldGhvZHMpCiAJCQljb250aW51ZSBuZXh0U2VsZWN0b3I7CiAKLQkJTWV0aG9kQmluZGluZ1tdIGluaGVyaXRlZCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuaW5oZXJpdGVkTWV0aG9kcy52YWx1ZVRhYmxlW3NdOwogCQlpZiAoaW5oZXJpdGVkLmxlbmd0aCA9PSAxICYmIGN1cnJlbnQgPT0gbnVsbCkgeyAvLyBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlCiAJCQlpZiAobXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyAmJiBpbmhlcml0ZWRbMF0uaXNBYnN0cmFjdCgpKQogCQkJCWNoZWNrQWJzdHJhY3RNZXRob2QoaW5oZXJpdGVkWzBdKTsKQEAgLTQxMywxOSArNDgxLDI3IEBACiAJCX0KIAogCQlpbnQgaW5kZXggPSAtMTsKLQkJTWV0aG9kQmluZGluZ1tdIG1hdGNoaW5nSW5oZXJpdGVkID0gbmV3IE1ldGhvZEJpbmRpbmdbaW5oZXJpdGVkLmxlbmd0aF07Ci0JCWJ5dGVbXSBmb3VuZE1hdGNoID0gbmV3IGJ5dGVbaW5oZXJpdGVkLmxlbmd0aF07CisJCWludCBpbmhlcml0ZWRMZW5ndGggPSBpbmhlcml0ZWQubGVuZ3RoOworCQlNZXRob2RCaW5kaW5nW10gbWF0Y2hpbmdJbmhlcml0ZWQgPSBuZXcgTWV0aG9kQmluZGluZ1tpbmhlcml0ZWRMZW5ndGhdOworCQlNZXRob2RCaW5kaW5nW10gZm91bmRNYXRjaCA9IG5ldyBNZXRob2RCaW5kaW5nW2luaGVyaXRlZExlbmd0aF07IC8vIG51bGwgaXMgbm8gbWF0Y2gsIG90aGVyd2lzZSB2YWx1ZSBpcyBtYXRjaGluZyBjdXJyZW50TWV0aG9kCiAJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGgxID0gY3VycmVudC5sZW5ndGg7IGkgPCBsZW5ndGgxOyBpKyspIHsKIAkJCQlNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QgPSBjdXJyZW50W2ldOwotCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gaW5oZXJpdGVkLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgeworCQkJCU1ldGhvZEJpbmRpbmdbXSBub25NYXRjaGluZ0luaGVyaXRlZCA9IG51bGw7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmhlcml0ZWRMZW5ndGg7IGorKykgewogCQkJCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IGNvbXB1dGVTdWJzdGl0dXRlTWV0aG9kKGluaGVyaXRlZFtqXSwgY3VycmVudE1ldGhvZCk7CiAJCQkJCWlmIChpbmhlcml0ZWRNZXRob2QgIT0gbnVsbCkgewotCQkJCQkJaWYgKGZvdW5kTWF0Y2hbal0gPT0gMCAmJiBkb2VzU3Vic3RpdHV0ZU1ldGhvZE92ZXJyaWRlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkpIHsKKwkJCQkJCWlmIChmb3VuZE1hdGNoW2pdID09IG51bGwgJiYgaXNTdWJzdGl0dXRlUGFyYW1ldGVyU3Vic2lnbmF0dXJlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCkpIHsKIAkJCQkJCQltYXRjaGluZ0luaGVyaXRlZFsrK2luZGV4XSA9IGluaGVyaXRlZE1ldGhvZDsKLQkJCQkJCQlmb3VuZE1hdGNoW2pdID0gMTsgLy8gY2Fubm90IG51bGwgb3V0IGluaGVyaXRlZCBtZXRob2RzCisJCQkJCQkJZm91bmRNYXRjaFtqXSA9IGN1cnJlbnRNZXRob2Q7CiAJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGJlc3QgcGxhY2UgdG8gY2hlY2sgZWFjaCBjdXJyZW50TWV0aG9kIGFnYWluc3QgZWFjaCBub24tbWF0Y2hpbmcgaW5oZXJpdGVkTWV0aG9kCiAJCQkJCQkJY2hlY2tGb3JOYW1lQ2xhc2goY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKKwkJCQkJCQlpZiAoaW5oZXJpdGVkTGVuZ3RoID4gMSkgeworCQkJCQkJCQlpZiAobm9uTWF0Y2hpbmdJbmhlcml0ZWQgPT0gbnVsbCkKKwkJCQkJCQkJCW5vbk1hdGNoaW5nSW5oZXJpdGVkID0gbmV3IE1ldGhvZEJpbmRpbmdbaW5oZXJpdGVkTGVuZ3RoXTsKKwkJCQkJCQkJbm9uTWF0Y2hpbmdJbmhlcml0ZWRbal0gPSBpbmhlcml0ZWRNZXRob2Q7CisJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQpAQCAtNDMzLDI4ICs1MDksNjIgQEAKIAkJCQkJLy8gc2VlIGFkZHRpb25hbCBjb21tZW50cyBpbiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyODgxCiAJCQkJCS8vIGlmIChpbmRleCA+IDAgJiYgY3VycmVudE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSAvLyBvbmx5IGNoZWNrIHdoZW4gaW5oZXJpdGVkIG1ldGhvZHMgYXJlIGZyb20gaW50ZXJmYWNlcwogCQkJCQkvLwljaGVja0luaGVyaXRlZFJldHVyblR5cGVzKG1hdGNoaW5nSW5oZXJpdGVkLCBpbmRleCArIDEpOwotCQkJCQljaGVja0FnYWluc3RJbmhlcml0ZWRNZXRob2RzKGN1cnJlbnRNZXRob2QsIG1hdGNoaW5nSW5oZXJpdGVkLCBpbmRleCArIDEsIGluaGVyaXRlZCk7IC8vIHBhc3MgaW4gdGhlIGxlbmd0aCBvZiBtYXRjaGluZworCQkJCQljaGVja0FnYWluc3RJbmhlcml0ZWRNZXRob2RzKGN1cnJlbnRNZXRob2QsIG1hdGNoaW5nSW5oZXJpdGVkLCBpbmRleCArIDEsIG5vbk1hdGNoaW5nSW5oZXJpdGVkKTsgLy8gcGFzcyBpbiB0aGUgbGVuZ3RoIG9mIG1hdGNoaW5nCiAJCQkJCXdoaWxlIChpbmRleCA+PSAwKSBtYXRjaGluZ0luaGVyaXRlZFtpbmRleC0tXSA9IG51bGw7IC8vIGNsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kcwogCQkJCX0KIAkJCX0KIAkJfQogCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBpbmhlcml0ZWQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmb3VuZE1hdGNoW2ldID09IDEpIGNvbnRpbnVlOwotCisJCS8vIHNraXAgdHJhY2tzIHdoaWNoIGluaGVyaXRlZCBtZXRob2RzIGhhdmUgbWF0Y2hlZCBvdGhlciBpbmhlcml0ZWQgbWV0aG9kcworCQkvLyBlaXRoZXIgYmVjYXVzZSB0aGV5IG1hdGNoIHRoZSBzYW1lIGN1cnJlbnRNZXRob2Qgb3IgbWF0Y2ggZWFjaCBvdGhlcgorCQlib29sZWFuW10gc2tpcCA9IG5ldyBib29sZWFuW2luaGVyaXRlZExlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5oZXJpdGVkTGVuZ3RoOyBpKyspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWF0Y2hNZXRob2QgPSBmb3VuZE1hdGNoW2ldOworCQkJaWYgKG1hdGNoTWV0aG9kID09IG51bGwgJiYgY3VycmVudCAhPSBudWxsICYmIHRoaXMudHlwZS5pc1B1YmxpYygpKSB7IC8vIGN1cnJlbnQgPT0gbnVsbCBjYXNlIGhhbmRsZWQgYWxyZWFkeS4KKwkJCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IGluaGVyaXRlZFtpXTsKKwkJCQlpZiAoaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkgJiYgIWluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1B1YmxpYygpKSB7CisJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIENoYXJPcGVyYXRpb24uTk9fQ0hBUikpIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDMwNjAKKwkJCQkJCXRoaXMudHlwZS5hZGRTeW50aGV0aWNCcmlkZ2VNZXRob2QoaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCkpOworCQkJCX0KKwkJCX0KKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTY2NjAsIGlmIGN1cnJlbnQgdHlwZSBpcyBleHBvc2VkLAorCQkJLy8gaW5oZXJpdGVkIG1ldGhvZHMgb2Ygc3VwZXIgY2xhc3NlcyBhcmUgdG9vLiBjdXJyZW50ID09IG51bGwgY2FzZSBoYW5kbGVkIGFscmVhZHkuCisJCQlpZiAoIWlzT3JFbmNsb3NlZEJ5UHJpdmF0ZVR5cGUgJiYgbWF0Y2hNZXRob2QgPT0gbnVsbCAmJiBjdXJyZW50ICE9IG51bGwpIHsKKwkJCQlpbmhlcml0ZWRbaV0ub3JpZ2luYWwoKS5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NMb2NhbGx5VXNlZDsJCisJCQl9CisJCQlpZiAoc2tpcFtpXSkgY29udGludWU7CiAJCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IGluaGVyaXRlZFtpXTsKLQkJCW1hdGNoaW5nSW5oZXJpdGVkWysraW5kZXhdID0gaW5oZXJpdGVkTWV0aG9kOwotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCWlmIChtYXRjaE1ldGhvZCA9PSBudWxsKQorCQkJCW1hdGNoaW5nSW5oZXJpdGVkWysraW5kZXhdID0gaW5oZXJpdGVkTWV0aG9kOworCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgaW5oZXJpdGVkTGVuZ3RoOyBqKyspIHsKIAkJCQlNZXRob2RCaW5kaW5nIG90aGVySW5oZXJpdGVkTWV0aG9kID0gaW5oZXJpdGVkW2pdOwotCQkJCWlmIChmb3VuZE1hdGNoW2pdID09IDEgfHwgY2FuU2tpcEluaGVyaXRlZE1ldGhvZHMoaW5oZXJpdGVkTWV0aG9kLCBvdGhlckluaGVyaXRlZE1ldGhvZCkpCisJCQkJaWYgKG1hdGNoTWV0aG9kID09IGZvdW5kTWF0Y2hbal0gJiYgbWF0Y2hNZXRob2QgIT0gbnVsbCkKKwkJCQkJY29udGludWU7IC8vIGJvdGggaW5oZXJpdGVkIG1ldGhvZHMgbWF0Y2hlZCB0aGUgc2FtZSBjdXJyZW50TWV0aG9kCisJCQkJaWYgKGNhblNraXBJbmhlcml0ZWRNZXRob2RzKGluaGVyaXRlZE1ldGhvZCwgb3RoZXJJbmhlcml0ZWRNZXRob2QpKQogCQkJCQljb250aW51ZTsKKwkJCQkvLyBTa2lwIHRoZSBvdGhlckluaGVyaXRlZE1ldGhvZCBpZiBpdCBpcyBjb21wbGV0ZWx5IHJlcGxhY2VkIGJ5IGluaGVyaXRlZE1ldGhvZAorCQkJCS8vIFRoaXMgZWxpbWluYXRpb24gdXNlZCB0byBoYXBwZW4gcmF0aGVyIGVhZ2VybHkgaW4gY29tcHV0ZUluaGVyaXRlZE1ldGhvZHMgc3RlcAorCQkJCS8vIGl0c2VsZiBlYXJsaWVyLiAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjM1OCkKKwkJCQlpZiAoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IG90aGVySW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzKSB7CisJCQkJCWlmIChvdGhlckluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQlpZiAoaXNJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRlZChvdGhlckluaGVyaXRlZE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kLCBvdGhlckluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcykpIHsKKwkJCQkJCQlza2lwW2pdID0gdHJ1ZTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChhcmVNZXRob2RzQ29tcGF0aWJsZShpbmhlcml0ZWRNZXRob2QsIG90aGVySW5oZXJpdGVkTWV0aG9kKSkgeworCQkJCQkJc2tpcFtqXSA9IHRydWU7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KIAkJCQlvdGhlckluaGVyaXRlZE1ldGhvZCA9IGNvbXB1dGVTdWJzdGl0dXRlTWV0aG9kKG90aGVySW5oZXJpdGVkTWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOwogCQkJCWlmIChvdGhlckluaGVyaXRlZE1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MgIT0gb3RoZXJJbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MKLQkJCQkJCSYmIGRvZXNTdWJzdGl0dXRlTWV0aG9kT3ZlcnJpZGUoaW5oZXJpdGVkTWV0aG9kLCBvdGhlckluaGVyaXRlZE1ldGhvZCkpIHsKLQkJCQkJCQltYXRjaGluZ0luaGVyaXRlZFsrK2luZGV4XSA9IG90aGVySW5oZXJpdGVkTWV0aG9kOwotCQkJCQkJCWZvdW5kTWF0Y2hbal0gPSAxOyAvLyBjYW5ub3QgbnVsbCBvdXQgaW5oZXJpdGVkIG1ldGhvZHMKLQkJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGlzU3Vic3RpdHV0ZVBhcmFtZXRlclN1YnNpZ25hdHVyZShpbmhlcml0ZWRNZXRob2QsIG90aGVySW5oZXJpdGVkTWV0aG9kKSkgeworCQkJCQkJCWlmIChpbmRleCA9PSAtMSkKKwkJCQkJCQkJbWF0Y2hpbmdJbmhlcml0ZWRbKytpbmRleF0gPSBpbmhlcml0ZWRNZXRob2Q7CisJCQkJCQkJaWYgKGZvdW5kTWF0Y2hbal0gPT0gbnVsbCkKKwkJCQkJCQkJbWF0Y2hpbmdJbmhlcml0ZWRbKytpbmRleF0gPSBvdGhlckluaGVyaXRlZE1ldGhvZDsKKwkJCQkJCQlza2lwW2pdID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIGlmIChtYXRjaE1ldGhvZCA9PSBudWxsICYmIGZvdW5kTWF0Y2hbal0gPT0gbnVsbCkgewogCQkJCQkJY2hlY2tJbmhlcml0ZWRNZXRob2RzKGluaGVyaXRlZE1ldGhvZCwgb3RoZXJJbmhlcml0ZWRNZXRob2QpOwogCQkJCQl9CiAJCQkJfQpAQCAtNDYzLDcgKzU3Myw3IEBACiAKIAkJCWlmIChpbmRleCA+IDApCiAJCQkJY2hlY2tJbmhlcml0ZWRNZXRob2RzKG1hdGNoaW5nSW5oZXJpdGVkLCBpbmRleCArIDEpOyAvLyBwYXNzIGluIHRoZSBsZW5ndGggb2YgbWF0Y2hpbmcKLQkJCWVsc2UgaWYgKG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMgJiYgaW5kZXggPT0gMCAmJiBtYXRjaGluZ0luaGVyaXRlZFswXS5pc0Fic3RyYWN0KCkpCisJCQllbHNlIGlmIChtdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2RzICYmIG1hdGNoaW5nSW5oZXJpdGVkWzBdLmlzQWJzdHJhY3QoKSAmJiBtYXRjaE1ldGhvZCA9PSBudWxsKQogCQkJCWNoZWNrQWJzdHJhY3RNZXRob2QobWF0Y2hpbmdJbmhlcml0ZWRbMF0pOwogCQkJd2hpbGUgKGluZGV4ID49IDApIG1hdGNoaW5nSW5oZXJpdGVkW2luZGV4LS1dID0gbnVsbDsgLy8gY2xlYXIgdGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIHRoZSBtYXRjaGluZyBtZXRob2RzCiAJCX0KQEAgLTQ4OCw3ICs1OTgsNyBAQAogCQkJCQlpZiAoY2FuU2tpcEluaGVyaXRlZE1ldGhvZHMoaW5oZXJpdGVkTWV0aG9kLCBvdGhlckluaGVyaXRlZE1ldGhvZCkpCiAJCQkJCQljb250aW51ZTsKIAkJCQkJb3RoZXJJbmhlcml0ZWRNZXRob2QgPSBjb21wdXRlU3Vic3RpdHV0ZU1ldGhvZChvdGhlckluaGVyaXRlZE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKLQkJCQkJaWYgKG90aGVySW5oZXJpdGVkTWV0aG9kICE9IG51bGwgJiYgZG9lc1N1YnN0aXR1dGVNZXRob2RPdmVycmlkZShpbmhlcml0ZWRNZXRob2QsIG90aGVySW5oZXJpdGVkTWV0aG9kKSkgeworCQkJCQlpZiAob3RoZXJJbmhlcml0ZWRNZXRob2QgIT0gbnVsbCAmJiBpc1N1YnN0aXR1dGVQYXJhbWV0ZXJTdWJzaWduYXR1cmUoaW5oZXJpdGVkTWV0aG9kLCBvdGhlckluaGVyaXRlZE1ldGhvZCkpIHsKIAkJCQkJCW1hdGNoaW5nSW5oZXJpdGVkWysraW5kZXhdID0gb3RoZXJJbmhlcml0ZWRNZXRob2Q7CiAJCQkJCQlpbmhlcml0ZWRbal0gPSBudWxsOyAvLyBkbyBub3Qgd2FudCB0byBmaW5kIGl0IGFnYWluCiAJCQkJCX0KQEAgLTQ5Nyw3ICs2MDcsMjkgQEAKIAkJCWlmIChpbmRleCA+IDApIHsKIAkJCQlNZXRob2RCaW5kaW5nIGZpcnN0ID0gbWF0Y2hpbmdJbmhlcml0ZWRbMF07CiAJCQkJaW50IGNvdW50ID0gaW5kZXggKyAxOwotCQkJCXdoaWxlICgtLWNvdW50ID4gMCAmJiBhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUoZmlyc3QsIG1hdGNoaW5nSW5oZXJpdGVkW2NvdW50XSkpey8qZW1wdHkqL30KKwkJCQl3aGlsZSAoLS1jb3VudCA+IDApIHsKKwkJCQkJTWV0aG9kQmluZGluZyBtYXRjaCA9IG1hdGNoaW5nSW5oZXJpdGVkW2NvdW50XTsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDU1NgorCQkJCQlNZXRob2RCaW5kaW5nIGludGVyZmFjZU1ldGhvZCA9IG51bGwsIGltcGxlbWVudGF0aW9uID0gbnVsbDsKKwkJCQkJaWYgKGZpcnN0LmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCWludGVyZmFjZU1ldGhvZCA9IGZpcnN0OworCQkJCQl9IGVsc2UgaWYgKGZpcnN0LmRlY2xhcmluZ0NsYXNzLmlzQ2xhc3MoKSkgeworCQkJCQkJaW1wbGVtZW50YXRpb24gPSBmaXJzdDsKKwkJCQkJfQorCQkJCQlpZiAobWF0Y2guZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJaW50ZXJmYWNlTWV0aG9kID0gbWF0Y2g7CisJCQkJCX0gZWxzZSBpZiAobWF0Y2guZGVjbGFyaW5nQ2xhc3MuaXNDbGFzcygpKSB7CisJCQkJCQlpbXBsZW1lbnRhdGlvbiA9IG1hdGNoOworCQkJCQl9CisJCQkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCAmJiBpbXBsZW1lbnRhdGlvbiAhPSBudWxsICYmICFpc0FzVmlzaWJsZShpbXBsZW1lbnRhdGlvbiwgaW50ZXJmYWNlTWV0aG9kKSkKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KHR5cGVQYXJhbWV0ZXIsIGltcGxlbWVudGF0aW9uLCBuZXcgTWV0aG9kQmluZGluZyBbXSB7aW50ZXJmYWNlTWV0aG9kfSk7CisJCQkJCQorCQkJCQlpZiAoYXJlUmV0dXJuVHlwZXNDb21wYXRpYmxlKGZpcnN0LCBtYXRjaCkpIGNvbnRpbnVlOworCQkJCQkvLyB1bnJlbGF0ZWQgaW50ZXJmYWNlcyAtIGNoZWNrIHRvIHNlZSBpZiByZXR1cm4gdHlwZXMgYXJlIGNvbXBhdGlibGUKKwkJCQkJaWYgKGZpcnN0LmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkgJiYgbWF0Y2guZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSAmJiBhcmVSZXR1cm5UeXBlc0NvbXBhdGlibGUobWF0Y2gsIGZpcnN0KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQkJaWYgKGNvdW50ID4gMCkgeyAgLy8gQWxsIGluaGVyaXRlZCBtZXRob2RzIGRvIE5PVCBoYXZlIHRoZSBzYW1lIHZtU2lnbmF0dXJlCiAJCQkJCXByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZHNIYXZlSW5jb21wYXRpYmxlUmV0dXJuVHlwZXModHlwZVBhcmFtZXRlciwgbWF0Y2hpbmdJbmhlcml0ZWQsIGluZGV4ICsgMSk7CiAJCQkJCWNvbnRpbnVlIG5leHRTZWxlY3RvcjsKQEAgLTUxNywyNSArNjQ5LDIyIEBACiAJCSgoQmluYXJ5VHlwZUJpbmRpbmcpIGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcykucmVzb2x2ZVR5cGVzRm9yKGluaGVyaXRlZE1ldGhvZCk7CiAKIAlUeXBlVmFyaWFibGVCaW5kaW5nW10gaW5oZXJpdGVkVHlwZVZhcmlhYmxlcyA9IGluaGVyaXRlZE1ldGhvZC50eXBlVmFyaWFibGVzOwotCWlmIChpbmhlcml0ZWRUeXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHJldHVybiBpbmhlcml0ZWRNZXRob2Q7CiAJaW50IGluaGVyaXRlZExlbmd0aCA9IGluaGVyaXRlZFR5cGVWYXJpYWJsZXMubGVuZ3RoOworCWlmIChpbmhlcml0ZWRMZW5ndGggPT0gMCkgcmV0dXJuIGluaGVyaXRlZE1ldGhvZDsgLy8gbm8gc3Vic3RpdHV0aW9uIG5lZWRlZAogCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gY3VycmVudE1ldGhvZC50eXBlVmFyaWFibGVzOwogCWludCBsZW5ndGggPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsKLQlpZiAobGVuZ3RoID4gMCAmJiBpbmhlcml0ZWRMZW5ndGggIT0gbGVuZ3RoKSByZXR1cm4gaW5oZXJpdGVkTWV0aG9kOyAvLyBubyBtYXRjaCBKTFMgOC40LjIKLQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1tpbmhlcml0ZWRMZW5ndGhdOwotCWlmIChpbmhlcml0ZWRMZW5ndGggPD0gbGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkodHlwZVZhcmlhYmxlcywgMCwgYXJndW1lbnRzLCAwLCBpbmhlcml0ZWRMZW5ndGgpOwotCX0gZWxzZSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkodHlwZVZhcmlhYmxlcywgMCwgYXJndW1lbnRzLCAwLCBsZW5ndGgpOwotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpIDwgaW5oZXJpdGVkTGVuZ3RoOyBpKyspCi0JCQlhcmd1bWVudHNbaV0gPSBpbmhlcml0ZWRUeXBlVmFyaWFibGVzW2ldLnVwcGVyQm91bmQoKTsKLQl9Ci0JUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIHN1YnN0aXR1dGUgPQotCQl0aGlzLmVudmlyb25tZW50LmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKGluaGVyaXRlZE1ldGhvZCwgYXJndW1lbnRzKTsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBpbmhlcml0ZWRNZXRob2QuYXNSYXdNZXRob2QodGhpcy5lbnZpcm9ubWVudCk7CisJaWYgKGxlbmd0aCAhPSBpbmhlcml0ZWRMZW5ndGgpCisJCXJldHVybiBpbmhlcml0ZWRNZXRob2Q7IC8vIG5vIG1hdGNoIEpMUyA4LjQuMgogCiAJLy8gaW50ZXJmYWNlIEkgeyA8VD4gdm9pZCBmb28oVCB0KTsgfQogCS8vIGNsYXNzIFggaW1wbGVtZW50cyBJIHsgcHVibGljIDxUIGV4dGVuZHMgST4gdm9pZCBmb28oVCB0KSB7fSB9CiAJLy8gZm9yIHRoZSBhYm92ZSBjYXNlLCB3ZSBkbyBub3Qgd2FudCB0byBhbnN3ZXIgdGhlIHN1YnN0aXR1dGUgbWV0aG9kIHNpbmNlIGl0cyBub3QgYSBtYXRjaAorCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSh0eXBlVmFyaWFibGVzLCAwLCBhcmd1bWVudHMsIDAsIGxlbmd0aCk7CisJUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIHN1YnN0aXR1dGUgPQorCQl0aGlzLmVudmlyb25tZW50LmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKGluaGVyaXRlZE1ldGhvZCwgYXJndW1lbnRzKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGluaGVyaXRlZExlbmd0aDsgaSsrKSB7CiAJCVR5cGVWYXJpYWJsZUJpbmRpbmcgaW5oZXJpdGVkVHlwZVZhcmlhYmxlID0gaW5oZXJpdGVkVHlwZVZhcmlhYmxlc1tpXTsKIAkJVHlwZUJpbmRpbmcgYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CkBAIC01NjMsNjQgKzY5Miw3MyBAQAogCQkJCXJldHVybiBpbmhlcml0ZWRNZXRob2Q7IC8vIG5vdCBhIG1hdGNoCiAJCQl9CiAJCX0gZWxzZSBpZiAoaW5oZXJpdGVkVHlwZVZhcmlhYmxlLmJvdW5kQ2hlY2soc3Vic3RpdHV0ZSwgYXJndW1lbnQpICE9IFR5cGVDb25zdGFudHMuT0spIHsKLQkgICAgCQlyZXR1cm4gaW5oZXJpdGVkTWV0aG9kOworCSAgICAJcmV0dXJuIGluaGVyaXRlZE1ldGhvZDsKIAkJfQogCX0KICAgIHJldHVybiBzdWJzdGl0dXRlOwogfQogYm9vbGVhbiBkZXRlY3RJbmhlcml0ZWROYW1lQ2xhc2goTWV0aG9kQmluZGluZyBpbmhlcml0ZWQsIE1ldGhvZEJpbmRpbmcgb3RoZXJJbmhlcml0ZWQpIHsKLQlpZiAoIWluaGVyaXRlZC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG90aGVySW5oZXJpdGVkKSB8fCBpbmhlcml0ZWQucmV0dXJuVHlwZS5lcmFzdXJlKCkgIT0gb3RoZXJJbmhlcml0ZWQucmV0dXJuVHlwZS5lcmFzdXJlKCkpIHJldHVybiBmYWxzZTsKKwlpZiAoIWluaGVyaXRlZC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG90aGVySW5oZXJpdGVkKSkKKwkJcmV0dXJuIGZhbHNlOworCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIwMDEKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNjkzCisJLy8gV2hlbiByZXBvcnRpbmcgYSBuYW1lIGNsYXNoIGJldHdlZW4gdHdvIGluaGVyaXRlZCBtZXRob2RzLCB3ZSBzaG91bGQgbm90IGxvb2sgZm9yIGEKKwkvLyBzaWduYXR1cmUgY2xhc2gsIGJ1dCBpbnN0ZWFkIHNob3VsZCBiZSBsb29raW5nIGZvciBtZXRob2QgZGVzY3JpcHRvciBjbGFzaC4gCisJaWYgKGluaGVyaXRlZC5yZXR1cm5UeXBlLmVyYXN1cmUoKSAhPSBvdGhlckluaGVyaXRlZC5yZXR1cm5UeXBlLmVyYXN1cmUoKSkKKwkJcmV0dXJuIGZhbHNlOworCS8vIHNraXAgaXQgaWYgb3RoZXJJbmhlcml0ZWQgaXMgZGVmaW5lZCBieSBhIHN1YnR5cGUgb2YgaW5oZXJpdGVkJ3MgZGVjbGFyaW5nQ2xhc3Mgb3IgdmljZSB2ZXJzYS4KKwkvLyBhdm9pZCBiZWluZyBvcmRlciBzZW5zaXRpdmUgYW5kIGNoZWNrIHdpdGggdGhlIHJvbGVzIHJldmVyc2VkIGFsc28uCisJaWYgKGluaGVyaXRlZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkgIT0gb3RoZXJJbmhlcml0ZWQuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpKSB7CisJCWlmIChpbmhlcml0ZWQuZGVjbGFyaW5nQ2xhc3MuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShvdGhlckluaGVyaXRlZC5kZWNsYXJpbmdDbGFzcykgIT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKG90aGVySW5oZXJpdGVkLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oaW5oZXJpdGVkLmRlY2xhcmluZ0NsYXNzKSAhPSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCX0KIAogCXByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZHNIYXZlTmFtZUNsYXNoKHRoaXMudHlwZSwgaW5oZXJpdGVkLCBvdGhlckluaGVyaXRlZCk7CiAJcmV0dXJuIHRydWU7CiB9Ci1ib29sZWFuIGRldGVjdE5hbWVDbGFzaChNZXRob2RCaW5kaW5nIGN1cnJlbnQsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkKSB7Ci0JTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IGluaGVyaXRlZC5vcmlnaW5hbCgpOyAvLyBjYW4gYmUgdGhlIHNhbWUgYXMgaW5oZXJpdGVkCi0JaWYgKCFjdXJyZW50LmFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwob3JpZ2luYWwpIHx8IGN1cnJlbnQucmV0dXJuVHlwZS5lcmFzdXJlKCkgIT0gb3JpZ2luYWwucmV0dXJuVHlwZS5lcmFzdXJlKCkpIHJldHVybiBmYWxzZTsKLQotCXByb2JsZW1SZXBvcnRlcihjdXJyZW50KS5tZXRob2ROYW1lQ2xhc2goY3VycmVudCwgCi0JCQlpbmhlcml0ZWQuZGVjbGFyaW5nQ2xhc3MuaXNSYXdUeXBlKCkgPyBpbmhlcml0ZWQgOiBvcmlnaW5hbCk7Citib29sZWFuIGRldGVjdE5hbWVDbGFzaChNZXRob2RCaW5kaW5nIGN1cnJlbnQsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkLCBib29sZWFuIHRyZWF0QXNTeW50aGV0aWMpIHsKKwlNZXRob2RCaW5kaW5nIG1ldGhvZFRvQ2hlY2sgPSBpbmhlcml0ZWQ7CisJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IG1ldGhvZFRvQ2hlY2sub3JpZ2luYWwoKTsgLy8gY2FuIGJlIHRoZSBzYW1lIGFzIGluaGVyaXRlZAorCWlmICghY3VycmVudC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG9yaWdpbmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCWludCBzZXZlcml0eSA9IFByb2JsZW1TZXZlcml0aWVzLkVycm9yOworCWlmICh0aGlzLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuY29tcGxpYW5jZUxldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYpIHsKKwkJLy8gZm9yIDEuNiByZXR1cm4gdHlwZXMgYWxzbyBuZWVkIHRvIGJlIGNoZWNrZWQKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzcxOQorCQlpZiAoY3VycmVudC5yZXR1cm5UeXBlLmVyYXN1cmUoKSAhPSBvcmlnaW5hbC5yZXR1cm5UeXBlLmVyYXN1cmUoKSkKKwkJCXNldmVyaXR5ID0gUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZzsKKwl9CisJaWYgKCF0cmVhdEFzU3ludGhldGljKSB7CisJCS8vIEZvciBhIHVzZXIgbWV0aG9kLCBzZWUgaWYgY3VycmVudCBjbGFzcyBvdmVycmlkZXMgdGhlIGluaGVyaXRlZCBtZXRob2QuIElmIGl0IGRvZXMsCisJCS8vIHRoZW4gYW55IGdyaWV2YW5jZSB3ZSBtYXkgaGF2ZSBvdWdodCB0byBiZSBhZ2FpbnN0IHRoZSBjdXJyZW50IGNsYXNzJ3MgbWV0aG9kIGFuZAorCQkvLyBOT1QgYWdhaW5zdCBhbnkgc3VwZXIgaW1wbGVtZW50YXRpb25zLiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNjE1CisJCQorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE1OTc4IDogd2Ugbm93IGRlZmVyIHRoaXMgcmF0aGVyIGV4cGVuc2l2ZQorCQkvLyBjaGVjayB0byBqdXN0IGJlZm9yZSByZXBvcnRpbmcgKHRoZSBpbmNvcnJlY3QpIG5hbWUgY2xhc2guIEluIHRoZSBldmVudCB0aGVyZSBpcyBubyBuYW1lCisJCS8vIGNsYXNoIHRvIHJlcG9ydCB0byBiZWdpbiB3aXRoICh0aGUgY29tbW9uIGNhc2UpLCBubyBwZW5hbHR5IG5lZWRzIHRvIGJlIHBhaWQuICAKKwkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnROYW1lc2FrZXMgPSAoTWV0aG9kQmluZGluZ1tdKSB0aGlzLmN1cnJlbnRNZXRob2RzLmdldChpbmhlcml0ZWQuc2VsZWN0b3IpOworCQlpZiAoY3VycmVudE5hbWVzYWtlcy5sZW5ndGggPiAxKSB7IC8vIHdlIGtub3cgaXQgb3VnaHQgdG8gYXQgbGVhc3Qgb25lIGFuZCB0aGF0IGN1cnJlbnQgaXMgTk9UIHRoZSBvdmVycmlkZQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGN1cnJlbnROYW1lc2FrZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QgPSBjdXJyZW50TmFtZXNha2VzW2ldOworCQkJCWlmIChjdXJyZW50TWV0aG9kICE9IGN1cnJlbnQgJiYgZG9lc01ldGhvZE92ZXJyaWRlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZCkpIHsKKwkJCQkJbWV0aG9kVG9DaGVjayA9IGN1cnJlbnRNZXRob2Q7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlvcmlnaW5hbCA9IG1ldGhvZFRvQ2hlY2sub3JpZ2luYWwoKTsgLy8gY2FuIGJlIHRoZSBzYW1lIGFzIGluaGVyaXRlZAorCWlmICghY3VycmVudC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG9yaWdpbmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCW9yaWdpbmFsID0gaW5oZXJpdGVkLm9yaWdpbmFsKCk7ICAvLyBGb3IgZXJyb3IgcmVwb3J0aW5nIHVzZSwgaW5oZXJpdGVkLm9yaWdpbmFsKCkKKwlwcm9ibGVtUmVwb3J0ZXIoY3VycmVudCkubWV0aG9kTmFtZUNsYXNoKGN1cnJlbnQsIGluaGVyaXRlZC5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSA/IGluaGVyaXRlZCA6IG9yaWdpbmFsLCBzZXZlcml0eSk7CisJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmcpIHJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIHB1YmxpYyBib29sZWFuIGRvZXNNZXRob2RPdmVycmlkZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKLQlNZXRob2RCaW5kaW5nIHN1YnN0aXR1dGUgPSBjb21wdXRlU3Vic3RpdHV0ZU1ldGhvZChpbmhlcml0ZWRNZXRob2QsIG1ldGhvZCk7Ci0JcmV0dXJuIHN1YnN0aXR1dGUgIT0gbnVsbCAmJiBkb2VzU3Vic3RpdHV0ZU1ldGhvZE92ZXJyaWRlKG1ldGhvZCwgc3Vic3RpdHV0ZSk7Ci19Ci0vLyBpZiBtZXRob2QgIm92ZXJyaWRlcyIgc3Vic3RpdHV0ZU1ldGhvZCB0aGVuIHdlIGNhbiBza2lwIG92ZXIgc3Vic3RpdHV0ZU1ldGhvZCB3aGlsZSByZXNvbHZpbmcgYSBtZXNzYWdlIHNlbmQKLS8vIGlmIGl0IGRvZXMgbm90IHRoZW4gYSBuYW1lIGNsYXNoIGVycm9yIGlzIGxpa2VseQotYm9vbGVhbiBkb2VzU3Vic3RpdHV0ZU1ldGhvZE92ZXJyaWRlKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBNZXRob2RCaW5kaW5nIHN1YnN0aXR1dGVNZXRob2QpIHsKLQlpZiAoIWFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2QsIHN1YnN0aXR1dGVNZXRob2QpKSB7Ci0JCS8vIG1ldGhvZCBjYW4gc3RpbGwgb3ZlcnJpZGUgc3Vic3RpdHV0ZU1ldGhvZCBpbiBjYXNlcyBsaWtlIDoKLQkJLy8gPFUgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgYyhVIHUpIHt9Ci0JCS8vIEBPdmVycmlkZSB2b2lkIGMoTnVtYmVyIG4pIHt9Ci0JCS8vIGJ1dCBtZXRob2QgY2Fubm90IGhhdmUgYSAiZ2VuZXJpYy1lbmFibGVkIiBwYXJhbWV0ZXIgdHlwZQotCQlpZiAoc3Vic3RpdHV0ZU1ldGhvZC5oYXNTdWJzdGl0dXRlZFBhcmFtZXRlcnMoKSAmJiBtZXRob2QuYXJlUGFyYW1ldGVyRXJhc3VyZXNFcXVhbChzdWJzdGl0dXRlTWV0aG9kKSkKLQkJCXJldHVybiBtZXRob2QudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTICYmICFoYXNHZW5lcmljUGFyYW1ldGVyKG1ldGhvZCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoc3Vic3RpdHV0ZU1ldGhvZCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZykgewotCQkvLyBzaW5jZSBzdWJzdGl0dXRlTWV0aG9kIGhhcyBzdWJzdGl0dXRlZCB0eXBlIHZhcmlhYmxlcywgbWV0aG9kIGNhbm5vdCBoYXZlIGEgZ2VuZXJpYyBzaWduYXR1cmUgQU5EIG5vIHZhcmlhYmxlcyAtPiBpdHMgYSBuYW1lIGNsYXNoIGlmIGl0IGRvZXMKLQkJcmV0dXJuICEgKGhhc0dlbmVyaWNQYXJhbWV0ZXIobWV0aG9kKSAmJiBtZXRob2QudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKTsKLQl9Ci0KLQkvLyBpZiBtZXRob2QgaGFzIGl0cyBvd24gdmFyaWFibGVzLCB0aGVuIHN1YnN0aXR1dGVNZXRob2QgZmFpbGVkIGJvdW5kcyBjaGVjayBpbiBjb21wdXRlU3Vic3RpdHV0ZU1ldGhvZCgpCi0JcmV0dXJuIG1ldGhvZC50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7Ci19Ci1ib29sZWFuIGhhc0dlbmVyaWNQYXJhbWV0ZXIoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKLQlpZiAobWV0aG9kLmdlbmVyaWNTaWduYXR1cmUoKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLQkvLyBtYXkgYmUgb25seSB0aGUgcmV0dXJuIHR5cGUgdGhhdCBpcyBnZW5lcmljLCBuZWVkIHRvIGNoZWNrIHBhcmFtZXRlcnMKLQlUeXBlQmluZGluZ1tdIHBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzOwotCWZvciAoaW50IGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQlUeXBlQmluZGluZyBwYXJhbSA9IHBhcmFtc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQlpbnQgbW9kaWZpZXJzID0gKChSZWZlcmVuY2VCaW5kaW5nKSBwYXJhbSkubW9kaWZpZXJzOwotCQkJaWYgKChtb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybiBjb3VsZE1ldGhvZE92ZXJyaWRlKG1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSAmJiBhcmVNZXRob2RzQ29tcGF0aWJsZShtZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7CiB9CiBib29sZWFuIGRvVHlwZVZhcmlhYmxlc0NsYXNoKE1ldGhvZEJpbmRpbmcgb25lLCBNZXRob2RCaW5kaW5nIHN1YnN0aXR1dGVUd28pIHsKIAkvLyBvbmUgaGFzIHR5cGUgdmFyaWFibGVzIGFuZCBzdWJzdGl0dXRlVHdvIGRpZCBub3QgcGFzcyBib3VuZHMgY2hlY2sgaW4gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QoKQpAQCAtNjk1LDYgKzgzMyw0NSBAQAogCX0KIAlyZXR1cm4gY29weTsKIH0KK2Jvb2xlYW4gaGFzR2VuZXJpY1BhcmFtZXRlcihNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCWlmIChtZXRob2QuZ2VuZXJpY1NpZ25hdHVyZSgpID09IG51bGwpIHJldHVybiBmYWxzZTsKKworCS8vIG1heSBiZSBvbmx5IHRoZSByZXR1cm4gdHlwZSB0aGF0IGlzIGdlbmVyaWMsIG5lZWQgdG8gY2hlY2sgcGFyYW1ldGVycworCVR5cGVCaW5kaW5nW10gcGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBwYXJhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCVR5cGVCaW5kaW5nIHBhcmFtID0gcGFyYW1zW2ldLmxlYWZDb21wb25lbnRUeXBlKCk7CisJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCWludCBtb2RpZmllcnMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIHBhcmFtKS5tb2RpZmllcnM7CisJCQlpZiAoKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZSkgIT0gMCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9Citib29sZWFuIGlzQWNjZXB0YWJsZVJldHVyblR5cGVPdmVycmlkZShNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJLy8gY2FsbGVkIHdoZW4gY3VycmVudE1ldGhvZCdzIHJldHVybiB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCBpbmhlcml0ZWRNZXRob2QncyByZXR1cm4gdHlwZQorCisJaWYgKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSkKKwkJcmV0dXJuIHRydWU7IC8vIHNpbmNlIHRoZSBpbmhlcml0ZWRNZXRob2QgY29tZXMgZnJvbSBhIHJhdyB0eXBlLCB0aGUgcmV0dXJuIHR5cGUgaXMgYWx3YXlzIGFjY2VwdGFibGUKKworCU1ldGhvZEJpbmRpbmcgb3JpZ2luYWxJbmhlcml0ZWQgPSBpbmhlcml0ZWRNZXRob2Qub3JpZ2luYWwoKTsKKwlUeXBlQmluZGluZyBvcmlnaW5hbEluaGVyaXRlZFJldHVyblR5cGUgPSBvcmlnaW5hbEluaGVyaXRlZC5yZXR1cm5UeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7CisJaWYgKG9yaWdpbmFsSW5oZXJpdGVkUmV0dXJuVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlV2l0aEFjdHVhbEFyZ3VtZW50cygpKQorCQlyZXR1cm4gIWN1cnJlbnRNZXRob2QucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlzUmF3VHlwZSgpOyAvLyByYXcgdHlwZXMgaXNzdWUgYSB3YXJuaW5nIGlmIGluaGVyaXRlZCBpcyBwYXJhbWV0ZXJpemVkCisKKwlUeXBlQmluZGluZyBjdXJyZW50UmV0dXJuVHlwZSA9IGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCXN3aXRjaCAoY3VycmVudFJldHVyblR5cGUua2luZCgpKSB7CisJICAgCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6CisJICAgCQlpZiAoY3VycmVudFJldHVyblR5cGUgPT0gaW5oZXJpdGVkTWV0aG9kLnJldHVyblR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSkKKwkgICAJCQlyZXR1cm4gdHJ1ZTsKKwkgICAJCS8vJEZBTEwtVEhST1VHSCQKKwkJZGVmYXVsdCA6CisJCQlpZiAob3JpZ2luYWxJbmhlcml0ZWRSZXR1cm5UeXBlLmlzVHlwZVZhcmlhYmxlKCkpCisJCQkJaWYgKCgoVHlwZVZhcmlhYmxlQmluZGluZykgb3JpZ2luYWxJbmhlcml0ZWRSZXR1cm5UeXBlKS5kZWNsYXJpbmdFbGVtZW50ID09IG9yaWdpbmFsSW5oZXJpdGVkKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CiAvLyBjYXZlYXQ6IHJldHVybnMgZmFsc2UgaWYgYSBtZXRob2QgaXMgaW1wbGVtZW50ZWQgdGhhdCBuZWVkcyBhIGJyaWRnZSBtZXRob2QKIGJvb2xlYW4gaXNJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRlZChNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCwgTWV0aG9kQmluZGluZyBleGlzdGluZ01ldGhvZCwgUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUpIHsKIAlpZiAoaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCkgIT0gaW5oZXJpdGVkTWV0aG9kICYmIGV4aXN0aW5nTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCkBAIC03MDMsOSArODgwLDU1IEBACiAJaW5oZXJpdGVkTWV0aG9kID0gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QoaW5oZXJpdGVkTWV0aG9kLCBleGlzdGluZ01ldGhvZCk7CiAJcmV0dXJuIGluaGVyaXRlZE1ldGhvZCAhPSBudWxsCiAJCSYmIGluaGVyaXRlZE1ldGhvZC5yZXR1cm5UeXBlID09IGV4aXN0aW5nTWV0aG9kLnJldHVyblR5cGUgLy8ga2VlcCBhcm91bmQgdG8gcHJvZHVjZSBicmlkZ2UgbWV0aG9kcwotCQkmJiBzdXBlci5pc0ludGVyZmFjZU1ldGhvZEltcGxlbWVudGVkKGluaGVyaXRlZE1ldGhvZCwgZXhpc3RpbmdNZXRob2QsIHN1cGVyVHlwZSk7CisJCSYmIGRvZXNNZXRob2RPdmVycmlkZShleGlzdGluZ01ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKK30KK3B1YmxpYyBib29sZWFuIGlzTWV0aG9kU3Vic2lnbmF0dXJlKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgeworCWlmICghb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyBuZWVkIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpZiB0aGUgbWV0aG9kIGlzIGZyb20gYSBQYXJhbWV0ZXJpemVkVHlwZQorCWlmIChtZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQorCQltZXRob2QgPSBtZXRob2Qub3JpZ2luYWwoKTsKKworCU1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkT3JpZ2luYWwgPSBtZXRob2QuZmluZE9yaWdpbmFsSW5oZXJpdGVkTWV0aG9kKGluaGVyaXRlZE1ldGhvZCk7CisJcmV0dXJuIGlzUGFyYW1ldGVyU3Vic2lnbmF0dXJlKG1ldGhvZCwgaW5oZXJpdGVkT3JpZ2luYWwgPT0gbnVsbCA/IGluaGVyaXRlZE1ldGhvZCA6IGluaGVyaXRlZE9yaWdpbmFsKTsKK30KK2Jvb2xlYW4gaXNQYXJhbWV0ZXJTdWJzaWduYXR1cmUoTWV0aG9kQmluZGluZyBtZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJTWV0aG9kQmluZGluZyBzdWJzdGl0dXRlID0gY29tcHV0ZVN1YnN0aXR1dGVNZXRob2QoaW5oZXJpdGVkTWV0aG9kLCBtZXRob2QpOworCXJldHVybiBzdWJzdGl0dXRlICE9IG51bGwgJiYgaXNTdWJzdGl0dXRlUGFyYW1ldGVyU3Vic2lnbmF0dXJlKG1ldGhvZCwgc3Vic3RpdHV0ZSk7Cit9CisvLyBpZiBtZXRob2QgIm92ZXJyaWRlcyIgc3Vic3RpdHV0ZU1ldGhvZCB0aGVuIHdlIGNhbiBza2lwIG92ZXIgc3Vic3RpdHV0ZU1ldGhvZCB3aGlsZSByZXNvbHZpbmcgYSBtZXNzYWdlIHNlbmQKKy8vIGlmIGl0IGRvZXMgbm90IHRoZW4gYSBuYW1lIGNsYXNoIGVycm9yIGlzIGxpa2VseQorYm9vbGVhbiBpc1N1YnN0aXR1dGVQYXJhbWV0ZXJTdWJzaWduYXR1cmUoTWV0aG9kQmluZGluZyBtZXRob2QsIE1ldGhvZEJpbmRpbmcgc3Vic3RpdHV0ZU1ldGhvZCkgeworCWlmICghYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZCwgc3Vic3RpdHV0ZU1ldGhvZCkpIHsKKwkJLy8gbWV0aG9kIGNhbiBzdGlsbCBvdmVycmlkZSBzdWJzdGl0dXRlTWV0aG9kIGluIGNhc2VzIGxpa2UgOgorCQkvLyA8VSBleHRlbmRzIE51bWJlcj4gdm9pZCBjKFUgdSkge30KKwkJLy8gQE92ZXJyaWRlIHZvaWQgYyhOdW1iZXIgbikge30KKwkJLy8gYnV0IG1ldGhvZCBjYW5ub3QgaGF2ZSBhICJnZW5lcmljLWVuYWJsZWQiIHBhcmFtZXRlciB0eXBlCisJCWlmIChzdWJzdGl0dXRlTWV0aG9kLmhhc1N1YnN0aXR1dGVkUGFyYW1ldGVycygpICYmIG1ldGhvZC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKHN1YnN0aXR1dGVNZXRob2QpKQorCQkJcmV0dXJuIG1ldGhvZC50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMgJiYgIWhhc0dlbmVyaWNQYXJhbWV0ZXIobWV0aG9kKTsKKworCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3OTgzNgorCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzUmF3VHlwZSgpICYmIHN1YnN0aXR1dGVNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNSYXdUeXBlKCkpCisJCQlpZiAobWV0aG9kLmhhc1N1YnN0aXR1dGVkUGFyYW1ldGVycygpICYmIHN1YnN0aXR1dGVNZXRob2QuaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCkpCisJCQkJcmV0dXJuIGFyZU1ldGhvZHNDb21wYXRpYmxlKG1ldGhvZCwgc3Vic3RpdHV0ZU1ldGhvZCk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChzdWJzdGl0dXRlTWV0aG9kIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSB7CisJCWlmIChtZXRob2QudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQorCQkJcmV0dXJuICEoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZykgc3Vic3RpdHV0ZU1ldGhvZCkuaXNSYXc7CisJCS8vIHNpbmNlIHN1YnN0aXR1dGVNZXRob2QgaGFzIHN1YnN0aXR1dGVkIHR5cGUgdmFyaWFibGVzLCBtZXRob2QgY2Fubm90IGhhdmUgYSBnZW5lcmljIHNpZ25hdHVyZSBBTkQgbm8gdmFyaWFibGVzIC0+IGl0cyBhIG5hbWUgY2xhc2ggaWYgaXQgZG9lcworCQlyZXR1cm4gIWhhc0dlbmVyaWNQYXJhbWV0ZXIobWV0aG9kKTsKKwl9CisKKwkvLyBpZiBtZXRob2QgaGFzIGl0cyBvd24gdmFyaWFibGVzLCB0aGVuIHN1YnN0aXR1dGVNZXRob2QgZmFpbGVkIGJvdW5kcyBjaGVjayBpbiBjb21wdXRlU3Vic3RpdHV0ZU1ldGhvZCgpCisJcmV0dXJuIG1ldGhvZC50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CiB9CiBib29sZWFuIGlzVW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwkvLyBjYWxsZWQgd2hlbiBjdXJyZW50TWV0aG9kJ3MgcmV0dXJuIHR5cGUgaXMgTk9UIGNvbXBhdGlibGUgd2l0aCBpbmhlcml0ZWRNZXRob2QncyByZXR1cm4gdHlwZQorCiAJLy8gSkxTIDMgpzguNC41OiBtb3JlIGFyZSBhY2NlcHRlZCwgd2l0aCBhbiB1bmNoZWNrZWQgY29udmVyc2lvbgogCWlmIChjdXJyZW50TWV0aG9kLnJldHVyblR5cGUgPT0gaW5oZXJpdGVkTWV0aG9kLnJldHVyblR5cGUuZXJhc3VyZSgpKSB7CiAJCVR5cGVCaW5kaW5nW10gY3VycmVudFBhcmFtcyA9IGN1cnJlbnRNZXRob2QucGFyYW1ldGVyczsKQEAgLTcxNiw3ICs5MzksNyBAQAogCX0KIAlpZiAoY3VycmVudE1ldGhvZC50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMKIAkJJiYgaW5oZXJpdGVkTWV0aG9kLm9yaWdpbmFsKCkudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTCi0JCSYmIGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZS5lcmFzdXJlKCkuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShpbmhlcml0ZWRNZXRob2QucmV0dXJuVHlwZS5lcmFzdXJlKCkpICE9IG51bGwpIHsKKwkJJiYgY3VycmVudE1ldGhvZC5yZXR1cm5UeXBlLmVyYXN1cmUoKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGluaGVyaXRlZE1ldGhvZC5yZXR1cm5UeXBlLmVyYXN1cmUoKSkgIT0gbnVsbCkgewogCQkJcmV0dXJuIHRydWU7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTcyOCwxNCArOTUxLDE2IEBACiAJfQogCXJldHVybiBzdXBlci5yZXBvcnRJbmNvbXBhdGlibGVSZXR1cm5UeXBlRXJyb3IoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKIH0KLXZvaWQgdmVyaWZ5KFNvdXJjZVR5cGVCaW5kaW5nIHNvbWVUeXBlKSB7Ci0JaWYgKHNvbWVUeXBlLmlzQW5ub3RhdGlvblR5cGUoKSkKLQkJc29tZVR5cGUuZGV0ZWN0QW5ub3RhdGlvbkN5Y2xlKCk7Cit2b2lkIHZlcmlmeSgpIHsKKwlpZiAodGhpcy50eXBlLmlzQW5ub3RhdGlvblR5cGUoKSkKKwkJdGhpcy50eXBlLmRldGVjdEFubm90YXRpb25DeWNsZSgpOwogCi0Jc3VwZXIudmVyaWZ5KHNvbWVUeXBlKTsKKwlzdXBlci52ZXJpZnkoKTsKKwkKKwlyZXBvcnRSYXdSZWZlcmVuY2VzKCk7CiAKLQlmb3IgKGludCBpID0gc29tZVR5cGUudHlwZVZhcmlhYmxlcy5sZW5ndGg7IC0taSA+PSAwOykgewotCQlUeXBlVmFyaWFibGVCaW5kaW5nIHZhciA9IHNvbWVUeXBlLnR5cGVWYXJpYWJsZXNbaV07CisJZm9yIChpbnQgaSA9IHRoaXMudHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyID0gdGhpcy50eXBlLnR5cGVWYXJpYWJsZXNbaV07CiAJCS8vIG11c3QgdmVyaWZ5IGJvdW5kcyBpZiB0aGUgdmFyaWFibGUgaGFzIG1vcmUgdGhhbiAxCiAJCWlmICh2YXIuc3VwZXJJbnRlcmZhY2VzID09IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSBjb250aW51ZTsKIAkJaWYgKHZhci5zdXBlckludGVyZmFjZXMubGVuZ3RoID09IDEgJiYgdmFyLnN1cGVyY2xhc3MuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSBjb250aW51ZTsKQEAgLTc1Miw3ICs5NzcsNyBAQAogCQkJCTogaXRzSW50ZXJmYWNlc1tqXTsKIAkJfQogCQljb21wdXRlSW5oZXJpdGVkTWV0aG9kcyhzdXBlcmNsYXNzLCBzdXBlckludGVyZmFjZXMpOwotCQljaGVja1R5cGVWYXJpYWJsZU1ldGhvZHMoc29tZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVyc1tpXSk7CisJCWNoZWNrVHlwZVZhcmlhYmxlTWV0aG9kcyh0aGlzLnR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC50eXBlUGFyYW1ldGVyc1tpXSk7CiAJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NaXNzaW5nQmluYXJ5VHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWlzc2luZ1R5cGVCaW5kaW5nLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01pc3NpbmdCaW5hcnlUeXBlQmluZGluZy5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01pc3NpbmdUeXBlQmluZGluZy5qYXZhCmluZGV4IDVjMTZhMTEuLjhiODZkOGMKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NaXNzaW5nQmluYXJ5VHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01pc3NpbmdUeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDIyICsxMCwyNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiAKLXB1YmxpYyBjbGFzcyBNaXNzaW5nQmluYXJ5VHlwZUJpbmRpbmcgZXh0ZW5kcyBCaW5hcnlUeXBlQmluZGluZyB7CitwdWJsaWMgY2xhc3MgTWlzc2luZ1R5cGVCaW5kaW5nIGV4dGVuZHMgQmluYXJ5VHlwZUJpbmRpbmcgewogCiAvKioKLSAqIFNwZWNpYWwgY29uc3RydWN0b3IgZm9yIGNvbnN0cnVjdGluZyBwcm94aWVzIG9mIG1pc3NpbmcgYmluYXJ5IHR5cGVzICgxMTQzNDkpCisgKiBTcGVjaWFsIGNvbnN0cnVjdG9yIGZvciBjb25zdHJ1Y3RpbmcgcHJveGllcyBvZiBtaXNzaW5nIHR5cGVzICgxMTQzNDkpCiAgKiBAcGFyYW0gcGFja2FnZUJpbmRpbmcKICAqIEBwYXJhbSBjb21wb3VuZE5hbWUKICAqIEBwYXJhbSBlbnZpcm9ubWVudAogICovCi1wdWJsaWMgTWlzc2luZ0JpbmFyeVR5cGVCaW5kaW5nKFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBjaGFyW11bXSBjb21wb3VuZE5hbWUsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CitwdWJsaWMgTWlzc2luZ1R5cGVCaW5kaW5nKFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBjaGFyW11bXSBjb21wb3VuZE5hbWUsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CiAJY29tcHV0ZUlkKCk7Ci0JdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNCaW5hcnlCaW5kaW5nIHwgVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKKwl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5Jc0JpbmFyeUJpbmRpbmcgfCBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zIHwgVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKIAl0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7CiAJdGhpcy5mUGFja2FnZSA9IHBhY2thZ2VCaW5kaW5nOwogCXRoaXMuZmlsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpOwpAQCAtMzcsOCArMzksMjEgQEAKIAl0aGlzLm1lbWJlclR5cGVzID0gQmluZGluZy5OT19NRU1CRVJfVFlQRVM7CiAJdGhpcy5maWVsZHMgPSBCaW5kaW5nLk5PX0ZJRUxEUzsKIAl0aGlzLm1ldGhvZHMgPSBCaW5kaW5nLk5PX01FVEhPRFM7Ci19CQotCQorfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNjb2xsZWN0TWlzc2luZ1R5cGVzKGphdmEudXRpbC5MaXN0KQorICovCitwdWJsaWMgTGlzdCBjb2xsZWN0TWlzc2luZ1R5cGVzKExpc3QgbWlzc2luZ1R5cGVzKSB7CisJaWYgKG1pc3NpbmdUeXBlcyA9PSBudWxsKSB7CisJCW1pc3NpbmdUeXBlcyA9IG5ldyBBcnJheUxpc3QoNSk7CisJfSBlbHNlIGlmIChtaXNzaW5nVHlwZXMuY29udGFpbnModGhpcykpIHsKKwkJcmV0dXJuIG1pc3NpbmdUeXBlczsKKwl9CisJbWlzc2luZ1R5cGVzLmFkZCh0aGlzKTsKKwlyZXR1cm4gbWlzc2luZ1R5cGVzOworfQorCiAvKioKICAqIE1pc3NpbmcgYmluYXJ5IHR5cGUgd2lsbCBhbnN3ZXIgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvICNpc1ZhbGlkQmluZGluZygpCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZyNwcm9ibGVtSWQoKQpAQCAtNTAsOSArNjUsMTMgQEAKIC8qKgogICogT25seSB1c2VkIHRvIGZpeHVwIHRoZSBzdXBlcmNsYXNzIGhpZXJhcmNoeSBvZiBwcm94eSBiaW5hcnkgdHlwZXMKICAqIEBwYXJhbSBtaXNzaW5nU3VwZXJjbGFzcwotICogQHNlZSBMb29rdXBFbnZpcm9ubWVudCNjYWNoZU1pc3NpbmdCaW5hcnlUeXBlKGNoYXJbXVtdLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikKKyAqIEBzZWUgTG9va3VwRW52aXJvbm1lbnQjY3JlYXRlTWlzc2luZ1R5cGUoUGFja2FnZUJpbmRpbmcsIGNoYXJbXVtdKQogICovCiB2b2lkIHNldE1pc3NpbmdTdXBlcmNsYXNzKFJlZmVyZW5jZUJpbmRpbmcgbWlzc2luZ1N1cGVyY2xhc3MpIHsKIAl0aGlzLnN1cGVyY2xhc3MgPSBtaXNzaW5nU3VwZXJjbGFzczsKLX0JCit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiW01JU1NJTkc6IiArIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMuY29tcG91bmROYW1lLCAnLicpKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Nb3N0U3BlY2lmaWNFeGNlcHRpb25NZXRob2RCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01vc3RTcGVjaWZpY0V4Y2VwdGlvbk1ldGhvZEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Nb3N0U3BlY2lmaWNFeGNlcHRpb25NZXRob2RCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKKy8qKgorICogUHNldWRvIG1ldGhvZCBiaW5kaW5nIHVzZWQgdG8gd3JhcHBlciBhIHJlYWwgbWV0aG9kLCBhbmQgZXhwb3NlIGxlc3MgZXhjZXB0aW9ucyB0aGFuIG9yaWdpbmFsLgorICogRm9yIG90aGVyIHByb3RvY29scywgaXQgc2hvdWxkIGRlbGVnYXRlIHRvIG9yaWdpbmFsIG1ldGhvZAorICovCitwdWJsaWMgY2xhc3MgTW9zdFNwZWNpZmljRXhjZXB0aW9uTWV0aG9kQmluZGluZyAgZXh0ZW5kcyBNZXRob2RCaW5kaW5nIHsKKworCXByaXZhdGUgTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZDsKKwkKKwlwdWJsaWMgTW9zdFNwZWNpZmljRXhjZXB0aW9uTWV0aG9kQmluZGluZyAoTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZ1tdIG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMpIHsKKwkJc3VwZXIoCisJCQkJb3JpZ2luYWxNZXRob2QubW9kaWZpZXJzLCAKKwkJCQlvcmlnaW5hbE1ldGhvZC5zZWxlY3RvciwgCisJCQkJb3JpZ2luYWxNZXRob2QucmV0dXJuVHlwZSwgCisJCQkJb3JpZ2luYWxNZXRob2QucGFyYW1ldGVycywgCisJCQkJbW9zdFNwZWNpZmljRXhjZXB0aW9ucywgCisJCQkJb3JpZ2luYWxNZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCQl0aGlzLm9yaWdpbmFsTWV0aG9kID0gb3JpZ2luYWxNZXRob2Q7CisJfQorCQorCXB1YmxpYyBNZXRob2RCaW5kaW5nIG9yaWdpbmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcmlnaW5hbE1ldGhvZC5vcmlnaW5hbCgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTmVzdGVkVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTmVzdGVkVHlwZUJpbmRpbmcuamF2YQppbmRleCBmOGY1OGExLi40ZmM4NjA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL05lc3RlZFR5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9OZXN0ZWRUeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDIwMyArMTUsMTk0IEBACiAJcHVibGljIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGU7CiAKIAlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gZW5jbG9zaW5nSW5zdGFuY2VzOworCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZ1tdIGVuY2xvc2luZ1R5cGVzID0gQmluZGluZy5VTklOSVRJQUxJWkVEX1JFRkVSRU5DRV9UWVBFUzsKIAlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gb3V0ZXJMb2NhbFZhcmlhYmxlczsKLQlwdWJsaWMgaW50IGVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplOyAvLyBhbW91bnQgb2Ygc2xvdHMgdXNlZCBieSBzeW50aGV0aWMgZW5jbG9zaW5nIGluc3RhbmNlcwotCXB1YmxpYyBpbnQgb3V0ZXJMb2NhbFZhcmlhYmxlc1Nsb3RTaXplOyAvLyBhbW91bnQgb2Ygc2xvdHMgdXNlZCBieSBzeW50aGV0aWMgb3V0ZXIgbG9jYWwgdmFyaWFibGVzCi0JCi0JcHVibGljIE5lc3RlZFR5cGVCaW5kaW5nKGNoYXJbXVtdIHR5cGVOYW1lLCBDbGFzc1Njb3BlIHNjb3BlLCBTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlLmZQYWNrYWdlLCBzY29wZSk7Ci0JCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLklzTmVzdGVkVHlwZTsKLQkJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZTsKLQl9Ci0JCi0JLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZT4uCi0JKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLQkqLwotCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7Ci0JCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gbnVsbDsKLQkKLQkJaWYgKG91dGVyTG9jYWxWYXJpYWJsZXMgPT0gbnVsbCkgewotCQkJc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKLQkJCW91dGVyTG9jYWxWYXJpYWJsZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10ge3N5bnRoTG9jYWx9OwotCQl9IGVsc2UgewotCQkJaW50IHNpemUgPSBvdXRlckxvY2FsVmFyaWFibGVzLmxlbmd0aDsKLQkJCWludCBuZXdBcmdJbmRleCA9IHNpemU7Ci0JCQlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KSB7CQkvLyBtdXN0IHNlYXJjaCBiYWNrd2FyZHMKLQkJCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKQotCQkJCQlyZXR1cm4gb3V0ZXJMb2NhbFZhcmlhYmxlc1tpXTsJLy8gYWxyZWFkeSBleGlzdHMKLQkJCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5pZCA+IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5pZCkKLQkJCQkJbmV3QXJnSW5kZXggPSBpOwotCQkJfQotCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhMb2NhbHMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW3NpemUgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob3V0ZXJMb2NhbFZhcmlhYmxlcywgMCwgc3ludGhMb2NhbHMsIDAsIG5ld0FyZ0luZGV4KTsKLQkJCXN5bnRoTG9jYWxzW25ld0FyZ0luZGV4XSA9IHN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG91dGVyTG9jYWxWYXJpYWJsZXMsIG5ld0FyZ0luZGV4LCBzeW50aExvY2FscywgbmV3QXJnSW5kZXggKyAxLCBzaXplIC0gbmV3QXJnSW5kZXgpOwotCQkJb3V0ZXJMb2NhbFZhcmlhYmxlcyA9IHN5bnRoTG9jYWxzOworCXByaXZhdGUgaW50IG91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZSA9IC0xOyAvLyBhbW91bnQgb2Ygc2xvdHMgdXNlZCBieSBzeW50aGV0aWMgb3V0ZXIgbG9jYWwgdmFyaWFibGVzCisKK3B1YmxpYyBOZXN0ZWRUeXBlQmluZGluZyhjaGFyW11bXSB0eXBlTmFtZSwgQ2xhc3NTY29wZSBzY29wZSwgU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCXN1cGVyKHR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlLmZQYWNrYWdlLCBzY29wZSk7CisJdGhpcy50YWdCaXRzIHw9IChUYWdCaXRzLklzTmVzdGVkVHlwZSB8IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcyk7CisJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZTsKK30KKworLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZT4uCisqIEFuc3dlciB0aGUgbmV3IGFyZ3VtZW50IG9yIHRoZSBleGlzdGluZyBhcmd1bWVudCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgorKi8KK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBudWxsOworCisJaWYgKHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSB7CisJCXN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7CisJCXRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlcyA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSB7c3ludGhMb2NhbH07CisJfSBlbHNlIHsKKwkJaW50IHNpemUgPSB0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOworCQlpbnQgbmV3QXJnSW5kZXggPSBzaXplOworCQlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KSB7CQkvLyBtdXN0IHNlYXJjaCBiYWNrd2FyZHMKKwkJCWlmICh0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXNbaV0uYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlID09IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkKKwkJCQlyZXR1cm4gdGhpcy5vdXRlckxvY2FsVmFyaWFibGVzW2ldOwkvLyBhbHJlYWR5IGV4aXN0cworCQkJaWYgKHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5pZCA+IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5pZCkKKwkJCQluZXdBcmdJbmRleCA9IGk7CiAJCX0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBzeW50aCBhcmcgZm9yIGxvY2FsIHZhcjogIiArIG5ldyBTdHJpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLm5hbWUpICsgIiB0bzogIiArIG5ldyBTdHJpbmcodGhpcy5yZWFkYWJsZU5hbWUoKSkpOwotCQlpZiAoc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24pCi0JCQl0aGlzLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOwotCQlyZXR1cm4gc3ludGhMb2NhbDsKKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhMb2NhbHMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW3NpemUgKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXMsIDAsIHN5bnRoTG9jYWxzLCAwLCBuZXdBcmdJbmRleCk7CisJCXN5bnRoTG9jYWxzW25ld0FyZ0luZGV4XSA9IHN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdXRlckxvY2FsVmFyaWFibGVzLCBuZXdBcmdJbmRleCwgc3ludGhMb2NhbHMsIG5ld0FyZ0luZGV4ICsgMSwgc2l6ZSAtIG5ld0FyZ0luZGV4KTsKKwkJdGhpcy5vdXRlckxvY2FsVmFyaWFibGVzID0gc3ludGhMb2NhbHM7CiAJfQorCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgc3ludGggYXJnIGZvciBsb2NhbCB2YXI6ICIgKyBuZXcgU3RyaW5nKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5uYW1lKSArICIgdG86ICIgKyBuZXcgU3RyaW5nKHRoaXMucmVhZGFibGVOYW1lKCkpKTsKKwlpZiAodGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5pc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbikKKwkJdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7CisJcmV0dXJuIHN5bnRoTG9jYWw7Cit9CiAKLQkvKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGZvciA8ZW5jbG9zaW5nVHlwZT4uCi0JKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLQkqLwotCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlKSB7Ci0JCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gbnVsbDsKLQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSB7Ci0JCQlzeW50aExvY2FsID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKLQkJCWVuY2xvc2luZ0luc3RhbmNlcyA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSB7c3ludGhMb2NhbH07Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7Ci0JCQlpbnQgbmV3QXJnSW5kZXggPSBzaXplOwotCQkJZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykgewotCQkJCWlmIChlbmNsb3NpbmdJbnN0YW5jZXNbaV0udHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKQotCQkJCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzW2ldOyAvLyBhbHJlYWR5IGV4aXN0cwotCQkJCWlmICh0aGlzLmVuY2xvc2luZ1R5cGUoKSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKQotCQkJCQluZXdBcmdJbmRleCA9IDA7Ci0JCQl9Ci0JCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBuZXdJbnN0YW5jZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW3NpemUgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZW5jbG9zaW5nSW5zdGFuY2VzLCAwLCBuZXdJbnN0YW5jZXMsIG5ld0FyZ0luZGV4ID09IDAgPyAxIDogMCwgc2l6ZSk7Ci0JCQluZXdJbnN0YW5jZXNbbmV3QXJnSW5kZXhdID0gc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcodGFyZ2V0RW5jbG9zaW5nVHlwZSk7Ci0JCQllbmNsb3NpbmdJbnN0YW5jZXMgPSBuZXdJbnN0YW5jZXM7CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGZvciA8ZW5jbG9zaW5nVHlwZT4uCisqIEFuc3dlciB0aGUgbmV3IGFyZ3VtZW50IG9yIHRoZSBleGlzdGluZyBhcmd1bWVudCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgorKi8KK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlKSB7CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBudWxsOworCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSB7CisJCXN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKHRhcmdldEVuY2xvc2luZ1R5cGUpOworCQl0aGlzLmVuY2xvc2luZ0luc3RhbmNlcyA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSB7c3ludGhMb2NhbH07CisJfSBlbHNlIHsKKwkJaW50IHNpemUgPSB0aGlzLmVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJCWludCBuZXdBcmdJbmRleCA9IHNpemU7CisJCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspIHsKKwkJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCisJCQkJcmV0dXJuIHRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzW2ldOyAvLyBhbHJlYWR5IGV4aXN0cworCQkJaWYgKGVuY2xvc2luZ1R5cGUoKSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKQorCQkJCW5ld0FyZ0luZGV4ID0gMDsKIAkJfQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHN5bnRoIGFyZyBmb3IgZW5jbG9zaW5nIHR5cGU6ICIgKyBuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpICsgIiB0bzogIiArIG5ldyBTdHJpbmcodGhpcy5yZWFkYWJsZU5hbWUoKSkpOwotCQlpZiAoc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24pCi0JCQl0aGlzLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOwotCQlyZXR1cm4gc3ludGhMb2NhbDsKKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gbmV3SW5zdGFuY2VzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tzaXplICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbmNsb3NpbmdJbnN0YW5jZXMsIDAsIG5ld0luc3RhbmNlcywgbmV3QXJnSW5kZXggPT0gMCA/IDEgOiAwLCBzaXplKTsKKwkJbmV3SW5zdGFuY2VzW25ld0FyZ0luZGV4XSA9IHN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKHRhcmdldEVuY2xvc2luZ1R5cGUpOworCQl0aGlzLmVuY2xvc2luZ0luc3RhbmNlcyA9IG5ld0luc3RhbmNlczsKIAl9CisJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBzeW50aCBhcmcgZm9yIGVuY2xvc2luZyB0eXBlOiAiICsgbmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIgdG86ICIgKyBuZXcgU3RyaW5nKHRoaXMucmVhZGFibGVOYW1lKCkpKTsKKwlpZiAodGhpcy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5pc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbikKKwkJdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7CisJcmV0dXJuIHN5bnRoTG9jYWw7Cit9CiAKLQkvKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGFuZCBmaWVsZCBmb3IgPGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZT4uCi0JKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLQkqLwotCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKLQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBhZGRTeW50aGV0aWNBcmd1bWVudChhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOwotCQlpZiAoc3ludGhMb2NhbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQkJaWYgKHN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9PSBudWxsKQotCQkJc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID0gYWRkU3ludGhldGljRmllbGRGb3JJbm5lcmNsYXNzKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7Ci0JCXJldHVybiBzeW50aExvY2FsOwotCX0KKy8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYXJndW1lbnQgYW5kIGZpZWxkIGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPi4KKyogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBhZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgeworCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gYWRkU3ludGhldGljQXJndW1lbnQoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwlpZiAoc3ludGhMb2NhbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAotCS8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYXJndW1lbnQgYW5kIGZpZWxkIGZvciA8ZW5jbG9zaW5nVHlwZT4uCi0JKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLQkqLwotCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUpIHsKLQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBhZGRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKLQkJaWYgKHN5bnRoTG9jYWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JCWlmIChzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPT0gbnVsbCkKLQkJCXN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9IGFkZFN5bnRoZXRpY0ZpZWxkRm9ySW5uZXJjbGFzcyh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKLQkJcmV0dXJuIHN5bnRoTG9jYWw7Ci0JfQorCWlmIChzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPT0gbnVsbCkKKwkJc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID0gYWRkU3ludGhldGljRmllbGRGb3JJbm5lcmNsYXNzKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7CisJcmV0dXJuIHN5bnRoTG9jYWw7Cit9CiAKLQkvKioKLQkgKiBDb21wdXRlIHRoZSByZXNvbHZlZCBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc3ludGhldGljIGFyZ3VtZW50cwotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIGNvbXB1dGVTeW50aGV0aWNBcmd1bWVudFNsb3RTaXplcygpIHsKLQkKLQkJaW50IHNsb3RTaXplID0gMDsgCi0JCS8vIGluc2VydCBlbmNsb3NpbmcgaW5zdGFuY2VzIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgb3V0ZXJMb2NhbHMKLQkJaW50IGVuY2xvc2luZ0luc3RhbmNlc0NvdW50ID0gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCA/IDAgOiB0aGlzLmVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQ7IGkrKyl7Ci0JCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYXJndW1lbnQgPSB0aGlzLmVuY2xvc2luZ0luc3RhbmNlc1tpXTsKLQkJCS8vIHBvc2l0aW9uIHRoZSBlbmNsb3NpbmcgaW5zdGFuY2Ugc3ludGhldGljIGFyZwotCQkJYXJndW1lbnQucmVzb2x2ZWRQb3NpdGlvbiA9IHNsb3RTaXplICsgMTsgLy8gc2hpZnQgYnkgMSB0byBsZWF2ZSByb29tIGZvciBhbG9hZDA9PXRoaXMKLQkJCWlmIChzbG90U2l6ZSArIDEgPiAweEZGKSB7IC8vIG5vIG1vcmUgdGhhbiAyNTUgd29yZHMgb2YgYXJndW1lbnRzCi0JCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckFyZ3VtZW50KGFyZ3VtZW50LCB0aGlzLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7IAotCQkJfQotCQkJaWYgKChhcmd1bWVudC50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChhcmd1bWVudC50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpewotCQkJCXNsb3RTaXplICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXNsb3RTaXplICsrOwotCQkJfQotCQl9Ci0JCXRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUgPSBzbG90U2l6ZTsgCi0JCQotCQlzbG90U2l6ZSA9IDA7IC8vIHJlc2V0LCBvdXRlciBsb2NhbCBhcmUgbm90IHBvc2l0aW9ubmVkIHlldCwgc2luY2Ugd2lsbCBiZSBhcHBlbmRlZCB0byB1c2VyIGFyZ3VtZW50cworLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBhbmQgZmllbGQgZm9yIDxlbmNsb3NpbmdUeXBlPi4KKyogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBhZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSkgeworCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gYWRkU3ludGhldGljQXJndW1lbnQodGFyZ2V0RW5jbG9zaW5nVHlwZSk7CisJaWYgKHN5bnRoTG9jYWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwlpZiAoc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID09IG51bGwpCisJCXN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9IGFkZFN5bnRoZXRpY0ZpZWxkRm9ySW5uZXJjbGFzcyh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKKwlyZXR1cm4gc3ludGhMb2NhbDsKK30KKworLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGVuY2xvc2luZyB0eXBlLi4uIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdG9wIGxldmVsIHR5cGUuCisqLworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSgpIHsKKwlyZXR1cm4gdGhpcy5lbmNsb3NpbmdUeXBlOworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIGVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplCisgKi8KK3B1YmxpYyBpbnQgZ2V0RW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUoKSB7CisJcmV0dXJuIHRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzID09IG51bGwgPyAwIDogdGhpcy5lbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIG91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZQorICovCitwdWJsaWMgaW50IGdldE91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZSgpIHsKKwlpZiAodGhpcy5vdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUgPCAwKSB7CisJCXRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlc1Nsb3RTaXplID0gMDsKIAkJaW50IG91dGVyTG9jYWxzQ291bnQgPSB0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXMgPT0gbnVsbCA/IDAgOiB0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRlckxvY2Fsc0NvdW50OyBpKyspewogCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFyZ3VtZW50ID0gdGhpcy5vdXRlckxvY2FsVmFyaWFibGVzW2ldOwotCQkJLy8gZG8gTk9UIHBvc2l0aW9uIHRoZSBvdXRlcmxvY2FsIHN5bnRoZXRpYyBhcmcgeWV0LCAgc2luY2Ugd2lsbCBiZSBhcHBlbmRlZCB0byB1c2VyIGFyZ3VtZW50cwotCQkJaWYgKChhcmd1bWVudC50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChhcmd1bWVudC50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpewotCQkJCXNsb3RTaXplICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXNsb3RTaXplICsrOworCQkJc3dpdGNoIChhcmd1bWVudC50eXBlLmlkKSB7CisJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJdGhpcy5vdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUgICs9IDI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQl0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZSAgKys7CisJCQkJCWJyZWFrOworCQkJfQkJCisJCX0KKwl9CisJcmV0dXJuIHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlc1Nsb3RTaXplOworfQorCisvKiBBbnN3ZXIgdGhlIHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZT4gb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCisqLworcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBnZXRTeW50aGV0aWNBcmd1bWVudChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKKwlpZiAodGhpcy5vdXRlckxvY2FsVmFyaWFibGVzID09IG51bGwpIHJldHVybiBudWxsOwkJLy8gaXMgbnVsbCBpZiBubyBvdXRlciBsb2NhbCB2YXJpYWJsZXMgYXJlIGtub3duCisJZm9yIChpbnQgaSA9IHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKQorCQkJcmV0dXJuIHRoaXMub3V0ZXJMb2NhbFZhcmlhYmxlc1tpXTsKKwlyZXR1cm4gbnVsbDsKK30KKworLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDx0YXJnZXRFbmNsb3NpbmdUeXBlPiBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KKyovCitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGdldFN5bnRoZXRpY0FyZ3VtZW50KFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSwgYm9vbGVhbiBvbmx5RXhhY3RNYXRjaCkgeworCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUga25vd24KKwkvLyBleGFjdCBtYXRjaAorCWZvciAoaW50IGkgPSB0aGlzLmVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSkKKwkJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZXNbaV07CisKKwkvLyB0eXBlIGNvbXBhdGliaWxpdHkgOiB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcworCS8vIGNsYXNzIFQgeyBjbGFzcyBNe319CisJLy8gY2xhc3MgUyBleHRlbmRzIFQgeyBjbGFzcyBOIGV4dGVuZHMgTSB7fX0gLS0+IG5lZWQgdG8gdXNlIFMgYXMgYSBkZWZhdWx0IGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgaW4gTigpLgorCWlmICghb25seUV4YWN0TWF0Y2gpeworCQlmb3IgKGludCBpID0gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQlpZiAodGhpcy5lbmNsb3NpbmdJbnN0YW5jZXNbaV0uYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlID09IG51bGwpCisJCQkJaWYgKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0YXJnZXRFbmNsb3NpbmdUeXBlKSAhPSBudWxsKQorCQkJCQlyZXR1cm4gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZXNbaV07CisJfQorCXJldHVybiBudWxsOworfQorCitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VzKCkgeworCXJldHVybiB0aGlzLmVuY2xvc2luZ0luc3RhbmNlczsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUgcmVxdWlyZWQKK30KKworcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkgeworCWlmICh0aGlzLmVuY2xvc2luZ1R5cGVzID09IFVOSU5JVElBTElaRURfUkVGRVJFTkNFX1RZUEVTKSB7CisJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSB7CisJCQl0aGlzLmVuY2xvc2luZ1R5cGVzID0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJCQl0aGlzLmVuY2xvc2luZ1R5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQl0aGlzLmVuY2xvc2luZ1R5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGU7CiAJCQl9CiAJCX0KLQkJdGhpcy5vdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUgPSBzbG90U2l6ZTsKIAl9Ci0JCi0JLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGVuY2xvc2luZyB0eXBlLi4uIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdG9wIGxldmVsIHR5cGUuCi0JKi8KLQlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKCkgeworCXJldHVybiB0aGlzLmVuY2xvc2luZ1R5cGVzOworfQogCi0JCXJldHVybiBlbmNsb3NpbmdUeXBlOwotCX0KK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkgeworCXJldHVybiB0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXM7CQkvLyBpcyBudWxsIGlmIG5vIG91dGVyIGxvY2FscyBhcmUgcmVxdWlyZWQKK30KIAotCS8qIEFuc3dlciB0aGUgc3ludGhldGljIGFyZ3VtZW50IGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPiBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLQkqLwotCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgZ2V0U3ludGhldGljQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7Ci0KLQkJaWYgKG91dGVyTG9jYWxWYXJpYWJsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CQkvLyBpcyBudWxsIGlmIG5vIG91dGVyIGxvY2FsIHZhcmlhYmxlcyBhcmUga25vd24KLQkKLQkJZm9yIChpbnQgaSA9IG91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKQotCQkJCXJldHVybiBvdXRlckxvY2FsVmFyaWFibGVzW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VzKCkgewotCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzOwkJLy8gaXMgbnVsbCBpZiBubyBlbmNsb3NpbmcgaW5zdGFuY2VzIGFyZSByZXF1aXJlZAotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpIHsKLQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCWludCBsZW5ndGggPSBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOwotCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVzW10gPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJdHlwZXNbaV0gPSAoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGU7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpIHsKLQotCQlyZXR1cm4gb3V0ZXJMb2NhbFZhcmlhYmxlczsJCS8vIGlzIG51bGwgaWYgbm8gb3V0ZXIgbG9jYWxzIGFyZSByZXF1aXJlZAotCX0KLQotCS8qCi0JICogVHJpZ2dlciB0aGUgZGVwZW5kZW5jeSBtZWNoYW5pc20gZm9yY2luZyB0aGUgaW5uZXJjbGFzcyBlbXVsYXRpb24KLQkgKiB0byBiZSBwcm9wYWdhdGVkIHRvIGFsbCBkZXBlbmRlbnQgc291cmNlIHR5cGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpIHsKLQkJLy8gbm90aGluZyB0byBkbyBpbiBnZW5lcmFsLCBvbmx5IGxvY2FsIHR5cGVzIGFyZSBkb2luZyBhbnl0aGluZwotCX0KLQkKLQkvKiBBbnN3ZXIgdGhlIHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPHRhcmdldEVuY2xvc2luZ1R5cGU+IG9yIG51bGwgaWYgb25lIGRvZXMgbm90IGV4aXN0LgotCSovCi0JcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBnZXRTeW50aGV0aWNBcmd1bWVudChSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUsIGJvb2xlYW4gb25seUV4YWN0TWF0Y2gpIHsKLQotCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzID09IG51bGwpIHJldHVybiBudWxsOwkJLy8gaXMgbnVsbCBpZiBubyBlbmNsb3NpbmcgaW5zdGFuY2VzIGFyZSBrbm93bgotCQotCQkvLyBleGFjdCBtYXRjaAotCQlmb3IgKGludCBpID0gZW5jbG9zaW5nSW5zdGFuY2VzLmxlbmd0aDsgLS1pID49IDA7KQotCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCi0JCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGVuY2xvc2luZ0luc3RhbmNlc1tpXTsKLQkKLQkJLy8gdHlwZSBjb21wYXRpYmlsaXR5IDogdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMKLQkJLy8gY2xhc3MgVCB7IGNsYXNzIE17fX0KLQkJLy8gY2xhc3MgUyBleHRlbmRzIFQgeyBjbGFzcyBOIGV4dGVuZHMgTSB7fX0gLS0+IG5lZWQgdG8gdXNlIFMgYXMgYSBkZWZhdWx0IGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgaW4gTigpLgotCQlpZiAoIW9ubHlFeGFjdE1hdGNoKXsKLQkJCWZvciAoaW50IGkgPSBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gbnVsbCkKLQkJCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUodGFyZ2V0RW5jbG9zaW5nVHlwZSkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBlbmNsb3NpbmdJbnN0YW5jZXNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorLyoKKyAqIFRyaWdnZXIgdGhlIGRlcGVuZGVuY3kgbWVjaGFuaXNtIGZvcmNpbmcgdGhlIGlubmVyY2xhc3MgZW11bGF0aW9uCisgKiB0byBiZSBwcm9wYWdhdGVkIHRvIGFsbCBkZXBlbmRlbnQgc291cmNlIHR5cGVzLgorICovCitwdWJsaWMgdm9pZCB1cGRhdGVJbm5lckVtdWxhdGlvbkRlcGVuZGVudHMoKSB7CisJLy8gbm90aGluZyB0byBkbyBpbiBnZW5lcmFsLCBvbmx5IGxvY2FsIHR5cGVzIGFyZSBkb2luZyBhbnl0aGluZworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYWNrYWdlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYWNrYWdlQmluZGluZy5qYXZhCmluZGV4IDQ1NGY4YzAuLjBlNTkyMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFja2FnZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhY2thZ2VCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNiArMjUsMTEgQEAKIHByb3RlY3RlZCBQYWNrYWdlQmluZGluZygpIHsKIAkvLyBmb3IgY3JlYXRpbmcgcHJvYmxlbSBwYWNrYWdlCiB9CitwdWJsaWMgUGFja2FnZUJpbmRpbmcoY2hhcltdIHRvcExldmVsUGFja2FnZU5hbWUsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CisJdGhpcyhuZXcgY2hhcltdW10ge3RvcExldmVsUGFja2FnZU5hbWV9LCBudWxsLCBlbnZpcm9ubWVudCk7Cit9CisvKiBDcmVhdGUgdGhlIGRlZmF1bHQgcGFja2FnZS4KKyovCiBwdWJsaWMgUGFja2FnZUJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBQYWNrYWdlQmluZGluZyBwYXJlbnQsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CiAJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CkBAIC0zMiw1MSArMzcsNDggQEAKIAl0aGlzLmtub3duVHlwZXMgPSBudWxsOyAvLyBpbml0aWFsaXplZCBpZiB1c2VkLi4uIGNsYXNzIGNvdW50cyBjYW4gYmUgdmVyeSBsYXJnZSAzMDAtNjAwCiAJdGhpcy5rbm93blBhY2thZ2VzID0gbmV3IEhhc2h0YWJsZU9mUGFja2FnZSgzKTsgLy8gc3ViLXBhY2thZ2UgY291bnRzIGFyZSB0eXBpY2FsbHkgMC0zCiB9Ci1wdWJsaWMgUGFja2FnZUJpbmRpbmcoY2hhcltdIHRvcExldmVsUGFja2FnZU5hbWUsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JdGhpcyhuZXcgY2hhcltdW10ge3RvcExldmVsUGFja2FnZU5hbWV9LCBudWxsLCBlbnZpcm9ubWVudCk7Ci19Ci0vKiBDcmVhdGUgdGhlIGRlZmF1bHQgcGFja2FnZS4KLSovCiAKIHB1YmxpYyBQYWNrYWdlQmluZGluZyhMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogCXRoaXMoQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsIG51bGwsIGVudmlyb25tZW50KTsKIH0KIHByaXZhdGUgdm9pZCBhZGROb3RGb3VuZFBhY2thZ2UoY2hhcltdIHNpbXBsZU5hbWUpIHsKLQlrbm93blBhY2thZ2VzLnB1dChzaW1wbGVOYW1lLCBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFBhY2thZ2UpOworCXRoaXMua25vd25QYWNrYWdlcy5wdXQoc2ltcGxlTmFtZSwgTG9va3VwRW52aXJvbm1lbnQuVGhlTm90Rm91bmRQYWNrYWdlKTsKIH0KIHByaXZhdGUgdm9pZCBhZGROb3RGb3VuZFR5cGUoY2hhcltdIHNpbXBsZU5hbWUpIHsKLQlpZiAoa25vd25UeXBlcyA9PSBudWxsKQotCQlrbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mVHlwZSgyNSk7Ci0Ja25vd25UeXBlcy5wdXQoc2ltcGxlTmFtZSwgTG9va3VwRW52aXJvbm1lbnQuVGhlTm90Rm91bmRUeXBlKTsKKwlpZiAodGhpcy5rbm93blR5cGVzID09IG51bGwpCisJCXRoaXMua25vd25UeXBlcyA9IG5ldyBIYXNodGFibGVPZlR5cGUoMjUpOworCXRoaXMua25vd25UeXBlcy5wdXQoc2ltcGxlTmFtZSwgTG9va3VwRW52aXJvbm1lbnQuVGhlTm90Rm91bmRUeXBlKTsKIH0KIHZvaWQgYWRkUGFja2FnZShQYWNrYWdlQmluZGluZyBlbGVtZW50KSB7Ci0Ja25vd25QYWNrYWdlcy5wdXQoZWxlbWVudC5jb21wb3VuZE5hbWVbZWxlbWVudC5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIGVsZW1lbnQpOworCWlmICgoZWxlbWVudC50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgPT0gMCkgY2xlYXJNaXNzaW5nVGFnQml0KCk7CisJdGhpcy5rbm93blBhY2thZ2VzLnB1dChlbGVtZW50LmNvbXBvdW5kTmFtZVtlbGVtZW50LmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSwgZWxlbWVudCk7CiB9CiB2b2lkIGFkZFR5cGUoUmVmZXJlbmNlQmluZGluZyBlbGVtZW50KSB7Ci0JaWYgKGtub3duVHlwZXMgPT0gbnVsbCkKLQkJa25vd25UeXBlcyA9IG5ldyBIYXNodGFibGVPZlR5cGUoMjUpOwotCWtub3duVHlwZXMucHV0KGVsZW1lbnQuY29tcG91bmROYW1lW2VsZW1lbnQuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLCBlbGVtZW50KTsKKwlpZiAoKGVsZW1lbnQudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpID09IDApIGNsZWFyTWlzc2luZ1RhZ0JpdCgpOworCWlmICh0aGlzLmtub3duVHlwZXMgPT0gbnVsbCkKKwkJdGhpcy5rbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mVHlwZSgyNSk7CisJdGhpcy5rbm93blR5cGVzLnB1dChlbGVtZW50LmNvbXBvdW5kTmFtZVtlbGVtZW50LmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSwgZWxlbWVudCk7CiB9Ci0vKiBBUEkKLSogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgotKi8KIAotcHVibGljIGZpbmFsIGludCBraW5kKCkgewotCXJldHVybiBCaW5kaW5nLlBBQ0tBR0U7Cit2b2lkIGNsZWFyTWlzc2luZ1RhZ0JpdCgpIHsKKwlQYWNrYWdlQmluZGluZyBjdXJyZW50ID0gdGhpczsKKwlkbyB7CisJCWN1cnJlbnQudGFnQml0cyAmPSB+VGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwl9IHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSAhPSBudWxsKTsKIH0KIC8qCiAgKiBzbGFzaCBzZXBhcmF0ZWQgbmFtZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUgLS0+IG9yZy9lY2xpcHNlL2pkdC9jb3JlCiAgKi8KIHB1YmxpYyBjaGFyW10gY29tcHV0ZVVuaXF1ZUtleShib29sZWFuIGlzTGVhZikgewotCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5jb21wb3VuZE5hbWUsICcvJyk7CiB9CiBwcml2YXRlIFBhY2thZ2VCaW5kaW5nIGZpbmRQYWNrYWdlKGNoYXJbXSBuYW1lKSB7Ci0JaWYgKCFlbnZpcm9ubWVudC5pc1BhY2thZ2UodGhpcy5jb21wb3VuZE5hbWUsIG5hbWUpKQorCWlmICghdGhpcy5lbnZpcm9ubWVudC5pc1BhY2thZ2UodGhpcy5jb21wb3VuZE5hbWUsIG5hbWUpKQogCQlyZXR1cm4gbnVsbDsKIAogCWNoYXJbXVtdIHN1YlBrZ0NvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uYXJyYXlDb25jYXQodGhpcy5jb21wb3VuZE5hbWUsIG5hbWUpOwotCVBhY2thZ2VCaW5kaW5nIHN1YlBhY2thZ2VCaW5kaW5nID0gbmV3IFBhY2thZ2VCaW5kaW5nKHN1YlBrZ0NvbXBvdW5kTmFtZSwgdGhpcywgZW52aXJvbm1lbnQpOworCVBhY2thZ2VCaW5kaW5nIHN1YlBhY2thZ2VCaW5kaW5nID0gbmV3IFBhY2thZ2VCaW5kaW5nKHN1YlBrZ0NvbXBvdW5kTmFtZSwgdGhpcywgdGhpcy5lbnZpcm9ubWVudCk7CiAJYWRkUGFja2FnZShzdWJQYWNrYWdlQmluZGluZyk7CiAJcmV0dXJuIHN1YlBhY2thZ2VCaW5kaW5nOwogfQpAQCAtODUsNyArODcsNiBAQAogKgogKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB3ZSBrbm93IHRoZXJlIGlzIE5PVCBhIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLgogKi8KLQogUGFja2FnZUJpbmRpbmcgZ2V0UGFja2FnZShjaGFyW10gbmFtZSkgewogCVBhY2thZ2VCaW5kaW5nIGJpbmRpbmcgPSBnZXRQYWNrYWdlMChuYW1lKTsKIAlpZiAoYmluZGluZyAhPSBudWxsKSB7CkBAIC0xMTAsNyArMTExLDcgQEAKICovCiAKIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UwKGNoYXJbXSBuYW1lKSB7Ci0JcmV0dXJuIGtub3duUGFja2FnZXMuZ2V0KG5hbWUpOworCXJldHVybiB0aGlzLmtub3duUGFja2FnZXMuZ2V0KG5hbWUpOwogfQogLyogQW5zd2VyIHRoZSB0eXBlIG5hbWVkIG5hbWU7IGFzayB0aGUgb3JhY2xlIGZvciB0aGUgdHlwZSBpZiBpdHMgbm90IGluIHRoZSBjYWNoZS4KICogQW5zd2VyIGEgTm90VmlzaWJsZSBwcm9ibGVtIHR5cGUgaWYgdGhlIHR5cGUgaXMgbm90IHZpc2libGUgZnJvbSB0aGUgaW52b2NhdGlvblBhY2thZ2UuCkBAIC0xMjEsMjIgKzEyMiwyMiBAQAogKi8KIAogUmVmZXJlbmNlQmluZGluZyBnZXRUeXBlKGNoYXJbXSBuYW1lKSB7Ci0JUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IGdldFR5cGUwKG5hbWUpOwotCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCWlmICgodHlwZUJpbmRpbmcgPSBlbnZpcm9ubWVudC5hc2tGb3JUeXBlKHRoaXMsIG5hbWUpKSA9PSBudWxsKSB7CisJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gZ2V0VHlwZTAobmFtZSk7CisJaWYgKHJlZmVyZW5jZUJpbmRpbmcgPT0gbnVsbCkgeworCQlpZiAoKHJlZmVyZW5jZUJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmFza0ZvclR5cGUodGhpcywgbmFtZSkpID09IG51bGwpIHsKIAkJCS8vIG5vdCBmb3VuZCBzbyByZW1lbWJlciBhIHByb2JsZW0gdHlwZSBiaW5kaW5nIGluIHRoZSBjYWNoZSBmb3IgZnV0dXJlIGxvb2t1cHMKIAkJCWFkZE5vdEZvdW5kVHlwZShuYW1lKTsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQogCi0JaWYgKHR5cGVCaW5kaW5nID09IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kVHlwZSkKKwlpZiAocmVmZXJlbmNlQmluZGluZyA9PSBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFR5cGUpCiAJCXJldHVybiBudWxsOwogCi0JdHlwZUJpbmRpbmcgPSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0eXBlQmluZGluZywgZW52aXJvbm1lbnQsIGZhbHNlKTsgLy8gbm8gcmF3IGNvbnZlcnNpb24gZm9yIG5vdwotCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkKLQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCB0eXBlQmluZGluZywgUHJvYmxlbVJlYXNvbnMuSW50ZXJuYWxOYW1lUHJvdmlkZWQpOwotCXJldHVybiB0eXBlQmluZGluZzsKKwlyZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHJlZmVyZW5jZUJpbmRpbmcsIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uIGZvciBub3cgKi8pOworCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzTmVzdGVkVHlwZSgpKQorCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyW11bXXsgbmFtZSB9LCByZWZlcmVuY2VCaW5kaW5nLCBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZCk7CisJcmV0dXJuIHJlZmVyZW5jZUJpbmRpbmc7CiB9CiAvKiBBbnN3ZXIgdGhlIHR5cGUgbmFtZWQgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGNhY2hlLgogKiBBbnN3ZXIgdGhlTm90Rm91bmRUeXBlIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0aGUgZmlyc3QgdGltZQpAQCAtMTQ3LDkgKzE0OCw5IEBACiAqLwogCiBSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGUwKGNoYXJbXSBuYW1lKSB7Ci0JaWYgKGtub3duVHlwZXMgPT0gbnVsbCkKKwlpZiAodGhpcy5rbm93blR5cGVzID09IG51bGwpCiAJCXJldHVybiBudWxsOwotCXJldHVybiBrbm93blR5cGVzLmdldChuYW1lKTsKKwlyZXR1cm4gdGhpcy5rbm93blR5cGVzLmdldChuYW1lKTsKIH0KIC8qIEFuc3dlciB0aGUgcGFja2FnZSBvciB0eXBlIG5hbWVkIG5hbWU7IGFzayB0aGUgb3JhY2xlIGlmIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUuCiAqIEFuc3dlciBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KQEAgLTE2MiwyMyArMTYzLDI4IEBACiAqLwogCiBwdWJsaWMgQmluZGluZyBnZXRUeXBlT3JQYWNrYWdlKGNoYXJbXSBuYW1lKSB7Ci0JUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IGdldFR5cGUwKG5hbWUpOwotCWlmICh0eXBlQmluZGluZyAhPSBudWxsICYmIHR5cGVCaW5kaW5nICE9IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kVHlwZSkgewotCQl0eXBlQmluZGluZyA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHR5cGVCaW5kaW5nLCBlbnZpcm9ubWVudCwgZmFsc2UpOyAvLyBubyByYXcgY29udmVyc2lvbiBmb3Igbm93Ci0JCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgdHlwZUJpbmRpbmcsIFByb2JsZW1SZWFzb25zLkludGVybmFsTmFtZVByb3ZpZGVkKTsKLQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IGdldFR5cGUwKG5hbWUpOworCWlmIChyZWZlcmVuY2VCaW5kaW5nICE9IG51bGwgJiYgcmVmZXJlbmNlQmluZGluZyAhPSBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFR5cGUpIHsKKwkJcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZShyZWZlcmVuY2VCaW5kaW5nLCB0aGlzLmVudmlyb25tZW50LCBmYWxzZSAvKiBubyByYXcgY29udmVyc2lvbiBmb3Igbm93ICovKTsKKwkJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde25hbWV9LCByZWZlcmVuY2VCaW5kaW5nLCBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZCk7CisJCX0KKwkJaWYgKChyZWZlcmVuY2VCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZzsKKwkJfQorCQkvLyByZWZlcmVuY2VCaW5kaW5nIGlzIGEgTWlzc2luZ1R5cGUsIHdpbGwgcmV0dXJuIGl0IGlmIG5vIHBhY2thZ2UgaXMgZm91bmQKIAl9CiAKIAlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKG5hbWUpOwotCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsICYmIHBhY2thZ2VCaW5kaW5nICE9IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kUGFja2FnZSkKKwlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCAmJiBwYWNrYWdlQmluZGluZyAhPSBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFBhY2thZ2UpIHsKIAkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOwotCi0JaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsgLy8gaGF2ZSBub3QgbG9va2VkIGZvciBpdCBiZWZvcmUKLQkJaWYgKCh0eXBlQmluZGluZyA9IGVudmlyb25tZW50LmFza0ZvclR5cGUodGhpcywgbmFtZSkpICE9IG51bGwpIHsKLQkJCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkKLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIHR5cGVCaW5kaW5nLCBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZCk7Ci0JCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJfQorCWlmIChyZWZlcmVuY2VCaW5kaW5nID09IG51bGwpIHsgLy8gaGF2ZSBub3QgbG9va2VkIGZvciBpdCBiZWZvcmUKKwkJaWYgKChyZWZlcmVuY2VCaW5kaW5nID0gdGhpcy5lbnZpcm9ubWVudC5hc2tGb3JUeXBlKHRoaXMsIG5hbWUpKSAhPSBudWxsKSB7CisJCQlpZiAocmVmZXJlbmNlQmluZGluZy5pc05lc3RlZFR5cGUoKSkgeworCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde25hbWV9LCByZWZlcmVuY2VCaW5kaW5nLCBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZCk7CisJCQl9CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZzsKIAkJfQogCiAJCS8vIFNpbmNlIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLCBhZGQgYSBwcm9ibGVtIGJpbmRpbmcKQEAgLTE4NywyMCArMTkzLDU2IEBACiAJfQogCiAJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwpIHsgLy8gaGF2ZSBub3QgbG9va2VkIGZvciBpdCBiZWZvcmUKLQkJaWYgKChwYWNrYWdlQmluZGluZyA9IGZpbmRQYWNrYWdlKG5hbWUpKSAhPSBudWxsKQorCQlpZiAoKHBhY2thZ2VCaW5kaW5nID0gZmluZFBhY2thZ2UobmFtZSkpICE9IG51bGwpIHsKIAkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwkJfQorCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsICYmIHJlZmVyZW5jZUJpbmRpbmcgIT0gTG9va3VwRW52aXJvbm1lbnQuVGhlTm90Rm91bmRUeXBlKSB7CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZzsgLy8gZm91bmQgY2FjaGVkIG1pc3NpbmcgdHlwZSAtIGNoZWNrIGlmIHBhY2thZ2UgY29uZmxpY3QKKwkJfQogCQlhZGROb3RGb3VuZFBhY2thZ2UobmFtZSk7CiAJfQogCiAJcmV0dXJuIG51bGw7CiB9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZpZXdlZEFzRGVwcmVjYXRlZCgpIHsKKwlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCkgPT0gMCkgeworCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5EZXByZWNhdGVkQW5ub3RhdGlvblJlc29sdmVkOworCQlpZiAodGhpcy5jb21wb3VuZE5hbWUgIT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcGFja2FnZUluZm8gPSB0aGlzLmdldFR5cGUoVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSk7CisJCQlpZiAocGFja2FnZUluZm8gIT0gbnVsbCkgeworCQkJCXBhY2thZ2VJbmZvLmluaXRpYWxpemVEZXByZWNhdGVkQW5ub3RhdGlvblRhZ0JpdHMoKTsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gcGFja2FnZUluZm8udGFnQml0cyAmIFRhZ0JpdHMuQWxsU3RhbmRhcmRBbm5vdGF0aW9uc01hc2s7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25EZXByZWNhdGVkKSAhPSAwOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBiaW5kaW5nIHR5cGUgZnJvbSBCaW5kaW5nLkJpbmRpbmdJRC4KKyovCitwdWJsaWMgZmluYWwgaW50IGtpbmQoKSB7CisJcmV0dXJuIEJpbmRpbmcuUEFDS0FHRTsKK30KKworcHVibGljIGludCBwcm9ibGVtSWQoKSB7CisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKQorCQlyZXR1cm4gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQ7CisJcmV0dXJuIFByb2JsZW1SZWFzb25zLk5vRXJyb3I7Cit9CisKIHB1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgLypqYXZhLmxhbmcqLyB7Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyk7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmNvbXBvdW5kTmFtZSwgJy4nKTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JaWYgKGNvbXBvdW5kTmFtZSA9PSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKLQkJcmV0dXJuICJUaGUgRGVmYXVsdCBQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCWVsc2UKLQkJcmV0dXJuICJwYWNrYWdlICIgKyAoKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IENoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCVN0cmluZyBzdHI7CisJaWYgKHRoaXMuY29tcG91bmROYW1lID09IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKSB7CisJCXN0ciA9ICJUaGUgRGVmYXVsdCBQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXN0ciA9ICJwYWNrYWdlICIgKyAoKHRoaXMuY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyh0aGlzLmNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCXN0ciArPSAiW01JU1NJTkddIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gc3RyOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYXJhbWV0ZXJpemVkRmllbGRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcuamF2YQppbmRleCBjYmFjYzM5Li40YTk2M2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCwyNSArMjAsMjUgQEAKICAqIHRoZXNlIGZpZWxkcy4KICAqLwogcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcgZXh0ZW5kcyBGaWVsZEJpbmRpbmcgewotICAgIAorCiAgICAgcHVibGljIEZpZWxkQmluZGluZyBvcmlnaW5hbEZpZWxkOwotICAgIAorCiBwdWJsaWMgUGFyYW1ldGVyaXplZEZpZWxkQmluZGluZyhQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZERlY2xhcmluZ0NsYXNzLCBGaWVsZEJpbmRpbmcgb3JpZ2luYWxGaWVsZCkgewogICAgIHN1cGVyICgKLSAgICAgICAgICAgIG9yaWdpbmFsRmllbGQubmFtZSwgCisgICAgICAgICAgICBvcmlnaW5hbEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAob3JpZ2luYWxGaWVsZC5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bSkgIT0gMAogICAgICAgICAgICAgCT8gcGFyYW1ldGVyaXplZERlY2xhcmluZ0NsYXNzIC8vIGVudW0gY29uc3RhbnQgZ2V0IHBhcmFtVHlwZSBhcyBpdHMgdHlwZQotICAgICAgIAkJCTogKG9yaWdpbmFsRmllbGQubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykgIT0gMCAKKyAgICAgICAJCQk6IChvcmlnaW5hbEZpZWxkLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDAKICAgICAgICAJCQkJCT8gb3JpZ2luYWxGaWVsZC50eXBlIC8vIG5vIHN1YnN0IGZvciBzdGF0aWMgZmllbGQKLSAgICAgICAJCQkJCTogU2NvcGUuc3Vic3RpdHV0ZShwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3MsIG9yaWdpbmFsRmllbGQudHlwZSksIAotICAgICAgICAgICAgb3JpZ2luYWxGaWVsZC5tb2RpZmllcnMsIAotICAgICAgICAgICAgcGFyYW1ldGVyaXplZERlY2xhcmluZ0NsYXNzLCAKKyAgICAgICAJCQkJCTogU2NvcGUuc3Vic3RpdHV0ZShwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3MsIG9yaWdpbmFsRmllbGQudHlwZSksCisgICAgICAgICAgICBvcmlnaW5hbEZpZWxkLm1vZGlmaWVycywKKyAgICAgICAgICAgIHBhcmFtZXRlcml6ZWREZWNsYXJpbmdDbGFzcywKICAgICAgICAgICAgIG51bGwpOwogICAgIHRoaXMub3JpZ2luYWxGaWVsZCA9IG9yaWdpbmFsRmllbGQ7CiAgICAgdGhpcy50YWdCaXRzID0gb3JpZ2luYWxGaWVsZC50YWdCaXRzOwogICAgIHRoaXMuaWQgPSBvcmlnaW5hbEZpZWxkLmlkOwogfQotCQorCiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmcjY29uc3RhbnQoKQogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcuamF2YQppbmRleCA2MWMzNDM0Li4xZWIxNzZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2lsZGNhcmQ7CiAKIC8qKgogICogQmluZGluZyBkZW5vdGluZyBhIGdlbmVyaWMgbWV0aG9kIGFmdGVyIHR5cGUgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbnMgZ290IHBlcmZvcm1lZC4KQEAgLTIwLDIzICsyMCwyMiBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIGV4dGVuZHMgUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcgaW1wbGVtZW50cyBTdWJzdGl0dXRpb24gewogCi0gICAgcHVibGljIFR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50czsgCisgICAgcHVibGljIFR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50czsKICAgICBwcml2YXRlIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OwogICAgIHB1YmxpYyBib29sZWFuIGluZmVycmVkUmV0dXJuVHlwZTsKICAgICBwdWJsaWMgYm9vbGVhbiB3YXNJbmZlcnJlZDsgLy8gb25seSBzZXQgdG8gdHJ1ZSBmb3IgaW5zdGFuY2VzIHJlc3VsdGluZyBmcm9tIG1ldGhvZCBpbnZvY2F0aW9uIGluZmVycmVuY2UKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdzsgLy8gc2V0IHRvIHRydWUgZm9yIG1ldGhvZCBiZWhhdmluZyBhcyByYXcgZm9yIHN1YnN0aXR1dGlvbiBwdXJwb3NlCiAgICAgcHJpdmF0ZSBNZXRob2RCaW5kaW5nIHRpZWJyZWFrTWV0aG9kOwotICAgIHB1YmxpYyBib29sZWFuIGlzVW5jaGVja2VkOyAvLyB0cmFuc2llbnQgZmxhZyBzZXQgZHVyaW5nIGluZmVyZW5jZSAod2FybmluZzogYmluZGluZ3MgYXJlIHNoYXJlZCwgc28gZmxhZyBjYW5ub3QgYmUgdHJ1c3RlZCBiZXlvbmQpCi0JCisKIAkvKioKIAkgKiBQZXJmb3JtIGluZmVyZW5jZSBvZiBnZW5lcmljIG1ldGhvZCB0eXBlIHBhcmFtZXRlcnMgYW5kL29yIGV4cGVjdGVkIHR5cGUKLQkgKi8JCisJICovCiAJcHVibGljIHN0YXRpYyBNZXRob2RCaW5kaW5nIGNvbXB1dGVDb21wYXRpYmxlTWV0aG9kKE1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRzLCBTY29wZSBzY29wZSwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKLQkJCiAJCVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZyBtZXRob2RTdWJzdGl0dXRlOwogCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IG9yaWdpbmFsTWV0aG9kLnR5cGVWYXJpYWJsZXM7CiAJCVR5cGVCaW5kaW5nW10gc3Vic3RpdHV0ZXMgPSBpbnZvY2F0aW9uU2l0ZS5nZW5lcmljVHlwZUFyZ3VtZW50cygpOwotCQkKKwkJSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0ID0gbnVsbDsKKwkJVHlwZUJpbmRpbmdbXSB1bmNoZWNrZWRBcmd1bWVudHMgPSBudWxsOwogCQljb21wdXRlU3Vic3RpdHV0ZXM6IHsKIAkJCWlmIChzdWJzdGl0dXRlcyAhPSBudWxsKSB7CiAJCQkJLy8gZXhwbGljaXQgdHlwZSBhcmd1bWVudHMgZ290IHN1cHBsaWVkCkBAIC00Nyw2MSArNDYsNzIgQEAKIAkJCQltZXRob2RTdWJzdGl0dXRlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZChvcmlnaW5hbE1ldGhvZCwgc3Vic3RpdHV0ZXMpOwogCQkJCWJyZWFrIGNvbXB1dGVTdWJzdGl0dXRlczsKIAkJCX0KLQkJCQogCQkJLy8gcGVyZm9ybSB0eXBlIGFyZ3VtZW50IGluZmVyZW5jZSAoMTUuMTIuMi43KQotCQkJCQogCQkJLy8gaW5pdGlhbGl6ZXMgdGhlIG1hcCBvZiBzdWJzdGl0dXRlcyAodmFyIC0tPiB0eXBlW11bXXsgZXF1YWwsIGV4dGVuZHMsIHN1cGVyfQogCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gb3JpZ2luYWxNZXRob2QucGFyYW1ldGVyczsKLQkJCUluZmVyZW5jZUNvbnRleHQgaW5mZXJlbmNlQ29udGV4dCA9IG5ldyBJbmZlcmVuY2VDb250ZXh0KG9yaWdpbmFsTWV0aG9kKTsKKwkJCWluZmVyZW5jZUNvbnRleHQgPSBuZXcgSW5mZXJlbmNlQ29udGV4dChvcmlnaW5hbE1ldGhvZCk7CiAJCQltZXRob2RTdWJzdGl0dXRlID0gaW5mZXJGcm9tQXJndW1lbnRUeXBlcyhzY29wZSwgb3JpZ2luYWxNZXRob2QsIGFyZ3VtZW50cywgcGFyYW1ldGVycywgaW5mZXJlbmNlQ29udGV4dCk7Ci0JCQlpZiAobWV0aG9kU3Vic3RpdHV0ZSA9PSBudWxsKSAKKwkJCWlmIChtZXRob2RTdWJzdGl0dXRlID09IG51bGwpCiAJCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBzdWJzdGl0dXRlcyBtYXkgaG9sZCBudWxsIHRvIGRlbm90ZSB1bnJlc29sdmVkIHZhcnMsIGJ1dCBudWxsIGFyZ3VtZW50cyBnb3QgcmVwbGFjZWQgd2l0aCByZXNwZWN0aXZlIG9yaWdpbmFsIHZhcmlhYmxlIGluIHBhcmFtIG1ldGhvZAogCQkJCisJCQkvLyBzdWJzdGl0dXRlcyBtYXkgaG9sZCBudWxsIHRvIGRlbm90ZSB1bnJlc29sdmVkIHZhcnMsIGJ1dCBudWxsIGFyZ3VtZW50cyBnb3QgcmVwbGFjZWQgd2l0aCByZXNwZWN0aXZlIG9yaWdpbmFsIHZhcmlhYmxlIGluIHBhcmFtIG1ldGhvZAogCQkJLy8gMTUuMTIuMi44IC0gaW5mZXJyaW5nIHVucmVzb2x2ZWQgdHlwZSBhcmd1bWVudHMKIAkJCWlmIChpbmZlcmVuY2VDb250ZXh0Lmhhc1VucmVzb2x2ZWRUeXBlQXJndW1lbnQoKSkgeworCQkJCWlmIChpbmZlcmVuY2VDb250ZXh0LmlzVW5jaGVja2VkKSB7IC8vIG9ubHkgcmVtZW1iZXIgdW5jaGVja2VkIHN0YXR1cyBwb3N0IDE1LjEyLjIuNworCQkJCQlpbnQgbGVuZ3RoID0gaW5mZXJlbmNlQ29udGV4dC5zdWJzdGl0dXRlcy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW5mZXJlbmNlQ29udGV4dC5zdWJzdGl0dXRlcywgMCwgdW5jaGVja2VkQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJCQkJfQogCQkJCWlmIChtZXRob2RTdWJzdGl0dXRlLnJldHVyblR5cGUgIT0gVHlwZUJpbmRpbmcuVk9JRCkgewotCQkJCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUgPSBudWxsOwotCQkJCQkvLyBpZiBtZXNzYWdlIGludm9jYXRpb24gaGFzIGV4cGVjdGVkIHR5cGUKLQkJCQkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKLQkJCQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2UgPSAoTWVzc2FnZVNlbmQpIGludm9jYXRpb25TaXRlOwotCQkJCQkJZXhwZWN0ZWRUeXBlID0gbWVzc2FnZS5leHBlY3RlZFR5cGU7Ci0JCQkJCX0KKwkJCQkJVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlID0gaW52b2NhdGlvblNpdGUuZXhwZWN0ZWRUeXBlKCk7CiAJCQkJCWlmIChleHBlY3RlZFR5cGUgIT0gbnVsbCkgewogCQkJCQkJLy8gcmVjb3JkIGl0IHdhcyBleHBsaWNpdCBmcm9tIGNvbnRleHQsIGFzIG9wcG9zZWQgdG8gYXNzdW1lZCBieSBkZWZhdWx0IChzZWUgYmVsb3cpCi0JCQkJCQlpbmZlcmVuY2VDb250ZXh0Lmhhc0V4cGxpY2l0RXhwZWN0ZWRUeXBlID0gdHJ1ZTsgCisJCQkJCQlpbmZlcmVuY2VDb250ZXh0Lmhhc0V4cGxpY2l0RXhwZWN0ZWRUeXBlID0gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWV4cGVjdGVkVHlwZSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7IC8vIGFzc3VtZSBPYmplY3QgYnkgZGVmYXVsdAogCQkJCQl9CiAJCQkJCWluZmVyZW5jZUNvbnRleHQuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlOwogCQkJCX0KIAkJCQltZXRob2RTdWJzdGl0dXRlID0gbWV0aG9kU3Vic3RpdHV0ZS5pbmZlckZyb21FeHBlY3RlZFR5cGUoc2NvcGUsIGluZmVyZW5jZUNvbnRleHQpOwotCQkJCWlmIChtZXRob2RTdWJzdGl0dXRlID09IG51bGwpIAorCQkJCWlmIChtZXRob2RTdWJzdGl0dXRlID09IG51bGwpCiAJCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9CiAKLQkJLy8gYm91bmRzIGNoZWNrCi0JCWlmICghbWV0aG9kU3Vic3RpdHV0ZS5pc1JhdykgewotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCSAgICBUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZXNbaV07Ci0JCQkgICAgVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZSA9IG1ldGhvZFN1YnN0aXR1dGUudHlwZUFyZ3VtZW50c1tpXTsKLQkJCQlzd2l0Y2ggKHR5cGVWYXJpYWJsZS5ib3VuZENoZWNrKG1ldGhvZFN1YnN0aXR1dGUsIHN1YnN0aXR1dGUpKSB7Ci0JCQkJCWNhc2UgVHlwZUNvbnN0YW50cy5NSVNNQVRDSCA6Ci0JCQkJICAgICAgICAvLyBpbmNvbXBhdGlibGUgZHVlIHRvIGJvdW5kIGNoZWNrCi0JCQkJCQlpbnQgYXJnTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKLQkJCQkJCVR5cGVCaW5kaW5nW10gYXVnbWVudGVkQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2FyZ0xlbmd0aCArIDJdOyAvLyBhcHBlbmQgb2ZmZW5kaW5nIHN1YnN0aXR1dGUgYW5kIHR5cGVWYXJpYWJsZSAKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCBhdWdtZW50ZWRBcmd1bWVudHMsIDAsIGFyZ0xlbmd0aCk7Ci0JCQkJCQlhdWdtZW50ZWRBcmd1bWVudHNbYXJnTGVuZ3RoXSA9IHN1YnN0aXR1dGU7Ci0JCQkJCQlhdWdtZW50ZWRBcmd1bWVudHNbYXJnTGVuZ3RoKzFdID0gdHlwZVZhcmlhYmxlOwotCQkJCSAgICAgICAgcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2RTdWJzdGl0dXRlLCBvcmlnaW5hbE1ldGhvZC5zZWxlY3RvciwgYXVnbWVudGVkQXJndW1lbnRzLCBQcm9ibGVtUmVhc29ucy5QYXJhbWV0ZXJCb3VuZE1pc21hdGNoKTsKLQkJCQkJY2FzZSBUeXBlQ29uc3RhbnRzLlVOQ0hFQ0tFRCA6Ci0JCQkJCQkvLyB0b2xlcmF0ZSB1bmNoZWNrZWQgYm91bmRzCi0JCQkJCQltZXRob2RTdWJzdGl0dXRlLmlzVW5jaGVja2VkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KKwkJLyogYm91bmRzIGNoZWNrOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyMTU5LCBJbmZlcnJlZCB0eXBlcyBtYXkgY29udGFpbiBzZWxmIHJlZmVyZW5jZQorCQkgICBpbiBmb3JtYWwgYm91bmRzLiBJZiAiVCBleHRlbmRzIEk8VD4iIGlzIGEgb3JpZ2luYWwgdHlwZSB2YXJpYWJsZSBhbmQgVCB3YXMgaW5mZXJyZWQgdG8gYmUgSTxUPiBkdWUgcG9zc2libHkKKwkJICAgdG8gdW5kZXIgY29uc3RyYWludHMgYW5kIHJlc3VsdGFudCBnbGIgYXBwbGljYXRpb24gcGVyIDE1LjEyLjIuOCwgdXNpbmcgdGhpcy50eXBlQXJndW1lbnRzIHRvIGRyaXZlIHRoZSBib3VuZHMKKwkJICAgY2hlY2sgYWdhaW5zdCBpdHNlbGYgaXMgZG9vbWVkIHRvIGZhaWwuIEZvciwgdGhlIHZhcmlhYmxlIFQgd291bGQgYWZ0ZXIgc3Vic3RpdHV0aW9uIGJlIEk8STxUPj4gYW5kIHdvdWxkIGZhaWwKKwkJICAgYm91bmRzIGNoZWNrIGFnYWluc3QgSTxUPi4gVXNlIHRoZSBpbmZlcnJlZCB0eXBlcyBmcm9tIHRoZSBjb250ZXh0IGRpcmVjdGx5IC0gc2VlIHRoYXQgdGhlcmUgaXMgb25lIHJvdW5kIG9mCisJCSAgIGV4dHJhIHN1YnN0aXR1dGlvbiB0aGF0IGhhcyB0YWtlbiBwbGFjZSB0byBwcm9wZXJseSBzdWJzdGl0dXRlIGEgcmVtYWluaW5nIHVucmVzb2x2ZWQgdmFyaWFibGUgd2hpY2ggYWxzbyBhcHBlYXJzCisJCSAgIGluIGEgZm9ybWFsIGJvdW5kICAoU28gd2UgcmVhbGx5IGhhdmUgYSBib3VuZHMgbWlzbWF0Y2ggYmV0d2VlbiBJPEk8VD4+IGFuZCBJPEk8STxUPj4+LCBpbiB0aGUgYWJzZW5jZSBvZiBhIGZpeC4pCisJCSovCisJCVN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBudWxsOworCQlpZiAoaW5mZXJlbmNlQ29udGV4dCAhPSBudWxsKSB7CisJCQlzdWJzdGl0dXRpb24gPSBuZXcgTGluZ2VyaW5nVHlwZVZhcmlhYmxlRWxpbWluYXRvcih0eXBlVmFyaWFibGVzLCBpbmZlcmVuY2VDb250ZXh0LnN1YnN0aXR1dGVzLCBzY29wZSk7CisJCX0gZWxzZSB7CisJCQlzdWJzdGl0dXRpb24gPSBtZXRob2RTdWJzdGl0dXRlOworCQl9CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCSAgICBUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZXNbaV07CisJCSAgICBUeXBlQmluZGluZyBzdWJzdGl0dXRlID0gbWV0aG9kU3Vic3RpdHV0ZS50eXBlQXJndW1lbnRzW2ldOyAvLyByZXRhaW4gZm9yIGRpYWdub3N0aWNzCisJCSAgICBUeXBlQmluZGluZyBzdWJzdGl0dXRlRm9yQ2hlY2tzID0gU2NvcGUuc3Vic3RpdHV0ZShuZXcgTGluZ2VyaW5nVHlwZVZhcmlhYmxlRWxpbWluYXRvcih0eXBlVmFyaWFibGVzLCBudWxsLCBzY29wZSksIHN1YnN0aXR1dGUpOyAvLyB3aGlsZSB1c2luZyB0aGlzIGZvciBib3VuZHMgY2hlY2sKKwkJICAgIGlmICh1bmNoZWNrZWRBcmd1bWVudHMgIT0gbnVsbCAmJiB1bmNoZWNrZWRBcmd1bWVudHNbaV0gPT0gbnVsbCkgY29udGludWU7IC8vIG9ubHkgYm91bmQgY2hlY2sgaWYgaW5mZXJyZWQgdGhyb3VnaCAxNS4xMi4yLjYKKwkJCXN3aXRjaCAodHlwZVZhcmlhYmxlLmJvdW5kQ2hlY2soc3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRlRm9yQ2hlY2tzKSkgeworCQkJCWNhc2UgVHlwZUNvbnN0YW50cy5NSVNNQVRDSCA6CisJCQkgICAgICAgIC8vIGluY29tcGF0aWJsZSBkdWUgdG8gYm91bmQgY2hlY2sKKwkJCQkJaW50IGFyZ0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCQkJCVR5cGVCaW5kaW5nW10gYXVnbWVudGVkQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2FyZ0xlbmd0aCArIDJdOyAvLyBhcHBlbmQgb2ZmZW5kaW5nIHN1YnN0aXR1dGUgYW5kIHR5cGVWYXJpYWJsZQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgYXVnbWVudGVkQXJndW1lbnRzLCAwLCBhcmdMZW5ndGgpOworCQkJCQlhdWdtZW50ZWRBcmd1bWVudHNbYXJnTGVuZ3RoXSA9IHN1YnN0aXR1dGU7CisJCQkJCWF1Z21lbnRlZEFyZ3VtZW50c1thcmdMZW5ndGgrMV0gPSB0eXBlVmFyaWFibGU7CisJCQkgICAgICAgIHJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kU3Vic3RpdHV0ZSwgb3JpZ2luYWxNZXRob2Quc2VsZWN0b3IsIGF1Z21lbnRlZEFyZ3VtZW50cywgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyQm91bmRNaXNtYXRjaCk7CisJCQkJY2FzZSBUeXBlQ29uc3RhbnRzLlVOQ0hFQ0tFRCA6CisJCQkJCS8vIHRvbGVyYXRlIHVuY2hlY2tlZCBib3VuZHMKKwkJCQkJbWV0aG9kU3Vic3RpdHV0ZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzVW5jaGVja2VkVHlwZUFyZ3VtZW50Rm9yQm91bmRDaGVjazsKKwkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKwkJLy8gY2hlY2sgcHJlc2VuY2Ugb2YgdW5jaGVja2VkIGFyZ3VtZW50IGNvbnZlcnNpb24gYSBwb3N0ZXJpb3JpICgxNS4xMi4yLjYpCiAJCXJldHVybiBtZXRob2RTdWJzdGl0dXRlOwogCX0KIApAQCAtMTA5LDcgKzExOSw2IEBACiAJICogQ29sbGVjdCBhcmd1bWVudCB0eXBlIG1hcHBpbmcsIGhhbmRsaW5nIHZhcmFyZ3MKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgaW5mZXJGcm9tQXJndW1lbnRUeXBlcyhTY29wZSBzY29wZSwgTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMsIFR5cGVCaW5kaW5nW10gcGFyYW1ldGVycywgSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0KSB7Ci0KIAkJaWYgKG9yaWdpbmFsTWV0aG9kLmlzVmFyYXJncygpKSB7CiAJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKIAkJCWludCBtaW5BcmdMZW5ndGggPSBwYXJhbUxlbmd0aCAtIDE7CkBAIC0xMzcsNyArMTQ2LDcgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQkvLyBlbGltaW5hdGUgb25lIGFycmF5IGRpbWVuc2lvbgotCQkJCQl2YXJhcmdUeXBlID0gKChBcnJheUJpbmRpbmcpdmFyYXJnVHlwZSkuZWxlbWVudHNUeXBlKCk7IAorCQkJCQl2YXJhcmdUeXBlID0gKChBcnJheUJpbmRpbmcpdmFyYXJnVHlwZSkuZWxlbWVudHNUeXBlKCk7CiAJCQkJfQogCQkJCWZvciAoaW50IGkgPSBtaW5BcmdMZW5ndGg7IGkgPCBhcmdMZW5ndGg7IGkrKykgewogCQkJCQl2YXJhcmdUeXBlLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYXJndW1lbnRzW2ldLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7CkBAIC0xNTEsMTIgKzE2MCw4IEBACiAJCQkJaWYgKGluZmVyZW5jZUNvbnRleHQuc3RhdHVzID09IEluZmVyZW5jZUNvbnRleHQuRkFJTEVEKSByZXR1cm4gbnVsbDsgLy8gaW1wb3NzaWJsZSBzdWJzdGl0dXRpb24KIAkJCX0KIAkJfQotCQlpZiAoaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPT0gSW5mZXJlbmNlQ29udGV4dC5SQVdfU1VCU1RJVFVUSU9OKSB7Ci0JCQkvLyByYXcgZ2VuZXJpYyBtZXRob2QgaW5mZXJyZWQKLQkJCXJldHVybiBzY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKG9yaWdpbmFsTWV0aG9kLCAoUmF3VHlwZUJpbmRpbmcpbnVsbCk7Ci0JCX0KIAkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIG9yaWdpbmFsVmFyaWFibGVzID0gb3JpZ2luYWxNZXRob2QudHlwZVZhcmlhYmxlczsKLQkJaWYgKCFyZXNvbHZlU3Vic3RpdHV0ZUNvbnN0cmFpbnRzKHNjb3BlLCBvcmlnaW5hbFZhcmlhYmxlcyAsIGluZmVyZW5jZUNvbnRleHQsIGZhbHNlLyppZ25vcmUgVGk8OlVrKi8pKSAKKwkJaWYgKCFyZXNvbHZlU3Vic3RpdHV0ZUNvbnN0cmFpbnRzKHNjb3BlLCBvcmlnaW5hbFZhcmlhYmxlcyAsIGluZmVyZW5jZUNvbnRleHQsIGZhbHNlLyppZ25vcmUgVGk8OlVrKi8pKQogCQkJcmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgc3Vic3RpdHV0aW9uCiAKIAkJLy8gYXBwbHkgaW5mZXJyZWQgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyAtIHJlcGxhY2luZyB1bnJlc29sdmVkIHZhcmlhYmxlIHdpdGggb3JpZ2luYWwgb25lcyBpbiBwYXJhbSBtZXRob2QKQEAgLTE3NSwxMiArMTgwLDEyIEBACiAJCVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZyBwYXJhbU1ldGhvZCA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2Qob3JpZ2luYWxNZXRob2QsIGFjdHVhbFN1YnN0aXR1dGVzKTsKIAkJcmV0dXJuIHBhcmFtTWV0aG9kOwogCX0KLQkKKwogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVzb2x2ZVN1YnN0aXR1dGVDb25zdHJhaW50cyhTY29wZSBzY29wZSwgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMsIEluZmVyZW5jZUNvbnRleHQgaW5mZXJlbmNlQ29udGV4dCwgYm9vbGVhbiBjb25zaWRlckVYVEVORFNDb25zdHJhaW50cykgewogCQlUeXBlQmluZGluZ1tdIHN1YnN0aXR1dGVzID0gaW5mZXJlbmNlQ29udGV4dC5zdWJzdGl0dXRlczsKIAkJaW50IHZhckxlbmd0aCA9IHR5cGVWYXJpYWJsZXMubGVuZ3RoOwogCQkvLyBjaGVjayBUaj1VIGNvbnN0cmFpbnRzCi0JCW5leHRUeXBlUGFyYW1ldGVyOiAKKwkJbmV4dFR5cGVQYXJhbWV0ZXI6CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKSB7CiAJCQkJVHlwZVZhcmlhYmxlQmluZGluZyBjdXJyZW50ID0gdHlwZVZhcmlhYmxlc1tpXTsKIAkJCQlUeXBlQmluZGluZyBzdWJzdGl0dXRlID0gc3Vic3RpdHV0ZXNbaV07CkBAIC0yMTgsNyArMjIzLDcgQEAKIAkJCX0KIAkJaWYgKGluZmVyZW5jZUNvbnRleHQuaGFzVW5yZXNvbHZlZFR5cGVBcmd1bWVudCgpKSB7CiAJCQkvLyBjaGVjayBUaj46VSBjb25zdHJhaW50cwotCQkJbmV4dFR5cGVQYXJhbWV0ZXI6IAorCQkJbmV4dFR5cGVQYXJhbWV0ZXI6CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJMZW5ndGg7IGkrKykgewogCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIGN1cnJlbnQgPSB0eXBlVmFyaWFibGVzW2ldOwogCQkJCQlUeXBlQmluZGluZyBzdWJzdGl0dXRlID0gc3Vic3RpdHV0ZXNbaV07CkBAIC0yMzYsNyArMjQxLDcgQEAKIAkJfQogCQlpZiAoY29uc2lkZXJFWFRFTkRTQ29uc3RyYWludHMgJiYgaW5mZXJlbmNlQ29udGV4dC5oYXNVbnJlc29sdmVkVHlwZUFyZ3VtZW50KCkpIHsKIAkJCS8vIGNoZWNrIFRqPDpVIGNvbnN0cmFpbnRzCi0JCQluZXh0VHlwZVBhcmFtZXRlcjogCisJCQluZXh0VHlwZVBhcmFtZXRlcjoKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKSB7CiAJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgY3VycmVudCA9IHR5cGVWYXJpYWJsZXNbaV07CiAJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGUgPSBzdWJzdGl0dXRlc1tpXTsKQEAgLTI0NSwyOCArMjUwLDM1IEBACiAJCQkJCWlmIChib3VuZHMgPT0gbnVsbCkgY29udGludWUgbmV4dFR5cGVQYXJhbWV0ZXI7CiAJCQkJCVR5cGVCaW5kaW5nW10gZ2xiID0gU2NvcGUuZ3JlYXRlckxvd2VyQm91bmQoYm91bmRzKTsKIAkJCQkJVHlwZUJpbmRpbmcgbW9zdFNwZWNpZmljU3Vic3RpdHV0ZSA9IG51bGw7Ci0JCQkJCWlmIChnbGIgIT0gbnVsbCkgbW9zdFNwZWNpZmljU3Vic3RpdHV0ZSA9IGdsYlswXTsgLy8gVE9ETyAocGhpbGlwcGUpIG5lZWQgdG8gaW1wcm92ZQotCQkJCQkJLy9UeXBlQmluZGluZyBtb3N0U3BlY2lmaWNTdWJzdGl0dXRlID0gc2NvcGUuZ3JlYXRlckxvd2VyQm91bmQoYm91bmRzKTsKLQkJCQkJCWlmIChtb3N0U3BlY2lmaWNTdWJzdGl0dXRlICE9IG51bGwpIHsKLQkJCQkJCQlzdWJzdGl0dXRlc1tpXSA9IG1vc3RTcGVjaWZpY1N1YnN0aXR1dGU7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDE3OTUgLSBQZXIgMTUuMTIuMi44LCB3ZSBzaG91bGQgZnVsbHkgYXBwbHkgZ2xiCisJCQkJCWlmIChnbGIgIT0gbnVsbCkgeworCQkJCQkJaWYgKGdsYi5sZW5ndGggPT0gMSkgeworCQkJCQkJCW1vc3RTcGVjaWZpY1N1YnN0aXR1dGUgPSBnbGJbMF07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVR5cGVCaW5kaW5nIFtdIG90aGVyQm91bmRzID0gbmV3IFR5cGVCaW5kaW5nW2dsYi5sZW5ndGggLSAxXTsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGdsYiwgMSwgb3RoZXJCb3VuZHMsIDAsIGdsYi5sZW5ndGggLSAxKTsKKwkJCQkJCQltb3N0U3BlY2lmaWNTdWJzdGl0dXRlID0gc2NvcGUuZW52aXJvbm1lbnQoKS5jcmVhdGVXaWxkY2FyZChudWxsLCAwLCBnbGJbMF0sIG90aGVyQm91bmRzLCBXaWxkY2FyZC5FWFRFTkRTKTsKIAkJCQkJCX0KLQkJCQkJfSAKKwkJCQkJfQorCQkJCQlpZiAobW9zdFNwZWNpZmljU3Vic3RpdHV0ZSAhPSBudWxsKSB7CisJCQkJCQlzdWJzdGl0dXRlc1tpXSA9IG1vc3RTcGVjaWZpY1N1YnN0aXR1dGU7CisJCQkJCX0KKwkJCQl9CiAJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlIHJhdyBnZW5lcmljIG1ldGhvZCBmb3IgcmF3IHR5cGUgKGRvdWJsZSBzdWJzdGl0dXRpb24gZnJvbSB0eXBlIHZhcnMgd2l0aCByYXcgdHlwZSBhcmd1bWVudHMsIGFuZCBlcmFzdXJlIG9mIG1ldGhvZCB2YXJpYWJsZXMpCiAJICogT25seSBpbnZva2VkIGZvciBub24tc3RhdGljIGdlbmVyaWMgbWV0aG9kcyBvZiByYXcgdHlwZQogCSAqLwogCXB1YmxpYyBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyBvcmlnaW5hbE1ldGhvZCwgUmF3VHlwZUJpbmRpbmcgcmF3VHlwZSwgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQogCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gb3JpZ2luYWxWYXJpYWJsZXMgPSBvcmlnaW5hbE1ldGhvZC50eXBlVmFyaWFibGVzOwogCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxWYXJpYWJsZXMubGVuZ3RoOwogCQlUeXBlQmluZGluZ1tdIHJhd0FyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlyYXdBcmd1bWVudHNbaV0gPSAgZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZShvcmlnaW5hbFZhcmlhYmxlc1tpXS5lcmFzdXJlKCkpOwotCQl9CQkKKwkJCXJhd0FyZ3VtZW50c1tpXSA9ICBlbnZpcm9ubWVudC5jb252ZXJ0VG9SYXdUeXBlKG9yaWdpbmFsVmFyaWFibGVzW2ldLmVyYXN1cmUoKSwgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CisJCX0KIAkgICAgdGhpcy5pc1JhdyA9IHRydWU7CiAJICAgIHRoaXMudGFnQml0cyA9IG9yaWdpbmFsTWV0aG9kLnRhZ0JpdHM7CiAJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKQEAgLTI4MCwyMiArMjkyLDIxIEBACiAJICAgIHRoaXMucGFyYW1ldGVycyA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgaWdub3JlUmF3VHlwZVN1YnN0aXR1dGlvbgogCSAgICAJCQkJCQkJCQk/IG9yaWdpbmFsTWV0aG9kLnBhcmFtZXRlcnMgLy8gbm8gc3Vic3RpdHV0aW9uIGlmIG9yaWdpbmFsIHdhcyBzdGF0aWMKIAkgICAgCQkJCQkJCQkJOiBTY29wZS5zdWJzdGl0dXRlKHJhd1R5cGUsIG9yaWdpbmFsTWV0aG9kLnBhcmFtZXRlcnMpKTsKLQkgICAgdGhpcy50aHJvd25FeGNlcHRpb25zID0gU2NvcGUuc3Vic3RpdHV0ZSh0aGlzLCAJaWdub3JlUmF3VHlwZVN1YnN0aXR1dGlvbiAKKwkgICAgdGhpcy50aHJvd25FeGNlcHRpb25zID0gU2NvcGUuc3Vic3RpdHV0ZSh0aGlzLCAJaWdub3JlUmF3VHlwZVN1YnN0aXR1dGlvbgogCSAgICAJCQkJCQkJCQk/IG9yaWdpbmFsTWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgLy8gbm8gc3Vic3RpdHV0aW9uIGlmIG9yaWdpbmFsIHdhcyBzdGF0aWMKIAkgICAgCQkJCQkJCQkJOiBTY29wZS5zdWJzdGl0dXRlKHJhd1R5cGUsIG9yaWdpbmFsTWV0aG9kLnRocm93bkV4Y2VwdGlvbnMpKTsKIAkgICAgLy8gZXJyb3IgY2FzZSB3aGVyZSBleGNlcHRpb24gdHlwZSB2YXJpYWJsZSB3b3VsZCBoYXZlIGJlZW4gc3Vic3RpdHV0ZWQgYnkgYSBub24tcmVmZXJlbmNlIHR5cGUgKDIwNzU3MykKLQkgICAgaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyA9PSBudWxsKSB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CSAgICAJICAgIAotCSAgICB0aGlzLnJldHVyblR5cGUgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIGlnbm9yZVJhd1R5cGVTdWJzdGl0dXRpb24gCisJICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOworCSAgICB0aGlzLnJldHVyblR5cGUgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIGlnbm9yZVJhd1R5cGVTdWJzdGl0dXRpb24KIAkgICAgCQkJCQkJCQkJPyBvcmlnaW5hbE1ldGhvZC5yZXR1cm5UeXBlIC8vIG5vIHN1YnN0aXR1dGlvbiBpZiBvcmlnaW5hbCB3YXMgc3RhdGljCiAJICAgIAkJCQkJCQkJCTogU2NvcGUuc3Vic3RpdHV0ZShyYXdUeXBlLCBvcmlnaW5hbE1ldGhvZC5yZXR1cm5UeXBlKSk7CiAJICAgIHRoaXMud2FzSW5mZXJyZWQgPSBmYWxzZTsgLy8gbm90IHJlc3VsdGluZyBmcm9tIG1ldGhvZCBpbnZvY2F0aW9uIGluZmVycmVuY2UKIAl9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDcmVhdGUgbWV0aG9kIG9mIHBhcmFtZXRlcml6ZWQgdHlwZSwgc3Vic3RpdHV0aW5nIG9yaWdpbmFsIHBhcmFtZXRlcnMgd2l0aCB0eXBlIGFyZ3VtZW50cy4KICAgICAgKi8KIAlwdWJsaWMgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QsIFR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cywgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQogCSAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7CiAJCXRoaXMubW9kaWZpZXJzID0gb3JpZ2luYWxNZXRob2QubW9kaWZpZXJzOwogCQl0aGlzLnNlbGVjdG9yID0gb3JpZ2luYWxNZXRob2Quc2VsZWN0b3I7CkBAIC0zMDYsMTAgKzMxNywzMCBAQAogCSAgICB0aGlzLnRhZ0JpdHMgPSBvcmlnaW5hbE1ldGhvZC50YWdCaXRzOwogCSAgICB0aGlzLm9yaWdpbmFsTWV0aG9kID0gb3JpZ2luYWxNZXRob2Q7CiAJICAgIHRoaXMucGFyYW1ldGVycyA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgb3JpZ2luYWxNZXRob2QucGFyYW1ldGVycyk7Ci0JICAgIHRoaXMudGhyb3duRXhjZXB0aW9ucyA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgb3JpZ2luYWxNZXRob2QudGhyb3duRXhjZXB0aW9ucyk7CiAJICAgIC8vIGVycm9yIGNhc2Ugd2hlcmUgZXhjZXB0aW9uIHR5cGUgdmFyaWFibGUgd291bGQgaGF2ZSBiZWVuIHN1YnN0aXR1dGVkIGJ5IGEgbm9uLXJlZmVyZW5jZSB0eXBlICgyMDc1NzMpCi0JICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOwkgICAgCSAgICAKIAkgICAgdGhpcy5yZXR1cm5UeXBlID0gU2NvcGUuc3Vic3RpdHV0ZSh0aGlzLCBvcmlnaW5hbE1ldGhvZC5yZXR1cm5UeXBlKTsKKwkgICAgdGhpcy50aHJvd25FeGNlcHRpb25zID0gU2NvcGUuc3Vic3RpdHV0ZSh0aGlzLCBvcmlnaW5hbE1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsKKwkgICAgaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyA9PSBudWxsKSB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CisJCWNoZWNrTWlzc2luZ1R5cGU6IHsKKwkJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkKKwkJCQlicmVhayBjaGVja01pc3NpbmdUeXBlOworCQkJaWYgKCh0aGlzLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlpZiAoKHRoaXMucGFyYW1ldGVyc1tpXS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQl0aGlzLnRhZ0JpdHMgfD0gIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJCWJyZWFrIGNoZWNrTWlzc2luZ1R5cGU7CisJCQkJfQorCQkJfQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmICgodGhpcy50aHJvd25FeGNlcHRpb25zW2ldLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCXRoaXMudGFnQml0cyB8PSAgVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCQl9CisJCQl9CisJCX0KIAkgICAgdGhpcy53YXNJbmZlcnJlZCA9IHRydWU7Ly8gcmVzdWx0aW5nIGZyb20gbWV0aG9kIGludm9jYXRpb24gaW5mZXJyZW5jZQogCX0KIApAQCAtMzMyLDExICszNjMsMTAgQEAKIAkJYnVmZmVyLmFwcGVuZCgnPicpOwogCQlpbnQgcmVzdWx0TGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOwogCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbcmVzdWx0TGVuZ3RoXTsKLQkJYnVmZmVyLmdldENoYXJzKDAsIHJlc3VsdExlbmd0aCwgcmVzdWx0LCAwKTsJCisJCWJ1ZmZlci5nZXRDaGFycygwLCByZXN1bHRMZW5ndGgsIHJlc3VsdCwgMCk7CiAJCXJldHVybiByZXN1bHQ7Ci0JCQogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TdWJzdGl0dXRpb24jZW52aXJvbm1lbnQoKQogCSAqLwpAQCAtMzQ5LDcgKzM3OSw3IEBACiAJICovCiAJcHVibGljIGJvb2xlYW4gaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCkgewogCQkvLyBnZW5lcmljIHBhcmFtZXRlcml6ZWQgbWV0aG9kIGNhbiByZXByZXNlbnQgZWl0aGVyIGFuIGludm9jYXRpb24gb3IgYSByYXcgZ2VuZXJpYyBtZXRob2QKLQkJaWYgKHRoaXMud2FzSW5mZXJyZWQpIAorCQlpZiAodGhpcy53YXNJbmZlcnJlZCkKIAkJCXJldHVybiB0aGlzLm9yaWdpbmFsTWV0aG9kLmhhc1N1YnN0aXR1dGVkUGFyYW1ldGVycygpOwogCQlyZXR1cm4gc3VwZXIuaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCk7CiAJfQpAQCAtMzU4LDcgKzM4OCw3IEBACiAJICogTk9URTogZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbiBkZWxlZ2F0ZXMgdG8gaXRzIGRlY2xhcmluZyBtZXRob2QgKGNvdWxkIGJlIGEgcGFyYW1ldGVyaXplZCBvbmUpCiAJICovCiAJcHVibGljIGJvb2xlYW4gaGFzU3Vic3RpdHV0ZWRSZXR1cm5UeXBlKCkgewotCQlpZiAodGhpcy5pbmZlcnJlZFJldHVyblR5cGUpIAorCQlpZiAodGhpcy5pbmZlcnJlZFJldHVyblR5cGUpCiAJCQlyZXR1cm4gdGhpcy5vcmlnaW5hbE1ldGhvZC5oYXNTdWJzdGl0dXRlZFJldHVyblR5cGUoKTsKIAkJcmV0dXJuIHN1cGVyLmhhc1N1YnN0aXR1dGVkUmV0dXJuVHlwZSgpOwogCX0KQEAgLTM2OSw4NCArMzk5LDE0MSBAQAogCXByaXZhdGUgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIGluZmVyRnJvbUV4cGVjdGVkVHlwZShTY29wZSBzY29wZSwgSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0KSB7CiAJICAgIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSBvcmlnaW5hbFZhcmlhYmxlcyA9IHRoaXMub3JpZ2luYWxNZXRob2QudHlwZVZhcmlhYmxlczsgLy8gaW1tZWRpYXRlIHBhcmVudCAoY291bGQgYmUgYSBwYXJhbWV0ZXJpemVkIG1ldGhvZCkKIAkJaW50IHZhckxlbmd0aCA9IG9yaWdpbmFsVmFyaWFibGVzLmxlbmd0aDsKLQkJCi0JCWNvbXB1dGVTdWJzdGl0dXRlczogewotCQkgICAgLy8gaW5mZXIgZnJvbSBleHBlY3RlZCByZXR1cm4gdHlwZQotCQkJaWYgKGluZmVyZW5jZUNvbnRleHQuZXhwZWN0ZWRUeXBlICE9IG51bGwpIHsKLQkJCSAgICB0aGlzLnJldHVyblR5cGUuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBpbmZlcmVuY2VDb250ZXh0LmV4cGVjdGVkVHlwZSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKLQkJCSAgICBpZiAoaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPT0gSW5mZXJlbmNlQ29udGV4dC5GQUlMRUQpIHJldHVybiBudWxsOyAvLyBpbXBvc3NpYmxlIHN1YnN0aXR1dGlvbgotCQkJfQotCQkgICAgLy8gaW5mZXIgZnJvbSBib3VuZHMgb2YgdHlwZSBwYXJhbWV0ZXJzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKSB7Ci0JCQkJVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbFZhcmlhYmxlID0gb3JpZ2luYWxWYXJpYWJsZXNbaV07Ci0JCQkJVHlwZUJpbmRpbmcgYXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07Ci0JCQkJYm9vbGVhbiBhcmdBbHJlYWR5SW5mZXJyZWQgPSBhcmd1bWVudCAhPSBvcmlnaW5hbFZhcmlhYmxlOwotCQkJCWlmIChvcmlnaW5hbFZhcmlhYmxlLmZpcnN0Qm91bmQgPT0gb3JpZ2luYWxWYXJpYWJsZS5zdXBlcmNsYXNzKSB7Ci0JCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkQm91bmQgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcyk7Ci0JCQkJCWFyZ3VtZW50LmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgc3Vic3RpdHV0ZWRCb3VuZCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKLQkJCQkJaWYgKGluZmVyZW5jZUNvbnRleHQuc3RhdHVzID09IEluZmVyZW5jZUNvbnRleHQuRkFJTEVEKSByZXR1cm4gbnVsbDsgLy8gaW1wb3NzaWJsZSBzdWJzdGl0dXRpb24KLQkJCQkJLy8gSkxTIDE1LjEyLjIuOCBjbGFpbXMgcmV2ZXJzZSBpbmZlcmVuY2Ugc2hvdWxkbid0IG9jY3VyLCBob3dldmVyIGl0IGltcHJvdmVzIGluZmVyZW5jZQotCQkJCQkvLyBlLmcuIGdpdmVuOiA8RSBleHRlbmRzIE9iamVjdCwgUyBleHRlbmRzIENvbGxlY3Rpb248RT4+IFMgdGVzdDEoUyBwYXJhbSkKLQkJCQkJLy8gICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbjogdGVzdDEobmV3IFZlY3RvcjxTdHJpbmc+KCkpICAgIHdpbGwgaW5mZXI6IFM9VmVjdG9yPFN0cmluZz4gIGFuZCB3aXRoIGNvZGUgYmVsb3c6IEU9U3RyaW5nCi0JCQkJCWlmIChhcmdBbHJlYWR5SW5mZXJyZWQpIHsKLQkJCQkJCXN1YnN0aXR1dGVkQm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhcmd1bWVudCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VYVEVORFMpOwotCQkJCQkJaWYgKGluZmVyZW5jZUNvbnRleHQuc3RhdHVzID09IEluZmVyZW5jZUNvbnRleHQuRkFJTEVEKSByZXR1cm4gbnVsbDsgLy8gaW1wb3NzaWJsZSBzdWJzdGl0dXRpb24KLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBqID0gMCwgbWF4ID0gb3JpZ2luYWxWYXJpYWJsZS5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBqIDwgbWF4OyBqKyspIHsKLQkJCQkJVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZWRCb3VuZCA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgb3JpZ2luYWxWYXJpYWJsZS5zdXBlckludGVyZmFjZXNbal0pOwotCQkJCQlhcmd1bWVudC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIHN1YnN0aXR1dGVkQm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7Ci0JCQkJCWlmIChpbmZlcmVuY2VDb250ZXh0LnN0YXR1cyA9PSBJbmZlcmVuY2VDb250ZXh0LkZBSUxFRCkgcmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgc3Vic3RpdHV0aW9uCi0JCQkJCS8vIEpMUyAxNS4xMi4yLjggY2xhaW1zIHJldmVyc2UgaW5mZXJlbmNlIHNob3VsZG4ndCBvY2N1ciwgaG93ZXZlciBpdCBpbXByb3ZlcyBpbmZlcmVuY2UKLQkJCQkJaWYgKGFyZ0FscmVhZHlJbmZlcnJlZCkgewotCQkJCQkJc3Vic3RpdHV0ZWRCb3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFyZ3VtZW50LCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7Ci0JCQkJCQlpZiAoaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPT0gSW5mZXJlbmNlQ29udGV4dC5GQUlMRUQpIHJldHVybiBudWxsOyAvLyBpbXBvc3NpYmxlIHN1YnN0aXR1dGlvbgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGluZmVyZW5jZUNvbnRleHQuc3RhdHVzID09IEluZmVyZW5jZUNvbnRleHQuUkFXX1NVQlNUSVRVVElPTikgewotCQkgICAgCS8vIHJhdyBnZW5lcmljIG1ldGhvZCBpbmZlcnJlZAotCQkgICAgCXRoaXMuaXNSYXcgPSB0cnVlOwotCQkJCXRoaXMuaXNVbmNoZWNrZWQgPSBmYWxzZTsKLQkJICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKSB7Ci0JCSAgICAJCXRoaXMudHlwZUFyZ3VtZW50c1tpXSA9IG9yaWdpbmFsVmFyaWFibGVzW2ldLnVwcGVyQm91bmQoKTsKLQkJICAgIAl9Ci0JCSAgICAJYnJlYWsgY29tcHV0ZVN1YnN0aXR1dGVzOwotCQkJfQkJCi0JCQlpZiAoIXJlc29sdmVTdWJzdGl0dXRlQ29uc3RyYWludHMoc2NvcGUsIG9yaWdpbmFsVmFyaWFibGVzLCBpbmZlcmVuY2VDb250ZXh0LCB0cnVlLypjb25zaWRlciBUaTw6VWsqLykpIAotCQkJCXJldHVybiBudWxsOyAvLyBpbmNvbXBhdGlibGUKLQkJCS8vIHRoaXMudHlwZUFyZ3VtZW50cyA9IHN1YnN0aXR1dGVzOyAtIG5vIG9wIHNpbmNlIHNpZGUgZWZmZWN0cyBnb3QgcGVyZm9ybWVkIGR1cmluZyAjcmVzb2x2ZVN1YnN0aXR1dGVDb25zdHJhaW50cwotCSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJMZW5ndGg7IGkrKykgewotCSAgICAJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGUgPSBpbmZlcmVuY2VDb250ZXh0LnN1YnN0aXR1dGVzW2ldOwotCSAgICAJCWlmIChzdWJzdGl0dXRlICE9IG51bGwpIHsKLQkgICAgCQkJdGhpcy50eXBlQXJndW1lbnRzW2ldID0gaW5mZXJlbmNlQ29udGV4dC5zdWJzdGl0dXRlc1tpXTsKLQkgICAgCQl9IGVsc2UgewotCSAgICAJCQkvLyByZW1haW5pbmcgdW5yZXNvbHZlZCB2YXJpYWJsZSBhcmUgY29uc2lkZXJlZCB0byBiZSBPYmplY3QgKG9yIHRoZWlyIGJvdW5kIGFjdHVhbGx5KQotCQkgICAgCQl0aGlzLnR5cGVBcmd1bWVudHNbaV0gPSBvcmlnaW5hbFZhcmlhYmxlc1tpXS51cHBlckJvdW5kKCk7Ci0JCSAgICAJfQotCSAgICAJfQorCSAgICAvLyBpbmZlciBmcm9tIGV4cGVjdGVkIHJldHVybiB0eXBlCisJCWlmIChpbmZlcmVuY2VDb250ZXh0LmV4cGVjdGVkVHlwZSAhPSBudWxsKSB7CisJCSAgICB0aGlzLnJldHVyblR5cGUuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBpbmZlcmVuY2VDb250ZXh0LmV4cGVjdGVkVHlwZSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKKwkJICAgIGlmIChpbmZlcmVuY2VDb250ZXh0LnN0YXR1cyA9PSBJbmZlcmVuY2VDb250ZXh0LkZBSUxFRCkgcmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgc3Vic3RpdHV0aW9uCiAJCX0KLQkJLy8gbWF5IHN0aWxsIG5lZWQgYW4gZXh0cmEgc3Vic3RpdHV0aW9uIGF0IHRoZSBlbmQgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMzY5KQotCQkvLyB0byBwcm9wZXJseSBzdWJzdGl0dXRlIGEgcmVtYWluaW5nIHVucmVzb2x2ZWQgdmFyaWFibGUgd2hpY2ggYWxzbyBhcHBlYXIgaW4gYSBmb3JtYWwgYm91bmQKKwkgICAgLy8gaW5mZXIgZnJvbSBib3VuZHMgb2YgdHlwZSBwYXJhbWV0ZXJzCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyTGVuZ3RoOyBpKyspIHsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgb3JpZ2luYWxWYXJpYWJsZSA9IG9yaWdpbmFsVmFyaWFibGVzW2ldOworCQkJVHlwZUJpbmRpbmcgYXJndW1lbnQgPSB0aGlzLnR5cGVBcmd1bWVudHNbaV07CisJCQlib29sZWFuIGFyZ0FscmVhZHlJbmZlcnJlZCA9IGFyZ3VtZW50ICE9IG9yaWdpbmFsVmFyaWFibGU7CisJCQlpZiAob3JpZ2luYWxWYXJpYWJsZS5maXJzdEJvdW5kID09IG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcykgeworCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkQm91bmQgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcyk7CisJCQkJYXJndW1lbnQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBzdWJzdGl0dXRlZEJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIpOworCQkJCWlmIChpbmZlcmVuY2VDb250ZXh0LnN0YXR1cyA9PSBJbmZlcmVuY2VDb250ZXh0LkZBSUxFRCkgcmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgc3Vic3RpdHV0aW9uCisJCQkJLy8gSkxTIDE1LjEyLjIuOCBjbGFpbXMgcmV2ZXJzZSBpbmZlcmVuY2Ugc2hvdWxkbid0IG9jY3VyLCBob3dldmVyIGl0IGltcHJvdmVzIGluZmVyZW5jZQorCQkJCS8vIGUuZy4gZ2l2ZW46IDxFIGV4dGVuZHMgT2JqZWN0LCBTIGV4dGVuZHMgQ29sbGVjdGlvbjxFPj4gUyB0ZXN0MShTIHBhcmFtKQorCQkJCS8vICAgICAgICAgICAgICAgICAgIGludm9jYXRpb246IHRlc3QxKG5ldyBWZWN0b3I8U3RyaW5nPigpKSAgICB3aWxsIGluZmVyOiBTPVZlY3RvcjxTdHJpbmc+ICBhbmQgd2l0aCBjb2RlIGJlbG93OiBFPVN0cmluZworCQkJCWlmIChhcmdBbHJlYWR5SW5mZXJyZWQpIHsKKwkJCQkJc3Vic3RpdHV0ZWRCb3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFyZ3VtZW50LCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7CisJCQkJCWlmIChpbmZlcmVuY2VDb250ZXh0LnN0YXR1cyA9PSBJbmZlcmVuY2VDb250ZXh0LkZBSUxFRCkgcmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgc3Vic3RpdHV0aW9uCisJCQkJfQorCQkJfQorCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IG9yaWdpbmFsVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7CisJCQkJVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZWRCb3VuZCA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgb3JpZ2luYWxWYXJpYWJsZS5zdXBlckludGVyZmFjZXNbal0pOworCQkJCWFyZ3VtZW50LmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgc3Vic3RpdHV0ZWRCb3VuZCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKKwkJCQlpZiAoaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPT0gSW5mZXJlbmNlQ29udGV4dC5GQUlMRUQpIHJldHVybiBudWxsOyAvLyBpbXBvc3NpYmxlIHN1YnN0aXR1dGlvbgorCQkJCS8vIEpMUyAxNS4xMi4yLjggY2xhaW1zIHJldmVyc2UgaW5mZXJlbmNlIHNob3VsZG4ndCBvY2N1ciwgaG93ZXZlciBpdCBpbXByb3ZlcyBpbmZlcmVuY2UKKwkJCQlpZiAoYXJnQWxyZWFkeUluZmVycmVkKSB7CisJCQkJCXN1YnN0aXR1dGVkQm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhcmd1bWVudCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VYVEVORFMpOworCQkJCQlpZiAoaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPT0gSW5mZXJlbmNlQ29udGV4dC5GQUlMRUQpIHJldHVybiBudWxsOyAvLyBpbXBvc3NpYmxlIHN1YnN0aXR1dGlvbgorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIXJlc29sdmVTdWJzdGl0dXRlQ29uc3RyYWludHMoc2NvcGUsIG9yaWdpbmFsVmFyaWFibGVzLCBpbmZlcmVuY2VDb250ZXh0LCB0cnVlLypjb25zaWRlciBUaTw6VWsqLykpCisJCQlyZXR1cm4gbnVsbDsgLy8gaW5jb21wYXRpYmxlCisJCS8vIHRoaXMudHlwZUFyZ3VtZW50cyA9IHN1YnN0aXR1dGVzOyAtIG5vIG9wIHNpbmNlIHNpZGUgZWZmZWN0cyBnb3QgcGVyZm9ybWVkIGR1cmluZyAjcmVzb2x2ZVN1YnN0aXR1dGVDb25zdHJhaW50cworICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKSB7CisgICAgCQlUeXBlQmluZGluZyBzdWJzdGl0dXRlID0gaW5mZXJlbmNlQ29udGV4dC5zdWJzdGl0dXRlc1tpXTsKKyAgICAJCWlmIChzdWJzdGl0dXRlICE9IG51bGwpIHsKKyAgICAJCQl0aGlzLnR5cGVBcmd1bWVudHNbaV0gPSBzdWJzdGl0dXRlOworICAgIAkJfSBlbHNlIHsKKyAgICAJCQkvLyByZW1haW5pbmcgdW5yZXNvbHZlZCB2YXJpYWJsZSBhcmUgY29uc2lkZXJlZCB0byBiZSBPYmplY3QgKG9yIHRoZWlyIGJvdW5kIGFjdHVhbGx5KQorCSAgICAJCXRoaXMudHlwZUFyZ3VtZW50c1tpXSA9IGluZmVyZW5jZUNvbnRleHQuc3Vic3RpdHV0ZXNbaV0gPSBvcmlnaW5hbFZhcmlhYmxlc1tpXS51cHBlckJvdW5kKCk7CisJICAgIAl9CisgICAgCX0KKwkJLyogTWF5IHN0aWxsIG5lZWQgYW4gZXh0cmEgc3Vic3RpdHV0aW9uIGF0IHRoZSBlbmQgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMzY5KQorCQkgICB0byBwcm9wZXJseSBzdWJzdGl0dXRlIGEgcmVtYWluaW5nIHVucmVzb2x2ZWQgdmFyaWFibGUgd2hpY2ggYWxzbyBhcHBlYXIgaW4gYSBmb3JtYWwgYm91bmQuIFNlZSBhbHNvCisJCSAgIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTUwMjE2MzUuIEl0IGlzIHF1ZXN0aW9uYWJsZSB0aG91Z2ggd2hldGhlciB0aGlzIGV4dHJhCisJCSAgIHN1YnN0aXR1dGlvbiBzaG91bGQgdGFrZSBwbGFjZSB3aGVuIHRoZSBpbnZvY2F0aW9uIHNpdGUgb2ZmZXJzIG5vIGd1aWRhbmNlIHdoYXRzb2V2ZXIgYW5kIHRoZSB0eXBlIHZhcmlhYmxlcworCQkgICBhcmUgaW5mZXJyZWQgdG8gYmUgdGhlIGdsYiBvZiB0aGUgcHVibGlzaGVkIGJvdW5kcyAtIGFzIHRoZXJlIGNhbiByZWN1cnNpb24gaW4gdGhlIGZvcm1hbCBib3VuZHMsIHRoZQorCQkgICBpbmZlcnJlZCBib3VuZHMgd291bGQgbm8gbG9uZ2VyIGJlIGdsYi4KKwkJKi8KKwkJCiAJCXRoaXMudHlwZUFyZ3VtZW50cyA9IFNjb3BlLnN1YnN0aXR1dGUodGhpcywgdGhpcy50eXBlQXJndW1lbnRzKTsKLQkJLy8gYWRqdXN0IG1ldGhvZCB0eXBlcyB0byByZWZsZWN0IGxhdGVzdCBpbmZlcmVuY2UKKworICAgIAkvLyBhZGp1c3QgbWV0aG9kIHR5cGVzIHRvIHJlZmxlY3QgbGF0ZXN0IGluZmVyZW5jZQogCQlUeXBlQmluZGluZyBvbGRSZXR1cm5UeXBlID0gdGhpcy5yZXR1cm5UeXBlOwogCQl0aGlzLnJldHVyblR5cGUgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIHRoaXMucmV0dXJuVHlwZSk7CiAJCXRoaXMuaW5mZXJyZWRSZXR1cm5UeXBlID0gaW5mZXJlbmNlQ29udGV4dC5oYXNFeHBsaWNpdEV4cGVjdGVkVHlwZSAmJiB0aGlzLnJldHVyblR5cGUgIT0gb2xkUmV0dXJuVHlwZTsKIAkgICAgdGhpcy5wYXJhbWV0ZXJzID0gU2NvcGUuc3Vic3RpdHV0ZSh0aGlzLCB0aGlzLnBhcmFtZXRlcnMpOwogCSAgICB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBTY29wZS5zdWJzdGl0dXRlKHRoaXMsIHRoaXMudGhyb3duRXhjZXB0aW9ucyk7CiAJICAgIC8vIGVycm9yIGNhc2Ugd2hlcmUgZXhjZXB0aW9uIHR5cGUgdmFyaWFibGUgd291bGQgaGF2ZSBiZWVuIHN1YnN0aXR1dGVkIGJ5IGEgbm9uLXJlZmVyZW5jZSB0eXBlICgyMDc1NzMpCi0JICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOwkgICAgCisJICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOworCQljaGVja01pc3NpbmdUeXBlOiB7CisJCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApCisJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCWlmICgodGhpcy5yZXR1cm5UeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQkJCWJyZWFrIGNoZWNrTWlzc2luZ1R5cGU7CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKCh0aGlzLnBhcmFtZXRlcnNbaV0udGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQkJCQlicmVhayBjaGVja01pc3NpbmdUeXBlOworCQkJCX0KKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlpZiAoKHRoaXMudGhyb3duRXhjZXB0aW9uc1tpXS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQl0aGlzLnRhZ0JpdHMgfD0gIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJCWJyZWFrIGNoZWNrTWlzc2luZ1R5cGU7CisJCQkJfQorCQkJfQorCQl9CiAJICAgIHJldHVybiB0aGlzOwogCX0KIAorCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDc2MDAgJiYgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjE1OQorCSAgIFNvbWV0aW1lcyBkdWUgdG8gcmVjdXJzaW9uL2NpcmN1bGFyaXR5IGluIGZvcm1hbCBib3VuZHMsIGV2ZW4gKnB1Ymxpc2hlZCBib3VuZHMqIGZhaWwgYm91bmQgY2hlY2suIFdlIG5lZWQgdG8KKwkgICBicmVhayB0aGUgY2lyY3VsYXJpdHkvc2VsZiByZWZlcmVuY2UgaW4gb3JkZXIgbm90IHRvIGJlIG92ZXJseSBzdHJpY3QgZHVyaW5nIHR5cGUgZXF1aXZhbGVuY2UgY2hlY2tzLiAgCisJICAgU2VlIGFsc28gaHR0cDovL2J1Z3Muc3VuLmNvbS92aWV3X2J1Zy5kbz9idWdfaWQ9NjkzMjU3MQorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIExpbmdlcmluZ1R5cGVWYXJpYWJsZUVsaW1pbmF0b3IgaW1wbGVtZW50cyBTdWJzdGl0dXRpb24geworCisJCWZpbmFsIHByaXZhdGUgVHlwZVZhcmlhYmxlQmluZGluZyBbXSB2YXJpYWJsZXM7CisJCWZpbmFsIHByaXZhdGUgVHlwZUJpbmRpbmcgW10gc3Vic3RpdHV0ZXM7IC8vIHdoZW4gbnVsbCwgc3Vic3RpdHV0ZSB0eXBlIHZhcmlhYmxlcyBieSB1bmJvdW5kZWQgd2lsZGNhcmQKKwkJZmluYWwgcHJpdmF0ZSBTY29wZSBzY29wZTsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gdmFyaWFibGVzCisJCSAqIEBwYXJhbSBzdWJzdGl0dXRlcyB3aGVuIG51bGwsIHN1YnN0aXR1dGUgdHlwZSB2YXJpYWJsZSBieSB1bmJvdW5kZWQgd2lsZGNhcmQKKwkJICogQHBhcmFtIHNjb3BlCisJCSAqLworCQlwdWJsaWMgTGluZ2VyaW5nVHlwZVZhcmlhYmxlRWxpbWluYXRvcihUeXBlVmFyaWFibGVCaW5kaW5nIFtdIHZhcmlhYmxlcywgVHlwZUJpbmRpbmcgW10gc3Vic3RpdHV0ZXMsIFNjb3BlIHNjb3BlKSB7CisJCQl0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKKwkJCXRoaXMuc3Vic3RpdHV0ZXMgPSBzdWJzdGl0dXRlczsKKwkJCXRoaXMuc2NvcGUgPSBzY29wZTsKKwkJfQorCQkvLyBXaXRoIFQgbWFwcGluZyB0byBJPFQ+LCBhbnN3ZXIgb2YgSTw/Piwgd2hlbiBnaXZlbiBULCBoYXZpbmcgZWxpbWluYXRlZCB0aGUgY2lyY3VsYXJpdHkvc2VsZiByZWZlcmVuY2UuCisJCXB1YmxpYyBUeXBlQmluZGluZyBzdWJzdGl0dXRlKFR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlKSB7CisJCQlpZiAodHlwZVZhcmlhYmxlLnJhbmsgPj0gdGhpcy52YXJpYWJsZXMubGVuZ3RoIHx8IHRoaXMudmFyaWFibGVzW3R5cGVWYXJpYWJsZS5yYW5rXSAhPSB0eXBlVmFyaWFibGUpIHsgICAvLyBub3Qga29zaGVyLCBkb24ndCB0b3VjaC4KKwkJCQlyZXR1cm4gdHlwZVZhcmlhYmxlOworCQkJfQorCQkJaWYgKHRoaXMuc3Vic3RpdHV0ZXMgIT0gbnVsbCkgeworCQkJCXJldHVybiBTY29wZS5zdWJzdGl0dXRlKG5ldyBMaW5nZXJpbmdUeXBlVmFyaWFibGVFbGltaW5hdG9yKHRoaXMudmFyaWFibGVzLCBudWxsLCB0aGlzLnNjb3BlKSwgdGhpcy5zdWJzdGl0dXRlc1t0eXBlVmFyaWFibGUucmFua10pOyAKKwkJCX0KKwkJCVJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgKHR5cGVWYXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/IHR5cGVWYXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50IDogbnVsbCk7CisJCQlyZXR1cm4gdGhpcy5zY29wZS5lbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCB0eXBlVmFyaWFibGUucmFuaywgbnVsbCwgbnVsbCwgV2lsZGNhcmQuVU5CT1VORCk7CisJCX0KKworCQlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQoKSB7CisJCQlyZXR1cm4gdGhpcy5zY29wZS5lbnZpcm9ubWVudCgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNSYXdTdWJzdGl0dXRpb24oKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU3Vic3RpdHV0aW9uI2lzUmF3U3Vic3RpdHV0aW9uKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1Jhd1N1YnN0aXR1dGlvbigpIHsKIAkJcmV0dXJuIHRoaXMuaXNSYXc7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlN1YnN0aXR1dGlvbiNzdWJzdGl0dXRlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZVZhcmlhYmxlQmluZGluZykKIAkgKi8KQEAgLTQ2MywxNCArNTUwLDggQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyN0aWVicmVha01ldGhvZCgpCiAJICovCiAJcHVibGljIE1ldGhvZEJpbmRpbmcgdGllYnJlYWtNZXRob2QoKSB7Ci0JCWlmICh0aGlzLnRpZWJyZWFrTWV0aG9kID09IG51bGwpIHsKLQkJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSBvcmlnaW5hbFZhcmlhYmxlcyA9IG9yaWdpbmFsTWV0aG9kLnR5cGVWYXJpYWJsZXM7Ci0JCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxWYXJpYWJsZXMubGVuZ3RoOwotCQkJVHlwZUJpbmRpbmdbXSBuZXdBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJbmV3QXJndW1lbnRzW2ldID0gZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZShvcmlnaW5hbFZhcmlhYmxlc1tpXS51cHBlckJvdW5kKCkpOwotCQkJdGhpcy50aWVicmVha01ldGhvZCA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2QodGhpcy5vcmlnaW5hbE1ldGhvZCwgbmV3QXJndW1lbnRzKTsKLQkJfSAKKwkJaWYgKHRoaXMudGllYnJlYWtNZXRob2QgPT0gbnVsbCkKKwkJCXRoaXMudGllYnJlYWtNZXRob2QgPSB0aGlzLm9yaWdpbmFsTWV0aG9kLmFzUmF3TWV0aG9kKHRoaXMuZW52aXJvbm1lbnQpOwogCQlyZXR1cm4gdGhpcy50aWVicmVha01ldGhvZDsKIAl9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5qYXZhCmluZGV4IDczMzQ0OGMuLjIyYjVhZmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsMTcgKzI2LDE5IEBACiAJICogQ3JlYXRlIG1ldGhvZCBvZiBwYXJhbWV0ZXJpemVkIHR5cGUsIHN1YnN0aXR1dGluZyBvcmlnaW5hbCBwYXJhbWV0ZXJzL2V4Y2VwdGlvbi9yZXR1cm4gdHlwZSB3aXRoIHR5cGUgYXJndW1lbnRzLgogCSAqLwogCXB1YmxpYyBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZyhmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZERlY2xhcmluZ0NsYXNzLCBNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kKSB7Ci0KIAkJc3VwZXIoCiAJCQkJb3JpZ2luYWxNZXRob2QubW9kaWZpZXJzLAogCQkJCW9yaWdpbmFsTWV0aG9kLnNlbGVjdG9yLAotCQkJCSBvcmlnaW5hbE1ldGhvZC5yZXR1cm5UeXBlLAorCQkJCW9yaWdpbmFsTWV0aG9kLnJldHVyblR5cGUsCiAJCQkJb3JpZ2luYWxNZXRob2QucGFyYW1ldGVycywKIAkJCQlvcmlnaW5hbE1ldGhvZC50aHJvd25FeGNlcHRpb25zLAogCQkJCXBhcmFtZXRlcml6ZWREZWNsYXJpbmdDbGFzcyk7CiAJCXRoaXMub3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbE1ldGhvZDsKLQkJdGhpcy50YWdCaXRzID0gb3JpZ2luYWxNZXRob2QudGFnQml0czsKLQkJCisJCS8qIG1pc3NpbmcgdHlwZSBiaXQgY2Fubm90IGJlIGNvcGllZCBhcyBpcyBpdCBtaWdodCBjb21lIGZyb20gdGhlIHJldHVybiB0eXBlIG9yIGEgcGFyYW1ldGVyIHR5cGUgdGhhdAorCQkgKiBpcyBzdWJzdGl0dXRlZCBieSBhIHJhdyB0eXBlLgorCQkgKi8KKwkJdGhpcy50YWdCaXRzID0gb3JpZ2luYWxNZXRob2QudGFnQml0cyAmIH5UYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCiAJCWZpbmFsIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSBvcmlnaW5hbFZhcmlhYmxlcyA9IG9yaWdpbmFsTWV0aG9kLnR5cGVWYXJpYWJsZXM7CiAJCVN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBudWxsOwogCQlmaW5hbCBpbnQgbGVuZ3RoID0gb3JpZ2luYWxWYXJpYWJsZXMubGVuZ3RoOwpAQCAtNDksMjkgKzUxLDI5IEBACiAJCQlmaW5hbCBUeXBlVmFyaWFibGVCaW5kaW5nW10gc3Vic3RpdHV0ZWRWYXJpYWJsZXMgPSBuZXcgVHlwZVZhcmlhYmxlQmluZGluZ1tsZW5ndGhdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeyAvLyBjb3B5IG9yaWdpbmFsIHR5cGUgdmFyaWFibGUgdG8gcmVsb2NhdGUKIAkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIG9yaWdpbmFsVmFyaWFibGUgPSBvcmlnaW5hbFZhcmlhYmxlc1tpXTsKLQkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlc1tpXSA9IG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKG9yaWdpbmFsVmFyaWFibGUuc291cmNlTmFtZSwgdGhpcywgb3JpZ2luYWxWYXJpYWJsZS5yYW5rKTsKKwkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlc1tpXSA9IG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKG9yaWdpbmFsVmFyaWFibGUuc291cmNlTmFtZSwgdGhpcywgb3JpZ2luYWxWYXJpYWJsZS5yYW5rLCBwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3MuZW52aXJvbm1lbnQpOwogCQkJfQogCQkJdGhpcy50eXBlVmFyaWFibGVzID0gc3Vic3RpdHV0ZWRWYXJpYWJsZXM7Ci0JCQkKKwogCQkJLy8gbmVlZCB0byBzdWJzdGl0dXRlIG9sZCB2YXIgcmVmcyB3aXRoIG5ldyBvbmVzIChkb3VibGUgc3Vic3RpdHV0aW9uOiBkZWNsYXJpbmdDbGFzcyArIG5ldyB0eXBlIHZhcmlhYmxlcykKIAkJCXN1YnN0aXR1dGlvbiA9IG5ldyBTdWJzdGl0dXRpb24oKSB7Ci0JCQkJcHVibGljIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgeyAKLQkJCQkJcmV0dXJuIHBhcmFtZXRlcml6ZWREZWNsYXJpbmdDbGFzcy5lbnZpcm9ubWVudDsgCisJCQkJcHVibGljIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgeworCQkJCQlyZXR1cm4gcGFyYW1ldGVyaXplZERlY2xhcmluZ0NsYXNzLmVudmlyb25tZW50OwogCQkJCX0KIAkJCQlwdWJsaWMgYm9vbGVhbiBpc1Jhd1N1YnN0aXR1dGlvbigpIHsKIAkJCQkJcmV0dXJuICFpc1N0YXRpYyAmJiBwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3MuaXNSYXdTdWJzdGl0dXRpb24oKTsKIAkJCQl9CiAJCQkJcHVibGljIFR5cGVCaW5kaW5nIHN1YnN0aXR1dGUoVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUpIHsKLQkJCSAgICAgICAgLy8gY2hlY2sgdGhpcyB2YXJpYWJsZSBjYW4gYmUgc3Vic3RpdHV0ZWQgZ2l2ZW4gY29waWVkIHZhcmlhYmxlcwotCQkJICAgICAgICBpZiAodHlwZVZhcmlhYmxlLnJhbmsgPCBsZW5ndGggJiYgb3JpZ2luYWxWYXJpYWJsZXNbdHlwZVZhcmlhYmxlLnJhbmtdID09IHR5cGVWYXJpYWJsZSkgeworCQkJCQkvLyBjaGVjayB0aGlzIHZhcmlhYmxlIGNhbiBiZSBzdWJzdGl0dXRlZCBnaXZlbiBjb3BpZWQgdmFyaWFibGVzCisJCQkJCWlmICh0eXBlVmFyaWFibGUucmFuayA8IGxlbmd0aCAmJiBvcmlnaW5hbFZhcmlhYmxlc1t0eXBlVmFyaWFibGUucmFua10gPT0gdHlwZVZhcmlhYmxlKSB7CiAJCQkJCQlyZXR1cm4gc3Vic3RpdHV0ZWRWYXJpYWJsZXNbdHlwZVZhcmlhYmxlLnJhbmtdOwotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIGlmICghaXNTdGF0aWMpCisJCQkJCX0KKwkJCQkJaWYgKCFpc1N0YXRpYykKIAkJCQkJCXJldHVybiBwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3Muc3Vic3RpdHV0ZSh0eXBlVmFyaWFibGUpOwotCQkJICAgICAgICByZXR1cm4gdHlwZVZhcmlhYmxlOworCQkJCQlyZXR1cm4gdHlwZVZhcmlhYmxlOwogCQkJCX0KIAkJCX07Ci0JCQorCiAJCQkvLyBpbml0aWFsaXplIG5ldyB2YXJpYWJsZSBib3VuZHMKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIG9yaWdpbmFsVmFyaWFibGUgPSBvcmlnaW5hbFZhcmlhYmxlc1tpXTsKQEAgLTgyLDcgKzg0LDcgQEAKIAkJCQkJc3Vic3RpdHV0ZWRWYXJpYWJsZS5maXJzdEJvdW5kID0gb3JpZ2luYWxWYXJpYWJsZS5maXJzdEJvdW5kID09IG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcwogCQkJCQkJPyBzdWJzdGl0dXRlZFN1cGVyY2xhc3MgLy8gY291bGQgYmUgYXJyYXkgdHlwZSBvciBpbnRlcmZhY2UKIAkJCQkJCTogc3Vic3RpdHV0ZWRJbnRlcmZhY2VzWzBdOwotCQkJCX0JCQkJCisJCQkJfQogCQkJCXN3aXRjaCAoc3Vic3RpdHV0ZWRTdXBlcmNsYXNzLmtpbmQoKSkgewogCQkJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CiAJCQkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlLnN1cGVyY2xhc3MgPSBwYXJhbWV0ZXJpemVkRGVjbGFyaW5nQ2xhc3MuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCwgbnVsbCk7CkBAIC0xMDYsMTcgKzEwOCwzNiBAQAogCQkJdGhpcy5yZXR1cm5UeXBlID0gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMucmV0dXJuVHlwZSk7CiAJCQl0aGlzLnBhcmFtZXRlcnMgPSBTY29wZS5zdWJzdGl0dXRlKHN1YnN0aXR1dGlvbiwgdGhpcy5wYXJhbWV0ZXJzKTsKIAkJCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IFNjb3BlLnN1YnN0aXR1dGUoc3Vic3RpdHV0aW9uLCB0aGlzLnRocm93bkV4Y2VwdGlvbnMpOwotCQkgICAgLy8gZXJyb3IgY2FzZSB3aGVyZSBleGNlcHRpb24gdHlwZSB2YXJpYWJsZSB3b3VsZCBoYXZlIGJlZW4gc3Vic3RpdHV0ZWQgYnkgYSBub24tcmVmZXJlbmNlIHR5cGUgKDIwNzU3MykKLQkJICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOwkgICAgCQkJCisJCQkvLyBlcnJvciBjYXNlIHdoZXJlIGV4Y2VwdGlvbiB0eXBlIHZhcmlhYmxlIHdvdWxkIGhhdmUgYmVlbiBzdWJzdGl0dXRlZCBieSBhIG5vbi1yZWZlcmVuY2UgdHlwZSAoMjA3NTczKQorCQkJaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyA9PSBudWxsKSB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CisJCX0KKwkJY2hlY2tNaXNzaW5nVHlwZTogeworCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKQorCQkJCWJyZWFrIGNoZWNrTWlzc2luZ1R5cGU7CisJCQlpZiAoKHRoaXMucmV0dXJuVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCXRoaXMudGFnQml0cyB8PSAgVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQlicmVhayBjaGVja01pc3NpbmdUeXBlOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmICgodGhpcy5wYXJhbWV0ZXJzW2ldLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCXRoaXMudGFnQml0cyB8PSAgVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKCh0aGlzLnRocm93bkV4Y2VwdGlvbnNbaV0udGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQkJCQlicmVhayBjaGVja01pc3NpbmdUeXBlOworCQkJCX0KKwkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZSBtZXRob2Qgb2YgcGFyYW1ldGVyaXplZCB0eXBlLCBzdWJzdGl0dXRpbmcgb3JpZ2luYWwgcGFyYW1ldGVycy9leGNlcHRpb24vcmV0dXJuIHR5cGUgd2l0aCB0eXBlIGFyZ3VtZW50cy4KIAkgKiBUaGlzIGlzIGEgQ09ERSBBU1NJU1QgbWV0aG9kIE9OTFkuCiAJICovCiAJcHVibGljIFBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nKGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MsIE1ldGhvZEJpbmRpbmcgb3JpZ2luYWxNZXRob2QsIGNoYXJbXVtdIGFsdGVybmF0ZVBhcmFtYXRlck5hbWVzLCBmaW5hbCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCiAJCXN1cGVyKAogCQkJCW9yaWdpbmFsTWV0aG9kLm1vZGlmaWVycywKIAkJCQlvcmlnaW5hbE1ldGhvZC5zZWxlY3RvciwKQEAgLTEyNSw4ICsxNDYsMTEgQEAKIAkJCQlvcmlnaW5hbE1ldGhvZC50aHJvd25FeGNlcHRpb25zLAogCQkJCWRlY2xhcmluZ0NsYXNzKTsKIAkJdGhpcy5vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsTWV0aG9kOwotCQl0aGlzLnRhZ0JpdHMgPSBvcmlnaW5hbE1ldGhvZC50YWdCaXRzOwotCQkKKwkJLyogbWlzc2luZyB0eXBlIGJpdCBjYW5ub3QgYmUgY29waWVkIGFzIGlzIGl0IG1pZ2h0IGNvbWUgZnJvbSB0aGUgcmV0dXJuIHR5cGUgb3IgYSBwYXJhbWV0ZXIgdHlwZSB0aGF0CisJCSAqIGlzIHN1YnN0aXR1dGVkIGJ5IGEgcmF3IHR5cGUuCisJCSAqLworCQl0aGlzLnRhZ0JpdHMgPSBvcmlnaW5hbE1ldGhvZC50YWdCaXRzICYgflRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisKIAkJZmluYWwgVHlwZVZhcmlhYmxlQmluZGluZ1tdIG9yaWdpbmFsVmFyaWFibGVzID0gb3JpZ2luYWxNZXRob2QudHlwZVZhcmlhYmxlczsKIAkJU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IG51bGw7CiAJCWZpbmFsIGludCBsZW5ndGggPSBvcmlnaW5hbFZhcmlhYmxlcy5sZW5ndGg7CkBAIC0xNDIsMTQgKzE2NiwxNSBAQAogCQkJCQkJCQlvcmlnaW5hbFZhcmlhYmxlLnNvdXJjZU5hbWUgOgogCQkJCQkJCQlhbHRlcm5hdGVQYXJhbWF0ZXJOYW1lc1tpXSwKIAkJCQkJCQl0aGlzLAotCQkJCQkJCW9yaWdpbmFsVmFyaWFibGUucmFuayk7CisJCQkJCQkJb3JpZ2luYWxWYXJpYWJsZS5yYW5rLAorCQkJCQkJCWVudmlyb25tZW50KTsKIAkJCX0KIAkJCXRoaXMudHlwZVZhcmlhYmxlcyA9IHN1YnN0aXR1dGVkVmFyaWFibGVzOwotCQkJCisKIAkJCS8vIG5lZWQgdG8gc3Vic3RpdHV0ZSBvbGQgdmFyIHJlZnMgd2l0aCBuZXcgb25lcyAoZG91YmxlIHN1YnN0aXR1dGlvbjogZGVjbGFyaW5nQ2xhc3MgKyBuZXcgdHlwZSB2YXJpYWJsZXMpCiAJCQlzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKCkgewotCQkJCXB1YmxpYyBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCgpIHsgCi0JCQkJCXJldHVybiBlbnZpcm9ubWVudDsgCisJCQkJcHVibGljIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgeworCQkJCQlyZXR1cm4gZW52aXJvbm1lbnQ7CiAJCQkJfQogCQkJCXB1YmxpYyBib29sZWFuIGlzUmF3U3Vic3RpdHV0aW9uKCkgewogCQkJCQlyZXR1cm4gZmFsc2U7CkBAIC0xNjIsNyArMTg3LDcgQEAKIAkJCSAgICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZTsKIAkJCQl9CiAJCQl9OwotCQkKKwogCQkJLy8gaW5pdGlhbGl6ZSBuZXcgdmFyaWFibGUgYm91bmRzCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbFZhcmlhYmxlID0gb3JpZ2luYWxWYXJpYWJsZXNbaV07CkBAIC0xNzMsNyArMTk4LDcgQEAKIAkJCQkJc3Vic3RpdHV0ZWRWYXJpYWJsZS5maXJzdEJvdW5kID0gb3JpZ2luYWxWYXJpYWJsZS5maXJzdEJvdW5kID09IG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcwogCQkJCQkJPyBzdWJzdGl0dXRlZFN1cGVyY2xhc3MgLy8gY291bGQgYmUgYXJyYXkgdHlwZSBvciBpbnRlcmZhY2UKIAkJCQkJCTogc3Vic3RpdHV0ZWRJbnRlcmZhY2VzWzBdOwotCQkJCX0JCQkJCisJCQkJfQogCQkJCXN3aXRjaCAoc3Vic3RpdHV0ZWRTdXBlcmNsYXNzLmtpbmQoKSkgewogCQkJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CiAJCQkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlLnN1cGVyY2xhc3MgPSBlbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCBudWxsKTsKQEAgLTE5OCw3ICsyMjMsMjcgQEAKIAkJCXRoaXMucGFyYW1ldGVycyA9IFNjb3BlLnN1YnN0aXR1dGUoc3Vic3RpdHV0aW9uLCB0aGlzLnBhcmFtZXRlcnMpOwogCQkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMudGhyb3duRXhjZXB0aW9ucyk7CiAJCSAgICAvLyBlcnJvciBjYXNlIHdoZXJlIGV4Y2VwdGlvbiB0eXBlIHZhcmlhYmxlIHdvdWxkIGhhdmUgYmVlbiBzdWJzdGl0dXRlZCBieSBhIG5vbi1yZWZlcmVuY2UgdHlwZSAoMjA3NTczKQotCQkgICAgaWYgKHRoaXMudGhyb3duRXhjZXB0aW9ucyA9PSBudWxsKSB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CSAgICAJCQkKKwkJICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbCkgdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOworCQl9CisJCWNoZWNrTWlzc2luZ1R5cGU6IHsKKwkJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkKKwkJCQlicmVhayBjaGVja01pc3NpbmdUeXBlOworCQkJaWYgKCh0aGlzLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlpZiAoKHRoaXMucGFyYW1ldGVyc1tpXS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQl0aGlzLnRhZ0JpdHMgfD0gIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJCWJyZWFrIGNoZWNrTWlzc2luZ1R5cGU7CisJCQkJfQorCQkJfQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmICgodGhpcy50aHJvd25FeGNlcHRpb25zW2ldLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCXRoaXMudGFnQml0cyB8PSAgVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQkJYnJlYWsgY2hlY2tNaXNzaW5nVHlwZTsKKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKQEAgLTIxOCwxMyArMjYzLDE3IEBACiAJCW1ldGhvZC5vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsTWV0aG9kOwogCQltZXRob2QucGFyYW1ldGVycyA9IG9yaWdpbmFsTWV0aG9kLnBhcmFtZXRlcnM7CiAJCW1ldGhvZC50aHJvd25FeGNlcHRpb25zID0gb3JpZ2luYWxNZXRob2QudGhyb3duRXhjZXB0aW9uczsKKwkJbWV0aG9kLnRhZ0JpdHMgPSBvcmlnaW5hbE1ldGhvZC50YWdCaXRzOwogCQlSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNDbGFzc1R5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCk7CiAJCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50ID0gc2NvcGUuZW52aXJvbm1lbnQoKTsKLQkJVHlwZUJpbmRpbmcgcmF3VHlwZSA9IGVudmlyb25tZW50LmNvbnZlcnRUb1Jhd1R5cGUocmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSk7CisJCVR5cGVCaW5kaW5nIHJhd1R5cGUgPSBlbnZpcm9ubWVudC5jb252ZXJ0VG9SYXdUeXBlKHJlY2VpdmVyVHlwZS5lcmFzdXJlKCksIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOwogCQltZXRob2QucmV0dXJuVHlwZSA9IGVudmlyb25tZW50LmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKAogCQkJZ2VuZXJpY0NsYXNzVHlwZSwKIAkJCW5ldyBUeXBlQmluZGluZ1tdIHsgIGVudmlyb25tZW50LmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNDbGFzc1R5cGUsIDAsIHJhd1R5cGUsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5FWFRFTkRTKSB9LAogCQkJbnVsbCk7CisJCWlmICgobWV0aG9kLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCW1ldGhvZC50YWdCaXRzIHw9ICBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQl9CiAJCXJldHVybiBtZXRob2Q7CiAJfQogCkBAIC0yMzIsMTQgKzI4MSwxNCBAQAogCSAqIFJldHVybnMgdHJ1ZSBpZiBzb21lIHBhcmFtZXRlcnMgZ290IHN1YnN0aXR1dGVkLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGhhc1N1YnN0aXR1dGVkUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVycyAhPSBvcmlnaW5hbE1ldGhvZC5wYXJhbWV0ZXJzOworCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzICE9IHRoaXMub3JpZ2luYWxNZXRob2QucGFyYW1ldGVyczsKIAl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJldHVybiB0eXBlIGdvdCBzdWJzdGl0dXRlZC4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBoYXNTdWJzdGl0dXRlZFJldHVyblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJldHVyblR5cGUgIT0gb3JpZ2luYWxNZXRob2QucmV0dXJuVHlwZTsKKwkJcmV0dXJuIHRoaXMucmV0dXJuVHlwZSAhPSB0aGlzLm9yaWdpbmFsTWV0aG9kLnJldHVyblR5cGU7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcuamF2YQppbmRleCA1NzhiNGM3Li41NDU4YTMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhcmFtZXRlcml6ZWRUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2lsZGNhcmQ7CkBAIC0xOSwxOSArMjEsMTggQEAKICAqLwogcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBleHRlbmRzIFJlZmVyZW5jZUJpbmRpbmcgaW1wbGVtZW50cyBTdWJzdGl0dXRpb24gewogCi0JcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nIHR5cGU7IC8vIG11c3QgZW5zdXJlIHRoZSB0eXBlIGlzIHJlc29sdmVkIAorCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyB0eXBlOyAvLyBtdXN0IGVuc3VyZSB0aGUgdHlwZSBpcyByZXNvbHZlZAogCXB1YmxpYyBUeXBlQmluZGluZ1tdIGFyZ3VtZW50czsKLQlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7IAorCXB1YmxpYyBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKIAlwdWJsaWMgY2hhcltdIGdlbmVyaWNUeXBlU2lnbmF0dXJlOwogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3M7Ci0JcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXM7CQotCXB1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHM7CQorCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzOworCXB1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHM7CiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlczsKIAlwdWJsaWMgTWV0aG9kQmluZGluZ1tdIG1ldGhvZHM7CiAJcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGU7Ci0JCi0JcHVibGljIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRzLCAgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCl7CiAKKwlwdWJsaWMgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMsICBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KXsKIAkJdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwogCQl0aGlzLmVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlOyAvLyBuZXZlciB1bnJlc29sdmVkLCBuZXZlciBsYXp5IHBlciBjb25zdHJ1Y3Rpb24KIC8vCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGUuaXNHZW5lcmljVHlwZSgpKSB7CkBAIC0zOSw2ICs0MCw5IEBACiAvLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAvLwkJCXRocm93IGU7CiAvLwkJfQorLy8JCWlmICghKHR5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgJiYgdHlwZS50eXBlVmFyaWFibGVzKCkgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKy8vCQl9CiAJCWluaXRpYWxpemUodHlwZSwgYXJndW1lbnRzKTsKIAkJaWYgKHR5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKIAkJCSgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIHR5cGUpLmFkZFdyYXBwZXIodGhpcywgZW52aXJvbm1lbnQpOwpAQCAtNTUsOSArNTksOSBAQAogCSAqIEBzZWUgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nI2dlbmVyaWNUeXBlKCkKIAkgKi8KIAlwcm90ZWN0ZWQgUmVmZXJlbmNlQmluZGluZyBhY3R1YWxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOyAKKwkJcmV0dXJuIHRoaXMudHlwZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJdGVyYXRlIHR5cGUgYXJndW1lbnRzLCBhbmQgdmFsaWRhdGUgdGhlbSBhY2NvcmRpbmcgdG8gY29ycmVzcG9uZGluZyB2YXJpYWJsZSBib3VuZHMuCiAJICovCkBAIC02OSwxMCArNzMsMTMgQEAKIAkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCSAgICBpZiAodHlwZVZhcmlhYmxlc1tpXS5ib3VuZENoZWNrKHRoaXMsIHRoaXMuYXJndW1lbnRzW2ldKSAgIT0gVHlwZUNvbnN0YW50cy5PSykgewogCQkJCSAgICAJaGFzRXJyb3JzID0gdHJ1ZTsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHRoaXMuYXJndW1lbnRzW2ldLCB0eXBlVmFyaWFibGVzW2ldLCB0aGlzLnR5cGUsIGFyZ3VtZW50UmVmZXJlbmNlc1tpXSk7CisJCQkJICAgIAlpZiAoKHRoaXMuYXJndW1lbnRzW2ldLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQkJICAgIAkJLy8gZG8gbm90IHJlcG9ydCBzZWNvbmRhcnkgZXJyb3IsIGlmIHR5cGUgcmVmZXJlbmNlIGFscmVhZHkgZ290IGNvbXBsYWluZWQgYWdhaW5zdAorCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHRoaXMuYXJndW1lbnRzW2ldLCB0eXBlVmFyaWFibGVzW2ldLCB0aGlzLnR5cGUsIGFyZ3VtZW50UmVmZXJlbmNlc1tpXSk7CisJCQkJICAgIAl9CiAJCQkJICAgIH0KIAkJCQl9Ci0JCQl9CQorCQkJfQogCQkJaWYgKCFoYXNFcnJvcnMpIHRoaXMudGFnQml0cyB8PSBUYWdCaXRzLlBhc3NlZEJvdW5kQ2hlY2s7IC8vIG5vIG5lZWQgdG8gcmVjaGVjayBpdCBpbiB0aGUgZnV0dXJlCiAJCX0KIAl9CkBAIC04MSwyNiArODgsMjYgQEAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBjYW5CZUluc3RhbnRpYXRlZCgpIHsKIAkJcmV0dXJuICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgPT0gMCkgJiYgc3VwZXIuY2FuQmVJbnN0YW50aWF0ZWQoKTsgLy8gY2Fubm90IGluc3RhbnRpYXRlIHBhcmFtIHR5cGUgd2l0aCB3aWxkY2FyZCBhcmd1bWVudHMKLQl9CQorCX0KIAkvKioKIAkgKiBQZXJmb3JtIGNhcHR1cmUgY29udmVyc2lvbiBmb3IgYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2l0aCB3aWxkY2FyZCBhcmd1bWVudHMKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjY2FwdHVyZShTY29wZSxpbnQpCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nIGNhcHR1cmUoU2NvcGUgc2NvcGUsIGludCBwb3NpdGlvbikgewotCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpID09IDApIAorCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpID09IDApCiAJCQlyZXR1cm4gdGhpczsKLQkJCi0JCVR5cGVCaW5kaW5nW10gb3JpZ2luYWxBcmd1bWVudHMgPSBhcmd1bWVudHM7CisKKwkJVHlwZUJpbmRpbmdbXSBvcmlnaW5hbEFyZ3VtZW50cyA9IHRoaXMuYXJndW1lbnRzOwogCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxBcmd1bWVudHMubGVuZ3RoOwogCQlUeXBlQmluZGluZ1tdIGNhcHR1cmVkQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07Ci0JCQorCiAJCS8vIFJldHJpZXZlIHRoZSB0eXBlIGNvbnRleHQgZm9yIGNhcHR1cmUgYmluZGluZ0tleQogCQlSZWZlcmVuY2VCaW5kaW5nIGNvbnRleHRUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwogCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgY29udGV4dFR5cGUgPSBjb250ZXh0VHlwZS5vdXRlcm1vc3RFbmNsb3NpbmdUeXBlKCk7IC8vIG1heWJlIG51bGwgd2hlbiB1c2VkIHByb2dyYW1tYXRpY2FsbHkgYnkgRE9NCi0JCQorCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50ID0gb3JpZ2luYWxBcmd1bWVudHNbaV07Ci0JCQlpZiAoYXJndW1lbnQua2luZCgpID09IEJpbmRpbmcuV0lMRENBUkRfVFlQRSAmJiAoKFdpbGRjYXJkQmluZGluZylhcmd1bWVudCkub3RoZXJCb3VuZHMgPT0gbnVsbCkgeyAvLyBubyBjYXB0dXJlIGZvciBpbnRlcnNlY3Rpb24gdHlwZXMKKwkJCWlmIChhcmd1bWVudC5raW5kKCkgPT0gQmluZGluZy5XSUxEQ0FSRF9UWVBFKSB7IC8vIG5vIGNhcHR1cmUgZm9yIGludGVyc2VjdGlvbiB0eXBlcwogCQkJCWNhcHR1cmVkQXJndW1lbnRzW2ldID0gbmV3IENhcHR1cmVCaW5kaW5nKChXaWxkY2FyZEJpbmRpbmcpIGFyZ3VtZW50LCBjb250ZXh0VHlwZSwgcG9zaXRpb24sIHNjb3BlLmNvbXBpbGF0aW9uVW5pdFNjb3BlKCkubmV4dENhcHR1cmVJRCgpKTsKIAkJCX0gZWxzZSB7CiAJCQkJY2FwdHVyZWRBcmd1bWVudHNbaV0gPSBhcmd1bWVudDsKQEAgLTExNSw2ICsxMjIsMjUgQEAKIAkJfQogCQlyZXR1cm4gY2FwdHVyZWRQYXJhbWV0ZXJpemVkVHlwZTsKIAl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjY29sbGVjdE1pc3NpbmdUeXBlcyhqYXZhLnV0aWwuTGlzdCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBjb2xsZWN0TWlzc2luZ1R5cGVzKExpc3QgbWlzc2luZ1R5cGVzKSB7CisJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJaWYgKHRoaXMuZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQkJbWlzc2luZ1R5cGVzID0gdGhpcy5lbmNsb3NpbmdUeXBlLmNvbGxlY3RNaXNzaW5nVHlwZXMobWlzc2luZ1R5cGVzKTsKKwkJCX0KKwkJCW1pc3NpbmdUeXBlcyA9IGdlbmVyaWNUeXBlKCkuY29sbGVjdE1pc3NpbmdUeXBlcyhtaXNzaW5nVHlwZXMpOworCQkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJbWlzc2luZ1R5cGVzID0gdGhpcy5hcmd1bWVudHNbaV0uY29sbGVjdE1pc3NpbmdUeXBlcyhtaXNzaW5nVHlwZXMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbWlzc2luZ1R5cGVzOworCX0KKwogCS8qKgogCSAqIENvbGxlY3QgdGhlIHN1YnN0aXR1dGVzIGludG8gYSBtYXAgZm9yIGNlcnRhaW4gdHlwZSB2YXJpYWJsZXMgaW5zaWRlIHRoZSByZWNlaXZlciB0eXBlCiAJICogZS5nLiAgIENvbGxlY3Rpb248VD4uY29sbGVjdFN1YnN0aXR1dGVzKENvbGxlY3Rpb248TGlzdDxYPj4sIE1hcCksIHdpbGwgcG9wdWxhdGUgTWFwIHdpdGg6IFQgLS0+IExpc3Q8WD4KQEAgLTEyNCwyMiArMTUwLDI3IEBACiAJICogICBBID4+IEYgICBjb3JyZXNwb25kcyB0bzogICBGLmNvbGxlY3RTdWJzdGl0dXRlcyguLi4sIEEsIC4uLiwgQ09OU1RSQUlOVF9TVVBFUiAoMikpCiAJICovCiAJcHVibGljIHZvaWQgY29sbGVjdFN1YnN0aXR1dGVzKFNjb3BlIHNjb3BlLCBUeXBlQmluZGluZyBhY3R1YWxUeXBlLCBJbmZlcmVuY2VDb250ZXh0IGluZmVyZW5jZUNvbnRleHQsIGludCBjb25zdHJhaW50KSB7Ci0JCQotCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlKSA9PSAwKSByZXR1cm47CisJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpID09IDApIHsKKwkJCVR5cGVCaW5kaW5nIGFjdHVhbEVxdWl2YWxlbnQgPSBhY3R1YWxUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20odGhpcy50eXBlKTsKKwkJCWlmIChhY3R1YWxFcXVpdmFsZW50ICE9IG51bGwgJiYgYWN0dWFsRXF1aXZhbGVudC5pc1Jhd1R5cGUoKSkgeworCQkJCWluZmVyZW5jZUNvbnRleHQuaXNVbmNoZWNrZWQgPSB0cnVlOworCQkJfQorCQkJcmV0dXJuOworCQl9CiAJCWlmIChhY3R1YWxUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwpIHJldHVybjsKLQkKKwogCQlpZiAoIShhY3R1YWxUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybjsKIAkJVHlwZUJpbmRpbmcgZm9ybWFsRXF1aXZhbGVudCwgYWN0dWFsRXF1aXZhbGVudDsKIAkJc3dpdGNoIChjb25zdHJhaW50KSB7CiAJCQljYXNlIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FUVVBTCA6CiAJCQljYXNlIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FWFRFTkRTIDoKIAkJCQlmb3JtYWxFcXVpdmFsZW50ID0gdGhpczsKLQkJICAgICAgICBhY3R1YWxFcXVpdmFsZW50ID0gYWN0dWFsVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKHRoaXMudHlwZSk7CisJCSAgICAgICAgYWN0dWFsRXF1aXZhbGVudCA9IGFjdHVhbFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0aGlzLnR5cGUpOwogCQkgICAgICAgIGlmIChhY3R1YWxFcXVpdmFsZW50ID09IG51bGwpIHJldHVybjsKIAkJICAgICAgICBicmVhazsKIAkJCWNhc2UgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSIDoKIAkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgICAgICAgZm9ybWFsRXF1aXZhbGVudCA9IHRoaXMuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShhY3R1YWxUeXBlKTsKKwkJICAgICAgICBmb3JtYWxFcXVpdmFsZW50ID0gdGhpcy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGFjdHVhbFR5cGUpOwogCQkgICAgICAgIGlmIChmb3JtYWxFcXVpdmFsZW50ID09IG51bGwpIHJldHVybjsKIAkJICAgICAgICBhY3R1YWxFcXVpdmFsZW50ID0gYWN0dWFsVHlwZTsKIAkJICAgICAgICBicmVhazsKQEAgLTE2MCw3ICsxOTEsNyBAQAogICAgICAgICAJCWZvcm1hbEFyZ3VtZW50cyA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKWZvcm1hbEVxdWl2YWxlbnQpLmFyZ3VtZW50czsKICAgICAgICAgCQlicmVhazsKICAgICAgICAgCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6Ci0gICAgICAgIAkJaWYgKCFpbmZlcmVuY2VDb250ZXh0LmNoZWNrUmF3U3Vic3RpdHV0aW9uKCkpIHsKKyAgICAgICAgCQlpZiAoaW5mZXJlbmNlQ29udGV4dC5kZXB0aCA+IDApIHsKIAkgICAgICAgICAgIAkJaW5mZXJlbmNlQ29udGV4dC5zdGF0dXMgPSBJbmZlcmVuY2VDb250ZXh0LkZBSUxFRDsgLy8gbWFya2VyIGZvciBpbXBvc3NpYmxlIGluZmVyZW5jZQogICAgICAgICAJCX0KICAgICAgICAgCQlyZXR1cm47CkBAIC0xNzYsOCArMjA3LDEwIEBACiAgICAgICAgIAkJYWN0dWFsQXJndW1lbnRzID0gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpYWN0dWFsRXF1aXZhbGVudCkuYXJndW1lbnRzOwogICAgICAgICAJCWJyZWFrOwogICAgICAgICAJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKLSAgICAgICAgCQlpZiAoIWluZmVyZW5jZUNvbnRleHQuY2hlY2tSYXdTdWJzdGl0dXRpb24oKSkgeworICAgICAgICAJCWlmIChpbmZlcmVuY2VDb250ZXh0LmRlcHRoID4gMCkgewogCSAgICAgICAgICAgCQlpbmZlcmVuY2VDb250ZXh0LnN0YXR1cyA9IEluZmVyZW5jZUNvbnRleHQuRkFJTEVEOyAvLyBtYXJrZXIgZm9yIGltcG9zc2libGUgaW5mZXJlbmNlCisgICAgICAgIAkJfSBlbHNlIHsKKwkgICAgICAgIAkJaW5mZXJlbmNlQ29udGV4dC5pc1VuY2hlY2tlZCA9IHRydWU7CiAgICAgICAgIAkJfQogICAgICAgICAJCXJldHVybjsKICAgICAgICAgCWRlZmF1bHQgOgpAQCAtMjE0LDIwICsyNDcsMjAgQEAKICAgICAgICAgfQogICAgICAgICBpbmZlcmVuY2VDb250ZXh0LmRlcHRoLS07CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjY29tcHV0ZUlkKCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wdXRlSWQoKSB7Ci0JCXRoaXMuaWQgPSBUeXBlSWRzLk5vSWQ7CQkKKwkJdGhpcy5pZCA9IFR5cGVJZHMuTm9JZDsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKIAkgICAgU3RyaW5nQnVmZmVyIHNpZyA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwogCSAgICBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZzsKIAkJaWYgKGlzTWVtYmVyVHlwZSgpICYmICgoZW5jbG9zaW5nID0gZW5jbG9zaW5nVHlwZSgpKS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgZW5jbG9zaW5nLmlzUmF3VHlwZSgpKSkgewogCQkgICAgY2hhcltdIHR5cGVTaWcgPSBlbmNsb3NpbmcuY29tcHV0ZVVuaXF1ZUtleShmYWxzZS8qbm90IGEgbGVhZiovKTsKLQkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNpZy5sZW5ndGgtMTsgaSsrKSBzaWcuYXBwZW5kKHR5cGVTaWdbaV0pOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCisJCSAgICBzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCiAJCSAgICBzaWcuYXBwZW5kKCcuJykuYXBwZW5kKHNvdXJjZU5hbWUoKSk7CiAJCX0gZWxzZSBpZih0aGlzLnR5cGUuaXNMb2NhbFR5cGUoKSl7CiAJCQlMb2NhbFR5cGVCaW5kaW5nIGxvY2FsVHlwZUJpbmRpbmcgPSAoTG9jYWxUeXBlQmluZGluZykgdGhpcy50eXBlOwpAQCAtMjM2LDEyICsyNjksMTIgQEAKIAkJCXdoaWxlICgodGVtcCA9IGVuY2xvc2luZy5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpCiAJCQkJZW5jbG9zaW5nID0gdGVtcDsKIAkJCWNoYXJbXSB0eXBlU2lnID0gZW5jbG9zaW5nLmNvbXB1dGVVbmlxdWVLZXkoZmFsc2UvKm5vdCBhIGxlYWYqLyk7Ci0JCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTaWcubGVuZ3RoLTE7IGkrKykgc2lnLmFwcGVuZCh0eXBlU2lnW2ldKTsgLy8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgorCQkgICAgc2lnLmFwcGVuZCh0eXBlU2lnLCAwLCB0eXBlU2lnLmxlbmd0aC0xKTsgLy8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgogCQkJc2lnLmFwcGVuZCgnJCcpOwogCQkJc2lnLmFwcGVuZChsb2NhbFR5cGVCaW5kaW5nLnNvdXJjZVN0YXJ0KTsKIAkJfSBlbHNlIHsKIAkJICAgIGNoYXJbXSB0eXBlU2lnID0gdGhpcy50eXBlLmNvbXB1dGVVbmlxdWVLZXkoZmFsc2UvKm5vdCBhIGxlYWYqLyk7Ci0JCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTaWcubGVuZ3RoLTE7IGkrKykgc2lnLmFwcGVuZCh0eXBlU2lnW2ldKTsgLy8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgorCQkgICAgc2lnLmFwcGVuZCh0eXBlU2lnLCAwLCB0eXBlU2lnLmxlbmd0aC0xKTsgLy8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgogCQl9CiAJCVJlZmVyZW5jZUJpbmRpbmcgY2FwdHVyZVNvdXJjZVR5cGUgPSBudWxsOwogCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtMjYwLDEwICsyOTMsMTAgQEAKIAkJCXNpZy5pbnNlcnQoMCwgIiYiKTsgLy8kTk9OLU5MUy0xJAogCQkJc2lnLmluc2VydCgwLCBjYXB0dXJlU291cmNlVHlwZS5jb21wdXRlVW5pcXVlS2V5KGZhbHNlLypub3QgYSBsZWFmKi8pKTsKIAkJfQotCQorCiAJCWludCBzaWdMZW5ndGggPSBzaWcubGVuZ3RoKCk7CiAJCWNoYXJbXSB1bmlxdWVLZXkgPSBuZXcgY2hhcltzaWdMZW5ndGhdOwotCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCB1bmlxdWVLZXksIDApOwkJCQorCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCB1bmlxdWVLZXksIDApOwogCQlyZXR1cm4gdW5pcXVlS2V5OwogCX0KIApAQCAtMjc3LDEzICszMTAsMTcgQEAKIAlwdWJsaWMgUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcgY3JlYXRlUGFyYW1ldGVyaXplZE1ldGhvZChNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kKSB7CiAJCXJldHVybiBuZXcgUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcodGhpcywgb3JpZ2luYWxNZXRob2QpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNkZWJ1Z05hbWUoKQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZGVidWdOYW1lKCkgewogCSAgICBTdHJpbmdCdWZmZXIgbmFtZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwotCQluYW1lQnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUuc291cmNlTmFtZSgpKTsKKwkgICAgaWYgKHRoaXMudHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB7CisJICAgIAluYW1lQnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUpOworCSAgICB9IGVsc2UgeworCQkJbmFtZUJ1ZmZlci5hcHBlbmQodGhpcy50eXBlLnNvdXJjZU5hbWUoKSk7CisJICAgIH0KIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCW5hbWVCdWZmZXIuYXBwZW5kKCc8Jyk7CiAJCSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTI5Miw3ICszMjksNyBAQAogCQkgICAgfQogCQkgICAgbmFtZUJ1ZmZlci5hcHBlbmQoJz4nKTsKIAkJfQotCSAgICByZXR1cm4gbmFtZUJ1ZmZlci50b1N0cmluZygpOwkJCisJICAgIHJldHVybiBuYW1lQnVmZmVyLnRvU3RyaW5nKCk7CiAJfQogCiAJLyoqCkBAIC0zMDgsNyArMzQ1LDcgQEAKIAlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQoKSB7CiAJCXJldHVybiB0aGlzLmVudmlyb25tZW50OwogCX0KLQkKKwogCS8qKgogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNlcmFzdXJlKCkKICAgICAgKi8KQEAgLTMyNiw3ICszNjMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI2ZpZWxkcygpCiAJICovCiAJcHVibGljIEZpZWxkQmluZGluZ1tdIGZpZWxkcygpIHsKLQkJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5BcmVGaWVsZHNDb21wbGV0ZSkgIT0gMCkKKwkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZUZpZWxkc0NvbXBsZXRlKSAhPSAwKQogCQkJcmV0dXJuIHRoaXMuZmllbGRzOwogCiAJCXRyeSB7CkBAIC0zMzYsMTIgKzM3MywxMiBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKIAkJCQkvLyBzdWJzdGl0dXRlIGFsbCBmaWVsZHMsIHNvIGFzIHRvIGdldCB1cGRhdGVkIGRlY2xhcmluZyBjbGFzcyBhdCBsZWFzdAogCQkJCXBhcmFtZXRlcml6ZWRGaWVsZHNbaV0gPSBuZXcgUGFyYW1ldGVyaXplZEZpZWxkQmluZGluZyh0aGlzLCBvcmlnaW5hbEZpZWxkc1tpXSk7Ci0JCQl0aGlzLmZpZWxkcyA9IHBhcmFtZXRlcml6ZWRGaWVsZHM7CSAgICAKKwkJCXRoaXMuZmllbGRzID0gcGFyYW1ldGVyaXplZEZpZWxkczsKIAkJfSBmaW5hbGx5IHsKIAkJCS8vIGlmIHRoZSBvcmlnaW5hbCBmaWVsZHMgY2Fubm90IGJlIHJldHJpZXZlZCAoZXguIEFib3J0Q29tcGlsYXRpb24pLCB0aGVuIGFzc3VtZSB3ZSBkbyBub3QgaGF2ZSBhbnkgZmllbGRzCi0JCQlpZiAodGhpcy5maWVsZHMgPT0gbnVsbCkgCisJCQlpZiAodGhpcy5maWVsZHMgPT0gbnVsbCkKIAkJCQl0aGlzLmZpZWxkcyA9IEJpbmRpbmcuTk9fRklFTERTOwotCQkJdGFnQml0cyB8PSBUYWdCaXRzLkFyZUZpZWxkc0NvbXBsZXRlOworCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQXJlRmllbGRzQ29tcGxldGU7CiAJCX0KIAkJcmV0dXJuIHRoaXMuZmllbGRzOwogCX0KQEAgLTM1NSw3ICszOTIsNyBAQAogCQlpZiAodGhpcy50eXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCiAJCQkoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnR5cGUpLnJlc29sdmUodGhpcy5lbnZpcm9ubWVudCwgZmFsc2UpOwogCQlyZXR1cm4gdGhpcy50eXBlOwotCX0JCisJfQogCiAJLyoqCiAJICogTHR5cGU8cGFyYW0xIC4uLiBwYXJhbU4+OwpAQCAtMzY3LDE3ICs0MDQsMTYgQEAKIAkJICAgIAl0aGlzLmdlbmVyaWNUeXBlU2lnbmF0dXJlID0gdGhpcy50eXBlLnNpZ25hdHVyZSgpOwogCQkJfSBlbHNlIHsKIAkJCSAgICBTdHJpbmdCdWZmZXIgc2lnID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JCQkgICAgaWYgKHRoaXMuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCSAgICBpZiAoaXNNZW1iZXJUeXBlKCkpIHsKIAkJCSAgICAJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBlbmNsb3NpbmdUeXBlKCk7Ci0JCQkgICAgCWJvb2xlYW4gaGFzUGFyYW1ldGVyaXplZEVuY2xvc2luZyA9IGVuY2xvc2luZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCk7Ci0JCQkJCWNoYXJbXSB0eXBlU2lnID0gaGFzUGFyYW1ldGVyaXplZEVuY2xvc2luZyA/IGVuY2xvc2luZy5nZW5lcmljVHlwZVNpZ25hdHVyZSgpIDogZW5jbG9zaW5nLnNpZ25hdHVyZSgpOworCQkJCQljaGFyW10gdHlwZVNpZyA9IGVuY2xvc2luZy5nZW5lcmljVHlwZVNpZ25hdHVyZSgpOwogCQkJCQlzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOy8vIGNvcHkgYWxsIGJ1dCB0cmFpbGluZyBzZW1pY29sb24KLQkJCSAgICAJaWYgKGhhc1BhcmFtZXRlcml6ZWRFbmNsb3NpbmcgJiYgKGVuY2xvc2luZy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApIHsKKwkJCSAgICAJaWYgKChlbmNsb3NpbmcubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlKSAhPSAwKSB7CiAJCQkgICAgCQlzaWcuYXBwZW5kKCcuJyk7CiAJCQkgICAgCX0gZWxzZSB7CiAJCQkgICAgCQlzaWcuYXBwZW5kKCckJyk7CiAJCQkgICAgCX0KLQkJCSAgICAJc2lnLmFwcGVuZCh0aGlzLnNvdXJjZU5hbWUoKSk7CisJCQkgICAgCXNpZy5hcHBlbmQoc291cmNlTmFtZSgpKTsKIAkJCSAgICB9IGVsc2UgewogCQkJICAgIAljaGFyW10gdHlwZVNpZyA9IHRoaXMudHlwZS5zaWduYXR1cmUoKTsKIAkJCQkJc2lnLmFwcGVuZCh0eXBlU2lnLCAwLCB0eXBlU2lnLmxlbmd0aC0xKTsvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCkBAIC0zOTIsMTIgKzQyOCwxMiBAQAogCQkJCXNpZy5hcHBlbmQoJzsnKTsKIAkJCQlpbnQgc2lnTGVuZ3RoID0gc2lnLmxlbmd0aCgpOwogCQkJCXRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUgPSBuZXcgY2hhcltzaWdMZW5ndGhdOwotCQkJCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUsIDApOwkJCQkJCQorCQkJCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUsIDApOwogCQkJfQogCQl9CiAJCXJldHVybiB0aGlzLmdlbmVyaWNUeXBlU2lnbmF0dXJlOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI2dldEFubm90YXRpb25UYWdCaXRzKCkKIAkgKi8KQEAgLTQwNSw2ICs0NDEsMTAgQEAKIAkJcmV0dXJuIHRoaXMudHlwZS5nZXRBbm5vdGF0aW9uVGFnQml0cygpOwogCX0KIAorCXB1YmxpYyBpbnQgZ2V0RW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUoKSB7CisJCXJldHVybiBnZW5lcmljVHlwZSgpLmdldEVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplKCk7CisJfQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjZ2V0RXhhY3RDb25zdHJ1Y3RvcihUeXBlQmluZGluZ1tdKQogCSAqLwpAQCAtNDEyLDExICs0NTIsMTEgQEAKIAkJaW50IGFyZ0NvdW50ID0gYXJndW1lbnRUeXBlcy5sZW5ndGg7CiAJCU1ldGhvZEJpbmRpbmcgbWF0Y2ggPSBudWxsOwogCi0JCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQXJlTWV0aG9kc0NvbXBsZXRlKSAhPSAwKSB7IC8vIGhhdmUgcmVzb2x2ZWQgYWxsIGFyZyB0eXBlcyAmIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2RzCisJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApIHsgLy8gaGF2ZSByZXNvbHZlZCBhbGwgYXJnIHR5cGVzICYgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZHMKIAkJCWxvbmcgcmFuZ2U7CiAJCQlpZiAoKHJhbmdlID0gUmVmZXJlbmNlQmluZGluZy5iaW5hcnlTZWFyY2goVHlwZUNvbnN0YW50cy5JTklULCB0aGlzLm1ldGhvZHMpKSA+PSAwKSB7CiAJCQkJbmV4dE1ldGhvZDogZm9yIChpbnQgaW1ldGhvZCA9IChpbnQpcmFuZ2UsIGVuZCA9IChpbnQpKHJhbmdlID4+IDMyKTsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgewotCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwogCQkJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IGFyZ0NvdW50KSB7CiAJCQkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKIAkJCQkJCWZvciAoaW50IGlhcmcgPSAwOyBpYXJnIDwgYXJnQ291bnQ7IGlhcmcrKykKQEAgLTQ0Myw4ICs0ODMsOCBAQAogCQl9CiAJCXJldHVybiBtYXRjaDsKIAl9Ci0KLQkvKioKKwkKKwkgLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjZ2V0RXhhY3RNZXRob2QoY2hhcltdLCBUeXBlQmluZGluZ1tdLENvbXBpbGF0aW9uVW5pdFNjb3BlKQogCSAqLwogCXB1YmxpYyBNZXRob2RCaW5kaW5nIGdldEV4YWN0TWV0aG9kKGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBDb21waWxhdGlvblVuaXRTY29wZSByZWZTY29wZSkgewpAQCAtNDUzLDExICs0OTMsMTEgQEAKIAkJYm9vbGVhbiBmb3VuZE5vdGhpbmcgPSB0cnVlOwogCQlNZXRob2RCaW5kaW5nIG1hdGNoID0gbnVsbDsKIAotCQlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZSkgIT0gMCkgeyAvLyBoYXZlIHJlc29sdmVkIGFsbCBhcmcgdHlwZXMgJiByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kcworCQlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlTWV0aG9kc0NvbXBsZXRlKSAhPSAwKSB7IC8vIGhhdmUgcmVzb2x2ZWQgYWxsIGFyZyB0eXBlcyAmIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2RzCiAJCQlsb25nIHJhbmdlOwogCQkJaWYgKChyYW5nZSA9IFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoKHNlbGVjdG9yLCB0aGlzLm1ldGhvZHMpKSA+PSAwKSB7CiAJCQkJbmV4dE1ldGhvZDogZm9yIChpbnQgaW1ldGhvZCA9IChpbnQpcmFuZ2UsIGVuZCA9IChpbnQpKHJhbmdlID4+IDMyKTsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgewotCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwogCQkJCQlmb3VuZE5vdGhpbmcgPSBmYWxzZTsgLy8gaW5uZXIgdHlwZSBsb29rdXBzIG11c3Qga25vdyB0aGF0IGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGV4aXN0cwogCQkJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IGFyZ0NvdW50KSB7CiAJCQkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKQEAgLTQ5MSwzMiArNTMxLDMyIEBACiAJCQlpZiAobWF0Y2guaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCkpIHJldHVybiBudWxsOwogCQkJcmV0dXJuIG1hdGNoOwogCQl9Ci0JCisKIAkJaWYgKGZvdW5kTm90aGluZyAmJiAodGhpcy5hcmd1bWVudHMgPT0gbnVsbCB8fCB0aGlzLmFyZ3VtZW50cy5sZW5ndGggPD0gMSkpIHsKIAkJCWlmIChpc0ludGVyZmFjZSgpKSB7CiAJCQkJIGlmIChzdXBlckludGVyZmFjZXMoKS5sZW5ndGggPT0gMSkgewogCQkJCQlpZiAocmVmU2NvcGUgIT0gbnVsbCkKLQkJCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2Uoc3VwZXJJbnRlcmZhY2VzWzBdKTsKLQkJCQkJcmV0dXJuIHN1cGVySW50ZXJmYWNlc1swXS5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgcmVmU2NvcGUpOworCQkJCQkJcmVmU2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZSh0aGlzLnN1cGVySW50ZXJmYWNlc1swXSk7CisJCQkJCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlc1swXS5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgcmVmU2NvcGUpOwogCQkJCSB9CiAJCQl9IGVsc2UgaWYgKHN1cGVyY2xhc3MoKSAhPSBudWxsKSB7CiAJCQkJaWYgKHJlZlNjb3BlICE9IG51bGwpCi0JCQkJCXJlZlNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2Uoc3VwZXJjbGFzcyk7Ci0JCQkJcmV0dXJuIHN1cGVyY2xhc3MuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHJlZlNjb3BlKTsKKwkJCQkJcmVmU2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZSh0aGlzLnN1cGVyY2xhc3MpOworCQkJCXJldHVybiB0aGlzLnN1cGVyY2xhc3MuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHJlZlNjb3BlKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQkvKioKKwkgLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjZ2V0RmllbGQoY2hhcltdLCBib29sZWFuKQogCSAqLwogCXB1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0RmllbGQoY2hhcltdIGZpZWxkTmFtZSwgYm9vbGVhbiBuZWVkUmVzb2x2ZSkgewogCQlmaWVsZHMoKTsgLy8gZW5zdXJlIGZpZWxkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuLi4gbXVzdCBjcmVhdGUgYWxsIGF0IG9uY2UgdW5saWtlIG1ldGhvZHMKIAkJcmV0dXJuIFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoKGZpZWxkTmFtZSwgdGhpcy5maWVsZHMpOwogCX0KLQotCS8qKgorCSAKKyAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjZ2V0TWVtYmVyVHlwZShjaGFyW10pCiAJICovCiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZ2V0TWVtYmVyVHlwZShjaGFyW10gdHlwZU5hbWUpIHsKQEAgLTU0MCwyMSArNTgwLDIxIEBACiAJCQkJaW50IHN0YXJ0ID0gKGludCkgcmFuZ2U7CiAJCQkJaW50IGxlbmd0aCA9IChpbnQpIChyYW5nZSA+PiAzMikgLSBzdGFydCArIDE7CiAJCQkJLy8gY2Fubm90IG9wdGltaXplIHNpbmNlIHNvbWUgY2xpZW50cyByZWx5IG9uIGNsb25lIGFycmF5Ci0JCQkJLy8gaWYgKHN0YXJ0ID09IDAgJiYgbGVuZ3RoID09IHRoaXMubWV0aG9kcy5sZW5ndGgpIAorCQkJCS8vIGlmIChzdGFydCA9PSAwICYmIGxlbmd0aCA9PSB0aGlzLm1ldGhvZHMubGVuZ3RoKQogCQkJCS8vCXJldHVybiB0aGlzLm1ldGhvZHM7IC8vIGN1cnJlbnQgc2V0IGlzIGFscmVhZHkgaW50ZXJlc3Rpbmcgc3Vic2V0CiAJCQkJTWV0aG9kQmluZGluZ1tdIHJlc3VsdDsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kcywgc3RhcnQsIHJlc3VsdCA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJfQotCQlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZSkgIT0gMCkKKwkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZSkgIT0gMCkKIAkJCXJldHVybiBCaW5kaW5nLk5PX01FVEhPRFM7IC8vIGhhdmUgY3JlYXRlZCBhbGwgdGhlIG1ldGhvZHMgYW5kIHRoZXJlIGFyZSBubyBtYXRjaGVzCiAKIAkJTWV0aG9kQmluZGluZ1tdIHBhcmFtZXRlcml6ZWRNZXRob2RzID0gbnVsbDsKIAkJdHJ5IHsKIAkJICAgIE1ldGhvZEJpbmRpbmdbXSBvcmlnaW5hbE1ldGhvZHMgPSB0aGlzLnR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CiAJCSAgICBpbnQgbGVuZ3RoID0gb3JpZ2luYWxNZXRob2RzLmxlbmd0aDsKLQkJICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsgCisJCSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBCaW5kaW5nLk5PX01FVEhPRFM7CiAKIAkJICAgIHBhcmFtZXRlcml6ZWRNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbGVuZ3RoXTsKIAkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCkBAIC01NzYsMTEgKzYxNiwxNSBAQAogCQkgICAgcmV0dXJuIHBhcmFtZXRlcml6ZWRNZXRob2RzOwogCQl9IGZpbmFsbHkgewogCQkJLy8gaWYgdGhlIG9yaWdpbmFsIG1ldGhvZHMgY2Fubm90IGJlIHJldHJpZXZlZCAoZXguIEFib3J0Q29tcGlsYXRpb24pLCB0aGVuIGFzc3VtZSB3ZSBkbyBub3QgaGF2ZSBhbnkgbWV0aG9kcwotCQkgICAgaWYgKHBhcmFtZXRlcml6ZWRNZXRob2RzID09IG51bGwpIAorCQkgICAgaWYgKHBhcmFtZXRlcml6ZWRNZXRob2RzID09IG51bGwpCiAJCSAgICAgICAgdGhpcy5tZXRob2RzID0gcGFyYW1ldGVyaXplZE1ldGhvZHMgPSBCaW5kaW5nLk5PX01FVEhPRFM7CiAJCX0KIAl9CiAKKwlwdWJsaWMgaW50IGdldE91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZSgpIHsKKwkJcmV0dXJuIGdlbmVyaWNUeXBlKCkuZ2V0T3V0ZXJMb2NhbFZhcmlhYmxlc1Nsb3RTaXplKCk7CisJfQorCiAJcHVibGljIGJvb2xlYW4gaGFzTWVtYmVyVHlwZXMoKSB7CiAJICAgIHJldHVybiB0aGlzLnR5cGUuaGFzTWVtYmVyVHlwZXMoKTsKIAl9CkBAIC02MDIsNTAgKzY0Niw2MiBAQAogCQkvLyB0aGlzLnN1cGVyY2xhc3MgPSBudWxsOwogCQkvLyB0aGlzLnN1cGVySW50ZXJmYWNlcyA9IG51bGw7CiAJCS8vIHRoaXMuZmllbGRzID0gbnVsbDsKLQkJLy8gdGhpcy5tZXRob2RzID0gbnVsbDsJCQorCQkvLyB0aGlzLm1ldGhvZHMgPSBudWxsOwogCQl0aGlzLm1vZGlmaWVycyA9IHNvbWVUeXBlLm1vZGlmaWVycyAmIH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7IC8vIGRpc2NhcmQgZ2VuZXJpYyBzaWduYXR1cmUsIHdpbGwgY29tcHV0ZSBsYXRlcgogCQkvLyBvbmx5IHNldCBBY2NHZW5lcmljU2lnbmF0dXJlIGlmIHBhcmFtZXRlcml6ZWQgb3IgaGF2ZSBlbmNsb3NpbmcgdHlwZSByZXF1aXJlZCBzaWduYXR1cmUKIAkJaWYgKHNvbWVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJdGhpcy5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlOwogCQl9IGVsc2UgaWYgKHRoaXMuZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CiAJCQl0aGlzLm1vZGlmaWVycyB8PSAodGhpcy5lbmNsb3NpbmdUeXBlLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZSk7Ci0JCQl0aGlzLnRhZ0JpdHMgfD0gdGhpcy5lbmNsb3NpbmdUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZTsKKwkJCXRoaXMudGFnQml0cyB8PSB0aGlzLmVuY2xvc2luZ1R5cGUudGFnQml0cyAmIChUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSB8IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpOwogCQl9CiAJCWlmIChzb21lQXJndW1lbnRzICE9IG51bGwpIHsKIAkJCXRoaXMuYXJndW1lbnRzID0gc29tZUFyZ3VtZW50czsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzb21lQXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJVHlwZUJpbmRpbmcgc29tZUFyZ3VtZW50ID0gc29tZUFyZ3VtZW50c1tpXTsKLQkJCQlib29sZWFuIGlzV2lsZGNhcmRBcmd1bWVudCA9IHNvbWVBcmd1bWVudC5pc1dpbGRjYXJkKCk7Ci0JCQkJaWYgKGlzV2lsZGNhcmRBcmd1bWVudCkgewotCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZDsKKwkJCQlzd2l0Y2ggKHNvbWVBcmd1bWVudC5raW5kKCkpIHsKKwkJCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQ7CisJCQkJCQlpZiAoKChXaWxkY2FyZEJpbmRpbmcpIHNvbWVBcmd1bWVudCkuYm91bmRLaW5kICE9IFdpbGRjYXJkLlVOQk9VTkQpIHsKKwkJCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5Jc0JvdW5kUGFyYW1ldGVyaXplZFR5cGU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKKwkJCQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNCb3VuZFBhcmFtZXRlcml6ZWRUeXBlOworCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWlmICghaXNXaWxkY2FyZEFyZ3VtZW50IHx8ICgoV2lsZGNhcmRCaW5kaW5nKSBzb21lQXJndW1lbnQpLmJvdW5kS2luZCAhPSBXaWxkY2FyZC5VTkJPVU5EKSB7Ci0JCQkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLklzQm91bmRQYXJhbWV0ZXJpemVkVHlwZTsKLQkJCQl9Ci0JCQkgICAgdGhpcy50YWdCaXRzIHw9IHNvbWVBcmd1bWVudC50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGU7CisJCQkJdGhpcy50YWdCaXRzIHw9IHNvbWVBcmd1bWVudC50YWdCaXRzICYgKFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlIHwgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSB8IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcyk7CiAJCQl9Ci0JCX0JICAgIAotCQl0aGlzLnRhZ0JpdHMgfD0gc29tZVR5cGUudGFnQml0cyAmIChUYWdCaXRzLklzTG9jYWxUeXBlfCBUYWdCaXRzLklzTWVtYmVyVHlwZSB8IFRhZ0JpdHMuSXNOZXN0ZWRUeXBlKTsKKwkJfQorCQl0aGlzLnRhZ0JpdHMgfD0gc29tZVR5cGUudGFnQml0cyAmIChUYWdCaXRzLklzTG9jYWxUeXBlfCBUYWdCaXRzLklzTWVtYmVyVHlwZSB8IFRhZ0JpdHMuSXNOZXN0ZWRUeXBlIHwgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSB8IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcyk7CiAJCXRoaXMudGFnQml0cyAmPSB+KFRhZ0JpdHMuQXJlRmllbGRzQ29tcGxldGV8VGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBcmd1bWVudHMoKSB7CiAJICAgIC8vIGRvIG5vdGhpbmcgZm9yIHRydWUgcGFyYW1ldGVyaXplZCB0eXBlcyAob25seSBmb3IgcmF3IHR5cGVzKQogCX0KIAorCXZvaWQgaW5pdGlhbGl6ZUZvclN0YXRpY0ltcG9ydHMoKSB7CisJCXRoaXMudHlwZS5pbml0aWFsaXplRm9yU3RhdGljSW1wb3J0cygpOworCX0KKwogCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudFRvKFR5cGVCaW5kaW5nIG90aGVyVHlwZSkgewotCQlpZiAodGhpcyA9PSBvdGhlclR5cGUpIAorCQlpZiAodGhpcyA9PSBvdGhlclR5cGUpCiAJCSAgICByZXR1cm4gdHJ1ZTsKLQkgICAgaWYgKG90aGVyVHlwZSA9PSBudWxsKSAKKwkgICAgaWYgKG90aGVyVHlwZSA9PSBudWxsKQogCSAgICAgICAgcmV0dXJuIGZhbHNlOwogCSAgICBzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgewotCQorCiAJICAgIAljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CiAJICAgICAgICAJcmV0dXJuICgoV2lsZGNhcmRCaW5kaW5nKSBvdGhlclR5cGUpLmJvdW5kQ2hlY2sodGhpcyk7Ci0JICAgIAkJCisKIAkgICAgCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgogCSAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBvdGhlclBhcmFtVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIG90aGVyVHlwZTsKLQkgICAgICAgICAgICBpZiAodGhpcy50eXBlICE9IG90aGVyUGFyYW1UeXBlLnR5cGUpIAorCSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXJQYXJhbVR5cGUudHlwZSkKIAkgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCSAgICAgICAgICAgIGlmICghaXNTdGF0aWMoKSkgeyAvLyBzdGF0aWMgbWVtYmVyIHR5cGVzIGRvIG5vdCBjb21wYXJlIHRoZWlyIGVuY2xvc2luZwogCSAgICAgICAgICAgIAlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZyA9IGVuY2xvc2luZ1R5cGUoKTsKQEAgLTY3MCw4NyArNzI2LDI3IEBACiAJICAgICAgICAgICAgCQlyZXR1cm4gZmFsc2U7CiAJICAgICAgICAgICAgfQogCSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAJCi0JICAgIAljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgotCSAgICAgICAgICAgIHJldHVybiBlcmFzdXJlKCkgPT0gb3RoZXJUeXBlLmVyYXN1cmUoKTsKLQkgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJzZWN0aW5nV2l0aChUeXBlQmluZGluZyBvdGhlclR5cGUpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXJUeXBlKSAKLQkJICAgIHJldHVybiB0cnVlOwotCSAgICBpZiAob3RoZXJUeXBlID09IG51bGwpIAotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgewotCQotCSAgICAJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6Ci0JICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIG90aGVyUGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgb3RoZXJUeXBlOwotCSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXJQYXJhbVR5cGUudHlwZSkgCi0JICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICBpZiAoIWlzU3RhdGljKCkpIHsgLy8gc3RhdGljIG1lbWJlciB0eXBlcyBkbyBub3QgY29tcGFyZSB0aGVpciBlbmNsb3NpbmcKLQkgICAgICAgICAgICAJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBlbmNsb3NpbmdUeXBlKCk7Ci0JICAgICAgICAgICAgCWlmIChlbmNsb3NpbmcgIT0gbnVsbCkgewotCSAgICAgICAgICAgIAkJUmVmZXJlbmNlQmluZGluZyBvdGhlckVuY2xvc2luZyA9IG90aGVyUGFyYW1UeXBlLmVuY2xvc2luZ1R5cGUoKTsKLQkgICAgICAgICAgICAJCWlmIChvdGhlckVuY2xvc2luZyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JICAgICAgICAgICAgCQlpZiAoKG90aGVyRW5jbG9zaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkKSA9PSAwKSB7Ci0JCQkJCQkJaWYgKGVuY2xvc2luZyAhPSBvdGhlckVuY2xvc2luZykgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIAkJfSBlbHNlIHsKLQkgICAgICAgICAgICAJCQlpZiAoIWVuY2xvc2luZy5pc0VxdWl2YWxlbnRUbyhvdGhlclBhcmFtVHlwZS5lbmNsb3NpbmdUeXBlKCkpKSByZXR1cm4gZmFsc2U7Ci0JICAgICAgICAgICAgCQl9Ci0JICAgICAgICAgICAgCX0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzID09IG51bGwgPyAwIDogdGhpcy5hcmd1bWVudHMubGVuZ3RoOwotCSAgICAgICAgICAgIFR5cGVCaW5kaW5nW10gb3RoZXJBcmd1bWVudHMgPSBvdGhlclBhcmFtVHlwZS5hcmd1bWVudHM7Ci0JICAgICAgICAgICAgaW50IG90aGVyTGVuZ3RoID0gb3RoZXJBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBvdGhlckFyZ3VtZW50cy5sZW5ndGg7Ci0JICAgICAgICAgICAgaWYgKG90aGVyTGVuZ3RoICE9IGxlbmd0aCkgCi0JICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAgICAgCWlmICghdGhpcy5hcmd1bWVudHNbaV0uaXNUeXBlQXJndW1lbnRJbnRlcnNlY3Rpbmcob3RoZXJBcmd1bWVudHNbaV0pKQotCSAgICAgICAgICAgIAkJcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotCSAgICAJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6Ci0JICAgICAgICAgICAgU291cmNlVHlwZUJpbmRpbmcgb3RoZXJHZW5lcmljVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgb3RoZXJUeXBlOwotCSAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXJHZW5lcmljVHlwZSkgCi0JICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICBpZiAoIWlzU3RhdGljKCkpIHsgLy8gc3RhdGljIG1lbWJlciB0eXBlcyBkbyBub3QgY29tcGFyZSB0aGVpciBlbmNsb3NpbmcKLQkgICAgICAgICAgICAJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBlbmNsb3NpbmdUeXBlKCk7Ci0JICAgICAgICAgICAgCWlmIChlbmNsb3NpbmcgIT0gbnVsbCkgewotCSAgICAgICAgICAgIAkJUmVmZXJlbmNlQmluZGluZyBvdGhlckVuY2xvc2luZyA9IG90aGVyR2VuZXJpY1R5cGUuZW5jbG9zaW5nVHlwZSgpOwotCSAgICAgICAgICAgIAkJaWYgKG90aGVyRW5jbG9zaW5nID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICAJCWlmICgob3RoZXJFbmNsb3NpbmcudGFnQml0cyAmIFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpID09IDApIHsKLQkJCQkJCQlpZiAoZW5jbG9zaW5nICE9IG90aGVyRW5jbG9zaW5nKSByZXR1cm4gZmFsc2U7Ci0JICAgICAgICAgICAgCQl9IGVsc2UgewotCSAgICAgICAgICAgIAkJCWlmICghZW5jbG9zaW5nLmlzRXF1aXZhbGVudFRvKG90aGVyR2VuZXJpY1R5cGUuZW5jbG9zaW5nVHlwZSgpKSkgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIAkJfQotCSAgICAgICAgICAgIAl9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzID09IG51bGwgPyAwIDogdGhpcy5hcmd1bWVudHMubGVuZ3RoOwotCSAgICAgICAgICAgIG90aGVyQXJndW1lbnRzID0gb3RoZXJHZW5lcmljVHlwZS50eXBlVmFyaWFibGVzKCk7Ci0JICAgICAgICAgICAgb3RoZXJMZW5ndGggPSBvdGhlckFyZ3VtZW50cyA9PSBudWxsID8gMCA6IG90aGVyQXJndW1lbnRzLmxlbmd0aDsKLQkgICAgICAgICAgICBpZiAob3RoZXJMZW5ndGggIT0gbGVuZ3RoKSAKLQkgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkgICAgICAgICAgICAJaWYgKCF0aGlzLmFyZ3VtZW50c1tpXS5pc1R5cGVBcmd1bWVudEludGVyc2VjdGluZyhvdGhlckFyZ3VtZW50c1tpXSkpCi0JICAgICAgICAgICAgCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAgICAgICAgIAogCSAgICAJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKIAkgICAgICAgICAgICByZXR1cm4gZXJhc3VyZSgpID09IG90aGVyVHlwZS5lcmFzdXJlKCk7CiAJICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworCSAgICAvKiBXaXRoIHRoZSBoeWJyaWQgMS40LzEuNSsgcHJvamVjdHMgbW9kZXMsIHdoaWxlIGVzdGFibGlzaGluZyB0eXBlIGVxdWl2YWxlbmNlLCB3ZSBuZWVkIHRvCisJICAgICAgIGJlIHByZXBhcmVkIGZvciBhIHR5cGUgc3VjaCBhcyBNYXAgYXBwZWFyaW5nIGluIG9uZSBvZiB0aHJlZSBmb3JtczogQXMgKGEpIGEgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIAorCSAgICAgICBlLmcgTWFwPFN0cmluZywgU3RyaW5nPiwgKGIpIGFzIFJhd1R5cGVCaW5kaW5nIE1hcCNSQVcgYW5kIGZpbmFsbHkgKGMpIGFzIGEgQmluYXJ5VHlwZUJpbmRpbmcgCisJICAgICAgIFdoZW4gdGhlIHVzYWdlIG9mIGEgdHlwZSBsYWNrcyB0eXBlIHBhcmFtZXRlcnMsIHdoZXRoZXIgd2UgbGFuZCB1cCB3aXRoIHRoZSByYXcgZm9ybSBvciBub3QgZGVwZW5kcworCSAgICAgICBvbiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHR5cGUgd2FzICJzZWVuIHRvIGJlIiBhIGdlbmVyaWMgdHlwZSBpbiB0aGUgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudCBvcgorCSAgICAgICBub3QuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4ODI3IAorCSAgICAgKi8KKwkgICAgaWYgKGVyYXN1cmUoKSA9PSBvdGhlclR5cGUpIHsKKwkgICAgCXJldHVybiB0cnVlOworCSAgICB9CisJICAgIHJldHVybiBmYWxzZTsKIAl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2lzUGFyYW1ldGVyaXplZFR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyaXplZFR5cGUoKSB7Ci0JICAgIHJldHVybiB0cnVlOworCisJcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaHlDb25uZWN0ZWQoKSB7CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCAmJiB0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TdWJzdGl0dXRpb24jaXNSYXdTdWJzdGl0dXRpb24oKQogCSAqLwpAQCAtNzc3LDEwICs3NzMsMTAgQEAKIAkJCQkJcGFyYW1ldGVyaXplZE1lbWJlclR5cGVzW2ldID0gLyppc1JhdyAmJiBvcmlnaW5hbE1lbWJlclR5cGVzW2ldLmlzR2VuZXJpY1R5cGUoKQogCQkJCQkJPyB0aGlzLmVudmlyb25tZW50LmNyZWF0ZVJhd1R5cGUob3JpZ2luYWxNZW1iZXJUeXBlc1tpXSwgdGhpcykKIAkJCQkJCTogKi8gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZShvcmlnaW5hbE1lbWJlclR5cGVzW2ldLCBudWxsLCB0aGlzKTsKLQkJCQl0aGlzLm1lbWJlclR5cGVzID0gcGFyYW1ldGVyaXplZE1lbWJlclR5cGVzOwkgICAgCisJCQkJdGhpcy5tZW1iZXJUeXBlcyA9IHBhcmFtZXRlcml6ZWRNZW1iZXJUeXBlczsKIAkJCX0gZmluYWxseSB7CiAJCQkJLy8gaWYgdGhlIG9yaWdpbmFsIGZpZWxkcyBjYW5ub3QgYmUgcmV0cmlldmVkIChleC4gQWJvcnRDb21waWxhdGlvbiksIHRoZW4gYXNzdW1lIHdlIGRvIG5vdCBoYXZlIGFueSBmaWVsZHMKLQkJCQlpZiAodGhpcy5tZW1iZXJUeXBlcyA9PSBudWxsKSAKKwkJCQlpZiAodGhpcy5tZW1iZXJUeXBlcyA9PSBudWxsKQogCQkJCQl0aGlzLm1lbWJlclR5cGVzID0gQmluZGluZy5OT19NRU1CRVJfVFlQRVM7CiAJCQl9CiAJCX0KQEAgLTc5MSw3ICs3ODcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI21ldGhvZHMoKQogCSAqLwogCXB1YmxpYyBNZXRob2RCaW5kaW5nW10gbWV0aG9kcygpIHsKLQkJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApCisJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApCiAJCQlyZXR1cm4gdGhpcy5tZXRob2RzOwogCiAJCXRyeSB7CkBAIC04MDQsMTQgKzgwMCwyMSBAQAogCQkgICAgdGhpcy5tZXRob2RzID0gcGFyYW1ldGVyaXplZE1ldGhvZHM7CiAJCX0gZmluYWxseSB7CiAJCQkvLyBpZiB0aGUgb3JpZ2luYWwgbWV0aG9kcyBjYW5ub3QgYmUgcmV0cmlldmVkIChleC4gQWJvcnRDb21waWxhdGlvbiksIHRoZW4gYXNzdW1lIHdlIGRvIG5vdCBoYXZlIGFueSBtZXRob2RzCi0JCSAgICBpZiAodGhpcy5tZXRob2RzID09IG51bGwpIAorCQkgICAgaWYgKHRoaXMubWV0aG9kcyA9PSBudWxsKQogCQkgICAgICAgIHRoaXMubWV0aG9kcyA9IEJpbmRpbmcuTk9fTUVUSE9EUzsKIAotCQkJdGFnQml0cyB8PSAgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGU7Ci0JCX0JCQorCQkJdGhpcy50YWdCaXRzIHw9ICBUYWdCaXRzLkFyZU1ldGhvZHNDb21wbGV0ZTsKKwkJfQogCQlyZXR1cm4gdGhpcy5tZXRob2RzOwogCX0KLQorCS8qKgorCSAqIERlZmluZSB0byBiZSBhYmxlIHRvIGdldCB0aGUgY29tcHV0ZUlkKCkgZm9yIHRoZSBpbm5lciB0eXBlIGJpbmRpbmcuCisJICoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZyNwcm9ibGVtSWQoKQorCSAqLworCXB1YmxpYyBpbnQgcHJvYmxlbUlkKCkgeworCQlyZXR1cm4gdGhpcy50eXBlLnByb2JsZW1JZCgpOworCX0KIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjcXVhbGlmaWVkUGFja2FnZU5hbWUoKQogCSAqLwpAQCAtODMxLDExICs4MzQsMTEgQEAKIAkgKi8KIAlwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKIAkgICAgU3RyaW5nQnVmZmVyIG5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJaWYgKHRoaXMuaXNNZW1iZXJUeXBlKCkpIHsKLQkJCW5hbWVCdWZmZXIuYXBwZW5kKENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMuZW5jbG9zaW5nVHlwZSgpLnJlYWRhYmxlTmFtZSgpLCBzb3VyY2VOYW1lLCAnLicpKTsKKwkJaWYgKGlzTWVtYmVyVHlwZSgpKSB7CisJCQluYW1lQnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCksIHRoaXMuc291cmNlTmFtZSwgJy4nKSk7CiAJCX0gZWxzZSB7CiAJCQluYW1lQnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy50eXBlLmNvbXBvdW5kTmFtZSwgJy4nKSk7Ci0JCX0JICAgIAorCQl9CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQluYW1lQnVmZmVyLmFwcGVuZCgnPCcpOwogCQkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC04NDYsNyArODQ5LDcgQEAKIAkJfQogCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWVCdWZmZXIubGVuZ3RoKCk7CiAJCWNoYXJbXSByZWFkYWJsZU5hbWUgPSBuZXcgY2hhcltuYW1lTGVuZ3RoXTsKLQkJbmFtZUJ1ZmZlci5nZXRDaGFycygwLCBuYW1lTGVuZ3RoLCByZWFkYWJsZU5hbWUsIDApOwkJCisJCW5hbWVCdWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgcmVhZGFibGVOYW1lLCAwKTsKIAkgICAgcmV0dXJuIHJlYWRhYmxlTmFtZTsKIAl9CiAKQEAgLTg1NSwyMCArODU4LDM3IEBACiAJCQlyZXR1cm4gdGhpczsKIAogCQl0aGlzLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSGFzVW5yZXNvbHZlZFR5cGVWYXJpYWJsZXM7IC8vIGNhbiBiZSByZWN1cnNpdmUgc28gb25seSB3YW50IHRvIGNhbGwgb25jZQotCQlSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmVkVHlwZSA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHRoaXMudHlwZSwgdGhpcy5lbnZpcm9ubWVudCwgZmFsc2UpOyAvLyBzdGlsbCBwYXJ0IG9mIHBhcmFtZXRlcml6ZWQgdHlwZSByZWYKKwkJUmVmZXJlbmNlQmluZGluZyByZXNvbHZlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUodGhpcy50eXBlLCB0aGlzLmVudmlyb25tZW50LCBmYWxzZSAvKiBubyByYXcgY29udmVyc2lvbiAqLyk7IC8vIHN0aWxsIHBhcnQgb2YgcGFyYW1ldGVyaXplZCB0eXBlIHJlZgorCQl0aGlzLnRhZ0JpdHMgfD0gcmVzb2x2ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlpbnQgYXJnTGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdMZW5ndGg7IGkrKykKLQkJCQlCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLmFyZ3VtZW50c1tpXSwgdGhpcy5lbnZpcm9ubWVudCwgdGhpcywgaSk7Ci0JCQkvLyBhcml0eSBjaGVjawotCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHJlZlR5cGVWYXJpYWJsZXMgPSByZXNvbHZlZFR5cGUudHlwZVZhcmlhYmxlcygpOwotCQkJaWYgKHJlZlR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeyAvLyBjaGVjayBnZW5lcmljCi0JCQkJdGhpcy5lbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIubm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQobnVsbCwgcmVzb2x2ZWRUeXBlLCB0aGlzLmFyZ3VtZW50cyk7Ci0JCQkJcmV0dXJuIHRoaXM7IC8vIGNhbm5vdCByZWFjaCBoZXJlIGFzIEFib3J0Q29tcGlsYXRpb24gaXMgdGhyb3duCi0JCQl9IGVsc2UgaWYgKGFyZ0xlbmd0aCAhPSByZWZUeXBlVmFyaWFibGVzLmxlbmd0aCkgeyAvLyBjaGVjayBhcml0eQotCQkJCXRoaXMuZW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmluY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZFR5cGUobnVsbCwgcmVzb2x2ZWRUeXBlLCB0aGlzLmFyZ3VtZW50cyk7Ci0JCQkJcmV0dXJuIHRoaXM7IC8vIGNhbm5vdCByZWFjaCBoZXJlIGFzIEFib3J0Q29tcGlsYXRpb24gaXMgdGhyb3duCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0xlbmd0aDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUgPSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLmFyZ3VtZW50c1tpXSwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSAvKiByYXcgY29udmVyc2lvbiAqLyk7CisJCQkJdGhpcy5hcmd1bWVudHNbaV0gPSByZXNvbHZlVHlwZTsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gcmVzb2x2ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CiAJCQl9CisJCQkvKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NTY1LCBSZW1vdmVkIGdlbmVyaWMgY2hlY2sKKwkJCSAgIGFuZCBhcml0eSBjaGVjayBzaW5jZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGJpbmFyeSB0eXBlcyBoZXJlIGFuZCB0aGUgZmFjdCB0aGF0CisJCQkgICB0aGUgY29tcGlsZXIgcHJvZHVjZWQgY2xhc3MgZmlsZXMgZm9yIHRoZXNlIHR5cGVzIGF0IGFsbCBpcyBwcm9vZiBwb3NpdGl2ZSB0aGF0CisJCQkgICB0aGUgZ2VuZXJpYyBjaGVjayBhbmQgdGhlIGFyaXR5IGNoZWNrIHBhc3NlZCBpbiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgdGhhdCBwcm9kdWNlZAorCQkJICAgdGhlc2UgY2xhc3MgZmlsZXMuIE90aGVyd2lzZSB3ZSBkb24ndCBoYW5kbGUgbWl4ZWQgMS41IGFuZCAxLjQgcHJvamVjdHMgY29ycmVjdGx5LgorCQkJICAgSnVzdCBhcyB3aXRoIGJvdW5kcyBjaGVjayBiZWxvdywgaW5jcmVtZW50YWwgYnVpbGQgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQKKwkJCSAgIGRldGVjdCBwcm9ibGVtcyBpbiBzb3VyY2UuCisJCQkgKi8KKwkJCQorLy8JCQkvLyBhcml0eSBjaGVjaworLy8JCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gcmVmVHlwZVZhcmlhYmxlcyA9IHJlc29sdmVkVHlwZS50eXBlVmFyaWFibGVzKCk7CisvLwkJCWlmIChyZWZUeXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsgLy8gY2hlY2sgZ2VuZXJpYworLy8JCQkJLy8gQmVsb3cgMS41LCB3ZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNvbXBsYWluZWQgYWJvdXQgdGhlIHVzZSBvZiB0eXBlIHBhcmFtZXRlcnMuCisvLwkJCQlib29sZWFuIGlzQ29tcGxpYW50MTUgPSB0aGlzLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMub3JpZ2luYWxTb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworLy8JCQkJaWYgKGlzQ29tcGxpYW50MTUgJiYgKHJlc29sdmVkVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgPT0gMCkgeworLy8JCQkJCXRoaXMuZW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLm5vbkdlbmVyaWNUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkKDAsIG51bGwsIHJlc29sdmVkVHlwZSwgdGhpcy5hcmd1bWVudHMpOworLy8JCQkJfQorLy8JCQkJcmV0dXJuIHRoaXM7CisvLwkJCX0gZWxzZSBpZiAoYXJnTGVuZ3RoICE9IHJlZlR5cGVWYXJpYWJsZXMubGVuZ3RoKSB7IC8vIGNoZWNrIGFyaXR5CisvLwkJCQl0aGlzLmVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlci5pbmNvcnJlY3RBcml0eUZvclBhcmFtZXRlcml6ZWRUeXBlKG51bGwsIHJlc29sdmVkVHlwZSwgdGhpcy5hcmd1bWVudHMpOworLy8JCQkJcmV0dXJuIHRoaXM7IC8vIGNhbm5vdCByZWFjaCBoZXJlIGFzIEFib3J0Q29tcGlsYXRpb24gaXMgdGhyb3duCisvLwkJCX0KIAkJCS8vIGNoZWNrIGFyZ3VtZW50IHR5cGUgY29tcGF0aWJpbGl0eS4uLiBSRU1PVkVEIGZvciBub3cgc2luY2UgaW5jcmVtZW50YWwgYnVpbGQgd2lsbCBwcm9wYWdhdGUgY2hhbmdlICYgZGV0ZWN0IGluIHNvdXJjZQogLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0xlbmd0aDsgaSsrKSB7CiAvLwkJCSAgICBUeXBlQmluZGluZyByZXNvbHZlZEFyZ3VtZW50ID0gdGhpcy5hcmd1bWVudHNbaV07CkBAIC04ODUsMTEgKzkwNSwxMSBAQAogCSAqLwogCXB1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKSB7CiAJICAgIFN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JCWlmICh0aGlzLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQluYW1lQnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLmVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpLCBzb3VyY2VOYW1lLCAnLicpKTsKKwkJaWYgKGlzTWVtYmVyVHlwZSgpKSB7CisJCQluYW1lQnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5zb3VyY2VOYW1lLCAnLicpKTsKIAkJfSBlbHNlIHsKIAkJCW5hbWVCdWZmZXIuYXBwZW5kKHRoaXMudHlwZS5zb3VyY2VOYW1lKTsKLQkJfQkgICAgCisJCX0KIAkJaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCW5hbWVCdWZmZXIuYXBwZW5kKCc8Jyk7CiAJCSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTkwMCw3ICs5MjAsNyBAQAogCQl9CiAJCWludCBuYW1lTGVuZ3RoID0gbmFtZUJ1ZmZlci5sZW5ndGgoKTsKIAkJY2hhcltdIHNob3J0UmVhZGFibGVOYW1lID0gbmV3IGNoYXJbbmFtZUxlbmd0aF07Ci0JCW5hbWVCdWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgc2hvcnRSZWFkYWJsZU5hbWUsIDApOwkgICAgCisJCW5hbWVCdWZmZXIuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgc2hvcnRSZWFkYWJsZU5hbWUsIDApOwogCSAgICByZXR1cm4gc2hvcnRSZWFkYWJsZU5hbWU7CiAJfQogCkBAIC05MTEsNyArOTMxLDcgQEAKIAkgICAgaWYgKHRoaXMuc2lnbmF0dXJlID09IG51bGwpIHsKIAkgICAgICAgIHRoaXMuc2lnbmF0dXJlID0gdGhpcy50eXBlLnNpZ25hdHVyZSgpOyAgLy8gZXJhc3VyZQogCSAgICB9Ci0JCXJldHVybiB0aGlzLnNpZ25hdHVyZTsgCisJCXJldHVybiB0aGlzLnNpZ25hdHVyZTsKIAl9CiAKIAkvKioKQEAgLTkxOSwxMyArOTM5LDEzIEBACiAJICovCiAJcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lKCkgewogCQlyZXR1cm4gdGhpcy50eXBlLnNvdXJjZU5hbWUoKTsKLQl9CQorCX0KIAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TdWJzdGl0dXRpb24jc3Vic3RpdHV0ZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmcpCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nIHN1YnN0aXR1dGUoVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbFZhcmlhYmxlKSB7Ci0JCQorCiAJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBjdXJyZW50VHlwZSA9IHRoaXM7CiAJCXdoaWxlICh0cnVlKSB7CiAJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IGN1cnJlbnRUeXBlLnR5cGUudHlwZVZhcmlhYmxlcygpOwpAQCAtOTM1LDggKzk1NSwxMiBAQAogCQkJICAgIC8vIGxhenkgaW5pdCwgc2luY2UgY2Fubm90IGRvIHNvIGR1cmluZyBiaW5kaW5nIGNyZWF0aW9uIGlmIGR1cmluZyBzdXBlcnR5cGUgY29ubmVjdGlvbgogCQkJICAgIGlmIChjdXJyZW50VHlwZS5hcmd1bWVudHMgPT0gbnVsbCkKIAkJCQkJY3VycmVudFR5cGUuaW5pdGlhbGl6ZUFyZ3VtZW50cygpOyAvLyBvbmx5IGZvciByYXcgdHlwZXMKLQkJCSAgICBpZiAoY3VycmVudFR5cGUuYXJndW1lbnRzICE9IG51bGwpCi0JCQkJCXJldHVybiBjdXJyZW50VHlwZS5hcmd1bWVudHNbb3JpZ2luYWxWYXJpYWJsZS5yYW5rXTsKKwkJCSAgICBpZiAoY3VycmVudFR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCSAgICAJIGlmIChjdXJyZW50VHlwZS5hcmd1bWVudHMubGVuZ3RoID09IDApIHsgLy8gZGlhbW9uZCB0eXBlCisJCQkJCSAgICAJcmV0dXJuIG9yaWdpbmFsVmFyaWFibGU7CisJCQkJCSAgICB9CisJCQkgICAgCSByZXR1cm4gY3VycmVudFR5cGUuYXJndW1lbnRzW29yaWdpbmFsVmFyaWFibGUucmFua107CisJCQkgICAgfQkKIAkJCX0KIAkJCS8vIHJlY3Vyc2Ugb24gZW5jbG9zaW5nIHR5cGUsIGFzIGl0IG1heSBob2xkIG1vcmUgc3Vic3RpdHV0aW9ucyB0byBwZXJmb3JtCiAJCQlpZiAoY3VycmVudFR5cGUuaXNTdGF0aWMoKSkgYnJlYWs7CkBAIC05OTksMTQgKzEwMjMsMTQgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyNzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkKIAkgKi8KIAlwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIHN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGUuc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpOworCQlyZXR1cm4gZ2VuZXJpY1R5cGUoKS5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CiAJfQogCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpCiAJICovCiAJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQlyZXR1cm4gZ2VuZXJpY1R5cGUoKS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CiAJfQogCiAJLyoqCkBAIC0xMDE0LDgxICsxMDM4LDg5IEBACiAJICovCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMzApOwotCQlpZiAoaXNEZXByZWNhdGVkKCkpIGJ1ZmZlci5hcHBlbmQoImRlcHJlY2F0ZWQgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzUHVibGljKCkpIGJ1ZmZlci5hcHBlbmQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNQcm90ZWN0ZWQoKSkgYnVmZmVyLmFwcGVuZCgicHJvdGVjdGVkICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc1ByaXZhdGUoKSkgYnVmZmVyLmFwcGVuZCgicHJpdmF0ZSAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNBYnN0cmFjdCgpICYmIGlzQ2xhc3MoKSkgYnVmZmVyLmFwcGVuZCgiYWJzdHJhY3QgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzU3RhdGljKCkgJiYgaXNOZXN0ZWRUeXBlKCkpIGJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNGaW5hbCgpKSBidWZmZXIuYXBwZW5kKCJmaW5hbCAiKTsgLy8kTk9OLU5MUy0xJAotCQotCQlpZiAoaXNFbnVtKCkpIGJ1ZmZlci5hcHBlbmQoImVudW0gIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoaXNBbm5vdGF0aW9uVHlwZSgpKSBidWZmZXIuYXBwZW5kKCJAaW50ZXJmYWNlICIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGlzQ2xhc3MoKSkgYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLmRlYnVnTmFtZSgpKTsKLQkKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgoc3VwZXJjbGFzcyAhPSBudWxsKSA/IHN1cGVyY2xhc3MuZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXG5cdGltcGxlbWVudHMgOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgID4gMCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnVmZmVyLmFwcGVuZCgoc3VwZXJJbnRlcmZhY2VzW2ldICE9IG51bGwpID8gc3VwZXJJbnRlcmZhY2VzW2ldLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSIpOyAvLyROT04tTkxTLTEkCisJICAgIGlmICh0aGlzLnR5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgeworCSAgICAJYnVmZmVyLmFwcGVuZChkZWJ1Z05hbWUoKSk7CisJICAgIH0gZWxzZSB7CisJCQlpZiAoaXNEZXByZWNhdGVkKCkpIGJ1ZmZlci5hcHBlbmQoImRlcHJlY2F0ZWQgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpc1B1YmxpYygpKSBidWZmZXIuYXBwZW5kKCJwdWJsaWMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpc1Byb3RlY3RlZCgpKSBidWZmZXIuYXBwZW5kKCJwcm90ZWN0ZWQgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpc1ByaXZhdGUoKSkgYnVmZmVyLmFwcGVuZCgicHJpdmF0ZSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGlzQWJzdHJhY3QoKSAmJiBpc0NsYXNzKCkpIGJ1ZmZlci5hcHBlbmQoImFic3RyYWN0ICIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoaXNTdGF0aWMoKSAmJiBpc05lc3RlZFR5cGUoKSkgYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoaXNGaW5hbCgpKSBidWZmZXIuYXBwZW5kKCJmaW5hbCAiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlpZiAoaXNFbnVtKCkpIGJ1ZmZlci5hcHBlbmQoImVudW0gIik7IC8vJE5PTi1OTFMtMSQKKwkJCWVsc2UgaWYgKGlzQW5ub3RhdGlvblR5cGUoKSkgYnVmZmVyLmFwcGVuZCgiQGludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZSBpZiAoaXNDbGFzcygpKSBidWZmZXIuYXBwZW5kKCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZSBidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoZGVidWdOYW1lKCkpOworCisJCQlidWZmZXIuYXBwZW5kKCJcblx0ZXh0ZW5kcyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCgodGhpcy5zdXBlcmNsYXNzICE9IG51bGwpID8gdGhpcy5zdXBlcmNsYXNzLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSIpOyAvLyROT04tTkxTLTEkCisKKwkJCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRpbXBsZW1lbnRzIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoaSAgPiAwKQorCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoKHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldICE9IG51bGwpID8gdGhpcy5zdXBlckludGVyZmFjZXNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQogCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiTlVMTCBTVVBFUklOVEVSRkFDRVMiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgiTlVMTCBTVVBFUklOVEVSRkFDRVMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0JCWlmIChlbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdGVuY2xvc2luZyB0eXBlIDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoZW5jbG9zaW5nVHlwZSgpLmRlYnVnTmFtZSgpKTsKLQkJfQotCQotCQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJCWlmIChmaWVsZHMgIT0gQmluZGluZy5OT19GSUVMRFMpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgZmllbGRzICAgKi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJICAgIGJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKChmaWVsZHNbaV0gIT0gbnVsbCkgPyBmaWVsZHNbaV0udG9TdHJpbmcoKSA6ICJOVUxMIEZJRUxEIik7IC8vJE5PTi1OTFMtMSQgCisKKwkJCWlmIChlbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRlbmNsb3NpbmcgdHlwZSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJYnVmZmVyLmFwcGVuZChlbmNsb3NpbmdUeXBlKCkuZGVidWdOYW1lKCkpOwogCQkJfQotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgiTlVMTCBGSUVMRFMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0JCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RzICE9IEJpbmRpbmcuTk9fTUVUSE9EUykgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuLyogICBtZXRob2RzICAgKi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpLmFwcGVuZCgobWV0aG9kc1tpXSAhPSBudWxsKSA/IG1ldGhvZHNbaV0udG9TdHJpbmcoKSA6ICJOVUxMIE1FVEhPRCIpOyAvLyROT04tTkxTLTEkCisKKwkJCWlmICh0aGlzLmZpZWxkcyAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMuZmllbGRzICE9IEJpbmRpbmcuTk9fRklFTERTKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuLyogICBmaWVsZHMgICAqLyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQkJICAgIGJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKCh0aGlzLmZpZWxkc1tpXSAhPSBudWxsKSA/IHRoaXMuZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiTlVMTCBGSUVMRCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJOVUxMIEZJRUxEUyIpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJOVUxMIE1FVEhPRFMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0vLwkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKLS8vCQkJaWYgKG1lbWJlclR5cGVzICE9IE5vTWVtYmVyVHlwZXMpIHsKLS8vCQkJCWJ1ZmZlci5hcHBlbmQoIlxuLyogICBtZW1iZXJzICAgKi8iKTsKLS8vCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLS8vCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpLmFwcGVuZCgobWVtYmVyVHlwZXNbaV0gIT0gbnVsbCkgPyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZygpIDogIk5VTEwgVFlQRSIpOwotLy8JCQl9Ci0vLwkJfSBlbHNlIHsKLS8vCQkJYnVmZmVyLmFwcGVuZCgiTlVMTCBNRU1CRVIgVFlQRVMiKTsKLS8vCQl9Ci0JCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXG4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQlpZiAodGhpcy5tZXRob2RzICE9IG51bGwpIHsKKwkJCQlpZiAodGhpcy5tZXRob2RzICE9IEJpbmRpbmcuTk9fTUVUSE9EUykgeworCQkJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgbWV0aG9kcyAgICovIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMubWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKCh0aGlzLm1ldGhvZHNbaV0gIT0gbnVsbCkgPyB0aGlzLm1ldGhvZHNbaV0udG9TdHJpbmcoKSA6ICJOVUxMIE1FVEhPRCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJOVUxMIE1FVEhPRFMiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJLy8JCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJLy8JCQlpZiAobWVtYmVyVHlwZXMgIT0gTm9NZW1iZXJUeXBlcykgeworCS8vCQkJCWJ1ZmZlci5hcHBlbmQoIlxuLyogICBtZW1iZXJzICAgKi8iKTsKKwkvLwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJLy8JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/IG1lbWJlclR5cGVzW2ldLnRvU3RyaW5nKCkgOiAiTlVMTCBUWVBFIik7CisJLy8JCQl9CisJLy8JCX0gZWxzZSB7CisJLy8JCQlidWZmZXIuYXBwZW5kKCJOVUxMIE1FTUJFUiBUWVBFUyIpOworCS8vCQl9CisKKwkJCWJ1ZmZlci5hcHBlbmQoIlxuXG4iKTsgLy8kTk9OLU5MUy0xJAorCSAgICB9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJCisKIAl9CiAKIAlwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMoKSB7CiAJCWlmICh0aGlzLmFyZ3VtZW50cyA9PSBudWxsKSB7CiAJCQkvLyByZXRhaW4gb3JpZ2luYWwgdHlwZSB2YXJpYWJsZXMgaWYgbm90IHN1YnN0aXR1dGVkIChtZW1iZXIgdHlwZSBvZiBwYXJhbWV0ZXJpemVkIHR5cGUpCiAJCQlyZXR1cm4gdGhpcy50eXBlLnR5cGVWYXJpYWJsZXMoKTsKLQkJfSAKKwkJfQogCQlyZXR1cm4gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUzsKLQl9CQorCX0KKwkKKwlwdWJsaWMgRmllbGRCaW5kaW5nW10gdW5SZXNvbHZlZEZpZWxkcygpIHsKKwkJcmV0dXJuIHRoaXMuZmllbGRzOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BvbHltb3JwaGljTWV0aG9kQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWU5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BvbHltb3JwaGljTWV0aG9kQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCisvKioKKyAqIEJpbmRpbmcgZGVub3RpbmcgYSBwb2x5bW9ycGhpYyBtZXRob2QKKyAqLworcHVibGljIGNsYXNzIFBvbHltb3JwaGljTWV0aG9kQmluZGluZyBleHRlbmRzIE1ldGhvZEJpbmRpbmcgeworCisJcHJvdGVjdGVkIE1ldGhvZEJpbmRpbmcgcG9seW1vcnBoaWNNZXRob2Q7CisKKwlwdWJsaWMgUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmcgcG9seW1vcnBoaWNNZXRob2QsIFR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKKwkJc3VwZXIoCisJCQkJcG9seW1vcnBoaWNNZXRob2QubW9kaWZpZXJzLAorCQkJCXBvbHltb3JwaGljTWV0aG9kLnNlbGVjdG9yLAorCQkJCXBvbHltb3JwaGljTWV0aG9kLnJldHVyblR5cGUsCisJCQkJcGFyYW1ldGVyVHlwZXMsCisJCQkJcG9seW1vcnBoaWNNZXRob2QudGhyb3duRXhjZXB0aW9ucywKKwkJCQlwb2x5bW9ycGhpY01ldGhvZC5kZWNsYXJpbmdDbGFzcyk7CisJCXRoaXMucG9seW1vcnBoaWNNZXRob2QgPSBwb2x5bW9ycGhpY01ldGhvZDsKKwkJdGhpcy50YWdCaXRzID0gcG9seW1vcnBoaWNNZXRob2QudGFnQml0czsKKwl9CisJCisJcHVibGljIFBvbHltb3JwaGljTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHBvbHltb3JwaGljTWV0aG9kLCBUeXBlQmluZGluZyByZXR1cm5UeXBlLCBUeXBlQmluZGluZ1tdIHBhcmFtZXRlclR5cGVzKSB7CisJCXN1cGVyKAorCQkJCXBvbHltb3JwaGljTWV0aG9kLm1vZGlmaWVycywKKwkJCQlwb2x5bW9ycGhpY01ldGhvZC5zZWxlY3RvciwKKwkJCQlyZXR1cm5UeXBlLAorCQkJCXBhcmFtZXRlclR5cGVzLAorCQkJCXBvbHltb3JwaGljTWV0aG9kLnRocm93bkV4Y2VwdGlvbnMsCisJCQkJcG9seW1vcnBoaWNNZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCQl0aGlzLnBvbHltb3JwaGljTWV0aG9kID0gcG9seW1vcnBoaWNNZXRob2Q7CisJCXRoaXMudGFnQml0cyA9IHBvbHltb3JwaGljTWV0aG9kLnRhZ0JpdHM7CisJfQorCisJcHVibGljIE1ldGhvZEJpbmRpbmcgb3JpZ2luYWwoKSB7CisJCXJldHVybiB0aGlzLnBvbHltb3JwaGljTWV0aG9kOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1BvbHltb3JwaGljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFR5cGVCaW5kaW5nW10gbWF0Y2hpbmdQYXJhbWV0ZXJzLCBUeXBlQmluZGluZyBtYXRjaGluZ1JldHVyblR5cGUpIHsKKwkJaW50IGNhY2hlZFBhcmFtZXRlcnNMZW5ndGggPSB0aGlzLnBhcmFtZXRlcnMgPT0gbnVsbCA/IDAgOiB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOworCQlpbnQgbWF0Y2hpbmdQYXJhbWV0ZXJzTGVuZ3RoID0gbWF0Y2hpbmdQYXJhbWV0ZXJzID09IG51bGwgPyAwIDogbWF0Y2hpbmdQYXJhbWV0ZXJzLmxlbmd0aDsKKwkJaWYgKG1hdGNoaW5nUGFyYW1ldGVyc0xlbmd0aCAhPSBjYWNoZWRQYXJhbWV0ZXJzTGVuZ3RoKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChpbnQgaiA9IDA7IGogPCBjYWNoZWRQYXJhbWV0ZXJzTGVuZ3RoOyBqKyspeworCQkJaWYgKHRoaXMucGFyYW1ldGVyc1tqXSAhPSBtYXRjaGluZ1BhcmFtZXRlcnNbal0pIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJVHlwZUJpbmRpbmcgY2FjaGVkUmV0dXJuVHlwZSA9IHRoaXMucmV0dXJuVHlwZTsKKwkJaWYgKG1hdGNoaW5nUmV0dXJuVHlwZSA9PSBudWxsKSB7CisJCQlpZiAoY2FjaGVkUmV0dXJuVHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgaWYgKGNhY2hlZFJldHVyblR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKG1hdGNoaW5nUmV0dXJuVHlwZSAhPSBjYWNoZWRSZXR1cm5UeXBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJLy8gYWxsIGFyZ3VtZW50cyBtYXRjaAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoKKwkgKiBFdmVuIGlmIHBvbHltb3JwaGljIG1ldGhvZHMgYXJlIHZhcmFyZ3MgbWV0aG9kLCB3ZSBkb24ndCB3YW50IHRoZW0gdG8gYmUgdHJlYXRlZCBhcyB2YXJhcmdzIG1ldGhvZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFyYXJncygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUJpbmRpbmcuamF2YQppbmRleCBmMWU4OGNmLi5mYTgwNTQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1CaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ3LDkgKzQ3LDkgQEAKICovCiAKIHB1YmxpYyBmaW5hbCBpbnQgcHJvYmxlbUlkKCkgewotCXJldHVybiBwcm9ibGVtSWQ7CisJcmV0dXJuIHRoaXMucHJvYmxlbUlkOwogfQogcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSB7Ci0JcmV0dXJuIG5hbWU7CisJcmV0dXJuIHRoaXMubmFtZTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUZpZWxkQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtRmllbGRCaW5kaW5nLmphdmEKaW5kZXggNTYwZDY5Mi4uODgzZDBhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtRmllbGRCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtRmllbGRCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNyArMTMsNyBAQAogcHVibGljIGNsYXNzIFByb2JsZW1GaWVsZEJpbmRpbmcgZXh0ZW5kcyBGaWVsZEJpbmRpbmcgewogCXByaXZhdGUgaW50IHByb2JsZW1JZDsKIAlwdWJsaWMgRmllbGRCaW5kaW5nIGNsb3Nlc3RNYXRjaDsKLQkJCisKIC8vIE5PVEU6IG11c3Qgb25seSBhbnN3ZXIgdGhlIHN1YnNldCBvZiB0aGUgbmFtZSByZWxhdGVkIHRvIHRoZSBwcm9ibGVtCiAKIHB1YmxpYyBQcm9ibGVtRmllbGRCaW5kaW5nKFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MsIGNoYXJbXSBuYW1lLCBpbnQgcHJvYmxlbUlkKSB7CkBAIC0zMSw2ICszMSw2IEBACiAqLwogCiBwdWJsaWMgZmluYWwgaW50IHByb2JsZW1JZCgpIHsKLQlyZXR1cm4gcHJvYmxlbUlkOworCXJldHVybiB0aGlzLnByb2JsZW1JZDsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbU1ldGhvZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbU1ldGhvZEJpbmRpbmcuamF2YQppbmRleCAxNDYyMjZjLi4xNmViZWJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1NZXRob2RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtTWV0aG9kQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEwICsxMSwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBwdWJsaWMgY2xhc3MgUHJvYmxlbU1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBNZXRob2RCaW5kaW5nIHsKLSAgICAKKwogCXByaXZhdGUgaW50IHByb2JsZW1SZWFzb247CiAJcHVibGljIE1ldGhvZEJpbmRpbmcgY2xvc2VzdE1hdGNoOyAvLyBUT0RPIChwaGlsaXBwZSkgc2hvdWxkIHJlbmFtZSBpbnRvICNhbHRlcm5hdGVNYXRjaAotCQorCiBwdWJsaWMgUHJvYmxlbU1ldGhvZEJpbmRpbmcoY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3MsIGludCBwcm9ibGVtUmVhc29uKSB7CiAJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogCXRoaXMucGFyYW1ldGVycyA9IChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkgPyBCaW5kaW5nLk5PX1BBUkFNRVRFUlMgOiBhcmdzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVBhY2thZ2VCaW5kaW5nLmphdmEKaW5kZXggYzZmZjg0Ni4uMzgyZTAxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUGFja2FnZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDYgKzI3LDYgQEAKICovCiAKIHB1YmxpYyBmaW5hbCBpbnQgcHJvYmxlbUlkKCkgewotCXJldHVybiBwcm9ibGVtSWQ7CisJcmV0dXJuIHRoaXMucHJvYmxlbUlkOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVhc29ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVhc29ucy5qYXZhCmluZGV4IGFlZDdiOWMuLmUxNTZiZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVJlYXNvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWFzb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsNCArMjYsNSBAQAogCWZpbmFsIGludCBQYXJhbWV0ZXJpemVkTWV0aG9kVHlwZU1pc21hdGNoID0gMTI7IC8vIGZvciBnZW5lcmljIG1ldGhvZAogCWZpbmFsIGludCBUeXBlQXJndW1lbnRzRm9yUmF3R2VuZXJpY01ldGhvZCA9IDEzOyAvLyBmb3IgZ2VuZXJpYyBtZXRob2QKIAlmaW5hbCBpbnQgSW52YWxpZFR5cGVGb3JTdGF0aWNJbXBvcnQgPSAxNDsKKwlmaW5hbCBpbnQgSW52YWxpZFR5cGVGb3JBdXRvTWFuYWdlZFJlc291cmNlID0gMTU7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWZlcmVuY2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWZlcmVuY2VCaW5kaW5nLmphdmEKaW5kZXggNWMyMmM2MC4uZWZjMWJjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVmZXJlbmNlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxMCArMTAsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworCiBwdWJsaWMgY2xhc3MgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgZXh0ZW5kcyBSZWZlcmVuY2VCaW5kaW5nIHsKLQlwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmcgY2xvc2VzdE1hdGNoOworCVJlZmVyZW5jZUJpbmRpbmcgY2xvc2VzdE1hdGNoOwogCXByaXZhdGUgaW50IHByb2JsZW1SZWFzb247Ci0JCisKIC8vIE5PVEU6IG11c3Qgb25seSBhbnN3ZXIgdGhlIHN1YnNldCBvZiB0aGUgbmFtZSByZWxhdGVkIHRvIHRoZSBwcm9ibGVtCiAKIHB1YmxpYyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIFJlZmVyZW5jZUJpbmRpbmcgY2xvc2VzdE1hdGNoLCBpbnQgcHJvYmxlbVJlYXNvbikgewpAQCAtMjEsMTQgKzI1LDE4IEBACiAJdGhpcy5jbG9zZXN0TWF0Y2ggPSBjbG9zZXN0TWF0Y2g7CiAJdGhpcy5wcm9ibGVtUmVhc29uID0gcHJvYmxlbVJlYXNvbjsKIH0KLXB1YmxpYyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjaGFyW10gbmFtZSwgUmVmZXJlbmNlQmluZGluZyBjbG9zZXN0TWF0Y2gsIGludCBwcm9ibGVtUmVhc29uKSB7Ci0JdGhpcyhuZXcgY2hhcltdW10ge25hbWV9LCBjbG9zZXN0TWF0Y2gsIHByb2JsZW1SZWFzb24pOworCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNjbG9zZXN0TWF0Y2goKQorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgY2xvc2VzdE1hdGNoKCkgeworCXJldHVybiB0aGlzLmNsb3Nlc3RNYXRjaDsKIH0KIAogLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyNjbG9zZXN0TWF0Y2goKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2Nsb3Nlc3RNYXRjaCgpCiAgKi8KLXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGNsb3Nlc3RNYXRjaCgpIHsKK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGNsb3Nlc3RSZWZlcmVuY2VNYXRjaCgpIHsKIAlyZXR1cm4gdGhpcy5jbG9zZXN0TWF0Y2g7CiB9CiAKQEAgLTQwLDYgKzQ4LDI4IEBACiAJcmV0dXJuIHRoaXMucHJvYmxlbVJlYXNvbjsKIH0KIAorcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvYmxlbVJlYXNvblN0cmluZyhpbnQgcHJvYmxlbVJlYXNvbikgeworCXRyeSB7CisJCUNsYXNzIHJlYXNvbnMgPSBQcm9ibGVtUmVhc29ucy5jbGFzczsKKwkJU3RyaW5nIHNpbXBsZU5hbWUgPSByZWFzb25zLmdldE5hbWUoKTsKKwkJaW50IGxhc3REb3QgPSBzaW1wbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCWlmIChsYXN0RG90ID49IDApIHsKKwkJCXNpbXBsZU5hbWUgPSBzaW1wbGVOYW1lLnN1YnN0cmluZyhsYXN0RG90KzEpOworCQl9CisJCUZpZWxkW10gZmllbGRzID0gcmVhc29ucy5nZXRGaWVsZHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07CisJCQlpZiAoIWZpZWxkLmdldFR5cGUoKS5lcXVhbHMoaW50LmNsYXNzKSkgY29udGludWU7CisJCQlpZiAoZmllbGQuZ2V0SW50KHJlYXNvbnMpID09IHByb2JsZW1SZWFzb24pIHsKKwkJCQlyZXR1cm4gc2ltcGxlTmFtZSArICcuJyArIGZpZWxkLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCXJldHVybiAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKK30KKwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyNzaG9ydFJlYWRhYmxlTmFtZSgpCiAgKi8KQEAgLTQ3LDQgKzc3LDE0IEBACiAJcmV0dXJuIHJlYWRhYmxlTmFtZSgpOwogfQogCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwlidWZmZXIuYXBwZW5kKCJQcm9ibGVtVHlwZTpbY29tcG91bmROYW1lPSIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0aGlzLmNvbXBvdW5kTmFtZSA9PSBudWxsID8gIjxudWxsPiIgOiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmNvbXBvdW5kTmFtZSwnLicpKSk7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCJdW3Byb2JsZW1JRD0iKS5hcHBlbmQocHJvYmxlbVJlYXNvblN0cmluZyh0aGlzLnByb2JsZW1SZWFzb24pKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIl1bY2xvc2VzdE1hdGNoPSIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0aGlzLmNsb3Nlc3RNYXRjaCA9PSBudWxsID8gIjxudWxsPiIgOiB0aGlzLmNsb3Nlc3RNYXRjaC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmF3VHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmF3VHlwZUJpbmRpbmcuamF2YQppbmRleCAzYzgyMDJjLi4yMTQ1NzJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Jhd1R5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SYXdUeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDcgKzE4LDcgQEAKICAqIAl3aWxsIGJlaGF2ZSBhcyBYPEV4Y2VwdGlvbj4KICAqLwogcHVibGljIGNsYXNzIFJhd1R5cGVCaW5kaW5nIGV4dGVuZHMgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFJhdyB0eXBlIGFyZ3VtZW50cyBhcmUgZXJhc3VyZSBvZiByZXNwZWN0aXZlIHBhcmFtZXRlciBib3VuZHMuIEJ1dCB3ZSBtYXkgbm90IGhhdmUgcmVzb2x2ZWQKICAgICAgKiB0aGVzZSBib3VuZHMgeWV0IGlmIGNyZWF0aW5nIHJhdyB0eXBlcyB3aGlsZSBzdXBlcnR5cGUgaGllcmFyY2hpZXMgYXJlIGJlaW5nIGNvbm5lY3RlZC4KQEAgLTI2LDE1ICsyNiwzNyBAQAogICAgICAqLwogCXB1YmxpYyBSYXdUeXBlQmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpewogCQlzdXBlcih0eXBlLCBudWxsLCBlbmNsb3NpbmdUeXBlLCBlbnZpcm9ubWVudCk7Ci0JCWlmIChlbmNsb3NpbmdUeXBlID09IG51bGwgfHwgKGVuY2xvc2luZ1R5cGUubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlKSA9PSAwKQorCQl0aGlzLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCWlmICgodHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBNaXNzaW5nVHlwZUJpbmRpbmcpIHsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgeworCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0eXBlOworCQkJCWlmIChwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcuZ2VuZXJpY1R5cGUoKSBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZykgeworCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCAmJiAoZW5jbG9zaW5nVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJaWYgKGVuY2xvc2luZ1R5cGUgaW5zdGFuY2VvZiBNaXNzaW5nVHlwZUJpbmRpbmcpIHsKKwkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCX0gZWxzZSBpZiAoZW5jbG9zaW5nVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgeworCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBlbmNsb3NpbmdUeXBlOworCQkJCWlmIChwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcuZ2VuZXJpY1R5cGUoKSBpbnN0YW5jZW9mIE1pc3NpbmdUeXBlQmluZGluZykgeworCQkJCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCB8fCAoZW5jbG9zaW5nVHlwZS5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpID09IDApIHsKIAkJCXRoaXMubW9kaWZpZXJzICY9IH5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7IC8vIG9ubHkgbmVlZCBzaWduYXR1cmUgaWYgZW5jbG9zaW5nIG5lZWRzIG9uZQotCX0gICAgCi0JCisJCX0KKwl9CisKIAlwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKIAkgICAgU3RyaW5nQnVmZmVyIHNpZyA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwogCQlpZiAoaXNNZW1iZXJUeXBlKCkgJiYgZW5jbG9zaW5nVHlwZSgpLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewogCQkgICAgY2hhcltdIHR5cGVTaWcgPSBlbmNsb3NpbmdUeXBlKCkuY29tcHV0ZVVuaXF1ZUtleShmYWxzZS8qbm90IGEgbGVhZiovKTsKLQkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNpZy5sZW5ndGgtMTsgaSsrKSBzaWcuYXBwZW5kKHR5cGVTaWdbaV0pOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCisJCSAgICBzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCiAJCSAgICBzaWcuYXBwZW5kKCcuJykuYXBwZW5kKHNvdXJjZU5hbWUoKSkuYXBwZW5kKCc8JykuYXBwZW5kKCc+JykuYXBwZW5kKCc7Jyk7CiAJCX0gZWxzZSB7CiAJCSAgICAgc2lnLmFwcGVuZChnZW5lcmljVHlwZSgpLmNvbXB1dGVVbmlxdWVLZXkoZmFsc2UvKm5vdCBhIGxlYWYqLykpOwpAQCAtNDMsMTAgKzY1LDEwIEBACiAKIAkJaW50IHNpZ0xlbmd0aCA9IHNpZy5sZW5ndGgoKTsKIAkJY2hhcltdIHVuaXF1ZUtleSA9IG5ldyBjaGFyW3NpZ0xlbmd0aF07Ci0JCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHVuaXF1ZUtleSwgMCk7CQkJCQkJICAgIAorCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCB1bmlxdWVLZXksIDApOwogCQlyZXR1cm4gdW5pcXVlS2V5OwogICAgCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcjY3JlYXRlUGFyYW1ldGVyaXplZE1ldGhvZChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcpCiAJICovCkBAIC01NiwxOSArNzgsMTkgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZChvcmlnaW5hbE1ldGhvZCwgdGhpcyk7CiAJfQotCQorCiAJcHVibGljIGludCBraW5kKCkgewogCQlyZXR1cm4gUkFXX1RZUEU7Ci0JfQkKLQkKKwl9CisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjZGVidWdOYW1lKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGRlYnVnTmFtZSgpIHsKIAkgICAgU3RyaW5nQnVmZmVyIG5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKIAkJbmFtZUJ1ZmZlci5hcHBlbmQoYWN0dWFsVHlwZSgpLnNvdXJjZU5hbWUoKSkuYXBwZW5kKCIjUkFXIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgcmV0dXJuIG5hbWVCdWZmZXIudG9TdHJpbmcoKTsJCQotCX0JCisJICAgIHJldHVybiBuYW1lQnVmZmVyLnRvU3RyaW5nKCk7CisJfQogCiAJLyoqCiAJICogTHR5cGU8cGFyYW0xIC4uLiBwYXJhbU4+OwpAQCAtODAsMTcgKzEwMiwxNiBAQAogCQkgICAgCXRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUgPSBnZW5lcmljVHlwZSgpLnNpZ25hdHVyZSgpOwogCQkJfSBlbHNlIHsKIAkJCSAgICBTdHJpbmdCdWZmZXIgc2lnID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JCQkgICAgaWYgKHRoaXMuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCSAgICBpZiAoaXNNZW1iZXJUeXBlKCkpIHsKIAkJCSAgICAJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBlbmNsb3NpbmdUeXBlKCk7Ci0JCQkgICAgCWJvb2xlYW4gaGFzUGFyYW1ldGVyaXplZEVuY2xvc2luZyA9IGVuY2xvc2luZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCk7Ci0JCQkJCWNoYXJbXSB0eXBlU2lnID0gaGFzUGFyYW1ldGVyaXplZEVuY2xvc2luZyA/IGVuY2xvc2luZy5nZW5lcmljVHlwZVNpZ25hdHVyZSgpIDogZW5jbG9zaW5nLnNpZ25hdHVyZSgpOworCQkJCQljaGFyW10gdHlwZVNpZyA9IGVuY2xvc2luZy5nZW5lcmljVHlwZVNpZ25hdHVyZSgpOwogCQkJCQlzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOy8vIGNvcHkgYWxsIGJ1dCB0cmFpbGluZyBzZW1pY29sb24KLQkJCSAgICAJaWYgKGhhc1BhcmFtZXRlcml6ZWRFbmNsb3NpbmcgJiYgKGVuY2xvc2luZy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApIHsKKwkJCSAgICAJaWYgKChlbmNsb3NpbmcubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlKSAhPSAwKSB7CiAJCQkgICAgCQlzaWcuYXBwZW5kKCcuJyk7CiAJCQkgICAgCX0gZWxzZSB7CiAJCQkgICAgCQlzaWcuYXBwZW5kKCckJyk7CiAJCQkgICAgCX0KLQkJCSAgICAJc2lnLmFwcGVuZCh0aGlzLnNvdXJjZU5hbWUoKSk7CisJCQkgICAgCXNpZy5hcHBlbmQoc291cmNlTmFtZSgpKTsKIAkJCSAgICB9IGVsc2UgewogCQkJICAgIAljaGFyW10gdHlwZVNpZyA9IGdlbmVyaWNUeXBlKCkuc2lnbmF0dXJlKCk7CiAJCQkJCXNpZy5hcHBlbmQodHlwZVNpZywgMCwgdHlwZVNpZy5sZW5ndGgtMSk7Ly8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgpAQCAtOTgsMjIgKzExOSwyMyBAQAogCQkJCXNpZy5hcHBlbmQoJzsnKTsKIAkJCQlpbnQgc2lnTGVuZ3RoID0gc2lnLmxlbmd0aCgpOwogCQkJCXRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUgPSBuZXcgY2hhcltzaWdMZW5ndGhdOwotCQkJCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUsIDApOwkJCQkJCQorCQkJCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUsIDApOwogCQkJfQogCQl9CiAJCXJldHVybiB0aGlzLmdlbmVyaWNUeXBlU2lnbmF0dXJlOwotCX0JCQotCQorCX0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudFRvKFR5cGVCaW5kaW5nIG90aGVyVHlwZSkgewotCQlpZiAodGhpcyA9PSBvdGhlclR5cGUpIAorCQlpZiAodGhpcyA9PSBvdGhlclR5cGUgfHwgZXJhc3VyZSgpID09IG90aGVyVHlwZSkKIAkJICAgIHJldHVybiB0cnVlOwotCSAgICBpZiAob3RoZXJUeXBlID09IG51bGwpIAorCSAgICBpZiAob3RoZXJUeXBlID09IG51bGwpCiAJICAgICAgICByZXR1cm4gZmFsc2U7CiAJICAgIHN3aXRjaChvdGhlclR5cGUua2luZCgpKSB7Ci0JCisKIAkgICAgCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRToKIAkgICAgICAgIAlyZXR1cm4gKChXaWxkY2FyZEJpbmRpbmcpIG90aGVyVHlwZSkuYm91bmRDaGVjayh0aGlzKTsKLQkgICAgCQkKKwogCSAgICAJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6CiAJICAgIAljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKIAkgICAgCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CkBAIC0xMjEsNDAgKzE0MywyOSBAQAogCSAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKIAl9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcnNlY3RpbmdXaXRoKFR5cGVCaW5kaW5nIG90aGVyVHlwZSkgewotCQlpZiAodGhpcyA9PSBvdGhlclR5cGUpIAotCQkgICAgcmV0dXJuIHRydWU7Ci0JICAgIGlmIChvdGhlclR5cGUgPT0gbnVsbCkgCi0JICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZhYmx5RGlzdGluY3QoVHlwZUJpbmRpbmcgb3RoZXJUeXBlKSB7CisJCWlmICh0aGlzID09IG90aGVyVHlwZSB8fCBlcmFzdXJlKCkgPT0gb3RoZXJUeXBlKSAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NTg4CisJCSAgICByZXR1cm4gZmFsc2U7CisJICAgIGlmIChvdGhlclR5cGUgPT0gbnVsbCkKKwkgICAgICAgIHJldHVybiB0cnVlOwogCSAgICBzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgewotCQorCiAJICAgIAljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFIDoKIAkgICAgCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgogCSAgICAJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKLQkgICAgICAgICAgICByZXR1cm4gZXJhc3VyZSgpID09IG90aGVyVHlwZS5lcmFzdXJlKCk7CisJICAgICAgICAgICAgcmV0dXJuIGVyYXN1cmUoKSAhPSBvdGhlclR5cGUuZXJhc3VyZSgpOwogCSAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAJfQotICAgIAotCS8qKgotCSAqIFJhdyB0eXBlIGlzIG5vdCB0cmVhdGVkIGFzIGEgc3RhbmRhcmQgcGFyYW1ldGVyaXplZCB0eXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2lzUGFyYW1ldGVyaXplZFR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyaXplZFR5cGUoKSB7Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9CQotCXB1YmxpYyBib29sZWFuIGlzUmF3VHlwZSgpIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQkKLQkKKwogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBcmd1bWVudHMoKSB7CiAJCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzID0gZ2VuZXJpY1R5cGUoKS50eXBlVmFyaWFibGVzKCk7CiAJCWludCBsZW5ndGggPSB0eXBlVmFyaWFibGVzLmxlbmd0aDsKIAkJVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCS8vIHBlcmZvcm0gcmF3IGNvbnZlcnNpb24gb24gdmFyaWFibGUgdXBwZXIgYm91bmQgLSBjb3VsZCBjYXVzZSBpbmZpbml0ZSByZWdyZXNzaW9uIGlmIGFyZ3VtZW50cyB3ZXJlIGluaXRpYWxpemVkIGxhemlseQotCQkgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHRoaXMuZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZSh0eXBlVmFyaWFibGVzW2ldLmVyYXN1cmUoKSk7CisJCSAgICB0eXBlQXJndW1lbnRzW2ldID0gdGhpcy5lbnZpcm9ubWVudC5jb252ZXJ0VG9SYXdUeXBlKHR5cGVWYXJpYWJsZXNbaV0uZXJhc3VyZSgpLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKIAkJfQogCQl0aGlzLmFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CiAJfQpAQCAtMTY0LDcgKzE3NSw3IEBACiAJcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSAvKmphdmEubGFuZy5PYmplY3QsICBwLlg8VD4gKi8gewogCSAgICBjaGFyW10gcmVhZGFibGVOYW1lOwogCQlpZiAoaXNNZW1iZXJUeXBlKCkpIHsKLQkJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSwgc291cmNlTmFtZSwgJy4nKTsKKwkJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSwgdGhpcy5zb3VyY2VOYW1lLCAnLicpOwogCQl9IGVsc2UgewogCQkJcmVhZGFibGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFjdHVhbFR5cGUoKS5jb21wb3VuZE5hbWUsICcuJyk7CiAJCX0KQEAgLTE3Nyw3ICsxODgsNyBAQAogCXB1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKSAvKk9iamVjdCovIHsKIAkgICAgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lOwogCQlpZiAoaXNNZW1iZXJUeXBlKCkpIHsKLQkJCXNob3J0UmVhZGFibGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZW5jbG9zaW5nVHlwZSgpLnNob3J0UmVhZGFibGVOYW1lKCksIHNvdXJjZU5hbWUsICcuJyk7CisJCQlzaG9ydFJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpLCB0aGlzLnNvdXJjZU5hbWUsICcuJyk7CiAJCX0gZWxzZSB7CiAJCQlzaG9ydFJlYWRhYmxlTmFtZSA9IGFjdHVhbFR5cGUoKS5zb3VyY2VOYW1lOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1JlZmVyZW5jZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCmluZGV4IDFjMTIyZmMuLjc4NDgzNDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYsNyArMTYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSURlcGVuZGVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIAogLyoKQEAgLTMwLDcgKzI5LDcgQEAKIG51bGwgaXMgTk9UIGEgdmFsaWQgdmFsdWUgZm9yIGEgbm9uLXB1YmxpYyBmaWVsZC4uLiBpdCBqdXN0IG1lYW5zIHRoZSBmaWVsZCBpcyBub3QgaW5pdGlhbGl6ZWQuCiAqLwogCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVmZXJlbmNlQmluZGluZyBleHRlbmRzIFR5cGVCaW5kaW5nIGltcGxlbWVudHMgSURlcGVuZGVudCB7CithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVmZXJlbmNlQmluZGluZyBleHRlbmRzIFR5cGVCaW5kaW5nIHsKIAogCXB1YmxpYyBjaGFyW11bXSBjb21wb3VuZE5hbWU7CiAJcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lOwpAQCAtNDIsNyArNDEsNyBAQAogCiAJcHJpdmF0ZSBTaW1wbGVMb29rdXBUYWJsZSBjb21wYXRpYmxlQ2FjaGU7CiAKLQlwdWJsaWMgc3RhdGljIFJlZmVyZW5jZUJpbmRpbmcgTFVCX0dFTkVSSUMgPSBuZXcgUmVmZXJlbmNlQmluZGluZygpIHsgLyogdXNlZCBmb3IgbHViIGNvbXB1dGF0aW9uICovfTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgTFVCX0dFTkVSSUMgPSBuZXcgUmVmZXJlbmNlQmluZGluZygpIHsgLyogdXNlZCBmb3IgbHViIGNvbXB1dGF0aW9uICovfTsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgRklFTERfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yKCkgewogCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKQEAgLTE3MywxMyArMTcyLDE3IEBACiBwdWJsaWMgTWV0aG9kQmluZGluZ1tdIGF2YWlsYWJsZU1ldGhvZHMoKSB7CiAJcmV0dXJuIG1ldGhvZHMoKTsKIH0KLS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBjYW4gYmUgaW5zdGFudGlhdGVkCi0qLworCisvKioKKyAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBjYW4gYmUgaW5zdGFudGlhdGVkCisgKi8KIHB1YmxpYyBib29sZWFuIGNhbkJlSW5zdGFudGlhdGVkKCkgewogCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pKSA9PSAwOwogfQotLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHZpc2libGUgdG8gdGhlIGludm9jYXRpb25QYWNrYWdlLgotKi8KKworLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgaW52b2NhdGlvblBhY2thZ2UuCisgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhbkJlU2VlbkJ5KFBhY2thZ2VCaW5kaW5nIGludm9jYXRpb25QYWNrYWdlKSB7CiAJaWYgKGlzUHVibGljKCkpIHJldHVybiB0cnVlOwogCWlmIChpc1ByaXZhdGUoKSkgcmV0dXJuIGZhbHNlOwpAQCAtMTg3LDkgKzE5MCwxMCBAQAogCS8vIGlzUHJvdGVjdGVkKCkgb3IgaXNEZWZhdWx0KCkKIAlyZXR1cm4gaW52b2NhdGlvblBhY2thZ2UgPT0gdGhpcy5mUGFja2FnZTsKIH0KLS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSByZWNlaXZlclR5cGUgYW5kIHRoZSBpbnZvY2F0aW9uVHlwZS4KLSovCiAKKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHZpc2libGUgdG8gdGhlIHJlY2VpdmVyVHlwZSBhbmQgdGhlIGludm9jYXRpb25UeXBlLgorICovCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgUmVmZXJlbmNlQmluZGluZyBpbnZvY2F0aW9uVHlwZSkgewogCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKIApAQCAtMjA0LDEzICsyMDgsMTMgQEAKIAkJaWYgKGludm9jYXRpb25UeXBlID09IHRoaXMpIHJldHVybiB0cnVlOwogCQlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gdGhpcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CiAKLQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGludm9jYXRpb25UeXBlOwotCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZW5jbG9zaW5nVHlwZSgpOyAvLyBwcm90ZWN0ZWQgdHlwZXMgYWx3YXlzIGhhdmUgYW4gZW5jbG9zaW5nIG9uZQorCQlUeXBlQmluZGluZyBjdXJyZW50VHlwZSA9IGludm9jYXRpb25UeXBlLmVyYXN1cmUoKTsKKwkJVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBlbmNsb3NpbmdUeXBlKCkuZXJhc3VyZSgpOyAvLyBwcm90ZWN0ZWQgdHlwZXMgYWx3YXlzIGhhdmUgYW4gZW5jbG9zaW5nIG9uZQogCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gaW52b2NhdGlvblR5cGUpIHJldHVybiB0cnVlOwogCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBjb3VsZCBiZSBudWxsIGlmIGluY29ycmVjdCB0b3AtbGV2ZWwgcHJvdGVjdGVkIHR5cGUKIAkJLy9pbnQgZGVwdGggPSAwOwogCQlkbyB7Ci0JCQlpZiAoY3VycmVudFR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShkZWNsYXJpbmdDbGFzcykgIT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCQlpZiAoY3VycmVudFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShkZWNsYXJpbmdDbGFzcykgIT0gbnVsbCkgcmV0dXJuIHRydWU7CiAJCQkvL2RlcHRoKys7CiAJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKIAkJfSB3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCk7CkBAIC0yMjIsMTAgKzIyNiwxMCBAQAogCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgcmVjZWl2ZXIgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCiAJCXJlY2VpdmVyQ2hlY2s6IHsKIAkJCWlmICghKHJlY2VpdmVyVHlwZSA9PSB0aGlzIHx8IHJlY2VpdmVyVHlwZSA9PSBlbmNsb3NpbmdUeXBlKCkpKSB7Ci0JCQkJLy8gc3BlY2lhbCB0b2xlcmFuY2UgZm9yIHR5cGUgdmFyaWFibGUgZGlyZWN0IGJvdW5kcworCQkJCS8vIHNwZWNpYWwgdG9sZXJhbmNlIGZvciB0eXBlIHZhcmlhYmxlIGRpcmVjdCBib3VuZHMsIGJ1dCBvbmx5IGlmIGNvbXBsaWFuY2UgPD0gMS42LCBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ2MjIKIAkJCQlpZiAocmVjZWl2ZXJUeXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKIAkJCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGUgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgcmVjZWl2ZXJUeXBlOwotCQkJCQlpZiAodHlwZVZhcmlhYmxlLmlzRXJhc3VyZUJvdW5kVG8odGhpcy5lcmFzdXJlKCkpIHx8IHR5cGVWYXJpYWJsZS5pc0VyYXN1cmVCb3VuZFRvKGVuY2xvc2luZ1R5cGUoKS5lcmFzdXJlKCkpKQorCQkJCQlpZiAodHlwZVZhcmlhYmxlLmVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYgJiYgKHR5cGVWYXJpYWJsZS5pc0VyYXN1cmVCb3VuZFRvKGVyYXN1cmUoKSkgfHwgdHlwZVZhcmlhYmxlLmlzRXJhc3VyZUJvdW5kVG8oZW5jbG9zaW5nVHlwZSgpLmVyYXN1cmUoKSkpKQogCQkJCQkJYnJlYWsgcmVjZWl2ZXJDaGVjazsKIAkJCQl9CiAJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjQwLDcgKzI0NCw3IEBACiAJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOwogCQkJfQogCi0JCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVyRGVjbGFyaW5nQ2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZyl0aGlzLmVyYXN1cmUoKTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKWVyYXN1cmUoKTsKIAkJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKIAkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKIAkJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKQEAgLTI1NSwxNiArMjU5LDIxIEBACiAJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlICE9IHRoaXMuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKIAogCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7Ci0JUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGVuY2xvc2luZ1R5cGUoKSA9PSBudWxsID8gdGhpcyA6IGVuY2xvc2luZ1R5cGUoKTsKKwlUeXBlQmluZGluZyBvcmlnaW5hbERlY2xhcmluZ0NsYXNzID0gKGVuY2xvc2luZ1R5cGUoKSA9PSBudWxsID8gdGhpcyA6IGVuY2xvc2luZ1R5cGUoKSkub3JpZ2luYWwoKTsKIAlkbyB7Ci0JCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50VHlwZSkgcmV0dXJuIHRydWU7CisJCWlmIChjdXJyZW50VHlwZS5pc0NhcHR1cmUoKSkgeyAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTAwMgorCQkJaWYgKG9yaWdpbmFsRGVjbGFyaW5nQ2xhc3MgPT0gY3VycmVudFR5cGUuZXJhc3VyZSgpLm9yaWdpbmFsKCkpIHJldHVybiB0cnVlOworCQl9IGVsc2UgeyAKKwkJCWlmIChvcmlnaW5hbERlY2xhcmluZ0NsYXNzID09IGN1cnJlbnRUeXBlLm9yaWdpbmFsKCkpIHJldHVybiB0cnVlOworCQl9CiAJCVBhY2thZ2VCaW5kaW5nIGN1cnJlbnRQYWNrYWdlID0gY3VycmVudFR5cGUuZlBhY2thZ2U7CiAJCS8vIHBhY2thZ2UgY291bGQgYmUgbnVsbCBmb3Igd2lsZGNhcmRzL2ludGVyc2VjdGlvbiB0eXBlcywgaWdub3JlIGFuZCByZWN1cnNlIGluIHN1cGVyY2xhc3MKIAkJaWYgKGN1cnJlbnRQYWNrYWdlICE9IG51bGwgJiYgY3VycmVudFBhY2thZ2UgIT0gdGhpcy5mUGFja2FnZSkgcmV0dXJuIGZhbHNlOwogCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CiAJcmV0dXJuIGZhbHNlOwogfQotLyoKKworLyoqCiAgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCiAgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhbkJlU2VlbkJ5KFNjb3BlIHNjb3BlKSB7CkBAIC0yODQsMTMgKzI5MywxNCBAQAogCQkvLyAgICBPUiBwcmV2aW91cyBhc3NlcnRpb25zIGFyZSB0cnVlIGZvciBvbmUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCiAJCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSB0aGlzLmZQYWNrYWdlKSByZXR1cm4gdHJ1ZTsKIAotCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW52b2NhdGlvblR5cGU7Ci0JCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBlbmNsb3NpbmdUeXBlKCk7IC8vIHByb3RlY3RlZCB0eXBlcyBhbHdheXMgaGF2ZSBhbiBlbmNsb3Npbmcgb25lCisJCVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZW5jbG9zaW5nVHlwZSgpOyAvLyBwcm90ZWN0ZWQgdHlwZXMgYWx3YXlzIGhhdmUgYW4gZW5jbG9zaW5nIG9uZQogCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBjb3VsZCBiZSBudWxsIGlmIGluY29ycmVjdCB0b3AtbGV2ZWwgcHJvdGVjdGVkIHR5cGUKKwkJZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCk7Ly8gZXJhc3VyZSBjYW5ub3QgYmUgbnVsbAorCQlUeXBlQmluZGluZyBjdXJyZW50VHlwZSA9IGludm9jYXRpb25UeXBlLmVyYXN1cmUoKTsKIAkJLy8gaW50IGRlcHRoID0gMDsKIAkJZG8gewogCQkJaWYgKGRlY2xhcmluZ0NsYXNzID09IGludm9jYXRpb25UeXBlKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpIHJldHVybiB0cnVlOworCQkJaWYgKGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZGVjbGFyaW5nQ2xhc3MpICE9IG51bGwpIHJldHVybiB0cnVlOwogCQkJLy8gZGVwdGgrKzsKIAkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpOwogCQl9IHdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKTsKQEAgLTMwNiw3ICszMTYsNyBAQAogCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOwogCQl9CiAKLQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5lcmFzdXJlKCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKWVyYXN1cmUoKTsKIAkJdGVtcCA9IG91dGVyRGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpOwogCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CiAJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKQEAgLTMxOSwxNCArMzI5LDYgQEAKIAlyZXR1cm4gaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgPT0gdGhpcy5mUGFja2FnZTsKIH0KIAotLyoqCi0gKiBJbiBjYXNlIG9mIHByb2JsZW1zLCByZXR1cm5zIHRoZSBjbG9zZXN0IG1hdGNoIGZvdW5kLiBJdCBtYXkgbm90IGJlIHBlcmZlY3QgbWF0Y2gsIGJ1dCB0aGUKLSAqIHJlc3VsdCBvZiBhIGJlc3QgZWZmb3J0IHRvIGltcHJvdmUgZmF1bHQtdG9sZXJhbmNlLgotKi8KLXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGNsb3Nlc3RNYXRjaCgpIHsKLQlyZXR1cm4gdGhpczsgLy8gYnkgZGVmYXVsdCwgdGhlIGNsb3Nlc3QgbWF0Y2ggaXMgdGhlIGJpbmRpbmcgaXRzZWxmCi19Ci0KIHB1YmxpYyBjaGFyW10gY29tcHV0ZUdlbmVyaWNUeXBlU2lnbmF0dXJlKFR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzKSB7CiAKIAlib29sZWFuIGlzTWVtYmVyT2ZHZW5lcmljID0gaXNNZW1iZXJUeXBlKCkgJiYgKGVuY2xvc2luZ1R5cGUoKS5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDA7CkBAIC0zMzYsMTYgKzMzOCwxMiBAQAogCVN0cmluZ0J1ZmZlciBzaWcgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKIAlpZiAoaXNNZW1iZXJPZkdlbmVyaWMpIHsKIAkgICAgY2hhcltdIHR5cGVTaWcgPSBlbmNsb3NpbmdUeXBlKCkuZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU2lnLmxlbmd0aC0xOyBpKyspIHsgLy8gY29weSBhbGwgYnV0IHRyYWlsaW5nIHNlbWljb2xvbgotCSAgICAJc2lnLmFwcGVuZCh0eXBlU2lnW2ldKTsKLQkgICAgfQorCSAgICBzaWcuYXBwZW5kKHR5cGVTaWcsIDAsIHR5cGVTaWcubGVuZ3RoLTEpOyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCiAJICAgIHNpZy5hcHBlbmQoJy4nKTsgLy8gTk9URTogY2Fubm90IG92ZXJyaWRlIHRyYWlsaW5nICc7JyB3aXRoICcuJyBpbiBlbmNsb3Npbmcgc2lnbmF0dXJlLCBzaW5jZSBzaGFyZWQgY2hhcltdCiAJICAgIHNpZy5hcHBlbmQodGhpcy5zb3VyY2VOYW1lKTsKIAl9CWVsc2UgewogCSAgICBjaGFyW10gdHlwZVNpZyA9IHNpZ25hdHVyZSgpOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTaWcubGVuZ3RoLTE7IGkrKykgeyAvLyBjb3B5IGFsbCBidXQgdHJhaWxpbmcgc2VtaWNvbG9uCi0JICAgIAlzaWcuYXBwZW5kKHR5cGVTaWdbaV0pOwotCSAgICB9CisJICAgIHNpZy5hcHBlbmQodHlwZVNpZywgMCwgdHlwZVNpZy5sZW5ndGgtMSk7IC8vIGNvcHkgYWxsIGJ1dCB0cmFpbGluZyBzZW1pY29sb24KIAl9CiAJaWYgKHR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgewogCSAgICBzaWcuYXBwZW5kKCc7Jyk7CkBAIC0zNjEsODMgKzM1OSwxNTcgQEAKIAlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCByZXN1bHQsIDApOwogCXJldHVybiByZXN1bHQ7CiB9Ci1wdWJsaWMgdm9pZCBjb21wdXRlSWQoKSB7CiAKK3B1YmxpYyB2b2lkIGNvbXB1dGVJZCgpIHsKKwkvLyB0cnkgdG8gYXZvaWQgbXVsdGlwbGUgY2hlY2tzIGFnYWluc3QgYSBwYWNrYWdlL3R5cGUgbmFtZQogCXN3aXRjaCAodGhpcy5jb21wb3VuZE5hbWUubGVuZ3RoKSB7CiAKIAkJY2FzZSAzIDoKIAkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5KQVZBLCB0aGlzLmNvbXBvdW5kTmFtZVswXSkpCiAJCQkJcmV0dXJuOwogCisJCQljaGFyW10gcGFja2FnZU5hbWUgPSB0aGlzLmNvbXBvdW5kTmFtZVsxXTsKKwkJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuOyAvLyBqdXN0IHRvIGJlIHNhZmUKKwkJCWNoYXJbXSB0eXBlTmFtZSA9IHRoaXMuY29tcG91bmROYW1lWzJdOworCQkJaWYgKHR5cGVOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm47IC8vIGp1c3QgdG8gYmUgc2FmZQogCQkJLy8gcmVtYWluaW5nIHR5cGVzIE1VU1QgYmUgaW4gamF2YS4qLioKIAkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5MQU5HLCB0aGlzLmNvbXBvdW5kTmFtZVsxXSkpIHsKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5JTywgdGhpcy5jb21wb3VuZE5hbWVbMV0pKSB7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkpBVkFfSU9fUFJJTlRTVFJFQU1bMl0sIHRoaXMuY29tcG91bmROYW1lWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvUHJpbnRTdHJlYW07Ci0JCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuSkFWQV9JT19TRVJJQUxJWkFCTEVbMl0sIHRoaXMuY29tcG91bmROYW1lWzJdKSkKLQkJCQkJICAgIHRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvU2VyaWFsaXphYmxlOwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkpBVkFfSU9fRVhURVJOQUxJWkFCTEVbMl0sIHRoaXMuY29tcG91bmROYW1lWzJdKSkKLQkJCQkJICAgIHRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvRXh0ZXJuYWxpemFibGU7Ci0JCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuSkFWQV9JT19PQkpFQ1RTVFJFQU1FWENFUFRJT05bMl0sIHRoaXMuY29tcG91bmROYW1lWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkpBVkFfSU9fSU9FWENFUFRJT05bMl0sIHRoaXMuY29tcG91bmROYW1lWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvRXhjZXB0aW9uOwotCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5VVElMLCB0aGlzLmNvbXBvdW5kTmFtZVsxXSkKLQkJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuSkFWQV9VVElMX0lURVJBVE9SWzJdLCB0aGlzLmNvbXBvdW5kTmFtZVsyXSkpIHsKLQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhVXRpbEl0ZXJhdG9yOworCQkJCXN3aXRjaCAocGFja2FnZU5hbWVbMF0pIHsKKwkJCQkJY2FzZSAnaScgOgorCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBUeXBlQ29uc3RhbnRzLklPKSkgeworCQkJCQkJCXN3aXRjaCAodHlwZU5hbWVbMF0pIHsKKwkJCQkJCQkJY2FzZSAnRScgOgorCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfSU9fRVhURVJOQUxJWkFCTEVbMl0pKQorCQkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvRXh0ZXJuYWxpemFibGU7CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCWNhc2UgJ0knIDoKKwkJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0lPX0lPRVhDRVBUSU9OWzJdKSkKKwkJCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFJb0V4Y2VwdGlvbjsKKwkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJY2FzZSAnTycgOgorCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfSU9fT0JKRUNUU1RSRUFNRVhDRVBUSU9OWzJdKSkKKwkJCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFJb09iamVjdFN0cmVhbUV4Y2VwdGlvbjsKKwkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJY2FzZSAnUCcgOgorCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfSU9fUFJJTlRTVFJFQU1bMl0pKQorCQkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUlvUHJpbnRTdHJlYW07CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCWNhc2UgJ1MnIDoKKwkJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0lPX1NFUklBTElaQUJMRVsyXSkpCisJCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhSW9TZXJpYWxpemFibGU7CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuOworCQkJCQljYXNlICd1JyA6CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIFR5cGVDb25zdGFudHMuVVRJTCkpIHsKKwkJCQkJCQlzd2l0Y2ggKHR5cGVOYW1lWzBdKSB7CisJCQkJCQkJCWNhc2UgJ0MnIDoKKwkJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX1VUSUxfQ09MTEVDVElPTlsyXSkpCisJCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhVXRpbENvbGxlY3Rpb247CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCWNhc2UgJ0knIDoKKwkJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX1VUSUxfSVRFUkFUT1JbMl0pKQorCQkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YVV0aWxJdGVyYXRvcjsKKwkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCXJldHVybjsKIAkJCX0KIAogCQkJLy8gcmVtYWluaW5nIHR5cGVzIE1VU1QgYmUgaW4gamF2YS5sYW5nLioKLQkJCWNoYXJbXSB0eXBlTmFtZSA9IHRoaXMuY29tcG91bmROYW1lWzJdOwotCQkJaWYgKHR5cGVOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm47IC8vIGp1c3QgdG8gYmUgc2FmZQogCQkJc3dpdGNoICh0eXBlTmFtZVswXSkgewogCQkJCWNhc2UgJ0EnIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BU1NFUlRJT05FUlJPUlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQXNzZXJ0aW9uRXJyb3I7CisJCQkJCXN3aXRjaCh0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJCWNhc2UgMTMgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQVVUT0NMT1NFQUJMRVsyXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBdXRvQ2xvc2VhYmxlOworCQkJCQkJCXJldHVybjsKKwkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BU1NFUlRJT05FUlJPUlsyXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBc3NlcnRpb25FcnJvcjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ0InIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19CT09MRUFOWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdCb29sZWFuOwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQllURVsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQnl0ZTsKKwkJCQkJc3dpdGNoICh0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJCWNhc2UgNCA6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19CWVRFWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0J5dGU7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJY2FzZSA3IDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0JPT0xFQU5bMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQm9vbGVhbjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ0MnIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19DSEFSQUNURVJbMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0NoYXJhY3RlcjsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdDbGFzczsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT05bMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0JCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19DTE9ORUFCTEVbMl0pKQotCQkJCQkgICAgdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Nsb25lYWJsZTsKKwkJCQkJc3dpdGNoICh0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJCWNhc2UgNSA6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19DTEFTU1syXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdDbGFzczsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDkgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0hBUkFDVEVSWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0NoYXJhY3RlcjsKKwkJCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0xPTkVBQkxFWzJdKSkKKwkJCQkJCQkgICAgdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Nsb25lYWJsZTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDIyIDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT05bMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ0QnIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19ET1VCTEVbMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0RvdWJsZTsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0RFUFJFQ0FURURbMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0RlcHJlY2F0ZWQ7CisJCQkJCXN3aXRjaCAodHlwZU5hbWUubGVuZ3RoKSB7CisJCQkJCQljYXNlIDYgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRE9VQkxFWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0RvdWJsZTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDEwIDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0RFUFJFQ0FURURbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nRGVwcmVjYXRlZDsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ0UnIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FUlJPUlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nRXJyb3I7Ci0JCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FWENFUFRJT05bMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0V4Y2VwdGlvbjsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0VOVU1bMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0VudW07CisJCQkJCXN3aXRjaCAodHlwZU5hbWUubGVuZ3RoKSB7CisJCQkJCQljYXNlIDQgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRU5VTVsyXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdFbnVtOworCQkJCQkJCXJldHVybjsKKwkJCQkJCWNhc2UgNSA6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FUlJPUlsyXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdFcnJvcjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDkgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRVhDRVBUSU9OWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0V4Y2VwdGlvbjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ0YnIDoKIAkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19GTE9BVFsyXSkpCiAJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nRmxvYXQ7CiAJCQkJCXJldHVybjsKIAkJCQljYXNlICdJJyA6Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSU5URUdFUlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nSW50ZWdlcjsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lURVJBQkxFWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdJdGVyYWJsZTsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lMTEVHQUxBUkdVTUVOVEVYQ0VQVElPTlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworCQkJCQlzd2l0Y2ggKHR5cGVOYW1lLmxlbmd0aCkgeworCQkJCQkJY2FzZSA3IDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVEVHRVJbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nSW50ZWdlcjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDggOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSVRFUkFCTEVbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nSXRlcmFibGU7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJY2FzZSAyNCA6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19JTExFR0FMQVJHVU1FTlRFWENFUFRJT05bMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworCQkJCQkJCXJldHVybjsKKwkJCQkJfQogCQkJCQlyZXR1cm47CiAJCQkJY2FzZSAnTCcgOgogCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0xPTkdbMl0pKQpAQCAtNDQ4LDI4ICs1MjAsNTAgQEAKIAkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdOb0NsYXNzRGVmRXJyb3I7CiAJCQkJCXJldHVybjsKIAkJCQljYXNlICdPJyA6Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUWzJdKSkKLQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3Q7Ci0JCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PVkVSUklERVsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nT3ZlcnJpZGU7CisJCQkJCXN3aXRjaCAodHlwZU5hbWUubGVuZ3RoKSB7CisJCQkJCQljYXNlIDYgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdDsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDggOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT1ZFUlJJREVbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nT3ZlcnJpZGU7CisJCQkJCQkJcmV0dXJuOworCQkJCQl9CiAJCQkJCXJldHVybjsKIAkJCQljYXNlICdSJyA6CiAJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTlsyXSkpCiAJCQkJCQl0aGlzLmlkID0gCVR5cGVJZHMuVF9KYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb247CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgJ1MnIDoKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TVFJJTkdbMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZzsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NUUklOR0JVRkZFUlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nQnVmZmVyOwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1RSSU5HQlVJTERFUlsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nQnVpbGRlcjsKLQkJCQkJZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NZU1RFTVsyXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3lzdGVtOwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU0hPUlRbMl0pKQotCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1Nob3J0OwotCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1VQUFJFU1NXQVJOSU5HU1syXSkpCi0JCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3VwcHJlc3NXYXJuaW5nczsKKwkJCQkJc3dpdGNoICh0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJCWNhc2UgNSA6CisJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TSE9SVFsyXSkpCisJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdTaG9ydDsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDYgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1RSSU5HWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZzsKKwkJCQkJCQllbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1lTVEVNWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1N5c3RlbTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDExIDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NBRkVWQVJBUkdTWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1NhZmVWYXJhcmdzOworCQkJCQkJCXJldHVybjsKKwkJCQkJCWNhc2UgMTIgOgorCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1RSSU5HQlVGRkVSWzJdKSkKKwkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZ0J1ZmZlcjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDEzIDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NUUklOR0JVSUxERVJbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nQnVpbGRlcjsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQljYXNlIDE2IDoKKwkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1NbMl0pKQorCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nU3VwcHJlc3NXYXJuaW5nczsKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgJ1QnIDoKIAkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19USFJPV0FCTEVbMl0pKQpAQCAtNDg1LDcyICs1NzksMTM2IEBACiAJCWNhc2UgNDoKIAkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5KQVZBLCB0aGlzLmNvbXBvdW5kTmFtZVswXSkpCiAJCQkJcmV0dXJuOwotCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkxBTkcsIHRoaXMuY29tcG91bmROYW1lWzFdKSkKLQkJCQlyZXR1cm47Ci0JCQljaGFyW10gcGFja2FnZU5hbWUgPSB0aGlzLmNvbXBvdW5kTmFtZVsyXTsKKwkJCXBhY2thZ2VOYW1lID0gdGhpcy5jb21wb3VuZE5hbWVbMV07CisJCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHJldHVybjsgLy8ganVzdCB0byBiZSBzYWZlCisKKwkJCXBhY2thZ2VOYW1lID0gdGhpcy5jb21wb3VuZE5hbWVbMl07CiAJCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHJldHVybjsgLy8ganVzdCB0byBiZSBzYWZlCiAJCQl0eXBlTmFtZSA9IHRoaXMuY29tcG91bmROYW1lWzNdOwogCQkJaWYgKHR5cGVOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm47IC8vIGp1c3QgdG8gYmUgc2FmZQotCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBUeXBlQ29uc3RhbnRzLlJFRkxFQ1QpKSB7Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SWzNdKSkgewotCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yOwotCQkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JFRkxFQ1RfRklFTERbM10pKSB7Ci0JCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdSZWZsZWN0RmllbGQ7Ci0JCQkJfSBlbHNlIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfUkVGTEVDVF9NRVRIT0RbM10pKSB7Ci0JCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdSZWZsZWN0TWV0aG9kOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBUeXBlQ29uc3RhbnRzLkFOTk9UQVRJT04pKSB7Ci0JCQkJc3dpdGNoICh0eXBlTmFtZVswXSkgewotCQkJCQljYXNlICdBJyA6Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTlszXSkpCi0JCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Fubm90YXRpb25Bbm5vdGF0aW9uOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlICdEJyA6Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fRE9DVU1FTlRFRFszXSkpCi0JCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Fubm90YXRpb25Eb2N1bWVudGVkOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlICdFJyA6Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fRUxFTUVOVFRZUEVbM10pKQotCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uRWxlbWVudFR5cGU7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgJ0knIDoKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9JTkhFUklURURbM10pKQotCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uSW5oZXJpdGVkOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlICdSJyA6Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OWzNdKSkKLQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQW5ub3RhdGlvblJldGVudGlvbjsKLQkJCQkJCWVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTlBPTElDWVszXSkpCi0JCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Fubm90YXRpb25SZXRlbnRpb25Qb2xpY3k7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgJ1QnIDoKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVRbM10pKQotCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uVGFyZ2V0OwotCQkJCQkJcmV0dXJuOwotCQkJCX0KKwkJCXN3aXRjaCAocGFja2FnZU5hbWVbMF0pIHsKKwkJCQljYXNlICdhJyA6CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwYWNrYWdlTmFtZSwgVHlwZUNvbnN0YW50cy5BTk5PVEFUSU9OKSkgeworCQkJCQkJc3dpdGNoICh0eXBlTmFtZVswXSkgeworCQkJCQkJCWNhc2UgJ0EnIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX0FOTk9UQVRJT05bM10pKQorCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Fubm90YXRpb25Bbm5vdGF0aW9uOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSAnRCcgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fRE9DVU1FTlRFRFszXSkpCisJCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQW5ub3RhdGlvbkRvY3VtZW50ZWQ7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQljYXNlICdFJyA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9FTEVNRU5UVFlQRVszXSkpCisJCQkJCQkJCQl0aGlzLmlkID0gVHlwZUlkcy5UX0phdmFMYW5nQW5ub3RhdGlvbkVsZW1lbnRUeXBlOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSAnSScgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fSU5IRVJJVEVEWzNdKSkKKwkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uSW5oZXJpdGVkOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSAnUicgOgorCQkJCQkJCQlzd2l0Y2ggKHR5cGVOYW1lLmxlbmd0aCkgeworCQkJCQkJCQkJY2FzZSA5IDoKKwkJCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OWzNdKSkKKwkJCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0Fubm90YXRpb25SZXRlbnRpb247CisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJY2FzZSAxNSA6CisJCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTlBPTElDWVszXSkpCisJCQkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uUmV0ZW50aW9uUG9saWN5OworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSAnVCcgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fVEFSR0VUWzNdKSkKKwkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdBbm5vdGF0aW9uVGFyZ2V0OworCQkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCWNhc2UgJ2knOgorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIFR5cGVDb25zdGFudHMuSU5WT0tFKSkgeworCQkJCQkJaWYgKHR5cGVOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm47IC8vIGp1c3QgdG8gYmUgc2FmZQorCQkJCQkJc3dpdGNoICh0eXBlTmFtZVswXSkgeworCQkJCQkJCWNhc2UgJ00nIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19JTlZPS0VfTUVUSE9ESEFORExFXyRfUE9MWU1PUlBISUNTSUdOQVRVUkVbM10pKQorCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0ludm9rZU1ldGhvZEhhbmRsZVBvbHltb3JwaGljU2lnbmF0dXJlOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCWNhc2UgJ3InIDoKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBUeXBlQ29uc3RhbnRzLlJFRkxFQ1QpKSB7CisJCQkJCQlzd2l0Y2ggKHR5cGVOYW1lWzBdKSB7CisJCQkJCQkJY2FzZSAnQycgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZU5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JFRkxFQ1RfQ09OU1RSVUNUT1JbMl0pKQorCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvcjsKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCWNhc2UgJ0YnIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19SRUZMRUNUX0ZJRUxEWzJdKSkKKwkJCQkJCQkJCXRoaXMuaWQgPSBUeXBlSWRzLlRfSmF2YUxhbmdSZWZsZWN0RmllbGQ7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQljYXNlICdNJyA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfUkVGTEVDVF9NRVRIT0RbMl0pKQorCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ1JlZmxlY3RNZXRob2Q7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm47CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSA1IDoKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5KQVZBLCB0aGlzLmNvbXBvdW5kTmFtZVswXSkpCisJCQkJcmV0dXJuOworCQkJcGFja2FnZU5hbWUgPSB0aGlzLmNvbXBvdW5kTmFtZVsxXTsKKwkJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuOyAvLyBqdXN0IHRvIGJlIHNhZmUKKworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuTEFORywgcGFja2FnZU5hbWUpKSB7CisJCQkJcGFja2FnZU5hbWUgPSB0aGlzLmNvbXBvdW5kTmFtZVsyXTsKKwkJCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHJldHVybjsgLy8ganVzdCB0byBiZSBzYWZlCisJCQkJc3dpdGNoIChwYWNrYWdlTmFtZVswXSkgeworCQkJCQljYXNlICdpJyA6CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIFR5cGVDb25zdGFudHMuSU5WT0tFKSkgeyAKKwkJCQkJCQl0eXBlTmFtZSA9IHRoaXMuY29tcG91bmROYW1lWzNdOworCQkJCQkJCWlmICh0eXBlTmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuOyAvLyBqdXN0IHRvIGJlIHNhZmUKKwkJCQkJCQlzd2l0Y2ggKHR5cGVOYW1lWzBdKSB7CisJCQkJCQkJCWNhc2UgJ00nIDoKKwkJCQkJCQkJCWNoYXJbXSBtZW1iZXJUeXBlTmFtZSA9IHRoaXMuY29tcG91bmROYW1lWzRdOworCQkJCQkJCQkJaWYgKG1lbWJlclR5cGVOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm47IC8vIGp1c3QgdG8gYmUgc2FmZQorCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVOYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19JTlZPS0VfTUVUSE9ESEFORExFX1BPTFlNT1JQSElDU0lHTkFUVVJFWzNdKQorCQkJCQkJCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZW1iZXJUeXBlTmFtZSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSU5WT0tFX01FVEhPREhBTkRMRV9QT0xZTU9SUEhJQ1NJR05BVFVSRVs0XSkpCisJCQkJCQkJCQkJdGhpcy5pZCA9IFR5cGVJZHMuVF9KYXZhTGFuZ0ludm9rZU1ldGhvZEhhbmRsZVBvbHltb3JwaGljU2lnbmF0dXJlOworCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQogCX0KIH0KLS8qCisKKy8qKgogICogcC5YPFQgZXh0ZW5kcyBZICYgSSwgVSBleHRlbmRzIFk+IHt9IC0+IExwL1g8VFQ7VFU7PjsKICAqLwogcHVibGljIGNoYXJbXSBjb21wdXRlVW5pcXVlS2V5KGJvb2xlYW4gaXNMZWFmKSB7CiAJaWYgKCFpc0xlYWYpIHJldHVybiBzaWduYXR1cmUoKTsKIAlyZXR1cm4gZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKIH0KLS8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjb25zdGFudCBwb29sIG5hbWUuCi0qCi0qIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgotKi8KKworLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgorICoKKyAqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorICovCiBwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKIAlpZiAodGhpcy5jb25zdGFudFBvb2xOYW1lICE9IG51bGwpIHJldHVybiB0aGlzLmNvbnN0YW50UG9vbE5hbWU7CiAJcmV0dXJuIHRoaXMuY29uc3RhbnRQb29sTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmNvbXBvdW5kTmFtZSwgJy8nKTsKIH0KKwogcHVibGljIFN0cmluZyBkZWJ1Z05hbWUoKSB7CiAJcmV0dXJuICh0aGlzLmNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcocmVhZGFibGVOYW1lKCkpIDogIlVOTkFNRUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQKIH0KKwogcHVibGljIGZpbmFsIGludCBkZXB0aCgpIHsKIAlpbnQgZGVwdGggPSAwOwogCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudCA9IHRoaXM7CkBAIC01NTgsNiArNzE2LDcgQEAKIAkJZGVwdGgrKzsKIAlyZXR1cm4gZGVwdGg7CiB9CisKIHB1YmxpYyBib29sZWFuIGRldGVjdEFubm90YXRpb25DeWNsZSgpIHsKIAlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuRW5kQW5ub3RhdGlvbkNoZWNrKSAhPSAwKSByZXR1cm4gZmFsc2U7IC8vIGFscmVhZHkgY2hlY2tlZAogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5CZWdpbkFubm90YXRpb25DaGVjaykgIT0gMCkgcmV0dXJuIHRydWU7IC8vIGluIHRoZSBtaWRkbGUgb2YgY2hlY2tpbmcgaXRzIG1ldGhvZHMKQEAgLTU2Niw3ICs3MjUsNyBAQAogCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50TWV0aG9kcyA9IG1ldGhvZHMoKTsKIAlib29sZWFuIGluQ3ljbGUgPSBmYWxzZTsgLy8gY2hlY2sgZWFjaCBtZXRob2QgYmVmb3JlIGZhaWxpbmcKIAlmb3IgKGludCBpID0gMCwgbCA9IGN1cnJlbnRNZXRob2RzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gY3VycmVudE1ldGhvZHNbaV0ucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gY3VycmVudE1ldGhvZHNbaV0ucmV0dXJuVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmVyYXN1cmUoKTsKIAkJaWYgKHRoaXMgPT0gcmV0dXJuVHlwZSkgewogCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykgewogCQkJCU1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGN1cnJlbnRNZXRob2RzW2ldLnNvdXJjZU1ldGhvZCgpOwpAQCAtNjEzLDIxICs3NzIsMzMgQEAKIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QWNjZXNzRmxhZ3MoKSB7CiAJcmV0dXJuIHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKIH0KKwogLyoqCiAgKiBAcmV0dXJuIHRoZSBKU1IgMTc1IGFubm90YXRpb25zIGZvciB0aGlzIHR5cGUuCiAgKi8KIHB1YmxpYyBBbm5vdGF0aW9uQmluZGluZ1tdIGdldEFubm90YXRpb25zKCkgewogCXJldHVybiByZXRyaWV2ZUFubm90YXRpb25zKHRoaXMpOwogfQorCiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nI2dldEFubm90YXRpb25UYWdCaXRzKCkKICAqLwogcHVibGljIGxvbmcgZ2V0QW5ub3RhdGlvblRhZ0JpdHMoKSB7CiAJcmV0dXJuIHRoaXMudGFnQml0czsKIH0KKworLyoqCisgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmdJbnN0YW5jZXNTbG90U2l6ZQorICovCitwdWJsaWMgaW50IGdldEVuY2xvc2luZ0luc3RhbmNlc1Nsb3RTaXplKCkgeworCWlmIChpc1N0YXRpYygpKSByZXR1cm4gMDsKKwlyZXR1cm4gZW5jbG9zaW5nVHlwZSgpID09IG51bGwgPyAwIDogMTsKK30KKwogcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0RXhhY3RDb25zdHJ1Y3RvcihUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKIAlyZXR1cm4gbnVsbDsKIH0KKwogcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0RXhhY3RNZXRob2QoY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIENvbXBpbGF0aW9uVW5pdFNjb3BlIHJlZlNjb3BlKSB7CiAJcmV0dXJuIG51bGw7CiB9CkBAIC02NDAsNiArODExLDcgQEAKIHB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CiAJcmV0dXJuIHRoaXMuZmlsZU5hbWU7CiB9CisKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lKSB7CiAJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gbWVtYmVyVHlwZXMoKTsKIAlmb3IgKGludCBpID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCkBAIC02NTIsNiArODI0LDE5IEBACiAJcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsKIH0KIAorLy8gQW5zd2VyIG1ldGhvZHMgbmFtZWQgc2VsZWN0b3IsIHdoaWNoIHRha2Ugbm8gbW9yZSB0aGFuIHRoZSBzdWdnZXN0ZWRQYXJhbWV0ZXJMZW5ndGguCisvLyBUaGUgc3VnZ2VzdGVkIHBhcmFtZXRlciBsZW5ndGggaXMgb3B0aW9uYWwgYW5kIG1heSBub3QgYmUgZ3VhcmFudGVlZCBieSBldmVyeSB0eXBlLgorcHVibGljIE1ldGhvZEJpbmRpbmdbXSBnZXRNZXRob2RzKGNoYXJbXSBzZWxlY3RvciwgaW50IHN1Z2dlc3RlZFBhcmFtZXRlckxlbmd0aCkgeworCXJldHVybiBnZXRNZXRob2RzKHNlbGVjdG9yKTsKK30KKworLyoqCisgKiBAcmV0dXJuIHRoZSBvdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUKKyAqLworcHVibGljIGludCBnZXRPdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemUoKSB7CisJcmV0dXJuIDA7Cit9CisKIHB1YmxpYyBQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlKCkgewogCXJldHVybiB0aGlzLmZQYWNrYWdlOwogfQpAQCAtNjg1LDggKzg3MCw4IEBACiAgICAgUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHRoaXM7CiAJVHlwZUJpbmRpbmcgbWF0Y2g7CiAJZG8gewotCQltYXRjaCA9IG90aGVyVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGN1cnJlbnRUeXBlKTsKLQkJaWYgKG1hdGNoICE9IG51bGwgJiYgIW1hdGNoLmlzSW50ZXJzZWN0aW5nV2l0aChjdXJyZW50VHlwZSkpCisJCW1hdGNoID0gb3RoZXJUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oY3VycmVudFR5cGUpOworCQlpZiAobWF0Y2ggIT0gbnVsbCAmJiBtYXRjaC5pc1Byb3ZhYmx5RGlzdGluY3QoY3VycmVudFR5cGUpKQogCQkJcmV0dXJuIHRydWU7CiAKIAkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKQEAgLTcxMSw4ICs4OTYsOCBAQAogCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dFBvc2l0aW9uOyBpKyspIHsKIAkJY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKIAkJaWYgKGN1cnJlbnRUeXBlID09IG90aGVyVHlwZSkgcmV0dXJuIGZhbHNlOwotCQltYXRjaCA9IG90aGVyVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKGN1cnJlbnRUeXBlKTsKLQkJaWYgKG1hdGNoICE9IG51bGwgJiYgIW1hdGNoLmlzSW50ZXJzZWN0aW5nV2l0aChjdXJyZW50VHlwZSkpCisJCW1hdGNoID0gb3RoZXJUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oY3VycmVudFR5cGUpOworCQlpZiAobWF0Y2ggIT0gbnVsbCAmJiBtYXRjaC5pc1Byb3ZhYmx5RGlzdGluY3QoY3VycmVudFR5cGUpKQogCQkJcmV0dXJuIHRydWU7CiAKIAkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKQEAgLTczMCw5ICs5MTUsMTEgQEAKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorCiBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJUeXBlcygpIHsKICAgICByZXR1cm4gZmFsc2U7CiB9CisKIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSB7CiAJcmV0dXJuICh0aGlzLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjUmVzdHJpY3RlZEFjY2VzcykgIT0gMDsKIH0KQEAgLTg0Myw3ICsxMDMwLDcgQEAKIAkJdGhpcy5jb21wYXRpYmxlQ2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7CiAJCXJlc3VsdCA9IG51bGw7CiAJfSBlbHNlIHsKLQkJcmVzdWx0ID0gdGhpcy5jb21wYXRpYmxlQ2FjaGUuZ2V0KG90aGVyVHlwZSk7CisJCXJlc3VsdCA9IHRoaXMuY29tcGF0aWJsZUNhY2hlLmdldChvdGhlclR5cGUpOyAvLyBbZGJnIHJlc2V0XSB0aGlzLmNvbXBhdGlibGVDYWNoZS5wdXQob3RoZXJUeXBlLG51bGwpCiAJCWlmIChyZXN1bHQgIT0gbnVsbCkgewogCQkJcmV0dXJuIHJlc3VsdCA9PSBCb29sZWFuLlRSVUU7CiAJCX0KQEAgLTg2NiwxMCArMTA1MywxMSBAQAogCQlyZXR1cm4gdHJ1ZTsKIAkvLyBlcXVpdmFsZW5jZSBtYXkgYWxsb3cgY29tcGF0aWJpbGl0eSB3aXRoIGFycmF5IHR5cGUgdGhyb3VnaCB3aWxkY2FyZAogCS8vIGJvdW5kCi0JaWYgKHRoaXMuaXNFcXVpdmFsZW50VG8ob3RoZXJUeXBlKSkKKwlpZiAoaXNFcXVpdmFsZW50VG8ob3RoZXJUeXBlKSkKIAkJcmV0dXJuIHRydWU7CiAJc3dpdGNoIChvdGhlclR5cGUua2luZCgpKSB7CiAJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQkJcmV0dXJuIGZhbHNlOyAvLyBzaG91bGQgaGF2ZSBwYXNzZWQgZXF1aXZhbGVuY2UgY2hlY2sgYWJvdmUgaWYKIAkJCQkJCQkvLyB3aWxkY2FyZAogCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgpAQCAtODc5LDI1ICsxMDY3LDI2IEBACiAJCQkJVHlwZUJpbmRpbmcgb3RoZXJMb3dlckJvdW5kOwogCQkJCWlmICgob3RoZXJMb3dlckJvdW5kID0gb3RoZXJDYXB0dXJlLmxvd2VyQm91bmQpICE9IG51bGwpIHsKIAkJCQkJaWYgKG90aGVyTG93ZXJCb3VuZC5pc0FycmF5VHlwZSgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCXJldHVybiB0aGlzLmlzQ29tcGF0aWJsZVdpdGgob3RoZXJMb3dlckJvdW5kKTsKKwkJCQkJcmV0dXJuIGlzQ29tcGF0aWJsZVdpdGgob3RoZXJMb3dlckJvdW5kKTsKIAkJCQl9CiAJCQl9CisJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCWNhc2UgQmluZGluZy5HRU5FUklDX1RZUEUgOgogCQljYXNlIEJpbmRpbmcuVFlQRSA6CiAJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgogCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgotCQkJc3dpdGNoICh0aGlzLmtpbmQoKSkgeworCQkJc3dpdGNoIChraW5kKCkpIHsKIAkJCQljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFIDoKIAkJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKIAkJCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgotCQkJCQlpZiAodGhpcy5lcmFzdXJlKCkgPT0gb3RoZXJUeXBlLmVyYXN1cmUoKSkKKwkJCQkJaWYgKGVyYXN1cmUoKSA9PSBvdGhlclR5cGUuZXJhc3VyZSgpKQogCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBzaG91bGQgaGF2ZSBwYXNzZWQgZXF1aXZhbGVuY2UgY2hlY2sKIAkJCQkJCQkJCQkvLyBhYm92ZSBpZiBzYW1lIGVyYXN1cmUKIAkJCX0KIAkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWZlcmVuY2VUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIG90aGVyVHlwZTsKIAkJCWlmIChvdGhlclJlZmVyZW5jZVR5cGUuaXNJbnRlcmZhY2UoKSkgLy8gY291bGQgYmUgYW5ub3RhdGlvbiB0eXBlCiAJCQkJcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJSZWZlcmVuY2VUeXBlLCB0cnVlKTsKLQkJCWlmICh0aGlzLmlzSW50ZXJmYWNlKCkpICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIGZyb20gYW4gaW50ZXJmYWNlCisJCQlpZiAoaXNJbnRlcmZhY2UoKSkgIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gZnJvbSBhbiBpbnRlcmZhY2UKIAkJCQkJCQkJCQkvLyB0byBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJcmV0dXJuIG90aGVyUmVmZXJlbmNlVHlwZS5pc1N1cGVyY2xhc3NPZih0aGlzKTsKQEAgLTkzNyw2ICsxMTI2LDIwIEBACiBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoeUJlaW5nQ29ubmVjdGVkKCkgewogCXJldHVybiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5FbmRIaWVyYXJjaHlDaGVjaykgPT0gMCAmJiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5CZWdpbkhpZXJhcmNoeUNoZWNrKSAhPSAwOwogfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaGllcmFyY2h5IGlzIGJlaW5nIGNvbm5lY3RlZCAiYWN0aXZlbHkiIGkuZSBub3QgcGF1c2VkIG1vbWVudGF0cmlseSwgCisgKiB3aGlsZSByZXNvbHZpbmcgdHlwZSBhcmd1bWVudHMuIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0MDU3CisgKi8KK3B1YmxpYyBib29sZWFuIGlzSGllcmFyY2h5QmVpbmdBY3RpdmVseUNvbm5lY3RlZCgpIHsKKwlyZXR1cm4gKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuRW5kSGllcmFyY2h5Q2hlY2spID09IDAgJiYgKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQmVnaW5IaWVyYXJjaHlDaGVjaykgIT0gMCAmJiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5QYXVzZUhpZXJhcmNoeUNoZWNrKSA9PSAwOworfQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBoaWVyYXJjaHkgaXMgY29ubmVjdGVkCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSGllcmFyY2h5Q29ubmVjdGVkKCkgeworCXJldHVybiB0cnVlOworfQogCiBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKIAkvLyBjb25zaWRlciBzdHJpY3QgaW50ZXJmYWNlcyBhbmQgYW5ub3RhdGlvbiB0eXBlcwpAQCAtOTUxLDYgKzExNTQsMjAgQEAKIH0KIAogLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgb3IgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMgaGF2ZSBwcml2YXRlIHZpc2liaWxpdHkKKyAqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPckVuY2xvc2VkQnlQcml2YXRlVHlwZSgpIHsKKwlpZiAoaXNMb2NhbFR5cGUoKSkgcmV0dXJuIHRydWU7IC8vIGNhdGNoIGFsbCBsb2NhbCB0eXBlcworCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHRoaXM7CisJd2hpbGUgKHR5cGUgIT0gbnVsbCkgeworCQlpZiAoKHR5cGUubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpICE9IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdHlwZSA9IHR5cGUuZW5jbG9zaW5nVHlwZSgpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgogICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcm90ZWN0ZWQgdmlzaWJpbGl0eQogICovCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKQEAgLTk3MCw2ICsxMTg3LDcgQEAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGljKCkgewogCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NJbnRlcmZhY2UpKSAhPSAwIHx8ICh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLklzTmVzdGVkVHlwZSkgPT0gMDsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdHJ1ZSBpZiBhbGwgZmxvYXQgb3BlcmF0aW9ucyBtdXN0IGFkaGVyIHRvIElFRUUgNzU0IGZsb2F0L2RvdWJsZSBydWxlcwogICovCkBAIC05ODcsNiArMTIwNSw3IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KKwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjaXNUaHJvd2FibGUoKQogICovCkBAIC0xMDAzLDYgKzEyMjIsNyBAQAogCX0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBmYWxzZTsKIH0KKwogLyoqCiAgKiBKTFMgMTEuNSBlbnN1cmVzIHRoYXQgVGhyb3dhYmxlLCBFeGNlcHRpb24sIFJ1bnRpbWVFeGNlcHRpb24gYW5kIEVycm9yIGFyZSBkaXJlY3RseSBjb25uZWN0ZWQuCiAgKiAoVGhyb3dhYmxlPC0gRXhjZXB0aW9uIDwtIFJ1bXRpbWVFeGNlcHRpb24sIFRocm93YWJsZSA8LSBFcnJvcikuIFRodXMgbm8gbmVlZCB0byBjaGVjayAjaXNDb21wYXRpYmxlV2l0aApAQCAtMTAzMyw2ICsxMjUzLDcgQEAKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorCiAvKioKICAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJpdmF0ZSB2aXNpYmlsaXR5IGFuZCBpcyB1c2VkIGxvY2FsbHkKICAqLwpAQCAtMTA0MCwxOCArMTI2MSwyMiBAQAogCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkKSAhPSAwOwogfQogCi0vKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZGVwcmVjYXRlZCAob3IgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMpCi0qLworLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZGVwcmVjYXRlZCAob3IgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMpCisgKi8KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVmlld2VkQXNEZXByZWNhdGVkKCkgewogCXJldHVybiAodGhpcy5tb2RpZmllcnMgJiAoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5KSkgIT0gMAotCQkJfHwgKHRoaXMuZ2V0UGFja2FnZSgpLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25EZXByZWNhdGVkKSAhPSAwOworCQkJfHwgZ2V0UGFja2FnZSgpLmlzVmlld2VkQXNEZXByZWNhdGVkKCk7CiB9CisKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMoKSB7CiAJcmV0dXJuIEJpbmRpbmcuTk9fTUVNQkVSX1RZUEVTOwogfQorCiBwdWJsaWMgTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMoKSB7CiAJcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsKIH0KKwogcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJtb3N0RW5jbG9zaW5nVHlwZSgpIHsKIAlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnQgPSB0aGlzOwogCXdoaWxlICh0cnVlKSB7CkBAIC0xMDYwLDIzICsxMjg1LDIzIEBACiAJCQlyZXR1cm4gbGFzdDsKIAl9CiB9Ci0vKioKLSogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBmb3IgdGhlIHR5cGUuCi0qIEluIHRoZSBjYXNlIG9mIG1lbWJlciB0eXBlcywgYXMgdGhlIHF1YWxpZmllZCBuYW1lIGZyb20gaXRzIHRvcCBsZXZlbCB0eXBlLgotKiBGb3IgZXhhbXBsZSwgZm9yIGEgbWVtYmVyIHR5cGUgTiBkZWZpbmVkIGluc2lkZSBNICYgQTogIkEuTS5OIi4KLSovCiAKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBmb3IgdGhlIHR5cGUuCisgKiBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgdHlwZXMsIGFzIHRoZSBxdWFsaWZpZWQgbmFtZSBmcm9tIGl0cyB0b3AgbGV2ZWwgdHlwZS4KKyAqIEZvciBleGFtcGxlLCBmb3IgYSBtZW1iZXIgdHlwZSBOIGRlZmluZWQgaW5zaWRlIE0gJiBBOiAiQS5NLk4iLgorICovCiBwdWJsaWMgY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUoKSB7CiAJaWYgKGlzTWVtYmVyVHlwZSgpKQogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoZW5jbG9zaW5nVHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgc291cmNlTmFtZSgpLCAnLicpOwogCXJldHVybiBzb3VyY2VOYW1lKCk7CiB9CiAKLS8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUuCi0qCi0qIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgotKi8KLQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3Mgc2lnbmF0dXJlLgorICoKKyAqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorICovCiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIC8qamF2YS5sYW5nLk9iamVjdCwgIHAuWDxUPiAqLyB7CiAgICAgY2hhcltdIHJlYWRhYmxlTmFtZTsKIAlpZiAoaXNNZW1iZXJUeXBlKCkpIHsKQEAgLTEwODUsNyArMTMxMCw3IEBACiAJCXJlYWRhYmxlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmNvbXBvdW5kTmFtZSwgJy4nKTsKIAl9CiAJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJzOwotCWlmICgodHlwZVZhcnMgPSB0aGlzLnR5cGVWYXJpYWJsZXMoKSkgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCWlmICgodHlwZVZhcnMgPSB0eXBlVmFyaWFibGVzKCkpICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKIAkgICAgU3RyaW5nQnVmZmVyIG5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKIAkgICAgbmFtZUJ1ZmZlci5hcHBlbmQocmVhZGFibGVOYW1lKS5hcHBlbmQoJzwnKTsKIAkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVWYXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0xMTAxLDE2ICsxMzI2LDE5IEBACiB9CiAKIHB1YmxpYyBBbm5vdGF0aW9uSG9sZGVyIHJldHJpZXZlQW5ub3RhdGlvbkhvbGRlcihCaW5kaW5nIGJpbmRpbmcsIGJvb2xlYW4gZm9yY2VJbml0aWFsaXphdGlvbikgewotCVNpbXBsZUxvb2t1cFRhYmxlIHN0b3JlID0gc3RvcmVkQW5ub3RhdGlvbnMoZmFsc2UpOworCVNpbXBsZUxvb2t1cFRhYmxlIHN0b3JlID0gc3RvcmVkQW5ub3RhdGlvbnMoZm9yY2VJbml0aWFsaXphdGlvbik7CiAJcmV0dXJuIHN0b3JlID09IG51bGwgPyBudWxsIDogKEFubm90YXRpb25Ib2xkZXIpIHN0b3JlLmdldChiaW5kaW5nKTsKIH0KKwogQW5ub3RhdGlvbkJpbmRpbmdbXSByZXRyaWV2ZUFubm90YXRpb25zKEJpbmRpbmcgYmluZGluZykgewogCUFubm90YXRpb25Ib2xkZXIgaG9sZGVyID0gcmV0cmlldmVBbm5vdGF0aW9uSG9sZGVyKGJpbmRpbmcsIHRydWUpOwogCXJldHVybiBob2xkZXIgPT0gbnVsbCA/IEJpbmRpbmcuTk9fQU5OT1RBVElPTlMgOiBob2xkZXIuZ2V0QW5ub3RhdGlvbnMoKTsKIH0KKwogcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbnMoQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9ucykgewogCXN0b3JlQW5ub3RhdGlvbnModGhpcywgYW5ub3RhdGlvbnMpOwogfQorCiBwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCkgLypPYmplY3QqLyB7CiAJY2hhcltdIHNob3J0UmVhZGFibGVOYW1lOwogCWlmIChpc01lbWJlclR5cGUoKSkgewpAQCAtMTExOSw3ICsxMzQ3LDcgQEAKIAkJc2hvcnRSZWFkYWJsZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7CiAJfQogCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyczsKLQlpZiAoKHR5cGVWYXJzID0gdGhpcy50eXBlVmFyaWFibGVzKCkpICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwlpZiAoKHR5cGVWYXJzID0gdHlwZVZhcmlhYmxlcygpKSAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CiAJICAgIFN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CiAJICAgIG5hbWVCdWZmZXIuYXBwZW5kKHNob3J0UmVhZGFibGVOYW1lKS5hcHBlbmQoJzwnKTsKIAkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVWYXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0xMTMzLDE1ICsxMzYxLDE4IEBACiAJfQogCXJldHVybiBzaG9ydFJlYWRhYmxlTmFtZTsKIH0KKwogcHVibGljIGNoYXJbXSBzaWduYXR1cmUoKSAvKiBMamF2YS9sYW5nL09iamVjdDsgKi8gewogCWlmICh0aGlzLnNpZ25hdHVyZSAhPSBudWxsKQogCQlyZXR1cm4gdGhpcy5zaWduYXR1cmU7CiAKIAlyZXR1cm4gdGhpcy5zaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgnTCcsIGNvbnN0YW50UG9vbE5hbWUoKSwgJzsnKTsKIH0KKwogcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lKCkgewogCXJldHVybiB0aGlzLnNvdXJjZU5hbWU7CiB9CisKIHZvaWQgc3RvcmVBbm5vdGF0aW9uSG9sZGVyKEJpbmRpbmcgYmluZGluZywgQW5ub3RhdGlvbkhvbGRlciBob2xkZXIpIHsKIAlpZiAoaG9sZGVyID09IG51bGwpIHsKIAkJU2ltcGxlTG9va3VwVGFibGUgc3RvcmUgPSBzdG9yZWRBbm5vdGF0aW9ucyhmYWxzZSk7CkBAIC0xMTUzLDYgKzEzODQsNyBAQAogCQkJc3RvcmUucHV0KGJpbmRpbmcsIGhvbGRlcik7CiAJfQogfQorCiB2b2lkIHN0b3JlQW5ub3RhdGlvbnMoQmluZGluZyBiaW5kaW5nLCBBbm5vdGF0aW9uQmluZGluZ1tdIGFubm90YXRpb25zKSB7CiAJQW5ub3RhdGlvbkhvbGRlciBob2xkZXIgPSBudWxsOwogCWlmIChhbm5vdGF0aW9ucyA9PSBudWxsIHx8IGFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CkBAIC0xMTY5LDE4ICsxNDAxLDIxIEBACiAJfQogCXN0b3JlQW5ub3RhdGlvbkhvbGRlcihiaW5kaW5nLCBob2xkZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpKTsKIH0KKwogU2ltcGxlTG9va3VwVGFibGUgc3RvcmVkQW5ub3RhdGlvbnMoYm9vbGVhbiBmb3JjZUluaXRpYWxpemUpIHsKIAlyZXR1cm4gbnVsbDsgLy8gb3ZlcnJyaWRlIGlmIGludGVyZXN0ZWQgaW4gc3RvcmluZyBhbm5vdGF0aW9ucyBmb3IgdGhlIHJlY2VpdmVyLCBpdHMgZmllbGRzIGFuZCBtZXRob2RzCiB9CisKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MoKSB7CiAJcmV0dXJuIG51bGw7CiB9CisKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzKCkgewogCXJldHVybiBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUzsKIH0KKwogcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkgewogCWlmIChpc1N0YXRpYygpKSByZXR1cm4gbnVsbDsKLQogCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUoKTsKIAlpZiAoZW5jbG9zaW5nVHlwZSA9PSBudWxsKQogCQlyZXR1cm4gbnVsbDsKQEAgLTExOTMsNCArMTQyOCw4IEBACiBNZXRob2RCaW5kaW5nW10gdW5SZXNvbHZlZE1ldGhvZHMoKSB7IC8vIGZvciB0aGUgTWV0aG9kVmVyaWZpZXIgc28gaXQgZG9lc24ndCByZXNvbHZlIHR5cGVzCiAJcmV0dXJuIG1ldGhvZHMoKTsKIH0KKworcHVibGljIEZpZWxkQmluZGluZ1tdIHVuUmVzb2x2ZWRGaWVsZHMoKSB7CisJcmV0dXJuIEJpbmRpbmcuTk9fRklFTERTOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TY29wZS5qYXZhCmluZGV4IDgzNGU2NzAuLjA4MzQwMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMTAgKzIxLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVTZXQ7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY29wZSBpbXBsZW1lbnRzIFR5cGVDb25zdGFudHMsIFR5cGVJZHMgewotCQorcHVibGljIGFic3RyYWN0IGNsYXNzIFNjb3BlIHsKKwogCS8qIFNjb3BlIGtpbmRzICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQkxPQ0tfU0NPUEUgPSAxOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENMQVNTX1NDT1BFID0gMzsKQEAgLTQwLDE0ICs0MSwxOSBAQAogCS8qIFR5cGUgQ29tcGF0aWJpbGl0aWVzICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFVQUxfT1JfTU9SRV9TUEVDSUZJQyA9IC0xOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9SRUxBVEVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1JFX0dFTkVSSUMgPSAxOwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1JFX0dFTkVSSUMgPSAxOwogCiAJcHVibGljIGludCBraW5kOwogCXB1YmxpYyBTY29wZSBwYXJlbnQ7Ci0JCisKKwlwcm90ZWN0ZWQgU2NvcGUoaW50IGtpbmQsIFNjb3BlIHBhcmVudCkgeworCQl0aGlzLmtpbmQgPSBraW5kOworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl9CisKIAkvKiBBbnN3ZXIgYW4gaW50IGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBnaXZlbiB0eXBlcy4KIAkqCi0JKiAJCU5PVF9SRUxBVEVEIAorCSogCQlOT1RfUkVMQVRFRAogCSogCQlFUVVBTF9PUl9NT1JFX1NQRUNJRklDIDogbGVmdCBpcyBjb21wYXRpYmxlIHdpdGggcmlnaHQKIAkqIAkJTU9SRV9HRU5FUklDIDogcmlnaHQgaXMgY29tcGF0aWJsZSB3aXRoIGxlZnQKIAkqLwpAQCAtNTgsNyArNjQsMTMyIEBACiAJCQlyZXR1cm4gU2NvcGUuTU9SRV9HRU5FUklDOwogCQlyZXR1cm4gU2NvcGUuTk9UX1JFTEFURUQ7CiAJfQotCXB1YmxpYyBzdGF0aWMgVHlwZUJpbmRpbmcgZ2V0QmFzZVR5cGUoY2hhcltdIG5hbWUpIHsKKworCS8qKgorCSAqIFJldHVybnMgYSB0eXBlIHdoZXJlIGVpdGhlciBhbGwgdmFyaWFibGVzIG9yIHNwZWNpZmljIG9uZXMgZ290IGRpc2NhcmRlZC4KKwkgKiBlLmcuIExpc3Q8RT4gKGRpc2NhcmRpbmcgPEUgZXh0ZW5kcyBFbnVtPEU+KSB3aWxsIHJldHVybjogIExpc3Q8PyBleHRlbmRzIEVudW08Pz4+CisJICovCisJcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKFR5cGVCaW5kaW5nIG9yaWdpbmFsVHlwZSwgUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZSwgaW50IHJhbmssIFNldCBlbGltaW5hdGVkVmFyaWFibGVzKSB7CisJCWlmICgob3JpZ2luYWxUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgIT0gMCkgeworCQkJc3dpdGNoIChvcmlnaW5hbFR5cGUua2luZCgpKSB7CisJCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgorCQkJCQlBcnJheUJpbmRpbmcgb3JpZ2luYWxBcnJheVR5cGUgPSAoQXJyYXlCaW5kaW5nKSBvcmlnaW5hbFR5cGU7CisJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsTGVhZkNvbXBvbmVudFR5cGUgPSBvcmlnaW5hbEFycmF5VHlwZS5sZWFmQ29tcG9uZW50VHlwZTsKKwkJCQkJVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZSA9IGNvbnZlcnRFbGltaW5hdGluZ1R5cGVWYXJpYWJsZXMob3JpZ2luYWxMZWFmQ29tcG9uZW50VHlwZSwgZ2VuZXJpY1R5cGUsIHJhbmssIGVsaW1pbmF0ZWRWYXJpYWJsZXMpOyAvLyBzdWJzdGl0dXRlIGNvdWxkIGl0c2VsZiBiZSBhcnJheSB0eXBlCisJCQkJCWlmIChzdWJzdGl0dXRlICE9IG9yaWdpbmFsTGVhZkNvbXBvbmVudFR5cGUpIHsKKwkJCQkJCXJldHVybiBvcmlnaW5hbEFycmF5VHlwZS5lbnZpcm9ubWVudC5jcmVhdGVBcnJheVR5cGUoc3Vic3RpdHV0ZS5sZWFmQ29tcG9uZW50VHlwZSgpLCBzdWJzdGl0dXRlLmRpbWVuc2lvbnMoKSArIG9yaWdpbmFsQXJyYXlUeXBlLmRpbWVuc2lvbnMoKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6CisJCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBvcmlnaW5hbFR5cGU7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3JpZ2luYWxFbmNsb3NpbmcgPSBwYXJhbVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHN1YnN0aXR1dGVkRW5jbG9zaW5nID0gb3JpZ2luYWxFbmNsb3Npbmc7CisJCQkJCWlmIChvcmlnaW5hbEVuY2xvc2luZyAhPSBudWxsKSB7CisJCQkJCQlzdWJzdGl0dXRlZEVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsRW5jbG9zaW5nLCBnZW5lcmljVHlwZSwgcmFuaywgZWxpbWluYXRlZFZhcmlhYmxlcyk7CisJCQkJCX0KKwkJCQkJVHlwZUJpbmRpbmdbXSBvcmlnaW5hbEFyZ3VtZW50cyA9IHBhcmFtVHlwZS5hcmd1bWVudHM7CisJCQkJCVR5cGVCaW5kaW5nW10gc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBvcmlnaW5hbEFyZ3VtZW50czsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9yaWdpbmFsQXJndW1lbnRzID09IG51bGwgPyAwIDogb3JpZ2luYWxBcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsQXJndW1lbnQgPSBvcmlnaW5hbEFyZ3VtZW50c1tpXTsKKwkJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkQXJndW1lbnQgPSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsQXJndW1lbnQsIHBhcmFtVHlwZS5nZW5lcmljVHlwZSgpLCBpLCBlbGltaW5hdGVkVmFyaWFibGVzKTsKKwkJCQkJCWlmIChzdWJzdGl0dXRlZEFyZ3VtZW50ICE9IG9yaWdpbmFsQXJndW1lbnQpIHsKKwkJCQkJCQlpZiAoc3Vic3RpdHV0ZWRBcmd1bWVudHMgPT0gb3JpZ2luYWxBcmd1bWVudHMpIHsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbEFyZ3VtZW50cywgMCwgc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXSwgMCwgaSk7CisJCQkJCQkJfQorCQkJCQkJCXN1YnN0aXR1dGVkQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZWRBcmd1bWVudDsKKwkJCQkJCX0gZWxzZSAJaWYgKHN1YnN0aXR1dGVkQXJndW1lbnRzICE9IG9yaWdpbmFsQXJndW1lbnRzKSB7CisJCQkJCQkJc3Vic3RpdHV0ZWRBcmd1bWVudHNbaV0gPSBvcmlnaW5hbEFyZ3VtZW50OworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChvcmlnaW5hbEVuY2xvc2luZyAhPSBzdWJzdGl0dXRlZEVuY2xvc2luZyB8fCBvcmlnaW5hbEFyZ3VtZW50cyAhPSBzdWJzdGl0dXRlZEFyZ3VtZW50cykgeworCQkJCQkJcmV0dXJuIHBhcmFtVHlwZS5lbnZpcm9ubWVudC5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZShwYXJhbVR5cGUuZ2VuZXJpY1R5cGUoKSwgc3Vic3RpdHV0ZWRBcmd1bWVudHMsIHN1YnN0aXR1dGVkRW5jbG9zaW5nKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgorCQkJCQlpZiAoZ2VuZXJpY1R5cGUgPT0gbnVsbCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbFZhcmlhYmxlID0gKFR5cGVWYXJpYWJsZUJpbmRpbmcpIG9yaWdpbmFsVHlwZTsKKwkJCQkJaWYgKGVsaW1pbmF0ZWRWYXJpYWJsZXMgIT0gbnVsbCAmJiBlbGltaW5hdGVkVmFyaWFibGVzLmNvbnRhaW5zKG9yaWdpbmFsVHlwZSkpIHsKKwkJCQkJCXJldHVybiBvcmlnaW5hbFZhcmlhYmxlLmVudmlyb25tZW50LmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBudWxsLCBudWxsLCBXaWxkY2FyZC5VTkJPVU5EKTsKKwkJCQkJfQorCQkJCQlUeXBlQmluZGluZyBvcmlnaW5hbFVwcGVyQm91bmQgPSBvcmlnaW5hbFZhcmlhYmxlLnVwcGVyQm91bmQoKTsKKwkJCQkJaWYgKGVsaW1pbmF0ZWRWYXJpYWJsZXMgPT0gbnVsbCkgeworCQkJCQkJZWxpbWluYXRlZFZhcmlhYmxlcyA9IG5ldyBIYXNoU2V0KDIpOworCQkJCQl9CisJCQkJCWVsaW1pbmF0ZWRWYXJpYWJsZXMuYWRkKG9yaWdpbmFsVmFyaWFibGUpOworCQkJCQlUeXBlQmluZGluZyBzdWJzdGl0dXRlZFVwcGVyQm91bmQgPSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsVXBwZXJCb3VuZCwgZ2VuZXJpY1R5cGUsIHJhbmssIGVsaW1pbmF0ZWRWYXJpYWJsZXMpOworCQkJCQllbGltaW5hdGVkVmFyaWFibGVzLnJlbW92ZShvcmlnaW5hbFZhcmlhYmxlKTsKKwkJCQkJcmV0dXJuIG9yaWdpbmFsVmFyaWFibGUuZW52aXJvbm1lbnQuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIHN1YnN0aXR1dGVkVXBwZXJCb3VuZCwgbnVsbCwgV2lsZGNhcmQuRVhURU5EUyk7CisJCQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3JpZ2luYWxUeXBlOworCQkJCQlvcmlnaW5hbEVuY2xvc2luZyA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQkJc3Vic3RpdHV0ZWRFbmNsb3NpbmcgPSBvcmlnaW5hbEVuY2xvc2luZzsKKwkJCQkJaWYgKG9yaWdpbmFsRW5jbG9zaW5nICE9IG51bGwpIHsKKwkJCQkJCXN1YnN0aXR1dGVkRW5jbG9zaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGNvbnZlcnRFbGltaW5hdGluZ1R5cGVWYXJpYWJsZXMob3JpZ2luYWxFbmNsb3NpbmcsIGdlbmVyaWNUeXBlLCByYW5rLCBlbGltaW5hdGVkVmFyaWFibGVzKTsKKwkJCQkJfQorCQkJCQlvcmlnaW5hbEFyZ3VtZW50cyA9IGN1cnJlbnRUeXBlLnR5cGVWYXJpYWJsZXMoKTsKKwkJCQkJc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBvcmlnaW5hbEFyZ3VtZW50czsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9yaWdpbmFsQXJndW1lbnRzID09IG51bGwgPyAwIDogb3JpZ2luYWxBcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsQXJndW1lbnQgPSBvcmlnaW5hbEFyZ3VtZW50c1tpXTsKKwkJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkQXJndW1lbnQgPSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsQXJndW1lbnQsIGN1cnJlbnRUeXBlLCBpLCBlbGltaW5hdGVkVmFyaWFibGVzKTsKKwkJCQkJCWlmIChzdWJzdGl0dXRlZEFyZ3VtZW50ICE9IG9yaWdpbmFsQXJndW1lbnQpIHsKKwkJCQkJCQlpZiAoc3Vic3RpdHV0ZWRBcmd1bWVudHMgPT0gb3JpZ2luYWxBcmd1bWVudHMpIHsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbEFyZ3VtZW50cywgMCwgc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXSwgMCwgaSk7CisJCQkJCQkJfQorCQkJCQkJCXN1YnN0aXR1dGVkQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZWRBcmd1bWVudDsKKwkJCQkJCX0gZWxzZSAJaWYgKHN1YnN0aXR1dGVkQXJndW1lbnRzICE9IG9yaWdpbmFsQXJndW1lbnRzKSB7CisJCQkJCQkJc3Vic3RpdHV0ZWRBcmd1bWVudHNbaV0gPSBvcmlnaW5hbEFyZ3VtZW50OworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChvcmlnaW5hbEVuY2xvc2luZyAhPSBzdWJzdGl0dXRlZEVuY2xvc2luZyB8fCBvcmlnaW5hbEFyZ3VtZW50cyAhPSBzdWJzdGl0dXRlZEFyZ3VtZW50cykgeworCQkJCQkJcmV0dXJuICgoVHlwZVZhcmlhYmxlQmluZGluZylvcmlnaW5hbEFyZ3VtZW50c1swXSkuZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoZ2VuZXJpY1R5cGUsIHN1YnN0aXR1dGVkQXJndW1lbnRzLCBzdWJzdGl0dXRlZEVuY2xvc2luZyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBvcmlnaW5hbFR5cGU7CisJCQkJCVR5cGVCaW5kaW5nIG9yaWdpbmFsQm91bmQgPSB3aWxkY2FyZC5ib3VuZDsKKwkJCQkJVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZWRCb3VuZCA9IG9yaWdpbmFsQm91bmQ7CisJCQkJCWlmIChvcmlnaW5hbEJvdW5kICE9IG51bGwpIHsKKwkJCQkJCXN1YnN0aXR1dGVkQm91bmQgPSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsQm91bmQsIGdlbmVyaWNUeXBlLCByYW5rLCBlbGltaW5hdGVkVmFyaWFibGVzKTsKKwkJCQkJCWlmIChzdWJzdGl0dXRlZEJvdW5kICE9IG9yaWdpbmFsQm91bmQpIHsKKwkJCQkJCQlyZXR1cm4gd2lsZGNhcmQuZW52aXJvbm1lbnQuY3JlYXRlV2lsZGNhcmQod2lsZGNhcmQuZ2VuZXJpY1R5cGUsIHdpbGRjYXJkLnJhbmssIHN1YnN0aXR1dGVkQm91bmQsIG51bGwsIHdpbGRjYXJkLmJvdW5kS2luZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKKwkJCQkJV2lsZGNhcmRCaW5kaW5nIGludGVyc2VjdGlvbiA9IChXaWxkY2FyZEJpbmRpbmcpIG9yaWdpbmFsVHlwZTsKKwkJCQkJb3JpZ2luYWxCb3VuZCA9IGludGVyc2VjdGlvbi5ib3VuZDsKKwkJCQkJc3Vic3RpdHV0ZWRCb3VuZCA9IG9yaWdpbmFsQm91bmQ7CisJCQkJCWlmIChvcmlnaW5hbEJvdW5kICE9IG51bGwpIHsKKwkJCQkJCXN1YnN0aXR1dGVkQm91bmQgPSBjb252ZXJ0RWxpbWluYXRpbmdUeXBlVmFyaWFibGVzKG9yaWdpbmFsQm91bmQsIGdlbmVyaWNUeXBlLCByYW5rLCBlbGltaW5hdGVkVmFyaWFibGVzKTsKKwkJCQkJfQorCQkJCQlUeXBlQmluZGluZ1tdIG9yaWdpbmFsT3RoZXJCb3VuZHMgPSBpbnRlcnNlY3Rpb24ub3RoZXJCb3VuZHM7CisJCQkJCVR5cGVCaW5kaW5nW10gc3Vic3RpdHV0ZWRPdGhlckJvdW5kcyA9IG9yaWdpbmFsT3RoZXJCb3VuZHM7CisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvcmlnaW5hbE90aGVyQm91bmRzID09IG51bGwgPyAwIDogb3JpZ2luYWxPdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxPdGhlckJvdW5kID0gb3JpZ2luYWxPdGhlckJvdW5kc1tpXTsKKwkJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkT3RoZXJCb3VuZCA9IGNvbnZlcnRFbGltaW5hdGluZ1R5cGVWYXJpYWJsZXMob3JpZ2luYWxPdGhlckJvdW5kLCBnZW5lcmljVHlwZSwgcmFuaywgZWxpbWluYXRlZFZhcmlhYmxlcyk7CisJCQkJCQlpZiAoc3Vic3RpdHV0ZWRPdGhlckJvdW5kICE9IG9yaWdpbmFsT3RoZXJCb3VuZCkgeworCQkJCQkJCWlmIChzdWJzdGl0dXRlZE90aGVyQm91bmRzID09IG9yaWdpbmFsT3RoZXJCb3VuZHMpIHsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbE90aGVyQm91bmRzLCAwLCBzdWJzdGl0dXRlZE90aGVyQm91bmRzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF0sIDAsIGkpOworCQkJCQkJCX0KKwkJCQkJCQlzdWJzdGl0dXRlZE90aGVyQm91bmRzW2ldID0gc3Vic3RpdHV0ZWRPdGhlckJvdW5kOworCQkJCQkJfSBlbHNlIAlpZiAoc3Vic3RpdHV0ZWRPdGhlckJvdW5kcyAhPSBvcmlnaW5hbE90aGVyQm91bmRzKSB7CisJCQkJCQkJc3Vic3RpdHV0ZWRPdGhlckJvdW5kc1tpXSA9IG9yaWdpbmFsT3RoZXJCb3VuZDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoc3Vic3RpdHV0ZWRCb3VuZCAhPSBvcmlnaW5hbEJvdW5kIHx8IHN1YnN0aXR1dGVkT3RoZXJCb3VuZHMgIT0gb3JpZ2luYWxPdGhlckJvdW5kcykgeworCQkJCQkJcmV0dXJuIGludGVyc2VjdGlvbi5lbnZpcm9ubWVudC5jcmVhdGVXaWxkY2FyZChpbnRlcnNlY3Rpb24uZ2VuZXJpY1R5cGUsIGludGVyc2VjdGlvbi5yYW5rLCBzdWJzdGl0dXRlZEJvdW5kLCBzdWJzdGl0dXRlZE90aGVyQm91bmRzLCBpbnRlcnNlY3Rpb24uYm91bmRLaW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKwkJcmV0dXJuIG9yaWdpbmFsVHlwZTsKKwl9CQorCisgICBwdWJsaWMgc3RhdGljIFR5cGVCaW5kaW5nIGdldEJhc2VUeXBlKGNoYXJbXSBuYW1lKSB7CiAJCS8vIGxpc3Qgc2hvdWxkIGJlIG9wdGltaXplZCAod2l0aCBtb3N0IG9mdGVuIHVzZWQgZmlyc3QpCiAJCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCA+IDIgJiYgbGVuZ3RoIDwgOCkgewpAQCAtMTIwLDcgKzI1MSw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotICAgLy8gNS4xLjEwCisJLy8gNS4xLjEwCiAJcHVibGljIHN0YXRpYyBSZWZlcmVuY2VCaW5kaW5nW10gZ3JlYXRlckxvd2VyQm91bmQoUmVmZXJlbmNlQmluZGluZ1tdIHR5cGVzKSB7CiAJCWlmICh0eXBlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJaW50IGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsKQEAgLTE1NCw3ICsyODUsNyBAQAogCQl9CiAJCXJldHVybiB0cmltbWVkUmVzdWx0OwogCX0KLQkKKwogCS8vIDUuMS4xMAogCXB1YmxpYyBzdGF0aWMgVHlwZUJpbmRpbmdbXSBncmVhdGVyTG93ZXJCb3VuZChUeXBlQmluZGluZ1tdIHR5cGVzKSB7CiAJCWlmICh0eXBlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKQEAgLTE3OSw3ICszMTAsNyBAQAogCQkJfQogCQl9CiAJCWlmIChyZW1vdmVkID09IDApIHJldHVybiByZXN1bHQ7Ci0JCWlmIChsZW5ndGggPT0gcmVtb3ZlZCkgcmV0dXJuIG51bGw7CisJCWlmIChsZW5ndGggPT0gcmVtb3ZlZCkgcmV0dXJuIG51bGw7IC8vIGhvdyBpcyB0aGlzIHBvc3NpYmxlID8/PwogCQlUeXBlQmluZGluZ1tdIHRyaW1tZWRSZXN1bHQgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoIC0gcmVtb3ZlZF07CiAJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJVHlwZUJpbmRpbmcgaVR5cGUgPSByZXN1bHRbaV07CkBAIC0xODksNyArMzIwLDcgQEAKIAkJfQogCQlyZXR1cm4gdHJpbW1lZFJlc3VsdDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHR5cGVzLCB3aGVyZSBvcmlnaW5hbCB0eXBlcyBnb3Qgc3Vic3RpdHV0ZWQgZ2l2ZW4gYSBzdWJzdGl0dXRpb24uCiAJICogT25seSBhbGxvY2F0ZSBhbiBhcnJheSBpZiBhbnl0aGluZyBpcyBkaWZmZXJlbnQuCkBAIC0yMTksMjAgKzM1MCwyMCBAQAogCSAqIFJldHVybnMgYSB0eXBlLCB3aGVyZSBvcmlnaW5hbCB0eXBlIHdhcyBzdWJzdGl0dXRlZCB1c2luZyB0aGUgcmVjZWl2ZXIKIAkgKiBwYXJhbWV0ZXJpemVkIHR5cGUuCiAJICogSW4gcmF3IG1vZGUsIGFsbCBwYXJhbWV0ZXJpemVkIHR5cGUgZGVub3Rpbmcgc2FtZSBvcmlnaW5hbCB0eXBlIGFyZSBjb252ZXJ0ZWQKLQkgKiB0byByYXcgdHlwZXMuIGUuZy4gCisJICogdG8gcmF3IHR5cGVzLiBlLmcuCiAJICogY2xhc3MgWCA8VD4gewogCSAqICAgWDxUPiBmb287CiAJICogICBYPFN0cmluZz4gYmFyOwogCSAqIH0gd2hlbiB1c2VkIGluIHJhdyBmYXNoaW9uLCB0aGVuIHR5cGUgb2YgYm90aCBmb28gYW5kIGJhciBpcyByYXcgdHlwZSBYLgotCSAqIAorCSAqCiAJICovCiAJcHVibGljIHN0YXRpYyBUeXBlQmluZGluZyBzdWJzdGl0dXRlKFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24sIFR5cGVCaW5kaW5nIG9yaWdpbmFsVHlwZSkgewogCQlpZiAob3JpZ2luYWxUeXBlID09IG51bGwpIHJldHVybiBudWxsOwogCQlzd2l0Y2ggKG9yaWdpbmFsVHlwZS5raW5kKCkpIHsKLQkJCQorCiAJCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI6CiAJCQkJcmV0dXJuIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlKChUeXBlVmFyaWFibGVCaW5kaW5nKSBvcmlnaW5hbFR5cGUpOwotCQkJCQorCiAJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFOgogCQkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBvcmlnaW5hbFBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgb3JpZ2luYWxUeXBlOwogCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3JpZ2luYWxFbmNsb3NpbmcgPSBvcmlnaW5hbFR5cGUuZW5jbG9zaW5nVHlwZSgpOwpAQCAtMjQ5LDIzICszODAsMTEgQEAKIAkJCQkJc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBzdWJzdGl0dXRlKHN1YnN0aXR1dGlvbiwgb3JpZ2luYWxBcmd1bWVudHMpOwogCQkJCX0KIAkJCQlpZiAoc3Vic3RpdHV0ZWRBcmd1bWVudHMgIT0gb3JpZ2luYWxBcmd1bWVudHMgfHwgc3Vic3RpdHV0ZWRFbmNsb3NpbmcgIT0gb3JpZ2luYWxFbmNsb3NpbmcpIHsKLS8vCQkJCQlpZGVudGljYWxWYXJpYWJsZXM6IHsgLy8gaWYgc3Vic3RpdHV0ZWQgd2l0aCBvcmlnaW5hbCB2YXJpYWJsZXMsIHRoZW4gYW5zd2VyIHRoZSBnZW5lcmljIHR5cGUgaXRzZWxmCi0vLwkJCQkJCWlmIChzdWJzdGl0dXRlZEVuY2xvc2luZyAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvL2lmICghKHN1YnN0aXR1dGVkRW5jbG9zaW5nIGluc3RhbmNlb2YgU291cmNlVHlwZUJpbmRpbmcpKSBicmVhayBpZGVudGljYWxWYXJpYWJsZXM7Ci0vLwkJCQkJCQlpZiAoc3Vic3RpdHV0ZWRFbmNsb3NpbmcgIT0gb3JpZ2luYWxFbmNsb3NpbmcpIGJyZWFrIGlkZW50aWNhbFZhcmlhYmxlczsJCQkJCQkKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAob3JpZ2luYWxQYXJhbWV0ZXJpemVkVHlwZS50eXBlLmlzQmluYXJ5QmluZGluZygpKSBicmVhayBpZGVudGljYWxWYXJpYWJsZXM7IC8vIGdlbmVyaWMgYmluYXJ5IGlzIG5ldmVyIHVzZWQgYXMgaXMsIHNlZSA4NTI2MgotLy8JCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gb3JpZ2luYWxWYXJpYWJsZXMgPSBvcmlnaW5hbFBhcmFtZXRlcml6ZWRUeXBlLnR5cGUudHlwZVZhcmlhYmxlcygpOwotLy8JCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3JpZ2luYWxWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLS8vCQkJCQkJCWlmIChzdWJzdGl0dXRlZEFyZ3VtZW50c1tpXSAhPSBvcmlnaW5hbFZhcmlhYmxlc1tpXSkgYnJlYWsgaWRlbnRpY2FsVmFyaWFibGVzOwotLy8JCQkJCQl9Ci0vLwkJCQkJCXJldHVybiBvcmlnaW5hbFBhcmFtZXRlcml6ZWRUeXBlLnR5cGU7Ci0vLwkJCQkJfQogCQkJCQlyZXR1cm4gb3JpZ2luYWxQYXJhbWV0ZXJpemVkVHlwZS5lbnZpcm9ubWVudC5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSgKIAkJCQkJCQlvcmlnaW5hbFBhcmFtZXRlcml6ZWRUeXBlLmdlbmVyaWNUeXBlKCksIHN1YnN0aXR1dGVkQXJndW1lbnRzLCBzdWJzdGl0dXRlZEVuY2xvc2luZyk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCQorCiAJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRToKIAkJCQlBcnJheUJpbmRpbmcgb3JpZ2luYWxBcnJheVR5cGUgPSAoQXJyYXlCaW5kaW5nKSBvcmlnaW5hbFR5cGU7CiAJCQkJVHlwZUJpbmRpbmcgb3JpZ2luYWxMZWFmQ29tcG9uZW50VHlwZSA9IG9yaWdpbmFsQXJyYXlUeXBlLmxlYWZDb21wb25lbnRUeXBlOwpAQCAtMjc2LDYgKzM5NSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFOgorCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQkgICAgICAgIFdpbGRjYXJkQmluZGluZyB3aWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIG9yaWdpbmFsVHlwZTsKIAkJICAgICAgICBpZiAod2lsZGNhcmQuYm91bmRLaW5kICE9IFdpbGRjYXJkLlVOQk9VTkQpIHsKIAkJCSAgICAgICAgVHlwZUJpbmRpbmcgb3JpZ2luYWxCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOwpAQCAtMjgzLDYgKzQwMywyNCBAQAogCQkJICAgICAgICBUeXBlQmluZGluZ1tdIG9yaWdpbmFsT3RoZXJCb3VuZHMgPSB3aWxkY2FyZC5vdGhlckJvdW5kczsKIAkJCSAgICAgICAgVHlwZUJpbmRpbmdbXSBzdWJzdGl0dXRlZE90aGVyQm91bmRzID0gc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIG9yaWdpbmFsT3RoZXJCb3VuZHMpOwogCQkJICAgICAgICBpZiAoc3Vic3RpdHV0ZWRCb3VuZCAhPSBvcmlnaW5hbEJvdW5kIHx8IG9yaWdpbmFsT3RoZXJCb3VuZHMgIT0gc3Vic3RpdHV0ZWRPdGhlckJvdW5kcykgeworCQkJICAgICAgICAJaWYgKG9yaWdpbmFsT3RoZXJCb3VuZHMgIT0gbnVsbCkgeworCQkJICAgICAgICAJCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDcxNDU6IHRoZSBjb25zdGl0dWVudCBpbnRlcnNlY3RpbmcgdHlwZXMgaGF2ZSBjaGFuZ2VkCisJCQkgICAgICAgIAkJICAgaW4gdGhlIGxhc3Qgcm91bmQgb2Ygc3Vic3RpdHV0aW9uLiBSZWV2YWx1YXRlIHRoZSBjb21wb3NpdGUgaW50ZXJzZWN0aW9uIHR5cGUsIGFzIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkKKwkJCSAgICAgICAgCQkgICBvZiB0aGUgaW50ZXJzZWN0aW9uIGNvbGxhcHNpbmcgaW50byBvbmUgb2YgdGhlIGNvbnN0aXR1ZW50cywgdGhlIG90aGVyIGJlaW5nIGZ1bGx5IHN1YnN1bWVkLgorCQkJICAgICAgICAJCSovCisJCQkgICAgCQkJVHlwZUJpbmRpbmcgW10gYm91bmRzID0gbmV3IFR5cGVCaW5kaW5nWzEgKyBzdWJzdGl0dXRlZE90aGVyQm91bmRzLmxlbmd0aF07CisJCQkgICAgCQkJYm91bmRzWzBdID0gc3Vic3RpdHV0ZWRCb3VuZDsKKwkJCSAgICAJCQlTeXN0ZW0uYXJyYXljb3B5KHN1YnN0aXR1dGVkT3RoZXJCb3VuZHMsIDAsIGJvdW5kcywgMSwgc3Vic3RpdHV0ZWRPdGhlckJvdW5kcy5sZW5ndGgpOworCQkJICAgIAkJCVR5cGVCaW5kaW5nW10gZ2xiID0gU2NvcGUuZ3JlYXRlckxvd2VyQm91bmQoYm91bmRzKTsgLy8gcmUtZXZhbHVhdGUKKwkJCSAgICAJCQlpZiAoZ2xiICE9IG51bGwgJiYgZ2xiICE9IGJvdW5kcykgeworCQkJICAgIAkJCQlzdWJzdGl0dXRlZEJvdW5kID0gZ2xiWzBdOworCQkgICAgCQkJCQlpZiAoZ2xiLmxlbmd0aCA9PSAxKSB7CisJCQkgICAgCQkJCQlzdWJzdGl0dXRlZE90aGVyQm91bmRzID0gbnVsbDsKKwkJCSAgICAJCQkJfSBlbHNlIHsKKwkJCSAgICAJCQkJCVN5c3RlbS5hcnJheWNvcHkoZ2xiLCAxLCBzdWJzdGl0dXRlZE90aGVyQm91bmRzID0gbmV3IFR5cGVCaW5kaW5nW2dsYi5sZW5ndGggLSAxXSwgMCwgZ2xiLmxlbmd0aCAtIDEpOworCQkJICAgIAkJCQl9CisJCQkgICAgCQkJfQorCQkJICAgICAgICAJfQogCQkgICAgICAgIAkJcmV0dXJuIHdpbGRjYXJkLmVudmlyb25tZW50LmNyZWF0ZVdpbGRjYXJkKHdpbGRjYXJkLmdlbmVyaWNUeXBlLCB3aWxkY2FyZC5yYW5rLCBzdWJzdGl0dXRlZEJvdW5kLCBzdWJzdGl0dXRlZE90aGVyQm91bmRzLCB3aWxkY2FyZC5ib3VuZEtpbmQpOwogCQkJICAgICAgICB9CiAJCSAgICAgICAgfQpAQCAtMjk2LDEwICs0MzQsMTAgQEAKIAkJCQlpZiAob3JpZ2luYWxFbmNsb3NpbmcgIT0gbnVsbCkgewogCQkJCQlzdWJzdGl0dXRlZEVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBzdWJzdGl0dXRlKHN1YnN0aXR1dGlvbiwgb3JpZ2luYWxFbmNsb3NpbmcpOwogCQkJCX0KLQkJCQkKKwogCQkJICAgIC8vIHRyZWF0IGFzIGlmIHBhcmFtZXRlcml6ZWQgd2l0aCBpdHMgdHlwZSB2YXJpYWJsZXMgKG5vbiBnZW5lcmljIHR5cGUgZ2V0cyAnbnVsbCcgYXJndW1lbnRzKQogCQkJCWlmIChzdWJzdGl0dXRlZEVuY2xvc2luZyAhPSBvcmlnaW5hbEVuY2xvc2luZykgewotCQkJCQlyZXR1cm4gc3Vic3RpdHV0aW9uLmlzUmF3U3Vic3RpdHV0aW9uKCkgCisJCQkJCXJldHVybiBzdWJzdGl0dXRpb24uaXNSYXdTdWJzdGl0dXRpb24oKQogCQkJCQkJPyBzdWJzdGl0dXRpb24uZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKG9yaWdpbmFsUmVmZXJlbmNlVHlwZSwgc3Vic3RpdHV0ZWRFbmNsb3NpbmcpCiAJCQkJCQk6ICBzdWJzdGl0dXRpb24uZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZShvcmlnaW5hbFJlZmVyZW5jZVR5cGUsIG51bGwsIHN1YnN0aXR1dGVkRW5jbG9zaW5nKTsKIAkJCQl9CkBAIC0zMTEsMjAgKzQ0OSwxNyBAQAogCQkJCWlmIChvcmlnaW5hbEVuY2xvc2luZyAhPSBudWxsKSB7CiAJCQkJCXN1YnN0aXR1dGVkRW5jbG9zaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHN1YnN0aXR1dGUoc3Vic3RpdHV0aW9uLCBvcmlnaW5hbEVuY2xvc2luZyk7CiAJCQkJfQotCQkJCQorCiAJCQkJaWYgKHN1YnN0aXR1dGlvbi5pc1Jhd1N1YnN0aXR1dGlvbigpKSB7CiAJCQkJCXJldHVybiBzdWJzdGl0dXRpb24uZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKG9yaWdpbmFsUmVmZXJlbmNlVHlwZSwgc3Vic3RpdHV0ZWRFbmNsb3NpbmcpOwogCQkJCX0KIAkJCSAgICAvLyB0cmVhdCBhcyBpZiBwYXJhbWV0ZXJpemVkIHdpdGggaXRzIHR5cGUgdmFyaWFibGVzIChub24gZ2VuZXJpYyB0eXBlIGdldHMgJ251bGwnIGFyZ3VtZW50cykKIAkJCQlvcmlnaW5hbEFyZ3VtZW50cyA9IG9yaWdpbmFsUmVmZXJlbmNlVHlwZS50eXBlVmFyaWFibGVzKCk7CiAJCQkJc3Vic3RpdHV0ZWRBcmd1bWVudHMgPSBzdWJzdGl0dXRlKHN1YnN0aXR1dGlvbiwgb3JpZ2luYWxBcmd1bWVudHMpOwotLy8JCQkJaWYgKHN1YnN0aXR1dGVkQXJndW1lbnRzICE9IG9yaWdpbmFsQXJndW1lbnRzIHx8IHN1YnN0aXR1dGVkRW5jbG9zaW5nICE9IG9yaWdpbmFsRW5jbG9zaW5nKSB7CiAJCQkJcmV0dXJuIHN1YnN0aXR1dGlvbi5lbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKG9yaWdpbmFsUmVmZXJlbmNlVHlwZSwgc3Vic3RpdHV0ZWRBcmd1bWVudHMsIHN1YnN0aXR1dGVkRW5jbG9zaW5nKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwogCQl9CiAJCXJldHVybiBvcmlnaW5hbFR5cGU7Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHR5cGVzLCB3aGVyZSBvcmlnaW5hbCB0eXBlcyBnb3Qgc3Vic3RpdHV0ZWQgZ2l2ZW4gYSBzdWJzdGl0dXRpb24uCkBAIC0zNDgsMTEgKzQ4Myw2IEBACiAJICAgIHJldHVybiBzdWJzdGl0dXRlZFR5cGVzOwogCX0KIAotCXByb3RlY3RlZCBTY29wZShpbnQga2luZCwgU2NvcGUgcGFyZW50KSB7Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0JCi0KIAkvKgogCSAqIEJveGluZyBwcmltaXRpdmUKIAkgKi8KQEAgLTM3MSw3ICs1MDEsNyBAQAogCQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHVibGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdFNjb3BlIGNvbXBpbGF0aW9uVW5pdFNjb3BlKCkgewogCQlTY29wZSBsYXN0U2NvcGUgPSBudWxsOwogCQlTY29wZSBzY29wZSA9IHRoaXM7CkBAIC0zODEsNyArNTExLDcgQEAKIAkJfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7CiAJCXJldHVybiAoQ29tcGlsYXRpb25Vbml0U2NvcGUpIGxhc3RTY29wZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBGaW5kcyB0aGUgbW9zdCBzcGVjaWZpYyBjb21waWxlciBvcHRpb25zCiAJICovCkBAIC0zOTMsMTYgKzUyMywxNSBAQAogCS8qKgogCSAqIEludGVybmFsIHVzZSBvbmx5CiAJICogR2l2ZW4gYSBtZXRob2QsIHJldHVybnMgbnVsbCBpZiBhcmd1bWVudHMgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBwYXJhbWV0ZXJzLgotCSAqIFdpbGwgYW5zd2VyIGEgc3Vic2l0dXRlZCBtZXRob2QgaW4gY2FzZSB0aGUgbWV0aG9kIHdhcyBnZW5lcmljIGFuZCB0eXBlIGluZmVyZW5jZSBnb3QgdHJpZ2dlcmVkOworCSAqIFdpbGwgYW5zd2VyIGEgc3Vic3RpdHV0ZWQgbWV0aG9kIGluIGNhc2UgdGhlIG1ldGhvZCB3YXMgZ2VuZXJpYyBhbmQgdHlwZSBpbmZlcmVuY2UgZ290IHRyaWdnZXJlZDsKIAkgKiBpbiBjYXNlIHRoZSBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgY29tcGF0aWJsZSwgdGhlbiBzaW1wbHkgYW5zd2VyIGl0IGJhY2suCiAJICovCiAJcHJvdGVjdGVkIGZpbmFsIE1ldGhvZEJpbmRpbmcgY29tcHV0ZUNvbXBhdGlibGVNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRzLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgewotCiAJCVR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMgPSBpbnZvY2F0aW9uU2l0ZS5nZW5lcmljVHlwZUFyZ3VtZW50cygpOwogCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsKIAkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSBtZXRob2QudHlwZVZhcmlhYmxlczsKIAkJaWYgKHBhcmFtZXRlcnMgPT0gYXJndW1lbnRzCi0JCQkmJiAobWV0aG9kLnJldHVyblR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlKSA9PSAwIAorCQkJJiYgKG1ldGhvZC5yZXR1cm5UeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgPT0gMAogCQkJJiYgZ2VuZXJpY1R5cGVBcmd1bWVudHMgPT0gbnVsbAogCQkJJiYgdHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQogCQkJCXJldHVybiBtZXRob2Q7CkBAIC00MTQsNyArNTQzLDggQEAKIAkJCWlmICghaXNWYXJBcmdzIHx8IGFyZ0xlbmd0aCA8IHBhcmFtTGVuZ3RoIC0gMSkKIAkJCQlyZXR1cm4gbnVsbDsgLy8gaW5jb21wYXRpYmxlCiAKLQkJaWYgKHR5cGVWYXJpYWJsZXMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeyAvLyBnZW5lcmljIG1ldGhvZAorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwNDM1LCBpbmZlcmVuY2Ugc2hvdWxkIGtpY2sgaW4gb25seSBhdCBzb3VyY2UgMS41KworCQlpZiAodHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTICYmIGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsgLy8gZ2VuZXJpYyBtZXRob2QKIAkJCVR5cGVCaW5kaW5nW10gbmV3QXJncyA9IG51bGw7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0xlbmd0aDsgaSsrKSB7CiAJCQkJVHlwZUJpbmRpbmcgcGFyYW0gPSBpIDwgcGFyYW1MZW5ndGggPyBwYXJhbWV0ZXJzW2ldIDogcGFyYW1ldGVyc1twYXJhbUxlbmd0aCAtIDFdOwpAQCAtNDI0LDM3ICs1NTQsNTUgQEAKIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCBuZXdBcmdzLCAwLCBhcmdMZW5ndGgpOwogCQkJCQl9CiAJCQkJCW5ld0FyZ3NbaV0gPSBlbnZpcm9ubWVudCgpLmNvbXB1dGVCb3hpbmdUeXBlKGFyZ3VtZW50c1tpXSk7Ci0JCQkJfQkKKwkJCQl9CiAJCQl9CiAJCQlpZiAobmV3QXJncyAhPSBudWxsKQogCQkJCWFyZ3VtZW50cyA9IG5ld0FyZ3M7CiAJCQltZXRob2QgPSBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcuY29tcHV0ZUNvbXBhdGlibGVNZXRob2QobWV0aG9kLCBhcmd1bWVudHMsIHRoaXMsIGludm9jYXRpb25TaXRlKTsKIAkJCWlmIChtZXRob2QgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGluY29tcGF0aWJsZQogCQkJaWYgKCFtZXRob2QuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIG1ldGhvZDsgLy8gYm91bmQgY2hlY2sgaXNzdWUgaXMgdGFraW5nIHByZWNlZGVuY2UKLQkJCXBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsgLy8gcmVhY3F1aXJlIHRoZW0gYWZ0ZXIgdHlwZSBpbmZlcmVuY2UgaGFzIHBlcmZvcm1lZAotCQl9IGVsc2UgaWYgKGdlbmVyaWNUeXBlQXJndW1lbnRzICE9IG51bGwpIHsKKwkJfSBlbHNlIGlmIChnZW5lcmljVHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKIAkJCWlmIChtZXRob2QgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpIHsKLQkJCQlpZiAoISgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSBtZXRob2QpLndhc0luZmVycmVkKSB7CisJCQkJaWYgKCEoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZykgbWV0aG9kKS53YXNJbmZlcnJlZCkKIAkJCQkJLy8gYXR0ZW1wdCB0byBpbnZva2UgZ2VuZXJpYyBtZXRob2Qgb2YgcmF3IHR5cGUgd2l0aCB0eXBlIGhpbnRzIDxTdHJpbmc+Zm9vKCkKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2QsIG1ldGhvZC5zZWxlY3RvciwgZ2VuZXJpY1R5cGVBcmd1bWVudHMsIFByb2JsZW1SZWFzb25zLlR5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljTWV0aG9kKTsKLQkJCQl9Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlIGlmICghbWV0aG9kLmlzT3ZlcnJpZGluZygpIHx8ICFpc092ZXJyaWRkZW5NZXRob2RHZW5lcmljKG1ldGhvZCkpIHsKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKG1ldGhvZCwgbWV0aG9kLnNlbGVjdG9yLCBnZW5lcmljVHlwZUFyZ3VtZW50cywgUHJvYmxlbVJlYXNvbnMuVHlwZVBhcmFtZXRlckFyaXR5TWlzbWF0Y2gpOwogCQkJfQogCQl9CiAKLQkJaWYgKHBhcmFtZXRlckNvbXBhdGliaWxpdHlMZXZlbChtZXRob2QsIGFyZ3VtZW50cykgPiBOT1RfQ09NUEFUSUJMRSkKKwkJaWYgKHBhcmFtZXRlckNvbXBhdGliaWxpdHlMZXZlbChtZXRob2QsIGFyZ3VtZW50cykgPiBOT1RfQ09NUEFUSUJMRSkgeworCQkJaWYgKChtZXRob2QudGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlKSAhPSAwKSB7CisJCQkJLy8gZ2VuZXJhdGUgcG9seW1vcnBoaWMgbWV0aG9kCisJCQkJcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQoKS5jcmVhdGVQb2x5bW9ycGhpY01ldGhvZChtZXRob2QsIGFyZ3VtZW50cyk7CisJCQl9CiAJCQlyZXR1cm4gbWV0aG9kOwotCQlpZiAoZ2VuZXJpY1R5cGVBcmd1bWVudHMgIT0gbnVsbCkKKwkJfQorCQkvLyBpZiBtZXRob2QgaXMgZ2VuZXJpYyBhbmQgdHlwZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHN1cHBsaWVkLCBvbmx5IHRoZW4gYW5zd2VyIGEgcHJvYmxlbSAKKwkJLy8gb2YgUGFyYW1ldGVyaXplZE1ldGhvZFR5cGVNaXNtYXRjaCwgZWxzZSBhIG5vbi1nZW5lcmljIG1ldGhvZCB3YXMgaW52b2tlZCB1c2luZyB0eXBlIGFyZ3VtZW50cworCQkvLyBpbiB3aGljaCBjYXNlIHRoaXMgcHJvYmxlbSBjYXRlZ29yeSB3aWxsIGJlIGJvZ3VzCisJCWlmIChnZW5lcmljVHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZXMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykKIAkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kLCBtZXRob2Quc2VsZWN0b3IsIGFyZ3VtZW50cywgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyaXplZE1ldGhvZFR5cGVNaXNtYXRjaCk7CiAJCXJldHVybiBudWxsOyAvLyBpbmNvbXBhdGlibGUKIAl9Ci0JCisKKwkvKioKKwkgKiBDb25uZWN0IHR5cGUgdmFyaWFibGUgc3VwZXJ0eXBlcywgYW5kIHJldHVybnMgdHJ1ZSBpZiBubyBwcm9ibGVtIHdhcyBkZXRlY3RlZAorCSAqIEBwYXJhbSB0eXBlUGFyYW1ldGVycworCSAqIEBwYXJhbSBjaGVja0ZvckVyYXNlZENhbmRpZGF0ZUNvbGxpc2lvbnMKKwkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0VHlwZVZhcmlhYmxlcyhUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMsIGJvb2xlYW4gY2hlY2tGb3JFcmFzZWRDYW5kaWRhdGVDb2xsaXNpb25zKSB7Ci0JCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuIHRydWU7Ci0JCWJvb2xlYW4gbm9Qcm9ibGVtcyA9IHRydWU7CisJCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUyNTkgLSBXZSB1c2VkIHRvIG5vdCBib3RoZXIgd2l0aCBjb25uZWN0aW5nCisJCSAgIHR5cGUgdmFyaWFibGVzIGlmIHNvdXJjZSBsZXZlbCBpcyA8IDEuNS4gVGhpcyBjcmVhdGVzIHByb2JsZW1zIGluIHRoZSByZWNvbmNpbGVyIGlmIGEgMS40CisJCSAgIHByb2plY3QgcmVmZXJlbmNlcyB0aGUgZ2VuZXJpZmllZCBBUEkgb2YgYSAxLjUgcHJvamVjdC4gVGhlICJjdXJyZW50IiBwcm9qZWN0J3Mgc291cmNlCisJCSAgIGxldmVsIGNhbm5vdCBkZWNpZGUgdGhpcyBxdWVzdGlvbiBmb3Igc29tZSBvdGhlciBwcm9qZWN0LiBOb3csIGlmIHdlIHNlZSB0eXBlIHBhcmFtZXRlcnMKKwkJICAgYXQgYWxsLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY29uY2VybmVkIGphdmEgZWxlbWVudCBoYXMgc29tZSBsZWdpdGltYXRlIGJ1c2luZXNzIHdpdGggdGhlbS4KKwkJICovCisJCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSByZXR1cm4gdHJ1ZTsKIAkJTWFwIGludm9jYXRpb25zID0gbmV3IEhhc2hNYXAoMik7Ci0JCW5leHRWYXJpYWJsZSA6IGZvciAoaW50IGkgPSAwLCBwYXJhbUxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IHBhcmFtTGVuZ3RoOyBpKyspIHsKKwkJYm9vbGVhbiBub1Byb2JsZW1zID0gdHJ1ZTsKKwkJLy8gcHJlaW5pdGlhbGl6aW5nIGVhY2ggdHlwZSB2YXJpYWJsZQorCQlmb3IgKGludCBpID0gMCwgcGFyYW1MZW5ndGggPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CiAJCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKIAkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlID0gdHlwZVBhcmFtZXRlci5iaW5kaW5nOwogCQkJaWYgKHR5cGVWYXJpYWJsZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CkBAIC00NjMsOTcgKzYxMSwxMzMgQEAKIAkJCXR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUzsKIAkJCS8vIHNldCBmaXJzdEJvdW5kIHRvIHRoZSBiaW5kaW5nIG9mIHRoZSBmaXJzdCBleHBsaWNpdCBib3VuZCBpbiBwYXJhbWV0ZXIgZGVjbGFyYXRpb24KIAkJCXR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID0gbnVsbDsgLy8gZmlyc3QgYm91bmQgdXNlZCB0byBjb21wdXRlIGVyYXN1cmUKLQorCQl9CisJCW5leHRWYXJpYWJsZTogZm9yIChpbnQgaSA9IDAsIHBhcmFtTGVuZ3RoID0gdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgeworCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CisJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSA9IHR5cGVQYXJhbWV0ZXIuYmluZGluZzsKIAkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IHR5cGVQYXJhbWV0ZXIudHlwZTsKIAkJCWlmICh0eXBlUmVmID09IG51bGwpCiAJCQkJY29udGludWUgbmV4dFZhcmlhYmxlOworCQkJYm9vbGVhbiBpc0ZpcnN0Qm91bmRUeXBlVmFyaWFibGUgPSBmYWxzZTsKIAkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IHRoaXMua2luZCA9PSBNRVRIT0RfU0NPUEUKIAkJCQk/IHR5cGVSZWYucmVzb2x2ZVR5cGUoKEJsb2NrU2NvcGUpdGhpcywgZmFsc2UvKm5vIGJvdW5kIGNoZWNrKi8pCiAJCQkJOiB0eXBlUmVmLnJlc29sdmVUeXBlKChDbGFzc1Njb3BlKXRoaXMpOwogCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKSB7CiAJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKLQkJCQlub1Byb2JsZW1zID0gZmFsc2U7Ci0JCQkJY29udGludWUgbmV4dFZhcmlhYmxlOwotCQkJfQotCQkJdHlwZVJlZi5yZXNvbHZlZFR5cGUgPSBzdXBlclR5cGU7IC8vIGhvbGQgb250byB0aGUgcHJvYmxlbSB0eXBlCi0JCQlpZiAoc3VwZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ib3VuZENhbm5vdEJlQXJyYXkodHlwZVJlZiwgc3VwZXJUeXBlKTsKLQkJCQljb250aW51ZSBuZXh0VmFyaWFibGU7Ci0JCQl9Ci0JCQlib29sZWFuIGlzVHlwZVZhcmlhYmxlRmlyc3RCb3VuZCA9ICBzdXBlclR5cGUuaXNUeXBlVmFyaWFibGUoKTsKLQkJCWlmIChpc1R5cGVWYXJpYWJsZUZpcnN0Qm91bmQpIHsKLQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHZhclN1cGVyVHlwZSA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSBzdXBlclR5cGU7Ci0JCQkJaWYgKHZhclN1cGVyVHlwZS5yYW5rID49IHR5cGVWYXJpYWJsZS5yYW5rICYmIHZhclN1cGVyVHlwZS5kZWNsYXJpbmdFbGVtZW50ID09IHR5cGVWYXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50KSB7Ci0JCQkJCXByb2JsZW1SZXBvcnRlcigpLmZvcndhcmRUeXBlVmFyaWFibGVSZWZlcmVuY2UodHlwZVBhcmFtZXRlciwgdmFyU3VwZXJUeXBlKTsKLQkJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKLQkJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOwotCQkJCQljb250aW51ZSBuZXh0VmFyaWFibGU7CisJCQl9IGVsc2UgeworCQkJCXR5cGVSZWYucmVzb2x2ZWRUeXBlID0gc3VwZXJUeXBlOyAvLyBob2xkIG9udG8gdGhlIHByb2JsZW0gdHlwZQorCQkJCWZpcnN0Qm91bmQ6IHsKKwkJCQkJc3dpdGNoIChzdXBlclR5cGUua2luZCgpKSB7CisJCQkJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CisJCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYm91bmRDYW5ub3RCZUFycmF5KHR5cGVSZWYsIHN1cGVyVHlwZSk7CisJCQkJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJCQlicmVhayBmaXJzdEJvdW5kOyAvLyBkbyBub3Qga2VlcCBmaXJzdCBib3VuZAorCQkJCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCQkJCQlpc0ZpcnN0Qm91bmRUeXBlVmFyaWFibGUgPSB0cnVlOworCQkJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyU3VwZXJUeXBlID0gKFR5cGVWYXJpYWJsZUJpbmRpbmcpIHN1cGVyVHlwZTsKKwkJCQkJCQlpZiAodmFyU3VwZXJUeXBlLnJhbmsgPj0gdHlwZVZhcmlhYmxlLnJhbmsgJiYgdmFyU3VwZXJUeXBlLmRlY2xhcmluZ0VsZW1lbnQgPT0gdHlwZVZhcmlhYmxlLmRlY2xhcmluZ0VsZW1lbnQpIHsKKwkJCQkJCQkJaWYgKGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA8PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82KSB7CisJCQkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5mb3J3YXJkVHlwZVZhcmlhYmxlUmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXIsIHZhclN1cGVyVHlwZSk7CisJCQkJCQkJCQl0eXBlVmFyaWFibGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQkJCQkJYnJlYWsgZmlyc3RCb3VuZDsgLy8gZG8gbm90IGtlZXAgZmlyc3QgYm91bmQKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NzUxCisJCQkJCQkJaWYgKGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYpIHsKKwkJCQkJCQkJaWYgKHR5cGVWYXJpYWJsZS5yYW5rID49IHZhclN1cGVyVHlwZS5yYW5rICYmIHZhclN1cGVyVHlwZS5kZWNsYXJpbmdFbGVtZW50ID09IHR5cGVWYXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50KSB7CisJCQkJCQkJCQlTaW1wbGVTZXQgc2V0ID0gbmV3IFNpbXBsZVNldCh0eXBlUGFyYW1ldGVycy5sZW5ndGgpOworCQkJCQkJCQkJc2V0LmFkZCh0eXBlVmFyaWFibGUpOworCQkJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlckJpbmRpbmcgPSB2YXJTdXBlclR5cGU7CisJCQkJCQkJCQl3aGlsZSAoc3VwZXJCaW5kaW5nIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykgeworCQkJCQkJCQkJCWlmIChzZXQuaW5jbHVkZXMoc3VwZXJCaW5kaW5nKSkgeworCQkJCQkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eSh0eXBlVmFyaWFibGUsIHZhclN1cGVyVHlwZSwgdHlwZVJlZik7CisJCQkJCQkJCQkJCXR5cGVWYXJpYWJsZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCQkJCQkJCWJyZWFrIGZpcnN0Qm91bmQ7IC8vIGRvIG5vdCBrZWVwIGZpcnN0IGJvdW5kCisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJc2V0LmFkZChzdXBlckJpbmRpbmcpOworCQkJCQkJCQkJCQlzdXBlckJpbmRpbmcgPSAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpc3VwZXJCaW5kaW5nKS5zdXBlcmNsYXNzOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZSkuaXNGaW5hbCgpKSB7CisJCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmZpbmFsVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUsIHR5cGVSZWYpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyUmVmVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBzdXBlclR5cGU7CisJCQkJCWlmICghc3VwZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCXR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzID0gc3VwZXJSZWZUeXBlOworCQkJCQl9IGVsc2UgeworCQkJCQkJdHlwZVZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW10ge3N1cGVyUmVmVHlwZX07CisJCQkJCX0KKwkJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gc3VwZXJUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CisJCQkJCXR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID0gc3VwZXJSZWZUeXBlOyAvLyBmaXJzdCBib3VuZCB1c2VkIHRvIGNvbXB1dGUgZXJhc3VyZQogCQkJCX0KIAkJCX0KLQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJSZWZUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZTsKLQkJCWlmIChzdXBlclJlZlR5cGUuaXNGaW5hbCgpKQotCQkJCXByb2JsZW1SZXBvcnRlcigpLmZpbmFsVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUsIHR5cGVSZWYpOwotCQkJaWYgKCFzdXBlclR5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJCXR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzID0gc3VwZXJSZWZUeXBlOwotCQkJfSBlbHNlIHsKLQkJCQl0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7c3VwZXJSZWZUeXBlfTsKLQkJCX0KLQkJCXR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID0gc3VwZXJSZWZUeXBlOyAvLyBmaXJzdCBib3VuZCB1c2VkIHRvIGNvbXB1dGUgZXJhc3VyZQogCQkJVHlwZVJlZmVyZW5jZVtdIGJvdW5kUmVmcyA9IHR5cGVQYXJhbWV0ZXIuYm91bmRzOwogCQkJaWYgKGJvdW5kUmVmcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDAsIGJvdW5kTGVuZ3RoID0gYm91bmRSZWZzLmxlbmd0aDsgaiA8IGJvdW5kTGVuZ3RoOyBqKyspIHsKKwkJCQluZXh0Qm91bmQ6IGZvciAoaW50IGogPSAwLCBib3VuZExlbmd0aCA9IGJvdW5kUmVmcy5sZW5ndGg7IGogPCBib3VuZExlbmd0aDsgaisrKSB7CiAJCQkJCXR5cGVSZWYgPSBib3VuZFJlZnNbal07CiAJCQkJCXN1cGVyVHlwZSA9IHRoaXMua2luZCA9PSBNRVRIT0RfU0NPUEUKIAkJCQkJCT8gdHlwZVJlZi5yZXNvbHZlVHlwZSgoQmxvY2tTY29wZSl0aGlzLCBmYWxzZSkKIAkJCQkJCTogdHlwZVJlZi5yZXNvbHZlVHlwZSgoQ2xhc3NTY29wZSl0aGlzKTsKIAkJCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKSB7CiAJCQkJCQl0eXBlVmFyaWFibGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOwotCQkJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOwotCQkJCQkJY29udGludWUgbmV4dFZhcmlhYmxlOwotCQkJCQl9Ci0JCQkJCXR5cGVSZWYucmVzb2x2ZWRUeXBlID0gc3VwZXJUeXBlOyAvLyBob2xkIG9udG8gdGhlIHByb2JsZW0gdHlwZQotCQkJCQlpZiAoaXNUeXBlVmFyaWFibGVGaXJzdEJvdW5kICYmIGogPT0gMCkgewotCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkubm9BZGRpdGlvbmFsQm91bmRBZnRlclR5cGVWYXJpYWJsZSh0eXBlUmVmKTsKLQkJCQkJfQotCQkJCQlpZiAoc3VwZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmJvdW5kQ2Fubm90QmVBcnJheSh0eXBlUmVmLCBzdXBlclR5cGUpOwotCQkJCQkJY29udGludWUgbmV4dFZhcmlhYmxlOwotCQkJCQl9Ci0JCQkJCXN1cGVyUmVmVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBzdXBlclR5cGU7Ci0JCQkJCWlmICghc3VwZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmJvdW5kTXVzdEJlQW5JbnRlcmZhY2UodHlwZVJlZiwgc3VwZXJUeXBlKTsKLQkJCQkJCXR5cGVWYXJpYWJsZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7Ci0JCQkJCQlub1Byb2JsZW1zID0gZmFsc2U7Ci0JCQkJCQljb250aW51ZSBuZXh0VmFyaWFibGU7Ci0JCQkJCX0KLQkJCQkJLy8gY2hlY2sgYWdhaW5zdCBzdXBlcmNsYXNzCi0JCQkJCWlmIChjaGVja0ZvckVyYXNlZENhbmRpZGF0ZUNvbGxpc2lvbnMgJiYgdHlwZVZhcmlhYmxlLmZpcnN0Qm91bmQgPT0gdHlwZVZhcmlhYmxlLnN1cGVyY2xhc3MpIHsKLQkJCQkJCWlmIChoYXNFcmFzZWRDYW5kaWRhdGVzQ29sbGlzaW9ucyhzdXBlclR5cGUsIHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzLCBpbnZvY2F0aW9ucywgdHlwZVZhcmlhYmxlLCB0eXBlUmVmKSkgewotCQkJCQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsKLQkJCQkJCQljb250aW51ZSBuZXh0VmFyaWFibGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gY2hlY2sgYWdhaW5zdCBzdXBlcmludGVyZmFjZXMKLQkJCQkJZm9yIChpbnQgaW5kZXggPSB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOykgewotCQkJCQkJUmVmZXJlbmNlQmluZGluZyBwcmV2aW91c0ludGVyZmFjZSA9IHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXNbaW5kZXhdOwotCQkJCQkJaWYgKHByZXZpb3VzSW50ZXJmYWNlID09IHN1cGVyUmVmVHlwZSkgewotCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUJvdW5kcyh0eXBlUmVmLCBzdXBlclR5cGUpOworCQkJCQkJY29udGludWUgbmV4dEJvdW5kOworCQkJCQl9IGVsc2UgeworCQkJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gc3VwZXJUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CisJCQkJCQlib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbiA9ICF0eXBlUmVmLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpOworCQkJCQkJaWYgKGlzRmlyc3RCb3VuZFR5cGVWYXJpYWJsZSAmJiBqID09IDApIHsKKwkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub0FkZGl0aW9uYWxCb3VuZEFmdGVyVHlwZVZhcmlhYmxlKHR5cGVSZWYpOwogCQkJCQkJCXR5cGVWYXJpYWJsZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7Ci0JCQkJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOwotCQkJCQkJCWNvbnRpbnVlIG5leHRWYXJpYWJsZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChjaGVja0ZvckVyYXNlZENhbmRpZGF0ZUNvbGxpc2lvbnMpIHsKLQkJCQkJCQlpZiAoaGFzRXJhc2VkQ2FuZGlkYXRlc0NvbGxpc2lvbnMoc3VwZXJUeXBlLCBwcmV2aW91c0ludGVyZmFjZSwgaW52b2NhdGlvbnMsIHR5cGVWYXJpYWJsZSwgdHlwZVJlZikpIHsKLQkJCQkJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOwotCQkJCQkJCQljb250aW51ZSBuZXh0VmFyaWFibGU7CisJCQkJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gdHJ1ZTsKKwkJCQkJCQkvL2NvbnRpbnVlIG5leHRCb3VuZDsgLSBrZWVwIHRoZXNlIGJvdW5kcyB0byBtaW5pbWl6ZSBzZWNvbmRhcnkgZXJyb3JzCisJCQkJCQl9IGVsc2UgaWYgKHN1cGVyVHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQkJCQkJaWYgKCFkaWRBbHJlYWR5Q29tcGxhaW4pIHsKKwkJCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYm91bmRDYW5ub3RCZUFycmF5KHR5cGVSZWYsIHN1cGVyVHlwZSk7CisJCQkJCQkJCXR5cGVWYXJpYWJsZS50YWdCaXRzIHw9IFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCQkJfQorCQkJCQkJCWNvbnRpbnVlIG5leHRCb3VuZDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKCFzdXBlclR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJCQlpZiAoIWRpZEFscmVhZHlDb21wbGFpbikgeworCQkJCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYm91bmRNdXN0QmVBbkludGVyZmFjZSh0eXBlUmVmLCBzdXBlclR5cGUpOworCQkJCQkJCQkJdHlwZVZhcmlhYmxlLnRhZ0JpdHMgfD0gVGFnQml0cy5IaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJCQkJfQorCQkJCQkJCQljb250aW51ZSBuZXh0Qm91bmQ7CiAJCQkJCQkJfQogCQkJCQkJfQorCQkJCQkJLy8gY2hlY2sgYWdhaW5zdCBzdXBlcmNsYXNzCisJCQkJCQlpZiAoY2hlY2tGb3JFcmFzZWRDYW5kaWRhdGVDb2xsaXNpb25zICYmIHR5cGVWYXJpYWJsZS5maXJzdEJvdW5kID09IHR5cGVWYXJpYWJsZS5zdXBlcmNsYXNzKSB7CisJCQkJCQkJaWYgKGhhc0VyYXNlZENhbmRpZGF0ZXNDb2xsaXNpb25zKHN1cGVyVHlwZSwgdHlwZVZhcmlhYmxlLnN1cGVyY2xhc3MsIGludm9jYXRpb25zLCB0eXBlVmFyaWFibGUsIHR5cGVSZWYpKSB7CisJCQkJCQkJCWNvbnRpbnVlIG5leHRCb3VuZDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBjaGVjayBhZ2FpbnN0IHN1cGVyaW50ZXJmYWNlcworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlclJlZlR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJUeXBlOworCQkJCQkJZm9yIChpbnQgaW5kZXggPSB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOykgeworCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcHJldmlvdXNJbnRlcmZhY2UgPSB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzW2luZGV4XTsKKwkJCQkJCQlpZiAocHJldmlvdXNJbnRlcmZhY2UgPT0gc3VwZXJSZWZUeXBlKSB7CisJCQkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUJvdW5kcyh0eXBlUmVmLCBzdXBlclR5cGUpOworCQkJCQkJCQl0eXBlVmFyaWFibGUudGFnQml0cyB8PSBUYWdCaXRzLkhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQkJCQljb250aW51ZSBuZXh0Qm91bmQ7CisJCQkJCQkJfQorCQkJCQkJCWlmIChjaGVja0ZvckVyYXNlZENhbmRpZGF0ZUNvbGxpc2lvbnMpIHsKKwkJCQkJCQkJaWYgKGhhc0VyYXNlZENhbmRpZGF0ZXNDb2xsaXNpb25zKHN1cGVyVHlwZSwgcHJldmlvdXNJbnRlcmZhY2UsIGludm9jYXRpb25zLCB0eXBlVmFyaWFibGUsIHR5cGVSZWYpKSB7CisJCQkJCQkJCQljb250aW51ZSBuZXh0Qm91bmQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpbnQgc2l6ZSA9IHR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXMubGVuZ3RoOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLCAwLCB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZSArIDFdLCAwLCBzaXplKTsKKwkJCQkJCXR5cGVWYXJpYWJsZS5zdXBlckludGVyZmFjZXNbc2l6ZV0gPSBzdXBlclJlZlR5cGU7CiAJCQkJCX0KLQkJCQkJaW50IHNpemUgPSB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzLCAwLCB0eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbc2l6ZSArIDFdLCAwLCBzaXplKTsKLQkJCQkJdHlwZVZhcmlhYmxlLnN1cGVySW50ZXJmYWNlc1tzaXplXSA9IHN1cGVyUmVmVHlwZTsKIAkJCQl9CiAJCQl9CisJCQlub1Byb2JsZW1zICY9ICh0eXBlVmFyaWFibGUudGFnQml0cyAmIFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXMpID09IDA7CiAJCX0KIAkJcmV0dXJuIG5vUHJvYmxlbXM7CiAJfQpAQCAtNTY2LDggKzc1MCw4IEBACiAJfQogCiAJcHVibGljIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSBjcmVhdGVUeXBlVmFyaWFibGVzKFR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycywgQmluZGluZyBkZWNsYXJpbmdFbGVtZW50KSB7Ci0JCS8vIGRvIG5vdCBjb25zdHJ1Y3QgdHlwZSB2YXJpYWJsZXMgaWYgc291cmNlIDwgMS41Ci0JCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg1MCwgSWYgdGhleSBleGlzdCBhdCBhbGwsIHByb2Nlc3MgdHlwZSBwYXJhbWV0ZXJzIGlycmVzcGVjdGl2ZSBvZiBzb3VyY2UgbGV2ZWwuCisJCWlmICh0eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKQogCQkJcmV0dXJuIEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CiAKIAkJUGFja2FnZUJpbmRpbmcgdW5pdFBhY2thZ2UgPSBjb21waWxhdGlvblVuaXRTY29wZSgpLmZQYWNrYWdlOwpAQCAtNTc2LDcgKzc2MCw3IEBACiAJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2ldOwotCQkJVHlwZVZhcmlhYmxlQmluZGluZyBwYXJhbWV0ZXJCaW5kaW5nID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmcodHlwZVBhcmFtZXRlci5uYW1lLCBkZWNsYXJpbmdFbGVtZW50LCBpKTsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA9IG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKHR5cGVQYXJhbWV0ZXIubmFtZSwgZGVjbGFyaW5nRWxlbWVudCwgaSwgZW52aXJvbm1lbnQoKSk7CiAJCQlwYXJhbWV0ZXJCaW5kaW5nLmZQYWNrYWdlID0gdW5pdFBhY2thZ2U7CiAJCQl0eXBlUGFyYW1ldGVyLmJpbmRpbmcgPSBwYXJhbWV0ZXJCaW5kaW5nOwogCkBAIC01ODcsNyArNzcxLDcgQEAKIAkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlVHlwZVBhcmFtZXRlckluVHlwZSh0eXBlUGFyYW1ldGVyKTsKIAkJCX0KIAkJCXR5cGVWYXJpYWJsZUJpbmRpbmdzW2NvdW50KytdID0gcGFyYW1ldGVyQmluZGluZzsKLS8vCQkJCVRPRE8gc2hvdWxkIG9mZmVyIHdhcm5pbmdzIHRvIGluZm9ybSBhYm91dCBoaWRpbmcgZGVjbGFyaW5nLCBlbmNsb3Npbmcgb3IgbWVtYmVyIHR5cGVzCQkJCQorLy8JCQkJVE9ETyBzaG91bGQgb2ZmZXIgd2FybmluZ3MgdG8gaW5mb3JtIGFib3V0IGhpZGluZyBkZWNsYXJpbmcsIGVuY2xvc2luZyBvciBtZW1iZXIgdHlwZXMKIC8vCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHNvdXJjZVR5cGU7CiAvLwkJCQkvLyBjaGVjayB0aGF0IHRoZSBtZW1iZXIgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbiBlbmNsb3NpbmcgdHlwZQogLy8JCQkJZG8gewpAQCAtNjE3LDcgKzgwMSw3IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7IC8vIG1heSBhbnN3ZXIgbnVsbCBpZiBubyB0eXBlIGFyb3VuZAogCX0KLQkKKwogCXB1YmxpYyBmaW5hbCBNZXRob2RTY29wZSBlbmNsb3NpbmdNZXRob2RTY29wZSgpIHsKIAkJU2NvcGUgc2NvcGUgPSB0aGlzOwogCQl3aGlsZSAoKHNjb3BlID0gc2NvcGUucGFyZW50KSAhPSBudWxsKSB7CkBAIC02NzgsNyArODYyLDcgQEAKIAogCS8vIGFic3RyYWN0IG1ldGhvZCBsb29rdXAgbG9va3VwIChzaW5jZSBtYXliZSBtaXNzaW5nIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcykKIAlwcm90ZWN0ZWQgTWV0aG9kQmluZGluZyBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAogCQljaGFyW10gc2VsZWN0b3IsCiAJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywKIAkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCkBAIC02ODksNyArODczLDcgQEAKIAkJaW50IHN0YXJ0Rm91bmRTaXplID0gZm91bmQuc2l6ZTsKIAkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGNsYXNzSGllcmFyY2h5U3RhcnQ7CiAJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlmaW5kTWV0aG9kSW5TdXBlckludGVyZmFjZXMoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBmb3VuZCk7CisJCQlmaW5kTWV0aG9kSW5TdXBlckludGVyZmFjZXMoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBmb3VuZCwgaW52b2NhdGlvblNpdGUpOwogCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CiAJCX0KIAkJTWV0aG9kQmluZGluZ1tdIGNhbmRpZGF0ZXMgPSBudWxsOwpAQCAtNzAzLDkgKzg4Nyw4IEBACiAJCQkJTWV0aG9kQmluZGluZyBjb21wYXRpYmxlTWV0aG9kID0gY29tcHV0ZUNvbXBhdGlibGVNZXRob2QobWV0aG9kQmluZGluZywgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOwogCQkJCWlmIChjb21wYXRpYmxlTWV0aG9kICE9IG51bGwpIHsKIAkJCQkJaWYgKGNvbXBhdGlibGVNZXRob2QuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJaWYgKGNvbmNyZXRlTWF0Y2ggIT0gbnVsbCAmJiBjb25jcmV0ZU1hdGNoLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoY29tcGF0aWJsZU1ldGhvZC5kZWNsYXJpbmdDbGFzcykgIT0gbnVsbCkKLQkJCQkJCQlpZiAoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpLmRvZXNNZXRob2RPdmVycmlkZShjb25jcmV0ZU1hdGNoLCBjb21wYXRpYmxlTWV0aG9kKSkKLQkJCQkJCQkJY29udGludWU7IC8vIGNhbiBza2lwIHRoaXMgbWV0aG9kIHNpbmNlIGNvbmNyZXRlTWF0Y2ggb3ZlcnJpZGVzIGl0CisJCQkJCQlpZiAoY29uY3JldGVNYXRjaCAhPSBudWxsICYmIGVudmlyb25tZW50KCkubWV0aG9kVmVyaWZpZXIoKS5hcmVNZXRob2RzQ29tcGF0aWJsZShjb25jcmV0ZU1hdGNoLCBjb21wYXRpYmxlTWV0aG9kKSkKKwkJCQkJCQljb250aW51ZTsgLy8gY2FuIHNraXAgdGhpcyBtZXRob2Qgc2luY2UgY29uY3JldGVNYXRjaCBvdmVycmlkZXMgaXQKIAkJCQkJCWlmIChjYW5kaWRhdGVzQ291bnQgPT0gMCkgewogCQkJCQkJCWNhbmRpZGF0ZXMgPSBuZXcgTWV0aG9kQmluZGluZ1tmb3VuZFNpemUgLSBzdGFydEZvdW5kU2l6ZSArIDFdOwogCQkJCQkJCWlmIChjb25jcmV0ZU1hdGNoICE9IG51bGwpCkBAIC03NDUsMzYgKzkyOCw1MyBAQAogCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBlbmNsb3NpbmdUeXBlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpOwogCQlpZiAobWVtYmVyVHlwZSAhPSBudWxsKSB7CiAJCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZShtZW1iZXJUeXBlKTsKLQkJCWlmIChlbmNsb3NpbmdSZWNlaXZlclR5cGUgPT0gbnVsbAotCQkJCT8gbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShnZXRDdXJyZW50UGFja2FnZSgpKQotCQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdSZWNlaXZlclR5cGUpKQorCQkJaWYgKGVuY2xvc2luZ1JlY2VpdmVyVHlwZSA9PSBudWxsKSB7CisJCQkJaWYgKG1lbWJlclR5cGUuY2FuQmVTZWVuQnkoZ2V0Q3VycmVudFBhY2thZ2UoKSkpIHsKIAkJCQkJcmV0dXJuIG1lbWJlclR5cGU7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBtZW1iZXJUeXBlLCBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKKwkJCQl9CisJCQkJLy8gbWF5YmUgc29tZSB0eXBlIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGV4dGVuZGluZyBzb21lIGNsYXNzIGluIHNvbWUgcGFja2FnZQorCQkJCS8vIGFuZCB0aGUgc2VsZWN0aW9uIGlzIGZvciBzb21lIHByb3RlY3RlZCBpbm5lciBjbGFzcyBvZiB0aGF0IHN1cGVyY2xhc3MKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NjU4CisJCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXRTY29wZSkgeworCQkJCQlUeXBlRGVjbGFyYXRpb25bXSB0eXBlcyA9ICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpdGhpcykucmVmZXJlbmNlQ29udGV4dC50eXBlczsKKwkJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkJCWlmIChtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIHR5cGVzW2ldLmJpbmRpbmcpKSB7CisJCQkJCQkJCXJldHVybiBtZW1iZXJUeXBlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAobWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdSZWNlaXZlclR5cGUpKSB7CisJCQkJcmV0dXJuIG1lbWJlclR5cGU7CisJCQl9CisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyW11bXXt0eXBlTmFtZX0sIG1lbWJlclR5cGUsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8vIEludGVybmFsIHVzZSBvbmx5Ci0JcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZEV4YWN0TWV0aG9kKAotCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKLQkJY2hhcltdIHNlbGVjdG9yLAotCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsCi0JCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7Ci0KKwlwdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kRXhhY3RNZXRob2QoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsIGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwogCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZXMoYXJndW1lbnRUeXBlcyk7CiAJCU1ldGhvZEJpbmRpbmcgZXhhY3RNZXRob2QgPSByZWNlaXZlclR5cGUuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHVuaXRTY29wZSk7CiAJCWlmIChleGFjdE1ldGhvZCAhPSBudWxsICYmIGV4YWN0TWV0aG9kLnR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUyAmJiAhZXhhY3RNZXRob2QuaXNCcmlkZ2UoKSkgeworCQkJLy8gaW4gPj0gMS41IG1vZGUsIGVuc3VyZSB0aGUgZXhhY3RNYXRjaCBkaWQgbm90IG1hdGNoIHJhdyB0eXBlcworCQkJaWYgKGNvbXBpbGVyT3B0aW9ucygpLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpCisJCQkJZm9yIChpbnQgaSA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQkJCWlmIChpc1Bvc3NpYmxlU3VidHlwZU9mUmF3VHlwZShhcmd1bWVudFR5cGVzW2ldKSkKKwkJCQkJCXJldHVybiBudWxsOwogCQkJLy8gbXVzdCBmaW5kIGJvdGggbWV0aG9kcyBmb3IgdGhpcyBjYXNlOiA8UyBleHRlbmRzIEE+IHZvaWQgZm9vKCkge30gIGFuZCAgPE4gZXh0ZW5kcyBCPiBOIGZvbygpIHsgcmV0dXJuIG51bGw7IH0KIAkJCS8vIG9yIGZpbmQgYW4gaW5oZXJpdGVkIG1ldGhvZCB3aGVuIHRoZSBleGFjdCBtYXRjaCBpcyB0byBhIGJyaWRnZSBtZXRob2QKIAkJCXVuaXRTY29wZS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhleGFjdE1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsKKwkJCWlmIChleGFjdE1ldGhvZC5pc0Fic3RyYWN0KCkgJiYgZXhhY3RNZXRob2QudGhyb3duRXhjZXB0aW9ucyAhPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlMpCisJCQkJcmV0dXJuIG51bGw7IC8vIG1heSBuZWVkIHRvIG1lcmdlIGV4Y2VwdGlvbnMgd2l0aCBpbnRlcmZhY2UgbWV0aG9kCiAJCQkvLyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgT2JqZWN0LmdldENsYXNzKCkgaW4gMS41IG1vZGUgKHN1YnN0aXR1dGUgcGFyYW1ldGVyaXplZCByZXR1cm4gdHlwZSkKIAkJCWlmIChyZWNlaXZlclR5cGUuaXNJbnRlcmZhY2UoKSB8fCBleGFjdE1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkgewotCQkJCWlmIChyZWNlaXZlclR5cGUuaWQgIT0gVF9KYXZhTGFuZ09iamVjdAotCQkJCQkmJiBhcmd1bWVudFR5cGVzID09IEJpbmRpbmcuTk9fUEFSQU1FVEVSUwotCQkJCSAgICAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgR0VUQ0xBU1MpCisJCQkJaWYgKGFyZ3VtZW50VHlwZXMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTCisJCQkJICAgICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLkdFVENMQVNTKQogCQkJCSAgICAmJiBleGFjdE1ldGhvZC5yZXR1cm5UeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKS8qMS41Ki8pIHsKLQkJCQkJCXJldHVybiBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5pbnN0YW50aWF0ZUdldENsYXNzKHJlY2VpdmVyVHlwZSwgZXhhY3RNZXRob2QsIHRoaXMpOworCQkJCQkJcmV0dXJuIGVudmlyb25tZW50KCkuY3JlYXRlR2V0Q2xhc3NNZXRob2QocmVjZWl2ZXJUeXBlLCBleGFjdE1ldGhvZCwgdGhpcyk7CiAJCQkgICAgfQogCQkJCS8vIHRhcmdldGluZyBhIGdlbmVyaWMgbWV0aG9kIGNvdWxkIGZpbmQgYW4gZXhhY3QgbWF0Y2ggd2l0aCB2YXJpYWJsZSByZXR1cm4gdHlwZQogCQkJCWlmIChpbnZvY2F0aW9uU2l0ZS5nZW5lcmljVHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKQEAgLTc4NSw3ICs5ODUsNiBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQogCS8vIEludGVybmFsIHVzZSBvbmx5CiAJLyoJQW5zd2VyIHRoZSBmaWVsZCBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGROYW1lLgogCQlTdGFydCB0aGUgbG9va3VwIGF0IHRoZSByZWNlaXZlclR5cGUuCkBAIC03OTMsMjAgKzk5MiwzNCBAQAogCQkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIGZpZWxkIGlzIHZpc2libGUuCiAJCU9ubHkgZmllbGRzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyVHlwZSBvciBpdHMgc3VwZXJ0eXBlcyBhcmUgYW5zd2VyZWQ7CiAJCWEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIHR5cGUgd2lsbCBub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBBUEkuCi0JCisgICAgCUlmIG5vIHZpc2libGUgZmllbGQgaXMgZGlzY292ZXJlZCwgbnVsbCBpcyBhbnN3ZXJlZC4KKwkgKi8KKwlwdWJsaWMgRmllbGRCaW5kaW5nIGZpbmRGaWVsZChUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIGNoYXJbXSBmaWVsZE5hbWUsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLCBib29sZWFuIG5lZWRSZXNvbHZlKSB7CisJCXJldHVybiBmaW5kRmllbGQocmVjZWl2ZXJUeXBlLCBmaWVsZE5hbWUsIGludm9jYXRpb25TaXRlLCBuZWVkUmVzb2x2ZSwgZmFsc2UpOworCX0KKwkvLyBJbnRlcm5hbCB1c2Ugb25seQorCS8qCUFuc3dlciB0aGUgZmllbGQgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIGZpZWxkTmFtZS4KKwkJU3RhcnQgdGhlIGxvb2t1cCBhdCB0aGUgcmVjZWl2ZXJUeXBlLgorCQlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzCisJCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgZmllbGQgaXMgdmlzaWJsZS4KKwkJT25seSBmaWVsZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXJUeXBlIG9yIGl0cyBzdXBlcnR5cGVzIGFyZSBhbnN3ZXJlZDsKKwkJYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgdHlwZSB3aWxsIG5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIEFQSS4KKyAgICAgICAgSWYgdGhlIHBhcmFtZXRlciBpbnZpc2libGVGaWVsZHNPayBpcyB0cnVlLCB2aXNpYmlsaXR5IGNoZWNrcyBoYXZlIG5vdCBiZWVuIHJ1biBvbgorICAgICAgICBhbnkgcmV0dXJuZWQgZmllbGRzLiBUaGUgY2FsbGVyIG5lZWRzIHRvIGFwcGx5IHRoZXNlIGNoZWNrcyBhcyBuZWVkZWQuIE90aGVyd2lzZSwKIAkJSWYgbm8gdmlzaWJsZSBmaWVsZCBpcyBkaXNjb3ZlcmVkLCBudWxsIGlzIGFuc3dlcmVkLgogCSovCi0JcHVibGljIEZpZWxkQmluZGluZyBmaW5kRmllbGQoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBjaGFyW10gZmllbGROYW1lLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgYm9vbGVhbiBuZWVkUmVzb2x2ZSkgeworCXB1YmxpYyBGaWVsZEJpbmRpbmcgZmluZEZpZWxkKFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIGZpZWxkTmFtZSwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsIGJvb2xlYW4gbmVlZFJlc29sdmUsIGJvb2xlYW4gaW52aXNpYmxlRmllbGRzT2spIHsKIAogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwogCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZShyZWNlaXZlclR5cGUpOwotCQkKKwogCQljaGVja0FycmF5RmllbGQ6IHsKIAkJCVR5cGVCaW5kaW5nIGxlYWZUeXBlOwogCQkJc3dpdGNoIChyZWNlaXZlclR5cGUua2luZCgpKSB7CiAJCQkJY2FzZSBCaW5kaW5nLkJBU0VfVFlQRSA6CiAJCQkJCXJldHVybiBudWxsOwogCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CiAJCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDogLy8gY2FwdHVyZQogCQkJCQlUeXBlQmluZGluZyByZWNlaXZlckVyYXN1cmUgPSByZWNlaXZlclR5cGUuZXJhc3VyZSgpOwogCQkJCQlpZiAoIXJlY2VpdmVyRXJhc3VyZS5pc0FycmF5VHlwZSgpKQpAQCAtODIyLDggKzEwMzUsMTIgQEAKIAkJCWlmIChsZWFmVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpCiAJCQkJaWYgKCEoKFJlZmVyZW5jZUJpbmRpbmcpIGxlYWZUeXBlKS5jYW5CZVNlZW5CeSh0aGlzKSkKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKWxlYWZUeXBlLCBmaWVsZE5hbWUsIFByb2JsZW1SZWFzb25zLlJlY2VpdmVyVHlwZU5vdFZpc2libGUpOwotCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkTmFtZSwgTEVOR1RIKSkKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZE5hbWUsIFR5cGVDb25zdGFudHMuTEVOR1RIKSkgeworCQkJCWlmICgobGVhZlR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKEFycmF5QmluZGluZy5BcnJheUxlbmd0aCwgbnVsbCwgZmllbGROYW1lLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQkJfQogCQkJCXJldHVybiBBcnJheUJpbmRpbmcuQXJyYXlMZW5ndGg7CisJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCkBAIC04MzEsOSArMTA0OCwxNSBAQAogCQlpZiAoIWN1cnJlbnRUeXBlLmNhbkJlU2VlbkJ5KHRoaXMpKQogCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGN1cnJlbnRUeXBlLCBmaWVsZE5hbWUsIFByb2JsZW1SZWFzb25zLlJlY2VpdmVyVHlwZU5vdFZpc2libGUpOwogCisJCWN1cnJlbnRUeXBlLmluaXRpYWxpemVGb3JTdGF0aWNJbXBvcnRzKCk7CiAJCUZpZWxkQmluZGluZyBmaWVsZCA9IGN1cnJlbnRUeXBlLmdldEZpZWxkKGZpZWxkTmFtZSwgbmVlZFJlc29sdmUpOworCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2NDU2CisJCWJvb2xlYW4gaW5zaWRlVHlwZUFubm90YXRpb25zID0gdGhpcyBpbnN0YW5jZW9mIE1ldGhvZFNjb3BlICYmICgoTWV0aG9kU2NvcGUpIHRoaXMpLmluc2lkZVR5cGVBbm5vdGF0aW9uOwogCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJaWYgKGludm9jYXRpb25TaXRlID09IG51bGwKKwkJCWlmIChpbnZpc2libGVGaWVsZHNPaykgeworCQkJCXJldHVybiBmaWVsZDsKKwkJCX0KKwkJCWlmIChpbnZvY2F0aW9uU2l0ZSA9PSBudWxsIHx8IGluc2lkZVR5cGVBbm5vdGF0aW9ucwogCQkJCT8gZmllbGQuY2FuQmVTZWVuQnkoZ2V0Q3VycmVudFBhY2thZ2UoKSkKIAkJCQk6IGZpZWxkLmNhbkJlU2VlbkJ5KGN1cnJlbnRUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCiAJCQkJCXJldHVybiBmaWVsZDsKQEAgLTg0OCwxMCArMTA3MSw2IEBACiAJCS8vIHdlIGNvdWxkIGhvbGQgb250byB0aGUgbm90IHZpc2libGUgZmllbGQgZm9yIGV4dHJhIGVycm9yIHJlcG9ydGluZwogCQl3aGlsZSAoa2VlcExvb2tpbmcpIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7Ci0JCQlpZiAoaXRzSW50ZXJmYWNlcyA9PSBudWxsKSB7IC8vIG5lZWRlZCBmb3Igc3RhdGljYWxseSBpbXBvcnRlZCB0eXBlcyB3aGljaCBkb24ndCBrbm93IHRoZWlyIGhpZXJhcmNoeSB5ZXQKLQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSkuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKLQkJCQlpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7Ci0JCQl9CiAJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBudWxsICYmIGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKIAkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgewogCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IGl0c0ludGVyZmFjZXM7CkBAIC04NzIsNyArMTA5MSwxMiBAQAogCQkJCWJyZWFrOwogCiAJCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZShjdXJyZW50VHlwZSk7CisJCQljdXJyZW50VHlwZS5pbml0aWFsaXplRm9yU3RhdGljSW1wb3J0cygpOworCQkJY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgY3VycmVudFR5cGUuY2FwdHVyZSh0aGlzLCBpbnZvY2F0aW9uU2l0ZSA9PSBudWxsID8gMCA6IGludm9jYXRpb25TaXRlLnNvdXJjZUVuZCgpKTsKIAkJCWlmICgoZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUsIG5lZWRSZXNvbHZlKSkgIT0gbnVsbCkgeworCQkJCWlmIChpbnZpc2libGVGaWVsZHNPaykgeworCQkJCQlyZXR1cm4gZmllbGQ7CisJCQkJfQogCQkJCWtlZXBMb29raW5nID0gZmFsc2U7CiAJCQkJaWYgKGZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKSB7CiAJCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkKQEAgLTg5Miw3ICsxMTE2LDExIEBACiAJCQlkb25lIDogZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgewogCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKIAkJCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZShhbkludGVyZmFjZSk7CisJCQkJLy8gbm8gbmVlZCB0byBjYXB0dXJlIHJjdiBpbnRlcmZhY2UsIHNpbmNlIG1lbWJlciBmaWVsZCBpcyBnb2luZyB0byBiZSBzdGF0aWMgYW55d2F5CiAJCQkJaWYgKChmaWVsZCA9IGFuSW50ZXJmYWNlLmdldEZpZWxkKGZpZWxkTmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKKwkJCQkJaWYgKGludmlzaWJsZUZpZWxkc09rKSB7CisJCQkJCQlyZXR1cm4gZmllbGQ7CisJCQkJCX0KIAkJCQkJaWYgKHZpc2libGVGaWVsZCA9PSBudWxsKSB7CiAJCQkJCQl2aXNpYmxlRmllbGQgPSBmaWVsZDsKIAkJCQkJfSBlbHNlIHsKQEAgLTkyNSw3ICsxMTUzLDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAkvLyBJbnRlcm5hbCB1c2Ugb25seQogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGZpbmRNZW1iZXJUeXBlKGNoYXJbXSB0eXBlTmFtZSwgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CiAJCWlmICgoZW5jbG9zaW5nVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNOb01lbWJlclR5cGVzKSAhPSAwKQpAQCAtOTM4LDExICsxMTY2LDExIEBACiAJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGVuY2xvc2luZ1R5cGUuZ2V0TWVtYmVyVHlwZSh0eXBlTmFtZSk7CiAJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsKIAkJCXVuaXRTY29wZS5yZWNvcmRUeXBlUmVmZXJlbmNlKG1lbWJlclR5cGUpOwotCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbAorCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbCB8fCAodGhpcy5wYXJlbnQgPT0gdW5pdFNjb3BlICYmIChlbmNsb3NpbmdTb3VyY2VUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLlR5cGVWYXJpYWJsZXNBcmVDb25uZWN0ZWQpID09IDApCiAJCQkJPyBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGN1cnJlbnRQYWNrYWdlKQogCQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdTb3VyY2VUeXBlKSkKIAkJCQkJcmV0dXJuIG1lbWJlclR5cGU7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBtZW1iZXJUeXBlLCBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde3R5cGVOYW1lfSwgbWVtYmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSk7CiAJCX0KIAogCQkvLyBjb2xsZWN0IGFsbCBzdXBlcmludGVyZmFjZXMgb2YgcmVjZWl2ZXJUeXBlIHVudGlsIHRoZSBtZW1iZXJUeXBlIGlzIGZvdW5kIGluIGEgc3VwZXJ0eXBlCkBAIC05OTMsNyArMTIyMSw3IEBACiAJCQkJCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgPT0gbnVsbCkKIAkJCQkJCQl2aXNpYmxlTWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7CiAJCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgdmlzaWJsZU1lbWJlclR5cGUsIFByb2JsZW1SZWFzb25zLkFtYmlndW91cyk7CisJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117dHlwZU5hbWV9LCB2aXNpYmxlTWVtYmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzKTsKIAkJCQl9IGVsc2UgewogCQkJCQlub3RWaXNpYmxlID0gbWVtYmVyVHlwZTsKIAkJCQl9CkBAIC0xMDEwLDcgKzEyMzgsNyBAQAogCQkJCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgPT0gbnVsbCkgewogCQkJCQkJdmlzaWJsZU1lbWJlclR5cGUgPSBtZW1iZXJUeXBlOwogCQkJCQl9IGVsc2UgewotCQkJCQkJYW1iaWd1b3VzID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCB2aXNpYmxlTWVtYmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzKTsKKwkJCQkJCWFtYmlndW91cyA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117dHlwZU5hbWV9LCB2aXNpYmxlTWVtYmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzKTsKIAkJCQkJCWJyZWFrIGRvbmU7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewpAQCAtMTAzNCwxMiArMTI2MiwxNyBAQAogCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgIT0gbnVsbCkKIAkJCXJldHVybiB2aXNpYmxlTWVtYmVyVHlwZTsKIAkJaWYgKG5vdFZpc2libGUgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIG5vdFZpc2libGUsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOworCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117dHlwZU5hbWV9LCBub3RWaXNpYmxlLCBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLy8gSW50ZXJuYWwgdXNlIG9ubHkgLSB1c2UgZmluZE1ldGhvZCgpCiAJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZE1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJCXJldHVybiBmaW5kTWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBmYWxzZSk7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkgLSB1c2UgZmluZE1ldGhvZCgpCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZE1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLCBib29sZWFuIGluU3RhdGljQ29udGV4dCkgewogCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOwogCQlib29sZWFuIHJlY2VpdmVyVHlwZUlzSW50ZXJmYWNlID0gcmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCk7CiAJCU9iamVjdFZlY3RvciBmb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoMyk7CkBAIC0xMDQ4LDEwICsxMjgxLDEwIEBACiAKIAkJaWYgKHJlY2VpdmVyVHlwZUlzSW50ZXJmYWNlKSB7CiAJCQl1bml0U2NvcGUucmVjb3JkVHlwZVJlZmVyZW5jZShyZWNlaXZlclR5cGUpOwotCQkJTWV0aG9kQmluZGluZ1tdIHJlY2VpdmVyTWV0aG9kcyA9IHJlY2VpdmVyVHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsKKwkJCU1ldGhvZEJpbmRpbmdbXSByZWNlaXZlck1ldGhvZHMgPSByZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcy5sZW5ndGgpOwogCQkJaWYgKHJlY2VpdmVyTWV0aG9kcy5sZW5ndGggPiAwKQogCQkJCWZvdW5kLmFkZEFsbChyZWNlaXZlck1ldGhvZHMpOwotCQkJZmluZE1ldGhvZEluU3VwZXJJbnRlcmZhY2VzKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGZvdW5kKTsKKwkJCWZpbmRNZXRob2RJblN1cGVySW50ZXJmYWNlcyhyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBmb3VuZCwgaW52b2NhdGlvblNpdGUpOwogCQkJY3VycmVudFR5cGUgPSBnZXRKYXZhTGFuZ09iamVjdCgpOwogCQl9CiAKQEAgLTEwNjMsNyArMTI5Niw4IEBACiAJCU1ldGhvZFZlcmlmaWVyIHZlcmlmaWVyID0gZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpOwogCQl3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCkgewogCQkJdW5pdFNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOwotCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CisJCQljdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBjdXJyZW50VHlwZS5jYXB0dXJlKHRoaXMsIGludm9jYXRpb25TaXRlID09IG51bGwgPyAwIDogaW52b2NhdGlvblNpdGUuc291cmNlRW5kKCkpOworCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcy5sZW5ndGgpOwogCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7CiAJCQlpZiAoY3VycmVudExlbmd0aCA+IDApIHsKIAkJCQlpZiAoaXNDb21wbGlhbnQxNCAmJiAocmVjZWl2ZXJUeXBlSXNJbnRlcmZhY2UgfHwgZm91bmQuc2l6ZSA+IDApKSB7CkBAIC0xMDgzLDcgKzEzMTcsOSBAQAogCQkJCQkJLy8gQlVUIHdlIGNhbiBhbHNvIGlnbm9yZSBhbnkgb3ZlcnJpZGRlbiBtZXRob2Qgc2luY2Ugd2UgYWxyZWFkeSBrbm93IHRoZSBiZXR0ZXIgbWF0Y2ggKGZpeGVzIDgwMDI4KQogCQkJCQkJZm9yIChpbnQgaiA9IDAsIG1heCA9IGZvdW5kLnNpemU7IGogPCBtYXg7IGorKykgewogCQkJCQkJCU1ldGhvZEJpbmRpbmcgbWF0Y2hpbmdNZXRob2QgPSAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KGopOwotCQkJCQkJCWlmICh2ZXJpZmllci5kb2VzTWV0aG9kT3ZlcnJpZGUobWF0Y2hpbmdNZXRob2Qub3JpZ2luYWwoKSwgY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpKSkgeworCQkJCQkJCU1ldGhvZEJpbmRpbmcgbWF0Y2hpbmdPcmlnaW5hbCA9IG1hdGNoaW5nTWV0aG9kLm9yaWdpbmFsKCk7CisJCQkJCQkJTWV0aG9kQmluZGluZyBjdXJyZW50T3JpZ2luYWwgPSBtYXRjaGluZ09yaWdpbmFsLmZpbmRPcmlnaW5hbEluaGVyaXRlZE1ldGhvZChjdXJyZW50TWV0aG9kKTsKKwkJCQkJCQlpZiAoY3VycmVudE9yaWdpbmFsICE9IG51bGwgJiYgdmVyaWZpZXIuaXNQYXJhbWV0ZXJTdWJzaWduYXR1cmUobWF0Y2hpbmdPcmlnaW5hbCwgY3VycmVudE9yaWdpbmFsKSkgewogCQkJCQkJCQlpZiAoaXNDb21wbGlhbnQxNSkgewogCQkJCQkJCQkJaWYgKG1hdGNoaW5nTWV0aG9kLmlzQnJpZGdlKCkgJiYgIWN1cnJlbnRNZXRob2QuaXNCcmlkZ2UoKSkKIAkJCQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOyAvLyBrZWVwIGluaGVyaXRlZCBtZXRob2RzIHRvIGZpbmQgY29uY3JldGUgbWV0aG9kIG92ZXIgYSBicmlkZ2UgbWV0aG9kCkBAIC0xMTQ0LDggKzEzODAsMTUgQEAKIAogCQkvLyBubyBtYXRjaCB3YXMgZm91bmQKIAkJaWYgKGNhbmRpZGF0ZXNDb3VudCA9PSAwKSB7CisJCQlpZiAocHJvYmxlbU1ldGhvZCAhPSBudWxsKSB7CisJCQkJc3dpdGNoIChwcm9ibGVtTWV0aG9kLnByb2JsZW1JZCgpKSB7CisJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuVHlwZUFyZ3VtZW50c0ZvclJhd0dlbmVyaWNNZXRob2QgOgorCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLlR5cGVQYXJhbWV0ZXJBcml0eU1pc21hdGNoIDoKKwkJCQkJCXJldHVybiBwcm9ibGVtTWV0aG9kOworCQkJCX0KKwkJCX0KIAkJCS8vIGFic3RyYWN0IGNsYXNzZXMgbWF5IGdldCBhIG1hdGNoIGluIGludGVyZmFjZXM7IGZvciBub24gYWJzdHJhY3QKLQkJCS8vIGNsYXNzZXMsIHJlZHVjZXMgc2Vjb25kYXJ5IGVycm9ycyBzaW5jZSBtaXNzaW5nIGludGVyZmFjZSBtZXRob2QgCisJCQkvLyBjbGFzc2VzLCByZWR1Y2VzIHNlY29uZGFyeSBlcnJvcnMgc2luY2UgbWlzc2luZyBpbnRlcmZhY2UgbWV0aG9kCiAJCQkvLyBlcnJvciBpcyBhbHJlYWR5IHJlcG9ydGVkCiAJCQlNZXRob2RCaW5kaW5nIGludGVyZmFjZU1ldGhvZCA9CiAJCQkJZmluZERlZmF1bHRBYnN0cmFjdE1ldGhvZChyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgY2xhc3NIaWVyYXJjaHlTdGFydCwgZm91bmQsIG51bGwpOwpAQCAtMTE1Myw3ICsxMzk2LDcgQEAKIAkJCWlmIChmb3VuZC5zaXplID09IDApIHJldHVybiBudWxsOwogCQkJaWYgKHByb2JsZW1NZXRob2QgIT0gbnVsbCkgcmV0dXJuIHByb2JsZW1NZXRob2Q7CiAKLQkJCS8vIHN0aWxsIG5vIG1hdGNoOyB0cnkgdG8gZmluZCBhIGNsb3NlIG1hdGNoIHdoZW4gdGhlIHBhcmFtZXRlciAKKwkJCS8vIHN0aWxsIG5vIG1hdGNoOyB0cnkgdG8gZmluZCBhIGNsb3NlIG1hdGNoIHdoZW4gdGhlIHBhcmFtZXRlcgogCQkJLy8gb3JkZXIgaXMgd3Jvbmcgb3IgbWlzc2luZyBzb21lIHBhcmFtZXRlcnMKIAogCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTQ3MQpAQCAtMTIxMiwxNyArMTQ1NSwxOSBAQAogCQkJCQl2aXNpYmxlc0NvdW50Kys7CiAJCQkJfQogCQkJfQotCQkJaWYgKHZpc2libGVzQ291bnQgPT0gMSkgewotCQkJCWlmIChzZWFyY2hGb3JEZWZhdWx0QWJzdHJhY3RNZXRob2QpCi0JCQkJCXJldHVybiBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBmb3VuZCwgY2FuZGlkYXRlc1swXSk7Ci0JCQkJdW5pdFNjb3BlLnJlY29yZFR5cGVSZWZlcmVuY2VzKGNhbmRpZGF0ZXNbMF0udGhyb3duRXhjZXB0aW9ucyk7Ci0JCQkJcmV0dXJuIGNhbmRpZGF0ZXNbMF07Ci0JCQl9Ci0JCQlpZiAodmlzaWJsZXNDb3VudCA9PSAwKSB7Ci0JCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPQotCQkJCQlmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBmb3VuZCwgbnVsbCk7Ci0JCQkJaWYgKGludGVyZmFjZU1ldGhvZCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kOwotCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoY2FuZGlkYXRlc1swXSwgY2FuZGlkYXRlc1swXS5zZWxlY3RvciwgY2FuZGlkYXRlc1swXS5wYXJhbWV0ZXJzLCBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKTsKKwkJCXN3aXRjaCAodmlzaWJsZXNDb3VudCkgeworCQkJCWNhc2UgMCA6CisJCQkJCU1ldGhvZEJpbmRpbmcgaW50ZXJmYWNlTWV0aG9kID0KKwkJCQkJCWZpbmREZWZhdWx0QWJzdHJhY3RNZXRob2QocmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUsIGNsYXNzSGllcmFyY2h5U3RhcnQsIGZvdW5kLCBudWxsKTsKKwkJCQkJaWYgKGludGVyZmFjZU1ldGhvZCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kOworCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKGNhbmRpZGF0ZXNbMF0sIGNhbmRpZGF0ZXNbMF0uc2VsZWN0b3IsIGNhbmRpZGF0ZXNbMF0ucGFyYW1ldGVycywgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSk7CisJCQkJY2FzZSAxIDoKKwkJCQkJaWYgKHNlYXJjaEZvckRlZmF1bHRBYnN0cmFjdE1ldGhvZCkKKwkJCQkJCXJldHVybiBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBmb3VuZCwgY2FuZGlkYXRlc1swXSk7CisJCQkJCXVuaXRTY29wZS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhjYW5kaWRhdGVzWzBdLnRocm93bkV4Y2VwdGlvbnMpOworCQkJCQlyZXR1cm4gY2FuZGlkYXRlc1swXTsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIApAQCAtMTIzNiwxNSArMTQ4MSwzMyBAQAogCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIHBhcmFtZXRlcml6ZWQgbWV0aG9kcwogCQlpZiAoY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlc0NvdW50OyBpKyspIHsKLQkJCQlNZXRob2RCaW5kaW5nIGN1cnJlbnQgPSBjYW5kaWRhdGVzW2ldOwotCQkJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKQotCQkJCQljdXJyZW50ID0gKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpIGN1cnJlbnQpLm9yaWdpbmFsTWV0aG9kOwotCQkJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcpCi0JCQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHZpc2libGVzQ291bnQ7IGorKykKLQkJCQkJCWlmIChjdXJyZW50LmRlY2xhcmluZ0NsYXNzID09IGNhbmRpZGF0ZXNbal0uZGVjbGFyaW5nQ2xhc3MgJiYgY3VycmVudC5hcmVQYXJhbWV0ZXJzRXF1YWwoY2FuZGlkYXRlc1tqXSkpCi0JCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhjYW5kaWRhdGVzW2ldLCBjYW5kaWRhdGVzW2ldLnNlbGVjdG9yLCBjYW5kaWRhdGVzW2ldLnBhcmFtZXRlcnMsIFByb2JsZW1SZWFzb25zLkFtYmlndW91cyk7CisJCQkJTWV0aG9kQmluZGluZyBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2ldOworCQkJCWlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpCisJCQkJCWNhbmRpZGF0ZSA9ICgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSBjYW5kaWRhdGUpLm9yaWdpbmFsTWV0aG9kOworCQkJCWlmIChjYW5kaWRhdGUuaGFzU3Vic3RpdHV0ZWRQYXJhbWV0ZXJzKCkpIHsKKwkJCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgdmlzaWJsZXNDb3VudDsgaisrKSB7CisJCQkJCQlNZXRob2RCaW5kaW5nIG90aGVyQ2FuZGlkYXRlID0gY2FuZGlkYXRlc1tqXTsKKwkJCQkJCWlmIChvdGhlckNhbmRpZGF0ZS5oYXNTdWJzdGl0dXRlZFBhcmFtZXRlcnMoKSkgeworCQkJCQkJCWlmIChvdGhlckNhbmRpZGF0ZSA9PSBjYW5kaWRhdGUKKwkJCQkJCQkJCXx8IChjYW5kaWRhdGUuZGVjbGFyaW5nQ2xhc3MgPT0gb3RoZXJDYW5kaWRhdGUuZGVjbGFyaW5nQ2xhc3MgJiYgY2FuZGlkYXRlLmFyZVBhcmFtZXRlcnNFcXVhbChvdGhlckNhbmRpZGF0ZSkpKSB7CisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoY2FuZGlkYXRlc1tpXSwgY2FuZGlkYXRlc1tpXS5zZWxlY3RvciwgY2FuZGlkYXRlc1tpXS5wYXJhbWV0ZXJzLCBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KIAkJCX0KIAkJfQorCQlpZiAoaW5TdGF0aWNDb250ZXh0KSB7CisJCQlNZXRob2RCaW5kaW5nW10gc3RhdGljQ2FuZGlkYXRlcyA9IG5ldyBNZXRob2RCaW5kaW5nW3Zpc2libGVzQ291bnRdOworCQkJaW50IHN0YXRpY0NvdW50ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZXNDb3VudDsgaSsrKQorCQkJCWlmIChjYW5kaWRhdGVzW2ldLmlzU3RhdGljKCkpCisJCQkJCXN0YXRpY0NhbmRpZGF0ZXNbc3RhdGljQ291bnQrK10gPSBjYW5kaWRhdGVzW2ldOworCQkJaWYgKHN0YXRpY0NvdW50ID09IDEpCisJCQkJcmV0dXJuIHN0YXRpY0NhbmRpZGF0ZXNbMF07CisJCQlpZiAoc3RhdGljQ291bnQgPiAxKQorCQkJCXJldHVybiBtb3N0U3BlY2lmaWNNZXRob2RCaW5kaW5nKHN0YXRpY0NhbmRpZGF0ZXMsIHN0YXRpY0NvdW50LCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgcmVjZWl2ZXJUeXBlKTsKKwkJfQogCiAJCU1ldGhvZEJpbmRpbmcgbW9zdFNwZWNpZmljTWV0aG9kID0gbW9zdFNwZWNpZmljTWV0aG9kQmluZGluZyhjYW5kaWRhdGVzLCB2aXNpYmxlc0NvdW50LCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgcmVjZWl2ZXJUeXBlKTsKIAkJaWYgKHNlYXJjaEZvckRlZmF1bHRBYnN0cmFjdE1ldGhvZCkgeyAvLyBzZWFyY2ggaW50ZXJmYWNlcyBmb3IgYSBiZXR0ZXIgbWF0Y2gKQEAgLTEyNzgsMjEgKzE1NDEsMTQgQEAKIAkJCS8vIGhhbmRsZSB0aGUgbWV0aG9kIGNsb25lKCkgc3BlY2lhbGx5Li4uIGNhbm5vdCBiZSBwcm90ZWN0ZWQgb3IgdGhyb3cgZXhjZXB0aW9ucwogCQkJaWYgKGFyZ3VtZW50VHlwZXMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTKSB7CiAJCQkgICAgc3dpdGNoIChzZWxlY3RvclswXSkgewotCQkJICAgICAgICBjYXNlICdjJzogCi0JCQkgICAgICAgICAgICBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIENMT05FKSkgewotCQkJCQkJCXJldHVybiBuZXcgVXBkYXRlZE1ldGhvZEJpbmRpbmcoCi0JCQkJCQkJCWNvbXBpbGVyT3B0aW9ucygpLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80ID8gKFR5cGVCaW5kaW5nKXJlY2VpdmVyVHlwZSA6IChUeXBlQmluZGluZylvYmplY3QsIC8vIHJlbWVtYmVyIGl0cyBhcnJheSB0eXBlIGZvciBjb2RlZ2VuIHB1cnBvc2Ugb24gdGFyZ2V0Pj0xLjQuMAotCQkJCQkJCQkobWV0aG9kQmluZGluZy5tb2RpZmllcnMgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljLAotCQkJCQkJCQlDTE9ORSwKLQkJCQkJCQkJbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLAotCQkJCQkJCQlhcmd1bWVudFR5cGVzLAotCQkJCQkJCQludWxsLAotCQkJCQkJCQlvYmplY3QpOworCQkJICAgICAgICBjYXNlICdjJzoKKwkJCSAgICAgICAgICAgIGlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgVHlwZUNvbnN0YW50cy5DTE9ORSkpIHsKKwkJCSAgICAgICAgICAgIAlyZXR1cm4gZW52aXJvbm1lbnQoKS5jb21wdXRlQXJyYXlDbG9uZShtZXRob2RCaW5kaW5nKTsKIAkJCSAgICAgICAgICAgIH0KIAkJCSAgICAgICAgICAgIGJyZWFrOwotCQkJICAgICAgICBjYXNlICdnJzogCi0JCQkgICAgICAgICAgICBpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIEdFVENMQVNTKSAmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpLyoxLjUqLykgewotCQkJCQkJCXJldHVybiBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5pbnN0YW50aWF0ZUdldENsYXNzKHJlY2VpdmVyVHlwZSwgbWV0aG9kQmluZGluZywgdGhpcyk7CisJCQkgICAgICAgIGNhc2UgJ2cnOgorCQkJICAgICAgICAgICAgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLkdFVENMQVNTKSAmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpLyoxLjUqLykgeworCQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZUdldENsYXNzTWV0aG9kKHJlY2VpdmVyVHlwZSwgbWV0aG9kQmluZGluZywgdGhpcyk7CiAJCQkgICAgICAgICAgICB9CiAJCQkgICAgICAgICAgICBicmVhazsKIAkJCSAgICB9CkBAIC0xMzA2LDcgKzE1NjIsNyBAQAogCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBmaW5kTWV0aG9kSW5TdXBlckludGVyZmFjZXMoUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwgY2hhcltdIHNlbGVjdG9yLCBPYmplY3RWZWN0b3IgZm91bmQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaW5kTWV0aG9kSW5TdXBlckludGVyZmFjZXMoUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwgY2hhcltdIHNlbGVjdG9yLCBPYmplY3RWZWN0b3IgZm91bmQsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CiAJCWlmIChpdHNJbnRlcmZhY2VzICE9IG51bGwgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewogCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXNUb1Zpc2l0ID0gaXRzSW50ZXJmYWNlczsKQEAgLTEzMTQsNiArMTU3MCw3IEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRQb3NpdGlvbjsgaSsrKSB7CiAJCQkJY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKIAkJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UoY3VycmVudFR5cGUpOworCQkJCWN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGN1cnJlbnRUeXBlLmNhcHR1cmUodGhpcywgaW52b2NhdGlvblNpdGUgPT0gbnVsbCA/IDAgOiBpbnZvY2F0aW9uU2l0ZS5zb3VyY2VFbmQoKSk7CiAJCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CiAJCQkJaWYgKGN1cnJlbnRNZXRob2RzLmxlbmd0aCA+IDApIHsKIAkJCQkJaW50IGZvdW5kU2l6ZSA9IGZvdW5kLnNpemU7CkBAIC0xMzU3LDcgKzE2MTQsNyBAQAogCiAJCWlmICh0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQlpZiAoZGVjbGFyYXRpb25QYWNrYWdlICE9IGludm9jYXRpb25QYWNrYWdlICYmICF0eXBlQmluZGluZy5jYW5CZVNlZW5CeShpbnZvY2F0aW9uUGFja2FnZSkpCi0JCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgdHlwZUJpbmRpbmcsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOworCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde3R5cGVOYW1lfSwgdHlwZUJpbmRpbmcsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOwogCQl9CiAJCXJldHVybiB0eXBlQmluZGluZzsKIAl9CkBAIC0xMzY4LDcgKzE2MjUsNyBAQAogCX0KIAogCS8qIEFQSQotCSAqCQorCSAqCiAJICoJQW5zd2VyIHRoZSBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGFyZ3VtZW50IG5hbWUuCiAJICoJZmxhZyBpcyBhIG1hc2sgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgVkFSSUFCTEUgKD0gRklFTEQgb3IgTE9DQUwpLCBUWVBFLCBQQUNLQUdFLgogCSAqCU9ubHkgYmluZGluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWFzayBjYW4gYmUgYW5zd2VyZWQuCkBAIC0xMzk3LDcgKzE2NTQsNyBAQAogCQkJCWJvb2xlYW4gaW5zaWRlU3RhdGljQ29udGV4dCA9IGZhbHNlOwogCQkJCWJvb2xlYW4gaW5zaWRlQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CiAJCQkJYm9vbGVhbiBpbnNpZGVUeXBlQW5ub3RhdGlvbiA9IGZhbHNlOwotCQkJCQorCiAJCQkJRmllbGRCaW5kaW5nIGZvdW5kRmllbGQgPSBudWxsOwogCQkJCS8vIGNhbiBiZSBhIHByb2JsZW0gZmllbGQgd2hpY2ggaXMgYW5zd2VyZWQgaWYgYSB2YWxpZCBmaWVsZCBpcyBub3QgZm91bmQKIAkJCQlQcm9ibGVtRmllbGRCaW5kaW5nIGZvdW5kSW5zaWRlUHJvYmxlbSA9IG51bGw7CkBAIC0xNDEzLDggKzE2NzAsOCBAQAogCQkJCQkJCWluc2lkZVN0YXRpY0NvbnRleHQgfD0gbWV0aG9kU2NvcGUuaXNTdGF0aWM7CiAJCQkJCQkJaW5zaWRlQ29uc3RydWN0b3JDYWxsIHw9IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOwogCQkJCQkJCWluc2lkZVR5cGVBbm5vdGF0aW9uID0gbWV0aG9kU2NvcGUuaW5zaWRlVHlwZUFubm90YXRpb247Ci0JCQkJCQkJCi0JCQkJCQkJLy8gRmFsbCB0aHJvdWdoLi4uIGNvdWxkIGR1cGxpY2F0ZSB0aGUgY29kZSBiZWxvdyB0byBzYXZlIGEgY2FzdCAtIHF1ZXN0aW9uYWJsZSBvcHRpbWl6YXRpb24KKworCQkJCQkJCS8vJEZBTEwtVEhST1VHSCQgY291bGQgZHVwbGljYXRlIHRoZSBjb2RlIGJlbG93IHRvIHNhdmUgYSBjYXN0IC0gcXVlc3Rpb25hYmxlIG9wdGltaXphdGlvbgogCQkJCQkJY2FzZSBCTE9DS19TQ09QRSA6CiAJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gc2NvcGUuZmluZFZhcmlhYmxlKG5hbWUpOwogCQkJCQkJCS8vIGxvb2tzIGluIHRoaXMgc2NvcGUgb25seQpAQCAtMTQzNyw3ICsxNjk0LDcgQEAKIAkJCQkJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGNsYXNzU2NvcGUuZmluZEZpZWxkKHJlY2VpdmVyVHlwZSwgbmFtZSwgaW52b2NhdGlvblNpdGUsIG5lZWRSZXNvbHZlKTsKIAkJCQkJCQkJLy8gVXNlIG5leHQgbGluZSBpbnN0ZWFkIGlmIHdpbGxpbmcgdG8gZW5hYmxlIHByb3RlY3RlZCBhY2Nlc3MgYWNjcm9zcyBpbm5lciB0eXBlcwogCQkJCQkJCQkvLyBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gZmluZEZpZWxkKGVuY2xvc2luZ1R5cGUsIG5hbWUsIGludm9jYXRpb25TaXRlKTsKLQkJCQkJCQkJCisKIAkJCQkJCQkJaWYgKGZpZWxkQmluZGluZyAhPSBudWxsKSB7IC8vIHNraXAgaXQgaWYgd2UgZGlkIG5vdCBmaW5kIGFueXRoaW5nCiAJCQkJCQkJCQlpZiAoZmllbGRCaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLkFtYmlndW91cykgewogCQkJCQkJCQkJCWlmIChmb3VuZEZpZWxkID09IG51bGwgfHwgZm91bmRGaWVsZC5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKQpAQCAtMTQ1MCw3ICsxNzA3LDcgQEAKIAkJCQkJCQkJCQkJbmFtZSwKIAkJCQkJCQkJCQkJUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CiAJCQkJCQkJCQl9Ci0JCisKIAkJCQkJCQkJCVByb2JsZW1GaWVsZEJpbmRpbmcgaW5zaWRlUHJvYmxlbSA9IG51bGw7CiAJCQkJCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJCQkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CkBAIC0xNDcxLDcgKzE3MjgsNyBAQAogCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJCWlmIChyZWNlaXZlclR5cGUgPT0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzIHx8IGNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7Ci0JCQkJCQkJCQkJCS8vIGZvdW5kIGEgdmFsaWQgZmllbGQgaW4gdGhlICdpbW1lZGlhdGUnIHNjb3BlIChpZS4gbm90IGluaGVyaXRlZCkKKwkJCQkJCQkJCQkJLy8gZm91bmQgYSB2YWxpZCBmaWVsZCBpbiB0aGUgJ2ltbWVkaWF0ZScgc2NvcGUgKGkuZS4gbm90IGluaGVyaXRlZCkKIAkJCQkJCQkJCQkJLy8gT1IgaW4gMS40IG1vZGUgKGluaGVyaXRlZCBzaGFkb3dzIGVuY2xvc2luZykKIAkJCQkJCQkJCQkJaWYgKGZvdW5kRmllbGQgPT0gbnVsbCkgewogCQkJCQkJCQkJCQkJaWYgKGRlcHRoID4gMCl7CkBAIC0xNDgzLDggKzE3NDAsMTAgQEAKIAkJCQkJCQkJCQkJfQogCQkJCQkJCQkJCQlpZiAoZm91bmRGaWVsZC5pc1ZhbGlkQmluZGluZygpKQogCQkJCQkJCQkJCQkJLy8gaWYgYSB2YWxpZCBmaWVsZCB3YXMgZm91bmQsIGNvbXBsYWluIHdoZW4gYW5vdGhlciBpcyBmb3VuZCBpbiBhbiAnaW1tZWRpYXRlJyBlbmNsb3NpbmcgdHlwZSAodGhhdCBpcywgbm90IGluaGVyaXRlZCkKLQkJCQkJCQkJCQkJCWlmIChmb3VuZEZpZWxkLmRlY2xhcmluZ0NsYXNzICE9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcykKLQkJCQkJCQkJCQkJCQkvLyBpZS4gaGF2ZSB3ZSBmb3VuZCB0aGUgc2FtZSBmaWVsZCAtIGRvIG5vdCB0cnVzdCBmaWVsZCBpZGVudGl0eSB5ZXQKKwkJCQkJCQkJCQkJCS8vIGJ1dCBvbmx5IGlmICJ2YWxpZCBmaWVsZCIgd2FzIGluaGVyaXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UuCisJCQkJCQkJCQkJCQlpZiAoZm91bmRGaWVsZC5kZWNsYXJpbmdDbGFzcyAhPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgJiYKKwkJCQkJCQkJCQkJCSAgICBmb3VuZEZpZWxkLmRlY2xhcmluZ0NsYXNzICE9IGZvdW5kQWN0dWFsUmVjZWl2ZXJUeXBlKSAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2OTU2CisJCQkJCQkJCQkJCQkJLy8gaS5lLiBoYXZlIHdlIGZvdW5kIHRoZSBzYW1lIGZpZWxkIC0gZG8gbm90IHRydXN0IGZpZWxkIGlkZW50aXR5IHlldAogCQkJCQkJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKIAkJCQkJCQkJCQkJCQkJZm91bmRGaWVsZCwgLy8gY2xvc2VzdCBtYXRjaAogCQkJCQkJCQkJCQkJCQlmb3VuZEZpZWxkLmRlY2xhcmluZ0NsYXNzLApAQCAtMTQ5Miw3ICsxNzUxLDcgQEAKIAkJCQkJCQkJCQkJCQkJUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfQotCQorCiAJCQkJCQkJCQlpZiAoZm91bmRGaWVsZCA9PSBudWxsIHx8IChmb3VuZEZpZWxkLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgJiYgZmllbGRCaW5kaW5nLnByb2JsZW1JZCgpICE9IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpKSB7CiAJCQkJCQkJCQkJLy8gb25seSByZW1lbWJlciB0aGUgZmllbGRCaW5kaW5nIGlmIGl0cyB0aGUgZmlyc3Qgb25lIGZvdW5kIG9yIHRoZSBwcmV2aW91cyBvbmUgd2FzIG5vdCB2aXNpYmxlICYgZmllbGRCaW5kaW5nIGlzLi4uCiAJCQkJCQkJCQkJZm91bmREZXB0aCA9IGRlcHRoOwpAQCAtMTU0MSwxMyArMTgwMCwxMyBAQAogCQkJCQkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IGltcG9ydHNbaV07CiAJCQkJCQkJaWYgKGltcG9ydEJpbmRpbmcuaXNTdGF0aWMoKSAmJiAhaW1wb3J0QmluZGluZy5vbkRlbWFuZCkgewogCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWVbaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIG5hbWUpKSB7Ci0JCQkJCQkJCQlpZiAodW5pdFNjb3BlLnJlc29sdmVTaW5nbGVJbXBvcnQoaW1wb3J0QmluZGluZykgIT0gbnVsbCAmJiBpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0IGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CisJCQkJCQkJCQlpZiAodW5pdFNjb3BlLnJlc29sdmVTaW5nbGVJbXBvcnQoaW1wb3J0QmluZGluZywgQmluZGluZy5UWVBFIHwgQmluZGluZy5GSUVMRCB8IEJpbmRpbmcuTUVUSE9EKSAhPSBudWxsICYmIGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKIAkJCQkJCQkJCQlmb3VuZEZpZWxkID0gKEZpZWxkQmluZGluZykgaW1wb3J0QmluZGluZy5yZXNvbHZlZEltcG9ydDsKIAkJCQkJCQkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0QmluZGluZy5yZWZlcmVuY2U7CiAJCQkJCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSAhPSBudWxsICYmIG5lZWRSZXNvbHZlKSB7CiAJCQkJCQkJCQkJCWltcG9ydFJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuVXNlZDsKIAkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaW52b2NhdGlvblNpdGUuc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKGZvdW5kRmllbGQuZGVjbGFyaW5nQ2xhc3MpOwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJaW52b2NhdGlvblNpdGUuc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKGZvdW5kRmllbGQuZGVjbGFyaW5nQ2xhc3MpOwogCQkJCQkJCQkJCWlmIChmb3VuZEZpZWxkLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJCQkJCQkJcmV0dXJuIGZvdW5kRmllbGQ7CiAJCQkJCQkJCQkJfQpAQCAtMTU3Nyw3ICsxODM2LDExIEBACiAJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJaWYgKGZvdW5kSW5JbXBvcnQpCiAJCQkJCQkJCQkJCQkvLyBBbnN3ZXIgZXJyb3IgYmluZGluZyAtLSBpbXBvcnQgb24gZGVtYW5kIGNvbmZsaWN0OyBuYW1lIGZvdW5kIGluIHR3byBpbXBvcnQgb24gZGVtYW5kIHBhY2thZ2VzLgotCQkJCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBudWxsLCBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMpOworCQkJCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJCQkJCQkJCQkJCQlmb3VuZEZpZWxkLCAvLyBjbG9zZXN0IG1hdGNoCisJCQkJCQkJCQkJCQkJCWZvdW5kRmllbGQuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJCQkJCQkJCW5hbWUsCisJCQkJCQkJCQkJCQkJCVByb2JsZW1SZWFzb25zLkFtYmlndW91cyk7CiAJCQkJCQkJCQkJCWZvdW5kRmllbGQgPSB0ZW1wOwogCQkJCQkJCQkJCQlmb3VuZEluSW1wb3J0ID0gdHJ1ZTsKIAkJCQkJCQkJCQl9CkBAIC0xNTg2LDcgKzE4NDksNyBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWlmIChmb3VuZEZpZWxkICE9IG51bGwpIHsKLQkJCQkJCQlpbnZvY2F0aW9uU2l0ZS5zZXRBY3R1YWxSZWNlaXZlclR5cGUoZm91bmRGaWVsZC5kZWNsYXJpbmdDbGFzcyk7CQkJCQkJCQorCQkJCQkJCWludm9jYXRpb25TaXRlLnNldEFjdHVhbFJlY2VpdmVyVHlwZShmb3VuZEZpZWxkLmRlY2xhcmluZ0NsYXNzKTsKIAkJCQkJCQlyZXR1cm4gZm91bmRGaWVsZDsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTU5Nyw3ICsxODYwLDcgQEAKIAkJCWlmICgobWFzayAmIEJpbmRpbmcuVFlQRSkgIT0gMCkgewogCQkJCWlmICgoYmluZGluZyA9IGdldEJhc2VUeXBlKG5hbWUpKSAhPSBudWxsKQogCQkJCQlyZXR1cm4gYmluZGluZzsKLQkJCQliaW5kaW5nID0gZ2V0VHlwZU9yUGFja2FnZShuYW1lLCAobWFzayAmIEJpbmRpbmcuUEFDS0FHRSkgPT0gMCA/IEJpbmRpbmcuVFlQRSA6IEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuUEFDS0FHRSk7CisJCQkJYmluZGluZyA9IGdldFR5cGVPclBhY2thZ2UobmFtZSwgKG1hc2sgJiBCaW5kaW5nLlBBQ0tBR0UpID09IDAgPyBCaW5kaW5nLlRZUEUgOiBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlBBQ0tBR0UsIG5lZWRSZXNvbHZlKTsKIAkJCQlpZiAoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8IG1hc2sgPT0gQmluZGluZy5UWVBFKQogCQkJCQlyZXR1cm4gYmluZGluZzsKIAkJCQkvLyBhbnN3ZXIgdGhlIHByb2JsZW0gdHlwZSBiaW5kaW5nIGlmIHdlIGFyZSBvbmx5IGxvb2tpbmcgZm9yIGEgdHlwZQpAQCAtMTYyOSwxMCArMTg5MiwxMCBAQAogCQkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCAmJiBtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCB0aGlzKSkgewogCQkJICAgIC8vIHRhcmdldGluZyBhIG5vbiBnZW5lcmljIGNvbnN0cnVjdG9yIHdpdGggdHlwZSBhcmd1bWVudHMgPwogCQkJICAgIGlmIChpbnZvY2F0aW9uU2l0ZS5nZW5lcmljVHlwZUFyZ3VtZW50cygpICE9IG51bGwpCi0JCQkgICAgCW1ldGhvZEJpbmRpbmcgPSBjb21wdXRlQ29tcGF0aWJsZU1ldGhvZChtZXRob2RCaW5kaW5nLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CQkJCQorCQkJICAgIAltZXRob2RCaW5kaW5nID0gY29tcHV0ZUNvbXBhdGlibGVNZXRob2QobWV0aG9kQmluZGluZywgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOwogCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOwogCQkJfQotCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSByZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhUeXBlQ29uc3RhbnRzLklOSVQpOworCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSByZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhUeXBlQ29uc3RhbnRzLklOSVQsIGFyZ3VtZW50VHlwZXMubGVuZ3RoKTsKIAkJCWlmIChtZXRob2RzID09IEJpbmRpbmcuTk9fTUVUSE9EUykKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAogCQkJCQlUeXBlQ29uc3RhbnRzLklOSVQsCkBAIC0xNjUzLDExICsxOTE2LDExIEBACiAJCQl9CiAJCQlpZiAoY29tcGF0aWJsZUluZGV4ID09IDApIHsKIAkJCQlpZiAocHJvYmxlbU1ldGhvZCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKFR5cGVDb25zdGFudHMuSU5JVCwgYXJndW1lbnRUeXBlcywgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOworCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKG1ldGhvZHNbMF0sIFR5cGVDb25zdGFudHMuSU5JVCwgYXJndW1lbnRUeXBlcywgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwogCQkJCXJldHVybiBwcm9ibGVtTWV0aG9kOwogCQkJfQogCQkJLy8gbmVlZCBhIG1vcmUgZGVzY3JpcHRpdmUgZXJyb3IuLi4gY2Fubm90IGNvbnZlcnQgZnJvbSBYIHRvIFkKLQkKKwogCQkJTWV0aG9kQmluZGluZ1tdIHZpc2libGUgPSBuZXcgTWV0aG9kQmluZGluZ1tjb21wYXRpYmxlSW5kZXhdOwogCQkJaW50IHZpc2libGVJbmRleCA9IDA7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVJbmRleDsgaSsrKSB7CkBAIC0xNzI4LDcgKzE5OTEsNyBAQAogCQkJZW52Lm1pc3NpbmdDbGFzc0ZpbGVMb2NhdGlvbiA9IGludm9jYXRpb25TaXRlOwogCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmluZEZpZWxkKHJlY2VpdmVyVHlwZSwgZmllbGROYW1lLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSAvKnJlc29sdmUqLyk7CiAJCQlpZiAoZmllbGQgIT0gbnVsbCkgcmV0dXJuIGZpZWxkOwotCQorCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCiAJCQkJcmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUgOiBudWxsLAogCQkJCWZpZWxkTmFtZSwKQEAgLTE3NDAsMTggKzIwMDMsMTggQEAKIAkJCWVudi5taXNzaW5nQ2xhc3NGaWxlTG9jYXRpb24gPSBudWxsOwogCQl9CiAJfQotCQorCiAJLyogQVBJCi0JICoJCisJICoKIAkgKglBbnN3ZXIgdGhlIG1ldGhvZCBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMuCiAJICoJU3RhcnQgdGhlIGxvb2t1cCBhdCB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgotCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMgCisJICoJSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cwogCSAqCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgbWV0aG9kIGlzIHZpc2libGUuCiAJICoJCXNldERlcHRoKGludCk7IHRoaXMgaXMgdXNlZCB0byByZWNvcmQgdGhlIGRlcHRoIG9mIHRoZSBkaXNjb3ZlcmVkIG1ldGhvZAogCSAqCQkJcmVsYXRpdmUgdG8gdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlci4gKElmIHRoZSBtZXRob2QgaXMgZGVmaW5lZAogCSAqCQkJaW4gdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlciwgdGhlIGRlcHRoIGlzIDA7IGluIHRoZSBuZXh0IGVuY2xvc2luZwogCSAqCQkJdHlwZSwgdGhlIGRlcHRoIGlzIDE7IGFuZCBzbyBvbgotCSAqIAorCSAqCiAJICoJSWYgbm8gdmlzaWJsZSBtZXRob2QgaXMgZGlzY292ZXJlZCwgYW4gZXJyb3IgYmluZGluZyBpcyBhbnN3ZXJlZC4KIAkgKi8KIAlwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRJbXBsaWNpdE1ldGhvZChjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKQEAgLTE3NjcsNyArMjAzMCw3IEBACiAJCS8vIGluIDEuNCBtb2RlIChpbmhlcml0ZWQgdmlzaWJsZSBzaGFkb3dzIGVuY2xvc2luZykKIAkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CiAJCWJvb2xlYW4gaW5oZXJpdGVkSGFzUHJlY2VkZW5jZSA9IChvcHRpb25zID0gY29tcGlsZXJPcHRpb25zKCkpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwotCQkKKwogCQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAogCQkJc3dpdGNoIChzY29wZS5raW5kKSB7CiAJCQkJY2FzZSBNRVRIT0RfU0NPUEUgOgpAQCAtMTgwMiw3ICsyMDY1LDcgQEAKIAkJCQkJCQkJCWlmIChpbmhlcml0ZWRIYXNQcmVjZWRlbmNlCiAJCQkJCQkJCQkJCXx8IHJlY2VpdmVyVHlwZSA9PSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzCiAJCQkJCQkJCQkJCXx8IChyZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhzZWxlY3RvcikpICE9IEJpbmRpbmcuTk9fTUVUSE9EUykgewotCQkJCQkJCQkJCS8vIGZvdW5kIGEgdmFsaWQgbWV0aG9kIGluIHRoZSAnaW1tZWRpYXRlJyBzY29wZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJCQkJCQkJLy8gZm91bmQgYSB2YWxpZCBtZXRob2QgaW4gdGhlICdpbW1lZGlhdGUnIHNjb3BlIChpLmUuIG5vdCBpbmhlcml0ZWQpCiAJCQkJCQkJCQkJLy8gT1IgaW4gMS40IG1vZGUgKGluaGVyaXRlZCB2aXNpYmxlIHNoYWRvd3MgZW5jbG9zaW5nKQogCQkJCQkJCQkJCS8vIE9SIHRoZSByZWNlaXZlclR5cGUgaW1wbGVtZW50ZWQgYSBtZXRob2Qgd2l0aCB0aGUgY29ycmVjdCBuYW1lCiAJCQkJCQkJCQkJLy8gcmV0dXJuIHRoZSBtZXRob2RCaW5kaW5nIGlmIGl0IGlzIG5vdCBkZWNsYXJlZCBpbiBhIHN1cGVyY2xhc3Mgb2YgdGhlIHNjb3BlJ3MgYmluZGluZyAodGhhdCBpcywgaW5oZXJpdGVkKQpAQCAtMTgxMyw2ICsyMDc2LDEyIEBACiAJCQkJCQkJCQkJCWludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKIAkJCQkJCQkJCQkJaW52b2NhdGlvblNpdGUuc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKHJlY2VpdmVyVHlwZSk7CiAJCQkJCQkJCQkJfQorCQkJCQkJCQkJCS8vIHNwZWNpYWwgdHJlYXRtZW50IGZvciBPYmplY3QuZ2V0Q2xhc3MoKSBpbiAxLjUgbW9kZSAoc3Vic3RpdHV0ZSBwYXJhbWV0ZXJpemVkIHJldHVybiB0eXBlKQorCQkJCQkJCQkJCWlmIChhcmd1bWVudFR5cGVzID09IEJpbmRpbmcuTk9fUEFSQU1FVEVSUworCQkJCQkJCQkJCSAgICAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgVHlwZUNvbnN0YW50cy5HRVRDTEFTUykKKwkJCQkJCQkJCQkgICAgJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKS8qMS41Ki8pIHsKKwkJCQkJCQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZUdldENsYXNzTWV0aG9kKHJlY2VpdmVyVHlwZSwgbWV0aG9kQmluZGluZywgdGhpcyk7CisJCQkJCQkJCQkJfQogCQkJCQkJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOwogCQkJCQkJCQkJfQogCkBAIC0xODMxLDcgKzIxMDAsNyBAQAogCQkJCQkJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOyAvLyByZXR1cm4gdGhlIGVycm9yIG5vdwogCQkJCQkJCQkJaWYgKGZvdW5kUHJvYmxlbSA9PSBudWxsKSB7CiAJCQkJCQkJCQkJZm91bmRQcm9ibGVtID0gbWV0aG9kQmluZGluZzsgLy8gaG9sZCBvbnRvIHRoZSBmaXJzdCBub3QgdmlzaWJsZS9mb3VuZCBlcnJvciBhbmQga2VlcCB0aGUgc2Vjb25kIG5vdCBmb3VuZCBpZiBmaXJzdCBpcyBub3QgdmlzaWJsZQotCQkJCQkJCQkJfSAKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICghIGZvdW5kUHJvYmxlbVZpc2libGUgJiYgbWV0aG9kQmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCkgewogCQkJCQkJCQkJCU1ldGhvZEJpbmRpbmcgY2xvc2VzdE1hdGNoID0gKChQcm9ibGVtTWV0aG9kQmluZGluZykgbWV0aG9kQmluZGluZykuY2xvc2VzdE1hdGNoOwogCQkJCQkJCQkJCWlmIChjbG9zZXN0TWF0Y2ggIT0gbnVsbCAmJiBjbG9zZXN0TWF0Y2guY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpIHsKQEAgLTE4ODEsNyArMjE1MCw3IEBACiAKIAkJCS8vIGF0IHRoaXMgcG9pbnQgdGhlIHNjb3BlIGlzIGEgY29tcGlsYXRpb24gdW5pdCBzY29wZSAmIG5lZWQgdG8gY2hlY2sgZm9yIGltcG9ydGVkIHN0YXRpYyBtZXRob2RzCiAJCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSAoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHNjb3BlOwotCQkJdW5pdFNjb3BlLmZhdWx0SW5JbXBvcnRzKCk7IC8vIGZpZWxkIGNvbnN0YW50cyBjYW4gY2F1c2Ugc3RhdGljIGltcG9ydHMgdG8gYmUgYWNjZXNzZWQgYmVmb3JlIHRoZXkncmUgcmVzb2x2ZWQgCisJCQl1bml0U2NvcGUuZmF1bHRJbkltcG9ydHMoKTsgLy8gZmllbGQgY29uc3RhbnRzIGNhbiBjYXVzZSBzdGF0aWMgaW1wb3J0cyB0byBiZSBhY2Nlc3NlZCBiZWZvcmUgdGhleSdyZSByZXNvbHZlZAogCQkJSW1wb3J0QmluZGluZ1tdIGltcG9ydHMgPSB1bml0U2NvcGUuaW1wb3J0czsKIAkJCWlmIChpbXBvcnRzICE9IG51bGwpIHsKIAkJCQlPYmplY3RWZWN0b3IgdmlzaWJsZSA9IG51bGw7CkBAIC0xODk0LDEzICsyMTYzLDEzIEBACiAJCQkJCQlpZiAoaW1wb3J0QmluZGluZy5vbkRlbWFuZCkgewogCQkJCQkJCWlmICghc2tpcE9uRGVtYW5kICYmIHJlc29sdmVkSW1wb3J0IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykKIAkJCQkJCQkJLy8gYW5zd2VycyBjbG9zZXN0IGFwcHJveGltYXRpb24sIG1heSBub3QgY2hlY2sgYXJndW1lbnRUeXBlcyBvciB2aXNpYmlsaXR5Ci0JCQkJCQkJCXBvc3NpYmxlID0gZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CisJCQkJCQkJCXBvc3NpYmxlID0gZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlmIChyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKIAkJCQkJCQkJTWV0aG9kQmluZGluZyBzdGF0aWNNZXRob2QgPSAoTWV0aG9kQmluZGluZykgcmVzb2x2ZWRJbXBvcnQ7CiAJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzdGF0aWNNZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkKIAkJCQkJCQkJCS8vIGFuc3dlcnMgY2xvc2VzdCBhcHByb3hpbWF0aW9uLCBtYXkgbm90IGNoZWNrIGFyZ3VtZW50VHlwZXMgb3IgdmlzaWJpbGl0eQotCQkJCQkJCQkJcG9zc2libGUgPSBmaW5kTWV0aG9kKHN0YXRpY01ldGhvZC5kZWNsYXJpbmdDbGFzcywgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlKTsKKwkJCQkJCQkJCXBvc3NpYmxlID0gZmluZE1ldGhvZChzdGF0aWNNZXRob2QuZGVjbGFyaW5nQ2xhc3MsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSk7CiAJCQkJCQkJfSBlbHNlIGlmIChyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgewogCQkJCQkJCQkvLyBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFsc28gbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUKIAkJCQkJCQkJRmllbGRCaW5kaW5nIHN0YXRpY0ZpZWxkID0gKEZpZWxkQmluZGluZykgcmVzb2x2ZWRJbXBvcnQ7CkBAIC0xOTEwLDcgKzIxNzksNyBAQAogCQkJCQkJCQkJVHlwZUJpbmRpbmcgcmVmZXJlbmNlZFR5cGUgPSBnZXRUeXBlKGltcG9ydE5hbWUsIGltcG9ydE5hbWUubGVuZ3RoIC0gMSk7CiAJCQkJCQkJCQlpZiAocmVmZXJlbmNlZFR5cGUgIT0gbnVsbCkKIAkJCQkJCQkJCQkvLyBhbnN3ZXJzIGNsb3Nlc3QgYXBwcm94aW1hdGlvbiwgbWF5IG5vdCBjaGVjayBhcmd1bWVudFR5cGVzIG9yIHZpc2liaWxpdHkKLQkJCQkJCQkJCQlwb3NzaWJsZSA9IGZpbmRNZXRob2QoKFJlZmVyZW5jZUJpbmRpbmcpIHJlZmVyZW5jZWRUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworCQkJCQkJCQkJCXBvc3NpYmxlID0gZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZykgcmVmZXJlbmNlZFR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC0xOTY5LDY1ICsyMjM4LDY1IEBACiAKIAlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhSW9TZXJpYWxpemFibGUoKSB7CiAJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSA9IGNvbXBpbGF0aW9uVW5pdFNjb3BlKCk7Ci0JCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoSkFWQV9JT19TRVJJQUxJWkFCTEUpOwotCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShKQVZBX0lPX1NFUklBTElaQUJMRSwgdGhpcyk7CisJCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoVHlwZUNvbnN0YW50cy5KQVZBX0lPX1NFUklBTElaQUJMRSk7CisJCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9JT19TRVJJQUxJWkFCTEUsIHRoaXMpOwogCX0KLQkKKwogCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nQW5ub3RhdGlvbkFubm90YXRpb24oKSB7CiAJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSA9IGNvbXBpbGF0aW9uVW5pdFNjb3BlKCk7Ci0JCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTik7Ci0JCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKEpBVkFfTEFOR19BTk5PVEFUSU9OX0FOTk9UQVRJT04sIHRoaXMpOworCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTik7CisJCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTiwgdGhpcyk7CiAJfQotCQorCiAJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsKIAkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlID0gY29tcGlsYXRpb25Vbml0U2NvcGUoKTsKLQkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IpOwotCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IsIHRoaXMpOworCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SKTsKKwkJcmV0dXJuIHVuaXRTY29wZS5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IsIHRoaXMpOwogCX0KIAogCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nQ2xhc3MoKSB7CiAJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSA9IGNvbXBpbGF0aW9uVW5pdFNjb3BlKCk7Ci0JCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoSkFWQV9MQU5HX0NMQVNTKTsKLQkJcmV0dXJuIHVuaXRTY29wZS5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoSkFWQV9MQU5HX0NMQVNTLCB0aGlzKTsKKwkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19DTEFTUyk7CisJCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0NMQVNTLCB0aGlzKTsKIAl9CiAKIAlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0Nsb25lYWJsZSgpIHsKIAkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlID0gY29tcGlsYXRpb25Vbml0U2NvcGUoKTsKLQkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfQ0xPTkVBQkxFKTsKLQkJcmV0dXJuIHVuaXRTY29wZS5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoSkFWQV9MQU5HX0NMT05FQUJMRSwgdGhpcyk7CisJCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0xPTkVBQkxFKTsKKwkJcmV0dXJuIHVuaXRTY29wZS5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0xPTkVBQkxFLCB0aGlzKTsKIAl9CiAJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdFbnVtKCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19FTlVNKTsKLQkJcmV0dXJuIHVuaXRTY29wZS5lbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoSkFWQV9MQU5HX0VOVU0sIHRoaXMpOworCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0VOVU0pOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FTlVNLCB0aGlzKTsKIAl9CiAKIAlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0l0ZXJhYmxlKCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19JVEVSQUJMRSk7Ci0JCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKEpBVkFfTEFOR19JVEVSQUJMRSwgdGhpcyk7CisJCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSVRFUkFCTEUpOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19JVEVSQUJMRSwgdGhpcyk7CiAJfQogCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nT2JqZWN0KCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19PQkpFQ1QpOwotCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfT0JKRUNULCB0aGlzKTsKKwkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QpOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIHRoaXMpOwogCX0KIAogCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nU3RyaW5nKCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19TVFJJTkcpOwotCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfU1RSSU5HLCB0aGlzKTsKKwkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TVFJJTkcpOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TVFJJTkcsIHRoaXMpOwogCX0KIAogCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nVGhyb3dhYmxlKCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19USFJPV0FCTEUpOwotCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShKQVZBX0xBTkdfVEhST1dBQkxFLCB0aGlzKTsKKwkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19USFJPV0FCTEUpOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19USFJPV0FCTEUsIHRoaXMpOwogCX0KIAlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhVXRpbEl0ZXJhdG9yKCkgewogCQlDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUgPSBjb21waWxhdGlvblVuaXRTY29wZSgpOwotCQl1bml0U2NvcGUucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfVVRJTF9JVEVSQVRPUik7Ci0JCXJldHVybiB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKEpBVkFfVVRJTF9JVEVSQVRPUiwgdGhpcyk7CisJCXVuaXRTY29wZS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoVHlwZUNvbnN0YW50cy5KQVZBX1VUSUxfSVRFUkFUT1IpOworCQlyZXR1cm4gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfVVRJTF9JVEVSQVRPUiwgdGhpcyk7CiAJfQogCiAJLyogQW5zd2VyIHRoZSB0eXBlIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZU5hbWUgYXJndW1lbnQsIHJlbGF0aXZlIHRvIHRoZSBlbmNsb3NpbmdUeXBlLgpAQCAtMjAzNSw3ICsyMzA0LDggQEAKIAlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRNZW1iZXJUeXBlKGNoYXJbXSB0eXBlTmFtZSwgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGZpbmRNZW1iZXJUeXBlKHR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlKTsKIAkJaWYgKG1lbWJlclR5cGUgIT0gbnVsbCkgcmV0dXJuIG1lbWJlclR5cGU7Ci0JCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIG51bGwsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsgdHlwZU5hbWUgfTsKKwkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIG51bGwsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKIAl9CiAKIAlwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRNZXRob2QoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKQEAgLTIwNTUsMTEgKzIzMjUsMTEgQEAKIAkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOwogCQkJaWYgKCFjdXJyZW50VHlwZS5jYW5CZVNlZW5CeSh0aGlzKSkKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBQcm9ibGVtUmVhc29ucy5SZWNlaXZlclR5cGVOb3RWaXNpYmxlKTsKLQkKKwogCQkJLy8gcmV0cmlldmUgYW4gZXhhY3QgdmlzaWJsZSBtYXRjaCAoaWYgcG9zc2libGUpCiAJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBmaW5kRXhhY3RNZXRob2QoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CiAJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSByZXR1cm4gbWV0aG9kQmluZGluZzsKLQkKKwogCQkJbWV0aG9kQmluZGluZyA9IGZpbmRNZXRob2QoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CiAJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKQogCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKQEAgLTIwNjcsMTIgKzIzMzcsMTEgQEAKIAkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKIAogCQkJLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIE9iamVjdC5nZXRDbGFzcygpIGluIDEuNSBtb2RlIChzdWJzdGl0dXRlIHBhcmFtZXRlcml6ZWQgcmV0dXJuIHR5cGUpCi0JCQlpZiAocmVjZWl2ZXJUeXBlLmlkICE9IFRfSmF2YUxhbmdPYmplY3QKLQkJCQkmJiBhcmd1bWVudFR5cGVzID09IEJpbmRpbmcuTk9fUEFSQU1FVEVSUwotCQkJICAgICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBHRVRDTEFTUykKKwkJCWlmIChhcmd1bWVudFR5cGVzID09IEJpbmRpbmcuTk9fUEFSQU1FVEVSUworCQkJICAgICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLkdFVENMQVNTKQogCQkJICAgICYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkvKjEuNSovKSB7Ci0JCQkJCXJldHVybiBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5pbnN0YW50aWF0ZUdldENsYXNzKHJlY2VpdmVyVHlwZSwgbWV0aG9kQmluZGluZywgdGhpcyk7Ci0JCSAgICB9CQkJCisJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZUdldENsYXNzTWV0aG9kKHJlY2VpdmVyVHlwZSwgbWV0aG9kQmluZGluZywgdGhpcyk7CisJCSAgICB9CiAJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKIAkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CiAJCQllLnVwZGF0ZUNvbnRleHQoaW52b2NhdGlvblNpdGUsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0KTsKQEAgLTIwODksMzQgKzIzNTgsMzggQEAKIAkqIGZyb20gdGhlIGJpbmRpbmcgJiBub3QgYXNzdW1lIHRoZSBwcm9ibGVtIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb3VuZE5hbWUuCiAJKi8KIAlwdWJsaWMgZmluYWwgQmluZGluZyBnZXRQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgewotCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShjb21wb3VuZE5hbWUpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSBnZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSwgQmluZGluZy5UWVBFIHwgQmluZGluZy5QQUNLQUdFKTsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lWzBdLCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7Ci0JCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorIAkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoY29tcG91bmROYW1lKTsKKwkJQmluZGluZyBiaW5kaW5nID0gZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuUEFDS0FHRSwgdHJ1ZSk7CisJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCWNoYXJbXVtdIHFOYW1lID0gbmV3IGNoYXJbXVtdIHsgY29tcG91bmROYW1lWzBdIH07CisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHFOYW1lLCBlbnZpcm9ubWVudCgpLmNyZWF0ZU1pc3NpbmdUeXBlKG51bGwsIGNvbXBvdW5kTmFtZSksIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJfQorCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeyAvKiBtaXNzaW5nIHBhY2thZ2UgKi8KKwkJCQljaGFyW11bXSBxTmFtZSA9IG5ldyBjaGFyW11bXSB7IGNvbXBvdW5kTmFtZVswXSB9OworCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcocU5hbWUsIG51bGwgLyogbm8gY2xvc2VzdCBtYXRjaCBzaW5jZSBzZWFyY2ggZm9yIHBrZyovLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQl9CiAJCQlyZXR1cm4gYmluZGluZzsKLQorCQl9CiAJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykpIHJldHVybiBudWxsOyAvLyBjb21wb3VuZE5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHBhY2thZ2UKIAotCQlpbnQgY3VycmVudEluZGV4ID0gMTsKKwkJaW50IGN1cnJlbnRJbmRleCA9IDEsIGxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGg7CiAJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOwotCQl3aGlsZSAoY3VycmVudEluZGV4IDwgY29tcG91bmROYW1lLmxlbmd0aCkgeworCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CiAJCQliaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdKTsKLQkJCWlmIChiaW5kaW5nID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKLQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCW51bGwsIAotCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgbnVsbCAvKiBubyBjbG9zZXN0IG1hdGNoIHNpbmNlIHNlYXJjaCBmb3IgcGtnKi8sIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJCX0KIAkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQogCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCiAJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAotCQkJCQliaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/ICgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSA6IG51bGwsCisJCQkJCWJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nID8gKFJlZmVyZW5jZUJpbmRpbmcpKChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLmNsb3Nlc3RNYXRjaCgpIDogbnVsbCwKIAkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CiAJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQogCQkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKIAkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOwogCQl9Ci0JCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCBudWxsIC8qIG5vIGNsb3Nlc3QgbWF0Y2ggc2luY2Ugc2VhcmNoIGZvciBwa2cqLywgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwogCX0KIAogCS8qIEFuc3dlciB0aGUgdHlwZSBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdGhlIGdpdmVuIG5hbWUsIHN0YXJ0aW5nIHRoZSBsb29rdXAgaW4gdGhlIHJlY2VpdmVyLgpAQCAtMjEyOSw3ICsyNDAyLDcgQEAKIAkJLy8gV291bGQgbGlrZSB0byByZW1vdmUgdGhpcyB0ZXN0IGFuZCByZXF1aXJlIHNlbmRlcnMgdG8gc3BlY2lhbGx5IGhhbmRsZSBiYXNlIHR5cGVzCiAJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBnZXRCYXNlVHlwZShuYW1lKTsKIAkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgcmV0dXJuIGJpbmRpbmc7Ci0JCXJldHVybiAoUmVmZXJlbmNlQmluZGluZykgZ2V0VHlwZU9yUGFja2FnZShuYW1lLCBCaW5kaW5nLlRZUEUpOworCQlyZXR1cm4gKFJlZmVyZW5jZUJpbmRpbmcpIGdldFR5cGVPclBhY2thZ2UobmFtZSwgQmluZGluZy5UWVBFLCB0cnVlKTsKIAl9CiAKIAkvKiBBbnN3ZXIgdGhlIHR5cGUgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBuYW1lLCBzdGFydGluZyB0aGUgbG9va3VwIGluIHRoZSByZWNlaXZlcgpAQCAtMjE0MSwyMSArMjQxNCwyMiBAQAogCQkJcmV0dXJuIGdldFR5cGUobmFtZSk7CiAKIAkJQmluZGluZyBiaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShuYW1lKTsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKIAkJCQlDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgbmFtZSksCiAJCQkJbnVsbCwKIAkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7Ci0JCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKLQkJCQlDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgbmFtZSksCi0JCQkJYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgPyAoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCkgOiBudWxsLAotCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwotCisJCX0KKwkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgPyAoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY29tcG91bmROYW1lIDogQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUsIG5hbWUpLAorCQkJCQkJYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgPyAoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCkgOiBudWxsLAorCQkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCX0KIAkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOwogCQlpZiAoIXR5cGVCaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMpKQogCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKLQkJCQlDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgbmFtZSksCisJCQkJdHlwZUJpbmRpbmcuY29tcG91bmROYW1lLAogCQkJCXR5cGVCaW5kaW5nLAogCQkJCVByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOwogCQlyZXR1cm4gdHlwZUJpbmRpbmc7CkBAIC0yMTc1LDM4ICsyNDQ5LDUwIEBACiAKIAkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlID0gY29tcGlsYXRpb25Vbml0U2NvcGUoKTsKIAkJdW5pdFNjb3BlLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShjb21wb3VuZE5hbWUpOwotCQlCaW5kaW5nIGJpbmRpbmcgPQotCQkJZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIHR5cGVOYW1lTGVuZ3RoID09IDEgPyBCaW5kaW5nLlRZUEUgOiBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlBBQ0tBR0UpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWVbMF0sIG51bGwsIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKLQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCUJpbmRpbmcgYmluZGluZyA9IGdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lWzBdLCB0eXBlTmFtZUxlbmd0aCA9PSAxID8gQmluZGluZy5UWVBFIDogQmluZGluZy5UWVBFIHwgQmluZGluZy5QQUNLQUdFLCB0cnVlKTsKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJY2hhcltdW10gcU5hbWUgPSBuZXcgY2hhcltdW10geyBjb21wb3VuZE5hbWVbMF0gfTsKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcocU5hbWUsIGVudmlyb25tZW50KCkuY3JlYXRlTWlzc2luZ1R5cGUoY29tcGlsYXRpb25Vbml0U2NvcGUoKS5nZXRDdXJyZW50UGFja2FnZSgpLCBxTmFtZSksIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKTsKKwkJfQorCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQkJCWNoYXJbXVtdIHFOYW1lID0gbmV3IGNoYXJbXVtdIHsgY29tcG91bmROYW1lWzBdIH07CisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCXFOYW1lLAorCQkJCQkJZW52aXJvbm1lbnQoKS5jcmVhdGVNaXNzaW5nVHlwZShudWxsLCBxTmFtZSksCisJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQl9CiAJCQlyZXR1cm4gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7Ci0KKwkJfQogCQlpbnQgY3VycmVudEluZGV4ID0gMTsKIAkJYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKIAkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgewogCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7CiAJCQl3aGlsZSAoY3VycmVudEluZGV4IDwgdHlwZU5hbWVMZW5ndGgpIHsKIAkJCQliaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdKTsgLy8gZG9lcyBub3QgY2hlY2sgdmlzaWJpbGl0eQotCQkJCWlmIChiaW5kaW5nID09IG51bGwpCisJCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQljaGFyW11bXSBxTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpOwogCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAotCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCQludWxsLAorCQkJCQkJcU5hbWUsCisJCQkJCQllbnZpcm9ubWVudCgpLmNyZWF0ZU1pc3NpbmdUeXBlKHBhY2thZ2VCaW5kaW5nLCBxTmFtZSksCiAJCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQkJfQogCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQogCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCQliaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/ICgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSA6IG51bGwsCisJCQkJCQliaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/IChSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSA6IG51bGwsCiAJCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKIAkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQogCQkJCQlicmVhazsKIAkJCQlwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKIAkJCX0KLQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpCisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQkJY2hhcltdW10gcU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KTsKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAotCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKLQkJCQkJbnVsbCwKKwkJCQkJcU5hbWUsCisJCQkJCWVudmlyb25tZW50KCkuY3JlYXRlTWlzc2luZ1R5cGUobnVsbCwgcU5hbWUpLAogCQkJCQlQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQl9CiAJCQljaGVja1Zpc2liaWxpdHkgPSB0cnVlOwogCQl9CiAKQEAgLTIyMjcsMjEgKzI1MTMsMjEgQEAKIAkJCQkJUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgcHJvYmxlbUJpbmRpbmcgPSAoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nOwogCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCQlwcm9ibGVtQmluZGluZy5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJCXByb2JsZW1CaW5kaW5nLmNsb3Nlc3RSZWZlcmVuY2VNYXRjaCgpLAogCQkJCQkJdHlwZUJpbmRpbmcucHJvYmxlbUlkKCkpOwogCQkJCX0KIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKLQkJCQkJKChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLmNsb3Nlc3RNYXRjaCgpLAorCQkJCQkoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCksCiAJCQkJCXR5cGVCaW5kaW5nLnByb2JsZW1JZCgpKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gdHlwZUJpbmRpbmc7CiAJfQotCQotCS8qIEludGVybmFsIHVzZSBvbmx5IAorCisJLyogSW50ZXJuYWwgdXNlIG9ubHkKIAkqLwotCWZpbmFsIEJpbmRpbmcgZ2V0VHlwZU9yUGFja2FnZShjaGFyW10gbmFtZSwgaW50IG1hc2spIHsKKwlmaW5hbCBCaW5kaW5nIGdldFR5cGVPclBhY2thZ2UoY2hhcltdIG5hbWUsIGludCBtYXNrLCBib29sZWFuIG5lZWRSZXNvbHZlKSB7CiAJCVNjb3BlIHNjb3BlID0gdGhpczsKIAkJUmVmZXJlbmNlQmluZGluZyBmb3VuZFR5cGUgPSBudWxsOwogCQlib29sZWFuIGluc2lkZVN0YXRpY0NvbnRleHQgPSBmYWxzZTsKQEAgLTIyNTEsMjIgKzI1MzcsMzQgQEAKIAkJCXdoaWxlICgobmV4dCA9IHNjb3BlLnBhcmVudCkgIT0gbnVsbCkKIAkJCQlzY29wZSA9IG5leHQ7CiAJCX0gZWxzZSB7CisJCQlib29sZWFuIGluaGVyaXRlZEhhc1ByZWNlZGVuY2UgPSBjb21waWxlck9wdGlvbnMoKS5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKIAkJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCiAJCQkJc3dpdGNoIChzY29wZS5raW5kKSB7CiAJCQkJCWNhc2UgTUVUSE9EX1NDT1BFIDoKIAkJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsKIAkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG1ldGhvZFNjb3BlLnJlZmVyZW5jZU1ldGhvZCgpOwotCQkJCQkJaWYgKG1ldGhvZERlY2wgIT0gbnVsbCAmJiBtZXRob2REZWNsLmJpbmRpbmcgIT0gbnVsbCkgewotCQkJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlID0gbWV0aG9kRGVjbC5iaW5kaW5nLmdldFR5cGVWYXJpYWJsZShuYW1lKTsKLQkJCQkJCQlpZiAodHlwZVZhcmlhYmxlICE9IG51bGwpCXJldHVybiB0eXBlVmFyaWFibGU7CisJCQkJCQlpZiAobWV0aG9kRGVjbCAhPSBudWxsKSB7CisJCQkJCQkJaWYgKG1ldGhvZERlY2wuYmluZGluZyAhPSBudWxsKSB7CisJCQkJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlID0gbWV0aG9kRGVjbC5iaW5kaW5nLmdldFR5cGVWYXJpYWJsZShuYW1lKTsKKwkJCQkJCQkJaWYgKHR5cGVWYXJpYWJsZSAhPSBudWxsKQorCQkJCQkJCQkJcmV0dXJuIHR5cGVWYXJpYWJsZTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyB1c2UgdGhlIG1ldGhvZERlY2wncyB0eXBlUGFyYW1ldGVycyB0byBoYW5kbGUgcHJvYmxlbSBjYXNlcyB3aGVuIHRoZSBtZXRob2QgYmluZGluZyBkb2Vzbid0IGV4aXN0CisJCQkJCQkJCVR5cGVQYXJhbWV0ZXJbXSBwYXJhbXMgPSBtZXRob2REZWNsLnR5cGVQYXJhbWV0ZXJzKCk7CisJCQkJCQkJCWZvciAoaW50IGkgPSBwYXJhbXMgPT0gbnVsbCA/IDAgOiBwYXJhbXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFyYW1zW2ldLm5hbWUsIG5hbWUpKQorCQkJCQkJCQkJCWlmIChwYXJhbXNbaV0uYmluZGluZyAhPSBudWxsICYmIHBhcmFtc1tpXS5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJCQkJCQkJCXJldHVybiBwYXJhbXNbaV0uYmluZGluZzsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQlpbnNpZGVTdGF0aWNDb250ZXh0IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljOwogCQkJCQkJaW5zaWRlVHlwZUFubm90YXRpb24gPSBtZXRob2RTY29wZS5pbnNpZGVUeXBlQW5ub3RhdGlvbjsKKwkJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJY2FzZSBCTE9DS19TQ09QRSA6CiAJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGxvY2FsVHlwZSA9ICgoQmxvY2tTY29wZSkgc2NvcGUpLmZpbmRMb2NhbFR5cGUobmFtZSk7IC8vIGxvb2tzIGluIHRoaXMgc2NvcGUgb25seQogCQkJCQkJaWYgKGxvY2FsVHlwZSAhPSBudWxsKSB7CiAJCQkJCQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsICYmIGZvdW5kVHlwZSAhPSBsb2NhbFR5cGUpCi0JCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgZm91bmRUeXBlLCBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKKwkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117bmFtZX0sIGZvdW5kVHlwZSwgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CiAJCQkJCQkJcmV0dXJuIGxvY2FsVHlwZTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwpAQCAtMjI4Miw3ICsyNTgwLDcgQEAKIAkJCQkJCQkJcmV0dXJuIHNvdXJjZVR5cGU7CiAJCQkJCQkJaW5zaWRlU3RhdGljQ29udGV4dCB8PSBzb3VyY2VUeXBlLmlzU3RhdGljKCk7CiAJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9CQkJCQkJCisJCQkJCQl9CiAJCQkJCQkvLyBtZW1iZXIgdHlwZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdHlwZSB2YXJpYWJsZXMKIAkJCQkJCWlmICghaW5zaWRlVHlwZUFubm90YXRpb24pIHsKIAkJCQkJCQkvLyA2LjUuNS4xIC0gbWVtYmVyIHR5cGVzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRvcC1sZXZlbCB0eXBlIGluIHNhbWUgdW5pdApAQCAtMjI5MywxOSArMjU5MSwxOSBAQAogCQkJCQkJCQkJCS8vIHN1cGVyY2VkZXMgYW55IHBvdGVudGlhbCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIHByb2JsZW0KIAkJCQkJCQkJCQlyZXR1cm4gbWVtYmVyVHlwZTsKIAkJCQkJCQkJCS8vIG1ha2UgdGhlIHVzZXIgcXVhbGlmeSB0aGUgdHlwZSwgbGlrZWx5IHdhbnRzIHRoZSBmaXJzdCBpbmhlcml0ZWQgdHlwZQotCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBmb3VuZFR5cGUsIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhcltdW117bmFtZX0sIGZvdW5kVHlwZSwgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKG1lbWJlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJCQkJaWYgKHNvdXJjZVR5cGUgPT0gbWVtYmVyVHlwZS5lbmNsb3NpbmdUeXBlKCkgfHwgY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKKwkJCQkJCQkJCWlmIChzb3VyY2VUeXBlID09IG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpIHx8IGluaGVyaXRlZEhhc1ByZWNlZGVuY2UpIHsKIAkJCQkJCQkJCQlpZiAoaW5zaWRlU3RhdGljQ29udGV4dCAmJiAhbWVtYmVyVHlwZS5pc1N0YXRpYygpICYmIHNvdXJjZVR5cGUuaXNHZW5lcmljVHlwZSgpKQotCQkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIG1lbWJlclR5cGUsIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCk7Ci0JCQkJCQkJCQkJLy8gZm91bmQgYSB2YWxpZCB0eXBlIGluIHRoZSAnaW1tZWRpYXRlJyBzY29wZSAoaWUuIG5vdCBpbmhlcml0ZWQpCi0JCQkJCQkJCQkJLy8gT1IgaW4gMS40IG1vZGUgKGluaGVyaXRlZCBzaGFkb3dzIGVuY2xvc2luZykKLQkJCQkJCQkJCQlpZiAoZm91bmRUeXBlID09IG51bGwpCi0JCQkJCQkJCQkJCXJldHVybiBtZW1iZXJUeXBlOyAKLQkJCQkJCQkJCQkvLyBpZiBhIHZhbGlkIHR5cGUgd2FzIGZvdW5kLCBjb21wbGFpbiB3aGVuIGFub3RoZXIgaXMgZm91bmQgaW4gYW4gJ2ltbWVkaWF0ZScgZW5jbG9zaW5nIHR5cGUgKGllLiBub3QgaW5oZXJpdGVkKQorCQkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyW11bXXtuYW1lfSwgbWVtYmVyVHlwZSwgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KTsKKwkJCQkJCQkJCQkvLyBmb3VuZCBhIHZhbGlkIHR5cGUgaW4gdGhlICdpbW1lZGlhdGUnIHNjb3BlIChpLmUuIG5vdCBpbmhlcml0ZWQpCisJCQkJCQkJCQkJLy8gT1IgaW4gMS40IG1vZGUgKGluaGVyaXRlZCB2aXNpYmxlIHNoYWRvd3MgZW5jbG9zaW5nKQorCQkJCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbCB8fCAoaW5oZXJpdGVkSGFzUHJlY2VkZW5jZSAmJiBmb3VuZFR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCisJCQkJCQkJCQkJCXJldHVybiBtZW1iZXJUeXBlOworCQkJCQkJCQkJCS8vIGlmIGEgdmFsaWQgdHlwZSB3YXMgZm91bmQsIGNvbXBsYWluIHdoZW4gYW5vdGhlciBpcyBmb3VuZCBpbiBhbiAnaW1tZWRpYXRlJyBlbmNsb3NpbmcgdHlwZSAoaS5lLiBub3QgaW5oZXJpdGVkKQogCQkJCQkJCQkJCWlmIChmb3VuZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSAmJiBmb3VuZFR5cGUgIT0gbWVtYmVyVHlwZSkKLQkJCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBmb3VuZFR5cGUsIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyW11bXXtuYW1lfSwgZm91bmRUeXBlLCBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQlpZiAoZm91bmRUeXBlID09IG51bGwgfHwgKGZvdW5kVHlwZS5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlICYmIG1lbWJlclR5cGUucHJvYmxlbUlkKCkgIT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCkBAIC0yMzE2LDE0ICsyNjE0LDE0IEBACiAJCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSA9IHNvdXJjZVR5cGUuZ2V0VHlwZVZhcmlhYmxlKG5hbWUpOwogCQkJCQkJaWYgKHR5cGVWYXJpYWJsZSAhPSBudWxsKSB7CiAJCQkJCQkJaWYgKGluc2lkZVN0YXRpY0NvbnRleHQpIC8vIGRvIG5vdCBjb25zaWRlciB0aGlzIHR5cGUgbW9kaWZpZXJzOiBhY2Nlc3MgaXMgbGVnaXRlIHdpdGhpbiBzYW1lIHR5cGUKLQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCB0eXBlVmFyaWFibGUsIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCk7CisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde25hbWV9LCB0eXBlVmFyaWFibGUsIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCk7CiAJCQkJCQkJcmV0dXJuIHR5cGVWYXJpYWJsZTsKLQkJCQkJCX0JCQkJCQkKKwkJCQkJCX0KIAkJCQkJCWluc2lkZVN0YXRpY0NvbnRleHQgfD0gc291cmNlVHlwZS5pc1N0YXRpYygpOwogCQkJCQkJaW5zaWRlVHlwZUFubm90YXRpb24gPSBmYWxzZTsKIAkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzb3VyY2VUeXBlLnNvdXJjZU5hbWUsIG5hbWUpKSB7CiAJCQkJCQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsICYmIGZvdW5kVHlwZSAhPSBzb3VyY2VUeXBlICYmIGZvdW5kVHlwZS5wcm9ibGVtSWQoKSAhPSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKQotCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIGZvdW5kVHlwZSwgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmV3IGNoYXJbXVtde25hbWV9LCBmb3VuZFR5cGUsIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOwogCQkJCQkJCXJldHVybiBzb3VyY2VUeXBlOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CkBAIC0yMzQwLDI2ICsyNjM4LDI2IEBACiAJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHVuaXRTY29wZSA9IChDb21waWxhdGlvblVuaXRTY29wZSkgc2NvcGU7CiAJCUhhc2h0YWJsZU9mT2JqZWN0IHR5cGVPclBhY2thZ2VDYWNoZSA9IHVuaXRTY29wZS50eXBlT3JQYWNrYWdlQ2FjaGU7CiAJCWlmICh0eXBlT3JQYWNrYWdlQ2FjaGUgIT0gbnVsbCkgewotCQkJQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIHR5cGVPclBhY2thZ2VDYWNoZS5nZXQobmFtZSk7Ci0JCQlpZiAoYmluZGluZyAhPSBudWxsKSB7IC8vIGNhbiBhbHNvIGluY2x1ZGUgTm90Rm91bmQgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmdzIGlmIHdlIGFscmVhZHkga25vdyB0aGlzIG5hbWUgaXMgbm90IGZvdW5kCi0JCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBJbXBvcnRCaW5kaW5nKSB7IC8vIHNpbmdsZSB0eXBlIGltcG9ydCBjYWNoZWQgaW4gZmF1bHRJbkltcG9ydHMoKSwgcmVwbGFjZSBpdCBpbiB0aGUgY2FjaGUgd2l0aCB0aGUgdHlwZQotCQkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKChJbXBvcnRCaW5kaW5nKSBiaW5kaW5nKS5yZWZlcmVuY2U7CisJCQlCaW5kaW5nIGNhY2hlZEJpbmRpbmcgPSAoQmluZGluZykgdHlwZU9yUGFja2FnZUNhY2hlLmdldChuYW1lKTsKKwkJCWlmIChjYWNoZWRCaW5kaW5nICE9IG51bGwpIHsgLy8gY2FuIGFsc28gaW5jbHVkZSBOb3RGb3VuZCBQcm9ibGVtUmVmZXJlbmNlQmluZGluZ3MgaWYgd2UgYWxyZWFkeSBrbm93IHRoaXMgbmFtZSBpcyBub3QgZm91bmQKKwkJCQlpZiAoY2FjaGVkQmluZGluZyBpbnN0YW5jZW9mIEltcG9ydEJpbmRpbmcpIHsgLy8gc2luZ2xlIHR5cGUgaW1wb3J0IGNhY2hlZCBpbiBmYXVsdEluSW1wb3J0cygpLCByZXBsYWNlIGl0IGluIHRoZSBjYWNoZSB3aXRoIHRoZSB0eXBlCisJCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSAoKEltcG9ydEJpbmRpbmcpIGNhY2hlZEJpbmRpbmcpLnJlZmVyZW5jZTsKIAkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSAhPSBudWxsKSB7CiAJCQkJCQlpbXBvcnRSZWZlcmVuY2UuYml0cyB8PSBBU1ROb2RlLlVzZWQ7CiAJCQkJCX0KLQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBJbXBvcnRDb25mbGljdEJpbmRpbmcpCi0JCQkJCQl0eXBlT3JQYWNrYWdlQ2FjaGUucHV0KG5hbWUsIGJpbmRpbmcgPSAoKEltcG9ydENvbmZsaWN0QmluZGluZykgYmluZGluZykuY29uZmxpY3RpbmdUeXBlQmluZGluZyk7IC8vIGFscmVhZHkga25vdyBpdHMgdmlzaWJsZQorCQkJCQlpZiAoY2FjaGVkQmluZGluZyBpbnN0YW5jZW9mIEltcG9ydENvbmZsaWN0QmluZGluZykKKwkJCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgY2FjaGVkQmluZGluZyA9ICgoSW1wb3J0Q29uZmxpY3RCaW5kaW5nKSBjYWNoZWRCaW5kaW5nKS5jb25mbGljdGluZ1R5cGVCaW5kaW5nKTsgLy8gYWxyZWFkeSBrbm93IGl0cyB2aXNpYmxlCiAJCQkJCWVsc2UKLQkJCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgYmluZGluZyA9ICgoSW1wb3J0QmluZGluZykgYmluZGluZykucmVzb2x2ZWRJbXBvcnQpOyAvLyBhbHJlYWR5IGtub3cgaXRzIHZpc2libGUKKwkJCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgY2FjaGVkQmluZGluZyA9ICgoSW1wb3J0QmluZGluZykgY2FjaGVkQmluZGluZykucmVzb2x2ZWRJbXBvcnQpOyAvLyBhbHJlYWR5IGtub3cgaXRzIHZpc2libGUKIAkJCQl9CiAJCQkJaWYgKChtYXNrICYgQmluZGluZy5UWVBFKSAhPSAwKSB7Ci0JCQkJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCAmJiBmb3VuZFR5cGUucHJvYmxlbUlkKCkgIT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSAmJiBiaW5kaW5nLnByb2JsZW1JZCgpICE9IFByb2JsZW1SZWFzb25zLkFtYmlndW91cykKKwkJCQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsICYmIGZvdW5kVHlwZS5wcm9ibGVtSWQoKSAhPSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlICYmIGNhY2hlZEJpbmRpbmcucHJvYmxlbUlkKCkgIT0gUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzKQogCQkJCQkJcmV0dXJuIGZvdW5kVHlwZTsgLy8gcHJvYmxlbSB0eXBlIGZyb20gYWJvdmUgc3VwZXJjZWRlcyBOb3RGb3VuZCB0eXBlIGJ1dCBub3QgQW1iaWd1b3VzIGltcG9ydCBjYXNlCi0JCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykKLQkJCQkJCXJldHVybiBiaW5kaW5nOyAvLyBjYWNoZWQgdHlwZSBmb3VuZCBpbiBwcmV2aW91cyB3YWxrIGJlbG93CisJCQkJCWlmIChjYWNoZWRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykKKwkJCQkJCXJldHVybiBjYWNoZWRCaW5kaW5nOyAvLyBjYWNoZWQgdHlwZSBmb3VuZCBpbiBwcmV2aW91cyB3YWxrIGJlbG93CiAJCQkJfQotCQkJCWlmICgobWFzayAmIEJpbmRpbmcuUEFDS0FHRSkgIT0gMCAmJiBiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpCi0JCQkJCXJldHVybiBiaW5kaW5nOyAvLyBjYWNoZWQgcGFja2FnZSBmb3VuZCBpbiBwcmV2aW91cyB3YWxrIGJlbG93CisJCQkJaWYgKChtYXNrICYgQmluZGluZy5QQUNLQUdFKSAhPSAwICYmIGNhY2hlZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykKKwkJCQkJcmV0dXJuIGNhY2hlZEJpbmRpbmc7IC8vIGNhY2hlZCBwYWNrYWdlIGZvdW5kIGluIHByZXZpb3VzIHdhbGsgYmVsb3cKIAkJCX0KIAkJfQogCkBAIC0yMzcxLDEyICsyNjY5LDggQEAKIAkJCQkJSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nID0gaW1wb3J0c1tpXTsKIAkJCQkJaWYgKCFpbXBvcnRCaW5kaW5nLm9uRGVtYW5kKSB7CiAJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWVbaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIG5hbWUpKSB7Ci0JCQkJCQkJQmluZGluZyByZXNvbHZlZEltcG9ydCA9IHVuaXRTY29wZS5yZXNvbHZlU2luZ2xlSW1wb3J0KGltcG9ydEJpbmRpbmcpOworCQkJCQkJCUJpbmRpbmcgcmVzb2x2ZWRJbXBvcnQgPSB1bml0U2NvcGUucmVzb2x2ZVNpbmdsZUltcG9ydChpbXBvcnRCaW5kaW5nLCBCaW5kaW5nLlRZUEUpOwogCQkJCQkJCWlmIChyZXNvbHZlZEltcG9ydCA9PSBudWxsKSBjb250aW51ZSBuZXh0SW1wb3J0OwotCQkJCQkJCWlmIChyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKLQkJCQkJCQkJcmVzb2x2ZWRJbXBvcnQgPSBnZXRUeXBlKGltcG9ydEJpbmRpbmcuY29tcG91bmROYW1lLCBpbXBvcnRCaW5kaW5nLmNvbXBvdW5kTmFtZS5sZW5ndGgpOwotCQkJCQkJCQlpZiAoIXJlc29sdmVkSW1wb3J0LmlzVmFsaWRCaW5kaW5nKCkpIGNvbnRpbnVlIG5leHRJbXBvcnQ7Ci0JCQkJCQkJfQogCQkJCQkJCWlmIChyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIFR5cGVCaW5kaW5nKSB7CiAJCQkJCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSBpbXBvcnRCaW5kaW5nLnJlZmVyZW5jZTsKIAkJCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSAhPSBudWxsKQpAQCAtMjM4OSwxMyArMjY4MywxNiBAQAogCQkJfQogCiAJCQkvLyBjaGVjayBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgY3VycmVudCBwYWNrYWdlLCBza2lwIGl0IGlmIGl0cyBhIHN1Yi1wYWNrYWdlCi0JCQlQYWNrYWdlQmluZGluZyBjdXJyZW50UGFja2FnZSA9IHVuaXRTY29wZS5mUGFja2FnZTsgCisJCQlQYWNrYWdlQmluZGluZyBjdXJyZW50UGFja2FnZSA9IHVuaXRTY29wZS5mUGFja2FnZTsKIAkJCXVuaXRTY29wZS5yZWNvcmRSZWZlcmVuY2UoY3VycmVudFBhY2thZ2UuY29tcG91bmROYW1lLCBuYW1lKTsKIAkJCUJpbmRpbmcgYmluZGluZyA9IGN1cnJlbnRQYWNrYWdlLmdldFR5cGVPclBhY2thZ2UobmFtZSk7CiAJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKLQkJCQlpZiAodHlwZU9yUGFja2FnZUNhY2hlICE9IG51bGwpCi0JCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgYmluZGluZyk7Ci0JCQkJcmV0dXJuIGJpbmRpbmc7IC8vIHR5cGUgaXMgYWx3YXlzIHZpc2libGUgdG8gaXRzIG93biBwYWNrYWdlCisJCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJaWYgKChyZWZlcmVuY2VUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQkJCWlmICh0eXBlT3JQYWNrYWdlQ2FjaGUgIT0gbnVsbCkKKwkJCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgcmVmZXJlbmNlVHlwZSk7CisJCQkJCXJldHVybiByZWZlcmVuY2VUeXBlOyAvLyB0eXBlIGlzIGFsd2F5cyB2aXNpYmxlIHRvIGl0cyBvd24gcGFja2FnZQorCQkJCX0KIAkJCX0KIAogCQkJLy8gY2hlY2sgb24gZGVtYW5kIGltcG9ydHMKQEAgLTI0MjQsNyArMjcyMSw3IEBACiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKGZvdW5kSW5JbXBvcnQpIHsKIAkJCQkJCQkJCS8vIEFuc3dlciBlcnJvciBiaW5kaW5nIC0tIGltcG9ydCBvbiBkZW1hbmQgY29uZmxpY3Q7IG5hbWUgZm91bmQgaW4gdHdvIGltcG9ydCBvbiBkZW1hbmQgcGFja2FnZXMuCi0JCQkJCQkJCQl0ZW1wID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIHR5cGUsIFByb2JsZW1SZWFzb25zLkFtYmlndW91cyk7CisJCQkJCQkJCQl0ZW1wID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyW11bXXtuYW1lfSwgdHlwZSwgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzKTsKIAkJCQkJCQkJCWlmICh0eXBlT3JQYWNrYWdlQ2FjaGUgIT0gbnVsbCkKIAkJCQkJCQkJCQl0eXBlT3JQYWNrYWdlQ2FjaGUucHV0KG5hbWUsIHRlbXApOwogCQkJCQkJCQkJcmV0dXJuIHRlbXA7CkBAIC0yNDU3LDEzICsyNzU0LDMzIEBACiAKIAkJLy8gQW5zd2VyIGVycm9yIGJpbmRpbmcgLS0gY291bGQgbm90IGZpbmQgbmFtZQogCQlpZiAoZm91bmRUeXBlID09IG51bGwpIHsKLQkJCWZvdW5kVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBudWxsLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQljaGFyW11bXSBxTmFtZSA9IG5ldyBjaGFyW11bXSB7IG5hbWUgfTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgY2xvc2VzdE1hdGNoID0gbnVsbDsKKwkJCWlmICgobWFzayAmIEJpbmRpbmcuUEFDS0FHRSkgIT0gMCkgeworCQkJCWlmIChuZWVkUmVzb2x2ZSkgeworCQkJCQljbG9zZXN0TWF0Y2ggPSBlbnZpcm9ubWVudCgpLmNyZWF0ZU1pc3NpbmdUeXBlKHVuaXRTY29wZS5mUGFja2FnZSwgcU5hbWUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB1bml0U2NvcGUuZW52aXJvbm1lbnQuZ2V0VG9wTGV2ZWxQYWNrYWdlKG5hbWUpOworCQkJCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8ICFwYWNrYWdlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCWlmIChuZWVkUmVzb2x2ZSkgeworCQkJCQkJY2xvc2VzdE1hdGNoID0gZW52aXJvbm1lbnQoKS5jcmVhdGVNaXNzaW5nVHlwZSh1bml0U2NvcGUuZlBhY2thZ2UsIHFOYW1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZvdW5kVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhxTmFtZSwgY2xvc2VzdE1hdGNoLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CisJCQlpZiAodHlwZU9yUGFja2FnZUNhY2hlICE9IG51bGwgJiYgKG1hc2sgJiBCaW5kaW5nLlBBQ0tBR0UpICE9IDApIHsgLy8gb25seSBwdXQgTm90Rm91bmQgdHlwZSBpbiBjYWNoZSBpZiB5b3Uga25vdyBpdHMgbm90IGEgcGFja2FnZQorCQkJCXR5cGVPclBhY2thZ2VDYWNoZS5wdXQobmFtZSwgZm91bmRUeXBlKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoZm91bmRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQljaGFyW11bXSBxTmFtZSA9IG5ldyBjaGFyW11bXSB7IG5hbWUgfTsKKwkJCWZvdW5kVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhxTmFtZSwgZm91bmRUeXBlLCBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCk7CiAJCQlpZiAodHlwZU9yUGFja2FnZUNhY2hlICE9IG51bGwgJiYgKG1hc2sgJiBCaW5kaW5nLlBBQ0tBR0UpICE9IDApIC8vIG9ubHkgcHV0IE5vdEZvdW5kIHR5cGUgaW4gY2FjaGUgaWYgeW91IGtub3cgaXRzIG5vdCBhIHBhY2thZ2UKIAkJCQl0eXBlT3JQYWNrYWdlQ2FjaGUucHV0KG5hbWUsIGZvdW5kVHlwZSk7CiAJCX0KIAkJcmV0dXJuIGZvdW5kVHlwZTsKIAl9Ci0JCisKIAkvLyBBZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gTk9UIFB1YmxpYyBBUEkKIAkvLyBETyBOT1QgVVNFIHRvIHJlc29sdmUgaW1wb3J0IHJlZmVyZW5jZXMgc2luY2UgdGhpcyBtZXRob2QgYXNzdW1lcyAnQS5CJyBpcyByZWxhdGl2ZSB0byBhIHNpbmdsZSB0eXBlIGltcG9ydCBvZiAncDEuQScKIAkvLyB3aGVuIGl0IG1heSBhY3R1YWxseSBtZWFuIHRoZSB0eXBlIEIgaW4gdGhlIHBhY2thZ2UgQQpAQCAtMjQ3NCw3ICsyNzkxLDcgQEAKIAkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBnZXRCYXNlVHlwZShjb21wb3VuZE5hbWVbMF0pOwogCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgcmV0dXJuIGJpbmRpbmc7CiAJCX0KLQkJQmluZGluZyBiaW5kaW5nID0gZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIEJpbmRpbmcuVFlQRSB8IEJpbmRpbmcuUEFDS0FHRSk7CisJCUJpbmRpbmcgYmluZGluZyA9IGdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lWzBdLCBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlBBQ0tBR0UsIHRydWUpOwogCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIGJpbmRpbmc7CiAKIAkJaW50IGN1cnJlbnRJbmRleCA9IDE7CkBAIC0yNDkyLDcgKzI4MDksNyBAQAogCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQogCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAogCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCQliaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/ICgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSA6IG51bGwsCisJCQkJCQliaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/IChSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSA6IG51bGwsCiAJCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKIAkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQogCQkJCQlicmVhazsKQEAgLTI1MDMsNyArMjgyMCw3IEBACiAJCX0KIAkJLy8gYmluZGluZyBpcyBub3cgYSBSZWZlcmVuY2VCaW5kaW5nCiAJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKLQkJUmVmZXJlbmNlQmluZGluZyBxdWFsaWZpZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuZW52aXJvbm1lbnQoKS5jb252ZXJ0VG9SYXdUeXBlKHR5cGVCaW5kaW5nKTsKKwkJUmVmZXJlbmNlQmluZGluZyBxdWFsaWZpZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIGVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0eXBlQmluZGluZywgZmFsc2UgLypkbyBub3QgZm9yY2UgY29udmVyc2lvbiBvZiBlbmNsb3NpbmcgdHlwZXMqLyk7CiAKIAkJaWYgKGNoZWNrVmlzaWJpbGl0eSkgLy8gaGFuZGxlcyB0aGUgZmFsbCB0aHJvdWdoIGNhc2UKIAkJCWlmICghdHlwZUJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcykpCkBAIC0yNTE4LDE5ICsyODM1LDE5IEBACiAJCQlpZiAoIXR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCiAJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKIAkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCi0JCQkJCSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcuY2xvc2VzdE1hdGNoKCksCiAJCQkJCXR5cGVCaW5kaW5nLnByb2JsZW1JZCgpKTsKLQkJCQorCiAJCQlpZiAodHlwZUJpbmRpbmcuaXNHZW5lcmljVHlwZSgpKSB7Ci0JCQkJcXVhbGlmaWVkVHlwZSA9IHRoaXMuZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKHR5cGVCaW5kaW5nLCBxdWFsaWZpZWRUeXBlKTsKKwkJCQlxdWFsaWZpZWRUeXBlID0gZW52aXJvbm1lbnQoKS5jcmVhdGVSYXdUeXBlKHR5cGVCaW5kaW5nLCBxdWFsaWZpZWRUeXBlKTsKIAkJCX0gZWxzZSB7CiAJCQkJcXVhbGlmaWVkVHlwZSA9IChxdWFsaWZpZWRUeXBlICE9IG51bGwgJiYgKHF1YWxpZmllZFR5cGUuaXNSYXdUeXBlKCkgfHwgcXVhbGlmaWVkVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpKQotCQkJCQk/IHRoaXMuZW52aXJvbm1lbnQoKS5jcmVhdGVQYXJhbWV0ZXJpemVkVHlwZSh0eXBlQmluZGluZywgbnVsbCwgcXVhbGlmaWVkVHlwZSkKKwkJCQkJPyBlbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKHR5cGVCaW5kaW5nLCBudWxsLCBxdWFsaWZpZWRUeXBlKQogCQkJCQk6IHR5cGVCaW5kaW5nOwogCQkJfQogCQl9CiAJCXJldHVybiBxdWFsaWZpZWRUeXBlOwotCX0JCisJfQogCiAJcHJvdGVjdGVkIGJvb2xlYW4gaGFzRXJhc2VkQ2FuZGlkYXRlc0NvbGxpc2lvbnMoVHlwZUJpbmRpbmcgb25lLCBUeXBlQmluZGluZyB0d28sIE1hcCBpbnZvY2F0aW9ucywgUmVmZXJlbmNlQmluZGluZyB0eXBlLCBBU1ROb2RlIHR5cGVSZWYpIHsKIAkJaW52b2NhdGlvbnMuY2xlYXIoKTsKQEAgLTI1NzAsMjIgKzI4ODcsNDMgQEAKIAkJaW50IG9uZVBhcmFtc0xlbmd0aCA9IG9uZVBhcmFtcy5sZW5ndGg7CiAJCWludCB0d29QYXJhbXNMZW5ndGggPSB0d29QYXJhbXMubGVuZ3RoOwogCQlpZiAob25lUGFyYW1zTGVuZ3RoID09IHR3b1BhcmFtc0xlbmd0aCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbmVQYXJhbXNMZW5ndGg7IGkrKykgewotCQkJCVR5cGVCaW5kaW5nIG9uZVBhcmFtID0gb25lUGFyYW1zW2ldOwotCQkJCVR5cGVCaW5kaW5nIHR3b1BhcmFtID0gdHdvUGFyYW1zW2ldOwotCQkJCWlmIChvbmVQYXJhbSA9PSB0d29QYXJhbSkgewotCQkJCQlpZiAob25lUGFyYW0ubGVhZkNvbXBvbmVudFR5cGUoKS5pc1Jhd1R5cGUoKSkgewotCQkJCQkJLy8gQSNSQVcgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiBhIHJhd2lmaWVkIEE8VD4KLQkJCQkJCWlmIChvbmVQYXJhbSA9PSBvbmUub3JpZ2luYWwoKS5wYXJhbWV0ZXJzW2ldICYmIG9uZVBhcmFtICE9IHR3by5vcmlnaW5hbCgpLnBhcmFtZXRlcnNbaV0pCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAob25lUGFyYW0uaXNDb21wYXRpYmxlV2l0aCh0d29QYXJhbSkpIHsKLQkJCQkJaWYgKG9uZVBhcmFtLmxlYWZDb21wb25lbnRUeXBlKCkuaXNSYXdUeXBlKCkpIHsKLQkJCQkJCS8vIEEjUkFXIGlzIG5vdCBtb3JlIHNwZWNpZmljIHRoYW4gYSByYXdpZmllZCBBPFQ+Ci0JCQkJCQlpZiAob25lUGFyYW0ubmVlZHNVbmNoZWNrZWRDb252ZXJzaW9uKHR3by5kZWNsYXJpbmdDbGFzcy5pc1Jhd1R5cGUoKSA/IHR3b1BhcmFtIDogdHdvLm9yaWdpbmFsKCkucGFyYW1ldGVyc1tpXSkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJLyogQmVsb3cgMS41LCBkaXNjYXJkIGFueSBnZW5lcmljcyB3ZSBoYXZlIGxlZnQgaW4gZm9yIHRoZSBtZXRob2QgdmVyaWZpZXIncyBiZW5lZml0LCAoc28gaXQKKwkJCSAgIGNhbiBkZXRlY3QgbWV0aG9kIG92ZXJyaWRpbmcgcHJvcGVybHkgaW4gdGhlIHByZXNlbmNlIG9mIGdlbmVyaWMgc3VwZXIgdHlwZXMuKSBUaGlzIGlzIHNvCisJCQkgICBhcyB0byBhbGxvdyB1cyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGJlZW4gaGFuZGVkIGFuIGFjY2VwdGFibGUgbWV0aG9kIGluIDEuNCB0ZXJtcworCQkJICAgd2l0aG91dCBhbGwgdGhlIDEuNWlzbXMgYmVsb3cga2lja2luZyBpbiBhbmQgc3BvaWxpbmcgdGhlIHBhcnR5LgorCQkJICAgU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE0NDYKKwkJCSovCisJCQlib29sZWFuIGFwcGx5RXJhc3VyZSA9ICBlbnZpcm9ubWVudCgpLmdsb2JhbE9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgb25lUGFyYW1zTGVuZ3RoOyBpKyspIHsKKwkJCQlUeXBlQmluZGluZyBvbmVQYXJhbSA9IGFwcGx5RXJhc3VyZSA/IG9uZVBhcmFtc1tpXS5lcmFzdXJlKCkgOiBvbmVQYXJhbXNbaV07CisJCQkJVHlwZUJpbmRpbmcgdHdvUGFyYW0gPSBhcHBseUVyYXN1cmUgPyB0d29QYXJhbXNbaV0uZXJhc3VyZSgpIDogdHdvUGFyYW1zW2ldOworCQkJCWlmIChvbmVQYXJhbSA9PSB0d29QYXJhbSB8fCBvbmVQYXJhbS5pc0NvbXBhdGlibGVXaXRoKHR3b1BhcmFtKSkgeworCQkJCQlpZiAodHdvLmRlY2xhcmluZ0NsYXNzLmlzUmF3VHlwZSgpKSBjb250aW51ZSBuZXh0OworCisJCQkJCVR5cGVCaW5kaW5nIGxlYWZDb21wb25lbnRUeXBlID0gdHdvLm9yaWdpbmFsKCkucGFyYW1ldGVyc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQkJCQlUeXBlQmluZGluZyBvcmlnaW5hbFR3b1BhcmFtID0gYXBwbHlFcmFzdXJlID8gbGVhZkNvbXBvbmVudFR5cGUuZXJhc3VyZSgpIDogbGVhZkNvbXBvbmVudFR5cGU7IAorCQkJCQlzd2l0Y2ggKG9yaWdpbmFsVHdvUGFyYW0ua2luZCgpKSB7CisJCQkJCSAgIAljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgorCQkJCQkgICAJCWlmICgoKFR5cGVWYXJpYWJsZUJpbmRpbmcpIG9yaWdpbmFsVHdvUGFyYW0pLmhhc09ubHlSYXdCb3VuZHMoKSkKKwkJCQkJCSAgIAkJY29udGludWUgbmV4dDsKKwkJCQkJICAgCQkvLyRGQUxMLVRIUk9VR0gkCisJCQkJCSAgIAljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJCSAgIAljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CisJCQkJCSAgIAljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKKwkJCQkJCQlUeXBlQmluZGluZyBvcmlnaW5hbE9uZVBhcmFtID0gb25lLm9yaWdpbmFsKCkucGFyYW1ldGVyc1tpXS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQkJCQkJCXN3aXRjaCAob3JpZ2luYWxPbmVQYXJhbS5raW5kKCkpIHsKKwkJCQkJCQkgICAJY2FzZSBCaW5kaW5nLlRZUEUgOgorCQkJCQkJCSAgIAljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFIDoKKwkJCQkJCQkJCVR5cGVCaW5kaW5nIGluaGVyaXRlZFR3b1BhcmFtID0gb25lUGFyYW0uZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0d29QYXJhbSk7CisJCQkJCQkJCQlpZiAoaW5oZXJpdGVkVHdvUGFyYW0gPT0gbnVsbCB8fCAhaW5oZXJpdGVkVHdvUGFyYW0ubGVhZkNvbXBvbmVudFR5cGUoKS5pc1Jhd1R5cGUoKSkgYnJlYWs7CisJCQkJCQkJICAgCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJICAgCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6CisJCQkJCQkJICAgCQlpZiAoISgoVHlwZVZhcmlhYmxlQmluZGluZykgb3JpZ2luYWxPbmVQYXJhbSkudXBwZXJCb3VuZCgpLmlzUmF3VHlwZSgpKSBicmVhazsKKwkJCQkJCQkgICAJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkgICAJY2FzZSBCaW5kaW5nLlJBV19UWVBFOgorCQkJCQkJCSAgIAkJLy8gb3JpZ2luYWxPbmVQYXJhbSBpcyBSQVcgc28gaXQgY2Fubm90IGJlIG1vcmUgc3BlY2lmaWMgdGhhbiBhIHdpbGRjYXJkIG9yIHBhcmFtZXRlcml6ZWQgdHlwZQorCQkJCQkJCSAgIAkJcmV0dXJuIGZhbHNlOworCQkJCQkJCX0KIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCWlmIChpID09IG9uZVBhcmFtc0xlbmd0aCAtIDEgJiYgb25lLmlzVmFyYXJncygpICYmIHR3by5pc1ZhcmFyZ3MoKSkgewpAQCAtMjYxMCwyNCArMjk0OCwyNCBAQAogCQkJCWlmIChvbmVQYXJhbXNbaV0gIT0gdHdvUGFyYW1zW2ldICYmICFvbmVQYXJhbXNbaV0uaXNDb21wYXRpYmxlV2l0aCh0d29QYXJhbXNbaV0pKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQlpZiAocGFyYW1ldGVyQ29tcGF0aWJpbGl0eUxldmVsKG9uZSwgdHdvUGFyYW1zKSA9PSBOT1RfQ09NUEFUSUJMRQotCQkJCSYmIHBhcmFtZXRlckNvbXBhdGliaWxpdHlMZXZlbCh0d28sIG9uZVBhcmFtcykgPT0gVkFSQVJHU19DT01QQVRJQkxFKQotCQkJCQlyZXR1cm4gdHJ1ZTsgCisJCQkJCSYmIHBhcmFtZXRlckNvbXBhdGliaWxpdHlMZXZlbCh0d28sIG9uZVBhcmFtcykgPT0gVkFSQVJHU19DT01QQVRJQkxFKQorCQkJCXJldHVybiB0cnVlOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0KKwkKIAlwdWJsaWMgYm9vbGVhbiBpc0JveGluZ0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlLCBUeXBlQmluZGluZyB0YXJnZXRUeXBlKSB7CiAJCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50ID0gZW52aXJvbm1lbnQoKTsKIAkJaWYgKGVudmlyb25tZW50Lmdsb2JhbE9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81IHx8IGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSA9PSB0YXJnZXRUeXBlLmlzQmFzZVR5cGUoKSkKIAkJCXJldHVybiBmYWxzZTsKLQkKKwogCQkvLyBjaGVjayBpZiBhdXRvYm94ZWQgdHlwZSBpcyBjb21wYXRpYmxlCiAJCVR5cGVCaW5kaW5nIGNvbnZlcnRlZFR5cGUgPSBlbnZpcm9ubWVudC5jb21wdXRlQm94aW5nVHlwZShleHByZXNzaW9uVHlwZSk7CiAJCXJldHVybiBjb252ZXJ0ZWRUeXBlID09IHRhcmdldFR5cGUgfHwgY29udmVydGVkVHlwZS5pc0NvbXBhdGlibGVXaXRoKHRhcmdldFR5cGUpOwogCX0KIAogCS8qIEFuc3dlciB0cnVlIGlmIHRoZSBzY29wZSBpcyBuZXN0ZWQgaW5zaWRlIGEgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24uCi0JICogTm90ZTogaXQgd29ya3MgYXMgbG9uZyBhcyB0aGUgc2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4IGlzIHJlZmxlY3RpbmcgdGhlIGZpZWxkIGJlaW5nIHRyYXZlcnNlZCAKKwkgKiBOb3RlOiBpdCB3b3JrcyBhcyBsb25nIGFzIHRoZSBzY29wZS5maWVsZERlY2xhcmF0aW9uSW5kZXggaXMgcmVmbGVjdGluZyB0aGUgZmllbGQgYmVpbmcgdHJhdmVyc2VkCiAJICogZS5nLiBkdXJpbmcgbmFtZSByZXNvbHV0aW9uLgogCSovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZpbmVkSW5GaWVsZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKQEAgLTI2NzgsNyArMzAxNiw3IEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCQorCiAJLyogQW5zd2VyIHRydWUgaWYgdGhlIHNjb3BlIGlzIG5lc3RlZCBpbnNpZGUgYSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uCiAJKi8KIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmluZWRJblR5cGUoUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7CkBAIC0yNjkyLDcgKzMwMzAsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JLyoqIAorCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2NvcGUgb3Igb25lIG9mIGl0cyBwYXJlbnQgaXMgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGNhc2VTdGF0ZW1lbnQsIGRlbm90aW5nCiAJICogYmVpbmcgcGFydCBvZiBhIGdpdmVuIHN3aXRjaCBjYXNlIHN0YXRlbWVudC4KIAkgKi8KQEAgLTI3MDksNyArMzA0Nyw3IEBACiAJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNJbnNpZGVEZXByZWNhdGVkQ29kZSgpewogCQlzd2l0Y2godGhpcy5raW5kKXsKIAkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgpAQCAtMjcyMCwyMyArMzA1OCwyMiBAQAogCQkJCQlNZXRob2RCaW5kaW5nIGNvbnRleHQgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCkuYmluZGluZzsKIAkJCQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmlzVmlld2VkQXNEZXByZWNhdGVkKCkpCiAJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTb3VyY2VUeXBlQmluZGluZyB0eXBlID0gKChCbG9ja1Njb3BlKXRoaXMpLnJlZmVyZW5jZVR5cGUoKS5iaW5kaW5nOworCQkJCX0gZWxzZSBpZiAobWV0aG9kU2NvcGUuaW5pdGlhbGl6ZWRGaWVsZCAhPSBudWxsICYmIG1ldGhvZFNjb3BlLmluaXRpYWxpemVkRmllbGQuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkgewogCQkJCQkvLyBpbnNpZGUgZmllbGQgZGVjbGFyYXRpb24gPyBjaGVjayBmaWVsZCBtb2RpZmllciB0byBzZWUgaWYgZGVwcmVjYXRlZAotCQkJCQlpZiAobWV0aG9kU2NvcGUuaW5pdGlhbGl6ZWRGaWVsZCAhPSBudWxsICYmIG1ldGhvZFNjb3BlLmluaXRpYWxpemVkRmllbGQuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ1R5cGUgPSAoKEJsb2NrU2NvcGUpdGhpcykucmVmZXJlbmNlVHlwZSgpLmJpbmRpbmc7CisJCQkJaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgeworCQkJCQlkZWNsYXJpbmdUeXBlLmluaXRpYWxpemVEZXByZWNhdGVkQW5ub3RhdGlvblRhZ0JpdHMoKTsgLy8gbWF5IG5vdCBoYXZlIGJlZW4gcmVzb2x2ZWQgdW50aWwgdGhlbgorCQkJCQlpZiAoZGVjbGFyaW5nVHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKQogCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJCXR5cGUuaW5pdGlhbGl6ZURlcHJlY2F0ZWRBbm5vdGF0aW9uVGFnQml0cygpOyAvLyBtYXkgbm90IGhhdmUgYmVlbiByZXNvbHZlZCB1bnRpbCB0aGVuCi0JCQkJCQlpZiAodHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CiAJCQkJUmVmZXJlbmNlQmluZGluZyBjb250ZXh0ID0gKChDbGFzc1Njb3BlKXRoaXMpLnJlZmVyZW5jZVR5cGUoKS5iaW5kaW5nOwogCQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKIAkJCQkJY29udGV4dC5pbml0aWFsaXplRGVwcmVjYXRlZEFubm90YXRpb25UYWdCaXRzKCk7IC8vIG1heSBub3QgaGF2ZSBiZWVuIHJlc29sdmVkIHVudGlsIHRoZW4KLQkJCQkJaWYgKGNvbnRleHQuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkgCisJCQkJCWlmIChjb250ZXh0LmlzVmlld2VkQXNEZXByZWNhdGVkKCkpCiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yNzU1LDYgKzMwOTIsNzIgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCXByaXZhdGUgYm9vbGVhbiBpc092ZXJyaWRkZW5NZXRob2RHZW5lcmljKE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CisJCU1ldGhvZFZlcmlmaWVyIHZlcmlmaWVyID0gZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpOworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKTsKKwkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKKwkJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50TWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMobWV0aG9kLnNlbGVjdG9yKTsKKwkJCWZvciAoaW50IGkgPSAwLCBsID0gY3VycmVudE1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQkJTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kID0gY3VycmVudE1ldGhvZHNbaV07CisJCQkJaWYgKGN1cnJlbnRNZXRob2QgIT0gbnVsbCAmJiBjdXJyZW50TWV0aG9kLm9yaWdpbmFsKCkudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKQorCQkJCQlpZiAodmVyaWZpZXIuZG9lc01ldGhvZE92ZXJyaWRlKG1ldGhvZCwgY3VycmVudE1ldGhvZCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlU3VidHlwZU9mUmF3VHlwZShUeXBlQmluZGluZyBwYXJhbVR5cGUpIHsKKwkJVHlwZUJpbmRpbmcgdCA9IHBhcmFtVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQlpZiAodC5pc0Jhc2VUeXBlKCkpIHJldHVybiBmYWxzZTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHQ7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CisJCWludCBuZXh0UG9zaXRpb24gPSAwOworCQlkbyB7CisJCQlpZiAoY3VycmVudFR5cGUuaXNSYXdUeXBlKCkpIHJldHVybiB0cnVlOworCQkJaWYgKCFjdXJyZW50VHlwZS5pc0hpZXJhcmNoeUNvbm5lY3RlZCgpKSByZXR1cm4gdHJ1ZTsgLy8gZG8gbm90IGZhdWx0IGluIHN1cGVyIHR5cGVzIHJpZ2h0IG5vdywgc28gYXNzdW1lIG9uZSBpcyBhIHJhdyB0eXBlCisJCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gbnVsbCAmJiBpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpIHsKKwkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOworCQkJCQluZXh0UG9zaXRpb24gPSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGg7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGl0c0xlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOworCQkJCQlpZiAobmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoID49IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoICsgNV0sIDAsIG5leHRQb3NpdGlvbik7CisJCQkJCW5leHRJbnRlcmZhY2UgOiBmb3IgKGludCBhID0gMDsgYSA8IGl0c0xlbmd0aDsgYSsrKSB7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIG5leHQgPSBpdHNJbnRlcmZhY2VzW2FdOworCQkJCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBuZXh0UG9zaXRpb247IGIrKykKKwkJCQkJCQlpZiAobmV4dCA9PSBpbnRlcmZhY2VzVG9WaXNpdFtiXSkgY29udGludWUgbmV4dEludGVyZmFjZTsKKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W25leHRQb3NpdGlvbisrXSA9IG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0UG9zaXRpb247IGkrKykgeworCQkJY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCWlmIChjdXJyZW50VHlwZS5pc1Jhd1R5cGUoKSkgcmV0dXJuIHRydWU7CisKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBudWxsICYmIGl0c0ludGVyZmFjZXMgIT0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVMpIHsKKwkJCQlpbnQgaXRzTGVuZ3RoID0gaXRzSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbmV4dFBvc2l0aW9uICsgaXRzTGVuZ3RoICsgNV0sIDAsIG5leHRQb3NpdGlvbik7CisJCQkJbmV4dEludGVyZmFjZSA6IGZvciAoaW50IGEgPSAwOyBhIDwgaXRzTGVuZ3RoOyBhKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBuZXh0ID0gaXRzSW50ZXJmYWNlc1thXTsKKwkJCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBuZXh0UG9zaXRpb247IGIrKykKKwkJCQkJCWlmIChuZXh0ID09IGludGVyZmFjZXNUb1Zpc2l0W2JdKSBjb250aW51ZSBuZXh0SW50ZXJmYWNlOworCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtuZXh0UG9zaXRpb24rK10gPSBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJcHJpdmF0ZSBUeXBlQmluZGluZyBsZWFzdENvbnRhaW5pbmdJbnZvY2F0aW9uKFR5cGVCaW5kaW5nIG1lYywgT2JqZWN0IGludm9jYXRpb25EYXRhLCBMaXN0IGx1YlN0YWNrKSB7CiAJCWlmIChpbnZvY2F0aW9uRGF0YSA9PSBudWxsKSByZXR1cm4gbWVjOyAvLyBubyBhbHRlcm5hdGUgaW52b2NhdGlvbgogCQlpZiAoaW52b2NhdGlvbkRhdGEgaW5zdGFuY2VvZiBUeXBlQmluZGluZykgeyAvLyBvbmx5IG9uZSBpbnZvY2F0aW9uLCBzaW1wbHkgcmV0dXJuIGl0IChhcnJheSBvbmx5IGFsbG9jYXRlZCBpZiBtb3JlIHRoYW4gb25lKQpAQCAtMjc2NSw3ICszMTY4LDcgQEAKIAkJLy8gaWYgbWVjIGlzIGFuIGFycmF5IHR5cGUsIGludGVyc2VjdCBpbnZvY2F0aW9uIGxlYWYgY29tcG9uZW50IHR5cGVzLCB0aGVuIHByb21vdGUgYmFjayB0byBhcnJheQogCQlpbnQgZGltID0gbWVjLmRpbWVuc2lvbnMoKTsKIAkJbWVjID0gbWVjLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JCQorCiAJCWludCBhcmdMZW5ndGggPSBtZWMudHlwZVZhcmlhYmxlcygpLmxlbmd0aDsKIAkJaWYgKGFyZ0xlbmd0aCA9PSAwKSByZXR1cm4gbWVjOyAvLyBzaG91bGQgYmUgY2F1Z2h0IGJ5IG5vIGludm9jYXRpb24gY2hlY2sKIApAQCAtMjc5Nyw3ICszMjAwLDcgQEAKIAkJVHlwZUJpbmRpbmcgbGVhc3QgPSBlbnZpcm9ubWVudCgpLmNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlKChSZWZlcmVuY2VCaW5kaW5nKSBtZWMuZXJhc3VyZSgpLCBiZXN0QXJndW1lbnRzLCBtZWMuZW5jbG9zaW5nVHlwZSgpKTsKIAkJcmV0dXJuIGRpbSA9PSAwID8gbGVhc3QgOiBlbnZpcm9ubWVudCgpLmNyZWF0ZUFycmF5VHlwZShsZWFzdCwgZGltKTsKIAl9Ci0JCisKIAkvLyBKTFMgMTUuMTIuMgogCXByaXZhdGUgVHlwZUJpbmRpbmcgbGVhc3RDb250YWluaW5nVHlwZUFyZ3VtZW50KFR5cGVCaW5kaW5nIHUsIFR5cGVCaW5kaW5nIHYsIFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUsIGludCByYW5rLCBMaXN0IGx1YlN0YWNrKSB7CiAJCWlmICh1ID09IG51bGwpIHJldHVybiB2OwpAQCAtMjgxMSwyNyArMzIxNCwyNyBAQAogCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgogCQkJCQkJc3dpdGNoKHdpbGRWLmJvdW5kS2luZCkgewogCQkJCQkJCS8vID8gZXh0ZW5kcyBVLCA/IGV4dGVuZHMgVgotCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUyA6ICAKKwkJCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgogCQkJCQkJCQlUeXBlQmluZGluZyBsdWIgPSBsb3dlclVwcGVyQm91bmQobmV3IFR5cGVCaW5kaW5nW117d2lsZFUuYm91bmQsd2lsZFYuYm91bmR9LCBsdWJTdGFjayk7CiAJCQkJCQkJCWlmIChsdWIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQkJCQkJCS8vIGludCBpcyByZXR1cm5lZCB0byBkZW5vdGUgY3ljbGUgZGV0ZWN0ZWQgaW4gbHViIGNvbXB1dGF0aW9uIC0gc3RvcCByZWN1cnNpb24gYnkgYW5zd2VyaW5nIHVuYm91bmQgd2lsZGNhcmQKIAkJCQkJCQkJaWYgKGx1YiA9PSBUeXBlQmluZGluZy5JTlQpIHJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBudWxsLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywgV2lsZGNhcmQuVU5CT1VORCk7Ci0JCQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBsdWIsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5FWFRFTkRTKTsJCisJCQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBsdWIsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5FWFRFTkRTKTsKIAkJCQkJCQkvLyA/IGV4dGVuZHMgVSwgPyBTVVBFUiBWCi0JCQkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6IAorCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVIgOgogCQkJCQkJCQlpZiAod2lsZFUuYm91bmQgPT0gd2lsZFYuYm91bmQpIHJldHVybiB3aWxkVS5ib3VuZDsKIAkJCQkJCQkJcmV0dXJuIGVudmlyb25tZW50KCkuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIG51bGwsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5VTkJPVU5EKTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQkJLy8gPyBzdXBlciBVCi0JCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVIgOiAKKwkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6CiAJCQkJCQkvLyA/IHN1cGVyIFUsID8gc3VwZXIgVgogCQkJCQkJaWYgKHdpbGRVLmJvdW5kS2luZCA9PSBXaWxkY2FyZC5TVVBFUikgewogCQkJCQkJCVR5cGVCaW5kaW5nW10gZ2xiID0gZ3JlYXRlckxvd2VyQm91bmQobmV3IFR5cGVCaW5kaW5nW117d2lsZFUuYm91bmQsd2lsZFYuYm91bmR9KTsKIAkJCQkJCQlpZiAoZ2xiID09IG51bGwpIHJldHVybiBudWxsOwogCQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBnbGJbMF0sIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5TVVBFUik7CS8vIFRPRE8gKHBoaWxpcHBlKSBuZWVkIHRvIGNhcHR1cmUgZW50aXJlIGJvdW5kcwogCQkJCQkJfQotCQkJCX0JCQkJCisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzd2l0Y2ggKHdpbGRWLmJvdW5kS2luZCkgewogCQkJCQkvLyBVLCA/IGV4dGVuZHMgVgpAQCAtMjg0MCw3ICszMjQzLDcgQEAKIAkJCQkJCWlmIChsdWIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQkJCQkvLyBpbnQgaXMgcmV0dXJuZWQgdG8gZGVub3RlIGN5Y2xlIGRldGVjdGVkIGluIGx1YiBjb21wdXRhdGlvbiAtIHN0b3AgcmVjdXJzaW9uIGJ5IGFuc3dlcmluZyB1bmJvdW5kIHdpbGRjYXJkCiAJCQkJCQlpZiAobHViID09IFR5cGVCaW5kaW5nLklOVCkgcmV0dXJuIGVudmlyb25tZW50KCkuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIG51bGwsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5VTkJPVU5EKTsKLQkJCQkJCXJldHVybiBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKGdlbmVyaWNUeXBlLCByYW5rLCBsdWIsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBXaWxkY2FyZC5FWFRFTkRTKTsJCisJCQkJCQlyZXR1cm4gZW52aXJvbm1lbnQoKS5jcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgbHViLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywgV2lsZGNhcmQuRVhURU5EUyk7CiAJCQkJCS8vIFUsID8gc3VwZXIgVgogCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSIDoKIAkJCQkJCVR5cGVCaW5kaW5nW10gZ2xiID0gZ3JlYXRlckxvd2VyQm91bmQobmV3IFR5cGVCaW5kaW5nW117dSx3aWxkVi5ib3VuZH0pOwpAQCAtMjg1OCwxMiArMzI2MSwxMiBAQAogCQkJCQlpZiAobHViID09IG51bGwpIHJldHVybiBudWxsOwogCQkJCQkvLyBpbnQgaXMgcmV0dXJuZWQgdG8gZGVub3RlIGN5Y2xlIGRldGVjdGVkIGluIGx1YiBjb21wdXRhdGlvbiAtIHN0b3AgcmVjdXJzaW9uIGJ5IGFuc3dlcmluZyB1bmJvdW5kIHdpbGRjYXJkCiAJCQkJCWlmIChsdWIgPT0gVHlwZUJpbmRpbmcuSU5UKSByZXR1cm4gZW52aXJvbm1lbnQoKS5jcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgbnVsbCwgbnVsbCAvKm5vIGV4dHJhIGJvdW5kKi8sIFdpbGRjYXJkLlVOQk9VTkQpOwotCQkJCQlyZXR1cm4gZW52aXJvbm1lbnQoKS5jcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgbHViLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywgV2lsZGNhcmQuRVhURU5EUyk7CQorCQkJCQlyZXR1cm4gZW52aXJvbm1lbnQoKS5jcmVhdGVXaWxkY2FyZChnZW5lcmljVHlwZSwgcmFuaywgbHViLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywgV2lsZGNhcmQuRVhURU5EUyk7CiAJCQkJLy8gVSwgPyBzdXBlciBWCiAJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6CiAJCQkJCVR5cGVCaW5kaW5nW10gZ2xiID0gZ3JlYXRlckxvd2VyQm91bmQobmV3IFR5cGVCaW5kaW5nW117d2lsZFUuYm91bmQsIHZ9KTsKIAkJCQkJaWYgKGdsYiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCQkJcmV0dXJuIGVudmlyb25tZW50KCkuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIGdsYlswXSwgbnVsbCAvKm5vIGV4dHJhIGJvdW5kKi8sIFdpbGRjYXJkLlNVUEVSKTsgLy8gVE9ETyAocGhpbGlwcGUpIG5lZWQgdG8gY2FwdHVyZSBlbnRpcmUgYm91bmRzCQkKKwkJCQkJcmV0dXJuIGVudmlyb25tZW50KCkuY3JlYXRlV2lsZGNhcmQoZ2VuZXJpY1R5cGUsIHJhbmssIGdsYlswXSwgbnVsbCAvKm5vIGV4dHJhIGJvdW5kKi8sIFdpbGRjYXJkLlNVUEVSKTsgLy8gVE9ETyAocGhpbGlwcGUpIG5lZWQgdG8gY2FwdHVyZSBlbnRpcmUgYm91bmRzCiAJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKIAkJCX0KIAkJfQpAQCAtMjg4NCwxMyArMzI4NywxMyBAQAogCQlpZiAodHlwZUxlbmd0aCA9PSAxKSB7CiAJCQlUeXBlQmluZGluZyB0eXBlID0gdHlwZXNbMF07CiAJCQlyZXR1cm4gdHlwZSA9PSBudWxsID8gVHlwZUJpbmRpbmcuVk9JRCA6IHR5cGU7Ci0JCX0JCQorCQl9CiAJCXJldHVybiBsb3dlclVwcGVyQm91bmQodHlwZXMsIG5ldyBBcnJheUxpc3QoMSkpOwogCX0KLQkKKwogCS8vIDE1LjEyLjIKIAlwcml2YXRlIFR5cGVCaW5kaW5nIGxvd2VyVXBwZXJCb3VuZChUeXBlQmluZGluZ1tdIHR5cGVzLCBMaXN0IGx1YlN0YWNrKSB7Ci0JCQorCiAJCWludCB0eXBlTGVuZ3RoID0gdHlwZXMubGVuZ3RoOwogCQlpZiAodHlwZUxlbmd0aCA9PSAxKSB7CiAJCQlUeXBlQmluZGluZyB0eXBlID0gdHlwZXNbMF07CkBAIC0yOTA4LDcgKzMzMTEsNyBAQAogCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbHViVHlwZUxlbmd0aDsgaysrKSB7CiAJCQkJCVR5cGVCaW5kaW5nIGx1YlR5cGUgPSBsdWJUeXBlc1trXTsKIAkJCQkJaWYgKGx1YlR5cGUgPT0gbnVsbCkgY29udGludWU7IC8vIGlnbm9yZQotCQkJCQlpZiAobHViVHlwZSA9PSB0eXBlIHx8IGx1YlR5cGUuaXNFcXVpdmFsZW50VG8odHlwZSkpIGNvbnRpbnVlIG5leHRUeXBlQ2hlY2s7IC8vIHR5cGUgZm91bmQsIGp1bXAgdG8gbmV4dCBvbmUgCisJCQkJCWlmIChsdWJUeXBlID09IHR5cGUgfHwgbHViVHlwZS5pc0VxdWl2YWxlbnRUbyh0eXBlKSkgY29udGludWUgbmV4dFR5cGVDaGVjazsgLy8gdHlwZSBmb3VuZCwganVtcCB0byBuZXh0IG9uZQogCQkJCX0KIAkJCQljb250aW51ZSBuZXh0THViQ2hlY2s7IC8vIHR5cGUgbm90IGZvdW5kIGluIGN1cnJlbnQgbHViVHlwZXMKIAkJCX0KQEAgLTI5NDIsOSArMzM0NSw5IEBACiAJCXN3aXRjaCAoY291bnQpIHsKIAkJCWNhc2UgMCA6IHJldHVybiBUeXBlQmluZGluZy5WT0lEOwogCQkJY2FzZSAxIDogcmV0dXJuIG1lY3NbMF07Ci0JCQljYXNlIDIgOiAKLQkJCQlpZiAoKGNvbW1vbkRpbSA9PSAwID8gbWVjc1sxXS5pZCA6IG1lY3NbMV0ubGVhZkNvbXBvbmVudFR5cGUoKS5pZCkgPT0gVF9KYXZhTGFuZ09iamVjdCkgcmV0dXJuIG1lY3NbMF07Ci0JCQkJaWYgKChjb21tb25EaW0gPT0gMCA/IG1lY3NbMF0uaWQgOiBtZWNzWzBdLmxlYWZDb21wb25lbnRUeXBlKCkuaWQpID09IFRfSmF2YUxhbmdPYmplY3QpIHJldHVybiBtZWNzWzFdOworCQkJY2FzZSAyIDoKKwkJCQlpZiAoKGNvbW1vbkRpbSA9PSAwID8gbWVjc1sxXS5pZCA6IG1lY3NbMV0ubGVhZkNvbXBvbmVudFR5cGUoKS5pZCkgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSByZXR1cm4gbWVjc1swXTsKKwkJCQlpZiAoKGNvbW1vbkRpbSA9PSAwID8gbWVjc1swXS5pZCA6IG1lY3NbMF0ubGVhZkNvbXBvbmVudFR5cGUoKS5pZCkgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSByZXR1cm4gbWVjc1sxXTsKIAkJfQogCQlUeXBlQmluZGluZ1tdIG90aGVyQm91bmRzID0gbmV3IFR5cGVCaW5kaW5nW2NvdW50IC0gMV07CiAJCWludCByYW5rID0gMDsKQEAgLTI5NTcsNyArMzM2MCw3IEBACiAJCVR5cGVCaW5kaW5nIGludGVyc2VjdGlvblR5cGUgPSBlbnZpcm9ubWVudCgpLmNyZWF0ZVdpbGRjYXJkKG51bGwsIDAsIGZpcnN0Qm91bmQsIG90aGVyQm91bmRzLCBXaWxkY2FyZC5FWFRFTkRTKTsKIAkJcmV0dXJuIGNvbW1vbkRpbSA9PSAwID8gaW50ZXJzZWN0aW9uVHlwZSA6IGVudmlyb25tZW50KCkuY3JlYXRlQXJyYXlUeXBlKGludGVyc2VjdGlvblR5cGUsIGNvbW1vbkRpbSk7CiAJfQotCQorCiAJcHVibGljIGZpbmFsIE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKCkgewogCQlTY29wZSBzY29wZSA9IHRoaXM7CiAJCWRvIHsKQEAgLTI5NzEsOCArMzM3NCw4IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyBzZXQgb2YgdHlwZXMgY29tcGF0aWJsZSB3aXRoIGFsbCBnaXZlbiB0eXBlcy4KIAkgKiAoaS5lLiBtb3N0IHNwZWNpZmljIGNvbW1vbiBzdXBlciB0eXBlcykKLQkgKiBJZiBubyB0eXBlcyBpcyBnaXZlbiwgd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIElmIG5vdCBjb21wYXRpYmxlIAotCSAqIHJlZmVyZW5jZSB0eXBlIGlzIGZvdW5kLCByZXR1cm5zIG51bGwuIEluIG90aGVyIGNhc2VzLCB3aWxsIHJldHVybiBhbiBhcnJheSAKKwkgKiBJZiBubyB0eXBlcyBpcyBnaXZlbiwgd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuIElmIG5vdCBjb21wYXRpYmxlCisJICogcmVmZXJlbmNlIHR5cGUgaXMgZm91bmQsIHJldHVybnMgbnVsbC4gSW4gb3RoZXIgY2FzZXMsIHdpbGwgcmV0dXJuIGFuIGFycmF5CiAJICogb2YgbWluaW1hbCBlcmFzZWQgdHlwZXMsIHdoZXJlIHNvbWUgbnVsbHMgbWF5IGFwcGVhciAoYW5kIG11c3Qgc2ltcGx5IGJlCiAJICogaWdub3JlZCkuCiAJICovCkBAIC0yOTkxLDE4ICszMzk0LDI5IEBACiAJCQljYXNlIDE6IHJldHVybiB0eXBlczsKIAkJfQogCQlUeXBlQmluZGluZyBmaXJzdFR5cGUgPSB0eXBlc1tpbmRleE9mRmlyc3RdOwotCQlpZiAoZmlyc3RUeXBlLmlzQmFzZVR5cGUoKSkgcmV0dXJuIG51bGw7IAorCQlpZiAoZmlyc3RUeXBlLmlzQmFzZVR5cGUoKSkgcmV0dXJuIG51bGw7CiAKIAkJLy8gcmVjb3JkIGFsbCBzdXBlcnR5cGVzIG9mIHR5cGUKIAkJLy8gaW50ZXJzZWN0IHdpdGggYWxsIHN1cGVydHlwZXMgb2Ygb3RoZXJUeXBlCiAJCUFycmF5TGlzdCB0eXBlc1RvVmlzaXQgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQkKKwogCQlpbnQgZGltID0gZmlyc3RUeXBlLmRpbWVuc2lvbnMoKTsKIAkJVHlwZUJpbmRpbmcgbGVhZlR5cGUgPSBmaXJzdFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKLQkJVHlwZUJpbmRpbmcgZmlyc3RFcmFzdXJlID0gKGxlYWZUeXBlLmlzVHlwZVZhcmlhYmxlKCkgfHwgbGVhZlR5cGUuaXNXaWxkY2FyZCgpLyomJiAhbGVhZlR5cGUuaXNDYXB0dXJlKCkqLykgPyBmaXJzdFR5cGUgOiBmaXJzdFR5cGUuZXJhc3VyZSgpOworCSAgICAvLyBkbyBub3QgYWxsb3cgdHlwZSB2YXJpYWJsZXMvaW50ZXJzZWN0aW9uIHR5cGVzIHRvIG1hdGNoIHdpdGggZXJhc3VyZXMgZm9yIGZyZWUKKwkJVHlwZUJpbmRpbmcgZmlyc3RFcmFzdXJlOworCQlzd2l0Y2gobGVhZlR5cGUua2luZCgpKSB7CisJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CisJCQkJZmlyc3RFcmFzdXJlID0gZmlyc3RUeXBlLmVyYXN1cmUoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWZpcnN0RXJhc3VyZSA9IGZpcnN0VHlwZTsKKwkJCQlicmVhazsKKwkJfQogCQlpZiAoZmlyc3RFcmFzdXJlICE9IGZpcnN0VHlwZSkgewogCQkJYWxsSW52b2NhdGlvbnMucHV0KGZpcnN0RXJhc3VyZSwgZmlyc3RUeXBlKTsKLQkJfQkJCQkJCQorCQl9CiAJCXR5cGVzVG9WaXNpdC5hZGQoZmlyc3RUeXBlKTsKIAkJaW50IG1heCA9IDE7CiAJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGU7CkBAIC0zMDEyLDcgKzM0MjYsNyBAQAogCQkJaWYgKGRpbSA+IDApIHsKIAkJCQlsZWFmVHlwZSA9IHR5cGVUb1Zpc2l0LmxlYWZDb21wb25lbnRUeXBlKCk7CiAJCQkJc3dpdGNoKGxlYWZUeXBlLmlkKSB7Ci0JCQkJCWNhc2UgVF9KYXZhTGFuZ09iamVjdDoKKwkJCQkJY2FzZSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3Q6CiAJCQkJCQlpZiAoZGltID4gMSkgeyAvLyBPYmplY3RbXVtdIHN1cGVydHlwZSBpcyBPYmplY3RbXQogCQkJCQkJCVR5cGVCaW5kaW5nIGVsZW1lbnRUeXBlID0gKChBcnJheUJpbmRpbmcpdHlwZVRvVmlzaXQpLmVsZW1lbnRzVHlwZSgpOwogCQkJCQkJCWlmICghdHlwZXNUb1Zpc2l0LmNvbnRhaW5zKGVsZW1lbnRUeXBlKSkgewpAQCAtMzAyMSwxNSArMzQzNSwxNSBAQAogCQkJCQkJCX0KIAkJCQkJCQljb250aW51ZTsKIAkJCQkJCX0KLQkJCQkJCS8vIGZhbGx0aHJvdWdoCi0JCQkJCWNhc2UgVF9ieXRlOgotCQkJCQljYXNlIFRfc2hvcnQ6Ci0JCQkJCWNhc2UgVF9jaGFyOgotCQkJCQljYXNlIFRfYm9vbGVhbjoKLQkJCQkJY2FzZSBUX2ludDoKLQkJCQkJY2FzZSBUX2xvbmc6Ci0JCQkJCWNhc2UgVF9mbG9hdDoKLQkJCQkJY2FzZSBUX2RvdWJsZToKKwkJCQkJCS8vJEZBTEwtVEhST1VHSCQKKwkJCQkJY2FzZSBUeXBlSWRzLlRfYnl0ZToKKwkJCQkJY2FzZSBUeXBlSWRzLlRfc2hvcnQ6CisJCQkJCWNhc2UgVHlwZUlkcy5UX2NoYXI6CisJCQkJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW46CisJCQkJCWNhc2UgVHlwZUlkcy5UX2ludDoKKwkJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZzoKKwkJCQkJY2FzZSBUeXBlSWRzLlRfZmxvYXQ6CisJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZToKIAkJCQkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IGdldEphdmFJb1NlcmlhbGl6YWJsZSgpOwogCQkJCQkJaWYgKCF0eXBlc1RvVmlzaXQuY29udGFpbnMoc3VwZXJUeXBlKSkgewogCQkJCQkJCXR5cGVzVG9WaXNpdC5hZGQoc3VwZXJUeXBlKTsKQEAgLTMwNDYsNyArMzQ2MCw3IEBACiAJCQkJCQkJbWF4Kys7CiAJCQkJCQl9CiAJCQkJCQljb250aW51ZTsKLQkJCQkJCisKIAkJCQkJZGVmYXVsdDoKIAkJCQl9CiAJCQkJdHlwZVRvVmlzaXQgPSBsZWFmVHlwZTsKQEAgLTMwNjIsNyArMzQ3Niw3IEBACiAJCQkJCQlUeXBlQmluZGluZyBzdXBlclR5cGVFcmFzdXJlID0gKGZpcnN0Qm91bmQuaXNUeXBlVmFyaWFibGUoKSB8fCBmaXJzdEJvdW5kLmlzV2lsZGNhcmQoKSAvKiYmICFpdHNJbnRlcmZhY2UuaXNDYXB0dXJlKCkqLykgPyBzdXBlclR5cGUgOiBzdXBlclR5cGUuZXJhc3VyZSgpOwogCQkJCQkJaWYgKHN1cGVyVHlwZUVyYXN1cmUgIT0gc3VwZXJUeXBlKSB7CiAJCQkJCQkJYWxsSW52b2NhdGlvbnMucHV0KHN1cGVyVHlwZUVyYXN1cmUsIHN1cGVyVHlwZSk7Ci0JCQkJCQl9CQkJCQkJCisJCQkJCQl9CiAJCQkJCX0KIAkJCQkJY29udGludWU7CiAJCQkJfQpAQCAtMzA3OSw3ICszNDkzLDcgQEAKIAkJCQkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZUVyYXN1cmUgPSAoaXRzSW50ZXJmYWNlLmlzVHlwZVZhcmlhYmxlKCkgfHwgaXRzSW50ZXJmYWNlLmlzV2lsZGNhcmQoKSAvKiYmICFpdHNJbnRlcmZhY2UuaXNDYXB0dXJlKCkqLykgPyBzdXBlclR5cGUgOiBzdXBlclR5cGUuZXJhc3VyZSgpOwogCQkJCQkJaWYgKHN1cGVyVHlwZUVyYXN1cmUgIT0gc3VwZXJUeXBlKSB7CiAJCQkJCQkJYWxsSW52b2NhdGlvbnMucHV0KHN1cGVyVHlwZUVyYXN1cmUsIHN1cGVyVHlwZSk7Ci0JCQkJCQl9CQkJCQkJCisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0zMTE0LDcgKzM1MjgsNyBAQAogCQkJCQlUeXBlQmluZGluZyBlcmFzZWRTdXBlclR5cGUgPSBlcmFzZWRTdXBlclR5cGVzW2pdOwogCQkJCQlpZiAoZXJhc2VkU3VwZXJUeXBlID09IG51bGwgfHwgZXJhc2VkU3VwZXJUeXBlID09IG90aGVyVHlwZSkgY29udGludWUgbmV4dFN1cGVyVHlwZTsKIAkJCQkJVHlwZUJpbmRpbmcgbWF0Y2g7Ci0JCQkJCWlmICgobWF0Y2ggPSBvdGhlclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShlcmFzZWRTdXBlclR5cGUpKSA9PSBudWxsKSB7CisJCQkJCWlmICgobWF0Y2ggPSBvdGhlclR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShlcmFzZWRTdXBlclR5cGUpKSA9PSBudWxsKSB7CiAJCQkJCQllcmFzZWRTdXBlclR5cGVzW2pdID0gbnVsbDsKIAkJCQkJCWlmICgtLXJlbWFpbmluZyA9PSAwKSByZXR1cm4gbnVsbDsKIAkJCQkJCWNvbnRpbnVlIG5leHRTdXBlclR5cGU7CkBAIC0zMTQ4LDEzICszNTYyLDEzIEBACiAJCQkJVHlwZUJpbmRpbmcgZXJhc2VkU3VwZXJUeXBlID0gZXJhc2VkU3VwZXJUeXBlc1tqXTsKIAkJCQlpZiAoZXJhc2VkU3VwZXJUeXBlID09IG51bGwpIGNvbnRpbnVlIG5leHRTdXBlclR5cGU7CiAJCQkJVHlwZUJpbmRpbmcgbWF0Y2g7Ci0JCQkJaWYgKGVyYXNlZFN1cGVyVHlwZSA9PSBvdGhlclR5cGUgfHwgZXJhc2VkU3VwZXJUeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QgJiYgb3RoZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQlpZiAoZXJhc2VkU3VwZXJUeXBlID09IG90aGVyVHlwZSB8fCBlcmFzZWRTdXBlclR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0ICYmIG90aGVyVHlwZS5pc0ludGVyZmFjZSgpKSB7CiAJCQkJCW1hdGNoID0gZXJhc2VkU3VwZXJUeXBlOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmIChlcmFzZWRTdXBlclR5cGUuaXNBcnJheVR5cGUoKSkgewogCQkJCQkJbWF0Y2ggPSBudWxsOwogCQkJCQl9IGVsc2UgewotCQkJCQkJbWF0Y2ggPSBvdGhlclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShlcmFzZWRTdXBlclR5cGUpOworCQkJCQkJbWF0Y2ggPSBvdGhlclR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShlcmFzZWRTdXBlclR5cGUpOwogCQkJCQl9CiAJCQkJCWlmIChtYXRjaCA9PSBudWxsKSB7IC8vIGluY29tcGF0aWJsZSBzdXBlciB0eXBlCiAJCQkJCQllcmFzZWRTdXBlclR5cGVzW2pdID0gbnVsbDsKQEAgLTMxODQsNyArMzU5OCw3IEBACiAJCQkJCQlzb21lSW52b2NhdGlvbnNbaW52b2NMZW5ndGhdID0gbWF0Y2g7CiAJCQkJCX0KIAkJCQl9Ci0JCQl9CQkJCQorCQkJfQogCQl9CiAJCS8vIGVsaW1pbmF0ZSBub24gbWluaW1hbCBzdXBlciB0eXBlcwogCQlpZiAocmVtYWluaW5nID4gMSkgewpAQCAtMzE5NiwxNyArMzYxMCwxNyBAQAogCQkJCQlUeXBlQmluZGluZyBvdGhlclR5cGUgPSBlcmFzZWRTdXBlclR5cGVzW2pdOwogCQkJCQlpZiAob3RoZXJUeXBlID09IG51bGwpIGNvbnRpbnVlIG5leHRPdGhlclR5cGU7CiAJCQkJCWlmIChlcmFzZWRTdXBlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJCQlpZiAob3RoZXJUeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QgJiYgZXJhc2VkU3VwZXJUeXBlLmlzSW50ZXJmYWNlKCkpIGNvbnRpbnVlIG5leHRPdGhlclR5cGU7IC8vIGtlZXAgT2JqZWN0IGZvciBhbiBpbnRlcmZhY2UKLQkJCQkJCWlmIChlcmFzZWRTdXBlclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShvdGhlclR5cGUpICE9IG51bGwpIHsKKwkJCQkJCWlmIChvdGhlclR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0ICYmIGVyYXNlZFN1cGVyVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0T3RoZXJUeXBlOyAvLyBrZWVwIE9iamVjdCBmb3IgYW4gaW50ZXJmYWNlCisJCQkJCQlpZiAoZXJhc2VkU3VwZXJUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20ob3RoZXJUeXBlKSAhPSBudWxsKSB7CiAJCQkJCQkJZXJhc2VkU3VwZXJUeXBlc1tqXSA9IG51bGw7IC8vIGRpc2NhcmQgbm9uIG1pbmltYWwgc3VwZXJ0eXBlCiAJCQkJCQkJcmVtYWluaW5nLS07CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSBpZiAoZXJhc2VkU3VwZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQkJaWYgKG90aGVyVHlwZS5pc0FycmF5VHlwZSgpIC8vIGtlZXAgT2JqZWN0Wy4uLl0gZm9yIGFuIGludGVyZmFjZSBhcnJheSAoc2FtZSBkaW1lbnNpb25zKQotCQkJCQkJCSYmIG90aGVyVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmlkID09IFRfSmF2YUxhbmdPYmplY3QKKwkJCQkJCQkmJiBvdGhlclR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QKIAkJCQkJCQkmJiBvdGhlclR5cGUuZGltZW5zaW9ucygpID09IGVyYXNlZFN1cGVyVHlwZS5kaW1lbnNpb25zKCkKIAkJCQkJCQkmJiBlcmFzZWRTdXBlclR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0T3RoZXJUeXBlOwotCQkJCQkJaWYgKGVyYXNlZFN1cGVyVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKG90aGVyVHlwZSkgIT0gbnVsbCkgeworCQkJCQkJaWYgKGVyYXNlZFN1cGVyVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKG90aGVyVHlwZSkgIT0gbnVsbCkgewogCQkJCQkJCWVyYXNlZFN1cGVyVHlwZXNbal0gPSBudWxsOyAvLyBkaXNjYXJkIG5vbiBtaW5pbWFsIHN1cGVydHlwZQogCQkJCQkJCXJlbWFpbmluZy0tOwogCQkJCQkJfQpAQCAtMzIxNiw3ICszNjMwLDcgQEAKIAkJfQogCQlyZXR1cm4gZXJhc2VkU3VwZXJUeXBlczsKIAl9Ci0JCisKIAkvLyBJbnRlcm5hbCB1c2Ugb25seQogCS8qIEFsbCBtZXRob2RzIGluIHZpc2libGUgYXJlIGFjY2VwdGFibGUgbWF0Y2hlcyBmb3IgdGhlIG1ldGhvZCBpbiBxdWVzdGlvbi4uLgogCSogVGhlIG1ldGhvZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXIgdHlwZSBhcHBlYXIgYmVmb3JlIHRob3NlIGRlZmluZWQgYnkgaXRzCkBAIC0zMjQ1LDcgKzM2NTksNyBAQAogCQl9CiAJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcodmlzaWJsZVswXSwgdmlzaWJsZVswXS5zZWxlY3RvciwgdmlzaWJsZVswXS5wYXJhbWV0ZXJzLCBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMpOwogCX0KLQkKKwogCS8vIEludGVybmFsIHVzZSBvbmx5CiAJLyogQWxsIG1ldGhvZHMgaW4gdmlzaWJsZSBhcmUgYWNjZXB0YWJsZSBtYXRjaGVzIGZvciB0aGUgbWV0aG9kIGluIHF1ZXN0aW9uLi4uCiAJKiBTaW5jZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBhbiBpbnRlcmZhY2UsIHdlIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgdGhhdCAyIGluaGVyaXRlZApAQCAtMzI2OCw5ICszNjgyLDkgQEAKIAl9CiAJaW50ZXJmYWNlIEkgZXh0ZW5kcyBJMSwgSTIge30KIAlpbnRlcmZhY2UgSiB7fQotCQorCiAJY2xhc3MgWCBpbXBsZW1lbnRzIEoge30KLQkKKwogCWNsYXNzIFkgZXh0ZW5kcyBYIHsKIAkJcHVibGljIHZvaWQgZm9vKEkgaSwgWCB4KSB7IGkuYmFyKHgpOyB9CiAJfQpAQCAtMzI5MCwxMiArMzcwNCwyMiBAQAogCX0KIAogCS8vIGNhdmVhdDogdGhpcyBpcyBub3QgYSBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgSkxTCi0JcHJvdGVjdGVkIGZpbmFsIE1ldGhvZEJpbmRpbmcgbW9zdFNwZWNpZmljTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nW10gdmlzaWJsZSwgaW50IHZpc2libGVTaXplLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLCBSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCXByb3RlY3RlZCBmaW5hbCBNZXRob2RCaW5kaW5nIG1vc3RTcGVjaWZpY01ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZ1tdIHZpc2libGUsIGludCB2aXNpYmxlU2l6ZSwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLCBmaW5hbCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsKIAkJaW50W10gY29tcGF0aWJpbGl0eUxldmVscyA9IG5ldyBpbnRbdmlzaWJsZVNpemVdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVTaXplOyBpKyspCiAJCQljb21wYXRpYmlsaXR5TGV2ZWxzW2ldID0gcGFyYW1ldGVyQ29tcGF0aWJpbGl0eUxldmVsKHZpc2libGVbaV0sIGFyZ3VtZW50VHlwZXMpOwogCi0JCWJvb2xlYW4gdXNlVGllYnJlYWtNZXRob2QgPSBpbnZvY2F0aW9uU2l0ZS5nZW5lcmljVHlwZUFyZ3VtZW50cygpID09IG51bGw7CisJCUludm9jYXRpb25TaXRlIHRpZUJyZWFrSW52b2NhdGlvblNpdGUgPSBuZXcgSW52b2NhdGlvblNpdGUoKSB7CisJCQlwdWJsaWMgVHlwZUJpbmRpbmdbXSBnZW5lcmljVHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIG51bGw7IH0gLy8gaWdub3JlIGdlbmVyaWNUeXBlQXJncworCQkJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsgcmV0dXJuIGludm9jYXRpb25TaXRlLmlzU3VwZXJBY2Nlc3MoKTsgfQorCQkJcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgeyByZXR1cm4gaW52b2NhdGlvblNpdGUuaXNUeXBlQWNjZXNzKCk7IH0KKwkJCXB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIGFjdHVhbFJlY2VpdmVyVHlwZSkgeyAvKiBpZ25vcmUgKi99CisJCQlwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpIHsgLyogaWdub3JlICovfQorCQkJcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpIHsgLyogaWdub3JlICovfQorCQkJcHVibGljIGludCBzb3VyY2VTdGFydCgpIHsgcmV0dXJuIGludm9jYXRpb25TaXRlLnNvdXJjZVN0YXJ0KCk7IH0KKwkJCXB1YmxpYyBpbnQgc291cmNlRW5kKCkgeyByZXR1cm4gaW52b2NhdGlvblNpdGUuc291cmNlU3RhcnQoKTsgfQorCQkJcHVibGljIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSgpIHsgcmV0dXJuIGludm9jYXRpb25TaXRlLmV4cGVjdGVkVHlwZSgpOyB9CisJCX07CiAJCU1ldGhvZEJpbmRpbmdbXSBtb3JlU3BlY2lmaWMgPSBuZXcgTWV0aG9kQmluZGluZ1t2aXNpYmxlU2l6ZV07CiAJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IGxldmVsID0gMCwgbWF4ID0gVkFSQVJHU19DT01QQVRJQkxFOyBsZXZlbCA8PSBtYXg7IGxldmVsKyspIHsKQEAgLTMzMDQsMTMgKzM3MjgsMTMgQEAKIAkJCQltYXggPSBsZXZlbDsgLy8gZG8gbm90IGV4YW1pbmUgZnVydGhlciBjYXRlZ29yaWVzLCB3aWxsIGVpdGhlciByZXR1cm4gbW9zdFNwZWNpZmljIG9yIHJlcG9ydCBhbWJpZ3VvdXMgY2FzZQogCQkJCU1ldGhvZEJpbmRpbmcgY3VycmVudCA9IHZpc2libGVbaV07CiAJCQkJTWV0aG9kQmluZGluZyBvcmlnaW5hbCA9IGN1cnJlbnQub3JpZ2luYWwoKTsKLQkJCQlNZXRob2RCaW5kaW5nIHRpZWJyZWFrTWV0aG9kID0gdXNlVGllYnJlYWtNZXRob2QgPyBjdXJyZW50LnRpZWJyZWFrTWV0aG9kKCkgOiBjdXJyZW50OworCQkJCU1ldGhvZEJpbmRpbmcgdGllYnJlYWtNZXRob2QgPSBjdXJyZW50LnRpZWJyZWFrTWV0aG9kKCk7CiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2aXNpYmxlU2l6ZTsgaisrKSB7CiAJCQkJCWlmIChpID09IGogfHwgY29tcGF0aWJpbGl0eUxldmVsc1tqXSAhPSBsZXZlbCkgY29udGludWU7CiAJCQkJCU1ldGhvZEJpbmRpbmcgbmV4dCA9IHZpc2libGVbal07CiAJCQkJCWlmIChvcmlnaW5hbCA9PSBuZXh0Lm9yaWdpbmFsKCkpIHsKIAkJCQkJCS8vIHBhcmFtZXRlcml6ZWQgc3VwZXJjbGFzc2VzICYgaW50ZXJmYWNlcyBtYXkgYmUgd2Fsa2VkIHR3aWNlIGZyb20gZGlmZmVyZW50IHBhdGhzIHNvIHNraXAgbmV4dCBmcm9tIG5vdyBvbgotCQkJCQkJY29tcGF0aWJpbGl0eUxldmVsc1tqXSA9IC0xOyAKKwkJCQkJCWNvbXBhdGliaWxpdHlMZXZlbHNbal0gPSAtMTsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAKQEAgLTMzMjMsNyArMzc0Nyw3IEBACiAJCQkJCQkJbWV0aG9kVG9UZXN0ID0gcE5leHQub3JpZ2luYWxNZXRob2Q7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJTWV0aG9kQmluZGluZyBhY2NlcHRhYmxlID0gY29tcHV0ZUNvbXBhdGlibGVNZXRob2QobWV0aG9kVG9UZXN0LCB0aWVicmVha01ldGhvZC5wYXJhbWV0ZXJzLCBpbnZvY2F0aW9uU2l0ZSk7CisJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXB0YWJsZSA9IGNvbXB1dGVDb21wYXRpYmxlTWV0aG9kKG1ldGhvZFRvVGVzdCwgdGllYnJlYWtNZXRob2QucGFyYW1ldGVycywgdGllQnJlYWtJbnZvY2F0aW9uU2l0ZSk7CiAJCQkJCS8qIFRoZXJlIGFyZSA0IGNob2ljZXMgdG8gY29uc2lkZXIgd2l0aCBjdXJyZW50ICYgbmV4dCA6CiAJCQkJCSBmb28oQikgJiBmb28oQSkgd2hlcmUgQiBleHRlbmRzIEEKIAkJCQkJIDEuIHRoZSAyIG1ldGhvZHMgYXJlIGVxdWFsIChib3RoIGFjY2VwdCBlYWNoIG90aGVycyBwYXJhbWV0ZXJzKSAtPiB3YW50IHRvIGNvbnRpbnVlCkBAIC0zMzY0LDggKzM3ODgsOCBAQAogCQkJTWV0aG9kQmluZGluZyBjdXJyZW50ID0gbW9yZVNwZWNpZmljW2ldOwogCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgewogCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBtb3N0U3BlY2lmaWNFeGNlcHRpb25zID0gbnVsbDsKLQkJCQlTaW1wbGVTZXQgcG9zc2libGVNZXRob2RzID0gbnVsbDsKIAkJCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gY3VycmVudC5vcmlnaW5hbCgpOworCQkJCWJvb2xlYW4gc2hvdWxkSW50ZXJzZWN0RXhjZXB0aW9ucyA9IG9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzLmlzQWJzdHJhY3QoKSAmJiBvcmlnaW5hbC50aHJvd25FeGNlcHRpb25zICE9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUzsgLy8gb25seSBuZWVkZWQgd2hlbiBzZWxlY3RpbmcgZnJvbSBpbnRlcmZhY2UgbWV0aG9kcwogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmlzaWJsZVNpemU7IGorKykgewogCQkJCQlNZXRob2RCaW5kaW5nIG5leHQgPSBtb3JlU3BlY2lmaWNbal07CiAJCQkJCWlmIChuZXh0ID09IG51bGwgfHwgaSA9PSBqKSBjb250aW51ZTsKQEAgLTMzNzYsMzAgKzM4MDAsMjEgQEAKIAkJCQkJaWYgKCFvcmlnaW5hbC5pc0Fic3RyYWN0KCkpIHsKIAkJCQkJCWlmIChvcmlnaW5hbDIuaXNBYnN0cmFjdCgpKQogCQkJCQkJCWNvbnRpbnVlOyAvLyBvbmx5IGNvbXBhcmUgY3VycmVudCBhZ2FpbnN0IG90aGVyIGNvbmNyZXRlIG1ldGhvZHMKLQkJCQkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IG9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUob3JpZ2luYWwyLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKSk7Ci0JCQkJCQlpZiAoc3VwZXJUeXBlID09IG51bGwpCisKKwkJCQkJCW9yaWdpbmFsMiA9IG9yaWdpbmFsLmZpbmRPcmlnaW5hbEluaGVyaXRlZE1ldGhvZChvcmlnaW5hbDIpOworCQkJCQkJaWYgKG9yaWdpbmFsMiA9PSBudWxsKQogCQkJCQkJCWNvbnRpbnVlIG5leHRTcGVjaWZpYzsgLy8gY3VycmVudCdzIGRlY2xhcmluZ0NsYXNzIGlzIG5vdCBhIHN1YnR5cGUgb2YgbmV4dCdzIGRlY2xhcmluZ0NsYXNzCiAJCQkJCQlpZiAoY3VycmVudC5oYXNTdWJzdGl0dXRlZFBhcmFtZXRlcnMoKSB8fCBvcmlnaW5hbC50eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKLQkJCQkJCQlpZiAob3JpZ2luYWwyLmRlY2xhcmluZ0NsYXNzICE9IHN1cGVyVHlwZSkgewotCQkJCQkJCQkvLyBtdXN0IGZpbmQgaW5oZXJpdGVkIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHN1YnN0aXR1dGVkIHZhcmlhYmxlcwotCQkJCQkJCQlNZXRob2RCaW5kaW5nW10gc3VwZXJNZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKSBzdXBlclR5cGUpLmdldE1ldGhvZHMob3JpZ2luYWwyLnNlbGVjdG9yKTsKLQkJCQkJCQkJZm9yIChpbnQgbSA9IDAsIGwgPSBzdXBlck1ldGhvZHMubGVuZ3RoOyBtIDwgbDsgbSsrKSB7Ci0JCQkJCQkJCQlpZiAoc3VwZXJNZXRob2RzW21dLm9yaWdpbmFsKCkgPT0gb3JpZ2luYWwyKSB7Ci0JCQkJCQkJCQkJb3JpZ2luYWwyID0gc3VwZXJNZXRob2RzW21dOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpLmRvZXNNZXRob2RPdmVycmlkZShvcmlnaW5hbCwgb3JpZ2luYWwyKSkKKwkJCQkJCQlpZiAoIWVudmlyb25tZW50KCkubWV0aG9kVmVyaWZpZXIoKS5pc1BhcmFtZXRlclN1YnNpZ25hdHVyZShvcmlnaW5hbCwgb3JpZ2luYWwyKSkKIAkJCQkJCQkJY29udGludWUgbmV4dFNwZWNpZmljOyAvLyBjdXJyZW50IGRvZXMgbm90IG92ZXJyaWRlIG5leHQKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIGlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCkgeyAvLyBzaG91bGQgbm90IGJlIG51bGwgaWYgb3JpZ2luYWwgaXNBYnN0cmFjdCwgYnV0IGJlIHNhZmUKLQkJCQkJCVR5cGVCaW5kaW5nIHN1cGVyVHlwZSA9IHJlY2VpdmVyVHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKG9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzLmVyYXN1cmUoKSk7CisJCQkJCQlUeXBlQmluZGluZyBzdXBlclR5cGUgPSByZWNlaXZlclR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShvcmlnaW5hbC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpOwogCQkJCQkJaWYgKG9yaWdpbmFsLmRlY2xhcmluZ0NsYXNzID09IHN1cGVyVHlwZSB8fCAhKHN1cGVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSB7CiAJCQkJCQkJLy8ga2VlcCBvcmlnaW5hbAogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkvLyBtdXN0IGZpbmQgaW5oZXJpdGVkIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHN1YnN0aXR1dGVkIHZhcmlhYmxlcwotCQkJCQkJCU1ldGhvZEJpbmRpbmdbXSBzdXBlck1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZSkuZ2V0TWV0aG9kcyhvcmlnaW5hbC5zZWxlY3Rvcik7CisJCQkJCQkJTWV0aG9kQmluZGluZ1tdIHN1cGVyTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgc3VwZXJUeXBlKS5nZXRNZXRob2RzKG9yaWdpbmFsLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLmxlbmd0aCk7CiAJCQkJCQkJZm9yIChpbnQgbSA9IDAsIGwgPSBzdXBlck1ldGhvZHMubGVuZ3RoOyBtIDwgbDsgbSsrKSB7CiAJCQkJCQkJCWlmIChzdXBlck1ldGhvZHNbbV0ub3JpZ2luYWwoKSA9PSBvcmlnaW5hbCkgewogCQkJCQkJCQkJb3JpZ2luYWwgPSBzdXBlck1ldGhvZHNbbV07CkBAIC0zNDA3LDEyICszODIyLDEyIEBACiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCQlzdXBlclR5cGUgPSByZWNlaXZlclR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShvcmlnaW5hbDIuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpKTsKKwkJCQkJCXN1cGVyVHlwZSA9IHJlY2VpdmVyVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKG9yaWdpbmFsMi5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkpOwogCQkJCQkJaWYgKG9yaWdpbmFsMi5kZWNsYXJpbmdDbGFzcyA9PSBzdXBlclR5cGUgfHwgIShzdXBlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgewogCQkJCQkJCS8vIGtlZXAgb3JpZ2luYWwyCiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCS8vIG11c3QgZmluZCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggdGhlIHNhbWUgc3Vic3RpdHV0ZWQgdmFyaWFibGVzCi0JCQkJCQkJTWV0aG9kQmluZGluZ1tdIHN1cGVyTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgc3VwZXJUeXBlKS5nZXRNZXRob2RzKG9yaWdpbmFsMi5zZWxlY3Rvcik7CisJCQkJCQkJTWV0aG9kQmluZGluZ1tdIHN1cGVyTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgc3VwZXJUeXBlKS5nZXRNZXRob2RzKG9yaWdpbmFsMi5zZWxlY3RvciwgYXJndW1lbnRUeXBlcy5sZW5ndGgpOwogCQkJCQkJCWZvciAoaW50IG0gPSAwLCBsID0gc3VwZXJNZXRob2RzLmxlbmd0aDsgbSA8IGw7IG0rKykgewogCQkJCQkJCQlpZiAoc3VwZXJNZXRob2RzW21dLm9yaWdpbmFsKCkgPT0gb3JpZ2luYWwyKSB7CiAJCQkJCQkJCQlvcmlnaW5hbDIgPSBzdXBlck1ldGhvZHNbbV07CkBAIC0zNDI0LDY0ICszODM5LDU0IEBACiAJCQkJCQkJb3JpZ2luYWwyID0gb3JpZ2luYWwuY29tcHV0ZVN1YnN0aXR1dGVkTWV0aG9kKG9yaWdpbmFsMiwgZW52aXJvbm1lbnQoKSk7CiAJCQkJCQlpZiAob3JpZ2luYWwyID09IG51bGwgfHwgIW9yaWdpbmFsLmFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwob3JpZ2luYWwyKSkKIAkJCQkJCQljb250aW51ZSBuZXh0U3BlY2lmaWM7IC8vIGN1cnJlbnQgZG9lcyBub3Qgb3ZlcnJpZGUgbmV4dAotCQkJCQkJaWYgKCFvcmlnaW5hbC5yZXR1cm5UeXBlLmlzQ29tcGF0aWJsZVdpdGgob3JpZ2luYWwyLnJldHVyblR5cGUpICYmCi0JCQkJCQkJCSFvcmlnaW5hbC5yZXR1cm5UeXBlLmVyYXN1cmUoKS5pc0NvbXBhdGlibGVXaXRoKG9yaWdpbmFsMi5yZXR1cm5UeXBlLmVyYXN1cmUoKSkpIHsKLQkJCQkJCQkvLyAxNS4xMi4yCi0JCQkJCQkJY29udGludWUgbmV4dFNwZWNpZmljOyAvLyBjaG9vc2Ugb3JpZ2luYWwyIGluc3RlYWQKKwkJCQkJCWlmIChvcmlnaW5hbC5yZXR1cm5UeXBlICE9IG9yaWdpbmFsMi5yZXR1cm5UeXBlKSB7CisJCQkJCQkJaWYgKG5leHQub3JpZ2luYWwoKS50eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJCQkJCQkJaWYgKG9yaWdpbmFsLnJldHVyblR5cGUuZXJhc3VyZSgpLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20ob3JpZ2luYWwyLnJldHVyblR5cGUuZXJhc3VyZSgpKSA9PSBudWxsKQorCQkJCQkJCQkJY29udGludWUgbmV4dFNwZWNpZmljOworCQkJCQkJCX0gZWxzZSBpZiAoIWN1cnJlbnQucmV0dXJuVHlwZS5pc0NvbXBhdGlibGVXaXRoKG5leHQucmV0dXJuVHlwZSkpIHsgCisJCQkJCQkJCWNvbnRpbnVlIG5leHRTcGVjaWZpYzsKKwkJCQkJCQl9CisJCQkJCQkJLy8gY29udGludWUgd2l0aCBvcmlnaW5hbCAxNS4xMi4yLjUKIAkJCQkJCX0KLQkJCQkJCWlmIChvcmlnaW5hbC50aHJvd25FeGNlcHRpb25zICE9IG9yaWdpbmFsMi50aHJvd25FeGNlcHRpb25zKSB7Ci0JCQkJCQkJaWYgKG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMgPT0gbnVsbCkKLQkJCQkJCQkJbW9zdFNwZWNpZmljRXhjZXB0aW9ucyA9IG9yaWdpbmFsLnRocm93bkV4Y2VwdGlvbnM7Ci0JCQkJCQkJaWYgKHBvc3NpYmxlTWV0aG9kcyA9PSBudWxsKQotCQkJCQkJCQlwb3NzaWJsZU1ldGhvZHMgPSBuZXcgU2ltcGxlU2V0KDMpOwotCQkJCQkJCWludCBtb3N0U3BlY2lmaWNMZW5ndGggPSBtb3N0U3BlY2lmaWNFeGNlcHRpb25zLmxlbmd0aDsKLQkJCQkJCQlpbnQgb3JpZ2luYWwyTGVuZ3RoID0gb3JpZ2luYWwyLnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOwotCQkJCQkJCVNpbXBsZVNldCB0ZW1wID0gbmV3IFNpbXBsZVNldChtb3N0U3BlY2lmaWNMZW5ndGgpOwotCQkJCQkJCW5leHRFeGNlcHRpb24gOiBmb3IgKGludCB0ID0gMDsgdCA8IG1vc3RTcGVjaWZpY0xlbmd0aDsgdCsrKSB7Ci0JCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uID0gbW9zdFNwZWNpZmljRXhjZXB0aW9uc1t0XTsKLQkJCQkJCQkJZm9yIChpbnQgcyA9IDA7IHMgPCBvcmlnaW5hbDJMZW5ndGg7IHMrKykgewotCQkJCQkJCQkJaWYgKGV4Y2VwdGlvbi5pc0NvbXBhdGlibGVXaXRoKG9yaWdpbmFsMi50aHJvd25FeGNlcHRpb25zW3NdKSkgewotCQkJCQkJCQkJCXBvc3NpYmxlTWV0aG9kcy5hZGQoY3VycmVudCk7Ci0JCQkJCQkJCQkJdGVtcC5hZGQoZXhjZXB0aW9uKTsKLQkJCQkJCQkJCQljb250aW51ZSBuZXh0RXhjZXB0aW9uOwotCQkJCQkJCQkJfSBlbHNlIGlmIChvcmlnaW5hbDIudGhyb3duRXhjZXB0aW9uc1tzXS5pc0NvbXBhdGlibGVXaXRoKGV4Y2VwdGlvbikpIHsKLQkJCQkJCQkJCQlwb3NzaWJsZU1ldGhvZHMuYWRkKG5leHQpOwotCQkJCQkJCQkJCXRlbXAuYWRkKG9yaWdpbmFsMi50aHJvd25FeGNlcHRpb25zW3NdKTsKLQkJCQkJCQkJCQljb250aW51ZSBuZXh0RXhjZXB0aW9uOworCQkJCQkJaWYgKHNob3VsZEludGVyc2VjdEV4Y2VwdGlvbnMgJiYgb3JpZ2luYWwyLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCQlpZiAoY3VycmVudC50aHJvd25FeGNlcHRpb25zICE9IG5leHQudGhyb3duRXhjZXB0aW9ucykgeworCQkJCQkJCQlpZiAobmV4dC50aHJvd25FeGNlcHRpb25zID09IEJpbmRpbmcuTk9fRVhDRVBUSU9OUykgeworCQkJCQkJCQkJbW9zdFNwZWNpZmljRXhjZXB0aW9ucyA9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUzsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmIChtb3N0U3BlY2lmaWNFeGNlcHRpb25zID09IG51bGwpIHsKKwkJCQkJCQkJCQltb3N0U3BlY2lmaWNFeGNlcHRpb25zID0gY3VycmVudC50aHJvd25FeGNlcHRpb25zOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaW50IG1vc3RTcGVjaWZpY0xlbmd0aCA9IG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMubGVuZ3RoOworCQkJCQkJCQkJaW50IG5leHRMZW5ndGggPSBuZXh0LnRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQkJCQkJCQkJU2ltcGxlU2V0IHRlbXAgPSBuZXcgU2ltcGxlU2V0KG1vc3RTcGVjaWZpY0xlbmd0aCk7CisJCQkJCQkJCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKwkJCQkJCQkJCW5leHRFeGNlcHRpb24gOiBmb3IgKGludCB0ID0gMDsgdCA8IG1vc3RTcGVjaWZpY0xlbmd0aDsgdCsrKSB7CisJCQkJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb24gPSBtb3N0U3BlY2lmaWNFeGNlcHRpb25zW3RdOworCQkJCQkJCQkJCWZvciAoaW50IHMgPSAwOyBzIDwgbmV4dExlbmd0aDsgcysrKSB7CisJCQkJCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbmV4dEV4Y2VwdGlvbiA9IG5leHQudGhyb3duRXhjZXB0aW9uc1tzXTsKKwkJCQkJCQkJCQkJaWYgKGV4Y2VwdGlvbi5pc0NvbXBhdGlibGVXaXRoKG5leHRFeGNlcHRpb24pKSB7CisJCQkJCQkJCQkJCQl0ZW1wLmFkZChleGNlcHRpb24pOworCQkJCQkJCQkJCQkJY29udGludWUgbmV4dEV4Y2VwdGlvbjsKKwkJCQkJCQkJCQkJfSBlbHNlIGlmIChuZXh0RXhjZXB0aW9uLmlzQ29tcGF0aWJsZVdpdGgoZXhjZXB0aW9uKSkgeworCQkJCQkJCQkJCQkJdGVtcC5hZGQobmV4dEV4Y2VwdGlvbik7CisJCQkJCQkJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJCQkJCQkJCWNvbnRpbnVlIG5leHRFeGNlcHRpb247CisJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmIChjaGFuZ2VkKSB7CisJCQkJCQkJCQkJbW9zdFNwZWNpZmljRXhjZXB0aW9ucyA9IHRlbXAuZWxlbWVudFNpemUgPT0gMCA/IEJpbmRpbmcuTk9fRVhDRVBUSU9OUyA6IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3RlbXAuZWxlbWVudFNpemVdOworCQkJCQkJCQkJCXRlbXAuYXNBcnJheShtb3N0U3BlY2lmaWNFeGNlcHRpb25zKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KLQkJCQkJCQltb3N0U3BlY2lmaWNFeGNlcHRpb25zID0gdGVtcC5lbGVtZW50U2l6ZSA9PSAwID8gQmluZGluZy5OT19FWENFUFRJT05TIDogbmV3IFJlZmVyZW5jZUJpbmRpbmdbdGVtcC5lbGVtZW50U2l6ZV07Ci0JCQkJCQkJdGVtcC5hc0FycmF5KG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWlmIChtb3N0U3BlY2lmaWNFeGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gdmFsdWVzID0gcG9zc2libGVNZXRob2RzLnZhbHVlczsKLQkJCQkJaW50IGV4Y2VwdGlvbkxlbmd0aCA9IG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMubGVuZ3RoOwotCQkJCQluZXh0TWV0aG9kIDogZm9yIChpbnQgcCA9IDAsIHZMZW5ndGggPSB2YWx1ZXMubGVuZ3RoOyBwIDwgdkxlbmd0aDsgcCsrKSB7Ci0JCQkJCQlNZXRob2RCaW5kaW5nIHBvc3NpYmxlID0gKE1ldGhvZEJpbmRpbmcpIHZhbHVlc1twXTsKLQkJCQkJCWlmIChwb3NzaWJsZSA9PSBudWxsKSBjb250aW51ZSBuZXh0TWV0aG9kOwotCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0V4Y2VwdGlvbnMgPSBwb3NzaWJsZS50aHJvd25FeGNlcHRpb25zOwotCQkJCQkJaWYgKGl0c0V4Y2VwdGlvbnMubGVuZ3RoID09IGV4Y2VwdGlvbkxlbmd0aCkgewotCQkJCQkJCW5leHRFeGNlcHRpb24gOiBmb3IgKGludCBlID0gMDsgZSA8IGV4Y2VwdGlvbkxlbmd0aDsgZSsrKSB7Ci0JCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uID0gaXRzRXhjZXB0aW9uc1tlXTsKLQkJCQkJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBleGNlcHRpb25MZW5ndGg7IGYrKykKLQkJCQkJCQkJCWlmIChleGNlcHRpb24gPT0gbW9zdFNwZWNpZmljRXhjZXB0aW9uc1tmXSkgY29udGludWUgbmV4dEV4Y2VwdGlvbjsKLQkJCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHBvc3NpYmxlOwotCQkJCQkJfQotCQkJCQl9Ci0vLyBkbyBub3QgcmV0dXJuIGEgbmV3IG1ldGhvZEJpbmRpbmcgdW50aWwgd2Uga25vdyB0aGF0IGl0IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCi0vLwkJCQkJcmV0dXJuIG5ldyBNZXRob2RCaW5kaW5nKAotLy8JCQkJCQljdXJyZW50Lm1vZGlmaWVycywKLS8vCQkJCQkJY3VycmVudC5zZWxlY3RvciwKLS8vCQkJCQkJY3VycmVudC5yZXR1cm5UeXBlLAotLy8JCQkJCQljdXJyZW50LnBhcmFtZXRlcnMsCi0vLwkJCQkJCW1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMsCi0vLwkJCQkJCWN1cnJlbnQuZGVjbGFyaW5nQ2xhc3MKLS8vCQkJCQkpOworCQkJCWlmIChtb3N0U3BlY2lmaWNFeGNlcHRpb25zICE9IG51bGwgJiYgbW9zdFNwZWNpZmljRXhjZXB0aW9ucyAhPSBjdXJyZW50LnRocm93bkV4Y2VwdGlvbnMpIHsKKwkJCQkJcmV0dXJuIG5ldyBNb3N0U3BlY2lmaWNFeGNlcHRpb25NZXRob2RCaW5kaW5nKGN1cnJlbnQsIG1vc3RTcGVjaWZpY0V4Y2VwdGlvbnMpOwogCQkJCX0KIAkJCQlyZXR1cm4gY3VycmVudDsKIAkJCX0KQEAgLTM1MjQsNyArMzkyOSw4IEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0xlbmd0aDsgaSsrKSB7CiAJCQkJVHlwZUJpbmRpbmcgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldOwogCQkJCVR5cGVCaW5kaW5nIGFyZyA9IGFyZ3VtZW50c1tpXTsKLQkJCQlpZiAoYXJnICE9IHBhcmFtICYmICFhcmcuaXNDb21wYXRpYmxlV2l0aChwYXJhbSkpCisJCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwNDQ1CisJCQkJaWYgKGFyZyAhPSBwYXJhbSAmJiAhYXJnLmlzQ29tcGF0aWJsZVdpdGgocGFyYW0uZXJhc3VyZSgpKSkKIAkJCQkJcmV0dXJuIE5PVF9DT01QQVRJQkxFOwogCQkJfQogCQkJcmV0dXJuIENPTVBBVElCTEU7CkBAIC0zNTk5LDcgKzQwMDUsNyBAQAogCQkJdW5pdFNjb3BlID0gc2NvcGU7CiAJCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB1bml0U2NvcGUpLnJlZmVyZW5jZUNvbnRleHQ7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmVhcmVzdCByZWZlcmVuY2UgY29udGV4dCwgc3RhcnRpbmcgZnJvbSBjdXJyZW50IHNjb3BlLgogCSAqIElmIHN0YXJ0aW5nIG9uIGEgY2xhc3MsIGl0IHdpbGwgcmV0dXJuIGN1cnJlbnQgY2xhc3MuIElmIHN0YXJ0aW5nIG9uIHVuaXRTY29wZSwgcmV0dXJucyB1bml0LgpAQCAtMzYxOCw5ICs0MDI0LDE1OSBAQAogCQl9IHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSAhPSBudWxsKTsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCisJcHVibGljIHZvaWQgZGVmZXJCb3VuZENoZWNrKFR5cGVSZWZlcmVuY2UgdHlwZVJlZikgeworCQlpZiAodGhpcy5raW5kID09IENMQVNTX1NDT1BFKSB7CisJCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUgPSAoQ2xhc3NTY29wZSkgdGhpczsKKwkJCWlmIChjbGFzc1Njb3BlLmRlZmVycmVkQm91bmRDaGVja3MgPT0gbnVsbCkgeworCQkJCWNsYXNzU2NvcGUuZGVmZXJyZWRCb3VuZENoZWNrcyA9IG5ldyBBcnJheUxpc3QoMyk7CisJCQkJY2xhc3NTY29wZS5kZWZlcnJlZEJvdW5kQ2hlY2tzLmFkZCh0eXBlUmVmKTsKKwkJCX0gZWxzZSBpZiAoIWNsYXNzU2NvcGUuZGVmZXJyZWRCb3VuZENoZWNrcy5jb250YWlucyh0eXBlUmVmKSkgeworCQkJCWNsYXNzU2NvcGUuZGVmZXJyZWRCb3VuZENoZWNrcy5hZGQodHlwZVJlZik7CisJCQl9CisJCX0KKwl9CisKIAkvLyBzdGFydCBwb3NpdGlvbiBpbiB0aGlzIHNjb3BlIC0gZm9yIG9yZGVyaW5nIHNjb3BlcyB2cy4gdmFyaWFibGVzCiAJaW50IHN0YXJ0SW5kZXgoKSB7CiAJCXJldHVybiAwOwogCX0KKwkvKiBHaXZlbiBhbiBhbGxvY2F0aW9uIHR5cGUgYW5kIGFyZ3VtZW50cyBhdCB0aGUgYWxsb2NhdGlvbiBzaXRlLCBhbnN3ZXIgYSBzeW50aGV0aWMgZ2VuZXJpYyBzdGF0aWMgZmFjdG9yeSBtZXRob2QKKwkgICB0aGF0IGNvdWxkIGluc3RlYWQgYmUgaW52b2tlZCB3aXRoIGlkZW50aWNhbCByZXN1bHRzLiBSZXR1cm4gbnVsbCBpZiBubyBjb21wYXRpYmxlLCB2aXNpYmxlLCBtb3N0IHNwZWNpZmljIG1ldGhvZAorCSAgIGNvdWxkIGJlIGZvdW5kLiBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVyIFNjb3BlLmdldENvbnN0cnVjdG9yIGFuZCBTY29wZS5nZXRNZXRob2QuCisJICovCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0U3RhdGljRmFjdG9yeSAoUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0aW9uVHlwZSwgUmVmZXJlbmNlQmluZGluZyBvcmlnaW5hbEVuY2xvc2luZ1R5cGUsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgZmluYWwgSW52b2NhdGlvblNpdGUgYWxsb2NhdGlvblNpdGUpIHsKKwkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIGNsYXNzVHlwZVZhcmlhYmxlcyA9IGFsbG9jYXRpb25UeXBlLnR5cGVWYXJpYWJsZXMoKTsKKwkJaW50IGNsYXNzVHlwZVZhcmlhYmxlc0FyaXR5ID0gY2xhc3NUeXBlVmFyaWFibGVzLmxlbmd0aDsKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBhbGxvY2F0aW9uVHlwZS5nZXRNZXRob2RzKFR5cGVDb25zdGFudHMuSU5JVCwgYXJndW1lbnRUeXBlcy5sZW5ndGgpOworCQlNZXRob2RCaW5kaW5nIFtdIHN0YXRpY0ZhY3RvcmllcyA9IG5ldyBNZXRob2RCaW5kaW5nW21ldGhvZHMubGVuZ3RoXTsKKwkJaW50IHNmaSA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQlpbnQgcGFyYW1MZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7CisJCQlib29sZWFuIGlzVmFyQXJncyA9IG1ldGhvZC5pc1ZhcmFyZ3MoKTsKKwkJCWlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBwYXJhbUxlbmd0aCkKKwkJCQlpZiAoIWlzVmFyQXJncyB8fCBhcmd1bWVudFR5cGVzLmxlbmd0aCA8IHBhcmFtTGVuZ3RoIC0gMSkKKwkJCQkJY29udGludWU7IC8vIGluY29tcGF0aWJsZQorCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIG1ldGhvZFR5cGVWYXJpYWJsZXMgPSBtZXRob2QudHlwZVZhcmlhYmxlcygpOworCQkJaW50IG1ldGhvZFR5cGVWYXJpYWJsZXNBcml0eSA9IG1ldGhvZFR5cGVWYXJpYWJsZXMubGVuZ3RoOworCSAgICAgICAgCisJCQlNZXRob2RCaW5kaW5nIHN0YXRpY0ZhY3RvcnkgPSBuZXcgTWV0aG9kQmluZGluZyhtZXRob2QubW9kaWZpZXJzIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYywgVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfU1RBVElDX0ZBQ1RPUlksCisJCQkJCQkJCQkJCQkJCQkJCQludWxsLCBudWxsLCBudWxsLCBtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCQkJc3RhdGljRmFjdG9yeS50eXBlVmFyaWFibGVzID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmdbY2xhc3NUeXBlVmFyaWFibGVzQXJpdHkgKyBtZXRob2RUeXBlVmFyaWFibGVzQXJpdHldOworCQkJZmluYWwgU2ltcGxlTG9va3VwVGFibGUgbWFwID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKGNsYXNzVHlwZVZhcmlhYmxlc0FyaXR5ICsgbWV0aG9kVHlwZVZhcmlhYmxlc0FyaXR5KTsKKwkJCS8vIFJlbmFtZSBlYWNoIHR5cGUgdmFyaWFibGUgVCBvZiB0aGUgdHlwZSB0byBUJworCQkJZmluYWwgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCgpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc1R5cGVWYXJpYWJsZXNBcml0eTsgaisrKSB7CisJCQkJbWFwLnB1dChjbGFzc1R5cGVWYXJpYWJsZXNbal0sIHN0YXRpY0ZhY3RvcnkudHlwZVZhcmlhYmxlc1tqXSA9IG5ldyBUeXBlVmFyaWFibGVCaW5kaW5nKENoYXJPcGVyYXRpb24uY29uY2F0KGNsYXNzVHlwZVZhcmlhYmxlc1tqXS5zb3VyY2VOYW1lLCAiJyIudG9DaGFyQXJyYXkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJCQkJCQkJCQlzdGF0aWNGYWN0b3J5LCBqLCBlbnZpcm9ubWVudCkpOworCQkJfQorCQkJLy8gUmVuYW1lIGVhY2ggdHlwZSB2YXJpYWJsZSBVIG9mIG1ldGhvZCBVIHRvIFUnJy4KKwkJCWZvciAoaW50IGogPSBjbGFzc1R5cGVWYXJpYWJsZXNBcml0eSwgbWF4ID0gY2xhc3NUeXBlVmFyaWFibGVzQXJpdHkgKyBtZXRob2RUeXBlVmFyaWFibGVzQXJpdHk7IGogPCBtYXg7IGorKykgeworCQkJCW1hcC5wdXQobWV0aG9kVHlwZVZhcmlhYmxlc1tqIC0gY2xhc3NUeXBlVmFyaWFibGVzQXJpdHldLCAKKwkJCQkJCShzdGF0aWNGYWN0b3J5LnR5cGVWYXJpYWJsZXNbal0gPSBuZXcgVHlwZVZhcmlhYmxlQmluZGluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdChtZXRob2RUeXBlVmFyaWFibGVzW2ogLSBjbGFzc1R5cGVWYXJpYWJsZXNBcml0eV0uc291cmNlTmFtZSwgIicnIi50b0NoYXJBcnJheSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkJCQkJCQkJCXN0YXRpY0ZhY3RvcnksIGosIGVudmlyb25tZW50KSkpOworCQkJfQorCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gb3JpZ2luYWxFbmNsb3NpbmdUeXBlOworCQkJd2hpbGUgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1OTY4CisJCQkJaWYgKGVuY2xvc2luZ1R5cGUua2luZCgpID09IEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFKSB7CisJCQkJCWZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIGVuY2xvc2luZ1R5cGU7CisJCQkJCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2VuZXJpY1R5cGUgPSBwYXJhbWV0ZXJpemVkVHlwZS5nZW5lcmljVHlwZSgpOworCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gZW5jbG9zaW5nQ2xhc3NUeXBlVmFyaWFibGVzID0gZ2VuZXJpY1R5cGUudHlwZVZhcmlhYmxlcygpOworCQkJCQlpbnQgZW5jbG9zaW5nQ2xhc3NUeXBlVmFyaWFibGVzQXJpdHkgPSBlbmNsb3NpbmdDbGFzc1R5cGVWYXJpYWJsZXMubGVuZ3RoOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVuY2xvc2luZ0NsYXNzVHlwZVZhcmlhYmxlc0FyaXR5OyBqKyspIHsKKwkJCQkJCW1hcC5wdXQoZW5jbG9zaW5nQ2xhc3NUeXBlVmFyaWFibGVzW2pdLCBwYXJhbWV0ZXJpemVkVHlwZS5hcmd1bWVudHNbal0pOworCQkJCQl9CisJCQkJfQorCQkJCWVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCX0KKwkJCWZpbmFsIFNjb3BlIHNjb3BlID0gdGhpczsKKwkJCVN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKCkgeworCQkJCQlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQoKSB7CisJCQkJCQlyZXR1cm4gc2NvcGUuZW52aXJvbm1lbnQoKTsKKwkJCQkJfQorCQkJCQlwdWJsaWMgYm9vbGVhbiBpc1Jhd1N1YnN0aXR1dGlvbigpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlwdWJsaWMgVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZShUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSkgeworCQkJCQkJVHlwZUJpbmRpbmcgcmV0VmFsID0gKFR5cGVCaW5kaW5nKSBtYXAuZ2V0KHR5cGVWYXJpYWJsZSk7CisJCQkJCQlyZXR1cm4gcmV0VmFsICE9IG51bGwgPyByZXRWYWwgOiB0eXBlVmFyaWFibGU7CisJCQkJCX0KKwkJCQl9OworCisJCQkvLyBpbml0aWFsaXplIG5ldyB2YXJpYWJsZSBib3VuZHMKKwkJCWZvciAoaW50IGogPSAwLCBtYXggPSBjbGFzc1R5cGVWYXJpYWJsZXNBcml0eSArIG1ldGhvZFR5cGVWYXJpYWJsZXNBcml0eTsgaiA8IG1heDsgaisrKSB7CisJCQkJVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbFZhcmlhYmxlID0gaiA8IGNsYXNzVHlwZVZhcmlhYmxlc0FyaXR5ID8gY2xhc3NUeXBlVmFyaWFibGVzW2pdIDogbWV0aG9kVHlwZVZhcmlhYmxlc1tqIC0gY2xhc3NUeXBlVmFyaWFibGVzQXJpdHldOworCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkVHlwZSA9IChUeXBlQmluZGluZykgbWFwLmdldChvcmlnaW5hbFZhcmlhYmxlKTsKKwkJCQlpZiAoc3Vic3RpdHV0ZWRUeXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykgeworCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHN1YnN0aXR1dGVkVmFyaWFibGUgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgc3Vic3RpdHV0ZWRUeXBlOworCQkJCQlUeXBlQmluZGluZyBzdWJzdGl0dXRlZFN1cGVyY2xhc3MgPSBTY29wZS5zdWJzdGl0dXRlKHN1YnN0aXR1dGlvbiwgb3JpZ2luYWxWYXJpYWJsZS5zdXBlcmNsYXNzKTsKKwkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHN1YnN0aXR1dGVkSW50ZXJmYWNlcyA9IFNjb3BlLnN1YnN0aXR1dGUoc3Vic3RpdHV0aW9uLCBvcmlnaW5hbFZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcyk7CisJCQkJCWlmIChvcmlnaW5hbFZhcmlhYmxlLmZpcnN0Qm91bmQgIT0gbnVsbCkgeworCQkJCQkJc3Vic3RpdHV0ZWRWYXJpYWJsZS5maXJzdEJvdW5kID0gb3JpZ2luYWxWYXJpYWJsZS5maXJzdEJvdW5kID09IG9yaWdpbmFsVmFyaWFibGUuc3VwZXJjbGFzcworCQkJCQkJCQk/IHN1YnN0aXR1dGVkU3VwZXJjbGFzcyAvLyBjb3VsZCBiZSBhcnJheSB0eXBlIG9yIGludGVyZmFjZQorCQkJCQkJCQkJCTogc3Vic3RpdHV0ZWRJbnRlcmZhY2VzWzBdOworCQkJCQl9CisJCQkJCXN3aXRjaCAoc3Vic3RpdHV0ZWRTdXBlcmNsYXNzLmtpbmQoKSkgeworCQkJCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgorCQkJCQkJCXN1YnN0aXR1dGVkVmFyaWFibGUuc3VwZXJjbGFzcyA9IGVudmlyb25tZW50LmdldFJlc29sdmVkVHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIG51bGwpOworCQkJCQkJCXN1YnN0aXR1dGVkVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzID0gc3Vic3RpdHV0ZWRJbnRlcmZhY2VzOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlpZiAoc3Vic3RpdHV0ZWRTdXBlcmNsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkJCQkJc3Vic3RpdHV0ZWRWYXJpYWJsZS5zdXBlcmNsYXNzID0gZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCwgbnVsbCk7CisJCQkJCQkJCWludCBpbnRlcmZhY2VDb3VudCA9IHN1YnN0aXR1dGVkSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoc3Vic3RpdHV0ZWRJbnRlcmZhY2VzLCAwLCBzdWJzdGl0dXRlZEludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tpbnRlcmZhY2VDb3VudCsxXSwgMSwgaW50ZXJmYWNlQ291bnQpOworCQkJCQkJCQlzdWJzdGl0dXRlZEludGVyZmFjZXNbMF0gPSAoUmVmZXJlbmNlQmluZGluZykgc3Vic3RpdHV0ZWRTdXBlcmNsYXNzOworCQkJCQkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlLnN1cGVySW50ZXJmYWNlcyA9IHN1YnN0aXR1dGVkSW50ZXJmYWNlczsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzdWJzdGl0dXRlZFZhcmlhYmxlLnN1cGVyY2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgc3Vic3RpdHV0ZWRTdXBlcmNsYXNzOyAvLyB0eXBlVmFyIHdhcyBleHRlbmRpbmcgb3RoZXIgdHlwZVZhciB3aGljaCBnb3Qgc3Vic3RpdHV0ZWQgd2l0aCBpbnRlcmZhY2UKKwkJCQkJCQkJc3Vic3RpdHV0ZWRWYXJpYWJsZS5zdXBlckludGVyZmFjZXMgPSBzdWJzdGl0dXRlZEludGVyZmFjZXM7CisJCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkgICAgVHlwZVZhcmlhYmxlQmluZGluZ1tdIHJldHVyblR5cGVQYXJhbWV0ZXJzID0gbmV3IFR5cGVWYXJpYWJsZUJpbmRpbmdbY2xhc3NUeXBlVmFyaWFibGVzQXJpdHldOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc1R5cGVWYXJpYWJsZXNBcml0eTsgaisrKSB7CisJCQkJcmV0dXJuVHlwZVBhcmFtZXRlcnNbal0gPSAoVHlwZVZhcmlhYmxlQmluZGluZykgbWFwLmdldChjbGFzc1R5cGVWYXJpYWJsZXNbal0pOworCQkJfQorCQkJc3RhdGljRmFjdG9yeS5yZXR1cm5UeXBlID0gZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoYWxsb2NhdGlvblR5cGUsIHJldHVyblR5cGVQYXJhbWV0ZXJzLCBhbGxvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCkpOworCQkJc3RhdGljRmFjdG9yeS5wYXJhbWV0ZXJzID0gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIG1ldGhvZC5wYXJhbWV0ZXJzKTsKKwkJCXN0YXRpY0ZhY3RvcnkudGhyb3duRXhjZXB0aW9ucyA9IFNjb3BlLnN1YnN0aXR1dGUoc3Vic3RpdHV0aW9uLCBtZXRob2QudGhyb3duRXhjZXB0aW9ucyk7CisJCQlpZiAoc3RhdGljRmFjdG9yeS50aHJvd25FeGNlcHRpb25zID09IG51bGwpIHsgCisJCQkJc3RhdGljRmFjdG9yeS50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOworCQkJfQorCQkJc3RhdGljRmFjdG9yaWVzW3NmaSsrXSA9IG5ldyBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZygoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBlbnZpcm9ubWVudC5jb252ZXJ0VG9QYXJhbWV0ZXJpemVkVHlwZShzdGF0aWNGYWN0b3J5LmRlY2xhcmluZ0NsYXNzKSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdGF0aWNGYWN0b3J5KTsKKwkJfQorCQlpZiAoc2ZpID09IDApCisJCQlyZXR1cm4gbnVsbDsKKwkJaWYgKHNmaSAhPSBtZXRob2RzLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weShzdGF0aWNGYWN0b3JpZXMsIDAsIHN0YXRpY0ZhY3RvcmllcyA9IG5ldyBNZXRob2RCaW5kaW5nW3NmaV0sIDAsIHNmaSk7CisJCX0KKwkJTWV0aG9kQmluZGluZ1tdIGNvbXBhdGlibGUgPSBuZXcgTWV0aG9kQmluZGluZ1tzZmldOworCQlpbnQgY29tcGF0aWJsZUluZGV4ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZmk7IGkrKykgeworCQkJTWV0aG9kQmluZGluZyBjb21wYXRpYmxlTWV0aG9kID0gY29tcHV0ZUNvbXBhdGlibGVNZXRob2Qoc3RhdGljRmFjdG9yaWVzW2ldLCBhcmd1bWVudFR5cGVzLCBhbGxvY2F0aW9uU2l0ZSk7CisJCQlpZiAoY29tcGF0aWJsZU1ldGhvZCAhPSBudWxsKSB7CisJCQkJaWYgKGNvbXBhdGlibGVNZXRob2QuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQkJY29tcGF0aWJsZVtjb21wYXRpYmxlSW5kZXgrK10gPSBjb21wYXRpYmxlTWV0aG9kOworCQkJfQorCQl9CisKKwkJaWYgKGNvbXBhdGlibGVJbmRleCA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlNZXRob2RCaW5kaW5nW10gdmlzaWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW2NvbXBhdGlibGVJbmRleF07CisJCWludCB2aXNpYmxlSW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVJbmRleDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IGNvbXBhdGlibGVbaV07CisJCQlpZiAobWV0aG9kLmNhbkJlU2VlbkJ5KGFsbG9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQl2aXNpYmxlW3Zpc2libGVJbmRleCsrXSA9IG1ldGhvZDsKKwkJfQorCQlpZiAodmlzaWJsZUluZGV4ID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB2aXNpYmxlSW5kZXggPT0gMSA/IHZpc2libGVbMF0gOiBtb3N0U3BlY2lmaWNNZXRob2RCaW5kaW5nKHZpc2libGUsIHZpc2libGVJbmRleCwgYXJndW1lbnRUeXBlcywgYWxsb2NhdGlvblNpdGUsIGFsbG9jYXRpb25UeXBlKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NpZ25hdHVyZVdyYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2lnbmF0dXJlV3JhcHBlci5qYXZhCmluZGV4IGVlMjI2YjUuLjVkZjQ0Y2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2lnbmF0dXJlV3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2lnbmF0dXJlV3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDExICsxNywxNiBAQAogCXB1YmxpYyBpbnQgc3RhcnQ7CiAJcHVibGljIGludCBlbmQ7CiAJcHVibGljIGludCBicmFja2V0OworCXByaXZhdGUgYm9vbGVhbiB1c2UxNXNwZWNpZmljczsKIAotCXB1YmxpYyBTaWduYXR1cmVXcmFwcGVyKGNoYXJbXSBzaWduYXR1cmUpIHsKKwlwdWJsaWMgU2lnbmF0dXJlV3JhcHBlcihjaGFyW10gc2lnbmF0dXJlLCBib29sZWFuIHVzZTE1c3BlY2lmaWNzKSB7CiAJCXRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOwogCQl0aGlzLnN0YXJ0ID0gMDsKIAkJdGhpcy5lbmQgPSB0aGlzLmJyYWNrZXQgPSAtMTsKKwkJdGhpcy51c2UxNXNwZWNpZmljcyA9IHVzZTE1c3BlY2lmaWNzOworCX0KKwlwdWJsaWMgU2lnbmF0dXJlV3JhcHBlcihjaGFyIFtdIHNpZ25hdHVyZSkgeworCQl0aGlzKHNpZ25hdHVyZSwgdHJ1ZSk7CiAJfQogCXB1YmxpYyBib29sZWFuIGF0RW5kKCkgewogCQlyZXR1cm4gdGhpcy5zdGFydCA8IDAgfHwgdGhpcy5zdGFydCA+PSB0aGlzLnNpZ25hdHVyZS5sZW5ndGg7CkBAIC0zNiw3ICs0MSw3IEBACiAJCQkJdGhpcy5lbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCB0aGlzLnNpZ25hdHVyZSwgdGhpcy5zdGFydCk7CiAJCQkJaWYgKHRoaXMuYnJhY2tldCA8PSB0aGlzLnN0YXJ0KSAvLyBhbHJlYWR5IGtub3cgaXQgaWYgaXRzID4gc3RhcnQKIAkJCQkJdGhpcy5icmFja2V0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc8JywgdGhpcy5zaWduYXR1cmUsIHRoaXMuc3RhcnQpOwotCQkKKwogCQkJCWlmICh0aGlzLmJyYWNrZXQgPiB0aGlzLnN0YXJ0ICYmIHRoaXMuYnJhY2tldCA8IHRoaXMuZW5kKQogCQkJCQl0aGlzLmVuZCA9IHRoaXMuYnJhY2tldDsKIAkJCQllbHNlIGlmICh0aGlzLmVuZCA9PSAtMSkKQEAgLTQ2LDkgKzUxLDMzIEBACiAJCQkJdGhpcy5lbmQgPSB0aGlzLnN0YXJ0OwogCQl9CiAKLQkJdGhpcy5zdGFydCA9IHRoaXMuZW5kICsgMTsgLy8gc2tpcCAnOycKKwkJaWYgKHRoaXMudXNlMTVzcGVjaWZpY3MgfHwgdGhpcy5lbmQgIT0gdGhpcy5icmFja2V0KSB7CisJCQl0aGlzLnN0YXJ0ID0gdGhpcy5lbmQgKyAxOyAvLyBza2lwICc7JworCQl9IGVsc2UgeworCQkJdGhpcy5zdGFydCA9IHNraXBBbmdsZUNvbnRlbnRzKHRoaXMuZW5kKSArIDE7ICAvLyBza2lwIDw8Pio+OworCQkJdGhpcy5icmFja2V0ID0gLTE7CisJCX0KIAkJcmV0dXJuIHRoaXMuZW5kOwogCX0KKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODUwLCBkbyBub3QgZXhwb3NlIGdlbmVyaWNzIGlmIHdlIHNob3VsZG4ndAorCXB1YmxpYyBpbnQgc2tpcEFuZ2xlQ29udGVudHMoaW50IGkpIHsKKwkJaWYgKHRoaXMuc2lnbmF0dXJlW2ldICE9ICc8JykgeworCQkJcmV0dXJuIGk7CisJCX0KKwkJaW50IGRlcHRoID0gMCwgbGVuZ3RoID0gdGhpcy5zaWduYXR1cmUubGVuZ3RoOworCQlmb3IgKCsraTsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlzd2l0Y2godGhpcy5zaWduYXR1cmVbaV0pIHsKKwkJCQljYXNlICc8JyA6CisJCQkJCWRlcHRoKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz4nIDoKKwkJCQkJaWYgKC0tZGVwdGggPCAwKQorCQkJCQkJcmV0dXJuIGkgKyAxOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaTsKKwl9CiAJcHVibGljIGNoYXJbXSBuZXh0V29yZCgpIHsKIAkJdGhpcy5lbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCB0aGlzLnNpZ25hdHVyZSwgdGhpcy5zdGFydCk7CiAJCWlmICh0aGlzLmJyYWNrZXQgPD0gdGhpcy5zdGFydCkgLy8gYWxyZWFkeSBrbm93IGl0IGlmIGl0cyA+IHN0YXJ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVCaW5kaW5nLmphdmEKaW5kZXggM2JkNzQ0ZS4uYWFiYzM3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDExICs3LDExIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMyODI4MSAtIHZpc2liaWxpdHkgbGVha3Mgbm90IGRldGVjdGVkIHdoZW4gYW5hbHl6aW5nIHVudXNlZCBmaWVsZCBpbiBwcml2YXRlIGNsYXNzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKQEAgLTI2LDggKzI2LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQmluZGluZyBleHRlbmRzIFJlZmVyZW5jZUJpbmRpbmcgewogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3M7CkBAIC0zNSwxNSArMzYsMTggQEAKIAlwcml2YXRlIEZpZWxkQmluZGluZ1tdIGZpZWxkczsKIAlwcml2YXRlIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzOwogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXM7Ci0gICAgcHVibGljIFR5cGVWYXJpYWJsZUJpbmRpbmdbXSB0eXBlVmFyaWFibGVzOworCXB1YmxpYyBUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlczsKIAogCXB1YmxpYyBDbGFzc1Njb3BlIHNjb3BlOwogCi0JLy8gU3ludGhldGljcyBhcmUgc2VwYXJhdGVkIGludG8gNSBjYXRlZ29yaWVzOiBtZXRob2RzLCBzdXBlciBtZXRob2RzLCBmaWVsZHMsIGNsYXNzIGxpdGVyYWxzLCBjaGFuZ2VkIGRlY2xhcmluZyB0eXBlIGJpbmRpbmdzIGFuZCBicmlkZ2UgbWV0aG9kcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1FVEhPRF9FTVVMID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGSUVMRF9FTVVMID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19MSVRFUkFMX0VNVUwgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQ0VJVkVSX1RZUEVfRU1VTCA9IDM7CisJLy8gU3ludGhldGljcyBhcmUgc2VwYXJhdGVkIGludG8gNCBjYXRlZ29yaWVzOiBtZXRob2RzLCBzdXBlciBtZXRob2RzLCBmaWVsZHMsIGNsYXNzIGxpdGVyYWxzIGFuZCBicmlkZ2UgbWV0aG9kcworCS8vIGlmIGEgbmV3IGNhdGVnb3J5IGlzIGFkZGVkLCBhbHNvIGluY3JlbWVudCBNQVhfU1lOVEhFVElDUworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNRVRIT0RfRU1VTCA9IDA7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJRUxEX0VNVUwgPSAxOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBDTEFTU19MSVRFUkFMX0VNVUwgPSAyOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9TWU5USEVUSUNTID0gMzsKKwogCUhhc2hNYXBbXSBzeW50aGV0aWNzOwogCWNoYXJbXSBnZW5lcmljUmVmZXJlbmNlVHlwZVNpZ25hdHVyZTsKIApAQCAtNTgsOCArNjIsOCBAQAogCXRoaXMuc2NvcGUgPSBzY29wZTsKIAogCS8vIGV4cGVjdCB0aGUgZmllbGRzICYgbWV0aG9kcyB0byBiZSBpbml0aWFsaXplZCBjb3JyZWN0bHkgbGF0ZXIKLQl0aGlzLmZpZWxkcyA9IEJpbmRpbmcuTk9fRklFTERTOwotCXRoaXMubWV0aG9kcyA9IEJpbmRpbmcuTk9fTUVUSE9EUzsKKwl0aGlzLmZpZWxkcyA9IEJpbmRpbmcuVU5JTklUSUFMSVpFRF9GSUVMRFM7CisJdGhpcy5tZXRob2RzID0gQmluZGluZy5VTklOSVRJQUxJWkVEX01FVEhPRFM7CiAKIAljb21wdXRlSWQoKTsKIH0KQEAgLTk4LDcgKzEwMiw3IEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJTWV0aG9kQmluZGluZyBkZWZhdWx0QWJzdHJhY3QgPSBuZXcgTWV0aG9kQmluZGluZygKLQkJCQkJCQkJbWV0aG9kLm1vZGlmaWVycyB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVmYXVsdEFic3RyYWN0LAorCQkJCQkJCQltZXRob2QubW9kaWZpZXJzIHwgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0QWJzdHJhY3QgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljLAogCQkJCQkJCQltZXRob2Quc2VsZWN0b3IsCiAJCQkJCQkJCW1ldGhvZC5yZXR1cm5UeXBlLAogCQkJCQkJCQltZXRob2QucGFyYW1ldGVycywKQEAgLTE0MCwxNyArMTQ0LDE3IEBACiAqLwogcHVibGljIEZpZWxkQmluZGluZyBhZGRTeW50aGV0aWNGaWVsZEZvcklubmVyY2xhc3MoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CiAJaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsKQotCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFs0XTsKKwkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbTUFYX1NZTlRIRVRJQ1NdOwogCWlmICh0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuRklFTERfRU1VTF0gPT0gbnVsbCkKIAkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7Ci0JCisKIAlGaWVsZEJpbmRpbmcgc3ludGhGaWVsZCA9IChGaWVsZEJpbmRpbmcpIHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5GSUVMRF9FTVVMXS5nZXQoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKIAlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7CiAJCXN5bnRoRmllbGQgPSBuZXcgU3ludGhldGljRmllbGRCaW5kaW5nKAotCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfT1VURVJfTE9DQUxfUFJFRklYLCBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSksIAotCQkJYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLnR5cGUsIAotCQkJQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljLCAKLQkJCXRoaXMsIAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfT1VURVJfTE9DQUxfUFJFRklYLCBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSksCisJCQlhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUudHlwZSwKKwkJCUNsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYywKKwkJCXRoaXMsCiAJCQlDb25zdGFudC5Ob3RBQ29uc3RhbnQsCiAJCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuRklFTERfRU1VTF0uc2l6ZSgpKTsKIAkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdLnB1dChhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUsIHN5bnRoRmllbGQpOwpAQCAtMTYyLDEwICsxNjYsMTIgQEAKIAlkbyB7CiAJCW5lZWRSZWNoZWNrID0gZmFsc2U7CiAJCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkOwotCQlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKKwkJaWYgKChleGlzdGluZ0ZpZWxkID0gZ2V0RmllbGQoc3ludGhGaWVsZC5uYW1lLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy5zY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdHlwZURlY2wuZmllbGRzOworCQkJaW50IG1heCA9IGZpZWxkRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKIAkJCQkJc3ludGhGaWVsZC5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCiAJCQkJCQlUeXBlQ29uc3RhbnRzLlNZTlRIRVRJQ19PVVRFUl9MT0NBTF9QUkVGSVgsCkBAIC0xODQsNyArMTkwLDcgQEAKICovCiBwdWJsaWMgRmllbGRCaW5kaW5nIGFkZFN5bnRoZXRpY0ZpZWxkRm9ySW5uZXJjbGFzcyhSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKIAlpZiAodGhpcy5zeW50aGV0aWNzID09IG51bGwpCi0JCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwWzRdOworCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFtNQVhfU1lOVEhFVElDU107CiAJaWYgKHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5GSUVMRF9FTVVMXSA9PSBudWxsKQogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuRklFTERfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIApAQCAtMjA2LDEwICsyMTIsMTIgQEAKIAlkbyB7CiAJCW5lZWRSZWNoZWNrID0gZmFsc2U7CiAJCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkOwotCQlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKKwkJaWYgKChleGlzdGluZ0ZpZWxkID0gZ2V0RmllbGQoc3ludGhGaWVsZC5uYW1lLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy5zY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdHlwZURlY2wuZmllbGRzOworCQkJaW50IG1heCA9IGZpZWxkRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKIAkJCQkJaWYgKHRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKIAkJCQkJCXN5bnRoRmllbGQubmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KApAQCAtMjMxLDcgKzIzOSw3IEBACiAqLwogcHVibGljIEZpZWxkQmluZGluZyBhZGRTeW50aGV0aWNGaWVsZEZvckNsYXNzTGl0ZXJhbChUeXBlQmluZGluZyB0YXJnZXRUeXBlLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKIAlpZiAodGhpcy5zeW50aGV0aWNzID09IG51bGwpCi0JCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwWzRdOworCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFtNQVhfU1lOVEhFVElDU107CiAJaWYgKHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5DTEFTU19MSVRFUkFMX0VNVUxdID09IG51bGwpCiAJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5DTEFTU19MSVRFUkFMX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CiAKQEAgLTI1MSwxNiArMjU5LDE4IEBACiAJfQogCS8vIGVuc3VyZSB0aGVyZSBpcyBub3QgYWxyZWFkeSBzdWNoIGEgZmllbGQgZGVmaW5lZCBieSB0aGUgdXNlcgogCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkOwotCWlmICgoZXhpc3RpbmdGaWVsZCA9IHRoaXMuZ2V0RmllbGQoc3ludGhGaWVsZC5uYW1lLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgeworCWlmICgoZXhpc3RpbmdGaWVsZCA9IGdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKIAkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gYmxvY2tTY29wZS5yZWZlcmVuY2VUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQlGaWVsZERlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9uRmllbGRzID0gdHlwZURlY2wuZmllbGRzOworCQlpbnQgbWF4ID0gdHlwZURlY2xhcmF0aW9uRmllbGRzID09IG51bGwgPyAwIDogdHlwZURlY2xhcmF0aW9uRmllbGRzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSB0eXBlRGVjbGFyYXRpb25GaWVsZHNbaV07CiAJCQlpZiAoZmllbGREZWNsLmJpbmRpbmcgPT0gZXhpc3RpbmdGaWVsZCkgewogCQkJCWJsb2NrU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRmllbGRJblR5cGUodGhpcywgZmllbGREZWNsKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCX0JCQorCX0KIAlyZXR1cm4gc3ludGhGaWVsZDsKIH0KIC8qIEFkZCBhIG5ldyBzeW50aGV0aWMgZmllbGQgZm9yIHRoZSBlbXVsYXRpb24gb2YgdGhlIGFzc2VydCBzdGF0ZW1lbnQuCkBAIC0yNjgsNyArMjc4LDcgQEAKICovCiBwdWJsaWMgRmllbGRCaW5kaW5nIGFkZFN5bnRoZXRpY0ZpZWxkRm9yQXNzZXJ0KEJsb2NrU2NvcGUgYmxvY2tTY29wZSkgewogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKIAlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdID09IG51bGwpCiAJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5GSUVMRF9FTVVMXSA9IG5ldyBIYXNoTWFwKDUpOwogCkBAIC0yOTAsOSArMzAwLDEwIEBACiAJZG8gewogCQluZWVkUmVjaGVjayA9IGZhbHNlOwogCQlGaWVsZEJpbmRpbmcgZXhpc3RpbmdGaWVsZDsKLQkJaWYgKChleGlzdGluZ0ZpZWxkID0gdGhpcy5nZXRGaWVsZChzeW50aEZpZWxkLm5hbWUsIHRydWUgLypyZXNvbHZlKi8pKSAhPSBudWxsKSB7CisJCWlmICgoZXhpc3RpbmdGaWVsZCA9IGdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKIAkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHRoaXMuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWludCBtYXggPSAodHlwZURlY2wuZmllbGRzID09IG51bGwpID8gMCA6IHR5cGVEZWNsLmZpZWxkcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSB0eXBlRGVjbC5maWVsZHNbaV07CiAJCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKIAkJCQkJc3ludGhGaWVsZC5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCkBAIC0zMTEsNyArMzIyLDcgQEAKICovCiBwdWJsaWMgRmllbGRCaW5kaW5nIGFkZFN5bnRoZXRpY0ZpZWxkRm9yRW51bVZhbHVlcygpIHsKIAlpZiAodGhpcy5zeW50aGV0aWNzID09IG51bGwpCi0JCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwWzRdOworCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFtNQVhfU1lOVEhFVElDU107CiAJaWYgKHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5GSUVMRF9FTVVMXSA9PSBudWxsKQogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuRklFTERfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIApAQCAtMzMzLDEwICszNDQsMTIgQEAKIAlkbyB7CiAJCW5lZWRSZWNoZWNrID0gZmFsc2U7CiAJCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkOwotCQlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKKwkJaWYgKChleGlzdGluZ0ZpZWxkID0gZ2V0RmllbGQoc3ludGhGaWVsZC5uYW1lLCB0cnVlIC8qcmVzb2x2ZSovKSkgIT0gbnVsbCkgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy5zY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdHlwZURlY2wuZmllbGRzOworCQkJaW50IG1heCA9IGZpZWxkRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKIAkJCQkJc3ludGhGaWVsZC5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCiAJCQkJCQlUeXBlQ29uc3RhbnRzLlNZTlRIRVRJQ19FTlVNX1ZBTFVFUywKQEAgLTM1MiwyMSArMzY1LDIxIEBACiAvKiBBZGQgYSBuZXcgc3ludGhldGljIGFjY2VzcyBtZXRob2QgZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIDx0YXJnZXRGaWVsZD4uCiAJQW5zd2VyIHRoZSBuZXcgbWV0aG9kIG9yIHRoZSBleGlzdGluZyBtZXRob2QgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KICovCi1wdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZyBhZGRTeW50aGV0aWNNZXRob2QoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcykgeworcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljTWV0aG9kKEZpZWxkQmluZGluZyB0YXJnZXRGaWVsZCwgYm9vbGVhbiBpc1JlYWRBY2Nlc3MsIGJvb2xlYW4gaXNTdXBlckFjY2VzcykgewogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKIAlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXSA9PSBudWxsKQogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CiAKIAlTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFjY2Vzc01ldGhvZCA9IG51bGw7CiAJU3ludGhldGljTWV0aG9kQmluZGluZ1tdIGFjY2Vzc29ycyA9IChTeW50aGV0aWNNZXRob2RCaW5kaW5nW10pIHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0uZ2V0KHRhcmdldEZpZWxkKTsKIAlpZiAoYWNjZXNzb3JzID09IG51bGwpIHsKLQkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcodGFyZ2V0RmllbGQsIGlzUmVhZEFjY2VzcywgdGhpcyk7CisJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKHRhcmdldEZpZWxkLCBpc1JlYWRBY2Nlc3MsIGlzU3VwZXJBY2Nlc3MsIHRoaXMpOwogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdLnB1dCh0YXJnZXRGaWVsZCwgYWNjZXNzb3JzID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbMl0pOwotCQlhY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gMCA6IDFdID0gYWNjZXNzTWV0aG9kOwkJCisJCWFjY2Vzc29yc1tpc1JlYWRBY2Nlc3MgPyAwIDogMV0gPSBhY2Nlc3NNZXRob2Q7CiAJfSBlbHNlIHsKIAkJaWYgKChhY2Nlc3NNZXRob2QgPSBhY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gMCA6IDFdKSA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZyh0YXJnZXRGaWVsZCwgaXNSZWFkQWNjZXNzLCB0aGlzKTsKKwkJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKHRhcmdldEZpZWxkLCBpc1JlYWRBY2Nlc3MsIGlzU3VwZXJBY2Nlc3MsIHRoaXMpOwogCQkJYWNjZXNzb3JzW2lzUmVhZEFjY2VzcyA/IDAgOiAxXSA9IGFjY2Vzc01ldGhvZDsKIAkJfQogCX0KQEAgLTM3Nyw3ICszOTAsNyBAQAogKi8KIHB1YmxpYyBTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFkZFN5bnRoZXRpY0VudW1NZXRob2QoY2hhcltdIHNlbGVjdG9yKSB7CiAJaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsKQotCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFs0XTsKKwkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbTUFYX1NZTlRIRVRJQ1NdOwogCWlmICh0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdID09IG51bGwpCiAJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIApAQCAtMzg2LDcgKzM5OSw3IEBACiAJaWYgKGFjY2Vzc29ycyA9PSBudWxsKSB7CiAJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKHRoaXMsIHNlbGVjdG9yKTsKIAkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXS5wdXQoc2VsZWN0b3IsIGFjY2Vzc29ycyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nWzJdKTsKLQkJYWNjZXNzb3JzWzBdID0gYWNjZXNzTWV0aG9kOwkJCisJCWFjY2Vzc29yc1swXSA9IGFjY2Vzc01ldGhvZDsKIAl9IGVsc2UgewogCQlpZiAoKGFjY2Vzc01ldGhvZCA9IGFjY2Vzc29yc1swXSkgPT0gbnVsbCkgewogCQkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcodGhpcywgc2VsZWN0b3IpOwpAQCAtMzk2LDExICs0MDksMTEgQEAKIAlyZXR1cm4gYWNjZXNzTWV0aG9kOwogfQogLyoKLSAqIEFkZCBhIHN5bnRoZXRpYyBmaWVsZCB0byBoYW5kbGUgdGhlIGNhY2hlIG9mIHRoZSBzd2l0Y2ggdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gdHlwZSAKKyAqIEFkZCBhIHN5bnRoZXRpYyBmaWVsZCB0byBoYW5kbGUgdGhlIGNhY2hlIG9mIHRoZSBzd2l0Y2ggdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gdHlwZQogICovCiBwdWJsaWMgU3ludGhldGljRmllbGRCaW5kaW5nIGFkZFN5bnRoZXRpY0ZpZWxkRm9yU3dpdGNoRW51bShjaGFyW10gZmllbGROYW1lLCBTdHJpbmcga2V5KSB7CiAJaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsKQotCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFs0XTsKKwkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbTUFYX1NZTlRIRVRJQ1NdOwogCWlmICh0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuRklFTERfRU1VTF0gPT0gbnVsbCkKIAkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CiAKQEAgLTQyMSwxMCArNDM0LDEyIEBACiAJZG8gewogCQluZWVkUmVjaGVjayA9IGZhbHNlOwogCQlGaWVsZEJpbmRpbmcgZXhpc3RpbmdGaWVsZDsKLQkJaWYgKChleGlzdGluZ0ZpZWxkID0gdGhpcy5nZXRGaWVsZChzeW50aEZpZWxkLm5hbWUsIHRydWUgLypyZXNvbHZlKi8pKSAhPSBudWxsKSB7CisJCWlmICgoZXhpc3RpbmdGaWVsZCA9IGdldEZpZWxkKHN5bnRoRmllbGQubmFtZSwgdHJ1ZSAvKnJlc29sdmUqLykpICE9IG51bGwpIHsKIAkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHRoaXMuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IHR5cGVEZWNsLmZpZWxkc1tpXTsKKwkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsLmZpZWxkczsKKwkJCWludCBtYXggPSBmaWVsZERlY2xhcmF0aW9ucyA9PSBudWxsID8gMCA6IGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IGZpZWxkRGVjbGFyYXRpb25zW2ldOwogCQkJCWlmIChmaWVsZERlY2wuYmluZGluZyA9PSBleGlzdGluZ0ZpZWxkKSB7CiAJCQkJCXN5bnRoRmllbGQubmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAogCQkJCQkJZmllbGROYW1lLApAQCAtNDQyLDcgKzQ1Nyw3IEBACiAqLwogcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljTWV0aG9kRm9yU3dpdGNoRW51bShUeXBlQmluZGluZyBlbnVtQmluZGluZykgewogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKIAlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXSA9PSBudWxsKQogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CiAKQEAgLTQ1NCwyNiArNDY5LDM4IEBACiAJLy8gZmlyc3QgYWRkIHRoZSBjb3JyZXNwb25kaW5nIHN5bnRoZXRpYyBmaWVsZAogCWlmIChhY2Nlc3NvcnMgPT0gbnVsbCkgewogCQkvLyB0aGVuIGNyZWF0ZSB0aGUgc3ludGhldGljIG1ldGhvZAotCQlmaW5hbCBTeW50aGV0aWNGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gdGhpcy5hZGRTeW50aGV0aWNGaWVsZEZvclN3aXRjaEVudW0oc2VsZWN0b3IsIGtleSk7CisJCWZpbmFsIFN5bnRoZXRpY0ZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBhZGRTeW50aGV0aWNGaWVsZEZvclN3aXRjaEVudW0oc2VsZWN0b3IsIGtleSk7CiAJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKGZpZWxkQmluZGluZywgdGhpcywgZW51bUJpbmRpbmcsIHNlbGVjdG9yKTsKIAkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXS5wdXQoa2V5LCBhY2Nlc3NvcnMgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZ1syXSk7CiAJCWFjY2Vzc29yc1swXSA9IGFjY2Vzc01ldGhvZDsKIAl9IGVsc2UgewogCQlpZiAoKGFjY2Vzc01ldGhvZCA9IGFjY2Vzc29yc1swXSkgPT0gbnVsbCkgewotCQkJZmluYWwgU3ludGhldGljRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHRoaXMuYWRkU3ludGhldGljRmllbGRGb3JTd2l0Y2hFbnVtKHNlbGVjdG9yLCBrZXkpOworCQkJZmluYWwgU3ludGhldGljRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGFkZFN5bnRoZXRpY0ZpZWxkRm9yU3dpdGNoRW51bShzZWxlY3Rvciwga2V5KTsKIAkJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKGZpZWxkQmluZGluZywgdGhpcywgZW51bUJpbmRpbmcsIHNlbGVjdG9yKTsKIAkJCWFjY2Vzc29yc1swXSA9IGFjY2Vzc01ldGhvZDsKIAkJfQogCX0KIAlyZXR1cm4gYWNjZXNzTWV0aG9kOwogfQorcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljTWV0aG9kRm9yRW51bUluaXRpYWxpemF0aW9uKGludCBiZWdpbiwgaW50IGVuZCkgeworCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKKwkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbTUFYX1NZTlRIRVRJQ1NdOworCWlmICh0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdID09IG51bGwpCisJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKKworCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcodGhpcywgYmVnaW4sIGVuZCk7CisJU3ludGhldGljTWV0aG9kQmluZGluZ1tdIGFjY2Vzc29ycyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nWzJdOyAKKwl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdLnB1dChhY2Nlc3NNZXRob2Quc2VsZWN0b3IsIGFjY2Vzc29ycyk7CisJYWNjZXNzb3JzWzBdID0gYWNjZXNzTWV0aG9kOworCXJldHVybiBhY2Nlc3NNZXRob2Q7Cit9CiAvKiBBZGQgYSBuZXcgc3ludGhldGljIGFjY2VzcyBtZXRob2QgZm9yIGFjY2VzcyB0byA8dGFyZ2V0TWV0aG9kPi4KICAqIE11c3QgZGlzdGluZ3Vpc2ggYWNjZXNzIG1ldGhvZCB1c2VkIGZvciBzdXBlciBhY2Nlc3MgZnJvbSBvdGhlcnMgKG5lZWQgdG8gdXNlIGludm9rZXNwZWNpYWwgYnl0ZWNvZGUpCiAJQW5zd2VyIHRoZSBuZXcgbWV0aG9kIG9yIHRoZSBleGlzdGluZyBtZXRob2QgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KICovCiBwdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZyBhZGRTeW50aGV0aWNNZXRob2QoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIGJvb2xlYW4gaXNTdXBlckFjY2VzcykgewogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKIAlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXSA9PSBudWxsKQogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7CiAKQEAgLTQ4MiwxNiArNTA5LDI1IEBACiAJaWYgKGFjY2Vzc29ycyA9PSBudWxsKSB7CiAJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKHRhcmdldE1ldGhvZCwgaXNTdXBlckFjY2VzcywgdGhpcyk7CiAJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0ucHV0KHRhcmdldE1ldGhvZCwgYWNjZXNzb3JzID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbMl0pOwotCQlhY2Nlc3NvcnNbaXNTdXBlckFjY2VzcyA/IDAgOiAxXSA9IGFjY2Vzc01ldGhvZDsJCQorCQlhY2Nlc3NvcnNbaXNTdXBlckFjY2VzcyA/IDAgOiAxXSA9IGFjY2Vzc01ldGhvZDsKIAl9IGVsc2UgewogCQlpZiAoKGFjY2Vzc01ldGhvZCA9IGFjY2Vzc29yc1tpc1N1cGVyQWNjZXNzID8gMCA6IDFdKSA9PSBudWxsKSB7CiAJCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZyh0YXJnZXRNZXRob2QsIGlzU3VwZXJBY2Nlc3MsIHRoaXMpOwogCQkJYWNjZXNzb3JzW2lzU3VwZXJBY2Nlc3MgPyAwIDogMV0gPSBhY2Nlc3NNZXRob2Q7CiAJCX0KIAl9CisJaWYgKHRhcmdldE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc1N0YXRpYygpKSB7CisJCWlmICgodGFyZ2V0TWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiB0YXJnZXRNZXRob2QucGFyYW1ldGVycy5sZW5ndGggPj0gMHhGRSkKKwkJCQl8fCB0YXJnZXRNZXRob2QucGFyYW1ldGVycy5sZW5ndGggPj0gMHhGRikgeworCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50b29NYW55UGFyYW1ldGVyc0ZvclN5bnRoZXRpY01ldGhvZCh0YXJnZXRNZXRob2Quc291cmNlTWV0aG9kKCkpOworCQl9CisJfSBlbHNlIGlmICgodGFyZ2V0TWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiB0YXJnZXRNZXRob2QucGFyYW1ldGVycy5sZW5ndGggPj0gMHhGRCkKKwkJCXx8IHRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA+PSAweEZFKSB7CisJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueVBhcmFtZXRlcnNGb3JTeW50aGV0aWNNZXRob2QodGFyZ2V0TWV0aG9kLnNvdXJjZU1ldGhvZCgpKTsKKwl9CiAJcmV0dXJuIGFjY2Vzc01ldGhvZDsKIH0KLS8qIAorLyoKICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGJyaWRnZSBtZXRob2RzIG5lZWQgdG8gYmUgZ2VuZXJhdGVkIHRvIG92ZXJyaWRlIGNlcnRhaW4gaW5oZXJpdGVkIG1ldGhvZHMKICAqLwogcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljQnJpZGdlTWV0aG9kKE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kVG9CcmlkZ2UsIE1ldGhvZEJpbmRpbmcgdGFyZ2V0TWV0aG9kKSB7CkBAIC01MDIsNyArNTM4LDcgQEAKIAkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgbmVlZCBicmlkZ2UgbWV0aG9kCiAJfQogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07CisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKIAlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXSA9PSBudWxsKSB7CiAJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIAl9IGVsc2UgewpAQCAtNTI2LDcgKzU2Miw3IEBACiAJaWYgKGFjY2Vzc29ycyA9PSBudWxsKSB7CiAJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlLCB0YXJnZXRNZXRob2QsIHRoaXMpOwogCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdLnB1dChpbmhlcml0ZWRNZXRob2RUb0JyaWRnZSwgYWNjZXNzb3JzID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbMl0pOwotCQlhY2Nlc3NvcnNbMV0gPSBhY2Nlc3NNZXRob2Q7CQkKKwkJYWNjZXNzb3JzWzFdID0gYWNjZXNzTWV0aG9kOwogCX0gZWxzZSB7CiAJCWlmICgoYWNjZXNzTWV0aG9kID0gYWNjZXNzb3JzWzFdKSA9PSBudWxsKSB7CiAJCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZyhpbmhlcml0ZWRNZXRob2RUb0JyaWRnZSwgdGFyZ2V0TWV0aG9kLCB0aGlzKTsKQEAgLTUzNSwxNSArNTcxLDY4IEBACiAJfQogCXJldHVybiBhY2Nlc3NNZXRob2Q7CiB9CisvKgorICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODY1OC4gR2VuZXJhdGUgYSBicmlkZ2UgbWV0aG9kIGlmIGEgcHVibGljIG1ldGhvZCBpcyBpbmhlcml0ZWQKKyAqIGZyb20gYSBub24tcHVibGljIGNsYXNzIGludG8gYSBwdWJsaWMgY2xhc3MgKG9ubHkgaW4gMS42IG9yIGdyZWF0ZXIpCisgKi8KK3B1YmxpYyBTeW50aGV0aWNNZXRob2RCaW5kaW5nIGFkZFN5bnRoZXRpY0JyaWRnZU1ldGhvZChNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlKSB7CisJaWYgKHRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChpc0ludGVyZmFjZSgpKSByZXR1cm4gbnVsbDsKKwlpZiAoaW5oZXJpdGVkTWV0aG9kVG9CcmlkZ2UuaXNBYnN0cmFjdCgpIHx8IGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlLmlzRmluYWwoKSB8fCBpbmhlcml0ZWRNZXRob2RUb0JyaWRnZS5pc1N0YXRpYygpKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAodGhpcy5zeW50aGV0aWNzID09IG51bGwpCisJCXRoaXMuc3ludGhldGljcyA9IG5ldyBIYXNoTWFwW01BWF9TWU5USEVUSUNTXTsKKwlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXSA9PSBudWxsKSB7CisJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKKwl9IGVsc2UgeworCQkvLyBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBlcXVpdmFsZW50IGluaGVyaXRlZE1ldGhvZCBhbHJlYWR5IGFkZGVkCisJCUl0ZXJhdG9yIHN5bnRoTWV0aG9kcyA9IHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0ua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKHN5bnRoTWV0aG9kcy5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBzeW50aGV0aWMgPSBzeW50aE1ldGhvZHMubmV4dCgpOworCQkJaWYgKHN5bnRoZXRpYyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IChNZXRob2RCaW5kaW5nKSBzeW50aGV0aWM7CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlLnNlbGVjdG9yLCBtZXRob2Quc2VsZWN0b3IpCisJCQkJCSYmIGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlLnJldHVyblR5cGUuZXJhc3VyZSgpID09IG1ldGhvZC5yZXR1cm5UeXBlLmVyYXN1cmUoKQorCQkJCQkmJiBpbmhlcml0ZWRNZXRob2RUb0JyaWRnZS5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG1ldGhvZCkpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCVN5bnRoZXRpY01ldGhvZEJpbmRpbmcgYWNjZXNzTWV0aG9kID0gbnVsbDsKKwlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10gYWNjZXNzb3JzID0gKFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSkgdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXS5nZXQoaW5oZXJpdGVkTWV0aG9kVG9CcmlkZ2UpOworCWlmIChhY2Nlc3NvcnMgPT0gbnVsbCkgeworCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZyhpbmhlcml0ZWRNZXRob2RUb0JyaWRnZSwgdGhpcyk7CisJCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0ucHV0KGluaGVyaXRlZE1ldGhvZFRvQnJpZGdlLCBhY2Nlc3NvcnMgPSBuZXcgU3ludGhldGljTWV0aG9kQmluZGluZ1syXSk7CisJCWFjY2Vzc29yc1swXSA9IGFjY2Vzc01ldGhvZDsKKwl9IGVsc2UgeworCQlpZiAoKGFjY2Vzc01ldGhvZCA9IGFjY2Vzc29yc1swXSkgPT0gbnVsbCkgeworCQkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcoaW5oZXJpdGVkTWV0aG9kVG9CcmlkZ2UsIHRoaXMpOworCQkJYWNjZXNzb3JzWzBdID0gYWNjZXNzTWV0aG9kOworCQl9CisJfQorCXJldHVybiBhY2Nlc3NNZXRob2Q7Cit9Citib29sZWFuIGFyZUZpZWxkc0luaXRpYWxpemVkKCkgeworCXJldHVybiB0aGlzLmZpZWxkcyAhPSBCaW5kaW5nLlVOSU5JVElBTElaRURfRklFTERTOworfQorYm9vbGVhbiBhcmVNZXRob2RzSW5pdGlhbGl6ZWQoKSB7CisJcmV0dXJuIHRoaXMubWV0aG9kcyAhPSBCaW5kaW5nLlVOSU5JVElBTElaRURfTUVUSE9EUzsKK30KIHB1YmxpYyBpbnQga2luZCgpIHsKIAlpZiAodGhpcy50eXBlVmFyaWFibGVzICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHJldHVybiBCaW5kaW5nLkdFTkVSSUNfVFlQRTsKIAlyZXR1cm4gQmluZGluZy5UWVBFOwogfQorCiBwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKIAljaGFyW10gdW5pcXVlS2V5ID0gc3VwZXIuY29tcHV0ZVVuaXF1ZUtleShpc0xlYWYpOwogCWlmICh1bmlxdWVLZXkubGVuZ3RoID09IDIpIHJldHVybiB1bmlxdWVLZXk7IC8vIHByb2JsZW0gdHlwZSdzIHVuaXF1ZSBrZXkgaXMgIkw7IgogCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZSh0aGlzLmZpbGVOYW1lKSkgcmV0dXJuIHVuaXF1ZUtleTsgLy8gbm8gbmVlZCB0byBpbnNlcnQgY29tcGlsYXRpb24gdW5pdCBuYW1lIGZvciBhIC5jbGFzcyBmaWxlCi0JCisKIAkvLyBpbnNlcnQgY29tcGlsYXRpb24gdW5pdCBuYW1lIGlmIHRoZSB0eXBlIG5hbWUgaXMgbm90IHRoZSBtYWluIHR5cGUgbmFtZQogCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcuJywgdGhpcy5maWxlTmFtZSk7CiAJaWYgKGVuZCAhPSAtMSkgewpAQCAtNTUyLDcgKzY0MSwxMiBAQAogCQlzdGFydCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy8nLCB1bmlxdWVLZXkpICsgMTsKIAkJaWYgKHN0YXJ0ID09IDApCiAJCQlzdGFydCA9IDE7IC8vIHN0YXJ0IGFmdGVyIEwKLQkJZW5kID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgdW5pcXVlS2V5LCBzdGFydCk7CisJCWlmICh0aGlzLmlzTWVtYmVyVHlwZSgpKSB7CisJCQllbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyQnLCB1bmlxdWVLZXksIHN0YXJ0KTsKKwkJfSBlbHNlIHsKKwkJCS8vICckJyBpcyBwYXJ0IG9mIHRoZSB0eXBlIG5hbWUKKwkJCWVuZCA9IC0xOworCQl9CiAJCWlmIChlbmQgPT0gLTEpCiAJCQllbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzwnLCB1bmlxdWVLZXksIHN0YXJ0KTsKIAkJaWYgKGVuZCA9PSAtMSkKQEAgLTU3MywxMSArNjY3LDEyIEBACiAJfQogCXJldHVybiB1bmlxdWVLZXk7CiB9CisKIHZvaWQgZmF1bHRJblR5cGVzRm9yRmllbGRzQW5kTWV0aG9kcygpIHsKIAkvLyBjaGVjayBARGVwcmVjYXRlZCBhbm5vdGF0aW9uCiAJZ2V0QW5ub3RhdGlvblRhZ0JpdHMoKTsgLy8gbWFya3MgYXMgZGVwcmVjYXRlZCBieSBzaWRlIGVmZmVjdAotCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHRoaXMuZW5jbG9zaW5nVHlwZSgpOwotCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpICYmICF0aGlzLmlzRGVwcmVjYXRlZCgpKQorCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUoKTsKKwlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhaXNEZXByZWNhdGVkKCkpCiAJCXRoaXMubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CiAJZmllbGRzKCk7CiAJbWV0aG9kcygpOwpAQCAtNTg4LDcgKzY4Myw3IEBACiAvLyBOT1RFOiB0aGUgdHlwZSBvZiBlYWNoIGZpZWxkIG9mIGEgc291cmNlIHR5cGUgaXMgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKIHB1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHMoKSB7CiAJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZUZpZWxkc0NvbXBsZXRlKSAhPSAwKQotCQlyZXR1cm4gdGhpcy5maWVsZHM7CQorCQlyZXR1cm4gdGhpcy5maWVsZHM7CiAKIAlpbnQgZmFpbGVkID0gMDsKIAlGaWVsZEJpbmRpbmdbXSByZXNvbHZlZEZpZWxkcyA9IHRoaXMuZmllbGRzOwpAQCAtNzI1LDcgKzgyMCw3IEBACiAJCQlpZiAobGVuZ3RoID4gMSkKIAkJCQlSZWZlcmVuY2VCaW5kaW5nLnNvcnRNZXRob2RzKHRoaXMubWV0aG9kcywgMCwgbGVuZ3RoKTsKIAkJCXRoaXMudGFnQml0cyB8PSBUYWdCaXRzLkFyZU1ldGhvZHNTb3J0ZWQ7Ci0JCX0JCQorCQl9CiAJCWxvbmcgcmFuZ2U7CiAJCWlmICgocmFuZ2UgPSBSZWZlcmVuY2VCaW5kaW5nLmJpbmFyeVNlYXJjaChUeXBlQ29uc3RhbnRzLklOSVQsIHRoaXMubWV0aG9kcykpID49IDApIHsKIAkJCW5leHRNZXRob2Q6IGZvciAoaW50IGltZXRob2QgPSAoaW50KXJhbmdlLCBlbmQgPSAoaW50KShyYW5nZSA+PiAzMik7IGltZXRob2QgPD0gZW5kOyBpbWV0aG9kKyspIHsKQEAgLTc0Myw3ICs4MzgsNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCX0JCisJfQogCXJldHVybiBudWxsOwogfQogCkBAIC03NzcsMTMgKzg3MiwxMyBAQAogCQkJCVJlZmVyZW5jZUJpbmRpbmcuc29ydE1ldGhvZHModGhpcy5tZXRob2RzLCAwLCBsZW5ndGgpOwogCQkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQXJlTWV0aG9kc1NvcnRlZDsKIAkJfQotCQkKKwogCQlsb25nIHJhbmdlOwogCQlpZiAoKHJhbmdlID0gUmVmZXJlbmNlQmluZGluZy5iaW5hcnlTZWFyY2goc2VsZWN0b3IsIHRoaXMubWV0aG9kcykpID49IDApIHsKIAkJCS8vIGNoZWNrIHVucmVzb2x2ZWQgbWV0aG9kCiAJCQlpbnQgc3RhcnQgPSAoaW50KSByYW5nZSwgZW5kID0gKGludCkgKHJhbmdlID4+IDMyKTsKIAkJCWZvciAoaW50IGltZXRob2QgPSBzdGFydDsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgewotCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwkJCQorCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwogCQkJCWlmIChyZXNvbHZlVHlwZXNGb3IobWV0aG9kKSA9PSBudWxsIHx8IG1ldGhvZC5yZXR1cm5UeXBlID09IG51bGwpIHsKIAkJCQkJbWV0aG9kcygpOwogCQkJCQlyZXR1cm4gZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHJlZlNjb3BlKTsgLy8gdHJ5IGFnYWluIHNpbmNlIHRoZSBwcm9ibGVtIG1ldGhvZHMgaGF2ZSBiZWVuIHJlbW92ZWQKQEAgLTgwNSw3ICs5MDAsNyBAQAogCQkJCX0KIAkJCX0KIAkJCW5leHRNZXRob2Q6IGZvciAoaW50IGltZXRob2QgPSBzdGFydDsgaW1ldGhvZCA8PSBlbmQ7IGltZXRob2QrKykgewotCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwkJCQkJCQorCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gdGhpcy5tZXRob2RzW2ltZXRob2RdOwogCQkJCVR5cGVCaW5kaW5nW10gdG9NYXRjaCA9IG1ldGhvZC5wYXJhbWV0ZXJzOwogCQkJCWlmICh0b01hdGNoLmxlbmd0aCA9PSBhcmdDb3VudCkgewogCQkJCQlmb3IgKGludCBpYXJnID0gMDsgaWFyZyA8IGFyZ0NvdW50OyBpYXJnKyspCkBAIC04MTMsNyArOTA4LDcgQEAKIAkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOwogCQkJCQlyZXR1cm4gbWV0aG9kOwogCQkJCX0KLQkJCX0JCQkJCisJCQl9CiAJCX0KIAl9CiAKQEAgLTgzNSw3ICs5MzAsNyBAQAogCiAvL05PVEU6IHRoZSB0eXBlIG9mIGEgZmllbGQgb2YgYSBzb3VyY2UgdHlwZSBpcyByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIEZpZWxkQmluZGluZyBnZXRGaWVsZChjaGFyW10gZmllbGROYW1lLCBib29sZWFuIG5lZWRSZXNvbHZlKSB7Ci0JCisKIAlpZiAoKHRoaXMudGFnQml0cyAmIFRhZ0JpdHMuQXJlRmllbGRzQ29tcGxldGUpICE9IDApCiAJCXJldHVybiBSZWZlcmVuY2VCaW5kaW5nLmJpbmFyeVNlYXJjaChmaWVsZE5hbWUsIHRoaXMuZmllbGRzKTsKIApAQCAtODQ1LDcgKzk0MCw3IEBACiAJCWlmIChsZW5ndGggPiAxKQogCQkJUmVmZXJlbmNlQmluZGluZy5zb3J0RmllbGRzKHRoaXMuZmllbGRzLCAwLCBsZW5ndGgpOwogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVGaWVsZHNTb3J0ZWQ7Ci0JfQkJCisJfQogCS8vIGFsd2F5cyByZXNvbHZlIGFueXdheSBvbiBzb3VyY2UgdHlwZXMKIAlGaWVsZEJpbmRpbmcgZmllbGQgPSBSZWZlcmVuY2VCaW5kaW5nLmJpbmFyeVNlYXJjaChmaWVsZE5hbWUsIHRoaXMuZmllbGRzKTsKIAlpZiAoZmllbGQgIT0gbnVsbCkgewpAQCAtODg2LDcgKzk4MSw3IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kcywgc3RhcnQsIHJlc3VsdCA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGVsc2UgewotCQkJcmV0dXJuIEJpbmRpbmcuTk9fTUVUSE9EUzsJCQkKKwkJCXJldHVybiBCaW5kaW5nLk5PX01FVEhPRFM7CiAJCX0KIAl9CiAJLy8gbGF6aWx5IHNvcnQgbWV0aG9kcwpAQCAtODk2LDcgKzk5MSw3IEBACiAJCQlSZWZlcmVuY2VCaW5kaW5nLnNvcnRNZXRob2RzKHRoaXMubWV0aG9kcywgMCwgbGVuZ3RoKTsKIAkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuQXJlTWV0aG9kc1NvcnRlZDsKIAl9Ci0JTWV0aG9kQmluZGluZ1tdIHJlc3VsdDsJCisJTWV0aG9kQmluZGluZ1tdIHJlc3VsdDsKIAlsb25nIHJhbmdlOwogCWlmICgocmFuZ2UgPSBSZWZlcmVuY2VCaW5kaW5nLmJpbmFyeVNlYXJjaChzZWxlY3RvciwgdGhpcy5tZXRob2RzKSkgPj0gMCkgewogCQlpbnQgc3RhcnQgPSAoaW50KSByYW5nZSwgZW5kID0gKGludCkgKHJhbmdlID4+IDMyKTsKQEAgLTk1MSwxMyArMTA0NiwxMyBAQAogCQl3aGlsZSAoYWNjZXNzRmllbGRzLmhhc05leHQoKSkgewogCQkJZmllbGQgPSAoRmllbGRCaW5kaW5nKSBhY2Nlc3NGaWVsZHMubmV4dCgpOwogCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKFR5cGVDb25zdGFudHMuU1lOVEhFVElDX0VOQ0xPU0lOR19JTlNUQU5DRV9QUkVGSVgsIGZpZWxkLm5hbWUpCi0JCQkJJiYgZmllbGQudHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKHRhcmdldEVuY2xvc2luZ1R5cGUpICE9IG51bGwpCisJCQkJJiYgZmllbGQudHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKHRhcmdldEVuY2xvc2luZ1R5cGUpICE9IG51bGwpCiAJCQkJCXJldHVybiBmaWVsZDsKIAkJfQogCX0KIAlyZXR1cm4gbnVsbDsKIH0KLS8qIAorLyoKICAqIEFuc3dlciB0aGUgYnJpZGdlIG1ldGhvZCBhc3NvY2lhdGVkIGZvciBhbiAgaW5oZXJpdGVkIG1ldGhvZHMgb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgZXhpc3QKICAqLwogcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcgZ2V0U3ludGhldGljQnJpZGdlTWV0aG9kKE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kVG9CcmlkZ2UpIHsKQEAgLTk4OCw2ICsxMDgzLDE3IEBACiAJfQogfQogCisvLyBlbnN1cmUgdGhlIHJlY2VpdmVyIGtub3dzIGl0cyBoaWVyYXJjaHkgJiBmaWVsZHMvbWV0aG9kcyBzbyBzdGF0aWMgaW1wb3J0cyBjYW4gYmUgcmVzb2x2ZWQgY29ycmVjdGx5CisvLyBzZWUgYnVnIDIzMDAyNgordm9pZCBpbml0aWFsaXplRm9yU3RhdGljSW1wb3J0cygpIHsKKwlpZiAodGhpcy5zY29wZSA9PSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgaW5pdGlhbGl6ZWQKKworCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKQorCQl0aGlzLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisJdGhpcy5zY29wZS5idWlsZEZpZWxkcygpOworCXRoaXMuc2NvcGUuYnVpbGRNZXRob2RzKCk7Cit9CisKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIGEgdHlwZSBpcyBpZGVudGljYWwgdG8gYW5vdGhlciBvbmUsCiAgKiBvciBmb3IgZ2VuZXJpYyB0eXBlcywgdHJ1ZSBpZiBjb21wYXJlZCB0byBpdHMgcmF3IHR5cGUuCkBAIC05OTksMTMgKzExMDUsMTQgQEAKIAlzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgewogCiAJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQkJcmV0dXJuICgoV2lsZGNhcmRCaW5kaW5nKSBvdGhlclR5cGUpLmJvdW5kQ2hlY2sodGhpcyk7CiAKIAkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6Ci0JCQlpZiAoKG90aGVyVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgPT0gMCAmJiAoIXRoaXMuaXNNZW1iZXJUeXBlKCkgfHwgIW90aGVyVHlwZS5pc01lbWJlclR5cGUoKSkpIAorCQkJaWYgKChvdGhlclR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzRGlyZWN0V2lsZGNhcmQpID09IDAgJiYgKCFpc01lbWJlclR5cGUoKSB8fCAhb3RoZXJUeXBlLmlzTWVtYmVyVHlwZSgpKSkKIAkJCQlyZXR1cm4gZmFsc2U7IC8vIHNob3VsZCBoYXZlIGJlZW4gaWRlbnRpY2FsCiAJCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgb3RoZXJQYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBvdGhlclR5cGU7Ci0JCQlpZiAodGhpcyAhPSBvdGhlclBhcmFtVHlwZS5nZW5lcmljVHlwZSgpKSAKKwkJCWlmICh0aGlzICE9IG90aGVyUGFyYW1UeXBlLmdlbmVyaWNUeXBlKCkpCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJaWYgKCFpc1N0YXRpYygpKSB7IC8vIHN0YXRpYyBtZW1iZXIgdHlwZXMgZG8gbm90IGNvbXBhcmUgdGhlaXIgZW5jbG9zaW5nCiAgICAgICAgICAgICAJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBlbmNsb3NpbmdUeXBlKCk7CkBAIC0xMDE3LDEyICsxMTI0LDEyIEBACiAgICAgICAgICAgICAJCX0gZWxzZSB7CiAgICAgICAgICAgICAJCQlpZiAoIWVuY2xvc2luZy5pc0VxdWl2YWxlbnRUbyhvdGhlclBhcmFtVHlwZS5lbmNsb3NpbmdUeXBlKCkpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9CQkJCQorICAgICAgICAgICAgCX0KIAkJCX0KIAkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVWYXJpYWJsZXMgPT0gbnVsbCA/IDAgOiB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogCQkJVHlwZUJpbmRpbmdbXSBvdGhlckFyZ3VtZW50cyA9IG90aGVyUGFyYW1UeXBlLmFyZ3VtZW50czsKIAkJCWludCBvdGhlckxlbmd0aCA9IG90aGVyQXJndW1lbnRzID09IG51bGwgPyAwIDogb3RoZXJBcmd1bWVudHMubGVuZ3RoOwotCQkJaWYgKG90aGVyTGVuZ3RoICE9IGxlbmd0aCkgCisJCQlpZiAob3RoZXJMZW5ndGggIT0gbGVuZ3RoKQogCQkJCXJldHVybiBmYWxzZTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAJCQkJaWYgKCF0aGlzLnR5cGVWYXJpYWJsZXNbaV0uaXNUeXBlQXJndW1lbnRDb250YWluZWRCeShvdGhlckFyZ3VtZW50c1tpXSkpCkBAIC0xMDM3LDUzICsxMTQ0LDIyIEBACiBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyaWNUeXBlKCkgewogICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZXMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUzsKIH0KK3B1YmxpYyBib29sZWFuIGlzSGllcmFyY2h5Q29ubmVjdGVkKCkgeworCXJldHVybiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5FbmRIaWVyYXJjaHlDaGVjaykgIT0gMDsKK30KIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMoKSB7CiAJcmV0dXJuIHRoaXMubWVtYmVyVHlwZXM7CiB9Ci1wdWJsaWMgRmllbGRCaW5kaW5nIGdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBSZWZlcmVuY2VCaW5kaW5nIG5ld0RlY2xhcmluZ0NsYXNzKSB7Ci0JaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsKQotCQl0aGlzLnN5bnRoZXRpY3MgPSBuZXcgSGFzaE1hcFs0XTsKLQlpZiAodGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLlJFQ0VJVkVSX1RZUEVfRU1VTF0gPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLlJFQ0VJVkVSX1RZUEVfRU1VTF0gPSBuZXcgSGFzaE1hcCg1KTsKIAotCUhhc2h0YWJsZSBmaWVsZE1hcCA9IChIYXNodGFibGUpIHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5SRUNFSVZFUl9UWVBFX0VNVUxdLmdldCh0YXJnZXRGaWVsZCk7Ci0JaWYgKGZpZWxkTWFwID09IG51bGwpIHsKLQkJZmllbGRNYXAgPSBuZXcgSGFzaHRhYmxlKDUpOwotCQl0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuUkVDRUlWRVJfVFlQRV9FTVVMXS5wdXQodGFyZ2V0RmllbGQsIGZpZWxkTWFwKTsKLQl9Ci0JRmllbGRCaW5kaW5nIHVwZGF0ZWRGaWVsZCA9IChGaWVsZEJpbmRpbmcpIGZpZWxkTWFwLmdldChuZXdEZWNsYXJpbmdDbGFzcyk7Ci0JaWYgKHVwZGF0ZWRGaWVsZCA9PSBudWxsKXsKLQkJdXBkYXRlZEZpZWxkID0gbmV3IEZpZWxkQmluZGluZyh0YXJnZXRGaWVsZCwgbmV3RGVjbGFyaW5nQ2xhc3MpOwotCQlmaWVsZE1hcC5wdXQobmV3RGVjbGFyaW5nQ2xhc3MsIHVwZGF0ZWRGaWVsZCk7Ci0JfQotCXJldHVybiB1cGRhdGVkRmllbGQ7Ci19Ci1wdWJsaWMgTWV0aG9kQmluZGluZyBnZXRVcGRhdGVkTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZyBuZXdEZWNsYXJpbmdDbGFzcykgewotCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkKLQkJdGhpcy5zeW50aGV0aWNzID0gbmV3IEhhc2hNYXBbNF07Ci0JaWYgKHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5SRUNFSVZFUl9UWVBFX0VNVUxdID09IG51bGwpCi0JCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5SRUNFSVZFUl9UWVBFX0VNVUxdID0gbmV3IEhhc2hNYXAoNSk7Ci0KLQlIYXNodGFibGUgbWV0aG9kTWFwID0gKEhhc2h0YWJsZSkgdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLlJFQ0VJVkVSX1RZUEVfRU1VTF0uZ2V0KHRhcmdldE1ldGhvZCk7Ci0JaWYgKG1ldGhvZE1hcCA9PSBudWxsKSB7Ci0JCW1ldGhvZE1hcCA9IG5ldyBIYXNodGFibGUoNSk7Ci0JCXRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5SRUNFSVZFUl9UWVBFX0VNVUxdLnB1dCh0YXJnZXRNZXRob2QsIG1ldGhvZE1hcCk7Ci0JfQotCU1ldGhvZEJpbmRpbmcgdXBkYXRlZE1ldGhvZCA9IChNZXRob2RCaW5kaW5nKSBtZXRob2RNYXAuZ2V0KG5ld0RlY2xhcmluZ0NsYXNzKTsKLQlpZiAodXBkYXRlZE1ldGhvZCA9PSBudWxsKXsKLQkJdXBkYXRlZE1ldGhvZCA9IG5ldyBNZXRob2RCaW5kaW5nKHRhcmdldE1ldGhvZCwgbmV3RGVjbGFyaW5nQ2xhc3MpOwotCQltZXRob2RNYXAucHV0KG5ld0RlY2xhcmluZ0NsYXNzLCB1cGRhdGVkTWV0aG9kKTsKLQl9Ci0JcmV0dXJuIHVwZGF0ZWRNZXRob2Q7Ci19CiBwdWJsaWMgYm9vbGVhbiBoYXNNZW1iZXJUeXBlcygpIHsKICAgICByZXR1cm4gdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGggPiAwOwogfQorCiAvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIHNvdXJjZSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAogcHVibGljIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzKCkgewogCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGUpICE9IDApCiAJCXJldHVybiB0aGlzLm1ldGhvZHM7Ci0JCisKIAkvLyBsYXppbHkgc29ydCBtZXRob2RzCiAJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkFyZU1ldGhvZHNTb3J0ZWQpID09IDApIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMubWV0aG9kcy5sZW5ndGg7CkBAIC0xMTAwLDE3ICsxMTc2LDIwIEBACiAJCQkJLy8gZG8gbm90IGFsdGVyIG9yaWdpbmFsIG1ldGhvZCBhcnJheSB1bnRpbCByZXNvbHV0aW9uIGlzIG92ZXIsIGR1ZSB0byByZWVudHJhbmNlICgxNDMyNTkpCiAJCQkJaWYgKHJlc29sdmVkTWV0aG9kcyA9PSB0aGlzLm1ldGhvZHMpIHsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm1ldGhvZHMsIDAsIHJlc29sdmVkTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQkJcmVzb2x2ZWRNZXRob2RzW2ldID0gbnVsbDsgLy8gdW5hYmxlIHRvIHJlc29sdmUgcGFyYW1ldGVycwogCQkJCWZhaWxlZCsrOwogCQkJfQogCQl9CiAKIAkJLy8gZmluZCAmIHJlcG9ydCBjb2xsaXNpb24gY2FzZXMKLQkJYm9vbGVhbiBjb21wbHlUbzE1ID0gdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQlib29sZWFuIGNvbXBseVRvMTVPckFib3ZlID0gdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQlib29sZWFuIGNvbXBsaWFuY2UxNiA9IHRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuY29tcGxpYW5jZUxldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzY7CisJCQogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpbnQgc2V2ZXJpdHkgPSBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcjsKIAkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gcmVzb2x2ZWRNZXRob2RzW2ldOwotCQkJaWYgKG1ldGhvZCA9PSBudWxsKSAKKwkJCWlmIChtZXRob2QgPT0gbnVsbCkKIAkJCQljb250aW51ZTsKIAkJCWNoYXJbXSBzZWxlY3RvciA9IG1ldGhvZC5zZWxlY3RvcjsKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG51bGw7CkBAIC0xMTE4LDEwNyArMTE5NywxMjggQEAKIAkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZDIgPSByZXNvbHZlZE1ldGhvZHNbal07CiAJCQkJaWYgKG1ldGhvZDIgPT0gbnVsbCkKIAkJCQkJY29udGludWUgbmV4dFNpYmxpbmc7Ci0JCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgbWV0aG9kMi5zZWxlY3RvcikpIAorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIG1ldGhvZDIuc2VsZWN0b3IpKQogCQkJCQlicmVhayBuZXh0U2libGluZzsgLy8gbWV0aG9kcyB3aXRoIHNhbWUgc2VsZWN0b3IgYXJlIGNvbnRpZ3VvdXMKIAotCQkJCWlmIChjb21wbHlUbzE1ICYmIG1ldGhvZC5yZXR1cm5UeXBlICE9IG51bGwgJiYgbWV0aG9kMi5yZXR1cm5UeXBlICE9IG51bGwpIHsKLQkJCQkJLy8gOC40LjIsIGZvciBjb2xsaXNpb24gdG8gYmUgZGV0ZWN0ZWQgYmV0d2VlbiBtMSBhbmQgbTI6Ci0JCQkJCS8vIHNpZ25hdHVyZShtMSkgPT0gc2lnbmF0dXJlKG0yKSBpLmUuIHNhbWUgYXJpdHksIHNhbWUgdHlwZSBwYXJhbWV0ZXIgY291bnQsIGNhbiBiZSBzdWJzdGl0dXRlZAotCQkJCQkvLyBzaWduYXR1cmUobTEpID09IGVyYXN1cmUoc2lnbmF0dXJlKG0yKSkgb3IgZXJhc3VyZShzaWduYXR1cmUobTEpKSA9PSBzaWduYXR1cmUobTIpCi0JCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1zMSA9IG1ldGhvZC5wYXJhbWV0ZXJzOwotCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtczIgPSBtZXRob2QyLnBhcmFtZXRlcnM7Ci0JCQkJCWludCBwTGVuZ3RoID0gcGFyYW1zMS5sZW5ndGg7Ci0JCQkJCWlmIChwTGVuZ3RoICE9IHBhcmFtczIubGVuZ3RoKQotCQkJCQkJY29udGludWUgbmV4dFNpYmxpbmc7Ci0KLQkJCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHZhcnMgPSBtZXRob2QudHlwZVZhcmlhYmxlczsKLQkJCQkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHZhcnMyID0gbWV0aG9kMi50eXBlVmFyaWFibGVzOwotCQkJCQlib29sZWFuIGVxdWFsVHlwZVZhcnMgPSB2YXJzID09IHZhcnMyOwotCQkJCQlNZXRob2RCaW5kaW5nIHN1Yk1ldGhvZCA9IG1ldGhvZDI7Ci0JCQkJCWlmICghZXF1YWxUeXBlVmFycykgewotCQkJCQkJTWV0aG9kQmluZGluZyB0ZW1wID0gbWV0aG9kLmNvbXB1dGVTdWJzdGl0dXRlZE1ldGhvZChtZXRob2QyLCB0aGlzLnNjb3BlLmVudmlyb25tZW50KCkpOwotCQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQkJCWVxdWFsVHlwZVZhcnMgPSB0cnVlOwotCQkJCQkJCXN1Yk1ldGhvZCA9IHRlbXA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBlcXVhbFBhcmFtcyA9IG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwoc3ViTWV0aG9kKTsKLQkJCQkJaWYgKGVxdWFsUGFyYW1zICYmIGVxdWFsVHlwZVZhcnMpIHsKLQkJCQkJCS8vIGR1cGxpY2F0ZXMgcmVnYXJkbGVzcyBvZiByZXR1cm4gdHlwZXMKLQkJCQkJfSBlbHNlIGlmIChtZXRob2QucmV0dXJuVHlwZS5lcmFzdXJlKCkgPT0gc3ViTWV0aG9kLnJldHVyblR5cGUuZXJhc3VyZSgpICYmIChlcXVhbFBhcmFtcyB8fCBtZXRob2QuYXJlUGFyYW1ldGVyRXJhc3VyZXNFcXVhbChtZXRob2QyKSkpIHsKLQkJCQkJCS8vIG5hbWUgY2xhc2ggZm9yIHN1cmUgaWYgbm90IGR1cGxpY2F0ZXMsIHJlcG9ydCBhcyBkdXBsaWNhdGVzCi0JCQkJCX0gZWxzZSBpZiAoIWVxdWFsVHlwZVZhcnMgJiYgdmFycyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTICYmIHZhcnMyICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKLQkJCQkJCS8vIHR5cGUgdmFyaWFibGVzIGFyZSBkaWZmZXJlbnQgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWV0aG9kcwotCQkJCQkJY29udGludWUgbmV4dFNpYmxpbmc7Ci0JCQkJCX0gZWxzZSBpZiAocExlbmd0aCA+IDApIHsKLQkJCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXJhc3VyZSBvZiBlaXRoZXIgbWV0aG9kIGlzIGVxdWFsIHRvIHRoZSBvdGhlcgotCQkJCQkJaW50IGluZGV4ID0gcExlbmd0aDsKLQkJCQkJCWZvciAoOyAtLWluZGV4ID49IDA7KSB7Ci0JCQkJCQkJaWYgKHBhcmFtczFbaW5kZXhdICE9IHBhcmFtczJbaW5kZXhdLmVyYXN1cmUoKSkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKHBhcmFtczFbaW5kZXhdID09IHBhcmFtczJbaW5kZXhdKSB7Ci0JCQkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBwYXJhbXMxW2luZGV4XS5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQkJCQkJCQlpZiAodHlwZSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nICYmIHR5cGUudHlwZVZhcmlhYmxlcygpICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKLQkJCQkJCQkJCWluZGV4ID0gcExlbmd0aDsgLy8gaGFuZGxlIGNvbXBhcmluZyBpZGVudGljYWwgc291cmNlIHR5cGVzIGxpa2UgWDxUPi4uLiBpdHMgZXJhc3VyZSBpcyBpdHNlbGYgQlVUIHdlIG5lZWQgdG8gYW5zd2VyIGZhbHNlCi0JCQkJCQkJCQlicmVhazsKKwkJCQlpZiAoY29tcGx5VG8xNU9yQWJvdmUpIHsKKwkJCQkJaWYgKG1ldGhvZC5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG1ldGhvZDIpKSB7CisJCQkJCQkvLyB3ZSBub3cgaWdub3JlIHJldHVybiB0eXBlcyBpbiAxLjcgd2hlbiBkZXRlY3RpbmcgZHVwbGljYXRlcywganVzdCBhcyB3ZSBkaWQgYmVmb3JlIDEuNSAKKwkJCQkJCS8vIE9ubHkgaW4gMS42LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBldmVuIHJldHVybiB0eXBlcyBhcmUgZGlmZmVyZW50CisJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NzE5CisJCQkJCQlpZiAoY29tcGxpYW5jZTE2ICYmIG1ldGhvZC5yZXR1cm5UeXBlICE9IG51bGwgJiYgbWV0aG9kMi5yZXR1cm5UeXBlICE9IG51bGwpIHsKKwkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUuZXJhc3VyZSgpICE9IG1ldGhvZDIucmV0dXJuVHlwZS5lcmFzdXJlKCkpIHsKKwkJCQkJCQkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBlcmFzdXJlIG9mIGVpdGhlciBtZXRob2QgaXMgZXF1YWwgdG8gdGhlIG90aGVyCisJCQkJCQkJCS8vIGlmIG5vdCwgdGhlbiBjaGFuZ2Ugc2V2ZXJpdHkgdG8gV0FSTklORworCQkJCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtczEgPSBtZXRob2QucGFyYW1ldGVyczsKKwkJCQkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbXMyID0gbWV0aG9kMi5wYXJhbWV0ZXJzOworCQkJCQkJCQlpbnQgcExlbmd0aCA9IHBhcmFtczEubGVuZ3RoOworCQkJCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdmFycyA9IG1ldGhvZC50eXBlVmFyaWFibGVzOworCQkJCQkJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdmFyczIgPSBtZXRob2QyLnR5cGVWYXJpYWJsZXM7CisJCQkJCQkJCWJvb2xlYW4gZXF1YWxUeXBlVmFycyA9IHZhcnMgPT0gdmFyczI7CisJCQkJCQkJCU1ldGhvZEJpbmRpbmcgc3ViTWV0aG9kID0gbWV0aG9kMjsKKwkJCQkJCQkJaWYgKCFlcXVhbFR5cGVWYXJzKSB7CisJCQkJCQkJCQlNZXRob2RCaW5kaW5nIHRlbXAgPSBtZXRob2QuY29tcHV0ZVN1YnN0aXR1dGVkTWV0aG9kKG1ldGhvZDIsIHRoaXMuc2NvcGUuZW52aXJvbm1lbnQoKSk7CisJCQkJCQkJCQlpZiAodGVtcCAhPSBudWxsKSB7CisJCQkJCQkJCQkJZXF1YWxUeXBlVmFycyA9IHRydWU7CisJCQkJCQkJCQkJc3ViTWV0aG9kID0gdGVtcDsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQorCQkJCQkJCQlib29sZWFuIGVxdWFsUGFyYW1zID0gbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChzdWJNZXRob2QpOworCQkJCQkJCQlpZiAoZXF1YWxQYXJhbXMgJiYgZXF1YWxUeXBlVmFycykgeworCQkJCQkJCQkJLy8gZHVwbGljYXRlcyByZWdhcmRsZXNzIG9mIHJldHVybiB0eXBlcworCQkJCQkJCQl9IGVsc2UgaWYgKHZhcnMgIT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUyAmJiB2YXJzMiAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CisJCQkJCQkJCQkvLyBib3RoIGhhdmUgdHlwZSBhcmd1bWVudHMuIEVyYXN1cmUgb2Ygc2lnbmF0dXJlIG9mIG9uZSBjYW5ub3QgYmUgZXF1YWwgdG8gc2lnbmF0dXJlIG9mIG90aGVyCisJCQkJCQkJCQlzZXZlcml0eSA9IFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmc7CisJCQkJCQkJCX0gZWxzZSBpZiAocExlbmd0aCA+IDApIHsKKwkJCQkJCQkJCWludCBpbmRleCA9IHBMZW5ndGg7CisJCQkJCQkJCQkvLyBpcyBlcmFzdXJlIG9mIHNpZ25hdHVyZSBvZiBtMiBzYW1lIGFzIHNpZ25hdHVyZSBvZiBtMT8KKwkJCQkJCQkJCWZvciAoOyAtLWluZGV4ID49IDA7KSB7CisJCQkJCQkJCQkJaWYgKHBhcmFtczFbaW5kZXhdICE9IHBhcmFtczJbaW5kZXhdLmVyYXN1cmUoKSkKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJaWYgKHBhcmFtczFbaW5kZXhdID09IHBhcmFtczJbaW5kZXhdKSB7CisJCQkJCQkJCQkJCVR5cGVCaW5kaW5nIHR5cGUgPSBwYXJhbXMxW2luZGV4XS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQkJCQkJCQkJCQlpZiAodHlwZSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nICYmIHR5cGUudHlwZVZhcmlhYmxlcygpICE9IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKKwkJCQkJCQkJCQkJCWluZGV4ID0gcExlbmd0aDsgLy8gaGFuZGxlIGNvbXBhcmluZyBpZGVudGljYWwgc291cmNlIHR5cGVzIGxpa2UgWDxUPi4uLiBpdHMgZXJhc3VyZSBpcyBpdHNlbGYgQlVUIHdlIG5lZWQgdG8gYW5zd2VyIGZhbHNlCisJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgcExlbmd0aCkgeworCQkJCQkJCQkJCS8vIGlzIGVyYXN1cmUgb2Ygc2lnbmF0dXJlIG9mIG0xIHNhbWUgYXMgc2lnbmF0dXJlIG9mIG0yPworCQkJCQkJCQkJCWZvciAoaW5kZXggPSBwTGVuZ3RoOyAtLWluZGV4ID49IDA7KQorCQkJCQkJCQkJCQlpZiAocGFyYW1zMVtpbmRleF0uZXJhc3VyZSgpICE9IHBhcmFtczJbaW5kZXhdKQorCQkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoaW5kZXggPj0gMCkgeworCQkJCQkJCQkJCS8vIGVyYXN1cmUgb2YgbmVpdGhlciBpcyBlcXVhbCB0byBzaWduYXR1cmUgb2Ygb3RoZXIKKwkJCQkJCQkJCQlzZXZlcml0eSA9IFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmc7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSBpZiAocExlbmd0aCAhPSAwKXsKKwkJCQkJCQkJCXNldmVyaXR5ID0gUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZzsKKwkJCQkJCQkJfSAvLyBwTGVuZ3RoID0gMCBhdXRvbWF0aWNhbGx5IG1ha2VzIGVyYXN1cmUgb2YgYXJndW1lbnRzIG9uZSBlcXVhbCB0byBhcmd1bWVudHMgb2Ygb3RoZXIuCiAJCQkJCQkJfQorCQkJCQkJCS8vIGVsc2UgcmV0dXJuIHR5cGVzIGFsc28gZXF1YWwuIEFsbCBjb25kaXRpb25zIHNhdGlzZmllZAorCQkJCQkJCS8vIHRvIGdpdmUgZXJyb3IgaW4gMS42IGNvbXBsaWFuY2UgYXMgd2VsbC4KIAkJCQkJCX0KLQkJCQkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgcExlbmd0aCkgewotCQkJCQkJCWZvciAoaW5kZXggPSBwTGVuZ3RoOyAtLWluZGV4ID49IDA7KQotCQkJCQkJCQlpZiAocGFyYW1zMVtpbmRleF0uZXJhc3VyZSgpICE9IHBhcmFtczJbaW5kZXhdKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPj0gMCkKLQkJCQkJCQljb250aW51ZSBuZXh0U2libGluZzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbnRpbnVlIG5leHRTaWJsaW5nOwogCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2QyKSkgeyAvLyBwcmlvciB0byAxLjUsIHBhcmFtZXRlciBpZGVudGl0eSBtZWFudCBhIGNvbGxpc2lvbiBjYXNlCisJCQkJfSBlbHNlIGlmICghbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2QyKSkgeworCQkJCQkvLyBwcmlvciB0byAxLjUsIHBhcmFtZXRlcnMgaWRlbnRpY2FsIG1lYW50IGEgY29sbGlzaW9uIGNhc2UKIAkJCQkJY29udGludWUgbmV4dFNpYmxpbmc7CiAJCQkJfQorCQkJCS8vIG90aGVyd2lzZSBkdXBsaWNhdGVzIC8gbmFtZSBjbGFzaAogCQkJCWJvb2xlYW4gaXNFbnVtU3BlY2lhbE1ldGhvZCA9IGlzRW51bSgpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvcixUeXBlQ29uc3RhbnRzLlZBTFVFT0YpIHx8IENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLFR5cGVDb25zdGFudHMuVkFMVUVTKSk7CiAJCQkJLy8gcmVwb3J0IGR1cGxpY2F0ZQorCQkJCWJvb2xlYW4gcmVtb3ZlTWV0aG9kMiA9IChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcikgPyB0cnVlIDogZmFsc2U7IC8vIGRvIG5vdCByZW1vdmUgaWYgaW4gMS42IGFuZCBqdXN0IGEgd2FybmluZyBnaXZlbgogCQkJCWlmIChtZXRob2REZWNsID09IG51bGwpIHsKIAkJCQkJbWV0aG9kRGVjbCA9IG1ldGhvZC5zb3VyY2VNZXRob2QoKTsgLy8gY2Fubm90IGJlIHJldHJpZXZlZCBhZnRlciBiaW5kaW5nIGlzIGxvc3QgJiBtYXkgc3RpbGwgYmUgbnVsbCBpZiBtZXRob2QgaXMgc3BlY2lhbAogCQkJCQlpZiAobWV0aG9kRGVjbCAhPSBudWxsICYmIG1ldGhvZERlY2wuYmluZGluZyAhPSBudWxsKSB7IC8vIGVuc3VyZSBpdHMgYSB2YWxpZCB1c2VyIGRlZmluZWQgbWV0aG9kCisJCQkJCQlib29sZWFuIHJlbW92ZU1ldGhvZCA9IG1ldGhvZC5yZXR1cm5UeXBlID09IG51bGwgJiYgbWV0aG9kMi5yZXR1cm5UeXBlICE9IG51bGw7CiAJCQkJCQlpZiAoaXNFbnVtU3BlY2lhbE1ldGhvZCkgewogCQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRW51bVNwZWNpYWxNZXRob2QodGhpcywgbWV0aG9kRGVjbCk7CisJCQkJCQkJLy8gcmVtb3ZlIHVzZXIgZGVmaW5lZCBtZXRob2RzICYga2VlcCB0aGUgc3ludGhldGljCisJCQkJCQkJcmVtb3ZlTWV0aG9kID0gdHJ1ZTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNZXRob2RJblR5cGUodGhpcywgbWV0aG9kRGVjbCk7CisJCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNZXRob2RJblR5cGUodGhpcywgbWV0aG9kRGVjbCwgbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2QyKSwgc2V2ZXJpdHkpOwogCQkJCQkJfQotCQkJCQkJbWV0aG9kRGVjbC5iaW5kaW5nID0gbnVsbDsKLQkJCQkJCS8vIGRvIG5vdCBhbHRlciBvcmlnaW5hbCBtZXRob2QgYXJyYXkgdW50aWwgcmVzb2x1dGlvbiBpcyBvdmVyLCBkdWUgdG8gcmVlbnRyYW5jZSAoMTQzMjU5KQotCQkJCQkJaWYgKHJlc29sdmVkTWV0aG9kcyA9PSB0aGlzLm1ldGhvZHMpIHsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kcywgMCwgcmVzb2x2ZWRNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJcmVzb2x2ZWRNZXRob2RzW2ldID0gbnVsbDsKLQkJCQkJCWZhaWxlZCsrOworCQkJCQkJaWYgKHJlbW92ZU1ldGhvZCkgeworCQkJCQkJCXJlbW92ZU1ldGhvZDIgPSBmYWxzZTsKKwkJCQkJCQltZXRob2REZWNsLmJpbmRpbmcgPSBudWxsOworCQkJCQkJCS8vIGRvIG5vdCBhbHRlciBvcmlnaW5hbCBtZXRob2QgYXJyYXkgdW50aWwgcmVzb2x1dGlvbiBpcyBvdmVyLCBkdWUgdG8gcmVlbnRyYW5jZSAoMTQzMjU5KQorCQkJCQkJCWlmIChyZXNvbHZlZE1ldGhvZHMgPT0gdGhpcy5tZXRob2RzKQorCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kcywgMCwgcmVzb2x2ZWRNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCQlyZXNvbHZlZE1ldGhvZHNbaV0gPSBudWxsOworCQkJCQkJCWZhaWxlZCsrOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMkRlY2wgPSBtZXRob2QyLnNvdXJjZU1ldGhvZCgpOwogCQkJCWlmIChtZXRob2QyRGVjbCAhPSBudWxsICYmIG1ldGhvZDJEZWNsLmJpbmRpbmcgIT0gbnVsbCkgeyAvLyBlbnN1cmUgaXRzIGEgdmFsaWQgdXNlciBkZWZpbmVkIG1ldGhvZAogCQkJCQlpZiAoaXNFbnVtU3BlY2lhbE1ldGhvZCkgewogCQkJCQkJdGhpcy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVFbnVtU3BlY2lhbE1ldGhvZCh0aGlzLCBtZXRob2QyRGVjbCk7CisJCQkJCQlyZW1vdmVNZXRob2QyID0gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTWV0aG9kSW5UeXBlKHRoaXMsIG1ldGhvZDJEZWNsKTsKKwkJCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTWV0aG9kSW5UeXBlKHRoaXMsIG1ldGhvZDJEZWNsLCBtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZDIpLCBzZXZlcml0eSk7CiAJCQkJCX0KLQkJCQkJbWV0aG9kMkRlY2wuYmluZGluZyA9IG51bGw7Ci0JCQkJCS8vIGRvIG5vdCBhbHRlciBvcmlnaW5hbCBtZXRob2QgYXJyYXkgdW50aWwgcmVzb2x1dGlvbiBpcyBvdmVyLCBkdWUgdG8gcmVlbnRyYW5jZSAoMTQzMjU5KQotCQkJCQlpZiAocmVzb2x2ZWRNZXRob2RzID09IHRoaXMubWV0aG9kcykgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm1ldGhvZHMsIDAsIHJlc29sdmVkTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCQkJCX0JCQkJCQkJCi0JCQkJCXJlc29sdmVkTWV0aG9kc1tqXSA9IG51bGw7Ci0JCQkJCWZhaWxlZCsrOworCQkJCQlpZiAocmVtb3ZlTWV0aG9kMikgeworCQkJCQkJbWV0aG9kMkRlY2wuYmluZGluZyA9IG51bGw7CisJCQkJCQkvLyBkbyBub3QgYWx0ZXIgb3JpZ2luYWwgbWV0aG9kIGFycmF5IHVudGlsIHJlc29sdXRpb24gaXMgb3ZlciwgZHVlIHRvIHJlZW50cmFuY2UgKDE0MzI1OSkKKwkJCQkJCWlmIChyZXNvbHZlZE1ldGhvZHMgPT0gdGhpcy5tZXRob2RzKQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5tZXRob2RzLCAwLCByZXNvbHZlZE1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGhdLCAwLCBsZW5ndGgpOworCQkJCQkJcmVzb2x2ZWRNZXRob2RzW2pdID0gbnVsbDsKKwkJCQkJCWZhaWxlZCsrOworCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaWYgKG1ldGhvZC5yZXR1cm5UeXBlID09IG51bGwgJiYgbWV0aG9kRGVjbCA9PSBudWxsKSB7IC8vIGZvcmdldCBtZXRob2Qgd2l0aCBpbnZhbGlkIHJldHVybiB0eXBlLi4uIHdhcyBrZXB0IHRvIGRldGVjdCBwb3NzaWJsZSBjb2xsaXNpb25zCisJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gbnVsbCAmJiByZXNvbHZlZE1ldGhvZHNbaV0gIT0gbnVsbCkgeyAvLyBmb3JnZXQgbWV0aG9kIHdpdGggaW52YWxpZCByZXR1cm4gdHlwZS4uLiB3YXMga2VwdCB0byBkZXRlY3QgcG9zc2libGUgY29sbGlzaW9ucwogCQkJCW1ldGhvZERlY2wgPSBtZXRob2Quc291cmNlTWV0aG9kKCk7Ci0JCQkJaWYgKG1ldGhvZERlY2wgIT0gbnVsbCkgeworCQkJCWlmIChtZXRob2REZWNsICE9IG51bGwpCiAJCQkJCW1ldGhvZERlY2wuYmluZGluZyA9IG51bGw7Ci0JCQkJfQogCQkJCS8vIGRvIG5vdCBhbHRlciBvcmlnaW5hbCBtZXRob2QgYXJyYXkgdW50aWwgcmVzb2x1dGlvbiBpcyBvdmVyLCBkdWUgdG8gcmVlbnRyYW5jZSAoMTQzMjU5KQotCQkJCWlmIChyZXNvbHZlZE1ldGhvZHMgPT0gdGhpcy5tZXRob2RzKSB7CisJCQkJaWYgKHJlc29sdmVkTWV0aG9kcyA9PSB0aGlzLm1ldGhvZHMpCiAJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5tZXRob2RzLCAwLCByZXNvbHZlZE1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tsZW5ndGhdLCAwLCBsZW5ndGgpOwotCQkJCX0JCQkJCQkKIAkJCQlyZXNvbHZlZE1ldGhvZHNbaV0gPSBudWxsOwogCQkJCWZhaWxlZCsrOwogCQkJfQpAQCAtMTI0MCwxMCArMTM0MCwxMCBAQAogCQkvLyBoYW5kbGUgZm9yd2FyZCByZWZlcmVuY2VzIHRvIHBvdGVudGlhbCBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMKIAkJYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOwogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5BcmVNZXRob2RzQ29tcGxldGU7Ci0JfQkJCisJfQogCXJldHVybiB0aGlzLm1ldGhvZHM7CiB9Ci1wcml2YXRlIEZpZWxkQmluZGluZyByZXNvbHZlVHlwZUZvcihGaWVsZEJpbmRpbmcgZmllbGQpIHsKK3B1YmxpYyBGaWVsZEJpbmRpbmcgcmVzb2x2ZVR5cGVGb3IoRmllbGRCaW5kaW5nIGZpZWxkKSB7CiAJaWYgKChmaWVsZC5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQpID09IDApCiAJCXJldHVybiBmaWVsZDsKIApAQCAtMTI1MiwyNCArMTM1MiwyNSBAQAogCQkJZmllbGQubW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkOwogCX0KIAlpZiAoaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhZmllbGQuaXNEZXByZWNhdGVkKCkpCi0JCWZpZWxkLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5OwkKKwkJZmllbGQubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CiAJaWYgKGhhc1Jlc3RyaWN0ZWRBY2Nlc3MoKSkKIAkJZmllbGQubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjUmVzdHJpY3RlZEFjY2VzczsKIAlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNscyA9IHRoaXMuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5maWVsZHM7Ci0JZm9yIChpbnQgZiA9IDAsIGxlbmd0aCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBmIDwgbGVuZ3RoOyBmKyspIHsKKwlpbnQgbGVuZ3RoID0gZmllbGREZWNscyA9PSBudWxsID8gMCA6IGZpZWxkRGVjbHMubGVuZ3RoOworCWZvciAoaW50IGYgPSAwOyBmIDwgbGVuZ3RoOyBmKyspIHsKIAkJaWYgKGZpZWxkRGVjbHNbZl0uYmluZGluZyAhPSBmaWVsZCkKIAkJCWNvbnRpbnVlOwogCi0JCQlNZXRob2RTY29wZSBpbml0aWFsaXphdGlvblNjb3BlID0gZmllbGQuaXNTdGF0aWMoKSAKLQkJCQk/IHRoaXMuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlIAorCQkJTWV0aG9kU2NvcGUgaW5pdGlhbGl6YXRpb25TY29wZSA9IGZpZWxkLmlzU3RhdGljKCkKKwkJCQk/IHRoaXMuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlCiAJCQkJOiB0aGlzLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuaW5pdGlhbGl6ZXJTY29wZTsKIAkJCUZpZWxkQmluZGluZyBwcmV2aW91c0ZpZWxkID0gaW5pdGlhbGl6YXRpb25TY29wZS5pbml0aWFsaXplZEZpZWxkOwogCQkJdHJ5IHsKIAkJCQlpbml0aWFsaXphdGlvblNjb3BlLmluaXRpYWxpemVkRmllbGQgPSBmaWVsZDsKIAkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IGZpZWxkRGVjbHNbZl07Ci0JCQkJVHlwZUJpbmRpbmcgZmllbGRUeXBlID0gCisJCQkJVHlwZUJpbmRpbmcgZmllbGRUeXBlID0KIAkJCQkJZmllbGREZWNsLmdldEtpbmQoKSA9PSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVAotCQkJCQkJPyBpbml0aWFsaXphdGlvblNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0aGlzKSAvLyBlbnVtIGNvbnN0YW50IGlzIGltcGxpY2l0bHkgb2YgZGVjbGFyaW5nIGVudW0gdHlwZQorCQkJCQkJPyBpbml0aWFsaXphdGlvblNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZSh0aGlzLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKSAvLyBlbnVtIGNvbnN0YW50IGlzIGltcGxpY2l0bHkgb2YgZGVjbGFyaW5nIGVudW0gdHlwZQogCQkJCQkJOiBmaWVsZERlY2wudHlwZS5yZXNvbHZlVHlwZShpbml0aWFsaXphdGlvblNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKIAkJCQlmaWVsZC50eXBlID0gZmllbGRUeXBlOwogCQkJCWZpZWxkLm1vZGlmaWVycyAmPSB+RXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NVbnJlc29sdmVkOwpAQCAtMTI4NywxMCArMTM4OCwxMyBAQAogCQkJCQlmaWVsZERlY2wuYmluZGluZyA9IG51bGw7CiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KKwkJCQlpZiAoKGZpZWxkVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQlmaWVsZC50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQkJfQogCQkJCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gZmllbGRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7CiAJCQkJaWYgKGxlYWZUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyAmJiAoKChSZWZlcmVuY2VCaW5kaW5nKWxlYWZUeXBlKS5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApIHsKIAkJCQkJZmllbGQubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZTsKLQkJCQl9CQkJCQorCQkJCX0KIAkJCX0gZmluYWxseSB7CiAJCQkgICAgaW5pdGlhbGl6YXRpb25TY29wZS5pbml0aWFsaXplZEZpZWxkID0gcHJldmlvdXNGaWVsZDsKIAkJCX0KQEAgLTEzMTQsNiArMTQxOCw3IEBACiAJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kLnNvdXJjZU1ldGhvZCgpOwogCWlmIChtZXRob2REZWNsID09IG51bGwpIHJldHVybiBudWxsOyAvLyBtZXRob2QgY291bGQgbm90IGJlIHJlc29sdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbgogCisKIAlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2REZWNsLnR5cGVQYXJhbWV0ZXJzKCk7CiAJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJbWV0aG9kRGVjbC5zY29wZS5jb25uZWN0VHlwZVZhcmlhYmxlcyh0eXBlUGFyYW1ldGVycywgdHJ1ZSk7CkBAIC0xMzM1LDE4ICsxNDQwLDIyIEBACiAJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkUGFyYW1ldGVyaXplZEV4Y2VwdGlvblR5cGUocmVzb2x2ZWRFeGNlcHRpb25UeXBlLCBleGNlcHRpb25UeXBlc1tpXSk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAocmVzb2x2ZWRFeGNlcHRpb25UeXBlLmZpbmRTdXBlclR5cGVFcmFzaW5nVG8oVHlwZUlkcy5UX0phdmFMYW5nVGhyb3dhYmxlLCB0cnVlKSA9PSBudWxsKSB7Ci0JCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RUaHJvd1R5cGUoZXhjZXB0aW9uVHlwZXNbaV0sIHJlc29sdmVkRXhjZXB0aW9uVHlwZSk7Ci0JCQkJY29udGludWU7CisJCQlpZiAocmVzb2x2ZWRFeGNlcHRpb25UeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFMYW5nVGhyb3dhYmxlLCB0cnVlKSA9PSBudWxsKSB7CisJCQkJaWYgKHJlc29sdmVkRXhjZXB0aW9uVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCW1ldGhvZERlY2wuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90VGhyb3dUeXBlKGV4Y2VwdGlvblR5cGVzW2ldLCByZXNvbHZlZEV4Y2VwdGlvblR5cGUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAJCQl9Ci0JCSAgICBpZiAoKHJlc29sdmVkRXhjZXB0aW9uVHlwZS5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApCi0JCQkJbWV0aG9kLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7CisJCQlpZiAoKHJlc29sdmVkRXhjZXB0aW9uVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCW1ldGhvZC50YWdCaXRzIHw9IFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGU7CisJCQl9CisJCQltZXRob2QubW9kaWZpZXJzIHw9IChyZXNvbHZlZEV4Y2VwdGlvblR5cGUubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlKTsKIAkJCW1ldGhvZC50aHJvd25FeGNlcHRpb25zW2NvdW50KytdID0gcmVzb2x2ZWRFeGNlcHRpb25UeXBlOwogCQl9CiAJCWlmIChjb3VudCA8IHNpemUpCiAJCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZC50aHJvd25FeGNlcHRpb25zLCAwLCBtZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOwogCX0KLQorCWZpbmFsIGJvb2xlYW4gcmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zID0gdGhpcy5zY29wZS5jb21waWxlck9wdGlvbnMoKS5yZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXM7CiAJYm9vbGVhbiBmb3VuZEFyZ1Byb2JsZW0gPSBmYWxzZTsKIAlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZERlY2wuYXJndW1lbnRzOwogCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtMTM1NSwxMyArMTQ2NCwzMiBAQAogCQlUeXBlQmluZGluZ1tdIG5ld1BhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbc2l6ZV07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQlBcmd1bWVudCBhcmcgPSBhcmd1bWVudHNbaV07Ci0JCQlUeXBlQmluZGluZyBwYXJhbWV0ZXJUeXBlID0gYXJnLnR5cGUucmVzb2x2ZVR5cGUobWV0aG9kRGVjbC5zY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7CisJCQlpZiAoYXJnLmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQltZXRob2QudGFnQml0cyB8PSBUYWdCaXRzLkhhc1BhcmFtZXRlckFubm90YXRpb25zOworCQkJfQorCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjgxNworCQkJYm9vbGVhbiBkZWZlclJhd1R5cGVDaGVjayA9ICFyZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgKGFyZy50eXBlLmJpdHMgJiBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjaykgPT0gMDsKKwkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGU7CisJCQlpZiAoZGVmZXJSYXdUeXBlQ2hlY2spIHsKKwkJCQlhcmcudHlwZS5iaXRzIHw9IEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrOworCQkJfQorCQkJdHJ5IHsKKwkJCQlwYXJhbWV0ZXJUeXBlID0gYXJnLnR5cGUucmVzb2x2ZVR5cGUobWV0aG9kRGVjbC5zY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLyk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChkZWZlclJhd1R5cGVDaGVjaykgeyAKKwkJCQkJYXJnLnR5cGUuYml0cyAmPSB+QVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2s7CisJCQkJfQorCQkJfQorCQkKIAkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpIHsKIAkJCQlmb3VuZEFyZ1Byb2JsZW0gPSB0cnVlOwogCQkJfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IFR5cGVCaW5kaW5nLlZPSUQpIHsKIAkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZCh0aGlzLCBtZXRob2REZWNsLCBhcmcpOwogCQkJCWZvdW5kQXJnUHJvYmxlbSA9IHRydWU7CiAJCQl9IGVsc2UgeworCQkJCWlmICgocGFyYW1ldGVyVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQltZXRob2QudGFnQml0cyB8PSBUYWdCaXRzLkhhc01pc3NpbmdUeXBlOworCQkJCX0KIAkJCQlUeXBlQmluZGluZyBsZWFmVHlwZSA9IHBhcmFtZXRlclR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKIAkJCQlpZiAobGVhZlR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nICYmICgoKFJlZmVyZW5jZUJpbmRpbmcpIGxlYWZUeXBlKS5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApCiAJCQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlOwpAQCAtMTM3NSw2ICsxNTAzLDIxIEBACiAJCX0KIAl9CiAKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3Nzk5CisJaWYgKHRoaXMuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgeworCQlpZiAoKG1ldGhvZC50YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpICE9IDApIHsKKwkJCWlmICghbWV0aG9kLmlzVmFyYXJncygpKSB7CisJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zYWZlVmFyYXJnc09uRml4ZWRBcml0eU1ldGhvZChtZXRob2QpOworCQkJfSBlbHNlIGlmICghbWV0aG9kLmlzU3RhdGljKCkgJiYgIW1ldGhvZC5pc0ZpbmFsKCkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnNhZmVWYXJhcmdzT25Ob25GaW5hbEluc3RhbmNlTWV0aG9kKG1ldGhvZCk7CisJCQl9CisJCX0gZWxzZSBpZiAobWV0aG9kLnBhcmFtZXRlcnMgIT0gbnVsbCAmJiBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPiAwICYmIG1ldGhvZC5pc1ZhcmFyZ3MoKSkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3Nzk1CisJCQlpZiAoIW1ldGhvZC5wYXJhbWV0ZXJzW21ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLmlzUmVpZmlhYmxlKCkpIHsKKwkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnBvc3NpYmxlSGVhcFBvbGx1dGlvbkZyb21WYXJhcmcobWV0aG9kRGVjbC5hcmd1bWVudHNbbWV0aG9kRGVjbC5hcmd1bWVudHMubGVuZ3RoIC0gMV0pOworCQkJfQorCQl9CisJfQorCiAJYm9vbGVhbiBmb3VuZFJldHVyblR5cGVQcm9ibGVtID0gZmFsc2U7CiAJaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7CiAJCVR5cGVSZWZlcmVuY2UgcmV0dXJuVHlwZSA9IG1ldGhvZERlY2wgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbgpAQCAtMTM4NSwxMyArMTUyOCwyOCBAQAogCQkJbWV0aG9kLnJldHVyblR5cGUgPSBudWxsOwogCQkJZm91bmRSZXR1cm5UeXBlUHJvYmxlbSA9IHRydWU7CiAJCX0gZWxzZSB7Ci0JCQlUeXBlQmluZGluZyBtZXRob2RUeXBlID0gcmV0dXJuVHlwZS5yZXNvbHZlVHlwZShtZXRob2REZWNsLnNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI4MTcKKwkJCWJvb2xlYW4gZGVmZXJSYXdUeXBlQ2hlY2sgPSAhcmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zICYmIChyZXR1cm5UeXBlLmJpdHMgJiBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjaykgPT0gMDsKKwkJCVR5cGVCaW5kaW5nIG1ldGhvZFR5cGU7CisJCQlpZiAoZGVmZXJSYXdUeXBlQ2hlY2spIHsKKwkJCQlyZXR1cm5UeXBlLmJpdHMgfD0gQVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2s7CisJCQl9CisJCQl0cnkgeworCQkJCW1ldGhvZFR5cGUgPSByZXR1cm5UeXBlLnJlc29sdmVUeXBlKG1ldGhvZERlY2wuc2NvcGUsIHRydWUgLyogY2hlY2sgYm91bmRzKi8pOworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAoZGVmZXJSYXdUeXBlQ2hlY2spIHsgCisJCQkJCXJldHVyblR5cGUuYml0cyAmPSB+QVNUTm9kZS5JZ25vcmVSYXdUeXBlQ2hlY2s7CisJCQkJfQorCQkJfQogCQkJaWYgKG1ldGhvZFR5cGUgPT0gbnVsbCkgewogCQkJCWZvdW5kUmV0dXJuVHlwZVByb2JsZW0gPSB0cnVlOwogCQkJfSBlbHNlIGlmIChtZXRob2RUeXBlLmlzQXJyYXlUeXBlKCkgJiYgKChBcnJheUJpbmRpbmcpIG1ldGhvZFR5cGUpLmxlYWZDb21wb25lbnRUeXBlID09IFR5cGVCaW5kaW5nLlZPSUQpIHsKIAkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJldHVyblR5cGVDYW5ub3RCZVZvaWRBcnJheSgoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2wpOwogCQkJCWZvdW5kUmV0dXJuVHlwZVByb2JsZW0gPSB0cnVlOwogCQkJfSBlbHNlIHsKKwkJCQlpZiAoKG1ldGhvZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQkJbWV0aG9kLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNNaXNzaW5nVHlwZTsKKwkJCQl9CiAJCQkJbWV0aG9kLnJldHVyblR5cGUgPSBtZXRob2RUeXBlOwogCQkJCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gbWV0aG9kVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOwogCQkJCWlmIChsZWFmVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgJiYgKCgoUmVmZXJlbmNlQmluZGluZykgbGVhZlR5cGUpLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZSkgIT0gMCkKQEAgLTE0NDcsNDcgKzE2MDUsMjcgQEAKIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzKCkgewogCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlczsKIH0KLS8vIFRPRE8gKHBoaWxpcHBlKSBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIHNvbWUgc2VuZGVycyBhcmUgYnVpbGRpbmcgdGhlIGxpc3QganVzdCB0byBjb3VudCB0aGVtCiBwdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZ1tdIHN5bnRoZXRpY01ldGhvZHMoKSB7Ci0JCi0JaWYgKHRoaXMuc3ludGhldGljcyA9PSBudWxsIHx8IHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPT0gbnVsbCB8fCB0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdLnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKLQorCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCAKKwkJCXx8IHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0gPT0gbnVsbCAKKwkJCXx8IHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0uc2l6ZSgpID09IDApIHsKKwkJcmV0dXJuIG51bGw7CisJfQogCS8vIGRpZmZpY3VsdCB0byBjb21wdXRlIHNpemUgdXAgZnJvbnQgYmVjYXVzZSBvZiB0aGUgZW1iZWRkZWQgYXJyYXlzIHNvIGFzc3VtZSB0aGVyZSBpcyBvbmx5IDEKIAlpbnQgaW5kZXggPSAwOwogCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nWzFdOwotCUl0ZXJhdG9yIGZpZWxkc09yTWV0aG9kcyA9IHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0ua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQl3aGlsZSAoZmllbGRzT3JNZXRob2RzLmhhc05leHQoKSkgewotCi0JCU9iamVjdCBmaWVsZE9yTWV0aG9kID0gZmllbGRzT3JNZXRob2RzLm5leHQoKTsKLQotCQlpZiAoZmllbGRPck1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKLQotCQkJU3ludGhldGljTWV0aG9kQmluZGluZ1tdIG1ldGhvZEFjY2Vzc29ycyA9IChTeW50aGV0aWNNZXRob2RCaW5kaW5nW10pIHRoaXMuc3ludGhldGljc1tTb3VyY2VUeXBlQmluZGluZy5NRVRIT0RfRU1VTF0uZ2V0KGZpZWxkT3JNZXRob2QpOwotCQkJaW50IG51bWJlck9mQWNjZXNzb3JzID0gMDsKLQkJCWlmIChtZXRob2RBY2Nlc3NvcnNbMF0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKLQkJCWlmIChtZXRob2RBY2Nlc3NvcnNbMV0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKLQkJCWlmIChpbmRleCArIG51bWJlck9mQWNjZXNzb3JzID4gYmluZGluZ3MubGVuZ3RoKQotCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIChiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nW2luZGV4ICsgbnVtYmVyT2ZBY2Nlc3NvcnNdKSwgMCwgaW5kZXgpOwotCQkJaWYgKG1ldGhvZEFjY2Vzc29yc1swXSAhPSBudWxsKSAKLQkJCQliaW5kaW5nc1tpbmRleCsrXSA9IG1ldGhvZEFjY2Vzc29yc1swXTsgLy8gc3VwZXIgYWNjZXNzIAotCQkJaWYgKG1ldGhvZEFjY2Vzc29yc1sxXSAhPSBudWxsKSAKLQkJCQliaW5kaW5nc1tpbmRleCsrXSA9IG1ldGhvZEFjY2Vzc29yc1sxXTsgLy8gbm9ybWFsIGFjY2VzcyBvciBicmlkZ2UKLQotCQl9IGVsc2UgewotCi0JCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10gZmllbGRBY2Nlc3NvcnMgPSAoU3ludGhldGljTWV0aG9kQmluZGluZ1tdKSB0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuTUVUSE9EX0VNVUxdLmdldChmaWVsZE9yTWV0aG9kKTsKLQkJCWludCBudW1iZXJPZkFjY2Vzc29ycyA9IDA7Ci0JCQlpZiAoZmllbGRBY2Nlc3NvcnNbMF0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKLQkJCWlmIChmaWVsZEFjY2Vzc29yc1sxXSAhPSBudWxsKSBudW1iZXJPZkFjY2Vzc29ycysrOwotCQkJaWYgKGluZGV4ICsgbnVtYmVyT2ZBY2Nlc3NvcnMgPiBiaW5kaW5ncy5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShiaW5kaW5ncywgMCwgKGJpbmRpbmdzID0gbmV3IFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbaW5kZXggKyBudW1iZXJPZkFjY2Vzc29yc10pLCAwLCBpbmRleCk7Ci0JCQlpZiAoZmllbGRBY2Nlc3NvcnNbMF0gIT0gbnVsbCkgCi0JCQkJYmluZGluZ3NbaW5kZXgrK10gPSBmaWVsZEFjY2Vzc29yc1swXTsgLy8gcmVhZCBhY2Nlc3MKLQkJCWlmIChmaWVsZEFjY2Vzc29yc1sxXSAhPSBudWxsKSAKLQkJCQliaW5kaW5nc1tpbmRleCsrXSA9IGZpZWxkQWNjZXNzb3JzWzFdOyAvLyB3cml0ZSBhY2Nlc3MKKwlJdGVyYXRvciBtZXRob2RBcnJheUl0ZXJhdG9yID0gdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLk1FVEhPRF9FTVVMXS52YWx1ZXMoKS5pdGVyYXRvcigpOworCXdoaWxlIChtZXRob2RBcnJheUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10gbWV0aG9kQWNjZXNzb3JzID0gKFN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSkgbWV0aG9kQXJyYXlJdGVyYXRvci5uZXh0KCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RBY2Nlc3NvcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChtZXRob2RBY2Nlc3NvcnNbaV0gIT0gbnVsbCkgeworCQkJCWlmIChpbmRleCsxID4gYmluZGluZ3MubGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIChiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nW2luZGV4ICsgMV0pLCAwLCBpbmRleCk7CisJCQkJfQorCQkJCWJpbmRpbmdzW2luZGV4KytdID0gbWV0aG9kQWNjZXNzb3JzW2ldOyAKKwkJCX0KIAkJfQogCX0KLQogCS8vIHNvcnQgdGhlbSBpbiBhY2NvcmRpbmcgdG8gdGhlaXIgb3duIGluZGV4ZXMKIAlpbnQgbGVuZ3RoOwogCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBzb3J0ZWRCaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNNZXRob2RCaW5kaW5nW2xlbmd0aCA9IGJpbmRpbmdzLmxlbmd0aF07CkBAIC0xNTAxLDkgKzE2MzksNyBAQAogICogQW5zd2VyIHRoZSBjb2xsZWN0aW9uIG9mIHN5bnRoZXRpYyBmaWVsZHMgdG8gYXBwZW5kIGludG8gdGhlIGNsYXNzZmlsZQogICovCiBwdWJsaWMgRmllbGRCaW5kaW5nW10gc3ludGhldGljRmllbGRzKCkgewotCQogCWlmICh0aGlzLnN5bnRoZXRpY3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KIAlpbnQgZmllbGRTaXplID0gdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdID09IG51bGwgPyAwIDogdGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkZJRUxEX0VNVUxdLnNpemUoKTsKIAlpbnQgbGl0ZXJhbFNpemUgPSB0aGlzLnN5bnRoZXRpY3NbU291cmNlVHlwZUJpbmRpbmcuQ0xBU1NfTElURVJBTF9FTVVMXSA9PSBudWxsID8gMCA6dGhpcy5zeW50aGV0aWNzW1NvdXJjZVR5cGVCaW5kaW5nLkNMQVNTX0xJVEVSQUxfRU1VTF0uc2l6ZSgpOwogCWludCB0b3RhbFNpemUgPSBmaWVsZFNpemUgKyBsaXRlcmFsU2l6ZTsKQEAgLTE1MzEsOSArMTY2Nyw5IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDMwKTsKICAgICBidWZmZXIuYXBwZW5kKCIoaWQ9Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAodGhpcy5pZCA9PSBUeXBlSWRzLk5vSWQpIAorICAgIGlmICh0aGlzLmlkID09IFR5cGVJZHMuTm9JZCkKICAgICAgICAgYnVmZmVyLmFwcGVuZCgiTm9JZCIpOyAvLyROT04tTkxTLTEkCi0gICAgZWxzZSAKKyAgICBlbHNlCiAgICAgICAgIGJ1ZmZlci5hcHBlbmQodGhpcy5pZCk7CiAgICAgYnVmZmVyLmFwcGVuZCgiKVxuIik7IC8vJE5PTi1OTFMtMSQKIAlpZiAoaXNEZXByZWNhdGVkKCkpIGJ1ZmZlci5hcHBlbmQoImRlcHJlY2F0ZWQgIik7IC8vJE5PTi1OTFMtMSQKQEAgLTE1NTMsMTEgKzE2ODksMTUgQEAKIAlpZiAodGhpcy50eXBlVmFyaWFibGVzID09IG51bGwpIHsKIAkJYnVmZmVyLmFwcGVuZCgiPE5VTEwgVFlQRSBWQVJJQUJMRVM+Iik7IC8vJE5PTi1OTFMtMSQKIAl9IGVsc2UgaWYgKHRoaXMudHlwZVZhcmlhYmxlcyAhPSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQ8Iik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiPCIpOyAvLyROT04tTkxTLTEkCiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICA+IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCgodGhpcy50eXBlVmFyaWFibGVzW2ldICE9IG51bGwpID8gdGhpcy50eXBlVmFyaWFibGVzW2ldLnRvU3RyaW5nKCkgOiAiTlVMTCBUWVBFIFZBUklBQkxFIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpICA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh0aGlzLnR5cGVWYXJpYWJsZXNbaV0gPT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIk5VTEwgVFlQRSBWQVJJQUJMRSIpOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisJCQljaGFyW10gdmFyQ2hhcnMgPSB0aGlzLnR5cGVWYXJpYWJsZXNbaV0udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJYnVmZmVyLmFwcGVuZCh2YXJDaGFycywgMSwgdmFyQ2hhcnMubGVuZ3RoIC0gMik7CiAJCX0KIAkJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTU4Niw3ICsxNzI2LDcgQEAKIAkJaWYgKHRoaXMuZmllbGRzICE9IEJpbmRpbmcuTk9fRklFTERTKSB7CiAJCQlidWZmZXIuYXBwZW5kKCJcbi8qICAgZmllbGRzICAgKi8iKTsgLy8kTk9OLU5MUy0xJAogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJICAgIGJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKCh0aGlzLmZpZWxkc1tpXSAhPSBudWxsKSA/IHRoaXMuZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiTlVMTCBGSUVMRCIpOyAvLyROT04tTkxTLTEkIAorCQkJICAgIGJ1ZmZlci5hcHBlbmQoJ1xuJykuYXBwZW5kKCh0aGlzLmZpZWxkc1tpXSAhPSBudWxsKSA/IHRoaXMuZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiTlVMTCBGSUVMRCIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9IGVsc2UgewogCQlidWZmZXIuYXBwZW5kKCJOVUxMIEZJRUxEUyIpOyAvLyROT04tTkxTLTEkCkBAIC0xNjE2LDcgKzE3NTYsNyBAQAogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KIHB1YmxpYyBUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcygpIHsKLQlyZXR1cm4gdGhpcy50eXBlVmFyaWFibGVzOworCXJldHVybiB0aGlzLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCA/IHRoaXMudHlwZVZhcmlhYmxlcyA6IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVM7CiB9CiB2b2lkIHZlcmlmeU1ldGhvZHMoTWV0aG9kVmVyaWZpZXIgdmVyaWZpZXIpIHsKIAl2ZXJpZmllci52ZXJpZnkodGhpcyk7CkBAIC0xNjI0LDQgKzE3NjQsMjMgQEAKIAlmb3IgKGludCBpID0gdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykKIAkJICgoU291cmNlVHlwZUJpbmRpbmcpIHRoaXMubWVtYmVyVHlwZXNbaV0pLnZlcmlmeU1ldGhvZHModmVyaWZpZXIpOwogfQorCitwdWJsaWMgRmllbGRCaW5kaW5nW10gdW5SZXNvbHZlZEZpZWxkcygpIHsKKwlyZXR1cm4gdGhpcy5maWVsZHM7Cit9CisKK3B1YmxpYyB2b2lkIHRhZ0luZGlyZWN0bHlBY2Nlc3NpYmxlTWVtYmVycygpIHsKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MjgxCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmZpZWxkcy5sZW5ndGg7IGkrKykgeworCQlpZiAoIXRoaXMuZmllbGRzW2ldLmlzUHJpdmF0ZSgpKQorCQkJdGhpcy5maWVsZHNbaV0ubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjTG9jYWxseVVzZWQ7CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQlpZiAoIXRoaXMubWVtYmVyVHlwZXNbaV0uaXNQcml2YXRlKCkpCisJCQl0aGlzLm1lbWJlclR5cGVzW2ldLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0xvY2FsbHlVc2VkOworCX0KKwlpZiAodGhpcy5zdXBlcmNsYXNzLmlzUHJpdmF0ZSgpKSAKKwkJaWYgKHRoaXMuc3VwZXJjbGFzcyBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nKSAgLy8gc2hvdWxkIGFsd2F5cyBiZSB0cnVlIGJlY2F1c2UgcHJpdmF0ZSBzdXBlciB0eXBlIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGluIHNhbWUgQ1UKKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHRoaXMuc3VwZXJjbGFzcykudGFnSW5kaXJlY3RseUFjY2Vzc2libGVNZW1iZXJzKCk7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUNvbGxpc2lvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWVhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKKworcHVibGljIGNsYXNzIFNvdXJjZVR5cGVDb2xsaXNpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0Nzk4MjQ3NjM2ODk5MTI3MzgwTDsKKworCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0W10gbmV3QW5ub3RhdGlvblByb2Nlc3NvclVuaXRzOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TdWJzdGl0dXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3Vic3RpdHV0aW9uLmphdmEKaW5kZXggYTdjYmZjMC4uYmRkN2NiOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TdWJzdGl0dXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N1YnN0aXR1dGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDE4ICsxNCwxOCBAQAogICogRW5jYXBzdWxhdGVzIGFzcGVjdHMgcmVsYXRlZCB0byB0eXBlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbgogICovCiBwdWJsaWMgaW50ZXJmYWNlIFN1YnN0aXR1dGlvbiB7Ci0gICAgCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIHN1YnN0aXR1dGUgZm9yIGEgZ2l2ZW4gdHlwZSB2YXJpYWJsZSwgb3IgaXRzZWxmCiAJICogaWYgbm8gc3Vic3RpdHV0aW9uIGdvdCBwZXJmb3JtZWQuCiAJICovCiAJVHlwZUJpbmRpbmcgc3Vic3RpdHV0ZShUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZSk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsb29rdXAgZW52aXJvbm1lbnQKIAkgKi8KIAlMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0cnVlIGZvciByYXcgc3Vic3RpdHV0aW9uCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FyZ3VtZW50QmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuamF2YQppbmRleCBkZjZhODYyLi40NGMwYmJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FyZ3VtZW50QmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljQXJndW1lbnRCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsOCArMTMsOCBAQAogLyoqCiAgKiBTcGVjaWZpYyBsb2NhbCB2YXJpYWJsZSBsb2NhdGlvbiB1c2VkIHRvOgogICogLSBlaXRoZXIgcHJvdmlkZSBlbXVsYXRpb24gZm9yIG91dGVyIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGZyb20gd2l0aGluIGlubmVyY2xhc3MgY29uc3RydWN0cywKLSAqIC0gb3IgcHJvdmlkZSBlbXVsYXRpb24gdG8gZW5jbG9zaW5nIGluc3RhbmNlcy4gCi0gKiBXaGVuIGl0IGlzIG1hcHBpbmcgdG8gYW4gb3V0ZXIgbG9jYWwgdmFyaWFibGUsIHRoaXMgYWN0dWFsIG91dGVyIGxvY2FsIGlzIGFjY2Vzc2libGUgdGhyb3VnaCAKKyAqIC0gb3IgcHJvdmlkZSBlbXVsYXRpb24gdG8gZW5jbG9zaW5nIGluc3RhbmNlcy4KKyAqIFdoZW4gaXQgaXMgbWFwcGluZyB0byBhbiBvdXRlciBsb2NhbCB2YXJpYWJsZSwgdGhpcyBhY3R1YWwgb3V0ZXIgbG9jYWwgaXMgYWNjZXNzaWJsZSB0aHJvdWdoCiAgKiB0aGUgcHVibGljIGZpZWxkICNhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUuCiAgKgogICogU3VjaCBhIHN5bnRoZXRpYyBhcmd1bWVudCBiaW5kaW5nIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYWxsIGNvbnN0cnVjdG9ycyBvZiBsb2NhbCBpbm5lcnR5cGVzIGJlZm9yZQpAQCAtMjYsMjEgKzI2LDIxIEBACiAKIHB1YmxpYyBjbGFzcyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgZXh0ZW5kcyBMb2NhbFZhcmlhYmxlQmluZGluZyB7CiAKLQl7CQorCXsKIAkJdGhpcy50YWdCaXRzIHw9IFRhZ0JpdHMuSXNBcmd1bWVudDsKIAkJdGhpcy51c2VGbGFnID0gVVNFRDsKIAl9Ci0JCisKIAkvLyBpZiB0aGUgYXJndW1lbnQgaXMgbWFwcGluZyB0byBhbiBvdXRlciBsb2NhbCB2YXJpYWJsZSwgdGhpcyBkZW5vdGVzIHRoZSBvdXRlciBhY3R1YWwgdmFyaWFibGUKIAlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlOwogCS8vIGlmIHRoZSBhcmd1bWVudCBoYXMgYSBtYXRjaGluZyBzeW50aGV0aWMgZmllbGQKIAlwdWJsaWMgRmllbGRCaW5kaW5nIG1hdGNoaW5nRmllbGQ7Ci0JCisKIAlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgewogCiAJCXN1cGVyKAotCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfT1VURVJfTE9DQUxfUFJFRklYLCBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSksIAotCQkJYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLnR5cGUsIAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfT1VURVJfTE9DQUxfUFJFRklYLCBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSksCisJCQlhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUudHlwZSwKIAkJCUNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCwKIAkJCXRydWUpOwogCQl0aGlzLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZTsKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAogCQkJCVR5cGVDb25zdGFudHMuU1lOVEhFVElDX0VOQ0xPU0lOR19JTlNUQU5DRV9QUkVGSVgsCiAJCQkJU3RyaW5nLnZhbHVlT2YoZW5jbG9zaW5nVHlwZS5kZXB0aCgpKS50b0NoYXJBcnJheSgpKSwKLQkJCWVuY2xvc2luZ1R5cGUsIAorCQkJZW5jbG9zaW5nVHlwZSwKIAkJCUNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCwKIAkJCXRydWUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0ZpZWxkQmluZGluZy5qYXZhCmluZGV4IDk0YjA0ZGQuLjU5ODNiYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNGaWVsZEJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMyw5ICsxMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiAKIHB1YmxpYyBjbGFzcyBTeW50aGV0aWNGaWVsZEJpbmRpbmcgZXh0ZW5kcyBGaWVsZEJpbmRpbmcgewotCQorCiAJcHVibGljIGludCBpbmRleDsKLQkKKwogCXB1YmxpYyBTeW50aGV0aWNGaWVsZEJpbmRpbmcoY2hhcltdIG5hbWUsIFR5cGVCaW5kaW5nIHR5cGUsIGludCBtb2RpZmllcnMsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MsIENvbnN0YW50IGNvbnN0YW50LCBpbnQgaW5kZXgpIHsKIAkJc3VwZXIobmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBkZWNsYXJpbmdDbGFzcywgY29uc3RhbnQpOwogCQl0aGlzLmluZGV4ID0gaW5kZXg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY01ldGhvZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljTWV0aG9kQmluZGluZy5qYXZhCmluZGV4IGVmN2M3MjMuLjU5OGYyNGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljTWV0aG9kQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljTWV0aG9kQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDIyICsyMiwyOSBAQAogCXB1YmxpYyBNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZDsJCQkvLyBtZXRob2Qgb3IgY29uc3RydWN0b3IKIAlwdWJsaWMgVHlwZUJpbmRpbmcgdGFyZ2V0RW51bVR5cGU7IAkJCS8vIGVudW0gdHlwZQogCQotCXB1YmxpYyBpbnQga2luZDsKKwlwdWJsaWMgaW50IHB1cnBvc2U7CisKKwkvLyBmaWVsZHMgdXNlZCB0byBnZW5lcmF0ZSBlbnVtIGNvbnN0YW50cyB3aGVuIHRvbyBtYW55CisJcHVibGljIGludCBzdGFydEluZGV4OworCXB1YmxpYyBpbnQgZW5kSW5kZXg7CiAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGaWVsZFJlYWRBY2Nlc3MgPSAxOyAJCS8vIGZpZWxkIHJlYWQKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGaWVsZFdyaXRlQWNjZXNzID0gMjsgCQkvLyBmaWVsZCB3cml0ZQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1ldGhvZEFjY2VzcyA9IDM7IAkJLy8gbm9ybWFsIG1ldGhvZCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDb25zdHJ1Y3RvckFjY2VzcyA9IDQ7IAkvLyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFN1cGVyTWV0aG9kQWNjZXNzID0gNTsgLy8gc3VwZXIgbWV0aG9kCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQnJpZGdlTWV0aG9kID0gNjsgLy8gYnJpZGdlIG1ldGhvZAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVudW1WYWx1ZXMgPSA3OyAvLyBlbnVtICN2YWx1ZXMoKQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVudW1WYWx1ZU9mID0gODsgLy8gZW51bSAjdmFsdWVPZihTdHJpbmcpCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU3dpdGNoVGFibGUgPSA5OyAvLyBzd2l0Y2ggdGFibGUgbWV0aG9kCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU3VwZXJGaWVsZFJlYWRBY2Nlc3MgPSAzOyAvLyBzdXBlciBmaWVsZCByZWFkCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU3VwZXJGaWVsZFdyaXRlQWNjZXNzID0gNDsgLy8gc3VwZXIgZmllbGQgd3JpdGUKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNZXRob2RBY2Nlc3MgPSA1OyAJCS8vIG5vcm1hbCBtZXRob2QKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDb25zdHJ1Y3RvckFjY2VzcyA9IDY7IAkvLyBjb25zdHJ1Y3RvcgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFN1cGVyTWV0aG9kQWNjZXNzID0gNzsgLy8gc3VwZXIgbWV0aG9kCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQnJpZGdlTWV0aG9kID0gODsgLy8gYnJpZGdlIG1ldGhvZAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVudW1WYWx1ZXMgPSA5OyAvLyBlbnVtICN2YWx1ZXMoKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVudW1WYWx1ZU9mID0gMTA7IC8vIGVudW0gI3ZhbHVlT2YoU3RyaW5nKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFN3aXRjaFRhYmxlID0gMTE7IC8vIHN3aXRjaCB0YWJsZSBtZXRob2QKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUb29NYW55RW51bXNDb25zdGFudHMgPSAxMjsgLy8gdG9vIG1hbnkgZW51bSBjb25zdGFudHMKIAogCXB1YmxpYyBpbnQgc291cmNlU3RhcnQgPSAwOyAvLyBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbWF0Y2hpbmcgZGVjbGFyYXRpb24KIAlwdWJsaWMgaW50IGluZGV4OyAvLyB1c2VkIGZvciBzb3J0aW5nIGFjY2VzcyBtZXRob2RzIGluIHRoZSBjbGFzcyBmaWxlCi0JCi0JcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCisJcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcywgYm9vbGVhbiBpc1N1cGVyQWNjZXNzLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7CiAKIAkJdGhpcy5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljOwogCQl0aGlzLnRhZ0JpdHMgfD0gKFRhZ0JpdHMuQW5ub3RhdGlvblJlc29sdmVkIHwgVGFnQml0cy5EZXByZWNhdGVkQW5ub3RhdGlvblJlc29sdmVkKTsKQEAgLTU1LDcgKzYyLDcgQEAKIAkJCQl0aGlzLnBhcmFtZXRlcnNbMF0gPSBkZWNsYXJpbmdTb3VyY2VUeXBlOwogCQkJfQogCQkJdGhpcy50YXJnZXRSZWFkRmllbGQgPSB0YXJnZXRGaWVsZDsKLQkJCXRoaXMua2luZCA9IEZpZWxkUmVhZEFjY2VzczsKKwkJCXRoaXMucHVycG9zZSA9IGlzU3VwZXJBY2Nlc3MgPyBTeW50aGV0aWNNZXRob2RCaW5kaW5nLlN1cGVyRmllbGRSZWFkQWNjZXNzIDogU3ludGhldGljTWV0aG9kQmluZGluZy5GaWVsZFJlYWRBY2Nlc3M7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLnJldHVyblR5cGUgPSBUeXBlQmluZGluZy5WT0lEOwogCQkJaWYgKHRhcmdldEZpZWxkLmlzU3RhdGljKCkpIHsKQEAgLTY3LDExICs3NCwxMSBAQAogCQkJCXRoaXMucGFyYW1ldGVyc1sxXSA9IHRhcmdldEZpZWxkLnR5cGU7CiAJCQl9CiAJCQl0aGlzLnRhcmdldFdyaXRlRmllbGQgPSB0YXJnZXRGaWVsZDsKLQkJCXRoaXMua2luZCA9IEZpZWxkV3JpdGVBY2Nlc3M7CisJCQl0aGlzLnB1cnBvc2UgPSBpc1N1cGVyQWNjZXNzID8gU3ludGhldGljTWV0aG9kQmluZGluZy5TdXBlckZpZWxkV3JpdGVBY2Nlc3MgOiBTeW50aGV0aWNNZXRob2RCaW5kaW5nLkZpZWxkV3JpdGVBY2Nlc3M7CiAJCX0KIAkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gQmluZGluZy5OT19FWENFUFRJT05TOwogCQl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nU291cmNlVHlwZTsKLQkKKwogCQkvLyBjaGVjayBmb3IgbWV0aG9kIGNvbGxpc2lvbgogCQlib29sZWFuIG5lZWRSZW5hbWU7CiAJCWRvIHsKQEAgLTgzLDcgKzkwLDcgQEAKIAkJCQlpZiAoKHJhbmdlID0gUmVmZXJlbmNlQmluZGluZy5iaW5hcnlTZWFyY2godGhpcy5zZWxlY3RvciwgbWV0aG9kcykpID49IDApIHsKIAkJCQkJaW50IHBhcmFtQ291bnQgPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOwogCQkJCQluZXh0TWV0aG9kOiBmb3IgKGludCBpbWV0aG9kID0gKGludClyYW5nZSwgZW5kID0gKGludCkocmFuZ2UgPj4gMzIpOyBpbWV0aG9kIDw9IGVuZDsgaW1ldGhvZCsrKSB7Ci0JCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CQkJCisJCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CiAJCQkJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IHBhcmFtQ291bnQpIHsKIAkJCQkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKIAkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgewpAQCAtOTUsMTIgKzEwMiwxMiBAQAogCQkJCQkJCWJyZWFrIGNoZWNrOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIHN5bnRoZXRpYyBhY2Nlc3NvcnMKIAkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzICE9IG51bGwpIHsKIAkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kc1tpXSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IpICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3Rvciwga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yKSAmJiBhcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKIAkJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKIAkJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJCX0KQEAgLTEwOCwxMCArMTE1LDEwIEBACiAJCQkJfQogCQkJfQogCQkJaWYgKG5lZWRSZW5hbWUpIHsgLy8gcmV0cnkgd2l0aCBhIHNlbGVjdG9yIHBvc3RmaXhlZCBieSBhIGdyb3dpbmcgbWV0aG9kSWQKLQkJCQl0aGlzLnNldFNlbGVjdG9yKENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuU1lOVEhFVElDX0FDQ0VTU19NRVRIT0RfUFJFRklYLCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CisJCQkJc2V0U2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfQUNDRVNTX01FVEhPRF9QUkVGSVgsIFN0cmluZy52YWx1ZU9mKCsrbWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpKTsKIAkJCX0KIAkJfSB3aGlsZSAobmVlZFJlbmFtZSk7Ci0JCisKIAkJLy8gcmV0cmlldmUgc291cmNlU3RhcnQgcG9zaXRpb24gZm9yIHRoZSB0YXJnZXQgZmllbGQgZm9yIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZXMKIAkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOwogCQlpZiAoZmllbGREZWNscyAhPSBudWxsKSB7CkBAIC0xMjIsNyArMTI5LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkKKwogCS8qIGRpZCBub3QgZmluZCB0aGUgdGFyZ2V0IGZpZWxkIGRlY2xhcmF0aW9uIC0gaXQgaXMgYSBzeW50aGV0aWMgb25lCiAJCXB1YmxpYyBjbGFzcyBBIHsKIAkJCXB1YmxpYyBjbGFzcyBCIHsKQEAgLTEzNSw3ICsxNDIsNyBAQAogCQkJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewogCQkJCW5ldyBBKCkubmV3IEIoKS5uZXcgQygpLmZvbygpOwogCQkJfQotCQl9CQorCQl9CiAJKi8KIAkJLy8gV2Ugbm93IGF0IHRoaXMgcG9pbnQgLSBwZXIgY29uc3RydWN0aW9uIC0gaXQgaXMgZm9yIHN1cmUgYW4gZW5jbG9zaW5nIGluc3RhbmNlLCB3ZSBhcmUgZ29pbmcgdG8KIAkJLy8gc2hvdyB0aGUgdGFyZ2V0IGZpZWxkIHR5cGUgZGVjbGFyYXRpb24gbG9jYXRpb24uCkBAIC0xNTQsMTAgKzE2MSwxMCBAQAogCQl0aGlzLnBhcmFtZXRlcnMgPSBCaW5kaW5nLk5PX1BBUkFNRVRFUlM7CiAJCXRoaXMudGFyZ2V0UmVhZEZpZWxkID0gdGFyZ2V0RmllbGQ7CiAJCXRoaXMudGFyZ2V0RW51bVR5cGUgPSBlbnVtQmluZGluZzsKLQkJdGhpcy5raW5kID0gU3dpdGNoVGFibGU7CisJCXRoaXMucHVycG9zZSA9IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3dpdGNoVGFibGU7CiAJCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IEJpbmRpbmcuTk9fRVhDRVBUSU9OUzsKIAkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7Ci0gIAorCiAJCWlmIChkZWNsYXJpbmdTb3VyY2VUeXBlLmlzU3RyaWN0ZnAoKSkgewogCQkJdGhpcy5tb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwOwogCQl9CkBAIC0xNzIsNyArMTc5LDcgQEAKIAkJCQlpZiAoKHJhbmdlID0gUmVmZXJlbmNlQmluZGluZy5iaW5hcnlTZWFyY2godGhpcy5zZWxlY3RvciwgbWV0aG9kcykpID49IDApIHsKIAkJCQkJaW50IHBhcmFtQ291bnQgPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOwogCQkJCQluZXh0TWV0aG9kOiBmb3IgKGludCBpbWV0aG9kID0gKGludClyYW5nZSwgZW5kID0gKGludCkocmFuZ2UgPj4gMzIpOyBpbWV0aG9kIDw9IGVuZDsgaW1ldGhvZCsrKSB7Ci0JCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CQkJCisJCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaW1ldGhvZF07CiAJCQkJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IHBhcmFtQ291bnQpIHsKIAkJCQkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKIAkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgewpAQCAtMTg0LDEyICsxOTEsMTIgQEAKIAkJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJCX0KIAkJCQkJfQotCQkJCX0JCQkJCQkKKwkJCQl9CiAJCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIHN5bnRoZXRpYyBhY2Nlc3NvcnMKIAkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzICE9IG51bGwpIHsKIAkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kc1tpXSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IpICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3Rvciwga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yKSAmJiBhcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKIAkJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKIAkJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJCX0KQEAgLTE5Nyw3ICsyMDQsNyBAQAogCQkJCX0KIAkJCX0KIAkJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBzZWxlY3RvciBwb3N0Zml4ZWQgYnkgYSBncm93aW5nIG1ldGhvZElkCi0JCQkJdGhpcy5zZXRTZWxlY3RvcihDaGFyT3BlcmF0aW9uLmNvbmNhdChzZWxlY3RvciwgU3RyaW5nLnZhbHVlT2YoKyttZXRob2RJZCkudG9DaGFyQXJyYXkoKSkpOworCQkJCXNldFNlbGVjdG9yKENoYXJPcGVyYXRpb24uY29uY2F0KHNlbGVjdG9yLCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CiAJCQl9CiAJCX0gd2hpbGUgKG5lZWRSZW5hbWUpOwogCkBAIC0yMDUsMTMgKzIxMiwxMyBAQAogCQkvLyBzaG93IHRoZSB0YXJnZXQgZmllbGQgdHlwZSBkZWNsYXJhdGlvbiBsb2NhdGlvbi4KIAkJdGhpcy5zb3VyY2VTdGFydCA9IGRlY2xhcmluZ1NvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zb3VyY2VTdGFydDsgLy8gdXNlIHRoZSB0YXJnZXQgZGVjbGFyaW5nIGNsYXNzIG5hbWUgcG9zaXRpb24gaW5zdGVhZAogCX0KLQkKLQlwdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgYm9vbGVhbiBpc1N1cGVyQWNjZXNzLCBSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgewotCQorCisJcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIGJvb2xlYW4gaXNTdXBlckFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCiAJCWlmICh0YXJnZXRNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQl0aGlzLmluaXRpYWxpemVDb25zdHJ1Y3RvckFjY2Vzc29yKHRhcmdldE1ldGhvZCk7CisJCQlpbml0aWFsaXplQ29uc3RydWN0b3JBY2Nlc3Nvcih0YXJnZXRNZXRob2QpOwogCQl9IGVsc2UgewotCQkJdGhpcy5pbml0aWFsaXplTWV0aG9kQWNjZXNzb3IodGFyZ2V0TWV0aG9kLCBpc1N1cGVyQWNjZXNzLCByZWNlaXZlclR5cGUpOworCQkJaW5pdGlhbGl6ZU1ldGhvZEFjY2Vzc29yKHRhcmdldE1ldGhvZCwgaXNTdXBlckFjY2VzcywgZGVjbGFyaW5nQ2xhc3MpOwogCQl9CiAJfQogCkBAIC0yMTksMjMgKzIyNiwyMyBAQAogCSAqIENvbnN0cnVjdCBhIGJyaWRnZSBtZXRob2QKIAkgKi8KIAlwdWJsaWMgU3ludGhldGljTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIG92ZXJyaWRlbk1ldGhvZFRvQnJpZGdlLCBNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKLQkJCisKIAkgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwogCSAgICB0aGlzLnNlbGVjdG9yID0gb3ZlcnJpZGVuTWV0aG9kVG9CcmlkZ2Uuc2VsZWN0b3I7CiAJICAgIC8vIGFtb25nc3Qgb3RoZXIsIGNsZWFyIHRoZSBBY2NHZW5lcmljU2lnbmF0dXJlLCBzbyBhcyB0byBlbnN1cmUgbm8gcmVtYWlucyBvZiBvcmlnaW5hbCBpbmhlcml0ZWQgcGVyc2lzdCAoMTAxNzk0KQogCSAgICAvLyBhbHNvIHVzZSB0aGUgbW9kaWZpZXJzIGZyb20gdGhlIHRhcmdldCBtZXRob2QsIGFzIG9wcG9zZWQgdG8gaW5oZXJpdGVkIG9uZSAoMTQ3NjkwKQotCSAgICB0aGlzLm1vZGlmaWVycyA9ICh0YXJnZXRNZXRob2QubW9kaWZpZXJzIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0JyaWRnZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICYgfihDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlICB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZSk7CisJICAgIHRoaXMubW9kaWZpZXJzID0gKHRhcmdldE1ldGhvZC5tb2RpZmllcnMgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQnJpZGdlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYykgJiB+KENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW5jaHJvbml6ZWQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjQWJzdHJhY3QgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjTmF0aXZlICB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCB8IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjR2VuZXJpY1NpZ25hdHVyZSk7CiAJCXRoaXMudGFnQml0cyB8PSAoVGFnQml0cy5Bbm5vdGF0aW9uUmVzb2x2ZWQgfCBUYWdCaXRzLkRlcHJlY2F0ZWRBbm5vdGF0aW9uUmVzb2x2ZWQpOwogCSAgICB0aGlzLnJldHVyblR5cGUgPSBvdmVycmlkZW5NZXRob2RUb0JyaWRnZS5yZXR1cm5UeXBlOwogCSAgICB0aGlzLnBhcmFtZXRlcnMgPSBvdmVycmlkZW5NZXRob2RUb0JyaWRnZS5wYXJhbWV0ZXJzOwogCSAgICB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBvdmVycmlkZW5NZXRob2RUb0JyaWRnZS50aHJvd25FeGNlcHRpb25zOwogCSAgICB0aGlzLnRhcmdldE1ldGhvZCA9IHRhcmdldE1ldGhvZDsKLQkgICAgdGhpcy5raW5kID0gQnJpZGdlTWV0aG9kOworCSAgICB0aGlzLnB1cnBvc2UgPSBTeW50aGV0aWNNZXRob2RCaW5kaW5nLkJyaWRnZU1ldGhvZDsKIAkJU3ludGhldGljTWV0aG9kQmluZGluZ1tdIGtub3duQWNjZXNzTWV0aG9kcyA9IGRlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY01ldGhvZHMoKTsKIAkJaW50IG1ldGhvZElkID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKLQkJdGhpcy5pbmRleCA9IG1ldGhvZElkOwkgICAgCisJCXRoaXMuaW5kZXggPSBtZXRob2RJZDsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb25zdHJ1Y3QgZW51bSBzcGVjaWFsIG1ldGhvZHM6IHZhbHVlcyBvciB2YWx1ZU9mIG1ldGhvZHMKIAkgKi8KQEAgLTI0NCwxNSArMjUxLDE2IEBACiAJICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKIAkgICAgdGhpcy5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYzsKIAkJdGhpcy50YWdCaXRzIHw9IChUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCB8IFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCk7CisJCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50ID0gZGVjbGFyaW5nRW51bS5zY29wZS5lbnZpcm9ubWVudCgpOwogCSAgICB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CiAJCWlmIChzZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLlZBTFVFUykgewotCQkgICAgdGhpcy5yZXR1cm5UeXBlID0gZGVjbGFyaW5nRW51bS5zY29wZS5jcmVhdGVBcnJheVR5cGUoZGVjbGFyaW5nRW51bSwgMSk7CisJCSAgICB0aGlzLnJldHVyblR5cGUgPSBlbnZpcm9ubWVudC5jcmVhdGVBcnJheVR5cGUoZW52aXJvbm1lbnQuY29udmVydFRvUGFyYW1ldGVyaXplZFR5cGUoZGVjbGFyaW5nRW51bSksIDEpOwogCQkgICAgdGhpcy5wYXJhbWV0ZXJzID0gQmluZGluZy5OT19QQVJBTUVURVJTOwotCQkgICAgdGhpcy5raW5kID0gRW51bVZhbHVlczsKKwkJICAgIHRoaXMucHVycG9zZSA9IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuRW51bVZhbHVlczsKIAkJfSBlbHNlIGlmIChzZWxlY3RvciA9PSBUeXBlQ29uc3RhbnRzLlZBTFVFT0YpIHsKLQkJICAgIHRoaXMucmV0dXJuVHlwZSA9IGRlY2xhcmluZ0VudW07CisJCSAgICB0aGlzLnJldHVyblR5cGUgPSBlbnZpcm9ubWVudC5jb252ZXJ0VG9QYXJhbWV0ZXJpemVkVHlwZShkZWNsYXJpbmdFbnVtKTsKIAkJICAgIHRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1tdeyBkZWNsYXJpbmdFbnVtLnNjb3BlLmdldEphdmFMYW5nU3RyaW5nKCkgfTsKLQkJICAgIHRoaXMua2luZCA9IEVudW1WYWx1ZU9mOworCQkgICAgdGhpcy5wdXJwb3NlID0gU3ludGhldGljTWV0aG9kQmluZGluZy5FbnVtVmFsdWVPZjsKIAkJfQogCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gKChTb3VyY2VUeXBlQmluZGluZyl0aGlzLmRlY2xhcmluZ0NsYXNzKS5zeW50aGV0aWNNZXRob2RzKCk7CiAJCWludCBtZXRob2RJZCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CkBAIC0yNjEsMzYgKzI2OSw3NyBAQAogCQkJdGhpcy5tb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0cmljdGZwOwogCQl9CiAJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBlbnVtIHNwZWNpYWwgbWV0aG9kczogdmFsdWVzIG9yIHZhbHVlT2YgbWV0aG9kcworCSAqLworCXB1YmxpYyBTeW50aGV0aWNNZXRob2RCaW5kaW5nKFNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ0VudW0sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0VudW07CisJCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBrbm93bkFjY2Vzc01ldGhvZHMgPSBkZWNsYXJpbmdFbnVtLnN5bnRoZXRpY01ldGhvZHMoKTsKKwkJdGhpcy5pbmRleCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWJ1ZmZlci5hcHBlbmQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfRU5VTV9DT05TVEFOVF9JTklUSUFMSVpBVElPTl9NRVRIT0RfUFJFRklYKS5hcHBlbmQodGhpcy5pbmRleCk7CisJCXRoaXMuc2VsZWN0b3IgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpLnRvQ2hhckFycmF5KCk7IAorCQl0aGlzLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYzsKKwkJdGhpcy50YWdCaXRzIHw9IChUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCB8IFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCk7CisJCXRoaXMucHVycG9zZSA9IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuVG9vTWFueUVudW1zQ29uc3RhbnRzOworCQl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBCaW5kaW5nLk5PX0VYQ0VQVElPTlM7CisJCXRoaXMucmV0dXJuVHlwZSA9IFR5cGVCaW5kaW5nLlZPSUQ7CisJCXRoaXMucGFyYW1ldGVycyA9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUzsKKwkJdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKKwkJdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4OworCX0KKworCS8vIENyZWF0ZSBhIHN5bnRoZXRpYyBtZXRob2QgdGhhdCB3aWxsIHNpbXBseSBjYWxsIHRoZSBzdXBlciBjbGFzc2VzIG1ldGhvZC4KKwkvLyBVc2VkIHdoZW4gYSBwdWJsaWMgbWV0aG9kIGlzIGluaGVyaXRlZCBmcm9tIGEgbm9uLXB1YmxpYyBjbGFzcyBpbnRvIGEgcHVibGljIGNsYXNzLgorCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4NjU4CisJcHVibGljIFN5bnRoZXRpY01ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyBvdmVycmlkZW5NZXRob2RUb0JyaWRnZSwgU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKKworCSAgICB0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CisJICAgIHRoaXMuc2VsZWN0b3IgPSBvdmVycmlkZW5NZXRob2RUb0JyaWRnZS5zZWxlY3RvcjsKKwkgICAgLy8gYW1vbmdzdCBvdGhlciwgY2xlYXIgdGhlIEFjY0dlbmVyaWNTaWduYXR1cmUsIHNvIGFzIHRvIGVuc3VyZSBubyByZW1haW5zIG9mIG9yaWdpbmFsIGluaGVyaXRlZCBwZXJzaXN0ICgxMDE3OTQpCisJICAgIC8vIGFsc28gdXNlIHRoZSBtb2RpZmllcnMgZnJvbSB0aGUgdGFyZ2V0IG1ldGhvZCwgYXMgb3Bwb3NlZCB0byBpbmhlcml0ZWQgb25lICgxNDc2OTApCisJICAgIHRoaXMubW9kaWZpZXJzID0gKG92ZXJyaWRlbk1ldGhvZFRvQnJpZGdlLm1vZGlmaWVycyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NCcmlkZ2UgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljKSAmIH4oQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBYnN0cmFjdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUgIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsIHwgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NHZW5lcmljU2lnbmF0dXJlKTsKKwkJdGhpcy50YWdCaXRzIHw9IChUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCB8IFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCk7CisJICAgIHRoaXMucmV0dXJuVHlwZSA9IG92ZXJyaWRlbk1ldGhvZFRvQnJpZGdlLnJldHVyblR5cGU7CisJICAgIHRoaXMucGFyYW1ldGVycyA9IG92ZXJyaWRlbk1ldGhvZFRvQnJpZGdlLnBhcmFtZXRlcnM7CisJICAgIHRoaXMudGhyb3duRXhjZXB0aW9ucyA9IG92ZXJyaWRlbk1ldGhvZFRvQnJpZGdlLnRocm93bkV4Y2VwdGlvbnM7CisJICAgIHRoaXMudGFyZ2V0TWV0aG9kID0gb3ZlcnJpZGVuTWV0aG9kVG9CcmlkZ2U7CisJICAgIHRoaXMucHVycG9zZSA9IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJNZXRob2RBY2Nlc3M7CisJCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBrbm93bkFjY2Vzc01ldGhvZHMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNNZXRob2RzKCk7CisJCWludCBtZXRob2RJZCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CisJCXRoaXMuaW5kZXggPSBtZXRob2RJZDsKKwl9CiAKIAkvKioKIAkgKiBBbiBjb25zdHJ1Y3RvciBhY2Nlc3NvciBpcyBhIGNvbnN0cnVjdG9yIHdpdGggYW4gZXh0cmEgYXJndW1lbnQgKGRlY2xhcmluZ0NsYXNzKSwgaW4gY2FzZSBvZgogCSAqIGNvbGxpc2lvbiB3aXRoIGFuIGV4aXN0aW5nIGNvbnN0cnVjdG9yLCB0aGVuIGFkZCBhZ2FpbiBhbiBleHRyYSBhcmd1bWVudCAoZGVjbGFyaW5nQ2xhc3MgYWdhaW4pLgogCSAqLwogCSBwdWJsaWMgdm9pZCBpbml0aWFsaXplQ29uc3RydWN0b3JBY2Nlc3NvcihNZXRob2RCaW5kaW5nIGFjY2Vzc2VkQ29uc3RydWN0b3IpIHsKLQkKKwogCQl0aGlzLnRhcmdldE1ldGhvZCA9IGFjY2Vzc2VkQ29uc3RydWN0b3I7CiAJCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3ludGhldGljOwogCQl0aGlzLnRhZ0JpdHMgfD0gKFRhZ0JpdHMuQW5ub3RhdGlvblJlc29sdmVkIHwgVGFnQml0cy5EZXByZWNhdGVkQW5ub3RhdGlvblJlc29sdmVkKTsKLQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgYWNjZXNzZWRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzczsgCi0JCVN5bnRoZXRpY01ldGhvZEJpbmRpbmdbXSBrbm93blN5bnRoZXRpY01ldGhvZHMgPSAKLQkJCXNvdXJjZVR5cGUuc3ludGhldGljTWV0aG9kcygpOyAKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgYWNjZXNzZWRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzczsKKwkJU3ludGhldGljTWV0aG9kQmluZGluZ1tdIGtub3duU3ludGhldGljTWV0aG9kcyA9IHNvdXJjZVR5cGUuc3ludGhldGljTWV0aG9kcygpOwogCQl0aGlzLmluZGV4ID0ga25vd25TeW50aGV0aWNNZXRob2RzID09IG51bGwgPyAwIDoga25vd25TeW50aGV0aWNNZXRob2RzLmxlbmd0aDsKLQkKKwogCQl0aGlzLnNlbGVjdG9yID0gYWNjZXNzZWRDb25zdHJ1Y3Rvci5zZWxlY3RvcjsKIAkJdGhpcy5yZXR1cm5UeXBlID0gYWNjZXNzZWRDb25zdHJ1Y3Rvci5yZXR1cm5UeXBlOwotCQl0aGlzLmtpbmQgPSBDb25zdHJ1Y3RvckFjY2VzczsKLQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW2FjY2Vzc2VkQ29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGggKyAxXTsKKwkJdGhpcy5wdXJwb3NlID0gU3ludGhldGljTWV0aG9kQmluZGluZy5Db25zdHJ1Y3RvckFjY2VzczsKKwkJZmluYWwgaW50IHBhcmFtZXRlcnNMZW5ndGggPSBhY2Nlc3NlZENvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoOworCQl0aGlzLnBhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbcGFyYW1ldGVyc0xlbmd0aCArIDFdOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJYWNjZXNzZWRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCAKLQkJCTAsIAotCQkJdGhpcy5wYXJhbWV0ZXJzLCAKLQkJCTAsIAotCQkJYWNjZXNzZWRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCk7IAotCQlwYXJhbWV0ZXJzW2FjY2Vzc2VkQ29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGhdID0gCi0JCQlhY2Nlc3NlZENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOyAKKwkJCWFjY2Vzc2VkQ29uc3RydWN0b3IucGFyYW1ldGVycywKKwkJCTAsCisJCQl0aGlzLnBhcmFtZXRlcnMsCisJCQkwLAorCQkJcGFyYW1ldGVyc0xlbmd0aCk7CisJCXRoaXMucGFyYW1ldGVyc1twYXJhbWV0ZXJzTGVuZ3RoXSA9CisJCQlhY2Nlc3NlZENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOwogCQl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBhY2Nlc3NlZENvbnN0cnVjdG9yLnRocm93bkV4Y2VwdGlvbnM7CiAJCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBzb3VyY2VUeXBlOwotCQorCiAJCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCiAJCWJvb2xlYW4gbmVlZFJlbmFtZTsKIAkJZG8gewpAQCAtMjk5LDggKzM0OCw3IEBACiAJCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGtub3duIG1ldGhvZHMKIAkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHNvdXJjZVR5cGUubWV0aG9kcygpOwogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBtZXRob2RzW2ldLnNlbGVjdG9yKQotCQkJCQkJJiYgdGhpcy5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2VsZWN0b3IsIG1ldGhvZHNbaV0uc2VsZWN0b3IpICYmIGFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwobWV0aG9kc1tpXSkpIHsKIAkJCQkJCW5lZWRSZW5hbWUgPSB0cnVlOwogCQkJCQkJYnJlYWsgY2hlY2s7CiAJCQkJCX0KQEAgLTMxMCw4ICszNTgsNyBAQAogCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25TeW50aGV0aWNNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAoa25vd25TeW50aGV0aWNNZXRob2RzW2ldID09IG51bGwpCiAJCQkJCQkJY29udGludWU7Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3Rvciwga25vd25TeW50aGV0aWNNZXRob2RzW2ldLnNlbGVjdG9yKQotCQkJCQkJCSYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKGtub3duU3ludGhldGljTWV0aG9kc1tpXSkpIHsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBrbm93blN5bnRoZXRpY01ldGhvZHNbaV0uc2VsZWN0b3IpICYmIGFyZVBhcmFtZXRlckVyYXN1cmVzRXF1YWwoa25vd25TeW50aGV0aWNNZXRob2RzW2ldKSkgewogCQkJCQkJCW5lZWRSZW5hbWUgPSB0cnVlOwogCQkJCQkJCWJyZWFrIGNoZWNrOwogCQkJCQkJfQpAQCAtMzIxLDE4ICszNjgsMTggQEAKIAkJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBuZXcgZXh0cmEgYXJndW1lbnQKIAkJCQlpbnQgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQl0aGlzLnBhcmFtZXRlcnMsIAotCQkJCQkwLCAKLQkJCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aCArIDFdLCAKLQkJCQkJMCwgCi0JCQkJCWxlbmd0aCk7IAorCQkJCQl0aGlzLnBhcmFtZXRlcnMsCisJCQkJCTAsCisJCQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGggKyAxXSwKKwkJCQkJMCwKKwkJCQkJbGVuZ3RoKTsKIAkJCQl0aGlzLnBhcmFtZXRlcnNbbGVuZ3RoXSA9IHRoaXMuZGVjbGFyaW5nQ2xhc3M7CiAJCQl9CiAJCX0gd2hpbGUgKG5lZWRSZW5hbWUpOwotCQorCiAJCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcwotCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbHMgPSAKLQkJCXNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOyAKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0KKwkJCXNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOwogCQlpZiAobWV0aG9kRGVjbHMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZERlY2xzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKG1ldGhvZERlY2xzW2ldLmJpbmRpbmcgPT0gYWNjZXNzZWRDb25zdHJ1Y3RvcikgewpAQCAtMzQ3LDcgKzM5NCw3IEBACiAJICogQW4gbWV0aG9kIGFjY2Vzc29yIGlzIGEgbWV0aG9kIHdpdGggYW4gYWNjZXNzJE4gc2VsZWN0b3IsIHdoZXJlIE4gaXMgaW5jcmVtZW50ZWQgaW4gY2FzZSBvZiBjb2xsaXNpb25zLgogCSAqLwogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRob2RBY2Nlc3NvcihNZXRob2RCaW5kaW5nIGFjY2Vzc2VkTWV0aG9kLCBib29sZWFuIGlzU3VwZXJBY2Nlc3MsIFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7Ci0JCQorCiAJCXRoaXMudGFyZ2V0TWV0aG9kID0gYWNjZXNzZWRNZXRob2Q7CiAJCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bnRoZXRpYzsKIAkJdGhpcy50YWdCaXRzIHw9IChUYWdCaXRzLkFubm90YXRpb25SZXNvbHZlZCB8IFRhZ0JpdHMuRGVwcmVjYXRlZEFubm90YXRpb25SZXNvbHZlZCk7CkBAIC0zNTUsMTEgKzQwMiwxMSBAQAogCQlTeW50aGV0aWNNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zeW50aGV0aWNNZXRob2RzKCk7CiAJCWludCBtZXRob2RJZCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CiAJCXRoaXMuaW5kZXggPSBtZXRob2RJZDsKLQkKKwogCQl0aGlzLnNlbGVjdG9yID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5TWU5USEVUSUNfQUNDRVNTX01FVEhPRF9QUkVGSVgsIFN0cmluZy52YWx1ZU9mKG1ldGhvZElkKS50b0NoYXJBcnJheSgpKTsKIAkJdGhpcy5yZXR1cm5UeXBlID0gYWNjZXNzZWRNZXRob2QucmV0dXJuVHlwZTsKLQkJdGhpcy5raW5kID0gaXNTdXBlckFjY2VzcyA/IFN1cGVyTWV0aG9kQWNjZXNzIDogTWV0aG9kQWNjZXNzOwotCQkKKwkJdGhpcy5wdXJwb3NlID0gaXNTdXBlckFjY2VzcyA/IFN5bnRoZXRpY01ldGhvZEJpbmRpbmcuU3VwZXJNZXRob2RBY2Nlc3MgOiBTeW50aGV0aWNNZXRob2RCaW5kaW5nLk1ldGhvZEFjY2VzczsKKwogCQlpZiAoYWNjZXNzZWRNZXRob2QuaXNTdGF0aWMoKSkgewogCQkJdGhpcy5wYXJhbWV0ZXJzID0gYWNjZXNzZWRNZXRob2QucGFyYW1ldGVyczsKIAkJfSBlbHNlIHsKQEAgLTM2OSw3ICs0MTYsNyBAQAogCQl9CiAJCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IGFjY2Vzc2VkTWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CiAJCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdTb3VyY2VUeXBlOwotCQorCiAJCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCiAJCWJvb2xlYW4gbmVlZFJlbmFtZTsKIAkJZG8gewpAQCAtMzc4LDcgKzQyNSw3IEBACiAJCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGtub3duIG1ldGhvZHMKIAkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUubWV0aG9kcygpOwogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNlbGVjdG9yLCBtZXRob2RzW2ldLnNlbGVjdG9yKSAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2ldKSkgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3RvciwgbWV0aG9kc1tpXS5zZWxlY3RvcikgJiYgYXJlUGFyYW1ldGVyRXJhc3VyZXNFcXVhbChtZXRob2RzW2ldKSkgewogCQkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CiAJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJfQpAQCAtMzg3LDcgKzQzNCw3IEBACiAJCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrbm93bkFjY2Vzc01ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHNbaV0gPT0gbnVsbCkgY29udGludWU7Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3Rvciwga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yKSAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChrbm93bkFjY2Vzc01ldGhvZHNbaV0pKSB7CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zZWxlY3Rvciwga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yKSAmJiBhcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKGtub3duQWNjZXNzTWV0aG9kc1tpXSkpIHsKIAkJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKIAkJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJCX0KQEAgLTM5NSwxMCArNDQyLDEwIEBACiAJCQkJfQogCQkJfQogCQkJaWYgKG5lZWRSZW5hbWUpIHsgLy8gcmV0cnkgd2l0aCBhIHNlbGVjdG9yICYgYSBncm93aW5nIG1ldGhvZElkCi0JCQkJdGhpcy5zZXRTZWxlY3RvcihDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLlNZTlRIRVRJQ19BQ0NFU1NfTUVUSE9EX1BSRUZJWCwgU3RyaW5nLnZhbHVlT2YoKyttZXRob2RJZCkudG9DaGFyQXJyYXkoKSkpOworCQkJCXNldFNlbGVjdG9yKENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuU1lOVEhFVElDX0FDQ0VTU19NRVRIT0RfUFJFRklYLCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CiAJCQl9CiAJCX0gd2hpbGUgKG5lZWRSZW5hbWUpOwotCQorCiAJCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcwogCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsKIAkJaWYgKG1ldGhvZERlY2xzICE9IG51bGwpIHsKQEAgLTQxMiw2ICs0NTksNiBAQAogCX0KIAogCXByb3RlY3RlZCBib29sZWFuIGlzQ29uc3RydWN0b3JSZWxhdGVkKCkgewotCQlyZXR1cm4ga2luZCA9PSBDb25zdHJ1Y3RvckFjY2VzczsKKwkJcmV0dXJuIHRoaXMucHVycG9zZSA9PSBTeW50aGV0aWNNZXRob2RCaW5kaW5nLkNvbnN0cnVjdG9yQWNjZXNzOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVGFnQml0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKaW5kZXggZDY1ZmRjMC4uZDBiZjk3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMywzMiArMTMsNTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiAKIHB1YmxpYyBpbnRlcmZhY2UgVGFnQml0cyB7Ci0gICAgCisKIAkvLyBUYWcgYml0cyBpbiB0aGUgdGFnQml0cyBpbnQgb2YgZXZlcnkgVHlwZUJpbmRpbmcKIAlsb25nIElzQXJyYXlUeXBlID0gQVNUTm9kZS5CaXQxOwogCWxvbmcgSXNCYXNlVHlwZSA9IEFTVE5vZGUuQml0MjsKIAlsb25nIElzTmVzdGVkVHlwZSA9IEFTVE5vZGUuQml0MzsKIAlsb25nIElzTWVtYmVyVHlwZSA9IEFTVE5vZGUuQml0NDsKLQlsb25nIE1lbWJlclR5cGVNYXNrID0gSXNOZXN0ZWRUeXBlIHwgSXNNZW1iZXJUeXBlOworCWxvbmcgQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcyA9IEFTVE5vZGUuQml0MTI7IC8vIG1ldGhvZC9wYXJhbWV0ZXJpemVkIHR5cGUgYmluZGluZworCWxvbmcgTWVtYmVyVHlwZU1hc2sgPSBJc05lc3RlZFR5cGUgfCBJc01lbWJlclR5cGUgfCBDb250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzOwogCWxvbmcgSXNMb2NhbFR5cGUgPSBBU1ROb2RlLkJpdDU7Ci0JbG9uZyBMb2NhbFR5cGVNYXNrID0gSXNOZXN0ZWRUeXBlIHwgSXNMb2NhbFR5cGU7CisJbG9uZyBMb2NhbFR5cGVNYXNrID0gSXNOZXN0ZWRUeXBlIHwgSXNMb2NhbFR5cGUgfCBDb250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzOwogCWxvbmcgSXNBbm9ueW1vdXNUeXBlID0gQVNUTm9kZS5CaXQ2OwotCWxvbmcgQW5vbnltb3VzVHlwZU1hc2sgPSBMb2NhbFR5cGVNYXNrIHwgSXNBbm9ueW1vdXNUeXBlOworCWxvbmcgQW5vbnltb3VzVHlwZU1hc2sgPSBMb2NhbFR5cGVNYXNrIHwgSXNBbm9ueW1vdXNUeXBlIHwgQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlczsKIAlsb25nIElzQmluYXJ5QmluZGluZyA9IEFTVE5vZGUuQml0NzsKKworCS8vIHNldCBmb3IgYWxsIGJpbmRpbmdzIGVpdGhlciByZXByZXNlbnRpbmcgYSBtaXNzaW5nIHR5cGUgKHR5cGUpLCBvciBkaXJlY3RseSByZWZlcmVuY2luZyBhIG1pc3NpbmcgdHlwZSAoZmllbGQvbWV0aG9kL3ZhcmlhYmxlKQorCWxvbmcgSGFzTWlzc2luZ1R5cGUgPSBBU1ROb2RlLkJpdDg7CisKKwkvLyBmb3IgbWV0aG9kCisJbG9uZyBIYXNVbmNoZWNrZWRUeXBlQXJndW1lbnRGb3JCb3VuZENoZWNrID0gQVNUTm9kZS5CaXQ5OwogCQotCWxvbmcgSGFzSW5jb25zaXN0ZW50SGllcmFyY2h5ID0gQVNUTm9kZS5CaXQ4OyAvLyBmb3IgYmluYXJ5IHR5cGUgYmluZGluZyBvbmx5CisJLy8gbG9jYWwgdmFyaWFibGUKKwlsb25nIE5vdEluaXRpYWxpemVkID0gQVNUTm9kZS5CaXQ5OworCQorCS8vIGxvY2FsIHZhcmlhYmxlCisJbG9uZyBGb3JjZWRUb0JlUmF3VHlwZSA9IEFTVE5vZGUuQml0MTA7CisKKwkvLyBzZXQgd2hlbiBtZXRob2QgaGFzIGFyZ3VtZW50KHMpIHRoYXQgY291bGRuJ3QgYmUgcmVzb2x2ZWQKKwlsb25nIEhhc1VucmVzb2x2ZWRBcmd1bWVudHMgPSBBU1ROb2RlLkJpdDEwOwogCQogCS8vIGZvciB0aGUgdHlwZSBjeWNsZSBoaWVyYXJjaHkgY2hlY2sgdXNlZCBieSBDbGFzc1Njb3BlCiAJbG9uZyBCZWdpbkhpZXJhcmNoeUNoZWNrID0gQVNUTm9kZS5CaXQ5OyAgLy8gdHlwZQogCWxvbmcgRW5kSGllcmFyY2h5Q2hlY2sgPSBBU1ROb2RlLkJpdDEwOyAvLyB0eXBlCi0JbG9uZyBDb250YWluc05lc3RlZFR5cGVzSW5TaWduYXR1cmUgPSBBU1ROb2RlLkJpdDEwOyAvLyBtZXRob2QKLQlsb25nIEhhc1BhcmFtZXRlckFubm90YXRpb25zID0gQVNUTm9kZS5CaXQxMTsgLy8gbWV0aG9kCi0JCisJbG9uZyBQYXVzZUhpZXJhcmNoeUNoZWNrID0gQVNUTm9kZS5CaXQyMDsgLy8gdHlwZQorCWxvbmcgSGFzUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBU1ROb2RlLkJpdDExOyAvLyBtZXRob2QvY29uc3RydWN0b3IKKworCiAJLy8gdGVzdCBiaXQgdG8gc2VlIGlmIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcyB3ZXJlIGNvbXB1dGVkCiAJbG9uZyBLbm93c0RlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBBU1ROb2RlLkJpdDExOyAvLyB0eXBlCiAKIAlsb25nIElzQXJndW1lbnQgPSBBU1ROb2RlLkJpdDExOyAvLyBsb2NhbAotCWxvbmcgQ2xlYXJQcml2YXRlTW9kaWZpZXIgPSBBU1ROb2RlLkJpdDExOyAvLyBjb25zdHJ1Y3RvciBiaW5kaW5nCisJbG9uZyBDbGVhclByaXZhdGVNb2RpZmllciA9IEFTVE5vZGUuQml0MTA7IC8vIGNvbnN0cnVjdG9yIGJpbmRpbmcKKwkKKwkvLyBmb3IgamF2YSA3CisJbG9uZyBJc0VmZmVjdGl2ZWx5RmluYWwgPSBBU1ROb2RlLkJpdDEyOyAvLyBsb2NhbAorCWxvbmcgTXVsdGlDYXRjaFBhcmFtZXRlciA9IEFTVE5vZGUuQml0MTM7IC8vIGxvY2FsCisJbG9uZyBJc1Jlc291cmNlID0gQVNUTm9kZS5CaXQxNDsgLy8gbG9jYWwKIAogCS8vIHRlc3QgYml0cyB0byBzZWUgaWYgcGFydHMgb2YgYmluYXJ5IHR5cGVzIGFyZSBmYXVsdGVkCiAJbG9uZyBBcmVGaWVsZHNTb3J0ZWQgPSBBU1ROb2RlLkJpdDEzOwpAQCAtNTUsMTIgKzc1LDEyIEBACiAJLy8gdGVzdCBiaXQgdG8gaWRlbnRpZnkgaWYgdGhlIHR5cGUncyB0eXBlIHZhcmlhYmxlcyBoYXZlIGJlZW4gY29ubmVjdGVkCiAJbG9uZyBUeXBlVmFyaWFibGVzQXJlQ29ubmVjdGVkID0gQVNUTm9kZS5CaXQxOTsKIAotCS8vIHNldCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlIHdpdGggc3VjY2Vzc2Z1bGwgYm91bmQgY2hlY2sKKwkvLyBzZXQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZSB3aXRoIHN1Y2Nlc3NmdWwgYm91bmQgY2hlY2sKIAlsb25nIFBhc3NlZEJvdW5kQ2hlY2sgPSBBU1ROb2RlLkJpdDIzOwotCQorCiAJLy8gc2V0IGZvciBwYXJhbWV0ZXJpemVkIHR5cGUgTk9UIG9mIHRoZSBmb3JtIFg8Pyw/PgotCWxvbmcgSXNCb3VuZFBhcmFtZXRlcml6ZWRUeXBlID0gQVNUTm9kZS5CaXQyNDsgCi0JCisJbG9uZyBJc0JvdW5kUGFyYW1ldGVyaXplZFR5cGUgPSBBU1ROb2RlLkJpdDI0OworCiAJLy8gdXNlZCBieSBCaW5hcnlUeXBlQmluZGluZwogCWxvbmcgSGFzVW5yZXNvbHZlZFR5cGVWYXJpYWJsZXMgPSBBU1ROb2RlLkJpdDI1OwogCWxvbmcgSGFzVW5yZXNvbHZlZFN1cGVyY2xhc3MgPSBBU1ROb2RlLkJpdDI2OwpAQCAtNzAsMTEgKzkwLDExIEBACiAKIAlsb25nIEhhc1R5cGVWYXJpYWJsZSA9IEFTVE5vZGUuQml0MzA7IC8vIHNldCBlaXRoZXIgZm9yIHR5cGUgdmFyaWFibGVzIChkaXJlY3QpIG9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgaW5kaXJlY3RseSByZWZlcmVuY2luZyB0eXBlIHZhcmlhYmxlcwogCWxvbmcgSGFzRGlyZWN0V2lsZGNhcmQgPSBBU1ROb2RlLkJpdDMxOyAvLyBzZXQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgZGlyZWN0bHkgcmVmZXJlbmNpbmcgd2lsZGNhcmRzCi0JCisKIAkvLyBmb3IgdGhlIGFubm90YXRpb24gY3ljbGUgaGllcmFyY2h5IGNoZWNrIHVzZWQgYnkgQ2xhc3NTY29wZQogCWxvbmcgQmVnaW5Bbm5vdGF0aW9uQ2hlY2sgPSBBU1ROb2RlLkJpdDMyTDsKIAlsb25nIEVuZEFubm90YXRpb25DaGVjayA9IEFTVE5vZGUuQml0MzNMOwotCQorCiAJLy8gc3RhbmRhcmQgYW5ub3RhdGlvbnMKIAkvLyA5LWJpdHMgZm9yIHRhcmdldHMKIAlsb25nIEFubm90YXRpb25SZXNvbHZlZCA9IEFTVE5vZGUuQml0MzRMOwpAQCAtMTA0LDEwICsxMjQsMjMgQEAKIAlsb25nIEFubm90YXRpb25Jbmhlcml0ZWQgPSBBU1ROb2RlLkJpdDQ5TDsKIAlsb25nIEFubm90YXRpb25PdmVycmlkZSA9IEFTVE5vZGUuQml0NTBMOwogCWxvbmcgQW5ub3RhdGlvblN1cHByZXNzV2FybmluZ3MgPSBBU1ROb2RlLkJpdDUxTDsKLQlsb25nIEFsbFN0YW5kYXJkQW5ub3RhdGlvbnNNYXNrID0gQW5ub3RhdGlvblRhcmdldE1BU0sgfCBBbm5vdGF0aW9uUmV0ZW50aW9uTUFTSyB8IEFubm90YXRpb25EZXByZWNhdGVkIHwgQW5ub3RhdGlvbkRvY3VtZW50ZWQgfCBBbm5vdGF0aW9uSW5oZXJpdGVkIHwgIEFubm90YXRpb25PdmVycmlkZSB8IEFubm90YXRpb25TdXBwcmVzc1dhcm5pbmdzOwotCQotCWxvbmcgRGVmYXVsdFZhbHVlUmVzb2x2ZWQgPSBBU1ROb2RlLkJpdDUyTDsKLQkKKwkvKiogQHNpbmNlIDMuNyAtIGphdmEgNyBzYWZlIHZhcmdzIGludm9jYXRpb24gKi8KKwlsb25nIEFubm90YXRpb25TYWZlVmFyYXJncyA9IEFTVE5vZGUuQml0NTJMOworCS8qKiBAc2luY2UgMy43IC0gamF2YSA3IE1ldGhvZEhhbmRsZS5pbnZva2VFeGFjdCguLikvaW52b2tlR2VuZXJpYyguLikqLworCWxvbmcgQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlID0gQVNUTm9kZS5CaXQ1M0w7CisKKwlsb25nIEFsbFN0YW5kYXJkQW5ub3RhdGlvbnNNYXNrID0gQW5ub3RhdGlvblRhcmdldE1BU0sKKwkJCQl8IEFubm90YXRpb25SZXRlbnRpb25NQVNLCisJCQkJfCBBbm5vdGF0aW9uRGVwcmVjYXRlZAorCQkJCXwgQW5ub3RhdGlvbkRvY3VtZW50ZWQKKwkJCQl8IEFubm90YXRpb25Jbmhlcml0ZWQKKwkJCQl8IEFubm90YXRpb25PdmVycmlkZQorCQkJCXwgQW5ub3RhdGlvblN1cHByZXNzV2FybmluZ3MKKwkJCQl8IEFubm90YXRpb25TYWZlVmFyYXJncworCQkJCXwgQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlOworCisJbG9uZyBEZWZhdWx0VmFsdWVSZXNvbHZlZCA9IEFTVE5vZGUuQml0NTRMOworCiAJLy8gc2V0IHdoZW4gdHlwZSBjb250YWlucyBub24tcHJpdmF0ZSBjb25zdHJ1Y3RvcihzKQotCWxvbmcgSGFzTm9uUHJpdmF0ZUNvbnN0cnVjdG9yID0gQVNUTm9kZS5CaXQ1M0w7CisJbG9uZyBIYXNOb25Qcml2YXRlQ29uc3RydWN0b3IgPSBBU1ROb2RlLkJpdDU1TDsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUJpbmRpbmcuamF2YQppbmRleCBhMDk5NGZhLi43ODcxMjExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsOSArNywxMiBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICAgU3RlcGhlbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDMxNzA0NgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaWxkY2FyZDsKIApAQCAtMjQsMTAgKzI3LDEwIEBACiAgKiBudWxsIGlzIE5PVCBhIHZhbGlkIHZhbHVlIGZvciBhIG5vbi1wdWJsaWMgZmllbGQuLi4gaXQganVzdCBtZWFucyB0aGUgZmllbGQgaXMgbm90IGluaXRpYWxpemVkLgogICovCiBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgVHlwZUJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIHsKLQkKKwogCXB1YmxpYyBpbnQgaWQgPSBUeXBlSWRzLk5vSWQ7CiAJcHVibGljIGxvbmcgdGFnQml0cyA9IDA7IC8vIFNlZSB2YWx1ZXMgaW4gdGhlIGludGVyZmFjZSBUYWdCaXRzIGJlbG93Ci0JCisKIAogCS8qKiBCYXNlIHR5cGUgZGVmaW5pdGlvbnMgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIEJhc2VUeXBlQmluZGluZyBJTlQgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKApAQCAtMTA0LDYgKzEwNywyMyBAQAogfQogCiAvKioKKyAqIEluIGNhc2Ugb2YgcHJvYmxlbXMsIHJldHVybnMgdGhlIGNsb3Nlc3QgbWF0Y2ggZm91bmQuIEl0IG1heSBub3QgYmUgcGVyZmVjdCBtYXRjaCwgYnV0IHRoZQorICogcmVzdWx0IG9mIGEgYmVzdCBlZmZvcnQgdG8gaW1wcm92ZSBmYXVsdC10b2xlcmFuY2UuCisgKi8KK3B1YmxpYyBUeXBlQmluZGluZyBjbG9zZXN0TWF0Y2goKSB7CisJcmV0dXJuIHRoaXM7IC8vIGJ5IGRlZmF1bHQgbm8gYmV0dGVyIHR5cGUKK30KKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggdGhlIHR5cGUgY29tcG9uZW50cyB0byBjb2xsZWN0IGluc3RhbmNlcyBvZiBsZWFmIG1pc3NpbmcgdHlwZXMKKyAqIEBwYXJhbSBtaXNzaW5nVHlwZXMKKyAqIEByZXR1cm4gbWlzc2luZyB0eXBlcworICovCitwdWJsaWMgTGlzdCBjb2xsZWN0TWlzc2luZ1R5cGVzKExpc3QgbWlzc2luZ1R5cGVzKSB7CisJcmV0dXJuIG1pc3NpbmdUeXBlczsKK30KKworLyoqCiAgKiBDb2xsZWN0IHRoZSBzdWJzdGl0dXRlcyBpbnRvIGEgbWFwIGZvciBjZXJ0YWluIHR5cGUgdmFyaWFibGVzIGluc2lkZSB0aGUgcmVjZWl2ZXIgdHlwZQogICogZS5nLiAgIENvbGxlY3Rpb248VD4uZmluZFN1YnN0aXR1dGUoVCwgQ29sbGVjdGlvbjxMaXN0PFg+Pik6ICAgVCAtLT4gTGlzdDxYPgogICogQ29uc3RyYWludHM6CkBAIC0xMTgsNyArMTM4LDcgQEAKIC8qKgogICogIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjb25zdGFudCBwb29sIG5hbWUuCiAgKiAgTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCi0gKiAgZS5nLiAnamF2YS9sYW5nL09iamVjdCcgCisgKiAgZS5nLiAnamF2YS9sYW5nL09iamVjdCcKICAqLwogcHVibGljIGFic3RyYWN0IGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKCk7CiAKQEAgLTE0NCwzNCArMTY0LDI5IEBACiB9CiAKIC8qKgotICogRmluZCBzdXBlcnR5cGUgd2hpY2ggZXJhc2VzIHRvIGEgZ2l2ZW4gd2VsbC1rbm93biB0eXBlLCBvciBudWxsIGlmIG5vdCBmb3VuZAorICogRmluZCBzdXBlcnR5cGUgd2hpY2ggb3JpZ2luYXRlcyBmcm9tIGEgZ2l2ZW4gd2VsbC1rbm93biB0eXBlLCBvciBudWxsIGlmIG5vdCBmb3VuZAogICogKHVzaW5nIGlkIGF2b2lkcyB0cmlnZ2VyaW5nIHRoZSBsb2FkIG9mIHdlbGwta25vd24gdHlwZTogNzM3NDApCiAgKiBOT1RFOiBvbmx5IHdvcmtzIGZvciBlcmFzdXJlcyBvZiB3ZWxsLWtub3duIHR5cGVzLCBhcyByYW5kb20gb3RoZXIgdHlwZXMgbWF5IHNoYXJlCiAgKiBzYW1lIGlkIHRob3VnaCBiZWluZyBkaXN0aW5jdHMuCi0gKgorICogQHNlZSBUeXBlSWRzCiAgKi8KLXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGZpbmRTdXBlclR5cGVFcmFzaW5nVG8oaW50IHdlbGxLbm93bkVyYXN1cmVJRCwgYm9vbGVhbiBlcmFzdXJlSXNDbGFzcykgeworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShpbnQgd2VsbEtub3duT3JpZ2luYWxJRCwgYm9vbGVhbiBvcmlnaW5hbElzQ2xhc3MpIHsKIAogCWlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgcmV0dXJuIG51bGw7CiAJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2UgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpczsKLQkKKwogICAgIC8vIGRvIG5vdCBhbGxvdyB0eXBlIHZhcmlhYmxlcyB0byBtYXRjaCB3aXRoIGVyYXN1cmVzIGZvciBmcmVlCi0gICAgaWYgKHJlZmVyZW5jZS5pZCA9PSB3ZWxsS25vd25FcmFzdXJlSUQgfHwgKCFpc1R5cGVWYXJpYWJsZSgpICYmICFpc0ludGVyc2VjdGlvblR5cGUoKSAgJiYgZXJhc3VyZSgpLmlkID09IHdlbGxLbm93bkVyYXN1cmVJRCkpIHJldHVybiByZWZlcmVuY2U7CisgICAgaWYgKHJlZmVyZW5jZS5pZCA9PSB3ZWxsS25vd25PcmlnaW5hbElEIHx8IChvcmlnaW5hbCgpLmlkID09IHdlbGxLbm93bk9yaWdpbmFsSUQpKSByZXR1cm4gcmVmZXJlbmNlOwogCiAgICAgUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlZmVyZW5jZTsKICAgICAvLyBpdGVyYXRlIHN1cGVyY2xhc3MgdG8gYXZvaWQgcmVjb3JkaW5nIGludGVyZmFjZXMgaWYgc2VhcmNoZWQgc3VwZXJ0eXBlIGlzIGNsYXNzCi0gICAgaWYgKGVyYXN1cmVJc0NsYXNzKSB7Ci0JCXdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpIHsgCi0JCQlpZiAoY3VycmVudFR5cGUuaWQgPT0gd2VsbEtub3duRXJhc3VyZUlEKQorICAgIGlmIChvcmlnaW5hbElzQ2xhc3MpIHsKKwkJd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRUeXBlLmlkID09IHdlbGxLbm93bk9yaWdpbmFsSUQpCiAJCQkJcmV0dXJuIGN1cnJlbnRUeXBlOwotCQkJc3dpdGNoKGN1cnJlbnRUeXBlLmtpbmQoKSkgewotCQkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgotCQkJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6Ci0JCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgotCQkJCQlpZiAoY3VycmVudFR5cGUuZXJhc3VyZSgpLmlkID09IHdlbGxLbm93bkVyYXN1cmVJRCkgCi0JCQkJCQlyZXR1cm4gY3VycmVudFR5cGU7Ci0JCQl9Ci0JCX0gICAgCisJCQlpZiAoY3VycmVudFR5cGUub3JpZ2luYWwoKS5pZCA9PSB3ZWxsS25vd25PcmlnaW5hbElEKQorCQkJCXJldHVybiBjdXJyZW50VHlwZTsKKwkJfQogCQlyZXR1cm4gbnVsbDsKICAgICB9CiAJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXNUb1Zpc2l0ID0gbnVsbDsKQEAgLTE5NSwxOCArMjEwLDEzIEBACiAJCQl9CiAJCX0KIAl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwotCQkJCisKIAlmb3IgKGludCBpID0gMDsgaSA8IG5leHRQb3NpdGlvbjsgaSsrKSB7CiAJCWN1cnJlbnRUeXBlID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07Ci0JCWlmIChjdXJyZW50VHlwZS5pZCA9PSB3ZWxsS25vd25FcmFzdXJlSUQpCisJCWlmIChjdXJyZW50VHlwZS5pZCA9PSB3ZWxsS25vd25PcmlnaW5hbElEKQogCQkJcmV0dXJuIGN1cnJlbnRUeXBlOwotCQlzd2l0Y2goY3VycmVudFR5cGUua2luZCgpKSB7Ci0JCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKLQkJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6Ci0JCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6IAotCQkJCWlmIChjdXJyZW50VHlwZS5lcmFzdXJlKCkuaWQgPT0gd2VsbEtub3duRXJhc3VyZUlEKSAKLQkJCQkJcmV0dXJuIGN1cnJlbnRUeXBlOwotCQl9CisJCWlmIChjdXJyZW50VHlwZS5vcmlnaW5hbCgpLmlkID09IHdlbGxLbm93bk9yaWdpbmFsSUQpCisJCQlyZXR1cm4gY3VycmVudFR5cGU7CiAJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CiAJCWlmIChpdHNJbnRlcmZhY2VzICE9IG51bGwgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewogCQkJaW50IGl0c0xlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOwpAQCAtMjI0LDEzICsyMzQsMTIgQEAKIH0KIAogLyoqCi0gKiBGaW5kIHN1cGVydHlwZSB3aGljaCBlcmFzZXMgdG8gYSBnaXZlbiB0eXBlLCBvciBudWxsIGlmIG5vdCBmb3VuZAorICogRmluZCBzdXBlcnR5cGUgd2hpY2ggb3JpZ2luYXRlcyBmcm9tIGEgZ2l2ZW4gdHlwZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKICAqLwotcHVibGljIFR5cGVCaW5kaW5nIGZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoVHlwZUJpbmRpbmcgb3RoZXJUeXBlKSB7CitwdWJsaWMgVHlwZUJpbmRpbmcgZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShUeXBlQmluZGluZyBvdGhlclR5cGUpIHsKIAlpZiAodGhpcyA9PSBvdGhlclR5cGUpIHJldHVybiB0aGlzOwogCWlmIChvdGhlclR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JaW50IGtpbmQ7Ci0Jc3dpdGNoKGtpbmQgPSBraW5kKCkpIHsKKwlzd2l0Y2goa2luZCgpKSB7CiAJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKIAkJCUFycmF5QmluZGluZyBhcnJheVR5cGUgPSAoQXJyYXlCaW5kaW5nKSB0aGlzOwogCQkJaW50IG90aGVyRGltID0gb3RoZXJUeXBlLmRpbWVuc2lvbnMoKTsKQEAgLTI0Nyw1NCArMjU2LDM5IEBACiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCQlpZiAoIShhcnJheVR5cGUubGVhZkNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgcmV0dXJuIG51bGw7Ci0JCQlUeXBlQmluZGluZyBsZWFmU3VwZXJUeXBlID0gYXJyYXlUeXBlLmxlYWZDb21wb25lbnRUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUob3RoZXJUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkpOworCQkJVHlwZUJpbmRpbmcgbGVhZlN1cGVyVHlwZSA9IGFycmF5VHlwZS5sZWFmQ29tcG9uZW50VHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKG90aGVyVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKIAkJCWlmIChsZWFmU3VwZXJUeXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJcmV0dXJuIGFycmF5VHlwZS5lbnZpcm9ubWVudCgpLmNyZWF0ZUFycmF5VHlwZShsZWFmU3VwZXJUeXBlLCBhcnJheVR5cGUuZGltZW5zaW9ucyk7CQotCQkJCisJCQlyZXR1cm4gYXJyYXlUeXBlLmVudmlyb25tZW50KCkuY3JlYXRlQXJyYXlUeXBlKGxlYWZTdXBlclR5cGUsIGFycmF5VHlwZS5kaW1lbnNpb25zKTsKKwogCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgogCQkgICAgaWYgKGlzQ2FwdHVyZSgpKSB7CiAJCSAgICAJQ2FwdHVyZUJpbmRpbmcgY2FwdHVyZSA9IChDYXB0dXJlQmluZGluZykgdGhpczsKIAkJICAgIAlUeXBlQmluZGluZyBjYXB0dXJlQm91bmQgPSBjYXB0dXJlLmZpcnN0Qm91bmQ7CiAJCSAgICAJaWYgKGNhcHR1cmVCb3VuZCBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgewotCQkgICAgCQlUeXBlQmluZGluZyBtYXRjaCA9IGNhcHR1cmVCb3VuZC5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKG90aGVyVHlwZSk7CisJCSAgICAJCVR5cGVCaW5kaW5nIG1hdGNoID0gY2FwdHVyZUJvdW5kLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20ob3RoZXJUeXBlKTsKIAkJICAgIAkJaWYgKG1hdGNoICE9IG51bGwpIHJldHVybiBtYXRjaDsKIAkJICAgIAl9CiAJCSAgICB9Ci0JCQkvLyBmYWxsLXRocm91Z2gKKwkJCS8vJEZBTEwtVEhST1VHSCQKIAkJY2FzZSBCaW5kaW5nLlRZUEUgOgogCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKIAkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRSA6CiAJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CiAJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQkgICAgLy8gZG8gbm90IGFsbG93IHR5cGUgdmFyaWFibGVzL2ludGVyc2VjdGlvbiB0eXBlcyB0byBtYXRjaCB3aXRoIGVyYXN1cmVzIGZvciBmcmVlCi0JCQlzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgewotCQkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgotCQkJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6Ci0JCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOiAKLQkJCQkJb3RoZXJUeXBlID0gb3RoZXJUeXBlLmVyYXN1cmUoKTsKLQkJCX0KKwkJCW90aGVyVHlwZSA9IG90aGVyVHlwZS5vcmlnaW5hbCgpOwogCQkgICAgaWYgKHRoaXMgPT0gb3RoZXJUeXBlKQogCQkgICAgCXJldHVybiB0aGlzOwotCQkJc3dpdGNoKGtpbmQpIHsKLQkJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKLQkJCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgotCQkJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDogCi0JCQkJCWlmIChlcmFzdXJlKCkgPT0gb3RoZXJUeXBlKQotCQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCSAgICAKKwkJICAgIGlmIChvcmlnaW5hbCgpID09IG90aGVyVHlwZSkKKwkJICAgIAlyZXR1cm4gdGhpczsKIAkJICAgIFJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZyl0aGlzOwogCQkgICAgaWYgKCFvdGhlclR5cGUuaXNJbnRlcmZhY2UoKSkgewogCQkJCXdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpIHsKIAkJCQkJaWYgKGN1cnJlbnRUeXBlID09IG90aGVyVHlwZSkKIAkJCQkJCXJldHVybiBjdXJyZW50VHlwZTsKLQkJCQkJc3dpdGNoKGN1cnJlbnRUeXBlLmtpbmQoKSkgewotCQkJCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6Ci0JCQkJCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOgotCQkJCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOiAKLQkJCQkJCQlpZiAoY3VycmVudFR5cGUuZXJhc3VyZSgpID09IG90aGVyVHlwZSkKLQkJCQkJCQkJcmV0dXJuIGN1cnJlbnRUeXBlOwotCQkJCQl9CQkJCQkKKwkJCQkJaWYgKGN1cnJlbnRUeXBlLm9yaWdpbmFsKCkgPT0gb3RoZXJUeXBlKQorCQkJCQkJcmV0dXJuIGN1cnJlbnRUeXBlOwogCQkJCX0KIAkJCQlyZXR1cm4gbnVsbDsKIAkJICAgIH0KQEAgLTMwMiw3ICsyOTYsNyBAQAogCQkJaW50IG5leHRQb3NpdGlvbiA9IDA7CiAJCQlkbyB7CiAJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKLQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgeworCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IG51bGwgJiYgaXRzSW50ZXJmYWNlcyAhPSBCaW5kaW5nLk5PX1NVUEVSSU5URVJGQUNFUykgewogCQkJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkgewogCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBpdHNJbnRlcmZhY2VzOwogCQkJCQkJbmV4dFBvc2l0aW9uID0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoOwpAQCAtMzE5LDIwICszMTMsMTUgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7Ci0JCQkJCQorCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRQb3NpdGlvbjsgaSsrKSB7CiAJCQkJY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKIAkJCQlpZiAoY3VycmVudFR5cGUgPT0gb3RoZXJUeXBlKQogCQkJCQlyZXR1cm4gY3VycmVudFR5cGU7Ci0JCQkJc3dpdGNoKGN1cnJlbnRUeXBlLmtpbmQoKSkgewotCQkJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFIDoKLQkJCQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFIDoKLQkJCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOiAKLQkJCQkJCWlmIChjdXJyZW50VHlwZS5lcmFzdXJlKCkgPT0gb3RoZXJUeXBlKQotCQkJCQkJCXJldHVybiBjdXJyZW50VHlwZTsKLQkJCQl9CQkJCQkKKwkJCQlpZiAoY3VycmVudFR5cGUub3JpZ2luYWwoKSA9PSBvdGhlclR5cGUpCisJCQkJCXJldHVybiBjdXJyZW50VHlwZTsKIAkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOwotCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CisJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gbnVsbCAmJiBpdHNJbnRlcmZhY2VzICE9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTKSB7CiAJCQkJCWludCBpdHNMZW5ndGggPSBpdHNJbnRlcmZhY2VzLmxlbmd0aDsKIAkJCQkJaWYgKG5leHRQb3NpdGlvbiArIGl0c0xlbmd0aCA+PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCiAJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW25leHRQb3NpdGlvbiArIGl0c0xlbmd0aCArIDVdLCAwLCBuZXh0UG9zaXRpb24pOwpAQCAtMzUxLDEzICszNDAsMTQgQEAKIC8qKgogICogUmV0dXJucyB0aGUgdHlwZSB0byB1c2UgZm9yIGdlbmVyaWMgY2FzdCwgb3IgbnVsbCBpZiBub25lIHJlcXVpcmVkCiAgKi8KLXB1YmxpYyBUeXBlQmluZGluZyBnZW5lcmljQ2FzdChUeXBlQmluZGluZyBvdGhlclR5cGUpIHsKLQlpZiAodGhpcyA9PSBvdGhlclR5cGUpCitwdWJsaWMgVHlwZUJpbmRpbmcgZ2VuZXJpY0Nhc3QoVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSkgeworCWlmICh0aGlzID09IHRhcmdldFR5cGUpIAogCQlyZXR1cm4gbnVsbDsKLQlUeXBlQmluZGluZyBvdGhlckVyYXN1cmUgPSBvdGhlclR5cGUuZXJhc3VyZSgpOwotCWlmIChvdGhlckVyYXN1cmUgPT0gdGhpcy5lcmFzdXJlKCkpCisJVHlwZUJpbmRpbmcgdGFyZ2V0RXJhc3VyZSA9IHRhcmdldFR5cGUuZXJhc3VyZSgpOworCS8vIHR5cGUgdmFyIGdldCByZXBsYWNlZCBieSB1cHBlciBib3VuZAorCWlmIChlcmFzdXJlKCkuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbSh0YXJnZXRFcmFzdXJlKSAhPSBudWxsKSAKIAkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIG90aGVyRXJhc3VyZTsKKwlyZXR1cm4gdGFyZ2V0RXJhc3VyZTsKIH0KIAogLyoqCkBAIC0zNjksOCArMzU5LDU3IEBACiAJcmV0dXJuIHNpZ25hdHVyZSgpOwogfQogCisvKioKKyAqIFJldHVybiB0aGUgc3VwZXJ0eXBlIHdoaWNoIHdvdWxkIGVyYXNlIGFzIGEgc3VidHlwZSBvZiBhIGdpdmVuIGRlY2xhcmluZyBjbGFzcy4KKyAqIElmIHRoZSByZWNlaXZlciBpcyBhbHJlYWR5IGVyYXN1cmUgY29tcGF0aWJsZSwgdGhlbiBpdCB3aWxsIHJldHVybmVkLiBJZiBub3QsIHRoZW4gd2lsbCByZXR1cm4gdGhlIGFsdGVybmF0ZSBsb3dlc3QKKyAqIHVwcGVyIGJvdW5kIGNvbXBhdGlibGUgd2l0aCBkZWNsYXJpbmcgY2xhc3MuCisgKiBOT1RFOiB0aGUgZGVjbGFyaW5nQ2xhc3MgaXMgYWxyZWFkeSBrbm93IHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVjZWl2ZXIKKyAqIEBwYXJhbSBkZWNsYXJpbmdDbGFzcyB0byBsb29rIGZvcgorICogQHJldHVybiB0aGUgbG93ZXN0IGVyYXN1cmUgY29tcGF0aWJsZSB0eXBlIChjb25zaWRlcmluZyBhbHRlcm5hdGUgYm91bmRzKQorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0RXJhc3VyZUNvbXBhdGlibGVUeXBlKFR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7CisJc3dpdGNoKGtpbmQoKSkgeworCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVIgOgorCQkJVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSB0aGlzOworCQkJaWYgKHZhcmlhYmxlLmVyYXN1cmUoKS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGRlY2xhcmluZ0NsYXNzKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoaXM7IC8vIG5vIG5lZWQgZm9yIGFsdGVybmF0ZSByZWNlaXZlciB0eXBlCisJCQl9CisJCQlpZiAodmFyaWFibGUuc3VwZXJjbGFzcyAhPSBudWxsICYmIHZhcmlhYmxlLnN1cGVyY2xhc3MuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShkZWNsYXJpbmdDbGFzcykgIT0gbnVsbCkgeworCQkJCXJldHVybiB2YXJpYWJsZS5zdXBlcmNsYXNzLmdldEVyYXN1cmVDb21wYXRpYmxlVHlwZShkZWNsYXJpbmdDbGFzcyk7CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgb3RoZXJMZW5ndGggPSB2YXJpYWJsZS5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgb3RoZXJMZW5ndGg7IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSB2YXJpYWJsZS5zdXBlckludGVyZmFjZXNbaV07CisJCQkJaWYgKHN1cGVySW50ZXJmYWNlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZGVjbGFyaW5nQ2xhc3MpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHN1cGVySW50ZXJmYWNlLmdldEVyYXN1cmVDb21wYXRpYmxlVHlwZShkZWNsYXJpbmdDbGFzcyk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRoaXM7IC8vIG9ubHkgb2NjdXIgaWYgcGFzc2VkIG51bGwgZGVjbGFyaW5nQ2xhc3MgZm9yIGFycmF5bGVuZ3RoCisJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQlXaWxkY2FyZEJpbmRpbmcgaW50ZXJzZWN0aW9uID0gKFdpbGRjYXJkQmluZGluZykgdGhpczsKKwkJCWlmIChpbnRlcnNlY3Rpb24uZXJhc3VyZSgpLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZGVjbGFyaW5nQ2xhc3MpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhpczsgLy8gbm8gbmVlZCBmb3IgYWx0ZXJuYXRlIHJlY2VpdmVyIHR5cGUKKwkJCX0KKwkJCWlmIChpbnRlcnNlY3Rpb24uc3VwZXJjbGFzcyAhPSBudWxsICYmIGludGVyc2VjdGlvbi5zdXBlcmNsYXNzLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oZGVjbGFyaW5nQ2xhc3MpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gaW50ZXJzZWN0aW9uLnN1cGVyY2xhc3MuZ2V0RXJhc3VyZUNvbXBhdGlibGVUeXBlKGRlY2xhcmluZ0NsYXNzKTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwLCBvdGhlckxlbmd0aCA9IGludGVyc2VjdGlvbi5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgb3RoZXJMZW5ndGg7IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSBpbnRlcnNlY3Rpb24uc3VwZXJJbnRlcmZhY2VzW2ldOworCQkJCWlmIChzdXBlckludGVyZmFjZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKGRlY2xhcmluZ0NsYXNzKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBzdXBlckludGVyZmFjZS5nZXRFcmFzdXJlQ29tcGF0aWJsZVR5cGUoZGVjbGFyaW5nQ2xhc3MpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0aGlzOyAvLyBvbmx5IG9jY3VyIGlmIHBhc3NlZCBudWxsIGRlY2xhcmluZ0NsYXNzIGZvciBhcnJheWxlbmd0aAorCQlkZWZhdWx0IDoKKwkJCXJldHVybiB0aGlzOworCX0KK30KKwogcHVibGljIGFic3RyYWN0IFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoKTsKIAordm9pZCBpbml0aWFsaXplRm9yU3RhdGljSW1wb3J0cygpIHsKKwkvLyBvbmx5IGFwcGxpY2FibGUgdG8gc291cmNlIHR5cGVzCit9CisKIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblR5cGUoKSB7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtNDI2LDggKzQ2NSwxMSBAQAogCQlyZXR1cm4gdHJ1ZTsKIAlpZiAob3RoZXJUeXBlID09IG51bGwpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAob3RoZXJUeXBlLmlzV2lsZGNhcmQoKSkgLy8gd2lsZGNhcmQKLQkJcmV0dXJuICgoV2lsZGNhcmRCaW5kaW5nKSBvdGhlclR5cGUpLmJvdW5kQ2hlY2sodGhpcyk7CisJc3dpdGNoIChvdGhlclR5cGUua2luZCgpKSB7CisJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKKwkJCXJldHVybiAoKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlKS5ib3VuZENoZWNrKHRoaXMpOworCX0KIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTQ0NiwxMyArNDg4LDYgQEAKIH0KIAogLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgYSB0eXBlIGlzIGludGVyc2VjdGluZyB3aXRoIGFub3RoZXIgb25lLAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0ludGVyc2VjdGluZ1dpdGgoVHlwZUJpbmRpbmcgb3RoZXJUeXBlKSB7Ci0JcmV0dXJuIHRoaXMgPT0gb3RoZXJUeXBlOwotfQotCi0vKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0eXBlIGRlbm90ZXMgYW4gaW50ZXJzZWN0aW9uIHR5cGU6IE51bWJlciAmIENvbXBhcmFibGU8Pz4KICAqLwogcHVibGljIGJvb2xlYW4gaXNJbnRlcnNlY3Rpb25UeXBlKCkgewpAQCAtNDcyLDcgKzUwNyw3IEBACiB9CiAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTnVtZXJpY1R5cGUoKSB7Ci0Jc3dpdGNoIChpZCkgeworCXN3aXRjaCAodGhpcy5pZCkgewogCWNhc2UgVHlwZUlkcy5UX2ludDoKIAljYXNlIFR5cGVJZHMuVF9mbG9hdDoKIAljYXNlIFR5cGVJZHMuVF9kb3VibGU6CkBAIC00ODcsMjIgKzUyMiwzNSBAQAogfQogCiAvKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBwYXJhbWV0ZXJpemVkLCBlLmcuIExpc3Q8U3RyaW5nPgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIHBhcmFtZXRlcml6ZWQsIGUuZy4gTGlzdDxTdHJpbmc+LgorICogTm90ZSB0aGF0IHNvbWUgaW5zdGFuY2VzIG9mIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBoYXZlIG5vIGFyZ3VtZW50cywgbGlrZSBmb3Igbm9uLWdlbmVyaWMgbWVtYmVycyAKKyAqIG9mIGEgcGFyYW1ldGVyaXplZCB0eXBlLiBVc2Uge0BsaW5rICNpc1BhcmFtZXRlcml6ZWRUeXBlV2l0aEFjdHVhbEFyZ3VtZW50cygpfSBpbnN0ZWFkIHRvIGZpbmQgb3V0LgogICovCi1wdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWRUeXBlKCkgewotCXJldHVybiBmYWxzZTsKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzUGFyYW1ldGVyaXplZFR5cGUoKSB7CisJcmV0dXJuIGtpbmQoKSA9PSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgcGFyYW1ldGVyaXplZCwgZS5nLiBMaXN0PFN0cmluZz4KKyAqIE5vdGUgdGhhdCBzb21lIGluc3RhbmNlcyBvZiBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgZG8gYW5zd2VyIGZhbHNlIHRvIHtAbGluayAjaXNQYXJhbWV0ZXJpemVkVHlwZSgpfQorICogaW4gY2FzZSB0aGV5IGhhdmUgbm8gYXJndW1lbnRzLCBsaWtlIGZvciBub24tZ2VuZXJpYyBtZW1iZXJzIG9mIGEgcGFyYW1ldGVyaXplZCB0eXBlLgorICogaS5lLiB7QGxpbmsgI2lzUGFyYW1ldGVyaXplZFR5cGUoKX0gaXMgbm90IGVxdWl2YWxlbnQgdG8gdGVzdGluZyA8Y29kZT50eXBlLmtpbmQoKSA9PSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRTwvY29kZT4KKyAqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkVHlwZVdpdGhBY3R1YWxBcmd1bWVudHMoKSB7CisJcmV0dXJuIChraW5kKCkgPT0gQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUpIAorCQkJCQkmJiAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcykuYXJndW1lbnRzICE9IG51bGw7CiB9CiAKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIHBhcmFtZXRlcml6ZWQgdXNpbmcgaXRzIG93biB0eXBlIHZhcmlhYmxlcyBhcyBhcmd1bWVudHMKICAqLwogcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkV2l0aE93blZhcmlhYmxlcygpIHsKLQlpZiAodGhpcy5raW5kKCkgIT0gQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUpCisJaWYgKGtpbmQoKSAhPSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSkKIAkJcmV0dXJuIGZhbHNlOwogCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzOwogCWlmIChwYXJhbVR5cGUuYXJndW1lbnRzID09IG51bGwpCiAJCXJldHVybiBmYWxzZTsKLQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdmFyaWFibGVzID0gdGhpcy5lcmFzdXJlKCkudHlwZVZhcmlhYmxlcygpOworCVR5cGVWYXJpYWJsZUJpbmRpbmdbXSB2YXJpYWJsZXMgPSBlcmFzdXJlKCkudHlwZVZhcmlhYmxlcygpOwogCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YXJpYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJaWYgKHZhcmlhYmxlc1tpXSAhPSBwYXJhbVR5cGUuYXJndW1lbnRzW2ldKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNTE1LDI0OCArNTYzLDE0MiBAQAogCXJldHVybiB0cnVlOwogfQogCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHR5cGVzIGFyZSBzdGF0aWNhbGx5IGtub3duIHRvIGJlIGRpZmZlcmVudCBhdCBjb21waWxlLXRpbWUsCi0gKiBlLmcuIGEgdHlwZSB2YXJpYWJsZSBpcyBub3QgcHJvdmFibHkga25vd24gdG8gYmUgZGlzdGluY3QgZnJvbSBhbm90aGVyIHR5cGUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcm92YWJseURpc3RpbmN0RnJvbShUeXBlQmluZGluZyBvdGhlclR5cGUsIGludCBkZXB0aCkgewotCWlmICh0aGlzID09IG90aGVyVHlwZSkKK3ByaXZhdGUgYm9vbGVhbiBpc1Byb3ZhYmxlRGlzdGluY3RTdWJUeXBlKFR5cGVCaW5kaW5nIG90aGVyVHlwZSkgeworCWlmIChvdGhlclR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQlpZiAoaXNJbnRlcmZhY2UoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGlzQXJyYXlUeXBlKCkKKwkJCQl8fCAoKHRoaXMgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSAmJiAoKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMpLmlzRmluYWwoKSkKKwkJCQl8fCAoaXNUeXBlVmFyaWFibGUoKSAmJiAoKFR5cGVWYXJpYWJsZUJpbmRpbmcpdGhpcykuc3VwZXJjbGFzcygpLmlzRmluYWwoKSkpIHsKKwkJCXJldHVybiAhaXNDb21wYXRpYmxlV2l0aChvdGhlclR5cGUpOworCQl9CiAJCXJldHVybiBmYWxzZTsKLQlpZiAoZGVwdGggPiAxKQotCQlyZXR1cm4gdHJ1ZTsKLQlzd2l0Y2ggKG90aGVyVHlwZS5raW5kKCkpIHsKLQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgotCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0Jc3dpdGNoIChraW5kKCkpIHsKLQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI6Ci0JY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEU6Ci0JCXJldHVybiBmYWxzZTsKLQotCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEU6Ci0JCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXM7Ci0JCWlmIChwYXJhbWV0ZXJpemVkVHlwZS5nZW5lcmljVHlwZSgpLmlzUHJvdmFibHlEaXN0aW5jdEZyb20ob3RoZXJUeXBlLmVyYXN1cmUoKSwgZGVwdGgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXN3aXRjaCAob3RoZXJUeXBlLmtpbmQoKSkgewotCQljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFOgotCQljYXNlIEJpbmRpbmcuUkFXX1RZUEU6Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEU6Ci0JCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IHBhcmFtZXRlcml6ZWRUeXBlLmFyZ3VtZW50czsKLQkJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgb3RoZXJQYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIG90aGVyVHlwZTsKLQkJCVR5cGVCaW5kaW5nW10gb3RoZXJBcmd1bWVudHMgPSBvdGhlclBhcmFtZXRlcml6ZWRUeXBlLmFyZ3VtZW50czsKLQkJCWlmIChvdGhlckFyZ3VtZW50cyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYXJndW1lbnRzW2ldLmlzUHJvdmFibHlEaXN0aW5jdEZyb20ob3RoZXJBcmd1bWVudHNbaV0sIGRlcHRoICsgMSkpCi0JCQkJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmIChpc0ludGVyZmFjZSgpKSB7CisJCQlpZiAob3RoZXJUeXBlLmlzQXJyYXlUeXBlKCkKKwkJCQkJfHwgKChvdGhlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSAmJiAoKFJlZmVyZW5jZUJpbmRpbmcpIG90aGVyVHlwZSkuaXNGaW5hbCgpKQorCQkJCQl8fCAob3RoZXJUeXBlLmlzVHlwZVZhcmlhYmxlKCkgJiYgKChUeXBlVmFyaWFibGVCaW5kaW5nKW90aGVyVHlwZSkuc3VwZXJjbGFzcygpLmlzRmluYWwoKSkpIHsKKwkJCQlyZXR1cm4gIWlzQ29tcGF0aWJsZVdpdGgob3RoZXJUeXBlKTsKIAkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQorCQl9IGVsc2UgeworCQkJaWYgKCFpc1R5cGVWYXJpYWJsZSgpICYmICFvdGhlclR5cGUuaXNUeXBlVmFyaWFibGUoKSkgeworCQkJCXJldHVybiAhaXNDb21wYXRpYmxlV2l0aChvdGhlclR5cGUpOworCQkJfQogCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCaW5kaW5nLlJBV19UWVBFOgotCQlpZiAoZGVwdGggPiAwKSByZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZXJhc3VyZSgpLmlzUHJvdmFibHlEaXN0aW5jdEZyb20ob3RoZXJUeXBlLmVyYXN1cmUoKSwgMCk7Ci0KLQljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFOgotCQlpZiAoZGVwdGggPiAwKSByZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMgIT0gb3RoZXJUeXBlLmVyYXN1cmUoKTsKIAl9Ci0JcmV0dXJuIHRoaXMgIT0gb3RoZXJUeXBlOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1Jhd1R5cGUoKSB7CiAJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKLSAqIEpMUygzKSA0LjcuIAotICogTm90ZTogRm9vPD8+LkJhciBpcyBhbHNvIHJlaWZpYWJsZQorICogUmV0dXJucyB0cnVlIGlmIGEgdHlwZSBpcyBwcm92YWJseSBkaXN0aW5jdCBmcm9tIGFub3RoZXIgb25lLAogICovCi1wdWJsaWMgYm9vbGVhbiBpc1JlaWZpYWJsZSgpIHsKK3B1YmxpYyBib29sZWFuIGlzUHJvdmFibHlEaXN0aW5jdChUeXBlQmluZGluZyBvdGhlclR5cGUpIHsKIAotCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gbGVhZkNvbXBvbmVudFR5cGUoKTsKLQlpZiAoIShsZWFmVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKQotCQlyZXR1cm4gdHJ1ZTsKLQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnQgPSAoUmVmZXJlbmNlQmluZGluZykgbGVhZlR5cGU7Ci0JZG8gewotCQlzd2l0Y2ggKGN1cnJlbnQua2luZCgpKSB7CisJLyogV2l0aCB0aGUgaHlicmlkIDEuNC8xLjUrIHByb2plY3RzIG1vZGVzLCB3aGlsZSBlc3RhYmxpc2hpbmcgdHlwZSBlcXVpdmFsZW5jZSwgd2UgbmVlZCB0bworCSAgIGJlIHByZXBhcmVkIGZvciBhIHR5cGUgc3VjaCBhcyBNYXAgYXBwZWFyaW5nIGluIG9uZSBvZiB0aHJlZSBmb3JtczogQXMgKGEpIGEgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIAorCSAgIGUuZyBNYXA8U3RyaW5nLCBTdHJpbmc+LCAoYikgYXMgUmF3VHlwZUJpbmRpbmcgTWFwI1JBVyBhbmQgZmluYWxseSAoYykgYXMgYSBCaW5hcnlUeXBlQmluZGluZyAKKwkgICBXaGVuIHRoZSB1c2FnZSBvZiBhIHR5cGUgbGFja3MgdHlwZSBwYXJhbWV0ZXJzLCB3aGV0aGVyIHdlIGxhbmQgdXAgd2l0aCB0aGUgcmF3IGZvcm0gb3Igbm90IGRlcGVuZHMKKwkgICBvbiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHR5cGUgd2FzICJzZWVuIHRvIGJlIiBhIGdlbmVyaWMgdHlwZSBpbiB0aGUgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudCBvcgorCSAgIG5vdC4gU2VlOgorCSAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NTY1CisgICAgICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg4MjcgCisgICAgICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1ODgKKwkgKi8gCiAKLQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgotCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKLQkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRToKLQkJCXJldHVybiBmYWxzZTsKLQotCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFOgotCQkJaWYgKGN1cnJlbnQuaXNCb3VuZFBhcmFtZXRlcml6ZWRUeXBlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCaW5kaW5nLlJBV19UWVBFOgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGN1cnJlbnQuaXNTdGF0aWMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoY3VycmVudC5pc0xvY2FsVHlwZSgpKSB7Ci0JCQlOZXN0ZWRUeXBlQmluZGluZyBuZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBjdXJyZW50LmVyYXN1cmUoKTsKLQkJCWlmIChuZXN0ZWRUeXBlLnNjb3BlLm1ldGhvZFNjb3BlKCkuaXNTdGF0aWMpIHJldHVybiB0cnVlOwotCQl9Ci0JfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LmVuY2xvc2luZ1R5cGUoKSkgIT0gbnVsbCk7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIHR5cGUgbWF5IGJlIHRocm93bgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1Rocm93YWJsZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIEpMUzM6IDQuNS4xLjEKLXB1YmxpYyBib29sZWFuIGlzVHlwZUFyZ3VtZW50Q29udGFpbmVkQnkoVHlwZUJpbmRpbmcgb3RoZXJUeXBlKSB7CiAJaWYgKHRoaXMgPT0gb3RoZXJUeXBlKQotCQlyZXR1cm4gdHJ1ZTsKLQlzd2l0Y2ggKG90aGVyVHlwZS5raW5kKCkpIHsKLQkvLyBhbGxvdyB3aWxkY2FyZCBjb250YWlubWVudAotCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFOgotCQlUeXBlQmluZGluZyBsb3dlckJvdW5kID0gdGhpczsKLQkJVHlwZUJpbmRpbmcgdXBwZXJCb3VuZCA9IHRoaXM7Ci0JCXN3aXRjaCAodGhpcy5raW5kKCkpIHsKLQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEU6Ci0JCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSB0aGlzOwotCQkJc3dpdGNoICh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKLQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKLQkJCQlpZiAod2lsZGNhcmQub3RoZXJCb3VuZHMgIT0gbnVsbCkgLy8gaW50ZXJzZWN0aW9uIHR5cGUKLQkJCQkJYnJlYWs7Ci0JCQkJdXBwZXJCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOwotCQkJCWxvd2VyQm91bmQgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXaWxkY2FyZC5TVVBFUjoKLQkJCQl1cHBlckJvdW5kID0gd2lsZGNhcmQ7Ci0JCQkJbG93ZXJCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOgotCQkJCXVwcGVyQm91bmQgPSB3aWxkY2FyZDsKLQkJCQlsb3dlckJvdW5kID0gbnVsbDsKLQkJCX0KKwkgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChvdGhlclR5cGUgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBzd2l0Y2ggKGtpbmQoKSkgeworCisJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkgICAgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIHBhcmFtVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXM7CisJCSAgICBzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgeworCQkgICAgCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgb3RoZXJQYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBvdGhlclR5cGU7CisJCSAgICAgICAgICAgIGlmIChwYXJhbVR5cGUuZ2VuZXJpY1R5cGUoKSAhPSBvdGhlclBhcmFtVHlwZS5nZW5lcmljVHlwZSgpKQorCQkgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisJCSAgICAgICAgICAgIGlmICghcGFyYW1UeXBlLmlzU3RhdGljKCkpIHsgLy8gc3RhdGljIG1lbWJlciB0eXBlcyBkbyBub3QgY29tcGFyZSB0aGVpciBlbmNsb3NpbmcKKwkJICAgICAgICAgICAgCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nID0gZW5jbG9zaW5nVHlwZSgpOworCQkgICAgICAgICAgICAJaWYgKGVuY2xvc2luZyAhPSBudWxsKSB7CisJCSAgICAgICAgICAgIAkJUmVmZXJlbmNlQmluZGluZyBvdGhlckVuY2xvc2luZyA9IG90aGVyUGFyYW1UeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJICAgICAgICAgICAgCQlpZiAob3RoZXJFbmNsb3NpbmcgPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCSAgICAgICAgICAgIAkJaWYgKChvdGhlckVuY2xvc2luZy50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgPT0gMCkgeworCQkgICAgICAgICAgICAJCQlpZiAoZW5jbG9zaW5nLmlzUHJvdmFibHlEaXN0aW5jdChvdGhlckVuY2xvc2luZykpIHJldHVybiB0cnVlOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyOTE5CisJCSAgICAgICAgICAgIAkJfSBlbHNlIHsKKwkJICAgICAgICAgICAgCQkJaWYgKCFlbmNsb3NpbmcuaXNFcXVpdmFsZW50VG8ob3RoZXJQYXJhbVR5cGUuZW5jbG9zaW5nVHlwZSgpKSkgcmV0dXJuIHRydWU7CisJCSAgICAgICAgICAgIAkJfQorCQkgICAgICAgICAgICAJfQorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGludCBsZW5ndGggPSBwYXJhbVR5cGUuYXJndW1lbnRzID09IG51bGwgPyAwIDogcGFyYW1UeXBlLmFyZ3VtZW50cy5sZW5ndGg7CisJCSAgICAgICAgICAgIFR5cGVCaW5kaW5nW10gb3RoZXJBcmd1bWVudHMgPSBvdGhlclBhcmFtVHlwZS5hcmd1bWVudHM7CisJCSAgICAgICAgICAgIGludCBvdGhlckxlbmd0aCA9IG90aGVyQXJndW1lbnRzID09IG51bGwgPyAwIDogb3RoZXJBcmd1bWVudHMubGVuZ3RoOworCQkgICAgICAgICAgICBpZiAob3RoZXJMZW5ndGggIT0gbGVuZ3RoKQorCQkgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisJCSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJICAgICAgICAgICAgCWlmIChwYXJhbVR5cGUuYXJndW1lbnRzW2ldLmlzUHJvdmFibHlEaXN0aW5jdFR5cGVBcmd1bWVudChvdGhlckFyZ3VtZW50c1tpXSwgcGFyYW1UeXBlLCBpKSkKKwkJICAgICAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKKwkJICAgICAgICAgICAgfQorCQkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAgIAljYXNlIEJpbmRpbmcuR0VORVJJQ19UWVBFIDoKKwkJICAgICAgICAgICAgaWYgKHBhcmFtVHlwZS5nZW5lcmljVHlwZSgpICE9IG90aGVyVHlwZSkKKwkJICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCQkgICAgICAgICAgICBpZiAoIXBhcmFtVHlwZS5pc1N0YXRpYygpKSB7IC8vIHN0YXRpYyBtZW1iZXIgdHlwZXMgZG8gbm90IGNvbXBhcmUgdGhlaXIgZW5jbG9zaW5nCisJCSAgICAgICAgICAgIAlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZyA9IGVuY2xvc2luZ1R5cGUoKTsKKwkJICAgICAgICAgICAgCWlmIChlbmNsb3NpbmcgIT0gbnVsbCkgeworCQkgICAgICAgICAgICAJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJFbmNsb3NpbmcgPSBvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkgICAgICAgICAgICAJCWlmIChvdGhlckVuY2xvc2luZyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJICAgICAgICAgICAgCQlpZiAoKG90aGVyRW5jbG9zaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkKSA9PSAwKSB7CisJCQkJCQkJCWlmIChlbmNsb3NpbmcgIT0gb3RoZXJFbmNsb3NpbmcpIHJldHVybiB0cnVlOworCQkgICAgICAgICAgICAJCX0gZWxzZSB7CisJCSAgICAgICAgICAgIAkJCWlmICghZW5jbG9zaW5nLmlzRXF1aXZhbGVudFRvKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkpKSByZXR1cm4gdHJ1ZTsKKwkJICAgICAgICAgICAgCQl9CisJCSAgICAgICAgICAgIAl9CisJCSAgICAgICAgICAgIH0KKwkJICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW1UeXBlLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IHBhcmFtVHlwZS5hcmd1bWVudHMubGVuZ3RoOworCQkgICAgICAgICAgICBvdGhlckFyZ3VtZW50cyA9IG90aGVyVHlwZS50eXBlVmFyaWFibGVzKCk7CisJCSAgICAgICAgICAgIG90aGVyTGVuZ3RoID0gb3RoZXJBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBvdGhlckFyZ3VtZW50cy5sZW5ndGg7CisJCSAgICAgICAgICAgIGlmIChvdGhlckxlbmd0aCAhPSBsZW5ndGgpCisJCSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwkJICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkgICAgICAgICAgICAJaWYgKHBhcmFtVHlwZS5hcmd1bWVudHNbaV0uaXNQcm92YWJseURpc3RpbmN0VHlwZUFyZ3VtZW50KG90aGVyQXJndW1lbnRzW2ldLCBwYXJhbVR5cGUsIGkpKQorCQkgICAgICAgICAgICAJCXJldHVybiB0cnVlOworCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworCQkgICAgCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CisJCSAgICAgICAgICAgIHJldHVybiBlcmFzdXJlKCkgIT0gb3RoZXJUeXBlLmVyYXN1cmUoKTsKKwkJICAgIAljYXNlIEJpbmRpbmcuVFlQRTogIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk1ODgKKwkJICAgIAkJcmV0dXJuIGVyYXN1cmUoKSAhPSBvdGhlclR5cGU7CisJCSAgICB9CisJICAgICAgICByZXR1cm4gdHJ1ZTsKKworCQljYXNlIEJpbmRpbmcuUkFXX1RZUEUgOiAvLyBkZWFkIGNvZGUgPz8KKworCQkgICAgc3dpdGNoKG90aGVyVHlwZS5raW5kKCkpIHsKKworCQkgICAgCWNhc2UgQmluZGluZy5HRU5FUklDX1RZUEUgOgorCQkgICAgCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkgICAgCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CisJCSAgICAJY2FzZSBCaW5kaW5nLlRZUEU6ICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NTg4CisJCSAgICAgICAgICAgIHJldHVybiBlcmFzdXJlKCkgIT0gb3RoZXJUeXBlLmVyYXN1cmUoKTsKKwkJICAgIH0KKwkgICAgICAgIHJldHVybiB0cnVlOworCisJCWNhc2UgQmluZGluZy5UWVBFOiAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NTg4CisJCSAgICBzd2l0Y2gob3RoZXJUeXBlLmtpbmQoKSkgeworCQkgICAgCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkgICAgCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CisJCSAgICAgICAgICAgIHJldHVybiB0aGlzICE9IG90aGVyVHlwZS5lcmFzdXJlKCk7CisJCSAgICB9CisJCSAgICBicmVhazsKKworCQlkZWZhdWx0IDoKIAkJCWJyZWFrOwotCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI6Ci0JCQlpZiAodGhpcy5pc0NhcHR1cmUoKSkgewotCQkJCUNhcHR1cmVCaW5kaW5nIGNhcHR1cmUgPSAoQ2FwdHVyZUJpbmRpbmcpIHRoaXM7Ci0JCQkJaWYgKGNhcHR1cmUubG93ZXJCb3VuZCAhPSBudWxsKQotCQkJCQlsb3dlckJvdW5kID0gY2FwdHVyZS5sb3dlckJvdW5kOwotCQkJfQotCQl9Ci0JCVdpbGRjYXJkQmluZGluZyBvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlOwotCQlpZiAob3RoZXJXaWxkY2FyZC5vdGhlckJvdW5kcyAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBub3QgYSB0cnVlIHdpbGRjYXJkIChpbnRlcnNlY3Rpb24gdHlwZSkKLQkJVHlwZUJpbmRpbmcgb3RoZXJCb3VuZCA9IG90aGVyV2lsZGNhcmQuYm91bmQ7Ci0JCXN3aXRjaCAob3RoZXJXaWxkY2FyZC5ib3VuZEtpbmQpIHsKLQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgotCQkJaWYgKG90aGVyQm91bmQgPT0gdGhpcykKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gPyBleHRlbmRzIFQgIDw9ICA/IGV4dGVuZHMgPyBleHRlbmRzIFQKLQkJCWlmICh1cHBlckJvdW5kID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJVHlwZUJpbmRpbmcgbWF0Y2ggPSB1cHBlckJvdW5kLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUob3RoZXJCb3VuZCk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaC5sZWFmQ29tcG9uZW50VHlwZSgpKS5pc1Jhd1R5cGUoKSkgewotCQkJCXJldHVybiBtYXRjaCA9PSBvdGhlckJvdW5kLmxlYWZDb21wb25lbnRUeXBlKCk7IC8vIGZvcmJpZGU6IENvbGxlY3Rpb24gPD0gID8gZXh0ZW5kcyBDb2xsZWN0aW9uPD8+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcmJpZGU6IENvbGxlY3Rpb25bXSA8PSAgPyBleHRlbmRzIENvbGxlY3Rpb248Pz5bXQotCQkJfQotCQkJcmV0dXJuIHVwcGVyQm91bmQuaXNDb21wYXRpYmxlV2l0aChvdGhlckJvdW5kKTsKLQotCQljYXNlIFdpbGRjYXJkLlNVUEVSOgotCQkJaWYgKG90aGVyQm91bmQgPT0gdGhpcykKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gPyBzdXBlciBUICA8PSAgPyBzdXBlciA/IHN1cGVyIFQKLQkJCWlmIChsb3dlckJvdW5kID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbWF0Y2ggPSBvdGhlckJvdW5kLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUobG93ZXJCb3VuZCk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaC5sZWFmQ29tcG9uZW50VHlwZSgpKS5pc1Jhd1R5cGUoKSkgewotCQkJCXJldHVybiBtYXRjaCA9PSBsb3dlckJvdW5kLmxlYWZDb21wb25lbnRUeXBlKCk7IC8vIGZvcmJpZGU6IENvbGxlY3Rpb24gPD0gID8gc3VwZXIgQ29sbGVjdGlvbjw/PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3JiaWRlOiBDb2xsZWN0aW9uW10gPD0gID8gc3VwZXIgQ29sbGVjdGlvbjw/PltdCi0JCQl9Ci0JCQlyZXR1cm4gb3RoZXJCb3VuZC5pc0NvbXBhdGlibGVXaXRoKGxvd2VyQm91bmQpOwotCi0JCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKLQkJZGVmYXVsdDoKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGFsbG93IExpc3Q8Pz4gdG8gbWF0Y2ggTGlzdDw/IGV4dGVuZHMgT2JqZWN0PiAoYW5kIHJlY2lwcm9jYWxseSkKLQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFOgotCQlpZiAoIXRoaXMuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpczsKLQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIG90aGVyUGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgb3RoZXJUeXBlOwotCQlpZiAocGFyYW1UeXBlLmFjdHVhbFR5cGUoKSAhPSBvdGhlclBhcmFtVHlwZS5hY3R1YWxUeXBlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcGFyYW1UeXBlLmlzU3RhdGljKCkpIHsgLy8gc3RhdGljIG1lbWJlciB0eXBlcyBkbyBub3QgY29tcGFyZSB0aGVpciBlbmNsb3NpbmcKLQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nID0gZW5jbG9zaW5nVHlwZSgpOwotCQkJaWYgKGVuY2xvc2luZyAhPSBudWxsKSB7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlckVuY2xvc2luZyA9IG90aGVyUGFyYW1UeXBlCi0JCQkJCQkuZW5jbG9zaW5nVHlwZSgpOwotCQkJCWlmIChvdGhlckVuY2xvc2luZyA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKChvdGhlckVuY2xvc2luZy50YWdCaXRzICYgVGFnQml0cy5IYXNEaXJlY3RXaWxkY2FyZCkgPT0gMCkgewotCQkJCQlpZiAoZW5jbG9zaW5nICE9IG90aGVyRW5jbG9zaW5nKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghZW5jbG9zaW5nLmlzRXF1aXZhbGVudFRvKG90aGVyUGFyYW1UeXBlCi0JCQkJCQkJLmVuY2xvc2luZ1R5cGUoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBsZW5ndGggPSBwYXJhbVR5cGUuYXJndW1lbnRzID09IG51bGwgPyAwCi0JCQkJOiBwYXJhbVR5cGUuYXJndW1lbnRzLmxlbmd0aDsKLQkJVHlwZUJpbmRpbmdbXSBvdGhlckFyZ3VtZW50cyA9IG90aGVyUGFyYW1UeXBlLmFyZ3VtZW50czsKLQkJaW50IG90aGVyTGVuZ3RoID0gb3RoZXJBcmd1bWVudHMgPT0gbnVsbCA/IDAKLQkJCQk6IG90aGVyQXJndW1lbnRzLmxlbmd0aDsKLQkJaWYgKG90aGVyTGVuZ3RoICE9IGxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbmV4dEFyZ3VtZW50OiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlQmluZGluZyBhcmd1bWVudCA9IHBhcmFtVHlwZS5hcmd1bWVudHNbaV07Ci0JCQlUeXBlQmluZGluZyBvdGhlckFyZ3VtZW50ID0gb3RoZXJBcmd1bWVudHNbaV07Ci0JCQlpZiAoYXJndW1lbnQgPT0gb3RoZXJBcmd1bWVudCkKLQkJCQljb250aW51ZSBuZXh0QXJndW1lbnQ7Ci0JCQlpbnQga2luZCA9IGFyZ3VtZW50LmtpbmQoKTsKLQkJCWlmIChvdGhlckFyZ3VtZW50LmtpbmQoKSAhPSBraW5kKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRToKLQkJCQlpZiAoYXJndW1lbnQuaXNUeXBlQXJndW1lbnRDb250YWluZWRCeShvdGhlckFyZ3VtZW50KSkgLy8gcmVjdXJzZQotCQkJCQljb250aW51ZSBuZXh0QXJndW1lbnQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKLQkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBhcmd1bWVudDsKLQkJCQlvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJBcmd1bWVudDsKLQkJCQlzd2l0Y2ggKHdpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKLQkJCQkJLy8gbWF0Y2ggIj8gZXh0ZW5kcyA8dXBwZXJCb3VuZD4iIHdpdGggIj8iCi0JCQkJCWlmIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCA9PSBXaWxkY2FyZC5VTkJPVU5ECi0JCQkJCQkJJiYgd2lsZGNhcmQuYm91bmQgPT0gd2lsZGNhcmQudHlwZVZhcmlhYmxlKCkKLQkJCQkJCQkJCS51cHBlckJvdW5kKCkpCi0JCQkJCQljb250aW51ZSBuZXh0QXJndW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKLQkJCQkJLy8gbWF0Y2ggIj8iIHdpdGggIj8gZXh0ZW5kcyA8dXBwZXJCb3VuZD4iCi0JCQkJCWlmIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCA9PSBXaWxkY2FyZC5FWFRFTkRTCi0JCQkJCQkJJiYgb3RoZXJXaWxkY2FyZC5ib3VuZCA9PSBvdGhlcldpbGRjYXJkCi0JCQkJCQkJCQkudHlwZVZhcmlhYmxlKCkudXBwZXJCb3VuZCgpKQotCQkJCQkJY29udGludWUgbmV4dEFyZ3VtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCkBAIC03NjUsMTM3ICs3MDcsMzg2IEBACiAgKiBMaXN0PD8gZXh0ZW5kcyBUaHJvd2FibGU+ICYgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+IC0tPiB0cnVlCiAgKiBMaXN0PD8gZXh0ZW5kcyBTdHJpbmc+ICYgTGlzdDw/IGV4dGVuZHMgUnVubmFibGU+IC0tPiBmYWxzZQogICovCi1wdWJsaWMgYm9vbGVhbiBpc1R5cGVBcmd1bWVudEludGVyc2VjdGluZyhUeXBlQmluZGluZyBvdGhlckFyZ3VtZW50KSB7Citwcml2YXRlIGJvb2xlYW4gaXNQcm92YWJseURpc3RpbmN0VHlwZUFyZ3VtZW50KFR5cGVCaW5kaW5nIG90aGVyQXJndW1lbnQsIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbVR5cGUsIGZpbmFsIGludCByYW5rKSB7CiAJaWYgKHRoaXMgPT0gb3RoZXJBcmd1bWVudCkKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKworCVR5cGVCaW5kaW5nIHVwcGVyQm91bmQxID0gbnVsbDsKKwlUeXBlQmluZGluZyBsb3dlckJvdW5kMSA9IG51bGw7CisJUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZSA9IHBhcmFtVHlwZS5nZW5lcmljVHlwZSgpOwogCXN3aXRjaCAoa2luZCgpKSB7Ci0KLQkvLyBUWVBFX1BBUkFNICYgQU5ZIFRZUEUKLQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI6Ci0JCXJldHVybiB0cnVlOwotCi0JY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEU6Ci0JCXN3aXRjaCAob3RoZXJBcmd1bWVudC5raW5kKCkpIHsKLQotCQkvLyBXSUxEQ0FSRCAmIFRZUEVfUEFSQU0KLQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgotCQkJcmV0dXJuIHRydWU7Ci0KLQkJCS8vIFdJTERDQVJEICYgV0lMRENBUkQKLQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEU6Ci0JCQlUeXBlQmluZGluZyBsb3dlckJvdW5kMSA9IG51bGw7Ci0JCQlUeXBlQmluZGluZyB1cHBlckJvdW5kMSA9IG51bGw7CisJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKIAkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIHRoaXM7CiAJCQlzd2l0Y2ggKHdpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgotCQkJCXVwcGVyQm91bmQxID0gd2lsZGNhcmQuYm91bmQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdpbGRjYXJkLlNVUEVSOgotCQkJCWxvd2VyQm91bmQxID0gd2lsZGNhcmQuYm91bmQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6CisJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgorCQkJCQl1cHBlckJvdW5kMSA9IHdpbGRjYXJkLmJvdW5kOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOgorCQkJCQlsb3dlckJvdW5kMSA9IHdpbGRjYXJkLmJvdW5kOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6CisJCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQotCQkJVHlwZUJpbmRpbmcgbG93ZXJCb3VuZDIgPSBudWxsOwotCQkJVHlwZUJpbmRpbmcgdXBwZXJCb3VuZDIgPSBudWxsOwotCQkJV2lsZGNhcmRCaW5kaW5nIG90aGVyV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBvdGhlckFyZ3VtZW50OwotCQkJc3dpdGNoIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgotCQkJCXVwcGVyQm91bmQyID0gb3RoZXJXaWxkY2FyZC5ib3VuZDsKLQkJCQlicmVhazsKLQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6Ci0JCQkJbG93ZXJCb3VuZDIgPSBvdGhlcldpbGRjYXJkLmJvdW5kOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOgotCQkJfQotCQkJaWYgKGxvd2VyQm91bmQxICE9IG51bGwpIHsKLQkJCQlpZiAobG93ZXJCb3VuZDIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gT2JqZWN0IGNvdWxkIGFsd2F5cyBiZSBhIGNhbmRpZGF0ZQotCi0JCQkJfSBlbHNlIGlmICh1cHBlckJvdW5kMiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBsb3dlckJvdW5kMS5pc0NvbXBhdGlibGVXaXRoKHVwcGVyQm91bmQyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOgorCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6CisJCQlmaW5hbCBUeXBlVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlID0gKFR5cGVWYXJpYWJsZUJpbmRpbmcpIHRoaXM7CisJCQlpZiAodmFyaWFibGUuaXNDYXB0dXJlKCkpIHsKKwkJCQlDYXB0dXJlQmluZGluZyBjYXB0dXJlID0gKENhcHR1cmVCaW5kaW5nKSB2YXJpYWJsZTsKKwkJCQlzd2l0Y2ggKGNhcHR1cmUud2lsZGNhcmQuYm91bmRLaW5kKSB7CisJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJCXVwcGVyQm91bmQxID0gY2FwdHVyZS53aWxkY2FyZC5ib3VuZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOgorCQkJCQkJbG93ZXJCb3VuZDEgPSBjYXB0dXJlLndpbGRjYXJkLmJvdW5kOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHVwcGVyQm91bmQxICE9IG51bGwpIHsKLQkJCQlpZiAodXBwZXJCb3VuZDEuaXNUeXBlVmFyaWFibGUoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGxvd2VyQm91bmQyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGxvd2VyQm91bmQyLmlzQ29tcGF0aWJsZVdpdGgodXBwZXJCb3VuZDEpOwotCi0JCQkJfSBlbHNlIGlmICh1cHBlckJvdW5kMiAhPSBudWxsKSB7Ci0JCQkJCWlmICh1cHBlckJvdW5kMS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQlpZiAodXBwZXJCb3VuZDIuaXNJbnRlcmZhY2UoKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmICh1cHBlckJvdW5kMi5pc0FycmF5VHlwZSgpCi0JCQkJCQkJCXx8ICgodXBwZXJCb3VuZDIgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSAmJiAoKFJlZmVyZW5jZUJpbmRpbmcpIHVwcGVyQm91bmQyKQotCQkJCQkJCQkJCS5pc0ZpbmFsKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHVwcGVyQm91bmQyCi0JCQkJCQkJCQkuaXNDb21wYXRpYmxlV2l0aCh1cHBlckJvdW5kMSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh1cHBlckJvdW5kMi5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQkJaWYgKHVwcGVyQm91bmQxLmlzQXJyYXlUeXBlKCkKLQkJCQkJCQkJCXx8ICgodXBwZXJCb3VuZDEgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSAmJiAoKFJlZmVyZW5jZUJpbmRpbmcpIHVwcGVyQm91bmQxKQotCQkJCQkJCQkJCQkuaXNGaW5hbCgpKSkgewotCQkJCQkJCQlyZXR1cm4gdXBwZXJCb3VuZDEKLQkJCQkJCQkJCQkuaXNDb21wYXRpYmxlV2l0aCh1cHBlckJvdW5kMik7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gdXBwZXJCb3VuZDEKLQkJCQkJCQkJCS5pc0NvbXBhdGlibGVXaXRoKHVwcGVyQm91bmQyKTsKLQkJCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh2YXJpYWJsZS5maXJzdEJvdW5kID09IG51bGwpIC8vIHVuYm91bmQgdmFyaWFibGUKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlUeXBlQmluZGluZyBlbGltaW5hdGVkVHlwZSA9IFNjb3BlLmNvbnZlcnRFbGltaW5hdGluZ1R5cGVWYXJpYWJsZXModmFyaWFibGUsIGdlbmVyaWNUeXBlLCByYW5rLCBudWxsKTsKKwkJCXN3aXRjaCAoZWxpbWluYXRlZFR5cGUua2luZCgpKSB7CisJCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQkJCXdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgZWxpbWluYXRlZFR5cGU7CisJCQkJCXN3aXRjaCAod2lsZGNhcmQuYm91bmRLaW5kKSB7CisJCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6CisJCQkJCQkJdXBwZXJCb3VuZDEgPSB3aWxkY2FyZC5ib3VuZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CisJCQkJCQkJbG93ZXJCb3VuZDEgPSB3aWxkY2FyZC5ib3VuZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCS8vIFdJTERDQVJEICYgT1RIRVIgVFlQRQotCQlkZWZhdWx0OgotCQkJd2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSB0aGlzOwotCQkJc3dpdGNoICh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKLQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKLQkJCQlyZXR1cm4gb3RoZXJBcmd1bWVudC5pc0NvbXBhdGlibGVXaXRoKHdpbGRjYXJkLmJvdW5kKTsKLQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6Ci0JCQkJcmV0dXJuIHdpbGRjYXJkLmJvdW5kLmlzQ29tcGF0aWJsZVdpdGgob3RoZXJBcmd1bWVudCk7Ci0JCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQlkZWZhdWx0OgotCQlzd2l0Y2ggKG90aGVyQXJndW1lbnQua2luZCgpKSB7Ci0KLQkJLy8gT1RIRVIgVFlQRSAmIFRZUEVfUEFSQU0KLQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgotCQkJcmV0dXJuIHRydWU7Ci0KLQkJCS8vIE9USEVSIFRZUEUgJiBXSUxEQ0FSRAotCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKKwkJCWJyZWFrOworCX0KKwlUeXBlQmluZGluZyB1cHBlckJvdW5kMiA9IG51bGw7CisJVHlwZUJpbmRpbmcgbG93ZXJCb3VuZDIgPSBudWxsOworCXN3aXRjaCAob3RoZXJBcmd1bWVudC5raW5kKCkpIHsKKwkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgogCQkJV2lsZGNhcmRCaW5kaW5nIG90aGVyV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBvdGhlckFyZ3VtZW50OwogCQkJc3dpdGNoIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgotCQkJCXJldHVybiB0aGlzLmlzQ29tcGF0aWJsZVdpdGgob3RoZXJXaWxkY2FyZC5ib3VuZCk7Ci0JCQljYXNlIFdpbGRjYXJkLlNVUEVSOgotCQkJCXJldHVybiBvdGhlcldpbGRjYXJkLmJvdW5kLmlzQ29tcGF0aWJsZVdpdGgodGhpcyk7Ci0JCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiB0cnVlOworCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJdXBwZXJCb3VuZDIgPSBvdGhlcldpbGRjYXJkLmJvdW5kOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOgorCQkJCQlsb3dlckJvdW5kMiA9IG90aGVyV2lsZGNhcmQuYm91bmQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQlicmVhazsKKwkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgb3RoZXJWYXJpYWJsZSA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSBvdGhlckFyZ3VtZW50OworCQkJaWYgKG90aGVyVmFyaWFibGUuaXNDYXB0dXJlKCkpIHsKKwkJCQlDYXB0dXJlQmluZGluZyBvdGhlckNhcHR1cmUgPSAoQ2FwdHVyZUJpbmRpbmcpIG90aGVyVmFyaWFibGU7CisJCQkJc3dpdGNoIChvdGhlckNhcHR1cmUud2lsZGNhcmQuYm91bmRLaW5kKSB7CisJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJCXVwcGVyQm91bmQyID0gb3RoZXJDYXB0dXJlLndpbGRjYXJkLmJvdW5kOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CisJCQkJCQlsb3dlckJvdW5kMiA9IG90aGVyQ2FwdHVyZS53aWxkY2FyZC5ib3VuZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKG90aGVyVmFyaWFibGUuZmlyc3RCb3VuZCA9PSBudWxsKSAvLyB1bmJvdW5kIHZhcmlhYmxlCisJCQkJcmV0dXJuIGZhbHNlOworCQkJVHlwZUJpbmRpbmcgb3RoZXJFbGltaW5hdGVkVHlwZSA9IFNjb3BlLmNvbnZlcnRFbGltaW5hdGluZ1R5cGVWYXJpYWJsZXMob3RoZXJWYXJpYWJsZSwgZ2VuZXJpY1R5cGUsIHJhbmssIG51bGwpOworCQkJc3dpdGNoIChvdGhlckVsaW1pbmF0ZWRUeXBlLmtpbmQoKSkgeworCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOgorCQkJCQlvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJFbGltaW5hdGVkVHlwZTsKKwkJCQkJc3dpdGNoIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCkgeworCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOgorCQkJCQkJCXVwcGVyQm91bmQyID0gb3RoZXJXaWxkY2FyZC5ib3VuZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CisJCQkJCQkJbG93ZXJCb3VuZDIgPSBvdGhlcldpbGRjYXJkLmJvdW5kOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOgorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0JCQlicmVhazsKKwl9CisJaWYgKGxvd2VyQm91bmQxICE9IG51bGwpIHsKKwkJaWYgKGxvd2VyQm91bmQyICE9IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gT2JqZWN0IGNvdWxkIGFsd2F5cyBiZSBhIGNhbmRpZGF0ZQogCi0JCQkvLyBPVEhFUiBUWVBFICYgT1RIRVIgVFlQRQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKHVwcGVyQm91bmQyICE9IG51bGwpIHsKKwkJCWlmIChsb3dlckJvdW5kMS5pc1R5cGVWYXJpYWJsZSgpIHx8IHVwcGVyQm91bmQyLmlzVHlwZVZhcmlhYmxlKCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gIWxvd2VyQm91bmQxLmlzQ29tcGF0aWJsZVdpdGgodXBwZXJCb3VuZDIpOworCQl9IGVsc2UgeworCQkJaWYgKGxvd2VyQm91bmQxLmlzVHlwZVZhcmlhYmxlKCkgfHwgb3RoZXJBcmd1bWVudC5pc1R5cGVWYXJpYWJsZSgpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuICFsb3dlckJvdW5kMS5pc0NvbXBhdGlibGVXaXRoKG90aGVyQXJndW1lbnQpOworCQl9CisJfSBlbHNlIGlmICh1cHBlckJvdW5kMSAhPSBudWxsKSB7CisJCWlmIChsb3dlckJvdW5kMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gIWxvd2VyQm91bmQyLmlzQ29tcGF0aWJsZVdpdGgodXBwZXJCb3VuZDEpOworCQl9IGVsc2UgaWYgKHVwcGVyQm91bmQyICE9IG51bGwpIHsKKwkJCXJldHVybiB1cHBlckJvdW5kMS5pc1Byb3ZhYmxlRGlzdGluY3RTdWJUeXBlKHVwcGVyQm91bmQyKQorCQkJCQkJCSYmIHVwcGVyQm91bmQyLmlzUHJvdmFibGVEaXN0aW5jdFN1YlR5cGUodXBwZXJCb3VuZDEpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG90aGVyQXJndW1lbnQuaXNQcm92YWJsZURpc3RpbmN0U3ViVHlwZSh1cHBlckJvdW5kMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobG93ZXJCb3VuZDIgIT0gbnVsbCkgeworCQkJaWYgKGxvd2VyQm91bmQyLmlzVHlwZVZhcmlhYmxlKCkgfHwgaXNUeXBlVmFyaWFibGUoKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiAhbG93ZXJCb3VuZDIuaXNDb21wYXRpYmxlV2l0aCh0aGlzKTsKKwkJfSBlbHNlIGlmICh1cHBlckJvdW5kMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gaXNQcm92YWJsZURpc3RpbmN0U3ViVHlwZSh1cHBlckJvdW5kMik7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdHJ1ZTsgLy8gZ3JvdW5kIHR5cGVzIHNob3VsZCBoYXZlIGJlZW4gdGhlIHNhbWUKIAkJfQogCX0KIH0KIAorcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSYXdUeXBlKCkgeworCXJldHVybiBraW5kKCkgPT0gQmluZGluZy5SQVdfVFlQRTsKK30KKy8qKgorICogSkxTKDMpIDQuNy4KKyAqIE5vdGU6IEZvbzw/Pi5CYXIgaXMgYWxzbyByZWlmaWFibGUKKyAqLworcHVibGljIGJvb2xlYW4gaXNSZWlmaWFibGUoKSB7CisJVHlwZUJpbmRpbmcgbGVhZlR5cGUgPSBsZWFmQ29tcG9uZW50VHlwZSgpOworCWlmICghKGxlYWZUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpCisJCXJldHVybiB0cnVlOworCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudCA9IChSZWZlcmVuY2VCaW5kaW5nKSBsZWFmVHlwZTsKKwlkbyB7CisJCXN3aXRjaCAoY3VycmVudC5raW5kKCkpIHsKKwkJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUjoKKwkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFOgorCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgorCQkJY2FzZSBCaW5kaW5nLkdFTkVSSUNfVFlQRToKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljYXNlIEJpbmRpbmcuUEFSQU1FVEVSSVpFRF9UWVBFOgorCQkJCWlmIChjdXJyZW50LmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIEJpbmRpbmcuUkFXX1RZUEU6CisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGN1cnJlbnQuaXNTdGF0aWMoKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGN1cnJlbnQuaXNMb2NhbFR5cGUoKSkgeworCQkJTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGVCaW5kaW5nID0gKExvY2FsVHlwZUJpbmRpbmcpIGN1cnJlbnQuZXJhc3VyZSgpOworCQkJTWV0aG9kQmluZGluZyBlbmNsb3NpbmdNZXRob2QgPSBsb2NhbFR5cGVCaW5kaW5nLmVuY2xvc2luZ01ldGhvZDsKKwkJCWlmIChlbmNsb3NpbmdNZXRob2QgIT0gbnVsbCAmJiBlbmNsb3NpbmdNZXRob2QuaXNTdGF0aWMoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LmVuY2xvc2luZ1R5cGUoKSkgIT0gbnVsbCk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gdHlwZSBtYXkgYmUgdGhyb3duCisgKi8KK3B1YmxpYyBib29sZWFuIGlzVGhyb3dhYmxlKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8vIEpMUzM6IDQuNS4xLjEKK3B1YmxpYyBib29sZWFuIGlzVHlwZUFyZ3VtZW50Q29udGFpbmVkQnkoVHlwZUJpbmRpbmcgb3RoZXJUeXBlKSB7CisJaWYgKHRoaXMgPT0gb3RoZXJUeXBlKQorCQlyZXR1cm4gdHJ1ZTsKKwlzd2l0Y2ggKG90aGVyVHlwZS5raW5kKCkpIHsKKwkJLy8gaGFuZGxlIGNhcHR1cmVkIHdpbGRjYXJkcy4KKwkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOiB7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3NDI2CisJCQlpZiAoIWlzUGFyYW1ldGVyaXplZFR5cGUoKSB8fCAhb3RoZXJUeXBlLmlzQ2FwdHVyZSgpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJQ2FwdHVyZUJpbmRpbmcgY2FwdHVyZSA9IChDYXB0dXJlQmluZGluZykgb3RoZXJUeXBlOworCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkID0gY2FwdHVyZS53aWxkY2FyZDsKKwkJCVR5cGVCaW5kaW5nIHVwcGVyQm91bmQgPSBudWxsOworCQkJVHlwZUJpbmRpbmcgW10gb3RoZXJCb3VuZHMgPSBudWxsOworCQkJc3dpdGNoICh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOgorCQkJCQlyZXR1cm4gZmFsc2U7IC8vIFQgc3VwZXIgc3ludGF4IGlzbid0IGFsbG93ZWQsIGltcG9zc2libGUgY2FwdHVyZS4KKwkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6CisJCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSB3aWxkY2FyZC5nZW5lcmljVHlwZS50eXBlVmFyaWFibGVzKClbd2lsZGNhcmQucmFua107CisJCQkJCXVwcGVyQm91bmQgPSB2YXJpYWJsZS51cHBlckJvdW5kKCk7CisJCQkJCW90aGVyQm91bmRzID0gdmFyaWFibGUuYm91bmRzQ291bnQoKSA+IDEgPyB2YXJpYWJsZS5vdGhlclVwcGVyQm91bmRzKCkgOiBudWxsOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6CisJCQkJCXVwcGVyQm91bmQgPSB3aWxkY2FyZC5ib3VuZDsKKwkJCQkJb3RoZXJCb3VuZHMgPSB3aWxkY2FyZC5vdGhlckJvdW5kczsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBHaXZlbiBjbGFzcyBBPFQgZXh0ZW5kcyBCPD8+PiwgQTw/PiBjYW5ub3QgYmUgdGhlIHVuaXZlcnNlIG9mIGFsbCBwYXJhbWV0ZXJpemF0aW9ucyBvZiBBCisJCQlpZiAodXBwZXJCb3VuZC5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QgJiYgb3RoZXJCb3VuZHMgPT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsgLy8gYnV0IGdpdmVuIGNsYXNzIEE8VD4sIEE8Pz4gc3RheXMgYW4gdW5ib3VuZGVkIHdpbGRjYXJkLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODk1NgorCQkJfQorCQkJb3RoZXJUeXBlID0gY2FwdHVyZS5lbnZpcm9ubWVudC5jcmVhdGVXaWxkY2FyZChudWxsLCAwLCB1cHBlckJvdW5kLCBvdGhlckJvdW5kcywgV2lsZGNhcmQuRVhURU5EUyk7CisJCQlyZXR1cm4gaXNUeXBlQXJndW1lbnRDb250YWluZWRCeShvdGhlclR5cGUpOworCQl9CisJCS8vIGFsbG93IHdpbGRjYXJkIGNvbnRhaW5tZW50CisJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFOgorCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CisKKwkJCVR5cGVCaW5kaW5nIGxvd2VyQm91bmQgPSB0aGlzOworCQkJVHlwZUJpbmRpbmcgdXBwZXJCb3VuZCA9IHRoaXM7CisJCQlzd2l0Y2ggKGtpbmQoKSkgeworCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFOgorCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRToKKwkJCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgdGhpczsKKwkJCQkJc3dpdGNoICh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJCQlpZiAod2lsZGNhcmQub3RoZXJCb3VuZHMgIT0gbnVsbCkgLy8gaW50ZXJzZWN0aW9uIHR5cGUKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJdXBwZXJCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOworCQkJCQkJCWxvd2VyQm91bmQgPSBudWxsOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUjoKKwkJCQkJCQl1cHBlckJvdW5kID0gd2lsZGNhcmQ7CisJCQkJCQkJbG93ZXJCb3VuZCA9IHdpbGRjYXJkLmJvdW5kOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOgorCQkJCQkJCXVwcGVyQm91bmQgPSB3aWxkY2FyZDsKKwkJCQkJCQlsb3dlckJvdW5kID0gbnVsbDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI6CisJCQkJCWlmIChpc0NhcHR1cmUoKSkgeworCQkJCQkJQ2FwdHVyZUJpbmRpbmcgY2FwdHVyZSA9IChDYXB0dXJlQmluZGluZykgdGhpczsKKwkJCQkJCWlmIChjYXB0dXJlLmxvd2VyQm91bmQgIT0gbnVsbCkKKwkJCQkJCQlsb3dlckJvdW5kID0gY2FwdHVyZS5sb3dlckJvdW5kOworCQkJCQl9CisJCQl9CisJCQlXaWxkY2FyZEJpbmRpbmcgb3RoZXJXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIG90aGVyVHlwZTsKKwkJCWlmIChvdGhlcldpbGRjYXJkLm90aGVyQm91bmRzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOyAvLyBub3QgYSB0cnVlIHdpbGRjYXJkIChpbnRlcnNlY3Rpb24gdHlwZSkKKwkJCVR5cGVCaW5kaW5nIG90aGVyQm91bmQgPSBvdGhlcldpbGRjYXJkLmJvdW5kOworCQkJc3dpdGNoIChvdGhlcldpbGRjYXJkLmJvdW5kS2luZCkgeworCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJaWYgKG90aGVyQm91bmQgPT0gdGhpcykKKwkJCQkJCXJldHVybiB0cnVlOyAvLyA/IGV4dGVuZHMgVCAgPD0gID8gZXh0ZW5kcyA/IGV4dGVuZHMgVAorCQkJCQlpZiAodXBwZXJCb3VuZCA9PSBudWxsKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlUeXBlQmluZGluZyBtYXRjaCA9IHVwcGVyQm91bmQuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShvdGhlckJvdW5kKTsKKwkJCQkJaWYgKG1hdGNoICE9IG51bGwgJiYgKG1hdGNoID0gbWF0Y2gubGVhZkNvbXBvbmVudFR5cGUoKSkuaXNSYXdUeXBlKCkpIHsKKwkJCQkJCXJldHVybiBtYXRjaCA9PSBvdGhlckJvdW5kLmxlYWZDb21wb25lbnRUeXBlKCk7IC8vIGZvcmJpZGU6IENvbGxlY3Rpb24gPD0gID8gZXh0ZW5kcyBDb2xsZWN0aW9uPD8+CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yYmlkZTogQ29sbGVjdGlvbltdIDw9ICA/IGV4dGVuZHMgQ29sbGVjdGlvbjw/PltdCisJCQkJCX0KKwkJCQkJcmV0dXJuIHVwcGVyQm91bmQuaXNDb21wYXRpYmxlV2l0aChvdGhlckJvdW5kKTsKKworCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CisJCQkJCWlmIChvdGhlckJvdW5kID09IHRoaXMpCisJCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gPyBzdXBlciBUICA8PSAgPyBzdXBlciA/IHN1cGVyIFQKKwkJCQkJaWYgKGxvd2VyQm91bmQgPT0gbnVsbCkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJbWF0Y2ggPSBvdGhlckJvdW5kLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20obG93ZXJCb3VuZCk7CisJCQkJCWlmIChtYXRjaCAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoLmxlYWZDb21wb25lbnRUeXBlKCkpLmlzUmF3VHlwZSgpKSB7CisJCQkJCQlyZXR1cm4gbWF0Y2ggPT0gbG93ZXJCb3VuZC5sZWFmQ29tcG9uZW50VHlwZSgpOyAvLyBmb3JiaWRlOiBDb2xsZWN0aW9uIDw9ICA/IHN1cGVyIENvbGxlY3Rpb248Pz4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3JiaWRlOiBDb2xsZWN0aW9uW10gPD0gID8gc3VwZXIgQ29sbGVjdGlvbjw/PltdCisJCQkJCX0KKwkJCQkJcmV0dXJuIG90aGVyQm91bmQuaXNDb21wYXRpYmxlV2l0aChsb3dlckJvdW5kKTsKKworCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCS8vIGFsbG93IExpc3Q8Pz4gdG8gbWF0Y2ggTGlzdDw/IGV4dGVuZHMgT2JqZWN0PiAoYW5kIHJlY2lwcm9jYWxseSkKKwkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRToKKwkJCWlmICghaXNQYXJhbWV0ZXJpemVkVHlwZSgpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzOworCQkJUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nIG90aGVyUGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgb3RoZXJUeXBlOworCQkJaWYgKHBhcmFtVHlwZS5hY3R1YWxUeXBlKCkgIT0gb3RoZXJQYXJhbVR5cGUuYWN0dWFsVHlwZSgpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmICghcGFyYW1UeXBlLmlzU3RhdGljKCkpIHsgLy8gc3RhdGljIG1lbWJlciB0eXBlcyBkbyBub3QgY29tcGFyZSB0aGVpciBlbmNsb3NpbmcKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZyA9IGVuY2xvc2luZ1R5cGUoKTsKKwkJCQlpZiAoZW5jbG9zaW5nICE9IG51bGwpIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlckVuY2xvc2luZyA9IG90aGVyUGFyYW1UeXBlCS5lbmNsb3NpbmdUeXBlKCk7CisJCQkJCWlmIChvdGhlckVuY2xvc2luZyA9PSBudWxsKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQlpZiAoKG90aGVyRW5jbG9zaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc0RpcmVjdFdpbGRjYXJkKSA9PSAwKSB7CisJCQkJCQlpZiAoZW5jbG9zaW5nICE9IG90aGVyRW5jbG9zaW5nKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghZW5jbG9zaW5nLmlzRXF1aXZhbGVudFRvKG90aGVyUGFyYW1UeXBlLmVuY2xvc2luZ1R5cGUoKSkpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaW50IGxlbmd0aCA9IHBhcmFtVHlwZS5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBwYXJhbVR5cGUuYXJndW1lbnRzLmxlbmd0aDsKKwkJCVR5cGVCaW5kaW5nW10gb3RoZXJBcmd1bWVudHMgPSBvdGhlclBhcmFtVHlwZS5hcmd1bWVudHM7CisJCQlpbnQgb3RoZXJMZW5ndGggPSBvdGhlckFyZ3VtZW50cyA9PSBudWxsID8gMCA6IG90aGVyQXJndW1lbnRzLmxlbmd0aDsKKwkJCWlmIChvdGhlckxlbmd0aCAhPSBsZW5ndGgpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJbmV4dEFyZ3VtZW50OiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgYXJndW1lbnQgPSBwYXJhbVR5cGUuYXJndW1lbnRzW2ldOworCQkJCVR5cGVCaW5kaW5nIG90aGVyQXJndW1lbnQgPSBvdGhlckFyZ3VtZW50c1tpXTsKKwkJCQlpZiAoYXJndW1lbnQgPT0gb3RoZXJBcmd1bWVudCkKKwkJCQkJY29udGludWUgbmV4dEFyZ3VtZW50OworCQkJCWludCBraW5kID0gYXJndW1lbnQua2luZCgpOworCQkJCWlmIChvdGhlckFyZ3VtZW50LmtpbmQoKSAhPSBraW5kKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJc3dpdGNoIChraW5kKSB7CisJCQkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEU6CisJCQkJCQlpZiAoYXJndW1lbnQuaXNUeXBlQXJndW1lbnRDb250YWluZWRCeShvdGhlckFyZ3VtZW50KSkgLy8gcmVjdXJzZQorCQkJCQkJCWNvbnRpbnVlIG5leHRBcmd1bWVudDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKKwkJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgorCQkJCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYXJndW1lbnQ7CisJCQkJCQlvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJBcmd1bWVudDsKKwkJCQkJCXN3aXRjaCAod2lsZGNhcmQuYm91bmRLaW5kKSB7CisJCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6CisJCQkJCQkJLy8gbWF0Y2ggIj8gZXh0ZW5kcyA8dXBwZXJCb3VuZD4iIHdpdGggIj8iCisJCQkJCQkJaWYgKG90aGVyV2lsZGNhcmQuYm91bmRLaW5kID09IFdpbGRjYXJkLlVOQk9VTkQKKwkJCQkJCQkJCSYmIHdpbGRjYXJkLmJvdW5kID09IHdpbGRjYXJkLnR5cGVWYXJpYWJsZSgpLnVwcGVyQm91bmQoKSkKKwkJCQkJCQkJY29udGludWUgbmV4dEFyZ3VtZW50OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUjoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQkJCQkvLyBtYXRjaCAiPyIgd2l0aCAiPyBleHRlbmRzIDx1cHBlckJvdW5kPiIKKwkJCQkJCQlpZiAob3RoZXJXaWxkY2FyZC5ib3VuZEtpbmQgPT0gV2lsZGNhcmQuRVhURU5EUworCQkJCQkJCQkJJiYgb3RoZXJXaWxkY2FyZC5ib3VuZCA9PSBvdGhlcldpbGRjYXJkLnR5cGVWYXJpYWJsZSgpLnVwcGVyQm91bmQoKSkKKwkJCQkJCQkJY29udGludWUgbmV4dEFyZ3VtZW50OworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCX0KKwkvLyAoPyBzdXBlciBPYmplY3QpIDw9IE9iamVjdAorCWlmIChvdGhlclR5cGUuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7CisJCXN3aXRjaCAoa2luZCgpKSB7CisJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKKwkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSB0aGlzOworCQkJCWlmICh3aWxkY2FyZC5ib3VuZEtpbmQgPT0gV2lsZGNhcmQuU1VQRVIgJiYgd2lsZGNhcmQuYm91bmQuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIHdhcyBkZWNsYXJlZCBhcyBhIHR5cGUgdmFyaWFibGUKICAqLwpAQCAtOTQ2LDggKzExMzcsOCBAQAogCWlmICghKHRhcmdldFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JVHlwZUJpbmRpbmcgY3VycmVudFR5cGUgPSB0aGlzLmxlYWZDb21wb25lbnRUeXBlKCk7Ci0JVHlwZUJpbmRpbmcgbWF0Y2ggPSBjdXJyZW50VHlwZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKHRhcmdldFR5cGUpOworCVR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlID0gbGVhZkNvbXBvbmVudFR5cGUoKTsKKwlUeXBlQmluZGluZyBtYXRjaCA9IGN1cnJlbnRUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20odGFyZ2V0VHlwZSk7CiAJaWYgKCEobWF0Y2ggaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKIAkJcmV0dXJuIGZhbHNlOwogCVJlZmVyZW5jZUJpbmRpbmcgY29tcGF0aWJsZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBtYXRjaDsKQEAgLTk2NSw2ICsxMTU2LDIxIEBACiB9CiAKIC8qKgorICogUmV0dXJucyB0aGUgb3JpZ25hbCBnZW5lcmljIHR5cGUgaW5zdGFudGlhdGVkIGJ5IHRoZSByZWNlaXZlciB0eXBlLCBvciBpdHNlbGYgaWYgbm90LgorICogVGhpcyBpcyBzaW1pbGFyIHRvIGVyYXN1cmUgcHJvY2VzcywgZXhjZXB0IGl0IGRvZXNuJ3QgZXJhc2UgdHlwZSB2YXJpYWJsZSwgd2lsZGNhcmQsIGludGVyc2VjdGlvbiB0eXBlcyBldGMuLi4KKyAqLworcHVibGljIFR5cGVCaW5kaW5nIG9yaWdpbmFsKCkgeworCXN3aXRjaChraW5kKCkpIHsKKwkJY2FzZSBCaW5kaW5nLlBBUkFNRVRFUklaRURfVFlQRSA6CisJCWNhc2UgQmluZGluZy5SQVdfVFlQRSA6CisJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKKwkJCXJldHVybiBlcmFzdXJlKCk7CisJCWRlZmF1bHQgOgorCQkJcmV0dXJuIHRoaXM7CisJfQorfQorCisvKioKICAqIEFuc3dlciB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3MgcGFja2FnZSBzZXBhcmF0ZWQgYnkgcGVyaW9kcwogICogb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0cyB0aGUgZGVmYXVsdCBwYWNrYWdlLgogICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKaW5kZXggNjNkMjcxYy4uZTc1ZGI1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQ29uc3RhbnRzLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMiw3ICsxMiw3IEBACiAKIC8vIFRPRE8gc2hvdWxkIHJlbmFtZSBpbnRvIFR5cGVOYW1lcyAob25jZSBleHRyYWN0ZWQgbGFzdCBub24gbmFtZSBjb25zdGFudHMpCiBwdWJsaWMgaW50ZXJmYWNlIFR5cGVDb25zdGFudHMgewotCQorCiAJY2hhcltdIEpBVkEgPSAiamF2YSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBMQU5HID0gImxhbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAljaGFyW10gSU8gPSAiaW8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKQEAgLTIxLDExICsyMSwxMyBAQAogCWNoYXJbXSBSRUZMRUNUID0gInJlZmxlY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAljaGFyW10gTEVOR1RIID0gImxlbmd0aCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBDTE9ORSA9ICJjbG9uZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFUVVBTFMgPSAiZXF1YWxzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIEdFVENMQVNTID0gImdldENsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEhBU0hDT0RFID0gImhhc2hDb2RlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIE9CSkVDVCA9ICJPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAljaGFyW10gTUFJTiA9ICJtYWluIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIFNFUklBTFZFUlNJT05VSUQgPSAic2VyaWFsVmVyc2lvblVJRCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCWNoYXJbXSBTRVJJQUxQRVJTSVNURU5URklFTERTID0gInNlcmlhbFBlcnNpc3RlbnRGaWVsZHMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQgCisJY2hhcltdIFNFUklBTFBFUlNJU1RFTlRGSUVMRFMgPSAic2VyaWFsUGVyc2lzdGVudEZpZWxkcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBSRUFEUkVTT0xWRSA9ICJyZWFkUmVzb2x2ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBXUklURVJFUExBQ0UgPSAid3JpdGVSZXBsYWNlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIFJFQURPQkpFQ1QgPSAicmVhZE9iamVjdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJApAQCAtNzMsNyArNzUsNyBAQAogICAgIGNoYXJbXSBVUFBFUl9MT0NBTF9WQVJJQUJMRSA9ICJMT0NBTF9WQVJJQUJMRSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogICAgIGNoYXJbXSBVUFBFUl9BTk5PVEFUSU9OX1RZUEUgPSAiQU5OT1RBVElPTl9UWVBFIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAgICAgY2hhcltdIFVQUEVSX1BBQ0tBR0UgPSAiUEFDS0FHRSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotIAorCiAJLy8gQ29uc3RhbnQgY29tcG91bmQgbmFtZXMKIAljaGFyW11bXSBKQVZBX0xBTkcgPSB7SkFWQSwgTEFOR307CiAJY2hhcltdW10gSkFWQV9JTyA9IHtKQVZBLCBJT307CkBAIC0xMDcsNiArMTA5LDcgQEAKIAljaGFyW11bXSBKQVZBX0xBTkdfRE9VQkxFID0ge0pBVkEsIExBTkcsICJEb3VibGUiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCiAJY2hhcltdW10gSkFWQV9MQU5HX0JPT0xFQU4gPSB7SkFWQSwgTEFORywgIkJvb2xlYW4iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCiAJY2hhcltdW10gSkFWQV9MQU5HX1ZPSUQgPSB7SkFWQSwgTEFORywgIlZvaWQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJY2hhcltdW10gSkFWQV9VVElMX0NPTExFQ1RJT04gPSB7SkFWQSwgVVRJTCwgIkNvbGxlY3Rpb24iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCiAJY2hhcltdW10gSkFWQV9VVElMX0lURVJBVE9SID0ge0pBVkEsIFVUSUwsICJJdGVyYXRvciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKIAljaGFyW11bXSBKQVZBX0xBTkdfREVQUkVDQVRFRCA9IHtKQVZBLCBMQU5HLCAiRGVwcmVjYXRlZCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKIAljaGFyW11bXSBKQVZBX0xBTkdfQU5OT1RBVElPTl9ET0NVTUVOVEVEID0ge0pBVkEsIExBTkcsIEFOTk9UQVRJT04sICJEb2N1bWVudGVkIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJApAQCAtMTI0LDExICsxMjcsMzQgQEAKIAljaGFyW11bXSBKQVZBX0lPX0lPRVhDRVBUSU9OID0gbmV3IGNoYXJbXVtdIHsgSkFWQSwgSU8sICJJT0V4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKX07Ly8kTk9OLU5MUy0xJAogCWNoYXJbXVtdIEpBVkFfSU9fT0JKRUNUT1VUUFVUU1RSRUFNID0gbmV3IGNoYXJbXVtdIHsgSkFWQSwgSU8sICJPYmplY3RPdXRwdXRTdHJlYW0iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCiAJY2hhcltdW10gSkFWQV9JT19PQkpFQ1RJTlBVVFNUUkVBTSA9IG5ldyBjaGFyW11bXSB7IEpBVkEsIElPLCAiT2JqZWN0SW5wdXRTdHJlYW0iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCi0JCisJLy8gamF2YXgucm1pLkNPUkJBLlN0dWIKKwljaGFyW11bXSBKQVZBWF9STUlfQ09SQkFfU1RVQiA9IG5ldyBjaGFyW11bXSB7CisJCQkiamF2YXgiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCSJybWkiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCSJDT1JCQSIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAorCQkJIlN0dWIiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwl9OworCWNoYXJbXVtdIEpBVkFfTEFOR19TQUZFVkFSQVJHUyA9ICB7SkFWQSwgTEFORywgIlNhZmVWYXJhcmdzIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBJTlZPS0UgPSAiaW52b2tlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdW10gSkFWQV9MQU5HX0lOVk9LRV9NRVRIT0RIQU5ETEVfUE9MWU1PUlBISUNTSUdOQVRVUkUgPSB7IC8vIFNpZ25hdHVyZSB3aGlsZSBwYXJzaW5nIGJpbmFyeSBmaWxlCisJCQlKQVZBLAorCQkJTEFORywKKwkJCUlOVk9LRSwKKwkJCSJNZXRob2RIYW5kbGUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCSJQb2x5bW9ycGhpY1NpZ25hdHVyZSIudG9DaGFyQXJyYXkoKSAvLyROT04tTkxTLTEkCisJfTsKKwljaGFyW11bXSBKQVZBX0xBTkdfSU5WT0tFX01FVEhPREhBTkRMRV8kX1BPTFlNT1JQSElDU0lHTkFUVVJFID0geyAvLyBTaWduYXR1cmUgd2hpbGUgcGFyc2luZyBzb3VyY2UgZmlsZQorCQkJSkFWQSwKKwkJCUxBTkcsCisJCQlJTlZPS0UsCisJCQkiTWV0aG9kSGFuZGxlJFBvbHltb3JwaGljU2lnbmF0dXJlIi50b0NoYXJBcnJheSgpIC8vJE5PTi1OTFMtMSQKKwl9OworCWNoYXJbXVtdIEpBVkFfTEFOR19BVVRPQ0xPU0VBQkxFID0gIHtKQVZBLCBMQU5HLCAiQXV0b0Nsb3NlYWJsZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwogCS8vIENvbnN0cmFpbnRzIGZvciBnZW5lcmljIHR5cGUgYXJndW1lbnQgaW5mZXJlbmNlCi0gICAgaW50IENPTlNUUkFJTlRfRVFVQUwgPSAwOwkJLy8gQWN0dWFsID0gRm9ybWFsCi0gICAgaW50IENPTlNUUkFJTlRfRVhURU5EUyA9IDE7CS8vIEFjdHVhbCA8PCBGb3JtYWwKLSAgICBpbnQgQ09OU1RSQUlOVF9TVVBFUiA9IDI7CQkvLyBBY3R1YWwgPj4gRm9ybWFsCisJaW50IENPTlNUUkFJTlRfRVFVQUwgPSAwOwkJLy8gQWN0dWFsID0gRm9ybWFsCisJaW50IENPTlNUUkFJTlRfRVhURU5EUyA9IDE7CS8vIEFjdHVhbCA8PCBGb3JtYWwKKwlpbnQgQ09OU1RSQUlOVF9TVVBFUiA9IDI7CQkvLyBBY3R1YWwgPj4gRm9ybWFsCiAKIAkvLyBDb25zdGFudHMgdXNlZCB0byBwZXJmb3JtIGJvdW5kIGNoZWNrcwogCWludCBPSyA9IDA7CkBAIC0xNDUsNyArMTcxLDkgQEAKIAljaGFyW10gU1lOVEhFVElDX09VVEVSX0xPQ0FMX1BSRUZJWCA9ICJ2YWwkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIFNZTlRIRVRJQ19FTkNMT1NJTkdfSU5TVEFOQ0VfUFJFRklYID0gInRoaXMkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIFNZTlRIRVRJQ19BQ0NFU1NfTUVUSE9EX1BSRUZJWCA9ICAiYWNjZXNzJCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCWNoYXJbXSBTWU5USEVUSUNfRU5VTV9DT05TVEFOVF9JTklUSUFMSVpBVElPTl9NRVRIT0RfUFJFRklYID0gICIgZW51bSBjb25zdGFudCBpbml0aWFsaXphdGlvbiQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU1lOVEhFVElDX1NUQVRJQ19GQUNUT1JZID0gICI8ZmFjdG9yeT4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwogCS8vIHN5bnRoZXRpYyBwYWNrYWdlLWluZm8gbmFtZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFBBQ0tBR0VfSU5GT19OQU1FID0gInBhY2thZ2UtaW5mbyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBQQUNLQUdFX0lORk9fTkFNRSA9ICJwYWNrYWdlLWluZm8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUlkcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEKaW5kZXggY2FlODE0ZS4uNmJiNjg0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NiwxMSArNTYsMTEgQEAKIAogCS8vIDEuNCBmZWF0dXJlcwogCWZpbmFsIGludCBUX0phdmFMYW5nQXNzZXJ0aW9uRXJyb3IgPSAzNTsKLQkKKwogCS8vIGFycmF5IGludGVyZmFjZXMKIAlmaW5hbCBpbnQgVF9KYXZhTGFuZ0Nsb25lYWJsZSA9IDM2OwogCWZpbmFsIGludCBUX0phdmFJb1NlcmlhbGl6YWJsZSA9IDM3OwotCSAgICAKKwogCS8vIDEuNSBmZWF0dXJlcwogCWZpbmFsIGludCBUX0phdmFMYW5nSXRlcmFibGUgPSAzODsKIAlmaW5hbCBpbnQgVF9KYXZhVXRpbEl0ZXJhdG9yID0gMzk7CkBAIC04Niw2ICs4NiwxNiBAQAogCWZpbmFsIGludCBUX0phdmFJb0V4dGVybmFsaXphYmxlID0gNTY7CiAJZmluYWwgaW50IFRfSmF2YUlvT2JqZWN0U3RyZWFtRXhjZXB0aW9uID0gNTc7CiAJZmluYWwgaW50IFRfSmF2YUlvRXhjZXB0aW9uID0gNTg7CisJCisJZmluYWwgaW50IFRfSmF2YVV0aWxDb2xsZWN0aW9uID0gNTk7CisJCisJLy8gamF2YSA3CisJZmluYWwgaW50IFRfSmF2YUxhbmdTYWZlVmFyYXJncyA9IDYwOworCQorCWZpbmFsIGludCBUX0phdmFMYW5nSW52b2tlTWV0aG9kSGFuZGxlUG9seW1vcnBoaWNTaWduYXR1cmUgPSA2MTsKKworCS8vIGphdmEgNyBqYXZhLmxhbmcuQXV0b0Nsb3NlYWJsZQorCWZpbmFsIGludCBUX0phdmFMYW5nQXV0b0Nsb3NlYWJsZSA9IDYyOwogCiAJZmluYWwgaW50IE5vSWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIApAQCAtMTU0LDggKzE2NCwxNyBAQAogCWZpbmFsIGludCBEb3VibGUyU3RyaW5nID0gVF9kb3VibGUgKyAoVF9KYXZhTGFuZ1N0cmluZyA8PCA0KTsKIAlmaW5hbCBpbnQgU3RyaW5nMlN0cmluZyA9IFRfSmF2YUxhbmdTdHJpbmcgKyAoVF9KYXZhTGFuZ1N0cmluZyA8PCA0KTsKIAlmaW5hbCBpbnQgT2JqZWN0MlN0cmluZyA9IFRfSmF2YUxhbmdPYmplY3QgKyAoVF9KYXZhTGFuZ1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgTnVsbDJOdWxsID0gVF9udWxsICsgKFRfbnVsbCA8PCA0KTsKIAlmaW5hbCBpbnQgTnVsbDJTdHJpbmcgPSBUX251bGwgKyAoVF9KYXZhTGFuZ1N0cmluZyA8PCA0KTsKIAlmaW5hbCBpbnQgT2JqZWN0Mk9iamVjdCA9IFRfSmF2YUxhbmdPYmplY3QgKyAoVF9KYXZhTGFuZ09iamVjdCA8PCA0KTsKKwlmaW5hbCBpbnQgT2JqZWN0MmJ5dGUgPSBUX0phdmFMYW5nT2JqZWN0ICsgKFRfYnl0ZSA8PCA0KTsKKwlmaW5hbCBpbnQgT2JqZWN0MnNob3J0ID0gVF9KYXZhTGFuZ09iamVjdCArIChUX3Nob3J0IDw8IDQpOworCWZpbmFsIGludCBPYmplY3QyY2hhciA9IFRfSmF2YUxhbmdPYmplY3QgKyAoVF9jaGFyIDw8IDQpOworCWZpbmFsIGludCBPYmplY3QyaW50ID0gVF9KYXZhTGFuZ09iamVjdCArIChUX2ludCA8PCA0KTsKKwlmaW5hbCBpbnQgT2JqZWN0MmxvbmcgPSBUX0phdmFMYW5nT2JqZWN0ICsgKFRfbG9uZyA8PCA0KTsKKwlmaW5hbCBpbnQgT2JqZWN0MmZsb2F0ID0gVF9KYXZhTGFuZ09iamVjdCArIChUX2Zsb2F0IDw8IDQpOworCWZpbmFsIGludCBPYmplY3QyZG91YmxlID0gVF9KYXZhTGFuZ09iamVjdCArIChUX2RvdWJsZSA8PCA0KTsKKwlmaW5hbCBpbnQgT2JqZWN0MmJvb2xlYW4gPSBUX0phdmFMYW5nT2JqZWN0ICsgKFRfYm9vbGVhbiA8PCA0KTsKIAlmaW5hbCBpbnQgQk9YSU5HID0gMHgyMDA7CiAJZmluYWwgaW50IFVOQk9YSU5HID0gMHg0MDA7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVWYXJpYWJsZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZVZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IGUzZWY3NmYuLjdiNmM4NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZVZhcmlhYmxlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZVZhcmlhYmxlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDI4MjE1MiAtIFsxLjVdW2NvbXBpbGVyXSBHZW5lcmljcyBjb2RlIHJlamVjdGVkIGJ5IEVjbGlwc2UgYnV0IGFjY2VwdGVkIGJ5IGphdmFjCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIApAQCAtMTksNzUgKzIwLDczIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgUmVmZXJlbmNlQmluZGluZyB7CiAKLQlwdWJsaWMgQmluZGluZyBkZWNsYXJpbmdFbGVtZW50OyAvLyBiaW5kaW5nIG9mIGRlY2xhcmluZyB0eXBlIG9yIG1ldGhvZCAKKwlwdWJsaWMgQmluZGluZyBkZWNsYXJpbmdFbGVtZW50OyAvLyBiaW5kaW5nIG9mIGRlY2xhcmluZyB0eXBlIG9yIG1ldGhvZAogCXB1YmxpYyBpbnQgcmFuazsgLy8gZGVjbGFyYXRpb24gcmFuaywgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdmFyaWFibGUgaW4gcGFyYW1ldGVyaXplZCB0eXBlCiAKIAkvKioKIAkgKiBEZW5vdGUgdGhlIGZpcnN0IGV4cGxpY2l0IChiaW5kaW5nKSBib3VuZCBhbW9uZ3N0IHRoZSBzdXBlcnR5cGVzIChmcm9tIGRlY2xhcmF0aW9uIGluIHNvdXJjZSkKIAkgKiBJZiBubyBzdXBlcmNsYXNzIHdhcyBzcGVjaWZpZWQsIHRoZW4gaXQgZGVub3RlcyB0aGUgZmlyc3Qgc3VwZXJpbnRlcmZhY2UsIG9yIG51bGwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBUeXBlQmluZGluZyBmaXJzdEJvdW5kOyAKKwlwdWJsaWMgVHlwZUJpbmRpbmcgZmlyc3RCb3VuZDsKIAogCS8vIGFjdHVhbCByZXNvbHZlZCB2YXJpYWJsZSBzdXBlcnR5cGVzIChpZiBubyBzdXBlcmNsYXNzIGJvdW5kLCB0aGVuIGFzc29jaWF0ZWQgdG8gT2JqZWN0KQogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3M7Ci0JcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXM7IAorCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzOwogCXB1YmxpYyBjaGFyW10gZ2VuZXJpY1R5cGVTaWduYXR1cmU7Ci0KLQlwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZyhjaGFyW10gc291cmNlTmFtZSwgQmluZGluZyBkZWNsYXJpbmdFbGVtZW50LCBpbnQgcmFuaykgeworCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OworCQorCXB1YmxpYyBUeXBlVmFyaWFibGVCaW5kaW5nKGNoYXJbXSBzb3VyY2VOYW1lLCBCaW5kaW5nIGRlY2xhcmluZ0VsZW1lbnQsIGludCByYW5rLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogCQl0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOwogCQl0aGlzLmRlY2xhcmluZ0VsZW1lbnQgPSBkZWNsYXJpbmdFbGVtZW50OwogCQl0aGlzLnJhbmsgPSByYW5rOwogCQl0aGlzLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7IC8vIHRyZWF0IHR5cGUgdmFyIGFzIHB1YmxpYwogCQl0aGlzLnRhZ0JpdHMgfD0gVGFnQml0cy5IYXNUeXBlVmFyaWFibGU7CisJCXRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKIAl9CiAKLQlwdWJsaWMgaW50IGtpbmQoKSB7Ci0JCXJldHVybiBUWVBFX1BBUkFNRVRFUjsKLQl9CQotCQogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgdHlwZSBzYXRpc2ZpZXMgYWxsIGJvdW5kcyBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIKIAkgKi8KIAlwdWJsaWMgaW50IGJvdW5kQ2hlY2soU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiwgVHlwZUJpbmRpbmcgYXJndW1lbnRUeXBlKSB7Ci0KLQkJaWYgKGFyZ3VtZW50VHlwZSA9PSBUeXBlQmluZGluZy5OVUxMIHx8IGFyZ3VtZW50VHlwZSA9PSB0aGlzKQorCQlpZiAoYXJndW1lbnRUeXBlID09IFR5cGVCaW5kaW5nLk5VTEwgfHwgYXJndW1lbnRUeXBlID09IHRoaXMpIHsKIAkJCXJldHVybiBUeXBlQ29uc3RhbnRzLk9LOworCQl9CiAJCWJvb2xlYW4gaGFzU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uICE9IG51bGw7CiAJCWlmICghKGFyZ3VtZW50VHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgfHwgYXJndW1lbnRUeXBlLmlzQXJyYXlUeXBlKCkpKQotCQkJcmV0dXJuIFR5cGVDb25zdGFudHMuTUlTTUFUQ0g7CQorCQkJcmV0dXJuIFR5cGVDb25zdGFudHMuTUlTTUFUQ0g7CiAJCS8vIHNwZWNpYWwgY2FzZSBmb3IgcmUtZW50cmFudCBzb3VyY2UgdHlwZXMgKHNlbGVjdGlvbiwgY29kZSBhc3Npc3QsIGV0YykuLi4KIAkJLy8gY2FuIHJlcXVlc3QgYWRkaXRpb25hbCB0eXBlcyBkdXJpbmcgaGllcmFyY2h5IHdhbGsgdGhhdCBhcmUgZm91bmQgYXMgc291cmNlIHR5cGVzIHRoYXQgYWxzbyAnbmVlZCcgdG8gY29ubmVjdCB0aGVpciBoaWVyYXJjaHkKIAkJaWYgKHRoaXMuc3VwZXJjbGFzcyA9PSBudWxsKQogCQkJcmV0dXJuIFR5cGVDb25zdGFudHMuT0s7CiAKLQkJaWYgKGFyZ3VtZW50VHlwZS5pc1dpbGRjYXJkKCkgJiYgIWFyZ3VtZW50VHlwZS5pc0ludGVyc2VjdGlvblR5cGUoKSkgeworCQlpZiAoYXJndW1lbnRUeXBlLmtpbmQoKSA9PSBCaW5kaW5nLldJTERDQVJEX1RZUEUpIHsKIAkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFyZ3VtZW50VHlwZTsKIAkJCXN3aXRjaCh3aWxkY2FyZC5ib3VuZEtpbmQpIHsKIAkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgogCQkJCQlUeXBlQmluZGluZyB3aWxkY2FyZEJvdW5kID0gd2lsZGNhcmQuYm91bmQ7Ci0JCQkJCWlmICh3aWxkY2FyZEJvdW5kID09IHRoaXMpIAorCQkJCQlpZiAod2lsZGNhcmRCb3VuZCA9PSB0aGlzKQogCQkJCQkJcmV0dXJuIFR5cGVDb25zdGFudHMuT0s7Ci0JCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzc0JvdW5kID0gaGFzU3Vic3RpdHV0aW9uID8gKFJlZmVyZW5jZUJpbmRpbmcpU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMuc3VwZXJjbGFzcykgOiB0aGlzLnN1cGVyY2xhc3M7CiAJCQkJCWJvb2xlYW4gaXNBcnJheUJvdW5kID0gd2lsZGNhcmRCb3VuZC5pc0FycmF5VHlwZSgpOwogCQkJCQlpZiAoIXdpbGRjYXJkQm91bmQuaXNJbnRlcmZhY2UoKSkgewotCQkJCQkJaWYgKHN1cGVyY2xhc3NCb3VuZC5pZCAhPSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpIHsKKwkJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkU3VwZXJUeXBlID0gaGFzU3Vic3RpdHV0aW9uID8gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMuc3VwZXJjbGFzcykgOiB0aGlzLnN1cGVyY2xhc3M7CisJCQkJCQlpZiAoc3Vic3RpdHV0ZWRTdXBlclR5cGUuaWQgIT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7CiAJCQkJCQkJaWYgKGlzQXJyYXlCb3VuZCkgewotCQkJCQkJCQlpZiAoIXdpbGRjYXJkQm91bmQuaXNDb21wYXRpYmxlV2l0aChzdXBlcmNsYXNzQm91bmQpKQorCQkJCQkJCQlpZiAoIXdpbGRjYXJkQm91bmQuaXNDb21wYXRpYmxlV2l0aChzdWJzdGl0dXRlZFN1cGVyVHlwZSkpCiAJCQkJCQkJCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5NSVNNQVRDSDsKIAkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlUeXBlQmluZGluZyBtYXRjaCA9IHdpbGRjYXJkQm91bmQuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShzdXBlcmNsYXNzQm91bmQpOworCQkJCQkJCQlUeXBlQmluZGluZyBtYXRjaCA9IHdpbGRjYXJkQm91bmQuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShzdWJzdGl0dXRlZFN1cGVyVHlwZSk7CiAJCQkJCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIW1hdGNoLmlzSW50ZXJzZWN0aW5nV2l0aChzdXBlcmNsYXNzQm91bmQpKSB7CisJCQkJCQkJCQlpZiAoc3Vic3RpdHV0ZWRTdXBlclR5cGUuaXNQcm92YWJseURpc3RpbmN0KG1hdGNoKSkgewogCQkJCQkJCQkJCXJldHVybiBUeXBlQ29uc3RhbnRzLk1JU01BVENIOwogCQkJCQkJCQkJfQogCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJbWF0Y2ggPSAgc3VwZXJjbGFzc0JvdW5kLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUod2lsZGNhcmRCb3VuZCk7CisJCQkJCQkJCQltYXRjaCA9ICBzdWJzdGl0dXRlZFN1cGVyVHlwZS5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKHdpbGRjYXJkQm91bmQpOwogCQkJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAoIW1hdGNoLmlzSW50ZXJzZWN0aW5nV2l0aCh3aWxkY2FyZEJvdW5kKSkgeworCQkJCQkJCQkJCWlmIChtYXRjaC5pc1Byb3ZhYmx5RGlzdGluY3Qod2lsZGNhcmRCb3VuZCkpIHsKIAkJCQkJCQkJCQkJcmV0dXJuIFR5cGVDb25zdGFudHMuTUlTTUFUQ0g7CiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlpZiAoIXdpbGRjYXJkQm91bmQuaXNUeXBlVmFyaWFibGUoKSAmJiAhc3VwZXJjbGFzc0JvdW5kLmlzVHlwZVZhcmlhYmxlKCkpIHsKKwkJCQkJCQkJCQlpZiAoIXdpbGRjYXJkQm91bmQuaXNUeXBlVmFyaWFibGUoKSAmJiAhc3Vic3RpdHV0ZWRTdXBlclR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewogCQkJCQkJCQkJCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5NSVNNQVRDSDsKIAkJCQkJCQkJCQl9CiAJCQkJCQkJCQl9CkBAIC05NSwxOCArOTQsMTYgQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlQm91bmRzID0gaGFzU3Vic3RpdHV0aW9uID8gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMuc3VwZXJJbnRlcmZhY2VzKSA6IHRoaXMuc3VwZXJJbnRlcmZhY2VzOwotCQkJCQlpbnQgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VCb3VuZHMubGVuZ3RoOwogCQkJCQlib29sZWFuIG11c3RJbXBsZW1lbnQgPSBpc0FycmF5Qm91bmQgfHwgKChSZWZlcmVuY2VCaW5kaW5nKXdpbGRjYXJkQm91bmQpLmlzRmluYWwoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJVHlwZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2VCb3VuZCA9IHN1cGVySW50ZXJmYWNlQm91bmRzW2ldOworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCVR5cGVCaW5kaW5nIHN1YnN0aXR1dGVkU3VwZXJUeXBlID0gaGFzU3Vic3RpdHV0aW9uID8gU2NvcGUuc3Vic3RpdHV0ZShzdWJzdGl0dXRpb24sIHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldKSA6IHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldOwogCQkJCQkJaWYgKGlzQXJyYXlCb3VuZCkgewotCQkJCQkJCWlmICghd2lsZGNhcmRCb3VuZC5pc0NvbXBhdGlibGVXaXRoKHN1cGVySW50ZXJmYWNlQm91bmQpKQorCQkJCQkJCWlmICghd2lsZGNhcmRCb3VuZC5pc0NvbXBhdGlibGVXaXRoKHN1YnN0aXR1dGVkU3VwZXJUeXBlKSkKIAkJCQkJCQkJCXJldHVybiBUeXBlQ29uc3RhbnRzLk1JU01BVENIOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlUeXBlQmluZGluZyBtYXRjaCA9IHdpbGRjYXJkQm91bmQuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShzdXBlckludGVyZmFjZUJvdW5kKTsKKwkJCQkJCQlUeXBlQmluZGluZyBtYXRjaCA9IHdpbGRjYXJkQm91bmQuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShzdWJzdGl0dXRlZFN1cGVyVHlwZSk7CiAJCQkJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKCFtYXRjaC5pc0ludGVyc2VjdGluZ1dpdGgoc3VwZXJJbnRlcmZhY2VCb3VuZCkpIHsKKwkJCQkJCQkJaWYgKHN1YnN0aXR1dGVkU3VwZXJUeXBlLmlzUHJvdmFibHlEaXN0aW5jdChtYXRjaCkpIHsKIAkJCQkJCQkJCXJldHVybiBUeXBlQ29uc3RhbnRzLk1JU01BVENIOwogCQkJCQkJCQl9CiAJCQkJCQkJfSBlbHNlIGlmIChtdXN0SW1wbGVtZW50KSB7CkBAIC0xMTYsMTAgKzExMywxMyBAQAogCiAJCQkJCX0KIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6CisJCQkJCS8vIGlmIHRoZSB3aWxkY2FyZCBpcyBsb3dlci1ib3VuZGVkIGJ5IGEgdHlwZSB2YXJpYWJsZSB0aGF0IGhhcyBubyByZWxldmFudCB1cHBlciBib3VuZCB0aGVyZSdzIG5vdGhpbmcgdG8gY2hlY2sgaGVyZSAoYnVnIDI4MjE1Mik6CisJCQkJCWlmICh3aWxkY2FyZC5ib3VuZC5pc1R5cGVWYXJpYWJsZSgpICYmICgoVHlwZVZhcmlhYmxlQmluZGluZyl3aWxkY2FyZC5ib3VuZCkuc3VwZXJjbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QpCisJCQkJCQlicmVhazsKIAkJCQkJcmV0dXJuIGJvdW5kQ2hlY2soc3Vic3RpdHV0aW9uLCB3aWxkY2FyZC5ib3VuZCk7Ci0JCQkJCQorCiAJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKIAkJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMzIsNyArMTMyLDcgQEAKIAkJCQlpZiAoIWFyZ3VtZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKHN1YnN0aXR1dGVkU3VwZXJUeXBlKSkgewogCQkJCSAgICByZXR1cm4gVHlwZUNvbnN0YW50cy5NSVNNQVRDSDsKIAkJCQl9Ci0JCQkJVHlwZUJpbmRpbmcgbWF0Y2ggPSBhcmd1bWVudFR5cGUuZmluZFN1cGVyVHlwZVdpdGhTYW1lRXJhc3VyZShzdWJzdGl0dXRlZFN1cGVyVHlwZSk7CisJCQkJVHlwZUJpbmRpbmcgbWF0Y2ggPSBhcmd1bWVudFR5cGUuZmluZFN1cGVyVHlwZU9yaWdpbmF0aW5nRnJvbShzdWJzdGl0dXRlZFN1cGVyVHlwZSk7CiAJCQkJaWYgKG1hdGNoICE9IG51bGwpewogCQkJCQkvLyBFbnVtI1JBVyBpcyBub3QgYSBzdWJzdGl0dXRlIGZvciA8RSBleHRlbmRzIEVudW08RT4+ICg4NjgzOCkKIAkJCQkJaWYgKG1hdGNoLmlzUmF3VHlwZSgpICYmIHN1YnN0aXR1dGVkU3VwZXJUeXBlLmlzQm91bmRQYXJhbWV0ZXJpemVkVHlwZSgpKQpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQkJaWYgKCFhcmd1bWVudFR5cGUuaXNDb21wYXRpYmxlV2l0aChzdWJzdGl0dXRlZFN1cGVyVHlwZSkpIHsKIAkJCQkgICAgcmV0dXJuIFR5cGVDb25zdGFudHMuTUlTTUFUQ0g7CiAJCQkJfQotCQkJCVR5cGVCaW5kaW5nIG1hdGNoID0gYXJndW1lbnRUeXBlLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUoc3Vic3RpdHV0ZWRTdXBlclR5cGUpOworCQkJCVR5cGVCaW5kaW5nIG1hdGNoID0gYXJndW1lbnRUeXBlLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oc3Vic3RpdHV0ZWRTdXBlclR5cGUpOwogCQkJCWlmIChtYXRjaCAhPSBudWxsKXsKIAkJCQkJLy8gRW51bSNSQVcgaXMgbm90IGEgc3Vic3RpdHV0ZSBmb3IgPEUgZXh0ZW5kcyBFbnVtPEU+PiAoODY4MzgpCiAJCQkJCWlmIChtYXRjaC5pc1Jhd1R5cGUoKSAmJiBzdWJzdGl0dXRlZFN1cGVyVHlwZS5pc0JvdW5kUGFyYW1ldGVyaXplZFR5cGUoKSkKQEAgLTE1Niw3ICsxNTYsMTcgQEAKIAkgICAgfQogCSAgICByZXR1cm4gdW5jaGVja2VkID8gVHlwZUNvbnN0YW50cy5VTkNIRUNLRUQgOiBUeXBlQ29uc3RhbnRzLk9LOwogCX0KLQkKKworCXB1YmxpYyBpbnQgYm91bmRzQ291bnQoKSB7CisJCWlmICh0aGlzLmZpcnN0Qm91bmQgPT0gbnVsbCkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAodGhpcy5maXJzdEJvdW5kID09IHRoaXMuc3VwZXJjbGFzcykgeworCQkJcmV0dXJuIHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCArIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoOworCQl9CisJfQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjY2FuQmVJbnN0YW50aWF0ZWQoKQogCSAqLwpAQCAtMTcyLDEwICsxODIsMTAgQEAKIAkgKiAgIEEgPj4gRiAgIGNvcnJlc3BvbmRzIHRvOiAgIEYuY29sbGVjdFN1YnN0aXR1dGVzKC4uLiwgQSwgLi4uLCBDT05TVFJBSU5UX1NVUEVSICgyKSkKIAkgKi8KIAlwdWJsaWMgdm9pZCBjb2xsZWN0U3Vic3RpdHV0ZXMoU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIGFjdHVhbFR5cGUsIEluZmVyZW5jZUNvbnRleHQgaW5mZXJlbmNlQ29udGV4dCwgaW50IGNvbnN0cmFpbnQpIHsKLQkJCisKIAkJLy8Jb25seSBpbmZlciBmb3IgdHlwZSBwYXJhbXMgb2YgdGhlIGdlbmVyaWMgbWV0aG9kCiAJCWlmICh0aGlzLmRlY2xhcmluZ0VsZW1lbnQgIT0gaW5mZXJlbmNlQ29udGV4dC5nZW5lcmljTWV0aG9kKSByZXR1cm47Ci0JCQorCiAJCS8vIGNhbm5vdCBpbmZlciBhbnl0aGluZyBmcm9tIGEgbnVsbCB0eXBlCiAJCXN3aXRjaCAoYWN0dWFsVHlwZS5raW5kKCkpIHsKIAkJCWNhc2UgQmluZGluZy5CQVNFX1RZUEUgOgpAQCAtMTg1LDExICsxOTUsOSBAQAogCQkJCWFjdHVhbFR5cGUgPSBib3hlZFR5cGU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6Ci0JCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKLQkJCQlpZiAoYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgIT0gbnVsbCkgYnJlYWs7IC8vIGludGVyc2VjdGlvbiB0eXBlCiAJCQkJcmV0dXJuOyAvLyB3aWxkY2FyZHMgYXJlIG5vdCB0cnVlIHR5cGUgZXhwcmVzc2lvbnMgKEpMUyAxNS4xMi4yLjcsIHAuNDUzIDJuZCBkaXNjdXNzaW9uKQogCQl9Ci0JCisKIAkJLy8gcmV2ZXJzZSBjb25zdHJhaW50LCB0byByZWZsZWN0IHZhcmlhYmxlIG9uIHJoczogICBBIDw8IFQgLS0+IFQgPjogQQogCQlpbnQgdmFyaWFibGVDb25zdHJhaW50OwogCQlzd2l0Y2goY29uc3RyYWludCkgewpAQCAtMjA2LDEzICsyMTQsNyBAQAogCQl9CiAJCWluZmVyZW5jZUNvbnRleHQucmVjb3JkU3Vic3RpdHV0ZSh0aGlzLCBhY3R1YWxUeXBlLCB2YXJpYWJsZUNvbnN0cmFpbnQpOwogCX0KLQkKLQlwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSB7IC8qIGphdmEvbGFuZy9PYmplY3QgKi8gCi0JICAgIGlmICh0aGlzLmZpcnN0Qm91bmQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZmlyc3RCb3VuZC5jb25zdGFudFBvb2xOYW1lKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHRoaXMuc3VwZXJjbGFzcy5jb25zdGFudFBvb2xOYW1lKCk7IC8vIGphdmEvbGFuZy9PYmplY3QKLQl9CisKIAkvKgogCSAqIGRlY2xhcmluZ1VuaXF1ZUtleSA6IGdlbmVyaWNUeXBlU2lnbmF0dXJlCiAJICogcC5YPFQ+IHsgLi4uIH0gLS0+IExwL1g7OlRUOwpAQCAtMjM3LDcgKzIzOSw3IEBACiAJCQkJfQogCQl9IGVsc2UgewogCQkJYnVmZmVyLmFwcGVuZChkZWNsYXJpbmcuY29tcHV0ZVVuaXF1ZUtleShmYWxzZS8qbm90IGEgbGVhZiovKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCc6Jyk7CQkJCisJCQlidWZmZXIuYXBwZW5kKCc6Jyk7CiAJCX0KIAkJYnVmZmVyLmFwcGVuZChnZW5lcmljVHlwZVNpZ25hdHVyZSgpKTsKIAkJaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKQEAgLTI0NSwxOCArMjQ3LDI0IEBACiAJCWJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIHVuaXF1ZUtleSwgMCk7CiAJCXJldHVybiB1bmlxdWVLZXk7CiAJfQorCXB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIHsgLyogamF2YS9sYW5nL09iamVjdCAqLworCSAgICBpZiAodGhpcy5maXJzdEJvdW5kICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLmZpcnN0Qm91bmQuY29uc3RhbnRQb29sTmFtZSgpOworCSAgICB9CisJICAgIHJldHVybiB0aGlzLnN1cGVyY2xhc3MuY29uc3RhbnRQb29sTmFtZSgpOyAvLyBqYXZhL2xhbmcvT2JqZWN0CisJfQogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNkZWJ1Z05hbWUoKQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZGVidWdOYW1lKCkgewotCSAgICByZXR1cm4gbmV3IFN0cmluZyh0aGlzLnNvdXJjZU5hbWUpOwkJCi0JfQkJCisJICAgIHJldHVybiBuZXcgU3RyaW5nKHRoaXMuc291cmNlTmFtZSk7CisJfQogCXB1YmxpYyBUeXBlQmluZGluZyBlcmFzdXJlKCkgewogCSAgICBpZiAodGhpcy5maXJzdEJvdW5kICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLmZpcnN0Qm91bmQuZXJhc3VyZSgpOwogCSAgICB9CiAJICAgIHJldHVybiB0aGlzLnN1cGVyY2xhc3M7IC8vIGphdmEvbGFuZy9PYmplY3QKLQl9CQorCX0KIAkvKioKIAkgKiBUOjpMamF2YS91dGlsL01hcDs6TGphdmEvaW8vU2VyaWFsaXphYmxlOwogCSAqIFQ6TFk8VFQ7PgpAQCAtMjc0LDcgKzI4Miw3IEBACiAJCX0KIAkJaW50IHNpZ0xlbmd0aCA9IHNpZy5sZW5ndGgoKTsKIAkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSBuZXcgY2hhcltzaWdMZW5ndGhdOwotCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCBnZW5lcmljU2lnbmF0dXJlLCAwKTsJCQkJCQorCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCBnZW5lcmljU2lnbmF0dXJlLCAwKTsKIAkJcmV0dXJuIGdlbmVyaWNTaWduYXR1cmU7CiAJfQogCS8qKgpAQCAtMjg2LDExICsyOTQsMjQgQEAKIAkJcmV0dXJuIHRoaXMuZ2VuZXJpY1R5cGVTaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgnVCcsIHRoaXMuc291cmNlTmFtZSwgJzsnKTsKIAl9CiAKKwlib29sZWFuIGhhc09ubHlSYXdCb3VuZHMoKSB7CisJCWlmICh0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCAmJiB0aGlzLmZpcnN0Qm91bmQgPT0gdGhpcy5zdXBlcmNsYXNzKQorCQkJaWYgKCF0aGlzLnN1cGVyY2xhc3MuaXNSYXdUeXBlKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsKQorCQkJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCSAgIAkJaWYgKCF0aGlzLnN1cGVySW50ZXJmYWNlc1tpXS5pc1Jhd1R5cGUoKSkKKwkJICAgCQkJcmV0dXJuIGZhbHNlOworCisJCXJldHVybiB0cnVlOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSB2YXJpYWJsZSBpcyBkaXJlY3RseSBib3VuZCB0byBhIGdpdmVuIHR5cGUKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0VyYXN1cmVCb3VuZFRvKFR5cGVCaW5kaW5nIHR5cGUpIHsKLQkJaWYgKHRoaXMuc3VwZXJjbGFzcy5lcmFzdXJlKCkgPT0gdHlwZSkgCisJCWlmICh0aGlzLnN1cGVyY2xhc3MuZXJhc3VyZSgpID09IHR5cGUpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXNbaV0uZXJhc3VyZSgpID09IHR5cGUpCkBAIC0yOTgsNyArMzE5LDExIEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKworCXB1YmxpYyBib29sZWFuIGlzSGllcmFyY2h5Q29ubmVjdGVkKCkgeworCQlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NVbnJlc29sdmVkKSA9PSAwOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgMiB2YXJpYWJsZXMgYXJlIHBsYXlpbmcgZXhhY3Qgc2FtZSByb2xlOiB0aGV5IGhhdmUKIAkgKiB0aGUgc2FtZSBib3VuZHMsIHByb3ZpZGluZyBvbmUgaXMgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgb3RoZXI6IDxUMSBleHRlbmRzCkBAIC0zMjMsNyArMzQ4LDcgQEAKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgd2FzIGRlY2xhcmVkIGFzIGEgdHlwZSB2YXJpYWJsZQogCSAqLwpAQCAtMzMxLDQ3ICszNTYsNjkgQEAKIAkgICAgcmV0dXJuIHRydWU7CiAJfQogCi0JLyoqIAotCSAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHR5cGUgdmFyaWFibGUgZm9yIGEgZ2l2ZW4gdmFyaWFibGUuCi0JICogT25seSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciBmb3IgdHlwZSB2YXJpYWJsZXMgb2YgZ2VuZXJpYyBtZXRob2RzIG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMKLQkgKiBlLmcuIFg8VT4geyAgIDxWMSBleHRlbmRzIFU+IFUgZm9vKFYxKSAgIH0gLS0+IFg8U3RyaW5nPiB7IDxWMiBleHRlbmRzIFN0cmluZz4gU3RyaW5nIGZvbyhWMikgIH0gIAotCSAqICAgICAgICAgYW5kIFYyLm9yaWdpbmFsKCkgLS0+IFYxCi0JICovCi0JcHVibGljIFR5cGVWYXJpYWJsZUJpbmRpbmcgb3JpZ2luYWwoKSB7Ci0JCWlmICh0aGlzLmRlY2xhcmluZ0VsZW1lbnQua2luZCgpID09IEJpbmRpbmcuTUVUSE9EKSB7Ci0JCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kID0gKChNZXRob2RCaW5kaW5nKXRoaXMuZGVjbGFyaW5nRWxlbWVudCkub3JpZ2luYWwoKTsKLQkJCWlmIChvcmlnaW5hbE1ldGhvZCAhPSB0aGlzLmRlY2xhcmluZ0VsZW1lbnQpIHsKLQkJCQlyZXR1cm4gb3JpZ2luYWxNZXRob2QudHlwZVZhcmlhYmxlc1t0aGlzLnJhbmtdOwotCQkJfQotCQl9IGVsc2UgewotCQkJUmVmZXJlbmNlQmluZGluZyBvcmlnaW5hbFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykoKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5kZWNsYXJpbmdFbGVtZW50KS5lcmFzdXJlKCk7Ci0JCQlpZiAob3JpZ2luYWxUeXBlICE9IHRoaXMuZGVjbGFyaW5nRWxlbWVudCkgewotCQkJCXJldHVybiBvcmlnaW5hbFR5cGUudHlwZVZhcmlhYmxlcygpW3RoaXMucmFua107Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXM7CisvLwkvKioKKy8vCSAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHR5cGUgdmFyaWFibGUgZm9yIGEgZ2l2ZW4gdmFyaWFibGUuCisvLwkgKiBPbmx5IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIGZvciB0eXBlIHZhcmlhYmxlcyBvZiBnZW5lcmljIG1ldGhvZHMgb2YgcGFyYW1ldGVyaXplZCB0eXBlcworLy8JICogZS5nLiBYPFU+IHsgICA8VjEgZXh0ZW5kcyBVPiBVIGZvbyhWMSkgICB9IC0tPiBYPFN0cmluZz4geyA8VjIgZXh0ZW5kcyBTdHJpbmc+IFN0cmluZyBmb28oVjIpICB9CisvLwkgKiAgICAgICAgIGFuZCBWMi5vcmlnaW5hbCgpIC0tPiBWMQorLy8JICovCisvLwlwdWJsaWMgVHlwZVZhcmlhYmxlQmluZGluZyBvcmlnaW5hbCgpIHsKKy8vCQlpZiAodGhpcy5kZWNsYXJpbmdFbGVtZW50LmtpbmQoKSA9PSBCaW5kaW5nLk1FVEhPRCkgeworLy8JCQlNZXRob2RCaW5kaW5nIG9yaWdpbmFsTWV0aG9kID0gKChNZXRob2RCaW5kaW5nKXRoaXMuZGVjbGFyaW5nRWxlbWVudCkub3JpZ2luYWwoKTsKKy8vCQkJaWYgKG9yaWdpbmFsTWV0aG9kICE9IHRoaXMuZGVjbGFyaW5nRWxlbWVudCkgeworLy8JCQkJcmV0dXJuIG9yaWdpbmFsTWV0aG9kLnR5cGVWYXJpYWJsZXNbdGhpcy5yYW5rXTsKKy8vCQkJfQorLy8JCX0gZWxzZSB7CisvLwkJCVJlZmVyZW5jZUJpbmRpbmcgb3JpZ2luYWxUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpKChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuZGVjbGFyaW5nRWxlbWVudCkuZXJhc3VyZSgpOworLy8JCQlpZiAob3JpZ2luYWxUeXBlICE9IHRoaXMuZGVjbGFyaW5nRWxlbWVudCkgeworLy8JCQkJcmV0dXJuIG9yaWdpbmFsVHlwZS50eXBlVmFyaWFibGVzKClbdGhpcy5yYW5rXTsKKy8vCQkJfQorLy8JCX0KKy8vCQlyZXR1cm4gdGhpczsKKy8vCX0KKworCXB1YmxpYyBpbnQga2luZCgpIHsKKwkJcmV0dXJuIEJpbmRpbmcuVFlQRV9QQVJBTUVURVI7CiAJfQotCQorCisJcHVibGljIFR5cGVCaW5kaW5nW10gb3RoZXJVcHBlckJvdW5kcygpIHsKKwkJaWYgKHRoaXMuZmlyc3RCb3VuZCA9PSBudWxsKQorCQkJcmV0dXJuIEJpbmRpbmcuTk9fVFlQRVM7CisJCWlmICh0aGlzLmZpcnN0Qm91bmQgPT0gdGhpcy5zdXBlcmNsYXNzKQorCQkJcmV0dXJuIHRoaXMuc3VwZXJJbnRlcmZhY2VzOworCQlpbnQgb3RoZXJMZW5ndGggPSB0aGlzLnN1cGVySW50ZXJmYWNlcy5sZW5ndGggLSAxOworCQlpZiAob3RoZXJMZW5ndGggPiAwKSB7CisJCQlUeXBlQmluZGluZ1tdIG90aGVyQm91bmRzOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1cGVySW50ZXJmYWNlcywgMSwgb3RoZXJCb3VuZHMgPSBuZXcgVHlwZUJpbmRpbmdbb3RoZXJMZW5ndGhdLCAwLCBvdGhlckxlbmd0aCk7CisJCQlyZXR1cm4gb3RoZXJCb3VuZHM7CisJCX0KKwkJcmV0dXJuIEJpbmRpbmcuTk9fVFlQRVM7CisJfQorCiAJLyoqCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjcmVhZGFibGVOYW1lKCkKICAgICAgKi8KICAgICBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlTmFtZTsKICAgICB9Ci0gICAKLQlSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmUoTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKKwlSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmUoKSB7CiAJCWlmICgodGhpcy5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1VucmVzb2x2ZWQpID09IDApCiAJCQlyZXR1cm4gdGhpczsKIAogCQlUeXBlQmluZGluZyBvbGRTdXBlcmNsYXNzID0gdGhpcy5zdXBlcmNsYXNzLCBvbGRGaXJzdEludGVyZmFjZSA9IG51bGw7Ci0JCWlmICh0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCkKLQkJCXRoaXMuc3VwZXJjbGFzcyA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHRoaXMuc3VwZXJjbGFzcywgZW52aXJvbm1lbnQsIHRydWUpOworCQlpZiAodGhpcy5zdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZVR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUodGhpcy5zdXBlcmNsYXNzLCB0aGlzLmVudmlyb25tZW50LCB0cnVlIC8qIHJhdyBjb252ZXJzaW9uICovKTsKKwkJCXRoaXMudGFnQml0cyB8PSByZXNvbHZlVHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzOworCQkJdGhpcy5zdXBlcmNsYXNzID0gcmVzb2x2ZVR5cGU7CisJCX0KIAkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSB0aGlzLnN1cGVySW50ZXJmYWNlczsKIAkJaW50IGxlbmd0aDsKIAkJaWYgKChsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aCkgIT0gMCkgewogCQkJb2xkRmlyc3RJbnRlcmZhY2UgPSBpbnRlcmZhY2VzWzBdOwogCQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7Ci0JCQkJaW50ZXJmYWNlc1tpXSA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKGludGVyZmFjZXNbaV0sIGVudmlyb25tZW50LCB0cnVlKTsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmVUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKGludGVyZmFjZXNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIHRydWUgLyogcmF3IGNvbnZlcnNpb24gKi8pOworCQkJCXRoaXMudGFnQml0cyB8PSByZXNvbHZlVHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzOworCQkJCWludGVyZmFjZXNbaV0gPSByZXNvbHZlVHlwZTsKIAkJCX0KIAkJfQogCQkvLyByZWZyZXNoIHRoZSBmaXJzdEJvdW5kIGluIGNhc2UgaXQgY2hhbmdlZApAQCAtMzg1LDE5ICs0MzIsMjAgQEAKIAkJdGhpcy5tb2RpZmllcnMgJj0gfkV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZDsKIAkJcmV0dXJuIHRoaXM7CiAJfQotCQogCS8qKgogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI3Nob3J0UmVhZGFibGVOYW1lKCkKICAgICAgKi8KICAgICBwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkYWJsZU5hbWUoKTsKKyAgICAgICAgcmV0dXJuIHJlYWRhYmxlTmFtZSgpOwogICAgIH0KIAlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gc3VwZXJjbGFzczsKKwkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzczsKIAl9CisJCiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMoKSB7Ci0JCXJldHVybiBzdXBlckludGVyZmFjZXM7Ci0JfQkKKwkJcmV0dXJuIHRoaXMuc3VwZXJJbnRlcmZhY2VzOworCX0KKwkKIAkvKioKIAkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogCSAqLwpAQCAtNDIwLDE0ICs0NjgsMTUgQEAKIAkJfQogCQlidWZmZXIuYXBwZW5kKCc+Jyk7CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9CQorCX0KKwogCS8qKgogCSAqIFVwcGVyIGJvdW5kIGRvZXNuJ3QgcGVyZm9ybSBlcmFzdXJlCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nIHVwcGVyQm91bmQoKSB7Ci0JICAgIGlmICh0aGlzLmZpcnN0Qm91bmQgIT0gbnVsbCkgeworCQlpZiAodGhpcy5maXJzdEJvdW5kICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLmZpcnN0Qm91bmQ7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHRoaXMuc3VwZXJjbGFzczsgLy8gamF2YS9sYW5nL09iamVjdAorCQl9CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3M7IC8vIGphdmEvbGFuZy9PYmplY3QKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRBbm5vdGF0aW9uQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VbnJlc29sdmVkQW5ub3RhdGlvbkJpbmRpbmcuamF2YQppbmRleCA1MTk2NzI5Li5mZTZkMzVkIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRBbm5vdGF0aW9uQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZEFubm90YXRpb25CaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsNyArMjEsNyBAQAogCiBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBnZXRBbm5vdGF0aW9uVHlwZSgpIHsKIAlpZiAodGhpcy50eXBlVW5yZXNvbHZlZCkgeyAvLyB0aGUgdHlwZSBpcyByZXNvbHZlZCB3aGVuIHJlcXVlc3RlZAotCQl0aGlzLnR5cGUgPSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLnR5cGUsIHRoaXMuZW52LCBmYWxzZSk7CisJCXRoaXMudHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLnR5cGUsIHRoaXMuZW52LCBmYWxzZSAvKiBubyByYXcgY29udmVyc2lvbiBmb3Igbm93ICovKTsKIAkJCS8vIGFubm90YXRpb24gdHlwZSBhcmUgbmV2ZXIgcGFyYW1ldGVyaXplZAogCQl0aGlzLnR5cGVVbnJlc29sdmVkID0gZmFsc2U7CiAJfQpAQCAtNDYsNyArNDYsNyBAQAogCQkJCXBhaXIuc2V0VmFsdWUoKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgdmFsdWUpLgogCQkJCQkJcmVzb2x2ZSh0aGlzLmVudiwgZmFsc2UpKTsKIAkJCQkJCQkvLyBubyBwYXJhbWV0ZXJpemVkIHR5cGVzIGluIGFubm90YXRpb24gdmFsdWVzCi0JCQl9IC8vIGRvIG5vdGhpbmcgZm9yIFVucmVzb2x2ZWRBbm5vdGF0aW9uQmluZGluZy1zLCBzaW5jZSB0aGVpciAKKwkJCX0gLy8gZG8gbm90aGluZyBmb3IgVW5yZXNvbHZlZEFubm90YXRpb25CaW5kaW5nLXMsIHNpbmNlIHRoZWlyCiAJCQkgIC8vIGNvbnRlbnQgaXMgb25seSBhY2Nlc3NlZCB0aHJvdWdoIGdldCogbWV0aG9kcwogCQl9CiAJCXRoaXMuZW52ID0gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcuamF2YQppbmRleCA5NTVjYWM5Li4wY2ExNWRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ1LDExICs0NSwxOSBAQAogICAgIFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IHRoaXMucmVzb2x2ZWRUeXBlOwogCWlmICh0YXJnZXRUeXBlID09IG51bGwpIHsKIAkJdGFyZ2V0VHlwZSA9IHRoaXMuZlBhY2thZ2UuZ2V0VHlwZTAodGhpcy5jb21wb3VuZE5hbWVbdGhpcy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOwotCQlpZiAodGFyZ2V0VHlwZSA9PSB0aGlzKQorCQlpZiAodGFyZ2V0VHlwZSA9PSB0aGlzKSB7CiAJCQl0YXJnZXRUeXBlID0gZW52aXJvbm1lbnQuYXNrRm9yVHlwZSh0aGlzLmNvbXBvdW5kTmFtZSk7CisJCX0KIAkJaWYgKHRhcmdldFR5cGUgPT0gbnVsbCB8fCB0YXJnZXRUeXBlID09IHRoaXMpIHsgLy8gY291bGQgbm90IHJlc29sdmUgYW55IGJldHRlciwgZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWQgYWdhaW5zdCBpdAorCQkJLy8gcmVwb3J0IHRoZSBtaXNzaW5nIGNsYXNzIGZpbGUgZmlyc3QgLSBvbmx5IGlmIG5vdCByZXNvbHZpbmcgYSBwcmV2aW91c2x5IG1pc3NpbmcgdHlwZQorCQkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSA9PSAwKSB7CisJCQkJZW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmlzQ2xhc3NQYXRoQ29ycmVjdCgKKwkJCQkJdGhpcy5jb21wb3VuZE5hbWUsCisJCQkJCWVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCwKKwkJCQkJZW52aXJvbm1lbnQubWlzc2luZ0NsYXNzRmlsZUxvY2F0aW9uKTsKKwkJCX0KIAkJCS8vIGNyZWF0ZSBhIHByb3h5IGZvciB0aGUgbWlzc2luZyBCaW5hcnlUeXBlCi0JCQl0YXJnZXRUeXBlID0gZW52aXJvbm1lbnQuY2FjaGVNaXNzaW5nQmluYXJ5VHlwZSh0aGlzLmNvbXBvdW5kTmFtZSwgbnVsbCk7CisJCQl0YXJnZXRUeXBlID0gZW52aXJvbm1lbnQuY3JlYXRlTWlzc2luZ1R5cGUobnVsbCwgdGhpcy5jb21wb3VuZE5hbWUpOwogCQl9CiAJCXNldFJlc29sdmVkVHlwZSh0YXJnZXRUeXBlLCBlbnZpcm9ubWVudCk7CiAJfQpAQCAtNzEsNiArNzksNiBAQAogCWVudmlyb25tZW50LnVwZGF0ZUNhY2hlcyh0aGlzLCB0YXJnZXRUeXBlKTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJVbnJlc29sdmVkIHR5cGUgIiArICgoY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wb3VuZE5hbWUpIDogIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJcmV0dXJuICJVbnJlc29sdmVkIHR5cGUgIiArICgodGhpcy5jb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHRoaXMuY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VcGRhdGVkTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VcGRhdGVkTWV0aG9kQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZlZGYxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVXBkYXRlZE1ldGhvZEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlZE1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBNZXRob2RCaW5kaW5nIHsKLQkKLQlwdWJsaWMgVHlwZUJpbmRpbmcgdXBkYXRlZERlY2xhcmluZ0NsYXNzOwotCi0JcHVibGljIFVwZGF0ZWRNZXRob2RCaW5kaW5nKFR5cGVCaW5kaW5nIHVwZGF0ZWREZWNsYXJpbmdDbGFzcywgaW50IG1vZGlmaWVycywgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZyByZXR1cm5UeXBlLCBUeXBlQmluZGluZ1tdIGFyZ3MsIFJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7Ci0JCXN1cGVyKG1vZGlmaWVycywgc2VsZWN0b3IsIHJldHVyblR5cGUsIGFyZ3MsIGV4Y2VwdGlvbnMsIGRlY2xhcmluZ0NsYXNzKTsKLQkJdGhpcy51cGRhdGVkRGVjbGFyaW5nQ2xhc3MgPSB1cGRhdGVkRGVjbGFyaW5nQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyBUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRlZERlY2xhcmluZ0NsYXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1ZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IGM5OTA0ZTIuLmRjMzllMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9WYXJpYWJsZUJpbmRpbmcuamF2YQpAQCAtMSwyMCArMSwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7Ci0gICAgCisKIAlwdWJsaWMgaW50IG1vZGlmaWVyczsKIAlwdWJsaWMgVHlwZUJpbmRpbmcgdHlwZTsKIAlwdWJsaWMgY2hhcltdIG5hbWU7CkBAIC0yNyw4ICsyOCwxMSBAQAogCQl0aGlzLnR5cGUgPSB0eXBlOwogCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKIAkJdGhpcy5jb25zdGFudCA9IGNvbnN0YW50OworCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQl0aGlzLnRhZ0JpdHMgfD0gKHR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpOworCQl9CiAJfQotCQorCiAJcHVibGljIENvbnN0YW50IGNvbnN0YW50KCkgewogCQlyZXR1cm4gdGhpcy5jb25zdGFudDsKIAl9CkBAIC0zNiwyNCArNDAsMzQgQEAKIAlwdWJsaWMgYWJzdHJhY3QgQW5ub3RhdGlvbkJpbmRpbmdbXSBnZXRBbm5vdGF0aW9ucygpOwogCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCbGFua0ZpbmFsKCl7Ci0JCXJldHVybiAobW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NCbGFua0ZpbmFsKSAhPSAwOworCQlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NCbGFua0ZpbmFsKSAhPSAwOwogCX0KIAkvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZmluYWwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkCiAJKi8KLQkKKwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiAobW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwOworCQlyZXR1cm4gKHRoaXMubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwOwogCX0KKwkKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VmZmVjdGl2ZWx5RmluYWwoKSB7CisJCXJldHVybiAodGhpcy50YWdCaXRzICYgVGFnQml0cy5Jc0VmZmVjdGl2ZWx5RmluYWwpICE9IDA7CisJfQorCQogCXB1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKKwkJcmV0dXJuIHRoaXMubmFtZTsKIAl9CiAJcHVibGljIHZvaWQgc2V0Q29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKIAkJdGhpcy5jb25zdGFudCA9IGNvbnN0YW50OwogCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9ICh0eXBlICE9IG51bGwpID8gdHlwZS5kZWJ1Z05hbWUoKSA6ICJVTkRFRklORUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkJcyArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJcyArPSAobmFtZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcobmFtZSkgOiAiVU5OQU1FRCBGSUVMRCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHM7CisJCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJQVNUTm9kZS5wcmludE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgb3V0cHV0KTsKKwkJaWYgKCh0aGlzLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVW5yZXNvbHZlZCkgIT0gMCkgeworCQkJb3V0cHV0LmFwcGVuZCgiW3VucmVzb2x2ZWRdICIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnR5cGUgIT0gbnVsbCA/IHRoaXMudHlwZS5kZWJ1Z05hbWUoKSA6ICI8bm8gdHlwZT4iKTsgLy8kTk9OLU5MUy0xJAorCQlvdXRwdXQuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJb3V0cHV0LmFwcGVuZCgodGhpcy5uYW1lICE9IG51bGwpID8gbmV3IFN0cmluZyh0aGlzLm5hbWUpIDogIjxubyBuYW1lPiIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1dpbGRjYXJkQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9XaWxkY2FyZEJpbmRpbmcuamF2YQppbmRleCA3MWU4ZDVmLi4wZTZlNDg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1dpbGRjYXJkQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvV2lsZGNhcmRCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTkgKzEwLDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldpbGRjYXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiAKIC8qCiAgKiBBIHdpbGRjYXJkIGFjdHMgYXMgYW4gYXJndW1lbnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMsIGFsbG93aW5nIHRvCi0gKiBhYnN0cmFjdCBwYXJhbWV0ZXJpemVkIHR5cGVzLCBlLmcuIExpc3Q8U3RyaW5nPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIExpc3Q8T2JqZWN0PiwgCisgKiBhYnN0cmFjdCBwYXJhbWV0ZXJpemVkIHR5cGVzLCBlLmcuIExpc3Q8U3RyaW5nPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIExpc3Q8T2JqZWN0PiwKICAqIGJ1dCBjb21wYXRpYmxlIHdpdGggTGlzdDw/Pi4KICAqLwogcHVibGljIGNsYXNzIFdpbGRjYXJkQmluZGluZyBleHRlbmRzIFJlZmVyZW5jZUJpbmRpbmcgewogCi0JUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZTsKLQlpbnQgcmFuazsKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZTsKKwlwdWJsaWMgaW50IHJhbms7CiAgICAgcHVibGljIFR5cGVCaW5kaW5nIGJvdW5kOyAvLyB3aGVuIHVuYm91bmQgZGVub3RlcyB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHZhcmlhYmxlIChzbyBhcyB0byByZXRyaWV2ZSBpdHMgYm91bmQgbGF6aWx5KQogICAgIHB1YmxpYyBUeXBlQmluZGluZ1tdIG90aGVyQm91bmRzOyAvLyBvbmx5IHBvc2l0aW9ubmVkIGJ5IGx1YiBjb21wdXRhdGlvbnMgKGlmIHNvLCAjYm91bmQgaXMgYWxzbyBzZXQpIGFuZCBhc3NvY2lhdGVkIHRvIEVYVEVORFMgbW9kZQogCWNoYXJbXSBnZW5lcmljU2lnbmF0dXJlOwpAQCAtMzEsMTggKzMzLDIyIEBACiAJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlczsKIAlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZTsgLy8gY29ycmVzcG9uZGluZyB2YXJpYWJsZQogCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OwotCQorCiAJLyoqCiAJICogV2hlbiB1bmJvdW5kLCB0aGUgYm91bmQgZGVub3RlcyB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHZhcmlhYmxlIChzbyBhcyB0byByZXRyaWV2ZSBpdHMgYm91bmQgbGF6aWx5KQogCSAqLwogCXB1YmxpYyBXaWxkY2FyZEJpbmRpbmcoUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZSwgaW50IHJhbmssIFR5cGVCaW5kaW5nIGJvdW5kLCBUeXBlQmluZGluZ1tdIG90aGVyQm91bmRzLCBpbnQgYm91bmRLaW5kLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQl0aGlzLmdlbmVyaWNUeXBlID0gZ2VuZXJpY1R5cGU7CiAJCXRoaXMucmFuayA9IHJhbms7CiAJICAgIHRoaXMuYm91bmRLaW5kID0gYm91bmRLaW5kOwogCQl0aGlzLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWMgfCBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmU7IC8vIHRyZWF0IHdpbGRjYXJkIGFzIHB1YmxpYwogCQl0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7CiAJCWluaXRpYWxpemUoZ2VuZXJpY1R5cGUsIGJvdW5kLCBvdGhlckJvdW5kcyk7CiAKKy8vCQlpZiAoIWdlbmVyaWNUeXBlLmlzR2VuZXJpY1R5cGUoKSAmJiAhKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpKSB7CisvLwkJCVJ1bnRpbWVFeGNlcHRpb24gZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXSUxEQ0FSRCB3aXRoIE5PTiBHRU5FUklDIik7CisvLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisvLwkJCXRocm93IGU7CisvLwkJfQogCQlpZiAoZ2VuZXJpY1R5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKIAkJCSgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIGdlbmVyaWNUeXBlKS5hZGRXcmFwcGVyKHRoaXMsIGVudmlyb25tZW50KTsKIAkJaWYgKGJvdW5kIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCkBAIC01MSw5ICs1Nyw5IEBACiAJfQogCiAJcHVibGljIGludCBraW5kKCkgewotCQlyZXR1cm4gV0lMRENBUkRfVFlQRTsKLQl9CQotCQkKKwkJcmV0dXJuIHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCA/IEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6IEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU7CisJfQorCiAJLyoqCiAJICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCB0eXBlIHNhdGlzZmllcyB0aGUgd2lsZGNhcmQgYm91bmQocykKIAkgKi8KQEAgLTYyLDEyICs2OCwxMiBAQAogCSAgICAgICAgY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKIAkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAkgICAgICAgIGNhc2UgV2lsZGNhcmQuRVhURU5EUyA6Ci0JICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKHRoaXMuYm91bmQpKSByZXR1cm4gdHJ1ZTsKKwkgICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKHRoaXMuYm91bmQpKSByZXR1cm4gZmFsc2U7CiAJICAgICAgICAgICAgLy8gY2hlY2sgb3RoZXIgYm91bmRzIChsdWIgc2NlbmFyaW8pCiAgICAgICAgICAgICAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiB0aGlzLm90aGVyQm91bmRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAJCWlmIChhcmd1bWVudFR5cGUuaXNDb21wYXRpYmxlV2l0aCh0aGlzLm90aGVyQm91bmRzW2ldKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAJCWlmICghYXJndW1lbnRUeXBlLmlzQ29tcGF0aWJsZVdpdGgodGhpcy5vdGhlckJvdW5kc1tpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCXJldHVybiB0cnVlOwogCSAgICAgICAgZGVmYXVsdDogLy8gU1VQRVIKIAkgICAgICAgIAkvLyA/IHN1cGVyIEV4Y2VwdGlvbiAgIG9rIGZvcjogIElPRXhjZXB0aW9uLCBzaW5jZSBpdCB3b3VsZCBiZSBvayBmb3IgKEV4Y2VwdGlvbilpb0V4Y2VwdGlvbgogCSAgICAgICAgICAgIHJldHVybiBhcmd1bWVudFR5cGUuaXNDb21wYXRpYmxlV2l0aCh0aGlzLmJvdW5kKTsKQEAgLTgwLDcgKzg2LDE3IEBACiAJCS8vIGNhbm5vdCBiZSBhc2tlZCBwZXIgY29uc3RydWN0aW9uCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjY29sbGVjdE1pc3NpbmdUeXBlcyhqYXZhLnV0aWwuTGlzdCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBjb2xsZWN0TWlzc2luZ1R5cGVzKExpc3QgbWlzc2luZ1R5cGVzKSB7CisJCWlmICgodGhpcy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJbWlzc2luZ1R5cGVzID0gdGhpcy5ib3VuZC5jb2xsZWN0TWlzc2luZ1R5cGVzKG1pc3NpbmdUeXBlcyk7CisJCX0KKwkJcmV0dXJuIG1pc3NpbmdUeXBlczsKKwl9CisKIAkvKioKIAkgKiBDb2xsZWN0IHRoZSBzdWJzdGl0dXRlcyBpbnRvIGEgbWFwIGZvciBjZXJ0YWluIHR5cGUgdmFyaWFibGVzIGluc2lkZSB0aGUgcmVjZWl2ZXIgdHlwZQogCSAqIGUuZy4gICBDb2xsZWN0aW9uPFQ+LmNvbGxlY3RTdWJzdGl0dXRlcyhDb2xsZWN0aW9uPExpc3Q8WD4+LCBNYXApLCB3aWxsIHBvcHVsYXRlIE1hcCB3aXRoOiBUIC0tPiBMaXN0PFg+CkBAIC05MywxOSArMTA5LDIwIEBACiAKIAkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgPT0gMCkgcmV0dXJuOwogCQlpZiAoYWN0dWFsVHlwZSA9PSBUeXBlQmluZGluZy5OVUxMKSByZXR1cm47Ci0JCisKIAkJaWYgKGFjdHVhbFR5cGUuaXNDYXB0dXJlKCkpIHsKIAkJCUNhcHR1cmVCaW5kaW5nIGNhcHR1cmUgPSAoQ2FwdHVyZUJpbmRpbmcpIGFjdHVhbFR5cGU7CiAJCQlhY3R1YWxUeXBlID0gY2FwdHVyZS53aWxkY2FyZDsKIAkJfQotCQkKKwogCQlzd2l0Y2ggKGNvbnN0cmFpbnQpIHsKIAkJCWNhc2UgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VYVEVORFMgOiAvLyBBIDw8IEYKIAkJCQlzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7CiAJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gRj17P30KLS8vCQkJCQkJaWYgKG90aGVyVHlwZS5pc1dpbGRjYXJkKCkpIHsKLS8vCQkJCQkJCVdpbGRjYXJkQmluZGluZyBvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlOwotLy8JCQkJCQkJc3dpdGNoKG90aGVyV2lsZGNhcmQua2luZCkgeworLy8JCQkJCQlzd2l0Y2ggKGFjdHVhbFR5cGUua2luZCgpKSB7CisvLwkJCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKy8vCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisvLwkJCQkJCQlzd2l0Y2goYWN0dWFsV2lsZGNhcmQua2luZCkgewogLy8JCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPDwgRj17P30gIC0tPiAwCiAvLwkJCQkJCQkJCWJyZWFrOwogLy8JCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gQT17PyBleHRlbmRzIFZ9IDw8IEY9ez99IC0tLT4gMApAQCAtMTEzLDU1ICsxMzAsNzIgQEAKIC8vCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9IDw8IEY9ez99IC0tLT4gMAogLy8JCQkJCQkJCQlicmVhazsKIC8vCQkJCQkJCX0KLS8vCQkJCQkJfSBlbHNlIHsgLy8gQT1WIDw8IEY9ez99IC0tLT4gMAorLy8JCQkJCQkJYnJlYWs7CisvLwkJCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6Ly8gQT17PyBleHRlbmRzIFYxJi4uLiZWbn0gPDwgRj17P30gLS0tPiAwCisvLwkJCQkJCQlicmVhazsKKy8vCQkJCQkJZGVmYXVsdCA6Ly8gQT1WIDw8IEY9ez99IC0tLT4gMAorLy8JCQkJCQkJYnJlYWs7CiAvLwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6IC8vIEY9ez8gZXh0ZW5kcyBVfQotCQkJCQkJaWYgKGFjdHVhbFR5cGUuaXNXaWxkY2FyZCgpKSB7Ci0JCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKLQkJCQkJCQlzd2l0Y2goYWN0dWFsV2lsZGNhcmQuYm91bmRLaW5kKSB7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPDwgRj17PyBleHRlbmRzIFV9ICAtLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gQT17PyBleHRlbmRzIFZ9IDw8IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IFYgPDwgVQotCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7Ci0JCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VYVEVORFMpOwotCQkJCQkJICAgICAgICAJfQkJCQkJCQkJCQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPDwgRj17PyBleHRlbmRzIFV9IC0tLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsgLy8gQT1WIDw8IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IFYgPDwgVQotCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxUeXBlLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7CisJCQkJCQlzd2l0Y2goYWN0dWFsVHlwZS5raW5kKCkpIHsKKwkJCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisJCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPDwgRj17PyBleHRlbmRzIFV9ICAtLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPDwgRj17PyBleHRlbmRzIFV9IC0tLT4gViA8PCBVCisJCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9IDw8IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IDAKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOiAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA8PCBGPXs/IGV4dGVuZHMgVX0gLS0tPiBWMSA8PCBVLCAuLi4sIFZuIDw8IFUKKwkJCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbEludGVyc2VjdGlvbiA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxJbnRlcnNlY3Rpb24uYm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FWFRFTkRTKTsKKwkJCQkJICAgICAgICAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFjdHVhbEludGVyc2VjdGlvbi5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbEludGVyc2VjdGlvbi5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VYVEVORFMpOworCQkJCQkgICAgICAgIAl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQgOiAvLyBBPVYgPDwgRj17PyBleHRlbmRzIFV9IC0tLT4gViA8PCBVCisJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxUeXBlLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVhURU5EUyk7CisJCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEY9ez8gc3VwZXIgVX0KLQkJCQkJCWlmIChhY3R1YWxUeXBlLmlzV2lsZGNhcmQoKSkgewotCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7Ci0JCQkJCQkJc3dpdGNoKGFjdHVhbFdpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJCQkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6IC8vIEE9ez99IDw8IEY9ez8gc3VwZXIgVX0gIC0tPiAwCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPDwgRj17PyBzdXBlciBVfSAtLS0+IDAKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9IDw8IEY9ez8gc3VwZXIgVX0gLS0tPiAwCi0JCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQuYm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7Ci0JCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKLQkJCQkJCSAgICAgICAgCX0JCQkJCQkJCQkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vIEE9ViA8PCBGPXs/IHN1cGVyIFV9IC0tLT4gViA+PiBVCi0JCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFR5cGUsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7CQkJCQkJCQotCQkJCQkJfQkJCQkJCQorCQkJCQkJc3dpdGNoIChhY3R1YWxUeXBlLmtpbmQoKSkgeworCQkJCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKKwkJCQkJCQkJc3dpdGNoKGFjdHVhbFdpbGRjYXJkLmJvdW5kS2luZCkgeworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBBPXs/fSA8PCBGPXs/IHN1cGVyIFV9ICAtLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPDwgRj17PyBzdXBlciBVfSAtLS0+IDAKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPDwgRj17PyBzdXBlciBVfSAtLS0+IDAKKwkJCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQuYm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7CisJCQkJCQkJICAgICAgICAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzID09IG51bGwgPyAwIDogYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzW2ldLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIpOworCQkJCQkJCSAgICAgICAgCX0KKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOiAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA8PCBGPXs/IHN1cGVyIFV9IC0tLT4gMAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0IDovLyBBPVYgPDwgRj17PyBzdXBlciBVfSAtLS0+IFYgPj4gVQorCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsVHlwZSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FUVVBTCA6IC8vIEEgPT0gRgogCQkJCXN3aXRjaCAodGhpcy5ib3VuZEtpbmQpIHsKIAkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBGPXs/fQotLy8JCQkJCQlpZiAob3RoZXJUeXBlLmlzV2lsZGNhcmQoKSkgewotLy8JCQkJCQkJV2lsZGNhcmRCaW5kaW5nIG90aGVyV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBvdGhlclR5cGU7Ci0vLwkJCQkJCQlzd2l0Y2gob3RoZXJXaWxkY2FyZC5raW5kKSB7CisvLwkJCQkJCXN3aXRjaCAoYWN0dWFsVHlwZS5raW5kKCkpIHsKKy8vCQkJCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorLy8JCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKKy8vCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5raW5kKSB7CiAvLwkJCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBBPXs/fSA9PSBGPXs/fSAgLS0+IDAKIC8vCQkJCQkJCQkJYnJlYWs7CiAvLwkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPT0gRj17P30gLS0tPiAwCkBAIC0xNjksNTMgKzIwMyw3MyBAQAogLy8JCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPT0gRj17P30gLS0tPiAwCiAvLwkJCQkJCQkJCWJyZWFrOwogLy8JCQkJCQkJfQotLy8JCQkJCQl9IGVsc2UgeyAvLyBBPVYgPT0gRj17P30gLS0tPiAwCisvLwkJCQkJCQlicmVhazsKKy8vCQkJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDovLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA9PSBGPXs/fSAtLS0+IDAKKy8vCQkJCQkJCWJyZWFrOworLy8JCQkJCQlkZWZhdWx0IDovLyBBPVYgPT0gRj17P30gLS0tPiAwCisvLwkJCQkJCQlicmVhazsKIC8vCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gRj17PyBleHRlbmRzIFV9Ci0JCQkJCQlpZiAoYWN0dWFsVHlwZS5pc1dpbGRjYXJkKCkpIHsKLQkJCQkJCQlXaWxkY2FyZEJpbmRpbmcgYWN0dWFsV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBhY3R1YWxUeXBlOwotCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5ib3VuZEtpbmQpIHsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBBPXs/fSA9PSBGPXs/IGV4dGVuZHMgVX0gIC0tPiAwCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPT0gRj17PyBleHRlbmRzIFV9IC0tLT4gViA9PSBVCi0JCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQuYm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FUVVBTCk7Ci0JCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VRVUFMKTsKLQkJCQkJCSAgICAgICAgCX0JCQkJCQkJCQkJCQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPT0gRj17PyBleHRlbmRzIFV9IC0tLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsgLy8gQT1WID09IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IDAKKwkJCQkJCXN3aXRjaCAoYWN0dWFsVHlwZS5raW5kKCkpIHsKKwkJCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisJCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPT0gRj17PyBleHRlbmRzIFV9ICAtLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPT0gRj17PyBleHRlbmRzIFV9IC0tLT4gViA9PSBVCisJCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVFVQUwpOworCQkJCQkJCSAgICAgICAgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcyA9PSBudWxsID8gMCA6IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VRVUFMKTsKKwkJCQkJCQkgICAgICAgIAl9CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9ID09IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IDAKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOiAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA9PSBGPXs/IGV4dGVuZHMgVX0gLS0tPiBWMSA9PSBVLCAuLi4sIFZuID09IFUKKwkJCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhSW50ZXJzZWN0aW9uID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKKwkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhSW50ZXJzZWN0aW9uLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVFVQUwpOworCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFJbnRlcnNlY3Rpb24ub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YUludGVyc2VjdGlvbi5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhSW50ZXJzZWN0aW9uLm90aGVyQm91bmRzW2ldLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVFVQUwpOworCQkJCQkgICAgICAgIAl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQgOiAvLyBBPVYgPT0gRj17PyBleHRlbmRzIFV9IC0tLT4gMAorCQkJCQkJCQlicmVhazsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBGPXs/IHN1cGVyIFV9Ci0JCQkJCQlpZiAoYWN0dWFsVHlwZS5pc1dpbGRjYXJkKCkpIHsKLQkJCQkJCQlXaWxkY2FyZEJpbmRpbmcgYWN0dWFsV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBhY3R1YWxUeXBlOwotCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5ib3VuZEtpbmQpIHsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBBPXs/fSA9PSBGPXs/IHN1cGVyIFV9ICAtLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gQT17PyBleHRlbmRzIFZ9ID09IEY9ez8gc3VwZXIgVX0gLS0tPiAwCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUjogLy8gQT17PyBzdXBlciBWfSA9PSBGPXs/IHN1cGVyIFV9IC0tLT4gMAotCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfRVFVQUwpOwotCQkJCQkJICAgICAgICAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzID09IG51bGwgPyAwIDogYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHNbaV0sIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FUVVBTCk7Ci0JCQkJCQkgICAgICAgIAl9CQotCQkJCQkJICAgICAgICAJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsgLy8gQT1WID09IEY9ez8gc3VwZXIgVX0gLS0tPiAwCi0JCQkJCQl9CQkJCQkJCisJCQkJCQlzd2l0Y2ggKGFjdHVhbFR5cGUua2luZCgpKSB7CisJCQkJCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCQkJCQlXaWxkY2FyZEJpbmRpbmcgYWN0dWFsV2lsZGNhcmQgPSAoV2lsZGNhcmRCaW5kaW5nKSBhY3R1YWxUeXBlOworCQkJCQkJCQlzd2l0Y2goYWN0dWFsV2lsZGNhcmQuYm91bmRLaW5kKSB7CisJCQkJCQkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6IC8vIEE9ez99ID09IEY9ez8gc3VwZXIgVX0gIC0tPiAwCisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6IC8vIEE9ez8gZXh0ZW5kcyBWfSA9PSBGPXs/IHN1cGVyIFV9IC0tLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5TVVBFUjogLy8gQT17PyBzdXBlciBWfSA9PSBGPXs/IHN1cGVyIFV9IC0tLT4gMAorCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5ib3VuZCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX0VRVUFMKTsKKwkJCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHNbaV0sIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9FUVVBTCk7CisJCQkJCQkJICAgICAgICAJfQorCQkJCQkJCSAgICAgICAgCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6ICAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA9PSBGPXs/IHN1cGVyIFV9IC0tLT4gMAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0IDogLy8gQT1WID09IEY9ez8gc3VwZXIgVX0gLS0tPiAwCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIgOiAvLyBBID4+IEYKIAkJCQlzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7CiAJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gRj17P30KLS8vCQkJCQkJaWYgKG90aGVyVHlwZS5pc1dpbGRjYXJkKCkpIHsKLS8vCQkJCQkJCVdpbGRjYXJkQmluZGluZyBvdGhlcldpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgb3RoZXJUeXBlOwotLy8JCQkJCQkJc3dpdGNoKG90aGVyV2lsZGNhcmQua2luZCkgeworLy8JCQkJCQlzd2l0Y2ggKGFjdHVhbFR5cGUua2luZCgpKSB7CisvLwkJCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKy8vCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisvLwkJCQkJCQlzd2l0Y2goYWN0dWFsV2lsZGNhcmQua2luZCkgewogLy8JCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPj4gRj17P30gIC0tPiAwCiAvLwkJCQkJCQkJCWJyZWFrOwogLy8JCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gQT17PyBleHRlbmRzIFZ9ID4+IEY9ez99IC0tLT4gMApAQCAtMjIzLDU5ICsyNzcsODAgQEAKIC8vCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9ID4+IEY9ez99IC0tLT4gMAogLy8JCQkJCQkJCQlicmVhazsKIC8vCQkJCQkJCX0KLS8vCQkJCQkJfSBlbHNlIHsgLy8gQT1WID4+IEY9ez99IC0tLT4gMAorLy8JCQkJCQkJYnJlYWs7CisvLwkJCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6Ly8gQT17PyBleHRlbmRzIFYxJi4uLiZWbn0gPj4gRj17P30gLS0tPiAwCisvLwkJCQkJCQlicmVhazsKKy8vCQkJCQkJZGVmYXVsdCA6Ly8gQT1WID4+IEY9ez99IC0tLT4gMAorLy8JCQkJCQkJYnJlYWs7CiAvLwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6IC8vIEY9ez8gZXh0ZW5kcyBVfQotCQkJCQkJaWYgKGFjdHVhbFR5cGUuaXNXaWxkY2FyZCgpKSB7Ci0JCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKLQkJCQkJCQlzd2l0Y2goYWN0dWFsV2lsZGNhcmQuYm91bmRLaW5kKSB7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPj4gRj17PyBleHRlbmRzIFV9ICAtLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzogLy8gQT17PyBleHRlbmRzIFZ9ID4+IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IFYgPj4gVQotCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIpOwotCQkJCQkJICAgICAgICAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzID09IG51bGwgPyAwIDogYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHNbaV0sIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7Ci0JCQkJCQkgICAgICAgIAl9CQkJCQkJCQkJCQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPj4gRj17PyBleHRlbmRzIFV9IC0tLT4gMAotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsgLy8gQT1WID09IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IDAKKwkJCQkJCXN3aXRjaCAoYWN0dWFsVHlwZS5raW5kKCkpIHsKKwkJCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisJCQkJCQkJCXN3aXRjaChhY3R1YWxXaWxkY2FyZC5ib3VuZEtpbmQpIHsKKwkJCQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDogLy8gQT17P30gPj4gRj17PyBleHRlbmRzIFV9ICAtLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPj4gRj17PyBleHRlbmRzIFV9IC0tLT4gViA+PiBVCisJCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLmJvdW5kLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIpOworCQkJCQkJCSAgICAgICAgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcyA9PSBudWxsID8gMCA6IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kc1tpXSwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKKwkJCQkJCQkgICAgICAgIAl9CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9ID4+IEY9ez8gZXh0ZW5kcyBVfSAtLS0+IDAKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOiAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA+PiBGPXs/IGV4dGVuZHMgVX0gLS0tPiBWMSA+PiBVLCAuLi4sIFZuID4+IFUKKwkJCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbEludGVyc2VjdGlvbiA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7CisJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxJbnRlcnNlY3Rpb24uYm91bmQsIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7CisJCQkJCSAgICAgICAgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhY3R1YWxJbnRlcnNlY3Rpb24ub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxJbnRlcnNlY3Rpb24ub3RoZXJCb3VuZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxJbnRlcnNlY3Rpb24ub3RoZXJCb3VuZHNbaV0sIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7CisJCQkJCSAgICAgICAgCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdCA6IC8vIEE9ViA9PSBGPXs/IGV4dGVuZHMgVX0gLS0tPiAwCisJCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEY9ez8gc3VwZXIgVX0KLQkJCQkJCWlmIChhY3R1YWxUeXBlLmlzV2lsZGNhcmQoKSkgewotCQkJCQkJCVdpbGRjYXJkQmluZGluZyBhY3R1YWxXaWxkY2FyZCA9IChXaWxkY2FyZEJpbmRpbmcpIGFjdHVhbFR5cGU7Ci0JCQkJCQkJc3dpdGNoKGFjdHVhbFdpbGRjYXJkLmJvdW5kS2luZCkgewotCQkJCQkJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQ6IC8vIEE9ez99ID4+IEY9ez8gc3VwZXIgVX0gIC0tPiAwCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPj4gRj17PyBzdXBlciBVfSAtLS0+IDAKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIFdpbGRjYXJkLlNVUEVSOiAvLyBBPXs/IHN1cGVyIFZ9ID4+IEY9ez8gc3VwZXIgVX0gLS0tPiBWID4+IFUKLQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5ib3VuZCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKLQkJCQkJCSAgICAgICAgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcyA9PSBudWxsID8gMCA6IGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJdGhpcy5ib3VuZC5jb2xsZWN0U3Vic3RpdHV0ZXMoc2NvcGUsIGFjdHVhbFdpbGRjYXJkLm90aGVyQm91bmRzW2ldLCBpbmZlcmVuY2VDb250ZXh0LCBUeXBlQ29uc3RhbnRzLkNPTlNUUkFJTlRfU1VQRVIpOwotCQkJCQkJICAgICAgICAJfQkKLQkJCQkJCSAgICAgICAgCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vIEE9ViA+PiBGPXs/IHN1cGVyIFV9IC0tLT4gMAotCQkJCQkJfQkJCQkJCQorCQkJCQkJc3dpdGNoIChhY3R1YWxUeXBlLmtpbmQoKSkgeworCQkJCQkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCQkJCQkJV2lsZGNhcmRCaW5kaW5nIGFjdHVhbFdpbGRjYXJkID0gKFdpbGRjYXJkQmluZGluZykgYWN0dWFsVHlwZTsKKwkJCQkJCQkJc3dpdGNoKGFjdHVhbFdpbGRjYXJkLmJvdW5kS2luZCkgeworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOiAvLyBBPXs/fSA+PiBGPXs/IHN1cGVyIFV9ICAtLT4gMAorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTOiAvLyBBPXs/IGV4dGVuZHMgVn0gPj4gRj17PyBzdXBlciBVfSAtLS0+IDAKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6IC8vIEE9ez8gc3VwZXIgVn0gPj4gRj17PyBzdXBlciBVfSAtLS0+IFYgPj4gVQorCQkJCQkJCQkJCXRoaXMuYm91bmQuY29sbGVjdFN1YnN0aXR1dGVzKHNjb3BlLCBhY3R1YWxXaWxkY2FyZC5ib3VuZCwgaW5mZXJlbmNlQ29udGV4dCwgVHlwZUNvbnN0YW50cy5DT05TVFJBSU5UX1NVUEVSKTsKKwkJCQkJCQkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHMgPT0gbnVsbCA/IDAgOiBhY3R1YWxXaWxkY2FyZC5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCQkJCQl0aGlzLmJvdW5kLmNvbGxlY3RTdWJzdGl0dXRlcyhzY29wZSwgYWN0dWFsV2lsZGNhcmQub3RoZXJCb3VuZHNbaV0sIGluZmVyZW5jZUNvbnRleHQsIFR5cGVDb25zdGFudHMuQ09OU1RSQUlOVF9TVVBFUik7CisJCQkJCQkJICAgICAgICAJfQorCQkJCQkJCSAgICAgICAgCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6ICAvLyBBPXs/IGV4dGVuZHMgVjEmLi4uJlZufSA+PiBGPXs/IHN1cGVyIFV9IC0tLT4gMAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0IDogLy8gQT1WID4+IEY9ez8gc3VwZXIgVX0gLS0tPiAwCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9CiAJfQotCQorCiAJLyoKLQkgKiBnZW5lcmljVHlwZUtleSAqfCt8LSBbYm91bmRLZXldCi0JICogcC5YPFQ+IHsgWDw/PiAuLi4gfSAtLT4gTHAvWDxUVDs+OyoKKwkgKiBnZW5lcmljVHlwZUtleSB7cmFua30qfCt8LSBbYm91bmRLZXldCisJICogcC5YPFQ+IHsgWDw/PiAuLi4gfSAtLT4gTHAvWDxUVDs+O3swfSoKIAkgKi8KIAlwdWJsaWMgY2hhcltdIGNvbXB1dGVVbmlxdWVLZXkoYm9vbGVhbiBpc0xlYWYpIHsKIAkJY2hhcltdIGdlbmVyaWNUeXBlS2V5ID0gdGhpcy5nZW5lcmljVHlwZS5jb21wdXRlVW5pcXVlS2V5KGZhbHNlLypub3QgYSBsZWFmKi8pOwogCQljaGFyW10gd2lsZENhcmRLZXk7CisJCS8vIFdlIG5vdyBlbmNvZGUgdGhlIHJhbmsgYWxzbyBpbiB0aGUgYmluZGluZyBrZXkgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM0NjA5CisJCWNoYXJbXSByYW5rQ29tcG9uZW50ID0gKCd7JyArIFN0cmluZy52YWx1ZU9mKHRoaXMucmFuaykgKyAnfScpLnRvQ2hhckFycmF5KCk7CiAgICAgICAgIHN3aXRjaCAodGhpcy5ib3VuZEtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6IAorICAgICAgICAgICAgY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKICAgICAgICAgICAgICAgICB3aWxkQ2FyZEtleSA9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1RBUjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuRVhURU5EUyA6CkBAIC0yODUsMjMgKzM2MCwyNSBAQAogCQkJICAgIHdpbGRDYXJkS2V5ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9NSU5VUywgdGhpcy5ib3VuZC5jb21wdXRlVW5pcXVlS2V5KGZhbHNlLypub3QgYSBsZWFmKi8pKTsKIAkJCQlicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoZ2VuZXJpY1R5cGVLZXksIHdpbGRDYXJkS2V5KTsKLSAgICAgICB9Ci0JCisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChnZW5lcmljVHlwZUtleSwgcmFua0NvbXBvbmVudCwgd2lsZENhcmRLZXkpOworICAgIH0KKworCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjY29uc3RhbnRQb29sTmFtZSgpCiAJICovCiAJcHVibGljIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lcmFzdXJlKCkuY29uc3RhbnRQb29sTmFtZSgpOworCQlyZXR1cm4gZXJhc3VyZSgpLmNvbnN0YW50UG9vbE5hbWUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcjZGVidWdOYW1lKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGRlYnVnTmFtZSgpIHsKLQkgICAgcmV0dXJuIHRvU3RyaW5nKCk7CQkKLQl9CQotCQorCSAgICByZXR1cm4gdG9TdHJpbmcoKTsKKwl9CisKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nI2VyYXN1cmUoKQogICAgICAqLwpAQCAtMzA5LDEwICszODYsMTMgQEAKICAgICAJaWYgKHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCkgewogCSAgICAJaWYgKHRoaXMuYm91bmRLaW5kID09IFdpbGRjYXJkLkVYVEVORFMpCiAJCSAgICAgICAgcmV0dXJuIHRoaXMuYm91bmQuZXJhc3VyZSgpOwotCSAgICAJcmV0dXJuIHR5cGVWYXJpYWJsZSgpLmVyYXN1cmUoKTsKKwkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyID0gdHlwZVZhcmlhYmxlKCk7CisJCQlpZiAodmFyICE9IG51bGwpCisJCQkJcmV0dXJuIHZhci5lcmFzdXJlKCk7CisJCSAgICByZXR1cm4gdGhpcy5nZW5lcmljVHlwZTsgLy8gaWYgdHlwZVZhcmlhYmxlKCkgPT0gbnVsbCwgdGhlbiBpdHMgaW5jb25zaXN0ZW50ICYgcmV0dXJuIHRoaXMuZ2VuZXJpY1R5cGUgdG8gYXZvaWQgTlBFIGNhc2UKICAgICAJfQogICAgIAkvLyBpbnRlcnNlY3Rpb24gdHlwZQotICAgIAlyZXR1cm4gdGhpcy5ib3VuZC5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QgCisgICAgCXJldHVybiB0aGlzLmJvdW5kLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdAogICAgIAkJPyB0aGlzLm90aGVyQm91bmRzWzBdLmVyYXN1cmUoKSAgLy8gdXNlIGZpcnN0IGV4cGxpY2l0IGJvdW5kIHRvIGltcHJvdmUgc3RhY2ttYXAKICAgICAJCTogdGhpcy5ib3VuZC5lcmFzdXJlKCk7CiAgICAgfQpAQCAtMzIzLDcgKzQwMyw3IEBACiAgICAgcHVibGljIGNoYXJbXSBnZW5lcmljVHlwZVNpZ25hdHVyZSgpIHsKICAgICAgICAgaWYgKHRoaXMuZ2VuZXJpY1NpZ25hdHVyZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDogCisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmljU2lnbmF0dXJlID0gVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9TVEFSOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgpAQCAtMzMyLDEwICs0MTIsMTAgQEAKIAkJCQlkZWZhdWx0OiAvLyBTVVBFUgogCQkJCSAgICB0aGlzLmdlbmVyaWNTaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLldJTERDQVJEX01JTlVTLCB0aGlzLmJvdW5kLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpOwogICAgICAgICAgICAgfQotICAgICAgICB9IAorICAgICAgICB9CiAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyaWNTaWduYXR1cmU7CiAgICAgfQotICAgIAorCiAJcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJcmV0dXJuIHRoaXMuZ2VuZXJpY1R5cGUuaGFzaENvZGUoKTsKIAl9CkBAIC0zNDgsNyArNDI4LDEzIEBACiAJCQl0aGlzLmZQYWNrYWdlID0gc29tZUdlbmVyaWNUeXBlLmdldFBhY2thZ2UoKTsKIAkJfQogCQlpZiAoc29tZUJvdW5kICE9IG51bGwpIHsKLQkJCXRoaXMudGFnQml0cyB8PSBzb21lQm91bmQudGFnQml0cyAmIFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlOworCQkJdGhpcy50YWdCaXRzIHw9IHNvbWVCb3VuZC50YWdCaXRzICYgKFRhZ0JpdHMuSGFzVHlwZVZhcmlhYmxlIHwgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSB8IFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcyk7CisJCX0KKwkJaWYgKHNvbWVPdGhlckJvdW5kcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc29tZU90aGVyQm91bmRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgc29tZU90aGVyQm91bmQgPSBzb21lT3RoZXJCb3VuZHNbaV07CisJCQkJdGhpcy50YWdCaXRzIHw9IHNvbWVPdGhlckJvdW5kLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTM2NSwyMSArNDUxLDI1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0eXBlIGRlbm90ZXMgYW4gaW50ZXJzZWN0aW9uIHR5cGU6IE51bWJlciAmIENvbXBhcmFibGU8Pz4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyc2VjdGlvblR5cGUoKSB7CiAgICAgCXJldHVybiB0aGlzLm90aGVyQm91bmRzICE9IG51bGw7CiAgICAgfQotICAgIAorCisJcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaHlDb25uZWN0ZWQoKSB7CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCAmJiB0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsOworCX0KKwogICAgIC8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHdpbGRjYXJkCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNVbmJvdW5kV2lsZGNhcmQoKSB7CiAJICAgIHJldHVybiB0aGlzLmJvdW5kS2luZCA9PSBXaWxkY2FyZC5VTkJPVU5EOwogCX0KLQkKKwogICAgIC8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHdpbGRjYXJkCiAJICovCkBAIC0zOTIsMTAgKzQ4MiwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgewogICAgICAgICBzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLlVOQk9VTkQgOiAKKyAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRTsKICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuRVhURU5EUyA6Ci0gICAgICAgICAgICAJaWYgKHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCkgCisgICAgICAgICAgICAJaWYgKHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCkKIAkgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRSwgVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTLCB0aGlzLmJvdW5kLnJlYWRhYmxlTmFtZSgpKTsKICAgICAgICAgICAgIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CiAgICAgICAgICAgICAJYnVmZmVyLmFwcGVuZCh0aGlzLmJvdW5kLnJlYWRhYmxlTmFtZSgpKTsKQEAgLTQwNSwzNyArNDk1LDQ4IEBACiAgICAgICAgICAgICAJaW50IGxlbmd0aDsKIAkJCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpXTsKIAkJCQlidWZmZXIuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCByZXN1bHQsIDApOwotCQkJCXJldHVybiByZXN1bHQ7CSAgICAgICAgICAgIAkKKwkJCQlyZXR1cm4gcmVzdWx0OwogCQkJZGVmYXVsdDogLy8gU1VQRVIKIAkJCSAgICByZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9OQU1FLCBUeXBlQ29uc3RhbnRzLldJTERDQVJEX1NVUEVSLCB0aGlzLmJvdW5kLnJlYWRhYmxlTmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogCVJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZSgpIHsKIAkJaWYgKCh0aGlzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1VucmVzb2x2ZWRUeXBlVmFyaWFibGVzKSA9PSAwKQogCQkJcmV0dXJuIHRoaXM7CiAKIAkJdGhpcy50YWdCaXRzICY9IH5UYWdCaXRzLkhhc1VucmVzb2x2ZWRUeXBlVmFyaWFibGVzOwotCQlCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLmdlbmVyaWNUeXBlLCB0aGlzLmVudmlyb25tZW50LCBudWxsLCAwKTsKLQkgICAgc3dpdGNoKHRoaXMuYm91bmRLaW5kKSB7Ci0JICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotCSAgICAgICAgY2FzZSBXaWxkY2FyZC5TVVBFUiA6Ci0JCQkJQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUodGhpcy5ib3VuZCwgdGhpcy5lbnZpcm9ubWVudCwgbnVsbCwgMCk7CisJCUJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHRoaXMuZ2VuZXJpY1R5cGUsIHRoaXMuZW52aXJvbm1lbnQsIGZhbHNlIC8qIG5vIHJhdyBjb252ZXJzaW9uICovKTsKKwkJc3dpdGNoKHRoaXMuYm91bmRLaW5kKSB7CisJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgorCQkJCVR5cGVCaW5kaW5nIHJlc29sdmVUeXBlID0gQmluYXJ5VHlwZUJpbmRpbmcucmVzb2x2ZVR5cGUodGhpcy5ib3VuZCwgdGhpcy5lbnZpcm9ubWVudCwgdHJ1ZSAvKiByYXcgY29udmVyc2lvbiAqLyk7CisJCQkJdGhpcy5ib3VuZCA9IHJlc29sdmVUeXBlOworCQkJCXRoaXMudGFnQml0cyB8PSByZXNvbHZlVHlwZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzOworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLm90aGVyQm91bmRzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlyZXNvbHZlVHlwZSA9IEJpbmFyeVR5cGVCaW5kaW5nLnJlc29sdmVUeXBlKHRoaXMub3RoZXJCb3VuZHNbaV0sIHRoaXMuZW52aXJvbm1lbnQsIHRydWUgLyogcmF3IGNvbnZlcnNpb24gKi8pOworCQkJCQl0aGlzLm90aGVyQm91bmRzW2ldPSByZXNvbHZlVHlwZTsKKwkJCQkJdGhpcy50YWdCaXRzIHw9IHJlc29sdmVUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6CisJCQkJcmVzb2x2ZVR5cGUgPSBCaW5hcnlUeXBlQmluZGluZy5yZXNvbHZlVHlwZSh0aGlzLmJvdW5kLCB0aGlzLmVudmlyb25tZW50LCB0cnVlIC8qIHJhdyBjb252ZXJzaW9uICovKTsKKwkJCQl0aGlzLmJvdW5kID0gcmVzb2x2ZVR5cGU7CisJCQkJdGhpcy50YWdCaXRzIHw9IHJlc29sdmVUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXM7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFdpbGRjYXJkLlVOQk9VTkQgOgotCSAgICB9CisJCX0KIAkJcmV0dXJuIHRoaXM7CiAJfQotCQorCiAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nI3Nob3J0UmVhZGFibGVOYW1lKCkKICAgICAgKi8KICAgICBwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCkgewogICAgICAgICBzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLlVOQk9VTkQgOiAKKyAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRTsKICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuRVhURU5EUyA6Ci0gICAgICAgICAgICAJaWYgKHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCkgCisgICAgICAgICAgICAJaWYgKHRoaXMub3RoZXJCb3VuZHMgPT0gbnVsbCkKIAkgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRSwgVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTLCB0aGlzLmJvdW5kLnNob3J0UmVhZGFibGVOYW1lKCkpOwogICAgICAgICAgICAgCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKICAgICAgICAgICAgIAlidWZmZXIuYXBwZW5kKHRoaXMuYm91bmQuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CkBAIC00NDUsMTIgKzU0NiwxMiBAQAogICAgICAgICAgICAgCWludCBsZW5ndGg7CiAJCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKV07CiAJCQkJYnVmZmVyLmdldENoYXJzKDAsIGxlbmd0aCwgcmVzdWx0LCAwKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwkgICAgICAgICAgICAJCisJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCWRlZmF1bHQ6IC8vIFNVUEVSCiAJCQkgICAgcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRSwgVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9TVVBFUiwgdGhpcy5ib3VuZC5zaG9ydFJlYWRhYmxlTmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyNzaWduYXR1cmUoKQogICAgICAqLwpAQCAtNDYyLDI0ICs1NjMsMjQgQEAKIAkgICAgICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgogCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ib3VuZC5zaWduYXR1cmUoKTsKIAkJCQlkZWZhdWx0OiAvLyBTVVBFUiB8IFVOQk9VTkQKLQkJCQkgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlKCkuc2lnbmF0dXJlKCk7Ci0JICAgICAgICB9ICAgICAgICAKKwkJCQkgICAgcmV0dXJuIHR5cGVWYXJpYWJsZSgpLnNpZ25hdHVyZSgpOworCSAgICAgICAgfQogCQl9CiAJCXJldHVybiB0aGlzLnNpZ25hdHVyZTsKICAgICB9Ci0gICAgCisKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcjc291cmNlTmFtZSgpCiAgICAgICovCiAgICAgcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lKCkgewogICAgICAgICBzd2l0Y2ggKHRoaXMuYm91bmRLaW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFdpbGRjYXJkLlVOQk9VTkQgOiAKKyAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRTsKICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuRVhURU5EUyA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KFR5cGVDb25zdGFudHMuV0lMRENBUkRfTkFNRSwgVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTLCB0aGlzLmJvdW5kLnNvdXJjZU5hbWUoKSk7CiAJCQlkZWZhdWx0OiAvLyBTVVBFUgogCQkJICAgIHJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLldJTERDQVJEX05BTUUsIFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVIsIHRoaXMuYm91bmQuc291cmNlTmFtZSgpKTsKLSAgICAgICAgfSAgICAgICAgCisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiAobm9uLUphdmFkb2MpCkBAIC00OTEsNDYgKzU5MiwyMyBAQAogCQkJaWYgKHRoaXMuYm91bmRLaW5kID09IFdpbGRjYXJkLkVYVEVORFMgJiYgIXRoaXMuYm91bmQuaXNJbnRlcmZhY2UoKSkgewogCQkJCXN1cGVyVHlwZSA9IHRoaXMuYm91bmQ7CiAJCQl9IGVsc2UgewotCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSB0aGlzLnR5cGVWYXJpYWJsZSgpOworCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSB0eXBlVmFyaWFibGUoKTsKIAkJCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgc3VwZXJUeXBlID0gdmFyaWFibGUuZmlyc3RCb3VuZDsKIAkJCX0KIAkJCXRoaXMuc3VwZXJjbGFzcyA9IHN1cGVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcgJiYgIXN1cGVyVHlwZS5pc0ludGVyZmFjZSgpCiAJCQkJPyAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJUeXBlCi0JCQkJOiBlbnZpcm9ubWVudC5nZXRSZXNvbHZlZFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCBudWxsKTsKKwkJCQk6IHRoaXMuZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCwgbnVsbCk7CiAJCX0KIAogCQlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzOwogICAgIH0KLSAgLyoKLSAgICBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzMigpIHsKLQkJaWYgKHRoaXMuc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQlUeXBlQmluZGluZyBzdXBlclR5cGUgPSAodGhpcy5ib3VuZEtpbmQgPT0gV2lsZGNhcmQuRVhURU5EUyAmJiAhdGhpcy5ib3VuZC5pc0ludGVyZmFjZSgpKSAKLQkJCQk/IHRoaXMuYm91bmQKLQkJCQk6IG51bGw7Ci0JCQl0aGlzLnN1cGVyY2xhc3MgPSBzdXBlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nICYmICFzdXBlclR5cGUuaXNJbnRlcmZhY2UoKQotCQkJCT8gKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZQotCQkJCTogZW52aXJvbm1lbnQuZ2V0UmVzb2x2ZWRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCwgbnVsbCk7Ci0JCQkKLS8vCQkJVHlwZUJpbmRpbmcgc3VwZXJUeXBlID0gbnVsbDsKLS8vCQkJaWYgKHRoaXMuYm91bmRLaW5kID09IFdpbGRjYXJkLkVYVEVORFMgJiYgIXRoaXMuYm91bmQuaXNJbnRlcmZhY2UoKSkgewotLy8JCQkJc3VwZXJUeXBlID0gdGhpcy5ib3VuZDsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSB0aGlzLnR5cGVWYXJpYWJsZSgpOwotLy8JCQkJaWYgKHZhcmlhYmxlICE9IG51bGwpIHN1cGVyVHlwZSA9IHZhcmlhYmxlLmZpcnN0Qm91bmQ7Ci0vLwkJCX0KLS8vCQkJdGhpcy5zdXBlcmNsYXNzID0gc3VwZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyAmJiAhc3VwZXJUeXBlLmlzSW50ZXJmYWNlKCkKLS8vCQkJCT8gKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyVHlwZQotLy8JCQkJOiBlbnZpcm9ubWVudC5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzczsKLSAgICB9Ci0qLworCiAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI3N1cGVySW50ZXJmYWNlcygpCiAgICAgICovCiAgICAgcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMoKSB7CiAgICAgICAgIGlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgIAlpZiAodGhpcy50eXBlVmFyaWFibGUoKSAhPSBudWxsKSB7CisgICAgICAgIAlpZiAodHlwZVZhcmlhYmxlKCkgIT0gbnVsbCkgewogICAgICAgICAJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gdGhpcy50eXBlVmFyaWFibGUuc3VwZXJJbnRlcmZhY2VzKCk7CiAgICAgICAgIAl9IGVsc2UgewogICAgICAgICAJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7CkBAIC01NTYsNDEgKzYzNCwyNSBAQAogICAgICAgICByZXR1cm4gdGhpcy5zdXBlckludGVyZmFjZXM7CiAgICAgfQogCi0gICAgcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMyKCkgewotICAgICAgICBpZiAodGhpcy5zdXBlckludGVyZmFjZXMgPT0gbnVsbCkgewotICAgICAgICAJaWYgKHRoaXMuYm91bmRLaW5kID09IFdpbGRjYXJkLkVYVEVORFMpIHsKLSAgICAgICAgCQlpZiAodGhpcy5ib3VuZC5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgIAkJCWlmICh0aGlzLm90aGVyQm91bmRzICE9IG51bGwpIHsKLQkJCQkJCS8vIGF1Z21lbnQgc3VwZXIgaW50ZXJmYWNlcyB3aXRoIHRoZSB3aWxkY2FyZCBvdGhlckJvdW5kcyAoaW50ZXJmYWNlcyBwZXIgY29uc3RydWN0aW9uKQotCQkJCQkJaW50IG90aGVyTGVuZ3RoID0gdGhpcy5vdGhlckJvdW5kcy5sZW5ndGg7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub3RoZXJCb3VuZHMsIDAsIHRoaXMuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbb3RoZXJMZW5ndGgrMV0sIDEsIG90aGVyTGVuZ3RoKTsKLQkJCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzWzBdID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYm91bmQ7Ci0gICAgICAgIAkJCX0gZWxzZSB7Ci0gICAgICAgIAkJCQl0aGlzLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW10geyAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5ib3VuZCB9OwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfSBlbHNlIGlmICh0aGlzLm90aGVyQm91bmRzICE9IG51bGwpIHsKLQkJCQkJaW50IG90aGVyTGVuZ3RoID0gdGhpcy5vdGhlckJvdW5kcy5sZW5ndGg7Ci0gICAgICAgIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdGhlckJvdW5kcywgMCwgdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tvdGhlckxlbmd0aF0sIDAsIG90aGVyTGVuZ3RoKTsKLSAgICAgICAgCQl9IGVsc2UgewotICAgICAgICAJCQl0aGlzLnN1cGVySW50ZXJmYWNlcyA9IEJpbmRpbmcuTk9fU1VQRVJJTlRFUkZBQ0VTOwotICAgICAgICAJCX0KLSAgICAgICAgCX0gZWxzZSB7IAotICAgICAgICAJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gQmluZGluZy5OT19TVVBFUklOVEVSRkFDRVM7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3VwZXJJbnRlcmZhY2VzOwotICAgIH0KLQogCXB1YmxpYyB2b2lkIHN3YXBVbnJlc29sdmVkKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nIHVucmVzb2x2ZWRUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmVkVHlwZSwgTG9va3VwRW52aXJvbm1lbnQgZW52KSB7CiAJCWJvb2xlYW4gYWZmZWN0ZWQgPSBmYWxzZTsKIAkJaWYgKHRoaXMuZ2VuZXJpY1R5cGUgPT0gdW5yZXNvbHZlZFR5cGUpIHsKIAkJCXRoaXMuZ2VuZXJpY1R5cGUgPSByZXNvbHZlZFR5cGU7IC8vIG5vIHJhdyBjb252ZXJzaW9uCiAJCQlhZmZlY3RlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAodGhpcy5ib3VuZCA9PSB1bnJlc29sdmVkVHlwZSkgeworCQl9CisJCWlmICh0aGlzLmJvdW5kID09IHVucmVzb2x2ZWRUeXBlKSB7CiAJCQl0aGlzLmJvdW5kID0gZW52LmNvbnZlcnRVbnJlc29sdmVkQmluYXJ5VG9SYXdUeXBlKHJlc29sdmVkVHlwZSk7CiAJCQlhZmZlY3RlZCA9IHRydWU7CiAJCX0KLQkJaWYgKGFmZmVjdGVkKSAKKwkJaWYgKHRoaXMub3RoZXJCb3VuZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMub3RoZXJCb3VuZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodGhpcy5vdGhlckJvdW5kc1tpXSA9PSB1bnJlc29sdmVkVHlwZSkgeworCQkJCQl0aGlzLm90aGVyQm91bmRzW2ldID0gZW52LmNvbnZlcnRVbnJlc29sdmVkQmluYXJ5VG9SYXdUeXBlKHJlc29sdmVkVHlwZSk7CisJCQkJCWFmZmVjdGVkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGFmZmVjdGVkKQogCQkJaW5pdGlhbGl6ZSh0aGlzLmdlbmVyaWNUeXBlLCB0aGlzLmJvdW5kLCB0aGlzLm90aGVyQm91bmRzKTsKIAl9CiAKQEAgLTU5OSw3ICs2NjEsNyBAQAogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHN3aXRjaCAodGhpcy5ib3VuZEtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgV2lsZGNhcmQuVU5CT1VORCA6IAorICAgICAgICAgICAgY2FzZSBXaWxkY2FyZC5VTkJPVU5EIDoKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLldJTERDQVJEX05BTUUpOwogICAgICAgICAgICAgY2FzZSBXaWxkY2FyZC5FWFRFTkRTIDoKICAgICAgICAgICAgIAlpZiAodGhpcy5vdGhlckJvdW5kcyA9PSBudWxsKQpAQCAtNjExLDggKzY3Myw4IEBACiAgICAgICAgICAgICAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCQkJZGVmYXVsdDogLy8gU1VQRVIKIAkJCSAgICByZXR1cm4gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdChUeXBlQ29uc3RhbnRzLldJTERDQVJEX05BTUUsIFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVIsIHRoaXMuYm91bmQuZGVidWdOYW1lKCkudG9DaGFyQXJyYXkoKSkpOwotICAgICAgICB9ICAgICAgICAKLQl9CQkKKyAgICAgICAgfQorCX0KIAkvKioKIAkgKiBSZXR1cm5zIGFzc29jaWF0ZWQgdHlwZSB2YXJpYWJsZSwgb3IgbnVsbCBpbiBjYXNlIG9mIGluY29uc2lzdGVuY3kKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggN2Q2YzAzMS4uNjE0ZDVhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOCw3ICs4LDcgQEAKICMgQ29udHJpYnV0b3JzOgogIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgRWNsaXBzZSBKYXZhIENvcmUgQ29tcGlsZXIgbWVzc2FnZXMuCisjIyMgY29tcGlsZXIgbWVzc2FnZXMuCiAKICMjIyBjb21waWxhdGlvbgogY29tcGlsYXRpb25fdW5yZXNvbHZlZFByb2JsZW0gPSAgVW5yZXNvbHZlZCBjb21waWxhdGlvbiBwcm9ibGVtOiBcbgpAQCAtMjAsNyArMjAsOSBAQAogY29tcGlsYXRpb25fZG9uZSAgICAgICA9IFtjb21wbGV0ZWQgIHsyfSAtICN7MH0vezF9XQogY29tcGlsYXRpb25fdW5pdHMgICAgICA9IFt7MH0gdW5pdHMgY29tcGlsZWRdCiBjb21waWxhdGlvbl91bml0ICAgICAgID0gW3swfSB1bml0IGNvbXBpbGVkXQotY29tcGlsYXRpb25faW50ZXJuYWxFcnJvciA9IEludGVybmFsIGNvbXBpbGVyIGVycm9yCitjb21waWxhdGlvbl9pbnRlcm5hbEVycm9yID0gSW50ZXJuYWwgY29tcGlsZXIgZXJyb3I6IHswfQorY29tcGlsYXRpb25fYmVnaW5uaW5nVG9Db21waWxlPUJlZ2lubmluZyB0byBjb21waWxlCitjb21waWxhdGlvbl9wcm9jZXNzaW5nPVByb2Nlc3NpbmcgezB9CiAKICMjIyBvdXRwdXQKIG91dHB1dF9pc0ZpbGUgPSAgUmVndWxhciBmaWxlIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBvdXRwdXQgZGlyZWN0b3J5CkBAIC0zNiw2ICszOCw3IEBACiBhYm9ydF9pbnZhbGlkRXhjZXB0aW9uQXR0cmlidXRlID0gU0FOSVRZIENIRUNLOiBJbnZhbGlkIGF0dHJpYnV0ZSBmb3IgZXhjZXB0aW9uIGF0dHJpYnV0ZSBmb3IgezB9CiBhYm9ydF9taXNzaW5nQ29kZSA9IE1pc3NpbmcgY29kZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY29tcGlsZXIKIGFib3J0X2FnYWluc3RTb3VyY2VNb2RlbCA9IENhbm5vdCBjb21waWxlIGFnYWluc3Qgc291cmNlIG1vZGVsIHswfSBpc3N1ZWQgZnJvbSB7MX0KK2Fib3J0X2ludmFsaWRPcGNvZGUgPSBTQU5JVFkgQ0hFQ0s6IEludmFsaWQgb3Bjb2RlIHswfSBhdCBwYyB7MX0gZm9yIHN0YWNrbWFwIHRhYmxlIGF0dHJpYnV0ZSBmb3IgbWV0aG9kIHsyfQogCiAjIyMgYWNjZXB0CiBhY2NlcHRfY2Fubm90ID0gQ2Fubm90IGFjY2VwdCB0aGUgY29tcGlsYXRpb24gdW5pdDoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RDb21tZW50UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tbWVudFBhcnNlci5qYXZhCmluZGV4IGRmYTBjY2UuLmJhN2Q5YTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RDb21tZW50UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9BYnN0cmFjdENvbW1lbnRQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwxNSArMjQsMTYgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbW1lbnRQYXJzZXIgaW1wbGVtZW50cyBKYXZhZG9jVGFnQ29uc3RhbnRzIHsKIAogCS8vIEtpbmQgb2YgY29tbWVudCBwYXJzZXIKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QSUxfUEFSU0VSID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBET01fUEFSU0VSID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUxFQ1RJT05fUEFSU0VSID0gMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QTEVUSU9OX1BBUlNFUiA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09VUkNFX1BBUlNFUiA9IDU7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUElMX1BBUlNFUiA9IDB4MDAwMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBET01fUEFSU0VSID0gMHgwMDAyOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFTEVDVElPTl9QQVJTRVIgPSAweDAwMDQ7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUExFVElPTl9QQVJTRVIgPSAweDAwMDg7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09VUkNFX1BBUlNFUiA9IDB4MDAxMDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGT1JNQVRURVJfQ09NTUVOVF9QQVJTRVIgPSAweDAwMjA7CiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgUEFSU0VSX0tJTkQgPSAweDAwRkY7CiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgVEVYVF9QQVJTRSA9IDB4MDEwMDsgLy8gZmxhZyBzYXlpbmcgdGhhdCB0ZXh0IG11c3QgYmUgc3RvcmVkCiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgVEVYVF9WRVJJRiA9IDB4MDIwMDsgLy8gZmxhZyBzYXlpbmcgdGhhdCB0ZXh0IG11c3QgYmUgdmVyaWZpZWQKLQkKKwogCS8vIFBhcnNlciByZWNvdmVyeSBzdGF0ZXMKIAlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBRVUFMSUZJRURfTkFNRV9SRUNPVkVSWSA9IDE7CiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQVJHVU1FTlRfUkVDT1ZFUlk9IDI7CkBAIC00NCwyMCArNDUsMjYgQEAKIAlwdWJsaWMgY2hhcltdIHNvdXJjZTsKIAlwcm90ZWN0ZWQgUGFyc2VyIHNvdXJjZVBhcnNlcjsKIAlwcml2YXRlIGludCBjdXJyZW50VG9rZW5UeXBlID0gLTE7Ci0JCisKIAkvLyBPcHRpb25zCiAJcHVibGljIGJvb2xlYW4gY2hlY2tEb2NDb21tZW50ID0gZmFsc2U7CisJcHVibGljIGJvb2xlYW4gc2V0SmF2YWRvY1Bvc2l0aW9ucyA9IGZhbHNlOwogCXB1YmxpYyBib29sZWFuIHJlcG9ydFByb2JsZW1zOwogCXByb3RlY3RlZCBsb25nIGNvbXBsaWFuY2VMZXZlbDsKIAlwcm90ZWN0ZWQgbG9uZyBzb3VyY2VMZXZlbDsKIAkKKwkvLyBTdXBwb3J0IGZvciB7QGluaGVyaXREb2N9CisJcHJvdGVjdGVkIGxvbmcgW10gaW5oZXJpdGVkUG9zaXRpb25zOworCXByb3RlY3RlZCBpbnQgaW5oZXJpdGVkUG9zaXRpb25zUHRyOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkhFUklURURfUE9TSVRJT05TX0FSUkFZX0lOQ1JFTUVOVCA9IDQ7CisKIAkvLyBSZXN1bHRzCi0JcHJvdGVjdGVkIGxvbmcgaW5oZXJpdGVkUG9zaXRpb25zOwogCXByb3RlY3RlZCBib29sZWFuIGRlcHJlY2F0ZWQ7CiAJcHJvdGVjdGVkIE9iamVjdCByZXR1cm5TdGF0ZW1lbnQ7Ci0JCisKIAkvLyBQb3NpdGlvbnMKIAlwcm90ZWN0ZWQgaW50IGphdmFkb2NTdGFydCwgamF2YWRvY0VuZDsKKwlwcm90ZWN0ZWQgaW50IGphdmFkb2NUZXh0U3RhcnQsIGphdmFkb2NUZXh0RW5kID0gLTE7CiAJcHJvdGVjdGVkIGludCBmaXJzdFRhZ1Bvc2l0aW9uOwogCXByb3RlY3RlZCBpbnQgaW5kZXgsIGxpbmVFbmQ7CiAJcHJvdGVjdGVkIGludCB0b2tlblByZXZpb3VzUG9zaXRpb24sIGxhc3RJZGVudGlmaWVyRW5kUG9zaXRpb24sIHN0YXJQb3NpdGlvbjsKQEAgLTY1LDE3ICs3MiwxOCBAQAogCXByb3RlY3RlZCBpbnQgdGFnU291cmNlU3RhcnQsIHRhZ1NvdXJjZUVuZDsKIAlwcm90ZWN0ZWQgaW50IGlubGluZVRhZ1N0YXJ0OwogCXByb3RlY3RlZCBpbnRbXSBsaW5lRW5kczsKLQkKKwogCS8vIEZsYWdzCiAJcHJvdGVjdGVkIGJvb2xlYW4gbGluZVN0YXJ0ZWQgPSBmYWxzZTsKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpbmxpbmVUYWdTdGFydGVkID0gZmFsc2U7CiAJcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnQgPSBmYWxzZTsKIAlwcm90ZWN0ZWQgaW50IGtpbmQ7CiAJcHJvdGVjdGVkIGludCB0YWdWYWx1ZSA9IE5PX1RBR19WQUxVRTsKLQkKKwlwcm90ZWN0ZWQgaW50IGxhc3RCbG9ja1RhZ1ZhbHVlID0gTk9fVEFHX1ZBTFVFOworCiAJLy8gTGluZSBwb2ludGVycwogCXByaXZhdGUgaW50IGxpbmVQdHIsIGxhc3RMaW5lUHRyOwotCQorCiAJLy8gSWRlbnRpZmllciBzdGFjawogCXByb3RlY3RlZCBpbnQgaWRlbnRpZmllclB0cjsKIAlwcm90ZWN0ZWQgY2hhcltdW10gaWRlbnRpZmllclN0YWNrOwpAQCAtOTAsNiArOTgsNyBAQAogCXByb3RlY3RlZCBpbnQgYXN0TGVuZ3RoUHRyOwogCXByb3RlY3RlZCBpbnRbXSBhc3RMZW5ndGhTdGFjazsKIAorCiAJcHJvdGVjdGVkIEFic3RyYWN0Q29tbWVudFBhcnNlcihQYXJzZXIgc291cmNlUGFyc2VyKSB7CiAJCXRoaXMuc291cmNlUGFyc2VyID0gc291cmNlUGFyc2VyOwogCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zLCBudWxsLCBudWxsLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKQEAgLTEwOSw1OSArMTE4LDczIEBACiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogUmV0dXJucyB0cnVlIGlmIHRhZyBAZGVwcmVjYXRlZCBpcyBwcmVzZW50IGluIGphdmFkb2MgY29tbWVudC4KLQkgKiAKLQkgKiBJZiBqYXZhZG9jIGNoZWNraW5nIGlzIGVuYWJsZWQsIHdpbGwgYWxzbyBjb25zdHJ1Y3QgYW4gSmF2YWRvYyBub2RlLCB3aGljaCB3aWxsIGJlIHN0b3JlZCBpbnRvIFBhcnNlci5qYXZhZG9jCi0JICogc2xvdCBmb3IgYmVpbmcgY29uc3VtZWQgbGF0ZXIgb24uCisJICoKKwkgKiBJZiBqYXZhZG9jIGNoZWNraW5nIGlzIGVuYWJsZWQsIHdpbGwgYWxzbyBjb25zdHJ1Y3QgYW4gSmF2YWRvYyBub2RlLAorCSAqIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGludG8gUGFyc2VyLmphdmFkb2Mgc2xvdCBmb3IgYmVpbmcgY29uc3VtZWQgbGF0ZXIgb24uCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gY29tbWVudFBhcnNlKCkgewotCQkKKwogCQlib29sZWFuIHZhbGlkQ29tbWVudCA9IHRydWU7CiAJCXRyeSB7Ci0JCQkvLyBJbml0IHNjYW5uZXIgcG9zaXRpb24KLQkJCXRoaXMubGluZVB0ciA9IGdldExpbmVOdW1iZXIodGhpcy5maXJzdFRhZ1Bvc2l0aW9uKTsKLQkJCWludCByZWFsU3RhcnQgPSB0aGlzLmxpbmVQdHI9PTEgPyBqYXZhZG9jU3RhcnQgOiB0aGlzLnNjYW5uZXIuZ2V0TGluZUVuZCh0aGlzLmxpbmVQdHItMSkrMTsKLQkJCWlmIChyZWFsU3RhcnQgPCBqYXZhZG9jU3RhcnQpIHJlYWxTdGFydCA9IGphdmFkb2NTdGFydDsKLQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHJlYWxTdGFydCwgamF2YWRvY0VuZCk7Ci0JCQl0aGlzLmluZGV4ID0gcmVhbFN0YXJ0OwotCQkJaWYgKHJlYWxTdGFydCA9PSBqYXZhZG9jU3RhcnQpIHsKLQkJCQlyZWFkQ2hhcigpOyAvLyBzdGFydGluZyAnLycKLQkJCQlyZWFkQ2hhcigpOyAvLyBmaXJzdCAnKicKLQkJCX0KLQkJCWludCBwcmV2aW91c1Bvc2l0aW9uID0gdGhpcy5pbmRleDsKLQkJCWNoYXIgbmV4dENoYXJhY3RlciA9IDA7Ci0JCQlpZiAocmVhbFN0YXJ0ID09IGphdmFkb2NTdGFydCkgbmV4dENoYXJhY3RlciA9IHJlYWRDaGFyKCk7IC8vIHNlY29uZCAnKicKLQogCQkJLy8gSW5pdCBsb2NhbCB2YXJpYWJsZXMKIAkJCXRoaXMuYXN0TGVuZ3RoUHRyID0gLTE7CiAJCQl0aGlzLmFzdFB0ciA9IC0xOwogCQkJdGhpcy5pZGVudGlmaWVyUHRyID0gLTE7CiAJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCXRoaXMuaW5saW5lVGFnU3RhcnRlZCA9IGZhbHNlOworCQkJc2V0SW5saW5lVGFnU3RhcnRlZChmYWxzZSk7CiAJCQl0aGlzLmlubGluZVRhZ1N0YXJ0ID0gLTE7CiAJCQl0aGlzLmxpbmVTdGFydGVkID0gZmFsc2U7CiAJCQl0aGlzLnJldHVyblN0YXRlbWVudCA9IG51bGw7Ci0JCQl0aGlzLmluaGVyaXRlZFBvc2l0aW9ucyA9IC0xOworCQkJdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPSBudWxsOworCQkJdGhpcy5sYXN0QmxvY2tUYWdWYWx1ZSA9IE5PX1RBR19WQUxVRTsKIAkJCXRoaXMuZGVwcmVjYXRlZCA9IGZhbHNlOwotCQkJdGhpcy5sYXN0TGluZVB0ciA9IGdldExpbmVOdW1iZXIoamF2YWRvY0VuZCk7Ci0JCQl0aGlzLmxpbmVFbmQgPSAodGhpcy5saW5lUHRyID09IHRoaXMubGFzdExpbmVQdHIpID8gdGhpcy5qYXZhZG9jRW5kOiB0aGlzLnNjYW5uZXIuZ2V0TGluZUVuZCh0aGlzLmxpbmVQdHIpIC0gMTsKKwkJCXRoaXMubGFzdExpbmVQdHIgPSBnZXRMaW5lTnVtYmVyKHRoaXMuamF2YWRvY0VuZCk7CiAJCQl0aGlzLnRleHRTdGFydCA9IC0xOworCQkJdGhpcy5hYm9ydCA9IGZhbHNlOwogCQkJY2hhciBwcmV2aW91c0NoYXIgPSAwOwogCQkJaW50IGludmFsaWRUYWdMaW5lRW5kID0gLTE7CiAJCQlpbnQgaW52YWxpZElubGluZVRhZ0xpbmVFbmQgPSAtMTsKLQkJCWJvb2xlYW4gcHVzaFRleHQgPSAodGhpcy5raW5kICYgVEVYVF9QQVJTRSkgIT0gMDsKKwkJCWJvb2xlYW4gbGluZUhhc1N0YXIgPSB0cnVlOwogCQkJYm9vbGVhbiB2ZXJpZlRleHQgPSAodGhpcy5raW5kICYgVEVYVF9WRVJJRikgIT0gMDsKIAkJCWJvb2xlYW4gaXNEb21QYXJzZXIgPSAodGhpcy5raW5kICYgRE9NX1BBUlNFUikgIT0gMDsKLQkJCQorCQkJYm9vbGVhbiBpc0Zvcm1hdHRlclBhcnNlciA9ICh0aGlzLmtpbmQgJiBGT1JNQVRURVJfQ09NTUVOVF9QQVJTRVIpICE9IDA7CisJCQlpbnQgbGFzdFN0YXJQb3NpdGlvbiA9IC0xOworCisJCQkvLyBJbml0IHNjYW5uZXIgcG9zaXRpb24KKwkJCXRoaXMubGluZVB0ciA9IGdldExpbmVOdW1iZXIodGhpcy5maXJzdFRhZ1Bvc2l0aW9uKTsKKwkJCWludCByZWFsU3RhcnQgPSB0aGlzLmxpbmVQdHI9PTEgPyB0aGlzLmphdmFkb2NTdGFydCA6IHRoaXMuc2Nhbm5lci5nZXRMaW5lRW5kKHRoaXMubGluZVB0ci0xKSsxOworCQkJaWYgKHJlYWxTdGFydCA8IHRoaXMuamF2YWRvY1N0YXJ0KSByZWFsU3RhcnQgPSB0aGlzLmphdmFkb2NTdGFydDsKKwkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHJlYWxTdGFydCwgdGhpcy5qYXZhZG9jRW5kKTsKKwkJCXRoaXMuaW5kZXggPSByZWFsU3RhcnQ7CisJCQlpZiAocmVhbFN0YXJ0ID09IHRoaXMuamF2YWRvY1N0YXJ0KSB7CisJCQkJcmVhZENoYXIoKTsgLy8gc3RhcnRpbmcgJy8nCisJCQkJcmVhZENoYXIoKTsgLy8gZmlyc3QgJyonCisJCQl9CisJCQlpbnQgcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CisJCQljaGFyIG5leHRDaGFyYWN0ZXIgPSAwOworCQkJaWYgKHJlYWxTdGFydCA9PSB0aGlzLmphdmFkb2NTdGFydCkgeworCQkJCW5leHRDaGFyYWN0ZXIgPSByZWFkQ2hhcigpOyAvLyBzZWNvbmQgJyonCisJCQkJd2hpbGUgKHBlZWtDaGFyKCkgPT0gJyonKSB7CisJCQkJCW5leHRDaGFyYWN0ZXIgPSByZWFkQ2hhcigpOyAvLyByZWFkIGFsbCBjb250aWd1b3VzICcqJworCQkJCX0KKwkJCQl0aGlzLmphdmFkb2NUZXh0U3RhcnQgPSB0aGlzLmluZGV4OworCQkJfQorCQkJdGhpcy5saW5lRW5kID0gKHRoaXMubGluZVB0ciA9PSB0aGlzLmxhc3RMaW5lUHRyKSA/IHRoaXMuamF2YWRvY0VuZDogdGhpcy5zY2FubmVyLmdldExpbmVFbmQodGhpcy5saW5lUHRyKSAtIDE7CisJCQl0aGlzLmphdmFkb2NUZXh0RW5kID0gdGhpcy5qYXZhZG9jRW5kIC0gMjsgLy8gc3VwcG9zZWQgdGV4dCBlbmQsIGl0IHdpbGwgYmUgcmVmaW5lZCBsYXRlci4uLgorCiAJCQkvLyBMb29wIG9uIGVhY2ggY29tbWVudCBjaGFyYWN0ZXIKLQkJCXdoaWxlICghYWJvcnQgJiYgdGhpcy5pbmRleCA8IHRoaXMuamF2YWRvY0VuZCkgeworCQkJaW50IHRleHRFbmRQb3NpdGlvbiA9IC0xOworCQkJd2hpbGUgKCF0aGlzLmFib3J0ICYmIHRoaXMuaW5kZXggPCB0aGlzLmphdmFkb2NFbmQpIHsKKworCQkJCS8vIFN0b3JlIHByZXZpb3VzIHBvc2l0aW9uIGFuZCBjaGFyCiAJCQkJcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCQkJcHJldmlvdXNDaGFyID0gbmV4dENoYXJhY3RlcjsKLQkJCQkKKwogCQkJCS8vIENhbGN1bGF0ZSBsaW5lIGVuZCAoY2Fubm90IHVzZSB0aGlzLnNjYW5uZXIubGluZVB0ciBhcyBzY2FubmVyIGRvZXMgbm90IHBhcnNlIGxpbmUgZW5kcyBhZ2FpbikKIAkJCQlpZiAodGhpcy5pbmRleCA+ICh0aGlzLmxpbmVFbmQrMSkpIHsKIAkJCQkJdXBkYXRlTGluZUVuZCgpOwogCQkJCX0KLQkJCQkKKwogCQkJCS8vIFJlYWQgbmV4dCBjaGFyIG9ubHkgaWYgdG9rZW4gd2FzIGNvbnN1bWVkCiAJCQkJaWYgKHRoaXMuY3VycmVudFRva2VuVHlwZSA8IDApIHsKIAkJCQkJbmV4dENoYXJhY3RlciA9IHJlYWRDaGFyKCk7IC8vIGNvbnNpZGVyIHVuaWNvZGVzCkBAIC0xNzksMTcgKzIwMiwxNCBAQAogCQkJCQl9CiAJCQkJCWNvbnN1bWVUb2tlbigpOwogCQkJCX0KLQkJCQotCQkJCWlmICh0aGlzLmluZGV4ID49IHRoaXMuamF2YWRvY0VuZCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCisKKwkJCQkvLyBDb25zdW1lIHJ1bGVzIGRlcGVuZGluZyBvbiB0aGUgcmVhZCBjaGFyYWN0ZXIKIAkJCQlzd2l0Y2ggKG5leHRDaGFyYWN0ZXIpIHsKIAkJCQkJY2FzZSAnQCcgOgogCQkJCQkJLy8gU3RhcnQgdGFnIHBhcnNpbmcgb25seSBpZiB3ZSBhcmUgb24gbGluZSBiZWdpbm5pbmcgb3IgYXQgaW5saW5lIHRhZyBiZWdpbm5pbmcKIAkJCQkJCWlmICgoIXRoaXMubGluZVN0YXJ0ZWQgfHwgcHJldmlvdXNDaGFyID09ICd7JykpIHsKIAkJCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQkJCQkJCXRoaXMuaW5saW5lVGFnU3RhcnRlZCA9IGZhbHNlOworCQkJCQkJCQlzZXRJbmxpbmVUYWdTdGFydGVkKGZhbHNlKTsKIAkJCQkJCQkJLy8gYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzI3OQogCQkJCQkJCQkvLyBDYW5ub3QgaGF2ZSBAIGluc2lkZSBpbmxpbmUgY29tbWVudAogCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewpAQCAtMTk3LDE5ICsyMTcsMjMgQEAKIAkJCQkJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbnRlcm1pbmF0ZWRJbmxpbmVUYWcodGhpcy5pbmxpbmVUYWdTdGFydCwgZW5kKTsKIAkJCQkJCQkJfQogCQkJCQkJCQl2YWxpZENvbW1lbnQgPSBmYWxzZTsKLQkJCQkJCQkJaWYgKHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDwgcHJldmlvdXNQb3NpdGlvbikgewotCQkJCQkJCQkJaWYgKHB1c2hUZXh0KSBwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgcHJldmlvdXNQb3NpdGlvbik7CisJCQkJCQkJCWlmICh0aGlzLnRleHRTdGFydCAhPSAtMSAmJiB0aGlzLnRleHRTdGFydCA8IHRleHRFbmRQb3NpdGlvbikgeworCQkJCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHRleHRFbmRQb3NpdGlvbik7CiAJCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGlzRG9tUGFyc2VyKSByZWZyZXNoSW5saW5lVGFnUG9zaXRpb24ocHJldmlvdXNQb3NpdGlvbik7CisJCQkJCQkJCWlmIChpc0RvbVBhcnNlciB8fCBpc0Zvcm1hdHRlclBhcnNlcikgeworCQkJCQkJCQkJcmVmcmVzaElubGluZVRhZ1Bvc2l0aW9uKHRleHRFbmRQb3NpdGlvbik7CisJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJaWYgKHByZXZpb3VzQ2hhciA9PSAneycpIHsKLQkJCQkJCQkJaWYgKHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDwgdGhpcy5pbmxpbmVUYWdTdGFydCkgewotCQkJCQkJCQkJaWYgKHB1c2hUZXh0KSBwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgdGhpcy5pbmxpbmVUYWdTdGFydCk7CisJCQkJCQkJCWlmICh0aGlzLnRleHRTdGFydCAhPSAtMSkgeworCQkJCQkJCQkJaWYgKHRoaXMudGV4dFN0YXJ0IDwgdGV4dEVuZFBvc2l0aW9uKSB7CisJCQkJCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHRleHRFbmRQb3NpdGlvbik7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KLQkJCQkJCQkJdGhpcy5pbmxpbmVUYWdTdGFydGVkID0gdHJ1ZTsKKwkJCQkJCQkJc2V0SW5saW5lVGFnU3RhcnRlZCh0cnVlKTsKIAkJCQkJCQkJaW52YWxpZElubGluZVRhZ0xpbmVFbmQgPSB0aGlzLmxpbmVFbmQ7CiAJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnRleHRTdGFydCAhPSAtMSAmJiB0aGlzLnRleHRTdGFydCA8IGludmFsaWRUYWdMaW5lRW5kKSB7Ci0JCQkJCQkJCWlmIChwdXNoVGV4dCkgcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIGludmFsaWRUYWdMaW5lRW5kKTsKKwkJCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIGludmFsaWRUYWdMaW5lRW5kKTsKIAkJCQkJCQl9CiAJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5pbmRleCwgdGhpcy5qYXZhZG9jRW5kKTsKIAkJCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsgLy8gZmx1c2ggdG9rZW4gY2FjaGUgYXQgbGluZSBiZWdpbgpAQCAtMjI1LDIxICsyNDksMzMgQEAKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCXRoaXMudGV4dFN0YXJ0ID0gdGhpcy50YWdTb3VyY2VFbmQrMTsKIAkJCQkJCQkJCWludmFsaWRUYWdMaW5lRW5kICA9IHRoaXMubGluZUVuZDsKKwkJCQkJCQkJCXRleHRFbmRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCQkJCQkJCX0KIAkJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCQkJCQljb25zdW1lVG9rZW4oKTsKIAkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHZlcmlmVGV4dCAmJiB0aGlzLnRhZ1ZhbHVlID09IFRBR19SRVRVUk5fVkFMVUUgJiYgdGhpcy5yZXR1cm5TdGF0ZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXJlZnJlc2hSZXR1cm5TdGF0ZW1lbnQoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGV4dEVuZFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwkJCQkJCQlpZiAodmVyaWZUZXh0ICYmIHRoaXMudGFnVmFsdWUgPT0gVEFHX1JFVFVSTl9WQUxVRSAmJiB0aGlzLnJldHVyblN0YXRlbWVudCAhPSBudWxsKSB7CisJCQkJCQkJCXJlZnJlc2hSZXR1cm5TdGF0ZW1lbnQoKTsKKwkJCQkJCQl9IGVsc2UgaWYgKGlzRm9ybWF0dGVyUGFyc2VyKSB7CisJCQkJCQkJCWlmICh0aGlzLnRleHRTdGFydCA9PSAtMSkgdGhpcy50ZXh0U3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCXRoaXMubGluZVN0YXJ0ZWQgPSB0cnVlOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJ1xyJzoKIAkJCQkJY2FzZSAnXG4nOgotCQkJCQkJaWYgKHRoaXMubGluZVN0YXJ0ZWQgJiYgdGhpcy50ZXh0U3RhcnQgPCBwcmV2aW91c1Bvc2l0aW9uKSB7Ci0JCQkJCQkJaWYgKHB1c2hUZXh0KSBwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgcHJldmlvdXNQb3NpdGlvbik7CisJCQkJCQlpZiAodGhpcy5saW5lU3RhcnRlZCkgeworCQkJCQkJCWlmIChpc0Zvcm1hdHRlclBhcnNlciAmJiAhU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UocHJldmlvdXNDaGFyKSkgeworCQkJCQkJCQl0ZXh0RW5kUG9zaXRpb24gPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodGhpcy50ZXh0U3RhcnQgIT0gLTEgJiYgdGhpcy50ZXh0U3RhcnQgPCB0ZXh0RW5kUG9zaXRpb24pIHsKKwkJCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHRleHRFbmRQb3NpdGlvbik7CisJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJdGhpcy5saW5lU3RhcnRlZCA9IGZhbHNlOworCQkJCQkJbGluZUhhc1N0YXIgPSBmYWxzZTsKIAkJCQkJCS8vIEZpeCBidWcgNTE2NTAKIAkJCQkJCXRoaXMudGV4dFN0YXJ0ID0gLTE7CiAJCQkJCQlicmVhazsKQEAgLTI0OCwzOSArMjg0LDQxIEBACiAJCQkJCQkJcmVmcmVzaFJldHVyblN0YXRlbWVudCgpOwogCQkJCQkJfQogCQkJCQkJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCkgewotCQkJCQkJCWlmIChwdXNoVGV4dCkgewotCQkJCQkJCQlpZiAodGhpcy5saW5lU3RhcnRlZCAmJiB0aGlzLnRleHRTdGFydCAhPSAtMSAmJiB0aGlzLnRleHRTdGFydCA8IHByZXZpb3VzUG9zaXRpb24pIHsKLQkJCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHByZXZpb3VzUG9zaXRpb24pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihwcmV2aW91c1Bvc2l0aW9uKTsKKwkJCQkJCQl0ZXh0RW5kUG9zaXRpb24gPSB0aGlzLmluZGV4IC0gMTsKKwkJCQkJCQlpZiAodGhpcy5saW5lU3RhcnRlZCAmJiB0aGlzLnRleHRTdGFydCAhPSAtMSAmJiB0aGlzLnRleHRTdGFydCA8IHRleHRFbmRQb3NpdGlvbikgeworCQkJCQkJCQlwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgdGV4dEVuZFBvc2l0aW9uKTsKIAkJCQkJCQl9Ci0JCQkJCQkJdGhpcy50ZXh0U3RhcnQgPSB0aGlzLmluZGV4OwotCQkJCQkJCXRoaXMuaW5saW5lVGFnU3RhcnRlZCA9IGZhbHNlOworCQkJCQkJCXJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihwcmV2aW91c1Bvc2l0aW9uKTsKKwkJCQkJCQlpZiAoIWlzRm9ybWF0dGVyUGFyc2VyKSB0aGlzLnRleHRTdGFydCA9IHRoaXMuaW5kZXg7CisJCQkJCQkJc2V0SW5saW5lVGFnU3RhcnRlZChmYWxzZSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlmICghdGhpcy5saW5lU3RhcnRlZCkgewogCQkJCQkJCQl0aGlzLnRleHRTdGFydCA9IHByZXZpb3VzUG9zaXRpb247CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJdGhpcy5saW5lU3RhcnRlZCA9IHRydWU7CisJCQkJCQl0ZXh0RW5kUG9zaXRpb24gPSB0aGlzLmluZGV4OwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJ3snIDoKIAkJCQkJCWlmICh2ZXJpZlRleHQgJiYgdGhpcy50YWdWYWx1ZSA9PSBUQUdfUkVUVVJOX1ZBTFVFICYmIHRoaXMucmV0dXJuU3RhdGVtZW50ICE9IG51bGwpIHsKIAkJCQkJCQlyZWZyZXNoUmV0dXJuU3RhdGVtZW50KCk7CiAJCQkJCQl9CiAJCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQkJCQkJdGhpcy5pbmxpbmVUYWdTdGFydGVkID0gZmFsc2U7CisJCQkJCQkJc2V0SW5saW5lVGFnU3RhcnRlZChmYWxzZSk7CiAJCQkJCQkJLy8gYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzI3OQogCQkJCQkJCS8vIENhbm5vdCBoYXZlIG9wZW5pbmcgYnJhY2UgaW4gaW5saW5lIGNvbW1lbnQKIAkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewogCQkJCQkJCQlpbnQgZW5kID0gcHJldmlvdXNQb3NpdGlvbjxpbnZhbGlkSW5saW5lVGFnTGluZUVuZCA/IHByZXZpb3VzUG9zaXRpb24gOiBpbnZhbGlkSW5saW5lVGFnTGluZUVuZDsKIAkJCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VudGVybWluYXRlZElubGluZVRhZyh0aGlzLmlubGluZVRhZ1N0YXJ0LCBlbmQpOwogCQkJCQkJCX0KLQkJCQkJCQlpZiAocHVzaFRleHQpIHsKLQkJCQkJCQkJaWYgKHRoaXMubGluZVN0YXJ0ZWQgJiYgdGhpcy50ZXh0U3RhcnQgIT0gLTEgJiYgdGhpcy50ZXh0U3RhcnQgPCBwcmV2aW91c1Bvc2l0aW9uKSB7Ci0JCQkJCQkJCQlwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgcHJldmlvdXNQb3NpdGlvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmVmcmVzaElubGluZVRhZ1Bvc2l0aW9uKHByZXZpb3VzUG9zaXRpb24pOworCQkJCQkJCWlmICh0aGlzLmxpbmVTdGFydGVkICYmIHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDwgdGV4dEVuZFBvc2l0aW9uKSB7CisJCQkJCQkJCXB1c2hUZXh0KHRoaXMudGV4dFN0YXJ0LCB0ZXh0RW5kUG9zaXRpb24pOwogCQkJCQkJCX0KKwkJCQkJCQlyZWZyZXNoSW5saW5lVGFnUG9zaXRpb24odGV4dEVuZFBvc2l0aW9uKTsKKwkJCQkJCQl0ZXh0RW5kUG9zaXRpb24gPSB0aGlzLmluZGV4OworCQkJCQkJfSBlbHNlIGlmIChwZWVrQ2hhcigpICE9ICdAJykgeworCQkJCQkJCWlmICh0aGlzLnRleHRTdGFydCA9PSAtMSkgdGhpcy50ZXh0U3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCXRleHRFbmRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCQkJCQl9CiAJCQkJCQlpZiAoIXRoaXMubGluZVN0YXJ0ZWQpIHsKIAkJCQkJCQl0aGlzLnRleHRTdGFydCA9IHByZXZpb3VzUG9zaXRpb247CkBAIC0yODksMzkgKzMyNyw4NiBAQAogCQkJCQkJdGhpcy5pbmxpbmVUYWdTdGFydCA9IHByZXZpb3VzUG9zaXRpb247CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSAnKicgOgorCQkJCQkJLy8gU3RvcmUgdGhlIHN0YXIgcG9zaXRpb24gYXMgdGV4dCBzdGFydCB3aGlsZSBmb3JtYXR0aW5nCisJCQkJCQlsYXN0U3RhclBvc2l0aW9uID0gcHJldmlvdXNQb3NpdGlvbjsKKwkJCQkJCWlmIChwcmV2aW91c0NoYXIgIT0gJyonKSB7CisJCQkJCQkJdGhpcy5zdGFyUG9zaXRpb24gPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCWlmIChpc0RvbVBhcnNlciB8fCBpc0Zvcm1hdHRlclBhcnNlcikgeworCQkJCQkJCQlpZiAobGluZUhhc1N0YXIpIHsKKwkJCQkJCQkJCXRoaXMubGluZVN0YXJ0ZWQgPSB0cnVlOworCQkJCQkJCQkJaWYgKHRoaXMudGV4dFN0YXJ0ID09IC0xKSB7CisJCQkJCQkJCQkJdGhpcy50ZXh0U3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCQkJCWlmICh0aGlzLmluZGV4IDw9IHRoaXMuamF2YWRvY1RleHRFbmQpIHRleHRFbmRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKCF0aGlzLmxpbmVTdGFydGVkKSB7CisJCQkJCQkJCQlsaW5lSGFzU3RhciA9IHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKIAkJCQkJY2FzZSAnXHUwMDBjJyA6CS8qIEZPUk0gRkVFRCAgICAgICAgICAgICAgICovCiAJCQkJCWNhc2UgJyAnIDoJCQkvKiBTUEFDRSAgICAgICAgICAgICAgICAgICAqLwogCQkJCQljYXNlICdcdCcgOgkJCS8qIEhPUklaT05UQUwgVEFCVUxBVElPTiAgICovCi0JCQkJCQkvLyBkbyBub3RoaW5nIGZvciBzcGFjZSBvciAnKicgY2hhcmFjdGVycworCQkJCQkJLy8gRG8gbm90IGluY2x1ZGUgdHJhaWxpbmcgc3BhY2VzIGluIHRleHQgd2hpbGUgZm9ybWF0dGluZworCQkJCQkJaWYgKGlzRm9ybWF0dGVyUGFyc2VyKSB7CisJCQkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShwcmV2aW91c0NoYXIpKSB7CisJCQkJCQkJCXRleHRFbmRQb3NpdGlvbiA9IHByZXZpb3VzUG9zaXRpb247CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICh0aGlzLmxpbmVTdGFydGVkICYmIGlzRG9tUGFyc2VyKSB7CisJCQkJCQkJdGV4dEVuZFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOworCQkJCQljYXNlICcvJzoKKwkJCQkJCWlmIChwcmV2aW91c0NoYXIgPT0gJyonKSB7CisJCQkJCQkJLy8gRW5kIG9mIGphdmFkb2MKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gZmFsbCB0aHJvdWdoIGRlZmF1bHQgY2FzZQogCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmIChpc0Zvcm1hdHRlclBhcnNlciAmJiBuZXh0Q2hhcmFjdGVyID09ICc8JykgeworCQkJCQkJCS8vIGh0bWwgdGFncyBhcmUgbWVhbmluZ2Z1bCBmb3IgZm9ybWF0dGVyIHBhcnNlcgorCQkJCQkJCWludCBpbml0aWFsSW5kZXggPSB0aGlzLmluZGV4OworCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuaW5kZXgsIHRoaXMuamF2YWRvY0VuZCk7CisJCQkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShwcmV2aW91c0NoYXIpKSB7CisJCQkJCQkJCXRleHRFbmRQb3NpdGlvbiA9IHByZXZpb3VzUG9zaXRpb247CisJCQkJCQkJfQorCQkJCQkJCWlmIChwYXJzZUh0bWxUYWcocHJldmlvdXNQb3NpdGlvbiwgdGV4dEVuZFBvc2l0aW9uKSkgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHRoaXMuYWJvcnQpIHJldHVybiBmYWxzZTsKKwkJCQkJCQkvLyBXcm9uZyBodG1sIHN5bnRheCBjb250aW51ZSB0byBwcm9jZXNzIGNoYXJhY3RlciBub3JtYWxseQorCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBpbml0aWFsSW5kZXg7CisJCQkJCQkJdGhpcy5pbmRleCA9IGluaXRpYWxJbmRleDsKKwkJCQkJCX0KIAkJCQkJCWlmICh2ZXJpZlRleHQgJiYgdGhpcy50YWdWYWx1ZSA9PSBUQUdfUkVUVVJOX1ZBTFVFICYmIHRoaXMucmV0dXJuU3RhdGVtZW50ICE9IG51bGwpIHsKIAkJCQkJCQlyZWZyZXNoUmV0dXJuU3RhdGVtZW50KCk7CiAJCQkJCQl9Ci0JCQkJCQlpZiAoIXRoaXMubGluZVN0YXJ0ZWQpIHsKKwkJCQkJCWlmICghdGhpcy5saW5lU3RhcnRlZCB8fCB0aGlzLnRleHRTdGFydCA9PSAtMSkgewogCQkJCQkJCXRoaXMudGV4dFN0YXJ0ID0gcHJldmlvdXNQb3NpdGlvbjsKIAkJCQkJCX0KIAkJCQkJCXRoaXMubGluZVN0YXJ0ZWQgPSB0cnVlOworCQkJCQkJdGV4dEVuZFBvc2l0aW9uID0gdGhpcy5pbmRleDsKIAkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KKwkJCXRoaXMuamF2YWRvY1RleHRFbmQgPSB0aGlzLnN0YXJQb3NpdGlvbi0xOworCiAJCQkvLyBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMjc5CiAJCQkvLyBDYW5ub3QgbGVhdmUgY29tbWVudCBpbnNpZGUgaW5saW5lIGNvbW1lbnQKIAkJCWlmICh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKLQkJCQl0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgPSBmYWxzZTsKIAkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewotCQkJCQlpbnQgZW5kID0gcHJldmlvdXNQb3NpdGlvbjxpbnZhbGlkSW5saW5lVGFnTGluZUVuZCA/IHByZXZpb3VzUG9zaXRpb24gOiBpbnZhbGlkSW5saW5lVGFnTGluZUVuZDsKKwkJCQkJaW50IGVuZCA9IHRoaXMuamF2YWRvY1RleHRFbmQ8aW52YWxpZElubGluZVRhZ0xpbmVFbmQgPyB0aGlzLmphdmFkb2NUZXh0RW5kIDogaW52YWxpZElubGluZVRhZ0xpbmVFbmQ7CiAJCQkJCWlmICh0aGlzLmluZGV4ID49IHRoaXMuamF2YWRvY0VuZCkgZW5kID0gaW52YWxpZElubGluZVRhZ0xpbmVFbmQ7CiAJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbnRlcm1pbmF0ZWRJbmxpbmVUYWcodGhpcy5pbmxpbmVUYWdTdGFydCwgZW5kKTsKIAkJCQl9Ci0JCQkJaWYgKHB1c2hUZXh0KSB7Ci0JCQkJCWlmICh0aGlzLmxpbmVTdGFydGVkICYmIHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDwgcHJldmlvdXNQb3NpdGlvbikgewotCQkJCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHByZXZpb3VzUG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihwcmV2aW91c1Bvc2l0aW9uKTsKKwkJCQlpZiAodGhpcy5saW5lU3RhcnRlZCAmJiB0aGlzLnRleHRTdGFydCAhPSAtMSAmJiB0aGlzLnRleHRTdGFydCA8IHRleHRFbmRQb3NpdGlvbikgeworCQkJCQlwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgdGV4dEVuZFBvc2l0aW9uKTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHB1c2hUZXh0ICYmIHRoaXMubGluZVN0YXJ0ZWQgJiYgdGhpcy50ZXh0U3RhcnQgPCBwcmV2aW91c1Bvc2l0aW9uKSB7Ci0JCQkJcHVzaFRleHQodGhpcy50ZXh0U3RhcnQsIHByZXZpb3VzUG9zaXRpb24pOworCQkJCXJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbih0ZXh0RW5kUG9zaXRpb24pOworCQkJCXNldElubGluZVRhZ1N0YXJ0ZWQoZmFsc2UpOworCQkJfSBlbHNlIGlmICh0aGlzLmxpbmVTdGFydGVkICYmIHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDw9IHRleHRFbmRQb3NpdGlvbiAmJiAodGhpcy50ZXh0U3RhcnQgPCB0aGlzLnN0YXJQb3NpdGlvbiB8fCB0aGlzLnN0YXJQb3NpdGlvbiA9PSBsYXN0U3RhclBvc2l0aW9uKSkgeworCQkJCXB1c2hUZXh0KHRoaXMudGV4dFN0YXJ0LCB0ZXh0RW5kUG9zaXRpb24pOwogCQkJfQogCQkJdXBkYXRlRG9jQ29tbWVudCgpOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKQEAgLTMzNiw2ICs0MjEsMTAgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGNyZWF0ZUFyZ3VtZW50UmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBpbnQgZGltLCBib29sZWFuIGlzVmFyYXJncywgT2JqZWN0IHR5cGVSZWYsIGxvbmdbXSBkaW1Qb3MsIGxvbmcgYXJnTmFtZVBvcykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVGYWtlUmVmZXJlbmNlKGludCBzdGFydCkgeworCQkvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwkJcmV0dXJuIHRydWU7CisJfQogCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgY3JlYXRlRmllbGRSZWZlcmVuY2UoT2JqZWN0IHJlY2VpdmVyKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwogCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgY3JlYXRlTWV0aG9kUmVmZXJlbmNlKE9iamVjdCByZWNlaXZlciwgTGlzdCBhcmd1bWVudHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247CiAJcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQoKSB7IHJldHVybiBudWxsOyB9CkBAIC0zNTcsNyArNDQ2LDcgQEAKIAkgKiB3aGVuIGxpbmVQdHIgZmllbGQgaXMgbm90IGluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgaW50IGdldExpbmVOdW1iZXIoaW50IHBvc2l0aW9uKSB7Ci0JCisKIAkJaWYgKHRoaXMuc2Nhbm5lci5saW5lUHRyICE9IC0xKSB7CiAJCQlyZXR1cm4gVXRpbC5nZXRMaW5lTnVtYmVyKHBvc2l0aW9uLCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKTsKIAkJfQpAQCAtMzczLDEyICs0NjIsMTIgQEAKIAkJCXJldHVybiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudFRva2VuVHlwZS4KIAkgKi8KIAlwcm90ZWN0ZWQgaW50IGdldEN1cnJlbnRUb2tlblR5cGUoKSB7Ci0JCXJldHVybiBjdXJyZW50VG9rZW5UeXBlOworCQlyZXR1cm4gdGhpcy5jdXJyZW50VG9rZW5UeXBlOwogCX0KIAogCS8qCkBAIC0zOTgsNyArNDg3LDcgQEAKIAkJbG9uZ1tdIGRpbVBvc2l0aW9ucyA9IG5ldyBsb25nWzIwXTsgLy8gYXNzdW1lIHRoYXQgdGhlcmUgd29uJ3QgYmUgbW9yZSB0aGFuIDIwIGRpbWVuc2lvbnMuLi4KIAkJY2hhcltdIG5hbWUgPSBudWxsOwogCQlsb25nIGFyZ05hbWVQb3MgPSAtMTsKLQkJCisKIAkJLy8gUGFyc2UgYXJndW1lbnRzIGRlY2xhcmF0aW9uIGlmIG1ldGhvZCByZWZlcmVuY2UKIAkJbmV4dEFyZyA6IHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uKSB7CiAKQEAgLTQ3NSw3ICs1NjQsNyBAQAogCQkJfSBlbHNlIGlmIChhcmdOYW1lICE9IG51bGwpIHsgLy8gdmVyaWZ5IHRoYXQgbm8gYXJndW1lbnQgbmFtZSBpcyBkZWNsYXJlZAogCQkJCWJyZWFrIG5leHRBcmc7CiAJCQl9Ci0JCQkKKwogCQkJLy8gVmVyaWZ5IHRva2VuIHBvc2l0aW9uCiAJCQlpZiAoZmlyc3RBcmcpIHsKIAkJCQltb2R1bG8gPSBpVG9rZW4gKyAxOwpAQCAtNTE4LDg2ICs2MDcsMTE5IEBACiAJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKIAl9CiAKKwkvKioKKwkgKiBQYXJzZSBhIHBvc3NpYmxlIEhUTUwgdGFnIGxpa2U6CisJICogPHVsPgorCSAqIAk8bGk+Jmx0O2NvZGUmZ3Q7CisJICogCTxsaT4mbHQ7YnImZ3Q7CisJICogCTxsaT4mbHQ7aD8mZ3Q7CisJICogPC91bD4KKwkgKgorCSAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nIQorCSAqCisJICogQHBhcmFtIHByZXZpb3VzUG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSAnPCcgY2hhcmFjdGVyIG9uIHdoaWNoIHRoZSB0YWcgbWlnaHQgc3RhcnQKKwkgKiBAcGFyYW0gZW5kVGV4dFBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyB0ZXh0CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHZhbGlkIGh0bWwgdGFnIGhhcyBiZWVuIHBhcnNlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogCW90aGVyd2lzZQorCSAqIEB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIElmIGFueSBwcm9ibGVtIGhhcHBlbnMgZHVyaW5nIHRoZSBwYXJzZSBpbiB0aGlzIGFyZWEKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUh0bWxUYWcoaW50IHByZXZpb3VzUG9zaXRpb24sIGludCBlbmRUZXh0UG9zaXRpb24pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJLyoKIAkgKiBQYXJzZSBhbiBVUkwgbGluayByZWZlcmVuY2UgaW4gQHNlZSB0YWcKIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VIcmVmKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWludCBzdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7Ci0JCWNoYXIgY3VycmVudENoYXIgPSByZWFkQ2hhcigpOwotCQlpZiAoY3VycmVudENoYXIgPT0gJ2EnIHx8IGN1cnJlbnRDaGFyID09ICdBJykgewotCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7Ci0JCQlpZiAocmVhZFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgewotCQkJCWNvbnN1bWVUb2tlbigpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSwgbmV3IGNoYXJbXXsnaCcsICdyJywgJ2UnLCAnZid9LCBmYWxzZSkgJiYKLQkJCQkJCXJlYWRUb2tlbigpID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVRVUFMKSB7Ci0JCQkJCQljb25zdW1lVG9rZW4oKTsKLQkJCQkJCWlmIChyZWFkVG9rZW4oKSA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTdHJpbmdMaXRlcmFsKSB7CisJcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VIcmVmKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gc2tpcENvbW1lbnRzID0gdGhpcy5zY2FubmVyLnNraXBDb21tZW50czsKKwkJdGhpcy5zY2FubmVyLnNraXBDb21tZW50cyA9IHRydWU7CisJCXRyeSB7CisJCQlpbnQgc3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOworCQkJY2hhciBjdXJyZW50Q2hhciA9IHJlYWRDaGFyKCk7CisJCQlpZiAoY3VycmVudENoYXIgPT0gJ2EnIHx8IGN1cnJlbnRDaGFyID09ICdBJykgeworCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSB0aGlzLmluZGV4OworCQkJCWlmIChyZWFkVG9rZW4oKSA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKSB7CisJCQkJCWNvbnN1bWVUb2tlbigpOworCQkJCQl0cnkgeworCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpLCBIUkVGX1RBRywgZmFsc2UpICYmCisJCQkJCQkJcmVhZFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRVFVQUwpIHsKIAkJCQkJCQljb25zdW1lVG9rZW4oKTsKLQkJCQkJCQkvLyBTa2lwIGFsbCBjaGFyYWN0ZXJzIGFmdGVyIHN0cmluZyBsaXRlcmFsIHVudGlsIGNsb3NpbmcgJz4nIChzZWUgYnVnIDY4NzI2KQotCQkJCQkJCXdoaWxlIChyZWFkVG9rZW4oKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVHUkVBVEVSKSB7Ci0JCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID49IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiB8fCB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnQCcgfHwKLQkJCQkJCQkJCSh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgJiYgdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ30nKSkgewotCQkJCQkJCQkJLy8gUmVzZXQgcG9zaXRpb246IHdlIHdhbnQgdG8gcmVzY2FuIGxhc3QgdG9rZW4KLQkJCQkJCQkJCXRoaXMuaW5kZXggPSB0aGlzLnRva2VuUHJldmlvdXNQb3NpdGlvbjsKLQkJCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSB0aGlzLnRva2VuUHJldmlvdXNQb3NpdGlvbjsKLQkJCQkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOwotCQkJCQkJCQkJLy8gU2lnbmFsIHN5bnRheCBlcnJvcgotCQkJCQkJCQkJaWYgKHRoaXMudGFnVmFsdWUgIT0gVEFHX1ZBTFVFX1ZBTFVFKSB7IC8vIGRvIG5vdCByZXBvcnQgZXJyb3IgZm9yIEB2YWx1ZSB0YWcsIHRoaXMgd2lsbCBiZSBkb25lIGFmdGVyLi4uCi0JCQkJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkU2VlVXJsUmVmZXJlbmNlKHN0YXJ0LCB0aGlzLmxpbmVFbmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOyAvLyBkbyBub3QgdXBkYXRlIGxpbmUgZW5kCi0JCQkJCQkJfQotCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRUb2tlblR5cGUgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUikgewotCQkJCQkJCQljb25zdW1lVG9rZW4oKTsgLy8gdXBkYXRlIGxpbmUgZW5kIGFzIG5ldyBsaW5lcyBhcmUgYWxsb3dlZCBpbiBVUkwgZGVzY3JpcHRpb24KLQkJCQkJCQkJd2hpbGUgKHJlYWRUb2tlbigpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MpIHsKLQkJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID49IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiB8fCB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnQCcgfHwKLQkJCQkJCQkJCQkodGhpcy5pbmxpbmVUYWdTdGFydGVkICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICd9JykpIHsKLQkJCQkJCQkJCQkvLyBSZXNldCBwb3NpdGlvbjogd2Ugd2FudCB0byByZXNjYW4gbGFzdCB0b2tlbgotCQkJCQkJCQkJCXRoaXMuaW5kZXggPSB0aGlzLnRva2VuUHJldmlvdXNQb3NpdGlvbjsKLQkJCQkJCQkJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy50b2tlblByZXZpb3VzUG9zaXRpb247Ci0JCQkJCQkJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7Ci0JCQkJCQkJCQkJLy8gU2lnbmFsIHN5bnRheCBlcnJvcgotCQkJCQkJCQkJCWlmICh0aGlzLnRhZ1ZhbHVlICE9IFRBR19WQUxVRV9WQUxVRSkgeyAvLyBkbyBub3QgcmVwb3J0IGVycm9yIGZvciBAdmFsdWUgdGFnLCB0aGlzIHdpbGwgYmUgZG9uZSBhZnRlci4uLgotCQkJCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRTZWVVcmxSZWZlcmVuY2Uoc3RhcnQsIHRoaXMubGluZUVuZCk7CisJCQkJCQkJaWYgKHJlYWRUb2tlbigpID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVN0cmluZ0xpdGVyYWwpIHsKKwkJCQkJCQkJY29uc3VtZVRva2VuKCk7CisJCQkJCQkJCXdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5qYXZhZG9jRW5kKSB7IC8vIG1haW4gbG9vcCB0byBzZWFyY2ggZm9yIHRoZSA8L2E+IHBhdHRlcm4KKwkJCQkJCQkJCS8vIFNraXAgYWxsIGNoYXJhY3RlcnMgYWZ0ZXIgc3RyaW5nIGxpdGVyYWwgdW50aWwgY2xvc2luZyAnPicgKHNlZSBidWcgNjg3MjYpCisJCQkJCQkJCQl3aGlsZSAocmVhZFRva2VuKCkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUikgeworCQkJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID49IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiB8fCB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnQCcgfHwKKwkJCQkJCQkJCQkJCSh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgJiYgdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ30nKSkgeworCQkJCQkJCQkJCQkvLyBSZXNldCBwb3NpdGlvbjogd2Ugd2FudCB0byByZXNjYW4gbGFzdCB0b2tlbgorCQkJCQkJCQkJCQl0aGlzLmluZGV4ID0gdGhpcy50b2tlblByZXZpb3VzUG9zaXRpb247CisJCQkJCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSB0aGlzLnRva2VuUHJldmlvdXNQb3NpdGlvbjsKKwkJCQkJCQkJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CisJCQkJCQkJCQkJCS8vIFNpZ25hbCBzeW50YXggZXJyb3IKKwkJCQkJCQkJCQkJaWYgKHRoaXMudGFnVmFsdWUgIT0gVEFHX1ZBTFVFX1ZBTFVFKSB7IC8vIGRvIG5vdCByZXBvcnQgZXJyb3IgZm9yIEB2YWx1ZSB0YWcsIHRoaXMgd2lsbCBiZSBkb25lIGFmdGVyLi4uCisJCQkJCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRTZWVIcmVmKHN0YXJ0LCB0aGlzLmxpbmVFbmQpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOyAvLyBjb25zdW1lIHRva2VuIHdpdGhvdXQgdXBkYXRpbmcgbGluZSBlbmQKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWNvbnN1bWVUb2tlbigpOyAvLyB1cGRhdGUgbGluZSBlbmQgYXMgbmV3IGxpbmVzIGFyZSBhbGxvd2VkIGluIFVSTCBkZXNjcmlwdGlvbgorCQkJCQkJCQkJd2hpbGUgKHJlYWRUb2tlbigpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MpIHsKKwkJCQkJCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gfHwgdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ0AnIHx8CisJCQkJCQkJCQkJCQkodGhpcy5pbmxpbmVUYWdTdGFydGVkICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICd9JykpIHsKKwkJCQkJCQkJCQkJLy8gUmVzZXQgcG9zaXRpb246IHdlIHdhbnQgdG8gcmVzY2FuIGxhc3QgdG9rZW4KKwkJCQkJCQkJCQkJdGhpcy5pbmRleCA9IHRoaXMudG9rZW5QcmV2aW91c1Bvc2l0aW9uOworCQkJCQkJCQkJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy50b2tlblByZXZpb3VzUG9zaXRpb247CisJCQkJCQkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOworCQkJCQkJCQkJCQkvLyBTaWduYWwgc3ludGF4IGVycm9yCisJCQkJCQkJCQkJCWlmICh0aGlzLnRhZ1ZhbHVlICE9IFRBR19WQUxVRV9WQUxVRSkgeyAvLyBkbyBub3QgcmVwb3J0IGVycm9yIGZvciBAdmFsdWUgdGFnLCB0aGlzIHdpbGwgYmUgZG9uZSBhZnRlci4uLgorCQkJCQkJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkU2VlSHJlZihzdGFydCwgdGhpcy5saW5lRW5kKTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWNvbnN1bWVUb2tlbigpOwogCQkJCQkJCQkJfQogCQkJCQkJCQkJY29uc3VtZVRva2VuKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY29uc3VtZVRva2VuKCk7Ci0JCQkJCQkJCXN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKLQkJCQkJCQkJaWYgKHJlYWRDaGFyKCkgPT0gJy8nKSB7CisJCQkJCQkJCQlzdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CiAJCQkJCQkJCQljdXJyZW50Q2hhciA9IHJlYWRDaGFyKCk7Ci0JCQkJCQkJCQlpZiAoY3VycmVudENoYXIgPT0gJ2EnIHx8IGN1cnJlbnRDaGFyID09ICdBJykgewotCQkJCQkJCQkJCWlmIChyZWFkQ2hhcigpID09ICc+JykgewotCQkJCQkJCQkJCQkvLyBWYWxpZCBocmVmCi0JCQkJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCQkJLy8gc2VhcmNoIGZvciB0aGUgPC9hPiBwYXR0ZXJuIGFuZCBzdG9yZSBsYXN0IGNoYXIgcmVhZAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyID09ICcvJykgeworCQkJCQkJCQkJCWN1cnJlbnRDaGFyID0gcmVhZENoYXIoKTsKKwkJCQkJCQkJCQlpZiAoY3VycmVudENoYXIgPT0gJ2EnIHx8IGN1cnJlbnRDaGFyID09J0EnKSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyID0gcmVhZENoYXIoKTsKKwkJCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyID09ICc+JykgeworCQkJCQkJCQkJCQkJcmV0dXJuIHRydWU7IC8vIHZhbGlkIGhyZWYKKwkJCQkJCQkJCQkJfQogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vIHNlYXJjaCBmb3IgaW52YWxpZCBjaGFyIGluIHRhZ3MKKwkJCQkJCQkJCWlmIChjdXJyZW50Q2hhciA9PSAnXHInIHx8IGN1cnJlbnRDaGFyID09ICdcbicgfHwgY3VycmVudENoYXIgPT0gJ1x0JyB8fCBjdXJyZW50Q2hhciA9PSAnICcpIHsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4KSB7CisJCQkJCQkvLyBEbyBub3RoaW5nIGFzIHdlIHdhbnQgdG8ga2VlcCBwb3NpdGlvbnMgZm9yIGVycm9yIG1lc3NhZ2UKIAkJCQkJfQotCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBEbyBub3RoaW5nIGFzIHdlIHdhbnQgdG8ga2VlcCBwb3NpdGlvbnMgZm9yIGVycm9yIG1lc3NhZ2UKIAkJCQl9CiAJCQl9CisJCQkvLyBSZXNldCBwb3NpdGlvbjogd2Ugd2FudCB0byByZXNjYW4gbGFzdCB0b2tlbgorCQkJdGhpcy5pbmRleCA9IHRoaXMudG9rZW5QcmV2aW91c1Bvc2l0aW9uOworCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMudG9rZW5QcmV2aW91c1Bvc2l0aW9uOworCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CisJCQkvLyBTaWduYWwgc3ludGF4IGVycm9yCisJCQlpZiAodGhpcy50YWdWYWx1ZSAhPSBUQUdfVkFMVUVfVkFMVUUpIHsgLy8gZG8gbm90IHJlcG9ydCBlcnJvciBmb3IgQHZhbHVlIHRhZywgdGhpcyB3aWxsIGJlIGRvbmUgYWZ0ZXIuLi4KKwkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRTZWVIcmVmKHN0YXJ0LCB0aGlzLmxpbmVFbmQpOworCQkJfQogCQl9Ci0JCS8vIFJlc2V0IHBvc2l0aW9uOiB3ZSB3YW50IHRvIHJlc2NhbiBsYXN0IHRva2VuCi0JCXRoaXMuaW5kZXggPSB0aGlzLnRva2VuUHJldmlvdXNQb3NpdGlvbjsKLQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMudG9rZW5QcmV2aW91c1Bvc2l0aW9uOwotCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJLy8gU2lnbmFsIHN5bnRheCBlcnJvcgotCQlpZiAodGhpcy50YWdWYWx1ZSAhPSBUQUdfVkFMVUVfVkFMVUUpIHsgLy8gZG8gbm90IHJlcG9ydCBlcnJvciBmb3IgQHZhbHVlIHRhZywgdGhpcyB3aWxsIGJlIGRvbmUgYWZ0ZXIuLi4KLQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFNlZVVybFJlZmVyZW5jZShzdGFydCwgdGhpcy5saW5lRW5kKTsKKwkJZmluYWxseSB7CisJCQl0aGlzLnNjYW5uZXIuc2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQkvKiAKKwkvKgogCSAqIFBhcnNlIHRhZyBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VJZGVudGlmaWVyVGFnKGJvb2xlYW4gcmVwb3J0KSB7CkBAIC02MjIsNyArNzQ0LDcgQEAKIAkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID0gLTE7CiAJCWludCBzdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CiAJCXRoaXMubWVtYmVyU3RhcnQgPSBzdGFydDsKLQkKKwogCQkvLyBHZXQgbWVtYmVyIGlkZW50aWZpZXIKIAkJaWYgKHJlYWRUb2tlbigpID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKIAkJCWlmICh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnLicpIHsgLy8gbWVtYmVyIG5hbWUgbWF5IGJlIHF1YWxpZmllZCAoaW5uZXIgY2xhc3MgY29uc3RydWN0b3IgcmVmZXJlbmNlKQpAQCAtNjQ3LDEyICs3NjksMTIgQEAKIAkJCQl9CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9Ci0JCisKIAkJCS8vIFJlc2V0IHBvc2l0aW9uOiB3ZSB3YW50IHRvIHJlc2NhbiBsYXN0IHRva2VuCiAJCQl0aGlzLmluZGV4ID0gcHJldmlvdXNQb3NpdGlvbjsKIAkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBwcmV2aW91c1Bvc2l0aW9uOwogCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7Ci0JCisKIAkJCS8vIFZlcmlmeSBjaGFyYWN0ZXIocykgYWZ0ZXIgaWRlbnRpZmllciAoZXhwZWN0aW5nIHNwYWNlIG9yIGVuZCBjb21tZW50KQogCQkJaWYgKCF2ZXJpZnlTcGFjZU9yRW5kQ29tbWVudCgpKSB7CiAJCQkJaW50IGVuZCA9IHRoaXMuc3RhclBvc2l0aW9uID09IC0xID8gdGhpcy5saW5lRW5kIDogdGhpcy5zdGFyUG9zaXRpb247CkBAIC02ODIsOTEgKzgwNCwyOCBAQAogCQlpbnQgZW5kID0gdGhpcy50YWdTb3VyY2VFbmQ7CiAJCWJvb2xlYW4gdG9rZW5XaGl0ZVNwYWNlID0gdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZTsKIAkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRydWU7Ci0JCQotCQkvLyBWZXJpZnkgdGhhdCB0aGVyZSBhcmUgd2hpdGVzcGFjZXMgYWZ0ZXIgdGFnCi0JCWJvb2xlYW4gaXNDb21wbGV0aW9uUGFyc2VyID0gKHRoaXMua2luZCAmIENPTVBMRVRJT05fUEFSU0VSKSAhPSAwOwotCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJyAnICYmICFTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlcikpIHsKLQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFRhZyhzdGFydCwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOwotCQkJaWYgKCFpc0NvbXBsZXRpb25QYXJzZXIpIHsKLQkJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gc3RhcnQ7Ci0JCQkJdGhpcy5pbmRleCA9IHN0YXJ0OworCisJCXRyeSB7CisJCQkvLyBWZXJpZnkgdGhhdCB0aGVyZSBhcmUgd2hpdGVzcGFjZXMgYWZ0ZXIgdGFnCisJCQlib29sZWFuIGlzQ29tcGxldGlvblBhcnNlciA9ICh0aGlzLmtpbmQgJiBDT01QTEVUSU9OX1BBUlNFUikgIT0gMDsKKwkJCWlmICh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciAhPSAnICcgJiYgIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFRhZyhzdGFydCwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOworCQkJCWlmICghaXNDb21wbGV0aW9uUGFyc2VyKSB7CisJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBzdGFydDsKKwkJCQkJdGhpcy5pbmRleCA9IHN0YXJ0OworCQkJCX0KKwkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9Ci0JCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCXRoaXMuc2Nhbm5lci50b2tlbml6ZVdoaXRlU3BhY2UgPSB0b2tlbldoaXRlU3BhY2U7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIEdldCBmaXJzdCBub24gd2hpdGVzcGFjZSB0b2tlbgotCQl0aGlzLmlkZW50aWZpZXJQdHIgPSAtMTsKLQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID0gLTE7Ci0JCWJvb2xlYW4gaGFzTXVsdGlMaW5lcyA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPiAodGhpcy5saW5lRW5kKzEpOwotCQlib29sZWFuIGlzVHlwZVBhcmFtID0gZmFsc2U7Ci0JCWJvb2xlYW4gdmFsaWQgPSB0cnVlLCBlbXB0eSA9IHRydWU7Ci0JCWJvb2xlYW4gbWF5QmVHZW5lcmljID0gdGhpcy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwotCQlpbnQgdG9rZW4gPSAtMTsKLQkJbmV4dFRva2VuOiB3aGlsZSAodHJ1ZSkgewotCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7Ci0JCQl0cnkgewotCQkJCXRva2VuID0gcmVhZFRva2VuKCk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHRva2VuKSB7Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyIDoKLQkJCQkJaWYgKHZhbGlkKSB7IAotCQkJCQkJLy8gc3RvcmUgcGFyYW0gbmFtZSBpZAotCQkJCQkJcHVzaElkZW50aWZpZXIodHJ1ZSwgZmFsc2UpOwotCQkJCQkJc3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwotCQkJCQkJZW5kID0gaGFzTXVsdGlMaW5lcyA/IHRoaXMubGluZUVuZDogdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7Ci0JCQkJCQlicmVhayBuZXh0VG9rZW47Ci0JCQkJCX0KLQkJCQkJLy8gZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1M6Ci0JCQkJCWlmICh2YWxpZCAmJiBtYXlCZUdlbmVyaWMpIHsKLQkJCQkJCS8vIHN0b3JlICc8JyBpbiBpZGVudGlmaWVycyBzdGFjayBhcyB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0YWcgZWxlbWVudCAoYnVnIDc5ODA5KQotCQkJCQkJcHVzaElkZW50aWZpZXIodHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQlzdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7Ci0JCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCWlzVHlwZVBhcmFtID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIG5leHRUb2tlbjsKLQkJCQkJfQotCQkJCQkvLyBmYWxsIHRocm91Z2ggbmV4dCBjYXNlIHRvIHJlcG9ydCBlcnJvcgotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRUZUX1NISUZUKSBpc1R5cGVQYXJhbSA9IHRydWU7Ci0JCQkJCWlmICh2YWxpZCAmJiAhaGFzTXVsdGlMaW5lcykgc3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwotCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQlpZiAoIWhhc011bHRpTGluZXMpIHsKLQkJCQkJCWVtcHR5ID0gZmFsc2U7Ci0JCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVuZCA9IHRoaXMubGluZUVuZDsKLQkJCQkJLy8gd2hlbiBzZXZlcmFsIGxpbmVzLCBmYWxsIHRocm91Z2ggbmV4dCBjYXNlIHRvIHJlcG9ydCBwcm9ibGVtIGltbWVkaWF0ZWx5Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgotCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA+ICh0aGlzLmxpbmVFbmQrMSkpIGhhc011bHRpTGluZXMgPSB0cnVlOwotCQkJCQlpZiAodmFsaWQpIGJyZWFrOwotCQkJCQkvLyBpZiBub3QgdmFsaWQgZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRjoKLQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpCi0JCQkJCQlpZiAoZW1wdHkpCi0JCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY01pc3NpbmdQYXJhbU5hbWUoc3RhcnQsIGVuZCwgdGhpcy5zb3VyY2VQYXJzZXIubW9kaWZpZXJzKTsKLQkJCQkJCWVsc2UgaWYgKG1heUJlR2VuZXJpYyAmJiBpc1R5cGVQYXJhbSkKLQkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFBhcmFtVHlwZVBhcmFtZXRlcihzdGFydCwgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFBhcmFtVGFnTmFtZShzdGFydCwgZW5kKTsKLQkJCQkJaWYgKCFpc0NvbXBsZXRpb25QYXJzZXIpIHsKLQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBzdGFydDsKLQkJCQkJCXRoaXMuaW5kZXggPSBzdGFydDsKLQkJCQkJfQotCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuV2hpdGVTcGFjZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQkvLyBTY2FuIG1vcmUgdG9rZW5zIGZvciB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbgotCQlpZiAoaXNUeXBlUGFyYW0gJiYgbWF5QmVHZW5lcmljKSB7Ci0JCQkvLyBHZXQgdHlwZSBwYXJhbWV0ZXIgbmFtZQorCisJCQkvLyBHZXQgZmlyc3Qgbm9uIHdoaXRlc3BhY2UgdG9rZW4KKwkJCXRoaXMuaWRlbnRpZmllclB0ciA9IC0xOworCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID0gLTE7CisJCQlib29sZWFuIGhhc011bHRpTGluZXMgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID4gKHRoaXMubGluZUVuZCsxKTsKKwkJCWJvb2xlYW4gaXNUeXBlUGFyYW0gPSBmYWxzZTsKKwkJCWJvb2xlYW4gdmFsaWQgPSB0cnVlLCBlbXB0eSA9IHRydWU7CisJCQlib29sZWFuIG1heUJlR2VuZXJpYyA9IHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJCWludCB0b2tlbiA9IC0xOwogCQkJbmV4dFRva2VuOiB3aGlsZSAodHJ1ZSkgewogCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOwogCQkJCXRyeSB7CkBAIC03NzUsMTEyICs4MzQsMTgxIEBACiAJCQkJCXZhbGlkID0gZmFsc2U7CiAJCQkJfQogCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgotCQkJCQkJaWYgKHZhbGlkICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPD0gKHRoaXMubGluZUVuZCsxKSkgYnJlYWs7Ci0JCQkJCQkvLyBpZiBub3QgdmFsaWQgZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0Y6Ci0JCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRQYXJhbVR5cGVQYXJhbWV0ZXIoc3RhcnQsIGVuZCk7Ci0JCQkJCQlpZiAoIWlzQ29tcGxldGlvblBhcnNlcikgewotCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBzdGFydDsKLQkJCQkJCQl0aGlzLmluZGV4ID0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCQkJCXRoaXMuc2Nhbm5lci50b2tlbml6ZVdoaXRlU3BhY2UgPSB0b2tlbldoaXRlU3BhY2U7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciA6Ci0JCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKIAkJCQkJCWlmICh2YWxpZCkgewogCQkJCQkJCS8vIHN0b3JlIHBhcmFtIG5hbWUgaWQKLQkJCQkJCQlwdXNoSWRlbnRpZmllcihmYWxzZSwgZmFsc2UpOworCQkJCQkJCXB1c2hJZGVudGlmaWVyKHRydWUsIGZhbHNlKTsKKwkJCQkJCQlzdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisJCQkJCQkJZW5kID0gaGFzTXVsdGlMaW5lcyA/IHRoaXMubGluZUVuZDogdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7CiAJCQkJCQkJYnJlYWsgbmV4dFRva2VuOwogCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIEdldCBsYXN0IGNoYXJhY3RlciBvZiB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbgotCQkJYm9vbGVhbiBzcGFjZXMgPSBmYWxzZTsKLQkJCW5leHRUb2tlbjogd2hpbGUgKHRydWUpIHsKLQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCQl0cnkgewotCQkJCQl0b2tlbiA9IHJlYWRUb2tlbigpOwotCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJfQotCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgotCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPiAodGhpcy5saW5lRW5kKzEpKSB7Ci0JCQkJCQkJLy8gZG8gbm90IGFjY2VwdCB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBvbiBzZXZlcmFsIGxpbmVzCi0JCQkJCQkJaGFzTXVsdGlMaW5lcyA9IHRydWU7Ci0JCQkJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTOgorCQkJCQkJaWYgKHZhbGlkICYmIG1heUJlR2VuZXJpYykgeworCQkJCQkJCS8vIHN0b3JlICc8JyBpbiBpZGVudGlmaWVycyBzdGFjayBhcyB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0YWcgZWxlbWVudCAoYnVnIDc5ODA5KQorCQkJCQkJCXB1c2hJZGVudGlmaWVyKHRydWUsIHRydWUpOworCQkJCQkJCXN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKKwkJCQkJCQlpc1R5cGVQYXJhbSA9IHRydWU7CisJCQkJCQkJYnJlYWsgbmV4dFRva2VuOwogCQkJCQkJfQotCQkJCQkJc3BhY2VzID0gdHJ1ZTsKKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRUZUX1NISUZUKSBpc1R5cGVQYXJhbSA9IHRydWU7CisJCQkJCQlpZiAodmFsaWQgJiYgIWhhc011bHRpTGluZXMpIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCQlpZiAoIWhhc011bHRpTGluZXMpIHsKKwkJCQkJCQllbXB0eSA9IGZhbHNlOworCQkJCQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZW5kID0gdGhpcy5saW5lRW5kOworCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSB3aGVuIHNldmVyYWwgbGluZXMsIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gcmVwb3J0IHByb2JsZW0gaW1tZWRpYXRlbHkKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPiAodGhpcy5saW5lRW5kKzEpKSBoYXNNdWx0aUxpbmVzID0gdHJ1ZTsKIAkJCQkJCWlmICh2YWxpZCkgYnJlYWs7Ci0JCQkJCQkvLyBpZiBub3QgdmFsaWQgZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byByZXBvcnQgZXJyb3IKKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gaWYgbm90IHZhbGlkIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gcmVwb3J0IGVycm9yCiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GOgotCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkUGFyYW1UeXBlUGFyYW1ldGVyKHN0YXJ0LCBlbmQpOworCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpCisJCQkJCQkJaWYgKGVtcHR5KQorCQkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZ1BhcmFtTmFtZShzdGFydCwgZW5kLCB0aGlzLnNvdXJjZVBhcnNlci5tb2RpZmllcnMpOworCQkJCQkJCWVsc2UgaWYgKG1heUJlR2VuZXJpYyAmJiBpc1R5cGVQYXJhbSkKKwkJCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRQYXJhbVR5cGVQYXJhbWV0ZXIoc3RhcnQsIGVuZCk7CisJCQkJCQkJZWxzZQorCQkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFBhcmFtVGFnTmFtZShzdGFydCwgZW5kKTsKIAkJCQkJCWlmICghaXNDb21wbGV0aW9uUGFyc2VyKSB7CiAJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHN0YXJ0OwogCQkJCQkJCXRoaXMuaW5kZXggPSBzdGFydDsKIAkJCQkJCX0KIAkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOwotCQkJCQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuV2hpdGVTcGFjZTsKIAkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVHUkVBVEVSOgotCQkJCQkJZW5kID0gaGFzTXVsdGlMaW5lcyA/IHRoaXMubGluZUVuZDogdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQkvLyBzdG9yZSAnPicgaW4gaWRlbnRpZmllcnMgc3RhY2sgYXMgd2UgbmVlZCB0byBhZGQgaXQgdG8gdGFnIGVsZW1lbnQgKGJ1ZyA3OTgwOSkKLQkJCQkJCQlwdXNoSWRlbnRpZmllcihmYWxzZSwgdHJ1ZSk7Ci0JCQkJCQkJYnJlYWsgbmV4dFRva2VuOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlpZiAoIXNwYWNlcykgZW5kID0gaGFzTXVsdGlMaW5lcyA/IHRoaXMubGluZUVuZDogdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7Ci0JCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQl9Ci0JCQotCQkvLyBWZXJpZnkgdGhhdCB0YWcgbmFtZSBpcyB3ZWxsIGZvbGxvd2VkIGJ5IHdoaXRlIHNwYWNlcwotCQlpZiAodmFsaWQpIHsKLQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOwotCQkJaW50IHJlc3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJdHJ5IHsKLQkJCQl0b2tlbiA9IHJlYWRUb2tlbigpOwotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQl2YWxpZCA9IGZhbHNlOworCisJCQkvLyBTY2FuIG1vcmUgdG9rZW5zIGZvciB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbgorCQkJaWYgKGlzVHlwZVBhcmFtICYmIG1heUJlR2VuZXJpYykgeworCQkJCS8vIEdldCB0eXBlIHBhcmFtZXRlciBuYW1lCisJCQkJbmV4dFRva2VuOiB3aGlsZSAodHJ1ZSkgeworCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXRva2VuID0gcmVhZFRva2VuKCk7CisJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQl9CisJCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRToKKwkJCQkJCQlpZiAodmFsaWQgJiYgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA8PSAodGhpcy5saW5lRW5kKzEpKSB7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQkvLyAkRkFMTC1USFJPVUdIJCAtIGlmIG5vdCB2YWxpZCBmYWxsIHRocm91Z2ggbmV4dCBjYXNlIHRvIHJlcG9ydCBlcnJvcgorCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0Y6CisJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkUGFyYW1UeXBlUGFyYW1ldGVyKHN0YXJ0LCBlbmQpOworCQkJCQkJCWlmICghaXNDb21wbGV0aW9uUGFyc2VyKSB7CisJCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBzdGFydDsKKwkJCQkJCQkJdGhpcy5pbmRleCA9IHN0YXJ0OworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgOgorCQkJCQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQkJCWlmICh2YWxpZCkgeworCQkJCQkJCQkvLyBzdG9yZSBwYXJhbSBuYW1lIGlkCisJCQkJCQkJCXB1c2hJZGVudGlmaWVyKGZhbHNlLCBmYWxzZSk7CisJCQkJCQkJCWJyZWFrIG5leHRUb2tlbjsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBHZXQgbGFzdCBjaGFyYWN0ZXIgb2YgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24KKwkJCQlib29sZWFuIHNwYWNlcyA9IGZhbHNlOworCQkJCW5leHRUb2tlbjogd2hpbGUgKHRydWUpIHsKKwkJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CisJCQkJCXRyeSB7CisJCQkJCQl0b2tlbiA9IHJlYWRUb2tlbigpOworCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0U6CisJCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPiAodGhpcy5saW5lRW5kKzEpKSB7CisJCQkJCQkJCS8vIGRvIG5vdCBhY2NlcHQgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gb24gc2V2ZXJhbCBsaW5lcworCQkJCQkJCQloYXNNdWx0aUxpbmVzID0gdHJ1ZTsKKwkJCQkJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQkJc3BhY2VzID0gdHJ1ZTsKKwkJCQkJCQlpZiAodmFsaWQpIGJyZWFrOworCQkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gaWYgbm90IHZhbGlkIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gcmVwb3J0IGVycm9yCisJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRjoKKwkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRQYXJhbVR5cGVQYXJhbWV0ZXIoc3RhcnQsIGVuZCk7CisJCQkJCQkJaWYgKCFpc0NvbXBsZXRpb25QYXJzZXIpIHsKKwkJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHN0YXJ0OworCQkJCQkJCQl0aGlzLmluZGV4ID0gc3RhcnQ7CisJCQkJCQkJfQorCQkJCQkJCXRoaXMuY3VycmVudFRva2VuVHlwZSA9IC0xOworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUjoKKwkJCQkJCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKKwkJCQkJCQlpZiAodmFsaWQpIHsKKwkJCQkJCQkJLy8gc3RvcmUgJz4nIGluIGlkZW50aWZpZXJzIHN0YWNrIGFzIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRhZyBlbGVtZW50IChidWcgNzk4MDkpCisJCQkJCQkJCXB1c2hJZGVudGlmaWVyKGZhbHNlLCB0cnVlKTsKKwkJCQkJCQkJYnJlYWsgbmV4dFRva2VuOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJaWYgKCFzcGFjZXMpIGVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CiAJCQl9Ci0JCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSkgewotCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSByZXN0YXJ0OwotCQkJCXRoaXMuaW5kZXggPSByZXN0YXJ0OwotCQkJCXRoaXMuc2Nhbm5lci50b2tlbml6ZVdoaXRlU3BhY2UgPSB0b2tlbldoaXRlU3BhY2U7Ci0JCQkJcmV0dXJuIHB1c2hQYXJhbU5hbWUoaXNUeXBlUGFyYW0pOworCisJCQkvLyBWZXJpZnkgdGhhdCB0YWcgbmFtZSBpcyB3ZWxsIGZvbGxvd2VkIGJ5IHdoaXRlIHNwYWNlcworCQkJaWYgKHZhbGlkKSB7CisJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CisJCQkJaW50IHJlc3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gcmVhZFRva2VuQW5kQ29uc3VtZSgpOworCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJfQorCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFKSB7CisJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHJlc3RhcnQsIHRoaXMuamF2YWRvY0VuZCk7CisJCQkJCXRoaXMuaW5kZXggPSByZXN0YXJ0OworCQkJCQlyZXR1cm4gcHVzaFBhcmFtTmFtZShpc1R5cGVQYXJhbSk7CisJCQkJfQogCQkJfQotCQl9Ci0JCQotCQkvLyBSZXBvcnQgcHJvYmxlbQotCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJaWYgKGlzQ29tcGxldGlvblBhcnNlcikgcmV0dXJuIGZhbHNlOwotCQllbmQgPSBoYXNNdWx0aUxpbmVzID8gdGhpcy5saW5lRW5kOiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJd2hpbGUgKCh0b2tlbj1yZWFkVG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSAmJiB0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKKwkJCS8vIFJlcG9ydCBwcm9ibGVtCiAJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJaWYgKGlzQ29tcGxldGlvblBhcnNlcikgcmV0dXJuIGZhbHNlOworCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHsKKwkJCQkvLyB3ZSBvbmx5IG5lZWQgZW5kIGlmIHdlIHJlcG9ydCBwcm9ibGVtcworCQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCXRyeSB7CisJCQkJCXdoaWxlICgodG9rZW49cmVhZFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0UgJiYgdG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKKwkJCQkJCWVuZCA9IGhhc011bHRpTGluZXMgPyB0aGlzLmxpbmVFbmQ6IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCQkJZW5kID0gdGhpcy5saW5lRW5kOworCQkJCX0KKwkJCQlpZiAobWF5QmVHZW5lcmljICYmIGlzVHlwZVBhcmFtKQorCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFBhcmFtVHlwZVBhcmFtZXRlcihzdGFydCwgZW5kKTsKKwkJCQllbHNlCisJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkUGFyYW1UYWdOYW1lKHN0YXJ0LCBlbmQpOworCQkJfQorCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHN0YXJ0OworCQkJdGhpcy5pbmRleCA9IHN0YXJ0OworCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQkvLyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgcmVzZXQgdG8gdGhlIHByZXZpb3VzIHZhbHVlIGV2ZW4gaWYgYW4gZXhjZXB0aW9uIG9jY3VycworCQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuV2hpdGVTcGFjZTsKIAkJfQotCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykKLQkJCWlmIChtYXlCZUdlbmVyaWMgJiYgaXNUeXBlUGFyYW0pCi0JCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRQYXJhbVR5cGVQYXJhbWV0ZXIoc3RhcnQsIGVuZCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRQYXJhbVRhZ05hbWUoc3RhcnQsIGVuZCk7Ci0JCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBzdGFydDsKLQkJdGhpcy5pbmRleCA9IHN0YXJ0OwotCQl0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSAtMTsKLQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuV2hpdGVTcGFjZTsKLQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qCkBAIC05MTUsMjMgKzEwNDMsNjIgQEAKIAkJCQkJY29uc3VtZVRva2VuKCk7CiAJCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV2b2lkIDoKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJvb2xlYW4gOgotCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnl0ZSA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjaGFyIDoKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRvdWJsZSA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdCA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbnQgOgotCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbG9uZyA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzaG9ydCA6Ci0JCQkJCWlmIChpVG9rZW4gPiAwKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVhYnN0cmFjdDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWFzc2VydDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJvb2xlYW46CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVicmVhazoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJ5dGU6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjYXNlOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2F0Y2g6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjaGFyOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2xhc3M6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjb250aW51ZToKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRlZmF1bHQ6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVkbzoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRvdWJsZToKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWVsc2U6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVleHRlbmRzOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZmFsc2U6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmaW5hbDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZpbmFsbHk6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZvcjoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWlmOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW1wbGVtZW50czoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWltcG9ydDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWluc3RhbmNlb2Y6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbnQ6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbnRlcmZhY2U6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVsb25nOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbmF0aXZlOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbmV3OgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbnVsbDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXBhY2thZ2U6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwcml2YXRlOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcHJvdGVjdGVkOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcHVibGljOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc2hvcnQ6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdGF0aWM6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdHJpY3RmcDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN1cGVyOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3dpdGNoOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3luY2hyb25pemVkOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhpczoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRocm93OgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJhbnNpZW50OgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ1ZToKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRyeToKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXZvaWQ6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV2b2xhdGlsZToKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXdoaWxlOgorCQkJCQlpZiAoaVRva2VuID09IDApIHsKKwkJCQkJCXB1c2hJZGVudGlmaWVyKHRydWUsIHRydWUpOworCQkJCQkJcHJpbWl0aXZlVG9rZW4gPSB0b2tlbjsKKwkJCQkJCWNvbnN1bWVUb2tlbigpOworCQkJCQkJYnJlYWsgbmV4dFRva2VuOwogCQkJCQl9Ci0JCQkJCXB1c2hJZGVudGlmaWVyKHRydWUsIGZhbHNlKTsKLQkJCQkJcHJpbWl0aXZlVG9rZW4gPSB0b2tlbjsKLQkJCQkJY29uc3VtZVRva2VuKCk7Ci0JCQkJCWJyZWFrIG5leHRUb2tlbjsKLQorCQkJCQkvLyBGYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlIHRvIHZlcmlmeSB0aGF0IHdlIGRvIG5vdCBsZWF2ZSBvbiBhIGRvdAorCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJZGVmYXVsdCA6CiAJCQkJCWlmIChpVG9rZW4gPT0gMCkgewogCQkJCQkJaWYgKHRoaXMuaWRlbnRpZmllclB0cj49MCkgewpAQCAtOTUzLDcgKzExMjAsNyBAQAogCQkJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHRoaXMudG9rZW5QcmV2aW91c1Bvc2l0aW9uOwogCQkJCQkJCQkJdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gLTE7CiAJCQkJCQkJCX0KLQkJCQkJCQkJLy8gZmFsbCB0aHJvdWdoIGRlZmF1bHQgY2FzZSB0byByYWlzZSBleGNlcHRpb24KKwkJCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlIHRvIHJhaXNlIGV4Y2VwdGlvbgogCQkJCQkJCWRlZmF1bHQ6CiAJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKIAkJCQkJCX0KQEAgLTk4MywxMyArMTE1MCwxMyBAQAogCQkJT2JqZWN0IHJlZmVyZW5jZSA9IG51bGw7CiAJCQlpbnQgcHJldmlvdXNQb3NpdGlvbiA9IC0xOwogCQkJaW50IHR5cGVSZWZTdGFydFBvc2l0aW9uID0gLTE7Ci0JCQkKKwogCQkJLy8gR2V0IHJlZmVyZW5jZSB0b2tlbnMKIAkJCW5leHRUb2tlbiA6IHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uKSB7CiAJCQkJcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCQkJaW50IHRva2VuID0gcmVhZFRva2VuU2FmZWx5KCk7CiAJCQkJc3dpdGNoICh0b2tlbikgewotCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCA6IC8vIEBzZWUgInN0cmluZyIKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTdHJpbmdMaXRlcmFsIDogLy8gQHNlZSAic3RyaW5nIgogCQkJCQkJLy8gSWYgdHlwZVJlZiAhPSBudWxsIHdlIG1heSByYWlzZSBhIHdhcm5pbmcgaGVyZSB0byBsZXQgdXNlciBrbm93IHRoZXJlJ3MgYW4gdW51c2VkIHJlZmVyZW5jZS4uLgogCQkJCQkJLy8gQ3VycmVudGx5IGFzIGphdmFkb2MgMS40LjIgaWdub3JlIGl0LCB3ZSBkbyB0aGUgc2FtZSAoc2VlIGJ1ZyA2OTMwMikKIAkJCQkJCWlmICh0eXBlUmVmICE9IG51bGwpIGJyZWFrIG5leHRUb2tlbjsKQEAgLTEwMDMsMTEgKzExNzAsMTEgQEAKIAogCQkJCQkJLy8gdmVyaWZ5IGVuZCBsaW5lCiAJCQkJCQlpZiAodmVyaWZ5RW5kTGluZShwcmV2aW91c1Bvc2l0aW9uKSkgewotCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCXJldHVybiBjcmVhdGVGYWtlUmVmZXJlbmNlKHN0YXJ0KTsKIAkJCQkJCX0KIAkJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRleHQodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiwgdGhpcy5saW5lRW5kKTsKIAkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTIDogLy8gQHNlZSAiPGEgaHJlZj0iVVJMI1ZhbHVlIj5sYWJlbDwvYT4KKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTIDogLy8gQHNlZSA8YSBocmVmPSJVUkwjVmFsdWUiPmxhYmVsPC9hPgogCQkJCQkJLy8gSWYgdHlwZVJlZiAhPSBudWxsIHdlIG1heSByYWlzZSBhIHdhcm5pbmcgaGVyZSB0byBsZXQgdXNlciBrbm93IHRoZXJlJ3MgYW4gdW51c2VkIHJlZmVyZW5jZS4uLgogCQkJCQkJLy8gQ3VycmVudGx5IGFzIGphdmFkb2MgMS40LjIgaWdub3JlIGl0LCB3ZSBkbyB0aGUgc2FtZSAoc2VlIGJ1ZyA2OTMwMikKIAkJCQkJCWlmICh0eXBlUmVmICE9IG51bGwpIGJyZWFrIG5leHRUb2tlbjsKQEAgLTEwMjEsNyArMTE4OCw5IEBACiAJCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCQl9CiAJCQkJCQkJLy8gdmVyaWZ5IGVuZCBsaW5lCi0JCQkJCQkJaWYgKHZlcmlmeUVuZExpbmUocHJldmlvdXNQb3NpdGlvbikpIHJldHVybiB0cnVlOworCQkJCQkJCWlmICh2ZXJpZnlFbmRMaW5lKHByZXZpb3VzUG9zaXRpb24pKSB7CisJCQkJCQkJCXJldHVybiBjcmVhdGVGYWtlUmVmZXJlbmNlKHN0YXJ0KTsKKwkJCQkJCQl9CiAJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbmV4cGVjdGVkVGV4dCh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLCB0aGlzLmxpbmVFbmQpOwogCQkJCQkJfQogCQkJCQkJZWxzZSBpZiAodGhpcy50YWdWYWx1ZSA9PSBUQUdfVkFMVUVfVkFMVUUpIHsKQEAgLTEwMzksNyArMTIwOCwyNSBAQAogCQkJCQkJfQogCQkJCQkJY2hhcltdIGN1cnJlbnRFcnJvciA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwogCQkJCQkJaWYgKGN1cnJlbnRFcnJvci5sZW5ndGg+MCAmJiBjdXJyZW50RXJyb3JbMF0gPT0gJyInKSB7Ci0JCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkUmVmZXJlbmNlKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIGdldFRva2VuRW5kUG9zaXRpb24oKSk7CisJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHsKKwkJCQkJCQkJYm9vbGVhbiBpc1VybFJlZiA9IGZhbHNlOworCQkJCQkJCQlpZiAodGhpcy50YWdWYWx1ZSA9PSBUQUdfU0VFX1ZBTFVFKSB7CisJCQkJCQkJCQlpbnQgbGVuZ3RoPWN1cnJlbnRFcnJvci5sZW5ndGgsIGk9MSAvKiBmaXJzdCBjaGFyIGlzICIgKi87CisJCQkJCQkJCQl3aGlsZSAoaTxsZW5ndGggJiYgU2Nhbm5lckhlbHBlci5pc0xldHRlcihjdXJyZW50RXJyb3JbaV0pKSB7CisJCQkJCQkJCQkJaSsrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKGk8KGxlbmd0aC0yKSAmJiBjdXJyZW50RXJyb3JbaV0gPT0gJzonICYmIGN1cnJlbnRFcnJvcltpKzFdID09ICcvJyAmJiBjdXJyZW50RXJyb3JbaSsyXSA9PSAnLycpIHsKKwkJCQkJCQkJCQlpc1VybFJlZiA9IHRydWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzVXJsUmVmKSB7CisJCQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NzY1CisJCQkJCQkJCQkvLyBoYW5kbGUgaW52YWxpZCBVUkwgcmVmZXJlbmNlcyBpbiBqYXZhZG9jIHdpdGggZGVkaWNhdGVkIG1lc3NhZ2UKKwkJCQkJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkU2VlVXJsUmVmZXJlbmNlKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIGdldFRva2VuRW5kUG9zaXRpb24oKSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFJlZmVyZW5jZSh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCBnZXRUb2tlbkVuZFBvc2l0aW9uKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQogCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrIG5leHRUb2tlbjsKQEAgLTEwNTAsNiArMTIzNyw3IEBACiAJCQkJCQkJaWYgKHRoaXMuYWJvcnQpIHJldHVybiBmYWxzZTsgLy8gTWF5IGJlIGFib3J0ZWQgYnkgc3BlY2lhbGl6ZWQgcGFyc2VyCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CisJCQkJCQlicmVhayBuZXh0VG9rZW47CiAJCQkJCWRlZmF1bHQgOgogCQkJCQkJYnJlYWsgbmV4dFRva2VuOwogCQkJCX0KQEAgLTEwODQsMTMgKzEyNzIsMjcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKLQkJCS8vIFZlcmlmeSB0aGF0IGxpbmUgZW5kIGRvZXMgbm90IHN0YXJ0IHdpdGggYW4gb3BlbiBwYXJlbnRoZXNlICh3aGljaCBjb3VsZCBiZSBhIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSB3cm9uZ2x5IHdyaXR0ZW4uLi4pCi0JCQkvLyBTZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NzIxNQotCQkJY2hhciBjaCA9IHBlZWtDaGFyKCk7Ci0JCQlpZiAoY2ggPT0gJygnKSB7Ci0JCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NNaXNzaW5nSGFzaENoYXJhY3Rlcih0eXBlUmVmU3RhcnRQb3NpdGlvbiwgdGhpcy5saW5lRW5kLCBTdHJpbmcudmFsdWVPZih0aGlzLnNvdXJjZSwgdHlwZVJlZlN0YXJ0UG9zaXRpb24sIHRoaXMubGluZUVuZC10eXBlUmVmU3RhcnRQb3NpdGlvbisxKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOworCQkJaW50IGN1cnJlbnRJbmRleCA9IHRoaXMuaW5kZXg7IC8vIHN0b3JlIGN1cnJlbnQgaW5kZXgKKwkJCWNoYXIgY2ggPSByZWFkQ2hhcigpOworCQkJc3dpdGNoIChjaCkgeworCQkJCS8vIFZlcmlmeSB0aGF0IGxpbmUgZW5kIGRvZXMgbm90IHN0YXJ0IHdpdGggYW4gb3BlbiBwYXJlbnRoZXNlICh3aGljaCBjb3VsZCBiZSBhIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSB3cm9uZ2x5IHdyaXR0ZW4uLi4pCisJCQkJLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDcyMTUKKwkJCQljYXNlICcoJyA6CisJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZ0hhc2hDaGFyYWN0ZXIodHlwZVJlZlN0YXJ0UG9zaXRpb24sIHRoaXMubGluZUVuZCwgU3RyaW5nLnZhbHVlT2YodGhpcy5zb3VyY2UsIHR5cGVSZWZTdGFydFBvc2l0aW9uLCB0aGlzLmxpbmVFbmQtdHlwZVJlZlN0YXJ0UG9zaXRpb24rMSkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJLy8gU2VhcmNoIGZvciB0aGUgOi8vIFVSTCBwYXR0ZXJuCisJCQkJLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4ODQ5CisJCQkJY2FzZSAnOicgOgorCQkJCQljaCA9IHJlYWRDaGFyKCk7CisJCQkJCWlmIChjaCA9PSAnLycgJiYgY2ggPT0gcmVhZENoYXIoKSkgeworCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHsKKwkJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFNlZVVybFJlZmVyZW5jZSh0eXBlUmVmU3RhcnRQb3NpdGlvbiwgdGhpcy5saW5lRW5kKTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KIAkJCX0KKwkJCS8vIHJldmVydCB0byBsYXN0IHN0b3JlZCBpbmRleAorCQkJdGhpcy5pbmRleCA9IGN1cnJlbnRJbmRleDsKIAogCQkJLy8gVmVyaWZ5IHRoYXQgd2UgZ2V0IHdoaXRlIHNwYWNlIGFmdGVyIHJlZmVyZW5jZQogCQkJaWYgKCF2ZXJpZnlTcGFjZU9yRW5kQ29tbWVudCgpKSB7CkBAIC0xMTAyLDcgKzEzMDQsNyBAQAogCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWFsZm9ybWVkU2VlUmVmZXJlbmNlKHR5cGVSZWZTdGFydFBvc2l0aW9uLCBlbmQpOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJCQorCiAJCQkvLyBFdmVyeXRoaW5nIGlzIE9LLCBzdG9yZSByZWZlcmVuY2UKIAkJCXJldHVybiBwdXNoU2VlUmVmKHJlZmVyZW5jZSk7CiAJCX0KQEAgLTEyMDEsNyArMTQwMywxNCBAQAogCXByb3RlY3RlZCB2b2lkIHB1c2hPbkFzdFN0YWNrKE9iamVjdCBub2RlLCBib29sZWFuIG5ld0xlbmd0aCkgewogCiAJCWlmIChub2RlID09IG51bGwpIHsKLQkJCXRoaXMuYXN0TGVuZ3RoU3RhY2tbKyt0aGlzLmFzdExlbmd0aFB0cl0gPSAwOworCQkJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFjay5sZW5ndGg7CisJCQlpZiAoKyt0aGlzLmFzdExlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMuYXN0TGVuZ3RoU3RhY2ssIDAsCisJCQkJCXRoaXMuYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgQVNUX1NUQUNLX0lOQ1JFTUVOVF0sIDAsCisJCQkJCXN0YWNrTGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdID0gMDsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0xMjU2LDcgKzE0NjUsNyBAQAogCSAqIFdhcm5pbmc6IHNjYW5uZXIgcG9zaXRpb24gaXMgdW5jaGFuZ2VkIHVzaW5nIHRoaXMgbWV0aG9kIQogCSAqLwogCXByb3RlY3RlZCBjaGFyIHJlYWRDaGFyKCkgewotCQorCiAJCWNoYXIgYyA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107CiAJCWlmIChjID09ICdcXCcgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJ3UnKSB7CiAJCQlpbnQgYzEsIGMyLCBjMywgYzQ7CkBAIC0xMzE1LDYgKzE1MjQsMjEgQEAKIAkJfQogCQlyZXR1cm4gdG9rZW47CiAJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVjb3JkSW5oZXJpdGVkUG9zaXRpb24obG9uZyBwb3NpdGlvbikgeworCQlpZiAodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPT0gbnVsbCkgeworCQkJdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPSBuZXcgbG9uZ1tJTkhFUklURURfUE9TSVRJT05TX0FSUkFZX0lOQ1JFTUVOVF07CisJCQl0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1B0ciA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnNQdHIgPT0gdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCXRoaXMuaW5oZXJpdGVkUG9zaXRpb25zLCAwLAorCQkJCQkJdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPSBuZXcgbG9uZ1t0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1B0ciArIElOSEVSSVRFRF9QT1NJVElPTlNfQVJSQVlfSU5DUkVNRU5UXSwgMCwKKwkJCQkJCXRoaXMuaW5oZXJpdGVkUG9zaXRpb25zUHRyKTsKKwkJCX0KKwkJfQorCQl0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1t0aGlzLmluaGVyaXRlZFBvc2l0aW9uc1B0cisrXSA9IHBvc2l0aW9uOworCX0KIAkKIAkvKgogCSAqIFJlZnJlc2ggc3RhcnQgcG9zaXRpb24gYW5kIGxlbmd0aCBvZiBhbiBpbmxpbmUgdGFnLgpAQCAtMTMzMCw2ICsxNTU0LDEzIEBACiAJCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAogCX0KIAorCS8qKgorCSAqIEBwYXJhbSBzdGFydGVkIHRoZSBpbmxpbmVUYWdTdGFydGVkIHRvIHNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldElubGluZVRhZ1N0YXJ0ZWQoYm9vbGVhbiBzdGFydGVkKSB7CisJCXRoaXMuaW5saW5lVGFnU3RhcnRlZCA9IHN0YXJ0ZWQ7CisJfQorCiAJLyoKIAkgKiBFbnRyeSBwb2ludCBmb3IgcmVjb3Zlcnkgb24gaW52YWxpZCBzeW50YXgKIAkgKi8KQEAgLTEzNDYsMzIgKzE1NzcsMzIgQEAKIAkJCXJldHVybiAiRU9GXG5cbiIgKyBuZXcgU3RyaW5nKHRoaXMuc291cmNlKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAoZW5kUG9zID4gdGhpcy5zb3VyY2UubGVuZ3RoKQogCQkJcmV0dXJuICJiZWhpbmQgdGhlIEVPRlxuXG4iICsgbmV3IFN0cmluZyh0aGlzLnNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCQljaGFyIGZyb250W10gPSBuZXcgY2hhcltzdGFydFBvc107CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zb3VyY2UsIDAsIGZyb250LCAwLCBzdGFydFBvcyk7Ci0JCisKIAkJaW50IG1pZGRsZUxlbmd0aCA9IChlbmRQb3MgLSAxKSAtIHN0YXJ0UG9zICsgMTsKIAkJY2hhciBtaWRkbGVbXTsKIAkJaWYgKG1pZGRsZUxlbmd0aCA+IC0xKSB7CiAJCQltaWRkbGUgPSBuZXcgY2hhclttaWRkbGVMZW5ndGhdOwogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLnNvdXJjZSwgCi0JCQkJc3RhcnRQb3MsIAotCQkJCW1pZGRsZSwgCi0JCQkJMCwgCisJCQkJdGhpcy5zb3VyY2UsCisJCQkJc3RhcnRQb3MsCisJCQkJbWlkZGxlLAorCQkJCTAsCiAJCQkJbWlkZGxlTGVuZ3RoKTsKIAkJfSBlbHNlIHsKIAkJCW1pZGRsZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAkJfQotCQkKKwogCQljaGFyIGVuZFtdID0gbmV3IGNoYXJbdGhpcy5zb3VyY2UubGVuZ3RoIC0gKGVuZFBvcyAtIDEpXTsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuc291cmNlLCAKLQkJCShlbmRQb3MgLSAxKSArIDEsIAotCQkJZW5kLCAKLQkJCTAsIAorCQkJdGhpcy5zb3VyY2UsCisJCQkoZW5kUG9zIC0gMSkgKyAxLAorCQkJZW5kLAorCQkJMCwKIAkJCXRoaXMuc291cmNlLmxlbmd0aCAtIChlbmRQb3MgLSAxKSAtIDEpOwotCQkKKwogCQlidWZmZXIuYXBwZW5kKGZyb250KTsKIAkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb248dGhpcy5pbmRleCkgewogCQkJYnVmZmVyLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5TY2FubmVyIGN1cnJlbnQgcG9zaXRpb24gaGVyZSAtLT4iKTsgLy8kTk9OLU5MUy0xJApAQCAtMTM5MCw3ICsxNjIxLDcgQEAKIAl9CiAKIAkvKgotCSAqIFVwZGF0ZSAKKwkgKiBVcGRhdGUKIAkgKi8KIAlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEb2NDb21tZW50KCk7CiAKQEAgLTE0MTAsNyArMTY0MSw3IEBACiAKIAkvKgogCSAqIFZlcmlmeSB0aGF0IGVuZCBvZiB0aGUgbGluZSBvbmx5IGNvbnRhaW5zIHNwYWNlIGNoYXJhY3RlcnMgb3IgZW5kIG9mIGNvbW1lbnQuCi0JICogTm90ZSB0aGF0IGVuZCBvZiBjb21tZW50IG1heSBiZSBwcmVjZWVkaW5nIGJ5IHNldmVyYWwgY29udGlndW91cyAnKicgY2hhcnMuCisJICogTm90ZSB0aGF0IGVuZCBvZiBjb21tZW50IG1heSBiZSBwcmVjZWRpbmcgYnkgc2V2ZXJhbCBjb250aWd1b3VzICcqJyBjaGFycy4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlFbmRMaW5lKGludCB0ZXh0UG9zaXRpb24pIHsKIAkJYm9vbGVhbiBkb21QYXJzZXIgPSAodGhpcy5raW5kICYgRE9NX1BBUlNFUikgIT0gMDsKQEAgLTE0MjYsNyArMTY1Nyw3IEBACiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJCisKIAkJaW50IHN0YXJ0UG9zaXRpb24gPSB0aGlzLmluZGV4OwogCQlpbnQgcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCXRoaXMuc3RhclBvc2l0aW9uID0gLTE7CkBAIC0xNDUwLDE3ICsxNjgxLDE4IEBACiAJCQkJCXRoaXMuc3RhclBvc2l0aW9uID0gcHJldmlvdXNQb3NpdGlvbjsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnLyc6Ci0JCQkJCWlmICh0aGlzLnN0YXJQb3NpdGlvbiA+PSB0ZXh0UG9zaXRpb24pIHsKKwkJCQkJaWYgKHRoaXMuc3RhclBvc2l0aW9uID49IHRleHRQb3NpdGlvbikgeyAvLyB2YWxpZCBvbmx5IGlmIGEgc3RhciB3YXMgdGhlIHByZXZpb3VzIGNoYXJhY3RlcgogCQkJCQkJaWYgKGRvbVBhcnNlcikgewogCQkJCQkJCWNyZWF0ZVRhZygpOwogCQkJCQkJCXB1c2hUZXh0KHRleHRQb3NpdGlvbiwgdGhpcy5zdGFyUG9zaXRpb24pOwogCQkJCQkJfQogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCX0KKwkJCQkJYnJlYWsgbmV4dENoYXI7CiAJCQkJZGVmYXVsdCA6CiAJCQkJCS8vIGxlYXZlIGxvb3AKIAkJCQkJYnJlYWsgbmV4dENoYXI7Ci0JCQkJCisKIAkJCX0KIAkJCXByZXZpb3VzUG9zaXRpb24gPSB0aGlzLmluZGV4OwogCQkJY2ggPSByZWFkQ2hhcigpOwpAQCAtMTQ3Nyw2ICsxNzA5LDcgQEAKIAkgKiAJICAgIGZvdW5kIGJlZm9yZSB0aGUgbGFzdCBzbGFzaCAoJy8nKSBjaGFyYWN0ZXIpLgogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVNwYWNlT3JFbmRDb21tZW50KCkgeworCQl0aGlzLnN0YXJQb3NpdGlvbiA9IC0xOwogCQlpbnQgc3RhcnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCS8vIFdoaXRlc3BhY2Ugb3IgaW5saW5lIHRhZyBjbG9zaW5nIGJyYWNlCiAJCWNoYXIgY2ggPSBwZWVrQ2hhcigpOwpAQCAtMTQ5MCw3ICsxNzIzLDYgQEAKIAkJfQogCQkvLyBFbmQgb2YgY29tbWVudAogCQlpbnQgcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7Ci0JCXRoaXMuc3RhclBvc2l0aW9uID0gLTE7CiAJCWNoID0gcmVhZENoYXIoKTsKIAkJd2hpbGUgKHRoaXMuaW5kZXg8dGhpcy5zb3VyY2UubGVuZ3RoKSB7CiAJCQlzd2l0Y2ggKGNoKSB7CkBAIC0xNDk5LDE0ICsxNzMxLDE1IEBACiAJCQkJCXRoaXMuc3RhclBvc2l0aW9uID0gcHJldmlvdXNQb3NpdGlvbjsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnLyc6Ci0JCQkJCWlmICh0aGlzLnN0YXJQb3NpdGlvbiA+PSBzdGFydFBvc2l0aW9uKSB7IC8vIHZhbGlkIG9ubHkgaWYgYSBzdGFyIHdhcyBwcmV2aW91cyBjaGFyYWN0ZXIKKwkJCQkJaWYgKHRoaXMuc3RhclBvc2l0aW9uID49IHN0YXJ0UG9zaXRpb24pIHsgLy8gdmFsaWQgb25seSBpZiBhIHN0YXIgd2FzIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIKIAkJCQkJCXJldHVybiB0cnVlOwogCQkJCQl9CisJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gZmFsbCB0aHJvdWdoIHRvIGludmFsaWQgY2FzZQogCQkJCWRlZmF1bHQgOgogCQkJCQkvLyBpbnZhbGlkIHdoYXRldmVyIG90aGVyIGNoYXJhY3RlciwgZXZlbiB3aGl0ZSBzcGFjZXMKIAkJCQkJdGhpcy5pbmRleCA9IHN0YXJ0UG9zaXRpb247CiAJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkKKwogCQkJfQogCQkJcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CiAJCQljaCA9IHJlYWRDaGFyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL0phdmFkb2NQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCmluZGV4IDlmZWQ0YTIuLmI3MjkzMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1BhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDcgKzI1LDcgQEAKIAogCS8vIFB1YmxpYyBmaWVsZHMKIAlwdWJsaWMgSmF2YWRvYyBkb2NDb21tZW50OwotCQorCiAJLy8gYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTYwMAogCS8vIFN0b3JlIHBhcmFtIHJlZmVyZW5jZXMgZm9yIHRhZyB3aXRoIGludmFsaWQgc3ludGF4CiAJcHJpdmF0ZSBpbnQgaW52YWxpZFBhcmFtUmVmZXJlbmNlc1B0ciA9IC0xOwpAQCAtMzUsMTQgKzM1LDI1IEBACiAJLy8gU3RvcmUgdmFsdWUgdGFnIHBvc2l0aW9ucwogCXByaXZhdGUgbG9uZyB2YWxpZFZhbHVlUG9zaXRpb25zLCBpbnZhbGlkVmFsdWVQb3NpdGlvbnM7CiAKKwkvLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBKYXZhZG9jUGFyc2VyIHNob3VsZCByZXBvcnQgZXJyb3JzIG9yIG5vdCAob3ZlcnJpZGVzIHJlcG9ydFByb2JsZW1zKQorCS8vIHNlZSAiaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjQ0OSIKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXBvcnRQcm9ibGVtcyA9IHRydWU7CisJCisJLy8gZmxhZyB0byBsZXQgdGhlIHBhcnNlciBrbm93IHRoYXQgdGhlIGN1cnJlbnQgdGFnIGlzIHdhaXRpbmcgZm9yIGEgZGVzY3JpcHRpb24KKwkvLyBzZWUgImh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjI5MDAiCisJcHJpdmF0ZSBpbnQgdGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uOworCiAJcHVibGljIEphdmFkb2NQYXJzZXIoUGFyc2VyIHNvdXJjZVBhcnNlcikgewogCQlzdXBlcihzb3VyY2VQYXJzZXIpOwogCQl0aGlzLmtpbmQgPSBDT01QSUxfUEFSU0VSIHwgVEVYVF9WRVJJRjsKKwkJaWYgKHNvdXJjZVBhcnNlciAhPSBudWxsICYmIHNvdXJjZVBhcnNlci5vcHRpb25zICE9IG51bGwpIHsKKwkJCXRoaXMuc2V0SmF2YWRvY1Bvc2l0aW9ucyA9IHNvdXJjZVBhcnNlci5vcHRpb25zLnByb2Nlc3NBbm5vdGF0aW9uczsKKwkJfQogCX0KIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGFnIEBkZXByZWNhdGVkIGlzIHByZXNlbnQgaW4gamF2YWRvYyBjb21tZW50LgotCSAqIAorCSAqCiAJICogSWYgamF2YWRvYyBjaGVja2luZyBpcyBlbmFibGVkLCB3aWxsIGFsc28gY29uc3RydWN0IGFuIEphdmFkb2Mgbm9kZSwgd2hpY2ggd2lsbCBiZSBzdG9yZWQgaW50byBQYXJzZXIuamF2YWRvYwogCSAqIHNsb3QgZm9yIGJlaW5nIGNvbnN1bWVkIGxhdGVyIG9uLgogCSAqLwpAQCAtNTQsMTQgKzY1LDIxIEBACiAJCXRoaXMuZmlyc3RUYWdQb3NpdGlvbiA9IHRoaXMuc291cmNlUGFyc2VyLnNjYW5uZXIuY29tbWVudFRhZ1N0YXJ0c1tjb21tZW50UHRyXTsKIAkJdGhpcy52YWxpZFZhbHVlUG9zaXRpb25zID0gLTE7CiAJCXRoaXMuaW52YWxpZFZhbHVlUG9zaXRpb25zID0gLTE7CisJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gTk9fVEFHX1ZBTFVFOwogCiAJCS8vIEluaXQgamF2YWRvYyBpZiBuZWNlc3NhcnkKIAkJaWYgKHRoaXMuY2hlY2tEb2NDb21tZW50KSB7Ci0JCQl0aGlzLmRvY0NvbW1lbnQgPSBuZXcgSmF2YWRvYyhqYXZhZG9jU3RhcnQsIGphdmFkb2NFbmQpOworCQkJdGhpcy5kb2NDb21tZW50ID0gbmV3IEphdmFkb2ModGhpcy5qYXZhZG9jU3RhcnQsIHRoaXMuamF2YWRvY0VuZCk7CisJCX0gZWxzZSBpZiAodGhpcy5zZXRKYXZhZG9jUG9zaXRpb25zKSB7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5NDU5CisJCQkvLyBpZiBhbm5vdGF0aW9uIHByb2Nlc3NvcnMgYXJlIHRoZXJlLCBqYXZhZG9jIG9iamVjdCBpcyByZXF1aXJlZCBidXQKKwkJCS8vIHRoZXkgbmVlZCBub3QgYmUgcmVzb2x2ZWQKKwkJCXRoaXMuZG9jQ29tbWVudCA9IG5ldyBKYXZhZG9jKHRoaXMuamF2YWRvY1N0YXJ0LCB0aGlzLmphdmFkb2NFbmQpOworCQkJdGhpcy5kb2NDb21tZW50LmJpdHMgJj0gfkFTVE5vZGUuUmVzb2x2ZUphdmFkb2M7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmRvY0NvbW1lbnQgPSBudWxsOwogCQl9Ci0JCQorCiAJCS8vIElmIHRoZXJlJ3Mgbm8gdGFnIGluIGphdmFkb2MsIHJldHVybiB3aXRob3V0IHBhcnNpbmcgaXQKIAkJaWYgKHRoaXMuZmlyc3RUYWdQb3NpdGlvbiA9PSAwKSB7CiAJCQlzd2l0Y2ggKHRoaXMua2luZCAmIFBBUlNFUl9LSU5EKSB7CkBAIC04MSwyMiArOTksMjIgQEAKIAkJCQl0aGlzLmxpbmVFbmRzID0gdGhpcy5zY2FubmVyLmxpbmVFbmRzOwogCQkJCWNvbW1lbnRQYXJzZSgpOwogCQkJfSBlbHNlIHsKLQkJCQkKKwogCQkJCS8vIFBhcnNlIGNvbW1lbnQKIAkJCQlTY2FubmVyIHNvdXJjZVNjYW5uZXIgPSB0aGlzLnNvdXJjZVBhcnNlci5zY2FubmVyOwotCQkJCWludCBmaXJzdExpbmVOdW1iZXIgPSBVdGlsLmdldExpbmVOdW1iZXIoamF2YWRvY1N0YXJ0LCBzb3VyY2VTY2FubmVyLmxpbmVFbmRzLCAwLCBzb3VyY2VTY2FubmVyLmxpbmVQdHIpOwotCQkJCWludCBsYXN0TGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcihqYXZhZG9jRW5kLCBzb3VyY2VTY2FubmVyLmxpbmVFbmRzLCAwLCBzb3VyY2VTY2FubmVyLmxpbmVQdHIpOwotCQkJCXRoaXMuaW5kZXggPSBqYXZhZG9jU3RhcnQgKzM7Ci0JCisJCQkJaW50IGZpcnN0TGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcih0aGlzLmphdmFkb2NTdGFydCwgc291cmNlU2Nhbm5lci5saW5lRW5kcywgMCwgc291cmNlU2Nhbm5lci5saW5lUHRyKTsKKwkJCQlpbnQgbGFzdExpbmVOdW1iZXIgPSBVdGlsLmdldExpbmVOdW1iZXIodGhpcy5qYXZhZG9jRW5kLCBzb3VyY2VTY2FubmVyLmxpbmVFbmRzLCAwLCBzb3VyY2VTY2FubmVyLmxpbmVQdHIpOworCQkJCXRoaXMuaW5kZXggPSB0aGlzLmphdmFkb2NTdGFydCArMzsKKwogCQkJCS8vIHNjYW4gbGluZSBwZXIgbGluZSwgc2luY2UgdGFncyBtdXN0IGJlIGF0IGJlZ2lubmluZyBvZiBsaW5lcyBvbmx5CiAJCQkJdGhpcy5kZXByZWNhdGVkID0gZmFsc2U7CiAJCQkJbmV4dExpbmUgOiBmb3IgKGludCBsaW5lID0gZmlyc3RMaW5lTnVtYmVyOyBsaW5lIDw9IGxhc3RMaW5lTnVtYmVyOyBsaW5lKyspIHsKIAkJCQkJaW50IGxpbmVTdGFydCA9IGxpbmUgPT0gZmlyc3RMaW5lTnVtYmVyCi0JCQkJCQkJPyBqYXZhZG9jU3RhcnQgKyAzIC8vIHNraXAgbGVhZGluZyAvKioKKwkJCQkJCQk/IHRoaXMuamF2YWRvY1N0YXJ0ICsgMyAvLyBza2lwIGxlYWRpbmcgLyoqCiAJCQkJCQkJOiB0aGlzLnNvdXJjZVBhcnNlci5zY2FubmVyLmdldExpbmVTdGFydChsaW5lKTsKIAkJCQkJdGhpcy5pbmRleCA9IGxpbmVTdGFydDsKIAkJCQkJdGhpcy5saW5lRW5kID0gbGluZSA9PSBsYXN0TGluZU51bWJlcgotCQkJCQkJCT8gamF2YWRvY0VuZCAtIDIgLy8gcmVtb3ZlIHRyYWlsaW5nICogLworCQkJCQkJCT8gdGhpcy5qYXZhZG9jRW5kIC0gMiAvLyByZW1vdmUgdHJhaWxpbmcgKiAvCiAJCQkJCQkJOiB0aGlzLnNvdXJjZVBhcnNlci5zY2FubmVyLmdldExpbmVFbmQobGluZSk7CiAJCQkJCW5leHRDaGFyYWN0ZXIgOiB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMubGluZUVuZCkgewogCQkJCQkJY2hhciBjID0gcmVhZENoYXIoKTsgLy8gY29uc2lkZXIgdW5pY29kZXMKQEAgLTE4OCw3ICsyMDYsNyBAQAogCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKFR5cGVSZWZlcmVuY2UpIHJlY2VpdmVyOwogCQkJLy8gRGVjaWRlIHdoZXRoZXIgd2UgaGF2ZSBhIGNvbnN0cnVjdG9yIG9yIG5vdAogCQkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCQlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbMF07CS8vIG1heSBiZSA+IDAgZm9yIG1lbWJlciBjbGFzcyBjb25zdHJ1Y3RvciByZWZlcmVuY2UKKwkJCWludCBsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1swXTsJLy8gbWF5IGJlID4gMSBmb3IgbWVtYmVyIGNsYXNzIGNvbnN0cnVjdG9yIHJlZmVyZW5jZQogCQkJaWYgKHR5cGVSZWYgPT0gbnVsbCkgewogCQkJCWNoYXJbXSBuYW1lID0gdGhpcy5zb3VyY2VQYXJzZXIuY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpOwogCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IGdldFBhcnNlZFR5cGVEZWNsYXJhdGlvbigpOwpAQCAtMzMxLDYgKzM0OSwxNSBAQAogCX0KIAogCS8qCisJICogUGFyc2UgQHRocm93cyB0YWcgZGVjbGFyYXRpb24gYW5kIGZsYWcgbWlzc2luZyBkZXNjcmlwdGlvbiBpZiBjb3JyZXNwb25kaW5nIG9wdGlvbiBpcyBlbmFibGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VUaHJvd3MoKSB7CisJCWJvb2xlYW4gdmFsaWQgPSBzdXBlci5wYXJzZVRocm93cygpOworCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IHZhbGlkICYmIHRoaXMucmVwb3J0UHJvYmxlbXMgPyBUQUdfVEhST1dTX1ZBTFVFIDogTk9fVEFHX1ZBTFVFOworCQlyZXR1cm4gdmFsaWQ7CisJfQorCisJLyoKIAkgKiBQYXJzZSBAcmV0dXJuIHRhZyBkZWNsYXJhdGlvbgogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIHBhcnNlUmV0dXJuKCkgewpAQCAtMzQ4LDcgKzM3NSw3IEBACiAKIAogCXByb3RlY3RlZCB2b2lkIHBhcnNlU2ltcGxlVGFnKCkgewotCQkKKwogCQkvLyBSZWFkIGZpcnN0IGNoYXIKIAkJLy8gcmVhZENoYXIoKSBjb2RlIGlzIGlubGluZWQgdG8gYmFsYW5jZSBhZGRpdGlvbmFsIG1ldGhvZCBjYWxsIGluIGNoZWNrRGVwcmVjdGF0aW9uKGludCkKIAkJY2hhciBmaXJzdCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107CkBAIC0zODgsMjE3ICs0MTUsMjk3IEBACiAJfQogCiAJcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VUYWcoaW50IHByZXZpb3VzUG9zaXRpb24pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCi0JCS8vIFJlYWQgdGFnIG5hbWUKLQkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7Ci0JCWludCB0b2tlbiA9IHJlYWRUb2tlbkFuZENvbnN1bWUoKTsKLQkJaWYgKGN1cnJlbnRQb3NpdGlvbiAhPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbikgewotCQkJdGhpcy50YWdTb3VyY2VTdGFydCA9IHByZXZpb3VzUG9zaXRpb247Ci0JCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IGN1cnJlbnRQb3NpdGlvbjsKLQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFRhZyh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uKSB7Ci0JCQl0aGlzLnRhZ1NvdXJjZVN0YXJ0ID0gcHJldmlvdXNQb3NpdGlvbjsKLQkJCXRoaXMudGFnU291cmNlRW5kID0gdGhpcy50b2tlblByZXZpb3VzUG9zaXRpb247Ci0JCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMudGFnU291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwotCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOwotCQljaGFyW10gdGFnTmFtZSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwotCQotCQkvLyBUcnkgdG8gZ2V0IHRhZyBuYW1lIG90aGVyIHRoYW4gamF2YSBpZGVudGlmaWVyCi0JCS8vIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTY2MCkKLQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyICE9ICcgJyAmJiAhU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIpKSB7Ci0JCQlib29sZWFuIHZhbGlkVGFnID0gdHJ1ZTsKLQkJCXRhZ05hbWVUb2tlbjogd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRiAmJiB0aGlzLmluZGV4IDwgdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uKSB7Ci0JCQkJaW50IGxlbmd0aCA9IHRhZ05hbWUubGVuZ3RoOwotCQkJCS8vICEsICIsICMsICUsICYsICcsIC0sIDosIDwsID4sICogY2hhcnMgYW5kIHNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGFnIG5hbWVzCi0JCQkJc3dpdGNoICh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlcikgewotCQkJCQljYXNlICd9JzoKLQkJCQkJY2FzZSAnKic6IC8vIGJyZWFrIGZvciAnKicgYXMgdGhpcyBpcyBwZXJoYXBzIHRoZSBlbmQgb2YgY29tbWVudCAoYnVnIDY1Mjg4KQotCQkJCQkJYnJlYWsgdGFnTmFtZVRva2VuOwotCQkJCQljYXNlICchJzoKLQkJCQkJY2FzZSAnIyc6Ci0JCQkJCWNhc2UgJyUnOgotCQkJCQljYXNlICcmJzoKLQkJCQkJY2FzZSAnXCcnOgotCQkJCQljYXNlICciJzoKLQkJCQkJY2FzZSAnOic6Ci0JCQkJCWNhc2UgJzwnOgotCQkJCQljYXNlICc+JzoKLQkJCQkJY2FzZSAnQCc6Ci0JCQkJCQl2YWxpZFRhZyA9IGZhbHNlOwotCQkJCQkJdGhpcy50YWdTb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCXRoaXMuaW5kZXggPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJy0nOiAvLyBhbGxvd2VkIGluIHRhZyBuYW1lcyBhcyB0aGlzIGNoYXJhY3RlciBpcyBvZnRlbiB1c2VkIGluIGRvY2xldHMgKGJ1ZyA2ODA4NykKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGFnTmFtZSwgMCwgdGFnTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCsxXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCXRhZ05hbWVbbGVuZ3RoXSA9IHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyOwotCQkJCQkJdGhpcy50YWdTb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCXRoaXMuaW5kZXggPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnIHx8IFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyKSkgewotCQkJCQkJCWJyZWFrIHRhZ05hbWVUb2tlbjsKLQkJCQkJCX0KLQkJCQkJCXRva2VuID0gcmVhZFRva2VuQW5kQ29uc3VtZSgpOwotCQkJCQkJY2hhcltdIGlkZW50ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRhZ05hbWUsIDAsIHRhZ05hbWUgPSBuZXcgY2hhcltsZW5ndGgraWRlbnQubGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaWRlbnQsIDAsIHRhZ05hbWUsIGxlbmd0aCwgaWRlbnQubGVuZ3RoKTsKLQkJCQkJCXRoaXMudGFnU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7Ci0JCQl9Ci0JCQlpZiAoIXZhbGlkVGFnKSB7Ci0JCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NJbnZhbGlkVGFnKHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaW50IGxlbmd0aCA9IHRhZ05hbWUubGVuZ3RoOwotCQlpZiAobGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsgLy8gbWF5IGhhcHBlbiBmb3Igc29tZSBwYXJzZXIgKGNvbXBsZXRpb24gZm9yIGV4YW1wbGUpCi0JCXRoaXMuaW5kZXggPSB0aGlzLnRhZ1NvdXJjZUVuZCsxOwotCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy50YWdTb3VyY2VFbmQrMTsKLQkKLQkJLy8gRGVjaWRlIHdoaWNoIHBhcnNlIHRvIHBlcmZvcm0gZGVwZW5kaW5nIG9uIHRhZyBuYW1lCi0JCXRoaXMudGFnVmFsdWUgPSBOT19UQUdfVkFMVUU7Ci0JCXN3aXRjaCAodG9rZW4pIHsKLQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciA6Ci0JCQkJc3dpdGNoICh0YWdOYW1lWzBdKSB7Ci0JCQkJCWNhc2UgJ2MnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfQ0FURUdPUllfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19DQVRFR09SWSwgdGFnTmFtZSkpIHsKLQkJCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0NBVEVHT1JZX1ZBTFVFOwotCQkJCQkJCXZhbGlkID0gcGFyc2VJZGVudGlmaWVyVGFnKGZhbHNlKTsgLy8gVE9ETyAoZnJlZGVyaWMpIHJlY29uc2lkZXIgcGFyYW1ldGVyIHZhbHVlIHdoZW4gQGNhdGVnb3J5IHdpbGwgYmUgc2lnbmlmaWNhbnQgaW4gc3BlYwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ2QnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfREVQUkVDQVRFRF9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0RFUFJFQ0FURUQsIHRhZ05hbWUpKSB7Ci0JCQkJCQkJdGhpcy5kZXByZWNhdGVkID0gdHJ1ZTsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19ERVBSRUNBVEVEX1ZBTFVFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ2UnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfRVhDRVBUSU9OX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfRVhDRVBUSU9OLCB0YWdOYW1lKSkgewotCQkJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfRVhDRVBUSU9OX1ZBTFVFOwotCQkJCQkJCXZhbGlkID0gcGFyc2VUaHJvd3MoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdpJzoKLQkJCQkJCWlmIChsZW5ndGggPT0gVEFHX0lOSEVSSVRET0NfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19JTkhFUklURE9DLCB0YWdOYW1lKSkgewotCQkJCQkJCS8vIGluaGliaXRzIGluaGVyaXRlZCBmbGFnIHdoZW4gdGFncyBoYXZlIGJlZW4gYWxyZWFkeSBzdG9yZWQKLQkJCQkJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTYwNgotCQkJCQkJCS8vIE5vdGUgdGhhdCBmb3IgRE9NX1BBUlNFUiwgbm9kZXMgc3RhY2sgbWF5IGJlIG5vdCBlbXB0eSBldmVuIG5vICdAJyB0YWcKLQkJCQkJCQkvLyB3YXMgZW5jb3VudGVyZWQgaW4gY29tbWVudC4gQnV0IGl0IGNhbm5vdCBiZSB0aGUgY2FzZSBmb3IgQ09NUElMRVJfUEFSU0VSCi0JCQkJCQkJLy8gYW5kIHNvIGlzIGVub3VnaCBhcyBpdCBpcyBvbmx5IHRoaXMgcGFyc2VyIHdoaWNoIHNpZ25hbHMgdGhlIG1pc3NpbmcgdGFnIHdhcm5pbmdzLi4uCi0JCQkJCQkJaWYgKHRoaXMuYXN0UHRyPT0tMSkgewotCQkJCQkJCQl0aGlzLmluaGVyaXRlZFBvc2l0aW9ucyA9ICgoKGxvbmcpIHRoaXMudGFnU291cmNlU3RhcnQpIDw8IDMyKSArIHRoaXMudGFnU291cmNlRW5kOwotCQkJCQkJCX0KLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19JTkhFUklURE9DX1ZBTFVFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ2wnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfTElOS19MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0xJTkssIHRhZ05hbWUpKSB7Ci0JCQkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19MSU5LX1ZBTFVFOwotCQkJCQkJCWlmICh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgfHwgKHRoaXMua2luZCAmIENPTVBMRVRJT05fUEFSU0VSKSAhPSAwKSB7Ci0JCQkJCQkJCXZhbGlkPSBwYXJzZVJlZmVyZW5jZSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMyOTAKLQkJCQkJCQkJLy8gQ2Fubm90IGhhdmUgQGxpbmsgb3V0c2lkZSBpbmxpbmUgY29tbWVudAotCQkJCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewotCQkJCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX0xJTktQTEFJTl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0xJTktQTEFJTiwgdGFnTmFtZSkpIHsKLQkJCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0xJTktQTEFJTl9WQUxVRTsKLQkJCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQkJCQkJCXZhbGlkID0gcGFyc2VSZWZlcmVuY2UoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewotCQkJCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ3AnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfUEFSQU1fTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19QQVJBTSwgdGFnTmFtZSkpIHsKLQkJCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1BBUkFNX1ZBTFVFOwotCQkJCQkJCXZhbGlkID0gcGFyc2VQYXJhbSgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ3MnOgotCQkJCQkJaWYgKGxlbmd0aCA9PSBUQUdfU0VFX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfU0VFLCB0YWdOYW1lKSkgewotCQkJCQkJCWlmICh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKLQkJCQkJCQkJLy8gYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzI5MAotCQkJCQkJCQkvLyBDYW5ub3QgaGF2ZSBAc2VlIGluc2lkZSBpbmxpbmUgY29tbWVudAotCQkJCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgewotCQkJCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19TRUVfVkFMVUU7Ci0JCQkJCQkJCXZhbGlkID0gcGFyc2VSZWZlcmVuY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAndic6Ci0JCQkJCQlpZiAobGVuZ3RoID09IFRBR19WQUxVRV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1ZBTFVFLCB0YWdOYW1lKSkgewotCQkJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfVkFMVUVfVkFMVUU7Ci0JCQkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkJCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQkJCQkJCQl2YWxpZCA9IHBhcnNlUmVmZXJlbmNlKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl2YWxpZCA9IGZhbHNlOwotCQkJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbmV4cGVjdGVkVGFnKHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh0aGlzLnZhbGlkVmFsdWVQb3NpdGlvbnMgPT0gLTEpIHsKLQkJCQkJCQkJCWlmICh0aGlzLmludmFsaWRWYWx1ZVBvc2l0aW9ucyAhPSAtMSkgewotCQkJCQkJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZygoaW50KSAodGhpcy5pbnZhbGlkVmFsdWVQb3NpdGlvbnM+Pj4zMiksIChpbnQpIHRoaXMuaW52YWxpZFZhbHVlUG9zaXRpb25zKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICh2YWxpZCkgewotCQkJCQkJCQkJCXRoaXMudmFsaWRWYWx1ZVBvc2l0aW9ucyA9ICgoKGxvbmcpIHRoaXMudGFnU291cmNlU3RhcnQpIDw8IDMyKSArIHRoaXMudGFnU291cmNlRW5kOwotCQkJCQkJCQkJCXRoaXMuaW52YWxpZFZhbHVlUG9zaXRpb25zID0gLTE7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXRoaXMuaW52YWxpZFZhbHVlUG9zaXRpb25zID0gKCgobG9uZykgdGhpcy50YWdTb3VyY2VTdGFydCkgPDwgMzIpICsgdGhpcy50YWdTb3VyY2VFbmQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljcmVhdGVUYWcoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJY3JlYXRlVGFnKCk7Ci0JCQkJCQlicmVhazsKKworCQkvLyBDb21wbGFpbiB3aGVuIHRhZyBpcyBtaXNzaW5nIGEgZGVzY3JpcHRpb24KKwkJLy8gTm90ZSB0aGF0IGlmIHRoZSBwYXJzZSBvZiBhbiBpbmxpbmUgdGFnIGhhcyBhbHJlYWR5IHN0YXJ0ZWQsIGNvbnNpZGVyIGl0CisJCS8vIGFzIHRoZSBleHBlY3RlZCBkZXNjcmlwdGlvbiwgaGVuY2UgZG8gbm90IHJlcG9ydCBhbnkgd2FybmluZworCQlzd2l0Y2ggKHRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uKSB7CisJCQljYXNlIFRBR19QQVJBTV9WQUxVRToKKwkJCWNhc2UgVEFHX1RIUk9XU19WQUxVRToKKwkJCQlpZiAoIXRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQkJCQlpbnQgc3RhcnQgPSAoaW50KSAodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1swXSA+Pj4gMzIpOworCQkJCQlpbnQgZW5kID0gKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZ1RhZ0Rlc2NyaXB0aW9uQWZ0ZXJSZWZlcmVuY2Uoc3RhcnQsIGVuZCwgdGhpcy5zb3VyY2VQYXJzZXIubW9kaWZpZXJzKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXJldHVybiA6Ci0JCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19SRVRVUk5fVkFMVUU7Ci0JCQkJdmFsaWQgPSBwYXJzZVJldHVybigpOwotCQkJCS8qIHZlcmlmeSBjaGFyYWN0ZXJzIGFmdGVyIHJldHVybiB0YWcgKHdlJ3JlIGV4cGVjdGluZyB0ZXh0IGRlc2NyaXB0aW9uKQotCQkJCWlmKCF2ZXJpZnlDaGFyc0FmdGVyUmV0dXJuVGFnKHRoaXMuaW5kZXgpKSB7Ci0JCQkJCWlmICh0aGlzLnNvdXJjZVBhcnNlciAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgZW5kID0gdGhpcy5zdGFyUG9zaXRpb24gPT0gLTEgfHwgdGhpcy5saW5lRW5kPHRoaXMuc3RhclBvc2l0aW9uID8gdGhpcy5saW5lRW5kIDogdGhpcy5zdGFyUG9zaXRpb247Ci0JCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jRW1wdHlSZXR1cm5UYWcodGhpcy50YWdTb3VyY2VTdGFydCwgZW5kKTsKKwkJCWNhc2UgTk9fVEFHX1ZBTFVFOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIXRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZ1RhZ0Rlc2NyaXB0aW9uKFRBR19OQU1FU1t0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbl0sIHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kLCB0aGlzLnNvdXJjZVBhcnNlci5tb2RpZmllcnMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IE5PX1RBR19WQUxVRTsKKworCQkvLyBWZXJpZnkgZmlyc3QgY2hhcmFjdGVyCisJCXRoaXMudGFnU291cmNlU3RhcnQgPSB0aGlzLmluZGV4OworCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IHByZXZpb3VzUG9zaXRpb247CisJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CisJCWNoYXIgZmlyc3RDaGFyID0gcmVhZENoYXIoKTsKKwkJc3dpdGNoIChmaXJzdENoYXIpIHsKKwkJCWNhc2UgJyAnOgorCQkJY2FzZSAnKic6CisJCQljYXNlICd9JzoKKwkJCWNhc2UgJyMnOgorCQkJCS8vIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IHZhbGlkLCBoZW5jZSByZXBvcnQgaW52YWxpZCBlbXB0eSB0YWcKKwkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRUYWcocHJldmlvdXNQb3NpdGlvbiwgY3VycmVudFBvc2l0aW9uKTsKKwkJCQlpZiAodGhpcy50ZXh0U3RhcnQgPT0gLTEpIHRoaXMudGV4dFN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOworCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gZmlyc3RDaGFyOworCQkJCXJldHVybiBmYWxzZTsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGZpcnN0Q2hhcikpIHsKKwkJCQkJLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBub3QgdmFsaWQsIGhlbmNlIHJlcG9ydCBpbnZhbGlkIGVtcHR5IHRhZworCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY0ludmFsaWRUYWcocHJldmlvdXNQb3NpdGlvbiwgY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJaWYgKHRoaXMudGV4dFN0YXJ0ID09IC0xKSB0aGlzLnRleHRTdGFydCA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBmaXJzdENoYXI7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJCisJCS8vIFJlYWQgdGFnIG5hbWUKKwkJY2hhcltdIHRhZ05hbWUgPSBuZXcgY2hhclszMl07CisJCWludCBsZW5ndGggPSAwOworCQljaGFyIGN1cnJlbnRDaGFyID0gZmlyc3RDaGFyOworCQlpbnQgdGFnTmFtZUxlbmd0aCA9IHRhZ05hbWUubGVuZ3RoOworCQlib29sZWFuIHZhbGlkVGFnID0gdHJ1ZTsKKwkJdGFnTG9vcDogd2hpbGUgKHRydWUpIHsKKwkJCWlmIChsZW5ndGggPT0gdGFnTmFtZUxlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGFnTmFtZSwgMCwgdGFnTmFtZSA9IG5ldyBjaGFyW3RhZ05hbWVMZW5ndGgrMzJdLCAwLCB0YWdOYW1lTGVuZ3RoKTsKKwkJCQl0YWdOYW1lTGVuZ3RoID0gdGFnTmFtZS5sZW5ndGg7CisJCQl9CisJCQl0YWdOYW1lW2xlbmd0aCsrXSA9IGN1cnJlbnRDaGFyOworCQkJY3VycmVudFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwkJCWN1cnJlbnRDaGFyID0gcmVhZENoYXIoKTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQljYXNlICcgJzoKKwkJCQljYXNlICcqJzoKKwkJCQljYXNlICd9JzoKKwkJCQkJLy8gdGhlc2UgY2hhcmFjdGVycyBtYXJrIHRoZSBlbmQgb2YgdGhlIHRhZyByZWFkaW5nCisJCQkJCWJyZWFrIHRhZ0xvb3A7CisJCQkJY2FzZSAnIyc6CisJCQkJCS8vIGludmFsaWQgdGFnIGNoYXJhY3RlciwgbWFyayB0aGUgdGFnIGFzIGludmFsaWQgYnV0IGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHRhZworCQkJCQl2YWxpZFRhZyA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXIpKSB7CisJCQkJCQkvLyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgbWFyayB0aGUgZW5kIG9mIHRoZSB0YWcgcmVhZGluZworCQkJCQkJYnJlYWsgdGFnTG9vcDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIEluaXQgcG9zaXRpb25zCisJCXRoaXMudGFnU291cmNlRW5kID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBjdXJyZW50Q2hhcjsKKwkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJdGhpcy5pbmRleCA9IHRoaXMudGFnU291cmNlRW5kKzE7CisKKwkJLy8gUmV0dXJuIGlmIHRoZSB0YWcgaXMgbm90IHZhbGlkCisJCWlmICghdmFsaWRUYWcpIHsKKwkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jSW52YWxpZFRhZyh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7CisJCQlpZiAodGhpcy50ZXh0U3RhcnQgPT0gLTEpIHRoaXMudGV4dFN0YXJ0ID0gdGhpcy5pbmRleDsKKwkJCXRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gY3VycmVudENoYXI7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBEZWNpZGUgd2hpY2ggcGFyc2UgdG8gcGVyZm9ybSBkZXBlbmRpbmcgb24gdGFnIG5hbWUKKwkJdGhpcy50YWdWYWx1ZSA9IFRBR19PVEhFUlNfVkFMVUU7CisJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKwkJc3dpdGNoIChmaXJzdENoYXIpIHsKKwkJCWNhc2UgJ2EnOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX0FVVEhPUl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0FVVEhPUiwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0FVVEhPUl9WQUxVRTsKKwkJCQkJdGhpcy50YWdXYWl0aW5nRm9yRGVzY3JpcHRpb24gPSB0aGlzLnRhZ1ZhbHVlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2MnOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX0NBVEVHT1JZX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfQ0FURUdPUlksIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19DQVRFR09SWV9WQUxVRTsKKwkJCQkJaWYgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJCQkJCXZhbGlkID0gcGFyc2VJZGVudGlmaWVyVGFnKGZhbHNlKTsgLy8gVE9ETyAoZnJlZGVyaWMpIHJlY29uc2lkZXIgcGFyYW1ldGVyIHZhbHVlIHdoZW4gQGNhdGVnb3J5IHdpbGwgYmUgc2lnbmlmaWNhbnQgaW4gc3BlYworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX0NPREVfTEVOR1RIICYmIHRoaXMuaW5saW5lVGFnU3RhcnRlZCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfQ09ERSwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0NPREVfVkFMVUU7CisJCQkJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gdGhpcy50YWdWYWx1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQlpZiAobGVuZ3RoID09IFRBR19ERVBSRUNBVEVEX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfREVQUkVDQVRFRCwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLmRlcHJlY2F0ZWQgPSB0cnVlOworCQkJCQl2YWxpZCA9IHRydWU7CisJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfREVQUkVDQVRFRF9WQUxVRTsKKwkJCQkJdGhpcy50YWdXYWl0aW5nRm9yRGVzY3JpcHRpb24gPSB0aGlzLnRhZ1ZhbHVlOworCQkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19ET0NfUk9PVF9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0RPQ19ST09ULCB0YWdOYW1lLCAwLCBsZW5ndGgpKSB7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc3MzAKKwkJCQkJLy8gaWRlbnRpZnkgQGRvY1Jvb3QgdGFnIGFzIGEgYmFzZSB0YWcgdGhhdCBkb2VzIG5vdCBleHBlY3QgYW55IGFyZ3VtZW50CisJCQkJCXZhbGlkID0gdHJ1ZTsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19ET0NfUk9PVF9WQUxVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdlJzoKKwkJCQlpZiAobGVuZ3RoID09IFRBR19FWENFUFRJT05fTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19FWENFUFRJT04sIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19FWENFUFRJT05fVkFMVUU7CisJCQkJCWlmICghdGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCQl2YWxpZCA9IHBhcnNlVGhyb3dzKCk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJKi8KIAkJCQlicmVhazsKLQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhyb3dzIDoKLQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1RIUk9XU19WQUxVRTsKLQkJCQl2YWxpZCA9IHBhcnNlVGhyb3dzKCk7CisJCQljYXNlICdpJzoKKwkJCQlpZiAobGVuZ3RoID09IFRBR19JTkhFUklURE9DX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfSU5IRVJJVERPQywgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3MDM3LCBAaW5oZXJpdERvYyB1c2FnZSBpcyBpbGxlZ2FsCisJCQkJCS8vIG91dHNpZGUgb2YgZmV3IGJsb2NrIHRhZ3MgYW5kIHRoZSBtYWluIGRlc2NyaXB0aW9uLgorCQkJCQlzd2l0Y2ggKHRoaXMubGFzdEJsb2NrVGFnVmFsdWUpIHsKKwkJCQkJCWNhc2UgVEFHX1JFVFVSTl9WQUxVRToKKwkJCQkJCWNhc2UgVEFHX1RIUk9XU19WQUxVRToKKwkJCQkJCWNhc2UgVEFHX0VYQ0VQVElPTl9WQUxVRToKKwkJCQkJCWNhc2UgVEFHX1BBUkFNX1ZBTFVFOgorCQkJCQkJY2FzZSBOT19UQUdfVkFMVUU6ICAgICAvLyBTdGlsbCBpbiBtYWluIGRlc2NyaXB0aW9uCisJCQkJCQkJdmFsaWQgPSB0cnVlOworCQkJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB7CisJCQkJCQkJCXJlY29yZEluaGVyaXRlZFBvc2l0aW9uKCgoKGxvbmcpIHRoaXMudGFnU291cmNlU3RhcnQpIDw8IDMyKSArIHRoaXMudGFnU291cmNlRW5kKTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQkJCQkJCQkvLyBwYXJzZSBhICd2YWxpZCcgaW5oZXJpdERvYyB0YWcKKwkJCQkJCQkJcGFyc2VJbmhlcml0RG9jVGFnKCk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB7CisJCQkJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbmV4cGVjdGVkVGFnKHRoaXMudGFnU291cmNlU3RhcnQsCisJCQkJCQkJCQkJdGhpcy50YWdTb3VyY2VFbmQpOworCQkJCQkJCX0KKwkJCQkJfQorCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0lOSEVSSVRET0NfVkFMVUU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJaWYgKGxlbmd0aCA9PSBUQUdfTElOS19MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0xJTkssIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19MSU5LX1ZBTFVFOworCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkIHx8ICh0aGlzLmtpbmQgJiBDT01QTEVUSU9OX1BBUlNFUikgIT0gMCkgeworCQkJCQkJdmFsaWQ9IHBhcnNlUmVmZXJlbmNlKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSBUQUdfTElOS1BMQUlOX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfTElOS1BMQUlOLCB0YWdOYW1lLCAwLCBsZW5ndGgpKSB7CisJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfTElOS1BMQUlOX1ZBTFVFOworCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCQl2YWxpZCA9IHBhcnNlUmVmZXJlbmNlKCk7CisJCQkJCX0gCisJCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX0xJVEVSQUxfTEVOR1RIICYmIHRoaXMuaW5saW5lVGFnU3RhcnRlZCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfTElURVJBTCwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0xJVEVSQUxfVkFMVUU7CisJCQkJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gdGhpcy50YWdWYWx1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlpZiAobGVuZ3RoID09IFRBR19QQVJBTV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1BBUkFNLCB0YWdOYW1lLCAwLCBsZW5ndGgpKSB7CisJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfUEFSQU1fVkFMVUU7CisJCQkJCWlmICghdGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCQl2YWxpZCA9IHBhcnNlUGFyYW0oKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX1JFVFVSTl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1JFVFVSTiwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1JFVFVSTl9WQUxVRTsKKwkJCQkJaWYgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJCQkJCXZhbGlkID0gcGFyc2VSZXR1cm4oKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX1NFRV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1NFRSwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFRV9WQUxVRTsKKwkJCQkJaWYgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJCQkJCXZhbGlkID0gcGFyc2VSZWZlcmVuY2UoKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19TRVJJQUxfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19TRVJJQUwsIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19TRVJJQUxfVkFMVUU7CisJCQkJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gdGhpcy50YWdWYWx1ZTsKKwkJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSBUQUdfU0VSSUFMX0RBVEFfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19TRVJJQUxfREFUQSwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFUklBTF9EQVRBX1ZBTFVFOworCQkJCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IHRoaXMudGFnVmFsdWU7CisJCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX1NFUklBTF9GSUVMRF9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1NFUklBTF9GSUVMRCwgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFUklBTF9GSUVMRF9WQUxVRTsKKwkJCQkJdGhpcy50YWdXYWl0aW5nRm9yRGVzY3JpcHRpb24gPSB0aGlzLnRhZ1ZhbHVlOworCQkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19TSU5DRV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1NJTkNFLCB0YWdOYW1lLCAwLCBsZW5ndGgpKSB7CisJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfU0lOQ0VfVkFMVUU7CisJCQkJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gdGhpcy50YWdWYWx1ZTsKKwkJCQl9CQkJCQkKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX1RIUk9XU19MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1RIUk9XUywgdGFnTmFtZSwgMCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1RIUk9XU19WQUxVRTsKKwkJCQkJaWYgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJCQkJCXZhbGlkID0gcGFyc2VUaHJvd3MoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3YnOgorCQkJCWlmIChsZW5ndGggPT0gVEFHX1ZBTFVFX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfVkFMVUUsIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19WQUxVRV9WQUxVRTsKKwkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQkJCQkJCXZhbGlkID0gcGFyc2VSZWZlcmVuY2UoKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0aGlzLnZhbGlkVmFsdWVQb3NpdGlvbnMgPT0gLTEpIHsKKwkJCQkJCQlpZiAodGhpcy5pbnZhbGlkVmFsdWVQb3NpdGlvbnMgIT0gLTEpIHsKKwkJCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbmV4cGVjdGVkVGFnKChpbnQpICh0aGlzLmludmFsaWRWYWx1ZVBvc2l0aW9ucz4+PjMyKSwgKGludCkgdGhpcy5pbnZhbGlkVmFsdWVQb3NpdGlvbnMpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodmFsaWQpIHsKKwkJCQkJCQkJdGhpcy52YWxpZFZhbHVlUG9zaXRpb25zID0gKCgobG9uZykgdGhpcy50YWdTb3VyY2VTdGFydCkgPDwgMzIpICsgdGhpcy50YWdTb3VyY2VFbmQ7CisJCQkJCQkJCXRoaXMuaW52YWxpZFZhbHVlUG9zaXRpb25zID0gLTE7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5pbnZhbGlkVmFsdWVQb3NpdGlvbnMgPSAoKChsb25nKSB0aGlzLnRhZ1NvdXJjZVN0YXJ0KSA8PCAzMikgKyB0aGlzLnRhZ1NvdXJjZUVuZDsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZyh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSBUQUdfVkVSU0lPTl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1ZFUlNJT04sIHRhZ05hbWUsIDAsIGxlbmd0aCkpIHsKKwkJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19WRVJTSU9OX1ZBTFVFOworCQkJCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IHRoaXMudGFnVmFsdWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3JlYXRlVGFnKCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljcmVhdGVUYWcoKTsKIAkJCQlicmVhazsKIAkJfQogCQl0aGlzLnRleHRTdGFydCA9IHRoaXMuaW5kZXg7CisJCWlmICh0aGlzLnRhZ1ZhbHVlICE9IFRBR19PVEhFUlNfVkFMVUUpIHsKKwkJCWlmICghdGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJdGhpcy5sYXN0QmxvY2tUYWdWYWx1ZSA9IHRoaXMudGFnVmFsdWU7CisJCQl9CisJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc4MzMKKwkJCS8vIFJlcG9ydCBhIHByb2JsZW0gaWYgYSBibG9jayB0YWcgaXMgYmVpbmcgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBpbmxpbmUgdGFnIGFuZCB2aWNlIHZlcnNhLgorCQkJaWYgKCh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgJiYgSkFWQURPQ19UQUdfVFlQRVt0aGlzLnRhZ1ZhbHVlXSA9PSBUQUdfVFlQRV9CTE9DSykKKwkJCQkJfHwgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQgJiYgSkFWQURPQ19UQUdfVFlQRVt0aGlzLnRhZ1ZhbHVlXSA9PSBUQUdfVFlQRV9JTkxJTkUpKSB7CisJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX09USEVSU19WQUxVRTsKKwkJCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IE5PX1RBR19WQUxVRTsKKwkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgeworCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZyh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB2YWxpZDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZUluaGVyaXREb2NUYWcoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvKgorCSAqIFBhcnNlIEBwYXJhbSB0YWcgZGVjbGFyYXRpb24gYW5kIGZsYWcgbWlzc2luZyBkZXNjcmlwdGlvbiBpZiBjb3JyZXNwb25kaW5nIG9wdGlvbiBpcyBlbmFibGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VQYXJhbSgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCQlib29sZWFuIHZhbGlkID0gc3VwZXIucGFyc2VQYXJhbSgpOworCQl0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbiA9IHZhbGlkICYmIHRoaXMucmVwb3J0UHJvYmxlbXMgPyBUQUdfUEFSQU1fVkFMVUUgOiBOT19UQUdfVkFMVUU7CiAJCXJldHVybiB2YWxpZDsKIAl9CiAKQEAgLTY5Myw2ICs4MDAsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjcHVzaFRleHQoaW50LCBpbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHVzaFRleHQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCS8vIFRoZSB0YWcgZ2V0cyBpdHMgZGVzY3JpcHRpb24gPT4gY2xlYXIgdGhlIGZsYWcKKwkJdGhpcy50YWdXYWl0aW5nRm9yRGVzY3JpcHRpb24gPSBOT19UQUdfVkFMVUU7CisJfQorCiAJLyoKIAkgKiBQdXNoIGEgdGhyb3dzIHR5cGUgcmVmIGluIGFzdCBub2RlIHN0YWNrLgogCSAqLwpAQCAtNzIyLDYgKzgzNywxOCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLkFic3RyYWN0Q29tbWVudFBhcnNlciNyZWZyZXNoSW5saW5lVGFnUG9zaXRpb24oaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihpbnQgcHJldmlvdXNQb3NpdGlvbikgeworCisJCS8vIFNpZ25hbCB0YWcgbWlzc2luZyBkZXNjcmlwdGlvbiBpZiBuZWNlc3NhcnkKKwkJaWYgKHRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uIT0gTk9fVEFHX1ZBTFVFKSB7CisJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jTWlzc2luZ1RhZ0Rlc2NyaXB0aW9uKFRBR19OQU1FU1t0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbl0sIHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kLCB0aGlzLnNvdXJjZVBhcnNlci5tb2RpZmllcnMpOworCQkJdGhpcy50YWdXYWl0aW5nRm9yRGVzY3JpcHRpb24gPSBOT19UQUdfVkFMVUU7CisJCX0KKwl9CisKIAkvKgogCSAqIFJlZnJlc2ggcmV0dXJuIHN0YXRlbWVudAogCSAqLwpAQCAtNzQyLDcgKzg2OSwzNCBAQAogCSAqLwogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURvY0NvbW1lbnQoKSB7CiAKKwkJLy8gQ29tcGxhaW4gd2hlbiB0YWcgaXMgbWlzc2luZyBhIGRlc2NyaXB0aW9uCisJCS8vIE5vdGUgdGhhdCBpZiB0aGUgcGFyc2Ugb2YgYW4gaW5saW5lIHRhZyBoYXMgYWxyZWFkeSBzdGFydGVkLCBjb25zaWRlciBpdAorCQkvLyBhcyB0aGUgZXhwZWN0ZWQgZGVzY3JpcHRpb24sIGhlbmNlIGRvIG5vdCByZXBvcnQgYW55IHdhcm5pbmcKKwkJc3dpdGNoICh0aGlzLnRhZ1dhaXRpbmdGb3JEZXNjcmlwdGlvbikgeworCQkJY2FzZSBUQUdfUEFSQU1fVkFMVUU6CisJCQljYXNlIFRBR19USFJPV1NfVkFMVUU6CisJCQkJaWYgKCF0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJCQkJaW50IHN0YXJ0ID0gKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbMF0gPj4+IDMyKTsKKwkJCQkJaW50IGVuZCA9IChpbnQpIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY01pc3NpbmdUYWdEZXNjcmlwdGlvbkFmdGVyUmVmZXJlbmNlKHN0YXJ0LCBlbmQsIHRoaXMuc291cmNlUGFyc2VyLm1vZGlmaWVycyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBOT19UQUdfVkFMVUU6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmICghdGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCXRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NNaXNzaW5nVGFnRGVzY3JpcHRpb24oVEFHX05BTUVTW3RoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uXSwgdGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQsIHRoaXMuc291cmNlUGFyc2VyLm1vZGlmaWVycyk7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCXRoaXMudGFnV2FpdGluZ0ZvckRlc2NyaXB0aW9uID0gTk9fVEFHX1ZBTFVFOworCiAJCS8vIFNldCBwb3NpdGlvbnMKKwkJaWYgKHRoaXMuaW5oZXJpdGVkUG9zaXRpb25zICE9IG51bGwgJiYgdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnNQdHIgIT0gdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMubGVuZ3RoKSB7CisJCQkvLyBDb21wYWN0IGFycmF5IGJ5IHNocmlua2luZy4KKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMsIDAsIAorCQkJCQl0aGlzLmluaGVyaXRlZFBvc2l0aW9ucyA9IG5ldyBsb25nW3RoaXMuaW5oZXJpdGVkUG9zaXRpb25zUHRyXSwgMCwgdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnNQdHIpOworCQl9CiAJCXRoaXMuZG9jQ29tbWVudC5pbmhlcml0ZWRQb3NpdGlvbnMgPSB0aGlzLmluaGVyaXRlZFBvc2l0aW9uczsKIAkJdGhpcy5kb2NDb21tZW50LnZhbHVlUG9zaXRpb25zID0gdGhpcy52YWxpZFZhbHVlUG9zaXRpb25zICE9IC0xID8gdGhpcy52YWxpZFZhbHVlUG9zaXRpb25zIDogdGhpcy5pbnZhbGlkVmFsdWVQb3NpdGlvbnM7CiAKQEAgLTc1MCw3ICs5MDQsNyBAQAogCQlpZiAodGhpcy5yZXR1cm5TdGF0ZW1lbnQgIT0gbnVsbCkgewogCQkJdGhpcy5kb2NDb21tZW50LnJldHVyblN0YXRlbWVudCA9IChKYXZhZG9jUmV0dXJuU3RhdGVtZW50KSB0aGlzLnJldHVyblN0YXRlbWVudDsKIAkJfQotCQkKKwogCQkvLyBDb3B5IGFycmF5IG9mIGludmFsaWQgc3ludGF4IHBhcmFtIHRhZ3MKIAkJaWYgKHRoaXMuaW52YWxpZFBhcmFtUmVmZXJlbmNlc1B0ciA+PSAwKSB7CiAJCQl0aGlzLmRvY0NvbW1lbnQuaW52YWxpZFBhcmFtZXRlcnMgPSBuZXcgSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2VbdGhpcy5pbnZhbGlkUGFyYW1SZWZlcmVuY2VzUHRyKzFdOwpAQCAtNzc3LDcgKzkzMSw3IEBACiAJCS8vIFN0b3JlIG5vZGVzIGluIGFycmF5cwogCQl3aGlsZSAodGhpcy5hc3RMZW5ndGhQdHIgPj0gMCkgewogCQkJaW50IHB0ciA9IHRoaXMuYXN0TGVuZ3RoUHRyICUgT1JERVJFRF9UQUdTX05VTUJFUjsKLQkJCS8vIFN0YXJ0aW5nIHdpdGggdGhlIHN0YWNrIHRvcCwgc28gZ2V0IHJlZmVyZW5jZXMgKGVnLiBFeHByZXNzaW9uKSBjb21pbmcgZnJvbSBAc2VlIGRlY2xhcmF0aW9ucworCQkJLy8gU3RhcnRpbmcgd2l0aCB0aGUgc3RhY2sgdG9wLCBzbyBnZXQgcmVmZXJlbmNlcyAoRXhwcmVzc2lvbikgY29taW5nIGZyb20gQHNlZSBkZWNsYXJhdGlvbnMKIAkJCXN3aXRjaChwdHIpIHsKIAkJCQljYXNlIFNFRV9UQUdfRVhQRUNURURfT1JERVI6CiAJCQkJCWludCBzaXplID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXTsKQEAgLTc4Niw3ICs5NDAsNyBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCi0JCQkJLy8gVGhlbiBjb250aW51aW5nIHdpdGggY2xhc3MgbmFtZXMgKGVnLiBUeXBlUmVmZXJlbmNlKSBjb21pbmcgZnJvbSBAdGhyb3cvQGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMKKwkJCQkvLyBUaGVuIGNvbnRpbnVpbmcgd2l0aCBjbGFzcyBuYW1lcyAoVHlwZVJlZmVyZW5jZSkgY29taW5nIGZyb20gQHRocm93L0BleGNlcHRpb24gZGVjbGFyYXRpb25zCiAJCQkJY2FzZSBUSFJPV1NfVEFHX0VYUEVDVEVEX09SREVSOgogCQkJCQlzaXplID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXTsKIAkJCQkJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewpAQCAtNzk0LDcgKzk0OCw3IEBACiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAKLQkJCQkvLyBGaW5hbGx5LCBmaW5pc2hpbmcgd2l0aCBwYXJhbWV0ZXJzIG5hbGVzIChpZS4gQXJndW1lbnQpIGNvbWluZyBmcm9tIEBwYXJhbSBkZWNsYXJhdGlvbgorCQkJCS8vIEZpbmFsbHksIGZpbmlzaGluZyB3aXRoIHBhcmFtZXRlcnMgbmFtZXMgKEFyZ3VtZW50KSBjb21pbmcgZnJvbSBAcGFyYW0gZGVjbGFyYXRpb24KIAkJCQljYXNlIFBBUkFNX1RBR19FWFBFQ1RFRF9PUkRFUjoKIAkJCQkJc2l6ZSA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV07CiAJCQkJCWZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspIHsKQEAgLTgwNyw3ICs5NjEsNyBAQAogCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyBSZXNpemUgcGFyYW0gdGFnIHJlZmVyZW5jZXMgYXJyYXlzCiAJCWlmIChwYXJhbVJlZlB0ciA9PSAwKSB7IC8vIHRoZXJlJ3Mgbm8gdHlwZSBwYXJhbWV0ZXJzIHJlZmVyZW5jZXMKIAkJCXRoaXMuZG9jQ29tbWVudC5wYXJhbVR5cGVQYXJhbWV0ZXJzID0gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvSmF2YWRvY1RhZ0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9KYXZhZG9jVGFnQ29uc3RhbnRzLmphdmEKaW5kZXggMDMwMWMwNC4uYTc0MzFhZCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9KYXZhZG9jVGFnQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9KYXZhZG9jVGFnQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNiArMTEsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworCiAvKioKICAqIEphdmFkb2MgdGFnIGNvbnN0YW50cy4KICAqCkBAIC01Miw3ICs1NCwxNSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19JTkhFUklURE9DX0xFTkdUSCA9IFRBR19JTkhFUklURE9DLmxlbmd0aDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVkFMVUVfTEVOR1RIID0gVEFHX1ZBTFVFLmxlbmd0aDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ0FURUdPUllfTEVOR1RIID0gVEFHX0NBVEVHT1JZLmxlbmd0aDsKLQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19BVVRIT1JfTEVOR1RIID0gVEFHX0FVVEhPUi5sZW5ndGg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1NFUklBTF9MRU5HVEggPSBUQUdfU0VSSUFMLmxlbmd0aDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfU0VSSUFMX0RBVEFfTEVOR1RIID0gVEFHX1NFUklBTF9EQVRBLmxlbmd0aDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfU0VSSUFMX0ZJRUxEX0xFTkdUSCA9IFRBR19TRVJJQUxfRklFTEQubGVuZ3RoOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19TSU5DRV9MRU5HVEggPSBUQUdfU0lOQ0UubGVuZ3RoOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19WRVJTSU9OX0xFTkdUSCA9IFRBR19WRVJTSU9OLmxlbmd0aDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ09ERV9MRU5HVEggPSBUQUdfQ09ERS5sZW5ndGg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0xJVEVSQUxfTEVOR1RIID0gVEFHX0xJVEVSQUwubGVuZ3RoOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19ET0NfUk9PVF9MRU5HVEggPSBUQUdfRE9DX1JPT1QubGVuZ3RoOwogCiAJLy8gdGFncyB2YWx1ZQogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1RBR19WQUxVRSA9IDA7CkBAIC02Nyw4ICs3Nyw0MiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19JTkhFUklURE9DX1ZBTFVFID0gOTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVkFMVUVfVkFMVUUgPSAxMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ0FURUdPUllfVkFMVUUgPSAxMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQVVUSE9SX1ZBTFVFID0gMTI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1NFUklBTF9WQUxVRSA9IDEzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19TRVJJQUxfREFUQV9WQUxVRSA9IDE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19TRVJJQUxfRklFTERfVkFMVUUgPSAxNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfU0lOQ0VfVkFMVUUgPSAxNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVkVSU0lPTl9WQUxVRSA9IDE3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DT0RFX1ZBTFVFID0gMTg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0xJVEVSQUxfVkFMVUUgPSAxOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRE9DX1JPT1RfVkFMVUUgPSAyMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfT1RIRVJTX1ZBTFVFID0gMTAwOwogCQorCS8vIFRhZyBuYW1lcyBhcnJheQorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gVEFHX05BTUVTID0geworCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCVRBR19ERVBSRUNBVEVELAkJLyogMSAqLworCQlUQUdfUEFSQU0sCQkJCS8qIDIgKi8KKwkJVEFHX1JFVFVSTiwJCQkJLyogMyAqLworCQlUQUdfVEhST1dTLAkJCQkvKiA0ICovCisJCVRBR19FWENFUFRJT04sCQkJLyogNSAqLworCQlUQUdfU0VFLAkJCQkJCS8qIDYgKi8KKwkJVEFHX0xJTkssCQkJCQkJLyogNyAqLworCQlUQUdfTElOS1BMQUlOLAkJCS8qIDggKi8KKwkJVEFHX0lOSEVSSVRET0MsCQkvKiA5ICovCisJCVRBR19WQUxVRSwJCQkJCS8qIDEwICovCisJCVRBR19DQVRFR09SWSwJCQkvKiAxMSAqLworCQlUQUdfQVVUSE9SLAkJCQkvKiAxMiAqLworCQlUQUdfU0VSSUFMLAkJCQkvKiAxMyAqLworCQlUQUdfU0VSSUFMX0RBVEEsCS8qIDE0ICovCisJCVRBR19TRVJJQUxfRklFTEQsCS8qIDE1ICovCisJCVRBR19TSU5DRSwJCQkJCS8qIDE2ICovCisJCVRBR19WRVJTSU9OLAkJCQkvKiAxNyAqLworCQlUQUdfQ09ERSwJCQkJCS8qIDE4ICovCisJCVRBR19MSVRFUkFMLAkJCQkvKiAxOSAqLworCQlUQUdfRE9DX1JPT1QsCQkJLyogMjAgKi8KKwl9OworCiAJLy8gdGFncyBleHBlY3RlZCBwb3NpdGlvbnMKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBPUkRFUkVEX1RBR1NfTlVNQkVSID0gMzsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQQVJBTV9UQUdfRVhQRUNURURfT1JERVIgPSAwOwpAQCAtODEsNiArMTI1LDggQEAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCTE9DS19JRFggPSAwOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOTElORV9JRFggPSAxOwogCisJLy8gaHJlZiB0YWcKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBIUkVGX1RBRyA9IHsnaCcsICdyJywgJ2UnLCAnZid9OwogCS8qCiAJICogVGFncyB2ZXJzaW9ucwogCSAqLwpAQCAtMTI0LDYgKzE3MCwzMyBAQAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJMT0NLX1RBR1NfTEVOR1RIID0gQkxPQ0tfVEFHUy5sZW5ndGg7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQUxMX1RBR1NfTEVOR1RIID0gQkxPQ0tfVEFHU19MRU5HVEgrSU5MSU5FX1RBR1NfTEVOR1RIOwogCisJcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBUQUdfVFlQRV9OT05FID0gMDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFRBR19UWVBFX0lOTElORSA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBUQUdfVFlQRV9CTE9DSyA9IDI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydFtdIEpBVkFET0NfVEFHX1RZUEUgPSB7CisJCVRBR19UWVBFX05PTkUsIAkJLy8gTk9fVEFHX1ZBTFVFID0gMDsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfREVQUkVDQVRFRF9WQUxVRSA9IDE7CisJCVRBR19UWVBFX0JMT0NLLAkJLy8gVEFHX1BBUkFNX1ZBTFVFID0gMjsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfUkVUVVJOX1ZBTFVFID0gMzsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfVEhST1dTX1ZBTFVFID0gNDsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfRVhDRVBUSU9OX1ZBTFVFID0gNTsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfU0VFX1ZBTFVFID0gNjsKKwkJVEFHX1RZUEVfSU5MSU5FLAkvLyBUQUdfTElOS19WQUxVRSA9IDc7CisJCVRBR19UWVBFX0lOTElORSwJLy8gVEFHX0xJTktQTEFJTl9WQUxVRSA9IDg7CisJCVRBR19UWVBFX0lOTElORSwJLy8gVEFHX0lOSEVSSVRET0NfVkFMVUUgPSA5OworCQlUQUdfVFlQRV9JTkxJTkUsCS8vIFRBR19WQUxVRV9WQUxVRSA9IDEwOworCQlUQUdfVFlQRV9CTE9DSywJCS8vIFRBR19DQVRFR09SWV9WQUxVRSA9IDExOworCQlUQUdfVFlQRV9CTE9DSywJCS8vIFRBR19BVVRIT1JfVkFMVUUgPSAxMjsKKwkJVEFHX1RZUEVfQkxPQ0ssCQkvLyBUQUdfU0VSSUFMX1ZBTFVFID0gMTM7CisJCVRBR19UWVBFX0JMT0NLLAkJLy8gVEFHX1NFUklBTF9EQVRBX1ZBTFVFID0gMTQ7CisJCVRBR19UWVBFX0JMT0NLLAkJLy8gVEFHX1NFUklBTF9GSUVMRF9WQUxVRSA9IDE1OworCQlUQUdfVFlQRV9CTE9DSywJCS8vIFRBR19TSU5DRV9WQUxVRSA9IDE2OworCQlUQUdfVFlQRV9CTE9DSywJCS8vIFRBR19WRVJTSU9OX1ZBTFVFID0gMTc7CisJCVRBR19UWVBFX0lOTElORSwJLy8gVEFHX0NPREVfVkFMVUUgPSAxODsKKwkJVEFHX1RZUEVfSU5MSU5FLAkvLyBUQUdfTElURVJBTF9WQUxVRSA9IDE5OworCQlUQUdfVFlQRV9JTkxJTkUJCS8vIFRBR19ET0NfUk9PVF9WQUxVRSA9IDIwOworCX07CiAJLyoKIAkgKiBUYWdzIHVzYWdlCiAJICovCkBAIC0xMzksNiArMjEyLDcgQEAKIAkJVEFHX0RPQ19ST09ULAogCQlUQUdfVkFMVUUsCiAJfTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIENPTVBJTEFUSU9OX1VOSVRfVEFHUyA9IHt9OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gQ0xBU1NfVEFHUyA9IHsKIAkJVEFHX1NFRSwKIAkJVEFHX1NJTkNFLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9OTFNUYWcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvTkxTVGFnLmphdmEKaW5kZXggMWY0ZWUxNi4uODViZWQ1ZSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9OTFNUYWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU1RhZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDcgKzE2LDcgQEAKIAlwdWJsaWMgaW50IGVuZDsKIAlwdWJsaWMgaW50IGxpbmVOdW1iZXI7CiAJcHVibGljIGludCBpbmRleDsKLQkKKwogCXB1YmxpYyBOTFNUYWcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZU51bWJlciwgaW50IGluZGV4KSB7CiAJCXRoaXMuc3RhcnQgPSBzdGFydDsKIAkJdGhpcy5lbmQgPSBlbmQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQppbmRleCAxZWNhM2ZhLi43NDFlOGZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIFRvbSBUcm9tZXkgLSBwYXRjaCBmb3IgcmVhZFRhYmxlKFN0cmluZykgYXMgZGVzY3JpYmVkIGluIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTk2CkBAIC0zNCw3ICszNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5kaWFnbm9zZS5EaWFnbm9zZVBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwpAQCAtNDUsMTYgKzQ0LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIFBhcnNlciBpbXBsZW1lbnRzICBQYXJzZXJCYXNpY0luZm9ybWF0aW9uLCBUZXJtaW5hbFRva2VucywgT3BlcmF0b3JJZHMsIFR5cGVJZHMgeworCQogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRISVNfQ0FMTCA9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXM7CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVJfQ0FMTCA9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyOwotCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRkFMTF9USFJPVUdIX1RBRyA9ICIkRkFMTC1USFJPVUdIJCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQogCXB1YmxpYyBzdGF0aWMgY2hhciBhc2JbXSA9IG51bGw7CiAJcHVibGljIHN0YXRpYyBjaGFyIGFzcltdID0gbnVsbDsKIAkvL2FzdCBzdGFjawogCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEFzdFN0YWNrSW5jcmVtZW50ID0gMTAwOwogCXB1YmxpYyBzdGF0aWMgY2hhciBiYXNlX2FjdGlvbltdID0gbnVsbDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCcmFja2V0S2luZHMgPSAzOwotICAgIAorCiAJcHVibGljIHN0YXRpYyBzaG9ydCBjaGVja190YWJsZVtdID0gbnVsbDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDdXJseUJyYWNrZXQgPSAyOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKQEAgLTY1LDcgKzY2LDcgQEAKIAlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBFeHByZXNzaW9uU3RhY2tJbmNyZW1lbnQgPSAxMDA7CiAKIAlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBHZW5lcmljc1N0YWNrSW5jcmVtZW50ID0gMTA7Ci0gICAgCisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRVBSRUZJWCA9ICJwYXJzZXIiOyAvLyROT04tTkxTLTEkCiAgICAgcHVibGljIHN0YXRpYyBjaGFyIGluX3N5bWJbXSA9IG51bGw7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfQ0hBUkFDVEVSID0gIkludmFsaWQgQ2hhcmFjdGVyIiA7IC8vJE5PTi1OTFMtMSQKQEAgLTc5LDIxICs4MCwyMSBAQAogCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRUFEQUJMRV9OQU1FU19GSUxFX05BTUUgPQogCQkib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4iICsgUkVBREFCTEVfTkFNRVNfRklMRTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlTmFtZVtdID0gbnVsbDsKLQkKKwogCXB1YmxpYyBzdGF0aWMgYnl0ZSByaHNbXSA9IG51bGw7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGludFtdIHJldmVyc2VfaW5kZXggPSBudWxsOwogCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlY292ZXJ5X3RlbXBsYXRlc19pbmRleCA9IG51bGw7CiAJcHVibGljIHN0YXRpYyBjaGFyW10gcmVjb3ZlcnlfdGVtcGxhdGVzID0gbnVsbDsKIAlwdWJsaWMgc3RhdGljIGNoYXJbXSBzdGF0ZW1lbnRzX3JlY292ZXJ5X2ZpbHRlciA9IG51bGw7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGxvbmcgcnVsZXNfY29tcGxpYW5jZVtdID0gIG51bGw7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3VuZEJyYWNrZXQgPSAwOwotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBieXRlIHNjb3BlX2xhW10gPSBudWxsOwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciBzY29wZV9saHNbXSA9IG51bGw7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGNoYXIgc2NvcGVfcHJlZml4W10gPSBudWxsOwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciBzY29wZV9yaHNbXSA9IG51bGw7CiAgICAgcHVibGljIHN0YXRpYyBjaGFyIHNjb3BlX3N0YXRlW10gPSBudWxsOwpAQCAtMTAxLDEwICsxMDIsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGNoYXIgc2NvcGVfc3RhdGVfc2V0W10gPSBudWxsOwogICAgIHB1YmxpYyBzdGF0aWMgY2hhciBzY29wZV9zdWZmaXhbXSA9IG51bGw7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3F1YXJlQnJhY2tldCA9IDE7Ci0JCQotCS8vaW50ZXJuYWwgZGF0YSBmb3IgdGhlIGF1dG9tYXQgCisKKwkvL2ludGVybmFsIGRhdGEgZm9yIHRoZSBhdXRvbWF0CiAJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU3RhY2tJbmNyZW1lbnQgPSAyNTU7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGNoYXIgdGVybV9hY3Rpb25bXSA9IG51bGw7CiAJcHVibGljIHN0YXRpYyBieXRlIHRlcm1fY2hlY2tbXSA9IG51bGw7CiAKQEAgLTExMywxMyArMTE0LDY2OCBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX0VPRiA9ICJVbmV4cGVjdGVkIEVuZCBPZiBGaWxlIiA7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRV9SRUNPVkVSWSA9IGZhbHNlOwogCisJc3RhdGljIHsKKwkJdHJ5eworCQkJaW5pdFRhYmxlcygpOworCQl9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpeworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleC5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IGFzaShpbnQgc3RhdGUpIHsKKwkKKwkJcmV0dXJuIGFzYltvcmlnaW5hbF9zdGF0ZShzdGF0ZSldOworCX0KKwlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IGJhc2VfY2hlY2soaW50IGkpIHsKKwkJcmV0dXJuIGNoZWNrX3RhYmxlW2kgLSAoTlVNX1JVTEVTICsgMSldOworCX0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZShTdHJpbmcgZmlsZW5hbWUsIExpc3QgbGlzdFRvRHVtcCkgeworCQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOworCQl0cnkgeworCQkJd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKSk7CisJICAgIAlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdFRvRHVtcC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgeworCSAgICAJCXdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZihpdGVyYXRvci5uZXh0KCkpKTsKKwkgICAgCX0KKwkgICAgCXdyaXRlci5mbHVzaCgpOworCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9IGZpbmFsbHkgeworCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgICAgICAJdHJ5IHsKKwkJCQkJd3JpdGVyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICIgY3JlYXRpb24gY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZUZvckNvbXBsaWFuY2UoCisJCQlTdHJpbmcgZmlsZSwKKwkJCWludCBsZW5ndGgsCisJCQlTdHJpbmdbXSB0b2tlbnMpIHsKKwkKKwkJCWJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5ndGggKiA4XTsKKwkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSA9IGkgKyAzKSB7CisJCQkJaWYoIjIiLmVxdWFscyh0b2tlbnNbaV0pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaW50IGluZGV4ID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnNbaSArIDFdKTsKKwkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zW2kgKyAyXS50cmltKCk7CisJCQkJCWxvbmcgY29tcGxpYW5jZSA9IDA7CisJCQkJCWlmKCIxLjQiLmVxdWFscyh0b2tlbikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJY29tcGxpYW5jZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7CisJCQkJCX0gZWxzZSBpZigiMS41Ii5lcXVhbHModG9rZW4pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNvbXBsaWFuY2UgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQkJCQl9IGVsc2UgaWYoInJlY292ZXJ5Ii5lcXVhbHModG9rZW4pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNvbXBsaWFuY2UgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLX0RFRkVSUkVEOworCQkJCQl9CisJCisJCQkJCWludCBqID0gaW5kZXggKiA4OworCQkJCQlyZXN1bHRbal0gPSAJKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDU2KTsKKwkJCQkJcmVzdWx0W2ogKyAxXSA9IChieXRlKShjb21wbGlhbmNlID4+PiA0OCk7CisJCQkJCXJlc3VsdFtqICsgMl0gPSAoYnl0ZSkoY29tcGxpYW5jZSA+Pj4gNDApOworCQkJCQlyZXN1bHRbaiArIDNdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDMyKTsKKwkJCQkJcmVzdWx0W2ogKyA0XSA9IChieXRlKShjb21wbGlhbmNlID4+PiAyNCk7CisJCQkJCXJlc3VsdFtqICsgNV0gPSAoYnl0ZSkoY29tcGxpYW5jZSA+Pj4gMTYpOworCQkJCQlyZXN1bHRbaiArIDZdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDgpOworCQkJCQlyZXN1bHRbaiArIDddID0gKGJ5dGUpKGNvbXBsaWFuY2UpOworCQkJCX0KKwkJCX0KKwkKKwkJCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGUsIHJlc3VsdCk7CisJCX0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBidWlsZEZpbGVGb3JOYW1lKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB7CisJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29udGVudHMubGVuZ3RoKCldOworCQlyZXN1bHRbMF0gPSBudWxsOworCQlpbnQgcmVzdWx0Q291bnQgPSAxOworCQorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQorCQlpbnQgc3RhcnQgPSBjb250ZW50cy5pbmRleE9mKCJuYW1lW10iKTsgLy8kTk9OLU5MUy0xJAorCQlzdGFydCA9IGNvbnRlbnRzLmluZGV4T2YoJ1wiJywgc3RhcnQpOworCQlpbnQgZW5kID0gY29udGVudHMuaW5kZXhPZigifTsiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisJCisJCWJvb2xlYW4gYWRkTGluZVNlcGFyYXRvciA9IGZhbHNlOworCQlpbnQgdG9rZW5TdGFydCA9IC0xOworCQlTdHJpbmdCdWZmZXIgY3VycmVudFRva2VuID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aCgpOyBpKyspIHsKKwkJCWNoYXIgYyA9IGNvbnRlbnRzLmNoYXJBdChpKTsKKwkJCWlmKGMgPT0gJ1wiJykgeworCQkJCWlmKHRva2VuU3RhcnQgPT0gLTEpIHsKKwkJCQkJdG9rZW5TdGFydCA9IGkgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmKGFkZExpbmVTZXBhcmF0b3IpIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CisJCQkJCQlyZXN1bHRbcmVzdWx0Q291bnQrK10gPSBjdXJyZW50VG9rZW4udG9TdHJpbmcoKTsKKwkJCQkJCWN1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQkJfQorCQkJCQlTdHJpbmcgdG9rZW4gPSBjb250ZW50cy5zdWJzdHJpbmcodG9rZW5TdGFydCwgaSk7CisJCQkJCWlmKHRva2VuLmVxdWFscyhFUlJPUl9UT0tFTikpeworCQkJCQkJdG9rZW4gPSBJTlZBTElEX0NIQVJBQ1RFUjsKKwkJCQkJfSBlbHNlIGlmKHRva2VuLmVxdWFscyhFT0ZfVE9LRU4pKSB7CisJCQkJCQl0b2tlbiA9IFVORVhQRUNURURfRU9GOworCQkJCQl9CisJCQkJCWJ1ZmZlci5hcHBlbmQodG9rZW4pOworCQkJCQljdXJyZW50VG9rZW4uYXBwZW5kKHRva2VuKTsKKwkJCQkJYWRkTGluZVNlcGFyYXRvciA9IHRydWU7CisJCQkJCXRva2VuU3RhcnQgPSAtMTsKKwkJCQl9CisJCQl9CisJCQlpZih0b2tlblN0YXJ0ID09IC0xICYmIGMgPT0gJysnKXsKKwkJCQlhZGRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYoY3VycmVudFRva2VuLmxlbmd0aCgpID4gMCkgeworCQkJcmVzdWx0W3Jlc3VsdENvdW50KytdID0gY3VycmVudFRva2VuLnRvU3RyaW5nKCk7CisJCX0KKwkKKwkJYnVpbGRGaWxlRm9yVGFibGUoZmlsZW5hbWUsIGJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCkpOworCQorCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgcmVzdWx0ID0gbmV3IFN0cmluZ1tyZXN1bHRDb3VudF0sIDAsIHJlc3VsdENvdW50KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEZpbGVGb3JSZWFkYWJsZU5hbWUoCisJCVN0cmluZyBmaWxlLAorCQljaGFyW10gbmV3TGhzLAorCQljaGFyW10gbmV3Tm9uVGVybWluYWxJbmRleCwKKwkJU3RyaW5nW10gbmV3TmFtZSwKKwkJU3RyaW5nW10gdG9rZW5zKSB7CisJCisJCUFycmF5TGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworCQorCQlib29sZWFuW10gYWxyZWFkeUFkZGVkID0gbmV3IGJvb2xlYW5bbmV3TmFtZS5sZW5ndGhdOworCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMykgeworCQkJaWYoIjEiLmVxdWFscyh0b2tlbnNbaV0pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbnQgaW5kZXggPSBuZXdOb25UZXJtaW5hbEluZGV4W25ld0xoc1tJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1tpICsgMV0pXV07CisJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZighYWxyZWFkeUFkZGVkW2luZGV4XSkgeworCQkJCQlhbHJlYWR5QWRkZWRbaW5kZXhdID0gdHJ1ZTsKKwkJCQkJYnVmZmVyLmFwcGVuZChuZXdOYW1lW2luZGV4XSk7CisJCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKKwkJCQkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaSsyXS50cmltKCkpOworCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOworCQkJCQllbnRyaWVzLmFkZChTdHJpbmcudmFsdWVPZihidWZmZXIpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW50IGkgPSAxOworCQl3aGlsZSghSU5WQUxJRF9DSEFSQUNURVIuZXF1YWxzKG5ld05hbWVbaV0pKSBpKys7CisJCWkrKzsKKwkJZm9yICg7IGkgPCBhbHJlYWR5QWRkZWQubGVuZ3RoOyBpKyspIHsKKwkJCWlmKCFhbHJlYWR5QWRkZWRbaV0pIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3TmFtZVtpXSArICIgaGFzIG5vIHJlYWRhYmxlIG5hbWUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCUNvbGxlY3Rpb25zLnNvcnQoZW50cmllcyk7CisJCWJ1aWxkRmlsZShmaWxlLCBlbnRyaWVzKTsKKwl9CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBidWlsZEZpbGVGb3JUYWJsZShTdHJpbmcgZmlsZW5hbWUsIGJ5dGVbXSBieXRlcykgeworCQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXN0cmVhbSA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOworCQkJc3RyZWFtLndyaXRlKGJ5dGVzKTsKKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICIgY3JlYXRpb24gY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZUZvclRhYmxlKFN0cmluZyBmaWxlbmFtZSwgY2hhcltdIGNoYXJzKSB7CisJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2NoYXJzLmxlbmd0aCAqIDJdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQlieXRlc1syICogaV0gPSAoYnl0ZSkgKGNoYXJzW2ldID4+PiA4KTsKKwkJCWJ5dGVzWzIgKiBpICsgMV0gPSAoYnl0ZSkgKGNoYXJzW2ldICYgMHhGRik7CisJCX0KKwkKKwkJamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKKwkJCXN0cmVhbS53cml0ZShieXRlcyk7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0gZmluYWxseSB7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KKwkJCX0KKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZW5hbWUgKyAiIGNyZWF0aW9uIGNvbXBsZXRlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIGJ1aWxkRmlsZU9mQnl0ZUZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0YWcsIFN0cmluZ1tdIHRva2VucykgeworCQorCQkvL3RyYW5zZm9ybSB0aGUgU3RyaW5nIHRva2VucyBpbnRvIGNoYXJzIGJlZm9yZSBkdW1waW5nIHRoZW4gaW50byBmaWxlCisJCisJCWludCBpID0gMDsKKwkJLy9yZWFkIHVwdG8gdGhlIHRhZworCQl3aGlsZSAoIXRva2Vuc1tpKytdLmVxdWFscyh0YWcpKXsvKmVtcHR5Ki99CisJCS8vcmVhZCB1cHRvIHRoZSB9CisJCisJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3Rva2Vucy5sZW5ndGhdOyAvL2Nhbid0IGJlIGJpZ2dlcgorCQlpbnQgaWMgPSAwOworCQlTdHJpbmcgdG9rZW47CisJCXdoaWxlICghKHRva2VuID0gdG9rZW5zW2krK10pLmVxdWFscygifSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWludCBjID0gSW50ZWdlci5wYXJzZUludCh0b2tlbik7CisJCQlieXRlc1tpYysrXSA9IChieXRlKSBjOworCQl9CisJCisJCS8vcmVzaXplCisJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIGJ5dGVzID0gbmV3IGJ5dGVbaWNdLCAwLCBpYyk7CisJCisJCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGVuYW1lLCBieXRlcyk7CisJCXJldHVybiBieXRlczsKKwl9CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIGJ1aWxkRmlsZU9mSW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRhZywgU3RyaW5nW10gdG9rZW5zKSB7CisJCisJCS8vdHJhbnNmb3JtIHRoZSBTdHJpbmcgdG9rZW5zIGludG8gY2hhcnMgYmVmb3JlIGR1bXBpbmcgdGhlbiBpbnRvIGZpbGUKKwkKKwkJaW50IGkgPSAwOworCQkvL3JlYWQgdXB0byB0aGUgdGFnCisJCXdoaWxlICghdG9rZW5zW2krK10uZXF1YWxzKHRhZykpey8qZW1wdHkqL30KKwkJLy9yZWFkIHVwdG8gdGhlIH0KKwkKKwkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbdG9rZW5zLmxlbmd0aF07IC8vY2FuJ3QgYmUgYmlnZ2VyCisJCWludCBpYyA9IDA7CisJCVN0cmluZyB0b2tlbjsKKwkJd2hpbGUgKCEodG9rZW4gPSB0b2tlbnNbaSsrXSkuZXF1YWxzKCJ9IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuKTsKKwkJCWNoYXJzW2ljKytdID0gKGNoYXIpIGM7CisJCX0KKwkKKwkJLy9yZXNpemUKKwkJU3lzdGVtLmFycmF5Y29weShjaGFycywgMCwgY2hhcnMgPSBuZXcgY2hhcltpY10sIDAsIGljKTsKKwkKKwkJYnVpbGRGaWxlRm9yVGFibGUoZmlsZW5hbWUsIGNoYXJzKTsKKwkJcmV0dXJuIGNoYXJzOworCX0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZU9mU2hvcnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGFnLCBTdHJpbmdbXSB0b2tlbnMpIHsKKwkKKwkJLy90cmFuc2Zvcm0gdGhlIFN0cmluZyB0b2tlbnMgaW50byBjaGFycyBiZWZvcmUgZHVtcGluZyB0aGVuIGludG8gZmlsZQorCQorCQlpbnQgaSA9IDA7CisJCS8vcmVhZCB1cHRvIHRoZSB0YWcKKwkJd2hpbGUgKCF0b2tlbnNbaSsrXS5lcXVhbHModGFnKSl7LyplbXB0eSovfQorCQkvL3JlYWQgdXB0byB0aGUgfQorCQorCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhclt0b2tlbnMubGVuZ3RoXTsgLy9jYW4ndCBiZSBiaWdnZXIKKwkJaW50IGljID0gMDsKKwkJU3RyaW5nIHRva2VuOworCQl3aGlsZSAoISh0b2tlbiA9IHRva2Vuc1tpKytdKS5lcXVhbHMoIn0iKSkgeyAvLyROT04tTkxTLTEkCisJCQlpbnQgYyA9IEludGVnZXIucGFyc2VJbnQodG9rZW4pOworCQkJY2hhcnNbaWMrK10gPSAoY2hhcikgKGMgKyAzMjc2OCk7CisJCX0KKwkKKwkJLy9yZXNpemUKKwkJU3lzdGVtLmFycmF5Y29weShjaGFycywgMCwgY2hhcnMgPSBuZXcgY2hhcltpY10sIDAsIGljKTsKKwkKKwkJYnVpbGRGaWxlRm9yVGFibGUoZmlsZW5hbWUsIGNoYXJzKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEZpbGVzRm9yUmVjb3ZlcnlUZW1wbGF0ZXMoCisJCVN0cmluZyBpbmRleEZpbGVuYW1lLAorCQlTdHJpbmcgdGVtcGxhdGVzRmlsZW5hbWUsCisJCWNoYXJbXSBuZXdUZXJtaW5hbEluZGV4LAorCQljaGFyW10gbmV3Tm9uVGVybWluYWxJbmRleCwKKwkJU3RyaW5nW10gbmV3TmFtZSwKKwkJY2hhcltdIG5ld0xocywKKwkJU3RyaW5nW10gdG9rZW5zKSB7CisJCisJCWludFtdIG5ld1JldmVyc2UgPSBjb21wdXRlUmV2ZXJzZVRhYmxlKG5ld1Rlcm1pbmFsSW5kZXgsIG5ld05vblRlcm1pbmFsSW5kZXgsIG5ld05hbWUpOworCQorCQljaGFyW10gbmV3UmVjb3ZleVRlbXBsYXRlc0luZGV4ID0gbmV3IGNoYXJbbmV3Tm9uVGVybWluYWxJbmRleC5sZW5ndGhdOworCQljaGFyW10gbmV3UmVjb3ZleVRlbXBsYXRlcyA9IG5ldyBjaGFyW25ld05vblRlcm1pbmFsSW5kZXgubGVuZ3RoXTsKKwkJaW50IG5ld1JlY292ZXlUZW1wbGF0ZXNQdHIgPSAwOworCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMykgeworCQkJaWYoIjMiLmVxdWFscyh0b2tlbnNbaV0pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbnQgbGVuZ3RoID0gbmV3UmVjb3ZleVRlbXBsYXRlcy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IG5ld1JlY292ZXlUZW1wbGF0ZXNQdHIgKyAxKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3UmVjb3ZleVRlbXBsYXRlcywgMCwgbmV3UmVjb3ZleVRlbXBsYXRlcyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCQkJCX0KKwkJCQluZXdSZWNvdmV5VGVtcGxhdGVzW25ld1JlY292ZXlUZW1wbGF0ZXNQdHIrK10gPSAwOworCQorCQkJCWludCBpbmRleCA9IG5ld0xoc1tJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1tpICsgMV0pXTsKKwkKKwkJCQluZXdSZWNvdmV5VGVtcGxhdGVzSW5kZXhbaW5kZXhdID0gKGNoYXIpbmV3UmVjb3ZleVRlbXBsYXRlc1B0cjsKKwkKKwkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnNbaSArIDJdLnRyaW0oKTsKKwkJCQlqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIodG9rZW4sICIgIik7ICAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nW10gdGVybWluYWxOYW1lcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07CisJCQkJaW50IHQgPSAwOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJdGVybWluYWxOYW1lc1t0KytdID0gc3QubmV4dFRva2VuKCk7CisJCQkJfQorCQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGVybWluYWxOYW1lcy5sZW5ndGg7IGorKykgeworCQkJCQlpbnQgc3ltYm9sID0gZ2V0U3ltYm9sKHRlcm1pbmFsTmFtZXNbal0sIG5ld05hbWUsIG5ld1JldmVyc2UpOworCQkJCQlpZihzeW1ib2wgPiAtMSkgeworCQkJCQkJbGVuZ3RoID0gbmV3UmVjb3ZleVRlbXBsYXRlcy5sZW5ndGg7CisJCQkJCQlpZihsZW5ndGggPT0gbmV3UmVjb3ZleVRlbXBsYXRlc1B0ciArIDEpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1JlY292ZXlUZW1wbGF0ZXMsIDAsIG5ld1JlY292ZXlUZW1wbGF0ZXMgPSBuZXcgY2hhcltsZW5ndGggKiAyXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCX0KKwkJCQkJCW5ld1JlY292ZXlUZW1wbGF0ZXNbbmV3UmVjb3ZleVRlbXBsYXRlc1B0cisrXSA9IChjaGFyKXN5bWJvbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQluZXdSZWNvdmV5VGVtcGxhdGVzW25ld1JlY292ZXlUZW1wbGF0ZXNQdHIrK10gPSAwOworCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1JlY292ZXlUZW1wbGF0ZXMsIDAsIG5ld1JlY292ZXlUZW1wbGF0ZXMgPSBuZXcgY2hhcltuZXdSZWNvdmV5VGVtcGxhdGVzUHRyXSwgMCwgbmV3UmVjb3ZleVRlbXBsYXRlc1B0cik7CisJCisJCWJ1aWxkRmlsZUZvclRhYmxlKGluZGV4RmlsZW5hbWUsIG5ld1JlY292ZXlUZW1wbGF0ZXNJbmRleCk7CisJCWJ1aWxkRmlsZUZvclRhYmxlKHRlbXBsYXRlc0ZpbGVuYW1lLCBuZXdSZWNvdmV5VGVtcGxhdGVzKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEZpbGVzRm9yU3RhdGVtZW50c1JlY292ZXJ5RmlsdGVyKAorCQkJU3RyaW5nIGZpbGVuYW1lLAorCQkJY2hhcltdIG5ld05vblRlcm1pbmFsSW5kZXgsCisJCQljaGFyW10gbmV3TGhzLAorCQkJU3RyaW5nW10gdG9rZW5zKSB7CisJCisJCQljaGFyW10gbmV3U3RhdGVtZW50c1JlY292ZXJ5RmlsdGVyID0gbmV3IGNoYXJbbmV3Tm9uVGVybWluYWxJbmRleC5sZW5ndGhdOworCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpID0gaSArIDMpIHsKKwkJCQlpZigiNCIuZXF1YWxzKHRva2Vuc1tpXSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlpbnQgaW5kZXggPSBuZXdMaHNbSW50ZWdlci5wYXJzZUludCh0b2tlbnNbaSArIDFdKV07CisJCisJCQkJCW5ld1N0YXRlbWVudHNSZWNvdmVyeUZpbHRlcltpbmRleF0gPSAxOworCQkJCX0KKwkJCX0KKwkJCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGVuYW1lLCBuZXdTdGF0ZW1lbnRzUmVjb3ZlcnlGaWx0ZXIpOworCQl9CisJcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZXNGcm9tTFBHKFN0cmluZyBkYXRhRmlsZW5hbWUsIFN0cmluZyBkYXRhRmlsZW5hbWUyKSB7CisJCisJCS8vUlVOIFRISVMgTUVUSE9EIFRPIEdFTkVSQVRFIFBBUlNFUiouUlNDIEZJTEVTCisJCisJCS8vYnVpbGQgZnJvbSB0aGUgbHBnIGphdmFkY2wuamF2YSBmaWxlcyB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnNlciB0YWJsZXMKKwkJLy9saHMgY2hlY2tfdGFibGUgYXNiIGFzciBzeW1ib2xfaW5kZXgKKwkKKwkJLy9bb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXIuYnVpbGRGaWxlc0Zyb21MUEcoImQ6L2xlYXBmcm9nL2dyYW1tYXIvamF2YWRjbC5qYXZhIildCisJCWNoYXJbXSBjb250ZW50cyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJdHJ5IHsKKwkJCWNvbnRlbnRzID0gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUoZGF0YUZpbGVuYW1lKSwgbnVsbCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMucGFyc2VyX2luY29ycmVjdFBhdGgpOworCQkJcmV0dXJuOworCQl9CisJCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgc3QgPQorCQkJbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIobmV3IFN0cmluZyhjb250ZW50cyksICIgXHRcblxyW109eyw7Iik7ICAvLyROT04tTkxTLTEkCisJCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07CisJCWludCBqID0gMDsKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJdG9rZW5zW2orK10gPSBzdC5uZXh0VG9rZW4oKTsKKwkJfQorCQlmaW5hbCBTdHJpbmcgcHJlZml4ID0gRklMRVBSRUZJWDsKKwkJaW50IGkgPSAwOworCQorCQljaGFyW10gbmV3TGhzID0gYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJsaHMiLCB0b2tlbnMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJYnVpbGRGaWxlT2ZTaG9ydEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImNoZWNrX3RhYmxlIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAiYXNiIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAiYXNyIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAibmFzYiIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgIm5hc3IiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJY2hhcltdIG5ld1Rlcm1pbmFsSW5kZXggPSBidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInRlcm1pbmFsX2luZGV4IiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWNoYXJbXSBuZXdOb25UZXJtaW5hbEluZGV4ID0gYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJub25fdGVybWluYWxfaW5kZXgiLCB0b2tlbnMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJ0ZXJtX2FjdGlvbiIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3ByZWZpeCIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3N1ZmZpeCIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX2xocyIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3N0YXRlX3NldCIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3JocyIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3N0YXRlIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAiaW5fc3ltYiIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQorCQlieXRlW10gbmV3UmhzID0gYnVpbGRGaWxlT2ZCeXRlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAicmhzIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWJ1aWxkRmlsZU9mQnl0ZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInRlcm1fY2hlY2siLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJYnVpbGRGaWxlT2ZCeXRlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAic2NvcGVfbGEiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkKKwkJU3RyaW5nW10gbmV3TmFtZSA9IGJ1aWxkRmlsZUZvck5hbWUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsIG5ldyBTdHJpbmcoY29udGVudHMpKTsgLy8kTk9OLU5MUy0xJAorCQorCQljb250ZW50cyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJdHJ5IHsKKwkJCWNvbnRlbnRzID0gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUoZGF0YUZpbGVuYW1lMiksIG51bGwpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLnBhcnNlcl9pbmNvcnJlY3RQYXRoKTsKKwkJCXJldHVybjsKKwkJfQorCQlzdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKG5ldyBTdHJpbmcoY29udGVudHMpLCAiXHRcblxyIyIpOyAgLy8kTk9OLU5MUy0xJAorCQl0b2tlbnMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOworCQlqID0gMDsKKwkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJdG9rZW5zW2orK10gPSBzdC5uZXh0VG9rZW4oKTsKKwkJfQorCQorCQlidWlsZEZpbGVGb3JDb21wbGlhbmNlKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCBuZXdSaHMubGVuZ3RoLCB0b2tlbnMpOy8vJE5PTi1OTFMtMSQKKwkJYnVpbGRGaWxlRm9yUmVhZGFibGVOYW1lKFJFQURBQkxFX05BTUVTX0ZJTEUrIi5wcm9wZXJ0aWVzIiwgbmV3TGhzLCBuZXdOb25UZXJtaW5hbEluZGV4LCBuZXdOYW1lLCB0b2tlbnMpOy8vJE5PTi1OTFMtMSQKKwkKKwkJYnVpbGRGaWxlc0ZvclJlY292ZXJ5VGVtcGxhdGVzKAorCQkJCXByZWZpeCArICgrK2kpICsgIi5yc2MiLCAvLyROT04tTkxTLTEkCisJCQkJcHJlZml4ICsgKCsraSkgKyAiLnJzYyIsIC8vJE5PTi1OTFMtMSQKKwkJCQluZXdUZXJtaW5hbEluZGV4LAorCQkJCW5ld05vblRlcm1pbmFsSW5kZXgsCisJCQkJbmV3TmFtZSwKKwkJCQluZXdMaHMsCisJCQkJdG9rZW5zKTsKKwkKKwkJYnVpbGRGaWxlc0ZvclN0YXRlbWVudHNSZWNvdmVyeUZpbHRlcigKKwkJCQlwcmVmaXggKyAoKytpKSArICIucnNjIiwgLy8kTk9OLU5MUy0xJAorCQkJCW5ld05vblRlcm1pbmFsSW5kZXgsCisJCQkJbmV3TGhzLAorCQkJCXRva2Vucyk7CisJCisJCisJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5wYXJzZXJfbW92ZUZpbGVzKTsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBpbnRbXSBjb21wdXRlUmV2ZXJzZVRhYmxlKGNoYXJbXSBuZXdUZXJtaW5hbEluZGV4LCBjaGFyW10gbmV3Tm9uVGVybWluYWxJbmRleCwgU3RyaW5nW10gbmV3TmFtZSkgeworCQlpbnRbXSBuZXdSZXZlcnNlVGFibGUgPSBuZXcgaW50W25ld05hbWUubGVuZ3RoXTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdOYW1lLmxlbmd0aDsgaisrKSB7CisJCQlmb3VuZCA6IHsKKwkJCQlmb3IgKGludCBrID0gMDsgayA8IG5ld1Rlcm1pbmFsSW5kZXgubGVuZ3RoOyBrKyspIHsKKwkJCQkJaWYobmV3VGVybWluYWxJbmRleFtrXSA9PSBqKSB7CisJCQkJCQluZXdSZXZlcnNlVGFibGVbal0gPSBrOworCQkJCQkJYnJlYWsgZm91bmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBuZXdOb25UZXJtaW5hbEluZGV4Lmxlbmd0aDsgaysrKSB7CisJCQkJCWlmKG5ld05vblRlcm1pbmFsSW5kZXhba10gPT0gaikgeworCQkJCQkJbmV3UmV2ZXJzZVRhYmxlW2pdID0gLWs7CisJCQkJCQlicmVhayBmb3VuZDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3UmV2ZXJzZVRhYmxlOworCX0KIAorCXByaXZhdGUgc3RhdGljIGludCBnZXRTeW1ib2woU3RyaW5nIHRlcm1pbmFsTmFtZSwgU3RyaW5nW10gbmV3TmFtZSwgaW50W10gbmV3UmV2ZXJzZSkgeworCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld05hbWUubGVuZ3RoOyBqKyspIHsKKwkJCWlmKHRlcm1pbmFsTmFtZS5lcXVhbHMobmV3TmFtZVtqXSkpIHsKKwkJCQlyZXR1cm4gbmV3UmV2ZXJzZVtqXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IGluX3N5bWJvbChpbnQgc3RhdGUpIHsKKwkJcmV0dXJuIGluX3N5bWJbb3JpZ2luYWxfc3RhdGUoc3RhdGUpXTsKKwl9CisJcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGluaXRUYWJsZXMoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCisJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBGSUxFUFJFRklYOworCQlpbnQgaSA9IDA7CisJCWxocyA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJY2hhcltdIGNoYXJzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCQljaGVja190YWJsZSA9IG5ldyBzaG9ydFtjaGFycy5sZW5ndGhdOworCQlmb3IgKGludCBjID0gY2hhcnMubGVuZ3RoOyBjLS0gPiAwOykgeworCQkJY2hlY2tfdGFibGVbY10gPSAoc2hvcnQpIChjaGFyc1tjXSAtIDMyNzY4KTsKKwkJfQorCQlhc2IgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCWFzciA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJbmFzYiA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJbmFzciA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVybWluYWxfaW5kZXggPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCW5vbl90ZXJtaW5hbF9pbmRleCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVybV9hY3Rpb24gPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCisJCXNjb3BlX3ByZWZpeCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJc2NvcGVfc3VmZml4ID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCQlzY29wZV9saHMgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCXNjb3BlX3N0YXRlX3NldCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJc2NvcGVfcmhzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCQlzY29wZV9zdGF0ZSA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJaW5fc3ltYiA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkKKwkJcmhzID0gcmVhZEJ5dGVUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVybV9jaGVjayA9IHJlYWRCeXRlVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCXNjb3BlX2xhID0gcmVhZEJ5dGVUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkKKwkJbmFtZSA9IHJlYWROYW1lVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJCisJCXJ1bGVzX2NvbXBsaWFuY2UgPSByZWFkTG9uZ1RhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCQorCQlyZWFkYWJsZU5hbWUgPSByZWFkUmVhZGFibGVOYW1lVGFibGUoUkVBREFCTEVfTkFNRVNfRklMRV9OQU1FKTsKKwkKKwkJcmV2ZXJzZV9pbmRleCA9IGNvbXB1dGVSZXZlcnNlVGFibGUodGVybWluYWxfaW5kZXgsIG5vbl90ZXJtaW5hbF9pbmRleCwgbmFtZSk7CisJCisJCXJlY292ZXJ5X3RlbXBsYXRlc19pbmRleCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVjb3ZlcnlfdGVtcGxhdGVzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCQorCQlzdGF0ZW1lbnRzX3JlY292ZXJ5X2ZpbHRlciA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwkKKwkJYmFzZV9hY3Rpb24gPSBsaHM7CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IG5hc2koaW50IHN0YXRlKSB7CisJCXJldHVybiBuYXNiW29yaWdpbmFsX3N0YXRlKHN0YXRlKV07CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IG50QWN0aW9uKGludCBzdGF0ZSwgaW50IHN5bSkgeworCQlyZXR1cm4gYmFzZV9hY3Rpb25bc3RhdGUgKyBzeW1dOworCX0KKwlwcm90ZWN0ZWQgc3RhdGljIGludCBvcmlnaW5hbF9zdGF0ZShpbnQgc3RhdGUpIHsKKwkJcmV0dXJuIC1iYXNlX2NoZWNrKHN0YXRlKTsKKwl9CiAKKwlwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZVRhYmxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCQorCQkvL2ZpbGVzIGFyZSBsb2NhdGVkIGF0IFBhcnNlci5jbGFzcyBkaXJlY3RvcnkKKwkKKwkJSW5wdXRTdHJlYW0gc3RyZWFtID0gUGFyc2VyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUpOworCQlpZiAoc3RyZWFtID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMucGFyc2VyX21pc3NpbmdGaWxlLCBmaWxlbmFtZSkpOworCQl9CisJCWJ5dGVbXSBieXRlcyA9IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOworCQkJYnl0ZXMgPSBVdGlsLmdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAtMSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9CisJCXJldHVybiBieXRlczsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBsb25nW10gcmVhZExvbmdUYWJsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwkKKwkJLy9maWxlcyBhcmUgbG9jYXRlZCBhdCBQYXJzZXIuY2xhc3MgZGlyZWN0b3J5CisJCisJCUlucHV0U3RyZWFtIHN0cmVhbSA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKKwkJaWYgKHN0cmVhbSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnBhcnNlcl9taXNzaW5nRmlsZSwgZmlsZW5hbWUpKTsKKwkJfQorCQlieXRlW10gYnl0ZXMgPSBudWxsOworCQl0cnkgeworCQkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKKwkJCWJ5dGVzID0gVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCQorCQkvL21pbmltYWwgaW50ZWdyaXR5IGNoZWNrIChldmVuIHNpemUgZXhwZWN0ZWQpCisJCWludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisJCWlmIChsZW5ndGggJSA4ICE9IDApCisJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnBhcnNlcl9jb3JydXB0ZWRGaWxlLCBmaWxlbmFtZSkpOworCQorCQkvLyBjb252ZXJ0IGJ5dGVzIGludG8gbG9uZ3MKKwkJbG9uZ1tdIGxvbmdzID0gbmV3IGxvbmdbbGVuZ3RoIC8gOF07CisJCWludCBpID0gMDsKKwkJaW50IGxvbmdJbmRleCA9IDA7CisJCisJCXdoaWxlICh0cnVlKSB7CisJCQlsb25nc1tsb25nSW5kZXgrK10gPQorCQkJICAoKChsb25nKSAoYnl0ZXNbaSsrXSAmIDB4RkYpKSA8PCA1NikKKwkJCSsgKCgobG9uZykgKGJ5dGVzW2krK10gJiAweEZGKSkgPDwgNDgpCisJCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDQwKQorCQkJKyAoKChsb25nKSAoYnl0ZXNbaSsrXSAmIDB4RkYpKSA8PCAzMikKKwkJCSsgKCgobG9uZykgKGJ5dGVzW2krK10gJiAweEZGKSkgPDwgMjQpCisJCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDE2KQorCQkJKyAoKChsb25nKSAoYnl0ZXNbaSsrXSAmIDB4RkYpKSA8PCA4KQorCQkJKyAoYnl0ZXNbaSsrXSAmIDB4RkYpOworCQorCQkJaWYgKGkgPT0gbGVuZ3RoKQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBsb25nczsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIHJlYWROYW1lVGFibGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCWNoYXJbXSBjb250ZW50cyA9IHJlYWRUYWJsZShmaWxlbmFtZSk7CisJCWNoYXJbXVtdIG5hbWVBc0NoYXIgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJ1xuJywgY29udGVudHMpOworCQorCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW25hbWVBc0NoYXIubGVuZ3RoICsgMV07CisJCXJlc3VsdFswXSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZUFzQ2hhci5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2kgKyAxXSA9IG5ldyBTdHJpbmcobmFtZUFzQ2hhcltpXSk7CisJCX0KKwkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSByZWFkUmVhZGFibGVOYW1lVGFibGUoU3RyaW5nIGZpbGVuYW1lKSB7CisJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbmFtZS5sZW5ndGhdOworCQorCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisJCXRyeSB7CisJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZmlsZW5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOworCQl9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pc3NpbmcgcmVzb3VyY2UgOiAiICsgZmlsZW5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnByb3BlcnRpZXMgZm9yIGxvY2FsZSAiICsgTG9jYWxlLmdldERlZmF1bHQoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl0aHJvdyBlOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgTlRfT0ZGU0VUICsgMTsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSBuYW1lW2ldOworCQl9CisJCWZvciAoaW50IGkgPSBOVF9PRkZTRVQ7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCVN0cmluZyBuID0gYnVuZGxlLmdldFN0cmluZyhuYW1lW2ldKTsKKwkJCQlpZihuICE9IG51bGwgJiYgbi5sZW5ndGgoKSA+IDApIHsKKwkJCQkJcmVzdWx0W2ldID0gbjsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHRbaV0gPSBuYW1lW2ldOworCQkJCX0KKwkJCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXN1bHRbaV0gPSBuYW1lW2ldOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCXByb3RlY3RlZCBzdGF0aWMgY2hhcltdIHJlYWRUYWJsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwkKKwkJLy9maWxlcyBhcmUgbG9jYXRlZCBhdCBQYXJzZXIuY2xhc3MgZGlyZWN0b3J5CisJCisJCUlucHV0U3RyZWFtIHN0cmVhbSA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKKwkJaWYgKHN0cmVhbSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnBhcnNlcl9taXNzaW5nRmlsZSwgZmlsZW5hbWUpKTsKKwkJfQorCQlieXRlW10gYnl0ZXMgPSBudWxsOworCQl0cnkgeworCQkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKKwkJCWJ5dGVzID0gVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCQorCQkvL21pbmltYWwgaW50ZWdyaXR5IGNoZWNrIChldmVuIHNpemUgZXhwZWN0ZWQpCisJCWludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisJCWlmICgobGVuZ3RoICYgMSkgIT0gMCkKKwkJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMucGFyc2VyX2NvcnJ1cHRlZEZpbGUsIGZpbGVuYW1lKSk7CisJCisJCS8vIGNvbnZlcnQgYnl0ZXMgaW50byBjaGFycworCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5ndGggLyAyXTsKKwkJaW50IGkgPSAwOworCQlpbnQgY2hhckluZGV4ID0gMDsKKwkKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWNoYXJzW2NoYXJJbmRleCsrXSA9IChjaGFyKSAoKChieXRlc1tpKytdICYgMHhGRikgPDwgOCkgKyAoYnl0ZXNbaSsrXSAmIDB4RkYpKTsKKwkJCWlmIChpID09IGxlbmd0aCkKKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gY2hhcnM7CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IHRBY3Rpb24oaW50IHN0YXRlLCBpbnQgc3ltKSB7CisJCXJldHVybiB0ZXJtX2FjdGlvblt0ZXJtX2NoZWNrW2Jhc2VfYWN0aW9uW3N0YXRlXStzeW1dID09IHN5bSA/IGJhc2VfYWN0aW9uW3N0YXRlXSArIHN5bSA6IGJhc2VfYWN0aW9uW3N0YXRlXV07CisJfQogCXByb3RlY3RlZCBpbnQgYXN0TGVuZ3RoUHRyOworCiAJcHJvdGVjdGVkIGludFtdIGFzdExlbmd0aFN0YWNrOwogCXByb3RlY3RlZCBpbnQgYXN0UHRyOwogCXByb3RlY3RlZCBBU1ROb2RlW10gYXN0U3RhY2sgPSBuZXcgQVNUTm9kZVtBc3RTdGFja0luY3JlbWVudF07CiAJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdDsgLyp0aGUgcmVzdWx0IGZyb20gcGFyc2UoKSovCisKIAlwcm90ZWN0ZWQgUmVjb3ZlcmVkRWxlbWVudCBjdXJyZW50RWxlbWVudDsKIAlwdWJsaWMgaW50IGN1cnJlbnRUb2tlbjsKIAlwcm90ZWN0ZWQgYm9vbGVhbiBkaWV0ID0gZmFsc2U7IC8vdGVsbHMgdGhlIHNjYW5uZXIgdG8ganVtcCBvdmVyIHNvbWUgcGFydHMgb2YgdGhlIGNvZGUvZXhwcmVzc2lvbnMgbGlrZSBtZXRob2QgYm9kaWVzCkBAIC0xMzEsNyArNzg3LDYgQEAKIAlwcm90ZWN0ZWQgaW50IGV4cHJlc3Npb25QdHI7CiAJcHJvdGVjdGVkIEV4cHJlc3Npb25bXSBleHByZXNzaW9uU3RhY2sgPSBuZXcgRXhwcmVzc2lvbltFeHByZXNzaW9uU3RhY2tJbmNyZW1lbnRdOwogCXB1YmxpYyBpbnQgZmlyc3RUb2tlbiA7IC8vIGhhbmRsZSBmb3IgbXVsdGlwbGUgcGFyc2luZyBnb2FscwotCiAJLy8gZ2VuZXJpY3MgbWFuYWdlbWVudAogCXByb3RlY3RlZCBpbnQgZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0cjsKIAlwcm90ZWN0ZWQgaW50W10gZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrID0gbmV3IGludFtHZW5lcmljc1N0YWNrSW5jcmVtZW50XTsKQEAgLTEzOSw3MzkgKzc5NCw4NyBAQAogCXByb3RlY3RlZCBpbnRbXSBnZW5lcmljc0xlbmd0aFN0YWNrID0gbmV3IGludFtHZW5lcmljc1N0YWNrSW5jcmVtZW50XTsKIAlwcm90ZWN0ZWQgaW50IGdlbmVyaWNzUHRyOwogCXByb3RlY3RlZCBBU1ROb2RlW10gZ2VuZXJpY3NTdGFjayA9IG5ldyBBU1ROb2RlW0dlbmVyaWNzU3RhY2tJbmNyZW1lbnRdOwotCQogCXByb3RlY3RlZCBib29sZWFuIGhhc0Vycm9yOwogCXByb3RlY3RlZCBib29sZWFuIGhhc1JlcG9ydGVkRXJyb3I7Ci0KLQkvL2lkZW50aWZpZXJzIHN0YWNrcyAKKwkvL2lkZW50aWZpZXJzIHN0YWNrcwogCXByb3RlY3RlZCBpbnQgaWRlbnRpZmllckxlbmd0aFB0cjsKIAlwcm90ZWN0ZWQgaW50W10gaWRlbnRpZmllckxlbmd0aFN0YWNrOwogCXByb3RlY3RlZCBsb25nW10gaWRlbnRpZmllclBvc2l0aW9uU3RhY2s7CiAJcHJvdGVjdGVkIGludCBpZGVudGlmaWVyUHRyOwogCXByb3RlY3RlZCBjaGFyW11bXSBpZGVudGlmaWVyU3RhY2s7Ci0JCiAJcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlTmV4dE9wZW5pbmdCcmFjZTsKKwogCS8vcG9zaXRpb25zICwgZGltZW5zaW9ucyAsIC4uLi4gKGludCBzdGFja3MpCiAJcHJvdGVjdGVkIGludCBpbnRQdHI7CisKIAlwcm90ZWN0ZWQgaW50W10gaW50U3RhY2s7CiAJcHVibGljIGludCBsYXN0QWN0IDsgLy9oYW5kbGUgZm9yIG11bHRpcGxlIHBhcnNpbmcgZ29hbHMKLQogCS8vZXJyb3IgcmVjb3ZlcnkgbWFuYWdlbWVudAogCXByb3RlY3RlZCBpbnQgbGFzdENoZWNrUG9pbnQ7CiAJcHJvdGVjdGVkIGludCBsYXN0RXJyb3JFbmRQb3NpdGlvbjsKIAlwcm90ZWN0ZWQgaW50IGxhc3RFcnJvckVuZFBvc2l0aW9uQmVmb3JlUmVjb3ZlcnkgPSAtMTsKIAlwcm90ZWN0ZWQgaW50IGxhc3RJZ25vcmVkVG9rZW4sIG5leHRJZ25vcmVkVG9rZW47CisKIAlwcm90ZWN0ZWQgaW50IGxpc3RMZW5ndGg7IC8vIGZvciByZWNvdmVyaW5nIHNvbWUgaW5jb21wbGV0ZSBsaXN0IChpbnRlcmZhY2VzLCB0aHJvd3Mgb3IgcGFyYW1ldGVycykKKwogCXByb3RlY3RlZCBpbnQgbGlzdFR5cGVQYXJhbWV0ZXJMZW5ndGg7IC8vIGZvciByZWNvdmVyaW5nIHNvbWUgaW5jb21wbGV0ZSBsaXN0ICh0eXBlIHBhcmFtZXRlcnMpCiAJcHJvdGVjdGVkIGludCBsUGFyZW5Qb3MsclBhcmVuUG9zOyAvL2FjY3VyYXRlIG9ubHkgd2hlbiB1c2VkICEKIAlwcm90ZWN0ZWQgaW50IG1vZGlmaWVyczsKIAlwcm90ZWN0ZWQgaW50IG1vZGlmaWVyc1NvdXJjZVN0YXJ0OwogCXByb3RlY3RlZCBpbnRbXSBuZXN0ZWRNZXRob2Q7IC8vdGhlIHB0ciBpcyBuZXN0ZWRUeXBlCisKIAlwcm90ZWN0ZWQgaW50IG5lc3RlZFR5cGUsIGRpbWVuc2lvbnM7CiAJQVNUTm9kZSBbXSBub0FzdE5vZGVzID0gbmV3IEFTVE5vZGVbQXN0U3RhY2tJbmNyZW1lbnRdOworCiAJRXhwcmVzc2lvbiBbXSBub0V4cHJlc3Npb25zID0gbmV3IEV4cHJlc3Npb25bRXhwcmVzc2lvblN0YWNrSW5jcmVtZW50XTsKIAkvL21vZGlmaWVycyBkaW1lbnNpb25zIG5lc3RlZFR5cGUgZXRjLi4uLi4uLgogCXByb3RlY3RlZCBib29sZWFuIG9wdGltaXplU3RyaW5nTGl0ZXJhbHMgPXRydWU7CiAJcHJvdGVjdGVkIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOworCiAJcHJvdGVjdGVkIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7CisKIAlwcm90ZWN0ZWQgaW50IHJCcmFjZVN0YXJ0LCByQnJhY2VFbmQsIHJCcmFjZVN1Y2Nlc3NvclN0YXJ0OyAvL2FjY3VyYXRlIG9ubHkgd2hlbiB1c2VkICEKLQlwcm90ZWN0ZWQgaW50IHJlYWxCbG9ja1B0cjsKLQlwcm90ZWN0ZWQgaW50W10gcmVhbEJsb2NrU3RhY2s7Ci0JcHJvdGVjdGVkIGludCByZWNvdmVyZWRTdGF0aWNJbml0aWFsaXplclN0YXJ0OwotCXB1YmxpYyBSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQ7Ci0JcHVibGljIGJvb2xlYW4gcmVwb3J0T25seU9uZVN5bnRheEVycm9yID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gcmVwb3J0U3ludGF4RXJyb3JJc1JlcXVpcmVkID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0YXJ0UmVjb3Zlcnk7Ci0JCi0JLy8gc3RhdGVtZW50IHJlY292ZXJ5Ci0vLwlwdWJsaWMgYm9vbGVhbiBzdGF0ZW1lbnRSZWNvdmVyeUVuYWJsZWQgPSB0cnVlOwotCXB1YmxpYyBib29sZWFuIG1ldGhvZFJlY292ZXJ5QWN0aXZhdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uW10gcmVjb3ZlcmVkVHlwZXM7Ci0JcHJvdGVjdGVkIGludCByZWNvdmVyZWRUeXBlUHRyOwotCXByb3RlY3RlZCBpbnQgbmV4dFR5cGVTdGFydDsKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIHBlbmRpbmdSZWNvdmVyZWRUeXBlOwotCQotCXB1YmxpYyBSZWNvdmVyeVNjYW5uZXIgcmVjb3ZlcnlTY2FubmVyOwotCQotCS8vc2Nhbm5lciB0b2tlbiAKLQlwdWJsaWMgU2Nhbm5lciBzY2FubmVyOwotCXByb3RlY3RlZCBpbnRbXSBzdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOwotCXByb3RlY3RlZCBpbnQgc3RhdGVTdGFja1RvcDsKLQlwcm90ZWN0ZWQgaW50IHN5bmNocm9uaXplZEJsb2NrU291cmNlU3RhcnQ7Ci0JcHJvdGVjdGVkIGludFtdIHZhcmlhYmxlc0NvdW50ZXI7Citwcm90ZWN0ZWQgaW50IHJlYWxCbG9ja1B0cjsKK3Byb3RlY3RlZCBpbnRbXSByZWFsQmxvY2tTdGFjazsKK3Byb3RlY3RlZCBpbnQgcmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydDsKK3B1YmxpYyBSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQ7CitwdWJsaWMgYm9vbGVhbiByZXBvcnRPbmx5T25lU3ludGF4RXJyb3IgPSBmYWxzZTsKK3B1YmxpYyBib29sZWFuIHJlcG9ydFN5bnRheEVycm9ySXNSZXF1aXJlZCA9IHRydWU7Citwcm90ZWN0ZWQgYm9vbGVhbiByZXN0YXJ0UmVjb3Zlcnk7Citwcm90ZWN0ZWQgYm9vbGVhbiBhbm5vdGF0aW9uUmVjb3ZlcnlBY3RpdmF0ZWQgPSB0cnVlOworcHJvdGVjdGVkIGludCBsYXN0UG9zaXN0aW9uOworLy8gc3RhdGVtZW50IHJlY292ZXJ5CitwdWJsaWMgYm9vbGVhbiBtZXRob2RSZWNvdmVyeUFjdGl2YXRlZCA9IGZhbHNlOworcHJvdGVjdGVkIGJvb2xlYW4gc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgPSBmYWxzZTsKK3Byb3RlY3RlZCBUeXBlRGVjbGFyYXRpb25bXSByZWNvdmVyZWRUeXBlczsKK3Byb3RlY3RlZCBpbnQgcmVjb3ZlcmVkVHlwZVB0cjsKK3Byb3RlY3RlZCBpbnQgbmV4dFR5cGVTdGFydDsKK3Byb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gcGVuZGluZ1JlY292ZXJlZFR5cGU7CitwdWJsaWMgUmVjb3ZlcnlTY2FubmVyIHJlY292ZXJ5U2Nhbm5lcjsKKy8vc2Nhbm5lciB0b2tlbgorcHVibGljIFNjYW5uZXIgc2Nhbm5lcjsKK3Byb3RlY3RlZCBpbnRbXSBzdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOworcHJvdGVjdGVkIGludCBzdGF0ZVN0YWNrVG9wOworcHJvdGVjdGVkIGludCBzeW5jaHJvbml6ZWRCbG9ja1NvdXJjZVN0YXJ0OwogCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tFeHRlcm5hbGl6ZVN0cmluZ3M7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkU3RyaW5nTGl0ZXJhbHM7Ci0JCi0JLy8gamF2YWRvYwotCXB1YmxpYyBKYXZhZG9jIGphdmFkb2M7Ci0JcHVibGljIEphdmFkb2NQYXJzZXIgamF2YWRvY1BhcnNlcjsKLQkvLyB1c2VkIGZvciByZWNvdmVyeQotCXByb3RlY3RlZCBpbnQgbGFzdEphdmFkb2NFbmQ7Ci0JCi0Jc3RhdGljIHsKLQkJdHJ5ewotCQkJaW5pdFRhYmxlcygpOwotCQl9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotcHVibGljIHN0YXRpYyBpbnQgYXNpKGludCBzdGF0ZSkgeworcHJvdGVjdGVkIGludFtdIHZhcmlhYmxlc0NvdW50ZXI7CiAKLQlyZXR1cm4gYXNiW29yaWdpbmFsX3N0YXRlKHN0YXRlKV07IAotfQotcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBiYXNlX2NoZWNrKGludCBpKSB7Ci0JcmV0dXJuIGNoZWNrX3RhYmxlW2kgLSAoTlVNX1JVTEVTICsgMSldOwotfQotcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBidWlsZEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBMaXN0IGxpc3RUb0R1bXApIHsKLQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOwotCXRyeSB7Ci0JCXdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSkpOwotICAgIAlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdFRvRHVtcC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotICAgIAkJd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGl0ZXJhdG9yLm5leHQoKSkpOwotICAgIAl9Ci0gICAgCXdyaXRlci5mbHVzaCgpOwotCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkvLyBpZ25vcmUKLQl9IGZpbmFsbHkgewotCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgCXRyeSB7Ci0JCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICIgY3JlYXRpb24gY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAotfQotcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gYnVpbGRGaWxlRm9yTmFtZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50cykgewotCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29udGVudHMubGVuZ3RoKCldOwotCXJlc3VsdFswXSA9IG51bGw7Ci0JaW50IHJlc3VsdENvdW50ID0gMTsKLQkKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQotCWludCBzdGFydCA9IGNvbnRlbnRzLmluZGV4T2YoIm5hbWVbXSIpOyAvLyROT04tTkxTLTEkCi0Jc3RhcnQgPSBjb250ZW50cy5pbmRleE9mKCdcIicsIHN0YXJ0KTsgCi0JaW50IGVuZCA9IGNvbnRlbnRzLmluZGV4T2YoIn07Iiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCi0JY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCi0JYm9vbGVhbiBhZGRMaW5lU2VwYXJhdG9yID0gZmFsc2U7Ci0JaW50IHRva2VuU3RhcnQgPSAtMTsKLQlTdHJpbmdCdWZmZXIgY3VycmVudFRva2VuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoKCk7IGkrKykgewotCQljaGFyIGMgPSBjb250ZW50cy5jaGFyQXQoaSk7Ci0JCWlmKGMgPT0gJ1wiJykgewotCQkJaWYodG9rZW5TdGFydCA9PSAtMSkgewotCQkJCXRva2VuU3RhcnQgPSBpICsgMTsJCi0JCQl9IGVsc2UgewotCQkJCWlmKGFkZExpbmVTZXBhcmF0b3IpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCQkJcmVzdWx0W3Jlc3VsdENvdW50KytdID0gY3VycmVudFRva2VuLnRvU3RyaW5nKCk7Ci0JCQkJCWN1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRva2VuID0gY29udGVudHMuc3Vic3RyaW5nKHRva2VuU3RhcnQsIGkpOwotCQkJCWlmKHRva2VuLmVxdWFscyhFUlJPUl9UT0tFTikpewotCQkJCQl0b2tlbiA9IElOVkFMSURfQ0hBUkFDVEVSOwotCQkJCX0gZWxzZSBpZih0b2tlbi5lcXVhbHMoRU9GX1RPS0VOKSkgewotCQkJCQl0b2tlbiA9IFVORVhQRUNURURfRU9GOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHRva2VuKTsKLQkJCQljdXJyZW50VG9rZW4uYXBwZW5kKHRva2VuKTsKLQkJCQlhZGRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKLQkJCQl0b2tlblN0YXJ0ID0gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYodG9rZW5TdGFydCA9PSAtMSAmJiBjID09ICcrJyl7Ci0JCQlhZGRMaW5lU2VwYXJhdG9yID0gZmFsc2U7Ci0JCX0KLQl9Ci0JaWYoY3VycmVudFRva2VuLmxlbmd0aCgpID4gMCkgewotCQlyZXN1bHRbcmVzdWx0Q291bnQrK10gPSBjdXJyZW50VG9rZW4udG9TdHJpbmcoKTsKLQl9Ci0JCi0JYnVpbGRGaWxlRm9yVGFibGUoZmlsZW5hbWUsIGJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCkpOwotCQotCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByZXN1bHQgPSBuZXcgU3RyaW5nW3Jlc3VsdENvdW50XSwgMCwgcmVzdWx0Q291bnQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci1wcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZUZvclJlYWRhYmxlTmFtZSgKLQlTdHJpbmcgZmlsZSwKLQljaGFyW10gbmV3TGhzLAotCWNoYXJbXSBuZXdOb25UZXJtaW5hbEluZGV4LAotCVN0cmluZ1tdIG5ld05hbWUsCi0JU3RyaW5nW10gdG9rZW5zKSB7Citwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0V4dGVybmFsaXplU3RyaW5nczsKIAotCUFycmF5TGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCWJvb2xlYW5bXSBhbHJlYWR5QWRkZWQgPSBuZXcgYm9vbGVhbltuZXdOYW1lLmxlbmd0aF07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpID0gaSArIDMpIHsKLQkJaWYoIjEiLmVxdWFscyh0b2tlbnNbaV0pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBpbmRleCA9IG5ld05vblRlcm1pbmFsSW5kZXhbbmV3TGhzW0ludGVnZXIucGFyc2VJbnQodG9rZW5zW2kgKyAxXSldXTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZighYWxyZWFkeUFkZGVkW2luZGV4XSkgewotCQkJCWFscmVhZHlBZGRlZFtpbmRleF0gPSB0cnVlOwotCQkJCWJ1ZmZlci5hcHBlbmQobmV3TmFtZVtpbmRleF0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpKzJdLnRyaW0oKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJCQllbnRyaWVzLmFkZChTdHJpbmcudmFsdWVPZihidWZmZXIpKTsKLQkJCX0KLQkJfQotCX0KLQlpbnQgaSA9IDE7Ci0Jd2hpbGUoIUlOVkFMSURfQ0hBUkFDVEVSLmVxdWFscyhuZXdOYW1lW2ldKSkgaSsrOwotCWkrKzsKLQlmb3IgKDsgaSA8IGFscmVhZHlBZGRlZC5sZW5ndGg7IGkrKykgewotCQlpZighYWxyZWFkeUFkZGVkW2ldKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3TmFtZVtpXSArICIgaGFzIG5vIHJlYWRhYmxlIG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCUNvbGxlY3Rpb25zLnNvcnQoZW50cmllcyk7Ci0JYnVpbGRGaWxlKGZpbGUsIGVudHJpZXMpOwotfQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEZpbGVzRm9yUmVjb3ZlcnlUZW1wbGF0ZXMoCi0JU3RyaW5nIGluZGV4RmlsZW5hbWUsCi0JU3RyaW5nIHRlbXBsYXRlc0ZpbGVuYW1lLAotCWNoYXJbXSBuZXdUZXJtaW5hbEluZGV4LAotCWNoYXJbXSBuZXdOb25UZXJtaW5hbEluZGV4LAotCVN0cmluZ1tdIG5ld05hbWUsCi0JY2hhcltdIG5ld0xocywKLQlTdHJpbmdbXSB0b2tlbnMpIHsKLQkKLQlpbnRbXSBuZXdSZXZlcnNlID0gY29tcHV0ZVJldmVyc2VUYWJsZShuZXdUZXJtaW5hbEluZGV4LCBuZXdOb25UZXJtaW5hbEluZGV4LCBuZXdOYW1lKTsKLQkKLQljaGFyW10gbmV3UmVjb3ZleVRlbXBsYXRlc0luZGV4ID0gbmV3IGNoYXJbbmV3Tm9uVGVybWluYWxJbmRleC5sZW5ndGhdOwotCWNoYXJbXSBuZXdSZWNvdmV5VGVtcGxhdGVzID0gbmV3IGNoYXJbbmV3Tm9uVGVybWluYWxJbmRleC5sZW5ndGhdOwotCWludCBuZXdSZWNvdmV5VGVtcGxhdGVzUHRyID0gMDsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMykgewotCQlpZigiMyIuZXF1YWxzKHRva2Vuc1tpXSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGxlbmd0aCA9IG5ld1JlY292ZXlUZW1wbGF0ZXMubGVuZ3RoOwotCQkJaWYobGVuZ3RoID09IG5ld1JlY292ZXlUZW1wbGF0ZXNQdHIgKyAxKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShuZXdSZWNvdmV5VGVtcGxhdGVzLCAwLCBuZXdSZWNvdmV5VGVtcGxhdGVzID0gbmV3IGNoYXJbbGVuZ3RoICogMl0sIDAsIGxlbmd0aCk7Ci0JCQl9Ci0JCQluZXdSZWNvdmV5VGVtcGxhdGVzW25ld1JlY292ZXlUZW1wbGF0ZXNQdHIrK10gPSAwOwotCQkJCi0JCQlpbnQgaW5kZXggPSBuZXdMaHNbSW50ZWdlci5wYXJzZUludCh0b2tlbnNbaSArIDFdKV07Ci0JCQkKLQkJCW5ld1JlY292ZXlUZW1wbGF0ZXNJbmRleFtpbmRleF0gPSAoY2hhciluZXdSZWNvdmV5VGVtcGxhdGVzUHRyOwotCQkJCi0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnNbaSArIDJdLnRyaW0oKTsKLQkJCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihuZXcgU3RyaW5nKHRva2VuKSwgIiAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHRlcm1pbmFsTmFtZXMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotCQkJaW50IHQgPSAwOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXRlcm1pbmFsTmFtZXNbdCsrXSA9IHN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRlcm1pbmFsTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpbnQgc3ltYm9sID0gZ2V0U3ltYm9sKHRlcm1pbmFsTmFtZXNbal0sIG5ld05hbWUsIG5ld1JldmVyc2UpOwotCQkJCWlmKHN5bWJvbCA+IC0xKSB7Ci0JCQkJCWxlbmd0aCA9IG5ld1JlY292ZXlUZW1wbGF0ZXMubGVuZ3RoOwotCQkJCQlpZihsZW5ndGggPT0gbmV3UmVjb3ZleVRlbXBsYXRlc1B0ciArIDEpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3UmVjb3ZleVRlbXBsYXRlcywgMCwgbmV3UmVjb3ZleVRlbXBsYXRlcyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCW5ld1JlY292ZXlUZW1wbGF0ZXNbbmV3UmVjb3ZleVRlbXBsYXRlc1B0cisrXSA9IChjaGFyKXN5bWJvbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JbmV3UmVjb3ZleVRlbXBsYXRlc1tuZXdSZWNvdmV5VGVtcGxhdGVzUHRyKytdID0gMDsKLQlTeXN0ZW0uYXJyYXljb3B5KG5ld1JlY292ZXlUZW1wbGF0ZXMsIDAsIG5ld1JlY292ZXlUZW1wbGF0ZXMgPSBuZXcgY2hhcltuZXdSZWNvdmV5VGVtcGxhdGVzUHRyXSwgMCwgbmV3UmVjb3ZleVRlbXBsYXRlc1B0cik7Ci0JCi0JYnVpbGRGaWxlRm9yVGFibGUoaW5kZXhGaWxlbmFtZSwgbmV3UmVjb3ZleVRlbXBsYXRlc0luZGV4KTsKLQlidWlsZEZpbGVGb3JUYWJsZSh0ZW1wbGF0ZXNGaWxlbmFtZSwgbmV3UmVjb3ZleVRlbXBsYXRlcyk7Ci19Ci1wcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZXNGb3JTdGF0ZW1lbnRzUmVjb3ZlcnlGaWx0ZXIoCi0JCVN0cmluZyBmaWxlbmFtZSwKLQkJY2hhcltdIG5ld05vblRlcm1pbmFsSW5kZXgsCi0JCWNoYXJbXSBuZXdMaHMsCi0JCVN0cmluZ1tdIHRva2VucykgewotCQkKLQkJY2hhcltdIG5ld1N0YXRlbWVudHNSZWNvdmVyeUZpbHRlciA9IG5ldyBjaGFyW25ld05vblRlcm1pbmFsSW5kZXgubGVuZ3RoXTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSA9IGkgKyAzKSB7Ci0JCQlpZigiNCIuZXF1YWxzKHRva2Vuc1tpXSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBpbmRleCA9IG5ld0xoc1tJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1tpICsgMV0pXTsKLQkJCQkKLQkJCQluZXdTdGF0ZW1lbnRzUmVjb3ZlcnlGaWx0ZXJbaW5kZXhdID0gMTsKLQkJCX0KLQkJfQotCQlidWlsZEZpbGVGb3JUYWJsZShmaWxlbmFtZSwgbmV3U3RhdGVtZW50c1JlY292ZXJ5RmlsdGVyKTsKLQl9Ci1wcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZUZvckNvbXBsaWFuY2UoCi0JCVN0cmluZyBmaWxlLAotCQlpbnQgbGVuZ3RoLAotCQlTdHJpbmdbXSB0b2tlbnMpIHsKLQotCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoICogOF07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMykgewotCQkJaWYoIjIiLmVxdWFscyh0b2tlbnNbaV0pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1tpICsgMV0pOwotCQkJCVN0cmluZyB0b2tlbiA9IHRva2Vuc1tpICsgMl0udHJpbSgpOwotCQkJCWxvbmcgY29tcGxpYW5jZSA9IDA7Ci0JCQkJaWYoIjEuNCIuZXF1YWxzKHRva2VuKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbXBsaWFuY2UgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwotCQkJCX0gZWxzZSBpZigiMS41Ii5lcXVhbHModG9rZW4pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29tcGxpYW5jZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7Ci0JCQkJfSBlbHNlIGlmKCJyZWNvdmVyeSIuZXF1YWxzKHRva2VuKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbXBsaWFuY2UgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLX0RFRkVSUkVEOwotCQkJCX0KLQkJCQkKLQkJCQlpbnQgaiA9IGluZGV4ICogODsKLQkJCQlyZXN1bHRbal0gPSAJKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDU2KTsKLQkJCQlyZXN1bHRbaiArIDFdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDQ4KTsKLQkJCQlyZXN1bHRbaiArIDJdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDQwKTsKLQkJCQlyZXN1bHRbaiArIDNdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDMyKTsKLQkJCQlyZXN1bHRbaiArIDRdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDI0KTsKLQkJCQlyZXN1bHRbaiArIDVdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDE2KTsKLQkJCQlyZXN1bHRbaiArIDZdID0gKGJ5dGUpKGNvbXBsaWFuY2UgPj4+IDgpOwotCQkJCXJlc3VsdFtqICsgN10gPSAoYnl0ZSkoY29tcGxpYW5jZSk7Ci0JCQl9Ci0JCX0KLQotCQlidWlsZEZpbGVGb3JUYWJsZShmaWxlLCByZXN1bHQpOwotCX0KLXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYnVpbGRGaWxlRm9yVGFibGUoU3RyaW5nIGZpbGVuYW1lLCBieXRlW10gYnl0ZXMpIHsKLQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJc3RyZWFtLndyaXRlKGJ5dGVzKTsKLQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gaWdub3JlCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICIgY3JlYXRpb24gY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAotfQotcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBidWlsZEZpbGVGb3JUYWJsZShTdHJpbmcgZmlsZW5hbWUsIGNoYXJbXSBjaGFycykgewotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2NoYXJzLmxlbmd0aCAqIDJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJYnl0ZXNbMiAqIGldID0gKGJ5dGUpIChjaGFyc1tpXSA+Pj4gOCk7Ci0JCWJ5dGVzWzIgKiBpICsgMV0gPSAoYnl0ZSkgKGNoYXJzW2ldICYgMHhGRik7Ci0JfQotCi0JamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCXN0cmVhbS53cml0ZShieXRlcyk7Ci0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZQotCX0gZmluYWxseSB7Ci0JCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZW5hbWUgKyAiIGNyZWF0aW9uIGNvbXBsZXRlIik7IC8vJE5PTi1OTFMtMSQKLX0KLXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBidWlsZEZpbGVPZkJ5dGVGb3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGFnLCBTdHJpbmdbXSB0b2tlbnMpIHsKLQotCS8vdHJhbnNmb3JtIHRoZSBTdHJpbmcgdG9rZW5zIGludG8gY2hhcnMgYmVmb3JlIGR1bXBpbmcgdGhlbiBpbnRvIGZpbGUKLQotCWludCBpID0gMDsKLQkvL3JlYWQgdXB0byB0aGUgdGFnCi0Jd2hpbGUgKCF0b2tlbnNbaSsrXS5lcXVhbHModGFnKSl7LyplbXB0eSovfQotCS8vcmVhZCB1cHRvIHRoZSB9Ci0JCi0JYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbdG9rZW5zLmxlbmd0aF07IC8vY2FuJ3QgYmUgYmlnZ2VyCi0JaW50IGljID0gMDsKLQlTdHJpbmcgdG9rZW47Ci0Jd2hpbGUgKCEodG9rZW4gPSB0b2tlbnNbaSsrXSkuZXF1YWxzKCJ9IikpIHsgLy8kTk9OLU5MUy0xJAotCQlpbnQgYyA9IEludGVnZXIucGFyc2VJbnQodG9rZW4pOwotCQlieXRlc1tpYysrXSA9IChieXRlKSBjOwotCX0KLQotCS8vcmVzaXplCi0JU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgYnl0ZXMgPSBuZXcgYnl0ZVtpY10sIDAsIGljKTsKLQotCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGVuYW1lLCBieXRlcyk7Ci0JcmV0dXJuIGJ5dGVzOwotfQotcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIGJ1aWxkRmlsZU9mSW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRhZywgU3RyaW5nW10gdG9rZW5zKSB7Ci0KLQkvL3RyYW5zZm9ybSB0aGUgU3RyaW5nIHRva2VucyBpbnRvIGNoYXJzIGJlZm9yZSBkdW1waW5nIHRoZW4gaW50byBmaWxlCi0KLQlpbnQgaSA9IDA7Ci0JLy9yZWFkIHVwdG8gdGhlIHRhZwotCXdoaWxlICghdG9rZW5zW2krK10uZXF1YWxzKHRhZykpey8qZW1wdHkqL30KLQkvL3JlYWQgdXB0byB0aGUgfQotCQotCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3Rva2Vucy5sZW5ndGhdOyAvL2Nhbid0IGJlIGJpZ2dlcgotCWludCBpYyA9IDA7Ci0JU3RyaW5nIHRva2VuOwotCXdoaWxlICghKHRva2VuID0gdG9rZW5zW2krK10pLmVxdWFscygifSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuKTsKLQkJY2hhcnNbaWMrK10gPSAoY2hhcikgYzsKLQl9Ci0KLQkvL3Jlc2l6ZQotCVN5c3RlbS5hcnJheWNvcHkoY2hhcnMsIDAsIGNoYXJzID0gbmV3IGNoYXJbaWNdLCAwLCBpYyk7Ci0KLQlidWlsZEZpbGVGb3JUYWJsZShmaWxlbmFtZSwgY2hhcnMpOwotCXJldHVybiBjaGFyczsKLX0KLXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYnVpbGRGaWxlT2ZTaG9ydEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0YWcsIFN0cmluZ1tdIHRva2VucykgewotCi0JLy90cmFuc2Zvcm0gdGhlIFN0cmluZyB0b2tlbnMgaW50byBjaGFycyBiZWZvcmUgZHVtcGluZyB0aGVuIGludG8gZmlsZQotCi0JaW50IGkgPSAwOwotCS8vcmVhZCB1cHRvIHRoZSB0YWcKLQl3aGlsZSAoIXRva2Vuc1tpKytdLmVxdWFscyh0YWcpKXsvKmVtcHR5Ki99Ci0JLy9yZWFkIHVwdG8gdGhlIH0KLQkKLQljaGFyW10gY2hhcnMgPSBuZXcgY2hhclt0b2tlbnMubGVuZ3RoXTsgLy9jYW4ndCBiZSBiaWdnZXIKLQlpbnQgaWMgPSAwOwotCVN0cmluZyB0b2tlbjsKLQl3aGlsZSAoISh0b2tlbiA9IHRva2Vuc1tpKytdKS5lcXVhbHMoIn0iKSkgeyAvLyROT04tTkxTLTEkCi0JCWludCBjID0gSW50ZWdlci5wYXJzZUludCh0b2tlbik7Ci0JCWNoYXJzW2ljKytdID0gKGNoYXIpIChjICsgMzI3NjgpOwotCX0KLQotCS8vcmVzaXplCi0JU3lzdGVtLmFycmF5Y29weShjaGFycywgMCwgY2hhcnMgPSBuZXcgY2hhcltpY10sIDAsIGljKTsKLQotCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGVuYW1lLCBjaGFycyk7Ci19Ci1wdWJsaWMgZmluYWwgc3RhdGljIHZvaWQgYnVpbGRGaWxlc0Zyb21MUEcoU3RyaW5nIGRhdGFGaWxlbmFtZSwgU3RyaW5nIGRhdGFGaWxlbmFtZTIpIHsKLQotCS8vUlVOIFRISVMgTUVUSE9EIFRPIEdFTkVSQVRFIFBBUlNFUiouUlNDIEZJTEVTCi0KLQkvL2J1aWxkIGZyb20gdGhlIGxwZyBqYXZhZGNsLmphdmEgZmlsZXMgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJzZXIgdGFibGVzCi0JLy9saHMgY2hlY2tfdGFibGUgYXNiIGFzciBzeW1ib2xfaW5kZXgKLQotCS8vW29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyLmJ1aWxkRmlsZXNGcm9tTFBHKCJkOi9sZWFwZnJvZy9ncmFtbWFyL2phdmFkY2wuamF2YSIpXQotCWNoYXJbXSBjb250ZW50cyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQl0cnkgewotCQljb250ZW50cyA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KG5ldyBGaWxlKGRhdGFGaWxlbmFtZSksIG51bGwpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5wYXJzZXJfaW5jb3JyZWN0UGF0aCk7IAotCQlyZXR1cm47Ci0JfQotCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgc3QgPSAKLQkJbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIobmV3IFN0cmluZyhjb250ZW50cyksICIgXHRcblxyW109eyw7Iik7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQlpbnQgaiA9IDA7Ci0Jd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQl0b2tlbnNbaisrXSA9IHN0Lm5leHRUb2tlbigpOwotCX0KLQlmaW5hbCBTdHJpbmcgcHJlZml4ID0gRklMRVBSRUZJWDsKLQlpbnQgaSA9IDA7Ci0JCi0JY2hhcltdIG5ld0xocyA9IGJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAibGhzIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JYnVpbGRGaWxlT2ZTaG9ydEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImNoZWNrX3RhYmxlIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJhc2IiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImFzciIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAibmFzYiIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAibmFzciIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWNoYXJbXSBuZXdUZXJtaW5hbEluZGV4ID0gYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJ0ZXJtaW5hbF9pbmRleCIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWNoYXJbXSBuZXdOb25UZXJtaW5hbEluZGV4ID0gYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJub25fdGVybWluYWxfaW5kZXgiLCB0b2tlbnMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInRlcm1fYWN0aW9uIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCi0JYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJzY29wZV9wcmVmaXgiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3N1ZmZpeCIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAic2NvcGVfbGhzIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JYnVpbGRGaWxlT2ZJbnRGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJzY29wZV9zdGF0ZV9zZXQiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX3JocyIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZU9mSW50Rm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAic2NvcGVfc3RhdGUiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQlidWlsZEZpbGVPZkludEZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImluX3N5bWIiLCB0b2tlbnMpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkKLQlieXRlW10gbmV3UmhzID0gYnVpbGRGaWxlT2ZCeXRlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAicmhzIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JYnVpbGRGaWxlT2ZCeXRlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAidGVybV9jaGVjayIsIHRva2Vucyk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZU9mQnl0ZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgInNjb3BlX2xhIiwgdG9rZW5zKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nW10gbmV3TmFtZSA9IGJ1aWxkRmlsZUZvck5hbWUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsIG5ldyBTdHJpbmcoY29udGVudHMpKTsgLy8kTk9OLU5MUy0xJAotCQotCWNvbnRlbnRzID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCXRyeSB7Ci0JCWNvbnRlbnRzID0gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUoZGF0YUZpbGVuYW1lMiksIG51bGwpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5wYXJzZXJfaW5jb3JyZWN0UGF0aCk7IAotCQlyZXR1cm47Ci0JfQotCXN0ID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIobmV3IFN0cmluZyhjb250ZW50cyksICJcdFxuXHIjIik7ICAvLyROT04tTkxTLTEkCi0JdG9rZW5zID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQlqID0gMDsKLQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCXRva2Vuc1tqKytdID0gc3QubmV4dFRva2VuKCk7Ci0JfQotCQotCWJ1aWxkRmlsZUZvckNvbXBsaWFuY2UocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsIG5ld1Jocy5sZW5ndGgsIHRva2Vucyk7Ly8kTk9OLU5MUy0xJAotCWJ1aWxkRmlsZUZvclJlYWRhYmxlTmFtZShSRUFEQUJMRV9OQU1FU19GSUxFKyIucHJvcGVydGllcyIsIG5ld0xocywgbmV3Tm9uVGVybWluYWxJbmRleCwgbmV3TmFtZSwgdG9rZW5zKTsvLyROT04tTkxTLTEkCi0JCi0JYnVpbGRGaWxlc0ZvclJlY292ZXJ5VGVtcGxhdGVzKAotCQkJcHJlZml4ICsgKCsraSkgKyAiLnJzYyIsIC8vJE5PTi1OTFMtMSQKLQkJCXByZWZpeCArICgrK2kpICsgIi5yc2MiLCAvLyROT04tTkxTLTEkCi0JCQluZXdUZXJtaW5hbEluZGV4LAotCQkJbmV3Tm9uVGVybWluYWxJbmRleCwKLQkJCW5ld05hbWUsCi0JCQluZXdMaHMsCi0JCQl0b2tlbnMpOwotCQotCWJ1aWxkRmlsZXNGb3JTdGF0ZW1lbnRzUmVjb3ZlcnlGaWx0ZXIoCi0JCQlwcmVmaXggKyAoKytpKSArICIucnNjIiwgLy8kTk9OLU5MUy0xJAotCQkJbmV3Tm9uVGVybWluYWxJbmRleCwKLQkJCW5ld0xocywKLQkJCXRva2Vucyk7Ci0KLQkKLQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMucGFyc2VyX21vdmVGaWxlcyk7IAotfQotcHVibGljIHN0YXRpYyBpbnQgaW5fc3ltYm9sKGludCBzdGF0ZSkgewotCXJldHVybiBpbl9zeW1iW29yaWdpbmFsX3N0YXRlKHN0YXRlKV07Ci19Ci1wdWJsaWMgZmluYWwgc3RhdGljIHZvaWQgaW5pdFRhYmxlcygpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCWZpbmFsIFN0cmluZyBwcmVmaXggPSBGSUxFUFJFRklYOwotCWludCBpID0gMDsKLQlsaHMgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0JY2hhcltdIGNoYXJzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCWNoZWNrX3RhYmxlID0gbmV3IHNob3J0W2NoYXJzLmxlbmd0aF07Ci0JZm9yIChpbnQgYyA9IGNoYXJzLmxlbmd0aDsgYy0tID4gMDspIHsKLQkJY2hlY2tfdGFibGVbY10gPSAoc2hvcnQpIChjaGFyc1tjXSAtIDMyNzY4KTsKLQl9Ci0JYXNiID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCWFzciA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQluYXNiID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCW5hc3IgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0JdGVybWluYWxfaW5kZXggPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0Jbm9uX3Rlcm1pbmFsX2luZGV4ID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCXRlcm1fYWN0aW9uID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCQotCXNjb3BlX3ByZWZpeCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQlzY29wZV9zdWZmaXggPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0Jc2NvcGVfbGhzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCXNjb3BlX3N0YXRlX3NldCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQlzY29wZV9yaHMgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0Jc2NvcGVfc3RhdGUgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0JaW5fc3ltYiA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlyaHMgPSByZWFkQnl0ZVRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCXRlcm1fY2hlY2sgPSByZWFkQnl0ZVRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCXNjb3BlX2xhID0gcmVhZEJ5dGVUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQkKLQluYW1lID0gcmVhZE5hbWVUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlydWxlc19jb21wbGlhbmNlID0gcmVhZExvbmdUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlyZWFkYWJsZU5hbWUgPSByZWFkUmVhZGFibGVOYW1lVGFibGUoUkVBREFCTEVfTkFNRVNfRklMRV9OQU1FKTsKLQkKLQlyZXZlcnNlX2luZGV4ID0gY29tcHV0ZVJldmVyc2VUYWJsZSh0ZXJtaW5hbF9pbmRleCwgbm9uX3Rlcm1pbmFsX2luZGV4LCBuYW1lKTsKLQkKLQlyZWNvdmVyeV90ZW1wbGF0ZXNfaW5kZXggPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCi0JcmVjb3ZlcnlfdGVtcGxhdGVzID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRlbWVudHNfcmVjb3ZlcnlfZmlsdGVyID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAotCQotCWJhc2VfYWN0aW9uID0gbGhzOwotfQotcHVibGljIHN0YXRpYyBpbnQgbmFzaShpbnQgc3RhdGUpIHsKLQlyZXR1cm4gbmFzYltvcmlnaW5hbF9zdGF0ZShzdGF0ZSldOwotfQotcHVibGljIHN0YXRpYyBpbnQgbnRBY3Rpb24oaW50IHN0YXRlLCBpbnQgc3ltKSB7Ci0JcmV0dXJuIGJhc2VfYWN0aW9uW3N0YXRlICsgc3ltXTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgaW50IG9yaWdpbmFsX3N0YXRlKGludCBzdGF0ZSkgewotCXJldHVybiAtYmFzZV9jaGVjayhzdGF0ZSk7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIGludFtdIGNvbXB1dGVSZXZlcnNlVGFibGUoY2hhcltdIG5ld1Rlcm1pbmFsSW5kZXgsIGNoYXJbXSBuZXdOb25UZXJtaW5hbEluZGV4LCBTdHJpbmdbXSBuZXdOYW1lKSB7Ci0JaW50W10gbmV3UmV2ZXJzZVRhYmxlID0gbmV3IGludFtuZXdOYW1lLmxlbmd0aF07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBuZXdOYW1lLmxlbmd0aDsgaisrKSB7Ci0JCWZvdW5kIDogewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBuZXdUZXJtaW5hbEluZGV4Lmxlbmd0aDsgaysrKSB7Ci0JCQkJaWYobmV3VGVybWluYWxJbmRleFtrXSA9PSBqKSB7Ci0JCQkJCW5ld1JldmVyc2VUYWJsZVtqXSA9IGs7Ci0JCQkJCWJyZWFrIGZvdW5kOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbmV3Tm9uVGVybWluYWxJbmRleC5sZW5ndGg7IGsrKykgewotCQkJCWlmKG5ld05vblRlcm1pbmFsSW5kZXhba10gPT0gaikgewotCQkJCQluZXdSZXZlcnNlVGFibGVbal0gPSAtazsKLQkJCQkJYnJlYWsgZm91bmQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBuZXdSZXZlcnNlVGFibGU7Ci19Ci0KLXByaXZhdGUgc3RhdGljIGludCBnZXRTeW1ib2woU3RyaW5nIHRlcm1pbmFsTmFtZSwgU3RyaW5nW10gbmV3TmFtZSwgaW50W10gbmV3UmV2ZXJzZSkgewotCWZvciAoaW50IGogPSAwOyBqIDwgbmV3TmFtZS5sZW5ndGg7IGorKykgewotCQlpZih0ZXJtaW5hbE5hbWUuZXF1YWxzKG5ld05hbWVbal0pKSB7Ci0JCQlyZXR1cm4gbmV3UmV2ZXJzZVtqXTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlVGFibGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkvL2ZpbGVzIGFyZSBsb2NhdGVkIGF0IFBhcnNlci5jbGFzcyBkaXJlY3RvcnkKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKLQlpZiAoc3RyZWFtID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oTWVzc2FnZXMuYmluZChNZXNzYWdlcy5wYXJzZXJfbWlzc2luZ0ZpbGUsIGZpbGVuYW1lKSk7IAotCX0KLQlieXRlW10gYnl0ZXMgPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0JCWJ5dGVzID0gVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotCQotcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSByZWFkTmFtZVRhYmxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCWNoYXJbXSBjb250ZW50cyA9IHJlYWRUYWJsZShmaWxlbmFtZSk7Ci0JY2hhcltdW10gbmFtZUFzQ2hhciA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignXG4nLCBjb250ZW50cyk7Ci0KLQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW25hbWVBc0NoYXIubGVuZ3RoICsgMV07Ci0JcmVzdWx0WzBdID0gbnVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVBc0NoYXIubGVuZ3RoOyBpKyspIHsKLQkJcmVzdWx0W2kgKyAxXSA9IG5ldyBTdHJpbmcobmFtZUFzQ2hhcltpXSk7Ci0JfQotCQotCXJldHVybiByZXN1bHQ7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIHJlYWRSZWFkYWJsZU5hbWVUYWJsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW25hbWUubGVuZ3RoXTsKLQotCVJlc291cmNlQnVuZGxlIGJ1bmRsZTsKLQl0cnkgewotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZmlsZW5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIHJlc291cmNlIDogIiArIGZpbGVuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5wcm9wZXJ0aWVzIGZvciBsb2NhbGUgIiArIExvY2FsZS5nZXREZWZhdWx0KCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl0aHJvdyBlOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IE5UX09GRlNFVCArIDE7IGkrKykgewotCQlyZXN1bHRbaV0gPSBuYW1lW2ldOwotCX0KLQlmb3IgKGludCBpID0gTlRfT0ZGU0VUOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJU3RyaW5nIG4gPSBidW5kbGUuZ2V0U3RyaW5nKG5hbWVbaV0pOwotCQkJaWYobiAhPSBudWxsICYmIG4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0W2ldID0gbjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0W2ldID0gbmFtZVtpXTsKLQkJCX0KLQkJfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0W2ldID0gbmFtZVtpXTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotcHJvdGVjdGVkIHN0YXRpYyBjaGFyW10gcmVhZFRhYmxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JLy9maWxlcyBhcmUgbG9jYXRlZCBhdCBQYXJzZXIuY2xhc3MgZGlyZWN0b3J5Ci0KLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBQYXJzZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSk7Ci0JaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMucGFyc2VyX21pc3NpbmdGaWxlLCBmaWxlbmFtZSkpOyAKLQl9Ci0JYnl0ZVtdIGJ5dGVzID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotCQlieXRlcyA9IFV0aWwuZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheShzdHJlYW0sIC0xKTsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLy9taW5pbWFsIGludGVncml0eSBjaGVjayAoZXZlbiBzaXplIGV4cGVjdGVkKQotCWludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7Ci0JaWYgKChsZW5ndGggJiAxKSAhPSAwKQotCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnBhcnNlcl9jb3JydXB0ZWRGaWxlLCBmaWxlbmFtZSkpOyAKLQotCS8vIGNvbnZlcnQgYnl0ZXMgaW50byBjaGFycwotCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2xlbmd0aCAvIDJdOwotCWludCBpID0gMDsKLQlpbnQgY2hhckluZGV4ID0gMDsKLQotCXdoaWxlICh0cnVlKSB7Ci0JCWNoYXJzW2NoYXJJbmRleCsrXSA9IChjaGFyKSAoKChieXRlc1tpKytdICYgMHhGRikgPDwgOCkgKyAoYnl0ZXNbaSsrXSAmIDB4RkYpKTsKLQkJaWYgKGkgPT0gbGVuZ3RoKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBjaGFyczsKLX0KLXByb3RlY3RlZCBzdGF0aWMgbG9uZ1tdIHJlYWRMb25nVGFibGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkvL2ZpbGVzIGFyZSBsb2NhdGVkIGF0IFBhcnNlci5jbGFzcyBkaXJlY3RvcnkKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lKTsKLQlpZiAoc3RyZWFtID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oTWVzc2FnZXMuYmluZChNZXNzYWdlcy5wYXJzZXJfbWlzc2luZ0ZpbGUsIGZpbGVuYW1lKSk7IAotCX0KLQlieXRlW10gYnl0ZXMgPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0JCWJ5dGVzID0gVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvL21pbmltYWwgaW50ZWdyaXR5IGNoZWNrIChldmVuIHNpemUgZXhwZWN0ZWQpCi0JaW50IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKLQlpZiAobGVuZ3RoICUgOCAhPSAwKQotCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnBhcnNlcl9jb3JydXB0ZWRGaWxlLCBmaWxlbmFtZSkpOyAKLQotCS8vIGNvbnZlcnQgYnl0ZXMgaW50byBsb25ncwotCWxvbmdbXSBsb25ncyA9IG5ldyBsb25nW2xlbmd0aCAvIDhdOwotCWludCBpID0gMDsKLQlpbnQgbG9uZ0luZGV4ID0gMDsKLQotCXdoaWxlICh0cnVlKSB7Ci0JCWxvbmdzW2xvbmdJbmRleCsrXSA9IAotCQkgICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDU2KQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDQ4KQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDQwKQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDMyKQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDI0KQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDE2KQotCQkrICgoKGxvbmcpIChieXRlc1tpKytdICYgMHhGRikpIDw8IDgpCi0JCSsgKGJ5dGVzW2krK10gJiAweEZGKTsKLQkJCi0JCWlmIChpID09IGxlbmd0aCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbG9uZ3M7Ci19Ci1wdWJsaWMgc3RhdGljIGludCB0QWN0aW9uKGludCBzdGF0ZSwgaW50IHN5bSkgewotCXJldHVybiB0ZXJtX2FjdGlvblt0ZXJtX2NoZWNrW2Jhc2VfYWN0aW9uW3N0YXRlXStzeW1dID09IHN5bSA/IGJhc2VfYWN0aW9uW3N0YXRlXSArIHN5bSA6IGJhc2VfYWN0aW9uW3N0YXRlXV07Ci19Citwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRTdHJpbmdMaXRlcmFsczsKKy8vIGphdmFkb2MKK3B1YmxpYyBKYXZhZG9jIGphdmFkb2M7CitwdWJsaWMgSmF2YWRvY1BhcnNlciBqYXZhZG9jUGFyc2VyOworLy8gdXNlZCBmb3IgcmVjb3ZlcnkKK3Byb3RlY3RlZCBpbnQgbGFzdEphdmFkb2NFbmQ7CitwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlJlYWRNYW5hZ2VyIHJlYWRNYW5hZ2VyOwogCiBwdWJsaWMgUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIsIGJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscykgewotCQkKKwogCXRoaXMucHJvYmxlbVJlcG9ydGVyID0gcHJvYmxlbVJlcG9ydGVyOwogCXRoaXMub3B0aW9ucyA9IHByb2JsZW1SZXBvcnRlci5vcHRpb25zOwogCXRoaXMub3B0aW1pemVTdHJpbmdMaXRlcmFscyA9IG9wdGltaXplU3RyaW5nTGl0ZXJhbHM7Ci0JdGhpcy5pbml0aWFsaXplU2Nhbm5lcigpOworCWluaXRpYWxpemVTY2FubmVyKCk7CiAJdGhpcy5hc3RMZW5ndGhTdGFjayA9IG5ldyBpbnRbNTBdOwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrID0gbmV3IGludFszMF07CiAJdGhpcy5pbnRTdGFjayA9IG5ldyBpbnRbNTBdOwpAQCAtODgxLDE4ICs4ODQsMTggQEAKIAl0aGlzLnJlYWxCbG9ja1N0YWNrID0gbmV3IGludFszMF07CiAJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjayA9IG5ldyBsb25nWzMwXTsKIAl0aGlzLnZhcmlhYmxlc0NvdW50ZXIgPSBuZXcgaW50WzMwXTsKLQkKKwogCS8vIGphdmFkb2Mgc3VwcG9ydAogCXRoaXMuamF2YWRvY1BhcnNlciA9IGNyZWF0ZUphdmFkb2NQYXJzZXIoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGFubm90YXRpb25SZWNvdmVyeUNoZWNrUG9pbnQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JaWYodGhpcy5sYXN0Q2hlY2tQb2ludCA+IHN0YXJ0ICYmIHRoaXMubGFzdENoZWNrUG9pbnQgPCBlbmQpIHsKKwlpZih0aGlzLmxhc3RDaGVja1BvaW50IDwgZW5kKSB7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBlbmQgKyAxOwogCX0KIH0KIHB1YmxpYyB2b2lkIGFycmF5SW5pdGlhbGl6ZXIoaW50IGxlbmd0aCkgewogCS8vbGVuZ3RoIGlzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBJbml0aWFsaXplcgotCS8vZXhwcmVzc2lvblB0ciBwb2ludHMgb24gdGhlIGxhc3QgZWx0IG9mIHRoZSBhcnJheUluaXRpYWxpemVyLCAKKwkvL2V4cHJlc3Npb25QdHIgcG9pbnRzIG9uIHRoZSBsYXN0IGVsdCBvZiB0aGUgYXJyYXlJbml0aWFsaXplciwKIAkvLyBpbiBvdGhlciB3b3JkcywgaXQgaGFzIG5vdCBiZWVuIGRlY3JlbWVudGVkIHlldC4KIAogCUFycmF5SW5pdGlhbGl6ZXIgYWkgPSBuZXcgQXJyYXlJbml0aWFsaXplcigpOwpAQCAtOTE2LDggKzkxOSw4IEBACiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGJ1aWxkSW5pdGlhbFJlY292ZXJ5U3RhdGUoKXsKIAotCS8qIGluaXRpYWxpemUgcmVjb3ZlcnkgYnkgcmV0cmlldmluZyBhdmFpbGFibGUgcmVkdWNlZCBub2RlcyAKLQkgKiBhbHNvIHJlYnVpbGQgYnJhY2tldCBiYWxhbmNlIAorCS8qIGluaXRpYWxpemUgcmVjb3ZlcnkgYnkgcmV0cmlldmluZyBhdmFpbGFibGUgcmVkdWNlZCBub2RlcworCSAqIGFsc28gcmVidWlsZCBicmFja2V0IGJhbGFuY2UKIAkgKi8KIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gMDsKIAl0aGlzLmxhc3RFcnJvckVuZFBvc2l0aW9uQmVmb3JlUmVjb3ZlcnkgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwpAQCAtOTI1LDI2ICs5MjgsMTkgQEAKIAlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSBudWxsOwogCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbil7CiAJCWVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkVW5pdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCwgMCwgdGhpcyk7Ci0JCQotCQkvKiBpZ25vcmUgY3VycmVudCBzdGFjayBzdGF0ZSwgc2luY2UgcmVzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5uaW5nIAorCisJCS8qIGlnbm9yZSBjdXJyZW50IHN0YWNrIHN0YXRlLCBzaW5jZSByZXN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubm5pbmcKIAkJICAgc2luY2UgY291bGQgbm90IHRydXN0IHNpbXBsZSBicmFjZSBjb3VudCAqLwotCQlpZiAodHJ1ZSl7IC8vIGV4cGVyaW1lbnRpbmcgcmVzdGFydCByZWNvdmVyeSBmcm9tIHNjcmF0Y2gKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0gbnVsbDsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmltcG9ydHMgPSBudWxsOwotCQkJdGhpcy5jb21waWxhdGlvblVuaXQudHlwZXMgPSBudWxsOwotCQkJdGhpcy5jdXJyZW50VG9rZW4gPSAwOwotCQkJdGhpcy5saXN0TGVuZ3RoID0gMDsKLQkJCXRoaXMubGlzdFR5cGVQYXJhbWV0ZXJMZW5ndGggPSAwOwotCQkJdGhpcy5lbmRQb3NpdGlvbiA9IDA7Ci0JCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uID0gMDsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSAhPSBudWxsKXsKLQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQl9Ci0JCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzICE9IG51bGwpewotCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuY29tcGlsYXRpb25Vbml0LmltcG9ydHNbdGhpcy5jb21waWxhdGlvblVuaXQuaW1wb3J0cy5sZW5ndGggLTFdLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CQkKLQkJfQorCQkvLyByZXN0YXJ0IHJlY292ZXJ5IGZyb20gc2NyYXRjaAorCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSA9IG51bGw7CisJCXRoaXMuY29tcGlsYXRpb25Vbml0LmltcG9ydHMgPSBudWxsOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC50eXBlcyA9IG51bGw7CisJCXRoaXMuY3VycmVudFRva2VuID0gMDsKKwkJdGhpcy5saXN0TGVuZ3RoID0gMDsKKwkJdGhpcy5saXN0VHlwZVBhcmFtZXRlckxlbmd0aCA9IDA7CisJCXRoaXMuZW5kUG9zaXRpb24gPSAwOworCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uID0gMDsKKwkJcmV0dXJuIGVsZW1lbnQ7CiAJfSBlbHNlIHsKIAkJaWYgKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pewogCQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dCwgbnVsbCwgMCwgdGhpcyk7CkBAIC05NTYsMjQgKzk1MiwyNyBAQAogCQkJLyogSW5pdGlhbGl6ZXIgYm9kaWVzIGFyZSBwYXJzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHR5cGUgZGVjbGFyYXRpb24sIHdlIG11c3QgdGh1cyBzZWFyY2ggaXQgaW5zaWRlICovCiAJCQlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKXsKIAkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMucmVmZXJlbmNlQ29udGV4dDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsKLQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwkJCQkJCisJCQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdHlwZS5maWVsZHM7CisJCQkJaW50IGxlbmd0aCA9IGZpZWxkRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGREZWNsYXJhdGlvbnNbaV07CiAJCQkJCWlmIChmaWVsZCAhPSBudWxsCiAJCQkJCQkmJiBmaWVsZC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSCisJCQkJCQkmJiAoKEluaXRpYWxpemVyKSBmaWVsZCkuYmxvY2sgIT0gbnVsbAogCQkJCQkJJiYgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSB0aGlzLnNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uCiAJCQkJCQkmJiB0aGlzLnNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uIDw9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kCiAJCQkJCQkmJiB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMSl7CiAJCQkJCQllbGVtZW50ID0gbmV3IFJlY292ZXJlZEluaXRpYWxpemVyKGZpZWxkLCBudWxsLCAxLCB0aGlzKTsKLQkJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwkJCQkJCisJCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQotCQkJfSAKKwkJCX0KIAkJfQogCX0KIAogCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBlbGVtZW50OwotCQorCiAJZm9yKGludCBpID0gMDsgaSA8PSB0aGlzLmFzdFB0cjsgaSsrKXsKIAkJQVNUTm9kZSBub2RlID0gdGhpcy5hc3RTdGFja1tpXTsKIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKQEAgLTk4OSwxNSArOTg4LDE3IEBACiAJCX0KIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbml0aWFsaXplcil7CiAJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgbm9kZTsKKwkJCS8vIGlnbm9yZSBpbml0aWFsaXplciB3aXRoIG5vIGJsb2NrCisJCQlpZiAoaW5pdGlhbGl6ZXIuYmxvY2sgPT0gbnVsbCkgY29udGludWU7CiAJCQlpZiAoaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGluaXRpYWxpemVyLCAxKTsKLQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW5pdGlhbGl6ZXIuc291cmNlU3RhcnQ7CQkJCQorCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbml0aWFsaXplci5zb3VyY2VTdGFydDsKIAkJCX0gZWxzZSB7CiAJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGluaXRpYWxpemVyLCAwKTsKIAkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOwogCQkJfQogCQkJY29udGludWU7Ci0JCX0JCQorCQl9CiAJCWlmIChub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbil7CiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7CiAJCQlpZiAoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CkBAIC0xMDE1LDExICsxMDE2LDE2IEBACiAJCX0KIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKCh0eXBlLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKSAhPSAwKSB7CisJCQkJLy8gZG8gbm90IGFsbG93IGVudW1zIHRvIGJlIGJ1aWxkIGFzIHJlY292ZXJ5IHR5cGVzCisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDY5MQorCQkJCWNvbnRpbnVlOworCQkJfQogCQkJaWYgKHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7Ci0JCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKHR5cGUsIDApOwkKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CiAJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGUuYm9keVN0YXJ0OwogCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CQkJCQorCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZCh0eXBlLCAwKTsKIAkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CiAJCQl9CiAJCQljb250aW51ZTsKQEAgLTEwNjAsMTIgKzEwNjYsMTIgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCWlmICh0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSB7CiAJCWlmICh0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlICE9IG51bGwgJiYKIAkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDEgPD0gdGhpcy5wZW5kaW5nUmVjb3ZlcmVkVHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCkgewogCQkJLy8gQWRkIHRoZSBwZW5kaW5nIHR5cGUgdG8gdGhlIEFTVCBpZiB0aGlzIHR5cGUgaXNuJ3QgYWxyZWFkeSBhZGRlZCBpbiB0aGUgQVNULgotCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKHRoaXMucGVuZGluZ1JlY292ZXJlZFR5cGUsIDApOwkJCQkKKwkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZCh0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlLCAwKTsKIAkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKIAkJCXRoaXMucGVuZGluZ1JlY292ZXJlZFR5cGUgPSBudWxsOwogCQl9CkBAIC0xMDg1LDggKzEwOTEsMTIgQEAKIAkJdGhpcy5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW07CiAJfQogCXRoaXMubW9kaWZpZXJzIHw9IGZsYWc7Ci0JCQkKKwogCWlmICh0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0IDwgMCkgdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmFubm90YXRpb25SZWNvdmVyeUFjdGl2YXRlZCkgeworCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZE1vZGlmaWVyKGZsYWcsIHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOworCX0KIH0KIHB1YmxpYyB2b2lkIGNoZWNrQ29tbWVudCgpIHsKIApAQCAtMTA5NCwyOCArMTEwNCwzOCBAQAogCWlmICghKHRoaXMuZGlldCAmJiB0aGlzLmRpZXRJbnQ9PTApICYmIHRoaXMuc2Nhbm5lci5jb21tZW50UHRyID49IDApIHsKIAkJZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwogCX0KLQkKKwogCWludCBsYXN0Q29tbWVudCA9IHRoaXMuc2Nhbm5lci5jb21tZW50UHRyOwotCQorCiAJaWYgKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPj0gMCkgewogCQkvLyBlbGltaW5hdGUgY29tbWVudHMgbG9jYXRlZCBhZnRlciBtb2RpZmllclNvdXJjZVN0YXJ0IGlmIHBvc2l0aW9ubmVkCi0JCXdoaWxlIChsYXN0Q29tbWVudCA+PSAwICYmIHRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RDb21tZW50XSA+IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpIGxhc3RDb21tZW50LS07CisJCXdoaWxlIChsYXN0Q29tbWVudCA+PSAwKSB7CisJCQlpbnQgY29tbWVudFNvdXJjZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdENvbW1lbnRdOworCQkJaWYgKGNvbW1lbnRTb3VyY2VTdGFydCA8IDApIGNvbW1lbnRTb3VyY2VTdGFydCA9IC1jb21tZW50U291cmNlU3RhcnQ7CisJCQlpZiAoY29tbWVudFNvdXJjZVN0YXJ0IDw9IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpIGJyZWFrOworCQkJbGFzdENvbW1lbnQtLTsKKwkJfQogCX0KIAlpZiAobGFzdENvbW1lbnQgPj0gMCkgewogCQkvLyBjb25zaWRlciBhbGwgcmVtYWluaW5nIGxlYWRpbmcgY29tbWVudHMgdG8gYmUgcGFydCBvZiBjdXJyZW50IGRlY2xhcmF0aW9uCi0JCXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1swXTsgCi0JCi0JCS8vIGNoZWNrIGRlcHJlY2F0aW9uIGluIGxhc3QgY29tbWVudCBpZiBqYXZhZG9jIChjYW4gYmUgZm9sbG93ZWQgYnkgbm9uLWphdmFkb2MgY29tbWVudHMgd2hpY2ggYXJlIHNpbXBseSBpZ25vcmVkKQkKKwkJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzWzBdOworCQlpZiAodGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA8IDApIHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPSAtdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydDsKKworCQkvLyBjaGVjayBkZXByZWNhdGlvbiBpbiBsYXN0IGNvbW1lbnQgaWYgamF2YWRvYyAoY2FuIGJlIGZvbGxvd2VkIGJ5IG5vbi1qYXZhZG9jIGNvbW1lbnRzIHdoaWNoIGFyZSBzaW1wbHkgaWdub3JlZCkKIAkJd2hpbGUgKGxhc3RDb21tZW50ID49IDAgJiYgdGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wc1tsYXN0Q29tbWVudF0gPCAwKSBsYXN0Q29tbWVudC0tOyAvLyBub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucwogCQlpZiAobGFzdENvbW1lbnQgPj0gMCAmJiB0aGlzLmphdmFkb2NQYXJzZXIgIT0gbnVsbCkgewogCQkJaW50IGNvbW1lbnRFbmQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2xhc3RDb21tZW50XSAtIDE7IC8vc3RvcCBpcyBvbmUgb3ZlciwKIAkJCS8vIGRvIG5vdCByZXBvcnQgcHJvYmxlbSBiZWZvcmUgbGFzdCBwYXJzZWQgY29tbWVudCB3aGlsZSByZWNvdmVyaW5nIGNvZGUuLi4KLQkJCXRoaXMuamF2YWRvY1BhcnNlci5yZXBvcnRQcm9ibGVtcyA9IHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCB8fCBjb21tZW50RW5kID4gdGhpcy5sYXN0SmF2YWRvY0VuZDsKKwkJCWlmICh0aGlzLmphdmFkb2NQYXJzZXIuc2hvdWxkUmVwb3J0UHJvYmxlbXMpIHsKKwkJCQl0aGlzLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSB0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwgfHwgY29tbWVudEVuZCA+IHRoaXMubGFzdEphdmFkb2NFbmQ7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuamF2YWRvY1BhcnNlci5yZXBvcnRQcm9ibGVtcyA9IGZhbHNlOworCQkJfQogCQkJaWYgKHRoaXMuamF2YWRvY1BhcnNlci5jaGVja0RlcHJlY2F0aW9uKGxhc3RDb21tZW50KSkgewogCQkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKTsKIAkJCX0KIAkJCXRoaXMuamF2YWRvYyA9IHRoaXMuamF2YWRvY1BhcnNlci5kb2NDb21tZW50OwkvLyBudWxsIGlmIGNoZWNrIGphdmFkb2MgaXMgbm90IGFjdGl2YXRlZAotCQkJaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpIHRoaXMubGFzdEphdmFkb2NFbmQgPSBjb21tZW50RW5kOworCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgdGhpcy5sYXN0SmF2YWRvY0VuZCA9IGNvbW1lbnRFbmQ7CiAJCX0KIAl9CiB9CkBAIC0xMTUxLDE0ICsxMTcxLDE1IEBACiAJCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCQl0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOwogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwgCi0JCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKwkJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKIAkJfQogCQlhbGxvYy50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkJCisJCWNoZWNrRm9yRGlhbW9uZChhbGxvYy50eXBlKTsKKwogCQkvL3RoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50CiAJCS8vd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCBieSB0aGUgVEMgKHNlZSBjcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKQogCQlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CkBAIC0xMTcwLDE3ICsxMTkxLDk3IEBACiAJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIAkJaWYgKGFub255bW91c1R5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uICE9IG51bGwpIHsKIAkJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CisJCQljaGVja0ZvckRpYW1vbmQoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24udHlwZSk7CiAJCX0KIAkJaWYgKGxlbmd0aCA9PSAwICYmICFjb250YWluc0NvbW1lbnQoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCwgYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmJvZHlFbmQpKSB7CiAJCQlhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2s7CiAJCX0KIAkJdGhpcy5hc3RQdHItLTsKIAkJdGhpcy5hc3RMZW5ndGhQdHItLTsKLQotCQkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQkJbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uKTsKIAl9CiB9Citwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckRpYW1vbmQoVHlwZVJlZmVyZW5jZSBhbGxvY1R5cGUpIHsKKwlpZiAoYWxsb2NUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZSA9IChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgYWxsb2NUeXBlOworCQlpZiAodHlwZS50eXBlQXJndW1lbnRzID09IFR5cGVSZWZlcmVuY2UuTk9fVFlQRV9BUkdVTUVOVFMpIHsKKwkJCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZGlhbW9uZE5vdEJlbG93MTcoYWxsb2NUeXBlKTsKKwkJCX0KKwkJCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPiBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTE5NjUKKwkJCQl0eXBlLmJpdHMgfD0gQVNUTm9kZS5Jc0RpYW1vbmQ7CisJCQl9IC8vIGVsc2UgZG9uJ3QgZXZlbiBib3RoZXIgdG8gcmVjb2duaXplIHRoaXMgYXMgPD4KKwkJfQorCX0gCisJZWxzZSBpZiAoYWxsb2NUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgdHlwZSA9IChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgYWxsb2NUeXBlOworCQlpZiAodHlwZS50eXBlQXJndW1lbnRzW3R5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGggLSAxXSA9PSBUeXBlUmVmZXJlbmNlLk5PX1RZUEVfQVJHVU1FTlRTKSB7IC8vIERvbid0IGNhcmUgZm9yIFg8Pi5ZPD4gYW5kIFg8Pi5ZPFN0cmluZz4KKwkJCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZGlhbW9uZE5vdEJlbG93MTcoYWxsb2NUeXBlLCB0eXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMSk7CisJCQl9CisJCQlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUxOTY1CisJCQkJdHlwZS5iaXRzIHw9IEFTVE5vZGUuSXNEaWFtb25kOworCQkJfSAvLyBlbHNlIGRvbid0IGV2ZW4gYm90aGVyIHRvIHJlY29nbml6ZSB0aGlzIGFzIDw+CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgY29tcHV0ZVF1YWxpZmllZEdlbmVyaWNzRnJvbVJpZ2h0U2lkZShUeXBlUmVmZXJlbmNlIHJpZ2h0U2lkZSwgaW50IGRpbSkgeworCWludCBuYW1lU2l6ZSA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl07CisJaW50IHRva2Vuc1NpemUgPSBuYW1lU2l6ZTsKKwlpZiAocmlnaHRTaWRlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJdG9rZW5zU2l6ZSArKzsKKwl9IGVsc2UgaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJdG9rZW5zU2l6ZSArKzsKKwl9IGVsc2UgaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCXRva2Vuc1NpemUgKz0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByaWdodFNpZGUpLnRva2Vucy5sZW5ndGg7CisJfSBlbHNlIGlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCXRva2Vuc1NpemUgKz0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByaWdodFNpZGUpLnRva2Vucy5sZW5ndGg7CisJfQorCVR5cGVSZWZlcmVuY2VbXVtdIHR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVt0b2tlbnNTaXplXVtdOworCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW3Rva2Vuc1NpemVdW107CisJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW3Rva2Vuc1NpemVdOworCWlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQlQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVQYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA9IChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgcmlnaHRTaWRlOworCQl0b2tlbnNbbmFtZVNpemVdID0gc2luZ2xlUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UudG9rZW47CisJCXBvc2l0aW9uc1tuYW1lU2l6ZV0gPSAoKChsb25nKSBzaW5nbGVQYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCkgPDwgMzIpICsgc2luZ2xlUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2Uuc291cmNlRW5kOworCQl0eXBlQXJndW1lbnRzW25hbWVTaXplXSA9IHNpbmdsZVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlLnR5cGVBcmd1bWVudHM7CisJfSBlbHNlIGlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCVNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSA9IChTaW5nbGVUeXBlUmVmZXJlbmNlKSByaWdodFNpZGU7CisJCXRva2Vuc1tuYW1lU2l6ZV0gPSBzaW5nbGVUeXBlUmVmZXJlbmNlLnRva2VuOworCQlwb3NpdGlvbnNbbmFtZVNpemVdID0gKCgobG9uZykgc2luZ2xlVHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCkgPDwgMzIpICsgc2luZ2xlVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQ7CisJfSBlbHNlIGlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQlQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBwYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA9IChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgcmlnaHRTaWRlOworCQlUeXBlUmVmZXJlbmNlW11bXSByaWdodFNpZGVUeXBlQXJndW1lbnRzID0gcGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UudHlwZUFyZ3VtZW50czsKKwkJU3lzdGVtLmFycmF5Y29weShyaWdodFNpZGVUeXBlQXJndW1lbnRzLCAwLCB0eXBlQXJndW1lbnRzLCBuYW1lU2l6ZSwgcmlnaHRTaWRlVHlwZUFyZ3VtZW50cy5sZW5ndGgpOworCQljaGFyW11bXSByaWdodFNpZGVUb2tlbnMgPSBwYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS50b2tlbnM7CisJCVN5c3RlbS5hcnJheWNvcHkocmlnaHRTaWRlVG9rZW5zLCAwLCB0b2tlbnMsIG5hbWVTaXplLCByaWdodFNpZGVUb2tlbnMubGVuZ3RoKTsKKwkJbG9uZ1tdIHJpZ2h0U2lkZVBvc2l0aW9ucyA9IHBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uczsKKwkJU3lzdGVtLmFycmF5Y29weShyaWdodFNpZGVQb3NpdGlvbnMsIDAsIHBvc2l0aW9ucywgbmFtZVNpemUsIHJpZ2h0U2lkZVBvc2l0aW9ucy5sZW5ndGgpOworCX0gZWxzZSBpZiAocmlnaHRTaWRlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgcmlnaHRTaWRlOworCQljaGFyW11bXSByaWdodFNpZGVUb2tlbnMgPSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VuczsKKwkJU3lzdGVtLmFycmF5Y29weShyaWdodFNpZGVUb2tlbnMsIDAsIHRva2VucywgbmFtZVNpemUsIHJpZ2h0U2lkZVRva2Vucy5sZW5ndGgpOworCQlsb25nW10gcmlnaHRTaWRlUG9zaXRpb25zID0gcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnM7CisJCVN5c3RlbS5hcnJheWNvcHkocmlnaHRTaWRlUG9zaXRpb25zLCAwLCBwb3NpdGlvbnMsIG5hbWVTaXplLCByaWdodFNpZGVQb3NpdGlvbnMubGVuZ3RoKTsKKwl9CisKKwlpbnQgY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKKwlUeXBlUmVmZXJlbmNlW10gY3VycmVudFR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aF07CisJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIGN1cnJlbnRUeXBlQXJndW1lbnRzLCAwLCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCk7CisKKwlpZiAobmFtZVNpemUgPT0gMSkgeworCQl0b2tlbnNbMF0gPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCQlwb3NpdGlvbnNbMF0gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKKwkJdHlwZUFyZ3VtZW50c1swXSA9IGN1cnJlbnRUeXBlQXJndW1lbnRzOworCX0gZWxzZSB7CisJCXRoaXMuaWRlbnRpZmllclB0ciAtPSBuYW1lU2l6ZTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBuYW1lU2l6ZSk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBuYW1lU2l6ZSk7CisJCXR5cGVBcmd1bWVudHNbbmFtZVNpemUgLSAxXSA9IGN1cnJlbnRUeXBlQXJndW1lbnRzOworCX0KKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgdHlwZUFyZ3VtZW50cywgZGltLCBwb3NpdGlvbnMpOworfQogcHJvdGVjdGVkIHZvaWQgY29uY2F0RXhwcmVzc2lvbkxpc3RzKCkgewogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrWy0tdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyXSsrOwogfQpAQCAtMTE5NSw3ICsxMjk2LDcgQEAKIAkgKiBUaGUgdG9wIHR3byBsZW5ndGggYXJlIGZvciBleGFtcGxlOgogCSAqIC4uLiBwICAgbgogCSAqIGFuZCB5b3Ugd2FudCB0byByZXN1bHQgaW4gYSBsaXN0IGxpa2U6Ci0JICogLi4uIG4rcCAKKwkgKiAuLi4gbitwCiAJICogVGhpcyBtZWFucyB0aGF0IHRoZSBwIGNvdWxkIGJlIGVxdWFscyB0byAwIGluIGNhc2UgdGhlcmUgaXMgbm8gYXN0Tm9kZSBwdXNoZWQKIAkgKiBvbiB0aGUgdGhpcy5hc3RTdGFjay4KIAkgKiBMb29rIGF0IHRoZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgZm9yIGFuIGV4YW1wbGUuCkBAIC0xMjMxLDYgKzEzMzIsNyBAQAogCQlhbm9ueW1vdXNUeXBlLm5hbWUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCWFub255bW91c1R5cGUuYml0cyB8PSAoQVNUTm9kZS5Jc0Fub255bW91c1R5cGV8QVNUTm9kZS5Jc0xvY2FsVHlwZSk7CiAJCWFub255bW91c1R5cGUuc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCQlhbm9ueW1vdXNUeXBlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBhbm9ueW1vdXNUeXBlLnNvdXJjZVN0YXJ0OwogCQlhbm9ueW1vdXNUeXBlLnNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOyAvLyBjbG9zaW5nIHBhcmVudGhlc2lzCiAJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gbmV3IFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKGFub255bW91c1R5cGUpOwogCQlhbGxvYy50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKQEAgLTEyNTcsNiArMTM1OSwxMCBAQAogCQlpbnQgc3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyXTsKIAkJaW50IGVuZCA9IChpbnQpICh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKIAkJYW5ub3RhdGlvblJlY292ZXJ5Q2hlY2tQb2ludChzdGFydCwgZW5kKTsKKworCQlpZiAodGhpcy5hbm5vdGF0aW9uUmVjb3ZlcnlBY3RpdmF0ZWQpIHsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZEFubm90YXRpb25OYW1lKHRoaXMuaWRlbnRpZmllclB0ciwgdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLCBzdGFydCwgMCk7CisJCX0KIAl9CiAJdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyA9IGZhbHNlOwogfQpAQCAtMTI2OSwxMyArMTM3NSwxMCBAQAogCX0KIAogCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwotCQotCS8vIG1hcmsgaW5pdGlhbGl6ZXJzIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAotCW1hcmtJbml0aWFsaXplcnNXaXRoTG9jYWxUeXBlKHR5cGVEZWNsKTsKIAogCS8vY29udmVydCBjb25zdHJ1Y3RvciB0aGF0IGRvIG5vdCBoYXZlIHRoZSB0eXBlJ3MgbmFtZSBpbnRvIG1ldGhvZHMKIAl0eXBlRGVjbC5jaGVja0NvbnN0cnVjdG9ycyh0aGlzKTsKLQkKKwogCS8vYWx3YXlzIGFkZCA8Y2xpbml0PiAod2lsbCBiZSByZW1vdmUgYXQgY29kZSBnZW4gdGltZSBpZiBlbXB0eSkKIAlpZiAodGhpcy5zY2FubmVyLmNvbnRhaW5zQXNzZXJ0S2V5d29yZCkgewogCQl0eXBlRGVjbC5iaXRzIHw9IEFTVE5vZGUuQ29udGFpbnNBc3NlcnRpb247CkBAIC0xMjg1LDExICsxMzg4LDE1IEBACiAJaWYgKGxlbmd0aCA9PSAwICYmICFjb250YWluc0NvbW1lbnQodHlwZURlY2wuYm9keVN0YXJ0LCB0eXBlRGVjbC5ib2R5RW5kKSkgewogCQl0eXBlRGVjbC5iaXRzIHw9IEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jazsKIAl9Ci0JdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAorCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXIoKSB7CisJVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKSB7CisJCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwl9CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9CiAJLy8gZmx1c2ggdGhlIGNvbW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGFubm90YXRpb24gdHlwZSBoZWFkZXIKIAl0aGlzLnNjYW5uZXIuY29tbWVudFB0ciA9IC0xOwpAQCAtMTM0NSwyNiArMTQ1MiwxMTIgQEAKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOwogCX0KIAlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9IGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uc291cmNlRW5kICsgMTsKIAogCS8vIGphdmFkb2MKIAlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7Ci0JdGhpcy5qYXZhZG9jID0gbnVsbDsJCisJdGhpcy5qYXZhZG9jID0gbnVsbDsKIAlwdXNoT25Bc3RTdGFjayhhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKTsKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCAmJgotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKIAkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZkFubm90YXRpb25EZWNsYXJhdGlvbnMoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbik7Ci0JfQkKLQkKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uRGVjbGFyYXRpb25zKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pOworCX0KKwogCS8vIHJlY292ZXJ5Ci0JaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7IAorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLCAwKTsKKwkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworCS8vIGNvbnN1bWVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyIDo6PSBNb2RpZmllcnMgJ0AnIFB1c2hNb2RpZmllcnMgaW50ZXJmYWNlIElkZW50aWZpZXIgVHlwZVBhcmFtZXRlcnMKKwkvLyBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlciA6Oj0gJ0AnIFB1c2hNb2RpZmllcnMgaW50ZXJmYWNlIElkZW50aWZpZXIgVHlwZVBhcmFtZXRlcnMKKwlUeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCS8vIGNvbnN1bWUgdHlwZSBwYXJhbWV0ZXJzCisJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOworCXRoaXMuZ2VuZXJpY3NQdHIgLT0gbGVuZ3RoOworCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA9IG5ldyBUeXBlUGFyYW1ldGVyW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisKKwlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlR5cGVQYXJhbWV0ZXJzRm9yQW5ub3RhdGlvbkRlY2xhcmF0aW9uKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pOworCisJYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQgPSBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzW2xlbmd0aC0xXS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisKKy8vCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPSBudWxsOworCisJdGhpcy5saXN0VHlwZVBhcmFtZXRlckxlbmd0aCA9IDA7CisKKwlpZiAodGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSA9PSAwKSB7CisJCWlmICh0aGlzLm5lc3RlZFR5cGUgIT0gMCkgeworCQkJYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNNZW1iZXJUeXBlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gUmVjb3JkIHRoYXQgdGhlIGJsb2NrIGhhcyBhIGRlY2xhcmF0aW9uIGZvciBsb2NhbCB0eXBlcworCQlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5Jc0xvY2FsVHlwZTsKKwkJbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsKKwkJYmxvY2tSZWFsKCk7CisJfQorCisJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKKwlsb25nIHBvcyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCA9IChpbnQpIHBvczsKKwlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24ubmFtZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vY29tcHV0ZSB0aGUgZGVjbGFyYXRpb24gc291cmNlIHRvbworCS8vICdpbnRlcmZhY2UnIHB1c2ggdHdvIGludCBwb3NpdGlvbnM6IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsYXNzIHRva2VuIGFuZCBpdHMgZW5kLgorCS8vIHdlIHdhbnQgdG8ga2VlcCB0aGUgYmVnaW5uaW5nIHBvc2l0aW9uIGJ1dCBnZXQgcmlkIG9mIHRoZSBlbmQgcG9zaXRpb24KKwkvLyBpdCBpcyBvbmx5IHVzZWQgZm9yIHRoZSBDbGFzc0xpdGVyYWxBY2Nlc3MgcG9zaXRpb25zLgorCXRoaXMuaW50UHRyLS07IC8vIHJlbW92ZSB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGludGVyZmFjZSB0b2tlbgorCXRoaXMuaW50UHRyLS07IC8vIHJlbW92ZSB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG9rZW4KKworCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKKwlpZiAoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwKSB7CisJCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQ7CisJCXRoaXMuaW50UHRyLS07IC8vIHJlbW92ZSB0aGUgcG9zaXRpb24gb2YgdGhlICdAJyB0b2tlbiBhcyB3ZSBoYXZlIG1vZGlmaWVycworCX0gZWxzZSB7CisJCWludCBhdFBvc2l0aW9uID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJLy8gcmVtb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgJ0AnIHRva2VuIGFzIHdlIGRvbid0IGhhdmUgbW9kaWZpZXJzCisJCWFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGF0UG9zaXRpb247CisJfQorCisJLy8gU3RvcmUgc2Vjb25kYXJ5IGluZm8KKwlpZiAoKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNNZW1iZXJUeXBlKSA9PSAwICYmIChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzTG9jYWxUeXBlKSA9PSAwKSB7CisJCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdCAhPSBudWxsICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLm5hbWUsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpKSkgeworCQkJYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNTZWNvbmRhcnlUeXBlOworCQl9CisJfQorCisJLy8gY29uc3VtZSBhbm5vdGF0aW9ucworCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOworCX0KKwkvLyBqYXZhZG9jCisJYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOworCXRoaXMuamF2YWRvYyA9IG51bGw7CisJcHVzaE9uQXN0U3RhY2soYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbik7CisJaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uRGVjbGFyYXRpb25zKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pOworCX0KKworCS8vIHJlY292ZXJ5CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydDsKIAkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24sIDApOwogCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKQEAgLTEzODUsMTQgKzE1NzgsMTcgQEAKIAkvLyBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbnMgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbgogCWNvbmNhdE5vZGVMaXN0cygpOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCkgeworCXRoaXMubmVzdGVkVHlwZS0tIDsKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVBcmd1bWVudExpc3QoKSB7CiAJLy8gQXJndW1lbnRMaXN0IDo6PSBBcmd1bWVudExpc3QgJywnIEV4cHJlc3Npb24KIAljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVBcmd1bWVudHMoKSB7Ci0JLy8gQXJndW1lbnRzIDo6PSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAKKwkvLyBBcmd1bWVudHMgOjo9ICcoJyBBcmd1bWVudExpc3RvcHQgJyknCiAJLy8gbm90aGluZyB0byBkbywgdGhlIGV4cHJlc3Npb24gc3RhY2sgaXMgYWxyZWFkeSB1cGRhdGVkCi0JcHVzaE9uSW50U3RhY2soclBhcmVuUG9zKTsKKwlwdXNoT25JbnRTdGFjayh0aGlzLnJQYXJlblBvcyk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXJyYXlBY2Nlc3MoYm9vbGVhbiB1bnNwZWNpZmllZFJlZmVyZW5jZSkgewogCS8vIEFycmF5QWNjZXNzIDo6PSBOYW1lICdbJyBFeHByZXNzaW9uICddJyA9PT4gdHJ1ZQpAQCAtMTQwMiwxNiArMTU5OCwxNiBAQAogCS8vb3B0aW1pemUgcHVzaC9wb3AKIAlFeHByZXNzaW9uIGV4cDsKIAlpZiAodW5zcGVjaWZpZWRSZWZlcmVuY2UpIHsKLQkJZXhwID0gCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCWV4cCA9CisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQluZXcgQXJyYXlSZWZlcmVuY2UoCiAJCQkJCWdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCksCiAJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOwogCX0gZWxzZSB7CiAJCXRoaXMuZXhwcmVzc2lvblB0ci0tOwogCQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQkJZXhwID0gCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCWV4cCA9CisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQluZXcgQXJyYXlSZWZlcmVuY2UoCiAJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sCiAJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ciArIDFdKTsKQEAgLTE0MjYsNyArMTYyMiw3IEBACiAJQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb24gPSBuZXcgQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbigpOwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciAtLSA7CiAJYXJyYXlBbGxvY2F0aW9uLmluaXRpYWxpemVyID0gKEFycmF5SW5pdGlhbGl6ZXIpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXTsKLQkJCisKIAlhcnJheUFsbG9jYXRpb24udHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CiAJYXJyYXlBbGxvY2F0aW9uLnR5cGUuYml0cyB8PSBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjazsgLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCByYXcgdHlwZSB1c2FnZQogCWxlbmd0aCA9ICh0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pOwpAQCAtMTQ1Miw3ICsxNjQ4LDcgQEAKIAlpbnQgbGVuZ3RoOwogCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYXJyYXlBbGxvY2F0aW9uID0gbmV3IEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKIAlhcnJheUFsbG9jYXRpb24udHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JYXJyYXlBbGxvY2F0aW9uLnR5cGUuYml0cyB8PSBBU1ROb2RlLklnbm9yZVJhd1R5cGVDaGVjazsgLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCByYXcgdHlwZSB1c2FnZQkKKwlhcnJheUFsbG9jYXRpb24udHlwZS5iaXRzIHw9IEFTVE5vZGUuSWdub3JlUmF3VHlwZUNoZWNrOyAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHJhdyB0eXBlIHVzYWdlCiAJbGVuZ3RoID0gKHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSk7CiAJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCA7CiAJU3lzdGVtLmFycmF5Y29weSgKQEAgLTE0OTIsMjAgKzE2ODgsMjEgQEAKIAkvL29wdGltaXplIHRoZSBwdXNoL3BvcAogCiAJaW50IG9wID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSA7IC8vPC0tdGhlIGVuY29kZWQgb3BlcmF0b3IKLQkKKwogCXRoaXMuZXhwcmVzc2lvblB0ciAtLSA7IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciAtLSA7CisJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyKzFdOwogCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkob3AgIT0gRVFVQUwgKSA/CiAJCQluZXcgQ29tcG91bmRBc3NpZ25tZW50KAogCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gLAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cisxXSwgCisJCQkJZXhwcmVzc2lvbiwKIAkJCQlvcCwKLQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDEpCToKKwkJCQlleHByZXNzaW9uLnNvdXJjZUVuZCk6CiAJCQluZXcgQXNzaWdubWVudCgKIAkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdICwKLQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHIrMV0sCi0JCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxKTsKLQkJCQkKKwkJCQlleHByZXNzaW9uLAorCQkJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKKwogCWlmICh0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlICE9IG51bGwpIHsKIAkJLy8gVXNlZCBvbmx5IGluIHN0YXRlbWVudHMgcmVjb3ZlcnkuCiAJCS8vIFRoaXMgaXMgbm90IGEgcmVhbCBhc3NpZ25tZW50IGJ1dCBhIHBsYWNlaG9sZGVyIGZvciBhbiBleGlzdGluZyBhbm9ueW1vdXMgdHlwZS4KQEAgLTE1NjIsMjkgKzE3NTksMzMgQEAKIAlFeHByZXNzaW9uIGV4cHIyID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV07CiAJc3dpdGNoKG9wKSB7CiAJCWNhc2UgT1JfT1IgOgotCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCQkJbmV3IE9SX09SX0V4cHJlc3Npb24oCi0JCQkJCWV4cHIxLCAKLQkJCQkJZXhwcjIsIAotCQkJCQlvcCk7IAorCQkJCQlleHByMSwKKwkJCQkJZXhwcjIsCisJCQkJCW9wKTsKIAkJCWJyZWFrOwogCQljYXNlIEFORF9BTkQgOgotCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCQkJbmV3IEFORF9BTkRfRXhwcmVzc2lvbigKLQkJCQkJZXhwcjEsIAotCQkJCQlleHByMiwgCisJCQkJCWV4cHIxLAorCQkJCQlleHByMiwKIAkJCQkJb3ApOwogCQkJYnJlYWs7CiAJCWNhc2UgUExVUyA6CiAJCQkvLyBsb29rIGZvciAic3RyaW5nMSIgKyAic3RyaW5nMiIKIAkJCWlmICh0aGlzLm9wdGltaXplU3RyaW5nTGl0ZXJhbHMpIHsKIAkJCQlpZiAoZXhwcjEgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0JCQkJCWlmIChleHByMiBpbnN0YW5jZW9mIENoYXJMaXRlcmFsKSB7IC8vIHN0cmluZytjaGFyCi0JCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCi0JCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoQ2hhckxpdGVyYWwpIGV4cHIyKTsgCi0JCQkJCX0gZWxzZSBpZiAoZXhwcjIgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7IC8vc3RyaW5nK3N0cmluZwotCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAotCQkJCQkJCSgoU3RyaW5nTGl0ZXJhbCkgZXhwcjEpLmV4dGVuZFdpdGgoKFN0cmluZ0xpdGVyYWwpIGV4cHIyKTsgCisJCQkJCWlmICgoKGV4cHIxLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgPT0gMCkgeworCQkJCQkJaWYgKGV4cHIyIGluc3RhbmNlb2YgQ2hhckxpdGVyYWwpIHsgLy8gc3RyaW5nK2NoYXIKKwkJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KKwkJCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoQ2hhckxpdGVyYWwpIGV4cHIyKTsKKwkJCQkJCX0gZWxzZSBpZiAoZXhwcjIgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7IC8vc3RyaW5nK3N0cmluZworCQkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQorCQkJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRXaXRoKChTdHJpbmdMaXRlcmFsKSBleHByMik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMpOworCQkJCQkJfQogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHIxLCBleHByMiwgUExVUyk7CiAJCQkJCX0KQEAgLTE1OTMsMTA1ICsxNzk0LDkyIEBACiAJCQkJCS8vIGxlZnQgYnJhbmNoIGlzIGNvbXByaXNlZCBvZiBQTFVTIEJFcwogCQkJCQkvLyBjdXJzb3IgaXMgc2hpZnRlZCB1cHdhcmRzLCB3aGlsZSBuZWVkZWQgQkVzIGFyZSBhZGRlZAogCQkJCQkvLyBvbiBkZW1hbmQ7IHBhc3QgdGhlIGFyaXR5TWF4LXRoCi0JCQkJCS8vIGNvbnNlY3V0aXZlIEJFLCBhIENCRSBpcyBpbnNlcnRlZCB0aGF0IGhvbGRzIGEgCisJCQkJCS8vIGNvbnNlY3V0aXZlIEJFLCBhIENCRSBpcyBpbnNlcnRlZCB0aGF0IGhvbGRzIGEKIAkJCQkJLy8gZnVsbC1mbGVkZ2VkIHJlZmVyZW5jZXMgdGFibGUKLQkJCQkJaWYgKChjdXJzb3IgPSAoQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uKWV4cHIxKS5hcml0eSA8Ci0JCQkJCQkJCWN1cnNvci5hcml0eU1heCkgewotCQkJCQkJY3Vyc29yLmxlZnQgPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihjdXJzb3IubGVmdCwKLQkJCQkJCQkJY3Vyc29yLnJpZ2h0LCBQTFVTKTsKKwkJCQkJaWYgKChjdXJzb3IgPSAoQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uKWV4cHIxKS5hcml0eSA8IGN1cnNvci5hcml0eU1heCkgeworCQkJCQkJY3Vyc29yLmxlZnQgPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihjdXJzb3IpOwogCQkJCQkJY3Vyc29yLmFyaXR5Kys7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQljdXJzb3IubGVmdCA9IG5ldyBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24oY3Vyc29yLmxlZnQsCi0JCQkJCQkJCWN1cnNvci5yaWdodCwgUExVUywgY3Vyc29yLmFyaXR5KTsKKwkJCQkJCWN1cnNvci5sZWZ0ID0gbmV3IENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbihjdXJzb3IpOwogCQkJCQkJY3Vyc29yLmFyaXR5ID0gMDsKIAkJCQkJCWN1cnNvci50dW5lQXJpdHlNYXgoKTsKIAkJCQkJfQogCQkJCQljdXJzb3IucmlnaHQgPSBleHByMjsKIAkJCQkJY3Vyc29yLnNvdXJjZUVuZCA9IGV4cHIyLnNvdXJjZUVuZDsKIAkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGN1cnNvcjsKLQkJCQkJLy8gQkVfSU5TVFJVTUVOVEFUSU9OOiBuZXV0cmFsaXplZCBpbiB0aGUgcmVsZWFzZWQgY29kZQkJCQkJCisJCQkJCS8vIEJFX0lOU1RSVU1FTlRBVElPTjogbmV1dHJhbGl6ZWQgaW4gdGhlIHJlbGVhc2VkIGNvZGUKIC8vCQkJCQljdXJzb3IuZGVwdGhUcmFja2VyID0gKChCaW5hcnlFeHByZXNzaW9uKWN1cnNvci5sZWZ0KS4KLS8vCQkJCQkJZGVwdGhUcmFja2VyICsgMTsJCQkJCQorLy8JCQkJCQlkZXB0aFRyYWNrZXIgKyAxOwogCQkJCX0gZWxzZSBpZiAoZXhwcjEgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uICYmCi0JCQkJCQkJLy8gc2luZ2xlIG91dCB0aGUgYSArIGIgY2FzZSwgd2hpY2ggaXMgYSBCRSAKLQkJCQkJCQkvLyBpbnN0ZWFkIG9mIGEgQ0JFIChzbGlnaHRseSBtb3JlIHRoYW4gYSBoYWxmIG9mIAotCQkJCQkJCS8vIHN0cmluZ3MgY29uY2F0ZW5hdGlvbiBhcmUgb25lLWRlZXAgYmluYXJ5IAorCQkJCQkJCS8vIHNpbmdsZSBvdXQgdGhlIGEgKyBiIGNhc2UsIHdoaWNoIGlzIGEgQkUKKwkJCQkJCQkvLyBpbnN0ZWFkIG9mIGEgQ0JFIChzbGlnaHRseSBtb3JlIHRoYW4gYSBoYWxmIG9mCisJCQkJCQkJLy8gc3RyaW5ncyBjb25jYXRlbmF0aW9uIGFyZSBvbmUtZGVlcCBiaW5hcnkKIAkJCQkJCQkvLyBleHByZXNzaW9ucykKLQkJCQkJCSgoZXhwcjEuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiAKKwkJCQkJCSgoZXhwcjEuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PgogCQkJCQkJCUFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0gT3BlcmF0b3JJZHMuUExVUykgewotCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCQkJbmV3IENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMsIDEpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCQkJCQluZXcgQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMpOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoZXhwcjEgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0JCQkJaWYgKGV4cHIyIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgeworCQkJCWlmIChleHByMiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwKKwkJCQkJCSYmICgoZXhwcjEuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUKSA9PSAwKSB7CiAJCQkJCS8vIHN0cmluZyArIHN0cmluZwotCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCi0JCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRzV2l0aCgoU3RyaW5nTGl0ZXJhbCkgZXhwcjIpOyAKKwkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CisJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRzV2l0aCgoU3RyaW5nTGl0ZXJhbCkgZXhwcjIpOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8vIHNpbmdsZSBvdXQgdGhlIGEgKyBiIGNhc2UKLQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQkJCW5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHIxLCBleHByMiwgUExVUyk7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChleHByMSBpbnN0YW5jZW9mIENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbikgewogCQkJCQlDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gY3Vyc29yOwotCQkJCQlpbnQgbnVtYmVyT2ZQYXJlbnMgPSAoZXhwcjEuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUOwogCQkJCQkvLyBzaGlmdCBjdXJzb3I7IGNyZWF0ZSBCRS9DQkUgYXMgbmVlZGVkCi0JCQkJCWlmICgoY3Vyc29yID0gKENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbilleHByMSkuYXJpdHkgPAotCQkJCQkJCQljdXJzb3IuYXJpdHlNYXgpIHsKLQkJCQkJCWN1cnNvci5sZWZ0ID0gbmV3IEJpbmFyeUV4cHJlc3Npb24oY3Vyc29yLmxlZnQsCi0JCQkJCQkJCWN1cnNvci5yaWdodCwgUExVUyk7Ci0JCQkJCQlpZiAobnVtYmVyT2ZQYXJlbnMgIT0gMCkgewotCQkJCQkJCS8vIGNsZWFyIHRoZSBiaXRzIG9uIGN1cnNvciBhbmQgcHV0IHRoZW0gYmFjayBvbiBjdXJzb3IubGVmdAotCQkJCQkJCWN1cnNvci5iaXRzICY9IH5BU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLOwotCQkJCQkJCWN1cnNvci5sZWZ0LmJpdHMgJj0gfkFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0s7Ci0JCQkJCQkJY3Vyc29yLmxlZnQuYml0cyB8PSBudW1iZXJPZlBhcmVucyA8PCBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKLQkJCQkJCX0KKwkJCQkJaWYgKChjdXJzb3IgPSAoQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uKWV4cHIxKS5hcml0eSA8IGN1cnNvci5hcml0eU1heCkgeworCQkJCQkJY3Vyc29yLmxlZnQgPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihjdXJzb3IpOworCQkJCQkJLy8gY2xlYXIgdGhlIGJpdHMgb24gY3Vyc29yCisJCQkJCQljdXJzb3IuYml0cyAmPSB+QVNUTm9kZS5QYXJlbnRoZXNpemVkTUFTSzsKIAkJCQkJCWN1cnNvci5hcml0eSsrOwogCQkJCQl9IGVsc2UgewotCQkJCQkJY3Vyc29yLmxlZnQgPSBuZXcgQ29tYmluZWRCaW5hcnlFeHByZXNzaW9uKGN1cnNvci5sZWZ0LAotCQkJCQkJCQljdXJzb3IucmlnaHQsIFBMVVMsIGN1cnNvci5hcml0eSk7Ci0JCQkJCQlpZiAobnVtYmVyT2ZQYXJlbnMgIT0gMCkgewotCQkJCQkJCS8vIGNsZWFyIHRoZSBiaXRzIG9uIGN1cnNvciBhbmQgcHV0IHRoZW0gYmFjayBvbiBjdXJzb3IubGVmdAotCQkJCQkJCWN1cnNvci5iaXRzICY9IH5BU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLOwotCQkJCQkJCWN1cnNvci5sZWZ0LmJpdHMgJj0gfkFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0s7Ci0JCQkJCQkJY3Vyc29yLmxlZnQuYml0cyB8PSBudW1iZXJPZlBhcmVucyA8PCBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKLQkJCQkJCX0KKwkJCQkJCWN1cnNvci5sZWZ0ID0gbmV3IENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbihjdXJzb3IpOworCQkJCQkJLy8gY2xlYXIgdGhlIGJpdHMgb24gY3Vyc29yCisJCQkJCQljdXJzb3IuYml0cyAmPSB+QVNUTm9kZS5QYXJlbnRoZXNpemVkTUFTSzsKIAkJCQkJCWN1cnNvci5hcml0eSA9IDA7CiAJCQkJCQljdXJzb3IudHVuZUFyaXR5TWF4KCk7CiAJCQkJCX0KIAkJCQkJY3Vyc29yLnJpZ2h0ID0gZXhwcjI7CiAJCQkJCWN1cnNvci5zb3VyY2VFbmQgPSBleHByMi5zb3VyY2VFbmQ7Ci0JCQkJCS8vIEJFX0lOU1RSVU1FTlRBVElPTjogbmV1dHJhbGl6ZWQgaW4gdGhlIHJlbGVhc2VkIGNvZGUJCQkJCQorCQkJCQkvLyBCRV9JTlNUUlVNRU5UQVRJT046IG5ldXRyYWxpemVkIGluIHRoZSByZWxlYXNlZCBjb2RlCiAvLwkJCQkJY3Vyc29yLmRlcHRoVHJhY2tlciA9ICgoQmluYXJ5RXhwcmVzc2lvbiljdXJzb3IubGVmdCkuCiAvLwkJCQkJCWRlcHRoVHJhY2tlciArIDE7CiAJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBjdXJzb3I7CiAJCQl9IGVsc2UgaWYgKGV4cHIxIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbgotCQkJCQkmJiAoKGV4cHIxLmJpdHMgJiBBU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gCisJCQkJCSYmICgoZXhwcjEuYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PgogCQkJCQkJCUFTVE5vZGUuT3BlcmF0b3JTSElGVCkgPT0gT3BlcmF0b3JJZHMuUExVUykgewogCQkJCS8vIHNpbmdsZSBvdXQgdGhlIGEgKyBiIGNhc2UKLQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCQkJCW5ldyBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24oZXhwcjEsIGV4cHIyLCBQTFVTLCAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCQluZXcgQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTEVTUyA6Ci0JCQl0aGlzLmludFB0ci0tOwotCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQljYXNlIE1VTFRJUExZIDoKKwkJCXRoaXMuaW50UHRyLS07IC8vIHN0YXIgZW5kIHBvc2l0aW9uIG9yIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGFuZ2xlIGJyYWNrZXQKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBCaW5hcnlFeHByZXNzaW9uKAotCQkJCQlleHByMSwgCi0JCQkJCWV4cHIyLCAKKwkJCQkJZXhwcjEsCisJCQkJCWV4cHIyLAogCQkJCQlvcCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdCA6Ci0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQluZXcgQmluYXJ5RXhwcmVzc2lvbigKLQkJCQkJZXhwcjEsIAotCQkJCQlleHByMiwgCisJCQkJCWV4cHIxLAorCQkJCQlleHByMiwKIAkJCQkJb3ApOwogCX0KIH0KQEAgLTE3MDQsMTcgKzE4OTIsMTcgQEAKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAkvKgogCWlmIChvcCA9PSBPUl9PUikgewotCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJbmV3IE9SX09SX0V4cHJlc3Npb24oCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV0sIAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIAotCQkJCW9wKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV0sCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwKKwkJCQlvcCk7CiAJfSBlbHNlIHsKIAkJaWYgKG9wID09IEFORF9BTkQpIHsKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBBTkRfQU5EX0V4cHJlc3Npb24oCi0JCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ciArIDFdLCAKLQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgCisJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ciArIDFdLAorCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLAogCQkJCQlvcCk7CiAJCX0gZWxzZSB7CiAJCQkvLyBsb29rIGZvciAic3RyaW5nMSIgKyAic3RyaW5nMiIKQEAgLTE3MjQsMTEgKzE5MTIsMTEgQEAKIAkJCQlleHByMiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJCQkJaWYgKGV4cHIxIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgewogCQkJCQlpZiAoZXhwcjIgaW5zdGFuY2VvZiBDaGFyTGl0ZXJhbCkgeyAvLyBzdHJpbmcrY2hhcgotCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAotCQkJCQkJCSgoU3RyaW5nTGl0ZXJhbCkgZXhwcjEpLmV4dGVuZFdpdGgoKENoYXJMaXRlcmFsKSBleHByMik7IAorCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CisJCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoQ2hhckxpdGVyYWwpIGV4cHIyKTsKIAkJCQkJfSBlbHNlIGlmIChleHByMiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsgLy9zdHJpbmcrc3RyaW5nCi0JCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCi0JCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoU3RyaW5nTGl0ZXJhbCkgZXhwcjIpOyAKKwkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQorCQkJCQkJCSgoU3RyaW5nTGl0ZXJhbCkgZXhwcjEpLmV4dGVuZFdpdGgoKFN0cmluZ0xpdGVyYWwpIGV4cHIyKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMpOwogCQkJCQl9CkBAIC0xNzM2LDEwICsxOTI0LDEwIEBACiAJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihleHByMSwgZXhwcjIsIFBMVVMpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCQluZXcgQmluYXJ5RXhwcmVzc2lvbigKLQkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ciArIDFdLCAKLQkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIAorCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV0sCisJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLAogCQkJCQkJb3ApOwogCQkJfQogCQl9CkBAIC0xNzQ3LDMzICsxOTM1LDM0IEBACiAJKi8KIAlFeHByZXNzaW9uIGV4cHIxID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyICsgMV07CiAJRXhwcmVzc2lvbiBleHByMiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07Ci0JLy8gTm90ZTogd2UgZG8gbm90IGF0dGVtcHQgdG8gcHJvbW90ZSBCaW5hcnlFeHByZXNzaW9uLXMgdG8gCisJLy8gTm90ZTogd2UgZG8gbm90IGF0dGVtcHQgdG8gcHJvbW90ZSBCaW5hcnlFeHByZXNzaW9uLXMgdG8KIAkvLyAgICAgICBJbmRleGVkQmluYXJ5RXhwcmVzc2lvbi1zIGhlcmUgc2luY2UgZXhwcjEgYWx3YXlzIGhvbGRzIGEgbmFtZQogCXN3aXRjaChvcCkgewogCQljYXNlIE9SX09SIDoKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBPUl9PUl9FeHByZXNzaW9uKAotCQkJCQlleHByMSwgCi0JCQkJCWV4cHIyLCAKLQkJCQkJb3ApOyAKKwkJCQkJZXhwcjEsCisJCQkJCWV4cHIyLAorCQkJCQlvcCk7CiAJCQlicmVhazsKIAkJY2FzZSBBTkRfQU5EIDoKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBBTkRfQU5EX0V4cHJlc3Npb24oCi0JCQkJCWV4cHIxLCAKLQkJCQkJZXhwcjIsIAorCQkJCQlleHByMSwKKwkJCQkJZXhwcjIsCiAJCQkJCW9wKTsKIAkJCWJyZWFrOwogCQljYXNlIFBMVVMgOgogCQkJLy8gbG9vayBmb3IgInN0cmluZzEiICsgInN0cmluZzIiCiAJCQlpZiAodGhpcy5vcHRpbWl6ZVN0cmluZ0xpdGVyYWxzKSB7Ci0JCQkJaWYgKGV4cHIxIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgeworCQkJCWlmIChleHByMSBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwKKwkJCQkJCSYmICgoZXhwcjEuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUKSA9PSAwKSB7CiAJCQkJCWlmIChleHByMiBpbnN0YW5jZW9mIENoYXJMaXRlcmFsKSB7IC8vIHN0cmluZytjaGFyCi0JCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCi0JCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoQ2hhckxpdGVyYWwpIGV4cHIyKTsgCisJCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KKwkJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRXaXRoKChDaGFyTGl0ZXJhbCkgZXhwcjIpOwogCQkJCQl9IGVsc2UgaWYgKGV4cHIyIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgeyAvL3N0cmluZytzdHJpbmcKLQkJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKLQkJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRXaXRoKChTdHJpbmdMaXRlcmFsKSBleHByMik7IAorCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CisJCQkJCQkJKChTdHJpbmdMaXRlcmFsKSBleHByMSkuZXh0ZW5kV2l0aCgoU3RyaW5nTGl0ZXJhbCkgZXhwcjIpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHIxLCBleHByMiwgUExVUyk7CiAJCQkJCX0KQEAgLTE3ODEsMzkgKzE5NzAsNDEgQEAKIAkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHIxLCBleHByMiwgUExVUyk7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChleHByMSBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLQkJCQlpZiAoZXhwcjIgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7CisJCQkJaWYgKGV4cHIyIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbAorCQkJCQkJJiYgKChleHByMS5iaXRzICYgQVNUTm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPj4gQVNUTm9kZS5QYXJlbnRoZXNpemVkU0hJRlQpID09IDApIHsKIAkJCQkJLy8gc3RyaW5nICsgc3RyaW5nCi0JCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKLQkJCQkJCSgoU3RyaW5nTGl0ZXJhbCkgZXhwcjEpLmV4dGVuZHNXaXRoKChTdHJpbmdMaXRlcmFsKSBleHByMik7IAorCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KKwkJCQkJCSgoU3RyaW5nTGl0ZXJhbCkgZXhwcjEpLmV4dGVuZHNXaXRoKChTdHJpbmdMaXRlcmFsKSBleHByMik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQkJCW5ldyBCaW5hcnlFeHByZXNzaW9uKAotCQkJCQkJCWV4cHIxLCAKLQkJCQkJCQlleHByMiwgCisJCQkJCQkJZXhwcjEsCisJCQkJCQkJZXhwcjIsCiAJCQkJCQkJb3ApOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCQluZXcgQmluYXJ5RXhwcmVzc2lvbigKLQkJCQkJCWV4cHIxLCAKLQkJCQkJCWV4cHIyLCAKKwkJCQkJCWV4cHIxLAorCQkJCQkJZXhwcjIsCiAJCQkJCQlvcCk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBMRVNTIDoKLQkJCXRoaXMuaW50UHRyLS07Ci0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCWNhc2UgTVVMVElQTFkgOgorCQkJdGhpcy5pbnRQdHItLTsgLy8gc3RhciBlbmQgcG9zaXRpb24gb3Igc3RhcnRpbmcgcG9zaXRpb24gb2YgYW5nbGUgYnJhY2tldAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCQkJbmV3IEJpbmFyeUV4cHJlc3Npb24oCi0JCQkJCWV4cHIxLCAKLQkJCQkJZXhwcjIsIAorCQkJCQlleHByMSwKKwkJCQkJZXhwcjIsCiAJCQkJCW9wKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0IDoKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBCaW5hcnlFeHByZXNzaW9uKAotCQkJCQlleHByMSwgCi0JCQkJCWV4cHIyLCAKLQkJCQkJb3ApOwkJCisJCQkJCWV4cHIxLAorCQkJCQlleHByMiwKKwkJCQkJb3ApOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVCbG9jaygpIHsKQEAgLTE4MjIsNyArMjAxMyw3IEBACiAKIAlpbnQgc3RhdGVtZW50c0xlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV07CiAJQmxvY2sgYmxvY2s7Ci0JaWYgKHN0YXRlbWVudHNMZW5ndGggPT0gMCkgeyAvLyBlbXB0eSBibG9jayAKKwlpZiAoc3RhdGVtZW50c0xlbmd0aCA9PSAwKSB7IC8vIGVtcHR5IGJsb2NrCiAJCWJsb2NrID0gbmV3IEJsb2NrKDApOwogCQlibG9jay5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJCWJsb2NrLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CkBAIC0xODM1LDExICsyMDI2LDExIEBACiAJCWJsb2NrID0gbmV3IEJsb2NrKHRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHItLV0pOwogCQl0aGlzLmFzdFB0ciAtPSBzdGF0ZW1lbnRzTGVuZ3RoOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5hc3RTdGFjaywgCi0JCQl0aGlzLmFzdFB0ciArIDEsIAotCQkJYmxvY2suc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbc3RhdGVtZW50c0xlbmd0aF0sIAotCQkJMCwgCi0JCQlzdGF0ZW1lbnRzTGVuZ3RoKTsgCisJCQl0aGlzLmFzdFN0YWNrLAorCQkJdGhpcy5hc3RQdHIgKyAxLAorCQkJYmxvY2suc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbc3RhdGVtZW50c0xlbmd0aF0sCisJCQkwLAorCQkJc3RhdGVtZW50c0xlbmd0aCk7CiAJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJYmxvY2suc291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIAl9CkBAIC0xODUzLDcgKzIwNDQsMTIgQEAKIAkvLyBTd2l0Y2hMYWJlbCA6Oj0gJ2Nhc2UnIENvbnN0YW50RXhwcmVzc2lvbiAnOicKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07Ci0JcHVzaE9uQXN0U3RhY2sobmV3IENhc2VTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5zb3VyY2VFbmQsIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKKwlDYXNlU3RhdGVtZW50IGNhc2VTdGF0ZW1lbnQgPSBuZXcgQ2FzZVN0YXRlbWVudChleHByZXNzaW9uLCBleHByZXNzaW9uLnNvdXJjZUVuZCwgdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CisJLy8gTG9vayBmb3IgJGZhbGwtdGhyb3VnaCQgdGFnIGluIGxlYWRpbmcgY29tbWVudCBmb3IgY2FzZSBzdGF0ZW1lbnQKKwlpZiAoaGFzTGVhZGluZ1RhZ0NvbW1lbnQoRkFMTF9USFJPVUdIX1RBRywgY2FzZVN0YXRlbWVudC5zb3VyY2VTdGFydCkpIHsKKwkJY2FzZVN0YXRlbWVudC5iaXRzIHw9IEFTVE5vZGUuRG9jdW1lbnRlZEZhbGx0aHJvdWdoOworCX0KKwlwdXNoT25Bc3RTdGFjayhjYXNlU3RhdGVtZW50KTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpIHsKIAkvL0Nhc3RFeHByZXNzaW9uIDo6PSAnKCcgRXhwcmVzc2lvbiAnKScgSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCkBAIC0xODYxLDEyICsyMDU3LDEzIEBACiAKIAkvL29wdGltaXplIHB1c2gvcG9wCiAKLQlFeHByZXNzaW9uIGNhc3QsZXhwOworCUV4cHJlc3Npb24gY2FzdDsKKwlFeHByZXNzaW9uIGV4cDsKIAl0aGlzLmV4cHJlc3Npb25QdHItLTsKLQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9CiAJCWNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oCiAJCQlleHA9dGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyKzFdICwKLQkJCWdldFR5cGVSZWZlcmVuY2UodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSkpOworCQkJKFR5cGVSZWZlcmVuY2UpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciAtLSA7CiAJdXBkYXRlU291cmNlUG9zaXRpb24oY2FzdCk7CiAJY2FzdC5zb3VyY2VFbmQ9ZXhwLnNvdXJjZUVuZDsKQEAgLTE4NzQsMTQgKzIwNzEsMTYgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhHZW5lcmljc0FycmF5KCkgewogCS8vIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgVHlwZUFyZ3VtZW50cyBEaW1zIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCiAKLQlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7CisJRXhwcmVzc2lvbiBleHA7CisJRXhwcmVzc2lvbiBjYXN0OworCVR5cGVSZWZlcmVuY2UgY2FzdFR5cGU7CiAJaW50IGVuZCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAKIAlpbnQgZGltID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2sodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSk7Ci0JCisKIAl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHAgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCBjYXN0VHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoZGltKSk7Ci0JaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIAljYXN0VHlwZS5zb3VyY2VFbmQgPSBlbmQgLSAxOwogCWNhc3RUeXBlLnNvdXJjZVN0YXJ0ID0gKGNhc3Quc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSArIDE7CiAJY2FzdC5zb3VyY2VFbmQgPSBleHAuc291cmNlRW5kOwpAQCAtMTg4OSwxMyArMjA4OCwxNSBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aE5hbWVBcnJheSgpIHsKIAkvLyBDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lIERpbXMgUHVzaFJQQVJFTiBJbnNpZGVDYXN0RXhwcmVzc2lvbiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKIAotCUV4cHJlc3Npb24gZXhwLCBjYXN0LCBjYXN0VHlwZTsKKwlFeHByZXNzaW9uIGV4cDsKKwlFeHByZXNzaW9uIGNhc3Q7CisJVHlwZVJlZmVyZW5jZSBjYXN0VHlwZTsKIAlpbnQgZW5kID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKLQkKKwogCS8vIGhhbmRsZSB0eXBlIGFyZ3VtZW50cwogCXB1c2hPbkdlbmVyaWNzTGVuZ3RoU3RhY2soMCk7CiAJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0pOwotCQorCiAJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgY2FzdFR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKIAljYXN0VHlwZS5zb3VyY2VFbmQgPSBlbmQgLSAxOwogCWNhc3RUeXBlLnNvdXJjZVN0YXJ0ID0gKGNhc3Quc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSArIDE7CkBAIC0xOTA4LDgxICsyMTA5LDI3IEBACiAKIAkvL29wdGltaXplIHRoZSBwdXNoL3BvcAogCi0JRXhwcmVzc2lvbiBleHAsIGNhc3QsIGNhc3RUeXBlOworCUV4cHJlc3Npb24gZXhwOworCUV4cHJlc3Npb24gY2FzdDsKKwlUeXBlUmVmZXJlbmNlIGNhc3RUeXBlOwogCWludCBlbmQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBjYXN0ID0gbmV3IENhc3RFeHByZXNzaW9uKGV4cCA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIGNhc3RUeXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSk7CiAJY2FzdFR5cGUuc291cmNlRW5kID0gZW5kIC0gMTsKIAljYXN0VHlwZS5zb3VyY2VTdGFydCA9IChjYXN0LnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSkgKyAxOwogCWNhc3Quc291cmNlRW5kID0gZXhwLnNvdXJjZUVuZDsKIH0KLXByb3RlY3RlZCBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBjb21wdXRlUXVhbGlmaWVkR2VuZXJpY3NGcm9tUmlnaHRTaWRlKFR5cGVSZWZlcmVuY2UgcmlnaHRTaWRlLCBpbnQgZGltKSB7Ci0JaW50IG5hbWVTaXplID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXTsKLQlpbnQgdG9rZW5zU2l6ZSA9IG5hbWVTaXplOwotCWlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQl0b2tlbnNTaXplICsrOwotCX0gZWxzZSBpZiAocmlnaHRTaWRlIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQl0b2tlbnNTaXplICsrOwotCX0gZWxzZSBpZiAocmlnaHRTaWRlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQkJdG9rZW5zU2l6ZSArPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHJpZ2h0U2lkZSkudG9rZW5zLmxlbmd0aDsKLQl9IGVsc2UgaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQkJdG9rZW5zU2l6ZSArPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHJpZ2h0U2lkZSkudG9rZW5zLmxlbmd0aDsKLQl9Ci0JVHlwZVJlZmVyZW5jZVtdW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW3Rva2Vuc1NpemVdW107Ci0JY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbdG9rZW5zU2l6ZV1bXTsKLQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbdG9rZW5zU2l6ZV07Ci0JaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSB7Ci0JCVBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlID0gKFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSByaWdodFNpZGU7Ci0JCXRva2Vuc1tuYW1lU2l6ZV0gPSBzaW5nbGVQYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS50b2tlbjsKLQkJcG9zaXRpb25zW25hbWVTaXplXSA9ICgoKGxvbmcpIHNpbmdsZVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0KSA8PCAzMikgKyBzaW5nbGVQYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQ7Ci0JCXR5cGVBcmd1bWVudHNbbmFtZVNpemVdID0gc2luZ2xlUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UudHlwZUFyZ3VtZW50czsKLQl9IGVsc2UgaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKLQkJU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlID0gKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHJpZ2h0U2lkZTsKLQkJdG9rZW5zW25hbWVTaXplXSA9IHNpbmdsZVR5cGVSZWZlcmVuY2UudG9rZW47Ci0JCXBvc2l0aW9uc1tuYW1lU2l6ZV0gPSAoKChsb25nKSBzaW5nbGVUeXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0KSA8PCAzMikgKyBzaW5nbGVUeXBlUmVmZXJlbmNlLnNvdXJjZUVuZDsKLQl9IGVsc2UgaWYgKHJpZ2h0U2lkZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7Ci0JCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlID0gKFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByaWdodFNpZGU7Ci0JCVR5cGVSZWZlcmVuY2VbXVtdIHJpZ2h0U2lkZVR5cGVBcmd1bWVudHMgPSBwYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS50eXBlQXJndW1lbnRzOwotCQlTeXN0ZW0uYXJyYXljb3B5KHJpZ2h0U2lkZVR5cGVBcmd1bWVudHMsIDAsIHR5cGVBcmd1bWVudHMsIG5hbWVTaXplLCByaWdodFNpZGVUeXBlQXJndW1lbnRzLmxlbmd0aCk7Ci0JCWNoYXJbXVtdIHJpZ2h0U2lkZVRva2VucyA9IHBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlLnRva2VuczsKLQkJU3lzdGVtLmFycmF5Y29weShyaWdodFNpZGVUb2tlbnMsIDAsIHRva2VucywgbmFtZVNpemUsIHJpZ2h0U2lkZVRva2Vucy5sZW5ndGgpOwotCQlsb25nW10gcmlnaHRTaWRlUG9zaXRpb25zID0gcGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zOwotCQlTeXN0ZW0uYXJyYXljb3B5KHJpZ2h0U2lkZVBvc2l0aW9ucywgMCwgcG9zaXRpb25zLCBuYW1lU2l6ZSwgcmlnaHRTaWRlUG9zaXRpb25zLmxlbmd0aCk7Ci0JfSBlbHNlIGlmIChyaWdodFNpZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7Ci0JCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByaWdodFNpZGU7Ci0JCWNoYXJbXVtdIHJpZ2h0U2lkZVRva2VucyA9IHF1YWxpZmllZFR5cGVSZWZlcmVuY2UudG9rZW5zOwotCQlTeXN0ZW0uYXJyYXljb3B5KHJpZ2h0U2lkZVRva2VucywgMCwgdG9rZW5zLCBuYW1lU2l6ZSwgcmlnaHRTaWRlVG9rZW5zLmxlbmd0aCk7Ci0JCWxvbmdbXSByaWdodFNpZGVQb3NpdGlvbnMgPSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uczsKLQkJU3lzdGVtLmFycmF5Y29weShyaWdodFNpZGVQb3NpdGlvbnMsIDAsIHBvc2l0aW9ucywgbmFtZVNpemUsIHJpZ2h0U2lkZVBvc2l0aW9ucy5sZW5ndGgpOwotCX0KLQotCWludCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwotCVR5cGVSZWZlcmVuY2VbXSBjdXJyZW50VHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2N1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoXTsKLQl0aGlzLmdlbmVyaWNzUHRyIC09IGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoOwotCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgY3VycmVudFR5cGVBcmd1bWVudHMsIDAsIGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoKTsKLQkKLQlpZiAobmFtZVNpemUgPT0gMSkgewotCQl0b2tlbnNbMF0gPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwotCQlwb3NpdGlvbnNbMF0gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKLQkJdHlwZUFyZ3VtZW50c1swXSA9IGN1cnJlbnRUeXBlQXJndW1lbnRzOwotCX0gZWxzZSB7Ci0JCXRoaXMuaWRlbnRpZmllclB0ciAtPSBuYW1lU2l6ZTsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBuYW1lU2l6ZSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBuYW1lU2l6ZSk7Ci0JCXR5cGVBcmd1bWVudHNbbmFtZVNpemUgLSAxXSA9IGN1cnJlbnRUeXBlQXJndW1lbnRzOwotCX0KLQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgdHlwZUFyZ3VtZW50cywgZGltLCBwb3NpdGlvbnMpOwotfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aFF1YWxpZmllZEdlbmVyaWNzQXJyYXkoKSB7CiAJLy8gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBPbmx5VHlwZUFyZ3VtZW50cyAnLicgQ2xhc3NPckludGVyZmFjZVR5cGUgRGltcyBQdXNoUlBBUkVOIEluc2lkZUNhc3RFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwotCUV4cHJlc3Npb24gZXhwLCBjYXN0LCBjYXN0VHlwZTsKKwlFeHByZXNzaW9uIGV4cDsKKwlFeHByZXNzaW9uIGNhc3Q7CisJVHlwZVJlZmVyZW5jZSBjYXN0VHlwZTsKIAlpbnQgZW5kID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAogCWludCBkaW0gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCVR5cGVSZWZlcmVuY2UgcmlnaHRTaWRlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKLQkKKwogCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlID0gY29tcHV0ZVF1YWxpZmllZEdlbmVyaWNzRnJvbVJpZ2h0U2lkZShyaWdodFNpZGUsIGRpbSk7Ci0JaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIAl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbihleHAgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCBjYXN0VHlwZSA9IHF1YWxpZmllZFBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKTsKIAljYXN0VHlwZS5zb3VyY2VFbmQgPSBlbmQgLSAxOwogCWNhc3RUeXBlLnNvdXJjZVN0YXJ0ID0gKGNhc3Quc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSArIDE7CkBAIC0xOTkyLDYgKzIxMzksNDMgQEAKIAkvLyBDYXRjaGVzIDo6PSBDYXRjaGVzIENhdGNoQ2xhdXNlCiAJb3B0aW1pemVkQ29uY2F0Tm9kZUxpc3RzKCk7CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2F0Y2hGb3JtYWxQYXJhbWV0ZXIoKSB7CisJLy8gQ2F0Y2hGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVyc29wdCBDYXRjaFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwljaGFyW10gaWRlbnRpZmllck5hbWUgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCWxvbmcgbmFtZVBvc2l0aW9ucyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCWludCBleHRlbmRlZERpbWVuc2lvbnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ4MzY5CisJVHlwZVJlZmVyZW5jZSB0eXBlID0gKFR5cGVSZWZlcmVuY2UpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CisJaWYgKGV4dGVuZGVkRGltZW5zaW9ucyA+IDApIHsKKwkJdHlwZSA9IHR5cGUuY29weURpbXModHlwZS5kaW1lbnNpb25zKCkgKyBleHRlbmRlZERpbWVuc2lvbnMpOworCQl0eXBlLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CisJfQorCXRoaXMuYXN0TGVuZ3RoUHRyLS07CisJaW50IG1vZGlmaWVyUG9zaXRpb25zID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwl0aGlzLmludFB0ci0tOworCUFyZ3VtZW50IGFyZyA9CisJCW5ldyBBcmd1bWVudCgKKwkJCWlkZW50aWZpZXJOYW1lLAorCQkJbmFtZVBvc2l0aW9ucywKKwkJCXR5cGUsCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyICsgMV0gJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOyAvLyBtb2RpZmllcnMKKwlhcmcuYml0cyAmPSB+QVNUTm9kZS5Jc0FyZ3VtZW50OworCWFyZy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbW9kaWZpZXJQb3NpdGlvbnM7CisJLy8gY29uc3VtZSBhbm5vdGF0aW9ucworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCWFyZy5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKKwl9CisJcHVzaE9uQXN0U3RhY2soYXJnKTsKKwkvKiBpZiBpbmNvbXBsZXRlIG1ldGhvZCBoZWFkZXIsIHRoaXMubGlzdExlbmd0aCBjb3VudGVyIHdpbGwgbm90IGhhdmUgYmVlbiByZXNldCwKKwkJaW5kaWNhdGluZyB0aGF0IHNvbWUgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrICovCisJdGhpcy5saXN0TGVuZ3RoKys7Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2F0Y2hIZWFkZXIoKSB7CiAJLy8gQ2F0Y2hEZWNsYXJhdGlvbiA6Oj0gJ2NhdGNoJyAnKCcgRm9ybWFsUGFyYW1ldGVyICcpJyAneycKIApAQCAtMjAwOCwyNyArMjE5Miw1MSBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCQorCiAJQXJndW1lbnQgYXJnID0gKEFyZ3VtZW50KXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CiAJLy8gY29udmVydCBhcmd1bWVudCB0byBsb2NhbCB2YXJpYWJsZQogCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IG5ldyBMb2NhbERlY2xhcmF0aW9uKGFyZy5uYW1lLCBhcmcuc291cmNlU3RhcnQsIGFyZy5zb3VyY2VFbmQpOwogCWxvY2FsRGVjbGFyYXRpb24udHlwZSA9IGFyZy50eXBlOwogCWxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGFyZy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCWxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBhcmcuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci0JCisKIAl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQobG9jYWxEZWNsYXJhdGlvbiwgMCk7CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24KIAl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHJlcXVlc3QgdG8gcmVzdGFydCBmcm9tIGhlcmUgb24KIAl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXRjaFR5cGUoKSB7CisJLy8gQ2F0Y2hUeXBlIDo6PSBVbmlvblR5cGUKKwlpbnQgbGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXTsKKwlpZiAobGVuZ3RoICE9IDEpIHsKKwkJVHlwZVJlZmVyZW5jZVtdIHR5cGVSZWZlcmVuY2VzOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLAorCQkJCSh0eXBlUmVmZXJlbmNlcyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0pLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKKwkJVW5pb25UeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBuZXcgVW5pb25UeXBlUmVmZXJlbmNlKHR5cGVSZWZlcmVuY2VzKTsKKwkJcHVzaE9uQXN0U3RhY2sodHlwZVJlZmVyZW5jZSk7CisJCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5tdWx0aUNhdGNoTm90QmVsb3cxNyh0eXBlUmVmZXJlbmNlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIHB1c2ggYmFjayB0aGUgdHlwZSByZWZlcmVuY2UKKwkJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMSk7CisJfQorfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCkgewotCS8vIENsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IEJsb2NrCisJLy8gQ2xhc3NCb2R5RGVjbGFyYXRpb24gOjo9IERpZXQgTmVzdGVkTWV0aG9kIENyZWF0ZUluaXRpYWxpemVyIEJsb2NrCiAJLy9wdXNoIGFuIEluaXRpYWxpemVyCiAJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKIAl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdLS07Ci0JQmxvY2sgYmxvY2sgPSAoQmxvY2spIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCUJsb2NrIGJsb2NrID0gKEJsb2NrKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyLS1dOworCXRoaXMuYXN0TGVuZ3RoUHRyLS07CiAJaWYgKHRoaXMuZGlldCkgYmxvY2suYml0cyAmPSB+QVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOyAvLyBjbGVhciBiaXQgc2luY2Ugd2FzIGRpZXQKLQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IG5ldyBJbml0aWFsaXplcihibG9jaywgMCk7CisJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbml0aWFsaXplci5zb3VyY2VTdGFydCA9IGJsb2NrLnNvdXJjZVN0YXJ0OworCWluaXRpYWxpemVyLmJsb2NrID0gYmxvY2s7CiAJdGhpcy5pbnRQdHItLTsgLy8gcG9wIHNvdXJjZXN0YXJ0IGxlZnQgb24gdGhlIHN0YWNrIGJ5IGNvbnN1bWVOZXN0ZWRNZXRob2QuCiAJaW5pdGlhbGl6ZXIuYm9keVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0aGlzLnJlYWxCbG9ja1B0ci0tOyAvLyBwb3AgdGhlIGJsb2NrIHZhcmlhYmxlIGNvdW50ZXIgbGVmdCBvbiB0aGUgc3RhY2sgYnkgY29uc3VtZU5lc3RlZE1ldGhvZApAQCAtMjAzOCw3ICsyMjQ2LDYgQEAKIAkJaW5pdGlhbGl6ZXIuamF2YWRvYyA9IHRoaXMuamF2YWRvYzsKIAkJdGhpcy5qYXZhZG9jID0gbnVsbDsKIAl9Ci0JdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPSBpbml0aWFsaXplcjsKIAlpbml0aWFsaXplci5ib2R5RW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKIAlpbml0aWFsaXplci5zb3VyY2VFbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwogCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwpAQCAtMjA1MSw5ICsyMjU4LDYgQEAKIAkvLyBDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUgQ2xhc3NCb2R5RGVjbGFyYXRpb25zCiAJdGhpcy5uZXN0ZWRUeXBlLS0gOwogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCkgewotCXRoaXMubmVzdGVkVHlwZS0tIDsKLX0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlvcHQoKSB7CiAJLy8gQ2xhc3NCb2R5b3B0IDo6PSAkZW1wdHkKIAlwdXNoT25Bc3RTdGFjayhudWxsKTsKQEAgLTIwNzEsMTIgKzIyNzUsOSBAQAogCiAJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAKLQkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQltYXJrSW5pdGlhbGl6ZXJzV2l0aExvY2FsVHlwZSh0eXBlRGVjbCk7Ci0KIAkvL2NvbnZlcnQgY29uc3RydWN0b3IgdGhhdCBkbyBub3QgaGF2ZSB0aGUgdHlwZSdzIG5hbWUgaW50byBtZXRob2RzCiAJYm9vbGVhbiBoYXNDb25zdHJ1Y3RvciA9IHR5cGVEZWNsLmNoZWNrQ29uc3RydWN0b3JzKHRoaXMpOwotCQorCiAJLy9hZGQgdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2hlbiBuZWVkZWQgKGludGVyZmFjZSBkb24ndCBoYXZlIGl0KQogCWlmICghaGFzQ29uc3RydWN0b3IpIHsKIAkJc3dpdGNoKFR5cGVEZWNsYXJhdGlvbi5raW5kKHR5cGVEZWNsLm1vZGlmaWVycykpIHsKQEAgLTIxMDQsMTcgKzIzMDUsMTcgQEAKIAkJdHlwZURlY2wuYml0cyB8PSBBU1ROb2RlLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2s7CiAJfQogCi0JdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAorCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSGVhZGVyKCkgewogCS8vIENsYXNzSGVhZGVyIDo6PSBDbGFzc0hlYWRlck5hbWUgQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IENsYXNzSGVhZGVySW1wbGVtZW50c29wdAogCi0JVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CQotCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpIHsgCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgewogCQl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCX0KIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgogCX0KIAkvLyBmbHVzaCB0aGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgY2xhc3MgaGVhZGVyCiAJdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKQEAgLTIxNDEsMTEgKzIzNDIsMTEgQEAKIAkvLyBUaGVyZSBpcyBhIGNsYXNzIGRlY2xhcmF0aW9uIG9uIHRoZSB0b3Agb2Ygc3RhY2sKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAlTeXN0ZW0uYXJyYXljb3B5KAotCQl0aGlzLmFzdFN0YWNrLCAKLQkJdGhpcy5hc3RQdHIgKyAxLCAKLQkJdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgCi0JCTAsIAotCQlsZW5ndGgpOyAKKwkJdGhpcy5hc3RTdGFjaywKKwkJdGhpcy5hc3RQdHIgKyAxLAorCQl0eXBlRGVjbC5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLAorCQkwLAorCQlsZW5ndGgpOwogCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VzW2ldLmJpdHMgfD0gQVNUTm9kZS5Jc1N1cGVyVHlwZTsKIAl9CkBAIC0yMTgxLDcgKzIzODIsNyBAQAogCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggdHdvIGludCBwb3NpdGlvbnM6IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsYXNzIHRva2VuIGFuZCBpdHMgZW5kLgogCS8vIHdlIHdhbnQgdG8ga2VlcCB0aGUgYmVnaW5uaW5nIHBvc2l0aW9uIGJ1dCBnZXQgcmlkIG9mIHRoZSBlbmQgcG9zaXRpb24KIAkvLyBpdCBpcyBvbmx5IHVzZWQgZm9yIHRoZSBDbGFzc0xpdGVyYWxBY2Nlc3MgcG9zaXRpb25zLgotCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOyAKKwl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0aGlzLmludFB0ci0tOyAvLyByZW1vdmUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY2xhc3MgdG9rZW4KIAogCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKQEAgLTIyMDEsMTggKzI0MDIsMTggQEAKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCXR5cGVEZWNsLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJdHlwZURlY2wuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCXR5cGVEZWNsLmJvZHlTdGFydCA9IHR5cGVEZWNsLnNvdXJjZUVuZCArIDE7CiAJcHVzaE9uQXN0U3RhY2sodHlwZURlY2wpOwogCiAJdGhpcy5saXN0TGVuZ3RoID0gMDsgLy8gd2lsbCBiZSB1cGRhdGVkIHdoZW4gcmVhZGluZyBzdXBlci1pbnRlcmZhY2VzCiAJLy8gcmVjb3ZlcnkKLQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsgCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCh0eXBlRGVjbCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtMjIyMSwyNyArMjQyMiw2IEBACiAJdHlwZURlY2wuamF2YWRvYyA9IHRoaXMuamF2YWRvYzsKIAl0aGlzLmphdmFkb2MgPSBudWxsOwogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgewotCS8vIENsYXNzSGVhZGVyTmFtZSA6Oj0gQ2xhc3NIZWFkZXJOYW1lMSBUeXBlUGFyYW1ldGVycwotCS8vIEludGVyZmFjZUhlYWRlck5hbWUgOjo9IEludGVyZmFjZUhlYWRlck5hbWUxIFR5cGVQYXJhbWV0ZXJzCi0JVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbil0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKLQotCS8vIGNvbnN1bWUgdHlwZSBwYXJhbWV0ZXJzCi0JaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwotCXRoaXMuZ2VuZXJpY3NQdHIgLT0gbGVuZ3RoOwotCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgdHlwZURlY2wudHlwZVBhcmFtZXRlcnMgPSBuZXcgVHlwZVBhcmFtZXRlcltsZW5ndGhdLCAwLCBsZW5ndGgpOwotCi0JdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wudHlwZVBhcmFtZXRlcnNbbGVuZ3RoLTFdLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKLQkKLQl0aGlzLmxpc3RUeXBlUGFyYW1ldGVyTGVuZ3RoID0gMDsKLQkKLQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7IC8vIGlzIHJlY292ZXJpbmcKLQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpIHRoaXMuY3VycmVudEVsZW1lbnQ7Ci0JCXJlY292ZXJlZFR5cGUucGVuZGluZ1R5cGVQYXJhbWV0ZXJzID0gbnVsbDsKLQkJCi0JCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7Ci0JfQotfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24oKSB7CiAJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAogCWNsYXNzSW5zdGFuY2VDcmVhdGlvbihmYWxzZSk7CkBAIC0yMjU1LDExICsyNDM1LDE1IEBACiAJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKIAljbGFzc0luc3RhbmNlQ3JlYXRpb24odHJ1ZSk7CiAKLQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxYWUgPSAKLQkJKFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07IAotCXFhZS5lbmNsb3NpbmdJbnN0YW5jZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07Ci0JdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IHFhZTsKKwlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxYWUgPQorCQkoUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCisJaWYgKHFhZS5hbm9ueW1vdXNUeXBlID09IG51bGwpIHsKKwkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJCXRoaXMuZXhwcmVzc2lvblB0ci0tOworCQlxYWUuZW5jbG9zaW5nSW5zdGFuY2UgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gcWFlOworCX0KIAlxYWUuc291cmNlU3RhcnQgPSBxYWUuZW5jbG9zaW5nSW5zdGFuY2Uuc291cmNlU3RhcnQ7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZFdpdGhUeXBlQXJndW1lbnRzKCkgewpAQCAtMjI3NywxOCArMjQ2MSwxOCBAQAogCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewogCQkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsIAotCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotCQkJCTAsIAotCQkJCWxlbmd0aCk7IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsCisJCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwKKwkJCQkwLAorCQkJCWxlbmd0aCk7CiAJCX0KIAkJYWxsb2MudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0KKwkJY2hlY2tGb3JEaWFtb25kKGFsbG9jLnR5cGUpOwogCQlsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgYWxsb2MudHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCWludFB0ci0tOworCQl0aGlzLmludFB0ci0tOwogCiAJCS8vdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnQKIAkJLy93aWxsIGJlIGNyZWF0ZWQgYW5kIGFkZGVkIGJ5IHRoZSBUQyAoc2VlIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcpCkBAIC0yMzEyLDE4ICsyNDk2LDIwIEBACiAJCQlsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJCXRoaXMuZ2VuZXJpY3NQdHIgLT0gbGVuZ3RoOwogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCBhbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24uc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCQkJY2hlY2tGb3JEaWFtb25kKGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUpOwogCQl9Ci0JCQotCQkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQkJbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uKTsKIAl9Ci0KLQl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKLQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxYWUgPSAKLQkJKFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07IAotCXFhZS5lbmNsb3NpbmdJbnN0YW5jZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07Ci0JdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IHFhZTsKKwkKKwlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxYWUgPQorCQkoUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCisJaWYgKHFhZS5hbm9ueW1vdXNUeXBlID09IG51bGwpIHsKKwkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CisJCXRoaXMuZXhwcmVzc2lvblB0ci0tOworCQlxYWUuZW5jbG9zaW5nSW5zdGFuY2UgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gcWFlOworCX0KIAlxYWUuc291cmNlU3RhcnQgPSBxYWUuZW5jbG9zaW5nSW5zdGFuY2Uuc291cmNlU3RhcnQ7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKCkgewpAQCAtMjM0MCwxOSArMjUyNiwyMCBAQAogCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewogCQkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsIAotCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotCQkJCTAsIAotCQkJCWxlbmd0aCk7IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsCisJCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwKKwkJCQkwLAorCQkJCWxlbmd0aCk7CiAJCX0KIAkJYWxsb2MudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJCWNoZWNrRm9yRGlhbW9uZChhbGxvYy50eXBlKTsKIAogCQlsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgYWxsb2MudHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCWludFB0ci0tOwotCQkKKwkJdGhpcy5pbnRQdHItLTsKKwogCQkvL3RoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50CiAJCS8vd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCBieSB0aGUgVEMgKHNlZSBjcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKQogCQlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CkBAIC0yMzc1LDExICsyNTYyLDkgQEAKIAkJCWxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwogCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAwLCBsZW5ndGgpOwotCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24uc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCQljaGVja0ZvckRpYW1vbmQoYWxsb2NhdGlvbkV4cHJlc3Npb24udHlwZSk7CiAJCX0KLQkJCi0JCS8vIG1hcmsgaW5pdGlhbGl6ZXJzIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAotCQltYXJrSW5pdGlhbGl6ZXJzV2l0aExvY2FsVHlwZShhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24pOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc09ySW50ZXJmYWNlKCkgewpAQCAtMjM5NSw3ICsyNTgwLDcgQEAKIAlwdXNoT25Bc3RTdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsKIAkvKiBpZiBpbmNvbXBsZXRlIHRocm93biBleGNlcHRpb24gbGlzdCwgdGhpcy5saXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAogCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBpdGVtcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjayAqLwotCXRoaXMubGlzdExlbmd0aCsrOyAJCisJdGhpcy5saXN0TGVuZ3RoKys7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NUeXBlTGlzdCgpIHsKIAkvLyBDbGFzc1R5cGVMaXN0IDo6PSBDbGFzc1R5cGVMaXN0ICcsJyBDbGFzc1R5cGVFbHQKQEAgLTI0MzQsNyArMjYxOSw3IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKSB7CiAJLy8gQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIEJsb2NrU3RhdGVtZW50cyAnfScKLQljb25jYXROb2RlTGlzdHMoKTsgLy8gZXhwbGljdGx5IGFkZCB0aGUgZmlyc3Qgc3RhdGVtZW50IGludG8gdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyAKKwljb25jYXROb2RlTGlzdHMoKTsgLy8gZXhwbGljdGx5IGFkZCB0aGUgZmlyc3Qgc3RhdGVtZW50IGludG8gdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpIHsKIAkvLyBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAgJ3snIEJsb2NrU3RhdGVtZW50c29wdCAnfScKQEAgLTI0NjYsMjMgKzI2NTEsMjUgQEAKIAlTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzID0gbnVsbDsKIAlpZiAoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pICE9IDApIHsKIAkJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwotCQlpZiAodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciArIDFdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKLQkJCS8vYXZvaWQgYSBpc1NvbWVUaGluZyB0aGF0IHdvdWxkIG9ubHkgYmUgdXNlZCBoZXJlIEJVVCB3aGF0IGlzIGZhc3RlciBiZXR3ZWVuIHR3byBhbHRlcm5hdGl2ZXMgPwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLmFzdFN0YWNrLCAKLQkJCQl0aGlzLmFzdFB0ciArIDIsIAotCQkJCXN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aCAtIDFdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGggLSAxKTsgCi0JCQljb25zdHJ1Y3RvckNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgKyAxXTsKLQkJfSBlbHNlIHsgLy9uZWVkIHRvIGFkZCBleHBsaWNpdGx5IHRoZSBzdXBlcigpOwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLmFzdFN0YWNrLCAKLQkJCQl0aGlzLmFzdFB0ciArIDEsIAotCQkJCXN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sIAotCQkJCTAsIAotCQkJCWxlbmd0aCk7IAotCQkJY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOworCQlpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVNZXRob2RCb2RpZXMpIHsKKwkJCWlmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyICsgMV0gaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgeworCQkJCS8vYXZvaWQgYSBpc1NvbWVUaGluZyB0aGF0IHdvdWxkIG9ubHkgYmUgdXNlZCBoZXJlIEJVVCB3aGF0IGlzIGZhc3RlciBiZXR3ZWVuIHR3byBhbHRlcm5hdGl2ZXMgPworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCXRoaXMuYXN0UHRyICsgMiwKKwkJCQkJc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoIC0gMV0sCisJCQkJCTAsCisJCQkJCWxlbmd0aCAtIDEpOworCQkJCWNvbnN0cnVjdG9yQ2FsbCA9IChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciArIDFdOworCQkJfSBlbHNlIHsgLy9uZWVkIHRvIGFkZCBleHBsaWNpdGx5IHRoZSBzdXBlcigpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCXRoaXMuYXN0UHRyICsgMSwKKwkJCQkJc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCQkJMCwKKwkJCQkJbGVuZ3RoKTsKKwkJCQljb25zdHJ1Y3RvckNhbGwgPSBTdXBlclJlZmVyZW5jZS5pbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCk7CisJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlib29sZWFuIGluc2lkZUZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKQEAgLTI0OTQsNyArMjY4MSw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCWlmICghdGhpcy5kaWV0IHx8IGluc2lkZUZpZWxkSW5pdGlhbGl6ZXIpewogCQkJLy8gYWRkIGl0IG9ubHkgaW4gbm9uLWRpZXQgbW9kZSwgaWYgZGlldF9ib2RpZXMsIHRoZW4gY29uc3RydWN0b3IgY2FsbCB3aWxsIGJlIGFkZGVkIGVsc2V3aGVyZS4KIAkJCWNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKQEAgLTI1MTMsNyArMjcwMCw3IEBACiAJfQogCiAJaWYgKCEodGhpcy5kaWV0ICYmIHRoaXMuZGlldEludCA9PSAwKQotCQkJJiYgc3RhdGVtZW50cyA9PSBudWxsIAorCQkJJiYgc3RhdGVtZW50cyA9PSBudWxsCiAJCQkmJiAoY29uc3RydWN0b3JDYWxsID09IG51bGwgfHwgY29uc3RydWN0b3JDYWxsLmlzSW1wbGljaXRTdXBlcigpKQogCQkJJiYgIWNvbnRhaW5zQ29tbWVudChjZC5ib2R5U3RhcnQsIHRoaXMuZW5kUG9zaXRpb24pKSB7CiAJCWNkLmJpdHMgfD0gQVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwpAQCAtMjUyMyw0MCArMjcxMCw0MCBAQAogCS8vIHN0b3JlIHRoZSB0aGlzLmVuZFBvc2l0aW9uIChwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgJ30nKSBpbiBjYXNlIHRoZXJlIGlzCiAJLy8gYSB0cmFpbGluZyBjb21tZW50IGJlaGluZCB0aGUgZW5kIG9mIHRoZSBtZXRob2QKIAljZC5ib2R5RW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKLQljZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJY2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKSB7CiAJLy8gQ29uc3RydWN0b3JIZWFkZXIgOjo9IENvbnN0cnVjdG9ySGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdAogCiAJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbil0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAotCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpeyAKKwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsKIAkJbWV0aG9kLmJvZHlTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJfQogCS8vIHJlY292ZXJ5CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peyAvLyBmb3IgaW52YWxpZCBjb25zdHJ1Y3RvcnMKLQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OwkJCQorCQkJbWV0aG9kLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1NlbWljb2xvbkJvZHk7CiAJCQltZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLTE7CiAJCQltZXRob2QuYm9keUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tMTsKIAkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50LnBhcnNlVHJlZSgpID09IG1ldGhvZCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudCAhPSBudWxsKSB7CiAJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQucGFyZW50OwogCQkJfQotCQl9CQkKKwkJfQogCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KLQl9CQkKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lKCkgewogCiAJLyogcmVjb3ZlcmluZyAtIG1pZ2h0IGJlIGFuIGVtcHR5IG1lc3NhZ2Ugc2VuZCAqLwogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQlpZiAodGhpcy5sYXN0SWdub3JlZFRva2VuID09IFRva2VuTmFtZW5ldyl7IC8vIHdhcyBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24KLQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsgLy8gZm9yY2UgdG8gcmVzdGFydCBhdCB0aGlzIGV4YWN0IHBvc2l0aW9uCQkJCQorCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24KIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQkKKwogCS8vIENvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gIE1vZGlmaWVyc29wdCAnSWRlbnRpZmllcicgJygnCiAJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKIApAQCAtMjU3MiwxMiArMjc1OSwxMiBAQAogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJY2QuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCi0JfQkKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCWNkLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOworCX0KIAkvLyBqYXZhZG9jCiAJY2QuamF2YWRvYyA9IHRoaXMuamF2YWRvYzsKIAl0aGlzLmphdmFkb2MgPSBudWxsOwpAQCAtMjU5NywxOSArMjc4NCwxOSBAQAogCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGNkLCAwKTsKIAkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQl9Ci0JfQkKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgewogCiAJLyogcmVjb3ZlcmluZyAtIG1pZ2h0IGJlIGFuIGVtcHR5IG1lc3NhZ2Ugc2VuZCAqLwogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQlpZiAodGhpcy5sYXN0SWdub3JlZFRva2VuID09IFRva2VuTmFtZW5ldyl7IC8vIHdhcyBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24KLQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsgLy8gZm9yY2UgdG8gcmVzdGFydCBhdCB0aGlzIGV4YWN0IHBvc2l0aW9uCQkJCQorCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24KIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQkKKwogCS8vIENvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gIE1vZGlmaWVyc29wdCBUeXBlUGFyYW1ldGVycyAnSWRlbnRpZmllcicgJygnCiAJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKIApAQCAtMjYyMiwxOCArMjgwOSwxOCBAQAogCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIGNkLnR5cGVQYXJhbWV0ZXJzID0gbmV3IFR5cGVQYXJhbWV0ZXJbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKLQkKKwogCS8vbW9kaWZpZXJzCiAJY2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJY2QubW9kaWZpZXJzID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkvLyBjb25zdW1lIGFubm90YXRpb25zCiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJY2QuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQljZC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJLy8gamF2YWRvYwogCWNkLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7CkBAIC0yNjU0LDE3ICsyODQxLDI1IEBACiAJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoY2QsIDApOwogCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CiAJCX0KLQl9CQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDcmVhdGVJbml0aWFsaXplcigpIHsKKwlwdXNoT25Bc3RTdGFjayhuZXcgSW5pdGlhbGl6ZXIobnVsbCwgMCkpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZURlZmF1bHRMYWJlbCgpIHsKIAkvLyBTd2l0Y2hMYWJlbCA6Oj0gJ2RlZmF1bHQnICc6JwotCXB1c2hPbkFzdFN0YWNrKG5ldyBDYXNlU3RhdGVtZW50KG51bGwsIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKKwlDYXNlU3RhdGVtZW50IGRlZmF1bHRTdGF0ZW1lbnQgPSBuZXcgQ2FzZVN0YXRlbWVudChudWxsLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKKwkvLyBMb29rIGZvciAkZmFsbC10aHJvdWdoJCB0YWcgaW4gbGVhZGluZyBjb21tZW50IGZvciBjYXNlIHN0YXRlbWVudAorCWlmIChoYXNMZWFkaW5nVGFnQ29tbWVudChGQUxMX1RIUk9VR0hfVEFHLCBkZWZhdWx0U3RhdGVtZW50LnNvdXJjZVN0YXJ0KSkgeworCQlkZWZhdWx0U3RhdGVtZW50LmJpdHMgfD0gQVNUTm9kZS5Eb2N1bWVudGVkRmFsbHRocm91Z2g7CisJfQkKKwlwdXNoT25Bc3RTdGFjayhkZWZhdWx0U3RhdGVtZW50KTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCkgewogCWNoZWNrQ29tbWVudCgpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAogCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzKTsgLy8gbW9kaWZpZXJzCiAJcHVzaE9uSW50U3RhY2soCi0JCXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPj0gMCA/IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgOiB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbik7IAorCQl0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID49IDAgPyB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0IDogdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCXJlc2V0TW9kaWZpZXJzKCk7CiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrTGVuZ3RoU3RhY2soMCk7IC8vIG5vIGFubm90YXRpb24KIH0KQEAgLTI2ODMsMTYgKzI4NzgsMjUgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcigpIHsKIAkvLyBEaW1XaXRoT3JXaXRoT3V0RXhwciA6Oj0gJ1snICddJwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhudWxsKTsKLQkKKwogCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpIHsKIAkJdGhpcy5pZ25vcmVOZXh0T3BlbmluZ0JyYWNlID0gdHJ1ZTsKLQkJdGhpcy5jdXJyZW50RWxlbWVudC5icmFja2V0QmFsYW5jZSsrOyAKKwkJdGhpcy5jdXJyZW50RWxlbWVudC5icmFja2V0QmFsYW5jZSsrOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKSB7CiAJLy8gRGltV2l0aE9yV2l0aE91dEV4cHJzIDo6PSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgRGltV2l0aE9yV2l0aE91dEV4cHIKIAljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmlvblR5cGUoKSB7CisJLy8gVW5pb25UeXBlIDo6PSBVbmlvblR5cGUgJ3wnIFR5cGUKKwlwdXNoT25Bc3RTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKKwlvcHRpbWl6ZWRDb25jYXROb2RlTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmlvblR5cGVBc0NsYXNzVHlwZSgpIHsKKwkvLyBVbmlvblR5cGUgOjo9IFR5cGUKKwlwdXNoT25Bc3RTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCkgewogCS8vIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSAkZW1wdHkKIAlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKQEAgLTI3MjcsMTQgKzI5MzEsNiBAQAogCS8vIENsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CiAJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlNZXRob2RIZWFkZXJEZWZhdWx0VmFsdWUoKSB7Ci0JLy8gRGVmYXVsdFZhbHVlb3B0IDo6PSAkZW1wdHkKLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwotCWlmKG1ldGhvZC5pc0Fubm90YXRpb25NZXRob2QoKSkgeyAvLydtZXRob2QnIGNhbiBiZSBhIE1ldGhvZERlY2xhcmF0aW9uIHdoZW4gcmVjb3ZlcnkgaXMgc3RhcnRlZAotCQlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKLQl9Ci0JdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyA9IHRydWU7Ci19CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlEaW1zb3B0KCkgewogCS8vIERpbXNvcHQgOjo9ICRlbXB0eQogCXB1c2hPbkludFN0YWNrKDApOwpAQCAtMjc2NCwyMyArMjk2MCwyNiBAQAogCS8vIG5vdGhpbmcgdG8gZG8gYnkgZGVmYXVsdAogCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdC5pc1BhY2thZ2VJbmZvKCkpIHsKIAkJdGhpcy5jb21waWxhdGlvblVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzFdOwotCQkvLyBjcmVhdGUgYSBmYWtlIGludGVyZmFjZSBkZWNsYXJhdGlvbgotCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCWRlY2xhcmF0aW9uLm5hbWUgPSBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FOwotCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NJbnRlcmZhY2U7Ci0JCXRoaXMuY29tcGlsYXRpb25Vbml0LnR5cGVzWzBdID0gZGVjbGFyYXRpb247Ci0JCWRlY2xhcmF0aW9uLmphdmFkb2MgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5qYXZhZG9jOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jcmVhdGVQYWNrYWdlSW5mb1R5cGUoKTsKIAl9CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlNZW1iZXJWYWx1ZVBhaXJzb3B0KCkgewotCS8vIE1lbWJlclZhbHVlUGFpcnNvcHQgOjo9ICRlbXB0eQotCXB1c2hPbkFzdExlbmd0aFN0YWNrKDApOwotfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5TWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyKCkgewogCS8vIE1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0gJ3snICcsJyAnfScKIAkvLyBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgOjo9ICd7JyAnfScKIAlhcnJheUluaXRpYWxpemVyKDApOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5TWVtYmVyVmFsdWVQYWlyc29wdCgpIHsKKwkvLyBNZW1iZXJWYWx1ZVBhaXJzb3B0IDo6PSAkZW1wdHkKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eU1ldGhvZEhlYWRlckRlZmF1bHRWYWx1ZSgpIHsKKwkvLyBEZWZhdWx0VmFsdWVvcHQgOjo9ICRlbXB0eQorCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaWYobWV0aG9kLmlzQW5ub3RhdGlvbk1ldGhvZCgpKSB7IC8vJ21ldGhvZCcgY2FuIGJlIGEgTWV0aG9kRGVjbGFyYXRpb24gd2hlbiByZWNvdmVyeSBpcyBzdGFydGVkCisJCXB1c2hPbkV4cHJlc3Npb25TdGFja0xlbmd0aFN0YWNrKDApOworCX0KKwl0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzID0gdHJ1ZTsKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eVN0YXRlbWVudCgpIHsKIAkvLyBFbXB0eVN0YXRlbWVudCA6Oj0gJzsnCiAJY2hhcltdIHNvdXJjZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2U7CkBAIC0yODA4LDcgKzMwMDcsNyBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQlwdXNoT25Bc3RTdGFjayhuZXcgRW1wdHlTdGF0ZW1lbnQodGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbiwgdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbikpOworCQlwdXNoT25Bc3RTdGFjayhuZXcgRW1wdHlTdGF0ZW1lbnQodGhpcy5lbmRQb3NpdGlvbiArIDEsIHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlTd2l0Y2hCbG9jaygpIHsKQEAgLTI4MTgsMjAgKzMwMTcsNTEgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpIHsKIAkvLyBDbGFzc01lbWJlckRlY2xhcmF0aW9uIDo6PSAnOycKIAkvLyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gJzsnCi0JLy8gVHlwZURlY2xhcmF0aW9uIDo6PSAnOycgCisJLy8gVHlwZURlY2xhcmF0aW9uIDo6PSAnOycKIAlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCkgcHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJmbHVvdXNTZW1pY29sb24odGhpcy5lbmRQb3NpdGlvbisxLCB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIAlmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnQoKSB7CisJLy8gRW5oYW5jZWRGb3JTdGF0ZW1lbnQgOjo9IEVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVyIFN0YXRlbWVudAorCS8vIEVuaGFuY2VkRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlciBTdGF0ZW1lbnROb1Nob3J0SWYKKworCS8vc3RhdGVtZW50cworCXRoaXMuYXN0TGVuZ3RoUHRyLS07CisJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CisKKwkvLyBmb3JlYWNoIHN0YXRlbWVudCBpcyBvbiB0aGUgYXN0IHN0YWNrCisJRm9yZWFjaFN0YXRlbWVudCBmb3JlYWNoU3RhdGVtZW50ID0gKEZvcmVhY2hTdGF0ZW1lbnQpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCWZvcmVhY2hTdGF0ZW1lbnQuYWN0aW9uID0gc3RhdGVtZW50OworCS8vIHJlbWVtYmVyIHVzZWZ1bCBlbXB0eSBzdGF0ZW1lbnQKKwlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHN0YXRlbWVudC5iaXRzIHw9IEFTVE5vZGUuSXNVc2VmdWxFbXB0eVN0YXRlbWVudDsKKworCWZvcmVhY2hTdGF0ZW1lbnQuc291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlcigpeworCS8vIEVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVyIDo6PSBFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlckluaXQgJzonIEV4cHJlc3Npb24gJyknCisJZmluYWwgRm9yZWFjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoRm9yZWFjaFN0YXRlbWVudCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJLy91cGRhdGVzIGFyZSBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjaworCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCWZpbmFsIEV4cHJlc3Npb24gY29sbGVjdGlvbiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXTsKKwlzdGF0ZW1lbnQuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJc3RhdGVtZW50LnNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOworCisJaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZGb3JlYWNoU3RhdGVtZW50cyhzdGF0ZW1lbnQuZWxlbWVudFZhcmlhYmxlLCBjb2xsZWN0aW9uKTsKKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXJJbml0KGJvb2xlYW4gaGFzTW9kaWZpZXJzKSB7CiAJVHlwZVJlZmVyZW5jZSB0eXBlOwogCiAJY2hhcltdIGlkZW50aWZpZXJOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKIAlsb25nIG5hbWVQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKLQkKKwogCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IGNyZWF0ZUxvY2FsRGVjbGFyYXRpb24oaWRlbnRpZmllck5hbWUsIChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSwgKGludCkgbmFtZVBvc2l0aW9uKTsKIAlsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkVuZDsKLQkKKwogCWludCBleHRyYURpbXMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCXRoaXMuaWRlbnRpZmllclB0ci0tOwogCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwpAQCAtMjg1MSwxMSArMzA4MSwxMSBAQAogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pIT0gMCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwgCi0JCQlsb2NhbERlY2xhcmF0aW9uLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJbG9jYWxEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJaWYgKGhhc01vZGlmaWVycykgewogCQlsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwpAQCAtMjg2OCw1MCArMzA5OCwxOSBAQAogCUZvcmVhY2hTdGF0ZW1lbnQgaXRlcmF0b3JGb3JTdGF0ZW1lbnQgPQogCQluZXcgRm9yZWFjaFN0YXRlbWVudCgKIAkJCWxvY2FsRGVjbGFyYXRpb24sCi0JCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsgCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKIAlwdXNoT25Bc3RTdGFjayhpdGVyYXRvckZvclN0YXRlbWVudCk7Ci0JCisKIAlpdGVyYXRvckZvclN0YXRlbWVudC5zb3VyY2VFbmQgPSBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOwogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVyKCl7Ci0JLy8gRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIgOjo9IEVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVySW5pdCAnOicgRXhwcmVzc2lvbiAnKScKLQlmaW5hbCBGb3JlYWNoU3RhdGVtZW50IHN0YXRlbWVudCA9IChGb3JlYWNoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKLQkvL3VwZGF0ZXMgYXJlIG9uIHRoZSBleHByZXNzaW9uIHN0YWNrCi0JdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07Ci0JZmluYWwgRXhwcmVzc2lvbiBjb2xsZWN0aW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dOwotCXN0YXRlbWVudC5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQlzdGF0ZW1lbnQuc291cmNlRW5kID0gdGhpcy5yUGFyZW5Qb3M7Ci0JCi0JaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgJiYKLQkJCW9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmCi0JCQl0aGlzLmxhc3RFcnJvckVuZFBvc2l0aW9uQmVmb3JlUmVjb3ZlcnkgPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7Ci0JCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZGb3JlYWNoU3RhdGVtZW50cyhzdGF0ZW1lbnQuZWxlbWVudFZhcmlhYmxlLCBjb2xsZWN0aW9uKTsKLQl9CQotfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50KCkgewotCS8vIEVuaGFuY2VkRm9yU3RhdGVtZW50IDo6PSBFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlciBTdGF0ZW1lbnQKLQkvLyBFbmhhbmNlZEZvclN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIgU3RhdGVtZW50Tm9TaG9ydElmCi0KLQkvL3N0YXRlbWVudHMKLQl0aGlzLmFzdExlbmd0aFB0ci0tOwotCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyLS1dOwotCi0JLy8gZm9yZWFjaCBzdGF0ZW1lbnQgaXMgb24gdGhlIGFzdCBzdGFjawotCUZvcmVhY2hTdGF0ZW1lbnQgZm9yZWFjaFN0YXRlbWVudCA9IChGb3JlYWNoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKLQlmb3JlYWNoU3RhdGVtZW50LmFjdGlvbiA9IHN0YXRlbWVudDsKLQkvLyByZW1lbWJlciB1c2VmdWwgZW1wdHkgc3RhdGVtZW50Ci0JaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSBzdGF0ZW1lbnQuYml0cyB8PSBBU1ROb2RlLklzVXNlZnVsRW1wdHlTdGF0ZW1lbnQ7Ci0JCi0JZm9yZWFjaFN0YXRlbWVudC5zb3VyY2VFbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwotfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgeworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KGJvb2xlYW4gcXVhbGlmaWVkKSB7CiAJLy8gRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9ICRlbXB0eQogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CiAKLQlUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzVHlwZSA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOyAKKwlUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzVHlwZSA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOwogCWFub255bW91c1R5cGUubmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlhbm9ueW1vdXNUeXBlLmJpdHMgfD0gKEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlfEFTVE5vZGUuSXNMb2NhbFR5cGUpOwotCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gbmV3IFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKGFub255bW91c1R5cGUpOyAKKwlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsKIAltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOwogCXB1c2hPbkFzdFN0YWNrKGFub255bW91c1R5cGUpOwogCkBAIC0yOTIwLDEyICszMTE5LDE4IEBACiAJaWYgKChhcmd1bWVudExlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewogCQl0aGlzLmV4cHJlc3Npb25QdHIgLT0gYXJndW1lbnRMZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2FyZ3VtZW50TGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWFyZ3VtZW50TGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsCisJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvblthcmd1bWVudExlbmd0aF0sCisJCQkwLAorCQkJYXJndW1lbnRMZW5ndGgpOwogCX0KKwkKKwlpZiAocXVhbGlmaWVkKSB7CisJCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCQlhbGxvYy5lbmNsb3NpbmdJbnN0YW5jZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXTsKKwl9CisJCiAJYWxsb2MudHlwZSA9IHR5cGVSZWZlcmVuY2U7CiAKIAlhbm9ueW1vdXNUeXBlLnNvdXJjZUVuZCA9IGFsbG9jLnNvdXJjZUVuZDsKQEAgLTI5MzQsMTkgKzMxMzksMjQgQEAKIAlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFsbG9jKTsKIAotCWFub255bW91c1R5cGUuYm9keVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCisJYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCXRoaXMubGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcwotCQorCiAJLy8gZmx1c2ggdGhlIGNvbW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGFub255bW91cwogCXRoaXMuc2Nhbm5lci5jb21tZW50UHRyID0gLTE7Ci0JCisKIAkvLyByZWNvdmVyeQotCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKLQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGFub255bW91c1R5cGUuYm9keVN0YXJ0OwkJCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKIAkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOwotCQl0aGlzLmN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKKwkJaWYgKCEodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEFubm90YXRpb24pKSB7CisJCQl0aGlzLmN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKKwkJfSBlbHNlIHsKKwkJCXRoaXMuaWdub3JlTmV4dE9wZW5pbmdCcmFjZSA9IHRydWU7CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmJyYWNrZXRCYWxhbmNlKys7CisJCX0KIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JfQkKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJDb21waWxhdGlvblVuaXQoKSB7CiAJLy8gRW50ZXJDb21waWxhdGlvblVuaXQgOjo9ICRlbXB0eQpAQCAtMjk1NCwxMyArMzE2NCwxNiBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyTWVtYmVyVmFsdWUoKSB7CiAJLy8gRW50ZXJNZW1iZXJWYWx1ZSA6Oj0gJGVtcHR5Ci0JLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQW5ub3RhdGlvbikgeworCQlSZWNvdmVyZWRBbm5vdGF0aW9uIHJlY292ZXJlZEFubm90YXRpb24gPSAoUmVjb3ZlcmVkQW5ub3RhdGlvbil0aGlzLmN1cnJlbnRFbGVtZW50OworCQlyZWNvdmVyZWRBbm5vdGF0aW9uLmhhc1BlbmRpbmdNZW1iZXJWYWx1ZU5hbWUgPSB0cnVlOworCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlck1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpIHsKIAkvLyBFbnRlck1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0gJGVtcHR5CiAJaWYodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CiAJCXRoaXMuaWdub3JlTmV4dE9wZW5pbmdCcmFjZSA9IHRydWU7Ci0JCXRoaXMuY3VycmVudEVsZW1lbnQuYnJhY2tldEJhbGFuY2UrKzsgCisJCXRoaXMuY3VycmVudEVsZW1lbnQuYnJhY2tldEJhbGFuY2UrKzsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJWYXJpYWJsZSgpIHsKQEAgLTI5NzIsMTcgKzMxODUsMTcgQEAKIAlpbnQgZXh0ZW5kZWREaW1lbnNpb24gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKIAkvLyBjcmVhdGUgdGhlIGFzdCBub2RlCi0JYm9vbGVhbiBpc0xvY2FsRGVjbGFyYXRpb24gPSB0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdICE9IDA7IAorCWJvb2xlYW4gaXNMb2NhbERlY2xhcmF0aW9uID0gdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSAhPSAwOwogCWlmIChpc0xvY2FsRGVjbGFyYXRpb24pIHsKIAkJLy8gY3JlYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKLQkJZGVjbGFyYXRpb24gPSAKLQkJCXRoaXMuY3JlYXRlTG9jYWxEZWNsYXJhdGlvbihpZGVudGlmaWVyTmFtZSwgKGludCkgKG5hbWVQb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBuYW1lUG9zaXRpb24pOworCQlkZWNsYXJhdGlvbiA9CisJCQljcmVhdGVMb2NhbERlY2xhcmF0aW9uKGlkZW50aWZpZXJOYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7CiAJfSBlbHNlIHsKIAkJLy8gY3JlYXRlIHRoZSBmaWVsZCBkZWNsYXJhdGlvbgotCQlkZWNsYXJhdGlvbiA9IAotCQkJdGhpcy5jcmVhdGVGaWVsZERlY2xhcmF0aW9uKGlkZW50aWZpZXJOYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7IAorCQlkZWNsYXJhdGlvbiA9CisJCQljcmVhdGVGaWVsZERlY2xhcmF0aW9uKGlkZW50aWZpZXJOYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7CiAJfQotCQorCiAJdGhpcy5pZGVudGlmaWVyUHRyLS07CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAJVHlwZVJlZmVyZW5jZSB0eXBlOwpAQCAtMjk5NywxMiArMzIxMCwxMiBAQAogCQkJaW50IGxlbmd0aDsKIAkJCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCQkJZGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCQkJMCwgCi0JCQkJCWxlbmd0aCk7IAotCQkJfQkKKwkJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQkJCWRlY2xhcmF0aW9uLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCQkJMCwKKwkJCQkJbGVuZ3RoKTsKKwkJCX0KIAkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHR5cGVEaW0gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsgLy8gdHlwZSBkaW1lbnNpb24KIAkJCWlmIChkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IC0xKSB7CiAJCQkJLy8gdGhpcyBpcyB0cnVlIGlmIHRoZXJlIGlzIG5vIG1vZGlmaWVycyBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uCkBAIC0zMDE4LDIyICszMjMxLDIyIEBACiAJCQlpbnQgbGVuZ3RoOwogCQkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJCQlkZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sIAotCQkJCQkwLCAKLQkJCQkJbGVuZ3RoKTsgCi0JCQl9CQkJCisJCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJCQlkZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkJCTAsCisJCQkJCWxlbmd0aCk7CisJCQl9CiAJCQkvLyBTdG9yZSBqYXZhZG9jIG9ubHkgb24gZmlyc3QgZGVjbGFyYXRpb24gYXMgaXQgaXMgdGhlIHNhbWUgZm9yIGFsbCBvbmVzCiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgZGVjbGFyYXRpb247CiAJCQlmaWVsZERlY2xhcmF0aW9uLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7Ci0JCQl0aGlzLmphdmFkb2MgPSBudWxsOwogCQl9CisJCXRoaXMuamF2YWRvYyA9IG51bGw7CiAJfSBlbHNlIHsKIAkJdHlwZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gdmFyaWFibGVJbmRleF07CiAJCXR5cGVEaW0gPSB0eXBlLmRpbWVuc2lvbnMoKTsKLQkJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHByZXZpb3VzVmFyaWFibGUgPSAKLQkJCShBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOyAKKwkJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHByZXZpb3VzVmFyaWFibGUgPQorCQkJKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJCWRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBwcmV2aW91c1ZhcmlhYmxlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CiAJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IHByZXZpb3VzVmFyaWFibGUubW9kaWZpZXJzOwogCQlmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBwcmV2aW91c1ZhcmlhYmxlLmFubm90YXRpb25zOwpAQCAtMzA0Nyw3ICszMjYwLDcgQEAKIAkJZGVjbGFyYXRpb24udHlwZSA9IHR5cGU7CiAJfSBlbHNlIHsKIAkJaW50IGRpbWVuc2lvbiA9IHR5cGVEaW0gKyBleHRlbmRlZERpbWVuc2lvbjsKLQkJZGVjbGFyYXRpb24udHlwZSA9IHRoaXMuY29weURpbXModHlwZSwgZGltZW5zaW9uKTsKKwkJZGVjbGFyYXRpb24udHlwZSA9IGNvcHlEaW1zKHR5cGUsIGRpbWVuc2lvbik7CiAJfQogCXRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdKys7CiAJcHVzaE9uQXN0U3RhY2soZGVjbGFyYXRpb24pOwpAQCAtMzA4MiwxMCArMzI5NSw4MyBAQAogCS8vIG1lcmdlIHRoZSBjb25zdGFudHMgdmFsdWVzIHdpdGggdGhlIGNsYXNzIGJvZHkKIAljb25jYXROb2RlTGlzdHMoKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnRIZWFkZXIoKSB7CisgICBGaWVsZERlY2xhcmF0aW9uIGVudW1Db25zdGFudCA9IChGaWVsZERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKyAgIGJvb2xlYW4gZm91bmRPcGVuaW5nQnJhY2UgPSB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0U7CisgICBpZiAoZm91bmRPcGVuaW5nQnJhY2UpeworICAgICAgLy8gcXVhbGlmaWVkIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorICAgICAgVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGUgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKyAgICAgIGFub255bW91c1R5cGUubmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKyAgICAgIGFub255bW91c1R5cGUuYml0cyB8PSAoQVNUTm9kZS5Jc0Fub255bW91c1R5cGV8QVNUTm9kZS5Jc0xvY2FsVHlwZSk7CisgICAgICBmaW5hbCBpbnQgc3RhcnQgPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKyAgICAgIGFub255bW91c1R5cGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHN0YXJ0OworICAgICAgYW5vbnltb3VzVHlwZS5zb3VyY2VTdGFydCA9IHN0YXJ0OworICAgICAgYW5vbnltb3VzVHlwZS5zb3VyY2VFbmQgPSBzdGFydDsgLy8gY2xvc2luZyBwYXJlbnRoZXNpcworICAgICAgYW5vbnltb3VzVHlwZS5tb2RpZmllcnMgPSAwOworICAgICAgYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworICAgICAgbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsKKyAgICAgIGNvbnN1bWVOZXN0ZWRUeXBlKCk7CisgICAgICB0aGlzLnZhcmlhYmxlc0NvdW50ZXJbdGhpcy5uZXN0ZWRUeXBlXSsrOworICAgICAgcHVzaE9uQXN0U3RhY2soYW5vbnltb3VzVHlwZSk7CisgICAgICBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsKKyAgICAgIGFsbG9jYXRpb25FeHByZXNzaW9uLmVudW1Db25zdGFudCA9IGVudW1Db25zdGFudDsKKworICAgICAgLy8gZmlsbCBhcmd1bWVudHMgaWYgbmVlZGVkCisgICAgICBpbnQgbGVuZ3RoOworICAgICAgaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKyAgICAgICAgIHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAorICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uU3RhY2ssCisgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorICAgICAgICAgICAgICAgYWxsb2NhdGlvbkV4cHJlc3Npb24uYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwKKyAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgfQorICAgICAgZW51bUNvbnN0YW50LmluaXRpYWxpemF0aW9uID0gYWxsb2NhdGlvbkV4cHJlc3Npb247CisgICB9IGVsc2UgeworICAgICAgQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24gPSBuZXcgQWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKyAgICAgIGFsbG9jYXRpb25FeHByZXNzaW9uLmVudW1Db25zdGFudCA9IGVudW1Db25zdGFudDsKKyAgICAgIC8vIGZpbGwgYXJndW1lbnRzIGlmIG5lZWRlZAorICAgICAgaW50IGxlbmd0aDsKKyAgICAgIGlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisgICAgICAgICB0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOworICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKKyAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblN0YWNrLAorICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKyAgICAgICAgICAgICAgIGFsbG9jYXRpb25FeHByZXNzaW9uLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGVudW1Db25zdGFudC5pbml0aWFsaXphdGlvbiA9IGFsbG9jYXRpb25FeHByZXNzaW9uOworICAgfQorICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorICAgZW51bUNvbnN0YW50LmluaXRpYWxpemF0aW9uLnNvdXJjZVN0YXJ0ID0gZW51bUNvbnN0YW50LmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisKKyAgIC8vIHJlY292ZXJ5CisgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CisJICBpZihmb3VuZE9wZW5pbmdCcmFjZSkgeworCSAgCVR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJICAJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOworICAgICAgCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKKyAgICAgICAgdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisgICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gMDsgLy8gb3BlbmluZyBicmFjZSBhbHJlYWR5IHRha2VuIGludG8gYWNjb3VudAorCSAgfSBlbHNlIHsKKwkgIAkgIGlmKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikgeworCQkgIAlSZWNvdmVyZWRUeXBlIGN1cnJlbnRUeXBlID0gY3VycmVudFJlY292ZXJ5VHlwZSgpOworCQkJaWYoY3VycmVudFR5cGUgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRUeXBlLmluc2lkZUVudW1Db25zdGFudFBhcnQgPSBmYWxzZTsKKwkJCX0KKwkJICB9CisJCSAgdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24KKwkgICAgICB0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkgICAgICB0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJICB9CisgICB9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUNvbnN0YW50SGVhZGVyTmFtZSgpIHsKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CiAJCWlmICghKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlCi0JCQkJCXx8ICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQgJiYgKChSZWNvdmVyZWRGaWVsZCljdXJyZW50RWxlbWVudCkuZmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpKQorCQkJCQl8fCAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkICYmICgoUmVjb3ZlcmVkRmllbGQpdGhpcy5jdXJyZW50RWxlbWVudCkuZmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpKQogCQkJCXx8ICh0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPT0gVG9rZW5OYW1lRE9UKSkgewogCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOwpAQCAtMzEwMiwxMjEgKzMzODgsNTcgQEAKICAgIGVudW1Db25zdGFudC5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogICAgZW51bUNvbnN0YW50LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBlbnVtQ29uc3RhbnQubW9kaWZpZXJzU291cmNlU3RhcnQ7CiAKLQkvLyBTdG9yZSBzZWNvbmRhcnkgaW5mbwotCWlmICgoZW51bUNvbnN0YW50LmJpdHMgJiBBU1ROb2RlLklzTWVtYmVyVHlwZSkgPT0gMCAmJiAoZW51bUNvbnN0YW50LmJpdHMgJiBBU1ROb2RlLklzTG9jYWxUeXBlKSA9PSAwKSB7Ci0JCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdCAhPSBudWxsICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhlbnVtQ29uc3RhbnQubmFtZSwgdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCkpKSB7Ci0JCQllbnVtQ29uc3RhbnQuYml0cyB8PSBBU1ROb2RlLklzU2Vjb25kYXJ5VHlwZTsKLQkJfQotCX0KLQogCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKICAgIGludCBsZW5ndGg7CiAgICBpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewogICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgIHRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLSAgICAgICAgICh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotICAgICAgICAgZW51bUNvbnN0YW50LmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0gICAgICAgICAwLCAKLSAgICAgICAgIGxlbmd0aCk7IAorICAgICAgICAgdGhpcy5leHByZXNzaW9uU3RhY2ssCisgICAgICAgICAodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorICAgICAgICAgZW51bUNvbnN0YW50LmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKyAgICAgICAgIDAsCisgICAgICAgICBsZW5ndGgpOwogICAgfQogICAgcHVzaE9uQXN0U3RhY2soZW51bUNvbnN0YW50KTsKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGVudW1Db25zdGFudC5zb3VyY2VFbmQgKyAxOwotCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoZW51bUNvbnN0YW50LCAwKTsJCQorCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoZW51bUNvbnN0YW50LCAwKTsKIAl9CiAJLy8gamF2YWRvYwogCWVudW1Db25zdGFudC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwogCXRoaXMuamF2YWRvYyA9IG51bGw7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUNvbnN0YW50SGVhZGVyKCkgewotICAgRmllbGREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnQgPSAoRmllbGREZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07Ci0gICBib29sZWFuIGZvdW5kT3BlbmluZ0JyYWNlID0gdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFOwotICAgaWYgKGZvdW5kT3BlbmluZ0JyYWNlKXsKLSAgICAgIC8vIHF1YWxpZmllZCBhbGxvY2F0aW9uIGV4cHJlc3Npb24KLSAgICAgIFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gbmV3IFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0gICAgICBhbm9ueW1vdXNUeXBlLm5hbWUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0gICAgICBhbm9ueW1vdXNUeXBlLmJpdHMgfD0gKEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlfEFTVE5vZGUuSXNMb2NhbFR5cGUpOwotICAgICAgZmluYWwgaW50IHN0YXJ0ID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247Ci0gICAgICBhbm9ueW1vdXNUeXBlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzdGFydDsKLSAgICAgIGFub255bW91c1R5cGUuc291cmNlU3RhcnQgPSBzdGFydDsKLSAgICAgIGFub255bW91c1R5cGUuc291cmNlRW5kID0gc3RhcnQ7IC8vIGNsb3NpbmcgcGFyZW50aGVzaXMKLSAgICAgIGFub255bW91c1R5cGUubW9kaWZpZXJzID0gMDsKLSAgICAgIGFub255bW91c1R5cGUuYm9keVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLSAgICAgIG1hcmtFbmNsb3NpbmdNZW1iZXJXaXRoTG9jYWxUeXBlKCk7Ci0gICAgICBwdXNoT25Bc3RTdGFjayhhbm9ueW1vdXNUeXBlKTsKLSAgICAgIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gbmV3IFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKGFub255bW91c1R5cGUpOwotICAgICAgYWxsb2NhdGlvbkV4cHJlc3Npb24uZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50OwotICAgICAgCi0gICAgICAvLyBmaWxsIGFyZ3VtZW50cyBpZiBuZWVkZWQKLSAgICAgIGludCBsZW5ndGg7Ci0gICAgICBpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewotICAgICAgICAgdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKLSAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0gICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLSAgICAgICAgICAgICAgIGFsbG9jYXRpb25FeHByZXNzaW9uLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotICAgICAgICAgICAgICAgMCwgCi0gICAgICAgICAgICAgICBsZW5ndGgpOyAKLSAgICAgIH0KLSAgICAgIGVudW1Db25zdGFudC5pbml0aWFsaXphdGlvbiA9IGFsbG9jYXRpb25FeHByZXNzaW9uOwotICAgfSBlbHNlIHsKLSAgICAgIEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gbmV3IEFsbG9jYXRpb25FeHByZXNzaW9uKCk7Ci0gICAgICBhbGxvY2F0aW9uRXhwcmVzc2lvbi5lbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnQ7Ci0gICAgICAvLyBmaWxsIGFyZ3VtZW50cyBpZiBuZWVkZWQKLSAgICAgIGludCBsZW5ndGg7Ci0gICAgICBpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewotICAgICAgICAgdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKLSAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0gICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLSAgICAgICAgICAgICAgIGFsbG9jYXRpb25FeHByZXNzaW9uLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAotICAgICAgICAgICAgICAgMCwgCi0gICAgICAgICAgICAgICBsZW5ndGgpOyAKLSAgICAgIH0KLSAgICAgIGVudW1Db25zdGFudC5pbml0aWFsaXphdGlvbiA9IGFsbG9jYXRpb25FeHByZXNzaW9uOwotICAgfQotICAgCi0gICAvLyByZWNvdmVyeQotICAgaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCSAgaWYoZm91bmRPcGVuaW5nQnJhY2UpIHsKLQkgIAlUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzVHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwotCSAgCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChhbm9ueW1vdXNUeXBlLCAwKTsKLSAgICAgIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQ7Ci0gICAgICAgIHRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKLQkgIH0gZWxzZSB7Ci0JICAJICBpZih0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pIHsKLQkJICAJUmVjb3ZlcmVkVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMuY3VycmVudFJlY292ZXJ5VHlwZSgpOwotCQkJaWYoY3VycmVudFR5cGUgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRUeXBlLmluc2lkZUVudW1Db25zdGFudFBhcnQgPSBmYWxzZTsKLQkJCX0KLQkJICB9Ci0JCSAgdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24KLQkgICAgICB0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKLQkgICAgICB0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7Ci0JICB9Ci0gICB9Ci19CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUNvbnN0YW50Tm9DbGFzc0JvZHkoKSB7CiAJLy8gc2V0IGRlY2xhcmF0aW9uRW5kIGFuZCBkZWNsYXJhdGlvblNvdXJjZUVuZAotCWludCBlbmRPZkVudW1Db25zdGFudCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlpbnQgZW5kT2ZFbnVtQ29uc3RhbnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCWZpbmFsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gZW5kT2ZFbnVtQ29uc3RhbnQ7CiAJZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGVuZE9mRW51bUNvbnN0YW50OworCS8vIGluaXRpYWxpemUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBhbGxvY2F0aW9uIGV4cHJlc3Npb24KKwlBU1ROb2RlIGluaXRpYWxpemF0aW9uID0gZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbjsKKwlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQlpbml0aWFsaXphdGlvbi5zb3VyY2VFbmQgPSBlbmRPZkVudW1Db25zdGFudDsKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUNvbnN0YW50cygpIHsKIAljb25jYXROb2RlTGlzdHMoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnRXaXRoQ2xhc3NCb2R5KCkgewotICAgZGlzcGF0Y2hEZWNsYXJhdGlvbkludG8odGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSk7Ci0gICBUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzVHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07IC8vIHBvcCB0eXBlCi0gICB0aGlzLmFzdExlbmd0aFB0ci0tOwotICAgYW5vbnltb3VzVHlwZS5ib2R5RW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKLSAgIGFub255bW91c1R5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7Ci0gICBmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoKEZpZWxkRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsKLSAgIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25FbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwotICAgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGFub255bW91c1R5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci0gICBpbnRQdHIgLS07IC8vIHJlbW92ZSBlbmQgcG9zaXRpb24gb2YgdGhlIGFyZ3VtZW50cworCWRpc3BhdGNoRGVjbGFyYXRpb25JbnRvKHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pOworCVR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ci0tXTsgLy8gcG9wIHR5cGUKKwl0aGlzLmFzdExlbmd0aFB0ci0tOworCWFub255bW91c1R5cGUuYm9keUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CisJYW5vbnltb3VzVHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKKwlmaW5hbCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoKEZpZWxkRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsKKwlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwlpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBhbm9ueW1vdXNUeXBlLmRlY2xhcmF0aW9uU291cmNlRW5kOworCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBkZWNsYXJhdGlvblNvdXJjZUVuZDsKKwl0aGlzLmludFB0ciAtLTsgLy8gcmVtb3ZlIGVuZCBwb3NpdGlvbiBvZiB0aGUgYXJndW1lbnRzCisJdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gPSAwOworCXRoaXMubmVzdGVkVHlwZS0tOworCUFTVE5vZGUgaW5pdGlhbGl6YXRpb24gPSBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uOworCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCWluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCA9IGRlY2xhcmF0aW9uU291cmNlRW5kOworCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtRGVjbGFyYXRpb24oKSB7CiAJLy8gRW51bURlY2xhcmF0aW9uIDo6PSBFbnVtSGVhZGVyIENsYXNzSGVhZGVySW1wbGVtZW50c29wdCBFbnVtQm9keQpAQCAtMzIyOSwxMiArMzQ1MSw5IEBACiAKIAlUeXBlRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAKLQkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQltYXJrSW5pdGlhbGl6ZXJzV2l0aExvY2FsVHlwZShlbnVtRGVjbGFyYXRpb24pOwotCiAJLy9jb252ZXJ0IGNvbnN0cnVjdG9yIHRoYXQgZG8gbm90IGhhdmUgdGhlIHR5cGUncyBuYW1lIGludG8gbWV0aG9kcwogCWJvb2xlYW4gaGFzQ29uc3RydWN0b3IgPSBlbnVtRGVjbGFyYXRpb24uY2hlY2tDb25zdHJ1Y3RvcnModGhpcyk7Ci0JCisKIAkvL2FkZCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aGVuIG5lZWRlZAogCWlmICghaGFzQ29uc3RydWN0b3IpIHsKIAkJYm9vbGVhbiBpbnNpZGVGaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CkBAIC0zMjU5LDIxICszNDc4LDIxIEBACiAJCWVudW1EZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuVW5kb2N1bWVudGVkRW1wdHlCbG9jazsKIAl9CiAKLQllbnVtRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAorCWVudW1EZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtRGVjbGFyYXRpb25zKCkgewogCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudW1IZWFkZXIoKSB7Ci0JVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CQotCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpIHsgCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgewogCQl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCX0KIAogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCQkKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQotCQorCiAJLy8gZmx1c2ggdGhlIGNvbW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGVudW0gaGVhZGVyCiAJdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKIH0KQEAgLTMyODMsNyArMzUwMiw3IEBACiAJaWYgKHRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0gPT0gMCkgewogCQlpZiAodGhpcy5uZXN0ZWRUeXBlICE9IDApIHsKIAkJCWVudW1EZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNNZW1iZXJUeXBlOwotCQl9CQkKKwkJfQogCX0gZWxzZSB7CiAJCS8vIFJlY29yZCB0aGF0IHRoZSBibG9jayBoYXMgYSBkZWNsYXJhdGlvbiBmb3IgbG9jYWwgdHlwZXMKIC8vCQltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOwpAQCAtMzMwMCw3ICszNTE5LDcgQEAKIAkvLyAnY2xhc3MnIGFuZCAnaW50ZXJmYWNlJyBwdXNoIHR3byBpbnQgcG9zaXRpb25zOiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyB0b2tlbiBhbmQgaXRzIGVuZC4KIAkvLyB3ZSB3YW50IHRvIGtlZXAgdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBidXQgZ2V0IHJpZCBvZiB0aGUgZW5kIHBvc2l0aW9uCiAJLy8gaXQgaXMgb25seSB1c2VkIGZvciB0aGUgQ2xhc3NMaXRlcmFsQWNjZXNzIHBvc2l0aW9ucy4KLQllbnVtRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07IAorCWVudW1EZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0aGlzLmludFB0ci0tOyAvLyByZW1vdmUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY2xhc3MgdG9rZW4KIAogCWVudW1EZWNsYXJhdGlvbi5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CkBAIC0zMzA4LDMzICszNTI3LDEyNyBAQAogCWlmIChlbnVtRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgPj0gMCkgewogCQllbnVtRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGVudW1EZWNsYXJhdGlvbi5tb2RpZmllcnNTb3VyY2VTdGFydDsKIAl9CisKKwkvLyBTdG9yZSBzZWNvbmRhcnkgaW5mbworCWlmICgoZW51bURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzTWVtYmVyVHlwZSkgPT0gMCAmJiAoZW51bURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzTG9jYWxUeXBlKSA9PSAwKSB7CisJCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdCAhPSBudWxsICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhlbnVtRGVjbGFyYXRpb24ubmFtZSwgdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCkpKSB7CisJCQllbnVtRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLklzU2Vjb25kYXJ5VHlwZTsKKwkJfQorCX0KKwogCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCWVudW1EZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCWVudW1EZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9Ci0vLwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKSB7IAorLy8JaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgewogLy8JCWVudW1EZWNsYXJhdGlvbi5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogLy8JfQogCWVudW1EZWNsYXJhdGlvbi5ib2R5U3RhcnQgPSBlbnVtRGVjbGFyYXRpb24uc291cmNlRW5kICsgMTsKIAlwdXNoT25Bc3RTdGFjayhlbnVtRGVjbGFyYXRpb24pOwogCiAJdGhpcy5saXN0TGVuZ3RoID0gMDsgLy8gd2lsbCBiZSB1cGRhdGVkIHdoZW4gcmVhZGluZyBzdXBlci1pbnRlcmZhY2VzCi0JCisKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCAmJgotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKIAkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKLQkJLy9UT0RPIHRoaXMgY29kZSB3aWxsIGJlIG5ldmVyIHJ1biB3aGlsZSAnZW51bScgaXMgYW4gaWRlbnRpZmllciBpbiAxLjMgc2Nhbm5lciAKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZkVudW1EZWNsYXJhdGlvbnMoZW51bURlY2xhcmF0aW9uKTsKKwkJLy9UT0RPIHRoaXMgY29kZSB3aWxsIGJlIG5ldmVyIHJ1biB3aGlsZSAnZW51bScgaXMgYW4gaWRlbnRpZmllciBpbiAxLjMgc2Nhbm5lcgorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZkVudW1EZWNsYXJhdGlvbnMoZW51bURlY2xhcmF0aW9uKTsKIAl9Ci0JCisKIAkvLyByZWNvdmVyeQotCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGVudW1EZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChlbnVtRGVjbGFyYXRpb24sIDApOworCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwl9CisJLy8gamF2YWRvYworCWVudW1EZWNsYXJhdGlvbi5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOworCXRoaXMuamF2YWRvYyA9IG51bGw7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisJLy8gRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMgOjo9IE1vZGlmaWVyc29wdCAnZW51bScgSWRlbnRpZmllciBUeXBlUGFyYW1ldGVycworCVR5cGVEZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkvLyBjb25zdW1lIHR5cGUgcGFyYW1ldGVycworCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKKwl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIGVudW1EZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA9IG5ldyBUeXBlUGFyYW1ldGVyW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisKKwlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlR5cGVQYXJhbWV0ZXJzRm9yRW51bURlY2xhcmF0aW9uKGVudW1EZWNsYXJhdGlvbik7CisKKwllbnVtRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gZW51bURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzW2xlbmd0aC0xXS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisKKy8vCWVudW1EZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA9IG51bGw7CisKKwl0aGlzLmxpc3RUeXBlUGFyYW1ldGVyTGVuZ3RoID0gMDsKKworCWlmICh0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdID09IDApIHsKKwkJaWYgKHRoaXMubmVzdGVkVHlwZSAhPSAwKSB7CisJCQllbnVtRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLklzTWVtYmVyVHlwZTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIFJlY29yZCB0aGF0IHRoZSBibG9jayBoYXMgYSBkZWNsYXJhdGlvbiBmb3IgbG9jYWwgdHlwZXMKKy8vCQltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOworCQlibG9ja1JlYWwoKTsKKwl9CisJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKKwlsb25nIHBvcyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwllbnVtRGVjbGFyYXRpb24uc291cmNlRW5kID0gKGludCkgcG9zOworCWVudW1EZWNsYXJhdGlvbi5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwllbnVtRGVjbGFyYXRpb24ubmFtZSA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vY29tcHV0ZSB0aGUgZGVjbGFyYXRpb24gc291cmNlIHRvbworCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggdHdvIGludCBwb3NpdGlvbnM6IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsYXNzIHRva2VuIGFuZCBpdHMgZW5kLgorCS8vIHdlIHdhbnQgdG8ga2VlcCB0aGUgYmVnaW5uaW5nIHBvc2l0aW9uIGJ1dCBnZXQgcmlkIG9mIHRoZSBlbmQgcG9zaXRpb24KKwkvLyBpdCBpcyBvbmx5IHVzZWQgZm9yIHRoZSBDbGFzc0xpdGVyYWxBY2Nlc3MgcG9zaXRpb25zLgorCWVudW1EZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwl0aGlzLmludFB0ci0tOyAvLyByZW1vdmUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY2xhc3MgdG9rZW4KKworCWVudW1EZWNsYXJhdGlvbi5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJZW51bURlY2xhcmF0aW9uLm1vZGlmaWVycyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0gfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bTsKKwlpZiAoZW51bURlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID49IDApIHsKKwkJZW51bURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBlbnVtRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQ7CisJfQorCisJLy8gU3RvcmUgc2Vjb25kYXJ5IGluZm8KKwlpZiAoKGVudW1EZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc01lbWJlclR5cGUpID09IDAgJiYgKGVudW1EZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0xvY2FsVHlwZSkgPT0gMCkgeworCQlpZiAodGhpcy5jb21waWxhdGlvblVuaXQgIT0gbnVsbCAmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMoZW51bURlY2xhcmF0aW9uLm5hbWUsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpKSkgeworCQkJZW51bURlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5Jc1NlY29uZGFyeVR5cGU7CisJCX0KKwl9CisKKwkvLyBjb25zdW1lIGFubm90YXRpb25zCisJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCWVudW1EZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKKwl9CisvLwlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKSB7CisvLwkJZW51bURlY2xhcmF0aW9uLmJvZHlTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisvLwl9CisJZW51bURlY2xhcmF0aW9uLmJvZHlTdGFydCA9IGVudW1EZWNsYXJhdGlvbi5zb3VyY2VFbmQgKyAxOworCXB1c2hPbkFzdFN0YWNrKGVudW1EZWNsYXJhdGlvbik7CisKKwl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiByZWFkaW5nIHN1cGVyLWludGVyZmFjZXMKKworCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCisJCQl0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmCisJCQl0aGlzLmxhc3RFcnJvckVuZFBvc2l0aW9uQmVmb3JlUmVjb3ZlcnkgPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7CisJCS8vVE9ETyB0aGlzIGNvZGUgd2lsbCBiZSBuZXZlciBydW4gd2hpbGUgJ2VudW0nIGlzIGFuIGlkZW50aWZpZXIgaW4gMS4zIHNjYW5uZXIKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZFbnVtRGVjbGFyYXRpb25zKGVudW1EZWNsYXJhdGlvbik7CisJfQorCisJLy8gcmVjb3ZlcnkKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGVudW1EZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChlbnVtRGVjbGFyYXRpb24sIDApOwogCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKQEAgLTMzNzQsNyArMzY4NywxMSBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRNZW1iZXJWYWx1ZSgpIHsKIAkvLyBFeGl0TWVtYmVyVmFsdWUgOjo9ICRlbXB0eQotCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEFubm90YXRpb24pIHsKKwkJUmVjb3ZlcmVkQW5ub3RhdGlvbiByZWNvdmVyZWRBbm5vdGF0aW9uID0gKFJlY292ZXJlZEFubm90YXRpb24pdGhpcy5jdXJyZW50RWxlbWVudDsKKwkJcmVjb3ZlcmVkQW5ub3RhdGlvbi5oYXNQZW5kaW5nTWVtYmVyVmFsdWVOYW1lID0gZmFsc2U7CisJCXJlY292ZXJlZEFubm90YXRpb24ubWVtYmVyVmFsdVBhaXJFcXVhbEVuZCA9IC0xOworCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeGl0VHJ5QmxvY2soKSB7CiAJLy9FeGl0VHJ5QmxvY2sgOjo9ICRlbXB0eQpAQCAtMzM5MiwxMyArMzcwOSwxMyBAQAogCS8vIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24KIAl2YXJpYWJsZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB2YXJpYWJsZURlY2wuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOwogCXZhcmlhYmxlRGVjbC5kZWNsYXJhdGlvbkVuZCA9IHZhcmlhYmxlRGVjbC5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7Ci0JCi0JdGhpcy5yZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKTsKKworCXJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpIHsKIAkvLyBFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24gOjo9ICRlbXB0eQogCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCQorCiAJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlRGVjbCA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCXZhcmlhYmxlRGVjbC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHZhcmlhYmxlRGVjbC5kZWNsYXJhdGlvbkVuZDsKIAlpZih0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkKSB7CkBAIC0zNDA2LDEyICszNzIzLDEyIEBACiAJCQl0aGlzLmN1cnJlbnRFbGVtZW50LnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwogCQl9CiAJfQotCXRoaXMucmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCk7CisJcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaW50IGZsYWcsIGludCByZWNGbGFnKSB7CiAKIAkvKiBmbGFnIGFsbG93cyB0byBkaXN0aW5ndWlzaCAzIGNhc2VzIDoKLQkoMCkgOiAgIAorCSgwKSA6CiAJRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9ICd0aGlzJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKIAlFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gJ3N1cGVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKIAkoMSkgOgpAQCAtMzQ0Niw3ICszNzYzLDcgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbldpdGhUeXBlQXJndW1lbnRzKGludCBmbGFnLCBpbnQgcmVjRmxhZykgewogCiAJLyogZmxhZyBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggMyBjYXNlcyA6Ci0JKDApIDogICAKKwkoMCkgOgogCUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBUeXBlQXJndW1lbnRzICd0aGlzJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKIAlFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gVHlwZUFyZ3VtZW50cyAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JwogCSgxKSA6CkBAIC0zNDY2LDcgKzM3ODMsNyBAQAogCWxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwogCXRoaXMuZ2VuZXJpY3NQdHIgLT0gbGVuZ3RoOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgZWNjLnR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAwLCBsZW5ndGgpOwotCWVjYy50eXBlQXJndW1lbnRzU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW2ludFB0ci0tXTsKKwllY2MudHlwZUFyZ3VtZW50c1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAogCXN3aXRjaCAoZmxhZykgewogCQljYXNlIDAgOgpAQCAtMzQ4MCw3ICszNzk3LDcgQEAKIAkJCWVjYy5zb3VyY2VTdGFydCA9IChlY2MucXVhbGlmaWNhdGlvbiA9IGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpLnNvdXJjZVN0YXJ0OwogCQkJYnJlYWs7CiAJfQotCQorCiAJcHVzaE9uQXN0U3RhY2soZWNjKTsKIAllY2Muc291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIH0KQEAgLTM0ODksNiArMzgwNiw3IEBACiAJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07CiAJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dOwogCWV4cHJlc3Npb24uc3RhdGVtZW50RW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwlleHByZXNzaW9uLmJpdHMgfD0gQVNUTm9kZS5JbnNpZGVFeHByZXNzaW9uU3RhdGVtZW50OwogCXB1c2hPbkFzdFN0YWNrKGV4cHJlc3Npb24pOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkQWNjZXNzKGJvb2xlYW4gaXNTdXBlckFjY2VzcykgewpAQCAtMzUwMSwxNCArMzgxOSwxNCBAQAogCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0pOwogCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCWlmIChpc1N1cGVyQWNjZXNzKSB7Ci0JCS8vY29uc2lkZXJhdGVzIHRoZSBmaWVsZFJlZmVyZW5jZSBiZWdpbm5pbmcgYXQgdGhlICdzdXBlcicgLi4uLgkKKwkJLy9jb25zaWRlcnMgdGhlIGZpZWxkUmVmZXJlbmNlIGJlZ2lubmluZyBhdCB0aGUgJ3N1cGVyJyAuLi4uCiAJCWZyLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJZnIucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZnIuc291cmNlU3RhcnQsIHRoaXMuZW5kUG9zaXRpb24pOwogCQlwdXNoT25FeHByZXNzaW9uU3RhY2soZnIpOwogCX0gZWxzZSB7CiAJCS8vb3B0aW1pemUgcHVzaC9wb3AKIAkJZnIucmVjZWl2ZXIgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwotCQkvL2ZpZWxkcmVmZXJlbmNlIGJlZ2lucyBhdCB0aGUgcmVjZWl2ZXIKKwkJLy9maWVsZCByZWZlcmVuY2UgYmVnaW5zIGF0IHRoZSByZWNlaXZlcgogCQlmci5zb3VyY2VTdGFydCA9IGZyLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwogCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gZnI7CiAJfQpAQCAtMzUxOCwyNSArMzgzNiwyNSBAQAogCS8vIEZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgJzsnCiAKIAkvKgotCXRoaXMuYXN0U3RhY2sgOiAKKwl0aGlzLmFzdFN0YWNrIDoKIAl0aGlzLmV4cHJlc3Npb25TdGFjazogRXhwcmVzc2lvbiBFeHByZXNzaW9uIC4uLi4uLiBFeHByZXNzaW9uCiAJdGhpcy5pZGVudGlmaWVyU3RhY2sgOiB0eXBlICBpZGVudGlmaWVyIGlkZW50aWZpZXIgLi4uLi4uIGlkZW50aWZpZXIKIAl0aGlzLmludFN0YWNrIDogdHlwZURpbSAgICAgIGRpbSAgICAgICAgZGltICAgICAgICAgICAgICAgZGltCiAJID09PgogCXRoaXMuYXN0U3RhY2sgOiBGaWVsZERlY2xhcmF0aW9uIEZpZWxkRGVjbGFyYXRpb24gLi4uLi4uIEZpZWxkRGVjbGFyYXRpb24KIAl0aGlzLmV4cHJlc3Npb25TdGFjayA6Ci0JdGhpcy5pZGVudGlmaWVyU3RhY2sgOiAKLQl0aGlzLmludFN0YWNrIDogCi0JICAKKwl0aGlzLmlkZW50aWZpZXJTdGFjayA6CisJdGhpcy5pbnRTdGFjayA6CisKIAkqLwogCWludCB2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlciA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdOwogCiAJZm9yIChpbnQgaSA9IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLSBpXTsKLQkJZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247IAorCQlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIAkJZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CS8vIHNlbWktY29sb24gaW5jbHVkZWQKIAl9Ci0JCisKIAl1cGRhdGVTb3VyY2VEZWNsYXJhdGlvblBhcnRzKHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyKTsKIAlpbnQgZW5kUG9zID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOwogCWlmIChlbmRQb3MgIT0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbikgewpAQCAtMzU0OCwxMSArMzg2NiwxMSBAQAogCS8vIHVwZGF0ZSB0aGUgdGhpcy5hc3RTdGFjaywgdGhpcy5hc3RQdHIgYW5kIHRoaXMuYXN0TGVuZ3RoU3RhY2sKIAlpbnQgc3RhcnRJbmRleCA9IHRoaXMuYXN0UHRyIC0gdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gKyAxOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRoaXMuYXN0U3RhY2ssIAotCQlzdGFydEluZGV4LCAKLQkJdGhpcy5hc3RTdGFjaywgCi0JCXN0YXJ0SW5kZXggLSAxLCAKLQkJdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIpOyAKKwkJdGhpcy5hc3RTdGFjaywKKwkJc3RhcnRJbmRleCwKKwkJdGhpcy5hc3RTdGFjaywKKwkJc3RhcnRJbmRleCAtIDEsCisJCXZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyKTsKIAl0aGlzLmFzdFB0ci0tOyAvLyByZW1vdmUgdGhlIHR5cGUgcmVmZXJlbmNlCiAJdGhpcy5hc3RMZW5ndGhTdGFja1stLXRoaXMuYXN0TGVuZ3RoUHRyXSA9IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyOwogCkBAIC0zNTgwLDEzICszODk4LDEzIEBACiAJLy8gRm9ybWFsUGFyYW1ldGVyIDo6PSBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkID09PiBmYWxzZQogCS8vIEZvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzIFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQgPT0+IHRydWUKIAkvKgotCXRoaXMuYXN0U3RhY2sgOiAKKwl0aGlzLmFzdFN0YWNrIDoKIAl0aGlzLmlkZW50aWZpZXJTdGFjayA6IHR5cGUgaWRlbnRpZmllcgogCXRoaXMuaW50U3RhY2sgOiBkaW0gZGltCiAJID09PgogCXRoaXMuYXN0U3RhY2sgOiBBcmd1bWVudAotCXRoaXMuaWRlbnRpZmllclN0YWNrIDogICAKLQl0aGlzLmludFN0YWNrIDogIAorCXRoaXMuaWRlbnRpZmllclN0YWNrIDoKKwl0aGlzLmludFN0YWNrIDoKIAkqLwogCiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CkBAIC0zNjA5LDM3ICszOTI3LDM3IEBACiAJfQogCWludCBtb2RpZmllclBvc2l0aW9ucyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJdGhpcy5pbnRQdHItLTsKLQlBcmd1bWVudCBhcmcgPSAKKwlBcmd1bWVudCBhcmcgPQogCQluZXcgQXJndW1lbnQoCi0JCQlpZGVudGlmaWVyTmFtZSwgCi0JCQluYW1lUG9zaXRpb25zLCAKLQkJCXR5cGUsIAorCQkJaWRlbnRpZmllck5hbWUsCisJCQluYW1lUG9zaXRpb25zLAorCQkJdHlwZSwKIAkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHIgKyAxXSAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7IC8vIG1vZGlmaWVycwogCWFyZy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbW9kaWZpZXJQb3NpdGlvbnM7CiAJLy8gY29uc3VtZSBhbm5vdGF0aW9ucwogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJYXJnLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJYXJnLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOwogCX0KIAlwdXNoT25Bc3RTdGFjayhhcmcpOwogCiAJLyogaWYgaW5jb21wbGV0ZSBtZXRob2QgaGVhZGVyLCB0aGlzLmxpc3RMZW5ndGggY291bnRlciB3aWxsIG5vdCBoYXZlIGJlZW4gcmVzZXQsCiAJCWluZGljYXRpbmcgdGhhdCBzb21lIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjayAqLwotCXRoaXMubGlzdExlbmd0aCsrOyAJCi0JCisJdGhpcy5saXN0TGVuZ3RoKys7CisKIAlpZihpc1ZhckFyZ3MpIHsKIAkJaWYgKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCQl0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmCiAJCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewotCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZWYXJhcmdzKGFyZyk7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZWYXJhcmdzKGFyZyk7CiAJCX0gZWxzZSBpZiAoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgJiYKIAkJCQlleHRlbmRlZERpbWVuc2lvbnMgPiAwKSB7Ci0JCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxFeHRlbmRlZERpbWVuc2lvbnMoYXJnKTsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxFeHRlbmRlZERpbWVuc2lvbnMoYXJnKTsKIAkJfQogCX0KIH0KQEAgLTM2NTIsMzYgKzM5NzAsNDQgQEAKIAlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVHZW5lcmljVHlwZSgpIHsKKwkvLyBHZW5lcmljVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZSBUeXBlQXJndW1lbnRzCiAJLy8gbm90aGluZyB0byBkbwotCS8vIFdpbGwgYmUgY29uc3VtZSBieSBhIGdldFR5cGVSZWZlbmNlIGNhbGwKKwkvLyBXaWxsIGJlIGNvbnN1bWUgYnkgYSBnZXRUeXBlUmVmZXJlbmNlIGNhbGwKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVHZW5lcmljVHlwZUFycmF5VHlwZSgpIHsKIAkvLyBub3RoaW5nIHRvIGRvCi0JLy8gV2lsbCBiZSBjb25zdW1lIGJ5IGEgZ2V0VHlwZVJlZmVuY2UgY2FsbAorCS8vIFdpbGwgYmUgY29uc3VtZSBieSBhIGdldFR5cGVSZWZlcmVuY2UgY2FsbAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUdlbmVyaWNUeXBlTmFtZUFycmF5VHlwZSgpIHsKIAkvLyBub3RoaW5nIHRvIGRvCi0JLy8gV2lsbCBiZSBjb25zdW1lIGJ5IGEgZ2V0VHlwZVJlZmVuY2UgY2FsbAorCS8vIFdpbGwgYmUgY29uc3VtZSBieSBhIGdldFR5cGVSZWZlcmVuY2UgY2FsbAorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUdlbmVyaWNUeXBlV2l0aERpYW1vbmQoKSB7CisJLy8gR2VuZXJpY1R5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2UgJzwnICc+JworCS8vIHplcm8gdHlwZSBhcmd1bWVudHMgPT0gPD4KKwlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKC0xKTsKKwljb25jYXRHZW5lcmljc0xpc3RzKCk7CisJdGhpcy5pbnRQdHItLTsJLy8gcG9wIHRoZSBudWxsIGRpbWVuc2lvbiBwdXNoZWQgaW4gYnkgY29uc3VtZVJlZmVyZW5jZVR5cGUsIGFzIHdlIGhhdmUgbm8gdHlwZSBiZXR3ZWVuIDw+LCBnZXRUeXBlUmVmZXJlbmNlIHdvbid0IGtpY2sgaW4gCiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb24oKSB7CiAJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uIDo6PSBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lICc7JwogCUltcG9ydFJlZmVyZW5jZSBpbXB0ID0gKEltcG9ydFJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJLy8gZmx1c2ggYW5ub3RhdGlvbnMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cwogCWltcHQuZGVjbGFyYXRpb25FbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwotCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAKLQkJdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8oaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7IAorCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPQorCQlmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8oaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOwogCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IAorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCS8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zKCkgewotCS8vIEltcG9ydERlY2xhcmF0aW9ucyA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIEltcG9ydERlY2xhcmF0aW9uIAorCS8vIEltcG9ydERlY2xhcmF0aW9ucyA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIEltcG9ydERlY2xhcmF0aW9uCiAJb3B0aW1pemVkQ29uY2F0Tm9kZUxpc3RzKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKSB7CkBAIC0zNjg5LDcgKzQwMTUsOSBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uTEwxKCkgewogCS8vIEluc2lkZUNhc3RFeHByZXNzaW9uTEwxIDo6PSAkZW1wdHkKLQlwdXNoT25FeHByZXNzaW9uU3RhY2soZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSk7CisJcHVzaE9uR2VuZXJpY3NMZW5ndGhTdGFjaygwKTsgLy8gaGFuZGxlIHR5cGUgYXJndW1lbnRzCisJcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0pOworCXB1c2hPbkV4cHJlc3Npb25TdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljcygpIHsKIAkvLyBJbnNpZGVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljcyA6Oj0gJGVtcHR5CkBAIC0zNzM5LDEzICs0MDY3LDIxIEBACiAJfQogCiAJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07Ci0JCi0JLy8gbWFyayBpbml0aWFsaXplcnMgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCi0JbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUodHlwZURlY2wpOwogCiAJLy9jb252ZXJ0IGNvbnN0cnVjdG9yIHRoYXQgZG8gbm90IGhhdmUgdGhlIHR5cGUncyBuYW1lIGludG8gbWV0aG9kcwogCXR5cGVEZWNsLmNoZWNrQ29uc3RydWN0b3JzKHRoaXMpOwogCQorCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI3MTMsIAorCS8vIHJlamVjdCBpbml0aWFsaXplcnMgdGhhdCBoYXZlIGJlZW4gdG9sZXJhdGVkIGJ5IHRoZSBncmFtbWFyLgorCUZpZWxkRGVjbGFyYXRpb24gW10gZmllbGRzID0gdHlwZURlY2wuZmllbGRzOworCWludCBmaWVsZENvdW50ID0gZmllbGRzID09IG51bGwgPyAwIDogZmllbGRzLmxlbmd0aDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKykgeworCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGRzW2ldOworCQlpZiAoZmllbGQgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgeworCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW50ZXJmYWNlQ2Fubm90SGF2ZUluaXRpYWxpemVycyh0eXBlRGVjbC5uYW1lLCBmaWVsZCk7CisJCX0KKwl9CisKIAkvL2Fsd2F5cyBhZGQgPGNsaW5pdD4gKHdpbGwgYmUgcmVtb3ZlIGF0IGNvZGUgZ2VuIHRpbWUgaWYgZW1wdHkpCiAJaWYgKHRoaXMuc2Nhbm5lci5jb250YWluc0Fzc2VydEtleXdvcmQpIHsKIAkJdHlwZURlY2wuYml0cyB8PSBBU1ROb2RlLkNvbnRhaW5zQXNzZXJ0aW9uOwpAQCAtMzc1NSwyMCArNDA5MSwyMCBAQAogCWlmIChsZW5ndGggPT0gMCAmJiAhY29udGFpbnNDb21tZW50KHR5cGVEZWNsLmJvZHlTdGFydCwgdHlwZURlY2wuYm9keUVuZCkpIHsKIAkJdHlwZURlY2wuYml0cyB8PSBBU1ROb2RlLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2s7CiAJfQotCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKSB7CiAJLy8gSW50ZXJmYWNlSGVhZGVyIDo6PSBJbnRlcmZhY2VIZWFkZXJOYW1lIEludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQKIAotCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwkKLQlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsgCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSl7CiAJCXR5cGVEZWNsLmJvZHlTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJfQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9CiAJLy8gZmx1c2ggdGhlIGNvbW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGludGVyZmFjZSBoZWFkZXIKLQl0aGlzLnNjYW5uZXIuY29tbWVudFB0ciA9IC0xOwkKKwl0aGlzLnNjYW5uZXIuY29tbWVudFB0ciA9IC0xOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZUhlYWRlckV4dGVuZHMoKSB7CiAJLy8gSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcyA6Oj0gJ2V4dGVuZHMnIEludGVyZmFjZVR5cGVMaXN0CkBAIC0zNzc3LDE4ICs0MTEzLDE4IEBACiAJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwogCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRoaXMuYXN0U3RhY2ssIAotCQl0aGlzLmFzdFB0ciArIDEsIAotCQl0eXBlRGVjbC5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAKLQkJMCwgCi0JCWxlbmd0aCk7IAorCQl0aGlzLmFzdFN0YWNrLAorCQl0aGlzLmFzdFB0ciArIDEsCisJCXR5cGVEZWNsLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sCisJCTAsCisJCWxlbmd0aCk7CiAJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQl0eXBlRGVjbC5zdXBlckludGVyZmFjZXNbaV0uYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwogCX0KLQl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zdXBlckludGVyZmFjZXNbbGVuZ3RoLTFdLnNvdXJjZUVuZCArIDE7CQkKLQl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyByZXNldCBhZnRlciBoYXZpbmcgcmVhZCBzdXBlci1pbnRlcmZhY2VzCQkKKwl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zdXBlckludGVyZmFjZXNbbGVuZ3RoLTFdLnNvdXJjZUVuZCArIDE7CisJdGhpcy5saXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgYWZ0ZXIgaGF2aW5nIHJlYWQgc3VwZXItaW50ZXJmYWNlcwogCS8vIHJlY292ZXJ5Ci0JaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeyAKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7CiAJfQogfQpAQCAtMzgzNywxMSArNDE3MywxMSBAQAogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJdHlwZURlY2wuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQl0eXBlRGVjbC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc291cmNlRW5kICsgMTsKIAlwdXNoT25Bc3RTdGFjayh0eXBlRGVjbCk7CkBAIC0zODUwLDcgKzQxODYsNyBAQAogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAvLyBpcyByZWNvdmVyaW5nCiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCh0eXBlRGVjbCwgMCk7Ci0JCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCX0KIAkvLyBqYXZhZG9jCiAJdHlwZURlY2wuamF2YWRvYyA9IHRoaXMuamF2YWRvYzsKQEAgLTM4NjksNyArNDIwNSw3IEBACiAJcHVzaE9uQXN0U3RhY2soZ2V0VHlwZVJlZmVyZW5jZSgwKSk7CiAJLyogaWYgaW5jb21wbGV0ZSB0eXBlIGhlYWRlciwgdGhpcy5saXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAogCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrICovCi0JdGhpcy5saXN0TGVuZ3RoKys7IAkKKwl0aGlzLmxpc3RMZW5ndGgrKzsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VUeXBlTGlzdCgpIHsKIAkvLyBJbnRlcmZhY2VUeXBlTGlzdCA6Oj0gSW50ZXJmYWNlVHlwZUxpc3QgJywnIEludGVyZmFjZVR5cGUKQEAgLTM4ODEsMTIgKzQyMTcsNyBAQAogCS8vIEludGVybmFsQ29tcGlsYXRpb25Vbml0IDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgUmVkdWNlSW1wb3J0cwogCWlmICh0aGlzLmNvbXBpbGF0aW9uVW5pdC5pc1BhY2thZ2VJbmZvKCkpIHsKIAkJdGhpcy5jb21waWxhdGlvblVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzFdOwotCQkvLyBjcmVhdGUgYSBmYWtlIGludGVyZmFjZSBkZWNsYXJhdGlvbgotCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCWRlY2xhcmF0aW9uLm5hbWUgPSBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FOwotCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NJbnRlcmZhY2U7Ci0JCXRoaXMuY29tcGlsYXRpb25Vbml0LnR5cGVzWzBdID0gZGVjbGFyYXRpb247Ci0JCWRlY2xhcmF0aW9uLmphdmFkb2MgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5qYXZhZG9jOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jcmVhdGVQYWNrYWdlSW5mb1R5cGUoKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJuYWxDb21waWxhdGlvblVuaXRXaXRoVHlwZXMoKSB7CkBAIC0zOTAxLDEyICs0MjMyLDcgQEAKIAkJCXRoaXMuY29tcGlsYXRpb25Vbml0LnR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvbltsZW5ndGggKyAxXTsKIAkJCXRoaXMuYXN0UHRyIC09IGxlbmd0aDsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hc3RTdGFjaywgdGhpcy5hc3RQdHIgKyAxLCB0aGlzLmNvbXBpbGF0aW9uVW5pdC50eXBlcywgMSwgbGVuZ3RoKTsKLQkJCS8vIGNyZWF0ZSBhIGZha2UgaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0JCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBuZXcgVHlwZURlY2xhcmF0aW9uKGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCQlkZWNsYXJhdGlvbi5uYW1lID0gVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRTsKLQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0IHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LnR5cGVzWzBdID0gZGVjbGFyYXRpb247Ci0JCQlkZWNsYXJhdGlvbi5qYXZhZG9jID0gdGhpcy5jb21waWxhdGlvblVuaXQuamF2YWRvYzsKKwkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmNyZWF0ZVBhY2thZ2VJbmZvVHlwZSgpOwogCQl9IGVsc2UgewogCQkJdGhpcy5jb21waWxhdGlvblVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW2xlbmd0aF07CiAJCQl0aGlzLmFzdFB0ciAtPSBsZW5ndGg7CkBAIC0zOTI5LDkgKzQyNTUsOSBAQAogCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAKIAljZC5ib2R5RW5kID0gdGhpcy5lbmRQb3NpdGlvbjsgLy8gcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIHRyYWlsaW5nIHNlbWktY29sb24KLQljZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJY2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiAJLy8gcmVwb3J0IHRoZSBwcm9ibGVtIGFuZCBjb250aW51ZSB0aGUgcGFyc2luZyAtIG5hcnJvd2luZyB0aGUgcHJvYmxlbSBvbnRvIHRoZSBtZXRob2QKLQkKKwogCWNkLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1NlbWljb2xvbkJvZHk7IC8vIHJlbWVtYmVyIHNlbWktY29sb24gYm9keQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGJvb2xlYW4gaGFzQm9keSkgewpAQCAtMzk2Niw5ICs0MjkyLDggQEAKIAkJY29uc3RydWN0b3JEZWNsYXJhdGlvbi5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OwogCX0KIH0KLXByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnZhbGlkSW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7Ci0JLy8gQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbgotCS8vSW50ZXJmYWNlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicgRXh0ZW5kc0ludGVyZmFjZXNvcHQgSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnZhbGlkRW51bURlY2xhcmF0aW9uKCkgeworCS8vIEJsb2NrU3RhdGVtZW50IDo6PSBFbnVtRGVjbGFyYXRpb24KIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCkgcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbExvY2FsVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsKTsKIAkvLyByZW1vdmUgdGhlIGFzdCBub2RlIGNyZWF0ZWQgaW4gaW50ZXJmYWNlIGhlYWRlcgpAQCAtMzk3Niw4ICs0MzAxLDkgQEAKIAlwdXNoT25Bc3RMZW5ndGhTdGFjaygtMSk7CiAJY29uY2F0Tm9kZUxpc3RzKCk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW52YWxpZEVudW1EZWNsYXJhdGlvbigpIHsKLQkvLyBCbG9ja1N0YXRlbWVudCA6Oj0gRW51bURlY2xhcmF0aW9uCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW52YWxpZEludGVyZmFjZURlY2xhcmF0aW9uKCkgeworCS8vIEJsb2NrU3RhdGVtZW50IDo6PSBJbnZhbGlkSW50ZXJmYWNlRGVjbGFyYXRpb24KKwkvL0ludGVyZmFjZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnNvcHQgJ2ludGVyZmFjZScgJ0lkZW50aWZpZXInIEV4dGVuZHNJbnRlcmZhY2Vzb3B0IEludGVyZmFjZUhlYWRlciBJbnRlcmZhY2VCb2R5CiAJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxMb2NhbFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbCk7CiAJLy8gcmVtb3ZlIHRoZSBhc3Qgbm9kZSBjcmVhdGVkIGluIGludGVyZmFjZSBoZWFkZXIKQEAgLTM5OTUsNyArNDMyMSw3IEBACiAJID09PgogCXRoaXMuYXN0U3RhY2sgOiBNZXRob2REZWNsYXJhdGlvbgogCXRoaXMuaWRlbnRpZmllclN0YWNrIDoKLQl0aGlzLmludFN0YWNrIDogCisJdGhpcy5pbnRTdGFjayA6CiAJKi8KIAogCS8vIHBvcCB0aGUgcG9zaXRpb24gb2YgdGhlIHsgIChib2R5IG9mIHRoZSBtZXRob2QpIHB1c2hlZCBpbiBibG9jayBkZWNsCkBAIC00MDI4LDI3ICs0MzU0LDI3IEBACiAJLy8gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JzICc7JwogCiAJLyoKLQl0aGlzLmFzdFN0YWNrIDogCisJdGhpcy5hc3RTdGFjayA6CiAJdGhpcy5leHByZXNzaW9uU3RhY2s6IEV4cHJlc3Npb24gRXhwcmVzc2lvbiAuLi4uLi4gRXhwcmVzc2lvbgogCXRoaXMuaWRlbnRpZmllclN0YWNrIDogdHlwZSAgaWRlbnRpZmllciBpZGVudGlmaWVyIC4uLi4uLiBpZGVudGlmaWVyCiAJdGhpcy5pbnRTdGFjayA6IHR5cGVEaW0gICAgICBkaW0gICAgICAgIGRpbSAgICAgICAgICAgICAgIGRpbQogCSA9PT4KIAl0aGlzLmFzdFN0YWNrIDogRmllbGREZWNsYXJhdGlvbiBGaWVsZERlY2xhcmF0aW9uIC4uLi4uLiBGaWVsZERlY2xhcmF0aW9uCiAJdGhpcy5leHByZXNzaW9uU3RhY2sgOgotCXRoaXMuaWRlbnRpZmllclN0YWNrIDogCi0JdGhpcy5pbnRTdGFjayA6IAotCSAgCisJdGhpcy5pZGVudGlmaWVyU3RhY2sgOgorCXRoaXMuaW50U3RhY2sgOgorCiAJKi8KIAlpbnQgdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIgPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXTsKIAogCS8vIHVwZGF0ZSB0aGUgdGhpcy5hc3RTdGFjaywgdGhpcy5hc3RQdHIgYW5kIHRoaXMuYXN0TGVuZ3RoU3RhY2sKIAlpbnQgc3RhcnRJbmRleCA9IHRoaXMuYXN0UHRyIC0gdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gKyAxOwogCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRoaXMuYXN0U3RhY2ssIAotCQlzdGFydEluZGV4LCAKLQkJdGhpcy5hc3RTdGFjaywgCi0JCXN0YXJ0SW5kZXggLSAxLCAKLQkJdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIpOyAKKwkJdGhpcy5hc3RTdGFjaywKKwkJc3RhcnRJbmRleCwKKwkJdGhpcy5hc3RTdGFjaywKKwkJc3RhcnRJbmRleCAtIDEsCisJCXZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyKTsKIAl0aGlzLmFzdFB0ci0tOyAvLyByZW1vdmUgdGhlIHR5cGUgcmVmZXJlbmNlCiAJdGhpcy5hc3RMZW5ndGhTdGFja1stLXRoaXMuYXN0TGVuZ3RoUHRyXSA9IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyOwogCXRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdID0gMDsKQEAgLTQwNTgsMTIgKzQzODQsMTIgQEAKIAkvLyBzZWUgYmxvY2tSZWFsIGluIGNhc2Ugb2YgY2hhbmdlOiBkdXBsaWNhdGVkIGNvZGUKIAkvLyBpbmNyZW1lbnQgdGhlIGFtb3VudCBvZiBkZWNsYXJlZCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sKIAl0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyXSsrOwotCQorCiAJLy8gdXBkYXRlIHNvdXJjZSBlbmQgdG8gaW5jbHVkZSB0aGUgc2VtaS1jb2xvbgogCWludCB2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlciA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdOwogCWZvciAoaW50IGkgPSB2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlciAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IChMb2NhbERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gaV07Ci0JCWxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOyAKKwkJbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CiAJCWxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25FbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwkvLyBzZW1pLWNvbG9uIGluY2x1ZGVkCiAJfQogCkBAIC00MDcxLDE2ICs0Mzk3LDIzIEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWFya2VyQW5ub3RhdGlvbigpIHsKIAkvLyBNYXJrZXJBbm5vdGF0aW9uIDo6PSAnQCcgTmFtZQogCU1hcmtlckFubm90YXRpb24gbWFya2VyQW5ub3RhdGlvbiA9IG51bGw7Ci0JVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy5nZXRBbm5vdGF0aW9uVHlwZSgpOworCisJaW50IG9sZEluZGV4ID0gdGhpcy5pZGVudGlmaWVyUHRyOworCisJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gZ2V0QW5ub3RhdGlvblR5cGUoKTsKIAltYXJrZXJBbm5vdGF0aW9uID0gbmV3IE1hcmtlckFubm90YXRpb24odHlwZVJlZmVyZW5jZSwgdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CiAJbWFya2VyQW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IG1hcmtlckFubm90YXRpb24uc291cmNlRW5kOwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhtYXJrZXJBbm5vdGF0aW9uKTsKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCAmJgotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKIAkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZkFubm90YXRpb24obWFya2VyQW5ub3RhdGlvbik7CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mQW5ub3RhdGlvbihtYXJrZXJBbm5vdGF0aW9uKTsKIAl9CiAJdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyA9IHRydWU7CisKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsICYmIHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRBbm5vdGF0aW9uKSB7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoKFJlY292ZXJlZEFubm90YXRpb24pdGhpcy5jdXJyZW50RWxlbWVudCkuYWRkQW5ub3RhdGlvbihtYXJrZXJBbm5vdGF0aW9uLCBvbGRJbmRleCk7CisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpIHsKIAkvLyBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgOjo9ICd7JyBNZW1iZXJWYWx1ZXMgJywnICd9JwpAQCAtNDA4OCw3ICs0NDIxLDcgQEAKIAlhcnJheUluaXRpYWxpemVyKHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWVtYmVyVmFsdWVBc05hbWUoKSB7Ci0JcHVzaE9uRXhwcmVzc2lvblN0YWNrKGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpOwkKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWVtYmVyVmFsdWVQYWlyKCkgewogCS8vIE1lbWJlclZhbHVlUGFpciA6Oj0gU2ltcGxlTmFtZSAnPScgTWVtYmVyVmFsdWUKQEAgLTQxMDEsNiArNDQzNCwxMiBAQAogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwogCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKHNpbXBsZU5hbWUsIHN0YXJ0LCBlbmQsIHZhbHVlKTsKIAlwdXNoT25Bc3RTdGFjayhtZW1iZXJWYWx1ZVBhaXIpOworCisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQW5ub3RhdGlvbikgeworCQlSZWNvdmVyZWRBbm5vdGF0aW9uIHJlY292ZXJlZEFubm90YXRpb24gPSAoUmVjb3ZlcmVkQW5ub3RhdGlvbikgdGhpcy5jdXJyZW50RWxlbWVudDsKKworCQlyZWNvdmVyZWRBbm5vdGF0aW9uLnNldEtpbmQoUmVjb3ZlcmVkQW5ub3RhdGlvbi5OT1JNQUwpOworCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZW1iZXJWYWx1ZVBhaXJzKCkgewogCS8vIE1lbWJlclZhbHVlUGFpcnMgOjo9IE1lbWJlclZhbHVlUGFpcnMgJywnIE1lbWJlclZhbHVlUGFpcgpAQCAtNDExMSw3ICs0NDUwLDcgQEAKIAljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RCb2R5KCkgewotCS8vIE1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgQmxvY2tTdGF0ZW1lbnRzb3B0ICd9JyAKKwkvLyBNZXRob2RCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIEJsb2NrU3RhdGVtZW50c29wdCAnfScKIAl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdIC0tOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGJvb2xlYW4gaXNOb3RBYnN0cmFjdCkgewpAQCAtNDEyNSw3ICs0NDY0LDcgQEAKIAkgPT0+CiAJdGhpcy5hc3RTdGFjayA6IE1ldGhvZERlY2xhcmF0aW9uCiAJdGhpcy5pZGVudGlmaWVyU3RhY2sgOgotCXRoaXMuaW50U3RhY2sgOiAKKwl0aGlzLmludFN0YWNrIDoKIAkqLwogCiAJaW50IGxlbmd0aDsKQEAgLTQxNDAsMTMgKzQ0NzksMTggQEAKIAlpZiAoaXNOb3RBYnN0cmFjdCkgewogCQkvL3N0YXRlbWVudHMKIAkJZXhwbGljaXREZWNsYXJhdGlvbnMgPSB0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyLS1dOwotCQlpZiAoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5hc3RTdGFjaywgCi0JCQkJKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCQlzdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzKSB7CisJCQlpZiAoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pICE9IDApIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCQkodGhpcy5hc3RQdHIgLT0gbGVuZ3RoKSArIDEsCisJCQkJCXN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sCisJCQkJCTAsCisJCQkJCWxlbmd0aCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dOworCQkJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwogCQl9CiAJfQogCkBAIC00MTcyLDExICs0NTE2LDExIEBACiAJLy8gQW5ub3RhdGlvbk1ldGhvZEhlYWRlciA6Oj0gQW5ub3RhdGlvbk1ldGhvZEhlYWRlck5hbWUgRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCBNZXRob2RIZWFkZXJSaWdodFBhcmVuIE1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyBBbm5vdGF0aW9uTWV0aG9kSGVhZGVyRGVmYXVsdFZhbHVlb3B0CiAJLy8gUmVjb3ZlcnlNZXRob2RIZWFkZXIgOjo9IFJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IE1ldGhvZEhlYWRlclJpZ2h0UGFyZW4gTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIEFubm90YXRpb25NZXRob2RIZWFkZXJEZWZhdWx0VmFsdWVvcHQKIAkvLyBSZWNvdmVyeU1ldGhvZEhlYWRlciA6Oj0gUmVjb3ZlcnlNZXRob2RIZWFkZXJOYW1lIEZvcm1hbFBhcmFtZXRlckxpc3RvcHQgTWV0aG9kSGVhZGVyUmlnaHRQYXJlbiBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlCi0JCisKIAkvLyByZXRyaWV2ZSBlbmQgcG9zaXRpb24gb2YgbWV0aG9kIGRlY2xhcmF0b3IKIAlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCi0JaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSl7IAorCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpewogCQltZXRob2QuYm9keVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAl9CiAJLy8gcmVjb3ZlcnkKQEAgLTQxODYsMzMgKzQ1MzAsMzMgQEAKIC8vCQkJbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOwogLy8JCQltZXRob2QuYm9keUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tMTsKIC8vCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQucGFyZW50OwotLy8JCX0gZWxzZSAKKy8vCQl9IGVsc2UKIAkJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTiAvKiYmICFtZXRob2QuaXNBbm5vdGF0aW9uTWV0aG9kKCkqLyl7Ci0JCQltZXRob2QubW9kaWZpZXJzIHw9IEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjU2VtaWNvbG9uQm9keTsJCQkKKwkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OwogCQkJbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOwogCQkJbWV0aG9kLmJvZHlFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLTE7CiAJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudC5wYXJzZVRyZWUoKSA9PSBtZXRob2QgJiYgdGhpcy5jdXJyZW50RWxlbWVudC5wYXJlbnQgIT0gbnVsbCkgewogCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudDsKIAkJCX0KIAkJfSBlbHNlIGlmKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgewotCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRNZXRob2QgJiYgCisJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZE1ldGhvZCAmJgogCQkJCQkoKFJlY292ZXJlZE1ldGhvZCl0aGlzLmN1cnJlbnRFbGVtZW50KS5tZXRob2REZWNsYXJhdGlvbiAhPSBtZXRob2QpIHsKIAkJCQl0aGlzLmlnbm9yZU5leHRPcGVuaW5nQnJhY2UgPSB0cnVlOwotCQkJCXRoaXMuY3VycmVudEVsZW1lbnQuYnJhY2tldEJhbGFuY2UrKzsgCisJCQkJdGhpcy5jdXJyZW50RWxlbWVudC5icmFja2V0QmFsYW5jZSsrOwogCQkJfQogCQl9CiAJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgotCX0JCQorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJEZWZhdWx0VmFsdWUoKSB7CiAJLy8gTWV0aG9kSGVhZGVyRGVmYXVsdFZhbHVlIDo6PSBEZWZhdWx0VmFsdWUKIAlNZXRob2REZWNsYXJhdGlvbiBtZCA9IChNZXRob2REZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAKLQkKKwogCWludCBsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV07CiAJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCWludFB0ci0tOyAvLyB3ZSBnZXQgcmlkIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVmYXVsdCBrZXl3b3JkCi0JCWludFB0ci0tOyAvLyB3ZSBnZXQgcmlkIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVmYXVsdCBrZXl3b3JkCisJCXRoaXMuaW50UHRyLS07IC8vIHdlIGdldCByaWQgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWZhdWx0IGtleXdvcmQKKwkJdGhpcy5pbnRQdHItLTsgLy8gd2UgZ2V0IHJpZCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGRlZmF1bHQga2V5d29yZAogCQlpZihtZC5pc0Fubm90YXRpb25NZXRob2QoKSkgewogCQkJKChBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24pbWQpLmRlZmF1bHRWYWx1ZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJCQltZC5tb2RpZmllcnMgfD0gIENsYXNzRmlsZUNvbnN0YW50cy5BY2NBbm5vdGF0aW9uRGVmYXVsdDsKQEAgLTQyMzksMTQgKzQ1ODMsMTQgQEAKIAkJVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWQucmV0dXJuVHlwZTsKIAkJbWQuc291cmNlRW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKIAkJaW50IGRpbXMgPSByZXR1cm5UeXBlLmRpbWVuc2lvbnMoKSArIGV4dGVuZGVkRGltczsKLQkJbWQucmV0dXJuVHlwZSA9IHRoaXMuY29weURpbXMocmV0dXJuVHlwZSwgZGltcyk7Ci0JCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpeyAKKwkJbWQucmV0dXJuVHlwZSA9IGNvcHlEaW1zKHJldHVyblR5cGUsIGRpbXMpOworCQlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsKIAkJCW1kLmJvZHlTdGFydCA9IHRoaXMuZW5kUG9zaXRpb24gKyAxOwogCQl9CiAJCS8vIHJlY292ZXJ5CiAJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1kLmJvZHlTdGFydDsKLQkJfQkJCisJCX0KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZShib29sZWFuIGlzQW5ub3RhdGlvbk1ldGhvZCkgewpAQCAtNDI3NCwxMSArNDYxOCwxMSBAQAogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJbWQuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQltZC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJLy8gamF2YWRvYwogCW1kLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7CkBAIC00MjkwLDEwICs0NjM0LDEwIEBACiAJbWQuc291cmNlRW5kID0gdGhpcy5sUGFyZW5Qb3M7CiAJbWQuYm9keVN0YXJ0ID0gdGhpcy5sUGFyZW5Qb3MrMTsKIAl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyBpbml0aWFsaXplIHRoaXMubGlzdExlbmd0aCBiZWZvcmUgcmVhZGluZyBwYXJhbWV0ZXJzL3Rocm93cwotCQorCiAJLy8gcmVjb3ZlcnkKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKLQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlIAorCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUKIAkJCS8vfHwgbWQubW9kaWZpZXJzICE9IDAKIAkJCXx8IChVdGlsLmdldExpbmVOdW1iZXIobWQucmV0dXJuVHlwZS5zb3VyY2VTdGFydCwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikKIAkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKG1kLnNvdXJjZVN0YXJ0LCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKSkpewpAQCAtNDMwNCw3ICs0NjQ4LDcgQEAKIAkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZC5zb3VyY2VTdGFydDsKIAkJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKIAkJfQotCX0JCQorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKGJvb2xlYW4gaXNBbm5vdGF0aW9uTWV0aG9kKSB7CiAJLy8gTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGVQYXJhbWV0ZXJzIFR5cGUgJ0lkZW50aWZpZXInICcoJwpAQCAtNDMyNCwyNCArNDY2OCwyNCBAQAogCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCS8vdHlwZQogCW1kLnJldHVyblR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOwotCQorCiAJLy8gY29uc3VtZSB0eXBlIHBhcmFtZXRlcnMKIAlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHItLV07CiAJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCBtZC50eXBlUGFyYW1ldGVycyA9IG5ldyBUeXBlUGFyYW1ldGVyW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JCisKIAkvL21vZGlmaWVycwogCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCW1kLm1vZGlmaWVycyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJLy8gY29uc3VtZSBhbm5vdGF0aW9ucwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCW1kLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAotCX0JCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQltZC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKKwl9CiAJLy8gamF2YWRvYwogCW1kLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7CiAJdGhpcy5qYXZhZG9jID0gbnVsbDsKQEAgLTQzNTIsMTEgKzQ2OTYsMTEgQEAKIAltZC5zb3VyY2VFbmQgPSB0aGlzLmxQYXJlblBvczsKIAltZC5ib2R5U3RhcnQgPSB0aGlzLmxQYXJlblBvcysxOwogCXRoaXMubGlzdExlbmd0aCA9IDA7IC8vIGluaXRpYWxpemUgdGhpcy5saXN0TGVuZ3RoIGJlZm9yZSByZWFkaW5nIHBhcmFtZXRlcnMvdGhyb3dzCi0JCisKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQlib29sZWFuIGlzVHlwZTsKLQkJaWYgKChpc1R5cGUgPSB0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSkgCisJCWlmICgoaXNUeXBlID0gdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpCiAJCQkvL3x8IG1kLm1vZGlmaWVycyAhPSAwCiAJCQl8fCAoVXRpbC5nZXRMaW5lTnVtYmVyKG1kLnJldHVyblR5cGUuc291cmNlU3RhcnQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCiAJCQkJCT09IFV0aWwuZ2V0TGluZU51bWJlcihtZC5zb3VyY2VTdGFydCwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikpKXsKQEAgLTQzNzAsNyArNDcxNCw3IEBACiAJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWQuc291cmNlU3RhcnQ7CiAJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCX0KLQl9CQkKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyUmlnaHRQYXJlbigpIHsKIAkvLyBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0ICcpJwpAQCAtNDM4MSwxMSArNDcyNSwxMSBAQAogCS8vYXJndW1lbnRzCiAJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmFzdFN0YWNrLCAKLQkJCXRoaXMuYXN0UHRyICsgMSwgCi0JCQltZC5hcmd1bWVudHMgPSBuZXcgQXJndW1lbnRbbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5hc3RTdGFjaywKKwkJCXRoaXMuYXN0UHRyICsgMSwKKwkJCW1kLmFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFtsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCW1kLmJvZHlTdGFydCA9IHRoaXMuclBhcmVuUG9zKzE7CiAJdGhpcy5saXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgdGhpcy5saXN0TGVuZ3RoIGFmdGVyIGhhdmluZyByZWFkIGFsbCBwYXJhbWV0ZXJzCkBAIC00Mzk3LDEzICs0NzQxLDEzIEBACiAJCS8vIG1pZ2h0IG5vdCBoYXZlIGJlZW4gYXR0YWNoZWQgeWV0IC0gaW4gc29tZSBjb25zdHJ1Y3RvciBzY2VuYXJpaQogCQlpZiAobWQuaXNDb25zdHJ1Y3RvcigpKXsKIAkJCWlmICgobGVuZ3RoICE9IDApCi0JCQkJfHwgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgCisJCQkJfHwgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkKIAkJCQl8fCAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1ldGhyb3dzKSl7CiAJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKG1kLCAwKTsKIAkJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKLQkJCX0JCi0JCX0JCi0JfQkKKwkJCX0KKwkJfQorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKSB7CiAJLy8gTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlIDo6PSAndGhyb3dzJyBDbGFzc1R5cGVMaXN0CkBAIC00NDExLDE0ICs0NzU1LDE0IEBACiAJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwogCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJdGhpcy5hc3RTdGFjaywgCi0JCXRoaXMuYXN0UHRyICsgMSwgCi0JCW1kLnRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAKLQkJMCwgCisJCXRoaXMuYXN0U3RhY2ssCisJCXRoaXMuYXN0UHRyICsgMSwKKwkJbWQudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sCisJCTAsCiAJCWxlbmd0aCk7CiAJbWQuc291cmNlRW5kID0gbWQudGhyb3duRXhjZXB0aW9uc1tsZW5ndGgtMV0uc291cmNlRW5kOwogCW1kLmJvZHlTdGFydCA9IG1kLnRocm93bkV4Y2VwdGlvbnNbbGVuZ3RoLTFdLnNvdXJjZUVuZCArIDE7Ci0JdGhpcy5saXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgdGhpcy5saXN0TGVuZ3RoIGFmdGVyIGhhdmluZyByZWFkIGFsbCB0aHJvd24gZXhjZXB0aW9ucwkKKwl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyByZXNldCB0aGlzLmxpc3RMZW5ndGggYWZ0ZXIgaGF2aW5nIHJlYWQgYWxsIHRocm93biBleGNlcHRpb25zCiAJLy8gcmVjb3ZlcnkKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1kLmJvZHlTdGFydDsKQEAgLTQ0MzEsOCArNDc3NSw4IEBACiAKIAlNZXNzYWdlU2VuZCBtID0gbmV3TWVzc2FnZVNlbmQoKTsKIAltLnNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOwotCW0uc291cmNlU3RhcnQgPSAKLQkJKGludCkgKChtLm5hbWVTb3VyY2VQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSkgPj4+IDMyKTsgCisJbS5zb3VyY2VTdGFydCA9CisJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7CiAJbS5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAlpZiAodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9PSAxKSB7CiAJCW0ucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLmltcGxpY2l0VGhpcygpOwpAQCAtNDQ0MCw3ICs0Nzg0LDcgQEAKIAl9IGVsc2UgewogCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdLS07CiAJCW0ucmVjZWl2ZXIgPSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOwotCQltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsJCQorCQltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsKIAl9CiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG0pOwogfQpAQCAtNDQ1MSw4ICs0Nzk1LDggQEAKIAogCU1lc3NhZ2VTZW5kIG0gPSBuZXdNZXNzYWdlU2VuZFdpdGhUeXBlQXJndW1lbnRzKCk7CiAJbS5zb3VyY2VFbmQgPSB0aGlzLnJQYXJlblBvczsKLQltLnNvdXJjZVN0YXJ0ID0gCi0JCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7IAorCW0uc291cmNlU3RhcnQgPQorCQkoaW50KSAoKG0ubmFtZVNvdXJjZVBvc2l0aW9uID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdKSA+Pj4gMzIpOwogCW0uc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAKQEAgLTQ0NjAsMTAgKzQ4MDQsMTAgQEAKIAlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHItLV07CiAJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCBtLnR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAwLCBsZW5ndGgpOwotCWludFB0ci0tOwotCQorCXRoaXMuaW50UHRyLS07CisKIAltLnJlY2VpdmVyID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKLQltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsJCQorCW0uc291cmNlU3RhcnQgPSBtLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhtKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpIHsKQEAgLTQ0NzEsOCArNDgxNSw4IEBACiAJLy9NZXRob2RJbnZvY2F0aW9uIDo6PSBQcmltYXJ5ICcuJyAnSWRlbnRpZmllcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKIAogCU1lc3NhZ2VTZW5kIG0gPSBuZXdNZXNzYWdlU2VuZCgpOwotCW0uc291cmNlU3RhcnQgPSAKLQkJKGludCkgKChtLm5hbWVTb3VyY2VQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSkgPj4+IDMyKTsgCisJbS5zb3VyY2VTdGFydCA9CisJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7CiAJbS5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIAltLnJlY2VpdmVyID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKQEAgLTQ0ODUsMTYgKzQ4MjksMTYgQEAKIAkvL01ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nIFR5cGVBcmd1bWVudHMgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCiAKIAlNZXNzYWdlU2VuZCBtID0gbmV3TWVzc2FnZVNlbmRXaXRoVHlwZUFyZ3VtZW50cygpOwotCW0uc291cmNlU3RhcnQgPSAKLQkJKGludCkgKChtLm5hbWVTb3VyY2VQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSkgPj4+IDMyKTsgCisJbS5zb3VyY2VTdGFydCA9CisJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7CiAJbS5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQkKKwogCS8vIGhhbmRsZSB0eXBlIGFyZ3VtZW50cwogCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKIAl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIG0udHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7Ci0JaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIAogCW0ucmVjZWl2ZXIgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwogCW0uc291cmNlU3RhcnQgPSBtLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwpAQCAtNDUxNywxMiArNDg2MSwxMiBAQAogCS8vIE1ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nIFR5cGVBcmd1bWVudHMgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCiAKIAlNZXNzYWdlU2VuZCBtID0gbmV3TWVzc2FnZVNlbmRXaXRoVHlwZUFyZ3VtZW50cygpOwotCWludFB0ci0tOyAvLyBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdHlwZUFyZ3VtZW50cworCXRoaXMuaW50UHRyLS07IC8vIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSB0eXBlQXJndW1lbnRzCiAJbS5zb3VyY2VFbmQgPSB0aGlzLnJQYXJlblBvczsKIAltLm5hbWVTb3VyY2VQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKIAltLnNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOwogCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwotCQorCiAJLy8gaGFuZGxlIHR5cGUgYXJndW1lbnRzCiAJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwogCXRoaXMuZ2VuZXJpY3NQdHIgLT0gbGVuZ3RoOwpAQCAtNDUzMyw3ICs0ODc3LDcgQEAKIAlwdXNoT25FeHByZXNzaW9uU3RhY2sobSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTW9kaWZpZXJzKCkgewotCWludCBzYXZlZE1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydDsJCisJaW50IHNhdmVkTW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0OwogCWNoZWNrQ29tbWVudCgpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAogCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzKTsgLy8gbW9kaWZpZXJzCiAJaWYgKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPj0gc2F2ZWRNb2RpZmllcnNTb3VyY2VTdGFydCkgewpAQCAtNDU0NSw2ICs0ODg5LDEwIEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTW9kaWZpZXJzMigpIHsKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHIgLSAxXSArPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV07CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTXVsdGlwbGVSZXNvdXJjZXMoKSB7CisJLy8gUmVzb3VyY2VzIDo6PSBSZXNvdXJjZXMgJzsnIFJlc291cmNlCisJY29uY2F0Tm9kZUxpc3RzKCk7Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTmFtZUFycmF5VHlwZSgpIHsKIAlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOyAvLyBoYW5kbGUgdHlwZSBhcmd1bWVudHMKIAlwdXNoT25HZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2sodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSk7CkBAIC00NTc2LDI4ICs0OTI0LDM1IEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpIHsKIAkvLyBOb3JtYWxBbm5vdGF0aW9uIDo6PSAnQCcgTmFtZSAnKCcgTWVtYmVyVmFsdWVQYWlyc29wdCAnKScKIAlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSBudWxsOwotCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IHRoaXMuZ2V0QW5ub3RhdGlvblR5cGUoKTsKKworCWludCBvbGRJbmRleCA9IHRoaXMuaWRlbnRpZmllclB0cjsKKworCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldEFubm90YXRpb25UeXBlKCk7CiAJbm9ybWFsQW5ub3RhdGlvbiA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHR5cGVSZWZlcmVuY2UsIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOwogCWludCBsZW5ndGg7CiAJaWYgKChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmFzdFN0YWNrLCAKLQkJCSh0aGlzLmFzdFB0ciAtPSBsZW5ndGgpICsgMSwgCi0JCQlub3JtYWxBbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuYXN0U3RhY2ssCisJCQkodGhpcy5hc3RQdHIgLT0gbGVuZ3RoKSArIDEsCisJCQlub3JtYWxBbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJbm9ybWFsQW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuclBhcmVuUG9zOwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhub3JtYWxBbm5vdGF0aW9uKTsKLQkKKwogCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewogCQlhbm5vdGF0aW9uUmVjb3ZlcnlDaGVja1BvaW50KG5vcm1hbEFubm90YXRpb24uc291cmNlU3RhcnQsIG5vcm1hbEFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCisJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQW5ub3RhdGlvbikgeworCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9ICgoUmVjb3ZlcmVkQW5ub3RhdGlvbil0aGlzLmN1cnJlbnRFbGVtZW50KS5hZGRBbm5vdGF0aW9uKG5vcm1hbEFubm90YXRpb24sIG9sZEluZGV4KTsKKwkJfQogCX0KLQkKKwogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgorCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewotCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mQW5ub3RhdGlvbihub3JtYWxBbm5vdGF0aW9uKTsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uKG5vcm1hbEFubm90YXRpb24pOwogCX0KIAl0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzID0gdHJ1ZTsKIH0KQEAgLTQ2MTMsMTAgKzQ5NjgsMTAgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVPbmx5VHlwZUFyZ3VtZW50cygpIHsKIAlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCAmJgotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgJiYKIAkJCXRoaXMubGFzdEVycm9yRW5kUG9zaXRpb25CZWZvcmVSZWNvdmVyeSA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXTsKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlR5cGVBcmd1bWVudHMoCisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mVHlwZUFyZ3VtZW50cygKIAkJCShUeXBlUmVmZXJlbmNlKXRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyIC0gbGVuZ3RoICsgMV0sCiAJCQkoVHlwZVJlZmVyZW5jZSl0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl0pOwogCX0KQEAgLTQ2MzksMTQgKzQ5OTQsMTQgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQYWNrYWdlQ29tbWVudCgpIHsKIAkvLyBnZXQgcG9zc2libGUgY29tbWVudCBmb3Igc3ludGF4IHNpbmNlIDEuNQotCWlmKG9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCWlmKHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCWNoZWNrQ29tbWVudCgpOwogCQlyZXNldE1vZGlmaWVycygpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb24oKSB7CiAJLy8gUGFja2FnZURlY2xhcmF0aW9uIDo6PSAncGFja2FnZScgTmFtZSAnOycKLQkvKiBidWlsZCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlJbXBvcnRSZWZlcmVuY2UgaW1wdCA9IHRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlOwpAQCAtNDY1NCwyOSArNTAwOSwyOSBAQAogCXRoaXMuamF2YWRvYyA9IG51bGw7CiAJLy8gZmx1c2ggY29tbWVudHMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cwogCWltcHQuZGVjbGFyYXRpb25FbmQgPSB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uOwotCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLmZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyhpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWUoKSB7CiAJLy8gUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gJ3BhY2thZ2UnIE5hbWUKLQkvKiBidWlsZCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlJbXBvcnRSZWZlcmVuY2UgaW1wdDsKIAlpbnQgbGVuZ3RoOwotCWNoYXJbXVtdIHRva2VucyA9IAotCQluZXcgY2hhcltsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLV1dW107IAorCWNoYXJbXVtdIHRva2VucyA9CisJCW5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXV1bXTsKIAl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssICsrdGhpcy5pZGVudGlmaWVyUHRyLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCXRoaXMuaWRlbnRpZmllclB0ci0tLCAKLQkJcG9zaXRpb25zLCAKLQkJMCwgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ci0tLAorCQlwb3NpdGlvbnMsCisJCTAsCiAJCWxlbmd0aCk7Ci0JCi0JaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIHRydWUsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KTsKLQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSA9IGltcHQ7IAorCisJaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIGZhbHNlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CisJdGhpcy5jb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSBpbXB0OwogCiAJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CiAJCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKQEAgLTQ2OTUsNDMgKzUwNTAsNDMgQEAKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQotCX0JCisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lV2l0aE1vZGlmaWVycygpIHsKIAkvLyBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSBNb2RpZmllcnMgJ3BhY2thZ2UnIE5hbWUKLQkvKiBidWlsZCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlJbXBvcnRSZWZlcmVuY2UgaW1wdDsKIAlpbnQgbGVuZ3RoOwotCWNoYXJbXVtdIHRva2VucyA9IAotCQluZXcgY2hhcltsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLV1dW107IAorCWNoYXJbXVtdIHRva2VucyA9CisJCW5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXV1bXTsKIAl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssICsrdGhpcy5pZGVudGlmaWVyUHRyLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJU3lzdGVtLmFycmF5Y29weSgKLQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCXRoaXMuaWRlbnRpZmllclB0ci0tLCAKLQkJcG9zaXRpb25zLCAKLQkJMCwgCisJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssCisJCXRoaXMuaWRlbnRpZmllclB0ci0tLAorCQlwb3NpdGlvbnMsCisJCTAsCiAJCWxlbmd0aCk7Ci0JCisKIAlpbnQgcGFja2FnZU1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgbW9kaWZpZXJzIHN0YXJ0CiAJaW50IHBhY2thZ2VNb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCi0JaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIHRydWUsIHBhY2thZ2VNb2RpZmllcnMpOwotCXRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID0gaW1wdDsgCisJaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIGZhbHNlLCBwYWNrYWdlTW9kaWZpZXJzKTsKKwl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSA9IGltcHQ7CiAJLy8gY29uc3VtZSBhbm5vdGF0aW9ucwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCWltcHQuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLCAKLQkJCTAsIAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJaW1wdC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAogCQkJbGVuZ3RoKTsKIAkJaW1wdC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gcGFja2FnZU1vZGlmaWVyc1NvdXJjZVN0YXJ0OwotCQlpbnRQdHItLTsgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgcG9zaXRpb24gb2YgdGhlICdwYWNrYWdlIGtleXdvcmQKKwkJdGhpcy5pbnRQdHItLTsgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgcG9zaXRpb24gb2YgdGhlICdwYWNrYWdlIGtleXdvcmQKIAl9IGVsc2UgewogCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCQkvLyBnZXQgcG9zc2libGUgY29tbWVudCBzb3VyY2Ugc3RhcnQKQEAgLTQ3MzksNyArNTA5NCw3IEBACiAJCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmphdmFkb2Muc291cmNlU3RhcnQ7CiAJCX0KIAl9Ci0JCQorCiAJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CiAJCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAl9IGVsc2UgewpAQCAtNDc1MCwxNSArNTEwNSwxNSBAQAogCS8vIHJlY292ZXJ5CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCi0JfQkKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVBvc3RmaXhFeHByZXNzaW9uKCkgewogCS8vIFBvc3RmaXhFeHByZXNzaW9uIDo6PSBOYW1lCiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5KCkgewotCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSAgUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gCisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTgogCWZpbmFsIEV4cHJlc3Npb24gcGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwogCXVwZGF0ZVNvdXJjZVBvc2l0aW9uKHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKTsKIAlpbnQgbnVtYmVyT2ZQYXJlbnRoZXNpcyA9IChwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5iaXRzICYgQVNUTm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPj4gQVNUTm9kZS5QYXJlbnRoZXNpemVkU0hJRlQ7CkBAIC00NzgzLDcgKzUxMzgsNyBAQAogCXB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayh0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdKTsKIAlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOwogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JCisKIAlwdXNoT25FeHByZXNzaW9uU3RhY2soCiAJCW5ldyBDbGFzc0xpdGVyYWxBY2Nlc3ModGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwgdHlwZVJlZmVyZW5jZSkpOwogfQpAQCAtNDgwNyw3ICs1MTYyLDcgQEAKIAlwdXNoT25HZW5lcmljc0xlbmd0aFN0YWNrKDApOyAvLyBoYW5kbGUgdHlwZSBhcmd1bWVudHMKIAogCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JCisKIAlwdXNoT25FeHByZXNzaW9uU3RhY2soCiAJCW5ldyBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlKAogCQkJdHlwZVJlZmVyZW5jZSwKQEAgLTQ4MzEsNyArNTE4Niw3IEBACiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG5ldyBUaGlzUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sIHRoaXMuZW5kUG9zaXRpb24pKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVdpdGhOYW1lKCkgewotCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSAgUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gCisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTgogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpKTsKIAlmaW5hbCBFeHByZXNzaW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKIAl1cGRhdGVTb3VyY2VQb3NpdGlvbihwYXJlbnRoZXNpemVkRXhwcmVzc2lvbik7CkBAIC00ODUwLDEyICs1MjA1LDYgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQdXNoTGVmdEJyYWNlKCkgewogCXB1c2hPbkludFN0YWNrKHRoaXMuZW5kUG9zaXRpb24pOyAvLyBtb2RpZmllcnMKIH0KLXByb3RlY3RlZCB2b2lkIGNvbnN1bWVQdXNoUmVhbE1vZGlmaWVycygpIHsKLQljaGVja0NvbW1lbnQoKTsgLy8gbWlnaHQgdXBkYXRlIG1vZGlmaWVycyB3aXRoIEFjY0RlcHJlY2F0ZWQKLQlwdXNoT25JbnRTdGFjayh0aGlzLm1vZGlmaWVycyk7IC8vIG1vZGlmaWVycwotCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOwotCXJlc2V0TW9kaWZpZXJzKCk7Ci19CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHVzaE1vZGlmaWVycygpIHsKIAlwdXNoT25JbnRTdGFjayh0aGlzLm1vZGlmaWVycyk7IC8vIG1vZGlmaWVycwogCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOwpAQCAtNDg3NCw4ICs1MjIzLDE0IEBACiAJLy8gUHVzaFBvc2l0aW9uIDo6PSAkZW1wdHkKIAlwdXNoT25JbnRTdGFjayh0aGlzLmVuZFBvc2l0aW9uKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVQdXNoUmVhbE1vZGlmaWVycygpIHsKKwljaGVja0NvbW1lbnQoKTsgLy8gbWlnaHQgdXBkYXRlIG1vZGlmaWVycyB3aXRoIEFjY0RlcHJlY2F0ZWQKKwlwdXNoT25JbnRTdGFjayh0aGlzLm1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOworCXJlc2V0TW9kaWZpZXJzKCk7Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUXVhbGlmaWVkTmFtZSgpIHsKLQkvLyBRdWFsaWZpZWROYW1lIDo6PSBOYW1lICcuJyBTaW1wbGVOYW1lIAorCS8vIFF1YWxpZmllZE5hbWUgOjo9IE5hbWUgJy4nIFNpbXBsZU5hbWUKIAkvKmJhY2sgZnJvbSB0aGUgcmVjdXJzaXZlIGxvb3Agb2YgUXVhbGlmaWVkTmFtZS4KIAlVcGRhdGVzIGlkZW50aWZpZXIgbGVuZ3RoIGludG8gdGhlIGxlbmd0aCBzdGFjayovCiAKQEAgLTQ4OTIsNyArNTI0Nyw3IEBACiAJCQlpc0Fubm90YXRpb25NZXRob2QgPSAocmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pICE9IDA7CiAJCX0KIAl9Ci0JdGhpcy5jb25zdW1lTWV0aG9kSGVhZGVyTmFtZShpc0Fubm90YXRpb25NZXRob2QpOworCWNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKGlzQW5ub3RhdGlvbk1ldGhvZCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVjb3ZlcnlNZXRob2RIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgewogCS8vIHRoaXMgbWV0aG9kIGlzIGNhbGwgb25seSBpbnNpZGUgcmVjb3ZlcnkKQEAgLTQ5MDUsNyArNTI2MCw3IEBACiAJCQlpc0Fubm90YXRpb25NZXRob2QgPSAocmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pICE9IDA7CiAJCX0KIAl9Ci0JdGhpcy5jb25zdW1lTWV0aG9kSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycyhpc0Fubm90YXRpb25NZXRob2QpOworCWNvbnN1bWVNZXRob2RIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKGlzQW5ub3RhdGlvbk1ldGhvZCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVkdWNlSW1wb3J0cygpIHsKIAkvLyBDb25zdW1lIGltcG9ydHMKQEAgLTQ5MjQsMTMgKzUyNzksMjggQEAKIAlwdXNoT25JbnRTdGFjaygwKTsgLy8gaGFuZGxlIGFycmF5IHR5cGUKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVSZWZlcmVuY2VUeXBlMSgpIHsKLQlwdXNoT25HZW5lcmljc1N0YWNrKGdldFR5cGVSZWZlcmVuY2UodGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSkpOwkKKwlwdXNoT25HZW5lcmljc1N0YWNrKGdldFR5cGVSZWZlcmVuY2UodGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSkpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJlZmVyZW5jZVR5cGUyKCkgewotCXB1c2hPbkdlbmVyaWNzU3RhY2soZ2V0VHlwZVJlZmVyZW5jZSh0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSk7CQorCXB1c2hPbkdlbmVyaWNzU3RhY2soZ2V0VHlwZVJlZmVyZW5jZSh0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVmZXJlbmNlVHlwZTMoKSB7Ci0JcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsJCisJcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVSZXNvdXJjZUFzTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCkgeworCS8vIFJlc291cmNlIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgVmFyaWFibGVEZWNsYXJhdG9ySWQgRW50ZXJWYXJpYWJsZSAnPScgRm9yY2VOb0RpZXQgVmFyaWFibGVJbml0aWFsaXplciBSZXN0b3JlRGlldCBFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24KKwkvLyBSZXNvdXJjZSA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaFJlYWxNb2RpZmllcnMgVmFyaWFibGVEZWNsYXJhdG9ySWQgRW50ZXJWYXJpYWJsZSAnPScgRm9yY2VOb0RpZXQgVmFyaWFibGVJbml0aWFsaXplciBSZXN0b3JlRGlldCBFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24KKwljb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVzb3VyY2VTcGVjaWZpY2F0aW9uKCkgeworCS8vIFJlc291cmNlU3BlY2lmaWNhdGlvbiA6Oj0gJygnIFJlc291cmNlcyAnKScKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVSZXNvdXJjZU9wdGlvbmFsVHJhaWxpbmdTZW1pQ29sb24oYm9vbGVhbiBwdW5jdHVhdGVkKSB7CisJLy8gVHJhaWxpbmdTZW1pQ29sb24gOjo9ICc7JworCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IChMb2NhbERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwlpZiAocHVuY3R1YXRlZCkgeworCQlsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVzdG9yZURpZXQoKSB7CiAJLy8gUmVzdG9yZURpZXQgOjo9ICRlbXB0eQpAQCAtNDk0MCw3ICs1MzEwLDcgQEAKIAkvLyBQdXNoUlBBUkVOIDo6PSAnKScKIAlwdXNoT25JbnRTdGFjayh0aGlzLnJQYXJlblBvcyk7CiB9Ci0vLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5ICAKKy8vIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gYXV0b21hdGljIGdlbmVyYXRpb24gOiBkbyBOT1QgZWRpdC1tb2RpZnkKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVSdWxlKGludCBhY3QpIHsKICAgc3dpdGNoICggYWN0ICkgewogICAgIGNhc2UgMzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDo6PSBQcmltaXRpdmVUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKQEAgLTQ5NDgsMTY4MyArNTMxOCwxNzkwIEBACiAJCQlicmVhazsKICAKICAgICBjYXNlIDQ0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUiKTsgfSAgLy8kTk9OLU5MUy0xJAotCQkgICAgY29uc3VtZVJlZmVyZW5jZVR5cGUoKTsgICAKKwkJICAgIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAogICAgIGNhc2UgNDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc09ySW50ZXJmYWNlIDo6PSBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgIGNvbnN1bWVDbGFzc09ySW50ZXJmYWNlTmFtZSgpOyAgIAorCQkgICAgY29uc3VtZUNsYXNzT3JJbnRlcmZhY2VOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAogICAgIGNhc2UgNDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc09ySW50ZXJmYWNlIDo6PSBHZW5lcmljVHlwZSBET1QgTmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lQ2xhc3NPckludGVyZmFjZSgpOyAgIAorCQkgICAgY29uc3VtZUNsYXNzT3JJbnRlcmZhY2UoKTsgIAogCQkJYnJlYWs7CiAgCiAgICAgY2FzZSA1MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyaWNUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlIFR5cGVBcmd1bWVudHMiKTsgfSAgLy8kTk9OLU5MUy0xJAotCQkgICAgY29uc3VtZUdlbmVyaWNUeXBlKCk7ICAgCisJCSAgICBjb25zdW1lR2VuZXJpY1R5cGUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5VHlwZVdpdGhUeXBlQXJndW1lbnRzTmFtZSA6Oj0gR2VuZXJpY1R5cGUgRE9UIE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAotCQkgICAgY29uc3VtZUFycmF5VHlwZVdpdGhUeXBlQXJndW1lbnRzTmFtZSgpOyAgIAorICAgIGNhc2UgNTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmljVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZSBMRVNTIEdSRUFURVIiKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUdlbmVyaWNUeXBlV2l0aERpYW1vbmQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5VHlwZSA6Oj0gUHJpbWl0aXZlVHlwZSBEaW1zIik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgIGNvbnN1bWVQcmltaXRpdmVBcnJheVR5cGUoKTsgICAKKyAgICBjYXNlIDUyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlUeXBlV2l0aFR5cGVBcmd1bWVudHNOYW1lIDo6PSBHZW5lcmljVHlwZSBET1QgTmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lQXJyYXlUeXBlV2l0aFR5cGVBcmd1bWVudHNOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheVR5cGUgOjo9IE5hbWUgRGltcyIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lTmFtZUFycmF5VHlwZSgpOyAgIAorICAgIGNhc2UgNTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheVR5cGUgOjo9IFByaW1pdGl2ZVR5cGUgRGltcyIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lUHJpbWl0aXZlQXJyYXlUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheVR5cGUgOjo9IEFycmF5VHlwZVdpdGhUeXBlQXJndW1lbnRzTmFtZSBEaW1zIik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgIGNvbnN1bWVHZW5lcmljVHlwZU5hbWVBcnJheVR5cGUoKTsgICAKKyAgICBjYXNlIDU0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlUeXBlIDo6PSBOYW1lIERpbXMiKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZU5hbWVBcnJheVR5cGUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5VHlwZSA6Oj0gR2VuZXJpY1R5cGUgRGltcyIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lR2VuZXJpY1R5cGVBcnJheVR5cGUoKTsgICAKKyAgICBjYXNlIDU1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlUeXBlIDo6PSBBcnJheVR5cGVXaXRoVHlwZUFyZ3VtZW50c05hbWUgRGltcyIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lR2VuZXJpY1R5cGVOYW1lQXJyYXlUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJRdWFsaWZpZWROYW1lIDo6PSBOYW1lIERPVCBTaW1wbGVOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlUeXBlIDo6PSBHZW5lcmljVHlwZSBEaW1zIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVHZW5lcmljVHlwZUFycmF5VHlwZSgpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDYxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUXVhbGlmaWVkTmFtZSA6Oj0gTmFtZSBET1QgU2ltcGxlTmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUXVhbGlmaWVkTmFtZSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsYXRpb25Vbml0IDo6PSBFbnRlckNvbXBpbGF0aW9uVW5pdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNvbXBpbGF0aW9uVW5pdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9IFBhY2thZ2VEZWNsYXJhdGlvbiIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lSW50ZXJuYWxDb21waWxhdGlvblVuaXQoKTsgIAotCQkJYnJlYWs7Ci0gCi0gICAgY2FzZSA2MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVybmFsQ29tcGlsYXRpb25Vbml0IDo6PSBQYWNrYWdlRGVjbGFyYXRpb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCA6Oj0gUGFja2FnZURlY2xhcmF0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCgpOyAgCiAJCQlicmVhazsKICAKICAgICBjYXNlIDY0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9IFBhY2thZ2VEZWNsYXJhdGlvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lSW50ZXJuYWxDb21waWxhdGlvblVuaXRXaXRoVHlwZXMoKTsgIAorCQkgICAgY29uc3VtZUludGVybmFsQ29tcGlsYXRpb25Vbml0KCk7ICAKIAkJCWJyZWFrOwogIAogICAgIGNhc2UgNjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCA6Oj0gUGFja2FnZURlY2xhcmF0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcm5hbENvbXBpbGF0aW9uVW5pdFdpdGhUeXBlcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9IEltcG9ydERlY2xhcmF0aW9ucy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVybmFsQ29tcGlsYXRpb25Vbml0IDo6PSBQYWNrYWdlRGVjbGFyYXRpb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUludGVybmFsQ29tcGlsYXRpb25Vbml0V2l0aFR5cGVzKCk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgNjcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9IFR5cGVEZWNsYXJhdGlvbnMiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCA6Oj0gVHlwZURlY2xhcmF0aW9ucyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW50ZXJuYWxDb21waWxhdGlvblVuaXRXaXRoVHlwZXMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVybmFsQ29tcGlsYXRpb25Vbml0IDo6PSBJbXBvcnREZWNsYXJhdGlvbnMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbENvbXBpbGF0aW9uVW5pdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcm5hbENvbXBpbGF0aW9uVW5pdFdpdGhUeXBlcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDcwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eUludGVybmFsQ29tcGlsYXRpb25Vbml0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWR1Y2VJbXBvcnRzIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZHVjZUltcG9ydHMgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVSZWR1Y2VJbXBvcnRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnRlckNvbXBpbGF0aW9uVW5pdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnRlckNvbXBpbGF0aW9uVW5pdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudGVyQ29tcGlsYXRpb25Vbml0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgODcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaEhlYWRlciA6Oj0gY2F0Y2ggTFBBUkVOIEZvcm1hbFBhcmFtZXRlciBSUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgODggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaEhlYWRlciA6Oj0gY2F0Y2ggTFBBUkVOIENhdGNoRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2F0Y2hIZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA4OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9ydERlY2xhcmF0aW9ucyA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDkwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUltcG9ydERlY2xhcmF0aW9ucygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDkxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9ucyA6Oj0gVHlwZURlY2xhcmF0aW9ucyBUeXBlRGVjbGFyYXRpb24iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgOTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb25zIDo6PSBUeXBlRGVjbGFyYXRpb25zIFR5cGVEZWNsYXJhdGlvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDkyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAgCisgICAgY2FzZSA5MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbiA6Oj0gUGFja2FnZURlY2xhcmF0aW9uTmFtZSBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDkzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gTW9kaWZpZXJzIHBhY2thZ2UuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAotCQkgICAgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lV2l0aE1vZGlmaWVycygpOyAgCisgICAgY2FzZSA5NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgOjo9IE1vZGlmaWVycyBwYWNrYWdlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lV2l0aE1vZGlmaWVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDk0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gUGFja2FnZUNvbW1lbnQgcGFja2FnZSBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgICBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOyAgCisgICAgY2FzZSA5NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgOjo9IFBhY2thZ2VDb21tZW50IHBhY2thZ2UgTmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZUNvbW1lbnQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgICBjb25zdW1lUGFja2FnZUNvbW1lbnQoKTsgIAorICAgIGNhc2UgOTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQYWNrYWdlQ29tbWVudCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZVBhY2thZ2VDb21tZW50KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTAwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEwMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDEwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDEwMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMDMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIERPVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIERPVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDEwNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSAxMDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllcnMgOjo9IE1vZGlmaWVycyBNb2RpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllcnMgOjo9IE1vZGlmaWVycyBNb2RpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTW9kaWZpZXJzMigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEyMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyIDo6PSBBbm5vdGF0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDEyMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyIDo6PSBBbm5vdGF0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uQXNNb2RpZmllcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEyMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGVjbGFyYXRpb24gOjo9IENsYXNzSGVhZGVyIENsYXNzQm9keSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMjQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0RlY2xhcmF0aW9uIDo6PSBDbGFzc0hlYWRlciBDbGFzc0JvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzRGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMjQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlciA6Oj0gQ2xhc3NIZWFkZXJOYW1lIENsYXNzSGVhZGVyRXh0ZW5kc29wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlciA6Oj0gQ2xhc3NIZWFkZXJOYW1lIENsYXNzSGVhZGVyRXh0ZW5kc29wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlck5hbWUgOjo9IENsYXNzSGVhZGVyTmFtZTEgVHlwZVBhcmFtZXRlcnMiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTI2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJOYW1lIDo6PSBDbGFzc0hlYWRlck5hbWUxIFR5cGVQYXJhbWV0ZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVUeXBlSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEyNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyTmFtZTEgOjo9IE1vZGlmaWVyc29wdCBjbGFzcyBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDEyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyTmFtZTEgOjo9IE1vZGlmaWVyc29wdCBjbGFzcyBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0hlYWRlck5hbWUxKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTI4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJFeHRlbmRzIDo6PSBleHRlbmRzIENsYXNzVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxMjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgQ2xhc3NUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlckltcGxlbWVudHMgOjo9IGltcGxlbWVudHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTMwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJJbXBsZW1lbnRzIDo6PSBpbXBsZW1lbnRzIEludGVyZmFjZVR5cGVMaXN0Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxMzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VUeXBlTGlzdCA6Oj0gSW50ZXJmYWNlVHlwZUxpc3QgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTMyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0IENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcmZhY2VUeXBlTGlzdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEzMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDEzMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcmZhY2VUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTM1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTM2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDEzOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbiA6Oj0gRGlldCBOZXN0ZWRNZXRob2QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTQwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRGlldCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTQxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRGlldCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZURpZXQoKTsgIAogCQkJYnJlYWs7CiAKLSAgICBjYXNlIDE0MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluaXRpYWxpemVyIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNDIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbml0aWFsaXplciA6Oj0gRGlldCBOZXN0ZWRNZXRob2QgQ3JlYXRlSW5pdGlhbGl6ZXIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTQ4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE0MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZUluaXRpYWxpemVyIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lQ3JlYXRlSW5pdGlhbGl6ZXIoKTsgIAorCQkJYnJlYWs7CisKKyAgICBjYXNlIDE1MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAKLSAgICBjYXNlIDE1MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE1MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVGaWVsZERlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTUzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVEZWNsYXJhdG9ycyA6Oj0gVmFyaWFibGVEZWNsYXJhdG9ycyBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJWYXJpYWJsZURlY2xhcmF0b3JzIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JzIENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVWYXJpYWJsZURlY2xhcmF0b3JzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTU2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJWYXJpYWJsZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTU4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJWYXJpYWJsZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudGVyVmFyaWFibGUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxNTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24gOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE1OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE1OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTYwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTU5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9yY2VOb0RpZXQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE2MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcmNlTm9EaWV0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRm9yY2VOb0RpZXQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxNjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZXN0b3JlRGlldCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdG9yZURpZXQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVSZXN0b3JlRGlldCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE2NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZERlY2xhcmF0aW9uIDo6PSBNZXRob2RIZWFkZXIgTWV0aG9kQm9keSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNjcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgLy8gc2V0IHRvIHRydWUgdG8gY29uc3VtZSBhIG1ldGhvZCB3aXRoIGEgYm9keQotICBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24odHJ1ZSk7ICAgCisgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE2NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTY4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICAvLyBzZXQgdG8gZmFsc2UgdG8gY29uc3VtZSBhIG1ldGhvZCB3aXRob3V0IGJvZHkKLSAgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGZhbHNlKTsgIAorIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTY3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIEZvcm1hbFBhcmFtZXRlckxpc3RvcHQiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTY5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIEZvcm1hbFBhcmFtZXRlckxpc3RvcHQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE2OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlUGFyYW1ldGVycyBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE3MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlUGFyYW1ldGVycyBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKGZhbHNlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxNjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBJZGVudGlmaWVyIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBJZGVudGlmaWVyIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZShmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTcwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyUmlnaHRQYXJlbiA6Oj0gUlBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE3MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclJpZ2h0UGFyZW4gOjo9IFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyUmlnaHRQYXJlbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE3MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyA6Oj0gRGltc29wdCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNzMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgOjo9IERpbXNvcHQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE3MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gdGhyb3dzIENsYXNzVHlwZUxpc3QiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTc0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlIDo6PSB0aHJvd3MgQ2xhc3NUeXBlTGlzdCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTczIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JIZWFkZXIgOjo9IENvbnN0cnVjdG9ySGVhZGVyTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlciA6Oj0gQ29uc3RydWN0b3JIZWFkZXJOYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE3NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGVQYXJhbWV0ZXJzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE3NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGVQYXJhbWV0ZXJzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxNzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBJZGVudGlmaWVyIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBJZGVudGlmaWVyIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTc3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdCA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdCBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxNzkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0IDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0IENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTc4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxODAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVyc29wdCBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoZmFsc2UpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE3OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgRUxMSVBTSVMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTgxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBFTExJUFNJUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRm9ybWFsUGFyYW1ldGVyKHRydWUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE4MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgQ09NTUEgQ2xhc3NUeXBlRWx0Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE4MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgQ2F0Y2hUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVDYXRjaEZvcm1hbFBhcmFtZXRlcigpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDE4MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoVHlwZSA6Oj0gVW5pb25UeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVDYXRjaFR5cGUoKTsgIAorCQkJYnJlYWs7CisgCisgICAgY2FzZSAxODQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmlvblR5cGUgOjo9IFR5cGUiKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZVVuaW9uVHlwZUFzQ2xhc3NUeXBlKCk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMTg1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVW5pb25UeXBlIDo6PSBVbmlvblR5cGUgT1IgVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lVW5pb25UeXBlKCk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMTg3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NUeXBlTGlzdCA6Oj0gQ2xhc3NUeXBlTGlzdCBDT01NQSBDbGFzc1R5cGVFbHQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzVHlwZUxpc3QoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxODIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVFbHQgOjo9IENsYXNzVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxODggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVFbHQgOjo9IENsYXNzVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2xhc3NUeXBlRWx0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTgzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kQm9keSA6Oj0gTmVzdGVkTWV0aG9kIExCUkFDRSBCbG9ja1N0YXRlbWVudHNvcHQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTg5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kQm9keSA6Oj0gTmVzdGVkTWV0aG9kIExCUkFDRSBCbG9ja1N0YXRlbWVudHNvcHQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEJvZHkoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxODQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJOZXN0ZWRNZXRob2QgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lc3RlZE1ldGhvZCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU5lc3RlZE1ldGhvZCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRpY0luaXRpYWxpemVyIDo6PSBTdGF0aWNPbmx5IEJsb2NrIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRpY0luaXRpYWxpemVyIDo6PSBTdGF0aWNPbmx5IEJsb2NrIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOyAgCiAJCQlicmVhazsKIAotICAgIGNhc2UgMTg2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljT25seSA6Oj0gc3RhdGljIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRpY09ubHkgOjo9IHN0YXRpYyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGljT25seSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE4NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIE1ldGhvZEJvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTkzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgTWV0aG9kQm9keSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxODggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTk0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxODkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gdGhpcyBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMTk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IHRoaXMgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLCBUSElTX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE5MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBPbmx5VHlwZUFyZ3VtZW50cyB0aGlzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBPbmx5VHlwZUFyZ3VtZW50cyB0aGlzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbldpdGhUeXBlQXJndW1lbnRzKDAsVEhJU19DQUxMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxOTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gc3VwZXIgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBzdXBlciBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDAsU1VQRVJfQ0FMTCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTkyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE9ubHlUeXBlQXJndW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDE5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBPbmx5VHlwZUFyZ3VtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25XaXRoVHlwZUFyZ3VtZW50cygwLFNVUEVSX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE5MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCBzdXBlci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAxOTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1Qgc3VwZXIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIFNVUEVSX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE5NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uV2l0aFR5cGVBcmd1bWVudHMoMSwgU1VQRVJfQ0FMTCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMTk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHN1cGVyIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1Qgc3VwZXIgTFBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBTVVBFUl9DQUxMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxOTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9ULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbldpdGhUeXBlQXJndW1lbnRzKDIsIFNVUEVSX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE5NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCB0aGlzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDIwMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCB0aGlzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigxLCBUSElTX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDE5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uV2l0aFR5cGVBcmd1bWVudHMoMSwgVEhJU19DQUxMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAxOTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1QgdGhpcyBMUEFSRU4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjA1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHRoaXMgTFBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBUSElTX0NBTEwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lIERPVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uV2l0aFR5cGVBcmd1bWVudHMoMiwgVEhJU19DQUxMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyMDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VEZWNsYXJhdGlvbiA6Oj0gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjA3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlRGVjbGFyYXRpb24gOjo9IEludGVyZmFjZUhlYWRlciBJbnRlcmZhY2VCb2R5Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlciA6Oj0gSW50ZXJmYWNlSGVhZGVyTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VIZWFkZXIgOjo9IEludGVyZmFjZUhlYWRlck5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUludGVyZmFjZUhlYWRlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUgOjo9IEludGVyZmFjZUhlYWRlck5hbWUxLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDIwOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUgOjo9IEludGVyZmFjZUhlYWRlck5hbWUxLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVUeXBlSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUxIDo6PSBNb2RpZmllcnNvcHQgaW50ZXJmYWNlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDIxMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUxIDo6PSBNb2RpZmllcnNvcHQgaW50ZXJmYWNlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lMSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjEyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBJbnRlcmZhY2VUeXBlTGlzdCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIwOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjE1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjEwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIxMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBNZXRob2RIZWFkZXIgTWV0aG9kQm9keSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUludmFsaWRNZXRob2REZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIxMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24odHJ1ZSk7ICAgCisgICAgY2FzZSAyMTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRydWUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIxNCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oZmFsc2UpOyAgIAorICAgIGNhc2UgMjIwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjIyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaExlZnRCcmFjZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjMxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaExlZnRCcmFjZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVB1c2hMZWZ0QnJhY2UoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyMjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgUHVzaExlZnRCcmFjZSAsb3B0IFJCUkFDRSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgUHVzaExlZnRCcmFjZSAsb3B0IFJCUkFDRSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlBcnJheUluaXRpYWxpemVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjI0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFB1c2hMZWZ0QnJhY2UuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjMzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFB1c2hMZWZ0QnJhY2UuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyMjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgUHVzaExlZnRCcmFjZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMzQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgUHVzaExlZnRCcmFjZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXJyYXlJbml0aWFsaXplcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIyNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhcmlhYmxlSW5pdGlhbGl6ZXJzIDo6PSBWYXJpYWJsZUluaXRpYWxpemVycyBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMzYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcnMgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVZhcmlhYmxlSW5pdGlhbGl6ZXJzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjI4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2sgOjo9IE9wZW5CbG9jayBMQlJBQ0UgQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyMzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCbG9jayA6Oj0gT3BlbkJsb2NrIExCUkFDRSBCbG9ja1N0YXRlbWVudHNvcHQgUkJSQUNFIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCbG9jaygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIyOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5CbG9jayA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjM4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbkJsb2NrIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lT3BlbkJsb2NrKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDIzMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50cyA6Oj0gQmxvY2tTdGF0ZW1lbnRzIEJsb2NrU3RhdGVtZW50Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI0MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50cyA6Oj0gQmxvY2tTdGF0ZW1lbnRzIEJsb2NrU3RhdGVtZW50Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjM1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEludGVyZmFjZURlY2xhcmF0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI0NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50IDo6PSBJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW52YWxpZEludGVyZmFjZURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjM2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjQ1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUludmFsaWRBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjM3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEVudW1EZWNsYXJhdGlvbiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyNDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudCA6Oj0gRW51bURlY2xhcmF0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnZhbGlkRW51bURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjM4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyNDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyMzkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IFR5cGUgUHVzaE1vZGlmaWVycy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyNDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IFR5cGUgUHVzaE1vZGlmaWVycy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjQwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgVHlwZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyNDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVycyBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyNDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQdXNoTW9kaWZpZXJzIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAyNTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQdXNoTW9kaWZpZXJzIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUHVzaE1vZGlmaWVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI0MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hNb2RpZmllcnNGb3JIZWFkZXIgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI1MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hNb2RpZmllcnNGb3JIZWFkZXIgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVQdXNoTW9kaWZpZXJzRm9ySGVhZGVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjQzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaFJlYWxNb2RpZmllcnMgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI1MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hSZWFsTW9kaWZpZXJzIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUHVzaFJlYWxNb2RpZmllcnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyNjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbXB0eVN0YXRlbWVudCA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI3OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVtcHR5U3RhdGVtZW50IDo6PSBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVtcHR5U3RhdGVtZW50KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjcwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudCA6Oj0gTGFiZWwgQ09MT04gU3RhdGVtZW50Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI4MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsZWRTdGF0ZW1lbnQgOjo9IExhYmVsIENPTE9OIFN0YXRlbWVudCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjcxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gTGFiZWwgQ09MT04uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjgxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gTGFiZWwgQ09MT04uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudExhYmVsKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI3MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsIDo6PSBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI4MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsIDo6PSBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVMYWJlbCgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgMjczIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvblN0YXRlbWVudCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbiBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDI4MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb25TdGF0ZW1lbnQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb24gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeHByZXNzaW9uU3RhdGVtZW50KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjgyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuU3RhdGVtZW50IDo6PSBpZiBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMjkyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuU3RhdGVtZW50IDo6PSBpZiBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjgzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuRWxzZVN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI5MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnQgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI4NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI5NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjg1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoU3RhdGVtZW50IDo6PSBzd2l0Y2ggTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI5NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaFN0YXRlbWVudCA6Oj0gc3dpdGNoIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50U3dpdGNoKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI4NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgUkJSQUNFIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI5NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgUkJSQUNFIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eVN3aXRjaEJsb2NrKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI4OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDI5OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTd2l0Y2hCbG9jaygpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyOTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnRzKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDI5MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50IDo6PSBTd2l0Y2hMYWJlbHMgQmxvY2tTdGF0ZW1lbnRzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50IDo6PSBTd2l0Y2hMYWJlbHMgQmxvY2tTdGF0ZW1lbnRzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudCgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyOTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3dpdGNoTGFiZWxzKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICAgY2FzZSAyOTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbCA6Oj0gY2FzZSBDb25zdGFudEV4cHJlc3Npb24gQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDMwNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBjYXNlIENvbnN0YW50RXhwcmVzc2lvbiBDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2FzZUxhYmVsKCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDI5NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBkZWZhdWx0IENPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSAzMDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbCA6Oj0gZGVmYXVsdCBDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRGVmYXVsdExhYmVsKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMjk3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnQgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaGlsZVN0YXRlbWVudCA6Oj0gd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyOTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzA4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAyOTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJEb1N0YXRlbWVudCA6Oj0gZG8gU3RhdGVtZW50IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMwOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkRvU3RhdGVtZW50IDo6PSBkbyBTdGF0ZW1lbnQgd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudERvKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMwMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclN0YXRlbWVudCA6Oj0gZm9yIExQQVJFTiBGb3JJbml0b3B0IFNFTUlDT0xPTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnQgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdCBTRU1JQ09MT04uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudEZvcigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50Rm9yKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMxMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVGb3JJbml0KCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMwNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlbWVudEV4cHJlc3Npb25MaXN0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudEV4cHJlc3Npb25MaXN0KCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMwNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMxNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzA4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzZXJ0U3RhdGVtZW50IDo6PSBhc3NlcnQgRXhwcmVzc2lvbiBDT0xPTiBFeHByZXNzaW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMxOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gQ09MT04gRXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzZXJ0U3RhdGVtZW50KCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMwOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzE5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50QnJlYWsoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzEwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIElkZW50aWZpZXIgU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMyMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50QnJlYWtXaXRoTGFiZWwoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzExIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGludWVTdGF0ZW1lbnQgOjo9IGNvbnRpbnVlIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMjEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZSgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgSWRlbnRpZmllciBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzIyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGludWVTdGF0ZW1lbnQgOjo9IGNvbnRpbnVlIElkZW50aWZpZXIgU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZVdpdGhMYWJlbCgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50UmV0dXJuKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMxNCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93U3RhdGVtZW50IDo6PSB0aHJvdyBFeHByZXNzaW9uIFNFTUlDT0xPTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMjQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUaHJvd1N0YXRlbWVudCA6Oj0gdGhyb3cgRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVN0YXRlbWVudFRocm93KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzE1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU3luY2hyb25pemVkU3RhdGVtZW50IDo6PSBPbmx5U3luY2hyb25pemVkIExQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzMjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJPbmx5U3luY2hyb25pemVkIDo6PSBzeW5jaHJvbml6ZWQiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzI2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiT25seVN5bmNocm9uaXplZCA6Oj0gc3luY2hyb25pemVkIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVPbmx5U3luY2hyb25pemVkKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzE3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgVHJ5QmxvY2sgQ2F0Y2hlcyIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlKTsgIAorICAgIGNhc2UgMzI3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgVHJ5QmxvY2sgQ2F0Y2hlcyIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlLCBmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzE4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgVHJ5QmxvY2sgQ2F0Y2hlc29wdCBGaW5hbGx5Iik7IH0gIC8vJE5PTi1OTFMtMSQKLQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSk7ICAKKyAgICBjYXNlIDMyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IFRyeUJsb2NrIENhdGNoZXNvcHQgRmluYWxseSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KHRydWUsIGZhbHNlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeGl0VHJ5QmxvY2sgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDMyOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudFdpdGhSZXNvdXJjZXMgOjo9IHRyeSBSZXNvdXJjZVNwZWNpZmljYXRpb24iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZVN0YXRlbWVudFRyeShmYWxzZSwgdHJ1ZSk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzMwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50V2l0aFJlc291cmNlcyA6Oj0gdHJ5IFJlc291cmNlU3BlY2lmaWNhdGlvbiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KHRydWUsIHRydWUpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDMzMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlU3BlY2lmaWNhdGlvbiA6Oj0gTFBBUkVOIFJlc291cmNlcyA7b3B0IFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lUmVzb3VyY2VTcGVjaWZpY2F0aW9uKCk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzMyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiO29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZVJlc291cmNlT3B0aW9uYWxUcmFpbGluZ1NlbWlDb2xvbihmYWxzZSk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzMzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiO29wdCA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVSZXNvdXJjZU9wdGlvbmFsVHJhaWxpbmdTZW1pQ29sb24odHJ1ZSk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzM0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2VzIDo6PSBSZXNvdXJjZSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lU2luZ2xlUmVzb3VyY2UoKTsgIAorCQkJYnJlYWs7CisgCisgICAgY2FzZSAzMzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZXMgOjo9IFJlc291cmNlcyBUcmFpbGluZ1NlbWlDb2xvbiBSZXNvdXJjZSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lTXVsdGlwbGVSZXNvdXJjZXMoKTsgIAorCQkJYnJlYWs7CisgCisgICAgY2FzZSAzMzYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUcmFpbGluZ1NlbWlDb2xvbiA6Oj0gU0VNSUNPTE9OIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVSZXNvdXJjZU9wdGlvbmFsVHJhaWxpbmdTZW1pQ29sb24odHJ1ZSk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzM3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JJZC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lUmVzb3VyY2VBc0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDMzOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoUmVhbE1vZGlmaWVycy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lUmVzb3VyY2VBc0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDM0MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRUcnlCbG9jayA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUV4aXRUcnlCbG9jaygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMyMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoZXMgOjo9IENhdGNoZXMgQ2F0Y2hDbGF1c2UiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzQyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlcyA6Oj0gQ2F0Y2hlcyBDYXRjaENsYXVzZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2F0Y2hlcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMyMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoQ2xhdXNlIDo6PSBjYXRjaCBMUEFSRU4gRm9ybWFsUGFyYW1ldGVyIFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNDMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaENsYXVzZSA6Oj0gY2F0Y2ggTFBBUkVOIENhdGNoRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGVtZW50Q2F0Y2goKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzI1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaExQQVJFTiA6Oj0gTFBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM0NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hMUEFSRU4gOjo9IExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTGVmdFBhcmVuKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzI2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaFJQQVJFTiA6Oj0gUlBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM0NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hSUEFSRU4gOjo9IFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUmlnaHRQYXJlbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMzMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSB0aGlzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM1MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSB0aGlzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVRoaXMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uX05vdE5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzUyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbl9Ob3ROYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMzMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQdXNoTFBBUkVOIE5hbWUgUHVzaFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHVzaExQQVJFTiBOYW1lIFB1c2hSUEFSRU4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5V2l0aE5hbWUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzMzYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1QgdGhpcyIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1QgdGhpcyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lVGhpcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDMzNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBzdXBlciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1Qgc3VwZXIiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVN1cGVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzM4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIGNsYXNzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM1OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCBjbGFzcyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzM5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRGltcyBET1QgY2xhc3MiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzU5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRGltcyBET1QgY2xhc3MiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzQwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgRGltcyBET1QgY2xhc3MiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzYwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgRGltcyBET1QgY2xhc3MiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5UHJpbWl0aXZlQXJyYXlUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzQxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgRE9UIGNsYXNzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM2MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQcmltaXRpdmVUeXBlIERPVCBjbGFzcyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzQ0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb2NhdGlvbkhlYWRlciA6Oj0gbmV3IENsYXNzVHlwZSBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzY0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb2NhdGlvbkhlYWRlciA6Oj0gbmV3IENsYXNzVHlwZSBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFsbG9jYXRpb25IZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNDUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzY1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNjYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM0NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IFByaW1hcnkgRE9UIG5ldy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNjcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5IERPVCBuZXcuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWRXaXRoVHlwZUFyZ3VtZW50cygpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5IERPVCBuZXcuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzY4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSBET1QgbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM0OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM2OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM1MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM3MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkV2l0aFR5cGVBcmd1bWVudHMoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzUxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgOjo9IE5hbWUgRE9UIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM3MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIDo6PSBOYW1lIERPVCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzUyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5b3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzNzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbnF1YWxpZmllZENsYXNzQm9keW9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNsYXNzQm9keW9wdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM1NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCi0JCSAgICBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKTsgIAorICAgIGNhc2UgMzc0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVW5xdWFsaWZpZWRFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KGZhbHNlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCBDT01NQSBFeHByZXNzaW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM3NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlF1YWxpZmllZENsYXNzQm9keW9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUNsYXNzQm9keW9wdCgpOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDM3NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlF1YWxpZmllZEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkodHJ1ZSk7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgMzc5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJndW1lbnRMaXN0IDo6PSBBcmd1bWVudExpc3QgQ09NTUEgRXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzU3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbkhlYWRlciA6Oj0gbmV3IFByaW1pdGl2ZVR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzgwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbkhlYWRlciA6Oj0gbmV3IFByaW1pdGl2ZVR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFycmF5Q3JlYXRpb25IZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uSGVhZGVyIDo6PSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzgxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbkhlYWRlciA6Oj0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uSGVhZGVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzU5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbldpdGhvdXRBcnJheUluaXRpYWxpemVyIDo6PSBuZXcuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzgyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbldpdGhvdXRBcnJheUluaXRpYWxpemVyIDo6PSBuZXcuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aG91dEluaXRpYWxpemVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzYwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSBuZXcgUHJpbWl0aXZlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzODMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgOjo9IG5ldyBQcmltaXRpdmVUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM2MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25XaXRob3V0QXJyYXlJbml0aWFsaXplciA6Oj0gbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM4NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25XaXRob3V0QXJyYXlJbml0aWFsaXplciA6Oj0gbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM2MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplciA6Oj0gbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplciA6Oj0gbmV3Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM2NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM4NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgMzY2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9IExCUkFDS0VUIFJCUkFDS0VUIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSAzODkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJEaW1XaXRoT3JXaXRoT3V0RXhwciA6Oj0gTEJSQUNLRVQgUkJSQUNLRVQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZURpbVdpdGhPcldpdGhPdXRFeHByKCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDM2NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXMgOjo9IERpbXNMb29wIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSAzOTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJEaW1zIDo6PSBEaW1zTG9vcCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRGltcygpOyAgCiAJCQlicmVhazsKICAKLSAgICAgY2FzZSAzNzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJPbmVEaW1Mb29wIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgMzkzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiT25lRGltTG9vcCA6Oj0gTEJSQUNLRVQgUkJSQUNLRVQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU9uZURpbUxvb3AoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzOTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRmllbGRBY2Nlc3MoZmFsc2UpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM3MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkQWNjZXNzIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzOTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gc3VwZXIgRE9UIElkZW50aWZpZXIiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUZpZWxkQWNjZXNzKHRydWUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM3MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzk2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gTmFtZSBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNzQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lIERPVCBPbmx5VHlwZUFyZ3VtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSAzOTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lIERPVCBPbmx5VHlwZUFyZ3VtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWVXaXRoVHlwZUFyZ3VtZW50cygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM3NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgRE9UIE9ubHlUeXBlQXJndW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDM5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgRE9UIE9ubHlUeXBlQXJndW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeVdpdGhUeXBlQXJndW1lbnRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzc2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgMzk5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzc3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gc3VwZXIgRE9UIE9ubHlUeXBlQXJndW1lbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQwMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IHN1cGVyIERPVCBPbmx5VHlwZUFyZ3VtZW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyV2l0aFR5cGVBcmd1bWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNzggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDAxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gc3VwZXIgRE9UIElkZW50aWZpZXIgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzNzkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gTmFtZSBMQlJBQ0tFVCBFeHByZXNzaW9uIFJCUkFDS0VUIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBOYW1lIExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFycmF5QWNjZXNzKHRydWUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM4MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBQcmltYXJ5Tm9OZXdBcnJheSBMQlJBQ0tFVCBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQwMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBQcmltYXJ5Tm9OZXdBcnJheSBMQlJBQ0tFVCBFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzgxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlBY2Nlc3MgOjo9IEFycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzgzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGZpeEV4cHJlc3Npb24gOjo9IE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDA2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGZpeEV4cHJlc3Npb24gOjo9IE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVBvc3RmaXhFeHByZXNzaW9uKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzg2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdEluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uIFBMVVNfUExVUyIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gUExVU19QTFVTIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuUExVUyx0cnVlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzODcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQb3N0RGVjcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDEwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdERlY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTUlOVVMsdHJ1ZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzg4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaFBvc2l0aW9uIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUG9zaXRpb24gOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVQdXNoUG9zaXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzOTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb24gOjo9IFBMVVMgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb24gOjo9IFBMVVMgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlBMVVMpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDM5MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbiA6Oj0gTUlOVVMgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb24gOjo9IE1JTlVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5NSU5VUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzk0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJlSW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUExVU19QTFVTIFB1c2hQb3NpdGlvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJQcmVJbmNyZW1lbnRFeHByZXNzaW9uIDo6PSBQTFVTX1BMVVMgUHVzaFBvc2l0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuUExVUyxmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgMzk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUHJlRGVjcmVtZW50RXhwcmVzc2lvbiA6Oj0gTUlOVVNfTUlOVVMgUHVzaFBvc2l0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQxOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZURlY3JlbWVudEV4cHJlc3Npb24gOjo9IE1JTlVTX01JTlVTIFB1c2hQb3NpdGlvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk1JTlVTLGZhbHNlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzOTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9IFRXSURETEUgUHVzaFBvc2l0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQyMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gVFdJRERMRSBQdXNoUG9zaXRpb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5UV0lERExFKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSAzOTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9IE5PVCBQdXNoUG9zaXRpb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDIxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSBOT1QgUHVzaFBvc2l0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTk9UKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBQcmltaXRpdmVUeXBlIERpbXNvcHQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDIzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhQcmltaXRpdmVUeXBlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDAxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MjQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhHZW5lcmljc0FycmF5KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljc0FycmF5KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDAzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBQdXNoUlBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQyNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgUHVzaFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lIERpbXMgUHVzaFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MjcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lIERpbXMgUHVzaFJQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoTmFtZUFycmF5KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDA1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiT25seVR5cGVBcmd1bWVudHNGb3JDYXN0RXhwcmVzc2lvbiA6Oj0gT25seVR5cGVBcmd1bWVudHMiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDI4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiT25seVR5cGVBcmd1bWVudHNGb3JDYXN0RXhwcmVzc2lvbiA6Oj0gT25seVR5cGVBcmd1bWVudHMiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU9ubHlUeXBlQXJndW1lbnRzRm9yQ2FzdEV4cHJlc3Npb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGVDYXN0RXhwcmVzc2lvbiA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDI5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW5zaWRlQ2FzdEV4cHJlc3Npb24gOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQwNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc2lkZUNhc3RFeHByZXNzaW9uTEwxIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uTEwxKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDA4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW5zaWRlQ2FzdEV4cHJlc3Npb25XaXRoUXVhbGlmaWVkR2VuZXJpY3MgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQzMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc2lkZUNhc3RFeHByZXNzaW9uV2l0aFF1YWxpZmllZEdlbmVyaWNzIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb25XaXRoUXVhbGlmaWVkR2VuZXJpY3MoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MzMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5NVUxUSVBMWSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDExIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDM0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuRElWSURFKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5SRU1BSU5ERVIpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQxNCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGl0aXZlRXhwcmVzc2lvbiA6Oj0gQWRkaXRpdmVFeHByZXNzaW9uIFBMVVMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDM3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gUExVUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5QTFVTKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0MzggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5NSU5VUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDE3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gTEVGVF9TSElGVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBMRUZUX1NISUZULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkxFRlRfU0hJRlQpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQxOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFJJR0hUX1NISUZULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ0MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFJJR0hUX1NISUZULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlJJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBVTlNJR05FRF9SSUdIVF9TSElGVCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NDIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBVTlNJR05FRF9SSUdIVF9TSElGVCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5VTlNJR05FRF9SSUdIVF9TSElGVCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDIxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIExFU1MuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDQ0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIExFU1MuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTEVTUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDIyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDQ1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuR1JFQVRFUik7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDIzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIExFU1NfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDQ2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIExFU1NfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTEVTU19FUVVBTCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDI0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ0NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5HUkVBVEVSX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MjYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZW9mRXhwcmVzc2lvbiA6Oj0gSW5zdGFuY2VvZkV4cHJlc3Npb24gaW5zdGFuY2VvZiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZW9mRXhwcmVzc2lvbiA6Oj0gSW5zdGFuY2VvZkV4cHJlc3Npb24gaW5zdGFuY2VvZiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MjggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiBFUVVBTF9FUVVBTC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiBFUVVBTF9FUVVBTC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkVRVUFMX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiBOT1RfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDUyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gTk9UX0VRVUFMLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTk9UX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uIDo6PSBBbmRFeHByZXNzaW9uIEFORCBFcXVhbGl0eUV4cHJlc3Npb24iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDU0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5kRXhwcmVzc2lvbiA6Oj0gQW5kRXhwcmVzc2lvbiBBTkQgRXF1YWxpdHlFeHByZXNzaW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkFORCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDMzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhjbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBFeGNsdXNpdmVPckV4cHJlc3Npb24gWE9SLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ1NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gRXhjbHVzaXZlT3JFeHByZXNzaW9uIFhPUi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5YT1IpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQzNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uIE9SLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ1OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uIE9SLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk9SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5BTkRfQU5EKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0MzkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbE9yRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk9SX09SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ2NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihPcGVyYXRvcklkcy5RVUVTVElPTkNPTE9OKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDQ0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gQXNzaWdubWVudE9wZXJhdG9yLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ2NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnQgOjo9IFBvc3RmaXhFeHByZXNzaW9uIEFzc2lnbm1lbnRPcGVyYXRvci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzaWdubWVudCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ0NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnQgOjo9IEludmFsaWRBcnJheUluaXRpYWxpemVyQXNzaWduZW1lbnQiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDY5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpOyAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDQ3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBFUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IEVRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRVFVQUwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ0OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gTVVMVElQTFlfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDcxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBNVUxUSVBMWV9FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE1VTFRJUExZKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IERJVklERV9FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IERJVklERV9FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKERJVklERSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDUwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDczIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ1MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gUExVU19FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA0NzQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFBMVVNfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihQTFVTKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1JTlVTX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ3NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gTUlOVVNfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNSU5VUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDUzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBMRUZUX1NISUZUX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ3NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gTEVGVF9TSElGVF9FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKExFRlRfU0hJRlQpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ1NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gUklHSFRfU0hJRlRfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDc3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSSUdIVF9TSElGVF9FUVVBTCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ3OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihVTlNJR05FRF9SSUdIVF9TSElGVCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDU2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBBTkRfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDc5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBBTkRfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ1NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gWE9SX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ4MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gWE9SX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoWE9SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE9SX0VRVUFMIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ4MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gT1JfRVFVQUwiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihPUik7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvbm9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDg1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvbm9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVtcHR5RXhwcmVzc2lvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ2NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDkwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NjggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNDkxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDY5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNDkyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRGVmYXVsdE1vZGlmaWVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ3MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyc29wdCA6Oj0gTW9kaWZpZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ5MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyc29wdCA6Oj0gTW9kaWZpZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNb2RpZmllcnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA0NzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudHNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDQ5NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50c29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVtcHR5QmxvY2tTdGF0ZW1lbnRzb3B0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDQ3MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSA0OTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJEaW1zb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlEaW1zb3B0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDQ3NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdG9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDQ5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdG9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVtcHR5QXJndW1lbnRMaXN0b3B0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNDc5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3RvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDgzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNTA2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDg0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSA1MDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDQ4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lc3RlZFR5cGUgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDUwOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lc3RlZFR5cGUgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVOZXN0ZWRUeXBlKCk7ICAKIAkJCWJyZWFrOwogCi0gICAgIGNhc2UgNDg2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9ySW5pdG9wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDUwOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXRvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eUZvckluaXRvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDg4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9yVXBkYXRlb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNTExIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRm9yVXBkYXRlb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDkyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlc29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDUxNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoZXNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eUNhdGNoZXNvcHQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDk0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bURlY2xhcmF0aW9uIDo6PSBFbnVtSGVhZGVyIEVudW1Cb2R5Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSA1MTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtRGVjbGFyYXRpb24gOjo9IEVudW1IZWFkZXIgRW51bUJvZHkiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudW1EZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICAgY2FzZSA0OTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtSGVhZGVyIDo6PSBFbnVtSGVhZGVyTmFtZSBDbGFzc0hlYWRlckltcGxlbWVudHNvcHQiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDUxOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1IZWFkZXIgOjo9IEVudW1IZWFkZXJOYW1lIENsYXNzSGVhZGVySW1wbGVtZW50c29wdCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUhlYWRlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICAgY2FzZSA0OTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IGVudW0gSWRlbnRpZmllciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNTE5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBlbnVtIElkZW50aWZpZXIiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudW1IZWFkZXJOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDQ5NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Cb2R5IDo6PSBMQlJBQ0UgRW51bUJvZHlEZWNsYXJhdGlvbnNvcHQgUkJSQUNFIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICAgY2FzZSA1MjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IGVudW0gSWRlbnRpZmllci4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsgIAorCQkJYnJlYWs7CisgCisgICAgIGNhc2UgNTIxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUJvZHkgOjo9IExCUkFDRSBFbnVtQm9keURlY2xhcmF0aW9uc29wdCBSQlJBQ0UiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudW1Cb2R5Tm9Db25zdGFudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgIGNhc2UgNDk4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUJvZHkgOjo9IExCUkFDRSBDT01NQSBFbnVtQm9keURlY2xhcmF0aW9uc29wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNTIyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUJvZHkgOjo9IExCUkFDRSBDT01NQSBFbnVtQm9keURlY2xhcmF0aW9uc29wdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUJvZHlOb0NvbnN0YW50cygpOyAgCiAJCQlicmVhazsKICAKLSAgICAgY2FzZSA0OTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQm9keSA6Oj0gTEJSQUNFIEVudW1Db25zdGFudHMgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgICBjYXNlIDUyMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Cb2R5IDo6PSBMQlJBQ0UgRW51bUNvbnN0YW50cyBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUJvZHlXaXRoQ29uc3RhbnRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgICBjYXNlIDUwMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Cb2R5IDo6PSBMQlJBQ0UgRW51bUNvbnN0YW50cy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgIGNhc2UgNTI0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUJvZHkgOjo9IExCUkFDRSBFbnVtQ29uc3RhbnRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbnVtQm9keVdpdGhDb25zdGFudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MDIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQ29uc3RhbnRzIDo6PSBFbnVtQ29uc3RhbnRzIENPTU1BIEVudW1Db25zdGFudCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1MjYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQ29uc3RhbnRzIDo6PSBFbnVtQ29uc3RhbnRzIENPTU1BIEVudW1Db25zdGFudCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUNvbnN0YW50cygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUwMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Db25zdGFudEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDUyNyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Db25zdGFudEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbnVtQ29uc3RhbnRIZWFkZXJOYW1lKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTA0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUNvbnN0YW50SGVhZGVyIDo6PSBFbnVtQ29uc3RhbnRIZWFkZXJOYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDUyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1Db25zdGFudEhlYWRlciA6Oj0gRW51bUNvbnN0YW50SGVhZGVyTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUNvbnN0YW50SGVhZGVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTA1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUNvbnN0YW50IDo6PSBFbnVtQ29uc3RhbnRIZWFkZXIgRm9yY2VOb0RpZXQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTI5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUNvbnN0YW50IDo6PSBFbnVtQ29uc3RhbnRIZWFkZXIgRm9yY2VOb0RpZXQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudW1Db25zdGFudFdpdGhDbGFzc0JvZHkoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQ29uc3RhbnQgOjo9IEVudW1Db25zdGFudEhlYWRlciIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1MzAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQ29uc3RhbnQgOjo9IEVudW1Db25zdGFudEhlYWRlciIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW51bUNvbnN0YW50Tm9DbGFzc0JvZHkoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudHMgOjo9IExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDUzMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50cyA6Oj0gTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUFyZ3VtZW50cygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUwOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50c29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTMyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQXJndW1lbnRzb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlBcmd1bWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtRGVjbGFyYXRpb25zIDo6PSBTRU1JQ09MT04gQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDUzNCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudW1EZWNsYXJhdGlvbnMgOjo9IFNFTUlDT0xPTiBDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudW1EZWNsYXJhdGlvbnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnVtQm9keURlY2xhcmF0aW9uc29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTM1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW51bUJvZHlEZWNsYXJhdGlvbnNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eUVudW1EZWNsYXJhdGlvbnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbmhhbmNlZEZvclN0YXRlbWVudCA6Oj0gRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTM3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW5oYW5jZWRGb3JTdGF0ZW1lbnQgOjo9IEVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVyLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUxNCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVuaGFuY2VkRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1MzggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbmhhbmNlZEZvclN0YXRlbWVudE5vU2hvcnRJZiA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTE1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXJJbml0IDo6PSBmb3IgTFBBUkVOIFR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTM5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXJJbml0IDo6PSBmb3IgTFBBUkVOIFR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVySW5pdChmYWxzZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTE2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXJJbml0IDo6PSBmb3IgTFBBUkVOIE1vZGlmaWVycyIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlckluaXQgOjo9IGZvciBMUEFSRU4gTW9kaWZpZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlckluaXQodHJ1ZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTE3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU0MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVTdGF0aWNJbXBvcnREZWNsYXJhdGlvbiA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTQyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUxOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVN0YXRpY0ltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gaW1wb3J0IHN0YXRpYyBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU0MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVN0YXRpY0ltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gaW1wb3J0IHN0YXRpYyBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTaW5nbGVTdGF0aWNJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb24oKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gaW1wb3J0IHN0YXRpYy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NDUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gaW1wb3J0IHN0YXRpYy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lU3RhdGljSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnRzIDo6PSBMRVNTIFR5cGVBcmd1bWVudExpc3QxIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU0NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVBcmd1bWVudHMgOjo9IExFU1MgVHlwZUFyZ3VtZW50TGlzdDEiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVBcmd1bWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJPbmx5VHlwZUFyZ3VtZW50cyA6Oj0gTEVTUyBUeXBlQXJndW1lbnRMaXN0MSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJPbmx5VHlwZUFyZ3VtZW50cyA6Oj0gTEVTUyBUeXBlQXJndW1lbnRMaXN0MSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lT25seVR5cGVBcmd1bWVudHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnRMaXN0MSA6Oj0gVHlwZUFyZ3VtZW50TGlzdCBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnRMaXN0MSA6Oj0gVHlwZUFyZ3VtZW50TGlzdCBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZUFyZ3VtZW50TGlzdDEoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MjcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnRMaXN0IDo6PSBUeXBlQXJndW1lbnRMaXN0IENPTU1BIFR5cGVBcmd1bWVudCIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnRMaXN0IDo6PSBUeXBlQXJndW1lbnRMaXN0IENPTU1BIFR5cGVBcmd1bWVudCIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZUFyZ3VtZW50TGlzdCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVBcmd1bWVudCA6Oj0gUmVmZXJlbmNlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlQXJndW1lbnQgOjo9IFJlZmVyZW5jZVR5cGUiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVBcmd1bWVudCgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDUzMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUxIDo6PSBSZWZlcmVuY2VUeXBlIEdSRUFURVIiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTU2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZTEgOjo9IFJlZmVyZW5jZVR5cGUgR1JFQVRFUiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lUmVmZXJlbmNlVHlwZTEoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1MzMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWZlcmVuY2VUeXBlMSA6Oj0gQ2xhc3NPckludGVyZmFjZSBMRVNTLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU1NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUxIDo6PSBDbGFzc09ySW50ZXJmYWNlIExFU1MuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVBcmd1bWVudFJlZmVyZW5jZVR5cGUxKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTM1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZUFyZ3VtZW50TGlzdDIgOjo9IFR5cGVBcmd1bWVudExpc3QgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTU5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZUFyZ3VtZW50TGlzdDIgOjo9IFR5cGVBcmd1bWVudExpc3QgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVBcmd1bWVudExpc3QyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTM4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZTIgOjo9IFJlZmVyZW5jZVR5cGUgUklHSFRfU0hJRlQiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZTIgOjo9IFJlZmVyZW5jZVR5cGUgUklHSFRfU0hJRlQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVJlZmVyZW5jZVR5cGUyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTM5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZTIgOjo9IENsYXNzT3JJbnRlcmZhY2UgTEVTUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWZlcmVuY2VUeXBlMiA6Oj0gQ2xhc3NPckludGVyZmFjZSBMRVNTLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVUeXBlQXJndW1lbnRSZWZlcmVuY2VUeXBlMigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU0MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVBcmd1bWVudExpc3QzIDo6PSBUeXBlQXJndW1lbnRMaXN0IENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU2NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVBcmd1bWVudExpc3QzIDo6PSBUeXBlQXJndW1lbnRMaXN0IENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVUeXBlQXJndW1lbnRMaXN0MygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU0NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUzIDo6PSBSZWZlcmVuY2VUeXBlIFVOU0lHTkVEX1JJR0hUX1NISUZUIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU2OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUzIDo6PSBSZWZlcmVuY2VUeXBlIFVOU0lHTkVEX1JJR0hUX1NISUZUIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVSZWZlcmVuY2VUeXBlMygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU0NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkIDo6PSBRVUVTVElPTiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZCA6Oj0gUVVFU1RJT04iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVdpbGRjYXJkKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTQ2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmQgOjo9IFFVRVNUSU9OIFdpbGRjYXJkQm91bmRzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkIDo6PSBRVUVTVElPTiBXaWxkY2FyZEJvdW5kcyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRXaXRoQm91bmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTQ3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMgOjo9IGV4dGVuZHMgUmVmZXJlbmNlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZEJvdW5kcyA6Oj0gZXh0ZW5kcyBSZWZlcmVuY2VUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVXaWxkY2FyZEJvdW5kc0V4dGVuZHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZEJvdW5kcyA6Oj0gc3VwZXIgUmVmZXJlbmNlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZEJvdW5kcyA6Oj0gc3VwZXIgUmVmZXJlbmNlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHNTdXBlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU0OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMSA6Oj0gUVVFU1RJT04gR1JFQVRFUiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1NzMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZDEgOjo9IFFVRVNUSU9OIEdSRUFURVIiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVdpbGRjYXJkMSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU1MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMSA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMxIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMSA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMxIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVXaWxkY2FyZDFXaXRoQm91bmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTUxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMxIDo6PSBleHRlbmRzIFJlZmVyZW5jZVR5cGUxIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMSA6Oj0gZXh0ZW5kcyBSZWZlcmVuY2VUeXBlMSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMxRXh0ZW5kcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU1MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMSA6Oj0gc3VwZXIgUmVmZXJlbmNlVHlwZTEiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTc2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMxIDo6PSBzdXBlciBSZWZlcmVuY2VUeXBlMSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMxU3VwZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZDIgOjo9IFFVRVNUSU9OIFJJR0hUX1NISUZUIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMiA6Oj0gUVVFU1RJT04gUklHSFRfU0hJRlQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVdpbGRjYXJkMigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU1NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMiA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMiA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMyIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVXaWxkY2FyZDJXaXRoQm91bmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTU1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMyIDo6PSBleHRlbmRzIFJlZmVyZW5jZVR5cGUyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU3OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMiA6Oj0gZXh0ZW5kcyBSZWZlcmVuY2VUeXBlMiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMyRXh0ZW5kcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU1NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMiA6Oj0gc3VwZXIgUmVmZXJlbmNlVHlwZTIiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTgwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMyIDo6PSBzdXBlciBSZWZlcmVuY2VUeXBlMiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMyU3VwZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJXaWxkY2FyZDMgOjo9IFFVRVNUSU9OIFVOU0lHTkVEX1JJR0hUX1NISUZUIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU4MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMyA6Oj0gUVVFU1RJT04gVU5TSUdORURfUklHSFRfU0hJRlQiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVdpbGRjYXJkMygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU1OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMyA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU4MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkMyA6Oj0gUVVFU1RJT04gV2lsZGNhcmRCb3VuZHMzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVXaWxkY2FyZDNXaXRoQm91bmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTU5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMzIDo6PSBleHRlbmRzIFJlZmVyZW5jZVR5cGUzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU4MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMyA6Oj0gZXh0ZW5kcyBSZWZlcmVuY2VUeXBlMyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMzRXh0ZW5kcygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU2MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIldpbGRjYXJkQm91bmRzMyA6Oj0gc3VwZXIgUmVmZXJlbmNlVHlwZTMiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTg0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiV2lsZGNhcmRCb3VuZHMzIDo6PSBzdXBlciBSZWZlcmVuY2VUeXBlMyIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lV2lsZGNhcmRCb3VuZHMzU3VwZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NjEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVySGVhZGVyIDo6PSBJZGVudGlmaWVyIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXJIZWFkZXIgOjo9IElkZW50aWZpZXIiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVQYXJhbWV0ZXJIZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NjIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVycyA6Oj0gTEVTUyBUeXBlUGFyYW1ldGVyTGlzdDEiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTg2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZVBhcmFtZXRlcnMgOjo9IExFU1MgVHlwZVBhcmFtZXRlckxpc3QxIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVUeXBlUGFyYW1ldGVycygpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU2NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXJMaXN0IDo6PSBUeXBlUGFyYW1ldGVyTGlzdCBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1ODggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVyTGlzdCA6Oj0gVHlwZVBhcmFtZXRlckxpc3QgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVQYXJhbWV0ZXJMaXN0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTY2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZVBhcmFtZXRlciA6Oj0gVHlwZVBhcmFtZXRlckhlYWRlciBleHRlbmRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU5MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXIgOjo9IFR5cGVQYXJhbWV0ZXJIZWFkZXIgZXh0ZW5kcy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZVBhcmFtZXRlcldpdGhFeHRlbmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTY3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZVBhcmFtZXRlciA6Oj0gVHlwZVBhcmFtZXRlckhlYWRlciBleHRlbmRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU5MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXIgOjo9IFR5cGVQYXJhbWV0ZXJIZWFkZXIgZXh0ZW5kcy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZVBhcmFtZXRlcldpdGhFeHRlbmRzQW5kQm91bmRzKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTY5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpb25hbEJvdW5kTGlzdCA6Oj0gQWRkaXRpb25hbEJvdW5kTGlzdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1OTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGlvbmFsQm91bmRMaXN0IDo6PSBBZGRpdGlvbmFsQm91bmRMaXN0Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBZGRpdGlvbmFsQm91bmRMaXN0KCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTcwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpb25hbEJvdW5kIDo6PSBBTkQgUmVmZXJlbmNlVHlwZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA1OTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGlvbmFsQm91bmQgOjo9IEFORCBSZWZlcmVuY2VUeXBlIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBZGRpdGlvbmFsQm91bmQoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NzIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVyTGlzdDEgOjo9IFR5cGVQYXJhbWV0ZXJMaXN0IENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU5NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXJMaXN0MSA6Oj0gVHlwZVBhcmFtZXRlckxpc3QgQ09NTUEuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVQYXJhbWV0ZXJMaXN0MSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU3MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXIxIDo6PSBUeXBlUGFyYW1ldGVySGVhZGVyIEdSRUFURVIiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNTk3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZVBhcmFtZXRlcjEgOjo9IFR5cGVQYXJhbWV0ZXJIZWFkZXIgR1JFQVRFUiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVHlwZVBhcmFtZXRlcjEoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NzQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVyMSA6Oj0gVHlwZVBhcmFtZXRlckhlYWRlciBleHRlbmRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXIxIDo6PSBUeXBlUGFyYW1ldGVySGVhZGVyIGV4dGVuZHMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVQYXJhbWV0ZXIxV2l0aEV4dGVuZHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlUGFyYW1ldGVyMSA6Oj0gVHlwZVBhcmFtZXRlckhlYWRlciBleHRlbmRzLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDU5OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVQYXJhbWV0ZXIxIDo6PSBUeXBlUGFyYW1ldGVySGVhZGVyIGV4dGVuZHMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVR5cGVQYXJhbWV0ZXIxV2l0aEV4dGVuZHNBbmRCb3VuZHMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGlvbmFsQm91bmRMaXN0MSA6Oj0gQWRkaXRpb25hbEJvdW5kTGlzdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGlvbmFsQm91bmRMaXN0MSA6Oj0gQWRkaXRpb25hbEJvdW5kTGlzdC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQWRkaXRpb25hbEJvdW5kTGlzdDEoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1NzggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGlvbmFsQm91bmQxIDo6PSBBTkQgUmVmZXJlbmNlVHlwZTEiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpb25hbEJvdW5kMSA6Oj0gQU5EIFJlZmVyZW5jZVR5cGUxIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBZGRpdGlvbmFsQm91bmQxKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTg0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uX05vdE5hbWUgOjo9IFBMVVMgUHVzaFBvc2l0aW9uLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYwOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBQTFVTIFB1c2hQb3NpdGlvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlBMVVMpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBNSU5VUyBQdXNoUG9zaXRpb24uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjA5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uX05vdE5hbWUgOjo9IE1JTlVTIFB1c2hQb3NpdGlvbi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk1JTlVTKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1ODggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNfTm90TmFtZSA6Oj0gVFdJRERMRS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNfTm90TmFtZSA6Oj0gVFdJRERMRS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlRXSURETEUpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU4OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51c19Ob3ROYW1lIDo6PSBOT1QgUHVzaFBvc2l0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYxMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51c19Ob3ROYW1lIDo6PSBOT1QgUHVzaFBvc2l0aW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTk9UKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1OTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjE2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk1VTFRJUExZKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1OTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBNVUxUSVBMWS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBNVUxUSVBMWS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLk1VTFRJUExZKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA1OTQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjE4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkRJVklERSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgRElWSURFLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYxOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIERJVklERS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkRJVklERSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNTk2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYyMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5SRU1BSU5ERVIpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU5NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIFJFTUFJTkRFUi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MjEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBSRU1BSU5ERVIuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5SRU1BSU5ERVIpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDU5OSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGl0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MjMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuUExVUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjAwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgUExVUy4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MjQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBQTFVTLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uV2l0aE5hbWUoT3BlcmF0b3JJZHMuUExVUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjAxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYyNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGl0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5NSU5VUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjAyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgTUlOVVMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjI2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgTUlOVVMuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5NSU5VUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjA0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgOjo9IFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5MRUZUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MDUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBMRUZUX1NISUZULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYyOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIExFRlRfU0hJRlQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5MRUZUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MDYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjMwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgOjo9IFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlJJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBSSUdIVF9TSElGVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBSSUdIVF9TSElGVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLlJJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MDggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjMyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgOjo9IFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MDkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBVTlNJR05FRF9SSUdIVF9TSElGVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MzMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBVTlNJR05FRF9SSUdIVF9TSElGVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2MzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5MRVNTKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIExFU1MuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjM2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBMRVNTLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uV2l0aE5hbWUoT3BlcmF0b3JJZHMuTEVTUyk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjEzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjM3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuR1JFQVRFUik7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjE0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBHUkVBVEVSLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYzOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgR1JFQVRFUi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkdSRUFURVIpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYxNSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDYzOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkxFU1NfRVFVQUwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYxNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgTEVTU19FUVVBTC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NDAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIExFU1NfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5MRVNTX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5HUkVBVEVSX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MTggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIEdSRUFURVJfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjQyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBHUkVBVEVSX0VRVUFMLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uV2l0aE5hbWUoT3BlcmF0b3JJZHMuR1JFQVRFUl9FUVVBTCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjIwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2VvZkV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBpbnN0YW5jZW9mLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY0NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlb2ZFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgaW5zdGFuY2VvZi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb25XaXRoTmFtZSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYyMSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlb2ZFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY0NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlb2ZFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYyMyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkVxdWFsaXR5RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NDcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5FUVVBTF9FUVVBTCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjI0IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgRVFVQUxfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjQ4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgRVFVQUxfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkVRVUFMX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MjUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjQ5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTk9UX0VRVUFMKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MjYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBOT1RfRVFVQUwuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjUwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgTk9UX0VRVUFMLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5OT1RfRVFVQUwpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYyOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFuZEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gQW5kRXhwcmVzc2lvbl9Ob3ROYW1lIEFORC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uX05vdE5hbWUgOjo9IEFuZEV4cHJlc3Npb25fTm90TmFtZSBBTkQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuQU5EKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MjkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgQU5EIEVxdWFsaXR5RXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgQU5EIEVxdWFsaXR5RXhwcmVzc2lvbiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkFORCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjMxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhjbHVzaXZlT3JFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY1NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5YT1IpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYzMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIFhPUiBBbmRFeHByZXNzaW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY1NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIFhPUiBBbmRFeHByZXNzaW9uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uV2l0aE5hbWUoT3BlcmF0b3JJZHMuWE9SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MzQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbmNsdXNpdmVPckV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjU4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiSW5jbHVzaXZlT3JFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk9SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MzUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbmNsdXNpdmVPckV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBPUi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJJbmNsdXNpdmVPckV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBPUi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLk9SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2MzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEFuZEV4cHJlc3Npb25fTm90TmFtZSA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjYxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkFORF9BTkQpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDYzOCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIEFORF9BTkQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjYyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgQU5EX0FORC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkFORF9BTkQpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY0MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY2NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLk9SX09SKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbE9yRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBOYW1lIE9SX09SLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY2NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgT1JfT1IuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb25XaXRoTmFtZShPcGVyYXRvcklkcy5PUl9PUik7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjQzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY2NyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ29uZGl0aW9uYWxFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlFVRVNUSU9OQ09MT04pIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBRVUVTVElPTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NjggOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSBRVUVTVElPTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQ29uZGl0aW9uYWxFeHByZXNzaW9uV2l0aE5hbWUoT3BlcmF0b3JJZHMuUVVFU1RJT05DT0xPTikgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY0OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lIDo6PSBNb2RpZmllcnMgQVQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjcyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUgOjo9IE1vZGlmaWVycyBBVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjQ5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUgOjo9IEFULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY3MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lIDo6PSBNb2RpZmllcnMgQVQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorCQkgICAgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgOyAgCisJCQlicmVhazsKKyAKKyAgICBjYXNlIDY3NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lIDo6PSBBVC4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisJCSAgICBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKSA7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgNjc1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUgOjo9IEFULi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyTmFtZSgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTAgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NzYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlcigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2NzcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjc5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eUFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY1NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY4MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTYgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjgyIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbnMgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9ucygpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY4MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25NZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnModHJ1ZSk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjU4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvbk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY4NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25NZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZSh0cnVlKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NTkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uTWV0aG9kSGVhZGVyRGVmYXVsdFZhbHVlb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA2ODUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBbm5vdGF0aW9uTWV0aG9kSGVhZGVyRGVmYXVsdFZhbHVlb3B0IDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlNZXRob2RIZWFkZXJEZWZhdWx0VmFsdWUoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjYwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvbk1ldGhvZEhlYWRlckRlZmF1bHRWYWx1ZW9wdCA6Oj0gRGVmYXVsdFZhbHVlIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY4NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25NZXRob2RIZWFkZXJEZWZhdWx0VmFsdWVvcHQgOjo9IERlZmF1bHRWYWx1ZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyRGVmYXVsdFZhbHVlKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjYxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvbk1ldGhvZEhlYWRlciA6Oj0gQW5ub3RhdGlvbk1ldGhvZEhlYWRlck5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjg3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQW5ub3RhdGlvbk1ldGhvZEhlYWRlciA6Oj0gQW5ub3RhdGlvbk1ldGhvZEhlYWRlck5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlcigpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY2MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY4OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY3MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25OYW1lIDo6PSBBVCBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY5NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFubm90YXRpb25OYW1lIDo6PSBBVCBOYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVBbm5vdGF0aW9uTmFtZSgpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2NzEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJOb3JtYWxBbm5vdGF0aW9uIDo6PSBBbm5vdGF0aW9uTmFtZSBMUEFSRU4uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNjk3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTm9ybWFsQW5ub3RhdGlvbiA6Oj0gQW5ub3RhdGlvbk5hbWUgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVOb3JtYWxBbm5vdGF0aW9uKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY3MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlUGFpcnNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDY5OCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlUGFpcnNvcHQgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eU1lbWJlclZhbHVlUGFpcnNvcHQoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjc1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWVQYWlycyA6Oj0gTWVtYmVyVmFsdWVQYWlycyBDT01NQS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MDEgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZW1iZXJWYWx1ZVBhaXJzIDo6PSBNZW1iZXJWYWx1ZVBhaXJzIENPTU1BLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZW1iZXJWYWx1ZVBhaXJzKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY3NiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlUGFpciA6Oj0gU2ltcGxlTmFtZSBFUVVBTCBFbnRlck1lbWJlclZhbHVlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDcwMiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlUGFpciA6Oj0gU2ltcGxlTmFtZSBFUVVBTCBFbnRlck1lbWJlclZhbHVlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZW1iZXJWYWx1ZVBhaXIoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjc3IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJNZW1iZXJWYWx1ZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzAzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJNZW1iZXJWYWx1ZSA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZUVudGVyTWVtYmVyVmFsdWUoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjc4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdE1lbWJlclZhbHVlIDo6PSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MDQgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFeGl0TWVtYmVyVmFsdWUgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFeGl0TWVtYmVyVmFsdWUoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjgwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWUgOjo9IE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzA2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWUgOjo9IE5hbWUiKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZU1lbWJlclZhbHVlQXNOYW1lKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY4MyA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzA5IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY4NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzEwIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY4NSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0uLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzExIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lRW1wdHlNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSA7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjg2IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyIDo6PS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MTIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgOjo9Li4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbXB0eU1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2ODcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJFbnRlck1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzEzIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgOjo9Iik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVFbnRlck1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpIDsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2ODkgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZW1iZXJWYWx1ZXMgOjo9IE1lbWJlclZhbHVlcyBDT01NQSBNZW1iZXJWYWx1ZSIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MTUgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZW1iZXJWYWx1ZXMgOjo9IE1lbWJlclZhbHVlcyBDT01NQSBNZW1iZXJWYWx1ZSIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWVtYmVyVmFsdWVzKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY5MCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1hcmtlckFubm90YXRpb24gOjo9IEFubm90YXRpb25OYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDcxNiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIk1hcmtlckFubm90YXRpb24gOjo9IEFubm90YXRpb25OYW1lIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY5MSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZU1lbWJlckFubm90YXRpb24gOjo9IEFubm90YXRpb25OYW1lIExQQVJFTi4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MTcgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uTWVtYmVyVmFsdWUgOjo9IE1lbWJlclZhbHVlIik7IH0gIC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbnN1bWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uTWVtYmVyVmFsdWUoKSA7ICAKKwkJCWJyZWFrOworIAorICAgIGNhc2UgNzE4IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiA6Oj0gQW5ub3RhdGlvbk5hbWUgTFBBUkVOLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY5MiA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGVQYXJhbWV0ZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDcxOSA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGVQYXJhbWV0ZXJzIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVSZWNvdmVyeU1ldGhvZEhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsgIAogCQkJYnJlYWs7CiAgCi0gICAgY2FzZSA2OTMgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvdmVyeU1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKKyAgICBjYXNlIDcyMCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAogCQkgICAgY29uc3VtZVJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZSgpOyAgCiAJCQlicmVhazsKICAKLSAgICBjYXNlIDY5NCA6IGlmIChERUJVRykgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY292ZXJ5TWV0aG9kSGVhZGVyIDo6PSBSZWNvdmVyeU1ldGhvZEhlYWRlck5hbWUuLi4iKTsgfSAgLy8kTk9OLU5MUy0xJAorICAgIGNhc2UgNzIxIDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3ZlcnlNZXRob2RIZWFkZXIgOjo9IFJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCiAJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICAKIAkJCWJyZWFrOwogIAotICAgIGNhc2UgNjk1IDogaWYgKERFQlVHKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3ZlcnlNZXRob2RIZWFkZXIgOjo9IFJlY292ZXJ5TWV0aG9kSGVhZGVyTmFtZS4uLiIpOyB9ICAvLyROT04tTkxTLTEkCisgICAgY2FzZSA3MjIgOiBpZiAoREVCVUcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvdmVyeU1ldGhvZEhlYWRlciA6Oj0gUmVjb3ZlcnlNZXRob2RIZWFkZXJOYW1lLi4uIik7IH0gIC8vJE5PTi1OTFMtMSQKIAkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXIoKTsgIAogCQkJYnJlYWs7CiAgCiAJfQotfSAKK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSB7CiAJLy8gQXNzZXJ0U3RhdGVtZW50IDo6PSAnYXNzZXJ0JyBFeHByZXNzaW9uICc7JwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwotCXB1c2hPbkFzdFN0YWNrKG5ldyBBc3NlcnRTdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSk7CQorCXB1c2hPbkFzdFN0YWNrKG5ldyBBc3NlcnRTdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKIAkvLyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIDo6PSAnQCcgTmFtZSAnKCcgTWVtYmVyVmFsdWUgJyknCiAJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gbnVsbDsKLQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSB0aGlzLmdldEFubm90YXRpb25UeXBlKCk7CisKKwlpbnQgb2xkSW5kZXggPSB0aGlzLmlkZW50aWZpZXJQdHI7CisKKwlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBnZXRBbm5vdGF0aW9uVHlwZSgpOwogCXNpbmdsZU1lbWJlckFubm90YXRpb24gPSBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih0eXBlUmVmZXJlbmNlLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKIAlzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLm1lbWJlclZhbHVlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dOwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOwogCXNpbmdsZU1lbWJlckFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnJQYXJlblBvczsKIAlwdXNoT25FeHByZXNzaW9uU3RhY2soc2luZ2xlTWVtYmVyQW5ub3RhdGlvbik7Ci0JCi0JCisKKwogCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewogCQlhbm5vdGF0aW9uUmVjb3ZlcnlDaGVja1BvaW50KHNpbmdsZU1lbWJlckFubm90YXRpb24uc291cmNlU3RhcnQsIHNpbmdsZU1lbWJlckFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCisJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQW5ub3RhdGlvbikgeworCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9ICgoUmVjb3ZlcmVkQW5ub3RhdGlvbil0aGlzLmN1cnJlbnRFbGVtZW50KS5hZGRBbm5vdGF0aW9uKHNpbmdsZU1lbWJlckFubm90YXRpb24sIG9sZEluZGV4KTsKKwkJfQogCX0KLQkKKwogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgorCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewotCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mQW5ub3RhdGlvbihzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uKHNpbmdsZU1lbWJlckFubm90YXRpb24pOwogCX0KIAl0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzID0gdHJ1ZTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uTWVtYmVyVmFsdWUoKSB7CisJLy8gdGhpcyBydWxlIGlzIHVzZWQgZm9yIHN5bnRheCByZWNvdmVyeSBvbmx5CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkQW5ub3RhdGlvbikgeworCQlSZWNvdmVyZWRBbm5vdGF0aW9uIHJlY292ZXJlZEFubm90YXRpb24gPSAoUmVjb3ZlcmVkQW5ub3RhdGlvbikgdGhpcy5jdXJyZW50RWxlbWVudDsKKworCQlyZWNvdmVyZWRBbm5vdGF0aW9uLnNldEtpbmQoUmVjb3ZlcmVkQW5ub3RhdGlvbi5TSU5HTEVfTUVNQkVSKTsKKwl9CisKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW5nbGVSZXNvdXJjZSgpIHsKKwkvLyBSZXNvdXJjZXMgOjo9IFJlc291cmNlCit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnICdzdGF0aWMnIE5hbWUKLQkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lCiAJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLwogCiAJSW1wb3J0UmVmZXJlbmNlIGltcHQ7CkBAIC02NjM4LDcgKzcxMTUsNyBAQAogCiAJdGhpcy5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdDsKIAl0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gLTE7IC8vIDwtLSBzZWUgY29tbWVudCBpbnRvIG1vZGlmaWVyc0ZsYWcoaW50KQotCQorCiAJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CiAJCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAl9IGVsc2UgewpAQCAtNjY1MiwyMCArNzEyOSwyMCBAQAogCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewogCQlpbXB0Lm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OyAvLyBjb252ZXJ0IHRoZSBzdGF0aWMgaW1wb3J0IHJlZmVyZW5jZSB0byBhIG5vbi1zdGF0aWMgaW1wb3J0ZSByZWZlcmVuY2UKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlN0YXRpY0ltcG9ydHMoaW1wdCk7CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mU3RhdGljSW1wb3J0cyhpbXB0KTsKIAl9Ci0JCisKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwogCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpIHsKIAkvLyBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCUltcG9ydFJlZmVyZW5jZSBpbXB0OwpAQCAtNjY5MSw3ICs3MTY4LDcgQEAKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKIAkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKGltcHQsIDApOwogCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKLQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCQkKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudEJyZWFrKCkgewpAQCAtNjY5OSw3ICs3MTc2LDcgQEAKIAkvLyBicmVhayBwdXNocyBhIHBvc2l0aW9uIG9uIHRoaXMuaW50U3RhY2sgaW4gY2FzZSB0aGVyZSBpcyBubyBsYWJlbAogCiAJcHVzaE9uQXN0U3RhY2sobmV3IEJyZWFrU3RhdGVtZW50KG51bGwsIHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sIHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pKTsKLQkKKwogCWlmICh0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlICE9IG51bGwpIHsKIAkJLy8gVXNlZCBvbmx5IGluIHN0YXRlbWVudHMgcmVjb3ZlcnkuCiAJCS8vIFRoaXMgaXMgbm90IGEgcmVhbCBicmVhayBzdGF0ZW1lbnQgYnV0IGEgcGxhY2Vob2xkZXIgZm9yIGFuIGV4aXN0aW5nIGxvY2FsIHR5cGUuCkBAIC02NzIxLDcgKzcxOTgsNyBAQAogCQluZXcgQnJlYWtTdGF0ZW1lbnQoCiAJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0sCiAJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLAotCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbikpOyAKKwkJCXRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pKTsKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpIHsKQEAgLTY3NTIsOSArNzIyOSw5IEBACiAKIAlwdXNoT25Bc3RTdGFjaygKIAkJbmV3IENvbnRpbnVlU3RhdGVtZW50KAotCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dLCAKLQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sIAotCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbikpOyAKKwkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSwKKwkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sCisJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKSk7CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50RG8oKSB7CkBAIC02NzY1LDEyICs3MjQyLDEyIEBACiAKIAlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07Ci0JdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPSAKKwl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9CiAJCW5ldyBEb1N0YXRlbWVudCgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwgCi0JCQlzdGF0ZW1lbnQsIAotCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwgCi0JCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV0sCisJCQlzdGF0ZW1lbnQsCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLAorCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QoKSB7CiAJLy8gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0ICcsJyBTdGF0ZW1lbnRFeHByZXNzaW9uCkBAIC02Nzk1LDExICs3MjcyLDExIEBACiAJfSBlbHNlIHsKIAkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsIAotCQkJdXBkYXRlcyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJdXBkYXRlcyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOwogCX0KIAogCWlmICh0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0gIT0gMCkKQEAgLTY4MTUsMzAgKzcyOTIsMzAgQEAKIAkJCWxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXTsKIAkJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCQlpbml0cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJdGhpcy5leHByZXNzaW9uUHRyICsgMSwKKwkJCQlpbml0cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCQkwLAorCQkJCWxlbmd0aCk7CiAJCX0gZWxzZSB7IC8vb24gdGhpcy5hc3RTdGFjawogCQkJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQl0aGlzLmFzdFN0YWNrLCAKLQkJCQl0aGlzLmFzdFB0ciArIDEsIAotCQkJCWluaXRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCXRoaXMuYXN0UHRyICsgMSwKKwkJCQlpbml0cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCQkwLAorCQkJCWxlbmd0aCk7CiAJCX0KIAl9CiAJcHVzaE9uQXN0U3RhY2soCiAJCW5ldyBGb3JTdGF0ZW1lbnQoCi0JCQlpbml0cywgCi0JCQljb25kLCAKLQkJCXVwZGF0ZXMsIAotCQkJc3RhdGVtZW50LCAKLQkJCXNjb3BlLCAKLQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sIAotCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbikpOyAKKwkJCWluaXRzLAorCQkJY29uZCwKKwkJCXVwZGF0ZXMsCisJCQlzdGF0ZW1lbnQsCisJCQlzY29wZSwKKwkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sCisJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKSB7CiAJLy8gSWZUaGVuU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50CkBAIC02ODQ2LDEyICs3MzIzLDEyIEBACiAJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAlTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwotCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0gCisJdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPQogCQluZXcgSWZTdGF0ZW1lbnQoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV0sIAotCQkJdGhlblN0YXRlbWVudCwgCi0JCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLCAKLQkJCXRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwKKwkJCXRoZW5TdGF0ZW1lbnQsCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLAorCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpIHsKIAkvLyBJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyBTdGF0ZW1lbnQKQEAgLTY4NjMsMTMgKzczNDAsMTMgQEAKIAl0aGlzLmFzdExlbmd0aFB0ci0tOwogCiAJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKLQl0aGlzLmFzdFN0YWNrWy0tdGhpcy5hc3RQdHJdID0gCisJdGhpcy5hc3RTdGFja1stLXRoaXMuYXN0UHRyXSA9CiAJCW5ldyBJZlN0YXRlbWVudCgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwgCi0JCQkoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgCi0JCQkoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyICsgMV0sIAotCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwgCi0JCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV0sCisJCQkoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwKKwkJCShTdGF0ZW1lbnQpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgKyAxXSwKKwkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sCisJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIHsKIAkvLyBMYWJlbGVkU3RhdGVtZW50IDo6PSAnSWRlbnRpZmllcicgJzonIFN0YXRlbWVudApAQCAtNjg3NywxMiArNzM1NCwxMiBAQAogCiAJLy9vcHRpbWl6ZSBwdXNoL3BvcAogCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKLQl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9IAorCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0KIAkJbmV3IExhYmVsZWRTdGF0ZW1lbnQoCi0JCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLCAKLQkJCXN0YXRlbWVudCwgCi0JCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSwgCi0JCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAorCQkJc3RhdGVtZW50LAorCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0sCisJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSB7CkBAIC02ODkyLDggKzczNjksOCBAQAogCWlmICh0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0gIT0gMCkgewogCQlwdXNoT25Bc3RTdGFjaygKIAkJCW5ldyBSZXR1cm5TdGF0ZW1lbnQoCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLCAKLQkJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLCAKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV0sCisJCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwKIAkJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKQogCQkpOwogCX0gZWxzZSB7CkBAIC02OTE0LDExICs3MzkxLDExIEBACiAJaWYgKChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCXRoaXMuYXN0UHRyIC09IGxlbmd0aDsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuYXN0U3RhY2ssIAotCQkJdGhpcy5hc3RQdHIgKyAxLCAKLQkJCXN3aXRjaFN0YXRlbWVudC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmFzdFN0YWNrLAorCQkJdGhpcy5hc3RQdHIgKyAxLAorCQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJc3dpdGNoU3RhdGVtZW50LmV4cGxpY2l0RGVjbGFyYXRpb25zID0gdGhpcy5yZWFsQmxvY2tTdGFja1t0aGlzLnJlYWxCbG9ja1B0ci0tXTsKIAlwdXNoT25Bc3RTdGFjayhzd2l0Y2hTdGF0ZW1lbnQpOwpAQCAtNjkzNiwyMCArNzQxMywyMCBAQAogCWlmICh0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyXSA9PSAwKSB7CiAJCXRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHJdID0gMTsKIAkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07Ci0JCXRoaXMuYXN0U3RhY2tbKyt0aGlzLmFzdFB0cl0gPSAKKwkJdGhpcy5hc3RTdGFja1srK3RoaXMuYXN0UHRyXSA9CiAJCQluZXcgU3luY2hyb25pemVkU3RhdGVtZW50KAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwgCi0JCQkJbnVsbCwgCi0JCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwgCi0JCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAorCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwKKwkJCQludWxsLAorCQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sCisJCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiAJfSBlbHNlIHsKIAkJdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS07Ci0JCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0gCisJCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0KIAkJCW5ldyBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLCAKLQkJCQkoQmxvY2spIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCAKLQkJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLCAKLQkJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLAorCQkJCShCbG9jaykgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sCisJCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwKKwkJCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIAl9CiAJcmVzZXRNb2RpZmllcnMoKTsKIH0KQEAgLTY5NTgsMTAgKzc0MzUsMTIgQEAKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAlwdXNoT25Bc3RTdGFjayhuZXcgVGhyb3dTdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyLS1dLCB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLCB0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKSk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50VHJ5KGJvb2xlYW4gd2l0aEZpbmFsbHkpIHsKLQkvL1RyeVN0YXRlbWVudCA6Oj0gJ3RyeScgIEJsb2NrIENhdGNoZXMKLQkvL1RyeVN0YXRlbWVudCA6Oj0gJ3RyeScgIEJsb2NrIENhdGNoZXNvcHQgRmluYWxseQotCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50VHJ5KGJvb2xlYW4gd2l0aEZpbmFsbHksIGJvb2xlYW4gaGFzUmVzb3VyY2VzKSB7CisJLy8gVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgQmxvY2sgQ2F0Y2hlcworCS8vIFRyeVN0YXRlbWVudCA6Oj0gJ3RyeScgIEJsb2NrIENhdGNoZXNvcHQgRmluYWxseQorCS8vIFRyeVN0YXRlbWVudFdpdGhSZXNvdXJjZXMgOjo9ICd0cnknIFJlc291cmNlU3BlY2lmaWNhdGlvbiBUcnlCbG9jayBDYXRjaGVzb3B0CisJLy8gVHJ5U3RhdGVtZW50V2l0aFJlc291cmNlcyA6Oj0gJ3RyeScgUmVzb3VyY2VTcGVjaWZpY2F0aW9uIFRyeUJsb2NrIENhdGNoZXNvcHQgRmluYWxseQorCQogCWludCBsZW5ndGg7CiAJVHJ5U3RhdGVtZW50IHRyeVN0bXQgPSBuZXcgVHJ5U3RhdGVtZW50KCk7CiAJLy9maW5hbGx5CkBAIC02OTg3LDYgKzc0NjYsMjEgQEAKIAl0aGlzLmFzdExlbmd0aFB0ci0tOwogCXRyeVN0bXQudHJ5QmxvY2sgPSAoQmxvY2spIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07CiAKKwlpZiAoaGFzUmVzb3VyY2VzKSB7CisJCS8vIGdldCB0aGUgcmVzb3VyY2VzCisJCWxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV07CisJCUxvY2FsRGVjbGFyYXRpb25bXSByZXNvdXJjZXMgPSBuZXcgTG9jYWxEZWNsYXJhdGlvbltsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLAorCQkJCXJlc291cmNlcywKKwkJCQkwLAorCQkJCWxlbmd0aCk7CisJCXRyeVN0bXQucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCQlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgeworCQkJcHJvYmxlbVJlcG9ydGVyKCkuYXV0b01hbmFnZWRSZXNvdXJjZXNOb3RCZWxvdzE3KHJlc291cmNlcyk7CisJCX0KKwl9CiAJLy9wb3NpdGlvbnMKIAl0cnlTdG10LnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CiAJdHJ5U3RtdC5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CkBAIC02OTk4LDE2ICs3NDkyLDE2IEBACiAKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07Ci0JdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gPSAKKwl0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9CiAJCW5ldyBXaGlsZVN0YXRlbWVudCgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXSwgCi0JCQlzdGF0ZW1lbnQsIAotCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSwgCi0JCQl0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV0sCisJCQlzdGF0ZW1lbnQsCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dLAorCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGljSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKSB7CiAJLy8gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyAnc3RhdGljJyBOYW1lICcuJyAnKicKLQkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lCiAJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLwogCiAJSW1wb3J0UmVmZXJlbmNlIGltcHQ7CkBAIC03MDE5LDkgKzc1MTMsMTEgQEAKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKIAlwdXNoT25Bc3RTdGFjayhpbXB0ID0gbmV3IEltcG9ydFJlZmVyZW5jZSh0b2tlbnMsIHBvc2l0aW9ucywgdHJ1ZSwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYykpOwogCisJLy8gc3RhciBlbmQgcG9zaXRpb24KKwlpbXB0LnRyYWlsaW5nU3RhclBvc2l0aW9uID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0aGlzLm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OwogCXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPSAtMTsgLy8gPC0tIHNlZSBjb21tZW50IGludG8gbW9kaWZpZXJzRmxhZyhpbnQpCi0JCisKIAlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKIAkJaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCX0gZWxzZSB7CkBAIC03MDMyLDE5ICs3NTI4LDE5IEBACiAJaW1wdC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgorCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewogCQlpbXB0Lm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OyAvLyBjb252ZXJ0IHRoZSBzdGF0aWMgaW1wb3J0IHJlZmVyZW5jZSB0byBhIG5vbi1zdGF0aWMgaW1wb3J0ZSByZWZlcmVuY2UKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlN0YXRpY0ltcG9ydHMoaW1wdCk7CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mU3RhdGljSW1wb3J0cyhpbXB0KTsKIAl9Ci0JCisKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwogCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQotCX0JCisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpIHsKIAkvLyBTdGF0aWNJbml0aWFsaXplciA6Oj0gIFN0YXRpY09ubHkgQmxvY2sKQEAgLTcwNTQsNyArNzU1MCw3IEBACiAJaWYgKHRoaXMuZGlldCkgYmxvY2suYml0cyAmPSB+QVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOyAvLyBjbGVhciBiaXQgc2V0IHNpbmNlIHdhcyBkaWV0CiAJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgSW5pdGlhbGl6ZXIoYmxvY2ssIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpOwogCXRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdID0gaW5pdGlhbGl6ZXI7Ci0JaW5pdGlhbGl6ZXIuc291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsJCisJaW5pdGlhbGl6ZXIuc291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIAlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uKTsKIAl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdIC0tOwogCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwpAQCAtNzA2Myw3ICs3NTU5LDcgQEAKIAkvLyBkb2MgY29tbWVudAogCWluaXRpYWxpemVyLmphdmFkb2MgPSB0aGlzLmphdmFkb2M7CiAJdGhpcy5qYXZhZG9jID0gbnVsbDsKLQkKKwogCS8vIHJlY292ZXJ5CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZDsKQEAgLTcxNDQsNyArNzY0MCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVpbnRlcmZhY2UgOgogCQkJLy8nY2xhc3MnIGlzIHB1c2hpbmcgdHdvIGludCAocG9zaXRpb25zKSBvbiB0aGUgc3RhY2sgPT0+ICdpbnRlcmZhY2UnIG5lZWRzIHRvIGRvIGl0IHRvby4uLi4KLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsJCQkKKwkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIAkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZWFic3RyYWN0IDoKQEAgLTcxODgsMTQgKzc2ODQsMTQgQEAKIAkJCXB1c2hPbkV4cHJlc3Npb25TdGFja0xlbmd0aFN0YWNrKDApOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lc3luY2hyb25pemVkIDoKLQkJCXRoaXMuc3luY2hyb25pemVkQmxvY2tTb3VyY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOwkKKwkJCXRoaXMuc3luY2hyb25pemVkQmxvY2tTb3VyY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N5bmNocm9uaXplZCk7CiAJCQlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKIAkJCWJyZWFrOwogCQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkJY2FzZSBUb2tlbk5hbWV2b2lkIDoKIAkJCXB1c2hJZGVudGlmaWVyKC1UX3ZvaWQpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIAkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKIAkJCWJyZWFrOwogCQkJLy9wdXNoIGEgZGVmYXVsdCBkaW1lbnNpb24gd2hpbGUgdm9pZCBpcyBub3QgcGFydCBvZiB0aGUgcHJpbWl0aXZlCkBAIC03MjAzLDEwOSArNzY5OSwxMTIgQEAKIAkJCS8vcmVndWxhciB0eXBlIHBhcnNpbmcgdGhhdCBnZW5lcmF0ZXMgYSBkaW1lbnNpb24gb24gdGhpcy5pbnRTdGFjawogCQljYXNlIFRva2VuTmFtZWJvb2xlYW4gOgogCQkJcHVzaElkZW50aWZpZXIoLVRfYm9vbGVhbik7Ci0JCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwkJCisJCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CisJCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVieXRlIDoKIAkJCXB1c2hJZGVudGlmaWVyKC1UX2J5dGUpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lY2hhciA6CiAJCQlwdXNoSWRlbnRpZmllcigtVF9jaGFyKTsKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsJCQkJCi0JCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CQkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKKwkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZWRvdWJsZSA6CiAJCQlwdXNoSWRlbnRpZmllcigtVF9kb3VibGUpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOgogCQkJcHVzaElkZW50aWZpZXIoLVRfZmxvYXQpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1laW50IDoKIAkJCXB1c2hJZGVudGlmaWVyKC1UX2ludCk7Ci0JCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwkJCQkJCisJCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CisJCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVsb25nIDoKIAkJCXB1c2hJZGVudGlmaWVyKC1UX2xvbmcpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lc2hvcnQgOgogCQkJcHVzaElkZW50aWZpZXIoLVRfc2hvcnQpOwotCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKLQkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJcHVzaE9uSW50U3RhY2sodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJYnJlYWs7CiAJCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCQljYXNlIFRva2VuTmFtZUludGVnZXJMaXRlcmFsIDoKIAkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKLQkJCQluZXcgSW50TGl0ZXJhbCgKLQkJCQkJdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpLCAKLQkJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIAotCQkJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOyAKKwkJCQlJbnRMaXRlcmFsLmJ1aWxkSW50TGl0ZXJhbCgKKwkJCQkJdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpLAorCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwKKwkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZUxvbmdMaXRlcmFsIDoKIAkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKLQkJCQluZXcgTG9uZ0xpdGVyYWwoCi0JCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwgCi0JCQkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAKLQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQkJTG9uZ0xpdGVyYWwuYnVpbGRMb25nTGl0ZXJhbCgKKwkJCQkJdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpLAorCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwKKwkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsIDoKIAkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKIAkJCQluZXcgRmxvYXRMaXRlcmFsKAotCQkJCQl0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCksIAotCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCi0JCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7IAorCQkJCQl0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCksCisJCQkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLAorCQkJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lRG91YmxlTGl0ZXJhbCA6CiAJCQlwdXNoT25FeHByZXNzaW9uU3RhY2soCiAJCQkJbmV3IERvdWJsZUxpdGVyYWwoCi0JCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwgCi0JCQkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAKLQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwKKwkJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sCisJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7CiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsIDoKIAkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKIAkJCQluZXcgQ2hhckxpdGVyYWwoCi0JCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwgCi0JCQkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAKLQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwKKwkJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sCisJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7CiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsIDoKIAkJCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbDsKLQkJCWlmICh0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzICYmIHRoaXMuY2hlY2tFeHRlcm5hbGl6ZVN0cmluZ3MgJiYgIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHsKLQkJCQlzdHJpbmdMaXRlcmFsID0gdGhpcy5jcmVhdGVTdHJpbmdMaXRlcmFsKAotCQkJCQl0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCksIAotCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCisJCQlpZiAodGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyAmJgorCQkJCQl0aGlzLmNoZWNrRXh0ZXJuYWxpemVTdHJpbmdzICYmCisJCQkJCXRoaXMubGFzdFBvc2lzdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gJiYKKwkJCQkJIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHsKKwkJCQlzdHJpbmdMaXRlcmFsID0gY3JlYXRlU3RyaW5nTGl0ZXJhbCgKKwkJCQkJdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZVN0cmluZygpLAorCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwKIAkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEsCiAJCQkJCVV0aWwuZ2V0TGluZU51bWJlcih0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikpOwotCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LnJlY29yZFN0cmluZ0xpdGVyYWwoc3RyaW5nTGl0ZXJhbCk7CisJCQkJdGhpcy5jb21waWxhdGlvblVuaXQucmVjb3JkU3RyaW5nTGl0ZXJhbChzdHJpbmdMaXRlcmFsLCB0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpOwogCQkJfSBlbHNlIHsKLQkJCQlzdHJpbmdMaXRlcmFsID0gdGhpcy5jcmVhdGVTdHJpbmdMaXRlcmFsKAotCQkJCQl0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCksIAotCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCisJCQkJc3RyaW5nTGl0ZXJhbCA9IGNyZWF0ZVN0cmluZ0xpdGVyYWwoCisJCQkJCXRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSwKKwkJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sCiAJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxLAogCQkJCQkwKTsKIAkJCX0KLQkJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhzdHJpbmdMaXRlcmFsKTsgCisJCQlwdXNoT25FeHByZXNzaW9uU3RhY2soc3RyaW5nTGl0ZXJhbCk7CiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVmYWxzZSA6CiAJCQlwdXNoT25FeHByZXNzaW9uU3RhY2soCi0JCQkJbmV3IEZhbHNlTGl0ZXJhbCh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQkJbmV3IEZhbHNlTGl0ZXJhbCh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZXRydWUgOgogCQkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKAotCQkJCW5ldyBUcnVlTGl0ZXJhbCh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQkJbmV3IFRydWVMaXRlcmFsKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lbnVsbCA6CiAJCQlwdXNoT25FeHByZXNzaW9uU3RhY2soCi0JCQkJbmV3IE51bGxMaXRlcmFsKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOyAKKwkJCQluZXcgTnVsbExpdGVyYWwodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7CiAJCQlicmVhazsKIAkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCQljYXNlIFRva2VuTmFtZXN1cGVyIDoKQEAgLTczNTMsNiArNzg1Miw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOgogCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJLy8kRkFMTC1USFJPVUdIJAogCQljYXNlIFRva2VuTmFtZVBMVVMgOgogCQljYXNlIFRva2VuTmFtZU1JTlVTIDoKIAkJY2FzZSBUb2tlbk5hbWVOT1QgOgpAQCAtNzM2Nyw3ICs3ODY3LDcgQEAKIAkJY2FzZSBUb2tlbk5hbWVSQlJBQ0U6CiAJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoKIAkJCXRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKLQkJCXRoaXMuZW5kUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7IAorCQkJdGhpcy5lbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKIAkJCS8vdGhlIGl0ZW0gaXMgbm90IHBhcnQgb2YgdGhlIHBvdGVudGlhbCBmdXR1ciBleHByZXNzaW9uL3N0YXRlbWVudAogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lUlBBUkVOIDoKQEAgLTczODksMTAgKzc4ODksMjEgQEAKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZUVMTElQU0lTIDoKIAkJCXB1c2hPbkludFN0YWNrKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKLQkJCWJyZWFrOwkJCQorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lRVFVQUwgIDoKKwkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEFubm90YXRpb24pIHsKKwkJCQlSZWNvdmVyZWRBbm5vdGF0aW9uIHJlY292ZXJlZEFubm90YXRpb24gPSAoUmVjb3ZlcmVkQW5ub3RhdGlvbikgdGhpcy5jdXJyZW50RWxlbWVudDsKKwkJCQlpZiAocmVjb3ZlcmVkQW5ub3RhdGlvbi5tZW1iZXJWYWx1UGFpckVxdWFsRW5kID09IC0xKSB7CisJCQkJCXJlY292ZXJlZEFubm90YXRpb24ubWVtYmVyVmFsdVBhaXJFcXVhbEVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZU1VTFRJUExZIDoKKwkJCS8vIHN0YXIgZW5kIHBvc2l0aW9uCisJCQlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CisJCQlicmVhazsKIAkJCS8vICBjYXNlIFRva2VuTmFtZUNPTU1BIDoKIAkJCS8vICBjYXNlIFRva2VuTmFtZUNPTE9OICA6Ci0JCQkvLyAgY2FzZSBUb2tlbk5hbWVFUVVBTCAgOgogCQkJLy8gIGNhc2UgVG9rZW5OYW1lTEJSQUNLRVQgIDoKIAkJCS8vICBjYXNlIFRva2VuTmFtZURPVCA6CiAJCQkvLyAgY2FzZSBUb2tlbk5hbWVFUlJPUiA6CkBAIC03NDM1LDcgKzc5NDYsNyBAQAogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlQXJndW1lbnQoKSB7Ci0JcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsJCisJcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlQXJndW1lbnRMaXN0KCkgewogCWNvbmNhdEdlbmVyaWNzTGlzdHMoKTsKQEAgLTc0NTEsMjMgKzc5NjIsMjMgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlQXJndW1lbnRSZWZlcmVuY2VUeXBlMSgpIHsKIAljb25jYXRHZW5lcmljc0xpc3RzKCk7Ci0JcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsJCi0JaW50UHRyLS07CisJcHVzaE9uR2VuZXJpY3NTdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsKKwl0aGlzLmludFB0ci0tOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudFJlZmVyZW5jZVR5cGUyKCkgewogCWNvbmNhdEdlbmVyaWNzTGlzdHMoKTsKLQlwdXNoT25HZW5lcmljc1N0YWNrKGdldFR5cGVSZWZlcmVuY2UoMCkpOwkKLQlpbnRQdHItLTsKKwlwdXNoT25HZW5lcmljc1N0YWNrKGdldFR5cGVSZWZlcmVuY2UoMCkpOworCXRoaXMuaW50UHRyLS07CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUFyZ3VtZW50cygpIHsKIAljb25jYXRHZW5lcmljc0xpc3RzKCk7Ci0JaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIAogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgorCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdOwotCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mVHlwZUFyZ3VtZW50cygKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZUeXBlQXJndW1lbnRzKAogCQkJKFR5cGVSZWZlcmVuY2UpdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHIgLSBsZW5ndGggKyAxXSwKIAkJCShUeXBlUmVmZXJlbmNlKXRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXSk7CiAJfQpAQCAtNzQ3Niw5ICs3OTg3LDM2IEBACiAJLy8gVHlwZURlY2xhcmF0aW9ucyA6Oj0gVHlwZURlY2xhcmF0aW9ucyBUeXBlRGVjbGFyYXRpb24KIAljb25jYXROb2RlTGlzdHMoKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlSGVhZGVyTmFtZVdpdGhUeXBlUGFyYW1ldGVycygpIHsKKwkvLyBDbGFzc0hlYWRlck5hbWUgOjo9IENsYXNzSGVhZGVyTmFtZTEgVHlwZVBhcmFtZXRlcnMKKwkvLyBJbnRlcmZhY2VIZWFkZXJOYW1lIDo6PSBJbnRlcmZhY2VIZWFkZXJOYW1lMSBUeXBlUGFyYW1ldGVycworCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisKKwkvLyBjb25zdW1lIHR5cGUgcGFyYW1ldGVycworCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKKwl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIHR5cGVEZWNsLnR5cGVQYXJhbWV0ZXJzID0gbmV3IFR5cGVQYXJhbWV0ZXJbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKworCXR5cGVEZWNsLmJvZHlTdGFydCA9IHR5cGVEZWNsLnR5cGVQYXJhbWV0ZXJzW2xlbmd0aC0xXS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisKKwl0aGlzLmxpc3RUeXBlUGFyYW1ldGVyTGVuZ3RoID0gMDsKKworCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJLy8gaXMgcmVjb3ZlcmluZworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpIHsKKwkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKSB0aGlzLmN1cnJlbnRFbGVtZW50OworCQkJcmVjb3ZlcmVkVHlwZS5wZW5kaW5nVHlwZVBhcmFtZXRlcnMgPSBudWxsOworCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGVEZWNsLmJvZHlTdGFydDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQodHlwZURlY2wsIDApOworCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisJCX0KKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCUltcG9ydFJlZmVyZW5jZSBpbXB0OwpAQCAtNzQ5MCw2ICs4MDI4LDggQEAKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKIAlwdXNoT25Bc3RTdGFjayhpbXB0ID0gbmV3IEltcG9ydFJlZmVyZW5jZSh0b2tlbnMsIHBvc2l0aW9ucywgdHJ1ZSwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpKTsKIAorCS8vIHN0YXIgZW5kIHBvc2l0aW9uCisJaW1wdC50cmFpbGluZ1N0YXJQb3NpdGlvbiA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CiAJCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAl9IGVsc2UgewpAQCAtNzUwNCwyNCArODA0NCw4IEBACiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChpbXB0LCAwKTsKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCi0JfQkKLX0KLXByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVySGVhZGVyKCkgewotCS8vVHlwZVBhcmFtZXRlckhlYWRlciA6Oj0gSWRlbnRpZmllcgotCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG5ldyBUeXBlUGFyYW1ldGVyKCk7Ci0JbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07Ci0JZmluYWwgaW50IGVuZCA9IChpbnQpIHBvczsKLQl0eXBlUGFyYW1ldGVyLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZW5kOwotCXR5cGVQYXJhbWV0ZXIuc291cmNlRW5kID0gZW5kOwotCWZpbmFsIGludCBzdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKLQl0eXBlUGFyYW1ldGVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzdGFydDsKLQl0eXBlUGFyYW1ldGVyLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7Ci0JdHlwZVBhcmFtZXRlci5uYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOwotCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwotCXB1c2hPbkdlbmVyaWNzU3RhY2sodHlwZVBhcmFtZXRlcik7Ci0JCi0JdGhpcy5saXN0VHlwZVBhcmFtZXRlckxlbmd0aCsrOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZVBhcmFtZXRlcjEoKSB7CiAJLy8gbm90aGluZyB0byBkbwpAQCAtNzU0NiwxMSArODA3MCwyNyBAQAogCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChUeXBlUGFyYW1ldGVyKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CiAJdHlwZVBhcmFtZXRlci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGJvdW5kc1thZGRpdGlvbmFsQm91bmRzTGVuZ3RoIC0gMV0uc291cmNlRW5kOwogCXR5cGVQYXJhbWV0ZXIudHlwZSA9IHN1cGVyVHlwZTsKLQlzdXBlclR5cGUuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwkKKwlzdXBlclR5cGUuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwogCXR5cGVQYXJhbWV0ZXIuYm91bmRzID0gYm91bmRzOwogCWZvciAoaW50IGkgPSAwLCBtYXggPSBib3VuZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJYm91bmRzW2ldLmJpdHMgfD0gQVNUTm9kZS5Jc1N1cGVyVHlwZTsKLQl9CQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVySGVhZGVyKCkgeworCS8vVHlwZVBhcmFtZXRlckhlYWRlciA6Oj0gSWRlbnRpZmllcgorCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG5ldyBUeXBlUGFyYW1ldGVyKCk7CisJbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJZmluYWwgaW50IGVuZCA9IChpbnQpIHBvczsKKwl0eXBlUGFyYW1ldGVyLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZW5kOworCXR5cGVQYXJhbWV0ZXIuc291cmNlRW5kID0gZW5kOworCWZpbmFsIGludCBzdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwl0eXBlUGFyYW1ldGVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzdGFydDsKKwl0eXBlUGFyYW1ldGVyLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJdHlwZVBhcmFtZXRlci5uYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXB1c2hPbkdlbmVyaWNzU3RhY2sodHlwZVBhcmFtZXRlcik7CisKKwl0aGlzLmxpc3RUeXBlUGFyYW1ldGVyTGVuZ3RoKys7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZVBhcmFtZXRlckxpc3QoKSB7CiAJLy9UeXBlUGFyYW1ldGVyTGlzdCA6Oj0gVHlwZVBhcmFtZXRlckxpc3QgJywnIFR5cGVQYXJhbWV0ZXIKQEAgLTc1NjIsMjYgKzgxMDIsMjYgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVycygpIHsKIAlpbnQgc3RhcnRQb3MgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwotCQorCiAJaWYodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CiAJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKSB7CiAJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPShSZWNvdmVyZWRUeXBlKSB0aGlzLmN1cnJlbnRFbGVtZW50OwogCQkJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXTsKIAkJCVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IG5ldyBUeXBlUGFyYW1ldGVyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgZ2VuZXJpY3NQdHIgLSBsZW5ndGggKyAxLCB0eXBlUGFyYW1ldGVycywgMCwgbGVuZ3RoKTsKLQkJCQorCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgLSBsZW5ndGggKyAxLCB0eXBlUGFyYW1ldGVycywgMCwgbGVuZ3RoKTsKKwogCQkJcmVjb3ZlcmVkVHlwZS5hZGQodHlwZVBhcmFtZXRlcnMsIHN0YXJ0UG9zKTsKIAkJfQogCX0KLQkKLQkKKworCiAJaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgJiYKLQkJCW9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81JiYKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdOwotCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mVHlwZVBhcmFtZXRlcnMoCi0JCQkoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW2dlbmVyaWNzUHRyIC0gbGVuZ3RoICsgMV0sCi0JCQkoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW2dlbmVyaWNzUHRyXSk7CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mVHlwZVBhcmFtZXRlcnMoCisJCQkoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHIgLSBsZW5ndGggKyAxXSwKKwkJCShUeXBlUGFyYW1ldGVyKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl0pOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVyV2l0aEV4dGVuZHMoKSB7CkBAIC03NjA2LDcgKzgxNDYsNyBAQAogCXR5cGVQYXJhbWV0ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBib3VuZHNbYWRkaXRpb25hbEJvdW5kc0xlbmd0aCAtIDFdLnNvdXJjZUVuZDsKIAlmb3IgKGludCBpID0gMCwgbWF4ID0gYm91bmRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCWJvdW5kc1tpXS5iaXRzIHw9IEFTVE5vZGUuSXNTdXBlclR5cGU7Ci0JfQkJCisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihpbnQgb3ApIHsKIAkvLyBVbmFyeUV4cHJlc3Npb24gOjo9ICcrJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCkBAIC03NjI1LDIwICs4MTY1LDMzIEBACiAKIAlFeHByZXNzaW9uIHIsIGV4cCA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJaWYgKG9wID09IE1JTlVTKSB7Ci0JCWlmICgoZXhwIGluc3RhbmNlb2YgSW50TGl0ZXJhbCkgJiYgKCgoSW50TGl0ZXJhbCkgZXhwKS5tYXlSZXByZXNlbnRNSU5fVkFMVUUoKSkpIHsKLQkJCXIgPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gbmV3IEludExpdGVyYWxNaW5WYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJaWYgKChleHAgaW5zdGFuY2VvZiBMb25nTGl0ZXJhbCkgJiYgKCgoTG9uZ0xpdGVyYWwpIGV4cCkubWF5UmVwcmVzZW50TUlOX1ZBTFVFKCkpKSB7Ci0JCQkJciA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBuZXcgTG9uZ0xpdGVyYWxNaW5WYWx1ZSgpOworCQlpZiAoZXhwIGluc3RhbmNlb2YgSW50TGl0ZXJhbCkgeworCQkJSW50TGl0ZXJhbCBpbnRMaXRlcmFsID0gKEludExpdGVyYWwpIGV4cDsKKwkJCUludExpdGVyYWwgY29udmVydFRvTWluVmFsdWUgPSBpbnRMaXRlcmFsLmNvbnZlcnRUb01pblZhbHVlKCk7CisJCQlpZiAoY29udmVydFRvTWluVmFsdWUgPT0gIGludExpdGVyYWwpIHsKKwkJCQkvLyBub3QgYSBtaW4gdmFsdWUgbGl0ZXJhbCBzbyB3ZSBjb252ZXJ0IGl0IHRvIGFuIHVuYXJ5IGV4cHJlc3Npb24KKwkJCQlyID0gbmV3IFVuYXJ5RXhwcmVzc2lvbihleHAsIG9wKTsKIAkJCX0gZWxzZSB7Ci0JCQkJciA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBuZXcgVW5hcnlFeHByZXNzaW9uKGV4cCwgb3ApOworCQkJCXIgPSBjb252ZXJ0VG9NaW5WYWx1ZTsKIAkJCX0KKwkJfSBlbHNlIGlmIChleHAgaW5zdGFuY2VvZiBMb25nTGl0ZXJhbCkgeworCQkJTG9uZ0xpdGVyYWwgbG9uZ0xpdGVyYWwgPSAoTG9uZ0xpdGVyYWwpIGV4cDsKKwkJCUxvbmdMaXRlcmFsIGNvbnZlcnRUb01pblZhbHVlID0gbG9uZ0xpdGVyYWwuY29udmVydFRvTWluVmFsdWUoKTsKKwkJCWlmIChjb252ZXJ0VG9NaW5WYWx1ZSA9PSAgbG9uZ0xpdGVyYWwpIHsKKwkJCQkvLyBub3QgYSBtaW4gdmFsdWUgbGl0ZXJhbCBzbyB3ZSBjb252ZXJ0IGl0IHRvIGFuIHVuYXJ5IGV4cHJlc3Npb24KKwkJCQlyID0gbmV3IFVuYXJ5RXhwcmVzc2lvbihleHAsIG9wKTsKKwkJCX0gZWxzZSB7CisJCQkJciA9IGNvbnZlcnRUb01pblZhbHVlOworCQkJfQorCQl9IGVsc2UgeworCQkJciA9IG5ldyBVbmFyeUV4cHJlc3Npb24oZXhwLCBvcCk7CiAJCX0KIAl9IGVsc2UgewotCQlyID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IG5ldyBVbmFyeUV4cHJlc3Npb24oZXhwLCBvcCk7CisJCXIgPSBuZXcgVW5hcnlFeHByZXNzaW9uKGV4cCwgb3ApOwogCX0KIAlyLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAlyLnNvdXJjZUVuZCA9IGV4cC5zb3VyY2VFbmQ7CisJdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSA9IHI7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVW5hcnlFeHByZXNzaW9uKGludCBvcCwgYm9vbGVhbiBwb3N0KSB7CiAJLy8gUHJlSW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gJysrJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCkBAIC03NjUxLDIxICs4MjA0LDIxIEBACiAKIAlFeHByZXNzaW9uIGxlZnRIYW5kU2lkZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJaWYgKGxlZnRIYW5kU2lkZSBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkvLyArK2ZvbygpKysgaXMgdW52YWxpZCAKKwkJLy8gKytmb28oKSsrIGlzIHVudmFsaWQKIAkJaWYgKHBvc3QpIHsKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPQogCQkJCW5ldyBQb3N0Zml4RXhwcmVzc2lvbigKIAkJCQkJbGVmdEhhbmRTaWRlLAogCQkJCQlJbnRMaXRlcmFsLk9uZSwKIAkJCQkJb3AsCi0JCQkJCXRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwkJCQkJdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiAJCX0gZWxzZSB7Ci0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0gCisJCQl0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdID0KIAkJCQluZXcgUHJlZml4RXhwcmVzc2lvbigKIAkJCQkJbGVmdEhhbmRTaWRlLAogCQkJCQlJbnRMaXRlcmFsLk9uZSwKIAkJCQkJb3AsCi0JCQkJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0pOyAKKwkJCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7CiAJCX0KIAl9IGVsc2UgewogCQkvL3RoZSArKyBvciB0aGUgLS0gaXMgTk9UIHRha2VuIGludG8gYWNjb3VudCBpZiBjb2RlIGdlbiBwcm9jZWVkcwpAQCAtNzc5Myw3ICs4MzQ2LDcgQEAKIH0KIC8qKgogICogR2l2ZW4gdGhlIGN1cnJlbnQgY29tbWVudCBzdGFjaywgYW5zd2VyIHdoZXRoZXIgc29tZSBjb21tZW50IGlzIGF2YWlsYWJsZSBpbiBhIGNlcnRhaW4gZXhjbHVzaXZlIHJhbmdlCi0gKiAKKyAqCiAgKiBAcGFyYW0gc291cmNlU3RhcnQgaW50CiAgKiBAcGFyYW0gc291cmNlRW5kIGludAogICogQHJldHVybiBib29sZWFuCkBAIC03ODAyLDYgKzgzNTUsNyBAQAogCWludCBpQ29tbWVudCA9IHRoaXMuc2Nhbm5lci5jb21tZW50UHRyOwogCWZvciAoOyBpQ29tbWVudCA+PSAwOyBpQ29tbWVudC0tKSB7CiAJCWludCBjb21tZW50U3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpQ29tbWVudF07CisJCWlmIChjb21tZW50U3RhcnQgPCAwKSBjb21tZW50U3RhcnQgPSAtY29tbWVudFN0YXJ0OwogCQkvLyBpZ25vcmUgY29tbWVudHMgYmVmb3JlIHN0YXJ0CiAJCWlmIChjb21tZW50U3RhcnQgPCBzb3VyY2VTdGFydCkgY29udGludWU7CiAJCS8vIGlnbm9yZSBjb21tZW50cyBhZnRlciBlbmQKQEAgLTc4MTAsNiArODM2NCw3IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KKwogcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIGNvbnZlcnRUb01ldGhvZERlY2xhcmF0aW9uKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gYywgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKIAlNZXRob2REZWNsYXJhdGlvbiBtID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKIAltLnR5cGVQYXJhbWV0ZXJzID0gYy50eXBlUGFyYW1ldGVyczsKQEAgLTc4MzAsNiArODM4NSw3IEBACiAJbS5qYXZhZG9jID0gYy5qYXZhZG9jOwogCXJldHVybiBtOwogfQorCiBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBjb3B5RGltcyhUeXBlUmVmZXJlbmNlIHR5cGVSZWYsIGludCBkaW0pIHsKIAlyZXR1cm4gdHlwZVJlZi5jb3B5RGltcyhkaW0pOwogfQpAQCAtNzg3Miw5ICs4NDI4LDkgQEAKIAkgICBtZXRob2RzIGZpZWxkcyBjb25zdHJ1Y3RvcnMgbGlzdHMgb2YgdGhlIHR5cGVEZWNsCiAKIAkgICBSZXR1cm4gaWYgdGhlcmUgaXMgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpbiB0aGUgbWV0aG9kcyBkZWNsYXJhdGlvbiAqLwotCSAgIAotCQotCS8vIExvb2tzIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGFycmF5IC4gCisKKworCS8vIExvb2tzIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGFycmF5IC4KIAogCWlmIChsZW5ndGggPT0gMCkKIAkJcmV0dXJuOwpAQCAtNzkxNyw3ICs4NDczLDcgQEAKIAlzaXplMSA9IHNpemUyID0gc2l6ZTMgPSAwOwogCWludCBmbGFnSSA9IGZsYWdbMF0sIHN0YXJ0ID0gMDsKIAlpbnQgbGVuZ3RoMjsKLQlmb3IgKGludCBlbmQgPSAwOyBlbmQgPD0gbGVuZ3RoOyBlbmQrKykgLy88SEVSRT4gdGhlIHBsdXMgb25lIGFsbG93cyB0byAKKwlmb3IgKGludCBlbmQgPSAwOyBlbmQgPD0gbGVuZ3RoOyBlbmQrKykgLy88SEVSRT4gdGhlIHBsdXMgb25lIGFsbG93cyB0bwogCQl7CiAJCWlmIChmbGFnSSAhPSBmbGFnW2VuZF0pIC8vdHJlYXQgdGhlIGxhc3QgZWxlbWVudCBhcyBhIGVuZGVkIGZsYWcuLi4uLgogCQkJeyAvL2FycmF5IGNvcHkKQEAgLTc5MjUsMjkgKzg0ODEsMjkgQEAKIAkJCQljYXNlIDEgOgogCQkJCQlzaXplMSArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJCXRoaXMuYXN0U3RhY2ssIAotCQkJCQkJdGhpcy5hc3RQdHIgKyBzdGFydCArIDEsIAotCQkJCQkJdHlwZURlY2wuZmllbGRzLCAKLQkJCQkJCXNpemUxIC0gbGVuZ3RoMiwgCi0JCQkJCQlsZW5ndGgyKTsgCisJCQkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCQkJdGhpcy5hc3RQdHIgKyBzdGFydCArIDEsCisJCQkJCQl0eXBlRGVjbC5maWVsZHMsCisJCQkJCQlzaXplMSAtIGxlbmd0aDIsCisJCQkJCQlsZW5ndGgyKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKIAkJCQkJc2l6ZTIgKz0gKGxlbmd0aDIgPSBlbmQgLSBzdGFydCk7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQl0aGlzLmFzdFN0YWNrLCAKLQkJCQkJCXRoaXMuYXN0UHRyICsgc3RhcnQgKyAxLCAKLQkJCQkJCXR5cGVEZWNsLm1ldGhvZHMsIAotCQkJCQkJc2l6ZTIgLSBsZW5ndGgyLCAKLQkJCQkJCWxlbmd0aDIpOyAKKwkJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCQl0aGlzLmFzdFB0ciArIHN0YXJ0ICsgMSwKKwkJCQkJCXR5cGVEZWNsLm1ldGhvZHMsCisJCQkJCQlzaXplMiAtIGxlbmd0aDIsCisJCQkJCQlsZW5ndGgyKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzIDoKIAkJCQkJc2l6ZTMgKz0gKGxlbmd0aDIgPSBlbmQgLSBzdGFydCk7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQl0aGlzLmFzdFN0YWNrLCAKLQkJCQkJCXRoaXMuYXN0UHRyICsgc3RhcnQgKyAxLCAKLQkJCQkJCXR5cGVEZWNsLm1lbWJlclR5cGVzLCAKLQkJCQkJCXNpemUzIC0gbGVuZ3RoMiwgCi0JCQkJCQlsZW5ndGgyKTsgCisJCQkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCQkJdGhpcy5hc3RQdHIgKyBzdGFydCArIDEsCisJCQkJCQl0eXBlRGVjbC5tZW1iZXJUeXBlcywKKwkJCQkJCXNpemUzIC0gbGVuZ3RoMiwKKwkJCQkJCWxlbmd0aDIpOwogCQkJCQlicmVhazsKIAkJCX0KIAkJCWZsYWdJID0gZmxhZ1tzdGFydCA9IGVuZF07CkBAIC03OTYxLDEyNSArODUxNywxMzAgQEAKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERlY2xhcmF0aW9uSW50b0VudW1EZWNsYXJhdGlvbihpbnQgbGVuZ3RoKSB7Ci0JCisKIAlpZiAobGVuZ3RoID09IDApCi0gICAgICByZXR1cm47Ci0gICBpbnRbXSBmbGFnID0gbmV3IGludFtsZW5ndGggKyAxXTsgLy9wbHVzIG9uZSAtLSBzZWUgPEhFUkU+Ci0gICBpbnQgc2l6ZTEgPSAwLCBzaXplMiA9IDAsIHNpemUzID0gMDsKLSAgIFR5cGVEZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gbGVuZ3RoXTsKLSAgIGJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzID0gZmFsc2U7Ci0gICBmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIEFTVE5vZGUgYXN0Tm9kZSA9IHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHItLV07Ci0gICAgICBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgIC8vbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIGhhdmUgYmVlbiByZWdyb3VwZWQgaW50byBvbmUgc2luZ2xlIGxpc3QKLSAgICAgICAgIGZsYWdbaV0gPSAyOwotICAgICAgICAgc2l6ZTIrKzsKLQkJaWYgKCgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgYXN0Tm9kZSkuaXNBYnN0cmFjdCgpKSB7Ci0JCQloYXNBYnN0cmFjdE1ldGhvZHMgPSB0cnVlOwotCQl9ICAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgIGZsYWdbaV0gPSAzOwotICAgICAgICAgc2l6ZTMrKzsKLSAgICAgIH0gZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKLSAgICAgICAgIGZsYWdbaV0gPSAxOwotICAgICAgICAgc2l6ZTErKzsKLS8vICAgICAgICAgaWYoYXN0Tm9kZSBpbnN0YW5jZW9mIEVudW1Db25zdGFudCkgewotLy8gICAgICAgICAgICBFbnVtQ29uc3RhbnQgY29uc3RhbnQgPSAoRW51bUNvbnN0YW50KSBhc3ROb2RlOwotLy8gICAgICAgICAgICAoKEFsbG9jYXRpb25FeHByZXNzaW9uKWNvbnN0YW50LmluaXRpYWxpemF0aW9uKS50eXBlID0gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoZW51bURlY2xhcmF0aW9uLm5hbWUsCi0vLyAgICAgICAgICAgICAgICAgICgoKGxvbmcpIGVudW1EZWNsYXJhdGlvbi5zb3VyY2VTdGFydCkgPDwgMzIpICsgZW51bURlY2xhcmF0aW9uLnNvdXJjZUVuZCk7Ci0vLyAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAKLSAgIC8vYXJyYXlzIGNyZWF0aW9uCi0gICBpZiAoc2l6ZTEgIT0gMCkgewotICAgICAgZW51bURlY2xhcmF0aW9uLmZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW3NpemUxXTsKLSAgIH0KLSAgIGlmIChzaXplMiAhPSAwKSB7Ci0gICAgICBlbnVtRGVjbGFyYXRpb24ubWV0aG9kcyA9IG5ldyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW3NpemUyXTsKLSAgICAgIGlmIChoYXNBYnN0cmFjdE1ldGhvZHMpIGVudW1EZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzQWJzdHJhY3RNZXRob2RzOwotICAgfQotICAgaWYgKHNpemUzICE9IDApIHsKLSAgICAgIGVudW1EZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bc2l6ZTNdOwotICAgfQotIAotICAgLy9hcnJheXMgZmlsbCB1cAotICAgc2l6ZTEgPSBzaXplMiA9IHNpemUzID0gMDsKLSAgIGludCBmbGFnSSA9IGZsYWdbMF0sIHN0YXJ0ID0gMDsKLSAgIGludCBsZW5ndGgyOwotICAgZm9yIChpbnQgZW5kID0gMDsgZW5kIDw9IGxlbmd0aDsgZW5kKyspIC8vPEhFUkU+IHRoZSBwbHVzIG9uZSBhbGxvd3MgdG8gCi0gICAgICB7Ci0gICAgICBpZiAoZmxhZ0kgIT0gZmxhZ1tlbmRdKSAvL3RyZWF0IHRoZSBsYXN0IGVsZW1lbnQgYXMgYSBlbmRlZCBmbGFnLi4uLi4KLSAgICAgICAgIHsgLy9hcnJheSBjb3B5Ci0gICAgICAgICBzd2l0Y2ggKGZsYWdJKSB7Ci0gICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgc2l6ZTEgKz0gKGxlbmd0aDIgPSBlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgdGhpcy5hc3RTdGFjaywgCi0gICAgICAgICAgICAgICAgICB0aGlzLmFzdFB0ciArIHN0YXJ0ICsgMSwgCi0gICAgICAgICAgICAgICAgICBlbnVtRGVjbGFyYXRpb24uZmllbGRzLCAKLSAgICAgICAgICAgICAgICAgIHNpemUxIC0gbGVuZ3RoMiwgCi0gICAgICAgICAgICAgICAgICBsZW5ndGgyKTsgCi0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICBzaXplMiArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICB0aGlzLmFzdFN0YWNrLCAKLSAgICAgICAgICAgICAgICAgIHRoaXMuYXN0UHRyICsgc3RhcnQgKyAxLCAKLSAgICAgICAgICAgICAgICAgIGVudW1EZWNsYXJhdGlvbi5tZXRob2RzLCAKLSAgICAgICAgICAgICAgICAgIHNpemUyIC0gbGVuZ3RoMiwgCi0gICAgICAgICAgICAgICAgICBsZW5ndGgyKTsgCi0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMyA6Ci0gICAgICAgICAgICAgICBzaXplMyArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICB0aGlzLmFzdFN0YWNrLCAKLSAgICAgICAgICAgICAgICAgIHRoaXMuYXN0UHRyICsgc3RhcnQgKyAxLCAKLSAgICAgICAgICAgICAgICAgIGVudW1EZWNsYXJhdGlvbi5tZW1iZXJUeXBlcywgCi0gICAgICAgICAgICAgICAgICBzaXplMyAtIGxlbmd0aDIsIAotICAgICAgICAgICAgICAgICAgbGVuZ3RoMik7IAotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBmbGFnSSA9IGZsYWdbc3RhcnQgPSBlbmRdOwotICAgICAgfQotICAgfQotIAotICAgaWYgKGVudW1EZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gZW51bURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICBlbnVtRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV0uZW5jbG9zaW5nVHlwZSA9IGVudW1EZWNsYXJhdGlvbjsKLSAgICAgIH0KLSAgIH19CisJCXJldHVybjsKKwlpbnRbXSBmbGFnID0gbmV3IGludFtsZW5ndGggKyAxXTsgLy9wbHVzIG9uZSAtLSBzZWUgPEhFUkU+CisJaW50IHNpemUxID0gMCwgc2l6ZTIgPSAwLCBzaXplMyA9IDA7CisJVHlwZURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLSBsZW5ndGhdOworCWJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzID0gZmFsc2U7CisJaW50IGVudW1Db25zdGFudHNDb3VudGVyID0gMDsKKwlmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJQVNUTm9kZSBhc3ROb2RlID0gdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ci0tXTsKKwkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkvL21ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycyBoYXZlIGJlZW4gcmVncm91cGVkIGludG8gb25lIHNpbmdsZSBsaXN0CisJCQlmbGFnW2ldID0gMjsKKwkJCXNpemUyKys7CisJCQlpZiAoKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBhc3ROb2RlKS5pc0Fic3RyYWN0KCkpIHsKKwkJCQloYXNBYnN0cmFjdE1ldGhvZHMgPSB0cnVlOworCQkJfQorCQl9IGVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCWZsYWdbaV0gPSAzOworCQkJc2l6ZTMrKzsKKwkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQkJZmxhZ1tpXSA9IDE7CisJCQlzaXplMSsrOworCQkJaWYgKCgoRmllbGREZWNsYXJhdGlvbikgYXN0Tm9kZSkuZ2V0S2luZCgpID09IEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UKSB7CisJCQkJZW51bUNvbnN0YW50c0NvdW50ZXIrKzsKKwkJCX0KKwkJfQorCX0KKworCS8vYXJyYXlzIGNyZWF0aW9uCisJaWYgKHNpemUxICE9IDApIHsKKwkJZW51bURlY2xhcmF0aW9uLmZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW3NpemUxXTsKKwl9CisJaWYgKHNpemUyICE9IDApIHsKKwkJZW51bURlY2xhcmF0aW9uLm1ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltzaXplMl07CisJCWlmIChoYXNBYnN0cmFjdE1ldGhvZHMpIGVudW1EZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzQWJzdHJhY3RNZXRob2RzOworCX0KKwlpZiAoc2l6ZTMgIT0gMCkgeworCQllbnVtRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW3NpemUzXTsKKwl9CisKKwkvL2FycmF5cyBmaWxsIHVwCisJc2l6ZTEgPSBzaXplMiA9IHNpemUzID0gMDsKKwlpbnQgZmxhZ0kgPSBmbGFnWzBdLCBzdGFydCA9IDA7CisJaW50IGxlbmd0aDI7CisJZm9yIChpbnQgZW5kID0gMDsgZW5kIDw9IGxlbmd0aDsgZW5kKyspIC8vPEhFUkU+IHRoZSBwbHVzIG9uZSBhbGxvd3MgdG8KKwl7CisJCWlmIChmbGFnSSAhPSBmbGFnW2VuZF0pIC8vdHJlYXQgdGhlIGxhc3QgZWxlbWVudCBhcyBhIGVuZGVkIGZsYWcuLi4uLgorCQl7IC8vYXJyYXkgY29weQorCQkJc3dpdGNoIChmbGFnSSkgeworCQkJCWNhc2UgMSA6CisJCQkJCXNpemUxICs9IChsZW5ndGgyID0gZW5kIC0gc3RhcnQpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCQkJdGhpcy5hc3RQdHIgKyBzdGFydCArIDEsCisJCQkJCQkJZW51bURlY2xhcmF0aW9uLmZpZWxkcywKKwkJCQkJCQlzaXplMSAtIGxlbmd0aDIsCisJCQkJCQkJbGVuZ3RoMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMiA6CisJCQkJCXNpemUyICs9IChsZW5ndGgyID0gZW5kIC0gc3RhcnQpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCQkJdGhpcy5hc3RQdHIgKyBzdGFydCArIDEsCisJCQkJCQkJZW51bURlY2xhcmF0aW9uLm1ldGhvZHMsCisJCQkJCQkJc2l6ZTIgLSBsZW5ndGgyLAorCQkJCQkJCWxlbmd0aDIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMgOgorCQkJCQlzaXplMyArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCQkJCXRoaXMuYXN0UHRyICsgc3RhcnQgKyAxLAorCQkJCQkJCWVudW1EZWNsYXJhdGlvbi5tZW1iZXJUeXBlcywKKwkJCQkJCQlzaXplMyAtIGxlbmd0aDIsCisJCQkJCQkJbGVuZ3RoMik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJZmxhZ0kgPSBmbGFnW3N0YXJ0ID0gZW5kXTsKKwkJfQorCX0KKworCWlmIChlbnVtRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gZW51bURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQllbnVtRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV0uZW5jbG9zaW5nVHlwZSA9IGVudW1EZWNsYXJhdGlvbjsKKwkJfQorCX0KKwllbnVtRGVjbGFyYXRpb24uZW51bUNvbnN0YW50c0NvdW50ZXIgPSBlbnVtQ29uc3RhbnRzQ291bnRlcjsKK30KIHByb3RlY3RlZCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBlbmRQYXJzZShpbnQgYWN0KSB7CiAKIAl0aGlzLmxhc3RBY3QgPSBhY3Q7CiAKIAlpZih0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSB7Ci0JCVJlY292ZXJlZEVsZW1lbnQgcmVjb3ZlcmVkRWxlbWVudCA9IHRoaXMuYnVpbGRJbml0aWFsUmVjb3ZlcnlTdGF0ZSgpOwotCQlyZWNvdmVyZWRFbGVtZW50LnRvcEVsZW1lbnQoKS51cGRhdGVQYXJzZVRyZWUoKTsKLQkJaWYodGhpcy5oYXNFcnJvcikgdGhpcy5yZXNldFN0YWNrcygpOworCQlSZWNvdmVyZWRFbGVtZW50IHJlY292ZXJlZEVsZW1lbnQgPSBidWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCk7CisKKwkJaWYgKHJlY292ZXJlZEVsZW1lbnQgIT0gbnVsbCkgeworCQkJcmVjb3ZlcmVkRWxlbWVudC50b3BFbGVtZW50KCkudXBkYXRlUGFyc2VUcmVlKCk7CisJCX0KKworCQlpZih0aGlzLmhhc0Vycm9yKSByZXNldFN0YWNrcygpOwogCX0gZWxzZSBpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKIAkJaWYgKFZFUkJPU0VfUkVDT1ZFUlkpewotCQkJU3lzdGVtLm91dC5wcmludChNZXNzYWdlcy5wYXJzZXJfc3ludGF4UmVjb3ZlcnkpOyAKKwkJCVN5c3RlbS5vdXQucHJpbnQoTWVzc2FnZXMucGFyc2VyX3N5bnRheFJlY292ZXJ5KTsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsJCSAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jb21waWxhdGlvblVuaXQpOwkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jb21waWxhdGlvblVuaXQpOwogCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQl0aGlzLmN1cnJlbnRFbGVtZW50LnRvcEVsZW1lbnQoKS51cGRhdGVQYXJzZVRyZWUoKTsKIAl9IGVsc2UgewogCQlpZiAodGhpcy5kaWV0ICYgVkVSQk9TRV9SRUNPVkVSWSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KE1lc3NhZ2VzLnBhcnNlcl9yZWd1bGFyUGFyc2UpOyAKKwkJCVN5c3RlbS5vdXQucHJpbnQoTWVzc2FnZXMucGFyc2VyX3JlZ3VsYXJQYXJzZSk7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CSAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jb21waWxhdGlvblVuaXQpOwkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jb21waWxhdGlvblVuaXQpOwogCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIAlwZXJzaXN0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zY2FubmVyLmZvdW5kVGFza0NvdW50OyBpKyspewogCQlpZighdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCkgcHJvYmxlbVJlcG9ydGVyKCkudGFzaygKLQkJCW5ldyBTdHJpbmcodGhpcy5zY2FubmVyLmZvdW5kVGFza1RhZ3NbaV0pLCAKKwkJCW5ldyBTdHJpbmcodGhpcy5zY2FubmVyLmZvdW5kVGFza1RhZ3NbaV0pLAogCQkJbmV3IFN0cmluZyh0aGlzLnNjYW5uZXIuZm91bmRUYXNrTWVzc2FnZXNbaV0pLAotCQkJdGhpcy5zY2FubmVyLmZvdW5kVGFza1ByaW9yaXRpZXNbaV0gPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKHRoaXMuc2Nhbm5lci5mb3VuZFRhc2tQcmlvcml0aWVzW2ldKSwgCi0JCQl0aGlzLnNjYW5uZXIuZm91bmRUYXNrUG9zaXRpb25zW2ldWzBdLCAKKwkJCXRoaXMuc2Nhbm5lci5mb3VuZFRhc2tQcmlvcml0aWVzW2ldID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyh0aGlzLnNjYW5uZXIuZm91bmRUYXNrUHJpb3JpdGllc1tpXSksCisJCQl0aGlzLnNjYW5uZXIuZm91bmRUYXNrUG9zaXRpb25zW2ldWzBdLAogCQkJdGhpcy5zY2FubmVyLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVsxXSk7CiAJfQogCXJldHVybiB0aGlzLmNvbXBpbGF0aW9uVW5pdDsKQEAgLTgwODksMTQgKzg2NTAsMTMgQEAKICAqCiAgKiBOb3RlOiBjb21tZW50cyBhcmUgc3RhY2tlZCBpbiBzeW50YWN0aWNhbCBvcmRlcgogICoKLSAqIEVpdGhlciBhbnN3ZXIgZ2l2ZW4gPHBvc2l0aW9uPiwgb3IgdGhlIGVuZCBwb3NpdGlvbiBvZiBhIGNvbW1lbnQgbGluZSAKKyAqIEVpdGhlciBhbnN3ZXIgZ2l2ZW4gPHBvc2l0aW9uPiwgb3IgdGhlIGVuZCBwb3NpdGlvbiBvZiBhIGNvbW1lbnQgbGluZQogICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSA8cG9zaXRpb24+IChzYW1lIGxpbmUpCiAgKgogICogZS5nLgogICogdm9pZCBmb28oKXsKICAqIH0gLy8gZW5kIG9mIG1ldGhvZCBmb28KICAqLwotIAogcHVibGljIGludCBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8oaW50IHBvc2l0aW9uKSB7CiAKIAlpbnQgbGFzdENvbW1lbnRJbmRleCA9IHRoaXMuc2Nhbm5lci5jb21tZW50UHRyOwpAQCAtODEyMSw3ICs4NjgxLDcgQEAKIAkJaWYgKGltbWVkaWF0ZUNvbW1lbnRFbmQgPiAwKXsgLy8gb25seSB0b2xlcmF0aW5nIG5vbi1qYXZhZG9jIGNvbW1lbnRzCiAJCQkvLyBpcyB0aGVyZSBhbnkgbGluZSBicmVhayB1bnRpbCB0aGUgZW5kIG9mIHRoZSBpbW1lZGlhdGUgY29tbWVudCA/ICh0aHVzIG9ubHkgdG9sZXJhdGluZyBsaW5lIGNvbW1lbnQpCiAJCQlpbW1lZGlhdGVDb21tZW50RW5kLS07IC8vIGNvbW1lbnQgZW5kIGluIG9uZSBjaGFyIHRvbyBmYXIKLQkJCWlmIChVdGlsLmdldExpbmVOdW1iZXIocG9zaXRpb24sIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpIAorCQkJaWYgKFV0aWwuZ2V0TGluZU51bWJlcihwb3NpdGlvbiwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikKIAkJCQkJPT0gVXRpbC5nZXRMaW5lTnVtYmVyKGltbWVkaWF0ZUNvbW1lbnRFbmQsIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpKXsKIAkJCQlwb3NpdGlvbiA9IGltbWVkaWF0ZUNvbW1lbnRFbmQ7CiAJCQkJdmFsaWRDb3VudC0tOyAvLyBmbHVzaCB0aGlzIGNvbW1lbnQKQEAgLTgxNTIsMTcgKzg3MTIsMTggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0cywgaW5kZXggKyAxLCB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0cywgMCwgdmFsaWRDb3VudCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHMsIGluZGV4ICsgMSwgdGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wcywgMCwgdmFsaWRDb3VudCk7CQkKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wcywgaW5kZXggKyAxLCB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzLCAwLCB2YWxpZENvdW50KTsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zY2FubmVyLmNvbW1lbnRUYWdTdGFydHMsIGluZGV4ICsgMSwgdGhpcy5zY2FubmVyLmNvbW1lbnRUYWdTdGFydHMsIDAsIHZhbGlkQ291bnQpOwogCX0KIAl0aGlzLnNjYW5uZXIuY29tbWVudFB0ciA9IHZhbGlkQ291bnQgLSAxOwogCXJldHVybiBwb3NpdGlvbjsKIH0KKwogcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgZ2V0QW5ub3RhdGlvblR5cGUoKSB7CiAJaW50IGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXTsKIAlpZiAobGVuZ3RoID09IDEpIHsKIAkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAotCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sIAorCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCiAJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0pOwogCX0gZWxzZSB7CiAJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKQEAgLTgxNzAsMTAgKzg3MzEsMTAgQEAKIAkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgCi0JCQlwb3NpdGlvbnMsIAotCQkJMCwgCisJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLAorCQkJdGhpcy5pZGVudGlmaWVyUHRyICsgMSwKKwkJCXBvc2l0aW9ucywKKwkJCTAsCiAJCQlsZW5ndGgpOwogCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOwogCX0KQEAgLTgyMDQsNyArODc2NSw3IEBACiAJLy8gLS0gY29tcGxldGlvbiBwYXJzZXIKIAkvLyBHb2FsIDo6PSAnIScgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQKIAkvLyBHb2FsIDo6PSAnficgQmxvY2tTdGF0ZW1lbnRzb3B0Ci0JCisKIAlyZXR1cm4gdGhpcy5maXJzdFRva2VuOwogfQogLyoKQEAgLTgyMTgsOSArODc3OSwxMCBAQAogcHVibGljIGludFtdIGdldEphdmFEb2NQb3NpdGlvbnMoKSB7CiAKIAlpbnQgamF2YWRvY0NvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7IGkgPD0gbWF4OyBpKyspewotCQkvLyBqYXZhZG9jIG9ubHkgKG5vbiBqYXZhZG9jIGNvbW1lbnQgaGF2ZSBuZWdhdGl2ZSBlbmQgcG9zaXRpb25zLikKLQkJaWYgKHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbaV0gPiAwKXsKKwlpbnQgbWF4ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7CisJZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspeworCQkvLyBqYXZhZG9jIG9ubHkgKG5vbiBqYXZhZG9jIGNvbW1lbnQgaGF2ZSBuZWdhdGl2ZSBzdGFydCBhbmQvb3IgZW5kIHBvc2l0aW9ucy4pCisJCWlmICh0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXSA+PSAwICYmIHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbaV0gPiAwKSB7CiAJCQlqYXZhZG9jQ291bnQrKzsKIAkJfQogCX0KQEAgLTgyMjgsNzUgKzg3OTAsODEgQEAKIAogCWludFtdIHBvc2l0aW9ucyA9IG5ldyBpbnRbMipqYXZhZG9jQ291bnRdOwogCWludCBpbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuc2Nhbm5lci5jb21tZW50UHRyOyBpIDw9IG1heDsgaSsrKXsKLQkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucy4pCi0JCWlmICh0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2ldID4gMCl7Ci0JCQlwb3NpdGlvbnNbaW5kZXgrK10gPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXTsKLQkJCXBvc2l0aW9uc1tpbmRleCsrXSA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbaV0tMTsgLy9zdG9wIGlzIG9uZSBvdmVyCQkJCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspeworCQkvLyBqYXZhZG9jIG9ubHkgKG5vbiBqYXZhZG9jIGNvbW1lbnQgaGF2ZSBuZWdhdGl2ZSBzdGFydCBhbmQvb3IgZW5kIHBvc2l0aW9ucy4pCisJCWludCBjb21tZW50U3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXTsKKwkJaWYgKGNvbW1lbnRTdGFydCA+PSAwKSB7CisJCQlpbnQgY29tbWVudFN0b3AgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2ldOworCQkJaWYgKGNvbW1lbnRTdG9wID4gMCl7CisJCQkJcG9zaXRpb25zW2luZGV4KytdID0gY29tbWVudFN0YXJ0OworCQkJCXBvc2l0aW9uc1tpbmRleCsrXSA9IGNvbW1lbnRTdG9wLTE7IC8vc3RvcCBpcyBvbmUgb3ZlcgorCQkJfQogCQl9CiAJfQogCXJldHVybiBwb3NpdGlvbnM7CiB9Ci0JcHVibGljIHZvaWQgZ2V0TWV0aG9kQm9kaWVzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKLQkJLy9maWxsIHRoZSBtZXRob2RzIGJvZGllcyBpbiBvcmRlciBmb3IgdGhlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkCitwdWJsaWMgdm9pZCBnZXRNZXRob2RCb2RpZXMoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgeworCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAogCi0JCWlmICh1bml0ID09IG51bGwpIHJldHVybjsKLQkJCi0JCWlmICh1bml0Lmlnbm9yZU1ldGhvZEJvZGllcykgewotCQkJdW5pdC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7Ci0JCQlyZXR1cm47Ci0JCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCi0JCX0KKwlpZiAodW5pdCA9PSBudWxsKSByZXR1cm47CiAKLQkJaWYgKCh1bml0LmJpdHMgJiBBU1ROb2RlLkhhc0FsbE1ldGhvZEJvZGllcykgIT0gMCkKLQkJCXJldHVybjsgLy93b3JrIGFscmVhZHkgZG9uZSAuLi4KLQotCQkvLyBzYXZlIGV4aXN0aW5nIHZhbHVlcyB0byByZXN0b3JlIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2luZyBwcm9jZXNzCi0JCS8vIHNlZSBidWcgNDcwNzkgZm9yIG1vcmUgZGV0YWlscwotCQlpbnRbXSBvbGRMaW5lRW5kcyA9IHRoaXMuc2Nhbm5lci5saW5lRW5kczsKLQkJaW50IG9sZExpbmVQdHIgPSB0aGlzLnNjYW5uZXIubGluZVB0cjsKLQotCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4KLQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OwotCQljaGFyW10gY29udGVudHMgPSBjb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKTsKLQkJdGhpcy5zY2FubmVyLnNldFNvdXJjZShjb250ZW50cywgY29tcGlsYXRpb25SZXN1bHQpOwotCQkKLQkJaWYgKHRoaXMuamF2YWRvY1BhcnNlciAhPSBudWxsICYmIHRoaXMuamF2YWRvY1BhcnNlci5jaGVja0RvY0NvbW1lbnQpIHsKLQkJCXRoaXMuamF2YWRvY1BhcnNlci5zY2FubmVyLnNldFNvdXJjZShjb250ZW50cyk7Ci0JCX0KLQkJaWYgKHVuaXQudHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IHVuaXQudHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQkJdW5pdC50eXBlc1tpXS5wYXJzZU1ldGhvZCh0aGlzLCB1bml0KTsKLQkJfQotCQkKLQkJLy8gdGFnIHVuaXQgaGFzIGhhdmluZyByZWFkIGJvZGllcwotCQl1bml0LmJpdHMgfD0gQVNUTm9kZS5IYXNBbGxNZXRob2RCb2RpZXM7Ci0KLQkJLy8gdGhpcyBpcyBkb25lIHRvIHByZXZlbnQgYW55IHNpZGUgZWZmZWN0cyBvbiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKLQkJLy8gbGluZSBzZXBhcmF0b3IgcG9zaXRpb25zIGFycmF5LgotCQl0aGlzLnNjYW5uZXIubGluZUVuZHMgPSBvbGRMaW5lRW5kczsKLQkJdGhpcy5zY2FubmVyLmxpbmVQdHIgPSBvbGRMaW5lUHRyOworCWlmICh1bml0Lmlnbm9yZU1ldGhvZEJvZGllcykgeworCQl1bml0Lmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJcmV0dXJuOworCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCiAJfQotcHJvdGVjdGVkIGNoYXIgZ2V0TmV4dENoYXJhY3RlcihjaGFyW10gY29tbWVudCwgaW50W10gaW5kZXgpIHsKLQljaGFyIG5leHRDaGFyYWN0ZXIgPSBjb21tZW50W2luZGV4WzBdKytdOwotCXN3aXRjaChuZXh0Q2hhcmFjdGVyKSB7Ci0JCWNhc2UgJ1xcJyA6Ci0JCQlpbnQgYzEsIGMyLCBjMywgYzQ7Ci0JCQlpbmRleFswXSsrOwotCQkJd2hpbGUgKGNvbW1lbnRbaW5kZXhbMF1dID09ICd1JykgaW5kZXhbMF0rKzsKLQkJCWlmICghKCgoYzEgPSBTY2FubmVySGVscGVyLmdldE51bWVyaWNWYWx1ZShjb21tZW50W2luZGV4WzBdKytdKSkgPiAxNQotCQkJCXx8IGMxIDwgMCkKLQkJCQl8fCAoKGMyID0gU2Nhbm5lckhlbHBlci5nZXROdW1lcmljVmFsdWUoY29tbWVudFtpbmRleFswXSsrXSkpID4gMTUgfHwgYzIgPCAwKQotCQkJCXx8ICgoYzMgPSBTY2FubmVySGVscGVyLmdldE51bWVyaWNWYWx1ZShjb21tZW50W2luZGV4WzBdKytdKSkgPiAxNSB8fCBjMyA8IDApCi0JCQkJfHwgKChjNCA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1IHx8IGM0IDwgMCkpKSB7Ci0JCQkJCW5leHRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7Ci0JCQl9Ci0JCQlicmVhazsKKworCWlmICgodW5pdC5iaXRzICYgQVNUTm9kZS5IYXNBbGxNZXRob2RCb2RpZXMpICE9IDApCisJCXJldHVybjsgLy93b3JrIGFscmVhZHkgZG9uZSAuLi4KKworCS8vIHNhdmUgZXhpc3RpbmcgdmFsdWVzIHRvIHJlc3RvcmUgdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MKKwkvLyBzZWUgYnVnIDQ3MDc5IGZvciBtb3JlIGRldGFpbHMKKwlpbnRbXSBvbGRMaW5lRW5kcyA9IHRoaXMuc2Nhbm5lci5saW5lRW5kczsKKwlpbnQgb2xkTGluZVB0ciA9IHRoaXMuc2Nhbm5lci5saW5lUHRyOworCisJLy9yZWFsIHBhcnNlIG9mIHRoZSBtZXRob2QuLi4uCisJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OworCWNoYXJbXSBjb250ZW50cyA9IHRoaXMucmVhZE1hbmFnZXIgIT0gbnVsbAorCQk/IHRoaXMucmVhZE1hbmFnZXIuZ2V0Q29udGVudHMoY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0KQorCQk6IGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRDb250ZW50cygpOworCXRoaXMuc2Nhbm5lci5zZXRTb3VyY2UoY29udGVudHMsIGNvbXBpbGF0aW9uUmVzdWx0KTsKKworCWlmICh0aGlzLmphdmFkb2NQYXJzZXIgIT0gbnVsbCAmJiB0aGlzLmphdmFkb2NQYXJzZXIuY2hlY2tEb2NDb21tZW50KSB7CisJCXRoaXMuamF2YWRvY1BhcnNlci5zY2FubmVyLnNldFNvdXJjZShjb250ZW50cyk7CiAJfQotCXJldHVybiBuZXh0Q2hhcmFjdGVyOworCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHVuaXQudHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl1bml0LnR5cGVzW2ldLnBhcnNlTWV0aG9kcyh0aGlzLCB1bml0KTsKKwl9CisKKwkvLyB0YWcgdW5pdCBoYXMgaGF2aW5nIHJlYWQgYm9kaWVzCisJdW5pdC5iaXRzIHw9IEFTVE5vZGUuSGFzQWxsTWV0aG9kQm9kaWVzOworCisJLy8gdGhpcyBpcyBkb25lIHRvIHByZXZlbnQgYW55IHNpZGUgZWZmZWN0cyBvbiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKKwkvLyBsaW5lIHNlcGFyYXRvciBwb3NpdGlvbnMgYXJyYXkuCisJdGhpcy5zY2FubmVyLmxpbmVFbmRzID0gb2xkTGluZUVuZHM7CisJdGhpcy5zY2FubmVyLmxpbmVQdHIgPSBvbGRMaW5lUHRyOwogfQorCXByb3RlY3RlZCBjaGFyIGdldE5leHRDaGFyYWN0ZXIoY2hhcltdIGNvbW1lbnQsIGludFtdIGluZGV4KSB7CisJCWNoYXIgbmV4dENoYXJhY3RlciA9IGNvbW1lbnRbaW5kZXhbMF0rK107CisJCXN3aXRjaChuZXh0Q2hhcmFjdGVyKSB7CisJCQljYXNlICdcXCcgOgorCQkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCQlpbmRleFswXSsrOworCQkJCXdoaWxlIChjb21tZW50W2luZGV4WzBdXSA9PSAndScpIGluZGV4WzBdKys7CisJCQkJaWYgKCEoKChjMSA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1CisJCQkJCXx8IGMxIDwgMCkKKwkJCQkJfHwgKChjMiA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1IHx8IGMyIDwgMCkKKwkJCQkJfHwgKChjMyA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQkJfHwgKChjNCA9IFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1IHx8IGM0IDwgMCkpKSB7CisJCQkJCQluZXh0Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbmV4dENoYXJhY3RlcjsKKwl9CiBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRUeXBlUmVmZXJlbmNlKEV4cHJlc3Npb24gZXhwKSB7Ci0JCisKIAlleHAuYml0cyAmPSB+QVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOwogCWV4cC5iaXRzIHw9IEJpbmRpbmcuVFlQRTsKIAlyZXR1cm4gZXhwOwpAQCAtODMyNSwxNyArODg5MywxNyBAQAogCQkJLy8gc2luZ2xlIHZhcmlhYmxlIHJlZmVyZW5jZQogCQkJdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tOyAvLyBwb3AgdGhlIDAKIAkJCWlmIChkaW0gPT0gMCkgewotCQkJCXJlZiA9IAorCQkJCXJlZiA9CiAJCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAotCQkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwgCi0JCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7IAorCQkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKKwkJCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcmVmID0gCisJCQkJcmVmID0KIAkJCQkJbmV3IEFycmF5VHlwZVJlZmVyZW5jZSgKLQkJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sIAotCQkJCQkJZGltLCAKLQkJCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dKTsgCi0JCQkJcmVmLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CQkJCisJCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAorCQkJCQkJZGltLAorCQkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0pOworCQkJCXJlZi5zb3VyY2VFbmQgPSB0aGlzLmVuZFBvc2l0aW9uOwogCQkJfQogCQl9IGVsc2UgewogCQkJdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tOwpAQCAtODM0NSwxMSArODkxMywxMSBAQAogCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQkJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsIAotCQkJCXBvc2l0aW9ucywgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCisJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywKKwkJCQl0aGlzLmlkZW50aWZpZXJQdHIgKyAxLAorCQkJCXBvc2l0aW9ucywKKwkJCQkwLAorCQkJCWxlbmd0aCk7CiAJCQlpZiAoZGltID09IDApIHsKIAkJCQlyZWYgPSBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIHBvc2l0aW9ucyk7CiAJCQl9IGVsc2UgewpAQCAtODM2MywxMyArODkzMSwyMyBAQAogcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgZ2V0VHlwZVJlZmVyZW5jZUZvckdlbmVyaWNUeXBlKGludCBkaW0sIGludCBpZGVudGlmaWVyTGVuZ3RoLCBpbnQgbnVtYmVyT2ZJZGVudGlmaWVycykgewogCWlmIChpZGVudGlmaWVyTGVuZ3RoID09IDEgJiYgbnVtYmVyT2ZJZGVudGlmaWVycyA9PSAxKSB7CiAJCWludCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOwotCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2N1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoXTsKLQkJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCB0eXBlQXJndW1lbnRzLCAwLCBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCk7CisJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbnVsbDsKKwkJaWYgKGN1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoIDwgMCkgeworCQkJdHlwZUFyZ3VtZW50cyA9IFR5cGVSZWZlcmVuY2UuTk9fVFlQRV9BUkdVTUVOVFM7CisJCX0gZWxzZSB7CisJCQl0eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGhdOworCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgdHlwZUFyZ3VtZW50cywgMCwgY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGgpOworCQl9CiAJCVBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlID0gbmV3IFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sIHR5cGVBcmd1bWVudHMsIGRpbSwgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0pOwogCQlpZiAoZGltICE9IDApIHsKIAkJCXBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CiAJCX0KKwkJLyogV2UgdXNlZCB0byBlYWdlcmx5IG1hcmsgdGhlIFBTVFIgYXMgY29uc3RpdHV0aW5nIGRpYW1vbmQgdXNhZ2UgaWYgd2UgZW5jb3VudGVyZWQgPD4sIGJ1dCB0aGF0IGlzIHRvbyBlYWdlciBhbmQKKwkJICAgY29tcGxpY2F0ZXMgZXJyb3IgaGFuZGxpbmcgYnkgbWFraW5nIGl0IGhhcmQgdG8gZGlzdGluZ3Vpc2ggbGVnaXRpbWF0ZSB1c2UgY2FzZXMgZnJvbSBpbGwgZm9ybWVkIG9uZXMuIFdlIGFyZQorCQkgICBtb3JlIGRpc2NyaW1pbmF0aW5nIG5vdyBhbmQgdGFnIGEgdHlwZSBhcyBiZWluZyBkaWFtb25kIG9ubHkgd2hlcmUgPD4gY2FuIGxlZ2FsbHkgb2NjdXIuIAorCQkgICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQ3OCNjMTEKKwkJKi8KIAkJcmV0dXJuIHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlOwogCX0gZWxzZSB7CiAJCVR5cGVSZWZlcmVuY2VbXVtdIHR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtudW1iZXJPZklkZW50aWZpZXJzXVtdOwpAQCAtODM3OSw5ICs4OTU3LDEyIEBACiAJCWludCBjdXJyZW50SWRlbnRpZmllcnNMZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoOwogCQl3aGlsZSAoaW5kZXggPiAwKSB7CiAJCQlpbnQgY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKLQkJCWlmIChjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCAhPSAwKSB7CisJCQlpZiAoY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGggPiAwKSB7CiAJCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aDsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIHR5cGVBcmd1bWVudHNbaW5kZXggLSAxXSA9IG5ldyBUeXBlUmVmZXJlbmNlW2N1cnJlbnRUeXBlQXJndW1lbnRzTGVuZ3RoXSwgMCwgY3VycmVudFR5cGVBcmd1bWVudHNMZW5ndGgpOworCQkJfSBlbHNlIGlmIChjdXJyZW50VHlwZUFyZ3VtZW50c0xlbmd0aCA8IDApIHsKKwkJCQkvLyBkaWFtb25kIGNhc2UgZm9yIHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZSAoamF2YS51dGlsLkFycmF5TGlzdDw+KQorCQkJCXR5cGVBcmd1bWVudHNbaW5kZXggLSAxXSA9IFR5cGVSZWZlcmVuY2UuTk9fVFlQRV9BUkdVTUVOVFM7CiAJCQl9CiAJCQlzd2l0Y2goY3VycmVudElkZW50aWZpZXJzTGVuZ3RoKSB7CiAJCQkJY2FzZSAxIDoKQEAgLTg0MDQsNiArODk4NSwxMSBAQAogCQlpZiAoZGltICE9IDApIHsKIAkJCXBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CiAJCX0KKwkJLyogV2UgdXNlZCB0byBlYWdlcmx5IG1hcmsgdGhlIFBRVFIgYXMgY29uc3RpdHV0aW5nIGRpYW1vbmQgdXNhZ2UgaWYgd2UgZW5jb3VudGVyZWQgPD4sIGJ1dCB0aGF0IGlzIHRvbyBlYWdlciBhbmQKKwkJICAgY29tcGxpY2F0ZXMgZXJyb3IgaGFuZGxpbmcgYnkgbWFraW5nIGl0IGhhcmQgdG8gZGlzdGluZ3Vpc2ggbGVnaXRpbWF0ZSB1c2UgY2FzZXMgZnJvbSBpbGwgZm9ybWVkIG9uZXMuIFdlIGFyZQorCQkgICBtb3JlIGRpc2NyaW1pbmF0aW5nIG5vdyBhbmQgdGFnIGEgdHlwZSBhcyBiZWluZyBkaWFtb25kIG9ubHkgd2hlcmUgPD4gY2FuIGxlZ2FsbHkgb2NjdXIuIAorCQkgICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQ3OCNjMTEKKwkJKi8KIAkJcmV0dXJuIHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlOwogCX0KIH0KQEAgLTg0MTQsMTAgKzkwMDAsMTAgQEAKIAlOYW1lUmVmZXJlbmNlIHJlZjsKIAlpZiAoKGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkKIAkJLy8gc2luZ2xlIHZhcmlhYmxlIHJlZmVyZW5jZQotCQlyZWYgPSAKKwkJcmVmID0KIAkJCW5ldyBTaW5nbGVOYW1lUmVmZXJlbmNlKAotCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sIAotCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dKTsgCisJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKKwkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7CiAJZWxzZQogCQkvL1F1YWxpZmllZCB2YXJpYWJsZSByZWZlcmVuY2UKIAkJewpAQCAtODQyNiw4ICs5MDEyLDggQEAKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCBwb3NpdGlvbnMsIDAsIGxlbmd0aCk7Ci0JCXJlZiA9IAotCQkJbmV3IFF1YWxpZmllZE5hbWVSZWZlcmVuY2UodG9rZW5zLCAKKwkJcmVmID0KKwkJCW5ldyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKHRva2VucywKIAkJCQlwb3NpdGlvbnMsCiAJCQkJKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLCAvLyBzb3VyY2VTdGFydAogCQkJCShpbnQpIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgbGVuZ3RoXSk7IC8vIHNvdXJjZUVuZApAQCAtODQ0NiwxMCArOTAzMiwxMCBAQAogCU5hbWVSZWZlcmVuY2UgcmVmOwogCWlmICgobGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS1dKSA9PSAxKSB7CiAJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKLQkJcmVmID0gCisJCXJlZiA9CiAJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSgKLQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLCAKLQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7IAorCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCisJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0pOwogCQlyZWYuYml0cyAmPSB+QVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOwogCQlyZWYuYml0cyB8PSBCaW5kaW5nLkxPQ0FMIHwgQmluZGluZy5GSUVMRDsKIAkJcmV0dXJuIHJlZjsKQEAgLTg0NjgsNyArOTA1NCw3IEBACiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCBwb3NpdGlvbnMsIDAsIGxlbmd0aCk7CiAJcmVmID0gbmV3IFF1YWxpZmllZE5hbWVSZWZlcmVuY2UoCiAJCQl0b2tlbnMsCi0JCQlwb3NpdGlvbnMsIAorCQkJcG9zaXRpb25zLAogCQkJKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLCAvLyBzb3VyY2VTdGFydAogCQkJKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyBsZW5ndGhdKTsgLy8gc291cmNlRW5kCiAJcmVmLmJpdHMgJj0gfkFTVE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSzsKQEAgLTg0ODIsNyArOTA2OCw3IEBACiAJdGhpcy5zY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKIH0KIHB1YmxpYyB2b2lkIGdvRm9yQmxvY2tTdGF0ZW1lbnRzT3JDYXRjaEhlYWRlcigpIHsKLQkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBibG9jayBzdGF0ZW1lbnRzIG9yIG1ldGhvZCBoZWFkZXJzIHBhcnNpbmcgCisJLy90ZWxscyB0aGUgc2Nhbm5lciB0byBnbyBmb3IgYmxvY2sgc3RhdGVtZW50cyBvciBtZXRob2QgaGVhZGVycyBwYXJzaW5nCiAKIAl0aGlzLmZpcnN0VG9rZW4gPSBUb2tlbk5hbWVNVUxUSVBMWTsKIAl0aGlzLnNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IGZhbHNlOwpAQCAtODUyMCw3ICs5MTA2LDcgQEAKIH0KIHB1YmxpYyB2b2lkIGdvRm9ySGVhZGVycygpewogCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGhlYWRlcnMgb25seSBwYXJzaW5nCi0JUmVjb3ZlcmVkVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMuY3VycmVudFJlY292ZXJ5VHlwZSgpOworCVJlY292ZXJlZFR5cGUgY3VycmVudFR5cGUgPSBjdXJyZW50UmVjb3ZlcnlUeXBlKCk7CiAJaWYoY3VycmVudFR5cGUgIT0gbnVsbCAmJiBjdXJyZW50VHlwZS5pbnNpZGVFbnVtQ29uc3RhbnRQYXJ0KSB7CiAJCXRoaXMuZmlyc3RUb2tlbiA9IFRva2VuTmFtZU5PVDsKIAl9IGVsc2UgewpAQCAtODU2NCw2ICs5MTUwLDQ0IEBACiAJdGhpcy5maXJzdFRva2VuID0gVG9rZW5OYW1lUExVUzsKIAl0aGlzLnNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHRydWU7CiB9CisvKioKKyAqIExvb2sgZm9yIGEgc3BlY2lmaWMgdGFnIGNvbW1lbnQgbGVhZGluZyBhIGdpdmVuIHNvdXJjZSByYW5nZSAoY29tbWVudCBsb2NhdGVkIGFmdGVyIGFueSBzdGF0ZW1lbnQgaW4gYXN0U3RhY2spCisgKiBAcGFyYW0gcmFuZ2VFbmQgaW50CisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzTGVhZGluZ1RhZ0NvbW1lbnQoY2hhcltdIGNvbW1lbnRQcmVmaXhUYWcsIGludCByYW5nZUVuZCkgeworCWludCBpQ29tbWVudCA9IHRoaXMuc2Nhbm5lci5jb21tZW50UHRyOworCWlmIChpQ29tbWVudCA8IDApIHJldHVybiBmYWxzZTsgLy8gbm8gY29tbWVudCBhdmFpbGFibGUKKwlpbnQgaVN0YXRlbWVudCA9IHRoaXMuYXN0TGVuZ3RoUHRyOworCWlmIChpU3RhdGVtZW50IDwgMCB8fCB0aGlzLmFzdExlbmd0aFN0YWNrW2lTdGF0ZW1lbnRdIDw9IDEpIHJldHVybiBmYWxzZTsgLy8gbm8gc3RhdGVtZW50IGF2YWlsYWJsZQorCS8vIEZhbGx0aHJvdWdoIGNvbW1lbnQgbXVzdCBiZSBsb2NhdGVkIGFmdGVyIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQKKwlBU1ROb2RlIGxhc3ROb2RlID0gdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJaW50IHJhbmdlU3RhcnQgPSBsYXN0Tm9kZS5zb3VyY2VFbmQ7CisJcHJldmlvdXNDb21tZW50OiBmb3IgKDsgaUNvbW1lbnQgPj0gMDsgaUNvbW1lbnQtLSkgeworCQlpbnQgY29tbWVudFN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbaUNvbW1lbnRdOworCQlpZiAoY29tbWVudFN0YXJ0IDwgMCkgY29tbWVudFN0YXJ0ID0gLWNvbW1lbnRTdGFydDsgLy8gbGluZSBjb21tZW50cyBoYXZlIG5lZ2F0aXZlIHN0YXJ0IHBvc2l0aW9ucworCQkvLyBpZ25vcmUgY29tbWVudHMgYmVmb3JlIHN0YXJ0CisJCWlmIChjb21tZW50U3RhcnQgPCByYW5nZVN0YXJ0KSByZXR1cm4gZmFsc2U7IC8vIG5vIG1vcmUgY29tbWVudHMgaW4gcmFuZ2UKKwkJLy8gaWdub3JlIGNvbW1lbnRzIGFmdGVyIGVuZAorCQlpZiAoY29tbWVudFN0YXJ0ID4gcmFuZ2VFbmQpIGNvbnRpbnVlIHByZXZpb3VzQ29tbWVudDsKKwkJLy8gZm91bmQgbGFzdCBjb21tZW50IGluIHJhbmdlIC0gb25seSBjaGVjayB0aGUgbGFzdCBjb21tZW50IGluIHJhbmdlCisJCWNoYXJbXSBzb3VyY2UgPSB0aGlzLnNjYW5uZXIuc291cmNlOworCQlpbnQgY2hhclBvcyA9IGNvbW1lbnRTdGFydCsyOyAvLyBza2lwIC8vIG9yIC8qCisJCS8vIHRhZyBjYW4gYmUgbGVhZGVkIGJ5IG9wdGlvbmFsIHNwYWNlcworCQlmb3IgKDsgY2hhclBvcyA8IHJhbmdlRW5kOyBjaGFyUG9zKyspIHsKKwkJCWNoYXIgYyA9IHNvdXJjZVtjaGFyUG9zXTsKKwkJCWlmIChjID49IFNjYW5uZXJIZWxwZXIuTUFYX09CVklPVVMgfHwgKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbY10gJiBTY2FubmVySGVscGVyLkNfSkxTX1NQQUNFKSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaVRhZyA9IDAsIGxlbmd0aCA9IGNvbW1lbnRQcmVmaXhUYWcubGVuZ3RoOyBpVGFnIDwgbGVuZ3RoOyBpVGFnKyssIGNoYXJQb3MrKykgeworCQkJaWYgKGNoYXJQb3MgPj0gcmFuZ2VFbmQpIHJldHVybiBmYWxzZTsgLy8gY29tbWVudCBpcyB0b28gc21hbGwgdG8gaG9zdCB0YWcKKwkJCWlmIChzb3VyY2VbY2hhclBvc10gIT0gY29tbWVudFByZWZpeFRhZ1tpVGFnXSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CiBwcm90ZWN0ZWQgdm9pZCBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpIHsKIAkvLyBBc3NpZ25tZW50IDo6PSBJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50CiAJLy8gZW5jb2RlZCBvcGVyYXRvciB3b3VsZCBiZTogdGhpcy5pbnRTdGFja1t0aGlzLmludFB0cl0KQEAgLTg1NzEsNyArOTE5NSw3IEBACiAJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gKEFycmF5SW5pdGlhbGl6ZXIpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0tXTsKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHIgLS0gOwogCS8vIHJlcG9ydCBhIHN5bnRheCBlcnJvciBhbmQgYWJvcnQgcGFyc2luZwotCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSBwcm9ibGVtUmVwb3J0ZXIoKS5hcnJheUNvbnN0YW50c09ubHlJbkFycmF5SW5pdGlhbGl6ZXJzKGFycmF5SW5pdGlhbGl6ZXIuc291cmNlU3RhcnQsIGFycmF5SW5pdGlhbGl6ZXIuc291cmNlRW5kKTsgCQorCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSBwcm9ibGVtUmVwb3J0ZXIoKS5hcnJheUNvbnN0YW50c09ubHlJbkFycmF5SW5pdGlhbGl6ZXJzKGFycmF5SW5pdGlhbGl6ZXIuc291cmNlU3RhcnQsIGFycmF5SW5pdGlhbGl6ZXIuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJdGhpcy5pbml0aWFsaXplKGZhbHNlKTsKQEAgLTg1ODMsNyArOTIwNyw3IEBACiAJdGhpcy5hc3RMZW5ndGhQdHIgPSAtMTsKIAl0aGlzLmV4cHJlc3Npb25QdHIgPSAtMTsKIAl0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHIgPSAtMTsKLQl0aGlzLmlkZW50aWZpZXJQdHIgPSAtMTsJCisJdGhpcy5pZGVudGlmaWVyUHRyID0gLTE7CiAJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyCT0gLTE7CiAJdGhpcy5pbnRQdHIgPSAtMTsKIAl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGUgPSAwXSA9IDA7IC8vIG5lZWQgdG8gcmVzZXQgZm9yIGZ1cnRoZXIgcmV1c2UKQEAgLTg1OTYsMTIgKzkyMjAsMTIgQEAKIAogCS8vcmVtb3ZlIG9iamVjdHMgZnJvbSBzdGFjayB0b28sIHdoaWxlIHRoZSBzYW1lIHBhcnNlci9jb21waWxlciBjb3VwbGUgaXMKIAkvL3JlLXVzZWQgYmV0d2VlbiB0d28gY29tcGlsYXRpb25zIC4uLi4KLQkKKwogCWludCBhc3RMZW5ndGggPSB0aGlzLmFzdFN0YWNrLmxlbmd0aDsKIAlpZiAodGhpcy5ub0FzdE5vZGVzLmxlbmd0aCA8IGFzdExlbmd0aCl7CiAJCXRoaXMubm9Bc3ROb2RlcyA9IG5ldyBBU1ROb2RlW2FzdExlbmd0aF07CiAJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNpemVkIEFTVCBzdGFja3MgOiAiKyBhc3RMZW5ndGgpOwotCQkKKwogCX0KIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubm9Bc3ROb2RlcywgMCwgdGhpcy5hc3RTdGFjaywgMCwgYXN0TGVuZ3RoKTsKIApAQCAtODYyMCw2ICs5MjQ0LDcgQEAKIAlmaW5hbCBib29sZWFuIGNoZWNrTkxTID0gdGhpcy5vcHRpb25zLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5Ob25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZTsKIAl0aGlzLmNoZWNrRXh0ZXJuYWxpemVTdHJpbmdzID0gY2hlY2tOTFM7CiAJdGhpcy5zY2FubmVyLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMgPSBpbml0aWFsaXplTkxTICYmIGNoZWNrTkxTOworCXRoaXMuc2Nhbm5lci5sYXN0UG9zaXRpb24gPSAtMTsKIAogCXJlc2V0TW9kaWZpZXJzKCk7CiAKQEAgLTg2MzUsNyArOTI2MCw4IEBACiAJdGhpcy5sYXN0SmF2YWRvY0VuZCA9IC0xOwogCXRoaXMubGlzdExlbmd0aCA9IDA7CiAJdGhpcy5saXN0VHlwZVBhcmFtZXRlckxlbmd0aCA9IDA7Ci0JCisJdGhpcy5sYXN0UG9zaXN0aW9uID0gLTE7CisKIAl0aGlzLnJCcmFjZVN0YXJ0ID0gMDsKIAl0aGlzLnJCcmFjZUVuZCA9IDA7CiAJdGhpcy5yQnJhY2VTdWNjZXNzb3JTdGFydCA9IDA7CkBAIC04NjQ2LDE0ICs5MjcyLDE0IEBACiB9CiBwdWJsaWMgdm9pZCBpbml0aWFsaXplU2Nhbm5lcigpewogCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAotCQlmYWxzZSAvKmNvbW1lbnQqLywgCi0JCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKLQkJZmFsc2UsIC8qIHdpbGwgYmUgc2V0IGluIGluaXRpYWxpemUoYm9vbGVhbikgKi8gCi0JCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCAvKnNvdXJjZUxldmVsKi8sIAotCQl0aGlzLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsIC8qY29tcGxpYW5jZUxldmVsKi8sIAorCQlmYWxzZSAvKmNvbW1lbnQqLywKKwkJZmFsc2UgLyp3aGl0ZXNwYWNlKi8sCisJCWZhbHNlLCAvKiB3aWxsIGJlIHNldCBpbiBpbml0aWFsaXplKGJvb2xlYW4pICovCisJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCAvKnNvdXJjZUxldmVsKi8sCisJCXRoaXMub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgLypjb21wbGlhbmNlTGV2ZWwqLywKIAkJdGhpcy5vcHRpb25zLnRhc2tUYWdzLyp0YXNrVGFncyovLAotCQl0aGlzLm9wdGlvbnMudGFza1ByaW9yaXRlcy8qdGFza1ByaW9yaXRpZXMqLywKLQkJdGhpcy5vcHRpb25zLmlzVGFza0Nhc2VTZW5zaXRpdmUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOyAKKwkJdGhpcy5vcHRpb25zLnRhc2tQcmlvcml0aWVzLyp0YXNrUHJpb3JpdGllcyovLAorCQl0aGlzLm9wdGlvbnMuaXNUYXNrQ2FzZVNlbnNpdGl2ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiB9CiBwdWJsaWMgdm9pZCBqdW1wT3Zlck1ldGhvZEJvZHkoKSB7CiAJLy9vbiBkaWV0IHBhcnNpbmcuLi4uLmRvIG5vdCBidWZmZXIgbWV0aG9kIHN0YXRlbWVudHMKQEAgLTg2NjcsMzUgKzkyOTMsMzcgQEAKIH0KIHByaXZhdGUgdm9pZCBqdW1wT3ZlclR5cGUoKXsKIAlpZiAodGhpcy5yZWNvdmVyZWRUeXBlcyAhPSBudWxsICYmIHRoaXMubmV4dFR5cGVTdGFydCA+IC0xICYmIHRoaXMubmV4dFR5cGVTdGFydCA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKLQkJCisKIAkJaWYgKERFQlVHX0FVVE9NQVRPTikgewogCQkJU3lzdGVtLm91dC5wcmludGxuKCJKdW1wICAgICAgICAgLSIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMucmVjb3ZlcmVkVHlwZXNbdGhpcy5yZWNvdmVyZWRUeXBlUHRyXTsKIAkJYm9vbGVhbiBpc0Fub255bW91cyA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uICE9IG51bGw7Ci0JCQotCQlpbnQgZW5kID0gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uOwotCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxLCBlbmQgIC0gMSk7CisKKwkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKKwkJdGhpcy5zY2FubmVyLmRpZXQgPSBmYWxzZTsgLy8gcXVpdCBqdW1waW5nIG92ZXIgbWV0aG9kIGJvZGllcworCiAJCWlmKCFpc0Fub255bW91cykgewogCQkJKChSZWNvdmVyeVNjYW5uZXIpdGhpcy5zY2FubmVyKS5zZXRQZW5kaW5nVG9rZW5zKG5ldyBpbnRbXXtUb2tlbk5hbWVTRU1JQ09MT04sIFRva2VuTmFtZWJyZWFrfSk7CiAJCX0gZWxzZSB7CiAJCQkoKFJlY292ZXJ5U2Nhbm5lcil0aGlzLnNjYW5uZXIpLnNldFBlbmRpbmdUb2tlbnMobmV3IGludFtde1Rva2VuTmFtZUlkZW50aWZpZXIsIFRva2VuTmFtZUVRVUFMLCBUb2tlbk5hbWVJZGVudGlmaWVyfSk7CiAJCX0KLQkJCisKIAkJdGhpcy5wZW5kaW5nUmVjb3ZlcmVkVHlwZSA9IHR5cGVEZWNsYXJhdGlvbjsKLQkJCisKIAkJdHJ5IHsKIAkJCXRoaXMuY3VycmVudFRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOwogCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKIAkJCS8vIGl0J3MgaW1wb3NzaWJsZSBiZWNhdXNlIHdlIGFkZGVkIHBlbmRpbmcgdG9rZW5zIGJlZm9yZQogCQl9Ci0JCQorCiAJCWlmKCsrdGhpcy5yZWNvdmVyZWRUeXBlUHRyIDwgdGhpcy5yZWNvdmVyZWRUeXBlcy5sZW5ndGgpIHsKIAkJCVR5cGVEZWNsYXJhdGlvbiBuZXh0VHlwZURlY2xhcmF0aW9uID0gdGhpcy5yZWNvdmVyZWRUeXBlc1t0aGlzLnJlY292ZXJlZFR5cGVQdHJdOwogCQkJdGhpcy5uZXh0VHlwZVN0YXJ0ID0KIAkJCQluZXh0VHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gPT0gbnVsbAotCQkJCQk/IG5leHRUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAKKwkJCQkJPyBuZXh0VHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQKIAkJCQkJCQk6IG5leHRUeXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbi5zb3VyY2VTdGFydDsKIAkJfSBlbHNlIHsKIAkJCXRoaXMubmV4dFR5cGVTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtODcwNiwxMSArOTMzNCwxMSBAQAogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHJldHVybjsgLy8gdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIHJlY292ZXJ5IGNvZGUKIAlmb3IgKGludCBpID0gdGhpcy5hc3RQdHI7IGkgPj0gMDsgaS0tKSB7CiAJCUFTVE5vZGUgbm9kZSA9IHRoaXMuYXN0U3RhY2tbaV07Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiAKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCiAJCQkJfHwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24KIAkJCQl8fCAobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbiAvLyBtYXJrIHR5cGUgZm9yIG5vdzogYWxsIGluaXRpYWxpemVycyB3aWxsIGJlIG1hcmtlZCB3aGVuIGFkZGVkIHRvIHRoaXMgdHlwZQogCQkJCQkJLy8gYW5kIGVuY2xvc2luZyB0eXBlIG11c3Qgbm90IGJlIGNsb3NlZCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc0ODUpCi0JCQkJCQkmJiAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkpIHsgCisJCQkJCQkmJiAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkpIHsKIAkJCW5vZGUuYml0cyB8PSBBU1ROb2RlLkhhc0xvY2FsVHlwZTsKIAkJCXJldHVybjsKIAkJfQpAQCAtODcyMSwxNSArOTM0OSw2IEBACiAJCSgoQVNUTm9kZSl0aGlzLnJlZmVyZW5jZUNvbnRleHQpLmJpdHMgfD0gQVNUTm9kZS5IYXNMb2NhbFR5cGU7CiAJfQogfQotcHJvdGVjdGVkIHZvaWQgbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUoVHlwZURlY2xhcmF0aW9uIHR5cGUpIHsKLQlpZiAodHlwZS5maWVsZHMgPT0gbnVsbCB8fCAodHlwZS5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpID09IDApIHJldHVybjsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZS5maWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQlpZiAoZmllbGQgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgewotCQkJZmllbGQuYml0cyB8PSBBU1ROb2RlLkhhc0xvY2FsVHlwZTsKLQkJfQotCX0KLX0KIAogLyoKICAqIE1vdmUgY2hlY2twb2ludCBsb2NhdGlvbiAoY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBtb3ZpbmcgaXQgYnkgb25lIHRva2VuKQpAQCAtODc0NCwxNCArOTM2MywxNCBAQAogCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gcG9zOwogCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBwb3M7CiAJdGhpcy5zY2FubmVyLmRpZXQgPSBmYWxzZTsgLy8gcXVpdCBqdW1waW5nIG92ZXIgbWV0aG9kIGJvZGllcwotCQorCiAJLyogaWYgYWJvdXQgdG8gcmVzdGFydCwgdGhlbiBubyBuZWVkIHRvIHNoaWZ0IHRva2VuICovCiAJaWYgKHRoaXMucmVzdGFydFJlY292ZXJ5KXsKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXRoaXMuc2Nhbm5lci5pbnNpZGVSZWNvdmVyeSA9IHRydWU7CQkKKwkJdGhpcy5zY2FubmVyLmluc2lkZVJlY292ZXJ5ID0gdHJ1ZTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyogcHJvdGVjdCBhZ2FpbnN0IHNoaWZ0aW5nIG9uIGFuIGludmFsaWQgdG9rZW4gKi8KIAl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSB0aGlzLm5leHRJZ25vcmVkVG9rZW47CiAJdGhpcy5uZXh0SWdub3JlZFRva2VuID0gLTE7CkBAIC04NzYyLDE5ICs5MzgxLDE5IEBACiAJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOyAvLyBvbiBmYWtlIGNvbXBsZXRpb24gaWRlbnRpZmllcgogCQkJCXRoaXMubmV4dElnbm9yZWRUb2tlbiA9IC0xOwogCQkJfQotCQkJCisKIAkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CiAJCQlwb3MgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQl9CiAJfSB3aGlsZSAodGhpcy5uZXh0SWdub3JlZFRva2VuIDwgMCk7Ci0JCisKIAlpZiAodGhpcy5uZXh0SWdub3JlZFRva2VuID09IFRva2VuTmFtZUVPRikgeyAvLyBubyBtb3JlIHJlY292ZXJ5IGFmdGVyIHRoaXMgcG9pbnQKIAkJaWYgKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUVPRikgeyAvLyBhbHJlYWR5IHRyaWVkIG9uZSBpdGVyYXRpb24gb24gRU9GCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCisKIAkvKiByZXNldCB0aGlzLnNjYW5uZXIgYWdhaW4gdG8gcHJldmlvdXMgY2hlY2twb2ludCBsb2NhdGlvbiovCiAJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBwb3M7CiAJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHBvczsKQEAgLTg3ODQsMjYgKzk0MDMsMjYgQEAKIAogLyoKICAJVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyB0aGUgY2hlY2twb2ludCBsb2NhdGlvbiBieSBvbmUgbGluZToKLQkgCisKIAlpbnQgcG9zID0gdGhpcy5sYXN0Q2hlY2tQb2ludDsKIAkvLyByZXNldCB0aGlzLnNjYW5uZXIsIGFuZCBtb3ZlIGNoZWNrcG9pbnQgYnkgb25lIHRva2VuCiAJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBwb3M7CiAJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHBvczsKIAl0aGlzLnNjYW5uZXIuZGlldCA9IGZhbHNlOyAvLyBxdWl0IGp1bXBpbmcgb3ZlciBtZXRob2QgYm9kaWVzCi0JCisKIAkvLyBpZiBhYm91dCB0byByZXN0YXJ0LCB0aGVuIG5vIG5lZWQgdG8gc2hpZnQgdG9rZW4KIAlpZiAodGhpcy5yZXN0YXJ0UmVjb3ZlcnkpewogCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLy8gcHJvdGVjdCBhZ2FpbnN0IHNoaWZ0aW5nIG9uIGFuIGludmFsaWQgdG9rZW4KIAl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSB0aGlzLm5leHRJZ25vcmVkVG9rZW47CiAJdGhpcy5uZXh0SWdub3JlZFRva2VuID0gLTE7Ci0JCisKIAlib29sZWFuIHdhc1Rva2VuaXppbmdXaGl0ZVNwYWNlID0gdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZTsKIAl0aGlzLnNjYW5uZXIudG9rZW5pemVXaGl0ZVNwYWNlID0gdHJ1ZTsKLQljaGVja3BvaW50TW92ZTogCisJY2hlY2twb2ludE1vdmU6CiAJCWRvIHsKIAkJCXRyeSB7CiAJCQkJdGhpcy5uZXh0SWdub3JlZFRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOwpAQCAtODgyMiw3ICs5NDQxLDcgQEAKIAkJCQkJCWlmKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pewogCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsgLy8gb24gZmFrZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKIAkJCQkJCX0KLQkJCQkJZGVmYXVsdDoJCQkJCQkKKwkJCQkJZGVmYXVsdDoKIAkJCQkJCXRoaXMubmV4dElnbm9yZWRUb2tlbiA9IC0xOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVG9rZW5OYW1lRU9GIDoKQEAgLTg4MzMsMTQgKzk0NTIsMTQgQEAKIAkJCX0KIAkJfSB3aGlsZSAodGhpcy5uZXh0SWdub3JlZFRva2VuIDwgMCk7CiAJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHdhc1Rva2VuaXppbmdXaGl0ZVNwYWNlOwotCQorCiAJaWYgKHRoaXMubmV4dElnbm9yZWRUb2tlbiA9PSBUb2tlbk5hbWVFT0YpIHsgLy8gbm8gbW9yZSByZWNvdmVyeSBhZnRlciB0aGlzIHBvaW50CiAJCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVFT0YpIHsgLy8gYWxyZWFkeSB0cmllZCBvbmUgaXRlcmF0aW9uIG9uIEVPRgogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfQogCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQorCiAJLy8gcmVzZXQgdGhpcy5zY2FubmVyIGFnYWluIHRvIHByZXZpb3VzIGNoZWNrcG9pbnQgbG9jYXRpb24KIAl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHBvczsKIAl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gcG9zOwpAQCAtODg1OCwxMSArOTQ3NywxMSBAQAogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCW0uYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJbS5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCXJldHVybiBtOwogfQpAQCAtODg3MiwxMSArOTQ5MSwxMSBAQAogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCW0uYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJbS5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCXJldHVybiBtOwogfQpAQCAtODg5MSw3ICs5NTEwLDcgQEAKIAkgKiBUaGUgdG9wIHR3byBsZW5ndGggYXJlIGZvciBleGFtcGxlOgogCSAqIC4uLiBwICAgbgogCSAqIGFuZCB5b3Ugd2FudCB0byByZXN1bHQgaW4gYSBsaXN0IGxpa2U6Ci0JICogLi4uIG4rcCAKKwkgKiAuLi4gbitwCiAJICogVGhpcyBtZWFucyB0aGF0IHRoZSBwIGNvdWxkIGJlIGVxdWFscyB0byAwIGluIGNhc2UgdGhlcmUgaXMgbm8gYXN0Tm9kZSBwdXNoZWQKIAkgKiBvbiB0aGUgdGhpcy5hc3RTdGFjay4KIAkgKiBMb29rIGF0IHRoZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgZm9yIGFuIGV4YW1wbGUuCkBAIC04OTAyLDIxICs5NTIxLDIxIEBACiB9CiAvKm1haW4gbG9vcCBvZiB0aGUgYXV0b21hdAogV2hlbiBhIHJ1bGUgaXMgcmVkdWNlZCwgdGhlIG1ldGhvZCBjb25zdW1lUnVsZShpbnQpIGlzIGNhbGxlZCB3aXRoIHRoZSBudW1iZXIKLW9mIHRoZSBjb25zdW1lZCBydWxlLiBXaGVuIGEgdGVybWluYWwgaXMgY29uc3VtZWQsIHRoZSBtZXRob2QgY29uc3VtZVRva2VuKGludCkgaXMgCitvZiB0aGUgY29uc3VtZWQgcnVsZS4gV2hlbiBhIHRlcm1pbmFsIGlzIGNvbnN1bWVkLCB0aGUgbWV0aG9kIGNvbnN1bWVUb2tlbihpbnQpIGlzCiBjYWxsZWQgaW4gb3JkZXIgdG8gcmVtZW1iZXIgKHdoZW4gbmVlZGVkKSB0aGUgY29uc3VtZWQgdG9rZW4gKi8KIC8vIChpbnQpYXNyW2FzaShhY3QpXQogLy8gbmFtZVtzeW1ib2xfaW5kZXhbY3VycmVudEtpbmRdXQogcHJvdGVjdGVkIHZvaWQgcGFyc2UoKSB7CiAJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIi0tIEVOVEVSIElOU0lERSBQQVJTRSBNRVRIT0QgLS0iKTsgIC8vJE5PTi1OTFMtMSQKLQkKKwogCWlmIChERUJVR19BVVRPTUFUT04pIHsKIAkJU3lzdGVtLm91dC5wcmludGxuKCItIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7ICAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJYm9vbGVhbiBpc0RpZXRQYXJzZSA9IHRoaXMuZGlldDsKIAlpbnQgb2xkRmlyc3RUb2tlbiA9IGdldEZpcnN0VG9rZW4oKTsKIAl0aGlzLmhhc0Vycm9yID0gZmFsc2U7Ci0JCisKIAl0aGlzLmhhc1JlcG9ydGVkRXJyb3IgPSBmYWxzZTsKIAlpbnQgYWN0ID0gU1RBUlRfU1RBVEU7CiAJdGhpcy5zdGF0ZVN0YWNrVG9wID0gLTE7CkBAIC04OTMzLDcgKzk1NTIsNyBAQAogCiAJCWFjdCA9IHRBY3Rpb24oYWN0LCB0aGlzLmN1cnJlbnRUb2tlbik7CiAJCWlmIChhY3QgPT0gRVJST1JfQUNUSU9OIHx8IHRoaXMucmVzdGFydFJlY292ZXJ5KSB7Ci0JCQkKKwogCQkJaWYgKERFQlVHX0FVVE9NQVRPTikgewogCQkJCWlmICh0aGlzLnJlc3RhcnRSZWNvdmVyeSkgewogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3RhcnQgICAgICAtICIpOyAvLyROT04tTkxTLTEkCkBAIC04OTQxLDEzICs5NTYwLDE0IEBACiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgICAgICAgIC0gIik7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAJCQl9Ci0JCQkKLQkJCWludCBlcnJvclBvcyA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisKKwkJCWludCBlcnJvclBvcyA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCQkJaWYgKCF0aGlzLmhhc1JlcG9ydGVkRXJyb3IpIHsKIAkJCQl0aGlzLmhhc0Vycm9yID0gdHJ1ZTsKIAkJCX0KKwkJCWludCBwcmV2aW91c1Rva2VuID0gdGhpcy5jdXJyZW50VG9rZW47CiAJCQlpZiAocmVzdW1lT25TeW50YXhFcnJvcigpKSB7Ci0JCQkJaWYgKGFjdCA9PSBFUlJPUl9BQ1RJT04pIHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24gPSBlcnJvclBvczsKKwkJCQlpZiAoYWN0ID09IEVSUk9SX0FDVElPTiAmJiBwcmV2aW91c1Rva2VuICE9IDApIHRoaXMubGFzdEVycm9yRW5kUG9zaXRpb24gPSBlcnJvclBvczsKIAkJCQlhY3QgPSBTVEFSVF9TVEFURTsKIAkJCQl0aGlzLnN0YXRlU3RhY2tUb3AgPSAtMTsKIAkJCQl0aGlzLmN1cnJlbnRUb2tlbiA9IGdldEZpcnN0VG9rZW4oKTsKQEAgLTg5NTgsNDkgKzk1NzgsNjEgQEAKIAkJfQogCQlpZiAoYWN0IDw9IE5VTV9SVUxFUykgewogCQkJdGhpcy5zdGF0ZVN0YWNrVG9wLS07Ci0JCQkKKwogCQkJaWYgKERFQlVHX0FVVE9NQVRPTikgewogCQkJCVN5c3RlbS5vdXQucHJpbnQoIlJlZHVjZSAgICAgICAtICIpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQkKKwogCQl9IGVsc2UgaWYgKGFjdCA+IEVSUk9SX0FDVElPTikgeyAvKiBzaGlmdC1yZWR1Y2UgKi8KIAkJCWNvbnN1bWVUb2tlbih0aGlzLmN1cnJlbnRUb2tlbik7Ci0JCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSB0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQkJCWJvb2xlYW4gb2xkVmFsdWUgPSB0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzOworCQkJCXRoaXMucmVjb3JkU3RyaW5nTGl0ZXJhbHMgPSBmYWxzZTsKKwkJCQlyZWNvdmVyeVRva2VuQ2hlY2soKTsKKwkJCQl0aGlzLnJlY29yZFN0cmluZ0xpdGVyYWxzID0gb2xkVmFsdWU7CisJCQl9CiAJCQl0cnkgewogCQkJCXRoaXMuY3VycmVudFRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CiAJCQkJaWYgKCF0aGlzLmhhc1JlcG9ydGVkRXJyb3IpewotCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLnNjYW5uZXJFcnJvcih0aGlzLCBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLnNjYW5uZXJFcnJvcih0aGlzLCBlLmdldE1lc3NhZ2UoKSk7CiAJCQkJCXRoaXMuaGFzUmVwb3J0ZWRFcnJvciA9IHRydWU7CiAJCQkJfQogCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCXRoaXMuY3VycmVudFRva2VuID0gMDsKIAkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7Ci0JCQl9CQkJCQorCQkJfQogCQkJaWYodGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCkgewotCQkJCXRoaXMuanVtcE92ZXJUeXBlKCk7CisJCQkJanVtcE92ZXJUeXBlKCk7CiAJCQl9CiAJCQlhY3QgLT0gRVJST1JfQUNUSU9OOwotCQkJCisKIAkJCWlmIChERUJVR19BVVRPTUFUT04pIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCJTaGlmdC9SZWR1Y2UgLSAoIiArIG5hbWVbdGVybWluYWxfaW5kZXhbdGhpcy5jdXJyZW50VG9rZW5dXSsiKSAiKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgCisJCQkJU3lzdGVtLm91dC5wcmludCgiU2hpZnQvUmVkdWNlIC0gKCIgKyBuYW1lW3Rlcm1pbmFsX2luZGV4W3RoaXMuY3VycmVudFRva2VuXV0rIikgIik7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCiAJCQl9Ci0JCQkKKwogCQl9IGVsc2UgewogCQkgICAgaWYgKGFjdCA8IEFDQ0VQVF9BQ1RJT04pIHsgLyogc2hpZnQgKi8KIAkJCQljb25zdW1lVG9rZW4odGhpcy5jdXJyZW50VG9rZW4pOwotCQkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHRoaXMucmVjb3ZlcnlUb2tlbkNoZWNrKCk7CisJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQkJCQlib29sZWFuIG9sZFZhbHVlID0gdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFsczsKKwkJCQkJdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyA9IGZhbHNlOworCQkJCQlyZWNvdmVyeVRva2VuQ2hlY2soKTsKKwkJCQkJdGhpcy5yZWNvcmRTdHJpbmdMaXRlcmFscyA9IG9sZFZhbHVlOworCQkJCX0KIAkJCQl0cnl7CiAJCQkJCXRoaXMuY3VycmVudFRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpewogCQkJCQlpZiAoIXRoaXMuaGFzUmVwb3J0ZWRFcnJvcil7Ci0JCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLnNjYW5uZXJFcnJvcih0aGlzLCBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5zY2FubmVyRXJyb3IodGhpcywgZS5nZXRNZXNzYWdlKCkpOwogCQkJCQkJdGhpcy5oYXNSZXBvcnRlZEVycm9yID0gdHJ1ZTsKIAkJCQkJfQogCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJdGhpcy5jdXJyZW50VG9rZW4gPSAwOwogCQkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7Ci0JCQkJfQkJCQkJCisJCQkJfQogCQkJCWlmKHRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHsKLQkJCQkJdGhpcy5qdW1wT3ZlclR5cGUoKTsKKwkJCQkJanVtcE92ZXJUeXBlKCk7CiAJCQkJfQogCQkJCWlmIChERUJVR19BVVRPTUFUT04pIHsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdCAgICAgICAgLSAoIiArIG5hbWVbdGVybWluYWxfaW5kZXhbdGhpcy5jdXJyZW50VG9rZW5dXSsiKSIpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJApAQCAtOTAwOSw3OSArOTY0MSw3OCBAQAogCQkJfQogCQkJYnJlYWsgUHJvY2Vzc1Rlcm1pbmFsczsKIAkJfQotCQkJCi0JCS8vIFByb2Nlc3NOb25UZXJtaW5hbHMgOiAKKworCQkvLyBQcm9jZXNzTm9uVGVybWluYWxzIDoKIAkJZG8geyAvKiByZWR1Y2UgKi8KLQkJCQorCiAJCQlpZiAoREVCVUdfQVVUT01BVE9OKSB7CiAJCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWVbbm9uX3Rlcm1pbmFsX2luZGV4W2xoc1thY3RdXV0pOwogCQkJfQotCQkJCisKIAkJCWNvbnN1bWVSdWxlKGFjdCk7CiAJCQl0aGlzLnN0YXRlU3RhY2tUb3AgLT0gKHJoc1thY3RdIC0gMSk7CiAJCQlhY3QgPSBudEFjdGlvbih0aGlzLnN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0sIGxoc1thY3RdKTsKLQkJCQotCQkJaWYgKERFQlVHX0FVVE9NQVRPTiAmJiBhY3QgPD0gTlVNX1JVTEVTKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiICAgICAgICAgICAgIC0gIik7ICAvLyROT04tTkxTLTEkCisKKwkJCWlmIChERUJVR19BVVRPTUFUT04pIHsKKwkJCQlpZiAoYWN0IDw9IE5VTV9SVUxFUykgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICAgICAgICAgICAgLSAiKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQl9CiAJCQl9Ci0JCQkKKwogCQl9IHdoaWxlIChhY3QgPD0gTlVNX1JVTEVTKTsKLQkJCisKIAkJaWYgKERFQlVHX0FVVE9NQVRPTikgewogCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7ICAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCisKIAlpZiAoREVCVUdfQVVUT01BVE9OKSB7CiAJCVN5c3RlbS5vdXQucHJpbnRsbigiLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAgLy8kTk9OLU5MUy0xJAogCX0KLQkKKwogCWVuZFBhcnNlKGFjdCk7CiAJLy8gcmVjb3JkIGFsbCBubHMgdGFncyBpbiB0aGUgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0CiAJZmluYWwgTkxTVGFnW10gdGFncyA9IHRoaXMuc2Nhbm5lci5nZXROTFNUYWdzKCk7CiAJaWYgKHRhZ3MgIT0gbnVsbCkgewogCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5ubHNUYWdzID0gdGFnczsKIAl9Ci0JCisKIAl0aGlzLnNjYW5uZXIuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyA9IGZhbHNlOwogCWlmICh0aGlzLnJlcG9ydFN5bnRheEVycm9ySXNSZXF1aXJlZCAmJiB0aGlzLmhhc0Vycm9yICYmICF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSB7CiAJCWlmKCF0aGlzLm9wdGlvbnMucGVyZm9ybVN0YXRlbWVudHNSZWNvdmVyeSkgewogCQkJcmVwb3J0U3ludGF4RXJyb3JzKGlzRGlldFBhcnNlLCBvbGRGaXJzdFRva2VuKTsKIAkJfSBlbHNlIHsKIAkJCVJlY292ZXJ5U2Nhbm5lckRhdGEgZGF0YSA9IHRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpLnJlY292ZXJ5U2Nhbm5lckRhdGE7Ci0JCQkKKwogCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgPT0gbnVsbCkgewogCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyID0gbmV3IFJlY292ZXJ5U2Nhbm5lcih0aGlzLnNjYW5uZXIsIGRhdGEpOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5zZXREYXRhKGRhdGEpOwogCQkJfQotCQkJCi0JCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5zZXRTb3VyY2Uoc2Nhbm5lci5zb3VyY2UpOworCisJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5zZXRTb3VyY2UodGhpcy5zY2FubmVyLnNvdXJjZSk7CiAJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5saW5lRW5kcyA9IHRoaXMuc2Nhbm5lci5saW5lRW5kczsKIAkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLmxpbmVQdHIgPSB0aGlzLnNjYW5uZXIubGluZVB0cjsKLQkJCQorCiAJCQlyZXBvcnRTeW50YXhFcnJvcnMoaXNEaWV0UGFyc2UsIG9sZEZpcnN0VG9rZW4pOwotCQkJCisKIAkJCWlmKGRhdGEgPT0gbnVsbCkgewogCQkJCXRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpLnJlY292ZXJ5U2Nhbm5lckRhdGEgPQogCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5nZXREYXRhKCk7CiAJCQl9Ci0JCQkKKwogCQkJaWYgKHRoaXMubWV0aG9kUmVjb3ZlcnlBY3RpdmF0ZWQgJiYgdGhpcy5vcHRpb25zLnBlcmZvcm1TdGF0ZW1lbnRzUmVjb3ZlcnkpIHsKIAkJCQl0aGlzLm1ldGhvZFJlY292ZXJ5QWN0aXZhdGVkID0gZmFsc2U7Ci0JCQkJdGhpcy5yZWNvdmVyU3RhdGVtZW50cygpOworCQkJCXJlY292ZXJTdGF0ZW1lbnRzKCk7CiAJCQkJdGhpcy5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCA9IHRydWU7CiAKIAkJCQl0aGlzLmxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiLS0gRVhJVCBGUk9NIFBBUlNFIE1FVEhPRCAtLSIpOyAgLy8kTk9OLU5MUy0xJAogfQotcHVibGljIHZvaWQgcGFyc2UoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewotCXBhcnNlKGNkLCB1bml0LCBmYWxzZSk7Ci19CiBwdWJsaWMgdm9pZCBwYXJzZShDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBib29sZWFuIHJlY29yZExpbmVTZXBhcmF0b3IpIHsKIAkvL29ubHkgcGFyc2UgdGhlIG1ldGhvZCBib2R5IG9mIGNkCiAJLy9maWxsIG91dCBpdHMgc3RhdGVtZW50cwpAQCAtOTA5Miw3ICs5NzIzLDcgQEAKIAlpZih0aGlzLm9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkpIHsKIAkJdGhpcy5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCA9IHRydWU7CiAJfQotCQorCiAJaW5pdGlhbGl6ZSgpOwogCWdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCk7CiAJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsKQEAgLTkxMDAsNyArOTczMSw3IEBACiAJfQogCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0rKzsKIAlwdXNoT25SZWFsQmxvY2tTdGFjaygwKTsKLQkKKwogCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNkOwogCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKIApAQCAtOTExNyw4ICs5NzQ4LDkgQEAKIAl9CiAKIAljaGVja05vbk5MU0FmdGVyQm9keUVuZChjZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCisKIAlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQljZC5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlpbml0aWFsaXplKCk7CiAJCXJldHVybjsKIAl9CkBAIC05MTI2LDQ0ICs5NzU4LDQ5IEBACiAJLy9zdGF0ZW1lbnRzCiAJY2QuZXhwbGljaXREZWNsYXJhdGlvbnMgPSB0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyLS1dOwogCWludCBsZW5ndGg7Ci0JaWYgKGFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJaWYgKHRoaXMuYXN0TGVuZ3RoUHRyID4gLTEgJiYgKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pICE9IDApIHsKIAkJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOwotCQlpZiAodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciArIDFdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCi0JCQkvL2F2b2lkIGEgaXNTb21lVGhpbmcgdGhhdCB3b3VsZCBvbmx5IGJlIHVzZWQgaGVyZSBCVVQgd2hhdCBpcyBmYXN0ZXIgYmV0d2VlbiB0d28gYWx0ZXJuYXRpdmVzID8KLQkJCXsKLQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5hc3RTdGFjaywgCi0JCQkJdGhpcy5hc3RQdHIgKyAyLCAKLQkJCQljZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGggLSAxXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoIC0gMSk7IAotCQkJY2QuY29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyICsgMV07Ci0JCX0gZWxzZSB7IC8vbmVlZCB0byBhZGQgZXhwbGljaXRseSB0aGUgc3VwZXIoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5hc3RTdGFjaywgCi0JCQkJdGhpcy5hc3RQdHIgKyAxLCAKLQkJCQljZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKLQkJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKKwkJaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzKSB7CisJCQlpZiAodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciArIDFdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCisJCQkJLy9hdm9pZCBhIGlzU29tZVRoaW5nIHRoYXQgd291bGQgb25seSBiZSB1c2VkIGhlcmUgQlVUIHdoYXQgaXMgZmFzdGVyIGJldHdlZW4gdHdvIGFsdGVybmF0aXZlcyA/CisJCQkJeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCXRoaXMuYXN0UHRyICsgMiwKKwkJCQkJY2Quc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoIC0gMV0sCisJCQkJCTAsCisJCQkJCWxlbmd0aCAtIDEpOworCQkJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9IChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0ciArIDFdOworCQkJfSBlbHNlIHsgLy9uZWVkIHRvIGFkZCBleHBsaWNpdGx5IHRoZSBzdXBlcigpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMuYXN0U3RhY2ssCisJCQkJCXRoaXMuYXN0UHRyICsgMSwKKwkJCQkJY2Quc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwKKwkJCQkJMCwKKwkJCQkJbGVuZ3RoKTsKKwkJCQljZC5jb25zdHJ1Y3RvckNhbGwgPSBTdXBlclJlZmVyZW5jZS5pbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCk7CisJCQl9CiAJCX0KIAl9IGVsc2UgewotCQljZC5jb25zdHJ1Y3RvckNhbGwgPSBTdXBlclJlZmVyZW5jZS5pbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCk7CisJCWlmICghdGhpcy5vcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcykgeworCQkJY2QuY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOworCQl9CiAJCWlmICghY29udGFpbnNDb21tZW50KGNkLmJvZHlTdGFydCwgY2QuYm9keUVuZCkpIHsKIAkJCWNkLmJpdHMgfD0gQVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwotCQl9CQkKKwkJfQogCX0KIAotCWlmIChjZC5jb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID09IDApIHsKLQkJY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IGNkLnNvdXJjZUVuZDsKLQkJY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gY2Quc291cmNlU3RhcnQ7CisJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBjZC5jb25zdHJ1Y3RvckNhbGw7CisJaWYgKGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsICE9IG51bGwgJiYgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID09IDApIHsKKwkJZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gY2Quc291cmNlRW5kOworCQlleHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IGNkLnNvdXJjZVN0YXJ0OwogCX0KIH0KIC8vIEEgUCBJCiAKIHB1YmxpYyB2b2lkIHBhcnNlKAotCUZpZWxkRGVjbGFyYXRpb24gZmllbGQsIAotCVR5cGVEZWNsYXJhdGlvbiB0eXBlLCAKKwlGaWVsZERlY2xhcmF0aW9uIGZpZWxkLAorCVR5cGVEZWNsYXJhdGlvbiB0eXBlLAogCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsCiAJY2hhcltdIGluaXRpYWxpemF0aW9uU291cmNlKSB7CiAJLy9vbmx5IHBhcnNlIHRoZSBpbml0aWFsaXphdGlvblNvdXJjZSBvZiB0aGUgZ2l2ZW4gZmllbGQKQEAgLTkxODgsMjAgKzk4MjUsMjEgQEAKIAl9CiAKIAlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQlmaWVsZC5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJZmllbGQuaW5pdGlhbGl6YXRpb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwotCQorCiAJLy8gbWFyayBmaWVsZCB3aXRoIGxvY2FsIHR5cGUgaWYgb25lIHdhcyBmb3VuZCBkdXJpbmcgcGFyc2luZwogCWlmICgodHlwZS5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDApIHsKIAkJZmllbGQuYml0cyB8PSBBU1ROb2RlLkhhc0xvY2FsVHlwZTsKLQl9CQorCX0KIH0KIC8vIEEgUCBJCiAKIHB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZSgKLQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIAorCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwKIAlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgewogCS8vIHBhcnNlcyBhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIG1hbmFnZXMgZXJyb3IgaGFuZGxpbmcgKGV2ZW4gYnVncy4uLi4pCiAKQEAgLTkyMTAsNyArOTg0OCw3IEBACiAvLyBBIFAgSQogCiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2UoCi0JSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCAKKwlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsCiAJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsCiAJaW50IHN0YXJ0LAogCWludCBlbmQpIHsKQEAgLTkyMjMsMTkgKzk4NjEsMTkgQEAKIAkJZ29Gb3JDb21waWxhdGlvblVuaXQoKTsKIAogCQkvKiB1bml0IGNyZWF0aW9uICovCi0JCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IAotCQkJdGhpcy5jb21waWxhdGlvblVuaXQgPSAKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0KKwkJCXRoaXMuY29tcGlsYXRpb25Vbml0ID0KIAkJCQluZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oCi0JCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLCAKLQkJCQkJY29tcGlsYXRpb25SZXN1bHQsIAorCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlciwKKwkJCQkJY29tcGlsYXRpb25SZXN1bHQsCiAJCQkJCTApOwogCiAJCS8qIHNjYW5uZXJzIGluaXRpYWxpemF0aW9uICovCiAJCWNoYXJbXSBjb250ZW50czsKIAkJdHJ5IHsKLQkJCWNvbnRlbnRzID0gc291cmNlVW5pdC5nZXRDb250ZW50cygpOworCQkJY29udGVudHMgPSB0aGlzLnJlYWRNYW5hZ2VyICE9IG51bGwgPyB0aGlzLnJlYWRNYW5hZ2VyLmdldENvbnRlbnRzKHNvdXJjZVVuaXQpIDogc291cmNlVW5pdC5nZXRDb250ZW50cygpOwogCQl9IGNhdGNoKEFib3J0Q29tcGlsYXRpb25Vbml0IGFib3J0RXhjZXB0aW9uKSB7Ci0JCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFJlYWRTb3VyY2UodGhpcy5jb21waWxhdGlvblVuaXQsIGFib3J0RXhjZXB0aW9uLCB0aGlzLm9wdGlvbnMudmVyYm9zZSk7CisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RSZWFkU291cmNlKHRoaXMuY29tcGlsYXRpb25Vbml0LCBhYm9ydEV4Y2VwdGlvbiwgdGhpcy5vcHRpb25zLnZlcmJvc2UpOwogCQkJY29udGVudHMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7IC8vIHByZXRlbmQgZW1wdHkgZnJvbSB0aGVyZW9uCiAJCX0KIAkJdGhpcy5zY2FubmVyLnNldFNvdXJjZShjb250ZW50cyk7CkBAIC05MjUzLDE1ICs5ODkxLDE1IEBACiAJCXVuaXQgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdDsKIAkJdGhpcy5jb21waWxhdGlvblVuaXQgPSBudWxsOyAvLyByZXNldCBwYXJzZXIKIAkJLy8gdGFnIHVuaXQgaGFzIGhhdmluZyByZWFkIGJvZGllcwotCQlpZiAoIXRoaXMuZGlldCkgdW5pdC5iaXRzIHw9IEFTVE5vZGUuSGFzQWxsTWV0aG9kQm9kaWVzOwkJCisJCWlmICghdGhpcy5kaWV0KSB1bml0LmJpdHMgfD0gQVNUTm9kZS5IYXNBbGxNZXRob2RCb2RpZXM7CiAJfQogCXJldHVybiB1bml0OwogfQogLy8gQSBQIEkKIAogcHVibGljIHZvaWQgcGFyc2UoCi0JSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIAotCVR5cGVEZWNsYXJhdGlvbiB0eXBlLCAKKwlJbml0aWFsaXplciBpbml0aWFsaXplciwKKwlUeXBlRGVjbGFyYXRpb24gdHlwZSwKIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CiAJLy9vbmx5IHBhcnNlIHRoZSBtZXRob2QgYm9keSBvZiBtZAogCS8vZmlsbCBvdXQgbWV0aG9kIHN0YXRlbWVudHMKQEAgLTkyNzIsMTIgKzk5MTAsMTIgQEAKIAlpZih0aGlzLm9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkpIHsKIAkJdGhpcy5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCA9IHRydWU7CiAJfQotCQorCiAJaW5pdGlhbGl6ZSgpOwogCWdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCk7CiAJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSsrOwogCXB1c2hPblJlYWxCbG9ja1N0YWNrKDApOwotCQorCiAJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdHlwZTsKIAl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7CiAKQEAgLTkyOTQsMjcgKzk5MzIsMjggQEAKIAl9CiAKIAljaGVja05vbk5MU0FmdGVyQm9keUVuZChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCisKIAlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQlpbml0aWFsaXplci5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlyZXR1cm47CiAJfQotCQorCiAJLy9yZWZpbGwgc3RhdGVtZW50cwogCWluaXRpYWxpemVyLmJsb2NrLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gdGhpcy5yZWFsQmxvY2tTdGFja1t0aGlzLnJlYWxCbG9ja1B0ci0tXTsKIAlpbnQgbGVuZ3RoOwotCWlmIChhc3RMZW5ndGhQdHIgPiAtMSAmJiAobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgPiAwKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hc3RTdGFjaywgKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLCBpbml0aWFsaXplci5ibG9jay5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAwLCBsZW5ndGgpOyAKKwlpZiAodGhpcy5hc3RMZW5ndGhQdHIgPiAtMSAmJiAobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgPiAwKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hc3RTdGFjaywgKHRoaXMuYXN0UHRyIC09IGxlbmd0aCkgKyAxLCBpbml0aWFsaXplci5ibG9jay5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAwLCBsZW5ndGgpOwogCX0gZWxzZSB7CiAJCS8vIGNoZWNrIHdoZXRoZXIgdGhpcyBibG9jayBhdCBsZWFzdCBjb250YWlucyBzb21lIGNvbW1lbnQgaW4gaXQKIAkJaWYgKCFjb250YWluc0NvbW1lbnQoaW5pdGlhbGl6ZXIuYmxvY2suc291cmNlU3RhcnQsIGluaXRpYWxpemVyLmJsb2NrLnNvdXJjZUVuZCkpIHsKIAkJCWluaXRpYWxpemVyLmJsb2NrLmJpdHMgfD0gQVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwogCQl9CiAJfQotCQorCiAJLy8gbWFyayBpbml0aWFsaXplciB3aXRoIGxvY2FsIHR5cGUgaWYgb25lIHdhcyBmb3VuZCBkdXJpbmcgcGFyc2luZwogCWlmICgodHlwZS5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDApIHsKIAkJaW5pdGlhbGl6ZXIuYml0cyB8PSBBU1ROb2RlLkhhc0xvY2FsVHlwZTsKLQl9CQorCX0KIH0KIC8vIEEgUCBJCiBwdWJsaWMgdm9pZCBwYXJzZShNZXRob2REZWNsYXJhdGlvbiBtZCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewpAQCAtOTM1MCwyOCArOTk4OSwzNCBAQAogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKIAkJdGhpcy5sYXN0QWN0ID0gRVJST1JfQUNUSU9OOwogCX0gZmluYWxseSB7Ci0JCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0tLTsJCQorCQl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdLS07CiAJCWlmKHRoaXMub3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5KSB7CiAJCQl0aGlzLm1ldGhvZFJlY292ZXJ5QWN0aXZhdGVkID0gb2xkTWV0aG9kUmVjb3ZlcnlBY3RpdmF0ZWQ7CiAJCX0KIAl9CiAKIAljaGVja05vbk5MU0FmdGVyQm9keUVuZChtZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCisKIAlpZiAodGhpcy5sYXN0QWN0ID09IEVSUk9SX0FDVElPTikgeworCQltZC5iaXRzIHw9IEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJLy9yZWZpbGwgc3RhdGVtZW50cwogCW1kLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gdGhpcy5yZWFsQmxvY2tTdGFja1t0aGlzLnJlYWxCbG9ja1B0ci0tXTsKIAlpbnQgbGVuZ3RoOwotCWlmIChhc3RMZW5ndGhQdHIgPiAtMSAmJiAobGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgIT0gMCkgewotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5hc3RTdGFjaywgCi0JCQkodGhpcy5hc3RQdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJbWQuc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCWlmICh0aGlzLmFzdExlbmd0aFB0ciA+IC0xICYmIChsZW5ndGggPSB0aGlzLmFzdExlbmd0aFN0YWNrW3RoaXMuYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWlmICh0aGlzLm9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzKSB7CisJCQkvLyBpZ25vcmUgc3RhdGVtZW50cworCQkJdGhpcy5hc3RQdHIgLT0gbGVuZ3RoOworCQl9IGVsc2UgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmFzdFN0YWNrLAorCQkJCSh0aGlzLmFzdFB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCQltZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKKwkJfQogCX0gZWxzZSB7CiAJCWlmICghY29udGFpbnNDb21tZW50KG1kLmJvZHlTdGFydCwgbWQuYm9keUVuZCkpIHsKIAkJCW1kLmJpdHMgfD0gQVNUTm9kZS5VbmRvY3VtZW50ZWRFbXB0eUJsb2NrOwpAQCAtOTM3OSw2ICsxMDAyNCw3IEBACiAJfQogfQogcHVibGljIEFTVE5vZGVbXSBwYXJzZUNsYXNzQm9keURlY2xhcmF0aW9ucyhjaGFyW10gc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJYm9vbGVhbiBvbGREaWV0ID0gdGhpcy5kaWV0OwogCS8qIGF1dG9tYXRvbiBpbml0aWFsaXphdGlvbiAqLwogCWluaXRpYWxpemUoKTsKIAlnb0ZvckNsYXNzQm9keURlY2xhcmF0aW9ucygpOwpAQCAtOTM5MCwzMSArMTAwMzYsMTExIEBACiAJCXRoaXMuamF2YWRvY1BhcnNlci5zY2FubmVyLnJlc2V0VG8ob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGggLSAxKTsKIAl9CiAKLQkvKiB0eXBlIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBwYXJzZWQgYXMgbWVtYmVyIHR5cGUgZGVjbGFyYXRpb24gKi8JCisJLyogdHlwZSBkZWNsYXJhdGlvbiBzaG91bGQgYmUgcGFyc2VkIGFzIG1lbWJlciB0eXBlIGRlY2xhcmF0aW9uICovCiAJdGhpcy5uZXN0ZWRUeXBlID0gMTsKIAogCS8qIHVuaXQgY3JlYXRpb24gKi8KLQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSB1bml0OworCVR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VDb250ZXh0VHlwZURlY2xhcmF0aW9uID0gbmV3IFR5cGVEZWNsYXJhdGlvbih1bml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwlyZWZlcmVuY2VDb250ZXh0VHlwZURlY2xhcmF0aW9uLm5hbWUgPSBVdGlsLkVNUFRZX1NUUklORy50b0NoYXJBcnJheSgpOworCXJlZmVyZW5jZUNvbnRleHRUeXBlRGVjbGFyYXRpb24uZmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bMF07CiAJdGhpcy5jb21waWxhdGlvblVuaXQgPSB1bml0OworCXVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzFdOworCXVuaXQudHlwZXNbMF0gPSByZWZlcmVuY2VDb250ZXh0VHlwZURlY2xhcmF0aW9uOworCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IHVuaXQ7CiAKIAkvKiBydW4gYXV0b21hdG9uICovCiAJdHJ5IHsKKwkJdGhpcy5kaWV0ID0gdHJ1ZTsKIAkJcGFyc2UoKTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CiAJCXRoaXMubGFzdEFjdCA9IEVSUk9SX0FDVElPTjsKKwl9IGZpbmFsbHkgeworCQl0aGlzLmRpZXQgPSBvbGREaWV0OwogCX0KIAorCUFTVE5vZGVbXSByZXN1bHQgPSBudWxsOwogCWlmICh0aGlzLmxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7Ci0JCXJldHVybiBudWxsOworCQlpZiAoIXRoaXMub3B0aW9ucy5wZXJmb3JtTWV0aG9kc0Z1bGxSZWNvdmVyeSAmJiAhdGhpcy5vcHRpb25zLnBlcmZvcm1TdGF0ZW1lbnRzUmVjb3ZlcnkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGNvbGxlY3QgYWxsIGJvZHkgZGVjbGFyYXRpb24gaW5zaWRlIHRoZSBjb21waWxhdGlvbiB1bml0IGV4Y2VwdCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorCQlmaW5hbCBMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUFTVFZpc2l0b3IgdmlzaXRvciA9IG5ldyBBU1RWaXNpdG9yKCkgeworCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJCQlpZiAoIW1ldGhvZERlY2xhcmF0aW9uLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKKwkJCQkJYm9keURlY2xhcmF0aW9ucy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJCQkJYm9keURlY2xhcmF0aW9ucy5hZGQoZmllbGREZWNsYXJhdGlvbik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQkJCWJvZHlEZWNsYXJhdGlvbnMuYWRkKG1lbWJlclR5cGVEZWNsYXJhdGlvbik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCQl1bml0Lmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gZmFsc2U7CisJCXVuaXQudHJhdmVyc2UodmlzaXRvciwgdW5pdC5zY29wZSk7CisJCXVuaXQuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQlyZXN1bHQgPSAoQVNUTm9kZVtdKSBib2R5RGVjbGFyYXRpb25zLnRvQXJyYXkobmV3IEFTVE5vZGVbYm9keURlY2xhcmF0aW9ucy5zaXplKCldKTsKKwl9IGVsc2UgeworCQlpbnQgYXN0TGVuZ3RoOworCQlpZiAodGhpcy5hc3RMZW5ndGhQdHIgPiAtMSAmJiAoYXN0TGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkJcmVzdWx0ID0gbmV3IEFTVE5vZGVbYXN0TGVuZ3RoXTsKKwkJCXRoaXMuYXN0UHRyIC09IGFzdExlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hc3RTdGFjaywgdGhpcy5hc3RQdHIgKyAxLCByZXN1bHQsIDAsIGFzdExlbmd0aCk7CisJCX0gZWxzZSB7CisJCQkvLyBlbXB0eSBjbGFzcyBib2R5IGRlY2xhcmF0aW9uIChsaWtlICc7JyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MDA3OSkuCisJCQlyZXN1bHQgPSBuZXcgQVNUTm9kZVswXTsKKwkJfQogCX0KLQlpbnQgYXN0TGVuZ3RoOwotCWlmIChhc3RMZW5ndGhQdHIgPiAtMSAmJiAoYXN0TGVuZ3RoID0gdGhpcy5hc3RMZW5ndGhTdGFja1t0aGlzLmFzdExlbmd0aFB0ci0tXSkgIT0gMCkgewotCQlBU1ROb2RlW10gcmVzdWx0ID0gbmV3IEFTVE5vZGVbYXN0TGVuZ3RoXTsKLQkJdGhpcy5hc3RQdHIgLT0gYXN0TGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXN0U3RhY2ssIHRoaXMuYXN0UHRyICsgMSwgcmVzdWx0LCAwLCBhc3RMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OworCWJvb2xlYW4gY29udGFpbnNJbml0aWFsaXplcnMgPSBmYWxzZTsKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gbnVsbDsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCS8vIHBhcnNlIGVhY2ggY2xhc3MgYm9keSBkZWNsYXJhdGlvbgorCQlBU1ROb2RlIG5vZGUgPSByZXN1bHRbaV07CisJCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCQkoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkucGFyc2VNZXRob2RzKHRoaXMsIHVuaXQpOworCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG5vZGUpLnBhcnNlU3RhdGVtZW50cyh0aGlzLCB1bml0KTsKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7CisJCQlzd2l0Y2goZmllbGREZWNsYXJhdGlvbi5nZXRLaW5kKCkpIHsKKwkJCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUjoKKwkJCQkJY29udGFpbnNJbml0aWFsaXplcnMgPSB0cnVlOworCQkJCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpIHsKKwkJCQkJCXR5cGVEZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNvbnRleHRUeXBlRGVjbGFyYXRpb247CisJCQkJCX0KKwkJCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPT0gbnVsbCkgeworCQkJCQkJdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uWzFdOworCQkJCQkJdHlwZURlY2xhcmF0aW9uLmZpZWxkc1swXSA9IGZpZWxkRGVjbGFyYXRpb247CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnQgbGVuZ3RoMiA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOworCQkJCQkJRmllbGREZWNsYXJhdGlvbltdIHRlbXAgPSBuZXcgRmllbGREZWNsYXJhdGlvbltsZW5ndGgyICsgMV07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVEZWNsYXJhdGlvbi5maWVsZHMsIDAsIHRlbXAsIDAsIGxlbmd0aDIpOworCQkJCQkJdGVtcFtsZW5ndGgyXSA9IGZpZWxkRGVjbGFyYXRpb247CisJCQkJCQl0eXBlRGVjbGFyYXRpb24uZmllbGRzID0gdGVtcDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoKChub2RlLmJpdHMgJiBBU1ROb2RlLkhhc1N5bnRheEVycm9ycykgIT0gMCkgJiYgKCF0aGlzLm9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkgJiYgIXRoaXMub3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5KSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KIAl9Ci0JcmV0dXJuIG51bGw7CisJaWYgKGNvbnRhaW5zSW5pdGlhbGl6ZXJzKSB7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZERlY2xhcmF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGZpZWxkRGVjbGFyYXRpb25zW2ldOworCQkJaW5pdGlhbGl6ZXIucGFyc2VTdGF0ZW1lbnRzKHRoaXMsIHR5cGVEZWNsYXJhdGlvbiAsIHVuaXQpOworCQkJaWYgKCgoaW5pdGlhbGl6ZXIuYml0cyAmIEFTVE5vZGUuSGFzU3ludGF4RXJyb3JzKSAhPSAwKSAmJiAoIXRoaXMub3B0aW9ucy5wZXJmb3JtTWV0aG9kc0Z1bGxSZWNvdmVyeSAmJiAhdGhpcy5vcHRpb25zLnBlcmZvcm1TdGF0ZW1lbnRzUmVjb3ZlcnkpKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKIH0KIHB1YmxpYyBFeHByZXNzaW9uIHBhcnNlRXhwcmVzc2lvbihjaGFyW10gc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CiAKQEAgLTk0NjksMjAgKzEwMTk1LDIwIEBACiBwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoUmVmZXJlbmNlQ29udGV4dCByYywgaW50IHN0YXJ0LCBpbnQgZW5kLCBUeXBlRGVjbGFyYXRpb25bXSB0eXBlcywgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewogCWJvb2xlYW4gb2xkU3RhdGVtZW50UmVjb3ZlcnlFbmFibGVkID0gdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZDsKIAl0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkID0gdHJ1ZTsKLQkKKwogCWluaXRpYWxpemUoKTsKLQkKKwogCWdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCk7CiAJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSsrOwogCXB1c2hPblJlYWxCbG9ja1N0YWNrKDApOwotCQorCiAJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7CiAKIAl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSByYzsKIAl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7Ci0JCisKIAl0aGlzLnBlbmRpbmdSZWNvdmVyZWRUeXBlID0gbnVsbDsKLQkKKwogCWlmKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgewogCQl0aGlzLnJlY292ZXJlZFR5cGVzID0gdHlwZXM7CiAJCXRoaXMucmVjb3ZlcmVkVHlwZVB0ciA9IDA7CkBAIC05NDk1LDIxICsxMDIyMSwyMSBAQAogCQl0aGlzLnJlY292ZXJlZFR5cGVQdHIgPSAtMTsKIAkJdGhpcy5uZXh0VHlwZVN0YXJ0ID0gLTE7CiAJfQotCQorCiAJdGhpcy5zY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CiAJLy8gcmVzZXQgdGhlIHNjYW5uZXIgdG8gcGFyc2VyIGZyb20geyBkb3duIHRvIH0KLQkKKwogCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLnNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uOwotCQotCQorCisKIAl0aGlzLnN0YXRlU3RhY2tUb3AgPSAtMTsKLQkJCisKIAl0cnkgewogCQlwYXJzZSgpOwogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKIAkJdGhpcy5sYXN0QWN0ID0gRVJST1JfQUNUSU9OOwogCX0gZmluYWxseSB7Ci0JCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0tLTsJCisJCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0tLTsKIAkJdGhpcy5yZWNvdmVyZWRUeXBlcyA9IG51bGw7CiAJCXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQgPSBvbGRTdGF0ZW1lbnRSZWNvdmVyeUVuYWJsZWQ7CiAJfQpAQCAtOTUzMyw3ICsxMDI1OSw3IEBACiAgKiBSZXR1cm5zIHRoaXMgcGFyc2VyJ3MgcHJvYmxlbSByZXBvcnRlciBpbml0aWFsaXplZCB3aXRoIGl0cyByZWZlcmVuY2UgY29udGV4dC4KICAqIEFsc28gaXQgaXMgYXNzdW1lZCB0aGF0IGEgcHJvYmxlbSBpcyBnb2luZyB0byBiZSByZXBvcnRlZCwgc28gaW5pdGlhbGl6ZXMKICAqIHRoZSBjb21waWxhdGlvbiByZXN1bHQncyBsaW5lIHBvc2l0aW9ucy4KLSAqIAorICoKICAqIEByZXR1cm4gUHJvYmxlbVJlcG9ydGVyCiAgKi8KIHB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCl7CkBAIC05NTYxLDcgKzEwMjg3LDcgQEAKIAl9CiAJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwogCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSA9Ci0JCSgoKGxvbmcpIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKSA8PCAzMikgKyAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwkJKCgobG9uZykgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pIDw8IDMyKSArICh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CiAKIAlzdGFja0xlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrLmxlbmd0aDsKIAlpZiAoKyt0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgPj0gc3RhY2tMZW5ndGgpIHsKQEAgLTk2NTIsNiArMTAzNzgsMjYgQEAKIAl9CiAJdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyXSA9IHBvczsKIH0KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayhpbnQgcG9zKSB7CisJaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2subGVuZ3RoOworCWlmICgrK3RoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2ssIDAsCisJCQl0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGggKyBHZW5lcmljc1N0YWNrSW5jcmVtZW50XSwgMCwKKwkJCXN0YWNrTGVuZ3RoKTsKKwl9CisJdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyXSA9IHBvczsKK30KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkdlbmVyaWNzTGVuZ3RoU3RhY2soaW50IHBvcykgeworCWludCBzdGFja0xlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFjay5sZW5ndGg7CisJaWYgKCsrdGhpcy5nZW5lcmljc0xlbmd0aFB0ciA+PSBzdGFja0xlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrLCAwLAorCQkJdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdLCAwLAorCQkJc3RhY2tMZW5ndGgpOworCX0KKwl0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0cl0gPSBwb3M7Cit9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25HZW5lcmljc1N0YWNrKEFTVE5vZGUgbm9kZSkgewogCS8qYWRkIGEgbmV3IG9iaiBvbiB0b3Agb2YgdGhlIGdlbmVyaWNzIHN0YWNrCiAJZ2VuZXJpY3NQdHIgcG9pbnRzIG9uIHRoZSB0b3AqLwpAQCAtOTY3NCwyNiArMTA0MjAsNiBAQAogCX0KIAl0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0cl0gPSAxOwogfQotcHJvdGVjdGVkIHZvaWQgcHVzaE9uR2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrKGludCBwb3MpIHsKLQlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjay5sZW5ndGg7Ci0JaWYgKCsrdGhpcy5nZW5lcmljc0lkZW50aWZpZXJzTGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjaywgMCwKLQkJCXRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aCArIEdlbmVyaWNzU3RhY2tJbmNyZW1lbnRdLCAwLAotCQkJc3RhY2tMZW5ndGgpOwotCX0KLQl0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHJdID0gcG9zOwotfQotcHJvdGVjdGVkIHZvaWQgcHVzaE9uR2VuZXJpY3NMZW5ndGhTdGFjayhpbnQgcG9zKSB7Ci0JaW50IHN0YWNrTGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrLmxlbmd0aDsKLQlpZiAoKyt0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyID49IHN0YWNrTGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2ssIDAsCi0JCQl0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgR2VuZXJpY3NTdGFja0luY3JlbWVudF0sIDAsCi0JCQlzdGFja0xlbmd0aCk7Ci0JfQotCXRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXSA9IHBvczsKLX0KIHByb3RlY3RlZCB2b2lkIHB1c2hPbkludFN0YWNrKGludCBwb3MpIHsKIAogCWludCBzdGFja0xlbmd0aCA9IHRoaXMuaW50U3RhY2subGVuZ3RoOwpAQCAtOTcwNiw3ICsxMDQzMiw3IEBACiAJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0cl0gPSBwb3M7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25SZWFsQmxvY2tTdGFjayhpbnQgaSl7Ci0JCisKIAlpbnQgc3RhY2tMZW5ndGggPSB0aGlzLnJlYWxCbG9ja1N0YWNrLmxlbmd0aDsKIAlpZiAoKyt0aGlzLnJlYWxCbG9ja1B0ciA+PSBzdGFja0xlbmd0aCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KApAQCAtOTcxOSw0MiArMTA0NDUsNDIgQEAKIHByb3RlY3RlZCB2b2lkIHJlY292ZXJTdGF0ZW1lbnRzKCkgewogCWNsYXNzIE1ldGhvZFZpc2l0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKIAkJcHVibGljIEFTVFZpc2l0b3IgdHlwZVZpc2l0b3I7Ci0JCQorCiAJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlOyAvLyB1c2VkIG9ubHkgZm9yIGluaXRpYWxpemVyCi0JCQorCiAJCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvblswXTsKIAkJaW50IHR5cGVQdHIgPSAtMTsKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCQl0eXBlUHRyID0gLTE7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBpbml0aWFsaXplciwgTWV0aG9kU2NvcGUgc2NvcGUpIHsKLQkJCXR5cGVQdHIgPSAtMTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCXR5cGVQdHIgPSAtMTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCXJldHVybiB0aGlzLnZpc2l0KHR5cGVEZWNsYXJhdGlvbik7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkJcmV0dXJuIHRoaXMudmlzaXQodHlwZURlY2xhcmF0aW9uKTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCQkJaWYodGhpcy50eXBlcy5sZW5ndGggPD0gKyt0aGlzLnR5cGVQdHIpIHsKLQkJCQlpbnQgbGVuZ3RoID0gdGhpcy50eXBlUHRyOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50eXBlcywgMCwgdGhpcy50eXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bbGVuZ3RoICogMiArIDFdLCAwLCBsZW5ndGgpOwotCQkJfQotCQkJdGhpcy50eXBlc1t0aGlzLnR5cGVQdHJdID0gdHlwZURlY2xhcmF0aW9uOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CiAJCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkJdGhpcy5lbmRWaXNpdE1ldGhvZChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBzY29wZSk7CisJCQllbmRWaXNpdE1ldGhvZChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBzY29wZSk7CisJCX0KKwkJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJCQlpZiAoaW5pdGlhbGl6ZXIuYmxvY2sgPT0gbnVsbCkgcmV0dXJuOworCQkJVHlwZURlY2xhcmF0aW9uW10gZm91bmRUeXBlcyA9IG51bGw7CisJCQlpbnQgbGVuZ3RoID0gMDsKKwkJCWlmKHRoaXMudHlwZVB0ciA+IC0xKSB7CisJCQkJbGVuZ3RoID0gdGhpcy50eXBlUHRyICsgMTsKKwkJCQlmb3VuZFR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvbltsZW5ndGhdOworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50eXBlcywgMCwgZm91bmRUeXBlcywgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCVJlZmVyZW5jZUNvbnRleHQgb2xkQ29udGV4dCA9IFBhcnNlci50aGlzLnJlZmVyZW5jZUNvbnRleHQ7CisJCQlQYXJzZXIudGhpcy5yZWNvdmVyeVNjYW5uZXIucmVzZXRUbyhpbml0aWFsaXplci5ib2R5U3RhcnQsIGluaXRpYWxpemVyLmJvZHlFbmQpOworCQkJU2Nhbm5lciBvbGRTY2FubmVyID0gUGFyc2VyLnRoaXMuc2Nhbm5lcjsKKwkJCVBhcnNlci50aGlzLnNjYW5uZXIgPSBQYXJzZXIudGhpcy5yZWNvdmVyeVNjYW5uZXI7CisJCQlwYXJzZVN0YXRlbWVudHMoCisJCQkJCXRoaXMuZW5jbG9zaW5nVHlwZSwKKwkJCQkJaW5pdGlhbGl6ZXIuYm9keVN0YXJ0LAorCQkJCQlpbml0aWFsaXplci5ib2R5RW5kLAorCQkJCQlmb3VuZFR5cGVzLAorCQkJCQlQYXJzZXIudGhpcy5jb21waWxhdGlvblVuaXQpOworCQkJUGFyc2VyLnRoaXMuc2Nhbm5lciA9IG9sZFNjYW5uZXI7CisJCQlQYXJzZXIudGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gb2xkQ29udGV4dDsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWZvdW5kVHlwZXNbaV0udHJhdmVyc2UodGhpcy50eXBlVmlzaXRvciwgc2NvcGUpOworCQkJfQogCQl9CiAJCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmVuZFZpc2l0TWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLCBzY29wZSk7CisJCQllbmRWaXNpdE1ldGhvZChtZXRob2REZWNsYXJhdGlvbiwgc2NvcGUpOwogCQl9CiAJCXByaXZhdGUgdm9pZCBlbmRWaXNpdE1ldGhvZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7CiAJCQlUeXBlRGVjbGFyYXRpb25bXSBmb3VuZFR5cGVzID0gbnVsbDsKQEAgLTk3NjgsNTEgKzEwNDk0LDUzIEBACiAJCQlQYXJzZXIudGhpcy5yZWNvdmVyeVNjYW5uZXIucmVzZXRUbyhtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQsIG1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQpOwogCQkJU2Nhbm5lciBvbGRTY2FubmVyID0gUGFyc2VyLnRoaXMuc2Nhbm5lcjsKIAkJCVBhcnNlci50aGlzLnNjYW5uZXIgPSBQYXJzZXIudGhpcy5yZWNvdmVyeVNjYW5uZXI7Ci0JCQlQYXJzZXIudGhpcy5wYXJzZVN0YXRlbWVudHMoCisJCQlwYXJzZVN0YXRlbWVudHMoCiAJCQkJCW1ldGhvZERlY2xhcmF0aW9uLAogCQkJCQltZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQsCiAJCQkJCW1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQsCiAJCQkJCWZvdW5kVHlwZXMsCi0JCQkJCWNvbXBpbGF0aW9uVW5pdCk7CisJCQkJCVBhcnNlci50aGlzLmNvbXBpbGF0aW9uVW5pdCk7CiAJCQlQYXJzZXIudGhpcy5zY2FubmVyID0gb2xkU2Nhbm5lcjsKIAkJCVBhcnNlci50aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBvbGRDb250ZXh0OwotCQkJCisKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlmb3VuZFR5cGVzW2ldLnRyYXZlcnNlKHR5cGVWaXNpdG9yLCBzY29wZSk7CisJCQkJZm91bmRUeXBlc1tpXS50cmF2ZXJzZSh0aGlzLnR5cGVWaXNpdG9yLCBzY29wZSk7CiAJCQl9CiAJCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb25bXSBmb3VuZFR5cGVzID0gbnVsbDsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJaWYodGhpcy50eXBlUHRyID4gLTEpIHsKLQkJCQlsZW5ndGggPSB0aGlzLnR5cGVQdHIgKyAxOwotCQkJCWZvdW5kVHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW2xlbmd0aF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVzLCAwLCBmb3VuZFR5cGVzLCAwLCBsZW5ndGgpOworCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJCXRoaXMudHlwZVB0ciA9IC0xOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJCQl0aGlzLnR5cGVQdHIgPSAtMTsKKwkJCWlmIChpbml0aWFsaXplci5ibG9jayA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbixDbGFzc1Njb3BlIHNjb3BlKSB7CisJCQl0aGlzLnR5cGVQdHIgPSAtMTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXByaXZhdGUgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCQlpZih0aGlzLnR5cGVzLmxlbmd0aCA8PSArK3RoaXMudHlwZVB0cikgeworCQkJCWludCBsZW5ndGggPSB0aGlzLnR5cGVQdHI7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVzLCAwLCB0aGlzLnR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvbltsZW5ndGggKiAyICsgMV0sIDAsIGxlbmd0aCk7CiAJCQl9Ci0JCQlSZWZlcmVuY2VDb250ZXh0IG9sZENvbnRleHQgPSBQYXJzZXIudGhpcy5yZWZlcmVuY2VDb250ZXh0OwotCQkJUGFyc2VyLnRoaXMucmVjb3ZlcnlTY2FubmVyLnJlc2V0VG8oaW5pdGlhbGl6ZXIuYm9keVN0YXJ0LCBpbml0aWFsaXplci5ib2R5RW5kKTsKLQkJCVNjYW5uZXIgb2xkU2Nhbm5lciA9IFBhcnNlci50aGlzLnNjYW5uZXI7Ci0JCQlQYXJzZXIudGhpcy5zY2FubmVyID0gUGFyc2VyLnRoaXMucmVjb3ZlcnlTY2FubmVyOwotCQkJUGFyc2VyLnRoaXMucGFyc2VTdGF0ZW1lbnRzKAotCQkJCQl0aGlzLmVuY2xvc2luZ1R5cGUsCi0JCQkJCWluaXRpYWxpemVyLmJvZHlTdGFydCwKLQkJCQkJaW5pdGlhbGl6ZXIuYm9keUVuZCwKLQkJCQkJZm91bmRUeXBlcywKLQkJCQkJY29tcGlsYXRpb25Vbml0KTsKLQkJCVBhcnNlci50aGlzLnNjYW5uZXIgPSBvbGRTY2FubmVyOwotCQkJUGFyc2VyLnRoaXMucmVmZXJlbmNlQ29udGV4dCA9IG9sZENvbnRleHQ7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlmb3VuZFR5cGVzW2ldLnRyYXZlcnNlKHR5cGVWaXNpdG9yLCBzY29wZSk7Ci0JCQl9CisJCQl0aGlzLnR5cGVzW3RoaXMudHlwZVB0cl0gPSB0eXBlRGVjbGFyYXRpb247CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQkJcmV0dXJuIHRoaXMudmlzaXQodHlwZURlY2xhcmF0aW9uKTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCQlyZXR1cm4gdGhpcy52aXNpdCh0eXBlRGVjbGFyYXRpb24pOwogCQl9CiAJfQogCWNsYXNzIFR5cGVWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAJCXB1YmxpYyBNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3I7Ci0JCQorCiAJCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvblswXTsKIAkJaW50IHR5cGVQdHIgPSAtMTsKLQkJCisKIAkJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgewogCQkJZW5kVmlzaXRUeXBlKCk7CiAJCX0KQEAgLTk4MjIsMTEgKzEwNTUwLDIxIEBACiAJCXByaXZhdGUgdm9pZCBlbmRWaXNpdFR5cGUoKSB7CiAJCQl0aGlzLnR5cGVQdHItLTsKIAkJfQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQlyZXR1cm4gdGhpcy52aXNpdCh0eXBlRGVjbGFyYXRpb24pOworCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJCWlmKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uaXNEZWZhdWx0Q29uc3RydWN0b3IoKSkgcmV0dXJuIGZhbHNlOworCisJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnRyYXZlcnNlKHRoaXMubWV0aG9kVmlzaXRvciwgc2NvcGUpOworCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCXJldHVybiB0aGlzLnZpc2l0KHR5cGVEZWNsYXJhdGlvbik7CisJCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIGluaXRpYWxpemVyLCBNZXRob2RTY29wZSBzY29wZSkgeworCQkJaWYgKGluaXRpYWxpemVyLmJsb2NrID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCXRoaXMubWV0aG9kVmlzaXRvci5lbmNsb3NpbmdUeXBlID0gdGhpcy50eXBlc1t0aGlzLnR5cGVQdHJdOworCQkJaW5pdGlhbGl6ZXIudHJhdmVyc2UodGhpcy5tZXRob2RWaXNpdG9yLCBzY29wZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJCW1ldGhvZERlY2xhcmF0aW9uLnRyYXZlcnNlKHRoaXMubWV0aG9kVmlzaXRvciwgc2NvcGUpOworCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXByaXZhdGUgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJCQlpZih0aGlzLnR5cGVzLmxlbmd0aCA8PSArK3RoaXMudHlwZVB0cikgewpAQCAtOTgzNiw0MCArMTA1NzQsMzMgQEAKIAkJCXRoaXMudHlwZXNbdGhpcy50eXBlUHRyXSA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkJaWYoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpKSByZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24udHJhdmVyc2UobWV0aG9kVmlzaXRvciwgc2NvcGUpOwotCQkJcmV0dXJuIGZhbHNlOworCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQlyZXR1cm4gdGhpcy52aXNpdCh0eXBlRGVjbGFyYXRpb24pOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIGluaXRpYWxpemVyLCBNZXRob2RTY29wZSBzY29wZSkgewotCQkJbWV0aG9kVmlzaXRvci5lbmNsb3NpbmdUeXBlID0gdGhpcy50eXBlc1t0eXBlUHRyXTsKLQkJCWluaXRpYWxpemVyLnRyYXZlcnNlKG1ldGhvZFZpc2l0b3IsIHNjb3BlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQkJbWV0aG9kRGVjbGFyYXRpb24udHJhdmVyc2UobWV0aG9kVmlzaXRvciwgc2NvcGUpOwotCQkJcmV0dXJuIGZhbHNlOworCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCQlyZXR1cm4gdGhpcy52aXNpdCh0eXBlRGVjbGFyYXRpb24pOwogCQl9CiAJfQotCQorCiAJTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKIAlUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBUeXBlVmlzaXRvcigpOwogCW1ldGhvZFZpc2l0b3IudHlwZVZpc2l0b3IgPSB0eXBlVmlzaXRvcjsKIAl0eXBlVmlzaXRvci5tZXRob2RWaXNpdG9yID0gbWV0aG9kVmlzaXRvcjsKLQkKKwogCWlmKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXRoaXMucmVmZXJlbmNlQ29udGV4dCkudHJhdmVyc2UobWV0aG9kVmlzaXRvciwgKENsYXNzU2NvcGUpbnVsbCk7CiAJfSBlbHNlIGlmKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewogCQlUeXBlRGVjbGFyYXRpb24gdHlwZUNvbnRleHQgPSAoVHlwZURlY2xhcmF0aW9uKXRoaXMucmVmZXJlbmNlQ29udGV4dDsKLQkJCisKIAkJaW50IGxlbmd0aCA9IHR5cGVDb250ZXh0LmZpZWxkcy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWZpbmFsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IHR5cGVDb250ZXh0LmZpZWxkc1tpXTsKIAkJCXN3aXRjaChmaWVsZERlY2xhcmF0aW9uLmdldEtpbmQoKSkgewogCQkJCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSOgorCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgZmllbGREZWNsYXJhdGlvbjsKKwkJCQkJaWYgKGluaXRpYWxpemVyLmJsb2NrID09IG51bGwpIGJyZWFrOwogCQkJCQltZXRob2RWaXNpdG9yLmVuY2xvc2luZ1R5cGUgPSB0eXBlQ29udGV4dDsKLQkJCQkJKChJbml0aWFsaXplcikgZmllbGREZWNsYXJhdGlvbikudHJhdmVyc2UobWV0aG9kVmlzaXRvciwgKE1ldGhvZFNjb3BlKW51bGwpOworCQkJCQlpbml0aWFsaXplci50cmF2ZXJzZShtZXRob2RWaXNpdG9yLCAoTWV0aG9kU2NvcGUpbnVsbCk7CiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC05ODc5LDE2ICsxMDYxMCwxOSBAQAogcHVibGljIHZvaWQgcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCkgewogCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudCAhPSBudWxsKSB7CiAJCWlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB7Ci0JCQkKKwogCQkJaW50IGVuZCA9ICgoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSl0aGlzLmN1cnJlbnRFbGVtZW50KS5sb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKIAkJCXRoaXMuY3VycmVudEVsZW1lbnQudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoZW5kKTsKIAkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudDsKIAkJfSBlbHNlIGlmKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZAogCQkJJiYgISh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpKSB7Ci0JCQkJCi0JCQlpbnQgZW5kID0gKChSZWNvdmVyZWRGaWVsZCl0aGlzLmN1cnJlbnRFbGVtZW50KS5maWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKLQkJCXRoaXMuY3VycmVudEVsZW1lbnQudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoZW5kKTsKLQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LnBhcmVudDsKKwkJCS8vIERvIG5vdCBtb3ZlIGZvY3VzIHRvIHBhcmVudCBpZiB3ZSBhcmUgc3RpbGwgaW5zaWRlIGFuIGFycmF5IGluaXRpYWxpemVyCisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMDg3IAorCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQuYnJhY2tldEJhbGFuY2UgPD0gMCkgeworCQkJCWludCBlbmQgPSAoKFJlY292ZXJlZEZpZWxkKXRoaXMuY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kOworCQkJCXRoaXMuY3VycmVudEVsZW1lbnQudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoZW5kKTsKKwkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5wYXJlbnQ7CisJCQl9CiAJCX0KIAl9CiB9CkBAIC05ODk3LDIyICsxMDYzMSwzNSBAQAogICovCiBwdWJsaWMgdm9pZCByZWNvdmVyeVRva2VuQ2hlY2soKSB7CiAJc3dpdGNoICh0aGlzLmN1cnJlbnRUb2tlbikgewotCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6IAorCQljYXNlIFRva2VuTmFtZVN0cmluZ0xpdGVyYWwgOgorCQkJaWYgKHRoaXMucmVjb3JkU3RyaW5nTGl0ZXJhbHMgJiYKKwkJCQkJdGhpcy5jaGVja0V4dGVybmFsaXplU3RyaW5ncyAmJgorCQkJCQl0aGlzLmxhc3RQb3Npc3Rpb24gPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uICYmCisJCQkJCSF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSB7CisJCQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gY3JlYXRlU3RyaW5nTGl0ZXJhbCgKKwkJCQkJdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZVN0cmluZygpLAorCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwKKwkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEsCisJCQkJCVV0aWwuZ2V0TGluZU51bWJlcih0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikpOworCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LnJlY29yZFN0cmluZ0xpdGVyYWwoc3RyaW5nTGl0ZXJhbCwgdGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6CiAJCQlSZWNvdmVyZWRFbGVtZW50IG5ld0VsZW1lbnQgPSBudWxsOwogCQkJaWYoIXRoaXMuaWdub3JlTmV4dE9wZW5pbmdCcmFjZSkgewogCQkJCW5ld0VsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LnVwZGF0ZU9uT3BlbmluZ0JyYWNlKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMSwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwogCQkJfQotCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CQkJCQorCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKXsgLy8gbnVsbCBtZWFucyBub3RoaW5nIGhhcHBlbmVkCiAJCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyBvcGVuaW5nIGJyYWNlIGRldGVjdGVkCiAJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG5ld0VsZW1lbnQ7CiAJCQl9CiAJCQlicmVhazsKLQkJCi0JCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDogCisKKwkJY2FzZSBUb2tlbk5hbWVSQlJBQ0UgOgogCQkJdGhpcy5yQnJhY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKIAkJCXRoaXMuckJyYWNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7Ci0JCQl0aGlzLmVuZFBvc2l0aW9uID0gdGhpcy5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5yQnJhY2VFbmQpOworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IGZsdXNoQ29tbWVudHNEZWZpbmVkUHJpb3JUbyh0aGlzLnJCcmFjZUVuZCk7CiAJCQluZXdFbGVtZW50ID0KIAkJCQl0aGlzLmN1cnJlbnRFbGVtZW50LnVwZGF0ZU9uQ2xvc2luZ0JyYWNlKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0aGlzLnJCcmFjZUVuZCk7CiAJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CkBAIC05OTI3LDEyICsxMDY3NCwxMiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoKIAkJCXRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKLQkJCXRoaXMuZW5kUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7IAotCQkJUmVjb3ZlcmVkVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMuY3VycmVudFJlY292ZXJ5VHlwZSgpOworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKKwkJCVJlY292ZXJlZFR5cGUgY3VycmVudFR5cGUgPSBjdXJyZW50UmVjb3ZlcnlUeXBlKCk7CiAJCQlpZihjdXJyZW50VHlwZSAhPSBudWxsKSB7CiAJCQkJY3VycmVudFR5cGUuaW5zaWRlRW51bUNvbnN0YW50UGFydCA9IGZhbHNlOwogCQkJfQotCQkJLy8gZmFsbCB0aHJvdWdoCisJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCWRlZmF1bHQgOiB7CiAJCQlpZiAodGhpcy5yQnJhY2VFbmQgPiB0aGlzLnJCcmFjZVN1Y2Nlc3NvclN0YXJ0ICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gIT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pewogCQkJCXRoaXMuckJyYWNlU3VjY2Vzc29yU3RhcnQgPSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKQEAgLTk5NTIsNyArMTA2OTksNyBAQAogCX0KIAl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zID0gdGhpcy5zY2FubmVyLmdldExpbmVFbmRzKCk7CiAJdGhpcy5zY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKLQkKKwogCWludCBzdGFydCA9IHRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb247CiAJaW50IGVuZCA9IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9PSBJbnRlZ2VyLk1BWF9WQUxVRSA/IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA6IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiAtIDE7CiAJaWYoaXNEaWV0UGFyc2UpIHsKQEAgLTk5NjAsNyArMTA3MDcsNyBAQAogCQlpbnRbXVtdIGludGVydmFsVG9Ta2lwID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5kaWFnbm9zZS5SYW5nZVV0aWwuY29tcHV0ZURpZXRSYW5nZSh0eXBlcyk7CiAJCURpYWdub3NlUGFyc2VyIGRpYWdub3NlUGFyc2VyID0gbmV3IERpYWdub3NlUGFyc2VyKHRoaXMsIG9sZEZpcnN0VG9rZW4sIHN0YXJ0LCBlbmQsIGludGVydmFsVG9Ta2lwWzBdLCBpbnRlcnZhbFRvU2tpcFsxXSwgaW50ZXJ2YWxUb1NraXBbMl0sIHRoaXMub3B0aW9ucyk7CiAJCWRpYWdub3NlUGFyc2VyLmRpYWdub3NlUGFyc2UoZmFsc2UpOwotCQkKKwogCQlyZXBvcnRTeW50YXhFcnJvcnNGb3JTa2lwcGVkTWV0aG9kKHR5cGVzKTsKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CiAJfSBlbHNlIHsKQEAgLTk5NzUsNyArMTA3MjIsNyBAQAogCQkJaWYobWVtYmVyVHlwZXMgIT0gbnVsbCkgewogCQkJCXJlcG9ydFN5bnRheEVycm9yc0ZvclNraXBwZWRNZXRob2QobWVtYmVyVHlwZXMpOwogCQkJfQotCQkJCisKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZXNbaV0ubWV0aG9kczsKIAkJCWlmKG1ldGhvZHMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgewpAQCAtOTk4OCwxMSArMTA3MzUsMTEgQEAKIAkJCQkJCQlEaWFnbm9zZVBhcnNlciBkaWFnbm9zZVBhcnNlciA9IG5ldyBEaWFnbm9zZVBhcnNlcih0aGlzLCBUb2tlbk5hbWVESVZJREUsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQsIHRoaXMub3B0aW9ucyk7CiAJCQkJCQkJZGlhZ25vc2VQYXJzZXIuZGlhZ25vc2VQYXJzZSh0aGlzLm9wdGlvbnMucGVyZm9ybVN0YXRlbWVudHNSZWNvdmVyeSk7CiAJCQkJCQl9Ci0JCQkJCQkKKwogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlc1tpXS5maWVsZHM7CiAJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKIAkJCQlpbnQgbGVuZ3RoID0gZmllbGRzLmxlbmd0aDsKQEAgLTEwMDIzLDcgKzEwNzcwLDcgQEAKIAl0aGlzLmFzdExlbmd0aFB0ciA9IC0xOwogCXRoaXMuZXhwcmVzc2lvblB0ciA9IC0xOwogCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ciA9IC0xOwotCXRoaXMuaWRlbnRpZmllclB0ciA9IC0xOwkKKwl0aGlzLmlkZW50aWZpZXJQdHIgPSAtMTsKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIJPSAtMTsKIAl0aGlzLmludFB0ciA9IC0xOwogCXRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZSA9IDBdID0gMDsgLy8gbmVlZCB0byByZXNldCBmb3IgZnVydGhlciByZXVzZQpAQCAtMTAwMzMsNyArMTA3ODAsNyBAQAogCXRoaXMucmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydCA9IDA7CiAJdGhpcy5saXN0TGVuZ3RoID0gMDsKIAl0aGlzLmxpc3RUeXBlUGFyYW1ldGVyTGVuZ3RoID0gMDsKLQkKKwogCXRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFB0ciA9IC0xOwogCXRoaXMuZ2VuZXJpY3NMZW5ndGhQdHIgPSAtMTsKIAl0aGlzLmdlbmVyaWNzUHRyID0gLTE7CkBAIC0xMDA0NywzNiArMTA3OTQsMzYgQEAKICAqLwogcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lQWZ0ZXJSZWNvdmVyeSgpIHsKIAlpZighdGhpcy5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCAmJiAhdGhpcy5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCkgewotCQkKLQkJLy8gcmVzZXQgaW50ZXJuYWwgc3RhY2tzIAotCQl0aGlzLnJlc2V0U3RhY2tzKCk7Ci0JCXRoaXMucmVzZXRNb2RpZmllcnMoKTsKLQkJCisKKwkJLy8gcmVzZXQgaW50ZXJuYWwgc3RhY2tzCisJCXJlc2V0U3RhY2tzKCk7CisJCXJlc2V0TW9kaWZpZXJzKCk7CisKIAkJLyogYXR0ZW1wdCB0byBtb3ZlIGNoZWNrcG9pbnQgbG9jYXRpb24gKi8KLQkJaWYgKCF0aGlzLm1vdmVSZWNvdmVyeUNoZWNrcG9pbnQoKSkgeworCQlpZiAoIW1vdmVSZWNvdmVyeUNoZWNrcG9pbnQoKSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCisKIAkJLy8gb25seSBsb29rIGZvciBoZWFkZXJzCiAJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbil7CiAJCQlnb0ZvckhlYWRlcnMoKTsKIAkJCXRoaXMuZGlldCA9IHRydWU7IC8vIHBhc3NlZCB0aGlzIHBvaW50LCB3aWxsIG5vdCBjb25zaWRlciBtZXRob2QgYm9kaWVzCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQkvLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZXN0YXJ0CiAJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgaWYoIXRoaXMuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHsKLQkJCi0JCS8vIHJlc2V0IGludGVybmFsIHN0YWNrcyAKLQkJdGhpcy5yZXNldFN0YWNrcygpOwotCQl0aGlzLnJlc2V0TW9kaWZpZXJzKCk7Ci0JCQorCisJCS8vIHJlc2V0IGludGVybmFsIHN0YWNrcworCQlyZXNldFN0YWNrcygpOworCQlyZXNldE1vZGlmaWVycygpOworCiAJCS8qIGF0dGVtcHQgdG8gbW92ZSBjaGVja3BvaW50IGxvY2F0aW9uICovCi0JCWlmICghdGhpcy5tb3ZlUmVjb3ZlcnlDaGVja3BvaW50KCkpIHsKKwkJaWYgKCFtb3ZlUmVjb3ZlcnlDaGVja3BvaW50KCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQkKKwogCQkvLyBvbmx5IGxvb2sgZm9yIGhlYWRlcnMKIAkJZ29Gb3JIZWFkZXJzKCk7CiAJCXJldHVybiB0cnVlOwpAQCAtMTAwODUsOCArMTA4MzIsNiBAQAogCX0KIH0KIHByb3RlY3RlZCBib29sZWFuIHJlc3VtZU9uU3ludGF4RXJyb3IoKSB7Ci0JdGhpcy5jaGVja0V4dGVybmFsaXplU3RyaW5ncyA9IGZhbHNlOwotCXRoaXMuc2Nhbm5lci5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gZmFsc2U7CiAJLyogcmVxdWVzdCByZWNvdmVyeSBpbml0aWFsaXphdGlvbiAqLwogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwpewogCQkvLyBSZXNldCBqYXZhZG9jIGJlZm9yZSByZXN0YXJ0IHBhcnNpbmcgYWZ0ZXIgcmVjb3ZlcnkKQEAgLTEwMDk0LDIyICsxMDgzOSwzNCBAQAogCiAJCS8vIGRvIG5vdCBpbnZlc3RpZ2F0ZSBkZWVwZXIgaW4gc3RhdGVtZW50IHJlY292ZXJ5CiAJCWlmICh0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSByZXR1cm4gZmFsc2U7Ci0JCQorCiAJCS8vIGJ1aWxkIHNvbWUgcmVjb3ZlcmVkIGVsZW1lbnRzCi0JCXRoaXMuY3VycmVudEVsZW1lbnQgPSBidWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCk7IAorCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gYnVpbGRJbml0aWFsUmVjb3ZlcnlTdGF0ZSgpOwogCX0KIAkvKiBkbyBub3QgaW52ZXN0aWdhdGUgZGVlcGVyIGluIHJlY292ZXJ5IHdoZW4gbm8gcmVjb3ZlcmVkIGVsZW1lbnQgKi8KIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCisKIAkvKiBtYW51YWwgZm9yY2VkIHJlY292ZXJ5IHJlc3RhcnQgLSBhZnRlciBoZWFkZXJzICovCiAJaWYgKHRoaXMucmVzdGFydFJlY292ZXJ5KXsKIAkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSBmYWxzZTsKIAl9CiAJLyogdXBkYXRlIHJlY292ZXJ5IHN0YXRlIHdpdGggY3VycmVudCBlcnJvciBzdGF0ZSBvZiB0aGUgcGFyc2VyICovCi0JdGhpcy51cGRhdGVSZWNvdmVyeVN0YXRlKCk7Ci0JCisJdXBkYXRlUmVjb3ZlcnlTdGF0ZSgpOworCWlmIChnZXRGaXJzdFRva2VuKCkgPT0gVG9rZW5OYW1lQU5EKSB7CisJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5yZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0KCkpOworCQkJdHlwZURlY2xhcmF0aW9uLm5hbWUgPSBVdGlsLkVNUFRZX1NUUklORy50b0NoYXJBcnJheSgpOworCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKHR5cGVEZWNsYXJhdGlvbiwgMCk7CisJCX0KKwl9CisKKwlpZiAodGhpcy5sYXN0UG9zaXN0aW9uIDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgeworCQl0aGlzLmxhc3RQb3Npc3Rpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQl0aGlzLnNjYW5uZXIubGFzdFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwl9CisKIAkvKiBhdHRlbXB0IHRvIHJlc2V0IHN0YXRlIGluIG9yZGVyIHRvIHJlc3VtZSB0byBwYXJzZSBsb29wICovCi0JcmV0dXJuIHRoaXMucmVzdW1lQWZ0ZXJSZWNvdmVyeSgpOworCXJldHVybiByZXN1bWVBZnRlclJlY292ZXJ5KCk7CiB9CiBwdWJsaWMgdm9pZCBzZXRNZXRob2RzRnVsbFJlY292ZXJ5KGJvb2xlYW4gZW5hYmxlZCkgewogCXRoaXMub3B0aW9ucy5wZXJmb3JtTWV0aG9kc0Z1bGxSZWNvdmVyeSA9IGVuYWJsZWQ7CkBAIC0xMDE1NCwxMyArMTA5MTEsMTMgQEAKIAlzID0gcyArICJ9XG4iOyAvLyROT04tTkxTLTEkCiAKIAlzID0gcyArICJleHByZXNzaW9uUHRyIDogaW50ID0gIiArIFN0cmluZy52YWx1ZU9mKHRoaXMuZXhwcmVzc2lvblB0cikgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKKwogCXMgPSBzICsgImdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhTdGFjayA6IGludFsiKyh0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHIgKyAxKSsiXSA9IHsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAlmb3IgKGludCBpID0gMDsgaSA8PSB0aGlzLmdlbmVyaWNzSWRlbnRpZmllcnNMZW5ndGhQdHI7IGkrKykgewogCQlzID0gcyArIHRoaXMuZ2VuZXJpY3NJZGVudGlmaWVyc0xlbmd0aFN0YWNrW2ldICsgIiwiOyAvLyROT04tTkxTLTEkCiAJfQogCXMgPSBzICsgIn1cbiI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXMgPSBzICsgImdlbmVyaWNzTGVuZ3RoU3RhY2sgOiBpbnRbIisodGhpcy5nZW5lcmljc0xlbmd0aFB0ciArIDEpKyJdID0geyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZ2VuZXJpY3NMZW5ndGhQdHI7IGkrKykgewogCQlzID0gcyArIHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJApAQCAtMTAxODMsOSArMTA5NDAsOSBAQAogCiAJLyogY2hlY2sgYW5kIHVwZGF0ZSByZWNvdmVyZWQgc3RhdGUgYmFzZWQgb24gY3VycmVudCB0b2tlbiwKIAkJdGhpcyBhY3Rpb24gaXMgYWxzbyBwZXJmb3JtZWQgd2hlbiBzaGlmdGluZyB0b2tlbiBhZnRlciByZWNvdmVyeQotCQlnb3QgYWN0aXZhdGVkIG9uY2UuIAorCQlnb3QgYWN0aXZhdGVkIG9uY2UuCiAJKi8KLQl0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCXJlY292ZXJ5VG9rZW5DaGVjaygpOwogfQogcHJvdGVjdGVkIHZvaWQgdXBkYXRlU291cmNlRGVjbGFyYXRpb25QYXJ0cyhpbnQgdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIpIHsKIAkvL2ZpZWxkcyBpcyBhIGRlZmluaXRpb24gb2YgZmllbGRzIHRoYXQgYXJlIGdyb3VwZWQgdG9nZXRoZXIgbGlrZSBpbgpAQCAtMTAxOTMsOCArMTA5NTAsOCBAQAogCS8vd2hpY2ggcmVzdWx0cyBpbnRvIDMgZmllbGRzLgogCiAJRmllbGREZWNsYXJhdGlvbiBmaWVsZDsKLQlpbnQgZW5kVHlwZURlY2xhcmF0aW9uUG9zaXRpb24gPSAKLQkJLTEgKyB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIgKyAxXS5zb3VyY2VTdGFydDsgCisJaW50IGVuZFR5cGVEZWNsYXJhdGlvblBvc2l0aW9uID0KKwkJLTEgKyB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIgKyAxXS5zb3VyY2VTdGFydDsKIAlmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyIC0gMTsgaSsrKSB7CiAJCS8vbGFzdCBvbmUgaXMgc3BlY2lhbChzZWUgYmVsb3cpCiAJCWZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLSBpIC0gMV07CkBAIC0xMDIwMiw4ICsxMDk1OSw4IEBACiAJCWZpZWxkLmVuZFBhcnQyUG9zaXRpb24gPSAtMSArIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHIgLSBpXS5zb3VyY2VTdGFydDsKIAl9CiAJLy9sYXN0IG9uZQotCShmaWVsZCA9IChGaWVsZERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSkuZW5kUGFydDFQb3NpdGlvbiA9IAotCQllbmRUeXBlRGVjbGFyYXRpb25Qb3NpdGlvbjsgCisJKGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKS5lbmRQYXJ0MVBvc2l0aW9uID0KKwkJZW5kVHlwZURlY2xhcmF0aW9uUG9zaXRpb247CiAJZmllbGQuZW5kUGFydDJQb3NpdGlvbiA9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kOwogCiB9CkBAIC0xMDIxMiw3ICsxMDk2OSw3IEBACiAKIAkvL3RoaXMuaW50U3RhY2sgOiBpbnQgaW50CiAJLy8tLT4KLQkvL3RoaXMuaW50U3RhY2sgOiAKKwkvL3RoaXMuaW50U3RhY2sgOgogCiAJZXhwLnNvdXJjZUVuZCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CiAJZXhwLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXJCYXNpY0luZm9ybWF0aW9uLmphdmEKaW5kZXggMjA1YzZhMy4uM2M1YzJiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXJCYXNpY0luZm9ybWF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXJCYXNpY0luZm9ybWF0aW9uLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNiwyMCArMTYsMjAgQEAKIAogCWludCBFUlJPUl9TWU1CT0wgPSAxMTAsCiAJCU1BWF9OQU1FX0xFTkdUSCA9IDQxLAotCQlOVU1fU1RBVEVTID0gOTU2LAorCQlOVU1fU1RBVEVTID0gMTAwMiwKIAogCQlOVF9PRkZTRVQgPSAxMTAsCi0JCVNDT1BFX1VCT1VORCA9IDEzMSwKLQkJU0NPUEVfU0laRSA9IDEzMiwKLQkJTEFfU1RBVEVfT0ZGU0VUID0gMTI3OTQsCisJCVNDT1BFX1VCT1VORCA9IDEzNywKKwkJU0NPUEVfU0laRSA9IDEzOCwKKwkJTEFfU1RBVEVfT0ZGU0VUID0gMTI0NDYsCiAJCU1BWF9MQSA9IDEsCi0JCU5VTV9SVUxFUyA9IDY5NSwKKwkJTlVNX1JVTEVTID0gNzIyLAogCQlOVU1fVEVSTUlOQUxTID0gMTEwLAotCQlOVU1fTk9OX1RFUk1JTkFMUyA9IDMwOSwKLQkJTlVNX1NZTUJPTFMgPSA0MTksCi0JCVNUQVJUX1NUQVRFID0gNzY3LAotCQlFT0ZUX1NZTUJPTCA9IDY4LAotCQlFT0xUX1NZTUJPTCA9IDY4LAotCQlBQ0NFUFRfQUNUSU9OID0gMTI3OTMsCi0JCUVSUk9SX0FDVElPTiA9IDEyNzk0OworCQlOVU1fTk9OX1RFUk1JTkFMUyA9IDMyMywKKwkJTlVNX1NZTUJPTFMgPSA0MzMsCisJCVNUQVJUX1NUQVRFID0gMTA4NCwKKwkJRU9GVF9TWU1CT0wgPSA2OSwKKwkJRU9MVF9TWU1CT0wgPSA2OSwKKwkJQUNDRVBUX0FDVElPTiA9IDEyNDQ1LAorCQlFUlJPUl9BQ1RJT04gPSAxMjQ0NjsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlZGM0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWFya2VyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclZhbHVlUGFpcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5vcm1hbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBSZWNvdmVyZWRBbm5vdGF0aW9uIGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFSS0VSID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRV9NRU1CRVIgPSAyOworCisJcHJpdmF0ZSBpbnQga2luZDsKKwlwcml2YXRlIGludCBpZGVudGlmaWVyUHRyOworCXByaXZhdGUgaW50IGlkZW50aWZpZXJMZW5ndGhQdHI7CisJcHJpdmF0ZSBpbnQgc291cmNlU3RhcnQ7CisJcHVibGljIGJvb2xlYW4gaGFzUGVuZGluZ01lbWJlclZhbHVlTmFtZTsKKwlwdWJsaWMgaW50IG1lbWJlclZhbHVQYWlyRXF1YWxFbmQgPSAtMTsKKwlwdWJsaWMgQW5ub3RhdGlvbiBhbm5vdGF0aW9uOworCisJcHVibGljIFJlY292ZXJlZEFubm90YXRpb24oaW50IGlkZW50aWZpZXJQdHIsIGludCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBpbnQgc291cmNlU3RhcnQsIFJlY292ZXJlZEVsZW1lbnQgcGFyZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKwkJc3VwZXIocGFyZW50LCBicmFja2V0QmFsYW5jZSk7CisJCXRoaXMua2luZCA9IE1BUktFUjsKKwkJdGhpcy5pZGVudGlmaWVyUHRyID0gaWRlbnRpZmllclB0cjsKKwkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyID0gaWRlbnRpZmllckxlbmd0aFB0cjsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCX0KKworCXB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCQlpZiAodGhpcy5hbm5vdGF0aW9uID09IG51bGwgJiYgKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApeworCQkJLy8gaWdub3JlIGFub255bW91cyB0eXBlIGluIGFubm90YXRpb25zIHdoZW4gYW5ub3RhdGlvbiBpc24ndCBmdWxseSByZWNvdmVyZWQKKwkJCXJldHVybiB0aGlzOworCQl9CisJCXJldHVybiBzdXBlci5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKKwl9CisKKwlwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGRBbm5vdGF0aW9uTmFtZShpbnQgaWRlbnRQdHIsIGludCBpZGVudExlbmd0aFB0ciwgaW50IGFubm90YXRpb25TdGFydCwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKKworCQlSZWNvdmVyZWRBbm5vdGF0aW9uIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvbihpZGVudFB0ciwgaWRlbnRMZW5ndGhQdHIsIGFubm90YXRpb25TdGFydCwgdGhpcywgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CisKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90LCBpbnQgaW5kZXgpIHsKKwkJdGhpcy5hbm5vdGF0aW9uID0gYW5ub3Q7CisKKwkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHJldHVybiB0aGlzLnBhcmVudDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlRnJvbVBhcnNlclN0YXRlKCkgeworCQlQYXJzZXIgcGFyc2VyID0gcGFyc2VyKCk7CisKKwkJaWYgKHRoaXMuYW5ub3RhdGlvbiA9PSBudWxsICYmIHRoaXMuaWRlbnRpZmllclB0ciA8PSBwYXJzZXIuaWRlbnRpZmllclB0cikgeworCQkJQW5ub3RhdGlvbiBhbm5vdCA9IG51bGw7CisKKwkJCWJvb2xlYW4gbmVlZFVwZGF0ZVJQYXJlblBvcyA9IGZhbHNlOworCisJCQlNZW1iZXJWYWx1ZVBhaXIgcGVuZGluZ01lbWJlclZhbHVlTmFtZSA9IG51bGw7CisJCQlpZiAodGhpcy5oYXNQZW5kaW5nTWVtYmVyVmFsdWVOYW1lICYmIHRoaXMuaWRlbnRpZmllclB0ciA8IHBhcnNlci5pZGVudGlmaWVyUHRyKSB7CisJCQkJY2hhcltdIG1lbWJlclZhbHVlTmFtZSA9IHBhcnNlci5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgMV07CisKKwkJCQlsb25nIHBvcyA9IHBhcnNlci5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyAxXTsKKwkJCQlpbnQgc3RhcnQgPSAoaW50KSAocG9zID4+PiAzMik7CisJCQkJaW50IGVuZCA9IChpbnQpcG9zOworCQkJCWludCB2YWx1ZUVuZCA9IHRoaXMubWVtYmVyVmFsdVBhaXJFcXVhbEVuZCA+IC0xID8gdGhpcy5tZW1iZXJWYWx1UGFpckVxdWFsRW5kIDogZW5kOworCisJCQkJU2luZ2xlTmFtZVJlZmVyZW5jZSBmYWtlRXhwcmVzc2lvbiA9IG5ldyBTaW5nbGVOYW1lUmVmZXJlbmNlKFJlY292ZXJ5U2Nhbm5lci5GQUtFX0lERU5USUZJRVIsICgoKGxvbmcpIHZhbHVlRW5kICsgMSkgPDwgMzIpICsgKHZhbHVlRW5kKSk7CisJCQkJcGVuZGluZ01lbWJlclZhbHVlTmFtZSA9IG5ldyBNZW1iZXJWYWx1ZVBhaXIobWVtYmVyVmFsdWVOYW1lLCBzdGFydCwgZW5kLCBmYWtlRXhwcmVzc2lvbik7CisJCQl9CisJCQlwYXJzZXIuaWRlbnRpZmllclB0ciA9IHRoaXMuaWRlbnRpZmllclB0cjsKKwkJCXBhcnNlci5pZGVudGlmaWVyTGVuZ3RoUHRyID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyOworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gcGFyc2VyLmdldEFubm90YXRpb25UeXBlKCk7CisKKwkJCXN3aXRjaCAodGhpcy5raW5kKSB7CisJCQkJY2FzZSBOT1JNQUw6CisJCQkJCWlmIChwYXJzZXIuYXN0UHRyID4gLTEgJiYgcGFyc2VyLmFzdFN0YWNrW3BhcnNlci5hc3RQdHJdIGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSB7CisJCQkJCQlNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gbnVsbDsKKworCQkJCQkJaW50IGFyZ0xlbmd0aCA9IHBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXTsKKwkJCQkJCWludCBhcmdTdGFydCA9IHBhcnNlci5hc3RQdHIgLSBhcmdMZW5ndGggKyAxOworCisJCQkJCQlpZiAoYXJnTGVuZ3RoID4gMCkgeworCQkJCQkJCWludCBhbm5vdGF0aW9uRW5kOworCQkJCQkJCWlmIChwZW5kaW5nTWVtYmVyVmFsdWVOYW1lICE9IG51bGwpIHsKKwkJCQkJCQkJbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBNZW1iZXJWYWx1ZVBhaXJbYXJnTGVuZ3RoICsgMV07CisKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJzZXIuYXN0U3RhY2ssIGFyZ1N0YXJ0LCBtZW1iZXJWYWx1ZVBhaXJzLCAwLCBhcmdMZW5ndGgpOworCQkJCQkJCQlwYXJzZXIuYXN0TGVuZ3RoUHRyLS07CisJCQkJCQkJCXBhcnNlci5hc3RQdHIgLT0gYXJnTGVuZ3RoOworCisJCQkJCQkJCW1lbWJlclZhbHVlUGFpcnNbYXJnTGVuZ3RoXSA9IHBlbmRpbmdNZW1iZXJWYWx1ZU5hbWU7CisKKwkJCQkJCQkJYW5ub3RhdGlvbkVuZCA9IHBlbmRpbmdNZW1iZXJWYWx1ZU5hbWUuc291cmNlRW5kOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCW1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2FyZ0xlbmd0aF07CisKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJzZXIuYXN0U3RhY2ssIGFyZ1N0YXJ0LCBtZW1iZXJWYWx1ZVBhaXJzLCAwLCBhcmdMZW5ndGgpOworCQkJCQkJCQlwYXJzZXIuYXN0TGVuZ3RoUHRyLS07CisJCQkJCQkJCXBhcnNlci5hc3RQdHIgLT0gYXJnTGVuZ3RoOworCisJCQkJCQkJCU1lbWJlclZhbHVlUGFpciBsYXN0TWVtYmVyVmFsdWVQYWlyID0gbWVtYmVyVmFsdWVQYWlyc1ttZW1iZXJWYWx1ZVBhaXJzLmxlbmd0aCAtIDFdOworCisJCQkJCQkJCWFubm90YXRpb25FbmQgPQorCQkJCQkJCQkJbGFzdE1lbWJlclZhbHVlUGFpci52YWx1ZSAhPSBudWxsCisJCQkJCQkJCQkJPyBsYXN0TWVtYmVyVmFsdWVQYWlyLnZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvbgorCQkJCQkJCQkJCQkJPyAoKEFubm90YXRpb24pbGFzdE1lbWJlclZhbHVlUGFpci52YWx1ZSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQKKwkJCQkJCQkJCQkJCTogbGFzdE1lbWJlclZhbHVlUGFpci52YWx1ZS5zb3VyY2VFbmQKKwkJCQkJCQkJCQk6IGxhc3RNZW1iZXJWYWx1ZVBhaXIuc291cmNlRW5kOworCQkJCQkJCX0KKworCQkJCQkJCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHR5cGVSZWZlcmVuY2UsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkJCW5vcm1hbEFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycyA9IG1lbWJlclZhbHVlUGFpcnM7CisJCQkJCQkJbm9ybWFsQW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGFubm90YXRpb25FbmQ7CisJCQkJCQkJbm9ybWFsQW5ub3RhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNSZWNvdmVyZWQ7CisKKwkJCQkJCQlhbm5vdCA9IG5vcm1hbEFubm90YXRpb247CisKKwkJCQkJCQluZWVkVXBkYXRlUlBhcmVuUG9zID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCisKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTSU5HTEVfTUVNQkVSOgorCQkJCQlpZiAocGFyc2VyLmV4cHJlc3Npb25QdHIgPiAtMSkgeworCQkJCQkJRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSA9IHBhcnNlci5leHByZXNzaW9uU3RhY2tbcGFyc2VyLmV4cHJlc3Npb25QdHItLV07CisKKwkJCQkJCVNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKHR5cGVSZWZlcmVuY2UsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkJc2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5tZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlOworCQkJCQkJc2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IG1lbWJlclZhbHVlLnNvdXJjZUVuZDsKKwkJCQkJCXNpbmdsZU1lbWJlckFubm90YXRpb24uYml0cyB8PSBBU1ROb2RlLklzUmVjb3ZlcmVkOworCisJCQkJCQlhbm5vdCA9IHNpbmdsZU1lbWJlckFubm90YXRpb247CisKKwkJCQkJCW5lZWRVcGRhdGVSUGFyZW5Qb3MgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIW5lZWRVcGRhdGVSUGFyZW5Qb3MpIHsKKwkJCQlpZiAocGVuZGluZ01lbWJlclZhbHVlTmFtZSAhPSBudWxsKSB7CisJCQkJCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHR5cGVSZWZlcmVuY2UsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQlub3JtYWxBbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW117cGVuZGluZ01lbWJlclZhbHVlTmFtZX07CisJCQkJCW5vcm1hbEFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBwZW5kaW5nTWVtYmVyVmFsdWVOYW1lLnZhbHVlLnNvdXJjZUVuZDsKKwkJCQkJbm9ybWFsQW5ub3RhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNSZWNvdmVyZWQ7CisKKwkJCQkJYW5ub3QgPSBub3JtYWxBbm5vdGF0aW9uOworCQkJCX0gZWxzZSB7CisJCQkJCU1hcmtlckFubm90YXRpb24gbWFya2VyQW5ub3RhdGlvbiA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uKHR5cGVSZWZlcmVuY2UsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQltYXJrZXJBbm5vdGF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gbWFya2VyQW5ub3RhdGlvbi5zb3VyY2VFbmQ7CisJCQkJCW1hcmtlckFubm90YXRpb24uYml0cyB8PSBBU1ROb2RlLklzUmVjb3ZlcmVkOworCisJCQkJCWFubm90ID0gbWFya2VyQW5ub3RhdGlvbjsKKwkJCQl9CisJCQl9CisKKwkJCXBhcnNlci5jdXJyZW50RWxlbWVudCA9IGFkZEFubm90YXRpb24oYW5ub3QsIHRoaXMuaWRlbnRpZmllclB0cik7CisJCQlwYXJzZXIuYW5ub3RhdGlvblJlY292ZXJ5Q2hlY2tQb2ludChhbm5vdC5zb3VyY2VTdGFydCwgYW5ub3QuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKKworCQkJCXRoaXMucGFyZW50LnVwZGF0ZUZyb21QYXJzZXJTdGF0ZSgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEFTVE5vZGUgcGFyc2VUcmVlKCkgeworCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHJlc2V0UGVuZGluZ01vZGlmaWVycygpIHsKKwkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHRoaXMucGFyZW50LnJlc2V0UGVuZGluZ01vZGlmaWVycygpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEtpbmQoaW50IGtpbmQpIHsKKwkJdGhpcy5raW5kID0ga2luZDsKKwl9CisKKwlwdWJsaWMgaW50IHNvdXJjZUVuZCgpIHsKKwkJaWYgKHRoaXMuYW5ub3RhdGlvbiA9PSBudWxsKSB7CisJCQlQYXJzZXIgcGFyc2VyID0gcGFyc2VyKCk7CisJCQlpZiAodGhpcy5pZGVudGlmaWVyUHRyIDwgcGFyc2VyLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLmxlbmd0aCkgeworCQkJCXJldHVybiAoaW50KSBwYXJzZXIuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRoaXMuc291cmNlU3RhcnQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwkJaWYgKHRoaXMuYW5ub3RhdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIGFubm90YXRpb246XG4iICsgdGhpcy5hbm5vdGF0aW9uLnByaW50KHRhYiArIDEsIG5ldyBTdHJpbmdCdWZmZXIoMTApKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBhbm5vdGF0aW9uOiBpZGVudGlmZXJQdHI9IiArIHRoaXMuaWRlbnRpZmllclB0ciArICIgaWRlbnRpZmVybGVuZ3RoUHRyPSIgKyB0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQl9CisJfQorCisJcHVibGljIEFubm90YXRpb24gdXBkYXRlZEFubm90YXRpb25SZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLmFubm90YXRpb247CisJfQorCisJcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7CisJCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlID4gMCl7IC8vIHdhcyBhbiBtZW1iZXIgdmFsdWUgYXJyYXkgaW5pdGlhbGl6ZXIKKwkJCXRoaXMuYnJhY2tldEJhbGFuY2UtLTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKXsKKwkJCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCkgeworCQl1cGRhdGVkQW5ub3RhdGlvblJlZmVyZW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQmxvY2suamF2YQppbmRleCA5MDk5NjUyLi4xZDc0ZmU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEJsb2NrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDYgKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CkBAIC0yOSwxOCArMzIsMjQgQEAKIAlwdWJsaWMgaW50IHN0YXRlbWVudENvdW50OwogCXB1YmxpYyBib29sZWFuIHByZXNlcnZlQ29udGVudCA9IGZhbHNlOwogCXB1YmxpYyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIHBlbmRpbmdBcmd1bWVudDsKLQkKKworCWludCBwZW5kaW5nTW9kaWZpZXJzOworCWludCBwZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworCVJlY292ZXJlZEFubm90YXRpb25bXSBwZW5kaW5nQW5ub3RhdGlvbnM7CisJaW50IHBlbmRpbmdBbm5vdGF0aW9uQ291bnQ7CisKIHB1YmxpYyBSZWNvdmVyZWRCbG9jayhCbG9jayBibG9jaywgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSl7CiAJc3VwZXIoYmxvY2ssIHBhcmVudCwgYnJhY2tldEJhbGFuY2UpOwogCXRoaXMuYmxvY2tEZWNsYXJhdGlvbiA9IGJsb2NrOwogCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwotCQotCXRoaXMucHJlc2VydmVDb250ZW50ID0gdGhpcy5wYXJzZXIoKS5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCB8fCB0aGlzLnBhcnNlcigpLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkOworCisJdGhpcy5wcmVzZXJ2ZUNvbnRlbnQgPSBwYXJzZXIoKS5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCB8fCBwYXJzZXIoKS5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZDsKIH0KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgewogCWlmICh0aGlzLnBhcmVudCAhPSBudWxsICYmIHRoaXMucGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKSB7CiAJCVJlY292ZXJlZE1ldGhvZCBlbmNsb3NpbmdSZWNvdmVyZWRNZXRob2QgPSAoUmVjb3ZlcmVkTWV0aG9kKSB0aGlzLnBhcmVudDsKIAkJaWYgKGVuY2xvc2luZ1JlY292ZXJlZE1ldGhvZC5tZXRob2RCb2R5ID09IHRoaXMgJiYgZW5jbG9zaW5nUmVjb3ZlcmVkTWV0aG9kLnBhcmVudCA9PSBudWxsKSB7CisJCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAkJCS8vIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBhZGRlZCBiZWNhdXNlIHdlIGFyZSBpbiB0aGUgYm9keSBvZiBhIHRvcCBsZXZlbCBtZXRob2QKIAkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUgdGhpcyBlbGVtZW50CiAJCX0KQEAgLTQ4LDE3ICs1NywxOCBAQAogCXJldHVybiBzdXBlci5hZGQobWV0aG9kRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogfQogLyoKLSAqIFJlY29yZCBhIG5lc3RlZCBibG9jayBkZWNsYXJhdGlvbiAKKyAqIFJlY29yZCBhIG5lc3RlZCBibG9jayBkZWNsYXJhdGlvbgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQmxvY2sgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAogCS8qIGRvIG5vdCBjb25zaWRlciBhIG5lc3RlZCBibG9jayBzdGFydGluZyBwYXNzZWQgdGhlIGJsb2NrIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgYmxvY2sgKi8KLQlpZiAodGhpcy5ibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCAhPSAwIAorCWlmICh0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kICE9IDAKIAkJJiYgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCA+IHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQpewogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCX0KLQkJCQorCiAJUmVjb3ZlcmVkQmxvY2sgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRCbG9jayhuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAogCS8vIGlmIHdlIGhhdmUgYSBwZW5kaW5nIEFyZ3VtZW50LCBwcm9tb3RlIGl0IGludG8gdGhlIG5ldyBibG9jawpAQCAtNjYsMzEgKzc2LDMxIEBACiAJCWVsZW1lbnQuYXR0YWNoKHRoaXMucGVuZGluZ0FyZ3VtZW50KTsKIAkJdGhpcy5wZW5kaW5nQXJndW1lbnQgPSBudWxsOwogCX0KLQlpZih0aGlzLnBhcnNlcigpLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKSB7Ci0JCXRoaXMuYWRkQmxvY2tTdGF0ZW1lbnQoZWxlbWVudCk7CisJaWYocGFyc2VyKCkuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpIHsKKwkJYWRkQmxvY2tTdGF0ZW1lbnQoZWxlbWVudCk7CiAJfQotCXRoaXMuYXR0YWNoKGVsZW1lbnQpOworCWF0dGFjaChlbGVtZW50KTsKIAlpZiAobmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7Ci0JcmV0dXJuIHRoaXM7CQorCXJldHVybiB0aGlzOwogfQogLyoKLSAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIAorICogUmVjb3JkIGEgbG9jYWwgZGVjbGFyYXRpb24KICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAlyZXR1cm4gdGhpcy5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSwgZmFsc2UpOwogfQogLyoKLSAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIAorICogUmVjb3JkIGEgbG9jYWwgZGVjbGFyYXRpb24KICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUsIGJvb2xlYW4gZGVsZWdhdGVkQnlQYXJlbnQpIHsKIAogCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgbWV0aG9kIGNhbiBvbmx5IGJlIGZpbmFsIGFuZCBub24gdm9pZCAqLwotLyoJCi0JY2hhcltdW10gbG9jYWxUeXBlTmFtZTsgCi0JaWYgKChsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgCisvKgorCWNoYXJbXVtdIGxvY2FsVHlwZU5hbWU7CisJaWYgKChsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwKIAkJfHwgKGxvY2FsRGVjbGFyYXRpb24udHlwZSA9PSBudWxsKSAvLyBpbml0aWFsaXplcgogCQl8fCAoKGxvY2FsVHlwZU5hbWUgPSBsb2NhbERlY2xhcmF0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKSkubGVuZ3RoID09IDEgLy8gbm9uIHZvaWQKLQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGxvY2FsVHlwZU5hbWVbMF0sIFZvaWRCaW5kaW5nLnNvdXJjZU5hbWUoKSkpKXsgCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhsb2NhbFR5cGVOYW1lWzBdLCBWb2lkQmluZGluZy5zb3VyY2VOYW1lKCkpKSl7CiAKIAkJaWYgKGRlbGVnYXRlZEJ5UGFyZW50KXsKIAkJCXJldHVybiB0aGlzOyAvL2lnbm9yZQpAQCAtOTksNTAgKzEwOSw2MSBAQAogCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CiAJCX0KIAl9Ci0qLwkKKyovCiAJCS8qIGRvIG5vdCBjb25zaWRlciBhIGxvY2FsIHZhcmlhYmxlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgYmxvY2sgZW5kIChpZiBzZXQpCiAJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBibG9jayAqLwotCWlmICh0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kICE9IDAgCisJaWYgKHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMAogCQkJJiYgbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gdGhpcy5ibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCl7CisJCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCQlpZiAoZGVsZWdhdGVkQnlQYXJlbnQpIHJldHVybiB0aGlzOyAvL2lnbm9yZQogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKGxvY2FsRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCX0KIAogCVJlY292ZXJlZExvY2FsVmFyaWFibGUgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKGxvY2FsRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCisJaWYodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID4gMCkgeworCQllbGVtZW50LmF0dGFjaCgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQpOworCX0KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCWlmIChsb2NhbERlY2xhcmF0aW9uIGluc3RhbmNlb2YgQXJndW1lbnQpewogCQl0aGlzLnBlbmRpbmdBcmd1bWVudCA9IGVsZW1lbnQ7CiAJCXJldHVybiB0aGlzOwogCX0KLQkKLQl0aGlzLmF0dGFjaChlbGVtZW50KTsKKworCWF0dGFjaChlbGVtZW50KTsKIAlpZiAobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSByZXR1cm4gZWxlbWVudDsKLQlyZXR1cm4gdGhpczsJCisJcmV0dXJuIHRoaXM7CiB9CiAvKgotICogUmVjb3JkIGEgc3RhdGVtZW50IGRlY2xhcmF0aW9uIAorICogUmVjb3JkIGEgc3RhdGVtZW50IGRlY2xhcmF0aW9uCiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RtdCwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAlyZXR1cm4gdGhpcy5hZGQoc3RtdCwgYnJhY2tldEJhbGFuY2VWYWx1ZSwgZmFsc2UpOwogfQogCiAvKgotICogUmVjb3JkIGEgc3RhdGVtZW50IGRlY2xhcmF0aW9uIAorICogUmVjb3JkIGEgc3RhdGVtZW50IGRlY2xhcmF0aW9uCiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RtdCwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUsIGJvb2xlYW4gZGVsZWdhdGVkQnlQYXJlbnQpIHsKKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAogCS8qIGRvIG5vdCBjb25zaWRlciBhIG5lc3RlZCBibG9jayBzdGFydGluZyBwYXNzZWQgdGhlIGJsb2NrIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgYmxvY2sgKi8KLQlpZiAodGhpcy5ibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCAhPSAwIAorCWlmICh0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kICE9IDAKIAkJCSYmIHN0bXQuc291cmNlU3RhcnQgPiB0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kKXsKIAkJaWYgKGRlbGVnYXRlZEJ5UGFyZW50KSByZXR1cm4gdGhpczsgLy9pZ25vcmUKIAkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChzdG10LCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JCQkKKwogCVJlY292ZXJlZFN0YXRlbWVudCBlbGVtZW50ID0gbmV3IFJlY292ZXJlZFN0YXRlbWVudChzdG10LCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKLQl0aGlzLmF0dGFjaChlbGVtZW50KTsKKwlhdHRhY2goZWxlbWVudCk7CiAJaWYgKHN0bXQuc291cmNlRW5kID09IDApIHJldHVybiBlbGVtZW50OwotCXJldHVybiB0aGlzOwkKKwlyZXR1cm4gdGhpczsKIH0KIC8qCiAgKiBBZGRpdGlvbiBvZiBhIHR5cGUgdG8gYW4gaW5pdGlhbGl6ZXIgKGFjdCBsaWtlIGluc2lkZSBtZXRob2QgYm9keSkKQEAgLTE1NywxNyArMTc4LDU0IEBACiAKIAkvKiBkbyBub3QgY29uc2lkZXIgYSB0eXBlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgYmxvY2sgZW5kIChpZiBzZXQpCiAJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBibG9jayAqLwotCWlmICh0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kICE9IDAgCisJaWYgKHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMAogCQkJJiYgdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kKXsKKwkJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CiAJCWlmIChkZWxlZ2F0ZWRCeVBhcmVudCkgcmV0dXJuIHRoaXM7IC8vaWdub3JlCiAJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JCQkKLQlSZWNvdmVyZWRTdGF0ZW1lbnQgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRUeXBlKHR5cGVEZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2VWYWx1ZSk7Ci0JdGhpcy5hdHRhY2goZWxlbWVudCk7CisKKwlSZWNvdmVyZWRUeXBlIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkVHlwZSh0eXBlRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworCWlmKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA+IDApIHsKKwkJZWxlbWVudC5hdHRhY2goCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50LAorCQkJCXRoaXMucGVuZGluZ01vZGlmaWVycywKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0KTsKKwl9CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisJYXR0YWNoKGVsZW1lbnQpOwogCWlmICh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7CiAJcmV0dXJuIHRoaXM7CiB9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGRBbm5vdGF0aW9uTmFtZShpbnQgaWRlbnRpZmllclB0ciwgaW50IGlkZW50aWZpZXJMZW5ndGhQdHIsIGludCBhbm5vdGF0aW9uU3RhcnQsIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CisJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb25zID09IG51bGwpIHsKKwkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvbls1XTsKKwkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID0gMDsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID09IHRoaXMucGVuZGluZ0Fubm90YXRpb25zLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQkwLAorCQkJCSh0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWNvdmVyZWRBbm5vdGF0aW9uWzIgKiB0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCk7CisJCX0KKwl9CisKKwlSZWNvdmVyZWRBbm5vdGF0aW9uIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvbihpZGVudGlmaWVyUHRyLCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBhbm5vdGF0aW9uU3RhcnQsIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworCisJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnNbdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50KytdID0gZWxlbWVudDsKKworCXJldHVybiBlbGVtZW50OworfQorcHVibGljIHZvaWQgYWRkTW9kaWZpZXIoaW50IGZsYWcsIGludCBtb2RpZmllcnNTb3VyY2VTdGFydCkgeworCXRoaXMucGVuZGluZ01vZGlmaWVycyB8PSBmbGFnOworCisJaWYgKHRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQgPCAwKSB7CisJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQgPSBtb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9Cit9CiAvKgogICogQXR0YWNoIGEgcmVjb3ZlcmVkIHN0YXRlbWVudAogICovCkBAIC0xNzksMjEgKzIzNywzMyBAQAogCX0gZWxzZSB7CiAJCWlmICh0aGlzLnN0YXRlbWVudENvdW50ID09IHRoaXMuc3RhdGVtZW50cy5sZW5ndGgpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5zdGF0ZW1lbnRzLCAKLQkJCQkwLCAKLQkJCQkodGhpcy5zdGF0ZW1lbnRzID0gbmV3IFJlY292ZXJlZFN0YXRlbWVudFsyICogdGhpcy5zdGF0ZW1lbnRDb3VudF0pLCAKLQkJCQkwLCAKLQkJCQl0aGlzLnN0YXRlbWVudENvdW50KTsgCisJCQkJdGhpcy5zdGF0ZW1lbnRzLAorCQkJCTAsCisJCQkJKHRoaXMuc3RhdGVtZW50cyA9IG5ldyBSZWNvdmVyZWRTdGF0ZW1lbnRbMiAqIHRoaXMuc3RhdGVtZW50Q291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMuc3RhdGVtZW50Q291bnQpOwogCQl9CiAJfQogCXRoaXMuc3RhdGVtZW50c1t0aGlzLnN0YXRlbWVudENvdW50KytdID0gcmVjb3ZlcmVkU3RhdGVtZW50OwogfQotLyogCit2b2lkIGF0dGFjaFBlbmRpbmdNb2RpZmllcnMoUmVjb3ZlcmVkQW5ub3RhdGlvbltdIHBlbmRpbmdBbm5vdHMsIGludCBwZW5kaW5nQW5ub3RDb3VudCwgaW50IHBlbmRpbmdNb2RzLCBpbnQgcGVuZGluZ01vZHNTb3VyY2VTdGFydCkgeworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gcGVuZGluZ0Fubm90czsKKwl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQgPSBwZW5kaW5nQW5ub3RDb3VudDsKKwl0aGlzLnBlbmRpbmdNb2RpZmllcnMgPSBwZW5kaW5nTW9kczsKKwl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gcGVuZGluZ01vZHNTb3VyY2VTdGFydDsKK30KKy8qCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCiBwdWJsaWMgQVNUTm9kZSBwYXJzZVRyZWUoKXsKIAlyZXR1cm4gdGhpcy5ibG9ja0RlY2xhcmF0aW9uOwogfQorcHVibGljIHZvaWQgcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCkgeworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKwl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQgPSAwOworCXRoaXMucGVuZGluZ01vZGlmaWVycyA9IDA7CisJdGhpcy5wZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworfQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CiAJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOwogCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCBibG9jazpcbiIpOyAvLyROT04tTkxTLTEkCkBAIC0yMDksMTkgKzI3OSwxOSBAQAogLyoKICAqIFJlYnVpbGQgYSBibG9jayBmcm9tIHRoZSBuZXN0ZWQgc3RydWN0dXJlIHdoaWNoIGlzIGluIHNjb3BlCiAgKi8KLXB1YmxpYyBCbG9jayB1cGRhdGVkQmxvY2soKXsKK3B1YmxpYyBCbG9jayB1cGRhdGVkQmxvY2soaW50IGRlcHRoLCBTZXQga25vd25UeXBlcyl7CiAKIAkvLyBpZiBibG9jayB3YXMgbm90IG1hcmtlZCB0byBiZSBwcmVzZXJ2ZWQgb3IgZW1wdHksIHRoZW4gaWdub3JlIGl0CiAJaWYgKCF0aGlzLnByZXNlcnZlQ29udGVudCB8fCB0aGlzLnN0YXRlbWVudENvdW50ID09IDApIHJldHVybiBudWxsOwogCiAJU3RhdGVtZW50W10gdXBkYXRlZFN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W3RoaXMuc3RhdGVtZW50Q291bnRdOwogCWludCB1cGRhdGVkQ291bnQgPSAwOwotCQotCQorCisKIAkvLyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIGVuZCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQKLQlSZWNvdmVyZWRTdGF0ZW1lbnQgbGFzdFN0YXRlbWVudCA9IHN0YXRlbWVudHNbc3RhdGVtZW50Q291bnQgLSAxXTsKLQlSZWNvdmVyZWRNZXRob2QgZW5jbG9zaW5nTWV0aG9kID0gdGhpcy5lbmNsb3NpbmdNZXRob2QoKTsKLQlSZWNvdmVyZWRJbml0aWFsaXplciBlbmNsb3NpbmdJbnRpYWxpemVyID0gdGhpcy5lbmNsb3NpbmdJbml0aWFsaXplcigpOworCVJlY292ZXJlZFN0YXRlbWVudCBsYXN0U3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnRzW3RoaXMuc3RhdGVtZW50Q291bnQgLSAxXTsKKwlSZWNvdmVyZWRNZXRob2QgZW5jbG9zaW5nTWV0aG9kID0gZW5jbG9zaW5nTWV0aG9kKCk7CisJUmVjb3ZlcmVkSW5pdGlhbGl6ZXIgZW5jbG9zaW5nSW50aWFsaXplciA9IGVuY2xvc2luZ0luaXRpYWxpemVyKCk7CiAJaW50IGJvZHlFbmRWYWx1ZSA9IDA7CiAJaWYoZW5jbG9zaW5nTWV0aG9kICE9IG51bGwpIHsKIAkJYm9keUVuZFZhbHVlID0gZW5jbG9zaW5nTWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQ7CkBAIC0yMzMsNyArMzAzLDcgQEAKIAl9IGVsc2UgewogCQlib2R5RW5kVmFsdWUgPSB0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kIC0gMTsKIAl9Ci0JCisKIAlpZihsYXN0U3RhdGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgewogCQlSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIGxhc3RMb2NhbFZhcmlhYmxlID0gKFJlY292ZXJlZExvY2FsVmFyaWFibGUpIGxhc3RTdGF0ZW1lbnQ7CiAJCWlmKGxhc3RMb2NhbFZhcmlhYmxlLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgewpAQCAtMjUwLDE1ICszMjAsMTUgQEAKIAkJCWxhc3RTdGF0ZW1lbnQuc3RhdGVtZW50LnNvdXJjZUVuZCA9IGJvZHlFbmRWYWx1ZTsKIAkJfQogCX0KLQkKLQlpbnQgbGFzdEVuZCA9IGJsb2NrRGVjbGFyYXRpb24uc291cmNlU3RhcnQ7Ci0JCisKKwlpbnQgbGFzdEVuZCA9IHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwogCS8vIG9ubHkgY29sbGVjdCB0aGUgbm9uLW51bGwgdXBkYXRlZCBzdGF0ZW1lbnRzCiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlbWVudENvdW50OyBpKyspewotCQlTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50c1tpXS51cGRhdGVkU3RhdGVtZW50KCk7CisJCVN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnRzW2ldLnVwZGF0ZWRTdGF0ZW1lbnQoZGVwdGgsIGtub3duVHlwZXMpOwogCQlpZiAodXBkYXRlZFN0YXRlbWVudCAhPSBudWxsKXsKIAkJCXVwZGF0ZWRTdGF0ZW1lbnRzW3VwZGF0ZWRDb3VudCsrXSA9IHVwZGF0ZWRTdGF0ZW1lbnQ7Ci0JCQkKKwogCQkJaWYgKHVwZGF0ZWRTdGF0ZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CiAJCQkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gKExvY2FsRGVjbGFyYXRpb24pIHVwZGF0ZWRTdGF0ZW1lbnQ7CiAJCQkJaWYobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IGxhc3RFbmQpIHsKQEAgLTI5MywxNSArMzYzLDE1IEBACiAJCQl0aGlzLmJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kID0gbGFzdEVuZDsKIAkJfQogCX0KLQkKKwogCXJldHVybiB0aGlzLmJsb2NrRGVjbGFyYXRpb247CiB9CiAvKgogICogUmVidWlsZCBhIHN0YXRlbWVudCBmcm9tIHRoZSBuZXN0ZWQgc3RydWN0dXJlIHdoaWNoIGlzIGluIHNjb3BlCiAgKi8KLXB1YmxpYyBTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCgpeworcHVibGljIFN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50KGludCBkZXB0aCwgU2V0IGtub3duVHlwZXMpewogCi0JcmV0dXJuIHRoaXMudXBkYXRlZEJsb2NrKCk7CisJcmV0dXJuIHVwZGF0ZWRCbG9jayhkZXB0aCwga25vd25UeXBlcyk7CiB9CiAvKgogICogQSBjbG9zaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgaGF2ZSBjbG9zZWQgdGhlIGN1cnJlbnQgZWxlbWVudCwKQEAgLTM0MCwyMiArNDEwLDIyIEBACiAgKi8KIHB1YmxpYyB2b2lkIHVwZGF0ZVBhcnNlVHJlZSgpewogCi0JdGhpcy51cGRhdGVkQmxvY2soKTsKKwl1cGRhdGVkQmxvY2soMCwgbmV3IEhhc2hTZXQoKSk7CiB9CiAvKgogICogUmVidWlsZCBhIGZsYXR0ZW5lZCBibG9jayBmcm9tIHRoZSBuZXN0ZWQgc3RydWN0dXJlIHdoaWNoIGlzIGluIHNjb3BlCiAgKi8KLXB1YmxpYyBTdGF0ZW1lbnQgdXBkYXRlU3RhdGVtZW50KCl7CitwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZVN0YXRlbWVudChpbnQgZGVwdGgsIFNldCBrbm93blR5cGVzKXsKIAogCS8vIGlmIGJsb2NrIHdhcyBjbG9zZWQgb3IgZW1wdHksIHRoZW4gaWdub3JlIGl0CiAJaWYgKHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMCB8fCB0aGlzLnN0YXRlbWVudENvdW50ID09IDApIHJldHVybiBudWxsOwogCiAJU3RhdGVtZW50W10gdXBkYXRlZFN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W3RoaXMuc3RhdGVtZW50Q291bnRdOwogCWludCB1cGRhdGVkQ291bnQgPSAwOwotCQorCiAJLy8gb25seSBjb2xsZWN0IHRoZSBub24tbnVsbCB1cGRhdGVkIHN0YXRlbWVudHMKIAlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc3RhdGVtZW50Q291bnQ7IGkrKyl7Ci0JCVN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnRzW2ldLnVwZGF0ZWRTdGF0ZW1lbnQoKTsKKwkJU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQgPSB0aGlzLnN0YXRlbWVudHNbaV0udXBkYXRlZFN0YXRlbWVudChkZXB0aCwga25vd25UeXBlcyk7CiAJCWlmICh1cGRhdGVkU3RhdGVtZW50ICE9IG51bGwpewogCQkJdXBkYXRlZFN0YXRlbWVudHNbdXBkYXRlZENvdW50KytdID0gdXBkYXRlZFN0YXRlbWVudDsKIAkJfQpAQCAtMzc0LDIzICs0NDQsMjQgQEAKIH0KIAogLyoKLSAqIFJlY29yZCBhIGZpZWxkIGRlY2xhcmF0aW9uIAorICogUmVjb3JkIGEgZmllbGQgZGVjbGFyYXRpb24KICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAogCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgbWV0aG9kIGNhbiBvbmx5IGJlIGZpbmFsIGFuZCBub24gdm9pZCAqLwotCWNoYXJbXVtdIGZpZWxkVHlwZU5hbWU7IAotCWlmICgoZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwIC8vIGxvY2FsIHZhciBjYW4gb25seSBiZSBmaW5hbCAKKwljaGFyW11bXSBmaWVsZFR5cGVOYW1lOworCWlmICgoZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ZpbmFsKSAhPSAwIC8vIGxvY2FsIHZhciBjYW4gb25seSBiZSBmaW5hbAogCQl8fCAoZmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpIC8vIGluaXRpYWxpemVyCiAJCXx8ICgoZmllbGRUeXBlTmFtZSA9IGZpZWxkRGVjbGFyYXRpb24udHlwZS5nZXRUeXBlTmFtZSgpKS5sZW5ndGggPT0gMSAvLyBub24gdm9pZAotCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRUeXBlTmFtZVswXSwgVHlwZUJpbmRpbmcuVk9JRC5zb3VyY2VOYW1lKCkpKSl7IAotCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKKwkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkVHlwZU5hbWVbMF0sIFR5cGVCaW5kaW5nLlZPSUQuc291cmNlTmFtZSgpKSkpeworCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CiAJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiAJfQotCQorCiAJLyogZG8gbm90IGNvbnNpZGVyIGEgbG9jYWwgdmFyaWFibGUgc3RhcnRpbmcgcGFzc2VkIHRoZSBibG9jayBlbmQgKGlmIHNldCkKIAkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIGJsb2NrICovCi0JaWYgKHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMCAKKwlpZiAodGhpcy5ibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCAhPSAwCiAJCSYmIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQpewogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKGZpZWxkRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCX0KQEAgLTM5OCw2ICs0NjksNiBAQAogCS8vIGlnbm9yZSB0aGUgYWRkZWQgZmllbGQsIHNpbmNlIGluZGljYXRlcyBhIGxvY2FsIHZhcmlhYmxlIGJlaGluZCByZWNvdmVyeSBwb2ludAogCS8vIHdoaWNoIHRodXMgZ290IHBhcnNlZCBhcyBhIGZpZWxkIHJlZmVyZW5jZS4gVGhpcyBjYW4gaGFwcGVuIGlmIHJlc3RhcnRpbmcgYWZ0ZXIKIAkvLyBoYXZpbmcgcmVkdWNlZCBhbiBhc3Npc3ROb2RlIHRvIGdldCB0aGUgZm9sbG93aW5nIGNvbnRleHQgKHNlZSAxR0VLN1NHKQotCXJldHVybiB0aGlzOwkKKwlyZXR1cm4gdGhpczsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRFbGVtZW50LmphdmEKaW5kZXggOTJlZjM4ZS4uN2ZkNTMyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRFbGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNyArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKLSAqIEludGVybmFsIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqIEludGVybmFsIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeQogICovCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKQEAgLTM3LDE0ICszNywyMiBAQAogCXRoaXMuYnJhY2tldEJhbGFuY2UgPSBicmFja2V0QmFsYW5jZTsKIAl0aGlzLnJlY292ZXJpbmdQYXJzZXIgPSBwYXJzZXI7CiB9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGRBbm5vdGF0aW9uTmFtZShpbnQgaWRlbnRpZmllclB0ciwgaW50IGlkZW50aWZpZXJMZW5ndGhQdHIsIGludCBhbm5vdGF0aW9uU3RhcnQsIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOworCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gdGhpczsgLy8gaWdub3JlCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoYW5ub3RhdGlvblN0YXJ0IC0gMSkpOworCXJldHVybiB0aGlzLnBhcmVudC5hZGRBbm5vdGF0aW9uTmFtZShpZGVudGlmaWVyUHRyLCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBhbm5vdGF0aW9uU3RhcnQsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworfQogLyoKICAqCVJlY29yZCBhIG1ldGhvZCBkZWNsYXJhdGlvbgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnkgKi8KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsJCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKIAlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG1ldGhvZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIH0KIC8qCkBAIC01Myw4ICs2MSw5IEBACiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQmxvY2sgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnkgKi8KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCAtIDEpKTsJCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCAtIDEpKTsKIAlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogfQogLyoKQEAgLTYzLDggKzcyLDkgQEAKIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CiAKIAkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55ICovCisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CiAJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKLQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsJCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwogCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiB9CiAvKgpAQCAtNzMsOCArODMsOSBAQAogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIGludCBicmFja2V0QmFsYW5jZVZhbHVlKXsKIAogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnkgKi8KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CQorCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkocHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwogCXJldHVybiB0aGlzLnBhcmVudC5hZGQoaW1wb3J0UmVmZXJlbmNlLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIH0KIC8qCkBAIC04Myw4ICs5NCw5IEBACiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgewogCiAJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gdGhpczsgLy8gaWdub3JlCi0JdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CQorCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkocHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKIAlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKGxvY2FsRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogfQogLyoKQEAgLTkzLDggKzEwNSw5IEBACiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnkgKi8KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoc3RhdGVtZW50LnNvdXJjZVN0YXJ0IC0gMSkpOwkKKwl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChzdGF0ZW1lbnQuc291cmNlU3RhcnQgLSAxKSk7CiAJcmV0dXJuIHRoaXMucGFyZW50LmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogfQogLyoKQEAgLTEwMyw4ICsxMTYsOSBAQAogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZVZhbHVlKXsKIAogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnkgKi8KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CQorCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkocHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwogCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIH0KIHByb3RlY3RlZCB2b2lkIGFkZEJsb2NrU3RhdGVtZW50KFJlY292ZXJlZEJsb2NrIHJlY292ZXJlZEJsb2NrKSB7CkBAIC0xMTYsNiArMTMwLDkgQEAKIAkJfQogCX0KIH0KK3B1YmxpYyB2b2lkIGFkZE1vZGlmaWVyKGludCBmbGFnLCBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQpIHsKKwkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCit9CiAvKgogICogQW5zd2VyIHRoZSBkZXB0aCBvZiB0aGlzIGVsZW1lbnQsIGNvbnNpZGVyaW5nIHRoZSBwYXJlbnQgbGluay4KICAqLwpAQCAtMTc3LDEyICsxOTQsMTYgQEAKIAl9CiAJcmV0dXJuIG51bGw7CiB9Ci0vKiAKKy8qCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCiBwdWJsaWMgQVNUTm9kZSBwYXJzZVRyZWUoKXsKIAlyZXR1cm4gbnVsbDsKIH0KK3B1YmxpYyB2b2lkIHJlc2V0UGVuZGluZ01vZGlmaWVycygpIHsKKwkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCisJLy8gcmVjb3ZlcmVkIGVsZW1lbnRzIHdoaWNoIGhhdmUgcGVuZGluZyBtb2RpZmllcnMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZAorfQogLyoKICAqIEl0ZXJhdGUgdGhlIGVuY2xvc2luZyBibG9ja3MgYW5kIHRhZyB0aGVtIHNvIGFzIHRvIHByZXNlcnZlIHRoZWlyIGNvbnRlbnQKICAqLwpAQCAtMjA1LDEyICsyMjYsMTIgQEAKICAqLwogcHVibGljIGludCBwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoaW50IHBvc2l0aW9uKXsKIAotCVBhcnNlciBwYXJzZXIgPSB0aGlzLnBhcnNlcigpOworCVBhcnNlciBwYXJzZXIgPSBwYXJzZXIoKTsKIAlpZiAocGFyc2VyID09IG51bGwpIHJldHVybiBwb3NpdGlvbjsKLQkKKwogCVNjYW5uZXIgc2Nhbm5lciA9IHBhcnNlci5zY2FubmVyOwogCWlmIChzY2FubmVyLmxpbmVFbmRzID09IG51bGwpIHJldHVybiBwb3NpdGlvbjsKLQkKKwogCWludCBpbmRleCA9IFV0aWwuZ2V0TGluZU51bWJlcihwb3NpdGlvbiwgc2Nhbm5lci5saW5lRW5kcywgMCwgc2Nhbm5lci5saW5lUHRyKTsKIAlpZiAoaW5kZXggPCAyKSByZXR1cm4gcG9zaXRpb247CiAJaW50IHByZXZpb3VzTGluZUVuZCA9IHNjYW5uZXIubGluZUVuZHNbaW5kZXgtMl07CkBAIC0yNjcsNyArMjg4LDcgQEAKICAqIFVwZGF0ZSB0aGUgYm9keVN0YXJ0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKICAqLwogcHVibGljIHZvaWQgdXBkYXRlQm9keVN0YXJ0KGludCBib2R5U3RhcnQpewotCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwkKKwl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKIH0KIC8qCiAgKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZSBmcm9tIHBhcnNlciBzdGF0ZSB3aGljaApAQCAtMjk1LDcgKzMxNiw3IEBACiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKIAogCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlKysgPT0gMCl7Ci0JCXRoaXMudXBkYXRlQm9keVN0YXJ0KGJyYWNlRW5kICsgMSk7CisJCXVwZGF0ZUJvZHlTdGFydChicmFjZUVuZCArIDEpOwogCQlyZXR1cm4gdGhpczsKIAl9CiAJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRmllbGQuamF2YQppbmRleCBlMmY5OGUzLi43NDkzMGY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEyICsxMSwxNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKLSAqIEludGVybmFsIGZpZWxkIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqIEludGVybmFsIGZpZWxkIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeQogICovCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CkBAIC0yNiw3ICszMCwxMyBAQAogCiAJcHVibGljIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbjsKIAlib29sZWFuIGFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uOwotCQorCisJcHVibGljIFJlY292ZXJlZEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKwlwdWJsaWMgaW50IGFubm90YXRpb25Db3VudDsKKworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzU3RhcnQ7CisKIAlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIGFub255bW91c1R5cGVzOwogCXB1YmxpYyBpbnQgYW5vbnltb3VzVHlwZUNvdW50OwogcHVibGljIFJlY292ZXJlZEZpZWxkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSl7CkBAIC0zOCw2ICs0OCwyNiBAQAogCXRoaXMuYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb24gPSBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGw7CiB9CiAvKgorICogUmVjb3JkIGEgZmllbGQgZGVjbGFyYXRpb24KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEZpZWxkRGVjbGFyYXRpb24gYWRkZWRmaWVsZERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOworCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gdGhpczsgLy8gaWdub3JlCisJCisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IGFkZGVkZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCWlmICh0aGlzLmZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLmZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24uc291cmNlRW5kKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5maWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCk7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChhZGRlZGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKKwl9CisJcmV0dXJuIHRoaXMucGFyZW50LmFkZChhZGRlZGZpZWxkRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworfQorLyoKICAqIFJlY29yZCBhbiBleHByZXNzaW9uIHN0YXRlbWVudCBpZiBmaWVsZCBpcyBleHBlY3RpbmcgYW4gaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbiwKICAqIHVzZWQgZm9yIGNvbXBsZXRpb24gaW5zaWRlIGZpZWxkIGluaXRpYWxpemVycy4KICAqLwpAQCAtNTQsMTcgKzg0LDE3IEBACiAJfQogfQogLyoKLSAqIFJlY29yZCBhIHR5cGUgZGVjbGFyYXRpb24gaWYgdGhpcyBmaWVsZCBpcyBleHBlY3RpbmcgYW4gaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbiAKKyAqIFJlY29yZCBhIHR5cGUgZGVjbGFyYXRpb24gaWYgdGhpcyBmaWVsZCBpcyBleHBlY3RpbmcgYW4gaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbgogICogYW5kIHRoZSB0eXBlIGlzIGFuIGFub255bW91cyB0eXBlLgogICogVXNlZCBmb3IgY29tcGxldGlvbiBpbnNpZGUgZmllbGQgaW5pdGlhbGl6ZXJzLgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAotCWlmICh0aGlzLmFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uIAorCWlmICh0aGlzLmFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uCiAJCQl8fCAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpID09IDApCiAJCQl8fCAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgJiYgdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ID4gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSkgewogCQlyZXR1cm4gc3VwZXIuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7Ci0JfSBlbHNlIHsgCisJfSBlbHNlIHsKIAkJLy8gUHJlcGFyZSBhbm9ueW1vdXMgdHlwZSBsaXN0CiAJCWlmICh0aGlzLmFub255bW91c1R5cGVzID09IG51bGwpIHsKIAkJCXRoaXMuYW5vbnltb3VzVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKQEAgLTcyLDExICsxMDIsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWlmICh0aGlzLmFub255bW91c1R5cGVDb3VudCA9PSB0aGlzLmFub255bW91c1R5cGVzLmxlbmd0aCkgewogCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCXRoaXMuYW5vbnltb3VzVHlwZXMsIAotCQkJCQkwLCAKLQkJCQkJKHRoaXMuYW5vbnltb3VzVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVsyICogdGhpcy5hbm9ueW1vdXNUeXBlQ291bnRdKSwgCi0JCQkJCTAsIAotCQkJCQl0aGlzLmFub255bW91c1R5cGVDb3VudCk7IAorCQkJCQl0aGlzLmFub255bW91c1R5cGVzLAorCQkJCQkwLAorCQkJCQkodGhpcy5hbm9ueW1vdXNUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiB0aGlzLmFub255bW91c1R5cGVDb3VudF0pLAorCQkJCQkwLAorCQkJCQl0aGlzLmFub255bW91c1R5cGVDb3VudCk7CiAJCQl9CiAJCX0KIAkJLy8gU3RvcmUgdHlwZSBkZWNsYXJhdGlvbiBhcyBhbiBhbm9ueW1vdXMgdHlwZQpAQCAtODUsMTEgKzExNSwzNCBAQAogCQlyZXR1cm4gZWxlbWVudDsKIAl9CiB9Ci0vKiAKK3B1YmxpYyB2b2lkIGF0dGFjaChSZWNvdmVyZWRBbm5vdGF0aW9uW10gYW5ub3RzLCBpbnQgYW5ub3RDb3VudCwgaW50IG1vZHMsIGludCBtb2RzU291cmNlU3RhcnQpIHsKKwlpZiAoYW5ub3RDb3VudCA+IDApIHsKKwkJQW5ub3RhdGlvbltdIGV4aXN0aW5nQW5ub3RhdGlvbnMgPSB0aGlzLmZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnM7CisJCWlmIChleGlzdGluZ0Fubm90YXRpb25zICE9IG51bGwpIHsKKwkJCXRoaXMuYW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvblthbm5vdENvdW50XTsKKwkJCXRoaXMuYW5ub3RhdGlvbkNvdW50ID0gMDsKKwkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGFubm90Q291bnQ7IGkrKykgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhpc3RpbmdBbm5vdGF0aW9ucy5sZW5ndGg7IGorKykgeworCQkJCQlpZiAoYW5ub3RzW2ldLmFubm90YXRpb24gPT0gZXhpc3RpbmdBbm5vdGF0aW9uc1tqXSkgY29udGludWUgbmV4dDsKKwkJCQl9CisJCQkJdGhpcy5hbm5vdGF0aW9uc1t0aGlzLmFubm90YXRpb25Db3VudCsrXSA9IGFubm90c1tpXTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdHM7CisJCQl0aGlzLmFubm90YXRpb25Db3VudCA9IGFubm90Q291bnQ7CisJCX0KKwl9CisKKwlpZiAobW9kcyAhPSAwKSB7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kczsKKwkJdGhpcy5tb2RpZmllcnNTdGFydCA9IG1vZHNTb3VyY2VTdGFydDsKKwl9Cit9CisvKgogICogQW5zd2VyIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBzdHJ1Y3R1cmUKICAqLwogcHVibGljIEFTVE5vZGUgcGFyc2VUcmVlKCl7Ci0JcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CisJcmV0dXJuIHRoaXMuZmllbGREZWNsYXJhdGlvbjsKIH0KIC8qCiAgKiBBbnN3ZXIgdGhlIHZlcnkgc291cmNlIGVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCkBAIC0xMDAsNTEgKzE1Myw4NSBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKXsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CiAJYnVmZmVyLmFwcGVuZCgiUmVjb3ZlcmVkIGZpZWxkOlxuIik7IC8vJE5PTi1OTFMtMSQKLQlmaWVsZERlY2xhcmF0aW9uLnByaW50KHRhYiArIDEsIGJ1ZmZlcik7CisJdGhpcy5maWVsZERlY2xhcmF0aW9uLnByaW50KHRhYiArIDEsIGJ1ZmZlcik7CisJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5ub3RhdGlvbkNvdW50OyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5hbm5vdGF0aW9uc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCX0KKwl9CiAJaWYgKHRoaXMuYW5vbnltb3VzVHlwZXMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5vbnltb3VzVHlwZUNvdW50OyBpKyspewogCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChhbm9ueW1vdXNUeXBlc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuYW5vbnltb3VzVHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSkpOwogCQl9CiAJfQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KLXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHVwZGF0ZWRGaWVsZERlY2xhcmF0aW9uKCl7CitwdWJsaWMgRmllbGREZWNsYXJhdGlvbiB1cGRhdGVkRmllbGREZWNsYXJhdGlvbihpbnQgZGVwdGgsIFNldCBrbm93blR5cGVzKXsKKwkvKiB1cGRhdGUgYW5ub3RhdGlvbnMgKi8KKwlpZiAodGhpcy5tb2RpZmllcnMgIT0gMCkgeworCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzIHw9IHRoaXMubW9kaWZpZXJzOworCQlpZiAodGhpcy5tb2RpZmllcnNTdGFydCA8IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMubW9kaWZpZXJzU3RhcnQ7CisJCX0KKwl9CisJLyogdXBkYXRlIGFubm90YXRpb25zICovCisJaWYgKHRoaXMuYW5ub3RhdGlvbkNvdW50ID4gMCl7CisJCWludCBleGlzdGluZ0NvdW50ID0gdGhpcy5maWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zID09IG51bGwgPyAwIDogdGhpcy5maWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zLmxlbmd0aDsKKwkJQW5ub3RhdGlvbltdIGFubm90YXRpb25SZWZlcmVuY2VzID0gbmV3IEFubm90YXRpb25bZXhpc3RpbmdDb3VudCArIHRoaXMuYW5ub3RhdGlvbkNvdW50XTsKKwkJaWYgKGV4aXN0aW5nQ291bnQgPiAwKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5maWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zLCAwLCBhbm5vdGF0aW9uUmVmZXJlbmNlcywgdGhpcy5hbm5vdGF0aW9uQ291bnQsIGV4aXN0aW5nQ291bnQpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm5vdGF0aW9uQ291bnQ7IGkrKyl7CisJCQlhbm5vdGF0aW9uUmVmZXJlbmNlc1tpXSA9IHRoaXMuYW5ub3RhdGlvbnNbaV0udXBkYXRlZEFubm90YXRpb25SZWZlcmVuY2UoKTsKKwkJfQorCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uUmVmZXJlbmNlczsKKworCQlpbnQgc3RhcnQgPSB0aGlzLmFubm90YXRpb25zWzBdLmFubm90YXRpb24uc291cmNlU3RhcnQ7CisJCWlmIChzdGFydCA8IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHN0YXJ0OworCQl9CisJfQogCiAJaWYgKHRoaXMuYW5vbnltb3VzVHlwZXMgIT0gbnVsbCkgewotCQlpZihmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKKwkJaWYodGhpcy5maWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm9ueW1vdXNUeXBlQ291bnQ7IGkrKyl7Ci0JCQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gYW5vbnltb3VzVHlwZXNbaV07CisJCQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gdGhpcy5hbm9ueW1vdXNUeXBlc1tpXTsKIAkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gcmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb247CiAJCQkJaWYodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHsKIAkJCQkJdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOwogCQkJCQl0eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKIAkJCQl9CiAJCQkJaWYgKHJlY292ZXJlZFR5cGUucHJlc2VydmVDb250ZW50KXsKLQkJCQkJVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGUgPSByZWNvdmVyZWRUeXBlLnVwZGF0ZWRUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQkJZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiA9IGFub255bW91c1R5cGUuYWxsb2NhdGlvbjsKLQkJCQkJaWYodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHsKKwkJCQkJVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGUgPSByZWNvdmVyZWRUeXBlLnVwZGF0ZWRUeXBlRGVjbGFyYXRpb24oZGVwdGggKyAxLCBrbm93blR5cGVzKTsKKwkJCQkJaWYgKGFub255bW91c1R5cGUgIT0gbnVsbCkgeworCQkJCQkJdGhpcy5maWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID0gYW5vbnltb3VzVHlwZS5hbGxvY2F0aW9uOwogCQkJCQkJaW50IGVuZCA9IGFub255bW91c1R5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci0JCQkJCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBlbmQ7Ci0JCQkJCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25FbmQgPSBlbmQ7CisJCQkJCQlpZiAoZW5kID4gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDczMzcKKwkJCQkJCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBlbmQ7CisJCQkJCQkJdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gZW5kOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZUNvdW50ID4gMCkgZmllbGREZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzTG9jYWxUeXBlOwotCQl9IGVsc2UgaWYoZmllbGREZWNsYXJhdGlvbi5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKKwkJCWlmICh0aGlzLmFub255bW91c1R5cGVDb3VudCA+IDApIHRoaXMuZmllbGREZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzTG9jYWxUeXBlOworCQl9IGVsc2UgaWYodGhpcy5maWVsZERlY2xhcmF0aW9uLmdldEtpbmQoKSA9PSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVCkgewogCQkJLy8gZmllbGREZWNsYXJhdGlvbiBpcyBhbiBlbnVtIGNvbnN0YW50CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5vbnltb3VzVHlwZUNvdW50OyBpKyspewotCQkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IGFub255bW91c1R5cGVzW2ldOworCQkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IHRoaXMuYW5vbnltb3VzVHlwZXNbaV07CiAJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHJlY292ZXJlZFR5cGUudHlwZURlY2xhcmF0aW9uOwogCQkJCWlmKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSB7CiAJCQkJCXR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKIAkJCQkJdHlwZURlY2xhcmF0aW9uLmJvZHlFbmQgPSB0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiAJCQkJfQotCQkJCXJlY292ZXJlZFR5cGUudXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpOworCQkJCS8vIGlmIHRoZSBlbnVtIGlzIHJlY292ZXJlZCB0aGVuIGVudW0gY29uc3RhbnRzIG11c3QgYmUgcmVjb3ZlcmVkIHRvby4KKwkJCQkvLyBkZXB0aCBpcyBjb25zaWRlcmVkIGFzIHRoZSBzYW1lIGFzIHRoZSBkZXB0aCBvZiB0aGUgZW51bQorCQkJCXJlY292ZXJlZFR5cGUudXBkYXRlZFR5cGVEZWNsYXJhdGlvbihkZXB0aCwga25vd25UeXBlcyk7CiAJCQl9CiAJCX0KIAl9Ci0JcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CisJcmV0dXJuIHRoaXMuZmllbGREZWNsYXJhdGlvbjsKIH0KIC8qCiAgKiBBIGNsb3NpbmcgYnJhY2UgZ290IGNvbnN1bWVkLCBtaWdodCBoYXZlIGNsb3NlZCB0aGUgY3VycmVudCBlbGVtZW50LApAQCAtMTUzLDIzICsyNDAsMjQgQEAKICAqIEZpZWxkcyBoYXZlIG5vIGFzc29jaWF0ZWQgYnJhY2VzLCB0aHVzIGlmIG1hdGNoZXMsIHRoZW4gdXBkYXRlIHBhcmVudC4KICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7Ci0JaWYgKGJyYWNrZXRCYWxhbmNlID4gMCl7IC8vIHdhcyBhbiBhcnJheSBpbml0aWFsaXplcgotCQlicmFja2V0QmFsYW5jZS0tOwotCQlpZiAoYnJhY2tldEJhbGFuY2UgPT0gMCkgewotCQkJaWYoZmllbGREZWNsYXJhdGlvbi5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKKwlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA+IDApeyAvLyB3YXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKKwkJdGhpcy5icmFja2V0QmFsYW5jZS0tOworCQlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA9PSAwKSB7CisJCQlpZih0aGlzLmZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpID09IEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UKSB7CiAJCQkJdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoYnJhY2VFbmQgLSAxKTsKLQkJCQlyZXR1cm4gcGFyZW50OworCQkJCXJldHVybiB0aGlzLnBhcmVudDsKIAkJCX0gZWxzZSB7Ci0JCQkJYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb24gPSB0cnVlOworCQkJCWlmICh0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwKQorCQkJCQl0aGlzLmFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uID0gdHJ1ZTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gdGhpczsKLQl9IGVsc2UgaWYgKGJyYWNrZXRCYWxhbmNlID09IDApIHsKLQkJYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb24gPSB0cnVlOworCX0gZWxzZSBpZiAodGhpcy5icmFja2V0QmFsYW5jZSA9PSAwKSB7CisJCXRoaXMuYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb24gPSB0cnVlOwogCQl1cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZUVuZCAtIDEpOwogCX0KLQlpZiAocGFyZW50ICE9IG51bGwpewotCQlyZXR1cm4gcGFyZW50LnVwZGF0ZU9uQ2xvc2luZ0JyYWNlKGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsKKwlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCl7CisJCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CiAJfQogCXJldHVybiB0aGlzOwogfQpAQCAtMTc4LDIzICsyNjYsMzAgQEAKICAqIGluIHdoaWNoIGNhc2UgdGhlIGJvZHlTdGFydCBpcyB1cGRhdGVkLgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKLQlpZiAoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwIAotCQkmJiAoZmllbGREZWNsYXJhdGlvbi50eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlUmVmZXJlbmNlIHx8IGZpZWxkRGVjbGFyYXRpb24udHlwZSBpbnN0YW5jZW9mIEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkKLQkJJiYgIWFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uKXsKLQkJYnJhY2tldEJhbGFuY2UrKzsKLQkJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkJKGFycmF5IGluaXRpYWxpemVyKQorCWlmICh0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQlpZiAodGhpcy5maWVsZERlY2xhcmF0aW9uLnR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGVSZWZlcmVuY2UgfHwgdGhpcy5maWVsZERlY2xhcmF0aW9uLnR5cGUgaW5zdGFuY2VvZiBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCWlmICghdGhpcy5hbHJlYWR5Q29tcGxldGVkRmllbGRJbml0aWFsaXphdGlvbikgeworCQkJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gbm8gdXBkYXRlIGlzIG5lY2Vzc2FyeQkoYXJyYXkgaW5pdGlhbGl6ZXIpCisJCQl9CisJCX0gZWxzZSB7ICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4OTgwCisJCQkvLyBpbiBjYXNlIGFuIGluaXRpYWxpemVyIGJyYWNrZXQgaXMgb3BlbmVkIGluIGEgbm9uLWFycmF5IGZpZWxkCisJCQkvLyBlLmcuIGludCBmaWVsZCA9IHsuLgorCQkJdGhpcy5icmFja2V0QmFsYW5jZSsrOworCQkJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkJKGFycmF5IGluaXRpYWxpemVyKQorCQl9CiAJfQotCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDAgCi0JCSYmIGZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpID09IEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UKXsKLQkJYnJhY2tldEJhbGFuY2UrKzsKKwlpZiAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDAKKwkJJiYgdGhpcy5maWVsZERlY2xhcmF0aW9uLmdldEtpbmQoKSA9PSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVCl7CisJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAkJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkJKGVudW0gY29uc3RhbnQpCiAJfQogCS8vIG1pZ2h0IGJlIGFuIGFycmF5IGluaXRpYWxpemVyCi0JdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZVN0YXJ0IC0gMSwgYnJhY2VFbmQgLSAxKTsJCi0JcmV0dXJuIHRoaXMucGFyZW50LnVwZGF0ZU9uT3BlbmluZ0JyYWNlKGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsJCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZVN0YXJ0IC0gMSwgYnJhY2VFbmQgLSAxKTsKKwlyZXR1cm4gdGhpcy5wYXJlbnQudXBkYXRlT25PcGVuaW5nQnJhY2UoYnJhY2VTdGFydCwgYnJhY2VFbmQpOwogfQogcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7Ci0JdGhpcy51cGRhdGVkRmllbGREZWNsYXJhdGlvbigpOworCXVwZGF0ZWRGaWVsZERlY2xhcmF0aW9uKDAsIG5ldyBIYXNoU2V0KCkpOwogfQogLyoKICAqIFVwZGF0ZSB0aGUgZGVjbGFyYXRpb25Tb3VyY2VFbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW1wb3J0LmphdmEKaW5kZXggOTY2NjMzNy4uM2UxYWFkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbXBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEltcG9ydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogLyoqCi0gKiBJbnRlcm5hbCBpbXBvcnQgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICogSW50ZXJuYWwgaW1wb3J0IHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeQogICovCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOwpAQCAtMjMsMTEgKzIzLDExIEBACiAJc3VwZXIocGFyZW50LCBicmFja2V0QmFsYW5jZSk7CiAJdGhpcy5pbXBvcnRSZWZlcmVuY2UgPSBpbXBvcnRSZWZlcmVuY2U7CiB9Ci0vKiAKKy8qCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCiBwdWJsaWMgQVNUTm9kZSBwYXJzZVRyZWUoKXsKLQlyZXR1cm4gaW1wb3J0UmVmZXJlbmNlOworCXJldHVybiB0aGlzLmltcG9ydFJlZmVyZW5jZTsKIH0KIC8qCiAgKiBBbnN3ZXIgdGhlIHZlcnkgc291cmNlIGVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCkBAIC0zNiwxNCArMzYsMTQgQEAKIAlyZXR1cm4gdGhpcy5pbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKLQlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIGltcG9ydDogIiArIGltcG9ydFJlZmVyZW5jZS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBpbXBvcnQ6ICIgKyB0aGlzLmltcG9ydFJlZmVyZW5jZS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCiB9CiBwdWJsaWMgSW1wb3J0UmVmZXJlbmNlIHVwZGF0ZWRJbXBvcnRSZWZlcmVuY2UoKXsKIAotCXJldHVybiBpbXBvcnRSZWZlcmVuY2U7CisJcmV0dXJuIHRoaXMuaW1wb3J0UmVmZXJlbmNlOwogfQogcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7Ci0JdGhpcy51cGRhdGVkSW1wb3J0UmVmZXJlbmNlKCk7CisJdXBkYXRlZEltcG9ydFJlZmVyZW5jZSgpOwogfQogLyoKICAqIFVwZGF0ZSB0aGUgZGVjbGFyYXRpb25Tb3VyY2VFbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhCmluZGV4IDdmMzJhZGYuLjEzYTZkZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEluaXRpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKQEAgLTI2LDcgKzI4LDEyIEBACiAJcHVibGljIFJlY292ZXJlZFR5cGVbXSBsb2NhbFR5cGVzOwogCXB1YmxpYyBpbnQgbG9jYWxUeXBlQ291bnQ7CiAKLQlwdWJsaWMgUmVjb3ZlcmVkQmxvY2sgaW5pdGlhbGl6ZXJCb2R5OwkKKwlwdWJsaWMgUmVjb3ZlcmVkQmxvY2sgaW5pdGlhbGl6ZXJCb2R5OworCisJaW50IHBlbmRpbmdNb2RpZmllcnM7CisJaW50IHBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gLTE7CisJUmVjb3ZlcmVkQW5ub3RhdGlvbltdIHBlbmRpbmdBbm5vdGF0aW9uczsKKwlpbnQgcGVuZGluZ0Fubm90YXRpb25Db3VudDsKIAogcHVibGljIFJlY292ZXJlZEluaXRpYWxpemVyKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSl7CiAJdGhpcyhmaWVsZERlY2xhcmF0aW9uLCBwYXJlbnQsIGJyYWNrZXRCYWxhbmNlLCBudWxsKTsKQEAgLTQyLDQxICs0OSw0MyBAQAogCiAJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSwKIAlkbyBub3QgY29uc2lkZXIgZWxlbWVudHMgcGFzc2VkIHRoZSBrbm93biBlbmQgKGlmIHNldCkKLQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgZWxlbWVudCAKKwlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgZWxlbWVudAogCSovCi0JaWYgKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwCi0JCQkmJiBuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ID4gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IDAKKwkJCSYmIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24uc291cmNlU3RhcnQgPiB0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKIAkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9CiAJLyogY29uc2lkZXIgdGhhdCBpZiB0aGUgb3BlbmluZyBicmFjZSB3YXMgbm90IGZvdW5kLCBpdCBpcyB0aGVyZSAqLwotCWlmICghZm91bmRPcGVuaW5nQnJhY2UpewotCQlmb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJaWYgKCF0aGlzLmZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CiAJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAl9Ci0JaW5pdGlhbGl6ZXJCb2R5ID0gbmV3IFJlY292ZXJlZEJsb2NrKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwotCWlmIChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSAwKSByZXR1cm4gaW5pdGlhbGl6ZXJCb2R5OworCXRoaXMuaW5pdGlhbGl6ZXJCb2R5ID0gbmV3IFJlY292ZXJlZEJsb2NrKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworCWlmIChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSAwKSByZXR1cm4gdGhpcy5pbml0aWFsaXplckJvZHk7CiAJcmV0dXJuIHRoaXM7CiB9CiAvKgogICogUmVjb3JkIGEgZmllbGQgZGVjbGFyYXRpb24gKGFjdCBsaWtlIGluc2lkZSBtZXRob2QgYm9keSkKICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEZpZWxkRGVjbGFyYXRpb24gbmV3RmllbGREZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAogCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgaW5pdGlhbGl6ZXIgY2FuIG9ubHkgYmUgZmluYWwgYW5kIG5vbiB2b2lkICovCiAJY2hhcltdW10gZmllbGRUeXBlTmFtZTsKIAlpZiAoKG5ld0ZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgIT0gMCAvKiBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgKi8KIAkJCXx8IChuZXdGaWVsZERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkgLy8gaW5pdGlhbGl6ZXIKIAkJCXx8ICgoZmllbGRUeXBlTmFtZSA9IG5ld0ZpZWxkRGVjbGFyYXRpb24udHlwZS5nZXRUeXBlTmFtZSgpKS5sZW5ndGggPT0gMSAvLyBub24gdm9pZAotCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkVHlwZU5hbWVbMF0sIFR5cGVCaW5kaW5nLlZPSUQuc291cmNlTmFtZSgpKSkpeyAKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZFR5cGVOYW1lWzBdLCBUeXBlQmluZGluZy5WT0lELnNvdXJjZU5hbWUoKSkpKXsKIAkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKLQkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChuZXdGaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CisJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkocHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKG5ld0ZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKIAkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChuZXdGaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9CiAKIAkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55LAogCWRvIG5vdCBjb25zaWRlciBlbGVtZW50cyBwYXNzZWQgdGhlIGtub3duIGVuZCAoaWYgc2V0KQotCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50IAorCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50CiAJKi8KIAlpZiAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID4gMAogCQkJJiYgbmV3RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKQEAgLTkzLDE2ICsxMDIsMjUgQEAKIAogCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLwotCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCi0JCQkmJiBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSByZXR1cm4gdGhpczsgLy8gaWdub3JlCisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwCisJCQkmJiBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKIAkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9CiAJLyogbWV0aG9kIGJvZHkgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkICovCiAJQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soMCk7Ci0JYmxvY2suc291cmNlU3RhcnQgPSAoKEluaXRpYWxpemVyKWZpZWxkRGVjbGFyYXRpb24pLnNvdXJjZVN0YXJ0OworCWJsb2NrLnNvdXJjZVN0YXJ0ID0gKChJbml0aWFsaXplcil0aGlzLmZpZWxkRGVjbGFyYXRpb24pLnNvdXJjZVN0YXJ0OwogCVJlY292ZXJlZEVsZW1lbnQgZWxlbWVudCA9IHRoaXMuYWRkKGJsb2NrLCAxKTsKLQlyZXR1cm4gZWxlbWVudC5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CQorCWlmICh0aGlzLmluaXRpYWxpemVyQm9keSAhPSBudWxsKSB7CisJCXRoaXMuaW5pdGlhbGl6ZXJCb2R5LmF0dGFjaFBlbmRpbmdNb2RpZmllcnMoCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50LAorCQkJCXRoaXMucGVuZGluZ01vZGlmaWVycywKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0KTsKKwl9CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisJcmV0dXJuIGVsZW1lbnQuYWRkKGxvY2FsRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogfQogLyoKICAqIFJlY29yZCBhIHN0YXRlbWVudCAtIHJlZ3VsYXIgbWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhIGJsb2NrIGJvZHkKQEAgLTExMSw4OSArMTI5LDE2NCBAQAogCiAJLyogZG8gbm90IGNvbnNpZGVyIGEgc3RhdGVtZW50IHN0YXJ0aW5nIHBhc3NlZCB0aGUgaW5pdGlhbGl6ZXIgZW5kIChpZiBzZXQpCiAJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyB0eXBlICovCi0JaWYgKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKLQkJCSYmIHN0YXRlbWVudC5zb3VyY2VTdGFydCA+IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpewotCQlpZiAocGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwlpZiAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAKKwkJCSYmIHN0YXRlbWVudC5zb3VyY2VTdGFydCA+IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOworCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiAJfQogCS8qIGluaXRpYWxpemVyIGJvZHkgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkICovCiAJQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soMCk7Ci0JYmxvY2suc291cmNlU3RhcnQgPSAoKEluaXRpYWxpemVyKWZpZWxkRGVjbGFyYXRpb24pLnNvdXJjZVN0YXJ0OworCWJsb2NrLnNvdXJjZVN0YXJ0ID0gKChJbml0aWFsaXplcil0aGlzLmZpZWxkRGVjbGFyYXRpb24pLnNvdXJjZVN0YXJ0OwogCVJlY292ZXJlZEVsZW1lbnQgZWxlbWVudCA9IHRoaXMuYWRkKGJsb2NrLCAxKTsKLQlyZXR1cm4gZWxlbWVudC5hZGQoc3RhdGVtZW50LCBicmFja2V0QmFsYW5jZVZhbHVlKTsJCisKKwlpZiAodGhpcy5pbml0aWFsaXplckJvZHkgIT0gbnVsbCkgeworCQl0aGlzLmluaXRpYWxpemVyQm9keS5hdHRhY2hQZW5kaW5nTW9kaWZpZXJzKAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25zLAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCwKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmllcnMsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCk7CisJfQorCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOworCisJcmV0dXJuIGVsZW1lbnQuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiB9CiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAogCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLwotCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCi0JCQkmJiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpewotCQlpZiAocGFyZW50ID09IG51bGwpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwlpZiAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAKKwkJCSYmIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwkJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gdGhpczsgLy8gaWdub3JlCiAJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNMb2NhbFR5cGUpICE9IDApeworCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzTG9jYWxUeXBlKSAhPSAwICB8fCBwYXJzZXIoKS5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCB8fCBwYXJzZXIoKS5zdGF0ZW1lbnRSZWNvdmVyeUFjdGl2YXRlZCl7CiAJCS8qIG1ldGhvZCBib2R5IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCAqLwogCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKLQkJYmxvY2suc291cmNlU3RhcnQgPSAoKEluaXRpYWxpemVyKWZpZWxkRGVjbGFyYXRpb24pLnNvdXJjZVN0YXJ0OworCQlibG9jay5zb3VyY2VTdGFydCA9ICgoSW5pdGlhbGl6ZXIpdGhpcy5maWVsZERlY2xhcmF0aW9uKS5zb3VyY2VTdGFydDsKIAkJUmVjb3ZlcmVkRWxlbWVudCBlbGVtZW50ID0gdGhpcy5hZGQoYmxvY2ssIDEpOwotCQlyZXR1cm4gZWxlbWVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsJCi0JfQkKLQlpZiAobG9jYWxUeXBlcyA9PSBudWxsKSB7Ci0JCWxvY2FsVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKLQkJbG9jYWxUeXBlQ291bnQgPSAwOworCQlpZiAodGhpcy5pbml0aWFsaXplckJvZHkgIT0gbnVsbCkgeworCQkJdGhpcy5pbml0aWFsaXplckJvZHkuYXR0YWNoUGVuZGluZ01vZGlmaWVycygKKwkJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCwKKwkJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0KTsKKwkJfQorCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwkJcmV0dXJuIGVsZW1lbnQuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CisJfQorCWlmICh0aGlzLmxvY2FsVHlwZXMgPT0gbnVsbCkgeworCQl0aGlzLmxvY2FsVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKKwkJdGhpcy5sb2NhbFR5cGVDb3VudCA9IDA7CiAJfSBlbHNlIHsKLQkJaWYgKGxvY2FsVHlwZUNvdW50ID09IGxvY2FsVHlwZXMubGVuZ3RoKSB7CisJCWlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID09IHRoaXMubG9jYWxUeXBlcy5sZW5ndGgpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJbG9jYWxUeXBlcywgCi0JCQkJMCwgCi0JCQkJKGxvY2FsVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVsyICogbG9jYWxUeXBlQ291bnRdKSwgCi0JCQkJMCwgCi0JCQkJbG9jYWxUeXBlQ291bnQpOyAKKwkJCQl0aGlzLmxvY2FsVHlwZXMsCisJCQkJMCwKKwkJCQkodGhpcy5sb2NhbFR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIHRoaXMubG9jYWxUeXBlQ291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMubG9jYWxUeXBlQ291bnQpOwogCQl9CiAJfQogCVJlY292ZXJlZFR5cGUgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRUeXBlKHR5cGVEZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2VWYWx1ZSk7Ci0JbG9jYWxUeXBlc1tsb2NhbFR5cGVDb3VudCsrXSA9IGVsZW1lbnQ7Ci0JCisJdGhpcy5sb2NhbFR5cGVzW3RoaXMubG9jYWxUeXBlQ291bnQrK10gPSBlbGVtZW50OworCisJaWYodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID4gMCkgeworCQllbGVtZW50LmF0dGFjaCgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQpOworCX0KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KLQlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKLQkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCWlmICghdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSl7CisJCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwogCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CiAJfQogCXJldHVybiBlbGVtZW50OwogfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkQW5ub3RhdGlvbk5hbWUoaW50IGlkZW50aWZpZXJQdHIsIGludCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBpbnQgYW5ub3RhdGlvblN0YXJ0LCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucyA9PSBudWxsKSB7CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbmV3IFJlY292ZXJlZEFubm90YXRpb25bNV07CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9PSB0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJMCwKKwkJCQkodGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvblsyICogdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQpOworCQl9CisJfQorCisJUmVjb3ZlcmVkQW5ub3RhdGlvbiBlbGVtZW50ID0gbmV3IFJlY292ZXJlZEFubm90YXRpb24oaWRlbnRpZmllclB0ciwgaWRlbnRpZmllckxlbmd0aFB0ciwgYW5ub3RhdGlvblN0YXJ0LCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKKworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zW3RoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCsrXSA9IGVsZW1lbnQ7CisKKwlyZXR1cm4gZWxlbWVudDsKK30KK3B1YmxpYyB2b2lkIGFkZE1vZGlmaWVyKGludCBmbGFnLCBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQpIHsKKwl0aGlzLnBlbmRpbmdNb2RpZmllcnMgfD0gZmxhZzsKKworCWlmICh0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0IDwgMCkgeworCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJfQorfQorcHVibGljIHZvaWQgcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCkgeworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKwl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQgPSAwOworCXRoaXMucGVuZGluZ01vZGlmaWVycyA9IDA7CisJdGhpcy5wZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworfQogcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CiAJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOwogCXJlc3VsdC5hcHBlbmQoIlJlY292ZXJlZCBpbml0aWFsaXplcjpcbiIpOyAvLyROT04tTkxTLTEkCiAJdGhpcy5maWVsZERlY2xhcmF0aW9uLnByaW50KHRhYiArIDEsIHJlc3VsdCk7CisJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5ub3RhdGlvbkNvdW50OyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQodGhpcy5hbm5vdGF0aW9uc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCX0KKwl9CiAJaWYgKHRoaXMuaW5pdGlhbGl6ZXJCb2R5ICE9IG51bGwpIHsKIAkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHRoaXMuaW5pdGlhbGl6ZXJCb2R5LnRvU3RyaW5nKHRhYiArIDEpKTsKIAl9CiAJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogfQotcHVibGljIEZpZWxkRGVjbGFyYXRpb24gdXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKXsKK3B1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHVwZGF0ZWRGaWVsZERlY2xhcmF0aW9uKGludCBkZXB0aCwgU2V0IGtub3duVHlwZXMpewogCi0JaWYgKGluaXRpYWxpemVyQm9keSAhPSBudWxsKXsKLQkJQmxvY2sgYmxvY2sgPSBpbml0aWFsaXplckJvZHkudXBkYXRlZEJsb2NrKCk7CisJaWYgKHRoaXMuaW5pdGlhbGl6ZXJCb2R5ICE9IG51bGwpeworCQlCbG9jayBibG9jayA9IHRoaXMuaW5pdGlhbGl6ZXJCb2R5LnVwZGF0ZWRCbG9jayhkZXB0aCwga25vd25UeXBlcyk7CiAJCWlmIChibG9jayAhPSBudWxsKXsKLQkJCSgoSW5pdGlhbGl6ZXIpZmllbGREZWNsYXJhdGlvbikuYmxvY2sgPSBibG9jazsKLQkJfQotCQlpZiAodGhpcy5sb2NhbFR5cGVDb3VudCA+IDApIGZpZWxkRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLkhhc0xvY2FsVHlwZTsKKwkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSB0aGlzLmZpZWxkRGVjbGFyYXRpb247CisJCQlpbml0aWFsaXplci5ibG9jayA9IGJsb2NrOwogCi0JfQkKLQlpZiAoZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQgPT0gMCl7Ci0JCWZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSB7CisJCQkJaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBibG9jay5zb3VyY2VFbmQ7CisJCQkJaW5pdGlhbGl6ZXIuYm9keUVuZCA9IGJsb2NrLnNvdXJjZUVuZDsKKwkJCX0KKwkJfQorCQlpZiAodGhpcy5sb2NhbFR5cGVDb3VudCA+IDApIHRoaXMuZmllbGREZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzTG9jYWxUeXBlOworCiAJfQotCXJldHVybiBmaWVsZERlY2xhcmF0aW9uOworCWlmICh0aGlzLmZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID09IDApeworCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID0gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCX0KKwlyZXR1cm4gdGhpcy5maWVsZERlY2xhcmF0aW9uOwogfQogLyoKICAqIEEgY2xvc2luZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGhhdmUgY2xvc2VkIHRoZSBjdXJyZW50IGVsZW1lbnQsCiAgKiBpbiB3aGljaCBjYXNlIGJvdGggdGhlIGN1cnJlbnRFbGVtZW50IGlzIGV4aXRlZAogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbkNsb3NpbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKLQlpZiAoKC0tYnJhY2tldEJhbGFuY2UgPD0gMCkgJiYgKHBhcmVudCAhPSBudWxsKSl7CisJaWYgKCgtLXRoaXMuYnJhY2tldEJhbGFuY2UgPD0gMCkgJiYgKHRoaXMucGFyZW50ICE9IG51bGwpKXsKIAkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZVN0YXJ0LCBicmFjZUVuZCk7Ci0JCXJldHVybiBwYXJlbnQ7CisJCXJldHVybiB0aGlzLnBhcmVudDsKIAl9CiAJcmV0dXJuIHRoaXM7CiB9CkBAIC0yMDIsNyArMjk1LDcgQEAKICAqIGluIHdoaWNoIGNhc2UgdGhlIGJvZHlTdGFydCBpcyB1cGRhdGVkLgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKLQlicmFja2V0QmFsYW5jZSsrOworCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAlyZXR1cm4gdGhpczsgLy8gcmVxdWVzdCB0byByZXN0YXJ0CiB9CiAvKgpAQCAtMjEwLDcgKzMwMyw3IEBACiAgKi8KIHB1YmxpYyB2b2lkIHVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGludCBicmFjZVN0YXJ0LCBpbnQgYnJhY2VFbmQpewogCWlmICh0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgewotCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcilmaWVsZERlY2xhcmF0aW9uOworCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcil0aGlzLmZpZWxkRGVjbGFyYXRpb247CiAJCWlmKHBhcnNlcigpLnJCcmFjZVN1Y2Nlc3NvclN0YXJ0ID49IGJyYWNlRW5kKSB7CiAJCQlpZiAoaW5pdGlhbGl6ZXIuYm9keVN0YXJ0IDwgcGFyc2VyKCkuckJyYWNlRW5kKSB7CiAJCQkJaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBwYXJzZXIoKS5yQnJhY2VFbmQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZExvY2FsVmFyaWFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCmluZGV4IGE3NjA4OTguLjk4ZGJhMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDggKzExLDEyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKIC8qKgotICogSW50ZXJuYWwgbG9jYWwgdmFyaWFibGUgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICogSW50ZXJuYWwgbG9jYWwgdmFyaWFibGUgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5CiAgKi8KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKQEAgLTIyLDYgKzI2LDEyIEBACiAKIHB1YmxpYyBjbGFzcyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIGV4dGVuZHMgUmVjb3ZlcmVkU3RhdGVtZW50IHsKIAorCXB1YmxpYyBSZWNvdmVyZWRBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CisJcHVibGljIGludCBhbm5vdGF0aW9uQ291bnQ7CisKKwlwdWJsaWMgaW50IG1vZGlmaWVyczsKKwlwdWJsaWMgaW50IG1vZGlmaWVyc1N0YXJ0OworCiAJcHVibGljIExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbjsKIAlib29sZWFuIGFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uOwogcHVibGljIFJlY292ZXJlZExvY2FsVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKQEAgLTMwLDcgKzQwLDcgQEAKIAl0aGlzLmFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uID0gbG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsOwogfQogLyoKLSAqIFJlY29yZCBhbiBleHByZXNzaW9uIHN0YXRlbWVudCBpZiBsb2NhbCB2YXJpYWJsZSBpcyBleHBlY3RpbmcgYW4gaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gCisgKiBSZWNvcmQgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaWYgbG9jYWwgdmFyaWFibGUgaXMgZXhwZWN0aW5nIGFuIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uCiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RtdCwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIApAQCAtNDQsMTEgKzU0LDM0IEBACiAJCXJldHVybiB0aGlzOwogCX0KIH0KLS8qIAorcHVibGljIHZvaWQgYXR0YWNoKFJlY292ZXJlZEFubm90YXRpb25bXSBhbm5vdHMsIGludCBhbm5vdENvdW50LCBpbnQgbW9kcywgaW50IG1vZHNTb3VyY2VTdGFydCkgeworCWlmIChhbm5vdENvdW50ID4gMCkgeworCQlBbm5vdGF0aW9uW10gZXhpc3RpbmdBbm5vdGF0aW9ucyA9IHRoaXMubG9jYWxEZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKKwkJaWYgKGV4aXN0aW5nQW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJdGhpcy5hbm5vdGF0aW9ucyA9IG5ldyBSZWNvdmVyZWRBbm5vdGF0aW9uW2Fubm90Q291bnRdOworCQkJdGhpcy5hbm5vdGF0aW9uQ291bnQgPSAwOworCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RDb3VudDsgaSsrKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleGlzdGluZ0Fubm90YXRpb25zLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChhbm5vdHNbaV0uYW5ub3RhdGlvbiA9PSBleGlzdGluZ0Fubm90YXRpb25zW2pdKSBjb250aW51ZSBuZXh0OworCQkJCX0KKwkJCQl0aGlzLmFubm90YXRpb25zW3RoaXMuYW5ub3RhdGlvbkNvdW50KytdID0gYW5ub3RzW2ldOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90czsKKwkJCXRoaXMuYW5ub3RhdGlvbkNvdW50ID0gYW5ub3RDb3VudDsKKwkJfQorCX0KKworCWlmIChtb2RzICE9IDApIHsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RzOworCQl0aGlzLm1vZGlmaWVyc1N0YXJ0ID0gbW9kc1NvdXJjZVN0YXJ0OworCX0KK30KKy8qCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCiBwdWJsaWMgQVNUTm9kZSBwYXJzZVRyZWUoKXsKLQlyZXR1cm4gbG9jYWxEZWNsYXJhdGlvbjsKKwlyZXR1cm4gdGhpcy5sb2NhbERlY2xhcmF0aW9uOwogfQogLyoKICAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKQEAgLTU3LDEwICs5MCwzNCBAQAogCXJldHVybiB0aGlzLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKLQlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIGxvY2FsIHZhcmlhYmxlOlxuIiArIGxvY2FsRGVjbGFyYXRpb24ucHJpbnQodGFiICsgMSwgbmV3IFN0cmluZ0J1ZmZlcigxMCkpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBsb2NhbCB2YXJpYWJsZTpcbiIgKyB0aGlzLmxvY2FsRGVjbGFyYXRpb24ucHJpbnQodGFiICsgMSwgbmV3IFN0cmluZ0J1ZmZlcigxMCkpOyAvLyROT04tTkxTLTEkCiB9Ci1wdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoKXsKLQlyZXR1cm4gbG9jYWxEZWNsYXJhdGlvbjsKK3B1YmxpYyBTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudChpbnQgZGVwdGgsIFNldCBrbm93blR5cGVzKXsKKwkvKiB1cGRhdGUgYW5ub3RhdGlvbnMgKi8KKwlpZiAodGhpcy5tb2RpZmllcnMgIT0gMCkgeworCQl0aGlzLmxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzIHw9IHRoaXMubW9kaWZpZXJzOworCQlpZiAodGhpcy5tb2RpZmllcnNTdGFydCA8IHRoaXMubG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQl0aGlzLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMubW9kaWZpZXJzU3RhcnQ7CisJCX0KKwl9CisJLyogdXBkYXRlIGFubm90YXRpb25zICovCisJaWYgKHRoaXMuYW5ub3RhdGlvbkNvdW50ID4gMCl7CisJCWludCBleGlzdGluZ0NvdW50ID0gdGhpcy5sb2NhbERlY2xhcmF0aW9uLmFubm90YXRpb25zID09IG51bGwgPyAwIDogdGhpcy5sb2NhbERlY2xhcmF0aW9uLmFubm90YXRpb25zLmxlbmd0aDsKKwkJQW5ub3RhdGlvbltdIGFubm90YXRpb25SZWZlcmVuY2VzID0gbmV3IEFubm90YXRpb25bZXhpc3RpbmdDb3VudCArIHRoaXMuYW5ub3RhdGlvbkNvdW50XTsKKwkJaWYgKGV4aXN0aW5nQ291bnQgPiAwKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhbERlY2xhcmF0aW9uLmFubm90YXRpb25zLCAwLCBhbm5vdGF0aW9uUmVmZXJlbmNlcywgdGhpcy5hbm5vdGF0aW9uQ291bnQsIGV4aXN0aW5nQ291bnQpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm5vdGF0aW9uQ291bnQ7IGkrKyl7CisJCQlhbm5vdGF0aW9uUmVmZXJlbmNlc1tpXSA9IHRoaXMuYW5ub3RhdGlvbnNbaV0udXBkYXRlZEFubm90YXRpb25SZWZlcmVuY2UoKTsKKwkJfQorCQl0aGlzLmxvY2FsRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uUmVmZXJlbmNlczsKKworCQlpbnQgc3RhcnQgPSB0aGlzLmFubm90YXRpb25zWzBdLmFubm90YXRpb24uc291cmNlU3RhcnQ7CisJCWlmIChzdGFydCA8IHRoaXMubG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQl0aGlzLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHN0YXJ0OworCQl9CisJfQorCXJldHVybiB0aGlzLmxvY2FsRGVjbGFyYXRpb247CiB9CiAvKgogICogQSBjbG9zaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgaGF2ZSBjbG9zZWQgdGhlIGN1cnJlbnQgZWxlbWVudCwKQEAgLTY5LDEzICsxMjYsMTMgQEAKICAqIEZpZWxkcyBoYXZlIG5vIGFzc29jaWF0ZWQgYnJhY2VzLCB0aHVzIGlmIG1hdGNoZXMsIHRoZW4gdXBkYXRlIHBhcmVudC4KICAqLwogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7Ci0JaWYgKGJyYWNrZXRCYWxhbmNlID4gMCl7IC8vIHdhcyBhbiBhcnJheSBpbml0aWFsaXplcgotCQlicmFja2V0QmFsYW5jZS0tOwotCQlpZiAoYnJhY2tldEJhbGFuY2UgPT0gMCkgYWxyZWFkeUNvbXBsZXRlZExvY2FsSW5pdGlhbGl6YXRpb24gPSB0cnVlOworCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlID4gMCl7IC8vIHdhcyBhbiBhcnJheSBpbml0aWFsaXplcgorCQl0aGlzLmJyYWNrZXRCYWxhbmNlLS07CisJCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlID09IDApIHRoaXMuYWxyZWFkeUNvbXBsZXRlZExvY2FsSW5pdGlhbGl6YXRpb24gPSB0cnVlOwogCQlyZXR1cm4gdGhpczsKIAl9Ci0JaWYgKHBhcmVudCAhPSBudWxsKXsKLQkJcmV0dXJuIHBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpeworCQlyZXR1cm4gdGhpcy5wYXJlbnQudXBkYXRlT25DbG9zaW5nQnJhY2UoYnJhY2VTdGFydCwgYnJhY2VFbmQpOwogCX0KIAlyZXR1cm4gdGhpczsKIH0KQEAgLTg0LDE4ICsxNDEsMTggQEAKICAqIGluIHdoaWNoIGNhc2UgdGhlIGJvZHlTdGFydCBpcyB1cGRhdGVkLgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKLQlpZiAobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwIAotCQkmJiAobG9jYWxEZWNsYXJhdGlvbi50eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlUmVmZXJlbmNlIHx8IGxvY2FsRGVjbGFyYXRpb24udHlwZSBpbnN0YW5jZW9mIEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkKLQkJJiYgIWFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uKXsKLQkJYnJhY2tldEJhbGFuY2UrKzsKKwlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDAKKwkJJiYgKHRoaXMubG9jYWxEZWNsYXJhdGlvbi50eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlUmVmZXJlbmNlIHx8IHRoaXMubG9jYWxEZWNsYXJhdGlvbi50eXBlIGluc3RhbmNlb2YgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKQorCQkmJiAhdGhpcy5hbHJlYWR5Q29tcGxldGVkTG9jYWxJbml0aWFsaXphdGlvbil7CisJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAkJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkJKGFycmF5IGluaXRpYWxpemVyKQogCX0KIAkvLyBtaWdodCBiZSBhbiBhcnJheSBpbml0aWFsaXplcgotCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoYnJhY2VTdGFydCAtIDEsIGJyYWNlRW5kIC0gMSk7CQotCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbk9wZW5pbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CQorCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoYnJhY2VTdGFydCAtIDEsIGJyYWNlRW5kIC0gMSk7CisJcmV0dXJuIHRoaXMucGFyZW50LnVwZGF0ZU9uT3BlbmluZ0JyYWNlKGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHVwZGF0ZVBhcnNlVHJlZSgpewotCXRoaXMudXBkYXRlZFN0YXRlbWVudCgpOworCXVwZGF0ZWRTdGF0ZW1lbnQoMCwgbmV3IEhhc2hTZXQoKSk7CiB9CiAvKgogICogVXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCkBAIC0xMDMsNyArMTYwLDcgQEAKIHB1YmxpYyB2b2lkIHVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGludCBib2R5U3RhcnQsIGludCBib2R5RW5kKXsKIAlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHsKIAkJdGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZDsKLQkJdGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gYm9keUVuZDsJCisJCXRoaXMubG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkVuZCA9IGJvZHlFbmQ7CiAJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTWV0aG9kLmphdmEKaW5kZXggZDM2ZjM1OC4uM2JmNzc1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZE1ldGhvZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDggKzEwLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKQEAgLTMxLDE5ICszNSwzMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIC8qKgotICogSW50ZXJuYWwgbWV0aG9kIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqIEludGVybmFsIG1ldGhvZCBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkKICAqLwogCiBwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkTWV0aG9kIGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCBpbXBsZW1lbnRzIFRlcm1pbmFsVG9rZW5zIHsKIAogCXB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uOwogCisJcHVibGljIFJlY292ZXJlZEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKwlwdWJsaWMgaW50IGFubm90YXRpb25Db3VudDsKKworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzU3RhcnQ7CisKIAlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIGxvY2FsVHlwZXM7CiAJcHVibGljIGludCBsb2NhbFR5cGVDb3VudDsKIAogCXB1YmxpYyBSZWNvdmVyZWRCbG9jayBtZXRob2RCb2R5OwogCXB1YmxpYyBib29sZWFuIGRpc2NhcmRCb2R5ID0gdHJ1ZTsKIAorCWludCBwZW5kaW5nTW9kaWZpZXJzOworCWludCBwZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworCVJlY292ZXJlZEFubm90YXRpb25bXSBwZW5kaW5nQW5ub3RhdGlvbnM7CisJaW50IHBlbmRpbmdBbm5vdGF0aW9uQ291bnQ7CisKIHB1YmxpYyBSZWNvdmVyZWRNZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSwgUGFyc2VyIHBhcnNlcil7CiAJc3VwZXIocGFyZW50LCBicmFja2V0QmFsYW5jZSwgcGFyc2VyKTsKIAl0aGlzLm1ldGhvZERlY2xhcmF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb247CkBAIC01NiwxNCArNzEsMTQgQEAKICAqIFJlY29yZCBhIG5lc3RlZCBibG9jayBkZWNsYXJhdGlvbgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQmxvY2sgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKLQogCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnksCiAJZG8gbm90IGNvbnNpZGVyIGVsZW1lbnRzIHBhc3NlZCB0aGUga25vd24gZW5kIChpZiBzZXQpCi0JaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIGVsZW1lbnQgCisJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIGVsZW1lbnQKIAkqLwotCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IDAKKwlpZiAodGhpcy5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IDAKIAkJJiYgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydAotCQkJPiBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCQk+IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQkJCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCQkJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKXsKIAkJCQkJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQogCQkJCX0gZWxzZSB7CkBAIC03MSw0MSArODYsNDEgQEAKIAkJCQl9CiAJfQogCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KLQlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKLQkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCWlmICghdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSl7CisJCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwogCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CiAJfQogCi0JbWV0aG9kQm9keSA9IG5ldyBSZWNvdmVyZWRCbG9jayhuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKLQlpZiAobmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgPT0gMCkgcmV0dXJuIG1ldGhvZEJvZHk7CisJdGhpcy5tZXRob2RCb2R5ID0gbmV3IFJlY292ZXJlZEJsb2NrKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworCWlmIChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSAwKSByZXR1cm4gdGhpcy5tZXRob2RCb2R5OwogCXJldHVybiB0aGlzOwogfQogLyoKICAqIFJlY29yZCBhIGZpZWxkIGRlY2xhcmF0aW9uCiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CiAKIAkvKiBsb2NhbCB2YXJpYWJsZXMgaW5zaWRlIG1ldGhvZCBjYW4gb25seSBiZSBmaW5hbCBhbmQgbm9uIHZvaWQgKi8KLQljaGFyW11bXSBmaWVsZFR5cGVOYW1lOyAKLQlpZiAoKGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgCisJY2hhcltdW10gZmllbGRUeXBlTmFtZTsKKwlpZiAoKGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwKIAkJfHwgKGZpZWxkRGVjbGFyYXRpb24udHlwZSA9PSBudWxsKSAvLyBpbml0aWFsaXplcgogCQl8fCAoKGZpZWxkVHlwZU5hbWUgPSBmaWVsZERlY2xhcmF0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKSkubGVuZ3RoID09IDEgLy8gbm9uIHZvaWQKLQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkVHlwZU5hbWVbMF0sIFR5cGVCaW5kaW5nLlZPSUQuc291cmNlTmFtZSgpKSkpeyAKLQorCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRUeXBlTmFtZVswXSwgVHlwZUJpbmRpbmcuVk9JRC5zb3VyY2VOYW1lKCkpKSl7CiAJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKXsKIAkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKIAkJfSBlbHNlIHsKLQkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOworCQkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwogCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChmaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAkJfQogCX0KIAkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55LAogCWRvIG5vdCBjb25zaWRlciBlbGVtZW50cyBwYXNzZWQgdGhlIGtub3duIGVuZCAoaWYgc2V0KQotCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50IAorCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50CiAJKi8KLQlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwCisJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwCiAJCSYmIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAotCQkJPiBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCQk+IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpewogCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCl7CiAJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCiAJCX0gZWxzZSB7CkBAIC0xMTMsOCArMTI4LDggQEAKIAkJfQogCX0KIAkvKiBjb25zaWRlciB0aGF0IGlmIHRoZSBvcGVuaW5nIGJyYWNlIHdhcyBub3QgZm91bmQsIGl0IGlzIHRoZXJlICovCi0JaWYgKCFmb3VuZE9wZW5pbmdCcmFjZSl7Ci0JCWZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKKwlpZiAoIXRoaXMuZm91bmRPcGVuaW5nQnJhY2UpeworCQl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKIAkJdGhpcy5icmFja2V0QmFsYW5jZSsrOwogCX0KIAkvLyBzdGlsbCBpbnNpZGUgbWV0aG9kLCB0cmVhdCBhcyBsb2NhbCB2YXJpYWJsZQpAQCAtMTI0LDE0ICsxMzksMTUgQEAKICAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIC0gcmVndWxhciBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGEgYmxvY2sgYm9keQogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCiAJLyogbG9jYWwgdmFyaWFibGVzIGluc2lkZSBtZXRob2QgY2FuIG9ubHkgYmUgZmluYWwgYW5kIG5vbiB2b2lkICovCi0vKgkKLQljaGFyW11bXSBsb2NhbFR5cGVOYW1lOyAKLQlpZiAoKGxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkFjY0ZpbmFsKSAhPSAwIC8vIGxvY2FsIHZhciBjYW4gb25seSBiZSBmaW5hbCAKKy8qCisJY2hhcltdW10gbG9jYWxUeXBlTmFtZTsKKwlpZiAoKGxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkFjY0ZpbmFsKSAhPSAwIC8vIGxvY2FsIHZhciBjYW4gb25seSBiZSBmaW5hbAogCQl8fCAobG9jYWxEZWNsYXJhdGlvbi50eXBlID09IG51bGwpIC8vIGluaXRpYWxpemVyCiAJCXx8ICgobG9jYWxUeXBlTmFtZSA9IGxvY2FsRGVjbGFyYXRpb24udHlwZS5nZXRUeXBlTmFtZSgpKS5sZW5ndGggPT0gMSAvLyBub24gdm9pZAotCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobG9jYWxUeXBlTmFtZVswXSwgVm9pZEJpbmRpbmcuc291cmNlTmFtZSgpKSkpeyAKKwkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGxvY2FsVHlwZU5hbWVbMF0sIFZvaWRCaW5kaW5nLnNvdXJjZU5hbWUoKSkpKXsKIAogCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCl7CiAJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCkBAIC0xNDMsMTggKzE1OSwxOCBAQAogKi8KIAkvKiBkbyBub3QgY29uc2lkZXIgYSB0eXBlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgdHlwZSBlbmQgKGlmIHNldCkKIAkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KLQlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKLQkJJiYgbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpewotCQkJCisJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMAorCQkmJiBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwogCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewogCQkJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQogCQl9IGVsc2UgewogCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAkJfQogCX0KLQlpZiAobWV0aG9kQm9keSA9PSBudWxsKXsKKwlpZiAodGhpcy5tZXRob2RCb2R5ID09IG51bGwpewogCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKLQkJYmxvY2suc291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CiAJCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudEJsb2NrID0gdGhpcy5hZGQoYmxvY2ssIDEpOwogCQlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA+IDApewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmJyYWNrZXRCYWxhbmNlIC0gMTsgaSsrKXsKQEAgLTE2NCwxNyArMTgwLDE4IEBACiAJCX0KIAkJcmV0dXJuIGN1cnJlbnRCbG9jay5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiAJfQotCXJldHVybiBtZXRob2RCb2R5LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlLCB0cnVlKTsKKwlyZXR1cm4gdGhpcy5tZXRob2RCb2R5LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlLCB0cnVlKTsKIH0KIC8qCiAgKiBSZWNvcmQgYSBzdGF0ZW1lbnQgLSByZWd1bGFyIG1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgYSBibG9jayBib2R5CiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RhdGVtZW50LCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCiAJLyogZG8gbm90IGNvbnNpZGVyIGEgdHlwZSBzdGFydGluZyBwYXNzZWQgdGhlIHR5cGUgZW5kIChpZiBzZXQpCiAJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyB0eXBlICovCi0JaWYgKG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCi0JCSYmIHN0YXRlbWVudC5zb3VyY2VTdGFydCA+IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwlpZiAodGhpcy5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwCisJCSYmIHN0YXRlbWVudC5zb3VyY2VTdGFydCA+IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpewogCiAJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCkBAIC0xODIsOSArMTk5LDkgQEAKIAkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoc3RhdGVtZW50LCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAkJfQogCX0KLQlpZiAobWV0aG9kQm9keSA9PSBudWxsKXsKKwlpZiAodGhpcy5tZXRob2RCb2R5ID09IG51bGwpewogCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKLQkJYmxvY2suc291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CiAJCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudEJsb2NrID0gdGhpcy5hZGQoYmxvY2ssIDEpOwogCQlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA+IDApewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmJyYWNrZXRCYWxhbmNlIC0gMTsgaSsrKXsKQEAgLTE5NCw2OSArMjExLDkxIEBACiAJCX0KIAkJcmV0dXJuIGN1cnJlbnRCbG9jay5hZGQoc3RhdGVtZW50LCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JcmV0dXJuIG1ldGhvZEJvZHkuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2VWYWx1ZSwgdHJ1ZSk7CQorCXJldHVybiB0aGlzLm1ldGhvZEJvZHkuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2VWYWx1ZSwgdHJ1ZSk7CiB9CiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAogCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLwotCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwIAotCQkmJiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKLQkJCQorCWlmICh0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAKKwkJJiYgdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwogCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewogCQkJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQogCQl9CiAJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNMb2NhbFR5cGUpICE9IDAgfHwgdGhpcy5wYXJzZXIoKS5tZXRob2RSZWNvdmVyeUFjdGl2YXRlZCB8fCB0aGlzLnBhcnNlcigpLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkKXsKLQkJaWYgKG1ldGhvZEJvZHkgPT0gbnVsbCl7CisJaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNMb2NhbFR5cGUpICE9IDAgfHwgcGFyc2VyKCkubWV0aG9kUmVjb3ZlcnlBY3RpdmF0ZWQgfHwgcGFyc2VyKCkuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQpeworCQlpZiAodGhpcy5tZXRob2RCb2R5ID09IG51bGwpewogCQkJQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soMCk7Ci0JCQlibG9jay5zb3VyY2VTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydDsKKwkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CiAJCQl0aGlzLmFkZChibG9jaywgMSk7CiAJCX0KLQkJcmV0dXJuIG1ldGhvZEJvZHkuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSwgdHJ1ZSk7CQorCQl0aGlzLm1ldGhvZEJvZHkuYXR0YWNoUGVuZGluZ01vZGlmaWVycygKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQpOworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwkJcmV0dXJuIHRoaXMubWV0aG9kQm9keS5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlLCB0cnVlKTsKIAl9CiAJc3dpdGNoIChUeXBlRGVjbGFyYXRpb24ua2luZCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKSkgewogCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTCA6CiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkFOTk9UQVRJT05fVFlQRV9ERUNMIDoKLQkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CisJCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkocHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwogCQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCiAJCQl9CiAJCQkvLyBjbG9zZSB0aGUgY29uc3RydWN0b3IKIAkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JaWYgKGxvY2FsVHlwZXMgPT0gbnVsbCkgewotCQlsb2NhbFR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbNV07Ci0JCWxvY2FsVHlwZUNvdW50ID0gMDsKKwlpZiAodGhpcy5sb2NhbFR5cGVzID09IG51bGwpIHsKKwkJdGhpcy5sb2NhbFR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbNV07CisJCXRoaXMubG9jYWxUeXBlQ291bnQgPSAwOwogCX0gZWxzZSB7Ci0JCWlmIChsb2NhbFR5cGVDb3VudCA9PSBsb2NhbFR5cGVzLmxlbmd0aCkgeworCQlpZiAodGhpcy5sb2NhbFR5cGVDb3VudCA9PSB0aGlzLmxvY2FsVHlwZXMubGVuZ3RoKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCWxvY2FsVHlwZXMsIAotCQkJCTAsIAotCQkJCShsb2NhbFR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIGxvY2FsVHlwZUNvdW50XSksIAotCQkJCTAsIAotCQkJCWxvY2FsVHlwZUNvdW50KTsgCisJCQkJdGhpcy5sb2NhbFR5cGVzLAorCQkJCTAsCisJCQkJKHRoaXMubG9jYWxUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiB0aGlzLmxvY2FsVHlwZUNvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLmxvY2FsVHlwZUNvdW50KTsKIAkJfQogCX0KIAlSZWNvdmVyZWRUeXBlIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkVHlwZSh0eXBlRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwotCWxvY2FsVHlwZXNbbG9jYWxUeXBlQ291bnQrK10gPSBlbGVtZW50OworCXRoaXMubG9jYWxUeXBlc1t0aGlzLmxvY2FsVHlwZUNvdW50KytdID0gZWxlbWVudDsKKworCWlmKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA+IDApIHsKKwkJZWxlbWVudC5hdHRhY2goCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50LAorCQkJCXRoaXMucGVuZGluZ01vZGlmaWVycywKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0KTsKKwl9CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CiAKIAkvKiBjb25zaWRlciB0aGF0IGlmIHRoZSBvcGVuaW5nIGJyYWNlIHdhcyBub3QgZm91bmQsIGl0IGlzIHRoZXJlICovCi0JaWYgKCFmb3VuZE9wZW5pbmdCcmFjZSl7Ci0JCWZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKKwlpZiAoIXRoaXMuZm91bmRPcGVuaW5nQnJhY2UpeworCQl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKIAkJdGhpcy5icmFja2V0QmFsYW5jZSsrOwogCX0KIAlyZXR1cm4gZWxlbWVudDsKIH0KIHB1YmxpYyBib29sZWFuIGJvZHlTdGFydHNBdEhlYWRlckVuZCgpewotCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQgPT0gbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKzE7CisJcmV0dXJuIHRoaXMubWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0ID09IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKzE7CiB9Ci0vKiAKKy8qCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCiBwdWJsaWMgQVNUTm9kZSBwYXJzZVRyZWUoKXsKLQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247CisJcmV0dXJuIHRoaXMubWV0aG9kRGVjbGFyYXRpb247Cit9CitwdWJsaWMgdm9pZCByZXNldFBlbmRpbmdNb2RpZmllcnMoKSB7CisJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBudWxsOworCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9IDA7CisJdGhpcy5wZW5kaW5nTW9kaWZpZXJzID0gMDsKKwl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gLTE7CiB9CiAvKgogICogQW5zd2VyIHRoZSB2ZXJ5IHNvdXJjZSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQpAQCAtMjY4LDYgKzMwNywxMiBAQAogCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlN0cmluZyh0YWIpKTsKIAlyZXN1bHQuYXBwZW5kKCJSZWNvdmVyZWQgbWV0aG9kOlxuIik7IC8vJE5PTi1OTFMtMSQKIAl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnByaW50KHRhYiArIDEsIHJlc3VsdCk7CisJaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5ub3RhdGlvbkNvdW50OyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQodGhpcy5hbm5vdGF0aW9uc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCX0KKwl9CiAJaWYgKHRoaXMubG9jYWxUeXBlcyAhPSBudWxsKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sb2NhbFR5cGVDb3VudDsgaSsrKSB7CiAJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCkBAIC0yODQsMjcgKzMyOSw1NiBAQAogICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQogICovCiBwdWJsaWMgdm9pZCB1cGRhdGVCb2R5U3RhcnQoaW50IGJvZHlTdGFydCl7Ci0JdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CQkKKwl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKIAl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCA9IGJvZHlTdGFydDsKIH0KLXB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHVwZGF0ZWRNZXRob2REZWNsYXJhdGlvbigpeworcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gdXBkYXRlZE1ldGhvZERlY2xhcmF0aW9uKGludCBkZXB0aCwgU2V0IGtub3duVHlwZXMpeworCS8qIHVwZGF0ZSBhbm5vdGF0aW9ucyAqLworCWlmICh0aGlzLm1vZGlmaWVycyAhPSAwKSB7CisJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzIHw9IHRoaXMubW9kaWZpZXJzOworCQlpZiAodGhpcy5tb2RpZmllcnNTdGFydCA8IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgeworCQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5tb2RpZmllcnNTdGFydDsKKwkJfQorCX0KKwkvKiB1cGRhdGUgYW5ub3RhdGlvbnMgKi8KKwlpZiAodGhpcy5hbm5vdGF0aW9uQ291bnQgPiAwKXsKKwkJaW50IGV4aXN0aW5nQ291bnQgPSB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zID09IG51bGwgPyAwIDogdGhpcy5tZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9ucy5sZW5ndGg7CisJCUFubm90YXRpb25bXSBhbm5vdGF0aW9uUmVmZXJlbmNlcyA9IG5ldyBBbm5vdGF0aW9uW2V4aXN0aW5nQ291bnQgKyB0aGlzLmFubm90YXRpb25Db3VudF07CisJCWlmIChleGlzdGluZ0NvdW50ID4gMCl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubWV0aG9kRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIDAsIGFubm90YXRpb25SZWZlcmVuY2VzLCB0aGlzLmFubm90YXRpb25Db3VudCwgZXhpc3RpbmdDb3VudCk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFubm90YXRpb25Db3VudDsgaSsrKXsKKwkJCWFubm90YXRpb25SZWZlcmVuY2VzW2ldID0gdGhpcy5hbm5vdGF0aW9uc1tpXS51cGRhdGVkQW5ub3RhdGlvblJlZmVyZW5jZSgpOworCQl9CisJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uUmVmZXJlbmNlczsKIAotCWlmIChtZXRob2RCb2R5ICE9IG51bGwpewotCQlCbG9jayBibG9jayA9IG1ldGhvZEJvZHkudXBkYXRlZEJsb2NrKCk7CisJCWludCBzdGFydCA9IHRoaXMuYW5ub3RhdGlvbnNbMF0uYW5ub3RhdGlvbi5zb3VyY2VTdGFydDsKKwkJaWYgKHN0YXJ0IDwgdGhpcy5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzdGFydDsKKwkJfQorCX0KKworCWlmICh0aGlzLm1ldGhvZEJvZHkgIT0gbnVsbCl7CisJCUJsb2NrIGJsb2NrID0gdGhpcy5tZXRob2RCb2R5LnVwZGF0ZWRCbG9jayhkZXB0aCwga25vd25UeXBlcyk7CiAJCWlmIChibG9jayAhPSBudWxsKXsKLQkJCW1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzOworCQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50czsKKworCQkJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQkJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBibG9jay5zb3VyY2VFbmQ7CisJCQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kID0gYmxvY2suc291cmNlRW5kOworCQkJfQogCiAJCQkvKiBmaXJzdCBzdGF0ZW1lbnQgbWlnaHQgYmUgYW4gZXhwbGljdCBjb25zdHJ1Y3RvciBjYWxsIGRlc3RpbmF0ZWQgdG8gYSBzcGVjaWFsIHNsb3QgKi8KLQkJCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pbWV0aG9kRGVjbGFyYXRpb247Ci0JCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMgIT0gbnVsbAotCQkJCQkmJiBtZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzWzBdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpewotCQkJCQljb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpbWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50c1swXTsKLQkJCQkJaW50IGxlbmd0aCA9IG1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMubGVuZ3RoOworCQkJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKXRoaXMubWV0aG9kRGVjbGFyYXRpb247CisJCQkJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50cyAhPSBudWxsCisJCQkJCSYmIHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50c1swXSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKXsKKwkJCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKXRoaXMubWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50c1swXTsKKwkJCQkJaW50IGxlbmd0aCA9IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50cy5sZW5ndGg7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQltZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzLCAKLQkJCQkJCTEsIAotCQkJCQkJKG1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aC0xXSksCisJCQkJCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMsCisJCQkJCQkxLAorCQkJCQkJKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoLTFdKSwKIAkJCQkJCTAsCiAJCQkJCQlsZW5ndGgtMSk7CiAJCQkJCX0KQEAgLTMxMyw5ICszODcsMjEgQEAKIAkJCQkJfQogCQkJfQogCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQkJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kICsgMSA9PSB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCkgeworCQkJCS8vIHJpZ2h0IGJyYWNlIGlzIG1pc3NpbmcKKwkJCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CisJCQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQgPSB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKKwkJCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQgPSB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0OworCQkJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZCA9IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0OworCQkJfQorCQl9CiAJfQotCWlmIChsb2NhbFR5cGVDb3VudCA+IDApIG1ldGhvZERlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5IYXNMb2NhbFR5cGU7Ci0JcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOworCWlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID4gMCkgdGhpcy5tZXRob2REZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzTG9jYWxUeXBlOworCXJldHVybiB0aGlzLm1ldGhvZERlY2xhcmF0aW9uOwogfQogLyoKICAqIFVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlIGZyb20gcGFyc2VyIHN0YXRlIHdoaWNoCkBAIC0zMjMsMTMgKzQwOSwxMyBAQAogICovCiBwdWJsaWMgdm9pZCB1cGRhdGVGcm9tUGFyc2VyU3RhdGUoKXsKIAkvLyBpZiBwYXJlbnQgaXMgbnVsbCB0aGVuIHJlY292ZXJ5IGFscmVhZHkgb2NjdXJlZCBpbiBkaWV0IHBhcnNlci4KLQlpZih0aGlzLmJvZHlTdGFydHNBdEhlYWRlckVuZCgpICYmIHRoaXMucGFyZW50ICE9IG51bGwpewotCQlQYXJzZXIgcGFyc2VyID0gdGhpcy5wYXJzZXIoKTsKKwlpZihib2R5U3RhcnRzQXRIZWFkZXJFbmQoKSAmJiB0aGlzLnBhcmVudCAhPSBudWxsKXsKKwkJUGFyc2VyIHBhcnNlciA9IHBhcnNlcigpOwogCQkvKiBtaWdodCB3YW50IHRvIHJlY292ZXIgYXJndW1lbnRzIG9yIHRocm93biBleGNlcHRpb25zICovCiAJCWlmIChwYXJzZXIubGlzdExlbmd0aCA+IDAgJiYgcGFyc2VyLmFzdExlbmd0aFB0ciA+IDApeyAvLyBhd2FpdGluZyBpbnRlcmZhY2UgdHlwZSByZWZlcmVuY2VzCiAJCQkvKiBoYXMgY29uc3VtZWQgdGhlIGFyZ3VtZW50cyAtIGxpc3RlZCBlbGVtZW50cyBtdXN0IGJlIHRocm93biBleGNlcHRpb25zICovCi0JCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kID09IHBhcnNlci5yUGFyZW5Qb3MpIHsKLQkJCQkKKwkJCWlmICh0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSBwYXJzZXIuclBhcmVuUG9zKSB7CisKIAkJCQkvLyBwcm90ZWN0aW9uIGZvciBidWdzIDE1MTQyCiAJCQkJaW50IGxlbmd0aCA9IHBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXTsKIAkJCQlpbnQgYXN0UHRyID0gcGFyc2VyLmFzdFB0ciAtIGxlbmd0aDsKQEAgLTM0NSw3ICs0MzEsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCWlmIChjYW5Db25zdW1lKXsKLQkJCQkJcGFyc2VyLmNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKTsgCisJCQkJCXBhcnNlci5jb25zdW1lTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlKCk7CiAJCQkJCS8vIHdpbGwgcmVzZXQgdHlwZUxpc3RMZW5ndGggdG8gemVybwogCQkJCQkvLyB0aHVzIHRoaXMgY2hlY2sgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBvbiBmaXJzdCBlcnJvckNoZWNrIGFmdGVyIHZvaWQgZm9vKCkgdGhyb3dzIFgsIFksCiAJCQkJfSBlbHNlIHsKQEAgLTM1NSwyNyArNDQxLDI3IEBACiAJCQkJLyogaGFzIG5vdCBjb25zdW1lZCBhcmd1bWVudHMgeWV0LCBsaXN0ZWQgZWxlbWVudHMgbXVzdCBiZSBhcmd1bWVudHMgKi8KIAkJCQlpZiAocGFyc2VyLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMUEFSRU4gfHwgcGFyc2VyLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewogCQkJCQkvKiBpZiBjdXJyZW50VG9rZW4gaXMgcGFyZW50aGVzaXMgdGhpcyBsYXN0IGFyZ3VtZW50IGlzIGEgbWV0aG9kL2ZpZWxkIHNpZ25hdHVyZSAqLwotCQkJCQlwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl0gLS07IAotCQkJCQlwYXJzZXIuYXN0UHRyIC0tOyAKKwkJCQkJcGFyc2VyLmFzdExlbmd0aFN0YWNrW3BhcnNlci5hc3RMZW5ndGhQdHJdIC0tOworCQkJCQlwYXJzZXIuYXN0UHRyIC0tOwogCQkJCQlwYXJzZXIubGlzdExlbmd0aCAtLTsKIAkJCQkJcGFyc2VyLmN1cnJlbnRUb2tlbiA9IDA7CiAJCQkJfQogCQkJCWludCBhcmdMZW5ndGggPSBwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl07CiAJCQkJaW50IGFyZ1N0YXJ0ID0gcGFyc2VyLmFzdFB0ciAtIGFyZ0xlbmd0aCArIDE7CiAJCQkJYm9vbGVhbiBuZWVkVXBkYXRlUlBhcmVuUG9zID0gcGFyc2VyLnJQYXJlblBvcyA8IHBhcnNlci5sUGFyZW5Qb3M7IC8vIDEyMzg3IDogclBhcmVuUG9zIHdpbGwgYmUgdXNlZAotCQkJCQorCiAJCQkJLy8gcmVtb3ZlIHVuZmluaXNoZWQgYW5ub3RhdGlvbiBub2RlcwogCQkJCU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBudWxsOwotCQkJCWlmIChhcmdMZW5ndGggPiAwICYmIHBhcnNlci5hc3RTdGFja1twYXJzZXIuYXN0UHRyXSBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgeworCQkJCXdoaWxlIChhcmdMZW5ndGggPiAwICYmIHBhcnNlci5hc3RTdGFja1twYXJzZXIuYXN0UHRyXSBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgewogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcnNlci5hc3RTdGFjaywgYXJnU3RhcnQsIG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgTWVtYmVyVmFsdWVQYWlyW2FyZ0xlbmd0aF0sIDAsIGFyZ0xlbmd0aCk7CiAJCQkJCXBhcnNlci5hc3RMZW5ndGhQdHItLTsKIAkJCQkJcGFyc2VyLmFzdFB0ciAtPSBhcmdMZW5ndGg7Ci0JCQkJCQorCiAJCQkJCWFyZ0xlbmd0aCA9IHBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXTsKIAkJCQkJYXJnU3RhcnQgPSBwYXJzZXIuYXN0UHRyIC0gYXJnTGVuZ3RoICsgMTsKIAkJCQkJbmVlZFVwZGF0ZVJQYXJlblBvcyA9IHRydWU7CiAJCQkJfQotCQkJCQorCiAJCQkJLy8gdG8gY29tcHV0ZSBib2R5U3RhcnQsIGFuZCB0aHVzIHVzZWQgdG8gc2V0IG5leHQgY2hlY2twb2ludC4KIAkJCQlpbnQgY291bnQ7CiAJCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYXJnTGVuZ3RoOyBjb3VudCsrKXsKQEAgLTM4NywyMyArNDczLDIzIEBACiAJCQkJCQlpZiAoKGFyZ3VtZW50Lm1vZGlmaWVycyAmIH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRmluYWwpICE9IDAKIAkJCQkJCQl8fCAoYXJnVHlwZU5hbWUubGVuZ3RoID09IDEKIAkJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXJnVHlwZU5hbWVbMF0sIFR5cGVCaW5kaW5nLlZPSUQuc291cmNlTmFtZSgpKSkpewotCQkJCQkJCXBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXSA9IGNvdW50OyAKLQkJCQkJCQlwYXJzZXIuYXN0UHRyID0gYXJnU3RhcnQrY291bnQtMTsgCisJCQkJCQkJcGFyc2VyLmFzdExlbmd0aFN0YWNrW3BhcnNlci5hc3RMZW5ndGhQdHJdID0gY291bnQ7CisJCQkJCQkJcGFyc2VyLmFzdFB0ciA9IGFyZ1N0YXJ0K2NvdW50LTE7CiAJCQkJCQkJcGFyc2VyLmxpc3RMZW5ndGggPSBjb3VudDsKIAkJCQkJCQlwYXJzZXIuY3VycmVudFRva2VuID0gMDsKIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KIAkJCQkJCWlmIChuZWVkVXBkYXRlUlBhcmVuUG9zKSBwYXJzZXIuclBhcmVuUG9zID0gYXJndW1lbnQuc291cmNlRW5kICsgMTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXSA9IGNvdW50OyAKLQkJCQkJCXBhcnNlci5hc3RQdHIgPSBhcmdTdGFydCtjb3VudC0xOyAKKwkJCQkJCXBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXSA9IGNvdW50OworCQkJCQkJcGFyc2VyLmFzdFB0ciA9IGFyZ1N0YXJ0K2NvdW50LTE7CiAJCQkJCQlwYXJzZXIubGlzdExlbmd0aCA9IGNvdW50OwogCQkJCQkJcGFyc2VyLmN1cnJlbnRUb2tlbiA9IDA7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAocGFyc2VyLmxpc3RMZW5ndGggPiAwICYmIHBhcnNlci5hc3RMZW5ndGhQdHIgPiAwKXsKLQkJCQkJCisKIAkJCQkJLy8gcHJvdGVjdGlvbiBmb3IgYnVncyAxNTE0MgogCQkJCQlpbnQgbGVuZ3RoID0gcGFyc2VyLmFzdExlbmd0aFN0YWNrW3BhcnNlci5hc3RMZW5ndGhQdHJdOwogCQkJCQlpbnQgYXN0UHRyID0gcGFyc2VyLmFzdFB0ciAtIGxlbmd0aDsKQEAgLTQyMiwxMyArNTA4LDEzIEBACiAJCQkJCQlwYXJzZXIuY29uc3VtZU1ldGhvZEhlYWRlclJpZ2h0UGFyZW4oKTsKIAkJCQkJCS8qIGZpeC11cCBwb3NpdGlvbnMsIGdpdmVuIHRoZXkgd2VyZSB1cGRhdGVkIGFnYWluc3QgclBhcmVuUG9zLCB3aGljaCBkaWQgbm90IGdldCBzZXQgKi8KIAkJCQkJCWlmIChwYXJzZXIuY3VycmVudEVsZW1lbnQgPT0gdGhpcyl7IC8vIHBhcmFtZXRlciBhZGRpdGlvbiBtaWdodCBoYXZlIGFkZGVkIGFuIGF3YWl0aW5nIChubyByZXR1cm4gdHlwZSkgbWV0aG9kIC0gc2VlIDFGVlhRWjQgKi8KLQkJCQkJCQltZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQgPSBtZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHNbbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzLmxlbmd0aC0xXS5zb3VyY2VFbmQ7Ci0JCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKzE7Ci0JCQkJCQkJcGFyc2VyLmxhc3RDaGVja1BvaW50ID0gbWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0OworCQkJCQkJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHNbdGhpcy5tZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHMubGVuZ3RoLTFdLnNvdXJjZUVuZDsKKwkJCQkJCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCA9IHRoaXMubWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKzE7CisJCQkJCQkJcGFyc2VyLmxhc3RDaGVja1BvaW50ID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJCisKIAkJCQlpZihtZW1iZXJWYWx1ZVBhaXJzICE9IG51bGwpIHsKIAkJCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJWYWx1ZVBhaXJzLCAwLCBwYXJzZXIuYXN0U3RhY2ssIHBhcnNlci5hc3RQdHIgKyAxLCBtZW1iZXJWYWx1ZVBhaXJzLmxlbmd0aCk7CiAJCQkJCXBhcnNlci5hc3RQdHIgKz0gbWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7CkBAIC00NDcsOCArNTMzLDggQEAKIAkJcmV0dXJuIHRoaXM7CiAJfQogCWlmKHRoaXMucGFyZW50ICE9IG51bGwgJiYgdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKSB7Ci0JCWludCBtb2RpZmllcnMgPSAoKFJlY292ZXJlZFR5cGUpdGhpcy5wYXJlbnQpLnR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnM7Ci0JCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZChtb2RpZmllcnMpID09IFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTCkgeworCQlpbnQgbW9kcyA9ICgoUmVjb3ZlcmVkVHlwZSl0aGlzLnBhcmVudCkudHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKKwkJaWYgKFR5cGVEZWNsYXJhdGlvbi5raW5kKG1vZHMpID09IFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTCkgewogCQkJaWYgKCF0aGlzLmZvdW5kT3BlbmluZ0JyYWNlKSB7CiAJCQkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZVN0YXJ0IC0gMSwgYnJhY2VTdGFydCAtIDEpOwogCQkJCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CkBAIC00NjQsOSArNTUwLDkgQEAKIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uT3BlbmluZ0JyYWNlKGludCBicmFjZVN0YXJ0LCBpbnQgYnJhY2VFbmQpewogCiAJLyogaW4gY2FzZSB0aGUgb3BlbmluZyBicmFjZSBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIHNpZ25hdHVyZSAqLwotCWlmIChicmFja2V0QmFsYW5jZSA9PSAwKXsKKwlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA9PSAwKXsKIAkJLyoKLQkJCWlmIChwYXJzZXIuc2Nhbm5lci5zZWFyY2hMaW5lTnVtYmVyKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZCkgCisJCQlpZiAocGFyc2VyLnNjYW5uZXIuc2VhcmNoTGluZU51bWJlcihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQpCiAJCQkJIT0gcGFyc2VyLnNjYW5uZXIuc2VhcmNoTGluZU51bWJlcihicmFjZUVuZCkpewogCQkgKi8KIAkJc3dpdGNoKHBhcnNlcigpLmxhc3RJZ25vcmVkVG9rZW4pewpAQCAtNDc0LDE0ICs1NjAsMTQgQEAKIAkJCWNhc2UgVG9rZW5OYW1ldGhyb3dzIDoKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CQkJCQotCQkJCWJyYWNrZXRCYWxhbmNlID0gMTsgLy8gcHJldGVuZCB0aGUgYnJhY2Ugd2FzIGFscmVhZHkgdGhlcmUKKwkJCQl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKKwkJCQl0aGlzLmJyYWNrZXRCYWxhbmNlID0gMTsgLy8gcHJldGVuZCB0aGUgYnJhY2Ugd2FzIGFscmVhZHkgdGhlcmUKIAkJfQotCX0JCisJfQogCXJldHVybiBzdXBlci51cGRhdGVPbk9wZW5pbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1cGRhdGVQYXJzZVRyZWUoKXsKLQl0aGlzLnVwZGF0ZWRNZXRob2REZWNsYXJhdGlvbigpOworCXVwZGF0ZWRNZXRob2REZWNsYXJhdGlvbigwLCBuZXcgSGFzaFNldCgpKTsKIH0KIC8qCiAgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKQEAgLTQ5NywxOSArNTgzLDQ3IEBACiAJCX0KIAl9CiB9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGRBbm5vdGF0aW9uTmFtZShpbnQgaWRlbnRpZmllclB0ciwgaW50IGlkZW50aWZpZXJMZW5ndGhQdHIsIGludCBhbm5vdGF0aW9uU3RhcnQsIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CisJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb25zID09IG51bGwpIHsKKwkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvbls1XTsKKwkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID0gMDsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID09IHRoaXMucGVuZGluZ0Fubm90YXRpb25zLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQkwLAorCQkJCSh0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWNvdmVyZWRBbm5vdGF0aW9uWzIgKiB0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCk7CisJCX0KKwl9CisKKwlSZWNvdmVyZWRBbm5vdGF0aW9uIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvbihpZGVudGlmaWVyUHRyLCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBhbm5vdGF0aW9uU3RhcnQsIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOworCisJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnNbdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50KytdID0gZWxlbWVudDsKKworCXJldHVybiBlbGVtZW50OworfQorcHVibGljIHZvaWQgYWRkTW9kaWZpZXIoaW50IGZsYWcsIGludCBtb2RpZmllcnNTb3VyY2VTdGFydCkgeworCXRoaXMucGVuZGluZ01vZGlmaWVycyB8PSBmbGFnOworCisJaWYgKHRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQgPCAwKSB7CisJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQgPSBtb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9Cit9CiB2b2lkIGF0dGFjaChUeXBlUGFyYW1ldGVyW10gcGFyYW1ldGVycywgaW50IHN0YXJ0UG9zKSB7Ci0JaWYobWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzICE9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0KSByZXR1cm47Ci0JCisJaWYodGhpcy5tZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgIT0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpIHJldHVybjsKKwogCWludCBsYXN0UGFyYW1ldGVyRW5kID0gcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnNvdXJjZUVuZDsKLQkKLQlQYXJzZXIgcGFyc2VyID0gdGhpcy5wYXJzZXIoKTsKKworCVBhcnNlciBwYXJzZXIgPSBwYXJzZXIoKTsKIAlTY2FubmVyIHNjYW5uZXIgPSBwYXJzZXIuc2Nhbm5lcjsKLQlpZihVdGlsLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgc2Nhbm5lci5saW5lRW5kcywgMCwgc2Nhbm5lci5saW5lUHRyKQorCWlmKFV0aWwuZ2V0TGluZU51bWJlcih0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cikKIAkJCSE9IFV0aWwuZ2V0TGluZU51bWJlcihsYXN0UGFyYW1ldGVyRW5kLCBzY2FubmVyLmxpbmVFbmRzLCAwLCBzY2FubmVyLmxpbmVQdHIpKSByZXR1cm47Ci0JCisKIAlpZihwYXJzZXIubW9kaWZpZXJzU291cmNlU3RhcnQgPiBsYXN0UGFyYW1ldGVyRW5kCi0JCQkmJiBwYXJzZXIubW9kaWZpZXJzU291cmNlU3RhcnQgPCBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSByZXR1cm47Ci0JCisJCQkmJiBwYXJzZXIubW9kaWZpZXJzU291cmNlU3RhcnQgPCB0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQpIHJldHVybjsKKwogCWlmICh0aGlzLm1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJKChNZXRob2REZWNsYXJhdGlvbil0aGlzLm1ldGhvZERlY2xhcmF0aW9uKS50eXBlUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CiAJCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHN0YXJ0UG9zOwpAQCAtNTE4LDQgKzYzMiwyNyBAQAogCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzdGFydFBvczsKIAl9CiB9CitwdWJsaWMgdm9pZCBhdHRhY2goUmVjb3ZlcmVkQW5ub3RhdGlvbltdIGFubm90cywgaW50IGFubm90Q291bnQsIGludCBtb2RzLCBpbnQgbW9kc1NvdXJjZVN0YXJ0KSB7CisJaWYgKGFubm90Q291bnQgPiAwKSB7CisJCUFubm90YXRpb25bXSBleGlzdGluZ0Fubm90YXRpb25zID0gdGhpcy5tZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKKwkJaWYgKGV4aXN0aW5nQW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJdGhpcy5hbm5vdGF0aW9ucyA9IG5ldyBSZWNvdmVyZWRBbm5vdGF0aW9uW2Fubm90Q291bnRdOworCQkJdGhpcy5hbm5vdGF0aW9uQ291bnQgPSAwOworCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RDb3VudDsgaSsrKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleGlzdGluZ0Fubm90YXRpb25zLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChhbm5vdHNbaV0uYW5ub3RhdGlvbiA9PSBleGlzdGluZ0Fubm90YXRpb25zW2pdKSBjb250aW51ZSBuZXh0OworCQkJCX0KKwkJCQl0aGlzLmFubm90YXRpb25zW3RoaXMuYW5ub3RhdGlvbkNvdW50KytdID0gYW5ub3RzW2ldOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90czsKKwkJCXRoaXMuYW5ub3RhdGlvbkNvdW50ID0gYW5ub3RDb3VudDsKKwkJfQorCX0KKworCWlmIChtb2RzICE9IDApIHsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RzOworCQl0aGlzLm1vZGlmaWVyc1N0YXJ0ID0gbW9kc1NvdXJjZVN0YXJ0OworCX0KK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFN0YXRlbWVudC5qYXZhCmluZGV4IDE3OGUzZGIuLjVkM2Y2NTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw4ICsxMSwxMSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKLSAqIEludGVybmFsIHN0YXRlbWVudCBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkgCisgKiBJbnRlcm5hbCBzdGF0ZW1lbnQgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5CiAgKi8KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OwogCkBAIC0yMywxMSArMjYsMTEgQEAKIAlzdXBlcihwYXJlbnQsIGJyYWNrZXRCYWxhbmNlKTsKIAl0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKIH0KLS8qIAorLyoKICAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBwYXJzZWQgc3RydWN0dXJlCiAgKi8KIHB1YmxpYyBBU1ROb2RlIHBhcnNlVHJlZSgpewotCXJldHVybiBzdGF0ZW1lbnQ7CisJcmV0dXJuIHRoaXMuc3RhdGVtZW50OwogfQogLyoKICAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKQEAgLTM2LDE5ICszOSwyNiBAQAogCXJldHVybiB0aGlzLnN0YXRlbWVudC5zb3VyY2VFbmQ7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpewotCXJldHVybiB0YWJTdHJpbmcodGFiKSArICJSZWNvdmVyZWQgc3RhdGVtZW50OlxuIiArIHN0YXRlbWVudC5wcmludCh0YWIgKyAxLCBuZXcgU3RyaW5nQnVmZmVyKDEwKSk7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIHN0YXRlbWVudDpcbiIgKyB0aGlzLnN0YXRlbWVudC5wcmludCh0YWIgKyAxLCBuZXcgU3RyaW5nQnVmZmVyKDEwKSk7IC8vJE5PTi1OTFMtMSQKIH0KLXB1YmxpYyBTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCgpewotCXJldHVybiBzdGF0ZW1lbnQ7CitwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoaW50IGRlcHRoLCBTZXQga25vd25UeXBlcyl7CisJcmV0dXJuIHRoaXMuc3RhdGVtZW50OwogfQogcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7Ci0JdGhpcy51cGRhdGVkU3RhdGVtZW50KCk7CisJdXBkYXRlZFN0YXRlbWVudCgwLCBuZXcgSGFzaFNldCgpKTsKIH0KIC8qCiAgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKICAqLwogcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IGJvZHlTdGFydCwgaW50IGJvZHlFbmQpewotCWlmICh0aGlzLnN0YXRlbWVudC5zb3VyY2VFbmQgPT0gMCkJCisJaWYgKHRoaXMuc3RhdGVtZW50LnNvdXJjZUVuZCA9PSAwKQogCQl0aGlzLnN0YXRlbWVudC5zb3VyY2VFbmQgPSBib2R5RW5kOwogfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7CisJaWYgKCgtLXRoaXMuYnJhY2tldEJhbGFuY2UgPD0gMCkgJiYgKHRoaXMucGFyZW50ICE9IG51bGwpKXsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJfQorCXJldHVybiB0aGlzOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQppbmRleCBjZWJkZjdiLi5lYTUzNDU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw5ICsxMCwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKQEAgLTI0LDEyICsyOCwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiAKIC8qKgotICogSW50ZXJuYWwgdHlwZSBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkgCisgKiBJbnRlcm5hbCB0eXBlIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeQogICovCiAKIHB1YmxpYyBjbGFzcyBSZWNvdmVyZWRUeXBlIGV4dGVuZHMgUmVjb3ZlcmVkU3RhdGVtZW50IGltcGxlbWVudHMgVGVybWluYWxUb2tlbnMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9UWVBFX0RFUFRIID0gMjU2OworCQogCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOwogCisJcHVibGljIFJlY292ZXJlZEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKwlwdWJsaWMgaW50IGFubm90YXRpb25Db3VudDsKKworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzU3RhcnQ7CisKIAlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIG1lbWJlclR5cGVzOwogCXB1YmxpYyBpbnQgbWVtYmVyVHlwZUNvdW50OwogCXB1YmxpYyBSZWNvdmVyZWRGaWVsZFtdIGZpZWxkczsKQEAgLTM5LDEyICs1MSwxNyBAQAogCiAJcHVibGljIGJvb2xlYW4gcHJlc2VydmVDb250ZW50ID0gZmFsc2U7CS8vIG9ubHkgdXNlZCBmb3IgYW5vbnltb3VzIHR5cGVzCiAJcHVibGljIGludCBib2R5RW5kOwotCQorCiAJcHVibGljIGJvb2xlYW4gaW5zaWRlRW51bUNvbnN0YW50UGFydCA9IGZhbHNlOwotCQorCiAJcHVibGljIFR5cGVQYXJhbWV0ZXJbXSBwZW5kaW5nVHlwZVBhcmFtZXRlcnM7CiAJcHVibGljIGludCBwZW5kaW5nVHlwZVBhcmFtZXRlcnNTdGFydDsKLQkKKworCWludCBwZW5kaW5nTW9kaWZpZXJzOworCWludCBwZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworCVJlY292ZXJlZEFubm90YXRpb25bXSBwZW5kaW5nQW5ub3RhdGlvbnM7CisJaW50IHBlbmRpbmdBbm5vdGF0aW9uQ291bnQ7CisKIHB1YmxpYyBSZWNvdmVyZWRUeXBlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIFJlY292ZXJlZEVsZW1lbnQgcGFyZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpewogCXN1cGVyKHR5cGVEZWNsYXJhdGlvbiwgcGFyZW50LCBicmFja2V0QmFsYW5jZSk7CiAJdGhpcy50eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247CkBAIC01OCw0NSArNzUsNTYgQEAKIAlpZih0aGlzLmZvdW5kT3BlbmluZ0JyYWNlKSB7CiAJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAl9Ci0JCi0JdGhpcy5wcmVzZXJ2ZUNvbnRlbnQgPSB0aGlzLnBhcnNlcigpLm1ldGhvZFJlY292ZXJ5QWN0aXZhdGVkIHx8IHRoaXMucGFyc2VyKCkuc3RhdGVtZW50UmVjb3ZlcnlBY3RpdmF0ZWQ7CisKKwl0aGlzLnByZXNlcnZlQ29udGVudCA9IHBhcnNlcigpLm1ldGhvZFJlY292ZXJ5QWN0aXZhdGVkIHx8IHBhcnNlcigpLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkOwogfQogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CiAKIAkvKiBkbyBub3QgY29uc2lkZXIgYSBtZXRob2Qgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQogCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLwotCWlmICh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKLQkJJiYgbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAKKwkJJiYgbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKIAkJdGhpcy5wZW5kaW5nVHlwZVBhcmFtZXRlcnMgPSBudWxsOworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG1ldGhvZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9CiAKLQlpZiAobWV0aG9kcyA9PSBudWxsKSB7Ci0JCW1ldGhvZHMgPSBuZXcgUmVjb3ZlcmVkTWV0aG9kWzVdOwotCQltZXRob2RDb3VudCA9IDA7CisJaWYgKHRoaXMubWV0aG9kcyA9PSBudWxsKSB7CisJCXRoaXMubWV0aG9kcyA9IG5ldyBSZWNvdmVyZWRNZXRob2RbNV07CisJCXRoaXMubWV0aG9kQ291bnQgPSAwOwogCX0gZWxzZSB7Ci0JCWlmIChtZXRob2RDb3VudCA9PSBtZXRob2RzLmxlbmd0aCkgeworCQlpZiAodGhpcy5tZXRob2RDb3VudCA9PSB0aGlzLm1ldGhvZHMubGVuZ3RoKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCW1ldGhvZHMsIAotCQkJCTAsIAotCQkJCShtZXRob2RzID0gbmV3IFJlY292ZXJlZE1ldGhvZFsyICogbWV0aG9kQ291bnRdKSwgCi0JCQkJMCwgCi0JCQkJbWV0aG9kQ291bnQpOyAKKwkJCQl0aGlzLm1ldGhvZHMsCisJCQkJMCwKKwkJCQkodGhpcy5tZXRob2RzID0gbmV3IFJlY292ZXJlZE1ldGhvZFsyICogdGhpcy5tZXRob2RDb3VudF0pLAorCQkJCTAsCisJCQkJdGhpcy5tZXRob2RDb3VudCk7CiAJCX0KIAl9CiAJUmVjb3ZlcmVkTWV0aG9kIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlLCB0aGlzLnJlY292ZXJpbmdQYXJzZXIpOwotCW1ldGhvZHNbbWV0aG9kQ291bnQrK10gPSBlbGVtZW50OwotCQorCXRoaXMubWV0aG9kc1t0aGlzLm1ldGhvZENvdW50KytdID0gZWxlbWVudDsKKwogCWlmKHRoaXMucGVuZGluZ1R5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKIAkJZWxlbWVudC5hdHRhY2godGhpcy5wZW5kaW5nVHlwZVBhcmFtZXRlcnMsIHRoaXMucGVuZGluZ1R5cGVQYXJhbWV0ZXJzU3RhcnQpOwogCQl0aGlzLnBlbmRpbmdUeXBlUGFyYW1ldGVycyA9IG51bGw7CiAJfQotCQorCisJaWYodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID4gMCkgeworCQllbGVtZW50LmF0dGFjaCgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQpOworCX0KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCXRoaXMuaW5zaWRlRW51bUNvbnN0YW50UGFydCA9IGZhbHNlOwogCiAJLyogY29uc2lkZXIgdGhhdCBpZiB0aGUgb3BlbmluZyBicmFjZSB3YXMgbm90IGZvdW5kLCBpdCBpcyB0aGVyZSAqLwotCWlmICghZm91bmRPcGVuaW5nQnJhY2UpewotCQlmb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJaWYgKCF0aGlzLmZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CiAJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAl9CiAJLyogaWYgbWV0aG9kIG5vdCBmaW5pc2hlZCwgdGhlbiBtZXRob2QgYmVjb21lcyBjdXJyZW50ICovCkBAIC0xMDUsMzMgKzEzMywzNyBAQAogfQogcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEJsb2NrIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24saW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAl0aGlzLnBlbmRpbmdUeXBlUGFyYW1ldGVycyA9IG51bGw7Ci0JCi0JaW50IG1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OwotCWlmKHRoaXMucGFyc2VyKCkucmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydCAhPSAwKSB7Ci0JCW1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWM7CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisKKwlpbnQgbW9kcyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OworCWlmKHBhcnNlcigpLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgIT0gMCkgeworCQltb2RzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1N0YXRpYzsKIAl9Ci0JcmV0dXJuIHRoaXMuYWRkKG5ldyBJbml0aWFsaXplcihuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCBtb2RpZmllcnMpLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKKwlyZXR1cm4gdGhpcy5hZGQobmV3IEluaXRpYWxpemVyKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIG1vZHMpLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIH0KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZVZhbHVlKSB7CiAJdGhpcy5wZW5kaW5nVHlwZVBhcmFtZXRlcnMgPSBudWxsOwotCQorCiAJLyogZG8gbm90IGNvbnNpZGVyIGEgZmllbGQgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQogCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyB0eXBlICovCi0JaWYgKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwCi0JCSYmIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCkgeworCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwCisJCSYmIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisKKwkJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisKIAkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChmaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl9Ci0JaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCWZpZWxkcyA9IG5ldyBSZWNvdmVyZWRGaWVsZFs1XTsKLQkJZmllbGRDb3VudCA9IDA7CisJaWYgKHRoaXMuZmllbGRzID09IG51bGwpIHsKKwkJdGhpcy5maWVsZHMgPSBuZXcgUmVjb3ZlcmVkRmllbGRbNV07CisJCXRoaXMuZmllbGRDb3VudCA9IDA7CiAJfSBlbHNlIHsKLQkJaWYgKGZpZWxkQ291bnQgPT0gZmllbGRzLmxlbmd0aCkgeworCQlpZiAodGhpcy5maWVsZENvdW50ID09IHRoaXMuZmllbGRzLmxlbmd0aCkgewogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlmaWVsZHMsIAotCQkJCTAsIAotCQkJCShmaWVsZHMgPSBuZXcgUmVjb3ZlcmVkRmllbGRbMiAqIGZpZWxkQ291bnRdKSwgCi0JCQkJMCwgCi0JCQkJZmllbGRDb3VudCk7IAorCQkJCXRoaXMuZmllbGRzLAorCQkJCTAsCisJCQkJKHRoaXMuZmllbGRzID0gbmV3IFJlY292ZXJlZEZpZWxkWzIgKiB0aGlzLmZpZWxkQ291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMuZmllbGRDb3VudCk7CiAJCX0KIAl9CiAJUmVjb3ZlcmVkRmllbGQgZWxlbWVudDsKQEAgLTE0NywxMSArMTc5LDIwIEBACiAJCQkvLyBuZXZlciBoYXBwZW5zLCBhcyBmaWVsZCBpcyBhbHdheXMgaWRlbnRpZmllZAogCQkJcmV0dXJuIHRoaXM7CiAJfQotCWZpZWxkc1tmaWVsZENvdW50KytdID0gZWxlbWVudDsKKwl0aGlzLmZpZWxkc1t0aGlzLmZpZWxkQ291bnQrK10gPSBlbGVtZW50OworCisJaWYodGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50ID4gMCkgeworCQllbGVtZW50LmF0dGFjaCgKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucywKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZpZXJzLAorCQkJCXRoaXMucGVuZGluZ01vZGlmZXJzU291cmNlU3RhcnQpOworCX0KKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKIAogCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KLQlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKLQkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCWlmICghdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSl7CisJCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwogCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CiAJfQogCS8qIGlmIGZpZWxkIG5vdCBmaW5pc2hlZCwgdGhlbiBmaWVsZCBiZWNvbWVzIGN1cnJlbnQgKi8KQEAgLTE2MCwxNiArMjAxLDE5IEBACiB9CiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKIAl0aGlzLnBlbmRpbmdUeXBlUGFyYW1ldGVycyA9IG51bGw7Ci0JCisKIAkvKiBkbyBub3QgY29uc2lkZXIgYSB0eXBlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgdHlwZSBlbmQgKGlmIHNldCkKIAkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KLQlpZiAodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCi0JCSYmIG1lbWJlclR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwlpZiAodGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMAorCQkmJiBtZW1iZXJUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiAJfQotCQorCiAJdGhpcy5pbnNpZGVFbnVtQ29uc3RhbnRQYXJ0ID0gZmFsc2U7Ci0JCisKIAlpZiAoKG1lbWJlclR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApewogCQlpZiAodGhpcy5tZXRob2RDb3VudCA+IDApIHsKIAkJCS8vIGFkZCBpdCB0byB0aGUgbGFzdCBtZXRob2QgYm9keQpAQCAtMTc3LDMyICsyMjEsNDQgQEAKIAkJCWxhc3RNZXRob2QubWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7IC8vIHJlb3BlbiBtZXRob2QKIAkJCWxhc3RNZXRob2QubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAwOyAvLyByZW9wZW4gbWV0aG9kCiAJCQlsYXN0TWV0aG9kLmJyYWNrZXRCYWxhbmNlKys7IC8vIGV4cGVjdCBvbmUgY2xvc2luZyBicmFjZQorCisJCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCQkJcmV0dXJuIGxhc3RNZXRob2QuYWRkKG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2VWYWx1ZSk7CiAJCX0gZWxzZSB7CiAJCQkvLyBpZ25vcmUKIAkJCXJldHVybiB0aGlzOwogCQl9Ci0JfQkKLQkJCi0JaWYgKG1lbWJlclR5cGVzID09IG51bGwpIHsKLQkJbWVtYmVyVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKLQkJbWVtYmVyVHlwZUNvdW50ID0gMDsKKwl9CisKKwlpZiAodGhpcy5tZW1iZXJUeXBlcyA9PSBudWxsKSB7CisJCXRoaXMubWVtYmVyVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKKwkJdGhpcy5tZW1iZXJUeXBlQ291bnQgPSAwOwogCX0gZWxzZSB7Ci0JCWlmIChtZW1iZXJUeXBlQ291bnQgPT0gbWVtYmVyVHlwZXMubGVuZ3RoKSB7CisJCWlmICh0aGlzLm1lbWJlclR5cGVDb3VudCA9PSB0aGlzLm1lbWJlclR5cGVzLmxlbmd0aCkgewogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQltZW1iZXJUeXBlcywgCi0JCQkJMCwgCi0JCQkJKG1lbWJlclR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIG1lbWJlclR5cGVDb3VudF0pLCAKLQkJCQkwLCAKLQkJCQltZW1iZXJUeXBlQ291bnQpOyAKKwkJCQl0aGlzLm1lbWJlclR5cGVzLAorCQkJCTAsCisJCQkJKHRoaXMubWVtYmVyVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVsyICogdGhpcy5tZW1iZXJUeXBlQ291bnRdKSwKKwkJCQkwLAorCQkJCXRoaXMubWVtYmVyVHlwZUNvdW50KTsKIAkJfQogCX0KIAlSZWNvdmVyZWRUeXBlIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkVHlwZShtZW1iZXJUeXBlRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwotCW1lbWJlclR5cGVzW21lbWJlclR5cGVDb3VudCsrXSA9IGVsZW1lbnQ7CisJdGhpcy5tZW1iZXJUeXBlc1t0aGlzLm1lbWJlclR5cGVDb3VudCsrXSA9IGVsZW1lbnQ7CisKKwlpZih0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQgPiAwKSB7CisJCWVsZW1lbnQuYXR0YWNoKAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25zLAorCQkJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCwKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmllcnMsCisJCQkJdGhpcy5wZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCk7CisJfQorCXJlc2V0UGVuZGluZ01vZGlmaWVycygpOwogCiAJLyogY29uc2lkZXIgdGhhdCBpZiB0aGUgb3BlbmluZyBicmFjZSB3YXMgbm90IGZvdW5kLCBpdCBpcyB0aGVyZSAqLwotCWlmICghZm91bmRPcGVuaW5nQnJhY2UpewotCQlmb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJaWYgKCF0aGlzLmZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CiAJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKIAl9CiAJLyogaWYgbWVtYmVyIHR5cGUgbm90IGZpbmlzaGVkLCB0aGVuIG1lbWJlciB0eXBlIGJlY29tZXMgY3VycmVudCAqLwpAQCAtMjEzLDM0ICsyNjksODUgQEAKIAl0aGlzLnBlbmRpbmdUeXBlUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CiAJdGhpcy5wZW5kaW5nVHlwZVBhcmFtZXRlcnNTdGFydCA9IHN0YXJ0UG9zOwogfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkQW5ub3RhdGlvbk5hbWUoaW50IGlkZW50aWZpZXJQdHIsIGludCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBpbnQgYW5ub3RhdGlvblN0YXJ0LCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucyA9PSBudWxsKSB7CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbmV3IFJlY292ZXJlZEFubm90YXRpb25bNV07CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9PSB0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJMCwKKwkJCQkodGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvblsyICogdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQpOworCQl9CisJfQorCisJUmVjb3ZlcmVkQW5ub3RhdGlvbiBlbGVtZW50ID0gbmV3IFJlY292ZXJlZEFubm90YXRpb24oaWRlbnRpZmllclB0ciwgaWRlbnRpZmllckxlbmd0aFB0ciwgYW5ub3RhdGlvblN0YXJ0LCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKKworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zW3RoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCsrXSA9IGVsZW1lbnQ7CisKKwlyZXR1cm4gZWxlbWVudDsKK30KK3B1YmxpYyB2b2lkIGFkZE1vZGlmaWVyKGludCBmbGFnLCBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQpIHsKKwl0aGlzLnBlbmRpbmdNb2RpZmllcnMgfD0gZmxhZzsKKworCWlmICh0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0IDwgMCkgeworCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJfQorfQorcHVibGljIHZvaWQgYXR0YWNoKFJlY292ZXJlZEFubm90YXRpb25bXSBhbm5vdHMsIGludCBhbm5vdENvdW50LCBpbnQgbW9kcywgaW50IG1vZHNTb3VyY2VTdGFydCkgeworCWlmIChhbm5vdENvdW50ID4gMCkgeworCQlBbm5vdGF0aW9uW10gZXhpc3RpbmdBbm5vdGF0aW9ucyA9IHRoaXMudHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zOworCQlpZiAoZXhpc3RpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQl0aGlzLmFubm90YXRpb25zID0gbmV3IFJlY292ZXJlZEFubm90YXRpb25bYW5ub3RDb3VudF07CisJCQl0aGlzLmFubm90YXRpb25Db3VudCA9IDA7CisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdENvdW50OyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nQW5ub3RhdGlvbnMubGVuZ3RoOyBqKyspIHsKKwkJCQkJaWYgKGFubm90c1tpXS5hbm5vdGF0aW9uID09IGV4aXN0aW5nQW5ub3RhdGlvbnNbal0pIGNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJCXRoaXMuYW5ub3RhdGlvbnNbdGhpcy5hbm5vdGF0aW9uQ291bnQrK10gPSBhbm5vdHNbaV07CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLmFubm90YXRpb25zID0gYW5ub3RzOworCQkJdGhpcy5hbm5vdGF0aW9uQ291bnQgPSBhbm5vdENvdW50OworCQl9CisJfQorCisJaWYgKG1vZHMgIT0gMCkgeworCQl0aGlzLm1vZGlmaWVycyA9IG1vZHM7CisJCXRoaXMubW9kaWZpZXJzU3RhcnQgPSBtb2RzU291cmNlU3RhcnQ7CisJfQorfQogLyoKICAqIEFuc3dlciB0aGUgYm9keSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQogICovCiBwdWJsaWMgaW50IGJvZHlFbmQoKXsKLQlpZiAoYm9keUVuZCA9PSAwKSByZXR1cm4gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOwotCXJldHVybiBib2R5RW5kOworCWlmICh0aGlzLmJvZHlFbmQgPT0gMCkgcmV0dXJuIHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCXJldHVybiB0aGlzLmJvZHlFbmQ7CiB9CiBwdWJsaWMgYm9vbGVhbiBib2R5U3RhcnRzQXRIZWFkZXJFbmQoKXsKLQlpZiAodHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKXsKLQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzID09IG51bGwpewotCQkJaWYodHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9PSB0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kKzE7CisJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKXsKKwkJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uLnN1cGVyY2xhc3MgPT0gbnVsbCl7CisJCQlpZih0aGlzLnR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHRoaXMudHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9PSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQrMTsKIAkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQgPT0gdHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzW3R5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGgtMV0uc291cmNlRW5kKzE7CisJCQkJcmV0dXJuIHRoaXMudHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9PSB0aGlzLnR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyc1t0aGlzLnR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGgtMV0uc291cmNlRW5kKzE7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9PSB0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcy5zb3VyY2VFbmQrMTsKKwkJCXJldHVybiB0aGlzLnR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQgPT0gdGhpcy50eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcy5zb3VyY2VFbmQrMTsKIAkJfQogCX0gZWxzZSB7Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0IAotCQkJCT09IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXNbdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlcy5sZW5ndGgtMV0uc291cmNlRW5kKzE7CisJCXJldHVybiB0aGlzLnR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQKKwkJCQk9PSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXNbdGhpcy50eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzLmxlbmd0aC0xXS5zb3VyY2VFbmQrMTsKIAl9CiB9CiAvKgogICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgdHlwZSBub2RlLCBvciBudWxsIGlmIG5vbmUKICAqLwogcHVibGljIFJlY292ZXJlZFR5cGUgZW5jbG9zaW5nVHlwZSgpewotCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHBhcmVudDsKKwlSZWNvdmVyZWRFbGVtZW50IGN1cnJlbnQgPSB0aGlzLnBhcmVudDsKIAl3aGlsZSAoY3VycmVudCAhPSBudWxsKXsKIAkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKIAkJCXJldHVybiAoUmVjb3ZlcmVkVHlwZSkgY3VycmVudDsKQEAgLTI0OSwxNCArMzU2LDQ2IEBACiAJfQogCXJldHVybiBudWxsOwogfQotcHVibGljIGNoYXJbXSBuYW1lKCl7Ci0JcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5uYW1lOworcHVibGljIGludCBsYXN0TWVtYmVyRW5kKCkgeworCWludCBsYXN0TWVtYmVyRW5kID0gdGhpcy50eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0OworCisJaWYgKHRoaXMuZmllbGRDb3VudCA+IDApIHsKKwkJRmllbGREZWNsYXJhdGlvbiBsYXN0RmllbGQgPSB0aGlzLmZpZWxkc1t0aGlzLmZpZWxkQ291bnQgLSAxXS5maWVsZERlY2xhcmF0aW9uOworCQlpZiAobGFzdE1lbWJlckVuZCA8IGxhc3RGaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCAmJiBsYXN0RmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCkgeworCQkJbGFzdE1lbWJlckVuZCA9IGxhc3RGaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJfQorCX0KKworCWlmICh0aGlzLm1ldGhvZENvdW50ID4gMCkgeworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGxhc3RNZXRob2QgPSB0aGlzLm1ldGhvZHNbdGhpcy5tZXRob2RDb3VudCAtIDFdLm1ldGhvZERlY2xhcmF0aW9uOworCQlpZiAobGFzdE1lbWJlckVuZCA8IGxhc3RNZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgJiYgbGFzdE1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwKSB7CisJCQlsYXN0TWVtYmVyRW5kID0gbGFzdE1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJfQorCX0KKworCWlmICh0aGlzLm1lbWJlclR5cGVDb3VudCA+IDApIHsKKwkJVHlwZURlY2xhcmF0aW9uIGxhc3RUeXBlID0gdGhpcy5tZW1iZXJUeXBlc1t0aGlzLm1lbWJlclR5cGVDb3VudCAtIDFdLnR5cGVEZWNsYXJhdGlvbjsKKwkJaWYgKGxhc3RNZW1iZXJFbmQgPCBsYXN0VHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCAmJiBsYXN0VHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwKSB7CisJCQlsYXN0TWVtYmVyRW5kID0gbGFzdFR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCX0KKwl9CisKKwlyZXR1cm4gbGFzdE1lbWJlckVuZDsKIH0KLS8qIAorcHVibGljIGNoYXJbXSBuYW1lKCl7CisJcmV0dXJuIHRoaXMudHlwZURlY2xhcmF0aW9uLm5hbWU7Cit9CisvKgogICogQW5zd2VyIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBzdHJ1Y3R1cmUKICAqLwogcHVibGljIEFTVE5vZGUgcGFyc2VUcmVlKCl7Ci0JcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKKwlyZXR1cm4gdGhpcy50eXBlRGVjbGFyYXRpb247Cit9CitwdWJsaWMgdm9pZCByZXNldFBlbmRpbmdNb2RpZmllcnMoKSB7CisJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBudWxsOworCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9IDA7CisJdGhpcy5wZW5kaW5nTW9kaWZpZXJzID0gMDsKKwl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gLTE7CiB9CiAvKgogICogQW5zd2VyIHRoZSB2ZXJ5IHNvdXJjZSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQpAQCAtMjY3LDExICs0MDYsMTcgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgewogCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlN0cmluZyh0YWIpKTsKIAlyZXN1bHQuYXBwZW5kKCJSZWNvdmVyZWQgdHlwZTpcbiIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlKSAhPSAwKSB7CisJaWYgKCh0aGlzLnR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsKIAkJcmVzdWx0LmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJCXJlc3VsdC5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCX0KLQl0eXBlRGVjbGFyYXRpb24ucHJpbnQodGFiICsgMSwgcmVzdWx0KTsKKwl0aGlzLnR5cGVEZWNsYXJhdGlvbi5wcmludCh0YWIgKyAxLCByZXN1bHQpOworCWlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFubm90YXRpb25Db3VudDsgaSsrKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXN1bHQuYXBwZW5kKHRoaXMuYW5ub3RhdGlvbnNbaV0udG9TdHJpbmcodGFiICsgMSkpOworCQl9CisJfQogCWlmICh0aGlzLm1lbWJlclR5cGVzICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlclR5cGVDb3VudDsgaSsrKSB7CiAJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCkBAIC0yOTksMTggKzQ0NCwxOCBAQAogCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwogCXRoaXMudHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCA9IGJvZHlTdGFydDsKIH0KLXB1YmxpYyBTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCgpeworcHVibGljIFN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50KGludCBkZXB0aCwgU2V0IGtub3duVHlwZXMpewogCiAJLy8gaWdub3JlIGNsb3NlZCBhbm9ueW1vdXMgdHlwZQotCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCAmJiAhdGhpcy5wcmVzZXJ2ZUNvbnRlbnQpeworCWlmICgodGhpcy50eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlKSAhPSAwICYmICF0aGlzLnByZXNlcnZlQ29udGVudCl7CiAJCXJldHVybiBudWxsOwogCX0KLQkJCi0JVHlwZURlY2xhcmF0aW9uIHVwZGF0ZWRUeXBlID0gdGhpcy51cGRhdGVkVHlwZURlY2xhcmF0aW9uKCk7Ci0JaWYgKCh1cGRhdGVkVHlwZS5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApeworCisJVHlwZURlY2xhcmF0aW9uIHVwZGF0ZWRUeXBlID0gdXBkYXRlZFR5cGVEZWNsYXJhdGlvbihkZXB0aCArIDEsIGtub3duVHlwZXMpOworCWlmICh1cGRhdGVkVHlwZSAhPSBudWxsICYmICh1cGRhdGVkVHlwZS5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApewogCQkvKiBpbiBwcmVzZW5jZSBvZiBhbiBhbm9ueW1vdXMgdHlwZSwgd2Ugd2FudCB0aGUgZnVsbCBhbGxvY2F0aW9uIGV4cHJlc3Npb24gKi8KIAkJUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbiA9IHVwZGF0ZWRUeXBlLmFsbG9jYXRpb247Ci0JCQorCiAJCWlmIChhbGxvY2F0aW9uLnN0YXRlbWVudEVuZCA9PSAtMSkgewogCQkJYWxsb2NhdGlvbi5zdGF0ZW1lbnRFbmQgPSB1cGRhdGVkVHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZDsKIAkJfQpAQCAtMzE4LDE0MSArNDYzLDE5MCBAQAogCX0KIAlyZXR1cm4gdXBkYXRlZFR5cGU7CiB9Ci1wdWJsaWMgVHlwZURlY2xhcmF0aW9uIHVwZGF0ZWRUeXBlRGVjbGFyYXRpb24oKXsKLQlpbnQgbGFzdEVuZCA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQ7Ci0JLyogdXBkYXRlIG1lbWJlciB0eXBlcyAqLwotCWlmIChtZW1iZXJUeXBlQ291bnQgPiAwKXsKLQkJaW50IGV4aXN0aW5nQ291bnQgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOwotCQlUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJUeXBlRGVjbGFyYXRpb25zID0gbmV3IFR5cGVEZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgbWVtYmVyVHlwZUNvdW50XTsKK3B1YmxpYyBUeXBlRGVjbGFyYXRpb24gdXBkYXRlZFR5cGVEZWNsYXJhdGlvbihpbnQgZGVwdGgsIFNldCBrbm93blR5cGVzKXsKKwlpZiAoZGVwdGggPj0gTUFYX1RZUEVfREVQVEgpIHJldHVybiBudWxsOworCisJaWYoa25vd25UeXBlcy5jb250YWlucyh0aGlzLnR5cGVEZWNsYXJhdGlvbikpIHJldHVybiBudWxsOworCWtub3duVHlwZXMuYWRkKHRoaXMudHlwZURlY2xhcmF0aW9uKTsKKwkKKwlpbnQgbGFzdEVuZCA9IHRoaXMudHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydDsKKwkvKiB1cGRhdGUgYW5ub3RhdGlvbnMgKi8KKwlpZiAodGhpcy5tb2RpZmllcnMgIT0gMCkgeworCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMgfD0gdGhpcy5tb2RpZmllcnM7CisJCWlmICh0aGlzLm1vZGlmaWVyc1N0YXJ0IDwgdGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgeworCQkJdGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMubW9kaWZpZXJzU3RhcnQ7CisJCX0KKwl9CisJLyogdXBkYXRlIGFubm90YXRpb25zICovCisJaWYgKHRoaXMuYW5ub3RhdGlvbkNvdW50ID4gMCl7CisJCWludCBleGlzdGluZ0NvdW50ID0gdGhpcy50eXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiB0aGlzLnR5cGVEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucy5sZW5ndGg7CisJCUFubm90YXRpb25bXSBhbm5vdGF0aW9uUmVmZXJlbmNlcyA9IG5ldyBBbm5vdGF0aW9uW2V4aXN0aW5nQ291bnQgKyB0aGlzLmFubm90YXRpb25Db3VudF07CiAJCWlmIChleGlzdGluZ0NvdW50ID4gMCl7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcywgMCwgbWVtYmVyVHlwZURlY2xhcmF0aW9ucywgMCwgZXhpc3RpbmdDb3VudCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zLCAwLCBhbm5vdGF0aW9uUmVmZXJlbmNlcywgdGhpcy5hbm5vdGF0aW9uQ291bnQsIGV4aXN0aW5nQ291bnQpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm5vdGF0aW9uQ291bnQ7IGkrKyl7CisJCQlhbm5vdGF0aW9uUmVmZXJlbmNlc1tpXSA9IHRoaXMuYW5ub3RhdGlvbnNbaV0udXBkYXRlZEFubm90YXRpb25SZWZlcmVuY2UoKTsKKwkJfQorCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25SZWZlcmVuY2VzOworCisJCWludCBzdGFydCA9IHRoaXMuYW5ub3RhdGlvbnNbMF0uYW5ub3RhdGlvbi5zb3VyY2VTdGFydDsKKwkJaWYgKHN0YXJ0IDwgdGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgeworCQkJdGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHN0YXJ0OworCQl9CisJfQorCS8qIHVwZGF0ZSBtZW1iZXIgdHlwZXMgKi8KKwlpZiAodGhpcy5tZW1iZXJUeXBlQ291bnQgPiAwKXsKKwkJaW50IGV4aXN0aW5nQ291bnQgPSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IHRoaXMudHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLmxlbmd0aDsKKwkJVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZURlY2xhcmF0aW9ucyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bZXhpc3RpbmdDb3VudCArIHRoaXMubWVtYmVyVHlwZUNvdW50XTsKKwkJaWYgKGV4aXN0aW5nQ291bnQgPiAwKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMsIDAsIG1lbWJlclR5cGVEZWNsYXJhdGlvbnMsIDAsIGV4aXN0aW5nQ291bnQpOwogCQl9CiAJCS8vIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGVjbGFyYXRpb25Tb3VyY2VFbmQgb2YgdGhlIGxhc3QgdHlwZQotCQlpZiAobWVtYmVyVHlwZXNbbWVtYmVyVHlwZUNvdW50IC0gMV0udHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApeworCQlpZiAodGhpcy5tZW1iZXJUeXBlc1t0aGlzLm1lbWJlclR5cGVDb3VudCAtIDFdLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKIAkJCWludCBib2R5RW5kVmFsdWUgPSBib2R5RW5kKCk7Ci0JCQltZW1iZXJUeXBlc1ttZW1iZXJUeXBlQ291bnQgLSAxXS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBib2R5RW5kVmFsdWU7Ci0JCQltZW1iZXJUeXBlc1ttZW1iZXJUeXBlQ291bnQgLSAxXS50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9ICBib2R5RW5kVmFsdWU7CisJCQl0aGlzLm1lbWJlclR5cGVzW3RoaXMubWVtYmVyVHlwZUNvdW50IC0gMV0udHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZFZhbHVlOworCQkJdGhpcy5tZW1iZXJUeXBlc1t0aGlzLm1lbWJlclR5cGVDb3VudCAtIDFdLnR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gIGJvZHlFbmRWYWx1ZTsKIAkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVDb3VudDsgaSsrKXsKLQkJCW1lbWJlclR5cGVEZWNsYXJhdGlvbnNbZXhpc3RpbmdDb3VudCArIGldID0gbWVtYmVyVHlwZXNbaV0udXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpOworCQkKKwkJaW50IHVwZGF0ZWRDb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJUeXBlQ291bnQ7IGkrKyl7CisJCQlUeXBlRGVjbGFyYXRpb24gdXBkYXRlZFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMubWVtYmVyVHlwZXNbaV0udXBkYXRlZFR5cGVEZWNsYXJhdGlvbihkZXB0aCArIDEsIGtub3duVHlwZXMpOworCQkJaWYgKHVwZGF0ZWRUeXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCW1lbWJlclR5cGVEZWNsYXJhdGlvbnNbZXhpc3RpbmdDb3VudCArICh1cGRhdGVkQ291bnQrKyldID0gdXBkYXRlZFR5cGVEZWNsYXJhdGlvbjsKKwkJCX0KIAkJfQotCQl0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb25zOwotCQlpZihtZW1iZXJUeXBlRGVjbGFyYXRpb25zW21lbWJlclR5cGVEZWNsYXJhdGlvbnMubGVuZ3RoIC0gMV0uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiBsYXN0RW5kKSB7Ci0JCQlsYXN0RW5kID0gbWVtYmVyVHlwZURlY2xhcmF0aW9uc1ttZW1iZXJUeXBlRGVjbGFyYXRpb25zLmxlbmd0aCAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kOworCQlpZiAodXBkYXRlZENvdW50IDwgdGhpcy5tZW1iZXJUeXBlQ291bnQpIHsKKwkJCWludCBsZW5ndGggPSBleGlzdGluZ0NvdW50ICsgdXBkYXRlZENvdW50OworCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJUeXBlRGVjbGFyYXRpb25zLCAwLCBtZW1iZXJUeXBlRGVjbGFyYXRpb25zID0gbmV3IFR5cGVEZWNsYXJhdGlvbltsZW5ndGhdLCAwLCBsZW5ndGgpOworCQl9CisJCQorCQlpZiAobWVtYmVyVHlwZURlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7IAorCQkJdGhpcy50eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb25zOworCQkJaWYobWVtYmVyVHlwZURlY2xhcmF0aW9uc1ttZW1iZXJUeXBlRGVjbGFyYXRpb25zLmxlbmd0aCAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kID4gbGFzdEVuZCkgeworCQkJCWxhc3RFbmQgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb25zW21lbWJlclR5cGVEZWNsYXJhdGlvbnMubGVuZ3RoIC0gMV0uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQl9CiAJCX0KIAl9CiAJLyogdXBkYXRlIGZpZWxkcyAqLwotCWlmIChmaWVsZENvdW50ID4gMCl7Ci0JCWludCBleGlzdGluZ0NvdW50ID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9PSBudWxsID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOwotCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNsYXJhdGlvbnMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgZmllbGRDb3VudF07CisJaWYgKHRoaXMuZmllbGRDb3VudCA+IDApeworCQlpbnQgZXhpc3RpbmdDb3VudCA9IHRoaXMudHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9PSBudWxsID8gMCA6IHRoaXMudHlwZURlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGg7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW2V4aXN0aW5nQ291bnQgKyB0aGlzLmZpZWxkQ291bnRdOwogCQlpZiAoZXhpc3RpbmdDb3VudCA+IDApewotCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlRGVjbGFyYXRpb24uZmllbGRzLCAwLCBmaWVsZERlY2xhcmF0aW9ucywgMCwgZXhpc3RpbmdDb3VudCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudHlwZURlY2xhcmF0aW9uLmZpZWxkcywgMCwgZmllbGREZWNsYXJhdGlvbnMsIDAsIGV4aXN0aW5nQ291bnQpOwogCQl9CiAJCS8vIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGVjbGFyYXRpb25Tb3VyY2VFbmQgb2YgdGhlIGxhc3QgZmllbGQKLQkJaWYgKGZpZWxkc1tmaWVsZENvdW50IC0gMV0uZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJaWYgKHRoaXMuZmllbGRzW3RoaXMuZmllbGRDb3VudCAtIDFdLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CiAJCQlpbnQgdGVtcCA9IGJvZHlFbmQoKTsKLQkJCWZpZWxkc1tmaWVsZENvdW50IC0gMV0uZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRlbXA7Ci0JCQlmaWVsZHNbZmllbGRDb3VudCAtIDFdLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25FbmQgPSB0ZW1wOworCQkJdGhpcy5maWVsZHNbdGhpcy5maWVsZENvdW50IC0gMV0uZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRlbXA7CisJCQl0aGlzLmZpZWxkc1t0aGlzLmZpZWxkQ291bnQgLSAxXS5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gdGVtcDsKIAkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKyl7Ci0JCQlmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaV0gPSBmaWVsZHNbaV0udXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmZpZWxkQ291bnQ7IGkrKyl7CisJCQlmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaV0gPSB0aGlzLmZpZWxkc1tpXS51cGRhdGVkRmllbGREZWNsYXJhdGlvbihkZXB0aCwga25vd25UeXBlcyk7CiAJCX0KLQkJdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IGZpZWxkRGVjbGFyYXRpb25zOworCQkKKwkJZm9yIChpbnQgaSA9IHRoaXMuZmllbGRDb3VudCAtIDE7IDAgPCBpOyBpLS0pIHsKKwkJCWlmIChmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaSAtIDFdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPT0gZmllbGREZWNsYXJhdGlvbnNbZXhpc3RpbmdDb3VudCArIGldLmRlY2xhcmF0aW9uU291cmNlU3RhcnQpIHsKKwkJCQlmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaSAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbnNbZXhpc3RpbmdDb3VudCArIGldLmRlY2xhcmF0aW9uU291cmNlRW5kOworCQkJCWZpZWxkRGVjbGFyYXRpb25zW2V4aXN0aW5nQ291bnQgKyBpIC0gMV0uZGVjbGFyYXRpb25FbmQgPSBmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaV0uZGVjbGFyYXRpb25FbmQ7CisJCQl9CisJCX0KKwkJCisJCXRoaXMudHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IGZpZWxkRGVjbGFyYXRpb25zOwogCQlpZihmaWVsZERlY2xhcmF0aW9uc1tmaWVsZERlY2xhcmF0aW9ucy5sZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IGxhc3RFbmQpIHsKIAkJCWxhc3RFbmQgPSBmaWVsZERlY2xhcmF0aW9uc1tmaWVsZERlY2xhcmF0aW9ucy5sZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZDsKIAkJfQogCX0KIAkvKiB1cGRhdGUgbWV0aG9kcyAqLwotCWludCBleGlzdGluZ0NvdW50ID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPT0gbnVsbCA/IDAgOiB0eXBlRGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGg7CisJaW50IGV4aXN0aW5nQ291bnQgPSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZXRob2RzID09IG51bGwgPyAwIDogdGhpcy50eXBlRGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGg7CiAJYm9vbGVhbiBoYXNDb25zdHJ1Y3RvciA9IGZhbHNlLCBoYXNSZWNvdmVyZWRDb25zdHJ1Y3RvciA9IGZhbHNlOwogCWJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzID0gZmFsc2U7CiAJaW50IGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ID0gLTE7Ci0JaWYgKG1ldGhvZENvdW50ID4gMCl7Ci0JCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgbWV0aG9kQ291bnRdOworCWlmICh0aGlzLm1ldGhvZENvdW50ID4gMCl7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgdGhpcy5tZXRob2RDb3VudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb3VudDsgaSsrKXsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbSA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW2ldOworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtID0gdGhpcy50eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXTsKIAkJCWlmIChtLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ID0gaTsKIAkJCWlmIChtLmlzQWJzdHJhY3QoKSkgaGFzQWJzdHJhY3RNZXRob2RzID0gdHJ1ZTsKIAkJCW1ldGhvZERlY2xhcmF0aW9uc1tpXSA9IG07CiAJCX0KIAkJLy8gbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgbGFzdCBtZXRob2QKLQkJaWYgKG1ldGhvZHNbbWV0aG9kQ291bnQgLSAxXS5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJaWYgKHRoaXMubWV0aG9kc1t0aGlzLm1ldGhvZENvdW50IC0gMV0ubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CiAJCQlpbnQgYm9keUVuZFZhbHVlID0gYm9keUVuZCgpOwotCQkJbWV0aG9kc1ttZXRob2RDb3VudCAtIDFdLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZFZhbHVlOwotCQkJbWV0aG9kc1ttZXRob2RDb3VudCAtIDFdLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQgPSBib2R5RW5kVmFsdWU7CisJCQl0aGlzLm1ldGhvZHNbdGhpcy5tZXRob2RDb3VudCAtIDFdLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZFZhbHVlOworCQkJdGhpcy5tZXRob2RzW3RoaXMubWV0aG9kQ291bnQgLSAxXS5tZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kID0gYm9keUVuZFZhbHVlOwogCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ291bnQ7IGkrKyl7Ci0JCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHVwZGF0ZWRNZXRob2QgPSBtZXRob2RzW2ldLnVwZGF0ZWRNZXRob2REZWNsYXJhdGlvbigpOwkJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWV0aG9kQ291bnQ7IGkrKyl7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHVwZGF0ZWRNZXRob2QgPSB0aGlzLm1ldGhvZHNbaV0udXBkYXRlZE1ldGhvZERlY2xhcmF0aW9uKGRlcHRoLCBrbm93blR5cGVzKTsKIAkJCWlmICh1cGRhdGVkTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgaGFzUmVjb3ZlcmVkQ29uc3RydWN0b3IgPSB0cnVlOwogCQkJaWYgKHVwZGF0ZWRNZXRob2QuaXNBYnN0cmFjdCgpKSBoYXNBYnN0cmFjdE1ldGhvZHMgPSB0cnVlOwotCQkJbWV0aG9kRGVjbGFyYXRpb25zW2V4aXN0aW5nQ291bnQgKyBpXSA9IHVwZGF0ZWRNZXRob2Q7CQkJCisJCQltZXRob2REZWNsYXJhdGlvbnNbZXhpc3RpbmdDb3VudCArIGldID0gdXBkYXRlZE1ldGhvZDsKIAkJfQotCQl0eXBlRGVjbGFyYXRpb24ubWV0aG9kcyA9IG1ldGhvZERlY2xhcmF0aW9uczsKKwkJdGhpcy50eXBlRGVjbGFyYXRpb24ubWV0aG9kcyA9IG1ldGhvZERlY2xhcmF0aW9uczsKIAkJaWYobWV0aG9kRGVjbGFyYXRpb25zW21ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IGxhc3RFbmQpIHsKIAkJCWxhc3RFbmQgPSBtZXRob2REZWNsYXJhdGlvbnNbbWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kOwogCQl9Ci0JCWlmIChoYXNBYnN0cmFjdE1ldGhvZHMpIHR5cGVEZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSGFzQWJzdHJhY3RNZXRob2RzOwotCQloYXNDb25zdHJ1Y3RvciA9IHR5cGVEZWNsYXJhdGlvbi5jaGVja0NvbnN0cnVjdG9ycyh0aGlzLnBhcnNlcigpKTsKKwkJaWYgKGhhc0Fic3RyYWN0TWV0aG9kcykgdGhpcy50eXBlRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLkhhc0Fic3RyYWN0TWV0aG9kczsKKwkJaGFzQ29uc3RydWN0b3IgPSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5jaGVja0NvbnN0cnVjdG9ycyhwYXJzZXIoKSk7CiAJfSBlbHNlIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0NvdW50OyBpKyspewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW2ldLmlzQ29uc3RydWN0b3IoKSkgaGFzQ29uc3RydWN0b3IgPSB0cnVlOwotCQl9CQkKKwkJCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW2ldLmlzQ29uc3RydWN0b3IoKSkgaGFzQ29uc3RydWN0b3IgPSB0cnVlOworCQl9CiAJfQogCS8qIGFkZCBjbGluaXQgPyAqLwotCWlmICh0eXBlRGVjbGFyYXRpb24ubmVlZENsYXNzSW5pdE1ldGhvZCgpKXsKKwlpZiAodGhpcy50eXBlRGVjbGFyYXRpb24ubmVlZENsYXNzSW5pdE1ldGhvZCgpKXsKIAkJYm9vbGVhbiBhbHJlYWR5SGFzQ2xpbml0ID0gZmFsc2U7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb3VudDsgaSsrKXsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXS5pc0NsaW5pdCgpKXsKKwkJCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW2ldLmlzQ2xpbml0KCkpewogCQkJCWFscmVhZHlIYXNDbGluaXQgPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWlmICghYWxyZWFkeUhhc0NsaW5pdCkgdHlwZURlY2xhcmF0aW9uLmFkZENsaW5pdCgpOworCQlpZiAoIWFscmVhZHlIYXNDbGluaXQpIHRoaXMudHlwZURlY2xhcmF0aW9uLmFkZENsaW5pdCgpOwogCX0KIAkvKiBhZGQgZGVmYXVsdCBjb25zdHJ1Y3RvciA/ICovCiAJaWYgKGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ID49IDAgJiYgaGFzUmVjb3ZlcmVkQ29uc3RydWN0b3IpewogCQkvKiBzaG91bGQgZGlzY2FyZCBwcmV2aW91cyBkZWZhdWx0IGNvbnN0cnV0b3IgKi8KLQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IG5ldyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW3R5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aCAtIDFdOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbGFyYXRpb25zID0gbmV3IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bdGhpcy50eXBlRGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGggLSAxXTsKIAkJaWYgKGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ICE9IDApewotCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlRGVjbGFyYXRpb24ubWV0aG9kcywgMCwgbWV0aG9kRGVjbGFyYXRpb25zLCAwLCBkZWZhdWx0Q29uc3RydWN0b3JJbmRleCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudHlwZURlY2xhcmF0aW9uLm1ldGhvZHMsIDAsIG1ldGhvZERlY2xhcmF0aW9ucywgMCwgZGVmYXVsdENvbnN0cnVjdG9ySW5kZXgpOwogCQl9Ci0JCWlmIChkZWZhdWx0Q29uc3RydWN0b3JJbmRleCAhPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGgtMSl7CisJCWlmIChkZWZhdWx0Q29uc3RydWN0b3JJbmRleCAhPSB0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aC0xKXsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMsIAotCQkJCWRlZmF1bHRDb25zdHJ1Y3RvckluZGV4KzEsIAotCQkJCW1ldGhvZERlY2xhcmF0aW9ucywgCi0JCQkJZGVmYXVsdENvbnN0cnVjdG9ySW5kZXgsIAotCQkJCXR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aCAtIGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4IC0gMSk7CisJCQkJdGhpcy50eXBlRGVjbGFyYXRpb24ubWV0aG9kcywKKwkJCQlkZWZhdWx0Q29uc3RydWN0b3JJbmRleCsxLAorCQkJCW1ldGhvZERlY2xhcmF0aW9ucywKKwkJCQlkZWZhdWx0Q29uc3RydWN0b3JJbmRleCwKKwkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aCAtIGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4IC0gMSk7CiAJCX0KLQkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPSBtZXRob2REZWNsYXJhdGlvbnM7CisJCXRoaXMudHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPSBtZXRob2REZWNsYXJhdGlvbnM7CiAJfSBlbHNlIHsKLQkJaW50IGtpbmQgPSBUeXBlRGVjbGFyYXRpb24ua2luZCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKTsKKwkJaW50IGtpbmQgPSBUeXBlRGVjbGFyYXRpb24ua2luZCh0aGlzLnR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpOwogCQlpZiAoIWhhc0NvbnN0cnVjdG9yICYmCiAJCQkJa2luZCAhPSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wgJiYKIAkJCQlraW5kICE9IFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCAmJgotCQkJCXR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uID09IG51bGwpIHsvLyBpZiB3YXMgYWxyZWFkeSByZWR1Y2VkLCB0aGVuIGNvbnN0cnVjdG9yCisJCQkJdGhpcy50eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbiA9PSBudWxsKSB7Ly8gaWYgd2FzIGFscmVhZHkgcmVkdWNlZCwgdGhlbiBjb25zdHJ1Y3RvcgogCQkJYm9vbGVhbiBpbnNpZGVGaWVsZEluaXRpYWxpemVyID0gZmFsc2U7Ci0JCQlSZWNvdmVyZWRFbGVtZW50IHBhcmVudEVsZW1lbnQgPSB0aGlzLnBhcmVudDsgCisJCQlSZWNvdmVyZWRFbGVtZW50IHBhcmVudEVsZW1lbnQgPSB0aGlzLnBhcmVudDsKIAkJCXdoaWxlIChwYXJlbnRFbGVtZW50ICE9IG51bGwpewogCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQpewogCQkJCQkJaW5zaWRlRmllbGRJbml0aWFsaXplciA9IHRydWU7Ci0JCQkJCQlicmVhazsgCisJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJcGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQucGFyZW50OwogCQkJfQotCQkJdHlwZURlY2xhcmF0aW9uLmNyZWF0ZURlZmF1bHRDb25zdHJ1Y3RvcighcGFyc2VyKCkuZGlldCB8fCBpbnNpZGVGaWVsZEluaXRpYWxpemVyLCB0cnVlKTsKLQkJfSAKKwkJCXRoaXMudHlwZURlY2xhcmF0aW9uLmNyZWF0ZURlZmF1bHRDb25zdHJ1Y3RvcighcGFyc2VyKCkuZGlldCB8fCBpbnNpZGVGaWVsZEluaXRpYWxpemVyLCB0cnVlKTsKKwkJfQogCX0KLQlpZiAocGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7Ci0JCXR5cGVEZWNsYXJhdGlvbi5iaXRzIHw9IEFTVE5vZGUuSXNNZW1iZXJUeXBlOwotCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKLQkJdHlwZURlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5Jc0xvY2FsVHlwZTsKKwlpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKKwkJdGhpcy50eXBlRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLklzTWVtYmVyVHlwZTsKKwl9IGVsc2UgaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKKwkJdGhpcy50eXBlRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLklzTG9jYWxUeXBlOwogCX0KLQlpZih0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgewotCQl0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBsYXN0RW5kOwotCQl0eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IGxhc3RFbmQ7CisJaWYodGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGxhc3RFbmQ7CisJCXRoaXMudHlwZURlY2xhcmF0aW9uLmJvZHlFbmQgPSBsYXN0RW5kOwogCX0KLQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOworCXJldHVybiB0aGlzLnR5cGVEZWNsYXJhdGlvbjsKIH0KIC8qCiAgKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZSBmcm9tIHBhcnNlciBzdGF0ZSB3aGljaApAQCAtNDYxLDggKzY1NSw4IEBACiBwdWJsaWMgdm9pZCB1cGRhdGVGcm9tUGFyc2VyU3RhdGUoKXsKIAogCS8vIGFueW1vdXMgdHlwZSBhbmQgZW51bSBjb25zdGFudCBkb2Vzbid0IG5lZWQgdG8gYmUgdXBkYXRlZAotCWlmKHRoaXMuYm9keVN0YXJ0c0F0SGVhZGVyRW5kKCkgJiYgdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gPT0gbnVsbCl7Ci0JCVBhcnNlciBwYXJzZXIgPSB0aGlzLnBhcnNlcigpOworCWlmKGJvZHlTdGFydHNBdEhlYWRlckVuZCgpICYmIHRoaXMudHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gPT0gbnVsbCl7CisJCVBhcnNlciBwYXJzZXIgPSBwYXJzZXIoKTsKIAkJLyogbWlnaHQgd2FudCB0byByZWNvdmVyIGltcGxlbWVudGVkIGludGVyZmFjZXMgKi8KIAkJLy8gcHJvdGVjdGlvbiBmb3IgYnVncyAxNTE0MgogCQlpZiAocGFyc2VyLmxpc3RMZW5ndGggPiAwICYmIHBhcnNlci5hc3RMZW5ndGhQdHIgPiAwKXsgLy8gYXdhaXRpbmcgaW50ZXJmYWNlIHR5cGUgcmVmZXJlbmNlcwpAQCAtNDgwLDcgKzY3NCw3IEBACiAJCQkJfQogCQkJfQogCQkJaWYoY2FuQ29uc3VtZSkgewotCQkJCXBhcnNlci5jb25zdW1lQ2xhc3NIZWFkZXJJbXBsZW1lbnRzKCk7IAorCQkJCXBhcnNlci5jb25zdW1lQ2xhc3NIZWFkZXJJbXBsZW1lbnRzKCk7CiAJCQkJLy8gd2lsbCByZXNldCB0eXBlTGlzdExlbmd0aCB0byB6ZXJvCiAJCQkJLy8gdGh1cyB0aGlzIGNoZWNrIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgb24gZmlyc3QgZXJyb3JDaGVjayBhZnRlciBjbGFzcyBYIGltcGxlbWVudHMgWSxaLAogCQkJfQpAQCAtNTE2LDEwICs3MTAsMTAgQEAKICAqIGluIHdoaWNoIGNhc2UgYm90aCB0aGUgY3VycmVudEVsZW1lbnQgaXMgZXhpdGVkCiAgKi8KIHB1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uQ2xvc2luZ0JyYWNlKGludCBicmFjZVN0YXJ0LCBpbnQgYnJhY2VFbmQpewotCWlmICgoLS1icmFja2V0QmFsYW5jZSA8PSAwKSAmJiAocGFyZW50ICE9IG51bGwpKXsKKwlpZiAoKC0tdGhpcy5icmFja2V0QmFsYW5jZSA8PSAwKSAmJiAodGhpcy5wYXJlbnQgIT0gbnVsbCkpewogCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsKIAkJdGhpcy5ib2R5RW5kID0gYnJhY2VTdGFydCAtIDE7Ci0JCXJldHVybiBwYXJlbnQ7CisJCXJldHVybiB0aGlzLnBhcmVudDsKIAl9CiAJcmV0dXJuIHRoaXM7CiB9CkBAIC01MjksMTIgKzcyMywxMiBAQAogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKIAkvKiBpbiBjYXNlIHRoZSBvcGVuaW5nIGJyYWNlIGlzIG5vdCBjbG9zZSBlbm91Z2ggdG8gdGhlIHNpZ25hdHVyZSwgaWdub3JlIGl0ICovCi0JaWYgKGJyYWNrZXRCYWxhbmNlID09IDApeworCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlID09IDApewogCQkvKgotCQkJaWYgKHBhcnNlci5zY2FubmVyLnNlYXJjaExpbmVOdW1iZXIodHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCkgCisJCQlpZiAocGFyc2VyLnNjYW5uZXIuc2VhcmNoTGluZU51bWJlcih0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kKQogCQkJCSE9IHBhcnNlci5zY2FubmVyLnNlYXJjaExpbmVOdW1iZXIoYnJhY2VFbmQpKXsKIAkJICovCi0JCVBhcnNlciBwYXJzZXIgPSB0aGlzLnBhcnNlcigpOworCQlQYXJzZXIgcGFyc2VyID0gcGFyc2VyKCk7CiAJCXN3aXRjaChwYXJzZXIubGFzdElnbm9yZWRUb2tlbil7CiAJCQljYXNlIC0xIDoKIAkJCWNhc2UgVG9rZW5OYW1lZXh0ZW5kcyA6CkBAIC01NDMsMTUgKzczNywxNiBAQAogCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVCA6CiAJCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDoKIAkJCQlpZiAocGFyc2VyLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPT0gMCkgYnJlYWs7CisJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQlkZWZhdWx0OgotCQkJCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwkJCQkKLQkJCQlicmFja2V0QmFsYW5jZSA9IDE7IC8vIHByZXRlbmQgdGhlIGJyYWNlIHdhcyBhbHJlYWR5IHRoZXJlCisJCQkJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJCQkJdGhpcy5icmFja2V0QmFsYW5jZSA9IDE7IC8vIHByZXRlbmQgdGhlIGJyYWNlIHdhcyBhbHJlYWR5IHRoZXJlCiAJCX0KLQl9CQorCX0KIAkvLyBtaWdodCBiZSBhbiBpbml0aWFsaXplcgogCWlmICh0aGlzLmJyYWNrZXRCYWxhbmNlID09IDEpewogCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKLQkJUGFyc2VyIHBhcnNlciA9IHRoaXMucGFyc2VyKCk7CisJCVBhcnNlciBwYXJzZXIgPSBwYXJzZXIoKTsKIAkJYmxvY2suc291cmNlU3RhcnQgPSBwYXJzZXIuc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQlJbml0aWFsaXplciBpbml0OwogCQlpZiAocGFyc2VyLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPT0gMCl7CkBAIC01NjYsNyArNzYxLDcgQEAKIAlyZXR1cm4gc3VwZXIudXBkYXRlT25PcGVuaW5nQnJhY2UoYnJhY2VTdGFydCwgYnJhY2VFbmQpOwogfQogcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7Ci0JdGhpcy51cGRhdGVkVHlwZURlY2xhcmF0aW9uKCk7CisJdXBkYXRlZFR5cGVEZWNsYXJhdGlvbigwLCBuZXcgSGFzaFNldCgpKTsKIH0KIC8qCiAgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRVbml0LmphdmEKaW5kZXggNjYxZWM3Zi4uYzRjMTY4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRVbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRVbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOCArMTEsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogLyoqCi0gKiBJbnRlcm5hbCBmaWVsZCBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkgCisgKiBJbnRlcm5hbCBmaWVsZCBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkKICAqLworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2s7CkBAIC0yNSwxNSArMjgsNDkgQEAKIHB1YmxpYyBjbGFzcyBSZWNvdmVyZWRVbml0IGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCB7CiAKIAlwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdERlY2xhcmF0aW9uOwotCQorCiAJcHVibGljIFJlY292ZXJlZEltcG9ydFtdIGltcG9ydHM7CiAJcHVibGljIGludCBpbXBvcnRDb3VudDsKIAlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIHR5cGVzOwogCXB1YmxpYyBpbnQgdHlwZUNvdW50OworCisJaW50IHBlbmRpbmdNb2RpZmllcnM7CisJaW50IHBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gLTE7CisJUmVjb3ZlcmVkQW5ub3RhdGlvbltdIHBlbmRpbmdBbm5vdGF0aW9uczsKKwlpbnQgcGVuZGluZ0Fubm90YXRpb25Db3VudDsKKwogcHVibGljIFJlY292ZXJlZFVuaXQoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UsIFBhcnNlciBwYXJzZXIpewogCXN1cGVyKG51bGwsIGJyYWNrZXRCYWxhbmNlLCBwYXJzZXIpOwogCXRoaXMudW5pdERlY2xhcmF0aW9uID0gdW5pdERlY2xhcmF0aW9uOwogfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkQW5ub3RhdGlvbk5hbWUoaW50IGlkZW50aWZpZXJQdHIsIGludCBpZGVudGlmaWVyTGVuZ3RoUHRyLCBpbnQgYW5ub3RhdGlvblN0YXJ0LCBpbnQgYnJhY2tldEJhbGFuY2VWYWx1ZSkgeworCWlmICh0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucyA9PSBudWxsKSB7CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbmV3IFJlY292ZXJlZEFubm90YXRpb25bNV07CisJCXRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA9PSB0aGlzLnBlbmRpbmdBbm5vdGF0aW9ucy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJMCwKKwkJCQkodGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMgPSBuZXcgUmVjb3ZlcmVkQW5ub3RhdGlvblsyICogdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQpOworCQl9CisJfQorCisJUmVjb3ZlcmVkQW5ub3RhdGlvbiBlbGVtZW50ID0gbmV3IFJlY292ZXJlZEFubm90YXRpb24oaWRlbnRpZmllclB0ciwgaWRlbnRpZmllckxlbmd0aFB0ciwgYW5ub3RhdGlvblN0YXJ0LCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKKworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zW3RoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCsrXSA9IGVsZW1lbnQ7CisKKwlyZXR1cm4gZWxlbWVudDsKK30KK3B1YmxpYyB2b2lkIGFkZE1vZGlmaWVyKGludCBmbGFnLCBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQpIHsKKwl0aGlzLnBlbmRpbmdNb2RpZmllcnMgfD0gZmxhZzsKKworCWlmICh0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0IDwgMCkgeworCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0ID0gbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJfQorfQogLyoKICAqCVJlY29yZCBhIG1ldGhvZCBkZWNsYXJhdGlvbjogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGxhc3QgdHlwZQogICovCkBAIC00NywxMCArODQsMTAgQEAKIAkJdHlwZS5ib2R5RW5kID0gMDsgLy8gcmVzZXQgcG9zaXRpb24KIAkJdHlwZS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAwOyAvLyByZXNldCBwb3NpdGlvbgogCQl0eXBlLnR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gMDsKLQkJCisKIAkJaW50IGtpbmQgPSBUeXBlRGVjbGFyYXRpb24ua2luZCh0eXBlLnR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpOwogCQlpZihzdGFydCA+IDAgJiYKLQkJCQlzdGFydCA8IGVuZCAmJiAKKwkJCQlzdGFydCA8IGVuZCAmJgogCQkJCWtpbmQgIT0gVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMICYmCiAJCQkJa2luZCAhPSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wpIHsKIAkJCS8vIHRoZSB9IG9mIHRoZSBsYXN0IHR5cGUgY2FuIGJlIGNvbnNpZGVyZWQgYXMgdGhlIGVuZCBvZiBhbiBpbml0aWFsaXplcgpAQCAtNjMsNyArMTAwLDkgQEAKIAkJCWluaXRpYWxpemVyLnNvdXJjZUVuZCA9IGVuZDsKIAkJCXR5cGUuYWRkKGluaXRpYWxpemVyLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAkJfQotCQkKKworCQlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCQlyZXR1cm4gdHlwZS5hZGQobWV0aG9kRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCX0KIAlyZXR1cm4gdGhpczsgLy8gaWdub3JlCkBAIC03OSwyMiArMTE4LDI3IEBACiAJCXR5cGUuYm9keUVuZCA9IDA7IC8vIHJlc2V0IHBvc2l0aW9uCiAJCXR5cGUudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gMDsgLy8gcmVzZXQgcG9zaXRpb24KIAkJdHlwZS50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7CisKKwkJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisKIAkJcmV0dXJuIHR5cGUuYWRkKGZpZWxkRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlVmFsdWUpOwogCX0KIAlyZXR1cm4gdGhpczsgLy8gaWdub3JlCiB9CiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKKwlyZXNldFBlbmRpbmdNb2RpZmllcnMoKTsKKwogCWlmICh0aGlzLmltcG9ydHMgPT0gbnVsbCkgewogCQl0aGlzLmltcG9ydHMgPSBuZXcgUmVjb3ZlcmVkSW1wb3J0WzVdOwogCQl0aGlzLmltcG9ydENvdW50ID0gMDsKIAl9IGVsc2UgewogCQlpZiAodGhpcy5pbXBvcnRDb3VudCA9PSB0aGlzLmltcG9ydHMubGVuZ3RoKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuaW1wb3J0cywgCi0JCQkJMCwgCi0JCQkJKHRoaXMuaW1wb3J0cyA9IG5ldyBSZWNvdmVyZWRJbXBvcnRbMiAqIHRoaXMuaW1wb3J0Q291bnRdKSwgCi0JCQkJMCwgCi0JCQkJdGhpcy5pbXBvcnRDb3VudCk7IAorCQkJCXRoaXMuaW1wb3J0cywKKwkJCQkwLAorCQkJCSh0aGlzLmltcG9ydHMgPSBuZXcgUmVjb3ZlcmVkSW1wb3J0WzIgKiB0aGlzLmltcG9ydENvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLmltcG9ydENvdW50KTsKIAkJfQogCX0KIAlSZWNvdmVyZWRJbXBvcnQgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRJbXBvcnQoaW1wb3J0UmVmZXJlbmNlLCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKQEAgLTEwMiwxMCArMTQ2LDEwIEBACiAKIAkvKiBpZiBpbXBvcnQgbm90IGZpbmlzaGVkLCB0aGVuIGltcG9ydCBiZWNvbWVzIGN1cnJlbnQgKi8KIAlpZiAoaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHJldHVybiBlbGVtZW50OwotCXJldHVybiB0aGlzOwkJCisJcmV0dXJuIHRoaXM7CiB9CiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlVmFsdWUpIHsKLQkKKwogCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCl7CiAJCWlmICh0aGlzLnR5cGVDb3VudCA+IDApIHsKIAkJCS8vIGFkZCBpdCB0byB0aGUgbGFzdCB0eXBlCkBAIC0xMTQsNiArMTU4LDkgQEAKIAkJCWxhc3RUeXBlLnR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gMDsgLy8gcmVvcGVuIHR5cGUKIAkJCWxhc3RUeXBlLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IDA7IC8vIHJlb3BlbiB0eXBlCiAJCQlsYXN0VHlwZS5icmFja2V0QmFsYW5jZSsrOyAvLyBleHBlY3Qgb25lIGNsb3NpbmcgYnJhY2UKKworCQkJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisKIAkJCXJldHVybiBsYXN0VHlwZS5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAkJfQogCX0KQEAgLTEyMywyNiArMTcwLDQxIEBACiAJfSBlbHNlIHsKIAkJaWYgKHRoaXMudHlwZUNvdW50ID09IHRoaXMudHlwZXMubGVuZ3RoKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMudHlwZXMsIAotCQkJCTAsIAotCQkJCSh0aGlzLnR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIHRoaXMudHlwZUNvdW50XSksIAotCQkJCTAsIAotCQkJCXRoaXMudHlwZUNvdW50KTsgCisJCQkJdGhpcy50eXBlcywKKwkJCQkwLAorCQkJCSh0aGlzLnR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIHRoaXMudHlwZUNvdW50XSksCisJCQkJMCwKKwkJCQl0aGlzLnR5cGVDb3VudCk7CiAJCX0KIAl9CiAJUmVjb3ZlcmVkVHlwZSBlbGVtZW50ID0gbmV3IFJlY292ZXJlZFR5cGUodHlwZURlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZVZhbHVlKTsKIAl0aGlzLnR5cGVzW3RoaXMudHlwZUNvdW50KytdID0gZWxlbWVudDsKIAorCWlmKHRoaXMucGVuZGluZ0Fubm90YXRpb25Db3VudCA+IDApIHsKKwkJZWxlbWVudC5hdHRhY2goCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbnMsCisJCQkJdGhpcy5wZW5kaW5nQW5ub3RhdGlvbkNvdW50LAorCQkJCXRoaXMucGVuZGluZ01vZGlmaWVycywKKwkJCQl0aGlzLnBlbmRpbmdNb2RpZmVyc1NvdXJjZVN0YXJ0KTsKKwl9CisJcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCk7CisKIAkvKiBpZiB0eXBlIG5vdCBmaW5pc2hlZCwgdGhlbiB0eXBlIGJlY29tZXMgY3VycmVudCAqLwogCWlmICh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7Ci0JcmV0dXJuIHRoaXM7CQorCXJldHVybiB0aGlzOwogfQotLyogCisvKgogICogQW5zd2VyIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBzdHJ1Y3R1cmUKICAqLwogcHVibGljIEFTVE5vZGUgcGFyc2VUcmVlKCl7CiAJcmV0dXJuIHRoaXMudW5pdERlY2xhcmF0aW9uOwogfQorcHVibGljIHZvaWQgcmVzZXRQZW5kaW5nTW9kaWZpZXJzKCkgeworCXRoaXMucGVuZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKwl0aGlzLnBlbmRpbmdBbm5vdGF0aW9uQ291bnQgPSAwOworCXRoaXMucGVuZGluZ01vZGlmaWVycyA9IDA7CisJdGhpcy5wZW5kaW5nTW9kaWZlcnNTb3VyY2VTdGFydCA9IC0xOworfQogLyoKICAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKICAqLwpAQCAtMTkxLDIwICsyNTMsMjIgQEAKIAkJCXRoaXMudHlwZXNbdGhpcy50eXBlQ291bnQgLSAxXS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLnVuaXREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CiAJCQl0aGlzLnR5cGVzW3RoaXMudHlwZUNvdW50IC0gMV0udHlwZURlY2xhcmF0aW9uLmJvZHlFbmQgPSB0aGlzLnVuaXREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CiAJCX0KKwkJCisJCVNldCBrbm93blR5cGVzID0gbmV3IEhhc2hTZXQoKTsKIAkJaW50IGFjdHVhbENvdW50ID0gZXhpc3RpbmdDb3VudDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnR5cGVDb3VudDsgaSsrKXsKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHRoaXMudHlwZXNbaV0udXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpOworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy50eXBlc1tpXS51cGRhdGVkVHlwZURlY2xhcmF0aW9uKDAsIGtub3duVHlwZXMpOwogCQkJLy8gZmlsdGVyIG91dCBsb2NhbCB0eXBlcyAoMTI0NTQpCi0JCQlpZiAoKHR5cGVEZWNsLmJpdHMgJiBBU1ROb2RlLklzTG9jYWxUeXBlKSA9PSAwKXsKKwkJCWlmICh0eXBlRGVjbCAhPSBudWxsICYmICh0eXBlRGVjbC5iaXRzICYgQVNUTm9kZS5Jc0xvY2FsVHlwZSkgPT0gMCl7CiAJCQkJdHlwZURlY2xhcmF0aW9uc1thY3R1YWxDb3VudCsrXSA9IHR5cGVEZWNsOwogCQkJfQogCQl9CiAJCWlmIChhY3R1YWxDb3VudCAhPSB0aGlzLnR5cGVDb3VudCl7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXR5cGVEZWNsYXJhdGlvbnMsIAotCQkJCTAsIAotCQkJCXR5cGVEZWNsYXJhdGlvbnMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW2V4aXN0aW5nQ291bnQrYWN0dWFsQ291bnRdLCAKLQkJCQkwLCAKKwkJCQl0eXBlRGVjbGFyYXRpb25zLAorCQkJCTAsCisJCQkJdHlwZURlY2xhcmF0aW9ucyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bZXhpc3RpbmdDb3VudCthY3R1YWxDb3VudF0sCisJCQkJMCwKIAkJCQlleGlzdGluZ0NvdW50K2FjdHVhbENvdW50KTsKIAkJfQogCQl0aGlzLnVuaXREZWNsYXJhdGlvbi50eXBlcyA9IHR5cGVEZWNsYXJhdGlvbnM7CkBAIC0yMTIsNyArMjc2LDcgQEAKIAlyZXR1cm4gdGhpcy51bml0RGVjbGFyYXRpb247CiB9CiBwdWJsaWMgdm9pZCB1cGRhdGVQYXJzZVRyZWUoKXsKLQl0aGlzLnVwZGF0ZWRDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigpOworCXVwZGF0ZWRDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigpOwogfQogLyoKICAqIFVwZGF0ZSB0aGUgc291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcnlTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJ5U2Nhbm5lci5qYXZhCmluZGV4IDYxNjI4NmQuLjNiNmQ0ZmYgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcnlTY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyeVNjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw5ICsxNiw5IEBACiAKIHB1YmxpYyBjbGFzcyBSZWNvdmVyeVNjYW5uZXIgZXh0ZW5kcyBTY2FubmVyIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBGQUtFX0lERU5USUZJRVIgPSAiJG1pc3NpbmckIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCisKIAlwcml2YXRlIFJlY292ZXJ5U2Nhbm5lckRhdGEgZGF0YTsKLQkKKwogCXByaXZhdGUgaW50W10gcGVuZGluZ1Rva2VuczsKIAlwcml2YXRlIGludCBwZW5kaW5nVG9rZW5zUHRyID0gLTE7CiAJcHJpdmF0ZSBjaGFyW10gZmFrZVRva2VuU291cmNlID0gbnVsbDsKQEAgLTI3LDcgKzI3LDcgQEAKIAlwcml2YXRlIGludCBza2lwTmV4dEluc2VydGVkVG9rZW5zID0gLTE7CiAKIAlwdWJsaWMgYm9vbGVhbiByZWNvcmQgPSB0cnVlOwotCQorCiAJcHVibGljIFJlY292ZXJ5U2Nhbm5lcihTY2FubmVyIHNjYW5uZXIsIFJlY292ZXJ5U2Nhbm5lckRhdGEgZGF0YSkgewogCQlzdXBlcihmYWxzZSwKIAkJCQlzY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSwKQEAgLTM3LDEzICszNywzMyBAQAogCQkJCXNjYW5uZXIudGFza1RhZ3MsCiAJCQkJc2Nhbm5lci50YXNrUHJpb3JpdGllcywKIAkJCQlzY2FubmVyLmlzVGFza0Nhc2VTZW5zaXRpdmUpOwotCQl0aGlzLnNldERhdGEoZGF0YSk7CisJCXNldERhdGEoZGF0YSk7CiAJfQogCQorCXB1YmxpYyBSZWNvdmVyeVNjYW5uZXIoCisJCQlib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwKKwkJCWJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywKKwkJCWxvbmcgc291cmNlTGV2ZWwsCisJCQlsb25nIGNvbXBsaWFuY2VMZXZlbCwKKwkJCWNoYXJbXVtdIHRhc2tUYWdzLAorCQkJY2hhcltdW10gdGFza1ByaW9yaXRpZXMsCisJCQlib29sZWFuIGlzVGFza0Nhc2VTZW5zaXRpdmUsCisJCQlSZWNvdmVyeVNjYW5uZXJEYXRhIGRhdGEpIHsKKwkJc3VwZXIoZmFsc2UsCisJCQkJdG9rZW5pemVXaGl0ZVNwYWNlLAorCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsCisJCQkJc291cmNlTGV2ZWwsCisJCQkJY29tcGxpYW5jZUxldmVsLAorCQkJCXRhc2tUYWdzLAorCQkJCXRhc2tQcmlvcml0aWVzLAorCQkJCWlzVGFza0Nhc2VTZW5zaXRpdmUpOworCQlzZXREYXRhKGRhdGEpOworCX0KKwogCXB1YmxpYyB2b2lkIGluc2VydFRva2VuKGludCB0b2tlbiwgaW50IGNvbXBsZXRlZFRva2VuLCBpbnQgcG9zaXRpb24pIHsKIAkJaW5zZXJ0VG9rZW5zKG5ldyBpbnQgW117dG9rZW59LCBjb21wbGV0ZWRUb2tlbiwgcG9zaXRpb24pOwogCX0KLQkKKwogCXByaXZhdGUgaW50W10gcmV2ZXJzZShpbnRbXSB0b2tlbnMpIHsKIAkJaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CiAJCWZvcihpbnQgaSA9IDAsIG1heCA9IGxlbmd0aCAvIDI7IGkgPCBtYXg7IGkrKykgewpAQCAtNTUsOSArNzUsOSBAQAogCX0KIAlwdWJsaWMgdm9pZCBpbnNlcnRUb2tlbnMoaW50W10gdG9rZW5zLCBpbnQgY29tcGxldGVkVG9rZW4sIGludCBwb3NpdGlvbikgewogCQlpZighdGhpcy5yZWNvcmQpIHJldHVybjsKLQkJCisKIAkJaWYoY29tcGxldGVkVG9rZW4gPiAtMSAmJiBQYXJzZXIuc3RhdGVtZW50c19yZWNvdmVyeV9maWx0ZXJbY29tcGxldGVkVG9rZW5dICE9IDApIHJldHVybjsKLQkJCisKIAkJdGhpcy5kYXRhLmluc2VydGVkVG9rZW5zUHRyKys7CiAJCWlmKHRoaXMuZGF0YS5pbnNlcnRlZFRva2VucyA9PSBudWxsKSB7CiAJCQl0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlbnMgPSBuZXcgaW50WzEwXVtdOwpAQCAtNzMsMTEgKzkzLDExIEBACiAJCXRoaXMuZGF0YS5pbnNlcnRlZFRva2Vuc1Bvc2l0aW9uW3RoaXMuZGF0YS5pbnNlcnRlZFRva2Vuc1B0cl0gPSBwb3NpdGlvbjsKIAkJdGhpcy5kYXRhLmluc2VydGVkVG9rZW5Vc2VkW3RoaXMuZGF0YS5pbnNlcnRlZFRva2Vuc1B0cl0gPSBmYWxzZTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXBsYWNlVG9rZW5zKGludCB0b2tlbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCXJlcGxhY2VUb2tlbnMobmV3IGludCBbXXt0b2tlbn0sIHN0YXJ0LCBlbmQpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlcGxhY2VUb2tlbnMoaW50W10gdG9rZW5zLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJaWYoIXRoaXMucmVjb3JkKSByZXR1cm47CiAJCXRoaXMuZGF0YS5yZXBsYWNlZFRva2Vuc1B0cisrOwpAQCAtOTgsNyArMTE4LDcgQEAKIAkJdGhpcy5kYXRhLnJlcGxhY2VkVG9rZW5zRW5kW3RoaXMuZGF0YS5yZXBsYWNlZFRva2Vuc1B0cl0gPSBlbmQ7CiAJCXRoaXMuZGF0YS5yZXBsYWNlZFRva2VuVXNlZFt0aGlzLmRhdGEucmVwbGFjZWRUb2tlbnNQdHJdID0gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVtb3ZlVG9rZW5zKGludCBzdGFydCwgaW50IGVuZCkgewogCQlpZighdGhpcy5yZWNvcmQpIHJldHVybjsKIAkJdGhpcy5kYXRhLnJlbW92ZWRUb2tlbnNQdHIrKzsKQEAgLTExNiw3ICsxMzYsNyBAQAogCQl0aGlzLmRhdGEucmVtb3ZlZFRva2Vuc0VuZFt0aGlzLmRhdGEucmVtb3ZlZFRva2Vuc1B0cl0gPSBlbmQ7CiAJCXRoaXMuZGF0YS5yZW1vdmVkVG9rZW5Vc2VkW3RoaXMuZGF0YS5yZW1vdmVkVG9rZW5zUHRyXSA9IGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgZ2V0TmV4dFRva2VuKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmKHRoaXMucGVuZGluZ1Rva2Vuc1B0ciA+IC0xKSB7CiAJCQlpbnQgbmV4dFRva2VuID0gdGhpcy5wZW5kaW5nVG9rZW5zW3RoaXMucGVuZGluZ1Rva2Vuc1B0ci0tXTsKQEAgLTEyNywxMyArMTQ3LDEzIEBACiAJCQl9CiAJCQlyZXR1cm4gbmV4dFRva2VuOwogCQl9Ci0JCQorCiAJCXRoaXMuZmFrZVRva2VuU291cmNlID0gbnVsbDsKIAkJdGhpcy5wcmVjZWRlZEJ5UmVtb3ZlZCA9IGZhbHNlOwotCQkKKwogCQlpZih0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlbnMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5kYXRhLmluc2VydGVkVG9rZW5zUHRyOyBpKyspIHsKLQkJCQlpZih0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlbnNQb3NpdGlvbltpXSA9PSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEgJiYgaSA+IHNraXBOZXh0SW5zZXJ0ZWRUb2tlbnMpIHsKKwkJCQlpZih0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlbnNQb3NpdGlvbltpXSA9PSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEgJiYgaSA+IHRoaXMuc2tpcE5leHRJbnNlcnRlZFRva2VucykgewogCQkJCQl0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlblVzZWRbaV0gPSB0cnVlOwogCQkJCQl0aGlzLnBlbmRpbmdUb2tlbnMgPSB0aGlzLmRhdGEuaW5zZXJ0ZWRUb2tlbnNbaV07CiAJCQkJCXRoaXMucGVuZGluZ1Rva2Vuc1B0ciA9IHRoaXMuZGF0YS5pbnNlcnRlZFRva2Vuc1tpXS5sZW5ndGggLSAxOwpAQCAtMTU0LDcgKzE3NCw3IEBACiAKIAkJaW50IHByZXZpb3VzTG9jYXRpb24gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKIAkJaW50IGN1cnJlbnRUb2tlbiA9IHN1cGVyLmdldE5leHRUb2tlbigpOwotCQkKKwogCQlpZih0aGlzLmRhdGEucmVwbGFjZWRUb2tlbnMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5kYXRhLnJlcGxhY2VkVG9rZW5zUHRyOyBpKyspIHsKIAkJCQlpZih0aGlzLmRhdGEucmVwbGFjZWRUb2tlbnNTdGFydFtpXSA+PSBwcmV2aW91c0xvY2F0aW9uICYmCkBAIC0xOTAsNDIgKzIxMCw0MiBAQAogCQl9CiAJCXJldHVybiBjdXJyZW50VG9rZW47CiAJfQotCQorCiAJcHVibGljIGNoYXJbXSBnZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpIHsKIAkJaWYodGhpcy5mYWtlVG9rZW5Tb3VyY2UgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZmFrZVRva2VuU291cmNlOwogCQlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIGdldEN1cnJlbnRUb2tlblNvdXJjZVN0cmluZygpIHsKIAkJaWYodGhpcy5mYWtlVG9rZW5Tb3VyY2UgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZmFrZVRva2VuU291cmNlOwogCQlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCk7CiAJfQotCQorCiAJcHVibGljIGNoYXJbXSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSB7CiAJCWlmKHRoaXMuZmFrZVRva2VuU291cmNlICE9IG51bGwpIHJldHVybiB0aGlzLmZha2VUb2tlblNvdXJjZTsKIAkJcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwogCX0KLQkKKwogCXB1YmxpYyBSZWNvdmVyeVNjYW5uZXJEYXRhIGdldERhdGEoKSB7CiAJCXJldHVybiB0aGlzLmRhdGE7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNGYWtlVG9rZW4oKSB7CiAJCXJldHVybiB0aGlzLmZha2VUb2tlblNvdXJjZSAhPSBudWxsOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0ZWRUb2tlbigpIHsKIAkJcmV0dXJuIHRoaXMuZmFrZVRva2VuU291cmNlICE9IG51bGwgJiYgdGhpcy5pc0luc2VydGVkOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzUmVwbGFjZWRUb2tlbigpIHsKIAkJcmV0dXJuIHRoaXMuZmFrZVRva2VuU291cmNlICE9IG51bGwgJiYgIXRoaXMuaXNJbnNlcnRlZDsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1ByZWNlZGVkQnlSZW1vdmVkVG9rZW4oKSB7CiAJCXJldHVybiB0aGlzLnByZWNlZGVkQnlSZW1vdmVkOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHNldERhdGEoUmVjb3ZlcnlTY2FubmVyRGF0YSBkYXRhKSB7CiAJCWlmKGRhdGEgPT0gbnVsbCkgewogCQkJdGhpcy5kYXRhID0gbmV3IFJlY292ZXJ5U2Nhbm5lckRhdGEoKTsKQEAgLTIzMyw3ICsyNTMsNyBAQAogCQkJdGhpcy5kYXRhID0gZGF0YTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHNldFBlbmRpbmdUb2tlbnMoaW50W10gcGVuZGluZ1Rva2VucykgewogCQl0aGlzLnBlbmRpbmdUb2tlbnMgPSBwZW5kaW5nVG9rZW5zOwogCQl0aGlzLnBlbmRpbmdUb2tlbnNQdHIgPSBwZW5kaW5nVG9rZW5zLmxlbmd0aCAtIDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJ5U2Nhbm5lckRhdGEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcnlTY2FubmVyRGF0YS5qYXZhCmluZGV4IGVhOGI4NGEuLjg0NGNkNmYgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcnlTY2FubmVyRGF0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcnlTY2FubmVyRGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDE4ICsxNiwxOCBAQAogCXB1YmxpYyBpbnRbXVtdIGluc2VydGVkVG9rZW5zOwogCXB1YmxpYyBpbnRbXSBpbnNlcnRlZFRva2Vuc1Bvc2l0aW9uOwogCXB1YmxpYyBib29sZWFuW10gaW5zZXJ0ZWRUb2tlblVzZWQ7Ci0JCisKIAlwdWJsaWMgaW50IHJlcGxhY2VkVG9rZW5zUHRyID0gLTE7CiAJcHVibGljIGludFtdW10gcmVwbGFjZWRUb2tlbnM7CiAJcHVibGljIGludFtdIHJlcGxhY2VkVG9rZW5zU3RhcnQ7CiAJcHVibGljIGludFtdIHJlcGxhY2VkVG9rZW5zRW5kOwogCXB1YmxpYyBib29sZWFuW10gcmVwbGFjZWRUb2tlblVzZWQ7Ci0JCQorCiAJcHVibGljIGludCByZW1vdmVkVG9rZW5zUHRyID0gLTE7CiAJcHVibGljIGludFtdIHJlbW92ZWRUb2tlbnNTdGFydDsKIAlwdWJsaWMgaW50W10gcmVtb3ZlZFRva2Vuc0VuZDsKIAlwdWJsaWMgYm9vbGVhbltdIHJlbW92ZWRUb2tlblVzZWQ7Ci0JCisKIAlwdWJsaWMgUmVjb3ZlcnlTY2FubmVyRGF0YSByZW1vdmVVbnVzZWQoKSB7CiAJCWlmKHRoaXMuaW5zZXJ0ZWRUb2tlbnMgIT0gbnVsbCkgewogCQkJaW50IG5ld0luc2VydGVkVG9rZW5zUHRyID0gLTE7CkBAIC02Nyw3ICs2Nyw3IEBACiAJCQl9CiAJCQl0aGlzLnJlbW92ZWRUb2tlbnNQdHIgPSBuZXdSZW1vdmVkVG9rZW5zUHRyOwogCQl9Ci0JCQorCiAJCXJldHVybiB0aGlzOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9TY2FubmVyLmphdmEKaW5kZXggODlhNzIyMS4uZDE1MmEyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9TY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9TY2FubmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMzUgKzE3LDM1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogLyoqCi0gKiBJTVBPUlRBTlQgTk9URTogSW50ZXJuYWwgU2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgbWlycm9yZWQgaW4gCi0gKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciBwdWJsaWMgcGFja2FnZSB3aGVyZSBpdCBpcyBBUEkuIAotICogVGhlIG1pcnJvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2luZyB0aGUgYmFja3dhcmQgY29tcGF0aWJsZSBJVGVybWluYWxTeW1ib2xzIGNvbnN0YW50IAotICogZGVmaW5pdGlvbnMgKHN0YWJsZSB3aXRoIDIuMCksIHdoZXJlYXMgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHVzZXMgVGVybWluYWxUb2tlbnMgCisgKiBJTVBPUlRBTlQgTk9URTogSW50ZXJuYWwgU2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgbWlycm9yZWQgaW4KKyAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyIHB1YmxpYyBwYWNrYWdlIHdoZXJlIGl0IGlzIEFQSS4KKyAqIFRoZSBtaXJyb3IgaW1wbGVtZW50YXRpb24gaXMgdXNpbmcgdGhlIGJhY2t3YXJkIGNvbXBhdGlibGUgSVRlcm1pbmFsU3ltYm9scyBjb25zdGFudAorICogZGVmaW5pdGlvbnMgKHN0YWJsZSB3aXRoIDIuMCksIHdoZXJlYXMgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHVzZXMgVGVybWluYWxUb2tlbnMKICAqIHdoaWNoIGNvbnN0YW50IHZhbHVlcyByZWZsZWN0IHRoZSBsYXRlc3QgcGFyc2VyIGdlbmVyYXRpb24gc3RhdGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBTY2FubmVyIGltcGxlbWVudHMgVGVybWluYWxUb2tlbnMgewotCQorCiAJLy9wdWJsaWMgaW50IG5ld0lkZW50Q291bnQgPSAwOwotCQorCiAJLyogQVBJcyBhcmVzCiAJIC0gZ2V0TmV4dFRva2VuKCkgd2hpY2ggcmV0dXJuIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhlIHRva2VuCiAJICAgKHRoaXMgdmFsdWUgaXMgbm90IG1lbW9yaXplZCBieSB0aGUgc2Nhbm5lcikKIAkgLSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSB3aGljaCBwcm92aWRlcyB3aXRoIHRoZSB0b2tlbiAiUkVBTCIgc291cmNlCiAJICAgKGFrYSBhbGwgdW5pY29kZSBoYXZlIGJlZW4gdHJhbnNmb3JtZWQgaW50byBhIGNvcnJlY3QgY2hhcikKIAkgLSBzb3VyY2VTdGFydCBnaXZlcyB0aGUgcG9zaXRpb24gaW50byB0aGUgc3RyZWFtCi0JIC0gY3VycmVudFBvc2l0aW9uLTEgZ2l2ZXMgdGhlIHNvdXJjZUVuZCBwb3NpdGlvbiBpbnRvIHRoZSBzdHJlYW0gCisJIC0gY3VycmVudFBvc2l0aW9uLTEgZ2l2ZXMgdGhlIHNvdXJjZUVuZCBwb3NpdGlvbiBpbnRvIHRoZSBzdHJlYW0KIAkqLwogCXB1YmxpYyBsb25nIHNvdXJjZUxldmVsOwogCXB1YmxpYyBsb25nIGNvbXBsaWFuY2VMZXZlbDsKIAotCS8vIDEuNCBmZWF0dXJlIAorCS8vIDEuNCBmZWF0dXJlCiAJcHVibGljIGJvb2xlYW4gdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7Ci0JLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydCAKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsgCi0JCisJLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydAorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IGZhbHNlOworCiAJLy8gMS41IGZlYXR1cmUKIAlwdWJsaWMgYm9vbGVhbiB1c2VFbnVtQXNBbkluZGVudGlmaWVyID0gZmFsc2U7Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CiAJcHVibGljIGNoYXIgY3VycmVudENoYXJhY3RlcjsKIAlwdWJsaWMgaW50IHN0YXJ0UG9zaXRpb247CkBAIC01Myw2ICs1Myw3IEBACiAJcHVibGljIGludCBpbml0aWFsUG9zaXRpb24sIGVvZlBvc2l0aW9uOwogCS8vIGFmdGVyIHRoaXMgcG9zaXRpb24gZW9mIGFyZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWFsIHRva2VuIGZyb20gdGhlIHNvdXJjZQogCisJcHVibGljIGJvb2xlYW4gc2tpcENvbW1lbnRzID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gdG9rZW5pemVDb21tZW50cyA9IGZhbHNlOwogCXB1YmxpYyBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSA9IGZhbHNlOwogCkBAIC03NCw3ICs3NSw3IEBACiAJcHVibGljIGludFtdIGNvbW1lbnRUYWdTdGFydHMgPSBuZXcgaW50W0NPTU1FTlRfQVJSQVlTX1NJWkVdOwogCXB1YmxpYyBpbnQgY29tbWVudFB0ciA9IC0xOyAvLyBubyBjb21tZW50IHRlc3Qgd2l0aCBjb21tZW50UHRyIHZhbHVlIC0xCiAJcHJvdGVjdGVkIGludCBsYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IC0xOwotCQorCiAJLy8gdGFzayB0YWcgc3VwcG9ydAogCXB1YmxpYyBjaGFyW11bXSBmb3VuZFRhc2tUYWdzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gZm91bmRUYXNrTWVzc2FnZXM7CkBAIC04NCw3ICs4NSw3IEBACiAJcHVibGljIGNoYXJbXVtdIHRhc2tUYWdzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gdGFza1ByaW9yaXRpZXMgPSBudWxsOwogCXB1YmxpYyBib29sZWFuIGlzVGFza0Nhc2VTZW5zaXRpdmUgPSB0cnVlOwotCQorCiAJLy9kaWV0IHBhcnNpbmcgc3VwcG9ydCAtIGp1bXAgb3ZlciBzb21lIG1ldGhvZCBib2R5IHdoZW4gcmVxdWVzdGVkCiAJcHVibGljIGJvb2xlYW4gZGlldCA9IGZhbHNlOwogCkBAIC0xMTMsNDEgKzExNCw0NyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfRElHSVQgPSAiSW52YWxpZF9EaWdpdCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9MSU5FX0VORFMgPSBVdGlsLkVNUFRZX0lOVF9BUlJBWTsKIAotCS8vLS0tLS0tLS0tLS0tLS0tLW9wdGltaXplZCBpZGVudGlmaWVyIG1hbmFnbWVudC0tLS0tLS0tLS0tLS0tLS0tLQotCXN0YXRpYyBmaW5hbCBjaGFyW10gY2hhckFycmF5X2EgPSBuZXcgY2hhcltdIHsnYSd9LCAKLQkJY2hhckFycmF5X2IgPSBuZXcgY2hhcltdIHsnYid9LCAKLQkJY2hhckFycmF5X2MgPSBuZXcgY2hhcltdIHsnYyd9LCAKLQkJY2hhckFycmF5X2QgPSBuZXcgY2hhcltdIHsnZCd9LCAKLQkJY2hhckFycmF5X2UgPSBuZXcgY2hhcltdIHsnZSd9LCAKLQkJY2hhckFycmF5X2YgPSBuZXcgY2hhcltdIHsnZid9LCAKLQkJY2hhckFycmF5X2cgPSBuZXcgY2hhcltdIHsnZyd9LCAKLQkJY2hhckFycmF5X2ggPSBuZXcgY2hhcltdIHsnaCd9LCAKLQkJY2hhckFycmF5X2kgPSBuZXcgY2hhcltdIHsnaSd9LCAKLQkJY2hhckFycmF5X2ogPSBuZXcgY2hhcltdIHsnaid9LCAKLQkJY2hhckFycmF5X2sgPSBuZXcgY2hhcltdIHsnayd9LCAKLQkJY2hhckFycmF5X2wgPSBuZXcgY2hhcltdIHsnbCd9LCAKLQkJY2hhckFycmF5X20gPSBuZXcgY2hhcltdIHsnbSd9LCAKLQkJY2hhckFycmF5X24gPSBuZXcgY2hhcltdIHsnbid9LCAKLQkJY2hhckFycmF5X28gPSBuZXcgY2hhcltdIHsnbyd9LCAKLQkJY2hhckFycmF5X3AgPSBuZXcgY2hhcltdIHsncCd9LCAKLQkJY2hhckFycmF5X3EgPSBuZXcgY2hhcltdIHsncSd9LCAKLQkJY2hhckFycmF5X3IgPSBuZXcgY2hhcltdIHsncid9LCAKLQkJY2hhckFycmF5X3MgPSBuZXcgY2hhcltdIHsncyd9LCAKLQkJY2hhckFycmF5X3QgPSBuZXcgY2hhcltdIHsndCd9LCAKLQkJY2hhckFycmF5X3UgPSBuZXcgY2hhcltdIHsndSd9LCAKLQkJY2hhckFycmF5X3YgPSBuZXcgY2hhcltdIHsndid9LCAKLQkJY2hhckFycmF5X3cgPSBuZXcgY2hhcltdIHsndyd9LCAKLQkJY2hhckFycmF5X3ggPSBuZXcgY2hhcltdIHsneCd9LCAKLQkJY2hhckFycmF5X3kgPSBuZXcgY2hhcltdIHsneSd9LCAKLQkJY2hhckFycmF5X3ogPSBuZXcgY2hhcltdIHsneid9OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0JJTkFSWSA9ICJJbnZhbGlkX0JpbmFyeV9MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9MSVRFUkFMX05PVF9CRUxPV18xNyA9ICJCaW5hcnlfTGl0ZXJhbF9Ob3RfQmVsb3dfMTciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUxMRUdBTF9IRVhBX0xJVEVSQUwgPSAiSWxsZWdhbF9IZXhhX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9VTkRFUlNDT1JFID0gIkludmFsaWRfVW5kZXJzY29yZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUlNDT1JFU19JTl9MSVRFUkFMU19OT1RfQkVMT1dfMTcgPSAiVW5kZXJzY29yZXNfSW5fTGl0ZXJhbHNfTm90X0JlbG93XzE3IjsgLy8kTk9OLU5MUy0xJGAKIAotCXN0YXRpYyBmaW5hbCBjaGFyW10gaW5pdENoYXJBcnJheSA9IAotCQluZXcgY2hhcltdIHsnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnfTsgCisJLy8tLS0tLS0tLS0tLS0tLS0tb3B0aW1pemVkIGlkZW50aWZpZXIgbWFuYWdtZW50LS0tLS0tLS0tLS0tLS0tLS0tCisJc3RhdGljIGZpbmFsIGNoYXJbXSBjaGFyQXJyYXlfYSA9IG5ldyBjaGFyW10geydhJ30sCisJCWNoYXJBcnJheV9iID0gbmV3IGNoYXJbXSB7J2InfSwKKwkJY2hhckFycmF5X2MgPSBuZXcgY2hhcltdIHsnYyd9LAorCQljaGFyQXJyYXlfZCA9IG5ldyBjaGFyW10geydkJ30sCisJCWNoYXJBcnJheV9lID0gbmV3IGNoYXJbXSB7J2UnfSwKKwkJY2hhckFycmF5X2YgPSBuZXcgY2hhcltdIHsnZid9LAorCQljaGFyQXJyYXlfZyA9IG5ldyBjaGFyW10geydnJ30sCisJCWNoYXJBcnJheV9oID0gbmV3IGNoYXJbXSB7J2gnfSwKKwkJY2hhckFycmF5X2kgPSBuZXcgY2hhcltdIHsnaSd9LAorCQljaGFyQXJyYXlfaiA9IG5ldyBjaGFyW10geydqJ30sCisJCWNoYXJBcnJheV9rID0gbmV3IGNoYXJbXSB7J2snfSwKKwkJY2hhckFycmF5X2wgPSBuZXcgY2hhcltdIHsnbCd9LAorCQljaGFyQXJyYXlfbSA9IG5ldyBjaGFyW10geydtJ30sCisJCWNoYXJBcnJheV9uID0gbmV3IGNoYXJbXSB7J24nfSwKKwkJY2hhckFycmF5X28gPSBuZXcgY2hhcltdIHsnbyd9LAorCQljaGFyQXJyYXlfcCA9IG5ldyBjaGFyW10geydwJ30sCisJCWNoYXJBcnJheV9xID0gbmV3IGNoYXJbXSB7J3EnfSwKKwkJY2hhckFycmF5X3IgPSBuZXcgY2hhcltdIHsncid9LAorCQljaGFyQXJyYXlfcyA9IG5ldyBjaGFyW10geydzJ30sCisJCWNoYXJBcnJheV90ID0gbmV3IGNoYXJbXSB7J3QnfSwKKwkJY2hhckFycmF5X3UgPSBuZXcgY2hhcltdIHsndSd9LAorCQljaGFyQXJyYXlfdiA9IG5ldyBjaGFyW10geyd2J30sCisJCWNoYXJBcnJheV93ID0gbmV3IGNoYXJbXSB7J3cnfSwKKwkJY2hhckFycmF5X3ggPSBuZXcgY2hhcltdIHsneCd9LAorCQljaGFyQXJyYXlfeSA9IG5ldyBjaGFyW10geyd5J30sCisJCWNoYXJBcnJheV96ID0gbmV3IGNoYXJbXSB7J3onfTsKKworCXN0YXRpYyBmaW5hbCBjaGFyW10gaW5pdENoYXJBcnJheSA9CisJCW5ldyBjaGFyW10geydcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCd9OwogCXN0YXRpYyBmaW5hbCBpbnQgVGFibGVTaXplID0gMzAsIEludGVybmFsVGFibGVTaXplID0gNjsgLy8zMCo2ID0yMTAgZW50cmllcwotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3B0aW1pemVkTGVuZ3RoID0gNzsKLQlwdWJsaWMgLypzdGF0aWMqLyBmaW5hbCBjaGFyW11bXVtdW10gY2hhckFycmF5X2xlbmd0aCA9IAotCQluZXcgY2hhcltPcHRpbWl6ZWRMZW5ndGhdW1RhYmxlU2l6ZV1bSW50ZXJuYWxUYWJsZVNpemVdW107IAorCXB1YmxpYyAvKnN0YXRpYyovIGZpbmFsIGNoYXJbXVtdW11bXSBjaGFyQXJyYXlfbGVuZ3RoID0KKwkJbmV3IGNoYXJbT3B0aW1pemVkTGVuZ3RoXVtUYWJsZVNpemVdW0ludGVybmFsVGFibGVTaXplXVtdOwogCS8vIHN1cHBvcnQgZm9yIGRldGVjdGluZyBub24tZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFscwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFRBR19QUkVGSVg9ICIvLyROT04tTkxTLSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19QUkVGSVhfTEVOR1RIPSBUQUdfUFJFRklYLmxlbmd0aDsKQEAgLTE1NiwxMCArMTYzLDEyIEBACiAJcHJpdmF0ZSBOTFNUYWdbXSBubHNUYWdzID0gbnVsbDsKIAlwcm90ZWN0ZWQgaW50IG5sc1RhZ3NQdHI7CiAJcHVibGljIGJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsczsKLQkKKworCXByb3RlY3RlZCBpbnQgbGFzdFBvc2l0aW9uOworCiAJLy8gZ2VuZXJpYyBzdXBwb3J0CiAJcHVibGljIGJvb2xlYW4gcmV0dXJuT25seUdyZWF0ZXIgPSBmYWxzZTsKLQkKKwogCS8qc3RhdGljKi8gewogCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBUYWJsZVNpemU7IGorKykgewpAQCAtMTY5LDE4ICsxNzgsMTggQEAKIAkJCX0KIAkJfQogCX0KLQkvKnN0YXRpYyovIGludCBuZXdFbnRyeTIgPSAwLCAKLQkJbmV3RW50cnkzID0gMCwgCi0JCW5ld0VudHJ5NCA9IDAsIAotCQluZXdFbnRyeTUgPSAwLCAKKwkvKnN0YXRpYyovIGludCBuZXdFbnRyeTIgPSAwLAorCQluZXdFbnRyeTMgPSAwLAorCQluZXdFbnRyeTQgPSAwLAorCQluZXdFbnRyeTUgPSAwLAogCQluZXdFbnRyeTYgPSAwOwogCXB1YmxpYyBib29sZWFuIGluc2lkZVJlY292ZXJ5ID0gZmFsc2U7CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3VuZEJyYWNrZXQgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNxdWFyZUJyYWNrZXQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN1cmx5QnJhY2tldCA9IDI7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN1cmx5QnJhY2tldCA9IDI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQnJhY2tldEtpbmRzID0gMzsKLQkKKwogCS8vIGV4dGVuZGVkIHVuaWNvZGUgc3VwcG9ydAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV19TVVJST0dBVEVfTUlOX1ZBTFVFID0gMHhEQzAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJR0hfU1VSUk9HQVRFX01JTl9WQUxVRSA9IDB4RDgwMDsKQEAgLTE5Miw5ICsyMDEsOSBAQAogfQogCiBwdWJsaWMgU2Nhbm5lcigKLQkJYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCAKLQkJYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIAotCQlib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIAorCQlib29sZWFuIHRva2VuaXplQ29tbWVudHMsCisJCWJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlLAorCQlib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsCiAJCWxvbmcgc291cmNlTGV2ZWwsCiAJCWxvbmcgY29tcGxpYW5jZUxldmVsLAogCQljaGFyW11bXSB0YXNrVGFncywKQEAgLTIwNywxNSArMjE2LDQxIEBACiAJdGhpcy5zb3VyY2VMZXZlbCA9IHNvdXJjZUxldmVsOwogCXRoaXMuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZUxldmVsOwogCXRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyA9IGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHM7Ci0JdGhpcy50YXNrVGFncyA9IHRhc2tUYWdzOwotCXRoaXMudGFza1ByaW9yaXRpZXMgPSB0YXNrUHJpb3JpdGllczsKLQl0aGlzLmlzVGFza0Nhc2VTZW5zaXRpdmUgPSBpc1Rhc2tDYXNlU2Vuc2l0aXZlOworCWlmICh0YXNrVGFncyAhPSBudWxsKSB7CisJCWludCB0YXNrVGFnc0xlbmd0aCA9IHRhc2tUYWdzLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRhc2tUYWdzTGVuZ3RoOworCQlpZiAodGFza1ByaW9yaXRpZXMgIT0gbnVsbCkgeworCQkJaW50IHRhc2tQcmlvcml0aWVzTGVuZ3RoID0gdGFza1ByaW9yaXRpZXMubGVuZ3RoOworCQkJaWYgKHRhc2tQcmlvcml0aWVzTGVuZ3RoICE9IHRhc2tUYWdzTGVuZ3RoKSB7CisJCQkJaWYgKHRhc2tQcmlvcml0aWVzTGVuZ3RoID4gdGFza1RhZ3NMZW5ndGgpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0YXNrUHJpb3JpdGllcywgMCwgKHRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGFza1RhZ3NMZW5ndGhdW10pLCAwLCB0YXNrVGFnc0xlbmd0aCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0YXNrVGFncywgMCwgKHRhc2tUYWdzID0gbmV3IGNoYXJbdGFza1ByaW9yaXRpZXNMZW5ndGhdW10pLCAwLCB0YXNrUHJpb3JpdGllc0xlbmd0aCk7CisJCQkJCWxlbmd0aCA9IHRhc2tQcmlvcml0aWVzTGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJCWludFtdIGluaXRpYWxJbmRleGVzID0gbmV3IGludFtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWluaXRpYWxJbmRleGVzW2ldID0gaTsKKwkJCX0KKwkJCVV0aWwucmV2ZXJzZVF1aWNrU29ydCh0YXNrVGFncywgMCwgbGVuZ3RoIC0gMSwgaW5pdGlhbEluZGV4ZXMpOworCQkJY2hhcltdW10gdGVtcCA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQl0ZW1wW2ldID0gdGFza1ByaW9yaXRpZXNbaW5pdGlhbEluZGV4ZXNbaV1dOworCQkJfQorCQkJdGhpcy50YXNrUHJpb3JpdGllcyA9IHRlbXA7CisJCX0gZWxzZSB7CisJCQlVdGlsLnJldmVyc2VRdWlja1NvcnQodGFza1RhZ3MsIDAsIGxlbmd0aCAtIDEpOworCQl9CisJCXRoaXMudGFza1RhZ3MgPSB0YXNrVGFnczsKKwkJdGhpcy5pc1Rhc2tDYXNlU2Vuc2l0aXZlID0gaXNUYXNrQ2FzZVNlbnNpdGl2ZTsKKwl9CiB9CiAKIHB1YmxpYyBTY2FubmVyKAotCQlib29sZWFuIHRva2VuaXplQ29tbWVudHMsIAotCQlib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgCi0JCWJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywgCisJCWJvb2xlYW4gdG9rZW5pemVDb21tZW50cywKKwkJYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsCisJCWJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywKIAkJbG9uZyBzb3VyY2VMZXZlbCwKIAkJY2hhcltdW10gdGFza1RhZ3MsCiAJCWNoYXJbXVtdIHRhc2tQcmlvcml0aWVzLApAQCAtMjMzLDcgKzI2OCw3IEBACiB9CiAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGF0RW5kKCkgewotCS8vIFRoaXMgY29kZSBpcyBub3QgcmVsZXZhbnQgaWYgc291cmNlIGlzIAorCS8vIFRoaXMgY29kZSBpcyBub3QgcmVsZXZhbnQgaWYgc291cmNlIGlzCiAJLy8gT25seSBhIHBhcnQgb2YgdGhlIHJlYWwgc3RyZWFtIGlucHV0CiAKIAlyZXR1cm4gdGhpcy5lb2ZQb3NpdGlvbiA8PSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKQEAgLTI0Myw3ICsyNzgsNyBAQAogLy8gVE9ETyAoZnJlZGVyaWMpIHNlZSBpZiB3ZSBuZWVkIHRvIHRha2UgdW5pY29kZSBjaGFyYWN0ZXJzIGludG8gYWNjb3VudC4uLgogcHVibGljIHZvaWQgY2hlY2tUYXNrVGFnKGludCBjb21tZW50U3RhcnQsIGludCBjb21tZW50RW5kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAljaGFyW10gc3JjID0gdGhpcy5zb3VyY2U7Ci0JCisKIAkvLyBvbmx5IGxvb2sgZm9yIG5ld2VyIHRhc2s6IHRhZ3MKIAlpZiAodGhpcy5mb3VuZFRhc2tDb3VudCA+IDAKIAkJJiYgdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnNbdGhpcy5mb3VuZFRhc2tDb3VudCAtIDFdWzBdID49IGNvbW1lbnRTdGFydCkgewpAQCAtMjYxLDI3ICsyOTYsMjkgQEAKIAkJCQl0YWcgPSB0aGlzLnRhc2tUYWdzW2l0YWddOwogCQkJCWludCB0YWdMZW5ndGggPSB0YWcubGVuZ3RoOwogCQkJCWlmICh0YWdMZW5ndGggPT0gMCkgY29udGludWUgbmV4dFRhZzsKLQkKKwogCQkJCS8vIGVuc3VyZSB0YWcgaXMgbm90IGxlYWRlZCB3aXRoIGxldHRlciBpZiB0YWcgc3RhcnRzIHdpdGggYSBsZXR0ZXIKLQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGFnWzBdKSkgewotCQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChwcmV2aW91cykpIHsKKwkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIHRhZ1swXSkpIHsKKwkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIHByZXZpb3VzKSkgewogCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQkJfQogCQkJCX0KLQkKKwogCQkJCWZvciAoaW50IHQgPSAwOyB0IDwgdGFnTGVuZ3RoOyB0KyspIHsKIAkJCQkJY2hhciBzYywgdGM7CiAJCQkJCWludCB4ID0gaSt0OwogCQkJCQlpZiAoeCA+PSB0aGlzLmVvZlBvc2l0aW9uIHx8IHggPj0gY29tbWVudEVuZCkgY29udGludWUgbmV4dFRhZzsKLQkJCQkJaWYgKChzYyA9IHNyY1tpICsgdF0pICE9ICh0YyA9IHRhZ1t0XSkpIHsgCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZSBzZW5zaXRpdmUgY2hlY2sKLQkJCQkJCWlmICh0aGlzLmlzVGFza0Nhc2VTZW5zaXRpdmUgfHwgKFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2Uoc2MpICE9IFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2UodGMpKSkgeyAJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjaworCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZSBjaGVjaworCQkJCQlpZiAoKHNjID0gc3JjW2kgKyB0XSkgIT0gKHRjID0gdGFnW3RdKSkgeworCQkJCQkJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjaworCQkJCQkJaWYgKHRoaXMuaXNUYXNrQ2FzZVNlbnNpdGl2ZSB8fCAoU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShzYykgIT0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZSh0YykpKSB7CiAJCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQkvLyBlbnN1cmUgdGFnIGlzIG5vdCBmb2xsb3dlZCB3aXRoIGxldHRlciBpZiB0YWcgZmluaXNoZXMgd2l0aCBhIGxldHRlcgotCQkJCWlmIChpK3RhZ0xlbmd0aCA8IGNvbW1lbnRFbmQgJiYgU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChzcmNbaSt0YWdMZW5ndGgtMV0pKSB7Ci0JCQkJCWlmIChTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHNyY1tpICsgdGFnTGVuZ3RoXSkpCisJCQkJaWYgKGkrdGFnTGVuZ3RoIDwgY29tbWVudEVuZCAmJiBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBzcmNbaSt0YWdMZW5ndGgtMV0pKSB7CisJCQkJCWlmIChTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBzcmNbaSArIHRhZ0xlbmd0aF0pKQogCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQl9CiAJCQkJaWYgKHRoaXMuZm91bmRUYXNrVGFncyA9PSBudWxsKSB7CkBAIC0yOTUsMTEgKzMzMiwxMSBAQAogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUHJpb3JpdGllcywgMCwgdGhpcy5mb3VuZFRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGhpcy5mb3VuZFRhc2tDb3VudCAqIDJdW10sIDAsIHRoaXMuZm91bmRUYXNrQ291bnQpOwogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUG9zaXRpb25zLCAwLCB0aGlzLmZvdW5kVGFza1Bvc2l0aW9ucyA9IG5ldyBpbnRbdGhpcy5mb3VuZFRhc2tDb3VudCAqIDJdW10sIDAsIHRoaXMuZm91bmRUYXNrQ291bnQpOwogCQkJCX0KLQkJCQkKKwogCQkJCXByaW9yaXR5ID0gdGhpcy50YXNrUHJpb3JpdGllcyAhPSBudWxsICYmIGl0YWcgPCB0aGlzLnRhc2tQcmlvcml0aWVzLmxlbmd0aAogCQkJCQkJCT8gdGhpcy50YXNrUHJpb3JpdGllc1tpdGFnXQogCQkJCQkJCTogbnVsbDsKLQkJCQkKKwogCQkJCXRoaXMuZm91bmRUYXNrVGFnc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IHRhZzsKIAkJCQl0aGlzLmZvdW5kVGFza1ByaW9yaXRpZXNbdGhpcy5mb3VuZFRhc2tDb3VudF0gPSBwcmlvcml0eTsKIAkJCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IG5ldyBpbnRbXSB7IGksIGkgKyB0YWdMZW5ndGggLSAxIH07CkBAIC0zNDcsMTAgKzM4NCw5IEBACiAJCQljb250aW51ZTsKIAkJfQogCQkvLyB0cmltIHRoZSBtZXNzYWdlCisJCS8vIHdlIGRvbid0IHRyaW0gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHNob3cgaXQgYWZ0ZXIgdGhlIHRhc2sgdGFnCiAJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShzcmNbZW5kXSkgJiYgbXNnU3RhcnQgPD0gZW5kKQogCQkJZW5kLS07Ci0JCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShzcmNbbXNnU3RhcnRdKSAmJiBtc2dTdGFydCA8PSBlbmQpCi0JCQltc2dTdGFydCsrOwogCQkvLyB1cGRhdGUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgdGFzawogCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVsxXSA9IGVuZDsKIAkJLy8gZ2V0IHRoZSBtZXNzYWdlIHNvdXJjZQpAQCAtMzc2LDM3ICs0MTIsMzUgQEAKIAogcHVibGljIGNoYXJbXSBnZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpIHsKIAkvL3JldHVybiB0aGUgdG9rZW4gUkVBTCBzb3VyY2UgKGFrYSB1bmljb2RlcyBhcmUgcHJlY29tcHV0ZWQpCi0KLQljaGFyW10gcmVzdWx0OwogCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKIAkJLy8wIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgCi0JCQkxLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLCAKLQkJCTAsIAotCQkJdGhpcy53aXRob3V0VW5pY29kZVB0cik7IAotCX0gZWxzZSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJaWYgKGxlbmd0aCA9PSB0aGlzLmVvZlBvc2l0aW9uKSByZXR1cm4gdGhpcy5zb3VyY2U7Ci0JCXN3aXRjaCAobGVuZ3RoKSB7IC8vIHNlZSBPcHRpbWl6ZWRMZW5ndGgKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTEoKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTIoKTsKLQkJCWNhc2UgMyA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTMoKTsKLQkJCWNhc2UgNCA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTQoKTsKLQkJCWNhc2UgNSA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTUoKTsKLQkJCWNhc2UgNiA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKTsKLQkJfQotCQkvL25vIG9wdGltaXphdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLnN0YXJ0UG9zaXRpb24sIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLAorCQkJMSwKKwkJCXJlc3VsdCwKKwkJCTAsCisJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JLy9uZXdJZGVudENvdW50Kys7CisJaW50IGxlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uOworCWlmIChsZW5ndGggPT0gdGhpcy5lb2ZQb3NpdGlvbikgcmV0dXJuIHRoaXMuc291cmNlOworCXN3aXRjaCAobGVuZ3RoKSB7IC8vIHNlZSBPcHRpbWl6ZWRMZW5ndGgKKwkJY2FzZSAxIDoKKwkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UxKCk7CisJCWNhc2UgMiA6CisJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMigpOworCQljYXNlIDMgOgorCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTMoKTsKKwkJY2FzZSA0IDoKKwkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U0KCk7CisJCWNhc2UgNSA6CisJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNSgpOworCQljYXNlIDYgOgorCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKTsKKwl9CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCByZXN1bHQsIDAsIGxlbmd0aCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKXsKQEAgLTQxOSwxOSArNDUzLDE5IEBACiAJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKIAkJLy8gMCBpcyB1c2VkIGFzIGEgZmFzdCB0ZXN0IGZsYWcgc28gdGhlIHJlYWwgZmlyc3QgY2hhciBpcyBpbiBwb3NpdGlvbiAxCiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAKLQkJCTEsIAotCQkJcmVzdWx0ID0gbmV3IGNoYXJbdGhpcy53aXRob3V0VW5pY29kZVB0cl0sIAotCQkJMCwgCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsgCisJCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLAorCQkJMSwKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLAorCQkJMCwKKwkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIpOwogCWVsc2UgewogCQlpbnQgbGVuZ3RoOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5zb3VyY2UsIAotCQkJdGhpcy5zdGFydFBvc2l0aW9uLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5zb3VyY2UsCisJCQl0aGlzLnN0YXJ0UG9zaXRpb24sCisJCQlyZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbl0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ0MSwxNCArNDc1LDE0IEBACiAJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewogCQkvLyAwIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKIAkJcmV0dXJuIG5ldyBTdHJpbmcoCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAKLQkJCTEsIAorCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwKKwkJCTEsCiAJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsKIAl9CiAJcmV0dXJuIG5ldyBTdHJpbmcoCi0JCXRoaXMuc291cmNlLCAKLQkJdGhpcy5zdGFydFBvc2l0aW9uLCAKLQkJdGhpcy5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24pOyAKKwkJdGhpcy5zb3VyY2UsCisJCXRoaXMuc3RhcnRQb3NpdGlvbiwKKwkJdGhpcy5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24pOwogfQogcHVibGljIGNoYXJbXSBnZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSB7CiAJLy9yZXR1cm4gdGhlIHRva2VuIFJFQUwgc291cmNlIChha2EgdW5pY29kZXMgYXJlIHByZWNvbXB1dGVkKS4KQEAgLTQ2MywxMSArNDk3LDExIEBACiAJZWxzZSB7CiAJCWludCBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLnNvdXJjZSwgCi0JCQl0aGlzLnN0YXJ0UG9zaXRpb24gKyAxLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uIC0gMl0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuc291cmNlLAorCQkJdGhpcy5zdGFydFBvc2l0aW9uICsgMSwKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uIC0gMl0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ4NywzNiArNTIxLDM2IEBACiAJaW50IGxlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uOwogCWNoYXJbXSB0b2tlblNvdXJjZSA9IG5ldyBjaGFyW2xlbmd0aF07CiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0b2tlblNvdXJjZSwgMCwgbGVuZ3RoKTsKLQlyZXR1cm4gdG9rZW5Tb3VyY2U7CQorCXJldHVybiB0b2tlblNvdXJjZTsKIH0KLQkKKwogcHVibGljIGZpbmFsIGNoYXJbXSBnZXRSYXdUb2tlblNvdXJjZUVuZCgpIHsKIAlpbnQgbGVuZ3RoID0gdGhpcy5lb2ZQb3NpdGlvbiAtIHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMTsKIAljaGFyW10gc291cmNlRW5kID0gbmV3IGNoYXJbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLmN1cnJlbnRQb3NpdGlvbiwgc291cmNlRW5kLCAwLCBsZW5ndGgpOwotCXJldHVybiBzb3VyY2VFbmQ7CQorCXJldHVybiBzb3VyY2VFbmQ7CiB9Ci0JCisKIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpewogCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247CiB9CiAvKgogICogU2VhcmNoIHRoZSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKICAqCi0gKiBMaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQsIGFuZCByZWxhdGl2ZSB0byB0aGUgc2Nhbm5lciBpbml0aWFsUG9zaXRpb24uIAorICogTGluZSBudW1iZXJzIGFyZSAxLWJhc2VkLCBhbmQgcmVsYXRpdmUgdG8gdGhlIHNjYW5uZXIgaW5pdGlhbFBvc2l0aW9uLgogICogQ2hhcmFjdGVyIHBvc2l0aW9ucyBhcmUgMC1iYXNlZC4KICAqCiAgKiBJbiBjYXNlIHRoZSBnaXZlbiBsaW5lIG51bWJlciBpcyBpbmNvbnNpc3RlbnQsIGFuc3dlcnMgLTEuCiAgKi8KIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TGluZUVuZChpbnQgbGluZU51bWJlcikgewogCi0JaWYgKHRoaXMubGluZUVuZHMgPT0gbnVsbCB8fCB0aGlzLmxpbmVQdHIgPT0gLTEpIAorCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwgfHwgdGhpcy5saW5lUHRyID09IC0xKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPiB0aGlzLmxpbmVFbmRzLmxlbmd0aCsxKSAKKwlpZiAobGluZU51bWJlciA+IHRoaXMubGluZUVuZHMubGVuZ3RoKzEpCiAJCXJldHVybiAtMTsKLQlpZiAobGluZU51bWJlciA8PSAwKSAKKwlpZiAobGluZU51bWJlciA8PSAwKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPT0gdGhpcy5saW5lRW5kcy5sZW5ndGggKyAxKSAKKwlpZiAobGluZU51bWJlciA9PSB0aGlzLmxpbmVFbmRzLmxlbmd0aCArIDEpCiAJCXJldHVybiB0aGlzLmVvZlBvc2l0aW9uOwogCXJldHVybiB0aGlzLmxpbmVFbmRzW2xpbmVOdW1iZXItMV07IC8vIG5leHQgbGluZSBzdGFydCBvbmUgY2hhcmFjdGVyIGJlaGluZCB0aGUgbGluZUVuZCBvZiB0aGUgcHJldmlvdXMgbGluZQogfQpAQCAtNTM0LDI2ICs1NjgsMjYgQEAKIC8qKgogICogU2VhcmNoIHRoZSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKICAqCi0gKiBMaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQsIGFuZCByZWxhdGl2ZSB0byB0aGUgc2Nhbm5lciBpbml0aWFsUG9zaXRpb24uIAorICogTGluZSBudW1iZXJzIGFyZSAxLWJhc2VkLCBhbmQgcmVsYXRpdmUgdG8gdGhlIHNjYW5uZXIgaW5pdGlhbFBvc2l0aW9uLgogICogQ2hhcmFjdGVyIHBvc2l0aW9ucyBhcmUgMC1iYXNlZC4KICAqCiAgKiBlLmcuCWdldExpbmVTdGFydCgxKSAtLT4gMAlpbmRpY2F0ZXMgdGhhdCB0aGUgZmlyc3QgbGluZSBzdGFydHMgYXQgY2hhcmFjdGVyIDAuCiAgKgogICogSW4gY2FzZSB0aGUgZ2l2ZW4gbGluZSBudW1iZXIgaXMgaW5jb25zaXN0ZW50LCBhbnN3ZXJzIC0xLgotICogCisgKgogICogQHBhcmFtIGxpbmVOdW1iZXIgaW50CiAgKiBAcmV0dXJuIGludAogICovCiBwdWJsaWMgZmluYWwgaW50IGdldExpbmVTdGFydChpbnQgbGluZU51bWJlcikgewogCi0JaWYgKHRoaXMubGluZUVuZHMgPT0gbnVsbCB8fCB0aGlzLmxpbmVQdHIgPT0gLTEpIAorCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwgfHwgdGhpcy5saW5lUHRyID09IC0xKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPiB0aGlzLmxpbmVFbmRzLmxlbmd0aCArIDEpIAorCWlmIChsaW5lTnVtYmVyID4gdGhpcy5saW5lRW5kcy5sZW5ndGggKyAxKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPD0gMCkgCisJaWYgKGxpbmVOdW1iZXIgPD0gMCkKIAkJcmV0dXJuIC0xOwotCQotCWlmIChsaW5lTnVtYmVyID09IDEpIAorCisJaWYgKGxpbmVOdW1iZXIgPT0gMSkKIAkJcmV0dXJuIHRoaXMuaW5pdGlhbFBvc2l0aW9uOwogCXJldHVybiB0aGlzLmxpbmVFbmRzW2xpbmVOdW1iZXItMl0rMTsgLy8gbmV4dCBsaW5lIHN0YXJ0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBsaW5lRW5kIG9mIHRoZSBwcmV2aW91cyBsaW5lCiB9CkBAIC02MTAsNyArNjQ0LDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgPT0gdG8gdGhlIHRlc3RlZENoYXIKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAogCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7IC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKQEAgLTY1OSw3ICs2OTMsNyBAQAogCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyA9PSB0byB0aGUgdGVzdGVkQ2hhcjEvMgogCS8vT24gZmFsc2UsIG5vIHNpZGUgZWZmZWN0IGhhcyBvY2N1cmVkLgogCi0JLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTIAorCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUwogCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSAvLyBoYW5kbGUgdGhlIG9idmlvdXMgY2FzZSB1cGZyb250CiAJCXJldHVybiAtMTsKIApAQCAtNzAxLDYgKzczNSw1NCBAQAogCQlyZXR1cm4gLTE7CiAJfQogfQorLyoKKyAqIFRoaXMgbWV0aG9kIGNvbnN1bWVzIGRpZ2l0cyBhcyB3ZWxsIGFzIHVuZGVyc2NvcmVzIGlmIHVuZGVyc2NvcmVzIGFyZSBsb2NhdGVkIGJldHdlZW4gZGlnaXRzCisgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBpZiB1bmRlcnNjb3JlcyBhcmUgbm90IGxvY2F0ZWQgYmV0d2VlbiBkaWdpdHMgb3IgaWYgdW5kZXJzY29yZXMgYXJlIHVzZWQgaW4gc291cmNlIDwgMS43IAorICovCitwcml2YXRlIGZpbmFsIHZvaWQgY29uc3VtZURpZ2l0cyhpbnQgcmFkaXgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWNvbnN1bWVEaWdpdHMocmFkaXgsIGZhbHNlKTsKK30KKy8qCisgKiBUaGlzIG1ldGhvZCBjb25zdW1lcyBkaWdpdHMgYXMgd2VsbCBhcyB1bmRlcnNjb3JlcyBpZiB1bmRlcnNjb3JlcyBhcmUgbG9jYXRlZCBiZXR3ZWVuIGRpZ2l0cworICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWYgdW5kZXJzY29yZXMgYXJlIG5vdCBsb2NhdGVkIGJldHdlZW4gZGlnaXRzIG9yIGlmIHVuZGVyc2NvcmVzIGFyZSB1c2VkIGluIHNvdXJjZSA8IDEuNyAKKyAqLworcHJpdmF0ZSBmaW5hbCB2b2lkIGNvbnN1bWVEaWdpdHMoaW50IHJhZGl4LCBib29sZWFuIGV4cGVjdGluZ0RpZ2l0Rmlyc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWZpbmFsIGludCBVU0lOR19VTkRFUlNDT1JFID0gMTsKKwlmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IDI7CisJc3dpdGNoKGNvbnN1bWVEaWdpdHMwKHJhZGl4LCBVU0lOR19VTkRFUlNDT1JFLCBJTlZBTElEX1BPU0lUSU9OLCBleHBlY3RpbmdEaWdpdEZpcnN0KSkgeworCQljYXNlIFVTSU5HX1VOREVSU0NPUkUgOgorCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihVTkRFUlNDT1JFU19JTl9MSVRFUkFMU19OT1RfQkVMT1dfMTcpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSU5WQUxJRF9QT1NJVElPTiA6CisJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOREVSU0NPUkVTX0lOX0xJVEVSQUxTX05PVF9CRUxPV18xNyk7CisJCQl9CisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5ERVJTQ09SRSk7CisJfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgY29uc3VtZURpZ2l0czAoaW50IHJhZGl4LCBpbnQgdXNpbmdVbmRlcnNjb3JlLCBpbnQgaW52YWxpZFBvc2l0aW9uLCBib29sZWFuIGV4cGVjdGluZ0RpZ2l0Rmlyc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWludCBraW5kID0gMDsKKwlpZiAoZ2V0TmV4dENoYXIoJ18nKSkgeworCQlpZiAoZXhwZWN0aW5nRGlnaXRGaXJzdCkgeworCQkJcmV0dXJuIGludmFsaWRQb3NpdGlvbjsKKwkJfQorCQlraW5kID0gdXNpbmdVbmRlcnNjb3JlOworCQl3aGlsZSAoZ2V0TmV4dENoYXIoJ18nKSkgey8qZW1wdHkgKi99CisJfQorCWlmIChnZXROZXh0Q2hhckFzRGlnaXQocmFkaXgpKSB7CisJCS8vIGNvbnRpbnVlIHRvIHJlYWQgZGlnaXRzIG9yIHVuZGVyc2NvcmUKKwkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdChyYWRpeCkpIHsvKmVtcHR5ICovfQorCQlpbnQga2luZDIgPSBjb25zdW1lRGlnaXRzMChyYWRpeCwgdXNpbmdVbmRlcnNjb3JlLCBpbnZhbGlkUG9zaXRpb24sIGZhbHNlKTsKKwkJaWYgKGtpbmQyID09IDApIHsKKwkJCXJldHVybiBraW5kOworCQl9CisJCXJldHVybiBraW5kMjsKKwl9CisJaWYgKGtpbmQgPT0gdXNpbmdVbmRlcnNjb3JlKSByZXR1cm4gaW52YWxpZFBvc2l0aW9uOworCXJldHVybiBraW5kOworfQogcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TmV4dENoYXJBc0RpZ2l0KCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJLy9CT09MRUFOCiAJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KQEAgLTcxMCw3ICs3OTIsNyBAQAogCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyBhIGRpZ2l0CiAJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03NTEsNyArODMzLDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBkaWdpdCBiYXNlIG9uIHJhZGl4CiAJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03OTIsNyArODc0LDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBKYXZhSWRlbnRpZmllclBhcnQKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAlpbnQgcG9zID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJaWYgKHBvcyA+PSB0aGlzLmVvZlBvc2l0aW9uKSAvLyBoYW5kbGUgdGhlIG9idmlvdXMgY2FzZSB1cGZyb250CiAJCXJldHVybiBmYWxzZTsKQEAgLTgyMywxNCArOTA1LDE0IEBACiAJCQkJdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IHRlbXAyOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChjLCBsb3cpOworCQkJaXNKYXZhSWRlbnRpZmllclBhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjLCBsb3cpOwogCQl9CiAJCWVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gPSBwb3M7CiAJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyID0gdGVtcDI7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZWxzZSB7Ci0JCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7CisJCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMpOwogCQl9CiAJCWlmICh1bmljb2RlKSB7CiAJCQlpZiAoIWlzSmF2YUlkZW50aWZpZXJQYXJ0KSB7CkBAIC04NjQsNyArOTQ2LDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBKYXZhSWRlbnRpZmllclBhcnQKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAlpbnQgcG9zOwogCWlmICgocG9zID0gdGhpcy5jdXJyZW50UG9zaXRpb24pID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwpAQCAtODkzLDE0ICs5NzUsMTQgQEAKIAkJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyID0gdGVtcDI7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQotCQkJaXNKYXZhSWRlbnRpZmllclBhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMsIGxvdyk7CisJCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCX0KIAkJZWxzZSBpZiAoYyA+PSBMT1dfU1VSUk9HQVRFX01JTl9WQUxVRSAmJiBjIDw9IExPV19TVVJST0dBVEVfTUFYX1ZBTFVFKSB7CiAJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbiA9IHBvczsKIAkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIgPSB0ZW1wMjsKIAkJCXJldHVybiBmYWxzZTsKIAkJfSBlbHNlIHsKLQkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKKwkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgYyk7CiAJCX0KIAkJaWYgKHVuaWNvZGUpIHsKIAkJCWlmICghaXNKYXZhSWRlbnRpZmllclBhcnQpIHsKQEAgLTk2OCw4ICsxMDUwLDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJb2Zmc2V0ID0gdGhpcy5jdXJyZW50UG9zaXRpb24gLSBvZmZzZXQ7CiAJCQkJLy8gaW5saW5lIHZlcnNpb24gb2Y6Ci0JCQkJLy9pc1doaXRlU3BhY2UgPSAKLQkJCQkvLwkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJLy9pc1doaXRlU3BhY2UgPQorCQkJCS8vCSh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnKSB8fCBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpOwogCQkJCXN3aXRjaCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSB7CiAJCQkJCWNhc2UgMTAgOiAvKiBcIHUwMDBhOiBMSU5FIEZFRUQgICAgICAgICAgICAgICAqLwogCQkJCQljYXNlIDEyIDogLyogXCB1MDAwYzogRk9STSBGRUVEICAgICAgICAgICAgICAgKi8KQEAgLTEwMjAsNyArMTEwMiw3IEBACiAJCQkJLy8gaWxsZWdhbCBsb3cgc3Vycm9nYXRlCiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0xPV19TVVJST0dBVEUpOwogCQkJfQotCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMsIGxvdyk7CisJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCX0gZWxzZSBpZiAoYyA+PSBMT1dfU1VSUk9HQVRFX01JTl9WQUxVRSAmJiBjIDw9IExPV19TVVJST0dBVEVfTUFYX1ZBTFVFKSB7CiAJCQlpZiAodGhpcy5jb21wbGlhbmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKQEAgLTEwMjgsNyArMTExMCw3IEBACiAJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSElHSF9TVVJST0dBVEUpOwogCQl9IGVsc2UgewogCQkJLy8gb3B0aW1pemVkIGNhc2UgYWxyZWFkeSBjaGVja2VkCi0JCQlpc0phdmFJZFN0YXJ0ID0gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKKwkJCWlzSmF2YUlkU3RhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgYyk7CiAJCX0KIAkJaWYgKGlzSmF2YUlkU3RhcnQpCiAJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmRXaXRoQm91bmRDaGVjaygpOwpAQCAtMTA3MSw4ICsxMTUzLDE1IEBACiAJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+IHRoaXMuZW9mUG9zaXRpb24pCiAJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOwogCQkJCX0KLQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPiB0aGlzLmVvZlBvc2l0aW9uKQorCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+IHRoaXMuZW9mUG9zaXRpb24pIHsKKwkJCQkJaWYgKHRoaXMudG9rZW5pemVXaGl0ZVNwYWNlICYmICh3aGl0ZVN0YXJ0ICE9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkpIHsKKwkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uLS07CisJCQkJCQkvLyByZXBvc2l0aW9uIHNjYW5uZXIgaW4gY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBieSBzcGFjZXMgYXMgdG9rZW5zCisJCQkJCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJCQkJcmV0dXJuIFRva2VuTmFtZVdISVRFU1BBQ0U7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUVPRjsKKwkJCQl9CiAJCQkJaWYgKGNoZWNrSWZVbmljb2RlKSB7CiAJCQkJCWlzV2hpdGVTcGFjZSA9IGp1bXBPdmVyVW5pY29kZVdoaXRlU3BhY2UoKTsKIAkJCQkJb2Zmc2V0ID0gdGhpcy5jdXJyZW50UG9zaXRpb24gLSBvZmZzZXQ7CkBAIC0xMDg0LDggKzExNzMsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJCS8vIGlubGluZSB2ZXJzaW9uIG9mOgotCQkJCQkvL2lzV2hpdGVTcGFjZSA9IAotCQkJCQkvLwkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJCS8vaXNXaGl0ZVNwYWNlID0KKwkJCQkJLy8JKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuY3VycmVudENoYXJhY3Rlcik7CiAJCQkJCXN3aXRjaCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSB7CiAJCQkJCQljYXNlIDEwIDogLyogXCB1MDAwYTogTElORSBGRUVEICAgICAgICAgICAgICAgKi8KIAkJCQkJCWNhc2UgMTIgOiAvKiBcIHUwMDBjOiBGT1JNIEZFRUQgICAgICAgICAgICAgICAqLwpAQCAtMTM1MSw2ICsxNDQwLDkgQEAKIAkJCQkJCX0KIAogCQkJCQkJd2hpbGUgKHRoaXMuY3VycmVudENoYXJhY3RlciAhPSAnIicpIHsKKwkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9TVFJJTkcpOworCQkJCQkJCX0KIAkJCQkJCQkvKioqKiBcciBhbmQgXG4gYXJlIG5vdCB2YWxpZCBpbiBzdHJpbmcgbGl0ZXJhbHMgKioqKi8KIAkJCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpKSB7CiAJCQkJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCkBAIC0xNDQxLDExICsxNTMzLDExIEBACiAJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZVN0cmluZ0xpdGVyYWw7CiAJCQkJY2FzZSAnLycgOgotCQkJCQl7Ci0JCQkJCQlpbnQgdGVzdDsKLQkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCcvJywgJyonKSkgPT0gMCkgeyAvL2xpbmUgY29tbWVudCAKKwkJCQkJaWYgKCF0aGlzLnNraXBDb21tZW50cykgeworCQkJCQkJaW50IHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJyk7CisJCQkJCQlpZiAodGVzdCA9PSAwKSB7IC8vbGluZSBjb21tZW50CiAJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJdHJ5IHsgLy9nZXQgdGhlIG5leHQgY2hhcgogCQkJCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwpAQCAtMTQ1OCw5ICsxNTUwLDE1IEBACiAJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCWJvb2xlYW4gaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCXdoaWxlICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiB0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJykgeworCQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIHsKKwkJCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gKys7CisJCQkJCQkJCQkJLy8gdGhpcyBhdm9pZHMgZHVwbGljYXRpbmcgdGhlIGNvZGUgaW4gdGhlIGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKKwkJCQkJCQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgotCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CQkJCQkJCQkJCisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQogCQkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKQEAgLTE0NzYsMjAgKzE1NzQsMjEgQEAKIAkJCQkJCQkJICogV2UgbmVlZCB0byBjb21wbGV0ZWx5IGNvbnN1bWUgdGhlIGxpbmUgYnJlYWsKIAkJCQkJCQkJICovCiAJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJwotCQkJCQkJCQkgICAmJiB0aGlzLmVvZlBvc2l0aW9uID4gdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKLQkJCQkJCQkJICAgCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJCQkJCQkJCSYmIHRoaXMuZW9mUG9zaXRpb24gPiB0aGlzLmN1cnJlbnRQb3NpdGlvbikgeworCQkJCQkJCQkJaWYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJCQl0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSAnXG4nOwotCQkJCQkJCQkgICAJfSBlbHNlIGlmICgodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQl9IGVsc2UgaWYgKCh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJykKIAkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24gKyAxXSA9PSAndScpKSB7CiAJCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKIAkJCQkJCQkJCX0KLQkJCQkJCQkgICAJfQorCQkJCQkJCQl9CiAJCQkJCQkJCXJlY29yZENvbW1lbnQoVG9rZW5OYW1lQ09NTUVOVF9MSU5FKTsKIAkJCQkJCQkJaWYgKHRoaXMudGFza1RhZ3MgIT0gbnVsbCkgY2hlY2tUYXNrVGFnKHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5jdXJyZW50UG9zaXRpb24pOwogCQkJCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7Ci0JCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJCXRoaXMubGFzdFBvc2l0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKIAkJCQkJCQkJCQlwYXJzZVRhZ3MoKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICh0aGlzLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKQEAgLTE1MDcsMTMgKzE2MDYsMTQgQEAKIAkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24tLTsKIAkJCQkJCQkJcmVjb3JkQ29tbWVudChUb2tlbk5hbWVDT01NRU5UX0xJTkUpOwogCQkJCQkJCQlpZiAodGhpcy50YXNrVGFncyAhPSBudWxsKSBjaGVja1Rhc2tUYWcodGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmN1cnJlbnRQb3NpdGlvbik7Ci0JCQkJCQkJCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKKwkJCQkJCQkJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyAmJgorCQkJCQkJCQkJCXRoaXMubGFzdFBvc2l0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKIAkJCQkJCQkJCXBhcnNlVGFncygpOwogCQkJCQkJCQl9CiAJCQkJCQkJCWlmICh0aGlzLnRva2VuaXplQ29tbWVudHMpIHsKIAkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0xJTkU7CiAJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbisrOyAKKwkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJYnJlYWs7CkBAIC0xNTY1LDEyICsxNjY1LDE1IEBACiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsgLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCX0KIAkJCQkJCQkJLy8gZW1wdHkgY29tbWVudCBpcyBub3QgYSBqYXZhZG9jIC8qKi8KLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8KIAkJCQkJCQkJaW50IGZpcnN0VGFnID0gMDsKIAkJCQkJCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJy8nKSB8fCAoIXN0YXIpKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oVU5URVJNSU5BVEVEX0NPTU1FTlQpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJaWYgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgewogCQkJCQkJCQkJCWlmICh0aGlzLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKIAkJCQkJCQkJCQkJaWYgKGlzVW5pY29kZSkgewpAQCAtMTU4NSwxMCArMTY4OCwxMCBAQAogCQkJCQkJCQkJCQlzdGFyID0gdHJ1ZTsKIAkJCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCQkJY2FzZSAnQCc6Ci0JCQkJCQkJCQkJCWlmIChmaXJzdFRhZyA9PSAwKSB7CisJCQkJCQkJCQkJCWlmIChmaXJzdFRhZyA9PSAwICYmIHRoaXMuaXNGaXJzdFRhZygpKSB7CiAJCQkJCQkJCQkJCQlmaXJzdFRhZyA9IHByZXZpb3VzOwogCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCS8vIGZhbGwgdGhyb3VnaCBkZWZhdWx0IGNhc2UgdG8gc2V0IHN0YXIgdG8gZmFsc2UKKwkJCQkJCQkJCQkJLy8kRkFMTC1USFJPVUdIJCBkZWZhdWx0IGNhc2UgdG8gc2V0IHN0YXIgdG8gZmFsc2UKIAkJCQkJCQkJCQlkZWZhdWx0OgogCQkJCQkJCQkJCQlzdGFyID0gZmFsc2U7CiAJCQkJCQkJCQl9CkBAIC0xNjI2LDEwICsxNzI5LDEwIEBACiAJCQkJCQkJfQogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQotCQkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCi0JCQkJCQkJcmV0dXJuIFRva2VuTmFtZURJVklERV9FUVVBTDsKLQkJCQkJCXJldHVybiBUb2tlbk5hbWVESVZJREU7CiAJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFX0VRVUFMOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFOwogCQkJCWNhc2UgJ1x1MDAxYScgOgogCQkJCQlpZiAoYXRFbmQoKSkKIAkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CkBAIC0xNjU3LDcgKzE3NjAsNyBAQAogCQkJCQkJCS8vIGlsbGVnYWwgbG93IHN1cnJvZ2F0ZQogCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9MT1dfU1VSUk9HQVRFKTsKIAkJCQkJCX0KLQkJCQkJCWlzSmF2YUlkU3RhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjLCBsb3cpOworCQkJCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjLCBsb3cpOwogCQkJCQl9CiAJCQkJCWVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJCQkJaWYgKHRoaXMuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewpAQCAtMTY2NiwxMyArMTc2OSwxMyBAQAogCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hJR0hfU1VSUk9HQVRFKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIG9wdGltaXplZCBjYXNlIGFscmVhZHkgY2hlY2tlZAotCQkJCQkJaXNKYXZhSWRTdGFydCA9IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7CisJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMpOwogCQkJCQl9CiAJCQkJCWlmIChpc0phdmFJZFN0YXJ0KQogCQkJCQkJcmV0dXJuIHNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKCk7CiAJCQkJCWlmIChTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgewogCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIoZmFsc2UpOwotCQkJCQl9CQkJCQkJCisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUVSUk9SOwogCQkJfQogCQl9CkBAIC0xNjk1LDcgKzE3OTgsNyBAQAogCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCiAJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMCwgdW5pY29kZVNpemUgPSA2OwogCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uIDwgdGhpcy5lb2ZQb3NpdGlvbikgewpAQCAtMTc0OSw2ICsxODUyLDkgQEAKIHB1YmxpYyBjaGFyW10gZ2V0U291cmNlKCl7CiAJcmV0dXJuIHRoaXMuc291cmNlOwogfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXJzdFRhZygpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KIHB1YmxpYyBmaW5hbCB2b2lkIGp1bXBPdmVyTWV0aG9kQm9keSgpIHsKIAogCXRoaXMud2FzQWNyID0gZmFsc2U7CkBAIC0xODMyLDEzICsxOTM4LDE2IEBACiAJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKLQkJCQkJCQkJICAgIHVuaWNvZGVTdG9yZSgpOworCQkJCQkJCQkJdW5pY29kZVN0b3JlKCk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKIAkJCQkJCQkJLy8gaWdub3JlCiAJCQkJCQl9CiAJCQkJCQl3aGlsZSAodGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICciJykgeworCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CiAJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKXsKIAkJCQkJCQkJaWYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB0aGlzLmN1cnJlbnRQb3NpdGlvbisrOwogCQkJCQkJCQlicmVhayBOZXh0VG9rZW47IC8vIHRoZSBzdHJpbmcgY2Fubm90IGdvIGZ1cnRoZXIgdGhhdCB0aGUgbGluZQpAQCAtMTg4NywxMCArMTk5NiwxMCBAQAogCQkJCWNhc2UgJy8nIDoKIAkJCQkJewogCQkJCQkJaW50IHRlc3Q7Ci0JCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQKIAkJCQkJCQl0cnkgewogCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIKIAkJCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKQEAgLTE5MDIsOCArMjAxMSwxNCBAQAogCQkJCQkJCQl9IC8vanVtcCBvdmVyIHRoZSBcXAogCQkJCQkJCQlib29sZWFuIGlzVW5pY29kZSA9IGZhbHNlOwogCQkJCQkJCQl3aGlsZSAodGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgdGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICdcbicpIHsKKwkJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7CisJCQkJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uICsrOworCQkJCQkJCQkJCS8vIHRoaXMgYXZvaWRzIGR1cGxpY2F0aW5nIHRoZSBjb2RlIGluc2lkZSB0aGUgY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSBiZWxvdworCQkJCQkJCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJCQkJCQkJCQl9CiAJCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgogCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CkBAIC0xOTIwLDIwICsyMDM1LDIxIEBACiAJCQkJCQkJCSAqIFdlIG5lZWQgdG8gY29tcGxldGVseSBjb25zdW1lIHRoZSBsaW5lIGJyZWFrCiAJCQkJCQkJCSAqLwogCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicKLQkJCQkJCQkJICAgJiYgdGhpcy5lb2ZQb3NpdGlvbiA+IHRoaXMuY3VycmVudFBvc2l0aW9uKSB7Ci0JCQkJCQkJCSAgIAlpZiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcbicpIHsKKwkJCQkJCQkJCQkmJiB0aGlzLmVvZlBvc2l0aW9uID4gdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKKwkJCQkJCQkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgewogCQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gJ1xuJzsKLQkJCQkJCQkJICAgCX0gZWxzZSBpZiAoKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJfSBlbHNlIGlmICgodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcXCcpCiAJCQkJCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbiArIDFdID09ICd1JykpIHsKIAkJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOwogCQkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJCQkJfQotCQkJCQkJCSAgIAl9CisJCQkJCQkJCX0KIAkJCQkJCQkJcmVjb3JkQ29tbWVudChUb2tlbk5hbWVDT01NRU5UX0xJTkUpOwogCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yCiAJCQkJCQkJCQkmJiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkgewotCQkJCQkJCQkJCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKKwkJCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJCQl0aGlzLmxhc3RQb3NpdGlvbiA8IHRoaXMuY3VycmVudFBvc2l0aW9uKSB7CiAJCQkJCQkJCQkJCXBhcnNlVGFncygpOwogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CkBAIC0xOTQ4LDExICsyMDY0LDEyIEBACiAJCQkJCQkJCSAvL2FuIGVvZiB3aWxsIHRoZW4gYmUgZ2VuZXJhdGVkCiAJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uLS07CiAJCQkJCQkJCXJlY29yZENvbW1lbnQoVG9rZW5OYW1lQ09NTUVOVF9MSU5FKTsKLQkJCQkJCQkJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgeworCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJdGhpcy5sYXN0UG9zaXRpb24gPCB0aGlzLmN1cnJlbnRQb3NpdGlvbikgewogCQkJCQkJCQkJcGFyc2VUYWdzKCk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKCF0aGlzLnRva2VuaXplQ29tbWVudHMpIHsKLQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7IAorCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCQlicmVhayBOZXh0VG9rZW47CkBAIC0xOTcyLDEwICsyMDg5LDEwIEBACiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKLSAgICAJCQkJCQkJCSAgICB1bmljb2RlU3RvcmUoKTsKKwkJCQkJCQkJCQl1bmljb2RlU3RvcmUoKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQorCiAJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSB0cnVlOwogCQkJCQkJCQkJc3RhciA9IHRydWU7CkBAIC0yMDA0LDEyICsyMTIxLDE1IEBACiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsgLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCX0KIAkJCQkJCQkJLy8gZW1wdHkgY29tbWVudCBpcyBub3QgYSBqYXZhZG9jIC8qKi8KLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8KIAkJCQkJCQkJaW50IGZpcnN0VGFnID0gMDsKIAkJCQkJCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJy8nKSB8fCAoIXN0YXIpKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKIAkJCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CiAJCQkJCQkJCQkJCWlmIChpc1VuaWNvZGUpIHsKQEAgLTIwMjQsMTAgKzIxNDQsMTAgQEAKIAkJCQkJCQkJCQkJc3RhciA9IHRydWU7CiAJCQkJCQkJCQkJCWJyZWFrOwogCQkJCQkJCQkJCWNhc2UgJ0AnOgotCQkJCQkJCQkJCQlpZiAoZmlyc3RUYWcgPT0gMCkgeworCQkJCQkJCQkJCQlpZiAoZmlyc3RUYWcgPT0gMCAmJiB0aGlzLmlzRmlyc3RUYWcoKSkgewogCQkJCQkJCQkJCQkJZmlyc3RUYWcgPSBwcmV2aW91czsKIAkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkvLyBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlIHRvIHNldCBzdGFyIHRvIGZhbHNlCisJCQkJCQkJCQkJCS8vJEZBTEwtVEhST1VHSCQgZGVmYXVsdCBjYXNlIHRvIHNldCBzdGFyIHRvIGZhbHNlCiAJCQkJCQkJCQkJZGVmYXVsdDoKIAkJCQkJCQkJCQkJc3RhciA9IGZhbHNlOwogCQkJCQkJCQkJfQpAQCAtMjA4MSwxMiArMjIwMSwxMiBAQAogCQkJCQkJCQkvLyBpbGxlZ2FsIGxvdyBzdXJyb2dhdGUKIAkJCQkJCQkJYnJlYWsgTmV4dFRva2VuOwogCQkJCQkJCX0KLQkJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYywgbG93KTsKKwkJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCQkJCQl9IGVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJCQkJCWJyZWFrIE5leHRUb2tlbjsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJLy8gb3B0aW1pemVkIGNhc2UgYWxyZWFkeSBjaGVja2VkCi0JCQkJCQkJaXNKYXZhSWRTdGFydCA9IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7CisJCQkJCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjKTsKIAkJCQkJCX0KIAkJCQkJCWlmIChpc0phdmFJZFN0YXJ0KSB7CiAJCQkJCQkJc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKQEAgLTIwOTUsNyArMjIxNSw3IEBACiAvLwkJCQkJCWlmIChTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgewogLy8JCQkJCQkJc2Nhbk51bWJlcihmYWxzZSk7CiAvLwkJCQkJCQlicmVhayBOZXh0VG9rZW47Ci0vLwkJCQkJCX0JCQkJCQkKKy8vCQkJCQkJfQogCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKIAkJCQkJCS8vIGlnbm9yZQogCQkJCQl9CkBAIC0yMTg5LDkgKzIzMDksOSBAQAogCWNoYXJbXSBzcmMgPSB0aGlzLnNvdXJjZTsKIAlpbnQgc3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJY2hhciBjMCAsIGMxOwotCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzE9c3JjW3N0YXJ0KzFdKSkgJSBUYWJsZVNpemU7IAorCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzE9c3JjW3N0YXJ0KzFdKSkgJSBUYWJsZVNpemU7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMF1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTI7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5MjsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkpCkBAIC0yMTk5LDcgKzIzMTksNyBAQAogCX0KIAkvLy0tLS0tLS0tLW90aGVyIHNpZGUtLS0tLS0tLS0KIAlpID0gLTE7Ci0JaW50IG1heCA9IG5ld0VudHJ5MjsKKwlpbnQgbWF4ID0gdGhpcy5uZXdFbnRyeTI7CiAJd2hpbGUgKCsraSA8PSBtYXgpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkpCkBAIC0yMjEwLDcgKzIzMzAsNyBAQAogCWNoYXJbXSByOwogCVN5c3RlbS5hcnJheWNvcHkoc3JjLCBzdGFydCwgcj0gbmV3IGNoYXJbMl0sIDAsIDIpOwogCS8vbmV3SWRlbnRDb3VudCsrOwotCXJldHVybiB0YWJsZVtuZXdFbnRyeTIgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMX0pOworCXJldHVybiB0YWJsZVt0aGlzLm5ld0VudHJ5MiA9IG1heF0gPSByOyAvLyhyID0gbmV3IGNoYXJbXSB7YzAsIGMxfSk7CiB9CiBmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMygpIHsKIAkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQpAQCAtMjIxOCwxMCArMjMzOCwxMCBAQAogCWNoYXJbXSBzcmMgPSB0aGlzLnNvdXJjZTsKIAlpbnQgc3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJY2hhciBjMCwgYzE9c3JjW3N0YXJ0KzFdLCBjMjsKLQlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7IAotLy8JaW50IGhhc2ggPSAoKGMwIDw8IDEyKSArIChjMTw8IDYpICsgYzIpICUgVGFibGVTaXplOyAKKwlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7CisvLwlpbnQgaGFzaCA9ICgoYzAgPDwgMTIpICsgKGMxPDwgNikgKyBjMikgJSBUYWJsZVNpemU7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMV1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTM7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5MzsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkgJiYgKGMyID09IGNoYXJBcnJheVsyXSkpCkBAIC0yMjI5LDcgKzIzNDksNyBAQAogCX0KIAkvLy0tLS0tLS0tLW90aGVyIHNpZGUtLS0tLS0tLS0KIAlpID0gLTE7Ci0JaW50IG1heCA9IG5ld0VudHJ5MzsKKwlpbnQgbWF4ID0gdGhpcy5uZXdFbnRyeTM7CiAJd2hpbGUgKCsraSA8PSBtYXgpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkgJiYgKGMyID09IGNoYXJBcnJheVsyXSkpCkBAIC0yMjQwLDcgKzIzNjAsNyBAQAogCWNoYXJbXSByOwogCVN5c3RlbS5hcnJheWNvcHkoc3JjLCBzdGFydCwgcj0gbmV3IGNoYXJbM10sIDAsIDMpOwogCS8vbmV3SWRlbnRDb3VudCsrOwotCXJldHVybiB0YWJsZVtuZXdFbnRyeTMgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKKwlyZXR1cm4gdGFibGVbdGhpcy5uZXdFbnRyeTMgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKIH0KIGZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U0KCkgewogCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCkBAIC0yMjQ5LDkgKzIzNjksOSBAQAogCWludCBzdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAljaGFyIGMwLCBjMSA9IHNyY1tzdGFydCsxXSwgYzIsIGMzID0gc3JjW3N0YXJ0KzNdOwogCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7Ci0vLwlpbnQgaGFzaCA9IChpbnQpICgoKCgobG9uZykgYzApIDw8IDE4KSArIChjMSA8PCAxMikgKyAoYzIgPDwgNikgKyBjMykgJSBUYWJsZVNpemUpOyAKKy8vCWludCBoYXNoID0gKGludCkgKCgoKChsb25nKSBjMCkgPDwgMTgpICsgKGMxIDw8IDEyKSArIChjMiA8PCA2KSArIGMzKSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMl1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTQ7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NDsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIyNjIsNyArMjM4Miw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk0OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NDsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjI3Niw3ICsyMzk2LDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzRdLCAwLCA0KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk0ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjM30pOworCXJldHVybiB0YWJsZVt0aGlzLm5ld0VudHJ5NCA9IG1heF0gPSByOyAvLyhyID0gbmV3IGNoYXJbXSB7YzAsIGMxLCBjMiwgYzN9KTsKIH0KIGZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U1KCkgewogCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCkBAIC0yMjg1LDkgKzI0MDUsOSBAQAogCWludCBzdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAljaGFyIGMwLCBjMSA9IHNyY1tzdGFydCsxXSwgYzIsIGMzID0gc3JjW3N0YXJ0KzNdLCBjNDsKIAlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pIDw8IDEyKSArKChjMj1zcmNbc3RhcnQrMl0pIDw8IDYpICsgKGM0PXNyY1tzdGFydCs0XSkpICUgVGFibGVTaXplOwotLy8JaW50IGhhc2ggPSAoaW50KSAoKCgoKGxvbmcpIGMwKSA8PCAyNCkgKyAoKChsb25nKSBjMSkgPDwgMTgpICsgKGMyIDw8IDEyKSArIChjMyA8PCA2KSArIGM0KSAlIFRhYmxlU2l6ZSk7IAorLy8JaW50IGhhc2ggPSAoaW50KSAoKCgoKGxvbmcpIGMwKSA8PCAyNCkgKyAoKChsb25nKSBjMSkgPDwgMTgpICsgKGMyIDw8IDEyKSArIChjMyA8PCA2KSArIGM0KSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbM11baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTU7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NTsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIyOTksNyArMjQxOSw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk1OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NTsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjMxNCw3ICsyNDM0LDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzVdLCAwLCA1KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk1ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzR9KTsKKwlyZXR1cm4gdGFibGVbdGhpcy5uZXdFbnRyeTUgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzIsIGMzLCBjNH0pOwogfQogZmluYWwgY2hhcltdIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKSB7CiAJLy90cnkgdG8gcmV0dXJuIHRoZSBzYW1lIGNoYXJbXSBidWlsZCBvbmx5IG9uY2UKQEAgLTIzMjMsOSArMjQ0Myw5IEBACiAJaW50IHN0YXJ0ID0gdGhpcy5zdGFydFBvc2l0aW9uOwogCWNoYXIgYzAsIGMxID0gc3JjW3N0YXJ0KzFdLCBjMiwgYzMgPSBzcmNbc3RhcnQrM10sIGM0LCBjNSA9IHNyY1tzdGFydCs1XTsKIAlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pIDw8IDEyKSArKChjMj1zcmNbc3RhcnQrMl0pIDw8IDYpICsgKGM0PXNyY1tzdGFydCs0XSkpICUgVGFibGVTaXplOwotLy8JaW50IGhhc2ggPSAoaW50KSgoKCgobG9uZykgYzApIDw8IDMyKSArICgoKGxvbmcpIGMxKSA8PCAyNCkgKyAoKChsb25nKSBjMikgPDwgMTgpICsgKGMzIDw8IDEyKSArIChjNCA8PCA2KSArIGM1KSAlIFRhYmxlU2l6ZSk7IAorLy8JaW50IGhhc2ggPSAoaW50KSgoKCgobG9uZykgYzApIDw8IDMyKSArICgoKGxvbmcpIGMxKSA8PCAyNCkgKyAoKChsb25nKSBjMikgPDwgMTgpICsgKGMzIDw8IDEyKSArIChjNCA8PCA2KSArIGM1KSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbNF1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTY7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NjsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIzMzgsNyArMjQ1OCw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk2OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NjsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjM1NCw3ICsyNDc0LDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzZdLCAwLCA2KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk2ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CisJcmV0dXJuIHRhYmxlW3RoaXMubmV3RW50cnk2ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CiB9CiAKIHByaXZhdGUgdm9pZCBwYXJzZVRhZ3MoKSB7CkBAIC0yMzYyLDcgKzI0ODIsNyBAQAogCWZpbmFsIGludCBjdXJyZW50U3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAlmaW5hbCBpbnQgY3VycmVudExpbmVQdHIgPSB0aGlzLmxpbmVQdHI7CiAJaWYgKGN1cnJlbnRMaW5lUHRyID49IDApIHsKLQkJcG9zaXRpb24gPSB0aGlzLmxpbmVFbmRzW2N1cnJlbnRMaW5lUHRyXSArIDE7IAorCQlwb3NpdGlvbiA9IHRoaXMubGluZUVuZHNbY3VycmVudExpbmVQdHJdICsgMTsKIAl9CiAJd2hpbGUgKFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlW3Bvc2l0aW9uXSkpIHsKIAkJcG9zaXRpb24rKzsKQEAgLTIzNzgsMTAgKzI0OTgsMTAgQEAKIAlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CiAJCS8vIDAgaXMgdXNlZCBhcyBhIGZhc3QgdGVzdCBmbGFnIHNvIHRoZSByZWFsIGZpcnN0IGNoYXIgaXMgaW4gcG9zaXRpb24gMQogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgCi0JCQkxLCAKLQkJCXMgPSBuZXcgY2hhclt0aGlzLndpdGhvdXRVbmljb2RlUHRyXSwgCi0JCQkwLCAKKwkJCXRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsCisJCQkxLAorCQkJcyA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLAorCQkJMCwKIAkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIpOwogCQlzb3VyY2VFbmQgPSB0aGlzLndpdGhvdXRVbmljb2RlUHRyOwogCQlzb3VyY2VTdGFydCA9IDE7CkBAIC0yNDc4LDcgKzI1OTgsNyBAQAogCQkvLyBsb29rLWFoZWFkIGZvciBtZXJnZWQgY3IrbGYKIAkJdHJ5IHsKIAkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29rLWFoZWFkIExGLSIgKyB0aGlzLmN1cnJlbnRQb3NpdGlvbik7CQkJCisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2stYWhlYWQgTEYtIiArIHRoaXMuY3VycmVudFBvc2l0aW9uKTsKIAkJCQl0aGlzLmxpbmVFbmRzW3RoaXMubGluZVB0cl0gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbisrOwogCQkJCXRoaXMud2FzQWNyID0gZmFsc2U7CkBAIC0yNDkyLDcgKzI2MTIsNyBAQAogCQkvLyBsZiAwMDBBCiAJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykgeyAvL211c3QgbWVyZ2UgZXZlbnR1YWwgY3IgZm9sbG93ZWQgYnkgbGYKIAkJCWlmICh0aGlzLndhc0FjciAmJiAodGhpcy5saW5lRW5kc1t0aGlzLmxpbmVQdHJdID09ICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDIpKSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZXJnZSBMRi0iICsgKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkpOwkJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWVyZ2UgTEYtIiArICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKIAkJCQl0aGlzLmxpbmVFbmRzW3RoaXMubGluZVB0cl0gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQl9IGVsc2UgewogCQkJCWludCBzZXBhcmF0b3JQb3MgPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7CkBAIC0yNTI0LDEyICsyNjQ0LDE2IEBACiAKIHB1YmxpYyB2b2lkIHJlY29yZENvbW1lbnQoaW50IHRva2VuKSB7CiAJLy8gY29tcHV0ZSBwb3NpdGlvbgorCWludCBjb21tZW50U3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJaW50IHN0b3BQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCXN3aXRjaCAodG9rZW4pIHsKIAkJY2FzZSBUb2tlbk5hbWVDT01NRU5UX0xJTkU6CisJCQkvLyBib3RoIHBvc2l0aW9ucyBhcmUgbmVnYXRpdmUKKwkJCWNvbW1lbnRTdGFydCA9IC10aGlzLnN0YXJ0UG9zaXRpb247CiAJCQlzdG9wUG9zaXRpb24gPSAtdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZUNPTU1FTlRfQkxPQ0s6CisJCQkvLyBvbmx5IGVuZCBwb3NpdGlvbiBpcyBuZWdhdGl2ZQogCQkJc3RvcFBvc2l0aW9uID0gLXRoaXMuY3VycmVudFBvc2l0aW9uOwogCQkJYnJlYWs7CiAJfQpAQCAtMjU0MywxMyArMjY2NywxMyBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tbWVudFRhZ1N0YXJ0cywgMCwgdGhpcy5jb21tZW50VGFnU3RhcnRzID0gbmV3IGludFtuZXdMZW5ndGhdLCAwLCBsZW5ndGgpOwogCX0KIAl0aGlzLmNvbW1lbnRTdG9wc1t0aGlzLmNvbW1lbnRQdHJdID0gc3RvcFBvc2l0aW9uOwotCXRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gdGhpcy5zdGFydFBvc2l0aW9uOworCXRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gY29tbWVudFN0YXJ0OwogfQogCiAvKioKICAqIFJlcG9zaXRpb24gdGhlIHNjYW5uZXIgb24gc29tZSBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuIFRoZSBnaXZlbiBlbmRQb3NpdGlvbiBpcyB0aGUgbGFzdCB2YWxpZCBwb3NpdGlvbi4KICAqIEJleW9uZCB0aGlzIHBvc2l0aW9uLCB0aGUgc2Nhbm5lciB3aWxsIGFuc3dlciBFT0YgdG9rZW5zICg8Y29kZT5JVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRjwvY29kZT4pLgotICogCisgKgogICogQHBhcmFtIGJlZ2luIHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbgogICogQHBhcmFtIGVuZCB0aGUgZ2l2ZW4gZW5kIHBvc2l0aW9uCiAgKi8KQEAgLTI1NjcsNyArMjY5MSw3IEBACiAJdGhpcy5mb3VuZFRhc2tDb3VudCA9IDA7CiB9CiAKLXB1YmxpYyBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKK3Byb3RlY3RlZCBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkvLyB0aGUgc3RyaW5nIHdpdGggIlxcdSIgaXMgYSBsZWdhbCBzdHJpbmcgb2YgdHdvIGNoYXJzIFwgYW5kIHUKIAkvL3RodXMgd2UgdXNlIGEgZGlyZWN0IGFjY2VzcyB0byB0aGUgc291cmNlIChmb3IgcmVndWxhciBjYXNlcykuCiAJc3dpdGNoICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpIHsKQEAgLTI2MjIsNyArMjc0Niw3IEBACiAJCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25EaWdpdC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKIAkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbi0tOwogCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0LS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgkJCQkJCQorCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0LS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgogCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24tLTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKQEAgLTI2NDEsNyArMjc2NSw3IEBACiAJLy9maXJzdCBkaXNwYXRjaCBvbiB0aGUgZmlyc3QgY2hhci4KIAkvL3RoZW4gdGhlIGxlbmd0aC4gSWYgdGhlcmUgYXJlIHNldmVyYWwKIAkvL2tleXdvcnMgd2l0aCB0aGUgc2FtZSBsZW5ndGggQU5EIHRoZSBzYW1lIGZpcnN0IGNoYXIsIHRoZW4gZG8gYW5vdGhlcgotCS8vZGlzcGF0Y2ggb24gdGhlIHNlY29uZCBjaGFyIAorCS8vZGlzcGF0Y2ggb24gdGhlIHNlY29uZCBjaGFyCiAJdGhpcy51c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsKIAl0aGlzLnVzZUVudW1Bc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsKIApAQCAtMjY1NCw5ICsyNzc4LDkgQEAKIAkJCQlicmVhayBpZGVudExvb3A7CiAJCQljaGFyIGMgPSBzcmNbcG9zXTsKIAkJCWlmIChjIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgewotCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmIAorCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmCiAJCQkJCQkoU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19MT1dFUl9MRVRURVIgfCBTY2FubmVySGVscGVyLkNfSURFTlRfUEFSVCB8IFNjYW5uZXJIZWxwZXIuQ19ESUdJVCkpICE9IDApIHsKLQkJICAgICAgICAgICAgICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CiAJCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gYzsKIAkJCQkJCQl1bmljb2RlU3RvcmUoKTsKIAkJCQkJCX0KQEAgLTI2NjUsMTggKzI3ODksMTggQEAKIAkJCQkJCXRoaXMuY3VycmVudENoYXJhY3RlciA9IGM7CiAJCQkJCQlicmVhayBpZGVudExvb3A7CiAJCQkJfSBlbHNlIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNsb3c8PTEyODogICIrIGMpOwkJCQkJCQorCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdzw9MTI4OiAgIisgYyk7CiAJCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0V2l0aEJvdW5kQ2hlY2soKSl7LyplbXB0eSovfQotCQkJCQlicmVhayBpZGVudExvb3A7CQkJCQkJCisJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93Pj4xMjg6ICAiKyBjKTsJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdz4+MTI4OiAgIisgYyk7CiAJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnRXaXRoQm91bmRDaGVjaygpKXsvKmVtcHR5Ki99Ci0JCQkJYnJlYWsgaWRlbnRMb29wOwkJCQkJCQorCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCX0KIAkJfQogCX0KLQkKKwogCWludCBpbmRleCwgbGVuZ3RoOwogCWNoYXJbXSBkYXRhOwogCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyID09IDApIHsKQEAgLTI3MDIsOCArMjgyNiw4IEBACiAKIAkvL2ZpcnN0IGRpc3BhdGNoIG9uIHRoZSBmaXJzdCBjaGFyLgogCS8vdGhlbiB0aGUgbGVuZ3RoLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbAotCS8va2V5d29ycyB3aXRoIHRoZSBzYW1lIGxlbmd0aCBBTkQgdGhlIHNhbWUgZmlyc3QgY2hhciwgdGhlbiBkbyBhbm90aGVyCi0JLy9kaXNwYXRjaCBvbiB0aGUgc2Vjb25kIGNoYXIgCisJLy9rZXl3b3JkcyB3aXRoIHRoZSBzYW1lIGxlbmd0aCBBTkQgdGhlIHNhbWUgZmlyc3QgY2hhciwgdGhlbiBkbyBhbm90aGVyCisJLy9kaXNwYXRjaCBvbiB0aGUgc2Vjb25kIGNoYXIKIAl0aGlzLnVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IGZhbHNlOwogCXRoaXMudXNlRW51bUFzQW5JbmRlbnRpZmllciA9IGZhbHNlOwogCkBAIC0yNzE2LDkgKzI4NDAsOSBAQAogCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCWNoYXIgYyA9IHNyY1twb3NdOwogCQkJaWYgKGMgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7Ci0JCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYgCisJCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYKIAkJCQkJCShTY2FubmVySGVscGVyLkNfVVBQRVJfTEVUVEVSIHwgU2Nhbm5lckhlbHBlci5DX0xPV0VSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19JREVOVF9QQVJUIHwgU2Nhbm5lckhlbHBlci5DX0RJR0lUKSkgIT0gMCkgewotCQkgICAgICAgICAgICAgICBpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKIAkJCQkJCQl0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSBjOwogCQkJCQkJCXVuaWNvZGVTdG9yZSgpOwogCQkJCQkJfQpAQCAtMjcyNywxOCArMjg1MSwxOCBAQAogCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gYzsKIAkJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9IGVsc2UgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdzw9MTI4OiAgIisgYyk7CQkJCQkJCisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93PD0xMjg6ICAiKyBjKTsKIAkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSl7LyplbXB0eSovfQotCQkJCQlicmVhayBpZGVudExvb3A7CQkJCQkJCisJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93Pj4xMjg6ICAiKyBjKTsJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdz4+MTI4OiAgIisgYyk7CiAJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSl7LyplbXB0eSovfQotCQkJCWJyZWFrIGlkZW50TG9vcDsJCQkJCQkKKwkJCQlicmVhayBpZGVudExvb3A7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlpbnQgaW5kZXgsIGxlbmd0aDsKIAljaGFyW10gZGF0YTsKIAlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CkBAIC0yNzU5LDEwICsyODgzLDkgQEAKIAogCXJldHVybiBpbnRlcm5hbFNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKGluZGV4LCBsZW5ndGgsIGRhdGEpOwogfQotCiBwcml2YXRlIGludCBpbnRlcm5hbFNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKGludCBpbmRleCwgaW50IGxlbmd0aCwgY2hhcltdIGRhdGEpIHsKIAlzd2l0Y2ggKGRhdGFbaW5kZXhdKSB7Ci0JCWNhc2UgJ2EnIDogCisJCWNhc2UgJ2EnIDoKIAkJCXN3aXRjaChsZW5ndGgpIHsKIAkJCQljYXNlIDg6IC8vYWJzdHJhY3QKIAkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdiJykKQEAgLTI3ODcsMTIgKzI5MTAsMTIgQEAKIAkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWFzc2VydDsKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQl0aGlzLnVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IHRydWU7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwkJCQkJCQkJCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQkJCQl9Ci0JCQkJZGVmYXVsdDogCisJCQkJZGVmYXVsdDoKIAkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQl9CiAJCWNhc2UgJ2InIDogLy9ib29sZWFuIGJyZWFrIGJ5dGUKQEAgLTI5MDUsMjAgKzMwMjgsMjMgQEAKIAkJY2FzZSAnZScgOiAvL2Vsc2UgZXh0ZW5kcwogCQkJc3dpdGNoIChsZW5ndGgpIHsKIAkJCQljYXNlIDQgOgotCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2wnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpICYmIChkYXRhWysraW5kZXhdID09ICdlJykpCi0JCQkJCQlyZXR1cm4gVG9rZW5OYW1lZWxzZTsKLQkJCQkJZWxzZSBpZiAoKGRhdGFbaW5kZXhdID09ICduJykKLQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd1JykKLQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdtJykpIHsKLQkJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVlbnVtOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRoaXMudXNlRW51bUFzQW5JbmRlbnRpZmllciA9IHRydWU7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwkJCQkJCQkJCi0JCQkJCQkJfQorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpIHsKKwkJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncycpICYmIChkYXRhWysraW5kZXhdID09ICdlJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZWxzZTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoKGRhdGFbaW5kZXhdID09ICduJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ20nKSkgeworCQkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVlbnVtOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLnVzZUVudW1Bc0FuSW5kZW50aWZpZXIgPSB0cnVlOworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwogCQkJCWNhc2UgNyA6CiAJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneCcpCiAJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCkBAIC0zMjIwLDcgKzMzNDYsNyBAQAogCQkJCQllbHNlCiAJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKIAkJCQljYXNlIDQgOgotCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpIAorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCiAJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2knKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpKQogCQkJCQkJCXJldHVybiBUb2tlbk5hbWV0aGlzOwogCQkJCQkJZWxzZQpAQCAtMzMxOCwxMCArMzQ0NCwxMCBAQAogCS8vZG90UHJlZml4IGlzIHRydWUKIAogCWJvb2xlYW4gZmxvYXRpbmcgPSBkb3RQcmVmaXg7Ci0JaWYgKCghZG90UHJlZml4KSAmJiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcwJykpIHsKKwlpZiAoIWRvdFByZWZpeCAmJiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcwJykpIHsKIAkJaWYgKGdldE5leHRDaGFyKCd4JywgJ1gnKSA+PSAwKSB7IC8vLS0tLS0tLS0tLWhleGEtLS0tLS0tLS0tLS0tLS0tLQogCQkJaW50IHN0YXJ0ID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KDE2KSl7LyplbXB0eSovfQorCQkJY29uc3VtZURpZ2l0cygxNiwgdHJ1ZSk7CiAJCQlpbnQgZW5kID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJCQlpZiAoZ2V0TmV4dENoYXIoJ2wnLCAnTCcpID49IDApIHsKIAkJCQlpZiAoZW5kID09IHN0YXJ0KSB7CkBAIC0zMzI5LDI3ICszNDU1LDIzIEBACiAJCQkJfQogCQkJCXJldHVybiBUb2tlbk5hbWVMb25nTGl0ZXJhbDsKIAkJCX0gZWxzZSBpZiAoZ2V0TmV4dENoYXIoJy4nKSkgewotCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkJCQlpZiAoZW5kID09IHN0YXJ0KSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSEVYQSk7Ci0JCQkJCX0KLQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gPSBlbmQ7Ci0JCQkJCXJldHVybiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKLQkJCQl9CiAJCQkJLy8gaGV4YWRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbAogCQkJCS8vIHJlYWQgZGVjaW1hbCBwYXJ0CiAJCQkJYm9vbGVhbiBoYXNOb0RpZ2l0c0JlZm9yZURvdCA9IGVuZCA9PSBzdGFydDsKIAkJCQlzdGFydCA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwotCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoMTYpKXsvKmVtcHR5Ki99CisJCQkJY29uc3VtZURpZ2l0cygxNiwgdHJ1ZSk7CiAJCQkJZW5kID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJCQkJaWYgKGhhc05vRGlnaXRzQmVmb3JlRG90ICYmIGVuZCA9PSBzdGFydCkgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQlpZiAoZ2V0TmV4dENoYXIoJ3AnLCAnUCcpID49IDApIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zMzU4LDEwICszNDgwLDEwIEBACiAJCQkJCX0KIAogCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLScpCi0JCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCiAJCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zMzcwLDMxICszNDkyLDQ5IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCQl9CisJCQkJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdfJykgeworCQkJCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOREVSU0NPUkUpOworCQkJCQkJfQogCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hFWEEpOwogCQkJCQl9Ci0JCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQorCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKIAkJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKSB7CisJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJCX0KIAkJCQkJCXJldHVybiBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDsKIAkJCQkJfQogCQkJCQlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDApIHsKKwkJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQkJfQogCQkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CiAJCQkJCX0KIAkJCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJCX0KIAkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKLQkJCQkJfQkJCQkJCisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJfQogCQkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCQl9IGVsc2UgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGdldE5leHRDaGFyKCdwJywgJ1AnKSA+PSAwKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKLQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCQkJLy8gaWYgd2UgYXJlIGluIHNvdXJjZSBsZXZlbCA8IDEuNSB3ZSByZXBvcnQgYW4gaW50ZWdlciBsaXRlcmFsCi0JCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uID0gZW5kOwotCQkJCQlyZXR1cm4gVG9rZW5OYW1lSW50ZWdlckxpdGVyYWw7Ci0JCQkJfQogCQkJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM0MDMsMTAgKzM1NDMsMTAgQEAKIAkJCQl9CiAKIAkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLScpCi0JCQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zNDE0LDI4ICszNTU0LDcxIEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkKKwkJCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXycpIHsKKwkJCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9VTkRFUlNDT1JFKTsKKwkJCQkJfQogCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfRkxPQVQpOwotCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQotCQkJCWlmIChnZXROZXh0Q2hhcignZicsICdGJykgPj0gMCkKKwkJCQl9CisJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsOwotCQkJCWlmIChnZXROZXh0Q2hhcignZCcsICdEJykgPj0gMCkKKwkJCQl9CisJCQkJaWYgKGdldE5leHRDaGFyKCdkJywgJ0QnKSA+PSAwKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CisJCQkJfQogCQkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9CisJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCX0KIAkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGVuZCA9PSBzdGFydCkKIAkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hFWEEpOwogCQkJCXJldHVybiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKIAkJCX0KKwkJfSBlbHNlIGlmIChnZXROZXh0Q2hhcignYicsICdCJykgPj0gMCkgeyAvLy0tLS0tLS0tLS1iaW5hcnktLS0tLS0tLS0tLS0tLS0tLQorCQkJaW50IHN0YXJ0ID0gdGhpcy5jdXJyZW50UG9zaXRpb247CisJCQljb25zdW1lRGlnaXRzKDIsIHRydWUpOworCQkJaW50IGVuZCA9IHRoaXMuY3VycmVudFBvc2l0aW9uOworCQkJaWYgKGVuZCA9PSBzdGFydCkgeworCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKEJJTkFSWV9MSVRFUkFMX05PVF9CRUxPV18xNyk7CisJCQkJfQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9CSU5BUlkpOworCQkJfQorCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oQklOQVJZX0xJVEVSQUxfTk9UX0JFTE9XXzE3KTsKKwkJCQl9CisJCQkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOworCQkJfQorCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihCSU5BUllfTElURVJBTF9OT1RfQkVMT1dfMTcpOworCQkJfQorCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOwogCQl9CiAKLQkJLy90aGVyZSBpcyB4IG9yIFggaW4gdGhlIG51bWJlcgotCQkvL3BvdGVudGlhbCBvY3RhbCAhIC4uLiBzb21lIG9uZSBtYXkgd3JpdGUgMDAwMDk5LjAgISB0aHVzIDAwMTAwIDwgMDAwNzguMCBpcyB0cnVlICEhISEhIGNyYXp5IGxhbmd1YWdlCisJCS8vdGhlcmUgaXMgbm8geCBvciBYIG5vciBiIG9yIEIgaW4gdGhlIG51bWJlcgorCQkvL3BvdGVudGlhbCBvY3RhbAogCQlpZiAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpIHsgLy8tLS0tLS0tLS0tLS0tcG90ZW50aWFsIG9jdGFsLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQorCQkJY29uc3VtZURpZ2l0cygxMCk7CiAKIAkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkgewogCQkJCXJldHVybiBUb2tlbk5hbWVMb25nTGl0ZXJhbDsKQEAgLTM0NDksMTUgKzM2MzIsMTUgQEAKIAkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCX0gZWxzZSB7IC8vbWFrZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBvY3RhbCBhbmQgZmxvYXQgLi4uLgogCQkJCWJvb2xlYW4gaXNJbnRlZ2VyID0gdHJ1ZTsKLQkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgeyAKKwkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgewogCQkJCQlpc0ludGVnZXIgPSBmYWxzZTsKLQkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCQkJCWNvbnN1bWVEaWdpdHMoMTApOwogCQkJCX0KIAkJCQlpZiAoZ2V0TmV4dENoYXIoJ2UnLCAnRScpID49IDApIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQlpc0ludGVnZXIgPSBmYWxzZTsKIAkJCQkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewpAQCAtMzQ2NiwxMCArMzY0OSwxMCBAQAogCQkJCQl9CiAKIAkJCQkJaWYgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy0nKQotCQkJCQkJfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQotCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewpAQCAtMzQ3Nyw5ICszNjYwLDE1IEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWlmICghU2Nhbm5lckhlbHBlci5pc0RpZ2l0KHRoaXMuY3VycmVudENoYXJhY3RlcikpCisJCQkJCWlmICghU2Nhbm5lckhlbHBlci5pc0RpZ2l0KHRoaXMuY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ18nKSB7CisJCQkJCQkJLy8gd3JvbmdseSBwbGFjZSAnXycKKwkJCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5ERVJTQ09SRSk7CisJCQkJCQl9CiAJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfRkxPQVQpOwotCQkJCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpey8qZW1wdHkqL30KKwkJCQkJfQorCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKIAkJCQl9CiAJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKQogCQkJCQlyZXR1cm4gVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw7CkBAIC0zNDkyLDEzICszNjgxLDEzIEBACiAJCX0KIAl9CiAKLQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpey8qZW1wdHkqL30KKwljb25zdW1lRGlnaXRzKDEwKTsKIAogCWlmICgoIWRvdFByZWZpeCkgJiYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSkKIAkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOwogCiAJaWYgKCghZG90UHJlZml4KSAmJiAoZ2V0TmV4dENoYXIoJy4nKSkpIHsgLy9kZWNpbWFsIHBhcnQgdGhhdCBjYW4gYmUgZW1wdHkKLQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCWNvbnN1bWVEaWdpdHMoMTAsIHRydWUpOwogCQlmbG9hdGluZyA9IHRydWU7CiAJfQogCkBAIC0zNTA5LDcgKzM2OTgsNyBAQAogCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCiAJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQotCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKIAkJfSBlbHNlIHsKIAkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM1MTgsMTAgKzM3MDcsMTAgQEAKIAkJfQogCiAJCWlmICgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICctJykKLQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKIAkJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQl9IGVsc2UgewogCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM1MjksOSArMzcxOCwxNiBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKQorCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdfJykgeworCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOREVSU0NPUkUpOworCQkJfQogCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKLQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCX0KKwkJLy8gY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBkaWdpdCBzbyB3ZSBleHBlY3Qgbm8gZGlnaXQgZmlyc3QgKHRoZSBuZXh0IGNoYXJhY3RlciBjb3VsZCBiZSBhbiB1bmRlcnNjb3JlKQorCQljb25zdW1lRGlnaXRzKDEwKTsKIAl9CiAKIAlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDApCkBAIC0zNTY3LDEwICszNzYzLDEwIEBACiAJdGhpcy5lb2ZQb3NpdGlvbiA9IHNvdXJjZUxlbmd0aDsKIAl0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uID0gMDsKIAl0aGlzLmNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IGZhbHNlOwotCXRoaXMubGluZVB0ciA9IC0xOwkKKwl0aGlzLmxpbmVQdHIgPSAtMTsKIH0KIC8qCi0gKiBTaG91bGQgYmUgdXNlZCBpZiBhIHBhcnNlICh1c3VhbGx5IGEgZGlldCBwYXJzZSkgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHVuaXQsIAorICogU2hvdWxkIGJlIHVzZWQgaWYgYSBwYXJzZSAodXN1YWxseSBhIGRpZXQgcGFyc2UpIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkIG9uIHRoZSB1bml0LAogICogc28gYXMgdG8gZ2V0IHRoZSBhbHJlYWR5IGNvbXB1dGVkIGxpbmUgZW5kIHBvc2l0aW9ucy4KICAqLwogcHVibGljIGZpbmFsIHZvaWQgc2V0U291cmNlKGNoYXJbXSBjb250ZW50cywgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKQEAgLTM1ODcsNyArMzc4Myw3IEBACiAJfQogfQogLyoKLSAqIFNob3VsZCBiZSB1c2VkIGlmIGEgcGFyc2UgKHVzdWFsbHkgYSBkaWV0IHBhcnNlKSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgdW5pdCwgCisgKiBTaG91bGQgYmUgdXNlZCBpZiBhIHBhcnNlICh1c3VhbGx5IGEgZGlldCBwYXJzZSkgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHVuaXQsCiAgKiBzbyBhcyB0byBnZXQgdGhlIGFscmVhZHkgY29tcHV0ZWQgbGluZSBlbmQgcG9zaXRpb25zLgogICovCiBwdWJsaWMgZmluYWwgdm9pZCBzZXRTb3VyY2UoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKQEAgLTM1OTgsMzcgKzM3OTQsMjkgQEAKIAkJcmV0dXJuICJFT0ZcblxuIiArIG5ldyBTdHJpbmcodGhpcy5zb3VyY2UpOyAvLyROT04tTkxTLTEkCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID4gdGhpcy5lb2ZQb3NpdGlvbikKIAkJcmV0dXJuICJiZWhpbmQgdGhlIEVPRlxuXG4iICsgbmV3IFN0cmluZyh0aGlzLnNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKKwlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPD0gMCkKKwkJcmV0dXJuICJOT1Qgc3RhcnRlZCFcblxuIisgbmV3IFN0cmluZyh0aGlzLnNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKIAotCWNoYXIgZnJvbnRbXSA9IG5ldyBjaGFyW3RoaXMuc3RhcnRQb3NpdGlvbl07Ci0JU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgMCwgZnJvbnQsIDAsIHRoaXMuc3RhcnRQb3NpdGlvbik7Ci0KLQlpbnQgbWlkZGxlTGVuZ3RoID0gKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkgLSB0aGlzLnN0YXJ0UG9zaXRpb24gKyAxOwotCWNoYXIgbWlkZGxlW107Ci0JaWYgKG1pZGRsZUxlbmd0aCA+IC0xKSB7Ci0JCW1pZGRsZSA9IG5ldyBjaGFyW21pZGRsZUxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLnNvdXJjZSwgCi0JCQl0aGlzLnN0YXJ0UG9zaXRpb24sIAotCQkJbWlkZGxlLCAKLQkJCTAsIAotCQkJbWlkZGxlTGVuZ3RoKTsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPCAxMDAwKSB7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIDAsIHRoaXMuc3RhcnRQb3NpdGlvbik7CiAJfSBlbHNlIHsKLQkJbWlkZGxlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQlidWZmZXIuYXBwZW5kKCI8c291cmNlIGJlZ2lubmluZz5cbi4uLlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGxpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIodGhpcy5zdGFydFBvc2l0aW9uLTEwMDAsIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubGluZVB0cik7CisJCWludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIGxpbmVTdGFydCwgdGhpcy5zdGFydFBvc2l0aW9uLWxpbmVTdGFydCk7CiAJfQotCQotCWNoYXIgZW5kW10gPSBuZXcgY2hhclt0aGlzLmVvZlBvc2l0aW9uIC0gKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSldOwotCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRoaXMuc291cmNlLCAKLQkJKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkgKyAxLCAKLQkJZW5kLCAKLQkJMCwgCi0JCXRoaXMuZW9mUG9zaXRpb24gLSAodGhpcy5jdXJyZW50UG9zaXRpb24gLSAxKSAtIDEpOwotCQotCXJldHVybiBuZXcgU3RyaW5nKGZyb250KQotCQkrICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblN0YXJ0cyBoZXJlIC0tPiIgLy8kTk9OLU5MUy0xJAotCQkrIG5ldyBTdHJpbmcobWlkZGxlKQotCQkrICI8LS0gRW5kcyBoZXJlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iIC8vJE5PTi1OTFMtMSQKLQkJKyBuZXcgU3RyaW5nKGVuZCk7IAorCisJYnVmZmVyLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5TdGFydHMgaGVyZSAtLT4iKTsgLy8kTk9OLU5MUy0xJAorCWludCBtaWRkbGVMZW5ndGggPSAodGhpcy5jdXJyZW50UG9zaXRpb24gLSAxKSAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDE7CisJaWYgKG1pZGRsZUxlbmd0aCA+IC0xKSB7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIHRoaXMuc3RhcnRQb3NpdGlvbiwgbWlkZGxlTGVuZ3RoKTsKKwl9CisJYnVmZmVyLmFwcGVuZCgiPC0tIEVuZHMgaGVyZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7IC8vJE5PTi1OTFMtMSQKKworCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpICsgMSwgdGhpcy5lb2ZQb3NpdGlvbiAtICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpIC0gMSk7CisKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nQWN0aW9uKGludCBhY3QpIHsKIAlzd2l0Y2ggKGFjdCkgewpAQCAtMzg0NSwyMSArNDAzMywxMDYgQEAKIAl9CiB9CiBwdWJsaWMgdm9pZCB1bmljb2RlSW5pdGlhbGl6ZUJ1ZmZlcihpbnQgbGVuZ3RoKSB7Ci0JdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IGxlbmd0aDsJCi0gICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPT0gbnVsbCkgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCsoMSsxMCldOwotICAgIGludCBiTGVuZ3RoID0gdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlci5sZW5ndGg7Ci0gICAgaWYgKDErbGVuZ3RoID49IGJMZW5ndGgpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAwLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICsgKDErMTApXSwgMCwgYkxlbmd0aCk7Ci0gICAgfQotCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zb3VyY2UsIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMSwgbGVuZ3RoKTsgICAgCisJdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IGxlbmd0aDsKKwlpZiAodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9PSBudWxsKSB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoKygxKzEwKV07CisJaW50IGJMZW5ndGggPSB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLmxlbmd0aDsKKwlpZiAoMStsZW5ndGggPj0gYkxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsIDAsIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKyAoMSsxMCldLCAwLCBiTGVuZ3RoKTsKKwl9CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAxLCBsZW5ndGgpOwogfQogcHVibGljIHZvaWQgdW5pY29kZVN0b3JlKCkgewogCWludCBwb3MgPSArK3RoaXMud2l0aG91dFVuaWNvZGVQdHI7Ci0gICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPT0gbnVsbCkgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyWzEwXTsKLSAgICBpbnQgbGVuZ3RoID0gdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlci5sZW5ndGg7Ci0gICAgaWYgKHBvcyA9PSBsZW5ndGgpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAwLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICogMl0sIDAsIGxlbmd0aCk7Ci0gICAgfQorCWlmICh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID09IG51bGwpIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhclsxMF07CisJaW50IGxlbmd0aCA9IHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIubGVuZ3RoOworCWlmIChwb3MgPT0gbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMCwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCX0KIAl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyW3Bvc10gPSB0aGlzLmN1cnJlbnRDaGFyYWN0ZXI7CiB9CitwdWJsaWMgdm9pZCB1bmljb2RlU3RvcmUoY2hhciBjaGFyYWN0ZXIpIHsKKwlpbnQgcG9zID0gKyt0aGlzLndpdGhvdXRVbmljb2RlUHRyOworCWlmICh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID09IG51bGwpIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhclsxMF07CisJaW50IGxlbmd0aCA9IHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIubGVuZ3RoOworCWlmIChwb3MgPT0gbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMCwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCX0KKwl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyW3Bvc10gPSBjaGFyYWN0ZXI7Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lkZW50aWZpZXIoaW50IHRva2VuKSB7CisJcmV0dXJuIHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXI7Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpdGVyYWwoaW50IHRva2VuKSB7CisJc3dpdGNoKHRva2VuKSB7CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSW50ZWdlckxpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTG9uZ0xpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTdHJpbmdMaXRlcmFsOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tleXdvcmQoaW50IHRva2VuKSB7CisJc3dpdGNoKHRva2VuKSB7CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYWJzdHJhY3Q6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYXNzZXJ0OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJ5dGU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnJlYWs6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYm9vbGVhbjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjYXNlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXI6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2F0Y2g6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2xhc3M6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY29udGludWU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG86CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG91YmxlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRlZmF1bHQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZWxzZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVleHRlbmRzOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZvcjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmaW5hbDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmYWxzZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmaW5hbGx5OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWlmOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbXBvcnQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50ZXJmYWNlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWltcGxlbWVudHM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW5zdGFuY2VvZjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVsb25nOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZW5ldzoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVudWxsOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZW5hdGl2ZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwdWJsaWM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcGFja2FnZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwcml2YXRlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXByb3RlY3RlZDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVyZXR1cm46CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc2hvcnQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXI6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3RhdGljOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN3aXRjaDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdHJpY3RmcDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzeW5jaHJvbml6ZWQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ5OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRoaXM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ1ZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aHJvdzoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aHJvd3M6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJhbnNpZW50OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXZvaWQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldm9sYXRpbGU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ld2hpbGU6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwl9Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXJIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lckhlbHBlci5qYXZhCmluZGV4IGJhZmY5NTUuLjY5YzExMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lckhlbHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lckhlbHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsMjkgKzcsMzIgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgRGF2aWQgRm9lcnN0ZXIgLSBwYXRjaCBmb3IgdG9VcHBlckNhc2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMjUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiAKIHB1YmxpYyBjbGFzcyBTY2FubmVySGVscGVyIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmdbXSBCaXRzID0geyAKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZ1tdIEJpdHMgPSB7CiAJCUFTVE5vZGUuQml0MSwgQVNUTm9kZS5CaXQyLCBBU1ROb2RlLkJpdDMsIEFTVE5vZGUuQml0NCwgQVNUTm9kZS5CaXQ1LCBBU1ROb2RlLkJpdDYsCi0JCUFTVE5vZGUuQml0NywgQVNUTm9kZS5CaXQ4LCBBU1ROb2RlLkJpdDksIEFTVE5vZGUuQml0MTAsIEFTVE5vZGUuQml0MTEsIEFTVE5vZGUuQml0MTIsIAotCQlBU1ROb2RlLkJpdDEzLCBBU1ROb2RlLkJpdDE0LCBBU1ROb2RlLkJpdDE1LCBBU1ROb2RlLkJpdDE2LCBBU1ROb2RlLkJpdDE3LCBBU1ROb2RlLkJpdDE4LCAKLQkJQVNUTm9kZS5CaXQxOSwgQVNUTm9kZS5CaXQyMCwgQVNUTm9kZS5CaXQyMSwgQVNUTm9kZS5CaXQyMiwgQVNUTm9kZS5CaXQyMywgQVNUTm9kZS5CaXQyNCwgCi0JCUFTVE5vZGUuQml0MjUsIEFTVE5vZGUuQml0MjYsIEFTVE5vZGUuQml0MjcsIEFTVE5vZGUuQml0MjgsIEFTVE5vZGUuQml0MjksIEFTVE5vZGUuQml0MzAsIAotCQlBU1ROb2RlLkJpdDMxLCBBU1ROb2RlLkJpdDMyLCBBU1ROb2RlLkJpdDMzTCwgQVNUTm9kZS5CaXQzNEwsIEFTVE5vZGUuQml0MzVMLCBBU1ROb2RlLkJpdDM2TCwgCi0JCUFTVE5vZGUuQml0MzdMLCBBU1ROb2RlLkJpdDM4TCwgQVNUTm9kZS5CaXQzOUwsIEFTVE5vZGUuQml0NDBMLCBBU1ROb2RlLkJpdDQxTCwgQVNUTm9kZS5CaXQ0MkwsIAotCQlBU1ROb2RlLkJpdDQzTCwgQVNUTm9kZS5CaXQ0NEwsIEFTVE5vZGUuQml0NDVMLCBBU1ROb2RlLkJpdDQ2TCwgQVNUTm9kZS5CaXQ0N0wsIEFTVE5vZGUuQml0NDhMLCAKLQkJQVNUTm9kZS5CaXQ0OUwsIEFTVE5vZGUuQml0NTBMLCBBU1ROb2RlLkJpdDUxTCwgQVNUTm9kZS5CaXQ1MkwsIEFTVE5vZGUuQml0NTNMLCBBU1ROb2RlLkJpdDU0TCwgCi0JCUFTVE5vZGUuQml0NTVMLCBBU1ROb2RlLkJpdDU2TCwgQVNUTm9kZS5CaXQ1N0wsIEFTVE5vZGUuQml0NThMLCBBU1ROb2RlLkJpdDU5TCwgQVNUTm9kZS5CaXQ2MEwsIAorCQlBU1ROb2RlLkJpdDcsIEFTVE5vZGUuQml0OCwgQVNUTm9kZS5CaXQ5LCBBU1ROb2RlLkJpdDEwLCBBU1ROb2RlLkJpdDExLCBBU1ROb2RlLkJpdDEyLAorCQlBU1ROb2RlLkJpdDEzLCBBU1ROb2RlLkJpdDE0LCBBU1ROb2RlLkJpdDE1LCBBU1ROb2RlLkJpdDE2LCBBU1ROb2RlLkJpdDE3LCBBU1ROb2RlLkJpdDE4LAorCQlBU1ROb2RlLkJpdDE5LCBBU1ROb2RlLkJpdDIwLCBBU1ROb2RlLkJpdDIxLCBBU1ROb2RlLkJpdDIyLCBBU1ROb2RlLkJpdDIzLCBBU1ROb2RlLkJpdDI0LAorCQlBU1ROb2RlLkJpdDI1LCBBU1ROb2RlLkJpdDI2LCBBU1ROb2RlLkJpdDI3LCBBU1ROb2RlLkJpdDI4LCBBU1ROb2RlLkJpdDI5LCBBU1ROb2RlLkJpdDMwLAorCQlBU1ROb2RlLkJpdDMxLCBBU1ROb2RlLkJpdDMyLCBBU1ROb2RlLkJpdDMzTCwgQVNUTm9kZS5CaXQzNEwsIEFTVE5vZGUuQml0MzVMLCBBU1ROb2RlLkJpdDM2TCwKKwkJQVNUTm9kZS5CaXQzN0wsIEFTVE5vZGUuQml0MzhMLCBBU1ROb2RlLkJpdDM5TCwgQVNUTm9kZS5CaXQ0MEwsIEFTVE5vZGUuQml0NDFMLCBBU1ROb2RlLkJpdDQyTCwKKwkJQVNUTm9kZS5CaXQ0M0wsIEFTVE5vZGUuQml0NDRMLCBBU1ROb2RlLkJpdDQ1TCwgQVNUTm9kZS5CaXQ0NkwsIEFTVE5vZGUuQml0NDdMLCBBU1ROb2RlLkJpdDQ4TCwKKwkJQVNUTm9kZS5CaXQ0OUwsIEFTVE5vZGUuQml0NTBMLCBBU1ROb2RlLkJpdDUxTCwgQVNUTm9kZS5CaXQ1MkwsIEFTVE5vZGUuQml0NTNMLCBBU1ROb2RlLkJpdDU0TCwKKwkJQVNUTm9kZS5CaXQ1NUwsIEFTVE5vZGUuQml0NTZMLCBBU1ROb2RlLkJpdDU3TCwgQVNUTm9kZS5CaXQ1OEwsIEFTVE5vZGUuQml0NTlMLCBBU1ROb2RlLkJpdDYwTCwKIAkJQVNUTm9kZS5CaXQ2MUwsIEFTVE5vZGUuQml0NjJMLCBBU1ROb2RlLkJpdDYzTCwgQVNUTm9kZS5CaXQ2NEwsCiAJfTsKIApAQCAtMzcsNiArNDAsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJUX0lOREVYID0gMTsKIAogCXByaXZhdGUgc3RhdGljIGxvbmdbXVtdW10gVGFibGVzOworCXByaXZhdGUgc3RhdGljIGxvbmdbXVtdW10gVGFibGVzNzsKIAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BWF9PQlZJT1VTID0gMTI4OwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50W10gT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVMgPSBuZXcgaW50W01BWF9PQlZJT1VTXTsKQEAgLTc2LDE4ICs4MCwxOCBAQAogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1syNl0gPSBDX0lERU5UX1BBUlQ7CiAJCU9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTWzI3XSA9IENfSURFTlRfUEFSVDsKIAkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbMTI3XSA9IENfSURFTlRfUEFSVDsKLQkJCi0JCWZvciAoaW50IGkgPSAnMCc7IGkgPD0gJzknOyBpKyspIAorCisJCWZvciAoaW50IGkgPSAnMCc7IGkgPD0gJzknOyBpKyspCiAJCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tpXSA9IENfRElHSVQgfCBDX0lERU5UX1BBUlQ7Ci0JCQotCQlmb3IgKGludCBpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKSAKKworCQlmb3IgKGludCBpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQogCQkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbaV0gPSBDX0xPV0VSX0xFVFRFUiB8IENfSURFTlRfUEFSVCB8IENfSURFTlRfU1RBUlQ7Ci0JCWZvciAoaW50IGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspIAorCQlmb3IgKGludCBpID0gJ0EnOyBpIDw9ICdaJzsgaSsrKQogCQkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbaV0gPSBDX1VQUEVSX0xFVFRFUiB8IENfSURFTlRfUEFSVCB8IENfSURFTlRfU1RBUlQ7CiAKIAkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbJ18nXSA9IENfU1BFQ0lBTCB8IENfSURFTlRfUEFSVCB8IENfSURFTlRfU1RBUlQ7CiAJCU9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTWyckJ10gPSBDX1NQRUNJQUwgfCBDX0lERU5UX1BBUlQgfCBDX0lERU5UX1NUQVJUOwotCQkKKwogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1s5XSA9IENfU1BBQ0UgfCBDX0pMU19TUEFDRTsgLy8gXCB1MDAwOTogSE9SSVpPTlRBTCBUQUJVTEFUSU9OCiAJCU9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTWzEwXSA9IENfU1BBQ0UgfCBDX0pMU19TUEFDRTsgLy8gXCB1MDAwYTogTElORSBGRUVECiAJCU9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTWzExXSA9IENfU1BBQ0U7CkBAIC05OCw3ICsxMDIsNyBAQAogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1szMF0gPSBDX1NQQUNFOwogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1szMV0gPSBDX1NQQUNFOwogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1szMl0gPSBDX1NQQUNFIHwgQ19KTFNfU1BBQ0U7IC8vICBcIHUwMDIwOiBTUEFDRQotCQkKKwogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1snLiddID0gQ19TRVBBUkFUT1I7CiAJCU9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTWyc6J10gPSBDX1NFUEFSQVRPUjsKIAkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbJzsnXSA9IENfU0VQQVJBVE9SOwpAQCAtMTI2LDEzICsxMzAsMTMgQEAKIAkJT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbJyInXSA9IENfU0VQQVJBVE9SOwogCQlPQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1snXCcnXSA9IENfU0VQQVJBVE9SOwogCX0KLQkKLXN0YXRpYyB7CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVUYWJsZSgpIHsKIAlUYWJsZXMgPSBuZXcgbG9uZ1syXVtdW107Ci0JVGFibGVzW1NUQVJUX0lOREVYXSA9IG5ldyBsb25nWzJdW107Ci0JVGFibGVzW1BBUlRfSU5ERVhdID0gbmV3IGxvbmdbM11bXTsKKwlUYWJsZXNbU1RBUlRfSU5ERVhdID0gbmV3IGxvbmdbM11bXTsKKwlUYWJsZXNbUEFSVF9JTkRFWF0gPSBuZXcgbG9uZ1s0XVtdOwogCXRyeSB7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJzdGFydDEucnNjIikpOyAvLyROT04tTkxTLTEkCisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlL3N0YXJ0MC5yc2MiKSkpOyAvLyROT04tTkxTLTEkCiAJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CiAJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKQEAgLTE0NSw3ICsxNDksNyBAQAogCQllLnByaW50U3RhY2tUcmFjZSgpOwogCX0KIAl0cnkgewotCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic3RhcnQyLnJzYyIpKTsgLy8kTk9OLU5MUy0xJAorCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidW5pY29kZS9zdGFydDEucnNjIikpKTsgLy8kTk9OLU5MUy0xJAogCQlsb25nW10gcmVhZFZhbHVlcyA9IG5ldyBsb25nWzEwMjRdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgewogCQkJcmVhZFZhbHVlc1tpXSA9IGlucHV0U3RyZWFtLnJlYWRMb25nKCk7CkBAIC0xNTgsNyArMTYyLDIwIEBACiAJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJfQogCXRyeSB7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJwYXJ0MS5yc2MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShTY2FubmVySGVscGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInVuaWNvZGUvc3RhcnQyLnJzYyIpKSk7IC8vJE5PTi1OTFMtMSQKKwkJbG9uZ1tdIHJlYWRWYWx1ZXMgPSBuZXcgbG9uZ1sxMDI0XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKwkJCXJlYWRWYWx1ZXNbaV0gPSBpbnB1dFN0cmVhbS5yZWFkTG9uZygpOworCQl9CisJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCVRhYmxlc1tTVEFSVF9JTkRFWF1bMl0gPSByZWFkVmFsdWVzOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwl0cnkgeworCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidW5pY29kZS9wYXJ0MC5yc2MiKSkpOyAvLyROT04tTkxTLTEkCiAJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CiAJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKQEAgLTE3MSw3ICsxODgsNyBAQAogCQllLnByaW50U3RhY2tUcmFjZSgpOwogCX0KIAl0cnkgewotCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgicGFydDIucnNjIikpOyAvLyROT04tTkxTLTEkCisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlL3BhcnQxLnJzYyIpKSk7IC8vJE5PTi1OTFMtMSQKIAkJbG9uZ1tdIHJlYWRWYWx1ZXMgPSBuZXcgbG9uZ1sxMDI0XTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKIAkJCXJlYWRWYWx1ZXNbaV0gPSBpbnB1dFN0cmVhbS5yZWFkTG9uZygpOwpAQCAtMTg0LDcgKzIwMSw3IEBACiAJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJfQogCXRyeSB7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJwYXJ0MTQucnNjIikpOyAvLyROT04tTkxTLTEkCisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlL3BhcnQyLnJzYyIpKSk7IC8vJE5PTi1OTFMtMSQKIAkJbG9uZ1tdIHJlYWRWYWx1ZXMgPSBuZXcgbG9uZ1sxMDI0XTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKIAkJCXJlYWRWYWx1ZXNbaV0gPSBpbnB1dFN0cmVhbS5yZWFkTG9uZygpOwpAQCAtMTk2LDggKzIxMywxMTYgQEAKIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJfQorCXRyeSB7CisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlL3BhcnQxNC5yc2MiKSkpOyAvLyROT04tTkxTLTEkCisJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKKwkJfQorCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQlUYWJsZXNbUEFSVF9JTkRFWF1bM10gPSByZWFkVmFsdWVzOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KIH0KLQorc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVRhYmxlMTcoKSB7CisJVGFibGVzNyA9IG5ldyBsb25nWzJdW11bXTsKKwlUYWJsZXM3W1NUQVJUX0lOREVYXSA9IG5ldyBsb25nWzNdW107CisJVGFibGVzN1tQQVJUX0lOREVYXSA9IG5ldyBsb25nWzRdW107CisJdHJ5IHsKKwkJRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShTY2FubmVySGVscGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInVuaWNvZGU2L3N0YXJ0MC5yc2MiKSkpOyAvLyROT04tTkxTLTEkCisJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKKwkJfQorCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQlUYWJsZXM3W1NUQVJUX0lOREVYXVswXSA9IHJlYWRWYWx1ZXM7CisJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorCXRyeSB7CisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlNi9zdGFydDEucnNjIikpKTsgLy8kTk9OLU5MUy0xJAorCQlsb25nW10gcmVhZFZhbHVlcyA9IG5ldyBsb25nWzEwMjRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworCQkJcmVhZFZhbHVlc1tpXSA9IGlucHV0U3RyZWFtLnJlYWRMb25nKCk7CisJCX0KKwkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwkJVGFibGVzN1tTVEFSVF9JTkRFWF1bMV0gPSByZWFkVmFsdWVzOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwl0cnkgeworCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidW5pY29kZTYvc3RhcnQyLnJzYyIpKSk7IC8vJE5PTi1OTFMtMSQKKwkJbG9uZ1tdIHJlYWRWYWx1ZXMgPSBuZXcgbG9uZ1sxMDI0XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKwkJCXJlYWRWYWx1ZXNbaV0gPSBpbnB1dFN0cmVhbS5yZWFkTG9uZygpOworCQl9CisJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCVRhYmxlczdbU1RBUlRfSU5ERVhdWzJdID0gcmVhZFZhbHVlczsKKwl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9CisJdHJ5IHsKKwkJRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShTY2FubmVySGVscGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInVuaWNvZGU2L3BhcnQwLnJzYyIpKSk7IC8vJE5PTi1OTFMtMSQKKwkJbG9uZ1tdIHJlYWRWYWx1ZXMgPSBuZXcgbG9uZ1sxMDI0XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKwkJCXJlYWRWYWx1ZXNbaV0gPSBpbnB1dFN0cmVhbS5yZWFkTG9uZygpOworCQl9CisJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCVRhYmxlczdbUEFSVF9JTkRFWF1bMF0gPSByZWFkVmFsdWVzOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwl0cnkgeworCQlEYXRhSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKFNjYW5uZXJIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidW5pY29kZTYvcGFydDEucnNjIikpKTsgLy8kTk9OLU5MUy0xJAorCQlsb25nW10gcmVhZFZhbHVlcyA9IG5ldyBsb25nWzEwMjRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworCQkJcmVhZFZhbHVlc1tpXSA9IGlucHV0U3RyZWFtLnJlYWRMb25nKCk7CisJCX0KKwkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwkJVGFibGVzN1tQQVJUX0lOREVYXVsxXSA9IHJlYWRWYWx1ZXM7CisJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorCXRyeSB7CisJCURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oU2Nhbm5lckhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ1bmljb2RlNi9wYXJ0Mi5yc2MiKSkpOyAvLyROT04tTkxTLTEkCisJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKKwkJfQorCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQlUYWJsZXM3W1BBUlRfSU5ERVhdWzJdID0gcmVhZFZhbHVlczsKKwl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9CisJdHJ5IHsKKwkJRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShTY2FubmVySGVscGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInVuaWNvZGU2L3BhcnQxNC5yc2MiKSkpOyAvLyROT04tTkxTLTEkCisJCWxvbmdbXSByZWFkVmFsdWVzID0gbmV3IGxvbmdbMTAyNF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisJCQlyZWFkVmFsdWVzW2ldID0gaW5wdXRTdHJlYW0ucmVhZExvbmcoKTsKKwkJfQorCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQlUYWJsZXM3W1BBUlRfSU5ERVhdWzNdID0gcmVhZFZhbHVlczsKKwl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9Cit9CiBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQml0U2V0KGxvbmdbXSB2YWx1ZXMsIGludCBpKSB7CiAJdHJ5IHsKIAkJcmV0dXJuICh2YWx1ZXNbaSAvIDY0XSAmIEJpdHNbaSAlIDY0XSkgIT0gMDsKQEAgLTIxMSw0MCArMzM2LDkzIEBACiAJfQogCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7CiB9Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhciBoaWdoLCBjaGFyIGxvdykgewotCWludCBjb2RlUG9pbnQgPSB0b0NvZGVQb2ludChoaWdoLCBsb3cpOwotCXN3aXRjaCgoY29kZVBvaW50ICYgMHgxRjAwMDApID4+IDE2KSB7Ci0JCWNhc2UgMCA6Ci0JCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KChjaGFyKSBjb2RlUG9pbnQpOwotCQljYXNlIDEgOgotCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlc1tQQVJUX0lOREVYXVswXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKLQkJY2FzZSAyIDoKLQkJCXJldHVybiBpc0JpdFNldChUYWJsZXNbUEFSVF9JTkRFWF1bMV0sIGNvZGVQb2ludCAmIDB4RkZGRik7Ci0JCWNhc2UgMTQgOgotCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlc1tQQVJUX0lOREVYXVsyXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyUGFydChsb25nIGNvbXBsaWFuY2VMZXZlbCwgY2hhciBjKSB7CisJaWYgKGMgPCBNQVhfT0JWSU9VUykgeworCQlyZXR1cm4gKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbY10gJiBTY2FubmVySGVscGVyLkNfSURFTlRfUEFSVCkgIT0gMDsKKwl9CisJcmV0dXJuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGNvbXBsaWFuY2VMZXZlbCwgKGludCkgYyk7Cit9CitwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclBhcnQobG9uZyBjb21wbGlhbmNlTGV2ZWwsIGludCBjb2RlUG9pbnQpIHsKKwlpZiAoY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYpIHsKKwkJaWYgKFRhYmxlcyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplVGFibGUoKTsKKwkJfQorCQlzd2l0Y2goKGNvZGVQb2ludCAmIDB4MUYwMDAwKSA+PiAxNikgeworCQkJY2FzZSAwIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzW1BBUlRfSU5ERVhdWzBdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQkJY2FzZSAxIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzW1BBUlRfSU5ERVhdWzFdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQkJY2FzZSAyIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzW1BBUlRfSU5ERVhdWzJdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQkJY2FzZSAxNCA6CisJCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlc1tQQVJUX0lOREVYXVszXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIGphdmEgNyBzdXBwb3J0cyBVbmljb2RlIDYKKwkJaWYgKFRhYmxlczcgPT0gbnVsbCkgeworCQkJaW5pdGlhbGl6ZVRhYmxlMTcoKTsKKwkJfQorCQlzd2l0Y2goKGNvZGVQb2ludCAmIDB4MUYwMDAwKSA+PiAxNikgeworCQkJY2FzZSAwIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzN1tQQVJUX0lOREVYXVswXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKKwkJCWNhc2UgMSA6CisJCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlczdbUEFSVF9JTkRFWF1bMV0sIGNvZGVQb2ludCAmIDB4RkZGRik7CisJCQljYXNlIDIgOgorCQkJCXJldHVybiBpc0JpdFNldChUYWJsZXM3W1BBUlRfSU5ERVhdWzJdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQkJY2FzZSAxNCA6CisJCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlczdbUEFSVF9JTkRFWF1bM10sIGNvZGVQb2ludCAmIDB4RkZGRik7CisJCX0KIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGxvbmcgY29tcGxpYW5jZUxldmVsLCBjaGFyIGhpZ2gsIGNoYXIgbG93KSB7CisJcmV0dXJuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGNvbXBsaWFuY2VMZXZlbCwgdG9Db2RlUG9pbnQoaGlnaCwgbG93KSk7Cit9CiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIgYykgewogCWlmIChjIDwgTUFYX09CVklPVVMpIHsKIAkJcmV0dXJuIChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYgU2Nhbm5lckhlbHBlci5DX0lERU5UX1NUQVJUKSAhPSAwOwogCX0KIAlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLX0JCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIgaGlnaCwgY2hhciBsb3cpIHsKLQlpbnQgY29kZVBvaW50ID0gdG9Db2RlUG9pbnQoaGlnaCwgbG93KTsKLQlzd2l0Y2goKGNvZGVQb2ludCAmIDB4MUYwMDAwKSA+PiAxNikgewotCQljYXNlIDAgOgotCQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpIGNvZGVQb2ludCk7Ci0JCWNhc2UgMSA6Ci0JCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzW1NUQVJUX0lOREVYXVswXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKLQkJY2FzZSAyIDoKLQkJCXJldHVybiBpc0JpdFNldChUYWJsZXNbU1RBUlRfSU5ERVhdWzFdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworfQorcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydChsb25nIGNvbXBsaWFuY2VMZXZlbCwgY2hhciBjKSB7CisJaWYgKGMgPCBNQVhfT0JWSU9VUykgeworCQlyZXR1cm4gKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbY10gJiBTY2FubmVySGVscGVyLkNfSURFTlRfU1RBUlQpICE9IDA7CisJfQorCXJldHVybiBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjb21wbGlhbmNlTGV2ZWwsIChpbnQpIGMpOworfQorcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydChsb25nIGNvbXBsaWFuY2VMZXZlbCwgY2hhciBoaWdoLCBjaGFyIGxvdykgeworCXJldHVybiBpc0phdmFJZGVudGlmaWVyU3RhcnQoY29tcGxpYW5jZUxldmVsLCB0b0NvZGVQb2ludChoaWdoLCBsb3cpKTsKK30KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyU3RhcnQobG9uZyBjb21wbGlhbmNlTGV2ZWwsIGludCBjb2RlUG9pbnQpIHsKKwlpZiAoY29tcGxpYW5jZUxldmVsIDw9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzYpIHsKKwkJaWYgKFRhYmxlcyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplVGFibGUoKTsKKwkJfQorCQlzd2l0Y2goKGNvZGVQb2ludCAmIDB4MUYwMDAwKSA+PiAxNikgeworCQkJY2FzZSAwIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzW1NUQVJUX0lOREVYXVswXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKKwkJCWNhc2UgMSA6CisJCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlc1tTVEFSVF9JTkRFWF1bMV0sIGNvZGVQb2ludCAmIDB4RkZGRik7CisJCQljYXNlIDIgOgorCQkJCXJldHVybiBpc0JpdFNldChUYWJsZXNbU1RBUlRfSU5ERVhdWzJdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gamF2YSA3IHN1cHBvcnRzIFVuaWNvZGUgNgorCQlpZiAoVGFibGVzNyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplVGFibGUxNygpOworCQl9CisJCXN3aXRjaCgoY29kZVBvaW50ICYgMHgxRjAwMDApID4+IDE2KSB7CisJCQljYXNlIDAgOgorCQkJCXJldHVybiBpc0JpdFNldChUYWJsZXM3W1NUQVJUX0lOREVYXVswXSwgY29kZVBvaW50ICYgMHhGRkZGKTsKKwkJCWNhc2UgMSA6CisJCQkJcmV0dXJuIGlzQml0U2V0KFRhYmxlczdbU1RBUlRfSU5ERVhdWzFdLCBjb2RlUG9pbnQgJiAweEZGRkYpOworCQkJY2FzZSAyIDoKKwkJCQlyZXR1cm4gaXNCaXRTZXQoVGFibGVzN1tTVEFSVF9JTkRFWF1bMl0sIGNvZGVQb2ludCAmIDB4RkZGRik7CisJCX0KIAl9CiAJcmV0dXJuIGZhbHNlOwogfQotCi1wcml2YXRlIHN0YXRpYyBpbnQgdG9Db2RlUG9pbnQoY2hhciBoaWdoLCBjaGFyIGxvdykgewkKK3ByaXZhdGUgc3RhdGljIGludCB0b0NvZGVQb2ludChjaGFyIGhpZ2gsIGNoYXIgbG93KSB7CiAJcmV0dXJuIChoaWdoIC0gU2Nhbm5lci5ISUdIX1NVUlJPR0FURV9NSU5fVkFMVUUpICogMHg0MDAgKyAobG93IC0gU2Nhbm5lci5MT1dfU1VSUk9HQVRFX01JTl9WQUxVRSkgKyAweDEwMDAwOwogfQogcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoY2hhciBjKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKQEAgLTMwMiwxNyArNDgwLDE3IEBACiAJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmIFNjYW5uZXJIZWxwZXIuQ19VUFBFUl9MRVRURVIpICE9IDApIHsKIAkJCXJldHVybiBjOwogCQl9IGVsc2UgaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYgU2Nhbm5lckhlbHBlci5DX0xPV0VSX0xFVFRFUikgIT0gMCkgewotCQkJcmV0dXJuIChjaGFyKSAoYyAtIDMyKTsgCisJCQlyZXR1cm4gKGNoYXIpIChjIC0gMzIpOwogCQl9CiAJfQotCXJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyk7CisJcmV0dXJuIENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKTsKIH0KIHB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShjaGFyIGMpIHsKIAlpZiAoYyA8IE1BWF9PQlZJT1VTKSB7CiAJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmIFNjYW5uZXJIZWxwZXIuQ19MT1dFUl9MRVRURVIpICE9IDApIHsKIAkJCXJldHVybiBjOwogCQl9IGVsc2UgaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYgU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUikgIT0gMCkgewotCQkJcmV0dXJuIChjaGFyKSAoMzIgKyBjKTsgCisJCQlyZXR1cm4gKGNoYXIpICgzMiArIGMpOwogCQl9CiAJfQogCXJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyk7CkBAIC0zMzEsMTMgKzUwOSwxMyBAQAogfQogLyoqCiAgKiBJbmNsdWRlIGFsc28gbm9uIEpMUyB3aGl0ZXNwYWNlcy4KLSAqIAorICoKICAqIHJldHVybiB0cnVlIGlmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykgd291bGQgcmV0dXJuIHRydWUKICAqLwogcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKIAlpZiAoYyA8IE1BWF9PQlZJT1VTKSB7CiAJCXJldHVybiAoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmIFNjYW5uZXJIZWxwZXIuQ19TUEFDRSkgIT0gMDsKLQl9CQorCX0KIAlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKIH0KIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xldHRlcihjaGFyIGMpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVGVybWluYWxUb2tlbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVGVybWluYWxUb2tlbnMuamF2YQppbmRleCA5Yzg5NWQxLi5iZGE0ZGEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1Rlcm1pbmFsVG9rZW5zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9UZXJtaW5hbFRva2Vucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE4ICsxMSwxOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKLSAqIElNUE9SVEFOVCBOT1RFOiBUaGVzZSBjb25zdGFudHMgYXJlIGRlZGljYXRlZCB0byB0aGUgaW50ZXJuYWwgU2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gCi0gKiBJdCBpcyBtaXJyb3JlZCBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciBwdWJsaWMgcGFja2FnZSB3aGVyZSBpdCBpcyBBUEkuIAotICogVGhlIG1pcnJvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2luZyB0aGUgYmFja3dhcmQgY29tcGF0aWJsZSBJVGVybWluYWxTeW1ib2xzIGNvbnN0YW50IAotICogZGVmaW5pdGlvbnMgKHN0YWJsZSB3aXRoIDIuMCksIHdoZXJlYXMgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHVzZXMgVGVybWluYWxUb2tlbnMgCisgKiBJTVBPUlRBTlQgTk9URTogVGhlc2UgY29uc3RhbnRzIGFyZSBkZWRpY2F0ZWQgdG8gdGhlIGludGVybmFsIFNjYW5uZXIgaW1wbGVtZW50YXRpb24uCisgKiBJdCBpcyBtaXJyb3JlZCBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciBwdWJsaWMgcGFja2FnZSB3aGVyZSBpdCBpcyBBUEkuCisgKiBUaGUgbWlycm9yIGltcGxlbWVudGF0aW9uIGlzIHVzaW5nIHRoZSBiYWNrd2FyZCBjb21wYXRpYmxlIElUZXJtaW5hbFN5bWJvbHMgY29uc3RhbnQKKyAqIGRlZmluaXRpb25zIChzdGFibGUgd2l0aCAyLjApLCB3aGVyZWFzIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB1c2VzIFRlcm1pbmFsVG9rZW5zCiAgKiB3aGljaCBjb25zdGFudCB2YWx1ZXMgcmVmbGVjdCB0aGUgbGF0ZXN0IHBhcnNlciBnZW5lcmF0aW9uIHN0YXRlLgogICovCiAvKioKLSAqIE1hcHMgZWFjaCB0ZXJtaW5hbCBzeW1ib2wgaW4gdGhlIGphdmEtZ3JhbW1hciBpbnRvIGEgdW5pcXVlIGludGVnZXIuIAotICogVGhpcyBpbnRlZ2VyIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0ZXJtaW5hbCB3aGVuIGNvbXB1dGluZyBhIHBhcnNpbmcgYWN0aW9uLiAKLSAqIAotICogRGlzY2xhaW1lciA6IFRoZXNlIGNvbnN0YW50IHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYSBKYXZhIAotICogZ3JhbW1hciwgdGhlcmVmb3JlIHRoZWlyIGFjdHVhbCB2YWx1ZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGlmIG5ldyBrZXl3b3JkcyAKKyAqIE1hcHMgZWFjaCB0ZXJtaW5hbCBzeW1ib2wgaW4gdGhlIGphdmEtZ3JhbW1hciBpbnRvIGEgdW5pcXVlIGludGVnZXIuCisgKiBUaGlzIGludGVnZXIgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRlcm1pbmFsIHdoZW4gY29tcHV0aW5nIGEgcGFyc2luZyBhY3Rpb24uCisgKgorICogRGlzY2xhaW1lciA6IFRoZXNlIGNvbnN0YW50IHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYSBKYXZhCisgKiBncmFtbWFyLCB0aGVyZWZvcmUgdGhlaXIgYWN0dWFsIHZhbHVlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2UgaWYgbmV3IGtleXdvcmRzCiAgKiB3ZXJlIGFkZGVkIHRvIHRoZSBsYW5ndWFnZSAoZm9yIGluc3RhbmNlLCAnYXNzZXJ0JyBpcyBhIGtleXdvcmQgaW4gMS40KS4KICAqLwogcHVibGljIGludGVyZmFjZSBUZXJtaW5hbFRva2VucyB7CkBAIC0zOSw4ICszOSw4IEBACiAJCVRva2VuTmFtZWJvb2xlYW4gPSAzMiwKIAkJVG9rZW5OYW1lYnJlYWsgPSA3NSwKIAkJVG9rZW5OYW1lYnl0ZSA9IDMzLAotCQlUb2tlbk5hbWVjYXNlID0gMTAxLAotCQlUb2tlbk5hbWVjYXRjaCA9IDEwMiwKKwkJVG9rZW5OYW1lY2FzZSA9IDEwMiwKKwkJVG9rZW5OYW1lY2F0Y2ggPSAxMDAsCiAJCVRva2VuTmFtZWNoYXIgPSAzNCwKIAkJVG9rZW5OYW1lY2xhc3MgPSA3MiwKIAkJVG9rZW5OYW1lY29udGludWUgPSA3NiwKQEAgLTQ4LDE5ICs0OCwxOSBAQAogCQlUb2tlbk5hbWVkZWZhdWx0ID0gOTcsCiAJCVRva2VuTmFtZWRvID0gNzcsCiAJCVRva2VuTmFtZWRvdWJsZSA9IDM1LAotCQlUb2tlbk5hbWVlbHNlID0gMTAzLAorCQlUb2tlbk5hbWVlbHNlID0gMTA0LAogCQlUb2tlbk5hbWVlbnVtID0gOTgsCiAJCVRva2VuTmFtZWV4dGVuZHMgPSA5OSwKIAkJVG9rZW5OYW1lZmFsc2UgPSA0NCwKIAkJVG9rZW5OYW1lZmluYWwgPSA1NywKLQkJVG9rZW5OYW1lZmluYWxseSA9IDEwNCwKKwkJVG9rZW5OYW1lZmluYWxseSA9IDEwMywKIAkJVG9rZW5OYW1lZmxvYXQgPSAzNiwKIAkJVG9rZW5OYW1lZm9yID0gNzgsCiAJCVRva2VuTmFtZWdvdG8gPSAxMDksCiAJCVRva2VuTmFtZWlmID0gNzksCiAJCVRva2VuTmFtZWltcGxlbWVudHMgPSAxMDYsCi0JCVRva2VuTmFtZWltcG9ydCA9IDEwMCwKLQkJVG9rZW5OYW1laW5zdGFuY2VvZiA9IDE1LAorCQlUb2tlbk5hbWVpbXBvcnQgPSAxMDEsCisJCVRva2VuTmFtZWluc3RhbmNlb2YgPSAxMywKIAkJVG9rZW5OYW1laW50ID0gMzcsCiAJCVRva2VuTmFtZWludGVyZmFjZSA9IDk1LAogCQlUb2tlbk5hbWVsb25nID0gMzgsCkBAIC05MywxNSArOTMsMTUgQEAKIAkJVG9rZW5OYW1lRG91YmxlTGl0ZXJhbCA9IDUwLAogCQlUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsID0gNTEsCiAJCVRva2VuTmFtZVN0cmluZ0xpdGVyYWwgPSA1MiwKLQkJVG9rZW5OYW1lUExVU19QTFVTID0gOSwKLQkJVG9rZW5OYW1lTUlOVVNfTUlOVVMgPSAxMCwKKwkJVG9rZW5OYW1lUExVU19QTFVTID0gOCwKKwkJVG9rZW5OYW1lTUlOVVNfTUlOVVMgPSA5LAogCQlUb2tlbk5hbWVFUVVBTF9FUVVBTCA9IDE4LAotCQlUb2tlbk5hbWVMRVNTX0VRVUFMID0gMTYsCi0JCVRva2VuTmFtZUdSRUFURVJfRVFVQUwgPSAxNywKKwkJVG9rZW5OYW1lTEVTU19FUVVBTCA9IDE0LAorCQlUb2tlbk5hbWVHUkVBVEVSX0VRVUFMID0gMTUsCiAJCVRva2VuTmFtZU5PVF9FUVVBTCA9IDE5LAotCQlUb2tlbk5hbWVMRUZUX1NISUZUID0gMTMsCi0JCVRva2VuTmFtZVJJR0hUX1NISUZUID0gOCwKLQkJVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQgPSAxMSwKKwkJVG9rZW5OYW1lTEVGVF9TSElGVCA9IDE3LAorCQlUb2tlbk5hbWVSSUdIVF9TSElGVCA9IDEwLAorCQlUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA9IDEyLAogCQlUb2tlbk5hbWVQTFVTX0VRVUFMID0gODQsCiAJCVRva2VuTmFtZU1JTlVTX0VRVUFMID0gODUsCiAJCVRva2VuTmFtZU1VTFRJUExZX0VRVUFMID0gODYsCkBAIC0xMjUsMTMgKzEyNSwxMyBAQAogCQlUb2tlbk5hbWVPUiA9IDIyLAogCQlUb2tlbk5hbWVUV0lERExFID0gNjcsCiAJCVRva2VuTmFtZURJVklERSA9IDYsCi0JCVRva2VuTmFtZUdSRUFURVIgPSAxMiwKKwkJVG9rZW5OYW1lR1JFQVRFUiA9IDExLAogCQlUb2tlbk5hbWVMRVNTID0gNywKLQkJVG9rZW5OYW1lTFBBUkVOID0gMjgsCi0JCVRva2VuTmFtZVJQQVJFTiA9IDI5LAotCQlUb2tlbk5hbWVMQlJBQ0UgPSA2OSwKKwkJVG9rZW5OYW1lTFBBUkVOID0gMjksCisJCVRva2VuTmFtZVJQQVJFTiA9IDI4LAorCQlUb2tlbk5hbWVMQlJBQ0UgPSA2OCwKIAkJVG9rZW5OYW1lUkJSQUNFID0gMzEsCi0JCVRva2VuTmFtZUxCUkFDS0VUID0gMTQsCisJCVRva2VuTmFtZUxCUkFDS0VUID0gMTYsCiAJCVRva2VuTmFtZVJCUkFDS0VUID0gNzAsCiAJCVRva2VuTmFtZVNFTUlDT0xPTiA9IDI3LAogCQlUb2tlbk5hbWVRVUVTVElPTiA9IDIzLApAQCAtMTQxLDYgKzE0MSw2IEBACiAJCVRva2VuTmFtZUVRVUFMID0gNzEsCiAJCVRva2VuTmFtZUFUID0gNTMsCiAJCVRva2VuTmFtZUVMTElQU0lTID0gMTA3LAotCQlUb2tlbk5hbWVFT0YgPSA2OCwKKwkJVG9rZW5OYW1lRU9GID0gNjksCiAJCVRva2VuTmFtZUVSUk9SID0gMTEwOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9kaWFnbm9zZS9EaWFnbm9zZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9kaWFnbm9zZS9EaWFnbm9zZVBhcnNlci5qYXZhCmluZGV4IDdmNjU4ODEuLmEyNWRhMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvZGlhZ25vc2UvRGlhZ25vc2VQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL2RpYWdub3NlL0RpYWdub3NlUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogCXByaXZhdGUgYm9vbGVhbiBERUJVR19QQVJTRUNIRUNLID0gZmFsc2U7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0tfSU5DUkVNRU5UID0gMjU2OwotCQorCiAvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ09ERSA9IDE7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9DT0RFID0gMjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUSU9OX0NPREUgPSAzOwpAQCAtNDIsNjYgKzQyLDY2IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZfU0laRSAgICA9IDMyOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRElTVEFOQ0UgPSAzMDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0RJU1RBTkNFID0gMzsKLQkKKwogCXByaXZhdGUgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7Ci0JCisKIAlwcml2YXRlIExleFN0cmVhbSBsZXhTdHJlYW07CiAJcHJpdmF0ZSBpbnQgZXJyb3JUb2tlbjsKIAlwcml2YXRlIGludCBlcnJvclRva2VuU3RhcnQ7Ci0JCisKIAlwcml2YXRlIGludCBjdXJyZW50VG9rZW4gPSAwOwotCQorCiAJcHJpdmF0ZSBpbnQgc3RhY2tMZW5ndGg7CiAJcHJpdmF0ZSBpbnQgc3RhdGVTdGFja1RvcDsKIAlwcml2YXRlIGludFtdIHN0YWNrOwotCQorCiAJcHJpdmF0ZSBpbnRbXSBsb2NhdGlvblN0YWNrOwogCXByaXZhdGUgaW50W10gbG9jYXRpb25TdGFydFN0YWNrOwotCQorCiAJcHJpdmF0ZSBpbnQgdGVtcFN0YWNrVG9wOwogCXByaXZhdGUgaW50W10gdGVtcFN0YWNrOwotCQorCiAJcHJpdmF0ZSBpbnQgcHJldlN0YWNrVG9wOwogCXByaXZhdGUgaW50W10gcHJldlN0YWNrOwogCXByaXZhdGUgaW50IG5leHRTdGFja1RvcDsKIAlwcml2YXRlIGludFtdIG5leHRTdGFjazsKLQkKKwogCXByaXZhdGUgaW50IHNjb3BlU3RhY2tUb3A7CiAgICAgcHJpdmF0ZSBpbnRbXSBzY29wZUluZGV4OwogICAgIHByaXZhdGUgaW50W10gc2NvcGVQb3NpdGlvbjsKLQkKKwogCWludFtdIGxpc3QgPSBuZXcgaW50W05VTV9TWU1CT0xTICsgMV07CiAJaW50W10gYnVmZmVyID0gbmV3IGludFtCVUZGX1NJWkVdOwotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5JTCA9IC0xOwogCWludFtdIHN0YXRlU2VlbjsKLQkKKwogCWludCBzdGF0ZVBvb2xUb3A7CiAJU3RhdGVJbmZvW10gc3RhdGVQb29sOwotCQorCiAJcHJpdmF0ZSBQYXJzZXIgcGFyc2VyOwotCQorCiAJcHJpdmF0ZSBSZWNvdmVyeVNjYW5uZXIgcmVjb3ZlcnlTY2FubmVyOwotCQorCiAJcHJpdmF0ZSBib29sZWFuIHJlcG9ydFByb2JsZW07Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBhaXJDYW5kaWRhdGUgewogCQlwdWJsaWMgaW50IHN5bWJvbDsKIAkJcHVibGljIGludCBsb2NhdGlvbjsKLQkJCisKIAkJcHVibGljIFJlcGFpckNhbmRpZGF0ZSgpewogCQkJdGhpcy5zeW1ib2wgPSAwOwogCQkJdGhpcy5sb2NhdGlvbiA9IDA7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmltYXJ5UmVwYWlySW5mbyB7CiAJCXB1YmxpYyBpbnQgZGlzdGFuY2U7CiAJCXB1YmxpYyBpbnQgbWlzc3BlbGxJbmRleDsKIAkJcHVibGljIGludCBjb2RlOwogCQlwdWJsaWMgaW50IGJ1ZmZlclBvc2l0aW9uOwogCQlwdWJsaWMgaW50IHN5bWJvbDsKLQkJCisKIAkJcHVibGljIFByaW1hcnlSZXBhaXJJbmZvKCl7CiAJCQl0aGlzLmRpc3RhbmNlID0gMDsKIAkJCXRoaXMubWlzc3BlbGxJbmRleCA9IDA7CkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCXRoaXMuYnVmZmVyUG9zaXRpb24gPSAwOwogCQkJdGhpcy5zeW1ib2wgPSAwOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBQcmltYXJ5UmVwYWlySW5mbyBjb3B5KCl7CiAJCQlQcmltYXJ5UmVwYWlySW5mbyBjID0gbmV3IFByaW1hcnlSZXBhaXJJbmZvKCk7CiAJCQljLmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTsKQEAgLTExOCwxMCArMTE4LDEwIEBACiAJCQljLmJ1ZmZlclBvc2l0aW9uID0gdGhpcyAuYnVmZmVyUG9zaXRpb247CiAJCQljLnN5bWJvbCA9IHRoaXMuc3ltYm9sOwogCQkJcmV0dXJuIGM7Ci0JCQkKKwogCQl9CiAJfQotCQorCiAJc3RhdGljIGNsYXNzIFNlY29uZGFyeVJlcGFpckluZm8gewogCQlwdWJsaWMgaW50IGNvZGU7CiAJCXB1YmxpYyBpbnQgZGlzdGFuY2U7CkBAIC0xMzEsMTIgKzEzMSwxMiBAQAogCQlwdWJsaWMgaW50IHN5bWJvbDsKIAogCQlib29sZWFuIHJlY292ZXJ5T25OZXh0U3RhY2s7Ci0JfSAKLQkKKwl9CisKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0ZUluZm8gewogCSAgICBpbnQgc3RhdGU7CiAJICAgIGludCBuZXh0OwotCSAgICAKKwogCSAgICBwdWJsaWMgU3RhdGVJbmZvKGludCBzdGF0ZSwgaW50IG5leHQpewogCSAgICAJdGhpcy5zdGF0ZSA9IHN0YXRlOwogCSAgICAJdGhpcy5uZXh0ID0gbmV4dDsKQEAgLTE1MywzNCArMTUzLDM0IEBACiAJCXRoaXMubGV4U3RyZWFtID0gbmV3IExleFN0cmVhbShCVUZGX1NJWkUsIHBhcnNlci5zY2FubmVyLCBpbnRlcnZhbFN0YXJ0VG9Ta2lwLCBpbnRlcnZhbEVuZFRvU2tpcCwgaW50ZXJ2YWxGbGFnc1RvU2tpcCwgZmlyc3RUb2tlbiwgc3RhcnQsIGVuZCk7CiAJCXRoaXMucmVjb3ZlcnlTY2FubmVyID0gcGFyc2VyLnJlY292ZXJ5U2Nhbm5lcjsKIAl9Ci0JCisKIAlwcml2YXRlIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKXsKLQkJcmV0dXJuIHBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKTsKKwkJcmV0dXJuIHRoaXMucGFyc2VyLnByb2JsZW1SZXBvcnRlcigpOwogCX0KIAogCXByaXZhdGUgdm9pZCByZWFsbG9jYXRlU3RhY2tzKCkJewotCQlpbnQgb2xkX3N0YWNrX2xlbmd0aCA9IHN0YWNrTGVuZ3RoOworCQlpbnQgb2xkX3N0YWNrX2xlbmd0aCA9IHRoaXMuc3RhY2tMZW5ndGg7CiAKLQkJc3RhY2tMZW5ndGggKz0gU1RBQ0tfSU5DUkVNRU5UOworCQl0aGlzLnN0YWNrTGVuZ3RoICs9IFNUQUNLX0lOQ1JFTUVOVDsKIAogCQlpZihvbGRfc3RhY2tfbGVuZ3RoID09IDApewotCQkJc3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoXTsKLQkJCWxvY2F0aW9uU3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoXTsKLQkJCWxvY2F0aW9uU3RhcnRTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdOwotCQkJdGVtcFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aF07Ci0JCQlwcmV2U3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoXTsKLQkJCW5leHRTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdOwotCQkJc2NvcGVJbmRleCA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdOwotCQkJc2NvcGVQb3NpdGlvbiA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdOworCQkJdGhpcy5zdGFjayA9IG5ldyBpbnRbdGhpcy5zdGFja0xlbmd0aF07CisJCQl0aGlzLmxvY2F0aW9uU3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdOworCQkJdGhpcy5sb2NhdGlvblN0YXJ0U3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdOworCQkJdGhpcy50ZW1wU3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdOworCQkJdGhpcy5wcmV2U3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdOworCQkJdGhpcy5uZXh0U3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdOworCQkJdGhpcy5zY29wZUluZGV4ID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXTsKKwkJCXRoaXMuc2NvcGVQb3NpdGlvbiA9IG5ldyBpbnRbdGhpcy5zdGFja0xlbmd0aF07CiAJCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0YWNrLCAwLCBzdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobG9jYXRpb25TdGFjaywgMCwgbG9jYXRpb25TdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobG9jYXRpb25TdGFydFN0YWNrLCAwLCBsb2NhdGlvblN0YXJ0U3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBTdGFjaywgMCwgdGVtcFN0YWNrID0gbmV3IGludFtzdGFja0xlbmd0aF0sIDAsIG9sZF9zdGFja19sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2U3RhY2ssIDAsIHByZXZTdGFjayA9IG5ldyBpbnRbc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobmV4dFN0YWNrLCAwLCBuZXh0U3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNjb3BlSW5kZXgsIDAsIHNjb3BlSW5kZXggPSBuZXcgaW50W3N0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNjb3BlUG9zaXRpb24sIDAsIHNjb3BlUG9zaXRpb24gPSBuZXcgaW50W3N0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc3RhY2ssIDAsIHRoaXMuc3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhdGlvblN0YWNrLCAwLCB0aGlzLmxvY2F0aW9uU3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhdGlvblN0YXJ0U3RhY2ssIDAsIHRoaXMubG9jYXRpb25TdGFydFN0YWNrID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudGVtcFN0YWNrLCAwLCB0aGlzLnRlbXBTdGFjayA9IG5ldyBpbnRbdGhpcy5zdGFja0xlbmd0aF0sIDAsIG9sZF9zdGFja19sZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnByZXZTdGFjaywgMCwgdGhpcy5wcmV2U3RhY2sgPSBuZXcgaW50W3RoaXMuc3RhY2tMZW5ndGhdLCAwLCBvbGRfc3RhY2tfbGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5uZXh0U3RhY2ssIDAsIHRoaXMubmV4dFN0YWNrID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2NvcGVJbmRleCwgMCwgdGhpcy5zY29wZUluZGV4ID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2NvcGVQb3NpdGlvbiwgMCwgdGhpcy5zY29wZVBvc2l0aW9uID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXSwgMCwgb2xkX3N0YWNrX2xlbmd0aCk7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTE5NCwzMCArMTk0LDMwIEBACiAJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZWNvcmQgPSByZWNvcmQ7CiAJCX0KIAkJdHJ5IHsKLQkJCWxleFN0cmVhbS5yZXNldCgpOwotCQotCQkJY3VycmVudFRva2VuID0gbGV4U3RyZWFtLmdldFRva2VuKCk7Ci0JCisJCQl0aGlzLmxleFN0cmVhbS5yZXNldCgpOworCisJCQl0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMubGV4U3RyZWFtLmdldFRva2VuKCk7CisKIAkJCWludCBwcmV2X3BvczsKIAkJCWludCBwb3M7CiAJCQlpbnQgbmV4dF9wb3M7CiAJCQlpbnQgYWN0ID0gU1RBUlRfU1RBVEU7Ci0JCisKIAkJCXJlYWxsb2NhdGVTdGFja3MoKTsKLQkKKwogCQkJLy8KIAkJCS8vIFN0YXJ0IHBhcnNpbmcKIAkJCS8vCi0JCQlzdGF0ZVN0YWNrVG9wID0gMDsKLQkJCXN0YWNrW3N0YXRlU3RhY2tUb3BdID0gYWN0OwotCQotCQkJaW50IHRvayA9IGxleFN0cmVhbS5raW5kKGN1cnJlbnRUb2tlbik7Ci0JCQlsb2NhdGlvblN0YWNrW3N0YXRlU3RhY2tUb3BdID0gY3VycmVudFRva2VuOwotCQkJbG9jYXRpb25TdGFydFN0YWNrW3N0YXRlU3RhY2tUb3BdID0gbGV4U3RyZWFtLnN0YXJ0KGN1cnJlbnRUb2tlbik7Ci0JCQkKKwkJCXRoaXMuc3RhdGVTdGFja1RvcCA9IDA7CisJCQl0aGlzLnN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSBhY3Q7CisKKwkJCWludCB0b2sgPSB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuY3VycmVudFRva2VuKTsKKwkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5jdXJyZW50VG9rZW47CisJCQl0aGlzLmxvY2F0aW9uU3RhcnRTdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5sZXhTdHJlYW0uc3RhcnQodGhpcy5jdXJyZW50VG9rZW4pOworCiAJCQlib29sZWFuIGZvcmNlUmVjb3ZlcnlBZnRlckxCcmFja2V0TWlzc2luZyA9IGZhbHNlOwogCS8vCQlpbnQgZm9yY2VSZWNvdmVyeVRva2VuID0gLTE7Ci0JCisKIAkJCS8vCiAJCQkvLyBQcm9jZXNzIGEgdGVybWluYWwKIAkJCS8vCkBAIC0yMjYsMTYgKzIyNiwxNiBAQAogCQkJCS8vIFN5bmNocm9uaXplIHN0YXRlIHN0YWNrcyBhbmQgdXBkYXRlIHRoZSBsb2NhdGlvbiBzdGFjawogCQkJCS8vCiAJCQkJcHJldl9wb3MgPSAtMTsKLQkJCQlwcmV2U3RhY2tUb3AgPSAtMTsKLQkKKwkJCQl0aGlzLnByZXZTdGFja1RvcCA9IC0xOworCiAJCQkJbmV4dF9wb3MgPSAtMTsKLQkJCQluZXh0U3RhY2tUb3AgPSAtMTsKLQkKLQkJCQlwb3MgPSBzdGF0ZVN0YWNrVG9wOwotCQkJCXRlbXBTdGFja1RvcCA9IHN0YXRlU3RhY2tUb3AgLSAxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHN0YXRlU3RhY2tUb3A7IGkrKykKLQkJCQkJdGVtcFN0YWNrW2ldID0gc3RhY2tbaV07Ci0JCisJCQkJdGhpcy5uZXh0U3RhY2tUb3AgPSAtMTsKKworCQkJCXBvcyA9IHRoaXMuc3RhdGVTdGFja1RvcDsKKwkJCQl0aGlzLnRlbXBTdGFja1RvcCA9IHRoaXMuc3RhdGVTdGFja1RvcCAtIDE7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5zdGF0ZVN0YWNrVG9wOyBpKyspCisJCQkJCXRoaXMudGVtcFN0YWNrW2ldID0gdGhpcy5zdGFja1tpXTsKKwogCQkJCWFjdCA9IFBhcnNlci50QWN0aW9uKGFjdCwgdG9rKTsKIAkJCQkvLwogCQkJCS8vIFdoZW4gYSByZWR1Y2UgYWN0aW9uIGlzIGVuY291bnRlcmVkLCB3ZSBjb21wdXRlIGFsbCBSRURVQ0UKQEAgLTI0NSwyMSArMjQ1LDIxIEBACiAJCQkJLy8KIAkJCQl3aGlsZSAoYWN0IDw9IE5VTV9SVUxFUykgewogCQkJCQlkbyB7Ci0JCQkJCQl0ZW1wU3RhY2tUb3AgLT0gKFBhcnNlci5yaHNbYWN0XS0xKTsKLQkJCQkJCWFjdCA9IFBhcnNlci5udEFjdGlvbih0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXSwgUGFyc2VyLmxoc1thY3RdKTsKKwkJCQkJCXRoaXMudGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CisJCQkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24odGhpcy50ZW1wU3RhY2tbdGhpcy50ZW1wU3RhY2tUb3BdLCBQYXJzZXIubGhzW2FjdF0pOwogCQkJCQl9IHdoaWxlKGFjdCA8PSBOVU1fUlVMRVMpOwogCQkJCQkvLwogCQkJCQkvLyAuLi4gVXBkYXRlIHRoZSBtYXhpbXVtIHVzZWZ1bCBwb3NpdGlvbiBvZiB0aGUKIAkJCQkJLy8gKFNUQVRFXylTVEFDSywgcHVzaCBnb3RvIHN0YXRlIGludG8gc3RhY2ssIGFuZAogCQkJCQkvLyBjb21wdXRlIG5leHQgYWN0aW9uIG9uIGN1cnJlbnQgc3ltYm9sIC4uLgogCQkJCQkvLwotCQkJCQlpZiAodGVtcFN0YWNrVG9wICsgMSA+PSBzdGFja0xlbmd0aCkKKwkJCQkJaWYgKHRoaXMudGVtcFN0YWNrVG9wICsgMSA+PSB0aGlzLnN0YWNrTGVuZ3RoKQogCQkJCQkJcmVhbGxvY2F0ZVN0YWNrcygpOwotCQkJCQlwb3MgPSBwb3MgPCB0ZW1wU3RhY2tUb3AgPyBwb3MgOiB0ZW1wU3RhY2tUb3A7Ci0JCQkJCXRlbXBTdGFja1t0ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKKwkJCQkJcG9zID0gcG9zIDwgdGhpcy50ZW1wU3RhY2tUb3AgPyBwb3MgOiB0aGlzLnRlbXBTdGFja1RvcDsKKwkJCQkJdGhpcy50ZW1wU3RhY2tbdGhpcy50ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKIAkJCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCQkJCX0KLQkKKwogCQkJCS8vCiAJCQkJLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIHNoaWZ0LCBzaGlmdC1yZWR1Y2UsIGFjY2VwdCBvciBlcnJvcgogCQkJCS8vIGFjdGlvbi4gIFNUQUNLIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzdGF0ZSBzdGFjawpAQCAtMjcwLDE1ICsyNzAsMTUgQEAKIAkJCQkvLyByZWR1Y3Rpb25zIGFyZSBleGVjdXRlZC4KIAkJCQkvLwogCQkJCXdoaWxlKGFjdCA+IEVSUk9SX0FDVElPTiB8fCBhY3QgPCBBQ0NFUFRfQUNUSU9OKSB7IC8vIFNISUZULVJFRFVDRSBhY3Rpb24gb3IgU0hJRlQgYWN0aW9uID8KLQkJCQkJbmV4dFN0YWNrVG9wID0gdGVtcFN0YWNrVG9wICsgMTsKLQkJCQkJZm9yIChpbnQgaSA9IG5leHRfcG9zICsgMTsgaSA8PSBuZXh0U3RhY2tUb3A7IGkrKykKLQkJCQkJCW5leHRTdGFja1tpXSA9IHRlbXBTdGFja1tpXTsKLQkKLQkJCQkJZm9yIChpbnQgaSA9IHBvcyArIDE7IGkgPD0gbmV4dFN0YWNrVG9wOyBpKyspIHsKLQkJCQkJCWxvY2F0aW9uU3RhY2tbaV0gPSBsb2NhdGlvblN0YWNrW3N0YXRlU3RhY2tUb3BdOwotCQkJCQkJbG9jYXRpb25TdGFydFN0YWNrW2ldID0gbG9jYXRpb25TdGFydFN0YWNrW3N0YXRlU3RhY2tUb3BdOworCQkJCQl0aGlzLm5leHRTdGFja1RvcCA9IHRoaXMudGVtcFN0YWNrVG9wICsgMTsKKwkJCQkJZm9yIChpbnQgaSA9IG5leHRfcG9zICsgMTsgaSA8PSB0aGlzLm5leHRTdGFja1RvcDsgaSsrKQorCQkJCQkJdGhpcy5uZXh0U3RhY2tbaV0gPSB0aGlzLnRlbXBTdGFja1tpXTsKKworCQkJCQlmb3IgKGludCBpID0gcG9zICsgMTsgaSA8PSB0aGlzLm5leHRTdGFja1RvcDsgaSsrKSB7CisJCQkJCQl0aGlzLmxvY2F0aW9uU3RhY2tbaV0gPSB0aGlzLmxvY2F0aW9uU3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXTsKKwkJCQkJCXRoaXMubG9jYXRpb25TdGFydFN0YWNrW2ldID0gdGhpcy5sb2NhdGlvblN0YXJ0U3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXTsKIAkJCQkJfQotCQorCiAJCQkJCS8vCiAJCQkJCS8vIElmIHdlIGhhdmUgYSBzaGlmdC1yZWR1Y2UsIHByb2Nlc3MgaXQgYXMgd2VsbCBhcwogCQkJCQkvLyB0aGUgZ290by1yZWR1Y2UgYWN0aW9ucyB0aGF0IGZvbGxvdyBpdC4KQEAgLTI4NiwyNSArMjg2LDI1IEBACiAJCQkJCWlmIChhY3QgPiBFUlJPUl9BQ1RJT04pIHsKIAkJCQkJCWFjdCAtPSBFUlJPUl9BQ1RJT047CiAJCQkJCQlkbyB7Ci0JCQkJCQkJbmV4dFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7Ci0JCQkJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKG5leHRTdGFja1tuZXh0U3RhY2tUb3BdLCBQYXJzZXIubGhzW2FjdF0pOworCQkJCQkJCXRoaXMubmV4dFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CisJCQkJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKHRoaXMubmV4dFN0YWNrW3RoaXMubmV4dFN0YWNrVG9wXSwgUGFyc2VyLmxoc1thY3RdKTsKIAkJCQkJCX0gd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7Ci0JCQkJCQlwb3MgPSBwb3MgPCBuZXh0U3RhY2tUb3AgPyBwb3MgOiBuZXh0U3RhY2tUb3A7CisJCQkJCQlwb3MgPSBwb3MgPCB0aGlzLm5leHRTdGFja1RvcCA/IHBvcyA6IHRoaXMubmV4dFN0YWNrVG9wOwogCQkJCQl9Ci0JCi0JCQkJCWlmIChuZXh0U3RhY2tUb3AgKyAxID49IHN0YWNrTGVuZ3RoKQorCisJCQkJCWlmICh0aGlzLm5leHRTdGFja1RvcCArIDEgPj0gdGhpcy5zdGFja0xlbmd0aCkKIAkJCQkJCXJlYWxsb2NhdGVTdGFja3MoKTsKLQkKLQkJCQkJdGVtcFN0YWNrVG9wID0gbmV4dFN0YWNrVG9wOwotCQkJCQluZXh0U3RhY2tbKytuZXh0U3RhY2tUb3BdID0gYWN0OwotCQkJCQluZXh0X3BvcyA9IG5leHRTdGFja1RvcDsKLQkKKworCQkJCQl0aGlzLnRlbXBTdGFja1RvcCA9IHRoaXMubmV4dFN0YWNrVG9wOworCQkJCQl0aGlzLm5leHRTdGFja1srK3RoaXMubmV4dFN0YWNrVG9wXSA9IGFjdDsKKwkJCQkJbmV4dF9wb3MgPSB0aGlzLm5leHRTdGFja1RvcDsKKwogCQkJCQkvLwogCQkJCQkvLyBTaW11bGF0ZSB0aGUgcGFyc2VyIHRocm91Z2ggdGhlIG5leHQgdG9rZW4gd2l0aG91dAogCQkJCQkvLyBkZXN0cm95aW5nIFNUQUNLIG9yIG5leHRfc3RhY2suCiAJCQkJCS8vCi0JCQkJCWN1cnJlbnRUb2tlbiA9IGxleFN0cmVhbS5nZXRUb2tlbigpOwotCQkJCQl0b2sgPSBsZXhTdHJlYW0ua2luZChjdXJyZW50VG9rZW4pOworCQkJCQl0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMubGV4U3RyZWFtLmdldFRva2VuKCk7CisJCQkJCXRvayA9IHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5jdXJyZW50VG9rZW4pOwogCQkJCQlhY3QgPSBQYXJzZXIudEFjdGlvbihhY3QsIHRvayk7CiAJCQkJCXdoaWxlKGFjdCA8PSBOVU1fUlVMRVMpIHsKIAkJCQkJCS8vCkBAIC0zMTYsMjYgKzMxNiwyNiBAQAogCQkJCQkJCWlmKERFQlVHKSB7CiAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQYXJzZXIubmFtZVtQYXJzZXIubm9uX3Rlcm1pbmFsX2luZGV4W2xoc19zeW1ib2xdXSk7CiAJCQkJCQkJfQotCQkJCQkJCXRlbXBTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOwotCQkJCQkJCWFjdCA9ICh0ZW1wU3RhY2tUb3AgPiBuZXh0X3BvcwotCQkJCQkJCQkJICAgPyB0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXQotCQkJCQkJCQkJICAgOiBuZXh0U3RhY2tbdGVtcFN0YWNrVG9wXSk7CisJCQkJCQkJdGhpcy50ZW1wU3RhY2tUb3AgLT0gKFBhcnNlci5yaHNbYWN0XS0xKTsKKwkJCQkJCQlhY3QgPSAodGhpcy50ZW1wU3RhY2tUb3AgPiBuZXh0X3BvcworCQkJCQkJCQkJICAgPyB0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcF0KKwkJCQkJCQkJCSAgIDogdGhpcy5uZXh0U3RhY2tbdGhpcy50ZW1wU3RhY2tUb3BdKTsKIAkJCQkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24oYWN0LCBsaHNfc3ltYm9sKTsKIAkJCQkJCX0gICB3aGlsZShhY3QgPD0gTlVNX1JVTEVTKTsKLQkKKwogCQkJCQkJLy8KIAkJCQkJCS8vIC4uLiBVcGRhdGUgdGhlIG1heGltdW0gdXNlZnVsIHBvc2l0aW9uIG9mIHRoZQogCQkJCQkJLy8gKFNUQVRFXylTVEFDSywgcHVzaCBHT1RPIHN0YXRlIGludG8gc3RhY2ssIGFuZAogCQkJCQkJLy8gY29tcHV0ZSBuZXh0IGFjdGlvbiBvbiBjdXJyZW50IHN5bWJvbCAuLi4KIAkJCQkJCS8vCi0JCQkJCQlpZiAodGVtcFN0YWNrVG9wICsgMSA+PSBzdGFja0xlbmd0aCkKKwkJCQkJCWlmICh0aGlzLnRlbXBTdGFja1RvcCArIDEgPj0gdGhpcy5zdGFja0xlbmd0aCkKIAkJCQkJCQlyZWFsbG9jYXRlU3RhY2tzKCk7Ci0JCi0JCQkJCQluZXh0X3BvcyA9IG5leHRfcG9zIDwgdGVtcFN0YWNrVG9wID8gbmV4dF9wb3MgOiB0ZW1wU3RhY2tUb3A7Ci0JCQkJCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CisKKwkJCQkJCW5leHRfcG9zID0gbmV4dF9wb3MgPCB0aGlzLnRlbXBTdGFja1RvcCA/IG5leHRfcG9zIDogdGhpcy50ZW1wU3RhY2tUb3A7CisJCQkJCQl0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcCArIDFdID0gYWN0OwogCQkJCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCQkJCQl9Ci0JCisKIAkvLwkJCQlpZigodG9rICE9IFRva2VuTmFtZVJCUkFDRSB8fCAoZm9yY2VSZWNvdmVyeVRva2VuICE9IGN1cnJlbnRUb2tlbiAmJiAobGV4U3RyZWFtLmZsYWdzKGN1cnJlbnRUb2tlbikgJiBMZXhTdHJlYW0uTEJSQUNFX01JU1NJTkcpICE9IDApKQogCS8vCQkJCQkmJiAobGV4U3RyZWFtLmZsYWdzKGN1cnJlbnRUb2tlbikgJiBMZXhTdHJlYW0uSVNfQUZURVJfSlVNUCkgIT0wKSB7CiAJLy8JCQkJCWFjdCA9IEVSUk9SX0FDVElPTjsKQEAgLTM0NSwyNyArMzQ1LDI3IEBACiAJLy8JCQkJCQlmb3JjZVJlY292ZXJ5VG9rZW4gPSBjdXJyZW50VG9rZW47CiAJLy8JCQkJCX0KIAkvLwkJCQl9Ci0JCQkJCQorCiAJCQkJCS8vCiAJCQkJCS8vIE5vIGVycm9yIHdhcyBkZXRlY3RlZCwgUmVhZCBuZXh0IHRva2VuIGludG8KIAkJCQkJLy8gUFJFVlRPSyBlbGVtZW50LCBhZHZhbmNlIENVUlRPSyBwb2ludGVyIGFuZAogCQkJCQkvLyB1cGRhdGUgc3RhY2tzLgogCQkJCQkvLwogCQkJCQlpZiAoYWN0ICE9IEVSUk9SX0FDVElPTikgewotCQkJCQkJcHJldlN0YWNrVG9wID0gc3RhdGVTdGFja1RvcDsKLQkJCQkJCWZvciAoaW50IGkgPSBwcmV2X3BvcyArIDE7IGkgPD0gcHJldlN0YWNrVG9wOyBpKyspCi0JCQkJCQkJcHJldlN0YWNrW2ldID0gc3RhY2tbaV07CisJCQkJCQl0aGlzLnByZXZTdGFja1RvcCA9IHRoaXMuc3RhdGVTdGFja1RvcDsKKwkJCQkJCWZvciAoaW50IGkgPSBwcmV2X3BvcyArIDE7IGkgPD0gdGhpcy5wcmV2U3RhY2tUb3A7IGkrKykKKwkJCQkJCQl0aGlzLnByZXZTdGFja1tpXSA9IHRoaXMuc3RhY2tbaV07CiAJCQkJCQlwcmV2X3BvcyA9IHBvczsKLQkKLQkJCQkJCXN0YXRlU3RhY2tUb3AgPSBuZXh0U3RhY2tUb3A7Ci0JCQkJCQlmb3IgKGludCBpID0gcG9zICsgMTsgaSA8PSBzdGF0ZVN0YWNrVG9wOyBpKyspCi0JCQkJCQkJc3RhY2tbaV0gPSBuZXh0U3RhY2tbaV07Ci0JCQkJCQlsb2NhdGlvblN0YWNrW3N0YXRlU3RhY2tUb3BdID0gY3VycmVudFRva2VuOwotCQkJCQkJbG9jYXRpb25TdGFydFN0YWNrW3N0YXRlU3RhY2tUb3BdID0gbGV4U3RyZWFtLnN0YXJ0KGN1cnJlbnRUb2tlbik7CisKKwkJCQkJCXRoaXMuc3RhdGVTdGFja1RvcCA9IHRoaXMubmV4dFN0YWNrVG9wOworCQkJCQkJZm9yIChpbnQgaSA9IHBvcyArIDE7IGkgPD0gdGhpcy5zdGF0ZVN0YWNrVG9wOyBpKyspCisJCQkJCQkJdGhpcy5zdGFja1tpXSA9IHRoaXMubmV4dFN0YWNrW2ldOworCQkJCQkJdGhpcy5sb2NhdGlvblN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSB0aGlzLmN1cnJlbnRUb2tlbjsKKwkJCQkJCXRoaXMubG9jYXRpb25TdGFydFN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSB0aGlzLmxleFN0cmVhbS5zdGFydCh0aGlzLmN1cnJlbnRUb2tlbik7CiAJCQkJCQlwb3MgPSBuZXh0X3BvczsKIAkJCQkJfQogCQkJCX0KLQkKKwogCQkJCS8vCiAJCQkJLy8gQXQgdGhpcyBzdGFnZSwgZWl0aGVyIHdlIGhhdmUgYW4gQUNDRVBUIG9yIGFuIEVSUk9SCiAJCQkJLy8gYWN0aW9uLgpAQCAtMzc0LDIxICszNzQsMjEgQEAKIAkJCQkJLy8KIAkJCQkJLy8gQW4gZXJyb3Igd2FzIGRldGVjdGVkLgogCQkJCQkvLwotCQkJCQlSZXBhaXJDYW5kaWRhdGUgY2FuZGlkYXRlID0gZXJyb3JSZWNvdmVyeShjdXJyZW50VG9rZW4sIGZvcmNlUmVjb3ZlcnlBZnRlckxCcmFja2V0TWlzc2luZyk7Ci0JCQkJCQorCQkJCQlSZXBhaXJDYW5kaWRhdGUgY2FuZGlkYXRlID0gZXJyb3JSZWNvdmVyeSh0aGlzLmN1cnJlbnRUb2tlbiwgZm9yY2VSZWNvdmVyeUFmdGVyTEJyYWNrZXRNaXNzaW5nKTsKKwogCQkJCQlmb3JjZVJlY292ZXJ5QWZ0ZXJMQnJhY2tldE1pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCi0JCQkJCWlmKHBhcnNlci5yZXBvcnRPbmx5T25lU3ludGF4RXJyb3IpIHsKKworCQkJCQlpZih0aGlzLnBhcnNlci5yZXBvcnRPbmx5T25lU3ludGF4RXJyb3IpIHsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQotCQkJCQkKLQkJCQkJaWYodGhpcy5wYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQgPCB0aGlzLnBhcnNlci5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50KSB7CQkJCQkJCisKKwkJCQkJaWYodGhpcy5wYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQgPCB0aGlzLnBhcnNlci5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50KSB7CiAJCQkJCQlpZih0aGlzLnJlY292ZXJ5U2Nhbm5lciA9PSBudWxsIHx8ICF0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZWNvcmQpIHJldHVybjsKIAkJCQkJCXRoaXMucmVwb3J0UHJvYmxlbSA9IGZhbHNlOwogCQkJCQl9Ci0JCi0JCQkJCWFjdCA9IHN0YWNrW3N0YXRlU3RhY2tUb3BdOwotCQorCisJCQkJCWFjdCA9IHRoaXMuc3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXTsKKwogCQkJCQkvLwogCQkJCQkvLyBJZiB0aGUgcmVjb3Zlcnkgd2FzIHN1Y2Nlc3NmdWwgb24gYSBub250ZXJtaW5hbCBjYW5kaWRhdGUsCiAJCQkJCS8vIHBhcnNlIHRocm91Z2ggdGhhdCBjYW5kaWRhdGUgYW5kICJyZWFkIiB0aGUgbmV4dCB0b2tlbi4KQEAgLTQwMiwxOCArNDAyLDE4IEBACiAJCQkJCQl9CiAJCQkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24oYWN0LCBsaHNfc3ltYm9sKTsKIAkJCQkJCXdoaWxlKGFjdCA8PSBOVU1fUlVMRVMpIHsKLQkJCQkJCQlzdGF0ZVN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7Ci0JCQkJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKHN0YWNrW3N0YXRlU3RhY2tUb3BdLCBQYXJzZXIubGhzW2FjdF0pOworCQkJCQkJCXRoaXMuc3RhdGVTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOworCQkJCQkJCWFjdCA9IFBhcnNlci5udEFjdGlvbih0aGlzLnN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0sIFBhcnNlci5saHNbYWN0XSk7CiAJCQkJCQl9Ci0JCQkJCQlzdGFja1srK3N0YXRlU3RhY2tUb3BdID0gYWN0OwotCQkJCQkJY3VycmVudFRva2VuID0gbGV4U3RyZWFtLmdldFRva2VuKCk7Ci0JCQkJCQl0b2sgPSBsZXhTdHJlYW0ua2luZChjdXJyZW50VG9rZW4pOwotCQkJCQkJbG9jYXRpb25TdGFja1tzdGF0ZVN0YWNrVG9wXSA9IGN1cnJlbnRUb2tlbjsKLQkJCQkJCWxvY2F0aW9uU3RhcnRTdGFja1tzdGF0ZVN0YWNrVG9wXSA9IGxleFN0cmVhbS5zdGFydChjdXJyZW50VG9rZW4pOworCQkJCQkJdGhpcy5zdGFja1srK3RoaXMuc3RhdGVTdGFja1RvcF0gPSBhY3Q7CisJCQkJCQl0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMubGV4U3RyZWFtLmdldFRva2VuKCk7CisJCQkJCQl0b2sgPSB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuY3VycmVudFRva2VuKTsKKwkJCQkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5jdXJyZW50VG9rZW47CisJCQkJCQl0aGlzLmxvY2F0aW9uU3RhcnRTdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5sZXhTdHJlYW0uc3RhcnQodGhpcy5jdXJyZW50VG9rZW4pOwogCQkJCQl9IGVsc2UgewogCQkJCQkJdG9rID0gY2FuZGlkYXRlLnN5bWJvbDsKLQkJCQkJCWxvY2F0aW9uU3RhY2tbc3RhdGVTdGFja1RvcF0gPSBjYW5kaWRhdGUubG9jYXRpb247Ci0JCQkJCQlsb2NhdGlvblN0YXJ0U3RhY2tbc3RhdGVTdGFja1RvcF0gPSBsZXhTdHJlYW0uc3RhcnQoY2FuZGlkYXRlLmxvY2F0aW9uKTsKKwkJCQkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gY2FuZGlkYXRlLmxvY2F0aW9uOworCQkJCQkJdGhpcy5sb2NhdGlvblN0YXJ0U3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXSA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KGNhbmRpZGF0ZS5sb2NhdGlvbik7CiAJCQkJCX0KIAkJCQl9CiAJCQl9IHdoaWxlIChhY3QgIT0gQUNDRVBUX0FDVElPTik7CkBAIC00MjUsNiArNDI1LDQ5IEBACiAJCXJldHVybjsKIAl9CiAKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gZGlzcGxheUVzY2FwZUNoYXJhY3RlcnMoY2hhcltdIHRva2VuU291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJU3RyaW5nQnVmZmVyIHRva2VuU291cmNlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyBpKyspIHsKKwkJCXRva2VuU291cmNlQnVmZmVyLmFwcGVuZCh0b2tlblNvdXJjZVtpXSk7CisJCX0KKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKwkJCWNoYXIgYyA9IHRva2VuU291cmNlW2ldOworCisJCQlzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICAgICAgICAgICB0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQoIlxcciIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJyA6CisgICAgICAgICAgICAgICAgICAgIHRva2VuU291cmNlQnVmZmVyLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXGInIDoKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5Tb3VyY2VCdWZmZXIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcdCcgOgorICAgICAgICAgICAgICAgICAgICB0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXGYnIDoKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5Tb3VyY2VCdWZmZXIuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcIicgOgorICAgICAgICAgICAgICAgICAgICB0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQoIlxcXCIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcJycgOgorICAgICAgICAgICAgICAgICAgICB0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQoIlxcJyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1xcJyA6CisgICAgICAgICAgICAgICAgICAgIHRva2VuU291cmNlQnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICB0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisJCX0KKwkJZm9yIChpbnQgaSA9IGVuZDsgaSA8IHRva2VuU291cmNlLmxlbmd0aDsgaSsrKSB7CisJCQl0b2tlblNvdXJjZUJ1ZmZlci5hcHBlbmQodG9rZW5Tb3VyY2VbaV0pOworCQl9CisJCXJldHVybiB0b2tlblNvdXJjZUJ1ZmZlci50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CisJfQorCiAJLy8KIC8vCQlUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLiAgSXQKIC8vCSAgIHRyaWVzIHRvIGRpYWdub3NlIHRoZSBlcnJvciBhbmQgcmVjb3ZlciBmcm9tIGl0LiAgSWYgaXQgaXMKQEAgLTQ0MywyOCArNDg2LDI4IEBACiAvLwogCXByaXZhdGUgUmVwYWlyQ2FuZGlkYXRlIGVycm9yUmVjb3ZlcnkoaW50IGVycm9yX3Rva2VuLCBib29sZWFuIGZvcmNlZEVycm9yKSB7CiAJCXRoaXMuZXJyb3JUb2tlbiA9IGVycm9yX3Rva2VuOwotCQl0aGlzLmVycm9yVG9rZW5TdGFydCA9IGxleFN0cmVhbS5zdGFydChlcnJvcl90b2tlbik7Ci0JCQotCQlpbnQgcHJldnRvayA9IGxleFN0cmVhbS5wcmV2aW91cyhlcnJvcl90b2tlbik7Ci0JCWludCBwcmV2dG9rS2luZCA9IGxleFN0cmVhbS5raW5kKHByZXZ0b2spOwotCQkKKwkJdGhpcy5lcnJvclRva2VuU3RhcnQgPSB0aGlzLmxleFN0cmVhbS5zdGFydChlcnJvcl90b2tlbik7CisKKwkJaW50IHByZXZ0b2sgPSB0aGlzLmxleFN0cmVhbS5wcmV2aW91cyhlcnJvcl90b2tlbik7CisJCWludCBwcmV2dG9rS2luZCA9IHRoaXMubGV4U3RyZWFtLmtpbmQocHJldnRvayk7CisKIAkJaWYoZm9yY2VkRXJyb3IpIHsKIAkJCWludCBuYW1lX2luZGV4ID0gUGFyc2VyLnRlcm1pbmFsX2luZGV4W1Rva2VuTmFtZUxCUkFDRV07CiAKIAkJCXJlcG9ydEVycm9yKElOU0VSVElPTl9DT0RFLCBuYW1lX2luZGV4LCBwcmV2dG9rLCBwcmV2dG9rKTsKLQkJCQorCiAJCQlSZXBhaXJDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IFJlcGFpckNhbmRpZGF0ZSgpOwogCQkJY2FuZGlkYXRlLnN5bWJvbCA9IFRva2VuTmFtZUxCUkFDRTsKIAkJCWNhbmRpZGF0ZS5sb2NhdGlvbiA9IGVycm9yX3Rva2VuOwotCQkJbGV4U3RyZWFtLnJlc2V0KGVycm9yX3Rva2VuKTsKLQkJCQotCQkJc3RhdGVTdGFja1RvcCA9IG5leHRTdGFja1RvcDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDw9IHN0YXRlU3RhY2tUb3A7IGorKykgewotCQkJCXN0YWNrW2pdID0gbmV4dFN0YWNrW2pdOworCQkJdGhpcy5sZXhTdHJlYW0ucmVzZXQoZXJyb3JfdG9rZW4pOworCisJCQl0aGlzLnN0YXRlU3RhY2tUb3AgPSB0aGlzLm5leHRTdGFja1RvcDsKKwkJCWZvciAoaW50IGogPSAwOyBqIDw9IHRoaXMuc3RhdGVTdGFja1RvcDsgaisrKSB7CisJCQkJdGhpcy5zdGFja1tqXSA9IHRoaXMubmV4dFN0YWNrW2pdOwogCQkJfQotCQkJbG9jYXRpb25TdGFja1tzdGF0ZVN0YWNrVG9wXSA9IGVycm9yX3Rva2VuOwotCQkJbG9jYXRpb25TdGFydFN0YWNrW3N0YXRlU3RhY2tUb3BdID0gbGV4U3RyZWFtLnN0YXJ0KGVycm9yX3Rva2VuKTsKLQkJCQorCQkJdGhpcy5sb2NhdGlvblN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSBlcnJvcl90b2tlbjsKKwkJCXRoaXMubG9jYXRpb25TdGFydFN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0gPSB0aGlzLmxleFN0cmVhbS5zdGFydChlcnJvcl90b2tlbik7CisKIAkJCXJldHVybiBjYW5kaWRhdGU7CiAJCX0KIApAQCAtNDgzLDcgKzUyNiw3IEBACiAJCQlyZXR1cm4gY2FuZGlkYXRlOwogCQl9CiAKLQkJaWYgKGxleFN0cmVhbS5raW5kKGVycm9yX3Rva2VuKSA9PSBFT0ZUX1NZTUJPTCkgeworCQlpZiAodGhpcy5sZXhTdHJlYW0ua2luZChlcnJvcl90b2tlbikgPT0gRU9GVF9TWU1CT0wpIHsKIAkJCXJlcG9ydEVycm9yKEVPRl9DT0RFLAogCQkJCQkJUGFyc2VyLnRlcm1pbmFsX2luZGV4W0VPRlRfU1lNQk9MXSwKIAkJCQkJCXByZXZ0b2ssCkBAIC01MDAsOCArNTQzLDggQEAKIAkJLy8gYSBzdWNjZXNzZnVsIHJlY292ZXJ5IG9yIGhhdmUgY29uc3VtZWQgdGhlIHJlbWFpbmluZyBpbnB1dAogCQkvLyB0b2tlbnMuCiAJCS8vCi0JCXdoaWxlKGxleFN0cmVhbS5raW5kKGJ1ZmZlcltCVUZGX1VCT1VORF0pICE9IEVPRlRfU1lNQk9MKSB7Ci0JCQljYW5kaWRhdGUgPSBzZWNvbmRhcnlQaGFzZShidWZmZXJbTUFYX0RJU1RBTkNFIC0gTUlOX0RJU1RBTkNFICsgMl0pOworCQl3aGlsZSh0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuYnVmZmVyW0JVRkZfVUJPVU5EXSkgIT0gRU9GVF9TWU1CT0wpIHsKKwkJCWNhbmRpZGF0ZSA9IHNlY29uZGFyeVBoYXNlKHRoaXMuYnVmZmVyW01BWF9ESVNUQU5DRSAtIE1JTl9ESVNUQU5DRSArIDJdKTsKIAkJCWlmIChjYW5kaWRhdGUuc3ltYm9sICE9IDApIHsKIAkJCQlyZXR1cm4gY2FuZGlkYXRlOwogCQkJfQpAQCAtNTEyLDE1ICs1NTUsMTUgQEAKIAkJLy8gcmVtYWluaW5nIHRva2VucyBpbiB0aGUgaW5wdXQuCiAJCS8vCiAJCWludCBpOwotCQlmb3IgKGkgPSBCVUZGX1VCT1VORDsgbGV4U3RyZWFtLmtpbmQoYnVmZmVyW2ldKSA9PSBFT0ZUX1NZTUJPTDsgaS0tKXsvKmVtcHR5Ki99CisJCWZvciAoaSA9IEJVRkZfVUJPVU5EOyB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuYnVmZmVyW2ldKSA9PSBFT0ZUX1NZTUJPTDsgaS0tKXsvKmVtcHR5Ki99CiAKIAkJcmVwb3J0RXJyb3IoREVMRVRJT05fQ09ERSwKIAkJCQkJUGFyc2VyLnRlcm1pbmFsX2luZGV4W3ByZXZ0b2tLaW5kXSwvL1BhcnNlci50ZXJtaW5hbF9pbmRleFtsZXhTdHJlYW0ua2luZChwcmV2dG9rKV0sCiAJCQkJCWVycm9yX3Rva2VuLAotCQkJCQlidWZmZXJbaV0pOworCQkJCQl0aGlzLmJ1ZmZlcltpXSk7CiAKIAkJY2FuZGlkYXRlLnN5bWJvbCA9IDA7Ci0JCWNhbmRpZGF0ZS5sb2NhdGlvbiA9IGJ1ZmZlcltpXTsKKwkJY2FuZGlkYXRlLmxvY2F0aW9uID0gdGhpcy5idWZmZXJbaV07CiAKIAkJcmV0dXJuIGNhbmRpZGF0ZTsKIAl9CkBAIC01MzksMTQgKzU4MiwxNCBAQAogCQkvLwogCQkvLyBJbml0aWFsaXplIHRoZSBidWZmZXIuCiAJCS8vCi0JCWludCBpID0gKG5leHRTdGFja1RvcCA+PSAwID8gMyA6IDIpOwotCQlidWZmZXJbaV0gPSBlcnJvcl90b2tlbjsKKwkJaW50IGkgPSAodGhpcy5uZXh0U3RhY2tUb3AgPj0gMCA/IDMgOiAyKTsKKwkJdGhpcy5idWZmZXJbaV0gPSBlcnJvcl90b2tlbjsKIAogCQlmb3IgKGludCBqID0gaTsgaiA+IDA7IGotLSkKLQkJCWJ1ZmZlcltqIC0gMV0gPSBsZXhTdHJlYW0ucHJldmlvdXMoYnVmZmVyW2pdKTsKKwkJCXRoaXMuYnVmZmVyW2ogLSAxXSA9IHRoaXMubGV4U3RyZWFtLnByZXZpb3VzKHRoaXMuYnVmZmVyW2pdKTsKIAogCQlmb3IgKGludCBrID0gaSArIDE7IGsgPCBCVUZGX1NJWkU7IGsrKykKLQkJCWJ1ZmZlcltrXSA9IGxleFN0cmVhbS5uZXh0KGJ1ZmZlcltrIC0gMV0pOworCQkJdGhpcy5idWZmZXJba10gPSB0aGlzLmxleFN0cmVhbS5uZXh0KHRoaXMuYnVmZmVyW2sgLSAxXSk7CiAKIAkJLy8KIAkJLy8gSWYgTkVYVF9TVEFDS19UT1AgPiAwIHRoZW4gdGhlIHBhcnNlIHdhcyBzdWNjZXNzZnVsIG9uIENVUlRPSwpAQCAtNTU0LDkgKzU5Nyw5IEBACiAJCS8vIHRoYXQgY2FzZSwgZmlyc3QgY2hlY2sgd2hldGhlciBvciBub3QgcHJpbWFyeSByZWNvdmVyeSBpcwogCQkvLyBwb3NzaWJsZSBvbiBuZXh0X3N0YWNrIC4uLgogCQkvLwotCQlpZiAobmV4dFN0YWNrVG9wID49IDApIHsKKwkJaWYgKHRoaXMubmV4dFN0YWNrVG9wID49IDApIHsKIAkJCXJlcGFpci5idWZmZXJQb3NpdGlvbiA9IDM7Ci0JCQlyZXBhaXIgPSBjaGVja1ByaW1hcnlEaXN0YW5jZShuZXh0U3RhY2ssIG5leHRTdGFja1RvcCwgcmVwYWlyKTsKKwkJCXJlcGFpciA9IGNoZWNrUHJpbWFyeURpc3RhbmNlKHRoaXMubmV4dFN0YWNrLCB0aGlzLm5leHRTdGFja1RvcCwgcmVwYWlyKTsKIAkJfQogCiAJCS8vCkBAIC01NjUsNyArNjA4LDcgQEAKIAkJUHJpbWFyeVJlcGFpckluZm8gbmV3X3JlcGFpciA9IHJlcGFpci5jb3B5KCk7CiAKIAkJbmV3X3JlcGFpci5idWZmZXJQb3NpdGlvbiA9IDI7Ci0JCW5ld19yZXBhaXIgPSBjaGVja1ByaW1hcnlEaXN0YW5jZShzdGFjaywgc3RhdGVTdGFja1RvcCwgbmV3X3JlcGFpcik7CisJCW5ld19yZXBhaXIgPSBjaGVja1ByaW1hcnlEaXN0YW5jZSh0aGlzLnN0YWNrLCB0aGlzLnN0YXRlU3RhY2tUb3AsIG5ld19yZXBhaXIpOwogCQlpZiAobmV3X3JlcGFpci5kaXN0YW5jZSA+IHJlcGFpci5kaXN0YW5jZSB8fCBuZXdfcmVwYWlyLm1pc3NwZWxsSW5kZXggPiByZXBhaXIubWlzc3BlbGxJbmRleCkgewogCQkJcmVwYWlyID0gbmV3X3JlcGFpcjsKIAkJfQpAQCAtNTc0LDExICs2MTcsMTEgQEAKIAkJLy8gRmluYWxseSwgaWYgcHJldl9zdGFja190b3AgPj0gMCB0aGVuIHRyeSBwcmltYXJ5IHJlY292ZXJ5IG9uCiAJCS8vIHRoZSBwcmV2X3N0YWNrIGNvbmZpZ3VyYXRpb24uCiAJCS8vCi0JCQotCQlpZiAocHJldlN0YWNrVG9wID49IDApIHsKKworCQlpZiAodGhpcy5wcmV2U3RhY2tUb3AgPj0gMCkgewogCQkJbmV3X3JlcGFpciA9IHJlcGFpci5jb3B5KCk7CiAJCQluZXdfcmVwYWlyLmJ1ZmZlclBvc2l0aW9uID0gMTsKLQkJCW5ld19yZXBhaXIgPSBjaGVja1ByaW1hcnlEaXN0YW5jZShwcmV2U3RhY2sscHJldlN0YWNrVG9wLCBuZXdfcmVwYWlyKTsKKwkJCW5ld19yZXBhaXIgPSBjaGVja1ByaW1hcnlEaXN0YW5jZSh0aGlzLnByZXZTdGFjayx0aGlzLnByZXZTdGFja1RvcCwgbmV3X3JlcGFpcik7CiAJCQlpZiAobmV3X3JlcGFpci5kaXN0YW5jZSA+IHJlcGFpci5kaXN0YW5jZSB8fCBuZXdfcmVwYWlyLm1pc3NwZWxsSW5kZXggPiByZXBhaXIubWlzc3BlbGxJbmRleCkgewogCQkJCXJlcGFpciA9IG5ld19yZXBhaXI7CiAJCQl9CkBAIC01ODksMTIgKzYzMiwxMiBAQAogCQkvLyBlbnN1cmUgdGhhdCB3ZSBjYW5ub3QgZG8gYmV0dGVyIHdpdGggYSBzaW1pbGFyIHNlY29uZGFyeQogCQkvLyBwaGFzZSByZWNvdmVyeS4KIAkJLy8KLQkJaWYgKG5leHRTdGFja1RvcCA+PSAwKSB7Ly8gbmV4dF9zdGFjayBhdmFpbGFibGUKLQkJCWlmIChzZWNvbmRhcnlDaGVjayhuZXh0U3RhY2ssbmV4dFN0YWNrVG9wLDMscmVwYWlyLmRpc3RhbmNlKSkgeworCQlpZiAodGhpcy5uZXh0U3RhY2tUb3AgPj0gMCkgey8vIG5leHRfc3RhY2sgYXZhaWxhYmxlCisJCQlpZiAoc2Vjb25kYXJ5Q2hlY2sodGhpcy5uZXh0U3RhY2ssdGhpcy5uZXh0U3RhY2tUb3AsMyxyZXBhaXIuZGlzdGFuY2UpKSB7CiAJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKIAkJCX0KIAkJfQotCQllbHNlIGlmIChzZWNvbmRhcnlDaGVjayhzdGFjaywgc3RhdGVTdGFja1RvcCwgMiwgcmVwYWlyLmRpc3RhbmNlKSkgeworCQllbHNlIGlmIChzZWNvbmRhcnlDaGVjayh0aGlzLnN0YWNrLCB0aGlzLnN0YXRlU3RhY2tUb3AsIDIsIHJlcGFpci5kaXN0YW5jZSkpIHsKIAkJCXJldHVybiBjYW5kaWRhdGU7CiAJCX0KIApAQCAtNjM1LDcgKzY3OCw3IEBACiAJCS8vIHRoZSBlcnJvciB0b2tlbi4KIAkJLy8KIAkJaWYgKHJlcGFpci5jb2RlID09IElOU0VSVElPTl9DT0RFKSB7Ci0JCQlpZiAoYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiAtIDFdID09IDApIHsKKwkJCWlmICh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gLSAxXSA9PSAwKSB7CiAJCQkJcmVwYWlyLmNvZGUgPSBCRUZPUkVfQ09ERTsKIAkJCX0KIAkJfQpAQCAtNjQ1LDE3ICs2ODgsMTcgQEAKIAkJLy8gdXBkYXRlIHN0YWNrIGFjY29yZGluZ2x5IGFuZCBjYWxsIGRpYWdub3N0aWMgcm91dGluZS4KIAkJLy8KIAkJaWYgKHJlcGFpci5idWZmZXJQb3NpdGlvbiA9PSAxKSB7Ci0JCQlzdGF0ZVN0YWNrVG9wID0gcHJldlN0YWNrVG9wOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gc3RhdGVTdGFja1RvcDsgaisrKSB7Ci0JCQkJc3RhY2tbal0gPSBwcmV2U3RhY2tbal07CisJCQl0aGlzLnN0YXRlU3RhY2tUb3AgPSB0aGlzLnByZXZTdGFja1RvcDsKKwkJCWZvciAoaW50IGogPSAwOyBqIDw9IHRoaXMuc3RhdGVTdGFja1RvcDsgaisrKSB7CisJCQkJdGhpcy5zdGFja1tqXSA9IHRoaXMucHJldlN0YWNrW2pdOwogCQkJfQotCQl9IGVsc2UgaWYgKG5leHRTdGFja1RvcCA+PSAwICYmIHJlcGFpci5idWZmZXJQb3NpdGlvbiA+PSAzKSB7Ci0JCQlzdGF0ZVN0YWNrVG9wID0gbmV4dFN0YWNrVG9wOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gc3RhdGVTdGFja1RvcDsgaisrKSB7Ci0JCQkJc3RhY2tbal0gPSBuZXh0U3RhY2tbal07CisJCX0gZWxzZSBpZiAodGhpcy5uZXh0U3RhY2tUb3AgPj0gMCAmJiByZXBhaXIuYnVmZmVyUG9zaXRpb24gPj0gMykgeworCQkJdGhpcy5zdGF0ZVN0YWNrVG9wID0gdGhpcy5uZXh0U3RhY2tUb3A7CisJCQlmb3IgKGludCBqID0gMDsgaiA8PSB0aGlzLnN0YXRlU3RhY2tUb3A7IGorKykgeworCQkJCXRoaXMuc3RhY2tbal0gPSB0aGlzLm5leHRTdGFja1tqXTsKIAkJCX0KLQkJCWxvY2F0aW9uU3RhY2tbc3RhdGVTdGFja1RvcF0gPSBidWZmZXJbM107Ci0JCQlsb2NhdGlvblN0YXJ0U3RhY2tbc3RhdGVTdGFja1RvcF0gPSBsZXhTdHJlYW0uc3RhcnQoYnVmZmVyWzNdKTsKKwkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5idWZmZXJbM107CisJCQl0aGlzLmxvY2F0aW9uU3RhcnRTdGFja1t0aGlzLnN0YXRlU3RhY2tUb3BdID0gdGhpcy5sZXhTdHJlYW0uc3RhcnQodGhpcy5idWZmZXJbM10pOwogCQl9CiAKIAkJcmV0dXJuIHByaW1hcnlEaWFnbm9zaXMocmVwYWlyKTsKQEAgLTY3MCw5ICs3MTMsOSBAQAogLy8JICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KIC8vCiAJcHJpdmF0ZSBpbnQgbWVyZ2VDYW5kaWRhdGUoaW50IHN0YXRlLCBpbnQgYnVmZmVyX3Bvc2l0aW9uKSB7Ci0JCWNoYXJbXSBuYW1lMSA9IGxleFN0cmVhbS5uYW1lKGJ1ZmZlcltidWZmZXJfcG9zaXRpb25dKTsKLQkJY2hhcltdIG5hbWUyID0gbGV4U3RyZWFtLm5hbWUoYnVmZmVyW2J1ZmZlcl9wb3NpdGlvbiArIDFdKTsKLQkJCisJCWNoYXJbXSBuYW1lMSA9IHRoaXMubGV4U3RyZWFtLm5hbWUodGhpcy5idWZmZXJbYnVmZmVyX3Bvc2l0aW9uXSk7CisJCWNoYXJbXSBuYW1lMiA9IHRoaXMubGV4U3RyZWFtLm5hbWUodGhpcy5idWZmZXJbYnVmZmVyX3Bvc2l0aW9uICsgMV0pOworCiAJCWludCBsZW4gID0gbmFtZTEubGVuZ3RoICsgbmFtZTIubGVuZ3RoOwogCiAJCWNoYXJbXSBzdHIgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lMSwgbmFtZTIpOwpAQCAtNzE5LDExICs3NjIsMTEgQEAKIAkgICAgUHJpbWFyeVJlcGFpckluZm8gc2NvcGVfcmVwYWlyID0gc2NvcGVUcmlhbChzdGNrLCBzdGFja190b3AsIHJlcGFpci5jb3B5KCkpOwogCSAgICBpZiAoc2NvcGVfcmVwYWlyLmRpc3RhbmNlID4gcmVwYWlyLmRpc3RhbmNlKQogCSAgICAgICAgcmVwYWlyID0gc2NvcGVfcmVwYWlyOwotCSAgICAgICAgCisKIAkJLy8KIAkJLy8gIE5leHQsIHRyeSBtZXJnaW5nIHRoZSBlcnJvciB0b2tlbiB3aXRoIGl0cyBzdWNjZXNzb3IuCiAJCS8vCi0JICAgIGlmKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dICE9IDAgJiYgYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiArIDFdICE9IDApIHsvLyBkbyBub3QgbWVyZ2UgdGhlIGZpcnN0IHRva2VuCisJICAgIGlmKHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0gIT0gMCAmJiB0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAxXSAhPSAwKSB7Ly8gZG8gbm90IG1lcmdlIHRoZSBmaXJzdCB0b2tlbgogCQkJc3ltYm9sID0gbWVyZ2VDYW5kaWRhdGUoc3Rja1tzdGFja190b3BdLCByZXBhaXIuYnVmZmVyUG9zaXRpb24pOwogCQkJaWYgKHN5bWJvbCAhPSAwKSB7CiAJCQkJaiA9IHBhcnNlQ2hlY2soc3Rjaywgc3RhY2tfdG9wLCBzeW1ib2wsIHJlcGFpci5idWZmZXJQb3NpdGlvbisyKTsKQEAgLTc0MiwxMCArNzg1LDEwIEBACiAJCWogPSBwYXJzZUNoZWNrKAogCQkJCXN0Y2ssCiAJCQkJc3RhY2tfdG9wLAotCQkJCWxleFN0cmVhbS5raW5kKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAxXSksCisJCQkJdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAxXSksCiAJCQkJcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMik7Ci0JCWlmIChsZXhTdHJlYW0ua2luZChidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSkgPT0gRU9MVF9TWU1CT0wgJiYKLQkJCWxleFN0cmVhbS5hZnRlckVvbChidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKzFdKSkgeworCQlpZiAodGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKSA9PSBFT0xUX1NZTUJPTCAmJgorCQkJdGhpcy5sZXhTdHJlYW0uYWZ0ZXJFb2wodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKzFdKSkgewogCQkJIGsgPSAxMDsKIAkJfSBlbHNlIHsKIAkJCWsgPSAwOwpAQCAtNzYzLDIyICs4MDYsMjIgQEAKIAkJLy8KIAkJbmV4dF9zdGF0ZSA9IHN0Y2tbc3RhY2tfdG9wXTsKIAkJbWF4X3BvcyA9IHN0YWNrX3RvcDsKLQkJdGVtcFN0YWNrVG9wID0gc3RhY2tfdG9wIC0gMTsKKwkJdGhpcy50ZW1wU3RhY2tUb3AgPSBzdGFja190b3AgLSAxOwogCi0JCXRvayA9IGxleFN0cmVhbS5raW5kKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKTsKLQkJbGV4U3RyZWFtLnJlc2V0KGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAxXSk7CisJCXRvayA9IHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSk7CisJCXRoaXMubGV4U3RyZWFtLnJlc2V0KHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiArIDFdKTsKIAkJYWN0ID0gUGFyc2VyLnRBY3Rpb24obmV4dF9zdGF0ZSwgdG9rKTsKIAkJd2hpbGUoYWN0IDw9IE5VTV9SVUxFUykgewogCQkJZG8gewotCQkJCXRlbXBTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOworCQkJCXRoaXMudGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CiAJCQkJc3ltYm9sID0gUGFyc2VyLmxoc1thY3RdOwotCQkJCWFjdCA9ICh0ZW1wU3RhY2tUb3AgPiBtYXhfcG9zCi0JCQkJCQkJCQkgID8gdGVtcFN0YWNrW3RlbXBTdGFja1RvcF0KLQkJCQkJCQkJCSAgOiBzdGNrW3RlbXBTdGFja1RvcF0pOworCQkJCWFjdCA9ICh0aGlzLnRlbXBTdGFja1RvcCA+IG1heF9wb3MKKwkJCQkJCQkJCSAgPyB0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcF0KKwkJCQkJCQkJCSAgOiBzdGNrW3RoaXMudGVtcFN0YWNrVG9wXSk7CiAJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKGFjdCwgc3ltYm9sKTsKIAkJCX0gd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7Ci0JCQltYXhfcG9zID0gbWF4X3BvcyA8IHRlbXBTdGFja1RvcCA/IG1heF9wb3MgOiB0ZW1wU3RhY2tUb3A7Ci0JCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CisJCQltYXhfcG9zID0gbWF4X3BvcyA8IHRoaXMudGVtcFN0YWNrVG9wID8gbWF4X3BvcyA6IHRoaXMudGVtcFN0YWNrVG9wOworCQkJdGhpcy50ZW1wU3RhY2tbdGhpcy50ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKIAkJCW5leHRfc3RhdGUgPSBhY3Q7CiAJCQlhY3QgPSBQYXJzZXIudEFjdGlvbihuZXh0X3N0YXRlLCB0b2spOwogCQl9CkBAIC03OTEsMTAgKzgzNCwxMCBAQAogCQkJc3ltYm9sID0gUGFyc2VyLmFzcltpXTsKIAkJCWlmIChzeW1ib2wgIT0gRU9GVF9TWU1CT0wgJiYgc3ltYm9sICE9IEVSUk9SX1NZTUJPTCkgewogCQkJCWlmIChyb290ID09IDApIHsKLQkJCQkJbGlzdFtzeW1ib2xdID0gc3ltYm9sOworCQkJCQl0aGlzLmxpc3Rbc3ltYm9sXSA9IHN5bWJvbDsKIAkJCQl9IGVsc2UgewotCQkJCQlsaXN0W3N5bWJvbF0gPSBsaXN0W3Jvb3RdOwotCQkJCQlsaXN0W3Jvb3RdID0gc3ltYm9sOworCQkJCQl0aGlzLmxpc3Rbc3ltYm9sXSA9IHRoaXMubGlzdFtyb290XTsKKwkJCQkJdGhpcy5saXN0W3Jvb3RdID0gc3ltYm9sOwogCQkJCX0KIAkJCQlyb290ID0gc3ltYm9sOwogCQkJfQpAQCAtODAzLDIwICs4NDYsMjAgQEAKIAkJaWYgKHN0Y2tbc3RhY2tfdG9wXSAhPSBuZXh0X3N0YXRlKSB7CiAJCQlmb3IgKGkgPSBQYXJzZXIuYXNpKHN0Y2tbc3RhY2tfdG9wXSk7IFBhcnNlci5hc3JbaV0gIT0gMDsgaSsrKSB7CiAJCQkJc3ltYm9sID0gUGFyc2VyLmFzcltpXTsKLQkJCQlpZiAoc3ltYm9sICE9IEVPRlRfU1lNQk9MICYmIHN5bWJvbCAhPSBFUlJPUl9TWU1CT0wgJiYgbGlzdFtzeW1ib2xdID09IDApIHsKKwkJCQlpZiAoc3ltYm9sICE9IEVPRlRfU1lNQk9MICYmIHN5bWJvbCAhPSBFUlJPUl9TWU1CT0wgJiYgdGhpcy5saXN0W3N5bWJvbF0gPT0gMCkgewogCQkJCQlpZiAocm9vdCA9PSAwKSB7Ci0JCQkJCQlsaXN0W3N5bWJvbF0gPSBzeW1ib2w7CisJCQkJCQl0aGlzLmxpc3Rbc3ltYm9sXSA9IHN5bWJvbDsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpc3Rbc3ltYm9sXSA9IGxpc3Rbcm9vdF07Ci0JCQkJCQlsaXN0W3Jvb3RdID0gc3ltYm9sOworCQkJCQkJdGhpcy5saXN0W3N5bWJvbF0gPSB0aGlzLmxpc3Rbcm9vdF07CisJCQkJCQl0aGlzLmxpc3Rbcm9vdF0gPSBzeW1ib2w7CiAJCQkJCX0KIAkJCQkJcm9vdCA9IHN5bWJvbDsKIAkJCQl9CiAJCQl9CiAJCX0KIAotCQlpID0gbGlzdFtyb290XTsKLQkJbGlzdFtyb290XSA9IDA7CisJCWkgPSB0aGlzLmxpc3Rbcm9vdF07CisJCXRoaXMubGlzdFtyb290XSA9IDA7CiAJCXJvb3QgPSBpOwogCiAJCS8vCkBAIC04MjUsNyArODY4LDcgQEAKIAkJLy8KIAkJc3ltYm9sID0gcm9vdDsKIAkJd2hpbGUoc3ltYm9sICE9IDApIHsKLQkJCWlmIChzeW1ib2wgPT0gRU9MVF9TWU1CT0wgJiYgbGV4U3RyZWFtLmFmdGVyRW9sKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKSkgeworCQkJaWYgKHN5bWJvbCA9PSBFT0xUX1NZTUJPTCAmJiB0aGlzLmxleFN0cmVhbS5hZnRlckVvbCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKSkgewogCQkJCWsgPSAxMDsKIAkJCX0gZWxzZSB7CiAJCQkJayA9IDA7CkBAIC04NDEsMTQgKzg4NCw5IEBACiAJCQkJcmVwYWlyLmRpc3RhbmNlID0gajsKIAkJCQlyZXBhaXIuc3ltYm9sID0gc3ltYm9sOwogCQkJCXJlcGFpci5jb2RlID0gSU5TRVJUSU9OX0NPREU7Ci0JCQl9IGVsc2UgaWYgKGogPT0gcmVwYWlyLmRpc3RhbmNlICYmIGsgPT0gcmVwYWlyLm1pc3NwZWxsSW5kZXggJiYgaXNCZXR0ZXJTeW1ib2woc3ltYm9sLCByZXBhaXIuc3ltYm9sKSkgewotCQkJCXJlcGFpci5taXNzcGVsbEluZGV4ID0gazsKLQkJCQlyZXBhaXIuZGlzdGFuY2UgPSBqOwotCQkJCXJlcGFpci5zeW1ib2wgPSBzeW1ib2w7Ci0JCQkJcmVwYWlyLmNvZGUgPSBJTlNFUlRJT05fQ09ERTsKIAkJCX0KIAotCQkJc3ltYm9sID0gbGlzdFtzeW1ib2xdOworCQkJc3ltYm9sID0gdGhpcy5saXN0W3N5bWJvbF07CiAJCX0KIAogCQkvLwpAQCAtODU2LDEzICs4OTQsMTMgQEAKIAkJLy8gaW4gdGhlIGN1cnJlbnQgc3RhdGUsIGV4Y2VwdCBFT0ZUIGFuZCBFUlJPUl9TWU1CT0wuCiAJCS8vCiAJCXN5bWJvbCA9IHJvb3Q7Ci0JCQotCQlpZihidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSAhPSAwKSB7Ly8gZG8gbm90IHJlcGxhY2UgdGhlIGZpcnN0IHRva2VuCisKKwkJaWYodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSAhPSAwKSB7Ly8gZG8gbm90IHJlcGxhY2UgdGhlIGZpcnN0IHRva2VuCiAJCQl3aGlsZShzeW1ib2wgIT0gMCkgewotCQkJCWlmIChzeW1ib2wgPT0gRU9MVF9TWU1CT0wgJiYgbGV4U3RyZWFtLmFmdGVyRW9sKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24rMV0pKSB7CisJCQkJaWYgKHN5bWJvbCA9PSBFT0xUX1NZTUJPTCAmJiB0aGlzLmxleFN0cmVhbS5hZnRlckVvbCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24rMV0pKSB7CiAJCQkJCWsgPSAxMDsKIAkJCQl9IGVsc2UgewotCQkJCQlrID0gbWlzc3BlbGwoc3ltYm9sLCBidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSk7CisJCQkJCWsgPSBtaXNzcGVsbChzeW1ib2wsIHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0pOwogCQkJCX0KIAkJCQlqID0gcGFyc2VDaGVjayhzdGNrLCBzdGFja190b3AsIHN5bWJvbCwgcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKzEpOwogCQkJCWlmIChqID4gcmVwYWlyLmRpc3RhbmNlKSB7CkBAIC04NzQsMTQgKzkxMiwxMCBAQAogCQkJCQlyZXBhaXIubWlzc3BlbGxJbmRleCA9IGs7CiAJCQkJCXJlcGFpci5zeW1ib2wgPSBzeW1ib2w7CiAJCQkJCXJlcGFpci5jb2RlID0gU1VCU1RJVFVUSU9OX0NPREU7Ci0JCQkJfSBlbHNlIGlmIChqID09IHJlcGFpci5kaXN0YW5jZSAmJiBrID4gcmVwYWlyLm1pc3NwZWxsSW5kZXggJiYgaXNCZXR0ZXJTeW1ib2woc3ltYm9sLCByZXBhaXIuc3ltYm9sKSkgewotCQkJCQlyZXBhaXIubWlzc3BlbGxJbmRleCA9IGs7Ci0JCQkJCXJlcGFpci5zeW1ib2wgPSBzeW1ib2w7Ci0JCQkJCXJlcGFpci5jb2RlID0gU1VCU1RJVFVUSU9OX0NPREU7CiAJCQkJfQogCQkJCWkgPSBzeW1ib2w7Ci0JCQkJc3ltYm9sID0gbGlzdFtzeW1ib2xdOwotCQkJCWxpc3RbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgZWxlbWVudAorCQkJCXN5bWJvbCA9IHRoaXMubGlzdFtzeW1ib2xdOworCQkJCXRoaXMubGlzdFtpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBlbGVtZW50CiAJCQl9CiAJCX0KIApAQCAtOTI4LDE4ICs5NjIsMTggQEAKIAkJLy8KIAkJLy8gIElzc3VlIGRpYWdub3N0aWMuCiAJCS8vCi0JCWludCBwcmV2dG9rID0gYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiAtIDFdOwotCQlpbnQJY3VydG9rICA9IGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dOworCQlpbnQgcHJldnRvayA9IHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiAtIDFdOworCQlpbnQJY3VydG9rICA9IHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl07CiAKIAkJc3dpdGNoKHJlcGFpci5jb2RlKSB7CiAJCQljYXNlIElOU0VSVElPTl9DT0RFOgogCQkJY2FzZSBCRUZPUkVfQ09ERTogewogCQkJCWlmIChyZXBhaXIuc3ltYm9sID4gTlRfT0ZGU0VUKQotCQkJCQkgbmFtZV9pbmRleCA9IGdldE50ZXJtSW5kZXgoc3RhY2tbc3RhdGVTdGFja1RvcF0sCisJCQkJCSBuYW1lX2luZGV4ID0gZ2V0TnRlcm1JbmRleCh0aGlzLnN0YWNrW3RoaXMuc3RhdGVTdGFja1RvcF0sCiAJCQkJCQkJCQkJCQlyZXBhaXIuc3ltYm9sLAogCQkJCQkJCQkJCQkJcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKTsKLQkJCQllbHNlIG5hbWVfaW5kZXggPSBnZXRUZXJtSW5kZXgoc3RhY2ssCi0JCQkJCQkJCQkJCSAgIHN0YXRlU3RhY2tUb3AsCisJCQkJZWxzZSBuYW1lX2luZGV4ID0gZ2V0VGVybUluZGV4KHRoaXMuc3RhY2ssCisJCQkJCQkJCQkJCSAgIHRoaXMuc3RhdGVTdGFja1RvcCwKIAkJCQkJCQkJCQkJICAgcmVwYWlyLnN5bWJvbCwKIAkJCQkJCQkJCQkJICAgcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKTsKIApAQCAtOTQ4LDcgKzk4Miw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIElOVkFMSURfQ09ERTogewotCQkJCW5hbWVfaW5kZXggPSBnZXROdGVybUluZGV4KHN0YWNrW3N0YXRlU3RhY2tUb3BdLAorCQkJCW5hbWVfaW5kZXggPSBnZXROdGVybUluZGV4KHRoaXMuc3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXSwKIAkJCQkJCQkJCQkgICByZXBhaXIuc3ltYm9sLAogCQkJCQkJCQkJCSAgIHJlcGFpci5idWZmZXJQb3NpdGlvbiArIDEpOwogCQkJCXJlcG9ydEVycm9yKHJlcGFpci5jb2RlLCBuYW1lX2luZGV4LCBjdXJ0b2ssIGN1cnRvayk7CkBAIC05NTksNyArOTkzLDcgQEAKIAkJCQkJbmFtZV9pbmRleCA9IFBhcnNlci50ZXJtaW5hbF9pbmRleFtyZXBhaXIuc3ltYm9sXTsKIAkJCQllbHNlCiAJCQkJewotCQkJCQluYW1lX2luZGV4ID0gZ2V0VGVybUluZGV4KHN0YWNrLCBzdGF0ZVN0YWNrVG9wLAorCQkJCQluYW1lX2luZGV4ID0gZ2V0VGVybUluZGV4KHRoaXMuc3RhY2ssIHRoaXMuc3RhdGVTdGFja1RvcCwKIAkJCQkJCQkJCQkJICByZXBhaXIuc3ltYm9sLAogCQkJCQkJCQkJCQkgIHJlcGFpci5idWZmZXJQb3NpdGlvbiArIDEpOwogCQkJCQlpZiAobmFtZV9pbmRleCAhPSBQYXJzZXIudGVybWluYWxfaW5kZXhbcmVwYWlyLnN5bWJvbF0pCkBAIC05NzIsMjUgKzEwMDYsMjUgQEAKIAkJCQlyZXBvcnRFcnJvcihyZXBhaXIuY29kZSwKIAkJCQkJCQkgUGFyc2VyLnRlcm1pbmFsX2luZGV4W3JlcGFpci5zeW1ib2xdLAogCQkJCQkJCSBjdXJ0b2ssCi0JCQkJCQkJIGxleFN0cmVhbS5uZXh0KGN1cnRvaykpOworCQkJCQkJCSB0aGlzLmxleFN0cmVhbS5uZXh0KGN1cnRvaykpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBTQ09QRV9DT0RFOiB7Ci0JICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY29wZVN0YWNrVG9wOyBpKyspIHsKKwkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2NvcGVTdGFja1RvcDsgaSsrKSB7CiAJICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlcGFpci5jb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2NvcGVJbmRleFtpXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25TdGFja1tzY29wZVBvc2l0aW9uW2ldXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXRoaXMuc2NvcGVJbmRleFtpXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblN0YWNrW3RoaXMuc2NvcGVQb3NpdGlvbltpXV0sCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZ0b2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlci5ub25fdGVybWluYWxfaW5kZXhbUGFyc2VyLnNjb3BlX2xoc1tzY29wZUluZGV4W2ldXV0pOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXIubm9uX3Rlcm1pbmFsX2luZGV4W1BhcnNlci5zY29wZV9saHNbdGhpcy5zY29wZUluZGV4W2ldXV0pOwogCSAgICAgICAgICAgIH0KLQkKLQkgICAgICAgICAgICByZXBhaXIuc3ltYm9sID0gUGFyc2VyLnNjb3BlX2xoc1tzY29wZUluZGV4W3Njb3BlU3RhY2tUb3BdXSArIE5UX09GRlNFVDsKLQkgICAgICAgICAgICBzdGF0ZVN0YWNrVG9wID0gc2NvcGVQb3NpdGlvbltzY29wZVN0YWNrVG9wXTsKKworCSAgICAgICAgICAgIHJlcGFpci5zeW1ib2wgPSBQYXJzZXIuc2NvcGVfbGhzW3RoaXMuc2NvcGVJbmRleFt0aGlzLnNjb3BlU3RhY2tUb3BdXSArIE5UX09GRlNFVDsKKwkgICAgICAgICAgICB0aGlzLnN0YXRlU3RhY2tUb3AgPSB0aGlzLnNjb3BlUG9zaXRpb25bdGhpcy5zY29wZVN0YWNrVG9wXTsKIAkgICAgICAgICAgICByZXBvcnRFcnJvcihyZXBhaXIuY29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAtc2NvcGVJbmRleFtzY29wZVN0YWNrVG9wXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblN0YWNrW3Njb3BlUG9zaXRpb25bc2NvcGVTdGFja1RvcF1dLAorCSAgICAgICAgICAgICAgICAgICAgICAgIC10aGlzLnNjb3BlSW5kZXhbdGhpcy5zY29wZVN0YWNrVG9wXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uU3RhY2tbdGhpcy5zY29wZVBvc2l0aW9uW3RoaXMuc2NvcGVTdGFja1RvcF1dLAogCSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZ0b2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnRlcm1JbmRleChzdGFja1tzdGF0ZVN0YWNrVG9wXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBnZXROdGVybUluZGV4KHRoaXMuc3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpci5zeW1ib2wsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXIuYnVmZmVyUG9zaXRpb24pCiAJICAgICAgICAgICAgICAgICAgICAgICApOwpAQCAtMTAxMCwyOCArMTA0NCwyOCBAQAogCQkJY2FzZSBCRUZPUkVfQ09ERToKIAkJCWNhc2UgU0NPUEVfQ09ERTogewogCQkJCWNhbmRpZGF0ZS5zeW1ib2wgPSByZXBhaXIuc3ltYm9sOwotCQkJCWNhbmRpZGF0ZS5sb2NhdGlvbiA9IGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dOwotCQkJCWxleFN0cmVhbS5yZXNldChidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSk7CisJCQkJY2FuZGlkYXRlLmxvY2F0aW9uID0gdGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXTsKKwkJCQl0aGlzLmxleFN0cmVhbS5yZXNldCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgSU5WQUxJRF9DT0RFOgogCQkJY2FzZSBTVUJTVElUVVRJT05fQ09ERTogewogCQkJCWNhbmRpZGF0ZS5zeW1ib2wgPSByZXBhaXIuc3ltYm9sOwotCQkJCWNhbmRpZGF0ZS5sb2NhdGlvbiA9IGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dOwotCQkJCWxleFN0cmVhbS5yZXNldChidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMV0pOworCQkJCWNhbmRpZGF0ZS5sb2NhdGlvbiA9IHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl07CisJCQkJdGhpcy5sZXhTdHJlYW0ucmVzZXQodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMV0pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBNRVJHRV9DT0RFOiB7CiAJCQkJY2FuZGlkYXRlLnN5bWJvbCA9IHJlcGFpci5zeW1ib2w7Ci0JCQkJY2FuZGlkYXRlLmxvY2F0aW9uID0gYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl07Ci0JCQkJbGV4U3RyZWFtLnJlc2V0KGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAyXSk7CisJCQkJY2FuZGlkYXRlLmxvY2F0aW9uID0gdGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXTsKKwkJCQl0aGlzLmxleFN0cmVhbS5yZXNldCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAyXSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7Ly8gZGVsZXRpb24KLQkJCQljYW5kaWRhdGUubG9jYXRpb24gPSBidWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMV07CisJCQkJY2FuZGlkYXRlLmxvY2F0aW9uID0gdGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMV07CiAJCQkJY2FuZGlkYXRlLnN5bWJvbCA9Ci0JCQkJCQkgIGxleFN0cmVhbS5raW5kKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAxXSk7Ci0JCQkJbGV4U3RyZWFtLnJlc2V0KGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gKyAyXSk7CisJCQkJCQkgIHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uICsgMV0pOworCQkJCXRoaXMubGV4U3RyZWFtLnJlc2V0KHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbiArIDJdKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTA2MCw3ICsxMDk0LDcgQEAKIAkJCW1heF9wb3MgPSBzdGFja190b3AsCiAJCQloaWdoZXN0X3N5bWJvbCA9IHRvazsKIAotCQl0ZW1wU3RhY2tUb3AgPSBzdGFja190b3AgLSAxOworCQl0aGlzLnRlbXBTdGFja1RvcCA9IHN0YWNrX3RvcCAtIDE7CiAKIAkJLy8KIAkJLy8gQ29tcHV0ZSBhbGwgcmVkdWNlIGFuZCBhc3NvY2lhdGVkIGFjdGlvbnMgaW5kdWNlZCBieSB0aGUKQEAgLTEwNjgsNyArMTEwMiw3IEBACiAJCS8vIGFuZCBBQ0NFUFQgYWN0aW9ucyBjYW5ub3QgYmUgY29tcHV0ZWQgb24gdGhlIGNhbmRpZGF0ZSBpbgogCQkvLyB0aGlzIGNvbnRleHQsIHNpbmNlIHdlIGtub3cgdGhhdCBpdCBpcyBzdWl0YWJsZSBmb3IgcmVjb3ZlcnkuCiAJCS8vCi0JCWxleFN0cmVhbS5yZXNldChidWZmZXJbYnVmZmVyX3Bvc2l0aW9uXSk7CisJCXRoaXMubGV4U3RyZWFtLnJlc2V0KHRoaXMuYnVmZmVyW2J1ZmZlcl9wb3NpdGlvbl0pOwogCQlhY3QgPSBQYXJzZXIudEFjdGlvbihhY3QsIHRvayk7CiAJCXdoaWxlKGFjdCA8PSBOVU1fUlVMRVMpIHsKIAkJCS8vCkBAIC0xMDc2LDExICsxMTEwLDExIEBACiAJCQkvLyB1bnRpbCBhIGdvdG8gYWN0aW9uIGlzIGNvbXB1dGVkIC4uLgogCQkJLy8KIAkJCWRvIHsKLQkJCQl0ZW1wU3RhY2tUb3AgLT0gKFBhcnNlci5yaHNbYWN0XS0xKTsKKwkJCQl0aGlzLnRlbXBTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOwogCQkJCWludCBsaHNfc3ltYm9sID0gUGFyc2VyLmxoc1thY3RdOwotCQkJCWFjdCA9ICh0ZW1wU3RhY2tUb3AgPiBtYXhfcG9zCi0JCQkJCQkJCQkgID8gdGVtcFN0YWNrW3RlbXBTdGFja1RvcF0KLQkJCQkJCQkJCSAgOiBzdGNrW3RlbXBTdGFja1RvcF0pOworCQkJCWFjdCA9ICh0aGlzLnRlbXBTdGFja1RvcCA+IG1heF9wb3MKKwkJCQkJCQkJCSAgPyB0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcF0KKwkJCQkJCQkJCSAgOiBzdGNrW3RoaXMudGVtcFN0YWNrVG9wXSk7CiAJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKGFjdCwgbGhzX3N5bWJvbCk7CiAJCQl9IHdoaWxlKGFjdCA8PSBOVU1fUlVMRVMpOwogCkBAIC0xMDg5LDggKzExMjMsOCBAQAogCQkJLy8gcHVzaCBnb3RvIHN0YXRlIGludG8gdGhlIHN0YWNrLCBhbmQgY29tcHV0ZSBuZXh0CiAJCQkvLyBhY3Rpb24gb24gY2FuZGlkYXRlIC4uLgogCQkJLy8KLQkJCW1heF9wb3MgPSBtYXhfcG9zIDwgdGVtcFN0YWNrVG9wID8gbWF4X3BvcyA6IHRlbXBTdGFja1RvcDsKLQkJCXRlbXBTdGFja1t0ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKKwkJCW1heF9wb3MgPSBtYXhfcG9zIDwgdGhpcy50ZW1wU3RhY2tUb3AgPyBtYXhfcG9zIDogdGhpcy50ZW1wU3RhY2tUb3A7CisJCQl0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcCArIDFdID0gYWN0OwogCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCQl9CiAKQEAgLTExMDYsMTcgKzExNDAsMTcgQEAKIAkJLy8gbWF4X3BvcyBhcyBjb21wdXRlZCBpbiB0aGUgcHJldmlvdXMgbG9vcCkuICBBdCB0aGF0IHBvaW50LAogCQkvLyByZXR1cm4gdGhlIGhpZ2hlc3Rfc3ltYm9sIGNvbXB1dGVkLgogCQkvLwotCQl0ZW1wU3RhY2tUb3ArKzsgLy8gYWRqdXN0IHRvcCBvZiBzdGFjayB0byByZWZsZWN0IGxhc3QgZ290bworCQl0aGlzLnRlbXBTdGFja1RvcCsrOyAvLyBhZGp1c3QgdG9wIG9mIHN0YWNrIHRvIHJlZmxlY3QgbGFzdCBnb3RvCiAJCQkJCQkgIC8vIG5leHQgbW92ZSBpcyBzaGlmdCBvciBzaGlmdC1yZWR1Y2UuCi0JCWludCB0aHJlc2hvbGQgPSB0ZW1wU3RhY2tUb3A7CisJCWludCB0aHJlc2hvbGQgPSB0aGlzLnRlbXBTdGFja1RvcDsKIAotCQl0b2sgPSBsZXhTdHJlYW0ua2luZChidWZmZXJbYnVmZmVyX3Bvc2l0aW9uXSk7Ci0JCWxleFN0cmVhbS5yZXNldChidWZmZXJbYnVmZmVyX3Bvc2l0aW9uICsgMV0pOworCQl0b2sgPSB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuYnVmZmVyW2J1ZmZlcl9wb3NpdGlvbl0pOworCQl0aGlzLmxleFN0cmVhbS5yZXNldCh0aGlzLmJ1ZmZlcltidWZmZXJfcG9zaXRpb24gKyAxXSk7CiAKIAkJaWYgKGFjdCA+IEVSUk9SX0FDVElPTikgeyAgLy8gc2hpZnQtcmVkdWNlIG9uIGNhbmRpZGF0ZT8KIAkJCWFjdCAtPSBFUlJPUl9BQ1RJT047CiAJCX0gZWxzZSB7Ci0JCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CisJCQl0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcCArIDFdID0gYWN0OwogCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCQl9CiAKQEAgLTExMjYsMjQgKzExNjAsMjQgQEAKIAkJCS8vIHVudGlsIGEgZ290byBhY3Rpb24gaXMgY29tcHV0ZWQgLi4uCiAJCQkvLwogCQkJZG8gewotCQkJCXRlbXBTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOworCQkJCXRoaXMudGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CiAKLQkJCQlpZiAodGVtcFN0YWNrVG9wIDwgdGhyZXNob2xkKSB7CisJCQkJaWYgKHRoaXMudGVtcFN0YWNrVG9wIDwgdGhyZXNob2xkKSB7CiAJCQkJCXJldHVybiAoaGlnaGVzdF9zeW1ib2wgPiBOVF9PRkZTRVQKIAkJCQkJCSA/IFBhcnNlci5ub25fdGVybWluYWxfaW5kZXhbaGlnaGVzdF9zeW1ib2wgLSBOVF9PRkZTRVRdCiAJCQkJCQkgOiBQYXJzZXIudGVybWluYWxfaW5kZXhbaGlnaGVzdF9zeW1ib2xdKTsKIAkJCQl9CiAKIAkJCQlpbnQgbGhzX3N5bWJvbCA9IFBhcnNlci5saHNbYWN0XTsKLQkJCQlpZiAodGVtcFN0YWNrVG9wID09IHRocmVzaG9sZCkKKwkJCQlpZiAodGhpcy50ZW1wU3RhY2tUb3AgPT0gdGhyZXNob2xkKQogCQkJCQloaWdoZXN0X3N5bWJvbCA9IGxoc19zeW1ib2wgKyBOVF9PRkZTRVQ7Ci0JCQkJYWN0ID0gKHRlbXBTdGFja1RvcCA+IG1heF9wb3MKLQkJCQkJCQkJCSAgPyB0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXQotCQkJCQkJCQkJICA6IHN0Y2tbdGVtcFN0YWNrVG9wXSk7CisJCQkJYWN0ID0gKHRoaXMudGVtcFN0YWNrVG9wID4gbWF4X3BvcworCQkJCQkJCQkJICA/IHRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wXQorCQkJCQkJCQkJICA6IHN0Y2tbdGhpcy50ZW1wU3RhY2tUb3BdKTsKIAkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24oYWN0LCBsaHNfc3ltYm9sKTsKIAkJCX0gd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7CiAKLQkJCXRlbXBTdGFja1t0ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKKwkJCXRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CiAJCQlhY3QgPSBQYXJzZXIudEFjdGlvbihhY3QsIHRvayk7CiAJCX0KIApAQCAtMTE2NCwxOSArMTE5OCwxOSBAQAogLy8KIAlwcml2YXRlIGludCBnZXROdGVybUluZGV4KGludCBzdGFydCwgaW50IHN5bSwgaW50IGJ1ZmZlcl9wb3NpdGlvbikgewogCQlpbnQgaGlnaGVzdF9zeW1ib2wgPSBzeW0gLSBOVF9PRkZTRVQsCi0JCQl0b2sgPSBsZXhTdHJlYW0ua2luZChidWZmZXJbYnVmZmVyX3Bvc2l0aW9uXSk7Ci0JCWxleFN0cmVhbS5yZXNldChidWZmZXJbYnVmZmVyX3Bvc2l0aW9uICsgMV0pOworCQkJdG9rID0gdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltidWZmZXJfcG9zaXRpb25dKTsKKwkJdGhpcy5sZXhTdHJlYW0ucmVzZXQodGhpcy5idWZmZXJbYnVmZmVyX3Bvc2l0aW9uICsgMV0pOwogCiAJCS8vCiAJCS8vIEluaXRpYWxpemUgc3RhY2sgaW5kZXggb2YgdGVtcF9zdGFjayBhbmQgaW5pdGlhbGl6ZSBtYXhpbXVtCiAJCS8vIHBvc2l0aW9uIG9mIHN0YXRlIHN0YWNrIHRoYXQgaXMgc3RpbGwgdXNlZnVsLgogCQkvLwotCQl0ZW1wU3RhY2tUb3AgPSAwOwotCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXSA9IHN0YXJ0OworCQl0aGlzLnRlbXBTdGFja1RvcCA9IDA7CisJCXRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wXSA9IHN0YXJ0OwogCiAJCWludCBhY3QgPSBQYXJzZXIubnRBY3Rpb24oc3RhcnQsIGhpZ2hlc3Rfc3ltYm9sKTsKIAkJaWYgKGFjdCA+IE5VTV9SVUxFUykgeyAvLyBnb3RvIGFjdGlvbj8KLQkJCXRlbXBTdGFja1t0ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKKwkJCXRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CiAJCQlhY3QgPSBQYXJzZXIudEFjdGlvbihhY3QsIHRvayk7CiAJCX0KIApAQCAtMTE4NiwzMSArMTIyMCwyMCBAQAogCQkJLy8gdW50aWwgYSBnb3RvIGFjdGlvbiBpcyBjb21wdXRlZCAuLi4KIAkJCS8vCiAJCQlkbyB7Ci0JCQkJdGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7Ci0JCQkJaWYgKHRlbXBTdGFja1RvcCA8IDApCisJCQkJdGhpcy50ZW1wU3RhY2tUb3AgLT0gKFBhcnNlci5yaHNbYWN0XS0xKTsKKwkJCQlpZiAodGhpcy50ZW1wU3RhY2tUb3AgPCAwKQogCQkJCQlyZXR1cm4gUGFyc2VyLm5vbl90ZXJtaW5hbF9pbmRleFtoaWdoZXN0X3N5bWJvbF07Ci0JCQkJaWYgKHRlbXBTdGFja1RvcCA9PSAwKQorCQkJCWlmICh0aGlzLnRlbXBTdGFja1RvcCA9PSAwKQogCQkJCQloaWdoZXN0X3N5bWJvbCA9IFBhcnNlci5saHNbYWN0XTsKLQkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24odGVtcFN0YWNrW3RlbXBTdGFja1RvcF0sIFBhcnNlci5saHNbYWN0XSk7CisJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKHRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wXSwgUGFyc2VyLmxoc1thY3RdKTsKIAkJCX0gd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7Ci0JCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CisJCQl0aGlzLnRlbXBTdGFja1t0aGlzLnRlbXBTdGFja1RvcCArIDFdID0gYWN0OwogCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCQl9CiAKIAkJcmV0dXJuIFBhcnNlci5ub25fdGVybWluYWxfaW5kZXhbaGlnaGVzdF9zeW1ib2xdOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0JldHRlclN5bWJvbChpbnQgc3ltYm9sLCBpbnQgYWN0dWFsU3ltYm9sKSB7Ci0vLwkJc3dpdGNoIChhY3R1YWxTeW1ib2wpIHsKLS8vCQkJY2FzZSBUb2tlbk5hbWVpbnRlcmZhY2UgOgotLy8JCQkJaWYoc3ltYm9sID09IFRva2VuTmFtZWNsYXNzKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KIC8vCiAvLwkJICAgQ2hlY2sgd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSBoaWdoIHByb2JhYmlsaXR5IHRoYXQgYQogLy8JICAgZ2l2ZW4gc3RyaW5nIGlzIGEgbWlzc3BlbGxpbmcgb2YgYW5vdGhlci4KQEAgLTEyMTgsNyArMTI0MSw3IEBACiAvLwkgICBjb25zaWRlcmVkIHRvIGJlIG1pc3NwZWxsaW5nIG9mIGVhY2ggb3RoZXIuCiAvLwogCXByaXZhdGUgaW50IG1pc3NwZWxsKGludCBzeW0sIGludCB0b2spIHsKLQkJCisKIAogCQkvLwogCQkvLwpAQCAtMTIzNSw3ICsxMjU4LDcgQEAKIAkJLy8KIAkJLy8KIAkJLy8KLQkJY2hhcltdIHRva2VuTmFtZSA9IGxleFN0cmVhbS5uYW1lKHRvayk7CisJCWNoYXJbXSB0b2tlbk5hbWUgPSB0aGlzLmxleFN0cmVhbS5uYW1lKHRvayk7CiAJCWludCBsZW4gPSB0b2tlbk5hbWUubGVuZ3RoOwogCQlpbnQgbSA9IGxlbiA8IE1BWF9OQU1FX0xFTkdUSCA/IGxlbiA6IE1BWF9OQU1FX0xFTkdUSDsKIAkJY2hhcltdIHMyID0gbmV3IGNoYXJbbSArIDFdOwpAQCAtMTMyNSw1MyArMTM0OCw1MyBAQAogCiAJCXJldHVybihjb3VudCAqIDEwIC8gKChuIDwgbGVuID8gbGVuIDogbikgKyBudW1fZXJyb3JzKSk7CiAJfQotCQorCiAJcHJpdmF0ZSBQcmltYXJ5UmVwYWlySW5mbyBzY29wZVRyaWFsKGludCBzdGNrW10sIGludCBzdGFja190b3AsIFByaW1hcnlSZXBhaXJJbmZvIHJlcGFpcikgewotCSAgICBzdGF0ZVNlZW4gPSBuZXcgaW50W3N0YWNrTGVuZ3RoXTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFja0xlbmd0aDsgaSsrKQotCSAgICAgICAgc3RhdGVTZWVuW2ldID0gTklMOwotCSAgICAKLQkgICAgc3RhdGVQb29sVG9wID0gMDsKLQkgICAgc3RhdGVQb29sID0gbmV3IFN0YXRlSW5mb1tzdGFja0xlbmd0aF07Ci0JCisJICAgIHRoaXMuc3RhdGVTZWVuID0gbmV3IGludFt0aGlzLnN0YWNrTGVuZ3RoXTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnN0YWNrTGVuZ3RoOyBpKyspCisJICAgICAgICB0aGlzLnN0YXRlU2VlbltpXSA9IE5JTDsKKworCSAgICB0aGlzLnN0YXRlUG9vbFRvcCA9IDA7CisJICAgIHRoaXMuc3RhdGVQb29sID0gbmV3IFN0YXRlSW5mb1t0aGlzLnN0YWNrTGVuZ3RoXTsKKwogCSAgICBzY29wZVRyaWFsQ2hlY2soc3Rjaywgc3RhY2tfdG9wLCByZXBhaXIsIDApOwotCQotCSAgICBzdGF0ZVNlZW4gPSBudWxsOwotCSAgICBzdGF0ZVBvb2xUb3AgPSAwOwotCQorCisJICAgIHRoaXMuc3RhdGVTZWVuID0gbnVsbDsKKwkgICAgdGhpcy5zdGF0ZVBvb2xUb3AgPSAwOworCiAJICAgIHJlcGFpci5jb2RlID0gU0NPUEVfQ09ERTsKIAkgICAgcmVwYWlyLm1pc3NwZWxsSW5kZXggPSAxMDsKLQkKKwogCSAgICByZXR1cm4gcmVwYWlyOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBzY29wZVRyaWFsQ2hlY2soaW50IHN0Y2tbXSwgaW50IHN0YWNrX3RvcCwgUHJpbWFyeVJlcGFpckluZm8gcmVwYWlyLCBpbnQgaW5keCkgewogCQlpZihpbmR4ID4gMjApIHJldHVybjsgLy8gYXZvaWQgdG9vIG11Y2ggcmVjdXJzaXZlIGNhbGwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkKKwogCQlpbnQgYWN0ID0gc3Rja1tzdGFja190b3BdOwotCQotCSAgICBmb3IgKGludCBpID0gc3RhdGVTZWVuW3N0YWNrX3RvcF07IGkgIT0gTklMOyBpID0gc3RhdGVQb29sW2ldLm5leHQpIHsKLQkgICAgICAgIGlmIChzdGF0ZVBvb2xbaV0uc3RhdGUgPT0gYWN0KSByZXR1cm47CisKKwkgICAgZm9yIChpbnQgaSA9IHRoaXMuc3RhdGVTZWVuW3N0YWNrX3RvcF07IGkgIT0gTklMOyBpID0gdGhpcy5zdGF0ZVBvb2xbaV0ubmV4dCkgeworCSAgICAgICAgaWYgKHRoaXMuc3RhdGVQb29sW2ldLnN0YXRlID09IGFjdCkgcmV0dXJuOwogCSAgICB9CiAKLQkgICAgaW50IG9sZF9zdGF0ZV9wb29sX3RvcCA9IHN0YXRlUG9vbFRvcCsrOwotCSAgICBpZihzdGF0ZVBvb2xUb3AgPj0gc3RhdGVQb29sLmxlbmd0aCkgewotCSAgICAJU3lzdGVtLmFycmF5Y29weShzdGF0ZVBvb2wsIDAsIHN0YXRlUG9vbCA9IG5ldyBTdGF0ZUluZm9bc3RhdGVQb29sVG9wICogMl0sIDAsIHN0YXRlUG9vbFRvcCk7CisJICAgIGludCBvbGRfc3RhdGVfcG9vbF90b3AgPSB0aGlzLnN0YXRlUG9vbFRvcCsrOworCSAgICBpZih0aGlzLnN0YXRlUG9vbFRvcCA+PSB0aGlzLnN0YXRlUG9vbC5sZW5ndGgpIHsKKwkgICAgCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdGF0ZVBvb2wsIDAsIHRoaXMuc3RhdGVQb29sID0gbmV3IFN0YXRlSW5mb1t0aGlzLnN0YXRlUG9vbFRvcCAqIDJdLCAwLCB0aGlzLnN0YXRlUG9vbFRvcCk7CiAJICAgIH0KLQkgICAgCi0JICAgIHN0YXRlUG9vbFtvbGRfc3RhdGVfcG9vbF90b3BdID0gbmV3IFN0YXRlSW5mbyhhY3QsIHN0YXRlU2VlbltzdGFja190b3BdKTsKLQkgICAgc3RhdGVTZWVuW3N0YWNrX3RvcF0gPSBvbGRfc3RhdGVfcG9vbF90b3A7Ci0JCisKKwkgICAgdGhpcy5zdGF0ZVBvb2xbb2xkX3N0YXRlX3Bvb2xfdG9wXSA9IG5ldyBTdGF0ZUluZm8oYWN0LCB0aGlzLnN0YXRlU2VlbltzdGFja190b3BdKTsKKwkgICAgdGhpcy5zdGF0ZVNlZW5bc3RhY2tfdG9wXSA9IG9sZF9zdGF0ZV9wb29sX3RvcDsKKwogCSAgICBuZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBTQ09QRV9TSVpFOyBpKyspIHsKIAkgICAgICAgIC8vCiAJICAgICAgICAvLyBVc2UgdGhlIHNjb3BlIGxvb2thaGVhZCBzeW1ib2wgdG8gZm9yY2UgYWxsIHJlZHVjdGlvbnMKIAkgICAgICAgIC8vIGluZHVjaWJsZSBieSB0aGF0IHN5bWJvbC4KIAkgICAgICAgIC8vCiAJICAgICAgICBhY3QgPSBzdGNrW3N0YWNrX3RvcF07Ci0JICAgICAgICB0ZW1wU3RhY2tUb3AgPSBzdGFja190b3AgLSAxOworCSAgICAgICAgdGhpcy50ZW1wU3RhY2tUb3AgPSBzdGFja190b3AgLSAxOwogCSAgICAgICAgaW50IG1heF9wb3MgPSBzdGFja190b3A7CiAJICAgICAgICBpbnQgdG9rID0gUGFyc2VyLnNjb3BlX2xhW2ldOwotCSAgICAgICAgbGV4U3RyZWFtLnJlc2V0KGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKTsKKwkgICAgICAgIHRoaXMubGV4U3RyZWFtLnJlc2V0KHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0pOwogCSAgICAgICAgYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCSAgICAgICAgd2hpbGUoYWN0IDw9IE5VTV9SVUxFUykgewogCSAgICAgICAgICAgIC8vCkBAIC0xMzc5LDIwICsxNDAyLDIwIEBACiAJICAgICAgICAgICAgLy8gcmVkdWN0aW9uLCB1bnRpbCBhIGdvdG8gYWN0aW9uIGlzIGNvbXB1dGVkIC4uLgogCSAgICAgICAgICAgIC8vCiAJICAgICAgICAgICAgZG8gIHsKLQkgICAgICAgICAgICAgICAgdGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CisJICAgICAgICAgICAgICAgIHRoaXMudGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CiAJICAgICAgICAgICAgICAgIGludCBsaHNfc3ltYm9sID0gUGFyc2VyLmxoc1thY3RdOwotCSAgICAgICAgICAgICAgICBhY3QgPSAgKHRlbXBTdGFja1RvcCA+IG1heF9wb3MKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAgdGVtcFN0YWNrW3RlbXBTdGFja1RvcF0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgc3Rja1t0ZW1wU3RhY2tUb3BdKTsKKwkgICAgICAgICAgICAgICAgYWN0ID0gICh0aGlzLnRlbXBTdGFja1RvcCA+IG1heF9wb3MKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAgdGhpcy50ZW1wU3RhY2tbdGhpcy50ZW1wU3RhY2tUb3BdCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIHN0Y2tbdGhpcy50ZW1wU3RhY2tUb3BdKTsKIAkgICAgICAgICAgICAgICAgYWN0ID0gUGFyc2VyLm50QWN0aW9uKGFjdCwgbGhzX3N5bWJvbCk7CiAJICAgICAgICAgICAgfSAgd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7Ci0JICAgICAgICAgICAgaWYgKHRlbXBTdGFja1RvcCArIDEgPj0gc3RhY2tMZW5ndGgpCisJICAgICAgICAgICAgaWYgKHRoaXMudGVtcFN0YWNrVG9wICsgMSA+PSB0aGlzLnN0YWNrTGVuZ3RoKQogCSAgICAgICAgICAgICAgICByZXR1cm47Ci0JICAgICAgICAgICAgbWF4X3BvcyA9IG1heF9wb3MgPCB0ZW1wU3RhY2tUb3AgPyBtYXhfcG9zIDogdGVtcFN0YWNrVG9wOwotCSAgICAgICAgICAgIHRlbXBTdGFja1t0ZW1wU3RhY2tUb3AgKyAxXSA9IGFjdDsKKwkgICAgICAgICAgICBtYXhfcG9zID0gbWF4X3BvcyA8IHRoaXMudGVtcFN0YWNrVG9wID8gbWF4X3BvcyA6IHRoaXMudGVtcFN0YWNrVG9wOworCSAgICAgICAgICAgIHRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wICsgMV0gPSBhY3Q7CiAJICAgICAgICAgICAgYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCB0b2spOwogCSAgICAgICAgfQotCQorCiAJICAgICAgICAvLwogCSAgICAgICAgLy8gSWYgdGhlIGxvb2thaGVhZCBzeW1ib2wgaXMgcGFyc2FibGUsIHRoZW4gd2UgY2hlY2sKIAkgICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSBtYXRjaCBiZXR3ZWVuIHRoZSBzY29wZQpAQCAtMTQwMiw5ICsxNDI1LDkgQEAKIAkgICAgICAgIGlmIChhY3QgIT0gRVJST1JfQUNUSU9OKSB7CiAJICAgICAgICAJaW50IGosIGs7CiAJICAgICAgICAgICAgayA9IFBhcnNlci5zY29wZV9wcmVmaXhbaV07Ci0JICAgICAgICAgICAgZm9yIChqID0gdGVtcFN0YWNrVG9wICsgMTsKKwkgICAgICAgICAgICBmb3IgKGogPSB0aGlzLnRlbXBTdGFja1RvcCArIDE7CiAJICAgICAgICAgICAgICAgICBqID49IChtYXhfcG9zICsgMSkgJiYKLQkgICAgICAgICAgICAgICAgIFBhcnNlci5pbl9zeW1ib2wodGVtcFN0YWNrW2pdKSA9PSBQYXJzZXIuc2NvcGVfcmhzW2tdOyBqLS0pIHsKKwkgICAgICAgICAgICAgICAgIFBhcnNlci5pbl9zeW1ib2wodGhpcy50ZW1wU3RhY2tbal0pID09IFBhcnNlci5zY29wZV9yaHNba107IGotLSkgewogCSAgICAgICAgICAgICAgICAgaysrOwogCSAgICAgICAgICAgIH0KIAkgICAgICAgICAgICBpZiAoaiA9PSBtYXhfcG9zKSB7CkBAIC0xNDY5LDIzICsxNDkyLDIzIEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdCA9IFBhcnNlci5udEFjdGlvbihzdGNrW3RvcF0sIFBhcnNlci5saHNbYWN0XSk7CiAJICAgICAgICAgICAgICAgICAgICAgICAgfQogCSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCsrOwotCQorCiAJICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGFjdDsKIAkgICAgICAgICAgICAgICAgICAgICAgICBhY3QgPSBzdGNrW3RvcF07ICAvLyBzYXZlCiAJICAgICAgICAgICAgICAgICAgICAgICAgc3Rja1t0b3BdID0gajsgICAgLy8gc3dhcAogCSAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVHJpYWxDaGVjayhzdGNrLCB0b3AsIHJlcGFpciwgaW5keCsxKTsKIAkgICAgICAgICAgICAgICAgICAgICAgICBzdGNrW3RvcF0gPSBhY3Q7IC8vIHJlc3RvcmUKIAkgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiByZXBhaXIuZGlzdGFuY2UpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY29wZVN0YWNrVG9wID0gaW5keDsKKwkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlU3RhY2tUb3AgPSBpbmR4OwogCSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpci5kaXN0YW5jZSA9IGRpc3RhbmNlOwogCSAgICAgICAgICAgICAgICAgICAgfQotCQotCSAgICAgICAgICAgICAgICAgICAgaWYgKGxleFN0cmVhbS5raW5kKGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKSA9PSBFT0ZUX1NZTUJPTCAmJgorCisJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKSA9PSBFT0ZUX1NZTUJPTCAmJgogCSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpci5kaXN0YW5jZSA9PSBwcmV2aW91c19kaXN0YW5jZSkgewotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlU3RhY2tUb3AgPSBpbmR4OworCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NvcGVTdGFja1RvcCA9IGluZHg7CiAJICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWlyLmRpc3RhbmNlID0gTUFYX0RJU1RBTkNFOwogCSAgICAgICAgICAgICAgICAgICAgfQotCQorCiAJICAgICAgICAgICAgICAgICAgICAvLwogCSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzY29wZSByZWNvdmVyeSBoYXMgYmVhdGVuIHRoZQogCSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgZGlzdGFuY2UsIHRoZW4gd2UgaGF2ZSBmb3VuZCBhCkBAIC0xNDk1LDggKzE1MTgsOCBAQAogCSAgICAgICAgICAgICAgICAgICAgLy8gKElORFgpIGluIFNDT1BFX0lOREVYIGFuZCBTQ09QRV9TVEFDSy4KIAkgICAgICAgICAgICAgICAgICAgIC8vCiAJICAgICAgICAgICAgICAgICAgICBpZiAocmVwYWlyLmRpc3RhbmNlID4gcHJldmlvdXNfZGlzdGFuY2UpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY29wZUluZGV4W2luZHhdID0gaTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY29wZVBvc2l0aW9uW2luZHhdID0gc3RhY2tfcG9zaXRpb247CisJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY29wZUluZGV4W2luZHhdID0gaTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlUG9zaXRpb25baW5keF0gPSBzdGFja19wb3NpdGlvbjsKIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAJICAgICAgICAgICAgICAgICAgICB9CiAJICAgICAgICAgICAgICAgIH0KQEAgLTE1MTksMTIgKzE1NDIsMTIgQEAKIAogCQlmb3IgKHRvcCA9IHN0YWNrX3RvcCAtIDE7IHRvcCA+PSAwOyB0b3AtLSkgewogCQkJaiA9IHBhcnNlQ2hlY2soc3RjaywgdG9wLAotCQkJCQkJICAgbGV4U3RyZWFtLmtpbmQoYnVmZmVyW2J1ZmZlcl9wb3NpdGlvbl0pLAorCQkJCQkJICAgdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltidWZmZXJfcG9zaXRpb25dKSwKIAkJCQkJCSAgIGJ1ZmZlcl9wb3NpdGlvbiArIDEpOwogCQkJaWYgKCgoaiAtIGJ1ZmZlcl9wb3NpdGlvbiArIDEpID4gTUlOX0RJU1RBTkNFKSAmJiAoaiA+IGRpc3RhbmNlKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlQcmltYXJ5UmVwYWlySW5mbyByZXBhaXIgPSBuZXcgUHJpbWFyeVJlcGFpckluZm8oKTsKIAkgICAgcmVwYWlyLmJ1ZmZlclBvc2l0aW9uID0gYnVmZmVyX3Bvc2l0aW9uICsgMTsKIAkgICAgcmVwYWlyLmRpc3RhbmNlID0gZGlzdGFuY2U7CkBAIC0xNTY4LDE3ICsxNTkxLDE3IEBACiAJCS8vIElmIHRoZSBuZXh0X3N0YWNrIGlzIGF2YWlsYWJsZSwgdHJ5IG1pc3BsYWNlZCBhbmQgc2Vjb25kYXJ5CiAJCS8vIHJlY292ZXJ5IG9uIGl0IGZpcnN0LgogCQkvLwotCQlpZiAobmV4dFN0YWNrVG9wID49IDApIHsKKwkJaWYgKHRoaXMubmV4dFN0YWNrVG9wID49IDApIHsKIAkJCWludCAgc2F2ZV9sb2NhdGlvbjsKIAotCQkJYnVmZmVyWzJdID0gZXJyb3JfdG9rZW47Ci0JCQlidWZmZXJbMV0gPSBsZXhTdHJlYW0ucHJldmlvdXMoYnVmZmVyWzJdKTsKLQkJCWJ1ZmZlclswXSA9IGxleFN0cmVhbS5wcmV2aW91cyhidWZmZXJbMV0pOworCQkJdGhpcy5idWZmZXJbMl0gPSBlcnJvcl90b2tlbjsKKwkJCXRoaXMuYnVmZmVyWzFdID0gdGhpcy5sZXhTdHJlYW0ucHJldmlvdXModGhpcy5idWZmZXJbMl0pOworCQkJdGhpcy5idWZmZXJbMF0gPSB0aGlzLmxleFN0cmVhbS5wcmV2aW91cyh0aGlzLmJ1ZmZlclsxXSk7CiAKIAkJCWZvciAoayA9IDM7IGsgPCBCVUZGX1VCT1VORDsgaysrKQotCQkJCWJ1ZmZlcltrXSA9IGxleFN0cmVhbS5uZXh0KGJ1ZmZlcltrIC0gMV0pOworCQkJCXRoaXMuYnVmZmVyW2tdID0gdGhpcy5sZXhTdHJlYW0ubmV4dCh0aGlzLmJ1ZmZlcltrIC0gMV0pOwogCi0JCQlidWZmZXJbQlVGRl9VQk9VTkRdID0gbGV4U3RyZWFtLmJhZHRva2VuKCk7Ly8gZWxtdCBub3QgYXZhaWxhYmxlCisJCQl0aGlzLmJ1ZmZlcltCVUZGX1VCT1VORF0gPSB0aGlzLmxleFN0cmVhbS5iYWR0b2tlbigpOy8vIGVsbXQgbm90IGF2YWlsYWJsZQogCiAJCQkvLwogCQkJLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbSwgY29tcHV0ZSB0aGUKQEAgLTE1ODcsNTcgKzE2MTAsNTcgQEAKIAkJCS8vCiAJCQlmb3IgKG5leHRfbGFzdF9pbmRleCA9IE1BWF9ESVNUQU5DRSAtIDE7CiAJCQkJIG5leHRfbGFzdF9pbmRleCA+PSAxICYmCi0JCQkJIGxleFN0cmVhbS5raW5kKGJ1ZmZlcltuZXh0X2xhc3RfaW5kZXhdKSA9PSBFT0ZUX1NZTUJPTDsKKwkJCQkgdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltuZXh0X2xhc3RfaW5kZXhdKSA9PSBFT0ZUX1NZTUJPTDsKIAkJCQkgbmV4dF9sYXN0X2luZGV4LS0pey8qZW1wdHkqL30KIAkJCW5leHRfbGFzdF9pbmRleCA9IG5leHRfbGFzdF9pbmRleCArIDE7CiAKLQkJCXNhdmVfbG9jYXRpb24gPSBsb2NhdGlvblN0YWNrW25leHRTdGFja1RvcF07Ci0JCQlpbnQgc2F2ZV9sb2NhdGlvbl9zdGFydCA9IGxvY2F0aW9uU3RhcnRTdGFja1tuZXh0U3RhY2tUb3BdOwotCQkJbG9jYXRpb25TdGFja1tuZXh0U3RhY2tUb3BdID0gYnVmZmVyWzJdOwotCQkJbG9jYXRpb25TdGFydFN0YWNrW25leHRTdGFja1RvcF0gPSBsZXhTdHJlYW0uc3RhcnQoYnVmZmVyWzJdKTsKLQkJCW1pc3BsYWNlZC5udW1EZWxldGlvbnMgPSBuZXh0U3RhY2tUb3A7Ci0JCQltaXNwbGFjZWQgPSBtaXNwbGFjZW1lbnRSZWNvdmVyeShuZXh0U3RhY2ssIG5leHRTdGFja1RvcCwKKwkJCXNhdmVfbG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uU3RhY2tbdGhpcy5uZXh0U3RhY2tUb3BdOworCQkJaW50IHNhdmVfbG9jYXRpb25fc3RhcnQgPSB0aGlzLmxvY2F0aW9uU3RhcnRTdGFja1t0aGlzLm5leHRTdGFja1RvcF07CisJCQl0aGlzLmxvY2F0aW9uU3RhY2tbdGhpcy5uZXh0U3RhY2tUb3BdID0gdGhpcy5idWZmZXJbMl07CisJCQl0aGlzLmxvY2F0aW9uU3RhcnRTdGFja1t0aGlzLm5leHRTdGFja1RvcF0gPSB0aGlzLmxleFN0cmVhbS5zdGFydCh0aGlzLmJ1ZmZlclsyXSk7CisJCQltaXNwbGFjZWQubnVtRGVsZXRpb25zID0gdGhpcy5uZXh0U3RhY2tUb3A7CisJCQltaXNwbGFjZWQgPSBtaXNwbGFjZW1lbnRSZWNvdmVyeSh0aGlzLm5leHRTdGFjaywgdGhpcy5uZXh0U3RhY2tUb3AsCiAJCQkJCQkJCQkJCSBuZXh0X2xhc3RfaW5kZXgsCiAJCQkJCQkJCQkJCSBtaXNwbGFjZWQsIHRydWUpOwogCQkJaWYgKG1pc3BsYWNlZC5yZWNvdmVyeU9uTmV4dFN0YWNrKQogCQkJCW1pc3BsYWNlZC5kaXN0YW5jZSsrOwogCi0JCQlyZXBhaXIubnVtRGVsZXRpb25zID0gbmV4dFN0YWNrVG9wICsgQlVGRl9VQk9VTkQ7Ci0JCQlyZXBhaXIgPSBzZWNvbmRhcnlSZWNvdmVyeShuZXh0U3RhY2ssIG5leHRTdGFja1RvcCwKKwkJCXJlcGFpci5udW1EZWxldGlvbnMgPSB0aGlzLm5leHRTdGFja1RvcCArIEJVRkZfVUJPVU5EOworCQkJcmVwYWlyID0gc2Vjb25kYXJ5UmVjb3ZlcnkodGhpcy5uZXh0U3RhY2ssIHRoaXMubmV4dFN0YWNrVG9wLAogCQkJCQkJCQkJICAgbmV4dF9sYXN0X2luZGV4LAogCQkJCQkJCQkJICAgcmVwYWlyLCB0cnVlKTsKIAkJCWlmIChyZXBhaXIucmVjb3ZlcnlPbk5leHRTdGFjaykKIAkJCQlyZXBhaXIuZGlzdGFuY2UrKzsKIAotCQkJbG9jYXRpb25TdGFja1tuZXh0U3RhY2tUb3BdID0gc2F2ZV9sb2NhdGlvbjsKLQkJCWxvY2F0aW9uU3RhcnRTdGFja1tuZXh0U3RhY2tUb3BdID0gc2F2ZV9sb2NhdGlvbl9zdGFydDsKKwkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLm5leHRTdGFja1RvcF0gPSBzYXZlX2xvY2F0aW9uOworCQkJdGhpcy5sb2NhdGlvblN0YXJ0U3RhY2tbdGhpcy5uZXh0U3RhY2tUb3BdID0gc2F2ZV9sb2NhdGlvbl9zdGFydDsKIAkJfSBlbHNlIHsgICAgICAgICAgICAvLyBuZXh0X3N0YWNrIG5vdCBhdmFpbGFibGUsIGluaXRpYWxpemUgLi4uCi0JCQltaXNwbGFjZWQubnVtRGVsZXRpb25zID0gc3RhdGVTdGFja1RvcDsKLQkJCXJlcGFpci5udW1EZWxldGlvbnMgPSBzdGF0ZVN0YWNrVG9wICsgQlVGRl9VQk9VTkQ7CisJCQltaXNwbGFjZWQubnVtRGVsZXRpb25zID0gdGhpcy5zdGF0ZVN0YWNrVG9wOworCQkJcmVwYWlyLm51bURlbGV0aW9ucyA9IHRoaXMuc3RhdGVTdGFja1RvcCArIEJVRkZfVUJPVU5EOwogCQl9CiAKIAkJLy8KIAkJLy8gVHJ5IHNlY29uZGFyeSByZWNvdmVyeSBvbiB0aGUgInN0YWNrIiBjb25maWd1cmF0aW9uLgogCQkvLwotCQlidWZmZXJbM10gPSBlcnJvcl90b2tlbjsKKwkJdGhpcy5idWZmZXJbM10gPSBlcnJvcl90b2tlbjsKIAotCQlidWZmZXJbMl0gPSBsZXhTdHJlYW0ucHJldmlvdXMoYnVmZmVyWzNdKTsKLQkJYnVmZmVyWzFdID0gbGV4U3RyZWFtLnByZXZpb3VzKGJ1ZmZlclsyXSk7Ci0JCWJ1ZmZlclswXSA9IGxleFN0cmVhbS5wcmV2aW91cyhidWZmZXJbMV0pOworCQl0aGlzLmJ1ZmZlclsyXSA9IHRoaXMubGV4U3RyZWFtLnByZXZpb3VzKHRoaXMuYnVmZmVyWzNdKTsKKwkJdGhpcy5idWZmZXJbMV0gPSB0aGlzLmxleFN0cmVhbS5wcmV2aW91cyh0aGlzLmJ1ZmZlclsyXSk7CisJCXRoaXMuYnVmZmVyWzBdID0gdGhpcy5sZXhTdHJlYW0ucHJldmlvdXModGhpcy5idWZmZXJbMV0pOwogCiAJCWZvciAoayA9IDQ7IGsgPCBCVUZGX1NJWkU7IGsrKykKLQkJCWJ1ZmZlcltrXSA9IGxleFN0cmVhbS5uZXh0KGJ1ZmZlcltrIC0gMV0pOworCQkJdGhpcy5idWZmZXJba10gPSB0aGlzLmxleFN0cmVhbS5uZXh0KHRoaXMuYnVmZmVyW2sgLSAxXSk7CiAKIAkJZm9yIChsYXN0X2luZGV4ID0gTUFYX0RJU1RBTkNFIC0gMTsKLQkJCSBsYXN0X2luZGV4ID49IDEgJiYgbGV4U3RyZWFtLmtpbmQoYnVmZmVyW2xhc3RfaW5kZXhdKSA9PSBFT0ZUX1NZTUJPTDsKKwkJCSBsYXN0X2luZGV4ID49IDEgJiYgdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltsYXN0X2luZGV4XSkgPT0gRU9GVF9TWU1CT0w7CiAJCQkgbGFzdF9pbmRleC0tKXsvKmVtcHR5Ki99CiAJCWxhc3RfaW5kZXgrKzsKIAotCQltaXNwbGFjZWQgPSBtaXNwbGFjZW1lbnRSZWNvdmVyeShzdGFjaywgc3RhdGVTdGFja1RvcCwKKwkJbWlzcGxhY2VkID0gbWlzcGxhY2VtZW50UmVjb3ZlcnkodGhpcy5zdGFjaywgdGhpcy5zdGF0ZVN0YWNrVG9wLAogCQkJCQkJCQkJCSBsYXN0X2luZGV4LAogCQkJCQkJCQkJCSBtaXNwbGFjZWQsIGZhbHNlKTsKIAotCQlyZXBhaXIgPSBzZWNvbmRhcnlSZWNvdmVyeShzdGFjaywgc3RhdGVTdGFja1RvcCwKKwkJcmVwYWlyID0gc2Vjb25kYXJ5UmVjb3ZlcnkodGhpcy5zdGFjaywgdGhpcy5zdGF0ZVN0YWNrVG9wLAogCQkJCQkJCQkgICBsYXN0X2luZGV4LCByZXBhaXIsIGZhbHNlKTsKIAogCQkvLwpAQCAtMTY2NCwyMSArMTY4NywyMSBAQAogCQkvLyBidWZmZXIsIGxvY2F0aW9uX3N0YWNrIGFuZCBsYXN0X2luZGV4LgogCQkvLwogCQlpZiAocmVwYWlyLnJlY292ZXJ5T25OZXh0U3RhY2spIHsKLQkJCXN0YXRlU3RhY2tUb3AgPSBuZXh0U3RhY2tUb3A7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IHN0YXRlU3RhY2tUb3A7IGkrKykKLQkJCQlzdGFja1tpXSA9IG5leHRTdGFja1tpXTsKKwkJCXRoaXMuc3RhdGVTdGFja1RvcCA9IHRoaXMubmV4dFN0YWNrVG9wOworCQkJZm9yIChpID0gMDsgaSA8PSB0aGlzLnN0YXRlU3RhY2tUb3A7IGkrKykKKwkJCQl0aGlzLnN0YWNrW2ldID0gdGhpcy5uZXh0U3RhY2tbaV07CiAKLQkJCWJ1ZmZlclsyXSA9IGVycm9yX3Rva2VuOwotCQkJYnVmZmVyWzFdID0gbGV4U3RyZWFtLnByZXZpb3VzKGJ1ZmZlclsyXSk7Ci0JCQlidWZmZXJbMF0gPSBsZXhTdHJlYW0ucHJldmlvdXMoYnVmZmVyWzFdKTsKKwkJCXRoaXMuYnVmZmVyWzJdID0gZXJyb3JfdG9rZW47CisJCQl0aGlzLmJ1ZmZlclsxXSA9IHRoaXMubGV4U3RyZWFtLnByZXZpb3VzKHRoaXMuYnVmZmVyWzJdKTsKKwkJCXRoaXMuYnVmZmVyWzBdID0gdGhpcy5sZXhTdHJlYW0ucHJldmlvdXModGhpcy5idWZmZXJbMV0pOwogCiAJCQlmb3IgKGsgPSAzOyBrIDwgQlVGRl9VQk9VTkQ7IGsrKykKLQkJCQlidWZmZXJba10gPSBsZXhTdHJlYW0ubmV4dChidWZmZXJbayAtIDFdKTsKKwkJCQl0aGlzLmJ1ZmZlcltrXSA9IHRoaXMubGV4U3RyZWFtLm5leHQodGhpcy5idWZmZXJbayAtIDFdKTsKIAotCQkJYnVmZmVyW0JVRkZfVUJPVU5EXSA9IGxleFN0cmVhbS5iYWR0b2tlbigpOy8vIGVsbXQgbm90IGF2YWlsYWJsZQorCQkJdGhpcy5idWZmZXJbQlVGRl9VQk9VTkRdID0gdGhpcy5sZXhTdHJlYW0uYmFkdG9rZW4oKTsvLyBlbG10IG5vdCBhdmFpbGFibGUKIAotCQkJbG9jYXRpb25TdGFja1tuZXh0U3RhY2tUb3BdID0gYnVmZmVyWzJdOwotCQkJbG9jYXRpb25TdGFydFN0YWNrW25leHRTdGFja1RvcF0gPSBsZXhTdHJlYW0uc3RhcnQoYnVmZmVyWzJdKTsKKwkJCXRoaXMubG9jYXRpb25TdGFja1t0aGlzLm5leHRTdGFja1RvcF0gPSB0aGlzLmJ1ZmZlclsyXTsKKwkJCXRoaXMubG9jYXRpb25TdGFydFN0YWNrW3RoaXMubmV4dFN0YWNrVG9wXSA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KHRoaXMuYnVmZmVyWzJdKTsKIAkJCWxhc3RfaW5kZXggPSBuZXh0X2xhc3RfaW5kZXg7CiAJCX0KIApAQCAtMTY4OCw0NSArMTcxMSw0NSBAQAogCSAgICAvLwogCSAgICBpZiAocmVwYWlyLmNvZGUgPT0gU0VDT05EQVJZX0NPREUgfHwgcmVwYWlyLmNvZGUgPT0gREVMRVRJT05fQ09ERSkgewogCSAgICAgICAgUHJpbWFyeVJlcGFpckluZm8gc2NvcGVfcmVwYWlyID0gbmV3IFByaW1hcnlSZXBhaXJJbmZvKCk7Ci0JCisKIAkgICAgICAgIHNjb3BlX3JlcGFpci5kaXN0YW5jZSA9IDA7CiAJICAgICAgICBmb3IgKHNjb3BlX3JlcGFpci5idWZmZXJQb3NpdGlvbiA9IDI7CiAJICAgICAgICAgICAgIHNjb3BlX3JlcGFpci5idWZmZXJQb3NpdGlvbiA8PSByZXBhaXIuYnVmZmVyUG9zaXRpb24gJiYKIAkgICAgICAgICAgICAgcmVwYWlyLmNvZGUgIT0gU0NPUEVfQ09ERTsgc2NvcGVfcmVwYWlyLmJ1ZmZlclBvc2l0aW9uKyspIHsKLQkgICAgICAgICAgICBzY29wZV9yZXBhaXIgPSBzY29wZVRyaWFsKHN0YWNrLCBzdGF0ZVN0YWNrVG9wLCBzY29wZV9yZXBhaXIpOworCSAgICAgICAgICAgIHNjb3BlX3JlcGFpciA9IHNjb3BlVHJpYWwodGhpcy5zdGFjaywgdGhpcy5zdGF0ZVN0YWNrVG9wLCBzY29wZV9yZXBhaXIpOwogCSAgICAgICAgICAgIGogPSAoc2NvcGVfcmVwYWlyLmRpc3RhbmNlID09IE1BWF9ESVNUQU5DRQogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxhc3RfaW5kZXgKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzY29wZV9yZXBhaXIuZGlzdGFuY2UpOwogCSAgICAgICAgICAgIGsgPSBzY29wZV9yZXBhaXIuYnVmZmVyUG9zaXRpb24gLSAxOwogCSAgICAgICAgICAgIGlmICgoaiAtIGspID4gTUlOX0RJU1RBTkNFICYmIChqIC0gaykgPiAocmVwYWlyLmRpc3RhbmNlIC0gcmVwYWlyLm51bURlbGV0aW9ucykpIHsKIAkgICAgICAgICAgICAgICAgcmVwYWlyLmNvZGUgPSBTQ09QRV9DT0RFOwotCSAgICAgICAgICAgICAgICBpID0gc2NvcGVJbmRleFtzY29wZVN0YWNrVG9wXTsgICAgICAgLy8gdXBwZXIgYm91bmQKKwkgICAgICAgICAgICAgICAgaSA9IHRoaXMuc2NvcGVJbmRleFt0aGlzLnNjb3BlU3RhY2tUb3BdOyAgICAgICAvLyB1cHBlciBib3VuZAogCSAgICAgICAgICAgICAgICByZXBhaXIuc3ltYm9sID0gUGFyc2VyLnNjb3BlX2xoc1tpXSArIE5UX09GRlNFVDsKLQkgICAgICAgICAgICAgICAgcmVwYWlyLnN0YWNrUG9zaXRpb24gPSBzdGF0ZVN0YWNrVG9wOworCSAgICAgICAgICAgICAgICByZXBhaXIuc3RhY2tQb3NpdGlvbiA9IHRoaXMuc3RhdGVTdGFja1RvcDsKIAkgICAgICAgICAgICAgICAgcmVwYWlyLmJ1ZmZlclBvc2l0aW9uID0gc2NvcGVfcmVwYWlyLmJ1ZmZlclBvc2l0aW9uOwogCSAgICAgICAgICAgIH0KIAkgICAgICAgIH0KIAkgICAgfQotCQorCiAJICAgIC8vCiAJICAgIC8vIElmIG5vIHN1Y2Nlc3NmdWwgcmVjb3ZlcnkgaXMgZm91bmQgYW5kIHdlIGhhdmUgcmVhY2hlZCB0aGUKIAkgICAgLy8gZW5kIG9mIHRoZSBmaWxlLCBjaGVjayB3aGV0aGVyIG9yIG5vdCBzY29wZSByZWNvdmVyeSBpcwogCSAgICAvLyBhcHBsaWNhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYWZ0ZXIgZGlzY2FyZGluZyBzb21lCiAJICAgIC8vIHN0YXRlcy4KIAkgICAgLy8KLQkgICAgaWYgKHJlcGFpci5jb2RlID09IDAgJiYgbGV4U3RyZWFtLmtpbmQoYnVmZmVyW2xhc3RfaW5kZXhdKSA9PSBFT0ZUX1NZTUJPTCkgeworCSAgICBpZiAocmVwYWlyLmNvZGUgPT0gMCAmJiB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuYnVmZmVyW2xhc3RfaW5kZXhdKSA9PSBFT0ZUX1NZTUJPTCkgewogCSAgICAgICAgUHJpbWFyeVJlcGFpckluZm8gc2NvcGVfcmVwYWlyID0gbmV3IFByaW1hcnlSZXBhaXJJbmZvKCk7Ci0JCisKIAkgICAgICAgIHNjb3BlX3JlcGFpci5idWZmZXJQb3NpdGlvbiA9IGxhc3RfaW5kZXg7CiAJICAgICAgICBzY29wZV9yZXBhaXIuZGlzdGFuY2UgPSAwOwotCSAgICAgICAgZm9yICh0b3AgPSBzdGF0ZVN0YWNrVG9wOworCSAgICAgICAgZm9yICh0b3AgPSB0aGlzLnN0YXRlU3RhY2tUb3A7CiAJICAgICAgICAgICAgIHRvcCA+PSAwICYmIHJlcGFpci5jb2RlID09IDA7IHRvcC0tKQogCSAgICAgICAgewotCSAgICAgICAgICAgIHNjb3BlX3JlcGFpciA9IHNjb3BlVHJpYWwoc3RhY2ssIHRvcCwgc2NvcGVfcmVwYWlyKTsKKwkgICAgICAgICAgICBzY29wZV9yZXBhaXIgPSBzY29wZVRyaWFsKHRoaXMuc3RhY2ssIHRvcCwgc2NvcGVfcmVwYWlyKTsKIAkgICAgICAgICAgICBpZiAoc2NvcGVfcmVwYWlyLmRpc3RhbmNlID4gMCkKIAkgICAgICAgICAgICB7CiAJICAgICAgICAgICAgICAgIHJlcGFpci5jb2RlID0gU0NPUEVfQ09ERTsKLQkgICAgICAgICAgICAgICAgaSA9IHNjb3BlSW5kZXhbc2NvcGVTdGFja1RvcF07ICAgIC8vIHVwcGVyIGJvdW5kCisJICAgICAgICAgICAgICAgIGkgPSB0aGlzLnNjb3BlSW5kZXhbdGhpcy5zY29wZVN0YWNrVG9wXTsgICAgLy8gdXBwZXIgYm91bmQKIAkgICAgICAgICAgICAgICAgcmVwYWlyLnN5bWJvbCA9IFBhcnNlci5zY29wZV9saHNbaV0gKyBOVF9PRkZTRVQ7CiAJICAgICAgICAgICAgICAgIHJlcGFpci5zdGFja1Bvc2l0aW9uID0gdG9wOwogCSAgICAgICAgICAgICAgICByZXBhaXIuYnVmZmVyUG9zaXRpb24gPSBzY29wZV9yZXBhaXIuYnVmZmVyUG9zaXRpb247CkBAIC0xNzQ4LDI0ICsxNzcxLDI0IEBACiAJCS8vCiAJCXN3aXRjaChyZXBhaXIuY29kZSkgewogCQkJY2FzZSBNSVNQTEFDRURfQ09ERToKLQkJCQkgY2FuZGlkYXRlLmxvY2F0aW9uID0gYnVmZmVyWzJdOwotCQkJCSBjYW5kaWRhdGUuc3ltYm9sID0gbGV4U3RyZWFtLmtpbmQoYnVmZmVyWzJdKTsKLQkJCQkgbGV4U3RyZWFtLnJlc2V0KGxleFN0cmVhbS5uZXh0KGJ1ZmZlclsyXSkpOworCQkJCSBjYW5kaWRhdGUubG9jYXRpb24gPSB0aGlzLmJ1ZmZlclsyXTsKKwkJCQkgY2FuZGlkYXRlLnN5bWJvbCA9IHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbMl0pOworCQkJCSB0aGlzLmxleFN0cmVhbS5yZXNldCh0aGlzLmxleFN0cmVhbS5uZXh0KHRoaXMuYnVmZmVyWzJdKSk7CiAKIAkJCQkgYnJlYWs7CiAKIAkJCWNhc2UgREVMRVRJT05fQ09ERToKLQkJCQkgY2FuZGlkYXRlLmxvY2F0aW9uID0gYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl07CisJCQkJIGNhbmRpZGF0ZS5sb2NhdGlvbiA9IHRoaXMuYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl07CiAJCQkJIGNhbmRpZGF0ZS5zeW1ib2wgPQotCQkJCQkJICAgbGV4U3RyZWFtLmtpbmQoYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0pOwotCQkJCSBsZXhTdHJlYW0ucmVzZXQobGV4U3RyZWFtLm5leHQoYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0pKTsKKwkJCQkJCSAgIHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSk7CisJCQkJIHRoaXMubGV4U3RyZWFtLnJlc2V0KHRoaXMubGV4U3RyZWFtLm5leHQodGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uXSkpOwogCiAJCQkJIGJyZWFrOwogCiAJCWRlZmF1bHQ6IC8vIFNDT1BFX0NPREUgfHwgU0VDT05EQVJZX0NPREUKIAkJCQkgY2FuZGlkYXRlLnN5bWJvbCA9IHJlcGFpci5zeW1ib2w7Ci0JCQkJIGNhbmRpZGF0ZS5sb2NhdGlvbiA9IGJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dOwotCQkJCSBsZXhTdHJlYW0ucmVzZXQoYnVmZmVyW3JlcGFpci5idWZmZXJQb3NpdGlvbl0pOworCQkJCSBjYW5kaWRhdGUubG9jYXRpb24gPSB0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dOworCQkJCSB0aGlzLmxleFN0cmVhbS5yZXNldCh0aGlzLmJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb25dKTsKIAogCQkJCSBicmVhazsKIAkJfQpAQCAtMTc4MCwxNiArMTgwMywxNiBAQAogLy8JICAgdGhlIGJlc3QgbWlzcGxhY2VtZW50IHJlY292ZXJ5IGNvbXB1dGVkIHByZXZpb3VzbHkuCiAvLwogCXByaXZhdGUgU2Vjb25kYXJ5UmVwYWlySW5mbyBtaXNwbGFjZW1lbnRSZWNvdmVyeShpbnQgc3Rja1tdLCBpbnQgc3RhY2tfdG9wLCBpbnQgbGFzdF9pbmRleCwgU2Vjb25kYXJ5UmVwYWlySW5mbyByZXBhaXIsIGJvb2xlYW4gc3RhY2tfZmxhZykgewotCQlpbnQgIHByZXZpb3VzX2xvYyA9IGJ1ZmZlclsyXTsKKwkJaW50ICBwcmV2aW91c19sb2MgPSB0aGlzLmJ1ZmZlclsyXTsKIAkJaW50IHN0YWNrX2RlbGV0aW9ucyA9IDA7CiAKIAkJZm9yIChpbnQgdG9wID0gc3RhY2tfdG9wIC0gMTsgdG9wID49IDA7IHRvcC0tKSB7Ci0JCQlpZiAobG9jYXRpb25TdGFja1t0b3BdIDwgcHJldmlvdXNfbG9jKSB7CisJCQlpZiAodGhpcy5sb2NhdGlvblN0YWNrW3RvcF0gPCBwcmV2aW91c19sb2MpIHsKIAkJCQlzdGFja19kZWxldGlvbnMrKzsKIAkJCX0KLQkJCXByZXZpb3VzX2xvYyA9IGxvY2F0aW9uU3RhY2tbdG9wXTsKKwkJCXByZXZpb3VzX2xvYyA9IHRoaXMubG9jYXRpb25TdGFja1t0b3BdOwogCi0JCQlpbnQgaiA9IHBhcnNlQ2hlY2soc3RjaywgdG9wLCBsZXhTdHJlYW0ua2luZChidWZmZXJbMl0pLCAzKTsKKwkJCWludCBqID0gcGFyc2VDaGVjayhzdGNrLCB0b3AsIHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbMl0pLCAzKTsKIAkJCWlmIChqID09IE1BWF9ESVNUQU5DRSkgewogCQkJCSBqID0gbGFzdF9pbmRleDsKIAkJCX0KQEAgLTE4MTMsMTggKzE4MzYsMTggQEAKIAlwcml2YXRlIFNlY29uZGFyeVJlcGFpckluZm8gc2Vjb25kYXJ5UmVjb3ZlcnkoaW50IHN0Y2tbXSxpbnQgc3RhY2tfdG9wLCBpbnQgbGFzdF9pbmRleCwgU2Vjb25kYXJ5UmVwYWlySW5mbyByZXBhaXIsIGJvb2xlYW4gc3RhY2tfZmxhZykgewogCQlpbnQgcHJldmlvdXNfbG9jOwogCQlpbnQgc3RhY2tfZGVsZXRpb25zID0gMDsKLQkJCi0JCXByZXZpb3VzX2xvYyA9IGJ1ZmZlclsyXTsKKworCQlwcmV2aW91c19sb2MgPSB0aGlzLmJ1ZmZlclsyXTsKIAkJZm9yIChpbnQgdG9wID0gc3RhY2tfdG9wOyB0b3AgPj0gMCAmJiByZXBhaXIubnVtRGVsZXRpb25zID49IHN0YWNrX2RlbGV0aW9uczsgdG9wLS0pIHsKLQkJCWlmIChsb2NhdGlvblN0YWNrW3RvcF0gPCBwcmV2aW91c19sb2MpIHsKKwkJCWlmICh0aGlzLmxvY2F0aW9uU3RhY2tbdG9wXSA8IHByZXZpb3VzX2xvYykgewogCQkJCXN0YWNrX2RlbGV0aW9ucysrOwogCQkJfQotCQkJcHJldmlvdXNfbG9jID0gbG9jYXRpb25TdGFja1t0b3BdOworCQkJcHJldmlvdXNfbG9jID0gdGhpcy5sb2NhdGlvblN0YWNrW3RvcF07CiAKIAkJCWZvciAoaW50IGkgPSAyOwogCQkJCSBpIDw9IChsYXN0X2luZGV4IC0gTUlOX0RJU1RBTkNFICsgMSkgJiYKIAkJCQkgKHJlcGFpci5udW1EZWxldGlvbnMgPj0gKHN0YWNrX2RlbGV0aW9ucyArIGkgLSAxKSk7IGkrKykgewotCQkJCWludCBqID0gcGFyc2VDaGVjayhzdGNrLCB0b3AsIGxleFN0cmVhbS5raW5kKGJ1ZmZlcltpXSksIGkgKyAxKTsKKwkJCQlpbnQgaiA9IHBhcnNlQ2hlY2soc3RjaywgdG9wLCB0aGlzLmxleFN0cmVhbS5raW5kKHRoaXMuYnVmZmVyW2ldKSwgaSArIDEpOwogCiAJCQkJaWYgKGogPT0gTUFYX0RJU1RBTkNFKSB7CiAJCQkJCSBqID0gbGFzdF9pbmRleDsKQEAgLTE4NzgsMjcgKzE5MDEsMjcgQEAKIAlwcml2YXRlIHZvaWQgc2Vjb25kYXJ5RGlhZ25vc2lzKFNlY29uZGFyeVJlcGFpckluZm8gcmVwYWlyKSB7CiAJCXN3aXRjaChyZXBhaXIuY29kZSkgewogCQkJY2FzZSBTQ09QRV9DT0RFOiB7Ci0JICAgICAgICAgICAgaWYgKHJlcGFpci5zdGFja1Bvc2l0aW9uIDwgc3RhdGVTdGFja1RvcCkgeworCSAgICAgICAgICAgIGlmIChyZXBhaXIuc3RhY2tQb3NpdGlvbiA8IHRoaXMuc3RhdGVTdGFja1RvcCkgewogCSAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihERUxFVElPTl9DT0RFLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXIudGVybWluYWxfaW5kZXhbRVJST1JfU1lNQk9MXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25TdGFja1tyZXBhaXIuc3RhY2tQb3NpdGlvbl0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclsxXSk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25TdGFja1tyZXBhaXIuc3RhY2tQb3NpdGlvbl0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyWzFdKTsKIAkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY29wZVN0YWNrVG9wOyBpKyspIHsKKwkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2NvcGVTdGFja1RvcDsgaSsrKSB7CiAJICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKFNDT1BFX0NPREUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zY29wZUluZGV4W2ldLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblN0YWNrW3Njb3BlUG9zaXRpb25baV1dLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbMV0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlci5ub25fdGVybWluYWxfaW5kZXhbUGFyc2VyLnNjb3BlX2xoc1tzY29wZUluZGV4W2ldXV0pOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtdGhpcy5zY29wZUluZGV4W2ldLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uU3RhY2tbdGhpcy5zY29wZVBvc2l0aW9uW2ldXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbMV0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlci5ub25fdGVybWluYWxfaW5kZXhbUGFyc2VyLnNjb3BlX2xoc1t0aGlzLnNjb3BlSW5kZXhbaV1dXSk7CiAJICAgICAgICAgICAgfQotCQotCSAgICAgICAgICAgIHJlcGFpci5zeW1ib2wgPSBQYXJzZXIuc2NvcGVfbGhzW3Njb3BlSW5kZXhbc2NvcGVTdGFja1RvcF1dICsgTlRfT0ZGU0VUOwotCSAgICAgICAgICAgIHN0YXRlU3RhY2tUb3AgPSBzY29wZVBvc2l0aW9uW3Njb3BlU3RhY2tUb3BdOworCisJICAgICAgICAgICAgcmVwYWlyLnN5bWJvbCA9IFBhcnNlci5zY29wZV9saHNbdGhpcy5zY29wZUluZGV4W3RoaXMuc2NvcGVTdGFja1RvcF1dICsgTlRfT0ZGU0VUOworCSAgICAgICAgICAgIHRoaXMuc3RhdGVTdGFja1RvcCA9IHRoaXMuc2NvcGVQb3NpdGlvblt0aGlzLnNjb3BlU3RhY2tUb3BdOwogCSAgICAgICAgICAgIHJlcG9ydEVycm9yKFNDT1BFX0NPREUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgLXNjb3BlSW5kZXhbc2NvcGVTdGFja1RvcF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25TdGFja1tzY29wZVBvc2l0aW9uW3Njb3BlU3RhY2tUb3BdXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbMV0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnRlcm1JbmRleChzdGFja1tzdGF0ZVN0YWNrVG9wXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAtdGhpcy5zY29wZUluZGV4W3RoaXMuc2NvcGVTdGFja1RvcF0sCisJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblN0YWNrW3RoaXMuc2NvcGVQb3NpdGlvblt0aGlzLnNjb3BlU3RhY2tUb3BdXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlclsxXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBnZXROdGVybUluZGV4KHRoaXMuc3RhY2tbdGhpcy5zdGF0ZVN0YWNrVG9wXSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpci5zeW1ib2wsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXIuYnVmZmVyUG9zaXRpb24pCiAJICAgICAgICAgICAgICAgICAgICAgICApOwpAQCAtMTkwNywxMyArMTkzMCwxMyBAQAogCQkJZGVmYXVsdDogewogCQkJCXJlcG9ydEVycm9yKHJlcGFpci5jb2RlLAogCQkJCQkJCShyZXBhaXIuY29kZSA9PSBTRUNPTkRBUllfQ09ERQotCQkJCQkJCQkJCSAgPyBnZXROdGVybUluZGV4KHN0YWNrW3JlcGFpci5zdGFja1Bvc2l0aW9uXSwKKwkJCQkJCQkJCQkgID8gZ2V0TnRlcm1JbmRleCh0aGlzLnN0YWNrW3JlcGFpci5zdGFja1Bvc2l0aW9uXSwKIAkJCQkJCQkJCQkJCQkJICByZXBhaXIuc3ltYm9sLAogCQkJCQkJCQkJCQkJCQkgIHJlcGFpci5idWZmZXJQb3NpdGlvbikKIAkJCQkJCQkJCQkgIDogUGFyc2VyLnRlcm1pbmFsX2luZGV4W0VSUk9SX1NZTUJPTF0pLAotCQkJCQkJCWxvY2F0aW9uU3RhY2tbcmVwYWlyLnN0YWNrUG9zaXRpb25dLAotCQkJCQkJCWJ1ZmZlcltyZXBhaXIuYnVmZmVyUG9zaXRpb24gLSAxXSk7Ci0JCQkJc3RhdGVTdGFja1RvcCA9IHJlcGFpci5zdGFja1Bvc2l0aW9uOworCQkJCQkJCXRoaXMubG9jYXRpb25TdGFja1tyZXBhaXIuc3RhY2tQb3NpdGlvbl0sCisJCQkJCQkJdGhpcy5idWZmZXJbcmVwYWlyLmJ1ZmZlclBvc2l0aW9uIC0gMV0pOworCQkJCXRoaXMuc3RhdGVTdGFja1RvcCA9IHJlcGFpci5zdGFja1Bvc2l0aW9uOwogCQkJfQogCQl9CiAJfQpAQCAtMTkzOCwyMyArMTk2MSwyMyBAQAogCQkvLwogCQlhY3QgPSBzdGNrW3N0YWNrX3RvcF07CiAJCWlmIChmaXJzdF90b2tlbiA+IE5UX09GRlNFVCkgewotCQkJdGVtcFN0YWNrVG9wID0gc3RhY2tfdG9wOwotCQkJaWYoREVCVUdfUEFSU0VDSEVDSykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZW1wU3RhY2tUb3ApOworCQkJdGhpcy50ZW1wU3RhY2tUb3AgPSBzdGFja190b3A7CisJCQlpZih0aGlzLkRFQlVHX1BBUlNFQ0hFQ0spIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy50ZW1wU3RhY2tUb3ApOwogCQkJfQogCQkJbWF4X3BvcyA9IHN0YWNrX3RvcDsKIAkJCWluZHggPSBidWZmZXJfcG9zaXRpb247Ci0JCQljdCA9IGxleFN0cmVhbS5raW5kKGJ1ZmZlcltpbmR4XSk7Ci0JCQlsZXhTdHJlYW0ucmVzZXQobGV4U3RyZWFtLm5leHQoYnVmZmVyW2luZHhdKSk7CisJCQljdCA9IHRoaXMubGV4U3RyZWFtLmtpbmQodGhpcy5idWZmZXJbaW5keF0pOworCQkJdGhpcy5sZXhTdHJlYW0ucmVzZXQodGhpcy5sZXhTdHJlYW0ubmV4dCh0aGlzLmJ1ZmZlcltpbmR4XSkpOwogCQkJaW50IGxoc19zeW1ib2wgPSBmaXJzdF90b2tlbiAtIE5UX09GRlNFVDsKIAkJCWFjdCA9IFBhcnNlci5udEFjdGlvbihhY3QsIGxoc19zeW1ib2wpOwogCQkJaWYgKGFjdCA8PSBOVU1fUlVMRVMpIHsKIAkJCQkvLyBzYW1lIGxvb3AgYXMgJ3Byb2Nlc3Nfbm9uX3Rlcm1pbmFsJwogCQkJCWRvIHsKLQkJCQkJdGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7Ci0JCQkJCQotCQkJCQlpZihERUJVR19QQVJTRUNIRUNLKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KHRlbXBTdGFja1RvcCk7CisJCQkJCXRoaXMudGVtcFN0YWNrVG9wIC09IChQYXJzZXIucmhzW2FjdF0tMSk7CisKKwkJCQkJaWYodGhpcy5ERUJVR19QQVJTRUNIRUNLKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KHRoaXMudGVtcFN0YWNrVG9wKTsKIAkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAoIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCVN5c3RlbS5vdXQucHJpbnQoLShQYXJzZXIucmhzW2FjdF0tMSkpOwogCQkJCQkJU3lzdGVtLm91dC5wcmludCgiKSBbbWF4OiIpOyAvLyROT04tTkxTLTEkCkBAIC0xOTY1LDM1ICsxOTg4LDM1IEBACiAJCQkJCQlTeXN0ZW0ub3V0LnByaW50KFBhcnNlci5uYW1lW1BhcnNlci5ub25fdGVybWluYWxfaW5kZXhbUGFyc2VyLmxoc1thY3RdXV0pOwogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJaWYoUGFyc2VyLnJ1bGVzX2NvbXBsaWFuY2VbYWN0XSA+IHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCkgewogCQkJCQkgCXJldHVybiAwOwogCQkJCQl9CiAJCQkJCWxoc19zeW1ib2wgPSBQYXJzZXIubGhzW2FjdF07Ci0JCQkJCWFjdCA9ICh0ZW1wU3RhY2tUb3AgPiBtYXhfcG9zCi0JCQkJCQkJCQkJICA/IHRlbXBTdGFja1t0ZW1wU3RhY2tUb3BdCi0JCQkJCQkJCQkJICA6IHN0Y2tbdGVtcFN0YWNrVG9wXSk7CisJCQkJCWFjdCA9ICh0aGlzLnRlbXBTdGFja1RvcCA+IG1heF9wb3MKKwkJCQkJCQkJCQkgID8gdGhpcy50ZW1wU3RhY2tbdGhpcy50ZW1wU3RhY2tUb3BdCisJCQkJCQkJCQkJICA6IHN0Y2tbdGhpcy50ZW1wU3RhY2tUb3BdKTsKIAkJCQkJYWN0ID0gUGFyc2VyLm50QWN0aW9uKGFjdCwgbGhzX3N5bWJvbCk7CiAJCQkJfSB3aGlsZShhY3QgPD0gTlVNX1JVTEVTKTsKLQkKLQkJCQltYXhfcG9zID0gbWF4X3BvcyA8IHRlbXBTdGFja1RvcCA/IG1heF9wb3MgOiB0ZW1wU3RhY2tUb3A7CisKKwkJCQltYXhfcG9zID0gbWF4X3BvcyA8IHRoaXMudGVtcFN0YWNrVG9wID8gbWF4X3BvcyA6IHRoaXMudGVtcFN0YWNrVG9wOwogCQkJfQogCQl9IGVsc2UgewotCQkJdGVtcFN0YWNrVG9wID0gc3RhY2tfdG9wIC0gMTsKLQkJCQotCQkJaWYoREVCVUdfUEFSU0VDSEVDSykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZW1wU3RhY2tUb3ApOworCQkJdGhpcy50ZW1wU3RhY2tUb3AgPSBzdGFja190b3AgLSAxOworCisJCQlpZih0aGlzLkRFQlVHX1BBUlNFQ0hFQ0spIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy50ZW1wU3RhY2tUb3ApOwogCQkJfQotCQkJCi0JCQltYXhfcG9zID0gdGVtcFN0YWNrVG9wOworCisJCQltYXhfcG9zID0gdGhpcy50ZW1wU3RhY2tUb3A7CiAJCQlpbmR4ID0gYnVmZmVyX3Bvc2l0aW9uIC0gMTsKIAkJCWN0ID0gZmlyc3RfdG9rZW47Ci0JCQlsZXhTdHJlYW0ucmVzZXQoYnVmZmVyW2J1ZmZlcl9wb3NpdGlvbl0pOworCQkJdGhpcy5sZXhTdHJlYW0ucmVzZXQodGhpcy5idWZmZXJbYnVmZmVyX3Bvc2l0aW9uXSk7CiAJCX0KIAogCQlwcm9jZXNzX3Rlcm1pbmFsOiBmb3IgKDs7KSB7Ci0JCQlpZihERUJVR19QQVJTRUNIRUNLKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludCh0ZW1wU3RhY2tUb3AgKyAxKTsKKwkJCWlmKHRoaXMuREVCVUdfUEFSU0VDSEVDSykgeworCQkJCVN5c3RlbS5vdXQucHJpbnQodGhpcy50ZW1wU3RhY2tUb3AgKyAxKTsKIAkJCQlTeXN0ZW0ub3V0LnByaW50KCIgKCsxKSBbbWF4OiIpOyAvLyROT04tTkxTLTEkCiAJCQkJU3lzdGVtLm91dC5wcmludChtYXhfcG9zKTsKIAkJCQlTeXN0ZW0ub3V0LnByaW50KCJdXHRwcm9jZXNzX3Rlcm1pbmFsICAgIFx0Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTIwMDIsMTggKzIwMjUsMTggQEAKIAkJCQlTeXN0ZW0ub3V0LnByaW50KFBhcnNlci5uYW1lW1BhcnNlci50ZXJtaW5hbF9pbmRleFtjdF1dKTsKIAkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKIAkJCX0KLQkJCQotCQkJaWYgKCsrdGVtcFN0YWNrVG9wID49IHN0YWNrTGVuZ3RoKSAgLy8gU3RhY2sgb3ZlcmZsb3chISEKKworCQkJaWYgKCsrdGhpcy50ZW1wU3RhY2tUb3AgPj0gdGhpcy5zdGFja0xlbmd0aCkgIC8vIFN0YWNrIG92ZXJmbG93ISEhCiAJCQkJcmV0dXJuIGluZHg7Ci0JCQl0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXSA9IGFjdDsKKwkJCXRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wXSA9IGFjdDsKIAogCQkJYWN0ID0gUGFyc2VyLnRBY3Rpb24oYWN0LCBjdCk7CiAKIAkJCWlmIChhY3QgPD0gTlVNX1JVTEVTKSB7ICAgICAgICAgICAgICAgLy8gcmVkdWNlIGFjdGlvbgotCQkJCXRlbXBTdGFja1RvcC0tOwotCQkJCQotCQkJCWlmKERFQlVHX1BBUlNFQ0hFQ0spIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCh0ZW1wU3RhY2tUb3ApOworCQkJCXRoaXMudGVtcFN0YWNrVG9wLS07CisKKwkJCQlpZih0aGlzLkRFQlVHX1BBUlNFQ0hFQ0spIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludCh0aGlzLnRlbXBTdGFja1RvcCk7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAoLTEpIFttYXg6Iik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJU3lzdGVtLm91dC5wcmludChtYXhfcG9zKTsKIAkJCQkJU3lzdGVtLm91dC5wcmludCgiXVx0cmVkdWNlIik7IC8vJE5PTi1OTFMtMSQKQEAgLTIwMjQsMTggKzIwNDcsMTggQEAKIAkJCQlpZiAoaW5keCA9PSBNQVhfRElTVEFOQ0UpCiAJCQkJCXJldHVybiBpbmR4OwogCQkJCWluZHgrKzsKLQkJCQljdCA9IGxleFN0cmVhbS5raW5kKGJ1ZmZlcltpbmR4XSk7Ci0JCQkJbGV4U3RyZWFtLnJlc2V0KGxleFN0cmVhbS5uZXh0KGJ1ZmZlcltpbmR4XSkpOworCQkJCWN0ID0gdGhpcy5sZXhTdHJlYW0ua2luZCh0aGlzLmJ1ZmZlcltpbmR4XSk7CisJCQkJdGhpcy5sZXhTdHJlYW0ucmVzZXQodGhpcy5sZXhTdHJlYW0ubmV4dCh0aGlzLmJ1ZmZlcltpbmR4XSkpOwogCQkJCWlmIChhY3QgPiBFUlJPUl9BQ1RJT04pIHsKIAkJCQkJYWN0IC09IEVSUk9SX0FDVElPTjsKLQkJCQkJCi0JCQkJCWlmKERFQlVHX1BBUlNFQ0hFQ0spIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQodGVtcFN0YWNrVG9wKTsKKworCQkJCQlpZih0aGlzLkRFQlVHX1BBUlNFQ0hFQ0spIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnQodGhpcy50ZW1wU3RhY2tUb3ApOwogCQkJCQkJU3lzdGVtLm91dC5wcmludCgiXHRzaGlmdCByZWR1Y2UiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlpZihERUJVR19QQVJTRUNIRUNLKSB7CisJCQkJCWlmKHRoaXMuREVCVUdfUEFSU0VDSEVDSykgewogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdHNoaWZ0Iik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQljb250aW51ZSBwcm9jZXNzX3Rlcm1pbmFsOwpAQCAtMjA0OSwxMCArMjA3MiwxMCBAQAogCQkJLy8gc2FtZSBsb29wIGFzIGZpcnN0IHRva2VuIGluaXRpYWxpemF0aW9uCiAJCQkvLyBwcm9jZXNzX25vbl90ZXJtaW5hbDoKIAkJCWRvIHsKLQkJCQl0ZW1wU3RhY2tUb3AgLT0gKFBhcnNlci5yaHNbYWN0XS0xKTsKLQkJCQkKLQkJCQlpZihERUJVR19QQVJTRUNIRUNLKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQodGVtcFN0YWNrVG9wKTsKKwkJCQl0aGlzLnRlbXBTdGFja1RvcCAtPSAoUGFyc2VyLnJoc1thY3RdLTEpOworCisJCQkJaWYodGhpcy5ERUJVR19QQVJTRUNIRUNLKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnQodGhpcy50ZW1wU3RhY2tUb3ApOwogCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgKCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCVN5c3RlbS5vdXQucHJpbnQoLShQYXJzZXIucmhzW2FjdF0tMSkpOwogCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIpIFttYXg6Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTIwNjMsMjAgKzIwODYsMjAgQEAKIAkJCQkJU3lzdGVtLm91dC5wcmludChQYXJzZXIubmFtZVtQYXJzZXIubm9uX3Rlcm1pbmFsX2luZGV4W1BhcnNlci5saHNbYWN0XV1dKTsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CiAJCQkJfQotCQkJCQorCiAJCQkJaWYoYWN0IDw9IE5VTV9SVUxFUykgewogCQkJCQlpZihQYXJzZXIucnVsZXNfY29tcGxpYW5jZVthY3RdID4gdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsKSB7CiAJCQkJCSAJcmV0dXJuIDA7CiAJCQkJCX0KIAkJCQl9CiAJCQkJaW50IGxoc19zeW1ib2wgPSBQYXJzZXIubGhzW2FjdF07Ci0JCQkJYWN0ID0gKHRlbXBTdGFja1RvcCA+IG1heF9wb3MKLQkJCQkJCQkJCSAgPyB0ZW1wU3RhY2tbdGVtcFN0YWNrVG9wXQotCQkJCQkJCQkJICA6IHN0Y2tbdGVtcFN0YWNrVG9wXSk7CisJCQkJYWN0ID0gKHRoaXMudGVtcFN0YWNrVG9wID4gbWF4X3BvcworCQkJCQkJCQkJICA/IHRoaXMudGVtcFN0YWNrW3RoaXMudGVtcFN0YWNrVG9wXQorCQkJCQkJCQkJICA6IHN0Y2tbdGhpcy50ZW1wU3RhY2tUb3BdKTsKIAkJCQlhY3QgPSBQYXJzZXIubnRBY3Rpb24oYWN0LCBsaHNfc3ltYm9sKTsKIAkJCX0gd2hpbGUoYWN0IDw9IE5VTV9SVUxFUyk7CiAKLQkJCW1heF9wb3MgPSBtYXhfcG9zIDwgdGVtcFN0YWNrVG9wID8gbWF4X3BvcyA6IHRlbXBTdGFja1RvcDsKKwkJCW1heF9wb3MgPSBtYXhfcG9zIDwgdGhpcy50ZW1wU3RhY2tUb3AgPyBtYXhfcG9zIDogdGhpcy50ZW1wU3RhY2tUb3A7CiAJCX0gLy8gcHJvY2Vzc190ZXJtaW5hbDsKIAl9CiAJcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKGludCBtc2dDb2RlLCBpbnQgbmFtZUluZGV4LCBpbnQgbGVmdFRva2VuLCBpbnQgcmlnaHRUb2tlbikgewpAQCAtMjA5Miw2ICsyMTE1LDcgQEAKIAkJCXJlcG9ydFByaW1hcnlFcnJvcihtc2dDb2RlLCBuYW1lSW5kZXgsIHJpZ2h0VG9rZW4sIHNjb3BlTmFtZUluZGV4KTsKIAkJfQogCX0KKwogCXByaXZhdGUgdm9pZCByZXBvcnRQcmltYXJ5RXJyb3IoaW50IG1zZ0NvZGUsIGludCBuYW1lSW5kZXgsIGludCB0b2tlbiwgaW50IHNjb3BlTmFtZUluZGV4KSB7CiAJCVN0cmluZyBuYW1lOwogCQlpZiAobmFtZUluZGV4ID49IDApIHsKQEAgLTIxMDAsMTMzICsyMTI0LDEzNiBAQAogCQkJbmFtZSA9IFV0aWwuRU1QVFlfU1RSSU5HOwogCQl9CiAKLQkJaW50IGVycm9yU3RhcnQgPSBsZXhTdHJlYW0uc3RhcnQodG9rZW4pOwotCQlpbnQgZXJyb3JFbmQgPSBsZXhTdHJlYW0uZW5kKHRva2VuKTsKLQkJaW50IGN1cnJlbnRLaW5kID0gbGV4U3RyZWFtLmtpbmQodG9rZW4pOwotCQlTdHJpbmcgZXJyb3JUb2tlbk5hbWUgPSBQYXJzZXIubmFtZVtQYXJzZXIudGVybWluYWxfaW5kZXhbbGV4U3RyZWFtLmtpbmQodG9rZW4pXV07Ci0JCWNoYXJbXSBlcnJvclRva2VuU291cmNlID0gbGV4U3RyZWFtLm5hbWUodG9rZW4pOworCQlpbnQgZXJyb3JTdGFydCA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KHRva2VuKTsKKwkJaW50IGVycm9yRW5kID0gdGhpcy5sZXhTdHJlYW0uZW5kKHRva2VuKTsKKwkJaW50IGN1cnJlbnRLaW5kID0gdGhpcy5sZXhTdHJlYW0ua2luZCh0b2tlbik7CisJCVN0cmluZyBlcnJvclRva2VuTmFtZSA9IFBhcnNlci5uYW1lW1BhcnNlci50ZXJtaW5hbF9pbmRleFt0aGlzLmxleFN0cmVhbS5raW5kKHRva2VuKV1dOworCQljaGFyW10gZXJyb3JUb2tlblNvdXJjZSA9IHRoaXMubGV4U3RyZWFtLm5hbWUodG9rZW4pOworCQlpZiAoY3VycmVudEtpbmQgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCkgeworCQkJZXJyb3JUb2tlblNvdXJjZSA9IGRpc3BsYXlFc2NhcGVDaGFyYWN0ZXJzKGVycm9yVG9rZW5Tb3VyY2UsIDEsIGVycm9yVG9rZW5Tb3VyY2UubGVuZ3RoIC0gMSk7CisJCX0KIAogCQlpbnQgYWRkZWRUb2tlbiA9IC0xOwotCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQlpZih0aGlzLnJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CiAJCQlpZiAobmFtZUluZGV4ID49IDApIHsKIAkJCQlhZGRlZFRva2VuID0gUGFyc2VyLnJldmVyc2VfaW5kZXhbbmFtZUluZGV4XTsKIAkJCX0KIAkJfQogCQlzd2l0Y2gobXNnQ29kZSkgewogCQkJY2FzZSBCRUZPUkVfQ09ERToKLQkJCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKIAkJCQkJaWYoYWRkZWRUb2tlbiA+IC0xKSB7Ci0JCQkJCQlyZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW4oYWRkZWRUb2tlbiwgLTEsIGVycm9yU3RhcnQpOworCQkJCQkJdGhpcy5yZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW4oYWRkZWRUb2tlbiwgLTEsIGVycm9yU3RhcnQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCWlmKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJCQlyZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW5zKHRlbXBsYXRlLCAtMSwgZXJyb3JTdGFydCk7CisJCQkJCQkJdGhpcy5yZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW5zKHRlbXBsYXRlLCAtMSwgZXJyb3JTdGFydCk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9ySW5zZXJ0QmVmb3JlVG9rZW4oCi0JCQkJCWVycm9yU3RhcnQsIAotCQkJCQllcnJvckVuZCwgCisJCQkJCWVycm9yU3RhcnQsCisJCQkJCWVycm9yRW5kLAogCQkJCQljdXJyZW50S2luZCwKLQkJCQkJZXJyb3JUb2tlblNvdXJjZSwgCi0JCQkJCWVycm9yVG9rZW5OYW1lLCAKKwkJCQkJZXJyb3JUb2tlblNvdXJjZSwKKwkJCQkJZXJyb3JUb2tlbk5hbWUsCiAJCQkJCW5hbWUpOwogCQkJCSBicmVhazsKIAkJCWNhc2UgSU5TRVJUSU9OX0NPREU6Ci0JCQkJaWYocmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJCQlpZih0aGlzLnJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CiAJCQkJCWlmKGFkZGVkVG9rZW4gPiAtMSkgewotCQkJCQkJcmVjb3ZlcnlTY2FubmVyLmluc2VydFRva2VuKGFkZGVkVG9rZW4sIC0xLCBlcnJvckVuZCk7CisJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5pbnNlcnRUb2tlbihhZGRlZFRva2VuLCAtMSwgZXJyb3JFbmQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCWlmKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJCQlyZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW5zKHRlbXBsYXRlLCAtMSwgZXJyb3JFbmQpOworCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLmluc2VydFRva2Vucyh0ZW1wbGF0ZSwgLTEsIGVycm9yRW5kKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JJbnNlcnRBZnRlclRva2VuKAotCQkJCQllcnJvclN0YXJ0LCAKLQkJCQkJZXJyb3JFbmQsIAorCQkJCQllcnJvclN0YXJ0LAorCQkJCQllcnJvckVuZCwKIAkJCQkJY3VycmVudEtpbmQsCi0JCQkJCWVycm9yVG9rZW5Tb3VyY2UsIAotCQkJCQllcnJvclRva2VuTmFtZSwgCi0JCQkJCW5hbWUpOyAgCisJCQkJCWVycm9yVG9rZW5Tb3VyY2UsCisJCQkJCWVycm9yVG9rZW5OYW1lLAorCQkJCQluYW1lKTsKIAkJCQkgYnJlYWs7CiAJCQljYXNlIERFTEVUSU9OX0NPREU6Ci0JCQkJaWYocmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKLQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZW1vdmVUb2tlbnMoZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCX0KIAkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JEZWxldGVUb2tlbigKLQkJCQkJZXJyb3JTdGFydCwgCi0JCQkJCWVycm9yRW5kLCAKKwkJCQkJZXJyb3JTdGFydCwKKwkJCQkJZXJyb3JFbmQsCiAJCQkJCWN1cnJlbnRLaW5kLAotCQkJCQllcnJvclRva2VuU291cmNlLCAKKwkJCQkJZXJyb3JUb2tlblNvdXJjZSwKIAkJCQkJZXJyb3JUb2tlbk5hbWUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlZBTElEX0NPREU6CiAJCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewotCQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CiAJCQkJCX0KIAkJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yUmVwbGFjZVRva2VuKAotCQkJCQkJZXJyb3JTdGFydCwgCi0JCQkJCQllcnJvckVuZCwgCisJCQkJCQllcnJvclN0YXJ0LAorCQkJCQkJZXJyb3JFbmQsCiAJCQkJCQljdXJyZW50S2luZCwKLQkJCQkJCWVycm9yVG9rZW5Tb3VyY2UsIAotCQkJCQkJZXJyb3JUb2tlbk5hbWUsIAorCQkJCQkJZXJyb3JUb2tlblNvdXJjZSwKKwkJCQkJCWVycm9yVG9rZW5OYW1lLAogCQkJCQkJbmFtZSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYocmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewogCQkJCQkJaWYoYWRkZWRUb2tlbiA+IC0xKSB7Ci0JCQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnMoYWRkZWRUb2tlbiwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOworCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnMoYWRkZWRUb2tlbiwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpbnRbXSB0ZW1wbGF0ZSA9IGdldE5UZXJtVGVtcGxhdGUoLWFkZGVkVG9rZW4pOwogCQkJCQkJCWlmKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCQkJdGhpcy5yZWNvdmVyeVNjYW5uZXIucmVwbGFjZVRva2Vucyh0ZW1wbGF0ZSwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JJbnZhbGlkVG9rZW4oCi0JCQkJCQllcnJvclN0YXJ0LCAKLQkJCQkJCWVycm9yRW5kLCAKKwkJCQkJCWVycm9yU3RhcnQsCisJCQkJCQllcnJvckVuZCwKIAkJCQkJCWN1cnJlbnRLaW5kLAotCQkJCQkJZXJyb3JUb2tlblNvdXJjZSwgCi0JCQkJCQllcnJvclRva2VuTmFtZSwgCisJCQkJCQllcnJvclRva2VuU291cmNlLAorCQkJCQkJZXJyb3JUb2tlbk5hbWUsCiAJCQkJCQluYW1lKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNVQlNUSVRVVElPTl9DT0RFOgotCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CisJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewogCQkJCQlpZihhZGRlZFRva2VuID4gLTEpIHsKLQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnMoYWRkZWRUb2tlbiwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCWlmKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJCQlyZWNvdmVyeVNjYW5uZXIucmVwbGFjZVRva2Vucyh0ZW1wbGF0ZSwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOworCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JSZXBsYWNlVG9rZW4oCi0JCQkJCWVycm9yU3RhcnQsIAotCQkJCQllcnJvckVuZCwgCisJCQkJCWVycm9yU3RhcnQsCisJCQkJCWVycm9yRW5kLAogCQkJCQljdXJyZW50S2luZCwKLQkJCQkJZXJyb3JUb2tlblNvdXJjZSwgCi0JCQkJCWVycm9yVG9rZW5OYW1lLCAKLQkJCQkJbmFtZSk7IAorCQkJCQllcnJvclRva2VuU291cmNlLAorCQkJCQllcnJvclRva2VuTmFtZSwKKwkJCQkJbmFtZSk7CiAJCQkJIGJyZWFrOwogCQkJY2FzZSBTQ09QRV9DT0RFOgogCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCisKIAkJCQlpbnRbXSBhZGRlZFRva2VucyA9IG51bGw7CiAJICAgICAgICAgICAgaW50IGFkZGVkVG9rZW5Db3VudCA9IDA7CiAJICAgICAgICAgICAgaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewogCSAgICAgICAgICAgIAlhZGRlZFRva2VucyA9IG5ldyBpbnRbUGFyc2VyLnNjb3BlX3Jocy5sZW5ndGggLSBQYXJzZXIuc2NvcGVfc3VmZml4Wy0gbmFtZUluZGV4XV07CiAJICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAorCiAJCQkJZm9yIChpbnQgaSA9IFBhcnNlci5zY29wZV9zdWZmaXhbLSBuYW1lSW5kZXhdOyBQYXJzZXIuc2NvcGVfcmhzW2ldICE9IDA7IGkrKykgewogCQkJCQlidWYuYXBwZW5kKFBhcnNlci5yZWFkYWJsZU5hbWVbUGFyc2VyLnNjb3BlX3Joc1tpXV0pOwogCQkJCQlpZiAoUGFyc2VyLnNjb3BlX3Joc1tpICsgMV0gIT0gMCkgLy8gYW55IG1vcmUgc3ltYm9scyB0byBwcmludD8KIAkJCQkJCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJCQkJCisKIAkJCQkJaWYoYWRkZWRUb2tlbnMgIT0gbnVsbCkgewogCSAgICAgICAgICAgICAgICAJaW50IHRtcEFkZGVkVG9rZW4gPSBQYXJzZXIucmV2ZXJzZV9pbmRleFtQYXJzZXIuc2NvcGVfcmhzW2ldXTsKIAkJICAgICAgICAgICAgICAgIGlmICh0bXBBZGRlZFRva2VuID4gLTEpIHsKQEAgLTIyNTUsODYgKzIyODIsODYgQEAKIAogCQkJCWlmKGFkZGVkVG9rZW5Db3VudCA+IDApIHsKIAkgICAgICAgICAgICAJU3lzdGVtLmFycmF5Y29weShhZGRlZFRva2VucywgMCwgYWRkZWRUb2tlbnMgPSBuZXcgaW50W2FkZGVkVG9rZW5Db3VudF0sIDAsIGFkZGVkVG9rZW5Db3VudCk7Ci0JICAgICAgICAgICAgCQorCiAJICAgICAgICAgICAgCWludCBjb21wbGV0ZWRUb2tlbiA9IC0xOwogCSAgICAgICAgICAgIAlpZihzY29wZU5hbWVJbmRleCAhPSAwKSB7CiAJICAgICAgICAgICAgCQljb21wbGV0ZWRUb2tlbiA9IC1QYXJzZXIucmV2ZXJzZV9pbmRleFtzY29wZU5hbWVJbmRleF07CiAJICAgICAgICAgICAgCX0KIAkgICAgICAgICAgICAJdGhpcy5yZWNvdmVyeVNjYW5uZXIuaW5zZXJ0VG9rZW5zKGFkZGVkVG9rZW5zLCBjb21wbGV0ZWRUb2tlbiwgZXJyb3JFbmQpOwogCSAgICAgICAgICAgIH0KLQkJCQkKKwogCQkJCWlmIChzY29wZU5hbWVJbmRleCAhPSAwKSB7CiAJCQkJCWlmKHRoaXMucmVwb3J0UHJvYmxlbSkgcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvckluc2VydFRvQ29tcGxldGUoCi0JCQkJCQllcnJvclN0YXJ0LCAKKwkJCQkJCWVycm9yU3RhcnQsCiAJCQkJCQllcnJvckVuZCwKIAkJCQkJCWJ1Zi50b1N0cmluZygpLAogCQkJCQkJUGFyc2VyLnJlYWRhYmxlTmFtZVtzY29wZU5hbWVJbmRleF0pOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmKHRoaXMucmVwb3J0UHJvYmxlbSkgcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvckluc2VydFRvQ29tcGxldGVTY29wZSgKLQkJCQkJCWVycm9yU3RhcnQsIAorCQkJCQkJZXJyb3JTdGFydCwKIAkJCQkJCWVycm9yRW5kLAotCQkJCQkJYnVmLnRvU3RyaW5nKCkpOyAKKwkJCQkJCWJ1Zi50b1N0cmluZygpKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQlicmVhazsKIAkJCWNhc2UgRU9GX0NPREU6CiAJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yVW5leHBlY3RlZEVuZCgKLQkJCQkJZXJyb3JTdGFydCwgCi0JCQkJCWVycm9yRW5kKTsgCisJCQkJCWVycm9yU3RhcnQsCisJCQkJCWVycm9yRW5kKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgTUVSR0VfQ09ERToKLQkJCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKIAkJCQkJaWYoYWRkZWRUb2tlbiA+IC0xKSB7Ci0JCQkJCQlyZWNvdmVyeVNjYW5uZXIucmVwbGFjZVRva2VucyhhZGRlZFRva2VuLCBlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWludFtdIHRlbXBsYXRlID0gZ2V0TlRlcm1UZW1wbGF0ZSgtYWRkZWRUb2tlbik7CiAJCQkJCQlpZih0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKHRlbXBsYXRlLCBlcnJvclN0YXJ0LCBlcnJvckVuZCk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yTWVyZ2VUb2tlbnMoCi0JCQkJCWVycm9yU3RhcnQsIAorCQkJCQllcnJvclN0YXJ0LAogCQkJCQllcnJvckVuZCwKIAkJCQkJbmFtZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1JU1BMQUNFRF9DT0RFOgotCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJCXJlY292ZXJ5U2Nhbm5lci5yZW1vdmVUb2tlbnMoZXJyb3JTdGFydCwgZXJyb3JFbmQpOworCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJCQkJdGhpcy5yZWNvdmVyeVNjYW5uZXIucmVtb3ZlVG9rZW5zKGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQl9CiAJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yTWlzcGxhY2VkQ29uc3RydWN0KAotCQkJCQllcnJvclN0YXJ0LCAKKwkJCQkJZXJyb3JTdGFydCwKIAkJCQkJZXJyb3JFbmQpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJCQlyZWNvdmVyeVNjYW5uZXIucmVtb3ZlVG9rZW5zKGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQkJCQkJdGhpcy5yZWNvdmVyeVNjYW5uZXIucmVtb3ZlVG9rZW5zKGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJfQogCQkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JOb1N1Z2dlc3Rpb24oCi0JCQkJCQllcnJvclN0YXJ0LCAKLQkJCQkJCWVycm9yRW5kLCAKKwkJCQkJCWVycm9yU3RhcnQsCisJCQkJCQllcnJvckVuZCwKIAkJCQkJCWN1cnJlbnRLaW5kLAotCQkJCQkJZXJyb3JUb2tlblNvdXJjZSwgCisJCQkJCQllcnJvclRva2VuU291cmNlLAogCQkJCQkJZXJyb3JUb2tlbk5hbWUpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CisJCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKIAkJCQkJCWlmKGFkZGVkVG9rZW4gPiAtMSkgewotCQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCQlpZih0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKHRlbXBsYXRlLCBlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yUmVwbGFjZVRva2VuKAotCQkJCQkJZXJyb3JTdGFydCwgCi0JCQkJCQllcnJvckVuZCwgCisJCQkJCQllcnJvclN0YXJ0LAorCQkJCQkJZXJyb3JFbmQsCiAJCQkJCQljdXJyZW50S2luZCwKLQkJCQkJCWVycm9yVG9rZW5Tb3VyY2UsIAotCQkJCQkJZXJyb3JUb2tlbk5hbWUsIAotCQkJCQkJbmFtZSk7IAorCQkJCQkJZXJyb3JUb2tlblNvdXJjZSwKKwkJCQkJCWVycm9yVG9rZW5OYW1lLAorCQkJCQkJbmFtZSk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9CkBAIC0yMzQ1LDY2ICsyMzcyLDY2IEBACiAJCWlmIChuYW1lSW5kZXggPj0gMCkgewogCQkJbmFtZSA9IFBhcnNlci5yZWFkYWJsZU5hbWVbbmFtZUluZGV4XTsKIAkJfSBlbHNlIHsKLQkJCW5hbWUgPSBVdGlsLkVNUFRZX1NUUklORzsJCisJCQluYW1lID0gVXRpbC5FTVBUWV9TVFJJTkc7CiAJCX0KIAogCQlpbnQgZXJyb3JTdGFydCA9IC0xOwotCQlpZihsZXhTdHJlYW0uaXNJbnNpZGVTdHJlYW0obGVmdFRva2VuKSkgeworCQlpZih0aGlzLmxleFN0cmVhbS5pc0luc2lkZVN0cmVhbShsZWZ0VG9rZW4pKSB7CiAJCQlpZihsZWZ0VG9rZW4gPT0gMCkgewotCQkJCWVycm9yU3RhcnQgPSBsZXhTdHJlYW0uc3RhcnQobGVmdFRva2VuICsgMSk7CisJCQkJZXJyb3JTdGFydCA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KGxlZnRUb2tlbiArIDEpOwogCQkJfSBlbHNlIHsKLQkJCQllcnJvclN0YXJ0ID0gbGV4U3RyZWFtLnN0YXJ0KGxlZnRUb2tlbik7CisJCQkJZXJyb3JTdGFydCA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KGxlZnRUb2tlbik7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZihsZWZ0VG9rZW4gPT0gZXJyb3JUb2tlbikgewotCQkJCWVycm9yU3RhcnQgPSBlcnJvclRva2VuU3RhcnQ7CisJCQlpZihsZWZ0VG9rZW4gPT0gdGhpcy5lcnJvclRva2VuKSB7CisJCQkJZXJyb3JTdGFydCA9IHRoaXMuZXJyb3JUb2tlblN0YXJ0OwogCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8PSBzdGF0ZVN0YWNrVG9wOyBpKyspIHsKLQkJCQkJaWYobG9jYXRpb25TdGFja1tpXSA9PSBsZWZ0VG9rZW4pIHsKLQkJCQkJCWVycm9yU3RhcnQgPSBsb2NhdGlvblN0YXJ0U3RhY2tbaV07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5zdGF0ZVN0YWNrVG9wOyBpKyspIHsKKwkJCQkJaWYodGhpcy5sb2NhdGlvblN0YWNrW2ldID09IGxlZnRUb2tlbikgeworCQkJCQkJZXJyb3JTdGFydCA9IHRoaXMubG9jYXRpb25TdGFydFN0YWNrW2ldOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYoZXJyb3JTdGFydCA9PSAtMSkgewotCQkJCWVycm9yU3RhcnQgPSBsZXhTdHJlYW0uc3RhcnQocmlnaHRUb2tlbik7CisJCQkJZXJyb3JTdGFydCA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KHJpZ2h0VG9rZW4pOwogCQkJfQogCQl9Ci0JCWludCBlcnJvckVuZCA9IGxleFN0cmVhbS5lbmQocmlnaHRUb2tlbik7Ci0JCQorCQlpbnQgZXJyb3JFbmQgPSB0aGlzLmxleFN0cmVhbS5lbmQocmlnaHRUb2tlbik7CisKIAkJaW50IGFkZGVkVG9rZW4gPSAtMTsKLQkJaWYocmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewogCQkJaWYgKG5hbWVJbmRleCA+PSAwKSB7CiAJCQkJYWRkZWRUb2tlbiA9IFBhcnNlci5yZXZlcnNlX2luZGV4W25hbWVJbmRleF07CiAJCQl9CiAJCX0KLQkJCisKIAkJc3dpdGNoKG1zZ0NvZGUpIHsKIAkJCWNhc2UgTUlTUExBQ0VEX0NPREU6Ci0JCQkJaWYocmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKLQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgeworCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZW1vdmVUb2tlbnMoZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCX0KIAkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JNaXNwbGFjZWRDb25zdHJ1Y3QoCi0JCQkJCWVycm9yU3RhcnQsIAotCQkJCQllcnJvckVuZCk7IAorCQkJCQllcnJvclN0YXJ0LAorCQkJCQllcnJvckVuZCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNDT1BFX0NPREU6CiAJCQkJLy8gZXJyb3Igc3RhcnQgaXMgb24gdGhlIGxhc3QgdG9rZW4gc3RhcnQKLQkJCQllcnJvclN0YXJ0ID0gbGV4U3RyZWFtLnN0YXJ0KHJpZ2h0VG9rZW4pOwotCQkJCisJCQkJZXJyb3JTdGFydCA9IHRoaXMubGV4U3RyZWFtLnN0YXJ0KHJpZ2h0VG9rZW4pOworCiAJICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICAgICAgICAKKwogCSAgICAgICAgICAgIGludFtdIGFkZGVkVG9rZW5zID0gbnVsbDsKIAkgICAgICAgICAgICBpbnQgYWRkZWRUb2tlbkNvdW50ID0gMDsKIAkgICAgICAgICAgICBpZih0aGlzLnJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CiAJICAgICAgICAgICAgCWFkZGVkVG9rZW5zID0gbmV3IGludFtQYXJzZXIuc2NvcGVfcmhzLmxlbmd0aCAtIFBhcnNlci5zY29wZV9zdWZmaXhbLSBuYW1lSW5kZXhdXTsKIAkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgCisKIAkgICAgICAgICAgICBmb3IgKGludCBpID0gUGFyc2VyLnNjb3BlX3N1ZmZpeFstIG5hbWVJbmRleF07IFBhcnNlci5zY29wZV9yaHNbaV0gIT0gMDsgaSsrKSB7Ci0JICAgICAgICAgICAgICAgIAorCiAJICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoUGFyc2VyLnJlYWRhYmxlTmFtZVtQYXJzZXIuc2NvcGVfcmhzW2ldXSk7CiAJICAgICAgICAgICAgICAgIGlmIChQYXJzZXIuc2NvcGVfcmhzW2krMV0gIT0gMCkKIAkgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcgJyk7Ci0JICAgICAgICAgICAgICAgIAorCiAJICAgICAgICAgICAgICAgIGlmKGFkZGVkVG9rZW5zICE9IG51bGwpIHsKIAkgICAgICAgICAgICAgICAgCWludCB0bXBBZGRlZFRva2VuID0gUGFyc2VyLnJldmVyc2VfaW5kZXhbUGFyc2VyLnNjb3BlX3Joc1tpXV07CiAJCSAgICAgICAgICAgICAgICBpZiAodG1wQWRkZWRUb2tlbiA+IC0xKSB7CkBAIC0yNDQwLDYyICsyNDY3LDYyIEBACiAJICAgICAgICAgICAgfQogCSAgICAgICAgICAgIGlmIChzY29wZU5hbWVJbmRleCAhPSAwKSB7CiAJICAgICAgICAgICAgICAgIGlmKHRoaXMucmVwb3J0UHJvYmxlbSkgcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvckluc2VydFRvQ29tcGxldGUoCi0JCQkJCQllcnJvclN0YXJ0LCAKKwkJCQkJCWVycm9yU3RhcnQsCiAJCQkJCQllcnJvckVuZCwKIAkJCQkJCWJ1Zi50b1N0cmluZygpLAogCQkJCQkJUGFyc2VyLnJlYWRhYmxlTmFtZVtzY29wZU5hbWVJbmRleF0pOwogCSAgICAgICAgICAgIH0gZWxzZSB7CiAJICAgICAgICAgICAgCWlmKHRoaXMucmVwb3J0UHJvYmxlbSkgcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvckluc2VydFRvQ29tcGxldGVQaHJhc2UoCi0JCQkJCQllcnJvclN0YXJ0LCAKKwkJCQkJCWVycm9yU3RhcnQsCiAJCQkJCQllcnJvckVuZCwKLQkJCQkJCWJ1Zi50b1N0cmluZygpKTsgCisJCQkJCQlidWYudG9TdHJpbmcoKSk7CiAJICAgICAgICAgICAgfQogCSAgICAgICAgICAgIGJyZWFrOwogCQkJY2FzZSBNRVJHRV9DT0RFOgotCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CisJCQkJaWYodGhpcy5yZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewogCQkJCQlpZihhZGRlZFRva2VuID4gLTEpIHsKLQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnMoYWRkZWRUb2tlbiwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCWlmKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJCQlyZWNvdmVyeVNjYW5uZXIucmVwbGFjZVRva2Vucyh0ZW1wbGF0ZSwgZXJyb3JTdGFydCwgZXJyb3JFbmQpOworCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQlpZih0aGlzLnJlcG9ydFByb2JsZW0pIHByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3JNZXJnZVRva2VucygKLQkJCQkJZXJyb3JTdGFydCwgCisJCQkJCWVycm9yU3RhcnQsCiAJCQkJCWVycm9yRW5kLAogCQkJCQluYW1lKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgREVMRVRJT05fQ09ERToKLQkJCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewotCQkJCQlyZWNvdmVyeVNjYW5uZXIucmVtb3ZlVG9rZW5zKGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQlpZih0aGlzLnJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CisJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CiAJCQkJfQogCQkJCWlmKHRoaXMucmVwb3J0UHJvYmxlbSkgcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvckRlbGV0ZVRva2VucygKLQkJCQkJZXJyb3JTdGFydCwgCisJCQkJCWVycm9yU3RhcnQsCiAJCQkJCWVycm9yRW5kKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlpZihyZWNvdmVyeVNjYW5uZXIgIT0gbnVsbCkgewotCQkJCQkJcmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKKwkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlbW92ZVRva2VucyhlcnJvclN0YXJ0LCBlcnJvckVuZCk7CiAJCQkJCX0KIAkJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yTm9TdWdnZXN0aW9uRm9yVG9rZW5zKAotCQkJCQkJZXJyb3JTdGFydCwgCisJCQkJCQllcnJvclN0YXJ0LAogCQkJCQkJZXJyb3JFbmQpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKHJlY292ZXJ5U2Nhbm5lciAhPSBudWxsKSB7CisJCQkJCWlmKHRoaXMucmVjb3ZlcnlTY2FubmVyICE9IG51bGwpIHsKIAkJCQkJCWlmKGFkZGVkVG9rZW4gPiAtMSkgewotCQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKKwkJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKGFkZGVkVG9rZW4sIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaW50W10gdGVtcGxhdGUgPSBnZXROVGVybVRlbXBsYXRlKC1hZGRlZFRva2VuKTsKIAkJCQkJCQlpZih0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlY292ZXJ5U2Nhbm5lci5yZXBsYWNlVG9rZW5zKHRlbXBsYXRlLCBlcnJvclN0YXJ0LCBlcnJvckVuZCk7CisJCQkJCQkJCXRoaXMucmVjb3ZlcnlTY2FubmVyLnJlcGxhY2VUb2tlbnModGVtcGxhdGUsIGVycm9yU3RhcnQsIGVycm9yRW5kKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJaWYodGhpcy5yZXBvcnRQcm9ibGVtKSBwcm9ibGVtUmVwb3J0ZXIoKS5wYXJzZUVycm9yUmVwbGFjZVRva2VucygKLQkJCQkJCWVycm9yU3RhcnQsIAorCQkJCQkJZXJyb3JTdGFydCwKIAkJCQkJCWVycm9yRW5kLAogCQkJCQkJbmFtZSk7CiAJCQkJfQpAQCAtMjUxNywxMiArMjU0NCwxMiBAQAogICAgICAgICAJcmV0dXJuIG51bGw7CiAgICAgCX0KIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmdCdWZmZXIgcmVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJcmVzLmFwcGVuZChsZXhTdHJlYW0udG9TdHJpbmcoKSk7Ci0JCQorCisJCXJlcy5hcHBlbmQodGhpcy5sZXhTdHJlYW0udG9TdHJpbmcoKSk7CisKIAkJcmV0dXJuIHJlcy50b1N0cmluZygpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvZGlhZ25vc2UvTGV4U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL2RpYWdub3NlL0xleFN0cmVhbS5qYXZhCmluZGV4IGI0YTczY2IuLjY0ODU4Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvZGlhZ25vc2UvTGV4U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9kaWFnbm9zZS9MZXhTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw3ICsxOSw3IEBACiBwdWJsaWMgY2xhc3MgTGV4U3RyZWFtIGltcGxlbWVudHMgVGVybWluYWxUb2tlbnMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0FGVEVSX0pVTVAgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExCUkFDRV9NSVNTSU5HID0gMjsKLQkJCisKIAlwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuewogCQlpbnQga2luZDsKIAkJY2hhcltdIG5hbWU7CkBAIC0yNywxMSArMjcsMTEgQEAKIAkJaW50IGVuZDsKIAkJaW50IGxpbmU7CiAJCWludCBmbGFnczsKLQkJCisKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpLmFwcGVuZCgnWycpLmFwcGVuZChraW5kKS5hcHBlbmQoJ10nKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJ3snKS5hcHBlbmQoc3RhcnQpLmFwcGVuZCgnLCcpLmFwcGVuZChlbmQpLmFwcGVuZCgnfScpLmFwcGVuZChsaW5lKTsKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lKS5hcHBlbmQoJ1snKS5hcHBlbmQodGhpcy5raW5kKS5hcHBlbmQoJ10nKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ3snKS5hcHBlbmQodGhpcy5zdGFydCkuYXBwZW5kKCcsJykuYXBwZW5kKHRoaXMuZW5kKS5hcHBlbmQoJ30nKS5hcHBlbmQodGhpcy5saW5lKTsKIAkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAkJfQogCkBAIC00NywxMCArNDcsMTAgQEAKIAlwcml2YXRlIGludFtdIGludGVydmFsU3RhcnRUb1NraXA7CiAJcHJpdmF0ZSBpbnRbXSBpbnRlcnZhbEVuZFRvU2tpcDsKIAlwcml2YXRlIGludFtdIGludGVydmFsRmxhZ3NUb1NraXA7Ci0JCisKIAlwcml2YXRlIGludCBwcmV2aW91c0ludGVydmFsID0gLTE7CiAJcHJpdmF0ZSBpbnQgY3VycmVudEludGVydmFsID0gLTE7Ci0JCisKIAlwdWJsaWMgTGV4U3RyZWFtKGludCBzaXplLCBTY2FubmVyIHNjYW5uZXIsIGludFtdIGludGVydmFsU3RhcnRUb1NraXAsIGludFtdIGludGVydmFsRW5kVG9Ta2lwLCBpbnRbXSBpbnRlcnZhbEZsYWdzVG9Ta2lwLCBpbnQgZmlyc3RUb2tlbiwgaW50IGluaXQsIGludCBlb2YpIHsKIAkJdGhpcy50b2tlbkNhY2hlID0gbmV3IFRva2VuW3NpemVdOwogCQl0aGlzLnRva2VuQ2FjaGVJbmRleCA9IDA7CkBAIC02MSw2NCArNjEsNjQgQEAKIAkJdGhpcy50b2tlbkNhY2hlWzBdLnN0YXJ0ID0gaW5pdDsKIAkJdGhpcy50b2tlbkNhY2hlWzBdLmVuZCA9IGluaXQ7CiAJCXRoaXMudG9rZW5DYWNoZVswXS5saW5lID0gMDsKLQkJCisKIAkJdGhpcy5pbnRlcnZhbFN0YXJ0VG9Ta2lwID0gaW50ZXJ2YWxTdGFydFRvU2tpcDsKIAkJdGhpcy5pbnRlcnZhbEVuZFRvU2tpcCA9IGludGVydmFsRW5kVG9Ta2lwOwogCQl0aGlzLmludGVydmFsRmxhZ3NUb1NraXAgPSBpbnRlcnZhbEZsYWdzVG9Ta2lwOwotCQkKKwogCQlzY2FubmVyLnJlc2V0VG8oaW5pdCwgZW9mKTsKIAkJdGhpcy5zY2FubmVyID0gc2Nhbm5lcjsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcmVhZFRva2VuRnJvbVNjYW5uZXIoKXsKLQkJaW50IGxlbmd0aCA9IHRva2VuQ2FjaGUubGVuZ3RoOworCQlpbnQgbGVuZ3RoID0gdGhpcy50b2tlbkNhY2hlLmxlbmd0aDsKIAkJYm9vbGVhbiB0b2tlbk5vdEZvdW5kID0gdHJ1ZTsKLQkJCisKIAkJd2hpbGUodG9rZW5Ob3RGb3VuZCkgewogCQkJdHJ5IHsKLQkJCQlpbnQgdG9rZW5LaW5kID0gIHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJaW50IHRva2VuS2luZCA9ICB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CiAJCQkJaWYodG9rZW5LaW5kICE9IFRva2VuTmFtZUVPRikgewotCQkJCQlpbnQgc3RhcnQgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKLQkJCQkJaW50IGVuZCA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKLQkJCQkJCi0JCQkJCWludCBuZXh0SW50ZXJ2YWwgPSBjdXJyZW50SW50ZXJ2YWwgKyAxOwotCQkJCQlpZihpbnRlcnZhbFN0YXJ0VG9Ta2lwLmxlbmd0aCA9PSAwIHx8Ci0JCQkJCQkJbmV4dEludGVydmFsID49IGludGVydmFsU3RhcnRUb1NraXAubGVuZ3RoIHx8Ci0JCQkJCQkJc3RhcnQgPCBpbnRlcnZhbFN0YXJ0VG9Ta2lwW25leHRJbnRlcnZhbF0pIHsKKwkJCQkJaW50IHN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJaW50IGVuZCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCisJCQkJCWludCBuZXh0SW50ZXJ2YWwgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDE7CisJCQkJCWlmKHRoaXMuaW50ZXJ2YWxTdGFydFRvU2tpcC5sZW5ndGggPT0gMCB8fAorCQkJCQkJCW5leHRJbnRlcnZhbCA+PSB0aGlzLmludGVydmFsU3RhcnRUb1NraXAubGVuZ3RoIHx8CisJCQkJCQkJc3RhcnQgPCB0aGlzLmludGVydmFsU3RhcnRUb1NraXBbbmV4dEludGVydmFsXSkgewogCQkJCQkJVG9rZW4gdG9rZW4gPSBuZXcgVG9rZW4oKTsKIAkJCQkJCXRva2VuLmtpbmQgPSB0b2tlbktpbmQ7Ci0JCQkJCQl0b2tlbi5uYW1lID0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKKwkJCQkJCXRva2VuLm5hbWUgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CiAJCQkJCQl0b2tlbi5zdGFydCA9IHN0YXJ0OwogCQkJCQkJdG9rZW4uZW5kID0gZW5kOwotCQkJCQkJdG9rZW4ubGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihlbmQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cik7Ci0JCQkJCQkKLQkJCQkJCWlmKGN1cnJlbnRJbnRlcnZhbCAhPSBwcmV2aW91c0ludGVydmFsICYmIChpbnRlcnZhbEZsYWdzVG9Ta2lwW2N1cnJlbnRJbnRlcnZhbF0gJiBSYW5nZVV0aWwuSUdOT1JFKSA9PSAwKXsKKwkJCQkJCXRva2VuLmxpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIoZW5kLCB0aGlzLnNjYW5uZXIubGluZUVuZHMsIDAsIHRoaXMuc2Nhbm5lci5saW5lUHRyKTsKKworCQkJCQkJaWYodGhpcy5jdXJyZW50SW50ZXJ2YWwgIT0gdGhpcy5wcmV2aW91c0ludGVydmFsICYmICh0aGlzLmludGVydmFsRmxhZ3NUb1NraXBbdGhpcy5jdXJyZW50SW50ZXJ2YWxdICYgUmFuZ2VVdGlsLklHTk9SRSkgPT0gMCl7CiAJCQkJCQkJdG9rZW4uZmxhZ3MgPSBJU19BRlRFUl9KVU1QOwotCQkJCQkJCWlmKChpbnRlcnZhbEZsYWdzVG9Ta2lwW2N1cnJlbnRJbnRlcnZhbF0gJiBSYW5nZVV0aWwuTEJSQUNFX01JU1NJTkcpICE9IDApeworCQkJCQkJCWlmKCh0aGlzLmludGVydmFsRmxhZ3NUb1NraXBbdGhpcy5jdXJyZW50SW50ZXJ2YWxdICYgUmFuZ2VVdGlsLkxCUkFDRV9NSVNTSU5HKSAhPSAwKXsKIAkJCQkJCQkJdG9rZW4uZmxhZ3MgfD0gTEJSQUNFX01JU1NJTkc7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJcHJldmlvdXNJbnRlcnZhbCA9IGN1cnJlbnRJbnRlcnZhbDsKKwkJCQkJCXRoaXMucHJldmlvdXNJbnRlcnZhbCA9IHRoaXMuY3VycmVudEludGVydmFsOwogCi0JCQkJCQl0b2tlbkNhY2hlWysrdG9rZW5DYWNoZUluZGV4ICUgbGVuZ3RoXSA9IHRva2VuOwotCQkJCQkJCisJCQkJCQl0aGlzLnRva2VuQ2FjaGVbKyt0aGlzLnRva2VuQ2FjaGVJbmRleCAlIGxlbmd0aF0gPSB0b2tlbjsKKwogCQkJCQkJdG9rZW5Ob3RGb3VuZCA9IGZhbHNlOwogCQkJCQl9IGVsc2UgewotCQkJCQkJc2Nhbm5lci5yZXNldFRvKGludGVydmFsRW5kVG9Ta2lwWysrY3VycmVudEludGVydmFsXSArIDEsIHNjYW5uZXIuZW9mUG9zaXRpb24gLSAxKTsKKwkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuaW50ZXJ2YWxFbmRUb1NraXBbKyt0aGlzLmN1cnJlbnRJbnRlcnZhbF0gKyAxLCB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gLSAxKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBzdGFydCA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwotCQkJCQlpbnQgZW5kID0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQlpbnQgc3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOworCQkJCQlpbnQgZW5kID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCk7CiAJCQkJCVRva2VuIHRva2VuID0gbmV3IFRva2VuKCk7CiAJCQkJCXRva2VuLmtpbmQgPSB0b2tlbktpbmQ7CiAJCQkJCXRva2VuLm5hbWUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQkJCXRva2VuLnN0YXJ0ID0gc3RhcnQ7CiAJCQkJCXRva2VuLmVuZCA9IGVuZDsKLQkJCQkJdG9rZW4ubGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihlbmQsIHNjYW5uZXIubGluZUVuZHMsIDAsIHNjYW5uZXIubGluZVB0cik7Ci0JCQkJCQotCQkJCQl0b2tlbkNhY2hlWysrdG9rZW5DYWNoZUluZGV4ICUgbGVuZ3RoXSA9IHRva2VuOwotCQkJCQkKLQkJCQkJdG9rZW5DYWNoZUVPRkluZGV4ID0gdG9rZW5DYWNoZUluZGV4OworCQkJCQl0b2tlbi5saW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKGVuZCwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cik7CisKKwkJCQkJdGhpcy50b2tlbkNhY2hlWysrdGhpcy50b2tlbkNhY2hlSW5kZXggJSBsZW5ndGhdID0gdG9rZW47CisKKwkJCQkJdGhpcy50b2tlbkNhY2hlRU9GSW5kZXggPSB0aGlzLnRva2VuQ2FjaGVJbmRleDsKIAkJCQkJdG9rZW5Ob3RGb3VuZCA9IGZhbHNlOwogCQkJCX0KIAkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXB1YmxpYyBUb2tlbiB0b2tlbihpbnQgaW5kZXgpIHsKIAkJaWYoaW5kZXggPCAwKSB7CiAJCQlUb2tlbiBlb2ZUb2tlbiA9IG5ldyBUb2tlbigpOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCWlmKHRoaXMudG9rZW5DYWNoZUVPRkluZGV4ID49IDAgJiYgaW5kZXggPiB0aGlzLnRva2VuQ2FjaGVFT0ZJbmRleCkgewogCQkJcmV0dXJuIHRva2VuKHRoaXMudG9rZW5DYWNoZUVPRkluZGV4KTsKIAkJfQotCQlpbnQgbGVuZ3RoID0gdG9rZW5DYWNoZS5sZW5ndGg7CisJCWludCBsZW5ndGggPSB0aGlzLnRva2VuQ2FjaGUubGVuZ3RoOwogCQlpZihpbmRleCA+IHRoaXMudG9rZW5DYWNoZUluZGV4KSB7CiAJCQlpbnQgdG9rZW5zVG9SZWFkID0gaW5kZXggLSB0aGlzLnRva2VuQ2FjaGVJbmRleDsKIAkJCXdoaWxlKHRva2Vuc1RvUmVhZC0tICE9IDApIHsKQEAgLTE0NiwxNiArMTQ2LDE2IEBACiAJCX0gZWxzZSBpZih0aGlzLnRva2VuQ2FjaGVJbmRleCAtIGxlbmd0aCA+PSBpbmRleCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJCi0JCXJldHVybiB0b2tlbkNhY2hlW2luZGV4ICUgbGVuZ3RoXTsKKworCQlyZXR1cm4gdGhpcy50b2tlbkNhY2hlW2luZGV4ICUgbGVuZ3RoXTsKIAl9Ci0JCi0JCi0JCisKKworCiAJcHVibGljIGludCBnZXRUb2tlbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRJbmRleCA9IG5leHQoY3VycmVudEluZGV4KTsKKwkJcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID0gbmV4dCh0aGlzLmN1cnJlbnRJbmRleCk7CiAJfQotCQorCiAJcHVibGljIGludCBwcmV2aW91cyhpbnQgdG9rZW5JbmRleCkgewogCQlyZXR1cm4gdG9rZW5JbmRleCA+IDAgPyB0b2tlbkluZGV4IC0gMSA6IDA7CiAJfQpAQCAtMTY3LDEzICsxNjcsMTMgQEAKIAlwdWJsaWMgYm9vbGVhbiBhZnRlckVvbChpbnQgaSkgewogCQlyZXR1cm4gaSA8IDEgPyB0cnVlIDogbGluZShpIC0gMSkgPCBsaW5lKGkpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQljdXJyZW50SW5kZXggPSAtMTsKKwkJdGhpcy5jdXJyZW50SW5kZXggPSAtMTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXNldChpbnQgaSkgewotCQljdXJyZW50SW5kZXggPSBwcmV2aW91cyhpKTsKKwkJdGhpcy5jdXJyZW50SW5kZXggPSBwcmV2aW91cyhpKTsKIAl9CiAKIAlwdWJsaWMgaW50IGJhZHRva2VuKCkgewpAQCAtMTgzLDcgKzE4Myw3IEBACiAJcHVibGljIGludCBraW5kKGludCB0b2tlbkluZGV4KSB7CiAJCXJldHVybiB0b2tlbih0b2tlbkluZGV4KS5raW5kOwogCX0KLQkKKwogCXB1YmxpYyBjaGFyW10gbmFtZShpbnQgdG9rZW5JbmRleCkgewogCQlyZXR1cm4gdG9rZW4odG9rZW5JbmRleCkubmFtZTsKIAl9CkBAIC0xOTEsNjUgKzE5MSw2NSBAQAogCXB1YmxpYyBpbnQgbGluZShpbnQgdG9rZW5JbmRleCkgewogCQlyZXR1cm4gdG9rZW4odG9rZW5JbmRleCkubGluZTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IHN0YXJ0KGludCB0b2tlbkluZGV4KSB7CiAJCXJldHVybiB0b2tlbih0b2tlbkluZGV4KS5zdGFydDsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGVuZChpbnQgdG9rZW5JbmRleCkgewogCQlyZXR1cm4gdG9rZW4odG9rZW5JbmRleCkuZW5kOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgZmxhZ3MoaW50IHRva2VuSW5kZXgpIHsKIAkJcmV0dXJuIHRva2VuKHRva2VuSW5kZXgpLmZsYWdzOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzSW5zaWRlU3RyZWFtKGludCBpbmRleCkgewogCQlpZih0aGlzLnRva2VuQ2FjaGVFT0ZJbmRleCA+PSAwICYmIGluZGV4ID4gdGhpcy50b2tlbkNhY2hlRU9GSW5kZXgpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfSBlbHNlIGlmKGluZGV4ID4gdGhpcy50b2tlbkNhY2hlSW5kZXgpIHsKIAkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYodGhpcy50b2tlbkNhY2hlSW5kZXggLSB0b2tlbkNhY2hlLmxlbmd0aCA+PSBpbmRleCkgeworCQl9IGVsc2UgaWYodGhpcy50b2tlbkNhY2hlSW5kZXggLSB0aGlzLnRva2VuQ2FjaGUubGVuZ3RoID49IGluZGV4KSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCVN0cmluZ0J1ZmZlciByZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlTdHJpbmcgc291cmNlID0gbmV3IFN0cmluZyhzY2FubmVyLnNvdXJjZSk7Ci0JCWlmKGN1cnJlbnRJbmRleCA8IDApIHsKKworCQlTdHJpbmcgc291cmNlID0gbmV3IFN0cmluZyh0aGlzLnNjYW5uZXIuc291cmNlKTsKKwkJaWYodGhpcy5jdXJyZW50SW5kZXggPCAwKSB7CiAJCQlpbnQgcHJldmlvdXNFbmQgPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJ2YWxTdGFydFRvU2tpcC5sZW5ndGg7IGkrKykgewotCQkJCWludCBpbnRlcnZhbFN0YXJ0ID0gaW50ZXJ2YWxTdGFydFRvU2tpcFtpXTsKLQkJCQlpbnQgaW50ZXJ2YWxFbmQgPSBpbnRlcnZhbEVuZFRvU2tpcFtpXTsKLQkJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbnRlcnZhbFN0YXJ0VG9Ta2lwLmxlbmd0aDsgaSsrKSB7CisJCQkJaW50IGludGVydmFsU3RhcnQgPSB0aGlzLmludGVydmFsU3RhcnRUb1NraXBbaV07CisJCQkJaW50IGludGVydmFsRW5kID0gdGhpcy5pbnRlcnZhbEVuZFRvU2tpcFtpXTsKKwogCQkJCXJlcy5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhwcmV2aW91c0VuZCArIDEsIGludGVydmFsU3RhcnQpKTsKIAkJCQlyZXMuYXBwZW5kKCc8Jyk7CiAJCQkJcmVzLmFwcGVuZCgnQCcpOwogCQkJCXJlcy5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbEVuZCArIDEpKTsKIAkJCQlyZXMuYXBwZW5kKCdAJyk7CiAJCQkJcmVzLmFwcGVuZCgnPicpOwotCQkJCQorCiAJCQkJcHJldmlvdXNFbmQgPSBpbnRlcnZhbEVuZDsKIAkJCX0KIAkJCXJlcy5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhwcmV2aW91c0VuZCArIDEpKTsKIAkJfSBlbHNlIHsKLQkJCVRva2VuIHRva2VuID0gdG9rZW4oY3VycmVudEluZGV4KTsKKwkJCVRva2VuIHRva2VuID0gdG9rZW4odGhpcy5jdXJyZW50SW5kZXgpOwogCQkJaW50IGN1cnRva0tpbmQgPSB0b2tlbi5raW5kOwogCQkJaW50IGN1cnRva1N0YXJ0ID0gdG9rZW4uc3RhcnQ7CiAJCQlpbnQgY3VydG9rRW5kID0gdG9rZW4uZW5kOwotCQkJCisKIAkJCWludCBwcmV2aW91c0VuZCA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnZhbFN0YXJ0VG9Ta2lwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW50IGludGVydmFsU3RhcnQgPSBpbnRlcnZhbFN0YXJ0VG9Ta2lwW2ldOwotCQkJCWludCBpbnRlcnZhbEVuZCA9IGludGVydmFsRW5kVG9Ta2lwW2ldOwotCQkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmludGVydmFsU3RhcnRUb1NraXAubGVuZ3RoOyBpKyspIHsKKwkJCQlpbnQgaW50ZXJ2YWxTdGFydCA9IHRoaXMuaW50ZXJ2YWxTdGFydFRvU2tpcFtpXTsKKwkJCQlpbnQgaW50ZXJ2YWxFbmQgPSB0aGlzLmludGVydmFsRW5kVG9Ta2lwW2ldOworCiAJCQkJaWYoY3VydG9rU3RhcnQgPj0gcHJldmlvdXNFbmQgJiYgY3VydG9rRW5kIDw9IGludGVydmFsU3RhcnQpIHsKIAkJCQkJcmVzLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKHByZXZpb3VzRW5kICsgMSwgY3VydG9rU3RhcnQpKTsKIAkJCQkJcmVzLmFwcGVuZCgnPCcpOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCQkJcmVzLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKGludGVydmFsU3RhcnQsIGludGVydmFsRW5kICsgMSkpOwogCQkJCXJlcy5hcHBlbmQoJ0AnKTsKIAkJCQlyZXMuYXBwZW5kKCc+Jyk7Ci0JCQkJCisKIAkJCQlwcmV2aW91c0VuZCA9IGludGVydmFsRW5kOwogCQkJfQogCQkJaWYoY3VydG9rU3RhcnQgPj0gcHJldmlvdXNFbmQpIHsKQEAgLTI4NSw3ICsyODUsNyBAQAogCQkJCXJlcy5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhwcmV2aW91c0VuZCArIDEpKTsKIAkJCX0KIAkJfQotCQkKKwogCQlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9kaWFnbm9zZS9SYW5nZVV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvZGlhZ25vc2UvUmFuZ2VVdGlsLmphdmEKaW5kZXggMzZmMDhiZi4uZDEyNjMzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9kaWFnbm9zZS9SYW5nZVV0aWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL2RpYWdub3NlL1JhbmdlVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDU3ICsxOCw1NyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKIAogcHVibGljIGNsYXNzIFJhbmdlVXRpbCB7Ci0JCisKIAkvLyBmbGFncwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0ZMQUcgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExCUkFDRV9NSVNTSU5HID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkUgPSAyOwotCQorCiAJc3RhdGljIGNsYXNzIFJhbmdlUmVzdWx0IHsKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfU0laRSA9IDEwOwogCQlpbnQgcG9zOwogCQlpbnRbXSBpbnRlcnZhbFN0YXJ0czsKIAkJaW50W10gaW50ZXJ2YWxFbmRzOwogCQlpbnRbXSBpbnRlcnZhbEZsYWdzOwotCQkKKwogCQlSYW5nZVJlc3VsdCgpIHsKIAkJCXRoaXMucG9zID0gMDsKIAkJCXRoaXMuaW50ZXJ2YWxTdGFydHMgPSBuZXcgaW50W0lOSVRJQUxfU0laRV07CiAJCQl0aGlzLmludGVydmFsRW5kcyA9IG5ldyBpbnRbSU5JVElBTF9TSVpFXTsKIAkJCXRoaXMuaW50ZXJ2YWxGbGFncyA9IG5ldyBpbnRbSU5JVElBTF9TSVpFXTsKIAkJfQotCQkKKwogCQl2b2lkIGFkZEludGVydmFsKGludCBzdGFydCwgaW50IGVuZCl7CiAJCQlhZGRJbnRlcnZhbChzdGFydCwgZW5kLCBOT19GTEFHKTsKIAkJfQotCQkKKwogCQl2b2lkIGFkZEludGVydmFsKGludCBzdGFydCwgaW50IGVuZCwgaW50IGZsYWdzKXsKLQkJCWlmKHBvcyA+PSBpbnRlcnZhbFN0YXJ0cy5sZW5ndGgpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVydmFsU3RhcnRzLCAwLCBpbnRlcnZhbFN0YXJ0cyA9IG5ldyBpbnRbcG9zICogMl0sIDAsIHBvcyk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcnZhbEVuZHMsIDAsIGludGVydmFsRW5kcyA9IG5ldyBpbnRbcG9zICogMl0sIDAsIHBvcyk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcnZhbEZsYWdzLCAwLCBpbnRlcnZhbEZsYWdzID0gbmV3IGludFtwb3MgKiAyXSwgMCwgcG9zKTsKKwkJCWlmKHRoaXMucG9zID49IHRoaXMuaW50ZXJ2YWxTdGFydHMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmludGVydmFsU3RhcnRzLCAwLCB0aGlzLmludGVydmFsU3RhcnRzID0gbmV3IGludFt0aGlzLnBvcyAqIDJdLCAwLCB0aGlzLnBvcyk7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmludGVydmFsRW5kcywgMCwgdGhpcy5pbnRlcnZhbEVuZHMgPSBuZXcgaW50W3RoaXMucG9zICogMl0sIDAsIHRoaXMucG9zKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaW50ZXJ2YWxGbGFncywgMCwgdGhpcy5pbnRlcnZhbEZsYWdzID0gbmV3IGludFt0aGlzLnBvcyAqIDJdLCAwLCB0aGlzLnBvcyk7CiAJCQl9Ci0JCQlpbnRlcnZhbFN0YXJ0c1twb3NdID0gc3RhcnQ7Ci0JCQlpbnRlcnZhbEVuZHNbcG9zXSA9IGVuZDsKLQkJCWludGVydmFsRmxhZ3NbcG9zXSA9IGZsYWdzOwotCQkJcG9zKys7CisJCQl0aGlzLmludGVydmFsU3RhcnRzW3RoaXMucG9zXSA9IHN0YXJ0OworCQkJdGhpcy5pbnRlcnZhbEVuZHNbdGhpcy5wb3NdID0gZW5kOworCQkJdGhpcy5pbnRlcnZhbEZsYWdzW3RoaXMucG9zXSA9IGZsYWdzOworCQkJdGhpcy5wb3MrKzsKIAkJfQotCQkKKwogCQlpbnRbXVtdIGdldFJhbmdlcygpIHsKLQkJCWludFtdIHJlc3VsdFN0YXJ0cyA9IG5ldyBpbnRbcG9zXTsKLQkJCWludFtdIHJlc3VsdEVuZHMgPSBuZXcgaW50W3Bvc107Ci0JCQlpbnRbXSByZXN1bHRGbGFncyA9IG5ldyBpbnRbcG9zXTsKLQkJCQotCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcnZhbFN0YXJ0cywgMCwgcmVzdWx0U3RhcnRzLCAwLCBwb3MpOwotCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcnZhbEVuZHMsIDAsIHJlc3VsdEVuZHMsIDAsIHBvcyk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGludGVydmFsRmxhZ3MsIDAsIHJlc3VsdEZsYWdzLCAwLCBwb3MpOworCQkJaW50W10gcmVzdWx0U3RhcnRzID0gbmV3IGludFt0aGlzLnBvc107CisJCQlpbnRbXSByZXN1bHRFbmRzID0gbmV3IGludFt0aGlzLnBvc107CisJCQlpbnRbXSByZXN1bHRGbGFncyA9IG5ldyBpbnRbdGhpcy5wb3NdOworCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaW50ZXJ2YWxTdGFydHMsIDAsIHJlc3VsdFN0YXJ0cywgMCwgdGhpcy5wb3MpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmludGVydmFsRW5kcywgMCwgcmVzdWx0RW5kcywgMCwgdGhpcy5wb3MpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmludGVydmFsRmxhZ3MsIDAsIHJlc3VsdEZsYWdzLCAwLCB0aGlzLnBvcyk7CiAKIAkJCWlmIChyZXN1bHRTdGFydHMubGVuZ3RoID4gMSkgewogCQkJCXF1aWNrU29ydChyZXN1bHRTdGFydHMsIHJlc3VsdEVuZHMsIHJlc3VsdEZsYWdzLCAwLCByZXN1bHRTdGFydHMubGVuZ3RoIC0gMSk7CiAJCQl9CiAJCQlyZXR1cm4gbmV3IGludFtdW117cmVzdWx0U3RhcnRzLCByZXN1bHRFbmRzLCByZXN1bHRGbGFnc307CiAJCX0KLQkJCisKIAkJcHJpdmF0ZSB2b2lkIHF1aWNrU29ydChpbnRbXSBsaXN0LCBpbnRbXSBsaXN0MiwgaW50W10gbGlzdDMsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKIAkJCWludCBvcmlnaW5hbF9sZWZ0PSBsZWZ0OwogCQkJaW50IG9yaWdpbmFsX3JpZ2h0PSByaWdodDsKQEAgLTg0LDIwICs4NCwyMCBAQAogCQkJCQlpbnQgdG1wPSBsaXN0W2xlZnRdOwogCQkJCQlsaXN0W2xlZnRdPSBsaXN0W3JpZ2h0XTsKIAkJCQkJbGlzdFtyaWdodF09IHRtcDsKLQkJCQkJCisKIAkJCQkJdG1wID0gbGlzdDJbbGVmdF07CiAJCQkJCWxpc3QyW2xlZnRdPSBsaXN0MltyaWdodF07CiAJCQkJCWxpc3QyW3JpZ2h0XT0gdG1wOwotCQkJCQkKKwogCQkJCQl0bXAgPSBsaXN0M1tsZWZ0XTsKIAkJCQkJbGlzdDNbbGVmdF09IGxpc3QzW3JpZ2h0XTsKIAkJCQkJbGlzdDNbcmlnaHRdPSB0bXA7Ci0JCQkJCQorCiAJCQkJCWxlZnQrKzsKIAkJCQkJcmlnaHQtLTsKIAkJCQl9CiAJCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQkJCQorCiAJCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CiAJCQkJcXVpY2tTb3J0KGxpc3QsIGxpc3QyLCBsaXN0Mywgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOwogCQkJfQpAQCAtMTA1LDE0ICsxMDUsMTQgQEAKIAkJCQlxdWlja1NvcnQobGlzdCwgbGlzdDIsIGxpc3QzLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7CiAJCQl9CiAJCX0KLQkJCisKIAkJcHJpdmF0ZSBpbnQgY29tcGFyZShpbnQgaTEsIGludCBpMikgewogCQkJcmV0dXJuIGkxIC0gaTI7CiAJCX0KIAl9Ci0JCi0JCi0JCisKKworCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zRXJyb3JJblNpZ25hdHVyZShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCl7CiAJCXJldHVybiBtZXRob2Quc291cmNlRW5kICsgMSA9PSBtZXRob2QuYm9keVN0YXJ0CXx8IG1ldGhvZC5ib2R5RW5kID09IG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZDsKIAl9CkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJCXJldHVybiByZXN1bHQuZ2V0UmFuZ2VzKCk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVEaWV0UmFuZ2UwKFR5cGVEZWNsYXJhdGlvbltdIHR5cGVzLCBSYW5nZVJlc3VsdCByZXN1bHQpIHsKIAkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5sZW5ndGg7IGorKykgewogCQkJLy9tZW1iZXJzCkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkKKwogCQkJLy9pbml0aWFsaXplcnMKIAkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlc1tqXS5maWVsZHM7CiAJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJfQogCQl9CiAJfQotCQkKKwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0lnbm9yZWRCb2R5KEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKXsKIAkJcmV0dXJuICFtZXRob2QuaXNEZWZhdWx0Q29uc3RydWN0b3IoKQogCQkJJiYgIW1ldGhvZC5pc0NsaW5pdCgpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxLnJzYwppbmRleCAzZTZhMDk1Li4yYzY4YTIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxMC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEwLnJzYwppbmRleCA0YzZiNmZhLi5jMGJkMjY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEwLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEwLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjExLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTEucnNjCmluZGV4IGY5MTA2OGYuLmU3YzI2OGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTEucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTEucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxMi5yc2MKaW5kZXggZGIzMDk5My4uOTM2MzBmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxMi5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxMi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxMy5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEzLnJzYwppbmRleCA5N2Y5ZTU1Li5mZGNjZWRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEzLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEzLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE0LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTQucnNjCmluZGV4IDdjNGU1MWIuLmIwMmFkYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTQucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTQucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTUucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxNS5yc2MKaW5kZXggMTExMjg1MS4uZjFjYTc1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxNS5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxNS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxNi5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE2LnJzYwppbmRleCA2NGZlYmU5Li45OGIzNzMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE2LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE2LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE3LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTcucnNjCmluZGV4IDcyYWIzY2QuLmZjOWE4OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTcucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTcucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMTgucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxOC5yc2MKaW5kZXggYmQ2Njk5ZC4uMmVkMWFhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxOC5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxOC5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxOS5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE5LnJzYwppbmRleCBiYTJiYWRlLi4yMzVlMThmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE5LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjE5LnJzYwpAQCAtMSArMSwyIEBACi0dHR0dHR0dHR0dHR0dHR0dHWdnHR0dHRsbHx8bHh0dHR0dHR8fRkZGHUVFaB8fHx8bQUFBHR0dHR0eHR0dIR0dGxsfHR9GHWYbGxtBHx8fH2UdHR5BHUkbRQsIDEpKGkUhGxsbRRsbRQ4eBx4HHmJHR18hGkgDIUEhIQchIQc1BwMDAwMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCiscHBwcHBwcHBwcHBwcHBwcHGhoHBwcHBsbHx9nGx4cHBwcHBwfH0ZGRhxERBxnHx8fHxtBQUEcHBwcHB4cHBwhHBwbGx8cH0YcZBsbG0EfHx8fZhwcHkEcSRtEDAorC0pKGkQhGxsbRBsbRBAeBx4HHmJHR18hIRpIAyFBYiEhByEhBzUHNQMDAwMhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMi5yc2MKaW5kZXggYjZlMDYyYi4uNmNmNjc1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMjAucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMC5yc2MKaW5kZXggMGQ1ZTk5ZS4uYTZmYTVhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMC5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMC5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMS5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIxLnJzYwppbmRleCAzNTI3NGMwLi4wNWUyNmM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIxLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIxLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIyLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMjIucnNjCmluZGV4IDc3ZjRjMGMuLjE0Nzc0MDIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMjIucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMjIucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMjMucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMy5yc2MKaW5kZXggM2Q2YzA4Ni4uNzE2NmQwNCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMy5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyMy5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyNC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjI0LnJzYwppbmRleCBmMzNlYjlkLi42YTE0MDA3IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjI0LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjI0LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjMucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYwppbmRleCBkNmEwNjBkLi42YmI3YTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjMucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMy5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNC5yc2MKaW5kZXggMzIzNTZkZC4uNDA1ZjhlNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjQucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNS5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjUucnNjCmluZGV4IGZiYTczMGUuLjY2NGNkMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNS5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjYucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI2LnJzYwppbmRleCA5MGIzMmQzLi43NDVlZmFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjYucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI3LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNy5yc2MKaW5kZXggNWI3MjIxZi4uNTgxZWRlNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI3LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjcucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyOC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjgucnNjCmluZGV4IDdiYzhkODYuLmM0MDhjYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyOC5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI4LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjkucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI5LnJzYwppbmRleCBmZTE4YzRmLi5iMWFiMDVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjkucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyOS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9yZWFkYWJsZU5hbWVzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3JlYWRhYmxlTmFtZXMucHJvcGVydGllcwppbmRleCBjYmQyZmM0Li42MjlkYzk2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3JlYWRhYmxlTmFtZXMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3JlYWRhYmxlTmFtZXMucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05LDYgKzksNyBAQAogIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAsb3B0PSwKK1w7b3B0PTsKIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb249TWV0aG9kRGVjbGFyYXRpb24KIEFkZGl0aW9uYWxCb3VuZDE9QWRkaXRpb25hbEJvdW5kMQogQWRkaXRpb25hbEJvdW5kPUFkZGl0aW9uYWxCb3VuZApAQCAtNTUsMTQgKzU2LDE1IEBACiBCcmVha1N0YXRlbWVudD1CcmVha1N0YXRlbWVudAogQ2FzdEV4cHJlc3Npb249Q2FzdEV4cHJlc3Npb24KIENhdGNoQ2xhdXNlPUNhdGNoQ2xhdXNlCitDYXRjaEZvcm1hbFBhcmFtZXRlcj1Gb3JtYWxQYXJhbWV0ZXIKIENhdGNoSGVhZGVyPUNhdGNoSGVhZGVyCitDYXRjaFR5cGU9Q2F0Y2hUeXBlCiBDYXRjaGVzPUNhdGNoZXMKIENhdGNoZXNvcHQ9Q2F0Y2hlcwogQ2xhc3NCb2R5PUNsYXNzQm9keQogQ2xhc3NCb2R5RGVjbGFyYXRpb249Q2xhc3NCb2R5RGVjbGFyYXRpb24KIENsYXNzQm9keURlY2xhcmF0aW9ucz1DbGFzc0JvZHlEZWNsYXJhdGlvbnMKIENsYXNzQm9keURlY2xhcmF0aW9uc29wdD1DbGFzc0JvZHlEZWNsYXJhdGlvbnMKLUNsYXNzQm9keW9wdD1DbGFzc0JvZHkKIENsYXNzRGVjbGFyYXRpb249Q2xhc3NEZWNsYXJhdGlvbgogQ2xhc3NIZWFkZXI9Q2xhc3NIZWFkZXIKIENsYXNzSGVhZGVyRXh0ZW5kcz1DbGFzc0hlYWRlckV4dGVuZHMKQEAgLTkyLDYgKzk0LDcgQEAKIENvbnN0cnVjdG9ySGVhZGVyPUNvbnN0cnVjdG9yRGVjbGFyYXRpb24KIENvbnN0cnVjdG9ySGVhZGVyTmFtZT1Db25zdHJ1Y3RvckhlYWRlck5hbWUKIENvbnRpbnVlU3RhdGVtZW50PUNvbnRpbnVlU3RhdGVtZW50CitDcmVhdGVJbml0aWFsaXplcj1DcmVhdGVJbml0aWFsaXplcgogRGVmYXVsdFZhbHVlPURlZmF1bHRWYWx1ZQogRGlldD1EaWV0CiBEaW1XaXRoT3JXaXRoT3V0RXhwcj1EaW1lbnNpb24KQEAgLTEwNSw3ICsxMDgsNiBAQAogRW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXI9RW5oYW5jZWRGb3JTdGF0ZW1lbnRIZWFkZXIKIEVuaGFuY2VkRm9yU3RhdGVtZW50SGVhZGVySW5pdD1FbmhhbmNlZEZvclN0YXRlbWVudEhlYWRlckluaXQKIEVuaGFuY2VkRm9yU3RhdGVtZW50Tm9TaG9ydElmPUVuaGFuY2VkRm9yU3RhdGVtZW50Tm9TaG9ydElmCi1FbnRlckFub255bW91c0NsYXNzQm9keT1FbnRlckFub255bW91c0NsYXNzQm9keQogRW50ZXJDb21waWxhdGlvblVuaXQ9RW50ZXJDb21waWxhdGlvblVuaXQKIEVudGVyTWVtYmVyVmFsdWU9RW50ZXJNZW1iZXJWYWx1ZQogRW50ZXJNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXI9RW50ZXJNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIKQEAgLTE4Miw2ICsxODQsNyBAQAogSW50ZXJuYWxDb21waWxhdGlvblVuaXQ9Q29tcGlsYXRpb25Vbml0CiBJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50PUFycmF5SW5pdGlhbGl6ZXJBc3NpZ25tZW50CiBJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj1JbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbgorSW52YWxpZEluaXRpYWxpemVyPUludmFsaWRJbml0aWFsaXplcgogTGFiZWw9TGFiZWwKIExhYmVsZWRTdGF0ZW1lbnQ9TGFiZWxlZFN0YXRlbWVudAogTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZj1MYWJlbGVkU3RhdGVtZW50CkBAIC0yMzgsNiArMjQxLDggQEAKIFB1c2hQb3NpdGlvbj1QdXNoUG9zaXRpb24KIFB1c2hSUEFSRU49KQogUHVzaFJlYWxNb2RpZmllcnM9UHVzaFJlYWxNb2RpZmllcnMKK1F1YWxpZmllZENsYXNzQm9keW9wdD1DbGFzc0JvZHkKK1F1YWxpZmllZEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5PUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5CiBRdWFsaWZpZWROYW1lPVF1YWxpZmllZE5hbWUKIFJlY292ZXJ5TWV0aG9kSGVhZGVyPU1ldGhvZEhlYWRlcgogUmVjb3ZlcnlNZXRob2RIZWFkZXJOYW1lPU1ldGhvZEhlYWRlck5hbWUKQEAgLTI0OCwxMiArMjUzLDE2IEBACiBSZWZlcmVuY2VUeXBlPVJlZmVyZW5jZVR5cGUKIFJlbGF0aW9uYWxFeHByZXNzaW9uPUV4cHJlc3Npb24KIFJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWU9RXhwcmVzc2lvbgorUmVzb3VyY2U9UmVzb3VyY2UKK1Jlc291cmNlU3BlY2lmaWNhdGlvbj1SZXNvdXJjZVNwZWNpZmljYXRpb24KK1Jlc291cmNlcz1SZXNvdXJjZXMKIFJlc3RvcmVEaWV0PVJlc3RvcmVEaWV0CiBSZXR1cm5TdGF0ZW1lbnQ9UmV0dXJuU3RhdGVtZW50CiBTaGlmdEV4cHJlc3Npb249RXhwcmVzc2lvbgogU2hpZnRFeHByZXNzaW9uX05vdE5hbWU9RXhwcmVzc2lvbgogU2ltcGxlTmFtZT1TaW1wbGVOYW1lCiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uPVNpbmdsZU1lbWJlckFubm90YXRpb24KK1NpbmdsZU1lbWJlckFubm90YXRpb25NZW1iZXJWYWx1ZT1NZW1iZXJWYWx1ZQogU2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb249U2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb24KIFNpbmdsZVN0YXRpY0ltcG9ydERlY2xhcmF0aW9uTmFtZT1TaW5nbGVTdGF0aWNJbXBvcnREZWNsYXJhdGlvbk5hbWUKIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbj1TaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24KQEAgLTI3NSw4ICsyODQsMTAgQEAKIFN3aXRjaFN0YXRlbWVudD1Td2l0Y2hTdGF0ZW1lbnQKIFN5bmNocm9uaXplZFN0YXRlbWVudD1TeW5jaHJvbml6ZWRTdGF0ZW1lbnQKIFRocm93U3RhdGVtZW50PVRocm93U3RhdGVtZW50CitUcmFpbGluZ1NlbWlDb2xvbj07CiBUcnlCbG9jaz1CbG9jawogVHJ5U3RhdGVtZW50PVRyeVN0YXRlbWVudAorVHJ5U3RhdGVtZW50V2l0aFJlc291cmNlcz1UcnlTdGF0ZW1lbnRXaXRoUmVzb3VyY2VzCiBUeXBlPVR5cGUKIFR5cGVBcmd1bWVudDE9VHlwZUFyZ3VtZW50MQogVHlwZUFyZ3VtZW50Mj1UeXBlQXJndW1lbnQyCkBAIC0zMDEsNiArMzEyLDkgQEAKIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cz1FeHByZXNzaW9uCiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNfTm90TmFtZT1FeHByZXNzaW9uCiBVbmFyeUV4cHJlc3Npb25fTm90TmFtZT1FeHByZXNzaW9uCitVbmlvblR5cGU9VW5pb25UeXBlCitVbnF1YWxpZmllZENsYXNzQm9keW9wdD1DbGFzc0JvZHkKK1VucXVhbGlmaWVkRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHk9RW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkKIFZhcmlhYmxlRGVjbGFyYXRvcj1WYXJpYWJsZURlY2xhcmF0b3IKIFZhcmlhYmxlRGVjbGFyYXRvcklkPVZhcmlhYmxlRGVjbGFyYXRvcklkCiBWYXJpYWJsZURlY2xhcmF0b3JzPVZhcmlhYmxlRGVjbGFyYXRvcnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZS9wYXJ0MC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGUvcGFydDAucnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGQ4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGUvcGFydDAucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFydDEucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3BhcnQxLnJzYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnQxLnJzYwpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3BhcnQxLnJzYwppbmRleCBiN2QyZGYxLi5hZjAwYWE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnQxLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGUvcGFydDEucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFydDE0LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZS9wYXJ0MTQucnNjCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFydDE0LnJzYwpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3BhcnQxNC5yc2MKaW5kZXggMTRmOTA0Mi4uYzgyNDFlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJ0MTQucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZS9wYXJ0MTQucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFydDIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3BhcnQyLnJzYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJ0Mi5yc2MKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZS9wYXJ0Mi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0MC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGUvc3RhcnQwLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODViOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0MC5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9zdGFydDEucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0MS5yc2MKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9zdGFydDEucnNjCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGUvc3RhcnQxLnJzYwppbmRleCBiZjdlNWFhLi40OGM3MDIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3N0YXJ0MS5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0MS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9zdGFydDIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0Mi5yc2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvc3RhcnQyLnJzYwpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlL3N0YXJ0Mi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9wYXJ0MC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3BhcnQwLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA5ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9wYXJ0MC5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJ0MS5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3BhcnQxLnJzYwpzaW1pbGFyaXR5IGluZGV4IDg1JQpjb3B5IGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJ0MS5yc2MKY29weSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3BhcnQxLnJzYwppbmRleCBiN2QyZGYxLi42Y2I4OGNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnQxLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3BhcnQxLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnQxNC5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3BhcnQxNC5yc2MKc2ltaWxhcml0eSBpbmRleCA5OCUKY29weSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFydDE0LnJzYwpjb3B5IHRvIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvcGFydDE0LnJzYwppbmRleCAxNGY5MDQyLi5jODI0MWU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnQxNC5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9wYXJ0MTQucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvcGFydDIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9wYXJ0Mi5yc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5ZjU4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvcGFydDIucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvc3RhcnQwLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvc3RhcnQwLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Y5ODExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9zdGFydDAucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvc3RhcnQxLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvdW5pY29kZTYvc3RhcnQxLnJzYwpzaW1pbGFyaXR5IGluZGV4IDg2JQpjb3B5IGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9zdGFydDEucnNjCmNvcHkgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9zdGFydDEucnNjCmluZGV4IGJmN2U1YWEuLjFkZTMyMTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvc3RhcnQxLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3N0YXJ0MS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9zdGFydDIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci91bmljb2RlNi9zdGFydDIucnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWY1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3VuaWNvZGU2L3N0YXJ0Mi5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvbi5qYXZhCmluZGV4IDJjZWRlMDYuLjA5ODQ1NmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsNyArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIC8qCi0gKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogU3BlY2lhbCB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUgdXNlZAogICogdG8gYWJvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gcHJvY2VzcwogICoKICAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgpAQCAtMjcsMTMgKzI3LDEzIEBACiAJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OwogCXB1YmxpYyBUaHJvd2FibGUgZXhjZXB0aW9uOwogCXB1YmxpYyBDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbTsKLQkKLQkvKiBzcGVjaWFsIGZpZWxkcyB1c2VkIHRvIGFib3J0IHNpbGVudGx5IChlLmcuIHdoZW4gY2FuY2VsbGluZyBidWlsZCBwcm9jZXNzKSAqLworCisJLyogc3BlY2lhbCBmaWVsZHMgdXNlZCB0byBhYm9ydCBzaWxlbnRseSAoZS5nLiB3aGVuIGNhbmNlbGluZyBidWlsZCBwcm9jZXNzKSAqLwogCXB1YmxpYyBib29sZWFuIGlzU2lsZW50OwogCXB1YmxpYyBSdW50aW1lRXhjZXB0aW9uIHNpbGVudEV4Y2VwdGlvbjsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMDQ3MjI2NTk1MDgzMjQ0ODUyTDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQotCQorCiAJcHVibGljIEFib3J0Q29tcGlsYXRpb24oKSB7CiAJCS8vIGVtcHR5CiAJfQpAQCAtNTUsNyArNTUsMjAgQEAKIAkJdGhpcy5pc1NpbGVudCA9IGlzU2lsZW50OwogCQl0aGlzLnNpbGVudEV4Y2VwdGlvbiA9IHNpbGVudEV4Y2VwdGlvbjsKIAl9Ci0JCisJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCQlTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWVzc2FnZSA9PSBudWxsID8gVXRpbC5FTVBUWV9TVFJJTkcgOiBtZXNzYWdlKTsKKwkJaWYgKHRoaXMucHJvYmxlbSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMucHJvYmxlbSk7CisJCX0gZWxzZSBpZiAodGhpcy5leGNlcHRpb24gIT0gbnVsbCkgeworCQkJbWVzc2FnZSA9IHRoaXMuZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKwkJCWJ1ZmZlci5hcHBlbmQobWVzc2FnZSA9PSBudWxsID8gVXRpbC5FTVBUWV9TVFJJTkcgOiBtZXNzYWdlKTsKKwkJfSBlbHNlIGlmICh0aGlzLnNpbGVudEV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQltZXNzYWdlID0gdGhpcy5zaWxlbnRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOworCQkJYnVmZmVyLmFwcGVuZChtZXNzYWdlID09IG51bGwgPyBVdGlsLkVNUFRZX1NUUklORyA6IG1lc3NhZ2UpOworCQl9CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOworCX0KIAlwdWJsaWMgdm9pZCB1cGRhdGVDb250ZXh0KEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CiAJCWlmICh0aGlzLnByb2JsZW0gPT0gbnVsbCkgcmV0dXJuOwogCQlpZiAodGhpcy5wcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgIT0gMCB8fCB0aGlzLnByb2JsZW0uZ2V0U291cmNlRW5kKCkgIT0gMCkgcmV0dXJuOwpAQCAtNzUsNCArODgsMTIgQEAKIAkJdGhpcy5wcm9ibGVtLnNldFNvdXJjZUxpbmVOdW1iZXIoVXRpbC5nZXRMaW5lTnVtYmVyKGFzdE5vZGUuc291cmNlU3RhcnQoKSwgbGluZUVuZHMsIDAsIGxpbmVFbmRzLmxlbmd0aC0xKSk7CiAJCXRoaXMuY29tcGlsYXRpb25SZXN1bHQgPSB1bml0UmVzdWx0OwogCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAodGhpcy5wcm9ibGVtICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5wcm9ibGVtKTsKKwkJfQorCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvblVuaXQuamF2YQppbmRleCA5MjZjYjU0Li5mZDg2MmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNyArMTYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIAogLyoKLSAqIFNwZWNpYWwgdW5jaGVja2VkIGV4Y2VwdGlvbiB0eXBlIHVzZWQgCisgKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkCiAgKiB0byBhYm9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCiAgKgogICogc2hvdWxkIG9ubHkgYmUgdGhyb3duIGZyb20gd2l0aGluIHByb2JsZW0gaGFuZGxlcnMuCkBAIC0yNCw5ICsyNCw5IEBACiBwdWJsaWMgY2xhc3MgQWJvcnRDb21waWxhdGlvblVuaXQgZXh0ZW5kcyBBYm9ydENvbXBpbGF0aW9uIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MjUzODkzNTI5OTgyMjI2NzM0TDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQotCQorCiAJcHVibGljIFN0cmluZyBlbmNvZGluZzsKLQkKKwogcHVibGljIEFib3J0Q29tcGlsYXRpb25Vbml0KENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSkgewogCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0LCBwcm9ibGVtKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0TWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydE1ldGhvZC5qYXZhCmluZGV4IDNmZTA3NzkuLjhkYTI2YzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0TWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRNZXRob2QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxNSArMTQsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiAKIC8qCi0gKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogU3BlY2lhbCB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUgdXNlZAogICogdG8gYWJvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gcHJvY2VzcwogICoKICAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgogICovCiBwdWJsaWMgY2xhc3MgQWJvcnRNZXRob2QgZXh0ZW5kcyBBYm9ydFR5cGUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDgwMjY3Mzk4OTY5ODQwMDAzTDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQkKLQkKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDgwMjY3Mzk4OTY5ODQwMDAzTDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQorCiBwdWJsaWMgQWJvcnRNZXRob2QoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtKSB7CiAJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQsIHByb2JsZW0pOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydFR5cGUuamF2YQppbmRleCAzZDZmYmNhLi5hZDZhNGRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydFR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxNSArMTQsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiAKIC8qCi0gKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogU3BlY2lhbCB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUgdXNlZAogICogdG8gYWJvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gcHJvY2VzcwogICoKICAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgogICovCiBwdWJsaWMgY2xhc3MgQWJvcnRUeXBlIGV4dGVuZHMgQWJvcnRDb21waWxhdGlvblVuaXQgewotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4ODI0MTcwODkzNDkxMzQzODVMOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlCi0JCisKIHB1YmxpYyBBYm9ydFR5cGUoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtKSB7CiAJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQsIHByb2JsZW0pOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtLmphdmEKaW5kZXggMDAzOTBmNC4uNzdmMmJiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDE3ICsxOCwyMCBAQAogcHVibGljIGNsYXNzIERlZmF1bHRQcm9ibGVtIGV4dGVuZHMgQ2F0ZWdvcml6ZWRQcm9ibGVtIHsKIAlwcml2YXRlIGNoYXJbXSBmaWxlTmFtZTsKIAlwcml2YXRlIGludCBpZDsKLQlwcml2YXRlIGludCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgbGluZSwgY29sdW1uOworCXByaXZhdGUgaW50IHN0YXJ0UG9zaXRpb247CisJcHJpdmF0ZSBpbnQgZW5kUG9zaXRpb247CisJcHJpdmF0ZSBpbnQgbGluZTsKKwlwdWJsaWMgaW50IGNvbHVtbjsKIAlwcml2YXRlIGludCBzZXZlcml0eTsKIAlwcml2YXRlIFN0cmluZ1tdIGFyZ3VtZW50czsKIAlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCQorCiAJLy8gY2Fubm90IGRpcmVjdGx5IHBvaW50IHRvIElKYXZhTW9kZWxNYXJrZXIgY29uc3RhbnRzIGZyb20gd2l0aGluIGJhdGNoIGNvbXBpbGVyCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9UWVBFX1BST0JMRU0gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX1RZUEVfVEFTSyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS50YXNrIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9WQUxVRVMgPSB7fTsKLQkKKwogcHVibGljIERlZmF1bHRQcm9ibGVtKAogCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAogCVN0cmluZyBtZXNzYWdlLApAQCAtNjIsMjAgKzY1LDIwIEBACiAJaWYgKCh0aGlzLnN0YXJ0UG9zaXRpb24gPiB0aGlzLmVuZFBvc2l0aW9uKQogCQl8fCAoKHRoaXMuc3RhcnRQb3NpdGlvbiA8IDApICYmICh0aGlzLmVuZFBvc2l0aW9uIDwgMCkpCiAJCXx8IHVuaXRTb3VyY2UubGVuZ3RoID09IDApCi0JCXJldHVybiBNZXNzYWdlcy5wcm9ibGVtX25vU291cmNlSW5mb3JtYXRpb247IAorCQlyZXR1cm4gTWVzc2FnZXMucHJvYmxlbV9ub1NvdXJjZUluZm9ybWF0aW9uOwogCiAJU3RyaW5nQnVmZmVyIGVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWVycm9yQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnByb2JsZW1fYXRMaW5lLCBTdHJpbmcudmFsdWVPZih0aGlzLmxpbmUpKSk7IAorCWVycm9yQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnByb2JsZW1fYXRMaW5lLCBTdHJpbmcudmFsdWVPZih0aGlzLmxpbmUpKSk7CiAJZXJyb3JCdWZmZXIuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOwogCWVycm9yQnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkKKwogCWNoYXIgYzsKIAlmaW5hbCBjaGFyIFNQQUNFID0gJ1x1MDAyMCc7CiAJZmluYWwgY2hhciBNQVJLID0gJ14nOwogCWZpbmFsIGNoYXIgVEFCID0gJ1x0JzsKIAkvL3RoZSBuZXh0IGNvZGUgdHJpZXMgdG8gdW5kZXJsaW5lIHRoZSB0b2tlbi4uLi4uCiAJLy9pdCBhc3N1bWVzIChmb3IgYSBnb29kIGRpc3BsYXkpIHRoYXQgdG9rZW4gc291cmNlIGRvZXMgbm90Ci0JLy9jb250YWluIGFueSBcciBcbi4gVGhpcyBpcyBmYWxzZSBvbiBzdGF0ZW1lbnRzICEgCisJLy9jb250YWluIGFueSBcciBcbi4gVGhpcyBpcyBmYWxzZSBvbiBzdGF0ZW1lbnRzICEKIAkvLyh0aGUgY29kZSBzdGlsbCB3b3JrcyBidXQgdGhlIGRpc3BsYXkgaXMgbm90IG9wdGltYWwgISkKIAogCS8vIGV4cGFuZCB0byBsaW5lIGxpbWl0cwpAQCAtODYsMTEgKzg5LDExIEBACiAJZm9yIChlbmQgPSB0aGlzLmVuZFBvc2l0aW9uID49IGxlbmd0aCA/IGxlbmd0aCAtIDEgOiB0aGlzLmVuZFBvc2l0aW9uIDsgZW5kKzEgPCBsZW5ndGg7IGVuZCsrKSB7CiAJCWlmICgoYyA9IHVuaXRTb3VyY2VbZW5kICsgMV0pID09ICdccicgfHwgYyA9PSAnXG4nKSBicmVhazsKIAl9Ci0JCisKIAkvLyB0cmltIGxlZnQgYW5kIHJpZ2h0IHNwYWNlcy90YWJzCiAJd2hpbGUgKChjID0gdW5pdFNvdXJjZVtiZWdpbl0pID09ICcgJyB8fCBjID09ICdcdCcpIGJlZ2luKys7CiAJLy93aGlsZSAoKGMgPSB1bml0U291cmNlW2VuZF0pID09ICcgJyB8fCBjID09ICdcdCcpIGVuZC0tOyBUT0RPIChwaGlsaXBwZSkgc2hvdWxkIGFsc28gdHJpbSByaWdodCwgYnV0IGFsbCB0ZXN0cyBhcmUgdG8gYmUgdXBkYXRlZAotCQorCiAJLy8gY29weSBzb3VyY2UKIAllcnJvckJ1ZmZlci5hcHBlbmQodW5pdFNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbisxKTsKIAllcnJvckJ1ZmZlci5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUikuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCkBAIC0xNzYsNyArMTc5LDcgQEAKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2F0ZWdvcml6ZWRQcm9ibGVtI2dldE1hcmtlclR5cGUoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldE1hcmtlclR5cGUoKSB7Ci0JcmV0dXJuIHRoaXMuaWQgPT0gSVByb2JsZW0uVGFzayAKKwlyZXR1cm4gdGhpcy5pZCA9PSBJUHJvYmxlbS5UYXNrCiAJCT8gTUFSS0VSX1RZUEVfVEFTSwogCQk6IE1BUktFUl9UWVBFX1BST0JMRU07CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCmluZGV4IDM5N2YyZGMuLjcyYWRlYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDYgKzI4LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBIYXNodGFibGVPZkludCBERUZBVUxUX0xPQ0FMRV9URU1QTEFURVM7CiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRV9RVU9URVMgPSAiJyciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0lOR0xFX1FVT1RFID0gIiciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRklSU1RfQVJHVU1FTlQgPSAiezB9Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAKIHB1YmxpYyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSB7CiAJdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKQEAgLTYxLDI2ICs2Miw0OCBAQAogICogQHJldHVybiBDYXRlZ29yaXplZFByb2JsZW0KICAqLwogcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAotCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLCAKLQlpbnQgcHJvYmxlbUlkLCAKLQlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLCAKLQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLCAKLQlpbnQgc2V2ZXJpdHksIAotCWludCBzdGFydFBvc2l0aW9uLCAKLQlpbnQgZW5kUG9zaXRpb24sIAorCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCWludCBwcm9ibGVtSWQsCisJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAorCWludCBzZXZlcml0eSwKKwlpbnQgc3RhcnRQb3NpdGlvbiwKKwlpbnQgZW5kUG9zaXRpb24sCiAJaW50IGxpbmVOdW1iZXIsCiAJaW50IGNvbHVtbk51bWJlcikgewogCiAJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSgKLQkJb3JpZ2luYXRpbmdGaWxlTmFtZSwgCisJCW9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCXRoaXMuZ2V0TG9jYWxpemVkTWVzc2FnZShwcm9ibGVtSWQsIG1lc3NhZ2VBcmd1bWVudHMpLAotCQlwcm9ibGVtSWQsIAotCQlwcm9ibGVtQXJndW1lbnRzLCAKLQkJc2V2ZXJpdHksIAotCQlzdGFydFBvc2l0aW9uLCAKLQkJZW5kUG9zaXRpb24sIAorCQlwcm9ibGVtSWQsCisJCXByb2JsZW1Bcmd1bWVudHMsCisJCXNldmVyaXR5LAorCQlzdGFydFBvc2l0aW9uLAorCQllbmRQb3NpdGlvbiwKIAkJbGluZU51bWJlciwKLQkJY29sdW1uTnVtYmVyKTsgCisJCWNvbHVtbk51bWJlcik7Cit9CitwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCisJaW50IHByb2JsZW1JZCwKKwlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCWludCBlbGFib3JhdGlvbklkLAorCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsCisJaW50IHNldmVyaXR5LAorCWludCBzdGFydFBvc2l0aW9uLAorCWludCBlbmRQb3NpdGlvbiwKKwlpbnQgbGluZU51bWJlciwKKwlpbnQgY29sdW1uTnVtYmVyKSB7CisJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSgKKwkJb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJdGhpcy5nZXRMb2NhbGl6ZWRNZXNzYWdlKHByb2JsZW1JZCwgZWxhYm9yYXRpb25JZCwgbWVzc2FnZUFyZ3VtZW50cyksCisJCXByb2JsZW1JZCwKKwkJcHJvYmxlbUFyZ3VtZW50cywKKwkJc2V2ZXJpdHksCisJCXN0YXJ0UG9zaXRpb24sCisJCWVuZFBvc2l0aW9uLAorCQlsaW5lTnVtYmVyLAorCQljb2x1bW5OdW1iZXIpOwogfQogcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGtleUZyb21JRChpbnQgaWQpIHsKICAgICByZXR1cm4gaWQgKyAxOyAvLyBrZXlzIGFyZSBvZmZzZXR0ZWQgYnkgb25lIGluIHRhYmxlLCBzaW5jZSBpdCBjYW5ub3QgaGFuZGxlIDAga2V5CkBAIC0xMDQsMjIgKzEyNywzMyBAQAogCQl0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMgPSBsb2FkTWVzc2FnZVRlbXBsYXRlcyhsb2NhbGUpOwogCX0KIH0KLQogcHVibGljIGZpbmFsIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKGludCBpZCwgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cykgewotCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgdGhpcy5tZXNzYWdlVGVtcGxhdGVzLmdldChrZXlGcm9tSUQoaWQgJiBJUHJvYmxlbS5JZ25vcmVDYXRlZ29yaWVzTWFzaykpOyAKLQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CisJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoaWQsIDAsIHByb2JsZW1Bcmd1bWVudHMpOworfQorcHVibGljIGZpbmFsIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKGludCBpZCwgaW50IGVsYWJvcmF0aW9uSWQsIFN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMpIHsKKwlTdHJpbmcgcmF3TWVzc2FnZSA9IChTdHJpbmcpIHRoaXMubWVzc2FnZVRlbXBsYXRlcy5nZXQoa2V5RnJvbUlEKGlkICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2spKTsKKwlpZiAocmF3TWVzc2FnZSA9PSBudWxsKSB7CiAJCXJldHVybiAiVW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtIGlkOiAiIC8vJE5PTi1OTFMtMSQKLQkJCSsgKGlkICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2spCi0JCQkrICIuIENoZWNrIGNvbXBpbGVyIHJlc291cmNlcy4iOyAgLy8kTk9OLU5MUy0xJAorCQkJKyAoaWQgJiBJUHJvYmxlbS5JZ25vcmVDYXRlZ29yaWVzTWFzaykgKyAiLiBDaGVjayBjb21waWxlciByZXNvdXJjZXMuIjsgIC8vJE5PTi1OTFMtMSQKKwl9CisJY2hhcltdIG1lc3NhZ2UgPSByYXdNZXNzYWdlLnRvQ2hhckFycmF5KCk7CisJaWYgKGVsYWJvcmF0aW9uSWQgIT0gMCkgeworCQlTdHJpbmcgZWxhYm9yYXRpb24gPSAoU3RyaW5nKSB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMuZ2V0KGtleUZyb21JRChlbGFib3JhdGlvbklkKSk7CisJCWlmIChlbGFib3JhdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZXJyb3IgbWVzc2FnZSBlbGFib3JhdGlvbiBmb3IgZWxhYm9yYXRpb24gaWQ6ICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgZWxhYm9yYXRpb25JZCArICIuIENoZWNrIGNvbXBpbGVyIHJlc291cmNlcy4iOyAgLy8kTk9OLU5MUy0xJAorCQl9CisJCW1lc3NhZ2UgPSBDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWVzc2FnZSwgRklSU1RfQVJHVU1FTlQsIGVsYWJvcmF0aW9uLnRvQ2hhckFycmF5KCkpOwogCX0KIAogCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWVzc2FnZUZvcm1hdCB3aGljaCBlbGltaW5hdGVzIGRvdWJsZSBxdW90ZXMgaW4gb3JpZ2luYWwgbWVzc2FnZQotCWNoYXJbXSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzID0KLQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1lc3NhZ2UudG9DaGFyQXJyYXkoKSwgRE9VQkxFX1FVT1RFUywgU0lOR0xFX1FVT1RFKTsKKwltZXNzYWdlID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1lc3NhZ2UsIERPVUJMRV9RVU9URVMsIFNJTkdMRV9RVU9URSk7CiAKLQlpZiAocHJvYmxlbUFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZyhtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzKTsKKwlpZiAocHJvYmxlbUFyZ3VtZW50cyA9PSBudWxsKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKG1lc3NhZ2UpOworCX0KIAotCWludCBsZW5ndGggPSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7CiAJaW50IHN0YXJ0ID0gMDsKIAlpbnQgZW5kID0gbGVuZ3RoOwogCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBudWxsOwpAQCAtMTI4LDM0ICsxNjIsMzMgQEAKIAkJb3V0cHV0LmFwcGVuZCgoU3RyaW5nKSB0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMuZ2V0KGtleUZyb21JRChJUHJvYmxlbS5KYXZhZG9jTWVzc2FnZVByZWZpeCAmIElQcm9ibGVtLklnbm9yZUNhdGVnb3JpZXNNYXNrKSkpOwogCX0KIAl3aGlsZSAodHJ1ZSkgewotCQlpZiAoKGVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZigneycsIG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMsIHN0YXJ0KSkgPiAtMSkgeworCQlpZiAoKGVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZigneycsIG1lc3NhZ2UsIHN0YXJ0KSkgPiAtMSkgewogCQkJaWYgKG91dHB1dCA9PSBudWxsKSBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCtwcm9ibGVtQXJndW1lbnRzLmxlbmd0aCoyMCk7Ci0JCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMsIHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQlpZiAoKHN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCd9JywgbWVzc2FnZVdpdGhOb0RvdWJsZVF1b3RlcywgZW5kICsgMSkpID4gLTEpIHsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlTdHJpbmcgYXJnSWQgPSBuZXcgU3RyaW5nKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMsIGVuZCArIDEsIHN0YXJ0IC0gZW5kIC0gMSk7CisJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2UsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCQlpZiAoKHN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCd9JywgbWVzc2FnZSwgZW5kICsgMSkpID4gLTEpIHsKIAkJCQl0cnkgewotCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQoYXJnSWQpOwotCQkJCQlvdXRwdXQuYXBwZW5kKHByb2JsZW1Bcmd1bWVudHNbaW5kZXhdKTsKKwkJCQkJb3V0cHV0LmFwcGVuZChwcm9ibGVtQXJndW1lbnRzW0NoYXJPcGVyYXRpb24ucGFyc2VJbnQobWVzc2FnZSwgZW5kICsgMSwgc3RhcnQgLSBlbmQgLSAxKV0pOwogCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzLCBlbmQgKyAxLCBzdGFydCAtIGVuZCk7CisJCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZSwgZW5kICsgMSwgc3RhcnQgLSBlbmQpOwogCQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAJCQkJCXJldHVybiAiQ2Fubm90IGJpbmQgbWVzc2FnZSBmb3IgcHJvYmxlbSAoaWQ6ICIgLy8kTk9OLU5MUy0xJAogCQkJCQkJKyAoaWQgJiBJUHJvYmxlbS5JZ25vcmVDYXRlZ29yaWVzTWFzaykKIAkJCQkJCSsgIikgXCIiICAvLyROT04tTkxTLTEkCi0JCQkJCQkrIG1lc3NhZ2UKKwkJCQkJCSsgbmV3IFN0cmluZyhtZXNzYWdlKQogCQkJCQkJKyAiXCIgd2l0aCBhcmd1bWVudHM6IHsiIC8vJE5PTi1OTFMtMSQKIAkJCQkJCSsgVXRpbC50b1N0cmluZyhwcm9ibGVtQXJndW1lbnRzKQogCQkJCQkJKyJ9IjsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQlzdGFydCsrOwogCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMsIGVuZCwgbGVuZ3RoKTsKKwkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2UsIGVuZCwgbGVuZ3RoKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChvdXRwdXQgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmcobWVzc2FnZVdpdGhOb0RvdWJsZVF1b3Rlcyk7Ci0JCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMsIHN0YXJ0LCBsZW5ndGggLSBzdGFydCk7CisJCQlpZiAob3V0cHV0ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IFN0cmluZyhtZXNzYWdlKTsKKwkJCX0KKwkJCW91dHB1dC5hcHBlbmQobWVzc2FnZSwgc3RhcnQsIGxlbmd0aCAtIHN0YXJ0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTgxLDcgKzIxNCw3IEBACiAJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKIAlTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKIAl0cnkgewotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgbG9jKTsgCisJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2MpOwogCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKIAkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIHJlc291cmNlIDogIiArIGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnByb3BlcnRpZXMgZm9yIGxvY2FsZSAiICsgbG9jKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJdGhyb3cgZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1IYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSGFuZGxlci5qYXZhCmluZGV4IGU3OTYxNTYuLjZiYWFkOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1IYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbUhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSw3ICszMSw3IEBACiBwdWJsaWMgY2xhc3MgUHJvYmxlbUhhbmRsZXIgewogCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBOb0FyZ3VtZW50ID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwotCQorCiAJZmluYWwgcHVibGljIElFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeTsKIAlwdWJsaWMgZmluYWwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5OwogCXB1YmxpYyBmaW5hbCBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKQEAgLTUyLDM5ICs1Miw2MyBAQAogICoJCUVycm9yIHwgV2FybmluZyB8IElnbm9yZQogICovCiBwdWJsaWMgaW50IGNvbXB1dGVTZXZlcml0eShpbnQgcHJvYmxlbUlkKXsKLQkKKwogCXJldHVybiBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcjsgLy8gYnkgZGVmYXVsdCBhbGwgcHJvYmxlbXMgYXJlIGVycm9ycwogfQogcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAotCWNoYXJbXSBmaWxlTmFtZSwgCi0JaW50IHByb2JsZW1JZCwgCi0JU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJY2hhcltdIGZpbGVOYW1lLAorCWludCBwcm9ibGVtSWQsCisJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKIAlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAotCWludCBzZXZlcml0eSwgCi0JaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKLQlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLCAKKwlpbnQgc2V2ZXJpdHksCisJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLAorCWludCBwcm9ibGVtRW5kUG9zaXRpb24sCiAJaW50IGxpbmVOdW1iZXIsCiAJaW50IGNvbHVtbk51bWJlcikgewogCiAJcmV0dXJuIHRoaXMucHJvYmxlbUZhY3RvcnkuY3JlYXRlUHJvYmxlbSgKLQkJZmlsZU5hbWUsIAotCQlwcm9ibGVtSWQsIAotCQlwcm9ibGVtQXJndW1lbnRzLCAKKwkJZmlsZU5hbWUsCisJCXByb2JsZW1JZCwKKwkJcHJvYmxlbUFyZ3VtZW50cywKIAkJbWVzc2FnZUFyZ3VtZW50cywKLQkJc2V2ZXJpdHksIAotCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCi0JCXByb2JsZW1FbmRQb3NpdGlvbiwgCisJCXNldmVyaXR5LAorCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwkJcHJvYmxlbUVuZFBvc2l0aW9uLAogCQlsaW5lTnVtYmVyLAotCQljb2x1bW5OdW1iZXIpOyAKKwkJY29sdW1uTnVtYmVyKTsKK30KK3B1YmxpYyBDYXRlZ29yaXplZFByb2JsZW0gY3JlYXRlUHJvYmxlbSgKKwkJY2hhcltdIGZpbGVOYW1lLAorCQlpbnQgcHJvYmxlbUlkLAorCQlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCQlpbnQgZWxhYm9yYXRpb25JZCwKKwkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKKwkJaW50IHNldmVyaXR5LAorCQlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sCisJCWludCBwcm9ibGVtRW5kUG9zaXRpb24sCisJCWludCBsaW5lTnVtYmVyLAorCQlpbnQgY29sdW1uTnVtYmVyKSB7CisJcmV0dXJuIHRoaXMucHJvYmxlbUZhY3RvcnkuY3JlYXRlUHJvYmxlbSgKKwkJZmlsZU5hbWUsCisJCXByb2JsZW1JZCwKKwkJcHJvYmxlbUFyZ3VtZW50cywKKwkJZWxhYm9yYXRpb25JZCwKKwkJbWVzc2FnZUFyZ3VtZW50cywKKwkJc2V2ZXJpdHksCisJCXByb2JsZW1TdGFydFBvc2l0aW9uLAorCQlwcm9ibGVtRW5kUG9zaXRpb24sCisJCWxpbmVOdW1iZXIsCisJCWNvbHVtbk51bWJlcik7CiB9CiBwdWJsaWMgdm9pZCBoYW5kbGUoCi0JaW50IHByb2JsZW1JZCwgCi0JU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJaW50IHByb2JsZW1JZCwKKwlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCWludCBlbGFib3JhdGlvbklkLAogCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsCi0JaW50IHNldmVyaXR5LCAKLQlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAotCWludCBwcm9ibGVtRW5kUG9zaXRpb24sIAotCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwgCisJaW50IHNldmVyaXR5LAorCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLAorCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwKIAlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CiAKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKQpAQCAtOTMsNyArMTE3LDcgQEAKIAkvLyBpZiBubyByZWZlcmVuY2UgY29udGV4dCwgd2UgbmVlZCB0byBhYm9ydCBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHByb2Nlc3MKIAlpZiAocmVmZXJlbmNlQ29udGV4dCA9PSBudWxsKSB7CiAJCWlmICgoc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcikgIT0gMCkgeyAvLyBub24gcmVwb3J0YWJsZSBlcnJvciBpcyBmYXRhbAotCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0gPSB0aGlzLmNyZWF0ZVByb2JsZW0obnVsbCwgcHJvYmxlbUlkLCBwcm9ibGVtQXJndW1lbnRzLCBtZXNzYWdlQXJndW1lbnRzLCBzZXZlcml0eSwgMCwgMCwgMCwgMCk7CQkJCisJCQlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IHRoaXMuY3JlYXRlUHJvYmxlbShudWxsLCBwcm9ibGVtSWQsIHByb2JsZW1Bcmd1bWVudHMsIGVsYWJvcmF0aW9uSWQsIG1lc3NhZ2VBcmd1bWVudHMsIHNldmVyaXR5LCAwLCAwLCAwLCAwKTsKIAkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKG51bGwsIHByb2JsZW0pOwogCQl9IGVsc2UgewogCQkJcmV0dXJuOyAvLyBpZ25vcmUgbm9uIHJlcG9ydGFibGUgd2FybmluZwpAQCAtMTA3LDM0ICsxMzEsMzUgQEAKIAlpbnQgY29sdW1uTnVtYmVyID0gcHJvYmxlbVN0YXJ0UG9zaXRpb24gPj0gMAogCQkJPyBVdGlsLnNlYXJjaENvbHVtbk51bWJlcih1bml0UmVzdWx0LmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSwgbGluZU51bWJlciwgcHJvYmxlbVN0YXJ0UG9zaXRpb24pCiAJCQk6IDA7Ci0JQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0gPSAKKwlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9CiAJCXRoaXMuY3JlYXRlUHJvYmxlbSgKLQkJCXVuaXRSZXN1bHQuZ2V0RmlsZU5hbWUoKSwgCi0JCQlwcm9ibGVtSWQsIAotCQkJcHJvYmxlbUFyZ3VtZW50cywgCisJCQl1bml0UmVzdWx0LmdldEZpbGVOYW1lKCksCisJCQlwcm9ibGVtSWQsCisJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJZWxhYm9yYXRpb25JZCwKIAkJCW1lc3NhZ2VBcmd1bWVudHMsCi0JCQlzZXZlcml0eSwgCi0JCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCisJCQlzZXZlcml0eSwKKwkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAogCQkJcHJvYmxlbUVuZFBvc2l0aW9uLAogCQkJbGluZU51bWJlciwKIAkJCWNvbHVtbk51bWJlcik7CiAKIAlpZiAocHJvYmxlbSA9PSBudWxsKSByZXR1cm47IC8vIHByb2JsZW0gY291bGRuJ3QgYmUgY3JlYXRlZCwgaWdub3JlCi0JCisKIAlzd2l0Y2ggKHNldmVyaXR5ICYgUHJvYmxlbVNldmVyaXRpZXMuRXJyb3IpIHsKIAkJY2FzZSBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciA6Ci0JCQl0aGlzLnJlY29yZChwcm9ibGVtLCB1bml0UmVzdWx0LCByZWZlcmVuY2VDb250ZXh0KTsKKwkJCXJlY29yZChwcm9ibGVtLCB1bml0UmVzdWx0LCByZWZlcmVuY2VDb250ZXh0KTsKIAkJCWlmICgoc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5GYXRhbCkgIT0gMCkgewogCQkJCXJlZmVyZW5jZUNvbnRleHQudGFnQXNIYXZpbmdFcnJvcnMoKTsKIAkJCQkvLyBzaG91bGQgYWJvcnQgPwogCQkJCWludCBhYm9ydExldmVsOwotCQkJCWlmICgoYWJvcnRMZXZlbCA9IAl0aGlzLnBvbGljeS5zdG9wT25GaXJzdEVycm9yKCkgPyBQcm9ibGVtU2V2ZXJpdGllcy5BYm9ydENvbXBpbGF0aW9uIDogc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5BYm9ydCkgIT0gMCkgeworCQkJCWlmICgoYWJvcnRMZXZlbCA9IHRoaXMucG9saWN5LnN0b3BPbkZpcnN0RXJyb3IoKSA/IFByb2JsZW1TZXZlcml0aWVzLkFib3J0Q29tcGlsYXRpb24gOiBzZXZlcml0eSAmIFByb2JsZW1TZXZlcml0aWVzLkFib3J0KSAhPSAwKSB7CiAJCQkJCXJlZmVyZW5jZUNvbnRleHQuYWJvcnQoYWJvcnRMZXZlbCwgcHJvYmxlbSk7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZyA6Ci0JCQl0aGlzLnJlY29yZChwcm9ibGVtLCB1bml0UmVzdWx0LCByZWZlcmVuY2VDb250ZXh0KTsKKwkJCXJlY29yZChwcm9ibGVtLCB1bml0UmVzdWx0LCByZWZlcmVuY2VDb250ZXh0KTsKIAkJCWJyZWFrOwogCX0KIH0KQEAgLTE0MywxOSArMTY4LDIwIEBACiAgKiBmcm9tIHRoZSBwcm9ibGVtIElEIGFuZCB0aGUgY3VycmVudCBjb21waWxlciBvcHRpb25zLgogICovCiBwdWJsaWMgdm9pZCBoYW5kbGUoCi0JaW50IHByb2JsZW1JZCwgCi0JU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJaW50IHByb2JsZW1JZCwKKwlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAogCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsCi0JaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKLQlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLCAKLQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQsIAorCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLAorCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwKIAlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CiAKIAl0aGlzLmhhbmRsZSgKIAkJcHJvYmxlbUlkLAogCQlwcm9ibGVtQXJndW1lbnRzLAorCQkwLCAvLyBubyBtZXNzYWdlIGVsYWJvcmF0aW9uCiAJCW1lc3NhZ2VBcmd1bWVudHMsCi0JCXRoaXMuY29tcHV0ZVNldmVyaXR5KHByb2JsZW1JZCksIC8vIHNldmVyaXR5IGluZmVycmVkIHVzaW5nIHRoZSBJRAorCQljb21wdXRlU2V2ZXJpdHkocHJvYmxlbUlkKSwgLy8gc2V2ZXJpdHkgaW5mZXJyZWQgdXNpbmcgdGhlIElECiAJCXByb2JsZW1TdGFydFBvc2l0aW9uLAogCQlwcm9ibGVtRW5kUG9zaXRpb24sCiAJCXJlZmVyZW5jZUNvbnRleHQsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCmluZGV4IDVmY2YzZjYuLjQxYzE0NDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNDUgKzcsMTQwIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJlbmphbWluIE11c2thbGxhIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMjM5MDY2CisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAgLSBDb250cmlidXRpb25zIGZvciAKKyAqICAgICAJCQkJCQlidWcgMjM2Mzg1IC0gCisgKiAgICAgCQkJCQkJYnVnIDMzODMwMyAtIFdhcm5pbmcgYWJvdXQgUmVkdW5kYW50IGFzc2lnbm1lbnQgY29uZmxpY3RzIHdpdGggZGVmaW5pdGUgYXNzaWdubWVudAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtOwogCiBpbXBvcnQgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JRXJyb3JIYW5kbGluZ1BvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CaW5hcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CcmFuY2hTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXNlU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2FzdEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBvdW5kQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FcXVhbEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lkluc3RhbmNlT2ZFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTGFiZWxlZFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWROYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJldHVyblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Td2l0Y2hTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmFyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaWxkY2FyZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUmVzdHJpY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkludm9jYXRpb25TaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbU1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TeW50aGV0aWNBcmd1bWVudEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5XaWxkY2FyZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5KYXZhZG9jVGFnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcnlTY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk1lc3NhZ2VzOwogCiBwdWJsaWMgY2xhc3MgUHJvYmxlbVJlcG9ydGVyIGV4dGVuZHMgUHJvYmxlbUhhbmRsZXIgewotCQorCiAJcHVibGljIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dDsKIAlwcml2YXRlIFNjYW5uZXIgcG9zaXRpb25TY2FubmVyOwotCQotcHVibGljIHN0YXRpYyBsb25nIGdldElycml0YW50KGludCBwcm9ibGVtSUQpIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlCisJICAvLyBUWVBFX0FDQ0VTUyA9IDB4MCwKKwkgIEZJRUxEX0FDQ0VTUyA9IDB4NCwKKwkgIENPTlNUUlVDVE9SX0FDQ0VTUyA9IDB4OCwKKwkgIE1FVEhPRF9BQ0NFU1MgPSAweEM7CisKK3B1YmxpYyBQcm9ibGVtUmVwb3J0ZXIoSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LCBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisJc3VwZXIocG9saWN5LCBvcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7Cit9CisKK3ByaXZhdGUgc3RhdGljIGludCBnZXRFbGFib3JhdGlvbklkIChpbnQgbGVhZFByb2JsZW1JZCwgYnl0ZSBlbGFib3JhdGlvblZhcmlhbnQpIHsKKwlyZXR1cm4gbGVhZFByb2JsZW1JZCA8PCA4IHwgZWxhYm9yYXRpb25WYXJpYW50OyAvLyBsZWFkUHJvYmxlbUlkIGNvbWVzIGludG8gdGhlIGhpZ2hlciBvcmRlciBieXRlcworfQorcHVibGljIHN0YXRpYyBpbnQgZ2V0SXJyaXRhbnQoaW50IHByb2JsZW1JRCkgewogCXN3aXRjaChwcm9ibGVtSUQpewogCi0JCWNhc2UgSVByb2JsZW0uTWFza2VkQ2F0Y2ggOiAKKwkJY2FzZSBJUHJvYmxlbS5NYXNrZWRDYXRjaCA6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLk1hc2tlZENhdGNoQmxvY2s7CiAKIAkJY2FzZSBJUHJvYmxlbS5VbnVzZWRJbXBvcnQgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQ7Ci0JCQkKKwogCQljYXNlIElQcm9ibGVtLk1ldGhvZEJ1dFdpdGhDb25zdHJ1Y3Rvck5hbWUgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5NZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOwotCQkKKwogCQljYXNlIElQcm9ibGVtLk92ZXJyaWRpbmdOb25WaXNpYmxlTWV0aG9kIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kOwogCkBAIC01MywxNiArMTQ4LDE2IEBACiAJCWNhc2UgSVByb2JsZW0uSW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2VGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5JbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7CiAKLQkJY2FzZSBJUHJvYmxlbS5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCA6CQkJCQotCQljYXNlIElQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZFR5cGUgOgkJCQkKKwkJY2FzZSBJUHJvYmxlbS5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCA6CisJCWNhc2UgSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkVHlwZSA6CiAJCWNhc2UgSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkTWV0aG9kIDoKIAkJY2FzZSBJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRDb25zdHJ1Y3RvciA6CiAJCWNhc2UgSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkRmllbGQgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5Vc2luZ0RlcHJlY2F0ZWRBUEk7Ci0JCQorCiAJCWNhc2UgSVByb2JsZW0uTG9jYWxWYXJpYWJsZUlzTmV2ZXJVc2VkIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW51c2VkTG9jYWxWYXJpYWJsZTsKLQkJCisKIAkJY2FzZSBJUHJvYmxlbS5Bcmd1bWVudElzTmV2ZXJVc2VkIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW51c2VkQXJndW1lbnQ7CiAKQEAgLTcyLDcgKzE2Nyw3IEBACiAJCWNhc2UgSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyA6CiAJCWNhc2UgSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MgOgogCQljYXNlIElQcm9ibGVtLk5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MgOgotCQljYXNlIElQcm9ibGVtLk5lZWRUb0VtdWxhdGVDb25zdHJ1Y3RvckFjY2VzcyA6CQkJCisJCWNhc2UgSVByb2JsZW0uTmVlZFRvRW11bGF0ZUNvbnN0cnVjdG9yQWNjZXNzIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuQWNjZXNzRW11bGF0aW9uOwogCiAJCWNhc2UgSVByb2JsZW0uTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA6CkBAIC04MSw3ICsxNzYsNyBAQAogCiAJCWNhc2UgSVByb2JsZW0uVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5Bc3NlcnRVc2VkQXNBbklkZW50aWZpZXI7Ci0JCQkKKwogCQljYXNlIElQcm9ibGVtLlVzZUVudW1Bc0FuSWRlbnRpZmllciA6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLkVudW1Vc2VkQXNBbklkZW50aWZpZXI7CiAKQEAgLTExOCw3ICsyMTMsNyBAQAogCQljYXNlIElQcm9ibGVtLlR5cGVIaWRpbmdUeXBlUGFyYW1ldGVyRnJvbU1ldGhvZDoKIAkJY2FzZSBJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZToKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVHlwZUhpZGluZzsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uUG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLkFjY2lkZW50YWxCb29sZWFuQXNzaWduOwogCkBAIC0xMjgsMjEgKzIyMywyMSBAQAogCiAJCWNhc2UgSVByb2JsZW0uVW5kb2N1bWVudGVkRW1wdHlCbG9jazoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW5kb2N1bWVudGVkRW1wdHlCbG9jazsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uVW5uZWNlc3NhcnlDYXN0OgogCQljYXNlIElQcm9ibGVtLlVubmVjZXNzYXJ5SW5zdGFuY2VvZjoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlUeXBlQ2hlY2s7Ci0JCQkKKwogCQljYXNlIElQcm9ibGVtLkZpbmFsbHlNdXN0Q29tcGxldGVOb3JtYWxseToKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuRmluYWxseUJsb2NrTm90Q29tcGxldGluZzsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uVW51c2VkTWV0aG9kRGVjbGFyZWRUaHJvd25FeGNlcHRpb246CiAJCWNhc2UgSVByb2JsZW0uVW51c2VkQ29uc3RydWN0b3JEZWNsYXJlZFRocm93bkV4Y2VwdGlvbjoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb247CiAKIAkJY2FzZSBJUHJvYmxlbS5VbnF1YWxpZmllZEZpZWxkQWNjZXNzOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5VbnF1YWxpZmllZEZpZWxkQWNjZXNzOwotCQkKKwogCQljYXNlIElQcm9ibGVtLlVubmVjZXNzYXJ5RWxzZToKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlFbHNlOwogCkBAIC0xNTUsMjUgKzI1MCwyNyBAQAogCQljYXNlIElQcm9ibGVtLlVuc2FmZVJhd0dlbmVyaWNNZXRob2RJbnZvY2F0aW9uOgogCQljYXNlIElQcm9ibGVtLlVuc2FmZVJhd0dlbmVyaWNDb25zdHJ1Y3Rvckludm9jYXRpb246CiAJCWNhc2UgSVByb2JsZW0uVW5zYWZlR2VuZXJpY0FycmF5Rm9yVmFyYXJnczoKKwkJY2FzZSBJUHJvYmxlbS5Qb3RlbnRpYWxIZWFwUG9sbHV0aW9uRnJvbVZhcmFyZzoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW5jaGVja2VkVHlwZU9wZXJhdGlvbjsKIAogCQljYXNlIElQcm9ibGVtLlJhd1R5cGVSZWZlcmVuY2U6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2U7CiAKIAkJY2FzZSBJUHJvYmxlbS5NaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uOgorCQljYXNlIElQcm9ibGVtLk1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbjoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuTWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbjsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uRmllbGRNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb246CiAJCWNhc2UgSVByb2JsZW0uTWV0aG9kTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uOgogCQljYXNlIElQcm9ibGVtLlR5cGVNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb246CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbjsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uRmluYWxCb3VuZEZvclR5cGVWYXJpYWJsZToKIAkJICAgIHJldHVybiBDb21waWxlck9wdGlvbnMuRmluYWxQYXJhbWV0ZXJCb3VuZDsKIAogCQljYXNlIElQcm9ibGVtLk1pc3NpbmdTZXJpYWxWZXJzaW9uOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nU2VyaWFsVmVyc2lvbjsKLQkJCisKIAkJY2FzZSBJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2U6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLkZvcmJpZGRlblJlZmVyZW5jZTsKIApAQCAtMTg5LDcgKzI4Niw3IEBACiAKIAkJY2FzZSBJUHJvYmxlbS5Qb3RlbnRpYWxOdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZToKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuUG90ZW50aWFsTnVsbFJlZmVyZW5jZTsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uUmVkdW5kYW50TG9jYWxWYXJpYWJsZU51bGxBc3NpZ25tZW50OgogCQljYXNlIElQcm9ibGVtLlJlZHVuZGFudE51bGxDaGVja09uTm9uTnVsbExvY2FsVmFyaWFibGU6CiAJCWNhc2UgSVByb2JsZW0uUmVkdW5kYW50TnVsbENoZWNrT25OdWxsTG9jYWxWYXJpYWJsZToKQEAgLTE5NywyMCArMjk0LDIzIEBACiAJCWNhc2UgSVByb2JsZW0uTnVsbExvY2FsVmFyaWFibGVDb21wYXJpc29uWWllbGRzRmFsc2U6CiAJCWNhc2UgSVByb2JsZW0uTnVsbExvY2FsVmFyaWFibGVJbnN0YW5jZW9mWWllbGRzRmFsc2U6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLlJlZHVuZGFudE51bGxDaGVjazsKLQkJCQorCiAJCWNhc2UgSVByb2JsZW0uQm94aW5nQ29udmVyc2lvbiA6CiAJCWNhc2UgSVByb2JsZW0uVW5ib3hpbmdDb252ZXJzaW9uIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuQXV0b0JveGluZzsKIAogCQljYXNlIElQcm9ibGVtLk1pc3NpbmdFbnVtQ29uc3RhbnRDYXNlIDoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuSW5jb21wbGV0ZUVudW1Td2l0Y2g7Ci0JCQkKKwogCQljYXNlIElQcm9ibGVtLkFubm90YXRpb25UeXBlVXNlZEFzU3VwZXJJbnRlcmZhY2UgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5Bbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U7Ci0JCQkKKwogCQljYXNlIElQcm9ibGVtLlVuaGFuZGxlZFdhcm5pbmdUb2tlbiA6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLlVuaGFuZGxlZFdhcm5pbmdUb2tlbjsKLQkJCQorCisJCWNhc2UgSVByb2JsZW0uVW51c2VkV2FybmluZ1Rva2VuIDoKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVW51c2VkV2FybmluZ1Rva2VuOworCiAJCWNhc2UgSVByb2JsZW0uVW51c2VkTGFiZWwgOgogCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRMYWJlbDsKIApAQCAtMjc1LDYgKzM3NSw4IEBACiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY1VzaW5nRGVwcmVjYXRlZE1ldGhvZDoKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jVXNpbmdEZXByZWNhdGVkVHlwZToKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jSGlkZGVuUmVmZXJlbmNlOgorCQljYXNlIElQcm9ibGVtLkphdmFkb2NNaXNzaW5nVGFnRGVzY3JpcHRpb246CisJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0ludmFsaWRTZWVVcmxSZWZlcmVuY2U6CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLkludmFsaWRKYXZhZG9jOwogCiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY01pc3NpbmdQYXJhbVRhZzoKQEAgLTI5MCw5ICszOTIsNDMgQEAKIAogCQljYXNlIElQcm9ibGVtLkZhbGx0aHJvdWdoQ2FzZToKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuRmFsbHRocm91Z2hDYXNlOwotCQkJCisKIAkJY2FzZSBJUHJvYmxlbS5PdmVycmlkaW5nTWV0aG9kV2l0aG91dFN1cGVySW52b2NhdGlvbjoKIAkJCXJldHVybiBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb247CisKKwkJY2FzZSBJUHJvYmxlbS5VbnVzZWRUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbjoKKwkJY2FzZSBJUHJvYmxlbS5VbnVzZWRUeXBlQXJndW1lbnRzRm9yQ29uc3RydWN0b3JJbnZvY2F0aW9uOgorCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRUeXBlQXJndW1lbnRzOworCisJCWNhc2UgSVByb2JsZW0uUmVkdW5kYW50U3VwZXJpbnRlcmZhY2U6CisJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLlJlZHVuZGFudFN1cGVyaW50ZXJmYWNlOworCisJCWNhc2UgSVByb2JsZW0uQ29tcGFyaW5nSWRlbnRpY2FsOgorCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5Db21wYXJpbmdJZGVudGljYWw7CisJCQkKKwkJY2FzZSBJUHJvYmxlbS5NaXNzaW5nU3luY2hyb25pemVkTW9kaWZpZXJJbkluaGVyaXRlZE1ldGhvZDoKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuTWlzc2luZ1N5bmNocm9uaXplZE1vZGlmaWVySW5Jbmhlcml0ZWRNZXRob2Q7CisKKwkJY2FzZSBJUHJvYmxlbS5TaG91bGRJbXBsZW1lbnRIYXNoY29kZToKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuU2hvdWxkSW1wbGVtZW50SGFzaGNvZGU7CisJCQkKKwkJY2FzZSBJUHJvYmxlbS5EZWFkQ29kZToKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuRGVhZENvZGU7CisJCQkKKwkJY2FzZSBJUHJvYmxlbS5UYXNrIDoKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuVGFza3M7CisKKwkJY2FzZSBJUHJvYmxlbS5VbnVzZWRPYmplY3RBbGxvY2F0aW9uOgorCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRPYmplY3RBbGxvY2F0aW9uOworCQkJCisJCWNhc2UgSVByb2JsZW0uTWV0aG9kQ2FuQmVTdGF0aWM6CisJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLk1ldGhvZENhbkJlU3RhdGljOworCQkJCisJCWNhc2UgSVByb2JsZW0uTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYzoKKwkJCXJldHVybiBDb21waWxlck9wdGlvbnMuTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYzsKKwkJCQkKKwkJY2FzZSBJUHJvYmxlbS5SZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzOgorCQkJcmV0dXJuIENvbXBpbGVyT3B0aW9ucy5SZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMwNywxMTAgKzQ0MywxMDEgQEAKIAkJLy8gZmF0YWwgcHJvYmxlbXMgZXZlbiBpZiBvcHRpb25hbCBhcmUgYWxsIGZhbGxpbmcgaW50byBzYW1lIGNhdGVnb3J5IChub3QgaXJyaXRhbnQgYmFzZWQpCiAJCWlmICgoc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5GYXRhbCkgIT0gMCkKIAkJCWJyZWFrIGNhdGVnb3JpemVPbklycml0YW50OwotCQlsb25nIGlycml0YW50ID0gZ2V0SXJyaXRhbnQocHJvYmxlbUlEKTsKLQkJaW50IGlycml0YW50SW50ID0gKGludCkgaXJyaXRhbnQ7Ci0JCWlmIChpcnJpdGFudEludCA9PSBpcnJpdGFudCkgewotCQkJc3dpdGNoIChpcnJpdGFudEludCkgewotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZToKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLkFjY2Vzc0VtdWxhdGlvbjoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLkFzc2VydFVzZWRBc0FuSWRlbnRpZmllcjoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLk5vblN0YXRpY0FjY2Vzc1RvU3RhdGljOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuVW5xdWFsaWZpZWRGaWVsZEFjY2VzczoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2s6Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5JbmRpcmVjdFN0YXRpY0FjY2VzczoKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfQ09ERV9TVFlMRTsKLQkJCQkJCi0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5NYXNrZWRDYXRjaEJsb2NrOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb246Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5Ob0VmZmVjdEFzc2lnbm1lbnQ6Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5BY2NpZGVudGFsQm9vbGVhbkFzc2lnbjoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLkVtcHR5U3RhdGVtZW50OgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuRmluYWxseUJsb2NrTm90Q29tcGxldGluZzoKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfUE9URU5USUFMX1BST0dSQU1NSU5HX1BST0JMRU07Ci0JCQotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuTG9jYWxWYXJpYWJsZUhpZGluZzoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLkZpZWxkSGlkaW5nOgotCQkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9OQU1FX1NIQURPV0lOR19DT05GTElDVDsKLQkJCQkJCi0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5VbnVzZWRMb2NhbFZhcmlhYmxlOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuVW51c2VkQXJndW1lbnQ6Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQ6Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5VbnVzZWRQcml2YXRlTWVtYmVyOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb246Ci0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5Vbm5lY2Vzc2FyeVR5cGVDaGVjazoKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLlVubmVjZXNzYXJ5RWxzZToKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfVU5ORUNFU1NBUllfQ09ERTsKLQkJCi0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5Vc2luZ0RlcHJlY2F0ZWRBUEk6Ci0JCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX0RFUFJFQ0FUSU9OOwotCQkJCQkKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLk5vbkV4dGVybmFsaXplZFN0cmluZzoKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfTkxTOwotCQkJCQkKLQkJCQljYXNlIChpbnQpQ29tcGlsZXJPcHRpb25zLlRhc2s6Ci0JCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1VOU1BFQ0lGSUVEOyAvLyBUT0RPIG1heSB3YW50IHRvIGltcHJvdmUKLQkJCQkJCi0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5NaXNzaW5nSmF2YWRvY0NvbW1lbnRzOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuTWlzc2luZ0phdmFkb2NUYWdzOgotCQkJCWNhc2UgKGludClDb21waWxlck9wdGlvbnMuSW52YWxpZEphdmFkb2M6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuSW52YWxpZEphdmFkb2MgfCBDb21waWxlck9wdGlvbnMuVXNpbmdEZXByZWNhdGVkQVBJKToKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfSkFWQURPQzsKLQkJCQkJCi0JCQkJY2FzZSAoaW50KUNvbXBpbGVyT3B0aW9ucy5VbmNoZWNrZWRUeXBlT3BlcmF0aW9uOgotCQkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9VTkNIRUNLRURfUkFXOwotCQkJCQkKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhayBjYXRlZ29yaXplT25JcnJpdGFudDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlycml0YW50SW50ID0gKGludCkoaXJyaXRhbnQgPj4+IDMyKTsKLQkJCXN3aXRjaCAoaXJyaXRhbnRJbnQpIHsKLQkJCQljYXNlIChpbnQpKENvbXBpbGVyT3B0aW9ucy5GaW5hbFBhcmFtZXRlckJvdW5kID4+PiAzMik6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuRW51bVVzZWRBc0FuSWRlbnRpZmllciA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLkFubm90YXRpb25TdXBlckludGVyZmFjZSA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLkF1dG9Cb3hpbmcgPj4+IDMyKToKLQkJCQljYXNlIChpbnQpKENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uID4+PiAzMik6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uID4+PiAzMik6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuUGFyYW1ldGVyQXNzaWdubWVudCA+Pj4gMzIpOgotCQkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9DT0RFX1NUWUxFOwotCQkJCQotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdTZXJpYWxWZXJzaW9uID4+PiAzMik6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QgPj4+IDMyKToKLQkJCQljYXNlIChpbnQpKENvbXBpbGVyT3B0aW9ucy5OdWxsUmVmZXJlbmNlID4+PiAzMik6Ci0JCQkJY2FzZSAoaW50KShDb21waWxlck9wdGlvbnMuUG90ZW50aWFsTnVsbFJlZmVyZW5jZSA+Pj4gMzIpOgkJCQkKLQkJCQljYXNlIChpbnQpKENvbXBpbGVyT3B0aW9ucy5SZWR1bmRhbnROdWxsQ2hlY2sgPj4+IDMyKToKLQkJCQljYXNlIChpbnQpKENvbXBpbGVyT3B0aW9ucy5JbmNvbXBsZXRlRW51bVN3aXRjaCA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLkZhbGx0aHJvdWdoQ2FzZSA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLk92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uID4+PiAzMik6Ci0JCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1BPVEVOVElBTF9QUk9HUkFNTUlOR19QUk9CTEVNOwotCQotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLlR5cGVIaWRpbmcgPj4+IDMyKToKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfTkFNRV9TSEFET1dJTkdfQ09ORkxJQ1Q7Ci0JCQkJCQotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLlVuaGFuZGxlZFdhcm5pbmdUb2tlbiA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLlVudXNlZExhYmVsID4+PiAzMik6Ci0JCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1VOTkVDRVNTQVJZX0NPREU7CisJCWludCBpcnJpdGFudCA9IGdldElycml0YW50KHByb2JsZW1JRCk7CisJCXN3aXRjaCAoaXJyaXRhbnQpIHsKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuQWNjZXNzRW11bGF0aW9uIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkFzc2VydFVzZWRBc0FuSWRlbnRpZmllciA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5Ob25TdGF0aWNBY2Nlc3NUb1N0YXRpYyA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5VbnF1YWxpZmllZEZpZWxkQWNjZXNzIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2sgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuSW5kaXJlY3RTdGF0aWNBY2Nlc3MgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuRmluYWxQYXJhbWV0ZXJCb3VuZCA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5FbnVtVXNlZEFzQW5JZGVudGlmaWVyIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkFubm90YXRpb25TdXBlckludGVyZmFjZSA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5BdXRvQm94aW5nIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdPdmVycmlkZUFubm90YXRpb24gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlBhcmFtZXRlckFzc2lnbm1lbnQgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTWV0aG9kQ2FuQmVTdGF0aWMgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYyA6CisJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfQ09ERV9TVFlMRTsKIAotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLkZvcmJpZGRlblJlZmVyZW5jZSA+Pj4gMzIpOgotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLkRpc2NvdXJhZ2VkUmVmZXJlbmNlID4+PiAzMik6Ci0JCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1JFU1RSSUNUSU9OOwotCQotCQkJCWNhc2UgKGludCkoQ29tcGlsZXJPcHRpb25zLlJhd1R5cGVSZWZlcmVuY2UgPj4+IDMyKToKLQkJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfVU5DSEVDS0VEX1JBVzsKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLk1hc2tlZENhdGNoQmxvY2sgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTm9FZmZlY3RBc3NpZ25tZW50IDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkFjY2lkZW50YWxCb29sZWFuQXNzaWduIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkVtcHR5U3RhdGVtZW50IDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmcgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTWlzc2luZ1NlcmlhbFZlcnNpb24gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTnVsbFJlZmVyZW5jZSA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5Qb3RlbnRpYWxOdWxsUmVmZXJlbmNlIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlJlZHVuZGFudE51bGxDaGVjayA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5JbmNvbXBsZXRlRW51bVN3aXRjaCA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5GYWxsdGhyb3VnaENhc2UgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuQ29tcGFyaW5nSWRlbnRpY2FsIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLk1pc3NpbmdTeW5jaHJvbml6ZWRNb2RpZmllckluSW5oZXJpdGVkTWV0aG9kIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlNob3VsZEltcGxlbWVudEhhc2hjb2RlIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkRlYWRDb2RlIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlVudXNlZE9iamVjdEFsbG9jYXRpb24gOgorCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1BPVEVOVElBTF9QUk9HUkFNTUlOR19QUk9CTEVNOworCQkJCisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5PdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkxvY2FsVmFyaWFibGVIaWRpbmcgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuRmllbGRIaWRpbmcgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVHlwZUhpZGluZyA6CisJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfTkFNRV9TSEFET1dJTkdfQ09ORkxJQ1Q7CiAKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhayBjYXRlZ29yaXplT25JcnJpdGFudDsKLQkJCX0KLQkJfQkKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlVudXNlZExvY2FsVmFyaWFibGUgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW51c2VkQXJndW1lbnQgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW51c2VkSW1wb3J0IDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlVudXNlZFByaXZhdGVNZW1iZXIgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlUeXBlQ2hlY2sgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW5uZWNlc3NhcnlFbHNlIDoKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlVuaGFuZGxlZFdhcm5pbmdUb2tlbiA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRXYXJuaW5nVG9rZW4gOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW51c2VkTGFiZWwgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuUmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyA6CisJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfVU5ORUNFU1NBUllfQ09ERTsKKworCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVXNpbmdEZXByZWNhdGVkQVBJIDoKKwkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9ERVBSRUNBVElPTjsKKworCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTm9uRXh0ZXJuYWxpemVkU3RyaW5nIDoKKwkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9OTFM7CisKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLlRhc2sgOgorCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1VOU1BFQ0lGSUVEOyAvLyBUT0RPIG1heSB3YW50IHRvIGltcHJvdmUKKwkJCQorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuTWlzc2luZ0phdmFkb2NDb21tZW50cyA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nSmF2YWRvY1RhZ3MgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuSW52YWxpZEphdmFkb2MgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuSW52YWxpZEphdmFkb2N8Q29tcGlsZXJPcHRpb25zLlVzaW5nRGVwcmVjYXRlZEFQSSA6CisJCQkJcmV0dXJuIENhdGVnb3JpemVkUHJvYmxlbS5DQVRfSkFWQURPQzsKKworCQkJY2FzZSBDb21waWxlck9wdGlvbnMuVW5jaGVja2VkVHlwZU9wZXJhdGlvbiA6CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5SYXdUeXBlUmVmZXJlbmNlIDoKKwkJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9VTkNIRUNLRURfUkFXOworCQkJCisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5Gb3JiaWRkZW5SZWZlcmVuY2UgOgorCQkJY2FzZSBDb21waWxlck9wdGlvbnMuRGlzY291cmFnZWRSZWZlcmVuY2UgOgorCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1JFU1RSSUNUSU9OOworCQkJCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrIGNhdGVnb3JpemVPbklycml0YW50OworCQl9CiAJfQogCS8vIGNhdGVnb3JpemUgZmF0YWwgcHJvYmxlbXMgcGVyIElECiAJc3dpdGNoIChwcm9ibGVtSUQpIHsKIAkJY2FzZSBJUHJvYmxlbS5Jc0NsYXNzUGF0aENvcnJlY3QgOgogCQljYXNlIElQcm9ibGVtLkNvcnJ1cHRlZFNpZ25hdHVyZSA6CiAJCQlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9CVUlMRFBBVEg7Ci0JCQkKKwogCQlkZWZhdWx0IDoKIAkJCWlmICgocHJvYmxlbUlEICYgSVByb2JsZW0uU3ludGF4KSAhPSAwKQogCQkJCXJldHVybiBDYXRlZ29yaXplZFByb2JsZW0uQ0FUX1NZTlRBWDsKQEAgLTQyMyw5ICs1NTAsNiBAQAogCX0KIAlyZXR1cm4gQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9JTlRFUk5BTDsKIH0KLXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIoSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LCBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7Ci0Jc3VwZXIocG9saWN5LCBvcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7Ci19CiBwdWJsaWMgdm9pZCBhYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CiAJdGhpcy5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihlcnJvck1lc3NhZ2UsIG51bGwpOwogfQpAQCAtNDQ1LDE0ICs1NjksMTQgQEAKIAkJLy8gJTEgbXVzdCBiZSBhYnN0cmFjdCBzaW5jZSBpdCBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGluaGVyaXRlZCBwYWNrYWdlLXByaXZhdGUgYWJzdHJhY3QgbWV0aG9kICUyCiAJCUlQcm9ibGVtLkFic3RyYWN0TWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuLAogCQluZXcgU3RyaW5nW10gewotCQkJbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIAorCQkJbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKAogCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKIAkJCQkJCWNvbmNyZXRlTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpLAogCQkJCQkJY29uY3JldGVNZXRob2QucmVhZGFibGVOYW1lKCksCiAJCQkJCQknLicpKX0sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgCisJCQluZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwKIAkJCW5ldyBTdHJpbmcoCiAJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAogCQkJCQkJY29uY3JldGVNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSwKQEAgLTQ2MiwzMSArNTg2LDExMCBAQAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewotCi0JU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX07Ci0JdGhpcy5oYW5kbGUoCi0JCUlQcm9ibGVtLkFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzLAotCQlhcmd1bWVudHMsCi0JCWFyZ3VtZW50cywKLQkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKLQkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworCWlmICh0eXBlLmlzRW51bSgpICYmIHR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQlGaWVsZEJpbmRpbmcgZmllbGQgPSB0eXBlLnNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkuaW5pdGlhbGl6ZWRGaWVsZDsKKwkJRmllbGREZWNsYXJhdGlvbiBkZWNsID0gZmllbGQuc291cmNlRmllbGQoKTsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGRlY2wubmFtZSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9OworCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkFic3RyYWN0TWV0aG9kSW5FbnVtLAorCQkJYXJndW1lbnRzLAorCQkJYXJndW1lbnRzLAorCQkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKKwl9IGVsc2UgeworCQlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfTsKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5BYnN0cmFjdE1ldGhvZEluQWJzdHJhY3RDbGFzcywKKwkJCWFyZ3VtZW50cywKKwkJCWFyZ3VtZW50cywKKwkJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CisJfQorfQorcHVibGljIHZvaWQgYWJzdHJhY3RNZXRob2RJbkNvbmNyZXRlQ2xhc3MoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCWlmICh0eXBlLmlzRW51bSgpICYmIHR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQlGaWVsZEJpbmRpbmcgZmllbGQgPSB0eXBlLnNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkuaW5pdGlhbGl6ZWRGaWVsZDsKKwkJRmllbGREZWNsYXJhdGlvbiBkZWNsID0gZmllbGQuc291cmNlRmllbGQoKTsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGRlY2wubmFtZSl9OworCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkVudW1Db25zdGFudENhbm5vdERlZmluZUFic3RyYWN0TWV0aG9kLAorCQkJYXJndW1lbnRzLAorCQkJYXJndW1lbnRzLAorCQkJZGVjbC5zb3VyY2VTdGFydCgpLAorCQkJZGVjbC5zb3VyY2VFbmQoKSk7CisJfSBlbHNlIHsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uQWJzdHJhY3RNZXRob2RzSW5Db25jcmV0ZUNsYXNzLAorCQkJYXJndW1lbnRzLAorCQkJYXJndW1lbnRzLAorCQkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQkJdHlwZS5zb3VyY2VFbmQoKSk7CisJfQogfQogcHVibGljIHZvaWQgYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZChTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nIGFic3RyYWN0TWV0aG9kKSB7CisJaWYgKHR5cGUuaXNFbnVtKCkgJiYgdHlwZS5pc0xvY2FsVHlwZSgpKSB7CisJCUZpZWxkQmluZGluZyBmaWVsZCA9IHR5cGUuc2NvcGUuZW5jbG9zaW5nTWV0aG9kU2NvcGUoKS5pbml0aWFsaXplZEZpZWxkOworCQlGaWVsZERlY2xhcmF0aW9uIGRlY2wgPSBmaWVsZC5zb3VyY2VGaWVsZCgpOworCQl0aGlzLmhhbmRsZSgKKwkJCS8vIE11c3QgaW1wbGVtZW50IHRoZSBpbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kICUxCisJCQkvLyA4LjQuMyAtIEV2ZXJ5IG5vbi1hYnN0cmFjdCBzdWJjbGFzcyBvZiBhbiBhYnN0cmFjdCB0eXBlLCBBLCBtdXN0IHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgQSdzIG1ldGhvZHMuCisJCQlJUHJvYmxlbS5FbnVtQ29uc3RhbnRNdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2QsCisJCQluZXcgU3RyaW5nW10geworCQkJICAgICAgICBuZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kLnNlbGVjdG9yKSwKKwkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhhYnN0cmFjdE1ldGhvZCwgZmFsc2UpLAorCQkJICAgICAgICBuZXcgU3RyaW5nKGRlY2wubmFtZSksCisJCQl9LAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5zZWxlY3RvciksCisJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QsIHRydWUpLAorCQkJICAgICAgICBuZXcgU3RyaW5nKGRlY2wubmFtZSksCisJCQl9LAorCQkJZGVjbC5zb3VyY2VTdGFydCgpLAorCQkJZGVjbC5zb3VyY2VFbmQoKSk7CisJfSBlbHNlIHsKKwkJdGhpcy5oYW5kbGUoCisJCQkvLyBNdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCAlMQorCQkJLy8gOC40LjMgLSBFdmVyeSBub24tYWJzdHJhY3Qgc3ViY2xhc3Mgb2YgYW4gYWJzdHJhY3QgdHlwZSwgQSwgbXVzdCBwcm92aWRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIG9mIEEncyBtZXRob2RzLgorCQkJSVByb2JsZW0uQWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAorCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGFic3RyYWN0TWV0aG9kLCBmYWxzZSksCisJCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAorCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGFic3RyYWN0TWV0aG9kLCB0cnVlKSwKKwkJCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCSAgICAgICAgbmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJCXR5cGUuc291cmNlRW5kKCkpOworCX0KK30KK3B1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBhYnN0cmFjdE1ldGhvZCwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCkgewogCXRoaXMuaGFuZGxlKAogCQkvLyBNdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCAlMQogCQkvLyA4LjQuMyAtIEV2ZXJ5IG5vbi1hYnN0cmFjdCBzdWJjbGFzcyBvZiBhbiBhYnN0cmFjdCB0eXBlLCBBLCBtdXN0IHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgQSdzIG1ldGhvZHMuCi0JCUlQcm9ibGVtLkFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQsCi0JCW5ldyBTdHJpbmdbXSB7IAorCQlJUHJvYmxlbS5BYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkT3ZlckNvbmNyZXRlTWV0aG9kLAorCQluZXcgU3RyaW5nW10gewogCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAotCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QuaXNWYXJhcmdzKCksIGFic3RyYWN0TWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QsIGZhbHNlKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkgICAgICAgIG5ldyBTdHJpbmcoY29uY3JldGVNZXRob2Quc2VsZWN0b3IpLAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoY29uY3JldGVNZXRob2QsIGZhbHNlKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKGNvbmNyZXRlTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKIAkJfSwKLQkJbmV3IFN0cmluZ1tdIHsgCisJCW5ldyBTdHJpbmdbXSB7CiAJCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5zZWxlY3RvciksCi0JCSAgICAgICAgdHlwZXNBc1N0cmluZyhhYnN0cmFjdE1ldGhvZC5pc1ZhcmFyZ3MoKSwgYWJzdHJhY3RNZXRob2QucGFyYW1ldGVycywgdHJ1ZSksIAotCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhhYnN0cmFjdE1ldGhvZCwgdHJ1ZSksCisJCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCSAgICAgICAgbmV3IFN0cmluZyhjb25jcmV0ZU1ldGhvZC5zZWxlY3RvciksCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhjb25jcmV0ZU1ldGhvZCwgdHJ1ZSksCisJCSAgICAgICAgbmV3IFN0cmluZyhjb25jcmV0ZU1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJfSwKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKQEAgLTUxNywxNSArNzIwLDE1IEBACiAJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhvdmVycmlkZU1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yKSwgCi0JCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAorCQkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yKSwKKwkJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZCwgZmFsc2UpfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKG92ZXJyaWRlTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLnNlbGVjdG9yKSwgCi0JCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2Quc2VsZWN0b3IpLAorCQkJCXR5cGVzQXNTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLCB0cnVlKX0sCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwkKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGFubm90YXRpb25DaXJjdWxhcml0eShUeXBlQmluZGluZyBzb3VyY2VUeXBlLCBUeXBlQmluZGluZyBvdGhlclR5cGUsIFR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAJaWYgKHNvdXJjZVR5cGUgPT0gb3RoZXJUeXBlKQpAQCAtNjM2LDEzICs4MzksMTMgQEAKICAgICAJCXZhbHVlLnNvdXJjZUVuZCk7CiAgICAgfQogfQotcHVibGljIHZvaWQgYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgdHlwZSkgeworcHVibGljIHZvaWQgYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKFR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlLCBUeXBlQmluZGluZyB0eXBlKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkFub255bW91c0NsYXNzQ2Fubm90RXh0ZW5kRmluYWxDbGFzcywKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAotCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAotCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBhcmd1bWVudFR5cGVDYW5ub3RCZVZvaWQoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsLCBBcmd1bWVudCBhcmcpIHsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoYXJnLm5hbWUpfTsKQEAgLTY4OSw3ICs4OTIsNyBAQAogcHVibGljIHZvaWQgYXNzaWdubWVudEhhc05vRWZmZWN0KEFzc2lnbm1lbnQgbG9jYXRpb24sIGNoYXJbXSBuYW1lKXsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uQXNzaWdubWVudEhhc05vRWZmZWN0KTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47Ci0JU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhuYW1lKSB9OwkKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKG5hbWUpIH07CiAJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5Bc3NpZ25tZW50SGFzTm9FZmZlY3QsCiAJCQlhcmd1bWVudHMsCkBAIC02OTgsNiArOTAxLDcgQEAKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KKwogcHVibGljIHZvaWQgYXR0ZW1wdFRvUmV0dXJuTm9uVm9pZEV4cHJlc3Npb24oUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlZvaWRNZXRob2RSZXR1cm5zVmFsdWUsCkBAIC03MDYsNiArOTEwLDggQEAKIAkJcmV0dXJuU3RhdGVtZW50LnNvdXJjZVN0YXJ0LAogCQlyZXR1cm5TdGF0ZW1lbnQuc291cmNlRW5kKTsKIH0KKworCiBwdWJsaWMgdm9pZCBhdHRlbXB0VG9SZXR1cm5Wb2lkVmFsdWUoUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5NZXRob2RSZXR1cm5zVm9pZCwKQEAgLTc0NCwxNiArOTUwLDE2IEBACiAJaWYgKGxvY2F0aW9uLmlzQ29uc3RydWN0b3IoKSkgewogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLkJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0Rm9yQ29uc3RydWN0b3IsCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYXRpb24uc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKX0sCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYXRpb24uc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsb2NhdGlvbi5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2F0aW9uLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpfSwKIAkJCVByb2JsZW1TZXZlcml0aWVzLkVycm9yIHwgUHJvYmxlbVNldmVyaXRpZXMuQWJvcnQgfCBQcm9ibGVtU2V2ZXJpdGllcy5GYXRhbCwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQkJbG9jYXRpb24uc291cmNlRW5kKTsKIAl9IGVsc2UgewogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLkJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0LAotCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2F0aW9uLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2F0aW9uLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYXRpb24uc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsb2NhdGlvbi5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKX0sCiAJCQlQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciB8IFByb2JsZW1TZXZlcml0aWVzLkFib3J0IHwgUHJvYmxlbVNldmVyaXRpZXMuRmF0YWwsCiAJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CkBAIC03ODksOSArOTk1LDE3IEBACiAJCW5vZGVTb3VyY2VFbmQoZmllbGQsIGxvY2F0aW9uKSk7CiB9CiBwdWJsaWMgdm9pZCBjYW5ub3RBc3NpZ25Ub0ZpbmFsTG9jYWwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFTVE5vZGUgbG9jYXRpb24pIHsKKwlpbnQgcHJvYmxlbUlkID0gMDsKKwlpZiAoKGxvY2FsLnRhZ0JpdHMgJiBUYWdCaXRzLk11bHRpQ2F0Y2hQYXJhbWV0ZXIpICE9IDApIHsKKwkJcHJvYmxlbUlkID0gSVByb2JsZW0uQXNzaWdubWVudFRvTXVsdGlDYXRjaFBhcmFtZXRlcjsKKwl9IGVsc2UgaWYgKChsb2NhbC50YWdCaXRzICYgVGFnQml0cy5Jc1Jlc291cmNlKSAhPSAwKSB7CisJCXByb2JsZW1JZCA9IElQcm9ibGVtLkFzc2lnbm1lbnRUb1Jlc291cmNlOworCX0gZWxzZSB7CisJCXByb2JsZW1JZCA9IElQcm9ibGVtLk5vbkJsYW5rRmluYWxMb2NhbEFzc2lnbm1lbnQ7CisJfQogCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcobG9jYWwucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uTm9uQmxhbmtGaW5hbExvY2FsQXNzaWdubWVudCwKKwkJcHJvYmxlbUlkLAogCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKIAkJbm9kZVNvdXJjZVN0YXJ0KGxvY2FsLCBsb2NhdGlvbiksCkBAIC04MTcsOCArMTAzMSw4IEBACiBwdWJsaWMgdm9pZCBjYW5ub3REaXJlY2x5SW52b2tlQWJzdHJhY3RNZXRob2QoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkRpcmVjdEludm9jYXRpb25PZkFic3RyYWN0TWV0aG9kLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKX0sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKX0sCiAJCW1lc3NhZ2VTZW5kLnNvdXJjZVN0YXJ0LAogCQltZXNzYWdlU2VuZC5zb3VyY2VFbmQpOwogfQpAQCAtODU0LDEzICsxMDY4LDEzIEBACiBwdWJsaWMgdm9pZCBjYW5ub3RJbnZva2VTdXBlckNvbnN0cnVjdG9ySW5FbnVtKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCwgTWV0aG9kQmluZGluZyBlbnVtQ29uc3RydWN0b3IpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ2Fubm90SW52b2tlU3VwZXJDb25zdHJ1Y3RvckluRW51bSwKLQkJbmV3IFN0cmluZ1tdIHsgCisJCW5ldyBTdHJpbmdbXSB7CiAJCSAgICAgICAgbmV3IFN0cmluZyhlbnVtQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGVudW1Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgZW51bUNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSwgCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhlbnVtQ29uc3RydWN0b3IsIGZhbHNlKSwKIAkJIH0sCi0JCW5ldyBTdHJpbmdbXSB7IAorCQluZXcgU3RyaW5nW10gewogCQkgICAgICAgIG5ldyBTdHJpbmcoZW51bUNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSksCi0JCSAgICAgICAgdHlwZXNBc1N0cmluZyhlbnVtQ29uc3RydWN0b3IuaXNWYXJhcmdzKCksIGVudW1Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSwgCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhlbnVtQ29uc3RydWN0b3IsIHRydWUpLAogCQkgfSwKIAkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0LAogCQljb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kKTsKQEAgLTg3Myw3ICsxMDg3LDcgQEAKIAkJaWYgKGVuY29kaW5nID09IG51bGwpIHsKIAkJCWVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117IGZpbGVOYW1lLCBlbmNvZGluZywgfTsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdeyBmaWxlTmFtZSwgZW5jb2RpbmcgfTsKIAkJdGhpcy5oYW5kbGUoCiAJCQkJSVByb2JsZW0uSW52YWxpZEVuY29kaW5nLAogCQkJCWFyZ3VtZW50cywKQEAgLTg4NiwxMyArMTEwMCwxNSBAQAogCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwogCWlmICh2ZXJib3NlKSB7CiAJCWFib3J0RXhjZXB0aW9uLmV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQl9IGVsc2UgewotCQl3cml0ZXIucHJpbnQoYWJvcnRFeGNlcHRpb24uZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd3JpdGVyLnByaW50KCc6Jyk7Ci0JCXdyaXRlci5wcmludChhYm9ydEV4Y2VwdGlvbi5leGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJU3lzdGVtLmVyci5wcmludGxuKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKwkJc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKIAl9CisJd3JpdGVyLnByaW50KGFib3J0RXhjZXB0aW9uLmV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJd3JpdGVyLnByaW50KCc6Jyk7CisJd3JpdGVyLnByaW50KGFib3J0RXhjZXB0aW9uLmV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwogCVN0cmluZyBleGNlcHRpb25UcmFjZSA9IHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXsgZmlsZU5hbWUsIGV4Y2VwdGlvblRyYWNlLCB9OworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXsgZmlsZU5hbWUsIGV4Y2VwdGlvblRyYWNlIH07CiAJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5DYW5ub3RSZWFkU291cmNlLAogCQkJYXJndW1lbnRzLApAQCAtOTM1LDExICsxMTUxLDExIEBACiB9CiBwdWJsaWMgdm9pZCBjYW5ub3RVc2VRdWFsaWZpZWRFbnVtQ29uc3RhbnRJbkNhc2VMYWJlbChSZWZlcmVuY2UgbG9jYXRpb24sIEZpZWxkQmluZGluZyBmaWVsZCkgewogCXRoaXMuaGFuZGxlKAotCQkJSVByb2JsZW0uSWxsZWdhbFF1YWxpZmllZEVudW1Db25zdGFudExhYmVsLAotCQkJbmV3IFN0cmluZ1tdeyBTdHJpbmcudmFsdWVPZihmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIFN0cmluZy52YWx1ZU9mKGZpZWxkLm5hbWUpIH0sCi0JCQluZXcgU3RyaW5nW117IFN0cmluZy52YWx1ZU9mKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBTdHJpbmcudmFsdWVPZihmaWVsZC5uYW1lKSB9LAotCQkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLCBsb2NhdGlvbiksCi0JCQlub2RlU291cmNlRW5kKGZpZWxkLCBsb2NhdGlvbikpOyAKKwkJSVByb2JsZW0uSWxsZWdhbFF1YWxpZmllZEVudW1Db25zdGFudExhYmVsLAorCQluZXcgU3RyaW5nW117IFN0cmluZy52YWx1ZU9mKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgU3RyaW5nLnZhbHVlT2YoZmllbGQubmFtZSkgfSwKKwkJbmV3IFN0cmluZ1tdeyBTdHJpbmcudmFsdWVPZihmaWVsZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgU3RyaW5nLnZhbHVlT2YoZmllbGQubmFtZSkgfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQoKSwKKwkJbG9jYXRpb24uc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgY2Fubm90VXNlU3VwZXJJbkNvZGVTbmlwcGV0KGludCBzdGFydCwgaW50IGVuZCkgewogCXRoaXMuaGFuZGxlKApAQCAtOTk4LDYgKzEyMTQsMTcgQEAKIAkJc3RhcnQsCiAJCWVuZCk7CiB9CitwdWJsaWMgdm9pZCBjb21wYXJpbmdJZGVudGljYWxFeHByZXNzaW9ucyhFeHByZXNzaW9uIGNvbXBhcmlzb24peworCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5Db21wYXJpbmdJZGVudGljYWwpOworCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKKwl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkNvbXBhcmluZ0lkZW50aWNhbCwKKwkJCU5vQXJndW1lbnQsCisJCQlOb0FyZ3VtZW50LAorCQkJc2V2ZXJpdHksCisJCQljb21wYXJpc29uLnNvdXJjZVN0YXJ0LAorCQkJY29tcGFyaXNvbi5zb3VyY2VFbmQpOworfQogLyoKICAqIEdpdmVuIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGFuc3dlcnMgd2hpY2ggY2F0ZWdvcnkgdGhlIHByb2JsZW0KICAqIGZhbGxzIGludG86CkBAIC0xMDA4LDIwICsxMjM1LDE3IEBACiBwdWJsaWMgaW50IGNvbXB1dGVTZXZlcml0eShpbnQgcHJvYmxlbUlEKXsKIAogCXN3aXRjaCAocHJvYmxlbUlEKSB7Ci0JCWNhc2UgSVByb2JsZW0uVGFzayA6Ci0JCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZzsKLSAJCWNhc2UgSVByb2JsZW0uVmFyYXJnc0NvbmZsaWN0IDoKKwkJY2FzZSBJUHJvYmxlbS5WYXJhcmdzQ29uZmxpY3QgOgogCQkJcmV0dXJuIFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmc7CiAgCQljYXNlIElQcm9ibGVtLlR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlIDoKIAkJCXJldHVybiBQcm9ibGVtU2V2ZXJpdGllcy5XYXJuaW5nOwotCQkJCisKIAkJLyoKIAkJICogSmF2YWRvYyB0YWdzIHJlc29sdmVkIHJlZmVyZW5jZXMgZXJyb3JzCiAJCSAqLwogCQljYXNlIElQcm9ibGVtLkphdmFkb2NJbnZhbGlkUGFyYW1OYW1lOgogCQljYXNlIElQcm9ibGVtLkphdmFkb2NEdXBsaWNhdGVQYXJhbU5hbWU6CiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY01pc3NpbmdQYXJhbU5hbWU6Ci0JCWNhc2UgSVByb2JsZW0uSmF2YWRvY01pc3NpbmdJZGVudGlmaWVyOgogCQljYXNlIElQcm9ibGVtLkphdmFkb2NJbnZhbGlkTWVtYmVyVHlwZVF1YWxpZmljYXRpb246CiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0ludmFsaWRUaHJvd3NDbGFzc05hbWU6CiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0R1cGxpY2F0ZVRocm93c0NsYXNzTmFtZToKQEAgLTEwNTUsOSArMTI3OSw4IEBACiAJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0luY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZENvbnN0cnVjdG9yOgogCQljYXNlIElQcm9ibGVtLkphdmFkb2NQYXJhbWV0ZXJpemVkQ29uc3RydWN0b3JBcmd1bWVudFR5cGVNaXNtYXRjaDoKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jVHlwZUFyZ3VtZW50c0ZvclJhd0dlbmVyaWNDb25zdHJ1Y3RvcjoKLQkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jRW1wdHlSZXR1cm5UYWc6CiAJCQlpZiAoIXRoaXMub3B0aW9ucy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3MpIHsKLQkJCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlOwkJCisJCQkJcmV0dXJuIFByb2JsZW1TZXZlcml0aWVzLklnbm9yZTsKIAkJCX0KIAkJCWJyZWFrOwogCQkvKgpAQCAtMTA4MCwxMyArMTMwMywyNiBAQAogCQljYXNlIElQcm9ibGVtLkphdmFkb2NOb3RWaXNpYmxlVHlwZToKIAkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jSGlkZGVuUmVmZXJlbmNlOgogCQkJaWYgKCEodGhpcy5vcHRpb25zLnJlcG9ydEludmFsaWRKYXZhZG9jVGFncyAmJiB0aGlzLm9wdGlvbnMucmVwb3J0SW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZikpIHsKLQkJCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlOwkJCQorCQkJCXJldHVybiBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmU7CisJCQl9CisJCQlicmVhazsKKwkJLyoKKwkJICogSmF2YWRvYyBtaXNzaW5nIHRhZyBkZXNjcmlwdGlvbnMKKwkJICovCisJCWNhc2UgSVByb2JsZW0uSmF2YWRvY0VtcHR5UmV0dXJuVGFnOgorCQkJaWYgKENvbXBpbGVyT3B0aW9ucy5OT19UQUcuZXF1YWxzKHRoaXMub3B0aW9ucy5yZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uKSkgeworCQkJCXJldHVybiBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJUHJvYmxlbS5KYXZhZG9jTWlzc2luZ1RhZ0Rlc2NyaXB0aW9uOgorCQkJaWYgKCEgQ29tcGlsZXJPcHRpb25zLkFMTF9TVEFOREFSRF9UQUdTLmVxdWFscyh0aGlzLm9wdGlvbnMucmVwb3J0TWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbikpIHsKKwkJCQlyZXR1cm4gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlOwogCQkJfQogCQkJYnJlYWs7CiAJfQotCWxvbmcgaXJyaXRhbnQgPSBnZXRJcnJpdGFudChwcm9ibGVtSUQpOworCWludCBpcnJpdGFudCA9IGdldElycml0YW50KHByb2JsZW1JRCk7CiAJaWYgKGlycml0YW50ICE9IDApIHsKLQkJaWYgKChwcm9ibGVtSUQgJiBJUHJvYmxlbS5KYXZhZG9jKSAhPSAwICYmICF0aGlzLm9wdGlvbnMuZG9jQ29tbWVudFN1cHBvcnQpIAorCQlpZiAoKHByb2JsZW1JRCAmIElQcm9ibGVtLkphdmFkb2MpICE9IDAgJiYgIXRoaXMub3B0aW9ucy5kb2NDb21tZW50U3VwcG9ydCkKIAkJCXJldHVybiBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmU7CiAJCXJldHVybiB0aGlzLm9wdGlvbnMuZ2V0U2V2ZXJpdHkoaXJyaXRhbnQpOwogCX0KQEAgLTExMDksNTEgKzEzNDUsNiBAQAogCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCiAJCWltcG9ydFJlZi5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgY29uc3RhbnRPdXRPZkZvcm1hdChOdW1iZXJMaXRlcmFsIGxpdGVyYWwpIHsKLQkvLyB0aGUgbGl0ZXJhbCBpcyBub3QgaW4gYSBjb3JyZWN0IGZvcm1hdAotCS8vIHRoaXMgY29kZSBpcyBjYWxsZWQgb24gSW50TGl0ZXJhbCBhbmQgTG9uZ0xpdGVyYWwgCi0JLy8gZXhhbXBsZSAwMDA4MTEgLi4udGhlIDggaXMgdW5jb3JyZWN0LgotCi0JaWYgKChsaXRlcmFsIGluc3RhbmNlb2YgTG9uZ0xpdGVyYWwpIHx8IChsaXRlcmFsIGluc3RhbmNlb2YgSW50TGl0ZXJhbCkpIHsKLQkJY2hhcltdIHNvdXJjZSA9IGxpdGVyYWwuc291cmNlKCk7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBTdHJpbmcgUmFkaXg7Ci0JCQlmaW5hbCBpbnQgcmFkaXg7Ci0JCQlpZiAoKHNvdXJjZVsxXSA9PSAneCcpIHx8IChzb3VyY2VbMV0gPT0gJ1gnKSkgewotCQkJCXJhZGl4ID0gMTY7Ci0JCQkJUmFkaXggPSAiSGV4IjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyYWRpeCA9IDg7Ci0JCQkJUmFkaXggPSAiT2N0YWwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvL2xvb2sgZm9yIHRoZSBmaXJzdCBkaWdpdCB0aGF0IGlzIGluY29ycmVjdAotCQkJaW50IHBsYWNlID0gLTE7Ci0JCQlsYWJlbCA6IGZvciAoaW50IGkgPSByYWRpeCA9PSA4ID8gMSA6IDI7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoU2Nhbm5lckhlbHBlci5kaWdpdChzb3VyY2VbaV0sIHJhZGl4KSA9PSAtMSkgewotCQkJCQlwbGFjZSA9IGk7Ci0JCQkJCWJyZWFrIGxhYmVsOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJbmV3IFN0cmluZyhsaXRlcmFsLmxpdGVyYWxUeXBlKG51bGwpLnJlYWRhYmxlTmFtZSgpKSwgLy8gbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgbmVlZCBzY29wZSB0byByZWFjaCB0eXBlCi0JCQkJUmFkaXggKyAiICIgKyBuZXcgU3RyaW5nKHNvdXJjZSkgKyAiIChkaWdpdCAiICsgbmV3IFN0cmluZyhuZXcgY2hhcltdIHtzb3VyY2VbcGxhY2VdfSkgKyAiKSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQl0aGlzLmhhbmRsZSgKLQkJCQlJUHJvYmxlbS5OdW1lcmljVmFsdWVPdXRPZlJhbmdlLAotCQkJCWFyZ3VtZW50cywKLQkJCQlhcmd1bWVudHMsCi0JCQkJbGl0ZXJhbC5zb3VyY2VTdGFydCwKLQkJCQlsaXRlcmFsLnNvdXJjZUVuZCk7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJfQotCQotCQkvLyBqdXN0IGluIGNhc2UgLi4uLiB1c2UgYSBwcmVkZWZpbmVkIGVycm9yLi4KLQkJLy8gd2Ugc2hvdWxkIG5ldmVyIGNvbWUgaGVyZS4uLihleGNlcHQgaWYgdGhlIGNvZGUgY2hhbmdlcyAhKQotCQl0aGlzLmNvbnN0YW50T3V0T2ZSYW5nZShsaXRlcmFsLCBsaXRlcmFsLmxpdGVyYWxUeXBlKG51bGwpKTsgLy8gbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgbmVlZCBzY29wZSB0byByZWFjaCB0eXBlCi0JfQotfQogcHVibGljIHZvaWQgY29uc3RhbnRPdXRPZlJhbmdlKExpdGVyYWwgbGl0ZXJhbCwgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUpIHsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobGl0ZXJhbFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGxpdGVyYWwuc291cmNlKCkpfTsKIAl0aGlzLmhhbmRsZSgKQEAgLTExODMsNDAgKzEzNzQsNjkgQEAKIAkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLCBsb2NhdGlvbiksCiAJCW5vZGVTb3VyY2VFbmQoZmllbGQsIGxvY2F0aW9uKSk7CiB9CisKIHB1YmxpYyB2b2lkIGRlcHJlY2F0ZWRNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QsIEFTVE5vZGUgbG9jYXRpb24pIHsKIAlib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2QuaXNDb25zdHJ1Y3RvcigpOwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShpc0NvbnN0cnVjdG9yID8gSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkQ29uc3RydWN0b3IgOiBJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRNZXRob2QpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlpZiAoaXNDb25zdHJ1Y3RvcikgeworCQlpbnQgc3RhcnQgPSAtMTsKKwkJaWYobG9jYXRpb24gaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgeworCQkJLy8gb21pdCB0aGUgbmV3IGtleXdvcmQgZnJvbSB0aGUgd2FybmluZyBtYXJrZXIKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDAwMzEKKwkJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gKEFsbG9jYXRpb25FeHByZXNzaW9uKSBsb2NhdGlvbjsKKwkJCWlmIChhbGxvY2F0aW9uRXhwcmVzc2lvbi5lbnVtQ29uc3RhbnQgIT0gbnVsbCkgeworCQkJCXN0YXJ0ID0gYWxsb2NhdGlvbkV4cHJlc3Npb24uZW51bUNvbnN0YW50LnNvdXJjZVN0YXJ0OworCQkJfQorCQkJc3RhcnQgPSBhbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlLnNvdXJjZVN0YXJ0OworCQl9CiAJCXRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkQ29uc3RydWN0b3IsCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSl9LAogCQkJc2V2ZXJpdHksCi0JCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJCShzdGFydCA9PSAtMSkgPyBsb2NhdGlvbi5zb3VyY2VTdGFydCA6IHN0YXJ0LAogCQkJbG9jYXRpb24uc291cmNlRW5kKTsKIAl9IGVsc2UgeworCQlpbnQgc3RhcnQgPSAtMTsKKwkJaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKKwkJCS8vIHN0YXJ0IHRoZSB3YXJuaW5nIG1hcmtlciBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHN0YXJ0cworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDAzMQorCQkJc3RhcnQgPSAoaW50KSAoKChNZXNzYWdlU2VuZClsb2NhdGlvbikubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMik7CisJCX0KIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRNZXRob2QsCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKX0sCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKX0sCiAJCQlzZXZlcml0eSwKLQkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQkJKHN0YXJ0ID09IC0xKSA/IGxvY2F0aW9uLnNvdXJjZVN0YXJ0IDogc3RhcnQsCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogCX0KIH0KIHB1YmxpYyB2b2lkIGRlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIEFTVE5vZGUgbG9jYXRpb24pIHsKKwlkZXByZWNhdGVkVHlwZSh0eXBlLCBsb2NhdGlvbiwgSW50ZWdlci5NQVhfVkFMVUUpOworfQorLy8gVGhlIGFyZ3VtZW50ICdpbmRleCcgbWFrZXMgc3VyZSB0aGF0IHdlIGRlbWFyY2F0ZSBwYXJ0aWFsIHR5cGVzIGNvcnJlY3RseSB3aGlsZSBtYXJraW5nIG9mZgorLy8gYSBkZXByZWNhdGVkIHR5cGUgaW4gYSBxdWFsaWZpZWQgcmVmZXJlbmNlIChzZWUgYnVnIDI5MjUxMCkKK3B1YmxpYyB2b2lkIGRlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIEFTVE5vZGUgbG9jYXRpb24sIGludCBpbmRleCkgewogCWlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47IC8vIDFHODI4RE4gLSBubyB0eXBlIHJlZiBmb3Igc3ludGhldGljIGFyZ3VtZW50cwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRUeXBlKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJdHlwZSA9IHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKKwlpbnQgc291cmNlU3RhcnQgPSAtMTsKKwlpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDAwMzEKKwkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgbG9jYXRpb247CisJCWlmIChpbmRleCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisJCQlzb3VyY2VTdGFydCA9IChpbnQpIChyZWYuc291cmNlUG9zaXRpb25zW2luZGV4XSA+PiAzMik7CisJCX0KKwl9CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZFR5cGUsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKX0sCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJc2V2ZXJpdHksCi0JCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQlub2RlU291cmNlRW5kKG51bGwsIGxvY2F0aW9uKSk7CisJCShzb3VyY2VTdGFydCA9PSAtMSkgPyBsb2NhdGlvbi5zb3VyY2VTdGFydCA6IHNvdXJjZVN0YXJ0LAorCQlub2RlU291cmNlRW5kKG51bGwsIGxvY2F0aW9uLCBpbmRleCkpOwogfQogcHVibGljIHZvaWQgZGlzYWxsb3dlZFRhcmdldEZvckFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCkBAIC0xMjI2LDYgKzE0NDYsMjIgQEAKIAkJYW5ub3RhdGlvbi5zb3VyY2VTdGFydCwKIAkJYW5ub3RhdGlvbi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgcG9seW1vcnBoaWNNZXRob2ROb3RCZWxvdzE3KEFTVE5vZGUgbm9kZSkgeworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uUG9seW1vcnBoaWNNZXRob2ROb3RCZWxvdzE3LAorCQkJTm9Bcmd1bWVudCwKKwkJCU5vQXJndW1lbnQsCisJCQlub2RlLnNvdXJjZVN0YXJ0LAorCQkJbm9kZS5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbXVsdGlDYXRjaE5vdEJlbG93MTcoQVNUTm9kZSBub2RlKSB7CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5NdWx0aUNhdGNoTm90QmVsb3cxNywKKwkJCU5vQXJndW1lbnQsCisJCQlOb0FyZ3VtZW50LAorCQkJbm9kZS5zb3VyY2VTdGFydCwKKwkJCW5vZGUuc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZUFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkR1cGxpY2F0ZUFubm90YXRpb24sCkBAIC0xMjY3LDcgKzE1MDMsNiBAQAogCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCiAJCXN0YXRlbWVudC5zb3VyY2VFbmQpOwogfQotCiBwdWJsaWMgdm9pZCBkdXBsaWNhdGVFbnVtU3BlY2lhbE1ldGhvZChTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKICAgICBNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZERlY2wuYmluZGluZzsKIAl0aGlzLmhhbmRsZSgKQEAgLTEyNzUsMTQgKzE1MTAsMTUgQEAKIAkJbmV3IFN0cmluZ1tdIHsKIAkgICAgICAgIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksCiAJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCi0JCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKX0sCisJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksCiAJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSl9LAorCQkJdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpfSwKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQorCiBwdWJsaWMgdm9pZCBkdXBsaWNhdGVGaWVsZEluVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVGaWVsZCwKQEAgLTEyOTEsNyArMTUyNyw2IEBACiAJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKIAkJZmllbGREZWNsLnNvdXJjZUVuZCk7CiB9Ci0KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZUltcG9ydChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGltcG9ydFJlZi50b2tlbnMpfTsKIAl0aGlzLmhhbmRsZSgKQEAgLTEzMDEsMTkgKzE1MzYsNDIgQEAKIAkJaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAogCQlpbXBvcnRSZWYuc291cmNlRW5kKTsKIH0KKwogcHVibGljIHZvaWQgZHVwbGljYXRlSW5oZXJpdGVkTWV0aG9kcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZDEsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kMikgeworCWlmIChpbmhlcml0ZWRNZXRob2QxLmRlY2xhcmluZ0NsYXNzICE9IGluaGVyaXRlZE1ldGhvZDIuZGVjbGFyaW5nQ2xhc3MpIHsKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5EdXBsaWNhdGVJbmhlcml0ZWRNZXRob2RzLAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJICAgICAgICBuZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEuc2VsZWN0b3IpLAorCQkJCXR5cGVzQXNTdHJpbmcoaW5oZXJpdGVkTWV0aG9kMSwgaW5oZXJpdGVkTWV0aG9kMS5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIGZhbHNlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDIsIGluaGVyaXRlZE1ldGhvZDIub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QxLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZDIuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QxLnNlbGVjdG9yKSwKKwkJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEsIGluaGVyaXRlZE1ldGhvZDEub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDIsIGluaGVyaXRlZE1ldGhvZDIub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QyLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJCXR5cGUuc291cmNlRW5kKCkpOworCQlyZXR1cm47CisJfQorCS8vIEhhbmRsZSBkdXBsaWNhdGVzIGZyb20gc2FtZSBjbGFzcy4KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uRHVwbGljYXRlUGFyYW1ldGVyaXplZE1ldGhvZHMsCiAJCW5ldyBTdHJpbmdbXSB7CiAJICAgICAgICBuZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEuc2VsZWN0b3IpLAogCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QxLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCXR5cGVzQXNTdHJpbmcoaW5oZXJpdGVkTWV0aG9kMS5pc1ZhcmFyZ3MoKSwgaW5oZXJpdGVkTWV0aG9kMS5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIGZhbHNlKSwJCi0JCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDIuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZDIub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCBmYWxzZSl9LAorCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QxLCBpbmhlcml0ZWRNZXRob2QxLm9yaWdpbmFsKCkucGFyYW1ldGVycywgZmFsc2UpLAorCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QyLCBpbmhlcml0ZWRNZXRob2QyLm9yaWdpbmFsKCkucGFyYW1ldGVycywgZmFsc2UpfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kMS5zZWxlY3RvciksCiAJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZDEub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCB0cnVlKSwJCi0JCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDIuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZDIub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZDEsIGluaGVyaXRlZE1ldGhvZDEub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCXR5cGVzQXNTdHJpbmcoaW5oZXJpdGVkTWV0aG9kMiwgaW5oZXJpdGVkTWV0aG9kMi5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIHRydWUpfSwKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KQEAgLTEzMzUsMjAgKzE1OTMsMjMgQEAKIAkJbm9kZVNvdXJjZVN0YXJ0KGxvY2FsLCBsb2NhdGlvbiksCiAJCW5vZGVTb3VyY2VFbmQobG9jYWwsIGxvY2F0aW9uKSk7CiB9Ci0KLXB1YmxpYyB2b2lkIGR1cGxpY2F0ZU1ldGhvZEluVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZU1ldGhvZEluVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wsIGJvb2xlYW4gZXF1YWxQYXJhbWV0ZXJzLCBpbnQgc2V2ZXJpdHkpIHsKICAgICBNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZERlY2wuYmluZGluZzsKLSAgICBib29sZWFuIGR1cGxpY2F0ZUVyYXN1cmUgPSBmYWxzZTsKLSAgICBpZiAoKG1ldGhvZC5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0dlbmVyaWNTaWduYXR1cmUpICE9IDApIHsKLSAgICAgICAgLy8gY2hlY2ggaXQgb2NjdXJzIGluIHBhcmFtZXRlcnMgKHRoZSBiaXQgaXMgc2V0IGZvciByZXR1cm4gdHlwZSB8IHBhcmFtcyB8IHRocm93biBleGNlcHRpb25zCi0gICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKChtZXRob2QucGFyYW1ldGVyc1tpXS50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVFcmFzdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZHVwbGljYXRlRXJhc3VyZSkgeworICAgIGlmIChlcXVhbFBhcmFtZXRlcnMpIHsKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5EdXBsaWNhdGVNZXRob2QsCisJCQluZXcgU3RyaW5nW10geworCQkgICAgICAgIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksCisJCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSl9LAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAorCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKX0sCisJCQlzZXZlcml0eSwKKwkJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CisgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGxlbmd0aCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgVHlwZUJpbmRpbmdbXSBlcmFzdXJlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSAgewpAQCAtMTM1OSwzMCArMTYyMCwxOSBAQAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAogCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgZXJhc3VyZXMsIGZhbHNlKSB9ICwKKwkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBlcmFzdXJlcywgZmFsc2UpIH0gLAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAogCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSksCi0JCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIGVyYXN1cmVzLCB0cnVlKSB9LAotCQkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKLQkJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKLSAgICB9IGVsc2UgewotCQl0aGlzLmhhbmRsZSgKLQkJCUlQcm9ibGVtLkR1cGxpY2F0ZU1ldGhvZCwKLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKSwKLQkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCi0JCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAotCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSl9LAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZXJhc3VyZXMsIHRydWUpIH0sCisJCQlzZXZlcml0eSwKIAkJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiAgICAgfQogfQorCiBwdWJsaWMgdm9pZCBkdXBsaWNhdGVNb2RpZmllckZvckZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKIC8qIHRvIGhpZ2hsaWdodCBtb2RpZmllcnMgdXNlOgogCXRoaXMuaGFuZGxlKApAQCAtMTQyMSw3ICsxNjcxLDcgQEAKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWxEZWNsLm5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKIAkJY29tcGxhaW5Gb3JBcmd1bWVudAotCQkJPyBJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvckFyZ3VtZW50IAorCQkJPyBJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvckFyZ3VtZW50CiAJCQk6IElQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yVmFyaWFibGUsCiAJCWFyZ3VtZW50cywKIAkJYXJndW1lbnRzLApAQCAtMTQ1Nyw3ICsxNzA3LDcgQEAKIAkJbmV3IFN0cmluZ1tdIHsgbmFtZSwgbmV3IFN0cmluZyhhbm5vdGF0aW9uVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAogCQluZXcgU3RyaW5nW10gewluYW1lLCBuZXcgU3RyaW5nKGFubm90YXRpb25UeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLCByZWZlcmVuY2UpLAotCQlub2RlU291cmNlRW5kKGZpZWxkLCByZWZlcmVuY2UpKTsgCisJCW5vZGVTb3VyY2VFbmQoZmllbGQsIHJlZmVyZW5jZSkpOwogfQogcHVibGljIHZvaWQgZHVwbGljYXRlVHlwZVBhcmFtZXRlckluVHlwZShUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKIAl0aGlzLmhhbmRsZSgKQEAgLTE0ODQsNyArMTczNCw3IEBACiAJCU5vQXJndW1lbnQsCiAJCU5vQXJndW1lbnQsCiAJCXNvdXJjZVN0YXJ0LAotCQlzb3VyY2VFbmQpOwkKKwkJc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGVudW1BYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CiAJTWV0aG9kQmluZGluZyBhYnN0cmFjdE1ldGhvZCA9IG1ldGhvZC5iaW5kaW5nOwpAQCAtMTQ5MiwxOSArMTc0MiwzNiBAQAogCQkvLyBNdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCAlMQogCQkvLyA4LjQuMyAtIEV2ZXJ5IG5vbi1hYnN0cmFjdCBzdWJjbGFzcyBvZiBhbiBhYnN0cmFjdCB0eXBlLCBBLCBtdXN0IHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgQSdzIG1ldGhvZHMuCiAJCUlQcm9ibGVtLkVudW1BYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkLAotCQluZXcgU3RyaW5nW10geyAKKwkJbmV3IFN0cmluZ1tdIHsKIAkJICAgICAgICBuZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kLnNlbGVjdG9yKSwKLQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGFic3RyYWN0TWV0aG9kLmlzVmFyYXJncygpLCBhYnN0cmFjdE1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKKwkJICAgICAgICB0eXBlc0FzU3RyaW5nKGFic3RyYWN0TWV0aG9kLCBmYWxzZSksCisJCSAgICAgICAgbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCX0sCi0JCW5ldyBTdHJpbmdbXSB7IAorCQluZXcgU3RyaW5nW10gewogCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAotCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QuaXNWYXJhcmdzKCksIGFic3RyYWN0TWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJICAgICAgICBuZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKKwkJICAgICAgICB0eXBlc0FzU3RyaW5nKGFic3RyYWN0TWV0aG9kLCB0cnVlKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQl9LAogCQltZXRob2Quc291cmNlU3RhcnQoKSwKIAkJbWV0aG9kLnNvdXJjZUVuZCgpKTsKIH0KK3B1YmxpYyB2b2lkIGVudW1Db25zdGFudE11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgeworCU1ldGhvZEJpbmRpbmcgYWJzdHJhY3RNZXRob2QgPSBtZXRob2QuYmluZGluZzsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRW51bUNvbnN0YW50TXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kLAorCQluZXcgU3RyaW5nW10geworCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QsIGZhbHNlKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpLAorCQl9LAorCQluZXcgU3RyaW5nW10geworCQkgICAgICAgIG5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2Quc2VsZWN0b3IpLAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoYWJzdHJhY3RNZXRob2QsIHRydWUpLAorCQkgICAgICAgIG5ldyBTdHJpbmcoZmllbGQubmFtZSksCisJCX0sCisJCWZpZWxkLnNvdXJjZVN0YXJ0KCksCisJCWZpZWxkLnNvdXJjZUVuZCgpKTsKK30KIHB1YmxpYyB2b2lkIGVudW1Db25zdGFudHNDYW5ub3RCZVN1cnJvdW5kZWRCeVBhcmVudGhlc2lzKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5FbnVtQ29uc3RhbnRzQ2Fubm90QmVTdXJyb3VuZGVkQnlQYXJlbnRoZXNpcywKQEAgLTE1MjcsNyArMTc5NCw3IEBACiAJCQluZXcgU3RyaW5nW117IFN0cmluZy52YWx1ZU9mKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgU3RyaW5nLnZhbHVlT2YoZmllbGQubmFtZSkgfSwKIAkJCW5ldyBTdHJpbmdbXXsgU3RyaW5nLnZhbHVlT2YoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIFN0cmluZy52YWx1ZU9mKGZpZWxkLm5hbWUpIH0sCiAJCQlub2RlU291cmNlU3RhcnQoZmllbGQsIHJlZmVyZW5jZSksCi0JCQlub2RlU291cmNlRW5kKGZpZWxkLCByZWZlcmVuY2UpKTsgCisJCQlub2RlU291cmNlRW5kKGZpZWxkLCByZWZlcmVuY2UpKTsKIH0KIHB1YmxpYyB2b2lkIGVycm9yTm9NZXRob2RGb3IoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIFR5cGVCaW5kaW5nIHJlY1R5cGUsIFR5cGVCaW5kaW5nW10gcGFyYW1zKSB7CiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTE1NjYsMjAgKzE4MzMsNDcgQEAKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgZmFrZVJlYWNoYWJsZShBU1ROb2RlIGxvY2F0aW9uKSB7CisJaW50IHNvdXJjZVN0YXJ0ID0gbG9jYXRpb24uc291cmNlU3RhcnQ7CisJaW50IHNvdXJjZUVuZCA9IGxvY2F0aW9uLnNvdXJjZUVuZDsKKwlpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCUxvY2FsRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSAoTG9jYWxEZWNsYXJhdGlvbikgbG9jYXRpb247CisJCXNvdXJjZVN0YXJ0ID0gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJc291cmNlRW5kID0gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJfQkKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRGVhZENvZGUsCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCisJCXNvdXJjZVN0YXJ0LAorCQlzb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgZmllbGRIaWRpbmcoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wsIEJpbmRpbmcgaGlkZGVuVmFyaWFibGUpIHsKIAlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZERlY2wuYmluZGluZzsKIAlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlELCBmaWVsZC5uYW1lKQogCQkJJiYgZmllbGQuaXNTdGF0aWMoKQorCQkJJiYgZmllbGQuaXNQcml2YXRlKCkKIAkJCSYmIGZpZWxkLmlzRmluYWwoKQogCQkJJiYgVHlwZUJpbmRpbmcuTE9ORyA9PSBmaWVsZC50eXBlKSB7Ci0JCQkJcmV0dXJuOyAvLyBkbyBub3QgcmVwb3J0IHVudXNlZCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IGZpZWxkLmRlY2xhcmluZ0NsYXNzOworCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAocmVmZXJlbmNlQmluZGluZy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhSW9TZXJpYWxpemFibGUsIGZhbHNlIC8qU2VyaWFsaXphYmxlIGlzIG5vdCBhIGNsYXNzKi8pICE9IG51bGwpIHsKKwkJCQlyZXR1cm47IC8vIGRvIG5vdCByZXBvcnQgZmllbGQgaGlkaW5nIGZvciBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkIGZvciBjbGFzcyB0aGF0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlCisJCQl9CisJCX0KIAl9CiAJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuU0VSSUFMUEVSU0lTVEVOVEZJRUxEUywgZmllbGQubmFtZSkKIAkJCSYmIGZpZWxkLmlzU3RhdGljKCkKKwkJCSYmIGZpZWxkLmlzUHJpdmF0ZSgpCiAJCQkmJiBmaWVsZC5pc0ZpbmFsKCkKIAkJCSYmIGZpZWxkLnR5cGUuZGltZW5zaW9ucygpID09IDEKIAkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfSU9fT0JKRUNUU1RSRUFNRklFTEQsIGZpZWxkLnR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5yZWFkYWJsZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm47IC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgZmllbGQKKwkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gZmllbGQuZGVjbGFyaW5nQ2xhc3M7CisJCWlmIChyZWZlcmVuY2VCaW5kaW5nICE9IG51bGwpIHsKKwkJCWlmIChyZWZlcmVuY2VCaW5kaW5nLmZpbmRTdXBlclR5cGVPcmlnaW5hdGluZ0Zyb20oVHlwZUlkcy5UX0phdmFJb1NlcmlhbGl6YWJsZSwgZmFsc2UgLypTZXJpYWxpemFibGUgaXMgbm90IGEgY2xhc3MqLykgIT0gbnVsbCkgeworCQkJCXJldHVybjsgLy8gZG8gbm90IHJlcG9ydCBmaWVsZCBoaWRpbmcgZm9yIHNlcmlhbFBlcnNpc3RlbkZpZWxkcyBmaWVsZCBmb3IgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQorCQkJfQorCQl9CiAJfQogCWJvb2xlYW4gaXNMb2NhbCA9IGhpZGRlblZhcmlhYmxlIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KGlzTG9jYWwgPyBJUHJvYmxlbS5GaWVsZEhpZGluZ0xvY2FsVmFyaWFibGUgOiBJUHJvYmxlbS5GaWVsZEhpZGluZ0ZpZWxkKTsKQEAgLTE2MzAsNiArMTkyNCw3IEBACiAJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgZmluYWxWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVZhcmlhYmxlLCBUeXBlUmVmZXJlbmNlIHR5cGVSZWYpIHsKKwlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5GaW5hbEJvdW5kRm9yVHlwZVZhcmlhYmxlKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJdGhpcy5oYW5kbGUoCkBAIC0xNjQwLDYyICsxOTM1LDc5IEBACiAJCXR5cGVSZWYuc291cmNlU3RhcnQsCiAJCXR5cGVSZWYuc291cmNlRW5kKTsKIH0KLXB1YmxpYyB2b2lkIGZvcmJpZGRlblJlZmVyZW5jZShGaWVsZEJpbmRpbmcgZmllbGQsIEFTVE5vZGUgbG9jYXRpb24sIAotCQlTdHJpbmcgbWVzc2FnZVRlbXBsYXRlLCBpbnQgcHJvYmxlbUlkKSB7CisvKiogQHBhcmFtIGNsYXNzcGF0aEVudHJ5VHlwZSBvbmUgb2Yge0BsaW5rIEFjY2Vzc1Jlc3RyaWN0aW9uI0NPTU1BTkRfTElORX0sCisgKiB7QGxpbmsgQWNjZXNzUmVzdHJpY3Rpb24jTElCUkFSWX0sIHtAbGluayBBY2Nlc3NSZXN0cmljdGlvbiNQUk9KRUNUfSAqLworcHVibGljIHZvaWQgZm9yYmlkZGVuUmVmZXJlbmNlKEZpZWxkQmluZGluZyBmaWVsZCwgQVNUTm9kZSBsb2NhdGlvbiwKKwkJIGJ5dGUgY2xhc3NwYXRoRW50cnlUeXBlLCBTdHJpbmcgY2xhc3NwYXRoRW50cnlOYW1lLCBpbnQgcHJvYmxlbUlkKSB7CisJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KHByb2JsZW1JZCk7CisJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwogCXRoaXMuaGFuZGxlKAogCQlwcm9ibGVtSWQsCiAJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpIH0sIC8vIGRpc3RpbmN0IGZyb20gbXNnIGFyZyBmb3IgcXVpY2tmaXggcHVycG9zZQotCQluZXcgU3RyaW5nW10geyAKLQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2VUZW1wbGF0ZSwgCi0JCQkJbmV3IFN0cmluZ1tdewotCQkJCQluZXcgU3RyaW5nKGZpZWxkLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJICAgICAgICBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSl9LAorCQlnZXRFbGFib3JhdGlvbklkKElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZSwgKGJ5dGUpIChGSUVMRF9BQ0NFU1MgfCBjbGFzc3BhdGhFbnRyeVR5cGUpKSwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCWNsYXNzcGF0aEVudHJ5TmFtZSwKKwkJCW5ldyBTdHJpbmcoZmllbGQuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJICAgICAgICBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkgICAgc2V2ZXJpdHksCiAJCW5vZGVTb3VyY2VTdGFydChmaWVsZCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGZpZWxkLCBsb2NhdGlvbikpOwogfQotcHVibGljIHZvaWQgZm9yYmlkZGVuUmVmZXJlbmNlKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBBU1ROb2RlIGxvY2F0aW9uLCAKLQkJU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZSwgaW50IHByb2JsZW1JZCkgeworLyoqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeVR5cGUgb25lIG9mIHtAbGluayBBY2Nlc3NSZXN0cmljdGlvbiNDT01NQU5EX0xJTkV9LAorICoge0BsaW5rIEFjY2Vzc1Jlc3RyaWN0aW9uI0xJQlJBUll9LCB7QGxpbmsgQWNjZXNzUmVzdHJpY3Rpb24jUFJPSkVDVH0gKi8KK3B1YmxpYyB2b2lkIGZvcmJpZGRlblJlZmVyZW5jZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgQVNUTm9kZSBsb2NhdGlvbiwKKwkJYnl0ZSBjbGFzc3BhdGhFbnRyeVR5cGUsIFN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWUsIGludCBwcm9ibGVtSWQpIHsKKwlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkocHJvYmxlbUlkKTsKKwlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCiAJCXRoaXMuaGFuZGxlKAogCQkJcHJvYmxlbUlkLAogCQkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhtZXRob2QucmVhZGFibGVOYW1lKCkpIH0sIC8vIGRpc3RpbmN0IGZyb20gbXNnIGFyZyBmb3IgcXVpY2tmaXggcHVycG9zZQotCQkJbmV3IFN0cmluZ1tdIHsgCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZVRlbXBsYXRlLAotCQkJCQkJbmV3IFN0cmluZ1tde25ldyBTdHJpbmcobWV0aG9kLnNob3J0UmVhZGFibGVOYW1lKCkpfSl9LAorCQkJZ2V0RWxhYm9yYXRpb25JZChJUHJvYmxlbS5Gb3JiaWRkZW5SZWZlcmVuY2UsIChieXRlKSAoQ09OU1RSVUNUT1JfQUNDRVNTIHwgY2xhc3NwYXRoRW50cnlUeXBlKSksCisJCQluZXcgU3RyaW5nW10geworCQkJCWNsYXNzcGF0aEVudHJ5TmFtZSwKKwkJCQluZXcgU3RyaW5nKG1ldGhvZC5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQlzZXZlcml0eSwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQkJbG9jYXRpb24uc291cmNlRW5kKTsKIAllbHNlCiAJCXRoaXMuaGFuZGxlKAogCQkJcHJvYmxlbUlkLAogCQkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhtZXRob2QucmVhZGFibGVOYW1lKCkpIH0sIC8vIGRpc3RpbmN0IGZyb20gbXNnIGFyZyBmb3IgcXVpY2tmaXggcHVycG9zZQotCQkJbmV3IFN0cmluZ1tdIHsgCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZVRlbXBsYXRlLCAKLQkJCQkJbmV3IFN0cmluZ1tdewotCQkJCQkJbmV3IFN0cmluZyhtZXRob2Quc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKX0pfSwKKwkJCWdldEVsYWJvcmF0aW9uSWQoSVByb2JsZW0uRm9yYmlkZGVuUmVmZXJlbmNlLCAoYnl0ZSkgKE1FVEhPRF9BQ0NFU1MgfCBjbGFzc3BhdGhFbnRyeVR5cGUpKSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJY2xhc3NwYXRoRW50cnlOYW1lLAorCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkgICAgICAgIG5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJICAgIHNldmVyaXR5LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgZm9yYmlkZGVuUmVmZXJlbmNlKFR5cGVCaW5kaW5nIHR5cGUsIEFTVE5vZGUgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIGludCBwcm9ibGVtSWQpIHsKKy8qKiBAcGFyYW0gY2xhc3NwYXRoRW50cnlUeXBlIG9uZSBvZiB7QGxpbmsgQWNjZXNzUmVzdHJpY3Rpb24jQ09NTUFORF9MSU5FfSwKKyAqIHtAbGluayBBY2Nlc3NSZXN0cmljdGlvbiNMSUJSQVJZfSwge0BsaW5rIEFjY2Vzc1Jlc3RyaWN0aW9uI1BST0pFQ1R9ICovCitwdWJsaWMgdm9pZCBmb3JiaWRkZW5SZWZlcmVuY2UoVHlwZUJpbmRpbmcgdHlwZSwgQVNUTm9kZSBsb2NhdGlvbiwKKwkJYnl0ZSBjbGFzc3BhdGhFbnRyeVR5cGUsIFN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWUsIGludCBwcm9ibGVtSWQpIHsKIAlpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuOwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShwcm9ibGVtSWQpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKLQkvLyB0aGlzIHByb2JsZW0gaGFzIGEgbWVzc2FnZSB0ZW1wbGF0ZSBleHRyYWN0ZWQgZnJvbSB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIHJ1bGUKIAl0aGlzLmhhbmRsZSgKIAkJcHJvYmxlbUlkLAogCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpIH0sIC8vIGRpc3RpbmN0IGZyb20gbXNnIGFyZyBmb3IgcXVpY2tmaXggcHVycG9zZQotCQluZXcgU3RyaW5nW10geyBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlVGVtcGxhdGUsIG5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSl9LAorCQlnZXRFbGFib3JhdGlvbklkKElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZSwgLyogVFlQRV9BQ0NFU1MgfCAqLyBjbGFzc3BhdGhFbnRyeVR5cGUpLCAvLyBUWVBFX0FDQ0VTUyB2YWx1ZXMgdG8gMAorCQluZXcgU3RyaW5nW10geworCQkJY2xhc3NwYXRoRW50cnlOYW1lLAorCQkJbmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJc2V2ZXJpdHksCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgZm9yd2FyZFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlLCBpbnQgaW5kZXhJblF1YWxpZmljYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUpIHsKK3B1YmxpYyB2b2lkIGZvcndhcmRSZWZlcmVuY2UoUmVmZXJlbmNlIHJlZmVyZW5jZSwgaW50IGluZGV4SW5RdWFsaWZpY2F0aW9uLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uUmVmZXJlbmNlVG9Gb3J3YXJkRmllbGQsCiAJCU5vQXJndW1lbnQsCiAJCU5vQXJndW1lbnQsCi0JCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKLQkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCW5vZGVTb3VyY2VTdGFydChmaWVsZCwgcmVmZXJlbmNlLCBpbmRleEluUXVhbGlmaWNhdGlvbiksCisJCW5vZGVTb3VyY2VFbmQoZmllbGQsIHJlZmVyZW5jZSwgaW5kZXhJblF1YWxpZmljYXRpb24pKTsKIH0KIHB1YmxpYyB2b2lkIGZvcndhcmRUeXBlVmFyaWFibGVSZWZlcmVuY2UoQVNUTm9kZSBsb2NhdGlvbiwgVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlKSB7CiAJdGhpcy5oYW5kbGUoCkBAIC0xNzE4LDEwICsyMDMwLDMzIEBACiAvLyByZWZlcmVuY2UgY29udGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIG90aGVyIEFQSSB0YWtpbmcgYSBwcm9ibGVtIGFuZCBhIGNvbXBpbGF0aW9uIHJlc3VsdAogLy8gYXMgYXJndW1lbnRzCiBwcml2YXRlIHZvaWQgaGFuZGxlKAotCWludCBwcm9ibGVtSWQsIAorCQlpbnQgcHJvYmxlbUlkLAorCQlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCQlpbnQgZWxhYm9yYXRpb25JZCwKKwkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKKwkJaW50IHNldmVyaXR5LAorCQlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sCisJCWludCBwcm9ibGVtRW5kUG9zaXRpb24peworCXRoaXMuaGFuZGxlKAorCQkJcHJvYmxlbUlkLAorCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCWVsYWJvcmF0aW9uSWQsCisJCQltZXNzYWdlQXJndW1lbnRzLAorCQkJc2V2ZXJpdHksCisJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwkJCXByb2JsZW1FbmRQb3NpdGlvbiwKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCwKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpKTsKKwl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBudWxsOworfQorLy8gdXNlIHRoaXMgcHJpdmF0ZSBBUEkgd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQgY2FuIGJlIGZvdW5kIHRocm91Z2ggdGhlCisvLyByZWZlcmVuY2UgY29udGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIG90aGVyIEFQSSB0YWtpbmcgYSBwcm9ibGVtIGFuZCBhIGNvbXBpbGF0aW9uIHJlc3VsdAorLy8gYXMgYXJndW1lbnRzCitwcml2YXRlIHZvaWQgaGFuZGxlKAorCWludCBwcm9ibGVtSWQsCiAJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKIAlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAotCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCisJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLAogCWludCBwcm9ibGVtRW5kUG9zaXRpb24pewogCiAJdGhpcy5oYW5kbGUoCkBAIC0xNzMwLDE3ICsyMDY1LDE3IEBACiAJCQltZXNzYWdlQXJndW1lbnRzLAogCQkJcHJvYmxlbVN0YXJ0UG9zaXRpb24sCiAJCQlwcm9ibGVtRW5kUG9zaXRpb24sCi0JCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQsIAotCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID09IG51bGwgPyBudWxsIDogdGhpcy5yZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0KCkpOyAKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCwKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpKTsKIAl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBudWxsOwogfQogLy8gdXNlIHRoaXMgcHJpdmF0ZSBBUEkgd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQgY2Fubm90IGJlIGZvdW5kIHRocm91Z2ggdGhlCi0vLyByZWZlcmVuY2UgY29udGV4dC4gCisvLyByZWZlcmVuY2UgY29udGV4dC4KIHByaXZhdGUgdm9pZCBoYW5kbGUoCi0JaW50IHByb2JsZW1JZCwgCisJaW50IHByb2JsZW1JZCwKIAlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAogCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsCi0JaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKKwlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sCiAJaW50IHByb2JsZW1FbmRQb3NpdGlvbiwKIAlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KXsKIApAQCAtMTc1MCwzMSArMjA4NSwyOSBAQAogCQkJbWVzc2FnZUFyZ3VtZW50cywKIAkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAogCQkJcHJvYmxlbUVuZFBvc2l0aW9uLAotCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LCAKLQkJCXVuaXRSZXN1bHQpOyAKKwkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCwKKwkJCXVuaXRSZXN1bHQpOwogCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IG51bGw7CiB9CiAvLyB1c2UgdGhpcyBwcml2YXRlIEFQSSB3aGVuIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdCBjYW4gYmUgZm91bmQgdGhyb3VnaCB0aGUKIC8vIHJlZmVyZW5jZSBjb250ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgb3RoZXIgQVBJIHRha2luZyBhIHByb2JsZW0gYW5kIGEgY29tcGlsYXRpb24gcmVzdWx0CiAvLyBhcyBhcmd1bWVudHMKIHByaXZhdGUgdm9pZCBoYW5kbGUoCi0JaW50IHByb2JsZW1JZCwgCisJaW50IHByb2JsZW1JZCwKIAlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAogCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsCiAJaW50IHNldmVyaXR5LAotCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCisJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLAogCWludCBwcm9ibGVtRW5kUG9zaXRpb24pewogCiAJdGhpcy5oYW5kbGUoCiAJCQlwcm9ibGVtSWQsCiAJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJMCwgLy8gbm8gZWxhYm9yYXRpb24KIAkJCW1lc3NhZ2VBcmd1bWVudHMsCiAJCQlzZXZlcml0eSwKIAkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAotCQkJcHJvYmxlbUVuZFBvc2l0aW9uLAotCQkJdGhpcy5yZWZlcmVuY2VDb250ZXh0LCAKLQkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMucmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpKTsgCi0JdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gbnVsbDsKKwkJCXByb2JsZW1FbmRQb3NpdGlvbik7CiB9CiAKIHB1YmxpYyB2b2lkIGhpZGRlbkNhdGNoQmxvY2soUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlLCBBU1ROb2RlIGxvY2F0aW9uKSB7CkBAIC0xNzgyLDEwICsyMTE1LDEwIEBACiAJCUlQcm9ibGVtLk1hc2tlZENhdGNoLAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhleGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0xODE4LDYgKzIxNTEsMjkgQEAKIAkJCWVuZCk7CiB9CiAKK3B1YmxpYyB2b2lkIGhpZXJhcmNoeUNpcmN1bGFyaXR5KFR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZSwgUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUsIFR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJaW50IHN0YXJ0ID0gMDsKKwlpbnQgZW5kID0gMDsKKworCXN0YXJ0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OworCWVuZCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQ7CisKKwlpZiAodHlwZSA9PSBzdXBlclR5cGUpCisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uSGllcmFyY2h5Q2lyY3VsYXJpdHlTZWxmUmVmZXJlbmNlLAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpIH0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSB9LAorCQkJc3RhcnQsCisJCQllbmQpOworCWVsc2UKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5IaWVyYXJjaHlDaXJjdWxhcml0eSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhzdXBlclR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHN1cGVyVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQlzdGFydCwKKwkJCWVuZCk7Cit9CisKIHB1YmxpYyB2b2lkIGhpZXJhcmNoeUhhc1Byb2JsZW1zKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKQEAgLTE4MzcsMTkgKzIxOTMsMjMgQEAKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbEFjY2Vzc0Zyb21UeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSwgQVNUTm9kZSBsb2NhdGlvbikgewotCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcodmFyaWFibGUuc291cmNlTmFtZSkgfTsKLQl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uSWxsZWdhbEFjY2Vzc0Zyb21UeXBlVmFyaWFibGUsCi0JCWFyZ3VtZW50cywgCi0JCWFyZ3VtZW50cywKLQkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisJaWYgKChsb2NhdGlvbi5iaXRzICYgQVNUTm9kZS5JbnNpZGVKYXZhZG9jKSE9IDApIHsKKwkJamF2YWRvY0ludmFsaWRSZWZlcmVuY2UobG9jYXRpb24uc291cmNlU3RhcnQsIGxvY2F0aW9uLnNvdXJjZUVuZCk7CisJfSBlbHNlIHsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh2YXJpYWJsZS5zb3VyY2VOYW1lKSB9OworCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5JbGxlZ2FsQWNjZXNzRnJvbVR5cGVWYXJpYWJsZSwKKwkJCQlhcmd1bWVudHMsCisJCQkJYXJndW1lbnRzLAorCQkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisJfQogfQogcHVibGljIHZvaWQgaWxsZWdhbENsYXNzTGl0ZXJhbEZvclR5cGVWYXJpYWJsZShUeXBlVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlLCBBU1ROb2RlIGxvY2F0aW9uKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh2YXJpYWJsZS5zb3VyY2VOYW1lKSB9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsQ2xhc3NMaXRlcmFsRm9yVHlwZVZhcmlhYmxlLAotCQlhcmd1bWVudHMsIAorCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CkBAIC0xODU3LDE2ICsyMjE3LDE2IEBACiBwdWJsaWMgdm9pZCBpbGxlZ2FsRXh0ZW5kZWREaW1lbnNpb25zKEFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLklsbGVnYWxFeHRlbmRlZERpbWVuc2lvbnMsCi0JCU5vQXJndW1lbnQsIAotCQlOb0FyZ3VtZW50LCAKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKIAkJYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbEV4dGVuZGVkRGltZW5zaW9ucyhBcmd1bWVudCBhcmd1bWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsRXh0ZW5kZWREaW1lbnNpb25zRm9yVmFyQXJncywKLQkJTm9Bcmd1bWVudCwgCi0JCU5vQXJndW1lbnQsIAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlhcmd1bWVudC5zb3VyY2VTdGFydCwKIAkJYXJndW1lbnQuc291cmNlRW5kKTsKIH0KQEAgLTE4NzksMzIgKzIyMzksNTUgQEAKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxJbnN0YW5jZU9mR2VuZXJpY1R5cGUoVHlwZUJpbmRpbmcgY2hlY2tlZFR5cGUsIEFTVE5vZGUgbG9jYXRpb24pIHsKLQlpZiAoY2hlY2tlZFR5cGUuaXNUeXBlVmFyaWFibGUoKSkgeworCVR5cGVCaW5kaW5nIGVyYXNlZFR5cGUgPSBjaGVja2VkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLmVyYXN1cmUoKTsKKwlTdHJpbmdCdWZmZXIgcmVjb21tZW5kZWRGb3JtQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJaWYgKGVyYXNlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBlcmFzZWRUeXBlOworCQlyZWNvbW1lbmRlZEZvcm1CdWZmZXIuYXBwZW5kKHJlZmVyZW5jZUJpbmRpbmcucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwl9IGVsc2UgeworCQlyZWNvbW1lbmRlZEZvcm1CdWZmZXIuYXBwZW5kKGVyYXNlZFR5cGUuc291cmNlTmFtZSgpKTsKKwl9CisJaW50IGNvdW50ID0gZXJhc2VkVHlwZS50eXBlVmFyaWFibGVzKCkubGVuZ3RoOworCWlmIChjb3VudCA+IDApIHsKKwkJcmVjb21tZW5kZWRGb3JtQnVmZmVyLmFwcGVuZCgnPCcpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChpID4gMCkgeworCQkJCXJlY29tbWVuZGVkRm9ybUJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJCX0KKwkJCXJlY29tbWVuZGVkRm9ybUJ1ZmZlci5hcHBlbmQoJz8nKTsKKwkJfQorCQlyZWNvbW1lbmRlZEZvcm1CdWZmZXIuYXBwZW5kKCc+Jyk7CisJfQorCWZvciAoaW50IGkgPSAwLCBkaW0gPSBjaGVja2VkVHlwZS5kaW1lbnNpb25zKCk7IGkgPCBkaW07IGkrKykgeworCQlyZWNvbW1lbmRlZEZvcm1CdWZmZXIuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCisJfQorCVN0cmluZyByZWNvbW1lbmRlZEZvcm0gPSByZWNvbW1lbmRlZEZvcm1CdWZmZXIudG9TdHJpbmcoKTsKKwlpZiAoY2hlY2tlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKSB7CiAJCXRoaXMuaGFuZGxlKAotCQlJUHJvYmxlbS5JbGxlZ2FsSW5zdGFuY2VvZlR5cGVQYXJhbWV0ZXIsCi0JCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKGNoZWNrZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhjaGVja2VkVHlwZS5lcmFzdXJlKCkucmVhZGFibGVOYW1lKCkpfSwKLQkJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoY2hlY2tlZFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoY2hlY2tlZFR5cGUuZXJhc3VyZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKLQkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQkJbG9jYXRpb24uc291cmNlRW5kKTsKKwkJCUlQcm9ibGVtLklsbGVnYWxJbnN0YW5jZW9mVHlwZVBhcmFtZXRlciwKKwkJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoY2hlY2tlZFR5cGUucmVhZGFibGVOYW1lKCkpLCByZWNvbW1lbmRlZEZvcm0sIH0sCisJCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKGNoZWNrZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCByZWNvbW1lbmRlZEZvcm0sIH0sCisJCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCQkJbG9jYXRpb24uc291cmNlRW5kKTsKIAkJcmV0dXJuOwogCX0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbEluc3RhbmNlb2ZQYXJhbWV0ZXJpemVkVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhjaGVja2VkVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoY2hlY2tlZFR5cGUuZXJhc3VyZSgpLnNvdXJjZU5hbWUoKSl9LAotCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKGNoZWNrZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGNoZWNrZWRUeXBlLmVyYXN1cmUoKS5zb3VyY2VOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhjaGVja2VkVHlwZS5yZWFkYWJsZU5hbWUoKSksIHJlY29tbWVuZGVkRm9ybSwgfSwKKwkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhjaGVja2VkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgcmVjb21tZW5kZWRGb3JtLCB9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxMb2NhbFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJaWYgKGlzUmVjb3ZlcmVkTmFtZSh0eXBlRGVjbGFyYXRpb24ubmFtZSkpIHJldHVybjsKLQkKKwogCWludCBwcm9ibGVtSUQgPSAwOwogCWlmICgodHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtKSAhPSAwKSB7CiAJCXByb2JsZW1JRCA9IElQcm9ibGVtLkNhbm5vdERlZmluZUVudW1JbkxvY2FsVHlwZTsKIAl9IGVsc2UgaWYgKCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pICE9IDApIHsKLQkJcHJvYmxlbUlEID0gSVByb2JsZW0uQ2Fubm90RGVmaW5lQW5ub3RhdGlvbkluTG9jYWxUeXBlOwkJCisJCXByb2JsZW1JRCA9IElQcm9ibGVtLkNhbm5vdERlZmluZUFubm90YXRpb25JbkxvY2FsVHlwZTsKIAl9IGVsc2UgaWYgKCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZSkgIT0gMCkgewotCQlwcm9ibGVtSUQgPSBJUHJvYmxlbS5DYW5ub3REZWZpbmVJbnRlcmZhY2VJbkxvY2FsVHlwZTsJCQorCQlwcm9ibGVtSUQgPSBJUHJvYmxlbS5DYW5ub3REZWZpbmVJbnRlcmZhY2VJbkxvY2FsVHlwZTsKIAl9CiAJaWYgKHByb2JsZW1JRCAhPSAwKSB7CiAJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSl9OwpAQCAtMTk0MiwxMSArMjMyNSwxMSBAQAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhmaWVsZERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQluYW1lLAotCQl9LAkJCisJCX0sCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKGZpZWxkRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJbmFtZSwKLQkJfSwJCQorCQl9LAogCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOwogfQpAQCAtMTk1NiwxMSArMjMzOSwxMSBAQAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAogCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKSwKLQkJfSwJCQorCQl9LAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAotCQl9LAkJCisJCX0sCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTIwMTMsOCArMjM5Niw4IEBACiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JFbnVtQ29uc3RydWN0b3IoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBjb25zdHJ1Y3RvcikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JFbnVtQ29uc3RydWN0b3IsCi0JCU5vQXJndW1lbnQsCQkKLQkJTm9Bcmd1bWVudCwJCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWNvbnN0cnVjdG9yLnNvdXJjZVN0YXJ0LAogCQljb25zdHJ1Y3Rvci5zb3VyY2VFbmQpOwogfQpAQCAtMjA0NCwyNyArMjQyNywyNSBAQAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhmaWVsZERlY2wuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQluYW1lLAotCQl9LAkJCisJCX0sCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKGZpZWxkRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJbmFtZSwKLQkJfSwJCQorCQl9LAogCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCS8vIGNhbm5vdCBpbmNsdWRlIHBhcmFtZXRlciB0eXBlcyBzaW5jZSB0aGV5IGFyZSBub3QgcmVzb2x2ZWQgeWV0CisJLy8gYW5kIHRoZSBlcnJvciBtZXNzYWdlIHdvdWxkIGJlIHRvbyBsb25nCiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckludGVyZmFjZU1ldGhvZCwKIAkJbmV3IFN0cmluZ1tdIHsKLQkJCW5ldyBTdHJpbmcobWV0aG9kRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCW5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksCi0JCQl0eXBlc0FzU3RyaW5nKG1ldGhvZERlY2wuYmluZGluZy5pc1ZhcmFyZ3MoKSwgbWV0aG9kRGVjbC5iaW5kaW5nLnBhcmFtZXRlcnMsIGZhbHNlKSwKLQkJfSwJCQorCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKQorCQl9LAogCQluZXcgU3RyaW5nW10gewotCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAotCQkJdHlwZXNBc1N0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuaXNWYXJhcmdzKCksIG1ldGhvZERlY2wuYmluZGluZy5wYXJhbWV0ZXJzLCB0cnVlKSwKLQkJfSwJCisJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpCisJCX0sCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTIwNzcsMTUgKzI0NTgsNiBAQAogCQl0eXBlLnNvdXJjZVN0YXJ0KCksCiAJCXR5cGUuc291cmNlRW5kKCkpOwogfQotcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9yTG9jYWxFbnVtKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKLQlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKLQl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yTG9jYWxFbnVtLAotCQlhcmd1bWVudHMsCi0JCWFyZ3VtZW50cywKLQkJdHlwZS5zb3VyY2VTdGFydCgpLAotCQl0eXBlLnNvdXJjZUVuZCgpKTsKLX0KIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvck1lbWJlckNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKQEAgLTIxMTQsMTggKzI0ODYsMTYgQEAKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JNZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJLy8gY2Fubm90IGluY2x1ZGUgcGFyYW1ldGVyIHR5cGVzIHNpbmNlIHRoZXkgYXJlIG5vdCByZXNvbHZlZCB5ZXQKKwkvLyBhbmQgdGhlIGVycm9yIG1lc3NhZ2Ugd291bGQgYmUgdG9vIGxvbmcKIAl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kLAorCQltZXRob2REZWNsLmlzQ29uc3RydWN0b3IoKSA/IElQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckNvbnN0cnVjdG9yIDogSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kLAogCQluZXcgU3RyaW5nW10gewotCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKSwKLQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kRGVjbC5iaW5kaW5nLmlzVmFyYXJncygpLCBtZXRob2REZWNsLmJpbmRpbmcucGFyYW1ldGVycywgZmFsc2UpLAotCQkJbmV3IFN0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQl9LAkJCisJCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpCisJCX0sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLAotCQkJdHlwZXNBc1N0cmluZyhtZXRob2REZWNsLmJpbmRpbmcuaXNWYXJhcmdzKCksIG1ldGhvZERlY2wuYmluZGluZy5wYXJhbWV0ZXJzLCB0cnVlKSwKLQkJCW5ldyBTdHJpbmcobWV0aG9kRGVjbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQl9LAkKKwkJCW5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvcikKKwkJfSwKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQpAQCAtMjE1NCw3ICsyNTI0LDcgQEAKIAkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhhbGxvY2F0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhhbGxvY2F0ZWRUeXBlLmVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSksIH0sCiAJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoYWxsb2NhdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhhbGxvY2F0ZWRUeXBlLmVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgfSwKIAkJcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwKLQkJcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQpOwkKKwkJcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbFN0YXRpY01vZGlmaWVyRm9yTWVtYmVyVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CkBAIC0yMTc4LDcgKzI1NDgsMTUgQEAKIAkJYXJndW1lbnRzLAogCQlhcmd1bWVudHMsCiAJCXF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQsCi0JCXF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlRW5kKTsJCisJCXF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxVc2FnZU9mV2lsZGNhcmQoVHlwZVJlZmVyZW5jZSB3aWxkY2FyZCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZldpbGRjYXJkLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAorCQl3aWxkY2FyZC5zb3VyY2VTdGFydCwKKwkJd2lsZGNhcmQuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxWYXJhcmcoQXJndW1lbnQgYXJnVHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGFyZ1R5cGUudHlwZS5nZXRUeXBlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX07CkBAIC0yMjcxLDEwICsyNjQ5LDEwIEBACiAJCQk6IGltcG9ydFJlZi50b2tlbnM7CiAJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHRva2Vucyl9OwogCQl0aGlzLmhhbmRsZSgKLQkJICAgICAgICBJUHJvYmxlbS5JbXBvcnROb3RGb3VuZCwgCi0JCSAgICAgICAgYXJndW1lbnRzLCAKLQkJICAgICAgICBhcmd1bWVudHMsIAotCQkgICAgICAgIGltcG9ydFJlZi5zb3VyY2VTdGFydCwgCisJCSAgICAgICAgSVByb2JsZW0uSW1wb3J0Tm90Rm91bmQsCisJCSAgICAgICAgYXJndW1lbnRzLAorCQkgICAgICAgIGFyZ3VtZW50cywKKwkJICAgICAgICBpbXBvcnRSZWYuc291cmNlU3RhcnQsCiAJCSAgICAgICAgKGludCkgaW1wb3J0UmVmLnNvdXJjZVBvc2l0aW9uc1t0b2tlbnMubGVuZ3RoIC0gMV0pOwogCQlyZXR1cm47CiAJfQpAQCAtMjI4MiwxMCArMjY2MCwxMCBAQAogCQljaGFyW11bXSB0b2tlbnMgPSBpbXBvcnRSZWYudG9rZW5zOwogCQlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117Q2hhck9wZXJhdGlvbi50b1N0cmluZyh0b2tlbnMpfTsKIAkJdGhpcy5oYW5kbGUoCi0JCSAgICAgICAgSVByb2JsZW0uSW52YWxpZFR5cGVGb3JTdGF0aWNJbXBvcnQsIAotCQkgICAgICAgIGFyZ3VtZW50cywgCi0JCSAgICAgICAgYXJndW1lbnRzLCAKLQkJICAgICAgICBpbXBvcnRSZWYuc291cmNlU3RhcnQsIAorCQkgICAgICAgIElQcm9ibGVtLkludmFsaWRUeXBlRm9yU3RhdGljSW1wb3J0LAorCQkgICAgICAgIGFyZ3VtZW50cywKKwkJICAgICAgICBhcmd1bWVudHMsCisJCSAgICAgICAgaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAogCQkgICAgICAgIChpbnQpIGltcG9ydFJlZi5zb3VyY2VQb3NpdGlvbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIyOTQsNyArMjY3Miw3IEBACiBwdWJsaWMgdm9pZCBpbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kLCBSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUpIHsKIAlpZiAodHlwZSA9PSBjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzKSB7CiAJCWludCBpZDsKLQkJaWYgKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSAKKwkJaWYgKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKQogCQkJCSYmICFpbmhlcml0ZWRNZXRob2QuaXNQdWJsaWMoKSl7IC8vIGludGVyZmFjZSBpbmhlcml0aW5nIE9iamVjdCBwcm90ZWN0ZWQgbWV0aG9kCiAJCQlpZCA9IElQcm9ibGVtLkluY29tcGF0aWJsZUV4Y2VwdGlvbkluVGhyb3dzQ2xhdXNlRm9yTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOwogCQl9IGVsc2UgewpAQCAtMjMyMCw3ICsyNjk4LDcgQEAKIAkJCQkJCScuJykpfSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwotCX0gZWxzZQkKKwl9IGVsc2UKIAkJdGhpcy5oYW5kbGUoCiAJCQkvLyBFeGNlcHRpb24gJTEgaW4gdGhyb3dzIGNsYXVzZSBvZiAlMiBpcyBub3QgY29tcGF0aWJsZSB3aXRoICUzCiAJCQkvLyA5LjQuNCAtIFRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBpbiB0aGUgdGhyb3dzIGNsYXVzZSBpcyBpbmNvbXBhdGlibGUuCkBAIC0yMzY3LDcgKzI3NDUsNyBAQAogCiAJaW50IGlkOwogCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzOwotCWlmIChkZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpIAorCWlmIChkZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpCiAJCQkmJiAhaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkpeyAvLyBpbnRlcmZhY2UgaW5oZXJpdGluZyBPYmplY3QgcHJvdGVjdGVkIG1ldGhvZAogCQlpZCA9IElQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGVGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7CiAJfSBlbHNlIHsKQEAgLTI0MTEsMTEgKzI3ODksMTQgQEAKIAkJc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGluY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZFR5cGUoQVNUTm9kZSBsb2NhdGlvbiwgVHlwZUJpbmRpbmcgdHlwZSwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzKSB7CisJaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZShsb2NhdGlvbiwgdHlwZSwgYXJndW1lbnRUeXBlcywgSW50ZWdlci5NQVhfVkFMVUUpOworfQorcHVibGljIHZvaWQgaW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZShBU1ROb2RlIGxvY2F0aW9uLCBUeXBlQmluZGluZyB0eXBlLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIGludCBpbmRleCkgewogICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CiAJCXRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uSW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZSwKLQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgZmFsc2UpfSwKLQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudFR5cGVzLCB0cnVlKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgZmFsc2UpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGFyZ3VtZW50VHlwZXMsIHRydWUpfSwKIAkJCVByb2JsZW1TZXZlcml0aWVzLkFib3J0Q29tcGlsYXRpb24gfCBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciB8IFByb2JsZW1TZXZlcml0aWVzLkZhdGFsLAogCQkJMCwKIAkJCTApOwpAQCAtMjQyMywxMCArMjgwNCwzMiBAQAogICAgIH0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudFR5cGVzLCBmYWxzZSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgZmFsc2UpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKLQkJbG9jYXRpb24uc291cmNlRW5kKTsKKwkJbm9kZVNvdXJjZUVuZChudWxsLCBsb2NhdGlvbiwgaW5kZXgpKTsKK30KK3B1YmxpYyB2b2lkIGRpYW1vbmROb3RCZWxvdzE3KEFTVE5vZGUgbG9jYXRpb24pIHsKKwlkaWFtb25kTm90QmVsb3cxNyhsb2NhdGlvbiwgSW50ZWdlci5NQVhfVkFMVUUpOworfQorcHVibGljIHZvaWQgZGlhbW9uZE5vdEJlbG93MTcoQVNUTm9kZSBsb2NhdGlvbiwgaW50IGluZGV4KSB7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODQ5MworICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uRGlhbW9uZE5vdEJlbG93MTcsCisJCQlOb0FyZ3VtZW50LAorCQkJTm9Bcmd1bWVudCwKKwkJCVByb2JsZW1TZXZlcml0aWVzLkFib3J0Q29tcGlsYXRpb24gfCBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciB8IFByb2JsZW1TZXZlcml0aWVzLkZhdGFsLAorCQkJMCwKKwkJCTApOworCQlyZXR1cm47IC8vIG5vdCByZWFjaGVkIHNpbmNlIGFib3J0ZWQgYWJvdmUKKyAgICB9CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkRpYW1vbmROb3RCZWxvdzE3LAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbm9kZVNvdXJjZUVuZChudWxsLCBsb2NhdGlvbiwgaW5kZXgpKTsKIH0KIHB1YmxpYyB2b2lkIGluY29ycmVjdExvY2F0aW9uRm9yTm9uRW1wdHlEaW1lbnNpb24oQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgaW5kZXgpIHsKIAl0aGlzLmhhbmRsZSgKQEAgLTI0MzcsMTIgKzI4NDAsMzAgQEAKIAkJZXhwcmVzc2lvbi5kaW1lbnNpb25zW2luZGV4XS5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW5jb3JyZWN0U3dpdGNoVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIHRlc3RUeXBlKSB7Ci0JdGhpcy5oYW5kbGUoCi0JCUlQcm9ibGVtLkluY29ycmVjdFN3aXRjaFR5cGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0ZXN0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGVzdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAotCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAotCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKKwkJaWYgKHRlc3RUeXBlLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZykgeworCQkJdGhpcy5oYW5kbGUoCisJCQkJCUlQcm9ibGVtLlN3aXRjaE9uU3RyaW5nc05vdEJlbG93MTcsCisJCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0ZXN0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGVzdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQkJCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5JbmNvcnJlY3RTd2l0Y2hUeXBlLAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0ZXN0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0ZXN0VHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5JbmNvcnJlY3RTd2l0Y2hUeXBlMTcsCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRlc3RUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRlc3RUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQkJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKKwl9CiB9CiBwdWJsaWMgdm9pZCBpbmRpcmVjdEFjY2Vzc1RvU3RhdGljRmllbGQoQVNUTm9kZSBsb2NhdGlvbiwgRmllbGRCaW5kaW5nIGZpZWxkKXsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSW5kaXJlY3RBY2Nlc3NUb1N0YXRpY0ZpZWxkKTsKQEAgLTI0NjAsMTMgKzI4ODEsMTMgQEAKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkluZGlyZWN0QWNjZXNzVG9TdGF0aWNNZXRob2QsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpfSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpfSwKIAkJc2V2ZXJpdHksCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgaW5oZXJpdGVkTWV0aG9kUmVkdWNlc1Zpc2liaWxpdHkoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcykgeworcHJpdmF0ZSB2b2lkIGluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcykgewogCVN0cmluZ0J1ZmZlciBjb25jcmV0ZVNpZ25hdHVyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAljb25jcmV0ZVNpZ25hdHVyZQogCQkuYXBwZW5kKGNvbmNyZXRlTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKQpAQCAtMjQ4NCwxMCArMjkwNSwxNiBAQAogCQkJY29uY3JldGVTaWduYXR1cmUudG9TdHJpbmcoKSwKIAkJCW5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2RzWzBdLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKHNob3J0U2lnbmF0dXJlLnRvU3RyaW5nKCkpLAorCQkJc2hvcnRTaWduYXR1cmUudG9TdHJpbmcoKSwKIAkJCW5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2RzWzBdLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKLQkJdHlwZS5zb3VyY2VTdGFydCgpLAotCQl0eXBlLnNvdXJjZUVuZCgpKTsKKwkJc291cmNlU3RhcnQsCisJCXNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbmhlcml0ZWRNZXRob2RSZWR1Y2VzVmlzaWJpbGl0eShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nIGNvbmNyZXRlTWV0aG9kLCBNZXRob2RCaW5kaW5nW10gYWJzdHJhY3RNZXRob2RzKSB7CisJaW5oZXJpdGVkTWV0aG9kUmVkdWNlc1Zpc2liaWxpdHkodHlwZS5zb3VyY2VTdGFydCgpLCB0eXBlLnNvdXJjZUVuZCgpLCBjb25jcmV0ZU1ldGhvZCwgYWJzdHJhY3RNZXRob2RzKTsKK30KK3B1YmxpYyB2b2lkIGluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcykgeworCWluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KHR5cGVQYXJhbWV0ZXIuc291cmNlU3RhcnQoKSwgdHlwZVBhcmFtZXRlci5zb3VyY2VFbmQoKSwgY29uY3JldGVNZXRob2QsIGFic3RyYWN0TWV0aG9kcyk7CiB9CiBwdWJsaWMgdm9pZCBpbmhlcml0ZWRNZXRob2RzSGF2ZUluY29tcGF0aWJsZVJldHVyblR5cGVzKEFTVE5vZGUgbG9jYXRpb24sIE1ldGhvZEJpbmRpbmdbXSBpbmhlcml0ZWRNZXRob2RzLCBpbnQgbGVuZ3RoKSB7CiAJU3RyaW5nQnVmZmVyIG1ldGhvZFNpZ25hdHVyZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC0yNTEwLDcgKzI5MzcsNyBAQAogCXRoaXMuaGFuZGxlKAogCQkvLyBSZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAlMQogCQkvLyA5LjQuMiAtIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSBtZXRob2QgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmF0aW9uLgotCQlJUHJvYmxlbS5JbmNvbXBhdGlibGVSZXR1cm5UeXBlLAorCQlJUHJvYmxlbS5Jbmhlcml0ZWRJbmNvbXBhdGlibGVSZXR1cm5UeXBlLAogCQluZXcgU3RyaW5nW10ge21ldGhvZFNpZ25hdHVyZXMudG9TdHJpbmcoKX0sCiAJCW5ldyBTdHJpbmdbXSB7c2hvcnRTaWduYXR1cmVzLnRvU3RyaW5nKCl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKQEAgLTI1MzcsNyArMjk2NCw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCS8vIFJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoICUxCiAJCS8vIDkuNC4yIC0gVGhlIHJldHVybiB0eXBlIGZyb20gdGhlIG1ldGhvZCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyYXRpb24uCi0JCUlQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGUsCisJCUlQcm9ibGVtLkluaGVyaXRlZEluY29tcGF0aWJsZVJldHVyblR5cGUsCiAJCW5ldyBTdHJpbmdbXSB7bWV0aG9kU2lnbmF0dXJlcy50b1N0cmluZygpfSwKIAkJbmV3IFN0cmluZ1tdIHtzaG9ydFNpZ25hdHVyZXMudG9TdHJpbmcoKX0sCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKQEAgLTI1NDgsMTggKzI5NzUsMTggQEAKIAkJSVByb2JsZW0uTWV0aG9kTmFtZUNsYXNoLAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhvbmVNZXRob2Quc2VsZWN0b3IpLAotCQkJdHlwZXNBc1N0cmluZyhvbmVNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgb25lTWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgZmFsc2UpLAorCQkJdHlwZXNBc1N0cmluZyhvbmVNZXRob2Qub3JpZ2luYWwoKSwgZmFsc2UpLAogCQkJbmV3IFN0cmluZyhvbmVNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJdHlwZXNBc1N0cmluZyh0d29NZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgdHdvTWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgZmFsc2UpLAorCQkJdHlwZXNBc1N0cmluZyh0d29NZXRob2Qub3JpZ2luYWwoKSwgZmFsc2UpLAogCQkJbmV3IFN0cmluZyh0d29NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkgfSwgCisJCSB9LAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhvbmVNZXRob2Quc2VsZWN0b3IpLAotCQkJdHlwZXNBc1N0cmluZyhvbmVNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgb25lTWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgdHJ1ZSksCisJCQl0eXBlc0FzU3RyaW5nKG9uZU1ldGhvZC5vcmlnaW5hbCgpLCB0cnVlKSwKIAkJCW5ldyBTdHJpbmcob25lTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJdHlwZXNBc1N0cmluZyh0d29NZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgdHdvTWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgdHJ1ZSksCisJCQl0eXBlc0FzU3RyaW5nKHR3b01ldGhvZC5vcmlnaW5hbCgpLCB0cnVlKSwKIAkJCW5ldyBTdHJpbmcodHdvTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkgfSwgCisJCSB9LAogCQkgdHlwZS5zb3VyY2VTdGFydCgpLAogCQkgdHlwZS5zb3VyY2VFbmQoKSk7CiB9CkBAIC0yNTg5LDggKzMwMTYsOCBAQAogCQljb25zdHJ1Y3RvciwKIAkJY29uc3RydWN0b3IuY29tcGlsYXRpb25SZXN1bHQoKSk7CiB9Ci1wdWJsaWMgdm9pZCBpbnRlcmZhY2VDYW5ub3RIYXZlSW5pdGlhbGl6ZXJzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7Ci0JU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CitwdWJsaWMgdm9pZCBpbnRlcmZhY2VDYW5ub3RIYXZlSW5pdGlhbGl6ZXJzKGNoYXIgW10gc291cmNlTmFtZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlTmFtZSl9OwogCiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludGVyZmFjZUNhbm5vdEhhdmVJbml0aWFsaXplcnMsCkBAIC0yNjE0LDcgKzMwNDEsNyBAQAogCQl9LAogCQltZXRob2REZWNsLnJldHVyblR5cGUuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wucmV0dXJuVHlwZS5zb3VyY2VFbmQpOwotCQorCiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkQnJlYWsoQVNUTm9kZSBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKApAQCAtMjYyMyw5ICszMDUwLDkgQEAKIAkJTm9Bcmd1bWVudCwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Ci19CQorfQogcHVibGljIHZvaWQgaW52YWxpZENvbnN0cnVjdG9yKFN0YXRlbWVudCBzdGF0ZW1lbnQsIE1ldGhvZEJpbmRpbmcgdGFyZ2V0Q29uc3RydWN0b3IpIHsKLQlib29sZWFuIGluc2lkZURlZmF1bHRDb25zdHJ1Y3RvciA9IAorCWJvb2xlYW4gaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yID0KIAkJKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pCiAJCQkmJiAoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpOwogCWJvb2xlYW4gaW5zaWRlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgPQpAQCAtMjY0MSwxMSArMzA2OCwxOSBAQAogCQkJc291cmNlRW5kID0gYWxsb2NhdGlvbi5lbnVtQ29uc3RhbnQuc291cmNlRW5kOwogCQl9CiAJfQotCQorCiAJaW50IGlkID0gSVByb2JsZW0uVW5kZWZpbmVkQ29uc3RydWN0b3I7IC8vZGVmYXVsdC4uLgogICAgIE1ldGhvZEJpbmRpbmcgc2hvd25Db25zdHJ1Y3RvciA9IHRhcmdldENvbnN0cnVjdG9yOwogCXN3aXRjaCAodGFyZ2V0Q29uc3RydWN0b3IucHJvYmxlbUlkKCkpIHsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCA6CisJCQlQcm9ibGVtTWV0aG9kQmluZGluZyBwcm9ibGVtQ29uc3RydWN0b3IgPSAoUHJvYmxlbU1ldGhvZEJpbmRpbmcpIHRhcmdldENvbnN0cnVjdG9yOworCQkJaWYgKHByb2JsZW1Db25zdHJ1Y3Rvci5jbG9zZXN0TWF0Y2ggIT0gbnVsbCkgeworCQkgICAgCWlmICgocHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaC50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeworCQkJCQltaXNzaW5nVHlwZUluQ29uc3RydWN0b3Ioc3RhdGVtZW50LCBwcm9ibGVtQ29uc3RydWN0b3IuY2xvc2VzdE1hdGNoKTsKKwkJCQkJcmV0dXJuOworCQkgICAgCX0KKwkJICAgIH0KKwogCQkJaWYgKGluc2lkZURlZmF1bHRDb25zdHJ1Y3Rvcil7CiAJCQkJaWQgPSBJUHJvYmxlbS5VbmRlZmluZWRDb25zdHJ1Y3RvckluRGVmYXVsdENvbnN0cnVjdG9yOwogCQkJfSBlbHNlIGlmIChpbnNpZGVJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbCl7CkBAIC0yNjYyLDEwICszMDk3LDEwIEBACiAJCQl9IGVsc2UgewogCQkJCWlkID0gSVByb2JsZW0uTm90VmlzaWJsZUNvbnN0cnVjdG9yOwogCQkJfQotCQkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbUNvbnN0cnVjdG9yID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSB0YXJnZXRDb25zdHJ1Y3RvcjsKKwkJCXByb2JsZW1Db25zdHJ1Y3RvciA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgdGFyZ2V0Q29uc3RydWN0b3I7CiAJCQlpZiAocHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaCAhPSBudWxsKSB7CiAJCQkgICAgc2hvd25Db25zdHJ1Y3RvciA9IHByb2JsZW1Db25zdHJ1Y3Rvci5jbG9zZXN0TWF0Y2gub3JpZ2luYWwoKTsKLQkJICAgIH0JCQkJCQorCQkgICAgfQogCQkJYnJlYWs7CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzIDoKIAkJCWlmIChpbnNpZGVEZWZhdWx0Q29uc3RydWN0b3IpewpAQCAtMjY4Nyw2MSArMzEyMiw2MSBAQAogCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtQ29uc3RydWN0b3IucGFyYW1ldGVycywgMCwgaW52b2NhdGlvbkFyZ3VtZW50cywgMCwgYXVnbWVudGVkTGVuZ3RoLTIpOwogCQkJdGhpcy5oYW5kbGUoCiAJCQkJSVByb2JsZW0uR2VuZXJpY0NvbnN0cnVjdG9yVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoZmFsc2UsIGludm9jYXRpb25Bcmd1bWVudHMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksIAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwKIAkJCQkgICAgICAgIHBhcmFtZXRlckJvdW5kQXNTdHJpbmcodHlwZVBhcmFtZXRlciwgZmFsc2UpIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGZhbHNlLCBpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIHRydWUpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIHRydWUpIH0sCiAJCQkJc291cmNlU3RhcnQsCi0JCQkJc291cmNlRW5kKTsJCSAgICAKLQkJCXJldHVybjsJCSAgICAKLQkJCQorCQkJCXNvdXJjZUVuZCk7CisJCQlyZXR1cm47CisKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5UeXBlUGFyYW1ldGVyQXJpdHlNaXNtYXRjaCA6CiAJCQlwcm9ibGVtQ29uc3RydWN0b3IgPSAoUHJvYmxlbU1ldGhvZEJpbmRpbmcpIHRhcmdldENvbnN0cnVjdG9yOwogCQkJc2hvd25Db25zdHJ1Y3RvciA9IHByb2JsZW1Db25zdHJ1Y3Rvci5jbG9zZXN0TWF0Y2g7CiAJCQlpZiAoc2hvd25Db25zdHJ1Y3Rvci50eXBlVmFyaWFibGVzID09IEJpbmRpbmcuTk9fVFlQRV9WQVJJQUJMRVMpIHsKIAkJCQl0aGlzLmhhbmRsZSgKIAkJCQkJSVByb2JsZW0uTm9uR2VuZXJpY0NvbnN0cnVjdG9yLAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHNob3duQ29uc3RydWN0b3IucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSkgfSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCBmYWxzZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCBmYWxzZSkgfSwKKwkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHNob3duQ29uc3RydWN0b3IucGFyYW1ldGVycywgdHJ1ZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgdHJ1ZSkgfSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIHRydWUpLAorCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCB0cnVlKSB9LAogCQkJCQlzb3VyY2VTdGFydCwKLQkJCQkJc291cmNlRW5kKTsJCSAgICAKKwkJCQkJc291cmNlRW5kKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLkluY29ycmVjdEFyaXR5Rm9yUGFyYW1ldGVyaXplZENvbnN0cnVjdG9yICAsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsIHNob3duQ29uc3RydWN0b3IudHlwZVZhcmlhYmxlcywgZmFsc2UpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIGZhbHNlKSwKKwkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCQkJCXR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci50eXBlVmFyaWFibGVzLCBmYWxzZSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3RvciwgZmFsc2UpIH0sCisJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSksCi0JCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsIHNob3duQ29uc3RydWN0b3IudHlwZVZhcmlhYmxlcywgdHJ1ZSksCi0JCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgdHJ1ZSkgfSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIHRydWUpLAorCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCQl0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IudHlwZVZhcmlhYmxlcywgdHJ1ZSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3RvciwgdHJ1ZSkgfSwKIAkJCQkJc291cmNlU3RhcnQsCi0JCQkJCXNvdXJjZUVuZCk7CQkgICAgCisJCQkJCXNvdXJjZUVuZCk7CiAJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyaXplZE1ldGhvZFR5cGVNaXNtYXRjaCA6CkBAIC0yNzQ5LDQ5ICszMTg0LDQ5IEBACiAJCQlzaG93bkNvbnN0cnVjdG9yID0gcHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaDsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLlBhcmFtZXRlcml6ZWRDb25zdHJ1Y3RvckFyZ3VtZW50VHlwZU1pc21hdGNoLAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCAoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bkNvbnN0cnVjdG9yKS50eXBlQXJndW1lbnRzLCBmYWxzZSksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSkgfSwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgZmFsc2UpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCXR5cGVzQXNTdHJpbmcoKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpc2hvd25Db25zdHJ1Y3RvcikudHlwZUFyZ3VtZW50cywgZmFsc2UpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3RvciwgZmFsc2UpIH0sCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCAoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bkNvbnN0cnVjdG9yKS50eXBlQXJndW1lbnRzLCB0cnVlKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIHRydWUpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkJdHlwZXNBc1N0cmluZygoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bkNvbnN0cnVjdG9yKS50eXBlQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIHRydWUpIH0sCiAJCQkJc291cmNlU3RhcnQsCi0JCQkJc291cmNlRW5kKTsJCSAgICAKKwkJCQlzb3VyY2VFbmQpOwogCQkJcmV0dXJuOwogCQljYXNlIFByb2JsZW1SZWFzb25zLlR5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljTWV0aG9kIDoKIAkJCXByb2JsZW1Db25zdHJ1Y3RvciA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgdGFyZ2V0Q29uc3RydWN0b3I7CiAJCQlzaG93bkNvbnN0cnVjdG9yID0gcHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaDsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLlR5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljQ29uc3RydWN0b3IsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3RvciwgZmFsc2UpIH0sCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSB9LAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIHRydWUpIH0sCiAJCQkJc291cmNlU3RhcnQsCi0JCQkJc291cmNlRW5kKTsJCisJCQkJc291cmNlRW5kKTsKIAkJCXJldHVybjsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob0Vycm9yIDogLy8gMAogCQlkZWZhdWx0IDoKLQkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCW5lZWRJbXBsZW1lbnRhdGlvbihzdGF0ZW1lbnQpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KIAogCXRoaXMuaGFuZGxlKAogCQlpZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKX0sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCBmYWxzZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgdHJ1ZSl9LAogCQlzb3VyY2VTdGFydCwKIAkJc291cmNlRW5kKTsKIH0KQEAgLTI4MDcsNyArMzI0Miw3IEBACiAKIAlpZiAoZW5jbG9zaW5nVHlwZS5pc0Fub255bW91c1R5cGUoKSkgZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuc3VwZXJjbGFzcygpOwogCWlmIChlbmNsb3NpbmdUeXBlLnNvdXJjZU5hbWUgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlLnNvdXJjZU5hbWUubGVuZ3RoID09IDApIHJldHVybjsKLQkKKwogCWludCBmbGFnID0gSVByb2JsZW0uVW5kZWZpbmVkVHlwZTsgLy8gZGVmYXVsdAogCXN3aXRjaCAodHlwZS5wcm9ibGVtSWQoKSkgewogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDogLy8gMQpAQCAtMjgyNCw3ICszMjU5LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vRXJyb3IgOiAvLyAwCiAJCWRlZmF1bHQgOgotCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJbmVlZEltcGxlbWVudGF0aW9uKGV4cHJlc3Npb24pOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KIApAQCAtMjgzNiw3ICszMjcxLDcgQEAKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW52YWxpZEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEFTVE5vZGUgbG9jYXRpb24pIHsKLQkKKwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwsCiAJCU5vQXJndW1lbnQsCkBAIC0yODU0LDExICszMjg5LDIwIEBACiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkRmllbGQoRmllbGRSZWZlcmVuY2UgZmllbGRSZWYsIFR5cGVCaW5kaW5nIHNlYXJjaGVkVHlwZSkgewogCWlmKGlzUmVjb3ZlcmVkTmFtZShmaWVsZFJlZi50b2tlbikpIHJldHVybjsKLQkKKwogCWludCBpZCA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOwogCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkUmVmLmJpbmRpbmc7CiAJc3dpdGNoIChmaWVsZC5wcm9ibGVtSWQoKSkgewogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCWlmICgoc2VhcmNoZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJdGhpcy5oYW5kbGUoCisJCQkJCQlJUHJvYmxlbS5VbmRlZmluZWRUeXBlLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHNlYXJjaGVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCisJCQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCQkJZmllbGRSZWYucmVjZWl2ZXIuc291cmNlU3RhcnQsCisJCQkJCQlmaWVsZFJlZi5yZWNlaXZlci5zb3VyY2VFbmQpOworCQkJCQlyZXR1cm47CisJCQl9CiAJCQlpZCA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOwogLyogYWxzbyBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHNlYXJjaGVkVHlwZSBpcyB0aGUgcmVjZWl2ZXIgdHlwZQogCQkJaWYgKHNlYXJjaGVkVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKQpAQCAtMjg5MywxMCArMzMzNywxMCBAQAogCQkJCWZpZWxkUmVmLnJlY2VpdmVyLnNvdXJjZVN0YXJ0LAogCQkJCWZpZWxkUmVmLnJlY2VpdmVyLnNvdXJjZUVuZCk7CiAJCQlyZXR1cm47Ci0JCQkKKwogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vRXJyb3IgOiAvLyAwCiAJCWRlZmF1bHQgOgotCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJbmVlZEltcGxlbWVudGF0aW9uKGZpZWxkUmVmKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCiAJCQlicmVhazsKIAl9CiAKQEAgLTI5MTksOCArMzM2MywyNCBAQAogCWludCBpZCA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOwogCXN3aXRjaCAoZmllbGQucHJvYmxlbUlkKCkpIHsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZCA6Ci0JCQlpZCA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOwotCQkJYnJlYWs7CisJCQlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGZpZWxkLmRlY2xhcmluZ0NsYXNzOworCQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgKGRlY2xhcmluZ0NsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJdGhpcy5oYW5kbGUoCisJCQkJCQlJUHJvYmxlbS5VbmRlZmluZWRUeXBlLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKKwkJCQkJCW5hbWVSZWYuc291cmNlRW5kKTsKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX07CisJCQl0aGlzLmhhbmRsZSgKKwkJCQkJaWQsCisJCQkJCWFyZ3VtZW50cywKKwkJCQkJYXJndW1lbnRzLAorCQkJCQlub2RlU291cmNlU3RhcnQoZmllbGQsIG5hbWVSZWYpLAorCQkJCQlub2RlU291cmNlRW5kKGZpZWxkLCBuYW1lUmVmKSk7CisJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6CiAJCQljaGFyW10gbmFtZSA9IGZpZWxkLnJlYWRhYmxlTmFtZSgpOwogCQkJbmFtZSA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQobmFtZSwgJy4nKTsKQEAgLTI5NDYsMTQgKzM0MDYsMTQgQEAKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5SZWNlaXZlclR5cGVOb3RWaXNpYmxlIDoKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLk5vdFZpc2libGVUeXBlLAotCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5sZWFmQ29tcG9uZW50VHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCi0JCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKIAkJCQluYW1lUmVmLnNvdXJjZUVuZCk7CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9FcnJvciA6IC8vIDAKIAkJZGVmYXVsdCA6Ci0JCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQluZWVkSW1wbGVtZW50YXRpb24obmFtZVJlZik7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgogCQkJYnJlYWs7CiAJfQogCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9OwpAQCAtMjk3Miw5ICszNDMyLDkgQEAKIAkvL1VuZGVmaW5lZEZpZWxkCiAJLy9Ob3RWaXNpYmxlRmllbGQKIAkvL0FtYmlndW91c0ZpZWxkCi0JCisKIAlpZiAoaXNSZWNvdmVyZWROYW1lKG5hbWVSZWYudG9rZW5zKSkgcmV0dXJuOwotCQorCiAJaWYgKHNlYXJjaGVkVHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5Ob0ZpZWxkT25CYXNlVHlwZSwKQEAgLTI5OTQsMTkgKzM0NTQsMzEgQEAKIAlpbnQgaWQgPSBJUHJvYmxlbS5VbmRlZmluZWRGaWVsZDsKIAlzd2l0Y2ggKGZpZWxkLnByb2JsZW1JZCgpKSB7CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQgOgotCQkJaWQgPSBJUHJvYmxlbS5VbmRlZmluZWRGaWVsZDsKLS8qIGFsc28gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBzZWFyY2hlZFR5cGUgaXMgdGhlIHJlY2VpdmVyIHR5cGUKLQkJCWlmIChzZWFyY2hlZFR5cGUuaXNIaWVyYXJjaHlJbmNvbnNpc3RlbnQoKSkKLQkJCQlzZXZlcml0eSA9IFNlY29uZGFyeUVycm9yOwotKi8KLQkJCWJyZWFrOwotCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOgorCQkJaWYgKChzZWFyY2hlZFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSGFzTWlzc2luZ1R5cGUpICE9IDApIHsKKwkJCQl0aGlzLmhhbmRsZSgKKwkJCQkJCUlQcm9ibGVtLlVuZGVmaW5lZFR5cGUsCisJCQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzZWFyY2hlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQkJCQluYW1lUmVmLnNvdXJjZVN0YXJ0LAorCQkJCQkJKGludCkgbmFtZVJlZi5zb3VyY2VQb3NpdGlvbnNbaW5kZXgtMV0pOworCQkJCQlyZXR1cm47CisJCQl9CiAJCQlTdHJpbmcgZmllbGROYW1lID0gbmV3IFN0cmluZyhuYW1lUmVmLnRva2Vuc1tpbmRleF0pOworCQkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtmaWVsZE5hbWUgfTsKKwkJCXRoaXMuaGFuZGxlKAorCQkJCQlpZCwKKwkJCQkJYXJndW1lbnRzLAorCQkJCQlhcmd1bWVudHMsCisJCQkJCW5vZGVTb3VyY2VTdGFydChmaWVsZCwgbmFtZVJlZiksCisJCQkJCW5vZGVTb3VyY2VFbmQoZmllbGQsIG5hbWVSZWYpKTsKKwkJCXJldHVybjsKKwkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlIDoKKwkJCWZpZWxkTmFtZSA9IG5ldyBTdHJpbmcobmFtZVJlZi50b2tlbnNbaW5kZXhdKTsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLk5vdFZpc2libGVGaWVsZCwKIAkJCQluZXcgU3RyaW5nW10ge2ZpZWxkTmFtZSwgbmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAogCQkJCW5ldyBTdHJpbmdbXSB7ZmllbGROYW1lLCBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKLQkJCQlub2RlU291cmNlU3RhcnQoZmllbGQsIG5hbWVSZWYpLCAKKwkJCQlub2RlU291cmNlU3RhcnQoZmllbGQsIG5hbWVSZWYpLAogCQkJCW5vZGVTb3VyY2VFbmQoZmllbGQsIG5hbWVSZWYpKTsKIAkJCXJldHVybjsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXMgOgpAQCAtMzAyNyw1MiArMzQ5OSw2NiBAQAogCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzZWFyY2hlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5yZWFkYWJsZU5hbWUoKSl9LAogCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzZWFyY2hlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKLQkJCQluYW1lUmVmLnNvdXJjZUVuZCk7CisJCQkJKGludCkgbmFtZVJlZi5zb3VyY2VQb3NpdGlvbnNbaW5kZXgtMV0pOwogCQkJcmV0dXJuOwogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vRXJyb3IgOiAvLyAwCiAJCWRlZmF1bHQgOgotCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJbmVlZEltcGxlbWVudGF0aW9uKG5hbWVSZWYpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lUmVmLnRva2VucywgMCwgaW5kZXggKyAxKSl9OwogCXRoaXMuaGFuZGxlKAotCQlpZCwgCisJCWlkLAogCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKLQkJbmFtZVJlZi5zb3VyY2VTdGFydCwgCisJCW5hbWVSZWYuc291cmNlU3RhcnQsCiAJCShpbnQpIG5hbWVSZWYuc291cmNlUG9zaXRpb25zW2luZGV4XSk7CiB9CisKIHB1YmxpYyB2b2lkIGludmFsaWRGaWxlTmFtZUZvclBhY2thZ2VBbm5vdGF0aW9ucyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLkludmFsaWRGaWxlTmFtZUZvclBhY2thZ2VBbm5vdGF0aW9ucywKIAkJCU5vQXJndW1lbnQsCiAJCQlOb0FyZ3VtZW50LAogCQkJYW5ub3RhdGlvbi5zb3VyY2VTdGFydCwKLQkJCWFubm90YXRpb24uc291cmNlRW5kKTsJCisJCQlhbm5vdGF0aW9uLnNvdXJjZUVuZCk7CiB9CiAKIHB1YmxpYyB2b2lkIGludmFsaWRNZXRob2QoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CiAJaWYgKGlzUmVjb3ZlcmVkTmFtZShtZXNzYWdlU2VuZC5zZWxlY3RvcikpIHJldHVybjsKLQkKKwogCWludCBpZCA9IElQcm9ibGVtLlVuZGVmaW5lZE1ldGhvZDsgLy9kZWZhdWx0Li4uCiAgICAgTWV0aG9kQmluZGluZyBzaG93bk1ldGhvZCA9IG1ldGhvZDsKIAlzd2l0Y2ggKG1ldGhvZC5wcm9ibGVtSWQoKSkgewogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKKwkJCWlmICgobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJdGhpcy5oYW5kbGUoCisJCQkJCQlJUHJvYmxlbS5VbmRlZmluZWRUeXBlLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQkJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VTdGFydCwKKwkJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyLnNvdXJjZUVuZCk7CisJCQkJCXJldHVybjsKKwkJCX0KIAkJCWlkID0gSVByb2JsZW0uVW5kZWZpbmVkTWV0aG9kOwogCQkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbU1ldGhvZCA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgbWV0aG9kOwogCQkJaWYgKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoICE9IG51bGwpIHsKIAkJCSAgICAJc2hvd25NZXRob2QgPSBwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaDsKLQkJCQkJU3RyaW5nIGNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSk7Ci0JCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKGZhbHNlLCBwcm9ibGVtTWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKTsKLQkJCQkJU3RyaW5nIGNsb3Nlc3RQYXJhbWV0ZXJUeXBlU2hvcnROYW1lcyA9IHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpOwotCQkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSB0eXBlc0FzU3RyaW5nKGZhbHNlLCBwcm9ibGVtTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpOworCQkJICAgIAlpZiAoKHNob3duTWV0aG9kLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQltaXNzaW5nVHlwZUluTWV0aG9kKG1lc3NhZ2VTZW5kLCBzaG93bk1ldGhvZCk7CisJCQkJCQlyZXR1cm47CisJCQkgICAgCX0KKwkJCQkJU3RyaW5nIGNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSk7CisJCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKHByb2JsZW1NZXRob2QucGFyYW1ldGVycywgZmFsc2UpOworCQkJCQlTdHJpbmcgY2xvc2VzdFBhcmFtZXRlclR5cGVTaG9ydE5hbWVzID0gdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSk7CisJCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlU2hvcnROYW1lcyA9IHR5cGVzQXNTdHJpbmcocHJvYmxlbU1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKTsKIAkJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCQlJUHJvYmxlbS5QYXJhbWV0ZXJNaXNtYXRjaCwKIAkJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCQkJbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJCQkJbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksCiAJCQkJCQkJY2xvc2VzdFBhcmFtZXRlclR5cGVOYW1lcywKLQkJCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMgCisJCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzCiAJCQkJCQl9LAogCQkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJCQluZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLApAQCAtMzA4MywxNCArMzU2OSwxNCBAQAogCQkJCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAogCQkJCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKIAkJCQkJcmV0dXJuOwotCQkJfQkJCQorCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6CiAJCQlpZCA9IElQcm9ibGVtLk5vdFZpc2libGVNZXRob2Q7CiAJCQlwcm9ibGVtTWV0aG9kID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSBtZXRob2Q7CiAJCQlpZiAocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2ggIT0gbnVsbCkgewogCQkJICAgIHNob3duTWV0aG9kID0gcHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2gub3JpZ2luYWwoKTsKLQkJICAgIH0JCQkKKwkJICAgIH0KIAkJCWJyZWFrOwogCQljYXNlIFByb2JsZW1SZWFzb25zLkFtYmlndW91cyA6CiAJCQlpZCA9IElQcm9ibGVtLkFtYmlndW91c01ldGhvZDsKQEAgLTMxMDcsOCArMzU5Myw4IEBACiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSA6CiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5Ob3RWaXNpYmxlVHlwZSwJLy8gY2Fubm90IG9jY3VyIGluIGphdmFkb2MgY29tbWVudHMKLQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKLQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJCQltZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VTdGFydCwKIAkJCQltZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VFbmQpOwogCQkJcmV0dXJuOwpAQCAtMzEyMywyNCArMzYwOSwyNCBAQAogCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtTWV0aG9kLnBhcmFtZXRlcnMsIDAsIGludm9jYXRpb25Bcmd1bWVudHMsIDAsIGF1Z21lbnRlZExlbmd0aC0yKTsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLkdlbmVyaWNNZXRob2RUeXBlQXJndW1lbnRNaXNtYXRjaCwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhmYWxzZSwgaW52b2NhdGlvbkFyZ3VtZW50cywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoaW52b2NhdGlvbkFyZ3VtZW50cywgZmFsc2UpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhpbmZlcnJlZFR5cGVBcmd1bWVudC5yZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIGZhbHNlKSB9LAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhmYWxzZSwgaW52b2NhdGlvbkFyZ3VtZW50cywgdHJ1ZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhpbmZlcnJlZFR5cGVBcmd1bWVudC5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksIAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIHRydWUpIH0sCiAJCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAotCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CQkgICAgCisJCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5UeXBlUGFyYW1ldGVyQXJpdHlNaXNtYXRjaCA6CiAJCQlwcm9ibGVtTWV0aG9kID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSBtZXRob2Q7CkBAIC0zMTQ4LDM1ICszNjM0LDM1IEBACiAJCQlpZiAoc2hvd25NZXRob2QudHlwZVZhcmlhYmxlcyA9PSBCaW5kaW5nLk5PX1RZUEVfVkFSSUFCTEVTKSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLk5vbkdlbmVyaWNNZXRob2QgLAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSB9LAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSkgfSwKIAkJCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAotCQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwkJICAgIAorCQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLmhhbmRsZSgKIAkJCQkJSVByb2JsZW0uSW5jb3JyZWN0QXJpdHlGb3JQYXJhbWV0ZXJpemVkTWV0aG9kICAsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsIHNob3duTWV0aG9kLnR5cGVWYXJpYWJsZXMsIGZhbHNlKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCQkJdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC50eXBlVmFyaWFibGVzLCBmYWxzZSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSB9LAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCBzaG93bk1ldGhvZC50eXBlVmFyaWFibGVzLCB0cnVlKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCQl0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLnR5cGVWYXJpYWJsZXMsIHRydWUpLAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSB9LAogCQkJCQkoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMiksCi0JCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CQkgICAgCisJCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiAJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyaXplZE1ldGhvZFR5cGVNaXNtYXRjaCA6CkBAIC0zMTg0LDU3ICszNjcwLDU1IEBACiAJCQlzaG93bk1ldGhvZCA9IHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoOwogCQkJdGhpcy5oYW5kbGUoCiAJCQkJSVByb2JsZW0uUGFyYW1ldGVyaXplZE1ldGhvZEFyZ3VtZW50VHlwZU1pc21hdGNoLAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCAoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bk1ldGhvZCkudHlwZUFyZ3VtZW50cywgZmFsc2UpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSkgfSwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QsIGZhbHNlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCQkJdHlwZXNBc1N0cmluZygoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bk1ldGhvZCkudHlwZUFyZ3VtZW50cywgZmFsc2UpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSB9LAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpc2hvd25NZXRob2QpLnR5cGVBcmd1bWVudHMsIHRydWUpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSB9LAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkJdHlwZXNBc1N0cmluZygoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bk1ldGhvZCkudHlwZUFyZ3VtZW50cywgdHJ1ZSksCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSkgfSwKIAkJCQkoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMiksCi0JCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsJCSAgICAKKwkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwogCQkJcmV0dXJuOwogCQljYXNlIFByb2JsZW1SZWFzb25zLlR5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljTWV0aG9kIDoKIAkJCXByb2JsZW1NZXRob2QgPSAoUHJvYmxlbU1ldGhvZEJpbmRpbmcpIG1ldGhvZDsKIAkJCXNob3duTWV0aG9kID0gcHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2g7CiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5UeXBlQXJndW1lbnRzRm9yUmF3R2VuZXJpY01ldGhvZCAsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC5pc1ZhcmFyZ3MoKSwgc2hvd25NZXRob2QucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSkgfSwKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSkgfSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QsIHRydWUpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSB9LAogCQkJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKLQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwkJICAgICAgIAorCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9FcnJvciA6IC8vIDAKIAkJZGVmYXVsdCA6Ci0JCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQluZWVkSW1wbGVtZW50YXRpb24obWVzc2FnZVNlbmQpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KLQogCXRoaXMuaGFuZGxlKAogCQlpZCwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCW5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAorCQkJbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QsIGZhbHNlKX0sCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCW5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKX0sCisJCQluZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSl9LAogCQkoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMiksCiAJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiB9Ci0KIHB1YmxpYyB2b2lkIGludmFsaWROdWxsVG9TeW5jaHJvbml6ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZE51bGxUb1N5bmNocm9uaXplZCwKQEAgLTMzMTcsNyArMzgwMSwyMSBAQAogCQkJaWYgKGlzUmVjb3ZlcmVkTmFtZSgoKFJlZmVyZW5jZUJpbmRpbmcpbGVhZlR5cGUpLmNvbXBvdW5kTmFtZSkpIHJldHVybjsKIAkJfQogCX0KLQkKKworCWlmICh0eXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgeworCQlMaXN0IG1pc3NpbmdUeXBlcyA9IHR5cGUuY29sbGVjdE1pc3NpbmdUeXBlcyhudWxsKTsKKwkJaWYgKG1pc3NpbmdUeXBlcyAhPSBudWxsKSB7CisJCQlSZWZlcmVuY2VDb250ZXh0IHNhdmVkQ29udGV4dCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dDsKKwkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtaXNzaW5nVHlwZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKwkJCQl0cnkgeworCQkJCQlpbnZhbGlkVHlwZShsb2NhdGlvbiwgKFR5cGVCaW5kaW5nKSBpdGVyYXRvci5uZXh0KCkpOworCQkJCX0gZmluYWxseSB7CisJCQkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IHNhdmVkQ29udGV4dDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9CiAJaW50IGlkID0gSVByb2JsZW0uVW5kZWZpbmVkVHlwZTsgLy8gZGVmYXVsdAogCXN3aXRjaCAodHlwZS5wcm9ibGVtSWQoKSkgewogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKQEAgLTMzMzcsMTYgKzM4MzUsMTYgQEAKIAkJCWJyZWFrOwogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCA6CiAJCQlpZCA9IElQcm9ibGVtLk5vblN0YXRpY1R5cGVGcm9tU3RhdGljSW52b2NhdGlvbjsKLQkJICAgIGJyZWFrOwotCQljYXNlIFByb2JsZW1SZWFzb25zLklsbGVnYWxTdXBlclR5cGVWYXJpYWJsZSA6IAotCQkgICAgaWQgPSBJUHJvYmxlbS5JbGxlZ2FsVHlwZVZhcmlhYmxlU3VwZXJSZWZlcmVuY2U7Ci0JCSAgICBicmVhazsKKwkJCWJyZWFrOworCQljYXNlIFByb2JsZW1SZWFzb25zLklsbGVnYWxTdXBlclR5cGVWYXJpYWJsZSA6CisJCQlpZCA9IElQcm9ibGVtLklsbGVnYWxUeXBlVmFyaWFibGVTdXBlclJlZmVyZW5jZTsKKwkJCWJyZWFrOwogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vRXJyb3IgOiAvLyAwCiAJCWRlZmF1bHQgOgotCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJbmVlZEltcGxlbWVudGF0aW9uKGxvY2F0aW9uKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCiAJCQlicmVhazsKIAl9Ci0JCisKIAlpbnQgZW5kID0gbG9jYXRpb24uc291cmNlRW5kOwogCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKIAkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbG9jYXRpb247CkBAIC0zMzY0LDggKzM4NjIsMTQgQEAKIAl9IGVsc2UgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CiAJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgPSAoQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBsb2NhdGlvbjsKIAkJaWYgKGlzUmVjb3ZlcmVkTmFtZShhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UudG9rZW5zKSkgcmV0dXJuOwotCQlsb25nW10gcG9zaXRpb25zID0gYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uczsKLQkJZW5kID0gKGludCkgcG9zaXRpb25zW3Bvc2l0aW9ucy5sZW5ndGggLSAxXTsKKwkJVHlwZUJpbmRpbmcgbGVhZlR5cGUgPSB0eXBlLmxlYWZDb21wb25lbnRUeXBlKCk7CisJCWlmIChsZWFmVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCWNoYXJbXVtdIG5hbWUgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGxlYWZUeXBlKS5jb21wb3VuZE5hbWU7IC8vIHByb2JsZW0gdHlwZSB3aWxsIHRlbGwgaG93IG11Y2ggZ290IHJlc29sdmVkCisJCQllbmQgPSAoaW50KSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zW25hbWUubGVuZ3RoLTFdOworCQl9IGVsc2UgeworCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnM7CisJCQllbmQgPSAoaW50KSBwb3NpdGlvbnNbcG9zaXRpb25zLmxlbmd0aCAtIDFdOworCQl9CiAJfSBlbHNlIGlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKIAkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgbG9jYXRpb247CiAJCWlmIChpc1JlY292ZXJlZE5hbWUocmVmLnRva2VucykpIHJldHVybjsKQEAgLTMzODgsNyArMzg5Miw3IEBACiAJfQogCXRoaXMuaGFuZGxlKAogCQlpZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5yZWFkYWJsZU5hbWUoKSkgfSwJCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpIH0sCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJZW5kKTsKQEAgLTM0MDEsMTMgKzM5MDUsMTMgQEAKIAkJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBpbnZhbGlkVHlwZVJlZmVyZW5jZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKK3B1YmxpYyB2b2lkIGludmFsaWRUeXBlRm9yQ29sbGVjdGlvblRhcmdldDE0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCXRoaXMuaGFuZGxlKAotCQlJUHJvYmxlbS5JbnZhbGlkVHlwZUV4cHJlc3Npb24sCi0JCU5vQXJndW1lbnQsCi0JCU5vQXJndW1lbnQsCi0JCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCi0JCWV4cHJlc3Npb24uc291cmNlRW5kKTsKKwkJCUlQcm9ibGVtLkludmFsaWRUeXBlRm9yQ29sbGVjdGlvblRhcmdldDE0LAorCQkJTm9Bcmd1bWVudCwKKwkJCU5vQXJndW1lbnQsCisJCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW52YWxpZFR5cGVUb1N5bmNocm9uaXplKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgdHlwZSkgewogCXRoaXMuaGFuZGxlKApAQCAtMzQzNiw3NSArMzk0MCw4NyBAQAogcHVibGljIHZvaWQgaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZkFubm90YXRpb25zLAotCQlOb0FyZ3VtZW50LCAKKwkJTm9Bcmd1bWVudCwKIAkJTm9Bcmd1bWVudCwKIAkJYW5ub3RhdGlvbi5zb3VyY2VTdGFydCwKLQkJYW5ub3RhdGlvbi5zb3VyY2VFbmQpOwkKKwkJYW5ub3RhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW52YWxpZFVzYWdlT2ZBbm5vdGF0aW9uRGVjbGFyYXRpb25zKFR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludmFsaWRVc2FnZU9mQW5ub3RhdGlvbkRlY2xhcmF0aW9ucywKLQkJTm9Bcmd1bWVudCwgCi0JCU5vQXJndW1lbnQsIAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAogCQlhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkVXNhZ2VPZkVudW1EZWNsYXJhdGlvbnMoVHlwZURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZkVudW1EZWNsYXJhdGlvbnMsCi0JCU5vQXJndW1lbnQsIAotCQlOb0FyZ3VtZW50LCAKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZW51bURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAogCQllbnVtRGVjbGFyYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRVc2FnZU9mRm9yZWFjaFN0YXRlbWVudHMoTG9jYWxEZWNsYXJhdGlvbiBlbGVtZW50VmFyaWFibGUsIEV4cHJlc3Npb24gY29sbGVjdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZkZvcmVhY2hTdGF0ZW1lbnRzLAotCQlOb0FyZ3VtZW50LCAKLQkJTm9Bcmd1bWVudCwgCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWVsZW1lbnRWYXJpYWJsZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAogCQljb2xsZWN0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkVXNhZ2VPZlN0YXRpY0ltcG9ydHMoSW1wb3J0UmVmZXJlbmNlIHN0YXRpY0ltcG9ydCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZlN0YXRpY0ltcG9ydHMsCi0JCU5vQXJndW1lbnQsIAotCQlOb0FyZ3VtZW50LCAKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJc3RhdGljSW1wb3J0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCiAJCXN0YXRpY0ltcG9ydC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkVXNhZ2VPZlR5cGVBcmd1bWVudHMoVHlwZVJlZmVyZW5jZSBmaXJzdFR5cGVSZWZlcmVuY2UsIFR5cGVSZWZlcmVuY2UgbGFzdFR5cGVSZWZlcmVuY2UpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZFVzYWdlT2ZUeXBlQXJndW1lbnRzLAotCQlOb0FyZ3VtZW50LCAKLQkJTm9Bcmd1bWVudCwgCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWZpcnN0VHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwKIAkJbGFzdFR5cGVSZWZlcmVuY2Uuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRVc2FnZU9mVHlwZVBhcmFtZXRlcnMoVHlwZVBhcmFtZXRlciBmaXJzdFR5cGVQYXJhbWV0ZXIsIFR5cGVQYXJhbWV0ZXIgbGFzdFR5cGVQYXJhbWV0ZXIpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZFVzYWdlT2ZUeXBlUGFyYW1ldGVycywKLQkJTm9Bcmd1bWVudCwgCi0JCU5vQXJndW1lbnQsIAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlmaXJzdFR5cGVQYXJhbWV0ZXIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKIAkJbGFzdFR5cGVQYXJhbWV0ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgaW52YWxpZFVzYWdlT2ZUeXBlUGFyYW1ldGVyc0ZvckFubm90YXRpb25EZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgeworCVR5cGVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKKwlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5JbnZhbGlkVXNhZ2VPZlR5cGVQYXJhbWV0ZXJzRm9yQW5ub3RhdGlvbkRlY2xhcmF0aW9uLAorCQkJTm9Bcmd1bWVudCwKKwkJCU5vQXJndW1lbnQsCisJCQlwYXJhbWV0ZXJzWzBdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCisJCQlwYXJhbWV0ZXJzW2xlbmd0aCAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRVc2FnZU9mVHlwZVBhcmFtZXRlcnNGb3JFbnVtRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIHsKKwlUeXBlUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM7CisJaW50IGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uSW52YWxpZFVzYWdlT2ZUeXBlUGFyYW1ldGVyc0ZvckVudW1EZWNsYXJhdGlvbiwKKwkJCU5vQXJndW1lbnQsCisJCQlOb0FyZ3VtZW50LAorCQkJcGFyYW1ldGVyc1swXS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQkJcGFyYW1ldGVyc1tsZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCBpbnZhbGlkVXNhZ2VPZlZhcmFyZ3MoQXJndW1lbnQgYXJndW1lbnQpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZFVzYWdlT2ZWYXJhcmdzLAotCQlOb0FyZ3VtZW50LCAKLQkJTm9Bcmd1bWVudCwgCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWFyZ3VtZW50LnR5cGUuc291cmNlU3RhcnQsCiAJCWFyZ3VtZW50LnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBpbGxlZ2FsVXNhZ2VPZldpbGRjYXJkKFR5cGVSZWZlcmVuY2Ugd2lsZGNhcmQpIHsKLQl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uSW52YWxpZFVzYWdlT2ZXaWxkY2FyZCwKLQkJTm9Bcmd1bWVudCwgCi0JCU5vQXJndW1lbnQsIAotCQl3aWxkY2FyZC5zb3VyY2VTdGFydCwKLQkJd2lsZGNhcmQuc291cmNlRW5kKTsKLX0KIHB1YmxpYyB2b2lkIGlzQ2xhc3NQYXRoQ29ycmVjdChjaGFyW11bXSB3ZWxsS25vd25UeXBlTmFtZSwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsLCBPYmplY3QgbG9jYXRpb24pIHsKIAl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBjb21wVW5pdERlY2w7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHdlbGxLbm93blR5cGVOYW1lKX07CkBAIC0zNTIyLDcgKzQwMzgsNyBAQAogCX0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSXNDbGFzc1BhdGhDb3JyZWN0LAotCQlhcmd1bWVudHMsIAorCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKIAkJc3RhcnQsCiAJCWVuZCk7CkBAIC0zNTgzLDM1ICs0MDk5LDI2IEBACiAJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldm9sYXRpbGU6CiAJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ld2hpbGU6CiAJCQlyZXR1cm4gdHJ1ZTsKLQkJZGVmYXVsdDogCisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogfQogcHJpdmF0ZSBib29sZWFuIGlzTGl0ZXJhbChpbnQgdG9rZW4pIHsKLQlzd2l0Y2godG9rZW4pIHsKLQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDoKLQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMb25nTGl0ZXJhbDoKLQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDoKLQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVEb3VibGVMaXRlcmFsOgotCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVN0cmluZ0xpdGVyYWw6Ci0JCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ2hhcmFjdGVyTGl0ZXJhbDoKLQkJCXJldHVybiB0cnVlOwotCQlkZWZhdWx0OiAKLQkJCXJldHVybiBmYWxzZTsKLQl9CisJcmV0dXJuIFNjYW5uZXIuaXNMaXRlcmFsKHRva2VuKTsKIH0KKwogcHJpdmF0ZSBib29sZWFuIGlzUmVjb3ZlcmVkTmFtZShjaGFyW10gc2ltcGxlTmFtZSkgewogCXJldHVybiBzaW1wbGVOYW1lID09IFJlY292ZXJ5U2Nhbm5lci5GQUtFX0lERU5USUZJRVI7CiB9CisKIHByaXZhdGUgYm9vbGVhbiBpc1JlY292ZXJlZE5hbWUoY2hhcltdW10gcXVhbGlmaWVkTmFtZSkgewogCWlmKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQogCWZvciAoaW50IGkgPSAwOyBpIDwgcXVhbGlmaWVkTmFtZS5sZW5ndGg7IGkrKykgewogCQlpZihxdWFsaWZpZWROYW1lW2ldID09IFJlY292ZXJ5U2Nhbm5lci5GQUtFX0lERU5USUZJRVIpIHJldHVybiB0cnVlOwogCX0KLQkKIAlyZXR1cm4gZmFsc2U7CiB9CisKIHB1YmxpYyB2b2lkIGphdmFkb2NBbWJpZ3VvdXNNZXRob2RSZWZlcmVuY2UoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBCaW5kaW5nIGZpZWxkQmluZGluZywgaW50IG1vZGlmaWVycykgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5KYXZhZG9jQW1iaWd1b3VzTWV0aG9kUmVmZXJlbmNlKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CkBAIC0zNjQ5LDE2ICs0MTU2LDE2IEBACiAJCWlmIChpc0NvbnN0cnVjdG9yKSB7CiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5KYXZhZG9jVXNpbmdEZXByZWNhdGVkQ29uc3RydWN0b3IsCi0JCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpfSwKLQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKX0sCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpfSwKIAkJCQlzZXZlcml0eSwKIAkJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogCQl9IGVsc2UgewogCQkJdGhpcy5oYW5kbGUoCiAJCQkJSVByb2JsZW0uSmF2YWRvY1VzaW5nRGVwcmVjYXRlZE1ldGhvZCwKLQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKX0sCi0JCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKX0sCiAJCQkJc2V2ZXJpdHksCiAJCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCQkJbG9jYXRpb24uc291cmNlRW5kKTsKQEAgLTM2NjYsNiArNDE3Myw5IEBACiAJfQogfQogcHVibGljIHZvaWQgamF2YWRvY0RlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIEFTVE5vZGUgbG9jYXRpb24sIGludCBtb2RpZmllcnMpIHsKKwlqYXZhZG9jRGVwcmVjYXRlZFR5cGUodHlwZSwgbG9jYXRpb24sIG1vZGlmaWVycywgSW50ZWdlci5NQVhfVkFMVUUpOworfQorcHVibGljIHZvaWQgamF2YWRvY0RlcHJlY2F0ZWRUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIEFTVE5vZGUgbG9jYXRpb24sIGludCBtb2RpZmllcnMsIGludCBpbmRleCkgewogCWlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47IC8vIDFHODI4RE4gLSBubyB0eXBlIHJlZiBmb3Igc3ludGhldGljIGFyZ3VtZW50cwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5KYXZhZG9jVXNpbmdEZXByZWNhdGVkVHlwZSk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtMzY3OSw3ICs0MTg5LDcgQEAKIAkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCQkJc2V2ZXJpdHksCiAJCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCQkJbG9jYXRpb24uc291cmNlRW5kKTsKKwkJCQlub2RlU291cmNlRW5kKG51bGwsIGxvY2F0aW9uLCBpbmRleCkpOwogCQl9CiAJfQogfQpAQCAtMzcyNyw3ICs0MjM3LDggQEAKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY0VtcHR5UmV0dXJuVGFnKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJaWYgKGphdmFkb2NWaXNpYmlsaXR5KHRoaXMub3B0aW9ucy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5LCBtb2RpZmllcnMpKSB7Ci0JCXRoaXMuaGFuZGxlKElQcm9ibGVtLkphdmFkb2NFbXB0eVJldHVyblRhZywgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoSmF2YWRvY1RhZ0NvbnN0YW50cy5UQUdfUkVUVVJOKSB9OworCQl0aGlzLmhhbmRsZShJUHJvYmxlbS5KYXZhZG9jRW1wdHlSZXR1cm5UYWcsIGFyZ3VtZW50cywgYXJndW1lbnRzLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIAl9CiB9CiBwdWJsaWMgdm9pZCBqYXZhZG9jRXJyb3JOb01ldGhvZEZvcihNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgVHlwZUJpbmRpbmcgcmVjVHlwZSwgVHlwZUJpbmRpbmdbXSBwYXJhbXMsIGludCBtb2RpZmllcnMpIHsKQEAgLTM3OTYsMzYgKzQzMDcsMzYgQEAKIAkJCXByb2JsZW1Db25zdHJ1Y3RvciA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgdGFyZ2V0Q29uc3RydWN0b3I7CiAJCQlQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgc3Vic3RpdHV0ZWRDb25zdHJ1Y3RvciA9IChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpIHByb2JsZW1Db25zdHJ1Y3Rvci5jbG9zZXN0TWF0Y2g7CiAJCQlzaG93bkNvbnN0cnVjdG9yID0gc3Vic3RpdHV0ZWRDb25zdHJ1Y3Rvci5vcmlnaW5hbCgpOwotCQkJCisKIAkJCWludCBhdWdtZW50ZWRMZW5ndGggPSBwcm9ibGVtQ29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGg7CiAJCQlUeXBlQmluZGluZyBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IHByb2JsZW1Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2F1Z21lbnRlZExlbmd0aC0yXTsKIAkJCVR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVBhcmFtZXRlciA9IChUeXBlVmFyaWFibGVCaW5kaW5nKSBwcm9ibGVtQ29uc3RydWN0b3IucGFyYW1ldGVyc1thdWdtZW50ZWRMZW5ndGgtMV07CiAJCQlUeXBlQmluZGluZ1tdIGludm9jYXRpb25Bcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbYXVnbWVudGVkTGVuZ3RoLTJdOyAvLyByZW1vdmUgZXh0cmEgaW5mbyBmcm9tIHRoZSBlbmQKIAkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbUNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIDAsIGludm9jYXRpb25Bcmd1bWVudHMsIDAsIGF1Z21lbnRlZExlbmd0aC0yKTsKLQkJCQorCiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5KYXZhZG9jR2VuZXJpY0NvbnN0cnVjdG9yVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoZmFsc2UsIGludm9jYXRpb25Bcmd1bWVudHMsIGZhbHNlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksIAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwKIAkJCQkgICAgICAgIHBhcmFtZXRlckJvdW5kQXNTdHJpbmcodHlwZVBhcmFtZXRlciwgZmFsc2UpIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGZhbHNlLCBpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKGluZmVycmVkVHlwZUFyZ3VtZW50LnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIHRydWUpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIHRydWUpIH0sCiAJCQkJc2V2ZXJpdHksCiAJCQkJc291cmNlU3RhcnQsCi0JCQkJc291cmNlRW5kKTsJCSAgICAKLQkJCXJldHVybjsJCSAgICAKLQkJCQorCQkJCXNvdXJjZUVuZCk7CisJCQlyZXR1cm47CisKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5UeXBlUGFyYW1ldGVyQXJpdHlNaXNtYXRjaCA6CiAJCQlwcm9ibGVtQ29uc3RydWN0b3IgPSAoUHJvYmxlbU1ldGhvZEJpbmRpbmcpIHRhcmdldENvbnN0cnVjdG9yOwogCQkJc2hvd25Db25zdHJ1Y3RvciA9IHByb2JsZW1Db25zdHJ1Y3Rvci5jbG9zZXN0TWF0Y2g7CkBAIC0zODM1LDM3ICs0MzQ2LDM3IEBACiAJCQlpZiAobm9UeXBlVmFyaWFibGVzKSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLkphdmFkb2NOb25HZW5lcmljQ29uc3RydWN0b3IsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIGZhbHNlKSwKKwkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIGZhbHNlKSB9LAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSB9LAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIHRydWUpIH0sCiAJCQkJCXNldmVyaXR5LAogCQkJCQlzb3VyY2VTdGFydCwKLQkJCQkJc291cmNlRW5kKTsJCSAgICAKKwkJCQkJc291cmNlRW5kKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLkphdmFkb2NJbmNvcnJlY3RBcml0eUZvclBhcmFtZXRlcml6ZWRDb25zdHJ1Y3RvciwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSksCi0JCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBzaG93bkNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgc2hvd25Db25zdHJ1Y3Rvci50eXBlVmFyaWFibGVzLCBmYWxzZSksCi0JCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgZmFsc2UpIH0sCi0JCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgZmFsc2UpLAorCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCQkJdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLnR5cGVWYXJpYWJsZXMsIGZhbHNlKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCBmYWxzZSkgfSwKKwkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHNob3duQ29uc3RydWN0b3IucGFyYW1ldGVycywgdHJ1ZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgc2hvd25Db25zdHJ1Y3Rvci50eXBlVmFyaWFibGVzLCB0cnVlKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSB9LAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkJCXR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci50eXBlVmFyaWFibGVzLCB0cnVlKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCB0cnVlKSB9LAogCQkJCQlzZXZlcml0eSwKIAkJCQkJc291cmNlU3RhcnQsCi0JCQkJCXNvdXJjZUVuZCk7CQkgICAgCisJCQkJCXNvdXJjZUVuZCk7CiAJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuUGFyYW1ldGVyaXplZE1ldGhvZFR5cGVNaXNtYXRjaCA6CkBAIC0zODc1LDIxICs0Mzg2LDIxIEBACiAJCQlzaG93bkNvbnN0cnVjdG9yID0gcHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaDsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLkphdmFkb2NQYXJhbWV0ZXJpemVkQ29uc3RydWN0b3JBcmd1bWVudFR5cGVNaXNtYXRjaCwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHNob3duQ29uc3RydWN0b3IucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpc2hvd25Db25zdHJ1Y3RvcikudHlwZUFyZ3VtZW50cywgZmFsc2UpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgZmFsc2UpIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duQ29uc3RydWN0b3IsIGZhbHNlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCQl0eXBlc0FzU3RyaW5nKCgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKXNob3duQ29uc3RydWN0b3IpLnR5cGVBcmd1bWVudHMsIGZhbHNlKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIGZhbHNlKSB9LAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpc2hvd25Db25zdHJ1Y3RvcikudHlwZUFyZ3VtZW50cywgdHJ1ZSksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSB9LAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bkNvbnN0cnVjdG9yLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCXR5cGVzQXNTdHJpbmcoKChQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcpc2hvd25Db25zdHJ1Y3RvcikudHlwZUFyZ3VtZW50cywgdHJ1ZSksCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCB0cnVlKSB9LAogCQkJCXNldmVyaXR5LAogCQkJCXNvdXJjZVN0YXJ0LAotCQkJCXNvdXJjZUVuZCk7CQkgICAgCisJCQkJc291cmNlRW5kKTsKIAkJCXJldHVybjsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5UeXBlQXJndW1lbnRzRm9yUmF3R2VuZXJpY01ldGhvZCA6CiAJCQlzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5KYXZhZG9jVHlwZUFyZ3VtZW50c0ZvclJhd0dlbmVyaWNDb25zdHJ1Y3Rvcik7CkBAIC0zODk4LDMxICs0NDA5LDMxIEBACiAJCQlzaG93bkNvbnN0cnVjdG9yID0gcHJvYmxlbUNvbnN0cnVjdG9yLmNsb3Nlc3RNYXRjaDsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLkphdmFkb2NUeXBlQXJndW1lbnRzRm9yUmF3R2VuZXJpY0NvbnN0cnVjdG9yLAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSkgfSwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgZmFsc2UpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bkNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IsIGZhbHNlKSB9LAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgc2hvd25Db25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgdHJ1ZSkgfSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25Db25zdHJ1Y3RvciwgdHJ1ZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duQ29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCB0cnVlKSB9LAogCQkJCXNldmVyaXR5LAogCQkJCXNvdXJjZVN0YXJ0LAotCQkJCXNvdXJjZUVuZCk7CQorCQkJCXNvdXJjZUVuZCk7CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9FcnJvciA6IC8vIDAKIAkJZGVmYXVsdCA6Ci0JCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQluZWVkSW1wbGVtZW50YXRpb24oc3RhdGVtZW50KTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCiAJCQlicmVhazsKIAl9CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KGlkKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJdGhpcy5oYW5kbGUoCiAJCWlkLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmlzVmFyYXJncygpLCB0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuaXNWYXJhcmdzKCksIHRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3RvciwgZmFsc2UpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKHRhcmdldENvbnN0cnVjdG9yLCB0cnVlKX0sCiAJCXNldmVyaXR5LAogCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCiAJCXN0YXRlbWVudC5zb3VyY2VFbmQpOwpAQCAtMzkzNCw3ICs0NDQ1LDcgQEAKICAqIAktIE5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uIDoKICAqIAktIFJlY2VpdmVyVHlwZU5vdFZpc2libGUgOgogICovCi1wdWJsaWMgdm9pZCBqYXZhZG9jSW52YWxpZEZpZWxkKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgQmluZGluZyBmaWVsZEJpbmRpbmcsIFR5cGVCaW5kaW5nIHNlYXJjaGVkVHlwZSwgaW50IG1vZGlmaWVycykgeworcHVibGljIHZvaWQgamF2YWRvY0ludmFsaWRGaWVsZChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiwgQmluZGluZyBmaWVsZEJpbmRpbmcsIFR5cGVCaW5kaW5nIHNlYXJjaGVkVHlwZSwgaW50IG1vZGlmaWVycykgewogCWludCBpZCA9IElQcm9ibGVtLkphdmFkb2NVbmRlZmluZWRGaWVsZDsKIAlzd2l0Y2ggKGZpZWxkQmluZGluZy5wcm9ibGVtSWQoKSkgewogCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kIDoKQEAgLTM5NDgsNyArNDQ1OSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob0Vycm9yIDogLy8gMAogCQlkZWZhdWx0IDoKLQkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCW5lZWRJbXBsZW1lbnRhdGlvbihmaWVsZFJlZik7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgogCQkJYnJlYWs7CiAJfQogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShpZCk7CkBAIC0zOTYxLDggKzQ0NzIsOCBAQAogCQkJYXJndW1lbnRzLAogCQkJYXJndW1lbnRzLAogCQkJc2V2ZXJpdHksCi0JCQlzb3VyY2VTdGFydCwKLQkJCXNvdXJjZUVuZCk7CisJCQlmaWVsZFJlZi5zb3VyY2VTdGFydCwKKwkJCWZpZWxkUmVmLnNvdXJjZUVuZCk7CiAJfQogfQogcHVibGljIHZvaWQgamF2YWRvY0ludmFsaWRNZW1iZXJUeXBlUXVhbGlmaWNhdGlvbihpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQsIGludCBtb2RpZmllcnMpewpAQCAtMzk5MCwxMCArNDUwMSwxMCBAQAogCQkJaWYgKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoICE9IG51bGwpIHsKIAkJCQlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY1BhcmFtZXRlck1pc21hdGNoKTsKIAkJCQlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47Ci0JCQkJU3RyaW5nIGNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLmlzVmFyYXJncygpLCBwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaC5wYXJhbWV0ZXJzLCBmYWxzZSk7Ci0JCQkJU3RyaW5nIHBhcmFtZXRlclR5cGVOYW1lcyA9IHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpOwotCQkJCVN0cmluZyBjbG9zZXN0UGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSB0eXBlc0FzU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLmlzVmFyYXJncygpLCBwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaC5wYXJhbWV0ZXJzLCB0cnVlKTsKLQkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpOworCQkJCVN0cmluZyBjbG9zZXN0UGFyYW1ldGVyVHlwZU5hbWVzID0gdHlwZXNBc1N0cmluZyhwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaCwgZmFsc2UpOworCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpOworCQkJCVN0cmluZyBjbG9zZXN0UGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSB0eXBlc0FzU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLCB0cnVlKTsKKwkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSk7CiAJCQkJaWYgKGNsb3Nlc3RQYXJhbWV0ZXJUeXBlU2hvcnROYW1lcy5lcXVhbHMocGFyYW1ldGVyVHlwZVNob3J0TmFtZXMpKXsKIAkJCQkJY2xvc2VzdFBhcmFtZXRlclR5cGVTaG9ydE5hbWVzID0gY2xvc2VzdFBhcmFtZXRlclR5cGVOYW1lczsKIAkJCQkJcGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSBwYXJhbWV0ZXJUeXBlTmFtZXM7CkBAIC00MDA0LDcgKzQ1MTUsNyBAQAogCQkJCQkJbmV3IFN0cmluZyhwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJCQluZXcgU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLnNlbGVjdG9yKSwKIAkJCQkJCWNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXMsCi0JCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMgCisJCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMKIAkJCQkJfSwKIAkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJCW5ldyBTdHJpbmcocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2guZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCkBAIC00MDM3LDI1ICs0NTQ4LDI1IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1NZXRob2QucGFyYW1ldGVycywgMCwgaW52b2NhdGlvbkFyZ3VtZW50cywgMCwgYXVnbWVudGVkTGVuZ3RoLTIpOwogCQkJdGhpcy5oYW5kbGUoCiAJCQkJSVByb2JsZW0uSmF2YWRvY0dlbmVyaWNNZXRob2RUeXBlQXJndW1lbnRNaXNtYXRjaCwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhmYWxzZSwgaW52b2NhdGlvbkFyZ3VtZW50cywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoaW52b2NhdGlvbkFyZ3VtZW50cywgZmFsc2UpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhpbmZlcnJlZFR5cGVBcmd1bWVudC5yZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIGZhbHNlKSB9LAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhmYWxzZSwgaW52b2NhdGlvbkFyZ3VtZW50cywgdHJ1ZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhpbmZlcnJlZFR5cGVBcmd1bWVudC5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksIAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhpbnZvY2F0aW9uQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoaW5mZXJyZWRUeXBlQXJndW1lbnQuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHR5cGVQYXJhbWV0ZXIuc291cmNlTmFtZSksCiAJCQkJICAgICAgICBwYXJhbWV0ZXJCb3VuZEFzU3RyaW5nKHR5cGVQYXJhbWV0ZXIsIHRydWUpIH0sCiAJCQkJc2V2ZXJpdHksCiAJCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAotCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CQkgICAgCisJCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKIAkJCXJldHVybjsKIAkJY2FzZSBQcm9ibGVtUmVhc29ucy5UeXBlUGFyYW1ldGVyQXJpdHlNaXNtYXRjaCA6CiAJCQlwcm9ibGVtTWV0aG9kID0gKFByb2JsZW1NZXRob2RCaW5kaW5nKSBtZXRob2Q7CkBAIC00MDY2LDM3ICs0NTc3LDM3IEBACiAJCQlpZiAobm9UeXBlVmFyaWFibGVzKSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLkphdmFkb2NOb25HZW5lcmljTWV0aG9kLAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksIAotCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSB9LAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSkgfSwKIAkJCQkJc2V2ZXJpdHksCiAJCQkJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKLQkJCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsJCSAgICAKKwkJCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhpcy5oYW5kbGUoCiAJCQkJCUlQcm9ibGVtLkphdmFkb2NJbmNvcnJlY3RBcml0eUZvclBhcmFtZXRlcml6ZWRNZXRob2QsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwgCi0JCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsIHNob3duTWV0aG9kLnR5cGVWYXJpYWJsZXMsIGZhbHNlKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCQkJdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC50eXBlVmFyaWFibGVzLCBmYWxzZSksCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSB9LAorCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QuaXNWYXJhcmdzKCksIHNob3duTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLCAKLQkJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCBzaG93bk1ldGhvZC50eXBlVmFyaWFibGVzLCB0cnVlKSwKLQkJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgdHJ1ZSksCisJCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJCQl0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLnR5cGVWYXJpYWJsZXMsIHRydWUpLAorCQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSB9LAogCQkJCQlzZXZlcml0eSwKIAkJCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAotCQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwkJICAgIAorCQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwogCQkJfQogCQkJcmV0dXJuOwogCQljYXNlIFByb2JsZW1SZWFzb25zLlBhcmFtZXRlcml6ZWRNZXRob2RUeXBlTWlzbWF0Y2ggOgpAQCAtNDEwNiwyMSArNDYxNywyMSBAQAogCQkJc2hvd25NZXRob2QgPSBwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaDsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLkphdmFkb2NQYXJhbWV0ZXJpemVkTWV0aG9kQXJndW1lbnRUeXBlTWlzbWF0Y2gsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC5pc1ZhcmFyZ3MoKSwgc2hvd25NZXRob2QucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsICgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKXNob3duTWV0aG9kKS50eXBlQXJndW1lbnRzLCBmYWxzZSksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSB9LAotCQkJCW5ldyBTdHJpbmdbXSB7IAorCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZCwgZmFsc2UpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCQl0eXBlc0FzU3RyaW5nKCgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKXNob3duTWV0aG9kKS50eXBlQXJndW1lbnRzLCBmYWxzZSksCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpIH0sCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC5pc1ZhcmFyZ3MoKSwgc2hvd25NZXRob2QucGFyYW1ldGVycywgdHJ1ZSksIAotCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCAoKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZylzaG93bk1ldGhvZCkudHlwZUFyZ3VtZW50cywgdHJ1ZSksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpIH0sCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCB0cnVlKSwKKwkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJCQl0eXBlc0FzU3RyaW5nKCgoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKXNob3duTWV0aG9kKS50eXBlQXJndW1lbnRzLCB0cnVlKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSB9LAogCQkJCXNldmVyaXR5LAogCQkJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKLQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwkJICAgIAorCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuVHlwZUFyZ3VtZW50c0ZvclJhd0dlbmVyaWNNZXRob2QgOgogCQkJc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY1R5cGVBcmd1bWVudHNGb3JSYXdHZW5lcmljTWV0aG9kKTsKQEAgLTQxMjksMjMgKzQ2NDAsMjMgQEAKIAkJCXNob3duTWV0aG9kID0gcHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2g7CiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5KYXZhZG9jVHlwZUFyZ3VtZW50c0ZvclJhd0dlbmVyaWNNZXRob2QsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2Quc2VsZWN0b3IpLAotCQkJCSAgICAgICAgdHlwZXNBc1N0cmluZyhzaG93bk1ldGhvZC5pc1ZhcmFyZ3MoKSwgc2hvd25NZXRob2QucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkgICAgICAgIG5ldyBTdHJpbmcoc2hvd25NZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpIH0sCi0JCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLCBmYWxzZSksCisJCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSkgfSwKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5zZWxlY3RvciksCi0JCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKHNob3duTWV0aG9kLmlzVmFyYXJncygpLCBzaG93bk1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJICAgICAgICBuZXcgU3RyaW5nKHNob3duTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSkgfSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoc2hvd25NZXRob2QsIHRydWUpLAorCQkJCSAgICAgICAgbmV3IFN0cmluZyhzaG93bk1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSB9LAogCQkJCXNldmVyaXR5LAogCQkJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKLQkJCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOwkJICAgICAgIAorCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiAJCQlyZXR1cm47CiAJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9FcnJvciA6IC8vIDAKIAkJZGVmYXVsdCA6Ci0JCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQluZWVkSW1wbGVtZW50YXRpb24obWVzc2FnZVNlbmQpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoaWQpOwpAQCAtNDE1NSwxMCArNDY2NiwxMCBAQAogCQlpZCwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAorCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpfSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpfSwKIAkJc2V2ZXJpdHksCiAJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKIAkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKQEAgLTQxNzIsMTEgKzQ2ODMsMjIgQEAKIHB1YmxpYyB2b2lkIGphdmFkb2NJbnZhbGlkUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCXRoaXMuaGFuZGxlKElQcm9ibGVtLkphdmFkb2NJbnZhbGlkU2VlUmVmZXJlbmNlLCBOb0FyZ3VtZW50LCBOb0FyZ3VtZW50LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIH0KKy8qKgorICogUmVwb3J0IGFuIGludmFsaWQgcmVmZXJlbmNlIHRoYXQgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgaHJlZiBzeW50YXguCisgKiBWYWxpZCBzeW50YXggZXhhbXBsZTogQHNlZSBJUHJvYmxlbS5KYXZhZG9jSW52YWxpZFNlZUhyZWYKKyAqLworcHVibGljIHZvaWQgamF2YWRvY0ludmFsaWRTZWVIcmVmKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewordGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY0ludmFsaWRTZWVIcmVmLCBOb0FyZ3VtZW50LCBOb0FyZ3VtZW50LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIGphdmFkb2NJbnZhbGlkU2VlUmVmZXJlbmNlQXJncyhpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIAl0aGlzLmhhbmRsZShJUHJvYmxlbS5KYXZhZG9jSW52YWxpZFNlZUFyZ3MsIE5vQXJndW1lbnQsIE5vQXJndW1lbnQsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwogfQorLyoqCisgKiBSZXBvcnQgYSBwcm9ibGVtIG9uIGFuIGludmFsaWQgVVJMIHJlZmVyZW5jZS4KKyAqIFZhbGlkIHN5bnRheCBleGFtcGxlOiBAc2VlIElQcm9ibGVtLkphdmFkb2NJbnZhbGlkU2VlVXJsUmVmZXJlbmNlCisgKi8KIHB1YmxpYyB2b2lkIGphdmFkb2NJbnZhbGlkU2VlVXJsUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotCXRoaXMuaGFuZGxlKElQcm9ibGVtLkphdmFkb2NJbnZhbGlkU2VlSHJlZiwgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY0ludmFsaWRTZWVVcmxSZWZlcmVuY2UsIE5vQXJndW1lbnQsIE5vQXJndW1lbnQsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgamF2YWRvY0ludmFsaWRUYWcoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY0ludmFsaWRUYWcsIE5vQXJndW1lbnQsIE5vQXJndW1lbnQsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwpAQCAtNDIyMiw3ICs0NzQ0LDcgQEAKIAkJCSAgICBicmVhazsKIAkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9FcnJvciA6IC8vIDAKIAkJCWRlZmF1bHQgOgotCQkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCQluZWVkSW1wbGVtZW50YXRpb24obG9jYXRpb24pOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCQlicmVhazsKIAkJfQogCQlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoaWQpOwpAQCAtNDI0NSw2ICs0NzY3LDkgQEAKIH0KIHB1YmxpYyB2b2lkIGphdmFkb2NNaXNzaW5nKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgaW50IG1vZGlmaWVycyl7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLkphdmFkb2NNaXNzaW5nKTsKKwl0aGlzLmphdmFkb2NNaXNzaW5nKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQsIHNldmVyaXR5LCBtb2RpZmllcnMpOworfQorcHVibGljIHZvaWQgamF2YWRvY01pc3NpbmcoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBpbnQgc2V2ZXJpdHksIGludCBtb2RpZmllcnMpewogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlib29sZWFuIG92ZXJyaWRpbmcgPSAobW9kaWZpZXJzICYgKEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSW1wbGVtZW50aW5nfEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjT3ZlcnJpZGluZykpICE9IDA7CiAJYm9vbGVhbiByZXBvcnQgPSAodGhpcy5vcHRpb25zLmdldFNldmVyaXR5KENvbXBpbGVyT3B0aW9ucy5NaXNzaW5nSmF2YWRvY0NvbW1lbnRzKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpCkBAIC00MzEyLDkgKzQ4MzcsMjYgQEAKIAkJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY01pc3NpbmdSZXR1cm5UYWcsIE5vQXJndW1lbnQsIE5vQXJndW1lbnQsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwogCX0KIH0KK3B1YmxpYyB2b2lkIGphdmFkb2NNaXNzaW5nVGFnRGVzY3JpcHRpb24oY2hhcltdIHRva2VuTmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBpbnQgbW9kaWZpZXJzKSB7CisJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLkphdmFkb2NNaXNzaW5nVGFnRGVzY3JpcHRpb24pOworCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKKwlpZiAoamF2YWRvY1Zpc2liaWxpdHkodGhpcy5vcHRpb25zLnJlcG9ydEludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHksIG1vZGlmaWVycykpIHsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0b2tlbk5hbWUpIH07CisJCS8vIHVzZSBJUHJvYmxlbS5KYXZhZG9jRW1wdHlSZXR1cm5UYWcgZm9yIGFsbCBpZGVudGlmaWVkIHRhZ3MKKwkJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY0VtcHR5UmV0dXJuVGFnLCBhcmd1bWVudHMsIGFyZ3VtZW50cywgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJfQorfQorcHVibGljIHZvaWQgamF2YWRvY01pc3NpbmdUYWdEZXNjcmlwdGlvbkFmdGVyUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgaW50IG1vZGlmaWVycyl7CisJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLkphdmFkb2NNaXNzaW5nVGFnRGVzY3JpcHRpb24pOworCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKKwlpZiAoamF2YWRvY1Zpc2liaWxpdHkodGhpcy5vcHRpb25zLnJlcG9ydEludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHksIG1vZGlmaWVycykpIHsKKwkJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY01pc3NpbmdUYWdEZXNjcmlwdGlvbiwgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc2V2ZXJpdHksIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCX0KK30KIHB1YmxpYyB2b2lkIGphdmFkb2NNaXNzaW5nVGhyb3dzQ2xhc3NOYW1lKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgaW50IG1vZGlmaWVycyl7Ci0JaWYgKGphdmFkb2NWaXNpYmlsaXR5KHRoaXMub3B0aW9ucy5yZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5LCBtb2RpZmllcnMpKQorCWlmIChqYXZhZG9jVmlzaWJpbGl0eSh0aGlzLm9wdGlvbnMucmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSwgbW9kaWZpZXJzKSkgewogCQl0aGlzLmhhbmRsZShJUHJvYmxlbS5KYXZhZG9jTWlzc2luZ1Rocm93c0NsYXNzTmFtZSwgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJfQogfQogcHVibGljIHZvaWQgamF2YWRvY01pc3NpbmdUaHJvd3NUYWcoVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBpbnQgbW9kaWZpZXJzKXsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uSmF2YWRvY01pc3NpbmdUaHJvd3NUYWcpOwpAQCAtNDM0NywxNSArNDg4OSwxOSBAQAogCQkJc291cmNlRW5kKTsKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGphdmFkb2NVbmV4cGVjdGVkVGFnKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCXRoaXMuaGFuZGxlKElQcm9ibGVtLkphdmFkb2NVbmV4cGVjdGVkVGFnLCBOb0FyZ3VtZW50LCBOb0FyZ3VtZW50LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIH0KKwogcHVibGljIHZvaWQgamF2YWRvY1VuZXhwZWN0ZWRUZXh0KGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCXRoaXMuaGFuZGxlKElQcm9ibGVtLkphdmFkb2NVbmV4cGVjdGVkVGV4dCwgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiB9CisKIHB1YmxpYyB2b2lkIGphdmFkb2NVbnRlcm1pbmF0ZWRJbmxpbmVUYWcoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5oYW5kbGUoSVByb2JsZW0uSmF2YWRvY1VudGVybWluYXRlZElubGluZVRhZywgTm9Bcmd1bWVudCwgTm9Bcmd1bWVudCwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiB9CisKIHByaXZhdGUgYm9vbGVhbiBqYXZhZG9jVmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSwgaW50IG1vZGlmaWVycykgewogCWlmIChtb2RpZmllcnMgPCAwKSByZXR1cm4gdHJ1ZTsKIAlzd2l0Y2ggKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0spIHsKQEAgLTQzNzAsNiArNDkxNiw3IEBACiAJfQogCXJldHVybiB0cnVlOwogfQorCiBwcml2YXRlIFN0cmluZyBqYXZhZG9jVmlzaWJpbGl0eUFyZ3VtZW50KGludCB2aXNpYmlsaXR5LCBpbnQgbW9kaWZpZXJzKSB7CiAJU3RyaW5nIGFyZ3VtZW50ID0gbnVsbDsKIAlzd2l0Y2ggKG1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0spIHsKQEAgLTQzOTQsMTAgKzQ5NDEsMTEgQEAKIAl9CiAJcmV0dXJuIGFyZ3VtZW50OwogfQorCiBwdWJsaWMgdm9pZCBsb2NhbFZhcmlhYmxlSGlkaW5nKExvY2FsRGVjbGFyYXRpb24gbG9jYWwsIEJpbmRpbmcgaGlkZGVuVmFyaWFibGUsIGJvb2xlYW4gIGlzU3BlY2lhbEFyZ0hpZGluZ0ZpZWxkKSB7CiAJaWYgKGhpZGRlblZhcmlhYmxlIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKLQkJaW50IGlkID0gKGxvY2FsIGluc3RhbmNlb2YgQXJndW1lbnQpIAotCQkJCT8gSVByb2JsZW0uQXJndW1lbnRIaWRpbmdMb2NhbFZhcmlhYmxlIAorCQlpbnQgaWQgPSAobG9jYWwgaW5zdGFuY2VvZiBBcmd1bWVudCkKKwkJCQk/IElQcm9ibGVtLkFyZ3VtZW50SGlkaW5nTG9jYWxWYXJpYWJsZQogCQkJCTogSVByb2JsZW0uTG9jYWxWYXJpYWJsZUhpZGluZ0xvY2FsVmFyaWFibGU7CiAJCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShpZCk7CiAJCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTQ0MjgsNiArNDk3Niw3IEBACiAJCQlsb2NhbC5zb3VyY2VFbmQpOwogCX0KIH0KKwogcHVibGljIHZvaWQgbG9jYWxWYXJpYWJsZU5vbk51bGxDb21wYXJlZFRvTnVsbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgQVNUTm9kZSBsb2NhdGlvbikgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5Ob25OdWxsTG9jYWxWYXJpYWJsZUNvbXBhcmlzb25ZaWVsZHNGYWxzZSk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtNDQ0MCw2ICs0OTg5LDcgQEAKIAkJbm9kZVNvdXJjZVN0YXJ0KGxvY2FsLCBsb2NhdGlvbiksCiAJCW5vZGVTb3VyY2VFbmQobG9jYWwsIGxvY2F0aW9uKSk7CiB9CisKIHB1YmxpYyB2b2lkIGxvY2FsVmFyaWFibGVOdWxsQ29tcGFyZWRUb05vbk51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFTVE5vZGUgbG9jYXRpb24pIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uTnVsbExvY2FsVmFyaWFibGVDb21wYXJpc29uWWllbGRzRmFsc2UpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTQ0NTIsNiArNTAwMiw3IEBACiAJCW5vZGVTb3VyY2VTdGFydChsb2NhbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGxvY2FsLCBsb2NhdGlvbikpOwogfQorCiBwdWJsaWMgdm9pZCBsb2NhbFZhcmlhYmxlTnVsbEluc3RhbmNlb2YoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFTVE5vZGUgbG9jYXRpb24pIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uTnVsbExvY2FsVmFyaWFibGVJbnN0YW5jZW9mWWllbGRzRmFsc2UpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTQ0NjQsNiArNTAxNSw3IEBACiAJCW5vZGVTb3VyY2VTdGFydChsb2NhbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGxvY2FsLCBsb2NhdGlvbikpOwogfQorCiBwdWJsaWMgdm9pZCBsb2NhbFZhcmlhYmxlTnVsbFJlZmVyZW5jZShMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgQVNUTm9kZSBsb2NhdGlvbikgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5OdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtNDQ3Niw2ICs1MDI4LDcgQEAKIAkJbm9kZVNvdXJjZVN0YXJ0KGxvY2FsLCBsb2NhdGlvbiksCiAJCW5vZGVTb3VyY2VFbmQobG9jYWwsIGxvY2F0aW9uKSk7CiB9CisKIHB1YmxpYyB2b2lkIGxvY2FsVmFyaWFibGVQb3RlbnRpYWxOdWxsUmVmZXJlbmNlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBBU1ROb2RlIGxvY2F0aW9uKSB7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlBvdGVudGlhbE51bGxMb2NhbFZhcmlhYmxlUmVmZXJlbmNlKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CkBAIC00NDg4LDYgKzUwNDEsNyBAQAogCQlub2RlU291cmNlU3RhcnQobG9jYWwsIGxvY2F0aW9uKSwKIAkJbm9kZVNvdXJjZUVuZChsb2NhbCwgbG9jYXRpb24pKTsKIH0KKwogcHVibGljIHZvaWQgbG9jYWxWYXJpYWJsZVJlZHVuZGFudENoZWNrT25Ob25OdWxsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBBU1ROb2RlIGxvY2F0aW9uKSB7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlJlZHVuZGFudE51bGxDaGVja09uTm9uTnVsbExvY2FsVmFyaWFibGUpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTQ1MDAsNiArNTA1NCw3IEBACiAJCW5vZGVTb3VyY2VTdGFydChsb2NhbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGxvY2FsLCBsb2NhdGlvbikpOwogfQorCiBwdWJsaWMgdm9pZCBsb2NhbFZhcmlhYmxlUmVkdW5kYW50Q2hlY2tPbk51bGwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFTVE5vZGUgbG9jYXRpb24pIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uUmVkdW5kYW50TnVsbENoZWNrT25OdWxsTG9jYWxWYXJpYWJsZSk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtNDUxMiw3ICs1MDY3LDEwIEBACiAJCW5vZGVTb3VyY2VTdGFydChsb2NhbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGxvY2FsLCBsb2NhdGlvbikpOwogfQorCiBwdWJsaWMgdm9pZCBsb2NhbFZhcmlhYmxlUmVkdW5kYW50TnVsbEFzc2lnbm1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFTVE5vZGUgbG9jYXRpb24pIHsKKwlpZiAoKGxvY2F0aW9uLmJpdHMgJiBBU1ROb2RlLkZpcnN0QXNzaWdubWVudFRvTG9jYWwpICE9IDApIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzgzMDMgLSBXYXJuaW5nIGFib3V0IFJlZHVuZGFudCBhc3NpZ25tZW50IGNvbmZsaWN0cyB3aXRoIGRlZmluaXRlIGFzc2lnbm1lbnQKKwkJcmV0dXJuOwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5SZWR1bmRhbnRMb2NhbFZhcmlhYmxlTnVsbEFzc2lnbm1lbnQpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWwubmFtZSkgIH07CkBAIC00NTI0LDM1ICs1MDgyLDM5IEBACiAJCW5vZGVTb3VyY2VTdGFydChsb2NhbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKGxvY2FsLCBsb2NhdGlvbikpOwogfQotcHVibGljIHZvaWQgbWV0aG9kTXVzdE92ZXJyaWRlKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisKK3B1YmxpYyB2b2lkIG1ldGhvZE11c3RPdmVycmlkZShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgbG9uZyBjb21wbGlhbmNlTGV2ZWwpIHsKIAlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2QuYmluZGluZzsKIAl0aGlzLmhhbmRsZSgKLQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID09IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgPyBJUHJvYmxlbS5NZXRob2RNdXN0T3ZlcnJpZGUgOiBJUHJvYmxlbS5NZXRob2RNdXN0T3ZlcnJpZGVPckltcGxlbWVudCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcuc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKGJpbmRpbmcuaXNWYXJhcmdzKCksIGJpbmRpbmcucGFyYW1ldGVycywgZmFsc2UpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCB9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZy5pc1ZhcmFyZ3MoKSwgYmluZGluZy5wYXJhbWV0ZXJzLCB0cnVlKSwgbmV3IFN0cmluZyhiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLH0sCisJCWNvbXBsaWFuY2VMZXZlbCA9PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ID8gSVByb2JsZW0uTWV0aG9kTXVzdE92ZXJyaWRlIDogSVByb2JsZW0uTWV0aG9kTXVzdE92ZXJyaWRlT3JJbXBsZW1lbnQsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhiaW5kaW5nLCBmYWxzZSksIG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIH0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhiaW5kaW5nLCB0cnVlKSwgbmV3IFN0cmluZyhiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLH0sCiAJCW1ldGhvZC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kLnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBtZXRob2ROYW1lQ2xhc2goTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgeworCitwdWJsaWMgdm9pZCBtZXRob2ROYW1lQ2xhc2goTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCwgaW50IHNldmVyaXR5KSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk1ldGhvZE5hbWVDbGFzaCwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoY3VycmVudE1ldGhvZC5zZWxlY3RvciksCi0JCQl0eXBlc0FzU3RyaW5nKGN1cnJlbnRNZXRob2QuaXNWYXJhcmdzKCksIGN1cnJlbnRNZXRob2QucGFyYW1ldGVycywgZmFsc2UpLAorCQkJdHlwZXNBc1N0cmluZyhjdXJyZW50TWV0aG9kLCBmYWxzZSksCiAJCQluZXcgU3RyaW5nKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QuaXNWYXJhcmdzKCksIGluaGVyaXRlZE1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZCwgZmFsc2UpLAogCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkgfSwgCisJCSB9LAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhjdXJyZW50TWV0aG9kLnNlbGVjdG9yKSwKLQkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZC5pc1ZhcmFyZ3MoKSwgY3VycmVudE1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZCwgdHJ1ZSksCiAJCQluZXcgU3RyaW5nKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQl0eXBlc0FzU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5pc1ZhcmFyZ3MoKSwgaW5oZXJpdGVkTWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJdHlwZXNBc1N0cmluZyhpbmhlcml0ZWRNZXRob2QsIHRydWUpLAogCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCSB9LCAKKwkJIH0sCisJCXNldmVyaXR5LAogCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCiAJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQorCiBwdWJsaWMgdm9pZCBtZXRob2ROZWVkQm9keShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTWV0aG9kUmVxdWlyZXNCb2R5LApAQCAtNDU2MSw2ICs1MTIzLDcgQEAKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQorCiBwdWJsaWMgdm9pZCBtZXRob2ROZWVkaW5nTm9Cb2R5KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKIAl0aGlzLmhhbmRsZSgKIAkJKChtZXRob2REZWNsLm1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NOYXRpdmUpICE9IDApID8gSVByb2JsZW0uQm9keUZvck5hdGl2ZU1ldGhvZCA6IElQcm9ibGVtLkJvZHlGb3JBYnN0cmFjdE1ldGhvZCwKQEAgLTQ1NjgsNyArNTEzMSw3IEBACiAJCU5vQXJndW1lbnQsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKLX0JCit9CiAKIHB1YmxpYyB2b2lkIG1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewogCXRoaXMuaGFuZGxlKApAQCAtNDU3OCw2ICs1MTQxLDQ5IEBACiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KKworcHVibGljIHZvaWQgbWV0aG9kQ2FuQmVEZWNsYXJlZFN0YXRpYyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLk1ldGhvZENhbkJlU3RhdGljKTsKKwlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CisJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2REZWNsLmJpbmRpbmc7CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5NZXRob2RDYW5CZVN0YXRpYywKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSkKKwkJIH0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKQorCQkgfSwKKwkJc2V2ZXJpdHksCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KKworcHVibGljIHZvaWQgbWV0aG9kQ2FuQmVQb3RlbnRpYWxseURlY2xhcmVkU3RhdGljKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYyk7CisJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOworCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kRGVjbC5iaW5kaW5nOworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uTWV0aG9kQ2FuQmVQb3RlbnRpYWxseVN0YXRpYywKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSkKKwkJIH0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKQorCQkgfSwKKwkJc2V2ZXJpdHksCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KKwogcHVibGljIHZvaWQgbWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uRm9yRmllbGQoRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5GaWVsZE1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbik7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtNDU5MCwxOCArNTE5NiwyMCBAQAogCQlub2RlU291cmNlU3RhcnQoYmluZGluZywgZmllbGQpLAogCQlub2RlU291cmNlRW5kKGJpbmRpbmcsIGZpZWxkKSk7CiB9CisKIHB1YmxpYyB2b2lkIG1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbkZvck1ldGhvZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5NZXRob2RNaXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24pOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2QuYmluZGluZzsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTWV0aG9kTWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZy5pc1ZhcmFyZ3MoKSwgYmluZGluZy5wYXJhbWV0ZXJzLCBmYWxzZSksIG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIH0sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhiaW5kaW5nLmlzVmFyYXJncygpLCBiaW5kaW5nLnBhcmFtZXRlcnMsIHRydWUpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcuc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKGJpbmRpbmcsIGZhbHNlKSwgbmV3IFN0cmluZyhiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcuc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKGJpbmRpbmcsIHRydWUpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksfSwKIAkJc2V2ZXJpdHksCiAJCW1ldGhvZC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kLnNvdXJjZUVuZCk7CiB9CisKIHB1YmxpYyB2b2lkIG1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbkZvclR5cGUoVHlwZURlY2xhcmF0aW9uIHR5cGUpIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVHlwZU1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbik7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwpAQCAtNDYyOCw4ICs1MjM2LDIwIEBACiAJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gbWV0aG9kLmJpbmRpbmc7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk1pc3NpbmdPdmVycmlkZUFubm90YXRpb24sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhiaW5kaW5nLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhiaW5kaW5nLmlzVmFyYXJncygpLCBiaW5kaW5nLnBhcmFtZXRlcnMsIGZhbHNlKSwgbmV3IFN0cmluZyhiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgfSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcuc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKGJpbmRpbmcuaXNWYXJhcmdzKCksIGJpbmRpbmcucGFyYW1ldGVycywgdHJ1ZSksIG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSx9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZywgZmFsc2UpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCB9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZywgdHJ1ZSksIG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSx9LAorCQlzZXZlcml0eSwKKwkJbWV0aG9kLnNvdXJjZVN0YXJ0LAorCQltZXRob2Quc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG1pc3NpbmdPdmVycmlkZUFubm90YXRpb25Gb3JJbnRlcmZhY2VNZXRob2RJbXBsZW1lbnRhdGlvbihBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5NaXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24pOworCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKKwlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2QuYmluZGluZzsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZywgZmFsc2UpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCB9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcoYmluZGluZywgdHJ1ZSksIG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSx9LAogCQlzZXZlcml0eSwKIAkJbWV0aG9kLnNvdXJjZVN0YXJ0LAogCQltZXRob2Quc291cmNlRW5kKTsKQEAgLTQ2NTAsNyArNTI3MCw2IEBACiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KLQogcHVibGljIHZvaWQgbWlzc2luZ1NlcmlhbFZlcnNpb24oVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKQEAgLTQ2NjAsNiArNTI3OSw3OCBAQAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kKTsKIH0KK3B1YmxpYyB2b2lkIG1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZChNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5NaXNzaW5nU3luY2hyb25pemVkTW9kaWZpZXJJbkluaGVyaXRlZE1ldGhvZCwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCW5ldyBTdHJpbmcoY3VycmVudE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCW5ldyBTdHJpbmcoY3VycmVudE1ldGhvZC5zZWxlY3RvciksCisJCQkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZCwgZmFsc2UpLAorCQkJfSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCW5ldyBTdHJpbmcoY3VycmVudE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyhjdXJyZW50TWV0aG9kLnNlbGVjdG9yKSwKKwkJCQkJdHlwZXNBc1N0cmluZyhjdXJyZW50TWV0aG9kLCB0cnVlKSwKKwkJCX0sCisJCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCisJCQljdXJyZW50TWV0aG9kLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIG1pc3NpbmdUeXBlSW5Db25zdHJ1Y3RvcihBU1ROb2RlIGxvY2F0aW9uLCBNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yKSB7CisJTGlzdCBtaXNzaW5nVHlwZXMgPSBjb25zdHJ1Y3Rvci5jb2xsZWN0TWlzc2luZ1R5cGVzKG51bGwpOworCWlmIChtaXNzaW5nVHlwZXMgPT0gbnVsbCkgeworCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBjb25zdHJ1Y3RvciAiICsgY29uc3RydWN0b3IgKyAiIGlzIHdyb25nbHkgdGFnZ2VkIGFzIGNvbnRhaW5pbmcgbWlzc2luZyB0eXBlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmV0dXJuOworCX0KKwlUeXBlQmluZGluZyBtaXNzaW5nVHlwZSA9IChUeXBlQmluZGluZykgbWlzc2luZ1R5cGVzLmdldCgwKTsKKwlpbnQgc3RhcnQgPSBsb2NhdGlvbi5zb3VyY2VTdGFydDsKKwlpbnQgZW5kID0gbG9jYXRpb24uc291cmNlRW5kOworCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHF1YWxpZmllZEFsbG9jYXRpb24gPSAoUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGxvY2F0aW9uOworCQlpZiAocXVhbGlmaWVkQWxsb2NhdGlvbi5hbm9ueW1vdXNUeXBlICE9IG51bGwpIHsKKwkJCXN0YXJ0ID0gcXVhbGlmaWVkQWxsb2NhdGlvbi5hbm9ueW1vdXNUeXBlLnNvdXJjZVN0YXJ0OworCQkJZW5kID0gcXVhbGlmaWVkQWxsb2NhdGlvbi5hbm9ueW1vdXNUeXBlLnNvdXJjZUVuZDsKKwkJfQorCX0KKwl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLk1pc3NpbmdUeXBlSW5Db25zdHJ1Y3RvciwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkgICAgICAgIG5ldyBTdHJpbmcoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKGNvbnN0cnVjdG9yLCBmYWxzZSksCisJCQkgICAgICAgCW5ldyBTdHJpbmcobWlzc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkgICAgICAgIG5ldyBTdHJpbmcoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkgICAgICAgIHR5cGVzQXNTdHJpbmcoY29uc3RydWN0b3IsIHRydWUpLAorCQkJICAgICAgIAluZXcgU3RyaW5nKG1pc3NpbmdUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJfSwKKwkJCXN0YXJ0LAorCQkJZW5kKTsKK30KKworcHVibGljIHZvaWQgbWlzc2luZ1R5cGVJbk1ldGhvZChNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwlMaXN0IG1pc3NpbmdUeXBlcyA9IG1ldGhvZC5jb2xsZWN0TWlzc2luZ1R5cGVzKG51bGwpOworCWlmIChtaXNzaW5nVHlwZXMgPT0gbnVsbCkgeworCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBtZXRob2QgIiArIG1ldGhvZCArICIgaXMgd3JvbmdseSB0YWdnZWQgYXMgY29udGFpbmluZyBtaXNzaW5nIHR5cGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlyZXR1cm47CisJfQorCVR5cGVCaW5kaW5nIG1pc3NpbmdUeXBlID0gKFR5cGVCaW5kaW5nKSBtaXNzaW5nVHlwZXMuZ2V0KDApOworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uTWlzc2luZ1R5cGVJbk1ldGhvZCwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkgICAgICAgIG5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAorCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpLAorCQkJICAgICAgIAluZXcgU3RyaW5nKG1pc3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKSwKKwkJCX0sCisJCQluZXcgU3RyaW5nW10geworCQkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAorCQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSksCisJCQkgICAgICAgCW5ldyBTdHJpbmcobWlzc2luZ1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQl9LAorCQkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAorCQkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKK30KIHB1YmxpYyB2b2lkIG1pc3NpbmdWYWx1ZUZvckFubm90YXRpb25NZW1iZXIoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBjaGFyW10gbWVtYmVyTmFtZSkgewogCVN0cmluZyBtZW1iZXJTdHJpbmcgPSBuZXcgU3RyaW5nKG1lbWJlck5hbWUpOwogCXRoaXMuaGFuZGxlKApAQCAtNDY3NywyMCArNTM2OCwxMSBAQAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBtdXN0U3BlY2lmeVBhY2thZ2UoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsKSB7Ci0JU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKX07Ci0JdGhpcy5oYW5kbGUoCi0JCUlQcm9ibGVtLk11c3RTcGVjaWZ5UGFja2FnZSwKLQkJYXJndW1lbnRzLAotCQlhcmd1bWVudHMsCi0JCWNvbXBVbml0RGVjbC5zb3VyY2VTdGFydCwKLQkJY29tcFVuaXREZWNsLnNvdXJjZVN0YXJ0ICsgMSk7CQotfQogcHVibGljIHZvaWQgbXVzdFVzZUFTdGF0aWNNZXRob2QoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlN0YXRpY01ldGhvZFJlcXVlc3RlZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSl9LAogCQltZXNzYWdlU2VuZC5zb3VyY2VTdGFydCwKIAkJbWVzc2FnZVNlbmQuc291cmNlRW5kKTsKIH0KQEAgLTQ3MDMsMTIgKzUzODUsMTIgQEAKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgbmVlZEltcGxlbWVudGF0aW9uKCkgewotCXRoaXMuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoTWVzc2FnZXMuYWJvcnRfbWlzc2luZ0NvZGUpOyAKK3B1YmxpYyB2b2lkIG5lZWRJbXBsZW1lbnRhdGlvbihBU1ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihNZXNzYWdlcy5hYm9ydF9taXNzaW5nQ29kZSwgbG9jYXRpb24pOwogfQogCiBwdWJsaWMgdm9pZCBuZWVkVG9FbXVsYXRlRmllbGRBY2Nlc3MoRmllbGRCaW5kaW5nIGZpZWxkLCBBU1ROb2RlIGxvY2F0aW9uLCBib29sZWFuIGlzUmVhZEFjY2VzcykgewotCWludCBpZCA9IGlzUmVhZEFjY2VzcyAKKwlpbnQgaWQgPSBpc1JlYWRBY2Nlc3MKIAkJCT8gSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcwogCQkJOiBJUHJvYmxlbS5OZWVkVG9FbXVsYXRlRmllbGRXcml0ZUFjY2VzczsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoaWQpOwpAQCAtNDcyMiw3ICs1NDA0LDcgQEAKIAkJbm9kZVNvdXJjZUVuZChmaWVsZCwgbG9jYXRpb24pKTsKIH0KIHB1YmxpYyB2b2lkIG5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoCi0JTWV0aG9kQmluZGluZyBtZXRob2QsIAorCU1ldGhvZEJpbmRpbmcgbWV0aG9kLAogCUFTVE5vZGUgbG9jYXRpb24pIHsKIAogCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7CkBAIC00NzMxLDM3ICs1NDEzLDM3IEBACiAJCWlmIChtZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpCiAJCQlyZXR1cm47IC8vIHRvbGVyYXRlIGVtdWxhdGlvbiBmb3IgZW51bSBjb25zdHJ1Y3RvcnMsIHdoaWNoIGNhbiBvbmx5IGJlIG1hZGUgcHJpdmF0ZQogCQl0aGlzLmhhbmRsZSgKLQkJCUlQcm9ibGVtLk5lZWRUb0VtdWxhdGVDb25zdHJ1Y3RvckFjY2VzcywgCisJCQlJUHJvYmxlbS5OZWVkVG9FbXVsYXRlQ29uc3RydWN0b3JBY2Nlc3MsCiAJCQluZXcgU3RyaW5nW10gewotCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSkKLQkJCSB9LCAKKwkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKQorCQkJIH0sCiAJCQluZXcgU3RyaW5nW10gewotCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpCi0JCQkgfSwgCisJCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpCisJCQkgfSwKIAkJCXNldmVyaXR5LAotCQkJbG9jYXRpb24uc291cmNlU3RhcnQsIAotCQkJbG9jYXRpb24uc291cmNlRW5kKTsgCisJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiAJCXJldHVybjsKIAl9CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLk5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uTmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcywgCisJCUlQcm9ibGVtLk5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MsCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCAKLQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpCi0JCSB9LCAKKwkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSkKKwkJIH0sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIAotCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKQotCQkgfSwgCisJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKQorCQkgfSwKIAkJIHNldmVyaXR5LAotCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwgCi0JCWxvY2F0aW9uLnNvdXJjZUVuZCk7IAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIG5vQWRkaXRpb25hbEJvdW5kQWZ0ZXJUeXBlVmFyaWFibGUoVHlwZVJlZmVyZW5jZSBib3VuZFJlZmVyZW5jZSkgewogCXRoaXMuaGFuZGxlKApAQCAtNDc4MCwxNCArNTQ2MiwzMCBAQAogCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKIAkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbm9kZTsKIAkJaWYgKHJlZi5iaW5kaW5nID09IGZpZWxkKSB7Ci0JCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZy0xXSk7CisJCQlpZiAoaW5kZXggPT0gMCkgeworCQkJCXJldHVybiAoaW50KSAocmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nLTFdKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGxlbmd0aCA9IHJlZi5zb3VyY2VQb3NpdGlvbnMubGVuZ3RoOworCQkJCWlmIChpbmRleCA8IGxlbmd0aCkgeworCQkJCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbaW5kZXhdKTsKKwkJCQl9CisJCQkJcmV0dXJuIChpbnQpIChyZWYuc291cmNlUG9zaXRpb25zWzBdKTsKKwkJCX0KIAkJfQogCQlGaWVsZEJpbmRpbmdbXSBvdGhlckZpZWxkcyA9IHJlZi5vdGhlckJpbmRpbmdzOwogCQlpZiAob3RoZXJGaWVsZHMgIT0gbnVsbCkgewogCQkJaW50IG9mZnNldCA9IHJlZi5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmc7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3RoZXJGaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3RoZXJGaWVsZHNbaV0gPT0gZmllbGQpCi0JCQkJCXJldHVybiAoaW50KSAocmVmLnNvdXJjZVBvc2l0aW9uc1tpICsgb2Zmc2V0XSk7CisJCQlpZiAoaW5kZXggIT0gMCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvdGhlckZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlpZiAoKG90aGVyRmllbGRzW2ldID09IGZpZWxkKSAmJiAoaSArIG9mZnNldCA9PSBpbmRleCkpIHsKKwkJCQkJCXJldHVybiAoaW50KSAocmVmLnNvdXJjZVBvc2l0aW9uc1tpICsgb2Zmc2V0XSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvdGhlckZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlpZiAob3RoZXJGaWVsZHNbaV0gPT0gZmllbGQpCisJCQkJCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbaSArIG9mZnNldF0pOworCQkJCX0KIAkJCX0KIAkJfQogCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CkBAIC00Nzk2LDI3ICs1NDk0LDUyIEBACiAJCQlyZXR1cm4gKGludCkgcmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uc1tpbmRleF07CiAJCX0KIAl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKLQkJQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IChBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIG5vZGU7Ci0JCWludCBsZW5ndGggPSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zLmxlbmd0aDsKLQkJcmV0dXJuIChpbnQpIGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnNbbGVuZ3RoIC0gMV07CisJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBub2RlOworCQlpbnQgbGVuZ3RoID0gcmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9ucy5sZW5ndGg7CisJCWlmIChpbmRleCA8IGxlbmd0aCkgeworCQkJcmV0dXJuIChpbnQpIHJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnNbaW5kZXhdOworCQl9CisJCXJldHVybiAoaW50KSByZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zW2xlbmd0aCAtIDFdOworCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgbm9kZTsKKwkJaW50IGxlbmd0aCA9IHJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnMubGVuZ3RoOworCQlpZiAoaW5kZXggPCBsZW5ndGgpIHsKKwkJCXJldHVybiAoaW50KSByZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zW2luZGV4XTsKKwkJfQogCX0KIAlyZXR1cm4gbm9kZS5zb3VyY2VFbmQ7CiB9CiBwcml2YXRlIGludCBub2RlU291cmNlU3RhcnQoQmluZGluZyBmaWVsZCwgQVNUTm9kZSBub2RlKSB7CisJcmV0dXJuIG5vZGVTb3VyY2VTdGFydChmaWVsZCwgbm9kZSwgMCk7Cit9Citwcml2YXRlIGludCBub2RlU291cmNlU3RhcnQoQmluZGluZyBmaWVsZCwgQVNUTm9kZSBub2RlLCBpbnQgaW5kZXgpIHsKIAlpZiAobm9kZSBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7CiAJCUZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlID0gKEZpZWxkUmVmZXJlbmNlKSBub2RlOwogCQlyZXR1cm4gKGludCkgKGZpZWxkUmVmZXJlbmNlLm5hbWVTb3VyY2VQb3NpdGlvbiA+PiAzMik7CiAJfSBlbHNlIAlpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKIAkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbm9kZTsKIAkJaWYgKHJlZi5iaW5kaW5nID09IGZpZWxkKSB7Ci0JCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbcmVmLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZy0xXSA+PiAzMik7CisJCQlpZiAoaW5kZXggPT0gMCkgeworCQkJCXJldHVybiAoaW50KSAocmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nLTFdID4+IDMyKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIChpbnQpIChyZWYuc291cmNlUG9zaXRpb25zW2luZGV4XSA+PiAzMik7CisJCQl9CiAJCX0KIAkJRmllbGRCaW5kaW5nW10gb3RoZXJGaWVsZHMgPSByZWYub3RoZXJCaW5kaW5nczsKIAkJaWYgKG90aGVyRmllbGRzICE9IG51bGwpIHsKIAkJCWludCBvZmZzZXQgPSByZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG90aGVyRmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG90aGVyRmllbGRzW2ldID09IGZpZWxkKQotCQkJCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbaSArIG9mZnNldF0gPj4gMzIpOworCQkJaWYgKGluZGV4ICE9IDApIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3RoZXJGaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKChvdGhlckZpZWxkc1tpXSA9PSBmaWVsZCkgJiYgKGkgKyBvZmZzZXQgPT0gaW5kZXgpKSB7CisJCQkJCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbaSArIG9mZnNldF0gPj4gMzIpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3RoZXJGaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKG90aGVyRmllbGRzW2ldID09IGZpZWxkKSB7CisJCQkJCQlyZXR1cm4gKGludCkgKHJlZi5zb3VyY2VQb3NpdGlvbnNbaSArIG9mZnNldF0gPj4gMzIpOworCQkJCQl9CisJCQkJfQogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKQEAgLTQ4NzUsMTUgKzU1OTgsMTMgQEAKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBub25HZW5lcmljVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZChBU1ROb2RlIGxvY2F0aW9uLCBUeXBlQmluZGluZyB0eXBlLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKLQl0aGlzLm5vbkdlbmVyaWNUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkKDAsIGxvY2F0aW9uLCB0eXBlLCBhcmd1bWVudFR5cGVzKTsKLX0KKwogcHVibGljIHZvaWQgbm9uR2VuZXJpY1R5cGVDYW5ub3RCZVBhcmFtZXRlcml6ZWQoaW50IGluZGV4LCBBU1ROb2RlIGxvY2F0aW9uLCBUeXBlQmluZGluZyB0eXBlLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKIAlpZiAobG9jYXRpb24gPT0gbnVsbCkgeyAvLyBiaW5hcnkgY2FzZQogCSAgICB0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLk5vbkdlbmVyaWNUeXBlLAotCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudFR5cGVzLCBmYWxzZSl9LAotCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoZmFsc2UsIGFyZ3VtZW50VHlwZXMsIHRydWUpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhhcmd1bWVudFR5cGVzLCBmYWxzZSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAogCQkJUHJvYmxlbVNldmVyaXRpZXMuQWJvcnRDb21waWxhdGlvbiB8IFByb2JsZW1TZXZlcml0aWVzLkVycm9yIHwgUHJvYmxlbVNldmVyaXRpZXMuRmF0YWwsCiAJCQkwLAogCQkJMCk7CkBAIC00ODkxLDEyICs1NjEyLDE1IEBACiAJfQogICAgIHRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Ob25HZW5lcmljVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudFR5cGVzLCBmYWxzZSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgZmFsc2UpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAogCQlub2RlU291cmNlU3RhcnQobnVsbCwgbG9jYXRpb24pLAogCQlub2RlU291cmNlRW5kKG51bGwsIGxvY2F0aW9uLCBpbmRleCkpOwogfQogcHVibGljIHZvaWQgbm9uU3RhdGljQWNjZXNzVG9TdGF0aWNGaWVsZChBU1ROb2RlIGxvY2F0aW9uLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlub25TdGF0aWNBY2Nlc3NUb1N0YXRpY0ZpZWxkKGxvY2F0aW9uLCBmaWVsZCwgLTEpOworfQorcHVibGljIHZvaWQgbm9uU3RhdGljQWNjZXNzVG9TdGF0aWNGaWVsZChBU1ROb2RlIGxvY2F0aW9uLCBGaWVsZEJpbmRpbmcgZmllbGQsIGludCBpbmRleCkgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5Ob25TdGF0aWNBY2Nlc3NUb1N0YXRpY0ZpZWxkKTsKIAlpZiAoc2V2ZXJpdHkgPT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSByZXR1cm47CiAJdGhpcy5oYW5kbGUoCkBAIC00OTA0LDE0ICs1NjI4LDE0IEBACiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQubmFtZSl9LAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQubmFtZSl9LAogCQlzZXZlcml0eSwKLQkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLCBsb2NhdGlvbiksCi0JCW5vZGVTb3VyY2VFbmQoZmllbGQsIGxvY2F0aW9uKSk7CisJCW5vZGVTb3VyY2VTdGFydChmaWVsZCwgbG9jYXRpb24sIGluZGV4KSwKKwkJbm9kZVNvdXJjZUVuZChmaWVsZCwgbG9jYXRpb24sIGluZGV4KSk7CiB9CiBwdWJsaWMgdm9pZCBub25TdGF0aWNBY2Nlc3NUb1N0YXRpY01ldGhvZChBU1ROb2RlIGxvY2F0aW9uLCBNZXRob2RCaW5kaW5nIG1ldGhvZCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Ob25TdGF0aWNBY2Nlc3NUb1N0YXRpY01ldGhvZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KQEAgLTQ5MzUsOSArNTY1OSw5IEBACiAJCQkJJiYgKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbG9jYXRpb24pLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcikgewogCQkvLzIwID0gTm8gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IGlzIGFjY2Vzc2libGUgdG8gaW52b2tlIHRoZSBzdXBlciBjb25zdHJ1Y3Rvci4gTXVzdCBkZWZpbmUgYSBjb25zdHJ1Y3RvciBhbmQgZXhwbGljaXRseSBxdWFsaWZ5IGl0cyBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHdpdGggYW4gaW5zdGFuY2Ugb2YgezB9IChlLmcuIHguc3VwZXIoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCiAJCWlkID0gSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlRm9yQ29uc3RydWN0b3JDYWxsOwotCX0gZWxzZSBpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbiAKKwl9IGVsc2UgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24KIAkJCQkmJiAoKChBbGxvY2F0aW9uRXhwcmVzc2lvbikgbG9jYXRpb24pLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNNZW1iZXJUeXBlKCkKLQkJCQkJfHwgKCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGxvY2F0aW9uKS5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzQW5vbnltb3VzVHlwZSgpIAorCQkJCQl8fCAoKChBbGxvY2F0aW9uRXhwcmVzc2lvbikgbG9jYXRpb24pLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkKIAkJCQkJCSYmICgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGxvY2F0aW9uKS5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKS5pc01lbWJlclR5cGUoKSkpKSB7CiAJCS8vMjEgPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZS4gTXVzdCBxdWFsaWZ5IHRoZSBhbGxvY2F0aW9uIHdpdGggYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IChlLmcuIHgubmV3IEEoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCiAJCWlkID0gSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlOwpAQCAtNDk0OCwxMCArNTY3MiwxMCBAQAogCiAJdGhpcy5oYW5kbGUoCiAJCWlkLAotCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKHRhcmdldFR5cGUucmVhZGFibGVOYW1lKCkpfSwgCi0JCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcodGFyZ2V0VHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sIAotCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwgCi0JCWxvY2F0aW9uLnNvdXJjZUVuZCk7IAorCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKHRhcmdldFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0YXJnZXRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBub3RDb21wYXRpYmxlVHlwZXNFcnJvcihFcXVhbEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgewogCVN0cmluZyBsZWZ0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpOwpAQCAtNTE0OCw3ICs1ODcyLDcgQEAKIAl9CiAJcmV0dXJuIG5hbWVCdWZmZXIudG9TdHJpbmcoKTsKIH0KLXB1YmxpYyB2b2lkIHBhcmFtZXRlcml6ZWRNZW1iZXJUeXBlTWlzc2luZ0FyZ3VtZW50cyhBU1ROb2RlIGxvY2F0aW9uLCBUeXBlQmluZGluZyB0eXBlKSB7CitwdWJsaWMgdm9pZCBwYXJhbWV0ZXJpemVkTWVtYmVyVHlwZU1pc3NpbmdBcmd1bWVudHMoQVNUTm9kZSBsb2NhdGlvbiwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IGluZGV4KSB7CiAJaWYgKGxvY2F0aW9uID09IG51bGwpIHsgLy8gYmluYXJ5IGNhc2UKIAkgICAgdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5NaXNzaW5nQXJndW1lbnRzRm9yUGFyYW1ldGVyaXplZE1lbWJlclR5cGUsCkBAIC01MTY0LDE2ICs1ODg4LDE2IEBACiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKX0sCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisJCW5vZGVTb3VyY2VFbmQobnVsbCwgbG9jYXRpb24sIGluZGV4KSk7CiB9CiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yKAotCWludCBzdGFydFBvc2l0aW9uLCAKLQlpbnQgZW5kUG9zaXRpb24sIAorCWludCBzdGFydFBvc2l0aW9uLAorCWludCBlbmRQb3NpdGlvbiwKIAlpbnQgY3VycmVudFRva2VuLAotCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UsIAotCVN0cmluZyBlcnJvclRva2VuTmFtZSwgCisJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSwKKwlTdHJpbmcgZXJyb3JUb2tlbk5hbWUsCiAJU3RyaW5nW10gcG9zc2libGVUb2tlbnMpIHsKLQkJCisKIAlpZiAocG9zc2libGVUb2tlbnMubGVuZ3RoID09IDApIHsgLy9ubyBzdWdnZXN0aW9uIGF2YWlsYWJsZQogCQlpZiAoaXNLZXl3b3JkKGN1cnJlbnRUb2tlbikpIHsKIAkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjdXJyZW50VG9rZW5Tb3VyY2UpfTsKQEAgLTUyMTksNyArNTk0Myw3IEBACiAJCQllbmRQb3NpdGlvbik7CiAJCXJldHVybjsKIAl9Ci0JLy9leHRyYWN0IHRoZSBsaXRlcmFsIHdoZW4gaXQncyBhIGxpdGVyYWwgIAorCS8vZXh0cmFjdCB0aGUgbGl0ZXJhbCB3aGVuIGl0J3MgYSBsaXRlcmFsCiAJaWYgKGlzTGl0ZXJhbChjdXJyZW50VG9rZW4pIHx8CiAJCWlzSWRlbnRpZmllcihjdXJyZW50VG9rZW4pKSB7CiAJCQllcnJvclRva2VuTmFtZSA9IG5ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKTsKQEAgLTUyNDAsMTQgKzU5NjQsMTQgQEAKIAlpbnQgY3VycmVudEtpbmQsCiAJY2hhcltdIGVycm9yVG9rZW5Tb3VyY2UsCiAJU3RyaW5nIGVycm9yVG9rZW5OYW1lKXsKLQl0aGlzLnN5bnRheEVycm9yKAorCXN5bnRheEVycm9yKAogCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3JEZWxldGVUb2tlbiwKLQkJc3RhcnQsIAotCQllbmQsIAorCQlzdGFydCwKKwkJZW5kLAogCQljdXJyZW50S2luZCwKLQkJZXJyb3JUb2tlblNvdXJjZSwgCisJCWVycm9yVG9rZW5Tb3VyY2UsCiAJCWVycm9yVG9rZW5OYW1lLAotCQludWxsKTsgCisJCW51bGwpOwogfQogCiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yRGVsZXRlVG9rZW5zKApAQCAtNTI2NywxNCArNTk5MSwxNCBAQAogCWNoYXJbXSBlcnJvclRva2VuU291cmNlLAogCVN0cmluZyBlcnJvclRva2VuTmFtZSwKIAlTdHJpbmcgZXhwZWN0ZWRUb2tlbil7Ci0JdGhpcy5zeW50YXhFcnJvcigKKwlzeW50YXhFcnJvcigKIAkJSVByb2JsZW0uUGFyc2luZ0Vycm9ySW5zZXJ0VG9rZW5BZnRlciwKLQkJc3RhcnQsIAotCQllbmQsIAorCQlzdGFydCwKKwkJZW5kLAogCQljdXJyZW50S2luZCwKLQkJZXJyb3JUb2tlblNvdXJjZSwgCi0JCWVycm9yVG9rZW5OYW1lLCAKLQkJZXhwZWN0ZWRUb2tlbik7IAorCQllcnJvclRva2VuU291cmNlLAorCQllcnJvclRva2VuTmFtZSwKKwkJZXhwZWN0ZWRUb2tlbik7CiB9CiBwdWJsaWMgdm9pZCBwYXJzZUVycm9ySW5zZXJ0QmVmb3JlVG9rZW4oCiAJaW50IHN0YXJ0LApAQCAtNTI4MywxNCArNjAwNywxNCBAQAogCWNoYXJbXSBlcnJvclRva2VuU291cmNlLAogCVN0cmluZyBlcnJvclRva2VuTmFtZSwKIAlTdHJpbmcgZXhwZWN0ZWRUb2tlbil7Ci0JdGhpcy5zeW50YXhFcnJvcigKKwlzeW50YXhFcnJvcigKIAkJSVByb2JsZW0uUGFyc2luZ0Vycm9ySW5zZXJ0VG9rZW5CZWZvcmUsCi0JCXN0YXJ0LCAKLQkJZW5kLCAKKwkJc3RhcnQsCisJCWVuZCwKIAkJY3VycmVudEtpbmQsCi0JCWVycm9yVG9rZW5Tb3VyY2UsIAotCQllcnJvclRva2VuTmFtZSwgCi0JCWV4cGVjdGVkVG9rZW4pOyAKKwkJZXJyb3JUb2tlblNvdXJjZSwKKwkJZXJyb3JUb2tlbk5hbWUsCisJCWV4cGVjdGVkVG9rZW4pOwogfQogcHVibGljIHZvaWQgcGFyc2VFcnJvckluc2VydFRvQ29tcGxldGUoCiAJaW50IHN0YXJ0LApAQCAtNTMzNywxNCArNjA2MSwxNCBAQAogCWNoYXJbXSBlcnJvclRva2VuU291cmNlLAogCVN0cmluZyBlcnJvclRva2VuTmFtZSwKIAlTdHJpbmcgZXhwZWN0ZWRUb2tlbil7Ci0JdGhpcy5zeW50YXhFcnJvcigKKwlzeW50YXhFcnJvcigKIAkJSVByb2JsZW0uUGFyc2luZ0Vycm9ySW52YWxpZFRva2VuLAotCQlzdGFydCwgCi0JCWVuZCwgCisJCXN0YXJ0LAorCQllbmQsCiAJCWN1cnJlbnRLaW5kLAotCQllcnJvclRva2VuU291cmNlLCAKLQkJZXJyb3JUb2tlbk5hbWUsIAotCQlleHBlY3RlZFRva2VuKTsgCisJCWVycm9yVG9rZW5Tb3VyY2UsCisJCWVycm9yVG9rZW5OYW1lLAorCQlleHBlY3RlZFRva2VuKTsKIH0KIHB1YmxpYyB2b2lkIHBhcnNlRXJyb3JNZXJnZVRva2VucygKIAlpbnQgc3RhcnQsCkBAIC01Mzc0LDE0ICs2MDk4LDE0IEBACiAJaW50IGN1cnJlbnRLaW5kLAogCWNoYXJbXSBlcnJvclRva2VuU291cmNlLAogCVN0cmluZyBlcnJvclRva2VuTmFtZSl7Ci0JdGhpcy5zeW50YXhFcnJvcigKKwlzeW50YXhFcnJvcigKIAkJSVByb2JsZW0uUGFyc2luZ0Vycm9yTm9TdWdnZXN0aW9uLAotCQlzdGFydCwgCi0JCWVuZCwgCisJCXN0YXJ0LAorCQllbmQsCiAJCWN1cnJlbnRLaW5kLAotCQllcnJvclRva2VuU291cmNlLCAKKwkJZXJyb3JUb2tlblNvdXJjZSwKIAkJZXJyb3JUb2tlbk5hbWUsCi0JCW51bGwpOyAKKwkJbnVsbCk7CiB9CiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yTm9TdWdnZXN0aW9uRm9yVG9rZW5zKAogCWludCBzdGFydCwKQEAgLTU0MDAsMTQgKzYxMjQsMTQgQEAKIAljaGFyW10gZXJyb3JUb2tlblNvdXJjZSwKIAlTdHJpbmcgZXJyb3JUb2tlbk5hbWUsCiAJU3RyaW5nIGV4cGVjdGVkVG9rZW4pewotCXRoaXMuc3ludGF4RXJyb3IoCisJc3ludGF4RXJyb3IoCiAJCUlQcm9ibGVtLlBhcnNpbmdFcnJvciwKLQkJc3RhcnQsIAotCQllbmQsIAorCQlzdGFydCwKKwkJZW5kLAogCQljdXJyZW50S2luZCwKLQkJZXJyb3JUb2tlblNvdXJjZSwgCi0JCWVycm9yVG9rZW5OYW1lLCAKLQkJZXhwZWN0ZWRUb2tlbik7IAorCQllcnJvclRva2VuU291cmNlLAorCQllcnJvclRva2VuTmFtZSwKKwkJZXhwZWN0ZWRUb2tlbik7CiB9CiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yUmVwbGFjZVRva2VucygKIAlpbnQgc3RhcnQsCkBAIC01NDI0LDE2ICs2MTQ4LDE2IEBACiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yVW5leHBlY3RlZEVuZCgKIAlpbnQgc3RhcnQsCiAJaW50IGVuZCl7Ci0JCQorCiAJU3RyaW5nW10gYXJndW1lbnRzOwogCWlmKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKLQkJYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5wYXJzZXJfZW5kT2ZDb25zdHJ1Y3Rvcn07IAorCQlhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLnBhcnNlcl9lbmRPZkNvbnN0cnVjdG9yfTsKIAl9IGVsc2UgaWYodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5wYXJzZXJfZW5kT2ZNZXRob2R9OyAKKwkJYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5wYXJzZXJfZW5kT2ZNZXRob2R9OwogCX0gZWxzZSBpZih0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLQkJYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5wYXJzZXJfZW5kT2ZJbml0aWFsaXplcn07IAorCQlhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLnBhcnNlcl9lbmRPZkluaXRpYWxpemVyfTsKIAl9IGVsc2UgewotCQlhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLnBhcnNlcl9lbmRPZkZpbGV9OyAKKwkJYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5wYXJzZXJfZW5kT2ZGaWxlfTsKIAl9CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlBhcnNpbmdFcnJvclVuZXhwZWN0ZWRFT0YsCkBAIC01NDc0LDggKzYxOTgsOCBAQAogCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7IC8vIGJpbmFyeSBjYXNlCiAJICAgIHRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uUmF3TWVtYmVyVHlwZUNhbm5vdEJlUGFyYW1ldGVyaXplZCwKLQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgZmFsc2UpLCBuZXcgU3RyaW5nKHR5cGUuZW5jbG9zaW5nVHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCi0JCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgdHJ1ZSksIG5ldyBTdHJpbmcodHlwZS5lbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGFyZ3VtZW50VHlwZXMsIGZhbHNlKSwgbmV3IFN0cmluZyh0eXBlLmVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSksIG5ldyBTdHJpbmcodHlwZS5lbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQkJUHJvYmxlbVNldmVyaXRpZXMuQWJvcnRDb21waWxhdGlvbiB8IFByb2JsZW1TZXZlcml0aWVzLkVycm9yIHwgUHJvYmxlbVNldmVyaXRpZXMuRmF0YWwsCiAJCQkwLAogCQkJMCk7CkBAIC01NDgzLDMwICs2MjA3LDMxIEBACiAJfQogICAgIHRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5SYXdNZW1iZXJUeXBlQ2Fubm90QmVQYXJhbWV0ZXJpemVkLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoZmFsc2UsIGFyZ3VtZW50VHlwZXMsIGZhbHNlKSwgbmV3IFN0cmluZyh0eXBlLmVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRUeXBlcywgdHJ1ZSksIG5ldyBTdHJpbmcodHlwZS5lbmNsb3NpbmdUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIHR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgZmFsc2UpLCBuZXcgU3RyaW5nKHR5cGUuZW5jbG9zaW5nVHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCB0eXBlc0FzU3RyaW5nKGFyZ3VtZW50VHlwZXMsIHRydWUpLCBuZXcgU3RyaW5nKHR5cGUuZW5jbG9zaW5nVHlwZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCByYXdUeXBlUmVmZXJlbmNlKEFTVE5vZGUgbG9jYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUpIHsKKwlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjU5CiAJdHlwZSA9IHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKICAgICB0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uUmF3VHlwZVJlZmVyZW5jZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGUuZXJhc3VyZSgpLnJlYWRhYmxlTmFtZSgpKSwgfSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksbmV3IFN0cmluZyh0eXBlLmVyYXN1cmUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSx9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKLQkJbm9kZVNvdXJjZUVuZChudWxsLCBsb2NhdGlvbikpOworCQlub2RlU291cmNlRW5kKG51bGwsIGxvY2F0aW9uLCBJbnRlZ2VyLk1BWF9WQUxVRSkpOwogfQogcHVibGljIHZvaWQgcmVjdXJzaXZlQ29uc3RydWN0b3JJbnZvY2F0aW9uKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5SZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQl0eXBlc0FzU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmlzVmFyYXJncygpLCBjb25zdHJ1Y3RvckNhbGwuYmluZGluZy5wYXJhbWV0ZXJzLCBmYWxzZSkKKwkJCW5ldyBTdHJpbmcoY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJdHlwZXNBc1N0cmluZyhjb25zdHJ1Y3RvckNhbGwuYmluZGluZywgZmFsc2UpCiAJCX0sCiAJCW5ldyBTdHJpbmdbXSB7Ci0JCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCXR5cGVzQXNTdHJpbmcoY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuaXNWYXJhcmdzKCksIGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLnBhcmFtZXRlcnMsIHRydWUpCisJCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJdHlwZXNBc1N0cmluZyhjb25zdHJ1Y3RvckNhbGwuYmluZGluZywgdHJ1ZSkKIAkJfSwKIAkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0LAogCQljb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kKTsKQEAgLTU1MjksNyArNjI1NCwyNCBAQAogCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCiAJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOwogfQotCitwdWJsaWMgdm9pZCByZWR1bmRhbnRTdXBlckludGVyZmFjZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBUeXBlUmVmZXJlbmNlIHJlZmVyZW5jZSwgUmVmZXJlbmNlQmluZGluZyBzdXBlcmludGVyZmFjZSwgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdUeXBlKSB7CisJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlJlZHVuZGFudFN1cGVyaW50ZXJmYWNlKTsKKwlpZiAoc2V2ZXJpdHkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uUmVkdW5kYW50U3VwZXJpbnRlcmZhY2UsCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcoc3VwZXJpbnRlcmZhY2UucmVhZGFibGVOYW1lKCkpLAorCQkJCW5ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksCisJCQkJbmV3IFN0cmluZyhkZWNsYXJpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcoc3VwZXJpbnRlcmZhY2Uuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJbmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQlzZXZlcml0eSwKKwkJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOworCX0KK30KIHB1YmxpYyB2b2lkIHJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KFR5cGVCaW5kaW5nIGFycmF5VHlwZSwgQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWYpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQXJyYXlSZWZlcmVuY2VSZXF1aXJlZCwKQEAgLTU1NDEsNiArNjI4MywxNyBAQAogcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJdGhpcy5wb3NpdGlvblNjYW5uZXIgPSBudWxsOwogfQorcHVibGljIHZvaWQgcmVzb3VyY2VIYXNUb0ltcGxlbWVudEF1dG9DbG9zZWFibGUoVHlwZUJpbmRpbmcgYmluZGluZywgVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CisJaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKKwkJcmV0dXJuOyAvLyBOb3Qgc3VwcG9ydGVkIGluIDEuNyB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuIEhlbmNlIGFub3RoZXIgbm90IHJlcXVpcmVkCisJfQorCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uUmVzb3VyY2VIYXNUb0ltcGxlbWVudEF1dG9DbG9zZWFibGUsCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJdHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJCXR5cGVSZWZlcmVuY2Uuc291cmNlRW5kKTsKK30KIHByaXZhdGUgaW50IHJldHJpZXZlQ2xvc2luZ0FuZ2xlQnJhY2tldFBvc2l0aW9uKGludCBzdGFydCkgewogCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIHN0YXJ0OwogCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gdGhpcy5yZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0KCk7CkBAIC01NjYwLDYgKzY0MTMsOCBAQAogCQlmbGFnID0gSVByb2JsZW0uRW5kT2ZTb3VyY2U7CiAJZWxzZSBpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9IRVhBKSkKIAkJZmxhZyA9IElQcm9ibGVtLkludmFsaWRIZXhhOworCWVsc2UgaWYgKGVycm9yVG9rZW5OYW1lLmVxdWFscyhTY2FubmVyLklMTEVHQUxfSEVYQV9MSVRFUkFMKSkKKwkJZmxhZyA9IElQcm9ibGVtLklsbGVnYWxIZXhhTGl0ZXJhbDsKIAllbHNlIGlmIChlcnJvclRva2VuTmFtZS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX09DVEFMKSkKIAkJZmxhZyA9IElQcm9ibGVtLkludmFsaWRPY3RhbDsKIAllbHNlIGlmIChlcnJvclRva2VuTmFtZS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCkpCkBAIC01Njk5LDE5ICs2NDU0LDM1IEBACiAJCWZsYWcgPSBJUHJvYmxlbS5VbnRlcm1pbmF0ZWRTdHJpbmc7CiAJZWxzZSBpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9ESUdJVCkpCiAJCWZsYWcgPSBJUHJvYmxlbS5JbnZhbGlkRGlnaXQ7CisJZWxzZSBpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9CSU5BUlkpKQorCQlmbGFnID0gSVByb2JsZW0uSW52YWxpZEJpbmFyeTsKKwllbHNlIGlmIChlcnJvclRva2VuTmFtZS5lcXVhbHMoU2Nhbm5lci5CSU5BUllfTElURVJBTF9OT1RfQkVMT1dfMTcpKQorCQlmbGFnID0gSVByb2JsZW0uQmluYXJ5TGl0ZXJhbE5vdEJlbG93MTc7CisJZWxzZSBpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9VTkRFUlNDT1JFKSkKKwkJZmxhZyA9IElQcm9ibGVtLklsbGVnYWxVbmRlcnNjb3JlUG9zaXRpb247CisJZWxzZSBpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuVU5ERVJTQ09SRVNfSU5fTElURVJBTFNfTk9UX0JFTE9XXzE3KSkKKwkJZmxhZyA9IElQcm9ibGVtLlVuZGVyc2NvcmVzSW5MaXRlcmFsc05vdEJlbG93MTc7CiAKLQlTdHJpbmdbXSBhcmd1bWVudHMgPSBmbGFnID09IElQcm9ibGVtLlBhcnNpbmdFcnJvck5vU3VnZ2VzdGlvbiAKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBmbGFnID09IElQcm9ibGVtLlBhcnNpbmdFcnJvck5vU3VnZ2VzdGlvbgogCQkJPyBuZXcgU3RyaW5nW10ge2Vycm9yVG9rZW5OYW1lfQogCQkJOiBOb0FyZ3VtZW50OwogCXRoaXMuaGFuZGxlKAotCQlmbGFnLCAKKwkJZmxhZywKIAkJYXJndW1lbnRzLAogCQlhcmd1bWVudHMsCiAJCS8vIHRoaXMgaXMgdGhlIGN1cnJlbnQgLWludmFsaWQtIHRva2VuIHBvc2l0aW9uCi0JCXN0YXJ0UG9zLCAKKwkJc3RhcnRQb3MsCiAJCWVuZFBvcywKIAkJcGFyc2VyLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CiB9CitwdWJsaWMgdm9pZCBzaG91bGRJbXBsZW1lbnRIYXNoY29kZShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CQorCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5TaG91bGRJbXBsZW1lbnRIYXNoY29kZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQogcHVibGljIHZvaWQgc2hvdWxkUmV0dXJuKFR5cGVCaW5kaW5nIHJldHVyblR5cGUsIEFTVE5vZGUgbG9jYXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uU2hvdWxkUmV0dXJuVmFsdWUsCkBAIC01NzU2LDcgKzY1MjcsNyBAQAogCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKIAkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLGxvY2F0aW9uKSwKLQkJbm9kZVNvdXJjZUVuZChmaWVsZCwgbG9jYXRpb24pKTsgCisJCW5vZGVTb3VyY2VFbmQoZmllbGQsIGxvY2F0aW9uKSk7CiB9CiBwdWJsaWMgdm9pZCBzdGF0aWNJbmhlcml0ZWRNZXRob2RDb25mbGljdHMoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcykgewogCXRoaXMuaGFuZGxlKApAQCAtNTc3Miw3ICs2NTQzLDcgQEAKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KLXB1YmxpYyB2b2lkIHN0YXRpY01lbWJlck9mUGFyYW1ldGVyaXplZFR5cGUoQVNUTm9kZSBsb2NhdGlvbiwgUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7CitwdWJsaWMgdm9pZCBzdGF0aWNNZW1iZXJPZlBhcmFtZXRlcml6ZWRUeXBlKEFTVE5vZGUgbG9jYXRpb24sIFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgaW50IGluZGV4KSB7CiAJaWYgKGxvY2F0aW9uID09IG51bGwpIHsgLy8gYmluYXJ5IGNhc2UKIAkgICAgdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5TdGF0aWNNZW1iZXJPZlBhcmFtZXRlcml6ZWRUeXBlLApAQCAtNTc4Myw3ICs2NTU0LDYgQEAKIAkJCTApOwogCSAgICByZXR1cm47CiAJfQotCWludCBlbmQgPSBsb2NhdGlvbi5zb3VyY2VFbmQ7CiAJLyppZiAobG9jYXRpb24gaW5zdGFuY2VvZiBBcnJheVR5cGVSZWZlcmVuY2UpIHsKIAkJQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSA9IChBcnJheVR5cGVSZWZlcmVuY2UpIGxvY2F0aW9uOwogCQlpZiAoYXJyYXlUeXBlUmVmZXJlbmNlLnRva2VuICE9IG51bGwgJiYgYXJyYXlUeXBlUmVmZXJlbmNlLnRva2VuLmxlbmd0aCA9PSAwKSByZXR1cm47CkBAIC01Nzk0LDcgKzY1NjQsNyBAQAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZS5lbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCkpLCB9LAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLmVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCWVuZCk7CisJCW5vZGVTb3VyY2VFbmQobnVsbCwgbG9jYXRpb24sIGluZGV4KSk7CiB9CiBwdWJsaWMgdm9pZCBzdHJpbmdDb25zdGFudElzRXhjZWVkaW5nVXRmOExpbWl0KEFTVE5vZGUgbG9jYXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKQEAgLTU4MTgsNyArNjU4OCw3IEBACiAJCU5vQXJndW1lbnQsCiAJCU5vQXJndW1lbnQsCiAJCXNvdXJjZVN0YXJ0LAotCQlzb3VyY2VFbmQpOwkKKwkJc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHN1cGVyaW50ZXJmYWNlTXVzdEJlQW5JbnRlcmZhY2UoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgVHlwZVJlZmVyZW5jZSBzdXBlckludGVyZmFjZVJlZiwgUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUpIHsKIAl0aGlzLmhhbmRsZSgKQEAgLTU4NTAsMTEgKzY2MjAsMTEgQEAKIH0KIHByaXZhdGUgdm9pZCBzeW50YXhFcnJvcigKIAlpbnQgaWQsCi0JaW50IHN0YXJ0UG9zaXRpb24sIAotCWludCBlbmRQb3NpdGlvbiwgCisJaW50IHN0YXJ0UG9zaXRpb24sCisJaW50IGVuZFBvc2l0aW9uLAogCWludCBjdXJyZW50S2luZCwKLQljaGFyW10gY3VycmVudFRva2VuU291cmNlLCAKLQlTdHJpbmcgZXJyb3JUb2tlbk5hbWUsIAorCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UsCisJU3RyaW5nIGVycm9yVG9rZW5OYW1lLAogCVN0cmluZyBleHBlY3RlZFRva2VuKSB7CiAKIAlTdHJpbmcgZVRva2VuTmFtZTsKQEAgLTU4ODMsNyArNjY1Myw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlRhc2ssCiAJCW5ldyBTdHJpbmdbXSB7IHRhZywgbWVzc2FnZSwgcHJpb3JpdHkvKnNlY3JldCBhcmd1bWVudCB0aGF0IGlzIG5vdCBzdXJmYWNlZCBpbiBnZXRNZXNzYWdlKCkqL30sCi0JCW5ldyBTdHJpbmdbXSB7IHRhZywgbWVzc2FnZSwgcHJpb3JpdHkvKnNlY3JldCBhcmd1bWVudCB0aGF0IGlzIG5vdCBzdXJmYWNlZCBpbiBnZXRNZXNzYWdlKCkqL30sIAorCQluZXcgU3RyaW5nW10geyB0YWcsIG1lc3NhZ2UsIHByaW9yaXR5LypzZWNyZXQgYXJndW1lbnQgdGhhdCBpcyBub3Qgc3VyZmFjZWQgaW4gZ2V0TWVzc2FnZSgpKi99LAogCQlzdGFydCwKIAkJZW5kKTsKIH0KQEAgLTU5MTUsNiArNjY4NSwyMiBAQAogCQl0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsCiAJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgdG9vTWFueVBhcmFtZXRlcnNGb3JTeW50aGV0aWNNZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKwlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2QuYmluZGluZzsKKwlTdHJpbmcgc2VsZWN0b3IgPSBudWxsOworCWlmIChiaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgeworCQlzZWxlY3RvciA9IG5ldyBTdHJpbmcoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCkpOworCX0gZWxzZSB7CisJCXNlbGVjdG9yID0gbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpOworCX0KKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVG9vTWFueVBhcmFtZXRlcnNGb3JTeW50aGV0aWNNZXRob2QsCisJCW5ldyBTdHJpbmdbXSB7c2VsZWN0b3IsIHR5cGVzQXNTdHJpbmcoYmluZGluZywgZmFsc2UpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCB9LAorCQluZXcgU3RyaW5nW10ge3NlbGVjdG9yLCB0eXBlc0FzU3RyaW5nKGJpbmRpbmcsIHRydWUpLCBuZXcgU3RyaW5nKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksfSwKKwkJUHJvYmxlbVNldmVyaXRpZXMuQWJvcnRNZXRob2QgfCBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvciB8IFByb2JsZW1TZXZlcml0aWVzLkZhdGFsLAorCQltZXRob2Quc291cmNlU3RhcnQsCisJCW1ldGhvZC5zb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgdHlwZUNhc3RFcnJvcihDYXN0RXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CiAJU3RyaW5nIGxlZnROYW1lID0gbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CiAJU3RyaW5nIHJpZ2h0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKTsKQEAgLTU5NTEsNiArNjczNywxNyBAQAogCQl0eXBlRGVjbC5zb3VyY2VFbmQsCiAJCWNvbXBVbml0RGVjbC5jb21waWxhdGlvblJlc3VsdCk7CiB9CitwdWJsaWMgdm9pZCB0eXBlSGlkaW5nKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgVHlwZUJpbmRpbmcgaGlkZGVuVHlwZSkgeworCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZSk7CisJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKSAsIG5ldyBTdHJpbmcoaGlkZGVuVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSB9LAorCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpICwgbmV3IFN0cmluZyhoaWRkZW5UeXBlLnJlYWRhYmxlTmFtZSgpKSB9LAorCQlzZXZlcml0eSwKKwkJdHlwZURlY2wuc291cmNlU3RhcnQsCisJCXR5cGVEZWNsLnNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCB0eXBlSGlkaW5nKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgVHlwZVZhcmlhYmxlQmluZGluZyBoaWRkZW5UeXBlUGFyYW1ldGVyKSB7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlR5cGVIaWRpbmdUeXBlUGFyYW1ldGVyRnJvbVR5cGUpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTU5NjgsMzYgKzY3NjUsMjUgQEAKIAkJTWV0aG9kQmluZGluZyBkZWNsYXJpbmdNZXRob2QgPSAoTWV0aG9kQmluZGluZykgaGlkZGVuVHlwZVBhcmFtZXRlci5kZWNsYXJpbmdFbGVtZW50OwogCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZVBhcmFtZXRlckZyb21NZXRob2QsCi0JCQkJbmV3IFN0cmluZ1tdIHsgCi0JCQkJCQluZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpLCAKKwkJCQluZXcgU3RyaW5nW10geworCQkJCQkJbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKSwKIAkJCQkJCW5ldyBTdHJpbmcoaGlkZGVuVHlwZVBhcmFtZXRlci5yZWFkYWJsZU5hbWUoKSksCiAJCQkJCQluZXcgU3RyaW5nKGRlY2xhcmluZ01ldGhvZC5zZWxlY3RvciksCi0JCQkJCQl0eXBlc0FzU3RyaW5nKGRlY2xhcmluZ01ldGhvZC5pc1ZhcmFyZ3MoKSwgZGVjbGFyaW5nTWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwKLQkJCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwJCQkJCQkKKwkJCQkJCXR5cGVzQXNTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLCBmYWxzZSksCisJCQkJCQluZXcgU3RyaW5nKGRlY2xhcmluZ01ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJfSwKLQkJCQluZXcgU3RyaW5nW10geyAKKwkJCQluZXcgU3RyaW5nW10gewogCQkJCQkJbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKSwKIAkJCQkJCW5ldyBTdHJpbmcoaGlkZGVuVHlwZVBhcmFtZXRlci5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkJCXR5cGVzQXNTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLmlzVmFyYXJncygpLCBkZWNsYXJpbmdNZXRob2QucGFyYW1ldGVycywgdHJ1ZSksCi0JCQkJCQluZXcgU3RyaW5nKGRlY2xhcmluZ01ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwJCQkJCQkKKwkJCQkJCXR5cGVzQXNTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLCB0cnVlKSwKKwkJCQkJCW5ldyBTdHJpbmcoZGVjbGFyaW5nTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJCX0sCiAJCQkJc2V2ZXJpdHksCiAJCQkJdHlwZURlY2wuc291cmNlU3RhcnQsCiAJCQkJdHlwZURlY2wuc291cmNlRW5kKTsKIAl9CiB9Ci1wdWJsaWMgdm9pZCB0eXBlSGlkaW5nKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgVHlwZUJpbmRpbmcgaGlkZGVuVHlwZSkgewotCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZSk7Ci0JaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwotCXRoaXMuaGFuZGxlKAotCQlJUHJvYmxlbS5UeXBlSGlkaW5nVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKSAsIG5ldyBTdHJpbmcoaGlkZGVuVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSB9LCAKLQkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKSAsIG5ldyBTdHJpbmcoaGlkZGVuVHlwZS5yZWFkYWJsZU5hbWUoKSkgfSwKLQkJc2V2ZXJpdHksCi0JCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAotCQl0eXBlRGVjbC5zb3VyY2VFbmQpOwotfQogcHVibGljIHZvaWQgdHlwZUhpZGluZyhUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSwgQmluZGluZyBoaWRkZW4pIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVHlwZVBhcmFtZXRlckhpZGluZ1R5cGUpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTYwMTAsMTYgKzY3OTYsNDYgQEAKIAkJdHlwZVBhcmFtLnNvdXJjZVN0YXJ0LAogCQl0eXBlUGFyYW0uc291cmNlRW5kKTsKIH0KLXB1YmxpYyB2b2lkIHR5cGVNaXNtYXRjaEVycm9yKFR5cGVCaW5kaW5nIGFjdHVhbFR5cGUsIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSwgQVNUTm9kZSBsb2NhdGlvbikgeworcHVibGljIHZvaWQgdHlwZU1pc21hdGNoRXJyb3IoVHlwZUJpbmRpbmcgYWN0dWFsVHlwZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlLCBBU1ROb2RlIGxvY2F0aW9uLCBBU1ROb2RlIGV4cGVjdGluZ0xvY2F0aW9uKSB7CisJaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsgLy8gZG9uJ3QgZXhwb3NlIHR5cGUgdmFyaWFibGUgbmFtZXMsIGNvbXBsYWluIG9uIGVyYXNlZCB0eXBlcworCQlpZiAoYWN0dWFsVHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZUJpbmRpbmcpCisJCQlhY3R1YWxUeXBlID0gYWN0dWFsVHlwZS5lcmFzdXJlKCk7CisJCWlmIChleHBlY3RlZFR5cGUgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGVCaW5kaW5nKQorCQkJZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlLmVyYXN1cmUoKTsKKwl9CisJaWYgKGFjdHVhbFR5cGUgIT0gbnVsbCAmJiAoYWN0dWFsVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkgeyAvLyBpbXByb3ZlIHNlY29uZGFyeSBlcnJvcgorCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5VbmRlZmluZWRUeXBlLAorCQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhhY3R1YWxUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYWN0dWFsVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworCQkJcmV0dXJuOworCX0KKwlpZiAoZXhwZWN0aW5nTG9jYXRpb24gIT0gbnVsbCAmJiAoZXhwZWN0ZWRUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7IC8vIGltcHJvdmUgc2Vjb25kYXJ5IGVycm9yCisJCXRoaXMuaGFuZGxlKAorCQkJCUlQcm9ibGVtLlVuZGVmaW5lZFR5cGUsCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJCQlleHBlY3RpbmdMb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJCQlleHBlY3RpbmdMb2NhdGlvbi5zb3VyY2VFbmQpOworCQkJcmV0dXJuOworCX0KKwljaGFyW10gYWN0dWFsU2hvcnRSZWFkYWJsZU5hbWUgPSBhY3R1YWxUeXBlLnNob3J0UmVhZGFibGVOYW1lKCk7CisJY2hhcltdIGV4cGVjdGVkU2hvcnRSZWFkYWJsZU5hbWUgPSBleHBlY3RlZFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKTsKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYWN0dWFsU2hvcnRSZWFkYWJsZU5hbWUsIGV4cGVjdGVkU2hvcnRSZWFkYWJsZU5hbWUpKSB7CisJCWFjdHVhbFNob3J0UmVhZGFibGVOYW1lID0gYWN0dWFsVHlwZS5yZWFkYWJsZU5hbWUoKTsKKwkJZXhwZWN0ZWRTaG9ydFJlYWRhYmxlTmFtZSA9IGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKTsKKwl9CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlR5cGVNaXNtYXRjaCwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGFjdHVhbFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYWN0dWFsVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhleHBlY3RlZFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYWN0dWFsU2hvcnRSZWFkYWJsZU5hbWUpLCBuZXcgU3RyaW5nKGV4cGVjdGVkU2hvcnRSZWFkYWJsZU5hbWUpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB0eXBlTWlzbWF0Y2hFcnJvcihUeXBlQmluZGluZyB0eXBlQXJndW1lbnQsIFR5cGVWYXJpYWJsZUJpbmRpbmcgdHlwZVBhcmFtZXRlciwgUmVmZXJlbmNlQmluZGluZyBnZW5lcmljVHlwZSwgQVNUTm9kZSBsb2NhdGlvbikgewotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7IC8vIGJpbmFyeSBjYXNlCisJaWYgKGxvY2F0aW9uID09IG51bGwpIHsgLy8gYmluYXJ5IGNhc2UKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5UeXBlQXJndW1lbnRNaXNtYXRjaCwKIAkJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcodHlwZUFyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhnZW5lcmljVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlci5zb3VyY2VOYW1lKSwgcGFyYW1ldGVyQm91bmRBc1N0cmluZyh0eXBlUGFyYW1ldGVyLCBmYWxzZSkgfSwKQEAgLTYwMzYsMTkgKzY4NTIsNTkgQEAKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9Ci1wcml2YXRlIFN0cmluZyB0eXBlc0FzU3RyaW5nKGJvb2xlYW4gaXNWYXJhcmdzLCBUeXBlQmluZGluZ1tdIHR5cGVzLCBib29sZWFuIG1ha2VTaG9ydCkgeworcHJpdmF0ZSBTdHJpbmcgdHlwZXNBc1N0cmluZyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsIGJvb2xlYW4gbWFrZVNob3J0KSB7CisJcmV0dXJuIHR5cGVzQXNTdHJpbmcobWV0aG9kQmluZGluZywgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBtYWtlU2hvcnQpOworfQorcHJpdmF0ZSBTdHJpbmcgdHlwZXNBc1N0cmluZyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsIFR5cGVCaW5kaW5nW10gcGFyYW1ldGVycywgYm9vbGVhbiBtYWtlU2hvcnQpIHsKKwlpZiAobWV0aG9kQmluZGluZy5pc1BvbHltb3JwaGljKCkpIHsKKwkJLy8gZ2V0IHRoZSBvcmlnaW5hbCBwb2x5bW9ycGhpY01ldGhvZCBtZXRob2QKKwkJVHlwZUJpbmRpbmdbXSB0eXBlcyA9IG1ldGhvZEJpbmRpbmcub3JpZ2luYWwoKS5wYXJhbWV0ZXJzOworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKGkgIT0gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCVR5cGVCaW5kaW5nIHR5cGUgPSB0eXBlc1tpXTsKKwkJCWJvb2xlYW4gaXNWYXJhcmdUeXBlID0gaSA9PSBsZW5ndGgtMTsKKwkJCWlmIChpc1ZhcmFyZ1R5cGUpIHsKKwkJCQl0eXBlID0gKChBcnJheUJpbmRpbmcpdHlwZSkuZWxlbWVudHNUeXBlKCk7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcobWFrZVNob3J0ID8gdHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpIDogdHlwZS5yZWFkYWJsZU5hbWUoKSkpOworCQkJaWYgKGlzVmFyYXJnVHlwZSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIi4uLiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICE9IDApCisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGkgIT0gMCkgewogCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlQmluZGluZyB0eXBlID0gdHlwZXNbaV07Ci0JCWJvb2xlYW4gaXNWYXJhcmdUeXBlID0gaXNWYXJhcmdzICYmIGkgPT0gbGVuZ3RoLTE7Ci0JCWlmIChpc1ZhcmFyZ1R5cGUpIHR5cGUgPSAoKEFycmF5QmluZGluZyl0eXBlKS5lbGVtZW50c1R5cGUoKTsKKwkJfQorCQlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVyc1tpXTsKKwkJYm9vbGVhbiBpc1ZhcmFyZ1R5cGUgPSBtZXRob2RCaW5kaW5nLmlzVmFyYXJncygpICYmIGkgPT0gbGVuZ3RoLTE7CisJCWlmIChpc1ZhcmFyZ1R5cGUpIHsKKwkJCXR5cGUgPSAoKEFycmF5QmluZGluZyl0eXBlKS5lbGVtZW50c1R5cGUoKTsKKwkJfQogCQlidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcobWFrZVNob3J0ID8gdHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpIDogdHlwZS5yZWFkYWJsZU5hbWUoKSkpOwotCQlpZiAoaXNWYXJhcmdUeXBlKSBidWZmZXIuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaXNWYXJhcmdUeXBlKSB7CisJCQlidWZmZXIuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CiAJfQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KK3ByaXZhdGUgU3RyaW5nIHR5cGVzQXNTdHJpbmcoVHlwZUJpbmRpbmdbXSB0eXBlcywgYm9vbGVhbiBtYWtlU2hvcnQpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChpICE9IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlUeXBlQmluZGluZyB0eXBlID0gdHlwZXNbaV07CisJCWJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhtYWtlU2hvcnQgPyB0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkgOiB0eXBlLnJlYWRhYmxlTmFtZSgpKSk7CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKwogcHVibGljIHZvaWQgdW5kZWZpbmVkQW5ub3RhdGlvblZhbHVlKFR5cGVCaW5kaW5nIGFubm90YXRpb25UeXBlLCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7CiAJaWYgKGlzUmVjb3ZlcmVkTmFtZShtZW1iZXJWYWx1ZVBhaXIubmFtZSkpIHJldHVybjsKIAlTdHJpbmcgbmFtZSA9IAluZXcgU3RyaW5nKG1lbWJlclZhbHVlUGFpci5uYW1lKTsKQEAgLTYwNzMsNyArNjkyOSw3IEBACiBwdWJsaWMgdm9pZCB1bmRlZmluZWRUeXBlVmFyaWFibGVTaWduYXR1cmUoY2hhcltdIHZhcmlhYmxlTmFtZSwgUmVmZXJlbmNlQmluZGluZyBiaW5hcnlUeXBlKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlVuZGVmaW5lZFR5cGVWYXJpYWJsZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHZhcmlhYmxlTmFtZSksIG5ldyBTdHJpbmcoYmluYXJ5VHlwZS5yZWFkYWJsZU5hbWUoKSkgfSwJCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJpYWJsZU5hbWUpLCBuZXcgU3RyaW5nKGJpbmFyeVR5cGUucmVhZGFibGVOYW1lKCkpIH0sCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJpYWJsZU5hbWUpLCBuZXcgU3RyaW5nKGJpbmFyeVR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlQcm9ibGVtU2V2ZXJpdGllcy5BYm9ydENvbXBpbGF0aW9uIHwgUHJvYmxlbVNldmVyaXRpZXMuRXJyb3IgfCBQcm9ibGVtU2V2ZXJpdGllcy5GYXRhbCwKIAkJMCwKQEAgLTYxMDcsMjMgKzY5NjMsNDIgQEAKIH0KIHB1YmxpYyB2b2lkIHVuaGFuZGxlZEV4Y2VwdGlvbihUeXBlQmluZGluZyBleGNlcHRpb25UeXBlLCBBU1ROb2RlIGxvY2F0aW9uKSB7CiAKLQlib29sZWFuIGluc2lkZURlZmF1bHRDb25zdHJ1Y3RvciA9IAorCWJvb2xlYW4gaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yID0KIAkJKHRoaXMucmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pCiAJCQkmJiAoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpOwogCWJvb2xlYW4gaW5zaWRlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgPQogCQkobG9jYXRpb24gaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkKIAkJCSYmICgoKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBsb2NhdGlvbikuYWNjZXNzTW9kZSA9PSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKTsKIAorCWludCBzb3VyY2VFbmQgPSBsb2NhdGlvbi5zb3VyY2VFbmQ7CisJaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQlzb3VyY2VFbmQgPSAoKExvY2FsRGVjbGFyYXRpb24pIGxvY2F0aW9uKS5kZWNsYXJhdGlvbkVuZDsKKwl9CiAJdGhpcy5oYW5kbGUoCiAJCWluc2lkZURlZmF1bHRDb25zdHJ1Y3RvcgogCQkJPyBJUHJvYmxlbS5VbmhhbmRsZWRFeGNlcHRpb25JbkRlZmF1bHRDb25zdHJ1Y3RvcgotCQkJOiAoaW5zaWRlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgCisJCQk6IChpbnNpZGVJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbAogCQkJCQk/IElQcm9ibGVtLlVuZGVmaW5lZENvbnN0cnVjdG9ySW5JbXBsaWNpdENvbnN0cnVjdG9yQ2FsbAogCQkJCQk6IElQcm9ibGVtLlVuaGFuZGxlZEV4Y2VwdGlvbiksCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKX0sCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleGNlcHRpb25UeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisJCXNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB1bmhhbmRsZWRFeGNlcHRpb25Gcm9tQXV0b0Nsb3NlIChUeXBlQmluZGluZyBleGNlcHRpb25UeXBlLCBBU1ROb2RlIGxvY2F0aW9uKSB7CisJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKChMb2NhbERlY2xhcmF0aW9uKWxvY2F0aW9uKS5iaW5kaW5nOworCWlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCkgeworCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLlVuaGFuZGxlZEV4Y2VwdGlvbk9uQXV0b0Nsb3NlLAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJbmV3IFN0cmluZyhleGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyhsb2NhbEJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyhsb2NhbEJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworCX0KIH0KIHB1YmxpYyB2b2lkIHVuaGFuZGxlZFdhcm5pbmdUb2tlbihFeHByZXNzaW9uIHRva2VuKSB7CiAJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgdG9rZW4uY29uc3RhbnQuc3RyaW5nVmFsdWUoKSB9OwpAQCAtNjE0NCw2ICs3MDE5LDcgQEAKIAkJbm9kZVNvdXJjZUVuZChmaWVsZCwgbG9jYXRpb24pKTsKIH0KIHB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKExvY2FsVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcsIEFTVE5vZGUgbG9jYXRpb24pIHsKKwliaW5kaW5nLnRhZ0JpdHMgfD0gVGFnQml0cy5Ob3RJbml0aWFsaXplZDsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZSwKQEAgLTYxNTQsMTAgKzcwMzAsMTAgQEAKIH0KIHB1YmxpYyB2b2lkIHVubWF0Y2hlZEJyYWNrZXQoaW50IHBvc2l0aW9uLCBSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CiAJdGhpcy5oYW5kbGUoCi0JCUlQcm9ibGVtLlVubWF0Y2hlZEJyYWNrZXQsIAorCQlJUHJvYmxlbS5Vbm1hdGNoZWRCcmFja2V0LAogCQlOb0FyZ3VtZW50LAogCQlOb0FyZ3VtZW50LAotCQlwb3NpdGlvbiwgCisJCXBvc2l0aW9uLAogCQlwb3NpdGlvbiwKIAkJY29udGV4dCwKIAkJY29tcGlsYXRpb25SZXN1bHQpOwpAQCAtNjIxMCw2ICs3MDg2LDI3IEBACiAJCXNvdXJjZVN0YXJ0LAogCQlzb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgdW5uZWNlc3NhcnlUeXBlQXJndW1lbnRzRm9yTWV0aG9kSW52b2NhdGlvbihNZXRob2RCaW5kaW5nIG1ldGhvZCwgVHlwZUJpbmRpbmdbXSBnZW5lcmljVHlwZUFyZ3VtZW50cywgVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudHMpIHsKKwlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKKwkJPyBuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKQorCQk6IG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKTsKKwl0aGlzLmhhbmRsZSgKKwkJCW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKKwkJCQk/IElQcm9ibGVtLlVudXNlZFR5cGVBcmd1bWVudHNGb3JDb25zdHJ1Y3Rvckludm9jYXRpb24KKwkJCQk6IElQcm9ibGVtLlVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uLAorCQluZXcgU3RyaW5nW10geworCQkJCW1ldGhvZE5hbWUsCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSwKKwkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhnZW5lcmljVHlwZUFyZ3VtZW50cywgZmFsc2UpIH0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQkJbWV0aG9kTmFtZSwKKwkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZCwgdHJ1ZSksCisJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhnZW5lcmljVHlwZUFyZ3VtZW50cywgdHJ1ZSkgfSwKKwkJdHlwZUFyZ3VtZW50c1swXS5zb3VyY2VTdGFydCwKKwkJdHlwZUFyZ3VtZW50c1t0eXBlQXJndW1lbnRzLmxlbmd0aC0xXS5zb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgdW5xdWFsaWZpZWRGaWVsZEFjY2VzcyhOYW1lUmVmZXJlbmNlIHJlZmVyZW5jZSwgRmllbGRCaW5kaW5nIGZpZWxkKSB7CiAJaW50IHNvdXJjZVN0YXJ0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OwogCWludCBzb3VyY2VFbmQgPSByZWZlcmVuY2Uuc291cmNlRW5kOwpAQCAtNjIzOCwxMCArNzEzNSwxMCBAQAogCQlJUHJvYmxlbS5VbnJlYWNoYWJsZUNhdGNoLAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhleGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC02MjczLDYgKzcxNzAsNyBAQAogKi8KIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9OwogCWludCBlbmQgPSBuYW1lUmVmLnNvdXJjZUVuZDsKKwlpbnQgc291cmNlU3RhcnQgPSBuYW1lUmVmLnNvdXJjZVN0YXJ0OwogCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgewogCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBuYW1lUmVmOwogCQlpZiAoaXNSZWNvdmVyZWROYW1lKHJlZi50b2tlbnMpKSByZXR1cm47CkBAIC02MjgxLDI3ICs3MTc5LDM2IEBACiAJfSBlbHNlIHsKIAkJU2luZ2xlTmFtZVJlZmVyZW5jZSByZWYgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgbmFtZVJlZjsKIAkJaWYgKGlzUmVjb3ZlcmVkTmFtZShyZWYudG9rZW4pKSByZXR1cm47CisJCWludCBudW1iZXJPZlBhcmVucyA9IChyZWYuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUOworCQlpZiAobnVtYmVyT2ZQYXJlbnMgIT0gMCkgeworCQkJc291cmNlU3RhcnQgPSByZXRyaWV2ZVN0YXJ0aW5nUG9zaXRpb25BZnRlck9wZW5pbmdQYXJlbnRoZXNpcyhzb3VyY2VTdGFydCwgZW5kLCBudW1iZXJPZlBhcmVucyk7CisJCQllbmQgPSByZXRyaWV2ZUVuZGluZ1Bvc2l0aW9uQWZ0ZXJPcGVuaW5nUGFyZW50aGVzaXMoc291cmNlU3RhcnQsIGVuZCwgbnVtYmVyT2ZQYXJlbnMpOworCQl9CiAJfQorCWludCBwcm9ibGVtSWQgPSAobmFtZVJlZi5iaXRzICYgQmluZGluZy5WQVJJQUJMRSkgIT0gMCAmJiAobmFtZVJlZi5iaXRzICYgQmluZGluZy5UWVBFKSA9PSAwCisJCT8gSVByb2JsZW0uVW5yZXNvbHZlZFZhcmlhYmxlCisJCTogSVByb2JsZW0uVW5kZWZpbmVkTmFtZTsKIAl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uVW5kZWZpbmVkTmFtZSwKKwkJcHJvYmxlbUlkLAogCQlhcmd1bWVudHMsCiAJCWFyZ3VtZW50cywKLQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKKwkJc291cmNlU3RhcnQsCiAJCWVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bnNhZmVDYXN0KENhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uLCBTY29wZSBzY29wZSkgeworCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSByZXR1cm47IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUyNTkKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVW5zYWZlR2VuZXJpY0Nhc3QpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlUeXBlQmluZGluZyBjYXN0ZWRFeHByZXNzaW9uVHlwZSA9IGNhc3RFeHByZXNzaW9uLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwogCVR5cGVCaW5kaW5nIGNhc3RFeHByZXNzaW9uUmVzb2x2ZWRUeXBlID0gY2FzdEV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlOwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbnNhZmVHZW5lcmljQ2FzdCwKLQkJbmV3IFN0cmluZ1tdeyAKLQkJCW5ldyBTdHJpbmcoY2FzdGVkRXhwcmVzc2lvblR5cGUucmVhZGFibGVOYW1lKCkpLCAKKwkJbmV3IFN0cmluZ1tdeworCQkJbmV3IFN0cmluZyhjYXN0ZWRFeHByZXNzaW9uVHlwZS5yZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKGNhc3RFeHByZXNzaW9uUmVzb2x2ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKQogCQl9LAotCQluZXcgU3RyaW5nW117IAotCQkJbmV3IFN0cmluZyhjYXN0ZWRFeHByZXNzaW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCisJCW5ldyBTdHJpbmdbXXsKKwkJCW5ldyBTdHJpbmcoY2FzdGVkRXhwcmVzc2lvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKGNhc3RFeHByZXNzaW9uUmVzb2x2ZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpCiAJCX0sCiAJCXNldmVyaXR5LApAQCAtNjMyMCwxOSArNzIyNywyMSBAQAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgdW5zYWZlUmF3RmllbGRBc3NpZ25tZW50KEZpZWxkQmluZGluZyBmaWVsZCwgVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUsIEFTVE5vZGUgbG9jYXRpb24pIHsKKwlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjU5CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlVuc2FmZVJhd0ZpZWxkQXNzaWdubWVudCk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbnNhZmVSYXdGaWVsZEFzc2lnbm1lbnQsCi0JCW5ldyBTdHJpbmdbXSB7IAorCQluZXcgU3RyaW5nW10gewogCQkgICAgICAgIG5ldyBTdHJpbmcoZXhwcmVzc2lvblR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpLCBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkucmVhZGFibGVOYW1lKCkpIH0sCi0JCW5ldyBTdHJpbmdbXSB7IAorCQluZXcgU3RyaW5nW10gewogCQkgICAgICAgIG5ldyBTdHJpbmcoZXhwcmVzc2lvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQubmFtZSksIG5ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpIH0sCiAJCXNldmVyaXR5LAogCQlub2RlU291cmNlU3RhcnQoZmllbGQsbG9jYXRpb24pLAotCQlub2RlU291cmNlRW5kKGZpZWxkLCBsb2NhdGlvbikpOyAKKwkJbm9kZVNvdXJjZUVuZChmaWVsZCwgbG9jYXRpb24pKTsKIH0KLXB1YmxpYyB2b2lkIHVuc2FmZVJhd0dlbmVyaWNNZXRob2RJbnZvY2F0aW9uKEFTVE5vZGUgbG9jYXRpb24sIE1ldGhvZEJpbmRpbmcgcmF3TWV0aG9kKSB7CitwdWJsaWMgdm9pZCB1bnNhZmVSYXdHZW5lcmljTWV0aG9kSW52b2NhdGlvbihBU1ROb2RlIGxvY2F0aW9uLCBNZXRob2RCaW5kaW5nIHJhd01ldGhvZCwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzKSB7CisJaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHJldHVybjsgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTI1OQogCWJvb2xlYW4gaXNDb25zdHJ1Y3RvciA9IHJhd01ldGhvZC5pc0NvbnN0cnVjdG9yKCk7CiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KGlzQ29uc3RydWN0b3IgPyBJUHJvYmxlbS5VbnNhZmVSYXdHZW5lcmljQ29uc3RydWN0b3JJbnZvY2F0aW9uIDogSVByb2JsZW0uVW5zYWZlUmF3R2VuZXJpY01ldGhvZEludm9jYXRpb24pOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTYzNDEsNDAgKzcyNTAsNDEgQEAKIAkJCUlQcm9ibGVtLlVuc2FmZVJhd0dlbmVyaWNDb25zdHJ1Y3Rvckludm9jYXRpb24sIC8vIFRoZSBnZW5lcmljIGNvbnN0cnVjdG9yIHswfSh7MX0pIG9mIHR5cGUgezJ9IGlzIGFwcGxpZWQgdG8gbm9uLXBhcmFtZXRlcml6ZWQgdHlwZSBhcmd1bWVudHMgKHszfSkKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKHJhd01ldGhvZC5vcmlnaW5hbCgpLmlzVmFyYXJncygpLCByYXdNZXRob2Qub3JpZ2luYWwoKS5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKSwgZmFsc2UpLAogCQkJCW5ldyBTdHJpbmcocmF3TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKHJhd01ldGhvZC5vcmlnaW5hbCgpLmlzVmFyYXJncygpLCByYXdNZXRob2QucGFyYW1ldGVycywgZmFsc2UpLAotCQkJIH0sIAorCQkJCXR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgZmFsc2UpLAorCQkJIH0sCiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcocmF3TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSksCi0JCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgcmF3TWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgdHJ1ZSksCisJCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKSwgdHJ1ZSksCiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgcmF3TWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSksCiAJCQkgfSwKIAkJCXNldmVyaXR5LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCQlsb2NhdGlvbi5zb3VyY2VFbmQpOyAgICAKKwkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiAgICAgfSBlbHNlIHsKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5VbnNhZmVSYXdHZW5lcmljTWV0aG9kSW52b2NhdGlvbiwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIGZhbHNlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKHJhd01ldGhvZC5vcmlnaW5hbCgpLCBmYWxzZSksCiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksCi0JCQkgfSwgCisJCQkJdHlwZXNBc1N0cmluZyhhcmd1bWVudFR5cGVzLCBmYWxzZSksCisJCQkgfSwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCksIHRydWUpLAogCQkJCW5ldyBTdHJpbmcocmF3TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKGFyZ3VtZW50VHlwZXMsIHRydWUpLAogCQkJIH0sCiAJCQlzZXZlcml0eSwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQkJbG9jYXRpb24uc291cmNlRW5kKTsgICAgCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogICAgIH0KIH0KIHB1YmxpYyB2b2lkIHVuc2FmZVJhd0ludm9jYXRpb24oQVNUTm9kZSBsb2NhdGlvbiwgTWV0aG9kQmluZGluZyByYXdNZXRob2QpIHsKKwlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuOyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjU5CiAJYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gcmF3TWV0aG9kLmlzQ29uc3RydWN0b3IoKTsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoaXNDb25zdHJ1Y3RvciA/IElQcm9ibGVtLlVuc2FmZVJhd0NvbnN0cnVjdG9ySW52b2NhdGlvbiA6IElQcm9ibGVtLlVuc2FmZVJhd01ldGhvZEludm9jYXRpb24pOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKQEAgLTYzODMsMzggKzcyOTMsNDEgQEAKIAkJCUlQcm9ibGVtLlVuc2FmZVJhd0NvbnN0cnVjdG9ySW52b2NhdGlvbiwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKSwgcmF3TWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwKIAkJCQluZXcgU3RyaW5nKHJhd01ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkucmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcocmF3TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKHJhd01ldGhvZC5vcmlnaW5hbCgpLCByYXdNZXRob2QucGFyYW1ldGVycywgdHJ1ZSksCiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQlzZXZlcml0eSwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQkJbG9jYXRpb24uc291cmNlRW5kKTsgICAgCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogICAgIH0gZWxzZSB7CiAJCXRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uVW5zYWZlUmF3TWV0aG9kSW52b2NhdGlvbiwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCkuaXNWYXJhcmdzKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKSwgcmF3TWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKSwKIAkJCQluZXcgU3RyaW5nKHJhd01ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhyYXdNZXRob2QuZGVjbGFyaW5nQ2xhc3MuZXJhc3VyZSgpLnJlYWRhYmxlTmFtZSgpKSwKLQkJCSB9LCAKKwkJCSB9LAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKHJhd01ldGhvZC5zZWxlY3RvciksCi0JCQkJdHlwZXNBc1N0cmluZyhyYXdNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgcmF3TWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcocmF3TWV0aG9kLm9yaWdpbmFsKCksIHJhd01ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKHJhd01ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKHJhd01ldGhvZC5kZWNsYXJpbmdDbGFzcy5lcmFzdXJlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQkgfSwKIAkJCXNldmVyaXR5LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCi0JCQlsb2NhdGlvbi5zb3VyY2VFbmQpOyAgICAKKwkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiAgICAgfQogfQogcHVibGljIHZvaWQgdW5zYWZlUmV0dXJuVHlwZU92ZXJyaWRlKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QsIFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwlpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQlyZXR1cm47CisJfQogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5VbnNhZmVSZXR1cm5UeXBlT3ZlcnJpZGUpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAlpbnQgc3RhcnQgPSB0eXBlLnNvdXJjZVN0YXJ0KCk7CkBAIC02NDI5LDM1ICs3MzQyLDM5IEBACiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcoY3VycmVudE1ldGhvZC5yZXR1cm5UeXBlLnJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKGN1cnJlbnRNZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpLmlzVmFyYXJncygpLCBjdXJyZW50TWV0aG9kLm9yaWdpbmFsKCkucGFyYW1ldGVycywgZmFsc2UpLAorCQkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpLCBmYWxzZSksCiAJCQkJbmV3IFN0cmluZyhjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5yZXR1cm5UeXBlLnJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQkJLy9uZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5yZXR1cm5UeXBlLmVyYXN1cmUoKS5yZWFkYWJsZU5hbWUoKSksCi0JCQkgfSwgCisJCQkgfSwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhjdXJyZW50TWV0aG9kLnJldHVyblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhjdXJyZW50TWV0aG9kLnNlbGVjdG9yKSwKLQkJCQl0eXBlc0FzU3RyaW5nKGN1cnJlbnRNZXRob2Qub3JpZ2luYWwoKS5pc1ZhcmFyZ3MoKSwgY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcoY3VycmVudE1ldGhvZC5vcmlnaW5hbCgpLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QucmV0dXJuVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCQkvL25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLnJldHVyblR5cGUuZXJhc3VyZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQlzZXZlcml0eSwKIAkJCXN0YXJ0LAogCQkJZW5kKTsKIH0KIHB1YmxpYyB2b2lkIHVuc2FmZVR5cGVDb252ZXJzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUsIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSkgeworCWlmICh0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSByZXR1cm47IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUyNTkKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVW5zYWZlVHlwZUNvbnZlcnNpb24pOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKKwlpZiAoIXRoaXMub3B0aW9ucy5yZXBvcnRVbmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMgJiYgZXhwcmVzc2lvbi5mb3JjZWRUb0JlUmF3KHRoaXMucmVmZXJlbmNlQ29udGV4dCkpIHsKKwkJcmV0dXJuOworCX0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5zYWZlVHlwZUNvbnZlcnNpb24sCiAJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoZXhwcmVzc2lvblR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLmVyYXN1cmUoKS5yZWFkYWJsZU5hbWUoKSkgfSwKIAkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhleHByZXNzaW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhleHBlY3RlZFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLmVyYXN1cmUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSB9LAogCQlzZXZlcml0eSwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKLQkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOyAgICAKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgdW51c2VkQXJndW1lbnQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2wpIHsKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uQXJndW1lbnRJc05ldmVyVXNlZCk7CkBAIC02NDgwLDE0ICs3Mzk3LDE0IEBACiAJCQlJUHJvYmxlbS5VbnVzZWRDb25zdHJ1Y3RvckRlY2xhcmVkVGhyb3duRXhjZXB0aW9uLAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKG1ldGhvZC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5iaW5kaW5nLmlzVmFyYXJncygpLCBtZXRob2QuYmluZGluZy5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuYmluZGluZywgZmFsc2UpLAogCQkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5yZWFkYWJsZU5hbWUoKSksCi0JCQkgfSwgCisJCQkgfSwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhtZXRob2QuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5iaW5kaW5nLmlzVmFyYXJncygpLCBtZXRob2QuYmluZGluZy5wYXJhbWV0ZXJzLCB0cnVlKSwKKwkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5iaW5kaW5nLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQkgfSwgCisJCQkgfSwKIAkJCXNldmVyaXR5LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwpAQCAtNjQ5NywxNSArNzQxNCwxNSBAQAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKG1ldGhvZC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksCi0JCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuYmluZGluZy5pc1ZhcmFyZ3MoKSwgbWV0aG9kLmJpbmRpbmcucGFyYW1ldGVycywgZmFsc2UpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmJpbmRpbmcsIGZhbHNlKSwKIAkJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUucmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcobWV0aG9kLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmJpbmRpbmcuaXNWYXJhcmdzKCksIG1ldGhvZC5iaW5kaW5nLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmJpbmRpbmcsIHRydWUpLAogCQkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCSB9LCAKKwkJCSB9LAogCQkJc2V2ZXJpdHksCiAJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CkBAIC02NTIxLDcgKzc0MzgsNyBAQAogCQlhcmd1bWVudHMsCiAJCXNldmVyaXR5LAogCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCi0JCWltcG9ydFJlZi5zb3VyY2VFbmQpOyAKKwkJaW1wb3J0UmVmLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bnVzZWRMYWJlbChMYWJlbGVkU3RhdGVtZW50IHN0YXRlbWVudCkgewogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5VbnVzZWRMYWJlbCk7CkBAIC02NTQ3LDU2ICs3NDY0LDc0IEBACiAJCWxvY2FsRGVjbC5zb3VyY2VTdGFydCwKIAkJbG9jYWxEZWNsLnNvdXJjZUVuZCk7CiB9CitwdWJsaWMgdm9pZCB1bnVzZWRPYmplY3RBbGxvY2F0aW9uKEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVudXNlZE9iamVjdEFsbG9jYXRpb24sIAorCQlOb0FyZ3VtZW50LCAKKwkJTm9Bcmd1bWVudCwgCisJCWFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZVN0YXJ0LCAKKwkJYWxsb2NhdGlvbkV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIHVudXNlZFByaXZhdGVDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbCkgewotCQorCiAJaW50IHNldmVyaXR5ID0gY29tcHV0ZVNldmVyaXR5KElQcm9ibGVtLlVudXNlZFByaXZhdGVDb25zdHJ1Y3Rvcik7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwotCQkJCQkKKwogCU1ldGhvZEJpbmRpbmcgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvckRlY2wuYmluZGluZzsKIAl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLlVudXNlZFByaXZhdGVDb25zdHJ1Y3RvciwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAotCQkJdHlwZXNBc1N0cmluZyhjb25zdHJ1Y3Rvci5pc1ZhcmFyZ3MoKSwgY29uc3RydWN0b3IucGFyYW1ldGVycywgZmFsc2UpCi0JCSB9LCAKKwkJCXR5cGVzQXNTdHJpbmcoY29uc3RydWN0b3IsIGZhbHNlKQorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCQl0eXBlc0FzU3RyaW5nKGNvbnN0cnVjdG9yLmlzVmFyYXJncygpLCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCB0cnVlKQotCQkgfSwgCisJCQl0eXBlc0FzU3RyaW5nKGNvbnN0cnVjdG9yLCB0cnVlKQorCQkgfSwKIAkJc2V2ZXJpdHksCiAJCWNvbnN0cnVjdG9yRGVjbC5zb3VyY2VTdGFydCwKIAkJY29uc3RydWN0b3JEZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bnVzZWRQcml2YXRlRmllbGQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKLQkKKwogCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5VbnVzZWRQcml2YXRlRmllbGQpOwogCWlmIChzZXZlcml0eSA9PSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUpIHJldHVybjsKIAogCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkRGVjbC5iaW5kaW5nOwotCQorCiAJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuU0VSSUFMVkVSU0lPTlVJRCwgZmllbGQubmFtZSkKIAkJCSYmIGZpZWxkLmlzU3RhdGljKCkKIAkJCSYmIGZpZWxkLmlzRmluYWwoKQogCQkJJiYgVHlwZUJpbmRpbmcuTE9ORyA9PSBmaWVsZC50eXBlKSB7Ci0JCQkJcmV0dXJuOyAvLyBkbyBub3QgcmVwb3J0IHVudXNlZCBzZXJpYWxWZXJzaW9uVUlEIGZpZWxkCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IGZpZWxkLmRlY2xhcmluZ0NsYXNzOworCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAocmVmZXJlbmNlQmluZGluZy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhSW9TZXJpYWxpemFibGUsIGZhbHNlIC8qU2VyaWFsaXphYmxlIGlzIG5vdCBhIGNsYXNzKi8pICE9IG51bGwpIHsKKwkJCQlyZXR1cm47IC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgZm9yIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKKwkJCX0KKwkJfQogCX0KIAlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoVHlwZUNvbnN0YW50cy5TRVJJQUxQRVJTSVNURU5URklFTERTLCBmaWVsZC5uYW1lKQogCQkJJiYgZmllbGQuaXNTdGF0aWMoKQogCQkJJiYgZmllbGQuaXNGaW5hbCgpCiAJCQkmJiBmaWVsZC50eXBlLmRpbWVuc2lvbnMoKSA9PSAxCiAJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkNoYXJBcnJheV9KQVZBX0lPX09CSkVDVFNUUkVBTUZJRUxELCBmaWVsZC50eXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuOyAvLyBkbyBub3QgcmVwb3J0IHVudXNlZCBzZXJpYWxQZXJzaXN0ZW50RmllbGRzIGZpZWxkCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IGZpZWxkLmRlY2xhcmluZ0NsYXNzOworCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAocmVmZXJlbmNlQmluZGluZy5maW5kU3VwZXJUeXBlT3JpZ2luYXRpbmdGcm9tKFR5cGVJZHMuVF9KYXZhSW9TZXJpYWxpemFibGUsIGZhbHNlIC8qU2VyaWFsaXphYmxlIGlzIG5vdCBhIGNsYXNzKi8pICE9IG51bGwpIHsKKwkJCQlyZXR1cm47IC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgZm9yIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKKwkJCX0KKwkJfQogCX0KIAl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLlVudXNlZFByaXZhdGVGaWVsZCwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAogCQkJbmV3IFN0cmluZyhmaWVsZC5uYW1lKSwKLQkJIH0sIAorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKGZpZWxkLm5hbWUpLAotCQkgfSwgCisJCSB9LAogCQlzZXZlcml0eSwKIAkJbm9kZVNvdXJjZVN0YXJ0KGZpZWxkLCBmaWVsZERlY2wpLAogCQlub2RlU291cmNlRW5kKGZpZWxkLCBmaWVsZERlY2wpKTsKQEAgLTY2MDUsOSArNzU0MCw5IEBACiAKIAlpbnQgc2V2ZXJpdHkgPSBjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVW51c2VkUHJpdmF0ZU1ldGhvZCk7CiAJaWYgKHNldmVyaXR5ID09IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSkgcmV0dXJuOwotCQorCiAJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2REZWNsLmJpbmRpbmc7Ci0JCisKIAkvLyBubyByZXBvcnQgZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydCAndm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtKScKIAlpZiAoIW1ldGhvZC5pc1N0YXRpYygpCiAJCQkmJiBUeXBlQmluZGluZy5WT0lEID09IG1ldGhvZC5yZXR1cm5UeXBlCkBAIC02NjQ1LDEzICs3NTgwLDEzIEBACiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksCi0JCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIGZhbHNlKQotCQkgfSwgCisJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpCisJCSB9LAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCiAJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksCi0JCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpCi0JCSB9LCAKKwkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKQorCQkgfSwKIAkJc2V2ZXJpdHksCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKQEAgLTY2NjUsMjEgKzc2MDAsMzAgQEAKIAkJCUlQcm9ibGVtLlVudXNlZFByaXZhdGVUeXBlLAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJc2V2ZXJpdHksCiAJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAogCQl0eXBlRGVjbC5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgdW51c2VkV2FybmluZ1Rva2VuKEV4cHJlc3Npb24gdG9rZW4pIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyB0b2tlbi5jb25zdGFudC5zdHJpbmdWYWx1ZSgpIH07CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVudXNlZFdhcm5pbmdUb2tlbiwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCisJCXRva2VuLnNvdXJjZVN0YXJ0LAorCQl0b2tlbi5zb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgdXNlQXNzZXJ0QXNBbklkZW50aWZpZXIoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlVzZUFzc2VydEFzQW5JZGVudGlmaWVyLAogCQlOb0FyZ3VtZW50LAogCQlOb0FyZ3VtZW50LAogCQlzb3VyY2VTdGFydCwKLQkJc291cmNlRW5kKTsJCisJCXNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1c2VFbnVtQXNBbklkZW50aWZpZXIoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5oYW5kbGUoCkBAIC02Njg3LDcgKzc2MzEsNyBAQAogCQlOb0FyZ3VtZW50LAogCQlOb0FyZ3VtZW50LAogCQlzb3VyY2VTdGFydCwKLQkJc291cmNlRW5kKTsJCisJCXNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB2YXJhcmdzQXJndW1lbnROZWVkQ2FzdChNZXRob2RCaW5kaW5nIG1ldGhvZCwgVHlwZUJpbmRpbmcgYXJndW1lbnRUeXBlLCBJbnZvY2F0aW9uU2l0ZSBsb2NhdGlvbikgewogCWludCBzZXZlcml0eSA9IHRoaXMub3B0aW9ucy5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QpOwpAQCAtNjY5NywxOCArNzY0MSwxOCBAQAogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLkNvbnN0cnVjdG9yVmFyYXJnc0FyZ3VtZW50TmVlZENhc3QsCiAJCQluZXcgU3RyaW5nW10gewotCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50VHlwZS5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQluZXcgU3RyaW5nKHZhcmFyZ3NUeXBlLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5lbGVtZW50c1R5cGUoKS5yZWFkYWJsZU5hbWUoKSksIAorCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50VHlwZS5yZWFkYWJsZU5hbWUoKSksCisJCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSksCisJCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuZWxlbWVudHNUeXBlKCkucmVhZGFibGVOYW1lKCkpLAogCQkJfSwKIAkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCW5ldyBTdHJpbmcoYXJndW1lbnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCB0cnVlKSwgCi0JCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuZWxlbWVudHNUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSksIAorCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50VHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSwKKwkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5lbGVtZW50c1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCX0sCiAJCQlzZXZlcml0eSwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0KCksCkBAIC02NzE2LDIwICs3NjYwLDIwIEBACiAJfSBlbHNlIHsKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5NZXRob2RWYXJhcmdzQXJndW1lbnROZWVkQ2FzdCwKLQkJCW5ldyBTdHJpbmdbXSB7IAotCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50VHlwZS5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQluZXcgU3RyaW5nKHZhcmFyZ3NUeXBlLnJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgCi0JCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpLCAKLQkJCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCAKLQkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5lbGVtZW50c1R5cGUoKS5yZWFkYWJsZU5hbWUoKSksIAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJbmV3IFN0cmluZyhhcmd1bWVudFR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJCQluZXcgU3RyaW5nKHZhcmFyZ3NUeXBlLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAorCQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZCwgZmFsc2UpLAorCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuZWxlbWVudHNUeXBlKCkucmVhZGFibGVOYW1lKCkpLAogCQkJfSwKLQkJCW5ldyBTdHJpbmdbXSB7IAotCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50VHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIAotCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgdHJ1ZSksIAotCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgCi0JCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuZWxlbWVudHNUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSksIAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJbmV3IFN0cmluZyhhcmd1bWVudFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJCW5ldyBTdHJpbmcodmFyYXJnc1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgdHlwZXNBc1N0cmluZyhtZXRob2QsIHRydWUpLAorCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCQkJbmV3IFN0cmluZyh2YXJhcmdzVHlwZS5lbGVtZW50c1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCX0sCiAJCQlzZXZlcml0eSwKIAkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0KCksCkBAIC02NzM5LDIzICs3NjgzLDUwIEBACiBwdWJsaWMgdm9pZCB2YXJhcmdzQ29uZmxpY3QoTWV0aG9kQmluZGluZyBtZXRob2QxLCBNZXRob2RCaW5kaW5nIG1ldGhvZDIsIFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVmFyYXJnc0NvbmZsaWN0LAotCQluZXcgU3RyaW5nW10geyAKKwkJbmV3IFN0cmluZ1tdIHsKIAkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZDEuc2VsZWN0b3IpLAotCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kMS5pc1ZhcmFyZ3MoKSwgbWV0aG9kMS5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QxLCBmYWxzZSksCiAJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2QxLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKLQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZDIuaXNWYXJhcmdzKCksIG1ldGhvZDIucGFyYW1ldGVycywgZmFsc2UpLAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kMiwgZmFsc2UpLAogCQkgICAgICAgIG5ldyBTdHJpbmcobWV0aG9kMi5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSkKIAkJfSwKLQkJbmV3IFN0cmluZ1tdIHsgCisJCW5ldyBTdHJpbmdbXSB7CiAJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2QxLnNlbGVjdG9yKSwKLQkJICAgICAgICB0eXBlc0FzU3RyaW5nKG1ldGhvZDEuaXNWYXJhcmdzKCksIG1ldGhvZDEucGFyYW1ldGVycywgdHJ1ZSksCisJCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QxLCB0cnVlKSwKIAkJICAgICAgICBuZXcgU3RyaW5nKG1ldGhvZDEuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCi0JCSAgICAgICAgdHlwZXNBc1N0cmluZyhtZXRob2QyLmlzVmFyYXJncygpLCBtZXRob2QyLnBhcmFtZXRlcnMsIHRydWUpLAorCQkgICAgICAgIHR5cGVzQXNTdHJpbmcobWV0aG9kMiwgdHJ1ZSksCiAJCSAgICAgICAgbmV3IFN0cmluZyhtZXRob2QyLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpCiAJCX0sCiAJCW1ldGhvZDEuZGVjbGFyaW5nQ2xhc3MgPT0gdHlwZSA/IG1ldGhvZDEuc291cmNlU3RhcnQoKSA6IHR5cGUuc291cmNlU3RhcnQoKSwKIAkJbWV0aG9kMS5kZWNsYXJpbmdDbGFzcyA9PSB0eXBlID8gbWV0aG9kMS5zb3VyY2VFbmQoKSA6IHR5cGUuc291cmNlRW5kKCkpOwogfQorcHVibGljIHZvaWQgc2FmZVZhcmFyZ3NPbkZpeGVkQXJpdHlNZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwlTdHJpbmcgW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkgOiBtZXRob2Quc2VsZWN0b3IpfTsgCisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlNhZmVWYXJhcmdzT25GaXhlZEFyaXR5TWV0aG9kLAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKKwkJbWV0aG9kLnNvdXJjZVN0YXJ0KCksCisJCW1ldGhvZC5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBzYWZlVmFyYXJnc09uTm9uRmluYWxJbnN0YW5jZU1ldGhvZChNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCVN0cmluZyBbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgPyBtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSA6IG1ldGhvZC5zZWxlY3Rvcil9OyAKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uU2FmZVZhcmFyZ3NPbk5vbkZpbmFsSW5zdGFuY2VNZXRob2QsCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAorCQltZXRob2Quc291cmNlU3RhcnQoKSwKKwkJbWV0aG9kLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIHBvc3NpYmxlSGVhcFBvbGx1dGlvbkZyb21WYXJhcmcoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmFyZykgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJhcmcubmFtZSl9OworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Qb3RlbnRpYWxIZWFwUG9sbHV0aW9uRnJvbVZhcmFyZywKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCisJCXZhcmFyZy5zb3VyY2VTdGFydCwKKwkJdmFyYXJnLnNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCB2YXJpYWJsZVR5cGVDYW5ub3RCZVZvaWQoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhckRlY2wpIHsKIAlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodmFyRGVjbC5uYW1lKX07CiAJdGhpcy5oYW5kbGUoCkBAIC02Nzg3LDEyICs3NzU4LDEyIEBACiBwdWJsaWMgdm9pZCB3aWxkY2FyZEFzc2lnbm1lbnQoVHlwZUJpbmRpbmcgdmFyaWFibGVUeXBlLCBUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSwgQVNUTm9kZSBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5XaWxkY2FyZEZpZWxkQXNzaWdubWVudCwKLQkJbmV3IFN0cmluZ1tdIHsgCisJCW5ldyBTdHJpbmdbXSB7CiAJCSAgICAgICAgbmV3IFN0cmluZyhleHByZXNzaW9uVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodmFyaWFibGVUeXBlLnJlYWRhYmxlTmFtZSgpKSB9LAotCQluZXcgU3RyaW5nW10geyAKKwkJbmV3IFN0cmluZ1tdIHsKIAkJICAgICAgICBuZXcgU3RyaW5nKGV4cHJlc3Npb25UeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHZhcmlhYmxlVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSB9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKLQkJbG9jYXRpb24uc291cmNlRW5kKTsgICAgCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB3aWxkY2FyZEludm9jYXRpb24oQVNUTm9kZSBsb2NhdGlvbiwgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBNZXRob2RCaW5kaW5nIG1ldGhvZCwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMpIHsKIAlUeXBlQmluZGluZyBvZmZlbmRpbmdBcmd1bWVudCA9IG51bGw7CkBAIC02ODA1LDY3ICs3Nzc2LDEzNCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JCi0gICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKworCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7CiAJCXRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uV2lsZGNhcmRDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcocmVjZWl2ZXJUeXBlLnNvdXJjZU5hbWUoKSksCi0JCQkJdHlwZXNBc1N0cmluZyhtZXRob2QuaXNWYXJhcmdzKCksIG1ldGhvZC5wYXJhbWV0ZXJzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhtZXRob2QsIGZhbHNlKSwKIAkJCQluZXcgU3RyaW5nKHJlY2VpdmVyVHlwZS5yZWFkYWJsZU5hbWUoKSksCi0JCQkJdHlwZXNBc1N0cmluZyhmYWxzZSwgYXJndW1lbnRzLCBmYWxzZSksCisJCQkJdHlwZXNBc1N0cmluZyhhcmd1bWVudHMsIGZhbHNlKSwKIAkJCQluZXcgU3RyaW5nKG9mZmVuZGluZ0FyZ3VtZW50LnJlYWRhYmxlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKG9mZmVuZGluZ1BhcmFtZXRlci5yZWFkYWJsZU5hbWUoKSksCi0JCQkgfSwgCisJCQkgfSwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhyZWNlaXZlclR5cGUuc291cmNlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKHJlY2VpdmVyVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudHMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcoYXJndW1lbnRzLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKG9mZmVuZGluZ0FyZ3VtZW50LnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJCW5ldyBTdHJpbmcob2ZmZW5kaW5nUGFyYW1ldGVyLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKLQkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7ICAgIAorCQkJbG9jYXRpb24uc291cmNlRW5kKTsKICAgICB9IGVsc2UgewogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLldpbGRjYXJkTWV0aG9kSW52b2NhdGlvbiwKIAkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAotCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLmlzVmFyYXJncygpLCBtZXRob2QucGFyYW1ldGVycywgZmFsc2UpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCBmYWxzZSksCiAJCQkJbmV3IFN0cmluZyhyZWNlaXZlclR5cGUucmVhZGFibGVOYW1lKCkpLAotCQkJCXR5cGVzQXNTdHJpbmcoZmFsc2UsIGFyZ3VtZW50cywgZmFsc2UpLAorCQkJCXR5cGVzQXNTdHJpbmcoYXJndW1lbnRzLCBmYWxzZSksCiAJCQkJbmV3IFN0cmluZyhvZmZlbmRpbmdBcmd1bWVudC5yZWFkYWJsZU5hbWUoKSksCiAJCQkJbmV3IFN0cmluZyhvZmZlbmRpbmdQYXJhbWV0ZXIucmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQluZXcgU3RyaW5nW10gewogCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwKLQkJCQl0eXBlc0FzU3RyaW5nKG1ldGhvZC5pc1ZhcmFyZ3MoKSwgbWV0aG9kLnBhcmFtZXRlcnMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcobWV0aG9kLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKHJlY2VpdmVyVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJCQl0eXBlc0FzU3RyaW5nKGZhbHNlLCBhcmd1bWVudHMsIHRydWUpLAorCQkJCXR5cGVzQXNTdHJpbmcoYXJndW1lbnRzLCB0cnVlKSwKIAkJCQluZXcgU3RyaW5nKG9mZmVuZGluZ0FyZ3VtZW50LnNob3J0UmVhZGFibGVOYW1lKCkpLAogCQkJCW5ldyBTdHJpbmcob2ZmZW5kaW5nUGFyYW1ldGVyLnNob3J0UmVhZGFibGVOYW1lKCkpLAotCQkJIH0sIAorCQkJIH0sCiAJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKLQkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7ICAgIAorCQkJbG9jYXRpb24uc291cmNlRW5kKTsKICAgICB9CiB9Ci1wdWJsaWMgdm9pZCB3cm9uZ1NlcXVlbmNlT2ZFeGNlcHRpb25UeXBlc0Vycm9yKFRyeVN0YXRlbWVudCBzdGF0ZW1lbnQsIFR5cGVCaW5kaW5nIGV4Y2VwdGlvblR5cGUsIGludCB1bmRlciwgVHlwZUJpbmRpbmcgaGlkaW5nRXhjZXB0aW9uVHlwZSkgeworcHVibGljIHZvaWQgd3JvbmdTZXF1ZW5jZU9mRXhjZXB0aW9uVHlwZXNFcnJvcihUeXBlUmVmZXJlbmNlIHR5cGVSZWYsIFR5cGVCaW5kaW5nIGV4Y2VwdGlvblR5cGUsIFR5cGVCaW5kaW5nIGhpZGluZ0V4Y2VwdGlvblR5cGUpIHsKIAkvL3RoZSB0d28gY2F0Y2ggYmxvY2sgdW5kZXIgYW5kIHVwcGVyIGFyZSBpbiBhbiBpbmNvcnJlY3Qgb3JkZXIuCiAJLy91bmRlciBzaG91bGQgYmUgZGVmaW5lIEJFRk9SRSB1cHBlciBpbiB0aGUgc291cmNlCiAKLQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBzdGF0ZW1lbnQuY2F0Y2hBcmd1bWVudHNbdW5kZXJdLnR5cGU7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludmFsaWRDYXRjaEJsb2NrU2VxdWVuY2UsCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUucmVhZGFibGVOYW1lKCkpLAogCQkJbmV3IFN0cmluZyhoaWRpbmdFeGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJbmV3IFN0cmluZ1tdIHsKIAkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKIAkJCW5ldyBTdHJpbmcoaGlkaW5nRXhjZXB0aW9uVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKLQkJIH0sIAorCQkgfSwKIAkJdHlwZVJlZi5zb3VyY2VTdGFydCwKIAkJdHlwZVJlZi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgd3JvbmdTZXF1ZW5jZU9mRXhjZXB0aW9uVHlwZXMoVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBUeXBlQmluZGluZyBleGNlcHRpb25UeXBlLCBUeXBlQmluZGluZyBoaWRpbmdFeGNlcHRpb25UeXBlKSB7CisJLy8gdHlwZSByZWZlcmVuY2VzIGluc2lkZSBhIG11bHRpLWNhdGNoIGJsb2NrIGFyZSBub3Qgb2YgdW5pb24gdHlwZQorCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkVW5pb25UeXBlUmVmZXJlbmNlU2VxdWVuY2UsCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJbmV3IFN0cmluZyhoaWRpbmdFeGNlcHRpb25UeXBlLnJlYWRhYmxlTmFtZSgpKSwKKwkJIH0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQluZXcgU3RyaW5nKGhpZGluZ0V4Y2VwdGlvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCSB9LAorCQl0eXBlUmVmLnNvdXJjZVN0YXJ0LAorCQl0eXBlUmVmLnNvdXJjZUVuZCk7CiB9CisKK3B1YmxpYyB2b2lkIGF1dG9NYW5hZ2VkUmVzb3VyY2VzTm90QmVsb3cxNyhMb2NhbERlY2xhcmF0aW9uW10gcmVzb3VyY2VzKSB7CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5BdXRvTWFuYWdlZFJlc291cmNlTm90QmVsb3cxNywKKwkJCU5vQXJndW1lbnQsCisJCQlOb0FyZ3VtZW50LAorCQkJcmVzb3VyY2VzWzBdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCisJCQlyZXNvdXJjZXNbcmVzb3VyY2VzLmxlbmd0aCAtIDFdLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhbm5vdEluZmVyRWxpZGVkVHlwZXMoQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwlTdHJpbmcgYXJndW1lbnRzIFtdID0gbmV3IFN0cmluZyBbXSB7IGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUudG9TdHJpbmcoKSB9OworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uQ2Fubm90SW5mZXJFbGlkZWRUeXBlcywKKwkJCWFyZ3VtZW50cywKKwkJCWFyZ3VtZW50cywKKwkJCWFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZVN0YXJ0LCAKKwkJCWFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBkaWFtb25kTm90V2l0aEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cykgeworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uQ2Fubm90VXNlRGlhbW9uZFdpdGhFeHBsaWNpdFR5cGVBcmd1bWVudHMsCisJCQlOb0FyZ3VtZW50LAorCQkJTm9Bcmd1bWVudCwKKwkJCXR5cGVBcmd1bWVudHNbMF0uc291cmNlU3RhcnQsIAorCQkJdHlwZUFyZ3VtZW50c1t0eXBlQXJndW1lbnRzLmxlbmd0aCAtIDFdLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBkaWFtb25kTm90V2l0aEFub3ltb3VzQ2xhc3NlcyhUeXBlUmVmZXJlbmNlIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkNhbm5vdFVzZURpYW1vbmRXaXRoQW5vbnltb3VzQ2xhc3NlcywKKwkJCU5vQXJndW1lbnQsCisJCQlOb0FyZ3VtZW50LAorCQkJdHlwZS5zb3VyY2VTdGFydCwgCisJCQl0eXBlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCByZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKEFTVE5vZGUgbG9jYXRpb24sIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcykgeworCWludCBzZXZlcml0eSA9IGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5SZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzKTsKKwlpZiAoc2V2ZXJpdHkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlKSB7CisJCWludCBzb3VyY2VTdGFydCA9IC0xOworCQlpZiAobG9jYXRpb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHJlZiA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKWxvY2F0aW9uOworCQkJc291cmNlU3RhcnQgPSAoaW50KSAocmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdID4+IDMyKTsKKwkJfSBlbHNlIHsKKwkJCXNvdXJjZVN0YXJ0ID0gbG9jYXRpb24uc291cmNlU3RhcnQ7CisJCX0KKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5SZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzLAorCQkJbmV3IFN0cmluZ1tdIHt0eXBlc0FzU3RyaW5nKGFyZ3VtZW50VHlwZXMsIGZhbHNlKX0sCisJCQluZXcgU3RyaW5nW10ge3R5cGVzQXNTdHJpbmcoYXJndW1lbnRUeXBlcywgdHJ1ZSl9LAorCQkJc2V2ZXJpdHksCisJCQlzb3VyY2VTdGFydCwKKwkJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisgICAgfQorfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1TZXZlcml0aWVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtU2V2ZXJpdGllcy5qYXZhCmluZGV4IGUyMWIxY2UuLjU2NzYxNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1TZXZlcml0aWVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVNldmVyaXRpZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw4ICsxMSw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtOwogCiBwdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1TZXZlcml0aWVzIHsKLQkKLQlmaW5hbCBpbnQgSWdub3JlID0gLTE7IC8vIGR1cmluZyBoYW5kbGluZyBvbmx5CisKKwlmaW5hbCBpbnQgSWdub3JlID0gMjU2OyAvLyBkdXJpbmcgaGFuZGxpbmcgb25seQogCWZpbmFsIGludCBXYXJuaW5nID0gMDsgLy8gZHVyaW5nIGhhbmRsaW5nIG9ubHkKIAogCWZpbmFsIGludCBFcnJvciA9IDE7IC8vIHdoZW4gYml0IGlzIHNldDogcHJvYmxlbSBpcyBlcnJvciwgaWYgbm90IGl0IGlzIGEgd2FybmluZwpAQCAtMjMsNSArMjMsNSBAQAogCWZpbmFsIGludCBBYm9ydCA9IDMwOyAvLyAycjExMTEwCiAJZmluYWwgaW50IE9wdGlvbmFsID0gMzI7IC8vIHdoZW4gYml0IGlzIHNldDogcHJvYmxlbSB3YXMgY29uZmlndXJhYmxlCiAJZmluYWwgaW50IFNlY29uZGFyeUVycm9yID0gNjQ7Ci0JZmluYWwgaW50IEZhdGFsID0gMTI4OyAvLyB3aGVuIGJpdCBpcyBzZXQ6IHByb2JsZW0gd2FzIGVpdGhlciBhIG1hbmRhdG9yeSBlcnJvciwgb3IgYW4gb3B0aW9uYWwrdHJlYXRPcHRpb25hbEVycm9yQXNGYXRhbAkKKwlmaW5hbCBpbnQgRmF0YWwgPSAxMjg7IC8vIHdoZW4gYml0IGlzIHNldDogcHJvYmxlbSB3YXMgZWl0aGVyIGEgbWFuZGF0b3J5IGVycm9yLCBvciBhbiBvcHRpb25hbCt0cmVhdE9wdGlvbmFsRXJyb3JBc0ZhdGFsCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9TaG91bGROb3RJbXBsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCmluZGV4IGUzYjU5ZWEuLjhlMGU3NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CiAKIC8qCi0gKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogU3BlY2lhbCB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUgdXNlZAogICogdG8gZGVub3RlIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuCiAgKgogICoJKGludGVybmFsIG9ubHkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vbWVzc2FnZXMucHJvcGVydGllcwppbmRleCA2NDRmN2ZhLi5jYzc0MzYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDggQEAKICMKICMgQ29udHJpYnV0b3JzOgogIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCQlCZW5qYW1pbiBNdXNrYWxsYSAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDIzOTA2NgorIwkJU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMTg1NjgyIC0gSW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgbWFyayBsb2NhbCB2YXJpYWJsZXMgYXMgcmVhZAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogMCA9IHswfQogMSA9IHN1cGVyIGNhbm5vdCBiZSB1c2VkIGluIGphdmEubGFuZy5PYmplY3QKQEAgLTMzLDcgKzM1LDcgQEAKIDI4ID0gTm8gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IGlzIGF2YWlsYWJsZSBkdWUgdG8gc29tZSBpbnRlcm1lZGlhdGUgY29uc3RydWN0b3IgaW52b2NhdGlvbgogMjkgPSBBbiBhbm9ueW1vdXMgY2xhc3MgY2Fubm90IHN1YmNsYXNzIHRoZSBmaW5hbCBjbGFzcyB7MH0KIDMwID0gVGhlIG1lbWJlciBhbm5vdGF0aW9uIHswfSBjYW4gb25seSBiZSBkZWZpbmVkIGluc2lkZSBhIHRvcC1sZXZlbCBjbGFzcyBvciBpbnRlcmZhY2UKLTMxID0gVGhlIG1lbWJlciBlbnVtIHswfSBjYW5ub3QgYmUgbG9jYWwKKzMxID0gVGhlIG1lbWJlciBlbnVtIHswfSBjYW4gb25seSBiZSBkZWZpbmVkIGluc2lkZSBhIHRvcC1sZXZlbCBjbGFzcyBvciBpbnRlcmZhY2UKIDMyID0gVGhlIG1lbWJlciBlbnVtIHswfSBtdXN0IGJlIGRlZmluZWQgaW5zaWRlIGEgc3RhdGljIG1lbWJlciB0eXBlCiAzMyA9IFRoZSB0eXBlIHswfSBpcyBoaWRpbmcgdGhlIHR5cGUgezF9CiAKQEAgLTQ4LDggKzUwLDggQEAKIDU4ID0gVGhlIGZpbmFsIGxvY2FsIHZhcmlhYmxlIHswfSBjYW5ub3QgYmUgYXNzaWduZWQuIEl0IG11c3QgYmUgYmxhbmsgYW5kIG5vdCB1c2luZyBhIGNvbXBvdW5kIGFzc2lnbm1lbnQKIDU5ID0gVGhlIHBhcmFtZXRlciB7MH0gc2hvdWxkIG5vdCBiZSBhc3NpZ25lZAogNjAgPSBUaGUgZmluYWwgbG9jYWwgdmFyaWFibGUgezB9IGNhbm5vdCBiZSBhc3NpZ25lZCwgc2luY2UgaXQgaXMgZGVmaW5lZCBpbiBhbiBlbmNsb3NpbmcgdHlwZQotNjEgPSBUaGUgbG9jYWwgdmFyaWFibGUgezB9IGlzIG5ldmVyIHJlYWQKLTYyID0gVGhlIHBhcmFtZXRlciB7MH0gaXMgbmV2ZXIgcmVhZAorNjEgPSBUaGUgdmFsdWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHswfSBpcyBub3QgdXNlZAorNjIgPSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB7MH0gaXMgbm90IHVzZWQKIDYzID0gVGhlIGNvZGUgb2YgbWV0aG9kIHswfSh7MX0pIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQKIDY0ID0gVGhlIGNvZGUgZm9yIHRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIgaXMgZXhjZWVkaW5nIHRoZSA2NTUzNSBieXRlcyBsaW1pdAogNjUgPSBUb28gbWFueSBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXIgezB9IGlzIGV4Y2VlZGluZyB0aGUgbGltaXQgb2YgMjU1IHdvcmRzIGVsaWdpYmxlIGZvciBtZXRob2QgcGFyYW1ldGVycwpAQCAtNjQsMTIgKzY2LDEzIEBACiA3NCA9IENhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyBmaWVsZCB7MH0KIDc1ID0gQ2Fubm90IHJlZmVyZW5jZSBhIGZpZWxkIGJlZm9yZSBpdCBpcyBkZWZpbmVkCiA3NiA9IFRoZSBzdGF0aWMgZmllbGQgezB9LnsxfSBzaG91bGQgYmUgYWNjZXNzZWQgaW4gYSBzdGF0aWMgd2F5Ci03NyA9IFRoZSBmaWVsZCB7MH0uezF9IGlzIG5ldmVyIHJlYWQgbG9jYWxseQorNzcgPSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIHswfS57MX0gaXMgbm90IHVzZWQKIDc4ID0gVGhlIHN0YXRpYyBmaWVsZCB7MH0uezF9IHNob3VsZCBiZSBhY2Nlc3NlZCBkaXJlY3RseQogNzkgPSBVbnF1YWxpZmllZCBhY2Nlc3MgdG8gdGhlIGZpZWxkIHswfS57MX0gCiA4MCA9IFRoZSBmaW5hbCBmaWVsZCB7MH0uezF9IGNhbm5vdCBiZSBhc3NpZ25lZAogODEgPSBUaGUgYmxhbmsgZmluYWwgZmllbGQgezB9IG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkCiA4MiA9IFRoZSBmaW5hbCBmaWVsZCB7MH0gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkCis4MyA9IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB2YXJpYWJsZQogCiA5MCA9IFRoZSBsb2NhbCB2YXJpYWJsZSB7MH0gaXMgaGlkaW5nIGFub3RoZXIgbG9jYWwgdmFyaWFibGUgZGVmaW5lZCBpbiBhbiBlbmNsb3NpbmcgdHlwZSBzY29wZQogOTEgPSBUaGUgbG9jYWwgdmFyaWFibGUgezB9IGlzIGhpZGluZyBhIGZpZWxkIGZyb20gdHlwZSB7MX0KQEAgLTk5LDcgKzEwMiwxMSBAQAogMTE3ID0gVGhlIHN0YXRpYyBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheQogMTE4ID0gVGhlIG1ldGhvZCB7MX0oezJ9KSBmcm9tIHRoZSB0eXBlIHswfSBpcyBuZXZlciB1c2VkIGxvY2FsbHkKIDExOSA9IFRoZSBzdGF0aWMgbWV0aG9kIHsxfSh7Mn0pIGZyb20gdGhlIHR5cGUgezB9IHNob3VsZCBiZSBhY2Nlc3NlZCBkaXJlY3RseSAKKzEyMCA9IFRoZSBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gcmVmZXJzIHRvIHRoZSBtaXNzaW5nIHR5cGUgezN9CisxMjEgPSBUaGUgbWV0aG9kIHsxfSh7Mn0pIGZyb20gdGhlIHR5cGUgezB9IGNhbiBiZSBkZWNsYXJlZCBhcyBzdGF0aWMKKzEyMiA9IFRoZSBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gY2FuIHBvdGVudGlhbGx5IGJlIGRlY2xhcmVkIGFzIHN0YXRpYwogCisxMjkgPSBUaGUgY29uc3RydWN0b3IgezB9KHsxfSkgcmVmZXJzIHRvIHRoZSBtaXNzaW5nIHR5cGUgezJ9CiAxMzAgPSBUaGUgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgdW5kZWZpbmVkCiAxMzEgPSBUaGUgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgbm90IHZpc2libGUKIDEzMiA9IFRoZSBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBhbWJpZ3VvdXMKQEAgLTExOSw2ICsxMjYsOSBAQAogMTQ2ID0gRGVmYXVsdCBjb25zdHJ1Y3RvciBjYW5ub3QgaGFuZGxlIGV4Y2VwdGlvbiB0eXBlIHswfSB0aHJvd24gYnkgaW1wbGljaXQgc3VwZXIgY29uc3RydWN0b3IuIE11c3QgZGVmaW5lIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yCiAxNDcgPSBVbmhhbmRsZWQgZXhjZXB0aW9uIHR5cGUgezB9IHRocm93biBieSBpbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvcgogCisKKzE0OCA9IFRoZSBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5ldmVyIHVzZWQKKzE0OSA9IERlYWQgY29kZQogMTUwID0gVGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBhcnJheSB0eXBlIGJ1dCBpdCByZXNvbHZlZCB0byB7MH0KIDE1MSA9IE11c3QgZXhwbGljaXRseSBjb252ZXJ0IHRoZSBjaGFyW10gdG8gYSBTdHJpbmcKIDE1MiA9IFN0cmluZyBjb25zdGFudCBpcyBleGNlZWRpbmcgdGhlIGxpbWl0IG9mIDY1NTM1IGJ5dGVzIG9mIFVURjggZW5jb2RpbmcKQEAgLTEzNyw3ICsxNDcsNyBAQAogMTY2ID0gVGhlIGRlZmF1bHQgY2FzZSBpcyBhbHJlYWR5IGRlZmluZWQKIDE2NyA9IFVucmVhY2hhYmxlIGNhdGNoIGJsb2NrIGZvciB7MH0uIFRoaXMgZXhjZXB0aW9uIGlzIG5ldmVyIHRocm93biBmcm9tIHRoZSB0cnkgc3RhdGVtZW50IGJvZHkKIDE2OCA9IFVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSB7MH0KLTE2OSA9IENhbm5vdCBzd2l0Y2ggb24gYSB2YWx1ZSBvZiB0eXBlIHswfS4gT25seSBpbnQgdmFsdWVzIG9yIGVudW0gY29uc3RhbnRzIGFyZSBwZXJtaXR0ZWQKKzE2OSA9IENhbm5vdCBzd2l0Y2ggb24gYSB2YWx1ZSBvZiB0eXBlIHswfS4gT25seSBjb252ZXJ0aWJsZSBpbnQgdmFsdWVzIG9yIGVudW0gY29uc3RhbnRzIGFyZSBwZXJtaXR0ZWQKIDE3MCA9IER1cGxpY2F0ZSBjYXNlCiAxNzEgPSBEdXBsaWNhdGUgbGFiZWwgezB9CiAxNzIgPSBicmVhayBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgbG9vcCBvciBhIHN3aXRjaApAQCAtMTU4LDExICsxNjgsMTEgQEAKIDE4NyA9IFVucmVhY2hhYmxlIGNhdGNoIGJsb2NrIGZvciB7MH0uIEl0IGlzIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgY2F0Y2ggYmxvY2sgZm9yIHsxfQogMTg4ID0gRW1wdHkgY29udHJvbC1mbG93IHN0YXRlbWVudAogMTg5ID0gU3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlIGNsYXVzZS4gVGhlIGNvcnJlc3BvbmRpbmcgdGhlbiBjbGF1c2UgZG9lcyBub3QgY29tcGxldGUgbm9ybWFsbHkKLTE5MCA9IFJlYWQgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCB7MH0uezF9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZC4gSW5jcmVhc2luZyBpdHMgdmlzaWJpbGl0eSB3aWxsIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZQotMTkxID0gV3JpdGUgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCB7MH0uezF9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZC4gSW5jcmVhc2luZyBpdHMgdmlzaWJpbGl0eSB3aWxsIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZQotMTkyID0gQWNjZXNzIHRvIGVuY2xvc2luZyBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kLiBJbmNyZWFzaW5nIGl0cyB2aXNpYmlsaXR5IHdpbGwgaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlCi0xOTMgPSBBY2Nlc3MgdG8gZW5jbG9zaW5nIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZC4gSW5jcmVhc2luZyBpdHMgdmlzaWJpbGl0eSB3aWxsIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZQotMTk0ID0gU3dpdGNoIGNhc2UgbWF5IGJlIGVudGVyZWQgYnkgZmFsbGluZyB0aHJvdWdoIHByZXZpb3VzIGNhc2UKKzE5MCA9IFJlYWQgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCB7MH0uezF9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZAorMTkxID0gV3JpdGUgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCB7MH0uezF9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZAorMTkyID0gQWNjZXNzIHRvIGVuY2xvc2luZyBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kCisxOTMgPSBBY2Nlc3MgdG8gZW5jbG9zaW5nIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZAorMTk0ID0gU3dpdGNoIGNhc2UgbWF5IGJlIGVudGVyZWQgYnkgZmFsbGluZyB0aHJvdWdoIHByZXZpb3VzIGNhc2UuIElmIGludGVuZGVkLCBhZGQgYSBuZXcgY29tbWVudCAvLyRGQUxMLVRIUk9VR0gkIG9uIHRoZSBsaW5lIGFib3ZlCiAxOTUgPSBUaGUgbWV0aG9kIHsxfSBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUKIDE5NiA9IFRoZSBmaWVsZCB7MH0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlIAogMTk3ID0gVGhlIHR5cGUgezB9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQpAQCAtMTcxLDcgKzE4MSw3IEBACiAyMDAgPSBDYW5ub3QgdXNlIHswfSBpbiBhIHN0YXRpYyBjb250ZXh0CiAyMDEgPSBDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgbWV0aG9kIHsxfSh7Mn0pIGZyb20gdGhlIHR5cGUgezB9CiAyMDIgPSBDYW5ub3Qgc3BlY2lmeSBhbiBhcnJheSBkaW1lbnNpb24gYWZ0ZXIgYW4gZW1wdHkgZGltZW5zaW9uCi0yMDMgPSBJbnZhbGlkIGNhc3QgZXhwcmVzc2lvbgorIzIwMyA9IEludmFsaWQgY2FzdCBleHByZXNzaW9uCiAyMDQgPSBTeW50YXggZXJyb3Igb24gdG9rZW4gInswfSIsIHsxfSBleHBlY3RlZAogMjA1ID0gU3ludGF4IGVycm9yIG9uIHRva2VuICJ7MH0iLCBubyBhY2N1cmF0ZSBjb3JyZWN0aW9uIGF2YWlsYWJsZQogMjA2ID0gSW52YWxpZCBhcmd1bWVudCB0byBvcGVyYXRpb24gKysvLS0KQEAgLTE3OSw2ICsxODksNyBAQAogMjA4ID0gQXJyYXkgY29uc3RhbnRzIGNhbiBvbmx5IGJlIHVzZWQgaW4gaW5pdGlhbGl6ZXJzCiAyMDkgPSBTeW50YXggZXJyb3Igb24ga2V5d29yZCAiezB9IjsgezF9IGV4cGVjdGVkCiAyMTAgPSBTeW50YXggZXJyb3Igb24ga2V5d29yZCAiezB9Iiwgbm8gYWNjdXJhdGUgY29ycmVjdGlvbiBhdmFpbGFibGUKKzIxMSA9IENvbXBhcmluZyBpZGVudGljYWwgZXhwcmVzc2lvbnMKIAogMjIwID0gVW5tYXRjaGVkIGJyYWNrZXQKIDIyMSA9IFRoZSBwcmltaXRpdmUgdHlwZSB7MH0gb2YgezF9IGRvZXMgbm90IGhhdmUgYSBmaWVsZCB7Mn0KQEAgLTE5MSw3ICsyMDIsNyBAQAogMjMxID0gU3ludGF4IGVycm9yIG9uIHRva2VuICJ7MH0iLCB7MX0gZXhwZWN0ZWQgYWZ0ZXIgdGhpcyB0b2tlbgogMjMyID0gU3ludGF4IGVycm9yIG9uIHRva2VuICJ7MH0iLCBkZWxldGUgdGhpcyB0b2tlbgogMjMzID0gU3ludGF4IGVycm9yIG9uIHRva2VucywgZGVsZXRlIHRoZXNlIHRva2VucwotMjM0ID0gU3ludGF4IGVycm9yIG9uIHRva2VucywgdGhleSBjYW4gYmUgbWVyZ2UgdG8gZm9ybSB7MH0KKzIzNCA9IFN5bnRheCBlcnJvciBvbiB0b2tlbnMsIHRoZXkgY2FuIGJlIG1lcmdlZCB0byBmb3JtIHswfQogMjM1ID0gU3ludGF4IGVycm9yIG9uIHRva2VuICJ7MH0iLCBpbnZhbGlkIHsxfQogMjM2ID0gU3ludGF4IGVycm9yIG9uIHRva2VuKHMpLCBtaXNwbGFjZWQgY29uc3RydWN0KHMpCiAyMzcgPSBTeW50YXggZXJyb3Igb24gdG9rZW5zLCB7MH0gZXhwZWN0ZWQgaW5zdGVhZApAQCAtMjE3LDYgKzIyOCwxMCBAQAogMjYzID0gSW52YWxpZCBsb3cgc3Vycm9nYXRlOiBtdXN0IGJlIHdpdGhpbiAweERDMDAgYW5kIDB4REZGRgogMjY0ID0gSW52YWxpZCBoaWdoIHN1cnJvZ2F0ZTogbXVzdCBiZSB3aXRoaW4gMHhEODAwIGFuZCAweERCRkYKIDI2NSA9IFVubmVjZXNzYXJ5ICROT04tTkxTJCB0YWcKKzI2NiA9IEludmFsaWQgYmluYXJ5IGxpdGVyYWwgbnVtYmVyIChvbmx5ICcwJyBhbmQgJzEnIGFyZSBleHBlY3RlZCkKKzI2NyA9IEJpbmFyeSBsaXRlcmFscyBjYW4gb25seSBiZSB1c2VkIHdpdGggc291cmNlIGxldmVsIDEuNyBvciBncmVhdGVyCisyNjggPSBVbmRlcnNjb3JlcyBoYXZlIHRvIGJlIGxvY2F0ZWQgd2l0aGluIGRpZ2l0cworMjY5ID0gVW5kZXJzY29yZXMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHNvdXJjZSBsZXZlbCAxLjcgb3IgZ3JlYXRlcgogCiAyODAgPSBEaXNjb3VyYWdlZCBhY2Nlc3M6IHswfQogCkBAIC0yNDYsMTEgKzI2MSwxNCBAQAogMzIzID0gVGhlIHR5cGUgezF9IGlzIGFscmVhZHkgZGVmaW5lZAogMzI0ID0gVGhlIHR5cGUgezB9IGNhbm5vdCBiZSByZXNvbHZlZC4gSXQgaXMgaW5kaXJlY3RseSByZWZlcmVuY2VkIGZyb20gcmVxdWlyZWQgLmNsYXNzIGZpbGVzCiAzMjUgPSBUaGUgcHVibGljIHR5cGUgezF9IG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGUKLTMyNiA9IEEgcGFja2FnZSBtdXN0IGJlIHNwZWNpZmllZCBpbiB7MH0gb3IgYSBkZWZhdWx0IHBhY2thZ2UgY3JlYXRlZAorIyMjW29ic29sZXRlXSAzMjYgPSBBIHBhY2thZ2UgbXVzdCBiZSBzcGVjaWZpZWQgaW4gezB9IG9yIGEgZGVmYXVsdCBwYWNrYWdlIGNyZWF0ZWQKIDMyNyA9IFRoZSBoaWVyYXJjaHkgb2YgdGhlIHR5cGUgezB9IGlzIGluY29uc2lzdGVudAogMzI4ID0gVGhlIGRlY2xhcmVkIHBhY2thZ2UgInsxfSIgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHBhY2thZ2UgInswfSIKIDMyOSA9IFRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QgY2Fubm90IGhhdmUgYSBzdXBlcmNsYXNzIG9yIHN1cGVyaW50ZXJmYWNlcwogMzMwID0gVGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdCBtdXN0IGJlIGEgY2xhc3MKKzMzMSA9IFJlZHVuZGFudCBzdXBlcmludGVyZmFjZSB7MH0gZm9yIHRoZSB0eXBlIHsxfSwgYWxyZWFkeSBkZWZpbmVkIGJ5IHsyfQorMzMyID0gVGhlIHR5cGUgezB9IHNob3VsZCBhbHNvIGltcGxlbWVudCBoYXNoQ29kZSgpIHNpbmNlIGl0IG92ZXJyaWRlcyBPYmplY3QuZXF1YWxzKCkKKzMzMyA9IFRoZSB0eXBlIHswfSBtdXN0IGJlIGFuIGFic3RyYWN0IGNsYXNzIHRvIGRlZmluZSBhYnN0cmFjdCBtZXRob2RzCiAKICMjI1tvYnNvbGV0ZV0gMzMwID0gezB9IGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSB2YWxpZCBzdXBlcmNsYXNzCiAjIyNbb2Jzb2xldGVdIDMzMSA9IFN1cGVyY2xhc3MgezB9IGlzIG5vdCB2aXNpYmxlCkBAIC0yODAsOCArMjk4LDggQEAKIDM1NSA9IER1cGxpY2F0ZSBtZXRob2QgezB9KHsyfSkgaW4gdHlwZSB7MX0KIDM1NiA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHBhcmFtZXRlciB7MH07IG9ubHkgZmluYWwgaXMgcGVybWl0dGVkCiAzNTcgPSBEdXBsaWNhdGUgbW9kaWZpZXIgZm9yIHRoZSBtZXRob2QgezF9IGluIHR5cGUgezB9Ci0zNTggPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgbWV0aG9kIHswfS57Mn0oezF9KQotMzU5ID0gSWxsZWdhbCBtb2RpZmllciBmb3IgdGhlIGludGVyZmFjZSBtZXRob2QgezB9LnsxfSh7Mn0pOyBvbmx5IHB1YmxpYyAmIGFic3RyYWN0IGFyZSBwZXJtaXR0ZWQKKzM1OCA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBtZXRob2QgezB9OyBvbmx5IHB1YmxpYywgcHJvdGVjdGVkLCBwcml2YXRlLCBzdGF0aWMsIGZpbmFsLCBhYnN0cmFjdCwgc3luY2hyb25pemVkICYgbmF0aXZlIGFyZSBwZXJtaXR0ZWQKKzM1OSA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBpbnRlcmZhY2UgbWV0aG9kIHswfTsgb25seSBwdWJsaWMgJiBhYnN0cmFjdCBhcmUgcGVybWl0dGVkCiAzNjAgPSBUaGUgbWV0aG9kIHsxfSBpbiB0eXBlIHswfSBjYW4gb25seSBzZXQgb25lIG9mIHB1YmxpYyAvIHByb3RlY3RlZCAvIHByaXZhdGUKIDM2MSA9IFRoZSBtZXRob2QgezF9IGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWM7IHN0YXRpYyBtZXRob2RzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIGEgc3RhdGljIG9yIHRvcCBsZXZlbCB0eXBlCiAzNjIgPSBUaGUgYWJzdHJhY3QgbWV0aG9kIHsxfSBpbiB0eXBlIHswfSBjYW4gb25seSBzZXQgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLCBvbmUgb2YgcHVibGljIG9yIHByb3RlY3RlZApAQCAtMjkxLDYgKzMwOSw3IEBACiAjIyNbb2Jzb2xldGVdIDM2NiA9IEFuIGFycmF5IG9mIHZvaWQgaXMgYW4gaW52YWxpZCByZXR1cm4gdHlwZSBmb3IgdGhlIG1ldGhvZCB7MH0KIDM2NyA9IFRoZSBuYXRpdmUgbWV0aG9kIHsxfSBjYW5ub3QgYWxzbyBiZSBkZWNsYXJlZCBzdHJpY3RmcAogMzY4ID0gRHVwbGljYXRlIG1vZGlmaWVyIGZvciBwYXJhbWV0ZXIgezB9CiszNjkgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgY29uc3RydWN0b3IgaW4gdHlwZSB7MH07IG9ubHkgcHVibGljLCBwcm90ZWN0ZWQgJiBwcml2YXRlIGFyZSBwZXJtaXR0ZWQKIAogIyMjW29ic29sZXRlXSAzNzAgPSB7Mn0gY2Fubm90IGJlIHJlc29sdmVkIChvciBpcyBub3QgYSB2YWxpZCB0eXBlKSBmb3IgdGhlIHBhcmFtZXRlciB7MX0gb2YgdGhlIG1ldGhvZCB7MH0KICMjI1tvYnNvbGV0ZV0gMzcxID0gVGhlIHR5cGUgezJ9IGlzIG5vdCB2aXNpYmxlIGZvciB0aGUgcGFyYW1ldGVyIHsxfSBvZiB0aGUgbWV0aG9kIHswfQpAQCAtMzQ0LDYgKzM2Myw5IEBACiA0MTQgPSBFeGNlcHRpb24gezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhyb3dzIGNsYXVzZSBpbiB7MX0sIHRodXMgdGhpcyBpbnRlcmZhY2UgY2Fubm90IGJlIGltcGxlbWVudGVkCiA0MTUgPSBUaGUgdmFyaWFibGUgYXJndW1lbnQgdHlwZSB7MH0gb2YgdGhlIG1ldGhvZCB7MX0gbXVzdCBiZSB0aGUgbGFzdCBwYXJhbWV0ZXIKIDQxNiA9IFRoZSBtZXRob2QgezB9IGlzIG92ZXJyaWRpbmcgYSBtZXRob2Qgd2l0aG91dCBtYWtpbmcgYSBzdXBlciBpbnZvY2F0aW9uCis0MTcgPSBUaGUgbWV0aG9kIHswfS57MX0oezJ9KSBpcyBvdmVycmlkaW5nIGEgc3luY2hyb25pemVkIG1ldGhvZCB3aXRob3V0IGJlaW5nIHN5bmNocm9uaXplZAorNDE4ID0gVGhlIHR5cGUgezN9IG11c3QgaW1wbGVtZW50IHRoZSBpbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kIHsyfS57MH0oezF9KSB0byBvdmVycmlkZSB7Nn0uezR9KHs1fSkKKzQxOSA9IFRoZSByZXR1cm4gdHlwZXMgYXJlIGluY29tcGF0aWJsZSBmb3IgdGhlIGluaGVyaXRlZCBtZXRob2RzIHswfQogCiA0MjAgPSBDb2RlIHNuaXBwZXQgc3VwcG9ydCBjYW5ub3QgZmluZCB0aGUgY2xhc3MgezB9CiA0MjEgPSBDb2RlIHNuaXBwZXQgc3VwcG9ydCBjYW5ub3QgZmluZCB0aGUgbWV0aG9kIHswfS57MX0oezJ9KSAKQEAgLTM1NCwxMiArMzc2LDEzIEBACiAKIDQzMiA9IFRvbyBtYW55IGZpZWxkcyBmb3IgdHlwZSB7MH0uIE1heGltdW0gaXMgNjU1MzUKIDQzMyA9IFRvbyBtYW55IG1ldGhvZHMgZm9yIHR5cGUgezB9LiBNYXhpbXVtIGlzIDY1NTM1Cis0MzQgPSBUaGUgc3ludGhldGljIG1ldGhvZCBjcmVhdGVkIHRvIGFjY2VzcyB7MH0oezF9KSBvZiB0eXBlIHsyfSBoYXMgdG9vIG1hbnkgcGFyYW1ldGVycwogCiA0NDAgPSAnYXNzZXJ0JyBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciwgc2luY2UgaXQgaXMgYSByZXNlcnZlZCBrZXl3b3JkIGZyb20gc291cmNlIGxldmVsIDEuNCBvbgotNDQxID0gJ2VudW0nIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyLCBzaW5jZSBpdCBpcyBhIHJlc2VydmVkIGtleXdvcmQgZnJvbSBzb3VyY2UgbGV2ZWwgNS4wIG9uCis0NDEgPSAnZW51bScgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIsIHNpbmNlIGl0IGlzIGEgcmVzZXJ2ZWQga2V5d29yZCBmcm9tIHNvdXJjZSBsZXZlbCAxLjUgb24KIDQ0MiA9IEVudW0gY29uc3RhbnRzIGNhbm5vdCBiZSBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2lzCiAKLTQ1MCA9IHswfSB7MX0KKzQ1MCA9IHswfXsxfQogCiA0NTEgPSBOdWxsIHBvaW50ZXIgYWNjZXNzOiBUaGUgdmFyaWFibGUgezB9IGNhbiBvbmx5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbgogNDUyID0gUG90ZW50aWFsIG51bGwgcG9pbnRlciBhY2Nlc3M6IFRoZSB2YXJpYWJsZSB7MH0gbWF5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbgpAQCAtMzcyLDcgKzM5NSw5IEBACiAKIDQ2MCA9IEVtcHR5IGJsb2NrIHNob3VsZCBiZSBkb2N1bWVudGVkCiAKLSMjIyBET0MgCisjIyMgRE9DCis0NjIgPSBJbnZhbGlkIFVSTCByZWZlcmVuY2UuIERvdWJsZSBxdW90ZSB0aGUgcmVmZXJlbmNlIG9yIHVzZSB0aGUgaHJlZiBzeW50YXgKKzQ2MyA9IERlc2NyaXB0aW9uIGV4cGVjdGVkIGFmdGVyIHRoaXMgcmVmZXJlbmNlCiA0NjQgPSBVbmV4cGVjdGVkIGR1cGxpY2F0ZWQgdGFnIEB7MH0KIDQ2NSA9ICcnezB9JycgdmlzaWJpbGl0eSBmb3IgbWFsZm9ybWVkIGRvYyBjb21tZW50cyBoaWRlcyB0aGlzICcnezF9JycgcmVmZXJlbmNlCiA0NjYgPSBJbnZhbGlkIG1lbWJlciB0eXBlIHF1YWxpZmljYXRpb24KQEAgLTQyNSw3ICs0NTAsNyBAQAogNTEzID0gTWFsZm9ybWVkIHJlZmVyZW5jZSAobWlzc2luZyBlbmQgc3BhY2Ugc2VwYXJhdG9yKQogNTE0ID0gSmF2YWRvYzogCiA1MTUgPSBNaXNzaW5nICM6ICJ7MH0iCi01MTYgPSBNaXNzaW5nIHJldHVybiB0eXBlIGRlc2NyaXB0aW9uCis1MTYgPSBEZXNjcmlwdGlvbiBleHBlY3RlZCBhZnRlciBAezB9CiA1MTcgPSBPbmx5IHN0YXRpYyBmaWVsZCByZWZlcmVuY2UgaXMgYWxsb3dlZCBmb3IgQHZhbHVlIHRhZwogNTE4ID0gVW5leHBlY3RlZCB0ZXh0CiA1MTkgPSBJbnZhbGlkIHBhcmFtIHRhZyBuYW1lCkBAIC00NTcsOCArNDgyLDggQEAKIDU0MyA9IEJvdW5kIG1pc21hdGNoOiBUaGUgZ2VuZXJpYyBtZXRob2QgezB9KHsxfSkgb2YgdHlwZSB7Mn0gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKHszfSkuIFRoZSBpbmZlcnJlZCB0eXBlIHs0fSBpcyBub3QgYSB2YWxpZCBzdWJzdGl0dXRlIGZvciB0aGUgYm91bmRlZCBwYXJhbWV0ZXIgPHs1fSBleHRlbmRzIHs2fT4KIDU0NCA9IEJvdW5kIG1pc21hdGNoOiBUaGUgZ2VuZXJpYyBjb25zdHJ1Y3RvciB7MH0oezF9KSBvZiB0eXBlIHsyfSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoezN9KS4gVGhlIGluZmVycmVkIHR5cGUgezR9IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8ezV9IGV4dGVuZHMgezZ9PgogNTQ1ID0gVHlwZSBzYWZldHk6IFVuY2hlY2tlZCBjYXN0IGZyb20gezB9IHRvIHsxfQotNTQ2ID0gQ2Fubm90IHBlcmZvcm0gaW5zdGFuY2VvZiBjaGVjayBhZ2FpbnN0IHBhcmFtZXRlcml6ZWQgdHlwZSB7MH0uIFVzZSBpbnN0ZWFkIGl0cyByYXcgZm9ybSB7MX0gc2luY2UgZ2VuZXJpYyB0eXBlIGluZm9ybWF0aW9uIHdpbGwgYmUgZXJhc2VkIGF0IHJ1bnRpbWUKLTU0NyA9IENhbm5vdCBwZXJmb3JtIGluc3RhbmNlb2YgY2hlY2sgYWdhaW5zdCB0eXBlIHBhcmFtZXRlciB7MH0uIFVzZSBpbnN0ZWFkIGl0cyBlcmFzdXJlIHsxfSBzaW5jZSBnZW5lcmljIHR5cGUgaW5mb3JtYXRpb24gd2lsbCBiZSBlcmFzZWQgYXQgcnVudGltZQorNTQ2ID0gQ2Fubm90IHBlcmZvcm0gaW5zdGFuY2VvZiBjaGVjayBhZ2FpbnN0IHBhcmFtZXRlcml6ZWQgdHlwZSB7MH0uIFVzZSB0aGUgZm9ybSB7MX0gaW5zdGVhZCBzaW5jZSBmdXJ0aGVyIGdlbmVyaWMgdHlwZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGVyYXNlZCBhdCBydW50aW1lCis1NDcgPSBDYW5ub3QgcGVyZm9ybSBpbnN0YW5jZW9mIGNoZWNrIGFnYWluc3QgdHlwZSBwYXJhbWV0ZXIgezB9LiBVc2UgaW5zdGVhZCBpdHMgZXJhc3VyZSB7MX0gaW5zdGVhZCBzaW5jZSBmdXJ0aGVyIGdlbmVyaWMgdHlwZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGVyYXNlZCBhdCBydW50aW1lCiA1NDggPSBUaGUgbWV0aG9kIHswfSh7MX0pIG9mIHR5cGUgezJ9IGlzIG5vdCBnZW5lcmljOyBpdCBjYW5ub3QgYmUgcGFyYW1ldGVyaXplZCB3aXRoIGFyZ3VtZW50cyA8ezN9PgogNTQ5ID0gSW5jb3JyZWN0IG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyBtZXRob2QgPHszfT57MH0oezF9KSBvZiB0eXBlIHsyfTsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPHs0fT4KIDU1MCA9IFRoZSBwYXJhbWV0ZXJpemVkIG1ldGhvZCA8ezN9PnswfSh7MX0pIG9mIHR5cGUgezJ9IGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzICh7NH0pCkBAIC00ODUsMjUgKzUxMCwzMCBAQAogNTcxID0gVGhlIHR5cGUgcGFyYW1ldGVyIHswfSBpcyBoaWRpbmcgdGhlIHR5cGUgezF9CiA1NzIgPSB7MH0gaXMgYSByYXcgdHlwZS4gUmVmZXJlbmNlcyB0byBnZW5lcmljIHR5cGUgezF9IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCiA1NzMgPSBDYW5ub3Qgc3BlY2lmeSBhbnkgYWRkaXRpb25hbCBib3VuZCB7MH0gd2hlbiBmaXJzdCBib3VuZCBpcyBhIHR5cGUgcGFyYW1ldGVyCi01NzQgPSBUeXBlIHNhZmV0eSA6IEEgZ2VuZXJpYyBhcnJheSBvZiB7MH0gaXMgY3JlYXRlZCBmb3IgYSB2YXJhcmdzIHBhcmFtZXRlcgorNTc0ID0gVHlwZSBzYWZldHk6IEEgZ2VuZXJpYyBhcnJheSBvZiB7MH0gaXMgY3JlYXRlZCBmb3IgYSB2YXJhcmdzIHBhcmFtZXRlcgogNTc1ID0gSWxsZWdhbCBxdWFsaWZpZWQgYWNjZXNzIGZyb20gdGhlIHR5cGUgcGFyYW1ldGVyIHswfQogNTc2ID0gVGhlIG5lc3RlZCB0eXBlIHswfSBpcyBoaWRpbmcgdGhlIHR5cGUgcGFyYW1ldGVyIHsxfSBvZiB0eXBlIHsyfQogNTc3ID0gVGhlIG5lc3RlZCB0eXBlIHswfSBpcyBoaWRpbmcgdGhlIHR5cGUgcGFyYW1ldGVyIHsxfSBvZiB0aGUgZ2VuZXJpYyBtZXRob2QgezJ9KHszfSkgb2YgdHlwZSB7NH0KIDU3OCA9IFdpbGRjYXJkIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgbG9jYXRpb24KKzU3OSA9IFVudXNlZCB0eXBlIGFyZ3VtZW50cyBmb3IgdGhlIG5vbiBnZW5lcmljIG1ldGhvZCB7MH0oezF9KSBvZiB0eXBlIHsyfTsgaXQgc2hvdWxkIG5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDx7M30+Cis1ODMgPSBEdXBsaWNhdGUgbWV0aG9kcyBuYW1lZCB7MH0gd2l0aCB0aGUgcGFyYW1ldGVycyAoezF9KSBhbmQgKHsyfSkgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSB0eXBlcyB7M30gYW5kIHs0fQogCiAjIyMgRk9SRUFDSAogNTgwID0gVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSBlbGVtZW50IHR5cGUgezB9IHRvIHsxfQogNTgxID0gQ2FuIG9ubHkgaXRlcmF0ZSBvdmVyIGFuIGFycmF5IG9yIGFuIGluc3RhbmNlIG9mIGphdmEubGFuZy5JdGVyYWJsZQorNTgyID0gQ2FuIG9ubHkgaXRlcmF0ZSBvdmVyIGFuIGFycmF5IG9yIGFuIGluc3RhbmNlIG9mIGphdmEudXRpbC5Db2xsZWN0aW9uCiAKICMjIyBTT1VSQ0UgTEVWRUwKLTU5MCA9IFN5bnRheCBlcnJvciwgdHlwZSBwYXJhbWV0ZXJzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgNS4wCi01OTEgPSBTeW50YXggZXJyb3IsIHN0YXRpYyBpbXBvcnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgNS4wCi01OTIgPSBTeW50YXggZXJyb3IsICdmb3IgZWFjaCcgc3RhdGVtZW50cyBhcmUgb25seSBhdmFpbGFibGUgaWYgc291cmNlIGxldmVsIGlzIDUuMAotNTkzID0gU3ludGF4IGVycm9yLCBwYXJhbWV0ZXJpemVkIHR5cGVzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgNS4wCi01OTQgPSBTeW50YXggZXJyb3IsIGVudW0gZGVjbGFyYXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgNS4wCi01OTUgPSBTeW50YXggZXJyb3IsIHZhcmFyZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyA1LjAKLTU5NiA9IFN5bnRheCBlcnJvciwgYW5ub3RhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyA1LjAKLTU5NyA9IFN5bnRheCBlcnJvciwgYW5ub3RhdGlvbiBkZWNsYXJhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyA1LjAKKzU5MCA9IFN5bnRheCBlcnJvciwgdHlwZSBwYXJhbWV0ZXJzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgMS41IG9yIGdyZWF0ZXIKKzU5MSA9IFN5bnRheCBlcnJvciwgc3RhdGljIGltcG9ydHMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyAxLjUgb3IgZ3JlYXRlcgorNTkyID0gU3ludGF4IGVycm9yLCAnZm9yIGVhY2gnIHN0YXRlbWVudHMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyAxLjUgb3IgZ3JlYXRlcgorNTkzID0gU3ludGF4IGVycm9yLCBwYXJhbWV0ZXJpemVkIHR5cGVzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgMS41IG9yIGdyZWF0ZXIKKzU5NCA9IFN5bnRheCBlcnJvciwgZW51bSBkZWNsYXJhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyAxLjUgb3IgZ3JlYXRlcgorNTk1ID0gU3ludGF4IGVycm9yLCB2YXJhcmdzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBzb3VyY2UgbGV2ZWwgaXMgMS41IG9yIGdyZWF0ZXIKKzU5NiA9IFN5bnRheCBlcnJvciwgYW5ub3RhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHNvdXJjZSBsZXZlbCBpcyAxLjUgb3IgZ3JlYXRlcgorNTk3ID0gU3ludGF4IGVycm9yLCBhbm5vdGF0aW9uIGRlY2xhcmF0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaWYgc291cmNlIGxldmVsIGlzIDEuNSBvciBncmVhdGVyCis1OTggPSBTeW50YXggZXJyb3IsIGFubm90YXRpb24gZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgdHlwZSBwYXJhbWV0ZXJzCis1OTkgPSBTeW50YXggZXJyb3IsIGVudW0gZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgdHlwZSBwYXJhbWV0ZXJzCiAKICMjIyBBTk5PVEFUSU9OUwogNjAwID0gSWxsZWdhbCBtb2RpZmllciBmb3IgdGhlIGFubm90YXRpb24gYXR0cmlidXRlIHswfS57MX07IG9ubHkgcHVibGljICYgYWJzdHJhY3QgYXJlIHBlcm1pdHRlZApAQCAtNTM3LDEwICs1NjcsMTUgQEAKIDYyOCA9IFRoZSBkZXByZWNhdGVkIGZpZWxkIHswfS57MX0gc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIEBEZXByZWNhdGVkCiA2MjkgPSBUaGUgZGVwcmVjYXRlZCBtZXRob2QgezB9KHsxfSkgb2YgdHlwZSB7Mn0gc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIEBEZXByZWNhdGVkCiA2MzAgPSBUaGUgZGVwcmVjYXRlZCB0eXBlIHswfSBzaG91bGQgYmUgYW5ub3RhdGVkIHdpdGggQERlcHJlY2F0ZWQKLTYzMSA9IFVuaGFuZGxlZCB3YXJuaW5nIHRva2VuIHswfQorNjMxID0gVW5zdXBwb3J0ZWQgQFN1cHByZXNzV2FybmluZ3MoInswfSIpCiA2MzIgPSBUaGUgdmFsdWUgZm9yIGFubm90YXRpb24gYXR0cmlidXRlIHswfS57MX0gbXVzdCBiZSBhbiBhcnJheSBpbml0aWFsaXplcgogNjMzID0gVGhlIHZhbHVlIGZvciBhbm5vdGF0aW9uIGF0dHJpYnV0ZSB7MH0uezF9IG11c3QgYmUgYW4gZW51bSBjb25zdGFudCBleHByZXNzaW9uCiA2MzQgPSBUaGUgbWV0aG9kIHswfSh7MX0pIG9mIHR5cGUgezJ9IG11c3Qgb3ZlcnJpZGUgb3IgaW1wbGVtZW50IGEgc3VwZXJ0eXBlIG1ldGhvZAorNjM1ID0gVW5uZWNlc3NhcnkgQFN1cHByZXNzV2FybmluZ3MoInswfSIpCis2MzYgPSBUaGUgbWV0aG9kIHswfSh7MX0pIG9mIHR5cGUgezJ9IHNob3VsZCBiZSB0YWdnZWQgd2l0aCBAT3ZlcnJpZGUgc2luY2UgaXQgYWN0dWFsbHkgb3ZlcnJpZGVzIGEgc3VwZXJpbnRlcmZhY2UgbWV0aG9kCisKKyMjIyBNT1JFIEdFTkVSSUNTCis2NjAgPSBVbnVzZWQgdHlwZSBhcmd1bWVudHMgZm9yIHRoZSBub24gZ2VuZXJpYyBjb25zdHJ1Y3RvciB7MH0oezF9KSBvZiB0eXBlIHsyfTsgaXQgc2hvdWxkIG5vdCBiZSBwYXJhbWV0ZXJpemVkIHdpdGggYXJndW1lbnRzIDx7M30+CiAKICMjIyBDT1JSVVBURUQgQklOQVJJRVMKIDcwMCA9IFRoZSBjbGFzcyBmaWxlIHswfSBjb250YWlucyBhIHNpZ25hdHVyZSAnJ3sxfScnIGlsbC1mb3JtZWQgYXQgcG9zaXRpb24gezJ9CkBAIC01NTYsMjMgKzU5MSwyOSBAQAogIyMjIEVOVU1TCiA3NTAgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgZW51bSB7MH07IG9ubHkgcHVibGljIGlzIHBlcm1pdHRlZAogNzUxID0gSWxsZWdhbCBtb2RpZmllciBmb3IgdGhlIGVudW0gY29uc3RhbnQgezB9OyBubyBtb2RpZmllciBpcyBhbGxvd2VkCi03NTIgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgbG9jYWwgZW51bSB7MH07IG9ubHkgYWJzdHJhY3QgaXMgcGVybWl0dGVkCi03NTMgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgbWVtYmVyIGVudW0gezB9OyBvbmx5IHB1YmxpYywgcHJvdGVjdGVkLCBwcml2YXRlLCBzdGF0aWMgJiBhYnN0cmFjdCBhcmUgcGVybWl0dGVkCisjIyNbb2Jzb2xldGVdIDc1MiA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBsb2NhbCBlbnVtIHswfTsgb25seSBhYnN0cmFjdCBpcyBwZXJtaXR0ZWQKKzc1MyA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBtZW1iZXIgZW51bSB7MH07IG9ubHkgcHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUgJiBzdGF0aWMgYXJlIHBlcm1pdHRlZAogNzU0ID0gVGhlIGVudW0gezF9IGFscmVhZHkgZGVmaW5lcyB0aGUgbWV0aG9kIHswfSh7Mn0pIGltcGxpY2l0bHkKLTc1NSA9IFRoZSBlbnVtIGNvbnN0YW50IHswfS57MX0gcmVmZXJlbmNlIGNhbm5vdCBiZSBxdWFsaWZpZWQgaW4gYSBjYXNlIGxhYmVsCis3NTUgPSBUaGUgcXVhbGlmaWVkIGNhc2UgbGFiZWwgezB9LnsxfSBtdXN0IGJlIHJlcGxhY2VkIHdpdGggdGhlIHVucXVhbGlmaWVkIGVudW0gY29uc3RhbnQgezF9CiA3NTYgPSBUaGUgdHlwZSB7MX0gbWF5IG5vdCBzdWJjbGFzcyB7MH0gZXhwbGljaXRseQogNzU3ID0gQ2Fubm90IGludm9rZSBzdXBlciBjb25zdHJ1Y3RvciBmcm9tIGVudW0gY29uc3RydWN0b3IgezB9KHsxfSkKIDc1OCA9IFRoZSBlbnVtIHsyfSBjYW4gb25seSBkZWZpbmUgdGhlIGFic3RyYWN0IG1ldGhvZCB7MH0oezF9KSBpZiBpdCBhbHNvIGRlZmluZXMgZW51bSBjb25zdGFudHMgd2l0aCBjb3JyZXNwb25kaW5nIGltcGxlbWVudGF0aW9ucwogNzU5ID0gVGhlIGZpZWxkIHswfS57MX0gY2Fubm90IGJlIHJlZmVyZW5jZWQgZnJvbSBhbiBlbnVtIGNhc2UgbGFiZWw7IG9ubHkgZW51bSBjb25zdGFudHMgY2FuIGJlIHVzZWQgaW4gZW51bSBzd2l0Y2gKIDc2MCA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBlbnVtIGNvbnN0cnVjdG9yOyBvbmx5IHByaXZhdGUgaXMgcGVybWl0dGVkLgotNzYxID0gVGhlIGVudW0gY29uc3RhbnQgezB9LnsxfSBoYXMgbm8gY29ycmVzcG9uZGluZyBjYXNlIGxhYmVsCis3NjEgPSBUaGUgZW51bSBjb25zdGFudCB7MX0gbmVlZHMgYSBjb3JyZXNwb25kaW5nIGNhc2UgbGFiZWwgaW4gdGhpcyBlbnVtIHN3aXRjaCBvbiB7MH0KIDc2MiA9IENhbm5vdCByZWZlciB0byB0aGUgc3RhdGljIGVudW0gZmllbGQgezB9LnsxfSB3aXRoaW4gYW4gaW5pdGlhbGl6ZXIKKzc2MyA9IFRoZSBlbnVtIGNvbnN0YW50IHsyfSBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kIHswfSh7MX0pCis3NjQgPSBUaGUgZW51bSBjb25zdGFudCB7MH0gY2Fubm90IGRlZmluZSBhYnN0cmFjdCBtZXRob2RzCis3NjUgPSBUaGUgbWV0aG9kIHsxfSBjYW5ub3QgYmUgYWJzdHJhY3QgaW4gdGhlIGVudW0gY29uc3RhbnQgezB9CiAKICMjIyBWQVJBUkdTCiA4MDAgPSBFeHRlbmRlZCBkaW1lbnNpb25zIGFyZSBpbGxlZ2FsIGZvciBhIHZhcmlhYmxlIGFyZ3VtZW50CiA4MDEgPSBUaGUgYXJndW1lbnQgb2YgdHlwZSB7MH0gc2hvdWxkIGV4cGxpY2l0bHkgYmUgY2FzdCB0byB7MX0gZm9yIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSB2YXJhcmdzIG1ldGhvZCB7Mn0oezN9KSBmcm9tIHR5cGUgezR9LiBJdCBjb3VsZCBhbHRlcm5hdGl2ZWx5IGJlIGNhc3QgdG8gezV9IGZvciBhIHZhcmFyZ3MgaW52b2NhdGlvbgogODAyID0gVGhlIGFyZ3VtZW50IG9mIHR5cGUgezB9IHNob3VsZCBleHBsaWNpdGx5IGJlIGNhc3QgdG8gezF9IGZvciB0aGUgaW52b2NhdGlvbiBvZiB0aGUgdmFyYXJncyBjb25zdHJ1Y3RvciB7Mn0oezN9KS4gSXQgY291bGQgYWx0ZXJuYXRpdmVseSBiZSBjYXN0IHRvIHs0fSBmb3IgYSB2YXJhcmdzIGludm9jYXRpb24KIDgwMyA9IFZhcmFyZ3MgbWV0aG9kcyBzaG91bGQgb25seSBvdmVycmlkZSBvciBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIHZhcmFyZ3MgbWV0aG9kcyB1bmxpa2UgezJ9LnswfSh7MX0pIGFuZCB7NH0uezB9KHszfSkKKzgwNCA9IEBTYWZlVmFyYXJncyBhbm5vdGF0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGZpeGVkIGFyaXR5IG1ldGhvZCB7MH0KKzgwNSA9IEBTYWZlVmFyYXJncyBhbm5vdGF0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRvIG5vbi1maW5hbCBpbnN0YW5jZSBtZXRob2QgezB9Cis4MDYgPSBUeXBlIHNhZmV0eTogUG90ZW50aWFsIGhlYXAgcG9sbHV0aW9uIHZpYSB2YXJhcmdzIHBhcmFtZXRlciB7MH0KIAogIyMjIEdFTkVSSUMgSkFWQURPQwogODUwID0gQm91bmQgbWlzbWF0Y2g6IFRoZSBnZW5lcmljIG1ldGhvZCB7MH0oezF9KSBvZiB0eXBlIHsyfSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoezN9KS4gVGhlIGluZmVycmVkIHR5cGUgezR9IGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8ezV9IGV4dGVuZHMgezZ9PgpAQCAtNTg1LDMgKzYyNiwzNSBAQAogODU3ID0gSW5jb3JyZWN0IG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyBjb25zdHJ1Y3RvciA8ezN9PnswfSh7MX0pIG9mIHR5cGUgezJ9OyBpdCBjYW5ub3QgYmUgcGFyYW1ldGVyaXplZCB3aXRoIGFyZ3VtZW50cyA8ezR9PgogODU4ID0gVGhlIHBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3IgPHszfT57MH0oezF9KSBvZiB0eXBlIHsyfSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoezR9KQogODU5ID0gVGhlIGNvbnN0cnVjdG9yIHswfSh7MX0pIG9mIHJhdyB0eXBlIHsyfSBpcyBubyBsb25nZXIgZ2VuZXJpYzsgaXQgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCBhcmd1bWVudHMgPHszfT4KKworIyMjIEphdmEgNworODcwID0gVGhlIHBhcmFtZXRlciB7MH0gb2YgYSBtdWx0aS1jYXRjaCBibG9jayBjYW5ub3QgYmUgYXNzaWduZWQKKzg3MSA9IFRoZSByZXNvdXJjZSB0eXBlIHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgamF2YS5sYW5nLkF1dG9DbG9zZWFibGUKKzg3MiA9IFRoZSByZXNvdXJjZSB7MH0gb2YgYSB0cnktd2l0aC1yZXNvdXJjZXMgc3RhdGVtZW50IGNhbm5vdCBiZSBhc3NpZ25lZAorODczID0gVGhlIGV4Y2VwdGlvbiB7MH0gaXMgYWxyZWFkeSBjYXVnaHQgYnkgdGhlIGFsdGVybmF0aXZlIHsxfQorODc0ID0gUmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiBub3QgYWxsb3dlZCBoZXJlIGZvciBzb3VyY2UgbGV2ZWwgYmVsb3cgMS43Cis4NzUgPSBNdWx0aS1jYXRjaCBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb3dlZCBmb3Igc291cmNlIGxldmVsIGJlbG93IDEuNworODc2ID0gSW52b2NhdGlvbiBvZiBwb2x5bW9ycGhpYyBtZXRob2RzIG5vdCBhbGxvd2VkIGZvciBzb3VyY2UgbGV2ZWwgYmVsb3cgMS43Cis4NzcgPSBDYW5ub3Qgc3dpdGNoIG9uIGEgdmFsdWUgb2YgdHlwZSB7MH0uIE9ubHkgY29udmVydGlibGUgaW50IHZhbHVlcywgc3RyaW5ncyBvciBlbnVtIGNvbnN0YW50cyBhcmUgcGVybWl0dGVkCis4NzggPSBDYW5ub3QgaW5mZXIgdHlwZSBhcmd1bWVudHMgZm9yIHswfQorODc5ID0gRXhwbGljaXQgdHlwZSBhcmd1bWVudHMgY2Fubm90IGJlIHVzZWQgd2l0aCAnPD4nIGluIGFuIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorODgwID0gJzw+JyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFub255bW91cyBjbGFzc2VzCis4ODEgPSBDYW5ub3Qgc3dpdGNoIG9uIGEgdmFsdWUgb2YgdHlwZSBTdHJpbmcgZm9yIHNvdXJjZSBsZXZlbCBiZWxvdyAxLjcuIE9ubHkgY29udmVydGlibGUgaW50IHZhbHVlcyBvciBlbnVtIGNvbnN0YW50cyBhcmUgcGVybWl0dGVkCis4ODIgPSBVbmhhbmRsZWQgZXhjZXB0aW9uIHR5cGUgezB9IHRocm93biBieSBhdXRvbWF0aWMgY2xvc2UoKSBpbnZvY2F0aW9uIG9uIHsxfQorODgzID0gJzw+JyBvcGVyYXRvciBpcyBub3QgYWxsb3dlZCBmb3Igc291cmNlIGxldmVsIGJlbG93IDEuNworODg0ID0gUmVkdW5kYW50IHNwZWNpZmljYXRpb24gb2YgdHlwZSBhcmd1bWVudHMgPHswfT4KKworIyMjIEVMQUJPUkFUSU9OUworIyMgQWNjZXNzIHJlc3RyaWN0aW9ucworNzg1OTIgPSBUaGUgdHlwZSB7MX0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIGNsYXNzcGF0aCBlbnRyeSB7MH0KKzc4NTkzID0gVGhlIHR5cGUgezF9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBwcm9qZWN0IHswfQorNzg1OTQgPSBUaGUgdHlwZSB7MX0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIHJlcXVpcmVkIGxpYnJhcnkgezB9Cis3ODU5NiA9IFRoZSBmaWVsZCB7MX0gZnJvbSB0aGUgdHlwZSB7Mn0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIGNsYXNzcGF0aCBlbnRyeSB7MH0KKzc4NTk3ID0gVGhlIGZpZWxkIHsxfSBmcm9tIHRoZSB0eXBlIHsyfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgcHJvamVjdCB7MH0KKzc4NTk4ID0gVGhlIGZpZWxkIHsxfSBmcm9tIHRoZSB0eXBlIHsyfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgbGlicmFyeSB7MH0KKzc4NjAwID0gVGhlIGNvbnN0cnVjdG9yIHsxfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gY2xhc3NwYXRoIGVudHJ5IHswfQorNzg2MDEgPSBUaGUgY29uc3RydWN0b3IgezF9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBwcm9qZWN0IHswfQorNzg2MDIgPSBUaGUgY29uc3RydWN0b3IgezF9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBsaWJyYXJ5IHswfQorNzg2MDQgPSBUaGUgbWV0aG9kIHsxfSBmcm9tIHRoZSB0eXBlIHsyfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gY2xhc3NwYXRoIGVudHJ5IHswfQorNzg2MDYgPSBUaGUgbWV0aG9kIHsxfSBmcm9tIHRoZSB0eXBlIHsyfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgbGlicmFyeSB7MH0KKzc4NjA1ID0gVGhlIG1ldGhvZCB7MX0gZnJvbSB0aGUgdHlwZSB7Mn0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIHJlcXVpcmVkIHByb2plY3QgezB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NvbXBvdW5kTmFtZVZlY3Rvci5qYXZhCmluZGV4IGMxY2Q0YTQuLjI1NzlmOWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NvbXBvdW5kTmFtZVZlY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NvbXBvdW5kTmFtZVZlY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDU3ICsxNCw1NyBAQAogCiBwdWJsaWMgZmluYWwgY2xhc3MgQ29tcG91bmROYW1lVmVjdG9yIHsKIAlzdGF0aWMgaW50IElOSVRJQUxfU0laRSA9IDEwOwotICAgIAorCiAJcHVibGljIGludCBzaXplOwogCWludCBtYXhTaXplOwogCWNoYXJbXVtdW10gZWxlbWVudHM7CiBwdWJsaWMgQ29tcG91bmROYW1lVmVjdG9yKCkgewotCW1heFNpemUgPSBJTklUSUFMX1NJWkU7Ci0Jc2l6ZSA9IDA7Ci0JZWxlbWVudHMgPSBuZXcgY2hhclttYXhTaXplXVtdW107CisJdGhpcy5tYXhTaXplID0gSU5JVElBTF9TSVpFOworCXRoaXMuc2l6ZSA9IDA7CisJdGhpcy5lbGVtZW50cyA9IG5ldyBjaGFyW3RoaXMubWF4U2l6ZV1bXVtdOwogfQogcHVibGljIHZvaWQgYWRkKGNoYXJbXVtdIG5ld0VsZW1lbnQpIHsKLQlpZiAoc2l6ZSA9PSBtYXhTaXplKSAgICAvLyBrbm93cyB0aGF0IHNpemUgc3RhcnRzIDw9IG1heFNpemUKLQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgKGVsZW1lbnRzID0gbmV3IGNoYXJbbWF4U2l6ZSAqPSAyXVtdW10pLCAwLCBzaXplKTsKLQllbGVtZW50c1tzaXplKytdID0gbmV3RWxlbWVudDsKKwlpZiAodGhpcy5zaXplID09IHRoaXMubWF4U2l6ZSkgICAgLy8ga25vd3MgdGhhdCBzaXplIHN0YXJ0cyA8PSBtYXhTaXplCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgY2hhclt0aGlzLm1heFNpemUgKj0gMl1bXVtdKSwgMCwgdGhpcy5zaXplKTsKKwl0aGlzLmVsZW1lbnRzW3RoaXMuc2l6ZSsrXSA9IG5ld0VsZW1lbnQ7CiB9CiBwdWJsaWMgdm9pZCBhZGRBbGwoY2hhcltdW11bXSBuZXdFbGVtZW50cykgewotCWlmIChzaXplICsgbmV3RWxlbWVudHMubGVuZ3RoID49IG1heFNpemUpIHsKLQkJbWF4U2l6ZSA9IHNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGg7ICAgIC8vIGFzc3VtZSBubyBtb3JlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKLQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgKGVsZW1lbnRzID0gbmV3IGNoYXJbbWF4U2l6ZV1bXVtdKSwgMCwgc2l6ZSk7CisJaWYgKHRoaXMuc2l6ZSArIG5ld0VsZW1lbnRzLmxlbmd0aCA+PSB0aGlzLm1heFNpemUpIHsKKwkJdGhpcy5tYXhTaXplID0gdGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOyAgICAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgY2hhclt0aGlzLm1heFNpemVdW11bXSksIDAsIHRoaXMuc2l6ZSk7CiAJfQotCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIGVsZW1lbnRzLCBzaXplLCBuZXdFbGVtZW50cy5sZW5ndGgpOwotCXNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOworCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIHRoaXMuZWxlbWVudHMsIHRoaXMuc2l6ZSwgbmV3RWxlbWVudHMubGVuZ3RoKTsKKwl0aGlzLnNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOwogfQogcHVibGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdW10gZWxlbWVudCkgewotCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCi0JCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50LCBlbGVtZW50c1tpXSkpCisJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZWxlbWVudCwgdGhpcy5lbGVtZW50c1tpXSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiBwdWJsaWMgY2hhcltdW10gZWxlbWVudEF0KGludCBpbmRleCkgewotCXJldHVybiBlbGVtZW50c1tpbmRleF07CisJcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdOwogfQogcHVibGljIGNoYXJbXVtdIHJlbW92ZShjaGFyW11bXSBlbGVtZW50KSB7CiAJLy8gYXNzdW1lcyBvbmx5IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBlbGVtZW50IGV4aXN0cwotCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCi0JCWlmIChlbGVtZW50ID09IGVsZW1lbnRzW2ldKSB7CisJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQlpZiAoZWxlbWVudCA9PSB0aGlzLmVsZW1lbnRzW2ldKSB7CiAJCQkvLyBzaGlmdCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGRvd24gb25lIHNwb3QKLQkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIGkgKyAxLCBlbGVtZW50cywgaSwgLS1zaXplIC0gaSk7Ci0JCQllbGVtZW50c1tzaXplXSA9IG51bGw7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIGkgKyAxLCB0aGlzLmVsZW1lbnRzLCBpLCAtLXRoaXMuc2l6ZSAtIGkpOworCQkJdGhpcy5lbGVtZW50c1t0aGlzLnNpemVdID0gbnVsbDsKIAkJCXJldHVybiBlbGVtZW50OwogCQl9CiAJcmV0dXJuIG51bGw7CiB9CiBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykKLQkJZWxlbWVudHNbaV0gPSBudWxsOwotCXNpemUgPSAwOworCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKKwkJdGhpcy5lbGVtZW50c1tpXSA9IG51bGw7CisJdGhpcy5zaXplID0gMDsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQlidWZmZXIuYXBwZW5kKENoYXJPcGVyYXRpb24udG9TdHJpbmcoZWxlbWVudHNbaV0pKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoQ2hhck9wZXJhdGlvbi50b1N0cmluZyh0aGlzLmVsZW1lbnRzW2ldKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCiAJfQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0Zsb2F0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvRmxvYXRVdGlsLmphdmEKaW5kZXggMjdhNWYzMi4uYWZkMGEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvRmxvYXRVdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvRmxvYXRVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOCArMTEsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKIAogLyoqCi0gKiBJbnRlcm5hbCB1dGlsaXR5IGZvciBkZWNsYWluZyB3aXRoIGhleGFkZWNpbWFsIGRvdWJsZSBhbmQgZmxvYXQgbGl0ZXJhbHMuCi0gKiAKKyAqIEludGVybmFsIHV0aWxpdHkgZm9yIGRlY2xhcmluZyB3aXRoIGhleGFkZWNpbWFsIGRvdWJsZSBhbmQgZmxvYXQgbGl0ZXJhbHMuCisgKgogICogQHNpbmNlIDMuMQogICovCiBwdWJsaWMgY2xhc3MgRmxvYXRVdGlsIHsKQEAgLTIyLDcgKzIyLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX1BSRUNJU0lPTiA9IDUzOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ET1VCTEVfRVhQT05FTlQgPSArMTAyMzsKLQkKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fTk9STUFMSVpFRF9ET1VCTEVfRVhQT05FTlQgPSAtMTAyMjsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVU5OT1JNQUxJWkVEX0RPVUJMRV9FWFBPTkVOVCA9IE1JTl9OT1JNQUxJWkVEX0RPVUJMRV9FWFBPTkVOVApAQCAtNDgsOSArNDgsOSBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfRVhQT05FTlRfU0hJRlQgPSAyMzsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIGZsb2F0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIAorCSAqIFJldHVybnMgdGhlIGZsb2F0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCiAJICogaGV4YWRlY2ltYWwgZmxvYXRpbmctcG9pbnQgc2luZ2xlIHByZWNpc2lvbiBsaXRlcmFsLgotCSAqIFRoZSBsaXRlcmFsIG11c3QgYmUgc3ludGFjdGlhbGx5IGNvcnJlY3QsIGFuZCBtdXN0IGJlCisJICogVGhlIGxpdGVyYWwgbXVzdCBiZSBzeW50YWN0aWNhbGx5IGNvcnJlY3QsIGFuZCBtdXN0IGJlCiAJICogYSBmbG9hdCBsaXRlcmFsIChlbmQgaW4gYSAnZicgb3IgJ0YnKS4gSXQgbXVzdCBub3QKIAkgKiBpbmNsdWRlIGVpdGhlciBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3IKIAkgKiBhIHNpZ24uCkBAIC01OSwxMCArNTksMTAgQEAKIAkgKiBGbG9hdC5wYXJzZUZsb2F0KG5ldyBTdHJpbmcoc291cmNlKSkgZG9lcyBpbiBKREsgMS41LAogCSAqIGV4Y2VwdCB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMgRmxvYWwuTmFOIGlmIGl0CiAJICogd291bGQgdW5kZXJmbG93IHRvIDAgKHBhcnNlRmxvYXQganVzdCByZXR1cm5zIDApLgotCSAqIFRoZSBtZXRob2QgaGFuZGxlcyBhbGwgdGhlIHRyaWNreSBjYXNlcywgaW5jbHVkaW5nIAorCSAqIFRoZSBtZXRob2QgaGFuZGxlcyBhbGwgdGhlIHRyaWNreSBjYXNlcywgaW5jbHVkaW5nCiAJICogZnJhY3Rpb24gcm91bmRpbmcgdG8gMjQgYml0cyBhbmQgZ3JhZHVhbCB1bmRlcmZsb3cuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHNvdXJjZSBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5pbmcgc2luZ2xlIHByZWNpc2lvbgogCSAqIGhleGFkZWNpbWFsIGZsb2F0aW5nLXBvaW50IGxpdGVyYWwKIAkgKiBAcmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSwgaW5jbHVkaW5nIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZCkBAIC03NSw3ICs3NSw3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZG91YmxlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIAorCSAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgogCSAqIGhleGFkZWNpbWFsIGZsb2F0aW5nLXBvaW50IGRvdWJsZSBwcmVjaXNpb24gbGl0ZXJhbC4KIAkgKiBUaGUgbGl0ZXJhbCBtdXN0IGJlIHN5bnRhY3RpYWxseSBjb3JyZWN0LCBhbmQgbXVzdCBiZQogCSAqIGEgZG91YmxlIGxpdGVyYWwgKGVuZCBpbiBhbiBvcHRpb25hbCAnZCcgb3IgJ0QnKS4KQEAgLTg2LDEwICs4NiwxMCBAQAogCSAqIERvdWJsZS5wYXJzZURvdWJsZShuZXcgU3RyaW5nKHNvdXJjZSkpIGRvZXMgaW4gSkRLIDEuNSwKIAkgKiBleGNlcHQgdGhhdCB0aGlzIG1ldGhvZCB0aHJvdyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaW4KIAkgKiB0aGUgY2FzZSBvZiBvdmVyZmxvdyB0byBpbmZpbml0eSBvciB1bmRlcmZsb3cgdG8gMC4KLQkgKiBUaGUgbWV0aG9kIGhhbmRsZXMgYWxsIHRoZSB0cmlja3kgY2FzZXMsIGluY2x1ZGluZyAKKwkgKiBUaGUgbWV0aG9kIGhhbmRsZXMgYWxsIHRoZSB0cmlja3kgY2FzZXMsIGluY2x1ZGluZwogCSAqIGZyYWN0aW9uIHJvdW5kaW5nIHRvIDUzIGJpdHMgYW5kIGdyYWR1YWwgdW5kZXJmbG93LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzb3VyY2Ugc291cmNlIHN0cmluZyBjb250YWluaW5nIGRvdWJsZSBwcmVjaXNpb24KIAkgKiBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludCBsaXRlcmFsCiAJICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBpbmNsdWRpbmcgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZCkBAIC0xMDUsMTEgKzEwNSwxMSBAQAogCSAqIFJldHVybnMgdGhlIGdpdmVuIGhleGFkZWNpbWFsIGZsb2F0aW5nLXBvaW50IGxpdGVyYWwgYXMKIAkgKiB0aGUgYml0cyBmb3IgYSBzaW5nbGUtcHJlY2lzaW9uICAoZmxvYXQpIG9yIGEKIAkgKiBkb3VibGUtcHJlY2lzaW9uIChkb3VibGUpIElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCSAqIFRoZSBsaXRlcmFsIG11c3QgYmUgc3ludGFjdGlhbGx5IGNvcnJlY3QuICBJdCBtdXN0IG5vdAorCSAqIFRoZSBsaXRlcmFsIG11c3QgYmUgc3ludGFjdGljYWxseSBjb3JyZWN0LiAgSXQgbXVzdCBub3QKIAkgKiBpbmNsdWRlIGVpdGhlciBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3IgYSBzaWduLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHNvdXJjZSBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5pbmcgaGV4YWRlY2ltYWwgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbAotCSAqIEByZXR1cm4gZm9yIGRvdWJsZSBwcmVjaXNpb24gbGl0ZXJhbHMsIGJpdHMgc3VpdGFibGUgCisJICogQHJldHVybiBmb3IgZG91YmxlIHByZWNpc2lvbiBsaXRlcmFscywgYml0cyBzdWl0YWJsZQogCSAqIGZvciBwYXNzaW5nIHRvIERvdWJsZS5sb25nQml0c1RvRG91YmxlOyBmb3Igc2luZ2xlIHByZWNpc2lvbiBsaXRlcmFscywKIAkgKiBiaXRzIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIFNpbmdsZS5pbnRCaXRzVG9Eb3VibGUgaW4gdGhlIGJvdHRvbQogCSAqIDMyIGJpdHMgb2YgdGhlIHJlc3VsdApAQCAtMzAyLDcgKzMwMiw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCS8vIFN0ZXAgOTogY29udmVydCBkb3VibGUgbGl0ZXJhbHMgdG8gSUVFRSBkb3VibGUKIAkJbG9uZyByZXN1bHQgPSAwTDsKIAkJaWYgKGRvdWJsZVByZWNpc2lvbikgewpAQCAtMzI3LDE1ICszMjcsMTUgQEAKIAkJCWludCBzY2FsZUZhY3RvciA9IDA7IC8vIGhvdyBtYW55IGJpdHMgdG8gbW92ZSAnLicgdG8gYmVmb3JlIGxlYWRpbmcgaGV4IGRpZ2l0CiAJCQlpZiAobWFudGlzc2FCaXRzID4gMCkgewogCQkJCWlmIChsZWFkaW5nRGlnaXRQb3NpdGlvbiA8IGJpbmFyeVBvaW50UG9zaXRpb24pIHsKLQkJCQkJLy8gZS5nLiwgMHg4MC4wcDAgaGFzIHNjYWxlRmFjdG9yID09ICs4IAorCQkJCQkvLyBlLmcuLCAweDgwLjBwMCBoYXMgc2NhbGVGYWN0b3IgPT0gKzgKIAkJCQkJc2NhbGVGYWN0b3IgPSA0ICogKGJpbmFyeVBvaW50UG9zaXRpb24gLSBsZWFkaW5nRGlnaXRQb3NpdGlvbik7Ci0JCQkJCS8vIGUuZy4sIDB4MTAuMHAwIGhhcyBzY2FsZUZhY3RvckNvbXBlbnNhdGlvbiA9PSArMyAKKwkJCQkJLy8gZS5nLiwgMHgxMC4wcDAgaGFzIHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uID09ICszCiAJCQkJCXNjYWxlRmFjdG9yIC09IHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uOwogCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGUuZy4sIDB4MC4wOHAwIGhhcyBzY2FsZUZhY3RvciA9PSAtNCAKKwkJCQkJLy8gZS5nLiwgMHgwLjA4cDAgaGFzIHNjYWxlRmFjdG9yID09IC00CiAJCQkJCXNjYWxlRmFjdG9yID0gLTQKIAkJCQkJCQkqIChsZWFkaW5nRGlnaXRQb3NpdGlvbiAtIGJpbmFyeVBvaW50UG9zaXRpb24gLSAxKTsKLQkJCQkJLy8gZS5nLiwgMHgwLjAxcDAgaGFzIHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uID09ICszIAorCQkJCQkvLyBlLmcuLCAweDAuMDFwMCBoYXMgc2NhbGVGYWN0b3JDb21wZW5zYXRpb24gPT0gKzMKIAkJCQkJc2NhbGVGYWN0b3IgLT0gc2NhbGVGYWN0b3JDb21wZW5zYXRpb247CiAJCQkJfQogCQkJfQpAQCAtMzg0LDE1ICszODQsMTUgQEAKIAkJaW50IHNjYWxlRmFjdG9yID0gMDsgLy8gaG93IG1hbnkgYml0cyB0byBtb3ZlICcuJyB0byBiZWZvcmUgbGVhZGluZyBoZXggZGlnaXQKIAkJaWYgKG1hbnRpc3NhQml0cyA+IDApIHsKIAkJCWlmIChsZWFkaW5nRGlnaXRQb3NpdGlvbiA8IGJpbmFyeVBvaW50UG9zaXRpb24pIHsKLQkJCQkvLyBlLmcuLCAweDgwLjBwMCBoYXMgc2NhbGVGYWN0b3IgPT0gKzggCisJCQkJLy8gZS5nLiwgMHg4MC4wcDAgaGFzIHNjYWxlRmFjdG9yID09ICs4CiAJCQkJc2NhbGVGYWN0b3IgPSA0ICogKGJpbmFyeVBvaW50UG9zaXRpb24gLSBsZWFkaW5nRGlnaXRQb3NpdGlvbik7Ci0JCQkJLy8gZS5nLiwgMHgxMC4wcDAgaGFzIHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uID09ICszIAorCQkJCS8vIGUuZy4sIDB4MTAuMHAwIGhhcyBzY2FsZUZhY3RvckNvbXBlbnNhdGlvbiA9PSArMwogCQkJCXNjYWxlRmFjdG9yIC09IHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uOwogCQkJfSBlbHNlIHsKLQkJCQkvLyBlLmcuLCAweDAuMDhwMCBoYXMgc2NhbGVGYWN0b3IgPT0gLTQgCisJCQkJLy8gZS5nLiwgMHgwLjA4cDAgaGFzIHNjYWxlRmFjdG9yID09IC00CiAJCQkJc2NhbGVGYWN0b3IgPSAtNAogCQkJCQkJKiAobGVhZGluZ0RpZ2l0UG9zaXRpb24gLSBiaW5hcnlQb2ludFBvc2l0aW9uIC0gMSk7Ci0JCQkJLy8gZS5nLiwgMHgwLjAxcDAgaGFzIHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uID09ICszIAorCQkJCS8vIGUuZy4sIDB4MC4wMXAwIGhhcyBzY2FsZUZhY3RvckNvbXBlbnNhdGlvbiA9PSArMwogCQkJCXNjYWxlRmFjdG9yIC09IHNjYWxlRmFjdG9yQ29tcGVuc2F0aW9uOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9HZW5lcmljWE1MV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9HZW5lcmljWE1MV3JpdGVyLmphdmEKaW5kZXggYTU5N2NiMC4uZTViODk4MyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvR2VuZXJpY1hNTFdyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0dlbmVyaWNYTUxXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04OSw3ICs4OSw3IEBACiAJfQogCXB1YmxpYyB2b2lkIHByaW50VGFnKFN0cmluZyBuYW1lLCBIYXNoTWFwIHBhcmFtZXRlcnMsIGJvb2xlYW4gaW5zZXJ0VGFiLCBib29sZWFuIGluc2VydE5ld0xpbmUsIGJvb2xlYW4gY2xvc2VUYWcpIHsKIAkJaWYgKGluc2VydFRhYikgewotCQkJdGhpcy5wcmludFRhYnVsYXRpb24oKTsKKwkJCXByaW50VGFidWxhdGlvbigpOwogCQl9CiAJCXRoaXMucHJpbnQoJzwnKTsKIAkJdGhpcy5wcmludChuYW1lKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2hTZXRPZkludC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaFNldE9mSW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZTJkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2hTZXRPZkludC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CisKKy8qKgorICogSGFzaFNldCBvZiBPYmplY3RbXQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSGFzaFNldE9mSW50IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKKwlwdWJsaWMgaW50W10gc2V0OworCisJcHVibGljIGludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorCWludCB0aHJlc2hvbGQ7CisKKwlwdWJsaWMgSGFzaFNldE9mSW50KCkgeworCQl0aGlzKDEzKTsKKwl9CisKKwlwdWJsaWMgSGFzaFNldE9mSW50KGludCBzaXplKSB7CisKKwkJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CisJCXRoaXMudGhyZXNob2xkID0gc2l6ZTsgLy8gc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMKKwkJaW50IGV4dHJhUm9vbSA9IChpbnQpIChzaXplICogMS43NWYpOworCQlpZiAodGhpcy50aHJlc2hvbGQgPT0gZXh0cmFSb29tKQorCQkJZXh0cmFSb29tKys7CisJCXRoaXMuc2V0ID0gbmV3IGludFtleHRyYVJvb21dOworCX0KKworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQlIYXNoU2V0T2ZJbnQgcmVzdWx0ID0gKEhhc2hTZXRPZkludCkgc3VwZXIuY2xvbmUoKTsKKwkJcmVzdWx0LmVsZW1lbnRTaXplID0gdGhpcy5lbGVtZW50U2l6ZTsKKwkJcmVzdWx0LnRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkOworCisJCWludCBsZW5ndGggPSB0aGlzLnNldC5sZW5ndGg7CisJCXJlc3VsdC5zZXQgPSBuZXcgaW50W2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zZXQsIDAsIHJlc3VsdC5zZXQsIDAsIGxlbmd0aCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgZWxlbWVudCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5zZXQubGVuZ3RoOworCQlpbnQgaW5kZXggPSBlbGVtZW50ICUgbGVuZ3RoOworCQlpbnQgY3VycmVudEVsZW1lbnQ7CisJCXdoaWxlICgoY3VycmVudEVsZW1lbnQgPSB0aGlzLnNldFtpbmRleF0pICE9IDApIHsKKwkJCWlmIChjdXJyZW50RWxlbWVudCA9PSBlbGVtZW50KQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgaW50IGFkZChpbnQgZWxlbWVudCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5zZXQubGVuZ3RoOworCQlpbnQgaW5kZXggPSBlbGVtZW50ICUgbGVuZ3RoOworCQlpbnQgY3VycmVudEVsZW1lbnQ7CisJCXdoaWxlICgoY3VycmVudEVsZW1lbnQgPSB0aGlzLnNldFtpbmRleF0pICE9IDApIHsKKwkJCWlmIChjdXJyZW50RWxlbWVudCA9PSBlbGVtZW50KQorCQkJCXJldHVybiB0aGlzLnNldFtpbmRleF0gPSBlbGVtZW50OworCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQl9CisJCXRoaXMuc2V0W2luZGV4XSA9IGVsZW1lbnQ7CisKKwkJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQorCQlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCisJCQlyZWhhc2goKTsKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHVibGljIGludCByZW1vdmUoaW50IGVsZW1lbnQpIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMuc2V0Lmxlbmd0aDsKKwkJaW50IGluZGV4ID0gZWxlbWVudCAlIGxlbmd0aDsKKwkJaW50IGN1cnJlbnRFbGVtZW50OworCQl3aGlsZSAoKGN1cnJlbnRFbGVtZW50ID0gdGhpcy5zZXRbaW5kZXhdKSAhPSAwKSB7CisJCQlpZiAoY3VycmVudEVsZW1lbnQgPT0gZWxlbWVudCkgeworCQkJCWludCBleGlzdGluZyA9IHRoaXMuc2V0W2luZGV4XTsKKwkJCQl0aGlzLmVsZW1lbnRTaXplLS07CisJCQkJdGhpcy5zZXRbaW5kZXhdID0gMDsKKwkJCQlyZWhhc2goKTsKKwkJCQlyZXR1cm4gZXhpc3Rpbmc7CisJCQl9CisJCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKKwkJCQlpbmRleCA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKworCQlIYXNoU2V0T2ZJbnQgbmV3SGFzaFNldCA9IG5ldyBIYXNoU2V0T2ZJbnQodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwkJaW50IGN1cnJlbnRFbGVtZW50OworCQlmb3IgKGludCBpID0gdGhpcy5zZXQubGVuZ3RoOyAtLWkgPj0gMDspCisJCQlpZiAoKGN1cnJlbnRFbGVtZW50ID0gdGhpcy5zZXRbaV0pICE9IDApCisJCQkJbmV3SGFzaFNldC5hZGQoY3VycmVudEVsZW1lbnQpOworCisJCXRoaXMuc2V0ID0gbmV3SGFzaFNldC5zZXQ7CisJCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaFNldC50aHJlc2hvbGQ7CisJfQorCisJcHVibGljIGludCBzaXplKCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpbnQgZWxlbWVudDsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuc2V0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKChlbGVtZW50ID0gdGhpcy5zZXRbaV0pICE9IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQpOworCQkJCWlmIChpICE9IGxlbmd0aC0xKQorCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOworCQkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEKaW5kZXggYmI5YjFkNi4uOTExZmJiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkludC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTksMTEgKzksMTEgQEAKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKLSAKKwogIC8qKgogICAqCUhhc2h0YWJsZSBmb3Igbm9uLXplcm8gaW50IGtleXMuCiAgICovCi0gIAorCiBwdWJsaWMgZmluYWwgY2xhc3MgSGFzaHRhYmxlT2ZJbnQgewogCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKIAlwdWJsaWMgaW50W10ga2V5VGFibGU7CkBAIC0zNCw5ICszNCw5IEBACiAJdGhpcy52YWx1ZVRhYmxlID0gbmV3IE9iamVjdFtleHRyYVJvb21dOwogfQogcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoaW50IGtleSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIGluZGV4ID0ga2V5ICUgbGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBrZXkgJSBsZW5ndGg7CiAJaW50IGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSAwKSB7CisJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IDApIHsKIAkJaWYgKGN1cnJlbnRLZXkgPT0ga2V5KQogCQkJcmV0dXJuIHRydWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewpAQCAtNDYsMTAgKzQ2LDEwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHVibGljIE9iamVjdCBnZXQoaW50IGtleSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIGluZGV4ID0ga2V5ICUgbGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBrZXkgJSBsZW5ndGg7CiAJaW50IGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSAwKSB7Ci0JCWlmIChjdXJyZW50S2V5ID09IGtleSkgIHJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQlpbmRleCA9IDA7CiAJCX0KQEAgLTU3LDQyICs1Nyw0MiBAQAogCXJldHVybiBudWxsOwogfQogcHVibGljIE9iamVjdCBwdXQoaW50IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwgaW5kZXggPSBrZXkgJSBsZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLCBpbmRleCA9IGtleSAlIGxlbmd0aDsKIAlpbnQgY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IDApIHsKLQkJaWYgKGN1cnJlbnRLZXkgPT0ga2V5KSAgcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IDApIHsKKwkJaWYgKGN1cnJlbnRLZXkgPT0ga2V5KSAgcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQlpbmRleCA9IDA7CiAJCX0KIAl9Ci0Ja2V5VGFibGVbaW5kZXhdID0ga2V5OwotCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisJdGhpcy5rZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwogCiAJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQotCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQorCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkKIAkJcmVoYXNoKCk7CiAJcmV0dXJuIHZhbHVlOwogfQogcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQlIYXNodGFibGVPZkludCBuZXdIYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlT2ZJbnQoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlIYXNodGFibGVPZkludCBuZXdIYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlT2ZJbnQodGhpcy5lbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cwogCWludCBjdXJyZW50S2V5OwotCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IDApCi0JCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCWZvciAoaW50IGkgPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2ldKSAhPSAwKQorCQkJbmV3SGFzaHRhYmxlLnB1dChjdXJyZW50S2V5LCB0aGlzLnZhbHVlVGFibGVbaV0pOwogCiAJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKIAl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKIAl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7CiB9CiBwdWJsaWMgaW50IHNpemUoKSB7Ci0JcmV0dXJuIGVsZW1lbnRTaXplOworCXJldHVybiB0aGlzLmVsZW1lbnRTaXplOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCiAJT2JqZWN0IG9iamVjdDsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJaWYgKChvYmplY3QgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQotCQkJcyArPSBrZXlUYWJsZVtpXSArICIgLT4gIiArIG9iamVjdC50b1N0cmluZygpICsgIlxuIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKChvYmplY3QgPSB0aGlzLnZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJCQlzICs9IHRoaXMua2V5VGFibGVbaV0gKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAogCXJldHVybiBzOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnRWYWx1ZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50VmFsdWVzLmphdmEKaW5kZXggZTBhYzY4MS4uNWU3NDNiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnRWYWx1ZXMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkludFZhbHVlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDkgKzE2LDkgQEAKICAqIEhhc2h0YWJsZSBvZiB7Y2hhcltdIC0tPiBpbnR9CiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNodGFibGVPZkludFZhbHVlcyBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19WQUxVRSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCQorCiAJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwogCXB1YmxpYyBjaGFyW10ga2V5VGFibGVbXTsKIAlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsKQEAgLTU3LDExICs1NywxMSBAQAogCX0KIAogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGNoYXJbXSBrZXkpIHsKLQkJaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwgCisJCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwKIAkJCWluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgbGVuZ3RoOwogCQlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKIAkJY2hhcltdIGN1cnJlbnRLZXk7Ci0JCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQkJaWYgKGN1cnJlbnRLZXkubGVuZ3RoID09IGtleUxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50S2V5LCBrZXkpKQogCQkJCXJldHVybiB0cnVlOwogCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CkBAIC03MiwxMyArNzIsMTMgQEAKIAl9CiAKIAlwdWJsaWMgaW50IGdldChjaGFyW10ga2V5KSB7Ci0JCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIAorCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKLQkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCQkJcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF07CiAJCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKIAkJCQlpbmRleCA9IDA7CiAJCQl9CkBAIC04NywzNyArODcsMzcgQEAKIAl9CiAKIAlwdWJsaWMgaW50IHB1dChjaGFyW10ga2V5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwgCisJCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aCwKIAkJCWluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgbGVuZ3RoOwogCQlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKIAkJY2hhcltdIGN1cnJlbnRLZXk7Ci0JCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQkJaWYgKGN1cnJlbnRLZXkubGVuZ3RoID09IGtleUxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50S2V5LCBrZXkpKQotCQkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQkJCXJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CiAJCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKIAkJCQlpbmRleCA9IDA7CiAJCQl9CiAJCX0KLQkJa2V5VGFibGVbaW5kZXhdID0ga2V5OwotCQl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQl0aGlzLmtleVRhYmxlW2luZGV4XSA9IGtleTsKKwkJdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwogCiAJCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQkJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkKIAkJCXJlaGFzaCgpOwogCQlyZXR1cm4gdmFsdWU7CiAJfQogCiAJcHVibGljIGludCByZW1vdmVLZXkoY2hhcltdIGtleSkgewotCQlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoLCAKKwkJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQkJaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOwogCQljaGFyW10gY3VycmVudEtleTsKLQkJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CiAJCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRLZXksIGtleSkpIHsKLQkJCQlpbnQgdmFsdWUgPSB2YWx1ZVRhYmxlW2luZGV4XTsKLQkJCQllbGVtZW50U2l6ZS0tOwotCQkJCWtleVRhYmxlW2luZGV4XSA9IG51bGw7Ci0JCQkJdmFsdWVUYWJsZVtpbmRleF0gPSBOT19WQUxVRTsKKwkJCQlpbnQgdmFsdWUgPSB0aGlzLnZhbHVlVGFibGVbaW5kZXhdOworCQkJCXRoaXMuZWxlbWVudFNpemUtLTsKKwkJCQl0aGlzLmtleVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQkJdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IE5PX1ZBTFVFOwogCQkJCXJlaGFzaCgpOwogCQkJCXJldHVybiB2YWx1ZTsKIAkJCX0KQEAgLTEzMCwxMSArMTMwLDExIEBACiAKIAlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewogCi0JCUhhc2h0YWJsZU9mSW50VmFsdWVzIG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZkludFZhbHVlcyhlbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwkJSGFzaHRhYmxlT2ZJbnRWYWx1ZXMgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mSW50VmFsdWVzKHRoaXMuZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCQlmb3IgKGludCBpID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaV0pICE9IG51bGwpCisJCQkJbmV3SGFzaHRhYmxlLnB1dChjdXJyZW50S2V5LCB0aGlzLnZhbHVlVGFibGVbaV0pOwogCiAJCXRoaXMua2V5VGFibGUgPSBuZXdIYXNodGFibGUua2V5VGFibGU7CiAJCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOwpAQCAtMTQyLDE1ICsxNDIsMTUgQEAKIAl9CiAKIAlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBlbGVtZW50U2l6ZTsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFNpemU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCQljaGFyW10ga2V5OwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWlmICgoa2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCi0JCQkJcyArPSBuZXcgU3RyaW5nKGtleSkgKyAiIC0+ICIgKyB2YWx1ZVRhYmxlW2ldICsgIlxuIjsgCS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy52YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKChrZXkgPSB0aGlzLmtleVRhYmxlW2ldKSAhPSBudWxsKQorCQkJCXMgKz0gbmV3IFN0cmluZyhrZXkpICsgIiAtPiAiICsgdGhpcy52YWx1ZVRhYmxlW2ldICsgIlxuIjsgCS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gczsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkxvbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mTG9uZy5qYXZhCmluZGV4IGM4NjViYTEuLjkzMTU3MzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mTG9uZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mTG9uZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTksMTEgKzksMTEgQEAKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKLSAKKwogIC8qKgogICAqCUhhc2h0YWJsZSBmb3Igbm9uLXplcm8gbG9uZyBrZXlzLgogICAqLwotICAKKwogcHVibGljIGZpbmFsIGNsYXNzIEhhc2h0YWJsZU9mTG9uZyB7CiAJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwogCXB1YmxpYyBsb25nW10ga2V5VGFibGU7CkBAIC0zNCwxMCArMzQsMTAgQEAKIAl0aGlzLnZhbHVlVGFibGUgPSBuZXcgT2JqZWN0W2V4dHJhUm9vbV07CiB9CiBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShsb25nIGtleSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsCisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQlpbmRleCA9ICgoaW50KShrZXkgPj4+IDMyKSkgJSBsZW5ndGg7CiAJbG9uZyBjdXJyZW50S2V5OwotCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSAwKSB7CiAJCWlmIChjdXJyZW50S2V5ID09IGtleSkKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKQEAgLTQ3LDExICs0NywxMSBAQAogCXJldHVybiBmYWxzZTsKIH0KIHB1YmxpYyBPYmplY3QgZ2V0KGxvbmcga2V5KSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCWluZGV4ID0gKChpbnQpKGtleSA+Pj4gMzIpKSAlIGxlbmd0aDsKIAlsb25nIGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSAwKSB7Ci0JCWlmIChjdXJyZW50S2V5ID09IGtleSkgIHJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQlpbmRleCA9IDA7CiAJCX0KQEAgLTU5LDQzICs1OSw0MyBAQAogCXJldHVybiBudWxsOwogfQogcHVibGljIE9iamVjdCBwdXQobG9uZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsCisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQlpbmRleCA9ICgoaW50KShrZXkgPj4+IDMyKSkgJSBsZW5ndGg7CiAJbG9uZyBjdXJyZW50S2V5OwotCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gMCkgewotCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKIAkJCWluZGV4ID0gMDsKIAkJfQogCX0KLQlrZXlUYWJsZVtpbmRleF0gPSBrZXk7Ci0JdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwl0aGlzLmtleVRhYmxlW2luZGV4XSA9IGtleTsKKwl0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CiAKIAkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCi0JaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKQogCQlyZWhhc2goKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiBwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCUhhc2h0YWJsZU9mTG9uZyBuZXdIYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlT2ZMb25nKGVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJSGFzaHRhYmxlT2ZMb25nIG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZkxvbmcodGhpcy5lbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cwogCWxvbmcgY3VycmVudEtleTsKLQlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICgoY3VycmVudEtleSA9IGtleVRhYmxlW2ldKSAhPSAwKQotCQkJbmV3SGFzaHRhYmxlLnB1dChjdXJyZW50S2V5LCB2YWx1ZVRhYmxlW2ldKTsKKwlmb3IgKGludCBpID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpXSkgIT0gMCkKKwkJCW5ld0hhc2h0YWJsZS5wdXQoY3VycmVudEtleSwgdGhpcy52YWx1ZVRhYmxlW2ldKTsKIAogCXRoaXMua2V5VGFibGUgPSBuZXdIYXNodGFibGUua2V5VGFibGU7CiAJdGhpcy52YWx1ZVRhYmxlID0gbmV3SGFzaHRhYmxlLnZhbHVlVGFibGU7CiAJdGhpcy50aHJlc2hvbGQgPSBuZXdIYXNodGFibGUudGhyZXNob2xkOwogfQogcHVibGljIGludCBzaXplKCkgewotCXJldHVybiBlbGVtZW50U2l6ZTsKKwlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCU9iamVjdCBvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmICgob2JqZWN0ID0gdmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCXMgKz0ga2V5VGFibGVbaV0gKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmICgob2JqZWN0ID0gdGhpcy52YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQorCQkJcyArPSB0aGlzLmtleVRhYmxlW2ldICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gczsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCmluZGV4IDk5MDQ2NGQuLjQ4OTEyYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZPYmplY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw3ICsxNiw3IEBACiAgKiBIYXNodGFibGUgb2Yge2NoYXJbXSAtLT4gT2JqZWN0IH0KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEhhc2h0YWJsZU9mT2JqZWN0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkKKwogCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKIAlwdWJsaWMgY2hhcltdIGtleVRhYmxlW107CiAJcHVibGljIE9iamVjdCB2YWx1ZVRhYmxlW107CkBAIC02MywxMSArNjMsMTEgQEAKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShjaGFyW10ga2V5KSB7Ci0JCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIAorCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewpAQCAtNzgsMTMgKzc4LDEzIEBACiAJfQogCiAJcHVibGljIE9iamVjdCBnZXQoY2hhcltdIGtleSkgewotCQlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoLCAKKwkJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQkJaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CiAJCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOwogCQljaGFyW10gY3VycmVudEtleTsKLQkJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CiAJCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCi0JCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQkJCXJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdOwogCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQkJaW5kZXggPSAwOwogCQkJfQpAQCAtOTMsMzcgKzkzLDYzIEBACiAJfQogCiAJcHVibGljIE9iamVjdCBwdXQoY2hhcltdIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIAorCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKLQkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJCQlyZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwogCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQkJaW5kZXggPSAwOwogCQkJfQogCQl9Ci0JCWtleVRhYmxlW2luZGV4XSA9IGtleTsKLQkJdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJdGhpcy5rZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAogCQkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCi0JCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQorCQlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCQlyZWhhc2goKTsKIAkJcmV0dXJuIHZhbHVlOwogCX0KIAorCS8qKgorCSAqIFB1dCBhIHZhbHVlIGF0IHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gdXNpbmcgdGhlIGxvY2FsIGhhc2ggY29kZSBjb21wdXRhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbiB1bnNhZmUgcHV0IGFzIHRoZXJlJ3Mgbm8gcHJpb3IgdmVyaWZpY2F0aW9uIHdoZXRoZXIKKwkgKiB0aGUgZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YWJsZSBvciBub3QuCisJICogPC9wPgorCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgdGFibGUgZW50cnkKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB0YWJsZSBlbnRyeQorCSAqLworCXB1YmxpYyB2b2lkIHB1dFVuc2FmZWx5KGNoYXJbXSBrZXksIE9iamVjdCB2YWx1ZSkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCisJCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKKwkJd2hpbGUgKHRoaXMua2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgeworCQkJCWluZGV4ID0gMDsKKwkJCX0KKwkJfQorCQl0aGlzLmtleVRhYmxlW2luZGV4XSA9IGtleTsKKwkJdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQorCQkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkgeworCQkJcmVoYXNoKCk7CisJCX0KKwl9CisKIAlwdWJsaWMgT2JqZWN0IHJlbW92ZUtleShjaGFyW10ga2V5KSB7Ci0JCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsIAorCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IHZhbHVlVGFibGVbaW5kZXhdOwotCQkJCWVsZW1lbnRTaXplLS07Ci0JCQkJa2V5VGFibGVbaW5kZXhdID0gbnVsbDsKLQkJCQl2YWx1ZVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQkJT2JqZWN0IHZhbHVlID0gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKKwkJCQl0aGlzLmVsZW1lbnRTaXplLS07CisJCQkJdGhpcy5rZXlUYWJsZVtpbmRleF0gPSBudWxsOworCQkJCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSBudWxsOwogCQkJCXJlaGFzaCgpOwogCQkJCXJldHVybiB2YWx1ZTsKIAkJCX0KQEAgLTEzNiwxMSArMTYyLDExIEBACiAKIAlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewogCi0JCUhhc2h0YWJsZU9mT2JqZWN0IG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZk9iamVjdChlbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwkJSGFzaHRhYmxlT2ZPYmplY3QgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KHRoaXMuZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJCWNoYXJbXSBjdXJyZW50S2V5OwotCQlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCQlmb3IgKGludCBpID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaV0pICE9IG51bGwpCisJCQkJbmV3SGFzaHRhYmxlLnB1dFVuc2FmZWx5KGN1cnJlbnRLZXksIHRoaXMudmFsdWVUYWJsZVtpXSk7CiAKIAkJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKIAkJdGhpcy52YWx1ZVRhYmxlID0gbmV3SGFzaHRhYmxlLnZhbHVlVGFibGU7CkBAIC0xNDgsMTUgKzE3NCwxNSBAQAogCX0KIAogCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRTaXplOworCQlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCiAJCU9iamVjdCBvYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJaWYgKChvYmplY3QgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQotCQkJCXMgKz0gbmV3IFN0cmluZyhrZXlUYWJsZVtpXSkgKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IAkvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCWlmICgob2JqZWN0ID0gdGhpcy52YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQorCQkJCXMgKz0gbmV3IFN0cmluZyh0aGlzLmtleVRhYmxlW2ldKSArICIgLT4gIiArIG9iamVjdC50b1N0cmluZygpICsgIlxuIjsgCS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gczsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdFRvSW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdFRvSW50LmphdmEKaW5kZXggZmRhZjU2Yi4uMjE0MzI1YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZPYmplY3RUb0ludC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0VG9JbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiAgKiBIYXNodGFibGUgb2Yge09iamVjdCAtLT4gaW50IH0KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCQorCiAJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwogCXB1YmxpYyBPYmplY3RbXSBrZXlUYWJsZTsKIAlwdWJsaWMgaW50W10gdmFsdWVUYWJsZTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQl0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CiAKIAkJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQotCQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKQogCQkJcmVoYXNoKCk7CiAJCXJldHVybiB2YWx1ZTsKIAl9CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKSB7CiAJCQkJaW50IHZhbHVlID0gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKLQkJCQllbGVtZW50U2l6ZS0tOworCQkJCXRoaXMuZWxlbWVudFNpemUtLTsKIAkJCQl0aGlzLmtleVRhYmxlW2luZGV4XSA9IG51bGw7CiAJCQkJcmVoYXNoKCk7CiAJCQkJcmV0dXJuIHZhbHVlOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKIAlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewogCi0JCUhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQoZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJCUhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAkJT2JqZWN0IGN1cnJlbnRLZXk7CiAJCWZvciAoaW50IGkgPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQogCQkJaWYgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpXSkgIT0gbnVsbCkKQEAgLTE0MSw5ICsxNDEsOSBAQAogCX0KIAogCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRTaXplOworCQlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCiAJCU9iamVjdCBrZXk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheS5qYXZhCmluZGV4IGI5MGYxYWEuLjYyNDU0MmIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDcgKzE0LDcgQEAKICAqIEhhc2h0YWJsZSBvZiB7T2JqZWN0IC0tPiBpbnRbXSB9CiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCQorCiAJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwogCXB1YmxpYyBPYmplY3RbXSBrZXlUYWJsZTsKIAlwdWJsaWMgaW50W11bXSB2YWx1ZVRhYmxlOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAogCQkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCi0JCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQorCQlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCQlyZWhhc2goKTsKIAkJcmV0dXJuIHZhbHVlOwogCX0KQEAgLTExNSw3ICsxMTUsNyBAQAogCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQkJaWYgKGN1cnJlbnRLZXkuZXF1YWxzKGtleSkpIHsKIAkJCQlpbnRbXSB2YWx1ZSA9IHRoaXMudmFsdWVUYWJsZVtpbmRleF07Ci0JCQkJZWxlbWVudFNpemUtLTsKKwkJCQl0aGlzLmVsZW1lbnRTaXplLS07CiAJCQkJdGhpcy5rZXlUYWJsZVtpbmRleF0gPSBudWxsOwogCQkJCXJlaGFzaCgpOwogCQkJCXJldHVybiB2YWx1ZTsKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKIAotCQlIYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheShlbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwkJSGFzaHRhYmxlT2ZPYmplY3RUb0ludEFycmF5IG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAkJT2JqZWN0IGN1cnJlbnRLZXk7CiAJCWZvciAoaW50IGkgPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQogCQkJaWYgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpXSkgIT0gbnVsbCkKQEAgLTE0MSwxNSArMTQxLDI4IEBACiAJfQogCiAJcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZWxlbWVudFNpemU7CisJCXJldHVybiB0aGlzLmVsZW1lbnRTaXplOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJT2JqZWN0IGtleTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlpZiAoKGtleSA9IHRoaXMua2V5VGFibGVbaV0pICE9IG51bGwpCi0JCQkJcyArPSBrZXkgKyAiIC0+ICIgKyB0aGlzLnZhbHVlVGFibGVbaV0gKyAiXG4iOyAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKChrZXkgPSB0aGlzLmtleVRhYmxlW2ldKSAhPSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZChrZXkpLmFwcGVuZCgiIC0+ICIpOyAvLyROT04tTkxTLTEkCisJCQkJaW50W10gaW50cyA9IHRoaXMudmFsdWVUYWJsZVtpXTsKKwkJCQlidWZmZXIuYXBwZW5kKCdbJyk7CisJCQkJaWYgKGludHMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBqID0gMCwgbWF4ID0gaW50cy5sZW5ndGg7IGogPCBtYXg7IGorKykgeworCQkJCQkJaWYgKGogPiAwKSB7CisJCQkJCQkJYnVmZmVyLmFwcGVuZCgnLCcpOworCQkJCQkJfQorCQkJCQkJYnVmZmVyLmFwcGVuZChpbnRzW2pdKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlidWZmZXIuYXBwZW5kKCJdXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEKaW5kZXggZGExMmZiNy4uMWVmN2RhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzMsMTEgKzMzLDExIEBACiAJdGhpcy52YWx1ZVRhYmxlID0gbmV3IFBhY2thZ2VCaW5kaW5nW2V4dHJhUm9vbV07CiB9CiBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShjaGFyW10ga2V5KSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCWluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgbGVuZ3RoOwogCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOwogCWNoYXJbXSBjdXJyZW50S2V5OwotCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKQEAgLTQ3LDEzICs0NywxMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIHB1YmxpYyBQYWNrYWdlQmluZGluZyBnZXQoY2hhcltdIGtleSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsCisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKIAljaGFyW10gY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCi0JCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCQlyZXR1cm4gdGhpcy52YWx1ZVRhYmxlW2luZGV4XTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CiAJCQlpbmRleCA9IDA7CiAJCX0KQEAgLTYxLDQ0ICs2MSw0NCBAQAogCXJldHVybiBudWxsOwogfQogcHVibGljIFBhY2thZ2VCaW5kaW5nIHB1dChjaGFyW10ga2V5LCBQYWNrYWdlQmluZGluZyB2YWx1ZSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsCisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKIAljaGFyW10gY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCi0JCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewogCQkJaW5kZXggPSAwOwogCQl9CiAJfQotCWtleVRhYmxlW2luZGV4XSA9IGtleTsKLQl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCXRoaXMua2V5VGFibGVbaW5kZXhdID0ga2V5OworCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCXJlaGFzaCgpOwogCXJldHVybiB2YWx1ZTsKIH0KIHByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JSGFzaHRhYmxlT2ZQYWNrYWdlIG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZlBhY2thZ2UoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlIYXNodGFibGVPZlBhY2thZ2UgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mUGFja2FnZSh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJY2hhcltdIGN1cnJlbnRLZXk7Ci0JZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQotCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCW5ld0hhc2h0YWJsZS5wdXQoY3VycmVudEtleSwgdmFsdWVUYWJsZVtpXSk7CisJZm9yIChpbnQgaSA9IHRoaXMua2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaV0pICE9IG51bGwpCisJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHRoaXMudmFsdWVUYWJsZVtpXSk7CiAKIAl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOwogCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOwogCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKIH0KIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLQlyZXR1cm4gZWxlbWVudFNpemU7CisJcmV0dXJuIHRoaXMuZWxlbWVudFNpemU7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKIAlQYWNrYWdlQmluZGluZyBwa2c7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmICgocGtnID0gdmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy52YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoKHBrZyA9IHRoaXMudmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkKIAkJCXMgKz0gcGtnLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mVHlwZS5qYXZhCmluZGV4IDVjODdiMTIuLjc5MzFlNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMzLDExICszMywxMSBAQAogCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2V4dHJhUm9vbV07CiB9CiBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShjaGFyW10ga2V5KSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCWluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgbGVuZ3RoOwogCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOwogCWNoYXJbXSBjdXJyZW50S2V5OwotCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKQEAgLTQ3LDEzICs0NywxMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIHB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldChjaGFyW10ga2V5KSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aCwKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGgsCiAJCWluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgbGVuZ3RoOwogCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOwogCWNoYXJbXSBjdXJyZW50S2V5OwotCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEtleSwga2V5KSkKLQkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwkJCXJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKIAkJCWluZGV4ID0gMDsKIAkJfQpAQCAtNjEsNDQgKzYxLDQ0IEBACiAJcmV0dXJuIG51bGw7CiB9CiBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBwdXQoY2hhcltdIGtleSwgUmVmZXJlbmNlQmluZGluZyB2YWx1ZSkgewotCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGgsCisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoLAogCQlpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKIAlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKIAljaGFyW10gY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCi0JCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgewogCQkJaW5kZXggPSAwOwogCQl9CiAJfQotCWtleVRhYmxlW2luZGV4XSA9IGtleTsKLQl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCXRoaXMua2V5VGFibGVbaW5kZXhdID0ga2V5OworCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCXJlaGFzaCgpOwogCXJldHVybiB2YWx1ZTsKIH0KIHByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JSGFzaHRhYmxlT2ZUeXBlIG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZlR5cGUoZWxlbWVudFNpemUgPCAxMDAgPyAxMDAgOiBlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCUhhc2h0YWJsZU9mVHlwZSBuZXdIYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKHRoaXMuZWxlbWVudFNpemUgPCAxMDAgPyAxMDAgOiB0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJY2hhcltdIGN1cnJlbnRLZXk7Ci0JZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQotCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCW5ld0hhc2h0YWJsZS5wdXQoY3VycmVudEtleSwgdmFsdWVUYWJsZVtpXSk7CisJZm9yIChpbnQgaSA9IHRoaXMua2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaV0pICE9IG51bGwpCisJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHRoaXMudmFsdWVUYWJsZVtpXSk7CiAKIAl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOwogCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOwogCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKIH0KIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLQlyZXR1cm4gZWxlbWVudFNpemU7CisJcmV0dXJuIHRoaXMuZWxlbWVudFNpemU7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKIAlSZWZlcmVuY2VCaW5kaW5nIHR5cGU7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWlmICgodHlwZSA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKCh0eXBlID0gdGhpcy52YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQogCQkJcyArPSB0eXBlLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9NYW5pZmVzdEFuYWx5emVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9NYW5pZmVzdEFuYWx5emVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNDJhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL01hbmlmZXN0QW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWFuaWZlc3RBbmFseXplciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50CisJCVNUQVJUID0gMCwKKwkJSU5fQ0xBU1NQQVRIX0hFQURFUiA9IDEsIC8vIG11bHRpc3RhdGUKKwkJUEFTVF9DTEFTU1BBVEhfSEVBREVSID0gMiwKKwkJU0tJUFBJTkdfV0hJVEVTUEFDRSA9IDMsCisJCVJFQURJTkdfSkFSID0gNCwKKwkJQ09OVElOVUlORyA9IDUsCisJCVNLSVBfTElORSA9IDY7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENMQVNTUEFUSF9IRUFERVJfVE9LRU4gPQorCQkiQ2xhc3MtUGF0aDoiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGludCBjbGFzc3BhdGhTZWN0aW9uc0NvdW50OworCXByaXZhdGUgQXJyYXlMaXN0IGNhbGxlZEZpbGVzTmFtZXM7CisJCisJLyoqCisJICogQW5hbHl6ZSB0aGUgbWFuaWZlc3QgY29udGVudHMuIFRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gaXMgcmVhZCB1c2luZyBhIFVURi04IGVuY29kZWQgcmVhZGVyLgorCSAqIElmIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgc3RyZWFtIGlzIG5vdCBlbmNvZGVkIHVzaW5nIGEgVVRGLTggZW5jb2RpbmcsIHRoZSBhbmFseXNpcyB3aWxsIGZhaWwuCisJICogCisJICogQHBhcmFtIGlucHV0U3RyZWFtIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5hbHlzaXMgaXMgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYW5hbHl6aW5nIHRoZSBmaWxlCisJICovCisJcHVibGljIGJvb2xlYW4gYW5hbHl6ZU1hbmlmZXN0Q29udGVudHMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoYXJbXSBjaGFycyA9IFV0aWwuZ2V0SW5wdXRTdHJlYW1Bc0NoYXJBcnJheShpbnB1dFN0cmVhbSwgLTEsIFV0aWwuVVRGXzgpOworCQlpbnQgc3RhdGUgPSBTVEFSVCwgc3Vic3RhdGUgPSAwOworCQlTdHJpbmdCdWZmZXIgY3VycmVudEphclRva2VuID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpbnQgY3VycmVudENoYXI7CisJCXRoaXMuY2xhc3NwYXRoU2VjdGlvbnNDb3VudCA9IDA7CisJCXRoaXMuY2FsbGVkRmlsZXNOYW1lcyA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjaGFycy5sZW5ndGg7IGkgPCBtYXg7KSB7CisJCQljdXJyZW50Q2hhciA9IGNoYXJzW2krK107CisJCQlpZiAoY3VycmVudENoYXIgPT0gJ1xyJykgeworCQkJCS8vIHNraXAgXHIsIHdpbGwgY29uc2lkZXIgXG4gbGF0ZXIgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxMDc5ICkKKwkJCQlpZiAoaSA8IG1heCkgeworCQkJCQljdXJyZW50Q2hhciA9IGNoYXJzW2krK107CisJCQkJfQorCQkJfQorCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJCWNhc2UgU1RBUlQ6CisJCQkJCWlmIChjdXJyZW50Q2hhciA9PSBDTEFTU1BBVEhfSEVBREVSX1RPS0VOWzBdKSB7CisJCQkJCQlzdGF0ZSA9IElOX0NMQVNTUEFUSF9IRUFERVI7CisJCQkJCQlzdWJzdGF0ZSA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdGF0ZSA9IFNLSVBfTElORTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIElOX0NMQVNTUEFUSF9IRUFERVI6CisJCQkJCWlmIChjdXJyZW50Q2hhciA9PSAnXG4nKSB7CisJCQkJCQlzdGF0ZSA9IFNUQVJUOworCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRDaGFyICE9IENMQVNTUEFUSF9IRUFERVJfVE9LRU5bc3Vic3RhdGUrK10pIHsKKwkJCQkJCXN0YXRlID0gU0tJUF9MSU5FOworCQkJCQl9IGVsc2UgaWYgKHN1YnN0YXRlID09IENMQVNTUEFUSF9IRUFERVJfVE9LRU4ubGVuZ3RoKSB7CisJCQkJCQlzdGF0ZSA9IFBBU1RfQ0xBU1NQQVRIX0hFQURFUjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFBBU1RfQ0xBU1NQQVRIX0hFQURFUjoKKwkJCQkJaWYgKGN1cnJlbnRDaGFyID09ICcgJykgeworCQkJCQkJc3RhdGUgPSBTS0lQUElOR19XSElURVNQQUNFOworCQkJCQkJdGhpcy5jbGFzc3BhdGhTZWN0aW9uc0NvdW50Kys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTS0lQUElOR19XSElURVNQQUNFOgorCQkJCQlpZiAoY3VycmVudENoYXIgPT0gJ1xuJykgeworCQkJCQkJc3RhdGUgPSBDT05USU5VSU5HOworCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRDaGFyICE9ICcgJykgeworCQkJCQkJY3VycmVudEphclRva2VuLmFwcGVuZCgoY2hhcikgY3VycmVudENoYXIpOworCQkJCQkJc3RhdGUgPSBSRUFESU5HX0pBUjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBBZGQgdGhlIGxhdGVzdCBqYXIgcmVhZAorCQkJCQkJYWRkQ3VycmVudFRva2VuSmFyV2hlbk5lY2Vzc2FyeShjdXJyZW50SmFyVG9rZW4pOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ09OVElOVUlORzoKKwkJCQkJaWYgKGN1cnJlbnRDaGFyID09ICdcbicpIHsKKwkJCQkJCWFkZEN1cnJlbnRUb2tlbkphcldoZW5OZWNlc3NhcnkoY3VycmVudEphclRva2VuKTsKKwkJCQkJCXN0YXRlID0gU1RBUlQ7CisJCQkJCX0gZWxzZSBpZiAoY3VycmVudENoYXIgPT0gJyAnKSB7CisJCQkJCQlzdGF0ZSA9IFNLSVBQSU5HX1dISVRFU1BBQ0U7CisJCQkJCX0gZWxzZSBpZiAoY3VycmVudENoYXIgPT0gQ0xBU1NQQVRIX0hFQURFUl9UT0tFTlswXSkgeworCQkJCQkJYWRkQ3VycmVudFRva2VuSmFyV2hlbk5lY2Vzc2FyeShjdXJyZW50SmFyVG9rZW4pOworCQkJCQkJc3RhdGUgPSBJTl9DTEFTU1BBVEhfSEVBREVSOworCQkJCQkJc3Vic3RhdGUgPSAxOworCQkJCQl9IGVsc2UgaWYgKHRoaXMuY2FsbGVkRmlsZXNOYW1lcyA9PSBudWxsKSB7CisJCQkJCQkvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gQWRkIHRoZSBsYXRlc3QgamFyIHJlYWQKKwkJCQkJCWFkZEN1cnJlbnRUb2tlbkphcldoZW5OZWNlc3NhcnkoY3VycmVudEphclRva2VuKTsKKwkJCQkJCXN0YXRlID0gU1RBUlQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gQWRkIHRoZSBsYXRlc3QgamFyIHJlYWQKKwkJCQkJCWFkZEN1cnJlbnRUb2tlbkphcldoZW5OZWNlc3NhcnkoY3VycmVudEphclRva2VuKTsKKwkJCQkJCXN0YXRlID0gU0tJUF9MSU5FOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0tJUF9MSU5FOgorCQkJCQlpZiAoY3VycmVudENoYXIgPT0gJ1xuJykgeworCQkJCQkJc3RhdGUgPSBTVEFSVDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURJTkdfSkFSOgorCQkJCQlpZiAoY3VycmVudENoYXIgPT0gJ1xuJykgeworCQkJCQkJLy8gYXBwZW5kcyB0b2tlbiBiZWxvdworCQkJCQkJc3RhdGUgPSBDT05USU5VSU5HOworCQkJCQkJLy8gPj4+Pj4+Pj4+Pj4gQWRkIGEgYnJlYWsgdG8gbm90IGFkZCB0aGUgamFyIHlldCBhcyBpdCBjYW4gY29udGludWUgb24gdGhlIG5leHQgbGluZQorCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAoY3VycmVudENoYXIgPT0gJyAnKSB7CisJCQkJCQkvLyBhcHBlbmRzIHRva2VuIGJlbG93CisJCQkJCQlzdGF0ZSA9IFNLSVBQSU5HX1dISVRFU1BBQ0U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljdXJyZW50SmFyVG9rZW4uYXBwZW5kKChjaGFyKSBjdXJyZW50Q2hhcik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlhZGRDdXJyZW50VG9rZW5KYXJXaGVuTmVjZXNzYXJ5KGN1cnJlbnRKYXJUb2tlbik7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgU1RBUlQ6CisJCQkJcmV0dXJuIHRydWU7CisJCQljYXNlIElOX0NMQVNTUEFUSF9IRUFERVI6CisJCQkJcmV0dXJuIHRydWU7CisJCQljYXNlIFBBU1RfQ0xBU1NQQVRIX0hFQURFUjoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljYXNlIFNLSVBQSU5HX1dISVRFU1BBQ0U6CisJCQkJLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+IEFkZCB0aGUgbGF0ZXN0IGphciByZWFkCisJCQkJYWRkQ3VycmVudFRva2VuSmFyV2hlbk5lY2Vzc2FyeShjdXJyZW50SmFyVG9rZW4pOworCQkJCXJldHVybiB0cnVlOworCQkJY2FzZSBDT05USU5VSU5HOgorCQkJCS8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBBZGQgdGhlIGxhdGVzdCBqYXIgcmVhZAorCQkJCWFkZEN1cnJlbnRUb2tlbkphcldoZW5OZWNlc3NhcnkoY3VycmVudEphclRva2VuKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWNhc2UgU0tJUF9MSU5FOgorCQkJCWlmICh0aGlzLmNsYXNzcGF0aFNlY3Rpb25zQ291bnQgIT0gMCkgeworCQkJCQlpZiAodGhpcy5jYWxsZWRGaWxlc05hbWVzID09IG51bGwpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWNhc2UgUkVBRElOR19KQVI6CisJCQkJLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+IEFkZCB0aGUgbGF0ZXN0IGphciByZWFkCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8vID4+Pj4+Pj4+Pj4+Pj4+Pj4gTWV0aG9kIEV4dHJhY3RlZCBmcm9tIGFuYWx5emVNYW5pZmVzdENvbnRlbnRzIGluIHRoZSBSRUFESU5HX0pBUiBCbG9jaworCXByaXZhdGUgYm9vbGVhbiBhZGRDdXJyZW50VG9rZW5KYXJXaGVuTmVjZXNzYXJ5KFN0cmluZ0J1ZmZlciBjdXJyZW50SmFyVG9rZW4pIHsKKwkJaWYgKGN1cnJlbnRKYXJUb2tlbiAhPSBudWxsICYmIGN1cnJlbnRKYXJUb2tlbi5sZW5ndGgoKSA+IDApIHsKKwkJCWlmICh0aGlzLmNhbGxlZEZpbGVzTmFtZXMgPT0gbnVsbCkgeworCQkJCXRoaXMuY2FsbGVkRmlsZXNOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCX0KKwkJCXRoaXMuY2FsbGVkRmlsZXNOYW1lcy5hZGQoY3VycmVudEphclRva2VuLnRvU3RyaW5nKCkpOworCQkJY3VycmVudEphclRva2VuLnNldExlbmd0aCgwKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJLy8gPDw8PDw8PDw8PDw8PDw8PDw8PDw8PAorCisKKwlwdWJsaWMgaW50IGdldENsYXNzcGF0aFNlY3Rpb25zQ291bnQoKSB7CisJCXJldHVybiB0aGlzLmNsYXNzcGF0aFNlY3Rpb25zQ291bnQ7CisJfQorCXB1YmxpYyBMaXN0IGdldENhbGxlZEZpbGVOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuY2FsbGVkRmlsZXNOYW1lczsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvTWVzc2FnZXMuamF2YQppbmRleCA0NjgyMjEyLi42ZTRiMmJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9NZXNzYWdlcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL01lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzMsOSArMzMsOSBAQAogCQlwdWJsaWMgTWVzc2FnZXNQcm9wZXJ0aWVzKEZpZWxkW10gZmllbGRBcnJheSwgU3RyaW5nIGJ1bmRsZU5hbWUpIHsKIAkJCXN1cGVyKCk7CiAJCQlmaW5hbCBpbnQgbGVuID0gZmllbGRBcnJheS5sZW5ndGg7Ci0JCQlmaWVsZHMgPSBuZXcgSGFzaE1hcChsZW4gKiAyKTsKKwkJCXRoaXMuZmllbGRzID0gbmV3IEhhc2hNYXAobGVuICogMik7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZmllbGRzLnB1dChmaWVsZEFycmF5W2ldLmdldE5hbWUoKSwgZmllbGRBcnJheVtpXSk7CisJCQkJdGhpcy5maWVsZHMucHV0KGZpZWxkQXJyYXlbaV0uZ2V0TmFtZSgpLCBmaWVsZEFycmF5W2ldKTsKIAkJCX0KIAkJfQogCkBAIC00NCw3ICs0NCw3IEBACiAJCSAqLwogCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CiAJCQl0cnkgewotCQkJCUZpZWxkIGZpZWxkID0gKEZpZWxkKSBmaWVsZHMuZ2V0KGtleSk7CisJCQkJRmllbGQgZmllbGQgPSAoRmllbGQpIHRoaXMuZmllbGRzLmdldChrZXkpOwogCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7CiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KQEAgLTY3LDcgKzY3LDcgQEAKIAkJfQogCX0KIAotCQorCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmxTdWZmaXhlczsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAogCkBAIC04Nyw2ICs4Nyw4IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsYXRpb25fdW5pdHM7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsYXRpb25fdW5pdDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxhdGlvbl9pbnRlcm5hbEVycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGF0aW9uX2JlZ2lubmluZ1RvQ29tcGlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxhdGlvbl9wcm9jZXNzaW5nOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dF9pc0ZpbGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0X25vdFZhbGlkQWxsOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dF9ub3RWYWxpZDsKQEAgLTk0LDYgKzk2LDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtX2F0TGluZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBhYm9ydF9pbnZhbGlkQXR0cmlidXRlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFib3J0X2ludmFsaWRFeGNlcHRpb25BdHRyaWJ1dGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWJvcnRfaW52YWxpZE9wY29kZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBhYm9ydF9taXNzaW5nQ29kZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBhYm9ydF9hZ2FpbnN0U291cmNlTW9kZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgYWNjZXB0X2Nhbm5vdDsKQEAgLTExNCwyMCArMTE3LDIwIEBACiAJc3RhdGljIHsKIAkJaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7CiAJfQotCQorCiAJLyoqCiAJICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCiAJICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSkgewogCQlyZXR1cm4gYmluZChtZXNzYWdlLCBudWxsKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKIAkgKiBAcGFyYW0gYmluZGluZyB0aGUgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKIAkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKQEAgLTEzOCw3ICsxNDEsNyBAQAogCiAJLyoqCiAJICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCiAJICogQHBhcmFtIGJpbmRpbmcxIEFuIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCiAJICogQHBhcmFtIGJpbmRpbmcyIEEgc2Vjb25kIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCkBAIC0xNTAsNyArMTUzLDcgQEAKIAogCS8qKgogCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAogCSAqIEBwYXJhbSBiaW5kaW5ncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKIAkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKQEAgLTE1OCw3ICsxNjEsNyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGJpbmRpbmdzKSB7CiAJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBiaW5kaW5ncyk7CiAJfQotCQorCiAJLyoKIAkgKiBCdWlsZCBhbiBhcnJheSBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2gKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL09iamVjdFZlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvT2JqZWN0VmVjdG9yLmphdmEKaW5kZXggMWUwMGEzMi4uMDdkYmZiYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvT2JqZWN0VmVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvT2JqZWN0VmVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTcgKzExLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0VmVjdG9yIHsKLQkKKwogCXN0YXRpYyBpbnQgSU5JVElBTF9TSVpFID0gMTA7CiAKIAlwdWJsaWMgaW50IHNpemU7CiAJaW50IG1heFNpemU7CiAJT2JqZWN0W10gZWxlbWVudHM7Ci0JCisKIAlwdWJsaWMgT2JqZWN0VmVjdG9yKCkgewogCQl0aGlzKElOSVRJQUxfU0laRSk7CiAJfQotCQorCiAJcHVibGljIE9iamVjdFZlY3RvcihpbnQgaW5pdGlhbFNpemUpIHsKIAkJdGhpcy5tYXhTaXplID0gaW5pdGlhbFNpemUgPiAwID8gaW5pdGlhbFNpemUgOiBJTklUSUFMX1NJWkU7CiAJCXRoaXMuc2l6ZSA9IDA7CkBAIC0zOCwyMCArMzgsMjAgQEAKIAlwdWJsaWMgdm9pZCBhZGRBbGwoT2JqZWN0W10gbmV3RWxlbWVudHMpIHsKIAogCQlpZiAodGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoID49IHRoaXMubWF4U2l6ZSkgewotCQkJbWF4U2l6ZSA9IHRoaXMuc2l6ZSArIG5ld0VsZW1lbnRzLmxlbmd0aDsgLy8gYXNzdW1lIG5vIG1vcmUgZWxlbWVudHMgd2lsbCBiZSBhZGRlZAorCQkJdGhpcy5tYXhTaXplID0gdGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOyAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IE9iamVjdFt0aGlzLm1heFNpemVdKSwgMCwgdGhpcy5zaXplKTsKIAkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KG5ld0VsZW1lbnRzLCAwLCB0aGlzLmVsZW1lbnRzLCBzaXplLCBuZXdFbGVtZW50cy5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KG5ld0VsZW1lbnRzLCAwLCB0aGlzLmVsZW1lbnRzLCB0aGlzLnNpemUsIG5ld0VsZW1lbnRzLmxlbmd0aCk7CiAJCXRoaXMuc2l6ZSArPSBuZXdFbGVtZW50cy5sZW5ndGg7CiAJfQogCiAJcHVibGljIHZvaWQgYWRkQWxsKE9iamVjdFZlY3RvciBuZXdWZWN0b3IpIHsKIAogCQlpZiAodGhpcy5zaXplICsgbmV3VmVjdG9yLnNpemUgPj0gdGhpcy5tYXhTaXplKSB7Ci0JCQltYXhTaXplID0gdGhpcy5zaXplICsgbmV3VmVjdG9yLnNpemU7IC8vIGFzc3VtZSBubyBtb3JlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKKwkJCXRoaXMubWF4U2l6ZSA9IHRoaXMuc2l6ZSArIG5ld1ZlY3Rvci5zaXplOyAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IE9iamVjdFt0aGlzLm1heFNpemVdKSwgMCwgdGhpcy5zaXplKTsKIAkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1ZlY3Rvci5lbGVtZW50cywgMCwgdGhpcy5lbGVtZW50cywgc2l6ZSwgbmV3VmVjdG9yLnNpemUpOworCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1ZlY3Rvci5lbGVtZW50cywgMCwgdGhpcy5lbGVtZW50cywgdGhpcy5zaXplLCBuZXdWZWN0b3Iuc2l6ZSk7CiAJCXRoaXMuc2l6ZSArPSBuZXdWZWN0b3Iuc2l6ZTsKIAl9CiAKQEAgLTc4LDE1ICs3OCwxNSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIGNvcHlJbnRvKE9iamVjdFtdIHRhcmdldEFycmF5KXsKLQkJCisKIAkJdGhpcy5jb3B5SW50byh0YXJnZXRBcnJheSwgMCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29weUludG8oT2JqZWN0W10gdGFyZ2V0QXJyYXksIGludCBpbmRleCl7Ci0JCQorCiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgdGFyZ2V0QXJyYXksIGluZGV4LCB0aGlzLnNpemUpOwotCX0JCi0JCisJfQorCiAJcHVibGljIE9iamVjdCBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAKIAkJcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdOwpAQCAtOTYsNyArOTYsNyBAQAogCiAJCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKIAkJCWlmIChlbGVtZW50LmVxdWFscyh0aGlzLmVsZW1lbnRzW2ldKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKKwkJCQlyZXR1cm4gdGhpcy5lbGVtZW50c1tpXTsKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0xMTQsMTkgKzExNCwxOSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJCisKIAkJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQogCQkJdGhpcy5lbGVtZW50c1tpXSA9IG51bGw7CiAJCXRoaXMuc2l6ZSA9IDA7CiAJfQogCiAJcHVibGljIGludCBzaXplKCl7Ci0JCQorCiAJCXJldHVybiB0aGlzLnNpemU7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCisKIAkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKQogCQkJcyArPSB0aGlzLmVsZW1lbnRzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVMb29rdXBUYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTG9va3VwVGFibGUuamF2YQppbmRleCAyZWM2ZDg3Li5jMjYzY2E0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVMb29rdXBUYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZUxvb2t1cFRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTMsMTAgKzUzLDEwIEBACiB9CiAKIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKIAlpbnQgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKIAlPYmplY3QgY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5lcXVhbHMoa2V5KSkgcmV0dXJuIHRydWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KQEAgLTY0LDIxICs2NCwyMSBAQAogfQogCiBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CiAJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CiAJT2JqZWN0IGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7Ci0JCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKSByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJd2hpbGUgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJaWYgKGN1cnJlbnRLZXkuZXF1YWxzKGtleSkpIHJldHVybiB0aGlzLnZhbHVlVGFibGVbaW5kZXhdOwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIGluZGV4ID0gMDsKIAl9CiAJcmV0dXJuIG51bGw7CiB9CiAKIHB1YmxpYyBPYmplY3QgZ2V0S2V5KE9iamVjdCBrZXkpIHsKLQlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKIAlpbnQgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKIAlPYmplY3QgY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5lcXVhbHMoa2V5KSkgcmV0dXJuIGN1cnJlbnRLZXk7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KQEAgLTg3LDM5ICs4NywzOSBAQAogCiBwdWJsaWMgT2JqZWN0IGtleUZvclZhbHVlKE9iamVjdCB2YWx1ZVRvTWF0Y2gpIHsKIAlpZiAodmFsdWVUb01hdGNoICE9IG51bGwpCi0JCWZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwgJiYgdmFsdWVUb01hdGNoLmVxdWFscyh2YWx1ZVRhYmxlW2ldKSkKLQkJCQlyZXR1cm4ga2V5VGFibGVbaV07CisJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQlpZiAodGhpcy5rZXlUYWJsZVtpXSAhPSBudWxsICYmIHZhbHVlVG9NYXRjaC5lcXVhbHModGhpcy52YWx1ZVRhYmxlW2ldKSkKKwkJCQlyZXR1cm4gdGhpcy5rZXlUYWJsZVtpXTsKIAlyZXR1cm4gbnVsbDsKIH0KIAogcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CiAJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CiAJT2JqZWN0IGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7Ci0JCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKSByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoY3VycmVudEtleS5lcXVhbHMoa2V5KSkgcmV0dXJuIHRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CiAJfQotCWtleVRhYmxlW2luZGV4XSA9IGtleTsKLQl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCXRoaXMua2V5VGFibGVbaW5kZXhdID0ga2V5OworCXRoaXMudmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgcmVoYXNoKCk7CisJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKSByZWhhc2goKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKIHB1YmxpYyBPYmplY3QgcmVtb3ZlS2V5KE9iamVjdCBrZXkpIHsKLQlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKIAlpbnQgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKIAlPYmplY3QgY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSB0aGlzLmtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudEtleS5lcXVhbHMoa2V5KSkgewotCQkJZWxlbWVudFNpemUtLTsKLQkJCU9iamVjdCBvbGRWYWx1ZSA9IHZhbHVlVGFibGVbaW5kZXhdOwotCQkJa2V5VGFibGVbaW5kZXhdID0gbnVsbDsKLQkJCXZhbHVlVGFibGVbaW5kZXhdID0gbnVsbDsKLQkJCWlmIChrZXlUYWJsZVtpbmRleCArIDEgPT0gbGVuZ3RoID8gMCA6IGluZGV4ICsgMV0gIT0gbnVsbCkKKwkJCXRoaXMuZWxlbWVudFNpemUtLTsKKwkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWVUYWJsZVtpbmRleF07CisJCQl0aGlzLmtleVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQl0aGlzLnZhbHVlVGFibGVbaW5kZXhdID0gbnVsbDsKKwkJCWlmICh0aGlzLmtleVRhYmxlW2luZGV4ICsgMSA9PSBsZW5ndGggPyAwIDogaW5kZXggKyAxXSAhPSBudWxsKQogCQkJCXJlaGFzaCgpOyAvLyBvbmx5IG5lZWRlZCBpZiBhIHBvc3NpYmxlIGNvbGxpc2lvbiBleGlzdGVkCiAJCQlyZXR1cm4gb2xkVmFsdWU7CiAJCX0KQEAgLTEzMCwxMyArMTMwLDEzIEBACiAKIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKE9iamVjdCB2YWx1ZVRvUmVtb3ZlKSB7CiAJYm9vbGVhbiByZWhhc2ggPSBmYWxzZTsKLQlmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlVGFibGVbaV07CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCU9iamVjdCB2YWx1ZSA9IHRoaXMudmFsdWVUYWJsZVtpXTsKIAkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKHZhbHVlVG9SZW1vdmUpKSB7Ci0JCQllbGVtZW50U2l6ZS0tOwotCQkJa2V5VGFibGVbaV0gPSBudWxsOwotCQkJdmFsdWVUYWJsZVtpXSA9IG51bGw7Ci0JCQlpZiAoIXJlaGFzaCAmJiBrZXlUYWJsZVtpICsgMSA9PSBsID8gMCA6IGkgKyAxXSAhPSBudWxsKQorCQkJdGhpcy5lbGVtZW50U2l6ZS0tOworCQkJdGhpcy5rZXlUYWJsZVtpXSA9IG51bGw7CisJCQl0aGlzLnZhbHVlVGFibGVbaV0gPSBudWxsOworCQkJaWYgKCFyZWhhc2ggJiYgdGhpcy5rZXlUYWJsZVtpICsgMSA9PSBsID8gMCA6IGkgKyAxXSAhPSBudWxsKQogCQkJCXJlaGFzaCA9IHRydWU7IC8vIG9ubHkgbmVlZGVkIGlmIGEgcG9zc2libGUgY29sbGlzaW9uIGV4aXN0ZWQKIAkJfQogCX0KQEAgLTE0NCwxMSArMTQ0LDExIEBACiB9CiAKIHByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JU2ltcGxlTG9va3VwVGFibGUgbmV3TG9va3VwVGFibGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlTaW1wbGVMb29rdXBUYWJsZSBuZXdMb29rdXBUYWJsZSA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJT2JqZWN0IGN1cnJlbnRLZXk7Ci0JZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQotCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gbnVsbCkKLQkJCW5ld0xvb2t1cFRhYmxlLnB1dChjdXJyZW50S2V5LCB2YWx1ZVRhYmxlW2ldKTsKKwlmb3IgKGludCBpID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpXSkgIT0gbnVsbCkKKwkJCW5ld0xvb2t1cFRhYmxlLnB1dChjdXJyZW50S2V5LCB0aGlzLnZhbHVlVGFibGVbaV0pOwogCiAJdGhpcy5rZXlUYWJsZSA9IG5ld0xvb2t1cFRhYmxlLmtleVRhYmxlOwogCXRoaXMudmFsdWVUYWJsZSA9IG5ld0xvb2t1cFRhYmxlLnZhbHVlVGFibGU7CkBAIC0xNTksOSArMTU5LDkgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCU9iamVjdCBvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJaWYgKChvYmplY3QgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQotCQkJcyArPSBrZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlpZiAoKG9iamVjdCA9IHRoaXMudmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkKKwkJCXMgKz0gdGhpcy5rZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVOYW1lVmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVOYW1lVmVjdG9yLmphdmEKaW5kZXggMGM5OGVhMC4uMWRmZGQwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTmFtZVZlY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZU5hbWVWZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywyOSArMTMsMjkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlTmFtZVZlY3RvciB7Ci0JCisKIAlzdGF0aWMgaW50IElOSVRJQUxfU0laRSA9IDEwOwogCiAJcHVibGljIGludCBzaXplOwogCWludCBtYXhTaXplOwogCWNoYXJbXVtdIGVsZW1lbnRzOwotCQorCiAJcHVibGljIFNpbXBsZU5hbWVWZWN0b3IoKSB7Ci0JCQorCiAJCXRoaXMubWF4U2l6ZSA9IElOSVRJQUxfU0laRTsKIAkJdGhpcy5zaXplID0gMDsKIAkJdGhpcy5lbGVtZW50cyA9IG5ldyBjaGFyW3RoaXMubWF4U2l6ZV1bXTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBhZGQoY2hhcltdIG5ld0VsZW1lbnQpIHsKLQkJCisKIAkJaWYgKHRoaXMuc2l6ZSA9PSB0aGlzLm1heFNpemUpIC8vIGtub3dzIHRoYXQgc2l6ZSBzdGFydHMgPD0gbWF4U2l6ZQogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCAwLCAodGhpcy5lbGVtZW50cyA9IG5ldyBjaGFyW3RoaXMubWF4U2l6ZSAqPSAyXVtdKSwgMCwgdGhpcy5zaXplKTsKLQkJdGhpcy5lbGVtZW50c1tzaXplKytdID0gbmV3RWxlbWVudDsKKwkJdGhpcy5lbGVtZW50c1t0aGlzLnNpemUrK10gPSBuZXdFbGVtZW50OwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGFkZEFsbChjaGFyW11bXSBuZXdFbGVtZW50cykgewotCQkKKwogCQlpZiAodGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoID49IHRoaXMubWF4U2l6ZSkgewogCQkJdGhpcy5tYXhTaXplID0gdGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOyAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IGNoYXJbdGhpcy5tYXhTaXplXVtdKSwgMCwgdGhpcy5zaXplKTsKQEAgLTQzLDI2ICs0MywyNiBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KG5ld0VsZW1lbnRzLCAwLCB0aGlzLmVsZW1lbnRzLCB0aGlzLnNpemUsIG5ld0VsZW1lbnRzLmxlbmd0aCk7CiAJCXRoaXMuc2l6ZSArPSBuZXdFbGVtZW50cy5sZW5ndGg7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29weUludG8oT2JqZWN0W10gdGFyZ2V0QXJyYXkpewotCQkKKwogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsIHRhcmdldEFycmF5LCAwLCB0aGlzLnNpemUpOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGNoYXJbXSBlbGVtZW50KSB7Ci0JCQorCiAJCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKIAkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50LCB0aGlzLmVsZW1lbnRzW2ldKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBjaGFyW10gZWxlbWVudEF0KGludCBpbmRleCkgewogCQlyZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07CiAJfQotCQorCiAJcHVibGljIGNoYXJbXSByZW1vdmUoY2hhcltdIGVsZW1lbnQpIHsKLQkJCisKIAkJLy8gYXNzdW1lcyBvbmx5IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBlbGVtZW50IGV4aXN0cwogCQlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCiAJCQlpZiAoZWxlbWVudCA9PSB0aGlzLmVsZW1lbnRzW2ldKSB7CkBAIC03MywxOSArNzMsMTkgQEAKIAkJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQkKKwogCQlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCiAJCQl0aGlzLmVsZW1lbnRzW2ldID0gbnVsbDsKIAkJdGhpcy5zaXplID0gMDsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IHNpemUoKXsKLQkJCisKIAkJcmV0dXJuIHRoaXMuc2l6ZTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZVNldC5qYXZhCmluZGV4IDU2MzFmNDcuLjIzMzliMWIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZVNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTkwLDEwICs5MCwxMCBAQAogfQogCiBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JaW50IGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMudmFsdWVzLmxlbmd0aDsKIAlpbnQgaW5kZXggPSAob2JqZWN0Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKIAlPYmplY3QgY3VycmVudDsKLQl3aGlsZSAoKGN1cnJlbnQgPSB2YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CisJd2hpbGUgKChjdXJyZW50ID0gdGhpcy52YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChjdXJyZW50LmVxdWFscyhvYmplY3QpKSByZXR1cm4gdHJ1ZTsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CiAJfQpAQCAtMTAxLDE1ICsxMDEsMTUgQEAKIH0KIAogcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IG9iamVjdCkgewotCWludCBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLnZhbHVlcy5sZW5ndGg7CiAJaW50IGluZGV4ID0gKG9iamVjdC5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CiAJT2JqZWN0IGN1cnJlbnQ7Ci0Jd2hpbGUgKChjdXJyZW50ID0gdmFsdWVzW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudCA9IHRoaXMudmFsdWVzW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoY3VycmVudC5lcXVhbHMob2JqZWN0KSkgewotCQkJZWxlbWVudFNpemUtLTsKLQkJCU9iamVjdCBvbGRWYWx1ZSA9IHZhbHVlc1tpbmRleF07Ci0JCQl2YWx1ZXNbaW5kZXhdID0gbnVsbDsKLQkJCWlmICh2YWx1ZXNbaW5kZXggKyAxID09IGxlbmd0aCA/IDAgOiBpbmRleCArIDFdICE9IG51bGwpCisJCQl0aGlzLmVsZW1lbnRTaXplLS07CisJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlc1tpbmRleF07CisJCQl0aGlzLnZhbHVlc1tpbmRleF0gPSBudWxsOworCQkJaWYgKHRoaXMudmFsdWVzW2luZGV4ICsgMSA9PSBsZW5ndGggPyAwIDogaW5kZXggKyAxXSAhPSBudWxsKQogCQkJCXJlaGFzaCgpOyAvLyBvbmx5IG5lZWRlZCBpZiBhIHBvc3NpYmxlIGNvbGxpc2lvbiBleGlzdGVkCiAJCQlyZXR1cm4gb2xkVmFsdWU7CiAJCX0KQEAgLTExOSwxMCArMTE5LDEwIEBACiB9CiAKIHByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JU2ltcGxlU2V0IG5ld1NldCA9IG5ldyBTaW1wbGVTZXQoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlTaW1wbGVTZXQgbmV3U2V0ID0gbmV3IFNpbXBsZVNldCh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJT2JqZWN0IGN1cnJlbnQ7Ci0JZm9yIChpbnQgaSA9IHZhbHVlcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKChjdXJyZW50ID0gdmFsdWVzW2ldKSAhPSBudWxsKQorCWZvciAoaW50IGkgPSB0aGlzLnZhbHVlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50ID0gdGhpcy52YWx1ZXNbaV0pICE9IG51bGwpCiAJCQluZXdTZXQuYWRkKGN1cnJlbnQpOwogCiAJdGhpcy52YWx1ZXMgPSBuZXdTZXQudmFsdWVzOwpAQCAtMTMzLDggKzEzMyw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKIAlPYmplY3Qgb2JqZWN0OwotCWZvciAoaW50IGkgPSAwLCBsID0gdmFsdWVzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJaWYgKChvYmplY3QgPSB2YWx1ZXNbaV0pICE9IG51bGwpCisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnZhbHVlcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmICgob2JqZWN0ID0gdGhpcy52YWx1ZXNbaV0pICE9IG51bGwpCiAJCQlzICs9IG9iamVjdC50b1N0cmluZygpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBzOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlU2V0T2ZDaGFyQXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZVNldE9mQ2hhckFycmF5LmphdmEKaW5kZXggNTU5NDFkYy4uYzM5ZDZlMSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlU2V0T2ZDaGFyQXJyYXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVTZXRPZkNoYXJBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTkyLDEwICs5MiwxMCBAQAogfQogCiBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhjaGFyW10gb2JqZWN0KSB7Ci0JaW50IGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMudmFsdWVzLmxlbmd0aDsKIAlpbnQgaW5kZXggPSAoQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShvYmplY3QpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CiAJY2hhcltdIGN1cnJlbnQ7Ci0Jd2hpbGUgKChjdXJyZW50ID0gdmFsdWVzW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudCA9IHRoaXMudmFsdWVzW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudCwgb2JqZWN0KSkgcmV0dXJuIHRydWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KQEAgLTEwMywxNSArMTAzLDE1IEBACiB9CiAKIHB1YmxpYyBjaGFyW10gcmVtb3ZlKGNoYXJbXSBvYmplY3QpIHsKLQlpbnQgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoOwogCWludCBpbmRleCA9IChDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKG9iamVjdCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKIAljaGFyW10gY3VycmVudDsKLQl3aGlsZSAoKGN1cnJlbnQgPSB2YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CisJd2hpbGUgKChjdXJyZW50ID0gdGhpcy52YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50LCBvYmplY3QpKSB7Ci0JCQllbGVtZW50U2l6ZS0tOwotCQkJY2hhcltdIG9sZFZhbHVlID0gdmFsdWVzW2luZGV4XTsKLQkJCXZhbHVlc1tpbmRleF0gPSBudWxsOwotCQkJaWYgKHZhbHVlc1tpbmRleCArIDEgPT0gbGVuZ3RoID8gMCA6IGluZGV4ICsgMV0gIT0gbnVsbCkKKwkJCXRoaXMuZWxlbWVudFNpemUtLTsKKwkJCWNoYXJbXSBvbGRWYWx1ZSA9IHRoaXMudmFsdWVzW2luZGV4XTsKKwkJCXRoaXMudmFsdWVzW2luZGV4XSA9IG51bGw7CisJCQlpZiAodGhpcy52YWx1ZXNbaW5kZXggKyAxID09IGxlbmd0aCA/IDAgOiBpbmRleCArIDFdICE9IG51bGwpCiAJCQkJcmVoYXNoKCk7IC8vIG9ubHkgbmVlZGVkIGlmIGEgcG9zc2libGUgY29sbGlzaW9uIGV4aXN0ZWQKIAkJCXJldHVybiBvbGRWYWx1ZTsKIAkJfQpAQCAtMTIxLDEwICsxMjEsMTAgQEAKIH0KIAogcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQlTaW1wbGVTZXRPZkNoYXJBcnJheSBuZXdTZXQgPSBuZXcgU2ltcGxlU2V0T2ZDaGFyQXJyYXkoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlTaW1wbGVTZXRPZkNoYXJBcnJheSBuZXdTZXQgPSBuZXcgU2ltcGxlU2V0T2ZDaGFyQXJyYXkodGhpcy5lbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cwogCWNoYXJbXSBjdXJyZW50OwotCWZvciAoaW50IGkgPSB2YWx1ZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICgoY3VycmVudCA9IHZhbHVlc1tpXSkgIT0gbnVsbCkKKwlmb3IgKGludCBpID0gdGhpcy52YWx1ZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICgoY3VycmVudCA9IHRoaXMudmFsdWVzW2ldKSAhPSBudWxsKQogCQkJbmV3U2V0LmFkZChjdXJyZW50KTsKIAogCXRoaXMudmFsdWVzID0gbmV3U2V0LnZhbHVlczsKQEAgLTEzNSw4ICsxMzUsOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIG9iamVjdDsKLQlmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCWlmICgob2JqZWN0ID0gdmFsdWVzW2ldKSAhPSBudWxsKQorCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy52YWx1ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlpZiAoKG9iamVjdCA9IHRoaXMudmFsdWVzW2ldKSAhPSBudWxsKQogCQkJcyArPSBuZXcgU3RyaW5nKG9iamVjdCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TdWZmaXhDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1N1ZmZpeENvbnN0YW50cy5qYXZhCmluZGV4IDZhZjE5ODUuLjYxYjkxOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1N1ZmZpeENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1N1ZmZpeENvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDI5ICsxNSwxNCBAQAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9DTEFTUyA9ICJDTEFTUyI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFRFTlNJT05famF2YSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9KQVZBID0gIkpBVkEiOyAvLyROT04tTkxTLTEkCi0JCisKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUZGSVhfU1RSSU5HX2NsYXNzID0gIi4iICsgRVhURU5TSU9OX2NsYXNzOyAvLyROT04tTkxTLTEkCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR19DTEFTUyA9ICIuIiArIEVYVEVOU0lPTl9DTEFTUzsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVRkZJWF9TVFJJTkdfamF2YSA9ICIuIiArIEVYVEVOU0lPTl9qYXZhOyAvLyROT04tTkxTLTEkCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR19KQVZBID0gIi4iICsgRVhURU5TSU9OX0pBVkE7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9jbGFzcyA9IFNVRkZJWF9TVFJJTkdfY2xhc3MudG9DaGFyQXJyYXkoKTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfQ0xBU1MgPSBTVUZGSVhfU1RSSU5HX0NMQVNTLnRvQ2hhckFycmF5KCk7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX2phdmEgPSBTVUZGSVhfU1RSSU5HX2phdmEudG9DaGFyQXJyYXkoKTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfSkFWQSA9IFNVRkZJWF9TVFJJTkdfSkFWQS50b0NoYXJBcnJheSgpOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9qYXIgPSAiamFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9KQVIgPSAiSkFSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl96aXAgPSAiemlwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9aSVAgPSAiWklQIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR19qYXIgPSAiLiIgKyBFWFRFTlNJT05famFyOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR19KQVIgPSAiLiIgKyBFWFRFTlNJT05fSkFSOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR196aXAgPSAiLiIgKyBFWFRFTlNJT05femlwOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VGRklYX1NUUklOR19aSVAgPSAiLiIgKyBFWFRFTlNJT05fWklQOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfamFyID0gU1VGRklYX1NUUklOR19qYXIudG9DaGFyQXJyYXkoKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfSkFSID0gU1VGRklYX1NUUklOR19KQVIudG9DaGFyQXJyYXkoKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfemlwID0gU1VGRklYX1NUUklOR196aXAudG9DaGFyQXJyYXkoKTsgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX1pJUCA9IFNVRkZJWF9TVFJJTkdfWklQLnRvQ2hhckFycmF5KCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEKaW5kZXggMmFlNjQ5MC4uNzYyNTc2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1V0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDMzICs3LDM0NiBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBkYW9sYWZAZ21haWwuY29tIC0gQ29udHJpYnV0aW9uIGZvciBidWcgMzI5MjIyNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guTWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhcmFtZXRlcml6ZWRUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuV2lsZGNhcmRCaW5kaW5nOwogCiBwdWJsaWMgY2xhc3MgVXRpbCBpbXBsZW1lbnRzIFN1ZmZpeENvbnN0YW50cyB7CiAKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgYm9vbGVhbiBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nWic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0JPT0xFQU4gCQk9ICdaJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBieXRlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidCJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQllURSAJCT0gJ0InOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGNoYXIgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0MnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DSEFSIAkJPSAnQyc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgZG91YmxlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidEJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRE9VQkxFIAkJPSAnRCc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgZmxvYXQgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0YnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19GTE9BVCAJCT0gJ0YnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGludCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nSSc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0lOVCAJCQk9ICdJJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzZW1pY29sb24gaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JzsnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19TRU1JQ09MT04gCQkJPSAnOyc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgY29sb24gaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JzonPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ09MT04gCQkJPSAnOic7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgbG9uZyBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nSic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0xPTkcJCQk9ICdKJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBzaG9ydCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nUyc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NIT1JUCQk9ICdTJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHJlc3VsdCB0eXBlIHZvaWQgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J1YnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19WT0lECQkJPSAnVic7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSByZXNvbHZlZCB0eXBlIHZhcmlhYmxlIGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidUJzwvY29kZT4uCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1RZUEVfVkFSSUFCTEUJPSAnVCc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyBhbiB1bmJvdW5kIHdpbGRjYXJkIHR5cGUgYXJndW1lbnQKKwkgKiBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nKic8L2NvZGU+LgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19TVEFSCT0gJyonOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gZXhjZXB0aW9uIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPideJzwvY29kZT4uCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0VYQ0VQVElPTl9TVEFSVAk9ICdeJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIGEgYm91bmQgd2lsZGNhcmQgdHlwZSBhcmd1bWVudAorCSAqIGluIGEgc2lnbmF0dXJlIHdpdGggZXh0ZW5kcyBjbGF1c2UuCisJICogVmFsdWUgaXMgPGNvZGU+JysnPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRVhURU5EUwk9ICcrJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIGEgYm91bmQgd2lsZGNhcmQgdHlwZSBhcmd1bWVudAorCSAqIGluIGEgc2lnbmF0dXJlIHdpdGggc3VwZXIgY2xhdXNlLgorCSAqIFZhbHVlIGlzIDxjb2RlPictJzwvY29kZT4uCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NVUEVSCT0gJy0nOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGRvdCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nLic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RPVAkJCT0gJy4nOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGRvbGxhciBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nJCc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RPTExBUgkJCT0gJyQnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gYXJyYXkgdHlwZSBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nWyc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0FSUkFZCQk9ICdbJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIHJlc29sdmVkLCBuYW1lZCB0eXBlIGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidMJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUkVTT0xWRUQJCT0gJ0wnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGFuIHVucmVzb2x2ZWQsIG5hbWVkIHR5cGUgaW4gYQorCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+J1EnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19VTlJFU09MVkVECT0gJ1EnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGVuZCBvZiBhIG5hbWVkIHR5cGUgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JzsnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19OQU1FX0VORAkJPSAnOyc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSBwYXJhbWV0ZXIgdHlwZSBsaXN0IGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicoJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSQU1fU1RBUlQJPSAnKCc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEgcGFyYW1ldGVyIHR5cGUgbGlzdCBpbiBhCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nKSc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1BBUkFNX0VORAk9ICcpJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIGZvcm1hbCB0eXBlIHBhcmFtZXRlcgorCSAqIChvciB0eXBlIGFyZ3VtZW50KSBsaXN0IGluIGEgc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nJmx0Oyc8L2NvZGU+LgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19HRU5FUklDX1NUQVJUCT0gJzwnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGVuZCBvZiBhIGdlbmVyaWMgdHlwZSBsaXN0IGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicmZ3Q7JzwvY29kZT4uCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0dFTkVSSUNfRU5ECT0gJz4nOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYSBjYXB0dXJlIG9mIGEgd2lsZGNhcmQgdHlwZSBpbiBhCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nISc8L2NvZGU+LgorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DQVBUVVJFCT0gJyEnOworCiAJcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSB7CiAJCVN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRUFESU5HX1NJWkUgPSA4MTkyOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dSSVRJTkdfU0laRSA9IDEwMjQ7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwkvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSKTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX0lOVF9BUlJBWT0gbmV3IGludFswXTsKLQkKKworCS8qKgorCSAqIEJ1aWxkIGFsbCB0aGUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhY2thZ2VzIG5hbWVzCisJICogaW50byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLgorCSAqCisJICogb3V0cHV0UGF0aCBpcyBmb3JtZWQgbGlrZToKKwkgKgkgICBjOlx0ZW1wXCB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBmaWxlIHNlcGFyYXRvcgorCSAqIHJlbGF0aXZlRmlsZU5hbWUgaXMgZm9ybWVkIGxpa2U6CisJICogICAgIGphdmFcbGFuZ1xTdHJpbmcuY2xhc3MgKgorCSAqCisJICogQHBhcmFtIG91dHB1dFBhdGggamF2YS5sYW5nLlN0cmluZworCSAqIEBwYXJhbSByZWxhdGl2ZUZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEFsbERpcmVjdG9yaWVzSW50byhTdHJpbmcgb3V0cHV0UGF0aCwgU3RyaW5nIHJlbGF0aXZlRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWNoYXIgZmlsZVNlcGFyYXRvckNoYXIgPSBGaWxlLnNlcGFyYXRvckNoYXI7CisJCVN0cmluZyBmaWxlU2VwYXJhdG9yID0gRmlsZS5zZXBhcmF0b3I7CisJCUZpbGUgZjsKKwkJb3V0cHV0UGF0aCA9IG91dHB1dFBhdGgucmVwbGFjZSgnLycsIGZpbGVTZXBhcmF0b3JDaGFyKTsKKwkJCS8vIHRoZXNlIGNvdWxkIGJlIG9wdGltaXplZCBvdXQgaWYgd2Ugbm9ybWFsaXplZCBwYXRocyBvbmNlIGFuZCBmb3IKKwkJCS8vIGFsbAorCQlyZWxhdGl2ZUZpbGVOYW1lID0gcmVsYXRpdmVGaWxlTmFtZS5yZXBsYWNlKCcvJywgZmlsZVNlcGFyYXRvckNoYXIpOworCQlTdHJpbmcgb3V0cHV0RGlyUGF0aCwgZmlsZU5hbWU7CisJCWludCBzZXBhcmF0b3JJbmRleCA9IHJlbGF0aXZlRmlsZU5hbWUubGFzdEluZGV4T2YoZmlsZVNlcGFyYXRvckNoYXIpOworCQlpZiAoc2VwYXJhdG9ySW5kZXggPT0gLTEpIHsKKwkJCWlmIChvdXRwdXRQYXRoLmVuZHNXaXRoKGZpbGVTZXBhcmF0b3IpKSB7CisJCQkJb3V0cHV0RGlyUGF0aCA9IG91dHB1dFBhdGguc3Vic3RyaW5nKDAsIG91dHB1dFBhdGgubGVuZ3RoKCkgLSAxKTsKKwkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyByZWxhdGl2ZUZpbGVOYW1lOworCQkJfSBlbHNlIHsKKwkJCQlvdXRwdXREaXJQYXRoID0gb3V0cHV0UGF0aDsKKwkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyBmaWxlU2VwYXJhdG9yICsgcmVsYXRpdmVGaWxlTmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvdXRwdXRQYXRoLmVuZHNXaXRoKGZpbGVTZXBhcmF0b3IpKSB7CisJCQkJb3V0cHV0RGlyUGF0aCA9IG91dHB1dFBhdGggKworCQkJCQlyZWxhdGl2ZUZpbGVOYW1lLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7CisJCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgcmVsYXRpdmVGaWxlTmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJb3V0cHV0RGlyUGF0aCA9IG91dHB1dFBhdGggKyBmaWxlU2VwYXJhdG9yICsKKwkJCQkJcmVsYXRpdmVGaWxlTmFtZS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpOworCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKyByZWxhdGl2ZUZpbGVOYW1lOworCQkJfQorCQl9CisJCWYgPSBuZXcgRmlsZShvdXRwdXREaXJQYXRoKTsKKwkJZi5ta2RpcnMoKTsKKwkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworCQkJcmV0dXJuIGZpbGVOYW1lOworCQl9IGVsc2UgeworCQkJLy8gdGhlIGRpcmVjdG9yeSBjcmVhdGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIC0gcmV0cnkgdXNpbmcKKwkJCS8vIGEgc2xvd2VyIGFsZ29yaXRobSBzbyBhcyB0byByZWZpbmUgdGhlIGRpYWdub3N0aWMKKwkJCWlmIChvdXRwdXRQYXRoLmVuZHNXaXRoKGZpbGVTZXBhcmF0b3IpKSB7CisJCQkJb3V0cHV0UGF0aCA9IG91dHB1dFBhdGguc3Vic3RyaW5nKDAsIG91dHB1dFBhdGgubGVuZ3RoKCkgLSAxKTsKKwkJCX0KKwkJCWYgPSBuZXcgRmlsZShvdXRwdXRQYXRoKTsKKwkJCWJvb2xlYW4gY2hlY2tGaWxlVHlwZSA9IGZhbHNlOworCQkJaWYgKGYuZXhpc3RzKCkpIHsKKwkJCQkgIGNoZWNrRmlsZVR5cGUgPSB0cnVlOyAvLyBwcmUtZXhpc3RlZAorCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGF0IGRpcmVjdG9yeQorCQkJCWlmICghZi5ta2RpcnMoKSkgeworCQkJCQkgIGlmIChmLmV4aXN0cygpKSB7CisJCQkJCQkJLy8gc29tZW9uZSBlbHNlIGNyZWF0ZWQgZiAtLSBuZWVkIHRvIGNoZWNrIGl0cyB0eXBlCisJCQkJCQkJY2hlY2tGaWxlVHlwZSA9IHRydWU7CisJCQkJCSAgfSBlbHNlIHsKKwkJCQkJCQkvLyBubyBvbmUgY291bGQgY3JlYXRlIGYgLS0gY29tcGxhaW4KKwkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKAorCQkJCQkJCU1lc3NhZ2VzLm91dHB1dF9ub3RWYWxpZEFsbCwgZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCQkJCQkgIH0KKwkJCQl9CisJCQl9CisJCQlpZiAoY2hlY2tGaWxlVHlwZSkgeworCQkJCSAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoCisJCQkJCQlNZXNzYWdlcy5vdXRwdXRfaXNGaWxlLCBmLmdldEFic29sdXRlUGF0aCgpKSk7CisJCQkJICB9CisJCQl9CisJCQlTdHJpbmdCdWZmZXIgb3V0RGlyID0gbmV3IFN0cmluZ0J1ZmZlcihvdXRwdXRQYXRoKTsKKwkJCW91dERpci5hcHBlbmQoZmlsZVNlcGFyYXRvcik7CisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KKwkJCQluZXcgU3RyaW5nVG9rZW5pemVyKHJlbGF0aXZlRmlsZU5hbWUsIGZpbGVTZXBhcmF0b3IpOworCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlmID0gbmV3IEZpbGUob3V0RGlyLmFwcGVuZCh0b2tlbikuYXBwZW5kKGZpbGVTZXBhcmF0b3IpLnRvU3RyaW5nKCkpOworCQkJCSAgY2hlY2tGaWxlVHlwZSA9IGZhbHNlOyAvLyByZXNldAorCQkJCWlmIChmLmV4aXN0cygpKSB7CisJCQkJCSAgY2hlY2tGaWxlVHlwZSA9IHRydWU7IC8vIHRoaXMgaXMgc3Vib3B0aW1hbCwgYnV0IGl0IGNhdGNoZXMgY29ybmVyIGNhc2VzCisJCQkJCQkJCQkJCS8vIGluIHdoaWNoIGEgcmVndWxhciBmaWxlIHByZS1leGlzdHMKKwkJCQl9IGVsc2UgeworCQkJCS8vIHdlIGhhdmUgdG8gY3JlYXRlIHRoYXQgZGlyZWN0b3J5CisJCQkJCWlmICghZi5ta2RpcigpKSB7CisJCQkJCQkgIGlmIChmLmV4aXN0cygpKSB7CisJCQkJCQkJCS8vIHNvbWVvbmUgZWxzZSBjcmVhdGVkIGYgLS0gbmVlZCB0byBjaGVjayBpdHMgdHlwZQorCQkJCQkJCQljaGVja0ZpbGVUeXBlID0gdHJ1ZTsKKwkJCQkJCSAgfSBlbHNlIHsKKwkJCQkJCQkJLy8gbm8gb25lIGNvdWxkIGNyZWF0ZSBmIC0tIGNvbXBsYWluCisJCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmJpbmQoCisJCQkJCQkJCU1lc3NhZ2VzLm91dHB1dF9ub3RWYWxpZCwKKwkJCQkJCQkJCW91dERpci5zdWJzdHJpbmcob3V0cHV0UGF0aC5sZW5ndGgoKSArIDEsCisJCQkJCQkJCQkJb3V0RGlyLmxlbmd0aCgpIC0gMSksCisJCQkJCQkJCQlvdXRwdXRQYXRoKSk7CisJCQkJCQkgIH0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoY2hlY2tGaWxlVHlwZSkgeworCQkJCQkgIGlmICghZi5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuYmluZCgKKwkJCQkJCQlNZXNzYWdlcy5vdXRwdXRfaXNGaWxlLCBmLmdldEFic29sdXRlUGF0aCgpKSk7CisJCQkJCSAgfQorCQkJCX0KKwkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJCS8vIHRva2VuIGNvbnRhaW5zIHRoZSBsYXN0IG9uZQorCQkJcmV0dXJuIG91dERpci5hcHBlbmQodG9rZW4pLnRvU3RyaW5nKCk7CisJCX0KKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBnaXZlbiBieXRlcyBhcyBhIGNoYXIgYXJyYXkgdXNpbmcgYSBnaXZlbiBlbmNvZGluZyAobnVsbCBtZWFucyBwbGF0Zm9ybSBkZWZhdWx0KS4KIAkgKi8KQEAgLTQyLDYgKzM1NSwzMiBAQAogCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW1Bc0NoYXJBcnJheShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCBieXRlcy5sZW5ndGgsIGVuY29kaW5nKTsKIAogCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG91dGVyIG1vc3QgZW5jbG9zaW5nIHR5cGUncyB2aXNpYmlsaXR5IGZvciB0aGUgZ2l2ZW4gVHlwZURlY2xhcmF0aW9uCisJICogYW5kIHZpc2liaWxpdHkgYmFzZWQgb24gY29tcGlsZXIgb3B0aW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjb21wdXRlT3V0ZXJNb3N0VmlzaWJpbGl0eShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBpbnQgdmlzaWJpbGl0eSkgeworCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCXN3aXRjaCAodHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0spIHsKKwkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlOgorCQkJCQl2aXNpYmlsaXR5ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ6CisJCQkJCWlmICh2aXNpYmlsaXR5ICE9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSB7CisJCQkJCQl2aXNpYmlsaXR5ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHJvdGVjdGVkOgorCQkJCQlpZiAodmlzaWJpbGl0eSA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSB7CisJCQkJCQl2aXNpYmlsaXR5ID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5lbmNsb3NpbmdUeXBlOworCQl9CisJCXJldHVybiB2aXNpYmlsaXR5OworCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZSBhcyBhIGJ5dGUgYXJyYXkuCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJlZCByZWFkaW5nIHRoZSBmaWxlLgpAQCAtNDksNyArMzg4LDcgQEAKIAlwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRGaWxlQnl0ZUNvbnRlbnQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwogCQl0cnkgewotCQkJc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwogCQkJcmV0dXJuIGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAoaW50KSBmaWxlLmxlbmd0aCgpKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewpAQCAtODEsNiArNDIwLDM1IEBACiAJCQl9CiAJCX0KIAl9CisJcHJpdmF0ZSBzdGF0aWMgRmlsZU91dHB1dFN0cmVhbSBnZXRGaWxlT3V0cHV0U3RyZWFtKGJvb2xlYW4gZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZSwgU3RyaW5nIG91dHB1dFBhdGgsIFN0cmluZyByZWxhdGl2ZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZSkgeworCQkJcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGJ1aWxkQWxsRGlyZWN0b3JpZXNJbnRvKG91dHB1dFBhdGgsIHJlbGF0aXZlRmlsZU5hbWUpKSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQkJY2hhciBmaWxlU2VwYXJhdG9yQ2hhciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKwkJCVN0cmluZyBmaWxlU2VwYXJhdG9yID0gRmlsZS5zZXBhcmF0b3I7CisJCQkvLyBGaXJzdCB3ZSBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0UGF0aCBleGlzdHMKKwkJCW91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnJlcGxhY2UoJy8nLCBmaWxlU2VwYXJhdG9yQ2hhcik7CisJCQkvLyBUbyBiZSBhYmxlIHRvIHBhc3MgdGhlIG1rZGlycygpIG1ldGhvZCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZXh0cmEgZmlsZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgb3V0RGlyIG5hbWUKKwkJCWludCBpbmRleE9mUGFja2FnZVNlcGFyYXRvciA9IHJlbGF0aXZlRmlsZU5hbWUubGFzdEluZGV4T2YoZmlsZVNlcGFyYXRvckNoYXIpOworCQkJaWYgKGluZGV4T2ZQYWNrYWdlU2VwYXJhdG9yID09IC0xKSB7CisJCQkJaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsKKwkJCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgcmVsYXRpdmVGaWxlTmFtZTsKKwkJCQl9IGVsc2UgeworCQkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyBmaWxlU2VwYXJhdG9yICsgcmVsYXRpdmVGaWxlTmFtZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWludCBsZW5ndGggPSByZWxhdGl2ZUZpbGVOYW1lLmxlbmd0aCgpOworCQkJCWlmIChvdXRwdXRQYXRoLmVuZHNXaXRoKGZpbGVTZXBhcmF0b3IpKSB7CisJCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIHJlbGF0aXZlRmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4T2ZQYWNrYWdlU2VwYXJhdG9yICsgMSwgbGVuZ3RoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyBmaWxlU2VwYXJhdG9yICsgcmVsYXRpdmVGaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXhPZlBhY2thZ2VTZXBhcmF0b3IgKyAxLCBsZW5ndGgpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShmaWxlTmFtZSkpOworCQl9CisJfQorCiAJLyoKIAkgKiBOSU8gc3VwcG9ydCB0byBnZXQgaW5wdXQgc3RyZWFtIGFzIGJ5dGUgYXJyYXkuCiAJICogTm90IHVzZWQgYXMgd2l0aCBKREsgMS40LjIgdGhpcyBzdXBwb3J0IGlzIHNsb3dlciB0aGFuIHN0YW5kYXJkIElPIG9uZS4uLgpAQCAtMTAxLDEzICs0NjksMTMgQEAKIAkqLwogCS8qKgogCSAqIFJldHVybnMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSdzIGNvbnRlbnRzIGFzIGEgYnl0ZSBhcnJheS4KLQkgKiBJZiBhIGxlbmd0aCBpcyBzcGVjaWZpZWQgKGllLiBpZiBsZW5ndGggIT0gLTEpLCBvbmx5IGxlbmd0aCBieXRlcworCSAqIElmIGEgbGVuZ3RoIGlzIHNwZWNpZmllZCAoaS5lLiBpZiBsZW5ndGggIT0gLTEpLCBvbmx5IGxlbmd0aCBieXRlcwogCSAqIGFyZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGFsbCBieXRlcyBpbiB0aGUgc3RyZWFtIGFyZSByZXR1cm5lZC4KIAkgKiBOb3RlIHRoaXMgZG9lc24ndCBjbG9zZSB0aGUgc3RyZWFtLgogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VyZWQgcmVhZGluZyB0aGUgc3RyZWFtLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoSW5wdXRTdHJlYW0gc3RyZWFtLCBpbnQgbGVuZ3RoKQotCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGNvbnRlbnRzOwogCQlpZiAobGVuZ3RoID09IC0xKSB7CiAJCQljb250ZW50cyA9IG5ldyBieXRlWzBdOwpAQCAtMTE1LDcgKzQ4Myw3IEBACiAJCQlpbnQgYW1vdW50UmVhZCA9IC0xOwogCQkJZG8gewogCQkJCWludCBhbW91bnRSZXF1ZXN0ZWQgPSBNYXRoLm1heChzdHJlYW0uYXZhaWxhYmxlKCksIERFRkFVTFRfUkVBRElOR19TSVpFKTsgIC8vIHJlYWQgYXQgbGVhc3QgOEsKLQkJCQkKKwogCQkJCS8vIHJlc2l6ZSBjb250ZW50cyBpZiBuZWVkZWQKIAkJCQlpZiAoY29udGVudHNMZW5ndGggKyBhbW91bnRSZXF1ZXN0ZWQgPiBjb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSgKQEAgLTEzMyw3ICs1MDEsNyBAQAogCQkJCQkvLyByZW1lbWJlciBsZW5ndGggb2YgY29udGVudHMKIAkJCQkJY29udGVudHNMZW5ndGggKz0gYW1vdW50UmVhZDsKIAkJCQl9Ci0JCQl9IHdoaWxlIChhbW91bnRSZWFkICE9IC0xKTsgCisJCQl9IHdoaWxlIChhbW91bnRSZWFkICE9IC0xKTsKIAogCQkJLy8gcmVzaXplIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeQogCQkJaWYgKGNvbnRlbnRzTGVuZ3RoIDwgY29udGVudHMubGVuZ3RoKSB7CkBAIC0xNTgsNiArNTI2LDcgQEAKIAogCQlyZXR1cm4gY29udGVudHM7CiAJfQorCiAJLyoKIAkgKiBOSU8gc3VwcG9ydCB0byBnZXQgaW5wdXQgc3RyZWFtIGFzIGNoYXIgYXJyYXkuCiAJICogTm90IHVzZWQgYXMgd2l0aCBKREsgMS40LjIgdGhpcyBzdXBwb3J0IGlzIHNsb3dlciB0aGFuIHN0YW5kYXJkIElPIG9uZS4uLgpAQCAtMTY1LDcgKzUzNCw3IEBACiAJICogaW4gdGhpcyBhcmVhLi4uCiAJcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0SW5wdXRTdHJlYW1Bc0NoYXJBcnJheShGaWxlSW5wdXRTdHJlYW0gc3RyZWFtLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZW5jb2RpbmcpCiAJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCisKIAkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IHN0cmVhbS5nZXRDaGFubmVsKCk7CiAJCWludCBzaXplID0gKGludCljaGFubmVsLnNpemUoKTsKIAkJaWYgKGxlbmd0aCA+PSAwICYmIGxlbmd0aCA8IHNpemUpIHNpemUgPSBsZW5ndGg7CkBAIC0xODMsMjAgKzU1MiwyMCBAQAogCSovCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtJ3MgY29udGVudHMgYXMgYSBjaGFyYWN0ZXIgYXJyYXkuCi0JICogSWYgYSBsZW5ndGggaXMgc3BlY2lmaWVkIChpZS4gaWYgbGVuZ3RoICE9IC0xKSwgdGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbS4KKwkgKiBJZiBhIGxlbmd0aCBpcyBzcGVjaWZpZWQgKGkuZS4gaWYgbGVuZ3RoICE9IC0xKSwgdGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbS4KIAkgKiBOb3RlIHRoaXMgZG9lc24ndCBjbG9zZSB0aGUgc3RyZWFtLgogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VyZWQgcmVhZGluZyB0aGUgc3RyZWFtLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoSW5wdXRTdHJlYW0gc3RyZWFtLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZW5jb2RpbmcpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7CisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwogCQl0cnkgewogCQkJcmVhZGVyID0gZW5jb2RpbmcgPT0gbnVsbAotCQkJCQkJPyBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKQotCQkJCQkJOiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCBlbmNvZGluZyk7CisJCQkJCQk/IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSkKKwkJCQkJCTogbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIGVuY29kaW5nKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAotCQkJcmVhZGVyID0gIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pOworCQkJcmVhZGVyID0gIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7CiAJCX0KIAkJY2hhcltdIGNvbnRlbnRzOwogCQlpbnQgdG90YWxSZWFkID0gMDsKQEAgLTIxNCwxNSArNTgzLDE1IEBACiAJCQkJYW1vdW50UmVxdWVzdGVkID0gbGVuZ3RoIC0gdG90YWxSZWFkOwogCQkJfSBlbHNlIHsKIAkJCQkvLyByZWFkaW5nIGJleW9uZCBrbm93biBsZW5ndGgKLQkJCQlpbnQgY3VycmVudCA9IHJlYWRlci5yZWFkKCk7IAorCQkJCWludCBjdXJyZW50ID0gcmVhZGVyLnJlYWQoKTsKIAkJCQlpZiAoY3VycmVudCA8IDApIGJyZWFrOwotCQkJCQorCiAJCQkJYW1vdW50UmVxdWVzdGVkID0gTWF0aC5tYXgoc3RyZWFtLmF2YWlsYWJsZSgpLCBERUZBVUxUX1JFQURJTkdfU0laRSk7ICAvLyByZWFkIGF0IGxlYXN0IDhLCi0JCQkJCisKIAkJCQkvLyByZXNpemUgY29udGVudHMgaWYgbmVlZGVkCiAJCQkJaWYgKHRvdGFsUmVhZCArIDEgKyBhbW91bnRSZXF1ZXN0ZWQgPiBjb250ZW50cy5sZW5ndGgpCiAJCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIAkwLCAJY29udGVudHMgPSBuZXcgY2hhclt0b3RhbFJlYWQgKyAxICsgYW1vdW50UmVxdWVzdGVkXSwgMCwgdG90YWxSZWFkKTsKLQkJCQkKKwogCQkJCS8vIGFkZCBjdXJyZW50IGNoYXJhY3RlcgogCQkJCWNvbnRlbnRzW3RvdGFsUmVhZCsrXSA9IChjaGFyKSBjdXJyZW50OyAvLyBjb21pbmcgZnJvbSB0b3RhbFJlYWQ9PWxlbmd0aAogCQkJfQpAQCAtMjQwLDEzICs2MDksNDkgQEAKIAkJCQlzdGFydCA9IDE7CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gcmVzaXplIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeQogCQlpZiAodG90YWxSZWFkIDwgY29udGVudHMubGVuZ3RoKQogCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgc3RhcnQsIGNvbnRlbnRzID0gbmV3IGNoYXJbdG90YWxSZWFkXSwgCTAsIAl0b3RhbFJlYWQpOwogCiAJCXJldHVybiBjb250ZW50czsKIAl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgb25lIGxpbmUgc3VtbWFyeSBmb3IgYW4gZXhjZXB0aW9uIChleHRyYWN0ZWQgZnJvbSBpdHMgc3RhY2t0cmFjZTogbmFtZSArIGZpcnN0IGZyYW1lKQorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiBAcmV0dXJuIG9uZSBsaW5lIHN1bW1hcnkgZm9yIGFuIGV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4Y2VwdGlvblN1bW1hcnkoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHN0cmluZ1dyaXRlci5nZXRCdWZmZXIoKTsJCQorCQlTdHJpbmdCdWZmZXIgZXhjZXB0aW9uQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7CisJCWV4Y2VwdGlvbkJ1ZmZlci5hcHBlbmQoZXhjZXB0aW9uLnRvU3RyaW5nKCkpOworCQkvLyBvbmx5IGtlZXAgbGVhZGluZyBmcmFtZSBwb3J0aW9uIG9mIHRoZSB0cmFjZSAoaS5lLiBsaW5lIG5vLiAyIGZyb20gdGhlIHN0YWNrdHJhY2UpCisJCWxvb2t1cExpbmUyOiBmb3IgKGludCBpID0gMCwgbGluZVNlcCA9IDAsIG1heCA9IGJ1ZmZlci5sZW5ndGgoKSwgbGluZTJTdGFydCA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJc3dpdGNoIChidWZmZXIuY2hhckF0KGkpKSB7CisJCQkJY2FzZSAnXG4nOgorCQkJCWNhc2UgJ1xyJyA6CisJCQkJCWlmIChsaW5lMlN0YXJ0ID4gMCkgeworCQkJCQkJZXhjZXB0aW9uQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChidWZmZXIuc3Vic3RyaW5nKGxpbmUyU3RhcnQsIGkpKTsKKwkJCQkJCWJyZWFrIGxvb2t1cExpbmUyOworCQkJCQl9CQkJCQkJCisJCQkJCWxpbmVTZXArKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnICcgOgorCQkJCWNhc2UgJ1x0JyA6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlpZiAobGluZVNlcCA+IDApIHsKKwkJCQkJCWxpbmUyU3RhcnQgPSBpOworCQkJCQkJbGluZVNlcCA9IDA7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGV4Y2VwdGlvbkJ1ZmZlci50b1N0cmluZygpOworCX0KIAkKIAlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5lTnVtYmVyKGludCBwb3NpdGlvbiwgaW50W10gbGluZUVuZHMsIGludCBnLCBpbnQgZCkgewogCQlpZiAobGluZUVuZHMgPT0gbnVsbCkKQEAgLTI2OSw3ICs2NzQsNiBAQAogCQl9CiAJCXJldHVybiBtKzI7CiAJfQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHppcCBlbnRyeSBhcyBhIGJ5dGUgYXJyYXkuCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJlZCByZWFkaW5nIHRoZSB6aXAgZW50cnkuCkBAIC0yNzksOCArNjgzLDkgQEAKIAogCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwogCQl0cnkgewotCQkJc3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKHplKTsKLQkJCWlmIChzdHJlYW0gPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIHppcCBlbnRyeSBuYW1lIDogIiArIHplLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKHplKTsKKwkJCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgemlwIGVudHJ5IG5hbWUgOiAiICsgemUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwogCQkJcmV0dXJuIGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAoaW50KSB6ZS5nZXRTaXplKCkpOwogCQl9IGZpbmFsbHkgewogCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CkBAIC0yOTIsMzUgKzY5Nyw1MCBAQAogCQkJfQogCQl9CiAJfQotCisJcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoT2JqZWN0W10gYXJyYXkpIHsKKwkJaW50IHByaW1lID0gMzE7CisJCWlmIChhcnJheSA9PSBudWxsKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpbnQgcmVzdWx0ID0gMTsKKwkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykgeworCQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoYXJyYXlbaW5kZXhdID09IG51bGwgPyAwIDogYXJyYXlbaW5kZXhdLmhhc2hDb2RlKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQogCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSB8fCBzdHIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnppcCIpCi0JICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGlzIHBvdGVudGlhbGx5IGEgemlwIGFyY2hpdmUgZmlsZSBuYW1lCisJICogKGl0IGhhcyBhIGZpbGUgZXh0ZW5zaW9uIGFuZCBpdCBpcyBub3QgIi5qYXZhIiBub3IgIi5jbGFzcyIpCiAJICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQXJjaGl2ZUZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWludCBuYW1lTGVuZ3RoID0gbmFtZSA9PSBudWxsID8gMCA6IG5hbWUubGVuZ3RoKCk7Ci0JCWludCBzdWZmaXhMZW5ndGggPSBTVUZGSVhfSkFSLmxlbmd0aDsKLQkJaWYgKG5hbWVMZW5ndGggPCBzdWZmaXhMZW5ndGgpIHJldHVybiBmYWxzZTsKLQotCQkvLyB0cnkgdG8gbWF0Y2ggYXMgSkFSIGZpbGUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhMZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gbmFtZS5jaGFyQXQobmFtZUxlbmd0aCAtIGkgLSAxKTsKLQkJCWludCBzdWZmaXhJbmRleCA9IHN1ZmZpeExlbmd0aCAtIGkgLSAxOwotCQkJaWYgKGMgIT0gU1VGRklYX2phcltzdWZmaXhJbmRleF0gJiYgYyAhPSBTVUZGSVhfSkFSW3N1ZmZpeEluZGV4XSkgewotCi0JCQkJLy8gdHJ5IHRvIG1hdGNoIGFzIFpJUCBmaWxlCi0JCQkJc3VmZml4TGVuZ3RoID0gU1VGRklYX1pJUC5sZW5ndGg7Ci0JCQkJaWYgKG5hbWVMZW5ndGggPCBzdWZmaXhMZW5ndGgpIHJldHVybiBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN1ZmZpeExlbmd0aDsgaisrKSB7Ci0JCQkJCWMgPSBuYW1lLmNoYXJBdChuYW1lTGVuZ3RoIC0gaiAtIDEpOwotCQkJCQlzdWZmaXhJbmRleCA9IHN1ZmZpeExlbmd0aCAtIGogLSAxOwotCQkJCQlpZiAoYyAhPSBTVUZGSVhfemlwW3N1ZmZpeEluZGV4XSAmJiBjICE9IFNVRkZJWF9aSVBbc3VmZml4SW5kZXhdKSByZXR1cm4gZmFsc2U7CisJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzUG90ZW50aWFsWmlwQXJjaGl2ZShTdHJpbmcgbmFtZSkgeworCQlpbnQgbGFzdERvdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGxhc3REb3QgPT0gLTEpCisJCQlyZXR1cm4gZmFsc2U7IC8vIG5vIGZpbGUgZXh0ZW5zaW9uLCBpdCBjYW5ub3QgYmUgYSB6aXAgYXJjaGl2ZSBuYW1lCisJCWlmIChuYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgPiBsYXN0RG90KQorCQkJcmV0dXJuIGZhbHNlOyAvLyBkb3Qgd2FzIGJlZm9yZSB0aGUgbGFzdCBmaWxlIHNlcGFyYXRvciwgaXQgY2Fubm90IGJlIGEgemlwIGFyY2hpdmUgbmFtZQorCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKKwkJaW50IGV4dGVuc2lvbkxlbmd0aCA9IGxlbmd0aCAtIGxhc3REb3QgLSAxOworCQlpZiAoZXh0ZW5zaW9uTGVuZ3RoID09IEVYVEVOU0lPTl9qYXZhLmxlbmd0aCgpKSB7CisJCQlmb3IgKGludCBpID0gZXh0ZW5zaW9uTGVuZ3RoLTE7IGkgPj0wOyBpLS0pIHsKKwkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWUuY2hhckF0KGxlbmd0aCAtIGV4dGVuc2lvbkxlbmd0aCArIGkpKSAhPSBFWFRFTlNJT05famF2YS5jaGFyQXQoaSkpIHsKKwkJCQkJYnJlYWs7IC8vIG5vdCBhICIuamF2YSIgZmlsZSwgY2hlY2sgIi5jbGFzcyIgZmlsZSBjYXNlIGJlbG93CiAJCQkJfQotCQkJCXJldHVybiB0cnVlOworCQkJCWlmIChpID09IDApIHsKKwkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpdCBpcyBhICIuamF2YSIgZmlsZSwgaXQgY2Fubm90IGJlIGEgemlwIGFyY2hpdmUgbmFtZQorCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gdHJ1ZTsJCQotCX0JCisJCWlmIChleHRlbnNpb25MZW5ndGggPT0gRVhURU5TSU9OX2NsYXNzLmxlbmd0aCgpKSB7CisJCQlmb3IgKGludCBpID0gZXh0ZW5zaW9uTGVuZ3RoLTE7IGkgPj0wOyBpLS0pIHsKKwkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWUuY2hhckF0KGxlbmd0aCAtIGV4dGVuc2lvbkxlbmd0aCArIGkpKSAhPSBFWFRFTlNJT05fY2xhc3MuY2hhckF0KGkpKSB7CisJCQkJCXJldHVybiB0cnVlOyAvLyBub3QgYSAiLmNsYXNzIiBmaWxlLCBzbyB0aGlzIGlzIGEgcG90ZW50aWFsIGFyY2hpdmUgbmFtZQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmYWxzZTsgLy8gaXQgaXMgYSAiLmNsYXNzIiBmaWxlLCBpdCBjYW5ub3QgYmUgYSB6aXAgYXJjaGl2ZSBuYW1lCisJCX0KKwkJcmV0dXJuIHRydWU7IC8vIGl0IGlzIG5laXRoZXIgYSAiLmphdmEiIGZpbGUgbm9yIGEgIi5jbGFzcyIgZmlsZSwgc28gdGhpcyBpcyBhIHBvdGVudGlhbCBhcmNoaXZlIG5hbWUKKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWZmIHN0ci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuY2xhc3MiKQogCSAqIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjcmVhdGluZyBleHRyYSBzdHJpbmdzLgpAQCAtMzM0LDggKzc1NCw4IEBACiAJCQljaGFyIGMgPSBuYW1lW29mZnNldCArIGldOwogCQkJaWYgKGMgIT0gU1VGRklYX2NsYXNzW2ldICYmIGMgIT0gU1VGRklYX0NMQVNTW2ldKSByZXR1cm4gZmFsc2U7CiAJCX0KLQkJcmV0dXJuIHRydWU7CQkKLQl9CQorCQlyZXR1cm4gdHJ1ZTsKKwl9CiAJLyoqCiAJICogUmV0dXJucyB0cnVlIGlmZiBzdHIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikKIAkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY3JlYXRpbmcgZXh0cmEgc3RyaW5ncy4KQEAgLTM1MCw4ICs3NzAsOCBAQAogCQkJaW50IHN1ZmZpeEluZGV4ID0gc3VmZml4TGVuZ3RoIC0gaSAtIDE7CiAJCQlpZiAoYyAhPSBTVUZGSVhfY2xhc3Nbc3VmZml4SW5kZXhdICYmIGMgIT0gU1VGRklYX0NMQVNTW3N1ZmZpeEluZGV4XSkgcmV0dXJuIGZhbHNlOwogCQl9Ci0JCXJldHVybiB0cnVlOwkJCi0JfQkKKwkJcmV0dXJuIHRydWU7CisJfQogCS8qIFRPRE8gKHBoaWxpcHBlKSBzaG91bGQgY29uc2lkZXIgcHJvbW90aW5nIGl0IHRvIENoYXJPcGVyYXRpb24KIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIHBhdGggbWF0Y2hlcyBvbmUgb2YgdGhlIGluY2x1c2lvbi9leGNsdXNpb24KIAkgKiBwYXR0ZXJucy4KQEAgLTM3MSw3ICs3OTEsNyBAQAogCQkJCQlpZiAobGFzdFNsYXNoICE9IC0xICYmIGxhc3RTbGFzaCAhPSBwYXR0ZXJuLmxlbmd0aC0xKXsgLy8gdHJhaWxpbmcgc2xhc2ggLT4gYWRkcyAnKionIGZvciBmcmVlIChzZWUgaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kaXJ0YXNrcy5odG1sKQogCQkJCQkJaW50IHN0YXIgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyonLCBwYXR0ZXJuLCBsYXN0U2xhc2gpOwogCQkJCQkJaWYgKChzdGFyID09IC0xCi0JCQkJCQkJCXx8IHN0YXIgPj0gcGF0dGVybi5sZW5ndGgtMSAKKwkJCQkJCQkJfHwgc3RhciA+PSBwYXR0ZXJuLmxlbmd0aC0xCiAJCQkJCQkJCXx8IHBhdHRlcm5bc3RhcisxXSAhPSAnKicpKSB7CiAJCQkJCQkJZm9sZGVyUGF0dGVybiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocGF0dGVybiwgMCwgbGFzdFNsYXNoKTsKIAkJCQkJCX0KQEAgLTM5NCw3ICs4MTQsOCBAQAogCQkJfQogCQl9CiAJCXJldHVybiBmYWxzZTsKLQl9CQkJCisJfQorCiAJLyoqCiAJICogUmV0dXJucyB0cnVlIGlmZiBzdHIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKQogCSAqIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjcmVhdGluZyBleHRyYSBzdHJpbmdzLgpAQCAtNDA4LDggKzgyOSw5IEBACiAJCQljaGFyIGMgPSBuYW1lW29mZnNldCArIGldOwogCQkJaWYgKGMgIT0gU1VGRklYX2phdmFbaV0gJiYgYyAhPSBTVUZGSVhfSkFWQVtpXSkgcmV0dXJuIGZhbHNlOwogCQl9Ci0JCXJldHVybiB0cnVlOwkJCisJCXJldHVybiB0cnVlOwogCX0KKwogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikKIAkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY3JlYXRpbmcgZXh0cmEgc3RyaW5ncy4KQEAgLTQyNCw5ICs4NDYsNjQgQEAKIAkJCWludCBzdWZmaXhJbmRleCA9IHN1ZmZpeExlbmd0aCAtIGkgLSAxOwogCQkJaWYgKGMgIT0gU1VGRklYX2phdmFbc3VmZml4SW5kZXhdICYmIGMgIT0gU1VGRklYX0pBVkFbc3VmZml4SW5kZXhdKSByZXR1cm4gZmFsc2U7CiAJCX0KLQkJcmV0dXJuIHRydWU7CQkKKwkJcmV0dXJuIHRydWU7CiAJfQogCisJcHVibGljIHN0YXRpYyB2b2lkIHJldmVyc2VRdWlja1NvcnQoY2hhcltdW10gbGlzdCwgaW50IGxlZnQsIGludCByaWdodCkgeworCQlpbnQgb3JpZ2luYWxfbGVmdD0gbGVmdDsKKwkJaW50IG9yaWdpbmFsX3JpZ2h0PSByaWdodDsKKwkJY2hhcltdIG1pZD0gbGlzdFtsZWZ0ICsgKChyaWdodC1sZWZ0KS8yKV07CisJCWRvIHsKKwkJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmNvbXBhcmVUbyhsaXN0W2xlZnRdLCBtaWQpID4gMCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmNvbXBhcmVUbyhtaWQsIGxpc3RbcmlnaHRdKSA+IDApIHsKKwkJCQlyaWdodC0tOworCQkJfQorCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCQljaGFyW10gdG1wPSBsaXN0W2xlZnRdOworCQkJCWxpc3RbbGVmdF09IGxpc3RbcmlnaHRdOworCQkJCWxpc3RbcmlnaHRdPSB0bXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlyZXZlcnNlUXVpY2tTb3J0KGxpc3QsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwkJfQorCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCQlyZXZlcnNlUXVpY2tTb3J0KGxpc3QsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwkJfQorCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmV2ZXJzZVF1aWNrU29ydChjaGFyW11bXSBsaXN0LCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnRbXSByZXN1bHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQ9IGxlZnQ7CisJCWludCBvcmlnaW5hbF9yaWdodD0gcmlnaHQ7CisJCWNoYXJbXSBtaWQ9IGxpc3RbbGVmdCArICgocmlnaHQtbGVmdCkvMildOworCQlkbyB7CisJCQl3aGlsZSAoQ2hhck9wZXJhdGlvbi5jb21wYXJlVG8obGlzdFtsZWZ0XSwgbWlkKSA+IDApIHsKKwkJCQlsZWZ0Kys7CisJCQl9CisJCQl3aGlsZSAoQ2hhck9wZXJhdGlvbi5jb21wYXJlVG8obWlkLCBsaXN0W3JpZ2h0XSkgPiAwKSB7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJY2hhcltdIHRtcD0gbGlzdFtsZWZ0XTsKKwkJCQlsaXN0W2xlZnRdPSBsaXN0W3JpZ2h0XTsKKwkJCQlsaXN0W3JpZ2h0XT0gdG1wOworCQkJCWludCB0ZW1wID0gcmVzdWx0W2xlZnRdOworCQkJCXJlc3VsdFtsZWZ0XSA9IHJlc3VsdFtyaWdodF07CisJCQkJcmVzdWx0W3JpZ2h0XSA9IHRlbXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlyZXZlcnNlUXVpY2tTb3J0KGxpc3QsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0LCByZXN1bHQpOworCQl9CisJCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKKwkJCXJldmVyc2VRdWlja1NvcnQobGlzdCwgbGVmdCwgb3JpZ2luYWxfcmlnaHQsIHJlc3VsdCk7CisJCX0KKwl9CiAJLyoqCiAJICogSU5URVJOQUwgVVNFLU9OTFkKIAkgKiBTZWFyY2ggdGhlIGNvbHVtbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIHBvc2l0aW9uCkBAIC00NDYsNiArOTIzLDcgQEAKIAkgICAgCQlyZXR1cm4gcG9zaXRpb24gLSBzdGFydExpbmVJbmRleGVzW2xpbmVdOwogCQl9CiAJfQorCiAJLyoqCiAJICogQ29udmVydHMgYSBib29sZWFuIHZhbHVlIGludG8gQm9vbGVhbi4KIAkgKiBAcGFyYW0gYm9vbCBUaGUgYm9vbGVhbiB0byBjb252ZXJ0CkBAIC00NjIsMTEgKzk0MCwxMSBAQAogCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIE9iamVjdHMgaW50byBTdHJpbmcuCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gb2JqZWN0cykgewotCQlyZXR1cm4gdG9TdHJpbmcob2JqZWN0cywgCi0JCQluZXcgRGlzcGxheWFibGUoKXsgCi0JCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IAorCQlyZXR1cm4gdG9TdHJpbmcob2JqZWN0cywKKwkJCW5ldyBEaXNwbGF5YWJsZSgpeworCQkJCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZyhPYmplY3QgbykgewogCQkJCQlpZiAobyA9PSBudWxsKSByZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBvLnRvU3RyaW5nKCk7IAorCQkJCQlyZXR1cm4gby50b1N0cmluZygpOwogCQkJCX0KIAkJCX0pOwogCX0KQEAgLTQ4Myw0ICs5NjEsNTk5IEBACiAJCX0KIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLX0KKworCS8qKgorCSAqIG91dHB1dFBhdGggaXMgZm9ybWVkIGxpa2U6CisJICoJICAgYzpcdGVtcFwgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgZmlsZSBzZXBhcmF0b3IKKwkgKiByZWxhdGl2ZUZpbGVOYW1lIGlzIGZvcm1lZCBsaWtlOgorCSAqICAgICBqYXZhXGxhbmdcU3RyaW5nLmNsYXNzCisJICogQHBhcmFtIGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUgYSBmbGFnIHRvIGtub3cgaWYgdGhlIHBhY2thZ2VzIHN0cnVjdHVyZSBoYXMgdG8gYmUgZ2VuZXJhdGVkLgorCSAqIEBwYXJhbSBvdXRwdXRQYXRoIHRoZSBnaXZlbiBvdXRwdXQgZGlyZWN0b3J5CisJICogQHBhcmFtIHJlbGF0aXZlRmlsZU5hbWUgdGhlIGdpdmVuIHJlbGF0aXZlIGZpbGUgbmFtZQorCSAqIEBwYXJhbSBjbGFzc0ZpbGUgdGhlIGdpdmVuIGNsYXNzRmlsZSB0byB3cml0ZQorCSAqCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9EaXNrKGJvb2xlYW4gZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZSwgU3RyaW5nIG91dHB1dFBhdGgsIFN0cmluZyByZWxhdGl2ZUZpbGVOYW1lLCBDbGFzc0ZpbGUgY2xhc3NGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlT3V0cHV0U3RyZWFtIGZpbGUgPSBnZXRGaWxlT3V0cHV0U3RyZWFtKGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsIG91dHB1dFBhdGgsIHJlbGF0aXZlRmlsZU5hbWUpOworCQkvKiB1c2UgamF2YS5uaW8gdG8gd3JpdGUKKwkJaWYgKHRydWUpIHsKKwkJCUZpbGVDaGFubmVsIGNoID0gZmlsZS5nZXRDaGFubmVsKCk7CisJCQl0cnkgeworCQkJCUJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShjbGFzc0ZpbGUuaGVhZGVyT2Zmc2V0ICsgY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KTsKKwkJCQlidWZmZXIucHV0KGNsYXNzRmlsZS5oZWFkZXIsIDAsIGNsYXNzRmlsZS5oZWFkZXJPZmZzZXQpOworCQkJCWJ1ZmZlci5wdXQoY2xhc3NGaWxlLmNvbnRlbnRzLCAwLCBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQpOworCQkJCWJ1ZmZlci5mbGlwKCk7CisJCQkJd2hpbGUgKHRydWUpIHsKKwkJCQkJaWYgKGNoLndyaXRlKGJ1ZmZlcikgPT0gMCkgYnJlYWs7CisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCQljaC5jbG9zZSgpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCSovCisJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmaWxlLCBERUZBVUxUX1dSSVRJTkdfU0laRSk7CisvLwkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZpbGUpOworCQl0cnkgeworCQkJLy8gaWYgbm8gSU9FeGNlcHRpb24gb2NjdXJlZCwgb3V0cHV0IGNhbm5vdCBiZSBudWxsCisJCQlvdXRwdXQud3JpdGUoY2xhc3NGaWxlLmhlYWRlciwgMCwgY2xhc3NGaWxlLmhlYWRlck9mZnNldCk7CisJCQlvdXRwdXQud3JpdGUoY2xhc3NGaWxlLmNvbnRlbnRzLCAwLCBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQpOworCQkJb3V0cHV0LmZsdXNoKCk7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBmaW5hbGx5IHsKKwkJCW91dHB1dC5jbG9zZSgpOworCQl9CisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCByZWNvcmROZXN0ZWRUeXBlKENsYXNzRmlsZSBjbGFzc0ZpbGUsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCWlmIChjbGFzc0ZpbGUudmlzaXRlZFR5cGVzID09IG51bGwpIHsKKwkJCWNsYXNzRmlsZS52aXNpdGVkVHlwZXMgPSBuZXcgSGFzaFNldCgzKTsKKwkJfSBlbHNlIGlmIChjbGFzc0ZpbGUudmlzaXRlZFR5cGVzLmNvbnRhaW5zKHR5cGVCaW5kaW5nKSkgeworCQkJLy8gdHlwZSBpcyBhbHJlYWR5IHZpc2l0ZWQKKwkJCXJldHVybjsKKwkJfQorCQljbGFzc0ZpbGUudmlzaXRlZFR5cGVzLmFkZCh0eXBlQmluZGluZyk7CisJCWlmICh0eXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkKKwkJCQkmJiAoKHR5cGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApKSB7CisJCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdHlwZUJpbmRpbmc7CisJCQlSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlID0gcGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nLmdlbmVyaWNUeXBlKCk7CisJCQlpZiAoKGdlbmVyaWNUeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApIHsKKwkJCQlyZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgZ2VuZXJpY1R5cGUpOworCQkJfQorCQkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMgPSBwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcuYXJndW1lbnRzOworCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaiA9IDAsIG1heDIgPSBhcmd1bWVudHMubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7CisJCQkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50ID0gYXJndW1lbnRzW2pdOworCQkJCQlpZiAoYXJndW1lbnQuaXNXaWxkY2FyZCgpKSB7CisJCQkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgYXJndW1lbnQ7CisJCQkJCQlUeXBlQmluZGluZyBib3VuZCA9IHdpbGRjYXJkQmluZGluZy5ib3VuZDsKKwkJCQkJCWlmIChib3VuZCAhPSBudWxsCisJCQkJCQkJCSYmICgoYm91bmQudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkpIHsKKwkJCQkJCQlyZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgYm91bmQpOworCQkJCQkJfQorCQkJCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gd2lsZGNhcmRCaW5kaW5nLnN1cGVyY2xhc3MoKTsKKwkJCQkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwKKwkJCQkJCQkJJiYgKChzdXBlcmNsYXNzLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApKSB7CisJCQkJCQkJcmVjb3JkTmVzdGVkVHlwZShjbGFzc0ZpbGUsIHN1cGVyY2xhc3MpOworCQkJCQkJfQorCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IHdpbGRjYXJkQmluZGluZy5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCQkJCWZvciAoaW50IGsgPSAwLCBtYXgzID0gIHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGsgPCBtYXgzOyBrKyspIHsKKwkJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlckludGVyZmFjZSA9IHN1cGVySW50ZXJmYWNlc1trXTsKKwkJCQkJCQkJaWYgKChzdXBlckludGVyZmFjZS50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJCQkJCQlyZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgc3VwZXJJbnRlcmZhY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKChhcmd1bWVudC50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJCQlyZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgYXJndW1lbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHR5cGVCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkKKwkJCQkmJiAoKHR5cGVCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkNvbnRhaW5zTmVzdGVkVHlwZVJlZmVyZW5jZXMpICE9IDApKSB7CisJCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZUJpbmRpbmcgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgdHlwZUJpbmRpbmc7CisJCQlUeXBlQmluZGluZyB1cHBlckJvdW5kID0gdHlwZVZhcmlhYmxlQmluZGluZy51cHBlckJvdW5kKCk7CisJCQlpZiAodXBwZXJCb3VuZCAhPSBudWxsICYmICgodXBwZXJCb3VuZC50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSkgeworCQkJCXJlY29yZE5lc3RlZFR5cGUoY2xhc3NGaWxlLCB1cHBlckJvdW5kKTsKKwkJCX0KKwkJCVR5cGVCaW5kaW5nW10gdXBwZXJCb3VuZHMgPSB0eXBlVmFyaWFibGVCaW5kaW5nLm90aGVyVXBwZXJCb3VuZHMoKTsKKwkJCWlmICh1cHBlckJvdW5kcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgayA9IDAsIG1heDMgPSAgdXBwZXJCb3VuZHMubGVuZ3RoOyBrIDwgbWF4MzsgaysrKSB7CisJCQkJCVR5cGVCaW5kaW5nIG90aGVyVXBwZXJCb3VuZCA9IHVwcGVyQm91bmRzW2tdOworCQkJCQlpZiAoKG90aGVyVXBwZXJCb3VuZC50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJCQlyZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgb3RoZXJVcHBlckJvdW5kKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkgeworCQkJY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3Nlcyh0eXBlQmluZGluZyk7CisJCX0KKwl9CisJLyoKKwkgKiBFeHRlcm5hbCBBUEkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0SmF2YUhvbWUoKSB7CisJCVN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ly8kTk9OLU5MUy0xJAorCQlpZiAoamF2YUhvbWUgIT0gbnVsbCkgeworCQkJRmlsZSBqYXZhSG9tZUZpbGUgPSBuZXcgRmlsZShqYXZhSG9tZSk7CisJCQlpZiAoamF2YUhvbWVGaWxlLmV4aXN0cygpKSB7CisJCQkJcmV0dXJuIGphdmFIb21lRmlsZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdFJ1bm5pbmdWTUJvb3RjbGFzc3BhdGgoTGlzdCBib290Y2xhc3NwYXRocykgeworCQkvKiBubyBib290Y2xhc3NwYXRoIHNwZWNpZmllZAorCQkgKiB3ZSBjYW4gdHJ5IHRvIHJldHJpZXZlIHRoZSBkZWZhdWx0IGxpYnJhaXJpZXMgb2YgdGhlIFZNIHVzZWQgdG8gcnVuCisJCSAqIHRoZSBiYXRjaCBjb21waWxlcgorCQkgKi8KKwkJU3RyaW5nIGphdmF2ZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsvLyROT04tTkxTLTEkCisJCWlmIChqYXZhdmVyc2lvbiAhPSBudWxsICYmIGphdmF2ZXJzaW9uLmVxdWFsc0lnbm9yZUNhc2UoIjEuMS44IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCQl9CisKKwkJLyoKKwkJICogSGFuZGxlID49IEpESyAxLjIuMiBzZXR0aW5nczogcmV0cmlldmUgdGhlIGJvb3RjbGFzc3BhdGgKKwkJICovCisJCS8vIGNoZWNrIGJvb3RjbGFzc3BhdGggcHJvcGVydGllcyBmb3IgU3VuLCBKUm9ja2l0IGFuZCBIYXJtb255IFZNcworCQlTdHJpbmcgYm9vdGNsYXNzcGF0aFByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgPT0gbnVsbCkgfHwgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSkgeworCQkJLy8gSUJNIEo5IFZNcworCQkJYm9vdGNsYXNzcGF0aFByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ2bS5ib290LmNsYXNzLnBhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgPT0gbnVsbCkgfHwgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSkgeworCQkJCS8vIEhhcm1vbnkgdXNpbmcgSUJNIFZNRQorCQkJCWJvb3RjbGFzc3BhdGhQcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5oYXJtb255LmJvb3QuY2xhc3MucGF0aCIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChib290Y2xhc3NwYXRoUHJvcGVydHkgIT0gbnVsbCkgJiYgKGJvb3RjbGFzc3BhdGhQcm9wZXJ0eS5sZW5ndGgoKSAhPSAwKSkgeworCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYm9vdGNsYXNzcGF0aFByb3BlcnR5LCBGaWxlLnBhdGhTZXBhcmF0b3IpOworCQkJU3RyaW5nIHRva2VuOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQlGaWxlU3lzdGVtLkNsYXNzcGF0aCBjdXJyZW50Q2xhc3NwYXRoID0gRmlsZVN5c3RlbS5nZXRDbGFzc3BhdGgodG9rZW4sIG51bGwsIG51bGwpOworCQkJCWlmIChjdXJyZW50Q2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQkJYm9vdGNsYXNzcGF0aHMuYWRkKGN1cnJlbnRDbGFzc3BhdGgpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHRyeSB0byBnZXQgYWxsIGphcnMgaW5zaWRlIHRoZSBsaWIgZm9sZGVyIG9mIHRoZSBqYXZhIGhvbWUKKwkJCWZpbmFsIEZpbGUgamF2YUhvbWUgPSBnZXRKYXZhSG9tZSgpOworCQkJaWYgKGphdmFIb21lICE9IG51bGwpIHsKKwkJCQlGaWxlW10gZGlyZWN0b3JpZXNUb0NoZWNrID0gbnVsbDsKKwkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiTWFjIikpIHsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJCQlkaXJlY3Rvcmllc1RvQ2hlY2sgPSBuZXcgRmlsZVtdIHsKKwkJCQkJCW5ldyBGaWxlKGphdmFIb21lLCAiLi4vQ2xhc3NlcyIpLCAvLyROT04tTkxTLTEkCisJCQkJCX07CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZmFsbCBiYWNrIHRvIHRyeSB0byByZXRyaWV2ZSB0aGVtIG91dCBvZiB0aGUgbGliIGRpcmVjdG9yeQorCQkJCQlkaXJlY3Rvcmllc1RvQ2hlY2sgPSBuZXcgRmlsZVtdIHsKKwkJCQkJCW5ldyBGaWxlKGphdmFIb21lLCAibGliIikgLy8kTk9OLU5MUy0xJAorCQkJCQl9OworCQkJCX0KKwkJCQlGaWxlW11bXSBzeXN0ZW1MaWJyYXJpZXNKYXJzID0gTWFpbi5nZXRMaWJyYXJpZXNGaWxlcyhkaXJlY3Rvcmllc1RvQ2hlY2spOworCQkJCWlmIChzeXN0ZW1MaWJyYXJpZXNKYXJzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5c3RlbUxpYnJhcmllc0phcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCUZpbGVbXSBjdXJyZW50ID0gc3lzdGVtTGlicmFyaWVzSmFyc1tpXTsKKwkJCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMCwgbWF4MiA9IGN1cnJlbnQubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7CisJCQkJCQkJCUZpbGVTeXN0ZW0uQ2xhc3NwYXRoIGNsYXNzcGF0aCA9CisJCQkJCQkJCQlGaWxlU3lzdGVtLmdldENsYXNzcGF0aChjdXJyZW50W2pdLmdldEFic29sdXRlUGF0aCgpLAorCQkJCQkJCQkJCW51bGwsIGZhbHNlLCBudWxsLCBudWxsKTsKKwkJCQkJCQkJaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisJCQkJCQkJCQlib290Y2xhc3NwYXRocy5hZGQoY2xhc3NwYXRoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbWV0ZXJDb3VudChjaGFyW10gbWV0aG9kU2lnbmF0dXJlKSB7CisJCXRyeSB7CisJCQlpbnQgY291bnQgPSAwOworCQkJaW50IGkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKTsKKwkJCWlmIChpIDwgMCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0gZWxzZSB7CisJCQkJaSsrOworCQkJfQorCQkJZm9yICg7OykgeworCQkJCWlmIChtZXRob2RTaWduYXR1cmVbaV0gPT0gQ19QQVJBTV9FTkQpIHsKKwkJCQkJcmV0dXJuIGNvdW50OworCQkJCX0KKwkJCQlpbnQgZT0gVXRpbC5zY2FuVHlwZVNpZ25hdHVyZShtZXRob2RTaWduYXR1cmUsIGkpOworCQkJCWlmIChlIDwgMCkgeworCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaSA9IGUgKyAxOworCQkJCX0KKwkJCQljb3VudCsrOworCQkJfQorCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJfQorCisJLyoqCisJICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgorCSAqIDxwcmU+CisJICogVHlwZVNpZ25hdHVyZToKKwkgKiAgfCAgQmFzZVR5cGVTaWduYXR1cmUKKwkgKiAgfCAgQXJyYXlUeXBlU2lnbmF0dXJlCisJICogIHwgIENsYXNzVHlwZVNpZ25hdHVyZQorCSAqICB8ICBUeXBlVmFyaWFibGVTaWduYXR1cmUKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIHR5cGUgc2lnbmF0dXJlCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgc2NhblR5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7CisJCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhcgorCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07CisJCXN3aXRjaCAoYykgeworCQkJY2FzZSBDX0FSUkFZIDoKKwkJCQlyZXR1cm4gc2NhbkFycmF5VHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwkJCWNhc2UgQ19SRVNPTFZFRCA6CisJCQljYXNlIENfVU5SRVNPTFZFRCA6CisJCQkJcmV0dXJuIHNjYW5DbGFzc1R5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQljYXNlIENfVFlQRV9WQVJJQUJMRSA6CisJCQkJcmV0dXJuIHNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQljYXNlIENfQk9PTEVBTiA6CisJCQljYXNlIENfQllURSA6CisJCQljYXNlIENfQ0hBUiA6CisJCQljYXNlIENfRE9VQkxFIDoKKwkJCWNhc2UgQ19GTE9BVCA6CisJCQljYXNlIENfSU5UIDoKKwkJCWNhc2UgQ19MT05HIDoKKwkJCWNhc2UgQ19TSE9SVCA6CisJCQljYXNlIENfVk9JRCA6CisJCQkJcmV0dXJuIHNjYW5CYXNlVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwkJCWNhc2UgQ19DQVBUVVJFIDoKKwkJCQlyZXR1cm4gc2NhbkNhcHR1cmVUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOworCQkJY2FzZSBDX0VYVEVORFM6CisJCQljYXNlIENfU1VQRVI6CisJCQljYXNlIENfU1RBUjoKKwkJCQlyZXR1cm4gc2NhblR5cGVCb3VuZFNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwkJCWRlZmF1bHQgOgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgYmFzZSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgorCSAqIDxwcmU+CisJICogQmFzZVR5cGVTaWduYXR1cmU6CisJICogICAgIDxiPkI8L2I+IHwgPGI+QzwvYj4gfCA8Yj5EPC9iPiB8IDxiPkY8L2I+IHwgPGI+STwvYj4KKwkgKiAgIHwgPGI+SjwvYj4gfCA8Yj5TPC9iPiB8IDxiPlY8L2I+IHwgPGI+WjwvYj4KKwkgKiA8L3ByZT4KKwkgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGJhc2UgdHlwZSAiViIgaXMgb25seSBhbGxvd2VkIGluIG1ldGhvZCByZXR1cm4gdHlwZXMsCisJICogdGhlcmUgaXMgbm8gc3ludGFjdGljIGFtYmlndWl0eS4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgdGhlbSBhbnl3aGVyZQorCSAqIHdpdGhvdXQgY29tcGxhaW50LgorCSAqCisJICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZworCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgYmFzZSB0eXBlIHNpZ25hdHVyZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5CYXNlVHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQpIHsKKwkJLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCisJCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKKwkJaWYgKCJCQ0RGSUpTVloiLmluZGV4T2YoYykgPj0gMCkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gc3RhcnQ7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KKwkgKiBpbmRleCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgorCSAqIDxwcmU+CisJICogQXJyYXlUeXBlU2lnbmF0dXJlOgorCSAqICAgICA8Yj5bPC9iPiBUeXBlU2lnbmF0dXJlCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisJICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYW4gYXJyYXkgdHlwZSBzaWduYXR1cmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBzY2FuQXJyYXlUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgeworCQlpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKKwkJLy8gbmVlZCBhIG1pbmltdW0gMiBjaGFyCisJCWlmIChzdGFydCA+PSBsZW5ndGggLSAxKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKKwkJaWYgKGMgIT0gQ19BUlJBWSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCisJCWMgPSBzdHJpbmdbKytzdGFydF07CisJCXdoaWxlKGMgPT0gQ19BUlJBWSkgeworCQkJLy8gbmVlZCBhIG1pbmltdW0gMiBjaGFyCisJCQlpZiAoc3RhcnQgPj0gbGVuZ3RoIC0gMSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCWMgPSBzdHJpbmdbKytzdGFydF07CisJCX0KKwkJcmV0dXJuIHNjYW5UeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOworCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgY2FwdHVyZSBvZiBhIHdpbGRjYXJkIHR5cGUgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgorCSAqIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIuCisJICogPHByZT4KKwkgKiBDYXB0dXJlVHlwZVNpZ25hdHVyZToKKwkgKiAgICAgPGI+ITwvYj4gVHlwZUJvdW5kU2lnbmF0dXJlCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisJICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSBjYXB0dXJlIHR5cGUgc2lnbmF0dXJlCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgc2NhbkNhcHR1cmVUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgeworCQkvLyBuZWVkIGEgbWluaW11bSAyIGNoYXIKKwkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAxKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKKwkJaWYgKGMgIT0gQ19DQVBUVVJFKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIHNjYW5UeXBlQm91bmRTaWduYXR1cmUoc3RyaW5nLCBzdGFydCArIDEpOworCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSB2YXJpYWJsZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisJICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KKwkgKiA8cHJlPgorCSAqIFR5cGVWYXJpYWJsZVNpZ25hdHVyZToKKwkgKiAgICAgPGI+VDwvYj4gSWRlbnRpZmllciA8Yj47PC9iPgorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZworCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSB2YXJpYWJsZSBzaWduYXR1cmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBzY2FuVHlwZVZhcmlhYmxlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgeworCQkvLyBuZWVkIGEgbWluaW11bSAzIGNoYXJzICJUeDsiCisJCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoIC0gMikgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIG11c3Qgc3RhcnQgaW4gIlQiCisJCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07CisJCWlmIChjICE9IENfVFlQRV9WQVJJQUJMRSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWludCBpZCA9IHNjYW5JZGVudGlmaWVyKHN0cmluZywgc3RhcnQgKyAxKTsKKwkJYyA9IHN0cmluZ1tpZCArIDFdOworCQlpZiAoYyA9PSBDX1NFTUlDT0xPTikgeworCQkJcmV0dXJuIGlkICsgMTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGFuIGlkZW50aWZpZXIgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisJICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KKwkgKiBTdG9wIGNoYXJhY3RlcnMgYXJlOiAiOyIsICI6IiwgIiZsdDsiLCAiJmd0OyIsICIvIiwgIi4iLgorCSAqCisJICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZworCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGFuIGlkZW50aWZpZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBzY2FuSWRlbnRpZmllcihjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQpIHsKKwkJLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCisJCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJaW50IHAgPSBzdGFydDsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWNoYXIgYyA9IHN0cmluZ1twXTsKKwkJCWlmIChjID09ICc8JyB8fCBjID09ICc+JyB8fCBjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICcuJyB8fCBjID09ICcvJykgeworCQkJCXJldHVybiBwIC0gMTsKKwkJCX0KKwkJCXArKzsKKwkJCWlmIChwID09IHN0cmluZy5sZW5ndGgpIHsKKwkJCQlyZXR1cm4gcCAtIDE7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhIGNsYXNzIHR5cGUgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgorCSAqIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIuCisJICogPHByZT4KKwkgKiBDbGFzc1R5cGVTaWduYXR1cmU6CisJICogICAgIHsgPGI+TDwvYj4gfCA8Yj5RPC9iPiB9IElkZW50aWZpZXIKKwkgKiAgICAgICAgICAgeyB7IDxiPi88L2I+IHwgPGI+LjwvYj4gSWRlbnRpZmllciBbIDxiPiZsdDs8L2I+IFR5cGVBcmd1bWVudFNpZ25hdHVyZSogPGI+Jmd0OzwvYj4gXSB9CisJICogICAgICAgICAgIDxiPjs8L2I+CisJICogPC9wcmU+CisJICogTm90ZSB0aGF0IGFsdGhvdWdoIGFsbCAiLyItaWRlbnRpZmllcnMgbW9zdCBjb21lIGJlZm9yZSAiLiItaWRlbnRpZmllcnMsCisJICogdGhlcmUgaXMgbm8gc3ludGFjdGljIGFtYmlndWl0eS4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgdGhlbSB3aXRob3V0CisJICogY29tcGxhaW50LgorCSAqCisJICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZworCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgY2xhc3MgdHlwZSBzaWduYXR1cmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBzY2FuQ2xhc3NUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgeworCQkvLyBuZWVkIGEgbWluaW11bSAzIGNoYXJzICJMeDsiCisJCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoIC0gMikgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIG11c3Qgc3RhcnQgaW4gIkwiIG9yICJRIgorCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOworCQlpZiAoYyAhPSBDX1JFU09MVkVEICYmIGMgIT0gQ19VTlJFU09MVkVEKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaW50IHAgPSBzdGFydCArIDE7CisJCXdoaWxlICh0cnVlKSB7CisJCQlpZiAocCA+PSBzdHJpbmcubGVuZ3RoKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJYyA9IHN0cmluZ1twXTsKKwkJCWlmIChjID09IENfU0VNSUNPTE9OKSB7CisJCQkJLy8gYWxsIGRvbmUKKwkJCQlyZXR1cm4gcDsKKwkJCX0gZWxzZSBpZiAoYyA9PSBDX0dFTkVSSUNfU1RBUlQpIHsKKwkJCQlpbnQgZSA9IHNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmVzKHN0cmluZywgcCk7CisJCQkJcCA9IGU7CisJCQl9IGVsc2UgaWYgKGMgPT0gQ19ET1QgfHwgYyA9PSAnLycpIHsKKwkJCQlpbnQgaWQgPSBzY2FuSWRlbnRpZmllcihzdHJpbmcsIHAgKyAxKTsKKwkJCQlwID0gaWQ7CisJCQl9CisJCQlwKys7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhIHR5cGUgYm91bmQgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgorCSAqIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIuCisJICogPHByZT4KKwkgKiBUeXBlQm91bmRTaWduYXR1cmU6CisJICogICAgIDxiPlstK108L2I+IFR5cGVTaWduYXR1cmUgPGI+OzwvYj4KKwkgKiAgICAgPGI+KjwvYj48L2I+CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisJICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHZhcmlhYmxlIHNpZ25hdHVyZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlQm91bmRTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7CisJCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhciBmb3Igd2lsZGNhcmQKKwkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOworCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgQ19TVEFSIDoKKwkJCQlyZXR1cm4gc3RhcnQ7CisJCQljYXNlIENfU1VQRVIgOgorCQkJY2FzZSBDX0VYVEVORFMgOgorCQkJCS8vIG5lZWQgYSBtaW5pbXVtIDMgY2hhcnMgIitbSSIKKwkJCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDIpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCS8vIG11c3Qgc3RhcnQgaW4gIisvLSIKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQorCQl9CisJCWMgPSBzdHJpbmdbKytzdGFydF07CisJCXN3aXRjaCAoYykgeworCQkJY2FzZSBDX0NBUFRVUkUgOgorCQkJCXJldHVybiBzY2FuQ2FwdHVyZVR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQljYXNlIENfU1VQRVIgOgorCQkJY2FzZSBDX0VYVEVORFMgOgorCQkJCXJldHVybiBzY2FuVHlwZUJvdW5kU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOworCQkJY2FzZSBDX1JFU09MVkVEIDoKKwkJCWNhc2UgQ19VTlJFU09MVkVEIDoKKwkJCQlyZXR1cm4gc2NhbkNsYXNzVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwkJCWNhc2UgQ19UWVBFX1ZBUklBQkxFIDoKKwkJCQlyZXR1cm4gc2NhblR5cGVWYXJpYWJsZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwkJCWNhc2UgQ19BUlJBWSA6CisJCQkJcmV0dXJuIHNjYW5BcnJheVR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQljYXNlIENfU1RBUjoKKwkJCQlyZXR1cm4gc3RhcnQ7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgbGlzdCBvZiB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMgc3RhcnRpbmcgYXQKKwkgKiB0aGUgZ2l2ZW4gaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KKwkgKiA8cHJlPgorCSAqIFR5cGVBcmd1bWVudFNpZ25hdHVyZXM6CisJICogICAgIDxiPiZsdDs8L2I+IFR5cGVBcmd1bWVudFNpZ25hdHVyZSogPGI+Jmd0OzwvYj4KKwkgKiA8L3ByZT4KKwkgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgYXQgbGVhc3Qgb25lIHR5cGUgYXJndW1lbnQsIHRoZXJlCisJICogaXMgbm8gc3ludGFjdGljIGFtYmlndWl0eSBpZiB0aGVyZSBhcmUgbm9uZS4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgemVybworCSAqIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlcyB3aXRob3V0IGNvbXBsYWludC4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMKKwkgKiBzaWduYXR1cmVzCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgc2NhblR5cGVBcmd1bWVudFNpZ25hdHVyZXMoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7CisJCS8vIG5lZWQgYSBtaW5pbXVtIDIgY2hhciAiPD4iCisJCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoIC0gMSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07CisJCWlmIChjICE9IENfR0VORVJJQ19TVEFSVCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWludCBwID0gc3RhcnQgKyAxOworCQl3aGlsZSAodHJ1ZSkgeworCQkJaWYgKHAgPj0gc3RyaW5nLmxlbmd0aCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCWMgPSBzdHJpbmdbcF07CisJCQlpZiAoYyA9PSBDX0dFTkVSSUNfRU5EKSB7CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCQlpbnQgZSA9IHNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmUoc3RyaW5nLCBwKTsKKwkJCXAgPSBlICsgMTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSBhcmd1bWVudCBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisJICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KKwkgKiA8cHJlPgorCSAqIFR5cGVBcmd1bWVudFNpZ25hdHVyZToKKwkgKiAgICAgPGI+JiM0Mjs8L2I+CisJICogIHwgIDxiPis8L2I+IFR5cGVTaWduYXR1cmUKKwkgKiAgfCAgPGI+LTwvYj4gVHlwZVNpZ25hdHVyZQorCSAqICB8ICBUeXBlU2lnbmF0dXJlCisJICogPC9wcmU+CisJICogTm90ZSB0aGF0IGFsdGhvdWdoIGJhc2UgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIGluIHR5cGUgYXJndW1lbnRzLCB0aGVyZSBpcworCSAqIG5vIHN5bnRhY3RpYyBhbWJpZ3VpdHkuIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IHRoZW0gd2l0aG91dCBjb21wbGFpbnQuCisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisJICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7CisJCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhcgorCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07CisJCXN3aXRjaCAoYykgeworCQkJY2FzZSBDX1NUQVIgOgorCQkJCXJldHVybiBzdGFydDsKKwkJCWNhc2UgQ19FWFRFTkRTIDoKKwkJCWNhc2UgQ19TVVBFUiA6CisJCQkJcmV0dXJuIHNjYW5UeXBlQm91bmRTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gc2NhblR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcG9uZW50LnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBvbmVudC54bWwKaW5kZXggMzYzYjEyYS4uNjE5OTQ1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcG9uZW50LnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21wb25lbnQueG1sCkBAIC0xLDEwICsxLDI0IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKIDxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9jb21wb25lbnQiCiAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvY29tcG9uZW50IC4uL2NvbXBvbmVudC54c2QgIgogICAgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUiPgogIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiAvPgogCisgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuYmF0Y2giPgorICAgPHR5cGUgbmFtZT0iQmF0Y2hDb21waWxlciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+IAorIDwvcGFja2FnZT4KICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZSI+CiAgICA8dHlwZSBuYW1lPSJCaW5kaW5nS2V5IiBzdWJjbGFzcz0iZmFsc2UiIC8+CiAgICA8dHlwZSBuYW1lPSJCdWZmZXJDaGFuZ2VkRXZlbnQiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CkBAIC0xNjUsNyArMTc5LDYgQEAKICAgIDx0eXBlIG5hbWU9Ik1ldGhvZFJlZiIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CiAgICA8dHlwZSBuYW1lPSJNZXRob2RSZWZQYXJhbWV0ZXIiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgogICAgPHR5cGUgbmFtZT0iTW9kaWZpZXIiIGluc3RhbnRpYXRlPSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0gICA8dHlwZSBuYW1lPSJOYWl2ZUFTVEZsYXR0ZW5lciIgcmVmZXJlbmNlPSJmYWxzZSIvPgogICAgPHR5cGUgbmFtZT0iTmFtZSIgaW5zdGFudGlhdGU9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiLz4KICAgIDx0eXBlIG5hbWU9Ik5vZGVFdmVudEhhbmRsZXIiIHJlZmVyZW5jZT0iZmFsc2UiLz4KICAgIDx0eXBlIG5hbWU9Ik5vZGVTZWFyY2hlciIgcmVmZXJlbmNlPSJmYWxzZSIvPgpAQCAtMjI4LDcgKzI0MSw3IEBACiAgICA8dHlwZSBuYW1lPSJJR2xvYmFsVmFyaWFibGUiIGltcGxlbWVudD0iZmFsc2UiLz4gICAKICA8L3BhY2thZ2U+CiAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyIj4KLSAgIDx0eXBlIG5hbWU9IkNvZGVGb3JtYXR0ZXIiLz4KKyAgIDx0eXBlIG5hbWU9IkNvZGVGb3JtYXR0ZXIiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CiAgICA8dHlwZSBuYW1lPSJDb2RlRm9ybWF0dGVyQXBwbGljYXRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CiAgICA8dHlwZSBuYW1lPSJEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KICAgIDx0eXBlIG5hbWU9IkluZGVudE1hbmlwdWxhdGlvbiIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAppbmRleCAyMDEzOWIyLi40NDM2MWQwIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCkBAIC0xLDQgKzEsMTUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgQ29udHJpYnV0b3JzOgorICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KIDwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgpAQCAtMjcsMTEgKzM4LDEwIEBACiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJPHRhcmdldCBuYW1lPSJwb3N0LmJ1aWxkLmphcnMiPgogCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRMYWJlbCIgdmFsdWU9Imdsb2JhbCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InBvc3RpbmdEaXJlY3RvcnkiIHZhbHVlPSIke2Jhc2VkaXJ9L2VjaiIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icG9zdGluZ0RpcmVjdG9yeSIgdmFsdWU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vZWNqIiAvPgogCQk8cHJvcGVydHkgbmFtZT0iZGVzdCIgdmFsdWU9IiR7cG9zdGluZ0RpcmVjdG9yeX0vJHtidWlsZExhYmVsfSIgLz4KLQkJPGFudCBhbnRmaWxlPSIke2Jhc2VkaXJ9L3NjcmlwdHMvZXhwb3J0LWVjai54bWwiIHRhcmdldD0iZXhwb3J0Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtkZXN0fSIgLz4KLQkJPC9hbnQ+CisJCTxhbnQgYW50ZmlsZT0iJHtiYXNlZGlyfS9zY3JpcHRzL2V4cG9ydC1lY2oueG1sIiB0YXJnZXQ9ImV4cG9ydCIvPgogCTwvdGFyZ2V0PgogCQogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtNzksOSArODksNyBAQAogCTwvdGFyZ2V0PgogCiAJPHRhcmdldCBuYW1lPSJwb3N0LmNvbXBpbGUuQGRvdCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtiYXNlZGlyfS9zY3JpcHRzL2V4cG9ydC1lY2oueG1sIiB0YXJnZXQ9ImV4dHJhY3QtYmF0Y2gtY29tcGlsZXIiPgotCQkJPHByb3BlcnR5IG5hbWU9InRhcmdldC5mb2xkZXIiIHZhbHVlPSIke3RhcmdldC5mb2xkZXJ9IiAvPgotCQk8L2FudD4KKwkJPGFudCBhbnRmaWxlPSIke2Jhc2VkaXJ9L3NjcmlwdHMvZXhwb3J0LWVjai54bWwiIHRhcmdldD0iZXh0cmFjdC1iYXRjaC1jb21waWxlciIvPgogCTwvdGFyZ2V0PgogCQogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTc1LDE1ICsxODMsNDQgQEAKIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgY29tcGlsZS5qZHRDb21waWxlckFkYXB0ZXIuamFyICAgICAgICAgICAtLT4KIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8IS0tIFN0ZXBzIHRvIGRvIGR1cmluZyB0aGUgY29tcGlsYXRpb24gdGFyZ2V0IDxuYW1lPiwgYWZ0ZXIgdGhlIGNvbXBpbGUgICAtLT4KKwk8IS0tIGJ1dCBiZWZvcmUgamFyaW5nLiAgU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24tLT4KKwk8IS0tIHRhcmdldCwgZWcgQGRvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKwk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKwk8IS0tICAgc291cmNlLmZvbGRlcm4gOiBuID0gMSAuLi4gTiwgdGhlIHNvdXJjZSBmb2xkZXJzICAgICAgICAgICAgICAgICAgICAtLT4KKwk8IS0tICAgdGFyZ2V0LmZvbGRlciAgOiB3aGVyZSB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcGlsYXRpb24gZ28gICAgICAgICAgICAtLT4KKwk8IS0tICAgPG5hbWU+LmNsYXNzcGF0aCA6IG5hbWUgPSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQuIEEgICAgICAgICAtLT4KKwk8IS0tICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoIHN0cnVjdHVyZS4gICAgICAgICAgICAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAk8dGFyZ2V0IG5hbWU9InBvc3QuY29tcGlsZS5qZHRDb21waWxlckFkYXB0ZXIuamFyIj4KLQkJPGFudCBhbnRmaWxlPSIke2Jhc2VkaXJ9L3NjcmlwdHMvZXhwb3J0LWVjai54bWwiIHRhcmdldD0iZXh0cmFjdC1hbnQtYWRhcHRlci1jb21waWxlciI+Ci0JCQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0LmZvbGRlciIgdmFsdWU9IiR7dGFyZ2V0LmZvbGRlcn0iIC8+Ci0JCTwvYW50PgorCQk8YW50IGFudGZpbGU9IiR7YmFzZWRpcn0vc2NyaXB0cy9leHBvcnQtZWNqLnhtbCIgdGFyZ2V0PSJleHRyYWN0LWFudC1hZGFwdGVyLWNvbXBpbGVyIi8+CisJCTxjb3B5IHRvZGlyPSIke3RhcmdldC5mb2xkZXJ9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zY3JpcHRzL2FudGFkYXB0ZXIiPgorCQkJCTxpbmNsdWRlIG5hbWU9InBsdWdpbi5wcm9wZXJ0aWVzIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CQogCTwvdGFyZ2V0PgotCQorCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGpkdENvbXBpbGVyQWRhcHRlci5qYXIgICAgICAgICAgICAgICAgICAgLS0+CisJPCEtLSAgIGphci5Mb2NhdGlvbiA6IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBqZHRDb21waWxlckFkYXB0ZXIuamFyICAgICAgLS0+CiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJPHRhcmdldCBuYW1lPSJwb3N0LmpkdENvbXBpbGVyQWRhcHRlci5qYXIiPgorCQk8cHJvcGVydHkgbmFtZT0idW5qYXJEZXN0QmluIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wYmluIi8+CisJCTxta2RpciBkaXI9IiR7dW5qYXJEZXN0QmlufSIvPgorCQk8dW5qYXIgc3JjPSIke2phci5Mb2NhdGlvbn0iIGRlc3Q9IiR7dW5qYXJEZXN0QmlufSIvPgorCQk8ZGVsZXRlIGZpbGU9IiR7amFyLkxvY2F0aW9ufSIgLz4KKwkJPGRlbGV0ZSBmaWxlPSIke3VuamFyRGVzdEJpbn0vTUVUQS1JTkYvTUFOSUZFU1QuTUYiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgorCQk8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NjcmlwdHMvYW50YWRhcHRlci9NRVRBLUlORi9NQU5JRkVTVC5NRiIgdG9kaXI9IiR7dW5qYXJEZXN0QmlufS9NRVRBLUlORiIvPgorCQk8ZWNsaXBzZS52ZXJzaW9uUmVwbGFjZXIgcGF0aD0iJHt1bmphckRlc3RCaW59IiB2ZXJzaW9uPSIke2J1bmRsZVZlcnNpb259Ii8+CisJCTx6aXAgZGVzdGZpbGU9IiR7amFyLkxvY2F0aW9ufSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7dW5qYXJEZXN0QmlufSIgaW5jbHVkZXM9Ik1FVEEtSU5GL01BTklGRVNULk1GIi8+CisJCQk8ZmlsZXNldCBkaXI9IiR7dW5qYXJEZXN0QmlufSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKiIvPgorCQkJCTxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL01BTklGRVNULk1GIi8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvemlwPgorCQk8ZGVsZXRlIGRpcj0iJHt1bmphckRlc3RCaW59IiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KIAk8L3RhcmdldD4KIDwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1QuamF2YQppbmRleCBiYzk4YWQwLi4xNTVhOTc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNULmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsMTIgKzMyLDEyIEBACiAvKioKICAqIFVtYnJlbGxhIG93bmVyIGFuZCBhYnN0cmFjdCBzeW50YXggdHJlZSBub2RlIGZhY3RvcnkuCiAgKiBBbiA8Y29kZT5BU1Q8L2NvZGU+IGluc3RhbmNlIHNlcnZlcyBhcyB0aGUgY29tbW9uIG93bmVyIG9mIGFueSBudW1iZXIgb2YKLSAqIEFTVCBub2RlcywgYW5kIGFzIHRoZSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgQVNUIG5vZGVzIG93bmVkIGJ5IHRoYXQgCisgKiBBU1Qgbm9kZXMsIGFuZCBhcyB0aGUgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IEFTVCBub2RlcyBvd25lZCBieSB0aGF0CiAgKiBpbnN0YW5jZS4KICAqIDxwPgogICogQWJzdHJhY3Qgc3ludGF4IHRyZWVzIG1heSBiZSBoYW5kIGNvbnN0cnVjdGVkIGJ5IGNsaWVudHMsIHVzaW5nIHRoZQogICogPGNvZGU+bmV3PGk+VFlQRTwvaT48L2NvZGU+IGZhY3RvcnkgbWV0aG9kcyB0byBjcmVhdGUgbmV3IG5vZGVzLCBhbmQgdGhlCi0gKiB2YXJpb3VzIDxjb2RlPnNldDxpPkNISUxEPC9pPjwvY29kZT4gbWV0aG9kcyAKKyAqIHZhcmlvdXMgPGNvZGU+c2V0PGk+Q0hJTEQ8L2k+PC9jb2RlPiBtZXRob2RzCiAgKiAoc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSBBU1ROb2RlfSBhbmQgaXRzIHN1YmNsYXNzZXMpCiAgKiB0byBjb25uZWN0IHRoZW0gdG9nZXRoZXIuCiAgKiA8L3A+CkBAIC04NCwxNiArODQsMjMgQEAKICAqIHJlYWQtb25seSBBU1QuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIENsaWVudHMgbWF5IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB1c2luZyB7QGxpbmsgI25ld0FTVChpbnQpfSwgCisgKiBDbGllbnRzIG1heSBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdXNpbmcge0BsaW5rICNuZXdBU1QoaW50KX0sCiAgKiBidXQgdGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgQVNUUGFyc2VyCiAgKiBAc2VlIEFTVE5vZGUKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQVNUIHsKIAkvKioKKwkgKiBuZXcgQ2xhc3NbXSB7QVNULmNsYXNzfQorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFTVF9DTEFTUyA9IG5ldyBDbGFzc1tdIHtBU1QuY2xhc3N9OworCisJLyoqCiAJICogQ29uc3RhbnQgZm9yIGluZGljYXRpbmcgdGhlIEFTVCBBUEkgdGhhdCBoYW5kbGVzIEpMUzIuCiAJICogVGhpcyBBUEkgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBhbGwgY29uc3RydWN0cwogCSAqIGluIHRoZSBKYXZhIGxhbmd1YWdlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSmF2YSBMYW5ndWFnZQpAQCAtMTA0LDE3ICsxMTEsMTcgQEAKICAgICAgKiB1cCB0byBhbmQgaW5jbHVkaW5nIEoyU0UgMS40LgogICAgICAqCiAJICogQHNpbmNlIDMuMAotCSAqIEBkZXByZWNhdGVkIENsaWVudHMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNKTFMzfSBBU1QgQVBJIGluc3RlYWQuCisJICogQGRlcHJlY2F0ZWQgQ2xpZW50cyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI0pMUzR9IEFTVCBBUEkgaW5zdGVhZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKTFMyID0gMjsKLQkKKwogCS8qKgogCSAqIEludGVybmFsIHN5bm9ueW0gZm9yIHtAbGluayAjSkxTMn0uIFVzZSB0byBhbGxldmlhdGUKIAkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBKTFMyX0lOVEVSTkFMID0gSkxTMjsKLQorCQogCS8qKgogCSAqIENvbnN0YW50IGZvciBpbmRpY2F0aW5nIHRoZSBBU1QgQVBJIHRoYXQgaGFuZGxlcyBKTFMzLgogCSAqIFRoaXMgQVBJIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgYWxsIGNvbnN0cnVjdHMgaW4gdGhlCkBAIC0xMjMsMTE1ICsxMzAsMzEgQEAKICAgICAgKiBKTFMzIGlzIGEgc3VwZXJzZXQgb2YgYWxsIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlCiAgICAgICogSmF2YSBsYW5ndWFnZSwgYW5kIHRoZSBKTFMzIEFQSSBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlCiAgICAgICogcHJvZ3JhbXMgd3JpdHRlbiBpbiBhbGwgdmVyc2lvbnMgb2YgdGhlIEphdmEgbGFuZ3VhZ2UKLSAgICAgKiB1cCB0byBhbmQgaW5jbHVkaW5nIEoyU0UgNSAoYWthIEpESyAxLjUpLiAKKyAgICAgKiB1cCB0byBhbmQgaW5jbHVkaW5nIEoyU0UgNSAoYWthIEpESyAxLjUpLgogICAgICAqCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpMUzMgPSAzOwotCQotCS8qKgotCSAqIFRoZSBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVC4gSW5pdGlhbGx5IGEgYmluZGluZyByZXNvbHZlciB0aGF0Ci0JICogZG9lcyBub3QgcmVzb2x2ZSBuYW1lcyBhdCBhbGwuCi0JICovCi0JcHJpdmF0ZSBCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgQmluZGluZ1Jlc29sdmVyKCk7Ci0JCi0JLyoqCi0JICogVGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNULiAKLQkgKiBJbml0aWFsbHkgYW4gZXZlbnQgaGFuZGxlciB0aGF0IGRvZXMgbm90IG5vdGhpbmcuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgTm9kZUV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIgPSBuZXcgTm9kZUV2ZW50SGFuZGxlcigpOwotCQotCS8qKgotCSAqIExldmVsIG9mIEFTVCBBUEkgc3VwcG9ydGVkIGJ5IHRoaXMgQVNULgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlpbnQgYXBpTGV2ZWw7Ci0JCi0JLyoqCi0JICogSW50ZXJuYWwgbW9kaWZpY2F0aW9uIGNvdW50OyBpbml0aWFsbHkgMDsgaW5jcmVhc2VzIG1vbm90b25pY2FsbHkKLQkgKiA8Yj5ieSBvbmUgb3IgbW9yZTwvYj4gYXMgdGhlIEFTVCBpcyBzdWNjZXNzaXZlbHkgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBsb25nIG1vZGlmaWNhdGlvbkNvdW50ID0gMDsKLQkKLQkvKioKLQkgKiBJbnRlcm5hbCBvcmlnaW5hbCBtb2RpZmljYXRpb24gY291bnQ7IHZhbHVlIGlzIGVxdWFscyB0byA8Y29kZT4KLQkgKiBtb2RpZmljYXRpb25Db3VudDwvY29kZT4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2UgKDxjb2RlPkFTVFBhcnNlcgotCSAqIDwvY29kZT4pLiBJZiB0aGlzIGFzdCBpcyBub3QgY3JlYXRlZCB3aXRoIGEgcGFyc2VyIHRoZW4gdmFsdWUgaXMgMC4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBsb25nIG9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQgPSAwOwogCiAJLyoqCi0JICogV2hlbiBkaXNhYmxlRXZlbnRzID4gMCwgZXZlbnRzIGFyZSBub3QgcmVwb3J0ZWQgYW5kCi0JICogdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBzdGF5cyBmaXhlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIGluIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgYSBub2RlCi0JICogdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyByZXBvcnRlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbgotCSAqIG9mIHRoZSBub2RlIGFzIHdlbGwgYXMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWlzc2luZyBjaGlsZC4KLQkgKiA8L3A+Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgaW50IGRpc2FibGVFdmVudHMgPSAwOwotCi0JLyoqCi0JICogSW50ZXJuYWwgb2JqZWN0IHVuaXF1ZSB0byB0aGUgQVNUIGluc3RhbmNlLiBSZWFkZXJzIG11c3Qgc3luY2hyb25pemUgb24KLQkgKiB0aGlzIG9iamVjdCB3aGVuIHRoZSBtb2RpZnlpbmcgaW5zdGFuY2UgZmllbGRzLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBpbnRlcm5hbEFTVExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBKYXZhIFNjYW5uZXIgdXNlZCB0byB2YWxpZGF0ZSBwcmVjb25kaXRpb25zIGZvciB0aGUgY3JlYXRpb24gb2Ygc3BlY2lmaWMgbm9kZXMKLQkgKiBsaWtlIENoYXJhY3RlckxpdGVyYWwsIE51bWJlckxpdGVyYWwsIFN0cmluZ0xpdGVyYWwgb3IgU2ltcGxlTmFtZS4KLQkgKi8KLQlTY2FubmVyIHNjYW5uZXI7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBhc3QgcmV3cml0ZXIgdXNlZCB0byByZWNvcmQgYXN0IG1vZGlmaWNhdGlvbiB3aGVuIHJlY29yZCBtb2RlIGlzIGVuYWJsZWQuCi0JICovCi0JSW50ZXJuYWxBU1RSZXdyaXRlIHJld3JpdGVyOwotCi0JLyoqCi0JICogRGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5mbGFnPGNvZGU+IHdoZW4gYSBuZXcgbm9kZSBpcyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgaW50IGRlZmF1bHROb2RlRmxhZyA9IDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEphdmEgYWJzdHJhY3Qgc3ludGF4IHRyZWUKLSAgICAgKiAoQVNUKSBmb2xsb3dpbmcgdGhlIHNwZWNpZmllZCBzZXQgb2YgQVBJIHJ1bGVzLgotICAgICAqCi0gCSAqIEBwYXJhbSBsZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIExFVkVMIGNvbnN0YW50cwotICAgICAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcml2YXRlIEFTVChpbnQgbGV2ZWwpIHsKLQkJaWYgKChsZXZlbCAhPSBBU1QuSkxTMikKLQkJCSYmIChsZXZlbCAhPSBBU1QuSkxTMykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmFwaUxldmVsID0gbGV2ZWw7Ci0JCS8vIGluaXRpYWxpemUgYSBzY2FubmVyCi0JCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAotCQkJCXRydWUgLypjb21tZW50Ki8sCi0JCQkJdHJ1ZSAvKndoaXRlc3BhY2UqLywKLQkJCQlmYWxzZSAvKm5scyovLAotCQkJCUNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMgLypzb3VyY2VMZXZlbCovLAotCQkJCUNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUgLypjb21wbGlhbmNlTGV2ZWwqLywKLQkJCQludWxsLyp0YXNrVGFnKi8sCi0JCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKLQkJCQl0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSBhYnN0cmFjdCBzeW50YXggdHJlZSB1c2luZyBkZWZhdWx0IG9wdGlvbnMuCisJICogQ29uc3RhbnQgZm9yIGluZGljYXRpbmcgdGhlIEFTVCBBUEkgdGhhdCBoYW5kbGVzIEpMUzQuCisJICogVGhpcyBBUEkgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBhbGwgY29uc3RydWN0cyBpbiB0aGUKKwkgKiBKYXZhIGxhbmd1YWdlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSmF2YSBMYW5ndWFnZQorCSAqIFNwZWNpZmljYXRpb24sIFRoaXJkIEVkaXRpb24gKEpMUzMpIHBsdXMgYWxsIHRoZSBuZXcgbGFuZ3VhZ2UKKwkgKiBmZWF0dXJlcyBkZXNjcmliZWQgaW4gdGhlIEpTUjMzNC4KKwkgKiBKTFM0IGlzIGEgc3VwZXJzZXQgb2YgYWxsIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlCisJICogSmF2YSBsYW5ndWFnZSwgYW5kIHRoZSBKTFM0IEFQSSBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlCisJICogcHJvZ3JhbXMgd3JpdHRlbiBpbiBhbGwgdmVyc2lvbnMgb2YgdGhlIEphdmEgbGFuZ3VhZ2UKKwkgKiB1cCB0byBhbmQgaW5jbHVkaW5nIEoyU0UgNyAoYWthIEpESyAxLjcpLgogCSAqCi0JICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCi0JICogQGRlcHJlY2F0ZWQgQ2xpZW50cyBzaG91bGQgcG9ydCB0aGVpciBjb2RlIHRvIHVzZSB0aGUgbmV3IEpMUzMgQVNUIEFQSSBhbmQgY2FsbAotCSAqICAgIHtAbGluayAjbmV3QVNUKGludCkgQVNULm5ld0FTVChBU1QuSkxTMyl9IGluc3RlYWQgb2YgdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvci4KKwkgKiBAc2luY2UgMy43LjEKIAkgKi8KLQlwdWJsaWMgQVNUKCkgewotCQl0aGlzKEphdmFDb3JlLmdldERlZmF1bHRPcHRpb25zKCkpOwotCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKTFM0ID0gNDsKKworCS8qCisJICogTXVzdCBub3QgY29sbGlkZSB3aXRoIGEgdmFsdWUgZm9yIElDb21waWxhdGlvblVuaXQgY29uc3RhbnRzCisJICovCisJc3RhdGljIGZpbmFsIGludCBSRVNPTFZFRF9CSU5ESU5HUyA9IDB4ODAwMDAwMDA7CiAKIAkvKioKIAkgKiBJbnRlcm5hbCBtZXRob2QuCkBAIC0yNDUsMTUgKzE2OCw0NiBAQAogCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyBvZiB0aGUgSmF2YSBjb21waWxhdGlvbiB1bml0CiAJICogQHBhcmFtIG9wdGlvbnMgY29tcGlsZXIgb3B0aW9ucwogCSAqIEBwYXJhbSB3b3JraW5nQ29weSB0aGUgd29ya2luZyBjb3B5IHRoYXQgdGhlIEFTVCBpcyBjcmVhdGVkIGZyb20KLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyBhbmQgcmVxdWVzdCBjYW5jZWxhdGlvbiwKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyBhbmQgcmVxdWVzdCBjYW5jZWxsYXRpb24sCiAJICogICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAcGFyYW0gaXNSZXNvbHZlZCB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uIGlzIHJlc29sdmVkCiAJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlCisJICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QuY29udmVydENvbXBpbGF0aW9uVW5pdChpbnQsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCBNYXAsIGJvb2xlYW4sIENvbXBpbGF0aW9uVW5pdCwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKSBpbnN0ZWFkCisJICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgY29udmVydENvbXBpbGF0aW9uVW5pdCgKKwkJCWludCBsZXZlbCwKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sCisJCQljaGFyW10gc291cmNlLAorCQkJTWFwIG9wdGlvbnMsCisJCQlib29sZWFuIGlzUmVzb2x2ZWQsCisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQgd29ya2luZ0NvcHksCisJCQlpbnQgcmVjb25jaWxlRmxhZ3MsCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogSW50ZXJuYWwgbWV0aG9kLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBnaXZlbiBpbnRlcm5hbCBjb21waWxlciBBU1QgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nCisJICogaW50byBhIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKyAJICogQHBhcmFtIGxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUgTEVWRUwgY29uc3RhbnRzCisJICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGFuIGludGVybmFsIEFTVCBub2RlIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24KKwkgKiBAcGFyYW0gb3B0aW9ucyBjb21waWxlciBvcHRpb25zCisJICogQHBhcmFtIHdvcmtpbmdDb3B5IHRoZSB3b3JraW5nIGNvcHkgdGhhdCB0aGUgQVNUIGlzIGNyZWF0ZWQgZnJvbQorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCByZXF1ZXN0IGNhbmNlbGxhdGlvbiwKKwkgKiAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBwYXJhbSBpc1Jlc29sdmVkIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24gaXMgcmVzb2x2ZWQKKwkgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IG5vZGUKKwkgKiBAc2luY2UgMy40CisJICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCiAJICovCiAJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgY29udmVydENvbXBpbGF0aW9uVW5pdCgKIAkJaW50IGxldmVsLAogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLAotCQljaGFyW10gc291cmNlLAogCQlNYXAgb3B0aW9ucywKIAkJYm9vbGVhbiBpc1Jlc29sdmVkLAogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQgd29ya2luZ0NvcHksCkBAIC0yNjYsNyArMjIwLDggQEAKIAkJYXN0LnNldERlZmF1bHROb2RlRmxhZyhBU1ROb2RlLk9SSUdJTkFMKTsKIAkJQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKIAkJaWYgKGlzUmVzb2x2ZWQpIHsKLQkJCXJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uc2NvcGUsIHdvcmtpbmdDb3B5Lm93bmVyLCBuZXcgRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5CaW5kaW5nVGFibGVzKCksIGZhbHNlKTsKKwkJCXJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uc2NvcGUsIHdvcmtpbmdDb3B5Lm93bmVyLCBuZXcgRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5CaW5kaW5nVGFibGVzKCksIGZhbHNlLCB0cnVlKTsKKwkJCSgoRGVmYXVsdEJpbmRpbmdSZXNvbHZlcikgcmVzb2x2ZXIpLmlzUmVjb3ZlcmluZ0JpbmRpbmdzID0gKHJlY29uY2lsZUZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDA7CiAJCQlhc3Quc2V0RmxhZyhBU1QuUkVTT0xWRURfQklORElOR1MpOwogCQl9IGVsc2UgewogCQkJcmVzb2x2ZXIgPSBuZXcgQmluZGluZ1Jlc29sdmVyKCk7CkBAIC0yNzUsNzAgKzIzMCwxOSBAQAogCQlhc3Quc2V0QmluZGluZ1Jlc29sdmVyKHJlc29sdmVyKTsKIAkJY29udmVydGVyLnNldEFTVChhc3QpOwogCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gY29udmVydGVyLmNvbnZlcnQoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIHNvdXJjZSk7CisJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gY29udmVydGVyLmNvbnZlcnQoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIHdvcmtpbmdDb3B5LmdldENvbnRlbnRzKCkpOwogCQl1bml0LnNldExpbmVFbmRUYWJsZShjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21waWxhdGlvblJlc3VsdC5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCkpOwotCQl1bml0LnNldFR5cGVSb290KHdvcmtpbmdDb3B5KTsKKwkJdW5pdC5zZXRUeXBlUm9vdCh3b3JraW5nQ29weS5vcmlnaW5hbEZyb21DbG9uZSgpKTsKIAkJYXN0LnNldERlZmF1bHROb2RlRmxhZyhzYXZlZERlZmF1bHROb2RlRmxhZyk7CiAJCXJldHVybiB1bml0OwogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGFic3RyYWN0IHN5bnRheCB0cmVlIHVzaW5nIHRoZSBnaXZlbiBvcHRpb25zLgotCSAqIDxwPgotCSAqIEZvbGxvd2luZyBvcHRpb24ga2V5cyBhcmUgc2lnbmlmaWNhbnQ6Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIjwvY29kZT4gLQotCSAqICAgIGluZGljYXRlcyBzb3VyY2UgY29tcGF0aWJpbGl0eSBtb2RlIChhcyBwZXIgPGNvZGU+SmF2YUNvcmU8L2NvZGU+KTsKLQkgKiAgICA8Y29kZT4iMS4zIjwvY29kZT4gbWVhbnMgdGhlIHNvdXJjZSBjb2RlIGlzIGFzIHBlciBKREsgMS4zOwotCSAqICAgIDxjb2RlPiIxLjQiPC9jb2RlPiBtZWFucyB0aGUgc291cmNlIGNvZGUgaXMgYXMgcGVyIEpESyAxLjQKLQkgKiAgICAoPGNvZGU+ImFzc2VydCI8L2NvZGU+IGlzIG5vdyBhIGtleXdvcmQpOwotCSAqICAgIDxjb2RlPiIxLjUiPC9jb2RlPiBtZWFucyB0aGUgc291cmNlIGNvZGUgaXMgYXMgcGVyIEpESyAxLjUKLQkgKiAgICAoPGNvZGU+ImVudW0iPC9jb2RlPiBpcyBub3cgYSBrZXl3b3JkKTsKLQkgKiAgICBhZGRpdGlvbmFsIGxlZ2FsIHZhbHVlcyBtYXkgYmUgYWRkZWQgbGF0ZXIuIDwvbGk+Ci0JICogPC91bD4KLQkgKiBPcHRpb25zIG90aGVyIHRoYW4gdGhlIGFib3ZlIGFyZSBpZ25vcmVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBvcHRpb25zIHRoZSB0YWJsZSBvZiBvcHRpb25zIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsKLQkgKiAgICB2YWx1ZSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+KQotCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBkZXByZWNhdGVkIENsaWVudHMgc2hvdWxkIHBvcnQgdGhlaXIgY29kZSB0byB1c2UgdGhlIG5ldyBKTFMzIEFTVCBBUEkgYW5kIGNhbGwKLQkgKiAgICB7QGxpbmsgI25ld0FTVChpbnQpIEFTVC5uZXdBU1QoQVNULkpMUzMpfSBpbnN0ZWFkIG9mIHVzaW5nIHRoaXMgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFTVChNYXAgb3B0aW9ucykgewotCQl0aGlzKEpMUzIpOwotCQlPYmplY3Qgc291cmNlTGV2ZWxPcHRpb24gPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpOwotCQlsb25nIHNvdXJjZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMzsKLQkJaWYgKEphdmFDb3JlLlZFUlNJT05fMV80LmVxdWFscyhzb3VyY2VMZXZlbE9wdGlvbikpIHsKLQkJCXNvdXJjZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKLQkJfSBlbHNlIGlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNS5lcXVhbHMoc291cmNlTGV2ZWxPcHRpb24pKSB7Ci0JCQlzb3VyY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7Ci0JCX0KLQkJT2JqZWN0IGNvbXBsaWFuY2VMZXZlbE9wdGlvbiA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOwotCQlsb25nIGNvbXBsaWFuY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzM7Ci0JCWlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNC5lcXVhbHMoY29tcGxpYW5jZUxldmVsT3B0aW9uKSkgewotCQkJY29tcGxpYW5jZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKLQkJfSBlbHNlIGlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNS5lcXVhbHMoY29tcGxpYW5jZUxldmVsT3B0aW9uKSkgewotCQkJY29tcGxpYW5jZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKLQkJfQotCQkvLyBvdmVycmlkZSBzY2FubmVyIGlmIDEuNCBvciAxLjUgYXNrZWQgZm9yCi0JCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAotCQkJdHJ1ZSAvKmNvbW1lbnQqLywKLQkJCXRydWUgLyp3aGl0ZXNwYWNlKi8sCi0JCQlmYWxzZSAvKm5scyovLAotCQkJc291cmNlTGV2ZWwgLypzb3VyY2VMZXZlbCovLAotCQkJY29tcGxpYW5jZUxldmVsIC8qY29tcGxpYW5jZUxldmVsKi8sCi0JCQludWxsLyp0YXNrVGFnKi8sCi0JCQludWxsLyp0YXNrUHJpb3JpdGllcyovLAotCQkJdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7Ci0JfQotCi0JLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBKYXZhIGFic3RyYWN0IHN5bnRheCB0cmVlCiAgICAgICogKEFTVCkgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgc2V0IG9mIEFQSSBydWxlcy4KICAgICAgKiA8cD4KLSAgICAgKiBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgc3BlY2lmaW5nIHtAbGluayAjSkxTM30gYXMgdGhlCi0gICAgICogQVNUIGxldmVsIGluIGFsbCBjYXNlcywgZXZlbiB3aGVuIGRlYWxpbmcgd2l0aCBKREsgMS4zIG9yIDEuNC4uCisgICAgICogQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHNwZWNpZnlpbmcge0BsaW5rICNKTFM0fSBhcyB0aGUKKyAgICAgKiBBU1QgbGV2ZWwgaW4gYWxsIGNhc2VzLCBldmVuIHdoZW4gZGVhbGluZyB3aXRoIHNvdXJjZSBvZiBlYXJsaWVyIEpESyB2ZXJzaW9ucyBsaWtlIDEuMyBvciAxLjQuCiAgICAgICogPC9wPgogICAgICAqCiAgCSAqIEBwYXJhbSBsZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIExFVkVMIGNvbnN0YW50cwpAQCAtMzUwLDQwNSArMjU0LDE3IEBACiAgICAgICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgQVNUIG5ld0FTVChpbnQgbGV2ZWwpIHsKLQkJaWYgKChsZXZlbCAhPSBBU1QuSkxTMikKLQkJCSYmIChsZXZlbCAhPSBBU1QuSkxTMykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQogCQlyZXR1cm4gbmV3IEFTVChsZXZlbCk7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IGZvciB0aGlzIEFTVC4gVGhlIG1vZGlmaWNhdGlvbiBjb3VudAotCSAqIGlzIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIHRoYXQgaW5jcmVhc2VzIChieSAxIG9yIHBlcmhhcHMgYnkgbW9yZSkgYXMKLQkgKiB0aGlzIEFTVCBvciBpdHMgbm9kZXMgYXJlIGNoYW5nZWQuIFRoZSBpbml0aWFsIHZhbHVlIGlzIHVuc3BlY2lmaWVkLgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGNvdW50IGFzIG1vZGlmeWluZyBhbiBBU1Q6Ci0JICogPHVsPgotCSAqIDxsaT5jcmVhdGluZyBhIG5ldyBub2RlIG93bmVkIGJ5IHRoaXMgQVNULDwvbGk+Ci0JICogPGxpPmFkZGluZyBhIGNoaWxkIHRvIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgotCSAqIDxsaT5yZW1vdmluZyBhIGNoaWxkIGZyb20gYSBub2RlIG93bmVkIGJ5IHRoaXMgQVNULDwvbGk+Ci0JICogPGxpPnNldHRpbmcgYSBub24tbm9kZSBhdHRyaWJ1dGUgb2YgYSBub2RlIG93bmVkIGJ5IHRoaXMgQVNULjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogT3BlcmF0aW9ucyB3aGljaCBkbyBub3QgZW50YWlsIGNyZWF0aW5nIG9yIG1vZGlmeWluZyBleGlzdGluZyBub2RlcwotCSAqIGRvIG5vdCBpbmNyZWFzZSB0aGUgbW9kaWZpY2F0aW9uIGNvdW50LgotCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGluIHRoZSBjb3Vyc2UKLQkgKiBvZiBhIHNpbmdsZSBjbGllbnQgb3BlcmF0aW9uLiBUaGUgb25seSBwcm9taXNlIGlzIHRoYXQgdGhlIG1vZGlmaWNhdGlvbgotCSAqIGNvdW50IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5IGFzIHRoZSBBU1Qgb3IgaXRzIG5vZGVzIGNoYW5nZTsgdGhlcmUgaXMKLQkgKiBubyBwcm9taXNlIHRoYXQgYSBtb2RpZnlpbmcgb3BlcmF0aW9uIGluY3JlYXNlcyB0aGUgY291bnQgYnkgZXhhY3RseSAxLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgKG5vbi1uZWdhdGl2ZSkgb2YgdGhlIG1vZGlmaWNhdGlvbiBjb3VudGVyIG9mCi0JICogICAgdGhpcyBBU1QKLQkgKi8KLQlwdWJsaWMgbG9uZyBtb2RpZmljYXRpb25Db3VudCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpY2F0aW9uQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBUEkgbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgQVNULgotCSAqCi0JICogQHJldHVybiBsZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIDxjb2RlPkpMUyo8L2NvZGU+TEVWRUwKLSAgICAgKiBkZWNsYXJlZCBvbiA8Y29kZT5BU1Q8L2NvZGU+OyBhc3N1bWUgdGhpcyBzZXQgaXMgb3Blbi1lbmRlZAotICAgICAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgaW50IGFwaUxldmVsKCkgewotCQlyZXR1cm4gdGhpcy5hcGlMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIEFTVCBpcyBhYm91dCB0byBiZSBtb2RpZmllZC4KLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIHRoaW5ncyBjb3VudCBhcyBtb2RpZnlpbmcgYW4gQVNUOgotCSAqIDx1bD4KLQkgKiA8bGk+Y3JlYXRpbmcgYSBuZXcgbm9kZSBvd25lZCBieSB0aGlzIEFTVDwvbGk+Ci0JICogPGxpPmFkZGluZyBhIGNoaWxkIHRvIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVDwvbGk+Ci0JICogPGxpPnJlbW92aW5nIGEgY2hpbGQgZnJvbSBhIG5vZGUgb3duZWQgYnkgdGhpcyBBU1Q8L2xpPgotCSAqIDxsaT5zZXR0aW5nIGEgbm9uLW5vZGUgYXR0cmlidXRlIG9mIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVDwvbGk+LgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGluIHRoZSBjb3Vyc2UKLQkgKiBvZiBhIHNpbmdsZSBjbGllbnQgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIG1vZGlmeWluZygpIHsKLQkJLy8gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGxhenkgaW5pdCwgZXZlbnRzIGFyZSBkaXNhYmxlZAotCQkvLyBhbmQgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCB3aWxsIG5vdCBiZSBpbmNyZWFzZWQKLQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBpbmNyZWFzZSB0aGUgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCXRoaXMubW9kaWZpY2F0aW9uQ291bnQrKzsKLQl9Ci0KLQkvKioKLSAgICAgKiBEaXNhYmxlIGV2ZW50cy4KLQkgKiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQtc2FmZSBmb3IgQVNUIHJlYWRlcnMuCi0JICoKLQkgKiBAc2VlICNyZWVuYWJsZUV2ZW50cygpCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotCWZpbmFsIHZvaWQgZGlzYWJsZUV2ZW50cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgewotCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhbm90aGVyIHJlYWRlcgotCQkJdGhpcy5kaXNhYmxlRXZlbnRzKys7Ci0JCX0KLQkJLy8gd2hpbGUgZGlzYWJsZUV2ZW50cyA+IDAgbm8gZXZlbnRzIHdpbGwgYmUgcmVwb3J0ZWQsIGFuZCBtb2QgY291bnQgd2lsbCBzdGF5IGZpeGVkCi0JfQotCi0JLyoqCi0gICAgICogUmVlbmFibGUgZXZlbnRzLgotCSAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlIGZvciBBU1QgcmVhZGVycy4KLQkgKgotCSAqIEBzZWUgI2Rpc2FibGVFdmVudHMoKQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQlmaW5hbCB2b2lkIHJlZW5hYmxlRXZlbnRzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGFub3RoZXIgcmVhZGVyCi0JCQl0aGlzLmRpc2FibGVFdmVudHMtLTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBpcyBhYm91dCB0byBsb3NlIGEgY2hpbGQuCi0JICoKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBhYm91dCB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSBhYm91dCB0byBiZSByZW1vdmVkCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwcmVSZW1vdmVDaGlsZEV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjaGlsZCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewotCQkvLyBJTVBPUlRBTlQ6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZWFkZXJzIGR1cmluZyBsYXp5IGluaXQKLQkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgewotCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKLQkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7Ci0JCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBERUxdIik7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNhYmxlRXZlbnRzKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuZXZlbnRIYW5kbGVyLnByZVJlbW92ZUNoaWxkRXZlbnQobm9kZSwgY2hpbGQsIHByb3BlcnR5KTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQgeWV0Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGpzdXQgbG9zdCBhIGNoaWxkLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgbW9kaWZpZWQKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIG5vZGUgdGhhdCB3YXMgcmVtb3ZlZAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgY2hpbGQgb3IgY2hpbGQgbGlzdCBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXZvaWQgcG9zdFJlbW92ZUNoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7Ci0JCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAotCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIERFTF0iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWRpc2FibGVFdmVudHMoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIucG9zdFJlbW92ZUNoaWxkRXZlbnQobm9kZSwgY2hpbGQsIHByb3BlcnR5KTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQgeWV0Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIGFib3V0IGhhdmUgYSBjaGlsZCByZXBsYWNlZC4KLQkgKgotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGFib3V0IHRvIGJlIG1vZGlmaWVkCi0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBub2RlIGFib3V0IHRvIGJlIHJlbW92ZWQKLQkgKiBAcGFyYW0gbmV3Q2hpbGQgdGhlIHJlcGxhY2VtZW50IGNoaWxkCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwcmVSZXBsYWNlQ2hpbGRFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2hpbGQsIEFTVE5vZGUgbmV3Q2hpbGQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKLQkJLy8gSU1QT1JUQU5UOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgcmVhZGVycyBkdXJpbmcgbGF6eSBpbml0Ci0JCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKLQkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYSByZWFkZXIgZG9pbmcgbGF6eSBpbml0Ci0JCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgewotCQkJCS8vIGRvaW5nIGxhenkgaW5pdCBPUiBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZXZlbnQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIltCT1VOQ0UgUkVQXSIpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzYWJsZUV2ZW50cygpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5wcmVSZXBsYWNlQ2hpbGRFdmVudChub2RlLCBjaGlsZCwgbmV3Q2hpbGQsIHByb3BlcnR5KTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQgeWV0Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGhhcyBqdXN0IGhhZCBhIGNoaWxkIHJlcGxhY2VkLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgbW9kaWZpZWQKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIHJlbW92ZWQKLQkgKiBAcGFyYW0gbmV3Q2hpbGQgdGhlIHJlcGxhY2VtZW50IGNoaWxkCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwb3N0UmVwbGFjZUNoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBBU1ROb2RlIG5ld0NoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7Ci0JCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAotCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIFJFUF0iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWRpc2FibGVFdmVudHMoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIucG9zdFJlcGxhY2VDaGlsZEV2ZW50KG5vZGUsIGNoaWxkLCBuZXdDaGlsZCwgcHJvcGVydHkpOwotCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90Ci0JCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgbm90IGJlZW4gY2hhbmdlZCB5ZXQKLQkJfSBmaW5hbGx5IHsKLQkJCXJlZW5hYmxlRXZlbnRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gZ2FpbiBhIGNoaWxkLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSB0aGF0IHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQKLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIGNoaWxkIG9yIGNoaWxkIGxpc3QgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQl2b2lkIHByZUFkZENoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7Ci0JCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAotCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIEFERF0iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWRpc2FibGVFdmVudHMoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIucHJlQWRkQ2hpbGRFdmVudChub2RlLCBjaGlsZCwgcHJvcGVydHkpOwotCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90Ci0JCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQKLQkJfSBmaW5hbGx5IHsKLQkJCXJlZW5hYmxlRXZlbnRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaGFzIGp1c3QgZ2FpbmVkIGEgY2hpbGQuCi0JICoKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBtb2RpZmllZAotCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZCBhcyBhIGNoaWxkCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwb3N0QWRkQ2hpbGRFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2hpbGQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKLQkJLy8gSU1QT1JUQU5UOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgcmVhZGVycyBkdXJpbmcgbGF6eSBpbml0Ci0JCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKLQkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYSByZWFkZXIgZG9pbmcgbGF6eSBpbml0Ci0JCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgewotCQkJCS8vIGRvaW5nIGxhenkgaW5pdCBPUiBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZXZlbnQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIltCT1VOQ0UgQUREXSIpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzYWJsZUV2ZW50cygpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5wb3N0QWRkQ2hpbGRFdmVudChub2RlLCBjaGlsZCwgcHJvcGVydHkpOwotCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90Ci0JCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQKLQkJfSBmaW5hbGx5IHsKLQkJCXJlZW5hYmxlRXZlbnRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhCi0JICogbm9uLWNoaWxkIHByb3BlcnR5LgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYmUgbW9kaWZpZWQKLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwcmVWYWx1ZUNoYW5nZUV2ZW50KEFTVE5vZGUgbm9kZSwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7Ci0JCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAotCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIENIQU5HRV0iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWRpc2FibGVFdmVudHMoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIucHJlVmFsdWVDaGFuZ2VFdmVudChub2RlLCBwcm9wZXJ0eSk7Ci0JCQkvLyBOLkIuIGV2ZW4gaWYgZXZlbnQgaGFuZGxlciBibG93cyB1cCwgdGhlIEFTVCBpcyBub3QKLQkJCS8vIGNvcnJ1cHRlZCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZAotCQl9IGZpbmFsbHkgewotCQkJcmVlbmFibGVFdmVudHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBoYXMganVzdCBjaGFuZ2VkIHRoZSB2YWx1ZSBvZiBhCi0JICogbm9uLWNoaWxkIHByb3BlcnR5LgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgbW9kaWZpZWQKLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBwb3N0VmFsdWVDaGFuZ2VFdmVudChBU1ROb2RlIG5vZGUsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewotCQkvLyBJTVBPUlRBTlQ6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZWFkZXJzIGR1cmluZyBsYXp5IGluaXQKLQkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgewotCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKLQkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7Ci0JCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBDSEFOR0VdIik7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNhYmxlRXZlbnRzKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuZXZlbnRIYW5kbGVyLnBvc3RWYWx1ZUNoYW5nZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIGFib3V0IHRvIGJlIGNsb25lZC4KLQkgKgotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGJlIGNsb25lZAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQl2b2lkIHByZUNsb25lTm9kZUV2ZW50KEFTVE5vZGUgbm9kZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7Ci0JCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAotCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKLQkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIENMT05FXSIpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzYWJsZUV2ZW50cygpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5wcmVDbG9uZU5vZGVFdmVudChub2RlKTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGhhcyBqdXN0IGJlZW4gY2xvbmVkLgotCSAqCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgY2xvbmVkCi0JICogQHBhcmFtIGNsb25lIHRoZSBjbG9uZSBvZiA8Y29kZT5ub2RlPC9jb2RlPgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQl2b2lkIHBvc3RDbG9uZU5vZGVFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2xvbmUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgewotCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKLQkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7Ci0JCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBDTE9ORV0iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWRpc2FibGVFdmVudHMoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIucG9zdENsb25lTm9kZUV2ZW50KG5vZGUsIGNsb25lKTsKLQkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAotCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkCi0JCX0gZmluYWxseSB7Ci0JCQlyZWVuYWJsZUV2ZW50cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBzb3VyY2Ugc3RyaW5nIG9mIHRoZSBnaXZlbiBKYXZhIG1vZGVsIGNvbXBpbGF0aW9uIHVuaXQgZWxlbWVudAotCSAqIGFuZCBjcmVhdGVzIGFuZCByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhYnN0cmFjdCBzeW50YXggdHJlZS4gVGhlIHNvdXJjZQotCSAqIHN0cmluZyBpcyBvYnRhaW5lZCBmcm9tIHRoZSBKYXZhIG1vZGVsIGVsZW1lbnQgdXNpbmcKLQkgKiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0LmdldFNvdXJjZSgpPC9jb2RlPi4KKwkgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmluZyBhcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBhbmQgY3JlYXRlcyBhbmQKKwkgKiByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhYnN0cmFjdCBzeW50YXggdHJlZS4KIAkgKiA8cD4KIAkgKiBUaGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIGlzIHRoZSByb290IG5vZGUgb2YgYSBuZXcgQVNULgogCSAqIEVhY2ggbm9kZSBpbiB0aGUgc3VidHJlZSBjYXJyaWVzIHNvdXJjZSByYW5nZShzKSBpbmZvcm1hdGlvbiByZWxhdGluZyBiYWNrCi0JICogdG8gcG9zaXRpb25zIGluIHRoZSBzb3VyY2Ugc3RyaW5nICh0aGUgc291cmNlIHN0cmluZyBpcyBub3QgcmVtZW1iZXJlZAotCSAqIHdpdGggdGhlIEFTVCkuCisJICogdG8gcG9zaXRpb25zIGluIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nICh0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBpdHNlbGYKKwkgKiBpcyBub3QgcmVtZW1iZXJlZCB3aXRoIHRoZSBBU1QpLgogCSAqIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBiZWdpbnMgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgdG9rZW4KIAkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlOyBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSA8Yj5ub3Q8L2I+CiAJICogaW5jbHVkZWQuIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBleHRlbmRzIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyIG9mCkBAIC03NjMsMzMgKzI3OSwxMiBAQAogCSAqIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCiAJICogPC9wPgogCSAqIDxwPgotCSAqIElmIDxjb2RlPnJlc29sdmVCaW5kaW5nczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YXJpb3VzIG5hbWVzCi0JICogYW5kIHR5cGVzIGFwcGVhcmluZyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgcmVzb2x2ZWQgdG8gImJpbmRpbmdzIgotCSAqIGJ5IGNhbGxpbmcgdGhlIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzLiBUaGVzZSBiaW5kaW5ncwotCSAqIGRyYXcgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IHBhcnRzIG9mIGEgcHJvZ3JhbSwgYW5kCi0JICogZ2VuZXJhbGx5IGFmZm9yZCBhIG1vcmUgcG93ZXJmdWwgdmFudGFnZSBwb2ludCBmb3IgY2xpZW50cyB3aG8gd2lzaCB0bwotCSAqIGFuYWx5emUgYSBwcm9ncmFtJ3Mgc3RydWN0dXJlIG1vcmUgZGVlcGx5LiBUaGVzZSBiaW5kaW5ncyBjb21lIGF0IGEKLQkgKiBjb25zaWRlcmFibGUgY29zdCBpbiBib3RoIHRpbWUgYW5kIHNwYWNlLCBob3dldmVyLCBhbmQgc2hvdWxkIG5vdCBiZQotCSAqIHJlcXVlc3RlZCBmcml2b2xvdXNseS4gVGhlIGFkZGl0aW9uYWwgc3BhY2UgaXMgbm90IHJlY2xhaW1lZCB1bnRpbCB0aGUKLQkgKiBBU1QsIGFsbCBpdHMgbm9kZXMsIGFuZCBhbGwgaXRzIGJpbmRpbmdzIGJlY29tZSBnYXJiYWdlLiBTbyBpdCBpcyB2ZXJ5Ci0JICogaW1wb3J0YW50IHRvIG5vdCByZXRhaW4gYW55IG9mIHRoZXNlIG9iamVjdHMgbG9uZ2VyIHRoYW4gYWJzb2x1dGVseQotCSAqIG5lY2Vzc2FyeS4gQmluZGluZ3MgYXJlIHJlc29sdmVkIGF0IHRoZSB0aW1lIHRoZSBBU1QgaXMgY3JlYXRlZC4gU3Vic2VxdWVudAotCSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEFTVCBkbyBub3QgYWZmZWN0IHRoZSBiaW5kaW5ncyByZXR1cm5lZCBieQotCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIGluIGFueSB3YXk7IHRoZXNlIG1ldGhvZHMgcmV0dXJuIHRoZQotCSAqIHNhbWUgYmluZGluZyBhcyBiZWZvcmUgdGhlIEFTVCB3YXMgbW9kaWZpZWQgKGluY2x1ZGluZyBtb2RpZmljYXRpb25zCi0JICogdGhhdCByZWFycmFuZ2Ugc3VidHJlZXMgYnkgcmVwYXJlbnRpbmcgbm9kZXMpLgotCSAqIElmIDxjb2RlPnJlc29sdmVCaW5kaW5nczwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgYW5hbHlzaXMKLQkgKiBkb2VzIG5vdCBnbyBiZXlvbmQgcGFyc2luZyBhbmQgYnVpbGRpbmcgdGhlIHRyZWUsIGFuZCBhbGwKLQkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSB0aGUKLQkgKiBvdXRzZXQuCisJICogVGhpcyBtZXRob2QgZG9lcyBub3QgY29tcHV0ZSBiaW5kaW5nIGluZm9ybWF0aW9uOyBhbGwgPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+CisJICogbWV0aG9kcyBhcHBsaWVkIHRvIG5vZGVzIG9mIHRoZSByZXN1bHRpbmcgQVNUIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcGFyYW0gdW5pdCB0aGUgSmF2YSBtb2RlbCBjb21waWxhdGlvbiB1bml0IHdob3NlIHNvdXJjZSBjb2RlIGlzIHRvIGJlIHBhcnNlZAotCSAqIEBwYXJhbSByZXNvbHZlQmluZGluZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIHdhbnRlZCwKLQkgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIG5vdCBvZiBpbnRlcmVzdAorCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBiZSBwYXJzZWQgYXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKIAkgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50IGRvZXMgbm90Ci0JICogZXhpc3Qgb3IgaWYgaXRzIHNvdXJjZSBzdHJpbmcgY2Fubm90IGJlIG9idGFpbmVkCiAJICogQHNlZSBBU1ROb2RlI2dldEZsYWdzKCkKIAkgKiBAc2VlIEFTVE5vZGUjTUFMRk9STUVECiAJICogQHNlZSBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKQpAQCAtNzk3LDk4ICsyOTIsMTQgQEAKIAkgKiBAc2luY2UgMi4wCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBU1RQYXJzZXJ9IGluc3RlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoCi0JCUlDb21waWxhdGlvblVuaXQgdW5pdCwKLQkJYm9vbGVhbiByZXNvbHZlQmluZGluZ3MpIHsKLQotCQl0cnkgewotCQkJQVNUUGFyc2VyIGMgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMyKTsKLQkJCWMuc2V0U291cmNlKHVuaXQpOwotCQkJYy5zZXRSZXNvbHZlQmluZGluZ3MocmVzb2x2ZUJpbmRpbmdzKTsKLQkJCUFTVE5vZGUgcmVzdWx0ID0gYy5jcmVhdGVBU1QobnVsbCk7Ci0JCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gY29udmVydCBBU1RQYXJzZXIncyBjb21wbGFpbnRzIGludG8gb2xkIGZvcm0KKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZUNvbXBpbGF0aW9uVW5pdChjaGFyW10gc291cmNlKSB7CisJCWlmIChzb3VyY2UgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEphdmEgY2xhc3MgZmlsZQotCSAqIGVsZW1lbnQgYW5kIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFic3RyYWN0IHN5bnRheCB0cmVlLgotCSAqIFRoZSBzb3VyY2Ugc3RyaW5nIGlzIG9idGFpbmVkIGZyb20gdGhlIEphdmEgbW9kZWwgZWxlbWVudCB1c2luZwotCSAqIDxjb2RlPklDbGFzc0ZpbGUuZ2V0U291cmNlKCk8L2NvZGU+LCBhbmQgaXMgb25seSBhdmFpbGFibGUgZm9yIGEgY2xhc3MKLQkgKiBmaWxlcyB3aXRoIGF0dGFjaGVkIHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIGlzIHRoZSByb290IG5vZGUgb2YgYSBuZXcgQVNULgotCSAqIEVhY2ggbm9kZSBpbiB0aGUgc3VidHJlZSBjYXJyaWVzIHNvdXJjZSByYW5nZShzKSBpbmZvcm1hdGlvbiByZWxhdGluZyBiYWNrCi0JICogdG8gcG9zaXRpb25zIGluIHRoZSBzb3VyY2Ugc3RyaW5nICh0aGUgc291cmNlIHN0cmluZyBpcyBub3QgcmVtZW1iZXJlZAotCSAqIHdpdGggdGhlIEFTVCkuCi0JICogVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGJlZ2lucyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCB0b2tlbgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGU7IGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgYXJlIDxiPm5vdDwvYj4KLQkgKiBpbmNsdWRlZC4gVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGV4dGVuZHMgdGhyb3VnaCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKLQkgKiB0aGUgbGFzdCB0b2tlbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlOyB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZAotCSAqIGNvbW1lbnRzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkLiBUaGVyZSBhcmUgYSBoYW5kZnVsIG9mIGV4Y2VwdGlvbnMKLQkgKiAoaW5jbHVkaW5nIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCB0aGUgdmFyaW91cyBib2R5IGRlY2xhcmF0aW9ucyk7IHRoZQotCSAqIHNwZWNpZmljYXRpb24gZm9yIHRoZXNlIG5vZGUgdHlwZSBzcGVsbHMgb3V0IHRoZSBkZXRhaWxzLgotCSAqIFNvdXJjZSByYW5nZXMgbmVzdCBwcm9wZXJseTogdGhlIHNvdXJjZSByYW5nZSBmb3IgYSBjaGlsZCBpcyBhbHdheXMKLQkgKiB3aXRoaW4gdGhlIHNvdXJjZSByYW5nZSBvZiBpdHMgcGFyZW50LCBhbmQgdGhlIHNvdXJjZSByYW5nZXMgb2Ygc2libGluZwotCSAqIG5vZGVzIG5ldmVyIG92ZXJsYXAuCi0JICogSWYgYSBzeW50YXggZXJyb3IgaXMgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZywgdGhlIHJlbGV2YW50IG5vZGUocykgb2YgdGhlCi0JICogdHJlZSB3aWxsIGJlIGZsYWdnZWQgYXMgPGNvZGU+TUFMRk9STUVEPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgPGNvZGU+cmVzb2x2ZUJpbmRpbmdzPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHZhcmlvdXMgbmFtZXMKLQkgKiBhbmQgdHlwZXMgYXBwZWFyaW5nIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSByZXNvbHZlZCB0byAiYmluZGluZ3MiCi0JICogYnkgY2FsbGluZyB0aGUgPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMuIFRoZXNlIGJpbmRpbmdzCi0JICogZHJhdyBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBhbmQKLQkgKiBnZW5lcmFsbHkgYWZmb3JkIGEgbW9yZSBwb3dlcmZ1bCB2YW50YWdlIHBvaW50IGZvciBjbGllbnRzIHdobyB3aXNoIHRvCi0JICogYW5hbHl6ZSBhIHByb2dyYW0ncyBzdHJ1Y3R1cmUgbW9yZSBkZWVwbHkuIFRoZXNlIGJpbmRpbmdzIGNvbWUgYXQgYQotCSAqIGNvbnNpZGVyYWJsZSBjb3N0IGluIGJvdGggdGltZSBhbmQgc3BhY2UsIGhvd2V2ZXIsIGFuZCBzaG91bGQgbm90IGJlCi0JICogcmVxdWVzdGVkIGZyaXZvbG91c2x5LiBUaGUgYWRkaXRpb25hbCBzcGFjZSBpcyBub3QgcmVjbGFpbWVkIHVudGlsIHRoZQotCSAqIEFTVCwgYWxsIGl0cyBub2RlcywgYW5kIGFsbCBpdHMgYmluZGluZ3MgYmVjb21lIGdhcmJhZ2UuIFNvIGl0IGlzIHZlcnkKLQkgKiBpbXBvcnRhbnQgdG8gbm90IHJldGFpbiBhbnkgb2YgdGhlc2Ugb2JqZWN0cyBsb25nZXIgdGhhbiBhYnNvbHV0ZWx5Ci0JICogbmVjZXNzYXJ5LiBCaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlIEFTVCBpcyBjcmVhdGVkLiBTdWJzZXF1ZW50Ci0JICogbW9kaWZpY2F0aW9ucyB0byB0aGUgQVNUIGRvIG5vdCBhZmZlY3QgdGhlIGJpbmRpbmdzIHJldHVybmVkIGJ5Ci0JICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgaW4gYW55IHdheTsgdGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlCi0JICogc2FtZSBiaW5kaW5nIGFzIGJlZm9yZSB0aGUgQVNUIHdhcyBtb2RpZmllZCAoaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMKLQkgKiB0aGF0IHJlYXJyYW5nZSBzdWJ0cmVlcyBieSByZXBhcmVudGluZyBub2RlcykuCi0JICogSWYgPGNvZGU+cmVzb2x2ZUJpbmRpbmdzPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBhbmFseXNpcwotCSAqIGRvZXMgbm90IGdvIGJleW9uZCBwYXJzaW5nIGFuZCBidWlsZGluZyB0aGUgdHJlZSwgYW5kIGFsbAotCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmcm9tIHRoZQotCSAqIG91dHNldC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gY2xhc3NGaWxlIHRoZSBKYXZhIG1vZGVsIGNsYXNzIGZpbGUgd2hvc2UgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBpcyB0byBiZSBwYXJzZWQKLQkgKiBAcGFyYW0gcmVzb2x2ZUJpbmRpbmdzIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJpbmRpbmdzIGFyZSB3YW50ZWQsCi0JICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGJpbmRpbmdzIGFyZSBub3Qgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50IGRvZXMgbm90Ci0JICogZXhpc3Qgb3IgaWYgaXRzIHNvdXJjZSBzdHJpbmcgY2Fubm90IGJlIG9idGFpbmVkCi0JICogQHNlZSBBU1ROb2RlI2dldEZsYWdzKCkKLQkgKiBAc2VlIEFTVE5vZGUjTUFMRk9STUVECi0JICogQHNlZSBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKQotCSAqIEBzZWUgQVNUTm9kZSNnZXRMZW5ndGgoKQotCSAqIEBzaW5jZSAyLjEKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEFTVFBhcnNlcn0gaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZUNvbXBpbGF0aW9uVW5pdCgKLQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUsCi0JCWJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzKSB7Ci0KLQkJaWYgKGNsYXNzRmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUFTVFBhcnNlciBjID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMik7Ci0JCQljLnNldFNvdXJjZShjbGFzc0ZpbGUpOwotCQkJYy5zZXRSZXNvbHZlQmluZGluZ3MocmVzb2x2ZUJpbmRpbmdzKTsKLQkJCUFTVE5vZGUgcmVzdWx0ID0gYy5jcmVhdGVBU1QobnVsbCk7Ci0JCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gY29udmVydCBBU1RQYXJzZXIncyBjb21wbGFpbnRzIGludG8gb2xkIGZvcm0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQorCQlBU1RQYXJzZXIgYyA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzIpOworCQljLnNldFNvdXJjZShzb3VyY2UpOworCQlBU1ROb2RlIHJlc3VsdCA9IGMuY3JlYXRlQVNUKG51bGwpOworCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwogCX0KIAogCS8qKgpAQCAtOTc2LDEzICszODcsMTYgQEAKIAl9CiAKIAkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmluZyBhcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBhbmQgY3JlYXRlcyBhbmQKLQkgKiByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhYnN0cmFjdCBzeW50YXggdHJlZS4KKwkgKiBQYXJzZXMgdGhlIHNvdXJjZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSBjbGFzcyBmaWxlCisJICogZWxlbWVudCBhbmQgY3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3Qgc3ludGF4IHRyZWUuCisJICogVGhlIHNvdXJjZSBzdHJpbmcgaXMgb2J0YWluZWQgZnJvbSB0aGUgSmF2YSBtb2RlbCBlbGVtZW50IHVzaW5nCisJICogPGNvZGU+SUNsYXNzRmlsZS5nZXRTb3VyY2UoKTwvY29kZT4sIGFuZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYSBjbGFzcworCSAqIGZpbGVzIHdpdGggYXR0YWNoZWQgc291cmNlLgogCSAqIDxwPgogCSAqIFRoZSByZXR1cm5lZCBjb21waWxhdGlvbiB1bml0IG5vZGUgaXMgdGhlIHJvb3Qgbm9kZSBvZiBhIG5ldyBBU1QuCiAJICogRWFjaCBub2RlIGluIHRoZSBzdWJ0cmVlIGNhcnJpZXMgc291cmNlIHJhbmdlKHMpIGluZm9ybWF0aW9uIHJlbGF0aW5nIGJhY2sKLQkgKiB0byBwb3NpdGlvbnMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgKHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGl0c2VsZgotCSAqIGlzIG5vdCByZW1lbWJlcmVkIHdpdGggdGhlIEFTVCkuCisJICogdG8gcG9zaXRpb25zIGluIHRoZSBzb3VyY2Ugc3RyaW5nICh0aGUgc291cmNlIHN0cmluZyBpcyBub3QgcmVtZW1iZXJlZAorCSAqIHdpdGggdGhlIEFTVCkuCiAJICogVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGJlZ2lucyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCB0b2tlbgogCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGU7IGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgYXJlIDxiPm5vdDwvYj4KIAkgKiBpbmNsdWRlZC4gVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGV4dGVuZHMgdGhyb3VnaCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKQEAgLTk5NywxMiArNDExLDExMCBAQAogCSAqIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNvbXB1dGUgYmluZGluZyBpbmZvcm1hdGlvbjsgYWxsIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPgotCSAqIG1ldGhvZHMgYXBwbGllZCB0byBub2RlcyBvZiB0aGUgcmVzdWx0aW5nIEFTVCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisJICogSWYgPGNvZGU+cmVzb2x2ZUJpbmRpbmdzPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHZhcmlvdXMgbmFtZXMKKwkgKiBhbmQgdHlwZXMgYXBwZWFyaW5nIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSByZXNvbHZlZCB0byAiYmluZGluZ3MiCisJICogYnkgY2FsbGluZyB0aGUgPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMuIFRoZXNlIGJpbmRpbmdzCisJICogZHJhdyBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBhbmQKKwkgKiBnZW5lcmFsbHkgYWZmb3JkIGEgbW9yZSBwb3dlcmZ1bCB2YW50YWdlIHBvaW50IGZvciBjbGllbnRzIHdobyB3aXNoIHRvCisJICogYW5hbHl6ZSBhIHByb2dyYW0ncyBzdHJ1Y3R1cmUgbW9yZSBkZWVwbHkuIFRoZXNlIGJpbmRpbmdzIGNvbWUgYXQgYQorCSAqIGNvbnNpZGVyYWJsZSBjb3N0IGluIGJvdGggdGltZSBhbmQgc3BhY2UsIGhvd2V2ZXIsIGFuZCBzaG91bGQgbm90IGJlCisJICogcmVxdWVzdGVkIGZyaXZvbG91c2x5LiBUaGUgYWRkaXRpb25hbCBzcGFjZSBpcyBub3QgcmVjbGFpbWVkIHVudGlsIHRoZQorCSAqIEFTVCwgYWxsIGl0cyBub2RlcywgYW5kIGFsbCBpdHMgYmluZGluZ3MgYmVjb21lIGdhcmJhZ2UuIFNvIGl0IGlzIHZlcnkKKwkgKiBpbXBvcnRhbnQgdG8gbm90IHJldGFpbiBhbnkgb2YgdGhlc2Ugb2JqZWN0cyBsb25nZXIgdGhhbiBhYnNvbHV0ZWx5CisJICogbmVjZXNzYXJ5LiBCaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlIEFTVCBpcyBjcmVhdGVkLiBTdWJzZXF1ZW50CisJICogbW9kaWZpY2F0aW9ucyB0byB0aGUgQVNUIGRvIG5vdCBhZmZlY3QgdGhlIGJpbmRpbmdzIHJldHVybmVkIGJ5CisJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgaW4gYW55IHdheTsgdGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlCisJICogc2FtZSBiaW5kaW5nIGFzIGJlZm9yZSB0aGUgQVNUIHdhcyBtb2RpZmllZCAoaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMKKwkgKiB0aGF0IHJlYXJyYW5nZSBzdWJ0cmVlcyBieSByZXBhcmVudGluZyBub2RlcykuCisJICogSWYgPGNvZGU+cmVzb2x2ZUJpbmRpbmdzPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBhbmFseXNpcworCSAqIGRvZXMgbm90IGdvIGJleW9uZCBwYXJzaW5nIGFuZCBidWlsZGluZyB0aGUgdHJlZSwgYW5kIGFsbAorCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmcm9tIHRoZQorCSAqIG91dHNldC4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcGFyYW0gc291cmNlIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkIGFzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0CisJICogQHBhcmFtIGNsYXNzRmlsZSB0aGUgSmF2YSBtb2RlbCBjbGFzcyBmaWxlIHdob3NlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgaXMgdG8gYmUgcGFyc2VkCisJICogQHBhcmFtIHJlc29sdmVCaW5kaW5ncyA8Y29kZT50cnVlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgd2FudGVkLAorCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgbm90IG9mIGludGVyZXN0CiAJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIEphdmEgZWxlbWVudCBkb2VzIG5vdAorCSAqIGV4aXN0IG9yIGlmIGl0cyBzb3VyY2Ugc3RyaW5nIGNhbm5vdCBiZSBvYnRhaW5lZAorCSAqIEBzZWUgQVNUTm9kZSNnZXRGbGFncygpCisJICogQHNlZSBBU1ROb2RlI01BTEZPUk1FRAorCSAqIEBzZWUgQVNUTm9kZSNnZXRTdGFydFBvc2l0aW9uKCkKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0TGVuZ3RoKCkKKwkgKiBAc2luY2UgMi4xCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBU1RQYXJzZXJ9IGluc3RlYWQuCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoCisJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlLAorCQlib29sZWFuIHJlc29sdmVCaW5kaW5ncykgeworCisJCWlmIChjbGFzc0ZpbGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRyeSB7CisJCQlBU1RQYXJzZXIgYyA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzIpOworCQkJYy5zZXRTb3VyY2UoY2xhc3NGaWxlKTsKKwkJCWMuc2V0UmVzb2x2ZUJpbmRpbmdzKHJlc29sdmVCaW5kaW5ncyk7CisJCQlBU1ROb2RlIHJlc3VsdCA9IGMuY3JlYXRlQVNUKG51bGwpOworCQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKKwkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGNvbnZlcnQgQVNUUGFyc2VyJ3MgY29tcGxhaW50cyBpbnRvIG9sZCBmb3JtCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgdGhlIHNvdXJjZSBzdHJpbmcgb2YgdGhlIGdpdmVuIEphdmEgbW9kZWwgY29tcGlsYXRpb24gdW5pdCBlbGVtZW50CisJICogYW5kIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFic3RyYWN0IHN5bnRheCB0cmVlLiBUaGUgc291cmNlCisJICogc3RyaW5nIGlzIG9idGFpbmVkIGZyb20gdGhlIEphdmEgbW9kZWwgZWxlbWVudCB1c2luZworCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQuZ2V0U291cmNlKCk8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSByZXR1cm5lZCBjb21waWxhdGlvbiB1bml0IG5vZGUgaXMgdGhlIHJvb3Qgbm9kZSBvZiBhIG5ldyBBU1QuCisJICogRWFjaCBub2RlIGluIHRoZSBzdWJ0cmVlIGNhcnJpZXMgc291cmNlIHJhbmdlKHMpIGluZm9ybWF0aW9uIHJlbGF0aW5nIGJhY2sKKwkgKiB0byBwb3NpdGlvbnMgaW4gdGhlIHNvdXJjZSBzdHJpbmcgKHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCByZW1lbWJlcmVkCisJICogd2l0aCB0aGUgQVNUKS4KKwkgKiBUaGUgc291cmNlIHJhbmdlIHVzdWFsbHkgYmVnaW5zIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IHRva2VuCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZTsgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgPGI+bm90PC9iPgorCSAqIGluY2x1ZGVkLiBUaGUgc291cmNlIHJhbmdlIHVzdWFsbHkgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZgorCSAqIHRoZSBsYXN0IHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGU7IHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kCisJICogY29tbWVudHMgYXJlIDxiPm5vdDwvYj4gaW5jbHVkZWQuIFRoZXJlIGFyZSBhIGhhbmRmdWwgb2YgZXhjZXB0aW9ucworCSAqIChpbmNsdWRpbmcgY29tcGlsYXRpb24gdW5pdHMgYW5kIHRoZSB2YXJpb3VzIGJvZHkgZGVjbGFyYXRpb25zKTsgdGhlCisJICogc3BlY2lmaWNhdGlvbiBmb3IgdGhlc2Ugbm9kZSB0eXBlIHNwZWxscyBvdXQgdGhlIGRldGFpbHMuCisJICogU291cmNlIHJhbmdlcyBuZXN0IHByb3Blcmx5OiB0aGUgc291cmNlIHJhbmdlIGZvciBhIGNoaWxkIGlzIGFsd2F5cworCSAqIHdpdGhpbiB0aGUgc291cmNlIHJhbmdlIG9mIGl0cyBwYXJlbnQsIGFuZCB0aGUgc291cmNlIHJhbmdlcyBvZiBzaWJsaW5nCisJICogbm9kZXMgbmV2ZXIgb3ZlcmxhcC4KKwkgKiBJZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZCB3aGlsZSBwYXJzaW5nLCB0aGUgcmVsZXZhbnQgbm9kZShzKSBvZiB0aGUKKwkgKiB0cmVlIHdpbGwgYmUgZmxhZ2dlZCBhcyA8Y29kZT5NQUxGT1JNRUQ8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBJZiA8Y29kZT5yZXNvbHZlQmluZGluZ3M8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdmFyaW91cyBuYW1lcworCSAqIGFuZCB0eXBlcyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIHJlc29sdmVkIHRvICJiaW5kaW5ncyIKKwkgKiBieSBjYWxsaW5nIHRoZSA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcy4gVGhlc2UgYmluZGluZ3MKKwkgKiBkcmF3IGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHByb2dyYW0sIGFuZAorCSAqIGdlbmVyYWxseSBhZmZvcmQgYSBtb3JlIHBvd2VyZnVsIHZhbnRhZ2UgcG9pbnQgZm9yIGNsaWVudHMgd2hvIHdpc2ggdG8KKwkgKiBhbmFseXplIGEgcHJvZ3JhbSdzIHN0cnVjdHVyZSBtb3JlIGRlZXBseS4gVGhlc2UgYmluZGluZ3MgY29tZSBhdCBhCisJICogY29uc2lkZXJhYmxlIGNvc3QgaW4gYm90aCB0aW1lIGFuZCBzcGFjZSwgaG93ZXZlciwgYW5kIHNob3VsZCBub3QgYmUKKwkgKiByZXF1ZXN0ZWQgZnJpdm9sb3VzbHkuIFRoZSBhZGRpdGlvbmFsIHNwYWNlIGlzIG5vdCByZWNsYWltZWQgdW50aWwgdGhlCisJICogQVNULCBhbGwgaXRzIG5vZGVzLCBhbmQgYWxsIGl0cyBiaW5kaW5ncyBiZWNvbWUgZ2FyYmFnZS4gU28gaXQgaXMgdmVyeQorCSAqIGltcG9ydGFudCB0byBub3QgcmV0YWluIGFueSBvZiB0aGVzZSBvYmplY3RzIGxvbmdlciB0aGFuIGFic29sdXRlbHkKKwkgKiBuZWNlc3NhcnkuIEJpbmRpbmdzIGFyZSByZXNvbHZlZCBhdCB0aGUgdGltZSB0aGUgQVNUIGlzIGNyZWF0ZWQuIFN1YnNlcXVlbnQKKwkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBBU1QgZG8gbm90IGFmZmVjdCB0aGUgYmluZGluZ3MgcmV0dXJuZWQgYnkKKwkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyBpbiBhbnkgd2F5OyB0aGVzZSBtZXRob2RzIHJldHVybiB0aGUKKwkgKiBzYW1lIGJpbmRpbmcgYXMgYmVmb3JlIHRoZSBBU1Qgd2FzIG1vZGlmaWVkIChpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucworCSAqIHRoYXQgcmVhcnJhbmdlIHN1YnRyZWVzIGJ5IHJlcGFyZW50aW5nIG5vZGVzKS4KKwkgKiBJZiA8Y29kZT5yZXNvbHZlQmluZGluZ3M8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGFuYWx5c2lzCisJICogZG9lcyBub3QgZ28gYmV5b25kIHBhcnNpbmcgYW5kIGJ1aWxkaW5nIHRoZSB0cmVlLCBhbmQgYWxsCisJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZyb20gdGhlCisJICogb3V0c2V0LgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSB1bml0IHRoZSBKYXZhIG1vZGVsIGNvbXBpbGF0aW9uIHVuaXQgd2hvc2Ugc291cmNlIGNvZGUgaXMgdG8gYmUgcGFyc2VkCisJICogQHBhcmFtIHJlc29sdmVCaW5kaW5ncyA8Y29kZT50cnVlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgd2FudGVkLAorCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgbm90IG9mIGludGVyZXN0CisJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIEphdmEgZWxlbWVudCBkb2VzIG5vdAorCSAqIGV4aXN0IG9yIGlmIGl0cyBzb3VyY2Ugc3RyaW5nIGNhbm5vdCBiZSBvYnRhaW5lZAogCSAqIEBzZWUgQVNUTm9kZSNnZXRGbGFncygpCiAJICogQHNlZSBBU1ROb2RlI01BTEZPUk1FRAogCSAqIEBzZWUgQVNUTm9kZSNnZXRTdGFydFBvc2l0aW9uKCkKQEAgLTEwMTAsMTgzICs1MjIsMjcgQEAKIAkgKiBAc2luY2UgMi4wCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBU1RQYXJzZXJ9IGluc3RlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoY2hhcltdIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpIHsKKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZUNvbXBpbGF0aW9uVW5pdCgKKwkJSUNvbXBpbGF0aW9uVW5pdCB1bml0LAorCQlib29sZWFuIHJlc29sdmVCaW5kaW5ncykgeworCisJCXRyeSB7CisJCQlBU1RQYXJzZXIgYyA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzIpOworCQkJYy5zZXRTb3VyY2UodW5pdCk7CisJCQljLnNldFJlc29sdmVCaW5kaW5ncyhyZXNvbHZlQmluZGluZ3MpOworCQkJQVNUTm9kZSByZXN1bHQgPSBjLmNyZWF0ZUFTVChudWxsKTsKKwkJCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7CisJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBjb252ZXJ0IEFTVFBhcnNlcidzIGNvbXBsYWludHMgaW50byBvbGQgZm9ybQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCUFTVFBhcnNlciBjID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMik7Ci0JCWMuc2V0U291cmNlKHNvdXJjZSk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gYy5jcmVhdGVBU1QobnVsbCk7Ci0JCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVAotCSAqLwotCUJpbmRpbmdSZXNvbHZlciBnZXRCaW5kaW5nUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNULgotCSAqCi0JICogQHJldHVybiB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyBBU1QKKwkgKiBMZXZlbCBvZiBBU1QgQVBJIHN1cHBvcnRlZCBieSB0aGlzIEFTVC4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JTm9kZUV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmV2ZW50SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGlzIEFTVC4KLQkgKgotCSAqIEBwYXJhbSBldmVudEhhbmRsZXIgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNUCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXZvaWQgc2V0RXZlbnRIYW5kbGVyKE5vZGVFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7Ci0JCWlmICh0aGlzLmV2ZW50SGFuZGxlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBkZWZhdWx0IG5vZGUgZmxhZ3Mgb2YgbmV3IG5vZGVzIG9mIHRoaXMgQVNULgotCSAqCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBub2RlIGZsYWdzIG9mIG5ldyBub2RlcyBvZiB0aGlzIEFTVAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE5vZGVGbGFnKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Tm9kZUZsYWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBkZWZhdWx0IG5vZGUgZmxhZ3Mgb2YgbmV3IG5vZGVzIG9mIHRoaXMgQVNULgotCSAqCi0JICogQHBhcmFtIGZsYWcgbm9kZSBmbGFncyBvZiBuZXcgbm9kZXMgb2YgdGhpcyBBU1QKLQkgKiBAc2luY2UgMy4wCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0Tm9kZUZsYWcoaW50IGZsYWcpIHsKLQkJdGhpcy5kZWZhdWx0Tm9kZUZsYWcgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCA8Y29kZT5vcmlnaW5hbE1vZGlmaWNhdGlvbkNvdW50PC9jb2RlPiB0byB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gY291bnQKLQkgKgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQl2b2lkIHNldE9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQobG9uZyBjb3VudCkgewotCQl0aGlzLm9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQgPSBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIGJpbmRpbmcgZm9yIGEgIndlbGwga25vd24iIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQotCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyB0eXBlIG5hbWVzIGFyZSBzdXBwb3J0ZWQ6Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT4iYm9vbGVhbiI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+ImJ5dGUiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJjaGFyIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iZG91YmxlIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iZmxvYXQiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJpbnQiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJsb25nIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4ic2hvcnQiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJ2b2lkIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkJvb2xlYW4iPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuQnl0ZSI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5DaGFyYWN0ZXIiPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuQ2xhc3MiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuQ2xvbmVhYmxlIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkRvdWJsZSI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5FcnJvciI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5FeGNlcHRpb24iPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuRmxvYXQiPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuSW50ZWdlciI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5Mb25nIjwvY29kZT4gKHNpbmNlIDMuMSk8L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLk9iamVjdCI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlNob3J0IjwvY29kZT4gKHNpbmNlIDMuMSk8L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuVGhyb3dhYmxlIjwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlZvaWQiPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmlvLlNlcmlhbGl6YWJsZSI8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgd2VsbCBrbm93biB0eXBlCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgbmFtZWQgdHlwZSBpcyBub3QgY29uc2lkZXJlZCB3ZWxsIGtub3duIG9yIGlmIG5vIGJpbmRpbmcgY2FuIGJlIGZvdW5kCi0JICogICBmb3IgaXQKLQkgKi8KLQlwdWJsaWMgSVR5cGVCaW5kaW5nIHJlc29sdmVXZWxsS25vd25UeXBlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlV2VsbEtub3duVHlwZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVC4KLQkgKgotCSAqIEBwYXJhbSByZXNvbHZlciB0aGUgbmV3IGJpbmRpbmcgcmVzb2x2ZXIgZm9yIHRoaXMgQVNUCi0JICovCi0Jdm9pZCBzZXRCaW5kaW5nUmVzb2x2ZXIoQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyKSB7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotICAgICAqIENoZWNrcyB0aGF0IHRoaXMgQVNUIG9wZXJhdGlvbiBpcyBub3QgdXNlZCB3aGVuCi0gICAgICogYnVpbGRpbmcgbGV2ZWwgSkxTMiBBU1RzLgotCi0gICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotCSAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQl2b2lkIHVuc3VwcG9ydGVkSW4yKCkgewotCSAgaWYgKHRoaXMuYXBpTGV2ZWwgPT0gQVNULkpMUzIpIHsKLQkgIAl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGluIEpMUzIgQVNUIik7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQl9Ci0KLQkvKioKLSAgICAgKiBDaGVja3MgdGhhdCB0aGlzIEFTVCBvcGVyYXRpb24gaXMgb25seSB1c2VkIHdoZW4KLSAgICAgKiBidWlsZGluZyBsZXZlbCBKTFMyIEFTVHMuCi0KLSAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuMAotICAgICAqLwotCXZvaWQgc3VwcG9ydGVkT25seUluMigpIHsKLQkgIGlmICh0aGlzLmFwaUxldmVsICE9IEFTVC5KTFMyKSB7Ci0JICAJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBKTFMyIEFTVCIpOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JfQotCi0JLyoqCi0JICogbmV3IENsYXNzW10ge0FTVC5jbGFzc30KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBU1RfQ0xBU1MgPSBuZXcgQ2xhc3NbXSB7QVNULmNsYXNzfTsKLQotCS8qKgotCSAqIG5ldyBPYmplY3RbXSB7dGhpc30KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBUSElTX0FTVD0gbmV3IE9iamVjdFtdIHt0aGlzfTsKLQotCS8qCi0JICogTXVzdCBub3QgY29sbGlkZSB3aXRoIGEgdmFsdWUgZm9yIElDb21waWxhdGlvblVuaXQgY29uc3RhbnRzCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBSRVNPTFZFRF9CSU5ESU5HUyA9IDB4ODAwMDAwMDA7CisJaW50IGFwaUxldmVsOwogCiAJLyoqCiAJICogVGFnIGJpdCB2YWx1ZS4gVGhpcyByZXByZXNlbnRzIGludGVybmFsIHN0YXRlIG9mIHRoZSB0cmVlLgpAQCAtMTE5NCw5ICs1NTAsMTk1IEBACiAJcHJpdmF0ZSBpbnQgYml0czsKIAogCS8qKgorCSAqIERlZmF1bHQgdmFsdWUgb2YgPGNvZGU+ZmxhZzxjb2RlPiB3aGVuIGEgbmV3IG5vZGUgaXMgY3JlYXRlZC4KKwkgKi8KKwlwcml2YXRlIGludCBkZWZhdWx0Tm9kZUZsYWcgPSAwOworCisJLyoqCisJICogV2hlbiBkaXNhYmxlRXZlbnRzID4gMCwgZXZlbnRzIGFyZSBub3QgcmVwb3J0ZWQgYW5kCisJICogdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBzdGF5cyBmaXhlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIGluIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgYSBub2RlCisJICogdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyByZXBvcnRlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbgorCSAqIG9mIHRoZSBub2RlIGFzIHdlbGwgYXMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWlzc2luZyBjaGlsZC4KKwkgKiA8L3A+CisJICogQHNpbmNlIDMuMAorCSAqLworCXByaXZhdGUgaW50IGRpc2FibGVFdmVudHMgPSAwOworCisJLyoqCisJICogVGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNULgorCSAqIEluaXRpYWxseSBhbiBldmVudCBoYW5kbGVyIHRoYXQgZG9lcyBub3Qgbm90aGluZy4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHJpdmF0ZSBOb2RlRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlciA9IG5ldyBOb2RlRXZlbnRIYW5kbGVyKCk7CisKKwkvKioKKwkgKiBJbnRlcm5hbCBvYmplY3QgdW5pcXVlIHRvIHRoZSBBU1QgaW5zdGFuY2UuIFJlYWRlcnMgbXVzdCBzeW5jaHJvbml6ZSBvbgorCSAqIHRoaXMgb2JqZWN0IHdoZW4gdGhlIG1vZGlmeWluZyBpbnN0YW5jZSBmaWVsZHMuCisJICogQHNpbmNlIDMuMAorCSAqLworCXByaXZhdGUgZmluYWwgT2JqZWN0IGludGVybmFsQVNUTG9jayA9IG5ldyBPYmplY3QoKTsKKworCS8qKgorCSAqIEludGVybmFsIG1vZGlmaWNhdGlvbiBjb3VudDsgaW5pdGlhbGx5IDA7IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5CisJICogPGI+Ynkgb25lIG9yIG1vcmU8L2I+IGFzIHRoZSBBU1QgaXMgc3VjY2Vzc2l2ZWx5IG1vZGlmaWVkLgorCSAqLworCXByaXZhdGUgbG9uZyBtb2RpZmljYXRpb25Db3VudCA9IDA7CisKKwkvKioKKwkgKiBJbnRlcm5hbCBvcmlnaW5hbCBtb2RpZmljYXRpb24gY291bnQ7IHZhbHVlIGlzIGVxdWFscyB0byA8Y29kZT4KKwkgKiBtb2RpZmljYXRpb25Db3VudDwvY29kZT4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2UgKDxjb2RlPkFTVFBhcnNlcgorCSAqIDwvY29kZT4pLiBJZiB0aGlzIGFzdCBpcyBub3QgY3JlYXRlZCB3aXRoIGEgcGFyc2VyIHRoZW4gdmFsdWUgaXMgMC4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHJpdmF0ZSBsb25nIG9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQgPSAwOworCisJLyoqCisJICogVGhlIGJpbmRpbmcgcmVzb2x2ZXIgZm9yIHRoaXMgQVNULiBJbml0aWFsbHkgYSBiaW5kaW5nIHJlc29sdmVyIHRoYXQKKwkgKiBkb2VzIG5vdCByZXNvbHZlIG5hbWVzIGF0IGFsbC4KKwkgKi8KKwlwcml2YXRlIEJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG5ldyBCaW5kaW5nUmVzb2x2ZXIoKTsKKworCS8qKgorCSAqIEludGVybmFsIGFzdCByZXdyaXRlciB1c2VkIHRvIHJlY29yZCBhc3QgbW9kaWZpY2F0aW9uIHdoZW4gcmVjb3JkIG1vZGUgaXMgZW5hYmxlZC4KKwkgKi8KKwlJbnRlcm5hbEFTVFJld3JpdGUgcmV3cml0ZXI7CisKKwkvKioKKwkgKiBKYXZhIFNjYW5uZXIgdXNlZCB0byB2YWxpZGF0ZSBwcmVjb25kaXRpb25zIGZvciB0aGUgY3JlYXRpb24gb2Ygc3BlY2lmaWMgbm9kZXMKKwkgKiBsaWtlIENoYXJhY3RlckxpdGVyYWwsIE51bWJlckxpdGVyYWwsIFN0cmluZ0xpdGVyYWwgb3IgU2ltcGxlTmFtZS4KKwkgKi8KKwlTY2FubmVyIHNjYW5uZXI7CisKKwkvKioKKwkgKiBuZXcgT2JqZWN0W10ge3RoaXN9CisJICogQHNpbmNlIDMuMAorCSAqLworCXByaXZhdGUgZmluYWwgT2JqZWN0W10gVEhJU19BU1Q9IG5ldyBPYmplY3RbXSB7dGhpc307CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSBhYnN0cmFjdCBzeW50YXggdHJlZSB1c2luZyBkZWZhdWx0IG9wdGlvbnMuCisJICoKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBAZGVwcmVjYXRlZCBDbGllbnRzIHNob3VsZCBwb3J0IHRoZWlyIGNvZGUgdG8gdXNlIHRoZSBuZXcgSkxTMyBBU1QgQVBJIGFuZCBjYWxsCisJICogICAge0BsaW5rICNuZXdBU1QoaW50KSBBU1QubmV3QVNUKEFTVC5KTFMzKX0gaW5zdGVhZCBvZiB1c2luZyB0aGlzIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBBU1QoKSB7CisJCXRoaXMoSmF2YUNvcmUuZ2V0RGVmYXVsdE9wdGlvbnMoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBKYXZhIGFic3RyYWN0IHN5bnRheCB0cmVlCisgICAgICogKEFTVCkgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgc2V0IG9mIEFQSSBydWxlcy4KKyAgICAgKgorIAkgKiBAcGFyYW0gbGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZSBKTFMqIGxldmVsIGNvbnN0YW50cworICAgICAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwcml2YXRlIEFTVChpbnQgbGV2ZWwpIHsKKwkJc3dpdGNoKGxldmVsKSB7CisJCQljYXNlIEpMUzJfSU5URVJOQUwgOgorCQkJY2FzZSBKTFMzIDoKKwkJCQl0aGlzLmFwaUxldmVsID0gbGV2ZWw7CisJCQkJLy8gaW5pdGlhbGl6ZSBhIHNjYW5uZXIKKwkJCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcigKKwkJCQkJCXRydWUgLypjb21tZW50Ki8sCisJCQkJCQl0cnVlIC8qd2hpdGVzcGFjZSovLAorCQkJCQkJZmFsc2UgLypubHMqLywKKwkJCQkJCUNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMgLypzb3VyY2VMZXZlbCovLAorCQkJCQkJQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAvKmNvbXBsaWFuY2VMZXZlbCovLAorCQkJCQkJbnVsbC8qdGFza1RhZyovLAorCQkJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKKwkJCQkJCXRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQkJCWJyZWFrOworCQkJY2FzZSBKTFM0IDoKKwkJCQl0aGlzLmFwaUxldmVsID0gbGV2ZWw7CisJCQkJLy8gaW5pdGlhbGl6ZSBhIHNjYW5uZXIKKwkJCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcigKKwkJCQkJCXRydWUgLypjb21tZW50Ki8sCisJCQkJCQl0cnVlIC8qd2hpdGVzcGFjZSovLAorCQkJCQkJZmFsc2UgLypubHMqLywKKwkJCQkJCUNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcgLypzb3VyY2VMZXZlbCovLAorCQkJCQkJQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNyAvKmNvbXBsaWFuY2VMZXZlbCovLAorCQkJCQkJbnVsbC8qdGFza1RhZyovLAorCQkJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKKwkJCQkJCXRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBKTFMgbGV2ZWwiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdXNpbmcgdGhlIGdpdmVuIG9wdGlvbnMuCisJICogPHA+CisJICogRm9sbG93aW5nIG9wdGlvbiBrZXlzIGFyZSBzaWduaWZpY2FudDoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2UiPC9jb2RlPiAtCisJICogICAgaW5kaWNhdGVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IG1vZGUgKGFzIHBlciA8Y29kZT5KYXZhQ29yZTwvY29kZT4pOworCSAqICAgIDxjb2RlPiIxLjMiPC9jb2RlPiBtZWFucyB0aGUgc291cmNlIGNvZGUgaXMgYXMgcGVyIEpESyAxLjM7CisJICogICAgPGNvZGU+IjEuNCI8L2NvZGU+IG1lYW5zIHRoZSBzb3VyY2UgY29kZSBpcyBhcyBwZXIgSkRLIDEuNAorCSAqICAgICg8Y29kZT4iYXNzZXJ0IjwvY29kZT4gaXMgbm93IGEga2V5d29yZCk7CisJICogICAgPGNvZGU+IjEuNSI8L2NvZGU+IG1lYW5zIHRoZSBzb3VyY2UgY29kZSBpcyBhcyBwZXIgSkRLIDEuNQorCSAqICAgICg8Y29kZT4iZW51bSI8L2NvZGU+IGlzIG5vdyBhIGtleXdvcmQpOworCSAqICAgIGFkZGl0aW9uYWwgbGVnYWwgdmFsdWVzIG1heSBiZSBhZGRlZCBsYXRlci4gPC9saT4KKwkgKiA8L3VsPgorCSAqIE9wdGlvbnMgb3RoZXIgdGhhbiB0aGUgYWJvdmUgYXJlIGlnbm9yZWQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIG9wdGlvbnMgdGhlIHRhYmxlIG9mIG9wdGlvbnMgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OworCSAqICAgIHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQGRlcHJlY2F0ZWQgQ2xpZW50cyBzaG91bGQgcG9ydCB0aGVpciBjb2RlIHRvIHVzZSB0aGUgbmV3IEpMUzMgQVNUIEFQSSBhbmQgY2FsbAorCSAqICAgIHtAbGluayAjbmV3QVNUKGludCkgQVNULm5ld0FTVChBU1QuSkxTMyl9IGluc3RlYWQgb2YgdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQVNUKE1hcCBvcHRpb25zKSB7CisJCXRoaXMoSkxTMik7CisJCU9iamVjdCBzb3VyY2VMZXZlbE9wdGlvbiA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7CisJCWxvbmcgc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOworCQlpZiAoSmF2YUNvcmUuVkVSU0lPTl8xXzQuZXF1YWxzKHNvdXJjZUxldmVsT3B0aW9uKSkgeworCQkJc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OworCQl9IGVsc2UgaWYgKEphdmFDb3JlLlZFUlNJT05fMV81LmVxdWFscyhzb3VyY2VMZXZlbE9wdGlvbikpIHsKKwkJCXNvdXJjZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJfSBlbHNlIGlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNy5lcXVhbHMoc291cmNlTGV2ZWxPcHRpb24pKSB7CisJCQlzb3VyY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzc7CisJCX0KKwkJT2JqZWN0IGNvbXBsaWFuY2VMZXZlbE9wdGlvbiA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOworCQlsb25nIGNvbXBsaWFuY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzM7CisJCWlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNC5lcXVhbHMoY29tcGxpYW5jZUxldmVsT3B0aW9uKSkgeworCQkJY29tcGxpYW5jZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNDsKKwkJfSBlbHNlIGlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNS5lcXVhbHMoY29tcGxpYW5jZUxldmVsT3B0aW9uKSkgeworCQkJY29tcGxpYW5jZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJfSBlbHNlIGlmIChKYXZhQ29yZS5WRVJTSU9OXzFfNy5lcXVhbHMoY29tcGxpYW5jZUxldmVsT3B0aW9uKSkgeworCQkJY29tcGxpYW5jZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNzsKKwkJfQorCQkvLyBvdmVycmlkZSBzY2FubmVyIGlmIDEuNCBvciAxLjUgYXNrZWQgZm9yCisJCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAorCQkJdHJ1ZSAvKmNvbW1lbnQqLywKKwkJCXRydWUgLyp3aGl0ZXNwYWNlKi8sCisJCQlmYWxzZSAvKm5scyovLAorCQkJc291cmNlTGV2ZWwgLypzb3VyY2VMZXZlbCovLAorCQkJY29tcGxpYW5jZUxldmVsIC8qY29tcGxpYW5jZUxldmVsKi8sCisJCQludWxsLyp0YXNrVGFnKi8sCisJCQludWxsLyp0YXNrUHJpb3JpdGllcyovLAorCQkJdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBBUEkgbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgQVNULgorCSAqCisJICogQHJldHVybiBsZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIDxjb2RlPkpMUyo8L2NvZGU+TEVWRUwKKyAgICAgKiBkZWNsYXJlZCBvbiA8Y29kZT5BU1Q8L2NvZGU+OyBhc3N1bWUgdGhpcyBzZXQgaXMgb3Blbi1lbmRlZAorICAgICAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgaW50IGFwaUxldmVsKCkgeworCQlyZXR1cm4gdGhpcy5hcGlMZXZlbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgbm9kZSBvZiB0aGUgZ2l2ZW4gbm9kZSBjbGFzcwotCSAqIChub24tYWJzdHJhY3Qgc3ViY2xhc3Mgb2Yge0BsaW5rIEFTVE5vZGV9KS4gCi0JICogCisJICogKG5vbi1hYnN0cmFjdCBzdWJjbGFzcyBvZiB7QGxpbmsgQVNUTm9kZX0pLgorCSAqCiAJICogQHBhcmFtIG5vZGVDbGFzcyBBU1Qgbm9kZSBjbGFzcwogCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBub2RlIG93bmVkIGJ5IHRoaXMgQVNUCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bm9kZUNsYXNzPC9jb2RlPiBpcwpAQCAtMTI1MSw3NiArNzkzLDc4IEBACiAJCXJldHVybiBjcmVhdGVJbnN0YW5jZShub2RlQ2xhc3MpOwogCX0KIAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBOQU1FUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgc2ltcGxlIG5hbWUgbm9kZSBmb3IgdGhlIGdpdmVuCi0JICogaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGEgbGVnYWwgSmF2YSBpZGVudGlmaWVyLCBidXQgbm90Ci0JICogYSBrZXl3b3JkLCBib29sZWFuIGxpdGVyYWwgKCJ0cnVlIiwgImZhbHNlIikgb3IgbnVsbCBsaXRlcmFsICgibnVsbCIpLgorICAgICAqIERpc2FibGUgZXZlbnRzLgorCSAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlIGZvciBBU1QgcmVhZGVycy4KIAkgKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBpZGVudGlmaWVyCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHNpbXBsZSBuYW1lIG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaWRlbnRpZmllciBpcyBpbnZhbGlkCi0JICovCi0JcHVibGljIFNpbXBsZU5hbWUgbmV3U2ltcGxlTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJICogQHNlZSAjcmVlbmFibGVFdmVudHMoKQorICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKi8KKwlmaW5hbCB2b2lkIGRpc2FibGVFdmVudHMoKSB7CisJCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKKwkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYW5vdGhlciByZWFkZXIKKwkJCXRoaXMuZGlzYWJsZUV2ZW50cysrOwogCQl9Ci0JCVNpbXBsZU5hbWUgcmVzdWx0ID0gbmV3IFNpbXBsZU5hbWUodGhpcyk7Ci0JCXJlc3VsdC5zZXRJZGVudGlmaWVyKGlkZW50aWZpZXIpOwotCQlyZXR1cm4gcmVzdWx0OworCQkvLyB3aGlsZSBkaXNhYmxlRXZlbnRzID4gMCBubyBldmVudHMgd2lsbCBiZSByZXBvcnRlZCwgYW5kIG1vZCBjb3VudCB3aWxsIHN0YXkgZml4ZWQKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIG5hbWUgbm9kZSBmb3IgdGhlIGdpdmVuCi0JICogcXVhbGlmaWVyIGFuZCBzaW1wbGUgbmFtZSBjaGlsZCBub2RlLgorCSAqIFJldHVybnMgdGhlIGJpbmRpbmcgcmVzb2x2ZXIgZm9yIHRoaXMgQVNULgogCSAqCi0JICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZQotCSAqIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgbmFtZSBiZWluZyBxdWFsaWZpZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIG5hbWUgbm9kZQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgotCSAqIDx1bD4KLQkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgotCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+Ci0JICogPC91bD4KKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVAogCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lIG5ld1F1YWxpZmllZE5hbWUoCi0JCU5hbWUgcXVhbGlmaWVyLAotCQlTaW1wbGVOYW1lIG5hbWUpIHsKLQkJUXVhbGlmaWVkTmFtZSByZXN1bHQgPSBuZXcgUXVhbGlmaWVkTmFtZSh0aGlzKTsKLQkJcmVzdWx0LnNldFF1YWxpZmllcihxdWFsaWZpZXIpOwotCQlyZXN1bHQuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQorCUJpbmRpbmdSZXNvbHZlciBnZXRCaW5kaW5nUmVzb2x2ZXIoKSB7CisJCXJldHVybiB0aGlzLnJlc29sdmVyOwogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBuYW1lIG5vZGUgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICogc2VnbWVudHMuIFJldHVybnMgYSBzaW1wbGUgbmFtZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBuYW1lIHNlZ21lbnQsIGFuZAotCSAqIGEgcXVhbGlmaWVkIG5hbWUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIG5hbWUgc2VnbWVudHMuIEVhY2ggb2YgdGhlIG5hbWUKLQkgKiBzZWdtZW50cyBzaG91bGQgYmUgbGVnYWwgSmF2YSBpZGVudGlmaWVycyAodGhpcyBjb25zdHJhaW50IG1heSBvciBtYXkKLQkgKiBub3QgYmUgZW5mb3JjZWQpLCBhbmQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbmFtZSBzZWdtZW50LgorCSAqIFJldHVybnMgZGVmYXVsdCBub2RlIGZsYWdzIG9mIG5ldyBub2RlcyBvZiB0aGlzIEFTVC4KIAkgKgotCSAqIEBwYXJhbSBpZGVudGlmaWVycyBhIGxpc3Qgb2YgMSBvciBtb3JlIG5hbWUgc2VnbWVudHMsIGVhY2ggb2Ygd2hpY2gKLQkgKiAgICBpcyBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBuYW1lIG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnRoZSBpZGVudGlmaWVyIGlzIGludmFsaWQ8L2xpPgotCSAqIDxsaT50aGUgbGlzdCBvZiBpZGVudGlmaWVycyBpcyBlbXB0eTwvbGk+Ci0JICogPC91bD4KKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG5vZGUgZmxhZ3Mgb2YgbmV3IG5vZGVzIG9mIHRoaXMgQVNUCisJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBOYW1lIG5ld05hbWUoU3RyaW5nW10gaWRlbnRpZmllcnMpIHsKLQkJLy8gdXBkYXRlIGludGVybmFsU2V0TmFtZShTdHJpbmdbXSBpZiBjaGFuZ2VkCi0JCWludCBjb3VudCA9IGlkZW50aWZpZXJzLmxlbmd0aDsKLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlOYW1lIHJlc3VsdCA9IG5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcnNbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCVNpbXBsZU5hbWUgbmFtZSA9IG5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcnNbaV0pOwotCQkJcmVzdWx0ID0gbmV3UXVhbGlmaWVkTmFtZShyZXN1bHQsIG5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7CisJaW50IGdldERlZmF1bHROb2RlRmxhZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdE5vZGVGbGFnOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNULgorCSAqCisJICogQHJldHVybiB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyBBU1QKKwkgKiBAc2luY2UgMy4wCisJICovCisJTm9kZUV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7CisJCXJldHVybiB0aGlzLmV2ZW50SGFuZGxlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggYmluZGluZ3MgcmVjb3ZlcnksIGZhbHNlIG90aGVyd2lzZQorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBhc3QgdHJlZSB3YXMgY3JlYXRlZCB3aXRoIGJpbmRpbmdzIHJlY292ZXJ5LCBmYWxzZSBvdGhlcndpc2UKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ3NSZWNvdmVyeSgpIHsKKwkJcmV0dXJuICh0aGlzLmJpdHMgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggYmluZGluZ3MsIGZhbHNlIG90aGVyd2lzZQorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBhc3QgdHJlZSB3YXMgY3JlYXRlZCB3aXRoIGJpbmRpbmdzLCBmYWxzZSBvdGhlcndpc2UKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVzb2x2ZWRCaW5kaW5ncygpIHsKKwkJcmV0dXJuICh0aGlzLmJpdHMgJiBSRVNPTFZFRF9CSU5ESU5HUykgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggc3RhdGVtZW50cyByZWNvdmVyeSwgZmFsc2Ugb3RoZXJ3aXNlCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggc3RhdGVtZW50cyByZWNvdmVyeSwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1N0YXRlbWVudHNSZWNvdmVyeSgpIHsKKwkJcmV0dXJuICh0aGlzLmJpdHMgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwOwogCX0KIAogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQpAQCAtMTM0Myw4MyArODg3LDE2NiBAQAogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBuYW1lIG5vZGUgZm9yIHRoZSBnaXZlbiBuYW1lLgotCSAqIFRoZSBuYW1lIHN0cmluZyBtdXN0IGNvbnNpc3Qgb2YgMSBvciBtb3JlIG5hbWUgc2VnbWVudHMgc2VwYXJhdGVkCi0JICogYnkgc2luZ2xlIGRvdHMgJy4nLiBSZXR1cm5zIGEge0BsaW5rIFF1YWxpZmllZE5hbWV9IGlmIHRoZSBuYW1lIGhhcwotCSAqIGRvdHMsIGFuZCBhIHtAbGluayBTaW1wbGVOYW1lfSBvdGhlcndpc2UuIEVhY2ggb2YgdGhlIG5hbWUKLQkgKiBzZWdtZW50cyBzaG91bGQgYmUgbGVnYWwgSmF2YSBpZGVudGlmaWVycyAodGhpcyBjb25zdHJhaW50IG1heSBvciBtYXkKLQkgKiBub3QgYmUgZW5mb3JjZWQpLCBhbmQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbmFtZSBzZWdtZW50LgotCSAqIFRoZSBzdHJpbmcgbXVzdCBub3QgY29udGFpbnMgd2hpdGUgc3BhY2UsICcmbHQ7JywgJyZndDsnLAotCSAqICdbJywgJ10nLCBvciBvdGhlciBhbnkgb3RoZXIgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QKLQkgKiBwYXJ0IG9mIHRoZSBKYXZhIGlkZW50aWZpZXJzIG9yIHNlcGFyYXRpbmcgJy4ncy4KLQkgKgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHN0cmluZyBjb25zaXN0aW5nIG9mIDEgb3IgbW9yZSBuYW1lIHNlZ21lbnRzLAotCSAqIGVhY2ggb2Ygd2hpY2ggaXMgYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIsIHNlcGFyYXRlZCAgYnkgc2luZ2xlIGRvdHMgJy4nCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG5hbWUgbm9kZQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBmb3IgdGhpcyBBU1QuIFRoZSBtb2RpZmljYXRpb24gY291bnQKKwkgKiBpcyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSB0aGF0IGluY3JlYXNlcyAoYnkgMSBvciBwZXJoYXBzIGJ5IG1vcmUpIGFzCisJICogdGhpcyBBU1Qgb3IgaXRzIG5vZGVzIGFyZSBjaGFuZ2VkLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIHRoaW5ncyBjb3VudCBhcyBtb2RpZnlpbmcgYW4gQVNUOgogCSAqIDx1bD4KLQkgKiA8bGk+dGhlIHN0cmluZyBpcyBlbXB0eTwvbGk+Ci0JICogPGxpPnRoZSBzdHJpbmcgYmVnaW5zIG9yIGVuZHMgaW4gYSAnLic8L2xpPgotCSAqIDxsaT50aGUgc3RyaW5nIGhhcyBhZGphY2VudCAnLidzPC9saT4KLQkgKiA8bGk+dGhlIHNlZ21lbnRzIGJldHdlZW4gdGhlICcuJ3MgYXJlIG5vdCB2YWxpZCBKYXZhIGlkZW50aWZpZXJzPC9saT4KKwkgKiA8bGk+Y3JlYXRpbmcgYSBuZXcgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgorCSAqIDxsaT5hZGRpbmcgYSBjaGlsZCB0byBhIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QsPC9saT4KKwkgKiA8bGk+cmVtb3ZpbmcgYSBjaGlsZCBmcm9tIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgorCSAqIDxsaT5zZXR0aW5nIGEgbm9uLW5vZGUgYXR0cmlidXRlIG9mIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVC48L2xpPgogCSAqIDwvdWw+CisJICogPC9wPgorCSAqIE9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IGVudGFpbCBjcmVhdGluZyBvciBtb2RpZnlpbmcgZXhpc3Rpbmcgbm9kZXMKKwkgKiBkbyBub3QgaW5jcmVhc2UgdGhlIG1vZGlmaWNhdGlvbiBjb3VudC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBpbiB0aGUgY291cnNlCisJICogb2YgYSBzaW5nbGUgY2xpZW50IG9wZXJhdGlvbi4gVGhlIG9ubHkgcHJvbWlzZSBpcyB0aGF0IHRoZSBtb2RpZmljYXRpb24KKwkgKiBjb3VudCBpbmNyZWFzZXMgbW9ub3RvbmljYWxseSBhcyB0aGUgQVNUIG9yIGl0cyBub2RlcyBjaGFuZ2U7IHRoZXJlIGlzCisJICogbm8gcHJvbWlzZSB0aGF0IGEgbW9kaWZ5aW5nIG9wZXJhdGlvbiBpbmNyZWFzZXMgdGhlIGNvdW50IGJ5IGV4YWN0bHkgMS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIChub24tbmVnYXRpdmUpIG9mIHRoZSBtb2RpZmljYXRpb24gY291bnRlciBvZgorCSAqICAgIHRoaXMgQVNUCisJICovCisJcHVibGljIGxvbmcgbW9kaWZpY2F0aW9uQ291bnQoKSB7CisJCXJldHVybiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50OworCX0KKworCS8qKgorCSAqIEluZGljYXRlcyB0aGF0IHRoaXMgQVNUIGlzIGFib3V0IHRvIGJlIG1vZGlmaWVkLgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGNvdW50IGFzIG1vZGlmeWluZyBhbiBBU1Q6CisJICogPHVsPgorCSAqIDxsaT5jcmVhdGluZyBhIG5ldyBub2RlIG93bmVkIGJ5IHRoaXMgQVNUPC9saT4KKwkgKiA8bGk+YWRkaW5nIGEgY2hpbGQgdG8gYSBub2RlIG93bmVkIGJ5IHRoaXMgQVNUPC9saT4KKwkgKiA8bGk+cmVtb3ZpbmcgYSBjaGlsZCBmcm9tIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVDwvbGk+CisJICogPGxpPnNldHRpbmcgYSBub24tbm9kZSBhdHRyaWJ1dGUgb2YgYSBub2RlIG93bmVkIGJ5IHRoaXMgQVNUPC9saT4uCisJICogPC91bD4KKwkgKiA8L3A+CisJICogPHA+CisJICogTi5CLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgaW4gdGhlIGNvdXJzZQorCSAqIG9mIGEgc2luZ2xlIGNsaWVudCBvcGVyYXRpb24uCisJICogPC9wPgorCSAqLworCXZvaWQgbW9kaWZ5aW5nKCkgeworCQkvLyB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgbGF6eSBpbml0LCBldmVudHMgYXJlIGRpc2FibGVkCisJCS8vIGFuZCB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IHdpbGwgbm90IGJlIGluY3JlYXNlZAorCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIGluY3JlYXNlIHRoZSBtb2RpZmljYXRpb24gY291bnQKKwkJdGhpcy5tb2RpZmljYXRpb25Db3VudCsrOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhbm5vdGF0aW9uIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBub2RlIGZvciBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7CisJICogYW5kIGFuIGVtcHR5IGxpc3Qgb2YgbWVtYmVyIGRlY2xhcmF0aW9ucy4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhbm5vdGF0aW9uIHR5cGUgZGVjbGFyYXRpb24gbm9kZQorCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgorCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIE5hbWUgbmV3TmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocXVhbGlmaWVkTmFtZSwgIi4iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlOYW1lIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGJhbGFuY2UgaXMgIyBvZiBuYW1lIHRva2VucyAtICMgb2YgcGVyaW9kIHRva2VucyBzZWVuIHNvIGZhcgotCQkvLyBpbml0aWFsbHkgMDsgZmluYWxseSAxOyBzaG91bGQgbmV2ZXIgZHJvcCA8IDAgb3IgPiAxCi0JCWludCBiYWxhbmNlID0gMDsKLQkJd2hpbGUodC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzID0gdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChzLmluZGV4T2YoJy4nKSA+PSAwKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIGRlbGltaXRlcgotCQkJCWlmIChzLmxlbmd0aCgpID4gMSkgewotCQkJCQkvLyB0b28gbWFueSBkb3RzIGluIGEgcm93Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJYmFsYW5jZS0tOwotCQkJCWlmIChiYWxhbmNlIDwgMCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGlzIGlzIGFuIGlkZW50aWZpZXIgc2VnbWVudAotCQkJCWJhbGFuY2UrKzsKLQkJCQlTaW1wbGVOYW1lIG5hbWUgPSBuZXdTaW1wbGVOYW1lKHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuYW1lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ld1F1YWxpZmllZE5hbWUocmVzdWx0LCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhbGFuY2UgIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9CisJcHVibGljIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbmV3QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpIHsKKwkJQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbih0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVFlQRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHNpbXBsZSB0eXBlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4KLQkgKiB0eXBlIG5hbWUuCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGFubm90YXRpb24gdHlwZQorCSAqIG1lbWJlciBkZWNsYXJhdGlvbiBub2RlIGZvciBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIG1lbWJlciBuYW1lIGFuZCB0eXBlOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7CisJICogYW5kIG5vIGRlZmF1bHQgdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYW5ub3RhdGlvbiB0eXBlIG1lbWJlciBkZWNsYXJhdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCisJICogYSBKTFMyIEFTVAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBuZXdBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKCkgeworCQlBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24KKwkgKiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYm9keSBkZWNsYXJhdGlvbiBsaXN0IGlzIGVtcHR5LgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiBub2RlCisJICovCisJcHVibGljIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKKwkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYXJyYXkgYW5kIGluZGV4IGV4cHJlc3Npb24gYXJlCisJICogYm90aCB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEFycmF5QWNjZXNzIG5ld0FycmF5QWNjZXNzKCkgeworCQlBcnJheUFjY2VzcyByZXN1bHQgPSBuZXcgQXJyYXlBY2Nlc3ModGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYXJyYXkgdHlwZSBpcyBhbiB1bnNwZWNpZmllZAorCSAqIDEtZGltZW5zaW9uYWwgYXJyYXksIHRoZSBsaXN0IG9mIGRpbWVuc2lvbnMgaXMgZW1wdHksIGFuZCB0aGVyZSBpcyBubworCSAqIGFycmF5IGluaXRpYWxpemVyLgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBuYW1lICg8Y29kZT5OYW1lPC9jb2RlPikgaW50byBhCi0JICogdHlwZSAoPGNvZGU+VHlwZTwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgorCSAqIEV4YW1wbGVzOgorCSAqIDxjb2RlPgorCSAqIDxwcmU+CisJICogLy8gbmV3IFN0cmluZ1tsZW5dCisJICogQXJyYXlDcmVhdGlvbiBhYzEgPSBhc3QubmV3QXJyYXlDcmVhdGlvbigpOworCSAqIGFjMS5zZXRUeXBlKAorCSAqICAgIGFzdC5uZXdBcnJheVR5cGUoCisJICogICAgICAgYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpKSkpOworCSAqIGFjMS5kaW1lbnNpb25zKCkuYWRkKGFzdC5uZXdTaW1wbGVOYW1lKCJsZW4iKSk7CisgICAgICoKKwkgKiAvLyBuZXcgZG91YmxlWzddWzI0XVtdCisJICogQXJyYXlDcmVhdGlvbiBhYzIgPSBhc3QubmV3QXJyYXlDcmVhdGlvbigpOworCSAqIGFjMi5zZXRUeXBlKAorCSAqICAgIGFzdC5uZXdBcnJheVR5cGUoCisJICogICAgICAgYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5ET1VCTEUpLCAzKSk7CisJICogYWMyLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjciKSk7CisJICogYWMyLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjI0IikpOworCSAqCisJICogLy8gbmV3IGludFtdIHsxLCAyfQorCSAqIEFycmF5Q3JlYXRpb24gYWMzID0gYXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKKwkgKiBhYzMuc2V0VHlwZSgKKwkgKiAgICBhc3QubmV3QXJyYXlUeXBlKAorCSAqICAgICAgIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSkpOworCSAqIEFycmF5SW5pdGlhbGl6ZXIgYWkgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOworCSAqIGFjMy5zZXRJbml0aWFsaXplcihhaSk7CisJICogYWkuZXhwcmVzc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjEiKSk7CisJICogYWkuZXhwcmVzc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjIiKSk7CisJICogPC9wcmU+CisJICogPC9jb2RlPgogCSAqIDwvcD4KIAkgKgotCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHNpbXBsZSB0eXBlIG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KLQkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgotCSAqIDwvdWw+CisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gbm9kZQogCSAqLwotCXB1YmxpYyBTaW1wbGVUeXBlIG5ld1NpbXBsZVR5cGUoTmFtZSB0eXBlTmFtZSkgewotCQlTaW1wbGVUeXBlIHJlc3VsdCA9IG5ldyBTaW1wbGVUeXBlKHRoaXMpOwotCQlyZXN1bHQuc2V0TmFtZSh0eXBlTmFtZSk7CisJcHVibGljIEFycmF5Q3JlYXRpb24gbmV3QXJyYXlDcmVhdGlvbigpIHsKKwkJQXJyYXlDcmVhdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlDcmVhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgaW5pdGlhbGl6ZXIgbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgaW5pdGlhbGl6ZXIgaGFzIG5vIGV4cHJlc3Npb25zLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGluaXRpYWxpemVyIG5vZGUKKwkgKi8KKwlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBuZXdBcnJheUluaXRpYWxpemVyKCkgeworCQlBcnJheUluaXRpYWxpemVyIHJlc3VsdCA9IG5ldyBBcnJheUluaXRpYWxpemVyKHRoaXMpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMTQ4Miw3NSArMTEwOSwxMzQgQEAKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcHJpbWl0aXZlIHR5cGUgbm9kZSB3aXRoIHRoZSBnaXZlbgotCSAqIHR5cGUgY29kZS4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgYXNzZXJ0IHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIGFuZCBoYXMgbm8KKwkgKiBtZXNzYWdlIGV4cHJlc3Npb24uCiAJICoKLQkgKiBAcGFyYW0gdHlwZUNvZGUgb25lIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvbnN0YW50cyBkZWNsYXJlZCBpbgotCSAqICAgIDxjb2RlPlByaW1pdGl2ZVR5cGU8L2NvZGU+Ci0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHByaW1pdGl2ZSB0eXBlIG5vZGUKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZSBpcyBpbnZhbGlkCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZQogCSAqLwotCXB1YmxpYyBQcmltaXRpdmVUeXBlIG5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5Db2RlIHR5cGVDb2RlKSB7Ci0JCVByaW1pdGl2ZVR5cGUgcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVR5cGUodGhpcyk7Ci0JCXJlc3VsdC5zZXRQcmltaXRpdmVUeXBlQ29kZSh0eXBlQ29kZSk7CisJcHVibGljIEFzc2VydFN0YXRlbWVudCBuZXdBc3NlcnRTdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgQXNzZXJ0U3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciBpcyAiPSIgYW5kCisJICogdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbmQgc2lkZSBleHByZXNzaW9ucyBhcmUgdW5zcGVjaWZpZWQsIGJ1dAorCSAqIGxlZ2FsLCBuYW1lcy4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBBc3NpZ25tZW50IG5ld0Fzc2lnbm1lbnQoKSB7CisJCUFzc2lnbm1lbnQgcmVzdWx0ID0gbmV3IEFzc2lnbm1lbnQodGhpcyk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHBhcmFtZXRlcml6ZWQgdHlwZSBub2RlIHdpdGggdGhlCi0JICogZ2l2ZW4gdHlwZSBhbmQgYW4gZW1wdHkgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cy4KKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgYmxvY2sgbm9kZSBvd25lZCBieSB0aGlzIEFTVCwgZm9yIGFuIGVtcHR5IGxpc3QKKwkgKiBvZiBzdGF0ZW1lbnRzLgogCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgdGhhdCBpcyBwYXJhbWV0ZXJpemVkCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHBhcmFtZXRlcml6ZWQgdHlwZSBub2RlCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6Ci0JICogPHVsPgotCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+Ci0JICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KLQkgKiA8L3VsPgotCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgotCSAqIGEgSkxTMiBBU1QKLQkgKiBAc2luY2UgMy4xCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkLCBlbXB0eSBibG9jayBub2RlCiAJICovCi0JcHVibGljIFBhcmFtZXRlcml6ZWRUeXBlIG5ld1BhcmFtZXRlcml6ZWRUeXBlKFR5cGUgdHlwZSkgewotCQlQYXJhbWV0ZXJpemVkVHlwZSByZXN1bHQgPSBuZXcgUGFyYW1ldGVyaXplZFR5cGUodGhpcyk7Ci0JCXJlc3VsdC5zZXRUeXBlKHR5cGUpOworCXB1YmxpYyBCbG9jayBuZXdCbG9jaygpIHsKKwkJcmV0dXJuIG5ldyBCbG9jayh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGJsb2NrIGNvbW1lbnQgcGxhY2Vob2xkZXIgbm9kZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBub2RlIHR5cGUgaXMgdXNlZCB0byByZWNvcmRpbmcgdGhlIHNvdXJjZQorCSAqIHJhbmdlIHdoZXJlIGEgY29tbWVudCB3YXMgZm91bmQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCisJICogVGhlc2UgY29tbWVudCBub2RlcyBhcmUgbm9ybWFsbHkgZm91bmQgKG9ubHkpIGluCisJICoge0BsaW5rcGxhaW4gQ29tcGlsYXRpb25Vbml0I2dldENvbW1lbnRMaXN0KCkKKwkgKiB0aGUgY29tbWVudCB0YWJsZX0gZm9yIHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYmxvY2sgY29tbWVudCBub2RlCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBCbG9ja0NvbW1lbnQgbmV3QmxvY2tDb21tZW50KCkgeworCQlCbG9ja0NvbW1lbnQgcmVzdWx0ID0gbmV3IEJsb2NrQ29tbWVudCh0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIHR5cGUgbm9kZSB3aXRoCi0JICogdGhlIGdpdmVuIHF1YWxpZmllciB0eXBlIGFuZCBuYW1lLgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBib29sZWFuIGxpdGVyYWwgbm9kZS4KKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiA8Y29kZT5mb28gPSB0cnVlPC9jb2RlPgorCSAqIGlzIGdlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6CisJICogPGNvZGU+CisJICogPHByZT4KKwkgKiBBc3NpZ25tZW50IGU9IGFzdC5uZXdBc3NpZ25tZW50KCk7CisJICogZS5zZXRMZWZ0SGFuZFNpZGUoYXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpKTsKKwkgKiBlLnNldFJpZ2h0SGFuZFNpZGUoYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpKTsKKwkgKiA8L3ByZT4KKwkgKiA8L2NvZGU+CisJICogPC9wPgogCSAqCi0JICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyIHR5cGUgbm9kZQotCSAqIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgbmFtZSBiZWluZyBxdWFsaWZpZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIHR5cGUgbm9kZQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgotCSAqIDx1bD4KLQkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgotCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+Ci0JICogPC91bD4KLQkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KLQkgKiBhIEpMUzIgQVNUCi0JICogQHNpbmNlIDMuMQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgYm9vbGVhbiB2YWx1ZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBib29sZWFuIGxpdGVyYWwgbm9kZQogCSAqLwotCXB1YmxpYyBRdWFsaWZpZWRUeXBlIG5ld1F1YWxpZmllZFR5cGUoVHlwZSBxdWFsaWZpZXIsIFNpbXBsZU5hbWUgbmFtZSkgewotCQlRdWFsaWZpZWRUeXBlIHJlc3VsdCA9IG5ldyBRdWFsaWZpZWRUeXBlKHRoaXMpOwotCQlyZXN1bHQuc2V0UXVhbGlmaWVyKHF1YWxpZmllcik7Ci0JCXJlc3VsdC5zZXROYW1lKG5hbWUpOworCXB1YmxpYyBCb29sZWFuTGl0ZXJhbCBuZXdCb29sZWFuTGl0ZXJhbChib29sZWFuIHZhbHVlKSB7CisJCUJvb2xlYW5MaXRlcmFsIHJlc3VsdCA9IG5ldyBCb29sZWFuTGl0ZXJhbCh0aGlzKTsKKwkJcmVzdWx0LnNldEJvb2xlYW5WYWx1ZSh2YWx1ZSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHdpbGRjYXJkIHR5cGUgbm9kZSB3aXRoIG5vCi0JICogdHlwZSBib3VuZC4KKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgYnJlYWsgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogVGhlIGJyZWFrIHN0YXRlbWVudCBoYXMgbm8gbGFiZWwuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgd2lsZGNhcmQgdHlwZSBub2RlCi0JICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCi0JICogYSBKTFMyIEFTVAotCSAqIEBzaW5jZSAzLjEKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYnJlYWsgc3RhdGVtZW50IG5vZGUKIAkgKi8KLQlwdWJsaWMgV2lsZGNhcmRUeXBlIG5ld1dpbGRjYXJkVHlwZSgpIHsKLQkJV2lsZGNhcmRUeXBlIHJlc3VsdCA9IG5ldyBXaWxkY2FyZFR5cGUodGhpcyk7CisJcHVibGljIEJyZWFrU3RhdGVtZW50IG5ld0JyZWFrU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjYXN0IGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBhbmQgZXhwcmVzc2lvbiBhcmUgdW5zcGVjaWZpZWQKKwkgKiAoYnV0IGxlZ2FsKS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjYXN0IGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBDYXN0RXhwcmVzc2lvbiBuZXdDYXN0RXhwcmVzc2lvbigpIHsKKwkJQ2FzdEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IENhc3RFeHByZXNzaW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBjYXRjaCBjbGF1c2Ugbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgY2F0Y2ggY2xhdXNlIGRlY2xhcmVzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhjZXB0aW9uIGRlY2xhcmF0aW9uIGFuZCBoYXMgYW4gZW1wdHkgYmxvY2suCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2F0Y2ggY2xhdXNlIG5vZGUKKwkgKi8KKwlwdWJsaWMgQ2F0Y2hDbGF1c2UgbmV3Q2F0Y2hDbGF1c2UoKSB7CisJCXJldHVybiBuZXcgQ2F0Y2hDbGF1c2UodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGNoYXJhY3RlciBsaXRlcmFsIG5vZGUuCisJICogSW5pdGlhbGx5IHRoZSBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCBjaGFyYWN0ZXIgbGl0ZXJhbC4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjaGFyYWN0ZXIgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIENoYXJhY3RlckxpdGVyYWwgbmV3Q2hhcmFjdGVyTGl0ZXJhbCgpIHsKKwkJcmV0dXJuIG5ldyBDaGFyYWN0ZXJMaXRlcmFsKHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbgorCSAqICgibmV3IikgZXhwcmVzc2lvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LAorCSAqIHRoZXJlIGlzIG5vIHF1YWxpZnlpbmcgZXhwcmVzc2lvbiwgbm8gdHlwZSBwYXJhbWV0ZXJzLAorCSAqIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUgbmFtZSwgYW4gZW1wdHkgbGlzdCBvZgorCSAqIGFyZ3VtZW50cywgYW5kIGRvZXMgbm90IGRlY2xhcmUgYW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBDbGFzc0luc3RhbmNlQ3JlYXRpb24gbmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgeworCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gcmVzdWx0ID0gbmV3IENsYXNzSW5zdGFuY2VDcmVhdGlvbih0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTE1NjcsMTA2ICsxMjUzLDg3IEBACiAJfQogCiAJLyoqCi0JICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIHBhY2thZ2UgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbml0aWFsbHkgZGVjbGFyZXMgYSBwYWNrYWdlIHdpdGggYW4KLQkgKiB1bnNwZWNpZmllZCBuYW1lLgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGNvbmRpdGlvbiBhbmQgYm90aCBleHByZXNzaW9ucworCSAqIGFyZSB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KIAkgKgotCSAqIEByZXR1cm4gdGhlIG5ldyB1bnBhcmVudGVkIHBhY2thZ2UgZGVjbGFyYXRpb24gbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUKIAkgKi8KLQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIG5ld1BhY2thZ2VEZWNsYXJhdGlvbigpIHsKLQkJUGFja2FnZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBQYWNrYWdlRGVjbGFyYXRpb24odGhpcyk7CisJcHVibGljIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBuZXdDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7CisJCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKHRoaXMpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uIGluaXRpYWxseSBjb250YWlucyBhIHNpbmdsZS10eXBlIGltcG9ydAotCSAqIG9mIGEgdHlwZSB3aXRoIGFuIHVuc3BlY2lmaWVkIG5hbWUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBuZXcgdW5wYXJlbnRlZCBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZQotCSAqLwotCXB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBuZXdJbXBvcnREZWNsYXJhdGlvbigpIHsKLQkJSW1wb3J0RGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBjbGFzcyBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOwotCSAqIG5vIG1vZGlmaWVyczsgbm8gZG9jIGNvbW1lbnQ7IG5vIHN1cGVyY2xhc3Mgb3Igc3VwZXJpbnRlcmZhY2VzOwotCSAqIGFuZCBhbiBlbXB0eSBjbGFzcyBib2R5LgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBhbHRlcm5hdGUgY29uc3RydWN0b3IgKCJ0aGlzKC4uLik7IikgaW52b2NhdGlvbgorCSAqIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgbGlzdHMgb2YgYXJndW1lbnRzCisJICogYW5kIHR5cGUgYXJndW1lbnRzIGFyZSBib3RoIGVtcHR5LgogCSAqIDxwPgotCSAqIFRvIGNyZWF0ZSBhbiBpbnRlcmZhY2UsIHVzZSB0aGlzIG1ldGhvZCBhbmQgdGhlbiBjYWxsCi0JICogPGNvZGU+VHlwZURlY2xhcmF0aW9uLnNldEludGVyZmFjZSh0cnVlKTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRvIGNyZWF0ZSBhbiBlbnVtIGRlY2xhcmF0aW9uLCB1c2UgdGhpcyBtZXRob2QgYW5kIHRoZW4gY2FsbAotCSAqIDxjb2RlPlR5cGVEZWNsYXJhdGlvbi5zZXRFbnVtZXJhdGlvbih0cnVlKTwvY29kZT4uCisJICogTm90ZSB0aGF0IHRoaXMgdHlwZSBvZiBub2RlIGlzIGEgU3RhdGVtZW50LCB3aGVyZWFzIGEgcmVndWxhcgorCSAqIG1ldGhvZCBpbnZvY2F0aW9uIGlzIGFuIEV4cHJlc3Npb24uIFRoZSBvbmx5IHZhbGlkIHVzZSBvZiB0aGVzZQorCSAqIHN0YXRlbWVudHMgYXJlIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBjb25zdHJ1Y3RvciBib2R5LgogCSAqIDwvcD4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0eXBlIGRlY2xhcmF0aW9uIG5vZGUKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUKIAkgKi8KLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIG5ld1R5cGVEZWNsYXJhdGlvbigpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcyk7Ci0JCXJlc3VsdC5zZXRJbnRlcmZhY2UoZmFsc2UpOworCXB1YmxpYyBDb25zdHJ1Y3Rvckludm9jYXRpb24gbmV3Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgeworCQlDb25zdHJ1Y3Rvckludm9jYXRpb24gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgbWV0aG9kIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIG1ldGhvZCBvZiBhbiB1bnNwZWNpZmllZCwgYnV0Ci0JICogbGVnYWwsIG5hbWU7IG5vIG1vZGlmaWVyczsgbm8gZG9jIGNvbW1lbnQ7IG5vIHBhcmFtZXRlcnM7IHJldHVybgotCSAqIHR5cGUgdm9pZDsgbm8gZXh0cmEgYXJyYXkgZGltZW5zaW9uczsgbm8gdGhyb3duIGV4Y2VwdGlvbnM7IGFuZCBubwotCSAqIGJvZHkgKGFzIG9wcG9zZWQgdG8gYW4gZW1wdHkgYm9keSkuCi0JICogPHA+Ci0JICogVG8gY3JlYXRlIGEgY29uc3RydWN0b3IsIHVzZSB0aGlzIG1ldGhvZCBhbmQgdGhlbiBjYWxsCi0JICogPGNvZGU+TWV0aG9kRGVjbGFyYXRpb24uc2V0Q29uc3RydWN0b3IodHJ1ZSk8L2NvZGU+IGFuZAotCSAqIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUoY2xhc3NOYW1lKTwvY29kZT4uCi0JICogPC9wPgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBjb250aW51ZSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBUaGUgY29udGludWUgc3RhdGVtZW50IGhhcyBubyBsYWJlbC4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZXRob2QgZGVjbGFyYXRpb24gbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjb250aW51ZSBzdGF0ZW1lbnQgbm9kZQogCSAqLwotCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBuZXdNZXRob2REZWNsYXJhdGlvbigpIHsKLQkJTWV0aG9kRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMpOwotCQlyZXN1bHQuc2V0Q29uc3RydWN0b3IoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBDb250aW51ZVN0YXRlbWVudCBuZXdDb250aW51ZVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBDb250aW51ZVN0YXRlbWVudCh0aGlzKTsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIHZhcmlhYmxlIHdpdGggYW4gdW5zcGVjaWZpZWQsIGJ1dAotCSAqIGxlZ2FsLCBuYW1lIGFuZCB0eXBlOyBubyBtb2RpZmllcnM7IG5vIGFycmF5IGRpbWVuc2lvbnMgYWZ0ZXIgdGhlCi0JICogdmFyaWFibGU7IG5vIGluaXRpYWxpemVyOyBub3QgdmFyaWFibGUgYXJpdHkuCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHVuaW9uIHR5cGUgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgdW5pb24gdHlwZSBoYXMgbm8gdHlwZXMuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUKKwkgKiBAc2luY2UgMy43LjEKIAkgKi8KLQlwdWJsaWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBuZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCkgewotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBVbmlvblR5cGUgbmV3VW5pb25UeXBlKCkgeworCQlyZXR1cm4gbmV3IFVuaW9uVHlwZSh0aGlzKTsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgbm9kZSBvd25lZCBieSB0aGlzCi0JICogQVNULiBCeSBkZWZhdWx0LCB0aGUgZnJhZ21lbnQgaXMgZm9yIGEgdmFyaWFibGUgd2l0aCBhbiB1bnNwZWNpZmllZCwgYnV0Ci0JICogbGVnYWwsIG5hbWU7IG5vIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IGFuZCBubyBpbml0aWFsaXplci4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCksIGFuZAorCSAqIHRoZSBib2R5IHN0YXRlbWVudCBpcyBhbiBlbXB0eSBibG9jay4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCBub2RlCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGRvIHN0YXRlbWVudCBub2RlCiAJICovCi0JcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBuZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCByZXN1bHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBEb1N0YXRlbWVudCBuZXdEb1N0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBEb1N0YXRlbWVudCh0aGlzKTsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgaW5pdGlhbGl6ZXIgbm9kZSBvd25lZCBieSB0aGlzIEFTVCwgd2l0aCBhbgotCSAqIGVtcHR5IGJsb2NrLiBCeSBkZWZhdWx0LCB0aGUgaW5pdGlhbGl6ZXIgaGFzIG5vIG1vZGlmaWVycyBhbmQKLQkgKiBhbiBlbXB0eSBibG9jay4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZW1wdHkgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgaW5pdGlhbGl6ZXIgbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBlbXB0eSBzdGF0ZW1lbnQgbm9kZQogCSAqLwotCXB1YmxpYyBJbml0aWFsaXplciBuZXdJbml0aWFsaXplcigpIHsKLQkJSW5pdGlhbGl6ZXIgcmVzdWx0ID0gbmV3IEluaXRpYWxpemVyKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBFbXB0eVN0YXRlbWVudCBuZXdFbXB0eVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZW5oYW5jZWQgZm9yIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBwYXJhbXRlciBhbmQgZXhwcmVzc2lvbiBhcmUgdW5zcGVjaWZpZWQKKwkgKiBidXQgbGVnYWwgc3VidHJlZXMsIGFuZCB0aGUgYm9keSBpcyBhbiBlbXB0eSBibG9jay4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0aHJvdyBzdGF0ZW1lbnQgbm9kZQorCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgorCSAqIGEgSkxTMiBBU1QKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIEVuaGFuY2VkRm9yU3RhdGVtZW50IG5ld0VuaGFuY2VkRm9yU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IEVuaGFuY2VkRm9yU3RhdGVtZW50KHRoaXMpOwogCX0KIAogCS8qKgpAQCAtMTcwMyw0NyArMTM3MCwyOTkgQEAKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBwYXJhbWV0ZXIgdHlwZSBub2RlIHdpdGggYW4KLQkgKiB1bnNwZWNpZmllZCB0eXBlIHZhcmlhYmxlIG5hbWUgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgdHlwZSBib3VuZHMuCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGV4cHJlc3Npb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QsCisJICogZm9yIHRoZSBnaXZlbiBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW4gZXhwcmVzc2lvbgorCSAqICg8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikgaW50byBhIHN0YXRlbWVudCAoPGNvZGU+VHlwZTwvY29kZT4pCisJICogYnkgd3JhcHBpbmcgaXQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIHJlc3VsdCBpcyBvbmx5IGxlZ2FsIGZvcgorCSAqIGxpbWl0ZWQgZXhwcmVzc2lvbiB0eXBlcywgaW5jbHVkaW5nIG1ldGhvZCBpbnZvY2F0aW9ucywgYXNzaWdubWVudHMsCisJICogYW5kIGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0aW9ucy4KKwkgKiA8L3A+CiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBwYXJhbWV0ZXIgbm9kZQotCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgotCSAqIGEgSkxTMiBBU1QKLQkgKiBAc2luY2UgMy4xCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24KKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3RhdGVtZW50IG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CiAJICovCi0JcHVibGljIFR5cGVQYXJhbWV0ZXIgbmV3VHlwZVBhcmFtZXRlcigpIHsKLQkJVHlwZVBhcmFtZXRlciByZXN1bHQgPSBuZXcgVHlwZVBhcmFtZXRlcih0aGlzKTsKKwlwdWJsaWMgRXhwcmVzc2lvblN0YXRlbWVudCBuZXdFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlFeHByZXNzaW9uU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9uCi0JICogbm9kZSBmb3IgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBqYXZhZG9jOwotCSAqIGFuZCBhbiBlbXB0eSBsaXN0IG9mIG1lbWJlciBkZWNsYXJhdGlvbnMuCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gYW5kIGZpZWxkIGFyZSBib3RoCisJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZXMuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9uIG5vZGUKLQkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KLQkgKiBhIEpMUzIgQVNUCi0JICogQHNpbmNlIDMuMQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCiAJICovCi0JcHVibGljIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbmV3QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpIHsKLQkJQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbih0aGlzKTsKKwlwdWJsaWMgRmllbGRBY2Nlc3MgbmV3RmllbGRBY2Nlc3MoKSB7CisJCUZpZWxkQWNjZXNzIHJlc3VsdCA9IG5ldyBGaWVsZEFjY2Vzcyh0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYW5ub3RhdGlvbiB0eXBlCi0JICogbWVtYmVyIGRlY2xhcmF0aW9uIG5vZGUgZm9yIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCi0JICogbWVtYmVyIG5hbWUgYW5kIHR5cGU7IG5vIG1vZGlmaWVyczsgbm8gamF2YWRvYzsKLQkgKiBhbmQgbm8gZGVmYXVsdCB2YWx1ZS4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZmllbGQgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVCwKKwkgKiBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50LiBCeSBkZWZhdWx0LCB0aGVyZSBhcmUgbm8KKwkgKiBtb2RpZmllcnMsIG5vIGRvYyBjb21tZW50LCBhbmQgdGhlIGJhc2UgdHlwZSBpcyB1bnNwZWNpZmllZAorCSAqIChidXQgbGVnYWwpLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHdyYXAgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudAorCSAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgZmllbGQgZGVjbGFyYXRpb24KKwkgKiBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uIGluIHRoZSBib2R5IG9mIGEgdHlwZSBkZWNsYXJhdGlvbgorCSAqICg8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPiBpbXBsZW1lbnRzIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT4pLgorCSAqIEFkZGl0aW9uYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGNhbiBiZSBhZGRlZCBhZnRlcndhcmRzLgorCSAqIDwvcD4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyIGRlY2xhcmF0aW9uIG5vZGUKKwkgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50CisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGZpZWxkIGRlY2xhcmF0aW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDxsaT50aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgbnVsbDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBuZXdGaWVsZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgeworCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCUZpZWxkRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEZpZWxkRGVjbGFyYXRpb24odGhpcyk7CisJCXJlc3VsdC5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBmb3Igc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlcmUgYXJlIG5vIGluaXRpYWxpemVycywgbm8gY29uZGl0aW9uIGV4cHJlc3Npb24sCisJICogbm8gdXBkYXRlcnMsIGFuZCB0aGUgYm9keSBpcyBhbiBlbXB0eSBibG9jay4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBmb3Igc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgRm9yU3RhdGVtZW50IG5ld0ZvclN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnQodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGlmIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLAorCSAqIHRoZSB0aGVuIHN0YXRlbWVudCBpcyBhbiBlbXB0eSBibG9jaywgYW5kIHRoZXJlIGlzIG5vIGVsc2Ugc3RhdGVtZW50LgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGlmIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIElmU3RhdGVtZW50IG5ld0lmU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IElmU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uIGluaXRpYWxseSBjb250YWlucyBhIHNpbmdsZS10eXBlIGltcG9ydAorCSAqIG9mIGEgdHlwZSB3aXRoIGFuIHVuc3BlY2lmaWVkIG5hbWUuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdW5wYXJlbnRlZCBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZQorCSAqLworCXB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBuZXdJbXBvcnREZWNsYXJhdGlvbigpIHsKKwkJSW1wb3J0RGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBpbmZpeCBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG9wZXJhdG9yIGFuZCBsZWZ0IGFuZCByaWdodAorCSAqIG9wZXJhbmQgYXJlIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLCBhbmQgdGhlcmUgYXJlIG5vIGV4dGVuZGVkCisJICogb3BlcmFuZHMuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgaW5maXggZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEluZml4RXhwcmVzc2lvbiBuZXdJbmZpeEV4cHJlc3Npb24oKSB7CisJCUluZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5maXhFeHByZXNzaW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBpbml0aWFsaXplciBub2RlIG93bmVkIGJ5IHRoaXMgQVNULCB3aXRoIGFuCisJICogZW1wdHkgYmxvY2suIEJ5IGRlZmF1bHQsIHRoZSBpbml0aWFsaXplciBoYXMgbm8gbW9kaWZpZXJzIGFuZAorCSAqIGFuIGVtcHR5IGJsb2NrLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGluaXRpYWxpemVyIG5vZGUKKwkgKi8KKwlwdWJsaWMgSW5pdGlhbGl6ZXIgbmV3SW5pdGlhbGl6ZXIoKSB7CisJCUluaXRpYWxpemVyIHJlc3VsdCA9IG5ldyBJbml0aWFsaXplcih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgaW5zdGFuY2VvZiBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG9wZXJhdG9yIGFuZCBsZWZ0IGFuZCByaWdodAorCSAqIG9wZXJhbmQgYXJlIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGluc3RhbmNlb2YgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEluc3RhbmNlb2ZFeHByZXNzaW9uIG5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCkgeworCQlJbnN0YW5jZW9mRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBkb2MgY29tbWVudCBub2RlLgorCSAqIEluaXRpYWxseSB0aGUgbmV3IG5vZGUgaGFzIGFuIGVtcHR5IGxpc3Qgb2YgdGFnIGVsZW1lbnRzCisJICogKGFuZCwgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LCBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIGRvYyBjb21tZW50IHN0cmluZykKKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBkb2MgY29tbWVudCBub2RlCisJICovCisJcHVibGljIEphdmFkb2MgbmV3SmF2YWRvYygpIHsKKwkJSmF2YWRvYyByZXN1bHQgPSBuZXcgSmF2YWRvYyh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbGFiZWxlZCBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgbGFiZWwgYW5kIHN0YXRlbWVudCBhcmUgYm90aCB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGxhYmVsZWQgc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgTGFiZWxlZFN0YXRlbWVudCBuZXdMYWJlbGVkU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IExhYmVsZWRTdGF0ZW1lbnQodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBsaW5lIGNvbW1lbnQgcGxhY2Vob2xkZXIgbm9kZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBub2RlIHR5cGUgaXMgdXNlZCB0byByZWNvcmRpbmcgdGhlIHNvdXJjZQorCSAqIHJhbmdlIHdoZXJlIGEgY29tbWVudCB3YXMgZm91bmQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCisJICogVGhlc2UgY29tbWVudCBub2RlcyBhcmUgbm9ybWFsbHkgZm91bmQgKG9ubHkpIGluCisJICoge0BsaW5rcGxhaW4gQ29tcGlsYXRpb25Vbml0I2dldENvbW1lbnRMaXN0KCkKKwkgKiB0aGUgY29tbWVudCB0YWJsZX0gZm9yIHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbGluZSBjb21tZW50IG5vZGUKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIExpbmVDb21tZW50IG5ld0xpbmVDb21tZW50KCkgeworCQlMaW5lQ29tbWVudCByZXN1bHQgPSBuZXcgTGluZUNvbW1lbnQodGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG1hcmtlciBhbm5vdGF0aW9uIG5vZGUgd2l0aAorCSAqIGFuIHVuc3BlY2lmaWVkIHR5cGUgbmFtZS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtYXJrZXIgYW5ub3RhdGlvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBuZXdBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKCkgewotCQlBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKHRoaXMpOworCXB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oKSB7CisJCU1hcmtlckFubm90YXRpb24gcmVzdWx0ID0gbmV3IE1hcmtlckFubm90YXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBtZW1iZXIgcmVmZXJlbmNlIG5vZGUuCisJICogSW5pdGlhbGx5IHRoZSBuZXcgbm9kZSBoYXMgbm8gcXVhbGlmaWVyIG5hbWUgYW5kCisJICogYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbWVtYmVyIG5hbWUuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgbm9kZSB0eXBlIGlzIHVzZWQgb25seSBpbnNpZGUgZG9jIGNvbW1lbnRzCisJICogKHtAbGluayBKYXZhZG9jfSkuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG1lbWJlciByZWZlcmVuY2Ugbm9kZQorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgTWVtYmVyUmVmIG5ld01lbWJlclJlZigpIHsKKwkJTWVtYmVyUmVmIHJlc3VsdCA9IG5ldyBNZW1iZXJSZWYodGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPTU1FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG1lbWJlciB2YWx1ZSBwYWlyIG5vZGUgd2l0aAorCSAqIGFuIHVuc3BlY2lmaWVkIG1lbWJlciBuYW1lIGFuZCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZW1iZXIgdmFsdWUgcGFpciBub2RlCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCisJICogYSBKTFMyIEFTVAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcigpIHsKKwkJTWVtYmVyVmFsdWVQYWlyIHJlc3VsdCA9IG5ldyBNZW1iZXJWYWx1ZVBhaXIodGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIG1ldGhvZCBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBkZWNsYXJhdGlvbiBpcyBmb3IgYSBtZXRob2Qgb2YgYW4gdW5zcGVjaWZpZWQsIGJ1dAorCSAqIGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGRvYyBjb21tZW50OyBubyBwYXJhbWV0ZXJzOyByZXR1cm4KKwkgKiB0eXBlIHZvaWQ7IG5vIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IG5vIHRocm93biBleGNlcHRpb25zOyBhbmQgbm8KKwkgKiBib2R5IChhcyBvcHBvc2VkIHRvIGFuIGVtcHR5IGJvZHkpLgorCSAqIDxwPgorCSAqIFRvIGNyZWF0ZSBhIGNvbnN0cnVjdG9yLCB1c2UgdGhpcyBtZXRob2QgYW5kIHRoZW4gY2FsbAorCSAqIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uLnNldENvbnN0cnVjdG9yKHRydWUpPC9jb2RlPiBhbmQKKwkgKiA8Y29kZT5NZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGNsYXNzTmFtZSk8L2NvZGU+LgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZXRob2QgZGVjbGFyYXRpb24gbm9kZQorCSAqLworCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBuZXdNZXRob2REZWNsYXJhdGlvbigpIHsKKwkJTWV0aG9kRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMpOworCQlyZXN1bHQuc2V0Q29uc3RydWN0b3IoZmFsc2UpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhpcworCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKQorCSAqIHRoZXJlIGlzIG5vIHJlY2VpdmVyIGV4cHJlc3Npb24sIG5vIHR5cGUgYXJndW1lbnRzLCBhbmQgdGhlIGxpc3Qgb2YKKwkgKiBhcmd1bWVudHMgaXMgZW1wdHkuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIE1ldGhvZEludm9jYXRpb24gbmV3TWV0aG9kSW52b2NhdGlvbigpIHsKKwkJTWV0aG9kSW52b2NhdGlvbiByZXN1bHQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG1ldGhvZCByZWZlcmVuY2Ugbm9kZS4KKwkgKiBJbml0aWFsbHkgdGhlIG5ldyBub2RlIGhhcyBubyBxdWFsaWZpZXIgbmFtZSwKKwkgKiBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBtZXRob2QgbmFtZSwgYW5kIGFuCisJICogZW1wdHkgcGFyYW1ldGVyIGxpc3QuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgbm9kZSB0eXBlIGlzIHVzZWQgb25seSBpbnNpZGUgZG9jIGNvbW1lbnRzCisJICogKHtAbGluayBKYXZhZG9jIEphdmFkb2N9KS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbWV0aG9kIHJlZmVyZW5jZSBub2RlCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBNZXRob2RSZWYgbmV3TWV0aG9kUmVmKCkgeworCQlNZXRob2RSZWYgcmVzdWx0ID0gbmV3IE1ldGhvZFJlZih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG1ldGhvZCByZWZlcmVuY2Ugbm9kZS4KKwkgKiBJbml0aWFsbHkgdGhlIG5ldyBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIHR5cGUsIG5vdCB2YXJpYWJsZSBhcml0eSwgYW5kIG5vIHBhcmFtZXRlciBuYW1lLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIG5vZGUgdHlwZSBpcyB1c2VkIG9ubHkgaW5zaWRlIGRvYyBjb21tZW50cworCSAqICh7QGxpbmsgSmF2YWRvY30pLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZXRob2QgcmVmZXJlbmNlIHBhcmFtZXRlciBub2RlCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBNZXRob2RSZWZQYXJhbWV0ZXIgbmV3TWV0aG9kUmVmUGFyYW1ldGVyKCkgeworCQlNZXRob2RSZWZQYXJhbWV0ZXIgcmVzdWx0ID0gbmV3IE1ldGhvZFJlZlBhcmFtZXRlcih0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTE4MjAsNTggKzE3MzksNDQyIEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPTU1FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PQotCiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBibG9jayBjb21tZW50IHBsYWNlaG9sZGVyIG5vZGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbm9kZSB0eXBlIGlzIHVzZWQgdG8gcmVjb3JkaW5nIHRoZSBzb3VyY2UKLQkgKiByYW5nZSB3aGVyZSBhIGNvbW1lbnQgd2FzIGZvdW5kIGluIHRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIFRoZXNlIGNvbW1lbnQgbm9kZXMgYXJlIG5vcm1hbGx5IGZvdW5kIChvbmx5KSBpbgotCSAqIHtAbGlua3BsYWluIENvbXBpbGF0aW9uVW5pdCNnZXRDb21tZW50TGlzdCgpCi0JICogdGhlIGNvbW1lbnQgdGFibGV9IGZvciBwYXJzZWQgY29tcGlsYXRpb24gdW5pdHMuCi0JICogPC9wPgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBuYW1lIG5vZGUgZm9yIHRoZSBnaXZlbiBuYW1lLgorCSAqIFRoZSBuYW1lIHN0cmluZyBtdXN0IGNvbnNpc3Qgb2YgMSBvciBtb3JlIG5hbWUgc2VnbWVudHMgc2VwYXJhdGVkCisJICogYnkgc2luZ2xlIGRvdHMgJy4nLiBSZXR1cm5zIGEge0BsaW5rIFF1YWxpZmllZE5hbWV9IGlmIHRoZSBuYW1lIGhhcworCSAqIGRvdHMsIGFuZCBhIHtAbGluayBTaW1wbGVOYW1lfSBvdGhlcndpc2UuIEVhY2ggb2YgdGhlIG5hbWUKKwkgKiBzZWdtZW50cyBzaG91bGQgYmUgbGVnYWwgSmF2YSBpZGVudGlmaWVycyAodGhpcyBjb25zdHJhaW50IG1heSBvciBtYXkKKwkgKiBub3QgYmUgZW5mb3JjZWQpLCBhbmQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbmFtZSBzZWdtZW50LgorCSAqIFRoZSBzdHJpbmcgbXVzdCBub3QgY29udGFpbnMgd2hpdGUgc3BhY2UsICcmbHQ7JywgJyZndDsnLAorCSAqICdbJywgJ10nLCBvciBvdGhlciBhbnkgb3RoZXIgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QKKwkgKiBwYXJ0IG9mIHRoZSBKYXZhIGlkZW50aWZpZXJzIG9yIHNlcGFyYXRpbmcgJy4ncy4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBibG9jayBjb21tZW50IG5vZGUKLQkgKiBAc2luY2UgMy4wCisJICogQHBhcmFtIHF1YWxpZmllZE5hbWUgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgMSBvciBtb3JlIG5hbWUgc2VnbWVudHMsCisJICogZWFjaCBvZiB3aGljaCBpcyBhIGxlZ2FsIEphdmEgaWRlbnRpZmllciwgc2VwYXJhdGVkICBieSBzaW5nbGUgZG90cyAnLicKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbmFtZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgc3RyaW5nIGlzIGVtcHR5PC9saT4KKwkgKiA8bGk+dGhlIHN0cmluZyBiZWdpbnMgb3IgZW5kcyBpbiBhICcuJzwvbGk+CisJICogPGxpPnRoZSBzdHJpbmcgaGFzIGFkamFjZW50ICcuJ3M8L2xpPgorCSAqIDxsaT50aGUgc2VnbWVudHMgYmV0d2VlbiB0aGUgJy4ncyBhcmUgbm90IHZhbGlkIEphdmEgaWRlbnRpZmllcnM8L2xpPgorCSAqIDwvdWw+CisJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBCbG9ja0NvbW1lbnQgbmV3QmxvY2tDb21tZW50KCkgewotCQlCbG9ja0NvbW1lbnQgcmVzdWx0ID0gbmV3IEJsb2NrQ29tbWVudCh0aGlzKTsKKwlwdWJsaWMgTmFtZSBuZXdOYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisJCVN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihxdWFsaWZpZWROYW1lLCAiLiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCU5hbWUgcmVzdWx0ID0gbnVsbDsKKwkJLy8gYmFsYW5jZSBpcyAjIG9mIG5hbWUgdG9rZW5zIC0gIyBvZiBwZXJpb2QgdG9rZW5zIHNlZW4gc28gZmFyCisJCS8vIGluaXRpYWxseSAwOyBmaW5hbGx5IDE7IHNob3VsZCBuZXZlciBkcm9wIDwgMCBvciA+IDEKKwkJaW50IGJhbGFuY2UgPSAwOworCQl3aGlsZSh0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIHMgPSB0Lm5leHRUb2tlbigpOworCQkJaWYgKHMuaW5kZXhPZignLicpID49IDApIHsKKwkJCQkvLyB0aGlzIGlzIGEgZGVsaW1pdGVyCisJCQkJaWYgKHMubGVuZ3RoKCkgPiAxKSB7CisJCQkJCS8vIHRvbyBtYW55IGRvdHMgaW4gYSByb3cKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCQliYWxhbmNlLS07CisJCQkJaWYgKGJhbGFuY2UgPCAwKSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHRoaXMgaXMgYW4gaWRlbnRpZmllciBzZWdtZW50CisJCQkJYmFsYW5jZSsrOworCQkJCVNpbXBsZU5hbWUgbmFtZSA9IG5ld1NpbXBsZU5hbWUocyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJCXJlc3VsdCA9IG5hbWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gbmV3UXVhbGlmaWVkTmFtZShyZXN1bHQsIG5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYmFsYW5jZSAhPSAxKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGxpbmUgY29tbWVudCBwbGFjZWhvbGRlciBub2RlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5vZGUgdHlwZSBpcyB1c2VkIHRvIHJlY29yZGluZyB0aGUgc291cmNlCi0JICogcmFuZ2Ugd2hlcmUgYSBjb21tZW50IHdhcyBmb3VuZCBpbiB0aGUgc291cmNlIHN0cmluZy4KLQkgKiBUaGVzZSBjb21tZW50IG5vZGVzIGFyZSBub3JtYWxseSBmb3VuZCAob25seSkgaW4KLQkgKiB7QGxpbmtwbGFpbiBDb21waWxhdGlvblVuaXQjZ2V0Q29tbWVudExpc3QoKQotCSAqIHRoZSBjb21tZW50IHRhYmxlfSBmb3IgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXRzLgotCSAqIDwvcD4KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbmFtZSBub2RlIGZvciB0aGUgZ2l2ZW4gbmFtZQorCSAqIHNlZ21lbnRzLiBSZXR1cm5zIGEgc2ltcGxlIG5hbWUgaWYgdGhlcmUgaXMgb25seSBvbmUgbmFtZSBzZWdtZW50LCBhbmQKKwkgKiBhIHF1YWxpZmllZCBuYW1lIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBuYW1lIHNlZ21lbnRzLiBFYWNoIG9mIHRoZSBuYW1lCisJICogc2VnbWVudHMgc2hvdWxkIGJlIGxlZ2FsIEphdmEgaWRlbnRpZmllcnMgKHRoaXMgY29uc3RyYWludCBtYXkgb3IgbWF5CisJICogbm90IGJlIGVuZm9yY2VkKSwgYW5kIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG5hbWUgc2VnbWVudC4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBsaW5lIGNvbW1lbnQgbm9kZQotCSAqIEBzaW5jZSAzLjAKKwkgKiBAcGFyYW0gaWRlbnRpZmllcnMgYSBsaXN0IG9mIDEgb3IgbW9yZSBuYW1lIHNlZ21lbnRzLCBlYWNoIG9mIHdoaWNoCisJICogICAgaXMgYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbmFtZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgaWRlbnRpZmllciBpcyBpbnZhbGlkPC9saT4KKwkgKiA8bGk+dGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgZW1wdHk8L2xpPgorCSAqIDwvdWw+CiAJICovCi0JcHVibGljIExpbmVDb21tZW50IG5ld0xpbmVDb21tZW50KCkgewotCQlMaW5lQ29tbWVudCByZXN1bHQgPSBuZXcgTGluZUNvbW1lbnQodGhpcyk7CisJcHVibGljIE5hbWUgbmV3TmFtZShTdHJpbmdbXSBpZGVudGlmaWVycykgeworCQkvLyB1cGRhdGUgaW50ZXJuYWxTZXROYW1lKFN0cmluZ1tdIGlmIGNoYW5nZWQKKwkJaW50IGNvdW50ID0gaWRlbnRpZmllcnMubGVuZ3RoOworCQlpZiAoY291bnQgPT0gMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCU5hbWUgcmVzdWx0ID0gbmV3U2ltcGxlTmFtZShpZGVudGlmaWVyc1swXSk7CisJCWZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworCQkJU2ltcGxlTmFtZSBuYW1lID0gbmV3U2ltcGxlTmFtZShpZGVudGlmaWVyc1tpXSk7CisJCQlyZXN1bHQgPSBuZXdRdWFsaWZpZWROYW1lKHJlc3VsdCwgbmFtZSk7CisJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGRvYyBjb21tZW50IG5vZGUuCi0JICogSW5pdGlhbGx5IHRoZSBuZXcgbm9kZSBoYXMgYW4gZW1wdHkgbGlzdCBvZiB0YWcgZWxlbWVudHMKLQkgKiAoYW5kLCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHksIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCi0JICogZG9jIGNvbW1lbnQgc3RyaW5nKQorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlIHdpdGgKKwkgKiBhbiB1bnNwZWNpZmllZCB0eXBlIG5hbWUgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgbWVtYmVyIHZhbHVlCisJICogcGFpcnMuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZG9jIGNvbW1lbnQgbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCisJICogYSBKTFMyIEFTVAorCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgSmF2YWRvYyBuZXdKYXZhZG9jKCkgewotCQlKYXZhZG9jIHJlc3VsdCA9IG5ldyBKYXZhZG9jKHRoaXMpOworCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oKSB7CisJCU5vcm1hbEFubm90YXRpb24gcmVzdWx0ID0gbmV3IE5vcm1hbEFubm90YXRpb24odGhpcyk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIE51bGxMaXRlcmFsIG5ld051bGxMaXRlcmFsKCkgeworCQlyZXR1cm4gbmV3IE51bGxMaXRlcmFsKHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBudW1iZXIgbGl0ZXJhbCBub2RlLgorCSAqIEluaXRpYWxseSB0aGUgbnVtYmVyIGxpdGVyYWwgdG9rZW4gaXMgPGNvZGU+IjAiPC9jb2RlPi4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBudW1iZXIgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIE51bWJlckxpdGVyYWwgbmV3TnVtYmVyTGl0ZXJhbCgpIHsKKwkJTnVtYmVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbnVtYmVyIGxpdGVyYWwgbm9kZS4KKwkgKgorCSAqIEBwYXJhbSBsaXRlcmFsIHRoZSB0b2tlbiBmb3IgdGhlIG51bWVyaWMgbGl0ZXJhbCBhcyBpdCB3b3VsZAorCSAqICAgIGFwcGVhciBpbiBKYXZhIHNvdXJjZSBjb2RlCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG51bWJlciBsaXRlcmFsIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGl0ZXJhbCBpcyBudWxsCisJICovCisJcHVibGljIE51bWJlckxpdGVyYWwgbmV3TnVtYmVyTGl0ZXJhbChTdHJpbmcgbGl0ZXJhbCkgeworCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJTnVtYmVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzKTsKKwkJcmVzdWx0LnNldFRva2VuKGxpdGVyYWwpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogVGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gaW5pdGlhbGx5IGRlY2xhcmVzIGEgcGFja2FnZSB3aXRoIGFuCisJICogdW5zcGVjaWZpZWQgbmFtZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG5ldyB1bnBhcmVudGVkIHBhY2thZ2UgZGVjbGFyYXRpb24gbm9kZQorCSAqLworCXB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gbmV3UGFja2FnZURlY2xhcmF0aW9uKCkgeworCQlQYWNrYWdlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcGFyYW1ldGVyaXplZCB0eXBlIG5vZGUgd2l0aCB0aGUKKwkgKiBnaXZlbiB0eXBlIGFuZCBhbiBlbXB0eSBsaXN0IG9mIHR5cGUgYXJndW1lbnRzLgorCSAqCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgdGhhdCBpcyBwYXJhbWV0ZXJpemVkCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHBhcmFtZXRlcml6ZWQgdHlwZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgorCSAqIGEgSkxTMiBBU1QKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIFBhcmFtZXRlcml6ZWRUeXBlIG5ld1BhcmFtZXRlcml6ZWRUeXBlKFR5cGUgdHlwZSkgeworCQlQYXJhbWV0ZXJpemVkVHlwZSByZXN1bHQgPSBuZXcgUGFyYW1ldGVyaXplZFR5cGUodGhpcyk7CisJCXJlc3VsdC5zZXRUeXBlKHR5cGUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBuZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKKwkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBwb3N0Zml4IGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIG9wZXJhbmQgYXJlCisJICogdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcG9zdGZpeCBleHByZXNzaW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgUG9zdGZpeEV4cHJlc3Npb24gbmV3UG9zdGZpeEV4cHJlc3Npb24oKSB7CisJCVBvc3RmaXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcHJlZml4IGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIG9wZXJhbmQgYXJlCisJICogdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcHJlZml4IGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBQcmVmaXhFeHByZXNzaW9uIG5ld1ByZWZpeEV4cHJlc3Npb24oKSB7CisJCVByZWZpeEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFByZWZpeEV4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHByaW1pdGl2ZSB0eXBlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4KKwkgKiB0eXBlIGNvZGUuCisJICoKKwkgKiBAcGFyYW0gdHlwZUNvZGUgb25lIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvbnN0YW50cyBkZWNsYXJlZCBpbgorCSAqICAgIDxjb2RlPlByaW1pdGl2ZVR5cGU8L2NvZGU+CisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHByaW1pdGl2ZSB0eXBlIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZSBpcyBpbnZhbGlkCisJICovCisJcHVibGljIFByaW1pdGl2ZVR5cGUgbmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkNvZGUgdHlwZUNvZGUpIHsKKwkJUHJpbWl0aXZlVHlwZSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlVHlwZSh0aGlzKTsKKwkJcmVzdWx0LnNldFByaW1pdGl2ZVR5cGVDb2RlKHR5cGVDb2RlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIG5hbWUgbm9kZSBmb3IgdGhlIGdpdmVuCisJICogcXVhbGlmaWVyIGFuZCBzaW1wbGUgbmFtZSBjaGlsZCBub2RlLgorCSAqCisJICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZQorCSAqIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgbmFtZSBiZWluZyBxdWFsaWZpZWQKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIG5hbWUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgUXVhbGlmaWVkTmFtZSBuZXdRdWFsaWZpZWROYW1lKAorCQlOYW1lIHF1YWxpZmllciwKKwkJU2ltcGxlTmFtZSBuYW1lKSB7CisJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZE5hbWUodGhpcyk7CisJCXJlc3VsdC5zZXRRdWFsaWZpZXIocXVhbGlmaWVyKTsKKwkJcmVzdWx0LnNldE5hbWUobmFtZSk7CisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIHR5cGUgbm9kZSB3aXRoCisJICogdGhlIGdpdmVuIHF1YWxpZmllciB0eXBlIGFuZCBuYW1lLgorCSAqCisJICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyIHR5cGUgbm9kZQorCSAqIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgbmFtZSBiZWluZyBxdWFsaWZpZWQKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIHR5cGUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KKwkgKiBhIEpMUzIgQVNUCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBRdWFsaWZpZWRUeXBlIG5ld1F1YWxpZmllZFR5cGUoVHlwZSBxdWFsaWZpZXIsIFNpbXBsZU5hbWUgbmFtZSkgeworCQlRdWFsaWZpZWRUeXBlIHJlc3VsdCA9IG5ldyBRdWFsaWZpZWRUeXBlKHRoaXMpOworCQlyZXN1bHQuc2V0UXVhbGlmaWVyKHF1YWxpZmllcik7CisJCXJlc3VsdC5zZXROYW1lKG5hbWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCByZXR1cm4gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIHJldHVybiBzdGF0ZW1lbnQgaGFzIG5vIGV4cHJlc3Npb24uCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcmV0dXJuIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIFJldHVyblN0YXRlbWVudCBuZXdSZXR1cm5TdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBOQU1FUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgc2ltcGxlIG5hbWUgbm9kZSBmb3IgdGhlIGdpdmVuCisJICogaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGEgbGVnYWwgSmF2YSBpZGVudGlmaWVyLCBidXQgbm90CisJICogYSBrZXl3b3JkLCBib29sZWFuIGxpdGVyYWwgKCJ0cnVlIiwgImZhbHNlIikgb3IgbnVsbCBsaXRlcmFsICgibnVsbCIpLgorCSAqCisJICogQHBhcmFtIGlkZW50aWZpZXIgdGhlIGlkZW50aWZpZXIKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2ltcGxlIG5hbWUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpZGVudGlmaWVyIGlzIGludmFsaWQKKwkgKi8KKwlwdWJsaWMgU2ltcGxlTmFtZSBuZXdTaW1wbGVOYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7CisJCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlTaW1wbGVOYW1lIHJlc3VsdCA9IG5ldyBTaW1wbGVOYW1lKHRoaXMpOworCQlyZXN1bHQuc2V0SWRlbnRpZmllcihpZGVudGlmaWVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVFlQRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHNpbXBsZSB0eXBlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4KKwkgKiB0eXBlIG5hbWUuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIG5hbWUgKDxjb2RlPk5hbWU8L2NvZGU+KSBpbnRvIGEKKwkgKiB0eXBlICg8Y29kZT5UeXBlPC9jb2RlPikgYnkgd3JhcHBpbmcgaXQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHR5cGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2ltcGxlIHR5cGUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgU2ltcGxlVHlwZSBuZXdTaW1wbGVUeXBlKE5hbWUgdHlwZU5hbWUpIHsKKwkJU2ltcGxlVHlwZSByZXN1bHQgPSBuZXcgU2ltcGxlVHlwZSh0aGlzKTsKKwkJcmVzdWx0LnNldE5hbWUodHlwZU5hbWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gbm9kZSB3aXRoCisJICogYW4gdW5zcGVjaWZpZWQgdHlwZSBuYW1lIGFuZCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gbm9kZQorCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgorCSAqIGEgSkxTMiBBU1QKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKKwkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIHZhcmlhYmxlIHdpdGggYW4gdW5zcGVjaWZpZWQsIGJ1dAorCSAqIGxlZ2FsLCBuYW1lIGFuZCB0eXBlOyBubyBtb2RpZmllcnM7IG5vIGFycmF5IGRpbWVuc2lvbnMgYWZ0ZXIgdGhlCisJICogdmFyaWFibGU7IG5vIGluaXRpYWxpemVyOyBub3QgdmFyaWFibGUgYXJpdHkuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBuZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCkgeworCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFBSRVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgc3RyaW5nIGxpdGVyYWwgbm9kZSBmb3IKKwkgKiB0aGUgZW1wdHkgc3RyaW5nIGxpdGVyYWwuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3RyaW5nIGxpdGVyYWwgbm9kZQorCSAqLworCXB1YmxpYyBTdHJpbmdMaXRlcmFsIG5ld1N0cmluZ0xpdGVyYWwoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nTGl0ZXJhbCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgYWx0ZXJuYXRlIHN1cGVyIGNvbnN0cnVjdG9yICgic3VwZXIoLi4uKTsiKQorCSAqIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vCisJICogcXVhbGlmaWVyLCBubyB0eXBlIGFyZ3VtZW50cywgYW5kIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBpcyBlbXB0eS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyB0eXBlIG9mIG5vZGUgaXMgYSBTdGF0ZW1lbnQsIHdoZXJlYXMgYSByZWd1bGFyCisJICogc3VwZXIgbWV0aG9kIGludm9jYXRpb24gaXMgYW4gRXhwcmVzc2lvbi4gVGhlIG9ubHkgdmFsaWQgdXNlIG9mIHRoZXNlCisJICogc3RhdGVtZW50cyBhcmUgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIGNvbnN0cnVjdG9yIGJvZHkuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbmV3U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oKSB7CisJCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9CisJCQluZXcgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHN1cGVyIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gYW5kIGZpZWxkIGFyZSBib3RoCisJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZXMuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3VwZXIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBTdXBlckZpZWxkQWNjZXNzIG5ld1N1cGVyRmllbGRBY2Nlc3MoKSB7CisJCVN1cGVyRmllbGRBY2Nlc3MgcmVzdWx0ID0gbmV3IFN1cGVyRmllbGRBY2Nlc3ModGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkICJzdXBlciIgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiBub2RlIG93bmVkIGJ5CisJICogdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkKKwkgKiB0aGVyZSBpcyBubyBxdWFsaWZpZXIsIG5vIHR5cGUgYXJndW1lbnRzLCBhbmQgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGlzIGVtcHR5LgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkICAic3VwZXIiIG1ldGhvZCBpbnZvY2F0aW9uCisJICogICAgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBuZXdTdXBlck1ldGhvZEludm9jYXRpb24oKSB7CisJCVN1cGVyTWV0aG9kSW52b2NhdGlvbiByZXN1bHQgPSBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzd2l0Y2ggY2FzZSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieQorCSAqIHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLgorCSAqCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN3aXRjaCBjYXNlIG5vZGUKKwkgKi8KKwlwdWJsaWMgU3dpdGNoQ2FzZSBuZXdTd2l0Y2hDYXNlKCkgeworCQlyZXR1cm4gbmV3IFN3aXRjaENhc2UodGhpcyk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgc3dpdGNoIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIGFuZCB0aGVyZSBhcmUKKwkgKiBubyBzdGF0ZW1lbnRzIG9yIHN3aXRjaCBjYXNlcy4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBsYWJlbGVkIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIFN3aXRjaFN0YXRlbWVudCBuZXdTd2l0Y2hTdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgU3dpdGNoU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgYW5kIHRoZSBib2R5IGlzCisJICogYW4gZW1wdHkgYmxvY2suCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3luY2hyb25pemVkIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIFN5bmNocm9uaXplZFN0YXRlbWVudCBuZXdTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgU3luY2hyb25pemVkU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdGFnIGVsZW1lbnQgbm9kZS4KIAkgKiBJbml0aWFsbHkgdGhlIG5ldyBub2RlIGhhcyBubyB0YWcgbmFtZSBhbmQgYW4gZW1wdHkgbGlzdCBvZiBmcmFnbWVudHMuCiAJICogPHA+CkBAIC0xOTA0LDExMyArMjIwNyw1MiBAQAogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgbWVtYmVyIHJlZmVyZW5jZSBub2RlLgotCSAqIEluaXRpYWxseSB0aGUgbmV3IG5vZGUgaGFzIG5vIHF1YWxpZmllciBuYW1lIGFuZAotCSAqIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG1lbWJlciBuYW1lLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5vZGUgdHlwZSBpcyB1c2VkIG9ubHkgaW5zaWRlIGRvYyBjb21tZW50cwotCSAqICh7QGxpbmsgSmF2YWRvY30pLgotCSAqIDwvcD4KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgInRoaXMiIGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBxdWFsaWZpZXIuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbWVtYmVyIHJlZmVyZW5jZSBub2RlCi0JICogQHNpbmNlIDMuMAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCAidGhpcyIgZXhwcmVzc2lvbiBub2RlCiAJICovCi0JcHVibGljIE1lbWJlclJlZiBuZXdNZW1iZXJSZWYoKSB7Ci0JCU1lbWJlclJlZiByZXN1bHQgPSBuZXcgTWVtYmVyUmVmKHRoaXMpOworCXB1YmxpYyBUaGlzRXhwcmVzc2lvbiBuZXdUaGlzRXhwcmVzc2lvbigpIHsKKwkJVGhpc0V4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFRoaXNFeHByZXNzaW9uKHRoaXMpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgbWV0aG9kIHJlZmVyZW5jZSBub2RlLgotCSAqIEluaXRpYWxseSB0aGUgbmV3IG5vZGUgaGFzIG5vIHF1YWxpZmllciBuYW1lLAotCSAqIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG1ldGhvZCBuYW1lLCBhbmQgYW4KLQkgKiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBub2RlIHR5cGUgaXMgdXNlZCBvbmx5IGluc2lkZSBkb2MgY29tbWVudHMKLQkgKiAoe0BsaW5rIEphdmFkb2MgSmF2YWRvY30pLgotCSAqIDwvcD4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgdGhyb3cgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbC4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZXRob2QgcmVmZXJlbmNlIG5vZGUKLQkgKiBAc2luY2UgMy4wCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHRocm93IHN0YXRlbWVudCBub2RlCiAJICovCi0JcHVibGljIE1ldGhvZFJlZiBuZXdNZXRob2RSZWYoKSB7Ci0JCU1ldGhvZFJlZiByZXN1bHQgPSBuZXcgTWV0aG9kUmVmKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBUaHJvd1N0YXRlbWVudCBuZXdUaHJvd1N0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBUaHJvd1N0YXRlbWVudCh0aGlzKTsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG1ldGhvZCByZWZlcmVuY2Ugbm9kZS4KLQkgKiBJbml0aWFsbHkgdGhlIG5ldyBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAotCSAqIHR5cGUsIG5vdCB2YXJpYWJsZSBhcml0eSwgYW5kIG5vIHBhcmFtZXRlciBuYW1lLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5vZGUgdHlwZSBpcyB1c2VkIG9ubHkgaW5zaWRlIGRvYyBjb21tZW50cwotCSAqICh7QGxpbmsgSmF2YWRvY30pLgotCSAqIDwvcD4KKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgdHJ5IHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSB0cnkgc3RhdGVtZW50IGhhcyBubyByZXNvdXJjZXMsIGFuIGVtcHR5IGJsb2NrLCBubyBjYXRjaAorCSAqIGNsYXVzZXMsIGFuZCBubyBmaW5hbGx5IGJsb2NrLgogCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG1ldGhvZCByZWZlcmVuY2UgcGFyYW1ldGVyIG5vZGUKLQkgKiBAc2luY2UgMy4wCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHRyeSBzdGF0ZW1lbnQgbm9kZQogCSAqLwotCXB1YmxpYyBNZXRob2RSZWZQYXJhbWV0ZXIgbmV3TWV0aG9kUmVmUGFyYW1ldGVyKCkgewotCQlNZXRob2RSZWZQYXJhbWV0ZXIgcmVzdWx0ID0gbmV3IE1ldGhvZFJlZlBhcmFtZXRlcih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVEVNRU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVCwgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudC4KLQkgKiBCeSBkZWZhdWx0LCB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzIGFuZCB0aGUgYmFzZSB0eXBlIGlzIHVuc3BlY2lmaWVkCi0JICogKGJ1dCBsZWdhbCkuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50Ci0JICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYSBzdGF0ZW1lbnQKLQkgKiAoPGNvZGU+U3RhdGVtZW50PC9jb2RlPikgYnkgd3JhcHBpbmcgaXQuIEFkZGl0aW9uYWwgdmFyaWFibGUKLQkgKiBkZWNsYXJhdGlvbiBmcmFnbWVudHMgY2FuIGJlIGFkZGVkIGFmdGVyd2FyZHMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGZyYWdtZW50IHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudAotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgotCSAqIDx1bD4KLQkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgotCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+Ci0JICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+Ci0JICogPGxpPnRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCBpcyBudWxsPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0JCQluZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgewotCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgcmVzdWx0ID0KLQkJCW5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRoaXMpOwotCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkKGZyYWdtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKKwlwdWJsaWMgVHJ5U3RhdGVtZW50IG5ld1RyeVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBUcnlTdGF0ZW1lbnQodGhpcyk7CiAJfQogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVCwgZm9yIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uLgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBjbGFzcyBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOworCSAqIG5vIG1vZGlmaWVyczsgbm8gZG9jIGNvbW1lbnQ7IG5vIHN1cGVyY2xhc3Mgb3Igc3VwZXJpbnRlcmZhY2VzOworCSAqIGFuZCBhbiBlbXB0eSBjbGFzcyBib2R5LgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSB0eXBlIGRlY2xhcmF0aW9uCi0JICogKDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4pIGludG8gYSBzdGF0ZW1lbnQKLQkgKiAoPGNvZGU+U3RhdGVtZW50PC9jb2RlPikgYnkgd3JhcHBpbmcgaXQuCisJICogVG8gY3JlYXRlIGFuIGludGVyZmFjZSwgdXNlIHRoaXMgbWV0aG9kIGFuZCB0aGVuIGNhbGwKKwkgKiA8Y29kZT5UeXBlRGVjbGFyYXRpb24uc2V0SW50ZXJmYWNlKHRydWUpPC9jb2RlPi4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcGFyYW0gZGVjbCB0aGUgdHlwZSBkZWNsYXJhdGlvbgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6Ci0JICogPHVsPgotCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+Ci0JICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KLQkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KLQkgKiA8L3VsPgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0eXBlIGRlY2xhcmF0aW9uIG5vZGUKIAkgKi8KLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0JCQluZXdUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQoVHlwZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcyk7Ci0JCXJlc3VsdC5zZXREZWNsYXJhdGlvbihkZWNsKTsKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIG5ld1R5cGVEZWNsYXJhdGlvbigpIHsKKwkJVHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcyk7CisJCXJlc3VsdC5zZXRJbnRlcmZhY2UoZmFsc2UpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMjA0Niw0OCArMjI4OCwxNiBAQAogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBibG9jayBub2RlIG93bmVkIGJ5IHRoaXMgQVNULCBmb3IgYW4gZW1wdHkgbGlzdAotCSAqIG9mIHN0YXRlbWVudHMuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQsIGVtcHR5IGJsb2NrIG5vZGUKLQkgKi8KLQlwdWJsaWMgQmxvY2sgbmV3QmxvY2soKSB7Ci0JCXJldHVybiBuZXcgQmxvY2sodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGNvbnRpbnVlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIFRoZSBjb250aW51ZSBzdGF0ZW1lbnQgaGFzIG5vIGxhYmVsLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGNvbnRpbnVlIHN0YXRlbWVudCBub2RlCi0JICovCi0JcHVibGljIENvbnRpbnVlU3RhdGVtZW50IG5ld0NvbnRpbnVlU3RhdGVtZW50KCkgewotCQlyZXR1cm4gbmV3IENvbnRpbnVlU3RhdGVtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBicmVhayBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBUaGUgYnJlYWsgc3RhdGVtZW50IGhhcyBubyBsYWJlbC4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBicmVhayBzdGF0ZW1lbnQgbm9kZQotCSAqLwotCXB1YmxpYyBCcmVha1N0YXRlbWVudCBuZXdCcmVha1N0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZXhwcmVzc2lvbiBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVCwKLQkgKiBmb3IgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVCwgZm9yIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uLgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW4gZXhwcmVzc2lvbgotCSAqICg8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikgaW50byBhIHN0YXRlbWVudCAoPGNvZGU+VHlwZTwvY29kZT4pCi0JICogYnkgd3JhcHBpbmcgaXQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIHJlc3VsdCBpcyBvbmx5IGxlZ2FsIGZvcgotCSAqIGxpbWl0ZWQgZXhwcmVzc2lvbiB0eXBlcywgaW5jbHVkaW5nIG1ldGhvZCBpbnZvY2F0aW9ucywgYXNzaWdubWVudHMsCi0JICogYW5kIGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0aW9ucy4KKwkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgdHlwZSBkZWNsYXJhdGlvbgorCSAqICg8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+KSBpbnRvIGEgc3RhdGVtZW50CisJICogKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgogCSAqIDwvcD4KIAkgKgotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN0YXRlbWVudCBub2RlCisJICogQHBhcmFtIGRlY2wgdGhlIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgpAQCAtMjA5NSwzMjcgKzIzMDUsMzUgQEAKIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgogCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uU3RhdGVtZW50IG5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcyk7Ci0JCXJlc3VsdC5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQKKwkJCW5ld1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudChUeXBlRGVjbGFyYXRpb24gZGVjbCkgeworCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCh0aGlzKTsKKwkJcmVzdWx0LnNldERlY2xhcmF0aW9uKGRlY2wpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBpZiBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSwKLQkgKiB0aGUgdGhlbiBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2ssIGFuZCB0aGVyZSBpcyBubyBlbHNlIHN0YXRlbWVudC4KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24gbm9kZQorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBpZiBzdGF0ZW1lbnQgbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0eXBlIGxpdGVyYWwgbm9kZQogCSAqLwotCXB1YmxpYyBJZlN0YXRlbWVudCBuZXdJZlN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBJZlN0YXRlbWVudCh0aGlzKTsKKwlwdWJsaWMgVHlwZUxpdGVyYWwgbmV3VHlwZUxpdGVyYWwoKSB7CisJCVR5cGVMaXRlcmFsIHJlc3VsdCA9IG5ldyBUeXBlTGl0ZXJhbCh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgd2hpbGUgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCksIGFuZAotCSAqIHRoZSBib2R5IHN0YXRlbWVudCBpcyBhbiBlbXB0eSBibG9jay4KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBwYXJhbWV0ZXIgdHlwZSBub2RlIHdpdGggYW4KKwkgKiB1bnNwZWNpZmllZCB0eXBlIHZhcmlhYmxlIG5hbWUgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgdHlwZSBib3VuZHMuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgd2hpbGUgc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgV2hpbGVTdGF0ZW1lbnQgbmV3V2hpbGVTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgV2hpbGVTdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGRvIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLCBhbmQKLQkgKiB0aGUgYm9keSBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2suCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgRG9TdGF0ZW1lbnQgbmV3RG9TdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRG9TdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHRyeSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBCeSBkZWZhdWx0LCB0aGUgdHJ5IHN0YXRlbWVudCBoYXMgYW4gZW1wdHkgYmxvY2ssIG5vIGNhdGNoCi0JICogY2xhdXNlcywgYW5kIG5vIGZpbmFsbHkgYmxvY2suCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdHJ5IHN0YXRlbWVudCBub2RlCi0JICovCi0JcHVibGljIFRyeVN0YXRlbWVudCBuZXdUcnlTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgVHJ5U3RhdGVtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBjYXRjaCBjbGF1c2Ugbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBCeSBkZWZhdWx0LCB0aGUgY2F0Y2ggY2xhdXNlIGRlY2xhcmVzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCi0JICogZXhjZXB0aW9uIGRlY2xhcmF0aW9uIGFuZCBoYXMgYW4gZW1wdHkgYmxvY2suCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2F0Y2ggY2xhdXNlIG5vZGUKLQkgKi8KLQlwdWJsaWMgQ2F0Y2hDbGF1c2UgbmV3Q2F0Y2hDbGF1c2UoKSB7Ci0JCXJldHVybiBuZXcgQ2F0Y2hDbGF1c2UodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHJldHVybiBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBCeSBkZWZhdWx0LCB0aGUgcmV0dXJuIHN0YXRlbWVudCBoYXMgbm8gZXhwcmVzc2lvbi4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCByZXR1cm4gc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgUmV0dXJuU3RhdGVtZW50IG5ld1JldHVyblN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHRocm93IHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdGhyb3cgc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgVGhyb3dTdGF0ZW1lbnQgbmV3VGhyb3dTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgVGhyb3dTdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KLQkgKiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBhbmQgaGFzIG5vCi0JICogbWVzc2FnZSBleHByZXNzaW9uLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZQotCSAqLwotCXB1YmxpYyBBc3NlcnRTdGF0ZW1lbnQgbmV3QXNzZXJ0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZW1wdHkgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZW1wdHkgc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgRW1wdHlTdGF0ZW1lbnQgbmV3RW1wdHlTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlTdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxhYmVsZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIGxhYmVsIGFuZCBzdGF0ZW1lbnQgYXJlIGJvdGggdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbC4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBsYWJlbGVkIHN0YXRlbWVudCBub2RlCi0JICovCi0JcHVibGljIExhYmVsZWRTdGF0ZW1lbnQgbmV3TGFiZWxlZFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbGVkU3RhdGVtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzd2l0Y2ggc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgYW5kIHRoZXJlIGFyZQotCSAqIG5vIHN0YXRlbWVudHMgb3Igc3dpdGNoIGNhc2VzLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGxhYmVsZWQgc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgU3dpdGNoU3RhdGVtZW50IG5ld1N3aXRjaFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHN3aXRjaCBjYXNlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5Ci0JICogdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3dpdGNoIGNhc2Ugbm9kZQotCSAqLwotCXB1YmxpYyBTd2l0Y2hDYXNlIG5ld1N3aXRjaENhc2UoKSB7Ci0JCXJldHVybiBuZXcgU3dpdGNoQ2FzZSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgc3luY2hyb25pemVkIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIGFuZCB0aGUgYm9keSBpcwotCSAqIGFuIGVtcHR5IGJsb2NrLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQgbm9kZQotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbmV3U3luY2hyb25pemVkU3RhdGVtZW50KCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZm9yIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgotCSAqIEJ5IGRlZmF1bHQsIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMsIG5vIGNvbmRpdGlvbiBleHByZXNzaW9uLAotCSAqIG5vIHVwZGF0ZXJzLCBhbmQgdGhlIGJvZHkgaXMgYW4gZW1wdHkgYmxvY2suCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZm9yIHN0YXRlbWVudCBub2RlCi0JICovCi0JcHVibGljIEZvclN0YXRlbWVudCBuZXdGb3JTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRm9yU3RhdGVtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBlbmhhbmNlZCBmb3Igc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCi0JICogQnkgZGVmYXVsdCwgdGhlIHBhcmFtdGVyIGFuZCBleHByZXNzaW9uIGFyZSB1bnNwZWNpZmllZAotCSAqIGJ1dCBsZWdhbCBzdWJ0cmVlcywgYW5kIHRoZSBib2R5IGlzIGFuIGVtcHR5IGJsb2NrLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHRocm93IHN0YXRlbWVudCBub2RlCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHR5cGUgcGFyYW1ldGVyIG5vZGUKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBFbmhhbmNlZEZvclN0YXRlbWVudCBuZXdFbmhhbmNlZEZvclN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBFbmhhbmNlZEZvclN0YXRlbWVudCh0aGlzKTsKLQl9Ci0KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVhQUkVTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHN0cmluZyBsaXRlcmFsIG5vZGUgZm9yCi0JICogdGhlIGVtcHR5IHN0cmluZyBsaXRlcmFsLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN0cmluZyBsaXRlcmFsIG5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nTGl0ZXJhbCBuZXdTdHJpbmdMaXRlcmFsKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwodGhpcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgY2hhcmFjdGVyIGxpdGVyYWwgbm9kZS4KLQkgKiBJbml0aWFsbHkgdGhlIG5vZGUgaGFzIGFuIHVuc3BlY2lmaWVkIGNoYXJhY3RlciBsaXRlcmFsLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGNoYXJhY3RlciBsaXRlcmFsIG5vZGUKLQkgKi8KLQlwdWJsaWMgQ2hhcmFjdGVyTGl0ZXJhbCBuZXdDaGFyYWN0ZXJMaXRlcmFsKCkgewotCQlyZXR1cm4gbmV3IENoYXJhY3RlckxpdGVyYWwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG51bWJlciBsaXRlcmFsIG5vZGUuCi0JICoKLQkgKiBAcGFyYW0gbGl0ZXJhbCB0aGUgdG9rZW4gZm9yIHRoZSBudW1lcmljIGxpdGVyYWwgYXMgaXQgd291bGQKLQkgKiAgICBhcHBlYXIgaW4gSmF2YSBzb3VyY2UgY29kZQotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBudW1iZXIgbGl0ZXJhbCBub2RlCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxpdGVyYWwgaXMgbnVsbAotCSAqLwotCXB1YmxpYyBOdW1iZXJMaXRlcmFsIG5ld051bWJlckxpdGVyYWwoU3RyaW5nIGxpdGVyYWwpIHsKLQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCU51bWJlckxpdGVyYWwgcmVzdWx0ID0gbmV3IE51bWJlckxpdGVyYWwodGhpcyk7Ci0JCXJlc3VsdC5zZXRUb2tlbihsaXRlcmFsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbnVtYmVyIGxpdGVyYWwgbm9kZS4KLQkgKiBJbml0aWFsbHkgdGhlIG51bWJlciBsaXRlcmFsIHRva2VuIGlzIDxjb2RlPiIwIjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbnVtYmVyIGxpdGVyYWwgbm9kZQotCSAqLwotCXB1YmxpYyBOdW1iZXJMaXRlcmFsIG5ld051bWJlckxpdGVyYWwoKSB7Ci0JCU51bWJlckxpdGVyYWwgcmVzdWx0ID0gbmV3IE51bWJlckxpdGVyYWwodGhpcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlCi0JICovCi0JcHVibGljIE51bGxMaXRlcmFsIG5ld051bGxMaXRlcmFsKCkgewotCQlyZXR1cm4gbmV3IE51bGxMaXRlcmFsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBib29sZWFuIGxpdGVyYWwgbm9kZS4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiA8Y29kZT5mb28gPSB0cnVlPC9jb2RlPgotCSAqIGlzIGdlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6Ci0JICogPGNvZGU+Ci0JICogPHByZT4KLQkgKiBBc3NpZ25tZW50IGU9IGFzdC5uZXdBc3NpZ25tZW50KCk7Ci0JICogZS5zZXRMZWZ0SGFuZFNpZGUoYXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpKTsKLQkgKiBlLnNldFJpZ2h0SGFuZFNpZGUoYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpKTsKLQkgKiA8L3ByZT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHZhbHVlIHRoZSBib29sZWFuIHZhbHVlCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGJvb2xlYW4gbGl0ZXJhbCBub2RlCi0JICovCi0JcHVibGljIEJvb2xlYW5MaXRlcmFsIG5ld0Jvb2xlYW5MaXRlcmFsKGJvb2xlYW4gdmFsdWUpIHsKLQkJQm9vbGVhbkxpdGVyYWwgcmVzdWx0ID0gbmV3IEJvb2xlYW5MaXRlcmFsKHRoaXMpOwotCQlyZXN1bHQuc2V0Qm9vbGVhblZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaXMgIj0iIGFuZAotCSAqIHRoZSBsZWZ0IGFuZCByaWdodCBoYW5kIHNpZGUgZXhwcmVzc2lvbnMgYXJlIHVuc3BlY2lmaWVkLCBidXQKLQkgKiBsZWdhbCwgbmFtZXMuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudCBuZXdBc3NpZ25tZW50KCkgewotCQlBc3NpZ25tZW50IHJlc3VsdCA9IG5ldyBBc3NpZ25tZW50KHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhpcwotCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKQotCSAqIHRoZXJlIGlzIG5vIHJlY2VpdmVyIGV4cHJlc3Npb24sIG5vIHR5cGUgYXJndW1lbnRzLCBhbmQgdGhlIGxpc3Qgb2YKLQkgKiBhcmd1bWVudHMgaXMgZW1wdHkuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiBub2RlCi0JICovCi0JcHVibGljIE1ldGhvZEludm9jYXRpb24gbmV3TWV0aG9kSW52b2NhdGlvbigpIHsKLQkJTWV0aG9kSW52b2NhdGlvbiByZXN1bHQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgInN1cGVyIiBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkKLQkgKiB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKQotCSAqIHRoZXJlIGlzIG5vIHF1YWxpZmllciwgbm8gdHlwZSBhcmd1bWVudHMsIGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaXMgZW1wdHkuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgICJzdXBlciIgbWV0aG9kIGludm9jYXRpb24KLQkgKiAgICBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5ld1N1cGVyTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24odGhpcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGFsdGVybmF0ZSBjb25zdHJ1Y3RvciAoInRoaXMoLi4uKTsiKSBpbnZvY2F0aW9uCi0JICogc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBsaXN0cyBvZiBhcmd1bWVudHMKLQkgKiBhbmQgdHlwZSBhcmd1bWVudHMgYXJlIGJvdGggZW1wdHkuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgdHlwZSBvZiBub2RlIGlzIGEgU3RhdGVtZW50LCB3aGVyZWFzIGEgcmVndWxhcgotCSAqIG1ldGhvZCBpbnZvY2F0aW9uIGlzIGFuIEV4cHJlc3Npb24uIFRoZSBvbmx5IHZhbGlkIHVzZSBvZiB0aGVzZQotCSAqIHN0YXRlbWVudHMgYXJlIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBjb25zdHJ1Y3RvciBib2R5LgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhbHRlcm5hdGUgY29uc3RydWN0b3IgaW52b2NhdGlvbiBzdGF0ZW1lbnQgbm9kZQotCSAqLwotCXB1YmxpYyBDb25zdHJ1Y3Rvckludm9jYXRpb24gbmV3Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewotCQlDb25zdHJ1Y3Rvckludm9jYXRpb24gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgYWx0ZXJuYXRlIHN1cGVyIGNvbnN0cnVjdG9yICgic3VwZXIoLi4uKTsiKQotCSAqIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vCi0JICogcXVhbGlmaWVyLCBubyB0eXBlIGFyZ3VtZW50cywgYW5kIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBpcyBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyB0eXBlIG9mIG5vZGUgaXMgYSBTdGF0ZW1lbnQsIHdoZXJlYXMgYSByZWd1bGFyCi0JICogc3VwZXIgbWV0aG9kIGludm9jYXRpb24gaXMgYW4gRXhwcmVzc2lvbi4gVGhlIG9ubHkgdmFsaWQgdXNlIG9mIHRoZXNlCi0JICogc3RhdGVtZW50cyBhcmUgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIGNvbnN0cnVjdG9yIGJvZHkuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUKLQkgKi8KLQlwdWJsaWMgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbmV3U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oKSB7Ci0JCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9Ci0JCQluZXcgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJcHVibGljIFR5cGVQYXJhbWV0ZXIgbmV3VHlwZVBhcmFtZXRlcigpIHsKKwkJVHlwZVBhcmFtZXRlciByZXN1bHQgPSBuZXcgVHlwZVBhcmFtZXRlcih0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTI0NTQsMzE2ICsyMzcyLDM2MSBAQAogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULAotCSAqIGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQuIEJ5IGRlZmF1bHQsIHRoZXJlIGFyZSBubwotCSAqIG1vZGlmaWVycywgbm8gZG9jIGNvbW1lbnQsIGFuZCB0aGUgYmFzZSB0eXBlIGlzIHVuc3BlY2lmaWVkCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IG5vZGUgb3duZWQgYnkgdGhpcworCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGZyYWdtZW50IGlzIGZvciBhIHZhcmlhYmxlIHdpdGggYW4gdW5zcGVjaWZpZWQsIGJ1dAorCSAqIGxlZ2FsLCBuYW1lOyBubyBleHRyYSBhcnJheSBkaW1lbnNpb25zOyBhbmQgbm8gaW5pdGlhbGl6ZXIuCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgbm9kZQorCSAqLworCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCkgeworCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVEVNRU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUKKwkgKiBvd25lZCBieSB0aGlzIEFTVCwgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudC4KKwkgKiBCeSBkZWZhdWx0LCB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzIGFuZCB0aGUgYmFzZSB0eXBlIGlzIHVuc3BlY2lmaWVkCiAJICogKGJ1dCBsZWdhbCkuCiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gd3JhcCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50Ci0JICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYSBmaWVsZCBkZWNsYXJhdGlvbgotCSAqIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gdGhlIGJvZHkgb2YgYSB0eXBlIGRlY2xhcmF0aW9uCi0JICogKDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+IGltcGxlbWVudHMgPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCi0JICogQWRkaXRpb25hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgY2FuIGJlIGFkZGVkIGFmdGVyd2FyZHMuCisJICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50CisJICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYSBzdGF0ZW1lbnQKKwkgKiAoPGNvZGU+U3RhdGVtZW50PC9jb2RlPikgYnkgd3JhcHBpbmcgaXQuIEFkZGl0aW9uYWwgdmFyaWFibGUKKwkgKiBkZWNsYXJhdGlvbiBmcmFnbWVudHMgY2FuIGJlIGFkZGVkIGFmdGVyd2FyZHMuCiAJICogPC9wPgogCSAqCiAJICogQHBhcmFtIGZyYWdtZW50IHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudAotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBkZWNsYXJhdGlvbiBub2RlCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KLQkgKiA8bGk+dGhlIGdpdmVuIGZyYWdtZW50IGlzIG51bGw8L2xpPgorCSAqIDxsaT50aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgaXMgbnVsbDwvbGk+CiAJICogPC91bD4KIAkgKi8KLQlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBuZXdGaWVsZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgeworCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50CisJCQluZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgewogCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCUZpZWxkRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEZpZWxkRGVjbGFyYXRpb24odGhpcyk7CisJCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgcmVzdWx0ID0KKwkJCW5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRoaXMpOwogCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkKGZyYWdtZW50KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgInRoaXMiIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBxdWFsaWZpZXIuCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHdoaWxlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLCBhbmQKKwkgKiB0aGUgYm9keSBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2suCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgInRoaXMiIGV4cHJlc3Npb24gbm9kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB3aGlsZSBzdGF0ZW1lbnQgbm9kZQogCSAqLwotCXB1YmxpYyBUaGlzRXhwcmVzc2lvbiBuZXdUaGlzRXhwcmVzc2lvbigpIHsKLQkJVGhpc0V4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFRoaXNFeHByZXNzaW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OworCXB1YmxpYyBXaGlsZVN0YXRlbWVudCBuZXdXaGlsZVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBXaGlsZVN0YXRlbWVudCh0aGlzKTsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBhbmQgZmllbGQgYXJlIGJvdGgKLQkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lcy4KKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgd2lsZGNhcmQgdHlwZSBub2RlIHdpdGggbm8KKwkgKiB0eXBlIGJvdW5kLgogCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgRmllbGRBY2Nlc3MgbmV3RmllbGRBY2Nlc3MoKSB7Ci0JCUZpZWxkQWNjZXNzIHJlc3VsdCA9IG5ldyBGaWVsZEFjY2Vzcyh0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgc3VwZXIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBhbmQgZmllbGQgYXJlIGJvdGgKLQkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lcy4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBzdXBlciBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCi0JICovCi0JcHVibGljIFN1cGVyRmllbGRBY2Nlc3MgbmV3U3VwZXJGaWVsZEFjY2VzcygpIHsKLQkJU3VwZXJGaWVsZEFjY2VzcyByZXN1bHQgPSBuZXcgU3VwZXJGaWVsZEFjY2Vzcyh0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0eXBlIGxpdGVyYWwgbm9kZQotCSAqLwotCXB1YmxpYyBUeXBlTGl0ZXJhbCBuZXdUeXBlTGl0ZXJhbCgpIHsKLQkJVHlwZUxpdGVyYWwgcmVzdWx0ID0gbmV3IFR5cGVMaXRlcmFsKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjYXN0IGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBhbmQgZXhwcmVzc2lvbiBhcmUgdW5zcGVjaWZpZWQKLQkgKiAoYnV0IGxlZ2FsKS4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjYXN0IGV4cHJlc3Npb24gbm9kZQotCSAqLwotCXB1YmxpYyBDYXN0RXhwcmVzc2lvbiBuZXdDYXN0RXhwcmVzc2lvbigpIHsKLQkJQ2FzdEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IENhc3RFeHByZXNzaW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZQotCSAqLwotCXB1YmxpYyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBuZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKLQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBpbmZpeCBleHByZXNzaW9uIG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG9wZXJhdG9yIGFuZCBsZWZ0IGFuZCByaWdodAotCSAqIG9wZXJhbmQgYXJlIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLCBhbmQgdGhlcmUgYXJlIG5vIGV4dGVuZGVkCi0JICogb3BlcmFuZHMuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgaW5maXggZXhwcmVzc2lvbiBub2RlCi0JICovCi0JcHVibGljIEluZml4RXhwcmVzc2lvbiBuZXdJbmZpeEV4cHJlc3Npb24oKSB7Ci0JCUluZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5maXhFeHByZXNzaW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBpbnN0YW5jZW9mIGV4cHJlc3Npb24gbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIGxlZnQgYW5kIHJpZ2h0Ci0JICogb3BlcmFuZCBhcmUgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgaW5zdGFuY2VvZiBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgSW5zdGFuY2VvZkV4cHJlc3Npb24gbmV3SW5zdGFuY2VvZkV4cHJlc3Npb24oKSB7Ci0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJbnN0YW5jZW9mRXhwcmVzc2lvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcG9zdGZpeCBleHByZXNzaW9uIG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG9wZXJhdG9yIGFuZCBvcGVyYW5kIGFyZQotCSAqIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHBvc3RmaXggZXhwcmVzc2lvbiBub2RlCi0JICovCi0JcHVibGljIFBvc3RmaXhFeHByZXNzaW9uIG5ld1Bvc3RmaXhFeHByZXNzaW9uKCkgewotCQlQb3N0Zml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUG9zdGZpeEV4cHJlc3Npb24odGhpcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHByZWZpeCBleHByZXNzaW9uIG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG9wZXJhdG9yIGFuZCBvcGVyYW5kIGFyZQotCSAqIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHByZWZpeCBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgUHJlZml4RXhwcmVzc2lvbiBuZXdQcmVmaXhFeHByZXNzaW9uKCkgewotCQlQcmVmaXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQcmVmaXhFeHByZXNzaW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCi0JICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhcnJheSBhbmQgaW5kZXggZXhwcmVzc2lvbiBhcmUKLQkgKiBib3RoIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGFjY2VzcyBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgQXJyYXlBY2Nlc3MgbmV3QXJyYXlBY2Nlc3MoKSB7Ci0JCUFycmF5QWNjZXNzIHJlc3VsdCA9IG5ldyBBcnJheUFjY2Vzcyh0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbiBub2RlCi0JICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhcnJheSB0eXBlIGlzIGFuIHVuc3BlY2lmaWVkCi0JICogMS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGxpc3Qgb2YgZGltZW5zaW9ucyBpcyBlbXB0eSwgYW5kIHRoZXJlIGlzIG5vCi0JICogYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICogPHA+Ci0JICogRXhhbXBsZXM6Ci0JICogPGNvZGU+Ci0JICogPHByZT4KLQkgKiAvLyBuZXcgU3RyaW5nW2xlbl0KLQkgKiBBcnJheUNyZWF0aW9uIGFjMSA9IGFzdC5uZXdBcnJheUNyZWF0aW9uKCk7Ci0JICogYWMxLnNldFR5cGUoCi0JICogICAgYXN0Lm5ld0FycmF5VHlwZSgKLQkgKiAgICAgICBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKSk7Ci0JICogYWMxLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld1NpbXBsZU5hbWUoImxlbiIpKTsKLSAgICAgKgotCSAqIC8vIG5ldyBkb3VibGVbN11bMjRdW10KLQkgKiBBcnJheUNyZWF0aW9uIGFjMiA9IGFzdC5uZXdBcnJheUNyZWF0aW9uKCk7Ci0JICogYWMyLnNldFR5cGUoCi0JICogICAgYXN0Lm5ld0FycmF5VHlwZSgKLQkgKiAgICAgICBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkRPVUJMRSksIDMpKTsKLQkgKiBhYzIuZGltZW5zaW9ucygpLmFkZChhc3QubmV3TnVtYmVyTGl0ZXJhbCgiNyIpKTsKLQkgKiBhYzIuZGltZW5zaW9ucygpLmFkZChhc3QubmV3TnVtYmVyTGl0ZXJhbCgiMjQiKSk7Ci0JICoKLQkgKiAvLyBuZXcgaW50W10gezEsIDJ9Ci0JICogQXJyYXlDcmVhdGlvbiBhYzMgPSBhc3QubmV3QXJyYXlDcmVhdGlvbigpOwotCSAqIGFjMy5zZXRUeXBlKAotCSAqICAgIGFzdC5uZXdBcnJheVR5cGUoCi0JICogICAgICAgYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKSk7Ci0JICogQXJyYXlJbml0aWFsaXplciBhaSA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JICogYWMzLnNldEluaXRpYWxpemVyKGFpKTsKLQkgKiBhaS5leHByZXNzaW9ucygpLmFkZChhc3QubmV3TnVtYmVyTGl0ZXJhbCgiMSIpKTsKLQkgKiBhaS5leHByZXNzaW9ucygpLmFkZChhc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsKLQkgKiA8L3ByZT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gbm9kZQotCSAqLwotCXB1YmxpYyBBcnJheUNyZWF0aW9uIG5ld0FycmF5Q3JlYXRpb24oKSB7Ci0JCUFycmF5Q3JlYXRpb24gcmVzdWx0ID0gbmV3IEFycmF5Q3JlYXRpb24odGhpcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uCi0JICogKCJuZXciKSBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsCi0JICogdGhlcmUgaXMgbm8gcXVhbGlmeWluZyBleHByZXNzaW9uLCBubyB0eXBlIHBhcmFtZXRlcnMsCi0JICogYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdHlwZSBuYW1lLCBhbiBlbXB0eSBsaXN0IG9mCi0JICogYXJndW1lbnRzLCBhbmQgZG9lcyBub3QgZGVjbGFyZSBhbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBub2RlCi0JICovCi0JcHVibGljIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBuZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7Ci0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiByZXN1bHQgPSBuZXcgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24KLQkgKiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYm9keSBkZWNsYXJhdGlvbiBsaXN0IGlzIGVtcHR5LgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiBub2RlCi0JICovCi0JcHVibGljIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgaW5pdGlhbGl6ZXIgbm9kZQotCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgaW5pdGlhbGl6ZXIgaGFzIG5vIGV4cHJlc3Npb25zLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGluaXRpYWxpemVyIG5vZGUKLQkgKi8KLQlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBuZXdBcnJheUluaXRpYWxpemVyKCkgewotCQlBcnJheUluaXRpYWxpemVyIHJlc3VsdCA9IG5ldyBBcnJheUluaXRpYWxpemVyKHRoaXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUKLQkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGNvbmRpdGlvbiBhbmQgYm90aCBleHByZXNzaW9ucwotCSAqIGFyZSB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUKLQkgKi8KLQlwdWJsaWMgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5ld0NvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFOTk9UQVRJT05TID09PT09PT09PT09PT09PT09PT09Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbm9ybWFsIGFubm90YXRpb24gbm9kZSB3aXRoCi0JICogYW4gdW5zcGVjaWZpZWQgdHlwZSBuYW1lIGFuZCBhbiBlbXB0eSBsaXN0IG9mIG1lbWJlciB2YWx1ZQotCSAqIHBhaXJzLgotCSAqCi0JICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG5vcm1hbCBhbm5vdGF0aW9uIG5vZGUKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgd2lsZGNhcmQgdHlwZSBub2RlCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKCkgewotCQlOb3JtYWxBbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHRoaXMpOworCXB1YmxpYyBXaWxkY2FyZFR5cGUgbmV3V2lsZGNhcmRUeXBlKCkgeworCQlXaWxkY2FyZFR5cGUgcmVzdWx0ID0gbmV3IFdpbGRjYXJkVHlwZSh0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbWFya2VyIGFubm90YXRpb24gbm9kZSB3aXRoCi0JICogYW4gdW5zcGVjaWZpZWQgdHlwZSBuYW1lLgorCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBoYXMganVzdCBnYWluZWQgYSBjaGlsZC4KIAkgKgotCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtYXJrZXIgYW5ub3RhdGlvbiBub2RlCi0JICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCi0JICogYSBKTFMyIEFTVAotCSAqIEBzaW5jZSAzLjEKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBtb2RpZmllZAorCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZCBhcyBhIGNoaWxkCisJICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKKwkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbigpIHsKLQkJTWFya2VyQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgTWFya2VyQW5ub3RhdGlvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKKwl2b2lkIHBvc3RBZGRDaGlsZEV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjaGlsZCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgeworCQkvLyBJTVBPUlRBTlQ6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZWFkZXJzIGR1cmluZyBsYXp5IGluaXQKKwkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgeworCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKKwkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7CisJCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAorCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBBRERdIik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlkaXNhYmxlRXZlbnRzKCk7CisJCQl9CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMuZXZlbnRIYW5kbGVyLnBvc3RBZGRDaGlsZEV2ZW50KG5vZGUsIGNoaWxkLCBwcm9wZXJ0eSk7CisJCQkvLyBOLkIuIGV2ZW4gaWYgZXZlbnQgaGFuZGxlciBibG93cyB1cCwgdGhlIEFTVCBpcyBub3QKKwkJCS8vIGNvcnJ1cHRlZCBzaW5jZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZAorCQl9IGZpbmFsbHkgeworCQkJcmVlbmFibGVFdmVudHMoKTsKKwkJfQogCX0KIAogCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gbm9kZSB3aXRoCi0JICogYW4gdW5zcGVjaWZpZWQgdHlwZSBuYW1lIGFuZCB2YWx1ZS4KKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaGFzIGp1c3QgYmVlbiBjbG9uZWQuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIG5vZGUKLQkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KLQkgKiBhIEpMUzIgQVNUCi0JICogQHNpbmNlIDMuMQorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgd2FzIGNsb25lZAorCSAqIEBwYXJhbSBjbG9uZSB0aGUgY2xvbmUgb2YgPGNvZGU+bm9kZTwvY29kZT4KKwkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKKwl2b2lkIHBvc3RDbG9uZU5vZGVFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2xvbmUpIHsKKwkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgeworCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKKwkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7CisJCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAorCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBDTE9ORV0iKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWRpc2FibGVFdmVudHMoKTsKKwkJCX0KKwkJfQorCQl0cnkgeworCQkJdGhpcy5ldmVudEhhbmRsZXIucG9zdENsb25lTm9kZUV2ZW50KG5vZGUsIGNsb25lKTsKKwkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAorCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkCisJCX0gZmluYWxseSB7CisJCQlyZWVuYWJsZUV2ZW50cygpOworCQl9CiAJfQogCiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIG1lbWJlciB2YWx1ZSBwYWlyIG5vZGUgd2l0aAotCSAqIGFuIHVuc3BlY2lmaWVkIG1lbWJlciBuYW1lIGFuZCB2YWx1ZS4KKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUganN1dCBsb3N0IGEgY2hpbGQuCiAJICoKLQkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgbWVtYmVyIHZhbHVlIHBhaXIgbm9kZQotCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgotCSAqIGEgSkxTMiBBU1QKLQkgKiBAc2luY2UgMy4xCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgbW9kaWZpZWQKKwkgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIG5vZGUgdGhhdCB3YXMgcmVtb3ZlZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgY2hpbGQgb3IgY2hpbGQgbGlzdCBwcm9wZXJ0eSBkZXNjcmlwdG9yCisJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKCkgewotCQlNZW1iZXJWYWx1ZVBhaXIgcmVzdWx0ID0gbmV3IE1lbWJlclZhbHVlUGFpcih0aGlzKTsKLQkJcmV0dXJuIHJlc3VsdDsKKwl2b2lkIHBvc3RSZW1vdmVDaGlsZEV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjaGlsZCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgeworCQkvLyBJTVBPUlRBTlQ6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZWFkZXJzIGR1cmluZyBsYXp5IGluaXQKKwkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgeworCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKKwkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7CisJCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAorCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBERUxdIik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlkaXNhYmxlRXZlbnRzKCk7CisJCQl9CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMuZXZlbnRIYW5kbGVyLnBvc3RSZW1vdmVDaGlsZEV2ZW50KG5vZGUsIGNoaWxkLCBwcm9wZXJ0eSk7CisJCQkvLyBOLkIuIGV2ZW4gaWYgZXZlbnQgaGFuZGxlciBibG93cyB1cCwgdGhlIEFTVCBpcyBub3QKKwkJCS8vIGNvcnJ1cHRlZCBzaW5jZSBub2RlIGhhcyBub3QgYmVlbiBjaGFuZ2VkIHlldAorCQl9IGZpbmFsbHkgeworCQkJcmVlbmFibGVFdmVudHMoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBoYXMganVzdCBoYWQgYSBjaGlsZCByZXBsYWNlZC4KKwkgKgorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIG1vZGlmaWVkCisJICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCByZW1vdmVkCisJICogQHBhcmFtIG5ld0NoaWxkIHRoZSByZXBsYWNlbWVudCBjaGlsZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgY2hpbGQgb3IgY2hpbGQgbGlzdCBwcm9wZXJ0eSBkZXNjcmlwdG9yCisJICogQHNpbmNlIDMuMAorCSAqLworCXZvaWQgcG9zdFJlcGxhY2VDaGlsZEV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjaGlsZCwgQVNUTm9kZSBuZXdDaGlsZCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgeworCQkvLyBJTVBPUlRBTlQ6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZWFkZXJzIGR1cmluZyBsYXp5IGluaXQKKwkJc3luY2hyb25pemVkICh0aGlzLmludGVybmFsQVNUTG9jaykgeworCQkJLy8gZ3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBieSBhIHJlYWRlciBkb2luZyBsYXp5IGluaXQKKwkJCWlmICh0aGlzLmRpc2FibGVFdmVudHMgPiAwKSB7CisJCQkJLy8gZG9pbmcgbGF6eSBpbml0IE9SIGFscmVhZHkgcHJvY2Vzc2luZyBhbiBldmVudAorCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiW0JPVU5DRSBSRVBdIik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlkaXNhYmxlRXZlbnRzKCk7CisJCQl9CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMuZXZlbnRIYW5kbGVyLnBvc3RSZXBsYWNlQ2hpbGRFdmVudChub2RlLCBjaGlsZCwgbmV3Q2hpbGQsIHByb3BlcnR5KTsKKwkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAorCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIG5vdCBiZWVuIGNoYW5nZWQgeWV0CisJCX0gZmluYWxseSB7CisJCQlyZWVuYWJsZUV2ZW50cygpOworCQl9CisJfQorCisJLyoqCisJICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGhhcyBqdXN0IGNoYW5nZWQgdGhlIHZhbHVlIG9mIGEKKwkgKiBub24tY2hpbGQgcHJvcGVydHkuCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBtb2RpZmllZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwl2b2lkIHBvc3RWYWx1ZUNoYW5nZUV2ZW50KEFTVE5vZGUgbm9kZSwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CisJCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAorCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7CisJCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAorCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKKwkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIENIQU5HRV0iKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWRpc2FibGVFdmVudHMoKTsKKwkJCX0KKwkJfQorCQl0cnkgeworCQkJdGhpcy5ldmVudEhhbmRsZXIucG9zdFZhbHVlQ2hhbmdlRXZlbnQobm9kZSwgcHJvcGVydHkpOworCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90CisJCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQKKwkJfSBmaW5hbGx5IHsKKwkJCXJlZW5hYmxlRXZlbnRzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gZ2FpbiBhIGNoaWxkLgorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB0byBiZSBtb2RpZmllZAorCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSB0aGF0IHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQKKwkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIGNoaWxkIG9yIGNoaWxkIGxpc3QgcHJvcGVydHkgZGVzY3JpcHRvcgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwl2b2lkIHByZUFkZENoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CisJCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAorCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7CisJCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAorCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKKwkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIEFERF0iKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWRpc2FibGVFdmVudHMoKTsKKwkJCX0KKwkJfQorCQl0cnkgeworCQkJdGhpcy5ldmVudEhhbmRsZXIucHJlQWRkQ2hpbGRFdmVudChub2RlLCBjaGlsZCwgcHJvcGVydHkpOworCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90CisJCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQKKwkJfSBmaW5hbGx5IHsKKwkJCXJlZW5hYmxlRXZlbnRzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gYmUgY2xvbmVkLgorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYmUgY2xvbmVkCisJICogQHNpbmNlIDMuMAorCSAqLworCXZvaWQgcHJlQ2xvbmVOb2RlRXZlbnQoQVNUTm9kZSBub2RlKSB7CisJCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKKwkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYSByZWFkZXIgZG9pbmcgbGF6eSBpbml0CisJCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgeworCQkJCS8vIGRvaW5nIGxhenkgaW5pdCBPUiBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZXZlbnQKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIltCT1VOQ0UgQ0xPTkVdIik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlkaXNhYmxlRXZlbnRzKCk7CisJCQl9CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMuZXZlbnRIYW5kbGVyLnByZUNsb25lTm9kZUV2ZW50KG5vZGUpOworCQkJLy8gTi5CLiBldmVuIGlmIGV2ZW50IGhhbmRsZXIgYmxvd3MgdXAsIHRoZSBBU1QgaXMgbm90CisJCQkvLyBjb3JydXB0ZWQgc2luY2Ugbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQKKwkJfSBmaW5hbGx5IHsKKwkJCXJlZW5hYmxlRXZlbnRzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gbG9zZSBhIGNoaWxkLgorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgYWJvdXQgdG8gYmUgbW9kaWZpZWQKKwkgKiBAcGFyYW0gY2hpbGQgdGhlIG5vZGUgYWJvdXQgdG8gYmUgcmVtb3ZlZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgY2hpbGQgb3IgY2hpbGQgbGlzdCBwcm9wZXJ0eSBkZXNjcmlwdG9yCisJICogQHNpbmNlIDMuMAorCSAqLworCXZvaWQgcHJlUmVtb3ZlQ2hpbGRFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2hpbGQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKKwkJLy8gSU1QT1JUQU5UOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgcmVhZGVycyBkdXJpbmcgbGF6eSBpbml0CisJCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKKwkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYSByZWFkZXIgZG9pbmcgbGF6eSBpbml0CisJCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgeworCQkJCS8vIGRvaW5nIGxhenkgaW5pdCBPUiBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZXZlbnQKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIltCT1VOQ0UgREVMXSIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJZGlzYWJsZUV2ZW50cygpOworCQkJfQorCQl9CisJCXRyeSB7CisJCQl0aGlzLmV2ZW50SGFuZGxlci5wcmVSZW1vdmVDaGlsZEV2ZW50KG5vZGUsIGNoaWxkLCBwcm9wZXJ0eSk7CisJCQkvLyBOLkIuIGV2ZW4gaWYgZXZlbnQgaGFuZGxlciBibG93cyB1cCwgdGhlIEFTVCBpcyBub3QKKwkJCS8vIGNvcnJ1cHRlZCBzaW5jZSBub2RlIGhhcyBub3QgYmVlbiBjaGFuZ2VkIHlldAorCQl9IGZpbmFsbHkgeworCQkJcmVlbmFibGVFdmVudHMoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBpcyBhYm91dCBoYXZlIGEgY2hpbGQgcmVwbGFjZWQuCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBhYm91dCB0byBiZSBtb2RpZmllZAorCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgbm9kZSBhYm91dCB0byBiZSByZW1vdmVkCisJICogQHBhcmFtIG5ld0NoaWxkIHRoZSByZXBsYWNlbWVudCBjaGlsZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgY2hpbGQgb3IgY2hpbGQgbGlzdCBwcm9wZXJ0eSBkZXNjcmlwdG9yCisJICogQHNpbmNlIDMuMAorCSAqLworCXZvaWQgcHJlUmVwbGFjZUNoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBBU1ROb2RlIG5ld0NoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CisJCS8vIElNUE9SVEFOVDogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHJlYWRlcnMgZHVyaW5nIGxhenkgaW5pdAorCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7CisJCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGEgcmVhZGVyIGRvaW5nIGxhenkgaW5pdAorCQkJaWYgKHRoaXMuZGlzYWJsZUV2ZW50cyA+IDApIHsKKwkJCQkvLyBkb2luZyBsYXp5IGluaXQgT1IgYWxyZWFkeSBwcm9jZXNzaW5nIGFuIGV2ZW50CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJbQk9VTkNFIFJFUF0iKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWRpc2FibGVFdmVudHMoKTsKKwkJCX0KKwkJfQorCQl0cnkgeworCQkJdGhpcy5ldmVudEhhbmRsZXIucHJlUmVwbGFjZUNoaWxkRXZlbnQobm9kZSwgY2hpbGQsIG5ld0NoaWxkLCBwcm9wZXJ0eSk7CisJCQkvLyBOLkIuIGV2ZW4gaWYgZXZlbnQgaGFuZGxlciBibG93cyB1cCwgdGhlIEFTVCBpcyBub3QKKwkJCS8vIGNvcnJ1cHRlZCBzaW5jZSBub2RlIGhhcyBub3QgYmVlbiBjaGFuZ2VkIHlldAorCQl9IGZpbmFsbHkgeworCQkJcmVlbmFibGVFdmVudHMoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBpcyBhYm91dCB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEKKwkgKiBub24tY2hpbGQgcHJvcGVydHkuCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBiZSBtb2RpZmllZAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwl2b2lkIHByZVZhbHVlQ2hhbmdlRXZlbnQoQVNUTm9kZSBub2RlLCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKKwkJLy8gSU1QT1JUQU5UOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgcmVhZGVycyBkdXJpbmcgbGF6eSBpbml0CisJCXN5bmNocm9uaXplZCAodGhpcy5pbnRlcm5hbEFTVExvY2spIHsKKwkJCS8vIGd1YXJkIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MgYnkgYSByZWFkZXIgZG9pbmcgbGF6eSBpbml0CisJCQlpZiAodGhpcy5kaXNhYmxlRXZlbnRzID4gMCkgeworCQkJCS8vIGRvaW5nIGxhenkgaW5pdCBPUiBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZXZlbnQKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIltCT1VOQ0UgQ0hBTkdFXSIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJZGlzYWJsZUV2ZW50cygpOworCQkJfQorCQl9CisJCXRyeSB7CisJCQl0aGlzLmV2ZW50SGFuZGxlci5wcmVWYWx1ZUNoYW5nZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKKwkJCS8vIE4uQi4gZXZlbiBpZiBldmVudCBoYW5kbGVyIGJsb3dzIHVwLCB0aGUgQVNUIGlzIG5vdAorCQkJLy8gY29ycnVwdGVkIHNpbmNlIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkCisJCX0gZmluYWxseSB7CisJCQlyZWVuYWJsZUV2ZW50cygpOworCQl9CiAJfQogCiAJLyoqCkBAIC0yNzk2LDcgKzI3NTksNzYgQEAKIAkJfQogCiAJCXRoaXMucmV3cml0ZXIgPSBuZXcgSW50ZXJuYWxBU1RSZXdyaXRlKHJvb3QpOwotCQl0aGlzLnNldEV2ZW50SGFuZGxlcih0aGlzLnJld3JpdGVyKTsKKwkJc2V0RXZlbnRIYW5kbGVyKHRoaXMucmV3cml0ZXIpOworCX0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBTk5PVEFUSU9OUyA9PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisgICAgICogUmVlbmFibGUgZXZlbnRzLgorCSAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlIGZvciBBU1QgcmVhZGVycy4KKwkgKgorCSAqIEBzZWUgI2Rpc2FibGVFdmVudHMoKQorICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKi8KKwlmaW5hbCB2b2lkIHJlZW5hYmxlRXZlbnRzKCkgeworCQlzeW5jaHJvbml6ZWQgKHRoaXMuaW50ZXJuYWxBU1RMb2NrKSB7CisJCQkvLyBndWFyZCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGJ5IGFub3RoZXIgcmVhZGVyCisJCQl0aGlzLmRpc2FibGVFdmVudHMtLTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHR5cGUgYmluZGluZyBmb3IgYSAid2VsbCBrbm93biIgdHlwZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIHR5cGUgbmFtZXMgYXJlIHN1cHBvcnRlZDoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPiJib29sZWFuIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iYnl0ZSI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImNoYXIiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJkb3VibGUiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJmbG9hdCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImludCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImxvbmciPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJzaG9ydCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+InZvaWQiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IiPC9jb2RlPiAoc2luY2UgMy43KTwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuQm9vbGVhbiI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5CeXRlIjwvY29kZT4gKHNpbmNlIDMuMSk8L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkNoYXJhY3RlciI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5DbGFzcyI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5DbG9uZWFibGUiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuRG91YmxlIjwvY29kZT4gKHNpbmNlIDMuMSk8L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkVycm9yIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkV4Y2VwdGlvbiI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5GbG9hdCI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5JbnRlZ2VyIjwvY29kZT4gKHNpbmNlIDMuMSk8L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkxvbmciPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuU2hvcnQiPC9jb2RlPiAoc2luY2UgMy4xKTwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5UaHJvd2FibGUiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuVm9pZCI8L2NvZGU+IChzaW5jZSAzLjEpPC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEuaW8uU2VyaWFsaXphYmxlIjwvY29kZT48L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB3ZWxsIGtub3duIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisJICogICBuYW1lZCB0eXBlIGlzIG5vdCBjb25zaWRlcmVkIHdlbGwga25vd24gb3IgaWYgbm8gYmluZGluZyBjYW4gYmUgZm91bmQKKwkgKiAgIGZvciBpdAorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgcmVzb2x2ZVdlbGxLbm93blR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVXZWxsS25vd25UeXBlKG5hbWUpOwogCX0KIAogCS8qKgpAQCAtMjgzMiwzNyArMjg2NCw3NyBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXN0IHRyZWUgd2FzIGNyZWF0ZWQgd2l0aCBiaW5kaW5ncywgZmFsc2Ugb3RoZXJ3aXNlCisJICogU2V0cyB0aGUgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QuCiAJICoKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggYmluZGluZ3MsIGZhbHNlIG90aGVyd2lzZQotCSAqIEBzaW5jZSAzLjMKKwkgKiBAcGFyYW0gcmVzb2x2ZXIgdGhlIG5ldyBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVAogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdmVkQmluZGluZ3MoKSB7Ci0JCXJldHVybiAodGhpcy5iaXRzICYgUkVTT0xWRURfQklORElOR1MpICE9IDA7CisJdm9pZCBzZXRCaW5kaW5nUmVzb2x2ZXIoQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyKSB7CisJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXN0IHRyZWUgd2FzIGNyZWF0ZWQgd2l0aCBzdGF0ZW1lbnRzIHJlY292ZXJ5LCBmYWxzZSBvdGhlcndpc2UKKwkgKiBTZXRzIGRlZmF1bHQgbm9kZSBmbGFncyBvZiBuZXcgbm9kZXMgb2YgdGhpcyBBU1QuCiAJICoKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggc3RhdGVtZW50cyByZWNvdmVyeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogQHNpbmNlIDMuMworCSAqIEBwYXJhbSBmbGFnIG5vZGUgZmxhZ3Mgb2YgbmV3IG5vZGVzIG9mIHRoaXMgQVNUCisJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N0YXRlbWVudHNSZWNvdmVyeSgpIHsKLQkJcmV0dXJuICh0aGlzLmJpdHMgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwOworCXZvaWQgc2V0RGVmYXVsdE5vZGVGbGFnKGludCBmbGFnKSB7CisJCXRoaXMuZGVmYXVsdE5vZGVGbGFnID0gZmxhZzsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzdCB0cmVlIHdhcyBjcmVhdGVkIHdpdGggYmluZGluZ3MgcmVjb3ZlcnksIGZhbHNlIG90aGVyd2lzZQorCSAqIFNldHMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoaXMgQVNULgogCSAqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBhc3QgdHJlZSB3YXMgY3JlYXRlZCB3aXRoIGJpbmRpbmdzIHJlY292ZXJ5LCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAc2luY2UgMy4zCisJICogQHBhcmFtIGV2ZW50SGFuZGxlciB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhpcyBBU1QKKwkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ3NSZWNvdmVyeSgpIHsKLQkJcmV0dXJuICh0aGlzLmJpdHMgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMDsKKwl2b2lkIHNldEV2ZW50SGFuZGxlcihOb2RlRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcikgeworCQlpZiAodGhpcy5ldmVudEhhbmRsZXIgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyOwogCX0KIAogCXZvaWQgc2V0RmxhZyhpbnQgbmV3VmFsdWUpIHsKIAkJdGhpcy5iaXRzIHw9IG5ld1ZhbHVlOwogCX0KKworCS8qKgorCSAqIFNldCA8Y29kZT5vcmlnaW5hbE1vZGlmaWNhdGlvbkNvdW50PC9jb2RlPiB0byB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gY291bnQKKwkgKgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwl2b2lkIHNldE9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQobG9uZyBjb3VudCkgeworCQl0aGlzLm9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQgPSBjb3VudDsKKwl9CisKKwkvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGlzIEFTVCBvcGVyYXRpb24gaXMgb25seSB1c2VkIHdoZW4KKyAgICAgKiBidWlsZGluZyBsZXZlbCBKTFMyIEFTVHMuCisKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJICogQHNpbmNlIDMuMAorICAgICAqLworCXZvaWQgc3VwcG9ydGVkT25seUluMigpIHsKKwkgIGlmICh0aGlzLmFwaUxldmVsICE9IEFTVC5KTFMyKSB7CisJICAJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBKTFMyIEFTVCIpOyAvLyROT04tTkxTLTEkCisJICB9CisJfQorCisJLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhpcyBBU1Qgb3BlcmF0aW9uIGlzIG5vdCB1c2VkIHdoZW4KKyAgICAgKiBidWlsZGluZyBsZXZlbCBKTFMyIEFTVHMuCisKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJICogQHNpbmNlIDMuMAorICAgICAqLworCXZvaWQgdW5zdXBwb3J0ZWRJbjIoKSB7CisJICBpZiAodGhpcy5hcGlMZXZlbCA9PSBBU1QuSkxTMikgeworCSAgCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gSkxTMiBBU1QiKTsgLy8kTk9OLU5MUy0xJAorCSAgfQorCX0KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RDb252ZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUQ29udmVydGVyLmphdmEKaW5kZXggYzU1YTZhNi4uYTc3MmFkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RDb252ZXJ0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM5LDE3ICszOSwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWxDb25jYXRlbmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldpbGRjYXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkV4dHJhQ29tcGlsZXJNb2RpZmllcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcnlTY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCiAgKiBJbnRlcm5hbCBjbGFzcyBmb3IgY29udmVydGluZyBpbnRlcm5hbCBjb21waWxlciBBU1RzIGludG8gcHVibGljIEFTVHMuCkBAIC02NCw3ICs2Nyw3IEBACiAJLy8gY29tbWVudHMKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNpZGVDb21tZW50czsKIAlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByb3RlY3RlZCBTZXQgcGVuZGluZ05hbWVTY29wZVJlc29sdXRpb247CQorCXByb3RlY3RlZCBTZXQgcGVuZGluZ05hbWVTY29wZVJlc29sdXRpb247CiAJcHJvdGVjdGVkIFNldCBwZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb247CiAJcHJvdGVjdGVkIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzOwogCVNjYW5uZXIgc2Nhbm5lcjsKQEAgLTczLDEzICs3NiwxMSBAQAogCXB1YmxpYyBBU1RDb252ZXJ0ZXIoTWFwIG9wdGlvbnMsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJdGhpcy5yZXNvbHZlQmluZGluZ3MgPSByZXNvbHZlQmluZGluZ3M7CiAJCU9iamVjdCBzb3VyY2VNb2RlU2V0dGluZyA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7Ci0JCWxvbmcgc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOwotCQlpZiAoSmF2YUNvcmUuVkVSU0lPTl8xXzQuZXF1YWxzKHNvdXJjZU1vZGVTZXR0aW5nKSkgewotCQkJc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwotCQl9IGVsc2UgaWYgKEphdmFDb3JlLlZFUlNJT05fMV81LmVxdWFscyhzb3VyY2VNb2RlU2V0dGluZykpIHsKLQkJCXNvdXJjZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJbG9uZyBzb3VyY2VMZXZlbCA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChzb3VyY2VNb2RlU2V0dGluZyk7CisJCWlmIChzb3VyY2VMZXZlbCA9PSAwKSB7CisJCQkvLyB1bmtub3duIHNvdXJjZU1vZGVTZXR0aW5nCisJCQlzb3VyY2VMZXZlbCA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzM7CiAJCX0KLQogCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcigKIAkJCXRydWUgLypjb21tZW50Ki8sCiAJCQlmYWxzZSAvKndoaXRlc3BhY2UqLywKQEAgLTkxLDcgKzkyLDcgQEAKIAkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKIAkJdGhpcy5pbnNpZGVDb21tZW50cyA9IEphdmFDb3JlLkVOQUJMRUQuZXF1YWxzKG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0RPQ19DT01NRU5UX1NVUFBPUlQpKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBhZGp1c3RTb3VyY2VQb3NpdGlvbnNGb3JQYXJlbnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaW50IHN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKIAkJaW50IGVuZCA9IGV4cHJlc3Npb24uc291cmNlRW5kOwpAQCAtMTIxLDI2ICsxMjIsMjkgQEAKIAkJfQogCX0KIAotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQm9keURlY2xhcmF0aW9ucyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJcHJvdGVjdGVkIHZvaWQgYnVpbGRCb2R5RGVjbGFyYXRpb25zKAorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wsCisJCQlib29sZWFuIGlzSW50ZXJmYWNlKSB7CiAJCS8vIGFkZCBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBsZXhpY2FsIG9yZGVyCiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gbWVtYmVycyA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlczsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwotCQkKKwogCQlpbnQgZmllbGRzTGVuZ3RoID0gZmllbGRzID09IG51bGw/IDAgOiBmaWVsZHMubGVuZ3RoOwogCQlpbnQgbWV0aG9kc0xlbmd0aCA9IG1ldGhvZHMgPT0gbnVsbD8gMCA6IG1ldGhvZHMubGVuZ3RoOwogCQlpbnQgbWVtYmVyc0xlbmd0aCA9IG1lbWJlcnMgPT0gbnVsbCA/IDAgOiBtZW1iZXJzLmxlbmd0aDsKIAkJaW50IGZpZWxkc0luZGV4ID0gMDsKIAkJaW50IG1ldGhvZHNJbmRleCA9IDA7CiAJCWludCBtZW1iZXJzSW5kZXggPSAwOwotCQkKKwogCQl3aGlsZSAoKGZpZWxkc0luZGV4IDwgZmllbGRzTGVuZ3RoKQogCQkJfHwgKG1lbWJlcnNJbmRleCA8IG1lbWJlcnNMZW5ndGgpCiAJCQl8fCAobWV0aG9kc0luZGV4IDwgbWV0aG9kc0xlbmd0aCkpIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBuZXh0RmllbGREZWNsYXJhdGlvbiA9IG51bGw7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbnVsbDsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIG5leHRNZW1iZXJEZWNsYXJhdGlvbiA9IG51bGw7Ci0JCQorCiAJCQlpbnQgcG9zaXRpb24gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAkJCWludCBuZXh0RGVjbGFyYXRpb25UeXBlID0gLTE7CiAJCQlpZiAoZmllbGRzSW5kZXggPCBmaWVsZHNMZW5ndGgpIHsKQEAgLTE3Niw3ICsxODAsNyBAQAogCQkJCWNhc2UgMSA6CiAJCQkJCW1ldGhvZHNJbmRleCsrOwogCQkJCQlpZiAoIW5leHRNZXRob2REZWNsYXJhdGlvbi5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpICYmICFuZXh0TWV0aG9kRGVjbGFyYXRpb24uaXNDbGluaXQoKSkgewotCQkJCQkJdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KG5leHRNZXRob2REZWNsYXJhdGlvbikpOworCQkJCQkJdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KGlzSW50ZXJmYWNlLCBuZXh0TWV0aG9kRGVjbGFyYXRpb24pKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIDIgOgpAQCAtMTkyLDI3ICsxOTYsMjcgQEAKIAkJLy8gQ29udmVydCBqYXZhZG9jCiAJCWNvbnZlcnQodHlwZURlY2xhcmF0aW9uLmphdmFkb2MsIHR5cGVEZWNsKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBidWlsZEJvZHlEZWNsYXJhdGlvbnMob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uMiwgRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbikgewogCQkvLyBhZGQgYm9keSBkZWNsYXJhdGlvbiBpbiB0aGUgbGV4aWNhbCBvcmRlcgogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbltdIG1lbWJlcnMgPSBlbnVtRGVjbGFyYXRpb24yLm1lbWJlclR5cGVzOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSBlbnVtRGVjbGFyYXRpb24yLmZpZWxkczsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IGVudW1EZWNsYXJhdGlvbjIubWV0aG9kczsKLQkJCisKIAkJaW50IGZpZWxkc0xlbmd0aCA9IGZpZWxkcyA9PSBudWxsPyAwIDogZmllbGRzLmxlbmd0aDsKIAkJaW50IG1ldGhvZHNMZW5ndGggPSBtZXRob2RzID09IG51bGw/IDAgOiBtZXRob2RzLmxlbmd0aDsKIAkJaW50IG1lbWJlcnNMZW5ndGggPSBtZW1iZXJzID09IG51bGwgPyAwIDogbWVtYmVycy5sZW5ndGg7CiAJCWludCBmaWVsZHNJbmRleCA9IDA7CiAJCWludCBtZXRob2RzSW5kZXggPSAwOwogCQlpbnQgbWVtYmVyc0luZGV4ID0gMDsKLQkJCisKIAkJd2hpbGUgKChmaWVsZHNJbmRleCA8IGZpZWxkc0xlbmd0aCkKIAkJCXx8IChtZW1iZXJzSW5kZXggPCBtZW1iZXJzTGVuZ3RoKQogCQkJfHwgKG1ldGhvZHNJbmRleCA8IG1ldGhvZHNMZW5ndGgpKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24gbmV4dEZpZWxkRGVjbGFyYXRpb24gPSBudWxsOwogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG5leHRNZXRob2REZWNsYXJhdGlvbiA9IG51bGw7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiBuZXh0TWVtYmVyRGVjbGFyYXRpb24gPSBudWxsOwotCQkKKwogCQkJaW50IHBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7CiAJCQlpbnQgbmV4dERlY2xhcmF0aW9uVHlwZSA9IC0xOwogCQkJaWYgKGZpZWxkc0luZGV4IDwgZmllbGRzTGVuZ3RoKSB7CkBAIC0yNDgsNyArMjUyLDcgQEAKIAkJCQljYXNlIDEgOgogCQkJCQltZXRob2RzSW5kZXgrKzsKIAkJCQkJaWYgKCFuZXh0TWV0aG9kRGVjbGFyYXRpb24uaXNEZWZhdWx0Q29uc3RydWN0b3IoKSAmJiAhbmV4dE1ldGhvZERlY2xhcmF0aW9uLmlzQ2xpbml0KCkpIHsKLQkJCQkJCWVudW1EZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGNvbnZlcnQobmV4dE1ldGhvZERlY2xhcmF0aW9uKSk7CisJCQkJCQllbnVtRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KGZhbHNlLCBuZXh0TWV0aG9kRGVjbGFyYXRpb24pKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIDIgOgpAQCAtMjU5LDI3ICsyNjMsMjcgQEAKIAkJfQogCQljb252ZXJ0KGVudW1EZWNsYXJhdGlvbjIuamF2YWRvYywgZW51bURlY2xhcmF0aW9uKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBidWlsZEJvZHlEZWNsYXJhdGlvbnMob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gZXhwcmVzc2lvbiwgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKSB7CiAJCS8vIGFkZCBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBsZXhpY2FsIG9yZGVyCiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gbWVtYmVycyA9IGV4cHJlc3Npb24ubWVtYmVyVHlwZXM7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IGV4cHJlc3Npb24uZmllbGRzOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gZXhwcmVzc2lvbi5tZXRob2RzOwotCQkKKwogCQlpbnQgZmllbGRzTGVuZ3RoID0gZmllbGRzID09IG51bGw/IDAgOiBmaWVsZHMubGVuZ3RoOwogCQlpbnQgbWV0aG9kc0xlbmd0aCA9IG1ldGhvZHMgPT0gbnVsbD8gMCA6IG1ldGhvZHMubGVuZ3RoOwogCQlpbnQgbWVtYmVyc0xlbmd0aCA9IG1lbWJlcnMgPT0gbnVsbCA/IDAgOiBtZW1iZXJzLmxlbmd0aDsKIAkJaW50IGZpZWxkc0luZGV4ID0gMDsKIAkJaW50IG1ldGhvZHNJbmRleCA9IDA7CiAJCWludCBtZW1iZXJzSW5kZXggPSAwOwotCQkKKwogCQl3aGlsZSAoKGZpZWxkc0luZGV4IDwgZmllbGRzTGVuZ3RoKQogCQkJfHwgKG1lbWJlcnNJbmRleCA8IG1lbWJlcnNMZW5ndGgpCiAJCQl8fCAobWV0aG9kc0luZGV4IDwgbWV0aG9kc0xlbmd0aCkpIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBuZXh0RmllbGREZWNsYXJhdGlvbiA9IG51bGw7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbnVsbDsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIG5leHRNZW1iZXJEZWNsYXJhdGlvbiA9IG51bGw7Ci0JCQorCiAJCQlpbnQgcG9zaXRpb24gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAkJCWludCBuZXh0RGVjbGFyYXRpb25UeXBlID0gLTE7CiAJCQlpZiAoZmllbGRzSW5kZXggPCBmaWVsZHNMZW5ndGgpIHsKQEAgLTMxNSw3ICszMTksNyBAQAogCQkJCWNhc2UgMSA6CiAJCQkJCW1ldGhvZHNJbmRleCsrOwogCQkJCQlpZiAoIW5leHRNZXRob2REZWNsYXJhdGlvbi5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpICYmICFuZXh0TWV0aG9kRGVjbGFyYXRpb24uaXNDbGluaXQoKSkgewotCQkJCQkJYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGNvbnZlcnQobmV4dE1ldGhvZERlY2xhcmF0aW9uKSk7CisJCQkJCQlhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoY29udmVydChmYWxzZSwgbmV4dE1ldGhvZERlY2xhcmF0aW9uKSk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyIDoKQEAgLTMyOSw3ICszMzMsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdAogCSAqIEBwYXJhbSBjb21tZW50cwpAQCAtMzUzLDcgKzM1Nyw3IEBACiAJCX0KIAkJY29tcGlsYXRpb25Vbml0LnNldENvbW1lbnRUYWJsZSh0aGlzLmNvbW1lbnRzVGFibGUpOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIGNoZWNrQW5kQWRkTXVsdGlwbGVGaWVsZERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcywgaW50IGluZGV4LCBMaXN0IGJvZHlEZWNsYXJhdGlvbnMpIHsKIAkJaWYgKGZpZWxkc1tpbmRleF0gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyIG9sZEluaXRpYWxpemVyID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXIpIGZpZWxkc1tpbmRleF07CkBAIC0zNzksMTggKzM4MywxOCBAQAogCiAJcHJvdGVjdGVkIHZvaWQgY2hlY2tBbmRBZGRNdWx0aXBsZUxvY2FsRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnRbXSBzdG10cywgaW50IGluZGV4LCBMaXN0IGJsb2NrU3RhdGVtZW50cykgewogCQlpZiAoaW5kZXggPiAwCi0JCSAgICAmJiBzdG10c1tpbmRleCAtIDFdIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKSB7Ci0JCSAgICAJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uIGxvY2FsMSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pIHN0bXRzW2luZGV4IC0gMV07Ci0JCSAgICAJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uIGxvY2FsMiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pIHN0bXRzW2luZGV4XTsKLQkJCSAgIGlmIChsb2NhbDEuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9PSBsb2NhbDIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgewotCQkJCQkvLyB3ZSBoYXZlIGEgbXVsdGlwbGUgbG9jYWwgZGVjbGFyYXRpb25zCi0JCQkJCS8vIFdlIHJldHJpZXZlIHRoZSBleGlzdGluZyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHRvIGFkZCB0aGUgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAotCQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgYmxvY2tTdGF0ZW1lbnRzLmdldChibG9ja1N0YXRlbWVudHMuc2l6ZSgpIC0gMSk7Ci0JCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCkuYWRkKGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKXN0bXRzW2luZGV4XSkpOwotCQkJICAgfSBlbHNlIHsKLQkJCQkJLy8gd2UgY2FuIGNyZWF0ZSBhIG5ldyBGaWVsZERlY2xhcmF0aW9uCi0JCQkJCWJsb2NrU3RhdGVtZW50cy5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKXN0bXRzW2luZGV4XSkpOwotCQkJICAgfQorCQkJCSYmIHN0bXRzW2luZGV4IC0gMV0gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbiBsb2NhbDEgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKSBzdG10c1tpbmRleCAtIDFdOworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uIGxvY2FsMiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pIHN0bXRzW2luZGV4XTsKKwkJCWlmIChsb2NhbDEuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9PSBsb2NhbDIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgeworCQkJCS8vIHdlIGhhdmUgYSBtdWx0aXBsZSBsb2NhbCBkZWNsYXJhdGlvbnMKKwkJCQkvLyBXZSByZXRyaWV2ZSB0aGUgZXhpc3RpbmcgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB0byBhZGQgdGhlIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKKwkJCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgYmxvY2tTdGF0ZW1lbnRzLmdldChibG9ja1N0YXRlbWVudHMuc2l6ZSgpIC0gMSk7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKS5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pc3RtdHNbaW5kZXhdKSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdlIGNhbiBjcmVhdGUgYSBuZXcgRmllbGREZWNsYXJhdGlvbgorCQkJCWJsb2NrU3RhdGVtZW50cy5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKXN0bXRzW2luZGV4XSkpOworCQkJfQogCQl9IGVsc2UgewogCQkJLy8gd2UgY2FuIGNyZWF0ZSBhIG5ldyBGaWVsZERlY2xhcmF0aW9uCiAJCQlibG9ja1N0YXRlbWVudHMuYWRkKGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbilzdG10c1tpbmRleF0pKTsKQEAgLTQxMyw4ICs0MTcsOCBAQAogCQkJfQogCQl9CiAJfQotCQkKLQlwdWJsaWMgQVNUTm9kZSBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgeworCisJcHVibGljIEFTVE5vZGUgY29udmVydChib29sZWFuIGlzSW50ZXJmYWNlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJY2hlY2tDYW5jZWxlZCgpOwogCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbik7CkBAIC00MzAsMjEgKzQzNCwzNiBAQAogCQltZXRob2ROYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQltZXRob2REZWNsLnNldE5hbWUobWV0aG9kTmFtZSk7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZVtdIHRocm93bkV4Y2VwdGlvbnMgPSBtZXRob2REZWNsYXJhdGlvbi50aHJvd25FeGNlcHRpb25zOwotCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgdGhyb3duRXhjZXB0aW9uc0xlbmd0aCA9IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd25FeGNlcHRpb25zTGVuZ3RoOyBpKyspIHsKLQkJCQltZXRob2REZWNsLnRocm93bkV4Y2VwdGlvbnMoKS5hZGQoY29udmVydCh0aHJvd25FeGNlcHRpb25zW2ldKSk7Ci0JCQl9CisJCWludCBtZXRob2RIZWFkZXJFbmQgPSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CisJCWludCB0aHJvd25FeGNlcHRpb25zTGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucyA9PSBudWxsID8gMCA6IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQlpZiAodGhyb3duRXhjZXB0aW9uc0xlbmd0aCA+IDApIHsKKwkJCU5hbWUgdGhyb3duRXhjZXB0aW9uOworCQkJaW50IGkgPSAwOworCQkJZG8geworCQkJCXRocm93bkV4Y2VwdGlvbiA9IGNvbnZlcnQodGhyb3duRXhjZXB0aW9uc1tpKytdKTsKKwkJCQltZXRob2REZWNsLnRocm93bkV4Y2VwdGlvbnMoKS5hZGQodGhyb3duRXhjZXB0aW9uKTsKKwkJCX0gd2hpbGUgKGkgPCB0aHJvd25FeGNlcHRpb25zTGVuZ3RoKTsKKwkJCW1ldGhvZEhlYWRlckVuZCA9IHRocm93bkV4Y2VwdGlvbi5nZXRTdGFydFBvc2l0aW9uKCkgKyB0aHJvd25FeGNlcHRpb24uZ2V0TGVuZ3RoKCk7CiAJCX0KIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudFtdIHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHM7Ci0JCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKLQkJCWludCBwYXJhbWV0ZXJzTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnNMZW5ndGg7IGkrKykgewotCQkJCW1ldGhvZERlY2wucGFyYW1ldGVycygpLmFkZChjb252ZXJ0KHBhcmFtZXRlcnNbaV0pKTsKKwkJaW50IHBhcmFtZXRlcnNMZW5ndGggPSBwYXJhbWV0ZXJzID09IG51bGwgPyAwIDogcGFyYW1ldGVycy5sZW5ndGg7CisJCWlmIChwYXJhbWV0ZXJzTGVuZ3RoID4gMCkgeworCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXI7CisJCQlpbnQgaSA9IDA7CisJCQlkbyB7CisJCQkJcGFyYW1ldGVyID0gY29udmVydChwYXJhbWV0ZXJzW2krK10pOworCQkJCW1ldGhvZERlY2wucGFyYW1ldGVycygpLmFkZChwYXJhbWV0ZXIpOworCQkJfSB3aGlsZSAoaSA8IHBhcmFtZXRlcnNMZW5ndGgpOworCQkJaWYgKHRocm93bkV4Y2VwdGlvbnNMZW5ndGggPT0gMCkgeworCQkJCW1ldGhvZEhlYWRlckVuZCA9IHBhcmFtZXRlci5nZXRTdGFydFBvc2l0aW9uKCkgKyBwYXJhbWV0ZXIuZ2V0TGVuZ3RoKCk7CiAJCQl9CiAJCX0KIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IG51bGw7CiAJCWlmIChpc0NvbnN0cnVjdG9yKSB7CisJCQlpZiAoaXNJbnRlcmZhY2UpIHsKKwkJCQkvLyBpbnRlcmZhY2UgY2Fubm90IGhhdmUgYSBjb25zdHJ1Y3RvcgorCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOworCQkJfQogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKIAkJCWV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5jb25zdHJ1Y3RvckNhbGw7CiAJCQlzd2l0Y2godGhpcy5hc3QuYXBpTGV2ZWwpIHsKQEAgLTQ1NSw3ICs0NzQsNyBAQAogCQkJCQlyZXR1cm5UeXBlLnNldFNvdXJjZVJhbmdlKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCAwKTsKIAkJCQkJbWV0aG9kRGVjbC5pbnRlcm5hbFNldFJldHVyblR5cGUocmV0dXJuVHlwZSk7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCWRlZmF1bHQgOgogCQkJCQltZXRob2REZWNsLnNldFJldHVyblR5cGUyKG51bGwpOwogCQkJfQogCQl9IGVsc2UgaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbikgewpAQCAtNDY5LDM0ICs0ODgsMzggQEAKIAkJCQltZXRob2REZWNsLnNldEV4dHJhRGltZW5zaW9ucyhleHRyYURpbWVuc2lvbnMpOwogCQkJCXNldFR5cGVGb3JNZXRob2REZWNsYXJhdGlvbihtZXRob2REZWNsLCByZXR1cm5UeXBlLCBleHRyYURpbWVuc2lvbnMpOwogCQkJfSBlbHNlIHsKKwkJCQkvLyBubyByZXR1cm4gdHlwZSBmb3IgYSBtZXRob2QgdGhhdCBpcyBub3QgYSBjb25zdHJ1Y3RvcgorCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgewogCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKLQkJCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQlkZWZhdWx0IDoKIAkJCQkJCW1ldGhvZERlY2wuc2V0UmV0dXJuVHlwZTIobnVsbCk7CiAJCQkJfQogCQkJfQogCQl9CiAJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkJaW50IGRlY2xhcmF0aW9uU291cmNlRW5kID0gbWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZDsKLQkJbWV0aG9kRGVjbC5zZXRTb3VyY2VSYW5nZShkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBkZWNsYXJhdGlvblNvdXJjZUVuZCAtIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKLQkJaW50IGNsb3NpbmdQb3NpdGlvbiA9IHJldHJpZXZlUmlnaHRCcmFjZU9yU2VtaUNvbG9uUG9zaXRpb24obWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZCArIDEsIG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJaW50IGJvZHlFbmQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kOworCQltZXRob2REZWNsLnNldFNvdXJjZVJhbmdlKGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGJvZHlFbmQgLSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZCA9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCQlpbnQgcmlnaHRCcmFjZU9yU2VtaUNvbG9uUG9zaXRpb25TdGFydCA9IGJvZHlFbmQgPT0gZGVjbGFyYXRpb25Tb3VyY2VFbmQgPyBib2R5RW5kIDogYm9keUVuZCArIDE7CisJCWludCBjbG9zaW5nUG9zaXRpb24gPSByZXRyaWV2ZVJpZ2h0QnJhY2VPclNlbWlDb2xvblBvc2l0aW9uKHJpZ2h0QnJhY2VPclNlbWlDb2xvblBvc2l0aW9uU3RhcnQsIGRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAkJaWYgKGNsb3NpbmdQb3NpdGlvbiAhPSAtMSkgewogCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBtZXRob2REZWNsLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCW1ldGhvZERlY2wuc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpOwogCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudFtdIHN0YXRlbWVudHMgPSBtZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzOwotCQkJCi0JCQlzdGFydCA9IHJldHJpZXZlU3RhcnRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBkZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQllbmQgPSByZXRyaWV2ZUVuZEJsb2NrUG9zaXRpb24obWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKworCQkJc3RhcnQgPSByZXRyaWV2ZVN0YXJ0QmxvY2tQb3NpdGlvbihtZXRob2RIZWFkZXJFbmQsIG1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCk7CisJCQlpZiAoc3RhcnQgPT0gLTEpIHN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0OyAvLyB1c2UgcmVjb3ZlcnkgcG9zaXRpb24gZm9yIGJvZHkgc3RhcnQKKwkJCWVuZCA9IHJldHJpZXZlUmlnaHRCcmFjZShtZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kLCBkZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAJCQlCbG9jayBibG9jayA9IG51bGw7CiAJCQlpZiAoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKSB7CiAJCQkJLyoKIAkJCQkgKiBzdGFydCBvciBlbmQgY2FuIGJlIGVxdWFsIHRvIC0xIGlmIHdlIGhhdmUgYW4gaW50ZXJmYWNlJ3MgbWV0aG9kLgogCQkJCSAqLwogCQkJCWJsb2NrID0gbmV3IEJsb2NrKHRoaXMuYXN0KTsKLQkJCQlibG9jay5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQlibG9jay5zZXRTb3VyY2VSYW5nZShzdGFydCwgY2xvc2luZ1Bvc2l0aW9uIC0gc3RhcnQgKyAxKTsKIAkJCQltZXRob2REZWNsLnNldEJvZHkoYmxvY2spOwogCQkJfQogCQkJaWYgKGJsb2NrICE9IG51bGwgJiYgKHN0YXRlbWVudHMgIT0gbnVsbCB8fCBleHBsaWNpdENvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSkgewpAQCAtNTE1LDEzICs1MzgsMTggQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWlmIChibG9jayAhPSBudWxsICYmIChNb2RpZmllci5pc0Fic3RyYWN0KG1ldGhvZERlY2wuZ2V0TW9kaWZpZXJzKCkpIHx8IE1vZGlmaWVyLmlzTmF0aXZlKG1ldGhvZERlY2wuZ2V0TW9kaWZpZXJzKCkpKSkgeworCQkJaWYgKGJsb2NrICE9IG51bGwKKwkJCQkJJiYgKE1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kRGVjbC5nZXRNb2RpZmllcnMoKSkKKwkJCQkJCQl8fCBNb2RpZmllci5pc05hdGl2ZShtZXRob2REZWNsLmdldE1vZGlmaWVycygpKQorCQkJCQkJCXx8IGlzSW50ZXJmYWNlKSkgewogCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLy8gc3ludGF4IGVycm9yIGluIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uCisJCQltZXRob2REZWNsLnNldEZsYWdzKG1ldGhvZERlY2wuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCWlmICghbWV0aG9kRGVjbGFyYXRpb24uaXNOYXRpdmUoKSAmJiAhbWV0aG9kRGVjbGFyYXRpb24uaXNBYnN0cmFjdCgpKSB7Ci0JCQkJc3RhcnQgPSByZXRyaWV2ZVN0YXJ0QmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJCXN0YXJ0ID0gcmV0cmlldmVTdGFydEJsb2NrUG9zaXRpb24obWV0aG9kSGVhZGVyRW5kLCBib2R5RW5kKTsKKwkJCQlpZiAoc3RhcnQgPT0gLTEpIHN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0OyAvLyB1c2UgcmVjb3ZlcnkgcG9zaXRpb24gZm9yIGJvZHkgc3RhcnQKIAkJCQllbmQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kOwogCQkJCS8vIHRyeSB0byBnZXQgdGhlIGJlc3QgZW5kIHBvc2l0aW9uCiAJCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSBtZXRob2REZWNsYXJhdGlvbi5jb21waWxhdGlvblJlc3VsdCgpLnByb2JsZW1zOwpAQCAtNTQ0LDcgKzU3Miw3IEBACiAJCQkJCWJsb2NrLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQkJCQltZXRob2REZWNsLnNldEJvZHkoYmxvY2spOwogCQkJCX0KLQkJCX0JCQkKKwkJCX0KIAkJfQogCiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMoKTsKQEAgLTU1MywxMyArNTgxLDEzIEBACiAJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCQlicmVhazsKLQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQlkZWZhdWx0IDoKIAkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCQltZXRob2REZWNsLnR5cGVQYXJhbWV0ZXJzKCkuYWRkKGNvbnZlcnQodHlwZVBhcmFtZXRlcnNbaV0pKTsKIAkJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCS8vIFRoZSBqYXZhZG9jIGNvbW1lbnQgaXMgbm93IGdvdCBmcm9tIGxpc3Qgc3RvcmUgaW4gY29tcGlsYXRpb24gdW5pdCBkZWNsYXJhdGlvbgogCQljb252ZXJ0KG1ldGhvZERlY2xhcmF0aW9uLmphdmFkb2MsIG1ldGhvZERlY2wpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKQEAgLTU2OCw4ICs1OTYsOCBAQAogCQkJbWV0aG9kRGVjbC5yZXNvbHZlQmluZGluZygpOwogCQl9CiAJCXJldHVybiBtZXRob2REZWNsOwotCX0JCi0JCisJfQorCiAJcHVibGljIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWxsb2NhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gbmV3IENsYXNzSW5zdGFuY2VDcmVhdGlvbih0aGlzLmFzdCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtNTgwLDcgKzYwOCw3IEBACiAJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXRGbGFncyhjbGFzc0luc3RhbmNlQ3JlYXRpb24uZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJZGVmYXVsdCA6CiAJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBleHByZXNzaW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi50eXBlQXJndW1lbnRzKCkuYWRkKGNvbnZlcnRUeXBlKGV4cHJlc3Npb24udHlwZUFyZ3VtZW50c1tpXSkpOwogCQkJCQl9CkBAIC01OTAsNyArNjE4LDcgQEAKIAkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgogCQkJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5pbnRlcm5hbFNldE5hbWUoY29udmVydChleHByZXNzaW9uLnR5cGUpKTsKIAkJCQlicmVhazsKLQkJCWNhc2UgQVNULkpMUzMgOgorCQkJZGVmYXVsdCA6CiAJCQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldFR5cGUoY29udmVydFR5cGUoZXhwcmVzc2lvbi50eXBlKSk7CiAJCX0KIAkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOwpAQCAtNjM4LDEwICs2NjYsMTAgQEAKIAkJCQkgCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewogCQkJCSAJCUV4cHJlc3Npb24gZXhwciA9IHRlbXA7CiAJCQkJIAkJdGVtcCA9IG5ldyBJbmZpeEV4cHJlc3Npb24odGhpcy5hc3QpOwotCQkJCSAJCQorCiAJCQkJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHRlbXAsIGV4cHJlc3Npb24pOwotCQkJCQkJfQkJCQkgCQorCQkJCQkJfQogCQkJCSAJCXRlbXAuc2V0TGVmdE9wZXJhbmQoZXhwcik7CiAJCQkJCSAJdGVtcC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvckZvcihleHByZXNzaW9uT3BlcmF0b3JJRCkpOwogCQkJCQkJdGVtcC5zZXRTb3VyY2VSYW5nZShleHByLmdldFN0YXJ0UG9zaXRpb24oKSwgZXhwci5nZXRMZW5ndGgoKSk7CkBAIC02ODIsOCArNzEwLDkgQEAKIAkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKIAl9CiAKLQlwdWJsaWMgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBjb252ZXJ0VG9Bbm5vdGF0aW9uRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJcHJpdmF0ZSBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGNvbnZlcnRUb0Fubm90YXRpb25EZWNsYXJhdGlvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKIAkJY2hlY2tDYW5jZWxlZCgpOworCQlpZiAodGhpcy5zY2FubmVyLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgcmV0dXJuIG51bGw7CiAJCUFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0aGlzLmFzdC5uZXdBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKCk7CiAJCXNldE1vZGlmaWVycyh0eXBlRGVjbCwgdHlwZURlY2xhcmF0aW9uKTsKIAkJZmluYWwgU2ltcGxlTmFtZSB0eXBlTmFtZSA9IG5ldyBTaW1wbGVOYW1lKHRoaXMuYXN0KTsKQEAgLTY5MSw4ICs3MjAsOCBAQAogCQl0eXBlTmFtZS5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKIAkJdHlwZURlY2wuc2V0TmFtZSh0eXBlTmFtZSk7CiAJCXR5cGVEZWNsLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uYm9keUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7Ci0JCQotCQlidWlsZEJvZHlEZWNsYXJhdGlvbnModHlwZURlY2xhcmF0aW9uLCB0eXBlRGVjbCk7CisKKwkJYnVpbGRCb2R5RGVjbGFyYXRpb25zKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2wsIGZhbHNlKTsKIAkJLy8gVGhlIGphdmFkb2MgY29tbWVudCBpcyBub3cgZ290IGZyb20gbGlzdCBzdG9yZSBpbiBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uCiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXModHlwZURlY2wsIHR5cGVEZWNsYXJhdGlvbik7CkBAIC03MDEsNyArNzMwLDcgQEAKIAkJfQogCQlyZXR1cm4gdHlwZURlY2w7CiAJfQotCQorCiAJcHVibGljIEFTVE5vZGUgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKSB7CiAJCWNoZWNrQ2FuY2VsZWQoKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CkBAIC03MzYsNyArNzY1LDcgQEAKIAkJfQogCQlyZXR1cm4gYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbjI7CiAJfQotCQorCiAJcHVibGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50IGFyZ3VtZW50KSB7CiAJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGVEZWNsID0gbmV3IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24odGhpcy5hc3QpOwogCQlzZXRNb2RpZmllcnModmFyaWFibGVEZWNsLCBhcmd1bWVudCk7CkBAIC03NzAsMTMgKzc5OSwxMyBAQAogCQkJc2V0VHlwZUZvclNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsLCB0eXBlLCBleHRyYURpbWVuc2lvbnMpOwogCQl9CiAJCXZhcmlhYmxlRGVjbC5zZXRTb3VyY2VSYW5nZShhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCByaWdodEVuZCAtIGFyZ3VtZW50LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKLQkJCisKIAkJaWYgKGlzVmFyQXJncykgewogCQkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7CiAJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCXZhcmlhYmxlRGVjbC5zZXRGbGFncyh2YXJpYWJsZURlY2wuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJZGVmYXVsdCA6CiAJCQkJCXZhcmlhYmxlRGVjbC5zZXRWYXJhcmdzKHRydWUpOwogCQkJfQogCQl9CkBAIC03ODgsNyArODE3LDcgQEAKIAkJcmV0dXJuIHZhcmlhYmxlRGVjbDsKIAl9CiAKLQkKKwogCXB1YmxpYyBBbm5vdGF0aW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKIAkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU1lbWJlckFubm90YXRpb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24pOwpAQCAtODA2LDcgKzgzNSw3IEBACiAJCX0KIAkJYXJyYXlDcmVhdGlvbi5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uW10gZGltZW5zaW9ucyA9IGV4cHJlc3Npb24uZGltZW5zaW9uczsKLQkJCisKIAkJaW50IGRpbWVuc2lvbnNMZW5ndGggPSBkaW1lbnNpb25zLmxlbmd0aDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zTGVuZ3RoOyBpKyspIHsKIAkJCWlmIChkaW1lbnNpb25zW2ldICE9IG51bGwpIHsKQEAgLTgyMCw3ICs4NDksNyBAQAogCQlUeXBlIHR5cGUgPSBjb252ZXJ0VHlwZShleHByZXNzaW9uLnR5cGUpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCXJlY29yZE5vZGVzKHR5cGUsIGV4cHJlc3Npb24udHlwZSk7Ci0JCX0JCQorCQl9CiAJCUFycmF5VHlwZSBhcnJheVR5cGUgPSBudWxsOwogCQlpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7CiAJCQlhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwpAQCAtODI4LDEwICs4NTcsMTAgQEAKIAkJCWFycmF5VHlwZSA9IHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0eXBlLCBkaW1lbnNpb25zTGVuZ3RoKTsKIAkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJCWNvbXBsZXRlUmVjb3JkKGFycmF5VHlwZSwgZXhwcmVzc2lvbik7Ci0JCQl9CQkJCisJCQl9CiAJCQlpbnQgc3RhcnQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCWludCBlbmQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKSArIHR5cGUuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgcHJldmlvdXNTZWFyY2hTdGFydCA9IGVuZDsKKwkJCWludCBwcmV2aW91c1NlYXJjaFN0YXJ0ID0gZW5kIC0gMTsKIAkJCUFycmF5VHlwZSBjb21wb25lbnRUeXBlID0gKEFycmF5VHlwZSkgdHlwZS5nZXRQYXJlbnQoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uc0xlbmd0aDsgaSsrKSB7CiAJCQkJcHJldmlvdXNTZWFyY2hTdGFydCA9IHJldHJpZXZlUmlnaHRCcmFja2V0UG9zaXRpb24ocHJldmlvdXNTZWFyY2hTdGFydCArIDEsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlTGVuZ3RoKTsKQEAgLTg0Miw3ICs4NzEsNyBAQAogCQlhcnJheUNyZWF0aW9uLnNldFR5cGUoYXJyYXlUeXBlKTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2RlcyhhcnJheVR5cGUsIGV4cHJlc3Npb24pOwotCQl9CQorCQl9CiAJCWlmIChleHByZXNzaW9uLmluaXRpYWxpemVyICE9IG51bGwpIHsKIAkJCWFycmF5Q3JlYXRpb24uc2V0SW5pdGlhbGl6ZXIoY29udmVydChleHByZXNzaW9uLmluaXRpYWxpemVyKSk7CiAJCX0KQEAgLTkwMSw3ICs5MzAsNyBAQAogCQl9CiAJCXJldHVybiBhc3NlcnRTdGF0ZW1lbnQ7CiAJfQotCQorCiAJcHVibGljIEFzc2lnbm1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQgZXhwcmVzc2lvbikgewogCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSBuZXcgQXNzaWdubWVudCh0aGlzLmFzdCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtOTEwLDkgKzkzOSwxMSBAQAogCQlFeHByZXNzaW9uIGxocyA9IGNvbnZlcnQoZXhwcmVzc2lvbi5saHMpOwogCQlhc3NpZ25tZW50LnNldExlZnRIYW5kU2lkZShsaHMpOwogCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuQVNTSUdOKTsKLQkJYXNzaWdubWVudC5zZXRSaWdodEhhbmRTaWRlKGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKSk7CisJCUV4cHJlc3Npb24gcmlnaHRIYW5kU2lkZSA9IGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTsKKwkJYXNzaWdubWVudC5zZXRSaWdodEhhbmRTaWRlKHJpZ2h0SGFuZFNpZGUpOwogCQlpbnQgc3RhcnQgPSBsaHMuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQlhc3NpZ25tZW50LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHN0YXJ0ICsgMSk7CisJCWludCBlbmQgPSByaWdodEhhbmRTaWRlLmdldFN0YXJ0UG9zaXRpb24oKSArIHJpZ2h0SGFuZFNpZGUuZ2V0TGVuZ3RoKCkgLSAxOworCQlhc3NpZ25tZW50LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQlyZXR1cm4gYXNzaWdubWVudDsKIAl9CiAKQEAgLTk1Miw3ICs5ODMsNyBAQAogCQkJfSBlbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG5leHRNZXRob2REZWNsYXJhdGlvbiA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwogCQkJCWlmICghbmV4dE1ldGhvZERlY2xhcmF0aW9uLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkgJiYgIW5leHRNZXRob2REZWNsYXJhdGlvbi5pc0NsaW5pdCgpKSB7Ci0JCQkJCXR5cGVEZWNsLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoY29udmVydChuZXh0TWV0aG9kRGVjbGFyYXRpb24pKTsKKwkJCQkJdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KGZhbHNlLCBuZXh0TWV0aG9kRGVjbGFyYXRpb24pKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB7CiAJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gbmV4dE1lbWJlckRlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSBub2RlOwpAQCAtOTY2LDcgKzk5Nyw3IEBACiAJCX0KIAkJcmV0dXJuIHR5cGVEZWNsOwogCX0KLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IG5ldyBJbmZpeEV4cHJlc3Npb24odGhpcy5hc3QpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKQEAgLTk3NCw2NSArMTAwNSw4IEBACiAJCX0KIAogCQlpbnQgZXhwcmVzc2lvbk9wZXJhdG9ySUQgPSAoZXhwcmVzc2lvbi5iaXRzICYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlLk9wZXJhdG9yU0hJRlQ7Ci0JCXN3aXRjaCAoZXhwcmVzc2lvbk9wZXJhdG9ySUQpIHsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5FUVVBTF9FUVVBTCA6Ci0JCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTFMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLkxFU1NfRVFVQUwgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTU19FUVVBTFMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLkdSRUFURVJfRVFVQUwgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9FUVVBTFMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLk5PVF9FUVVBTCA6Ci0JCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1RfRVFVQUxTKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5MRUZUX1NISUZUIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFRlRfU0hJRlQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLlJJR0hUX1NISUZUIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuVU5TSUdORURfUklHSFRfU0hJRlQgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLk9SX09SIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX09SKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5BTkRfQU5EIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX0FORCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuUExVUyA6Ci0JCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5NSU5VUyA6Ci0JCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuUkVNQUlOREVSIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJFTUFJTkRFUik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuWE9SIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlhPUik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuQU5EIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkFORCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuTVVMVElQTFkgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuVElNRVMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLk9SIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk9SKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5ESVZJREUgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRElWSURFKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkcy5HUkVBVEVSIDoKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzLkxFU1MgOgotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCX0KLQkJCisJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihnZXRPcGVyYXRvckZvcihleHByZXNzaW9uT3BlcmF0b3JJRCkpOworCiAJCWlmIChleHByZXNzaW9uLmxlZnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJpbmFyeUV4cHJlc3Npb24KIAkJCQkmJiAoKGV4cHJlc3Npb24ubGVmdC5iaXRzICYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA9PSAwKSkgewogCQkJLy8gY3JlYXRlIGFuIGV4dGVuZGVkIHN0cmluZyBsaXRlcmFsIGVxdWl2YWxlbnQgPT4gdXNlIHRoZSBleHRlbmRlZCBvcGVyYW5kcyBsaXN0CkBAIC0xMDU5LDEwICsxMDMzLDEwIEBACiAJCQkJIAlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKIAkJCQkgCQlFeHByZXNzaW9uIGV4cHIgPSB0ZW1wOwogCQkJCSAJCXRlbXAgPSBuZXcgSW5maXhFeHByZXNzaW9uKHRoaXMuYXN0KTsKLQkJCQkgCQkKKwogCQkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQkJCQkJdGhpcy5yZWNvcmROb2Rlcyh0ZW1wLCBleHByZXNzaW9uKTsKLQkJCQkJCX0JCQkJIAkKKwkJCQkJCX0KIAkJCQkgCQl0ZW1wLnNldExlZnRPcGVyYW5kKGV4cHIpOwogCQkJCQkgCXRlbXAuc2V0T3BlcmF0b3IoZ2V0T3BlcmF0b3JGb3IoZXhwcmVzc2lvbk9wZXJhdG9ySUQpKTsKIAkJCQkJCXRlbXAuc2V0U291cmNlUmFuZ2UoZXhwci5nZXRTdGFydFBvc2l0aW9uKCksIGV4cHIuZ2V0TGVuZ3RoKCkpOwpAQCAtMTEzMiwxMiArMTEwNiwxMiBAQAogCQkJCQlpZiAoc3RhdGVtZW50MiAhPSBudWxsKSB7CiAJCQkJCQlibG9jay5zdGF0ZW1lbnRzKCkuYWRkKHN0YXRlbWVudDIpOwogCQkJCQl9Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGJsb2NrOwogCX0KLQkKKwogCXB1YmxpYyBCcmVha1N0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQnJlYWtTdGF0ZW1lbnQgc3RhdGVtZW50KSAgewogCQlCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCA9IG5ldyBCcmVha1N0YXRlbWVudCh0aGlzLmFzdCk7CiAJCWJyZWFrU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwpAQCAtMTE0OSw4ICsxMTIzLDggQEAKIAkJfQogCQlyZXR1cm4gYnJlYWtTdGF0ZW1lbnQ7CiAJfQotCQkKLQkJCisKKwogCXB1YmxpYyBTd2l0Y2hDYXNlIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXNlU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlTd2l0Y2hDYXNlIHN3aXRjaENhc2UgPSBuZXcgU3dpdGNoQ2FzZSh0aGlzLmFzdCk7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBzdGF0ZW1lbnQuY29uc3RhbnRFeHByZXNzaW9uOwpAQCAtMTE2NywxMyArMTE0MSw5IEBACiAJcHVibGljIENhc3RFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gbmV3IENhc3RFeHByZXNzaW9uKHRoaXMuYXN0KTsKIAkJY2FzdEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7Ci0JCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiB0eXBlID0gZXhwcmVzc2lvbi50eXBlOworCQlUeXBlUmVmZXJlbmNlIHR5cGUgPSBleHByZXNzaW9uLnR5cGU7CiAJCXRyaW1XaGl0ZVNwYWNlc0FuZENvbW1lbnRzKHR5cGUpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSApIHsKLQkJCWNhc3RFeHByZXNzaW9uLnNldFR5cGUoY29udmVydFR5cGUoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSl0eXBlKSk7Ci0JCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTmFtZVJlZmVyZW5jZSkgewotCQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZShjb252ZXJ0VG9UeXBlKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2UpdHlwZSkpOwotCQl9CisJCWNhc3RFeHByZXNzaW9uLnNldFR5cGUoY29udmVydFR5cGUodHlwZSkpOwogCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKSk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXMoY2FzdEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOwpAQCAtMTE4Miw3ICsxMTUyLDcgQEAKIAl9CiAKIAlwdWJsaWMgQ2hhcmFjdGVyTGl0ZXJhbCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2hhckxpdGVyYWwgZXhwcmVzc2lvbikgewotCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwogCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwogCQlDaGFyYWN0ZXJMaXRlcmFsIGxpdGVyYWwgPSBuZXcgQ2hhcmFjdGVyTGl0ZXJhbCh0aGlzLmFzdCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtMTIwMiw4MSArMTE3Miw5NiBAQAogCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKGNvbnZlcnRUeXBlKGV4cHJlc3Npb24udHlwZSkpOwogCQlyZXR1cm4gdHlwZUxpdGVyYWw7CiAJfQotCQorCiAJcHVibGljIENvbXBpbGF0aW9uVW5pdCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgY2hhcltdIHNvdXJjZSkgewotCQlpZih1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnJlY292ZXJ5U2Nhbm5lckRhdGEgIT0gbnVsbCkgewotCQkJUmVjb3ZlcnlTY2FubmVyIHJlY292ZXJ5U2Nhbm5lciA9IG5ldyBSZWNvdmVyeVNjYW5uZXIodGhpcy5zY2FubmVyLCB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnJlY292ZXJ5U2Nhbm5lckRhdGEucmVtb3ZlVW51c2VkKCkpOwotCQkJdGhpcy5zY2FubmVyID0gcmVjb3ZlcnlTY2FubmVyOwotCQkJdGhpcy5kb2NQYXJzZXIuc2Nhbm5lciA9IHRoaXMuc2Nhbm5lcjsKLQkJfQotCQl0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHNvdXJjZTsKLQkJdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2VMZW5ndGggPSBzb3VyY2UubGVuZ3RoOwotCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSwgdW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHRoaXMuYXN0KTsKLQotCQkvLyBQYXJzZSBjb21tZW50cwotCQlpbnRbXVtdIGNvbW1lbnRzID0gdW5pdC5jb21tZW50czsKLQkJaWYgKGNvbW1lbnRzICE9IG51bGwpIHsKLQkJCWJ1aWxkQ29tbWVudHNUYWJsZShjb21waWxhdGlvblVuaXQsIGNvbW1lbnRzKTsKLQkJfQotCi0JCS8vIGhhbmRsZSB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbW1lZGlhdGVseQotCQkvLyBUaGVyZSBpcyBubyBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KLQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7Ci0JCQlyZWNvcmROb2Rlcyhjb21waWxhdGlvblVuaXQsIHVuaXQpOwotCQl9Ci0JCWlmICh1bml0LmN1cnJlbnRQYWNrYWdlICE9IG51bGwpIHsKLQkJCVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSBjb252ZXJ0UGFja2FnZSh1bml0KTsKLQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRQYWNrYWdlKHBhY2thZ2VEZWNsYXJhdGlvbik7Ci0JCX0KLQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2VbXSBpbXBvcnRzID0gdW5pdC5pbXBvcnRzOwotCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7Ci0JCQlpbnQgaW1wb3J0TGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydExlbmd0aDsgaSsrKSB7Ci0JCQkJY29tcGlsYXRpb25Vbml0LmltcG9ydHMoKS5hZGQoY29udmVydEltcG9ydChpbXBvcnRzW2ldKSk7CisJCXRyeSB7CisJCQlpZih1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnJlY292ZXJ5U2Nhbm5lckRhdGEgIT0gbnVsbCkgeworCQkJCVJlY292ZXJ5U2Nhbm5lciByZWNvdmVyeVNjYW5uZXIgPSBuZXcgUmVjb3ZlcnlTY2FubmVyKHRoaXMuc2Nhbm5lciwgdW5pdC5jb21waWxhdGlvblJlc3VsdC5yZWNvdmVyeVNjYW5uZXJEYXRhLnJlbW92ZVVudXNlZCgpKTsKKwkJCQl0aGlzLnNjYW5uZXIgPSByZWNvdmVyeVNjYW5uZXI7CisJCQkJdGhpcy5kb2NQYXJzZXIuc2Nhbm5lciA9IHRoaXMuc2Nhbm5lcjsKIAkJCX0KLQkJfQotCi0JCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHR5cGVzTGVuZ3RoID0gdHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSB0eXBlc1tpXTsKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyYXRpb24ubmFtZSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkpIHsKLQkJCQkJY29udGludWU7CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHNvdXJjZTsKKwkJCXRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKwkJCXRoaXMuc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlLCB1bml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHRoaXMuYXN0KTsKKwkJCWNvbXBpbGF0aW9uVW5pdC5zZXRTdGF0ZW1lbnRzUmVjb3ZlcnlEYXRhKHVuaXQuY29tcGlsYXRpb25SZXN1bHQucmVjb3ZlcnlTY2FubmVyRGF0YSk7CisJCisJCQkvLyBQYXJzZSBjb21tZW50cworCQkJaW50W11bXSBjb21tZW50cyA9IHVuaXQuY29tbWVudHM7CisJCQlpZiAoY29tbWVudHMgIT0gbnVsbCkgeworCQkJCWJ1aWxkQ29tbWVudHNUYWJsZShjb21waWxhdGlvblVuaXQsIGNvbW1lbnRzKTsKKwkJCX0KKwkKKwkJCS8vIGhhbmRsZSB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbW1lZGlhdGVseQorCQkJLy8gVGhlcmUgaXMgbm8gbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uCisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2Rlcyhjb21waWxhdGlvblVuaXQsIHVuaXQpOworCQkJfQorCQkJaWYgKHVuaXQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgeworCQkJCVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSBjb252ZXJ0UGFja2FnZSh1bml0KTsKKwkJCQljb21waWxhdGlvblVuaXQuc2V0UGFja2FnZShwYWNrYWdlRGVjbGFyYXRpb24pOworCQkJfQorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2VbXSBpbXBvcnRzID0gdW5pdC5pbXBvcnRzOworCQkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJCWludCBpbXBvcnRMZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydExlbmd0aDsgaSsrKSB7CisJCQkJCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzKCkuYWRkKGNvbnZlcnRJbXBvcnQoaW1wb3J0c1tpXSkpOwogCQkJCX0KLQkJCQlBU1ROb2RlIHR5cGUgPSBjb252ZXJ0KGRlY2xhcmF0aW9uKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRGbGFncyhjb21waWxhdGlvblVuaXQuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJCX0KKwkKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOworCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQlpbnQgdHlwZXNMZW5ndGggPSB0eXBlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aDsgaSsrKSB7CisJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdHlwZXNbaV07CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhkZWNsYXJhdGlvbi5uYW1lLCBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJQVNUTm9kZSB0eXBlID0gY29udmVydChkZWNsYXJhdGlvbik7CisJCQkJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRGbGFncyhjb21waWxhdGlvblVuaXQuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbXBpbGF0aW9uVW5pdC50eXBlcygpLmFkZCh0eXBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbXBpbGF0aW9uVW5pdC5zZXRTb3VyY2VSYW5nZSh1bml0LnNvdXJjZVN0YXJ0LCB1bml0LnNvdXJjZUVuZCAtIHVuaXQuc291cmNlU3RhcnQgICsgMSk7CisJCisJCQlpbnQgcHJvYmxlbUxlbmd0aCA9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50OworCQkJaWYgKHByb2JsZW1MZW5ndGggIT0gMCkgeworCQkJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHJlc2l6ZWRQcm9ibGVtcyA9IG51bGw7CisJCQkJZmluYWwgQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LmdldFByb2JsZW1zKCk7CisJCQkJZmluYWwgaW50IHJlYWxQcm9ibGVtTGVuZ3RoPXByb2JsZW1zLmxlbmd0aDsKKwkJCQlpZiAocmVhbFByb2JsZW1MZW5ndGggPT0gcHJvYmxlbUxlbmd0aCkgeworCQkJCQlyZXNpemVkUHJvYmxlbXMgPSBwcm9ibGVtczsKIAkJCQl9IGVsc2UgewotCQkJCQljb21waWxhdGlvblVuaXQudHlwZXMoKS5hZGQodHlwZSk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIChyZXNpemVkUHJvYmxlbXMgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3JlYWxQcm9ibGVtTGVuZ3RoXSksIDAsIHJlYWxQcm9ibGVtTGVuZ3RoKTsKIAkJCQl9CisJCQkJQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yIHN5bnRheEVycm9yUHJvcGFnYXRvciA9IG5ldyBBU1RTeW50YXhFcnJvclByb3BhZ2F0b3IocmVzaXplZFByb2JsZW1zKTsKKwkJCQljb21waWxhdGlvblVuaXQuYWNjZXB0KHN5bnRheEVycm9yUHJvcGFnYXRvcik7CisJCQkJQVNUUmVjb3ZlcnlQcm9wYWdhdG9yIHJlY292ZXJ5UHJvcGFnYXRvciA9CisJCQkJCW5ldyBBU1RSZWNvdmVyeVByb3BhZ2F0b3IocmVzaXplZFByb2JsZW1zLCB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnJlY292ZXJ5U2Nhbm5lckRhdGEpOworCQkJCWNvbXBpbGF0aW9uVW5pdC5hY2NlcHQocmVjb3ZlcnlQcm9wYWdhdG9yKTsKKwkJCQljb21waWxhdGlvblVuaXQuc2V0UHJvYmxlbXMocmVzaXplZFByb2JsZW1zKTsKIAkJCX0KLQkJfQotCQljb21waWxhdGlvblVuaXQuc2V0U291cmNlUmFuZ2UodW5pdC5zb3VyY2VTdGFydCwgdW5pdC5zb3VyY2VFbmQgLSB1bml0LnNvdXJjZVN0YXJ0ICArIDEpOwotCQkKLQkJaW50IHByb2JsZW1MZW5ndGggPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1Db3VudDsKLQkJaWYgKHByb2JsZW1MZW5ndGggIT0gMCkgewotCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcmVzaXplZFByb2JsZW1zID0gbnVsbDsKLQkJCWZpbmFsIENhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zID0gdW5pdC5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOwotCQkJZmluYWwgaW50IHJlYWxQcm9ibGVtTGVuZ3RoPXByb2JsZW1zLmxlbmd0aDsKLQkJCWlmIChyZWFsUHJvYmxlbUxlbmd0aCA9PSBwcm9ibGVtTGVuZ3RoKSB7Ci0JCQkJcmVzaXplZFByb2JsZW1zID0gcHJvYmxlbXM7Ci0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIChyZXNpemVkUHJvYmxlbXMgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW3JlYWxQcm9ibGVtTGVuZ3RoXSksIDAsIHJlYWxQcm9ibGVtTGVuZ3RoKTsKKwkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCWxvb2t1cEZvclNjb3BlcygpOwogCQkJfQotCQkJQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yIHN5bnRheEVycm9yUHJvcGFnYXRvciA9IG5ldyBBU1RTeW50YXhFcnJvclByb3BhZ2F0b3IocmVzaXplZFByb2JsZW1zKTsKLQkJCWNvbXBpbGF0aW9uVW5pdC5hY2NlcHQoc3ludGF4RXJyb3JQcm9wYWdhdG9yKTsKLQkJCUFTVFJlY292ZXJ5UHJvcGFnYXRvciByZWNvdmVyeVByb3BhZ2F0b3IgPQotCQkJCW5ldyBBU1RSZWNvdmVyeVByb3BhZ2F0b3IocmVzaXplZFByb2JsZW1zLCB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnJlY292ZXJ5U2Nhbm5lckRhdGEpOwotCQkJY29tcGlsYXRpb25Vbml0LmFjY2VwdChyZWNvdmVyeVByb3BhZ2F0b3IpOwotCQkJY29tcGlsYXRpb25Vbml0LnNldFByb2JsZW1zKHJlc2l6ZWRQcm9ibGVtcyk7CisJCQljb21waWxhdGlvblVuaXQuaW5pdENvbW1lbnRNYXBwZXIodGhpcy5zY2FubmVyKTsKKwkJCXJldHVybiBjb21waWxhdGlvblVuaXQ7CisJCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjb21waWxhdGlvbiB1bml0IGNvbnZlcnNpb246Iik7ICAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFV0aWwuZmluZExpbmVTZXBhcmF0b3Ioc291cmNlKTsKKwkJCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpIGxpbmVEZWxpbWl0ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ly8kTk9OLU5MUy0xJAorCQkJbWVzc2FnZS5hcHBlbmQobGluZURlbGltaXRlcik7CisJCQltZXNzYWdlLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU09VUkNFIEJFR0lOIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJbWVzc2FnZS5hcHBlbmQobGluZURlbGltaXRlcik7CisJCQltZXNzYWdlLmFwcGVuZChzb3VyY2UpOworCQkJbWVzc2FnZS5hcHBlbmQobGluZURlbGltaXRlcik7CisJCQltZXNzYWdlLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU09VUkNFIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVV0aWwubG9nKGUsIG1lc3NhZ2UudG9TdHJpbmcoKSk7CisJCQl0aHJvdyBlOwogCQl9Ci0JCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewotCQkJbG9va3VwRm9yU2NvcGVzKCk7Ci0JCX0KLQkJY29tcGlsYXRpb25Vbml0LmluaXRDb21tZW50TWFwcGVyKHRoaXMuc2Nhbm5lcik7Ci0JCXJldHVybiBjb21waWxhdGlvblVuaXQ7CiAJfQogCiAJcHVibGljIEFzc2lnbm1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBvdW5kQXNzaWdubWVudCBleHByZXNzaW9uKSB7CkBAIC0xMzUwLDcgKzEzMzUsNyBAQAogCQl9CiAJCXJldHVybiBjb250aW51ZVN0YXRlbWVudDsKIAl9Ci0JCisKIAlwdWJsaWMgRG9TdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkRvU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlEb1N0YXRlbWVudCBkb1N0YXRlbWVudCA9IG5ldyBEb1N0YXRlbWVudCh0aGlzLmFzdCk7CiAJCWRvU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwpAQCAtMTM2Miw3ICsxMzQ3LDcgQEAKIAl9CiAKIAlwdWJsaWMgTnVtYmVyTGl0ZXJhbCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRG91YmxlTGl0ZXJhbCBleHByZXNzaW9uKSB7Ci0JCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CiAJCWludCBzb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CiAJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IG5ldyBOdW1iZXJMaXRlcmFsKHRoaXMuYXN0KTsKIAkJbGl0ZXJhbC5pbnRlcm5hbFNldFRva2VuKG5ldyBTdHJpbmcodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCBsZW5ndGgpKTsKQEAgLTEzNzMsMTMgKzEzNTgsMTMgQEAKIAkJcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nQ29tbWVudHNGcm9tTGl0ZXJhbChsaXRlcmFsKTsKIAkJcmV0dXJuIGxpdGVyYWw7CiAJfQotCQorCiAJcHVibGljIEVtcHR5U3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FbXB0eVN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJRW1wdHlTdGF0ZW1lbnQgZW1wdHlTdGF0ZW1lbnQgPSBuZXcgRW1wdHlTdGF0ZW1lbnQodGhpcy5hc3QpOwogCQllbXB0eVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKIAkJcmV0dXJuIGVtcHR5U3RhdGVtZW50OwogCX0KLQkKKwogCS8vIGZpZWxkIGlzIGFuIGVudW0gY29uc3RhbnQKIAlwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24gZW51bUNvbnN0YW50KSB7CiAJCWNoZWNrQ2FuY2VsZWQoKTsKQEAgLTE0NDgsOSArMTQzMyw5IEBACiAJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1RfRVFVQUxTKTsKIAkJfQogCQlyZXR1cm4gaW5maXhFeHByZXNzaW9uOwotCQorCiAJfQotCQorCiAJcHVibGljIFN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgc3RhdGVtZW50KSB7CiAJCVN0YXRlbWVudCBuZXdTdGF0ZW1lbnQ7CiAJCWludCBzb3VyY2VTdGFydCA9IHN0YXRlbWVudC5zb3VyY2VTdGFydDsKQEAgLTE0NzQsNyArMTQ1OSw3IEBACiAJCQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgogCQkJCQkJc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uc2V0RmxhZ3Moc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQkJZGVmYXVsdCA6CiAJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50LnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJCQlzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi50eXBlQXJndW1lbnRzKCkuYWRkKGNvbnZlcnRUeXBlKHN0YXRlbWVudC50eXBlQXJndW1lbnRzW2ldKSk7CiAJCQkJCQl9CkBAIC0xNDk5LDcgKzE0ODQsNyBAQAogCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJCWNvbnN0cnVjdG9ySW52b2NhdGlvbi5zZXRGbGFncyhjb25zdHJ1Y3Rvckludm9jYXRpb24uZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQkJZGVmYXVsdCA6CiAJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50LnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJCQljb25zdHJ1Y3Rvckludm9jYXRpb24udHlwZUFyZ3VtZW50cygpLmFkZChjb252ZXJ0VHlwZShzdGF0ZW1lbnQudHlwZUFyZ3VtZW50c1tpXSkpOwogCQkJCQkJfQpAQCAtMTUyNSw3ICsxNTEwLDcgQEAKIAkJfQogCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbikgZXhwcmVzc2lvbik7Ci0JCX0JCQorCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwogCQl9CkBAIC0xNTgzLDcgKzE1NjgsNyBAQAogCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb25nTGl0ZXJhbE1pblZhbHVlKSB7CiAJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb25nTGl0ZXJhbE1pblZhbHVlKSBleHByZXNzaW9uKTsKLQkJfQkJCQkKKwkJfQogCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9uZ0xpdGVyYWwpIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvbmdMaXRlcmFsKSBleHByZXNzaW9uKTsKIAkJfQpAQCAtMTU5MiwzNCArMTU3NywzNCBAQAogCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHRlbmRlZFN0cmluZ0xpdGVyYWwpIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4dGVuZGVkU3RyaW5nTGl0ZXJhbCkgZXhwcmVzc2lvbik7Ci0JCX0JCisJCX0KIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWwpIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWwpIGV4cHJlc3Npb24pOwotCQl9CQkJCQorCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BTkRfQU5EX0V4cHJlc3Npb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFORF9BTkRfRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7Ci0JCX0JCQkJCisJCX0KIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9SX09SX0V4cHJlc3Npb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9SX09SX0V4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotCQl9CQkJCQorCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FcXVhbEV4cHJlc3Npb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkVxdWFsRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7Ci0JCX0JCQkJCisJCX0KIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJpbmFyeUV4cHJlc3Npb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotCQl9CQkJCQorCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbnN0YW5jZU9mRXhwcmVzc2lvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5zdGFuY2VPZkV4cHJlc3Npb24pIGV4cHJlc3Npb24pOwotCQl9CQkJCQorCQl9CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmFyeUV4cHJlc3Npb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlVuYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7Ci0JCX0JCQkJCisJCX0KIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uZGl0aW9uYWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKLQkJfQkJCQkKKwkJfQogCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQpIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kKSBleHByZXNzaW9uKTsKLQkJfQkJCQkKKwkJfQogCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUmVmZXJlbmNlKSB7CiAJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2UpIGV4cHJlc3Npb24pOwogCQl9CkBAIC0xNjQ3LDkgKzE2MzIsOSBAQAogCQkJdGhpcy5yZWNvcmROb2RlcyhsaXRlcmFsLCBleHByZXNzaW9uKTsKIAkJfQogCQlsaXRlcmFsLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOwotCQlyZXR1cm4gbGl0ZXJhbDsJCisJCXJldHVybiBsaXRlcmFsOwogCX0KLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKIAkJaWYgKHJlZmVyZW5jZS5yZWNlaXZlci5pc1N1cGVyKCkpIHsKIAkJCWZpbmFsIFN1cGVyRmllbGRBY2Nlc3Mgc3VwZXJGaWVsZEFjY2VzcyA9IG5ldyBTdXBlckZpZWxkQWNjZXNzKHRoaXMuYXN0KTsKQEAgLTE2OTYsNyArMTY4MSw3IEBACiAJfQogCiAJcHVibGljIE51bWJlckxpdGVyYWwgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZsb2F0TGl0ZXJhbCBleHByZXNzaW9uKSB7Ci0JCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CiAJCWludCBzb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CiAJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IG5ldyBOdW1iZXJMaXRlcmFsKHRoaXMuYXN0KTsKIAkJbGl0ZXJhbC5pbnRlcm5hbFNldFRva2VuKG5ldyBTdHJpbmcodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCBsZW5ndGgpKTsKQEAgLTE3MDcsMTIgKzE2OTIsMTIgQEAKIAkJcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nQ29tbWVudHNGcm9tTGl0ZXJhbChsaXRlcmFsKTsKIAkJcmV0dXJuIGxpdGVyYWw7CiAJfQotCQorCiAJcHVibGljIFN0YXRlbWVudCBjb252ZXJ0KEZvcmVhY2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgewogCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJcmV0dXJuIGNyZWF0ZUZha2VFbXB0eVN0YXRlbWVudChzdGF0ZW1lbnQpOwotCQkJY2FzZSBBU1QuSkxTMyA6CisJCQlkZWZhdWx0IDoKIAkJCQlFbmhhbmNlZEZvclN0YXRlbWVudCBlbmhhbmNlZEZvclN0YXRlbWVudCA9IG5ldyBFbmhhbmNlZEZvclN0YXRlbWVudCh0aGlzLmFzdCk7CiAJCQkJZW5oYW5jZWRGb3JTdGF0ZW1lbnQuc2V0UGFyYW1ldGVyKGNvbnZlcnRUb1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oc3RhdGVtZW50LmVsZW1lbnRWYXJpYWJsZSkpOwogCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBjb2xsZWN0aW9uID0gc3RhdGVtZW50LmNvbGxlY3Rpb247CkBAIC0xNzI1LDExICsxNzEwLDkgQEAKIAkJCQlpbnQgZW5kID0gc3RhdGVtZW50LnNvdXJjZUVuZDsKIAkJCQllbmhhbmNlZEZvclN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJCQlyZXR1cm4gZW5oYW5jZWRGb3JTdGF0ZW1lbnQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBjcmVhdGVGYWtlRW1wdHlTdGF0ZW1lbnQoc3RhdGVtZW50KTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBGb3JTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZvclN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IG5ldyBGb3JTdGF0ZW1lbnQodGhpcy5hc3QpOwogCQlmb3JTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CkBAIC0xNzM3LDEwICsxNzIwLDEyIEBACiAJCWlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgewogCQkJLy8gd2Uga25vdyB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGluaXRpYWxpemF0aW9uCiAJCQlpZiAoaW5pdGlhbGl6YXRpb25zWzBdIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKSB7Ci0JCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKSBpbml0aWFsaXphdGlvbnNbMF0pOworCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbiBpbml0aWFsaXphdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb24pIGluaXRpYWxpemF0aW9uc1swXTsKKwkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKGluaXRpYWxpemF0aW9uKTsKIAkJCQlpbnQgaW5pdGlhbGl6YXRpb25zTGVuZ3RoID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMTsgaSA8IGluaXRpYWxpemF0aW9uc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmZyYWdtZW50cygpLmFkZChjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbilpbml0aWFsaXphdGlvbnNbaV0pKTsKKwkJCQkJaW5pdGlhbGl6YXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKWluaXRpYWxpemF0aW9uc1tpXTsKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uZnJhZ21lbnRzKCkuYWRkKGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudChpbml0aWFsaXphdGlvbikpOwogCQkJCX0KIAkJCQlpZiAoaW5pdGlhbGl6YXRpb25zTGVuZ3RoICE9IDEpIHsKIAkJCQkJaW50IHN0YXJ0ID0gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOwpAQCAtMTc2Nyw3ICsxNzUyLDcgQEAKIAkJaWYgKGluY3JlbWVudHMgIT0gbnVsbCkgewogCQkJaW50IGluY3JlbWVudHNMZW5ndGggPSBpbmNyZW1lbnRzLmxlbmd0aDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jcmVtZW50c0xlbmd0aDsgaSsrKSB7Ci0JCQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKGNvbnZlcnRUb0V4cHJlc3Npb24oaW5jcmVtZW50c1tpXSkpOwkJCQkKKwkJCQlmb3JTdGF0ZW1lbnQudXBkYXRlcnMoKS5hZGQoY29udmVydFRvRXhwcmVzc2lvbihpbmNyZW1lbnRzW2ldKSk7CiAJCQl9CiAJCX0KIAkJZmluYWwgU3RhdGVtZW50IGFjdGlvbiA9IGNvbnZlcnQoc3RhdGVtZW50LmFjdGlvbik7CkBAIC0xNzc1LDcgKzE3NjAsNyBAQAogCQlmb3JTdGF0ZW1lbnQuc2V0Qm9keShhY3Rpb24pOwogCQlyZXR1cm4gZm9yU3RhdGVtZW50OwogCX0KLQkKKwogCXB1YmxpYyBJZlN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSWZTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAJCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KHRoaXMuYXN0KTsKIAkJaWZTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CkBAIC0xNzkyLDcgKzE3NzcsNyBAQAogCQl9CiAJCXJldHVybiBpZlN0YXRlbWVudDsKIAl9Ci0JCisKIAlwdWJsaWMgSW5zdGFuY2VvZkV4cHJlc3Npb24gY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lkluc3RhbmNlT2ZFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJSW5zdGFuY2VvZkV4cHJlc3Npb24gaW5zdGFuY2VPZkV4cHJlc3Npb24gPSBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24odGhpcy5hc3QpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKQEAgLTE4MDksNyArMTc5NCw3IEBACiAJfQogCiAJcHVibGljIE51bWJlckxpdGVyYWwgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkludExpdGVyYWwgZXhwcmVzc2lvbikgewotCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwogCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwogCQlmaW5hbCBOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzLmFzdCk7CiAJCWxpdGVyYWwuaW50ZXJuYWxTZXRUb2tlbihuZXcgU3RyaW5nKHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLCBzb3VyY2VTdGFydCwgbGVuZ3RoKSk7CkBAIC0xODIyLDcgKzE4MDcsNyBAQAogCX0KIAogCXB1YmxpYyBOdW1iZXJMaXRlcmFsIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbnRMaXRlcmFsTWluVmFsdWUgZXhwcmVzc2lvbikgewotCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwogCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwogCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzLmFzdCk7CiAJCWxpdGVyYWwuaW50ZXJuYWxTZXRUb2tlbihuZXcgU3RyaW5nKHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLCBzb3VyY2VTdGFydCwgbGVuZ3RoKSk7CkBAIC0xODU4LDcgKzE4NDMsMTEgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSmF2YWRvYyBqYXZhZG9jLCBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCWlmIChhc3QuYXBpTGV2ZWwgPT0gQVNULkpMUzMgJiYgcGFja2FnZURlY2xhcmF0aW9uLmdldEphdmFkb2MoKSA9PSBudWxsKSB7CisJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgeworCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CisJCQkJcmV0dXJuOworCQl9CisJCWlmIChwYWNrYWdlRGVjbGFyYXRpb24uZ2V0SmF2YWRvYygpID09IG51bGwpIHsKIAkJCWlmIChqYXZhZG9jICE9IG51bGwpIHsKIAkJCQlpZiAodGhpcy5jb21tZW50TWFwcGVyID09IG51bGwgfHwgIXRoaXMuY29tbWVudE1hcHBlci5oYXNTYW1lVGFibGUodGhpcy5jb21tZW50c1RhYmxlKSkgewogCQkJCQl0aGlzLmNvbW1lbnRNYXBwZXIgPSBuZXcgRGVmYXVsdENvbW1lbnRNYXBwZXIodGhpcy5jb21tZW50c1RhYmxlKTsKQEAgLTE4NzksNyArMTg2OCw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgTGFiZWxlZFN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTGFiZWxlZFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJTGFiZWxlZFN0YXRlbWVudCBsYWJlbGVkU3RhdGVtZW50ID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQodGhpcy5hc3QpOwogCQlmaW5hbCBpbnQgc291cmNlU3RhcnQgPSBzdGF0ZW1lbnQuc291cmNlU3RhcnQ7CkBAIC0xODk1LDcgKzE4ODQsNyBAQAogCX0KIAogCXB1YmxpYyBOdW1iZXJMaXRlcmFsIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb25nTGl0ZXJhbCBleHByZXNzaW9uKSB7Ci0JCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CiAJCWludCBzb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CiAJCWZpbmFsIE51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IG5ldyBOdW1iZXJMaXRlcmFsKHRoaXMuYXN0KTsKIAkJbGl0ZXJhbC5pbnRlcm5hbFNldFRva2VuKG5ldyBTdHJpbmcodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCBsZW5ndGgpKTsKQEAgLTE5MDgsNyArMTg5Nyw3IEBACiAJfQogCiAJcHVibGljIE51bWJlckxpdGVyYWwgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvbmdMaXRlcmFsTWluVmFsdWUgZXhwcmVzc2lvbikgewotCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwogCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwogCQlmaW5hbCBOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzLmFzdCk7CiAJCWxpdGVyYWwuaW50ZXJuYWxTZXRUb2tlbihuZXcgU3RyaW5nKHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLCBzb3VyY2VTdGFydCwgbGVuZ3RoKSk7CkBAIC0xOTQ5LDcgKzE5MzgsNyBAQAogCQkJCX0KIAkJCQlpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKIAkJCQkJc291cmNlU3RhcnQgPSBxdWFsaWZpZXIuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQkJCX0JCQkKKwkJCQl9CiAJCQl9CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBleHByZXNzaW9uLmFyZ3VtZW50czsKIAkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtMTk2OCw3ICsxOTU3LDcgQEAKIAkJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCQlzdXBlck1ldGhvZEludm9jYXRpb24uc2V0RmxhZ3Moc3VwZXJNZXRob2RJbnZvY2F0aW9uLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJCWRlZmF1bHQgOgogCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJCQlzdXBlck1ldGhvZEludm9jYXRpb24udHlwZUFyZ3VtZW50cygpLmFkZChjb252ZXJ0VHlwZSh0eXBlQXJndW1lbnRzW2ldKSk7CiAJCQkJCQl9CkBAIC0yMDI2LDcgKzIwMTUsNyBAQAogCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJCW1ldGhvZEludm9jYXRpb24uc2V0RmxhZ3MobWV0aG9kSW52b2NhdGlvbi5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQlkZWZhdWx0IDoKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCQkJbWV0aG9kSW52b2NhdGlvbi50eXBlQXJndW1lbnRzKCkuYWRkKGNvbnZlcnRUeXBlKHR5cGVBcmd1bWVudHNbaV0pKTsKIAkJCQkJCX0KQEAgLTIwMzUsNyArMjAyNCw3IEBACiAJCQl9CiAJCQlleHByID0gbWV0aG9kSW52b2NhdGlvbjsKIAkJfQotCQlleHByLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CQorCQlleHByLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CiAJCXJlbW92ZVRyYWlsaW5nQ29tbWVudEZyb21FeHByZXNzaW9uRW5kaW5nV2l0aEFQYXJlbihleHByKTsKIAkJcmV0dXJuIGV4cHI7CiAJfQpAQCAtMjA2Niw2ICsyMDU1LDEyIEBACiAJCXN0YXJ0ID0gbWVtYmVyVmFsdWVQYWlyLnNvdXJjZVN0YXJ0OwogCQllbmQgPSB2YWx1ZS5nZXRTdGFydFBvc2l0aW9uKCkgKyB2YWx1ZS5nZXRMZW5ndGgoKSAtIDE7CiAJCXBhaXIuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisKKwkJaWYgKG1lbWJlclZhbHVlUGFpci52YWx1ZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UgJiYKKwkJCQkoKFNpbmdsZU5hbWVSZWZlcmVuY2UpbWVtYmVyVmFsdWVQYWlyLnZhbHVlKS50b2tlbiA9PSBSZWNvdmVyeVNjYW5uZXIuRkFLRV9JREVOVElGSUVSKSB7CisJCQlwYWlyLnNldEZsYWdzKHBhaXIuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuUkVDT1ZFUkVEKTsKKwkJfQorCiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXMoc2ltcGxlTmFtZSwgbWVtYmVyVmFsdWVQYWlyKTsKIAkJCXJlY29yZE5vZGVzKHBhaXIsIG1lbWJlclZhbHVlUGFpcik7CkBAIC0yMDk3LDE4ICsyMDkyLDI2IEBACiAJCWluZml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKIAkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKIAl9Ci0JCisKIAlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbiBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CiAJCWZpbmFsIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHRoaXMuYXN0KTsKIAkJc2V0VHlwZU5hbWVGb3JBbm5vdGF0aW9uKGFubm90YXRpb24sIG5vcm1hbEFubm90YXRpb24pOworCisJCWludCBzdGFydCA9IGFubm90YXRpb24uc291cmNlU3RhcnQ7CisJCWludCBlbmQgPSBhbm5vdGF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlyczsKIAkJaWYgKG1lbWJlclZhbHVlUGFpcnMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpLmFkZChjb252ZXJ0KG1lbWJlclZhbHVlUGFpcnNbaV0pKTsKKwkJCQlNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gY29udmVydChtZW1iZXJWYWx1ZVBhaXJzW2ldKTsKKwkJCQlpbnQgbWVtYmVyVmFsdWVQYWlyRW5kID0gbWVtYmVyVmFsdWVQYWlyLmdldFN0YXJ0UG9zaXRpb24oKSArIG1lbWJlclZhbHVlUGFpci5nZXRMZW5ndGgoKSAtIDE7CisJCQkJaWYgKGVuZCA9PSBtZW1iZXJWYWx1ZVBhaXJFbmQpIHsKKwkJCQkJbm9ybWFsQW5ub3RhdGlvbi5zZXRGbGFncyhub3JtYWxBbm5vdGF0aW9uLmdldEZsYWdzKCkgfCBBU1ROb2RlLlJFQ09WRVJFRCk7CisJCQkJfQorCQkJCW5vcm1hbEFubm90YXRpb24udmFsdWVzKCkuYWRkKG1lbWJlclZhbHVlUGFpcik7CiAJCQl9CiAJCX0KLQkJaW50IHN0YXJ0ID0gYW5ub3RhdGlvbi5zb3VyY2VTdGFydDsKLQkJaW50IGVuZCA9IGFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisKIAkJbm9ybWFsQW5ub3RhdGlvbi5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2Rlcyhub3JtYWxBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKTsKQEAgLTIxMjMsNyArMjEyNiw3IEBACiAJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOwogCQl9CiAJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7Ci0JCXJldHVybiBsaXRlcmFsOwkJCisJCXJldHVybiBsaXRlcmFsOwogCX0KIAogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PUl9PUl9FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKQEAgLTIxNTksMTAgKzIxNjIsMTAgQEAKIAkJCQkgCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewogCQkJCSAJCUV4cHJlc3Npb24gZXhwciA9IHRlbXA7CiAJCQkJIAkJdGVtcCA9IG5ldyBJbmZpeEV4cHJlc3Npb24odGhpcy5hc3QpOwotCQkJCSAJCQorCiAJCQkJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHRlbXAsIGV4cHJlc3Npb24pOwotCQkJCQkJfQkJCQkgCQorCQkJCQkJfQogCQkJCSAJCXRlbXAuc2V0TGVmdE9wZXJhbmQoZXhwcik7CiAJCQkJCSAJdGVtcC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvckZvcihleHByZXNzaW9uT3BlcmF0b3JJRCkpOwogCQkJCQkJdGVtcC5zZXRTb3VyY2VSYW5nZShleHByLmdldFN0YXJ0UG9zaXRpb24oKSwgZXhwci5nZXRMZW5ndGgoKSk7CkBAIC0yMjQ4LDcgKzIyNTEsNyBAQAogCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLmludGVybmFsU2V0TmFtZShjb252ZXJ0KGFsbG9jYXRpb24udHlwZSkpOwogCQkJCWJyZWFrOwotCQkJY2FzZSBBU1QuSkxTMyA6CisJCQlkZWZhdWx0IDoKIAkJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0VHlwZShjb252ZXJ0VHlwZShhbGxvY2F0aW9uLnR5cGUpKTsKIAkJfQogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBhbGxvY2F0aW9uLmFyZ3VtZW50czsKQEAgLTIyNjcsMTEgKzIyNzAsMTEgQEAKIAkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldEZsYWdzKGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCQlicmVhazsKLQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQlkZWZhdWx0IDoKIAkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFsbG9jYXRpb24udHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnR5cGVBcmd1bWVudHMoKS5hZGQoY29udmVydFR5cGUoYWxsb2NhdGlvbi50eXBlQXJndW1lbnRzW2ldKSk7CiAJCQkJCX0KLQkJCX0JCQkKKwkJCX0KIAkJfQogCQlpZiAoYWxsb2NhdGlvbi5hbm9ueW1vdXNUeXBlICE9IG51bGwpIHsKIAkJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gYWxsb2NhdGlvbi5zb3VyY2VTdGFydDsKQEAgLTIyODYsNyArMjI4OSw3IEBACiAJCQkJcmVjb3JkTm9kZXMoYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiwgYWxsb2NhdGlvbi5hbm9ueW1vdXNUeXBlKTsKIAkJCQlhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7CiAJCQl9Ci0JCQlyZXR1cm4gY2xhc3NJbnN0YW5jZUNyZWF0aW9uOwkJCQorCQkJcmV0dXJuIGNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKIAkJfSBlbHNlIHsKIAkJCWZpbmFsIGludCBzdGFydCA9IGFsbG9jYXRpb24uc291cmNlU3RhcnQ7CiAJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGFsbG9jYXRpb24uc291cmNlRW5kIC0gc3RhcnQgKyAxKTsKQEAgLTIzMTYsNyArMjMxOSw3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXNFeHByZXNzaW9uOwogCX0KLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2UpIHsKIAkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2UpIHJlZmVyZW5jZSk7CkBAIC0yMzMyLDE2ICsyMzM1LDE2IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7IC8vIGNhbm5vdCBiZSByZWFjaGVkCiAJfQotCQorCiAJcHVibGljIFJldHVyblN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlmaW5hbCBSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gbmV3IFJldHVyblN0YXRlbWVudCh0aGlzLmFzdCk7Ci0JCXJldHVyblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXJldHVyblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKIAkJaWYgKHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKIAkJCXJldHVyblN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmV4cHJlc3Npb24pKTsKIAkJfQogCQlyZXR1cm4gcmV0dXJuU3RhdGVtZW50OwogCX0KLQkKKwogCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKIAkJZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gbmV3IFNpbmdsZU1lbWJlckFubm90YXRpb24odGhpcy5hc3QpOwogCQlzZXRUeXBlTmFtZUZvckFubm90YXRpb24oYW5ub3RhdGlvbiwgc2luZ2xlTWVtYmVyQW5ub3RhdGlvbik7CkBAIC0yMzcxLDcgKzIzNzQsOCBAQAogCQkJcmV0dXJuIGNvbnZlcnQoKEZvcmVhY2hTdGF0ZW1lbnQpIHN0YXRlbWVudCk7CiAJCX0KIAkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbilzdGF0ZW1lbnQpOworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uKXN0YXRlbWVudDsKKwkJCXJldHVybiBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KGxvY2FsRGVjbGFyYXRpb24pOwogCQl9CiAJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2VydFN0YXRlbWVudCkgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzZXJ0U3RhdGVtZW50KSBzdGF0ZW1lbnQpOwpAQCAtMjQyNiw0NyArMjQzMCwyMSBAQAogCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUZha2VFbXB0eVN0YXRlbWVudChzdGF0ZW1lbnQpOwogCQkJfQotCQkJc3dpdGNoKHJlc3VsdC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT046Ci0JCQkJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgewotCQkJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6Ci0JCQkJCQkJcmV0dXJuIGNyZWF0ZUZha2VFbXB0eVN0YXRlbWVudChzdGF0ZW1lbnQpOwotCQkJCQkJY2FzZSBBU1QuSkxTMyA6Ci0JCQkJCQkJZmluYWwgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcy5hc3QpOwotCQkJCQkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXREZWNsYXJhdGlvbigoRW51bURlY2xhcmF0aW9uKSByZXN1bHQpOwotCQkJCQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldERlY2xhcmF0aW9uKCk7Ci0JCQkJCQkJdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsLmdldFN0YXJ0UG9zaXRpb24oKSwgdHlwZURlY2wuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci0JCQkJCX0KKwkJCS8vIGFubm90YXRpb24gYW5kIGVudW0gdHlwZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgcGFyc2VyIGluc2lkZSBtZXRob2QgYm9kaWVzCisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcmVzdWx0OworCQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcy5hc3QpOworCQkJdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldERlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7CisJCQlzd2l0Y2godGhpcy5hc3QuYXBpTGV2ZWwpIHsKKwkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKKwkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmludGVybmFsR2V0VHlwZURlY2xhcmF0aW9uKCk7CisJCQkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbC5nZXRTdGFydFBvc2l0aW9uKCksIHR5cGVEZWNsLmdldExlbmd0aCgpKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBU1ROb2RlLkFOTk9UQVRJT05fVFlQRV9ERUNMQVJBVElPTiA6Ci0JCQkJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgewotCQkJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6Ci0JCQkJCQkJcmV0dXJuIGNyZWF0ZUZha2VFbXB0eVN0YXRlbWVudChzdGF0ZW1lbnQpOwotCQkJCQkJY2FzZSBBU1QuSkxTMyA6Ci0JCQkJCQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcy5hc3QpOwotCQkJCQkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXREZWNsYXJhdGlvbigoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgcmVzdWx0KTsKLQkJCQkJCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQkJCQkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbC5nZXRTdGFydFBvc2l0aW9uKCksIHR5cGVEZWNsLmdldExlbmd0aCgpKTsKLQkJCQkJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50OwotCQkJCQl9CisJCQkJZGVmYXVsdCA6CisJCQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsQVNUMyA9IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXREZWNsYXJhdGlvbigpOworCQkJCQl0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UodHlwZURlY2xBU1QzLmdldFN0YXJ0UG9zaXRpb24oKSwgdHlwZURlY2xBU1QzLmdldExlbmd0aCgpKTsKIAkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHJlc3VsdDsKLQkJCQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcy5hc3QpOwotCQkJCQl0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0RGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCQkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7Ci0JCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKLQkJCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuaW50ZXJuYWxHZXRUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQkJCQl0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UodHlwZURlY2wuZ2V0U3RhcnRQb3NpdGlvbigpLCB0eXBlRGVjbC5nZXRMZW5ndGgoKSk7CQkJCQkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgQVNULkpMUzMgOgotCQkJCQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsQVNUMyA9IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQkJCQkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbEFTVDMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0eXBlRGVjbEFTVDMuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CiAJCQl9CisJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50OwogCQl9CiAJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldoaWxlU3RhdGVtZW50KSB7CiAJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaGlsZVN0YXRlbWVudCkgc3RhdGVtZW50KTsKQEAgLTI0ODgsNyArMjQ2Niw3IEBACiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbENvbmNhdGVuYXRpb24pIHsKIAkJCXJldHVybiBjb252ZXJ0KChTdHJpbmdMaXRlcmFsQ29uY2F0ZW5hdGlvbikgZXhwcmVzc2lvbik7CiAJCX0KLQkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CQorCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsKIAkJaW50IHNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKIAkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gbmV3IFN0cmluZ0xpdGVyYWwodGhpcy5hc3QpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKQEAgLTI0OTgsMTAgKzI0NzYsMTAgQEAKIAkJbGl0ZXJhbC5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKIAkJcmV0dXJuIGxpdGVyYWw7CiAJfQotCQorCiAJcHVibGljIFN3aXRjaFN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gbmV3IFN3aXRjaFN0YXRlbWVudCh0aGlzLmFzdCk7Ci0JCXN3aXRjaFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXN3aXRjaFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKIAkJc3dpdGNoU3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuZXhwcmVzc2lvbikpOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudFtdIHN0YXRlbWVudHMgPSBzdGF0ZW1lbnQuc3RhdGVtZW50czsKIAkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewpAQCAtMjUxOSwxNSArMjQ5NywxNSBAQAogCQl9CiAJCXJldHVybiBzd2l0Y2hTdGF0ZW1lbnQ7CiAJfQotCQorCiAJcHVibGljIFN5bmNocm9uaXplZFN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3luY2hyb25pemVkU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50ID0gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0aGlzLmFzdCk7Ci0JCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKIAkJc3luY2hyb25pemVkU3RhdGVtZW50LnNldEJvZHkoY29udmVydChzdGF0ZW1lbnQuYmxvY2spKTsKIAkJc3luY2hyb25pemVkU3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuZXhwcmVzc2lvbikpOwogCQlyZXR1cm4gc3luY2hyb25pemVkU3RhdGVtZW50OwogCX0KLQkKKwogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogCQlpZiAocmVmZXJlbmNlLmlzSW1wbGljaXRUaGlzKCkpIHsKIAkJCS8vIFRoZXJlIGlzIG5vIHNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYW4gaW1wbGljaXQgdGhpcwpAQCAtMjU0NiwxNCArMjUyNCwxNCBAQAogCQkJcmV0dXJuIHRoaXNFeHByZXNzaW9uOwogCQl9CiAJfQotCQorCiAJcHVibGljIFRocm93U3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaHJvd1N0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJZmluYWwgVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQgPSBuZXcgVGhyb3dTdGF0ZW1lbnQodGhpcy5hc3QpOwotCQl0aHJvd1N0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXRocm93U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwogCQl0aHJvd1N0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmV4Y2VwdGlvbikpOwogCQlyZXR1cm4gdGhyb3dTdGF0ZW1lbnQ7CiAJfQotCQkKKwogCXB1YmxpYyBCb29sZWFuTGl0ZXJhbCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHJ1ZUxpdGVyYWwgZXhwcmVzc2lvbikgewogCQlmaW5hbCBCb29sZWFuTGl0ZXJhbCBsaXRlcmFsID0gbmV3IEJvb2xlYW5MaXRlcmFsKHRoaXMuYXN0KTsKIAkJbGl0ZXJhbC5zZXRCb29sZWFuVmFsdWUodHJ1ZSk7CkBAIC0yNTYxLDEzICsyNTM5LDMyIEBACiAJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOwogCQl9CiAJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7Ci0JCXJldHVybiBsaXRlcmFsOwkJCisJCXJldHVybiBsaXRlcmFsOwogCX0KLQkKKwogCXB1YmxpYyBUcnlTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRyeVN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJZmluYWwgVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IG5ldyBUcnlTdGF0ZW1lbnQodGhpcy5hc3QpOwotCQl0cnlTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CQotCisJCXRyeVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKKwkJTG9jYWxEZWNsYXJhdGlvbltdIGxvY2FsRGVjbGFyYXRpb25zID0gc3RhdGVtZW50LnJlc291cmNlczsKKwkJaW50IHJlc291cmNlc0xlbmd0aCA9IGxvY2FsRGVjbGFyYXRpb25zLmxlbmd0aDsKKwkJaWYgKHJlc291cmNlc0xlbmd0aCA+IDApIHsKKwkJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgeworCQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgorCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQkvLyBjb252ZXJ0IGl0IHRvIGEgc2ltcGxlIHRyeSBzdGF0ZW1lbnQgdGFnZ2VkIGFzIE1BTEZPUk1FRAorCQkJCQl0cnlTdGF0ZW1lbnQuc2V0RmxhZ3ModHJ5U3RhdGVtZW50LmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzTGVuZ3RoOyBpKyspIHsKKwkJCQkJCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IGxvY2FsRGVjbGFyYXRpb25zW2ldOworCQkJCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihsb2NhbERlY2xhcmF0aW9uKTsKKwkJCQkJCWludCBzdGFydCA9IHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJCWludCBlbmQgPSBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kOworCQkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCQl0cnlTdGF0ZW1lbnQucmVzb3VyY2VzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKTsKKwkJCQkJfQorCQkJfQorCQl9CiAJCXRyeVN0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoc3RhdGVtZW50LnRyeUJsb2NrKSk7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnRbXSBjYXRjaEFyZ3VtZW50cyA9IHN0YXRlbWVudC5jYXRjaEFyZ3VtZW50czsKIAkJaWYgKGNhdGNoQXJndW1lbnRzICE9IG51bGwpIHsKQEAgLTI1NzcsNyArMjU3NCw3IEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKIAkJCQlDYXRjaENsYXVzZSBjYXRjaENsYXVzZSA9IG5ldyBDYXRjaENsYXVzZSh0aGlzLmFzdCk7CiAJCQkJaW50IGNhdGNoQ2xhdXNlU291cmNlU3RhcnQgPSByZXRyaWV2ZVN0YXJ0aW5nQ2F0Y2hQb3NpdGlvbihzdGFydCwgY2F0Y2hBcmd1bWVudHNbaV0uc291cmNlU3RhcnQpOwotCQkJCWNhdGNoQ2xhdXNlLnNldFNvdXJjZVJhbmdlKGNhdGNoQ2xhdXNlU291cmNlU3RhcnQsIGNhdGNoQmxvY2tzW2ldLnNvdXJjZUVuZCAtIGNhdGNoQ2xhdXNlU291cmNlU3RhcnQgKyAxKTsJCisJCQkJY2F0Y2hDbGF1c2Uuc2V0U291cmNlUmFuZ2UoY2F0Y2hDbGF1c2VTb3VyY2VTdGFydCwgY2F0Y2hCbG9ja3NbaV0uc291cmNlRW5kIC0gY2F0Y2hDbGF1c2VTb3VyY2VTdGFydCArIDEpOwogCQkJCWNhdGNoQ2xhdXNlLnNldEJvZHkoY29udmVydChjYXRjaEJsb2Nrc1tpXSkpOwogCQkJCWNhdGNoQ2xhdXNlLnNldEV4Y2VwdGlvbihjb252ZXJ0KGNhdGNoQXJndW1lbnRzW2ldKSk7CiAJCQkJdHJ5U3RhdGVtZW50LmNhdGNoQ2xhdXNlcygpLmFkZChjYXRjaENsYXVzZSk7CkBAIC0yNjEyLDEzICsyNjA5LDE0IEBACiAJCWlmICh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgIT0gLTEpIHsKIAkJCXNldE1vZGlmaWVycyh0eXBlRGVjbCwgdHlwZURlY2xhcmF0aW9uKTsKIAkJfQotCQl0eXBlRGVjbC5zZXRJbnRlcmZhY2Uoa2luZCA9PSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTCk7CisJCWJvb2xlYW4gaXNJbnRlcmZhY2UgPSBraW5kID09IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMOworCQl0eXBlRGVjbC5zZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpOwogCQlmaW5hbCBTaW1wbGVOYW1lIHR5cGVOYW1lID0gbmV3IFNpbXBsZU5hbWUodGhpcy5hc3QpOwogCQl0eXBlTmFtZS5pbnRlcm5hbFNldElkZW50aWZpZXIobmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSkpOwogCQl0eXBlTmFtZS5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKIAkJdHlwZURlY2wuc2V0TmFtZSh0eXBlTmFtZSk7CiAJCXR5cGVEZWNsLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uYm9keUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7Ci0JCQorCiAJCS8vIG5lZWQgdG8gc2V0IHRoZSBzdXBlcmNsYXNzIGFuZCBzdXBlciBpbnRlcmZhY2VzIGhlcmUgc2luY2Ugd2UgY2Fubm90IGRpc3Rpbmd1aXNoIHRoZW0gYXQKIAkJLy8gdGhlIHR5cGUgcmVmZXJlbmNlcyBsZXZlbC4KIAkJaWYgKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzICE9IG51bGwpIHsKQEAgLTI2MjYsMTIgKzI2MjQsMTIgQEAKIAkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJdHlwZURlY2wuaW50ZXJuYWxTZXRTdXBlcmNsYXNzKGNvbnZlcnQodHlwZURlY2xhcmF0aW9uLnN1cGVyY2xhc3MpKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJZGVmYXVsdCA6CiAJCQkJCXR5cGVEZWNsLnNldFN1cGVyY2xhc3NUeXBlKGNvbnZlcnRUeXBlKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzKSk7CiAJCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCQorCiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXM7CiAJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgewogCQkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7CkBAIC0yNjQwLDExICsyNjM4LDExIEBACiAJCQkJCQl0eXBlRGVjbC5pbnRlcm5hbFN1cGVySW50ZXJmYWNlcygpLmFkZChjb252ZXJ0KHN1cGVySW50ZXJmYWNlc1tpbmRleF0pKTsKIAkJCQkJfQogCQkJCQlicmVhazsKLQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQlkZWZhdWx0IDoKIAkJCQkJZm9yIChpbnQgaW5kZXggPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogCQkJCQkJdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VUeXBlcygpLmFkZChjb252ZXJ0VHlwZShzdXBlckludGVyZmFjZXNbaW5kZXhdKSk7CiAJCQkJCX0KLQkJCX0JCQkJCQorCQkJfQogCQl9CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gdHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzOwogCQlpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewpAQCAtMjY1MiwxMyArMjY1MCwxMyBAQAogCQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgogCQkJCQl0eXBlRGVjbC5zZXRGbGFncyh0eXBlRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCQlicmVhazsKLQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQlkZWZhdWx0IDoKIAkJCQkJZm9yIChpbnQgaW5kZXggPSAwLCBsZW5ndGggPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAJCQkJCQl0eXBlRGVjbC50eXBlUGFyYW1ldGVycygpLmFkZChjb252ZXJ0KHR5cGVQYXJhbWV0ZXJzW2luZGV4XSkpOwogCQkJCQl9CiAJCQl9CiAJCX0KLQkJYnVpbGRCb2R5RGVjbGFyYXRpb25zKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2wpOworCQlidWlsZEJvZHlEZWNsYXJhdGlvbnModHlwZURlY2xhcmF0aW9uLCB0eXBlRGVjbCwgaXNJbnRlcmZhY2UpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCXJlY29yZE5vZGVzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24pOwogCQkJcmVjb3JkTm9kZXModHlwZU5hbWUsIHR5cGVEZWNsYXJhdGlvbik7CkBAIC0yNzAxLDE0ICsyNjk5LDE0IEBACiAJCX0KIAkJcmV0dXJuIHR5cGVQYXJhbWV0ZXIyOwogCX0KLQkKKwogCXB1YmxpYyBOYW1lIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpIHsKIAkJY2hhcltdW10gdHlwZU5hbWUgPSB0eXBlUmVmZXJlbmNlLmdldFR5cGVOYW1lKCk7CiAJCWludCBsZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7CiAJCWlmIChsZW5ndGggPiAxKSB7CiAJCQkvLyBRdWFsaWZpZWROYW1lCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2U7Ci0JCQlmaW5hbCBsb25nW10gcG9zaXRpb25zID0gcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnM7CQkJCisJCQlmaW5hbCBsb25nW10gcG9zaXRpb25zID0gcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VQb3NpdGlvbnM7CiAJCQlyZXR1cm4gc2V0UXVhbGlmaWVkTmFtZU5hbWVBbmRTb3VyY2VSYW5nZXModHlwZU5hbWUsIHBvc2l0aW9ucywgdHlwZVJlZmVyZW5jZSk7CiAJCX0gZWxzZSB7CiAJCQlmaW5hbCBTaW1wbGVOYW1lIG5hbWUgPSBuZXcgU2ltcGxlTmFtZSh0aGlzLmFzdCk7CkBAIC0yNzIxLDcgKzI3MTksNyBAQAogCQkJcmV0dXJuIG5hbWU7CiAJCX0KIAl9Ci0JCQkKKwogCXB1YmxpYyBQcmVmaXhFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlmaW5hbCBQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSBuZXcgUHJlZml4RXhwcmVzc2lvbih0aGlzLmFzdCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtMjc0NCw3ICsyNzQyLDcgQEAKIAkJfQogCQlyZXR1cm4gcHJlZml4RXhwcmVzc2lvbjsKIAl9Ci0JCisKIAlwdWJsaWMgV2hpbGVTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldoaWxlU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlmaW5hbCBXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCA9IG5ldyBXaGlsZVN0YXRlbWVudCh0aGlzLmFzdCk7CiAJCXdoaWxlU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwpAQCAtMjc1NCw3ICsyNzUyLDcgQEAKIAkJd2hpbGVTdGF0ZW1lbnQuc2V0Qm9keShhY3Rpb24pOwogCQlyZXR1cm4gd2hpbGVTdGF0ZW1lbnQ7CiAJfQotCQorCiAJcHVibGljIEltcG9ydERlY2xhcmF0aW9uIGNvbnZlcnRJbXBvcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlKSB7CiAJCWZpbmFsIEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKHRoaXMuYXN0KTsKIAkJZmluYWwgYm9vbGVhbiBvbkRlbWFuZCA9IChpbXBvcnRSZWZlcmVuY2UuYml0cyAmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZS5PbkRlbWFuZCkgIT0gMDsKQEAgLTI3ODMsNyArMjc4MSw3IEBACiAJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCWltcG9ydERlY2xhcmF0aW9uLnNldEZsYWdzKGltcG9ydERlY2xhcmF0aW9uLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCWRlZmF1bHQgOgogCQkJCQlpZiAobW9kaWZpZXJzID09IENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpIHsKIAkJCQkJCWltcG9ydERlY2xhcmF0aW9uLnNldFN0YXRpYyh0cnVlKTsKIAkJCQkJfSBlbHNlIHsKQEAgLTI4MjQsNyArMjgyMiw3IEBACiAJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCXBhY2thZ2VEZWNsYXJhdGlvbi5zZXRGbGFncyhwYWNrYWdlRGVjbGFyYXRpb24uZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJZGVmYXVsdCA6CiAJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJcGFja2FnZURlY2xhcmF0aW9uLmFubm90YXRpb25zKCkuYWRkKGNvbnZlcnQoYW5ub3RhdGlvbnNbaV0pKTsKIAkJCQkJfQpAQCAtMjgzNyw5ICsyODM1LDEwIEBACiAJCWNvbnZlcnQoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YWRvYywgcGFja2FnZURlY2xhcmF0aW9uKTsKIAkJcmV0dXJuIHBhY2thZ2VEZWNsYXJhdGlvbjsKIAl9Ci0JCisKIAlwcml2YXRlIEVudW1EZWNsYXJhdGlvbiBjb252ZXJ0VG9FbnVtRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJCWNoZWNrQ2FuY2VsZWQoKTsKKwkJLy8gZW51bSBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgYnVpbHQgaWYgdGhlIHNvdXJjZSBpcyBub3QgPj0gMS41LCBzaW5jZSBlbnVtIGlzIHRoZW4gc2VlbiBhcyBhbiBpZGVudGlmaWVyCiAJCWZpbmFsIEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24yID0gbmV3IEVudW1EZWNsYXJhdGlvbih0aGlzLmFzdCk7CiAJCXNldE1vZGlmaWVycyhlbnVtRGVjbGFyYXRpb24yLCB0eXBlRGVjbGFyYXRpb24pOwogCQlmaW5hbCBTaW1wbGVOYW1lIHR5cGVOYW1lID0gbmV3IFNpbXBsZU5hbWUodGhpcy5hc3QpOwpAQCAtMjg0NywxMiArMjg0NiwxMiBAQAogCQl0eXBlTmFtZS5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKIAkJZW51bURlY2xhcmF0aW9uMi5zZXROYW1lKHR5cGVOYW1lKTsKIAkJZW51bURlY2xhcmF0aW9uMi5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgdHlwZURlY2xhcmF0aW9uLmJvZHlFbmQgLSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpOwotCQkKKwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzOwogCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGluZGV4ID0gMCwgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKIAkJCQllbnVtRGVjbGFyYXRpb24yLnN1cGVySW50ZXJmYWNlVHlwZXMoKS5hZGQoY29udmVydFR5cGUoc3VwZXJJbnRlcmZhY2VzW2luZGV4XSkpOwotCQkJfQkJCQkJCisJCQl9CiAJCX0KIAkJYnVpbGRCb2R5RGVjbGFyYXRpb25zKHR5cGVEZWNsYXJhdGlvbiwgZW51bURlY2xhcmF0aW9uMik7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtMjkwMSwxOCArMjkwMCw3IEBACiAJCXBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLnNldEV4cHJlc3Npb24oY29udmVydChleHByZXNzaW9uKSk7CiAJCXJldHVybiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKIAl9Ci0JCQotCXB1YmxpYyBUeXBlIGNvbnZlcnRUb1R5cGUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlOYW1lIG5hbWUgPSBjb252ZXJ0KHJlZmVyZW5jZSk7Ci0JCWZpbmFsIFNpbXBsZVR5cGUgdHlwZSA9IG5ldyBTaW1wbGVUeXBlKHRoaXMuYXN0KTsKLQkJdHlwZS5zZXROYW1lKG5hbWUpOwotCQl0eXBlLnNldFNvdXJjZVJhbmdlKG5hbWUuZ2V0U3RhcnRQb3NpdGlvbigpLCBuYW1lLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7Ci0JCQl0aGlzLnJlY29yZE5vZGVzKHR5cGUsIHJlZmVyZW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQorCiAJcHJvdGVjdGVkIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uKSB7CiAJCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQobG9jYWxEZWNsYXJhdGlvbik7CiAJCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHRoaXMuYXN0KTsKQEAgLTI5NTYsNyArMjk0NCw3IEBACiAJCX0KIAkJcmV0dXJuIHZhcmlhYmxlRGVjbDsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbikgewogCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCh0aGlzLmFzdCk7CiAJCWZpbmFsIFNpbXBsZU5hbWUgbmFtZSA9IG5ldyBTaW1wbGVOYW1lKHRoaXMuYXN0KTsKQEAgLTI5NjQsMTkgKzI5NTIsMjkgQEAKIAkJbmFtZS5zZXRTb3VyY2VSYW5nZShmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCAtIGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKIAkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUobmFtZSk7CiAJCWludCBzdGFydCA9IGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kOworCQlpbnQgZW5kID0gc3RhcnQ7CisJCWludCBleHRyYURpbWVuc2lvbnMgPSByZXRyaWV2ZUV4dHJhRGltZW5zaW9uKGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kICsgMSwgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCApOworCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKGV4dHJhRGltZW5zaW9ucyk7CiAJCWlmIChmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKIAkJCWZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGNvbnZlcnQoZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbik7CiAJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoZXhwcmVzc2lvbik7CiAJCQlzdGFydCA9IGV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpICsgZXhwcmVzc2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCQlpbnQgZW5kID0gcmV0cmlldmVQb3NpdGlvbkJlZm9yZU5leHRDb21tYU9yU2VtaUNvbG9uKHN0YXJ0LCBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldFNvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgLSBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ICsgMSk7Ci0JCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RmxhZ3ModmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CisJCQllbmQgPSBzdGFydCAtIDE7CiAJCX0gZWxzZSB7Ci0JCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZW5kIC0gZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQkJLy8gd2UgbmVlZCB0byBkbyBpdCBldmVuIGlmIGV4dGVuZGVkRGltZW5zaW9uIGlzIG51bGwgaW4gY2FzZSBvZiBzeW50YXggZXJyb3IgaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIKKwkJCS8vIG5lZWQgdGhlIGV4Y2x1c2l2ZSByYW5nZSBmb3IgcmV0cmlldmVFbmRPZlBvdGVudGlhbEV4dGVuZGVkRGltZW5zaW9ucworCQkJaW50IHBvc3NpYmxlRW5kID0gcmV0cmlldmVFbmRPZlBvdGVudGlhbEV4dGVuZGVkRGltZW5zaW9ucyhzdGFydCArIDEsIGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kLCBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJCWlmIChwb3NzaWJsZUVuZCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworCQkJCWVuZCA9IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEZsYWdzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOworCQkJfSBpZiAocG9zc2libGVFbmQgPCAwKSB7CisJCQkJZW5kID0gLXBvc3NpYmxlRW5kOworCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRGbGFncyh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJCX0gZWxzZSB7CisJCQkJZW5kID0gcG9zc2libGVFbmQ7CisJCQl9CiAJCX0KLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucyhyZXRyaWV2ZUV4dHJhRGltZW5zaW9uKGZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kICsgMSwgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCApKTsKKwkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldFNvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGVuZCAtIGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2RlcyhuYW1lLCBmaWVsZERlY2xhcmF0aW9uKTsKIAkJCXJlY29yZE5vZGVzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwgZmllbGREZWNsYXJhdGlvbik7CkBAIC0yOTkyLDMyICsyOTkwLDMxIEBACiAJCW5hbWUuc2V0U291cmNlUmFuZ2UobG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ICsgMSk7CiAJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKG5hbWUpOwogCQlpbnQgc3RhcnQgPSBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKLQkJaWYgKGxvY2FsRGVjbGFyYXRpb24ubmFtZSA9PSBSZWNvdmVyeVNjYW5uZXIuRkFLRV9JREVOVElGSUVSKSB7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5NjY4Ci0JCQkvLyBzb3VyY2VFbmQgaXMgZXF1YWxzIHRvIHNvdXJjZVN0YXJ0IC0gMSB3aGVuIHRoZSB0b2tlbiBpcyBlbXB0eSAodG9rZW4gY3JlYXRlZCBieSB0aGUgc3RhdGVtZW50cyByZWNvdmVyeSkuCi0JCQkvLyBzb3VyY2VTdGFydCBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvdGhlcndpc2UgcmV0cmlldmVQb3NpdGlvbkJlZm9yZU5leHRDb21tYU9yU2VtaUNvbG9uKCkgY291bGQgZmluZCB0aGUKLQkJCS8vIHByZXZpb3VzIGNvbW1hIG9yIHNlbWljb2xvbi4KLQkJCXN0YXJ0ID0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKLQkJfQogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBsb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uOworCQlpbnQgZXh0cmFEaW1lbnNpb24gPSByZXRyaWV2ZUV4dHJhRGltZW5zaW9uKGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kICsgMSwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2VMZW5ndGgpOworCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKGV4dHJhRGltZW5zaW9uKTsKIAkJYm9vbGVhbiBoYXNJbml0aWFsaXphdGlvbiA9IGluaXRpYWxpemF0aW9uICE9IG51bGw7CisJCWludCBlbmQ7CiAJCWlmIChoYXNJbml0aWFsaXphdGlvbikgewogCQkJZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY29udmVydChpbml0aWFsaXphdGlvbik7CiAJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoZXhwcmVzc2lvbik7CiAJCQlzdGFydCA9IGV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpICsgZXhwcmVzc2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCQlpbnQgZW5kID0gcmV0cmlldmVQb3NpdGlvbkJlZm9yZU5leHRDb21tYU9yU2VtaUNvbG9uKHN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJaWYgKGhhc0luaXRpYWxpemF0aW9uKSB7Ci0JCQkJLy8gdGhlIGluaXRpYXphdGlvbiBzb3VyY2VFbmQgaXMgbW9kaWZpZWQgZHVyaW5nIGNvbnZlcnQoaW5pdGlhbGl6YXRpb24pCi0JCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg5NjEKLQkJCQllbmQgPSBzdGFydCAtIDE7CisJCQllbmQgPSBzdGFydCAtIDE7CisJCX0gZWxzZSB7CisJCQkvLyB3ZSBuZWVkIHRvIGRvIGl0IGV2ZW4gaWYgZXh0ZW5kZWREaW1lbnNpb24gaXMgbnVsbCBpbiBjYXNlIG9mIHN5bnRheCBlcnJvciBpbiBhbiBhcnJheSBpbml0aWFsaXplcgorCQkJLy8gc3RhcnQgKyAxIGJlY2F1c2Ugd2UgbmVlZCB0aGUgZXhjbHVzaXZlIHJhbmdlIGZvciByZXRyaWV2ZUVuZE9mUG90ZW50aWFsRXh0ZW5kZWREaW1lbnNpb25zCisJCQlpbnQgcG9zc2libGVFbmQgPSByZXRyaWV2ZUVuZE9mUG90ZW50aWFsRXh0ZW5kZWREaW1lbnNpb25zKHN0YXJ0ICsgMSwgbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQsIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJaWYgKHBvc3NpYmxlRW5kID09IEludGVnZXIuTUlOX1ZBTFVFKSB7CisJCQkJZW5kID0gc3RhcnQ7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEZsYWdzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOworCQkJfSBlbHNlIGlmIChwb3NzaWJsZUVuZCA8IDApIHsKKwkJCQllbmQgPSAtcG9zc2libGVFbmQ7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEZsYWdzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJfSBlbHNlIHsKLQkJCQllbmQgPSBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKKwkJCQllbmQgPSBwb3NzaWJsZUVuZDsKIAkJCX0KIAkJfQogCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UobG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKHJldHJpZXZlRXh0cmFEaW1lbnNpb24obG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQgKyAxLCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZUxlbmd0aCkpOwogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCXJlY29yZE5vZGVzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwgbG9jYWxEZWNsYXJhdGlvbik7CiAJCQlyZWNvcmROb2RlcyhuYW1lLCBsb2NhbERlY2xhcmF0aW9uKTsKQEAgLTMwNzUsNyArMzA3Miw3IEBACiAJCQkJaW50IGVuZCA9IHJldHJpZXZlRW5kT2ZFbGVtZW50VHlwZU5hbWVQb3NpdGlvbihzb3VyY2VTdGFydCwgc291cmNlU3RhcnQgKyBsZW5ndGgpOwogCQkJCWlmIChlbmQgPT0gLTEpIHsKIAkJCQkJZW5kID0gc291cmNlU3RhcnQgKyBsZW5ndGggLSAxOwotCQkJCX0JCQkJCQorCQkJCX0KIAkJCQlmaW5hbCBQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUgPSBuZXcgUHJpbWl0aXZlVHlwZSh0aGlzLmFzdCk7CiAJCQkJcHJpbWl0aXZlVHlwZS5zZXRQcmltaXRpdmVUeXBlQ29kZShnZXRQcmltaXRpdmVUeXBlQ29kZShuYW1lKSk7CiAJCQkJcHJpbWl0aXZlVHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgZW5kIC0gc291cmNlU3RhcnQgKyAxKTsKQEAgLTMxMDAsNyArMzA5Nyw3IEBACiAJCQkJCQkJdGhpcy5yZWNvcmROb2RlcyhzaW1wbGVOYW1lLCB0eXBlUmVmZXJlbmNlKTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQkJZGVmYXVsdCA6CiAJCQkJCQlzaW1wbGVUeXBlID0gbmV3IFNpbXBsZVR5cGUodGhpcy5hc3QpOwogCQkJCQkJc2ltcGxlVHlwZS5zZXROYW1lKHNpbXBsZU5hbWUpOwogCQkJCQkJc2ltcGxlVHlwZS5zZXRTb3VyY2VSYW5nZShzaW1wbGVOYW1lLmdldFN0YXJ0UG9zaXRpb24oKSwgc2ltcGxlTmFtZS5nZXRMZW5ndGgoKSk7CkBAIC0zMTY5LDI4ICszMTY2LDI4IEBACiAJCQkJc291cmNlU3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMF0+Pj4zMik7CiAJCQkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7CiAJCQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOiB7Ci0JCQkJCQkJY2hhcltdW10gbmFtZSA9ICgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB0eXBlUmVmZXJlbmNlKS5nZXRUeXBlTmFtZSgpOwotCQkJCQkJCWludCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGg7Ci0JCQkJCQkJc291cmNlU3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMF0+Pj4zMik7Ci0JCQkJCQkJbGVuZ3RoID0gKGludCkocG9zaXRpb25zW25hbWVMZW5ndGggLSAxXSAmIDB4RkZGRkZGRkYpIC0gc291cmNlU3RhcnQgKyAxOwotCQkJCQkJCU5hbWUgcXVhbGlmaWVkTmFtZSA9IHRoaXMuc2V0UXVhbGlmaWVkTmFtZU5hbWVBbmRTb3VyY2VSYW5nZXMobmFtZSwgcG9zaXRpb25zLCB0eXBlUmVmZXJlbmNlKTsKLQkJCQkJCQlmaW5hbCBTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBuZXcgU2ltcGxlVHlwZSh0aGlzLmFzdCk7Ci0JCQkJCQkJc2ltcGxlVHlwZS5zZXROYW1lKHF1YWxpZmllZE5hbWUpOwotCQkJCQkJCXNpbXBsZVR5cGUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7Ci0JCQkJCQkJdHlwZSA9IHNpbXBsZVR5cGU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJCQljaGFyW11bXSBuYW1lID0gKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLmdldFR5cGVOYW1lKCk7CisJCQkJCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUubGVuZ3RoOworCQkJCQkJc291cmNlU3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMF0+Pj4zMik7CisJCQkJCQlsZW5ndGggPSAoaW50KShwb3NpdGlvbnNbbmFtZUxlbmd0aCAtIDFdICYgMHhGRkZGRkZGRikgLSBzb3VyY2VTdGFydCArIDE7CisJCQkJCQlOYW1lIHF1YWxpZmllZE5hbWUgPSB0aGlzLnNldFF1YWxpZmllZE5hbWVOYW1lQW5kU291cmNlUmFuZ2VzKG5hbWUsIHBvc2l0aW9ucywgdHlwZVJlZmVyZW5jZSk7CisJCQkJCQlmaW5hbCBTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBuZXcgU2ltcGxlVHlwZSh0aGlzLmFzdCk7CisJCQkJCQlzaW1wbGVUeXBlLnNldE5hbWUocXVhbGlmaWVkTmFtZSk7CisJCQkJCQlzaW1wbGVUeXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQkJCQkJdHlwZSA9IHNpbXBsZVR5cGU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgogCQkJCQkJaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJCQkJCWludCBudW1iZXJPZkVuY2xvc2luZ1R5cGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGluZ0luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kaW5nSW5kZXggPSAwOworCQkJCQkJCWludCBzdGFydGluZ0luZGV4ID0gMDsKKwkJCQkJCQlpbnQgZW5kaW5nSW5kZXggPSAwOwogCQkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCQkJCWlmICh0eXBlQXJndW1lbnRzW2ldICE9IG51bGwpIHsKIAkJCQkJCQkJCW51bWJlck9mRW5jbG9zaW5nVHlwZSsrOwogCQkJCQkJCQl9IGVsc2UgaWYgKG51bWJlck9mRW5jbG9zaW5nVHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRpbmdJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQkJCQllbmRpbmdJbmRleCsrOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJCU5hbWUgbmFtZSA9IG51bGw7CiAJCQkJCQkJaWYgKGVuZGluZ0luZGV4IC0gc3RhcnRpbmdJbmRleCA9PSAwKSB7CkBAIC0zMjAzLDcgKzMyMDAsNyBAQAogCQkJCQkJCQlzaW1wbGVOYW1lLmluZGV4ID0gMTsKIAkJCQkJCQkJbmFtZSA9IHNpbXBsZU5hbWU7CiAJCQkJCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewotCQkgCQkJCQkJCXJlY29yZE5vZGVzKHNpbXBsZU5hbWUsIHR5cGVSZWZlcmVuY2UpOworCQkJCQkJCQkJcmVjb3JkTm9kZXMoc2ltcGxlTmFtZSwgdHlwZVJlZmVyZW5jZSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQluYW1lID0gdGhpcy5zZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyh0b2tlbnMsIHBvc2l0aW9ucywgZW5kaW5nSW5kZXgsIHR5cGVSZWZlcmVuY2UpOwpAQCAtMzIxNSwxMCArMzIxMiwxMCBAQAogCQkJCQkJCXNpbXBsZVR5cGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CiAJCQkJCQkJUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUgPSBuZXcgUGFyYW1ldGVyaXplZFR5cGUodGhpcy5hc3QpOwogCQkJCQkJCXBhcmFtZXRlcml6ZWRUeXBlLnNldFR5cGUoc2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5vZGVzKHNpbXBsZVR5cGUsIHR5cGVSZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmROb2RlcyhwYXJhbWV0ZXJpemVkVHlwZSwgdHlwZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCQkJCQlyZWNvcmROb2RlcyhzaW1wbGVUeXBlLCB0eXBlUmVmZXJlbmNlKTsKKwkJCQkJCQkJcmVjb3JkTm9kZXMocGFyYW1ldGVyaXplZFR5cGUsIHR5cGVSZWZlcmVuY2UpOworCQkJCQkJCX0KIAkJCQkJCQlzdGFydCA9IHNpbXBsZVR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJCQkJCWVuZCA9IHN0YXJ0ICsgc2ltcGxlVHlwZS5nZXRMZW5ndGgoKSAtIDE7CiAJCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVBcmd1bWVudHNbZW5kaW5nSW5kZXhdLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CkBAIC0zMjQzLDIzICszMjQwLDIzIEBACiAJCQkJCQkJCXJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKHNpbXBsZU5hbWUpOwogCQkJCQkJCQlRdWFsaWZpZWRUeXBlIHF1YWxpZmllZFR5cGUgPSBuZXcgUXVhbGlmaWVkVHlwZSh0aGlzLmFzdCk7CiAJCQkJCQkJCXF1YWxpZmllZFR5cGUuc2V0UXVhbGlmaWVyKGN1cnJlbnRUeXBlKTsKLQkJCQkJCQkJcXVhbGlmaWVkVHlwZS5zZXROYW1lKHNpbXBsZU5hbWUpOwkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmROb2RlcyhzaW1wbGVOYW1lLCB0eXBlUmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5vZGVzKHF1YWxpZmllZFR5cGUsIHR5cGVSZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQkJCXF1YWxpZmllZFR5cGUuc2V0TmFtZShzaW1wbGVOYW1lKTsKKwkJCQkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQkJCQlyZWNvcmROb2RlcyhzaW1wbGVOYW1lLCB0eXBlUmVmZXJlbmNlKTsKKwkJCQkJCQkJCXJlY29yZE5vZGVzKHF1YWxpZmllZFR5cGUsIHR5cGVSZWZlcmVuY2UpOworCQkJCQkJCQl9CiAJCQkJCQkJCXN0YXJ0ID0gY3VycmVudFR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJCQkJCQllbmQgPSBzaW1wbGVOYW1lLmdldFN0YXJ0UG9zaXRpb24oKSArIHNpbXBsZU5hbWUuZ2V0TGVuZ3RoKCkgLSAxOwogCQkJCQkJCQlxdWFsaWZpZWRUeXBlLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQkJCQkJCQlpbmRleE9mRW5jbG9zaW5nVHlwZSsrOwogCQkJCQkJCQlpZiAodHlwZUFyZ3VtZW50c1tzdGFydGluZ0luZGV4XSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlxdWFsaWZpZWRUeXBlLmluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1R5cGU7CisJCQkJCQkJCQlxdWFsaWZpZWRUeXBlLmluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1R5cGU7CiAJCQkJCQkJCQlQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbWV0ZXJpemVkVHlwZTIgPSBuZXcgUGFyYW1ldGVyaXplZFR5cGUodGhpcy5hc3QpOwogCQkJCQkJCQkJcGFyYW1ldGVyaXplZFR5cGUyLnNldFR5cGUocXVhbGlmaWVkVHlwZSk7Ci0gCQkJCQkJCQkJcGFyYW1ldGVyaXplZFR5cGUyLmluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1R5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5vZGVzKHBhcmFtZXRlcml6ZWRUeXBlMiwgdHlwZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQkJCQlwYXJhbWV0ZXJpemVkVHlwZTIuaW5kZXggPSBpbmRleE9mRW5jbG9zaW5nVHlwZTsKKwkJCQkJCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCQkJCQkJCXJlY29yZE5vZGVzKHBhcmFtZXRlcml6ZWRUeXBlMiwgdHlwZVJlZmVyZW5jZSk7CisJCQkJCQkJCQl9CiAJCQkJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZUFyZ3VtZW50c1tzdGFydGluZ0luZGV4XS5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJCQkJCWZpbmFsIFR5cGUgdHlwZTIgPSBjb252ZXJ0VHlwZSh0eXBlQXJndW1lbnRzW3N0YXJ0aW5nSW5kZXhdW2ldKTsKIAkJCQkJCQkJCQlwYXJhbWV0ZXJpemVkVHlwZTIudHlwZUFyZ3VtZW50cygpLmFkZCh0eXBlMik7CkBAIC0zMjY3LDExICszMjY0LDExIEBACiAJCQkJCQkJCQl9CiAJCQkJCQkJCQllbmQgPSByZXRyaWV2ZUNsb3NpbmdBbmdsZUJyYWNrZXRQb3NpdGlvbihlbmQgKyAxKTsKIAkJCQkJCQkJCWxlbmd0aCA9IGVuZCArIDE7Ci0JCQkJCQkJCQlwYXJhbWV0ZXJpemVkVHlwZTIuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CQkJCQkJCQorCQkJCQkJCQkJcGFyYW1ldGVyaXplZFR5cGUyLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQkJCQkJCQkJY3VycmVudFR5cGUgPSBwYXJhbWV0ZXJpemVkVHlwZTI7CiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQljdXJyZW50VHlwZSA9IHF1YWxpZmllZFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlxdWFsaWZpZWRUeXBlLmluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1R5cGU7CisJCQkJCQkJCQlxdWFsaWZpZWRUeXBlLmluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1R5cGU7CiAJCQkJCQkJCX0KIAkJCQkJCQkJc3RhcnRpbmdJbmRleCsrOwogCQkJCQkJCX0KQEAgLTMyODIsNyArMzI3OSw3IEBACiAJCQkJCQkJbGVuZ3RoIC09IHNvdXJjZVN0YXJ0OwogCQkJCQkJfQogCQkJCX0KLQkJCX0gZWxzZSB7CisJCQl9IGVsc2UgaWYgKHR5cGVSZWZlcmVuY2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKIAkJCQljaGFyW11bXSBuYW1lID0gKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLmdldFR5cGVOYW1lKCk7CiAJCQkJaW50IG5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aDsKIAkJCQlsb25nW10gcG9zaXRpb25zID0gKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLnNvdXJjZVBvc2l0aW9uczsKQEAgLTMyOTMsNiArMzI5MCwzNCBAQAogCQkJCXNpbXBsZVR5cGUuc2V0TmFtZShxdWFsaWZpZWROYW1lKTsKIAkJCQl0eXBlID0gc2ltcGxlVHlwZTsKIAkJCQl0eXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQkJfSBlbHNlIHsKKwkJCQlUeXBlUmVmZXJlbmNlW10gdHlwZVJlZmVyZW5jZXMgPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVW5pb25UeXBlUmVmZXJlbmNlKSB0eXBlUmVmZXJlbmNlKS50eXBlUmVmZXJlbmNlczsKKwkJCQlzd2l0Y2godGhpcy5hc3QuYXBpTGV2ZWwpIHsKKwkJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CisJCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQkJLy8gcmVjb3ZlcnkKKwkJCQkJCXR5cGUgPSB0aGlzLmNvbnZlcnRUeXBlKHR5cGVSZWZlcmVuY2VzWzBdKTsKKwkJCQkJCWludCBzdGFydCA9IHR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQ7CisJCQkJCQlpbnQgZW5kUG9zaXRpb24gPSB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZDsKKwkJCQkJCWxlbmd0aCA9IGVuZFBvc2l0aW9uIC0gc3RhcnQgKyAxOworCQkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgbGVuZ3RoKTsKKwkJCQkJCXR5cGUuc2V0RmxhZ3ModHlwZS5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQkvLyB1bmlvbiB0eXBlIHJlZmVyZW5jZQorCQkJCQkJZmluYWwgVW5pb25UeXBlIHVuaW9uVHlwZSA9IG5ldyBVbmlvblR5cGUodGhpcy5hc3QpOworCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJdW5pb25UeXBlLnR5cGVzKCkuYWRkKHRoaXMuY29udmVydFR5cGUodHlwZVJlZmVyZW5jZXNbaV0pKTsKKwkJCQkJCX0KKwkJCQkJCXR5cGUgPSB1bmlvblR5cGU7CisJCQkJCQlMaXN0IHR5cGVzID0gdW5pb25UeXBlLnR5cGVzKCk7CisJCQkJCQlpbnQgc2l6ZSA9IHR5cGVzLnNpemUoKTsKKwkJCQkJCXN0YXJ0ID0gKChUeXBlKSB0eXBlcy5nZXQoMCkpLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJCVR5cGUgbGFzdFR5cGUgPSAoVHlwZSkgdHlwZXMuZ2V0KHNpemUgLSAxKTsKKwkJCQkJCWVuZFBvc2l0aW9uID0gbGFzdFR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpICsgbGFzdFR5cGUuZ2V0TGVuZ3RoKCk7CisJCQkJCQlsZW5ndGggPSBlbmRQb3NpdGlvbiAtIHN0YXJ0OyAvKiArIDEgLSAxID09IDAgKi8KKwkJCQkJCXR5cGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7CisJCQkJfQogCQkJfQogCiAJCQlsZW5ndGggPSB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0ICsgMTsKQEAgLTMzMjAsNiArMzM0NSwyOCBAQAogCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCXRoaXMucmVjb3JkTm9kZXModHlwZSwgdHlwZVJlZmVyZW5jZSk7CiAJCX0KKwkJYm9vbGVhbiBzYXdEaWFtb25kID0gZmFsc2U7CisJCWlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJCVBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHBzdHIgPSAoUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2U7CisJCQlpZiAocHN0ci50eXBlQXJndW1lbnRzID09IFR5cGVSZWZlcmVuY2UuTk9fVFlQRV9BUkdVTUVOVFMpIHsKKwkJCQlzYXdEaWFtb25kID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHBxdHIgPSAoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2U7CisJCQlmb3IgKGludCBpID0gMCwgbGVuID0gcHF0ci50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaWYgKHBxdHIudHlwZUFyZ3VtZW50c1tpXSA9PSBUeXBlUmVmZXJlbmNlLk5PX1RZUEVfQVJHVU1FTlRTKSB7CisJCQkJCXNhd0RpYW1vbmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gCisJCWlmIChzYXdEaWFtb25kKSB7CisJCQlzd2l0Y2godGhpcy5hc3QuYXBpTGV2ZWwpIHsKKwkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKKwkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQkJdHlwZS5zZXRGbGFncyh0eXBlLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CisJCQl9CisJCX0KIAkJcmV0dXJuIHR5cGU7CiAJfQogCkBAIC0zMzUxLDcgKzMzOTgsNyBAQAogCQl9CiAJCXJldHVybiBjb21tZW50OwogCX0KLQkKKwogCXByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlRmFrZUVtcHR5U3RhdGVtZW50KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwogCQlFbXB0eVN0YXRlbWVudCBlbXB0eVN0YXRlbWVudCA9IG5ldyBFbXB0eVN0YXRlbWVudCh0aGlzLmFzdCk7CkBAIC0zMzcyLDcgKzM0MTksNyBAQAogCQltb2RpZmllci5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJcmV0dXJuIG1vZGlmaWVyOwogCX0KLQkKKwogCXByb3RlY3RlZCBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IgZ2V0T3BlcmF0b3JGb3IoaW50IG9wZXJhdG9ySUQpIHsKIAkJc3dpdGNoIChvcGVyYXRvcklEKSB7CiAJCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JJZHMuRVFVQUxfRVFVQUwgOgpAQCAtMzQxNiw3ICszNDYzLDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgUHJpbWl0aXZlVHlwZS5Db2RlIGdldFByaW1pdGl2ZVR5cGVDb2RlKGNoYXJbXSBuYW1lKSB7CiAJCXN3aXRjaChuYW1lWzBdKSB7CiAJCQljYXNlICdpJyA6CkBAIC0zNDkyLDcgKzM1MzksNyBAQAogCQl9CiAJCXJldHVybiBudWxsOyAvLyBjYW5ub3QgYmUgcmVhY2hlZAogCX0KLQkKKwogCXByb3RlY3RlZCBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShjaGFyW10gbmFtZSkgewogCQlzd2l0Y2gobmFtZVswXSkgewogCQkJY2FzZSAnaScgOgpAQCAtMzU2OSw3ICszNjE2LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGxvb2t1cEZvclNjb3BlcygpIHsKIAkJaWYgKHRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24gIT0gbnVsbCkgewogCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKQEAgLTM1ODMsOSArMzYzMCw5IEBACiAJCQkJdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVjb3JkU2NvcGUodGhpc0V4cHJlc3Npb24sIGxvb2t1cFNjb3BlKHRoaXNFeHByZXNzaW9uKSk7CiAJCQl9CiAJCX0KLQkJCisKIAl9Ci0JCisKIAlwcml2YXRlIEJsb2NrU2NvcGUgbG9va3VwU2NvcGUoQVNUTm9kZSBub2RlKSB7CiAJCUFTVE5vZGUgY3VycmVudE5vZGUgPSBub2RlOwogCQl3aGlsZShjdXJyZW50Tm9kZSAhPSBudWxsCkBAIC0zNjE4LDEzICszNjY1LDExIEBACiAJCQl3aGlsZSghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pKSB7CiAJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKIAkJCX0KLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLmdldENvcnJlc3BvbmRpbmdOb2RlKGN1cnJlbnROb2RlKTsKLQkJCQlpZiAoKGZpZWxkRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIHsKLQkJCQkJcmV0dXJuIHR5cGVEZWNsLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHR5cGVEZWNsLmluaXRpYWxpemVyU2NvcGU7Ci0JCQkJfQorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLmdldENvcnJlc3BvbmRpbmdOb2RlKGN1cnJlbnROb2RlKTsKKwkJCWlmICgoZmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgeworCQkJCXJldHVybiB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKIAkJCX0KIAkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZ2V0Q29ycmVzcG9uZGluZ05vZGUoY3VycmVudE5vZGUpOwpAQCAtMzY1MSwxMSArMzY5NiwxMSBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgcmVjb3JkTm9kZXMoQVNUTm9kZSBub2RlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgb2xkQVNUTm9kZSkgewogCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5zdG9yZShub2RlLCBvbGRBU1ROb2RlKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCByZWNvcmROb2RlcyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2MgamF2YWRvYywgVGFnRWxlbWVudCB0YWdFbGVtZW50KSB7CiAJCUl0ZXJhdG9yIGZyYWdtZW50cyA9IHRhZ0VsZW1lbnQuZnJhZ21lbnRzKCkubGlzdEl0ZXJhdG9yKCk7CiAJCXdoaWxlIChmcmFnbWVudHMuaGFzTmV4dCgpKSB7CkBAIC0zNjc4LDcgKzM3MjMsNyBAQAogCQkJCQkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2UpIHsKIAkJCQkJCQl0eXBlUmVmID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSkgZXhwcmVzc2lvbjsKIAkJCQkJCX0KLQkJCQkJfSAKKwkJCQkJfQogCQkJCQllbHNlIGlmIChjb21waWxlck5vZGUgaW5zdGFuY2VvZiBKYXZhZG9jTWVzc2FnZVNlbmQpIHsKIAkJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKChKYXZhZG9jTWVzc2FnZVNlbmQpY29tcGlsZXJOb2RlKS5yZWNlaXZlcjsKIAkJCQkJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlKSB7CkBAIC0zNzE3LDEzICszNzYyLDEyIEBACiAJCQkJCWlmIChjb21waWxlck5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2NBbGxvY2F0aW9uRXhwcmVzc2lvbikgewogCQkJCQkJdHlwZVJlZiA9ICgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5KYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pY29tcGlsZXJOb2RlKS50eXBlOwogCQkJCQkJaWYgKHR5cGVSZWYgIT0gbnVsbCkgcmVjb3JkTm9kZXMobmFtZSwgY29tcGlsZXJOb2RlKTsKLQkJCQkJfSAKKwkJCQkJfQogCQkJCQllbHNlIGlmIChjb21waWxlck5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkphdmFkb2NNZXNzYWdlU2VuZCkgewogCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSmF2YWRvY01lc3NhZ2VTZW5kKWNvbXBpbGVyTm9kZSkucmVjZWl2ZXI7CiAJCQkJCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZSkgewogCQkJCQkJCXR5cGVSZWYgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlKSBleHByZXNzaW9uOwogCQkJCQkJfQotCQkJCQkJLy8gVE9ETyAoZnJlZGVyaWMpIHJlbW92ZSBmb2xsb3dpbmcgbGluZSB0byBmaXggYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjY1MAogCQkJCQkJcmVjb3JkTm9kZXMobmFtZSwgY29tcGlsZXJOb2RlKTsKIAkJCQkJfQogCQkJCQkvLyByZWNvcmQgbmFtZSBhbmQgcXVhbGlmaWVyCkBAIC0zNzQxLDcgKzM3ODUsOSBAQAogCQkJCQkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBKYXZhZG9jQXJndW1lbnRFeHByZXNzaW9uKSB7CiAJCQkJCQkJSmF2YWRvY0FyZ3VtZW50RXhwcmVzc2lvbiBhcmdFeHByID0gKEphdmFkb2NBcmd1bWVudEV4cHJlc3Npb24pIGV4cHJlc3Npb247CiAJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBhcmdFeHByLmFyZ3VtZW50LnR5cGU7Ci0JCQkJCQkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFMzKSBwYXJhbS5zZXRWYXJhcmdzKGFyZ0V4cHIuYXJndW1lbnQuaXNWYXJBcmdzKCkpOworCQkJCQkJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA+PSBBU1QuSkxTMykgeworCQkJCQkJCQlwYXJhbS5zZXRWYXJhcmdzKGFyZ0V4cHIuYXJndW1lbnQuaXNWYXJBcmdzKCkpOworCQkJCQkJCX0KIAkJCQkJCQlyZWNvcmROb2RlcyhwYXJhbS5nZXRUeXBlKCksIHR5cGVSZWYpOwogCQkJCQkJCWlmIChwYXJhbS5nZXRUeXBlKCkuaXNTaW1wbGVUeXBlKCkpIHsKIAkJCQkJCQkJcmVjb3JkTmFtZSgoKFNpbXBsZVR5cGUpcGFyYW0uZ2V0VHlwZSgpKS5nZXROYW1lKCksIHR5cGVSZWYpOwpAQCAtMzc2NSwyNCArMzgxMSwyNCBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgcmVjb3JkUGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24oTmFtZSBuYW1lKSB7CiAJCWlmICh0aGlzLnBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uID09IG51bGwpIHsKIAkJCXRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24gPSBuZXcgSGFzaFNldCgpOwogCQl9CiAJCXRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24uYWRkKG5hbWUpOwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIHJlY29yZFBlbmRpbmdUaGlzRXhwcmVzc2lvblNjb3BlUmVzb2x1dGlvbihUaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbikgewogCQlpZiAodGhpcy5wZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb24gPT0gbnVsbCkgewogCQkJdGhpcy5wZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb24gPSBuZXcgSGFzaFNldCgpOwogCQl9CiAJCXRoaXMucGVuZGluZ1RoaXNFeHByZXNzaW9uU2NvcGVSZXNvbHV0aW9uLmFkZCh0aGlzRXhwcmVzc2lvbik7CiAJfQotCQorCiAJLyoqCiAJICogUmVtb3ZlIHdoaXRlc3BhY2VzIGFuZCBjb21tZW50cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBleHByZXNzaW9uLgotCSAqLwkKKwkgKi8KIAlwcml2YXRlIHZvaWQgdHJpbVdoaXRlU3BhY2VzQW5kQ29tbWVudHMob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaW50IHN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKIAkJaW50IGVuZCA9IGV4cHJlc3Npb24uc291cmNlRW5kOwpAQCAtMzgyMCw3ICszODY2LDcgQEAKIAkJCQkJCSAqIHNvdXJjZSBlbmQuCiAJCQkJCQkgKi8KIAkJCQkJCXRyaW1SaWdodFBvc2l0aW9uID0gcmVtb3ZlQmxhbmtTY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwkJCQkKKwkJCQkJCWZpcnN0ID0gZmFsc2U7CiAJCQkJfQogCQkJfQogCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CkBAIC0zODU5LDcgKzM5MDUsNyBAQAogCQkJLy8gaWdub3JlCiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgcG90ZW50aWFsIHRyYWlsaW5nIGNvbW1lbnQgYnkgc2V0dGluZ3MgdGhlIHNvdXJjZSBlbmQgb24gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMKIAkgKi8KQEAgLTM4ODksNyArMzkzNSw3IEBACiAKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGJsb2NrLgotCSAqIEByZXR1cm4gaW50IHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKKwkgKiBAcmV0dXJuIHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHJldHJpZXZlQ2xvc2luZ0FuZ2xlQnJhY2tldFBvc2l0aW9uKGludCBzdGFydCkgewogCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhzdGFydCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2VMZW5ndGgpOwpAQCAtMzkwMCw2ICszOTQ2LDkgQEAKIAkJCQlzd2l0Y2godG9rZW4pIHsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVHUkVBVEVSOgogCQkJCQkJcmV0dXJuIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1M6CisJCQkJCQkvLyBUb2tlbk5hbWVMRVNTIGNhbiBvbmx5IGJlIGZvdW5kIGlmIHRoZSBjdXJyZW50IHR5cGUgaGFzIGEgZGlhbW9uZCwgc3RhcnQgaXMgbG9jYXRlZCBiZWZvcmUgdGhlICc8JworCQkJCQkJY29udGludWU7CiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQlyZXR1cm4gc3RhcnQ7CiAJCQkJfQpAQCAtMzk1MSw3ICs0MDAwLDcgQEAKIAkJCS8vIGlnbm9yZQogCQl9CiAJCXJldHVybiAtMTsKLQkKKwogCX0KIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGJsb2NrLgpAQCAtNDEyOCw3ICs0MTc3LDcgQEAKIAkJCS8vIGlnbm9yZQogCQl9CiAJfQotCQorCiAJLyoqCiAJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGJsb2NrLgogCSAqIEByZXR1cm4gaW50IHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKQEAgLTQxNDcsMzYgKzQxOTYsNDcgQEAKIAkJCS8vIGlnbm9yZQogCQl9CiAJCXJldHVybiAtMTsKLQl9CQorCX0KIAogCS8qKgogCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cmlldmUgcG9zaXRpb24gYmVmb3JlIHRoZSBuZXh0IGNvbW1hIG9yIHNlbWktY29sb24uCisJICogQHBhcmFtIGluaXRpYWxpemVyRW5kIHRoZSBnaXZlbiBpbml0aWFsaXplciBlbmQgZXhjbHVzaXZlCiAJICogQHJldHVybiBpbnQgdGhlIHBvc2l0aW9uIGZvdW5kLgogCSAqLwotCXByb3RlY3RlZCBpbnQgcmV0cmlldmVQb3NpdGlvbkJlZm9yZU5leHRDb21tYU9yU2VtaUNvbG9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwlwcm90ZWN0ZWQgaW50IHJldHJpZXZlRW5kT2ZQb3RlbnRpYWxFeHRlbmRlZERpbWVuc2lvbnMoaW50IGluaXRpYWxpemVyRW5kLCBpbnQgbmFtZUVuZCwgaW50IGVuZCkgeworCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhpbml0aWFsaXplckVuZCwgZW5kKTsKKwkJYm9vbGVhbiBoYXNUb2tlbnMgPSBmYWxzZTsKKwkJaW50IGJhbGFuY2UgPSAwOworCQlpbnQgcG9zID0gaW5pdGlhbGl6ZXJFbmQgPiBuYW1lRW5kID8gaW5pdGlhbGl6ZXJFbmQgLSAxIDogbmFtZUVuZDsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCWludCBiYWxhbmNlID0gMDsKIAkJCXdoaWxlICgodG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgeworCQkJCWhhc1Rva2VucyA9IHRydWU7CiAJCQkJc3dpdGNoKHRva2VuKSB7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0tFVCA6CiAJCQkJCQliYWxhbmNlKys7CiAJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0tFVCA6CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFIDoKIAkJCQkJCWJhbGFuY2UgLS07CisJCQkJCQlwb3MgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BIDoKLQkJCQkJCWlmIChiYWxhbmNlID09IDApIHJldHVybiB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CisJCQkJCQlpZiAoYmFsYW5jZSA9PSAwKSByZXR1cm4gcG9zOworCQkJCQkJLy8gY2FzZSB3aGVyZSBhIG1pc3NpbmcgY2xvc2luZyBicmFjZSBkb2Vzbid0IGNsb3NlIGFuIGFycmF5IGluaXRpYWxpemVyCisJCQkJCQlwb3MgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiA6Ci0JCQkJCQlyZXR1cm4gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxOworCQkJCQkJaWYgKGJhbGFuY2UgPT0gMCkgcmV0dXJuIHBvczsKKwkJCQkJCXJldHVybiAtcG9zOwogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCX0KLQkJcmV0dXJuIC0xOworCQkvLyBubyB0b2tlbiwgd2Ugc2ltcGx5IHJldHVybiBwb3MgYXMgdGhlIHJpZ2h0IHBvc2l0aW9uCisJCXJldHVybiBoYXNUb2tlbnMgPyBJbnRlZ2VyLk1JTl9WQUxVRSA6IHBvczsKIAl9CiAKIAlwcm90ZWN0ZWQgaW50IHJldHJpZXZlUHJvcGVyUmlnaHRCcmFja2V0UG9zaXRpb24oaW50IGJyYWNrZXROdW1iZXIsIGludCBzdGFydCkgewpAQCAtNDIzOSw3ICs0Mjk5LDcgQEAKIAkJfQogCQlyZXR1cm4gLTE7CiAJfQotCQorCiAJLyoqCiAJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHJpZ2h0IGJyYWNrZXQuCiAJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQpAQCAtNDI0OCwxMCArNDMwOCwxNiBAQAogCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKKwkJCWludCBiYWxhbmNlID0gMDsKIAkJCXdoaWxlICgodG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUOgotCQkJCQkJcmV0dXJuIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDS0VUIDoKKwkJCQkJCWJhbGFuY2UrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUIDoKKwkJCQkJCWJhbGFuY2UtLTsKKwkJCQkJCWlmIChiYWxhbmNlID09IDApIHJldHVybiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewpAQCAtNDI5OSw3ICs0MzY1LDcgQEAKIAkJfQogCQlyZXR1cm4gLTE7CiAJfQotCQorCiAJcHVibGljIHZvaWQgc2V0QVNUKEFTVCBhc3QpIHsKIAkJdGhpcy5hc3QgPSBhc3Q7CiAJCXRoaXMuZG9jUGFyc2VyID0gbmV3IERvY0NvbW1lbnRQYXJzZXIodGhpcy5hc3QsIHRoaXMuc2Nhbm5lciwgdGhpcy5pbnNpZGVDb21tZW50cyk7CkBAIC00MzA3LDE4ICs0MzczLDE5IEBACiAKIAlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQpOwotCQl0aGlzLnNldE1vZGlmaWVycyh0eXBlRGVjbCwgdHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKwkJdGhpcy5zZXRNb2RpZmllcnModHlwZURlY2wsIHR5cGVEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2wsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24pIHsKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8oYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KTsKLQkJdGhpcy5zZXRNb2RpZmllcnMoYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsLCBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKwkJdGhpcy5zZXRNb2RpZmllcnMoYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsLCBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmFubm90YXRpb25zLCBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KTsKIAl9CiAKIAkvKioKIAkgKiBAcGFyYW0gYm9keURlY2xhcmF0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisJcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBpbnQgbW9kaWZpZXJzRW5kKSB7CisJCXRoaXMuc2Nhbm5lci50b2tlbml6ZVdoaXRlU3BhY2UgPSBmYWxzZTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKIAkJCWludCBpbmRleEluQW5ub3RhdGlvbnMgPSAwOwpAQCAtNDM2Myw3ICs0NDMwLDcgQEAKIAkJCQkJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsICYmIGluZGV4SW5Bbm5vdGF0aW9ucyA8IGFubm90YXRpb25zLmxlbmd0aCkgewogCQkJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaW5kZXhJbkFubm90YXRpb25zKytdOwogCQkJCQkJCW1vZGlmaWVyID0gY29udmVydChhbm5vdGF0aW9uKTsKLQkJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhhbm5vdGF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMSwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2VMZW5ndGgpOworCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxLCBtb2RpZmllcnNFbmQpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6CkBAIC00MzcxLDcgKzQ0MzgsOCBAQAogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQyA6CiAJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlyZXR1cm47CisJCQkJCQkvLyB0aGVyZSBpcyBzb21lIHN5bnRheCBlcnJvcnMgaW4gc291cmNlIGNvZGUKKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlpZiAobW9kaWZpZXIgIT0gbnVsbCkgewogCQkJCQlib2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCkuYWRkKG1vZGlmaWVyKTsKQEAgLTQzODEsMTMgKzQ0NDksMTIgQEAKIAkJCS8vIGlnbm9yZQogCQl9CiAJfQotCQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbjIpIHsKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8oZW51bURlY2xhcmF0aW9uMi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBlbnVtRGVjbGFyYXRpb24yLnNvdXJjZVN0YXJ0KTsKLQkJdGhpcy5zZXRNb2RpZmllcnMoZW51bURlY2xhcmF0aW9uLCBlbnVtRGVjbGFyYXRpb24yLmFubm90YXRpb25zKTsKKwkJdGhpcy5zZXRNb2RpZmllcnMoZW51bURlY2xhcmF0aW9uLCBlbnVtRGVjbGFyYXRpb24yLmFubm90YXRpb25zLCBlbnVtRGVjbGFyYXRpb24yLnNvdXJjZVN0YXJ0KTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uKSB7CiAJCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgewogCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CkBAIC00Mzk2LDEyICs0NDYzLDEyIEBACiAJCQkJCWVudW1Db25zdGFudERlY2xhcmF0aW9uLnNldEZsYWdzKGVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSBBU1QuSkxTMyA6CisJCQlkZWZhdWx0IDoKIAkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQpOwotCQkJCXRoaXMuc2V0TW9kaWZpZXJzKGVudW1Db25zdGFudERlY2xhcmF0aW9uLCBmaWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKwkJCQl0aGlzLnNldE1vZGlmaWVycyhlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiwgZmllbGREZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAcGFyYW0gZmllbGREZWNsYXJhdGlvbgogCSAqIEBwYXJhbSBmaWVsZERlY2wKQEAgLTQ0MTQsMjcgKzQ0ODEsMjcgQEAKIAkJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRGbGFncyhmaWVsZERlY2xhcmF0aW9uLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSBBU1QuSkxTMyA6CisJCQlkZWZhdWx0IDoKIAkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhmaWVsZERlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgZmllbGREZWNsLnNvdXJjZVN0YXJ0KTsKLQkJCQl0aGlzLnNldE1vZGlmaWVycyhmaWVsZERlY2xhcmF0aW9uLCBmaWVsZERlY2wuYW5ub3RhdGlvbnMpOworCQkJCXRoaXMuc2V0TW9kaWZpZXJzKGZpZWxkRGVjbGFyYXRpb24sIGZpZWxkRGVjbC5hbm5vdGF0aW9ucywgZmllbGREZWNsLnNvdXJjZVN0YXJ0KTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEBwYXJhbSBpbml0aWFsaXplcgogCSAqIEBwYXJhbSBvbGRJbml0aWFsaXplcgogCSAqLwogCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycyhJbml0aWFsaXplciBpbml0aWFsaXplciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplciBvbGRJbml0aWFsaXplcikgewogCQlzd2l0Y2godGhpcy5hc3QuYXBpTGV2ZWwpIHsKLQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUw6IAorCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTDoKIAkJCQlpbml0aWFsaXplci5pbnRlcm5hbFNldE1vZGlmaWVycyhvbGRJbml0aWFsaXplci5tb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnKTsKIAkJCQlpZiAob2xkSW5pdGlhbGl6ZXIuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkJCQlpbml0aWFsaXplci5zZXRGbGFncyhpbml0aWFsaXplci5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWNhc2UgQVNULkpMUzMgOgorCQkJZGVmYXVsdCA6CiAJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8ob2xkSW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgb2xkSW5pdGlhbGl6ZXIuYm9keVN0YXJ0KTsKLQkJCQl0aGlzLnNldE1vZGlmaWVycyhpbml0aWFsaXplciwgb2xkSW5pdGlhbGl6ZXIuYW5ub3RhdGlvbnMpOworCQkJCXRoaXMuc2V0TW9kaWZpZXJzKGluaXRpYWxpemVyLCBvbGRJbml0aWFsaXplci5hbm5vdGF0aW9ucywgb2xkSW5pdGlhbGl6ZXIuYm9keVN0YXJ0KTsKIAkJfQogCX0KIAkvKioKQEAgLTQ0NDksOSArNDUxNiw5IEBACiAJCQkJCW1ldGhvZERlY2wuc2V0RmxhZ3MobWV0aG9kRGVjbC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWNhc2UgQVNULkpMUzMgOgorCQkJZGVmYXVsdCA6CiAJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8obWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQpOwotCQkJCXRoaXMuc2V0TW9kaWZpZXJzKG1ldGhvZERlY2wsIG1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKwkJCQl0aGlzLnNldE1vZGlmaWVycyhtZXRob2REZWNsLCBtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgbWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQpOwogCQl9CiAJfQogCkBAIC00NDY3LDcgKzQ1MzQsNyBAQAogCQkJCQl2YXJpYWJsZURlY2wuc2V0RmxhZ3ModmFyaWFibGVEZWNsLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSBBU1QuSkxTMyA6CisJCQlkZWZhdWx0IDoKIAkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBhcmd1bWVudC5zb3VyY2VTdGFydCk7CiAJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBhcmd1bWVudC5hbm5vdGF0aW9uczsKIAkJCQlpbnQgaW5kZXhJbkFubm90YXRpb25zID0gMDsKQEAgLTQ1MzMsNyArNDYwMCw3IEBACiAJCQkJfQogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGVEZWNsLCBMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24pIHsKIAkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7CiAJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgpAQCAtNDU0Miw3ICs0NjA5LDcgQEAKIAkJCQl2YXJpYWJsZURlY2wuc2V0RmxhZ3ModmFyaWFibGVEZWNsLmdldEZsYWdzKCkgfCBBU1ROb2RlLk1BTEZPUk1FRCk7CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSBBU1QuSkxTMyA6CisJCWRlZmF1bHQgOgogCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8obG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KTsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbG9jYWxEZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKIAkJCWludCBpbmRleEluQW5ub3RhdGlvbnMgPSAwOwpAQCAtNDYxNCw3ICs0NjgxLDcgQEAKIAkgKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXN3aXRjaCh0aGlzLmFzdC5hcGlMZXZlbCkgeyAKKwkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKSB7CiAJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQlpbnQgbW9kaWZpZXJzID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKIAkJCQltb2RpZmllcnMgJj0gfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NJbnRlcmZhY2U7IC8vIHJlbW92ZSBBY2NJbnRlcmZhY2UgZmxhZ3MKQEAgLTQ2MjQsMTIgKzQ2OTEsMTIgQEAKIAkJCQkJdHlwZURlY2wuc2V0RmxhZ3ModHlwZURlY2wuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEFTVC5KTFMzIDoKKwkJCWRlZmF1bHQgOgogCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQpOwotCQkJCXRoaXMuc2V0TW9kaWZpZXJzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOworCQkJCXRoaXMuc2V0TW9kaWZpZXJzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAcGFyYW0gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KIAkgKiBAcGFyYW0gbG9jYWxEZWNsYXJhdGlvbgpAQCAtNDY0NCw3ICs0NzExLDcgQEAKIAkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0RmxhZ3ModmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuTUFMRk9STUVEKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIEFTVC5KTFMzIDoKKwkJCWRlZmF1bHQgOgogCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCk7CiAJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBsb2NhbERlY2xhcmF0aW9uLmFubm90YXRpb25zOwogCQkJCWludCBpbmRleEluQW5ub3RhdGlvbnMgPSAwOwpAQCAtNDcwOCw3ICs0Nzc1LDcgQEAKIAkJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CiAJCQkJCS8vIGlnbm9yZQogCQkJCX0KLQkJfQkJCisJCX0KIAl9CiAKIAkvKioKQEAgLTQ3MjUsNyArNDc5Miw3IEBACiAJCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0RmxhZ3ModmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRGbGFncygpIHwgQVNUTm9kZS5NQUxGT1JNRUQpOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWNhc2UgQVNULkpMUzMgOgorCQkJZGVmYXVsdCA6CiAJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8obG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0KTsKIAkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGxvY2FsRGVjbGFyYXRpb24uYW5ub3RhdGlvbnM7CiAJCQkJaW50IGluZGV4SW5Bbm5vdGF0aW9ucyA9IDA7CkBAIC00Nzg5LDcgKzQ4NTYsNyBAQAogCQkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJCQkJLy8gaWdub3JlCiAJCQkJfQotCQl9CQkJCQorCQl9CiAJfQogCiAJcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgc2V0UXVhbGlmaWVkTmFtZU5hbWVBbmRTb3VyY2VSYW5nZXMoY2hhcltdW10gdHlwZU5hbWUsIGxvbmdbXSBwb3NpdGlvbnMsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlKSB7CkBAIC00ODM2LDcgKzQ5MDMsNyBAQAogCQkJcXVhbGlmaWVkTmFtZS5zZXRTb3VyY2VSYW5nZShzdGFydDAsIGVuZCAtIHN0YXJ0MCArIDEpOwogCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQkJcmVjb3JkTm9kZXMocXVhbGlmaWVkTmFtZSwgbm9kZSk7Ci0JCQkJcmVjb3JkTm9kZXMobmV3UGFydCwgbm9kZSk7CQkJCQorCQkJCXJlY29yZE5vZGVzKG5ld1BhcnQsIG5vZGUpOwogCQkJCXJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKHF1YWxpZmllZE5hbWUpOwogCQkJCXJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKG5ld1BhcnQpOwogCQkJfQpAQCAtNDg0OCw3ICs0OTE1LDcgQEAKIAkJfQogCQlyZXR1cm4gbmFtZTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgUXVhbGlmaWVkTmFtZSBzZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyhjaGFyW11bXSB0eXBlTmFtZSwgbG9uZ1tdIHBvc2l0aW9ucywgaW50IGVuZGluZ0luZGV4LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgbm9kZSkgewogIAkJaW50IGxlbmd0aCA9IGVuZGluZ0luZGV4ICsgMTsKIAkJZmluYWwgU2ltcGxlTmFtZSBmaXJzdFRva2VuID0gbmV3IFNpbXBsZU5hbWUodGhpcy5hc3QpOwpAQCAtNDg5Myw3ICs0OTYwLDcgQEAKIAkJCXF1YWxpZmllZE5hbWUuc2V0U291cmNlUmFuZ2Uoc3RhcnQwLCBlbmQgLSBzdGFydDAgKyAxKTsKIAkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJCXJlY29yZE5vZGVzKHF1YWxpZmllZE5hbWUsIG5vZGUpOwotCQkJCXJlY29yZE5vZGVzKG5ld1BhcnQsIG5vZGUpOwkJCQkKKwkJCQlyZWNvcmROb2RlcyhuZXdQYXJ0LCBub2RlKTsKIAkJCQlyZWNvcmRQZW5kaW5nTmFtZVNjb3BlUmVzb2x1dGlvbihxdWFsaWZpZWROYW1lKTsKIAkJCQlyZWNvcmRQZW5kaW5nTmFtZVNjb3BlUmVzb2x1dGlvbihuZXdQYXJ0KTsKIAkJCX0KQEAgLTQ5MDQsNyArNDk3MSw3IEBACiAgICAgICAgIH0KIAkJcmV0dXJuIHF1YWxpZmllZE5hbWU7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0VHlwZU5hbWVGb3JBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbiBjb21waWxlckFubm90YXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewogCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBjb21waWxlckFubm90YXRpb24udHlwZTsKIAkJaWYgKHR5cGVSZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CkBAIC00OTI3LDcgKzQ5OTQsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0VHlwZUZvckZpZWxkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKIAkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKIAkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKQEAgLTQ5NjgsNyArNTAzNSw3IEBACiAJCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUodHlwZSk7CiAJCX0KIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlRm9yTWV0aG9kRGVjbGFyYXRpb24oTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIFR5cGUgdHlwZSwgaW50IGV4dHJhRGltZW5zaW9uKSB7CiAJCWlmIChleHRyYURpbWVuc2lvbiAhPSAwKSB7CiAJCQlpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7CkBAIC00OTg0LDcgKzUwNTEsNyBAQAogCQkJCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CiAJCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24uaW50ZXJuYWxTZXRSZXR1cm5UeXBlKGVsZW1lbnRUeXBlKTsKIAkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQkJZGVmYXVsdCA6CiAJCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UmV0dXJuVHlwZTIoZWxlbWVudFR5cGUpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTUwMDUsNyArNTA3Miw3IEBACiAJCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJCQltZXRob2REZWNsYXJhdGlvbi5pbnRlcm5hbFNldFJldHVyblR5cGUoc3ViYXJyYXlUeXBlKTsKIAkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCQkJZGVmYXVsdCA6CiAJCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UmV0dXJuVHlwZTIoc3ViYXJyYXlUeXBlKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC01MDE2LDcgKzUwODMsNyBAQAogCQkJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMIDoKIAkJCQkJCW1ldGhvZERlY2xhcmF0aW9uLmludGVybmFsU2V0UmV0dXJuVHlwZSh0eXBlKTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQkJZGVmYXVsdCA6CiAJCQkJCQltZXRob2REZWNsYXJhdGlvbi5zZXRSZXR1cm5UeXBlMih0eXBlKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtNTAyNiwxMyArNTA5MywxMyBAQAogCQkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgogCQkJCQltZXRob2REZWNsYXJhdGlvbi5pbnRlcm5hbFNldFJldHVyblR5cGUodHlwZSk7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgQVNULkpMUzMgOgorCQkJCWRlZmF1bHQgOgogCQkJCQltZXRob2REZWNsYXJhdGlvbi5zZXRSZXR1cm5UeXBlMih0eXBlKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIHNldFR5cGVGb3JNZXRob2REZWNsYXJhdGlvbihBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24sIFR5cGUgdHlwZSwgaW50IGV4dHJhRGltZW5zaW9uKSB7CiAJCWFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uc2V0VHlwZSh0eXBlKTsKIAl9CkBAIC01MTU3LDcgKzUyMjQsNyBAQAogCQkJCWN1cnJlbnRDb21wb25lbnRUeXBlLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCByaWdodEJyYWNrZXRFbmRQb3NpdGlvbiAtIHN0YXJ0ICsgMSk7CiAJCQkJY3VycmVudENvbXBvbmVudFR5cGUgPSAoKEFycmF5VHlwZSkgY3VycmVudENvbXBvbmVudFR5cGUpLmdldENvbXBvbmVudFR5cGUoKTsKIAkJCQlzZWFyY2hlZERpbWVuc2lvbi0tOwotCQkJfQkJCisJCQl9CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE1hdGNoZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUTWF0Y2hlci5qYXZhCmluZGV4IDEzNzU3OGYuLjMxYWQzMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUTWF0Y2hlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUTWF0Y2hlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDggKzE2LDggQEAKIC8qKgogICogQ29uY3JldGUgc3VwZXJjbGFzcyBhbmQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhbiBBU1Qgc3VidHJlZSBtYXRjaGVyLgogICogPHA+Ci0gKiBGb3IgZXhhbXBsZSwgdG8gY29tcHV0ZSB3aGV0aGVyIHR3byBBU1RzIHN1YnRyZWVzIGFyZSBzdHJ1Y3R1cmFsbHkgCi0gKiBpc29tb3JwaGljLCB1c2UgPGNvZGU+bjEuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG4yKTwvY29kZT4gd2hlcmUgCisgKiBGb3IgZXhhbXBsZSwgdG8gY29tcHV0ZSB3aGV0aGVyIHR3byBBU1RzIHN1YnRyZWVzIGFyZSBzdHJ1Y3R1cmFsbHkKKyAqIGlzb21vcnBoaWMsIHVzZSA8Y29kZT5uMS5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbjIpPC9jb2RlPiB3aGVyZQogICogPGNvZGU+bjE8L2NvZGU+IGFuZCA8Y29kZT5uMjwvY29kZT4gYXJlIHRoZSBBU1Qgcm9vdCBub2RlcyBvZiB0aGUgc3VidHJlZXMuCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTI2LDM2ICsyNiwzNiBAQAogICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBub2RlIGFnYWluc3QgYW5vdGhlciBvYmplY3QgKHR5cGljYWxseSBhbm90aGVyCiAgKiBBU1Qgbm9kZSwgYWx0aG91Z2ggdGhpcyBpcyBub3QgZXNzZW50aWFsKS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCiAgKiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlCi0gKiBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYyBjaGlsZCBzdWJ0cmVlcy4gRm9yIG5vZGVzIHdpdGggCisgKiBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYyBjaGlsZCBzdWJ0cmVlcy4gRm9yIG5vZGVzIHdpdGgKICAqIGxpc3QtdmFsdWVkIHByb3BlcnRpZXMsIHRoZSBjaGlsZCBub2RlcyB3aXRoaW4gdGhlIGxpc3QgYXJlIGNvbXBhcmVkIGluCiAgKiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzIGFyZSBjb21wYXJlZAogICogaW4gdGhlIG9yZGVyIHRoYXQgbW9zdCBjbG9zZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSBsZXhpY2FsIHJlYWRpbmcgb3JkZXIKLSAqIG9mIHRoZSBzb3VyY2UgcHJvZ3JhbS4gRm9yIGluc3RhbmNlLCBmb3IgYSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUsIHRoZSAKLSAqIGNoaWxkIG9yZGVyaW5nIGlzOiBuYW1lLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMsIGFuZCBib2R5IAorICogb2YgdGhlIHNvdXJjZSBwcm9ncmFtLiBGb3IgaW5zdGFuY2UsIGZvciBhIHR5cGUgZGVjbGFyYXRpb24gbm9kZSwgdGhlCisgKiBjaGlsZCBvcmRlcmluZyBpczogbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzLCBhbmQgYm9keQogICogZGVjbGFyYXRpb25zLgogICogPC9wPgogICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSAoZXh0ZW5kIG9yIHJlaW1wbGVtZW50KSBzb21lIG9yIGFsbCBvZiB0aGUgCisgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSAoZXh0ZW5kIG9yIHJlaW1wbGVtZW50KSBzb21lIG9yIGFsbCBvZiB0aGUKICAqIDxjb2RlPm1hdGNoPC9jb2RlPiBtZXRob2RzIGluIG9yZGVyIHRvIGRlZmluZSBtb3JlIHNwZWNpYWxpemVkIHN1YnRyZWUKICAqIG1hdGNoZXJzLgogICogPC9wPgotICogCisgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciwgT2JqZWN0KQogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgQVNUTWF0Y2hlciB7Ci0JCisKIAkvKioKIAkgKiBJbmRpY2F0ZXMgd2hldGhlciBkb2MgdGFncyBzaG91bGQgYmUgbWF0Y2hlZC4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBib29sZWFuIG1hdGNoRG9jVGFnczsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG1hdGNoZXIgaW5zdGFuY2UuCiAJICogPHA+CiAJICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgbWF0Y2hlciBpZ25vcmVzIHRhZwotCSAqIGVsZW1lbnRzIGJlbG93IGRvYyBjb21tZW50cyBieSBkZWZhdWx0LiBVc2UgCisJICogZWxlbWVudHMgYmVsb3cgZG9jIGNvbW1lbnRzIGJ5IGRlZmF1bHQuIFVzZQogCSAqIHtAbGluayAjQVNUTWF0Y2hlcihib29sZWFuKSBBU1RNYXRjaGVyKHRydWUpfQogCSAqIGZvciBhIG1hdGNoZXIgdGhhdCBjb21wYXJlcyBkb2MgdGFncyBieSBkZWZhdWx0LgogCSAqIDwvcD4KQEAgLTY2LDcgKzY2LDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG1hdGNoZXIgaW5zdGFuY2UuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWF0Y2hEb2NUYWdzIDxjb2RlPnRydWU8L2NvZGU+IGlmIGRvYyBjb21tZW50IHRhZ3MgYXJlCiAJICogdG8gYmUgY29tcGFyZWQgYnkgZGVmYXVsdCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2VlICNtYXRjaChKYXZhZG9jLE9iamVjdCkKQEAgLTgzLDEzICs4MywxMyBAQAogCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCB1c2VmdWwgZm9yIHdyaXRpbmcgcmVjdXJzaXZlCiAJICogc3VidHJlZSBtYXRjaGVycy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbGlzdDEgdGhlIGZpcnN0IGxpc3Qgb2YgQVNUIG5vZGVzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+QVNUTm9kZTwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFTVE5vZGV9KQogCSAqIEBwYXJhbSBsaXN0MiB0aGUgc2Vjb25kIGxpc3Qgb2YgQVNUIG5vZGVzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+QVNUTm9kZTwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFTVE5vZGV9KQogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpc3RzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzCi0JICogICAgYW5kIG1hdGNoIHBhaXItd2lzZSBhY2NvcmRpbmcgdG8gPGNvZGU+QVNUTm9kZS5zdWJ0cmVlTWF0Y2g8L2NvZGU+IAorCSAqICAgIGFuZCBtYXRjaCBwYWlyLXdpc2UgYWNjb3JkaW5nIHRvIHtAbGluayBBU1ROb2RlI3N1YnRyZWVNYXRjaChBU1RNYXRjaGVyLCBPYmplY3QpIEFTVE5vZGUuc3VidHJlZU1hdGNofQogCSAqIEBzZWUgQVNUTm9kZSNzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gc2FmZVN1YnRyZWVMaXN0TWF0Y2goTGlzdCBsaXN0MSwgTGlzdCBsaXN0MikgewpAQCAtMTE3LDEzICsxMTcsMTMgQEAKIAkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgdXNlZnVsIGZvciB3cml0aW5nIHJlY3Vyc2l2ZQogCSAqIHN1YnRyZWUgbWF0Y2hlcnMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUxIHRoZSBmaXJzdCBBU1Qgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT47IG11c3QgYmUgYW4KIAkgKiAgICBpbnN0YW5jZSBvZiA8Y29kZT5BU1ROb2RlPC9jb2RlPgogCSAqIEBwYXJhbSBub2RlMiB0aGUgc2Vjb25kIEFTVCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPjsgbXVzdCBiZSBhbgogCSAqICAgIGluc3RhbmNlIG9mIDxjb2RlPkFTVE5vZGU8L2NvZGU+CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZXMgbWF0Y2ggYWNjb3JkaW5nCi0JICogICAgdG8gPGNvZGU+QVNULnN1YnRyZWVNYXRjaDwvY29kZT4gb3IgYm90aCBhcmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCAKKwkgKiAgICB0byA8Y29kZT5BU1Quc3VidHJlZU1hdGNoPC9jb2RlPiBvciBib3RoIGFyZSA8Y29kZT5udWxsPC9jb2RlPiwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzZWUgQVNUTm9kZSNzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciwgT2JqZWN0KQogCSAqLwpAQCAtMTQyLDExICsxNDIsMTEgQEAKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdHMgYXJlIGVxdWFsIGFjY29yZGluZyB0bwogCSAqIDxjb2RlPmVxdWFsczwvY29kZT4uIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGVpdGhlcgogCSAqIG5vZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbzEgdGhlIGZpcnN0IG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAcGFyYW0gbzIgdGhlIHNlY29uZCBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZXMgYXJlIGVxdWFsIGFjY29yZGluZyB0bwotCSAqICAgIDxjb2RlPmVxdWFsczwvY29kZT4gb3IgYm90aCA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIAorCSAqICAgIDxjb2RlPmVxdWFsczwvY29kZT4gb3IgYm90aCA8Y29kZT5udWxsPC9jb2RlPiwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlRXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CkBAIC0xNjYsMTAgKzE2NiwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0xOTMsMTAgKzE5MywxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0yMjEsMTAgKzIyMSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTI0MywxMCArMjQzLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMjY3LDEwICsyNjcsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0yOTIsMTAgKzI5MiwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTMxNCwxMCArMzE0LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMzM2LDEwICszMzYsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0zNjAsMTAgKzM2MCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTM4NSwxMCArMzg1LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNDEyLDEwICs0MTIsMTAgQEAKIAkgKiBvbmx5IGJlIGNhbGxlZCBpZiBhIGNsaWVudCBnb2VzIG91dCBvZiB0aGVpciB3YXkgdG8gdmlzaXQgdGhpcwogCSAqIGtpbmQgb2Ygbm9kZSBleHBsaWNpdGx5LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjAKQEAgLTQzNCwxMCArNDM0LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNDU2LDEwICs0NTYsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC00NzgsMTAgKzQ3OCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTUwMiwxMCArNTAyLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNTI2LDEwICs1MjYsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC01NDgsMTAgKzU0OCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTU3NCw3ICs1NzQsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJfQotCQlyZXR1cm4gCisJCXJldHVybgogCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpCiAJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5hcmd1bWVudHMoKSwgby5hcmd1bWVudHMoKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKApAQCAtNTg5LDEwICs1ODksMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC02MTQsMTAgKzYxNCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTYzOSwxMCArNjM5LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNjY2LDEwICs2NjYsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC02ODgsMTAgKzY4OCwzNiBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChVbmlvblR5cGUgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgVW5pb25UeXBlKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVVuaW9uVHlwZSBvID0gKFVuaW9uVHlwZSkgb3RoZXI7CisJCXJldHVybgorCQkJc2FmZVN1YnRyZWVMaXN0TWF0Y2goCisJCQkJbm9kZS50eXBlcygpLAorCQkJCW8udHlwZXMoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNzA0LDcgKzczMCw3IEBACiAJCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0RXhwcmVzc2lvbigpLCBvLmdldEV4cHJlc3Npb24oKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KIAkgKiA8cD4KQEAgLTcxMiwxMCArNzM4LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtNzMzLDEwICs3NTksMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtNzU5LDEwICs3ODUsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtNzgxLDcgKzgwNyw3IEBACiAJCQkJCW5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpLAogCQkJCQlvLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KIAkgKiA8cD4KQEAgLTc4OSwxMCArODE1LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjEKQEAgLTgxMiw3ICs4MzgsNyBAQAogCQkJCQlub2RlLmJvZHlEZWNsYXJhdGlvbnMoKSwKIAkJCQkJby5ib2R5RGVjbGFyYXRpb25zKCkpKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCiAJICogPHA+CkBAIC04MjAsMTAgKzg0NiwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTg0MiwxMCArODY4LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtODY2LDEwICs4OTIsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC04ODksNyArOTE1LDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRKYXZhZG9jKCksIG8uZ2V0SmF2YWRvYygpKQogCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGUoKSwgby5nZXRUeXBlKCkpCiAJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmZyYWdtZW50cygpLCBvLmZyYWdtZW50cygpKTsKQEAgLTkwMiwxMCArOTI4LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtOTI4LDEwICs5NTQsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC05NTMsMTAgKzk3OSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTk4MiwxMCArMTAwOCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTEwMTYsMTAgKzEwNDIsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xMDQwLDEwICsxMDY2LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTA3MywyMiArMTA5OSwyMiBAQAogCSAqIDxwPgogCSAqIFVubGlrZSBvdGhlciBub2RlIHR5cGVzLCB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQKIAkgKiBpbXBsZW1lbnRhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGEgY29uc3RydWN0b3Itc3VwcGxpZWQKLQkgKiBwYXJhbWV0ZXIgIHtAbGluayAjQVNUTWF0Y2hlcihib29sZWFuKSBBU1RNYXRjaGVyKGJvb2xlYW4pfSAKLQkgKiB3aGljaCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IHNwZWNpZmllZC4gCisJICogcGFyYW1ldGVyICB7QGxpbmsgI0FTVE1hdGNoZXIoYm9vbGVhbikgQVNUTWF0Y2hlcihib29sZWFuKX0KKwkgKiB3aGljaCBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90IHNwZWNpZmllZC4KIAkgKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgaW1wbGVtZW50YXRpb24KIAkgKiB0ZXN0cyB3aGV0aGVyIHRoZSBvdGhlciBvYmplY3QgaXMgYWxzbyBhIDxjb2RlPkphdmFkb2M8L2NvZGU+Ci0JICogd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYyBjaGlsZCBzdWJ0cmVlczsgdGhlIGNvbW1lbnQgc3RyaW5nIAorCSAqIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMgY2hpbGQgc3VidHJlZXM7IHRoZSBjb21tZW50IHN0cmluZwogCSAqICg8Y29kZT5KYXZhZG9jLmdldENvbW1lbnQoKTwvY29kZT4pIGlzIGlnbm9yZWQuCiAJICogQ29udmVyc2VseSwgd2hlbiB0aGUgcGFyYW1ldGVyIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlCiAJICogaW1wbGVtZW50YXRpb24gdGVzdHMgd2hldGhlciB0aGUgb3RoZXIgb2JqZWN0IGlzIGFsc28gYQotCSAqIDxjb2RlPkphdmFkb2M8L2NvZGU+IHdpdGggZXhhY3RseSB0aGUgc2FtZSBjb21tZW50IHN0cmluZzsgCisJICogPGNvZGU+SmF2YWRvYzwvY29kZT4gd2l0aCBleGFjdGx5IHRoZSBzYW1lIGNvbW1lbnQgc3RyaW5nOwogCSAqIHRoZSB0YWcgZWxlbWVudHMgKHtAbGluayBKYXZhZG9jI3RhZ3MoKSBKYXZhZG9jLnRhZ3N9IGFyZQogCSAqIGlnbm9yZWQuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzZWUgI0FTVE1hdGNoZXIoKQpAQCAtMTEyNywxMCArMTE1MywxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTExNTYsMTAgKzExODIsMTAgQEAKIAkgKiBvbmx5IGJlIGNhbGxlZCBpZiBhIGNsaWVudCBnb2VzIG91dCBvZiB0aGVpciB3YXkgdG8gdmlzaXQgdGhpcwogCSAqIGtpbmQgb2Ygbm9kZSBleHBsaWNpdGx5LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjAKQEAgLTExNzAsNyArMTE5Niw3IEBACiAJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgogCSAqIDxwPgpAQCAtMTE3OCwxMCArMTIwNCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0xMjAxLDEwICsxMjI3LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjAKQEAgLTEyMTgsNyArMTI0NCw3IEBACiAJCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFF1YWxpZmllcigpLCBvLmdldFF1YWxpZmllcigpKQogCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKSk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgogCSAqIDxwPgpAQCAtMTIyNiwxMCArMTI1MiwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0xMjUwLDEwICsxMjc2LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjAKQEAgLTEyNzYsMTAgKzEzMDIsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMApAQCAtMTI5OSw3ICsxMzI1LDcgQEAKIAkJCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0VHlwZSgpLCBvLmdldFR5cGUoKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KIAkgKiA8cD4KQEAgLTEzMTUsMTAgKzEzNDEsMTAgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIG1ldGhvZCByZXR1cm4gdHlwZXMgYXJlIGNvbXBhcmVkIGV2ZW4gZm9yIGNvbnN0cnVjdG9yCiAJICogZGVjbGFyYXRpb25zLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTM2NSwxMCArMTM5MSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTEzOTUsMTAgKzE0MjEsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtMTQxOCwxMCArMTQ0NCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0xNDQyLDEwICsxNDY4LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTQ2MywxMCArMTQ4OSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE0ODUsMTAgKzE1MTEsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xNTE1LDEwICsxNTQxLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjEKQEAgLTE1MzksMTAgKzE1NjUsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xNTYxLDEwICsxNTg3LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTU4NSwxMCArMTYxMSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE2MDksMTAgKzE2MzUsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xNjMxLDEwICsxNjU3LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTY1NSwxMCArMTY4MSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4xCkBAIC0xNjgwLDEwICsxNzA2LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTcwMiwxMCArMTcyOCwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE3MjQsMTAgKzE3NTAsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xNzQ2LDEwICsxNzcyLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjEKQEAgLTE3NzEsMTMgKzE3OTcsMTMgQEAKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBhbmQgdGhlIHZhcmlhYmxlIGFyaXR5IGZsYWcgCisJICogTm90ZSB0aGF0IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgYW5kIHRoZSB2YXJpYWJsZSBhcml0eSBmbGFnCiAJICogYXJlIGNvbXBhcmVkIHNpbmNlIHRoZXkgYXJlIGJvdGggaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE4MDAsNyArMTgyNiw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCSAgICBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0VHlwZSgpLCBvLmdldFR5cGUoKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkKIAkgCQkJJiYgbm9kZS5nZXRFeHRyYURpbWVuc2lvbnMoKSA9PSBvLmdldEV4dHJhRGltZW5zaW9ucygpCkBAIC0xODE0LDEwICsxODQwLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTgzNiwxMCArMTg2MiwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE4NjUsMTAgKzE4OTEsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xODg5LDEwICsxOTE1LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTkxOSwxMCArMTk0NSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTE5NDEsMTAgKzE5NjcsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0xOTY1LDEwICsxOTkxLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMTk4OSwxMCArMjAxNSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4wCkBAIC0yMDE0LDEwICsyMDQwLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjAKQEAgLTIwMzcsMTAgKzIwNjMsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0yMDU5LDEwICsyMDg1LDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMjA4MSwxMCArMjEwNywxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTIwOTMsMTAgKzIxMTksMTkgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlUcnlTdGF0ZW1lbnQgbyA9IChUcnlTdGF0ZW1lbnQpIG90aGVyOworCQlzd2l0Y2gobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCkgeworCQkJY2FzZSBBU1QuSkxTMl9JTlRFUk5BTCA6CisJCQljYXNlIEFTVC5KTFMzIDoKKwkJCQlyZXR1cm4gKAorCQkJCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEJvZHkoKSwgby5nZXRCb2R5KCkpCisJCQkJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5jYXRjaENsYXVzZXMoKSwgby5jYXRjaENsYXVzZXMoKSkKKwkJCQkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0RmluYWxseSgpLCBvLmdldEZpbmFsbHkoKSkpOworCQl9CiAJCXJldHVybiAoCi0JCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkKLQkJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmNhdGNoQ2xhdXNlcygpLCBvLmNhdGNoQ2xhdXNlcygpKQotCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRGaW5hbGx5KCksIG8uZ2V0RmluYWxseSgpKSk7CisJCQlzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLnJlc291cmNlcygpLCBvLnJlc291cmNlcygpKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEJvZHkoKSwgby5nZXRCb2R5KCkpCisJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmNhdGNoQ2xhdXNlcygpLCBvLmNhdGNoQ2xhdXNlcygpKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEZpbmFsbHkoKSwgby5nZXRGaW5hbGx5KCkpKTsKIAl9CiAKIAkvKioKQEAgLTIxMDYsMTAgKzIxNDEsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0yMTU4LDEwICsyMTkzLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMjE4MCwxMCArMjIxNSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTIyMDIsMTAgKzIyMzcsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtMjIyNiwxMCArMjI2MSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTIyNjQsMTAgKzIyOTksMTAgQEAKIAkgKiBOb3RlIHRoYXQgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBhcmUgY29tcGFyZWQgc2luY2UgdGhleSBhcmUgYW4KIAkgKiBpbXBvcnRhbnQgcGFydCBvZiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCkBAIC0yMjg4LDEwICsyMzIzLDEwIEBACiAJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKIAkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQogCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwpAQCAtMjMyMiwxMCArMjM1NywxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvcgogCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKIAkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KQEAgLTIzNDYsMTAgKzIzODEsMTAgQEAKIAkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYwogCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCiAJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtMjM2Miw1ICsyMzk3LDUgQEAKIAkJcmV0dXJuIG5vZGUuaXNVcHBlckJvdW5kKCkgPT0gby5pc1VwcGVyQm91bmQoKQogCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm91bmQoKSwgby5nZXRCb3VuZCgpKTsKIAl9Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKaW5kZXggNDEyMGFkNy4uMDFmOTU2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNiArMTksOCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20uTmFpdmVBU1RGbGF0dGVuZXI7CisKIC8qKgogICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBhbGwgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkgbm9kZSB0eXBlcy4KICAqIDxwPgpAQCAtMzQsMTQgKzM2LDE0IEBACiAgKiA8cD4KICAqIFdoZW4gYW4gQVNUIG5vZGUgaXMgcGFydCBvZiBhbiBBU1QsIGl0IGhhcyBhIHVuaXF1ZSBwYXJlbnQgbm9kZS4KICAqIENsaWVudHMgY2FuIG5hdmlnYXRlIHVwd2FyZHMsIGZyb20gY2hpbGQgdG8gcGFyZW50LCBhcyB3ZWxsIGFzIGRvd253YXJkcywKLSAqIGZyb20gcGFyZW50IHRvIGNoaWxkLiBOZXdseSBjcmVhdGVkIG5vZGVzIGFyZSB1bnBhcmVudGVkLiBXaGVuIGFuIAotICogdW5wYXJlbnRlZCBub2RlIGlzIHNldCBhcyBhIGNoaWxkIG9mIGEgbm9kZSAodXNpbmcgYSAKKyAqIGZyb20gcGFyZW50IHRvIGNoaWxkLiBOZXdseSBjcmVhdGVkIG5vZGVzIGFyZSB1bnBhcmVudGVkLiBXaGVuIGFuCisgKiB1bnBhcmVudGVkIG5vZGUgaXMgc2V0IGFzIGEgY2hpbGQgb2YgYSBub2RlICh1c2luZyBhCiAgKiA8Y29kZT5zZXQ8aT5DSElMRDwvaT48L2NvZGU+IG1ldGhvZCksIGl0cyBwYXJlbnQgbGluayBpcyBzZXQgYXV0b21hdGljYWxseQogICogYW5kIHRoZSBwYXJlbnQgbGluayBvZiB0aGUgZm9ybWVyIGNoaWxkIGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KICAqIEZvciBub2RlcyB3aXRoIHByb3BlcnRpZXMgdGhhdCBpbmNsdWRlIGEgbGlzdCBvZiBjaGlsZHJlbiAoZm9yIGV4YW1wbGUsCiAgKiA8Y29kZT5CbG9jazwvY29kZT4gd2hvc2UgPGNvZGU+c3RhdGVtZW50czwvY29kZT4gcHJvcGVydHkgaXMgYSBsaXN0CiAgKiBvZiBzdGF0ZW1lbnRzKSwgYWRkaW5nIG9yIHJlbW92aW5nIGFuIGVsZW1lbnQgdG8vZm9yIHRoZSBsaXN0IHByb3BlcnR5Ci0gKiBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBhcmVudCBsaW5rcy4gVGhlc2UgbGlzdHMgc3VwcG9ydCB0aGUgCisgKiBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBhcmVudCBsaW5rcy4gVGhlc2UgbGlzdHMgc3VwcG9ydCB0aGUKICAqIDxjb2RlPkxpc3Quc2V0PC9jb2RlPiBtZXRob2Q7IGhvd2V2ZXIsIHRoZSBjb25zdHJhaW50IHRoYXQgdGhlIHNhbWUKICAqIG5vZGUgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSBtZWFucyB0aGF0IHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkCiAgKiB0byBzd2FwIGVsZW1lbnRzIHdpdGhvdXQgZmlyc3QgcmVtb3ZpbmcgdGhlIG5vZGUuCkBAIC01Myw3ICs1NSw3IEBACiAgKiA8cD4KICAqIEFTVHMgZG8gbm90IGNvbnRhaW4gImhvbGVzIiAobWlzc2luZyBzdWJ0cmVlcykuIElmIGEgbm9kZSBpcyByZXF1aXJlZCB0bwogICogaGF2ZSBhIGNlcnRhaW4gcHJvcGVydHksIGEgc3ludGFjdGljYWxseSBwbGF1c2libGUgaW5pdGlhbCB2YWx1ZSBpcwotICogYWx3YXlzIHN1cHBsaWVkLiAKKyAqIGFsd2F5cyBzdXBwbGllZC4KICAqIDwvcD4KICAqIDxwPgogICogVGhlIGhpZXJhcmNoeSBvZiBBU1Qgbm9kZSB0eXBlcyBoYXMgc29tZSBjb252ZW5pZW50IGdyb3VwaW5ncyBtYXJrZWQKQEAgLTg2LDcgKzg4LDcgQEAKICAqIDwvcD4KICAqIDxwPgogICogRWFjaCBBU1Qgbm9kZSBpcyBjYXBhYmxlIG9mIGNhcnJ5aW5nIGFuIG9wZW4tZW5kZWQgY29sbGVjdGlvbiBvZgotICogY2xpZW50LWRlZmluZWQgcHJvcGVydGllcy4gTmV3bHkgY3JlYXRlZCBub2RlcyBoYXZlIG5vbmUuIAorICogY2xpZW50LWRlZmluZWQgcHJvcGVydGllcy4gTmV3bHkgY3JlYXRlZCBub2RlcyBoYXZlIG5vbmUuCiAgKiA8Y29kZT5nZXRQcm9wZXJ0eTwvY29kZT4gYW5kIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBhcmUgdXNlZCB0byBhY2Nlc3MKICAqIHRoZXNlIHByb3BlcnRpZXMuCiAgKiA8L3A+CkBAIC05Niw1MDAgKzk4LDUwMiBAQAogICogZXhpc3Rpbmcgb25lcywgaXQgaXMgPGI+bm90PC9iPiBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkLCB2aXNpdCwKICAqIHdyaXRlLCBjcmVhdGUsIG9yIGNsb25lIDxlbT5hbnk8L2VtPiBvZiB0aGUgbm9kZXMgb24gdGhlIHNhbWUgQVNULgogICogV2hlbiBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQsIGNvbnNpZGVyIHVzaW5nIHRoZSBjb21tb24gQVNUCi0gKiBvYmplY3QgdGhhdCBvd25zIHRoZSBub2RlOyB0aGF0IGlzLCB1c2UgIAorICogb2JqZWN0IHRoYXQgb3ducyB0aGUgbm9kZTsgdGhhdCBpcywgdXNlCiAgKiA8Y29kZT5zeW5jaHJvbml6ZSAobm9kZS5nZXRBU1QoKSkgey4uLn08L2NvZGU+LgogICogPC9wPgogICogPHA+CiAgKiBBU1RzIGFsc28gc3VwcG9ydCB0aGUgdmlzaXRvciBwYXR0ZXJuOyBzZWUgdGhlIGNsYXNzIDxjb2RlPkFTVFZpc2l0b3I8L2NvZGU+Ci0gKiBmb3IgZGV0YWlscy4KKyAqIGZvciBkZXRhaWxzLiBUaGUgPGNvZGU+Tm9kZUZpbmRlcjwvY29kZT4gY2xhc3MgY2FuIGJlIHVzZWQgdG8gZmluZCBhIHNwZWNpZmljCisgKiBub2RlIGluc2lkZSBhIHRyZWUuCiAgKiA8L3A+CiAgKiA8cD4KICAqIENvbXBpbGF0aW9uIHVuaXRzIGNyZWF0ZWQgYnkgPGNvZGU+QVNUUGFyc2VyPC9jb2RlPiBmcm9tIGEKICAqIHNvdXJjZSBkb2N1bWVudCBjYW4gYmUgc2VyaWFsaXplZCBhZnRlciBhcmJpdHJhcnkgbW9kaWZpY2F0aW9ucwotICogd2l0aCBtaW5pbWFsIGxvc3Mgb2Ygb3JpZ2luYWwgZm9ybWF0dGluZy4gU2VlIAorICogd2l0aCBtaW5pbWFsIGxvc3Mgb2Ygb3JpZ2luYWwgZm9ybWF0dGluZy4gU2VlCiAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0I3JlY29yZE1vZGlmaWNhdGlvbnMoKX0gZm9yIGRldGFpbHMuCiAgKiBTZWUgYWxzbyB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZX0gZm9yCiAgKiBhbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZGVzY3JpYmUgYW5kIHNlcmlhbGl6ZSBjaGFuZ2VzIHRvIGEKICAqIHJlYWQtb25seSBBU1QuCiAgKiA8L3A+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiAKKyAqCiAgKiBAc2VlIEFTVFBhcnNlcgogICogQHNlZSBBU1RWaXNpdG9yCisgKiBAc2VlIE5vZGVGaW5kZXIKICAqIEBzaW5jZSAyLjAKKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU1ROb2RlIHsKIAkvKgogCSAqIElOU1RSVUNUSU9OUyBGT1IgQURESU5HIE5FVyBDT05DUkVURSBBU1QgTk9ERSBUWVBFUwotCSAqIAorCSAqCiAJICogVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjaGFuZ2VkIHdoZW4gYQogCSAqIG5ldyBjb25jcmV0ZSBBU1Qgbm9kZSB0eXBlIChjYWxsIGl0ICJGb29CYXIiKToKLQkgKiAKKwkgKgogCSAqIDEuIENyZWF0ZSB0aGUgRm9vQmFyIEFTVCBub2RlIHR5cGUgY2xhc3MuCiAJICogVGhlIG1vc3QgZWZmZWN0aXZlIHdheSB0byBkbyB0aGlzIGlzIHRvIGNvcHkgYSBzaW1pbGFyCiAJICogZXhpc3RpbmcgY29uY3JldGUgbm9kZSBjbGFzcyB0byBnZXQgYSB0ZW1wbGF0ZSB0aGF0CiAgICAgICogaW5jbHVkZXMgYWxsIHRoZSBmcmFtZXdvcmsgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQuCi0JICogCisJICoKIAkgKiAyLiBBZGQgbm9kZSB0eXBlIGNvbnN0YW50IEFTVE5vZGUuRk9PX0JBUi4KIAkgKiBOb2RlIGNvbnN0YW50cyBhcmUgbnVtYmVyZWQgY29uc2VjdXRpdmVseS4gQWRkIHRoZQogCSAqIGNvbnN0YW50IGFmdGVyIHRoZSBleGlzdGluZyBvbmVzLgotCSAqIAorCSAqCiAJICogMy4gQWRkIGVudHJ5IHRvIEFTVE5vZGUubm9kZUNsYXNzRm9yVHlwZShpbnQpLgotCSAqIAorCSAqCiAJICogNC4gQWRkIEFTVC5uZXdGb29CYXIoKSBmYWN0b3J5IG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIDUuIEFkZCBBU1RWaXNpdG9yLnZpc2l0KEZvb0JhcikgYW5kIGVuZFZpc2l0KEZvb0JhcikgbWV0aG9kcy4KLQkgKiAKKwkgKgogCSAqIDYuIEFkZCBBU1RNYXRjaGVyLm1hdGNoKEZvb0JhcixPYmplY3QpIG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIDcuIEVuc3VyZSB0aGF0IFNpbXBsZU5hbWUuaXNEZWNsYXJhdGlvbigpIGNvdmVycyBGb29CYXIKIAkgKiBub2RlcyBpZiByZXF1aXJlZC4KLQkgKiAKKwkgKgogCSAqIDguIEFkZCBOYWl2ZUFTVEZsYXR0ZW5lci52aXNpdChGb29CYXIpIG1ldGhvZCB0byBpbGx1c3RyYXRlCiAJICogaG93IHRoZXNlIG5vZGVzIHNob3VsZCBiZSBzZXJpYWxpemVkLgotCSAqIAorCSAqCiAJICogOS4gVXBkYXRlIHRoZSBBU1QgdGVzdCBzdWl0ZXMuCi0JICogCisJICoKIAkgKiBUaGUgbmV4dCBzdGVwcyBhcmUgdG8gdXBkYXRlIEFTVC5wYXJzZSogdG8gc3RhcnQgZ2VuZXJhdGluZwogCSAqIHRoZSBuZXcgdHlwZSBvZiBub2RlcywgYW5kIEFTVFJld3JpdGUgdG8gc2VyaWFsaXplIHRoZW0gYmFjayBvdXQuCiAJICovCi0JCisKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkFub255bW91c0NsYXNzRGVjbGFyYXRpb248L2NvZGU+LgogCSAqIEBzZWUgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA9IDE7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkFycmF5QWNjZXNzPC9jb2RlPi4KIAkgKiBAc2VlIEFycmF5QWNjZXNzCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfQUNDRVNTID0gMjsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+QXJyYXlDcmVhdGlvbjwvY29kZT4uCiAJICogQHNlZSBBcnJheUNyZWF0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfQ1JFQVRJT04gPSAzOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5BcnJheUluaXRpYWxpemVyPC9jb2RlPi4KIAkgKiBAc2VlIEFycmF5SW5pdGlhbGl6ZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9JTklUSUFMSVpFUiA9IDQ7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkFycmF5VHlwZTwvY29kZT4uCiAJICogQHNlZSBBcnJheVR5cGUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9UWVBFID0gNTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+QXNzZXJ0U3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIEFzc2VydFN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0VSVF9TVEFURU1FTlQgPSA2OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5Bc3NpZ25tZW50PC9jb2RlPi4KIAkgKiBAc2VlIEFzc2lnbm1lbnQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJR05NRU5UID0gNzsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+QmxvY2s8L2NvZGU+LgogCSAqIEBzZWUgQmxvY2sKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSyA9IDg7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkJvb2xlYW5MaXRlcmFsPC9jb2RlPi4KIAkgKiBAc2VlIEJvb2xlYW5MaXRlcmFsCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTl9MSVRFUkFMID0gOTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+QnJlYWtTdGF0ZW1lbnQ8L2NvZGU+LgogCSAqIEBzZWUgQnJlYWtTdGF0ZW1lbnQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkVBS19TVEFURU1FTlQgPSAxMDsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+Q2FzdEV4cHJlc3Npb248L2NvZGU+LgogCSAqIEBzZWUgQ2FzdEV4cHJlc3Npb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNUX0VYUFJFU1NJT04gPSAxMTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+Q2F0Y2hDbGF1c2U8L2NvZGU+LgogCSAqIEBzZWUgQ2F0Y2hDbGF1c2UKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVRDSF9DTEFVU0UgPSAxMjsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+Q2hhcmFjdGVyTGl0ZXJhbDwvY29kZT4uCiAJICogQHNlZSBDaGFyYWN0ZXJMaXRlcmFsCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUkFDVEVSX0xJVEVSQUwgPSAxMzsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+Q2xhc3NJbnN0YW5jZUNyZWF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIENsYXNzSW5zdGFuY2VDcmVhdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OID0gMTQ7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4uCiAJICogQHNlZSBDb21waWxhdGlvblVuaXQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QSUxBVElPTl9VTklUID0gMTU7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkNvbmRpdGlvbmFsRXhwcmVzc2lvbjwvY29kZT4uCiAJICogQHNlZSBDb25kaXRpb25hbEV4cHJlc3Npb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9FWFBSRVNTSU9OID0gMTY7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkNvbnN0cnVjdG9ySW52b2NhdGlvbjwvY29kZT4uCiAJICogQHNlZSBDb25zdHJ1Y3Rvckludm9jYXRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID0gMTc7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkNvbnRpbnVlU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIENvbnRpbnVlU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVElOVUVfU1RBVEVNRU5UID0gMTg7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkRvU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIERvU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fU1RBVEVNRU5UID0gMTk7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkVtcHR5U3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIEVtcHR5U3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfU1RBVEVNRU5UID0gMjA7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkV4cHJlc3Npb25TdGF0ZW1lbnQ8L2NvZGU+LgogCSAqIEBzZWUgRXhwcmVzc2lvblN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUFJFU1NJT05fU1RBVEVNRU5UID0gMjE7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPi4KIAkgKiBAc2VlIEZpZWxkQWNjZXNzCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfQUNDRVNTID0gMjI7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+LgogCSAqIEBzZWUgRmllbGREZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0RFQ0xBUkFUSU9OID0gMjM7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkZvclN0YXRlbWVudDwvY29kZT4uCiAJICogQHNlZSBGb3JTdGF0ZW1lbnQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JfU1RBVEVNRU5UID0gMjQ7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPklmU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIElmU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfU1RBVEVNRU5UID0gMjU7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkltcG9ydERlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIEltcG9ydERlY2xhcmF0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUX0RFQ0xBUkFUSU9OID0gMjY7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkluZml4RXhwcmVzc2lvbjwvY29kZT4uCiAJICogQHNlZSBJbmZpeEV4cHJlc3Npb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9FWFBSRVNTSU9OID0gMjc7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkluaXRpYWxpemVyPC9jb2RlPi4KIAkgKiBAc2VlIEluaXRpYWxpemVyCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaRVIgPSAyODsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+SmF2YWRvYzwvY29kZT4uCiAJICogQHNlZSBKYXZhZG9jCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQURPQyA9IDI5OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5MYWJlbGVkU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIExhYmVsZWRTdGF0ZW1lbnQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQUJFTEVEX1NUQVRFTUVOVCA9IDMwOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4uCiAJICogQHNlZSBNZXRob2REZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUNMQVJBVElPTiA9IDMxOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5NZXRob2RJbnZvY2F0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIE1ldGhvZEludm9jYXRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfSU5WT0NBVElPTiA9IDMyOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5OdWxsTGl0ZXJhbDwvY29kZT4uCiAJICogQHNlZSBOdWxsTGl0ZXJhbAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfTElURVJBTCA9IDMzOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5OdW1iZXJMaXRlcmFsPC9jb2RlPi4KIAkgKiBAc2VlIE51bWJlckxpdGVyYWwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfTElURVJBTCA9IDM0OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5QYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+LgogCSAqIEBzZWUgUGFja2FnZURlY2xhcmF0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9ERUNMQVJBVElPTiA9IDM1OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjwvY29kZT4uCiAJICogQHNlZSBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkVOVEhFU0laRURfRVhQUkVTU0lPTiA9IDM2OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5Qb3N0Zml4RXhwcmVzc2lvbjwvY29kZT4uCiAJICogQHNlZSBQb3N0Zml4RXhwcmVzc2lvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RGSVhfRVhQUkVTU0lPTiA9IDM3OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5QcmVmaXhFeHByZXNzaW9uPC9jb2RlPi4KIAkgKiBAc2VlIFByZWZpeEV4cHJlc3Npb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfRVhQUkVTU0lPTiA9IDM4OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5QcmltaXRpdmVUeXBlPC9jb2RlPi4KIAkgKiBAc2VlIFByaW1pdGl2ZVR5cGUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklNSVRJVkVfVFlQRSA9IDM5OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5RdWFsaWZpZWROYW1lPC9jb2RlPi4KIAkgKiBAc2VlIFF1YWxpZmllZE5hbWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSUZJRURfTkFNRSA9IDQwOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5SZXR1cm5TdGF0ZW1lbnQ8L2NvZGU+LgogCSAqIEBzZWUgUmV0dXJuU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX1NUQVRFTUVOVCA9IDQxOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5TaW1wbGVOYW1lPC9jb2RlPi4KIAkgKiBAc2VlIFNpbXBsZU5hbWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfTkFNRSA9IDQyOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5TaW1wbGVUeXBlPC9jb2RlPi4KIAkgKiBAc2VlIFNpbXBsZVR5cGUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfVFlQRSA9IDQzOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfVkFSSUFCTEVfREVDTEFSQVRJT04gPSA0NDsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+U3RyaW5nTGl0ZXJhbDwvY29kZT4uCiAJICogQHNlZSBTdHJpbmdMaXRlcmFsCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0xJVEVSQUwgPSA0NTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb248L2NvZGU+LgogCSAqIEBzZWUgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUl9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID0gNDY7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlN1cGVyRmllbGRBY2Nlc3M8L2NvZGU+LgogCSAqIEBzZWUgU3VwZXJGaWVsZEFjY2VzcwogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSX0ZJRUxEX0FDQ0VTUyA9IDQ3OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5TdXBlck1ldGhvZEludm9jYXRpb248L2NvZGU+LgogCSAqIEBzZWUgU3VwZXJNZXRob2RJbnZvY2F0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVJfTUVUSE9EX0lOVk9DQVRJT04gPSA0ODsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+U3dpdGNoQ2FzZTwvY29kZT4uCiAJICogQHNlZSBTd2l0Y2hDYXNlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX0NBU0UgPSA0OTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+U3dpdGNoU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFN3aXRjaFN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNXSVRDSF9TVEFURU1FTlQgPSA1MDsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+U3luY2hyb25pemVkU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFN5bmNocm9uaXplZFN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTkNIUk9OSVpFRF9TVEFURU1FTlQgPSA1MTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VGhpc0V4cHJlc3Npb248L2NvZGU+LgogCSAqIEBzZWUgVGhpc0V4cHJlc3Npb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSElTX0VYUFJFU1NJT04gPSA1MjsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VGhyb3dTdGF0ZW1lbnQ8L2NvZGU+LgogCSAqIEBzZWUgVGhyb3dTdGF0ZW1lbnQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJPV19TVEFURU1FTlQgPSA1MzsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VHJ5U3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFRyeVN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSWV9TVEFURU1FTlQgPSA1NDsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIFR5cGVEZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfREVDTEFSQVRJT04gPSA1NTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfREVDTEFSQVRJT05fU1RBVEVNRU5UID0gNTY7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlR5cGVMaXRlcmFsPC9jb2RlPi4KIAkgKiBAc2VlIFR5cGVMaXRlcmFsCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9MSVRFUkFMID0gNTc7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uPC9jb2RlPi4KIAkgKiBAc2VlIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUkVTU0lPTiA9IDU4OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+LgogCSAqIEBzZWUgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlQgPSA1OTsKIAogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4uCiAJICogQHNlZSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UID0gNjA7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPldoaWxlU3RhdGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFdoaWxlU3RhdGVtZW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJTEVfU1RBVEVNRU5UID0gNjE7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkluc3RhbmNlb2ZFeHByZXNzaW9uPC9jb2RlPi4KIAkgKiBAc2VlIEluc3RhbmNlb2ZFeHByZXNzaW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TVEFOQ0VPRl9FWFBSRVNTSU9OID0gNjI7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkxpbmVDb21tZW50PC9jb2RlPi4KIAkgKiBAc2VlIExpbmVDb21tZW50CiAJICogQHNpbmNlIDMuMApAQCAtNTk3LDcgKzYwMSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9DT01NRU5UID0gNjM7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPkJsb2NrQ29tbWVudDwvY29kZT4uCiAJICogQHNlZSBCbG9ja0NvbW1lbnQKIAkgKiBAc2luY2UgMy4wCkBAIC02MDUsNyArNjA5LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DS19DT01NRU5UID0gNjQ7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlRhZ0VsZW1lbnQ8L2NvZGU+LgogCSAqIEBzZWUgVGFnRWxlbWVudAogCSAqIEBzaW5jZSAzLjAKQEAgLTYxMyw3ICs2MTcsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19FTEVNRU5UID0gNjU7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlRleHRFbGVtZW50PC9jb2RlPi4KIAkgKiBAc2VlIFRleHRFbGVtZW50CiAJICogQHNpbmNlIDMuMApAQCAtNjIxLDcgKzYyNSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9FTEVNRU5UID0gNjY7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPk1lbWJlclJlZjwvY29kZT4uCiAJICogQHNlZSBNZW1iZXJSZWYKIAkgKiBAc2luY2UgMy4wCkBAIC02MjksNyArNjMzLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1CRVJfUkVGID0gNjc7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPk1ldGhvZFJlZjwvY29kZT4uCiAJICogQHNlZSBNZXRob2RSZWYKIAkgKiBAc2luY2UgMy4wCkBAIC02MzcsNyArNjQxLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfUkVGID0gNjg7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPk1ldGhvZFJlZlBhcmFtZXRlcjwvY29kZT4uCiAJICogQHNlZSBNZXRob2RSZWZQYXJhbWV0ZXIKIAkgKiBAc2luY2UgMy4wCkBAIC02NDUsNyArNjQ5LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfUkVGX1BBUkFNRVRFUiA9IDY5OwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5FbmhhbmNlZEZvclN0YXRlbWVudDwvY29kZT4uCiAJICogQHNlZSBFbmhhbmNlZEZvclN0YXRlbWVudAogCSAqIEBzaW5jZSAzLjEKQEAgLTY1MywyMyArNjU3LDIzIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5IQU5DRURfRk9SX1NUQVRFTUVOVCA9IDcwOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5FbnVtRGVjbGFyYXRpb248L2NvZGU+LgogCSAqIEBzZWUgRW51bURlY2xhcmF0aW9uCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVU1fREVDTEFSQVRJT04gPSA3MTsKLQkKKwogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+RW51bUNvbnN0YW50RGVjbGFyYXRpb248L2NvZGU+LgogCSAqIEBzZWUgRW51bUNvbnN0YW50RGVjbGFyYXRpb24KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9DT05TVEFOVF9ERUNMQVJBVElPTiA9IDcyOwotCQorCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5UeXBlUGFyYW1ldGVyPC9jb2RlPi4KIAkgKiBAc2VlIFR5cGVQYXJhbWV0ZXIKIAkgKiBAc2luY2UgMy4xCkBAIC02NzcsNyArNjgxLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BBUkFNRVRFUiA9IDczOwogCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5QYXJhbWV0ZXJpemVkVHlwZTwvY29kZT4uCiAJICogQHNlZSBQYXJhbWV0ZXJpemVkVHlwZQogCSAqIEBzaW5jZSAzLjEKQEAgLTY4NSw4MyArNjg5LDkxIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1FVEVSSVpFRF9UWVBFID0gNzQ7CiAKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPlF1YWxpZmllZFR5cGU8L2NvZGU+LgogCSAqIEBzZWUgUXVhbGlmaWVkVHlwZQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSUZJRURfVFlQRSA9IDc1OwotCQorCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5XaWxkY2FyZFR5cGU8L2NvZGU+LgogCSAqIEBzZWUgV2lsZGNhcmRUeXBlCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTERDQVJEX1RZUEUgPSA3NjsKLQkKKwogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+Tm9ybWFsQW5ub3RhdGlvbjwvY29kZT4uCiAJICogQHNlZSBOb3JtYWxBbm5vdGF0aW9uCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9BTk5PVEFUSU9OID0gNzc7Ci0JCisKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPk1hcmtlckFubm90YXRpb248L2NvZGU+LgogCSAqIEBzZWUgTWFya2VyQW5ub3RhdGlvbgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVJLRVJfQU5OT1RBVElPTiA9IDc4OwotCQorCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIFNpbmdsZU1lbWJlckFubm90YXRpb24KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OID0gNzk7Ci0JCisKIAkvKioKLQkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZQogCSAqIDxjb2RlPk1lbWJlclZhbHVlUGFpcjwvY29kZT4uCiAJICogQHNlZSBNZW1iZXJWYWx1ZVBhaXIKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNQkVSX1ZBTFVFX1BBSVIgPSA4MDsKLQkKKwogCS8qKgotCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlCiAJICogPGNvZGU+QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjwvY29kZT4uCiAJICogQHNlZSBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOTk9UQVRJT05fVFlQRV9ERUNMQVJBVElPTiA9IDgxOwotCQorCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKiBAc2VlIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9UWVBFX01FTUJFUl9ERUNMQVJBVElPTiA9IDgyOwotCQorCiAJLyoqCi0JICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKIAkgKiA8Y29kZT5Nb2RpZmllcjwvY29kZT4uCiAJICogQHNlZSBNb2RpZmllcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RJRklFUiA9IDgzOwotCQorCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUKKwkgKiA8Y29kZT5VbmlvblR5cGU8L2NvZGU+LgorCSAqIEBzZWUgVW5pb25UeXBlCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JT05fVFlQRSA9IDg0OworCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbm9kZSBjbGFzcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGVUeXBlIEFTVCBub2RlIHR5cGUKIAkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPkFTVE5vZGU8L2NvZGU+IHN1YmNsYXNzCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bm9kZVR5cGU8L2NvZGU+IGlzIAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm5vZGVUeXBlPC9jb2RlPiBpcwogCSAqIG5vdCBhIGxlZ2FsIEFTVCBub2RlIHR5cGUKIAkgKiBAc2VlICNnZXROb2RlVHlwZSgpCiAJICogQHNpbmNlIDMuMApAQCAtODEwLDYgKzgyMiw4IEBACiAJCQkJcmV0dXJuIENvbnN0cnVjdG9ySW52b2NhdGlvbi5jbGFzczsKIAkJCWNhc2UgQ09OVElOVUVfU1RBVEVNRU5UIDoKIAkJCQlyZXR1cm4gQ29udGludWVTdGF0ZW1lbnQuY2xhc3M7CisJCQljYXNlIFVOSU9OX1RZUEUgOgorCQkJCXJldHVybiBVbmlvblR5cGUuY2xhc3M7CiAJCQljYXNlIERPX1NUQVRFTUVOVCA6CiAJCQkJcmV0dXJuIERvU3RhdGVtZW50LmNsYXNzOwogCQkJY2FzZSBFTVBUWV9TVEFURU1FTlQgOgpAQCAtOTM3LDcgKzk1MSw3IEBACiAJCX0KIAkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCX0KLQkKKwogCS8qKgogCSAqIE93bmluZyBBU1QuCiAgICAgICogPHA+CkBAIC05NDYsNDIgKzk2MCw0MiBAQAogICAgICAqIDwvcD4KIAkgKi8KIAlmaW5hbCBBU1QgYXN0OwotCQorCiAJLyoqCiAJICogUGFyZW50IEFTVCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG5vZGUgaXMgYSByb290LgogCSAqIEluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPi4KIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUgcGFyZW50ID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIEFuIHVubW9kaWZpYWJsZSBlbXB0eSBtYXAgKHVzZWQgdG8gaW1wbGVtZW50IDxjb2RlPnByb3BlcnRpZXMoKTwvY29kZT4pLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBVTk1PRElGSUFCTEVfRU1QVFlfTUFQCiAJCT0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG5ldyBIYXNoTWFwKDEpKTsKLQkKKwogCS8qKgogCSAqIFByaW1hcnkgZmllbGQgdXNlZCBpbiByZXByZXNlbnRpbmcgbm9kZSBwcm9wZXJ0aWVzIGVmZmljaWVudGx5LgogCSAqIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGlzIG5vZGUgaGFzIG5vIHByb3BlcnRpZXMuCi0JICogSWYgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoaXMgbm9kZSdzIHNvbGUgcHJvcGVydHksCisJICogSWYgYSB7QGxpbmsgU3RyaW5nfSwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUncyBzb2xlIHByb3BlcnR5LAogCSAqIGFuZCA8Y29kZT5wcm9wZXJ0eTI8L2NvZGU+IGNvbnRhaW5zIGl0cyB2YWx1ZS4KLQkgKiBJZiBhIDxjb2RlPkhhc2hNYXA8L2NvZGU+LCB0aGlzIGlzIHRoZSB0YWJsZSBvZiBwcm9wZXJ0eSBuYW1lLXZhbHVlCisJICogSWYgYSB7QGxpbmsgTWFwfSwgdGhpcyBpcyB0aGUgdGFibGUgb2YgcHJvcGVydHkgbmFtZS12YWx1ZQogCSAqIG1hcHBpbmdzOyA8Y29kZT5wcm9wZXJ0eTI8L2NvZGU+LCBpZiBub24tbnVsbCBpcyBpdHMgdW5tb2RpZmlhYmxlCiAJICogZXF1aXZhbGVudC4KIAkgKiBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCisJICoKIAkgKiBAc2VlICNwcm9wZXJ0eTIKIAkgKi8KIAlwcml2YXRlIE9iamVjdCBwcm9wZXJ0eTEgPSBudWxsOwotCQorCiAJLyoqCiAJICogQXV4aWxsYXJ5IGZpZWxkIHVzZWQgaW4gcmVwcmVzZW50aW5nIG5vZGUgcHJvcGVydGllcyBlZmZpY2llbnRseS4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI3Byb3BlcnR5MQogCSAqLwogCXByaXZhdGUgT2JqZWN0IHByb3BlcnR5MiA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBBIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc3RyaW5nLCAKKwkgKiBBIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc3RyaW5nLAogCSAqIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCiAJICogZm9yIHRoaXMgbm9kZTsgPGNvZGU+LTE8L2NvZGU+IGJ5IGRlZmF1bHQuCiAJICovCkBAIC05OTIsNyArMTAwNiw3IEBACiAJICogaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMgbm9kZTsgPGNvZGU+MDwvY29kZT4gYnkgZGVmYXVsdC4KIAkgKi8KIAlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCQorCiAJLyoqCiAJICogRmxhZyBjb25zdGFudCAoYml0IG1hc2ssIHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcKIAkgKiBub3QgcXVpdGUgcmlnaHQgd2l0aCB0aGlzIEFTVCBub2RlLgpAQCAtMTA0NSw3ICsxMDU5LDcgQEAKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDT1ZFUkVEID0gODsKLQkKKwogCS8qKgogCSAqIGludCBjb250YWluaW5nIHRoZSBub2RlIHR5cGUgaW4gdGhlIHRvcCAxNiBiaXRzIGFuZAogCSAqIGZsYWdzIGluIHRoZSBib3R0b20gMTYgYml0czsgbm9uZSBzZXQgYnkgZGVmYXVsdC4KQEAgLTEwNTMsNDkgKzEwNjcsNDkgQEAKICAgICAgKiBOLkIuIFRoaXMgaXMgYSBwcml2YXRlIGZpZWxkLCBidXQgZGVjbGFyZWQgYXMgcGFja2FnZS12aXNpYmxlCiAgICAgICogZm9yIG1vcmUgZWZmaWNpZW50IGFjY2VzcyBmcm9tIGlubmVyIGNsYXNzZXMuCiAgICAgICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjTUFMRk9STUVECiAJICovCiAJaW50IHR5cGVBbmRGbGFncyA9IDA7Ci0JCQorCiAJLyoqCiAJICogUHJvcGVydHkgb2YgcGFyZW50IGluIHdoaWNoIHRoaXMgbm9kZSBpcyBhIGNoaWxkLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIHRoaXMgbm9kZSBpcyBhIHJvb3QuIEluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldExvY2F0aW9uSW5QYXJlbnQKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGxvY2F0aW9uID0gbnVsbDsKLQkKKwogCS8qKiBJbnRlcm5hbCBjb252ZW5pZW5jZSBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgZGVmaW5pdGUgcmlzayBvZiBjeWNsZXMuCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlzdGF0aWMgZmluYWwgYm9vbGVhbiBDWUNMRV9SSVNLID0gdHJ1ZTsKLQkKKwogCS8qKiBJbnRlcm5hbCBjb252ZW5pZW5jZSBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgbm8gcmlzayBvZiBjeWNsZXMuCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlzdGF0aWMgZmluYWwgYm9vbGVhbiBOT19DWUNMRV9SSVNLID0gZmFsc2U7Ci0JCisKIAkvKiogSW50ZXJuYWwgY29udmVuaWVuY2UgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgc3RydWN0dXJhbCBwcm9wZXJ0eSBpcyBtYW5kYXRvcnkuCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlzdGF0aWMgZmluYWwgYm9vbGVhbiBNQU5EQVRPUlkgPSB0cnVlOwotCQorCiAJLyoqIEludGVybmFsIGNvbnZlbmllbmNlIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHN0cnVjdHVyYWwgcHJvcGVydHkgaXMgb3B0aW9uYWwuCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlzdGF0aWMgZmluYWwgYm9vbGVhbiBPUFRJT05BTCA9IGZhbHNlOwotCQorCiAJLyoqCiAJICogQSBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGxpc3Qgb2YgQVNUTm9kZXMuIFRoZQogCSAqIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIEFycmF5TGlzdC4KLQkgKi8gCisJICovCiAJY2xhc3MgTm9kZUxpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3QgewotCQkKKwogCQkvKioKIAkJICogVGhlIHVuZGVybHlpbmcgbGlzdCBpbiB3aGljaCB0aGUgbm9kZXMgb2YgdGhpcyBsaXN0IGFyZQotCQkgKiBzdG9yZWQgKGVsZW1lbnQgdHlwZTogPGNvZGU+QVNUTm9kZTwvY29kZT4pLgorCQkgKiBzdG9yZWQgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFTVE5vZGV9KS4KIAkJICogPHA+CiAJCSAqIEJlIHN0aW5neSBvbiBzdG9yYWdlIC0gYXNzdW1lIHRoYXQgbGlzdCB3aWxsIGJlIGVtcHR5LgogCQkgKiA8L3A+CkBAIC0xMTA2LDEyICsxMTIwLDEyIEBACiAJCSAqIDwvcD4KIAkJICovCiAJCUFycmF5TGlzdCBzdG9yZSA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQorCiAJCS8qKgogCQkgKiBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhpcyBsaXN0LgogCQkgKi8KIAkJQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvcjsKLQkJCisKIAkJLyoqCiAJCSAqIEEgY3Vyc29yIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QuCiAJCSAqIERvZXMgbm90IGxvc2UgaXRzIHBvc2l0aW9uIGlmIHRoZSBsaXN0IGlzIGNoYW5nZWQgZHVyaW5nCkBAIC0xMTI1LDE0ICsxMTM5LDE0IEBACiAJCQkgKiBsaXN0LgogCQkJICovCiAJCQlwcml2YXRlIGludCBwb3NpdGlvbiA9IDA7Ci0JCQkKKwogCQkJLyogKG5vbi1KYXZhZG9jKQogCQkJICogTWV0aG9kIGRlY2xhcmVkIG9uIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPi4KIAkJCSAqLwogCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKIAkJCQlyZXR1cm4gdGhpcy5wb3NpdGlvbiA8IE5vZGVMaXN0LnRoaXMuc3RvcmUuc2l6ZSgpOwogCQkJfQotCQkJCisKIAkJCS8qIChub24tSmF2YWRvYykKIAkJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4uCiAJCQkgKi8KQEAgLTExNDEsMTggKzExNTUsMTggQEAKIAkJCQl0aGlzLnBvc2l0aW9uKys7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJICAgIH0KLQkJCQorCiAJCQkvKiAobm9uLUphdmFkb2MpCiAJCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgogCQkJICovCiAJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CiAJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJCQl9Ci0JCQkKKwogCQkJLyoqCiAJCQkgKiBBZGp1c3RzIHRoaXMgY3Vyc29yIHRvIGFjY29tb2RhdGUgYW4gYWRkL3JlbW92ZSBhdCB0aGUgZ2l2ZW4KIAkJCSAqIGluZGV4LgotCQkJICogCisJCQkgKgogCQkJICogQHBhcmFtIGluZGV4IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgZWxlbWVudCB3YXMgYWRkZWQKIAkJCSAqICAgIG9yIHJlbW92ZWQKIAkJCSAqIEBwYXJhbSBkZWx0YSArMSBmb3IgYWRkLCBhbmQgLTEgZm9yIHJlbW92ZQpAQCAtMTE2NywxMyArMTE4MSwxMyBAQAogCiAJCS8qKgogCQkgKiBBIGxpc3Qgb2YgY3VycmVudGx5IGFjdGl2ZSBjdXJzb3JzIChlbGVtZW50IHR5cGU6Ci0JCSAqIDxjb2RlPkN1cnNvcjwvY29kZT4pLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8KKwkJICoge0BsaW5rIEN1cnNvcn0pLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8KIAkJICogYWN0aXZlIGN1cnNvcnMuCiAJCSAqIDxwPgogCQkgKiBJdCBpcyBpbXBvcnRhbnQgZm9yIHN0b3JhZ2UgY29uc2lkZXJhdGlvbnMgdG8gbWFpbnRhaW4gdGhlCiAJCSAqIG51bGwtbWVhbnMtZW1wdHkgaW52YXJpYW50OyBvdGhlcndpc2UsIGV2ZXJ5IE5vZGVMaXN0IGluc3RhbmNlCiAJCSAqIHdpbGwgd2FzdGUgYSBsb3Qgb2Ygc3BhY2UuIEEgY3Vyc29yIGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgZHVyYXRpb24KLQkJICogb2YgYSB2aXNpdCB0byB0aGUgY2hpbGQgbm9kZXMuIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBvbmx5IGEgCisJCSAqIG9mIGEgdmlzaXQgdG8gdGhlIGNoaWxkIG5vZGVzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgb25seSBhCiAJCSAqIHNpbmdsZSBjdXJzb3IgaXMgbmVlZGVkOyBtdWx0aXBsZSBjdXJzb3JzIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHRoZXJlCiAJCSAqIGFyZSBtdWx0aXBsZSB2aXNpdHMgZ29pbmcgb24gYXQgdGhlIHNhbWUgdGltZS4KIAkJICogPC9wPgpAQCAtMTE4Miw5ICsxMTk2LDkgQEAKIAogCQkvKioKIAkJICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0IG9mIG5vZGVzIG93bmVkIGJ5IHRoaXMgbm9kZS4KLQkJICogVGhpcyBub2RlIHdpbGwgYmUgdGhlIGNvbW1vbiBwYXJlbnQgb2YgYWxsIG5vZGVzIGFkZGVkIHRvIAorCQkgKiBUaGlzIG5vZGUgd2lsbCBiZSB0aGUgY29tbW9uIHBhcmVudCBvZiBhbGwgbm9kZXMgYWRkZWQgdG8KIAkJICogdGhpcyBsaXN0LgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJCSAqIEBzaW5jZSAzLjAKIAkJICovCkBAIC0xMTkyLDIxICsxMjA2LDIxIEBACiAJCQlzdXBlcigpOwogCQkJdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eTsKIAkJfQotCQorCiAJCS8qIChub24tamF2YWRvYykKIAkJICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3NpemUoKQogCQkgKi8KIAkJcHVibGljIGludCBzaXplKCkgewogCQkJcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZSgpOwogCQl9Ci0JCisKIAkJLyogKG5vbi1qYXZhZG9jKQogCQkgKiBAc2VlIEFic3RyYWN0TGlzdCNnZXQoaW50KQogCQkgKi8KIAkJcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CiAJCQlyZXR1cm4gdGhpcy5zdG9yZS5nZXQoaW5kZXgpOwogCQl9Ci0JCisKIAkJLyogKG5vbi1qYXZhZG9jKQogCQkgKiBAc2VlIExpc3Qjc2V0KGludCwgamF2YS5sYW5nLk9iamVjdCkKIAkJICovCkBAIC0xMjMwLDcgKzEyNDQsNyBAQAogCQkJfQogCQkJQVNUTm9kZS5jaGVja05ld0NoaWxkKEFTVE5vZGUudGhpcywgbmV3Q2hpbGQsIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmN5Y2xlUmlzaywgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZWxlbWVudFR5cGUpOwogCQkJQVNUTm9kZS50aGlzLmFzdC5wcmVSZXBsYWNlQ2hpbGRFdmVudChBU1ROb2RlLnRoaXMsIG9sZENoaWxkLCBuZXdDaGlsZCwgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IpOwotCQkJCisKIAkJCU9iamVjdCByZXN1bHQgPSB0aGlzLnN0b3JlLnNldChpbmRleCwgbmV3Q2hpbGQpOwogCQkJLy8gbi5iLiBzZXRQYXJlbnQgd2lsbCBjYWxsIGFzdC5tb2RpZnlpbmcoKQogCQkJb2xkQ2hpbGQuc2V0UGFyZW50KG51bGwsIG51bGwpOwpAQCAtMTIzOCw3ICsxMjUyLDcgQEAKIAkJCUFTVE5vZGUudGhpcy5hc3QucG9zdFJlcGxhY2VDaGlsZEV2ZW50KEFTVE5vZGUudGhpcywgb2xkQ2hpbGQsIG5ld0NoaWxkLCB0aGlzLnByb3BlcnR5RGVzY3JpcHRvcik7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9Ci0JCQorCiAJCS8qIChub24tamF2YWRvYykKIAkJICogQHNlZSBMaXN0I2FkZChpbnQsIGphdmEubGFuZy5PYmplY3QpCiAJCSAqLwpAQCAtMTI1NCwxNSArMTI2OCwxNSBAQAogCQkJQVNUTm9kZSBuZXdDaGlsZCA9IChBU1ROb2RlKSBlbGVtZW50OwogCQkJQVNUTm9kZS5jaGVja05ld0NoaWxkKEFTVE5vZGUudGhpcywgbmV3Q2hpbGQsIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmN5Y2xlUmlzaywgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZWxlbWVudFR5cGUpOwogCQkJQVNUTm9kZS50aGlzLmFzdC5wcmVBZGRDaGlsZEV2ZW50KEFTVE5vZGUudGhpcywgbmV3Q2hpbGQsIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yKTsKLQkJCQotCQkJCisKKwogCQkJdGhpcy5zdG9yZS5hZGQoaW5kZXgsIGVsZW1lbnQpOwogCQkJdXBkYXRlQ3Vyc29ycyhpbmRleCwgKzEpOwogCQkJLy8gbi5iLiBzZXRQYXJlbnQgd2lsbCBjYWxsIGFzdC5tb2RpZnlpbmcoKQogCQkJbmV3Q2hpbGQuc2V0UGFyZW50KEFTVE5vZGUudGhpcywgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IpOwogCQkJQVNUTm9kZS50aGlzLmFzdC5wb3N0QWRkQ2hpbGRFdmVudChBU1ROb2RlLnRoaXMsIG5ld0NoaWxkLCB0aGlzLnByb3BlcnR5RGVzY3JpcHRvcik7CiAJCX0KLQkJCisKIAkJLyogKG5vbi1qYXZhZG9jKQogCQkgKiBAc2VlIExpc3QjcmVtb3ZlKGludCkKIAkJICovCkBAIC0xMjc3LDcgKzEyOTEsNyBAQAogCQkJCS8vIG9sZCBjaGlsZCBpcyBwcm90ZWN0ZWQgPT4gY2Fubm90IGJlIHVucGFyZW50ZWQKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBU1Qgbm9kZSBjYW5ub3QgYmUgbW9kaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQkJCisKIAkJCUFTVE5vZGUudGhpcy5hc3QucHJlUmVtb3ZlQ2hpbGRFdmVudChBU1ROb2RlLnRoaXMsIG9sZENoaWxkLCB0aGlzLnByb3BlcnR5RGVzY3JpcHRvcik7CiAJCQkvLyBuLmIuIHNldFBhcmVudCB3aWxsIGNhbGwgYXN0Lm1vZGlmeWluZygpCiAJCQlvbGRDaGlsZC5zZXRQYXJlbnQobnVsbCwgbnVsbCk7CkBAIC0xMjg3LDcgKzEzMDEsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAogCQl9Ci0JCQorCiAJCS8qKgogCQkgKiBBbGxvY2F0ZSBhIGN1cnNvciB0byB1c2UgZm9yIGEgdmlzaXQuIFRoZSBjbGllbnQgbXVzdCBjYWxsCiAJCSAqIDxjb2RlPnJlbGVhc2VDdXJzb3I8L2NvZGU+IHdoZW4gZG9uZS4KQEAgLTEyOTUsOCArMTMwOSw4IEBACiAJCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsbHkgc3luY2hyb25pemVkIG9uIHRoaXMgTm9kZUxpc3QuCiAJCSAqIEl0IGlzIHRocmVhZC1zYWZlIHRvIGNyZWF0ZSBhIGN1cnNvci4KIAkJICogPC9wPgotCQkgKiAKLQkJICogQHJldHVybiBhIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgCisJCSAqCisJCSAqIEByZXR1cm4gYSBuZXcgY3Vyc29yIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50CiAJCSAqICAgIG9mIHRoZSBsaXN0CiAJCSAqLwogCQlDdXJzb3IgbmV3Q3Vyc29yKCkgewpAQCAtMTMxMSwxNCArMTMyNSwxNCBAQAogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCX0KLQkJCisKIAkJLyoqCiAJCSAqIFJlbGVhc2VzIHRoZSBnaXZlbiBjdXJzb3IgYXQgdGhlIGVuZCBvZiBhIHZpc2l0LgogCQkgKiA8cD4KIAkJICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgb24gdGhpcyBOb2RlTGlzdC4KIAkJICogSXQgaXMgdGhyZWFkLXNhZmUgdG8gcmVsZWFzZSBhIGN1cnNvci4KIAkJICogPC9wPgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIGN1cnNvciB0aGUgY3Vyc29yCiAJCSAqLwogCQl2b2lkIHJlbGVhc2VDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewpAQCAtMTM0MCwxMiArMTM1NCwxMiBAQAogCQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgbGlzdCBpcyBiZWluZyBtb2RpZmllZC4KIAkJICogVGhlIEFTVCBpcyBub3QgdGhyZWFkLXNhZmUgaWYgYW55IG9mIHRoZSBjbGllbnRzIGFyZSBtb2RpZnlpbmcgaXQuCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSBpbmRleCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGVsZW1lbnQgd2FzIGFkZGVkCiAJCSAqICAgIG9yIHJlbW92ZWQKIAkJICogQHBhcmFtIGRlbHRhICsxIGZvciBhZGQsIGFuZCAtMSBmb3IgcmVtb3ZlCiAJCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlQ3Vyc29ycyhpbnQgaW5kZXgsIGludCBkZWx0YSkgeworCQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUN1cnNvcnMoaW50IGluZGV4LCBpbnQgZGVsdGEpIHsKIAkJCWlmICh0aGlzLmN1cnNvcnMgPT0gbnVsbCkgewogCQkJCS8vIHRoZXJlIGFyZSBubyBjdXJzb3JzIHRvIHdvcnJ5IGFib3V0CiAJCQkJcmV0dXJuOwpAQCAtMTM1NSw5ICsxMzY5LDkgQEAKIAkJCQljLnVwZGF0ZShpbmRleCwgZGVsdGEpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8qKgotCQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoaXMgbm9kZSBsaXN0IAorCQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoaXMgbm9kZSBsaXN0CiAJCSAqIGluc3RhbmNlIGluIGJ5dGVzLgogCSAgICAgKiA8dWw+CiAJICAgICAqIDxsaT4xIG9iamVjdCBoZWFkZXIgZm9yIHRoZSBOb2RlTGlzdCBpbnN0YW5jZTwvbGk+CkBAIC0xMzY4LDcgKzEzODIsNyBAQAogCSAgICAgKiA8bGk+MSBvYmplY3QgaGVhZGVyIGZvciBhbiBPYmplY3RbXSBpbnN0YW5jZTwvbGk+CiAJICAgICAqIDxsaT40IGJ5dGVzIGluIGFycmF5IGZvciBlYWNoIGVsZW1lbnQ8L2xpPgogCSAgICAgKiA8L3VsPgotCSAJICogCisJIAkgKgogCQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbm9kZSBsaXN0IGluIGJ5dGVzCiAJCSAqLwogCQlpbnQgbWVtU2l6ZSgpIHsKQEAgLTEzODEsNyArMTM5NSw3IEBACiAJCS8qKgogCQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IGluIGJ5dGVzIG9mIHRoaXMgbm9kZQogCQkgKiBsaXN0IGFuZCBhbGwgaXRzIHN1YnRyZWVzLgotCQkgKiAKKwkJICoKIAkJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxpc3Qgb2Ygc3VidHJlZXMgaW4gYnl0ZXMKIAkJICovCiAJCWludCBsaXN0U2l6ZSgpIHsKQEAgLTE0MDAsMzcgKzE0MTQsMzcgQEAKIAkgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgbm9kZS4gVGhlIG5ldyBub2RlIGhhcyBubyBwYXJlbnQgbm9kZSwKIAkgKiBhbmQgbm8gcHJvcGVydGllcy4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBteSBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBteSBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlBU1ROb2RlKEFTVCBhc3QpIHsKIAkJaWYgKGFzdCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJCisKIAkJdGhpcy5hc3QgPSBhc3Q7CiAJCXNldE5vZGVUeXBlKGdldE5vZGVUeXBlMCgpKTsKIAkJc2V0RmxhZ3MoYXN0LmdldERlZmF1bHROb2RlRmxhZygpKTsKIAkJLy8gc2V0RmxhZ3MgY2FsbHMgbW9kaWZ5aW5nKCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGlzIG5vZGUncyBBU1QuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbiBBU1Qgbm9kZSBhbmQgaXRzIG93aW5nIEFTVCBkb2VzCiAJICogbm90IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiBhIG5vZGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgQVNUIHRoYXQgb3ducyB0aGlzIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIGZpbmFsIEFTVCBnZXRBU1QoKSB7CiAJCXJldHVybiB0aGlzLmFzdDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoaXMgbm9kZSdzIHBhcmVudCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIHRoZQogCSAqIHJvb3Qgbm9kZS4KQEAgLTE0MzgsMTMgKzE0NTIsMTMgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIEFTVCBub2RlIGFuZCBpdHMgcGFyZW50IG5vZGUKIAkgKiBtYXkgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgbm9kZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyBmaW5hbCBBU1ROb2RlIGdldFBhcmVudCgpIHsKIAkJcmV0dXJuIHRoaXMucGFyZW50OwogCX0KLQkJCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBwYXJlbnQsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBhIHJvb3Qgbm9kZS4KQEAgLTE0NjQsMjEgKzE0NzgsMjEgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIEFTVCBub2RlIGFuZCBpdHMgcGFyZW50IG5vZGUKIAkgKiBtYXkgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgbm9kZS4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBub2RlIGluIGl0cyBwYXJlbnQsIAorCSAqCisJICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBub2RlIGluIGl0cyBwYXJlbnQsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGhhcyBubyBwYXJlbnQKIAkgKiBAc2luY2UgMy4wCi0JICovIAorCSAqLwogCXB1YmxpYyBmaW5hbCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGdldExvY2F0aW9uSW5QYXJlbnQoKSB7CiAJCXJldHVybiB0aGlzLmxvY2F0aW9uOwogCX0KLQkJCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgYXQgb3IgYWJvdmUgdGhpcyBub2RlOyByZXR1cm5zIHRoaXMgbm9kZSBpZiAKKwkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgYXQgb3IgYWJvdmUgdGhpcyBub2RlOyByZXR1cm5zIHRoaXMgbm9kZSBpZgogCSAqIGl0IGlzIGEgcm9vdC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBhdCBvciBhYm92ZSB0aGlzIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIGZpbmFsIEFTVE5vZGUgZ2V0Um9vdCgpIHsKIAkJQVNUTm9kZSBjYW5kaWRhdGUgPSB0aGlzOwogCQl3aGlsZSAodHJ1ZSkgewpAQCAtMTQ5MCw3ICsxNTA0LDcgQEAKIAkJCWNhbmRpZGF0ZSA9IHA7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc3RydWN0dXJhbCBwcm9wZXJ0eSBmb3IgdGhpcyBub2RlLiBUaGUgdmFsdWUKIAkgKiByZXR1cm5lZCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHByb3BlcnR5OgpAQCAtMTUwMSw3ICsxNTE1LDcgQEAKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lPC9saT4KIAkgKiA8bGk+e0BsaW5rIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcn0gLSB0aGUgbGlzdCAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQVNUTm9kZX0pPC9saT4KIAkgKiA8L3VsPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQogCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQGV4Y2VwdGlvbiBSdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eQpAQCAtMTUyOCw3ICsxNTQyLDcgQEAKIAkJfQogCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHN0cnVjdHVyYWwgcHJvcGVydHkgZm9yIHRoaXMgbm9kZS4gVGhlIHZhbHVlCiAJICogcGFzc2VkIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgcHJvcGVydHk6CkBAIC0xNTM5LDcgKzE1NTMsNyBAQAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmU8L2xpPgogCSAqIDxsaT57QGxpbmsgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yfSAtIG5vdCBhbGxvd2VkPC9saT4KIAkgKiA8L3VsPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQogCSAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUKIAkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgdGhlCkBAIC0xNTg1LDU3ICsxNTk5LDU3IEBACiAJICogdGhhdCB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBzdWNoIGEgcHJvcGVydHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogCSAqIGV4dGVuZGVkIGluIHN1YmNsYXNzZXMgdGhhdCBoYXZlIGF0IGxlYXN5IG9uZSBzaW1wbGUgcHJvcGVydHkgd2hvc2UgdmFsdWUKIAkgKiB0eXBlIGlzIGludC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gZ2V0IDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGdldCBvcGVyYXRpb24sIGFuZCAKKwkgKiBAcGFyYW0gZ2V0IDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGdldCBvcGVyYXRpb24sIGFuZAogCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYSBzZXQgb3BlcmF0aW9uCiAJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgcHJvcGVydHkgdmFsdWU7IGlnbm9yZWQgZm9yIGdldCBvcGVyYXRpb25zCiAJICogQHJldHVybiB0aGUgdmFsdWU7IGFsd2F5cyByZXR1cm5zCiAJICogPGNvZGU+MDwvY29kZT4gZm9yIHNldCBvcGVyYXRpb25zCi0JICogQGV4Y2VwdGlvbiBSdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSAKKwkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgdGhlCiAJICogZ2l2ZW4gcHJvcGVydHksIG9yIGlmIHRoZSBnaXZlbiB2YWx1ZSBjYW5ub3QgYmUgc2V0IGFzIHNwZWNpZmllZAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlpbnQgaW50ZXJuYWxHZXRTZXRJbnRQcm9wZXJ0eShTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGJvb2xlYW4gZ2V0LCBpbnQgdmFsdWUpIHsKIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vZGUgZG9lcyBub3QgaGF2ZSB0aGlzIHByb3BlcnR5Iik7ICAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5IGZvciB0aGlzIG5vZGUuCiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBleHBsYWluaW5nCiAJICogdGhhdCB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBzdWNoIGEgcHJvcGVydHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogCSAqIGV4dGVuZGVkIGluIHN1YmNsYXNzZXMgdGhhdCBoYXZlIGF0IGxlYXN5IG9uZSBzaW1wbGUgcHJvcGVydHkgd2hvc2UgdmFsdWUKIAkgKiB0eXBlIGlzIGJvb2xlYW4uCi0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIGdldCA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYSBnZXQgb3BlcmF0aW9uLCBhbmQgCisJICogQHBhcmFtIGdldCA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYSBnZXQgb3BlcmF0aW9uLCBhbmQKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGEgc2V0IG9wZXJhdGlvbgogCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHByb3BlcnR5IHZhbHVlOyBpZ25vcmVkIGZvciBnZXQgb3BlcmF0aW9ucwogCSAqIEByZXR1cm4gdGhlIHZhbHVlOyBhbHdheXMgcmV0dXJucwogCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3Igc2V0IG9wZXJhdGlvbnMKLQkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgdGhlIAorCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUKIAkgKiBnaXZlbiBwcm9wZXJ0eSwgb3IgaWYgdGhlIGdpdmVuIHZhbHVlIGNhbm5vdCBiZSBzZXQgYXMgc3BlY2lmaWVkCiAJICogQHNpbmNlIDMuMAogCSAqLwogCWJvb2xlYW4gaW50ZXJuYWxHZXRTZXRCb29sZWFuUHJvcGVydHkoU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBib29sZWFuIGdldCwgYm9vbGVhbiB2YWx1ZSkgewogCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm9kZSBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvcGVydHkiKTsgIC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgZm9yIHRoaXMgbm9kZS4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGV4cGxhaW5pbmcKIAkgKiB0aGF0IHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBwcm9wZXJ0eS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCiAJICogZXh0ZW5kZWQgaW4gc3ViY2xhc3NlcyB0aGF0IGhhdmUgYXQgbGVhc3kgb25lIHNpbXBsZSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZQogCSAqIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gZ2V0IDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGdldCBvcGVyYXRpb24sIGFuZCAKKwkgKiBAcGFyYW0gZ2V0IDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGdldCBvcGVyYXRpb24sIGFuZAogCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYSBzZXQgb3BlcmF0aW9uCiAJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmU7CiAJICogaWdub3JlZCBmb3IgZ2V0IG9wZXJhdGlvbnMKIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgYWx3YXlzIHJldHVybnMKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBmb3Igc2V0IG9wZXJhdGlvbnMKLQkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgdGhlIAorCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUKIAkgKiBnaXZlbiBwcm9wZXJ0eSwgb3IgaWYgdGhlIGdpdmVuIHZhbHVlIGNhbm5vdCBiZSBzZXQgYXMgc3BlY2lmaWVkCiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtMTY0OCw5ICsxNjYyLDkgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGV4cGxhaW5pbmcKIAkgKiB0aGF0IHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBwcm9wZXJ0eS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCiAJICogZXh0ZW5kZWQgaW4gc3ViY2xhc3NlcyB0aGF0IGhhdmUgYXQgbGVhc3kgb25lIGNoaWxkIHByb3BlcnR5LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBnZXQgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgZ2V0IG9wZXJhdGlvbiwgYW5kIAorCSAqIEBwYXJhbSBnZXQgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgZ2V0IG9wZXJhdGlvbiwgYW5kCiAJICogPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBhIHNldCBvcGVyYXRpb24KIAkgKiBAcGFyYW0gY2hpbGQgdGhlIG5ldyBjaGlsZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsKIAkgKiBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGdldCBvcGVyYXRpb25zCkBAIC0xNjYzLDEzICsxNjc3LDEzIEBACiAJQVNUTm9kZSBpbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkoQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGJvb2xlYW4gZ2V0LCBBU1ROb2RlIGNoaWxkKSB7CiAJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb2RlIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9wZXJ0eSIpOyAgLy8kTk9OLU5MUy0xJAogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpc3QgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IGZvciB0aGlzIG5vZGUuCiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBleHBsYWluaW5nCiAJICogdGhhdCB0aGlzIG5vZWQgZG9lcyBub3QgaGF2ZSBzdWNoIGEgcHJvcGVydHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogCSAqIGV4dGVuZGVkIGluIHN1YmNsYXNzZXMgdGhhdCBoYXZlIGF0IGxlYXN5IG9uZSBjaGlsZCBsaXN0IHByb3BlcnR5LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eQogCSAqIEByZXR1cm4gdGhlIGxpc3QgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFTVE5vZGV9KQogCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbm9kZSBkb2VzIG5vdCBoYXZlIHRoZQpAQCAtMTY3OSw3ICsxNjkzLDcgQEAKIAlMaXN0IGludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkoQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb2RlIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9wZXJ0eSIpOyAgLy8kTk9OLU5MUy0xJAogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIG5vZGVzIG9mIHRoZQogCSAqIHNhbWUgdHlwZSBhcyB0aGlzIG5vZGUuIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCkBAIC0xNjg4LDE1ICsxNzAyLDE1IEBACiAJICogZm9yIG1hbmlwdWxhdGluZyBBU1ROb2RlcyBpbiBhIGdlbmVyaWMgd2F5LiBUaGV5IGFyZQogCSAqIHVucmVsYXRlZCB0byA8Y29kZT5nZXQvc2V0UHJvcGVydHk8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgZmluYWwgTGlzdCBzdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoKSB7CiAJCXJldHVybiBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSh0aGlzLmFzdC5hcGlMZXZlbCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuIFRoaXMgYWJzdHJhY3QgbWV0aG9kCkBAIC0xNzA2LDE4ICsxNzIwLDE4IEBACiAJICogb2YgdGhpcyBtZXRob2QgaW4gZWFjaCBvZiB0aGUgY29uY3JldGUgQVNUIG5vZGUgdHlwZXMgZG8gbm90CiAJICogY2x1dHRlciB1cCB0aGUgQVBJIGRvYy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZSA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCWFic3RyYWN0IExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKTsKLQkKKwogCS8qKgogCSAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdGhhdCBzdGFydHMgdGhlIGJ1aWxkaW5nIGEgbGlzdCBvZgogCSAqIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGVDbGFzcyB0aGUgY2xhc3MgZm9yIGEgY29uY3JldGUgbm9kZSB0eXBlCiAJICogQHBhcmFtIHByb3BlcnR5TGlzdCBlbXB0eSBsaXN0CiAJICovCkBAIC0xNzI1LDEwICsxNzM5LDEwIEBACiAJCS8vIHN0dWZmIG5vZGVDbGFzcyBhdCBoZWFkIG9mIGxpc3QgZm9yIGZ1dHVyZSByZWYKIAkJcHJvcGVydHlMaXN0LmFkZChub2RlQ2xhc3MpOwogCX0KLQkKKwogCS8qKgogCSAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdGhhdCBhZGRpbmcgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKiBAcGFyYW0gcHJvcGVydHlMaXN0IGxpc3QgYmVnaW5uaW5nIHdpdGggdGhlIEFTVCBub2RlIGNsYXNzCiAJICogZm9sbG93ZWQgYnkgYWNjdW11bGF0ZWQgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycwpAQCAtMTc0MSwyOCArMTc1NSwzMSBAQAogCQl9CiAJCXByb3BlcnR5TGlzdC5hZGQocHJvcGVydHkpOwogCX0KLQkJCisKIAkvKioKIAkgKiBJbnRlcm5hbCBoZWxwZXIgbWV0aG9kIHRoYXQgY29tcGxldGVzIHRoZSBidWlsZGluZyBvZgogCSAqIGEgbm9kZSB0eXBlJ3Mgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGxpc3QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvcGVydHlMaXN0IGxpc3QgYmVnaW5uaW5nIHdpdGggdGhlIEFTVCBub2RlIGNsYXNzCiAJICogZm9sbG93ZWQgYnkgYWNjdW11bGF0ZWQgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycwogCSAqIEByZXR1cm4gdW5tb2RpZmlhYmxlIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycwotCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPlN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3I8L2NvZGU+KQorCSAqIChlbGVtZW50IHR5cGU6IHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKi8KIAlzdGF0aWMgTGlzdCByZWFwUHJvcGVydHlMaXN0KExpc3QgcHJvcGVydHlMaXN0KSB7CiAJCXByb3BlcnR5TGlzdC5yZW1vdmUoMCk7IC8vIHJlbW92ZSBub2RlQ2xhc3MKIAkJLy8gY29tcGFjdAogCQlBcnJheUxpc3QgYSA9IG5ldyBBcnJheUxpc3QocHJvcGVydHlMaXN0LnNpemUoKSk7Ci0JCWEuYWRkQWxsKHByb3BlcnR5TGlzdCk7IAorCQlhLmFkZEFsbChwcm9wZXJ0eUxpc3QpOwogCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhKTsKIAl9Ci0JCisKIAkvKioKICAgICAgKiBDaGVja3MgdGhhdCB0aGlzIEFTVCBvcGVyYXRpb24gaXMgbm90IHVzZWQgd2hlbgogICAgICAqIGJ1aWxkaW5nIEpMUzIgbGV2ZWwgQVNUcy4KLQorICAgICAqIDxwPgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBwcmV2ZW50IGFjY2VzcyB0byBuZXcgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBpbiBKTFMzLgorICAgICAqIDwvcD4KKyAgICAgKiAKICAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCiAJICogQHNpbmNlIDMuMAogICAgICAqLwpAQCAtMTc3Myw5ICsxNzkwLDI4IEBACiAJfQogCiAJLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhpcyBBU1Qgb3BlcmF0aW9uIGlzIG5vdCB1c2VkIHdoZW4KKyAgICAgKiBidWlsZGluZyBKTFMyIG9yIEpMUzMgbGV2ZWwgQVNUcy4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcHJldmVudCBhY2Nlc3MgdG8gbmV3IHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgaW4gSkxTNC4KKyAgICAgKiA8L3A+CisgICAgICogCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlmaW5hbCB2b2lkIHVuc3VwcG9ydGVkSW4yXzMoKSB7CisJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA8PSBBU1QuSkxTMykgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gb25seSBzdXBwb3J0ZWQgaW4gSkxTNCBBU1QiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCS8qKgogICAgICAqIENoZWNrcyB0aGF0IHRoaXMgQVNUIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgd2hlbgogICAgICAqIGJ1aWxkaW5nIEpMUzIgbGV2ZWwgQVNUcy4KLQorICAgICAqIDxwPgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBwcmV2ZW50IGFjY2VzcyB0byBkZXByZWNhdGVkIHByb3BlcnRpZXMgKGRlcHJlY2F0ZWQgaW4gSkxTMykuCisgICAgICogPC9wPgorICAgICAqIAogICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KIAkgKiBAc2luY2UgMy4wCiAgICAgICovCkBAIC0xNzkzLDMyICsxODI5LDMyIEBACiAJICogcmVtb3ZpbmcgdGhlIG5vZGUgYXMgYSBjaGlsZCBvZiBhbm90aGVyIG5vZGUuIFRoaXMgbWV0aG9kIGNhbGxzCiAJICogPGNvZGU+YXN0Lm1vZGlmeWluZygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcGFyZW50IHRoZSBuZXcgcGFyZW50IG9mIHRoaXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgbG9jYXRpb24gb2YgdGhpcyBub2RlIGluIGl0cyBwYXJlbnQsIAorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgbG9jYXRpb24gb2YgdGhpcyBub2RlIGluIGl0cyBwYXJlbnQsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+cGFyZW50PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzZWUgI2dldExvY2F0aW9uSW5QYXJlbnQKIAkgKiBAc2VlICNnZXRQYXJlbnQKIAkgKiBAc2luY2UgMy4wCi0JICovIAorCSAqLwogCWZpbmFsIHZvaWQgc2V0UGFyZW50KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCXRoaXMuYXN0Lm1vZGlmeWluZygpOwogCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKIAkJdGhpcy5sb2NhdGlvbiA9IHByb3BlcnR5OwogCX0KLQkKKwogCS8qKgogCSAqIFJlbW92ZXMgdGhpcyBub2RlIGZyb20gaXRzIHBhcmVudC4gSGFzIG5vIGVmZmVjdCBpZiB0aGlzIG5vZGUKIAkgKiBpcyB1bnBhcmVudGVkLiBJZiB0aGlzIG5vZGUgYXBwZWFycyBhcyBhbiBlbGVtZW50IG9mIGEgY2hpbGQgbGlzdAogCSAqIHByb3BlcnR5IG9mIGl0cyBwYXJlbnQsIHRoZW4gdGhpcyBub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUKIAkgKiBsaXN0IHVzaW5nIDxjb2RlPkxpc3QucmVtb3ZlPC9jb2RlPi4KIAkgKiBJZiB0aGlzIG5vZGUgYXBwZWFycyBhcyB0aGUgdmFsdWUgb2YgYSBjaGlsZCBwcm9wZXJ0eSBvZiBpdHMKLQkgKiBwYXJlbnQsIHRoZW4gdGhpcyBub2RlIGlzIGRldGFjaGVkIGZyb20gaXRzIHBhcmVudCAKKwkgKiBwYXJlbnQsIHRoZW4gdGhpcyBub2RlIGlzIGRldGFjaGVkIGZyb20gaXRzIHBhcmVudAogCSAqIGJ5IHBhc3NpbmcgPGNvZGU+bnVsbDwvY29kZT4gdG8gdGhlIGFwcHJvcHJpYXRlIHNldHRlciBtZXRob2Q7CiAJICogdGhpcyBvcGVyYXRpb24gZmFpbHMgaWYgdGhpcyBub2RlIGlzIGluIGEgbWFuZGF0b3J5IHByb3BlcnR5LgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgZmluYWwgdm9pZCBkZWxldGUoKSB7CiAJCVN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcCA9IGdldExvY2F0aW9uSW5QYXJlbnQoKTsKIAkJaWYgKHAgPT0gbnVsbCkgewpAQCAtMTgzNiwxNiArMTg3MiwxNiBAQAogCX0KIAogCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBuZXcgY2hpbGQgbm9kZSBpcyBhIG5vZGUgCisJICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG5ldyBjaGlsZCBub2RlIGlzIGEgbm9kZQogCSAqIGluIGEgZGlmZmVyZW50IEFTVCBmcm9tIGl0cyBwYXJlbnQtdG8tYmUsIHdoZXRoZXIgaXQgaXMKIAkgKiBhbHJlYWR5IGhhcyBhIHBhcmVudCwgd2hldGhlciBhZGRpbmcgaXQgdG8gaXRzCiAJICogcGFyZW50LXRvLWJlIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlLCBhbmQgd2hldGhlciB0aGUgY2hpbGQgaXMgb2YKIAkgKiB0aGUgcmlnaHQgdHlwZS4gVGhlIHBhcmVudC10by1iZSBpcyB0aGUgZW5jbG9zaW5nIGluc3RhbmNlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIHBhcmVudC10by1iZSBub2RlCiAJICogQHBhcmFtIG5ld0NoaWxkIHRoZSBuZXcgY2hpbGQgb2YgdGhlIHBhcmVudAotCSAqIEBwYXJhbSBjeWNsZUNoZWNrIDxjb2RlPnRydWU8L2NvZGU+IGlmIGN5Y2xlcyBhcmUgcG9zc2libGUgYW5kIG5lZWQgCi0JICogICB0byBiZSBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY3ljbGVzIGFyZSBpbXBvc3NpYmxlIGFuZCBkbyAKKwkgKiBAcGFyYW0gY3ljbGVDaGVjayA8Y29kZT50cnVlPC9jb2RlPiBpZiBjeWNsZXMgYXJlIHBvc3NpYmxlIGFuZCBuZWVkCisJICogICB0byBiZSBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY3ljbGVzIGFyZSBpbXBvc3NpYmxlIGFuZCBkbwogCSAqICAgbm90IG5lZWQgdG8gYmUgY2hlY2tlZAogCSAqIEBwYXJhbSBub2RlVHlwZSBhIHR5cGUgY29uc3RyYWludCBvbiBjaGlsZCBub2Rlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgIGlmIG5vIHNwZWNpYWwgY2hlY2sgaXMgcmVxdWlyZWQKQEAgLTE4NTcsMTMgKzE4OTMsMTMgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXN0YXRpYyB2b2lkIGNoZWNrTmV3Q2hpbGQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIG5ld0NoaWxkLAogCQkJYm9vbGVhbiBjeWNsZUNoZWNrLCBDbGFzcyBub2RlVHlwZSkgewogCQlpZiAobmV3Q2hpbGQuYXN0ICE9IG5vZGUuYXN0KSB7CiAJCQkvLyBuZXcgY2hpbGQgaXMgZnJvbSBhIGRpZmZlcmVudCBBU1QKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQkJCisJCX0KIAkJaWYgKG5ld0NoaWxkLmdldFBhcmVudCgpICE9IG51bGwpIHsKIAkJCS8vIG5ldyBjaGlsZCBjdXJyZW50bHkgaGFzIGEgZGlmZmVyZW50IHBhcmVudAogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMTkwNiw3ICsxOTQyLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCBjYWxscyA8Y29kZT5hc3QubW9kaWZ5aW5nKCk8L2NvZGU+IGZvciB0aGUgbm9kZXMgYWZmZWN0ZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9sZENoaWxkIHRoZSBvbGQgY2hpbGQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgdGhlcmUgd2FzIG5vIG9sZCBjaGlsZCB0byByZXBsYWNlCiAJICogQHBhcmFtIG5ld0NoaWxkIHRoZSBuZXcgY2hpbGQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgpAQCAtMTkyMSw3ICsxOTU3LDcgQEAKIAkgKiA8bGk+YW55IG9mIHRoZSBub2RlcyBpbnZvbHZlZCBhcmUgdW5tb2RpZmlhYmxlPC9saT4KIAkgKiA8L3VsPgogCSAqIEBzaW5jZSAzLjAKLQkgKi8gCisJICovCiAJZmluYWwgdm9pZCBwcmVSZXBsYWNlQ2hpbGQoQVNUTm9kZSBvbGRDaGlsZCwgQVNUTm9kZSBuZXdDaGlsZCwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaWYgKCh0aGlzLnR5cGVBbmRGbGFncyAmIFBST1RFQ1QpICE9IDApIHsKIAkJCS8vIHRoaXMgbm9kZSBpcyBwcm90ZWN0ZWQgPT4gY2Fubm90IGdhaW4gb3IgbG9zZSBjaGlsZHJlbgpAQCAtMTk2MCw3ICsxOTk2LDcgQEAKICAgICAgKiBTZWUge0BsaW5rICNwcmVSZXBsYWNlQ2hpbGQoQVNUTm9kZSwgQVNUTm9kZSwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IpfQogICAgICAqIGZvciBkZXRhaWxzLgogCSAqIEBzaW5jZSAzLjAKLQkgKi8gCisJICovCiAJZmluYWwgdm9pZCBwb3N0UmVwbGFjZUNoaWxkKEFTVE5vZGUgb2xkQ2hpbGQsIEFTVE5vZGUgbmV3Q2hpbGQsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCS8vIGxpbmsgbmV3IGNoaWxkIHRvIHBhcmVudAogCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewpAQCAtMTk3Myw3ICsyMDA5LDcgQEAKIAkJCXRoaXMuYXN0LnBvc3RSZW1vdmVDaGlsZEV2ZW50KHRoaXMsIG9sZENoaWxkLCBwcm9wZXJ0eSk7CiAJCX0KIAl9Ci0JCisKIAkvKioKICAgICAgKiBQcmVsdWRlIHBvcnRpb24gb2YgdGhlICIzIHN0ZXAgcHJvZ3JhbSIgZm9yIGNoYW5naW5nIHRoZQogCSAqIHZhbHVlIG9mIGEgc2ltcGxlIHByb3BlcnR5IG9mIHRoaXMgbm9kZS4KQEAgLTE5OTIsMTQgKzIwMjgsMTQgQEAKIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCBjYWxscyA8Y29kZT5hc3QubW9kaWZ5aW5nKCk8L2NvZGU+IGZvciB0aGUgbm9kZSBhZmZlY3RlZC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIHRoaXMgbm9kZSAKKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBvZiB0aGlzIG5vZGUKIAkgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGlzIG5vZGUgaXMgdW5tb2RpZmlhYmxlPC9saT4KIAkgKiA8L3VsPgogCSAqIEBzaW5jZSAzLjAKLQkgKi8gCisJICovCiAJZmluYWwgdm9pZCBwcmVWYWx1ZUNoYW5nZShTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaWYgKCh0aGlzLnR5cGVBbmRGbGFncyAmIFBST1RFQ1QpICE9IDApIHsKIAkJCS8vIHRoaXMgbm9kZSBpcyBwcm90ZWN0ZWQgPT4gY2Fubm90IGNoYW5nZSB2YWx1cmUgb2YgcHJvcGVydGllcwpAQCAtMjAxNCwxMSArMjA1MCwxMSBAQAogCSAqIG9sZCBjaGlsZCBvZiB0aGlzIG5vZGUgd2l0aCBhbm90aGVyIG5vZGUuCiAgICAgICogU2VlIHtAbGluayAjcHJlVmFsdWVDaGFuZ2UoU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKX0gZm9yIGRldGFpbHMuCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlmaW5hbCB2b2lkIHBvc3RWYWx1ZUNoYW5nZShTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJdGhpcy5hc3QucG9zdFZhbHVlQ2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHkpOwogCX0KLQkKKwogCS8qKgogICAgICAqIEVuc3VyZXMgdGhhdCB0aGlzIG5vZGUgaXMgbW9kaWZpYWJsZSAodGhhdCBpcywgbm90IG1hcmtlZCBQUk9URUNURUQpLgogICAgICAqIElmIHN1Y2Nlc3NmdWwsIGNhbGxzIGFzdC5tb2RpZnlpbmcoKS4KQEAgLTIwMzAsNyArMjA2Niw3IEBACiAJCX0KIAkJdGhpcy5hc3QubW9kaWZ5aW5nKCk7CiAJfQotCQorCiAJLyoqCiAgICAgICogQmVnaW4gbGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG5vZGUuCiAgICAgICogSGVyZSBpcyB0aGUgY29kZSBwYXR0ZXJuIGZvdW5kIGluIGFsbCBBU1QKQEAgLTIwNTUsMTAgKzIwOTEsMTAgQEAKIAkJdGhpcy5hc3QuZGlzYWJsZUV2ZW50cygpOwogCQkvLyB3aWxsIHR1cm4gZXZlbnRzIGJhY2sgb24gaW4gcG9zdExhc3lJbml0CiAJfQotCQorCiAJLyoqCiAgICAgICogRW5kIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBub2RlLgotICAgICAqIAorICAgICAqCiAJICogQHBhcmFtIG5ld0NoaWxkIHRoZSBuZXcgY2hpbGQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgdGhlcmUgaXMgbm8gcmVwbGFjZW1lbnQgY2hpbGQKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgdGhpcyBub2RlIGRlc2NyaWJpbmcKQEAgLTIwNzUsOCArMjExMSw4IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZWQgcHJvcGVydHkgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIAorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICoKIAkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsT2JqZWN0KQpAQCAtMjEwMSw3ICsyMTM3LDcgQEAKIAkJTWFwIG0gPSAoTWFwKSB0aGlzLnByb3BlcnR5MTsKIAkJcmV0dXJuIG0uZ2V0KHByb3BlcnR5TmFtZSk7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgb2YgdGhpcyBub2RlIHRvIHRoZSBnaXZlbiB2YWx1ZSwKIAkgKiBvciB0byA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciBpdC4KQEAgLTIxMTEsMTUgKzIxNDcsMTYgQEAKIAkgKiBzZXR0aW5nIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgbm9kZS4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogTm90ZSB0aGF0IG1vZGlmeWluZyBhIHByb3BlcnR5IGlzIG5vdCBjb25zaWRlcmVkIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSAKLQkgKiBBU1QgaXRzZWxmLiBUaGlzIGlzIHRvIGFsbG93IGNsaWVudHMgdG8gZGVjb3JhdGUgZXhpc3Rpbmcgbm9kZXMgd2l0aCAKLQkgKiB0aGVpciBvd24gcHJvcGVydGllcyB3aXRob3V0IGplb3BhcmRpemluZyBjZXJ0YWluIHRoaW5ncyAobGlrZSB0aGUgCisJICogTm90ZSB0aGF0IG1vZGlmeWluZyBhIHByb3BlcnR5IGlzIG5vdCBjb25zaWRlcmVkIGEgbW9kaWZpY2F0aW9uIHRvIHRoZQorCSAqIEFTVCBpdHNlbGYuIFRoaXMgaXMgdG8gYWxsb3cgY2xpZW50cyB0byBkZWNvcmF0ZSBleGlzdGluZyBub2RlcyB3aXRoCisJICogdGhlaXIgb3duIHByb3BlcnRpZXMgd2l0aG91dCBqZW9wYXJkaXppbmcgY2VydGFpbiB0aGluZ3MgKGxpa2UgdGhlCiAJICogdmFsaWRpdHkgb2YgYmluZGluZ3MpLCB3aGljaCByZWx5IG9uIHRoZSB1bmRlcmx5aW5nIHRyZWUgcmVtYWluaW5nIHN0YXRpYy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCiAJICogQHBhcmFtIGRhdGEgdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwogCXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewpAQCAtMjE0MywxMSArMjE4MCwxMiBAQAogCQkJLy8gbm9kZSBoYXMgb25seSBhIHNpbmdsZSBwcm9wZXJ0eQogCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHModGhpcy5wcm9wZXJ0eTEpKSB7CiAJCQkJLy8gd2UncmUgaW4gbHVjawotCQkJCXRoaXMucHJvcGVydHkyID0gZGF0YTsKIAkJCQlpZiAoZGF0YSA9PSBudWxsKSB7CiAJCQkJCS8vIGp1c3QgZGVsZXRlZCBsYXN0IHByb3BlcnR5CiAJCQkJCXRoaXMucHJvcGVydHkxID0gbnVsbDsKIAkJCQkJdGhpcy5wcm9wZXJ0eTIgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMucHJvcGVydHkyID0gZGF0YTsKIAkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMjE1NywxNiArMjE5NSwxNiBAQAogCQkJfQogCQkJLy8gbm9kZSBhbHJlYWR5IGhhcyBvbmUgcHJvcGVydHkgLSBnZXR0aW5nIGl0cyBzZWNvbmQKIAkJCS8vIGNvbnZlcnQgdG8gbW9yZSBmbGV4aWJsZSByZXByZXNlbnRhdGlvbgotCQkJSGFzaE1hcCBtID0gbmV3IEhhc2hNYXAoMik7CisJCQlNYXAgbSA9IG5ldyBIYXNoTWFwKDMpOwogCQkJbS5wdXQodGhpcy5wcm9wZXJ0eTEsIHRoaXMucHJvcGVydHkyKTsKIAkJCW0ucHV0KHByb3BlcnR5TmFtZSwgZGF0YSk7CiAJCQl0aGlzLnByb3BlcnR5MSA9IG07CiAJCQl0aGlzLnByb3BlcnR5MiA9IG51bGw7CiAJCQlyZXR1cm47CiAJCX0KLQkJCQorCiAJCS8vIG5vZGUgaGFzIHR3byBvciBtb3JlIHByb3BlcnRpZXMKLQkJSGFzaE1hcCBtID0gKEhhc2hNYXApIHRoaXMucHJvcGVydHkxOworCQlNYXAgbSA9IChNYXApIHRoaXMucHJvcGVydHkxOwogCQlpZiAoZGF0YSA9PSBudWxsKSB7CiAJCQltLnJlbW92ZShwcm9wZXJ0eU5hbWUpOwogCQkJLy8gY2hlY2sgZm9yIGp1c3Qgb25lIHByb3BlcnR5IGxlZnQKQEAgLTIxODUsOSArMjIyMyw5IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdGFibGUgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBub2RlIHdpdGggCisJICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdGFibGUgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBub2RlIHdpdGgKIAkgKiBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdGFibGUgb2YgcHJvcGVydHkgdmFsdWVzIGtleWVkIGJ5IHByb3BlcnR5IG5hbWUKIAkgKiAgIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+T2JqZWN0PC9jb2RlPikKIAkgKi8KQEAgLTIxOTUsMTIgKzIyMzMsMTIgQEAKIAkJaWYgKHRoaXMucHJvcGVydHkxID09IG51bGwpIHsKIAkJCS8vIG5vZGUgaGFzIG5vIHByb3BlcnRpZXMgYXQgYWxsCiAJCQlyZXR1cm4gVU5NT0RJRklBQkxFX0VNUFRZX01BUDsKLQkJfSAKKwkJfQogCQlpZiAodGhpcy5wcm9wZXJ0eTEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKIAkJCS8vIG5vZGUgaGFzIGEgc2luZ2xlIHByb3BlcnR5CiAJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKHRoaXMucHJvcGVydHkxLCB0aGlzLnByb3BlcnR5Mik7CiAJCX0KLQkJCisKIAkJLy8gbm9kZSBoYXMgdHdvIG9yIG1vcmUgcHJvcGVydGllcwogCQlpZiAodGhpcy5wcm9wZXJ0eTIgPT0gbnVsbCkgewogCQkJdGhpcy5wcm9wZXJ0eTIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoKE1hcCkgdGhpcy5wcm9wZXJ0eTEpOwpAQCAtMjIwOCw3ICsyMjQ2LDcgQEAKIAkJLy8gcHJvcGVydHkyIGlzIHVubW9kaWZpYWJsZSB3cmFwcGVyIGZvciBtYXAgaW4gcHJvcGVydHkxCiAJCXJldHVybiAoTWFwKSB0aGlzLnByb3BlcnR5MjsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgogCSAqIDxwPgpAQCAtMjIxOCw3ICsyMjU2LDcgQEAKIAkgKiBUaGUgZmxhZ3MgYXJlIHRoZSBiaXR3aXNlLW9yIG9mIGluZGl2aWR1YWwgZmxhZ3MuCiAJICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CiAJICogPHVsPgotCSAqIDxsaT57QGxpbmsgI01BTEZPUk1FRH0gLSBpbmRpY2F0ZXMgbm9kZSBpcyBzeW50YWN0aWNhbGx5IAorCSAqIDxsaT57QGxpbmsgI01BTEZPUk1FRH0gLSBpbmRpY2F0ZXMgbm9kZSBpcyBzeW50YWN0aWNhbGx5CiAJICogICBtYWxmb3JtZWQ8L2xpPgogCSAqIDxsaT57QGxpbmsgI09SSUdJTkFMfSAtIGluZGljYXRlcyBvcmlnaW5hbCBub2RlCiAJICogY3JlYXRlZCBieSBBU1RQYXJzZXI8L2xpPgpAQCAtMjIyOSwyMSArMjI2NywyMSBAQAogCSAqIDwvdWw+CiAJICogT3RoZXIgYml0IHBvc2l0aW9ucyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYml0d2lzZS1vciBvZiBpbmRpdmlkdWFsIGZsYWdzCiAJICogQHNlZSAjc2V0RmxhZ3MoaW50KQogCSAqLwogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0RmxhZ3MoKSB7CiAJCXJldHVybiB0aGlzLnR5cGVBbmRGbGFncyAmIDB4RkZGRjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlIHRvIHRoZSBnaXZlbiB2YWx1ZS4KIAkgKiA8cD4KIAkgKiBUaGUgZmxhZ3MgYXJlIHRoZSBiaXR3aXNlLW9yIG9mIGluZGl2aWR1YWwgZmxhZ3MuCiAJICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CiAJICogPHVsPgotCSAqIDxsaT57QGxpbmsgI01BTEZPUk1FRH0gLSBpbmRpY2F0ZXMgbm9kZSBpcyBzeW50YWN0aWNhbGx5IAorCSAqIDxsaT57QGxpbmsgI01BTEZPUk1FRH0gLSBpbmRpY2F0ZXMgbm9kZSBpcyBzeW50YWN0aWNhbGx5CiAJICogICBtYWxmb3JtZWQ8L2xpPgogCSAqIDxsaT57QGxpbmsgI09SSUdJTkFMfSAtIGluZGljYXRlcyBvcmlnaW5hbCBub2RlCiAJICogY3JlYXRlZCBieSBBU1RQYXJzZXI8L2xpPgpAQCAtMjI1OSw3ICsyMjk3LDcgQEAKIAkgKiBwcm9wZXJ0eSBvZiB0aGUgbm9kZSwgYW5kIGNhbiBiZSBjaGFuZ2VkIGV2ZW4gaWYgdGhlCiAJICogbm9kZSBpcyBtYXJrZWQgYXMgcHJvdGVjdGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmbGFncyB0aGUgYml0d2lzZS1vciBvZiBpbmRpdmlkdWFsIGZsYWdzCiAJICogQHNlZSAjZ2V0RmxhZ3MoKQogCSAqLwpAQCAtMjI3NCw0MyArMjMxMiw0MyBAQAogCSAqIFRoZSB2YWx1ZXMgYXJlIHNtYWxsIHBvc2l0aXZlIGludGVnZXJzLCBzdWl0YWJsZSBmb3IgdXNlIGluIHN3aXRjaCBzdGF0ZW1lbnRzLgogCSAqIDxwPgogCSAqIEZvciBlYWNoIGNvbmNyZXRlIG5vZGUgdHlwZSB0aGVyZSBpcyBhIHVuaXF1ZSBub2RlIHR5cGUgY29uc3RhbnQgKG5hbWUKLQkgKiBhbmQgdmFsdWUpLiBUaGUgdW5pcXVlIG5vZGUgdHlwZSBjb25zdGFudCBmb3IgYSBjb25jcmV0ZSBub2RlIHR5cGUgc3VjaCBhcyAKKwkgKiBhbmQgdmFsdWUpLiBUaGUgdW5pcXVlIG5vZGUgdHlwZSBjb25zdGFudCBmb3IgYSBjb25jcmV0ZSBub2RlIHR5cGUgc3VjaCBhcwogCSAqIDxjb2RlPkNhc3RFeHByZXNzaW9uPC9jb2RlPiBpcyA8Y29kZT5BU1ROb2RlLkNBU1RfRVhQUkVTU0lPTjwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiBvbmUgb2YgdGhlIG5vZGUgdHlwZSBjb25zdGFudHMKIAkgKi8KIAlwdWJsaWMgZmluYWwgaW50IGdldE5vZGVUeXBlKCkgewogCQlyZXR1cm4gdGhpcy50eXBlQW5kRmxhZ3MgPj4+IDE2OwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGludGVnZXIgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgdGhpcyBjb25jcmV0ZSBBU1Qgbm9kZS4KIAkgKiBUaGUgdmFsdWVzIGFyZSBzbWFsbCBwb3NpdGl2ZSBpbnRlZ2Vycywgc3VpdGFibGUgZm9yIHVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50cy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlVHlwZSBvbmUgb2YgdGhlIG5vZGUgdHlwZSBjb25zdGFudHMKIAkgKi8KIAlwcml2YXRlIHZvaWQgc2V0Tm9kZVR5cGUoaW50IG5vZGVUeXBlKSB7CiAJCWludCBvbGQgPSB0aGlzLnR5cGVBbmRGbGFncyAmIDB4RkZGRjAwMDA7CiAJCXRoaXMudHlwZUFuZEZsYWdzID0gb2xkIHwgKG5vZGVUeXBlIDw8IDE2KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgdGhpcyBjb25jcmV0ZSBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGlzIGludGVybmFsIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBlYWNoIG9mIHRoZQogCSAqIGNvbmNyZXRlIG5vZGUgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgbm9kZSB0eXBlIGNvbnN0YW50cwogCSAqLwogCWFic3RyYWN0IGludCBnZXROb2RlVHlwZTAoKTsKLQkKKwogCS8qKgogCSAqIFRoZSA8Y29kZT5BU1ROb2RlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPk9iamVjdDwvY29kZT4KIAkgKiBtZXRob2QgdXNlcyBvYmplY3QgaWRlbnRpdHkgKD09KS4gVXNlIDxjb2RlPnN1YnRyZWVNYXRjaDwvY29kZT4gdG8KIAkgKiBjb21wYXJlIHR3byBzdWJ0cmVlcyBmb3IgZXF1YWxpdHkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gb2JqIHtAaW5oZXJpdERvY30KIAkgKiBAcmV0dXJuIHtAaW5oZXJpdERvY30KIAkgKiBAc2VlICNzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpCkBAIC0yMzE4LDcgKzIzNTYsNyBAQAogCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCXJldHVybiB0aGlzID09IG9iajsgLy8gZXF1aXZhbGVudCB0byBPYmplY3QuZXF1YWxzCiAJfQotCQorCiAJLyoKIAkgKiAobm9uLUphdmFkb2MpCiAJICogVGhpcyBtYWtlcyBpdCBjb25zaXN0ZW50IHdpdGggdGhlIGZhY3QgdGhhdCBhIGVxdWFscyBtZXRob2RzIGhhcyBiZWVuIHByb3ZpZGVkLgpAQCAtMjMzMSwxNiArMjM2OSwxNiBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhlIGdpdmVuIG5vZGUgbWF0Y2hlcyB0aGUKIAkgKiBnaXZlbiBvdGhlciBvYmplY3QgYXMgZGVjaWRlZCBieSB0aGUgZ2l2ZW4gbWF0Y2hlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtYXRjaGVyIHRoZSBtYXRjaGVyCiAJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yCiAJICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CiAJCXJldHVybiBzdWJ0cmVlTWF0Y2gwKG1hdGNoZXIsIG90aGVyKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBnaXZlbiBub2RlIG1hdGNoZXMgdGhlCiAJICogZ2l2ZW4gb3RoZXIgb2JqZWN0IGFzIGRlY2lkZWQgYnkgdGhlIGdpdmVuIG1hdGNoZXIuCkBAIC0yMzQ4LDE4ICsyMzg2LDE4IEBACiAJICogVGhpcyBpbnRlcm5hbCBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gZWFjaCBvZiB0aGUKIAkgKiBjb25jcmV0ZSBub2RlIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1hdGNoZXIgdGhlIG1hdGNoZXIKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2gKIAkgKi8KIAlhYnN0cmFjdCBib29sZWFuIHN1YnRyZWVNYXRjaDAoQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgc3VidHJlZSBvZiBBU1Qgbm9kZXMgcm9vdGVkIGF0IHRoZQogCSAqIGdpdmVuIG5vZGUuIFRoZSByZXN1bHRpbmcgbm9kZXMgYXJlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QsCi0JICogd2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBBU1RzIG9mIHRoZSBnaXZlbiBub2RlLiAKKwkgKiB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIEFTVHMgb2YgdGhlIGdpdmVuIG5vZGUuCiAJICogRXZlbiBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgYSBwYXJlbnQsIHRoZSByZXN1bHQgbm9kZSB3aWxsIGJlIHVucGFyZW50ZWQuCiAJICogPHA+CiAJICogU291cmNlIHJhbmdlIGluZm9ybWF0aW9uIG9uIHRoZSBvcmlnaW5hbCBub2RlcyBpcyBhdXRvbWF0aWNhbGx5IGNvcGllZCB0byB0aGUgbmV3CkBAIC0yMzY5LDcgKzI0MDcsNyBAQAogCSAqIFRoZSBub2RlJ3MgPGNvZGU+QVNUPC9jb2RlPiBhbmQgdGhlIHRhcmdldCA8Y29kZT5BU1Q8L2NvZGU+IG11c3Qgc3VwcG9ydAogICAgICAqIHRoZSBzYW1lIEFQSSBsZXZlbC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhlIG5vZGVzIGluIHRoZSByZXN1bHQKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBjb3B5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQHJldHVybiB0aGUgY29waWVkIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPm5vZGU8L2NvZGU+CkBAIC0yMzkyLDE5ICsyNDMwLDE5IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgc3VidHJlZXMgb2YgQVNUIG5vZGVzIHJvb3RlZCBhdCB0aGUKIAkgKiBnaXZlbiBsaXN0IG9mIG5vZGVzLiBUaGUgcmVzdWx0aW5nIG5vZGVzIGFyZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULAotCSAqIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgQVNUcyBvZiB0aGUgbm9kZXMgaW4gdGhlIGxpc3QuIAorCSAqIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgQVNUcyBvZiB0aGUgbm9kZXMgaW4gdGhlIGxpc3QuCiAJICogRXZlbiBpZiB0aGUgbm9kZXMgaW4gdGhlIGxpc3QgaGF2ZSBwYXJlbnRzLCB0aGUgbm9kZXMgaW4gdGhlIHJlc3VsdAogCSAqIHdpbGwgYmUgdW5wYXJlbnRlZC4KIAkgKiA8cD4KIAkgKiBTb3VyY2UgcmFuZ2UgaW5mb3JtYXRpb24gb24gdGhlIG9yaWdpbmFsIG5vZGVzIGlzIGF1dG9tYXRpY2FsbHkgY29waWVkIHRvIHRoZSBuZXcKIAkgKiBub2Rlcy4gQ2xpZW50IHByb3BlcnRpZXMgKDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+KSBhcmUgbm90IGNhcnJpZWQgb3Zlci4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhlIG5vZGVzIGluIHRoZSByZXN1bHQKIAkgKiBAcGFyYW0gbm9kZXMgdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gY29weQotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkFTVE5vZGU8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBBU1ROb2RlfSkKIAkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvcGllZCBzdWJ0cmVlcwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkFTVE5vZGU8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBBU1ROb2RlfSkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgY29weVN1YnRyZWVzKEFTVCB0YXJnZXQsIExpc3Qgbm9kZXMpIHsKIAkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG5vZGVzLnNpemUoKSk7CkBAIC0yNDE5LDE5ICsyNDU3LDE5IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgc3VidHJlZSBvZiBBU1Qgbm9kZXMgcm9vdGVkIGF0IHRoaXMgbm9kZS4KIAkgKiBUaGUgcmVzdWx0aW5nIG5vZGVzIGFyZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULCB3aGljaCBtYXkgYmUgZGlmZmVyZW50Ci0JICogZnJvbSB0aGUgQVNUIG9mIHRoaXMgbm9kZS4gRXZlbiBpZiB0aGlzIG5vZGUgaGFzIGEgcGFyZW50LCB0aGUgCisJICogZnJvbSB0aGUgQVNUIG9mIHRoaXMgbm9kZS4gRXZlbiBpZiB0aGlzIG5vZGUgaGFzIGEgcGFyZW50LCB0aGUKIAkgKiByZXN1bHQgbm9kZSB3aWxsIGJlIHVucGFyZW50ZWQuCiAJICogPHA+CiAJICogVGhpcyBtZXRob2QgcmVwb3J0cyBwcmUtIGFuZCBwb3N0LWNsb25lIGV2ZW50cywgYW5kIGRpc3BhdGNoZXMKIAkgKiB0byA8Y29kZT5jbG9uZTAoQVNUKTwvY29kZT4gd2hpY2ggaXMgcmVpbXBsZW1lbnRlZCBpbiBub2RlIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHRhcmdldCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoZSBub2RlcyBpbiB0aGUgcmVzdWx0CiAJICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBjb3BpZXMgc3VidHJlZQogCSAqLwogCWZpbmFsIEFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQl0aGlzLmFzdC5wcmVDbG9uZU5vZGVFdmVudCh0aGlzKTsKLQkJQVNUTm9kZSBjID0gdGhpcy5jbG9uZTAodGFyZ2V0KTsKKwkJQVNUTm9kZSBjID0gY2xvbmUwKHRhcmdldCk7CiAJCXRoaXMuYXN0LnBvc3RDbG9uZU5vZGVFdmVudCh0aGlzLCBjKTsKIAkJcmV0dXJuIGM7CiAJfQpAQCAtMjQzOSw3ICsyNDc3LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSBzdWJ0cmVlIG9mIEFTVCBub2RlcyByb290ZWQgYXQgdGhpcyBub2RlLgogCSAqIFRoZSByZXN1bHRpbmcgbm9kZXMgYXJlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QsIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQKLQkgKiBmcm9tIHRoZSBBU1Qgb2YgdGhpcyBub2RlLiBFdmVuIGlmIHRoaXMgbm9kZSBoYXMgYSBwYXJlbnQsIHRoZSAKKwkgKiBmcm9tIHRoZSBBU1Qgb2YgdGhpcyBub2RlLiBFdmVuIGlmIHRoaXMgbm9kZSBoYXMgYSBwYXJlbnQsIHRoZQogCSAqIHJlc3VsdCBub2RlIHdpbGwgYmUgdW5wYXJlbnRlZC4KIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCkBAIC0yNDUyLDE3ICsyNDkwLDE3IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIG1ldGhvZCBpcyBwYWNrYWdlLXByaXZhdGUsIHNvIHRoYXQgdGhlIGltcGxlbWVudGF0aW9ucwogCSAqIG9mIHRoaXMgbWV0aG9kIGluIGVhY2ggb2YgdGhlIGNvbmNyZXRlIEFTVCBub2RlIHR5cGVzIGRvIG5vdAotCSAqIGNsdXR0ZXIgdXAgdGhlIEFQSSBkb2MuIAorCSAqIGNsdXR0ZXIgdXAgdGhlIEFQSSBkb2MuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHRhcmdldCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoZSBub2RlcyBpbiB0aGUgcmVzdWx0CiAJICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBjb3BpZXMgc3VidHJlZQogCSAqLwogCWFic3RyYWN0IEFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpOwotCQorCiAJLyoqCiAJICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmlzaXRvciBpcyBudWxsCiAJICovCkBAIC0yNDcxLDkgKzI1MDksMTAgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQkvLyBiZWdpbiB3aXRoIHRoZSBnZW5lcmljIHByZS12aXNpdAotCQl2aXNpdG9yLnByZVZpc2l0KHRoaXMpOwotCQkvLyBkeW5hbWljIGRpc3BhdGNoIHRvIGludGVybmFsIG1ldGhvZCBmb3IgdHlwZS1zcGVjaWZpYyB2aXNpdC9lbmRWaXNpdAotCQlhY2NlcHQwKHZpc2l0b3IpOworCQlpZiAodmlzaXRvci5wcmVWaXNpdDIodGhpcykpIHsKKwkJCS8vIGR5bmFtaWMgZGlzcGF0Y2ggdG8gaW50ZXJuYWwgbWV0aG9kIGZvciB0eXBlLXNwZWNpZmljIHZpc2l0L2VuZFZpc2l0CisJCQlhY2NlcHQwKHZpc2l0b3IpOworCQl9CiAJCS8vIGVuZCB3aXRoIHRoZSBnZW5lcmljIHBvc3QtdmlzaXQKIAkJdmlzaXRvci5wb3N0VmlzaXQodGhpcyk7CiAJfQpAQCAtMjQ5OCw3ICsyNTM3LDcgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciAoPGNvZGU+YWNjZXB0PC9jb2RlPikgdGFrZSBjYXJlcyBvZiBpbnZva2luZwogCSAqIDxjb2RlPnZpc2l0b3IucHJlVmlzaXQodGhpcyk8L2NvZGU+IGFuZCA8Y29kZT52aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0CiAJICovCiAJYWJzdHJhY3Qgdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcik7CkBAIC0yNTExLDcgKzI1NTAsNyBAQAogCSAqIHRvIDxjb2RlPmNoaWxkLmFjY2VwdCh2aXNpdG9yKTwvY29kZT4gaWYgPGNvZGU+Y2hpbGQ8L2NvZGU+CiAJICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAogCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgQVNUIG5vZGUgdG8gZGlzcGF0Y2ggdG9vLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqICAgIGlmIG5vbmUKQEAgLTI1MjUsMTMgKzI1NjQsMTMgQEAKIAogCS8qKgogCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgZ2l2ZW4gbGl2ZSBsaXN0IG9mCi0JICogY2hpbGQgbm9kZXMuIAorCSAqIGNoaWxkIG5vZGVzLgogCSAqIDxwPgogCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgdXNlZCBieSB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mCiAJICogPGNvZGU+YWNjZXB0PC9jb2RlPiB0byB0cmF2ZXJzZSBsaXN0LXZhbHVlcyBwcm9wZXJ0aWVzOyBpdAogCSAqIGVuY2Fwc3VsYXRlcyB0aGUgcHJvcGVyIGhhbmRsaW5nIG9mIG9uLXRoZS1mbHkgY2hhbmdlcyB0byB0aGUgbGlzdC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKIAkgKiBAcGFyYW0gY2hpbGRyZW4gdGhlIGNoaWxkIEFTVCBub2RlIHRvIGRpc3BhdGNoIHRvbywgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgICBpZiBub25lCkBAIC0yNTU4LDcgKzI1OTcsNyBAQAogCSAqIFNlZSB7QGxpbmsgQVNUUGFyc2VyI3NldEtpbmQoaW50KX0gZm9yIGRldGFpbHMKIAkgKiBvbiBwcmVjaXNlbHkgd2hlcmUgc291cmNlIHJhbmdlcyBiZWdpbiBhbmQgZW5kLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4LCBvciA8Y29kZT4tMTwvY29kZT4KIAkgKiAgICBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMgbm9kZQogCSAqIEBzZWUgI2dldExlbmd0aCgpCkBAIC0yNTc2LDcgKzI2MTUsNyBAQAogCSAqIFNlZSB7QGxpbmsgQVNUUGFyc2VyI3NldEtpbmQoaW50KX0gbWV0aG9kcyBmb3IgZGV0YWlscwogCSAqIG9uIHByZWNpc2VseSB3aGVyZSBzb3VyY2UgcmFuZ2VzIGJlZ2luIGFuZCBlbmQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIChwb3NzaWJseSAwKSBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+CiAJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG5vZGUKIAkgKiBAc2VlICNnZXRTdGFydFBvc2l0aW9uKCkKQEAgLTI1OTMsMTIgKzI2MzIsMTIgQEAKIAkgKiBTZWUge0BsaW5rIEFTVFBhcnNlciNzZXRLaW5kKGludCl9IGZvciBkZXRhaWxzCiAJICogb24gcHJlY2lzZWx5IHdoZXJlIHNvdXJjZSByYW5nZXMgYXJlIHN1cHBvc2VkIHRvIGJlZ2luIGFuZCBlbmQuCiAJICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIGEgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXgsIAotCSAqICAgIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgCisJICoKKwkgKiBAcGFyYW0gc3RhcnRQb3NpdGlvbiBhIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4LAorCSAqICAgIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMKIAkgKiAgICBhdmFpbGFibGUgZm9yIHRoaXMgbm9kZQotCSAqIEBwYXJhbSBsZW5ndGggYSAocG9zc2libHkgMCkgbGVuZ3RoLCAKLQkgKiAgICBvciA8Y29kZT4wPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgCisJICogQHBhcmFtIGxlbmd0aCBhIChwb3NzaWJseSAwKSBsZW5ndGgsCisJICogICAgb3IgPGNvZGU+MDwvY29kZT4gaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkCiAJICogICAgZm9yIHRoaXMgbm9kZQogCSAqIEBzZWUgI2dldFN0YXJ0UG9zaXRpb24oKQogCSAqIEBzZWUgI2dldExlbmd0aCgpCkBAIC0yNjE3LDEyICsyNjU2LDEyIEBACiAJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CiAJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcKIAkgKiBwdXJwb3NlcyBvbmx5LgotCSAqIAotCSAqIEByZXR1cm4gYSBkZWJ1ZyBzdHJpbmcgCisJICoKKwkgKiBAcmV0dXJuIGEgZGVidWcgc3RyaW5nCiAJICovCiAJcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTI2MzgsNTkgKzI2NzcsNTkgQEAKIAkJfQogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBwcm9kdWNlZCBieSB0aGUgc3RhbmRhcmQKIAkgKiA8Y29kZT5PYmplY3QudG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGVidWcgc3RyaW5nIAorCSAqCisJICogQHJldHVybiBhIGRlYnVnIHN0cmluZwogCSAqLwogCWZpbmFsIFN0cmluZyBzdGFuZGFyZFRvU3RyaW5nKCkgewogCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBcHBlbmRzIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIHRvIHRoZSBnaXZlbiBzdHJpbmcgYnVmZmVyLgogCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5BU1ROb2RlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBwcmludHMgb3V0IHRoZSBlbnRpcmUgCisJICogVGhlIDxjb2RlPkFTVE5vZGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHByaW50cyBvdXQgdGhlIGVudGlyZQogCSAqIHN1YnRyZWUuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYSBtb3JlIHN1Y2NpbmN0IHJlcHJlc2VudGF0aW9uLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBidWZmZXIgdGhlIHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRvCiAJICovCiAJdm9pZCBhcHBlbmREZWJ1Z1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAJCS8vIHByaW50IHRoZSBzdWJ0cmVlIGJ5IGRlZmF1bHQKIAkJYXBwZW5kUHJpbnRTdHJpbmcoYnVmZmVyKTsKIAl9Ci0JCQorCiAJLyoqCiAJICogQXBwZW5kcyBhIHN0YW5kYXJkIEphdmEgc291cmNlIGNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzdWJ0cmVlIHRvIHRoZSBnaXZlbgogCSAqIHN0cmluZyBidWZmZXIuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bwogCSAqLwogCWZpbmFsIHZvaWQgYXBwZW5kUHJpbnRTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogCQlOYWl2ZUFTVEZsYXR0ZW5lciBwcmludGVyID0gbmV3IE5haXZlQVNURmxhdHRlbmVyKCk7Ci0JCXRoaXMuYWNjZXB0KHByaW50ZXIpOworCQlhY2NlcHQocHJpbnRlcik7CiAJCWJ1ZmZlci5hcHBlbmQocHJpbnRlci5nZXRSZXN1bHQoKSk7CiAJfQotCQorCiAJLyoqCiAJICogRXN0aW1hdGUgb2Ygc2l6ZSBvZiBhbiBvYmplY3QgaGVhZGVyIGluIGJ5dGVzLgogCSAqLwogCXN0YXRpYyBmaW5hbCBpbnQgSEVBREVSUyA9IDEyOwotCQorCiAJLyoqCi0JICogQXBwcm94aW1hdGUgYmFzZSBzaXplIG9mIGFuIEFTVCBub2RlIGluc3RhbmNlIGluIGJ5dGVzLCAKKwkgKiBBcHByb3hpbWF0ZSBiYXNlIHNpemUgb2YgYW4gQVNUIG5vZGUgaW5zdGFuY2UgaW4gYnl0ZXMsCiAJICogaW5jbHVkaW5nIG9iamVjdCBoZWFkZXIgYW5kIGluc3RhbmNlIGZpZWxkcy4KIAkgKiBUaGF0IGlzLCBIRUFERVJTICsgKCMgaW5zdGFuY2UgdmFycyBpbiBBU1ROb2RlKSo0LgogCSAqLwogCXN0YXRpYyBmaW5hbCBpbnQgQkFTRV9OT0RFX1NJWkUgPSBIRUFERVJTICsgNyAqIDQ7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50LCBpbiBieXRlcywKIAkgKiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIG1lYXN1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIHN0cmluZyBvYmplY3QgaW4gYnl0ZXMsIG9yCiAJICogICAwIGlmIHRoZSBzdHJpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4KQEAgLTI3MDYsMjYgKzI3NDUsMjYgQEAKIAkJfQogCQlyZXR1cm4gc2l6ZTsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IGluIGJ5dGVzIG9mIHRoZSBlbnRpcmUgCisJICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbWVtb3J5IGZvb3RwcmludCBpbiBieXRlcyBvZiB0aGUgZW50aXJlCiAJICogc3VidHJlZSByb290ZWQgYXQgdGhpcyBub2RlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIHN1YnRyZWUgaW4gYnl0ZXMKIAkgKi8KIAlwdWJsaWMgZmluYWwgaW50IHN1YnRyZWVCeXRlcygpIHsKIAkJcmV0dXJuIHRyZWVTaXplKCk7CiAJfQotCQkKKwogCS8qKgotCSAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG1lbW9yeSBmb290cHJpbnQgaW4gYnl0ZXMgb2YgdGhlIGVudGlyZSAKKwkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IGluIGJ5dGVzIG9mIHRoZSBlbnRpcmUKIAkgKiBzdWJ0cmVlIHJvb3RlZCBhdCB0aGlzIG5vZGUuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIG1ldGhvZCBpcyBwYWNrYWdlLXByaXZhdGUsIHNvIHRoYXQgdGhlIGltcGxlbWVudGF0aW9ucwogCSAqIG9mIHRoaXMgbWV0aG9kIGluIGVhY2ggb2YgdGhlIGNvbmNyZXRlIEFTVCBub2RlIHR5cGVzIGRvIG5vdAogCSAqIGNsdXR0ZXIgdXAgdGhlIEFQSSBkb2MuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIHN1YnRyZWUgaW4gYnl0ZXMKIAkgKi8KIAlhYnN0cmFjdCBpbnQgdHJlZVNpemUoKTsKQEAgLTI3MzMsNyArMjc3Miw3IEBACiAJLyoqCiAJICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbWVtb3J5IGZvb3RwcmludCBvZiB0aGlzIG5vZGUgaW4gYnl0ZXMuCiAJICogVGhlIGVzdGltYXRlIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IGNoaWxkIG5vZGVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIG5vZGUgaW4gYnl0ZXMKIAkgKi8KIAlhYnN0cmFjdCBpbnQgbWVtU2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUUGFyc2VyLmphdmEKaW5kZXggNzVmNjYxMy4uNzE0ZTZkYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDcgKzEwLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKQEAgLTI2LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyeVNjYW5uZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyeVNjYW5uZXJEYXRhOwpAQCAtNDQsNiArNDksMTAgQEAKICAqIGNoYXJbXSBzb3VyY2UgPSAuLi47CiAgKiBBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7ICAvLyBoYW5kbGVzIEpESyAxLjAsIDEuMSwgMS4yLCAxLjMsIDEuNCwgMS41LCAxLjYKICAqIHBhcnNlci5zZXRTb3VyY2Uoc291cmNlKTsKKyAqIC8vIEluIG9yZGVyIHRvIHBhcnNlIDEuNSBjb2RlLCBzb21lIGNvbXBpbGVyIG9wdGlvbnMgbmVlZCB0byBiZSBzZXQgdG8gMS41CisgKiBNYXAgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKKyAqIEphdmFDb3JlLnNldENvbXBsaWFuY2VPcHRpb25zKEphdmFDb3JlLlZFUlNJT05fMV81LCBvcHRpb25zKTsKKyAqIHBhcnNlci5zZXRDb21waWxlck9wdGlvbnMob3B0aW9ucyk7CiAgKiBDb21waWxhdGlvblVuaXQgcmVzdWx0ID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKICAqIDwvcHJlPgogICogT25jZSBhIGNvbmZpZ3VyZWQgcGFyc2VyIGluc3RhbmNlIGhhcyBiZWVuIHVzZWQgdG8gY3JlYXRlIGFuIEFTVCwKQEAgLTU5LDEzICs2OCwxNSBAQAogICogdG8gYSBzcGVjaWZpZWQge0BsaW5rcGxhaW4gI3NldFNvdXJjZVJhbmdlKGludCxpbnQpIHN1YnJhbmdlfS48L2xpPgogICogPGxpPldoZXRoZXIge0BsaW5rcGxhaW4gI3NldFJlc29sdmVCaW5kaW5ncyhib29sZWFuKSBiaW5kaW5nc30gd2lsbCBiZSBjcmVhdGVkLjwvbGk+CiAgKiA8bGk+V2hpY2gge0BsaW5rcGxhaW4gI3NldFdvcmtpbmdDb3B5T3duZXIoV29ya2luZ0NvcHlPd25lcikKLSAqIHdvcmtpbmcgc2V0IG93bmVyfSB0byB1c2Ugd2hlbiByZXNvbHZpbmcgYmluZGluZ3MpLjwvbGk+CisgKiB3b3JraW5nIGNvcHkgb3duZXJ9IHRvIHVzZSB3aGVuIHJlc29sdmluZyBiaW5kaW5ncy48L2xpPgogICogPGxpPkEgaHlwb3RoZXRpY2FsIHtAbGlua3BsYWluICNzZXRVbml0TmFtZShTdHJpbmcpIGNvbXBpbGF0aW9uIHVuaXQgZmlsZSBuYW1lfQogICogYW5kIHtAbGlua3BsYWluICNzZXRQcm9qZWN0KElKYXZhUHJvamVjdCkgSmF2YSBwcm9qZWN0fQogICogZm9yIGxvY2F0aW5nIGEgcmF3IHNvdXJjZSBzdHJpbmcgaW4gdGhlIEphdmEgbW9kZWwgKHdoZW4KICAqIHJlc29sdmluZyBiaW5kaW5ncyk8L2xpPgogICogPGxpPldoaWNoIHtAbGlua3BsYWluICNzZXRDb21waWxlck9wdGlvbnMoTWFwKSBjb21waWxlciBvcHRpb25zfQotICogdG8gdXNlLjwvbGk+CisgKiB0byB1c2UuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgdG8gdXNlIGlmIHRoZSBwYXJzaW5nL3NjYW5uaW5nIG9mIHRoZSBzb3VyY2UgY29kZSByZXF1aXJlcyBhCisgKiBkaWZmZXJlbnQgdmVyc2lvbiB0aGFuIHRoZSBkZWZhdWx0IG9mIHRoZSB3b3Jrc3BhY2UuIEZvciBleGFtcGxlLCB0aGUgd29ya3NwYWNlIGRlZmF1bHRzIGFyZSAxLjQgYW5kCisgKiB5b3Ugd2FudCB0byBjcmVhdGUgYW4gQVNUIGZvciBhIHNvdXJjZSBjb2RlIHRoYXQgaXMgdXNpbmcgMS41IGNvbnN0cnVjdHMuPC9saT4KICAqIDxsaT5XaGV0aGVyIHRvIHBhcnNlIGp1c3Qge0BsaW5rcGxhaW4gI3NldEtpbmQoaW50KSBhbiBleHByZXNzaW9uLCBzdGF0ZW1lbnRzLAogICogb3IgYm9keSBkZWNsYXJhdGlvbnN9IHJhdGhlciB0aGFuIGFuIGVudGlyZSBjb21waWxhdGlvbiB1bml0LjwvbGk+CiAgKiA8bGk+V2hldGhlciB0byByZXR1cm4gYSB7QGxpbmtwbGFpbiAjc2V0Rm9jYWxQb3NpdGlvbihpbnQpIGFicmlkZ2VkIEFTVH0KQEAgLTc0LDYgKzg1LDcgQEAKICAqIDwvcD4KICAqCiAgKiBAc2luY2UgMy4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEFTVFBhcnNlciB7CiAKQEAgLTEyNywyNyArMTM5LDcgQEAKIAkgKiBDb21waWxlciBvcHRpb25zLiBEZWZhdWx0cyB0byBKYXZhQ29yZS5nZXRPcHRpb25zKCkuCiAJICovCiAJcHJpdmF0ZSBNYXAgY29tcGlsZXJPcHRpb25zOwotCi0JLyoqCi0JICogUmVxdWVzdCBmb3IgYmluZGluZ3MuIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzOwotCi0JLyoqCi0JICogUmVxdWVzdCBmb3IgYSBwYXJ0aWFsIEFTVC4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqLwotCXByaXZhdGUgYm9vbGVhbiBwYXJ0aWFsID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGZvciBhIHN0YXRlbWVudHMgcmVjb3ZlcnkuIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RhdGVtZW50c1JlY292ZXJ5OwotCi0JLyoqCi0gICAgICogUmVxdWVzdCBmb3IgYSBiaW5kaW5ncyByZWNvdmVyeS4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBiaW5kaW5nc1JlY292ZXJ5OwotCisJCiAgICAgLyoqCiAJICogVGhlIGZvY2FsIHBvaW50IGZvciBhIHBhcnRpYWwgQVNUIHJlcXVlc3QuCiAgICAgICogT25seSB1c2VkIHdoZW4gPGNvZGU+cGFydGlhbDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCkBAIC0xOTQsMjUgKzE4Niw4MCBAQAogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIERlZmF1bHRzIHRvIG5vbmUuCiAgICAgICovCiAJcHJpdmF0ZSBTdHJpbmcgdW5pdE5hbWUgPSBudWxsOworCQorCS8qKgorCSAqIENsYXNzcGF0aCBlbnRyaWVzIHRvIHVzZSB0byByZXNvbHZlIGJpbmRpbmdzIHdoZW4gbm8gamF2YSBwcm9qZWN0IGFyZSBhdmFpbGFibGUuCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBjbGFzc3BhdGhzOwogCi0gCS8qKgorCS8qKgorCSAqIFNvdXJjZXBhdGggZW50cmllcyB0byB1c2UgdG8gcmVzb2x2ZSBiaW5kaW5ncyB3aGVuIG5vIGphdmEgcHJvamVjdCBhcmUgYXZhaWxhYmxlLgorCSAqLworCXByaXZhdGUgU3RyaW5nW10gc291cmNlcGF0aHM7CisJCisJLyoqCisJICogRW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHNvdXJjZXBhdGhzIGVudHJpZXMuCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBzb3VyY2VwYXRoc0VuY29kaW5nczsKKwkKKwkvKioKKwkgKiBCaXRzIHVzZWQgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdmFsdWVzIGZyb20gQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIgdmFsdWVzLgorCSAqLworCXByaXZhdGUgaW50IGJpdHM7CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBwYXJzZXIgZm9yIHRoZSBnaXZlbiBBUEkgbGV2ZWwuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+CiAJICoKIAkgKiBAcGFyYW0gbGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZSBMRVZFTCBjb25zdGFudHMKLSAgICAgKiBkZWNsYXJlZCBvbiA8Y29kZT5BU1Q8L2NvZGU+CisJICogZGVjbGFyZWQgb24gPGNvZGU+QVNUPC9jb2RlPgogCSAqLwogCUFTVFBhcnNlcihpbnQgbGV2ZWwpIHsKLQkJaWYgKChsZXZlbCAhPSBBU1QuSkxTMl9JTlRFUk5BTCkKLQkJCSYmIChsZXZlbCAhPSBBU1QuSkxTMykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJc3dpdGNoKGxldmVsKSB7CisJCQljYXNlIEFTVC5KTFMyX0lOVEVSTkFMOgorCQkJY2FzZSBBU1QuSkxTMzoKKwkJCWNhc2UgQVNULkpMUzQ6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQl0aGlzLmFwaUxldmVsID0gbGV2ZWw7Ci0JICAgCWluaXRpYWxpemVEZWZhdWx0cygpOworCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKIAl9CiAKKwlwcml2YXRlIExpc3QgZ2V0Q2xhc3NwYXRoKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisJCU1haW4gbWFpbiA9IG5ldyBNYWluKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpLCBmYWxzZS8qc3lzdGVtRXhpdCovLCBudWxsLypvcHRpb25zKi8sIG51bGwvKnByb2dyZXNzKi8pOworCQlBcnJheUxpc3QgYWxsQ2xhc3NwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdHJ5IHsKKwkJCWlmICgodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuSU5DTFVERV9SVU5OSU5HX1ZNX0JPT1RDTEFTU1BBVEgpICE9IDApIHsKKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmNvbGxlY3RSdW5uaW5nVk1Cb290Y2xhc3NwYXRoKGFsbENsYXNzcGF0aHMpOworCQkJfQorCQkJaWYgKHRoaXMuc291cmNlcGF0aHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnNvdXJjZXBhdGhzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCVN0cmluZyBlbmNvZGluZyA9IHRoaXMuc291cmNlcGF0aHNFbmNvZGluZ3MgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnNvdXJjZXBhdGhzRW5jb2RpbmdzW2ldOworCQkJCQltYWluLnByb2Nlc3NQYXRoRW50cmllcygKKwkJCQkJCQlNYWluLkRFRkFVTFRfU0laRV9DTEFTU1BBVEgsCisJCQkJCQkJYWxsQ2xhc3NwYXRocywgdGhpcy5zb3VyY2VwYXRoc1tpXSwgZW5jb2RpbmcsIHRydWUsIGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAodGhpcy5jbGFzc3BhdGhzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jbGFzc3BhdGhzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCW1haW4ucHJvY2Vzc1BhdGhFbnRyaWVzKAorCQkJCQkJCU1haW4uREVGQVVMVF9TSVpFX0NMQVNTUEFUSCwKKwkJCQkJCQlhbGxDbGFzc3BhdGhzLCB0aGlzLmNsYXNzcGF0aHNbaV0sIG51bGwsIGZhbHNlLCBmYWxzZSk7CisJCQkJfQorCQkJfQorCQkJQXJyYXlMaXN0IHBlbmRpbmdFcnJvcnMgPSBtYWluLnBlbmRpbmdFcnJvcnM7CisJCQlpZiAocGVuZGluZ0Vycm9ycyAhPSBudWxsICYmIHBlbmRpbmdFcnJvcnMuc2l6ZSgpICE9IDApIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGVudmlyb25tZW50IHNldHRpbmdzIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgZW52aXJvbm1lbnQgc2V0dGluZ3MiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBhbGxDbGFzc3BhdGhzOworCX0KIAkvKioKIAkgKiBTZXRzIGFsbCB0aGUgc2V0dGluZyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KIAkgKi8KQEAgLTIyMCwzNiArMjY3LDc4IEBACiAJCXRoaXMuYXN0S2luZCA9IEtfQ09NUElMQVRJT05fVU5JVDsKIAkJdGhpcy5yYXdTb3VyY2UgPSBudWxsOwogCQl0aGlzLnR5cGVSb290ID0gbnVsbDsKLQkJdGhpcy5yZXNvbHZlQmluZGluZ3MgPSBmYWxzZTsKKwkJdGhpcy5iaXRzID0gMDsKIAkJdGhpcy5zb3VyY2VMZW5ndGggPSAtMTsKIAkJdGhpcy5zb3VyY2VPZmZzZXQgPSAwOwogCQl0aGlzLndvcmtpbmdDb3B5T3duZXIgPSBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZOwogCQl0aGlzLnVuaXROYW1lID0gbnVsbDsKIAkJdGhpcy5wcm9qZWN0ID0gbnVsbDsKLQkJdGhpcy5wYXJ0aWFsID0gZmFsc2U7CisJCXRoaXMuY2xhc3NwYXRocyA9IG51bGw7CisJCXRoaXMuc291cmNlcGF0aHMgPSBudWxsOworCQl0aGlzLnNvdXJjZXBhdGhzRW5jb2RpbmdzID0gbnVsbDsKIAkJTWFwIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7CiAJCW9wdGlvbnMucmVtb3ZlKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUyk7IC8vIG5vIG5lZWQgdG8gcGFyc2UgdGFzayB0YWdzCiAJCXRoaXMuY29tcGlsZXJPcHRpb25zID0gb3B0aW9uczsKIAl9CiAKLSAgICAvKioKLSAgICAgKiBSZXF1ZXN0cyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQgcGVyZm9ybSBiaW5kaW5ncyByZWNvdmVyeS4KLSAgICAgKiBXaGVuIGJpbmRpbmdzIHJlY292ZXJ5IGlzIGVuYWJsZWQgdGhlIGNvbXBpbGVyIHJldHVybnMgaW5jb21wbGV0ZSBiaW5kaW5ncy4KLSAgICAgKiA8cD4KLSAgICAgKiBEZWZhdWx0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+VGhpcyBzaG91bGQgYmUgc2V0IHRvIHRydWUgb25seSBpZiBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQuIEl0IGhhcyBubyBlZmZlY3QgaWYgdGhlcmUgaXMgbm8gYmluZGluZwotICAgICAqIHJlc29sdXRpb24uPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW5jb21wbGV0ZSBiaW5kaW5ncyBhcmUgZXhwZWN0ZWQsCi0gICAgICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG9ubHkgY29tcGxldGUgYmluZGluZ3MgYXJlIGV4cGVjdGVkLgotICAgICAqCi0gICAgICogQHNlZSBJQmluZGluZyNpc1JlY292ZXJlZCgpCi0gICAgICogQHNpbmNlIDMuMwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdzUmVjb3ZlcnkoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHRoaXMuYmluZGluZ3NSZWNvdmVyeSA9IGVuYWJsZWQ7Ci0gICAgfQorCS8qKgorCSAqIFJlcXVlc3RzIHRoYXQgdGhlIGNvbXBpbGVyIHNob3VsZCBwZXJmb3JtIGJpbmRpbmdzIHJlY292ZXJ5LgorCSAqIFdoZW4gYmluZGluZ3MgcmVjb3ZlcnkgaXMgZW5hYmxlZCB0aGUgY29tcGlsZXIgcmV0dXJucyBpbmNvbXBsZXRlIGJpbmRpbmdzLgorCSAqIDxwPgorCSAqIERlZmF1bHQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD5UaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBvbmx5IGlmIGJpbmRpbmdzIGFyZSByZXNvbHZlZC4gSXQgaGFzIG5vIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBiaW5kaW5nCisJICogcmVzb2x1dGlvbi48L3A+CisJICoKKwkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbmNvbXBsZXRlIGJpbmRpbmdzIGFyZSBleHBlY3RlZCwKKwkgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgb25seSBjb21wbGV0ZSBiaW5kaW5ncyBhcmUgZXhwZWN0ZWQuCisJICoKKwkgKiBAc2VlIElCaW5kaW5nI2lzUmVjb3ZlcmVkKCkKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHZvaWQgc2V0QmluZGluZ3NSZWNvdmVyeShib29sZWFuIGVuYWJsZWQpIHsKKwkJaWYgKGVuYWJsZWQpIHsKKwkJCXRoaXMuYml0cyB8PSBDb21waWxhdGlvblVuaXRSZXNvbHZlci5CSU5ESU5HX1JFQ09WRVJZOworCQl9IGVsc2UgeworCQkJdGhpcy5iaXRzICY9IH5Db21waWxhdGlvblVuaXRSZXNvbHZlci5CSU5ESU5HX1JFQ09WRVJZOworCQl9CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGVudmlyb25tZW50IHRvIGJlIHVzZWQgd2hlbiBubyB7QGxpbmsgSUphdmFQcm9qZWN0fSBpcyBhdmFpbGFibGUuCisJICogCisJICogPHA+VGhlIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgcmVxdWlyZWQgdHlwZXMgYXJlIGluY2x1ZGVkIGVpdGhlciBpbiB0aGUgY2xhc3NwYXRoIG9yIHNvdXJjZSBwYXRocy4gCisJICogQWxsIHRoZSBwYXRocyBjb250YWluaW5nIGJpbmFyeSB0eXBlcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5jbGFzc3BhdGhFbnRyaWVzPC9jb2RlPiB3aGVyZWFzIGFsbCBwYXRocyBjb250YWluaW5nICAKKwkgKiBzb3VyY2UgdHlwZXMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+c291cmNlcGF0aEVudHJpZXM8L2NvZGU+LjwvcD4KKwkgKiA8cD5BbGwgcGF0aHMgaW4gdGhlIDxjb2RlPmNsYXNzcGF0aEVudHJpZXM8L2NvZGU+IGFuZCA8Y29kZT5zb3VyY2VwYXRoRW50cmllczwvY29kZT4gYXJlIGFic29sdXRlIHBhdGhzLjwvcD4KKwkgKiA8cD5JZiB0aGUgc291cmNlIHBhdGhzIGNvbnRhaW4gdW5pdHMgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZyAob3RoZXIgdGhhbiB0aGUgcGxhdGZvcm0gZW5jb2RpbmcpLCB0aGVuIHRoZQorCSAqIGdpdmVuIDxjb2RlPmVuY29kaW5nczwvY29kZT4gbXVzdCBiZSBzZXQuIFdoZW4gdGhlIDxjb2RlPmVuY29kaW5nczwvY29kZT4gaXMgc2V0IHRvIG5vbiA8Y29kZT5udWxsPC9jb2RlPiwgaXRzIGxlbmd0aCBtdXN0CisJICogbWF0Y2ggdGhlIGxlbmd0aCBvZiA8Y29kZT5zb3VyY2VwYXRoRW50cmllczwvY29kZT4gb3IgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLjwvcD4KKwkgKiA8cD5JZiA8Y29kZT5lbmNvZGluZ3M8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGdpdmVuIDxjb2RlPnNvdXJjZXBhdGhFbnRyaWVzPC9jb2RlPiBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi48L3A+CisJICogCisJICogQHBhcmFtIGNsYXNzcGF0aEVudHJpZXMgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGJlIHVzZWQgdG8gcmVzb2x2ZSBiaW5kaW5ncworCSAqIEBwYXJhbSBzb3VyY2VwYXRoRW50cmllcyB0aGUgZ2l2ZW4gc291cmNlcGF0aCBlbnRyaWVzIHRvIGJlIHVzZWQgdG8gcmVzb2x2ZSBiaW5kaW5ncworCSAqIEBwYXJhbSBlbmNvZGluZ3MgdGhlIGVuY29kaW5ncyBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2VwYXRoIGVudHJpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBsYXRmb3JtIGVuY29kaW5nCisJICogY2FuIGJlIHVzZWQuCisJICogQHBhcmFtIGluY2x1ZGVSdW5uaW5nVk1Cb290Y2xhc3NwYXRoIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBydW5uaW5nIFZNIG11c3QgYmUgcHJlcGVuZGVkIHRvIHRoZQorCSAqIGdpdmVuIGNsYXNzcGF0aCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBydW5uaW5nIFZNIHNob3VsZCBiZSBpZ25vcmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBlbmNvZGluZ3MgaXMgbm90IGVxdWFscyB0byB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+CisJICogc291cmNlcGF0aEVudHJpZXM8L2NvZGU+CisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZ1tdIGNsYXNzcGF0aEVudHJpZXMsIFN0cmluZ1tdIHNvdXJjZXBhdGhFbnRyaWVzLCBTdHJpbmdbXSBlbmNvZGluZ3MsIGJvb2xlYW4gaW5jbHVkZVJ1bm5pbmdWTUJvb3RjbGFzc3BhdGgpIHsKKwkJdGhpcy5jbGFzc3BhdGhzID0gY2xhc3NwYXRoRW50cmllczsKKwkJdGhpcy5zb3VyY2VwYXRocyA9IHNvdXJjZXBhdGhFbnRyaWVzOworCQl0aGlzLnNvdXJjZXBhdGhzRW5jb2RpbmdzID0gZW5jb2RpbmdzOworCQlpZiAoZW5jb2RpbmdzICE9IG51bGwpIHsKKwkJCWlmIChzb3VyY2VwYXRoRW50cmllcyA9PSBudWxsIHx8IHNvdXJjZXBhdGhFbnRyaWVzLmxlbmd0aCAhPSBlbmNvZGluZ3MubGVuZ3RoKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAKKwkJCX0KKwkJfQorCQlpZiAoaW5jbHVkZVJ1bm5pbmdWTUJvb3RjbGFzc3BhdGgpIHsKKwkJCXRoaXMuYml0cyB8PSBDb21waWxhdGlvblVuaXRSZXNvbHZlci5JTkNMVURFX1JVTk5JTkdfVk1fQk9PVENMQVNTUEFUSDsKKwkJfQorCX0KIAkvKioKIAkgKiBTZXRzIHRoZSBjb21waWxlciBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBwYXJzaW5nLgogCSAqIDxwPgpAQCAtMjYwLDcgKzM0OSw3IEBACiAJICogdG8ge0BsaW5rIEphdmFDb3JlI2dldE9wdGlvbnMoKX0uIEluIGVpdGhlciBjYXNlLCBhbmQgZXNwZWNpYWxseQogCSAqIGluIHRoZSBsYXR0ZXIsIHRoZSBjYWxsZXIgc2hvdWxkIGNhcmVmdWxseSB3ZWlnaHQgdGhlIGNvbnNlcXVlbmNlcyBvZgogCSAqIGFsbG93aW5nIGNvbXBpbGVyIG9wdGlvbnMgdG8gYmUgZGVmYXVsdGVkIGFzIG9wcG9zZWQgdG8gYmVpbmcKLQkgKiBleHBsaWNpdGx5IHNwZWNpZmllZCBmb3IgdGhlIDxjb2RlPkFTVFBhcnNlcjwvY29kZT4gaW5zdGFuY2UuCisJICogZXhwbGljaXRseSBzcGVjaWZpZWQgZm9yIHRoZSB7QGxpbmsgQVNUUGFyc2VyfSBpbnN0YW5jZS4KIAkgKiBGb3IgaW5zdGFuY2UsIHRoZXJlIGlzIGEgY29tcGlsZXIgb3B0aW9uIGNhbGxlZCAiU291cmNlIENvbXBhdGliaWxpdHkgTW9kZSIKIAkgKiB3aGljaCBkZXRlcm1pbmVzIHdoaWNoIEpESyBsZXZlbCB0aGUgc291cmNlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gbWVldC4KIAkgKiBJZiB5b3Ugc3BlY2lmeSAiMS40IiwgdGhlbiAiYXNzZXJ0IiBpcyB0cmVhdGVkIGFzIGEga2V5d29yZCBhbmQgZGlzYWxsb3dlZApAQCAtMjg4LDEyICszNzcsMTIgQEAKIAogCS8qKgogCSAqIFJlcXVlc3RzIHRoYXQgdGhlIGNvbXBpbGVyIHNob3VsZCBwcm92aWRlIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yCi0gICAgICogdGhlIEFTVCBub2RlcyBpdCBjcmVhdGVzLgotICAgICAqIDxwPgotICAgICAqIERlZmF1bHQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IChubyBiaW5kaW5ncykuCi0gICAgICogPC9wPgorCSAqIHRoZSBBU1Qgbm9kZXMgaXQgY3JlYXRlcy4KIAkgKiA8cD4KLQkgKiBJZiA8Y29kZT5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk8L2NvZGU+LCB0aGUgdmFyaW91cyBuYW1lcworCSAqIERlZmF1bHQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IChubyBiaW5kaW5ncykuCisJICogPC9wPgorCSAqIDxwPgorCSAqIElmIHtAbGluayAjc2V0UmVzb2x2ZUJpbmRpbmdzKGJvb2xlYW4pIHNldFJlc29sdmVCaW5kaW5ncyh0cnVlKX0sIHRoZSB2YXJpb3VzIG5hbWVzCiAJICogYW5kIHR5cGVzIGFwcGVhcmluZyBpbiB0aGUgQVNUIGNhbiBiZSByZXNvbHZlZCB0byAiYmluZGluZ3MiCiAJICogYnkgY2FsbGluZyB0aGUgPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMuIFRoZXNlIGJpbmRpbmdzCiAJICogZHJhdyBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBhbmQKQEAgLTMwOCwxMCArMzk3LDkgQEAKIAkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyBpbiBhbnkgd2F5OyB0aGVzZSBtZXRob2RzIHJldHVybiB0aGUKIAkgKiBzYW1lIGJpbmRpbmcgYXMgYmVmb3JlIHRoZSBBU1Qgd2FzIG1vZGlmaWVkIChpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucwogCSAqIHRoYXQgcmVhcnJhbmdlIHN1YnRyZWVzIGJ5IHJlcGFyZW50aW5nIG5vZGVzKS4KLQkgKiBJZiA8Y29kZT5zZXRSZXNvbHZlQmluZGluZ3MoZmFsc2UpPC9jb2RlPiAodGhlIGRlZmF1bHQpLCB0aGUgYW5hbHlzaXMKKwkgKiBJZiB7QGxpbmsgI3NldFJlc29sdmVCaW5kaW5ncyhib29sZWFuKSBzZXRSZXNvbHZlQmluZGluZ3MoZmFsc2UpfSwgKHRoZSBkZWZhdWx0KSwgdGhlIGFuYWx5c2lzCiAJICogZG9lcyBub3QgZ28gYmV5b25kIHBhcnNpbmcgYW5kIGJ1aWxkaW5nIHRoZSB0cmVlLCBhbmQgYWxsCi0JICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZyb20gdGhlCi0JICogb3V0c2V0LgorCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmcm9tIHRoZSBvdXRzZXQuCiAJICogPC9wPgogCSAqIDxwPgogCSAqIFdoZW4gYmluZGluZ3MgYXJlIHJlcXVlc3RlZCwgaW5zdGVhZCBvZiBjb25zaWRlcmluZyBjb21waWxhdGlvbiB1bml0cyBvbiBkaXNrIG9ubHkKQEAgLTMxOSwzNiArNDA3LDQ0IEBACiAJICogYnkgdGhpcyBvd25lciB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyB3aGVuIGxvb2tpbmcKIAkgKiB1cCBuYW1lcyBhbmQgZHJhd2luZyB0aGUgY29ubmVjdGlvbnMuCiAJICogPC9wPgorCSAqIDxwPk5vdGUgdGhhdCB3b3JraW5nIGNvcHkgb3duZXIgYXJlIHVzZWQgb25seSBpZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L2NvZGU+CisJICogYnVuZGxlIGlzIGluaXRpYWxpemVkLjwvcD4KIAkgKiA8cD4KLSAgICAgKiBCaW5kaW5nIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gdGhlIEphdmEgbW9kZWwuCi0gICAgICogVGhpcyBtZWFucyB0aGF0IHRoZSBjb21waWxhdGlvbiB1bml0IG11c3QgYmUgbG9jYXRlZCByZWxhdGl2ZSB0byB0aGUKLSAgICAgKiBKYXZhIG1vZGVsLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHRoZSBzb3VyY2UgY29kZSBjb21lcyBmcm9tCi0gICAgICogZWl0aGVyIHtAbGluayAjc2V0U291cmNlKElDb21waWxhdGlvblVuaXQpIHNldFNvdXJjZShJQ29tcGlsYXRpb25Vbml0KX0KLSAgICAgKiBvciB7QGxpbmsgI3NldFNvdXJjZShJQ2xhc3NGaWxlKSBzZXRTb3VyY2UoSUNsYXNzRmlsZSl9LgotICAgICAqIFdoZW4gc291cmNlIGlzIHN1cHBsaWVkIGJ5IHtAbGluayAjc2V0U291cmNlKGNoYXJbXSkgc2V0U291cmNlKGNoYXJbXSl9LAotICAgICAqIHRoZSBsb2NhdGlvbiBtdXN0IGJlIGV4dGFibGlzaGVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZwotICAgICAqIHtAbGluayAjc2V0UHJvamVjdChJSmF2YVByb2plY3QpfSBhbmQgIHtAbGluayAjc2V0VW5pdE5hbWUoU3RyaW5nKX0uCisJICogQmluZGluZyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSBKYXZhIG1vZGVsLgorCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29tcGlsYXRpb24gdW5pdCBtdXN0IGJlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCisJICogSmF2YSBtb2RlbC4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc291cmNlIGNvZGUgY29tZXMgZnJvbQorCSAqIGVpdGhlciB7QGxpbmsgI3NldFNvdXJjZShJQ29tcGlsYXRpb25Vbml0KSBzZXRTb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCl9CisJICogb3Ige0BsaW5rICNzZXRTb3VyY2UoSUNsYXNzRmlsZSkgc2V0U291cmNlKElDbGFzc0ZpbGUpfS4KKwkgKiBXaGVuIHNvdXJjZSBpcyBzdXBwbGllZCBieSB7QGxpbmsgI3NldFNvdXJjZShjaGFyW10pIHNldFNvdXJjZShjaGFyW10pfSwKKwkgKiB0aGUgbG9jYXRpb24gbXVzdCBiZSBlc3RhYmxpc2hlZCBleHBsaWNpdGx5IGJ5IHNldHRpbmcgYW4gZW52aXJvbm1lbnQgdXNpbmcKKwkgKiB7QGxpbmsgI3NldFByb2plY3QoSUphdmFQcm9qZWN0KX0gb3Ige0BsaW5rICNzZXRFbnZpcm9ubWVudChTdHJpbmdbXSwgU3RyaW5nW10sIFN0cmluZ1tdLCBib29sZWFuKX0gCisJICogYW5kIGEgdW5pdCBuYW1lIHtAbGluayAjc2V0VW5pdE5hbWUoU3RyaW5nKX0uCiAJICogTm90ZSB0aGF0IHRoZSBjb21waWxlciBvcHRpb25zIHRoYXQgYWZmZWN0IGRvYyBjb21tZW50IGNoZWNraW5nIG1heSBhbHNvCiAJICogYWZmZWN0IHdoZXRoZXIgYW55IGJpbmRpbmdzIGFyZSByZXNvbHZlZCBmb3Igbm9kZXMgd2l0aGluIGRvYyBjb21tZW50cy4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcGFyYW0gYmluZGluZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIHdhbnRlZCwKKwkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgd2FudGVkLAogCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgbm90IG9mIGludGVyZXN0CiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZUJpbmRpbmdzKGJvb2xlYW4gYmluZGluZ3MpIHsKLQkgIHRoaXMucmVzb2x2ZUJpbmRpbmdzID0gYmluZGluZ3M7CisJcHVibGljIHZvaWQgc2V0UmVzb2x2ZUJpbmRpbmdzKGJvb2xlYW4gZW5hYmxlZCkgeworCQlpZiAoZW5hYmxlZCkgeworCQkJdGhpcy5iaXRzIHw9IENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlJFU09MVkVfQklORElORzsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYml0cyAmPSB+Q29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuUkVTT0xWRV9CSU5ESU5HOworCQl9CiAJfQogCiAJLyoqCi0gICAgICogUmVxdWVzdHMgYW4gYWJyaWRnZWQgYWJzdHJhY3Qgc3ludGF4IHRyZWUuCi0gICAgICogQnkgZGVmYXVsdCwgY29tcGxldGUgQVNUcyBhcmUgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgcmVzdWx0aW5nIEFTVCBkb2VzIG5vdCBoYXZlIG5vZGVzIGZvcgotICAgICAqIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdC4gUmF0aGVyLCB0aGUgQVNUIGlzIG9ubHkgZmxlc2hlZCBvdXQKLSAgICAgKiBmb3IgdGhlIG5vZGUgdGhhdCBpbmNsdWRlIHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24uIFRoaXMga2luZCBvZiBsaW1pdGVkCi0gICAgICogQVNUIGlzIHN1ZmZpY2llbnQgZm9yIGNlcnRhaW4gcHVycG9zZXMgYnV0IHRvdGFsbHkgdW5zdWl0YWJsZSBmb3Igb3RoZXJzLgotICAgICAqIEluIHBsYWNlcyB3aGVyZSBpdCBjYW4gYmUgdXNlZCwgdGhlIGxpbWl0ZWQgQVNUIG9mZmVycyB0aGUgYWR2YW50YWdlIG9mCi0gICAgICogYmVpbmcgc21hbGxlciBhbmQgZmFzdGVyIHRvIGNvbnN0cnVjdC4KKwkgKiBSZXF1ZXN0cyBhbiBhYnJpZGdlZCBhYnN0cmFjdCBzeW50YXggdHJlZS4KKwkgKiBCeSBkZWZhdWx0LCBjb21wbGV0ZSBBU1RzIGFyZSByZXR1cm5lZC4KKwkgKiA8cD4KKwkgKiBXaGVuIHRoZSBnaXZlbiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgYSB2YWxpZCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNvdXJjZSBjb2RlIG9mIAorCSAqIHRoZSBjb21waWxhdGlvbiB1bml0LCB0aGUgcmVzdWx0aW5nIEFTVCBkb2VzIG5vdCBoYXZlIG5vZGVzIGZvcgorCSAqIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdC4gUmF0aGVyLCB0aGUgQVNUIGlzIG9ubHkgZmxlc2hlZCBvdXQKKwkgKiBmb3IgdGhlIG5vZGUgdGhhdCBpbmNsdWRlIHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24uIFRoaXMga2luZCBvZiBsaW1pdGVkCisJICogQVNUIGlzIHN1ZmZpY2llbnQgZm9yIGNlcnRhaW4gcHVycG9zZXMgYnV0IHRvdGFsbHkgdW5zdWl0YWJsZSBmb3Igb3RoZXJzLgorCSAqIEluIHBsYWNlcyB3aGVyZSBpdCBjYW4gYmUgdXNlZCwgdGhlIGxpbWl0ZWQgQVNUIG9mZmVycyB0aGUgYWR2YW50YWdlIG9mCisJICogYmVpbmcgc21hbGxlciBhbmQgZmFzdGVyIHRvIGNvbnN0cnVjdC4KIAkgKiA8L3A+CiAJICogPHA+CiAJICogVGhlIEFTVCB3aWxsIGluY2x1ZGUgbm9kZXMgZm9yIGFsbCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCdzCkBAIC0zNjUsNyArNDYxLDcgQEAKIAkgKiBGaWVsZCBkZWNsYXJhdGlvbnMgYXJlIG5ldmVyIGFicmlkZ2VkLiBOb3RlIHRoYXQgdGhlIEFTVCBmb3IgdGhlIGJvZHkgb2YKIAkgKiB0aGF0IG9uZSB1bmFicmlkZ2VkIG1ldGhvZCAob3IgaW5pdGlhbGl6ZXIpIGlzIDEwMCUgY29tcGxldGU7IGl0IGhhcyBhbGwKIAkgKiBpdHMgc3RhdGVtZW50cywgaW5jbHVkaW5nIGFueSBsb2NhbCBvciBhbm9ueW1vdXMgdHlwZSBkZWNsYXJhdGlvbnMKLQkgKiBlbWJlZGRlZCB3aXRoaW4gdGhlbS4gV2hlbiB0aGUgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG5vdCBsb2NhdGVkIHdpdGhpbgorCSAqIGVtYmVkZGVkIHdpdGhpbiB0aGVtLiBXaGVuIHRoZSBnaXZlbiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgbm90IGxvY2F0ZWQgd2l0aGluCiAJICogdGhlIHNvdXJjZSByYW5nZSBvZiBhbnkgYm9keSBkZWNsYXJhdGlvbiBvZiBhIHRvcC1sZXZlbCB0eXBlLCB0aGUgQVNUCiAJICogcmV0dXJuZWQgd2lsbCBiZSBhIHNrZWxldG9uIHRoYXQgaW5jbHVkZXMgbm9kZXMgZm9yIGFsbCBhbmQgb25seSB0aGUgbWFqb3IKIAkgKiBkZWNsYXJhdGlvbnM7IHRoaXMga2luZCBvZiBBU1QgaXMgc3RpbGwgcXVpdGUgdXNlZnVsIGJlY2F1c2UgaXQgY29udGFpbnMKQEAgLTM3MywxNiArNDY5LDE5IEBACiAJICogY29tcGlsYXRpb24gdW5pdC4KIAkgKiA8L3A+CiAJICoKKwkgKiA8cD5UaGlzIGZvY2FsIHBvc2l0aW9uIGlzIG5vdCB1c2VkIHdoZW4gdGhlIEFTVCBpcyBidWlsdCB1c2luZyAKKwkgKiB7QGxpbmsgI2NyZWF0ZUFTVHMoSUNvbXBpbGF0aW9uVW5pdFtdLCBTdHJpbmdbXSwgQVNUUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKX0uPC9wPgorCSAqIAogCSAqIEBwYXJhbSBwb3NpdGlvbiBhIHBvc2l0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYm9keSBkZWNsYXJhdGlvbgogCSAqLwogCXB1YmxpYyB2b2lkIHNldEZvY2FsUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCXRoaXMucGFydGlhbCA9IHRydWU7CisJCXRoaXMuYml0cyB8PSBDb21waWxhdGlvblVuaXRSZXNvbHZlci5QQVJUSUFMOwogCQl0aGlzLmZvY2FsUG9pbnRQb3NpdGlvbiA9IHBvc2l0aW9uOwogCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIGtpbmQgb2YgY29uc3RydWN0cyB0byBiZSBwYXJzZWQgZnJvbSB0aGUgc291cmNlLgotICAgICAqIERlZmF1bHRzIHRvIGFuIGVudGlyZSBjb21waWxhdGlvbiB1bml0LgorCSAqIERlZmF1bHRzIHRvIGFuIGVudGlyZSBjb21waWxhdGlvbiB1bml0LgogCSAqIDxwPgogCSAqIFdoZW4gdGhlIHBhcnNlIGlzIHN1Y2Nlc3NmdWwgdGhlIHJlc3VsdCByZXR1cm5lZCBpbmNsdWRlcyB0aGUgQVNUcyBmb3IgdGhlCiAJICogcmVxdWVzdGVkIHNvdXJjZToKQEAgLTQxNiw3ICs1MTUsNyBAQAogCSAqIDwvdWw+CiAJICogVGhlIGNvbnRyaXZlZCBub2RlcyBkbyBub3QgaGF2ZSBzb3VyY2UgcG9zaXRpb25zLiBPdGhlciBhc3BlY3RzIG9mIHRoZQogCSAqIHtAbGluayBDb21waWxhdGlvblVuaXQgQ29tcGlsYXRpb25Vbml0fSBub2RlIGFyZSB1bnNwZWNpZmllZCwgaW5jbHVkaW5nCi0JICogdGhlIGV4YWN0IGFycmFuZ21lbnQgb2YgaW50ZXJ2ZW5pbmcgbm9kZXMuCisJICogdGhlIGV4YWN0IGFycmFuZ2VtZW50IG9mIGludGVydmVuaW5nIG5vZGVzLgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBMZXhpY2FsIG9yIHN5bnRheCBlcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZyBjYW4gcmVzdWx0IGluCkBAIC00NDMsOSArNTQyLDEyIEBACiAJICogPC9wPgogCSAqIDxwPgogCSAqIEJpbmRpbmcgaW5mb3JtYXRpb24gaXMgb25seSBjb21wdXRlZCB3aGVuIDxjb2RlPmtpbmQ8L2NvZGU+IGlzCi0gICAgICogPGNvZGU+S19DT01QSUxBVElPTl9VTklUPC9jb2RlPi4KKwkgKiB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH0uCiAJICogPC9wPgotCSAqCisJICogCisJICogPHA+VGhpcyBraW5kIGlzIG5vdCB1c2VkIHdoZW4gdGhlIEFTVCBpcyBidWlsdCB1c2luZworCSAqIHtAbGluayAjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfS48L3A+CisJICogCiAJICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY29uc3RydWN0IHRvIHBhcnNlOiBvbmUgb2YKIAkgKiB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH0sCiAJICoge0BsaW5rICNLX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TfSwKQEAgLTQ2MywxMSArNTY1LDIxIEBACiAJfQogCiAJLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIGNvZGUgdG8gYmUgcGFyc2VkLgotICAgICAqCisJICogU2V0cyB0aGUgc291cmNlIGNvZGUgdG8gYmUgcGFyc2VkLgorCSAqCisJICogPHA+VGhpcyBzb3VyY2UgaXMgbm90IHVzZWQgd2hlbiB0aGUgQVNUIGlzIGJ1aWx0IHVzaW5nIAorCSAqIHtAbGluayAjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfS48L3A+CisJICoKKwkgKiA8cD5JZiB0aGlzIG1ldGhvZCBpcyB1c2VkLCB0aGUgdXNlciBuZWVkcyB0byBzcGVjaWZ5IGNvbXBpbGVyIG9wdGlvbnMgZXhwbGljaXRseSB1c2luZworCSAqIHtAbGluayAjc2V0Q29tcGlsZXJPcHRpb25zKE1hcCl9IGFzIDEuNSBjb2RlIHdpbGwgbm90IGJlIHByb3Blcmx5IHBhcnNlZCB3aXRob3V0IHNldHRpbmcKKwkgKiB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgY29tcGlsZXIgb3B0aW9uczoge0BsaW5rIEphdmFDb3JlI0NPTVBJTEVSX1NPVVJDRX0sCisJICoge0BsaW5rIEphdmFDb3JlI0NPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNfSwgYW5kIHtAbGluayBKYXZhQ29yZSNDT01QSUxFUl9DT01QTElBTkNFfS48L3A+CisJICogPHA+T3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbXBpbGVyIG9wdGlvbnMgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIHRoZSBnaXZlbiBzb3VyY2UuPC9wPgorCSAqCiAJICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZyB0byBiZSBwYXJzZWQsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLworCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlIEphdmFDb3JlI3NldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKQorCSAqLwogCXB1YmxpYyB2b2lkIHNldFNvdXJjZShjaGFyW10gc291cmNlKSB7CiAJCXRoaXMucmF3U291cmNlID0gc291cmNlOwogCQkvLyBjbGVhciB0aGUgdHlwZSByb290CkBAIC00NzUsNDAgKzU4Nyw1MiBAQAogCX0KIAogCS8qKgotICAgICAqIFNldHMgdGhlIHNvdXJjZSBjb2RlIHRvIGJlIHBhcnNlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHByb2plY3QgKGFuZCBjb21waWxlcgotICAgICAqIG9wdGlvbnMpIGJhc2VkIG9uIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LCBpbiBhIG1hbm5lcgotICAgICAqIGVxdWl2YWxlbnQgdG8gPGNvZGU+c2V0UHJvamVjdChzb3VyY2UuZ2V0SmF2YVByb2plY3QoKSk8L2NvZGU+Ci0gICAgICoKKwkgKiBTZXRzIHRoZSBzb3VyY2UgY29kZSB0byBiZSBwYXJzZWQuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBzZXRzIHRoZSBwcm9qZWN0IChhbmQgY29tcGlsZXIKKwkgKiBvcHRpb25zKSBiYXNlZCBvbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgaW4gYSBtYW5uZXIKKwkgKiBlcXVpdmFsZW50IHRvIHtAbGluayAjc2V0UHJvamVjdChJSmF2YVByb2plY3QpIHNldFByb2plY3Qoc291cmNlLmdldEphdmFQcm9qZWN0KCkpfS48L3A+CisJICoKKwkgKiA8cD5UaGlzIHNvdXJjZSBpcyBub3QgdXNlZCB3aGVuIHRoZSBBU1QgaXMgYnVpbHQgdXNpbmcgCisJICoge0BsaW5rICNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIEFTVFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9LjwvcD4KKwkgKiAKIAkgKiBAcGFyYW0gc291cmNlIHRoZSBKYXZhIG1vZGVsIGNvbXBpbGF0aW9uIHVuaXQgd2hvc2Ugc291cmNlIGNvZGUKLSAgICAgKiBpcyB0byBiZSBwYXJzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgICovCisJICogaXMgdG8gYmUgcGFyc2VkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCiAJcHVibGljIHZvaWQgc2V0U291cmNlKElDb21waWxhdGlvblVuaXQgc291cmNlKSB7CiAJCXNldFNvdXJjZSgoSVR5cGVSb290KXNvdXJjZSk7CiAJfQogCiAJLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIGNvZGUgdG8gYmUgcGFyc2VkLgotICAgICAqIDxwPlRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgcHJvamVjdCAoYW5kIGNvbXBpbGVyCi0gICAgICogb3B0aW9ucykgYmFzZWQgb24gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQsIGluIGEgbWFubmVyCi0gICAgICogZXF1aXZhbGVudCB0byA8Y29kZT5zZXRQcm9qZWN0KHNvdXJjZS5nZXRKYXZhUHJvamVjdCgpKTwvY29kZT4uPC9wPgotICAgICAqIDxwPklmIHRoZSBnaXZlbiBjbGFzcyBmaWxlIGhhcyAgbm8gc291cmNlIGF0dGFjaG1lbnQsIHRoZSBjcmVhdGlvbiBvZiB0aGUKLSAgICAgKiBhc3Qgd2lsbCBmYWlsIHdpdGggYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLjwvcD4KLSAgICAgKgorCSAqIFNldHMgdGhlIHNvdXJjZSBjb2RlIHRvIGJlIHBhcnNlZC4KKwkgKgorCSAqIDxwPlRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgcHJvamVjdCAoYW5kIGNvbXBpbGVyCisJICogb3B0aW9ucykgYmFzZWQgb24gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQsIGluIGEgbWFubmVyCisJICogZXF1aXZhbGVudCB0byB7QGxpbmsgI3NldFByb2plY3QoSUphdmFQcm9qZWN0KSBzZXRQcm9qZWN0KHNvdXJjZS5nZXRKYXZhUHJvamVjdCgpKX0uPC9wPgorCSAqIDxwPklmIHRoZSBnaXZlbiBjbGFzcyBmaWxlIGhhcyAgbm8gc291cmNlIGF0dGFjaG1lbnQsIHRoZSBjcmVhdGlvbiBvZiB0aGUKKwkgKiBhc3Qgd2lsbCBmYWlsIHdpdGggYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uPC9wPgorCSAqCisJICogPHA+VGhpcyBzb3VyY2UgaXMgbm90IHVzZWQgd2hlbiB0aGUgQVNUIGlzIGJ1aWx0IHVzaW5nIAorCSAqIHtAbGluayAjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfS48L3A+CisJICogCiAJICogQHBhcmFtIHNvdXJjZSB0aGUgSmF2YSBtb2RlbCBjbGFzcyBmaWxlIHdob3NlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUKLSAgICAgKiBpcyB0byBiZSBwYXJzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KKwkgKiBpcyB0byBiZSBwYXJzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoSUNsYXNzRmlsZSBzb3VyY2UpIHsKIAkJc2V0U291cmNlKChJVHlwZVJvb3Qpc291cmNlKTsKIAl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSBzb3VyY2UgY29kZSB0byBiZSBwYXJzZWQuCisJICoKIAkgKiA8cD5UaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIHByb2plY3QgKGFuZCBjb21waWxlcgogCSAqIG9wdGlvbnMpIGJhc2VkIG9uIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IG9mIGNsYXNzIGZpbGUsIGluIGEgbWFubmVyCi0JICogZXF1aXZhbGVudCB0byA8Y29kZT5zZXRQcm9qZWN0KHNvdXJjZS5nZXRKYXZhUHJvamVjdCgpKTwvY29kZT4uPC9wPgorCSAqIGVxdWl2YWxlbnQgdG8ge0BsaW5rICNzZXRQcm9qZWN0KElKYXZhUHJvamVjdCkgc2V0UHJvamVjdChzb3VyY2UuZ2V0SmF2YVByb2plY3QoKSl9LjwvcD4KIAkgKiA8cD5JZiB0aGUgc291cmNlIGlzIGEgY2xhc3MgZmlsZSB3aXRob3V0IHNvdXJjZSBhdHRhY2htZW50LCB0aGUgY3JlYXRpb24gb2YgdGhlCi0JICogYXN0IHdpbGwgZmFpbCB3aXRoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi48L3A+CisJICogYXN0IHdpbGwgZmFpbCB3aXRoIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LjwvcD4KKwkgKgorCSAqIDxwPlRoaXMgc291cmNlIGlzIG5vdCB1c2VkIHdoZW4gdGhlIEFTVCBpcyBidWlsdCB1c2luZyAKKwkgKiB7QGxpbmsgI2NyZWF0ZUFTVHMoSUNvbXBpbGF0aW9uVW5pdFtdLCBTdHJpbmdbXSwgQVNUUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKX0uPC9wPgogCSAqCiAJICogQHBhcmFtIHNvdXJjZSB0aGUgSmF2YSBtb2RlbCBjb21waWxhdGlvbiB1bml0IG9yIGNsYXNzIGZpbGUgd2hvc2UgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZQogCSAqIGlzIHRvIGJlIHBhcnNlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQpAQCAtNTMxLDkgKzY1NSwxMiBAQAogICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBlbnRpcmUgc291cmNlIHN0cmluZyB3aWxsIGJlIHBhcnNlZAogICAgICAqICg8Y29kZT5vZmZzZXQ8L2NvZGU+IDAgYW5kIDxjb2RlPmxlbmd0aDwvY29kZT4gLTEpLgogICAgICAqCisJICogPHA+VGhpcyByYW5nZSBpcyBub3QgdXNlZCB3aGVuIHRoZSBBU1QgaXMgYnVpbHQgdXNpbmcgCisJICoge0BsaW5rICNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIEFTVFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9LjwvcD4KKyAgICAgKgogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gcGFyc2UKICAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwYXJzZSwgb3IgLTEgaWYKLSAgICAgKiB0aGUgcmVtYWluZGVyIG9mIHRoZSBzb3VyY2Ugc3RyaW5nIGlzCisgICAgICogdGhlIHJlbWFpbmRlciBvZiB0aGUgc291cmNlIHN0cmluZyBpcyB0byBiZSBwYXJzZWQKICAgICAgKi8KIAlwdWJsaWMgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAJCWlmIChvZmZzZXQgPCAwIHx8IGxlbmd0aCA8IC0xKSB7CkBAIC01NTcsNyArNjg0LDI5IEBACiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyB2b2lkIHNldFN0YXRlbWVudHNSZWNvdmVyeShib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5zdGF0ZW1lbnRzUmVjb3ZlcnkgPSBlbmFibGVkOworCQlpZiAoZW5hYmxlZCkgeworCQkJdGhpcy5iaXRzIHw9IENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlNUQVRFTUVOVF9SRUNPVkVSWTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYml0cyAmPSB+Q29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuU1RBVEVNRU5UX1JFQ09WRVJZOworCQl9CisJfQorCQorCS8qKgorCSAqIFJlcXVlc3RzIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIHdpdGhvdXQgbWV0aG9kIGJvZGllcy4gCisJICogCisJICogPHA+V2hlbiBpZ25vcmUgbWV0aG9kIGJvZGllcyBpcyBlbmFibGVkLCBhbGwgbWV0aG9kIGJvZGllcyBhcmUgZGlzY2FyZGVkLgorCSAqIFRoaXMgaGFzIG5vIGltcGFjdCBvbiB0aGUgYmluZGluZyByZXNvbHV0aW9uLjwvcD4KKwkgKgorCSAqIDxwPlRoaXMgc2V0dGluZyBpcyBub3QgdXNlZCB3aGVuIHRoZSBraW5kIHVzZWQgaW4ge0BsaW5rICNzZXRLaW5kKGludCl9IGlzIGVpdGhlciAKKwkgKiB7QGxpbmsgI0tfRVhQUkVTU0lPTn0gb3Ige0BsaW5rICNLX1NUQVRFTUVOVFN9LjwvcD4KKwkgKiBAc2luY2UgMy41LjIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVNZXRob2RCb2RpZXMoYm9vbGVhbiBlbmFibGVkKSB7CisJCWlmIChlbmFibGVkKSB7CisJCQl0aGlzLmJpdHMgfD0gQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuSUdOT1JFX01FVEhPRF9CT0RJRVM7CisJCX0gZWxzZSB7CisJCQl0aGlzLmJpdHMgJj0gfkNvbXBpbGF0aW9uVW5pdFJlc29sdmVyLklHTk9SRV9NRVRIT0RfQk9ESUVTOworCQl9CiAJfQogCiAgICAgLyoqCkBAIC01NzYsMTAgKzcyNSwxMiBAQAogCX0KIAogCS8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3b3VsZCBoeXBvdGhldGljYWxseSBjb250YWlucwotICAgICAqIHRoZSBzb3VyY2Ugc3RyaW5nLiBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI3NldFNvdXJjZShjaGFyW10pfQotICAgICAqIGFuZCB7QGxpbmsgI3NldFByb2plY3QoSUphdmFQcm9qZWN0KSB9IHRvIGxvY2F0ZSB0aGUgY29tcGlsYXRpb24gdW5pdCByZWxhdGl2ZSB0byBhIEphdmEgcHJvamVjdC4KLSAgICAgKiBEZWZhdWx0cyB0byBub25lICg8Y29kZT5udWxsPC9jb2RlPikuCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGF0IHdvdWxkIGh5cG90aGV0aWNhbGx5IGNvbnRhaW5zIHRoZQorCSAqIHNvdXJjZSBzdHJpbmcuCisJICogCisJICogIDxwPlRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjc2V0U291cmNlKGNoYXJbXSl9CisJICogYW5kIHtAbGluayAjc2V0UHJvamVjdChJSmF2YVByb2plY3QpfSB0byBsb2NhdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVsYXRpdmUgdG8gYSBKYXZhIHByb2plY3QuCisJICogRGVmYXVsdHMgdG8gbm9uZSAoPGNvZGU+bnVsbDwvY29kZT4pLjwvcD4KIAkgKiA8cD4KIAkgKiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBtdXN0IGJlIHN1cHBsaWVkIGZvciByZXNvbHZpbmcgYmluZGluZ3MuCiAJICogVGhpcyBuYW1lIHNob3VsZCBiZSBzdWZmaXhlZCBieSBhIGRvdCAoJy4nKSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCkBAIC01ODcsMzIgKzczOCwzNyBAQAogCSAqIGFuZCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbWFpbiAocHVibGljKSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZS48L3A+CiAJICoKIAkgKiA8cD5UaGlzIG5hbWUgbXVzdCByZXByZXNlbnQgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgdW5pdCBpbnNpZGUgdGhlIGdpdmVuIHByb2plY3QuIEZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlCi0JICogZGVjbGFyZXMgYSBwdWJsaWMgY2xhc3MgbmFtZWQgIkZvbyIgaW4gYSBwcm9qZWN0ICJQIiwgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbXVzdCBiZQotCSAqICIvUC9Gb28uamF2YSIuIElmIHRoZSBzb3VyY2UgZGVjbGFyZXMgYSBwdWJsaWMgY2xhc3MgbmFtZSAiQmFyIiBpbiBhIHBhY2thZ2UgInAxLnAyIiBpbiBhIHByb2plY3QgIlAiLAotCSAqIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IG11c3QgYmUgIi9QL3AxL3AyL0Jhci5qYXZhIi48L3A+Ci0gICAgICoKKwkgKiBkZWNsYXJlcyBhIHB1YmxpYyBjbGFzcyBuYW1lZCAiRm9vIiBpbiBhIHByb2plY3QgIlAiIHdoZXJlIHRoZSBzb3VyY2UgZm9sZGVyIGlzIHRoZSBwcm9qZWN0IGl0c2VsZiwgdGhlIG5hbWUKKwkgKiBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBtdXN0IGJlICIvUC9Gb28uamF2YSIuCisJICogSWYgdGhlIHNvdXJjZSBkZWNsYXJlcyBhIHB1YmxpYyBjbGFzcyBuYW1lICJCYXIiIGluIGEgcGFja2FnZSAicDEucDIiIGluIGEgcHJvamVjdCAiUCIgaW4gYSBzb3VyY2UgZm9sZGVyICJzcmMiLAorCSAqIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IG11c3QgYmUgIi9QL3NyYy9wMS9wMi9CYXIuamF2YSIuPC9wPgorCSAqCisJICogPHA+VGhpcyB1bml0IG5hbWUgaXMgbm90IHVzZWQgd2hlbiB0aGUgQVNUIGlzIGJ1aWx0IHVzaW5nIAorCSAqIHtAbGluayAjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfS48L3A+CisJICoKIAkgKiBAcGFyYW0gdW5pdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3b3VsZCBjb250YWluIHRoZSBzb3VyY2UKIAkgKiAgICBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICAgKi8KKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRVbml0TmFtZShTdHJpbmcgdW5pdE5hbWUpIHsKIAkJdGhpcy51bml0TmFtZSA9IHVuaXROYW1lOwogCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIEphdmEgcHJvamVjdCB1c2VkIHdoZW4gcmVzb2x2aW5nIGJpbmRpbmdzLgotCSAqIFRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgY29tcGlsZXIKLQkgKiBvcHRpb25zIGJhc2VkIG9uIHRoZSBnaXZlbiBwcm9qZWN0OgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgY29tcGlsZXIKKwkgKiBvcHRpb25zIGJhc2VkIG9uIHRoZSBnaXZlbiBwcm9qZWN0OjwvcD4KIAkgKiA8cHJlPgogCSAqIHNldENvbXBpbGVyT3B0aW9ucyhwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSkpOwogCSAqIDwvcHJlPgotCSAqIFNlZSB7QGxpbmsgI3NldENvbXBpbGVyT3B0aW9ucyhNYXApfSBmb3IgYSBkaXNjdXNzaW9uIG9mCisJICogPHA+U2VlIHtAbGluayAjc2V0Q29tcGlsZXJPcHRpb25zKE1hcCl9IGZvciBhIGRpc2N1c3Npb24gb2YKIAkgKiB0aGUgcHJvcyBhbmQgY29ucyBvZiB1c2luZyB0aGVzZSBvcHRpb25zIHZzIHNwZWNpZnlpbmcKLQkgKiBjb21waWxlciBvcHRpb25zIGV4cGxpY2l0bHkuCi0JICogVGhpcyBzZXR0aW5nIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8Y29kZT5zZXRTb3VyY2UoY2hhcltdKTwvY29kZT4uCisJICogY29tcGlsZXIgb3B0aW9ucyBleHBsaWNpdGx5LjwvcD4KKwkgKiA8cD5UaGlzIHNldHRpbmcgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjc2V0U291cmNlKGNoYXJbXSl9LgogCSAqIEZvciB0aGUgcHVycG9zZXMgb2YgcmVzb2x2aW5nIGJpbmRpbmdzLCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUKIAkgKiBzb3VyY2Ugc3RyaW5nIHdpbGwgaGlkZSB0eXBlcyBieSB0aGUgc2FtZSBuYW1lIGF2YWlsYWJsZQotCSAqIHRocm91Z2ggdGhlIGNsYXNzcGF0aCBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiBEZWZhdWx0cyB0byBub25lICg8Y29kZT5udWxsPC9jb2RlPikuCisJICogdGhyb3VnaCB0aGUgY2xhc3NwYXRoIG9mIHRoZSBnaXZlbiBwcm9qZWN0LjwvcD4KKwkgKiA8cD5EZWZhdWx0cyB0byBub25lICg8Y29kZT5udWxsPC9jb2RlPikuPC9wPgogCSAqCiAJICogQHBhcmFtIHByb2plY3QgdGhlIEphdmEgcHJvamVjdCB1c2VkIHRvIHJlc29sdmUgbmFtZXMsIG9yCiAJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQpAQCAtNjI3LDYxICs3ODMsNjAgQEAKIAl9CiAKIAkvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlLgotICAgICAqIDxwPgotICAgICAqIEEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHNldHRpbmdzIHRvIHRoZWlyCi0gICAgICogZGVmYXVsdCB2YWx1ZXMgc28gdGhlIG9iamVjdCBpcyByZWFkeSB0byBiZSByZXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIHJlcXVlc3QgY2FuY2VsYXRpb24sCisJICogQ3JlYXRlcyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZS4KKwkgKiA8cD4KKwkgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCBzZXR0aW5ncyB0byB0aGVpcgorCSAqIGRlZmF1bHQgdmFsdWVzIHNvIHRoZSBvYmplY3QgaXMgcmVhZHkgdG8gYmUgcmV1c2VkLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCByZXF1ZXN0IGNhbmNlbGxhdGlvbiwKIAkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAcmV0dXJuIGFuIEFTVCBub2RlIHdob3NlIHR5cGUgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBwYXJzZQogCSAqICByZXF1ZXN0ZWQsIHdpdGggYSBmYWxsYmFjayB0byBhIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4KIAkgKiAgaW4gdGhlIGNhc2Ugb2Ygc2V2ZXJlIHBhcnNpbmcgZXJyb3JzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNldHRpbmdzIHByb3ZpZGVkCiAJICogYXJlIGluc3VmZmljaWVudCwgY29udHJhZGljdG9yeSwgb3Igb3RoZXJ3aXNlIHVuc3VwcG9ydGVkCi0gICAgICovCisJICovCiAJcHVibGljIEFTVE5vZGUgY3JlYXRlQVNUKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCSAgIEFTVE5vZGUgcmVzdWx0ID0gbnVsbDsKLQkgICBpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKwkJQVNUTm9kZSByZXN1bHQgPSBudWxsOworCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKIAkJdHJ5IHsKIAkJCWlmICh0aGlzLnJhd1NvdXJjZSA9PSBudWxsICYmIHRoaXMudHlwZVJvb3QgPT0gbnVsbCkgewotCQkgICAJICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2Ugbm90IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0JCSAgIH0KLQkgICAJCXJlc3VsdCA9IGludGVybmFsQ3JlYXRlQVNUKG1vbml0b3IpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJlc3VsdCA9IGludGVybmFsQ3JlYXRlQVNUKG1vbml0b3IpOwogCQl9IGZpbmFsbHkgewotCSAgIAkgICAvLyByZS1pbml0IGRlZmF1bHRzIHRvIGFsbG93IHJldXNlIChhbmQgYXZvaWQgbGVha2luZykKLQkgICAJICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JICAgCSAgIGlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOworCQkJLy8gcmVzZXQgdG8gZGVmYXVsdHMgdG8gYWxsb3cgcmV1c2UgKGFuZCBhdm9pZCBsZWFraW5nKQorCQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKIAkJfQotICAgCSAgIHJldHVybiByZXN1bHQ7CisJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCi0gICAgICogQ3JlYXRlcyBBU1RzIGZvciBhIGJhdGNoIG9mIGNvbXBpbGF0aW9uIHVuaXRzLgotICAgICAqIFdoZW4gYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLCBwcm9jZXNzaW5nIGEKLSAgICAgKiBiYXRjaCBvZiBjb21waWxhdGlvbiB1bml0cyBpcyBtb3JlIGVmZmljaWVudCBiZWNhdXNlIG11Y2gKLSAgICAgKiBvZiB0aGUgd29yayBpbnZvbHZlZCBpbiByZXNvbHZpbmcgYmluZGluZ3MgY2FuIGJlIHNoYXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZCwgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIG11c3QKLSAgICAgKiBjb21lIGZyb20gdGhlIHNhbWUgSmF2YSBwcm9qZWN0LCB3aGljaCBtdXN0IGJlIHNldCBiZWZvcmVoYW5kCi0gICAgICogd2l0aCA8Y29kZT5zZXRQcm9qZWN0PC9jb2RlPi4KLSAgICAgKiBUaGUgY29tcGlsYXRpb24gdW5pdHMgYXJlIHByb2Nlc3NlZCBvbmUgYXQgYSB0aW1lIGluIG5vCi0gICAgICogc3BlY2lmaWVkIG9yZGVyLiBGb3IgZWFjaCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdHMgaW4gdHVybiwKKwkgKiBDcmVhdGVzIEFTVHMgZm9yIGEgYmF0Y2ggb2YgY29tcGlsYXRpb24gdW5pdHMuCisJICogPHA+V2hlbiBiaW5kaW5ncyBhcmUgYmVpbmcgcmVzb2x2ZWQsIHByb2Nlc3NpbmcgYQorCSAqIGJhdGNoIG9mIGNvbXBpbGF0aW9uIHVuaXRzIGlzIG1vcmUgZWZmaWNpZW50IGJlY2F1c2UgbXVjaAorCSAqIG9mIHRoZSB3b3JrIGludm9sdmVkIGluIHJlc29sdmluZyBiaW5kaW5ncyBjYW4gYmUgc2hhcmVkLjwvcD4KKwkgKiA8cD4KKwkgKiBXaGVuIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZCwgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIG11c3QKKwkgKiBjb21lIGZyb20gdGhlIHNhbWUgSmF2YSBwcm9qZWN0LCB3aGljaCBtdXN0IGJlIHNldCBiZWZvcmVoYW5kCisJICogd2l0aCB7QGxpbmsgI3NldFByb2plY3QoSUphdmFQcm9qZWN0KSBzZXRQcm9qZWN0fS48L3A+CisJICogPHA+VGhlIGNvbXBpbGF0aW9uIHVuaXRzIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZSBpbiBubworCSAqIHNwZWNpZmllZCBvcmRlci4gRm9yIGVhY2ggb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGluIHR1cm4sPC9wPgogCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+QVNUUGFyc2VyLmNyZWF0ZUFTVDwvY29kZT4gaXMgY2FsbGVkIHRvIHBhcnNlIGl0CisJICogPGxpPntAbGluayAjY3JlYXRlQVNUKElQcm9ncmVzc01vbml0b3IpIEFTVFBhcnNlci5jcmVhdGVBU1R9IGlzIGNhbGxlZCB0byBwYXJzZSBpdAogCSAqIGFuZCBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIEFTVC4gVGhlIGNhbGxzIHRvCi0JICogPGNvZGU+QVNUUGFyc2VyLmNyZWF0ZUFTVDwvY29kZT4gYWxsIGVtcGxveSB0aGUgc2FtZSBzZXR0aW5ncy48L2xpPgotCSAqIDxsaT48Y29kZT5BU1RSZXF1ZXN0b3IuYWNjZXB0QVNUPC9jb2RlPiBpcyBjYWxsZWQgcGFzc2luZwotCSAqIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCB0aGUgY29ycmVzcG9uZGluZyBBU1QgdG8KLQkgKiA8Y29kZT5yZXF1ZXN0b3I8L2NvZGU+LgorCSAqIHtAbGluayAjY3JlYXRlQVNUKElQcm9ncmVzc01vbml0b3IpIEFTVFBhcnNlci5jcmVhdGVBU1R9IGFsbCBlbXBsb3kgdGhlIHNhbWUgc2V0dGluZ3MuPC9saT4KKwkgKiA8bGk+e0BsaW5rIEFTVFJlcXVlc3RvciNhY2NlcHRBU1QoSUNvbXBpbGF0aW9uVW5pdCwgQ29tcGlsYXRpb25Vbml0KSBBU1RSZXF1ZXN0b3IuYWNjZXB0QVNUfQorCSAqIGlzIGNhbGxlZCBwYXNzaW5nIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCB0aGUgY29ycmVzcG9uZGluZyBBU1QgdG8gPGNvZGU+cmVxdWVzdG9yPC9jb2RlPi4KIAkgKiA8L2xpPgogCSAqIDwvdWw+Ci0gICAgICogTm90ZSBvbmx5IEFTVHMgZnJvbSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdHMgYXJlIHJlcG9ydGVkCi0gICAgICogdG8gdGhlIHJlcXVlc3Rvci4gSWYgYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0cyBhcmUgcmVxdWlyZWQgdG8KLSAgICAgKiByZXNvbHZlIHRoZSBvcmlnaW5hbCBvbmVzLCB0aGUgY29ycmVzcG9uZGluZyBBU1RzIGFyZSA8Yj5ub3Q8L2I+Ci0gICAgICogcmVwb3J0ZWQgdG8gdGhlIHJlcXVlc3Rvci4KLSAgICAgKiA8L3A+CisJICogTm90ZSBvbmx5IEFTVHMgZnJvbSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdHMgYXJlIHJlcG9ydGVkCisJICogdG8gdGhlIHJlcXVlc3Rvci4gSWYgYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0cyBhcmUgcmVxdWlyZWQgdG8KKwkgKiByZXNvbHZlIHRoZSBvcmlnaW5hbCBvbmVzLCB0aGUgY29ycmVzcG9uZGluZyBBU1RzIGFyZSA8Yj5ub3Q8L2I+CisJICogcmVwb3J0ZWQgdG8gdGhlIHJlcXVlc3Rvci4KKwkgKiA8L3A+CiAJICogPHA+CiAJICogTm90ZSBhbHNvIHRoZSBmb2xsb3dpbmcgcGFyc2VyIHBhcmFtZXRlcnMgYXJlIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdAogCSAqIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkOgpAQCAtNjkxLDcwICs4NDYsMTczIEBACiAJICogPGxpPlRoZSB7QGxpbmtwbGFpbiAjc2V0Rm9jYWxQb3NpdGlvbihpbnQpIGZvY2FsIHBvc2l0aW9ufSBpcyBub3Qgc2V0PC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgPGNvZGU+YmluZGluZ0tleXM8L2NvZGU+IHBhcmFtZXRlciBzcGVjaWZpZXMgYmluZGluZ3Mga2V5cwotICAgICAqICh7QGxpbmsgSUJpbmRpbmcjZ2V0S2V5KCl9KSB0aGF0IGFyZSB0byBiZSBsb29rZWQgdXAuIFRoZXNlIGtleXMgbWF5Ci0gICAgICogYmUgZm9yIGVsZW1lbnRzIGVpdGhlciBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgc2V0IG9mIGNvbXBpbGF0aW9uCi0gICAgICogdW5pdHMgYmVpbmcgcHJvY2Vzc2VkLiBXaGVuIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZCwKLSAgICAgKiB0aGUga2V5cyBhbmQgY29ycmVzcG9uZGluZyBiaW5kaW5ncyAob3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSkgYXJlCi0gICAgICogcGFzc2VkIHRvIDxjb2RlPkFTVFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nPC9jb2RlPi4gTm90ZSB0aGF0IGJpbmRpbmcga2V5cwotICAgICAqIGZvciBlbGVtZW50cyBvdXRzaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgYmVpbmcgcHJvY2Vzc2VkIGFyZSBsb29rZWQgdXAKLSAgICAgKiBhZnRlciBhbGwgPGNvZGU+QVNUUmVxdWVzdG9yLmFjY2VwdEFTVDwvY29kZT4gY2FsbGJhY2tzIGhhdmUgYmVlbiBtYWRlLgotICAgICAqIEJpbmRpbmcga2V5cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgYmVpbmcgcHJvY2Vzc2VkCi0gICAgICogYXJlIGxvb2tlZCB1cCBhbmQgcmVwb3J0ZWQgcmlnaHQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiA8Y29kZT5BU1RSZXF1ZXN0b3IuYWNjZXB0QVNUPC9jb2RlPiBjYWxsYmFjayBoYXMgYmVlbiBtYWRlLgotICAgICAqIE5vIDxjb2RlPkFTVFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nPC9jb2RlPiBjYWxsYmFja3MgYXJlIG1hZGUgdW5sZXNzCi0gICAgICogYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCBzZXR0aW5ncyB0byB0aGVpcgotICAgICAqIGRlZmF1bHQgdmFsdWVzIHNvIHRoZSBvYmplY3QgaXMgcmVhZHkgdG8gYmUgcmV1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21waWxhdGlvblVuaXRzIHRoZSBjb21waWxhdGlvbiB1bml0cyB0byBjcmVhdGUgQVNUcyBmb3IKLSAgICAgKiBAcGFyYW0gYmluZGluZ0tleXMgdGhlIGJpbmRpbmcga2V5cyB0byBjcmVhdGUgYmluZGluZ3MgZm9yCi0gICAgICogQHBhcmFtIHJlcXVlc3RvciB0aGUgQVNUIHJlcXVlc3RvciB0aGF0IGNvbGxlY3RzIGFidHJhY3Qgc3ludGF4IHRyZWVzIGFuZCBiaW5kaW5ncwotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCByZXF1ZXN0IGNhbmNlbGF0aW9uLAorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5iaW5kaW5nS2V5czwvY29kZT4gcGFyYW1ldGVyIHNwZWNpZmllcyBiaW5kaW5ncyBrZXlzCisJICogKHtAbGluayBJQmluZGluZyNnZXRLZXkoKX0pIHRoYXQgYXJlIHRvIGJlIGxvb2tlZCB1cC4gVGhlc2Uga2V5cyBtYXkKKwkgKiBiZSBmb3IgZWxlbWVudHMgZWl0aGVyIGluc2lkZSBvciBvdXRzaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24KKwkgKiB1bml0cyBiZWluZyBwcm9jZXNzZWQuIFdoZW4gYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLAorCSAqIHRoZSBrZXlzIGFuZCBjb3JyZXNwb25kaW5nIGJpbmRpbmdzIChvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKSBhcmUKKwkgKiBwYXNzZWQgdG8ge0BsaW5rIEFTVFJlcXVlc3RvciNhY2NlcHRCaW5kaW5nKFN0cmluZywgSUJpbmRpbmcpIEFTVFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nfS4KKwkgKiBOb3RlIHRoYXQgYmluZGluZyBrZXlzIGZvciBlbGVtZW50cyBvdXRzaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgYmVpbmcgcHJvY2Vzc2VkCisJICogYXJlIGxvb2tlZCB1cCBhZnRlciBhbGwge0BsaW5rIEFTVFJlcXVlc3RvciNhY2NlcHRBU1QoSUNvbXBpbGF0aW9uVW5pdCwgQ29tcGlsYXRpb25Vbml0KSBBU1RSZXF1ZXN0b3IuYWNjZXB0QVNUfQorCSAqIGNhbGxiYWNrcyBoYXZlIGJlZW4gbWFkZS4KKwkgKiBCaW5kaW5nIGtleXMgZm9yIGVsZW1lbnRzIGluc2lkZSB0aGUgc2V0IG9mIGNvbXBpbGF0aW9uIHVuaXRzIGJlaW5nIHByb2Nlc3NlZAorCSAqIGFyZSBsb29rZWQgdXAgYW5kIHJlcG9ydGVkIHJpZ2h0IGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nCisJICoge0BsaW5rIEFTVFJlcXVlc3RvciNhY2NlcHRBU1QoSUNvbXBpbGF0aW9uVW5pdCwgQ29tcGlsYXRpb25Vbml0KSBBU1RSZXF1ZXN0b3IuYWNjZXB0QVNUfSBjYWxsYmFjayBoYXMgYmVlbiBtYWRlLgorCSAqIE5vIHtAbGluayBBU1RSZXF1ZXN0b3IjYWNjZXB0QmluZGluZyhTdHJpbmcsIElCaW5kaW5nKSBBU1RSZXF1ZXN0b3IuYWNjZXB0QmluZGluZ30gY2FsbGJhY2tzIGFyZSBtYWRlIHVubGVzcworCSAqIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogQSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgc2V0dGluZ3MgdG8gdGhlaXIKKwkgKiBkZWZhdWx0IHZhbHVlcyBzbyB0aGUgb2JqZWN0IGlzIHJlYWR5IHRvIGJlIHJldXNlZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gY29tcGlsYXRpb25Vbml0cyB0aGUgY29tcGlsYXRpb24gdW5pdHMgdG8gY3JlYXRlIEFTVHMgZm9yCisJICogQHBhcmFtIGJpbmRpbmdLZXlzIHRoZSBiaW5kaW5nIGtleXMgdG8gY3JlYXRlIGJpbmRpbmdzIGZvcgorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIEFTVCByZXF1ZXN0b3IgdGhhdCBjb2xsZWN0cyBhYnN0cmFjdCBzeW50YXggdHJlZXMgYW5kIGJpbmRpbmdzCisJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIHJlcXVlc3QgY2FuY2VsbGF0aW9uLAogCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzZXR0aW5ncyBwcm92aWRlZAogCSAqIGFyZSBpbnN1ZmZpY2llbnQsIGNvbnRyYWRpY3RvcnksIG9yIG90aGVyd2lzZSB1bnN1cHBvcnRlZAogCSAqIEBzaW5jZSAzLjEKLSAgICAgKi8KKwkgKi8KIAlwdWJsaWMgdm9pZCBjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSBjb21waWxhdGlvblVuaXRzLCBTdHJpbmdbXSBiaW5kaW5nS2V5cywgQVNUUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRyeSB7CiAJCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKHRoaXMuc3RhdGVtZW50c1JlY292ZXJ5KSBmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZOwotCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlNUQVRFTUVOVF9SRUNPVkVSWSkgIT0gMCkgeworCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlk7CisJCQl9CisJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLklHTk9SRV9NRVRIT0RfQk9ESUVTKSAhPSAwKSB7CisJCQkJZmxhZ3MgfD0gSUNvbXBpbGF0aW9uVW5pdC5JR05PUkVfTUVUSE9EX0JPRElFUzsKKwkJCX0KKwkJCWlmICgodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuUkVTT0xWRV9CSU5ESU5HKSAhPSAwKSB7CiAJCQkJaWYgKHRoaXMucHJvamVjdCA9PSBudWxsKQogCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9qZWN0IG5vdCBzcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzLmJpbmRpbmdzUmVjb3ZlcnkpIGZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX0JJTkRJTkdTX1JFQ09WRVJZOworCQkJCWlmICgodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuQklORElOR19SRUNPVkVSWSkgIT0gMCkgeworCQkJCQlmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWTsKKwkJCQl9CiAJCQkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucmVzb2x2ZShjb21waWxhdGlvblVuaXRzLCBiaW5kaW5nS2V5cywgcmVxdWVzdG9yLCB0aGlzLmFwaUxldmVsLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgdGhpcy5wcm9qZWN0LCB0aGlzLndvcmtpbmdDb3B5T3duZXIsIGZsYWdzLCBtb25pdG9yKTsKIAkJCX0gZWxzZSB7CiAJCQkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucGFyc2UoY29tcGlsYXRpb25Vbml0cywgcmVxdWVzdG9yLCB0aGlzLmFwaUxldmVsLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgZmxhZ3MsIG1vbml0b3IpOwogCQkJfQogCQl9IGZpbmFsbHkgewotCQkJLy8gcmUtaW5pdCBkZWZhdWx0cyB0byBhbGxvdyByZXVzZSAoYW5kIGF2b2lkIGxlYWtpbmcpCisJCQkvLyByZXNldCB0byBkZWZhdWx0cyB0byBhbGxvdyByZXVzZSAoYW5kIGF2b2lkIGxlYWtpbmcpCiAJCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKIAkJfQogCX0KIAogCS8qKgotICAgICAqIENyZWF0ZXMgYmluZGluZ3MgZm9yIGEgYmF0Y2ggb2YgSmF2YSBlbGVtZW50cy4gVGhlc2UgZWxlbWVudHMgYXJlIGVpdGhlcgotICAgICAqIGVuY2xvc2VkIGluIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fXMgb3IgaW4ge0BsaW5rIElDbGFzc0ZpbGV9cy4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgZW5jbG9zaW5nIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCBjbGFzcyBmaWxlcyBtdXN0Ci0gICAgICogY29tZSBmcm9tIHRoZSBzYW1lIEphdmEgcHJvamVjdCwgd2hpY2ggbXVzdCBiZSBzZXQgYmVmb3JlaGFuZAotICAgICAqIHdpdGggPGNvZGU+c2V0UHJvamVjdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsbCBlbGVtZW50cyBtdXN0IGV4aXN0LiBJZiBvbmUgZG9lc24ndCBleGlzdCwgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPgotICAgICAqIGlzIHRocm93bi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIHJldHVybmVkIGFycmF5IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBnaXZlbiBlbGVtZW50cyBhcnJheS4gQXQgYSBnaXZlbiBwb3NpdGlvbgotICAgICAqIGl0IGNvbnRhaW5zIHRoZSBiaW5kaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBubyBiaW5kaW5nIGNvdWxkIGJlIGNyZWF0ZWQuCi0gICAgICogPC9wPgorCSAqIENyZWF0ZXMgQVNUcyBmb3IgYSBiYXRjaCBvZiBjb21waWxhdGlvbiB1bml0cy4KKwkgKiBXaGVuIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZCwgcHJvY2Vzc2luZyBhCisJICogYmF0Y2ggb2YgY29tcGlsYXRpb24gdW5pdHMgaXMgbW9yZSBlZmZpY2llbnQgYmVjYXVzZSBtdWNoCisJICogb2YgdGhlIHdvcmsgaW52b2x2ZWQgaW4gcmVzb2x2aW5nIGJpbmRpbmdzIGNhbiBiZSBzaGFyZWQuCisJICogPHA+CisJICogV2hlbiBiaW5kaW5ncyBhcmUgYmVpbmcgcmVzb2x2ZWQsIGFsbCBjb21waWxhdGlvbiB1bml0cyBhcmUgcmVzb2x2ZWQgdXNpbmcKKwkgKiB0aGUgc2FtZSBlbnZpcm9ubWVudCwgd2hpY2ggbXVzdCBiZSBzZXQgYmVmb3JlaGFuZAorCSAqIHdpdGgge0BsaW5rICNzZXRFbnZpcm9ubWVudChTdHJpbmdbXSwgU3RyaW5nW10sIFN0cmluZ1tdLCBib29sZWFuKSBzZXRFbnZpcm9ubWVudH0uCisJICogVGhlIGNvbXBpbGF0aW9uIHVuaXRzIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZSBpbiBubworCSAqIHNwZWNpZmllZCBvcmRlci4gRm9yIGVhY2ggb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGluIHR1cm4sCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgQVNUUGFyc2VyI2NyZWF0ZUFTVChJUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUfSBpcyBjYWxsZWQgdG8gcGFyc2UgaXQKKwkgKiBhbmQgY3JlYXRlIGEgY29ycmVzcG9uZGluZyBBU1QuIFRoZSBjYWxscyB0bworCSAqIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUKElQcm9ncmVzc01vbml0b3IpIEFTVFBhcnNlci5jcmVhdGVBU1R9IGFsbCBlbXBsb3kgdGhlIHNhbWUgc2V0dGluZ3MuPC9saT4KKwkgKiA8bGk+e0BsaW5rIEZpbGVBU1RSZXF1ZXN0b3IjYWNjZXB0QVNUKFN0cmluZywgQ29tcGlsYXRpb25Vbml0KSBGaWxlQVNUUmVxdWVzdG9yLmFjY2VwdEFTVH0gaXMgY2FsbGVkIHBhc3NpbmcKKwkgKiB0aGUgY29tcGlsYXRpb24gdW5pdCBwYXRoIGFuZCB0aGUgY29ycmVzcG9uZGluZyBBU1QgdG8gPGNvZGU+cmVxdWVzdG9yPC9jb2RlPi4gVGhlIGNvbXBpbGF0aW9uIHVuaXQgcGF0aCBpcyB0aGUgc2FtZQorCSAqIHBhdGggdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgZ2l2ZW4gPGNvZGU+c291cmNlRmlsZVBhdGhzPC9jb2RlPiBwYXJhbWV0ZXIuCisJICogPC9saT4KKwkgKiA8L3VsPgorCSAqIE5vdGUgb25seSBBU1RzIGZyb20gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXRzIGFyZSByZXBvcnRlZAorCSAqIHRvIHRoZSByZXF1ZXN0b3IuIElmIGFkZGl0aW9uYWwgY29tcGlsYXRpb24gdW5pdHMgYXJlIHJlcXVpcmVkIHRvCisJICogcmVzb2x2ZSB0aGUgb3JpZ2luYWwgb25lcywgdGhlIGNvcnJlc3BvbmRpbmcgQVNUcyBhcmUgPGI+bm90PC9iPgorCSAqIHJlcG9ydGVkIHRvIHRoZSByZXF1ZXN0b3IuCisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgYWxzbyB0aGUgZm9sbG93aW5nIHBhcnNlciBwYXJhbWV0ZXJzIGFyZSB1c2VkLCByZWdhcmRsZXNzIG9mIHdoYXQKKwkgKiBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZDoKKwkgKiA8dWw+CisJICogPGxpPlRoZSB7QGxpbmtwbGFpbiAjc2V0S2luZChpbnQpIHBhcnNlciBraW5kfSBpcyA8Y29kZT5LX0NPTVBJTEFUSU9OX1VOSVQ8L2NvZGU+PC9saT4KKwkgKiA8bGk+VGhlIHtAbGlua3BsYWluICNzZXRTb3VyY2VSYW5nZShpbnQsaW50KSBzb3VyY2UgcmFuZ2V9IGlzIDxjb2RlPigwLCAtMSk8L2NvZGU+PC9saT4KKwkgKiA8bGk+VGhlIHtAbGlua3BsYWluICNzZXRGb2NhbFBvc2l0aW9uKGludCkgZm9jYWwgcG9zaXRpb259IGlzIG5vdCBzZXQ8L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5iaW5kaW5nS2V5czwvY29kZT4gcGFyYW1ldGVyIHNwZWNpZmllcyBiaW5kaW5ncyBrZXlzCisJICogKHtAbGluayBJQmluZGluZyNnZXRLZXkoKX0pIHRoYXQgYXJlIHRvIGJlIGxvb2tlZCB1cC4gVGhlc2Uga2V5cyBtYXkKKwkgKiBiZSBmb3IgZWxlbWVudHMgZWl0aGVyIGluc2lkZSBvciBvdXRzaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24KKwkgKiB1bml0cyBiZWluZyBwcm9jZXNzZWQuIFdoZW4gYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLAorCSAqIHRoZSBrZXlzIGFuZCBjb3JyZXNwb25kaW5nIGJpbmRpbmdzIChvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKSBhcmUKKwkgKiBwYXNzZWQgdG8ge0BsaW5rIEZpbGVBU1RSZXF1ZXN0b3IjYWNjZXB0QmluZGluZyhTdHJpbmcsIElCaW5kaW5nKSBGaWxlQVNUUmVxdWVzdG9yLmFjY2VwdEJpbmRpbmd9LiBOb3RlIHRoYXQgYmluZGluZyBrZXlzCisJICogZm9yIGVsZW1lbnRzIG91dHNpZGUgdGhlIHNldCBvZiBjb21waWxhdGlvbiB1bml0cyBiZWluZyBwcm9jZXNzZWQgYXJlIGxvb2tlZCB1cAorCSAqIGFmdGVyIGFsbCB7QGxpbmsgRmlsZUFTVFJlcXVlc3RvciNhY2NlcHRBU1QoU3RyaW5nLCBDb21waWxhdGlvblVuaXQpIEFTVFJlcXVlc3Rvci5hY2NlcHRBU1R9CisJICogY2FsbGJhY2tzIGhhdmUgYmVlbiBtYWRlLgorCSAqIEJpbmRpbmcga2V5cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgYmVpbmcgcHJvY2Vzc2VkCisJICogYXJlIGxvb2tlZCB1cCBhbmQgcmVwb3J0ZWQgcmlnaHQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiB7QGxpbmsgRmlsZUFTVFJlcXVlc3RvciNhY2NlcHRBU1QoU3RyaW5nLCBDb21waWxhdGlvblVuaXQpIEZpbGVBU1RSZXF1ZXN0b3IuYWNjZXB0QVNUfSBjYWxsYmFjayBoYXMgYmVlbiBtYWRlLgorCSAqIE5vIHtAbGluayBGaWxlQVNUUmVxdWVzdG9yI2FjY2VwdEJpbmRpbmcoU3RyaW5nLCBJQmluZGluZykgRmlsZUFTVFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nfSBjYWxsYmFja3MgYXJlIG1hZGUgdW5sZXNzCisJICogYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCBzZXR0aW5ncyB0byB0aGVpcgorCSAqIGRlZmF1bHQgdmFsdWVzIHNvIHRoZSBvYmplY3QgaXMgcmVhZHkgdG8gYmUgcmV1c2VkLgorCSAqIDwvcD4KKwkgKiA8cD5UaGUgZ2l2ZW4gPGNvZGU+ZW5jb2RpbmdzPC9jb2RlPiBhcmUgdXNlZCB0byBwcm9wZXJseSBwYXJzZSB0aGUgZ2l2ZW4gc291cmNlIHVuaXRzLiBJZiB0aGUgcGxhdGZvcm0gZW5jb2RpbmcgaXMgc3VmZmljaWVudCwKKwkgKiB0aGVuIHRoZSBnaXZlbiBlbmNvZGluZ3MgY2FuIGJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi48L3A+CisJICoKKwkgKiBAcGFyYW0gc291cmNlRmlsZVBhdGhzIHRoZSBjb21waWxhdGlvbiB1bml0cyB0byBjcmVhdGUgQVNUcyBmb3IKKwkgKiBAcGFyYW0gZW5jb2RpbmdzIHRoZSBnaXZlbiBlbmNvZGluZyBmb3IgdGhlIHNvdXJjZSB1bml0cworCSAqIEBwYXJhbSBiaW5kaW5nS2V5cyB0aGUgYmluZGluZyBrZXlzIHRvIGNyZWF0ZSBiaW5kaW5ncyBmb3IKKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBBU1QgcmVxdWVzdG9yIHRoYXQgY29sbGVjdHMgYWJzdHJhY3Qgc3ludGF4IHRyZWVzIGFuZCBiaW5kaW5ncworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCByZXF1ZXN0IGNhbmNlbGxhdGlvbiwKKwkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc2V0dGluZ3MgcHJvdmlkZWQKKwkgKiBhcmUgaW5zdWZmaWNpZW50LCBjb250cmFkaWN0b3J5LCBvciBvdGhlcndpc2UgdW5zdXBwb3J0ZWQKKwkgKiBAc2luY2UgMy42CisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQVNUcyhTdHJpbmdbXSBzb3VyY2VGaWxlUGF0aHMsIFN0cmluZ1tdIGVuY29kaW5ncywgU3RyaW5nW10gYmluZGluZ0tleXMsCisJCQlGaWxlQVNUUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRyeSB7CisJCQlpbnQgZmxhZ3MgPSAwOworCQkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5TVEFURU1FTlRfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQlmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZOworCQkJfQorCQkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMCkgeworCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVM7CisJCQl9CisJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlJFU09MVkVfQklORElORykgIT0gMCkgeworCQkJCWlmICh0aGlzLmNsYXNzcGF0aHMgPT0gbnVsbCAmJiB0aGlzLnNvdXJjZXBhdGhzID09IG51bGwgJiYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5JTkNMVURFX1JVTk5JTkdfVk1fQk9PVENMQVNTUEFUSCkgPT0gMCkpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gZW52aXJvbm1lbnQgaXMgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5CSU5ESU5HX1JFQ09WRVJZKSAhPSAwKSB7CisJCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX0JJTkRJTkdTX1JFQ09WRVJZOworCQkJCX0KKwkJCQlDb21waWxhdGlvblVuaXRSZXNvbHZlci5yZXNvbHZlKHNvdXJjZUZpbGVQYXRocywgZW5jb2RpbmdzLCBiaW5kaW5nS2V5cywgcmVxdWVzdG9yLCB0aGlzLmFwaUxldmVsLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgZ2V0Q2xhc3NwYXRoKCksIGZsYWdzLCBtb25pdG9yKTsKKwkJCX0gZWxzZSB7CisJCQkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucGFyc2Uoc291cmNlRmlsZVBhdGhzLCBlbmNvZGluZ3MsIHJlcXVlc3RvciwgdGhpcy5hcGlMZXZlbCwgdGhpcy5jb21waWxlck9wdGlvbnMsIGZsYWdzLCBtb25pdG9yKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCS8vIHJlc2V0IHRvIGRlZmF1bHRzIHRvIGFsbG93IHJldXNlIChhbmQgYXZvaWQgbGVha2luZykKKwkJCWluaXRpYWxpemVEZWZhdWx0cygpOworCQl9CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYmluZGluZ3MgZm9yIGEgYmF0Y2ggb2YgSmF2YSBlbGVtZW50cy4KKwkgKiAKKwkgKiA8cD5UaGVzZSBlbGVtZW50cyBhcmUgZWl0aGVyCisJICogZW5jbG9zZWQgaW4ge0BsaW5rIElDb21waWxhdGlvblVuaXQgSUNvbXBpbGF0aW9uVW5pdHN9IG9yIGluIHtAbGluayBJQ2xhc3NGaWxlIElDbGFzc0ZpbGVzfS48L3A+CisJICogPHA+CisJICogQWxsIGVuY2xvc2luZyBjb21waWxhdGlvbiB1bml0cyBhbmQgY2xhc3MgZmlsZXMgbXVzdAorCSAqIGNvbWUgZnJvbSB0aGUgc2FtZSBKYXZhIHByb2plY3QsIHdoaWNoIG11c3QgYmUgc2V0IGJlZm9yZWhhbmQKKwkgKiB3aXRoIHtAbGluayAjc2V0UHJvamVjdChJSmF2YVByb2plY3QpIHNldFByb2plY3R9LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBBbGwgZWxlbWVudHMgbXVzdCBleGlzdC4gSWYgb25lIGRvZXNuJ3QgZXhpc3QsIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259CisJICogaXMgdGhyb3duLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgcmV0dXJuZWQgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGdpdmVuIGVsZW1lbnRzIGFycmF5LiBBdCBhIGdpdmVuIHBvc2l0aW9uCisJICogaXQgY29udGFpbnMgdGhlIGJpbmRpbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIG5vIGJpbmRpbmcgY291bGQgYmUgY3JlYXRlZC4KKwkgKiA8L3A+CiAJICogPHA+CiAJICogTm90ZSBhbHNvIHRoZSBmb2xsb3dpbmcgcGFyc2VyIHBhcmFtZXRlcnMgYXJlIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdAogCSAqIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkOgpAQCAtNzY1LDQxICsxMDIzLDc1IEBACiAJICogPGxpPlRoZSB7QGxpbmtwbGFpbiAjc2V0Rm9jYWxQb3NpdGlvbihpbnQpIGZvY2FsIHBvc2l0aW9ufSBpcyBub3Qgc2V0PC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCBzZXR0aW5ncyB0byB0aGVpcgotICAgICAqIGRlZmF1bHQgdmFsdWVzIHNvIHRoZSBvYmplY3QgaXMgcmVhZHkgdG8gYmUgcmV1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50cyB0aGUgSmF2YSBlbGVtZW50cyB0byBjcmVhdGUgYmluZGluZ3MgZm9yCi0gICAgICogQHJldHVybiB0aGUgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnRzLCBwb3NzaWJseSBjb250YWluaW5nIDxjb2RlPm51bGw8L2NvZGU+cwotICAgICAqICAgICAgICAgICAgICBpZiBzb21lIGJpbmRpbmdzIGNvdWxkIG5vdCBiZSBjcmVhdGVkCisJICogPHA+CisJICogQSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgc2V0dGluZ3MgdG8gdGhlaXIKKwkgKiBkZWZhdWx0IHZhbHVlcyBzbyB0aGUgb2JqZWN0IGlzIHJlYWR5IHRvIGJlIHJldXNlZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIEphdmEgZWxlbWVudHMgdG8gY3JlYXRlIGJpbmRpbmdzIGZvcgorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50cywgcG9zc2libHkgY29udGFpbmluZyA8Y29kZT5udWxsPC9jb2RlPnMKKwkgKiAgICAgICAgICAgICAgaWYgc29tZSBiaW5kaW5ncyBjb3VsZCBub3QgYmUgY3JlYXRlZAogCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzZXR0aW5ncyBwcm92aWRlZAogCSAqIGFyZSBpbnN1ZmZpY2llbnQsIGNvbnRyYWRpY3RvcnksIG9yIG90aGVyd2lzZSB1bnN1cHBvcnRlZAogCSAqIEBzaW5jZSAzLjEKLSAgICAgKi8KKwkgKi8KIAlwdWJsaWMgSUJpbmRpbmdbXSBjcmVhdGVCaW5kaW5ncyhJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRyeSB7CiAJCQlpZiAodGhpcy5wcm9qZWN0ID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvamVjdCBub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9qZWN0IG9yIGNsYXNzcGF0aCBub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKIAkJCWludCBmbGFncyA9IDA7Ci0JCQlpZiAodGhpcy5zdGF0ZW1lbnRzUmVjb3ZlcnkpIGZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlk7Ci0JCQlpZiAodGhpcy5iaW5kaW5nc1JlY292ZXJ5KSAgZmxhZ3MgfD0gSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlk7CisJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlNUQVRFTUVOVF9SRUNPVkVSWSkgIT0gMCkgeworCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlk7CisJCQl9CisJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLkJJTkRJTkdfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQlmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWTsKKwkJCX0KKwkJCWlmICgodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDApIHsKKwkJCQlmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LklHTk9SRV9NRVRIT0RfQk9ESUVTOworCQkJfQogCQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLnJlc29sdmUoZWxlbWVudHMsIHRoaXMuYXBpTGV2ZWwsIHRoaXMuY29tcGlsZXJPcHRpb25zLCB0aGlzLnByb2plY3QsIHRoaXMud29ya2luZ0NvcHlPd25lciwgZmxhZ3MsIG1vbml0b3IpOwogCQl9IGZpbmFsbHkgewotCQkJLy8gcmUtaW5pdCBkZWZhdWx0cyB0byBhbGxvdyByZXVzZSAoYW5kIGF2b2lkIGxlYWtpbmcpCisJCQkvLyByZXNldCB0byBkZWZhdWx0cyB0byBhbGxvdyByZXVzZSAoYW5kIGF2b2lkIGxlYWtpbmcpCiAJCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKIAkJfQogCX0KIAogCXByaXZhdGUgQVNUTm9kZSBpbnRlcm5hbENyZWF0ZUFTVChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYm9vbGVhbiBuZWVkVG9SZXNvbHZlQmluZGluZ3MgPSB0aGlzLnJlc29sdmVCaW5kaW5nczsKKwkJYm9vbGVhbiBuZWVkVG9SZXNvbHZlQmluZGluZ3MgPSAodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuUkVTT0xWRV9CSU5ESU5HKSAhPSAwOwogCQlzd2l0Y2godGhpcy5hc3RLaW5kKSB7CiAJCQljYXNlIEtfQ0xBU1NfQk9EWV9ERUNMQVJBVElPTlMgOgogCQkJY2FzZSBLX0VYUFJFU1NJT04gOgogCQkJY2FzZSBLX1NUQVRFTUVOVFMgOgorCQkJCWlmICh0aGlzLnJhd1NvdXJjZSA9PSBudWxsKSB7CisJCQkJCWlmICh0aGlzLnR5cGVSb290ICE9IG51bGwpIHsKKwkJCQkJCS8vIGdldCB0aGUgc291cmNlIGZyb20gdGhlIHR5cGUgcm9vdAorCQkJCQkJaWYgKHRoaXMudHlwZVJvb3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7CisJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0KSB0aGlzLnR5cGVSb290OworCQkJCQkJCXRoaXMucmF3U291cmNlID0gc291cmNlVW5pdC5nZXRDb250ZW50cygpOworCQkJCQkJfSBlbHNlIGlmICh0aGlzLnR5cGVSb290IGluc3RhbmNlb2YgSUNsYXNzRmlsZSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCVN0cmluZyBzb3VyY2VTdHJpbmcgPSB0aGlzLnR5cGVSb290LmdldFNvdXJjZSgpOworCQkJCQkJCQlpZiAoc291cmNlU3RyaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJCXRoaXMucmF3U291cmNlID0gc291cmNlU3RyaW5nLnRvQ2hhckFycmF5KCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCS8vIGFuIGVycm9yIG9jY3VyZWQgYWNjZXNzaW5nIHRoZSBqYXZhIGVsZW1lbnQKKwkJCQkJCQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCQkJCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKKwkJCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgd3JpdGVyLmNsb3NlKCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CiAJCQkJaWYgKHRoaXMucmF3U291cmNlICE9IG51bGwpIHsKIAkJCQkJaWYgKHRoaXMuc291cmNlT2Zmc2V0ICsgdGhpcy5zb3VyY2VMZW5ndGggPiB0aGlzLnJhd1NvdXJjZS5sZW5ndGgpIHsKLQkJCQkJICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gaW50ZXJuYWxDcmVhdGVBU1RGb3JLaW5kKCk7CiAJCQkJfQpAQCAtODQ2LDI3ICsxMTM4LDUwIEBACiAJCQkJCQkJc291cmNlVW5pdCA9IG5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdChzb3VyY2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgVXRpbC50b0NoYXJBcnJheXMocGFja2FnZUZyYWdtZW50Lm5hbWVzKSwgbmV3IFN0cmluZyhmaWxlTmFtZSksIHRoaXMucHJvamVjdCk7CiAJCQkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJLy8gYW4gZXJyb3Igb2NjdXJlZCBhY2Nlc3NpbmcgdGhlIGphdmEgZWxlbWVudAotCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJCQkJCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisJCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQkJaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsKKwkJCQkJCQl9CisJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkpKTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIGlmICh0aGlzLnJhd1NvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQluZWVkVG9SZXNvbHZlQmluZGluZ3MgPSB0aGlzLnJlc29sdmVCaW5kaW5ncyAmJiB0aGlzLnVuaXROYW1lICE9IG51bGwgJiYgdGhpcy5wcm9qZWN0ICE9IG51bGwgJiYgdGhpcy5jb21waWxlck9wdGlvbnMgIT0gbnVsbDsKKwkJCQkJCW5lZWRUb1Jlc29sdmVCaW5kaW5ncyA9IAorCQkJCQkJCSgodGhpcy5iaXRzICYgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuUkVTT0xWRV9CSU5ESU5HKSAhPSAwKQorCQkJCQkJCSYmIHRoaXMudW5pdE5hbWUgIT0gbnVsbAorCQkJCQkJCSYmICh0aGlzLnByb2plY3QgIT0gbnVsbAorCQkJCQkJCQkJfHwgdGhpcy5jbGFzc3BhdGhzICE9IG51bGwKKwkJCQkJCQkJCXx8IHRoaXMuc291cmNlcGF0aHMgIT0gbnVsbAorCQkJCQkJCQkJfHwgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5JTkNMVURFX1JVTk5JTkdfVk1fQk9PVENMQVNTUEFUSCkgIT0gMCkpCisJCQkJCQkJJiYgdGhpcy5jb21waWxlck9wdGlvbnMgIT0gbnVsbDsKIAkJCQkJCXNvdXJjZVVuaXQgPSBuZXcgQmFzaWNDb21waWxhdGlvblVuaXQodGhpcy5yYXdTb3VyY2UsIG51bGwsIHRoaXMudW5pdE5hbWUgPT0gbnVsbCA/ICIiIDogdGhpcy51bml0TmFtZSwgdGhpcy5wcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9IGVsc2UgewogCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogCQkJCQl9Ci0JCQkJCWlmICh0aGlzLnBhcnRpYWwpIHsKKwkJCQkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5QQVJUSUFMKSAhPSAwKSB7CiAJCQkJCQlzZWFyY2hlciA9IG5ldyBOb2RlU2VhcmNoZXIodGhpcy5mb2NhbFBvaW50UG9zaXRpb24pOwogCQkJCQl9CiAJCQkJCWludCBmbGFncyA9IDA7Ci0JCQkJCWlmICh0aGlzLnN0YXRlbWVudHNSZWNvdmVyeSkgZmxhZ3MgfD0gSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWTsKKwkJCQkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5TVEFURU1FTlRfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlk7CisJCQkJCX0KKwkJCQkJaWYgKHNlYXJjaGVyID09IG51bGwgJiYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMCkpIHsKKwkJCQkJCWZsYWdzIHw9IElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVM7CisJCQkJCX0KIAkJCQkJaWYgKG5lZWRUb1Jlc29sdmVCaW5kaW5ncykgewotCQkJCQkJaWYgKHRoaXMuYmluZGluZ3NSZWNvdmVyeSkgZmxhZ3MgfD0gSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlk7CisJCQkJCQlpZiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLkJJTkRJTkdfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQkJCQlmbGFncyB8PSBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWTsKKwkJCQkJCX0KIAkJCQkJCXRyeSB7CiAJCQkJCQkJLy8gcGFyc2UgYW5kIHJlc29sdmUKIAkJCQkJCQljb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9CiAJCQkJCQkJCUNvbXBpbGF0aW9uVW5pdFJlc29sdmVyLnJlc29sdmUoCiAJCQkJCQkJCQlzb3VyY2VVbml0LAogCQkJCQkJCQkJdGhpcy5wcm9qZWN0LAorCQkJCQkJCQkJZ2V0Q2xhc3NwYXRoKCksCiAJCQkJCQkJCQlzZWFyY2hlciwKIAkJCQkJCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLAogCQkJCQkJCQkJdGhpcy53b3JraW5nQ29weU93bmVyLApAQCAtODk4LDExICsxMjEzLDEzIEBACiAJCQkJCQl3Y093bmVyLAogCQkJCQkJbmVlZFRvUmVzb2x2ZUJpbmRpbmdzID8gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuQmluZGluZ1RhYmxlcygpIDogbnVsbCwKIAkJCQkJCWZsYWdzLAotCQkJCQkJbW9uaXRvcik7CisJCQkJCQltb25pdG9yLAorCQkJCQkJdGhpcy5wcm9qZWN0ICE9IG51bGwpOwogCQkJCQlyZXN1bHQuc2V0VHlwZVJvb3QodGhpcy50eXBlUm9vdCk7CiAJCQkJCXJldHVybiByZXN1bHQ7CiAJCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uICE9IG51bGwgJiYgdGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQkJaWYgKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uICE9IG51bGwKKwkJCQkJCQkmJiAoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLlJFU09MVkVfQklORElORykgIT0gMCkpIHsKIAkJCQkJCWNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmNsZWFuVXAoKTsKIAkJCQkJfQogCQkJCX0KQEAgLTk4OSwyNCArMTMwNiwzMiBAQAogCQlBU1QgYXN0ID0gQVNULm5ld0FTVCh0aGlzLmFwaUxldmVsKTsKIAkJYXN0LnNldERlZmF1bHROb2RlRmxhZyhBU1ROb2RlLk9SSUdJTkFMKTsKIAkJYXN0LnNldEJpbmRpbmdSZXNvbHZlcihuZXcgQmluZGluZ1Jlc29sdmVyKCkpOwotCQlpZiAodGhpcy5zdGF0ZW1lbnRzUmVjb3ZlcnkpIHsKKwkJaWYgKCh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5TVEFURU1FTlRfUkVDT1ZFUlkpICE9IDApIHsKIAkJCWFzdC5zZXRGbGFnKElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkpOwogCQl9CiAJCWNvbnZlcnRlci5zZXRBU1QoYXN0KTsKLQkJQ29kZVNuaXBwZXRQYXJzaW5nVXRpbCBjb2RlU25pcHBldFBhcnNpbmdVdGlsID0gbmV3IENvZGVTbmlwcGV0UGFyc2luZ1V0aWwoKTsKKwkJQ29kZVNuaXBwZXRQYXJzaW5nVXRpbCBjb2RlU25pcHBldFBhcnNpbmdVdGlsID0gbmV3IENvZGVTbmlwcGV0UGFyc2luZ1V0aWwoKHRoaXMuYml0cyAmIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyLklHTk9SRV9NRVRIT0RfQk9ESUVTKSAhPSAwKTsKIAkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGFzdC5uZXdDb21waWxhdGlvblVuaXQoKTsKIAkJaWYgKHRoaXMuc291cmNlTGVuZ3RoID09IC0xKSB7CiAJCQl0aGlzLnNvdXJjZUxlbmd0aCA9IHRoaXMucmF3U291cmNlLmxlbmd0aDsKIAkJfQogCQlzd2l0Y2godGhpcy5hc3RLaW5kKSB7CiAJCQljYXNlIEtfU1RBVEVNRU5UUyA6Ci0JCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZVN0YXRlbWVudHModGhpcy5yYXdTb3VyY2UsIHRoaXMuc291cmNlT2Zmc2V0LCB0aGlzLnNvdXJjZUxlbmd0aCwgdGhpcy5jb21waWxlck9wdGlvbnMsIHRydWUsIHRoaXMuc3RhdGVtZW50c1JlY292ZXJ5KTsKKwkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSBjb2RlU25pcHBldFBhcnNpbmdVdGlsLnBhcnNlU3RhdGVtZW50cygKKwkJCQkJCXRoaXMucmF3U291cmNlLAorCQkJCQkJdGhpcy5zb3VyY2VPZmZzZXQsCisJCQkJCQl0aGlzLnNvdXJjZUxlbmd0aCwKKwkJCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCSh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5TVEFURU1FTlRfUkVDT1ZFUlkpICE9IDApOwogCQkJCVJlY292ZXJ5U2Nhbm5lckRhdGEgZGF0YSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQucmVjb3ZlcnlTY2FubmVyRGF0YTsKIAkJCQlpZihkYXRhICE9IG51bGwpIHsKIAkJCQkJU2Nhbm5lciBzY2FubmVyID0gY29udmVydGVyLnNjYW5uZXI7CiAJCQkJCWNvbnZlcnRlci5zY2FubmVyID0gbmV3IFJlY292ZXJ5U2Nhbm5lcihzY2FubmVyLCBkYXRhLnJlbW92ZVVudXNlZCgpKTsKIAkJCQkJY29udmVydGVyLmRvY1BhcnNlci5zY2FubmVyID0gY29udmVydGVyLnNjYW5uZXI7CiAJCQkJCWNvbnZlcnRlci5zY2FubmVyLnNldFNvdXJjZShzY2FubmVyLnNvdXJjZSk7CisJCQkJCQorCQkJCQljb21waWxhdGlvblVuaXQuc2V0U3RhdGVtZW50c1JlY292ZXJ5RGF0YShkYXRhKTsKIAkJCQl9CiAJCQkJUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24gcmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24gPSBjb2RlU25pcHBldFBhcnNpbmdVdGlsLnJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uOwogCQkJCWludFtdW10gY29tbWVudHMgPSByZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbi5jb21tZW50UG9zaXRpb25zOwpAQCAtMTA1OCw3ICsxMzgzLDE0IEBACiAJCQkJCXJldHVybiBjb21waWxhdGlvblVuaXQ7CiAJCQkJfQogCQkJY2FzZSBLX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TIDoKLQkJCQlmaW5hbCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGVbXSBub2RlcyA9IGNvZGVTbmlwcGV0UGFyc2luZ1V0aWwucGFyc2VDbGFzc0JvZHlEZWNsYXJhdGlvbnModGhpcy5yYXdTb3VyY2UsIHRoaXMuc291cmNlT2Zmc2V0LCB0aGlzLnNvdXJjZUxlbmd0aCwgdGhpcy5jb21waWxlck9wdGlvbnMsIHRydWUpOworCQkJCWZpbmFsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZVtdIG5vZGVzID0KKwkJCQkJY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZUNsYXNzQm9keURlY2xhcmF0aW9ucygKKwkJCQkJCQl0aGlzLnJhd1NvdXJjZSwKKwkJCQkJCQl0aGlzLnNvdXJjZU9mZnNldCwKKwkJCQkJCQl0aGlzLnNvdXJjZUxlbmd0aCwKKwkJCQkJCQl0aGlzLmNvbXBpbGVyT3B0aW9ucywKKwkJCQkJCQl0cnVlLAorCQkJCQkJCSh0aGlzLmJpdHMgJiBDb21waWxhdGlvblVuaXRSZXNvbHZlci5TVEFURU1FTlRfUkVDT1ZFUlkpICE9IDApOwogCQkJCXJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uID0gY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbjsKIAkJCQljb21tZW50cyA9IHJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uLmNvbW1lbnRQb3NpdGlvbnM7CiAJCQkJaWYgKGNvbW1lbnRzICE9IG51bGwpIHsKQEAgLTEwNjYsNiArMTM5OCw3IEBACiAJCQkJfQogCQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRMaW5lRW5kVGFibGUocmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24ubGluZUVuZHMpOwogCQkJCWlmIChub2RlcyAhPSBudWxsKSB7CisJCQkJCS8vIHNvdXJjZSBoYXMgbm8gc3ludGF4IGVycm9yIG9yIHRoZSBzdGF0ZW1lbnQgcmVjb3ZlcnkgaXMgZW5hYmxlZAogCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gY29udmVydGVyLmNvbnZlcnQobm9kZXMpOwogCQkJCQl0eXBlRGVjbGFyYXRpb24uc2V0U291cmNlUmFuZ2UodGhpcy5zb3VyY2VPZmZzZXQsIHRoaXMuc291cmNlT2Zmc2V0ICsgdGhpcy5zb3VyY2VMZW5ndGgpOwogCQkJCQlyb290Tm9kZVRvQ29tcGlsYXRpb25Vbml0KHR5cGVEZWNsYXJhdGlvbi5nZXRBU1QoKSwgY29tcGlsYXRpb25Vbml0LCB0eXBlRGVjbGFyYXRpb24sIGNvZGVTbmlwcGV0UGFyc2luZ1V0aWwucmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24sIG51bGwpOwpAQCAtMTA3Myw2ICsxNDA2LDcgQEAKIAkJCQkJYXN0LnNldE9yaWdpbmFsTW9kaWZpY2F0aW9uQ291bnQoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkpOwogCQkJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOwogCQkJCX0gZWxzZSB7CisJCQkJCS8vIHNvdXJjZSBoYXMgc3ludGF4IGVycm9yIGFuZCB0aGUgc3RhdGVtZW50IHJlY292ZXJ5IGlzIGRpc2FibGVkCiAJCQkJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zID0gcmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24ucHJvYmxlbXM7CiAJCQkJCWlmIChwcm9ibGVtcyAhPSBudWxsKSB7CiAJCQkJCQljb21waWxhdGlvblVuaXQuc2V0UHJvYmxlbXMocHJvYmxlbXMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RSZWNvdmVyeVByb3BhZ2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUUmVjb3ZlcnlQcm9wYWdhdG9yLmphdmEKaW5kZXggODQ1NTAzZC4uMjgzNzFkNiAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RSZWNvdmVyeVByb3BhZ2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFJlY292ZXJ5UHJvcGFnYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTc0LDI5ICs3NCwzMiBAQAogCiAJcHJpdmF0ZSBDYXRlZ29yaXplZFByb2JsZW1bXSBwcm9ibGVtczsKIAlwcml2YXRlIGJvb2xlYW5bXSB1c2VkT3JJcnJlbGV2YW50UHJvYmxlbXM7Ci0JCisKIAlwcml2YXRlIFJlY292ZXJ5U2Nhbm5lckRhdGEgZGF0YTsKIAlwcml2YXRlIGludCBibG9ja0RlcHRoID0gMDsKIAlwcml2YXRlIGludCBsYXN0RW5kOwotCQorCiAJcHJpdmF0ZSBpbnRbXSBpbnNlcnRlZFRva2Vuc0tpbmQ7CiAJcHJpdmF0ZSBpbnRbXSBpbnNlcnRlZFRva2Vuc1Bvc2l0aW9uOwogCXByaXZhdGUgYm9vbGVhbltdIGluc2VydGVkVG9rZW5zRmxhZ2dlZDsKLQkKKwogCXByaXZhdGUgYm9vbGVhbltdIHJlbW92ZWRUb2tlbnNGbGFnZ2VkOwogCXByaXZhdGUgYm9vbGVhbltdIHJlcGxhY2VkVG9rZW5zRmxhZ2dlZDsKLQkKKwogCXByaXZhdGUgVmVjdG9yIHN0YWNrID0gbmV3IFZlY3RvcigpOwotCQorCisJLyoqCisJICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisJICovCiAJQVNUUmVjb3ZlcnlQcm9wYWdhdG9yKENhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zLCBSZWNvdmVyeVNjYW5uZXJEYXRhIGRhdGEpIHsKIAkJLy8gdmlzaXQgSmF2YWRvYy50YWdzKCkgYXMgd2VsbAogCQl0aGlzLnByb2JsZW1zID0gcHJvYmxlbXM7CiAJCXRoaXMudXNlZE9ySXJyZWxldmFudFByb2JsZW1zID0gbmV3IGJvb2xlYW5bcHJvYmxlbXMubGVuZ3RoXTsKLQkJCisKIAkJdGhpcy5kYXRhID0gZGF0YTsKLQkJCisKIAkJaWYodGhpcy5kYXRhICE9IG51bGwpIHsKLQkJCQorCiAJCQlpbnQgbGVuZ3RoID0gMDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5pbnNlcnRlZFRva2Vuc1B0ciArIDE7IGkrKykgewogCQkJCWxlbmd0aCArPSBkYXRhLmluc2VydGVkVG9rZW5zW2ldLmxlbmd0aDsKQEAgLTExMiw3ICsxMTUsNyBAQAogCQkJCQl0b2tlbkNvdW50Kys7CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmKGRhdGEucmVtb3ZlZFRva2Vuc1B0ciAhPSAtMSkgewogCQkJCXRoaXMucmVtb3ZlZFRva2Vuc0ZsYWdnZWQgPSBuZXcgYm9vbGVhbltkYXRhLnJlbW92ZWRUb2tlbnNQdHIgKyAxXTsKIAkJCX0KQEAgLTEzMCwyMSArMTMzLDIxIEBACiAJCXN1cGVyLmVuZFZpc2l0KG5vZGUpOwogCX0KIAotCQorCiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBub2RlKSB7CiAJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHN1cGVyLnZpc2l0KG5vZGUpOwogCQl0aGlzLmJsb2NrRGVwdGgrKzsKIAkJcmV0dXJuIHZpc2l0Q2hpbGRyZW47CiAJfQotCQorCiAJcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXROb2RlKEFTVE5vZGUgbm9kZSkgewogCQlpZih0aGlzLmJsb2NrRGVwdGggPiAwKSB7CiAJCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCWludCBlbmQgPSBzdGFydCArIG5vZGUuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJCisKIAkJCS8vIGNvbnRpbnVlIHRvIHZpc2l0IHRoZSBub2RlIG9ubHkgaWYgaXQgY29udGFpbnMgdG9rZW5zIG1vZGlmaWNhdGlvbnMKLQkJCQorCiAJCQlpZih0aGlzLmluc2VydGVkVG9rZW5zRmxhZ2dlZCAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluc2VydGVkVG9rZW5zRmxhZ2dlZC5sZW5ndGg7IGkrKykgewogCQkJCQlpZih0aGlzLmluc2VydGVkVG9rZW5zUG9zaXRpb25baV0gPj0gc3RhcnQgJiYKQEAgLTE1Myw3ICsxNTYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmKHRoaXMucmVtb3ZlZFRva2Vuc0ZsYWdnZWQgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZGF0YS5yZW1vdmVkVG9rZW5zUHRyOyBpKyspIHsKIAkJCQkJaWYodGhpcy5kYXRhLnJlbW92ZWRUb2tlbnNTdGFydFtpXSA+PSBzdGFydCAmJgpAQCAtMTYyLDcgKzE2NSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJaWYodGhpcy5yZXBsYWNlZFRva2Vuc0ZsYWdnZWQgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZGF0YS5yZXBsYWNlZFRva2Vuc1B0cjsgaSsrKSB7CiAJCQkJCWlmKHRoaXMuZGF0YS5yZXBsYWNlZFRva2Vuc1N0YXJ0W2ldID49IHN0YXJ0ICYmCkBAIC0xNzEsNyArMTc0LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJcmV0dXJuIHRydWU7CkBAIC0xODAsMTUgKzE4MywzMSBAQAogCXByb3RlY3RlZCB2b2lkIGVuZFZpc2l0Tm9kZShBU1ROb2RlIG5vZGUpIHsKIAkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCWludCBlbmQgPSBzdGFydCArIG5vZGUuZ2V0TGVuZ3RoKCkgLSAxOwotCQkKKwogCQkvLyBpcyBpbnNpZGUgZGlldCBwYXJ0IG9mIHRoZSBhc3QKIAkJaWYodGhpcy5ibG9ja0RlcHRoIDwgMSkgewotCQkJaWYodGhpcy5tYXJrSW5jbHVkZWRQcm9ibGVtcyhzdGFydCwgZW5kKSkgewotCQkJCW5vZGUuc2V0RmxhZ3Mobm9kZS5nZXRGbGFncygpIHwgQVNUTm9kZS5SRUNPVkVSRUQpOworCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKKwkJCQljYXNlIEFTVE5vZGUuQU5OT1RBVElPTl9UWVBFX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5DT01QSUxBVElPTl9VTklUOgorCQkJCWNhc2UgQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTjoKKwkJCQljYXNlIEFTVE5vZGUuSU1QT1JUX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5JTklUSUFMSVpFUjoKKwkJCQljYXNlIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5QQUNLQUdFX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQVNUTm9kZS5NQVJLRVJfQU5OT1RBVElPTjoKKwkJCQljYXNlIEFTVE5vZGUuTk9STUFMX0FOTk9UQVRJT046CisJCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoKKwkJCQljYXNlIEFTVE5vZGUuQkxPQ0s6CisJCQkJCWlmKG1hcmtJbmNsdWRlZFByb2JsZW1zKHN0YXJ0LCBlbmQpKSB7CisJCQkJCQlub2RlLnNldEZsYWdzKG5vZGUuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuUkVDT1ZFUkVEKTsKKwkJCQkJfQorCQkJCQlicmVhazsKIAkJCX0KLQkJfSBlbHNlIHsJCQkKLQkJCXRoaXMubWFya0luY2x1ZGVkUHJvYmxlbXMoc3RhcnQsIGVuZCk7Ci0JCQkKKwkJfSBlbHNlIHsKKwkJCW1hcmtJbmNsdWRlZFByb2JsZW1zKHN0YXJ0LCBlbmQpOworCiAJCQlpZih0aGlzLmluc2VydGVkVG9rZW5zRmxhZ2dlZCAhPSBudWxsKSB7CiAJCQkJaWYodGhpcy5sYXN0RW5kICE9IGVuZCkgewogCQkJCQlmbGFnTm9kZVdpdGhJbnNlcnRlZFRva2VucygpOwpAQCAtMjA2LDcgKzIyNSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJaWYodGhpcy5yZXBsYWNlZFRva2Vuc0ZsYWdnZWQgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuZGF0YS5yZXBsYWNlZFRva2Vuc1B0cjsgaSsrKSB7CiAJCQkJCWlmKCF0aGlzLnJlcGxhY2VkVG9rZW5zRmxhZ2dlZFtpXSAmJgpAQCAtMjIwLDcgKzIzOSw3IEBACiAJCX0KIAkJdGhpcy5sYXN0RW5kID0gZW5kOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBmbGFnTm9kZVdpdGhJbnNlcnRlZFRva2VucygpIHsKIAkJaWYodGhpcy5pbnNlcnRlZFRva2Vuc0tpbmQgIT0gbnVsbCAmJiB0aGlzLmluc2VydGVkVG9rZW5zS2luZC5sZW5ndGggPiAwKSB7CiAJCQlpbnQgcyA9IHRoaXMuc3RhY2suc2l6ZSgpOwpAQCAtMjMzLDEzICsyNTIsMTMgQEAKIAkJCXRoaXMuc3RhY2sgPSBuZXcgVmVjdG9yKCk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gZmxhZ05vZGVzV2l0aEluc2VydGVkVG9rZW5zQXRFbmQoQVNUTm9kZSBub2RlKSB7CiAJCWludFtdIGV4cGVjdGVkRW5kaW5nVG9rZW4gPSB0aGlzLmVuZGluZ1Rva2Vucy5nZXQobm9kZS5nZXRDbGFzcygpKTsKIAkJaWYgKGV4cGVjdGVkRW5kaW5nVG9rZW4gIT0gbnVsbCkgewogCQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCQlpbnQgZW5kID0gc3RhcnQgKyBub2RlLmdldExlbmd0aCgpIC0gMTsKLQkJCQorCiAJCQlib29sZWFuIGZsYWdQYXJlbnQgPSBmYWxzZTsKIAkJCWRvbmUgOiBmb3IgKGludCBpID0gdGhpcy5pbnNlcnRlZFRva2Vuc0tpbmQubGVuZ3RoIC0gMTsgaSA+IC0xIDsgaS0tKSB7CiAJCQkJaWYoIXRoaXMuaW5zZXJ0ZWRUb2tlbnNGbGFnZ2VkW2ldICYmCkBAIC0yNTQsNyArMjczLDcgQEAKIAkJCQkJZmxhZ1BhcmVudCA9IHRydWU7CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmKGZsYWdQYXJlbnQpIHsKIAkJCQlBU1ROb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7CiAJCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CkBAIC0yNjksNyArMjg4LDcgQEAKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gZmxhZ05vZGVzV2l0aEluc2VydGVkVG9rZW5zSW5zaWRlKEFTVE5vZGUgbm9kZSkgewogCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJaW50IGVuZCA9IHN0YXJ0ICsgbm9kZS5nZXRMZW5ndGgoKSAtIDE7CkBAIC0yODMsMTQgKzMwMiwxNCBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBtYXJrSW5jbHVkZWRQcm9ibGVtcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJYm9vbGVhbiBmb3VuZFByb2JsZW1zID0gZmFsc2U7CiAJCW5leHQ6IGZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnByb2JsZW1zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQlDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSA9IHRoaXMucHJvYmxlbXNbaV07Ci0JCQkKKwogCQkJaWYodGhpcy51c2VkT3JJcnJlbGV2YW50UHJvYmxlbXNbaV0pIGNvbnRpbnVlIG5leHQ7Ci0JCQkKKwogCQkJc3dpdGNoKHByb2JsZW0uZ2V0SUQoKSkgewogCQkJCWNhc2UgSVByb2JsZW0uUGFyc2luZ0Vycm9yT25LZXl3b3JkTm9TdWdnZXN0aW9uIDoKIAkJCQljYXNlIElQcm9ibGVtLlBhcnNpbmdFcnJvck9uS2V5d29yZCA6CkBAIC0zMjUsOSArMzQ0LDkgQEAKIAkJCQlkZWZhdWx0OgogCQkJCQl0aGlzLnVzZWRPcklycmVsZXZhbnRQcm9ibGVtc1tpXSA9IHRydWU7CiAJCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCQorCiAJCQl9Ci0JCQkKKwogCQkJaW50IHByb2JsZW1TdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKIAkJCWludCBwcm9ibGVtRW5kID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKIAkJCWlmICgoc3RhcnQgPD0gcHJvYmxlbVN0YXJ0KSAmJiAocHJvYmxlbVN0YXJ0IDw9IGVuZCkgfHwKQEAgLTM0MSw3ICszNjAsNyBAQAogCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAJCWVuZFZpc2l0Tm9kZShub2RlKTsKLQkJaWYgKChub2RlLmdldEZsYWdzKCkgJiBBU1ROb2RlLlJFQ09WRVJFRCkgPT0gMCkgcmV0dXJuOyAKKwkJaWYgKChub2RlLmdldEZsYWdzKCkgJiBBU1ROb2RlLlJFQ09WRVJFRCkgPT0gMCkgcmV0dXJuOwogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBub2RlLmdldEV4cHJlc3Npb24oKTsKIAkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFTU0lHTk1FTlQpIHsKIAkJCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwpAQCAtMzU4LDcgKzM3NywyNyBAQAogCQkJfQogCQl9CiAJfQotCQorCisJcHVibGljIHZvaWQgZW5kVmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKKwkJZW5kVmlzaXROb2RlKG5vZGUpOworCQlMaXN0IGluaXRpYWxpemVycyA9IG5vZGUuaW5pdGlhbGl6ZXJzKCk7CisJCWlmIChpbml0aWFsaXplcnMuc2l6ZSgpID09IDEpIHsKKwkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBpbml0aWFsaXplcnMuZ2V0KDApOworCQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04pIHsKKwkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKwkJCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmZyYWdtZW50cygpOworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmcmFnbWVudHMuc2l6ZSgpOyBpIDxtYXg7IGkrKykgeworCQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KGkpOworCQkJCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBmcmFnbWVudC5nZXROYW1lKCk7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhSZWNvdmVyeVNjYW5uZXIuRkFLRV9JREVOVElGSUVSLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKS50b0NoYXJBcnJheSgpKSkgeworCQkJCQkJZnJhZ21lbnRzLnJlbW92ZShmcmFnbWVudCk7CisJCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRGbGFncyh2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5nZXRGbGFncygpIHwgQVNUTm9kZS5SRUNPVkVSRUQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7CiAJCWVuZFZpc2l0Tm9kZShub2RlKTsKIAkJTGlzdCBmcmFnbWVudHMgPSBub2RlLmZyYWdtZW50cygpOwpAQCAtMzcxLDggKzQxMCwzOSBAQAogCQkJCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBleHByZXNzaW9uOwogCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhSZWNvdmVyeVNjYW5uZXIuRkFLRV9JREVOVElGSUVSLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKS50b0NoYXJBcnJheSgpKSkgewogCQkJCQlmcmFnbWVudC5zZXRJbml0aWFsaXplcihudWxsKTsKLQkJCQkJZnJhZ21lbnQuc2V0RmxhZ3Mobm9kZS5nZXRGbGFncygpIHwgQVNUTm9kZS5SRUNPVkVSRUQpOwotCQkJCX0JCQkKKwkJCQkJZnJhZ21lbnQuc2V0RmxhZ3MoZnJhZ21lbnQuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuUkVDT1ZFUkVEKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKKwkJZW5kVmlzaXROb2RlKG5vZGUpOworCQkvLyBpcyBpbnNpZGUgZGlldCBwYXJ0IG9mIHRoZSBhc3QKKwkJaWYodGhpcy5ibG9ja0RlcHRoIDwgMSkgeworCQkJTGlzdCB2YWx1ZXMgPSBub2RlLnZhbHVlcygpOworCQkJaW50IHNpemUgPSB2YWx1ZXMuc2l6ZSgpOworCQkJaWYgKHNpemUgPiAwKSB7CisJCQkJTWVtYmVyVmFsdWVQYWlyIGxhc3RNZW1iZXJWYWx1ZVBhaXIgPSAoTWVtYmVyVmFsdWVQYWlyKXZhbHVlcy5nZXQoc2l6ZSAtIDEpOworCisJCQkJaW50IGFubm90YXRpb25FbmQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG5vZGUuZ2V0TGVuZ3RoKCk7CisJCQkJaW50IGxhc3RNZW1iZXJWYWx1ZVBhaXJFbmQgPSBsYXN0TWVtYmVyVmFsdWVQYWlyLmdldFN0YXJ0UG9zaXRpb24oKSArIGxhc3RNZW1iZXJWYWx1ZVBhaXIuZ2V0TGVuZ3RoKCk7CisJCQkJaWYgKGFubm90YXRpb25FbmQgPT0gbGFzdE1lbWJlclZhbHVlUGFpckVuZCkgeworCQkJCQlub2RlLnNldEZsYWdzKG5vZGUuZ2V0RmxhZ3MoKSB8IEFTVE5vZGUuUkVDT1ZFUkVEKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKKwkJZW5kVmlzaXROb2RlKG5vZGUpOworCQkvLyBpcyBpbnNpZGUgZGlldCBwYXJ0IG9mIHRoZSBhc3QKKwkJaWYodGhpcy5ibG9ja0RlcHRoIDwgMSkgeworCQkJRXhwcmVzc2lvbiB2YWx1ZSA9IG5vZGUuZ2V0VmFsdWUoKTsKKwkJCWludCBhbm5vdGF0aW9uRW5kID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyBub2RlLmdldExlbmd0aCgpOworCQkJaW50IHZhbHVlRW5kID0gdmFsdWUuZ2V0U3RhcnRQb3NpdGlvbigpICsgdmFsdWUuZ2V0TGVuZ3RoKCk7CisJCQlpZiAoYW5ub3RhdGlvbkVuZCA9PSB2YWx1ZUVuZCkgeworCQkJCW5vZGUuc2V0RmxhZ3Mobm9kZS5nZXRGbGFncygpIHwgQVNUTm9kZS5SRUNPVkVSRUQpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUUmVxdWVzdG9yLmphdmEKaW5kZXggZDVhMTQwNC4uNWRiYjFkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDI1ICsxNCwyNCBAQAogCiAvKioKICAqIEFuIEFTVCByZXF1ZXN0b3IgaGFuZGxlcyBBU1RzIGZvciBjb21waWxhdGlvbiB1bml0cyBwYXNzZWQgdG8KLSAqIDxjb2RlPkFTVFBhcnNlci5jcmVhdGVBU1RzPC9jb2RlPi4KKyAqIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUc30uCiAgKiA8cD4KLSAqIDxjb2RlPkFTVFJlcXVlc3Rvci5hY2NlcHRBU1Q8L2NvZGU+IGlzIGNhbGxlZCBmb3IgZWFjaCBvZiB0aGUKLSAqIGNvbXBpbGF0aW9uIHVuaXRzIHBhc3NlZCB0byA8Y29kZT5BU1RQYXJzZXIuY3JlYXRlQVNUczwvY29kZT4uCi0gKiBBZnRlciBhbGwgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIAotICogPGNvZGU+QVNUUmVxdWVzdG9yLmFjY2VwdEJpbmRpbmdzPC9jb2RlPiBpcyBjYWxsZWQgZm9yIGVhY2gKLSAqIG9mIHRoZSBiaW5kaW5nIGtleXMgcGFzc2VkIHRvIDxjb2RlPkFTVFBhcnNlci5jcmVhdGVBU1RzPC9jb2RlPi4KKyAqIHtAbGluayAjYWNjZXB0QVNUKElDb21waWxhdGlvblVuaXQsIENvbXBpbGF0aW9uVW5pdCkgQVNUUmVxdWVzdG9yLmFjY2VwdEFTVH0gaXMgY2FsbGVkIGZvciBlYWNoIG9mIHRoZQorICogY29tcGlsYXRpb24gdW5pdHMgcGFzc2VkIHRvIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUc30uCisgKiBBZnRlciBhbGwgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsCisgKiB7QGxpbmsgI2FjY2VwdEJpbmRpbmcoU3RyaW5nLCBJQmluZGluZykgQVNUUmVxdWVzdG9yLmFjY2VwdEJpbmRpbmdzfSBpcyBjYWxsZWQgZm9yIGVhY2gKKyAqIG9mIHRoZSBiaW5kaW5nIGtleXMgcGFzc2VkIHRvIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBBU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUc30uCiAgKiA8L3A+CiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogQVNUIHJlcXVlc3RvcnMgYXJlIHNlcmlhbGx5IHJldXNhYmxlLCBidXQgbmVpdGhlciByZWVudHJhbnQgbm9yCi0gKiB0aHJlYWQtc2FmZS4KKyAqIEFTVCByZXF1ZXN0b3JzIGFyZSBzZXJpYWxseSByZXVzYWJsZSwgYnV0IG5laXRoZXIgcmVlbnRyYW50IG5vciB0aHJlYWQtc2FmZS4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgQVNUUGFyc2VyI2NyZWF0ZUFTVHMoSUNvbXBpbGF0aW9uVW5pdFtdLCBTdHJpbmdbXSwgQVNUUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFTVFJlcXVlc3RvciB7Ci0JCisKIAkvKioKIAkgKiBUaGUgY29tcGlsYXRpb24gdW5pdCByZXNvbHZlciB1c2VkIHRvIHJlc29sdmUgYmluZGluZ3MsIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gTm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbm9uLW51bGwKQEAgLTQwLDE0ICszOSwxNCBAQAogCSAqIDxjb2RlPkFTVFBhcnNlci5jcmVhdGVBU1RzPC9jb2RlPi4KIAkgKi8KIAlDb21waWxhdGlvblVuaXRSZXNvbHZlciBjb21waWxhdGlvblVuaXRSZXNvbHZlciA9IG51bGw7Ci0JCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KIAkgKi8KIAlwcm90ZWN0ZWQgQVNUUmVxdWVzdG9yKCkgewogCQkvLyBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogQWNjZXB0cyBhbiBBU1QgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcGlsYXRpb24gdW5pdC4KIAkgKiBUaGF0IGlzLCA8Y29kZT5hc3Q8L2NvZGU+IGlzIGFuIEFTVCBmb3IgPGNvZGU+c291cmNlPC9jb2RlPi4KQEAgLTU1LDI0ICs1NCwyNCBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KIAkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0byBwcm9jZXNzIHRoZSByZXN1bHRpbmcgQVNULgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzb3VyY2UgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhlIGFzdCBpcyBjb21pbmcgZnJvbQogCSAqIEBwYXJhbSBhc3QgdGhlIHJlcXVlc3RlZCBhYnRyYWN0IHN5bnRheCB0cmVlCiAJICovCiAJcHVibGljIHZvaWQgYWNjZXB0QVNUKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgYXN0KSB7CiAJCS8vIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBBY2NlcHRzIGEgYmluZGluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiaW5kaW5nIGtleS4KLQkgKiBUaGF0IGlzLCA8Y29kZT5iaW5kaW5nPC9jb2RlPiBpcyB0aGUgYmluZGluZyBmb3IgCisJICogVGhhdCBpcywgPGNvZGU+YmluZGluZzwvY29kZT4gaXMgdGhlIGJpbmRpbmcgZm9yCiAJICogPGNvZGU+YmluZGluZ0tleTwvY29kZT47IDxjb2RlPmJpbmRpbmc8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogaWYgdGhlIGtleSBjYW5ub3QgYmUgcmVzb2x2ZWQuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogCSAqIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIHRvIHByb2Nlc3MgdGhlIHJlc3VsdGluZyBiaW5kaW5nLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBiaW5kaW5nS2V5IHRoZSBrZXkgb2YgdGhlIHJlcXVlc3RlZCBiaW5kaW5nCiAJICogQHBhcmFtIGJpbmRpbmcgdGhlIHJlcXVlc3RlZCBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCkBAIC05MCw3ICs4OSw3IEBACiAJICogYW5kIG9ubHkgaWYgPGNvZGU+QVNUUGFyc2VyLnJlc29sdmVCaW5kaW5ncyh0cnVlKTwvY29kZT4gd2FzIHNwZWNpZmllZC4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogQ2F2ZWF0OiBEdXJpbmcgYW4gPGNvZGU+YWNjZXB0QVNUPC9jb2RlPiBjYWxsYmFjaywgdGhlcmUgYXJlIGltcGxlbWVudGF0aW9uIAorCSAqIENhdmVhdDogRHVyaW5nIGFuIDxjb2RlPmFjY2VwdEFTVDwvY29kZT4gY2FsbGJhY2ssIHRoZXJlIGFyZSBpbXBsZW1lbnRhdGlvbgogCSAqIGxpbWl0YXRpb25zIGNvbmNlcm5pbmcgdGhlIGxvb2sgdXAgb2YgYmluZGluZyBrZXlzIHJlcHJlc2VudGluZyBsb2NhbCBlbGVtZW50cy4KIAkgKiBJbiBzb21lIGNhc2VzLCB0aGUgYmluZGluZyBpcyB1bmF2YWlsYWJsZSwgYW5kIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQuCiAJICogVGhpcyBpcyBvbmx5IGFuIGlzc3VlIGR1cmluZyBhbiA8Y29kZT5hY2NlcHRBU1Q8L2NvZGU+IGNhbGxiYWNrLCBhbmQgb25seQpAQCAtOTksNyArOTgsNyBAQAogCSAqIG91dHNpZGUgb2YgPGNvZGU+YWNjZXB0QVNUPC9jb2RlPiBjYWxsYmFja3MsIG9yIGZvciB0b3AtbGV2ZWwgdHlwZXMgYW5kIHRoZWlyCiAJICogbWVtYmVycyBldmVuIHdpdGhpbiA8Y29kZT5hY2NlcHRBU1Q8L2NvZGU+IGNhbGxiYWNrcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYmluZGluZ0tleXMgdGhlIGJpbmRpbmcga2V5cyB0byBsb29rIHVwCiAJICogQHJldHVybiBhIGxpc3Qgb2YgYmluZGluZ3MgcGFyYWxsZWxpbmcgdGhlIDxjb2RlPmJpbmRpbmdLZXlzPC9jb2RlPiBwYXJhbWV0ZXIsCiAJICogd2l0aCA8Y29kZT5udWxsPC9jb2RlPiBlbnRyaWVzIGZvciBrZXlzIHRoYXQgY291bGQgbm90IGJlIHJlc29sdmVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFN5bnRheEVycm9yUHJvcGFnYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RTeW50YXhFcnJvclByb3BhZ2F0b3IuamF2YQppbmRleCBkYmU2MjJlLi44NTkwNjcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFN5bnRheEVycm9yUHJvcGFnYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsNyArMjAsNyBAQAogY2xhc3MgQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAKIAlwcml2YXRlIENhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zOwotCQorCiAJQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yKENhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zKSB7CiAJCS8vIHZpc2l0IEphdmFkb2MudGFncygpIGFzIHdlbGwKIAkJc3VwZXIodHJ1ZSk7CkBAIC04Niw2MyArODYsNjMgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CiAJfQogCiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwkJCisJCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwogCX0KIAogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVFZpc2l0b3IuCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CiAJfQogCiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwkJCisJCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwogCX0KIAogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVFZpc2l0b3IuCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CiAJfQogCiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CiAJfQotCQorCiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsJCQorCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsKIAl9Ci0JCisKIAkvKgogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1RWaXNpdG9yLgogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwkJCisJCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwogCX0KLQkKKwogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVFZpc2l0b3IuCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewotCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsJCQorCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RWaXNpdG9yLmphdmEKaW5kZXggN2UyZTMxOS4uYjI5MzA1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsOSArMjAsOSBAQAogICogPGxpPjxjb2RlPnB1YmxpYyBib29sZWFuIHZpc2l0KDxpPlQ8L2k+IG5vZGUpPC9jb2RlPiAtIFZpc2l0cwogICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIElmIDxjb2RlPnRydWU8L2NvZGU+CiAgKiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIGJlIHZpc2l0ZWQgbmV4dDsgaG93ZXZlciwKLSAqIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIAorICogaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLCB0aGUgZ2l2ZW4gbm9kZSdzIGNoaWxkIG5vZGVzIHdpbGwKICAqIG5vdCBiZSB2aXNpdGVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIGRvZXMKLSAqIG5vdGhpbmcgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiAKKyAqIG5vdGhpbmcgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gKHdpdGggdGhlIGV4Y2VwdGlvbiBvZgogICoge0BsaW5rICN2aXNpdChKYXZhZG9jKSBBU1RWaXNpdG9yLnZpc2l0KEphdmFkb2MpfSkuCiAgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KICAqIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBlbmRWaXNpdCg8aT5UPC9pPiBub2RlKTwvY29kZT4gLSBWaXNpdHMKQEAgLTMzLDE3ICszMywxNyBAQAogICogbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+CiAgKiA8L3VsPgogICogPC9wPgotICogSW4gYWRkaXRpb24sIHRoZXJlIGFyZSBhIHBhaXIgb2YgbWV0aG9kcyBmb3IgdmlzaXRpbmcgQVNUIG5vZGVzIGluIHRoZSAKKyAqIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUgYSBwYWlyIG9mIG1ldGhvZHMgZm9yIHZpc2l0aW5nIEFTVCBub2RlcyBpbiB0aGUKICAqIGFic3RyYWN0LCByZWdhcmRsZXNzIG9mIG5vZGUgdHlwZToKICAqIDx1bD4KICAqIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBwcmVWaXNpdChBU1ROb2RlIG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIAorICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uCiAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHByaW9yIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCiAgKiA8Y29kZT52aXNpdDwvY29kZT4gbWV0aG9kLgogICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+CiAgKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCisgKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4KICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGFwcHJvcHJpYXRlIHR5cGUtc3BlY2lmaWMKICAqIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QuCiAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCkBAIC01NCw3ICs1NCw3IEBACiAgKiBhcmUgdmlzaXRlZCBpbiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzCiAgKiBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgdGhhdCBtb3N0IGNsb3NlbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxleGljYWwKICAqIHJlYWRpbmcgb3JkZXIgb2YgdGhlIHNvdXJjZSBwcm9ncmFtLiBGb3IgaW5zdGFuY2UsIGZvciBhIHR5cGUgZGVjbGFyYXRpb24KLSAqIG5vZGUsIHRoZSBjaGlsZCBvcmRlcmluZyBpczogbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzLCBhbmQgCisgKiBub2RlLCB0aGUgY2hpbGQgb3JkZXJpbmcgaXM6IG5hbWUsIHN1cGVyY2xhc3MsIHN1cGVyaW50ZXJmYWNlcywgYW5kCiAgKiBib2R5IGRlY2xhcmF0aW9ucy4KICAqIDwvcD4KICAqIDxwPgpAQCAtNjIsOCArNjIsOCBAQAogICogZW5zdXJlIHRoYXQgdGhlIGNvbnNlcXVlbmNlcyBhcmUgYXMgZXhwZWN0ZWQgYW5kIGRlc2lyYWJsZS4KICAqIER1cmluZyB0aGUgY291cnNlIG9mIGFuIG9yZGluYXJ5IHZpc2l0IHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gbm9kZSwgZXZlcnkgbm9kZQogICogaW4gdGhlIHN1YnRyZWUgaXMgdmlzaXRlZCBleGFjdGx5IHR3aWNlLCBmaXJzdCB3aXRoIDxjb2RlPnZpc2l0PC9jb2RlPiBhbmQKLSAqIHRoZW4gd2l0aCA8Y29kZT5lbmRWaXNpdDwvY29kZT4uIER1cmluZyBhIHRyYXZlcnNhbCBvZiBhIHN0YXRpb25hcnkgdHJlZSwgCi0gKiBlYWNoIG5vZGUgaXMgZWl0aGVyIGJlaGluZCAoYWZ0ZXIgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KSwgYWhlYWQgKGJlZm9yZSAKKyAqIHRoZW4gd2l0aCA8Y29kZT5lbmRWaXNpdDwvY29kZT4uIER1cmluZyBhIHRyYXZlcnNhbCBvZiBhIHN0YXRpb25hcnkgdHJlZSwKKyAqIGVhY2ggbm9kZSBpcyBlaXRoZXIgYmVoaW5kIChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLCBhaGVhZCAoYmVmb3JlCiAgKiA8Y29kZT52aXNpdDwvY29kZT4pLCBvciBpbiBwcm9ncmVzcyAoYmV0d2VlbiA8Y29kZT52aXNpdDwvY29kZT4gYW5kCiAgKiB0aGUgbWF0Y2hpbmcgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KS4gQ2hhbmdlcyB0byB0aGUgImJlaGluZCIgcmVnaW9uIG9mIHRoZQogICogdHJlZSBhcmUgb2Ygbm8gY29uc2VxdWVuY2UgdG8gdGhlIHZpc2l0IGluIHByb2dyZXNzLiBDaGFuZ2VzIHRvIHRoZSAiYWhlYWQiCkBAIC03NCw3ICs3NCw3IEBACiAgKiBpcyBiZXR3ZWVuIHRoZSBlbGVtZW50cywgcmF0aGVyIHRoYW4gb24gYW4gZWxlbWVudCkuIFRoZSBjdXJzb3IgbW92ZXMgZnJvbQogICogdGhlIGhlYWQgdG8gdGhlIHRhaWwgb2YgdGhpcyBsaXN0LCBhZHZhbmNpbmcgdG8gdGhlIG5leHQgcG9zaXRpb24ganVzdAogICogPGk+YmVmb3JlPC9pPiA8Y29kZT52aXNpdDwvY29kZT4gaWYgY2FsbGVkIGZvciB0aGF0IGNoaWxkLiBBZnRlciB0aGUgY2hpbGQKLSAqIHN1YnRyZWUgaGFzIGJlZW4gY29tcGxldGVseSB2aXNpdGVkLCB0aGUgdmlzaXQgbW92ZXMgb24gdGhlIGNoaWxkIAorICogc3VidHJlZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHZpc2l0ZWQsIHRoZSB2aXNpdCBtb3ZlcyBvbiB0aGUgY2hpbGQKICAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJzb3IuIFJlbW92aW5nIGEgY2hpbGQgd2hpbGUgaXQgaXMgYmVpbmcgdmlzaXRlZAogICogZG9lcyBub3QgYWx0ZXIgdGhlIGNvdXJzZSBvZiB0aGUgdmlzaXQuIEJ1dCBhbnkgY2hpbGRyZW4gYWRkZWQgYXQgcG9zaXRpb25zCiAgKiBhZnRlciB0aGUgY3Vyc29yIGFyZSBjb25zaWRlcmVkIGluIHRoZSAiYWhlYWQiIHBvcnRpb24gYW5kIHdpbGwgYmUgdmlzaXRlZC4KQEAgLTg1LDIwICs4NSwyMCBAQAogICogPGxpPk1vdmluZyBhIGNoaWxkIG5vZGUgZnVydGhlciBkb3duIHRoZSBsaXN0LiBUaGlzIGNvdWxkIHJlc3VsdCBpbiB0aGUKICAqIGNoaWxkIHN1YnRyZWUgYmVpbmcgdmlzaXRlZCBtdWx0aXBsZSB0aW1lczsgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+CiAgKiA8bGk+TW92aW5nIGEgY2hpbGQgbm9kZSB1cCBpbnRvIGFuIGFuY2VzdG9yLiBJZiB0aGUgbmV3IGhvbWUgZm9yCi0gKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCisgKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQKICAqIGEgc2Vjb25kIHRpbWU7IGFnYWluLCB0aGVzZSB2aXNpdHMgYXJlIHNlcXVlbnRpYWwuPC9saT4KICAqIDxsaT5Nb3ZpbmcgYSBub2RlIGRvd24gaW50byBhIGNoaWxkLiBJZiB0aGUgbmV3IGhvbWUgZm9yCi0gKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCisgKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQKICAqIGEgc2Vjb25kIHRpbWU7IGluIHRoaXMgY2FzZSwgdGhlIHZpc2l0cyB3aWxsIGJlIG5lc3RlZC4gSW4gc29tZSBjYXNlcywKICAqIHRoaXMgY2FuIGxlYWQgdG8gYSBzdGFjayBvdmVyZmxvdyBvciBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbi48L2xpPgogICogPC91bD4KICAqIDxwPk5vdGUgdGhhdCB7QGxpbmsgTGluZUNvbW1lbnR9IGFuZCB7QGxpbmsgQmxvY2tDb21tZW50fSBub2RlcyBhcmUKICAqIG5vdCBub3JtYWxseSB2aXNpdGVkIGluIGFuIEFTVCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBjb25zaWRlcmVkCi0gKiBwYXJ0IG9mIG1haW4gc3RydWN0dXJlIG9mIHRoZSBBU1QuIFVzZSAKKyAqIHBhcnQgb2YgbWFpbiBzdHJ1Y3R1cmUgb2YgdGhlIEFTVC4gVXNlCiAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0I2dldENvbW1lbnRMaXN0KCl9IHRvIGZpbmQgdGhlc2UgYWRkaXRpb25hbAogICogY29tbWVudHMgbm9kZXMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlI2FjY2VwdChBU1RWaXNpdG9yKQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNUVmlzaXRvciB7CkBAIC0xMDgsMTIgKzEwOCwxMiBAQAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gdmlzaXREb2NUYWdzOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBBU1QgdmlzaXRvciBpbnN0YW5jZS4KIAkgKiA8cD4KIAkgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSB2aXNpdG9yIGRvZXMgbm90IHZpc2l0IHRhZwotCSAqIGVsZW1lbnRzIGJlbG93IGRvYyBjb21tZW50cyBieSBkZWZhdWx0LiBVc2UgCisJICogZWxlbWVudHMgYmVsb3cgZG9jIGNvbW1lbnRzIGJ5IGRlZmF1bHQuIFVzZQogCSAqIHtAbGluayAjQVNUVmlzaXRvcihib29sZWFuKSBBU1RWaXNpdG9yKHRydWUpfQogCSAqIGZvciBhbiB2aXNpdG9yIHRoYXQgaW5jbHVkZXMgZG9jIGNvbW1lbnRzIGJ5IGRlZmF1bHQuCiAJICogPC9wPgpAQCAtMTIxLDEwICsxMjEsMTAgQEAKIAlwdWJsaWMgQVNUVmlzaXRvcigpIHsKIAkJdGhpcyhmYWxzZSk7CiAJfQotCQorCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1QgdmlzaXRvciBpbnN0YW5jZS4gCi0JICogCisJICogQ3JlYXRlcyBhIG5ldyBBU1QgdmlzaXRvciBpbnN0YW5jZS4KKwkgKgogCSAqIEBwYXJhbSB2aXNpdERvY1RhZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZG9jIGNvbW1lbnQgdGFncyBhcmUKIAkgKiB0byBiZSB2aXNpdGVkIGJ5IGRlZmF1bHQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNlZSBKYXZhZG9jI3RhZ3MoKQpAQCAtMTM0LDI3ICsxMzQsNDcgQEAKIAlwdWJsaWMgQVNUVmlzaXRvcihib29sZWFuIHZpc2l0RG9jVGFncykgewogCQl0aGlzLnZpc2l0RG9jVGFncyA9IHZpc2l0RG9jVGFnczsKIAl9Ci0JCisKIAkvKioKLQkgKiBWaXNpdHMgdGhlIGdpdmVuIEFTVCBub2RlIHByaW9yIHRvIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0LgorCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gQVNUIG5vZGUgcHJpb3IgdG8gdGhlIHR5cGUtc3BlY2lmaWMgdmlzaXQKIAkgKiAoYmVmb3JlIDxjb2RlPnZpc2l0PC9jb2RlPikuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqCisJICogQHNlZSAjcHJlVmlzaXQyKEFTVE5vZGUpCiAJICovCiAJcHVibGljIHZvaWQgcHJlVmlzaXQoQVNUTm9kZSBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKKwkvKioKKwkgKiBWaXNpdHMgdGhlIGdpdmVuIEFTVCBub2RlIHByaW9yIHRvIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0IChiZWZvcmUgPGNvZGU+dmlzaXQ8L2NvZGU+KS4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI3ByZVZpc2l0KEFTVE5vZGUpfSBhbmQgdGhlbgorCSAqIHJldHVybnMgdHJ1ZS4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnZpc2l0KG5vZGUpPC9jb2RlPiBzaG91bGQgYmUgY2FsbGVkLAorCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqIEBzZWUgI3ByZVZpc2l0KEFTVE5vZGUpCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBib29sZWFuIHByZVZpc2l0MihBU1ROb2RlIG5vZGUpIHsKKwkJcHJlVmlzaXQobm9kZSk7CisJCXJldHVybiB0cnVlOworCX0KKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gQVNUIG5vZGUgZm9sbG93aW5nIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0CiAJICogKGFmdGVyIDxjb2RlPmVuZFZpc2l0PC9jb2RlPikuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIHBvc3RWaXNpdChBU1ROb2RlIG5vZGUpIHsKQEAgLTE2OCw3ICsxODgsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTg2LDcgKzIwNiw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0yMDMsNyArMjIzLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTIxOSw3ICsyMzksNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMjM1LDcgKzI1NSw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0yNTEsNyArMjcxLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTI2Nyw3ICsyODcsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMjgzLDcgKzMwMyw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0yOTksNyArMzE5LDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTMxNSw3ICszMzUsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMzI0LDcgKzM0NCw3IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQmxvY2sgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KQEAgLTMzNyw3ICszNTcsNyBAQAogCSAqIG9ubHkgYmUgY2FsbGVkIGlmIGEgY2xpZW50IGdvZXMgb3V0IG9mIHRoZWlyIHdheSB0byB2aXNpdCB0aGlzCiAJICoga2luZCBvZiBub2RlIGV4cGxpY2l0bHkuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMzU0LDcgKzM3NCw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0zNzAsNyArMzkwLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTM4Niw3ICs0MDYsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNDAyLDcgKzQyMiw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC00MTgsNyArNDM4LDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTQzNCw3ICs0NTQsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNDUwLDcgKzQ3MCw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC00NjYsNyArNDg2LDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTQ4Miw3ICs1MDIsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNDk4LDcgKzUxOCw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC01MTQsNyArNTM0LDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTUzMCw3ICs1NTAsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNTQ2LDcgKzU2Niw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC01NjMsNyArNTgzLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTU4MCw3ICs2MDAsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNTk3LDcgKzYxNyw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC02MTMsNyArNjMzLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTYyOSw3ICs2NDksNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNjQ1LDcgKzY2NSw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC02NjEsNyArNjgxLDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTY3Nyw3ICs2OTcsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNjkzLDcgKzcxMyw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC03MDksNyArNzI5LDcgQEAKIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTcyNSw3ICs3NDUsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtNzQwLDExICs3NjAsMTEgQEAKIAkgKiA8cD4KIAkgKiBVbmxpa2Ugb3RoZXIgbm9kZSB0eXBlcywgdGhlIGJvb2xlYW4gcmV0dXJuZWQgYnkgdGhlIGRlZmF1bHQKIAkgKiBpbXBsZW1lbnRhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGEgY29uc3RydWN0b3Itc3VwcGxpZWQKLQkgKiBwYXJhbWV0ZXIgIHtAbGluayAjQVNUVmlzaXRvcihib29sZWFuKSBBU1RWaXNpdG9yKGJvb2xlYW4pfSAKKwkgKiBwYXJhbWV0ZXIgIHtAbGluayAjQVNUVmlzaXRvcihib29sZWFuKSBBU1RWaXNpdG9yKGJvb2xlYW4pfQogCSAqIHdoaWNoIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTc1NiwxNCArNzc2LDE0IEBACiAJCS8vIHZpc2l0IHRhZyBlbGVtZW50cyBpbnNpZGUgZG9jIGNvbW1lbnRzIG9ubHkgaWYgcmVxdWVzdGVkCiAJCXJldHVybiB0aGlzLnZpc2l0RG9jVGFnczsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC03NzIsOCArNzkyLDggQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQotCQorCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CkBAIC03ODUsNyArODA1LDcgQEAKIAkgKiBvbmx5IGJlIGNhbGxlZCBpZiBhIGNsaWVudCBnb2VzIG91dCBvZiB0aGVpciB3YXkgdG8gdmlzaXQgdGhpcwogCSAqIGtpbmQgb2Ygbm9kZSBleHBsaWNpdGx5LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTc5NiwxNCArODE2LDE0IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtODE0LDE0ICs4MzQsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC04MzIsMTQgKzg1MiwxNCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTg1MCwxNCArODcwLDE0IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtODY4LDE0ICs4ODgsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC04ODUsMTUgKzkwNSwxNSBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZFJlZlBhcmFtZXRlciBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKLQkKKworCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtOTAyLDE0ICs5MjIsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTkxOSwxNCArOTM5LDE0IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtOTM3LDE0ICs5NTcsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC05NTQsMTQgKzk3NCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC05NzAsMTQgKzk5MCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtOTg2LDE0ICsxMDA2LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEwMDMsMTQgKzEwMjMsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMDIwLDE0ICsxMDQwLDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyYW1ldGVyaXplZFR5cGUgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMDM2LDE0ICsxMDU2LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMDUyLDE0ICsxMDcyLDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMDY4LDE0ICsxMDg4LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEwODQsMTQgKzExMDQsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTEwMCwxNCArMTEyMCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMTE3LDE0ICsxMTM3LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTExMzMsMTQgKzExNTMsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMTQ5LDE0ICsxMTY5LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTExNjYsMTQgKzExODYsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMTg0LDE0ICsxMjA0LDE0IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTIwMCwxNCArMTIyMCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMjE2LDE0ICsxMjM2LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEyMzIsMTQgKzEyNTIsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEyNDgsMTQgKzEyNjgsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTI2NCwxNCArMTI4NCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEyODAsMTQgKzEzMDAsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTI5NiwxNCArMTMxNiwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEzMTMsMTQgKzEzMzMsMTQgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xMzMxLDE0ICsxMzUxLDE0IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTM0OSwxNCArMTM2OSwxNCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEzNjUsMTQgKzEzODUsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEzODEsMTQgKzE0MDEsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTEzOTcsMTQgKzE0MTcsMTMgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTQxMywxNCArMTQzMiwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQogCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKQEAgLTE0MjksMTQgKzE0NDgsMTQgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xNDQ1LDE0ICsxNDY0LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xNDYyLDE0ICsxNDgxLDMxIEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIHJldHVybiB0cnVlLgogCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZCBiZQorCSAqIHZpc2l0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQKKwkgKiBiZSBza2lwcGVkCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVW5pb25UeXBlIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTQ3OCwxNCArMTUxNCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTQ5NCwxNCArMTUzMCwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWaXNpdHMgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm4gdHJ1ZS4KIAkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUKIAkgKiB2aXNpdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkCkBAIC0xNTEwLDE0ICsxNTQ2LDE0IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTUyNiwxNCArMTU2MiwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyoqCiAJICogVmlzaXRzIHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJuIHRydWUuCiAJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlCiAJICogdmlzaXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHNob3VsZApAQCAtMTU0MywxMyArMTU3OSwxMyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTU2Miw3ICsxNTk4LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTU3NSw3ICsxNjExLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CkBAIC0xNTg3LDcgKzE2MjMsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUFjY2VzcyBub2RlKSB7CkBAIC0xNTk5LDcgKzE2MzUsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKQEAgLTE2MTEsNyArMTY0Nyw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewpAQCAtMTYyMyw3ICsxNjU5LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKQEAgLTE2MzUsNyArMTY3MSw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CkBAIC0xNjQ3LDcgKzE2ODMsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NpZ25tZW50IG5vZGUpIHsKQEAgLTE2NTksMTMgKzE2OTUsMTMgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQmxvY2sgbm9kZSkgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgpAQCAtMTY3Niw3ICsxNzEyLDcgQEAKIAkgKiBvbmx5IGJlIGNhbGxlZCBpZiBhIGNsaWVudCBnb2VzIG91dCBvZiB0aGVpciB3YXkgdG8gdmlzaXQgdGhpcwogCSAqIGtpbmQgb2Ygbm9kZSBleHBsaWNpdGx5LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtMTY4OSw3ICsxNzI1LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewpAQCAtMTcwMSw3ICsxNzM3LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewpAQCAtMTcxMyw3ICsxNzQ5LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewpAQCAtMTcyNSw3ICsxNzYxLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewpAQCAtMTczNyw3ICsxNzczLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7CkBAIC0xNzQ5LDcgKzE3ODUsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewpAQCAtMTc2MSw3ICsxNzk3LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKQEAgLTE3NzMsNyArMTgwOSw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CkBAIC0xNzg1LDcgKzE4MjEsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewpAQCAtMTc5Nyw3ICsxODMzLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewpAQCAtMTgwOSw3ICsxODQ1LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewpAQCAtMTgyMSw1OCArMTg1Nyw1OCBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCi0JLyoqCi0JICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVuaGFuY2VkRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQkKLQkKLQkvKioKLQkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0JCiAKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbmhhbmNlZEZvclN0YXRlbWVudCBub2RlKSB7CisJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBub2RlKSB7CisJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgeworCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKQEAgLTE4ODQsNyArMTkyMCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKQEAgLTE4OTYsNyArMTkzMiw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewpAQCAtMTkwOCw3ICsxOTQ0LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKQEAgLTE5MjAsNyArMTk1Niw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKQEAgLTE5MzIsNyArMTk2OCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKQEAgLTE5NDQsNyArMTk4MCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7CkBAIC0xOTU2LDcgKzE5OTIsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7CkBAIC0xOTY4LDcgKzIwMDQsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7CkBAIC0xOTgwLDcgKzIwMTYsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChKYXZhZG9jIG5vZGUpIHsKQEAgLTE5OTIsMTMgKzIwMjgsMTMgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CkBAIC0yMDA5LDcyICsyMDQ1LDcyIEBACiAJICogb25seSBiZSBjYWxsZWQgaWYgYSBjbGllbnQgZ29lcyBvdXQgb2YgdGhlaXIgd2F5IHRvIHZpc2l0IHRoaXMKIAkgKiBraW5kIG9mIG5vZGUgZXhwbGljaXRseS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChMaW5lQ29tbWVudCBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1lbWJlclJlZiBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtMjA4Nyw3ICsyMTIzLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewpAQCAtMjA5OSwzMiArMjEzNSwzMiBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMjEzNyw3ICsyMTczLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewpAQCAtMjE0OSw3ICsyMTg1LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7CkBAIC0yMTYxLDMyICsyMTk3LDMyIEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCi0JLyoqCi0JICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0JCiAKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7CisJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKQEAgLTIxOTgsNyArMjIzNCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKQEAgLTIyMTAsNyArMjI0Niw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewpAQCAtMjIyMiw3ICsyMjU4LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUHJpbWl0aXZlVHlwZSBub2RlKSB7CkBAIC0yMjM0LDMyICsyMjcwLDMyIEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQotCS8qKgotCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0JCiAKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKKwkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKQEAgLTIyNzEsNyArMjMwNyw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewpAQCAtMjI4MywxOSArMjMxOSwxOSBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMjMwOCw3ICsyMzQ0LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CkBAIC0yMzIwLDcgKzIzNTYsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKQEAgLTIzMzIsNyArMjM2OCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKQEAgLTIzNDQsNyArMjM4MCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewpAQCAtMjM1Niw3ICsyMzkyLDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKQEAgLTIzNjgsNyArMjQwNCw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewpAQCAtMjM4MCw3ICsyNDE2LDcgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKQEAgLTIzOTIsMzIgKzI0MjgsMzIgQEAKIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICovCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRhZ0VsZW1lbnQgbm9kZSkgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0yNDMwLDcgKzI0NjYsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7CkBAIC0yNDQyLDcgKzI0NzgsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7CkBAIC0yNDU0LDE5ICsyNDkwLDE4IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0KIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7CkBAIC0yNDc4LDcgKzI1MTMsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewpAQCAtMjQ5MCwxOSArMjUyNSwxOSBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBFbmQgb2YgdmlzaXQgdGhlIGdpdmVuIHR5cGUtc3BlY2lmaWMgQVNUIG5vZGUuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTI1MTUsNyArMjU1MCwyMCBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChVbmlvblR5cGUgbm9kZSkgeworCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogRW5kIG9mIHZpc2l0IHRoZSBnaXZlbiB0eXBlLXNwZWNpZmljIEFTVCBub2RlLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CkBAIC0yNTI3LDcgKzI1NzUsNyBAQAogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdmlzaXQKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKQEAgLTI1MzksNyArMjU4Nyw3IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBub2RlKSB7CkBAIC0yNTUxLDE5ICsyNTk5LDE5IEBACiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAogCSAqLwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEVuZCBvZiB2aXNpdCB0aGUgZ2l2ZW4gdHlwZS1zcGVjaWZpYyBBU1Qgbm9kZS4KIAkgKiA8cD4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CiAJICogQHNpbmNlIDMuMQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5qYXZhCmluZGV4IGQ0OWViOWYuLmRiOTc1NGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fic3RyYWN0VHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMzcgKzIxLDM3IEBACiAgKiAJCUVudW1EZWNsYXJhdGlvbgogICogCQlBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uIHsKLQkKKwogCS8qKgogCSAqIFRoZSB0eXBlIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCBKYXZhIGNsYXNzIGlkZW50aWZpZXIuCi0JICogQHNpbmNlIDIuMCAob3JpZ2luYWxseSBkZWNsYXJlZCBvbiA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+KQorCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0pCiAJICovCiAJU2ltcGxlTmFtZSB0eXBlTmFtZSA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgYm9keSBkZWNsYXJhdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogVGhlIGJvZHkgZGVjbGFyYXRpb25zIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgotCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24gPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPikKKwkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIHtAbGluayBUeXBlRGVjbGFyYXRpb259KQogCSAqLwogCUFTVE5vZGUuTm9kZUxpc3QgYm9keURlY2xhcmF0aW9uczsKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgImJvZHlEZWNsYXJhdGlvbnMiIHByb3BlcnR5Ci0JICogb2YgdGhpcyBub2RlLgotCSAqIAorCSAqIG9mIHRoaXMgbm9kZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICovCiAJYWJzdHJhY3QgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGludGVybmFsQm9keURlY2xhcmF0aW9uc1Byb3BlcnR5KCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlICJib2R5RGVjbGFyYXRpb25zIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZS4KLQkgKiAKKwkgKiBvZiB0aGlzIG5vZGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTYxLDUyICs2MSw1MiBAQAogCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAibmFtZSIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUuCi0JICogCisJICogb2YgdGhpcyBub2RlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqLwogCWFic3RyYWN0IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIGludGVybmFsTmFtZVByb3BlcnR5KCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlICJuYW1lIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZS4KLQkgKiAKKwkgKiBvZiB0aGlzIG5vZGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBnZXROYW1lUHJvcGVydHkoKSB7CiAJCXJldHVybiBpbnRlcm5hbE5hbWVQcm9wZXJ0eSgpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZQotCSAqICJib2R5RGVjbGFyYXRpb24iIHByb3BlcnR5IGRlY2xhcmVkIG9uIHRoZSBnaXZlbiBjb25jcmV0ZSBub2RlIHR5cGUuCi0JICogCisJICogImJvZHlEZWNsYXJhdGlvbiIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICovCiAJc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBpbnRlcm5hbEJvZHlEZWNsYXJhdGlvblByb3BlcnR5RmFjdG9yeShDbGFzcyBub2RlQ2xhc3MpIHsKIAkJcmV0dXJuIG5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZUNsYXNzLCAiYm9keURlY2xhcmF0aW9ucyIsIEJvZHlEZWNsYXJhdGlvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUKLQkgKiAibmFtZSIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiAibmFtZSIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgaW50ZXJuYWxOYW1lUHJvcGVydHlGYWN0b3J5KENsYXNzIG5vZGVDbGFzcykgewogCQlyZXR1cm4gbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKG5vZGVDbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYWJzdHJhY3QgdHlwZSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYWJzdHJhY3QgdHlwZSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuCiAJICogPHA+Ci0JICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUKIAkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uKEFTVCBhc3QpIHsKQEAgLTExNiwxMCArMTE2LDEwIEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSBub2RlCi0JICogQHNpbmNlIDIuMCAob3JpZ2luYWxseSBkZWNsYXJlZCBvbiA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+KQotCSAqLyAKKwkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIHtAbGluayBUeXBlRGVjbGFyYXRpb259KQorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLnR5cGVOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xMzMsMTkgKzEzMywxOSBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGVOYW1lOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiB0byB0aGUKIAkgKiBnaXZlbiBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGVOYW1lIHRoZSBuZXcgdHlwZSBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24gPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPikKLQkgKi8gCisJICogQHNpbmNlIDIuMCAob3JpZ2luYWxseSBkZWNsYXJlZCBvbiB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSkKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgdHlwZU5hbWUpIHsKIAkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTE1OCwxNyArMTU4LDE3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgYm9keSBkZWNsYXJhdGlvbnMgb2YgdGhpcyB0eXBlIAorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZQogCSAqIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikKLQkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4pCi0JICovIAorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KQorCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0pCisJICovCiAJcHVibGljIExpc3QgYm9keURlY2xhcmF0aW9ucygpIHsKIAkJcmV0dXJuIHRoaXMuYm9keURlY2xhcmF0aW9uczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgcGFja2FnZSBtZW1iZXIgKHRoYXQgaXMsCiAJICogYSB0b3AtbGV2ZWwgdHlwZSkuCkBAIC0xNzYsMTAgKzE3NiwxMCBAQAogCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2ltcGx5IGNoZWNrcyB3aGV0aGVyCiAJICogdGhpcyBub2RlJ3MgcGFyZW50IGlzIGEgY29tcGlsYXRpb24gdW5pdCBub2RlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgY2hpbGQgb2YKIAkgKiAgIGEgY29tcGlsYXRpb24gdW5pdCBub2RlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24gPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPikKKwkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIHtAbGluayBUeXBlRGVjbGFyYXRpb259KQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZU1lbWJlclR5cGVEZWNsYXJhdGlvbigpIHsKIAkJQVNUTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKQEAgLTE5MCwxNCArMTkwLDE0IEBACiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBpcyBhIHR5cGUgbWVtYmVyLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2ltcGx5IGNoZWNrcyB3aGV0aGVyCi0JICogdGhpcyBub2RlJ3MgcGFyZW50IGlzIGEgdHlwZSBkZWNsYXJhdGlvbiBub2RlIG9yIGFuIGFub255bW91cyAKKwkgKiB0aGlzIG5vZGUncyBwYXJlbnQgaXMgYSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUgb3IgYW4gYW5vbnltb3VzCiAJICogY2xhc3MgZGVjbGFyYXRpb24uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgZGVjbGFyYXRpb24gaXMgYSBjaGlsZCBvZgogCSAqICAgYSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUgb3IgYW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIG5vZGUsCiAJICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAgKG9yaWdpbmFsbHkgZGVjbGFyZWQgb24gPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPikKKwkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIHtAbGluayBUeXBlRGVjbGFyYXRpb259KQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyVHlwZURlY2xhcmF0aW9uKCkgewogCQlBU1ROb2RlIHBhcmVudCA9IGdldFBhcmVudCgpOwpAQCAtMjExLDcgKzIxMSw3IEBACiAJICogTm90ZSB0aGF0IHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBzaW1wbHkgY2hlY2tzIHdoZXRoZXIKIAkgKiB0aGlzIG5vZGUncyBwYXJlbnQgaXMgYSB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgY2hpbGQgb2YKIAkgKiAgIGEgdHlwZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2luY2UgMi4wIChvcmlnaW5hbGx5IGRlY2xhcmVkIG9uIDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4pCkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJQVNUTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKIAkJcmV0dXJuIChwYXJlbnQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbi4KQEAgLTIyOCwyOSArMjI4LDI5IEBACiAJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQogCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqCisJICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlCiAJICogICAgcmVzb2x2ZWQKIAkgKiBAc2luY2UgMy4xIERlY2xhcmVkIGluIDMuMCBvbiB0aGUgaW5kaXZpZHVhbCBzdWJjbGFzc2VzLgotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgSVR5cGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCkgewogCQlyZXR1cm4gaW50ZXJuYWxSZXNvbHZlQmluZGluZygpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZQogCSAqICAgIHJlc29sdmVkCi0JICovCQorCSAqLwogCWFic3RyYWN0IElUeXBlQmluZGluZyBpbnRlcm5hbFJlc29sdmVCaW5kaW5nKCk7Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb24uamF2YQppbmRleCAzMDQ3NmM5Li5iZmE1ZWZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywxOSArMjMsMTkgQEAKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgSUV4dGVuZGVkTW9kaWZpZXIgewotCQorCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAidHlwZU5hbWUiIHByb3BlcnR5Ci0JICogb2YgdGhpcyBub2RlLgotCSAqIAorCSAqIG9mIHRoaXMgbm9kZSAoY2hpbGQgdHlwZToge0BsaW5rIE5hbWV9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlhYnN0cmFjdCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBpbnRlcm5hbFR5cGVOYW1lUHJvcGVydHkoKTsKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgInR5cGVOYW1lIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZS4KLQkgKiAKKwkgKiBvZiB0aGlzIG5vZGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICovCiAJcHVibGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIGdldFR5cGVOYW1lUHJvcGVydHkoKSB7CkBAIC00NCwxNCArNDQsMTQgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZQotCSAqICJ0eXBlTmFtZSIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiAidHlwZU5hbWUiIHByb3BlcnR5IGRlY2xhcmVkIG9uIHRoZSBnaXZlbiBjb25jcmV0ZSBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICovCiAJc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIGludGVybmFsVHlwZU5hbWVQcm9wZXJ0eUZhY3RvcnkoQ2xhc3Mgbm9kZUNsYXNzKSB7CiAJCXJldHVybiBuZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZUNsYXNzLCAidHlwZU5hbWUiLCBOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJLyoqCiAJICogVGhlIGFubm90YXRpb24gdHlwZSBuYW1lOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KQEAgLTU5LDM3ICs1OSwzNyBAQAogCU5hbWUgdHlwZU5hbWUgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYW5ub3RhdGlvbiBub2RlIG93bmVkIGJ5IHRoZSAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhbm5vdGF0aW9uIG5vZGUgb3duZWQgYnkgdGhlCiAJICogZ2l2ZW4gQVNULgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFubm90YXRpb24oQVNUIGFzdCkgewogCQlzdXBlcihhc3QpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUV4dGVuZGVkTW9kaWZpZXIjaXNNb2RpZmllcigpCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZXIoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElFeHRlbmRlZE1vZGlmaWVyI2lzQW5ub3RhdGlvbigpCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbigpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiB0eXBlIG5hbWUgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiB0eXBlIG5hbWUKLQkgKi8gCisJICovCiAJcHVibGljIE5hbWUgZ2V0VHlwZU5hbWUoKSB7CiAJCWlmICh0aGlzLnR5cGVOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xMDMsMTcgKzEwMywxNyBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGVOYW1lOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGFubm90YXRpb24gdHlwZSBuYW1lIG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgYW5ub3RhdGlvbiB0eXBlIG5hbWUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKE5hbWUgdHlwZU5hbWUpIHsKIAkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTEyOCwxMCArMTI4LDEwIEBACiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBub3JtYWwgYW5ub3RhdGlvbgogCSAqICh7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0pLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbm9ybWFsIGFubm90YXRpb24sCiAJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNOb3JtYWxBbm5vdGF0aW9uKCkgewogCQlyZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKIAl9CkBAIC0xMzksMTAgKzEzOSwxMCBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgbWFya2VyIGFubm90YXRpb24KIAkgKiAoe0BsaW5rIE1hcmtlckFubm90YXRpb259KS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIG1hcmtlciBhbm5vdGF0aW9uLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzTWFya2VyQW5ub3RhdGlvbigpIHsKIAkJcmV0dXJuICh0aGlzIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbik7CiAJfQpAQCAtMTUwLDEwICsxNTAsMTAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbi4KIAkgKiAoe0BsaW5rIFNpbmdsZU1lbWJlckFubm90YXRpb259KS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSB7CiAJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIFNpbmdsZU1lbWJlckFubm90YXRpb24pOwogCX0KQEAgLTE3MSwxMCArMTcxLDEwIEBACiAJICogTm90ZSB0aGF0IGJpbmRpbmdzICh3aGljaCBpbmNsdWRlcyByZXNvbHZlZCBhbm5vdGF0aW9ucykgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MKIAkgKiByZXF1ZXN0ZWQgd2hlbiB0aGUgQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGFubm90YXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGNhbm5vdCBiZSByZXNvbHZlZAogCSAqIEBzaW5jZSAzLjIKLQkgKi8JCisJICovCiAJcHVibGljIElBbm5vdGF0aW9uQmluZGluZyByZXNvbHZlQW5ub3RhdGlvbkJpbmRpbmcoKSB7CiAJICAgIHJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlQW5ub3RhdGlvbih0aGlzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25CaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25CaW5kaW5nLmphdmEKaW5kZXggM2UzMmYyZS4uMGU4ZjZkYiAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5ub3RhdGlvbkJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBCRUEgU3lzdGVtcywgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOSwxMyArOSwxOCBAQAogICogICAgdHlldW5nQGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGltcGxlbWVudGVkIG1ldGhvZHMgZnJvbSBJQmluZGluZwogICogICAgSUJNIENvcnBvcmF0aW9uIC0gcmVuYW1lZCBmcm9tIFJlc29sdmVkQW5ub3RhdGlvbiB0byBBbm5vdGF0aW9uQmluZGluZworICogICAgSUJNIENvcnBvcmF0aW9uIC0gRml4IGZvciAzMjg5NjkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkVsZW1lbnRWYWx1ZVBhaXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlRhZ0JpdHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKIAogLyoqCkBAIC0yMyw0MCArMjgsNTQgQEAKICAqLwogY2xhc3MgQW5ub3RhdGlvbkJpbmRpbmcgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkJpbmRpbmcgewogCXN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uQmluZGluZ1tdIE5vQW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbkJpbmRpbmdbMF07Ci0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nIGludGVybmFsQW5ub3RhdGlvbjsKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQW5ub3RhdGlvbkJpbmRpbmcgYmluZGluZzsKIAlwcml2YXRlIEJpbmRpbmdSZXNvbHZlciBiaW5kaW5nUmVzb2x2ZXI7CisJcHJpdmF0ZSBTdHJpbmcga2V5OwogCiAJQW5ub3RhdGlvbkJpbmRpbmcob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uLCBCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKIAkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJaW50ZXJuYWxBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQkJYmluZGluZ1Jlc29sdmVyID0gcmVzb2x2ZXI7CisJCXRoaXMuYmluZGluZyA9IGFubm90YXRpb247CisJCXRoaXMuYmluZGluZ1Jlc29sdmVyID0gcmVzb2x2ZXI7CiAJfQotCQorCiAJcHVibGljIElBbm5vdGF0aW9uQmluZGluZ1tdIGdldEFubm90YXRpb25zKCkgewogCQlyZXR1cm4gTm9Bbm5vdGF0aW9uczsKIAl9CiAKIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEFubm90YXRpb25UeXBlKCkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHRoaXMuYmluZGluZ1Jlc29sdmVyLmdldFR5cGVCaW5kaW5nKHRoaXMuaW50ZXJuYWxBbm5vdGF0aW9uLmdldEFubm90YXRpb25UeXBlKCkpOwotCQlpZiAoYmluZGluZyA9PSBudWxsIHx8ICFiaW5kaW5nLmlzQW5ub3RhdGlvbigpKQorCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmdSZXNvbHZlci5nZXRUeXBlQmluZGluZyh0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKSk7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBiaW5kaW5nOworCQlyZXR1cm4gdHlwZUJpbmRpbmc7CiAJfQotCQorCiAJcHVibGljIElNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nW10gZ2V0RGVjbGFyZWRNZW1iZXJWYWx1ZVBhaXJzKCkgewotCQlFbGVtZW50VmFsdWVQYWlyW10gaW50ZXJuYWxQYWlycyA9IHRoaXMuaW50ZXJuYWxBbm5vdGF0aW9uLmdldEVsZW1lbnRWYWx1ZVBhaXJzKCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKTsKKwkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgKCh0eXBlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkpIHsKKwkJCXJldHVybiBNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nLk5vUGFpcjsKKwkJfQorCQlFbGVtZW50VmFsdWVQYWlyW10gaW50ZXJuYWxQYWlycyA9IHRoaXMuYmluZGluZy5nZXRFbGVtZW50VmFsdWVQYWlycygpOwogCQlpbnQgbGVuZ3RoID0gaW50ZXJuYWxQYWlycy5sZW5ndGg7CiAJCUlNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nW10gcGFpcnMgPSBsZW5ndGggPT0gMCA/IE1lbWJlclZhbHVlUGFpckJpbmRpbmcuTm9QYWlyIDogbmV3IE1lbWJlclZhbHVlUGFpckJpbmRpbmdbbGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCXBhaXJzW2ldID0gdGhpcy5iaW5kaW5nUmVzb2x2ZXIuZ2V0TWVtYmVyVmFsdWVQYWlyQmluZGluZyhpbnRlcm5hbFBhaXJzW2ldKTsKKwkJaW50IGNvdW50ZXIgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlFbGVtZW50VmFsdWVQYWlyIHZhbHVlUGFpciA9IGludGVybmFsUGFpcnNbaV07CisJCQlpZiAodmFsdWVQYWlyLmJpbmRpbmcgPT0gbnVsbCkgY29udGludWU7CisJCQlwYWlyc1tjb3VudGVyKytdID0gdGhpcy5iaW5kaW5nUmVzb2x2ZXIuZ2V0TWVtYmVyVmFsdWVQYWlyQmluZGluZyh2YWx1ZVBhaXIpOworCQl9CisJCWlmIChjb3VudGVyID09IDApIHJldHVybiBNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nLk5vUGFpcjsKKwkJaWYgKGNvdW50ZXIgIT0gbGVuZ3RoKSB7CisJCQkvLyByZXNpemUKKwkJCVN5c3RlbS5hcnJheWNvcHkocGFpcnMsIDAsIChwYWlycyA9IG5ldyBNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nW2NvdW50ZXJdKSwgMCwgY291bnRlcik7CisJCX0KIAkJcmV0dXJuIHBhaXJzOwogCX0KIAogCXB1YmxpYyBJTWVtYmVyVmFsdWVQYWlyQmluZGluZ1tdIGdldEFsbE1lbWJlclZhbHVlUGFpcnMoKSB7CiAJCUlNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nW10gcGFpcnMgPSBnZXREZWNsYXJlZE1lbWJlclZhbHVlUGFpcnMoKTsKLQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuaW50ZXJuYWxBbm5vdGF0aW9uLmdldEFubm90YXRpb25UeXBlKCk7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSByZXR1cm4gcGFpcnM7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKTsKKwkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgKCh0eXBlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkpIHJldHVybiBwYWlyczsKIAkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSB0eXBlQmluZGluZy5hdmFpbGFibGVNZXRob2RzKCk7IC8vIHJlc2lsaWVuY2UKIAkJaW50IG1ldGhvZExlbmd0aCA9IG1ldGhvZHMgPT0gbnVsbCA/IDAgOiBtZXRob2RzLmxlbmd0aDsKIAkJaWYgKG1ldGhvZExlbmd0aCA9PSAwKSByZXR1cm4gcGFpcnM7CkBAIC02Niw4ICs4NSwxMSBAQAogCQkJcmV0dXJuIHBhaXJzOwogCiAJCUhhc2h0YWJsZU9mT2JqZWN0IHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGRlY2xhcmVkTGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJlZExlbmd0aDsgaSsrKQotCQkJdGFibGUucHV0KCgoTWVtYmVyVmFsdWVQYWlyQmluZGluZykgcGFpcnNbaV0pLmludGVybmFsTmFtZSgpLCBwYWlyc1tpXSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRMZW5ndGg7IGkrKykgeworCQkJY2hhcltdIGludGVybmFsTmFtZSA9ICgoTWVtYmVyVmFsdWVQYWlyQmluZGluZykgcGFpcnNbaV0pLmludGVybmFsTmFtZSgpOworCQkJaWYgKGludGVybmFsTmFtZSA9PSBudWxsKSBjb250aW51ZTsKKwkJCXRhYmxlLnB1dChpbnRlcm5hbE5hbWUsIHBhaXJzW2ldKTsKKwkJfQogCiAJCS8vIGhhbmRsZSBjYXNlIG9mIG1vcmUgbWV0aG9kcyB0aGFuIGRlY2xhcmVkIG1lbWJlcnMKIAkJSU1lbWJlclZhbHVlUGFpckJpbmRpbmdbXSBhbGxQYWlycyA9IG5ldyAgSU1lbWJlclZhbHVlUGFpckJpbmRpbmdbbWV0aG9kTGVuZ3RoXTsKQEAgLTc3LDE3ICs5OSw5MSBAQAogCQl9CiAJCXJldHVybiBhbGxQYWlyczsKIAl9Ci0JCisKIAlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlJVHlwZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSBnZXRBbm5vdGF0aW9uVHlwZSgpOwotCQlpZiAoYW5ub3RhdGlvblR5cGUgPT0gbnVsbCkKKwkJaWYgKCEodGhpcy5iaW5kaW5nUmVzb2x2ZXIgaW5zdGFuY2VvZiBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSkgcmV0dXJuIG51bGw7CisJCUFTVE5vZGUgbm9kZSA9IChBU1ROb2RlKSAoKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMuYmluZGluZ1Jlc29sdmVyKS5iaW5kaW5nc1RvQXN0Tm9kZXMuZ2V0KHRoaXMpOworCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQW5ub3RhdGlvbikpIHJldHVybiBudWxsOworCQlBU1ROb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7CisJCUlKYXZhRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gbnVsbDsKKwkJc3dpdGNoIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSkgeworCQljYXNlIEFTVE5vZGUuUEFDS0FHRV9ERUNMQVJBVElPTjoKKwkJCUlKYXZhRWxlbWVudCBjdSA9ICgoQ29tcGlsYXRpb25Vbml0KSBwYXJlbnQuZ2V0UGFyZW50KCkpLmdldEphdmFFbGVtZW50KCk7CisJCQlpZiAoY3UgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7CisJCQkJU3RyaW5nIHBrZ05hbWUgPSAoKFBhY2thZ2VEZWNsYXJhdGlvbikgcGFyZW50KS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCQkJcGFyZW50RWxlbWVudCA9ICAoKElDb21waWxhdGlvblVuaXQpIGN1KS5nZXRQYWNrYWdlRGVjbGFyYXRpb24ocGtnTmFtZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT046CisJCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OOgorCQljYXNlIEFTVE5vZGUuQU5OT1RBVElPTl9UWVBFX0RFQ0xBUkFUSU9OOgorCQkJcGFyZW50RWxlbWVudCA9ICgoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pIHBhcmVudCkucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOworCQkJYnJlYWs7CisJCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTjoKKwkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpICgoRmllbGREZWNsYXJhdGlvbikgcGFyZW50KS5mcmFnbWVudHMoKS5nZXQoMCk7CisJCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7CisJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXBhcmVudEVsZW1lbnQgPSB2YXJpYWJsZUJpbmRpbmcuZ2V0SmF2YUVsZW1lbnQoKTsKKwkJCWJyZWFrOworCQljYXNlIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OOgorCQkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJlbnQpLnJlc29sdmVCaW5kaW5nKCk7CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJcGFyZW50RWxlbWVudCA9IG1ldGhvZEJpbmRpbmcuZ2V0SmF2YUVsZW1lbnQoKTsKKwkJCWJyZWFrOworCQljYXNlIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UOgorCQkJZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSAoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIHBhcmVudCkuZnJhZ21lbnRzKCkuZ2V0KDApOworCQkJdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKKwkJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcGFyZW50RWxlbWVudCA9IHZhcmlhYmxlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFubm90YXRpb25UeXBlLmdldEphdmFFbGVtZW50KCk7CisJCX0KKwkJaWYgKCEgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQW5ub3RhdGFibGUpKSByZXR1cm4gbnVsbDsKKwkJaWYgKChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgJiYgKChJTWVtYmVyKSBwYXJlbnRFbGVtZW50KS5pc0JpbmFyeSgpKSB7CisJCQlyZXR1cm4gKChJQW5ub3RhdGFibGUpIHBhcmVudEVsZW1lbnQpLmdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCQl9CisJCXJldHVybiAoKElBbm5vdGF0YWJsZSkgcGFyZW50RWxlbWVudCkuZ2V0QW5ub3RhdGlvbihnZXROYW1lKCkpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQkvLyBUT0RPIHdoZW4gaW1wbGVtZW50aW5nLCB1cGRhdGUgc3BlYyBpbiBJQmluZGluZwotCQlyZXR1cm4gbnVsbDsKKwkJaWYgKHRoaXMua2V5ID09IG51bGwpIHsKKwkJCVN0cmluZyByZWNpcGllbnRLZXkgPSBnZXRSZWNpcGllbnRLZXkoKTsKKwkJCXRoaXMua2V5ID0gbmV3IFN0cmluZyh0aGlzLmJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleShyZWNpcGllbnRLZXkudG9DaGFyQXJyYXkoKSkpOworCQl9CisJCXJldHVybiB0aGlzLmtleTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRSZWNpcGllbnRLZXkoKSB7CisJCWlmICghKHRoaXMuYmluZGluZ1Jlc29sdmVyIGluc3RhbmNlb2YgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcikpIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMuYmluZGluZ1Jlc29sdmVyOworCQlBU1ROb2RlIG5vZGUgPSAoQVNUTm9kZSkgcmVzb2x2ZXIuYmluZGluZ3NUb0FzdE5vZGVzLmdldCh0aGlzKTsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJLy8gQ2FuIGhhcHBlbiBpZiBhbm5vdGF0aW9uIGJpbmRpbmdzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgaGF2aW5nIHBhcnNlZCB0aGUgZGVjbGFyYXRpb24KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUFTVE5vZGUgcmVjaXBpZW50ID0gbm9kZS5nZXRQYXJlbnQoKTsKKwkJc3dpdGNoIChyZWNpcGllbnQuZ2V0Tm9kZVR5cGUoKSkgeworCQljYXNlIEFTVE5vZGUuUEFDS0FHRV9ERUNMQVJBVElPTjoKKwkJCVN0cmluZyBwa2dOYW1lID0gKChQYWNrYWdlRGVjbGFyYXRpb24pIHJlY2lwaWVudCkuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOworCQkJcmV0dXJuIHBrZ05hbWUucmVwbGFjZSgnLicsICcvJyk7CisJCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OOgorCQkJcmV0dXJuICgoVHlwZURlY2xhcmF0aW9uKSByZWNpcGllbnQpLnJlc29sdmVCaW5kaW5nKCkuZ2V0S2V5KCk7CisJCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTjoKKwkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpICgoRmllbGREZWNsYXJhdGlvbikgcmVjaXBpZW50KS5mcmFnbWVudHMoKS5nZXQoMCk7CisJCQlyZXR1cm4gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKS5nZXRLZXkoKTsKKwkJY2FzZSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTjoKKwkJCXJldHVybiAoKE1ldGhvZERlY2xhcmF0aW9uKSByZWNpcGllbnQpLnJlc29sdmVCaW5kaW5nKCkuZ2V0S2V5KCk7CisJCWNhc2UgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQ6CisJCQlmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpICgoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgcmVjaXBpZW50KS5mcmFnbWVudHMoKS5nZXQoMCk7CisJCQlyZXR1cm4gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKS5nZXRLZXkoKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQl9CiAJfQogCiAJcHVibGljIGludCBnZXRLaW5kKCkgewpAQCAtMTAxLDI0ICsxOTcsMjQgQEAKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCUlUeXBlQmluZGluZyBhbm5vdGF0aW9uVHlwZSA9IGdldEFubm90YXRpb25UeXBlKCk7CiAJCWlmIChhbm5vdGF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmludGVybmFsQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uVHlwZSgpLnNvdXJjZU5hbWUoKSk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKS5zb3VyY2VOYW1lKCkpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIGFubm90YXRpb25UeXBlLmdldE5hbWUoKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKLQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuaW50ZXJuYWxBbm5vdGF0aW9uLmdldEFubm90YXRpb25UeXBlKCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKTsKIAkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHR5cGVCaW5kaW5nLmlzRGVwcmVjYXRlZCgpOwogCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsVG8oSUJpbmRpbmcgYmluZGluZykgewotCQlpZiAodGhpcyA9PSBiaW5kaW5nKQorCisJcHVibGljIGJvb2xlYW4gaXNFcXVhbFRvKElCaW5kaW5nIG90aGVyQmluZGluZykgeworCQlpZiAodGhpcyA9PSBvdGhlckJpbmRpbmcpCiAJCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLkFOTk9UQVRJT04pCisJCWlmIChvdGhlckJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLkFOTk9UQVRJT04pCiAJCQlyZXR1cm4gZmFsc2U7Ci0JCUlBbm5vdGF0aW9uQmluZGluZyBvdGhlciA9IChJQW5ub3RhdGlvbkJpbmRpbmcpIGJpbmRpbmc7CisJCUlBbm5vdGF0aW9uQmluZGluZyBvdGhlciA9IChJQW5ub3RhdGlvbkJpbmRpbmcpIG90aGVyQmluZGluZzsKIAkJaWYgKCFnZXRBbm5vdGF0aW9uVHlwZSgpLmlzRXF1YWxUbyhvdGhlci5nZXRBbm5vdGF0aW9uVHlwZSgpKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJSU1lbWJlclZhbHVlUGFpckJpbmRpbmdbXSBtZW1iZXJWYWx1ZVBhaXJzID0gZ2V0RGVjbGFyZWRNZW1iZXJWYWx1ZVBhaXJzKCk7CkBAIC0xMzcsOCArMjMzLDggQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZyNpc1JlY292ZXJlZCgpCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNSZWNvdmVyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgICAgIFJlZmVyZW5jZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSB0aGlzLmJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlID09IG51bGwgfHwgKGFubm90YXRpb25UeXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwOwl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTYwLDUgKzI1Niw1IEBACiAJCWJ1ZmZlci5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCA0NjgwZjcwLi42MjAwNDYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zOSw0MiArMzksNDMgQEAKICAqIG1vZGlmaWVycykuIFRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgIn0iCiAgKiB0b2tlbiBmb2xsb3dpbmcgdGhlIGJvZHkgZGVjbGFyYXRpb25zLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMQorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gewotCQorCiAJLyoqCi0JICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEphdmFkb2N9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPQogCQlpbnRlcm5hbEphdmFkb2NQcm9wZXJ0eUZhY3RvcnkoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CiAKIAkvKioKLQkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzMlByb3BlcnR5RmFjdG9yeShBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0KIAkJaW50ZXJuYWxOYW1lUHJvcGVydHlGYWN0b3J5KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uY2xhc3MpOwogCiAJLyoqCi0JICogVGhlICJib2R5RGVjbGFyYXRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYm9keURlY2xhcmF0aW9ucyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9ERUNMQVJBVElPTlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSA9CiAJCWludGVybmFsQm9keURlY2xhcmF0aW9uUHJvcGVydHlGYWN0b3J5KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uY2xhc3MpOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTg4LDI4ICs4OSwyOCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhbm5vdGF0aW9uIHR5cGUgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFubm90YXRpb24gdHlwZSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzIGZvciBhbiBhbm5vdGF0aW9uCi0JICogdHlwZSBvZiBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7IAorCSAqIHR5cGUgb2YgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBqYXZhZG9jOwogCSAqIGFuZCBhbiBlbXB0eSBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKEFTVCBhc3QpIHsKQEAgLTEyMyw3ICsxMjQsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE0Nyw3ICsxNDgsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTYxLDcgKzE2Miw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkocHJvcGVydHkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCb2R5RGVjbGFyYXRpb24uCiAJICovCkBAIC0yMTAsNyArMjExLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0SmF2YWRvYygpKSk7CiAJCXJlc3VsdC5tb2RpZmllcnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBtb2RpZmllcnMoKSkpOwpAQCAtMjI2LDcgKzIyNyw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjQxLDIxICsyNDIsMjEgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBc2J0cmFjdFR5cGVEZWNsYXJhdGlvbi4KIAkgKi8KIAlJVHlwZUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVUeXBlKHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uamF2YQppbmRleCA1MTU4ZTM0Li43OTczODY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCw1MyArMjgsNTQgQEAKICAqIFdoZW4gYSBKYXZhZG9jIGNvbW1lbnQgaXMgcHJlc2VudCwgdGhlIHNvdXJjZQogICogcmFuZ2UgYmVnaW5zIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgIi8qKiIgY29tbWVudCBkZWxpbWl0ZXIuCiAgKiBXaGVuIHRoZXJlIGlzIG5vIEphdmFkb2MgY29tbWVudCwgdGhlIHNvdXJjZSByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKLSAqIGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgbW9kaWZpZXIga2V5d29yZCAoaWYgbW9kaWZpZXJzKSwgCi0gKiBvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBtZW1iZXIgdHlwZSAobm8gbW9kaWZpZXJzKS4gCisgKiBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IG1vZGlmaWVyIGtleXdvcmQgKGlmIG1vZGlmaWVycyksCisgKiBvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBtZW1iZXIgdHlwZSAobm8gbW9kaWZpZXJzKS4KICAqIFRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKICAqICI7IiB0b2tlbi4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgSmF2YWRvY30pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9CiAJCWludGVybmFsSmF2YWRvY1Byb3BlcnR5RmFjdG9yeShBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0KIAkJaW50ZXJuYWxNb2RpZmllcnMyUHJvcGVydHlGYWN0b3J5KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uY2xhc3MpOwotCQorCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZGVmYXVsdCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImRlZmF1bHQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBERUZBVUxUX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBERUZBVUxUX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uY2xhc3MsICJkZWZhdWx0IiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDYpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtODksMTYgKzkwLDE2IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCQkJCisKIAkvKioKIAkgKiBUaGUgbWVtYmVyIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgpAQCAtMTA5LDIzICsxMTAsMjMgQEAKIAkgKiBUaGUgbWVtYmVyIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gaW50LgogCSAqLwogCXByaXZhdGUgVHlwZSBtZW1iZXJUeXBlID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFRoZSBvcHRpb25hbCBkZWZhdWx0IGV4cHJlc3Npb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgogCSAqLwogCXByaXZhdGUgRXhwcmVzc2lvbiBvcHRpb25hbERlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyIGRlY2xhcmF0aW9uIG93bmVkIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFubm90YXRpb24gdHlwZSBtZW1iZXIgZGVjbGFyYXRpb24gb3duZWQKIAkgKiBieSB0aGUgZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgZGVjbGFyYXRpb24gaXMgZm9yIGEgbWVtYmVyIG9mIGFuCiAJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBqYXZhZG9jOwogCSAqIGFuIHVuc3BlY2lmaWVkIHZhbHVlIHR5cGU7IGFuZCBubyBkZWZhdWx0IHZhbHVlLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKEFTVCBhc3QpIHsKQEAgLTEzOSw3ICsxNDAsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE4Nyw3ICsxODgsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTk4LDcgKzE5OSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkocHJvcGVydHkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCb2R5RGVjbGFyYXRpb24uCiAJICovCkBAIC0yMzMsNyArMjM0LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0SmF2YWRvYygpKSk7CiAJCXJlc3VsdC5tb2RpZmllcnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBtb2RpZmllcnMoKSkpOwpAQCAtMjUwLDcgKzI1MSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjY2LDEyICsyNjcsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBtZW1iZXIgZGVjbGFyZWQgaW4gdGhpcyBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG1lbWJlciBuYW1lIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKHRoaXMubWVtYmVyTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjg1LDE4ICsyODYsMTggQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5tZW1iZXJOYW1lOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdHlwZSBtZW1iZXIgZGVjbGFyZWQgaW4gdGhpcyBkZWNsYXJhdGlvbiB0byB0aGUKIAkgKiBnaXZlbiBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG5ldyBtZW1iZXIgbmFtZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIG1lbWJlck5hbWUpIHsKIAkJaWYgKG1lbWJlck5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzA4LDExICszMDksMTEgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyIGRlY2xhcmVkIGluIHRoaXMgCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIG1lbWJlciBkZWNsYXJlZCBpbiB0aGlzCiAJICogZGVjbGFyYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHRoaXMubWVtYmVyVHlwZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMzMwLDE0ICszMzEsMTQgQEAKIAkvKioKIAkgKiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyIGRlY2xhcmVkIGluIHRoaXMgZGVjbGFyYXRpb24KIAkgKiB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgbWVtYmVyIHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CiAJCWlmICh0eXBlID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTM0OSwxOSArMzUwLDE5IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24gdHlwZSBtZW1iZXIsIG9yIAorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyLCBvcgogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RGVmYXVsdCgpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxEZWZhdWx0VmFsdWU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyLgotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTM2OSw3ICszNzAsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RGVmYXVsdChFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgewogCQkvLyBhIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxEZWZhdWx0VmFsdWU7CkBAIC0zNzcsNyArMzc4LDcgQEAKIAkJdGhpcy5vcHRpb25hbERlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZGVmYXVsdFZhbHVlLCBERUZBVUxUX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGFubm90YXRpb24gdHlwZSBtZW1iZXIgZGVjbGFyZWQKIAkgKiBpbiB0aGlzIGRlY2xhcmF0aW9uLgpAQCAtMzg1LDEwICszODYsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlTWVtYmVyKHRoaXMpOwogCX0KQEAgLTM5OSw3ICs0MDAsNyBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCmluZGV4IGUwNjhlNDkuLjE0ZDRjYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDI3ICsyMywyOCBAQAogICogQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjoKICAqICAgICAgICA8Yj57PC9iPiBDbGFzc0JvZHlEZWNsYXJhdGlvbiA8Yj59PC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2VlIENsYXNzSW5zdGFuY2VDcmVhdGlvbgogICogQHNlZSBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7CiAKIAkvKioKLQkgKiBUaGUgImJvZHlEZWNsYXJhdGlvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJib2R5RGVjbGFyYXRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9ERUNMQVJBVElPTlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgImJvZHlEZWNsYXJhdGlvbnMiLCBCb2R5RGVjbGFyYXRpb24uY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNTQsMzQgKzU1LDM0IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgYm9keSBkZWNsYXJhdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogVGhlIGJvZHkgZGVjbGFyYXRpb25zIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KS4KIAkgKiBEZWZhdWx0cyB0byBub25lLgogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBib2R5RGVjbGFyYXRpb25zID0gCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChCT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSk7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24gb3duZWQgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIG93bmVkCiAJICogYnkgdGhlIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGxpc3Qgb2YgYm9keSBkZWNsYXJhdGlvbnMgaXMgZW1wdHkuCiAJICogPHA+Ci0JICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUKIAkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24oQVNUIGFzdCkgewpAQCAtOTQsNyArOTUsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwNSw3ICsxMDYsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldENoaWxkTGlzdFByb3BlcnR5KHByb3BlcnR5KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTExOCw3ICsxMTksNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkQWxsKAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBib2R5RGVjbGFyYXRpb25zKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTEzOSwxOCArMTQwLDE4IEBACiAJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CiAJCWlmICh2aXNpdENoaWxkcmVuKSB7CiAJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBib2R5RGVjbGFyYXRpb25zKTsKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHRoaXMuYm9keURlY2xhcmF0aW9ucyk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBib2R5IGRlY2xhcmF0aW9ucyBvZiB0aGlzCiAJICogYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikKLQkgKi8gCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0pCisJICovCiAJcHVibGljIExpc3QgYm9keURlY2xhcmF0aW9ucygpIHsKIAkJcmV0dXJuIHRoaXMuYm9keURlY2xhcmF0aW9uczsKIAl9CkBAIC0xNjIsMTQgKzE2MywxNCBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZQogCSAqICAgIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBJVHlwZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlVHlwZSh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE3NywxMiArMTc4LDEyIEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyB0aGlzLmJvZHlEZWNsYXJhdGlvbnMubGlzdFNpemUoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5QWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5QWNjZXNzLmphdmEKaW5kZXggN2NmY2E4NC4uOWYxNzNjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlBY2Nlc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwzMiArMjEsMzMgQEAKICAqIEFycmF5QWNjZXNzOgogICogICAgRXhwcmVzc2lvbiA8Yj5bPC9iPiBFeHByZXNzaW9uIDxiPl08L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQXJyYXlBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiYXJyYXkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJhcnJheSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBBUlJBWV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQVJSQVlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQXJyYXlBY2Nlc3MuY2xhc3MsICJhcnJheSIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiaW5kZXgiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJpbmRleCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBJTkRFWF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSU5ERVhfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQXJyYXlBY2Nlc3MuY2xhc3MsICJpbmRleCIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChBcnJheUFjY2Vzcy5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNTgsMTggKzU5LDE4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgYXJyYXkgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKIAkgKiBidXQgbGVnYWwsIGV4cHJlc3Npb24uCkBAIC04MywxMyArODQsMTMgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gaW5kZXhFeHByZXNzaW9uID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKLQkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhcnJheSBhbmQgaW5kZXggZXhwcmVzc3Npb25zIGFyZSB1bnNwZWNpZmllZCwgCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGFjY2VzcyBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgYXJyYXkgYW5kIGluZGV4IGV4cHJlc3NzaW9ucyBhcmUgdW5zcGVjaWZpZWQsCiAJICogYnV0IGxlZ2FsLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFycmF5QWNjZXNzKEFTVCBhc3QpIHsKQEAgLTEwMiw3ICsxMDMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNiw3ICsxMjcsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM5LDcgKzE0MCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlBcnJheUFjY2VzcyByZXN1bHQgPSBuZXcgQXJyYXlBY2Nlc3ModGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0QXJyYXkoKEV4cHJlc3Npb24pIGdldEFycmF5KCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRJbmRleCgoRXhwcmVzc2lvbikgZ2V0SW5kZXgoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTE2NSwxMiArMTY2LDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBhcnJheSBleHByZXNzaW9uIG9mIHRoaXMgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhcnJheSBleHByZXNzaW9uIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0QXJyYXkoKSB7CiAJCWlmICh0aGlzLmFycmF5RXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTg0LDEwICsxODUsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5hcnJheUV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYXJyYXkgZXhwcmVzc2lvbiBvZiB0aGlzIGFycmF5IGFjY2VzcyBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGFycmF5IGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE5NSw3ICsxOTYsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0QXJyYXkoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIwNywxMiArMjA4LDEyIEBACiAJCXRoaXMuYXJyYXlFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZXhwcmVzc2lvbiwgQVJSQVlfUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGluZGV4IGV4cHJlc3Npb24gb2YgdGhpcyBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGluZGV4IGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRJbmRleCgpIHsKIAkJaWYgKHRoaXMuaW5kZXhFeHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMjYsMTAgKzIyNywxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmluZGV4RXhwcmVzc2lvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBpbmRleCBleHByZXNzaW9uIG9mIHRoaXMgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgaW5kZXggZXhwcmVzc2lvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjM3LDcgKzIzOCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRJbmRleChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5Q3JlYXRpb24uamF2YQppbmRleCBkYmE0OTBhLi5mOTU3N2E1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5Q3JlYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5Q3JlYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00NCwzNyArNDQsMzggQEAKICAqIDwvcHJlPgogICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQXJyYXlDcmVhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEFycmF5VHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQXJyYXlDcmVhdGlvbi5jbGFzcywgInR5cGUiLCBBcnJheVR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZGltZW5zaW9ucyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImRpbWVuc2lvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgRElNRU5TSU9OU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIERJTUVOU0lPTlNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKEFycmF5Q3JlYXRpb24uY2xhc3MsICJkaW1lbnNpb25zIiwgRXhwcmVzc2lvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiaW5pdGlhbGl6ZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJpbml0aWFsaXplciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBJTklUSUFMSVpFUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSU5JVElBTElaRVJfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQXJyYXlDcmVhdGlvbi5jbGFzcywgImluaXRpYWxpemVyIiwgQXJyYXlJbml0aWFsaXplci5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDQpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQXJyYXlDcmVhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtODcsMTggKzg4LDE4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgYXJyYXkgdHlwZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIGFycmF5IHR5cGUuCkBAIC0xMDcsNyArMTA4LDcgQEAKIAogCS8qKgogCSAqIFRoZSBsaXN0IG9mIGRpbWVuc2lvbiBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOgotCSAqIDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBkaW1lbnNpb25zID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRElNRU5TSU9OU19QUk9QRVJUWSk7CkBAIC0xMTksMTEgKzEyMCwxMSBAQAogCXByaXZhdGUgQXJyYXlJbml0aWFsaXplciBvcHRpb25hbEluaXRpYWxpemVyID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlCiAJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgYXJyYXkgdHlwZSBpcyBhbiB1bnNwZWNpZmllZCAxLWRpbWVuc2lvbmFsCiAJICogYXJyYXksIHRoZSBsaXN0IG9mIGRpbWVuc2lvbnMgaXMgZW1wdHksIGFuZCB0aGVyZSBpcyBubyBhcnJheQogCSAqIGluaXRpYWxpemVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFycmF5Q3JlYXRpb24oQVNUIGFzdCkgewpAQCAtMTM2LDcgKzEzNyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkJCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTcxLDcgKzE3Miw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkocHJvcGVydHkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTg0LDcgKzE4NSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlBcnJheUNyZWF0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUNyZWF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGUoKEFycmF5VHlwZSkgZ2V0VHlwZSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuZGltZW5zaW9ucygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGRpbWVuc2lvbnMoKSkpOwogCQlyZXN1bHQuc2V0SW5pdGlhbGl6ZXIoCkBAIC0yMTMsMTIgKzIxNCwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYXJyYXkgdHlwZSBpbiB0aGlzIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhcnJheSB0eXBlCi0JICovIAorCSAqLwogCXB1YmxpYyBBcnJheVR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHRoaXMuYXJyYXlUeXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMzYsMTQgKzIzNywxNCBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgYXJyYXkgdHlwZSBpbiB0aGlzIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGFycmF5IHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGUoQXJyYXlUeXBlIHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjU0LDMyICsyNTUsMzIgQEAKIAkJdGhpcy5hcnJheVR5cGUgPSB0eXBlOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCB0eXBlLCBUWVBFX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBkaW1lbnNpb24gZXhwcmVzc2lvbnMgaW4gdGhpcyBhcnJheQogCSAqIGluaXRpYWxpemVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGRpbWVuc2lvbiBleHByZXNzaW9ucwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pCisJICovCiAJcHVibGljIExpc3QgZGltZW5zaW9ucygpIHsKIAkJcmV0dXJuIHRoaXMuZGltZW5zaW9uczsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcnJheSBpbml0aWFsaXplciBvZiB0aGlzIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24sIG9yIAorCSAqIFJldHVybnMgdGhlIGFycmF5IGluaXRpYWxpemVyIG9mIHRoaXMgYXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbiwgb3IKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IGluaXRpYWxpemVyIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqCisJICogQHJldHVybiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyBBcnJheUluaXRpYWxpemVyIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gb3B0aW9uYWxJbml0aWFsaXplcjsKKwkJcmV0dXJuIHRoaXMub3B0aW9uYWxJbml0aWFsaXplcjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIG9yIGNsZWFycyB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgb2YgdGhpcyBhcnJheSBjcmVhdGlvbiBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBhcnJheSBpbml0aWFsaXplciBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqICAgIGlmIHRoZXJlIGlzIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKQEAgLTI4OCw3ICsyODksNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplcikgewogCQkvLyBhbiBBcnJheUNyZWF0aW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gQXJyYXlJbml0aWFsaXplcgogCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcwpAQCAtMzA0LDcgKzMwNSw3IEBACiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDMgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5SW5pdGlhbGl6ZXIuamF2YQppbmRleCBjMzM4YTQwLi5mMmMxMTVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5SW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5SW5pdGlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwyNSArMjEsMjYgQEAKICAqIEFycmF5SW5pdGlhbGl6ZXI6CiAgKiAJCTxiPns8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb259IFsgPGI+LDwvYj4gXV0gPGI+fTwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBBcnJheUluaXRpYWxpemVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQXJyYXlJbml0aWFsaXplci5jbGFzcywgImV4cHJlc3Npb25zIiwgRXhwcmVzc2lvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChBcnJheUluaXRpYWxpemVyLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01MCwzMyArNTEsMzMgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIChlbGVtZW50IHR5cGU6Ci0JICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqIHtAbGluayBFeHByZXNzaW9ufSkuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGV4cHJlc3Npb25zID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRVhQUkVTU0lPTlNfUFJPUEVSVFkpOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb3duZWQgYnkgdGhlIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFycmF5IGluaXRpYWxpemVyIG93bmVkIGJ5IHRoZQogCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgZW1wdHkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJQXJyYXlJbml0aWFsaXplcihBU1QgYXN0KSB7Ci0JCXN1cGVyKGFzdCk7CQorCQlzdXBlcihhc3QpOwogCX0KIAogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQpAQCAtODUsNyArODYsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwOSw3ICsxMTAsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQXJyYXlJbml0aWFsaXplciByZXN1bHQgPSBuZXcgQXJyYXlJbml0aWFsaXplcih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5leHByZXNzaW9ucygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGV4cHJlc3Npb25zKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xMzIsMjQgKzEzMywyNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaW4gdGhpcyBhcnJheSBpbml0aWFsaXplci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCi0JICovIAorCSAqCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGV4cHJlc3Npb25zCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KQorCSAqLwogCXB1YmxpYyBMaXN0IGV4cHJlc3Npb25zKCkgewogCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uczsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheVR5cGUuamF2YQppbmRleCA4NmU1YmMxLi4wYzdkZWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsMjUgKzIzLDI2IEBACiAgKiBBcnJheVR5cGU6CiAgKiAgICBUeXBlIDxiPls8L2I+IDxiPl08L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQXJyYXlUeXBlIGV4dGVuZHMgVHlwZSB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImNvbXBvbmVudFR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJjb21wb25lbnRUeXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIENPTVBPTkVOVF9UWVBFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBDT01QT05FTlRfVFlQRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihBcnJheVR5cGUuY2xhc3MsICJjb21wb25lbnRUeXBlIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEFycmF5VHlwZS5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNTIsMzEgKzUzLDMxIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCi0JLyoqIAorCisJLyoqCiAJICogVGhlIGNvbXBvbmVudCB0eXBlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgc2ltcGxlIHR5cGUgd2l0aAogCSAqIGFuIHVuc3BlY2ZpZWQsIGJ1dCBsZWdhbCwgbmFtZS4KIAkgKi8KIAlwcml2YXRlIFR5cGUgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYW4gYXJyYXkgdHlwZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgogCSAqIEJ5IGRlZmF1bHQsIGEgMS1kaW1lbnNpb25hbCBhcnJheSBvZiBhbiB1bnNwZWNpZmllZCBzaW1wbGUgdHlwZS4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlBcnJheVR5cGUoQVNUIGFzdCkgewpAQCAtODksNyArOTAsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwNSw3ICsxMDYsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE4LDcgKzExOSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlBcnJheVR5cGUgcmVzdWx0ID0gbmV3IEFycmF5VHlwZSh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRDb21wb25lbnRUeXBlKChUeXBlKSBnZXRDb21wb25lbnRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTQxLDEzICsxNDIsMTMgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZS4gVGhlIGNvbXBvbmVudCB0eXBlCiAJICogbWF5IGJlIGFub3RoZXIgYXJyYXkgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKIAkJaWYgKHRoaXMuY29tcG9uZW50VHlwZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTY1LDcgKzE2Niw3IEBACiAJLyoqCiAJICogU2V0cyB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheSB0eXBlLiBUaGUgY29tcG9uZW50IHR5cGUKIAkgKiBtYXkgYmUgYW5vdGhlciBhcnJheSB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvbXBvbmVudFR5cGUgdGhlIGNvbXBvbmVudCB0eXBlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMTczLDcgKzE3NCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKFR5cGUgY29tcG9uZW50VHlwZSkgewogCQlpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0xODksMTEgKzE5MCwxMSBAQAogCSAqIG5ldmVyIGFuIGFycmF5IHR5cGUuCiAJICogPHA+CiAJICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGRlc2NlbmRzIGEgY2hhaW4gb2YgbmVzdGVkIGFycmF5IHR5cGVzCi0JICogdW50aWwgaXQgcmVhY2hlcyBhIG5vbi1hcnJheSB0eXBlLiAKKwkgKiB1bnRpbCBpdCByZWFjaGVzIGEgbm9uLWFycmF5IHR5cGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29tcG9uZW50IHR5cGUgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgVHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKIAkJVHlwZSB0ID0gZ2V0Q29tcG9uZW50VHlwZSgpOwogCQl3aGlsZSAodC5pc0FycmF5VHlwZSgpKSB7CkBAIC0yMDEsMTYgKzIwMiwxNiBAQAogCQl9CiAJCXJldHVybiB0OwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIHRoaXMgYXJyYXkgdHlwZS4KIAkgKiA8cD4KIAkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgZGVzY2VuZHMgYSBjaGFpbiBvZiBuZXN0ZWQgYXJyYXkgdHlwZXMKLQkgKiB1bnRpbCBpdCByZWFjaGVzIGEgbm9uLWFycmF5IHR5cGUuIAorCSAqIHVudGlsIGl0IHJlYWNoZXMgYSBub24tYXJyYXkgdHlwZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyAoYWx3YXlzIHBvc2l0aXZlKQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgaW50IGdldERpbWVuc2lvbnMoKSB7CiAJCVR5cGUgdCA9IGdldENvbXBvbmVudFR5cGUoKTsKIAkJaW50IGRpbWVuc2lvbnMgPSAxOyAvLyBhbHdheXMgaW5jbHVkZSB0aGlzIGFycmF5IHR5cGUKQEAgLTIyMCwyMCArMjIxLDIwIEBACiAJCX0KIAkJcmV0dXJuIGRpbWVuc2lvbnM7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKIAkJcmV0dXJuCi0JCQltZW1TaXplKCkgCisJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMuY29tcG9uZW50VHlwZSA9PSBudWxsID8gMCA6IGdldENvbXBvbmVudFR5cGUoKS50cmVlU2l6ZSgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2VydFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NlcnRTdGF0ZW1lbnQuamF2YQppbmRleCA5NTRhNjM3Li42YzcxZmE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2VydFN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzZXJ0U3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMzIgKzIxLDMzIEBACiAgKiBBc3NlcnRTdGF0ZW1lbnQ6CiAgKiAgICA8Yj5hc3NlcnQ8L2I+IEV4cHJlc3Npb24gWyA8Yj46PC9iPiBFeHByZXNzaW9uIF0gPGI+OzwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQkJCisKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQXNzZXJ0U3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAibWVzc2FnZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm1lc3NhZ2UiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTUVTU0FHRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTUVTU0FHRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihBc3NlcnRTdGF0ZW1lbnQuY2xhc3MsICJtZXNzYWdlIiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQXNzZXJ0U3RhdGVtZW50LmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01OCwxOCArNTksMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleHByZXNzaW9uLgpAQCAtODAsMTUgKzgxLDE1IEBACiAJICogVGhlIG1lc3NhZ2UgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCiAJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsTWVzc2FnZUV4cHJlc3Npb24gPSBudWxsOwotCQorCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhc3NlcnQgc3RhdGVtZW50IGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAogCSAqIGV4cHJlc3Npb24sIGFuZCBub3QgbWVzc2FnZSBleHByZXNzaW9uLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUFzc2VydFN0YXRlbWVudChBU1QgYXN0KSB7CkBAIC0xMDEsNyArMTAyLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMzgsNyArMTM5LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUFzc2VydFN0YXRlbWVudCByZXN1bHQgPSBuZXcgQXNzZXJ0U3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oCiAJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4cHJlc3Npb24oKSkpOwpAQCAtMTY3LDEyICsxNjgsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGZpcnN0IGV4cHJlc3Npb24gb2YgdGhpcyBhc3NlcnQgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4NCwxMiArMTg1LDEyIEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOworCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSBmaXJzdCBleHByZXNzaW9uIG9mIHRoaXMgYXNzZXJ0IHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBuZXcgZXhwcmVzc2lvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMTk3LDcgKzE5OCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMTAsMjAgKzIxMSwyMCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZXhwcmVzc2lvbiBvZiB0aGlzIGFzc2VydCBzdGF0ZW1lbnQsIG9yIAorCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZXhwcmVzc2lvbiBvZiB0aGlzIGFzc2VydCBzdGF0ZW1lbnQsIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKIAkgKiAgICBpcyBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldE1lc3NhZ2UoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsTWVzc2FnZUV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIG1lc3NhZ2UgZXhwcmVzc2lvbiBvZiB0aGlzIGFzc2VydCBzdGF0ZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG1lc3NhZ2UgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjMxLDcgKzIzMiw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQkvLyBhbiBBc2VydFN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcwogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy5vcHRpb25hbE1lc3NhZ2VFeHByZXNzaW9uOwpAQCAtMjM5LDE0ICsyNDAsMTQgQEAKIAkJdGhpcy5vcHRpb25hbE1lc3NhZ2VFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZXhwcmVzc2lvbiwgTUVTU0FHRV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTI1NSw3ICsyNTYsNyBAQAogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKIAkJCSsgKHRoaXMub3B0aW9uYWxNZXNzYWdlRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldE1lc3NhZ2UoKS50cmVlU2l6ZSgpKTsKLQkJCQorCiAJfQogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2lnbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzaWdubWVudC5qYXZhCmluZGV4IGM2NjcxZDguLjNhNjU0MmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzaWdubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzaWdubWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDExICsyMywxMiBAQAogICogQXNzaWdubWVudDoKICAqICAgIEV4cHJlc3Npb24gQXNzaWdubWVudE9wZXJhdG9yIEV4cHJlc3Npb24KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCQorCiAJLyoqCiAgCSAqIEFzc2lnbm1lbnQgb3BlcmF0b3JzICh0eXBlc2FmZSBlbnVtZXJhdGlvbikuCiAJICogPHByZT4KQEAgLTQ3LDM0ICs0OCwzNCBAQAogCSAqIDwvcHJlPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlcmF0b3IgewotCQorCiAJCS8qKgogCQkgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0b3IKIAkJICovCiAJCXByaXZhdGUgU3RyaW5nIG9wOwotCQkKKwogCQkvKioKIAkJICogQ3JlYXRlcyBhIG5ldyBhc3NpZ25tZW50IG9wZXJhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAJCSAqIDxwPgogCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcwogCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgogCQkgKiA8L3A+Ci0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0gb3AgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyBvcCkgewogCQkJdGhpcy5vcCA9IG9wOwogCQl9Ci0JCQorCiAJCS8qKgogCQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvci4KLQkJICogCisJCSAqCiAJCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG9wOworCQkJcmV0dXJuIHRoaXMub3A7CiAJCX0KLQkJCisKIAkJLyoqID0gb3BlcmF0b3IuICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgQVNTSUdOID0gbmV3IE9wZXJhdG9yKCI9Iik7Ly8kTk9OLU5MUy0xJAogCQkvKiogKz0gb3BlcmF0b3IuICovCkBAIC0xMDIsMjMgKzEwMywyMyBAQAogCQkvKiogJmd0OyZndDsmZ3Q7PSBvcGVyYXRvci4gKi8KIAkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBSSUdIVF9TSElGVF9VTlNJR05FRF9BU1NJR04gPQogCQkJbmV3IE9wZXJhdG9yKCI+Pj49Iik7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKioKIAkJICogUmV0dXJucyB0aGUgYXNzaWdubWVudCBvcGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzdHJpbmcsCiAJCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCiAJCSAqIDxwPgogCQkgKiA8Y29kZT50b09wZXJhdG9yPC9jb2RlPiBpcyB0aGUgY29udmVyc2Ugb2YgPGNvZGU+dG9TdHJpbmc8L2NvZGU+OgotCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IgYWxsIAorCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IgYWxsCiAJCSAqIG9wZXJhdG9ycyA8Y29kZT5vcDwvY29kZT4uCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSB0b2tlbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKIAkJICogQHJldHVybiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCQkgKi8KIAkJcHVibGljIHN0YXRpYyBPcGVyYXRvciB0b09wZXJhdG9yKFN0cmluZyB0b2tlbikgewogCQkJcmV0dXJuIChPcGVyYXRvcikgQ09ERVMuZ2V0KHRva2VuKTsKIAkJfQotCQkKKwogCQkvKioKIAkJICogTWFwIGZyb20gdG9rZW4gdG8gb3BlcmF0b3IgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OwogCQkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5PcGVyYXRvcjwvY29kZT4pLgpAQCAtMTQ1LDM1ICsxNDYsMzUgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgotCSAqIFRoZSAibGVmdEhhbmRTaWRlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibGVmdEhhbmRTaWRlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIExFRlRfSEFORF9TSURFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBMRUZUX0hBTkRfU0lERV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihBc3NpZ25tZW50LmNsYXNzLCAibGVmdEhhbmRTaWRlIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJvcGVyYXRvciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm9wZXJhdG9yIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgQXNzaWdubWVudC5PcGVyYXRvcn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBPUEVSQVRPUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE9QRVJBVE9SX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihBc3NpZ25tZW50LmNsYXNzLCAib3BlcmF0b3IiLCBBc3NpZ25tZW50Lk9wZXJhdG9yLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgInJpZ2h0SGFuZFNpZGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJyaWdodEhhbmRTaWRlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFJJR0hUX0hBTkRfU0lERV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUklHSFRfSEFORF9TSURFX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEFzc2lnbm1lbnQuY2xhc3MsICJyaWdodEhhbmRTaWRlIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEFzc2lnbm1lbnQuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTE4NiwxOCArMTg3LDE4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgYXNzaWdubWVudCBvcGVyYXRvcjsgZGVmYXVsdHMgdG8gQXNzaWdubWVudC5PcGVyYXRvci5BU1NJR04KIAkgKi8KQEAgLTIxNiwxMCArMjE3LDEwIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIHJpZ2h0SGFuZFNpZGUgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbm9kZSBoYXMgYW4gYXNzaWdubWVudCBvcGVyYXRvciwgYW5kIHVuc3BlY2lmaWVkCiAJICogbGVmdCBhbmQgcmlnaHQgaGFuZCBzaWRlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlBc3NpZ25tZW50KEFTVCBhc3QpIHsKQEAgLTIzMiw3ICsyMzMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTI4NSw3ICsyODYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQXNzaWdubWVudCByZXN1bHQgPSBuZXcgQXNzaWdubWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvcigpKTsKIAkJcmVzdWx0LnNldExlZnRIYW5kU2lkZSgoRXhwcmVzc2lvbikgZ2V0TGVmdEhhbmRTaWRlKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRSaWdodEhhbmRTaWRlKChFeHByZXNzaW9uKSBnZXRSaWdodEhhbmRTaWRlKCkuY2xvbmUodGFyZ2V0KSk7CkBAIC0zMTIsMjIgKzMxMywyMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yCi0JICovIAorCSAqLwogCXB1YmxpYyBBc3NpZ25tZW50Lk9wZXJhdG9yIGdldE9wZXJhdG9yKCkgewogCQlyZXR1cm4gdGhpcy5hc3NpZ25tZW50T3BlcmF0b3I7CiAJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXNzaWdubWVudE9wZXJhdG9yIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yIGFzc2lnbm1lbnRPcGVyYXRvcikgewogCQlpZiAoYXNzaWdubWVudE9wZXJhdG9yID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTMzOSw5ICszNDAsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsZWZ0IGhhbmQgc2lkZSBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldExlZnRIYW5kU2lkZSgpIHsKIAkJaWYgKHRoaXMubGVmdEhhbmRTaWRlICA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMzU1LDEwICszNTYsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5sZWZ0SGFuZFNpZGU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoaXMgYXNzaWdubWVudCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGxlZnQgaGFuZCBzaWRlIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0zNjYsNyArMzY3LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldExlZnRIYW5kU2lkZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzgwLDkgKzM4MSw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSByaWdodCBoYW5kIHNpZGUgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRSaWdodEhhbmRTaWRlKCkgewogCQlpZiAodGhpcy5yaWdodEhhbmRTaWRlICA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMzk2LDEwICszOTcsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5yaWdodEhhbmRTaWRlOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC00MDcsNyArNDA4LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFJpZ2h0SGFuZFNpZGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTQyNiwxMiArNDI3LDEyIEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMubGVmdEhhbmRTaWRlID09IG51bGwgPyAwIDogZ2V0TGVmdEhhbmRTaWRlKCkudHJlZVNpemUoKSkKIAkJCSsgKHRoaXMucmlnaHRIYW5kU2lkZSA9PSBudWxsID8gMCA6IGdldFJpZ2h0SGFuZFNpZGUoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ0NvbXBhcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ0NvbXBhcmF0b3IuamF2YQppbmRleCA2YjQyYWI3Li45Y2Y0MDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JpbmRpbmdDb21wYXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CaW5kaW5nQ29tcGFyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDcgKzI3LDcgQEAKIAogLyoqCiAgKiBJbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIGNvbXBhcmluZyBiaW5kaW5ncy4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKICAqLwogY2xhc3MgQmluZGluZ0NvbXBhcmF0b3IgewpAQCAtNTcsNyArNTcsNyBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEBwYXJhbSBkZWNsYXJpbmdFbGVtZW50CiAJICogQHBhcmFtIGRlY2xhcmluZ0VsZW1lbnQyCkBAIC0xMDMsMTIgKzEwMywxMiBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLAogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcyKSB7CiAJCXJldHVybiBpc0VxdWFsKG1ldGhvZEJpbmRpbmcsIG1ldGhvZEJpbmRpbmcyLCBuZXcgSGFzaFNldCgpKTsKIAl9Ci0JCQkKKwogCXN0YXRpYyBib29sZWFuIGlzRXF1YWwob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzIsCiAJCQlIYXNoU2V0IHZpc2l0ZWRUeXBlcykgewpAQCAtMTE3LDcgKzExNyw3IEBACiAJCX0KIAkJaWYgKG1ldGhvZEJpbmRpbmcyID09IG51bGwpIHJldHVybiBmYWxzZTsKIAkJcmV0dXJuIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIG1ldGhvZEJpbmRpbmcyLnNlbGVjdG9yKQotCQkJCSYmIGlzRXF1YWwobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLCBtZXRob2RCaW5kaW5nMi5yZXR1cm5UeXBlLCB2aXNpdGVkVHlwZXMpIAorCQkJCSYmIGlzRXF1YWwobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLCBtZXRob2RCaW5kaW5nMi5yZXR1cm5UeXBlLCB2aXNpdGVkVHlwZXMpCiAJCQkJJiYgaXNFcXVhbChtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsIG1ldGhvZEJpbmRpbmcyLnRocm93bkV4Y2VwdGlvbnMsIHZpc2l0ZWRUeXBlcykKIAkJCQkmJiBpc0VxdWFsKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIG1ldGhvZEJpbmRpbmcyLmRlY2xhcmluZ0NsYXNzLCB2aXNpdGVkVHlwZXMpCiAJCQkJJiYgaXNFcXVhbChtZXRob2RCaW5kaW5nLnR5cGVWYXJpYWJsZXMsIG1ldGhvZEJpbmRpbmcyLnR5cGVWYXJpYWJsZXMsIHZpc2l0ZWRUeXBlcykKQEAgLTE4MywxNCArMTgzLDE0IEBACiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9CiAJCQkJcmV0dXJuIHR5cGVCaW5kaW5nLmlkID09IHR5cGVCaW5kaW5nMi5pZDsKLQkJCQkKKwogCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgogCQkJCWlmICghdHlwZUJpbmRpbmcyLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCQlyZXR1cm4gdHlwZUJpbmRpbmcuZGltZW5zaW9ucygpID09IHR5cGVCaW5kaW5nMi5kaW1lbnNpb25zKCkKIAkJCQkJCSYmIGlzRXF1YWwodHlwZUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKSwgdHlwZUJpbmRpbmcyLmxlYWZDb21wb25lbnRUeXBlKCksIHZpc2l0ZWRUeXBlcyk7Ci0JCQkJCisKIAkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgogCQkJCWlmICghdHlwZUJpbmRpbmcyLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewogCQkJCQlyZXR1cm4gZmFsc2U7CkBAIC0yMDIsMTYgKzIwMiwyNSBAQAogCQkJCQkJCT09IChwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcyLm1vZGlmaWVycyAmIChFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZSB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NFbnVtIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fubm90YXRpb24pKQogCQkJCQkmJiBpc0VxdWFsKHBhcmFtZXRlcml6ZWRUeXBlQmluZGluZy5hcmd1bWVudHMsIHBhcmFtZXRlcml6ZWRUeXBlQmluZGluZzIuYXJndW1lbnRzLCB2aXNpdGVkVHlwZXMpCiAJCQkJCSYmIGlzRXF1YWwocGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKSwgcGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nMi5lbmNsb3NpbmdUeXBlKCksIHZpc2l0ZWRUeXBlcyk7Ci0JCQkJCQkJCisKIAkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKLQkJCQlpZiAoIXR5cGVCaW5kaW5nMi5pc1dpbGRjYXJkKCkpIHsKKwkJCQlpZiAodHlwZUJpbmRpbmcyLmtpbmQoKSAhPSBCaW5kaW5nLldJTERDQVJEX1RZUEUpIHsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgdHlwZUJpbmRpbmc7CiAJCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkQmluZGluZzIgPSAoV2lsZGNhcmRCaW5kaW5nKSB0eXBlQmluZGluZzI7CiAJCQkJcmV0dXJuIGlzRXF1YWwod2lsZGNhcmRCaW5kaW5nLmJvdW5kLCB3aWxkY2FyZEJpbmRpbmcyLmJvdW5kLCB2aXNpdGVkVHlwZXMpCiAJCQkJCSYmIHdpbGRjYXJkQmluZGluZy5ib3VuZEtpbmQgPT0gd2lsZGNhcmRCaW5kaW5nMi5ib3VuZEtpbmQ7Ci0JCQkJCisKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRToKKwkJCQlpZiAodHlwZUJpbmRpbmcyLmtpbmQoKSAhPSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJV2lsZGNhcmRCaW5kaW5nIGludGVyc2VjdGlvbkJpbmRpbmcgPSAoV2lsZGNhcmRCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJCQlXaWxkY2FyZEJpbmRpbmcgaW50ZXJzZWN0aW9uQmluZGluZzIgPSAoV2lsZGNhcmRCaW5kaW5nKSB0eXBlQmluZGluZzI7CisJCQkJcmV0dXJuIGlzRXF1YWwoaW50ZXJzZWN0aW9uQmluZGluZy5ib3VuZCwgaW50ZXJzZWN0aW9uQmluZGluZzIuYm91bmQsIHZpc2l0ZWRUeXBlcykKKwkJCQkJJiYgaXNFcXVhbChpbnRlcnNlY3Rpb25CaW5kaW5nLm90aGVyQm91bmRzLCBpbnRlcnNlY3Rpb25CaW5kaW5nMi5vdGhlckJvdW5kcywgdmlzaXRlZFR5cGVzKTsKKwogCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKIAkJCQlpZiAoISh0eXBlQmluZGluZzIuaXNUeXBlVmFyaWFibGUoKSkpIHsKIAkJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjI1LDcgKzIzNCw3IEBACiAJCQkJCWlmIChjYXB0dXJlQmluZGluZy5wb3NpdGlvbiA9PSBjYXB0dXJlQmluZGluZzIucG9zaXRpb24pIHsKIAkJCQkJCWlmICh2aXNpdGVkVHlwZXMuY29udGFpbnModHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsKIAkJCQkJCXZpc2l0ZWRUeXBlcy5hZGQodHlwZUJpbmRpbmcpOwotCQkJCQkJCisKIAkJCQkJCXJldHVybiBpc0VxdWFsKGNhcHR1cmVCaW5kaW5nLndpbGRjYXJkLCBjYXB0dXJlQmluZGluZzIud2lsZGNhcmQsIHZpc2l0ZWRUeXBlcykKIAkJCQkJCQkmJiBpc0VxdWFsKGNhcHR1cmVCaW5kaW5nLnNvdXJjZVR5cGUsIGNhcHR1cmVCaW5kaW5nMi5zb3VyY2VUeXBlLCB2aXNpdGVkVHlwZXMpOwogCQkJCQl9CkBAIC0yNTgsNyArMjY3LDcgQEAKIAkJCWRlZmF1bHQgOgogCQkJCWlmICghKHR5cGVCaW5kaW5nMiBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSB7CiAJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CQkJCQorCQkJCX0KIAkJCQlyZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nOwogCQkJCXJlZmVyZW5jZUJpbmRpbmcyID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nMjsKIAkJCQljaGFyW10gY29uc3RhbnRQb29sTmFtZSA9IHJlZmVyZW5jZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CaW5kaW5nUmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ1Jlc29sdmVyLmphdmEKaW5kZXggNzRkNjg0Zi4uZDIyY2I2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CaW5kaW5nUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JpbmRpbmdSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3NSw2ICsyNzUsMTAgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCWJvb2xlYW4gaXNSZXNvbHZlZFR5cGVJbmZlcnJlZEZyb21FeHBlY3RlZFR5cGUoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNsYXNzSW5zdGFuY2VDcmVhdGlvbikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQogCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbXBpbGVyIGxvb2t1cCBlbnZpcm9ubWVudCB1c2VkIGJ5IHRoaXMgYmluZGluZyByZXNvbHZlci4KIAkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEKaW5kZXggY2E0YTg1OS4uMmMxM2U4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CbG9jay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmxvY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwyNSArMjEsMjYgQEAKICAqIEJsb2NrOgogICogICAgPGI+ezwvYj4geyBTdGF0ZW1lbnQgfSA8Yj59PC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEJsb2NrIGV4dGVuZHMgU3RhdGVtZW50IHsKLQkKKwogCS8qKgotCSAqIFRoZSAic3RhdGVtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInN0YXRlbWVudHMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIFN0YXRlbWVudH0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBTVEFURU1FTlRTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgU1RBVEVNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQmxvY2suY2xhc3MsICJzdGF0ZW1lbnRzIiwgU3RhdGVtZW50LmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEJsb2NrLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01MCwyMiArNTEsMjIgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPlN0YXRlbWVudDwvY29kZT4pLiAKKwkgKiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzIChlbGVtZW50IHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBzdGF0ZW1lbnRzID0gCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN0YXRlbWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChTVEFURU1FTlRTX1BST1BFUlRZKTsKIAogCS8qKgpAQCAtNzQsNyArNzUsNyBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUJsb2NrKEFTVCBhc3QpIHsKQEAgLTg3LDcgKzg4LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTEsNyArMTEyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUJsb2NrIHJlc3VsdCA9IG5ldyBCbG9jayh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zdGF0ZW1lbnRzKCkuYWRkQWxsKAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBzdGF0ZW1lbnRzKCkpKTsKQEAgLTEzNiwyOCArMTM3LDI4IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiB0aGlzIGJsb2NrLiBBZGRpbmcgYW5kCiAJICogcmVtb3Zpbmcgbm9kZXMgZnJvbSB0aGlzIGxpc3QgYWZmZWN0cyB0aGlzIG5vZGUgZHluYW1pY2FsbHkuCiAJICogQWxsIG5vZGVzIGluIHRoaXMgbGlzdCBtdXN0IGJlIDxjb2RlPlN0YXRlbWVudDwvY29kZT5zOwogCSAqIGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIHdpbGwgdHJpZ2dlciBhbgogCSAqIGV4Y2VwdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIHRoaXMgYmxvY2sKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0ZW1lbnQ8L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgU3RhdGVtZW50fSkKKwkgKi8KIAlwdWJsaWMgTGlzdCBzdGF0ZW1lbnRzKCkgewogCQlyZXR1cm4gdGhpcy5zdGF0ZW1lbnRzOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrQ29tbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CbG9ja0NvbW1lbnQuamF2YQppbmRleCA5NGI5NDEyLi43MjUzNGM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrQ29tbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmxvY2tDb21tZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjksMTggKzI5LDE5IEBACiAgKiB3YXMgZm91bmQgaW4gYSBzb3VyY2Ugc3RyaW5nLiBJdCBpcyBub3QgdXNlZnVsIGZvciBjcmVhdGluZwogICogY29tbWVudHMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJsb2NrQ29tbWVudCBleHRlbmRzIENvbW1lbnQgewotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEJsb2NrQ29tbWVudC5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNTAsMjQgKzUxLDI0IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGJsb2NrIGNvbW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUJsb2NrQ29tbWVudChBU1QgYXN0KSB7CkBAIC04MCw3ICs4MSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtOTMsNyArOTQsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQmxvY2tDb21tZW50IHJlc3VsdCA9IG5ldyBCbG9ja0NvbW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMTEyLDE0ICsxMTMsMTQgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JvZHlEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDQ2ZDZhZDUuLjJkM2YzMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Cb2R5RGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSw3ICsxNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IGJvZHkgZGVjbGFyYXRpb25zIAorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IGJvZHkgZGVjbGFyYXRpb25zCiAgKiB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGJvZHkgb2Ygc29tZSBraW5kIG9mIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbiwKICAqIGluY2x1ZGluZyBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb25zLCBlbnVtZXJhdGlvbiBkZWNsYXJhdGlvbnMsIGFuZAogICogZW51bWVyYXRpb24gY29uc3RhbnQgZGVjbGFyYXRpb25zLgpAQCAtNTEsMTEgKzUxLDExIEBACiAgKiBkb2MgY29tbWVudDsgSW5pdGlhbGl6ZXIgaXMgdGhlIG9ubHkgb25lcyB0aGF0IGRvZXMgbm90LiBUaGUgc291cmNlIHJhbmdlCiAgKiBmb3IgYm9keSBkZWNsYXJhdGlvbnMgYWx3YXlzIGluY2x1ZGVzIHRoZSBkb2MgY29tbWVudCBpZiBwcmVzZW50LgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm9keURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7Ci0JCisKIAkvKioKIAkgKiBUaGUgZG9jIGNvbW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCiAJICogRGVmYXVsdHMgdG8gbm9uZS4KQEAgLTY4LDM2ICs2OCwzNiBAQAogCSAqIEBzaW5jZSAzLjAgLSBmaWVsZCB3YXMgbW92ZWQgdXAgZnJvbSBzdWJjbGFzc2VzCiAJICovCiAJcHJpdmF0ZSBpbnQgbW9kaWZpZXJGbGFncyA9IE1vZGlmaWVyLk5PTkU7Ci0JCisKIAkvKioKLQkgKiBUaGUgZXh0ZW5kZWQgbW9kaWZpZXJzIChlbGVtZW50IHR5cGU6IDxjb2RlPklFeHRlbmRlZE1vZGlmaWVyPC9jb2RlPikuIAorCSAqIFRoZSBleHRlbmRlZCBtb2RpZmllcnMgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkuCiAJICogTnVsbCBpbiBKTFMyLiBBZGRlZCBpbiBKTFMzOyBkZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0CiAJICogKHNlZSBjb25zdHJ1Y3RvcikuCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJQVNUTm9kZS5Ob2RlTGlzdCBtb2RpZmllcnMgPSBudWxsOwotCQorCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAibW9kaWZpZXJzIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZSBhcyB1c2VkIGluIEpMUzIuCi0JICogCisJICogb2YgdGhpcyBub2RlIGFzIHVzZWQgaW4gSkxTMiAodHlwZToge0BsaW5rIEludGVnZXJ9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlhYnN0cmFjdCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgaW50ZXJuYWxNb2RpZmllcnNQcm9wZXJ0eSgpOwogCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAibW9kaWZpZXJzIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZSBhcyB1c2VkIGluIEpMUzMuCi0JICogCisJICogb2YgdGhpcyBub2RlIGFzIHVzZWQgaW4gSkxTMyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlhYnN0cmFjdCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgaW50ZXJuYWxNb2RpZmllcnMyUHJvcGVydHkoKTsKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgIm1vZGlmaWVycyIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUgYXMgdXNlZCBpbiBKTFMzLgotCSAqIAorCSAqIG9mIHRoaXMgbm9kZSBhcyB1c2VkIGluIEpMUzMgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTA4LDE2ICsxMDgsMTYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgImphdmFkb2MiIHByb3BlcnR5Ci0JICogb2YgdGhpcyBub2RlLgotCSAqIAorCSAqIG9mIHRoaXMgbm9kZSAoY2hpbGQgdHlwZToge0BsaW5rIEphdmFkb2N9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlhYnN0cmFjdCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBpbnRlcm5hbEphdmFkb2NQcm9wZXJ0eSgpOwogCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAiamF2YWRvYyIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUuCi0JICogCisJICogb2YgdGhpcyBub2RlIChjaGlsZCB0eXBlOiB7QGxpbmsgSmF2YWRvY30pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTEyNyw0MSArMTI3LDQxIEBACiAKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUKLQkgKiAiamF2YWRvYyIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiAiamF2YWRvYyIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEphdmFkb2N9KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKi8KIAlzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgaW50ZXJuYWxKYXZhZG9jUHJvcGVydHlGYWN0b3J5KENsYXNzIG5vZGVDbGFzcykgewogCQlyZXR1cm4gbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKG5vZGVDbGFzcywgImphdmFkb2MiLCBKYXZhZG9jLmNsYXNzLCBPUFRJT05BTCwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUKLQkgKiAibW9kaWZpZXJzIiBwcm9wZXJ0eSBkZWNsYXJlZCBvbiB0aGUgZ2l2ZW4gY29uY3JldGUgbm9kZSB0eXBlLgotCSAqIAorCSAqICJtb2RpZmllcnMiIHByb3BlcnR5IGRlY2xhcmVkIG9uIHRoZSBnaXZlbiBjb25jcmV0ZSBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBJbnRlZ2VyfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICovCiAJc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBpbnRlcm5hbE1vZGlmaWVyc1Byb3BlcnR5RmFjdG9yeShDbGFzcyBub2RlQ2xhc3MpIHsKIAkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZUNsYXNzLCAibW9kaWZpZXJzIiwgaW50LmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlCi0JICogIm1vZGlmaWVycyIgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIGdpdmVuIGNvbmNyZXRlIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiAibW9kaWZpZXJzIiBwcm9wZXJ0eSBkZWNsYXJlZCBvbiB0aGUgZ2l2ZW4gY29uY3JldGUgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqLwogCXN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgaW50ZXJuYWxNb2RpZmllcnMyUHJvcGVydHlGYWN0b3J5KENsYXNzIG5vZGVDbGFzcykgewogCQlyZXR1cm4gbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihub2RlQ2xhc3MsICJtb2RpZmllcnMiLCBJRXh0ZW5kZWRNb2RpZmllci5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIGJvZHkgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGUgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBib2R5IGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhlCiAJICogZ2l2ZW4gQVNULgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUJvZHlEZWNsYXJhdGlvbihBU1QgYXN0KSB7CkBAIC0xNzAsMTAgKzE3MCwxMCBAQAogCQkJdGhpcy5tb2RpZmllcnMgPSBuZXcgQVNUTm9kZS5Ob2RlTGlzdChpbnRlcm5hbE1vZGlmaWVyczJQcm9wZXJ0eSgpKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGRvYyBjb21tZW50IG5vZGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkb2MgY29tbWVudCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCiAJcHVibGljIEphdmFkb2MgZ2V0SmF2YWRvYygpIHsKQEAgLTE4Miw3ICsxODIsNyBAQAogCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGRvYyBjb21tZW50IG5vZGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZG9jQ29tbWVudCB0aGUgZG9jIGNvbW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkb2MgY29tbWVudCBzdHJpbmcgaXMgaW52YWxpZAogCSAqLwpAQCAtMjAwLDEwICsyMDAsMTAgQEAKIAkgKiBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQKIAkgKiBjb21wdXRlcyB0aGVzZSBmbGFncyBmcm9tIDxjb2RlPm1vZGlmaWVycygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCiAJICogQHNlZSBNb2RpZmllcgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBjaGVja2luZyBnZXRBU1QoKS5BUElfTEVWRUwKIAkJaWYgKHRoaXMubW9kaWZpZXJzID09IG51bGwpIHsKQEAgLTIyNiwxOCArMjI2LDE4IEBACiAKIAkvKioKIAkgKiBTZXRzIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbiAoSkxTMiBBUEkgb25seSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBnaXZlbiBtb2RpZmllcnMgKGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMpCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYW4gQVNUIGxhdGVyIHRoYW4gSkxTMgogCSAqIEBzZWUgTW9kaWZpZXIKLQkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5IAorCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKIAkgKiB7QGxpbmsgI21vZGlmaWVycygpfSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgYSA8Y29kZT5Nb2RpZmllcjwvY29kZT4gbm9kZXMuCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CiAJCWludGVybmFsU2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CiAJfQotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgc3lub255bSBmb3IgZGVwcmVjYXRlZCBtZXRob2QuIFVzZWQgdG8gYXZvaWQKIAkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KQEAgLTI1NywxMyArMjU3LDEzIEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucwogCSAqIG9mIHRoaXMgZGVjbGFyYXRpb24gKGFkZGVkIGluIEpMUzMgQVBJKS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIGFubm90YXRpb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUV4dGVuZGVkTW9kaWZpZXI8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgbW9kaWZpZXJzKCkgewogCQkvLyBtb3JlIGVmZmljaWVudCB0aGFuIGp1c3QgY2FsbGluZyB1bnN1cHBvcnRlZEluMigpIHRvIGNoZWNrCiAJCWlmICh0aGlzLm1vZGlmaWVycyA9PSBudWxsKSB7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5tb2RpZmllcnM7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEKaW5kZXggYWNhYmI0Yi4uYzM2MDI5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Cb29sZWFuTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9vbGVhbkxpdGVyYWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwzMSArMTYsMzIgQEAKIAogLyoqCiAgKiBCb29sZWFuIGxpdGVyYWwgbm9kZS4KLSAqIAorICoKICAqIDxwcmU+CiAgKiBCb29sZWFuTGl0ZXJhbDoKICAqIAkJPGI+dHJ1ZTwvYj4KICAqIAkJPGI+ZmFsc2U8L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQm9vbGVhbkxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiYm9vbGVhblZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYm9vbGVhblZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgQm9vbGVhbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBCT09MRUFOX1ZBTFVFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgQk9PTEVBTl9WQUxVRV9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoQm9vbGVhbkxpdGVyYWwuY2xhc3MsICJib29sZWFuVmFsdWUiLCBib29sZWFuLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQm9vbGVhbkxpdGVyYWwuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTUxLDE4ICs1MiwxOCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGJvb2xlYW47IGRlZmF1bHRzIHRvIHRoZSBsaXRlcmFsIGZvciA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICovCkBAIC03Myw3ICs3NCw3IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJQm9vbGVhbkxpdGVyYWwoQVNUIGFzdCkgewpAQCAtODYsNyArODcsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwMiw3ICsxMDMsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBuZXdWYWx1ZSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTUsNyArMTE2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUJvb2xlYW5MaXRlcmFsIHJlc3VsdCA9IG5ldyBCb29sZWFuTGl0ZXJhbCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRCb29sZWFuVmFsdWUoYm9vbGVhblZhbHVlKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTEzNSwyNSArMTM2LDI1IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gbGl0ZXJhbCBub2RlLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhlIGJvb2xlYW4gbGl0ZXJhbCBzcGVsbGVkCi0JICogICAgPGNvZGU+InRydWUiPC9jb2RlPiwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgdGhlIGJvb2xlYW4gbGl0ZXJhbCAKKwkgKiAgICA8Y29kZT4idHJ1ZSI8L2NvZGU+LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciB0aGUgYm9vbGVhbiBsaXRlcmFsCiAJICogICAgc3BlbGxlZCA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy52YWx1ZTsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gbGl0ZXJhbCBub2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IGZvciB0aGUgYm9vbGVhbiBsaXRlcmFsIHNwZWxsZWQKLQkgKiAgICA8Y29kZT4idHJ1ZSI8L2NvZGU+LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciB0aGUgYm9vbGVhbiBsaXRlcmFsIAorCSAqICAgIDxjb2RlPiJ0cnVlIjwvY29kZT4sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIHRoZSBib29sZWFuIGxpdGVyYWwKIAkgKiAgICBzcGVsbGVkIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2YWx1ZSkgewogCQlwcmVWYWx1ZUNoYW5nZShCT09MRUFOX1ZBTFVFX1BST1BFUlRZKTsKIAkJdGhpcy52YWx1ZSA9IHZhbHVlOwpAQCAtMTY2LDcgKzE2Nyw3IEBACiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CcmVha1N0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CcmVha1N0YXRlbWVudC5qYXZhCmluZGV4IGZmMGJjYTMuLjFiMGUyZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQnJlYWtTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JyZWFrU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjUgKzIxLDI2IEBACiAgKiBCcmVha1N0YXRlbWVudDoKICAqICAgIDxiPmJyZWFrPC9iPiBbIElkZW50aWZpZXIgXSA8Yj47PC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkJCQorCiAJLyoqCi0JICogVGhlICJsYWJlbCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImxhYmVsIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIExBQkVMX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBMQUJFTF9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihCcmVha1N0YXRlbWVudC5jbGFzcywgImxhYmVsIiwgU2ltcGxlTmFtZS5jbGFzcywgT1BUSU9OQUwsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQnJlYWtTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTUwLDMwICs1MSwzMCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOyBub25lIGJ5IGRlZmF1bHQuCiAJICovCiAJcHJpdmF0ZSBTaW1wbGVOYW1lIG9wdGlvbmFsTGFiZWwgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGJyZWFrIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgYnJlYWsgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgYnJlYWsgc3RhdGVtZW50IGhhcyBubyBsYWJlbC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlCcmVha1N0YXRlbWVudChBU1QgYXN0KSB7CkBAIC04Niw3ICs4Nyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTAyLDcgKzEwMyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTUsNyArMTE2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUJyZWFrU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBCcmVha1N0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRMYWJlbCgoU2ltcGxlTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldExhYmVsKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTEzOSw0MiArMTQwLDQyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsYWJlbCBvZiB0aGlzIGJyZWFrIHN0YXRlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiB0aGVyZSBpcyBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TGFiZWwoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsTGFiZWw7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGxhYmVsIG9mIHRoaXMgYnJlYWsgc3RhdGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqCisJICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRMYWJlbChTaW1wbGVOYW1lIGxhYmVsKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsTGFiZWw7CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbGFiZWwsIExBQkVMX1BST1BFUlRZKTsKIAkJdGhpcy5vcHRpb25hbExhYmVsID0gbGFiZWw7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGxhYmVsLCBMQUJFTF9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2FzdEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2FzdEV4cHJlc3Npb24uamF2YQppbmRleCBjNzc0ODBiLi5hMTFlMGUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Nhc3RFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXN0RXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDM0ICsxOSwzNSBAQAogICoKICAqIDxwcmU+CiAgKiBDYXN0RXhwcmVzc2lvbjoKLSAqICAgIDxiPig8L2I+IFR5cGUgPGI+KTwvYj4gRXhwcmVzc2lvbiAKKyAqICAgIDxiPig8L2I+IFR5cGUgPGI+KTwvYj4gRXhwcmVzc2lvbgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAkvKioKLQkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ2FzdEV4cHJlc3Npb24uY2xhc3MsICJ0eXBlIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKENhc3RFeHByZXNzaW9uLmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChDYXN0RXhwcmVzc2lvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNTgsMTcgKzU5LDE3IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCB0eXBlLgpAQCAtODIsMTIgKzgzLDEyIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBjYXN0IGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgY2FzdCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHR5cGUgYW5kIGV4cHJlc3Npb24gYXJlIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUNhc3RFeHByZXNzaW9uKEFTVCBhc3QpIHsKQEAgLTEwMCw3ICsxMDEsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEzNyw3ICsxMzgsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQ2FzdEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IENhc3RFeHByZXNzaW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGUoKFR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTE2MywxMiArMTY0LDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIGluIHRoaXMgY2FzdCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdHlwZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogCQlpZiAodGhpcy50eXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xODUsMTQgKzE4NiwxNCBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgdHlwZSBpbiB0aGlzIGNhc3QgZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjAyLDEyICsyMDMsMTIgQEAKIAkJdGhpcy50eXBlID0gdHlwZTsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgdHlwZSwgVFlQRV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGNhc3QgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMjEsMTAgKzIyMiwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBjYXN0IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbmV3IGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIzMiw3ICsyMzMsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjUwLDEyICsyNTEsMTIgQEAKIAkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy5leHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLnR5cGUgPT0gbnVsbCA/IDAgOiBnZXRUeXBlKCkudHJlZVNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NhdGNoQ2xhdXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NhdGNoQ2xhdXNlLmphdmEKaW5kZXggZjM5NzJkMi4uYzVlY2I0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXRjaENsYXVzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2F0Y2hDbGF1c2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwzMiArMjEsMzQgQEAKICAqIENhdGNoQ2xhdXNlOgogICogICAgPGI+Y2F0Y2g8L2I+IDxiPig8L2I+IEZvcm1hbFBhcmFtZXRlciA8Yj4pPC9iPiBCbG9jawogICogPC9wcmU+Ci0gKiAKKyAqCisgKiA8cD5UaGUgRm9ybWFsUGFyYW1ldGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259LjwvcD4KICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQ2F0Y2hDbGF1c2UgZXh0ZW5kcyBBU1ROb2RlIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiZXhjZXB0aW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhjZXB0aW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYQ0VQVElPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhDRVBUSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKENhdGNoQ2xhdXNlLmNsYXNzLCAiZXhjZXB0aW9uIiwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJib2R5IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEJsb2NrfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihDYXRjaENsYXVzZS5jbGFzcywgImJvZHkiLCBCbG9jay5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KENhdGNoQ2xhdXNlLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01OCwxOCArNjAsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBib2R5OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrLgogCSAqLwpAQCAtODIsMTMgKzg0LDEzIEBACiAJcHJpdmF0ZSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvbkRlY2wgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBjYXRjaCBjbGF1c2Ugb3duZWQgYnkgdGhlIGdpdmVuIAotCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGNhdGNoIGNsYXVzZSBkZWNsYXJlcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIGNhdGNoIGNsYXVzZSBvd25lZCBieSB0aGUgZ2l2ZW4KKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBjYXRjaCBjbGF1c2UgZGVjbGFyZXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleGNlcHRpb24gZGVjbGFyYXRpb24gYW5kIGhhcyBhbiBlbXB0eSBibG9jay4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDYXRjaENsYXVzZShBU1QgYXN0KSB7CkBAIC0xMDEsNyArMTAzLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMjUsNyArMTI3LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEzOCw3ICsxNDAsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJQ2F0Y2hDbGF1c2UgcmVzdWx0ID0gbmV3IENhdGNoQ2xhdXNlKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEJvZHkoKEJsb2NrKSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRFeGNlcHRpb24oCiAJCQkoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4Y2VwdGlvbigpKSk7CkBAIC0xNjUsMTIgKzE2NywxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY2F0Y2ggY2xhdXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0RXhjZXB0aW9uKCkgewogCQlpZiAodGhpcy5leGNlcHRpb25EZWNsID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xODQsMTAgKzE4NiwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4Y2VwdGlvbkRlY2w7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY2F0Y2ggY2xhdXNlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0xOTUsNyArMTk3LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvbikgewogCQlpZiAoZXhjZXB0aW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIwNSwxMiArMjA3LDEyIEBACiAJCXRoaXMuZXhjZXB0aW9uRGVjbD0gZXhjZXB0aW9uOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb24sIEVYQ0VQVElPTl9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGNhdGNoIGNsYXVzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNhdGNoIGNsYXVzZSBib2R5Ci0JICovIAorCSAqLwogCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgewogCQlpZiAodGhpcy5ib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMjQsMTAgKzIyNiwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmJvZHk7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIGNhdGNoIGNsYXVzZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBib2R5IHRoZSBjYXRjaCBjbGF1c2UgYmxvY2sgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIzNSw3ICsyMzcsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0Qm9keShCbG9jayBib2R5KSB7CiAJCWlmIChib2R5ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI1MywxMiArMjU1LDEyIEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMuZXhjZXB0aW9uRGVjbCA9PSBudWxsID8gMCA6IGdldEV4Y2VwdGlvbigpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLmJvZHkgPT0gbnVsbCA/IDAgOiBnZXRCb2R5KCkudHJlZVNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoYXJhY3RlckxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCmluZGV4IGJjYTFjN2UuLmE5MzJhNzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDI1ICsyMSwyNiBAQAogCiAvKioKICAqIENoYXJhY3RlciBsaXRlcmFsIG5vZGVzLgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAkvKioKLQkgKiBUaGUgImVzY2FwZWRWYWx1ZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImVzY2FwZWRWYWx1ZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIFN0cmluZ30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBFU0NBUEVEX1ZBTFVFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgRVNDQVBFRF9WQUxVRV9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgImVzY2FwZWRWYWx1ZSIsIFN0cmluZy5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KENoYXJhY3RlckxpdGVyYWwuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTUwLDIwICs1MSwyMCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCi0JICogVGhlIGxpdGVyYWwgc3RyaW5nLCBpbmNsdWRpbmcgcXVvdGVzIGFuZCBlc2NhcGVzOyBkZWZhdWx0cyB0byB0aGUgCisJICogVGhlIGxpdGVyYWwgc3RyaW5nLCBpbmNsdWRpbmcgcXVvdGVzIGFuZCBlc2NhcGVzOyBkZWZhdWx0cyB0byB0aGUKIAkgKiBsaXRlcmFsIGZvciB0aGUgY2hhcmFjdGVyICdYJy4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBlc2NhcGVkVmFsdWUgPSAiXCdYXCciOy8vJE5PTi1OTFMtMSQKQEAgLTc0LDcgKzc1LDcgQEAKIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDaGFyYWN0ZXJMaXRlcmFsKEFTVCBhc3QpIHsKQEAgLTg3LDcgKzg4LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMDMsNyArMTA0LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRPYmplY3RQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCB2YWx1ZSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTYsNyArMTE3LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUNoYXJhY3RlckxpdGVyYWwgcmVzdWx0ID0gbmV3IENoYXJhY3RlckxpdGVyYWwodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0RXNjYXBlZFZhbHVlKGdldEVzY2FwZWRWYWx1ZSgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xMzYsMTkgKzEzNywxOSBAQAogCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGlzIGxpdGVyYWwgbm9kZS4gVGhlIHZhbHVlIGlzIHRoZSBzZXF1ZW5jZQogCSAqIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBhcHBlYXIgaW4gdGhlIHNvdXJjZSBwcm9ncmFtLCBpbmNsdWRpbmcKIAkgKiBlbmNsb3Npbmcgc2luZ2xlIHF1b3RlcyBhbmQgZW1iZWRkZWQgZXNjYXBlcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGVzY2FwZWQgc3RyaW5nIHZhbHVlLCBpbmNsdWRpbmcgZW5jbG9zaW5nIHNpbmdsZSBxdW90ZXMKIAkgKiAgICBhbmQgZW1iZWRkZWQgZXNjYXBlcwotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpIHsKIAkJcmV0dXJuIHRoaXMuZXNjYXBlZFZhbHVlOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuIFRoZSB2YWx1ZSBpcyB0aGUgc2VxdWVuY2UKIAkgKiBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBzb3VyY2UgcHJvZ3JhbSwgaW5jbHVkaW5nCkBAIC0xNTcsMTEgKzE1OCwxMSBAQAogCSAqIDxsaT48Y29kZT4nYSc8L2NvZGU+IDxjb2RlPnNldEVzY2FwZWRWYWx1ZSgiXCdhXCciKTwvY29kZT48L2xpPgogCSAqIDxsaT48Y29kZT4nXG4nPC9jb2RlPiA8Y29kZT5zZXRFc2NhcGVkVmFsdWUoIlwnXFxuXCciKTwvY29kZT48L2xpPgogCSAqIDwvdWw+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB2YWx1ZSwgaW5jbHVkaW5nIGVuY2xvc2luZyBzaW5nbGUgcXVvdGVzCiAJICogICAgYW5kIGVtYmVkZGVkIGVzY2FwZXMKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKIAkJLy8gY2hlY2sgc2V0SW50ZXJuYWxFc2NhcGVkVmFsdWUoU3RyaW5nKSBpZiB0aGlzIG1ldGhvZCBpcyBjaGFuZ2VkCiAJCWlmICh2YWx1ZSA9PSBudWxsKSB7CkBAIC0xOTgsNyArMTk5LDcgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGxpdGVyYWwgbm9kZS4gCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuCiAJICogPHA+CiAJICogRm9yIGV4YW1wbGUsCiAJICogPHByZT4KQEAgLTIwNywxNCArMjA4LDE0IEBACiAJICogYXNzZXJ0IHMuY2hhclZhbHVlKCkgPT0gJ3gnOwogCSAqIDwvcHJlPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciB2YWx1ZSB3aXRob3V0IGVuY2xvc2luZyBxdW90ZXMgYW5kIGVtYmVkZGVkCiAJICogICAgZXNjYXBlcwogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsaXRlcmFsIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQKLQkgKi8gCisJICovCiAJcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewogCQlTY2FubmVyIHNjYW5uZXIgPSB0aGlzLmFzdC5zY2FubmVyOwotCQljaGFyW10gc291cmNlID0gZXNjYXBlZFZhbHVlLnRvQ2hhckFycmF5KCk7CisJCWNoYXJbXSBzb3VyY2UgPSB0aGlzLmVzY2FwZWRWYWx1ZS50b0NoYXJBcnJheSgpOwogCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOwogCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CiAJCWludCBmaXJzdENoYXIgPSBzY2FubmVyLmdldE5leHRDaGFyKCk7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCiAJCX0KIAkJY2hhciB2YWx1ZSA9IChjaGFyKSBzZWNvbmRDaGFyOwotCQljaGFyIG5leHRDaGFyID0gKGNoYXIpIHNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJaW50IG5leHRDaGFyID0gc2Nhbm5lci5nZXROZXh0Q2hhcigpOwogCQlpZiAoc2Vjb25kQ2hhciA9PSAnXFwnKSB7CiAJCQlpZiAobmV4dENoYXIgPT0gLTEpIHsKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJApAQCAtMjU2LDI5ICsyNTcsMjkgQEAKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdCA6IC8vb2N0YWwgKHdlbGwtZm9ybWVkOiBlbmRlZCBieSBhICcgKQogCQkJCQl0cnkgewotCQkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNEaWdpdChuZXh0Q2hhcikpIHsKLQkJCQkJCQlpbnQgbnVtYmVyID0gU2Nhbm5lckhlbHBlci5nZXROdW1lcmljVmFsdWUobmV4dENoYXIpOwotCQkJCQkJCW5leHRDaGFyID0gKGNoYXIpIHNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCWlmIChTY2FubmVySGVscGVyLmlzRGlnaXQoKGNoYXIpIG5leHRDaGFyKSkgeworCQkJCQkJCWludCBudW1iZXIgPSBTY2FubmVySGVscGVyLmdldE51bWVyaWNWYWx1ZSgoY2hhcikgbmV4dENoYXIpOworCQkJCQkJCW5leHRDaGFyID0gc2Nhbm5lci5nZXROZXh0Q2hhcigpOwogCQkJCQkJCWlmIChuZXh0Q2hhciA9PSAtMSkgewogCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCQlpZiAobmV4dENoYXIgIT0gJ1wnJykgewotCQkJCQkJCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdChuZXh0Q2hhcikpIHsKKwkJCQkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQoKGNoYXIpIG5leHRDaGFyKSkgewogCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJfQotCQkJCQkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBTY2FubmVySGVscGVyLmdldE51bWVyaWNWYWx1ZShuZXh0Q2hhcik7Ci0JCQkJCQkJCW5leHRDaGFyID0gKGNoYXIpIHNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCQkJbnVtYmVyID0gKG51bWJlciAqIDgpICsgU2Nhbm5lckhlbHBlci5nZXROdW1lcmljVmFsdWUoKGNoYXIpIG5leHRDaGFyKTsKKwkJCQkJCQkJbmV4dENoYXIgPSBzY2FubmVyLmdldE5leHRDaGFyKCk7CiAJCQkJCQkJCWlmIChuZXh0Q2hhciA9PSAtMSkgewogCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJfQogCQkJCQkJCQlpZiAobmV4dENoYXIgIT0gJ1wnJykgewotCQkJCQkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQobmV4dENoYXIpKSB7CisJCQkJCQkJCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCgoY2hhcikgbmV4dENoYXIpKSB7CiAJCQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJCX0KLQkJCQkJCQkJCW51bWJlciA9IChudW1iZXIgKiA4KSArIFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKG5leHRDaGFyKTsKKwkJCQkJCQkJCW51bWJlciA9IChudW1iZXIgKiA4KSArIFNjYW5uZXJIZWxwZXIuZ2V0TnVtZXJpY1ZhbHVlKChjaGFyKSBuZXh0Q2hhcik7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIChjaGFyKSBudW1iZXI7CQkJCisJCQkJCQkJcmV0dXJuIChjaGFyKSBudW1iZXI7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCiAJCQkJCQl9CkBAIC0yODYsNyArMjg3LDcgQEAKIAkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCX0KLQkJCW5leHRDaGFyID0gKGNoYXIpIHNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCW5leHRDaGFyID0gc2Nhbm5lci5nZXROZXh0Q2hhcigpOwogCQkJaWYgKG5leHRDaGFyID09IC0xKSB7CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKIAkJCX0KQEAgLTI5NywyMiArMjk4LDIyIEBACiAJCXJldHVybiB2YWx1ZTsKIAl9CiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBjaGFyYWN0ZXIgbGl0ZXJhbCBub2RlIHRvIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIAorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgY2hhcmFjdGVyIGxpdGVyYWwgbm9kZSB0byB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlLAogCSAqIDxwcmU+CiAJICogQ2hhcmFjdGVyTGl0ZXJhbCBzOwogCSAqIHMuc2V0Q2hhclZhbHVlKCd4Jyk7CiAJICogYXNzZXJ0IHMuY2hhclZhbHVlKCkgPT0gJ3gnOwotCSAqIGFzc2VydCBzLmdldEVzY2FwZWRWYWx1ZSgiXCd4XCciKTsKKwkgKiBhc3NlcnQgcy5nZXRFc2NhcGVkVmFsdWUoKS5lcXVhbHMoIlwneFwnIik7CiAJICogPC9wcmU+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHZhbHVlIHRoZSBjaGFyYWN0ZXIgdmFsdWUKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRDaGFyVmFsdWUoY2hhciB2YWx1ZSkgewogCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMyk7Ci0JCQorCiAJCWIuYXBwZW5kKCdcJycpOyAvLyBvcGVuaW5nIGRlbGltaXRlcgogCQlzd2l0Y2godmFsdWUpIHsKIAkJCWNhc2UgJ1xiJyA6CkBAIC0zNjIsMjIgKzM2MywyMiBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSAnXDcnIDoKIAkJCQliLmFwcGVuZCgiXFw3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsJCQkKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJYi5hcHBlbmQodmFsdWUpOwogCQl9CiAJCWIuYXBwZW5kKCdcJycpOyAvLyBjbG9zaW5nIGRlbGltaXRlcgogCQlzZXRFc2NhcGVkVmFsdWUoYi50b1N0cmluZygpKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKLQkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0ICsgc3RyaW5nU2l6ZShlc2NhcGVkVmFsdWUpOworCQlpbnQgc2l6ZSA9IEJBU0VfTk9ERV9TSVpFICsgMSAqIDQgKyBzdHJpbmdTaXplKHRoaXMuZXNjYXBlZFZhbHVlKTsKIAkJcmV0dXJuIHNpemU7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQppbmRleCAwNGViOTg4Li5kNjI0ZWZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTIgKzE0LDEzIEBACiAgKiBEZXNjcmlwdG9yIGZvciBhIGNoaWxkIGxpc3QgcHJvcGVydHkgb2YgYW4gQVNUIG5vZGUuCiAgKiBBIGNoaWxkIGxpc3QgcHJvcGVydHkgaXMgb25lIHdob3NlIHZhbHVlIGlzIGEgbGlzdCBvZgogICoge0BsaW5rIEFTVE5vZGV9LgotICogCisgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNnZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcikKICAqIEBzaW5jZSAzLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JCisKIAkvKioKIAkgKiBFbGVtZW50IHR5cGUuIEZvciBleGFtcGxlLCBmb3IgYSBub2RlIHR5cGUgbGlrZQogCSAqIENvbXBpbGF0aW9uVW5pdCwgdGhlICJpbXBvcnRzIiBwcm9wZXJ0eSBpcyBJbXBvcnREZWNsYXJhdGlvbi5jbGFzcy4KQEAgLTI5LDcgKzMwLDcgQEAKIAkgKiA8L3A+CiAJICovCiAJZmluYWwgQ2xhc3MgZWxlbWVudFR5cGU7Ci0JCisKIAkvKioKIAkgKiBJbmRpY2F0ZXMgd2hldGhlciBhIGN5Y2xlIGlzIHBvc3NpYmxlLgogCSAqIDxwPgpAQCAtMzcsMTQgKzM4LDE0IEBACiAJICogYWNjZXNzIGZyb20gQVNUTm9kZS4KIAkgKiA8L3A+CiAJICovCi0JZmluYWwgYm9vbGVhbiBjeWNsZVJpc2s7CQotCQorCWZpbmFsIGJvb2xlYW4gY3ljbGVSaXNrOworCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgaWQuCiAJICogTm90ZSB0aGF0IHRoaXMgY29uc3RydWN0b3IgaXMgZGVjbGFyZWQgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQKIAkgKiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IHRoZSBBU1QKIAkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlQ2xhc3MgY29uY3JldGUgQVNUIG5vZGUgdHlwZSB0aGF0IG93bnMgdGhpcyBwcm9wZXJ0eQogCSAqIEBwYXJhbSBwcm9wZXJ0eUlkIHRoZSBwcm9wZXJ0eSBpZAogCSAqIEBwYXJhbSBlbGVtZW50VHlwZSB0aGUgZWxlbWVudCB0eXBlIG9mIHRoaXMgcHJvcGVydHkKQEAgLTU5LDIwICs2MCwyMCBAQAogCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CiAJCXRoaXMuY3ljbGVSaXNrID0gY3ljbGVSaXNrOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIGxpc3QgcHJvcGVydHkuCiAJICogPHA+CiAJICogRm9yIGV4YW1wbGUsIGZvciBhIG5vZGUgdHlwZSBsaWtlIENvbXBpbGF0aW9uVW5pdCwKIAkgKiB0aGUgImltcG9ydHMiIHByb3BlcnR5IHJldHVybnMgPGNvZGU+SW1wb3J0RGVjbGFyYXRpb24uY2xhc3M8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcHJvcGVydHkKIAkgKi8KIAlwdWJsaWMgZmluYWwgQ2xhc3MgZ2V0RWxlbWVudFR5cGUoKSB7CiAJCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHZ1bG5lcmFibGUgdG8gY3ljbGVzLgogCSAqIDxwPgpAQCAtODEsMTMgKzgyLDEzIEBACiAJICogYXBwZWFyIGluIHRoZSBBU1Qgc3VidHJlZSBiZWxvdyB0aGlzIHByb3BlcnR5LiBGb3IgZXhhbXBsZSwKIAkgKiB0aGUgYm9keSBwcm9wZXJ0eSBvZiBhCiAJICoge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBub2RlCi0JICogYWRtaXRzIGEgYm9keSB3aGljaCBtaWdodCBpbmNsdWRlIHN0YXRlbWVudCB0aGF0IGVtYmVkcyAKKwkgKiBhZG1pdHMgYSBib2R5IHdoaWNoIG1pZ2h0IGluY2x1ZGUgc3RhdGVtZW50IHRoYXQgZW1iZWRzCiAJICogYW5vdGhlciB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IG5vZGUuCiAJICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBuYW1lIHByb3BlcnR5IG9mIGEKIAkgKiBNZXRob2REZWNsYXJhdGlvbiBub2RlIGFkbWl0cyBvbmx5IG5hbWVzLCBhbmQgdGhlcmVieSBleGNsdWRlcwogCSAqIGFub3RoZXIgTWV0aG9kRGVjbGFyYXRpb24gbm9kZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGN5Y2xlcyBhcmUgcG9zc2libGUsCiAJICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBjeWNsZXMgYXJlIGltcG9zc2libGUKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQppbmRleCAyMDc5YjJhLi44NmMyNTY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoaWxkUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGlsZFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDM4ICsxNCwzOSBAQAogICogRGVzY3JpcHRvciBmb3IgYSBjaGlsZCBwcm9wZXJ0eSBvZiBhbiBBU1Qgbm9kZS4KICAqIEEgY2hpbGQgcHJvcGVydHkgaXMgb25lIHdob3NlIHZhbHVlIGlzIGFuCiAgKiB7QGxpbmsgQVNUTm9kZX0uCi0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlI2dldFN0cnVjdHVyYWxQcm9wZXJ0eShTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yKQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNzZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciwgT2JqZWN0KQogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgewotCQorCiAJLyoqCiAJICogQ2hpbGQgdHlwZS4gRm9yIGV4YW1wbGUsIGZvciBhIG5vZGUgdHlwZSBsaWtlCiAJICogQ29tcGlsYXRpb25Vbml0LCB0aGUgInBhY2thZ2UiIHByb3BlcnR5IGlzIFBhY2thZ2VEZWNsYXJhdGlvbi5jbGFzcwogCSAqLwogCXByaXZhdGUgZmluYWwgQ2xhc3MgY2hpbGRDbGFzczsKLQkKKwogCS8qKgogCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGlsZCBpcyBtYW5kYXRvcnkuIEEgY2hpbGQgcHJvcGVydHkgaXMgYWxsb3dlZAogCSAqIHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+IG9ubHkgaWYgaXQgaXMgbm90IG1hbmRhdG9yeS4KIAkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWFuZGF0b3J5OwkKLQkKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWFuZGF0b3J5OworCiAJLyoqCiAJICogSW5kaWNhdGVzIHdoZXRoZXIgYSBjeWNsZSBpcyBwb3NzaWJsZS4KIAkgKiBGaWVsZCBpcyBwcml2YXRlLCBidXQgbWFya2VkIHBhY2thZ2UtdmlzaWJsZSBmb3IgZmFzdAogCSAqIGFjY2VzcyBmcm9tIEFTVE5vZGUuCiAJICovCi0JZmluYWwgYm9vbGVhbiBjeWNsZVJpc2s7CQotCQorCWZpbmFsIGJvb2xlYW4gY3ljbGVSaXNrOworCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IGlkLgogCSAqIE5vdGUgdGhhdCB0aGlzIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIHBhY2thZ2UtcHJpdmF0ZSBzbyB0aGF0CiAJICogcHJvcGVydHkgZGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSB0aGUgQVNUCiAJICogaW1wbGVtZW50YXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZUNsYXNzIGNvbmNyZXRlIEFTVCBub2RlIHR5cGUgdGhhdCBvd25zIHRoaXMgcHJvcGVydHkKIAkgKiBAcGFyYW0gcHJvcGVydHlJZCB0aGUgcHJvcGVydHkgaWQKIAkgKiBAcGFyYW0gY2hpbGRUeXBlIHRoZSBjaGlsZCB0eXBlIG9mIHRoaXMgcHJvcGVydHkKQEAgLTYzLDMxICs2NCwzMSBAQAogCQl0aGlzLm1hbmRhdG9yeSA9IG1hbmRhdG9yeTsKIAkJdGhpcy5jeWNsZVJpc2sgPSBjeWNsZVJpc2s7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY2hpbGQgdHlwZSBvZiB0aGlzIHByb3BlcnR5LgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlLCBmb3IgYSBub2RlIHR5cGUgbGlrZSBDb21waWxhdGlvblVuaXQsCiAJICogdGhlICJwYWNrYWdlIiBwcm9wZXJ0eSByZXR1cm5zIDxjb2RlPlBhY2thZ2VEZWNsYXJhdGlvbi5jbGFzczwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2hpbGQgdHlwZSBvZiB0aGUgcHJvcGVydHkKIAkgKi8KIAlwdWJsaWMgZmluYWwgQ2xhc3MgZ2V0Q2hpbGRUeXBlKCkgewogCQlyZXR1cm4gdGhpcy5jaGlsZENsYXNzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIG1hbmRhdG9yeS4gQSBwcm9wZXJ0eSB2YWx1ZQogCSAqIGlzIG5vdCBhbGxvd2VkIHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG1hbmRhdG9yeS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIG1hbmRhdG9yeSwKIAkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWFuZGF0b3J5KCkgewogCQlyZXR1cm4gdGhpcy5tYW5kYXRvcnk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgdnVsbmVyYWJsZSB0byBjeWNsZXMuCiAJICogPHA+CkBAIC05NiwxMyArOTcsMTMgQEAKIAkgKiBhcHBlYXIgaW4gdGhlIEFTVCBzdWJ0cmVlIGJlbG93IHRoaXMgcHJvcGVydHkuIEZvciBleGFtcGxlLAogCSAqIHRoZSBib2R5IHByb3BlcnR5IG9mIGEKIAkgKiB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IG5vZGUKLQkgKiBhZG1pdHMgYSBib2R5IHdoaWNoIG1pZ2h0IGluY2x1ZGUgc3RhdGVtZW50IHRoYXQgZW1iZWRzIAorCSAqIGFkbWl0cyBhIGJvZHkgd2hpY2ggbWlnaHQgaW5jbHVkZSBzdGF0ZW1lbnQgdGhhdCBlbWJlZHMKIAkgKiBhbm90aGVyIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gbm9kZS4KIAkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIG5hbWUgcHJvcGVydHkgb2YgYQogCSAqIE1ldGhvZERlY2xhcmF0aW9uIG5vZGUgYWRtaXRzIG9ubHkgbmFtZXMsIGFuZCB0aGVyZWJ5IGV4Y2x1ZGVzCiAJICogYW5vdGhlciBNZXRob2REZWNsYXJhdGlvbiBub2RlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY3ljbGVzIGFyZSBwb3NzaWJsZSwKIAkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGN5Y2xlcyBhcmUgaW1wb3NzaWJsZQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEKaW5kZXggN2RjZjlkMS4uMjk3ODliZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM0LDcgKzM0LDcgQEAKICAqICAgICAgICAgICAgWyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIF0KICAqIDwvcHJlPgogICogPHA+Ci0gKiBOb3QgYWxsIG5vZGUgYXJyYWdlbWVudHMgd2lsbCByZXByZXNlbnQgbGVnYWwgSmF2YSBjb25zdHJ1Y3RzLiBJbiBwYXJ0aWN1bGFyLAorICogTm90IGFsbCBub2RlIGFycmFuZ2VtZW50cyB3aWxsIHJlcHJlc2VudCBsZWdhbCBKYXZhIGNvbnN0cnVjdHMuIEluIHBhcnRpY3VsYXIsCiAgKiBpdCBpcyBub25zZW5zZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZSB0eXBlIG9yIGFuIGFycmF5IHR5cGUgKHByaW1pdGl2ZQogICogdHlwZXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGFycmF5IGNyZWF0aW9ucyBtdXN0IGJlIHJlcHJlc2VudGVkIHdpdGgKICAqIDxjb2RlPkFycmF5Q3JlYXRpb248L2NvZGU+IG5vZGVzKS4gVGhlIG5vcm1hbCB1c2UgaXMgd2hlbiB0aGUgdHlwZSBpcyBhCkBAIC01Niw2OSArNTYsNzAgQEAKICAqIChOb3RlIGFsc28gdGhhdCB0aGUgZmlyc3QgZm9ybSBiZWNhbWUgcG9zc2libGUgYXMgb2YgSkxTMzsgb25seSB0aGUgc2Vjb25kCiAgKiBmb3JtIGV4aXN0ZWQgaW4gSkxTMi4pCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogCiAJLyoqCi0JICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX0FSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAidHlwZUFyZ3VtZW50cyIsIFR5cGUuY2xhc3MsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE9QVElPTkFMLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAibmFtZSIsIE5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFR5cGV9KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiYXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAiYXJndW1lbnRzIiwgRXhwcmVzc2lvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAiYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImFub255bW91c0NsYXNzRGVjbGFyYXRpb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAiYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIsIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsIE9QVElPTkFMLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMDsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtMTI3LDcgKzEyOCw3IEBACiAJCWFkZFByb3BlcnR5KEFSR1VNRU5UU19QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fUFJPUEVSVFksIHByb3BlcnlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg2KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShFWFBSRVNTSU9OX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC0xNDEsMTEgKzE0MiwxMSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTE1NiwxNCArMTU3LDE0IEBACiAJCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwogCQl9CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgb3B0aW9uYWwgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCiAJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pLiAKKwkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCkBAIC0xNzUsMzcgKzE3NiwzNyBAQAogCSAqIGxlZ2FsIHR5cGUgbmFtZS4gTm90IHVzZWQgaW4gSkxTMy4KIAkgKi8KIAlwcml2YXRlIE5hbWUgdHlwZU5hbWUgPSBudWxsOwotCQorCiAJLyoqCiAJICogVGhlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCB0eXBlLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIFR5cGUgdHlwZSA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChBUkdVTUVOVFNfUFJPUEVSVFkpOwotCQkKKwogCS8qKgotCSAqIFRoZSBvcHRpb25hbCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyAKKwkgKiBUaGUgb3B0aW9uYWwgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uOyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsKIAkgKiBkZWZhdWx0cyB0byBub25lLgogCSAqLwogCXByaXZhdGUgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBvcHRpb25hbEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPSBudWxsOwotCQorCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIG93bmVkIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBvd25lZAogCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIHF1YWxpZnlpbmcgZXhwcmVzc2lvbiwKIAkgKiBhbiBlbXB0eSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycywgYW4gdW5zcGVjaWZpZWQgdHlwZSwgYW4gZW1wdHkKICAgICAgKiBsaXN0IG9mIGFyZ3VtZW50cywgYW5kIGRvZXMgbm90IGRlY2xhcmUgYW4gYW5vbnltb3VzIGNsYXNzLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDbGFzc0luc3RhbmNlQ3JlYXRpb24gKEFTVCBhc3QpIHsKQEAgLTIyMiw3ICsyMjMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgpAQCAtMjYzLDcgKzI2NCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNzcsNyArMjc4LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yOTAsNyArMjkxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiByZXN1bHQgPSBuZXcgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oCiAJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4cHJlc3Npb24oKSkpOwogCQlpZiAodGhpcy5hc3QuYXBpTGV2ZWwgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKQEAgLTMwMiw3ICszMDMsNyBAQAogCQl9CiAJCXJlc3VsdC5hcmd1bWVudHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBhcmd1bWVudHMoKSkpOwogCQlyZXN1bHQuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigKLQkJCShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKSAKKwkJCShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQogCQkJICAgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTMzNSwyMSArMzM2LDIxIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiwgb3IgCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24sIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbEV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMzU3LDcgKzM1OCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQkvLyBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24KIAkJLy8gbXVzdCBjaGVjayBjeWNsZXMKQEAgLTM3MCwxMyArMzcxLDEzIEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMgb2YgdGhpcyBjbGFzcwogCSAqIGluc3RhbmNlIGNyZWF0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgdHlwZUFyZ3VtZW50cygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzID09IG51bGwpIHsKQEAgLTM4NCwxOCArMzg1LDE4IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMudHlwZUFyZ3VtZW50czsKIAl9Ci0JCisKICAgICAvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGluc3RhbnRpYXRlZCBpbiB0aGlzIGNsYXNzIGluc3RhbmNlIAorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgaW5zdGFudGlhdGVkIGluIHRoaXMgY2xhc3MgaW5zdGFuY2UKIAkgKiBjcmVhdGlvbiBleHByZXNzaW9uIChKTFMyIEFQSSBvbmx5KS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSBub2RlCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYW4gQVNUIGxhdGVyIHRoYW4gSkxTMgogCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKIAkgKiB7QGxpbmsgI2dldFR5cGUoKX0sIHdoaWNoIHJldHVybnMgYSA8Y29kZT5UeXBlPC9jb2RlPiBpbnN0ZWFkIG9mIGEKIAkgKiA8Y29kZT5OYW1lPC9jb2RlPi4KLQkgKi8gCisJICovCiAJcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKIAkJcmV0dXJuIGludGVybmFsR2V0TmFtZSgpOwogCX0KQEAgLTQxNywxMyArNDE4LDEzIEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXJldHVybiB0eXBlTmFtZTsKKwkJcmV0dXJuIHRoaXMudHlwZU5hbWU7CiAJfQotCQorCiAJLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBpbnN0YW50aWF0ZWQgaW4gdGhpcyBjbGFzcyBpbnN0YW5jZSAKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGluc3RhbnRpYXRlZCBpbiB0aGlzIGNsYXNzIGluc3RhbmNlCiAJICogY3JlYXRpb24gZXhwcmVzc2lvbiAoSkxTMiBBUEkgb25seSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IHR5cGUgbmFtZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTQzMiwxMCArNDMzLDEwIEBACiAJICogPC91bD4KIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCi0JICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieSAKKwkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CiAJICoge0BsaW5rICNzZXRUeXBlKFR5cGUpfSwgd2hpY2ggZXhwZWN0cyBhIDxjb2RlPlR5cGU8L2NvZGU+IGluc3RlYWQgb2YKIAkgKiBhIDxjb2RlPk5hbWU8L2NvZGU+LgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKE5hbWUgbmFtZSkgewogCQlpbnRlcm5hbFNldE5hbWUobmFtZSk7CiAJfQpAQCAtNDU5LDEyICs0NjAsMTIgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIGluc3RhbnRpYXRlZCBpbiB0aGlzIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uCiAJICogZXhwcmVzc2lvbiAoYWRkZWQgaW4gSkxTMyBBUEkpLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdHlwZSBub2RlCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkgICAgdW5zdXBwb3J0ZWRJbjIoKTsKIAkJaWYgKHRoaXMudHlwZSA9PSBudWxsKSB7CkBAIC00NzksMTEgKzQ4MCwxMSBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgdHlwZSBpbnN0YW50aWF0ZWQgaW4gdGhpcyBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbgogCSAqIGV4cHJlc3Npb24gKGFkZGVkIGluIEpMUzMgQVBJKS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTQ5Myw3ICs0OTQsNyBAQAogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CiAJICAgIHVuc3VwcG9ydGVkSW4yKCk7CiAJCWlmICh0eXBlID09IG51bGwpIHsKQEAgLTUwOCwzMSArNTA5LDMxIEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgaW4gdGhpcyBjbGFzcwogCSAqIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKHBvc3NpYmx5IGVtcHR5KQotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pCisJICovCiAJcHVibGljIExpc3QgYXJndW1lbnRzKCkgewogCQlyZXR1cm4gdGhpcy5hcmd1bWVudHM7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIGludHJvZHVjZWQgYnkgdGhpcwogCSAqIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24sIGlmIGl0IGhhcyBvbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgd2hldGhlciB0aGlzIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gZGVjbGFyZXMKIAkgKiBhbiBhbm9ueW1vdXMgY2xhc3MgKHRoYXQgaXMsIGhhcyBjbGFzcyBib2R5IGRlY2xhcmF0aW9ucykuCi0JICogCi0JICogQHBhcmFtIGRlY2wgdGhlIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCisJICoKKwkgKiBAcGFyYW0gZGVjbCB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqICAgIGlmIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGRlY2wpIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGRlY2wsIEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9QUk9QRVJUWSk7CkBAIC01NDgsMTQgKzU0OSwyOCBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RydWN0b3IgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcKIAkgKiAgICBjYW5ub3QgYmUgcmVzb2x2ZWQKLQkgKi8JCisJICovCiAJcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlQ29uc3RydWN0b3IodGhpcyk7CiAJfQogCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVzb2x2ZWQgY2xhc3MgdHlwZSBoYXMgYmVlbiBpbmZlcnJlZAorCSAqIGZyb20gdGhlIGFzc2lnbm1lbnQgY29udGV4dCAoSkxTNCAxNS4xMi4yLjgpLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqIDxwPgorCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBiaW5kaW5ncyBhcmUgcmVxdWVzdGVkIHdoZW4gdGhlIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc29sdmVkIGNsYXNzIHR5cGUgaGFzIGJlZW4gaW5mZXJyZWQKKwkgKiAJZnJvbSB0aGUgYXNzaWdubWVudCBjb250ZXh0IChKTFMzIDE1LjEyLjIuOCksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkVHlwZUluZmVycmVkRnJvbUV4cGVjdGVkVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLmlzUmVzb2x2ZWRUeXBlSW5mZXJyZWRGcm9tRXhwZWN0ZWRUeXBlKHRoaXMpOworCX0KKwkKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTU2Myw3ICs1NzgsNyBAQAogCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNiAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC01NzEsNyArNTg2LDcgQEAKIAkJLy8gbi5iLiB0eXBlID09IG51bGwgZm9yIGFzdC5BUElfTEVWRUwgPT0gSkxTMgogCQkvLyBuLmIuIHR5cGVBcmd1bWVudHMgPT0gbnVsbCBmb3IgYXN0LkFQSV9MRVZFTCA9PSBKTFMyCiAJCS8vIG4uYi4gdHlwZU5hbWUgPT0gbnVsbCBmb3IgYXN0LkFQSV9MRVZFTCA+PSBKTFMzCi0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMudHlwZU5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKIAkJCSsgKHRoaXMudHlwZSA9PSBudWxsID8gMCA6IGdldFR5cGUoKS50cmVlU2l6ZSgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbW1lbnQuamF2YQppbmRleCA1MGQ3ZjIxLi4wMWNkNDEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw3ICsxMiw3IEBACiAKIC8qKgogICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEFTVCBub2RlcyB0aGF0IHJlcHJlc2VudCBjb21tZW50cy4KLSAqIFRoZXJlIGFyZSBleGFjdGx5IHRocmVlIGtpbmRzIG9mIGNvbW1lbnQ6IAorICogVGhlcmUgYXJlIGV4YWN0bHkgdGhyZWUga2luZHMgb2YgY29tbWVudDoKICAqIGxpbmUgY29tbWVudHMgKHtAbGluayBMaW5lQ29tbWVudH0pLAogICogYmxvY2sgY29tbWVudHMgKHtAbGluayBCbG9ja0NvbW1lbnR9KSwgYW5kCiAgKiBkb2MgY29tbWVudHMgKHtAbGluayBKYXZhZG9jfSkuCkBAIC0yNCwxMSArMjQsMTEgQEAKICAqICAgICBKYXZhZG9jCiAgKiA8L3ByZT4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBBU1ROb2RlIHsKLQkKKwogCS8qKgogCSAqIEFsdGVybmF0ZSByb290IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCiAJICogSW5pdGlhbGx5IDxjb2RlPm51bGw8L2NvZGU+LgpAQCAtNDAsNDYgKzQwLDQ2IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJQ29tbWVudChBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29tbWVudCBpcyBhIGJsb2NrIGNvbW1lbnQKIAkgKiAoPGNvZGU+QmxvY2tDb21tZW50PC9jb2RlPikuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgYmxvY2sgY29tbWVudCwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgYmxvY2sgY29tbWVudCwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmxvY2tDb21tZW50KCkgewogCQlyZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBCbG9ja0NvbW1lbnQpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbW1lbnQgaXMgYSBsaW5lIGNvbW1lbnQKIAkgKiAoPGNvZGU+TGluZUNvbW1lbnQ8L2NvZGU+KS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBsaW5lIGNvbW1lbnQsIGFuZCAKKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGxpbmUgY29tbWVudCwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTGluZUNvbW1lbnQoKSB7CiAJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIExpbmVDb21tZW50KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21tZW50IGlzIGEgZG9jIGNvbW1lbnQKIAkgKiAoPGNvZGU+SmF2YWRvYzwvY29kZT4pLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGRvYyBjb21tZW50LCBhbmQgCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBkb2MgY29tbWVudCwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRG9jQ29tbWVudCgpIHsKIAkJcmV0dXJuICh0aGlzIGluc3RhbmNlb2YgSmF2YWRvYyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcm9vdCBBU1Qgbm9kZSB0aGF0IHRoaXMgY29tbWVudCBvY2N1cnMKIAkgKiB3aXRoaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgKG9yIG5vdCByZWNvcmRlZCkuCkBAIC04NywyOSArODcsMjkgQEAKIAkgKiBUeXBpY2FsbHksIHRoZSBjb21tZW50IG5vZGVzIGNyZWF0ZWQgd2hpbGUgcGFyc2luZyBhIGNvbXBpbGF0aW9uCiAJICogdW5pdCBhcmUgbm90IGNvbnNpZGVyZWQgZGVzY2VuZGVudHMgb2YgdGhlIG5vcm1hbCBBU1QKIAkgKiByb290LCBuYW1lbHkgYW4ge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0uIEluc3RlYWQsIHRoZXNlCi0JICogY29tbWVudCBub2RlcyBleGlzdCBvdXRzaWRlIHRoZSBub3JtYWwgQVNUIGFuZCBlYWNoIGlzIAorCSAqIGNvbW1lbnQgbm9kZXMgZXhpc3Qgb3V0c2lkZSB0aGUgbm9ybWFsIEFTVCBhbmQgZWFjaCBpcwogCSAqIGEgcm9vdCBpbiBpdHMgb3duIHJpZ2h0LiBUaGlzIG9wdGlvbmFsIHByb3BlcnR5IHByb3ZpZGVzCiAJICogYSB3ZWxsLWtub3duIHdheSB0byBuYXZpZ2F0ZSBmcm9tIHRoZSBjb21tZW50IHRvIHRoZQogCSAqIGNvbXBpbGF0aW9uIHVuaXQgaW4gc3VjaCBjYXNlcy4gTm90ZSB0aGF0IHRoZSBhbHRlcm5hdGUgcm9vdAogCSAqIHByb3BlcnR5IGlzIG5vdCBvbmUgb2YgdGhlIGNvbW1lbnQgbm9kZSdzIGNoaWxkcmVuLiBJdCBpcyBzaW1wbHkgYQogCSAqIHJlZmVyZW5jZSB0byBhIG5vZGUuCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFsdGVybmF0ZSByb290IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorCSAqCisJICogQHJldHVybiB0aGUgYWx0ZXJuYXRlIHJvb3Qgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBub25lCiAJICogQHNlZSAjc2V0QWx0ZXJuYXRlUm9vdChBU1ROb2RlKQogCSAqLwogCXB1YmxpYyBmaW5hbCBBU1ROb2RlIGdldEFsdGVybmF0ZVJvb3QoKSB7CiAJCXJldHVybiB0aGlzLmFsdGVybmF0ZVJvb3Q7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcm9vdCBBU1Qgbm9kZSB0aGF0IHRoaXMgY29tbWVudCBvY2N1cnMKIAkgKiB3aXRoaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgKG9yIG5vdCByZWNvcmRlZCkuCiAJICogPHA+CiAJICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByb290IHRoZSBhbHRlcm5hdGUgcm9vdCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiAKKwkgKgorCSAqIEBwYXJhbSByb290IHRoZSBhbHRlcm5hdGUgcm9vdCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIG5vbmUKIAkgKiBAc2VlICNnZXRBbHRlcm5hdGVSb290KCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCmluZGV4IGZlZjQwMTguLjM3NjUxMzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00Niw4ICs0Niw5IEBACiAgKiAgICAgICAgeyBJbXBvcnREZWNsYXJhdGlvbiB9CiAgKiAgICAgICAgeyBUeXBlRGVjbGFyYXRpb24gfCBFbnVtRGVjbGFyYXRpb24gfCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHwgPGI+OzwvYj4gfQogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEFTVE5vZGUgewogCkBAIC01NSwzMCArNTYsMzAgQEAKIAkgKiBDYW5vbmljYWwgZW1wdHkgbGlzdCBvZiBtZXNzYWdlcy4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlW10gRU1QVFlfTUVTU0FHRVMgPSBuZXcgTWVzc2FnZVswXTsKLQkKKwogCS8qKgogCSAqIENhbm9uaWNhbCBlbXB0eSBsaXN0IG9mIHByb2JsZW1zLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9ibGVtW10gRU1QVFlfUFJPQkxFTVMgPSBuZXcgSVByb2JsZW1bMF07Ci0JCisKIAkvKioKLQkgKiBUaGUgImltcG9ydHMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCi0JICogCisJICogVGhlICJpbXBvcnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBJbXBvcnREZWNsYXJhdGlvbn0pLgorCSAqCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIElNUE9SVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKENvbXBpbGF0aW9uVW5pdC5jbGFzcywgImltcG9ydHMiLCBJbXBvcnREZWNsYXJhdGlvbi5jbGFzcywgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAicGFja2FnZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiBUaGUgInBhY2thZ2UiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBQYWNrYWdlRGVjbGFyYXRpb259KS4KKwkgKgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFBBQ0tBR0VfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFBBQ0tBR0VfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ29tcGlsYXRpb25Vbml0LmNsYXNzLCAicGFja2FnZSIsIFBhY2thZ2VEZWNsYXJhdGlvbi5jbGFzcywgT1BUSU9OQUwsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMApAQCAtODYsMTMgKzg3LDEzIEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAogCS8qKgotCSAqIFRoZSAidHlwZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCi0JICogCisJICogVGhlICJ0eXBlcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb259KS4KKwkgKgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUWVBFU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQ29tcGlsYXRpb25Vbml0LmNsYXNzLCAidHlwZXMiLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkJCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChDb21waWxhdGlvblVuaXQuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTEwMSw0NyArMTAyLDQ3IEBACiAJCWFkZFByb3BlcnR5KFRZUEVTX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ5TGlzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQorCiAJLyoqCi0JICogVGhlIGNvbW1lbnQgbWFwcGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOyAKKwkgKiBUaGUgY29tbWVudCBtYXBwZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmU7CiAJICogaW5pdGlhbGx5IDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIERlZmF1bHRDb21tZW50TWFwcGVyIGNvbW1lbnRNYXBwZXIgPSBudWxsOwotCQorCiAJLyoqCi0JICogVGhlIEphdmEgdHlwZSByb290IChhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBvciBhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlPC9jb2RlPikgCisJICogVGhlIEphdmEgdHlwZSByb290IChhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBvciBhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlPC9jb2RlPikKIAkgKiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGNyZWF0ZWQgZnJvbSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgd2FzIG5vdCBjcmVhdGVkIGZyb20gYSBKYXZhIHR5cGUgcm9vdC4KIAkgKi8KIAlwcml2YXRlIElUeXBlUm9vdCB0eXBlUm9vdCA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBpbXBvcnQgZGVjbGFyYXRpb25zIGluIHRleHR1YWwgb3JkZXIgb3JkZXI7IAorCSAqIFRoZSBsaXN0IG9mIGltcG9ydCBkZWNsYXJhdGlvbnMgaW4gdGV4dHVhbCBvcmRlciBvcmRlcjsKIAkgKiBpbml0aWFsbHkgbm9uZSAoZWxlbWVudFR5cGU6IDxjb2RlPkltcG9ydERlY2xhcmF0aW9uPC9jb2RlPikuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGltcG9ydHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChJTVBPUlRTX1BST1BFUlRZKTsKLQkKKwogCS8qKgogCSAqIExpbmUgZW5kIHRhYmxlLiBJZiA8Y29kZT5saW5lRW5kVGFibGVbaV0gPT0gcDwvY29kZT4gdGhlbiB0aGUKLQkgKiBsaW5lIG51bWJlciA8Y29kZT5pKzE8L2NvZGU+IGVuZHMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uIAorCSAqIGxpbmUgbnVtYmVyIDxjb2RlPmkrMTwvY29kZT4gZW5kcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24KIAkgKiA8Y29kZT5wPC9jb2RlPi4gRXhjZXB0IGZvciB0aGUgbGFzdCBsaW5lLCB0aGUgcG9zaXRpb25zIGFyZSB0aGF0Ci0JICogb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIGRlbGltaXRlci4gCisJICogb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIGRlbGltaXRlci4KIAkgKiBGb3IgZXhhbXBsZSwgdGhlIHNvdXJjZSBzdHJpbmcgPGNvZGU+QVxuQlxuQzwvY29kZT4gaGFzCiAJICogbGluZSBlbmQgdGFibGUgezEsIDN9IChpZiBcbiBpcyBvbmUgY2hhcmFjdGVyKS4KIAkgKi8KQEAgLTE1Myw3ICsxNTQsNyBAQAogCXByaXZhdGUgTWVzc2FnZVtdIG1lc3NhZ2VzOwogCiAJLyoqCi0JICogVGhlIGNvbW1lbnQgbGlzdCAoZWxlbWVudCB0eXBlOiA8Y29kZT5Db21tZW50PC9jb2RlPiwgCisJICogVGhlIGNvbW1lbnQgbGlzdCAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQ29tbWVudH0sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgaW5pdGlhbGx5IDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTE2NiwzNSArMTY3LDQwIEBACiAJICogQHNpbmNlIDMuMAogCSAqLwogCUNvbW1lbnRbXSBvcHRpb25hbENvbW1lbnRUYWJsZSA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgaW5pdGlhbGx5CiAJICogPGNvZGU+bnVsbDwvY29kZT4uCiAJICovCiAJcHJpdmF0ZSBQYWNrYWdlRGVjbGFyYXRpb24gb3B0aW9uYWxQYWNrYWdlRGVjbGFyYXRpb24gPSBudWxsOwotCQorCiAJLyoqCiAJICogUHJvYmxlbXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyBwYXJzaW5nIG9yIG5hbWUgcmVzb2x1dGlvbi4KIAkgKi8KIAlwcml2YXRlIElQcm9ibGVtW10gcHJvYmxlbXMgPSBFTVBUWV9QUk9CTEVNUzsKIAkKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0ZXh0dWFsIG9yZGVyIG9yZGVyOyAKKwkgKiBJbnRlcm5hbCBkYXRhIHVzZWQgdG8gcGVyZm9ybSBzdGF0ZW1lbnRzIHJlY292ZXJ5LgorCSAqLworCXByaXZhdGUgT2JqZWN0IHN0YXRlbWVudHNSZWNvdmVyeURhdGE7CisKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0ZXh0dWFsIG9yZGVyIG9yZGVyOwogCSAqIGluaXRpYWxseSBub25lIChlbGVtZW50VHlwZTogPGNvZGU+QWJzdHJhY3RUeXBlRGVjbGFyYXRpb248L2NvZGU+KQogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB0eXBlcyA9CiAJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KFRZUEVTX1BST1BFUlRZKTsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgY29tcGlsYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBpbml0aWFsbHkgaGFzIG5vIHBhY2thZ2UgZGVjbGFyYXRpb24sIG5vCiAJICogaW1wb3J0IGRlY2xhcmF0aW9ucywgYW5kIG5vIHR5cGUgZGVjbGFyYXRpb25zLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDb21waWxhdGlvblVuaXQoQVNUIGFzdCkgewpAQCAtMjIxLDIxICsyMjcsMjEgQEAKIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUNvbXBpbGF0aW9uVW5pdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHRhcmdldCk7CiAJCS8vIG4uYiBkbyBub3QgY29weSBsaW5lIG51bWJlciB0YWJsZSBvciBtZXNzYWdlcwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRQYWNrYWdlKAogCQkJKFBhY2thZ2VEZWNsYXJhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFBhY2thZ2UoKSkpOwogCQlyZXN1bHQuaW1wb3J0cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGltcG9ydHMoKSkpOwogCQlyZXN1bHQudHlwZXMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCB0eXBlcygpKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQotCQorCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZSBjaGFyYWN0ZXIKLQkgKiBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZy4gQ29sdW1uIG51bWJlciBhcmUgemVyby1iYXNlZC4gCisJICogcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuIENvbHVtbiBudW1iZXIgYXJlIHplcm8tYmFzZWQuCiAJICogUmV0dXJuIDxjb2RlPi0xPC9jb2RlPiBpZiBpdCBpcyBiZXlvbmQgdGhlIHZhbGlkIHJhbmdlIG9yIDxjb2RlPi0yPC9jb2RlPgogCSAqIGlmIHRoZSBjb2x1bW4gbnVtYmVyIGluZm9ybWF0aW9uIGlzIHVua25vd24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gcG9zaXRpb24gYSAwLWJhc2VkIGNoYXJhY3RlciBwb3NpdGlvbiwgcG9zc2libHkKIAkgKiAgIG5lZ2F0aXZlIG9yIG91dCBvZiByYW5nZQogCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIKQEAgLTI2OSw5ICsyNzUsOSBAQAogCQkJcmV0dXJuIHBvc2l0aW9uIC0gb2Zmc2V0Rm9yTGluZTsKIAkJfQogCX0KLQkKKwogCS8qKgotCSAqIEZpbmRzIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGZyb20gCisJICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgQVNUIG5vZGUgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZnJvbQogCSAqIHdoaWNoIHRoZSBnaXZlbiBiaW5kaW5nIG9yaWdpbmF0ZWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCiAJICogYmluZGluZyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBub2RlIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KIAkgKiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBiaW5kaW5ncyB3ZXJlIG5vdCByZXF1ZXN0ZWQKQEAgLTI4NSwxMSArMjkxLDExIEBACiAJICogICAgPGNvZGU+QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjwvY29kZT4gKGZvciBhbm9ueW1vdXMgY2xhc3Nlcyk8L2xpPgogCSAqIDxsaT5wcmltaXRpdmUgdHlwZSAtIG5vbmU8L2xpPgogCSAqIDxsaT5hcnJheSB0eXBlIC0gbm9uZTwvbGk+Ci0JICogPGxpPmZpZWxkIC0gYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEgCisJICogPGxpPmZpZWxkIC0gYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEKIAkgKiAgICA8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgogCSAqIDxsaT5sb2NhbCB2YXJpYWJsZSAtIGEgPGNvZGU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvY29kZT4sIG9yCi0JICogICAgYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEgCi0JICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4gb3IgCisJICogICAgYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEKKwkgKiAgICA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPiBvcgogCSAqICAgIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uPC9jb2RlPjwvbGk+CiAJICogPGxpPm1ldGhvZCAtIGEgPGNvZGU+TWV0aG9kRGVjbGFyYXRpb248L2NvZGU+IDwvbGk+CiAJICogPGxpPmNvbnN0cnVjdG9yIC0gYSA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4gPC9saT4KQEAgLTMwMCw3ICszMDYsNyBAQAogICAgICAqIDxsaT50eXBlIHZhcmlhYmxlIC0gYSA8Y29kZT5UeXBlUGFyYW1ldGVyPC9jb2RlPjwvbGk+CiAgICAgICogPGxpPmNhcHR1cmUgYmluZGluZyAtIG5vbmU8L2xpPgogICAgICAqIDxsaT5hbm5vdGF0aW9uIGJpbmRpbmcgLSBhbiA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPjwvbGk+Ci0gICAgICogPGxpPm1lbWJlciB2YWx1ZSBwYWlyIGJpbmRpbmcgLSBhbiA8Y29kZT5NZW1iZXJWYWx1ZVBhaXI8L2NvZGU+LCAKKyAgICAgKiA8bGk+bWVtYmVyIHZhbHVlIHBhaXIgYmluZGluZyAtIGFuIDxjb2RlPk1lbWJlclZhbHVlUGFpcjwvY29kZT4sCiAgICAgICogICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCByZXByZXNlbnRzIGEgZGVmYXVsdCB2YWx1ZSBvciBhIHNpbmdsZSBtZW1iZXIgdmFsdWU8L2xpPgogCSAqIDwvdWw+CiAgICAgICogRm9yIHBhcmFtZXRlcml6ZWQgb3IgcmF3IHR5cGUgYmluZGluZ3MsIHRoZSBkZWNsYXJpbmcgbm9kZSBpcwpAQCAtMzE1LDcgKzMyMSw3IEBACiAJICogVXNlIDxjb2RlPmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcuZ2V0S2V5KCkpPC9jb2RlPiB3aGVuIHRoZSBiaW5kaW5nIGNvbWVzCiAJICogZnJvbSBhIGRpZmZlcmVudCBBU1QuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGJpbmRpbmcgdGhlIGJpbmRpbmcKIAkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgd2hlcmUgdGhlIGdpdmVuIGJpbmRpbmcgaXMgZGVjbGFyZWQsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIG5vZGUgaW4gdGhpcwpAQCAtMzI1LDkgKzMzMSw5IEBACiAJcHVibGljIEFTVE5vZGUgZmluZERlY2xhcmluZ05vZGUoSUJpbmRpbmcgYmluZGluZykgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZmluZERlY2xhcmluZ05vZGUoYmluZGluZyk7CiAJfQotCQorCiAJLyoqCi0JICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgQVNUIG5vZGUgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSAKKwkgKiBGaW5kcyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBmcm9tCiAJICogd2hpY2ggdGhlIGJpbmRpbmcgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yaWdpbmF0ZWQuIFJldHVybnMKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29ycmVzcG9uZGluZyBub2RlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgogCSAqIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIGJpbmRpbmdzIHdlcmUgbm90IHJlcXVlc3RlZApAQCAtMzQyLDExICszNDgsMTEgQEAKIAkgKiAgICA8Y29kZT5Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uPC9jb2RlPiAoZm9yIGFub255bW91cyBjbGFzc2VzKTwvbGk+CiAJICogPGxpPnByaW1pdGl2ZSB0eXBlIC0gbm9uZTwvbGk+CiAJICogPGxpPmFycmF5IHR5cGUgLSBub25lPC9saT4KLQkgKiA8bGk+ZmllbGQgLSBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYSAKKwkgKiA8bGk+ZmllbGQgLSBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYQogCSAqICAgIDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+IDwvbGk+CiAJICogPGxpPmxvY2FsIHZhcmlhYmxlIC0gYSA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPiwgb3IKLQkgKiAgICBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYSAKLQkgKiAgICA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPiBvciAKKwkgKiAgICBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYQorCSAqICAgIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ8L2NvZGU+IG9yCiAJICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb248L2NvZGU+PC9saT4KIAkgKiA8bGk+bWV0aG9kIC0gYSA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4gPC9saT4KIAkgKiA8bGk+Y29uc3RydWN0b3IgLSBhIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgpAQCAtMzYyLDcgKzM2OCw3IEBACiAgICAgICogbWV0aG9kIGJpbmRpbmdzLCB0aGUgZGVjbGFyaW5nIG5vZGUgaXMgdGhhdCBvZiB0aGUgY29ycmVzcG9uZGluZwogICAgICAqIGdlbmVyaWMgbWV0aG9kLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBrZXkgdGhlIGJpbmRpbmcga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB3aGVyZSBhIGJpbmRpbmcgd2l0aCB0aGUgZ2l2ZW4KIAkgKiBrZXkgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgaXMgPGNvZGU+bnVsbDwvY29kZT4KQEAgLTM3NCwxNCArMzgwLDE0IEBACiAJcHVibGljIEFTVE5vZGUgZmluZERlY2xhcmluZ05vZGUoU3RyaW5nIGtleSkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZmluZERlY2xhcmluZ05vZGUoa2V5KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY29tbWVudHMgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZwogCSAqIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KIAkgKiA8cD4KIAkgKiBTaW5jZSB0aGUgSmF2YSBsYW5ndWFnZSBhbGxvd3MgY29tbWVudHMgdG8gYXBwZWFyIG1vc3QgYW55d2hlcmUKIAkgKiBpbiB0aGUgc291cmNlIHRleHQsIGl0IGlzIHByb2JsZW1hdGljIHRvIGxvY2F0ZSBjb21tZW50cyBpbiByZWxhdGlvbgotCSAqIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gQVNULiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBkb2MgY29tbWVudHMgCisJICogdG8gdGhlIHN0cnVjdHVyZSBvZiBhbiBBU1QuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIGRvYyBjb21tZW50cwogCSAqIHdoaWNoLCBieSBjb252ZW50aW9uLCBpbW1lZGlhdGVseSBwcmVjZWRlIHR5cGUsIGZpZWxkLCBhbmQKIAkgKiBtZXRob2QgZGVjbGFyYXRpb25zOyB0aGVzZSBjb21tZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgQVNUCiAJICogYnkge0BsaW5rICBCb2R5RGVjbGFyYXRpb24jZ2V0SmF2YWRvYyBCb2R5RGVjbGFyYXRpb24uZ2V0SmF2YWRvY30uCkBAIC0zODksNyArMzk1LDcgQEAKIAkgKiBpcyBwcm92aWRlZCBmb3IgY2xpZW50cyB0aGF0IG5lZWQgdG8gZmluZCB0aGUgc291cmNlIHJhbmdlcyBvZgogCSAqIGFsbCBjb21tZW50cyBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZy4gSXQgaW5jbHVkZXMgZW50cmllcwogCSAqIGZvciBjb21tZW50cyBvZiBhbGwga2luZHMgKGxpbmUsIGJsb2NrLCBhbmQgZG9jKSwgYXJyYW5nZWQgaW4gb3JkZXIKLQkgKiBvZiBpbmNyZWFzaW5nIHNvdXJjZSBwb3NpdGlvbi4gCisJICogb2YgaW5jcmVhc2luZyBzb3VyY2UgcG9zaXRpb24uCiAJICogPC9wPgogCSAqIDxwPgogCSAqIE5vdGUgb24gY29tbWVudCBwYXJlbnRpbmc6IFRoZSB7QGxpbmsgQVNUTm9kZSNnZXRQYXJlbnQoKSBnZXRQYXJlbnQoKX0KQEAgLTQwMSw3ICs0MDcsNyBAQAogCSAqIEhvd2V2ZXIsIGZvciBvdGhlciBjb21tZW50IG5vZGVzLCB7QGxpbmsgQVNUTm9kZSNnZXRQYXJlbnQoKSBnZXRQYXJlbnQoKX0KIAkgKiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHtAbGluayBBU1ROb2RlI2dldFJvb3QoKSBnZXRSb290KCl9CiAJICogd2lsbCByZXR1cm4gdGhlIGNvbW1lbnQgbm9kZSBpdHNlbGYsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBjb21tZW50IG5vZGVzCi0JICogYXJlIG5vdCBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIEFTVCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIFRoZSAKKwkgKiBhcmUgbm90IGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgQVNUIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhlCiAJICoge0BsaW5rIENvbW1lbnQjZ2V0QWx0ZXJuYXRlUm9vdCBDb21tZW50LmdldEFsdGVybmF0ZVJvb3R9CiAJICogbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIG5hdmlnYXRlIGZyb20gYSBjb21tZW50IHRvIGl0cyBjb21waWxhdGlvbgogCSAqIHVuaXQuCkBAIC00MTYsOSArNDIyLDkgQEAKIAkgKiA8cD4KIAkgKiBDbGllbnRzIGNhbm5vdCBtb2RpZnkgdGhlIHJlc3VsdGluZyBsaXN0LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgY29tbWVudHMgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBzb3VyY2UKLQkgKiBzdGFydCBwb3NpdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY29tbWVudCBpbmZvcm1hdGlvbgorCSAqIHN0YXJ0IHBvc2l0aW9uIChlbGVtZW50IHR5cGU6IHtAbGluayBDb21tZW50fSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY29tbWVudCBpbmZvcm1hdGlvbgogCSAqIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGF2YWlsYWJsZQogCSAqIEBzZWUgQVNUUGFyc2VyCiAJICogQHNpbmNlIDMuMApAQCAtNDI5LDcgKzQzNSw3IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCBjb21tZW50IG1hcHBlci4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbW1lbnQgbWFwcGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTQ0Miw3ICs0NDgsNyBAQAogCSAqIHtAbGluayBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKX0gYW5kIHtAbGluayBBU1ROb2RlI2dldExlbmd0aCgpfSwKIAkgKiB0aGUgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG1heSBpbmNsdWRlIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlCiAJICogaW1tZWRpYXRlbHkgYmVmb3JlIG9yIGFmdGVyIHRoZSBub3JtYWwgc291cmNlIHJhbmdlIGZvciB0aGUgbm9kZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHJldHVybiBhIChwb3NzaWJseSAwKSBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+CiAJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG5vZGUKQEAgLTQ2Niw3ICs0NzIsNyBAQAogCSAqIHtAbGluayBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKX0gYW5kIHtAbGluayBBU1ROb2RlI2dldExlbmd0aCgpfSwKIAkgKiB0aGUgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG1heSBpbmNsdWRlIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlCiAJICogaW1tZWRpYXRlbHkgYmVmb3JlIG9yIGFmdGVyIHRoZSBub3JtYWwgc291cmNlIHJhbmdlIGZvciB0aGUgbm9kZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXgsIG9yIDxjb2RlPi0xPC9jb2RlPgogCSAqICAgIGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCBmb3IgdGhpcyBub2RlCkBAIC00ODQsMTEgKzQ5MCwxMSBAQAogCQkJcmV0dXJuIHRoaXMuY29tbWVudE1hcHBlci5nZXRFeHRlbmRlZFN0YXJ0UG9zaXRpb24obm9kZSk7CiAJCX0KIAl9Ci0JCisKIAkvKioKLQkgKiBUaGUgSmF2YSBlbGVtZW50IChhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBvciBhbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlPC9jb2RlPikgCisJICogVGhlIEphdmEgZWxlbWVudCAoYW4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gb3IgYW4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTwvY29kZT4pCiAJICogdGhpcyBjb21waWxhdGlvbiB1bml0IHdhcyBjcmVhdGVkIGZyb20sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyBub3QgY3JlYXRlZCBmcm9tIGEgSmF2YSBlbGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgSmF2YSBlbGVtZW50IHRoaXMgY29tcGlsYXRpb24gdW5pdCB3YXMgY3JlYXRlZCBmcm9tLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQHNpbmNlIDMuMQogCSAqIEBzZWUgI2dldFR5cGVSb290KCkKQEAgLTQ5NiwxMCArNTAyLDEwIEBACiAJcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKIAkJcmV0dXJuIHRoaXMudHlwZVJvb3Q7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBtZXNzYWdlcyByZXBvcnRlZCBieSB0aGUgY29tcGlsZXIgZHVyaW5nIHRoZSBwYXJzaW5nIAotCSAqIG9yIHRoZSB0eXBlIGNoZWNraW5nIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhpcyBsaXN0IG1pZ2h0IGJlIGEgc3Vic2V0IG9mIAorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgcGFyc2luZworCSAqIG9yIHRoZSB0eXBlIGNoZWNraW5nIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhpcyBsaXN0IG1pZ2h0IGJlIGEgc3Vic2V0IG9mCiAJICogZXJyb3JzIGRldGVjdGVkIGFuZCByZXBvcnRlZCBieSBhIEphdmEgY29tcGlsZXIuCiAJICogPHA+CiAJICogVGhpcyBsaXN0IG9mIG1lc3NhZ2VzIGlzIHN1aXRhYmxlIGZvciBzaW1wbGUgY2xpZW50cyB0aGF0IGRvIGxpdHRsZQpAQCAtNTIzLDcgKzUyOSw3IEBACiAJCQkJCUlQcm9ibGVtIHByb2JsZW0gPSB0aGlzLnByb2JsZW1zW2ldOwogCQkJCQlpbnQgc3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7CiAJCQkJCWludCBlbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCQkJCQltZXNzYWdlc1tpXSA9IG5ldyBNZXNzYWdlKHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJdGhpcy5tZXNzYWdlc1tpXSA9IG5ldyBNZXNzYWdlKHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUzNiwzMyArNTQyLDMzIEBACiAJZmluYWwgaW50IGdldE5vZGVUeXBlMCgpIHsKIAkJcmV0dXJuIENPTVBJTEFUSU9OX1VOSVQ7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZSBmb3IgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiAKLQkgKiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gdGhlIAorCSAqIFJldHVybnMgdGhlIG5vZGUgZm9yIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY29tcGlsYXRpb24KKwkgKiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gdGhlCiAJICogZGVmYXVsdCBwYWNrYWdlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZSgpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxQYWNrYWdlRGVjbGFyYXRpb247CiAJfQotCQorCiAJLyoqCi0JICogR2l2ZW4gYSBsaW5lIG51bWJlciBhbmQgY29sdW1uIG51bWJlciwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyAKKwkgKiBHaXZlbiBhIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gbnVtYmVyLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nCiAJICogcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuCiAJICogUmV0dXJucyAtMiBpZiBubyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRoaXMKLQkgKiBjb21waWxhdGlvbiB1bml0LiAKKwkgKiBjb21waWxhdGlvbiB1bml0LgogCSAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHNvdXJjZSBzdHJpbmcgaWYgPGNvZGU+bGluZTwvY29kZT4KIAkgKiBpcyBncmVhdGVyIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgbGluZXMgaW4gdGhlIHVuaXQuCi0JICogUmV0dXJucyAtMSBpZiA8Y29kZT5jb2x1bW48L2NvZGU+IGlzIGxlc3MgdGhhbiAwLCAgCisJICogUmV0dXJucyAtMSBpZiA8Y29kZT5jb2x1bW48L2NvZGU+IGlzIGxlc3MgdGhhbiAwLAogCSAqIG9yIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUgaWYgPGNvZGU+Y29sdW1uPC9jb2RlPgotCSAqIGlzIGJleW9uZCB0aGUgbGVnYWwgcmFuZ2UsIG9yIHRoZSBnaXZlbiBsaW5lIG51bWJlciBpcyBsZXNzIHRoYW4gb25lLiAKLQkgKiAKKwkgKiBpcyBiZXlvbmQgdGhlIGxlZ2FsIHJhbmdlLCBvciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIgaXMgbGVzcyB0aGFuIG9uZS4KKwkgKgogCSAqIEBwYXJhbSBsaW5lIHRoZSBvbmUtYmFzZWQgbGluZSBudW1iZXIKIAkgKiBAcGFyYW0gY29sdW1uIHRoZSB6ZXJvLWJhc2VkIGNvbHVtbiBudW1iZXIKLQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgc291cmNlIHN0cmluZzsgCi0JICogPGNvZGU+LTI8L2NvZGU+IGlmIGxpbmUvY29sdW1uIG51bWJlciBpbmZvcm1hdGlvbiBpcyBub3Qga25vd24gCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBzdHJpbmc7CisJICogPGNvZGU+LTI8L2NvZGU+IGlmIGxpbmUvY29sdW1uIG51bWJlciBpbmZvcm1hdGlvbiBpcyBub3Qga25vd24KIAkgKiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0IG9yIDxjb2RlPi0xPC9jb2RlPiB0aGUgaW5wdXRzIGFyZSBub3QgdmFsaWQKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC01NzYsMjAgKzU4MiwyMCBAQAogCQl9CiAJCWlmIChsaW5lID09IDEpIHsKIAkJCWZpbmFsIGludCBlbmRPZkxpbmUgPSB0aGlzLmxpbmVFbmRUYWJsZVswXTsKLQkJCXJldHVybiBjb2x1bW4gPiBlbmRPZkxpbmUgPyAtMSA6IGNvbHVtbjsJCQkKKwkJCXJldHVybiBjb2x1bW4gPiBlbmRPZkxpbmUgPyAtMSA6IGNvbHVtbjsKIAkJfSBlbHNlIGlmKCBsaW5lID4gbGVuZ3RoICsgMSApIHsKIAkJCS8vIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogCQkJcmV0dXJuIC0xOwotCQl9CQkKKwkJfQogCQkvLyAtMSB0byBmb3Igb25lLWJhc2VkIHRvIHplcm8tYmFzZWQgY29udmVyc2lvbi4KIAkJLy8gLTEsIGFnYWluLCB0byBnZXQgcHJldmlvdXMgbGluZS4KIAkJZmluYWwgaW50IHByZXZpb3VzTGluZU9mZnNldCA9IHRoaXMubGluZUVuZFRhYmxlW2xpbmUgLSAyXTsKIAkJIC8vIHByZXZpb3VzTGluZU9mZnNldCArIDEgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY3VycmVudCBsaW5lCiAJCWZpbmFsIGludCBvZmZzZXRGb3JMaW5lID0gcHJldmlvdXNMaW5lT2Zmc2V0ICsgMTsKIAkJZmluYWwgaW50IGN1cnJlbnRMaW5lRW5kID0gbGluZSA9PSBsZW5ndGggKyAxID8gZ2V0U3RhcnRQb3NpdGlvbigpICsgZ2V0TGVuZ3RoKCkgLSAxIDogdGhpcy5saW5lRW5kVGFibGVbbGluZS0xXTsKLQkJaWYgKChvZmZzZXRGb3JMaW5lICsgY29sdW1uKSA+IGN1cnJlbnRMaW5lRW5kKSB7ICAKKwkJaWYgKChvZmZzZXRGb3JMaW5lICsgY29sdW1uKSA+IGN1cnJlbnRMaW5lRW5kKSB7CiAJCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSB7ICAKKwkJfSBlbHNlIHsKIAkJCXJldHVybiBvZmZzZXRGb3JMaW5lICsgY29sdW1uOwogCQl9CiAJfQpAQCAtNjAzLDcgKzYwOSw3IEBACiAJICogU2ltcGxlIGNsaWVudHMgdGhhdCBkbyBsaXR0bGUgbW9yZSB0aGFuIGxvZyB0aGUgbWVzc2FnZXMgb3IgZGlzcGxheQogCSAqIHRoZW0gdG8gdGhlIHVzZXIgc2hvdWxkIHByb2JhYmx5IGNhbGwgPGNvZGU+Z2V0TWVzc2FnZXM8L2NvZGU+IGluc3RlYWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGlzdCBvZiBkZXRhaWxlZCBwcm9ibGVtIG9iamVjdHMsIHBvc3NpYmx5IGVtcHR5CiAJICogQHNlZSAjZ2V0TWVzc2FnZXMoKQogCSAqIEBzZWUgQVNUUGFyc2VyCkBAIC02MTIsMTEgKzYxOCwyNSBAQAogCXB1YmxpYyBJUHJvYmxlbVtdIGdldFByb2JsZW1zKCkgewogCQlyZXR1cm4gdGhpcy5wcm9ibGVtczsKIAl9CisKKwkvKioKKwkgKiBJbnRlcm5hbCBtZXRob2QKKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm4gaW50ZXJuYWwgZGF0YSB1c2VkIHRvIHBlcmZvcm0gc3RhdGVtZW50cyByZWNvdmVyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIGludGVybmFsIGRhdGEgdXNlZCB0byBwZXJmb3JtIHN0YXRlbWVudHMgcmVjb3ZlcnkuCisJICogCisJICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0U3RhdGVtZW50c1JlY292ZXJ5RGF0YSgpIHsKKwkJcmV0dXJuIHRoaXMuc3RhdGVtZW50c1JlY292ZXJ5RGF0YTsKKwl9CiAJCiAJLyoqCi0JICogVGhlIEphdmEgdHlwZSByb290IChhIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uIHVuaXR9IG9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGUgY2xhc3MgZmlsZX0pIAorCSAqIFRoZSBKYXZhIHR5cGUgcm9vdCAoYSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvbiB1bml0fSBvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlIGNsYXNzIGZpbGV9KQogCSAqIHRoaXMgY29tcGlsYXRpb24gdW5pdCB3YXMgY3JlYXRlZCBmcm9tLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMgbm90IGNyZWF0ZWQgZnJvbSBhIEphdmEgdHlwZSByb290LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgSmF2YSB0eXBlIHJvb3QgdGhpcyBjb21waWxhdGlvbiB1bml0IHdhcyBjcmVhdGVkIGZyb20sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2luY2UgMy4zCiAJICovCkBAIC02MjUsMjAgKzY0NSwyMCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBub2RlcyBmb3IgdGhlIGltcG9ydCBkZWNsYXJhdGlvbnMgb2YgdGhpcyAKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2Ygbm9kZXMgZm9yIHRoZSBpbXBvcnQgZGVjbGFyYXRpb25zIG9mIHRoaXMKIAkgKiBjb21waWxhdGlvbiB1bml0LCBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGltcG9ydCBkZWNsYXJhdGlvbiBub2RlcwotCSAqICAgIChlbGVtZW50VHlwZTogPGNvZGU+SW1wb3J0RGVjbGFyYXRpb248L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudFR5cGU6IHtAbGluayBJbXBvcnREZWNsYXJhdGlvbn0pCisJICovCiAJcHVibGljIExpc3QgaW1wb3J0cygpIHsKIAkJcmV0dXJuIHRoaXMuaW1wb3J0czsKIAl9CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSB3aG9sZSBjb21tZW50cyBsaXN0IHtAbGluayAjZ2V0Q29tbWVudExpc3QoKSB9Ci0JICogb2YgdGhlIGZpcnN0IGxlYWRpbmcgY29tbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBub2RlLiAKLQkgKiAKKwkgKiBvZiB0aGUgZmlyc3QgbGVhZGluZyBjb21tZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5vZGUuCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEByZXR1cm4gMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBsZWFkaW5nIGNvbW1lbnQgb3IgLTEgaWYgbm9kZSBoYXMgbm8gYXNzb2NpYXRlZAogCSAqIAljb21tZW50IGJlZm9yZSBpdHMgc3RhcnQgcG9zaXRpb24uCkBAIC02NTYsOCArNjc2LDggQEAKIAogCS8qKgogCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIHdob2xlIGNvbW1lbnRzIGxpc3Qge0BsaW5rICNnZXRDb21tZW50TGlzdCgpIH0KLQkgKiBvZiB0aGUgbGFzdCB0cmFpbGluZyBjb21tZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5vZGUuIAotCSAqIAorCSAqIG9mIHRoZSBsYXN0IHRyYWlsaW5nIGNvbW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbm9kZS4KKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHJldHVybiAwLWJhc2VkIGluZGV4IG9mIGxhc3QgdHJhaWxpbmcgY29tbWVudCBvciAtMSBpZiBub2RlIGhhcyBubwogCSAqIAlhc3NvY2lhdGVkIGNvbW1lbnQgYWZ0ZXIgaXRzIGVuZCBwb3NpdGlvbi4KQEAgLTY3MiwxMSArNjkyLDExIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuY29tbWVudE1hcHBlci5sYXN0VHJhaWxpbmdDb21tZW50SW5kZXgobm9kZSk7CiAJfQotCQorCiAJLyoqCiAJICogSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIGNvbW1lbnQgbWFwcGVyIHdpdGggdGhlIGdpdmVuCiAJICogc2Nhbm5lci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzY2FubmVyIHRoZSBzY2FubmVyCiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtNzIyLDEwICs3NDIsMTAgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZSBjaGFyYWN0ZXIKLQkgKiBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZy4gVGhlIGluaXRpYWwgbGluZSBvZiB0aGUgCisJICogcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuIFRoZSBpbml0aWFsIGxpbmUgb2YgdGhlCiAJICogY29tcGlsYXRpb24gdW5pdCBpcyBudW1iZXJlZCAxLCBhbmQgZWFjaCBsaW5lIGV4dGVuZHMgdGhyb3VnaCB0aGUKIAkgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZW5kLW9mLWxpbmUgZGVsaW1pdGVyLiBUaGUgdmVyeSBsYXN0IGxpbmUgZXh0ZW5kcwogCSAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBhbmQgaGFzIG5vIGxpbmUgZGVsaW1pdGVyLgpAQCAtNzM0LDcgKzc1NCw3IEBACiAJICogUmV0dXJucyAxIGZvciBhIGNoYXJhY3RlciBwb3NpdGlvbiB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55CiAJICogc291cmNlIGxpbmUsIG9yIGlmIG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcwogCSAqIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcG9zaXRpb24gYSAwLWJhc2VkIGNoYXJhY3RlciBwb3NpdGlvbiwgcG9zc2libHkKIAkgKiAgIG5lZ2F0aXZlIG9yIG91dCBvZiByYW5nZQogCSAqIEByZXR1cm4gdGhlIDEtYmFzZWQgbGluZSBudW1iZXIsIG9yIDxjb2RlPjE8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIKQEAgLTc0MywxNiArNzYzLDE2IEBACiAJICogICAgY29tcGlsYXRpb24gdW5pdAogCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRMaW5lTnVtYmVyKGludCkgaW5zdGVhZC4gQmUgY2FyZWZ1bCB0byBoYW5kbGUgdGhlIG5lZ2F0aXZlIHZhbHVlcy4KIAkgKiBAc2VlIEFTVFBhcnNlcgotCSAqIEBzZWUgI2dldExpbmVOdW1iZXIoaW50KSAKKwkgKiBAc2VlICNnZXRMaW5lTnVtYmVyKGludCkKIAkgKi8KIAlwdWJsaWMgaW50IGxpbmVOdW1iZXIoaW50IHBvc2l0aW9uKSB7CiAJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihwb3NpdGlvbik7CiAJCXJldHVybiBsaW5lTnVtYmVyIDwgMSA/IDEgOiBsaW5lTnVtYmVyOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZSBjaGFyYWN0ZXIKLQkgKiBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZy4gVGhlIGluaXRpYWwgbGluZSBvZiB0aGUgCisJICogcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuIFRoZSBpbml0aWFsIGxpbmUgb2YgdGhlCiAJICogY29tcGlsYXRpb24gdW5pdCBpcyBudW1iZXJlZCAxLCBhbmQgZWFjaCBsaW5lIGV4dGVuZHMgdGhyb3VnaCB0aGUKIAkgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZW5kLW9mLWxpbmUgZGVsaW1pdGVyLiBUaGUgdmVyeSBsYXN0IGxpbmUgZXh0ZW5kcwogCSAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBhbmQgaGFzIG5vIGxpbmUgZGVsaW1pdGVyLgpAQCAtNzYxLDcgKzc4MSw3IEBACiAJICogUmV0dXJucyAtMSBmb3IgYSBjaGFyYWN0ZXIgcG9zaXRpb24gdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueQogCSAqIHNvdXJjZSBsaW5lLCBvciAtMiBpZiBubyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRoaXMKIAkgKiBjb21waWxhdGlvbiB1bml0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBvc2l0aW9uIGEgMC1iYXNlZCBjaGFyYWN0ZXIgcG9zaXRpb24sIHBvc3NpYmx5CiAJICogICBuZWdhdGl2ZSBvciBvdXQgb2YgcmFuZ2UKIAkgKiBAcmV0dXJuIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIGNoYXJhY3RlcgpAQCAtNzgyLDcgKzgwMiw3IEBACiAJCX0KIAkJaW50IGxvdyA9IDA7CiAJCWlmIChwb3NpdGlvbiA8IDApIHsKLQkJCS8vIHBvc2l0aW9uIGlsbGVnYWwgCisJCQkvLyBwb3NpdGlvbiBpbGxlZ2FsCiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJaWYgKHBvc2l0aW9uIDw9IHRoaXMubGluZUVuZFRhYmxlW2xvd10pIHsKQEAgLTgwMiw3ICs4MjIsNyBAQAogCQl9CiAJCS8vIGFzc2VydCBsaW5lRW5kVGFibGVbbG93XSAgPCBwb3NpdGlvbiA8PSBsaW5lRW5kVGFibGVbaGldCiAJCS8vICYmIGxvdyA9PSAwICYmIGhpID09IGxlbmd0aCAtIDEgJiYgbG93IDwgaGkKLQkJCisKIAkJLy8gYmluYXJ5IHNlYXJjaCBsaW5lIGVuZCB0YWJsZQogCQl3aGlsZSAodHJ1ZSkgewogCQkJLy8gaW52YXJpYW50IGxpbmVFbmRUYWJsZVtsb3ddIDwgcG9zaXRpb24gPD0gbGluZUVuZFRhYmxlW2hpXQpAQCAtODQ0LDcgKzg2NCw3IEBACiAJCS8vIGlnbm9yZSB0aGUgc3BhY2UgdGFrZW4gdXAgYnkgb3B0aW9uYWxDb21tZW50TGlzdAogCQlyZXR1cm4gc2l6ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBFbmFibGVzIHRoZSByZWNvcmRpbmcgb2YgY2hhbmdlcyB0byB0aGlzIGNvbXBpbGF0aW9uCiAJICogdW5pdCBhbmQgaXRzIGRlc2NlbmRlbnRzLiBUaGUgY29tcGlsYXRpb24gdW5pdCBtdXN0IGhhdmUKQEAgLTg1MywxMSArODczLDExIEBACiAJICogYXJiaXRyYXJ5IGNoYW5nZXMgdG8gdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoaXMgY29tcGlsYXRpb24KIAkgKiB1bml0IGFyZSByZWNvcmRlZCBpbnRlcm5hbGx5LiBPbmNlIHRoZSBtb2RpZmljYXRpb24gaGFzCiAJICogYmVlbiBjb21wbGV0ZWQsIGNhbGwgPGNvZGU+cmV3cml0ZTwvY29kZT4gdG8gZ2V0IGFuIG9iamVjdAotCSAqIHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyBlZGl0cyB0byB0aGUgb3JpZ2luYWwgCisJICogcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVkaXRzIHRvIHRoZSBvcmlnaW5hbAogCSAqIHNvdXJjZSBjb2RlIHN0cmluZy4KIAkgKgogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpcwotCSAqIG1hcmtlZCBhcyB1bm1vZGlmaWFibGUsIG9yIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBoYXMgYWxyZWFkeSAKKwkgKiBtYXJrZWQgYXMgdW5tb2RpZmlhYmxlLCBvciBpZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGFscmVhZHkKIAkgKiBiZWVuIHRhbXBlcmVkIHdpdGgsIG9yIHJlY29yZGluZyBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC04ODIsMTAgKzkwMiwxMCBAQAogCSAqIG9uIHJlY29yZC4gU3Vic2VxdWVuY2UgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBBU1QKIAkgKiBhcmUgYWRkZWQgdG8gdGhlIG9uZXMgYWxyZWFkeSBvbiByZWNvcmQuIElmIHRoaXMgbWV0aG9kCiAJICogaXMgY2FsbGVkIGFnYWluIGxhdGVyLCB0aGUgcmVzdWx0aW5nIHRleHQgZWRpdCBvYmplY3Qgd2lsbAotCSAqIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgbmV0IGN1bXVsYXRpdmUgYWZmZWN0IG9mIGFsbCB0aG9zZQorCSAqIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgbmV0IGN1bXVsYXRpdmUgZWZmZWN0IG9mIGFsbCB0aG9zZQogCSAqIGNoYW5nZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGRvY3VtZW50IG9yaWdpbmFsIGRvY3VtZW50IGNvbnRhaW5pbmcgc291cmNlIGNvZGUKIAkgKiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0CiAJICogQHBhcmFtIG9wdGlvbnMgdGhlIHRhYmxlIG9mIGZvcm1hdHRlciBvcHRpb25zCkBAIC05MDgsNyArOTI4LDcgQEAKIAkvKioKIAkgKiBTZXRzIHRoZSBsaXN0IG9mIHRoZSBjb21tZW50cyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nCiAJICogdGhpcyBjb21waWxhdGlvbiB1bml0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvbW1lbnRUYWJsZSBhIGxpc3Qgb2YgY29tbWVudHMgaW4gaW5jcmVhc2luZyBvcmRlcgogCSAqIG9mIHNvdXJjZSBzdGFydCBwb3NpdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY29tbWVudAogCSAqIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGF2YWlsYWJsZQpAQCAtOTQ4LDIxICs5NjgsMjEgQEAKIAkvKioKIAkgKiBTZXRzIHRoZSBKYXZhIHR5cGUgcm9vdCAoYSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvbiB1bml0fSBvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlIGNsYXNzIGZpbGV9KQogCSAqIHRoaXMgY29tcGlsYXRpb24gdW5pdCB3YXMgY3JlYXRlZCBmcm9tLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMgbm90IGNyZWF0ZWQgZnJvbSBhIEphdmEgdHlwZSByb290LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGVSb290IHRoZSBKYXZhIHR5cGUgcm9vdCB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGNyZWF0ZWQgZnJvbQogCSAqLwogCXZvaWQgc2V0VHlwZVJvb3QoSVR5cGVSb290IHR5cGVSb290KSB7CiAJCXRoaXMudHlwZVJvb3QgPSB0eXBlUm9vdDsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBsaW5lIGVuZCB0YWJsZSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LgotCSAqIElmIDxjb2RlPmxpbmVFbmRUYWJsZVtpXSA9PSBwPC9jb2RlPiB0aGVuIGxpbmUgbnVtYmVyIDxjb2RlPmkrMTwvY29kZT4gCi0JICogZW5kcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gPGNvZGU+cDwvY29kZT4uIEV4Y2VwdCBmb3IgdGhlIGxhc3QgbGluZSwgdGhlIAorCSAqIElmIDxjb2RlPmxpbmVFbmRUYWJsZVtpXSA9PSBwPC9jb2RlPiB0aGVuIGxpbmUgbnVtYmVyIDxjb2RlPmkrMTwvY29kZT4KKwkgKiBlbmRzIGF0IGNoYXJhY3RlciBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPi4gRXhjZXB0IGZvciB0aGUgbGFzdCBsaW5lLCB0aGUKIAkgKiBwb3NpdGlvbnMgYXJlIHRoYXQgb2YgKHRoZSBsYXN0IGNoYXJhY3RlciBvZikgdGhlIGxpbmUgZGVsaW1pdGVyLgogCSAqIEZvciBleGFtcGxlLCB0aGUgc291cmNlIHN0cmluZyA8Y29kZT5BXG5CXG5DPC9jb2RlPiBoYXMKIAkgKiBsaW5lIGVuZCB0YWJsZSB7MSwgMywgNH0uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbGluZUVuZFRhYmxlIHRoZSBsaW5lIGVuZCB0YWJsZQogCSAqLwogCXZvaWQgc2V0TGluZUVuZFRhYmxlKGludFtdIGxpbmVFbmRUYWJsZSkgewpAQCAtOTc0LDEyICs5OTQsMTIgQEAKIAkJY2hlY2tNb2RpZmlhYmxlKCk7CiAJCXRoaXMubGluZUVuZFRhYmxlID0gbGluZUVuZFRhYmxlOwogCX0KLQkKKwogCS8qKgotCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCAKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKIAkgKiBub2RlIHRvIHRoZSBnaXZlbiBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUuCi0JICogCi0JICogQHBhcmFtIHBrZ0RlY2wgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUsIG9yIAorCSAqCisJICogQHBhcmFtIHBrZ0RlY2wgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUsIG9yCiAJICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgZG9lcyBub3QgaGF2ZSBhIHBhY2thZ2UKIAkgKiAgIGRlY2xhcmF0aW9uICh0aGF0IGlzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UpCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CkBAIC05ODcsNyArMTAwNyw3IEBACiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFBhY2thZ2UoUGFja2FnZURlY2xhcmF0aW9uIHBrZ0RlY2wpIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxQYWNrYWdlRGVjbGFyYXRpb247CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgcGtnRGVjbCwgUEFDS0FHRV9QUk9QRVJUWSk7CkBAIC05OTksNyArMTAxOSw3IEBACiAJLyoqCiAJICogU2V0cyB0aGUgYXJyYXkgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgcGFyc2luZyBvcgogCSAqIG5hbWUgcmVzb2x1dGlvbiBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvYmxlbXMgdGhlIGxpc3Qgb2YgcHJvYmxlbXMKIAkgKi8KIAl2b2lkIHNldFByb2JsZW1zKElQcm9ibGVtW10gcHJvYmxlbXMpIHsKQEAgLTEwMDksNiArMTAyOSwxOSBAQAogCQl0aGlzLnByb2JsZW1zID0gcHJvYmxlbXM7CiAJfQogCQorCS8qKgorCSAqIEludGVybmFsIG1ldGhvZAorCSAqIAorCSAqIFNldHMgaW50ZXJuYWwgZGF0YSB1c2VkIHRvIHBlcmZvcm0gc3RhdGVtZW50cyByZWNvdmVyeS4KKwkgKiBAcGFyYW0gZGF0YQorCSAqIAorCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwl2b2lkIHNldFN0YXRlbWVudHNSZWNvdmVyeURhdGEoT2JqZWN0IGRhdGEpIHsKKwkJdGhpcy5zdGF0ZW1lbnRzUmVjb3ZlcnlEYXRhID0gZGF0YTsKKwl9CisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwMTYsNyArMTA0OSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTAzOCwxOSArMTA3MSwxOSBAQAogCQl9CiAJCXJldHVybiBzaXplOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBub2RlcyBmb3IgdGhlIHRvcC1sZXZlbCB0eXBlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIAorCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBub2RlcyBmb3IgdGhlIHRvcC1sZXZlbCB0eXBlIGRlY2xhcmF0aW9ucyBvZiB0aGlzCiAJICogY29tcGlsYXRpb24gdW5pdCwgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4KICAgICAgKiA8cD4KICAgICAgKiBOb3RlIHRoYXQgaW4gSkxTMywgdGhlIHR5cGVzIG1heSBpbmNsdWRlIGJvdGggZW51bSBkZWNsYXJhdGlvbnMKICAgICAgKiBhbmQgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9ucyBpbnRyb2R1Y2VkIGluIEoyU0UgNS4KICAgICAgKiBGb3IgSkxTMiwgdGhlIGVsZW1lbnRzIGFyZSBhbHdheXMgPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPi4KICAgICAgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdG9wLWxldmVsIHR5cGUgZGVjbGFyYXRpb24KLQkgKiAgICBub2RlcyAoZWxlbWVudFR5cGU6IDxjb2RlPkFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9jb2RlPikKLQkgKi8gCisJICogICAgbm9kZXMgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufSkKKwkgKi8KIAlwdWJsaWMgTGlzdCB0eXBlcygpIHsKIAkJcmV0dXJuIHRoaXMudHlwZXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhCmluZGV4IDExOWZkNWEuLjBmZGJkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdFJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsOSArMTAsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CkBAIC0zMiwxMCArMzUsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5GaWxlU3lzdGVtLkNsYXNzcGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1Jlc3RyaWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkV4dHJhQ29tcGlsZXJNb2RpZmllcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKQEAgLTQ2LDkgKzUxLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3RUb0ludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJpbmFyeU1lbWJlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DYW5jZWxhYmxlTmFtZUVudmlyb25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNhbmNlbGFibGVQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk5hbWVMb29rdXA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlUmVmRWxlbWVudDsKQEAgLTU4LDYgKzY1LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5ET01GaW5kZXI7CiAKIGNsYXNzIENvbXBpbGF0aW9uVW5pdFJlc29sdmVyIGV4dGVuZHMgQ29tcGlsZXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVfQklORElORyA9IDB4MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUSUFMID0gMHgyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9SRUNPVkVSWSA9IDB4NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkVfTUVUSE9EX0JPRElFUyA9IDB4ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HX1JFQ09WRVJZID0gMHgxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1JVTk5JTkdfVk1fQk9PVENMQVNTUEFUSCA9IDB4MjA7CiAKIAkvKiBBIGxpc3Qgb2YgaW50ICovCiAJc3RhdGljIGNsYXNzIEludEFycmF5TGlzdCB7CkBAIC03Myw3ICs4Niw3IEBACiAKIAkvKgogCSAqIFRoZSBzb3VyY2VzIHRoYXQgd2VyZSByZXF1ZXN0ZWQuCi0JICogTWFwIGZyb20gZmlsZSBuYW1lIChjaGFyW10pIHRvIElDb21waWxhdGlvblVuaXQuCisJICogTWFwIGZyb20gZmlsZSBuYW1lIChjaGFyW10pIHRvIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdC4KIAkgKi8KIAlIYXNodGFibGVPZk9iamVjdCByZXF1ZXN0ZWRTb3VyY2VzOwogCkBAIC04OCw2ICsxMDEsMTEgQEAKIAlib29sZWFuIGhhc0NvbXBpbGF0aW9uQWJvcnRlZDsKIAogCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOworCQorCS8qKgorCSAqIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVjZWl2ZXIgd2FzIGluaXRpYWxpemVkIHVzaW5nIGEgamF2YSBwcm9qZWN0IG5hbWUgZW52aXJvbm1lbnQKKwkgKi8KKwlib29sZWFuIGZyb21KYXZhUHJvamVjdDsKIAogCS8qKgogCSAqIEFuc3dlciBhIG5ldyBDb21waWxhdGlvblVuaXRWaXNpdG9yIHVzaW5nIHRoZSBnaXZlbiBuYW1lIGVudmlyb25tZW50IGFuZCBjb21waWxlciBvcHRpb25zLgpAQCAtMTMwLDExICsxNDgsMTMgQEAKIAkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucywKIAkJSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKIAkJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5LAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAorCQlib29sZWFuIGZyb21KYXZhUHJvamVjdCkgewogCiAJCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIGNvbXBpbGVyT3B0aW9ucywgcmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSk7CiAJCXRoaXMuaGFzQ29tcGlsYXRpb25BYm9ydGVkID0gZmFsc2U7CiAJCXRoaXMubW9uaXRvciA9bW9uaXRvcjsKKwkJdGhpcy5mcm9tSmF2YVByb2plY3QgPSBmcm9tSmF2YVByb2plY3Q7CiAJfQogCiAJLyoKQEAgLTE0Niw2ICsxNjYsMTAgQEAKIAkJU291cmNlVHlwZUVsZW1lbnRJbmZvIHNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKSBzb3VyY2VUeXBlc1swXTsKIAkJYWNjZXB0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQpIHNvdXJjZVR5cGUuZ2V0SGFuZGxlKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAl9CisJCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VwdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKKwkJc3VwZXIuYWNjZXB0KHNvdXJjZVVuaXQsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKKwl9CiAKIAkvKioKIAkgKiBBZGQgdGhlIGluaXRpYWwgc2V0IG9mIGNvbXBpbGF0aW9uIHVuaXRzIGludG8gdGhlIGxvb3AKQEAgLTE2Nyw3ICsxOTEsNyBAQAogCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIGluZGV4KyssIG1heFVuaXRzLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKIAkJCXRyeSB7Ci0JCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkgeworCQkJCWlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkgewogCQkJCQl0aGlzLm91dC5wcmludGxuKAogCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb21waWxhdGlvbl9yZXF1ZXN0LAogCQkJCQkJbmV3IFN0cmluZ1tdIHsKQEAgLTIyNCw3ICsyNDgsNyBAQAogCQl9CiAKIAkJLy8gYmluZGluZyByZXNvbHV0aW9uCi0JCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKCk7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKIAl9CiAKIAlJQmluZGluZyBjcmVhdGVCaW5kaW5nKFN0cmluZyBrZXkpIHsKQEAgLTIzMywxOCArMjU3LDI4IEBACiAJCUJpbmRpbmdLZXlSZXNvbHZlciBrZXlSZXNvbHZlciA9IG5ldyBCaW5kaW5nS2V5UmVzb2x2ZXIoa2V5LCB0aGlzLCB0aGlzLmxvb2t1cEVudmlyb25tZW50KTsKIAkJQmluZGluZyBjb21waWxlckJpbmRpbmcgPSBrZXlSZXNvbHZlci5nZXRDb21waWxlckJpbmRpbmcoKTsKIAkJaWYgKGNvbXBpbGVyQmluZGluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJRGVmYXVsdEJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG5ldyBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKHRoaXMubG9va3VwRW52aXJvbm1lbnQsIG51bGwvKm5vIG93bmVyKi8sIHRoaXMuYmluZGluZ1RhYmxlcywgZmFsc2UpOworCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodGhpcy5sb29rdXBFbnZpcm9ubWVudCwgbnVsbC8qbm8gb3duZXIqLywgdGhpcy5iaW5kaW5nVGFibGVzLCBmYWxzZSwgdGhpcy5mcm9tSmF2YVByb2plY3QpOwogCQlyZXR1cm4gcmVzb2x2ZXIuZ2V0QmluZGluZyhjb21waWxlckJpbmRpbmcpOwogCX0KIAotCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGNvbnZlcnQoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIGNoYXJbXSBzb3VyY2UsIGludCBhcGlMZXZlbCwgTWFwIG9wdGlvbnMsIGJvb2xlYW4gbmVlZFRvUmVzb2x2ZUJpbmRpbmdzLCBXb3JraW5nQ29weU93bmVyIG93bmVyLCBEZWZhdWx0QmluZGluZ1Jlc29sdmVyLkJpbmRpbmdUYWJsZXMgYmluZGluZ1RhYmxlcywgaW50IGZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBjb252ZXJ0KAorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sCisJCQljaGFyW10gc291cmNlLAorCQkJaW50IGFwaUxldmVsLAorCQkJTWFwIG9wdGlvbnMsCisJCQlib29sZWFuIG5lZWRUb1Jlc29sdmVCaW5kaW5ncywKKwkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyLkJpbmRpbmdUYWJsZXMgYmluZGluZ1RhYmxlcywKKwkJCWludCBmbGFncywKKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKKwkJCWJvb2xlYW4gZnJvbUphdmFQcm9qZWN0KSB7CiAJCUJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG51bGw7CiAJCUFTVCBhc3QgPSBBU1QubmV3QVNUKGFwaUxldmVsKTsKIAkJYXN0LnNldERlZmF1bHROb2RlRmxhZyhBU1ROb2RlLk9SSUdJTkFMKTsKIAkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IG51bGw7CiAJCUFTVENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQVNUQ29udmVydGVyKG9wdGlvbnMsIG5lZWRUb1Jlc29sdmVCaW5kaW5ncywgbW9uaXRvcik7CiAJCWlmIChuZWVkVG9SZXNvbHZlQmluZGluZ3MpIHsKLQkJCXJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uc2NvcGUsIG93bmVyLCBiaW5kaW5nVGFibGVzLCAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMCk7CisJCQlyZXNvbHZlciA9IG5ldyBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNjb3BlLCBvd25lciwgYmluZGluZ1RhYmxlcywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDAsIGZyb21KYXZhUHJvamVjdCk7CiAJCQlhc3Quc2V0RmxhZyhmbGFncyB8IEFTVC5SRVNPTFZFRF9CSU5ESU5HUyk7CiAJCX0gZWxzZSB7CiAJCQlyZXNvbHZlciA9IG5ldyBCaW5kaW5nUmVzb2x2ZXIoKTsKQEAgLTMwMyw3ICszMzcsNyBAQAogCXB1YmxpYyB2b2lkIHByb2Nlc3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IGkpIHsKIAkJLy8gZG9uJ3QgcmVzb2x2ZSBhIHNlY29uZCB0aW1lIHRoZSBzYW1lIHVuaXQgKHRoaXMgd291bGQgY3JlYXRlIHRoZSBzYW1lIGJpbmRpbmcgdHdpY2UpCiAJCWNoYXJbXSBmaWxlTmFtZSA9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKCF0aGlzLnJlcXVlc3RlZEtleXMuY29udGFpbnNLZXkoZmlsZU5hbWUpICYmICF0aGlzLnJlcXVlc3RlZFNvdXJjZXMuY29udGFpbnNLZXkoZmlsZU5hbWUpKQorCQlpZiAodGhpcy5yZXF1ZXN0ZWRLZXlzLmdldChmaWxlTmFtZSkgPT0gbnVsbCAmJiB0aGlzLnJlcXVlc3RlZFNvdXJjZXMuZ2V0KGZpbGVOYW1lKSA9PSBudWxsKQogCQkJc3VwZXIucHJvY2Vzcyh1bml0LCBpKTsKIAl9CiAJLyoKQEAgLTMzNSwxNSArMzY5LDE2IEBACiAJcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKElDb21waWxhdGlvblVuaXRbXSBjb21waWxhdGlvblVuaXRzLCBBU1RSZXF1ZXN0b3IgYXN0UmVxdWVzdG9yLCBpbnQgYXBpTGV2ZWwsIE1hcCBvcHRpb25zLCBpbnQgZmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQl0cnkgewogCQkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMob3B0aW9ucyk7CisJCQljb21waWxlck9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzID0gKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMDsKIAkJCVBhcnNlciBwYXJzZXIgPSBuZXcgQ29tbWVudFJlY29yZGVyUGFyc2VyKAogCQkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCiAJCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKIAkJCQkJCWNvbXBpbGVyT3B0aW9ucywKIAkJCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSksCiAJCQkJZmFsc2UpOwotCQkJaW50IGxlbmd0aCA9IGNvbXBpbGF0aW9uVW5pdHMubGVuZ3RoOwotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5iZWdpblRhc2soIiIsIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWludCB1bml0TGVuZ3RoID0gY29tcGlsYXRpb25Vbml0cy5sZW5ndGg7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmJlZ2luVGFzaygiIiwgdW5pdExlbmd0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pdExlbmd0aDsgaSsrKSB7CiAJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0KSBjb21waWxhdGlvblVuaXRzW2ldOwogCQkJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIGNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwogCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7CkBAIC0zNTgsMTIgKzM5MywxMyBAQAogCQkJCS8vcmVhbCBwYXJzZSBvZiB0aGUgbWV0aG9kLi4uLgogCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKIAkJCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gdHlwZXMubGVuZ3RoOyAtLWogPj0gMDspCi0JCQkJCQl0eXBlc1tqXS5wYXJzZU1ldGhvZChwYXJzZXIsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIHR5cGVMZW5ndGggPSB0eXBlcy5sZW5ndGg7IGogPCB0eXBlTGVuZ3RoOyBqKyspIHsKKwkJCQkJCXR5cGVzW2pdLnBhcnNlTWV0aG9kcyhwYXJzZXIsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKKwkJCQkJfQogCQkJCX0KIAogCQkJCS8vIGNvbnZlcnQgQVNUCi0JCQkJQ29tcGlsYXRpb25Vbml0IG5vZGUgPSBjb252ZXJ0KGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCBwYXJzZXIuc2Nhbm5lci5nZXRTb3VyY2UoKSwgYXBpTGV2ZWwsIG9wdGlvbnMsIGZhbHNlLypkb24ndCByZXNvbHZlIGJpbmRpbmcqLywgbnVsbC8qbm8gb3duZXIgbmVlZGVkKi8sIG51bGwvKm5vIGJpbmRpbmcgdGFibGUgbmVlZGVkKi8sIGZsYWdzIC8qIGZsYWdzICovLCBtb25pdG9yKTsKKwkJCQlDb21waWxhdGlvblVuaXQgbm9kZSA9IGNvbnZlcnQoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIHBhcnNlci5zY2FubmVyLmdldFNvdXJjZSgpLCBhcGlMZXZlbCwgb3B0aW9ucywgZmFsc2UvKmRvbid0IHJlc29sdmUgYmluZGluZyovLCBudWxsLypubyBvd25lciBuZWVkZWQqLywgbnVsbC8qbm8gYmluZGluZyB0YWJsZSBuZWVkZWQqLywgZmxhZ3MgLyogZmxhZ3MgKi8sIG1vbml0b3IsIHRydWUpOwogCQkJCW5vZGUuc2V0VHlwZVJvb3QoY29tcGlsYXRpb25Vbml0c1tpXSk7CiAKIAkJCQkvLyBhY2NlcHQgQVNUCkBAIC0zNzUsNyArNDExLDcxIEBACiAJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKIAkJfQogCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoCisJCQlTdHJpbmdbXSBzb3VyY2VVbml0cywKKwkJCVN0cmluZ1tdIGVuY29kaW5ncywKKwkJCUZpbGVBU1RSZXF1ZXN0b3IgYXN0UmVxdWVzdG9yLAorCQkJaW50IGFwaUxldmVsLAorCQkJTWFwIG9wdGlvbnMsCisJCQlpbnQgZmxhZ3MsCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJdHJ5IHsKKwkJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOworCQkJY29tcGlsZXJPcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcyA9IChmbGFncyAmIElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDA7CisJCQlQYXJzZXIgcGFyc2VyID0gbmV3IENvbW1lbnRSZWNvcmRlclBhcnNlcigKKwkJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAorCQkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksCisJCQkJCQljb21waWxlck9wdGlvbnMsCisJCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCkpLAorCQkJCWZhbHNlKTsKKwkJCWludCB1bml0TGVuZ3RoID0gc291cmNlVW5pdHMubGVuZ3RoOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5iZWdpblRhc2soIiIsIHVuaXRMZW5ndGgpOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRMZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXSBjb250ZW50cyA9IG51bGw7CisJCQkJU3RyaW5nIGVuY29kaW5nID0gZW5jb2RpbmdzICE9IG51bGwgPyBlbmNvZGluZ3NbaV0gOiBudWxsOworCQkJCXRyeSB7CisJCQkJCWNvbnRlbnRzID0gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUoc291cmNlVW5pdHNbaV0pLCBlbmNvZGluZyk7CisJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGdvIHRvIHRoZSBuZXh0IHVuaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChjb250ZW50cyA9PSBudWxsKSB7CisJCQkJCS8vIGdvIHRvIHRoZSBuZXh0IHVuaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQoY29udGVudHMsIHNvdXJjZVVuaXRzW2ldLCBlbmNvZGluZyk7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBjb21waWxhdGlvblVuaXQ7CisJCQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKIAorCQkJCWlmIChjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5pZ25vcmVNZXRob2RCb2RpZXMpIHsKKwkJCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQkJCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAorCQkJCS8vcmVhbCBwYXJzZSBvZiB0aGUgbWV0aG9kLi4uLgorCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKKwkJCQlpZiAodHlwZXMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBqID0gMCwgdHlwZUxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaiA8IHR5cGVMZW5ndGg7IGorKykgeworCQkJCQkJdHlwZXNbal0ucGFyc2VNZXRob2RzKHBhcnNlciwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gY29udmVydCBBU1QKKwkJCQlDb21waWxhdGlvblVuaXQgbm9kZSA9IGNvbnZlcnQoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIHBhcnNlci5zY2FubmVyLmdldFNvdXJjZSgpLCBhcGlMZXZlbCwgb3B0aW9ucywgZmFsc2UvKmRvbid0IHJlc29sdmUgYmluZGluZyovLCBudWxsLypubyBvd25lciBuZWVkZWQqLywgbnVsbC8qbm8gYmluZGluZyB0YWJsZSBuZWVkZWQqLywgZmxhZ3MgLyogZmxhZ3MgKi8sIG1vbml0b3IsIHRydWUpOworCQkJCW5vZGUuc2V0VHlwZVJvb3QobnVsbCk7CisKKwkJCQkvLyBhY2NlcHQgQVNUCisJCQkJYXN0UmVxdWVzdG9yLmFjY2VwdEFTVChzb3VyY2VVbml0c1tpXSwgbm9kZSk7CisKKwkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLndvcmtlZCgxKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOworCQl9CisJfQogCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2UoCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwKIAkJCU5vZGVTZWFyY2hlciBub2RlU2VhcmNoZXIsCkBAIC0zODgsNiArNDg4LDcgQEAKIAkJYm9vbGVhbiBzdGF0ZW1lbnRzUmVjb3ZlcnkgPSAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwOwogCQljb21waWxlck9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkgPSBzdGF0ZW1lbnRzUmVjb3Zlcnk7CiAJCWNvbXBpbGVyT3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gc3RhdGVtZW50c1JlY292ZXJ5OworCQljb21waWxlck9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzID0gKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMDsKIAkJUGFyc2VyIHBhcnNlciA9IG5ldyBDb21tZW50UmVjb3JkZXJQYXJzZXIoCiAJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAogCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKQEAgLTQwMCw3ICs1MDEsNyBAQAogCQlpZiAoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uaWdub3JlTWV0aG9kQm9kaWVzKSB7CiAJCQljb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCi0JCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKIAkJfQogCiAJCWlmIChub2RlU2VhcmNoZXIgIT0gbnVsbCkgewpAQCAtNDA4LDM1ICs1MDksMzYgQEAKIAkJCWludCBzZWFyY2hQb3NpdGlvbiA9IG5vZGVTZWFyY2hlci5wb3NpdGlvbjsKIAkJCWlmIChzZWFyY2hQb3NpdGlvbiA8IDAgfHwgc2VhcmNoUG9zaXRpb24gPiBzb3VyY2UubGVuZ3RoKSB7CiAJCQkJLy8gdGhlIHBvc2l0aW9uIGlzIG91dCBvZiByYW5nZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZWFyY2ggZm9yIGEgbm9kZS4KLQkgCQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworCQkJCXJldHVybiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKIAkJCX0KIAogCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24udHJhdmVyc2Uobm9kZVNlYXJjaGVyLCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5zY29wZSk7CiAKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlID0gbm9kZVNlYXJjaGVyLmZvdW5kOwotCSAJCWlmIChub2RlID09IG51bGwpIHsKLQkgCQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOwotCSAJCX0KKwkJCWlmIChub2RlID09IG51bGwpIHsKKwkJCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CisJCQl9CiAKLQkgCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlRGVjbGFyYXRpb24gPSBub2RlU2VhcmNoZXIuZW5jbG9zaW5nVHlwZTsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIGVuY2xvc2luZ1R5cGVEZWNsYXJhdGlvbiA9IG5vZGVTZWFyY2hlci5lbmNsb3NpbmdUeXBlOwogCiAJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJCQkoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pbm9kZSkucGFyc2VTdGF0ZW1lbnRzKHBhcnNlciwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOwogCQkJfSBlbHNlIGlmIChlbmNsb3NpbmdUeXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgewogCQkJCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcikgewogCQkJCQkoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXIpIG5vZGUpLnBhcnNlU3RhdGVtZW50cyhwYXJzZXIsIGVuY2xvc2luZ1R5cGVEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pbm9kZSkucGFyc2VNZXRob2QocGFyc2VyLCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbik7CisJCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHsKKwkJCQkJKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbilub2RlKS5wYXJzZU1ldGhvZHMocGFyc2VyLCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbik7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewotCQkJLy9maWxsIHRoZSBtZXRob2RzIGJvZGllcyBpbiBvcmRlciBmb3IgdGhlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkCi0JCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4KLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKLQkJCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aDsgLS1pID49IDA7KQotCQkJCQl0eXBlc1tpXS5wYXJzZU1ldGhvZChwYXJzZXIsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKLQkJCX0KKwkJCQkvL2ZpbGwgdGhlIG1ldGhvZHMgYm9kaWVzIGluIG9yZGVyIGZvciB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKKwkJCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4JCQkKKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24udHlwZXM7CisJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIHR5cGVMZW5ndGggPSB0eXBlcy5sZW5ndGg7IGogPCB0eXBlTGVuZ3RoOyBqKyspIHsKKwkJCQkJCXR5cGVzW2pdLnBhcnNlTWV0aG9kcyhwYXJzZXIsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKKwkJCQkJfQorCQkJCX0KIAkJfQogCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CiAJfQpAQCAtNDYxLDE1ICs1NjMsMTcgQEAKIAkJCX0KIAkJCWVudmlyb25tZW50ID0gbmV3IENhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQoKChKYXZhUHJvamVjdCkgamF2YVByb2plY3QpLCBvd25lciwgbW9uaXRvcik7CiAJCQlwcm9ibGVtRmFjdG9yeSA9IG5ldyBDYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkobW9uaXRvcik7CisJCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMsIChmbGFncyAmIElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkpICE9IDApOworCQkJY29tcGlsZXJPcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcyA9IChmbGFncyAmIElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDA7CiAJCQlDb21waWxhdGlvblVuaXRSZXNvbHZlciByZXNvbHZlciA9CiAJCQkJbmV3IENvbXBpbGF0aW9uVW5pdFJlc29sdmVyKAogCQkJCQllbnZpcm9ubWVudCwKIAkJCQkJZ2V0SGFuZGxpbmdQb2xpY3koKSwKLQkJCQkJZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMsIChmbGFncyAmIElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkpICE9IDApLAorCQkJCQljb21waWxlck9wdGlvbnMsCiAJCQkJCWdldFJlcXVlc3RvcigpLAogCQkJCQlwcm9ibGVtRmFjdG9yeSwKLQkJCQkJbW9uaXRvcik7Ci0KKwkJCQkJbW9uaXRvciwKKwkJCQkJamF2YVByb2plY3QgIT0gbnVsbCk7CiAJCQlyZXNvbHZlci5yZXNvbHZlKGNvbXBpbGF0aW9uVW5pdHMsIGJpbmRpbmdLZXlzLCByZXF1ZXN0b3IsIGFwaUxldmVsLCBvcHRpb25zLCBvd25lciwgZmxhZ3MpOwogCQkJaWYgKE5hbWVMb29rdXAuVkVSQk9TRSkgewogCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBUSU1FIFNQRU5UIGluIE5hbWVMb29wa3VwI3NlZWtUeXBlc0luU291cmNlUGFja2FnZTogIiArIGVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtNDgxLDE2ICs1ODUsNjYgQEAKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOwogCQkJaWYgKGVudmlyb25tZW50ICE9IG51bGwpIHsKLQkJCQllbnZpcm9ubWVudC5tb25pdG9yID0gbnVsbDsgLy8gZG9uJ3QgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGlzIGV4dGVybmFsIG9iamVjdAorCQkJCWVudmlyb25tZW50LnNldE1vbml0b3IobnVsbCk7IC8vIGRvbid0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBleHRlcm5hbCBvYmplY3QKIAkJCX0KIAkJCWlmIChwcm9ibGVtRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcHJvYmxlbUZhY3RvcnkubW9uaXRvciA9IG51bGw7IC8vIGRvbid0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBleHRlcm5hbCBvYmplY3QKIAkJCX0KIAkJfQogCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZSgKKwkJCVN0cmluZ1tdIHNvdXJjZVVuaXRzLAorCQkJU3RyaW5nW10gZW5jb2RpbmdzLAorCQkJU3RyaW5nW10gYmluZGluZ0tleXMsCisJCQlGaWxlQVNUUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJCWludCBhcGlMZXZlbCwKKwkJCU1hcCBvcHRpb25zLAorCQkJTGlzdCBjbGFzc3BhdGhzLAorCQkJaW50IGZsYWdzLAorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisKKwkJCUlOYW1lRW52aXJvbm1lbnRXaXRoUHJvZ3Jlc3MgZW52aXJvbm1lbnQgPSBudWxsOworCQkJQ2FuY2VsYWJsZVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCQlpbnQgYW1vdW50T2ZXb3JrID0gKHNvdXJjZVVuaXRzLmxlbmd0aCArIGJpbmRpbmdLZXlzLmxlbmd0aCkgKiAyOyAvLyAxIGZvciBiZWdpblRvQ29tcGlsZSwgMSBmb3IgcmVzb2x2ZQorCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgYW1vdW50T2ZXb3JrKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlDbGFzc3BhdGhbXSBhbGxFbnRyaWVzID0gbmV3IENsYXNzcGF0aFtjbGFzc3BhdGhzLnNpemUoKV07CisJCQkJY2xhc3NwYXRocy50b0FycmF5KGFsbEVudHJpZXMpOworCQkJCWVudmlyb25tZW50ID0gbmV3IE5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcyhhbGxFbnRyaWVzLCBudWxsLCBtb25pdG9yKTsKKwkJCQlwcm9ibGVtRmFjdG9yeSA9IG5ldyBDYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkobW9uaXRvcik7CisJCQkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucyhvcHRpb25zLCAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwKTsKKwkJCQljb21waWxlck9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzID0gKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMDsKKwkJCQlDb21waWxhdGlvblVuaXRSZXNvbHZlciByZXNvbHZlciA9CisJCQkJCW5ldyBDb21waWxhdGlvblVuaXRSZXNvbHZlcigKKwkJCQkJCWVudmlyb25tZW50LAorCQkJCQkJZ2V0SGFuZGxpbmdQb2xpY3koKSwKKwkJCQkJCWNvbXBpbGVyT3B0aW9ucywKKwkJCQkJCWdldFJlcXVlc3RvcigpLAorCQkJCQkJcHJvYmxlbUZhY3RvcnksCisJCQkJCQltb25pdG9yLAorCQkJCQkJZmFsc2UpOworCQkJCXJlc29sdmVyLnJlc29sdmUoc291cmNlVW5pdHMsIGVuY29kaW5ncywgYmluZGluZ0tleXMsIHJlcXVlc3RvciwgYXBpTGV2ZWwsIG9wdGlvbnMsIGZsYWdzKTsKKwkJCQlpZiAoTmFtZUxvb2t1cC5WRVJCT1NFICYmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIENhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQpKSB7CisJCQkJCUNhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQgY2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudCA9IChDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlOiAiICsgY2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwLnRpbWVTcGVudEluU2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlICsgIm1zIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlOiAiICsgY2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwLnRpbWVTcGVudEluU2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlICsgIm1zIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOworCQkJCWlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7CisJCQkJCWVudmlyb25tZW50LnNldE1vbml0b3IobnVsbCk7IC8vIGRvbid0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBleHRlcm5hbCBvYmplY3QKKwkJCQl9CisJCQkJaWYgKHByb2JsZW1GYWN0b3J5ICE9IG51bGwpIHsKKwkJCQkJcHJvYmxlbUZhY3RvcnkubW9uaXRvciA9IG51bGw7IC8vIGRvbid0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBleHRlcm5hbCBvYmplY3QKKwkJCQl9CisJCQl9CisJCX0KIAlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlc29sdmUoCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwKIAkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCUxpc3QgY2xhc3NwYXRocywKIAkJCU5vZGVTZWFyY2hlciBub2RlU2VhcmNoZXIsCiAJCQlNYXAgb3B0aW9ucywKIAkJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCkBAIC00OTgsMjkgKzY1MiwzOSBAQAogCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKLQkJQ2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG51bGw7CisJCUlOYW1lRW52aXJvbm1lbnRXaXRoUHJvZ3Jlc3MgZW52aXJvbm1lbnQgPSBudWxsOwogCQlDYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkgPSBudWxsOwogCQlDb21waWxhdGlvblVuaXRSZXNvbHZlciByZXNvbHZlciA9IG51bGw7CiAJCXRyeSB7Ci0JCQllbnZpcm9ubWVudCA9IG5ldyBDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50KCgoSmF2YVByb2plY3QpamF2YVByb2plY3QpLCBvd25lciwgbW9uaXRvcik7CisJCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgeworCQkJCUNsYXNzcGF0aFtdIGFsbEVudHJpZXMgPSBuZXcgQ2xhc3NwYXRoW2NsYXNzcGF0aHMuc2l6ZSgpXTsKKwkJCQljbGFzc3BhdGhzLnRvQXJyYXkoYWxsRW50cmllcyk7CisJCQkJZW52aXJvbm1lbnQgPSBuZXcgTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzKGFsbEVudHJpZXMsIG51bGwsIG1vbml0b3IpOworCQkJfSBlbHNlIHsKKwkJCQllbnZpcm9ubWVudCA9IG5ldyBDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50KChKYXZhUHJvamVjdCkgamF2YVByb2plY3QsIG93bmVyLCBtb25pdG9yKTsKKwkJCX0KIAkJCXByb2JsZW1GYWN0b3J5ID0gbmV3IENhbmNlbGFibGVQcm9ibGVtRmFjdG9yeShtb25pdG9yKTsKKwkJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMob3B0aW9ucywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWSkgIT0gMCk7CisJCQlib29sZWFuIGlnbm9yZU1ldGhvZEJvZGllcyA9IChmbGFncyAmIElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDA7CisJCQljb21waWxlck9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzID0gaWdub3JlTWV0aG9kQm9kaWVzOwogCQkJcmVzb2x2ZXIgPQogCQkJCW5ldyBDb21waWxhdGlvblVuaXRSZXNvbHZlcigKIAkJCQkJZW52aXJvbm1lbnQsCiAJCQkJCWdldEhhbmRsaW5nUG9saWN5KCksCi0JCQkJCWdldENvbXBpbGVyT3B0aW9ucyhvcHRpb25zLCAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwKSwKKwkJCQkJY29tcGlsZXJPcHRpb25zLAogCQkJCQlnZXRSZXF1ZXN0b3IoKSwKIAkJCQkJcHJvYmxlbUZhY3RvcnksCi0JCQkJCW1vbml0b3IpOwotCisJCQkJCW1vbml0b3IsCisJCQkJCWphdmFQcm9qZWN0ICE9IG51bGwpOworCQkJYm9vbGVhbiBhbmFseXplQW5kR2VuZXJhdGVDb2RlID0gIWlnbm9yZU1ldGhvZEJvZGllczsKIAkJCXVuaXQgPQogCQkJCXJlc29sdmVyLnJlc29sdmUoCiAJCQkJCW51bGwsIC8vIG5vIGV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24KIAkJCQkJc291cmNlVW5pdCwKIAkJCQkJbm9kZVNlYXJjaGVyLAogCQkJCQl0cnVlLCAvLyBtZXRob2QgdmVyaWZpY2F0aW9uCi0JCQkJCXRydWUsIC8vIGFuYWx5emUgY29kZQotCQkJCQl0cnVlKTsgLy8gZ2VuZXJhdGUgY29kZQorCQkJCQlhbmFseXplQW5kR2VuZXJhdGVDb2RlLCAvLyBhbmFseXplIGNvZGUKKwkJCQkJYW5hbHl6ZUFuZEdlbmVyYXRlQ29kZSk7IC8vIGdlbmVyYXRlIGNvZGUKIAkJCWlmIChyZXNvbHZlci5oYXNDb21waWxhdGlvbkFib3J0ZWQpIHsKIAkJCQkvLyB0aGUgYmluZGluZ3MgY291bGQgbm90IGJlIHJlc29sdmVkIGR1ZSB0byBtaXNzaW5nIHR5cGVzIGluIG5hbWUgZW52aXJvbm1lbnQKIAkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NTQxCkBAIC01MzMsMjcgKzY5NywyMCBAQAogCQkJCX0KIAkJCQlyZXR1cm4gdW5pdERlY2xhcmF0aW9uOwogCQkJfQotCQkJaWYgKE5hbWVMb29rdXAuVkVSQk9TRSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBUSU1FIFNQRU5UIGluIE5hbWVMb29wa3VwI3NlZWtUeXBlc0luU291cmNlUGFja2FnZTogIiArIGVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBUSU1FIFNQRU5UIGluIE5hbWVMb29wa3VwI3NlZWtUeXBlc0luQmluYXJ5UGFja2FnZTogIiArIGVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJaWYgKE5hbWVMb29rdXAuVkVSQk9TRSAmJiBlbnZpcm9ubWVudCBpbnN0YW5jZW9mIENhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQpIHsKKwkJCQlDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50IGNhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQgPSAoQ2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudCkgZW52aXJvbm1lbnQ7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlOiAiICsgY2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudC5uYW1lTG9va3VwLnRpbWVTcGVudEluU2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlICsgIm1zIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgVElNRSBTUEVOVCBpbiBOYW1lTG9vcGt1cCNzZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2U6ICIgKyBjYW5jZWxhYmxlTmFtZUVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJfQogCQkJcmV0dXJuIHVuaXQ7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgewotCQkJCWVudmlyb25tZW50Lm1vbml0b3IgPSBudWxsOyAvLyBkb24ndCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoaXMgZXh0ZXJuYWwgb2JqZWN0CisJCQkJLy8gZG9uJ3QgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGlzIGV4dGVybmFsIG9iamVjdAorCQkJCWVudmlyb25tZW50LnNldE1vbml0b3IobnVsbCk7CiAJCQl9CiAJCQlpZiAocHJvYmxlbUZhY3RvcnkgIT0gbnVsbCkgewogCQkJCXByb2JsZW1GYWN0b3J5Lm1vbml0b3IgPSBudWxsOyAvLyBkb24ndCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoaXMgZXh0ZXJuYWwgb2JqZWN0CiAJCQl9Ci0JCQkvLyBmaXJzdCB1bml0IGNsZWFudXAgaXMgZG9uZSBieSBjYWxsZXIsIGJ1dCBjbGVhbnVwIGFsbCBlbnF1ZXVlZCByZXF1ZXN0ZWQgdW5pdHMgKG5vdCBwcm9jZXNzZWQpCi0vLwkJCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0vLwkJCQlmb3IgKGludCBpID0gMTsgaSA8ICByZXNvbHZlci50b3RhbFVuaXRzOyBpKyspIHsgLy8gY291bGQgYmUgbW9yZSByZXF1ZXN0ZWQgdW5pdHMKLS8vCQkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcmVzb2x2ZXIudW5pdHNUb1Byb2Nlc3NbaV07Ci0vLwkJCQkJaWYgKHBhcnNlZFVuaXQuc2NvcGUgIT0gbnVsbCkKLS8vCQkJCQkJcGFyc2VkVW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsgLy8gZm9yY2UgcmVzb2x1dGlvbiBvZiBzaWduYXR1cmVzLCBzbyBjbGllbnRzIGNhbiBxdWVyeSBET00gQVNUCi0vLwkJCQkJcGFyc2VkVW5pdC5jbGVhblVwKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KIAkJfQogCX0KIAlwdWJsaWMgc3RhdGljIElCaW5kaW5nW10gcmVzb2x2ZSgKQEAgLTY2NywyMSArODI0LDI3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVzb2x2ZShJQ29tcGlsYXRpb25Vbml0W10gY29tcGlsYXRpb25Vbml0cywgU3RyaW5nW10gYmluZGluZ0tleXMsIEFTVFJlcXVlc3RvciBhc3RSZXF1ZXN0b3IsIGludCBhcGlMZXZlbCwgTWFwIGNvbXBpbGVyT3B0aW9ucywgV29ya2luZ0NvcHlPd25lciBvd25lciwgaW50IGZsYWdzKSB7CisJcHJpdmF0ZSB2b2lkIHJlc29sdmUoCisJCQlJQ29tcGlsYXRpb25Vbml0W10gY29tcGlsYXRpb25Vbml0cywKKwkJCVN0cmluZ1tdIGJpbmRpbmdLZXlzLAorCQkJQVNUUmVxdWVzdG9yIGFzdFJlcXVlc3RvciwKKwkJCWludCBhcGlMZXZlbCwKKwkJCU1hcCBjb21waWxlck9wdGlvbnMsCisJCQlXb3JraW5nQ29weU93bmVyIG93bmVyLAorCQkJaW50IGZsYWdzKSB7CiAKLQkJLy8gdGVtcG9yYXJhcmlseSBjb25uZWN0IG91cnNlbHZlcyB0byB0aGUgQVNUUmVzb2x2ZXIgLSBtdXN0IGRpc2Nvbm5lY3Qgd2hlbiBkb25lCisJCS8vIHRlbXBvcmFyaWx5IGNvbm5lY3Qgb3Vyc2VsdmVzIHRvIHRoZSBBU1RSZXNvbHZlciAtIG11c3QgZGlzY29ubmVjdCB3aGVuIGRvbmUKIAkJYXN0UmVxdWVzdG9yLmNvbXBpbGF0aW9uVW5pdFJlc29sdmVyID0gdGhpczsKIAkJdGhpcy5iaW5kaW5nVGFibGVzID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuQmluZGluZ1RhYmxlcygpOwogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKLQkJaW50IGkgPSAwOwogCQl0cnkgewogCQkJaW50IGxlbmd0aCA9IGNvbXBpbGF0aW9uVW5pdHMubGVuZ3RoOwogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0W10gc291cmNlVW5pdHMgPSBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0W2xlbmd0aF07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbXBpbGF0aW9uVW5pdHMsIDAsIHNvdXJjZVVuaXRzLCAwLCBsZW5ndGgpOwogCQkJYmVnaW5Ub0NvbXBpbGUoc291cmNlVW5pdHMsIGJpbmRpbmdLZXlzKTsKIAkJCS8vIHByb2Nlc3MgYWxsIHVuaXRzIChzb21lIG1vcmUgY291bGQgYmUgaW5qZWN0ZWQgaW4gdGhlIGxvb3AgYnkgdGhlIGxvb2t1cCBlbnZpcm9ubWVudCkKLQkJCWZvciAoOyBpIDwgdGhpcy50b3RhbFVuaXRzOyBpKyspIHsKLQkJCQlpZiAodGhpcy5yZXF1ZXN0ZWRTb3VyY2VzLnNpemUoKSA9PSAwICYmIHRoaXMucmVxdWVzdGVkS2V5cy5zaXplKCkgPT0gMCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRvdGFsVW5pdHM7IGkrKykgeworCQkJCWlmIChyZXNvbHZlZFJlcXVlc3RlZFNvdXJjZXNBbmRLZXlzKGkpKSB7CiAJCQkJCS8vIG5vIG5lZWQgdG8ga2VlcCByZXNvbHZpbmcgaWYgbm8gbW9yZSBBU1RzIGFuZCBubyBtb3JlIGJpbmRpbmcga2V5cyBhcmUgbmVlZGVkCiAJCQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0OTM1CiAJCQkJCS8vIGNsZWFudXAgcmVtYWluaW5nIHVuaXRzCkBAIC03MDcsNyArODcwLDcgQEAKIAkJCQkJCWFzdC5zZXRGbGFnKGZsYWdzIHwgQVNULlJFU09MVkVEX0JJTkRJTkdTKTsKIAkJCQkJCWFzdC5zZXREZWZhdWx0Tm9kZUZsYWcoQVNUTm9kZS5PUklHSU5BTCk7CiAJCQkJCQlBU1RDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEFTVENvbnZlcnRlcihjb21waWxlck9wdGlvbnMsIHRydWUvKm5lZWQgdG8gcmVzb2x2ZSBiaW5kaW5ncyovLCB0aGlzLm1vbml0b3IpOwotCQkJCQkJQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodW5pdC5zY29wZSwgb3duZXIsIHRoaXMuYmluZGluZ1RhYmxlcywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDApOworCQkJCQkJQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodW5pdC5zY29wZSwgb3duZXIsIHRoaXMuYmluZGluZ1RhYmxlcywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDAsIHRoaXMuZnJvbUphdmFQcm9qZWN0KTsKIAkJCQkJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIocmVzb2x2ZXIpOwogCQkJCQkJY29udmVydGVyLnNldEFTVChhc3QpOwogCQkJCQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGNvbnZlcnRlci5jb252ZXJ0KHVuaXQsIGNvbnRlbnRzKTsKQEAgLTcyMCwyNCArODgzLDI4IEBACiAJCQkJCQlhc3RSZXF1ZXN0b3IuYWNjZXB0QVNUKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0KTsKIAogCQkJCQkJd29ya2VkKDEpOworCisJCQkJCQkvLyByZW1vdmUgYXQgdGhlIGVuZCBzbyB0aGF0IHdlIGRvbid0IHJlc29sdmUgdHdpY2UgaWYgYSBzb3VyY2UgYW5kIGEga2V5IGZvciB0aGUgc2FtZSBmaWxlIG5hbWUgaGF2ZSBiZWVuIHJlcXVlc3RlZAorCQkJCQkJdGhpcy5yZXF1ZXN0ZWRTb3VyY2VzLnB1dChmaWxlTmFtZSwgbnVsbCk7IC8vIG1hcmsgaXQgYXMgcmVtb3ZlZAogCQkJCQl9CiAKIAkJCQkJLy8gcmVxdWVzdGVkIGJpbmRpbmcKIAkJCQkJT2JqZWN0IGtleSA9IHRoaXMucmVxdWVzdGVkS2V5cy5nZXQoZmlsZU5hbWUpOwotCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgQmluZGluZ0tleVJlc29sdmVyKSB7Ci0JCQkJCQlyZXBvcnRCaW5kaW5nKGtleSwgYXN0UmVxdWVzdG9yLCBvd25lciwgdW5pdCk7Ci0JCQkJCQl3b3JrZWQoMSk7Ci0JCQkJCX0gZWxzZSBpZiAoa2V5IGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoQXJyYXlMaXN0KSBrZXkpLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJcmVwb3J0QmluZGluZyhpdGVyYXRvci5uZXh0KCksIGFzdFJlcXVlc3Rvciwgb3duZXIsIHVuaXQpOworCQkJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBCaW5kaW5nS2V5UmVzb2x2ZXIpIHsKKwkJCQkJCQlyZXBvcnRCaW5kaW5nKGtleSwgYXN0UmVxdWVzdG9yLCBvd25lciwgdW5pdCk7CiAJCQkJCQkJd29ya2VkKDEpOworCQkJCQkJfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBBcnJheUxpc3QpIHsKKwkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoQXJyYXlMaXN0KSBrZXkpLml0ZXJhdG9yKCk7CisJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCQlyZXBvcnRCaW5kaW5nKGl0ZXJhdG9yLm5leHQoKSwgYXN0UmVxdWVzdG9yLCBvd25lciwgdW5pdCk7CisJCQkJCQkJCXdvcmtlZCgxKTsKKwkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCX0KIAotCQkJCQkvLyByZW1vdmUgYXQgdGhlIGVuZCBzbyB0aGF0IHdlIGRvbid0IHJlc29sdmUgdHdpY2UgaWYgYSBzb3VyY2UgYW5kIGEga2V5IGZvciB0aGUgc2FtZSBmaWxlIG5hbWUgaGF2ZSBiZWVuIHJlcXVlc3RlZAotCQkJCQl0aGlzLnJlcXVlc3RlZFNvdXJjZXMucmVtb3ZlS2V5KGZpbGVOYW1lKTsKLQkJCQkJdGhpcy5yZXF1ZXN0ZWRLZXlzLnJlbW92ZUtleShmaWxlTmFtZSk7CisJCQkJCQkvLyByZW1vdmUgYXQgdGhlIGVuZCBzbyB0aGF0IHdlIGRvbid0IHJlc29sdmUgdHdpY2UgaWYgYSBzb3VyY2UgYW5kIGEga2V5IGZvciB0aGUgc2FtZSBmaWxlIG5hbWUgaGF2ZSBiZWVuIHJlcXVlc3RlZAorCQkJCQkJdGhpcy5yZXF1ZXN0ZWRLZXlzLnB1dChmaWxlTmFtZSwgbnVsbCk7IC8vIG1hcmsgaXQgYXMgcmVtb3ZlZAorCQkJCQl9CiAJCQkJfSBmaW5hbGx5IHsKIAkJCQkJLy8gY2xlYW51cCBjb21waWxhdGlvbiB1bml0IHJlc3VsdAogCQkJCQl1bml0LmNsZWFuVXAoKTsKQEAgLTc0Nyw3ICs5MTQsMTQwIEBACiAJCQl9CiAKIAkJCS8vIHJlbWFpbmluZyBiaW5kaW5nIGtleXMKLQkJCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcih0aGlzLmxvb2t1cEVudmlyb25tZW50LCBvd25lciwgdGhpcy5iaW5kaW5nVGFibGVzLCAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMCk7CisJCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodGhpcy5sb29rdXBFbnZpcm9ubWVudCwgb3duZXIsIHRoaXMuYmluZGluZ1RhYmxlcywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDAsIHRydWUpOworCQkJT2JqZWN0W10ga2V5cyA9IHRoaXMucmVxdWVzdGVkS2V5cy52YWx1ZVRhYmxlOworCQkJZm9yIChpbnQgaiA9IDAsIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDsgaiA8IGtleXNMZW5ndGg7IGorKykgeworCQkJCUJpbmRpbmdLZXlSZXNvbHZlciBrZXlSZXNvbHZlciA9IChCaW5kaW5nS2V5UmVzb2x2ZXIpIGtleXNbal07CisJCQkJaWYgKGtleVJlc29sdmVyID09IG51bGwpIGNvbnRpbnVlOworCQkJCUJpbmRpbmcgY29tcGlsZXJCaW5kaW5nID0ga2V5UmVzb2x2ZXIuZ2V0Q29tcGlsZXJCaW5kaW5nKCk7CisJCQkJSUJpbmRpbmcgYmluZGluZyA9IGNvbXBpbGVyQmluZGluZyA9PSBudWxsID8gbnVsbCA6IHJlc29sdmVyLmdldEJpbmRpbmcoY29tcGlsZXJCaW5kaW5nKTsKKwkJCQkvLyBwYXNzIGl0IHRvIHJlcXVlc3RvcgorCQkJCWFzdFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nKCgoQmluZGluZ0tleVJlc29sdmVyKSB0aGlzLnJlcXVlc3RlZEtleXMudmFsdWVUYWJsZVtqXSkuZ2V0S2V5KCksIGJpbmRpbmcpOworCQkJCXdvcmtlZCgxKTsKKwkJCX0KKwkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQpOworCQl9IGNhdGNoIChFcnJvciBlKSB7CisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOworCQkJdGhyb3cgZTsgLy8gcmV0aHJvdworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCwgbnVsbCk7CisJCQl0aHJvdyBlOyAvLyByZXRocm93CisJCX0gZmluYWxseSB7CisJCQkvLyBkaXNjb25uZWN0IG91cnNlbHZlcyBmcm9tIGFzdCByZXF1ZXN0b3IKKwkJCWFzdFJlcXVlc3Rvci5jb21waWxhdGlvblVuaXRSZXNvbHZlciA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVzb2x2ZSgKKwkJCVN0cmluZ1tdIHNvdXJjZUNvbXBpbGF0aW9uVW5pdHMsCisJCQlTdHJpbmdbXSBlbmNvZGluZ3MsCisJCQlTdHJpbmdbXSBiaW5kaW5nS2V5cywKKwkJCUZpbGVBU1RSZXF1ZXN0b3IgYXN0UmVxdWVzdG9yLAorCQkJaW50IGFwaUxldmVsLAorCQkJTWFwIGNvbXBpbGVyT3B0aW9ucywKKwkJCWludCBmbGFncykgeworCisJCS8vIHRlbXBvcmFyaWx5IGNvbm5lY3Qgb3Vyc2VsdmVzIHRvIHRoZSBBU1RSZXNvbHZlciAtIG11c3QgZGlzY29ubmVjdCB3aGVuIGRvbmUKKwkJYXN0UmVxdWVzdG9yLmNvbXBpbGF0aW9uVW5pdFJlc29sdmVyID0gdGhpczsKKwkJdGhpcy5iaW5kaW5nVGFibGVzID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuQmluZGluZ1RhYmxlcygpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWludCBsZW5ndGggPSBzb3VyY2VDb21waWxhdGlvblVuaXRzLmxlbmd0aDsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdFtdIHNvdXJjZVVuaXRzID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdFtsZW5ndGhdOworCQkJaW50IGNvdW50ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyW10gY29udGVudHMgPSBudWxsOworCQkJCVN0cmluZyBlbmNvZGluZyA9IGVuY29kaW5ncyAhPSBudWxsID8gZW5jb2RpbmdzW2ldIDogbnVsbDsKKwkJCQlTdHJpbmcgc291cmNlVW5pdFBhdGggPSBzb3VyY2VDb21waWxhdGlvblVuaXRzW2ldOworCQkJCXRyeSB7CisJCQkJCWNvbnRlbnRzID0gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUoc291cmNlVW5pdFBhdGgpLCBlbmNvZGluZyk7CisJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGdvIHRvIHRoZSBuZXh0IHVuaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChjb250ZW50cyA9PSBudWxsKSB7CisJCQkJCS8vIGdvIHRvIHRoZSBuZXh0IHVuaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXNvdXJjZVVuaXRzW2NvdW50KytdID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQoY29udGVudHMsIHNvdXJjZVVuaXRQYXRoLCBlbmNvZGluZyk7CisJCQl9CisJCQliZWdpblRvQ29tcGlsZShzb3VyY2VVbml0cywgYmluZGluZ0tleXMpOworCQkJLy8gcHJvY2VzcyBhbGwgdW5pdHMgKHNvbWUgbW9yZSBjb3VsZCBiZSBpbmplY3RlZCBpbiB0aGUgbG9vcCBieSB0aGUgbG9va3VwIGVudmlyb25tZW50KQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRvdGFsVW5pdHM7IGkrKykgeworCQkJCWlmIChyZXNvbHZlZFJlcXVlc3RlZFNvdXJjZXNBbmRLZXlzKGkpKSB7CisJCQkJCS8vIG5vIG5lZWQgdG8ga2VlcCByZXNvbHZpbmcgaWYgbm8gbW9yZSBBU1RzIGFuZCBubyBtb3JlIGJpbmRpbmcga2V5cyBhcmUgbmVlZGVkCisJCQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0OTM1CisJCQkJCS8vIGNsZWFudXAgcmVtYWluaW5nIHVuaXRzCisJCQkJCWZvciAoOyBpIDwgdGhpcy50b3RhbFVuaXRzOyBpKyspIHsKKwkJCQkJCXRoaXMudW5pdHNUb1Byb2Nlc3NbaV0uY2xlYW5VcCgpOworCQkJCQkJdGhpcy51bml0c1RvUHJvY2Vzc1tpXSA9IG51bGw7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXVuaXQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldOworCQkJCXRyeSB7CisJCQkJCXN1cGVyLnByb2Nlc3ModW5pdCwgaSk7IC8vIHRoaXMucHJvY2VzcyguLi4pIGlzIG9wdGltaXplZCB0byBub3QgcHJvY2VzcyBhbHJlYWR5IGtub3duIHVuaXRzCisKKwkJCQkJLy8gcmVxdWVzdGVkIEFTVAorCQkJCQljaGFyW10gZmlsZU5hbWUgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0LmdldEZpbGVOYW1lKCk7CisJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0KSB0aGlzLnJlcXVlc3RlZFNvdXJjZXMuZ2V0KGZpbGVOYW1lKTsKKwkJCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkvLyBjb252ZXJ0IEFTVAorCQkJCQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSB1bml0LmNvbXBpbGF0aW9uUmVzdWx0OworCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBjb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQ7CisJCQkJCQljaGFyW10gY29udGVudHMgPSBzb3VyY2VVbml0LmdldENvbnRlbnRzKCk7CisJCQkJCQlBU1QgYXN0ID0gQVNULm5ld0FTVChhcGlMZXZlbCk7CisJCQkJCQlhc3Quc2V0RmxhZyhmbGFncyB8IEFTVC5SRVNPTFZFRF9CSU5ESU5HUyk7CisJCQkJCQlhc3Quc2V0RGVmYXVsdE5vZGVGbGFnKEFTVE5vZGUuT1JJR0lOQUwpOworCQkJCQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIoY29tcGlsZXJPcHRpb25zLCB0cnVlLypuZWVkIHRvIHJlc29sdmUgYmluZGluZ3MqLywgdGhpcy5tb25pdG9yKTsKKwkJCQkJCUJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG5ldyBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKHVuaXQuc2NvcGUsIG51bGwsIHRoaXMuYmluZGluZ1RhYmxlcywgKGZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfQklORElOR1NfUkVDT1ZFUlkpICE9IDAsIHRoaXMuZnJvbUphdmFQcm9qZWN0KTsKKwkJCQkJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIocmVzb2x2ZXIpOworCQkJCQkJY29udmVydGVyLnNldEFTVChhc3QpOworCQkJCQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGNvbnZlcnRlci5jb252ZXJ0KHVuaXQsIGNvbnRlbnRzKTsKKwkJCQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRUeXBlUm9vdChudWxsKTsKKwkJCQkJCWNvbXBpbGF0aW9uVW5pdC5zZXRMaW5lRW5kVGFibGUoY29tcGlsYXRpb25SZXN1bHQuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpKTsKKwkJCQkJCWFzdC5zZXREZWZhdWx0Tm9kZUZsYWcoMCk7CisJCQkJCQlhc3Quc2V0T3JpZ2luYWxNb2RpZmljYXRpb25Db3VudChhc3QubW9kaWZpY2F0aW9uQ291bnQoKSk7CisKKwkJCQkJCS8vIHBhc3MgaXQgdG8gcmVxdWVzdG9yCisJCQkJCQlhc3RSZXF1ZXN0b3IuYWNjZXB0QVNUKG5ldyBTdHJpbmcoc291cmNlLmdldEZpbGVOYW1lKCkpLCBjb21waWxhdGlvblVuaXQpOworCisJCQkJCQl3b3JrZWQoMSk7CisKKwkJCQkJCS8vIHJlbW92ZSBhdCB0aGUgZW5kIHNvIHRoYXQgd2UgZG9uJ3QgcmVzb2x2ZSB0d2ljZSBpZiBhIHNvdXJjZSBhbmQgYSBrZXkgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSBoYXZlIGJlZW4gcmVxdWVzdGVkCisJCQkJCQl0aGlzLnJlcXVlc3RlZFNvdXJjZXMucHV0KGZpbGVOYW1lLCBudWxsKTsgLy8gbWFyayBpdCBhcyByZW1vdmVkCisJCQkJCX0KKworCQkJCQkvLyByZXF1ZXN0ZWQgYmluZGluZworCQkJCQlPYmplY3Qga2V5ID0gdGhpcy5yZXF1ZXN0ZWRLZXlzLmdldChmaWxlTmFtZSk7CisJCQkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCQkJaWYgKGtleSBpbnN0YW5jZW9mIEJpbmRpbmdLZXlSZXNvbHZlcikgeworCQkJCQkJCXJlcG9ydEJpbmRpbmcoa2V5LCBhc3RSZXF1ZXN0b3IsIHVuaXQpOworCQkJCQkJCXdvcmtlZCgxKTsKKwkJCQkJCX0gZWxzZSBpZiAoa2V5IGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7CisJCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFycmF5TGlzdCkga2V5KS5pdGVyYXRvcigpOworCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCQkJcmVwb3J0QmluZGluZyhpdGVyYXRvci5uZXh0KCksIGFzdFJlcXVlc3RvciwgdW5pdCk7CisJCQkJCQkJCXdvcmtlZCgxKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIHJlbW92ZSBhdCB0aGUgZW5kIHNvIHRoYXQgd2UgZG9uJ3QgcmVzb2x2ZSB0d2ljZSBpZiBhIHNvdXJjZSBhbmQgYSBrZXkgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSBoYXZlIGJlZW4gcmVxdWVzdGVkCisJCQkJCQl0aGlzLnJlcXVlc3RlZEtleXMucHV0KGZpbGVOYW1lLCBudWxsKTsgLy8gbWFyayBpdCBhcyByZW1vdmVkCisJCQkJCX0KKwkJCQl9IGZpbmFsbHkgeworCQkJCQkvLyBjbGVhbnVwIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0CisJCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJCX0KKwkJCQl0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldID0gbnVsbDsgLy8gcmVsZWFzZSByZWZlcmVuY2UgdG8gcHJvY2Vzc2VkIHVuaXQgZGVjbGFyYXRpb24KKwkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOworCQkJfQorCisJCQkvLyByZW1haW5pbmcgYmluZGluZyBrZXlzCisJCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodGhpcy5sb29rdXBFbnZpcm9ubWVudCwgbnVsbCwgdGhpcy5iaW5kaW5nVGFibGVzLCAoZmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMCwgdHJ1ZSk7CiAJCQlPYmplY3RbXSBrZXlzID0gdGhpcy5yZXF1ZXN0ZWRLZXlzLnZhbHVlVGFibGU7CiAJCQlmb3IgKGludCBqID0gMCwga2V5c0xlbmd0aCA9IGtleXMubGVuZ3RoOyBqIDwga2V5c0xlbmd0aDsgaisrKSB7CiAJCQkJQmluZGluZ0tleVJlc29sdmVyIGtleVJlc29sdmVyID0gKEJpbmRpbmdLZXlSZXNvbHZlcikga2V5c1tqXTsKQEAgLTc3OCw4ICsxMDc4LDMxIEBACiAJCUJpbmRpbmdLZXlSZXNvbHZlciBrZXlSZXNvbHZlciA9IChCaW5kaW5nS2V5UmVzb2x2ZXIpIGtleTsKIAkJQmluZGluZyBjb21waWxlckJpbmRpbmcgPSBrZXlSZXNvbHZlci5nZXRDb21waWxlckJpbmRpbmcoKTsKIAkJaWYgKGNvbXBpbGVyQmluZGluZyAhPSBudWxsKSB7Ci0JCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodW5pdC5zY29wZSwgb3duZXIsIHRoaXMuYmluZGluZ1RhYmxlcywgZmFsc2UpOwotCQkJSUJpbmRpbmcgYmluZGluZyA9IHJlc29sdmVyLmdldEJpbmRpbmcoY29tcGlsZXJCaW5kaW5nKTsKKwkJCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcih1bml0LnNjb3BlLCBvd25lciwgdGhpcy5iaW5kaW5nVGFibGVzLCBmYWxzZSwgdGhpcy5mcm9tSmF2YVByb2plY3QpOworCQkJQW5ub3RhdGlvbkJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBrZXlSZXNvbHZlci5nZXRBbm5vdGF0aW9uQmluZGluZygpOworCQkJSUJpbmRpbmcgYmluZGluZzsKKwkJCWlmIChhbm5vdGF0aW9uQmluZGluZyAhPSBudWxsKSB7CisJCQkJYmluZGluZyA9IHJlc29sdmVyLmdldEFubm90YXRpb25JbnN0YW5jZShhbm5vdGF0aW9uQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWJpbmRpbmcgPSByZXNvbHZlci5nZXRCaW5kaW5nKGNvbXBpbGVyQmluZGluZyk7CisJCQl9CisJCQlpZiAoYmluZGluZyAhPSBudWxsKQorCQkJCWFzdFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nKGtleVJlc29sdmVyLmdldEtleSgpLCBiaW5kaW5nKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCByZXBvcnRCaW5kaW5nKE9iamVjdCBrZXksIEZpbGVBU1RSZXF1ZXN0b3IgYXN0UmVxdWVzdG9yLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJCUJpbmRpbmdLZXlSZXNvbHZlciBrZXlSZXNvbHZlciA9IChCaW5kaW5nS2V5UmVzb2x2ZXIpIGtleTsKKwkJQmluZGluZyBjb21waWxlckJpbmRpbmcgPSBrZXlSZXNvbHZlci5nZXRDb21waWxlckJpbmRpbmcoKTsKKwkJaWYgKGNvbXBpbGVyQmluZGluZyAhPSBudWxsKSB7CisJCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIodW5pdC5zY29wZSwgbnVsbCwgdGhpcy5iaW5kaW5nVGFibGVzLCBmYWxzZSwgdGhpcy5mcm9tSmF2YVByb2plY3QpOworCQkJQW5ub3RhdGlvbkJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBrZXlSZXNvbHZlci5nZXRBbm5vdGF0aW9uQmluZGluZygpOworCQkJSUJpbmRpbmcgYmluZGluZzsKKwkJCWlmIChhbm5vdGF0aW9uQmluZGluZyAhPSBudWxsKSB7CisJCQkJYmluZGluZyA9IHJlc29sdmVyLmdldEFubm90YXRpb25JbnN0YW5jZShhbm5vdGF0aW9uQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWJpbmRpbmcgPSByZXNvbHZlci5nZXRCaW5kaW5nKGNvbXBpbGVyQmluZGluZyk7CisJCQl9CiAJCQlpZiAoYmluZGluZyAhPSBudWxsKQogCQkJCWFzdFJlcXVlc3Rvci5hY2NlcHRCaW5kaW5nKGtleVJlc29sdmVyLmdldEtleSgpLCBiaW5kaW5nKTsKIAkJfQpAQCAtNzk5LDggKzExMjIsMTggQEAKIAkJCQkvLyBidWlsZCBhbmQgcmVjb3JkIHBhcnNlZCB1bml0cwogCQkJCXRoaXMucGFyc2VUaHJlc2hvbGQgPSAwOyAvLyB3aWxsIHJlcXVlc3QgYSBmdWxsIHBhcnNlCiAJCQkJYmVnaW5Ub0NvbXBpbGUobmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdFtdIHsgc291cmNlVW5pdCB9KTsKLQkJCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpCi0JCQkJdW5pdCA9IHRoaXMudW5pdHNUb1Byb2Nlc3NbMF07CisJCQkJLy8gZmluZCB0aGUgcmlnaHQgdW5pdCBmcm9tIHdoYXQgd2FzIGluamVjdGVkIHZpYSBhY2NlcHQoSUNvbXBpbGF0aW9uVW5pdCwuLik6CisJCQkJZm9yIChpbnQgaT0wLCBtYXggPSB0aGlzLnRvdGFsVW5pdHM7IGkgPCBtYXg7IGkrKykgeworCQkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjdXJyZW50Q29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldOworCQkJCQlpZiAoY3VycmVudENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uICE9IG51bGwKKwkJCQkJCQkmJiBjdXJyZW50Q29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0ID09IHNvdXJjZVVuaXQpIHsKKwkJCQkJCXVuaXQgPSBjdXJyZW50Q29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodW5pdCA9PSBudWxsKSB7CisJCQkJCXVuaXQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzWzBdOyAvLyBmYWxsIGJhY2sgdG8gb2xkIGJlaGF2aW9yCisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvLyBpbml0aWFsIHR5cGUgYmluZGluZyBjcmVhdGlvbgogCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCwgbnVsbCAvKm5vIGFjY2VzcyByZXN0cmljdGlvbiovKTsKQEAgLTgyMCwyMCArMTE1MywyOSBAQAogCiAJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlID0gbm9kZVNlYXJjaGVyLmZvdW5kOwogCi0JCQkJCXRoaXMucGFyc2VyLnNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSwgdW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0KIAkJIAkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCS8vIHNhdmUgZXhpc3RpbmcgdmFsdWVzIHRvIHJlc3RvcmUgdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MKKwkJCQkJCS8vIHNlZSBidWcgNDcwNzkgZm9yIG1vcmUgZGV0YWlscworCQkJCQkJaW50W10gb2xkTGluZUVuZHMgPSB0aGlzLnBhcnNlci5zY2FubmVyLmxpbmVFbmRzOworCQkJCQkJaW50IG9sZExpbmVQdHIgPSB0aGlzLnBhcnNlci5zY2FubmVyLmxpbmVQdHI7CisKKwkJCQkJCXRoaXMucGFyc2VyLnNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSwgdW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisKIAkJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIGVuY2xvc2luZ1R5cGVEZWNsYXJhdGlvbiA9IG5vZGVTZWFyY2hlci5lbmNsb3NpbmdUeXBlOwotCQkgIAkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgewogCQkJCQkJCSgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbilub2RlKS5wYXJzZVN0YXRlbWVudHModGhpcy5wYXJzZXIsIHVuaXQpOwotCQkgCQkJCX0gZWxzZSBpZiAoZW5jbG9zaW5nVHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCQkJCX0gZWxzZSBpZiAoZW5jbG9zaW5nVHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXIpIHsKLQkJCSAJCQkJCSgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcikgbm9kZSkucGFyc2VTdGF0ZW1lbnRzKHRoaXMucGFyc2VyLCBlbmNsb3NpbmdUeXBlRGVjbGFyYXRpb24sIHVuaXQpOwotCQkgCQkJCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgewotCQkJCQkJCQkoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKW5vZGUpLnBhcnNlTWV0aG9kKHRoaXMucGFyc2VyLCB1bml0KTsKKwkJCQkJCQkJKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyKSBub2RlKS5wYXJzZVN0YXRlbWVudHModGhpcy5wYXJzZXIsIGVuY2xvc2luZ1R5cGVEZWNsYXJhdGlvbiwgdW5pdCk7CisJCQkJCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHsKKwkJCQkJCQkJKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbilub2RlKS5wYXJzZU1ldGhvZHModGhpcy5wYXJzZXIsIHVuaXQpOwogCQkJCQkJCX0KLQkJIAkJCQl9Ci0JCSAJCQl9CisJCQkJCQl9CisJCQkJCQkvLyB0aGlzIGlzIGRvbmUgdG8gcHJldmVudCBhbnkgc2lkZSBlZmZlY3RzIG9uIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdAorCQkJCQkJLy8gbGluZSBzZXBhcmF0b3IgcG9zaXRpb25zIGFycmF5LgorCQkJCQkJdGhpcy5wYXJzZXIuc2Nhbm5lci5saW5lRW5kcyA9IG9sZExpbmVFbmRzOworCQkJCQkJdGhpcy5wYXJzZXIuc2Nhbm5lci5saW5lUHRyID0gb2xkTGluZVB0cjsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIApAQCAtODUzLDYgKzExOTUsOSBAQAogCiAJCQkJLy8gY29kZSBnZW5lcmF0aW9uCiAJCQkJaWYgKGdlbmVyYXRlQ29kZSkgdW5pdC5nZW5lcmF0ZUNvZGUoKTsKKworCQkJCS8vIGZpbmFsaXplIHByb2JsZW1zIChzdXBwcmVzc1dhcm5pbmdzKQorCQkJCXVuaXQuZmluYWxpemVQcm9ibGVtcygpOwogCQkJfQogCQkJaWYgKHRoaXMudW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCkgdGhpcy51bml0c1RvUHJvY2Vzc1swXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uCiAJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdC5jb21waWxhdGlvblJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOwpAQCAtODk0LDYgKzEyMzksMTkgQEAKIAkJCWdlbmVyYXRlQ29kZSk7CiAJfQogCisJYm9vbGVhbiByZXNvbHZlZFJlcXVlc3RlZFNvdXJjZXNBbmRLZXlzKGludCB1bml0SW5kZXhUb1Byb2Nlc3MpIHsKKwkJaWYgKHVuaXRJbmRleFRvUHJvY2VzcyA8IHRoaXMucmVxdWVzdGVkU291cmNlcy5zaXplKCkgJiYgdW5pdEluZGV4VG9Qcm9jZXNzIDwgdGhpcy5yZXF1ZXN0ZWRLZXlzLnNpemUoKSkKKwkJCXJldHVybiBmYWxzZTsgLy8gbXVzdCBwcm9jZXNzIGF0IGxlYXN0IHRoaXMgbWFueSB1bml0cyBiZWZvcmUgY2hlY2tpbmcgdG8gc2VlIGlmIGFsbCBhcmUgZG9uZQorCisJCU9iamVjdFtdIHNvdXJjZXMgPSB0aGlzLnJlcXVlc3RlZFNvdXJjZXMudmFsdWVUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChzb3VyY2VzW2ldICE9IG51bGwpIHJldHVybiBmYWxzZTsKKwkJT2JqZWN0W10ga2V5cyA9IHRoaXMucmVxdWVzdGVkS2V5cy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQkJaWYgKGtleXNbaV0gIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKIAkvKgogCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBnaXZlbiBjb21waWxhdGlvbiB1bml0LiBDYW4gcnVuIGEgc3Vic2V0IG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQppbmRleCA1NWQ4YWI4Li44NDY5NmM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMzkgKzIxLDQwIEBACiAgKiBDb25kaXRpb25hbEV4cHJlc3Npb246CiAgKiAgICBFeHByZXNzaW9uIDxiPj88L2I+IEV4cHJlc3Npb24gPGI+OjwvYj4gRXhwcmVzc2lvbgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCQorCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgImV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInRoZW5FeHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidGhlbkV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVEhFTl9FWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBUSEVOX0VYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAidGhlbkV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImVsc2VFeHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZWxzZUV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRUxTRV9FWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFTFNFX0VYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAiZWxzZUV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDQpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC02NiwxOCArNjcsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBjb25kaXRpb24gZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKIAkgKiBidXQgbGVnYWwsIGV4cHJlc3Npb24uCkBAIC05NywxMyArOTgsMTMgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gZWxzZUV4cHJlc3Npb24gPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBjb25kaXRpb24sICJ0aGVuIiwgYW5kICJlbHNlIiBleHByZXNzc2lvbnMgYXJlCiAJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDb25kaXRpb25hbEV4cHJlc3Npb24oQVNUIGFzdCkgewpAQCAtMTE2LDcgKzExNyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNjEsNyArMTYyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFRoZW5FeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIGdldFRoZW5FeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CkBAIC0xOTEsMTIgKzE5MiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY29uZGl0aW9uIG9mIHRoaXMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbmRpdGlvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmNvbmRpdGlvbkV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIxMCwxMCArMjExLDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuY29uZGl0aW9uRXhwcmVzc2lvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBjb25kaXRpb24gb2YgdGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGNvbmRpdGlvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjIxLDcgKzIyMiw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMzEsMTIgKzIzMiwxMiBAQAogCQl0aGlzLmNvbmRpdGlvbkV4cHJlc3Npb24gPSBleHByZXNzaW9uOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBleHByZXNzaW9uLCBFWFBSRVNTSU9OX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSAidGhlbiIgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSAidGhlbiIgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldFRoZW5FeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy50aGVuRXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjUwLDEwICsyNTEsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy50aGVuRXhwcmVzc2lvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSAidGhlbiIgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgInRoZW4iIGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI2MSw3ICsyNjIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VGhlbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI3NCw5ICsyNzUsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgImVsc2UiIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbHNlRXhwcmVzc2lvbigpIHsKIAkJaWYgKHRoaXMuZWxzZUV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI5MCwxMCArMjkxLDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZWxzZUV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlICJlbHNlIiBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0zMDEsNyArMzAyLDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEVsc2VFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0zMTksMTIgKzMyMCwxMiBAQAogCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLmNvbmRpdGlvbkV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKIAkJCSsgKHRoaXMudGhlbkV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRUaGVuRXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQppbmRleCAxMzViMTBlLi5mYTcyZmE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsNDcgKzI3LDQ4IEBACiAgKiAgICAgIFsgPGI+Jmx0OzwvYj4gVHlwZSB7IDxiPiw8L2I+IFR5cGUgfSA8Yj4mZ3Q7PC9iPiBdCiAgKgkJICAgICAgPGI+dGhpczwvYj4gPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+LDwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+KTwvYj4gPGI+OzwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBDb25zdHJ1Y3Rvckludm9jYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX0FSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNsYXNzLCAidHlwZUFyZ3VtZW50cyIsIFR5cGUuY2xhc3MsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBBUkdVTUVOVFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBBUkdVTUVOVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKENvbnN0cnVjdG9ySW52b2NhdGlvbi5jbGFzcywgImFyZ3VtZW50cyIsIEV4cHJlc3Npb24uY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEFSR1VNRU5UU19QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnlMaXN0KTsKLQkJCisKIAkJcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KFRZUEVfQVJHVU1FTlRTX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC03OCwxMSArNzksMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC05Myw5ICs5NCw5IEBACiAJCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwogCQl9CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pLiAKKwkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCkBAIC0xMDMsOCArMTA0LDggQEAKIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdHlwZUFyZ3VtZW50cyA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChBUkdVTUVOVFNfUFJPUEVSVFkpOwpAQCAtMTEyLDExICsxMTMsMTEgQEAKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhbHRlcm5hdGUgY29uc3RydWN0b3IgaW52b2NhdGlvbiBzdGF0ZW1lbnQKIAkgKiBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCBhbiBlbXB0eSBsaXN0IG9mIGFyZ3VtZW50cy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlDb25zdHJ1Y3Rvckludm9jYXRpb24oQVNUIGFzdCkgewotCQlzdXBlcihhc3QpOwkKKwkJc3VwZXIoYXN0KTsKIAkJaWYgKGFzdC5hcGlMZXZlbCA+PSBBU1QuSkxTMykgewogCQkJdGhpcy50eXBlQXJndW1lbnRzID0gbmV3IEFTVE5vZGUuTm9kZUxpc3QoVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkpOwogCQl9CkBAIC0xMjgsNyArMTI5LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNTUsNyArMTU2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUNvbnN0cnVjdG9ySW52b2NhdGlvbiByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFMzKSB7CiAJCQlyZXN1bHQudHlwZUFyZ3VtZW50cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHR5cGVBcmd1bWVudHMoKSkpOwpAQCAtMTg1LDE3ICsxODYsMTcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoaXMgY29uc3RydWN0b3IKIAkgKiBpbnZvY2F0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgdHlwZUFyZ3VtZW50cygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy50eXBlQXJndW1lbnRzID09IG51bGwpIHsKQEAgLTIwMywxNCArMjA0LDE0IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMudHlwZUFyZ3VtZW50czsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyBpbiB0aGlzIGFsdGVybmF0ZQogCSAqIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pCisJICovCiAJcHVibGljIExpc3QgYXJndW1lbnRzKCkgewogCQlyZXR1cm4gdGhpcy5hcmd1bWVudHM7CiAJfQpAQCAtMjIyLDEwICsyMjMsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nCiAJICogICAgY2Fubm90IGJlIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZUNvbnN0cnVjdG9yKHRoaXMpOwogCX0KQEAgLTIzNywxMiArMjM4LDEyIEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMudHlwZUFyZ3VtZW50cyA9PSBudWxsID8gMCA6IHRoaXMudHlwZUFyZ3VtZW50cy5saXN0U2l6ZSgpKQogCQkJKyAodGhpcy5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiB0aGlzLmFyZ3VtZW50cy5saXN0U2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YQppbmRleCA4MTU2ODc0Li4wOGE1YmMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnRpbnVlU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db250aW51ZVN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDI1ICsyMSwyNiBAQAogICogQ29udGludWVTdGF0ZW1lbnQ6CiAgKiAgICA8Yj5jb250aW51ZTwvYj4gWyBJZGVudGlmaWVyIF0gPGI+OzwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCQkKKwogCS8qKgotCSAqIFRoZSAibGFiZWwiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJsYWJlbCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBMQUJFTF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTEFCRUxfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQ29udGludWVTdGF0ZW1lbnQuY2xhc3MsICJsYWJlbCIsIFNpbXBsZU5hbWUuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KENvbnRpbnVlU3RhdGVtZW50LmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01MCwzMCArNTEsMzAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgbm9uZSBieSBkZWZhdWx0LgogCSAqLwogCXByaXZhdGUgU2ltcGxlTmFtZSBvcHRpb25hbExhYmVsID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBjb250aW51ZSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGNvbnRpbnVlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGNvbnRpbnVlIHN0YXRlbWVudCBoYXMgbm8gbGFiZWwuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJQ29udGludWVTdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtODYsNyArODcsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwMiw3ICsxMDMsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE1LDcgKzExNiw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlDb250aW51ZVN0YXRlbWVudCByZXN1bHQgPSBuZXcgQ29udGludWVTdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0TGFiZWwoKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRMYWJlbCgpKSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xMzksNDkgKzE0MCw0OSBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGFiZWwgb2YgdGhpcyBjb250aW51ZSBzdGF0ZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogdGhlcmUgaXMgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldExhYmVsKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbExhYmVsOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBsYWJlbCBvZiB0aGlzIGNvbnRpbnVlIHN0YXRlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TGFiZWwoU2ltcGxlTmFtZSBsYWJlbCkgewogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy5vcHRpb25hbExhYmVsOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGxhYmVsLCBMQUJFTF9QUk9QRVJUWSk7CiAJCXRoaXMub3B0aW9uYWxMYWJlbCA9IGxhYmVsOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBsYWJlbCwgTEFCRUxfUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewogCQlyZXR1cm4KIAkJCW1lbVNpemUoKQotCQkJKyAob3B0aW9uYWxMYWJlbCA9PSBudWxsID8gMCA6IGdldExhYmVsKCkudHJlZVNpemUoKSk7CisJCQkrICh0aGlzLm9wdGlvbmFsTGFiZWwgPT0gbnVsbCA/IDAgOiBnZXRMYWJlbCgpLnRyZWVTaXplKCkpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QVNUVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QVNUVmlzaXRvci5qYXZhCmluZGV4IDhhYjkxNTkuLmVkODgzZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdEFTVFZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRBU1RWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMjMgKzEzLDIzIEBACiAgKi8KIGNsYXNzIERlZmF1bHRBU1RWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAJLyoqCi0JICogCisJICoKIAkgKi8KIAlwdWJsaWMgRGVmYXVsdEFTVFZpc2l0b3IoKSB7CiAJCXN1cGVyKCk7CiAJfQotCQorCiAJLyoqCi0JICogCisJICoKIAkgKi8KIAlwdWJsaWMgRGVmYXVsdEFTVFZpc2l0b3IoYm9vbGVhbiB2aXNpdERvY1RhZ3MpIHsKIAkJc3VwZXIodmlzaXREb2NUYWdzKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKIAkJZW5kVmlzaXROb2RlKG5vZGUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gbm9kZSkgewogCQllbmRWaXNpdE5vZGUobm9kZSk7CiAJfQpAQCAtMTY0LDYgKzE2NCw5IEBACiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyIG5vZGUpIHsKIAkJZW5kVmlzaXROb2RlKG5vZGUpOwogCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChNb2RpZmllciBub2RlKSB7CisJCWVuZFZpc2l0Tm9kZShub2RlKTsKKwl9CiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTm9ybWFsQW5ub3RhdGlvbiBub2RlKSB7CiAJCWVuZFZpc2l0Tm9kZShub2RlKTsKIAl9CkBAIC0yNjIsNiArMjY1LDkgQEAKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKIAkJZW5kVmlzaXROb2RlKG5vZGUpOwogCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChVbmlvblR5cGUgbm9kZSkgeworCQllbmRWaXNpdE5vZGUobm9kZSk7CisJfQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKIAkJZW5kVmlzaXROb2RlKG5vZGUpOwogCX0KQEAgLTM4OSw3ICszOTUsNyBAQAogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChKYXZhZG9jIG5vZGUpIHsKIAkJLy8JZG8gbm90IHZpc2l0IEphdmFkb2MgdGFncyBieSBkZWZhdWx0LiBVc2UgY29uc3RydWN0b3Igd2l0aCBib29sZWFuIHRvIGVuYWJsZS4KLQkJaWYgKHN1cGVyLnZpc2l0KG5vZGUpKSB7IAorCQlpZiAoc3VwZXIudmlzaXQobm9kZSkpIHsKIAkJCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwpAQCAtNDE4LDYgKzQyNCw5IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKIAkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKIAl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTW9kaWZpZXIgbm9kZSkgeworCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewogCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwogCX0KQEAgLTQ0NSw3ICs0NTQsNyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewogCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewogCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwogCX0KQEAgLTUzNSw2ICs1NDQsMTAgQEAKIAkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKIAl9CiAKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChVbmlvblR5cGUgbm9kZSkgeworCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAJCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQppbmRleCBjNWJlOTFmLi5mY2I1ZWI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9uIGZvciBCdWcgMzQyNjcxIC0gQ2xhc3NDYXN0RXhjZXB0aW9uOiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nIGNhbm5vdCBiZSBjYXN0IHRvIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01Nyw5ICs1OCwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgogICogSW50ZXJuYWwgY2xhc3MgZm9yIHJlc29sdmluZyBiaW5kaW5ncyB1c2luZyBvbGQgQVNUcy4KQEAgLTExNCw3ICsxMTcsMTAgQEAKIAogCS8qKgogCSAqIFRoaXMgbWFwIGlzIHVzZWQgdG8gcmV0cmlldmUgYW4gb2xkIGFzdCBub2RlIHVzaW5nIHRoZSBuZXcgYXN0IG5vZGUuIFRoaXMgaXMgbm90IGFuCi0JICogaWRlbnRpdHkgbWFwLgorCSAqIGlkZW50aXR5IG1hcCwgYXMgc2V2ZXJhbCBuZXN0ZWQgRE9NIG5vZGVzIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgImxhcmdlciIKKwkgKiBjb21waWxlciBBU1Qgbm9kZS4KKwkgKiBFLmcuLCBhbiBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uICJuZXcgTXlUeXBlWzFdIiB3aWxsIGFwcGVhciBhcyB0aGUgcmlnaHQtaGFuZCB2YWx1ZQorCSAqIGZvciB0aGUgU2ltcGxlVHlwZSAiTXlUeXBlIiwgdGhlIEFycmF5VHlwZSAiTXlUeXBlWzFdIiwgYW5kIHRoZSBBcnJheUNyZWF0aW9uICJuZXcgTXlUeXBlWzFdIi4KIAkgKi8KIAlNYXAgbmV3QXN0VG9PbGRBc3Q7CiAKQEAgLTEyOCwyOSArMTM0LDM5IEBACiAJICovCiAJV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyOwogCi0JYm9vbGVhbiBpc1JlY292ZXJlZEJpbmRpbmc7Ci0KKwkvKioKKwkgKiBUb2dnbGUgY29udHJvbGxpbmcgd2hldGhlciBET00gYmluZGluZ3Mgc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBtaXNzaW5nIGludGVybmFsIGNvbXBpbGVyIGJpbmRpbmdzLi4KKwkgKi8KKwlib29sZWFuIGlzUmVjb3ZlcmluZ0JpbmRpbmdzOworCQorCS8qKgorCSAqIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbml0aWFsaXplZCBmcm9tIGEgamF2YSBwcm9qZWN0CisJICovCisJYm9vbGVhbiBmcm9tSmF2YVByb2plY3Q7CisJCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuCiAJICovCi0JRGVmYXVsdEJpbmRpbmdSZXNvbHZlcihDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSwgV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyLCBCaW5kaW5nVGFibGVzIGJpbmRpbmdUYWJsZXMsIGJvb2xlYW4gaXNSZWNvdmVyZWRCaW5kaW5nKSB7CisJRGVmYXVsdEJpbmRpbmdSZXNvbHZlcihDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSwgV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyLCBCaW5kaW5nVGFibGVzIGJpbmRpbmdUYWJsZXMsIGJvb2xlYW4gaXNSZWNvdmVyaW5nQmluZGluZ3MsIGJvb2xlYW4gZnJvbUphdmFQcm9qZWN0KSB7CiAJCXRoaXMubmV3QXN0VG9PbGRBc3QgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmFzdE5vZGVzVG9CbG9ja1Njb3BlID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmJpbmRpbmdUYWJsZXMgPSBiaW5kaW5nVGFibGVzOwogCQl0aGlzLnNjb3BlID0gc2NvcGU7CiAJCXRoaXMud29ya2luZ0NvcHlPd25lciA9IHdvcmtpbmdDb3B5T3duZXI7Ci0JCXRoaXMuaXNSZWNvdmVyZWRCaW5kaW5nID0gaXNSZWNvdmVyZWRCaW5kaW5nOworCQl0aGlzLmlzUmVjb3ZlcmluZ0JpbmRpbmdzID0gaXNSZWNvdmVyaW5nQmluZGluZ3M7CisJCXRoaXMuZnJvbUphdmFQcm9qZWN0ID0gZnJvbUphdmFQcm9qZWN0OwogCX0KIAotCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwgQmluZGluZ1RhYmxlcyBiaW5kaW5nVGFibGVzLCBib29sZWFuIGlzUmVjb3ZlcmVkQmluZGluZykgeworCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwgQmluZGluZ1RhYmxlcyBiaW5kaW5nVGFibGVzLCBib29sZWFuIGlzUmVjb3ZlcmluZ0JpbmRpbmdzLCBib29sZWFuIGZyb21KYXZhUHJvamVjdCkgewogCQl0aGlzLm5ld0FzdFRvT2xkQXN0ID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5hc3ROb2Rlc1RvQmxvY2tTY29wZSA9IG5ldyBIYXNoTWFwKCk7CiAJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5iaW5kaW5nVGFibGVzID0gYmluZGluZ1RhYmxlczsKIAkJdGhpcy5zY29wZSA9IG5ldyBDb21waWxhdGlvblVuaXRTY29wZShuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24obnVsbCwgbnVsbCwgLTEpLCBsb29rdXBFbnZpcm9ubWVudCk7CiAJCXRoaXMud29ya2luZ0NvcHlPd25lciA9IHdvcmtpbmdDb3B5T3duZXI7Ci0JCXRoaXMuaXNSZWNvdmVyZWRCaW5kaW5nID0gaXNSZWNvdmVyZWRCaW5kaW5nOworCQl0aGlzLmlzUmVjb3ZlcmluZ0JpbmRpbmdzID0gaXNSZWNvdmVyaW5nQmluZGluZ3M7CisJCXRoaXMuZnJvbUphdmFQcm9qZWN0ID0gZnJvbUphdmFQcm9qZWN0OwogCX0KIAogCS8qCkBAIC0yMDUsNiArMjIxLDE1IEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCVV0aWwuQmluZGluZ3NUb05vZGVzTWFwIGdldEJpbmRpbmdzVG9Ob2Rlc01hcCgpIHsKKwkJcmV0dXJuIG5ldyBVdGlsLkJpbmRpbmdzVG9Ob2Rlc01hcCgpIHsKKwkJCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgZ2V0KEJpbmRpbmcgYmluZGluZykgeworCQkJCXJldHVybiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlKQorCQkJCQlEZWZhdWx0QmluZGluZ1Jlc29sdmVyLnRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIudGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMuZ2V0KGJpbmRpbmcpKTsKKwkJCX0KKwkJfTsKKwl9CisKIAlzeW5jaHJvbml6ZWQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlIGdldENvcnJlc3BvbmRpbmdOb2RlKEFTVE5vZGUgY3VycmVudE5vZGUpIHsKIAkJcmV0dXJuIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGN1cnJlbnROb2RlKTsKIAl9CkBAIC0yMjAsNiArMjQ1LDkgQEAKICAJCX0KIAogCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCQlpZiAoIXRoaXMuaXNSZWNvdmVyaW5nQmluZGluZ3MgJiYgKChtZXRob2RCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IChJTWV0aG9kQmluZGluZykgdGhpcy5iaW5kaW5nVGFibGVzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChtZXRob2RCaW5kaW5nKTsKIAkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gYmluZGluZzsKQEAgLTIzMiw3ICsyNjAsNyBAQAogCX0KIAogCXN5bmNocm9uaXplZCBJTWVtYmVyVmFsdWVQYWlyQmluZGluZyBnZXRNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nKEVsZW1lbnRWYWx1ZVBhaXIgdmFsdWVQYWlyKSB7Ci0JCWlmICh2YWx1ZVBhaXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWlmICh2YWx1ZVBhaXIgPT0gbnVsbCB8fCB2YWx1ZVBhaXIuYmluZGluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJSU1lbWJlclZhbHVlUGFpckJpbmRpbmcgYmluZGluZyA9CiAJCQkoSU1lbWJlclZhbHVlUGFpckJpbmRpbmcpIHRoaXMuYmluZGluZ1RhYmxlcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQodmFsdWVQYWlyKTsKIAkJaWYgKGJpbmRpbmcgIT0gbnVsbCkKQEAgLTI0Niw3ICsyNzQsNyBAQAogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCiAJICovCiAJc3luY2hyb25pemVkIElQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7Ci0JCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8ICFwYWNrYWdlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlJUGFja2FnZUJpbmRpbmcgYmluZGluZyA9IChJUGFja2FnZUJpbmRpbmcpIHRoaXMuYmluZGluZ1RhYmxlcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQocGFja2FnZUJpbmRpbmcpOwpAQCAtMzIyLDcgKzM1MCw3IEBACiAJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQgOgogCQkJCQlpZiAocmVmZXJlbmNlQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CiAJCQkJCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBwcm9ibGVtUmVmZXJlbmNlQmluZGluZyA9IChQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgcmVmZXJlbmNlQmluZGluZzsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZzIgPSBwcm9ibGVtUmVmZXJlbmNlQmluZGluZy5jbG9zZXN0TWF0Y2goKTsKKwkJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgYmluZGluZzIgPSBwcm9ibGVtUmVmZXJlbmNlQmluZGluZy5jbG9zZXN0TWF0Y2goKTsKIAkJCQkJCUlUeXBlQmluZGluZyBiaW5kaW5nID0gKElUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nVGFibGVzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChiaW5kaW5nMik7CiAJCQkJCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CiAJCQkJCQkJcmV0dXJuIGJpbmRpbmc7CkBAIC0zMzMsMTggKzM2MSwyNiBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQgOgotCQkJCQlpZiAodGhpcy5pc1JlY292ZXJlZEJpbmRpbmcpIHsKLQkJCQkJCUlUeXBlQmluZGluZyBiaW5kaW5nID0gKElUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nVGFibGVzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChyZWZlcmVuY2VCaW5kaW5nKTsKLQkJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gYmluZGluZzsKLQkJCQkJCX0KLQkJCQkJCWJpbmRpbmcgPSBuZXcgUmVjb3ZlcmVkVHlwZUJpbmRpbmcodGhpcywgcmVmZXJlbmNlQmluZGluZyk7Ci0JCQkJCQl0aGlzLmJpbmRpbmdUYWJsZXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KHJlZmVyZW5jZUJpbmRpbmcsIGJpbmRpbmcpOworCQkJCQlpZiAoIXRoaXMuaXNSZWNvdmVyaW5nQmluZGluZ3MpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJCUlUeXBlQmluZGluZyBiaW5kaW5nID0gKElUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nVGFibGVzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChyZWZlcmVuY2VCaW5kaW5nKTsKKwkJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewogCQkJCQkJcmV0dXJuIGJpbmRpbmc7CiAJCQkJCX0KKwkJCQkJaWYgKChyZWZlcmVuY2VCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwKSB7CisJCQkJCQliaW5kaW5nID0gbmV3IFR5cGVCaW5kaW5nKHRoaXMsIHJlZmVyZW5jZUJpbmRpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYmluZGluZyA9IG5ldyBSZWNvdmVyZWRUeXBlQmluZGluZyh0aGlzLCByZWZlcmVuY2VCaW5kaW5nKTsKKwkJCQkJfQorCQkJCQl0aGlzLmJpbmRpbmdUYWJsZXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KHJlZmVyZW5jZUJpbmRpbmcsIGJpbmRpbmcpOworCQkJCQlyZXR1cm4gYmluZGluZzsKIAkJCX0KIAkJCXJldHVybiBudWxsOwogCQl9IGVsc2UgeworCQkJaWYgKChyZWZlcmVuY2VCaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwICYmICF0aGlzLmlzUmVjb3ZlcmluZ0JpbmRpbmdzKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IChJVHlwZUJpbmRpbmcpIHRoaXMuYmluZGluZ1RhYmxlcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQocmVmZXJlbmNlQmluZGluZyk7CiAJCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIGJpbmRpbmc7CkBAIC0zNjYsNyArNDAyLDcgQEAKIAl9CiAKIAlzeW5jaHJvbml6ZWQgSVZhcmlhYmxlQmluZGluZyBnZXRWYXJpYWJsZUJpbmRpbmcob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuaXNSZWNvdmVyZWRCaW5kaW5nKSB7CisJCWlmICh0aGlzLmlzUmVjb3ZlcmluZ0JpbmRpbmdzKSB7CiAJCQlpZiAodmFyaWFibGVCaW5kaW5nICE9IG51bGwpIHsKIAkJCQlpZiAodmFyaWFibGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZ1RhYmxlcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQodmFyaWFibGVCaW5kaW5nKTsKQEAgLTQxOSw5ICs0NTUsMTMgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCXN5bmNocm9uaXplZCBJVmFyaWFibGVCaW5kaW5nIGdldFZhcmlhYmxlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcpIHsKLSAJCWlmICh2YXJpYWJsZUJpbmRpbmcgIT0gbnVsbCkgewotCSAJCWlmICh2YXJpYWJsZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCSAJCQlpZiAodmFyaWFibGVCaW5kaW5nLnR5cGUgIT0gbnVsbCkgeworCQlpZiAodmFyaWFibGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCWlmICh2YXJpYWJsZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgdmFyaWFibGVUeXBlID0gdmFyaWFibGVCaW5kaW5nLnR5cGU7CisJCQkJaWYgKHZhcmlhYmxlVHlwZSAhPSBudWxsKSB7CisJCQkJCWlmICghdGhpcy5pc1JlY292ZXJpbmdCaW5kaW5ncyAmJiAoKHZhcmlhYmxlVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CiAJCQkJCUlWYXJpYWJsZUJpbmRpbmcgYmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmdUYWJsZXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHZhcmlhYmxlQmluZGluZyk7CiAJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKIAkJCQkJCXJldHVybiBiaW5kaW5nOwpAQCAtNDI5LDggKzQ2OSw4IEBACiAJCQkJCWJpbmRpbmcgPSBuZXcgVmFyaWFibGVCaW5kaW5nKHRoaXMsIHZhcmlhYmxlQmluZGluZyk7CiAJCQkJCXRoaXMuYmluZGluZ1RhYmxlcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQodmFyaWFibGVCaW5kaW5nLCBiaW5kaW5nKTsKIAkJCQkJcmV0dXJuIGJpbmRpbmc7Ci0JIAkJCX0KLQkgCQl9IGVsc2UgeworCQkJCX0KKwkJCX0gZWxzZSB7CiAJCQkJLyoKIAkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDQ5CiAJCQkJICovCkBAIC00NTQsMTMgKzQ5NCwxOSBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQotCSAJCX0KLSAJCX0KKwkJCX0KKwkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlzeW5jaHJvbml6ZWQgSUFubm90YXRpb25CaW5kaW5nIGdldEFubm90YXRpb25JbnN0YW5jZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nIGludGVybmFsSW5zdGFuY2UpIHsKIAkJaWYgKGludGVybmFsSW5zdGFuY2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCVJlZmVyZW5jZUJpbmRpbmcgYW5ub3RhdGlvblR5cGUgPSBpbnRlcm5hbEluc3RhbmNlLmdldEFubm90YXRpb25UeXBlKCk7CisJCWlmICghdGhpcy5pc1JlY292ZXJpbmdCaW5kaW5ncykgeworCQkJaWYgKGFubm90YXRpb25UeXBlID09IG51bGwgfHwgKChhbm5vdGF0aW9uVHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNNaXNzaW5nVHlwZSkgIT0gMCkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQogCQlJQW5ub3RhdGlvbkJpbmRpbmcgZG9tSW5zdGFuY2UgPQogCQkJKElBbm5vdGF0aW9uQmluZGluZykgdGhpcy5iaW5kaW5nVGFibGVzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChpbnRlcm5hbEluc3RhbmNlKTsKIAkJaWYgKGRvbUluc3RhbmNlICE9IG51bGwpCkBAIC00OTYsNiArNTQyLDE1IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwlib29sZWFuIGlzUmVzb2x2ZWRUeXBlSW5mZXJyZWRGcm9tRXhwZWN0ZWRUeXBlKENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24pIHsKKwkJT2JqZWN0IG9sZE5vZGUgPSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChjbGFzc0luc3RhbmNlQ3JlYXRpb24pOworCQlpZiAob2xkTm9kZSBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbikgb2xkTm9kZTsKKwkJCXJldHVybiBhbGxvY2F0aW9uRXhwcmVzc2lvbi5pbmZlcnJlZFJldHVyblR5cGU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KIAkgKi8KQEAgLTUxNSw3ICs1NzAsNyBAQAogCSAqLwogCWJvb2xlYW4gcmVzb2x2ZUJveGluZyhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikpIHsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24pIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBjb21waWxlckV4cHJlc3Npb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uKSBub2RlOwogCQkJcmV0dXJuIChjb21waWxlckV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5CT1hJTkcpICE9IDA7CiAJCX0KQEAgLTUyNyw3ICs1ODIsNyBAQAogCSAqLwogCWJvb2xlYW4gcmVzb2x2ZVVuYm94aW5nKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQlpZiAobm9kZSAhPSBudWxsICYmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uKSkgeworCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgewogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGNvbXBpbGVyRXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24pIG5vZGU7CiAJCQlyZXR1cm4gKGNvbXBpbGVyRXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gJiBUeXBlSWRzLlVOQk9YSU5HKSAhPSAwOwogCQl9CkBAIC01MzksNyArNTk0LDcgQEAKIAkgKi8KIAlPYmplY3QgcmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQlpZiAobm9kZSAhPSBudWxsICYmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uKSkgeworCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgewogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGNvbXBpbGVyRXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24pIG5vZGU7CiAJCQlDb25zdGFudCBjb25zdGFudCA9IGNvbXBpbGVyRXhwcmVzc2lvbi5jb25zdGFudDsKIAkJCWlmIChjb25zdGFudCAhPSBudWxsICYmIGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewpAQCAtNTY3LDkgKzYyMiw5IEBACiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CiAJCWlmIChub2RlICE9IG51bGwgJiYgKG5vZGUuYml0cyAmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kQmluZGluZyhhbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLmJpbmRpbmcpOworCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoYW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbi5iaW5kaW5nKTsKIAkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLQkJCXJldHVybiB0aGlzLmdldE1ldGhvZEJpbmRpbmcoKChBbGxvY2F0aW9uRXhwcmVzc2lvbilub2RlKS5iaW5kaW5nKTsKKwkJCXJldHVybiBnZXRNZXRob2RCaW5kaW5nKCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pbm9kZSkuYmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNTgxLDcgKzYzNiw3IEBACiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CiAJCWlmIChub2RlIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKIAkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBub2RlOwotCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kQmluZGluZyhleHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKTsKKwkJCXJldHVybiBnZXRNZXRob2RCaW5kaW5nKGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmJpbmRpbmcpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTU5NSw3ICs2NTAsNyBAQAogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSBub2RlOwogCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpID09IEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UICYmIGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewogCQkJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gKEFsbG9jYXRpb25FeHByZXNzaW9uKSBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uOwotCQkJCXJldHVybiB0aGlzLmdldE1ldGhvZEJpbmRpbmcoYWxsb2NhdGlvbkV4cHJlc3Npb24uYmluZGluZyk7CisJCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoYWxsb2NhdGlvbkV4cHJlc3Npb24uYmluZGluZyk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CkBAIC02MDgsNyArNjYzLDcgQEAKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKIAkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgewogCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIG5vZGU7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmJpbmRpbmcpOworCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuYmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNjI3LDcgKzY4Miw3IEBACiAJCQkJCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewogCQkJCQkJCXJldHVybiB0eXBlQmluZGluZzsKIAkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKKwkJCQkJfSBlbHNlIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKIAkJCQkJCS8vIHNob3VsZCBiZSBhbiBBbGxvY2F0aW9uRXhwcmVzc2lvbgogCQkJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24gPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7CiAJCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhhbGxvY2F0aW9uRXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUpOwpAQCAtNjM1LDcgKzY5MCw3IEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRSA6CiAJCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FIDoKLQkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZVR5cGVCaW5kaW5nRm9yTmFtZSgoTmFtZSkgZXhwcmVzc2lvbik7CisJCQkJCXJldHVybiByZXNvbHZlVHlwZUJpbmRpbmdGb3JOYW1lKChOYW1lKSBleHByZXNzaW9uKTsKIAkJCQljYXNlIEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIgOgogCQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9DUkVBVElPTiA6CiAJCQkJY2FzZSBBU1ROb2RlLkFTU0lHTk1FTlQgOgpAQCAtNjY5LDcgKzcyNCwxMCBAQAogCQkJCWNhc2UgQVNUTm9kZS5DSEFSQUNURVJfTElURVJBTCA6CiAJCQkJY2FzZSBBU1ROb2RlLk5VTUJFUl9MSVRFUkFMIDoKIAkJCQkJTGl0ZXJhbCBsaXRlcmFsID0gKExpdGVyYWwpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhsaXRlcmFsLmxpdGVyYWxUeXBlKG51bGwpKTsKKwkJCQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcobGl0ZXJhbC5saXRlcmFsVHlwZShudWxsKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBBU1ROb2RlLlRISVNfRVhQUkVTU0lPTiA6CiAJCQkJCVRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSA9IChUaGlzUmVmZXJlbmNlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKIAkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHRoaXMuYXN0Tm9kZXNUb0Jsb2NrU2NvcGUuZ2V0KGV4cHJlc3Npb24pOwpAQCAtNjc5LDcgKzczNyw3IEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04gOgogCQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUV4cHJlc3Npb25UeXBlKHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSk7CisJCQkJCXJldHVybiByZXNvbHZlRXhwcmVzc2lvblR5cGUocGFyZW50aGVzaXplZEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpKTsKIAkJCQljYXNlIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUkVTU0lPTiA6CiAJCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSBleHByZXNzaW9uOwogCQkJCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5nZXRUeXBlKCk7CkBAIC03MzgsNyArNzk2LDcgQEAKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlmICgoYmluZGluZy5raW5kKCkgJiBCaW5kaW5nLlBBQ0tBR0UpICE9IDApIHsKLQkJCQkJCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgYmluZGluZyk7CisJCQkJCQkJCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKTsKIAkJCQkJCQkJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwpIHsKIAkJCQkJCQkJCXJldHVybiBudWxsOwogCQkJCQkJCQl9CkBAIC03NjUsNyArODIzLDcgQEAKIAkJCQkJCQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZyA9PSBudWxsID8gbnVsbCA6IHZhcmlhYmxlQmluZGluZzsKIAkJCQkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcpIHsKIAkJCQkJCQkJLy8gaXQgaXMgYSB0eXBlCi0JCQkJCQkJCXJldHVybiB0aGlzLmdldE1ldGhvZEJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyliaW5kaW5nKTsKKwkJCQkJCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyliaW5kaW5nKTsKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgewpAQCAtNzkxLDcgKzg0OSw3IEBACiAJCU9iamVjdCBvbGROb2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZGVjbGFyYXRpb24pOwogCQlpZiAob2xkTm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKIAkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgb2xkTm9kZTsKLQkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSB0aGlzLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gZ2V0TWV0aG9kQmluZGluZyhtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nKTsKIAkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KQEAgLTgxMiw3ICs4NzAsNyBAQAogCQlPYmplY3Qgb2xkTm9kZSA9IHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KG1ldGhvZCk7CiAJCWlmIChvbGROb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgewogCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBvbGROb2RlOwotCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHRoaXMuZ2V0TWV0aG9kQmluZGluZyhtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBnZXRNZXRob2RCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcpOwogCQkJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgewogCQkJCXJldHVybiBudWxsOwogCQkJfQpAQCAtODMyLDcgKzg5MCw3IEBACiAJCU9iamVjdCBvbGROb2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobWV0aG9kKTsKIAkJaWYgKG9sZE5vZGUgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgewogCQkJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIG9sZE5vZGU7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKG1lc3NhZ2VTZW5kLmJpbmRpbmcpOworCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcobWVzc2FnZVNlbmQuYmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtODQzLDcgKzkwMSw3IEBACiAJCU9iamVjdCBvbGROb2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobWV0aG9kKTsKIAkJaWYgKG9sZE5vZGUgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgewogCQkJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIG9sZE5vZGU7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKG1lc3NhZ2VTZW5kLmJpbmRpbmcpOworCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcobWVzc2FnZVNlbmQuYmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtOTkwLDcgKzEwNDgsNyBAQAogCQkJfQogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CiAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQlJTWV0aG9kQmluZGluZyBtZXRob2QgPSB0aGlzLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQlJTWV0aG9kQmluZGluZyBtZXRob2QgPSBnZXRNZXRob2RCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcpOwogCQkJaWYgKG1ldGhvZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJCXJldHVybiBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgewpAQCAtMTA4NCw3ICsxMTQyLDcgQEAKIAkJCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDI5OQogCQkJCX0KIAkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0UGFja2FnZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpYmluZGluZyk7CisJCQkJCXJldHVybiBnZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKIAkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CiAJCQkJCS8vIGl0IGlzIGEgdHlwZQogCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKQEAgLTExNjAsNyArMTIxOCw3IEBACiAJCQkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMzU3CiAJCQkJCX0KIAkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKKwkJCQkJCXJldHVybiBnZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKIAkJCQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgewogCQkJCQkJLy8gaXQgaXMgYSB0eXBlCiAJCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKQEAgLTExOTAsNyArMTI0OCw3IEBACiAJCQkJfQogCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKIAkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKKwkJCQkJCXJldHVybiBnZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKIAkJCQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgewogCQkJCQkJLy8gaXQgaXMgYSB0eXBlCiAJCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKQEAgLTExOTksNyArMTI1Nyw3IEBACiAJCQkJCQlyZXR1cm4gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nKWJpbmRpbmcpOwogCQkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcpIHsKIAkJCQkJCS8vIGl0IGlzIGEgdHlwZQotCQkJCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nKWJpbmRpbmcpOworCQkJCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyliaW5kaW5nKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXJldHVybiBudWxsOwogCQkJCQl9CkBAIC0xMjIwLDcgKzEyNzgsNyBAQAogCQkJfQogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CiAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gdGhpcy5nZXRNZXRob2RCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcpOworCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGdldE1ldGhvZEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7CiAJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CiAJCQl9CkBAIC0xMjY3LDcgKzEzMjUsNyBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQotCSAJCQl9CisJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgewogCQkJUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgPSAoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIG5vZGU7CkBAIC0xMjgzLDE3ICsxMzQxLDE4IEBACiAJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7CiAJCQlyZXR1cm4gZ2V0VmFyaWFibGVCaW5kaW5nKCgoRmllbGRSZWZlcmVuY2UpIG5vZGUpLmJpbmRpbmcpOwogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJCQkJSmF2YWRvY1NpbmdsZVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IChKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgbm9kZTsKKwkJCQlpZiAodHlwZVJlZi5wYWNrYWdlQmluZGluZyAhPSBudWxsKSB7CisJCQkJCXJldHVybiBnZXRQYWNrYWdlQmluZGluZyh0eXBlUmVmLnBhY2thZ2VCaW5kaW5nKTsKKwkJCQl9CisJCQl9CiAJCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UgPSAoU2luZ2xlVHlwZVJlZmVyZW5jZSkgbm9kZTsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgYmluZGluZyA9IHNpbmdsZVR5cGVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlOwotCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpICYmIG5vZGUgaW5zdGFuY2VvZiBKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSkgewotCQkJCQlKYXZhZG9jU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKEphdmFkb2NTaW5nbGVUeXBlUmVmZXJlbmNlKSBub2RlOwotCQkJCQlpZiAodHlwZVJlZi5wYWNrYWdlQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0UGFja2FnZUJpbmRpbmcodHlwZVJlZi5wYWNrYWdlQmluZGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSgpKTsKKwkJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKSk7CiAJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgewogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSBub2RlOwogCQkJcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKGZpZWxkRGVjbGFyYXRpb24uYmluZGluZyk7CkBAIC0xMzMzLDcgKzEzOTIsNyBAQAogCQkJCQkJYmluZGluZyA9IHJlZmVyZW5jZUJpbmRpbmcuZlBhY2thZ2U7CiAJCQkJCX0KIAkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSB7Ci0JCQkJCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCQkJCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKTsKIAkJCQkJCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsKSB7CiAJCQkJCQkJcmV0dXJuIG51bGw7CiAJCQkJCQl9CkBAIC0xMzYyLDggKzE0MjEsNyBAQAogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHJlZik7CiAJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgewogCQkJcmV0dXJuIGdldFR5cGVCaW5kaW5nKGV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlKTsKLQkJfQotCQllbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSmF2YWRvY0ZpZWxkUmVmZXJlbmNlKSB7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEphdmFkb2NGaWVsZFJlZmVyZW5jZSkgewogCQkJSmF2YWRvY0ZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmID0gKEphdmFkb2NGaWVsZFJlZmVyZW5jZSkgZXhwcmVzc2lvbjsKIAkJCWlmIChmaWVsZFJlZi5tZXRob2RCaW5kaW5nICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gZ2V0TWV0aG9kQmluZGluZyhmaWVsZFJlZi5tZXRob2RCaW5kaW5nKTsKQEAgLTEzNzksNyArMTQzNywxMCBAQAogCSAqLwogCXN5bmNocm9uaXplZCBJTWVtYmVyVmFsdWVQYWlyQmluZGluZyByZXNvbHZlTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7CiAJCU1lbWJlclZhbHVlUGFpciB2YWx1ZVBhaXIgPSAoTWVtYmVyVmFsdWVQYWlyKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChtZW1iZXJWYWx1ZVBhaXIpOwotCQlyZXR1cm4gZ2V0TWVtYmVyVmFsdWVQYWlyQmluZGluZyh2YWx1ZVBhaXIuY29tcGlsZXJFbGVtZW50UGFpcik7CisJCWlmICh2YWx1ZVBhaXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldE1lbWJlclZhbHVlUGFpckJpbmRpbmcodmFsdWVQYWlyLmNvbXBpbGVyRWxlbWVudFBhaXIpOworCQl9CisJCXJldHVybiBudWxsOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTEzODksMTAgKzE0NTAsMTAgQEAKIAlzeW5jaHJvbml6ZWQgSUJpbmRpbmcgcmVzb2x2ZVJlZmVyZW5jZShNZXRob2RSZWYgcmVmKSB7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQocmVmKTsKIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBKYXZhZG9jTWVzc2FnZVNlbmQpIHsKLQkJCXJldHVybiB0aGlzLmdldE1ldGhvZEJpbmRpbmcoKChKYXZhZG9jTWVzc2FnZVNlbmQpZXhwcmVzc2lvbikuYmluZGluZyk7CisJCQlyZXR1cm4gZ2V0TWV0aG9kQmluZGluZygoKEphdmFkb2NNZXNzYWdlU2VuZClleHByZXNzaW9uKS5iaW5kaW5nKTsKIAkJfQogCQllbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKCgoSmF2YWRvY0FsbG9jYXRpb25FeHByZXNzaW9uKWV4cHJlc3Npb24pLmJpbmRpbmcpOworCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcoKChKYXZhZG9jQWxsb2NhdGlvbkV4cHJlc3Npb24pZXhwcmVzc2lvbikuYmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMTQ2NywyOSArMTUyOCw0MSBAQAogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHR5cGUpOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwogCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CiAgCQkJCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSAoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIG5vZGU7Ci0gCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlUmVmZXJlbmNlLnJlc29sdmVkVHlwZTsKLSAJCQkJaW50IGluZGV4OwotIAkJCQlpZiAodHlwZS5pc1F1YWxpZmllZFR5cGUoKSkgewotIAkJCQkJaW5kZXggPSAoKFF1YWxpZmllZFR5cGUpIHR5cGUpLmluZGV4OwotIAkJCQl9IGVsc2UgaWYgKHR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0gCQkJCQlpbmRleCA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGUpLmluZGV4OwotIAkJCQl9IGVsc2UgewotIAkJCQkJaW5kZXggPSAxOwotIAkJCQl9Ci0gCQkJCWZpbmFsIGludCBudW1iZXJPZlR5cGVBcmd1bWVudHNOb3ROdWxsID0gZ2V0VHlwZUFyZ3VtZW50cyh0eXBlUmVmZXJlbmNlKTsKLSAJCQkJaWYgKGluZGV4ICE9IG51bWJlck9mVHlwZUFyZ3VtZW50c05vdE51bGwpIHsKLQkgCQkJCWludCAgaSA9IG51bWJlck9mVHlwZUFyZ3VtZW50c05vdE51bGw7Ci0JIAkJCQl3aGlsZSAoaSAhPSBpbmRleCkgewotCSAJCQkJCXR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOwotCSAJCQkJCWkgLS07Ci0JIAkJCQl9Ci0JIAkJCQliaW5kaW5nID0gdHlwZUJpbmRpbmc7Ci0gCQkJCX0gZWxzZSB7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlOworCQkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQkJaWYgKHRoaXMuc2NvcGUgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJCQkJcmV0dXJuIGdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuY3JlYXRlQXJyYXlUeXBlKGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSwgYXJyYXlUeXBlLmdldERpbWVuc2lvbnMoKSkpOworCQkJCX0KKwkJCQlpZiAodHlwZUJpbmRpbmcuaXNBcnJheVR5cGUoKSkgeworCQkJCQkvLyAndHlwZUJpbmRpbmcnIGNhbiBzdGlsbCBiZSBhbiBhcnJheSB0eXBlIGJlY2F1c2UgJ25vZGUnIG1heSBiZSAibGFyZ2VyIiB0aGFuICd0eXBlJyAoc2VlIGNvbW1lbnQgb2YgbmV3QXN0VG9PbGRBc3QpLgorCQkJCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKSB0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7CisJCQkJfQorCQkJCWludCBpbmRleDsKKwkJCQlpZiAodHlwZS5pc1F1YWxpZmllZFR5cGUoKSkgeworCQkJCQlpbmRleCA9ICgoUXVhbGlmaWVkVHlwZSkgdHlwZSkuaW5kZXg7CisJCQkJfSBlbHNlIGlmICh0eXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgeworCQkJCQlpbmRleCA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGUpLmluZGV4OworCQkJCX0gZWxzZSB7CisJCQkJCWluZGV4ID0gMTsKKwkJCQl9CisJCQkJZmluYWwgaW50IG51bWJlck9mVHlwZUFyZ3VtZW50c05vdE51bGwgPSBnZXRUeXBlQXJndW1lbnRzKHR5cGVSZWZlcmVuY2UpOworCQkJCWlmIChpbmRleCAhPSBudW1iZXJPZlR5cGVBcmd1bWVudHNOb3ROdWxsKSB7CisJCQkJCWludCAgaSA9IG51bWJlck9mVHlwZUFyZ3VtZW50c05vdE51bGw7CisJCQkJCXdoaWxlIChpICE9IGluZGV4KSB7CisJCQkJCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQkJCWkgLS07CisJCQkJCX0KIAkJCQkJYmluZGluZyA9IHR5cGVCaW5kaW5nOwotIAkJCQl9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmluZGluZyA9IHR5cGVCaW5kaW5nOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpIHsKIAkJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSAoVHlwZVJlZmVyZW5jZSkgbm9kZTsKIAkJCQliaW5kaW5nID0gdHlwZVJlZmVyZW5jZS5yZXNvbHZlZFR5cGU7CiAJCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlICYmICgoU2luZ2xlTmFtZVJlZmVyZW5jZSlub2RlKS5pc1R5cGVSZWZlcmVuY2UoKSkgewpAQCAtMTUwMiwyMSArMTU3NSwxNyBAQAogCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewogCQkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCQkJCWlmICh0aGlzLnNjb3BlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJCQlpZiAoYmluZGluZy5pc0FycmF5VHlwZSgpKSB7Ci0JCQkJCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYmluZGluZzsKLQkJCQkJCXJldHVybiBnZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmNyZWF0ZUFycmF5VHlwZShhcnJheUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUsIGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBnZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmNyZWF0ZUFycmF5VHlwZShiaW5kaW5nLCBhcnJheVR5cGUuZ2V0RGltZW5zaW9ucygpKSk7CisJCQkJCWlmICh0aGlzLnNjb3BlID09IG51bGwpIHsKKwkJCQkJCXJldHVybiBudWxsOwogCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGJpbmRpbmcuaXNBcnJheVR5cGUoKSkgewotCQkJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJCQlyZXR1cm4gZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBnZXRUeXBlQmluZGluZyhiaW5kaW5nKTsKLQkJCQkJfQorCQkJCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYmluZGluZzsKKwkJCQkJcmV0dXJuIGdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuY3JlYXRlQXJyYXlUeXBlKGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSwgYXJyYXlUeXBlLmdldERpbWVuc2lvbnMoKSkpOworCQkJCX0gZWxzZSBpZiAoYmluZGluZy5pc0FycmF5VHlwZSgpKSB7CisJCQkJCS8vICdiaW5kaW5nJyBjYW4gc3RpbGwgYmUgYW4gYXJyYXkgdHlwZSBiZWNhdXNlICdub2RlJyBtYXkgYmUgImxhcmdlciIgdGhhbiAndHlwZScgKHNlZSBjb21tZW50IG9mIG5ld0FzdFRvT2xkQXN0KS4KKwkJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCXJldHVybiBnZXRUeXBlQmluZGluZyhhcnJheUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUpOwogCQkJCX0KKwkJCQlyZXR1cm4gZ2V0VHlwZUJpbmRpbmcoYmluZGluZyk7CiAJCQl9CiAJCX0gZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSkgewogCQkJLyogSGFuZGxlIHRoZSB2b2lkIHByaW1pdGl2ZSB0eXBlIHJldHVybmVkIGJ5IGdldFJldHVyblR5cGUgZm9yIGEgbWV0aG9kIGRlY2xhcmF0aW9uCkBAIC0xNTk1LDIwICsxNjY0LDEzIEBACiAJCWZpbmFsIE9iamVjdCBub2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodmFyaWFibGUpOwogCQlpZiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgewogCQkJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIG5vZGU7CisJCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IG51bGw7CiAJCQlpZiAoYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSB7CiAJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSBhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb247Ci0JCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZERlY2xhcmF0aW9uLmJpbmRpbmcsIHZhcmlhYmxlKTsKLQkJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKLQkJCQlTdHJpbmcga2V5ID0gdmFyaWFibGVCaW5kaW5nLmdldEtleSgpOwotCQkJCWlmIChrZXkgIT0gbnVsbCkgewotCQkJCQl0aGlzLmJpbmRpbmdUYWJsZXMuYmluZGluZ0tleXNUb0JpbmRpbmdzLnB1dChrZXksIHZhcmlhYmxlQmluZGluZyk7Ci0JCQkJfQotCQkJCXJldHVybiB2YXJpYWJsZUJpbmRpbmc7CisJCQkJdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nLCB2YXJpYWJsZSk7CisJCQl9IGVsc2UgeworCQkJCXZhcmlhYmxlQmluZGluZyA9IHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKCgoTG9jYWxEZWNsYXJhdGlvbikgYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKS5iaW5kaW5nLCB2YXJpYWJsZSk7CiAJCQl9Ci0JCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKCgoTG9jYWxEZWNsYXJhdGlvbikgYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKS5iaW5kaW5nLCB2YXJpYWJsZSk7CiAJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KQEAgLTE2MjcsNiArMTY4OSw3IEBACiAJICovCiAJc3luY2hyb25pemVkIElUeXBlQmluZGluZyByZXNvbHZlV2VsbEtub3duVHlwZShTdHJpbmcgbmFtZSkgewogCQlpZiAodGhpcy5zY29wZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWlmICgoImJvb2xlYW4iLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCiAJCQkJfHwgKCJjaGFyIi5lcXVhbHMobmFtZSkpLy8kTk9OLU5MUy0xJApAQCAtMTYzNyw0OSArMTcwMCw1NCBAQAogCQkJCXx8ICgiZmxvYXQiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCiAJCQkJfHwgKCJkb3VibGUiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCiAJCQkJfHwgKCJ2b2lkIi5lcXVhbHMobmFtZSkpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKFNjb3BlLmdldEJhc2VUeXBlKG5hbWUudG9DaGFyQXJyYXkoKSkpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhTY29wZS5nZXRCYXNlVHlwZShuYW1lLnRvQ2hhckFycmF5KCkpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhuYW1lKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCkpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCkpOwogCQkJfSBlbHNlIGlmICgiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKSk7CisJCQkJdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKSk7CiAJCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NUUklOR0JVRkZFUiwgMykpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU1RSSU5HQlVGRkVSLCAzKSk7CiAJCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuVGhyb3dhYmxlIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5FeGNlcHRpb24iLmVxdWFscyhuYW1lKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRVhDRVBUSU9OLCAzKSk7CisJCQkJdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FWENFUFRJT04sIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5FcnJvciIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FUlJPUiwgMykpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRVJST1IsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5DbGFzcyIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCkpOwogCQkJfSBlbHNlIGlmICgiamF2YS5sYW5nLkNsb25lYWJsZSIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdDbG9uZWFibGUoKSk7CisJCQkJdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdDbG9uZWFibGUoKSk7CiAJCQl9IGVsc2UgaWYgKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUlvU2VyaWFsaXphYmxlKCkpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFJb1NlcmlhbGl6YWJsZSgpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5Cb29sZWFuIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0JPT0xFQU4sIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0JPT0xFQU4sIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5CeXRlIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0JZVEUsIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0JZVEUsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5DaGFyYWN0ZXIiLmVxdWFscyhuYW1lKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQ0hBUkFDVEVSLCAzKSk7CisJCQkJdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19DSEFSQUNURVIsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5Eb3VibGUiLmVxdWFscyhuYW1lKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRE9VQkxFLCAzKSk7CisJCQkJdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19ET1VCTEUsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5GbG9hdCIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19GTE9BVCwgMykpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfRkxPQVQsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5JbnRlZ2VyIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVEVHRVIsIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVEVHRVIsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5Mb25nIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0xPTkcsIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0xPTkcsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5TaG9ydCIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TSE9SVCwgMykpOworCQkJCXR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU0hPUlQsIDMpKTsKIAkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5Wb2lkIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1ZPSUQsIDMpKTsKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1ZPSUQsIDMpKTsKKwkJCX0gZWxzZSBpZiAoImphdmEubGFuZy5Bc3NlcnRpb25FcnJvciIuZXF1YWxzKG5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRUeXBlKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SLCAzKSk7CiAJCQl9CiAJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewogCQkJLy8gaWdub3JlIG1pc3NpbmcgdHlwZXMKIAkJfQorCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiAhdHlwZUJpbmRpbmcuaXNSZWNvdmVyZWQoKSkgeworCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQl9CiAJCXJldHVybiBudWxsOwogCX0KIApAQCAtMTY4OSw3ICsxNzU3LDcgQEAKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbiBpbnRlcm5hbEFzdE5vZGUgPQogCQkJCShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb24pIG9sZE5vZGU7CiAKLQkJCUlBbm5vdGF0aW9uQmluZGluZyBkb21Bbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uSW5zdGFuY2UoaW50ZXJuYWxBc3ROb2RlLmdldENvbXBpbGVyQW5ub3RhdGlvbigpKTsKKwkJCUlBbm5vdGF0aW9uQmluZGluZyBkb21Bbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbkluc3RhbmNlKGludGVybmFsQXN0Tm9kZS5nZXRDb21waWxlckFubm90YXRpb24oKSk7CiAJCQlpZiAoZG9tQW5ub3RhdGlvbiA9PSBudWxsKQogCQkJCXJldHVybiBudWxsOwogCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KGRvbUFubm90YXRpb24sIGRvbUFTVE5vZGUpOwpAQCAtMTc0Miw3ICsxODEwLDcgQEAKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgdGhlIDxjb2RlPnZvaWQ8L2NvZGU+IHR5cGUgYmluZGluZwogCSAqLwogCUlUeXBlQmluZGluZyByZXNvbHZlQXJyYXlUeXBlKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgaW50IGRpbWVuc2lvbnMpIHsKLQkJaWYgKHR5cGVCaW5kaW5nLmlzUmVjb3ZlcmVkKCkpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBiZSBjYWxsZWQgb24gYSByZWNvdmVyZWQgdHlwZSBiaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZUJpbmRpbmcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBiZSBjYWxsZWQgb24gYSByZWNvdmVyZWQgdHlwZSBiaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKIAkJSVR5cGVCaW5kaW5nIGxlYWZDb21wb25lbnRUeXBlID0gdHlwZUJpbmRpbmc7CiAJCWludCBhY3R1YWxEaW1lbnNpb25zID0gZGltZW5zaW9uczsKIAkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewpAQCAtMTc4NCw2ICsxODUyLDYgQEAKICAJCQlpZiAoIShsZWFmQ29tcG9uZW50VHlwZSBpbnN0YW5jZW9mIFR5cGVCaW5kaW5nKSkgcmV0dXJuIG51bGw7CiAgCQkJbGVhZlR5cGVCaW5kaW5nID0gKChUeXBlQmluZGluZykgbGVhZkNvbXBvbmVudFR5cGUpLmJpbmRpbmc7CiAgCQl9Ci0JCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMubG9va3VwRW52aXJvbm1lbnQoKS5jcmVhdGVBcnJheVR5cGUobGVhZlR5cGVCaW5kaW5nLCBhY3R1YWxEaW1lbnNpb25zKSk7CisJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGxvb2t1cEVudmlyb25tZW50KCkuY3JlYXRlQXJyYXlUeXBlKGxlYWZUeXBlQmluZGluZywgYWN0dWFsRGltZW5zaW9ucykpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdENvbW1lbnRNYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdENvbW1lbnRNYXBwZXIuamF2YQppbmRleCAwNWE4YmM5Li42MTg4ZjJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRDb21tZW50TWFwcGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0Q29tbWVudE1hcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDEzICsxOCwxMyBAQAogCiAvKioKICAqIEludGVybmFsIGNsYXNzIGZvciBhc3NvY2lhdGluZyBjb21tZW50cyB3aXRoIEFTVCBub2Rlcy4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogY2xhc3MgRGVmYXVsdENvbW1lbnRNYXBwZXIgewogCUNvbW1lbnRbXSBjb21tZW50czsKIAlTY2FubmVyIHNjYW5uZXI7Ci0JCisKIAkvLyBleHRlbmRlZCBub2RlcyBzdG9yYWdlCiAJaW50IGxlYWRpbmdQdHI7CiAJQVNUTm9kZVtdIGxlYWRpbmdOb2RlczsKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogCS8qKgogCSAqIEdldCBjb21tZW50IG9mIHRoZSBsaXN0IHdoaWNoIGluY2x1ZGVzIGEgZ2l2ZW4gcG9zaXRpb24KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gYmVsb25naW5nIHRvIHRoZSBsb29rZWQgdXAgY29tbWVudAogCSAqIEByZXR1cm4gY29tbWVudCB3aGljaCBpbmNsdWRlcyB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgbnVsbCBpZiBub25lIHdhcyBmb3VuZAogCSAqLwpAQCAtMTEzLDcgKzExMyw3IEBACiAJICoge0BsaW5rIEFTVE5vZGUjZ2V0U3RhcnRQb3NpdGlvbigpfSBhbmQge0BsaW5rIEFTVE5vZGUjZ2V0TGVuZ3RoKCl9LAogCSAqIHRoZSBleHRlbmRlZCBzb3VyY2UgcmFuZ2UgbWF5IGluY2x1ZGUgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UKIAkgKiBpbW1lZGlhdGVseSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG5vcm1hbCBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBub2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCwgb3IgPGNvZGU+LTE8L2NvZGU+CiAJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG5vZGUKQEAgLTE2OSw3ICsxNjksNyBAQAogCSAqIHtAbGluayBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKX0gYW5kIHtAbGluayBBU1ROb2RlI2dldExlbmd0aCgpfSwKIAkgKiB0aGUgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG1heSBpbmNsdWRlIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlCiAJICogaW1tZWRpYXRlbHkgYmVmb3JlIG9yIGFmdGVyIHRoZSBub3JtYWwgc291cmNlIHJhbmdlIGZvciB0aGUgbm9kZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCiAJICogQHJldHVybiBhIChwb3NzaWJseSAwKSBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+CiAJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG5vZGUKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJLyoqCiAJICogUmV0dXJuIGluZGV4IG9mIGZpcnN0IGxlYWRpbmcgY29tbWVudCBvZiBhIGdpdmVuIG5vZGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZQogCSAqIEByZXR1cm4gaW5kZXggb2YgZmlyc3QgbGVhZGluZyBjb21tZW50IG9yIC0xIGlmIG5vZGUgaGFzIG5vIGxlYWRpbmcgY29tbWVudAogCSAqLwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAkvKioKIAkgKiBSZXR1cm4gaW5kZXggb2YgbGFzdCB0cmFpbGluZyBjb21tZW50IG9mIGEgZ2l2ZW4gbm9kZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlCiAJICogQHJldHVybiBpbmRleCBvZiBsYXN0IHRyYWlsaW5nIGNvbW1lbnQgb3IgLTEgaWYgbm9kZSBoYXMgbm8gdHJhaWxpbmcgY29tbWVudAogCSAqLwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJCS8vIEluaXQgYXJyYXkgcG9pbnRlcnMKIAkJdGhpcy5sZWFkaW5nUHRyID0gLTE7CiAJCXRoaXMudHJhaWxpbmdQdHIgPSAtMTsKLQkKKwogCQkvLyBJbml0IGNvbW1lbnRzCiAJCXRoaXMuY29tbWVudHMgPSB1bml0Lm9wdGlvbmFsQ29tbWVudFRhYmxlOwogCQlpZiAodGhpcy5jb21tZW50cyA9PSBudWxsKSB7CkBAIC0yNDQsMTQgKzI0NCwxNCBAQAogCQkvLyBTdGFydCB1bml0IHZpc2l0CiAJCURlZmF1bHRBU1RWaXNpdG9yIGNvbW1lbnRWaXNpdG9yID0gbmV3IENvbW1lbnRNYXBwZXJWaXNpdG9yKCk7CiAJCXVuaXQuYWNjZXB0KGNvbW1lbnRWaXNpdG9yKTsKLQkJCisKIAkJLy8gUmVkdWNlIGxlYWRpbmcgYXJyYXlzIGlmIG5lY2Vzc2FyeQogCQlpbnQgbGVhZGluZ0NvdW50ID0gdGhpcy5sZWFkaW5nUHRyICsgMTsKIAkJaWYgKGxlYWRpbmdDb3VudCA+IDAgJiYgbGVhZGluZ0NvdW50IDwgdGhpcy5sZWFkaW5nSW5kZXhlcy5sZW5ndGgpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sZWFkaW5nTm9kZXMsIDAsIHRoaXMubGVhZGluZ05vZGVzID0gbmV3IEFTVE5vZGVbbGVhZGluZ0NvdW50XSwgMCwgbGVhZGluZ0NvdW50KTsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sZWFkaW5nSW5kZXhlcywgMCwgdGhpcy5sZWFkaW5nSW5kZXhlcz0gbmV3IGxvbmdbbGVhZGluZ0NvdW50XSwgMCwgbGVhZGluZ0NvdW50KTsKIAkJfQotCQkKKwogCQkvLyBSZWR1Y2UgdHJhaWxpbmcgYXJyYXlzIGlmIG5lY2Vzc2FyeQogCQlpZiAodGhpcy50cmFpbGluZ1B0ciA+PSAwKSB7CiAJCQkvLyByZW1vdmUgbGFzdCByZW1haW5pbmcgdW5yZXNvbHZlZCBub2RlcwpAQCAtMzAxLDE3ICszMDEsMTcgQEAKIAkJLy8gSW5pdCBleHRlbmRlZCBwb3NpdGlvbgogCQlpbnQgbm9kZVN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCWludCBleHRlbmRlZCA9IG5vZGVTdGFydDsKLQkJCisKIAkJLy8gR2V0IGxpbmUgb2Ygbm9kZSBzdGFydCBwb3NpdGlvbgogCQlpbnQgcHJldmlvdXNFbmRMaW5lID0gZ2V0TGluZU51bWJlcihwcmV2aW91c0VuZCwgcGFyZW50TGluZVJhbmdlKTsKIAkJaW50IG5vZGVTdGFydExpbmUgPSBnZXRMaW5lTnVtYmVyKG5vZGVTdGFydCwgcGFyZW50TGluZVJhbmdlKTsKLQkJCisKIAkJLy8gRmluZCBmaXJzdCBjb21tZW50IGluZGV4CiAJCWludCBpZHggPSBnZXRDb21tZW50SW5kZXgoMCwgbm9kZVN0YXJ0LCAtMSk7CiAJCWlmIChpZHggPT0gLTEpIHsKIAkJCXJldHVybiBub2RlU3RhcnQ7CiAJCX0KLQkJCisKIAkJLy8gTG9vayBhZnRlciBwb3RlbnRpYWwgY29tbWVudHMKIAkJaW50IHN0YXJ0SWR4ID0gLTE7CiAJCWludCBlbmRJZHggPSBpZHg7CkBAIC00MzcsMTAgKzQzNywxMCBAQAogCQkJcmV0dXJuIG5vZGVFbmQ7CiAJCX0KIAkJaW50IGV4dGVuZGVkID0gbm9kZUVuZDsKLQkJCisKIAkJLy8gR2V0IGxpbmUgbnVtYmVyCiAJCWludCBub2RlRW5kTGluZSA9IGdldExpbmVOdW1iZXIobm9kZUVuZCwgcGFyZW50TGluZVJhbmdlKTsKLQkJCisKIAkJLy8gRmluZCBjb21tZW50cyByYW5nZSBpbmRleAogCQlpbnQgaWR4ID0gZ2V0Q29tbWVudEluZGV4KDAsIG5vZGVFbmQsIDEpOwogCQlpZiAoaWR4ID09IC0xKSB7CkBAIC01NjMsNyArNTYzLDcgQEAKIAkJCS8vIEdldCBkZWZhdWx0IHByZXZpb3VzIGVuZAogCQkJQVNUTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudCgpOwogCQkJaW50IHByZXZpb3VzRW5kID0gcGFyZW50LmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJCQorCiAJCQkvLyBMb29rIGZvciBzaWJsaW5nIG5vZGUKICAJCQlBU1ROb2RlIHNpYmxpbmcgPSBwYXJlbnQgPT0gdGhpcy50b3BTaWJsaW5nUGFyZW50ID8gKEFTVE5vZGUpIHRoaXMuc2libGluZ3NbdGhpcy5zaWJsaW5nUHRyXSA6IG51bGw7CiAJCQlpZiAoc2libGluZyAhPSBudWxsKSB7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogCQkJCS8vIEdpdmUgdXAgZXh0ZW5kZWQgcmFuZ2VzIGF0IHRoaXMgbGV2ZWwgaWYgdW5leHBlY3RlZCBleGNlcHRpb24gaGFwcGVucy4uLgogCQkJfQotCQkJCisKIAkJCS8vIFN0b3JlIGN1cnJlbnQgbm9kZSBhcyB3YWl0aW5nIHNpYmxpbmcgZm9yIGl0cyBwYXJlbnQKIAkJCWlmICh0aGlzLnRvcFNpYmxpbmdQYXJlbnQgIT0gcGFyZW50KSB7CiAJCQkJaWYgKHRoaXMuc2libGluZ3MubGVuZ3RoID09ICsrdGhpcy5zaWJsaW5nUHRyKSB7CkBAIC02MTYsNyArNjE2LDcgQEAKIAkJCS8vIFdlJ3JlIGFsd2F5cyBvayB0byB2aXNpdCBzdWItbGV2ZWxzCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQkKKwogCQlwcm90ZWN0ZWQgdm9pZCBlbmRWaXNpdE5vZGUoQVNUTm9kZSBub2RlKSB7CiAKIAkJCS8vIExvb2sgaWYgYSBjaGlsZCBub2RlIGlzIHdhaXRpbmcgZm9yIHRyYWlsaW5nIGNvbW1lbnRzIGNvbXB1dGluZwpAQCAtNjM2LDYgKzYzNiwxMCBAQAogCQkJfQogCQl9CiAKKwkJcHVibGljIGJvb2xlYW4gdmlzaXQgKE1vZGlmaWVyIG1vZGlmaWVyKSB7CisJCQkvLyB3ZSBkb24ndCB3YW50IHRvIG1hcCBjb21tZW50IHRvIHRoZSBtb2RpZmllcgorCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJCXB1YmxpYyBib29sZWFuIHZpc2l0ICggQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKIAkJCS8vIGRvIG5vdGhpbmcgc3BlY2lhbCwganVzdCBnbyBkb3duIGluIHN1Yi1sZXZlbHMKIAkJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0VmFsdWVQYWlyQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0VmFsdWVQYWlyQmluZGluZy5qYXZhCmluZGV4IGQ1MTc3MmMuLmY3NDAxM2UgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdFZhbHVlUGFpckJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RlZmF1bHRWYWx1ZVBhaXJCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTksNiArOSw3IEBACiAgKiAgICB0eWV1bmdAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgSUJNIENvcnBvcmF0aW9uIC0gaW1wbGVtZW50ZWQgbWV0aG9kcyBmcm9tIElCaW5kaW5nCiAgKiAgICBJQk0gQ29ycG9yYXRpb24gLSByZW5hbWVkIGZyb20gUmVzb2x2ZWREZWZhdWx0VmFsdWVQYWlyIHRvIERlZmF1bHRWYWx1ZVBhaXJCaW5kaW5nCisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBGaXggZm9yIDMyODk2OQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMjYsNiArMjcsMTIgQEAKIAkJc3VwZXIobnVsbCwgcmVzb2x2ZXIpOwogCQl0aGlzLm1ldGhvZCA9IGJpbmRpbmc7CiAJCXRoaXMudmFsdWUgPSBNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nLmJ1aWxkRE9NVmFsdWUoYmluZGluZy5nZXREZWZhdWx0VmFsdWUoKSwgcmVzb2x2ZXIpOworCQlpZiAoYmluZGluZy5yZXR1cm5UeXBlICE9IG51bGwgJiYgYmluZGluZy5yZXR1cm5UeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCWlmICghdGhpcy52YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworCQkJCS8vIHdyYXAgaW50byBhbiBhcnJheQorCQkJCXRoaXMudmFsdWUgPSBuZXcgT2JqZWN0W10geyB0aGlzLnZhbHVlIH07CisJCQl9CisJCX0KIAl9CiAKIAlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0TWV0aG9kQmluZGluZygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9TdGF0ZW1lbnQuamF2YQppbmRleCA5MjU3ZmExLi4yMjhkMWFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RvU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Eb1N0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDMyICsyMSwzMyBAQAogICogRG9TdGF0ZW1lbnQ6CiAgKiAgICA8Yj5kbzwvYj4gU3RhdGVtZW50IDxiPndoaWxlPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IDxiPjs8L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgRG9TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKERvU3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKERvU3RhdGVtZW50LmNsYXNzLCAiYm9keSIsIFN0YXRlbWVudC5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KERvU3RhdGVtZW50LmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01OCwyMCArNTksMjAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dAogCSAqIGxlZ2FsLCBleHByZXNzaW9uLgogCSAqLwogCXByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKQEAgLTgyLDEzICs4MywxMyBAQAogCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGRvIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBhbmQgdGhlIGJvZHkgc3RhdGVtZW50IGlzIGFuIGVtcHR5IGJsb2NrLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCURvU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNSw3ICsxMjYsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM4LDcgKzEzOSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlEb1N0YXRlbWVudCByZXN1bHQgPSBuZXcgRG9TdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0Qm9keSgoU3RhdGVtZW50KSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CkBAIC0xNjUsMTIgKzE2NiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGRvIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xODQsMTAgKzE4NSwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGRvIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIwOCw5ICsyMDksOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGRvIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgewogCQlpZiAodGhpcy5ib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMjQsNyArMjI1LDcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5ib2R5OwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBkbyBzdGF0ZW1lbnQuCiAJICogPHA+CkBAIC0yMzUsNyArMjM2LDcgQEAKIAkgKiBjb21waWxlLCBiZSBzdXJlIHRvIGVtYmVkIHRoZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPgogCSAqIGluc2lkZSBhIDxjb2RlPkJsb2NrPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSBib2R5IHN0YXRlbWVudCBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjQzLDcgKzI0NCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRCb2R5KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJaWYgKHN0YXRlbWVudCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNTMsMTQgKzI1NCwxNCBAQAogCQl0aGlzLmJvZHkgPSBzdGF0ZW1lbnQ7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIHN0YXRlbWVudCwgQk9EWV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9jQ29tbWVudFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Eb2NDb21tZW50UGFyc2VyLmphdmEKaW5kZXggZTA4YzQxOC4uNGRiYTkwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Eb2NDb21tZW50UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Eb2NDb21tZW50UGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsNyArMjMsNyBAQAogCiAvKioKICAqIEludGVybmFsIHBhcnNlciB1c2VkIGZvciBkZWNvZGluZyBkb2MgY29tbWVudHMuCi0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIGNsYXNzIERvY0NvbW1lbnRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENvbW1lbnRQYXJzZXIgewpAQCAtMzUsMTQgKzM1LDI0IEBACiAJCXN1cGVyKG51bGwpOwogCQl0aGlzLmFzdCA9IGFzdDsKIAkJdGhpcy5zY2FubmVyID0gc2Nhbm5lcjsKLQkJdGhpcy5zb3VyY2VMZXZlbCA9IHRoaXMuYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMgPyBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81IDogQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMzsKKwkJc3dpdGNoKHRoaXMuYXN0LmFwaUxldmVsKCkpIHsKKwkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgorCQkJCXRoaXMuc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOworCQkJCWJyZWFrOworCQkJY2FzZSBBU1QuSkxTMzoKKwkJCQl0aGlzLnNvdXJjZUxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLy8gQVNULkpMUzQgZm9yIG5vdworCQkJCXRoaXMuc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83OworCQl9CiAJCXRoaXMuY2hlY2tEb2NDb21tZW50ID0gY2hlY2s7CiAJCXRoaXMua2luZCA9IERPTV9QQVJTRVIgfCBURVhUX1BBUlNFOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGFnIEBkZXByZWNhdGVkIGlzIHByZXNlbnQgaW4gYW5ub3RhdGlvbi4KLQkgKiAKKwkgKgogCSAqIElmIGFubm90YXRpb24gY2hlY2tpbmcgaXMgZW5hYmxlZCwgd2lsbCBhbHNvIGNvbnN0cnVjdCBhbiBBbm5vdGF0aW9uIG5vZGUsIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGludG8gUGFyc2VyLmFubm90YXRpb24KIAkgKiBzbG90IGZvciBiZWluZyBjb25zdW1lZCBsYXRlciBvbi4KIAkgKi8KQEAgLTU1LDcgKzY1LDcgQEAKIAkJdGhpcy5zb3VyY2UgPSB0aGlzLnNjYW5uZXIuc291cmNlOwogCQl0aGlzLmxpbmVFbmRzID0gdGhpcy5zY2FubmVyLmxpbmVFbmRzOwogCQl0aGlzLmRvY0NvbW1lbnQgPSBuZXcgSmF2YWRvYyh0aGlzLmFzdCk7Ci0JCQorCiAJCS8vIFBhcnNlCiAJCWlmICh0aGlzLmNoZWNrRG9jQ29tbWVudCkgewogCQkJdGhpcy5qYXZhZG9jU3RhcnQgPSBzdGFydDsKQEAgLTMzMyw3ICszNDMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjcGFyc2VUYWcoaW50KQogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIHBhcnNlVGFnKGludCBwcmV2aW91c1Bvc2l0aW9uKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJCisKIAkJLy8gUmVhZCB0YWcgbmFtZQogCQlpbnQgY3VycmVudFBvc2l0aW9uID0gdGhpcy5pbmRleDsKIAkJaW50IHRva2VuID0gcmVhZFRva2VuQW5kQ29uc3VtZSgpOwpAQCAtNDIwLDEzICs0MzAsOCBAQAogCQkJCQlicmVhazsKIAkJCQkJY2FzZSAnaSc6CiAJCQkJCQlpZiAobGVuZ3RoID09IFRBR19JTkhFUklURE9DX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfSU5IRVJJVERPQywgdGFnTmFtZSkpIHsKLQkJCQkJCQkvLyBpbmhpYml0cyBpbmhlcml0ZWQgZmxhZyB3aGVuIHRhZ3MgaGF2ZSBiZWVuIGFscmVhZHkgc3RvcmVkCi0JCQkJCQkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTE2MDYKLQkJCQkJCQkvLyBOb3RlIHRoYXQgZm9yIERPTV9QQVJTRVIsIG5vZGVzIHN0YWNrIG1heSBiZSBub3QgZW1wdHkgZXZlbiBubyAnQCcgdGFnCi0JCQkJCQkJLy8gd2FzIGVuY291bnRlcmVkIGluIGNvbW1lbnQuIEJ1dCBpdCBjYW5ub3QgYmUgdGhlIGNhc2UgZm9yIENPTVBJTEVSX1BBUlNFUgotCQkJCQkJCS8vIGFuZCBzbyBpcyBlbm91Z2ggYXMgaXQgaXMgb25seSB0aGlzIHBhcnNlciB3aGljaCBzaWduYWxzIHRoZSBtaXNzaW5nIHRhZyB3YXJuaW5ncy4uLgotCQkJCQkJCWlmICh0aGlzLmFzdFB0cj09LTEpIHsKLQkJCQkJCQkJdGhpcy5pbmhlcml0ZWRQb3NpdGlvbnMgPSAoKChsb25nKSB0aGlzLnRhZ1NvdXJjZVN0YXJ0KSA8PCAzMikgKyB0aGlzLnRhZ1NvdXJjZUVuZDsKKwkJCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgeworCQkJCQkJCQlyZWNvcmRJbmhlcml0ZWRQb3NpdGlvbigoKChsb25nKSB0aGlzLnRhZ1NvdXJjZVN0YXJ0KSA8PCAzMikgKyB0aGlzLnRhZ1NvdXJjZUVuZCk7CiAJCQkJCQkJfQogCQkJCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfSU5IRVJJVERPQ19WQUxVRTsKIAkJCQkJCX0gZWxzZSB7CkBAIC01NjAsNiArNTY1LDkgQEAKIAkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldm9pZDoKIAkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldm9sYXRpbGU6CiAJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXdoaWxlOgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbnVtIDoKKwkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY29uc3QgOgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVnb3RvIDoKIAkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX09USEVSU19WQUxVRTsKIAkJCQljcmVhdGVUYWcoKTsKIAkJCQlicmVhazsKQEAgLTY0OSw5ICs2NTcsMTMgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuQWJzdHJhY3RDb21tZW50UGFyc2VyI3B1c2hUZXh0KGludCwgaW50KQogCSAqLwogCXByb3RlY3RlZCB2b2lkIHB1c2hUZXh0KGludCBzdGFydCwgaW50IGVuZCkgeworCisJCS8vIENyZWF0ZSB0ZXh0IGVsZW1lbnQKIAkJVGV4dEVsZW1lbnQgdGV4dCA9IHRoaXMuYXN0Lm5ld1RleHRFbGVtZW50KCk7CiAJCXRleHQuc2V0VGV4dChuZXcgU3RyaW5nKCB0aGlzLnNvdXJjZSwgc3RhcnQsIGVuZC1zdGFydCkpOwogCQl0ZXh0LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQtc3RhcnQpOworCisJCS8vIFNlYXJjaCBwcmV2aW91cyB0YWcgb24gd2hpY2ggdG8gYWRkIHRoZSB0ZXh0IGVsZW1lbnQKIAkJVGFnRWxlbWVudCBwcmV2aW91c1RhZyA9IG51bGw7CiAJCWludCBwcmV2aW91c1N0YXJ0ID0gc3RhcnQ7CiAJCWlmICh0aGlzLmFzdFB0ciA9PSAtMSkgewpAQCAtNjYyLDQyICs2NzQsMzIgQEAKIAkJCXByZXZpb3VzVGFnID0gKFRhZ0VsZW1lbnQpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCQkJcHJldmlvdXNTdGFydCA9IHByZXZpb3VzVGFnLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJfQorCisJCS8vIElmIHdlJ3JlIGluIGEgaW5saW5lIHRhZywgdGhlbiByZXRyaWV2ZSBwcmV2aW91cyB0YWcgaW4gaXRzIGZyYWdtZW50cworCQlMaXN0IGZyYWdtZW50cyA9IHByZXZpb3VzVGFnLmZyYWdtZW50cygpOwogCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQlpZiAocHJldmlvdXNUYWcuZnJhZ21lbnRzKCkuc2l6ZSgpID09IDApIHsKKwkJCWludCBzaXplID0gZnJhZ21lbnRzLnNpemUoKTsKKwkJCWlmIChzaXplID09IDApIHsKKwkJCQkvLyBubyBleGlzdGluZyBmcmFnbWVudCA9PiBqdXN0IGFkZCB0aGUgZWxlbWVudAogCQkJCVRhZ0VsZW1lbnQgaW5saW5lVGFnID0gdGhpcy5hc3QubmV3VGFnRWxlbWVudCgpOwotCQkJCXByZXZpb3VzVGFnLmZyYWdtZW50cygpLmFkZChpbmxpbmVUYWcpOworCQkJCWZyYWdtZW50cy5hZGQoaW5saW5lVGFnKTsKIAkJCQlwcmV2aW91c1RhZyA9IGlubGluZVRhZzsKIAkJCX0gZWxzZSB7Ci0JCQkJQVNUTm9kZSBpbmxpbmVUYWcgPSAoQVNUTm9kZSkgcHJldmlvdXNUYWcuZnJhZ21lbnRzKCkuZ2V0KHByZXZpb3VzVGFnLmZyYWdtZW50cygpLnNpemUoKS0xKTsKLQkJCQlpZiAoaW5saW5lVGFnLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UQUdfRUxFTUVOVCkgewotCQkJCQlwcmV2aW91c1RhZyA9IChUYWdFbGVtZW50KSBpbmxpbmVUYWc7CisJCQkJLy8gSWYgbGFzdCBmcmFnbWVudCBpcyBhIHRhZywgdGhlbiB1c2UgaXQgYXMgcHJldmlvdXMgdGFnCisJCQkJQVNUTm9kZSBsYXN0RnJhZ21lbnQgPSAoQVNUTm9kZSkgZnJhZ21lbnRzLmdldChzaXplLTEpOworCQkJCWlmIChsYXN0RnJhZ21lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRBR19FTEVNRU5UKSB7CisJCQkJCXByZXZpb3VzVGFnID0gKFRhZ0VsZW1lbnQpIGxhc3RGcmFnbWVudDsKIAkJCQkJcHJldmlvdXNTdGFydCA9IHByZXZpb3VzVGFnLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCQl9CiAJCQl9CiAJCX0KKworCQkvLyBBZGQgdGhlIHRleHQKIAkJcHJldmlvdXNUYWcuZnJhZ21lbnRzKCkuYWRkKHRleHQpOwogCQlwcmV2aW91c1RhZy5zZXRTb3VyY2VSYW5nZShwcmV2aW91c1N0YXJ0LCBlbmQtcHJldmlvdXNTdGFydCk7CiAJCXRoaXMudGV4dFN0YXJ0ID0gLTE7CiAJfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuQWJzdHJhY3RDb21tZW50UGFyc2VyI3B1c2hUZXh0KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihpbnQgcHJldmlvdXNQb3NpdGlvbikgewotCQlpZiAodGhpcy5hc3RQdHIgIT0gLTEpIHsKLQkJCVRhZ0VsZW1lbnQgcHJldmlvdXNUYWcgPSAoVGFnRWxlbWVudCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07Ci0JCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7Ci0JCQkJaW50IHByZXZpb3VzU3RhcnQgPSBwcmV2aW91c1RhZy5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JCQkJcHJldmlvdXNUYWcuc2V0U291cmNlUmFuZ2UocHJldmlvdXNTdGFydCwgcHJldmlvdXNQb3NpdGlvbi1wcmV2aW91c1N0YXJ0KzEpOwotCQkJCWlmIChwcmV2aW91c1RhZy5mcmFnbWVudHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCUFTVE5vZGUgaW5saW5lVGFnID0gKEFTVE5vZGUpIHByZXZpb3VzVGFnLmZyYWdtZW50cygpLmdldChwcmV2aW91c1RhZy5mcmFnbWVudHMoKS5zaXplKCktMSk7Ci0JCQkJCWlmIChpbmxpbmVUYWcuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRBR19FTEVNRU5UKSB7Ci0JCQkJCQlpbnQgaW5saW5lU3RhcnQgPSBpbmxpbmVUYWcuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQkJCQkJaW5saW5lVGFnLnNldFNvdXJjZVJhbmdlKGlubGluZVN0YXJ0LCBwcmV2aW91c1Bvc2l0aW9uLWlubGluZVN0YXJ0KzEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjcHVzaFRocm93TmFtZShqYXZhLmxhbmcuT2JqZWN0KQogCSAqLwpAQCAtNzE3LDYgKzcxOSwyNiBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLkFic3RyYWN0Q29tbWVudFBhcnNlciNyZWZyZXNoSW5saW5lVGFnUG9zaXRpb24oaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbmxpbmVUYWdQb3NpdGlvbihpbnQgcHJldmlvdXNQb3NpdGlvbikgeworCQlpZiAodGhpcy5hc3RQdHIgIT0gLTEpIHsKKwkJCVRhZ0VsZW1lbnQgcHJldmlvdXNUYWcgPSAoVGFnRWxlbWVudCkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJaW50IHByZXZpb3VzU3RhcnQgPSBwcmV2aW91c1RhZy5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJcHJldmlvdXNUYWcuc2V0U291cmNlUmFuZ2UocHJldmlvdXNTdGFydCwgcHJldmlvdXNQb3NpdGlvbi1wcmV2aW91c1N0YXJ0KzEpOworCQkJCWlmIChwcmV2aW91c1RhZy5mcmFnbWVudHMoKS5zaXplKCkgPiAwKSB7CisJCQkJCUFTVE5vZGUgaW5saW5lVGFnID0gKEFTVE5vZGUpIHByZXZpb3VzVGFnLmZyYWdtZW50cygpLmdldChwcmV2aW91c1RhZy5mcmFnbWVudHMoKS5zaXplKCktMSk7CisJCQkJCWlmIChpbmxpbmVUYWcuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRBR19FTEVNRU5UKSB7CisJCQkJCQlpbnQgaW5saW5lU3RhcnQgPSBpbmxpbmVUYWcuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQkJaW5saW5lVGFnLnNldFNvdXJjZVJhbmdlKGlubGluZVN0YXJ0LCBwcmV2aW91c1Bvc2l0aW9uLWlubGluZVN0YXJ0KzEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCiAJLyoKIAkgKiBBZGQgc3RvcmVkIHRhZyBlbGVtZW50cyB0byBhc3NvY2lhdGVkIGNvbW1lbnQuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VtcHR5U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VtcHR5U3RhdGVtZW50LmphdmEKaW5kZXggYjVjZDg3NC4uZTQ2ZTg5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbXB0eVN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW1wdHlTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwxOCArMjEsMTkgQEAKICAqIEVtcHR5U3RhdGVtZW50OgogICogICAgPGI+OzwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBFbXB0eVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoRW1wdHlTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTQyLDM3ICs0MywzNyBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG51bGwgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlFbXB0eVN0YXRlbWVudChBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtODUsNyArODYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJRW1wdHlTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEVtcHR5U3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xMDUsNyArMTA2LDcgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW5oYW5jZWRGb3JTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW5oYW5jZWRGb3JTdGF0ZW1lbnQuamF2YQppbmRleCA2NGYyMTQ5Li4zYTQ1MjJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VuaGFuY2VkRm9yU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbmhhbmNlZEZvclN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDM4ICsyMiw0MCBAQAogICogICAgPGI+Zm9yPC9iPiA8Yj4oPC9iPiBGb3JtYWxQYXJhbWV0ZXIgPGI+OjwvYj4gRXhwcmVzc2lvbiA8Yj4pPC9iPgogICogCQkJU3RhdGVtZW50CiAgKiA8L3ByZT4KLSAqIFRoZSBGb3JtYWxQYXJhbWV0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPgotICogKHdpdGhvdXQgYW4gaW5pdGlhbGl6ZXIpLgogICogCisgKiA8cD5UaGUgRm9ybWFsUGFyYW1ldGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259CisgKiAod2l0aG91dCBhbiBpbml0aWFsaXplcikuPC9wPgorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgRW5oYW5jZWRGb3JTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJwYXJhbWV0ZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJwYXJhbWV0ZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBQQVJBTUVURVJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFBBUkFNRVRFUl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihFbmhhbmNlZEZvclN0YXRlbWVudC5jbGFzcywgInBhcmFtZXRlciIsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEVuaGFuY2VkRm9yU3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoRW5oYW5jZWRGb3JTdGF0ZW1lbnQuY2xhc3MsICJib2R5IiwgU3RhdGVtZW50LmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDQpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoRW5oYW5jZWRGb3JTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTY2LDE3ICs2OCwxNyBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgcGFyYW1ldGVyOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgbm9kZS4KQEAgLTk0LDEyICs5NiwxMiBAQAogCSAqIHN0YXRlbWVudC4KIAkgKi8KIAlwcml2YXRlIFN0YXRlbWVudCBib2R5ID0gbnVsbDsKLQkJCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gZW5jaGFuY2VkIGZvciBzdGF0ZW1lbnQgb3duZWQgYnkgdGhlCiAJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgcGFyYW1ldGVyIGFuZCBleHByZXNzaW9uIGFyZSB1bnNwZWNpZmllZAogCSAqIGJ1dCBsZWdhbCBzdWJ0cmVlcywgYW5kIHRoZSBib2R5IGlzIGFuIGVtcHR5IGJsb2NrLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUVuaGFuY2VkRm9yU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTExMyw3ICsxMTUsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE0NSw3ICsxNDcsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTU4LDcgKzE2MCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlFbmhhbmNlZEZvclN0YXRlbWVudCByZXN1bHQgPSBuZXcgRW5oYW5jZWRGb3JTdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0UGFyYW1ldGVyKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBnZXRQYXJhbWV0ZXIoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKQEAgLTE4OCwxMiArMTkwLDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGluIHRoaXMgZW5oYW5jZWQgZm9yIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRQYXJhbWV0ZXIoKSB7CiAJCWlmICh0aGlzLnBhcmFtZXRlciA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjEwLDE0ICsyMTIsMTQgQEAKIAogCS8qKgogCSAqIFNldHMgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgaW4gdGhpcyBlbmhhbmNlZCBmb3Igc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhcmFtZXRlciB0aGUgbmV3IHBhcmFtZXRlcgogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7CiAJCWlmIChwYXJhbWV0ZXIgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjI3LDEyICsyMjksMTIgQEAKIAkJdGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIHBhcmFtZXRlciwgUEFSQU1FVEVSX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgZW5oYW5jZWQgZm9yIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yNDYsMTAgKzI0OCwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBlbmhhbmNlZCBmb3Igc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yNTcsNyArMjU5LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI3MCw5ICsyNzIsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGVuY2hhbmNlZCBmb3Igc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CiAJCWlmICh0aGlzLmJvZHkgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI4NiwxMCArMjg4LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuYm9keTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgZW5oYW5jZWQgZm9yIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yOTcsNyArMjk5LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTMwNywxNCArMzA5LDE0IEBACiAJCXRoaXMuYm9keSA9IHN0YXRlbWVudDsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgc3RhdGVtZW50LCBCT0RZX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhCmluZGV4IGYxYmYyYmUuLmU3NjQzYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsNTIgKzMxLDUzIEBACiAgKiBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKICAqIHRoZSAifSIgdG9rZW4gZm9sbG93aW5nIHRoZSBib2R5IGRlY2xhcmF0aW9ucy4gSWYgdGhlcmUgYXJlIGFyZ3VtZW50cyBidXQKICAqIG5vIGNsYXNzIGJvZHkgZGVjbGFyYXRpb25zLCB0aGUgc291cmNlIHJhbmdlIGV4dGVuZHMgdGhyb3VnaCB0aGUgbGFzdAotICogY2hhcmFjdGVyIG9mIHRoZSAiKSIgdG9rZW4gZm9sbG93aW5nIHRoZSBhcmd1bWVudHMuIElmIHRoZXJlIGFyZSBubyAKKyAqIGNoYXJhY3RlciBvZiB0aGUgIikiIHRva2VuIGZvbGxvd2luZyB0aGUgYXJndW1lbnRzLiBJZiB0aGVyZSBhcmUgbm8KICAqIGFyZ3VtZW50cyBhbmQgbm8gY2xhc3MgYm9keSBkZWNsYXJhdGlvbnMsIHRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoCiAgKiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGlkZW50aWZpZXIuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBKYXZhZG9jfSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBKQVZBRE9DX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBKQVZBRE9DX1BST1BFUlRZID0KIAkJaW50ZXJuYWxKYXZhZG9jUHJvcGVydHlGYWN0b3J5KEVudW1Db25zdGFudERlY2xhcmF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlKS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzMlByb3BlcnR5RmFjdG9yeShFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcyk7Ci0JCisKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoRW51bUNvbnN0YW50RGVjbGFyYXRpb24uY2xhc3MsICJhcmd1bWVudHMiLCBFeHByZXNzaW9uLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEFub255bW91c0NsYXNzRGVjbGFyYXRpb259KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEVudW1Db25zdGFudERlY2xhcmF0aW9uLmNsYXNzLCAiYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIsIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsIE9QVElPTkFMLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg2KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEVudW1Db25zdGFudERlY2xhcmF0aW9uLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC05MSwxNyArOTIsMTcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGNvbnN0YW50IG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCBKYXZhIGNsYXNzIGlkZW50aWZpZXIuCkBAIC0xMDksMjkgKzExMCwyOSBAQAogCXByaXZhdGUgU2ltcGxlTmFtZSBjb25zdGFudE5hbWUgPSBudWxsOwogCiAJLyoqCi0JICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCi0JICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqIFRoZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIChlbGVtZW50IHR5cGU6CisJICoge0BsaW5rIEV4cHJlc3Npb259KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgYXJndW1lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoQVJHVU1FTlRTX1BST1BFUlRZKTsKLQkJCQorCiAJLyoqCi0JICogVGhlIG9wdGlvbmFsIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IAorCSAqIFRoZSBvcHRpb25hbCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOwogCSAqIGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCiAJcHJpdmF0ZSBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG9wdGlvbmFsQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBlbnVtZXJhdGlvbiBjb25zdGFudHMgZGVjbGFyYXRpb24gb3duZWQgYnkKIAkgKiB0aGUgZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgZW51bWVyYXRpb24gY29uc3RhbnQgaGFzIGFuIHVuc3BlY2lmaWVkLAogCSAqIGJ1dCBsZWdhbCwgbmFtZTsgbm8gamF2YWRvYzsgYW4gZW1wdHkgbGlzdCBvZiBtb2RpZmllcnMgYW5kIGFubm90YXRpb25zOwogCSAqIGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzOyBhbmQgZG9lcyBub3QgZGVjbGFyZSBhbiBhbm9ueW1vdXMgY2xhc3MuCiAJICogPHA+Ci0JICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUKIAkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUVudW1Db25zdGFudERlY2xhcmF0aW9uKEFTVCBhc3QpIHsKQEAgLTE0NSw3ICsxNDYsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE3Nyw3ICsxNzgsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTkxLDcgKzE5Miw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkocHJvcGVydHkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCb2R5RGVjbGFyYXRpb24uCiAJICovCkBAIC0yMjYsNyArMjI3LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUVudW1Db25zdGFudERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRKYXZhZG9jKAogCQkJKEphdmFkb2MpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRKYXZhZG9jKCkpKTsKIAkJcmVzdWx0Lm1vZGlmaWVycygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIG1vZGlmaWVycygpKSk7CkBAIC0yNDQsNyArMjQ1LDcgQEAKIAkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAogCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNjAsMTIgKzI2MSwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgZGVjbGFyZWQgaW4gdGhpcyBlbnVtIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RhbnQgbmFtZSBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLmNvbnN0YW50TmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjc5LDE4ICsyODAsMTggQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5jb25zdGFudE5hbWU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50IGRlY2xhcmVkIGluIHRoaXMgZW51bSBkZWNsYXJhdGlvbiB0byB0aGUKIAkgKiBnaXZlbiBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvbnN0YW50TmFtZSB0aGUgbmV3IGNvbnN0YW50IG5hbWUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSBjb25zdGFudE5hbWUpIHsKIAkJaWYgKGNvbnN0YW50TmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0zMDUsMTAgKzMwNiwxMCBAQAogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHRoaXMgZW51bWVyYXRpb24KIAkgKiBjb25zdGFudCBkZWNsYXJhdGlvbi4gTm90ZSB0aGF0IGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzIGlzIGVxdWl2YWxlbnQKIAkgKiB0byBub3QgZXhwbGljaXRseSBzcGVjaWZ5aW5nIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCi0JICovIAorCSAqCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KQorCSAqLwogCXB1YmxpYyBMaXN0IGFyZ3VtZW50cygpIHsKIAkJcmV0dXJuIHRoaXMuYXJndW1lbnRzOwogCX0KQEAgLTMxNiwyNyArMzE3LDI3IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIGludHJvZHVjZWQgYnkgdGhpcwogCSAqIGVudW0gY29uc3RhbnQgZGVjbGFyYXRpb24sIGlmIGl0IGhhcyBvbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgd2hldGhlciB0aGlzIGVudW0gY29uc3RhbnQgZGVjbGFyYXRpb24gZGVjbGFyZXMKIAkgKiBhbiBhbm9ueW1vdXMgY2xhc3MgKHRoYXQgaXMsIGhhcyBjbGFzcyBib2R5IGRlY2xhcmF0aW9ucykuCi0JICogCi0JICogQHBhcmFtIGRlY2wgdGhlIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCisJICoKKwkgKiBAcGFyYW0gZGVjbCB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqICAgIGlmIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGRlY2wpIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGRlY2wsIEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9QUk9QRVJUWSk7CiAJCXRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gZGVjbDsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZGVjbCwgQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGNvbnN0cnVjdG9yIGludm9rZWQgYnkgdGhpcwogCSAqIGVudW0gY29uc3RhbnQuCkBAIC0zNDQsMTAgKzM0NSwxMCBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RydWN0b3IgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcKIAkgKiAgICBjYW5ub3QgYmUgcmVzb2x2ZWQKLQkgKi8JCisJICovCiAJcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlQ29uc3RydWN0b3IodGhpcyk7CiAJfQpAQCAtMzU4LDIxICszNTksMjEgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyByZXNvbHZlVmFyaWFibGUoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlVmFyaWFibGUodGhpcyk7CiAJfQotCQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VudW1EZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbnVtRGVjbGFyYXRpb24uamF2YQppbmRleCBmZTQ3ZGViLi40NWUwNDk5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VudW1EZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW51bURlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzcsNTQgKzM3LDU1IEBACiAgKiBtb2RpZmllcnMgb3IgYW5ub3RhdGlvbnMpLiBUaGUgc291cmNlIHJhbmdlIGV4dGVuZHMgdGhyb3VnaCB0aGUgbGFzdAogICogY2hhcmFjdGVyIG9mIHRoZSAifSIgdG9rZW4gZm9sbG93aW5nIHRoZSBib2R5IGRlY2xhcmF0aW9ucy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgRW51bURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gewotCQorCiAJLyoqCi0JICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEphdmFkb2N9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPQogCQlpbnRlcm5hbEphdmFkb2NQcm9wZXJ0eUZhY3RvcnkoRW51bURlY2xhcmF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzMlByb3BlcnR5RmFjdG9yeShFbnVtRGVjbGFyYXRpb24uY2xhc3MpOwotCQorCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQlpbnRlcm5hbE5hbWVQcm9wZXJ0eUZhY3RvcnkoRW51bURlY2xhcmF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAic3VwZXJJbnRlcmZhY2VUeXBlcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInN1cGVySW50ZXJmYWNlVHlwZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBTVVBFUl9JTlRFUkZBQ0VfVFlQRVNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBTVVBFUl9JTlRFUkZBQ0VfVFlQRVNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKEVudW1EZWNsYXJhdGlvbi5jbGFzcywgInN1cGVySW50ZXJmYWNlVHlwZXMiLCBUeXBlLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJlbnVtQ29uc3RhbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZW51bUNvbnN0YW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRW51bUNvbnN0YW50RGVjbGFyYXRpb259KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBFTlVNX0NPTlNUQU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEVOVU1fQ09OU1RBTlRTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihFbnVtRGVjbGFyYXRpb24uY2xhc3MsICJlbnVtQ29uc3RhbnRzIiwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24uY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgImJvZHlEZWNsYXJhdGlvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJib2R5RGVjbGFyYXRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZID0KIAkJaW50ZXJuYWxCb2R5RGVjbGFyYXRpb25Qcm9wZXJ0eUZhY3RvcnkoRW51bURlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoNik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChFbnVtRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTEwMCwxOSArMTAxLDE5IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBzdXBlcmludGVyZmFjZSB0eXBlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikuIAorCSAqIFRoZSBzdXBlcmludGVyZmFjZSB0eXBlcyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN1cGVySW50ZXJmYWNlVHlwZXMgPQpAQCAtMTIwLDIzICsxMjEsMjMgQEAKIAogCS8qKgogCSAqIFRoZSBlbnVtIGNvbnN0YW50IGRlY2xhcmF0aW9ucwotCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPkVudW1Db25zdGFudERlY2xhcmF0aW9uPC9jb2RlPikuCisJICogKGVsZW1lbnQgdHlwZToge0BsaW5rIEVudW1Db25zdGFudERlY2xhcmF0aW9ufSkuCiAJICogRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KLQlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgZW51bUNvbnN0YW50cyA9IAorCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBlbnVtQ29uc3RhbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRU5VTV9DT05TVEFOVFNfUFJPUEVSVFkpOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gZW51bSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gZW51bSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBlbnVtIGRlY2xhcmF0aW9uIGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAotCSAqIG5hbWU7IG5vIG1vZGlmaWVyczsgbm8gamF2YWRvYzsgbm8gc3VwZXJpbnRlcmZhY2VzOyAKKwkgKiBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7IG5vIHN1cGVyaW50ZXJmYWNlczsKIAkgKiBhbmQgZW1wdHkgbGlzdHMgb2YgZW51bSBjb25zdGFudHMgYW5kIGJvZHkgZGVjbGFyYXRpb25zLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlFbnVtRGVjbGFyYXRpb24oQVNUIGFzdCkgewpAQCAtMTUwLDcgKzE1MSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTc0LDcgKzE3NSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xOTQsNyArMTk1LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJvZHlEZWNsYXJhdGlvbi4KIAkgKi8KQEAgLTI0Myw3ICsyNDQsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJRW51bURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBFbnVtRGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0SmF2YWRvYygpKSk7CiAJCXJlc3VsdC5tb2RpZmllcnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBtb2RpZmllcnMoKSkpOwpAQCAtMjY0LDcgKzI2NSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjgxLDI3ICsyODIsMjcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiB0aGlzIGVudW0KIAkgKiBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBzdXBlciBpbnRlcmZhY2UgdHlwZXMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikKLQkgKi8gCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KQorCSAqLwogCXB1YmxpYyBMaXN0IHN1cGVySW50ZXJmYWNlVHlwZXMoKSB7CiAJCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlVHlwZXM7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgZW51bSBjb25zdGFudCBkZWNsYXJhdGlvbnMKIAkgKiBvZiB0aGlzIGVudW0gZGVjbGFyYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgZW51bSBjb25zdGFudCBkZWNsYXJhdGlvbnMKIAkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRW51bUNvbnN0YW50RGVjbGFyYXRpb259KQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTGlzdCBlbnVtQ29uc3RhbnRzKCkgewotCQlyZXR1cm4gZW51bUNvbnN0YW50czsKKwkJcmV0dXJuIHRoaXMuZW51bUNvbnN0YW50czsKIAl9CiAKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKQEAgLTMxMCwxNCArMzExLDE0IEBACiAJSVR5cGVCaW5kaW5nIGludGVybmFsUmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlVHlwZSh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQppbmRleCA5MzRiYjNiLi4yMDAzZDlhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw0NSArMTcsNDUgQEAKICAqIDxwPgogICogPHByZT4KICAqIEV4cHJlc3Npb246Ci0gKiAgICBOYW1lCi0gKiAgICBJbnRlZ2VyTGl0ZXJhbCAoaW5jbHVkZXMgZGVjaW1hbCwgaGV4LCBhbmQgb2N0YWwgZm9ybXM7IGFuZCBsb25nKQotICogICAgRmxvYXRpbmdQb2ludExpdGVyYWwgKGluY2x1ZGVzIGJvdGggZmxvYXQgYW5kIGRvdWJsZSkKLSAqICAgIENoYXJhY3RlckxpdGVyYWwKLSAqICAgIE51bGxMaXRlcmFsCi0gKiAgICBCb29sZWFuTGl0ZXJhbAotICogICAgU3RyaW5nTGl0ZXJhbAotICogICAgVHlwZUxpdGVyYWwKLSAqICAgIFRoaXNFeHByZXNzaW9uCi0gKiAgICBTdXBlckZpZWxkQWNjZXNzCi0gKiAgICBGaWVsZEFjY2VzcwotICogICAgQXNzaWdubWVudAotICogICAgUGFyZW50aGVzaXplZEV4cHJlc3Npb24KLSAqICAgIENsYXNzSW5zdGFuY2VDcmVhdGlvbgotICogICAgQXJyYXlDcmVhdGlvbgotICogICAgQXJyYXlJbml0aWFsaXplcgotICogICAgTWV0aG9kSW52b2NhdGlvbgotICogICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uCi0gKiAgICBBcnJheUFjY2VzcwotICogICAgSW5maXhFeHByZXNzaW9uCi0gKiAgICBJbnN0YW5jZW9mRXhwcmVzc2lvbgotICogICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uCi0gKiAgICBQb3N0Zml4RXhwcmVzc2lvbgotICogICAgUHJlZml4RXhwcmVzc2lvbgotICogICAgQ2FzdEV4cHJlc3Npb24KLSAqICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uCisgKiAgICB7QGxpbmsgQW5ub3RhdGlvbn0sCisgKiAgICB7QGxpbmsgQXJyYXlBY2Nlc3N9LAorICogICAge0BsaW5rIEFycmF5Q3JlYXRpb259LAorICogICAge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9LAorICogICAge0BsaW5rIEFzc2lnbm1lbnR9LAorICogICAge0BsaW5rIEJvb2xlYW5MaXRlcmFsfSwKKyAqICAgIHtAbGluayBDYXN0RXhwcmVzc2lvbn0sCisgKiAgICB7QGxpbmsgQ2hhcmFjdGVyTGl0ZXJhbH0sCisgKiAgICB7QGxpbmsgQ2xhc3NJbnN0YW5jZUNyZWF0aW9ufSwKKyAqICAgIHtAbGluayBDb25kaXRpb25hbEV4cHJlc3Npb259LAorICogICAge0BsaW5rIEZpZWxkQWNjZXNzfSwKKyAqICAgIHtAbGluayBJbmZpeEV4cHJlc3Npb259LAorICogICAge0BsaW5rIEluc3RhbmNlb2ZFeHByZXNzaW9ufSwKKyAqICAgIHtAbGluayBNZXRob2RJbnZvY2F0aW9ufSwKKyAqICAgIHtAbGluayBOYW1lfSwKKyAqICAgIHtAbGluayBOdWxsTGl0ZXJhbH0sCisgKiAgICB7QGxpbmsgTnVtYmVyTGl0ZXJhbH0sCisgKiAgICB7QGxpbmsgUGFyZW50aGVzaXplZEV4cHJlc3Npb259LAorICogICAge0BsaW5rIFBvc3RmaXhFeHByZXNzaW9ufSwKKyAqICAgIHtAbGluayBQcmVmaXhFeHByZXNzaW9ufSwKKyAqICAgIHtAbGluayBTdHJpbmdMaXRlcmFsfSwKKyAqICAgIHtAbGluayBTdXBlckZpZWxkQWNjZXNzfSwKKyAqICAgIHtAbGluayBTdXBlck1ldGhvZEludm9jYXRpb259LAorICogICAge0BsaW5rIFRoaXNFeHByZXNzaW9ufSwKKyAqICAgIHtAbGluayBUeXBlTGl0ZXJhbH0sCisgKiAgICB7QGxpbmsgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb259CiAgKiA8L3ByZT4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBBU1ROb2RlIHsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlFeHByZXNzaW9uKEFTVCBhc3QpIHsKQEAgLTYzLDcgKzYzLDcgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgY29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb24gdmFsdWUgYXMgCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uIHZhbHVlIGFzCiAJICogc3BlY2lmaWVkIGluIEpMUzIgMTUuMjgsIGlmIHRoaXMgZXhwcmVzc2lvbiBoYXMgb25lLiBDb25zdGFudCBleHByZXNzaW9uCiAJICogdmFsdWVzIGFyZSB1bmF2YWlsYWJsZSB1bmxlc3MgYmluZGluZ3MgYXJlIHJlcXVlc3RlZCB3aGVuIHRoZSBBU1QgaXMKIAkgKiBiZWluZyBidWlsdC4gSWYgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHR5cGUsIHRoZSByZXN1bHQKQEAgLTg0LDcgKzg0LDcgQEAKIAkgKiBTbyB0ZWNobmljYWxseSB7QGxpbmsgTnVsbExpdGVyYWx9IG5vZGVzIGFyZSBub3QgY29uc3RhbnQgZXhwcmVzc2lvbnMuCiAJICogVGhlIHJlc3VsdCBpcyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlc2Ugbm9uZXRoZWxlc3MuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwogCSAqIGV4cHJlc3Npb24gaGFzIG5vIGNvbnN0YW50IGV4cHJlc3Npb24gdmFsdWUgb3IgaWYgYmluZGluZ3Mgd2VyZSBub3QKIAkgKiByZXF1ZXN0ZWQgd2hlbiB0aGUgQVNUIHdhcyBjcmVhdGVkCkBAIC0xMDAsMTAgKzEwMCwxMCBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLCBvcgogCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgSVR5cGVCaW5kaW5nIHJlc29sdmVUeXBlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVFeHByZXNzaW9uVHlwZSh0aGlzKTsKIAl9CkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleHByZXNzaW9uIG5vZGUgaXMgdGhlIHNpdGUgb2YgYSBib3hpbmcKIAkgKiBjb252ZXJzaW9uIChKTFMzIDUuMS43KS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb25seQogCSAqIHdoZW4gYmluZGluZ3MgYXJlIHJlcXVlc3RlZCB3aGVuIHRoZSBBU1QgaXMgYmVpbmcgYnVpbHQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZXhwcmVzc2lvbiBpcyB0aGUgc2l0ZSBvZiBhCiAJICogYm94aW5nIGNvbnZlcnNpb24sIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBlaXRoZXIgbm8gYm94aW5nIGNvbnZlcnNpb24KIAkgKiBpcyBpbnZvbHZlZCBvciBpZiBiaW5kaW5ncyB3ZXJlIG5vdCByZXF1ZXN0ZWQgd2hlbiB0aGUgQVNUIHdhcyBjcmVhdGVkCkBAIC0xMjEsMTIgKzEyMSwxMiBAQAogCXB1YmxpYyBmaW5hbCBib29sZWFuIHJlc29sdmVCb3hpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlQm94aW5nKHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4cHJlc3Npb24gbm9kZSBpcyB0aGUgc2l0ZSBvZiBhbiB1bmJveGluZwogCSAqIGNvbnZlcnNpb24gKEpMUzMgNS4xLjgpLiBUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBvbmx5CiAJICogd2hlbiBiaW5kaW5ncyBhcmUgcmVxdWVzdGVkIHdoZW4gdGhlIEFTVCBpcyBiZWluZyBidWlsdC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBleHByZXNzaW9uIGlzIHRoZSBzaXRlIG9mIGFuCiAJICogdW5ib3hpbmcgY29udmVyc2lvbiwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGVpdGhlciBubyB1bmJveGluZwogCSAqIGNvbnZlcnNpb24gaXMgaW52b2x2ZWQgb3IgaWYgYmluZGluZ3Mgd2VyZSBub3QgcmVxdWVzdGVkIHdoZW4gdGhlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb25TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCmluZGV4IGYyMTI3ODEuLmUwOTg5NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0LDI1ICsyNCwyNiBAQAogICogRXhwcmVzc2lvblN0YXRlbWVudDoKICAqICAgIFN0YXRlbWVudEV4cHJlc3Npb24gPGI+OzwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkKKwogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihFeHByZXNzaW9uU3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChFeHByZXNzaW9uU3RhdGVtZW50LmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01MywxOCArNTQsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleHByZXNzaW9uLgpAQCAtNzIsMTMgKzczLDEzIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGV4cHJlc3Npb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBleHByZXNzaW9uIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gc3RhdGVtZW50IGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCiAJICogbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlFeHByZXNzaW9uU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTkxLDcgKzkyLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMjAsMTIgKzEyMSwxMiBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJRXhwcmVzc2lvblN0YXRlbWVudCByZXN1bHQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDQsMTIgKzE0NSwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGV4cHJlc3Npb24gc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE2MywxMCArMTY0LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGV4cHJlc3Npb24gc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0xNzQsNyArMTc1LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTE4NCwxNCArMTg1LDE0IEBACiAJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGV4cHJlc3Npb24sIEVYUFJFU1NJT05fUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkQWNjZXNzLmphdmEKaW5kZXggNTg4NzQzMy4uOGVmY2I3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGRBY2Nlc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCwxMCArMTgsMTAgQEAKICAqIEZpZWxkIGFjY2VzcyBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCiAgKgogICogPHByZT4KLSAqIEZpZWxkQWNjZXNzOiAKKyAqIEZpZWxkQWNjZXNzOgogICogCQlFeHByZXNzaW9uIDxiPi48L2I+IElkZW50aWZpZXIKICAqIDwvcHJlPgotICogCisgKgogICogPHA+CiAgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHNldmVyYWwga2luZHMgb2YgZXhwcmVzc2lvbnMgdGhhdCByZXNlbWJsZSBmaWVsZCBhY2Nlc3MKICAqIGV4cHJlc3Npb25zOiBxdWFsaWZpZWQgbmFtZXMsIHRoaXMgZXhwcmVzc2lvbnMsIGFuZCBzdXBlciBmaWVsZCBhY2Nlc3MKQEAgLTQ4LDM1ICs0OCwzNiBAQAogICogICAoPGNvZGU+RmllbGRBY2Nlc3M8L2NvZGU+KS48L2xpPgogICogPC91bD4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgUXVhbGlmaWVkTmFtZQogICogQHNlZSBUaGlzRXhwcmVzc2lvbgogICogQHNlZSBTdXBlckZpZWxkQWNjZXNzCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEZpZWxkQWNjZXNzIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoRmllbGRBY2Nlc3MuY2xhc3MsICJleHByZXNzaW9uIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEZpZWxkQWNjZXNzLmNsYXNzLCAibmFtZSIsIFNpbXBsZU5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChGaWVsZEFjY2Vzcy5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtODgsMTggKzg5LDE4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKIAkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgpAQCAtMTE5LDcgKzEyMCw3IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJRmllbGRBY2Nlc3MoQVNUIGFzdCkgewpAQCAtMTMyLDcgKzEzMyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTU2LDcgKzE1Nyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNjksNyArMTcwLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUZpZWxkQWNjZXNzIHJlc3VsdCA9IG5ldyBGaWVsZEFjY2Vzcyh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xOTUsMTIgKzE5NiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIxNCwxMCArMjE1LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjI1LDcgKzIyNiw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMzgsOSArMjM5LDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFjY2Vzc2VkIGluIHRoaXMgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBmaWVsZCBuYW1lCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLmZpZWxkTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjU0LDE3ICsyNTUsMTcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5maWVsZE5hbWU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFjY2Vzc2VkIGluIHRoaXMgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBmaWVsZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgZmllbGROYW1lKSB7CiAJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjgyLDcgKzI4Myw3IEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGZpZWxkIGFjY2Vzc2VkIGJ5IHRoaXMKIAkgKiBleHByZXNzaW9uLgpAQCAtMjk4LDEyICsyOTksMTIgQEAKIAlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyByZXNvbHZlRmllbGRCaW5kaW5nKCkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZUZpZWxkKHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy5leHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLmZpZWxkTmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKaW5kZXggYTQ2NjEzMy4uZmZhOGJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsNjIgKzMyLDYzIEBACiAgKiB0aGUgc291cmNlIHJhbmdlIGJlZ2lucyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGluaXRpYWwgbW9kaWZpZXIgb3IKICAqIHR5cGUuIFRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZmluYWwgIjsiLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBKYXZhZG9jfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9CiAJCWludGVybmFsSmF2YWRvY1Byb3BlcnR5RmFjdG9yeShGaWVsZERlY2xhcmF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIEludGVnZXJ9KSAoSkxTMiBBUEkgb25seSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSU19QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzUHJvcGVydHlGYWN0b3J5KEZpZWxkRGVjbGFyYXRpb24uY2xhc3MpOwotCQorCiAJLyoqCi0JICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGFkZGVkIGluIEpMUzMgQVBJKS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzMlByb3BlcnR5RmFjdG9yeShGaWVsZERlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihGaWVsZERlY2xhcmF0aW9uLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZnJhZ21lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlKS4KKwkgKiBUaGUgImZyYWdtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50fSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEZSQUdNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEZSQUdNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoRmllbGREZWNsYXJhdGlvbi5jbGFzcywgImZyYWdtZW50cyIsIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkJCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoRmllbGREZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtOTYsNyArOTcsNyBAQAogCQlhZGRQcm9wZXJ0eShUWVBFX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEZSQUdNRU5UU19QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnlMaXN0KTsKLQkJCisKIAkJcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoRmllbGREZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShKQVZBRE9DX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC0xMDksMTEgKzExMCwxMSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTEyNCw3ICsxMjUsNyBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGJhc2UgdHlwZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCB0eXBlLgpAQCAtMTMyLDIxICsxMzMsMjEgQEAKIAlwcml2YXRlIFR5cGUgYmFzZVR5cGUgPSBudWxsOwogCiAJLyoqCi0JICogVGhlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIChlbGVtZW50IHR5cGU6IAotCSAqIDxjb2RlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKiBUaGUgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50fSkuICBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzID0gCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChGUkFHTUVOVFNfUFJPUEVSVFkpOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGZpZWxkIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlIG93bmVkIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSBvd25lZAogCSAqIGJ5IHRoZSBnaXZlbiBBU1QuICBCeSBkZWZhdWx0LCB0aGUgZmllbGQgZGVjbGFyYXRpb24gaGFzOiBubyBtb2RpZmllcnMsCi0JICogYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdHlwZSwgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgdmFyaWFibGUgCisJICogYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdHlwZSwgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgdmFyaWFibGUKIAkgKiBkZWNsYXJhdGlvbiBmcmFnbWVudHMgKHdoaWNoIGlzIHN5bnRhY3RpY2FsbHkgaWxsZWdhbCkuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJRmllbGREZWNsYXJhdGlvbihBU1QgYXN0KSB7CkBAIC0xNjAsNyArMTYxLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMDAsNyArMjAxLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTIxNCw3ICsyMTUsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldENoaWxkTGlzdFByb3BlcnR5KHByb3BlcnR5KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQm9keURlY2xhcmF0aW9uLgogCSAqLwpAQCAtMjQ4LDcgKzI0OSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlGaWVsZERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEphdmFkb2MoCiAJCQkoSmF2YWRvYykgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEphdmFkb2MoKSkpOwogCQlpZiAodGhpcy5hc3QuYXBpTGV2ZWwgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKQEAgLTI2Miw3ICsyNjMsNyBAQAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBmcmFnbWVudHMoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjcwLDcgKzI3MSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjg3LDE3ICsyODgsMTcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGJhc2UgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLgogCSAqIDxwPgotCSAqIE4uQi4gVGhlIGluZGl2aWR1YWwgY2hpbGQgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIG1heSBzcGVjaWZ5IAotCSAqIGFkZGl0aW9uYWwgYXJyYXkgZGltZW5zaW9ucy4gU28gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGFyZSBub3QgCisJICogTi5CLiBUaGUgaW5kaXZpZHVhbCBjaGlsZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgbWF5IHNwZWNpZnkKKwkgKiBhZGRpdGlvbmFsIGFycmF5IGRpbWVuc2lvbnMuIFNvIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBhcmUgbm90CiAJICogbmVjZXNzYXJpbHkgZXhhY3RseSB0aGlzIHR5cGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYmFzZSB0eXBlCi0JICovIAorCSAqLwogCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CiAJCWlmICh0aGlzLmJhc2VUeXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0zMTQsMTQgKzMxNSwxNCBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgZmllbGQgZGVjbGFyYXRpb24gdG8gdGhlIGdpdmVuIHR5cGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGJhc2UgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzMzLDI2ICszMzQsMjYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGluIHRoaXMgZmllbGQgCisJICogUmV0dXJucyB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIGZpZWxkCiAJICogZGVjbGFyYXRpb24uIEFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMgZnJvbSB0aGlzIGxpc3QgYWZmZWN0cyB0aGlzIG5vZGUKLQkgKiBkeW5hbWljYWxseS4gQWxsIG5vZGVzIGluIHRoaXMgbGlzdCBtdXN0IGJlIAotCSAqIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT5zOyBhdHRlbXB0cyB0byBhZGQgYW55IG90aGVyIAorCSAqIGR5bmFtaWNhbGx5LiBBbGwgbm9kZXMgaW4gdGhpcyBsaXN0IG11c3QgYmUKKwkgKiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+czsgYXR0ZW1wdHMgdG8gYWRkIGFueSBvdGhlcgogCSAqIHR5cGUgb2Ygbm9kZSB3aWxsIHRyaWdnZXIgYW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgaW4gdGhpcyAKLQkgKiAgICBzdGF0ZW1lbnQgKGVsZW1lbnQgdHlwZTogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPikKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGluIHRoaXMKKwkgKiAgICBzdGF0ZW1lbnQgKGVsZW1lbnQgdHlwZToge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudH0pCisJICovCiAJcHVibGljIExpc3QgZnJhZ21lbnRzKCkgewogCQlyZXR1cm4gdGhpcy52YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzOwogCX0KLQkJCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWxlQVNUUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpbGVBU1RSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTk2ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWxlQVNUUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQW4gQVNUIHJlcXVlc3RvciBoYW5kbGVzIEFTVHMgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHBhc3NlZCB0bworICoge0BsaW5rIEFTVFBhcnNlciNjcmVhdGVBU1RzKFN0cmluZ1tdLCBTdHJpbmdbXSwgU3RyaW5nW10sIEZpbGVBU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUc30uCisgKiA8cD4KKyAqIHtAbGluayBGaWxlQVNUUmVxdWVzdG9yI2FjY2VwdEFTVChTdHJpbmcsIENvbXBpbGF0aW9uVW5pdCkgRmlsZUFTVFJlcXVlc3Rvci5hY2NlcHRBU1R9IGlzIGNhbGxlZCBmb3IgZWFjaCBvZiB0aGUKKyAqIGNvbXBpbGF0aW9uIHVuaXRzIHBhc3NlZCB0byB7QGxpbmsgQVNUUGFyc2VyI2NyZWF0ZUFTVHMoU3RyaW5nW10sIFN0cmluZ1tdLCBTdHJpbmdbXSwgRmlsZUFTVFJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIEFTVFBhcnNlci5jcmVhdGVBU1RzfS4KKyAqIEFmdGVyIGFsbCB0aGUgY29tcGlsYXRpb24gdW5pdHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwKKyAqIHtAbGluayAjYWNjZXB0QmluZGluZyhTdHJpbmcsIElCaW5kaW5nKSBGaWxlQVNUUmVxdWVzdG9yLmFjY2VwdEJpbmRpbmd9IGlzIGNhbGxlZCBmb3IgZWFjaAorICogb2YgdGhlIGJpbmRpbmcga2V5cyBwYXNzZWQgdG8ge0BsaW5rIEFTVFBhcnNlciNjcmVhdGVBU1RzKFN0cmluZ1tdLCBTdHJpbmdbXSwgU3RyaW5nW10sIEZpbGVBU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSBBU1RQYXJzZXIuY3JlYXRlQVNUc30uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogQVNUIHJlcXVlc3RvcnMgYXJlIHNlcmlhbGx5IHJldXNhYmxlLCBidXQgbmVpdGhlciByZWVudHJhbnQgbm9yIHRocmVhZC1zYWZlLgorICogPC9wPgorICoKKyAqIEBzZWUgQVNUUGFyc2VyI2NyZWF0ZUFTVHMoU3RyaW5nW10sIFN0cmluZ1tdLCBTdHJpbmdbXSwgRmlsZUFTVFJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisgKiBAc2luY2UgMy42CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQVNUUmVxdWVzdG9yIHsKKworCS8qKgorCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IHJlc29sdmVyIHVzZWQgdG8gcmVzb2x2ZSBiaW5kaW5ncywgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBub24tbnVsbAorCSAqIG9ubHkgd2l0aGluIHRoZSBkeW5hbWljIHNjb3BlIG9mIGEgY2FsbCB0bworCSAqIDxjb2RlPkFTVFBhcnNlci5jcmVhdGVBU1RzPC9jb2RlPi4KKwkgKi8KKwlDb21waWxhdGlvblVuaXRSZXNvbHZlciBjb21waWxhdGlvblVuaXRSZXNvbHZlciA9IG51bGw7CisKKwkvKioKKwkgKiBBY2NlcHRzIGFuIEFTVCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21waWxhdGlvbiB1bml0LgorCSAqIFRoYXQgaXMsIDxjb2RlPmFzdDwvY29kZT4gaXMgYW4gQVNUIGZvciA8Y29kZT5zb3VyY2U8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKwkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0byBwcm9jZXNzIHRoZSByZXN1bHRpbmcgQVNULgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2VGaWxlUGF0aCB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGUgZ2l2ZW4gYXN0IGlzIGNvbWluZyBmcm9tCisJICogQHBhcmFtIGFzdCB0aGUgcmVxdWVzdGVkIGFic3RyYWN0IHN5bnRheCB0cmVlCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0QVNUKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgQ29tcGlsYXRpb25Vbml0IGFzdCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQWNjZXB0cyBhIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgYmluZGluZyBrZXkuCisJICogVGhhdCBpcywgPGNvZGU+YmluZGluZzwvY29kZT4gaXMgdGhlIGJpbmRpbmcgZm9yCisJICogPGNvZGU+YmluZGluZ0tleTwvY29kZT47IDxjb2RlPmJpbmRpbmc8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgdGhlIGtleSBjYW5ub3QgYmUgcmVzb2x2ZWQuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorCSAqIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIHRvIHByb2Nlc3MgdGhlIHJlc3VsdGluZyBiaW5kaW5nLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBiaW5kaW5nS2V5IHRoZSBrZXkgb2YgdGhlIHJlcXVlc3RlZCBiaW5kaW5nCisJICogQHBhcmFtIGJpbmRpbmcgdGhlIHJlcXVlc3RlZCBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0QmluZGluZyhTdHJpbmcgYmluZGluZ0tleSwgSUJpbmRpbmcgYmluZGluZykgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBiaW5kaW5nIGtleXMuCisJICogVGhlIGdpdmVuIGJpbmRpbmcga2V5cyBtdXN0IGhhdmUgYmVlbiBvYnRhaW5lZCBlYXJsaWVyCisJICogdXNpbmcge0BsaW5rIElCaW5kaW5nI2dldEtleSgpfS4KKwkgKiA8cD4KKwkgKiBJZiBhIGJpbmRpbmcga2V5IGNhbm5vdCBiZSByZXNvbHZlZCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcHV0IGluIHRoZSByZXN1bHRpbmcgYXJyYXkuCisJICogQmluZGluZ3MgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgaW4gdGhlIGR5bmFtaWMgc2NvcGUgb2YgYSA8Y29kZT5BU1RQYXJzZXIuY3JlYXRlQVNUczwvY29kZT4sCisJICogYW5kIG9ubHkgaWYgPGNvZGU+QVNUUGFyc2VyLnJlc29sdmVCaW5kaW5ncyh0cnVlKTwvY29kZT4gd2FzIHNwZWNpZmllZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogQ2F2ZWF0OiBEdXJpbmcgYW4gPGNvZGU+YWNjZXB0QVNUPC9jb2RlPiBjYWxsYmFjaywgdGhlcmUgYXJlIGltcGxlbWVudGF0aW9uCisJICogbGltaXRhdGlvbnMgY29uY2VybmluZyB0aGUgbG9vayB1cCBvZiBiaW5kaW5nIGtleXMgcmVwcmVzZW50aW5nIGxvY2FsIGVsZW1lbnRzLgorCSAqIEluIHNvbWUgY2FzZXMsIHRoZSBiaW5kaW5nIGlzIHVuYXZhaWxhYmxlLCBhbmQgPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSByZXR1cm5lZC4KKwkgKiBUaGlzIGlzIG9ubHkgYW4gaXNzdWUgZHVyaW5nIGFuIDxjb2RlPmFjY2VwdEFTVDwvY29kZT4gY2FsbGJhY2ssIGFuZCBvbmx5CisJICogd2hlbiB0aGUgYmluZGluZyBrZXkgcmVwcmVzZW50cyBhIGxvY2FsIGVsZW1lbnQgKGUuZy4sIGxvY2FsIHZhcmlhYmxlLAorCSAqIGxvY2FsIGNsYXNzLCBtZXRob2QgZGVjbGFyZWQgaW4gYW5vbnltb3VzIGNsYXNzKS4gVGhlcmUgaXMgbm8gc3VjaCBsaW1pdGF0aW9uCisJICogb3V0c2lkZSBvZiA8Y29kZT5hY2NlcHRBU1Q8L2NvZGU+IGNhbGxiYWNrcywgb3IgZm9yIHRvcC1sZXZlbCB0eXBlcyBhbmQgdGhlaXIKKwkgKiBtZW1iZXJzIGV2ZW4gd2l0aGluIDxjb2RlPmFjY2VwdEFTVDwvY29kZT4gY2FsbGJhY2tzLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBiaW5kaW5nS2V5cyB0aGUgYmluZGluZyBrZXlzIHRvIGxvb2sgdXAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBiaW5kaW5ncyBwYXJhbGxlbGluZyB0aGUgPGNvZGU+YmluZGluZ0tleXM8L2NvZGU+IHBhcmFtZXRlciwKKwkgKiB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IGVudHJpZXMgZm9yIGtleXMgdGhhdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKKwkgKi8KKwlwdWJsaWMgZmluYWwgSUJpbmRpbmdbXSBjcmVhdGVCaW5kaW5ncyhTdHJpbmdbXSBiaW5kaW5nS2V5cykgeworCQlpbnQgbGVuZ3RoID0gYmluZGluZ0tleXMubGVuZ3RoOworCQlJQmluZGluZ1tdIHJlc3VsdCA9IG5ldyBJQmluZGluZ1tsZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSBudWxsOworCQkJaWYgKHRoaXMuY29tcGlsYXRpb25Vbml0UmVzb2x2ZXIgIT0gbnVsbCkgeworCQkJCXJlc3VsdFtpXSA9IHRoaXMuY29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuY3JlYXRlQmluZGluZyhiaW5kaW5nS2V5c1tpXSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZvclN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Gb3JTdGF0ZW1lbnQuamF2YQppbmRleCAxZTQwYTllLi4zOGMzNzNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZvclN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRm9yU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzcsNDYgKzM3LDQ3IEBACiAgKiB3aXRoIHR3byBmcmFnbWVudHMsIHJhdGhlciB0aGFuIGJlaW5nIHNwbGl0IHVwIGludG8gYSBwYWlyCiAgKiBvZiBleHByZXNzaW9ucy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkKKwogCS8qKgotCSAqIFRoZSAiaW5pdGlhbGl6ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiaW5pdGlhbGl6ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIElOSVRJQUxJWkVSU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIElOSVRJQUxJWkVSU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoRm9yU3RhdGVtZW50LmNsYXNzLCAiaW5pdGlhbGl6ZXJzIiwgRXhwcmVzc2lvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihGb3JTdGF0ZW1lbnQuY2xhc3MsICJleHByZXNzaW9uIiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInVwZGF0ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidXBkYXRlcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVVBEQVRFUlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBVUERBVEVSU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoRm9yU3RhdGVtZW50LmNsYXNzLCAidXBkYXRlcnMiLCBFeHByZXNzaW9uLmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJib2R5IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFN0YXRlbWVudH0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoRm9yU3RhdGVtZW50LmNsYXNzLCAiYm9keSIsIFN0YXRlbWVudC5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg1KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEZvclN0YXRlbWVudC5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtOTAsMjEgKzkxLDIxIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBpbml0aWFsaXplciBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBpbml0aWFsaXplcnMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChJTklUSUFMSVpFUlNfUFJPUEVSVFkpOwpAQCAtMTEzLDEwICsxMTQsMTAgQEAKIAkgKiBUaGUgY29uZGl0aW9uIGV4cHJlc3Npb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgogCSAqLwogCXByaXZhdGUgRXhwcmVzc2lvbiBvcHRpb25hbENvbmRpdGlvbkV4cHJlc3Npb24gPSBudWxsOwotCQorCiAJLyoqCi0JICogVGhlIGxpc3Qgb2YgdXBkYXRlIGV4cHJlc3Npb25zIChlbGVtZW50IHR5cGU6IAotCSAqIDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKiBUaGUgbGlzdCBvZiB1cGRhdGUgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB1cGRhdGVycyA9CiAJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KFVQREFURVJTX1BST1BFUlRZKTsKQEAgLTEyNiwxMiArMTI3LDEyIEBACiAJICogc3RhdGVtZW50LgogCSAqLwogCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOwotCQkJCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIGZvciBzdGF0ZW1lbnQgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4gCi0JICogQnkgZGVmYXVsdCwgdGhlcmUgYXJlIG5vIGluaXRpYWxpemVycywgbm8gY29uZGl0aW9uIGV4cHJlc3Npb24sIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgZm9yIHN0YXRlbWVudCBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMsIG5vIGNvbmRpdGlvbiBleHByZXNzaW9uLAogCSAqIG5vIHVwZGF0ZXJzLCBhbmQgdGhlIGJvZHkgaXMgYW4gZW1wdHkgYmxvY2suCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJRm9yU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTE0NCw3ICsxNDUsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgpAQCAtMTY5LDcgKzE3MCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xOTYsNyArMTk3LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCUZvclN0YXRlbWVudCByZXN1bHQgPSBuZXcgRm9yU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LmluaXRpYWxpemVycygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGluaXRpYWxpemVycygpKSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKApAQCAtMjI5LDM3ICsyMzAsMzcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGluaXRpYWxpemVyIGV4cHJlc3Npb25zIGluIHRoaXMgZm9yCiAJICogc3RhdGVtZW50LgogCSAqIDxwPgotCSAqIFRoZSBsaXN0IHNob3VsZCBjb25zaXN0IG9mIGVpdGhlciBhIGxpc3Qgb2Ygc28gY2FsbGVkIHN0YXRlbWVudCAKLQkgKiBleHByZXNzaW9ucyAoSkxTMiwgMTQuOCksIG9yIGEgc2luZ2xlIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uPC9jb2RlPi4gCisJICogVGhlIGxpc3Qgc2hvdWxkIGNvbnNpc3Qgb2YgZWl0aGVyIGEgbGlzdCBvZiBzbyBjYWxsZWQgc3RhdGVtZW50CisJICogZXhwcmVzc2lvbnMgKEpMUzIsIDE0LjgpLCBvciBhIHNpbmdsZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjwvY29kZT4uCiAJICogT3RoZXJ3aXNlLCB0aGUgZm9yIHN0YXRlbWVudCB3b3VsZCBoYXZlIG5vIEphdmEgc291cmNlIGVxdWl2YWxlbnQuCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBpbml0aWFsaXplciBleHByZXNzaW9ucyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pCisJICovCiAJcHVibGljIExpc3QgaW5pdGlhbGl6ZXJzKCkgewogCQlyZXR1cm4gdGhpcy5pbml0aWFsaXplcnM7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gb2YgdGhpcyBmb3Igc3RhdGVtZW50LCBvciAKKwkgKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBvZiB0aGlzIGZvciBzdGF0ZW1lbnQsIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxDb25kaXRpb25FeHByZXNzaW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBvZiB0aGlzIHJldHVybiBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgICBpZiB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CkBAIC0yNjgsNyArMjY5LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsQ29uZGl0aW9uRXhwcmVzc2lvbjsKIAkJcHJlUmVwbGFjZUNoaWxkKG9sZENoaWxkLCBleHByZXNzaW9uLCBFWFBSRVNTSU9OX1BST1BFUlRZKTsKQEAgLTI4MywxOSArMjg0LDE5IEBACiAJICogVGhlIGxpc3Qgc2hvdWxkIGNvbnNpc3Qgb2Ygc28gY2FsbGVkIHN0YXRlbWVudCBleHByZXNzaW9ucy4gT3RoZXJ3aXNlLAogCSAqIHRoZSBmb3Igc3RhdGVtZW50IHdvdWxkIGhhdmUgbm8gSmF2YSBzb3VyY2UgZXF1aXZhbGVudC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHVwZGF0ZSBleHByZXNzaW9ucyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdXBkYXRlIGV4cHJlc3Npb25zCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KQorCSAqLwogCXB1YmxpYyBMaXN0IHVwZGF0ZXJzKCkgewogCQlyZXR1cm4gdGhpcy51cGRhdGVyczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgZm9yIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgewogCQlpZiAodGhpcy5ib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0zMDksNyArMzEwLDcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5ib2R5OwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBmb3Igc3RhdGVtZW50LgogCSAqIDxwPgpAQCAtMzIwLDcgKzMyMSw3IEBACiAJICogY29tcGlsZSwgYmUgc3VyZSB0byBlbWJlZCB0aGUgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4KIAkgKiBpbnNpZGUgYSA8Y29kZT5CbG9jazwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHN0YXRlbWVudCB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTMyOCw3ICszMjksNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0Qm9keShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAJCWlmIChzdGF0ZW1lbnQgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzM4LDE0ICszMzksMTQgQEAKIAkJdGhpcy5ib2R5ID0gc3RhdGVtZW50OwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBzdGF0ZW1lbnQsIEJPRFlfUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgNCAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lBbm5vdGF0aW9uQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQW5ub3RhdGlvbkJpbmRpbmcuamF2YQppbmRleCBlYjgwMmNmLi41MTY2OTJiIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lBbm5vdGF0aW9uQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUFubm90YXRpb25CaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDMzICsxMywzMSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIC8qKgotICogUmVwcmVzZW50cyBhbiByZXNvbHZlZCBhbm5vdGF0aW9uLiBSZXNvbHZlZCBhbm5vdGF0aW9uIGFyZSBjb21wdXRlZCBhbG9uZyB3aXRoIG90aGVyCisgKiBSZXByZXNlbnRzIGEgcmVzb2x2ZWQgYW5ub3RhdGlvbi4gUmVzb2x2ZWQgYW5ub3RhdGlvbnMgYXJlIGNvbXB1dGVkIGFsb25nIHdpdGggb3RoZXIKICAqIGJpbmRpbmdzOyB0aGV5IGNvcnJlc3BvbmQgdG8ge0BsaW5rIEFubm90YXRpb259IG5vZGVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjIKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlciB2YWx1ZSBwYWlycyBmb3IgdGhpcyBhbm5vdGF0aW9uLCBpbmNsdWRpbmcKLQkgKiBvbmVzIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSBhbm5vdGF0aW9uIGFzIHdlbGwgYXMgZW50cmllcyBmb3IgCisJICogb25lcyBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgYW5ub3RhdGlvbiBhcyB3ZWxsIGFzIGVudHJpZXMgZm9yCiAJICogYW5ub3RhdGlvbiB0eXBlIG1lbWJlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyB0aGF0IGFyZSBpbXBsaWVkLgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgcmVzb2x2ZWQgbWVtYmVyIHZhbHVlIHBhaXJzCiAJICovCiAJSU1lbWJlclZhbHVlUGFpckJpbmRpbmdbXSBnZXRBbGxNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBhbm5vdGF0aW9uLiBUaGUgcmVzdWx0aW5nIHR5cGUgYmluZGluZyB3aWxsIGFsd2F5cwogCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgl0byA8Y29kZT5JVHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uKCk8L2NvZGU+LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgYW5ub3RhdGlvbgogCSAqLwogCUlUeXBlQmluZGluZyBnZXRBbm5vdGF0aW9uVHlwZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGlzdCBvZiBkZWNsYXJlZCBtZW1iZXIgdmFsdWUgcGFpcnMgZm9yIHRoaXMgYW5ub3RhdGlvbi4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIGEge0BsaW5rIE1hcmtlckFubm90YXRpb259LCBhIG9uZSBlbGVtZW50CkBAIC00NywyMCArNDUsMjAgQEAKIAkgKiBvZiB0aGUgZXhwbGljaXRseSBsaXN0ZWQgdmFsdWVzIGluIGEge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGUgbGlzdCBvbmx5IGluY2x1ZGVzIGVudHJpZXMgZm9yIGFubm90YXRpb24gdHlwZSBtZW1iZXJzIHRoYXQgYXJlCi0JICogZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhlIGFubm90YXRpb24uIFRoZSBsaXN0IGRvZXMgbm90IGluY2x1ZGUgYW55IAorCSAqIGV4cGxpY2l0bHkgbWVudGlvbmVkIGluIHRoZSBhbm5vdGF0aW9uLiBUaGUgbGlzdCBkb2VzIG5vdCBpbmNsdWRlIGFueQogCSAqIGFubm90YXRpb24gdHlwZSBtZW1iZXJzIHdpdGggZGVmYXVsdCB2YWx1ZXMgdGhhdCBhcmUgbWVyZWx5IGltcGxpZWQuCiAJICogVXNlIHtAbGluayAjZ2V0QWxsTWVtYmVyVmFsdWVQYWlycygpfSB0byBnZXQgdGhvc2UgYXMgd2VsbC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiByZXNvbHZlZCBtZW1iZXIgdmFsdWUgcGFpcnMKIAkgKi8KIAlJTWVtYmVyVmFsdWVQYWlyQmluZGluZ1tdIGdldERlY2xhcmVkTWVtYmVyVmFsdWVQYWlycygpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlCiAJICovCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YQppbmRleCAwYzdjNGVmLi4wNjY3OGMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDYgKzExLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiAKIC8qKgpAQCAtMTksMTUgKzIwLDE1IEBACiAgKiBzZWVuIGZyb20gdGhlIGNvbXBpbGVyJ3MgcG9pbnQgb2Ygdmlldy4gVGhpcyBpbnRlcmZhY2UgZGVjbGFyZSBwcm90b2NvbAogICogY29tbW9uIHRvIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBraW5kcyBvZiBuYW1lZCBlbnRpdGllcyBpbiB0aGUgSmF2YSBsYW5ndWFnZToKICAqIHBhY2thZ2VzLCB0eXBlcywgZmllbGRzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBsb2NhbCB2YXJpYWJsZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgogICoKICAqIEBzZWUgSVBhY2thZ2VCaW5kaW5nCiAgKiBAc2VlIElUeXBlQmluZGluZwogICogQHNlZSBJVmFyaWFibGVCaW5kaW5nCiAgKiBAc2VlIElNZXRob2RCaW5kaW5nCisgKiBAc2VlIElBbm5vdGF0aW9uQmluZGluZworICogQHNlZSBJTWVtYmVyVmFsdWVQYWlyQmluZGluZwogICogQHNpbmNlIDIuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElCaW5kaW5nIHsKIApAQCAtMTAxLDcgKzEwMiw3IEBACiAJICogPGxpPlZhcmlhYmxlIGJpbmRpbmdzIC0gdGhlc2UgYXJlIGFubm90YXRpb25zIG9uIGEgZmllbGQsIGVudW0gY29uc3RhbnQsCiAJICogb3IgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbi48L2xpPgogCSAqIDxsaT5Bbm5vdGF0aW9uIGJpbmRpbmdzIC0gYW4gZW1wdHkgYXJyYXkgaXMgYWx3YXlzIHJldHVybmVkPC9saT4KLQkgKiA8bGk+TWVtYmVyIHZhbHVlIHBhaXIgYmluZGluZ3MgLSBhbiBlbXB0eSBhcnJheSBpcyBhbHdheXMgcmV0dXJuZWQ8bGk+CisJICogPGxpPk1lbWJlciB2YWx1ZSBwYWlyIGJpbmRpbmdzIC0gYW4gZW1wdHkgYXJyYXkgaXMgYWx3YXlzIHJldHVybmVkPC9saT4KIAkgKiA8L3VsPgogCSAqCiAJICogQHJldHVybiB0aGUgbGlzdCBvZiByZXNvbHZlZCBhbm5vdGF0aW9ucywgb3IgdGhlIGVtcHR5IGxpc3QgaWYgdGhlcmUgYXJlIG5vCkBAIC0xOTIsOCArMTkzLDggQEAKIAkgKiA8cD4KIAkgKiBGb3IgYXJyYXkgdHlwZXMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIEphdmEgZWxlbWVudCB0aGF0IGNvcnJlc3BvbmRzCiAJICogdG8gdGhlIGFycmF5J3MgZWxlbWVudCB0eXBlLiBGb3IgcmF3IGFuZCBwYXJhbWV0ZXJpemVkIHR5cGVzLCB0aGlzIG1ldGhvZAotCSAqIHJldHVybnMgdGhlIEphdmEgZWxlbWVudCBvZiB0aGUgZXJhc3VyZS4gRm9yIGFubm90YXRpb25zLCB0aGlzIG1ldGhvZHMKLQkgKiByZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24gdHlwZS4KKwkgKiByZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnQgb2YgdGhlIGVyYXN1cmUuIEZvciBhbm5vdGF0aW9ucywgdGhpcyBtZXRob2QKKwkgKiByZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24gKGkuZS4gYW4ge0BsaW5rIElBbm5vdGF0aW9ufSkuCiAJICogPC9wPgogCSAqIDxwPgogCSAqIEhlcmUgYXJlIHRoZSBjYXNlcyB3aGVyZSBhIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBleHBlY3RlZDoKQEAgLTI3MCwxMCArMjcxLDEyIEBACiAJICogPGxpPm1lbWJlcnMgb2YgZ2VuZXJpYyB0eXBlIGluc3RhbmNlcyAtIHRoZSBrZXkgb2YgdGhlIGdlbmVyaWMgdHlwZQogCSAqIGluc3RhbmNlIGFuZCB0aGUga2V5IG9mIHRoZSBjb3JyZXNwb25kaW5nIG1lbWJlciBpbiB0aGUgZ2VuZXJpYwogCSAqIHR5cGU8L2xpPgorCSAqIDxsaT5hbm5vdGF0aW9ucyAtIHRoZSBrZXkgb2YgdGhlIGFubm90YXRlZCBlbGVtZW50IGFuZCB0aGUga2V5IG9mCisJICogdGhlIGFubm90YXRpb24gdHlwZTwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogPHA+Tm90ZSB0aGF0IHRoZSBrZXkgZm9yIGFubm90YXRpb24gYmluZGluZ3MgYW5kIG1lbWJlciB2YWx1ZSBwYWlyIGJpbmRpbmdzIGlzCi0JICogbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0aGVzZSAyIGtpbmRzIG9mIGJpbmRpbmdzLjxicj4KKwkgKiA8cD5Ob3RlIHRoYXQgdGhlIGtleSBmb3IgbWVtYmVyIHZhbHVlIHBhaXIgYmluZGluZ3MgaXMKKwkgKiBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRoaXMga2luZCBvZiBiaW5kaW5ncy48YnI+CiAJICogUmVjb3ZlcmVkIGJpbmRpbmdzIGhhdmUgYSB1bmlxdWUga2V5LgogCSAqIDwvcD4KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JRXh0ZW5kZWRNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JRXh0ZW5kZWRNb2RpZmllci5qYXZhCmluZGV4IGE5NmIwNzIuLjc4NzJjM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUV4dGVuZGVkTW9kaWZpZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lFeHRlbmRlZE1vZGlmaWVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjIgKzIxLDIyIEBACiAgKiBAc2luY2UgMy4xCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkTW9kaWZpZXIgewotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXh0ZW5kZWQgbW9kaWZpZXIgaXMgYSBzdGFuZGFyZCBtb2RpZmllci4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHN0YW5kYXJkIG1vZGlmaWVyCiAJICogKGluc3RhbmNlIG9mIHtAbGluayBNb2RpZmllcn0pLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVyKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleHRlbmRlZCBtb2RpZmllciBpcyBhbiBhbm5vdGF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGFuIGFubm90YXRpb24KLQkgKiAoaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQW5ub3RhdGlvbn0pLCBhbmQgCisJICogKGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIEFubm90YXRpb259KSwgYW5kCiAJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb24oKTsKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWVtYmVyVmFsdWVQYWlyQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWVtYmVyVmFsdWVQYWlyQmluZGluZy5qYXZhCmluZGV4IGQ4OWM5NTQuLmUxODEzYTUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSU1lbWJlclZhbHVlUGFpckJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDIzICsxNiwyMSBAQAogICogUmVwcmVzZW50cyBhIHJlc29sdmVkIGluc3RhbmNlIG9mIGFuIGFubm90YXRpb24ncyBtZW1iZXIgdmFsdWUgcGFpci4KICAqIFJlc29sdmVkIGFubm90YXRpb24gYXJlIGNvbXB1dGVkIGFsb25nIHdpdGggb3RoZXIgYmluZGluZ3M7IHRoZXNlIG9iamVjdHMKICAqIGNvcnJlc3BvbmQgdG8ge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gbm9kZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nIGV4dGVuZHMgSUJpbmRpbmcgewogLyoqCiAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyLgotICogCisgKgogICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwogCiAvKioKICAqIFJldHVybnMgdGhlIG1ldGhvZCBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWVkIGFubm90YXRpb24gdHlwZSBtZW1iZXIuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZyBmb3IgdGhlIGFubm90YXRpb24gdHlwZSBtZW1iZXIKICAqLwogcHVibGljIElNZXRob2RCaW5kaW5nIGdldE1ldGhvZEJpbmRpbmcoKTsKQEAgLTQ4LDcgKzQ2LDcgQEAKICAqIDxsaT5hcnJheSB0eXBlIC0gYW4gPGNvZGU+T2JqZWN0W108L2NvZGU+IHdob3NlIGVsZW1lbnRzIGFyZSBhcyBwZXIgYWJvdmUKICAqICh0aGUgbGFuZ3VhZ2Ugb25seSBhbGxvd3Mgc2luZ2xlIGRpbWVuc2lvbmFsIGFycmF5cyBpbiBhbm5vdGF0aW9ucyk8L2xpPgogICogPC91bD4KLSAqIAkKKyAqCiAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMKICAqLwogcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWV0aG9kQmluZGluZy5qYXZhCmluZGV4IDVlZWNjYzIuLjU2NGIyYTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSU1ldGhvZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lNZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsMjYgKzI3LDI0IEBACiAgKiBwYXJhbWV0ZXJzIChmb3IgdGhlc2UsIDxjb2RlPmdldFR5cGVBcmd1bWVudHM8L2NvZGU+IHJldHVybnMKICAqIGFuIGVtcHR5IGxpc3QsIGFuZCBib3RoIDxjb2RlPmlzUGFyYW1ldGVyaXplZE1ldGhvZDwvY29kZT4gYW5kCiAgKiA8Y29kZT5pc1Jhd01ldGhvZDwvY29kZT4gcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgogICoKICAqIEBzZWUgSVR5cGVCaW5kaW5nI2dldERlY2xhcmVkTWV0aG9kcygpCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIGZvciBhIGNvbnN0cnVjdG9yIG9yIGEgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSBiaW5kaW5nIGZvciBhIGNvbnN0cnVjdG9yLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgYmluZGluZyBmb3IgYSBtZXRob2QKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOwogCiAJLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYmluZGluZyBpcyBrbm93biB0byBiZSBhIGNvbXBpbGVyLWdlbmVyYXRlZCAKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLiAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIGtub3duIHRvIGJlIGEgY29tcGlsZXItZ2VuZXJhdGVkCisJICogZGVmYXVsdCBjb25zdHJ1Y3Rvci4KIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3I6CiAJICogPHVsPgpAQCAtNjAsMzUgKzU4LDM1IEBACiAJICogY2xhc3MgZmlsZSB3aGV0aGVyIGEgMC1hcmd1bWVudCBjb25zdHJ1Y3RvciB3YXMgcHJlc2VudCBpbiB0aGUgc291cmNlCiAJICogY29kZSB2ZXJzdXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBKYXZhIGNvbXBpbGVyKTwvbGk+CiAJICogPC91bD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMga25vd24gdG8gYmUgdGhlIGJpbmRpbmcgZm9yIGEgCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMga25vd24gdG8gYmUgdGhlIGJpbmRpbmcgZm9yIGEKIAkgKiBjb21waWxlci1nZW5lcmF0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgogCSAqIG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjAKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Q29uc3RydWN0b3IoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIGJpbmRpbmcuIFRoZSBtZXRob2QgbmFtZQogCSAqIGlzIGFsd2F5cyBhIHNpbXBsZSBpZGVudGlmaWVyLiBUaGUgbmFtZSBvZiBhIGNvbnN0cnVjdG9yIGlzIGFsd2F5cyB0aGUKIAkgKiBzYW1lIGFzIHRoZSBkZWNsYXJlZCBuYW1lIG9mIGl0cyBkZWNsYXJpbmcgY2xhc3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLCBvciB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGlzCiAJICogICBjb25zdHJ1Y3RvcidzIGRlY2xhcmluZyBjbGFzcwogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdHlwZSBiaW5kaW5nIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlCiAJICogdGhhdCBkZWNsYXJlcyB0aGlzIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGRlY2xhcmVzIHRoaXMgbWV0aG9kCiAJICogICAgb3IgY29uc3RydWN0b3IKIAkgKi8KIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldERlY2xhcmluZ0NsYXNzKCk7CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBkZWZhdWx0IHZhbHVlIG9mIGFuIGFubm90YXRpb24gdHlwZSBtZW1iZXIsIAorCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIGRlZmF1bHQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbiB0eXBlIG1lbWJlciwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWVtYmVyIGhhcyBubyBkZWZhdWx0IHZhbHVlLCBvciBpZiB0aGlzCiAJICogaXMgbm90IHRoZSBiaW5kaW5nIGZvciBhbiBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyLgogCSAqIDxwPgpAQCAtMTAzLDcgKzEwMSw3IEBACiAJICogPGxpPmFycmF5IHR5cGUgLSBhbiA8Y29kZT5PYmplY3RbXTwvY29kZT4gd2hvc2UgZWxlbWVudHMgYXJlIGFzIHBlciBhYm92ZQogCSAqICh0aGUgbGFuZ3VhZ2Ugb25seSBhbGxvd3Mgc2luZ2xlIGRpbWVuc2lvbmFsIGFycmF5cyBpbiBhbm5vdGF0aW9ucyk8L2xpPgogCSAqIDwvdWw+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbiB0eXBlIG1lbWJlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBub25lIG9yIG5vdCBhcHBsaWNhYmxlCiAJICogQHNpbmNlIDMuMgpAQCAtMTEyLDEzICsxMTAsMTMgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIGFubm90YXRpb25zIG9mIGEgcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotCSAqIFRoZSByZXN1bHQgcmV0dXJuZWQgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIAorCSAqIFRoZSByZXN1bHQgcmV0dXJuZWQgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCiAJICogdGhpcyBpcyBhIHBhcmFtZXRlcml6ZWQgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhcmFtSW5kZXggdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgb2YgaW50ZXJlc3QKIAkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBhbm5vdGF0aW9ucyBvZiB0aGUgPGNvZGU+cGFyYW1JbmRleDwvY29kZT50aCBwYXJhbWV0ZXIsCiAJICogb3IgYW4gZW1wdHkgbGlzdCBpZiB0aGVyZSBhcmUgbm9uZQotCSAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtSW5kZXg8L2NvZGU+IGlzIAorCSAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtSW5kZXg8L2NvZGU+IGlzCiAJICogbm90IGEgdmFsaWQgaW5kZXgKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC0xNDEsNyArMTM5LDcgQEAKIAkgKiBOb3RlOiBUaGUgcmVzdWx0IGRvZXMgbm90IGluY2x1ZGUgc3ludGhldGljIHBhcmFtZXRlcnMgaW50cm9kdWNlZCBieQogCSAqIGlubmVyIGNsYXNzIGVtdWxhdGlvbi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgZm9yIHRoZSBmb3JtYWwKIAkgKiAgIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2Qgb3IgY29uc3RydWN0b3IKIAkgKi8KQEAgLTE1MCw3ICsxNDgsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZC4gUmV0dXJucyB0aGUKIAkgKiBzcGVjaWFsIHByaW1pdGl2ZSA8Y29kZT52b2lkPC9jb2RlPiByZXR1cm4gdHlwZSBmb3IgY29uc3RydWN0b3JzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kLCBvciB0aGUKIAkgKiAgICA8Y29kZT52b2lkPC9jb2RlPiByZXR1cm4gdHlwZSBmb3IgY29uc3RydWN0b3JzCiAJICovCkBAIC0xNjAsMTIgKzE1OCwxMiBAQAogCSAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgcmVwcmVzZW50aW5nIHRoZSB0eXBlcyBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24KIAkgKiBieSB0aGlzIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4gUmV0dXJucyBhbiBhcnJheSBvZiBsZW5ndGggMCBpZiB0aGlzIG1ldGhvZAogCSAqIHRocm93cyBubyBleGNlcHRpb25zLiBUaGUgcmVzdWx0aW5nIHR5cGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBiaW5kaW5ncyBmb3IgZXhjZXB0aW9ucwogCSAqICAgdGhyb3duIGJ5IHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yCiAJICovCiAJcHVibGljIElUeXBlQmluZGluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2Qgb3IgY29uc3RydWN0b3IgYmluZGluZy4KIAkgKiA8cD4KQEAgLTE4NSw3ICsxODMsNyBAQAogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgdGhlIGJpbmRpbmcgZm9yIGFuIGFubm90YXRpb24gdHlwZSBtZW1iZXIuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGlzIHRoZSBiaW5kaW5nIGZvciBhbiBhbm5vdGF0aW9uIHR5cGUgbWVtYmVyCiAJICogICAgICAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjIKQEAgLTIwOSwxMyArMjA3LDEzIEBACiAJICogYW5kIHtAbGluayAjaXNSYXdNZXRob2QoKX0gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kIGJpbmRpbmcgcmVwcmVzZW50cyBhIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtZXRob2QgYmluZGluZyByZXByZXNlbnRzIGEKIAkgKiBkZWNsYXJhdGlvbiBvZiBhIGdlbmVyaWMgbWV0aG9kLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzZWUgI2dldFR5cGVQYXJhbWV0ZXJzKCkKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNHZW5lcmljTWV0aG9kKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtZXRob2QgYmluZGluZyByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mCiAJICogYSBnZW5lcmljIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIGEgcGFyYW1ldGVyaXplZCBtZXRob2QgcmVmZXJlbmNlLgpAQCAtMjI1LDcgKzIyMyw3IEBACiAJICogYW5kIHtAbGluayAjaXNSYXdNZXRob2QoKX0gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KIAkgKiA8L3A+CiAJICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kIGJpbmRpbmcgcmVwcmVzZW50cyBhIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtZXRob2QgYmluZGluZyByZXByZXNlbnRzIGEKIAkgKiBhbiBpbnN0YW5jZSBvZiBhIGdlbmVyaWMgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJhbWV0ZXJpemVkCiAJICogbWV0aG9kIHJlZmVyZW5jZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2VlICNnZXRNZXRob2REZWNsYXJhdGlvbigpCkBAIC0yMzMsNyArMjMxLDcgQEAKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkTWV0aG9kKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiB0aGlzIGdlbmVyaWMgbWV0aG9kIGluc3RhbmNlLCBvciB0aGUKIAkgKiBlbXB0eSBsaXN0IGZvciBvdGhlciBtZXRob2QgYmluZGluZ3MuCkBAIC0yNDMsNyArMjQxLDcgQEAKIAkgKiByZWZlcmVuY2UgdG8gYSBnZW5lcmljIG1ldGhvZC4gRG8gbm90IGNvbmZ1c2UgdGhlc2Ugd2l0aCB0eXBlIHBhcmFtZXRlcnMKIAkgKiB3aGljaCBvbmx5IG9jY3VyIG9uIHRoZSBtZXRob2QgYmluZGluZyBjb3JyZXNwb25kaW5nIGRpcmVjdGx5IHRvIHRoZQogCSAqIGRlY2xhcmF0aW9uIG9mIGEgZ2VuZXJpYyBtZXRob2QuCi0JICogPC9wPiAKKwkgKiA8L3A+CiAJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgZm9yIHRoZSB0eXBlIGFyZ3VtZW50cyB1c2VkIHRvCiAJICogaW5zdGFudGlhdGUgdGhlIGNvcnJyZXNwb25kaW5nIGdlbmVyaWMgbWV0aG9kLCBvciBvdGhlcndpc2UgdGhlIGVtcHR5IGxpc3QKQEAgLTI1MywyNSArMjUxLDMxIEBACiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBJVHlwZUJpbmRpbmdbXSBnZXRUeXBlQXJndW1lbnRzKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcwotCSAqIG1ldGhvZCBiaW5kaW5nLiBGb3IgcGFyYW1ldGVyaXplZCBtZXRob2RzICh7QGxpbmsgI2lzUGFyYW1ldGVyaXplZE1ldGhvZCgpfSkKKwkgKiBtZXRob2QgYmluZGluZy4KKwkgKiA8dWw+CisJICogPGxpPkZvciBwYXJhbWV0ZXJpemVkIG1ldGhvZHMgKHtAbGluayAjaXNQYXJhbWV0ZXJpemVkTWV0aG9kKCl9KQogCSAqIGFuZCByYXcgbWV0aG9kcyAoe0BsaW5rICNpc1Jhd01ldGhvZCgpfSksIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJpbmRpbmcKLQkgKiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZ2VuZXJpYyBtZXRob2QuIEZvciBvdGhlciBtZXRob2QgYmluZGluZ3MsIHRoaXMKLQkgKiByZXR1cm5zIHRoZSBzYW1lIGJpbmRpbmcuCi0JICoKLQkgKiA8cD5Ob3RlOiBUaGUgb25lIG5vdGFibGUgZXhjZXB0aW9uIGlzIHRoZSBtZXRob2QgPGNvZGU+T2JqZWN0LmdldENsYXNzKCk8L2NvZGU+LCAKLQkgKiB3aGljaCBpcyBkZWNsYXJlZCB0byByZXR1cm4gPGNvZGU+Q2xhc3MmbHQ7PyBleHRlbmRzIE9iamVjdCZndDs8L2NvZGU+LCBidXQgCi0JICogd2hlbiBpbnZva2VkIGl0cyByZXR1cm4gdHlwZSBiZWNvbWVzIDxjb2RlPkNsYXNzJmx0Oz8gZXh0ZW5kcyAKLQkgKiA8L2NvZGU+PGVtPlI8L2VtPjxjb2RlPiZndDs8L2NvZGU+LCB3aGVyZSA8ZW0+UjwvZW0+IGlzIHRoZSBjb21waWxlIHR5cGUgb2YgCi0JICogdGhlIHJlY2VpdmVyIG9mIHRoZSBtZXRob2QgaW52b2NhdGlvbi48L3A+CisJICogZm9yIHRoZSBjb3JyZXNwb25kaW5nIGdlbmVyaWMgbWV0aG9kLjwvbGk+CisJICogPGxpPkZvciByZWZlcmVuY2VzIHRvIHRoZSBtZXRob2Qge0BsaW5rIE9iamVjdCNnZXRDbGFzcygpIE9iamVjdC5nZXRDbGFzcygpfSwKKwkgKiByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHdoaWNoIGlzIGRlY2xhcmVkIHRvIHJldHVybgorCSAqIDxjb2RlPkNsYXNzJmx0Oz8mZ3Q7PC9jb2RlPiBvciA8Y29kZT5DbGFzcyZsdDs/IGV4dGVuZHMgT2JqZWN0Jmd0OzwvY29kZT4uIEluIHRoZQorCSAqIHJlZmVyZW5jZSBiaW5kaW5nLCB0aGUgcmV0dXJuIHR5cGUgYmVjb21lcworCSAqIDxjb2RlPkNsYXNzJmx0Oz8gZXh0ZW5kcyA8L2NvZGU+PGVtPlI8L2VtPjxjb2RlPiZndDs8L2NvZGU+LCB3aGVyZSA8ZW0+UjwvZW0+CisJICogaXMgdGhlIGVyYXN1cmUgb2YgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlciBvZiB0aGUgbWV0aG9kIGludm9jYXRpb24uPC9saT4KKwkgKiA8bGk+Rm9yIHJlZmVyZW5jZXMgdG8gYSBzaWduYXR1cmUgcG9seW1vcnBoaWMgbWV0aG9kIGZyb20gY2xhc3MgTWV0aG9kSGFuZGxlLAorCSAqIHJldHVybnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QuIEluIHRoZSByZWZlcmVuY2UgYmluZGluZywgdGhlIHBhcmFtZXRlciB0eXBlcyBhbmQKKwkgKiB0aGUgcmV0dXJuIHR5cGUgYXJlIGRldGVybWluZWQgYnkgdGhlIGNvbmNyZXRlIGludm9jYXRpb24gY29udGV4dC48L2xpPgorCSAqIDxsaT5Gb3Igb3RoZXIgbWV0aG9kIGJpbmRpbmdzLCB0aGlzIHJldHVybnMgdGhlIHNhbWUgYmluZGluZy48L2xpPgorCSAqIDwvdWw+CiAJICoKIAkgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZwogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1ldGhvZCBiaW5kaW5nIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YKIAkgKiBhIGdlbmVyaWMgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gYSByYXcgbWV0aG9kIHJlZmVyZW5jZS4KQEAgLTI4MSw3ICsyODUsNyBAQAogCSAqIGFuZCB7QGxpbmsgI2lzUmF3TWV0aG9kKCl9IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCiAJICogPC9wPgogCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1ldGhvZCBiaW5kaW5nIHJlcHJlc2VudHMgYSAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kIGJpbmRpbmcgcmVwcmVzZW50cyBhCiAJICogYW4gaW5zdGFuY2Ugb2YgYSBnZW5lcmljIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIGEgcmF3CiAJICogbWV0aG9kIHJlZmVyZW5jZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2VlICNnZXRNZXRob2REZWNsYXJhdGlvbigpCkBAIC0yODksMzMgKzI5MywzMyBAQAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1Jhd01ldGhvZCgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kJ3Mgc2lnbmF0dXJlIGlzIGEgc3Vic2lnbmF0dXJlIG9mIHRoZSBnaXZlbiBtZXRob2QgYXMKLQkgKiBzcGVjaWZpZWQgaW4gc2VjdGlvbiA4LjQuMiBvZiA8ZW0+VGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgVGhpcmQgRWRpdGlvbjwvZW0+IChKTFMzKS4gCi0JICogCisJICogc3BlY2lmaWVkIGluIHNlY3Rpb24gOC40LjIgb2YgPGVtPlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFRoaXJkIEVkaXRpb248L2VtPiAoSkxTMykuCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kJ3Mgc2lnbmF0dXJlIGlzIGEgc3Vic2lnbmF0dXJlIG9mIHRoZSBnaXZlbiBtZXRob2QKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNTdWJzaWduYXR1cmUoSU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSB2YXJpYWJsZSBhcml0eSBtZXRob2QuCiAJICogPHA+CiAJICogTm90ZTogVmFyaWFibGUgYXJpdHkgKCJ2YXJhcmdzIikgbWV0aG9kcyB3ZXJlIGFkZGVkIGluIEpMUzMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYXJpdHkgbWV0aG9kLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1ZhcmFyZ3MoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGdpdmVuIG1ldGhvZCwKLQkgKiBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA4LjQuOC4xIG9mIDxlbT5UaGUgSmF2YSBMYW5ndWFnZSAKKwkgKiBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA4LjQuOC4xIG9mIDxlbT5UaGUgSmF2YSBMYW5ndWFnZQogCSAqIFNwZWNpZmljYXRpb24sIFRoaXJkIEVkaXRpb248L2VtPiAoSkxTMykuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdGhhdCBpcyBwb3NzaWJseSBvdmVycmlkZW4KIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgZ2l2ZW4gbWV0aG9kLAogCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lQYWNrYWdlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JUGFja2FnZUJpbmRpbmcuamF2YQppbmRleCA5YWZlNWE5Li5jZDZhYzQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lQYWNrYWdlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVBhY2thZ2VCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMjQgKzEzLDIyIEBACiAKIC8qKgogICogQSBwYWNrYWdlIGJpbmRpbmcgcmVwcmVzZW50cyBhIG5hbWVkIG9yIHVubmFtZWQgcGFja2FnZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2VCaW5kaW5nIGV4dGVuZHMgSUJpbmRpbmcgewogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcuIEZvciBuYW1lZAotCSAqIHBhY2thZ2VzLCB0aGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBuYW1lICh1c2luZyAiLiIgZm9yIAorCSAqIHBhY2thZ2VzLCB0aGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBuYW1lICh1c2luZyAiLiIgZm9yCiAJICogc2VwYXJhdG9ycykuIEZvciB1bm5hbWVkIHBhY2thZ2VzLCB0aGlzIGlzIGFuIGVtcHR5IHN0cmluZy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nLCBvcgogCSAqICAgIGFuIGVtcHR5IHN0cmluZyBmb3IgYW4gdW5uYW1lZCBwYWNrYWdlCiAJICovCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGlzIGFuIHVubmFtZWQgcGFja2FnZS4KIAkgKiBTZWUgPGVtPlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb248L2VtPiBzZWN0aW9uIDcuNC4yIGZvciBkZXRhaWxzLgpAQCAtMzksMjUgKzM3LDI1IEBACiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzVW5uYW1lZCgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGlzdCBvZiBuYW1lIGNvbXBvbmVudCBtYWtpbmcgdXAgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKIAkgKiByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcuIEZvciBleGFtcGxlLCBmb3IgdGhlIHBhY2thZ2UgbmFtZWQKIAkgKiAiY29tLmV4YW1wbGUudG9vbCIsIHRoaXMgbWV0aG9kIHJldHVybnMgeyJjb20iLCAiZXhhbXBsZSIsICJ0b29sIn0uCiAJICogUmV0dXJucyB0aGUgZW1wdHkgbGlzdCBmb3IgdW5uYW1lZCBwYWNrYWdlcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nLCBvciB0aGUKIAkgKiAgICBlbXB0eSBsaXN0IGZvciB1bm5hbWVkIHBhY2thZ2VzCiAJICovCiAJcHVibGljIFN0cmluZ1tdIGdldE5hbWVDb21wb25lbnRzKCk7Ci0JCisKIC8vCS8qKgogLy8JICogRmluZHMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSBjbGFzcyBvciBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2l2ZW4KIC8vCSAqIG5hbWUgZGVjbGFyZWQgaW4gdGhpcyBwYWNrYWdlLgogLy8JICogPHA+CiAvLwkgKiBGb3IgdG9wLWxldmVsIGNsYXNzZXMgYW5kIGludGVyZmFjZXMsIHRoZSBuYW1lIGhlcmUgaXMganVzdCB0aGUgc2ltcGxlCiAvLwkgKiBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UuIEZvciBuZXN0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgdGhlCi0vLwkgKiBuYW1lIGlzIHRoZSBWTSBjbGFzcyBuYW1lIChpbiBvdGhlciB3b3JkcywgYSBuYW1lIGxpa2UgCisvLwkgKiBuYW1lIGlzIHRoZSBWTSBjbGFzcyBuYW1lIChpbiBvdGhlciB3b3JkcywgYSBuYW1lIGxpa2UKIC8vCSAqIDxjb2RlPiJPdXRlciRJbm5lciI8L2NvZGU+IGFzIHVzZWQgdG8gbmFtZSB0aGUgY2xhc3MgZmlsZTsgc2VlCiAvLwkgKiA8Y29kZT5JVHlwZUJpbmRpbmcuZ2V0TmFtZTwvY29kZT4pLgogLy8JICogPC9wPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVR5cGVCaW5kaW5nLmphdmEKaW5kZXggZjM4ZDk1OS4uMTUwNTI3NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lUeXBlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDEyICszOCwxMCBAQAogICogd2l0aCBzdWJzdGl0dXRpb25zIGZvciBpdHMgdHlwZSBwYXJhbWV0ZXJzPC9saT4KICAqIDxsaT5hIGNhcHR1cmUgLSByZXByZXNlbnRzIGEgY2FwdHVyZSBiaW5kaW5nPC9saT4KICAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgogICoKICAqIEBzZWUgSVR5cGVCaW5kaW5nI2dldERlY2xhcmVkVHlwZXMoKQogICogQHNpbmNlIDIuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElUeXBlQmluZGluZyBleHRlbmRzIElCaW5kaW5nIHsKIApAQCAtOTEsOCArODksMjkgQEAKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIElUeXBlQmluZGluZyBnZXRCb3VuZCgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGdlbmVyaWMgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3aWxkY2FyZCB0eXBlLCBpZiBpdCBoYXMgb25lLgorCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3aWxkY2FyZCB0eXBlLgorCSAqCisJICogQHJldHVybiB0aGUgZ2VuZXJpYyB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpbGRjYXJkIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlICNpc1dpbGRjYXJkVHlwZSgpCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0R2VuZXJpY1R5cGVPZldpbGRjYXJkVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgcmFuayBhc3NvY2lhdGVkIHdpdGggdGhpcyB3aWxkY2FyZCB0eXBlLiBUaGUgcmFuayBvZiB0aGlzIHdpbGQgY2FyZCB0eXBlIGlzIHRoZSByZWxhdGl2ZQorCSAqIHBvc2l0aW9uIG9mIHRoZSB3aWxkIGNhcmQgdHlwZSBpbiB0aGUgcGFyYW1ldGVyaXphdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBnZW5lcmljIHR5cGUuCisJICogUmV0dXJucyA8Y29kZT4tMTwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3aWxkY2FyZCB0eXBlLgorCSAqCisJICogQHJldHVybiB0aGUgcmFuayBhc3NvY2lhdGVkIHdpdGggdGhpcyB3aWxkY2FyZCB0eXBlLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgI2lzV2lsZGNhcmRUeXBlKCkKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIGludCBnZXRSYW5rKCk7CisJCisJLyoqCiAJICogUmV0dXJucyB0aGUgYmluZGluZyByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZSwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlIGJpbmRpbmcuIFRoZSBjb21wb25lbnQKIAkgKiB0eXBlIG9mIGFuIGFycmF5IG1pZ2h0IGJlIGFuIGFycmF5IHR5cGUuCkBAIC0xMDcsMTEgKzEyNiwxMSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIGJpbmRpbmdzIHJlcHJlc2VudGluZyBhbGwgdGhlIGZpZWxkcyBkZWNsYXJlZAogCSAqIGFzIG1lbWJlcnMgb2YgdGhpcyBjbGFzcywgaW50ZXJmYWNlLCBvciBlbnVtIHR5cGUuCi0JICogCisJICoKIAkgKiA8cD5UaGVzZSBpbmNsdWRlIHB1YmxpYywgcHJvdGVjdGVkLCBkZWZhdWx0IChwYWNrYWdlLXByaXZhdGUpIGFjY2VzcywKIAkgKiBhbmQgcHJpdmF0ZSBmaWVsZHMgZGVjbGFyZWQgYnkgdGhlIGNsYXNzLCBidXQgZXhjbHVkZXMgaW5oZXJpdGVkIGZpZWxkcy4KIAkgKiBTeW50aGV0aWMgZmllbGRzIG1heSBvciBtYXkgbm90IGJlIGluY2x1ZGVkLiBGaWVsZHMgZnJvbSBiaW5hcnkgdHlwZXMgdGhhdAotCSAqIHJlZmVyZW5jZSB1bnJlc29sdmFibGUgdHlwZXMgbWF5IG5vdCBiZSBpbmNsdWRlZC48L3A+CisJICogcmVmZXJlbmNlIHVucmVzb2x2ZWQgdHlwZXMgbWF5IG5vdCBiZSBpbmNsdWRlZC48L3A+CiAJICoKIAkgKiA8cD5SZXR1cm5zIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGNsYXNzLCBpbnRlcmZhY2UsIG9yIGVudW0gZGVjbGFyZXMgbm8gZmllbGRzLAogCSAqIGFuZCBmb3Igb3RoZXIga2luZHMgb2YgdHlwZSBiaW5kaW5ncyB0aGF0IGRvIG5vdCBkaXJlY3RseSBoYXZlIG1lbWJlcnMuPC9wPgpAQCAtMTMyLDcgKzE1MSw3IEBACiAJICogaW5jbHVkZWQuIFJldHVybnMgYW4gZW1wdHkgbGlzdCBpZiB0aGUgY2xhc3MsIGludGVyZmFjZSwgb3IgZW51bSwKIAkgKiB0eXBlIGRlY2xhcmVzIG5vIG1ldGhvZHMgb3IgY29uc3RydWN0b3JzLCBpZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmVzCiAJICogbm8gbWVtYmVycywgb3IgaWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBzb21lIG90aGVyIGtpbmQgb2YgdHlwZQotCSAqIGJpbmRpbmcuIE1ldGhvZHMgZnJvbSBiaW5hcnkgdHlwZXMgdGhhdCByZWZlcmVuY2UgdW5yZXNvbHZhYmxlIHR5cGVzIG1heQorCSAqIGJpbmRpbmcuIE1ldGhvZHMgZnJvbSBiaW5hcnkgdHlwZXMgdGhhdCByZWZlcmVuY2UgdW5yZXNvbHZlZCB0eXBlcyBtYXkKIAkgKiBub3QgYmUgaW5jbHVkZWQuPC9wPgogCSAqIDxwPlRoZSByZXN1bHRpbmcgYmluZGluZ3MgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuPC9wPgogCSAqCkBAIC0zNzUsNyArMzk0LDcgQEAKIAkgKiB0aGUgcGFja2FnZSBvZiB0aGUgZW5jbG9zaW5nIHR5cGUsIG9yLCBpZiB0aGUgdHlwZSBuYW1lIGlzIHRoZSBuYW1lIG9mIGEKIAkgKiB7QGxpbmtwbGFpbiBBU1QjcmVzb2x2ZVdlbGxLbm93blR5cGUoU3RyaW5nKSB3ZWxsLWtub3duIHR5cGV9LAogCSAqIHRoZSBwYWNrYWdlIG9mIHRoZSBtYXRjaGluZyB3ZWxsLWtub3duIHR5cGUuPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhpcyBjbGFzcywgaW50ZXJmYWNlLAogCSAqIGVudW0sIG9yIGFubm90YXRpb24gdHlwZSBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0eXBlCiAJICogYmluZGluZyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIHR5cGUsIGFuIGFycmF5IHR5cGUsIHRoZSBudWxsIHR5cGUsCkBAIC03MzIsMTEgKzc1MSwxNCBAQAogCSAqIDxwPgogCSAqIEEgbG9jYWwgY2xhc3MgaXMgYW55IG5lc3RlZCBjbGFzcyBvciBlbnVtIHR5cGUgbm90IGRlY2xhcmVkIGFzIGEgbWVtYmVyCiAJICogb2YgYW5vdGhlciBjbGFzcyBvciBpbnRlcmZhY2UuIEEgbG9jYWwgY2xhc3MgaXMgYSBzdWJzcGVjaWVzIG9mIG5lc3RlZAotCSAqIHR5cGUsIGFuZCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBtZW1iZXIgdHlwZXMuIE5vdGUgdGhhdCBhbm9ueW1vdXMKLQkgKiBjbGFzc2VzIGFyZSBhIHN1YnNwZWNpZXMgb2YgbG9jYWwgY2xhc3Nlcy4KKwkgKiB0eXBlLCBhbmQgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbWVtYmVyIHR5cGVzLiBGb3IgYW5vbnltb3VzCisJICogY2xhc3Nlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgYSBzdWJzcGVjaWVzIG9mIGxvY2FsIGNsYXNzZXMsIHRoaXMgbWV0aG9kCisJICogcmV0dXJucyB0cnVlLiAKIAkgKiA8L3A+CiAJICogPHA+Ci0JICogQWxzbyBub3RlIHRoYXQgaW50ZXJmYWNlcyBhbmQgYW5ub3RhdGlvbiB0eXBlcyBjYW5ub3QgYmUgbG9jYWwuCisJICogTm90ZTogVGhpcyBkZXZpYXRlcyBmcm9tIEpMUzMgMTQuMywgd2hpY2ggc3RhdGVzIHRoYXQgYW5vbnltb3VzIHR5cGVzIGFyZSAKKwkgKiBub3QgbG9jYWwgdHlwZXMgc2luY2UgdGhleSBkbyBub3QgaGF2ZSBhIG5hbWUuIEFsc28gbm90ZSB0aGF0IGludGVyZmFjZXMgCisJICogYW5kIGFubm90YXRpb24gdHlwZXMgY2Fubm90IGJlIGxvY2FsLgogCSAqIDwvcD4KIAkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGJpbmRpbmcgaXMgZm9yIGEgbG9jYWwgY2xhc3Mgb3IKQEAgLTkxNSw3ICs5MzcsNyBAQAogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYSB3aWxkY2FyZCB0eXBlLiBBIHdpbGRjYXJkCi0JICogdHlwZSBvY2N1cyBvbmx5IGFzIGFuIGFyZ3VtZW50IHRvIGEgcGFyYW1ldGVyaXplZCB0eXBlIHJlZmVyZW5jZS4KKwkgKiB0eXBlIG9jY3VycyBvbmx5IGFzIGFuIGFyZ3VtZW50IHRvIGEgcGFyYW1ldGVyaXplZCB0eXBlIHJlZmVyZW5jZS4KIAkgKiA8cD4KIAkgKiBGb3IgZXhhbXBsZSwgYSBBU1QgdHlwZSBsaWtlCiAJICogPGNvZGU+Q29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgT2JqZWN0Jmd0OzwvY29kZT4gdHlwaWNhbGx5IHJlc29sdmVzIHRvIGEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVZhcmlhYmxlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEKaW5kZXggYjY0ZGU1MC4uNzg5YjU2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNDMgKzEyLDQxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogLyoqCi0gKiBBIHZhcmlhYmxlIGJpbmRpbmcgcmVwcmVzZW50cyBlaXRoZXIgYSBmaWVsZCBvZiBhIGNsYXNzIG9yIGludGVyZmFjZSwgb3IgCi0gKiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIChpbmNsdWRpbmcgZm9ybWFsIHBhcmFtZXRlcnMsIGxvY2FsIHZhcmlhYmxlcywgCisgKiBBIHZhcmlhYmxlIGJpbmRpbmcgcmVwcmVzZW50cyBlaXRoZXIgYSBmaWVsZCBvZiBhIGNsYXNzIG9yIGludGVyZmFjZSwgb3IKKyAqIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gKGluY2x1ZGluZyBmb3JtYWwgcGFyYW1ldGVycywgbG9jYWwgdmFyaWFibGVzLAogICogYW5kIGV4Y2VwdGlvbiB2YXJpYWJsZXMpLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KICAqCiAgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJlZEZpZWxkcygpCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVZhcmlhYmxlQmluZGluZyBleHRlbmRzIElCaW5kaW5nIHsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGJpbmRpbmcgaXMgZm9yIGEgZmllbGQuCiAJICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGNvbnN0YW50cywKIAkgKiBpbmNsdWRpbmcgZW51bSBjb25zdGFudHMuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+CiAJICogZm9yIGxvY2FsIHZhcmlhYmxlcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgYmluZGluZyBmb3IgYSBmaWVsZCwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIGZvciBhbiBlbnVtIGNvbnN0YW50LgogCSAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgbG9jYWwgdmFyaWFibGVzCiAJICogYW5kIGZvciBmaWVsZHMgb3RoZXIgdGhhbiBlbnVtIGNvbnN0YW50cy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgYmluZGluZyBmb3IgYW4gZW51bSBjb25zdGFudCwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNFbnVtQ29uc3RhbnQoKTsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIuIAotCSAqIAorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIuCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIGJpbmRpbmcgZm9yIGEgcGFyYW1ldGVyLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgpAQCAtNTgsMjAgKzU2LDIwIEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgbG9jYWwgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyBiaW5kaW5nLgogCSAqIFRoZSBuYW1lIGlzIGFsd2F5cyBhIHNpbXBsZSBpZGVudGlmaWVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlCiAJICovCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIGJpbmRpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UKIAkgKiB0aGF0IGRlY2xhcmVzIHRoaXMgZmllbGQuCiAJICogPHA+CiAJICogVGhlIGRlY2xhcmluZyBjbGFzcyBvZiBhIGZpZWxkIGlzIHRoZSBjbGFzcyBvciBpbnRlcmZhY2Ugb2Ygd2hpY2ggaXQgaXMKLQkgKiBhIG1lbWJlci4gTG9jYWwgdmFyaWFibGVzIGhhdmUgbm8gZGVjbGFyaW5nIGNsYXNzLiBUaGUgZmllbGQgbGVuZ3RoIG9mIGFuIAorCSAqIGEgbWVtYmVyLiBMb2NhbCB2YXJpYWJsZXMgaGF2ZSBubyBkZWNsYXJpbmcgY2xhc3MuIFRoZSBmaWVsZCBsZW5ndGggb2YgYW4KIAkgKiBhcnJheSB0eXBlIGhhcyBubyBkZWNsYXJpbmcgY2xhc3MuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYmluZGluZyBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgZGVjbGFyZXMgdGhpcyBmaWVsZCwKIAkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KQEAgLTc5LDExICs3NywxMSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQgb3IgbG9jYWwgdmFyaWFibGUKIAkgKi8KIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldFR5cGUoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBzbWFsbCBpbnRlZ2VyIHZhcmlhYmxlIGlkIGZvciB0aGlzIHZhcmlhYmxlIGJpbmRpbmcuCiAJICogPHA+CkBAIC05OSwyMCArOTcsMjAgQEAKIAkgKiBkZWNsYXJlZCBpbiBhIHR5cGUncyBpbnN0YW5jZSBpbml0aWFsaXplcnMgKG9yIGluaXRpYWxpemVyIGV4cHJlc3Npb25zCiAJICogb2Ygbm9uLXN0YXRpYyBmaWVsZHMpIGFyZSBhc3NpZ25lZCBhc2NlbmRpbmcgaWRzIGluIG5vcm1hbCBjb2RlIHJlYWRpbmcKIAkgKiBvcmRlci4gVGhlc2UgaWRzIGFyZSB1c2VmdWwgd2hlbiBjaGVja2luZyBkZWZpbml0ZSBhc3NpZ25tZW50IGZvcgotCSAqIHN0YXRpYyBpbml0aWFsaXplcnMgKEpMUyAxNi43KSBhbmQgaW5zdGFuY2UgaW5pdGlhbGl6ZXJzIChKTFMgMTYuOCksIAorCSAqIHN0YXRpYyBpbml0aWFsaXplcnMgKEpMUyAxNi43KSBhbmQgaW5zdGFuY2UgaW5pdGlhbGl6ZXJzIChKTFMgMTYuOCksCiAJICogcmVzcGVjdGl2ZWx5LgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiA8Yj5GaWVsZHM6PC9iPiBGaWVsZHMgZGVjbGFyZWQgYXMgbWVtYmVycyBvZiBhIHR5cGUgYXJlIGFzc2lnbmVkIAotCSAqIGFzY2VuZGluZyBpZHMgaW4gbm9ybWFsIGNvZGUgcmVhZGluZyBvcmRlcjsgCisJICogPGI+RmllbGRzOjwvYj4gRmllbGRzIGRlY2xhcmVkIGFzIG1lbWJlcnMgb2YgYSB0eXBlIGFyZSBhc3NpZ25lZAorCSAqIGFzY2VuZGluZyBpZHMgaW4gbm9ybWFsIGNvZGUgcmVhZGluZyBvcmRlcjsKIAkgKiBmaWVsZDEuZ2V0VmFyaWFibGVJZCgpJmx0O2ZpZWxkMi5nZXRWYXJpYWJsZUlkKCkgbWVhbnMgdGhhdCBmaWVsZDEgaXMgZGVjbGFyZWQgYmVmb3JlCiAJICogZmllbGQyLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYSBzbWFsbCBub24tbmVnYXRpdmUgdmFyaWFibGUgaWQKIAkgKi8KIAlwdWJsaWMgaW50IGdldFZhcmlhYmxlSWQoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhpcyBiaW5kaW5nJ3MgY29uc3RhbnQgdmFsdWUgaWYgaXQgaGFzIG9uZS4KIAkgKiBTb21lIHZhcmlhYmxlcyBtYXkgaGF2ZSBhIHZhbHVlIGNvbXB1dGVkIGF0IGNvbXBpbGUtdGltZS4gSWYgdGhlIHR5cGUgb2YKQEAgLTEyMiwxMiArMTIwLDEyIEBACiAJICogbm8gY29tcGlsZS10aW1lIGNvbXB1dGVkIHZhbHVlLCB0aGUgcmVzdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIChOb3RlOiBjb21waWxlLXRpbWUgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2Fubm90IGRlbm90ZSA8Y29kZT5udWxsPC9jb2RlPjsKIAkgKiBKTFMyIDE1LjI4LikuIFRoZSByZXN1bHQgaXMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+IGZvciBlbnVtIGNvbnN0YW50cy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RhbnRWYWx1ZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0aG9kIGJpbmRpbmcgcmVwcmVzZW50aW5nIHRoZSBtZXRob2QgY29udGFpbmluZyB0aGUgc2NvcGUKIAkgKiBpbiB3aGljaCB0aGlzIGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgpAQCAtMTQwLDEzICsxMzgsMTMgQEAKIAkgKiBkZWNsYXJlZCBpbiBhIHN0YXRpYyBvciBpbnN0YW5jZSBpbml0aWFsaXplcjsgdGhpcyBtZXRob2QgcmV0dXJucwogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGluIHRob3NlIGNhc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgb2YgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3RvciB0aGF0IGRlY2xhcmVzIHRoaXMKIAkgKiBsb2NhbCB2YXJpYWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0RGVjbGFyaW5nTWV0aG9kKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGlzCiAJICogdmFyaWFibGUgYmluZGluZy4gRm9yIGEgYmluZGluZyBmb3IgYSBmaWVsZCBkZWNsYXJhdGlvbiBpbiBhbiBpbnN0YW5jZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JZlN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JZlN0YXRlbWVudC5qYXZhCmluZGV4IDY0ZGQ2ZTUuLjQ0ZTQyNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSWZTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lmU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMzkgKzIwLDQwIEBACiAgKiBJZlN0YXRlbWVudDoKICAqICAgIDxiPmlmPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IFN0YXRlbWVudCBbIDxiPmVsc2U8L2I+IFN0YXRlbWVudF0KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoSWZTdGF0ZW1lbnQuY2xhc3MsICJleHByZXNzaW9uIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJ0aGVuU3RhdGVtZW50IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidGhlblN0YXRlbWVudCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFN0YXRlbWVudH0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRIRU5fU1RBVEVNRU5UX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBUSEVOX1NUQVRFTUVOVF9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihJZlN0YXRlbWVudC5jbGFzcywgInRoZW5TdGF0ZW1lbnQiLCBTdGF0ZW1lbnQuY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZWxzZVN0YXRlbWVudCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImVsc2VTdGF0ZW1lbnQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFTFNFX1NUQVRFTUVOVF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRUxTRV9TVEFURU1FTlRfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoSWZTdGF0ZW1lbnQuY2xhc3MsICJlbHNlU3RhdGVtZW50IiwgU3RhdGVtZW50LmNsYXNzLCBPUFRJT05BTCwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChJZlN0YXRlbWVudC5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNjUsMjYgKzY2LDI2IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwgYnV0IAorCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQKIAkgKiBsZWdhbCwgZXhwcmVzc2lvbi4KIAkgKi8KIAlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgdGhlbiBzdGF0ZW1lbnQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBUaGUgdGhlbiBzdGF0ZW1lbnQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dAogCSAqIGxlZ2FsLCBzdGF0ZW1lbnQuCiAJICovCiAJcHJpdmF0ZSBTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCA9IG51bGw7CkBAIC05NSwyNyArOTYsMjcgQEAKIAlwcml2YXRlIFN0YXRlbWVudCBvcHRpb25hbEVsc2VTdGF0ZW1lbnQgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGlmIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgaWYgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc3Npb24gaXMgdW5zcGVjaWZpZWQsCiAJICogYnV0IGxlZ2FsLCB0aGUgdGhlbiBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2ssIGFuZCB0aGVyZSBpcyBubyBlbHNlCiAJICogc3RhdGVtZW50LgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUlmU3RhdGVtZW50KEFTVCBhc3QpIHsKIAkJc3VwZXIoYXN0KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJSWZTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IElmU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFRoZW5TdGF0ZW1lbnQoCkBAIC0xOTEsMTIgKzE5MiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGlmIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMTAsMTAgKzIxMSwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgY29uZGl0aW9uIG9mIHRoaXMgaWYgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIyMSw3ICsyMjIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjM0LDkgKzIzNSw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSAidGhlbiIgcGFydCBvZiB0aGlzIGlmIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlICJ0aGVuIiBzdGF0ZW1lbnQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RhdGVtZW50IGdldFRoZW5TdGF0ZW1lbnQoKSB7CiAJCWlmICh0aGlzLnRoZW5TdGF0ZW1lbnQgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI1MCw3ICsyNTEsNyBAQAogCQl9CiAJCXJldHVybiB0aGlzLnRoZW5TdGF0ZW1lbnQ7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgInRoZW4iIHBhcnQgb2YgdGhpcyBpZiBzdGF0ZW1lbnQuCiAJICogPHA+CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkgKiBjb21waWxlLCBiZSBzdXJlIHRvIGVtYmVkIHRoZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPgogCSAqIGluc2lkZSBhIDxjb2RlPkJsb2NrPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSAidGhlbiIgc3RhdGVtZW50IG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yNjksNyArMjcwLDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFRoZW5TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI4NCwxMiArMjg1LDEyIEBACiAJICogUmV0dXJucyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBpZiBzdGF0ZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogdGhpcyBpZiBzdGF0ZW1lbnQgaGFzIDxiPm5vPC9iPiAiZWxzZSIgcGFydC4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhhdmluZyBubyBlbHNlIAorCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHN1YnRsZSBkaWZmZXJlbmNlIGJldHdlZW4gaGF2aW5nIG5vIGVsc2UKIAkgKiBzdGF0ZW1lbnQgYW5kIGhhdmluZyBhbiBlbXB0eSBzdGF0ZW1lbnQgKCJ7fSIpIG9yIG51bGwgc3RhdGVtZW50ICgiOyIpLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlICJlbHNlIiBzdGF0ZW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RhdGVtZW50IGdldEVsc2VTdGF0ZW1lbnQoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsRWxzZVN0YXRlbWVudDsKIAl9CkBAIC0yOTksNyArMzAwLDcgQEAKIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhhdmluZyBubyBlbHNlIHBhcnQKIAkgKiAoYXMgaW4gPGNvZGU+ImlmKHRydWUpe30iPC9jb2RlPikgYW5kIGhhdmluZyBhbiBlbXB0eSBibG9jayAoYXMgaW4KLQkgKiAiaWYodHJ1ZSl7fWVsc2V7fSIpIG9yIG51bGwgc3RhdGVtZW50IChhcyBpbiAiaWYodHJ1ZSl7fWVsc2U7IikuIAorCSAqICJpZih0cnVlKXt9ZWxzZXt9Iikgb3IgbnVsbCBzdGF0ZW1lbnQgKGFzIGluICJpZih0cnVlKXt9ZWxzZTsiKS4KIAkgKiA8L3A+CiAJICogPHA+CiAJICogU3BlY2lhbCBub3RlOiBUaGUgSmF2YSBsYW5ndWFnZSBkb2VzIG5vdCBhbGxvdyBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uCkBAIC0zMDksOCArMzEwLDggQEAKIAkgKiBjb21waWxlLCBiZSBzdXJlIHRvIGVtYmVkIHRoZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPgogCSAqIGluc2lkZSBhIDxjb2RlPkJsb2NrPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXRlbWVudCB0aGUgImVsc2UiIHN0YXRlbWVudCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlICJlbHNlIiBzdGF0ZW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMzE4LDIxICszMTksMjEgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEVsc2VTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy5vcHRpb25hbEVsc2VTdGF0ZW1lbnQ7CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgc3RhdGVtZW50LCBFTFNFX1NUQVRFTUVOVF9QUk9QRVJUWSk7CiAJCXRoaXMub3B0aW9uYWxFbHNlU3RhdGVtZW50ID0gc3RhdGVtZW50OwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBzdGF0ZW1lbnQsIEVMU0VfU1RBVEVNRU5UX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCmluZGV4IGViNGQwNjcuLjljZjM3ZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW1wb3J0RGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsNTMgKzI4LDU0IEBACiAgKiAgICA8Yj5pbXBvcnQ8L2I+IFsgPGI+c3RhdGljPC9iPiBdIE5hbWUgWyA8Yj4uPC9iPiA8Yj4qPC9iPiBdIDxiPjs8L2I+CiAgKiA8L3ByZT4KICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSW1wb3J0RGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlIHsKLQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihJbXBvcnREZWNsYXJhdGlvbi5jbGFzcywgIm5hbWUiLCBOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgIm9uRGVtYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAib25EZW1hbmQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBCb29sZWFufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE9OX0RFTUFORF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE9OX0RFTUFORF9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoSW1wb3J0RGVjbGFyYXRpb24uY2xhc3MsICJvbkRlbWFuZCIsIGJvb2xlYW4uY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAic3RhdGljIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJzdGF0aWMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBCb29sZWFufSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgU1RBVElDX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgU1RBVElDX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihJbXBvcnREZWNsYXJhdGlvbi5jbGFzcywgInN0YXRpYyIsIGJvb2xlYW4uY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18yXzA7Ci0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChJbXBvcnREZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShOQU1FX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KE9OX0RFTUFORF9QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnlMaXN0KTsKLQkJCisKIAkJcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDQpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoSW1wb3J0RGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnlMaXN0KTsKIAkJYWRkUHJvcGVydHkoU1RBVElDX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC04NiwxMSArODcsMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMDEsNyArMTAyLDcgQEAKIAkJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7CiAJCX0KIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBpbXBvcnQgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KQEAgLTEyNSwxMSArMTI2LDExIEBACiAJICogZ2l2ZW4gQVNULiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uIGluaXRpYWxseSBpcyBhIHJlZ3VsYXIgKG5vbi1zdGF0aWMpCiAJICogc2luZ2xlIHR5cGUgaW1wb3J0IGZvciBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBKYXZhIHR5cGUgbmFtZS4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAotCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZQogCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJSW1wb3J0RGVjbGFyYXRpb24oQVNUIGFzdCkgewpAQCAtMTQyLDcgKzE0Myw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTY2LDcgKzE2Nyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5LCBnZXQsIHZhbHVlKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE4Miw3ICsxODMsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTk1LDcgKzE5Niw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlJbXBvcnREZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0T25EZW1hbmQoaXNPbkRlbWFuZCgpKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFMzKSB7CiAJCQlyZXN1bHQuc2V0U3RhdGljKGlzU3RhdGljKCkpOwpAQCAtMjIyLDE5ICsyMjMsMTkgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgaW1wb3J0ZWQgYnkgdGhpcyBkZWNsYXJhdGlvbi4KIAkgKiA8cD4KLQkgKiBGb3IgYSByZWd1bGFyIG9uLWRlbWFuZCBpbXBvcnQsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlLiAKKwkgKiBGb3IgYSByZWd1bGFyIG9uLWRlbWFuZCBpbXBvcnQsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlLgogCSAqIEZvciBhIHN0YXRpYyBvbi1kZW1hbmQgaW1wb3J0LCB0aGlzIGlzIHRoZSBxdWFsaWZpZWQgbmFtZSBvZgogCSAqIGEgdHlwZS4gRm9yIGEgcmVndWxhciBzaW5nbGUtdHlwZSBpbXBvcnQsIHRoaXMgaXMgdGhlIHF1YWxpZmllZCBuYW1lCiAJICogb2YgYSB0eXBlLiBGb3IgYSBzdGF0aWMgc2luZ2xlLXR5cGUgaW1wb3J0LCB0aGlzIGlzIHRoZSBxdWFsaWZpZWQgbmFtZQogCSAqIG9mIGEgc3RhdGljIG1lbWJlciBvZiBhIHR5cGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaW1wb3J0ZWQgbmFtZSBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBOYW1lIGdldE5hbWUoKSAgewogCQlpZiAodGhpcy5pbXBvcnROYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yNDcsMjYgKzI0OCwyNiBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gaW1wb3J0TmFtZTsKKwkJcmV0dXJuIHRoaXMuaW1wb3J0TmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIHRvIHRoZSBnaXZlbiBuYW1lLgogCSAqIDxwPgotCSAqIEZvciBhIHJlZ3VsYXIgb24tZGVtYW5kIGltcG9ydCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UuIAorCSAqIEZvciBhIHJlZ3VsYXIgb24tZGVtYW5kIGltcG9ydCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UuCiAJICogRm9yIGEgc3RhdGljIG9uLWRlbWFuZCBpbXBvcnQsIHRoaXMgaXMgdGhlIHF1YWxpZmllZCBuYW1lIG9mCiAJICogYSB0eXBlLiBGb3IgYSByZWd1bGFyIHNpbmdsZS10eXBlIGltcG9ydCwgdGhpcyBpcyB0aGUgcXVhbGlmaWVkIG5hbWUKIAkgKiBvZiBhIHR5cGUuIEZvciBhIHN0YXRpYyBzaW5nbGUtdHlwZSBpbXBvcnQsIHRoaXMgaXMgdGhlIHF1YWxpZmllZCBuYW1lCiAJICogb2YgYSBzdGF0aWMgbWVtYmVyIG9mIGEgdHlwZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IGltcG9ydCBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKE5hbWUgbmFtZSkgewogCQlpZiAobmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNzYsNjEgKzI3Nyw2MSBAQAogCQl0aGlzLmltcG9ydE5hbWUgPSBuYW1lOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuYW1lLCBOQU1FX1BST1BFUlRZKTsKIAl9Ci0JCQorCiAJLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIGlzIGFuIG9uLWRlbWFuZCBvciBhIAorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbiBpcyBhbiBvbi1kZW1hbmQgb3IgYQogCSAqIHNpbmdsZS10eXBlIGltcG9ydC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBvbi1kZW1hbmQgaW1wb3J0LAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbmdsZSB0eXBlIGltcG9ydAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc09uRGVtYW5kKCkgewotCQlyZXR1cm4gb25EZW1hbmQ7CisJCXJldHVybiB0aGlzLm9uRGVtYW5kOwogCX0KLQkJCisKIAkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24gaXMgYW4gb24tZGVtYW5kIG9yIGEgCisJICogU2V0cyB3aGV0aGVyIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIGlzIGFuIG9uLWRlbWFuZCBvciBhCiAJICogc2luZ2xlLXR5cGUgaW1wb3J0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9uRGVtYW5kIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYW4gb24tZGVtYW5kIGltcG9ydCwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgYSBzaW5nbGUgdHlwZSBpbXBvcnQKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0T25EZW1hbmQoYm9vbGVhbiBvbkRlbWFuZCkgewogCQlwcmVWYWx1ZUNoYW5nZShPTl9ERU1BTkRfUFJPUEVSVFkpOwogCQl0aGlzLm9uRGVtYW5kID0gb25EZW1hbmQ7CiAJCXBvc3RWYWx1ZUNoYW5nZShPTl9ERU1BTkRfUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbiBpcyBhIHN0YXRpYyBpbXBvcnQgKGFkZGVkIGluIEpMUzMgQVBJKS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHN0YXRpYyBpbXBvcnQsCiAJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcmVndWxhciBpbXBvcnQKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKIAkJdW5zdXBwb3J0ZWRJbjIoKTsKLQkJcmV0dXJuIGlzU3RhdGljOworCQlyZXR1cm4gdGhpcy5pc1N0YXRpYzsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB3aGV0aGVyIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uIGlzIGEgc3RhdGljIGltcG9ydCAoYWRkZWQgaW4gSkxTMyBBUEkpLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGlzU3RhdGljIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBzdGF0aWMgaW1wb3J0LAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlZ3VsYXIgaW1wb3J0CiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gaXNTdGF0aWMpIHsKIAkJdW5zdXBwb3J0ZWRJbjIoKTsKIAkJcHJlVmFsdWVDaGFuZ2UoU1RBVElDX1BST1BFUlRZKTsKIAkJdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogCQlwb3N0VmFsdWVDaGFuZ2UoU1RBVElDX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UsIHR5cGUsIGZpZWxkLCBvcgogCSAqIG1ldGhvZCBuYW1lZCBpbiB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbi4KQEAgLTM1MCwyOCArMzUxLDI4IEBACiAJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQogCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgcGFja2FnZSwgdHlwZSwgZmllbGQsIG9yIG1ldGhvZCBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlSW1wb3J0KHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7CiAJCXJldHVybgogCQkJbWVtU2l6ZSgpCi0JCQkrIChpbXBvcnROYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpOworCQkJKyAodGhpcy5pbXBvcnROYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbmZpeEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5maXhFeHByZXNzaW9uLmphdmEKaW5kZXggN2Y0MmI5ZS4uZjY0N2UxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbmZpeEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luZml4RXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDEwICsyMCwxMSBAQAogICogSW5maXggZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgogICogPHByZT4KICAqIEluZml4RXhwcmVzc2lvbjoKLSAqICAgIEV4cHJlc3Npb24gSW5maXhPcGVyYXRvciBFeHByZXNzaW9uIHsgSW5maXhPcGVyYXRvciBFeHByZXNzaW9uIH0gCisgKiAgICBFeHByZXNzaW9uIEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB7IEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB9CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSW5maXhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKQEAgLTUzLDM0ICs1NCwzNCBAQAogCSAqIDwvcHJlPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlcmF0b3IgewotCQorCiAJCS8qKgogCQkgKiBUaGUgdG9rZW4gZm9yIHRoZSBvcGVyYXRvci4KIAkJICovCiAJCXByaXZhdGUgU3RyaW5nIHRva2VuOwotCQkKKwogCQkvKioKIAkJICogQ3JlYXRlcyBhIG5ldyBpbmZpeCBvcGVyYXRvciB3aXRoIHRoZSBnaXZlbiB0b2tlbi4KIAkJICogPHA+CiAJCSAqIE5vdGU6IHRoaXMgY29uc3RydWN0b3IgaXMgcHJpdmF0ZS4gVGhlIG9ubHkgaW5zdGFuY2VzCiAJCSAqIGV2ZXIgY3JlYXRlZCBhcmUgdGhlIG9uZXMgZm9yIHRoZSBzdGFuZGFyZCBvcGVyYXRvcnMuCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSB0b2tlbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKIAkJICovCiAJCXByaXZhdGUgT3BlcmF0b3IoU3RyaW5nIHRva2VuKSB7CiAJCQl0aGlzLnRva2VuID0gdG9rZW47CiAJCX0KLQkJCisKIAkJLyoqCiAJCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yLgotCQkgKiAKKwkJICoKIAkJICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKIAkJICovCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdG9rZW47CisJCQlyZXR1cm4gdGhpcy50b2tlbjsKIAkJfQotCQkKKwogCQkvKiogTXVsdGlwbGljYXRpb24gIioiIG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFRJTUVTID0gbmV3IE9wZXJhdG9yKCIqIik7Ly8kTk9OLU5MUy0xJAogCQkvKiogRGl2aXNpb24gIi8iIG9wZXJhdG9yLiAqLwpAQCAtOTYsNyArOTcsNyBAQAogCQkvKiogU2lnbmVkIHJpZ2h0IHNoaWZ0ICImZ3Q7Jmd0OyIgb3BlcmF0b3IuICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgUklHSFRfU0hJRlRfU0lHTkVEID0gbmV3IE9wZXJhdG9yKCI+PiIpOy8vJE5PTi1OTFMtMSQKIAkJLyoqIFVuc2lnbmVkIHJpZ2h0IHNoaWZ0ICImZ3Q7Jmd0OyZndDsiIG9wZXJhdG9yLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFJJR0hUX1NISUZUX1VOU0lHTkVEID0gCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgUklHSFRfU0hJRlRfVU5TSUdORUQgPQogCQkJbmV3IE9wZXJhdG9yKCI+Pj4iKTsvLyROT04tTkxTLTEkCiAJCS8qKiBMZXNzIHRoYW4gIiZsdDsiIG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIExFU1MgPSBuZXcgT3BlcmF0b3IoIjwiKTsvLyROT04tTkxTLTEkCkBAIC0xMjAsNyArMTIxLDcgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBDT05ESVRJT05BTF9PUiA9IG5ldyBPcGVyYXRvcigifHwiKTsvLyROT04tTkxTLTEkCiAJCS8qKiBDb25kaXRpb25hbCBBTkQgIiZhbXA7JmFtcDsiIG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIENPTkRJVElPTkFMX0FORCA9IG5ldyBPcGVyYXRvcigiJiYiKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKgogCQkgKiBNYXAgZnJvbSB0b2tlbiB0byBvcGVyYXRvciAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47CiAJCSAqIHZhbHVlIHR5cGU6IDxjb2RlPk9wZXJhdG9yPC9jb2RlPikuCkBAIC0xNTksNTQgKzE2MCw1NCBAQAogCQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCQkgKiA8cD4KIAkJICogPGNvZGU+dG9PcGVyYXRvcjwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKLQkJICogdGhhdCBpcywgPGNvZGU+T3BlcmF0b3IudG9PcGVyYXRvcihvcC50b1N0cmluZygpKSA9PSBvcDwvY29kZT4gZm9yIAorCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IKIAkJICogYWxsIG9wZXJhdG9ycyA8Y29kZT5vcDwvY29kZT4uCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSB0b2tlbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKIAkJICogQHJldHVybiB0aGUgaW5maXggb3BlcmF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkJICovCiAJCXB1YmxpYyBzdGF0aWMgT3BlcmF0b3IgdG9PcGVyYXRvcihTdHJpbmcgdG9rZW4pIHsKIAkJCXJldHVybiAoT3BlcmF0b3IpIENPREVTLmdldCh0b2tlbik7CiAJCX0KLQkJCisKIAl9Ci0JCisKIAkvKioKLQkgKiBUaGUgImxlZnRPcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibGVmdE9wZXJhbmQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTEVGVF9PUEVSQU5EX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBMRUZUX09QRVJBTkRfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoSW5maXhFeHByZXNzaW9uLmNsYXNzLCAibGVmdE9wZXJhbmQiLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgIm9wZXJhdG9yIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAib3BlcmF0b3IiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3J9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgT1BFUkFUT1JfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBPUEVSQVRPUl9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoSW5maXhFeHByZXNzaW9uLmNsYXNzLCAib3BlcmF0b3IiLCBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAicmlnaHRPcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAicmlnaHRPcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFJJR0hUX09QRVJBTkRfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFJJR0hUX09QRVJBTkRfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoSW5maXhFeHByZXNzaW9uLmNsYXNzLCAicmlnaHRPcGVyYW5kIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJleHRlbmRlZE9wZXJhbmRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXh0ZW5kZWRPcGVyYW5kcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBFWFRFTkRFRF9PUEVSQU5EU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEVYVEVOREVEX09QRVJBTkRTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihJbmZpeEV4cHJlc3Npb24uY2xhc3MsICJleHRlbmRlZE9wZXJhbmRzIiwgRXhwcmVzc2lvbi5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoNSk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChJbmZpeEV4cHJlc3Npb24uY2xhc3MsIHByb3BlcnlMaXN0KTsKQEAgLTIyMCwxOCArMjIxLDE4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgaW5maXggb3BlcmF0b3I7IGRlZmF1bHRzIHRvIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTLgogCSAqLwpAQCAtMjUwLDE2ICsyNTEsMTYgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBsaXN0IG9mIGV4dGVuZGVkIG9wZXJhbmQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCi0JICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBMYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgZXh0ZW5kZWQgb3BlcmFuZCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOgorCSAqIHtAbGluayBFeHByZXNzaW9ufSkuIExhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgZXh0ZW5kZWRPcGVyYW5kcyA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbmZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbmZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5vZGUgaGFzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIG9wZXJhdG9yLAogCSAqIGxlZnQgYW5kIHJpZ2h0IG9wZXJhbmRzLCBhbmQgYW4gZW1wdHkgbGlzdCBvZiBhZGRpdGlvbmFsIG9wZXJhbmRzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUluZml4RXhwcmVzc2lvbihBU1QgYXN0KSB7CkBAIC0yNzIsNyArMjczLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zMTIsNyArMzEzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTMzNiwxNCArMzM3LDE0IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlJbmZpeEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IEluZml4RXhwcmVzc2lvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvcigpKTsKIAkJcmVzdWx0LnNldExlZnRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRMZWZ0T3BlcmFuZCgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0UmlnaHRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRSaWdodE9wZXJhbmQoKS5jbG9uZSh0YXJnZXQpKTsKIAkJaWYgKHRoaXMuZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsKSB7CiAJCQkvLyBiZSBjYXJlZnVsIG5vdCB0byB0cmlnZ2VyIGxhenkgY3JlYXRpb24gb2YgbGlzdAogCQkJcmVzdWx0LmV4dGVuZGVkT3BlcmFuZHMoKS5hZGRBbGwoCi0JCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCB0aGlzLmV4dGVuZGVkT3BlcmFuZHMoKSkpOworCQkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgZXh0ZW5kZWRPcGVyYW5kcygpKSk7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0zNzIsMjIgKzM3MywyMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBpbmZpeCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaW5maXggb3BlcmF0b3IKLQkgKi8gCisJICovCiAJcHVibGljIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKIAkJcmV0dXJuIHRoaXMub3BlcmF0b3I7CiAJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBpbmZpeCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9wZXJhdG9yIHRoZSBpbmZpeCBvcGVyYXRvcgogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yKSB7CiAJCWlmIChvcGVyYXRvciA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0zOTksOSArNDAwLDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGlzIGluZml4IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsZWZ0IG9wZXJhbmQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRMZWZ0T3BlcmFuZCgpIHsKIAkJaWYgKHRoaXMubGVmdE9wZXJhbmQgID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC00MTUsMTAgKzQxNiwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmxlZnRPcGVyYW5kOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhpcyBpbmZpeCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGxlZnQgb3BlcmFuZCBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtNDI2LDcgKzQyNyw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRMZWZ0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNDM5LDkgKzQ0MCw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSByaWdodCBvcGVyYW5kIG9mIHRoaXMgaW5maXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJpZ2h0IG9wZXJhbmQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRSaWdodE9wZXJhbmQoKSB7CiAJCWlmICh0aGlzLnJpZ2h0T3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTQ1NSwxMCArNDU2LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMucmlnaHRPcGVyYW5kOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSByaWdodCBvcGVyYW5kIG9mIHRoaXMgaW5maXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSByaWdodCBvcGVyYW5kIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC00NjYsNyArNDY3LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFJpZ2h0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNDc2LDI0ICs0NzcsMjQgQEAKIAkJdGhpcy5yaWdodE9wZXJhbmQgPSBleHByZXNzaW9uOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBleHByZXNzaW9uLCBSSUdIVF9PUEVSQU5EX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXJlIHRoZXJlIGFyZSBhbnkgZXh0ZW5kZWQgb3BlcmFuZHMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBleHRlbmRlZCBvcGVyYW5kcywKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBleHRlbmRlZCBvcGVyYW5kcwogCSAqLwogCXB1YmxpYyBib29sZWFuIGhhc0V4dGVuZGVkT3BlcmFuZHMoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQkodGhpcy5leHRlbmRlZE9wZXJhbmRzICE9IG51bGwpICYmIHRoaXMuZXh0ZW5kZWRPcGVyYW5kcy5zaXplKCkgPiAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBleHRlbmRlZCBvcGVyYW5kcy4KIAkgKiA8cD4KIAkgKiBUaGUgZXh0ZW5kZWQgb3BlcmFuZHMgaXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmVwcmVzZW50aW5nIGRlZXBseSBuZXN0ZWQKIAkgKiBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSA8Y29kZT5MIG9wIFIgb3AgUjIgb3AgUjMuLi48L2NvZGU+IHdoZXJlCi0JICogdGhlIHNhbWUgb3BlcmF0b3IgYXBwZWFycyBiZXR3ZWVuIGFsbCB0aGUgb3BlcmFuZHMgKHRoZSBtb3N0IAorCSAqIHRoZSBzYW1lIG9wZXJhdG9yIGFwcGVhcnMgYmV0d2VlbiBhbGwgdGhlIG9wZXJhbmRzICh0aGUgbW9zdAogCSAqIGNvbW1vbiBjYXNlIGJlaW5nIGxlbmd0aHkgc3RyaW5nIGNvbmNhdGVuYXRpb24gZXhwcmVzc2lvbnMpLiBVc2luZwogCSAqIHRoZSBleHRlbmRlZCBvcGVyYW5kcyBrZWVwcyB0aGUgdHJlZXMgZnJvbSBnZXR0aW5nIHRvbyBkZWVwOyB0aGlzCiAJICogZGVjcmVhc2VzIHRoZSByaXNrIGlzIHJ1bm5pbmcgb3V0IG9mIHRocmVhZCBzdGFjayBzcGFjZSBhdCBydW50aW1lCkBAIC01MDQsOSArNTA1LDkgQEAKIAkgKiAJZXh0ZW5kZWRPcGVyYW5kczoge2MsIGR9CiAJICogCW9wZXJhdG9yOiArCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGV4dGVuZGVkIG9wZXJhbmRzCi0JICogICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKiAgIChlbGVtZW50IHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkKIAkgKi8KIAlwdWJsaWMgTGlzdCBleHRlbmRlZE9wZXJhbmRzKCkgewogCQlpZiAodGhpcy5leHRlbmRlZE9wZXJhbmRzID09IG51bGwpIHsKQEAgLTUyMywxNSArNTI0LDE1IEBACiAJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNCAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLmxlZnRPcGVyYW5kID09IG51bGwgPyAwIDogZ2V0TGVmdE9wZXJhbmQoKS50cmVlU2l6ZSgpKQogCQkJKyAodGhpcy5yaWdodE9wZXJhbmQgPT0gbnVsbCA/IDAgOiBnZXRSaWdodE9wZXJhbmQoKS50cmVlU2l6ZSgpKQotCQkJKyAodGhpcy5leHRlbmRlZE9wZXJhbmRzID09IG51bGwgPyAwIDogZXh0ZW5kZWRPcGVyYW5kcy5saXN0U2l6ZSgpKTsKKwkJCSsgKHRoaXMuZXh0ZW5kZWRPcGVyYW5kcyA9PSBudWxsID8gMCA6IHRoaXMuZXh0ZW5kZWRPcGVyYW5kcy5saXN0U2l6ZSgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luaXRpYWxpemVyLmphdmEKaW5kZXggNDFmZjNlZS4uZWU4NGRlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Jbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5pdGlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw1NSArMjAsNTYgQEAKICAqIEluaXRpYWxpemVyOgogICogICAgIFsgPGI+c3RhdGljPC9iPiBdIEJsb2NrCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24gewotCQorCiAJLyoqCi0JICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEphdmFkb2N9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBKQVZBRE9DX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBKQVZBRE9DX1BST1BFUlRZID0KIAkJaW50ZXJuYWxKYXZhZG9jUHJvcGVydHlGYWN0b3J5KEluaXRpYWxpemVyLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIEludGVnZXJ9KSAoSkxTMiBBUEkgb25seSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSU19QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzUHJvcGVydHlGYWN0b3J5KEluaXRpYWxpemVyLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPQogCQlpbnRlcm5hbE1vZGlmaWVyczJQcm9wZXJ0eUZhY3RvcnkoSW5pdGlhbGl6ZXIuY2xhc3MpOwotCQorCiAJLyoqCi0JICogVGhlICJib2R5IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEJsb2NrfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihJbml0aWFsaXplci5jbGFzcywgImJvZHkiLCBCbG9jay5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMDsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEluaXRpYWxpemVyLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC03Niw3ICs3Nyw3IEBACiAJCWFkZFByb3BlcnR5KE1PRElGSUVSU19QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShCT0RZX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVyeUxpc3QpOwotCQkKKwogCQlwcm9wZXJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChJbml0aWFsaXplci5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShKQVZBRE9DX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC04OCwxMSArODksMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMDMsMjAgKzEwNCwyMCBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGluaXRpYWxpemVyIGJvZHk7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgYmxvY2suCiAJICovCiAJcHJpdmF0ZSBCbG9jayBib2R5ID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGluaXRpYWxpemVyIGRlY2xhcmF0aW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbml0aWFsaXplciBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBpbml0aWFsaXplciBoYXMgbm8gbW9kaWZpZXJzIGFuZCBhbiBlbXB0eSBibG9jay4KIAkgKiBUaGUgamF2YWRvYyBjb21tZW50IGlzIG5vdCB1c2VkIGZvciBpbml0aWFsaXplcnMuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJSW5pdGlhbGl6ZXIoQVNUIGFzdCkgewpAQCAtMTMwLDcgKzEzMSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTcwLDcgKzE3MSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xODEsNyArMTgyLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJvZHlEZWNsYXJhdGlvbi4KIAkgKi8KQEAgLTIxNSw3ICsyMTYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJSW5pdGlhbGl6ZXIgcmVzdWx0ID0gbmV3IEluaXRpYWxpemVyKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CiAJCQlyZXN1bHQuaW50ZXJuYWxTZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOwogCQl9CkBAIC0yNTAsMTIgKzI1MSwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGluaXRpYWxpemVyIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgYm9keQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgQmxvY2sgZ2V0Qm9keSgpIHsKIAkJaWYgKHRoaXMuYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjY5LDEwICsyNzAsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5ib2R5OwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBpbml0aWFsaXplciBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBib2R5IHRoZSBibG9jayBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjgwLDcgKzI4MSw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRCb2R5KEJsb2NrIGJvZHkpIHsKIAkJaWYgKGJvZHkgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjkwLDE0ICsyOTEsMTQgQEAKIAkJdGhpcy5ib2R5ID0gYm9keTsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgYm9keSwgQk9EWV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YQppbmRleCBjNzhkYjI2Li4zYTMzNGE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luc3RhbmNlb2ZFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDMyICsyMCwzMyBAQAogICogSW5zdGFuY2VvZkV4cHJlc3Npb246CiAgKiAgICBFeHByZXNzaW9uIDxiPmluc3RhbmNlb2Y8L2I+IFR5cGUKICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBJbnN0YW5jZW9mRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogCiAJLyoqCi0JICogVGhlICJsZWZ0T3BlcmFuZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImxlZnRPcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIExFRlRfT1BFUkFORF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTEVGVF9PUEVSQU5EX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEluc3RhbmNlb2ZFeHByZXNzaW9uLmNsYXNzLCAibGVmdE9wZXJhbmQiLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInJpZ2h0T3BlcmFuZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInJpZ2h0T3BlcmFuZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBSSUdIVF9PUEVSQU5EX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBSSUdIVF9PUEVSQU5EX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEluc3RhbmNlb2ZFeHByZXNzaW9uLmNsYXNzLCAicmlnaHRPcGVyYW5kIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEluc3RhbmNlb2ZFeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ5TGlzdCk7CkBAIC01NywxOCArNTgsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBsZWZ0IG9wZXJhbmQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCiAJICogYnV0IGxlZ2FsLCBzaW1wbGUgbmFtZS4KQEAgLTgyLDEwICs4MywxMCBAQAogCXByaXZhdGUgVHlwZSByaWdodE9wZXJhbmQgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gaW5zdGFuY2VvZiBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbm9kZSBoYXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgb3BlcmF0b3IsCiAJICogbGVmdCBhbmQgcmlnaHQgb3BlcmFuZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJSW5zdGFuY2VvZkV4cHJlc3Npb24oQVNUIGFzdCkgewpAQCAtOTgsNyArOTksNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyMiw3ICsxMjMsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM1LDcgKzEzNiw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlJbnN0YW5jZW9mRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TGVmdE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldExlZnRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRSaWdodE9wZXJhbmQoKFR5cGUpIGdldFJpZ2h0T3BlcmFuZCgpLmNsb25lKHRhcmdldCkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTYxLDEyICsxNjIsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGlzIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxlZnQgb3BlcmFuZCBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldExlZnRPcGVyYW5kKCkgewogCQlpZiAodGhpcy5sZWZ0T3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4MCwxMCArMTgxLDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubGVmdE9wZXJhbmQ7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGlzIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBsZWZ0IG9wZXJhbmQgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE5MSw3ICsxOTIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TGVmdE9wZXJhbmQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIwNCw5ICsyMDUsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGlzIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJpZ2h0IG9wZXJhbmQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgVHlwZSBnZXRSaWdodE9wZXJhbmQoKSB7CiAJCWlmICh0aGlzLnJpZ2h0T3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIyMCwxMCArMjIxLDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMucmlnaHRPcGVyYW5kOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSByaWdodCBvcGVyYW5kIG9mIHRoaXMgaW5zdGFuY2VvZiBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHJlZmVyZW5jZVR5cGUgdGhlIHJpZ2h0IG9wZXJhbmQgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIzMSw3ICsyMzIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0UmlnaHRPcGVyYW5kKFR5cGUgcmVmZXJlbmNlVHlwZSkgewogCQlpZiAocmVmZXJlbmNlVHlwZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNDEsNyArMjQyLDcgQEAKIAkJdGhpcy5yaWdodE9wZXJhbmQgPSByZWZlcmVuY2VUeXBlOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCByZWZlcmVuY2VUeXBlLCBSSUdIVF9PUEVSQU5EX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTI0OSwxMiArMjUwLDEyIEBACiAJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMiAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLmxlZnRPcGVyYW5kID09IG51bGwgPyAwIDogZ2V0TGVmdE9wZXJhbmQoKS50cmVlU2l6ZSgpKQogCQkJKyAodGhpcy5yaWdodE9wZXJhbmQgPT0gbnVsbCA/IDAgOiBnZXRSaWdodE9wZXJhbmQoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW50ZXJuYWxBU1RSZXdyaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ludGVybmFsQVNUUmV3cml0ZS5qYXZhCmluZGV4IDM5NGU2YmEuLjA5Y2YyZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW50ZXJuYWxBU1RSZXdyaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbnRlcm5hbEFTVFJld3JpdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw5ICsxOSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJ5U2Nhbm5lckRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZUFuYWx5emVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLkxpbmVJbmZvcm1hdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZUV2ZW50OwpAQCAtMzYsMTYgKzM4LDE2IEBACiAgKiBXaGVuIEFTVCBtb2RpZmljYXRpb25zIHJlY29yZGluZyBpcyBlbmFibGVkLCBhbGwgY2hhbmdlcyBhcmUgcmVjb3JkZWQgYnkgdGhpcyBjbGFzcy4KICAqLwogY2xhc3MgSW50ZXJuYWxBU1RSZXdyaXRlIGV4dGVuZHMgTm9kZUV2ZW50SGFuZGxlciB7Ci0JCisKIAkvKiogcm9vdCBub2RlIGZvciB0aGUgcmV3cml0ZTogT25seSBub2RlcyB1bmRlciB0aGlzIHJvb3QgYXJlIGFjY2VwdGVkICovCiAJcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgcm9vdDsKIAogCXByb3RlY3RlZCBmaW5hbCBSZXdyaXRlRXZlbnRTdG9yZSBldmVudFN0b3JlOwogCXByb3RlY3RlZCBmaW5hbCBOb2RlSW5mb1N0b3JlIG5vZGVTdG9yZTsKIAlwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIGNsb25lZE5vZGVzOwotCQorCiAJaW50IGNsb25lRGVwdGggPSAwOwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IKIAkgKiBAcGFyYW0gcm9vdCByb290IG5vZGUgb2YgdGhlIHJlY29yZGVkIGFzdC4KQEAgLTU5LDE5ICs2MSwyMiBAQAogCiAJLyoqCiAJICogUGVyZm9ybXMgdGhlIHJld3JpdGU6IFRoZSByZXdyaXRlIGV2ZW50cyBhcmUgdHJhbnNsYXRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBpbiB0ZXh0IGNoYW5nZXMuCisJICogVGhlIGdpdmVuIG9wdGlvbnMgY2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSB0aGUgZ2xvYmFsIG9wdGlvbnMge0BsaW5rIEphdmFDb3JlI2dldE9wdGlvbnMoKSBKYXZhQ29yZS5nZXRPcHRpb25zKCl9CisJICogd2lsbCBiZSB1c2VkLgorCSAqCiAJICogQHBhcmFtIGRvY3VtZW50IERvY3VtZW50IHdoaWNoIGRlc2NyaWJlcyB0aGUgY29kZSBvZiB0aGUgQVNUIHRoYXQgaXMgcGFzc2VkIGluIGluIHRoZQogCSAqIGNvbnN0cnVjdG9yLiBUaGlzIGRvY3VtZW50IGlzIGFjY2Vzc2VkIHJlYWQtb25seS4KLQkgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zCisJICogQHBhcmFtIG9wdGlvbnMgdGhlIGdpdmVuIG9wdGlvbnMKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmV3cml0ZSBmYWlscwogCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWRpdCBkZXNjcmliaW5nIHRoZSB0ZXh0IGNoYW5nZXMuCiAJICovCiAJcHVibGljIFRleHRFZGl0IHJld3JpdGVBU1QoSURvY3VtZW50IGRvY3VtZW50LCBNYXAgb3B0aW9ucykgewogCQlUZXh0RWRpdCByZXN1bHQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkKKwogCQlmaW5hbCBDb21waWxhdGlvblVuaXQgcm9vdE5vZGUgPSBnZXRSb290Tm9kZSgpOwogCQlpZiAocm9vdE5vZGUgIT0gbnVsbCkgewogCQkJVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlciB4c3JDb21wdXRlciA9IG5ldyBUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKCkgewotCQkJCS8qKiAKKwkJCQkvKioKIAkJCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mCiAJCQkJICoge0BsaW5rIFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIjY29tcHV0ZVNvdXJjZVJhbmdlKEFTVE5vZGUpfQogCQkJCSAqIGlzIHNwZWNpYWxpemVkIHRvIHdvcmsgaW4gdGhlIGNhc2Ugb2YgaW50ZXJuYWwgQVNUIHJld3JpdGluZywgd2hlcmUgdGhlCkBAIC04OCwxMyArOTMsMTQgQEAKIAkJCUxpbmVJbmZvcm1hdGlvbiBsaW5lSW5mbz0gTGluZUluZm9ybWF0aW9uLmNyZWF0ZShkb2N1bWVudCk7CiAJCQlTdHJpbmcgbGluZURlbGltPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KTsKIAkJCUxpc3QgY29tbWVudHM9IHJvb3ROb2RlLmdldENvbW1lbnRMaXN0KCk7Ci0JCQkKLQkJCUFTVFJld3JpdGVBbmFseXplciB2aXNpdG9yID0gbmV3IEFTVFJld3JpdGVBbmFseXplcihjb250ZW50LCBsaW5lSW5mbywgbGluZURlbGltLCByZXN1bHQsIHRoaXMuZXZlbnRTdG9yZSwgdGhpcy5ub2RlU3RvcmUsIGNvbW1lbnRzLCBvcHRpb25zLCB4c3JDb21wdXRlcik7CisKKwkJCU1hcCBjdXJyZW50T3B0aW9ucyA9IG9wdGlvbnMgPT0gbnVsbCA/IEphdmFDb3JlLmdldE9wdGlvbnMoKSA6IG9wdGlvbnM7CisJCQlBU1RSZXdyaXRlQW5hbHl6ZXIgdmlzaXRvciA9IG5ldyBBU1RSZXdyaXRlQW5hbHl6ZXIoY29udGVudCwgbGluZUluZm8sIGxpbmVEZWxpbSwgcmVzdWx0LCB0aGlzLmV2ZW50U3RvcmUsIHRoaXMubm9kZVN0b3JlLCBjb21tZW50cywgY3VycmVudE9wdGlvbnMsIHhzckNvbXB1dGVyLCAoUmVjb3ZlcnlTY2FubmVyRGF0YSlyb290Tm9kZS5nZXRTdGF0ZW1lbnRzUmVjb3ZlcnlEYXRhKCkpOwogCQkJcm9vdE5vZGUuYWNjZXB0KHZpc2l0b3IpOwogCQl9CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJcHJpdmF0ZSAgdm9pZCBtYXJrQXNNb3ZlT3JDb3B5VGFyZ2V0KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBuZXdDaGlsZCkgewogCQlBU1ROb2RlIHNvdXJjZSA9IChBU1ROb2RlKXRoaXMuY2xvbmVkTm9kZXMuZ2V0KG5ld0NoaWxkKTsKIAkJaWYoc291cmNlICE9IG51bGwpIHsKQEAgLTEzMCwzNCArMTM2LDM0IEBACiAJCWJ1Zi5hcHBlbmQodGhpcy5ldmVudFN0b3JlLnRvU3RyaW5nKCkpOwogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJdm9pZCBwcmVWYWx1ZUNoYW5nZUV2ZW50KEFTVE5vZGUgbm9kZSwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCS8vIGZvcmNlIGV2ZW50IGNyZWF0aW9uCi0JCXRoaXMuZ2V0Tm9kZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKKwkJZ2V0Tm9kZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKIAl9Ci0JCisKIAl2b2lkIHBvc3RWYWx1ZUNoYW5nZUV2ZW50KEFTVE5vZGUgbm9kZSwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7Ci0JCU5vZGVSZXdyaXRlRXZlbnQgZXZlbnQgPSB0aGlzLmdldE5vZGVFdmVudChub2RlLCBwcm9wZXJ0eSk7CisJCU5vZGVSZXdyaXRlRXZlbnQgZXZlbnQgPSBnZXROb2RlRXZlbnQobm9kZSwgcHJvcGVydHkpOwogCQlldmVudC5zZXROZXdWYWx1ZShub2RlLmdldFN0cnVjdHVyYWxQcm9wZXJ0eShwcm9wZXJ0eSkpOwogCX0KLQkKKwogCXZvaWQgcHJlQWRkQ2hpbGRFdmVudChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgY2hpbGQsCVN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaWYocHJvcGVydHkuaXNDaGlsZFByb3BlcnR5KCkpIHsKLQkJCU5vZGVSZXdyaXRlRXZlbnQgZXZlbnQgPSB0aGlzLmdldE5vZGVFdmVudChub2RlLCBwcm9wZXJ0eSk7CisJCQlOb2RlUmV3cml0ZUV2ZW50IGV2ZW50ID0gZ2V0Tm9kZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKIAkJCWV2ZW50LnNldE5ld1ZhbHVlKGNoaWxkKTsKIAkJCWlmKGNoaWxkICE9IG51bGwpIHsKLQkJCQl0aGlzLm1hcmtBc01vdmVPckNvcHlUYXJnZXQobm9kZSwgY2hpbGQpOworCQkJCW1hcmtBc01vdmVPckNvcHlUYXJnZXQobm9kZSwgY2hpbGQpOwogCQkJfQogCQl9IGVsc2UgaWYocHJvcGVydHkuaXNDaGlsZExpc3RQcm9wZXJ0eSgpKSB7CiAJCQkvLyBmb3JjZSBldmVudCBjcmVhdGlvbgotCQkJdGhpcy5nZXRMaXN0RXZlbnQobm9kZSwgcHJvcGVydHkpOworCQkJZ2V0TGlzdEV2ZW50KG5vZGUsIHByb3BlcnR5KTsKIAkJfQogCX0KLQkKKwogCXZvaWQgcG9zdEFkZENoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLAlTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCWlmKHByb3BlcnR5LmlzQ2hpbGRMaXN0UHJvcGVydHkoKSkgewogCi0JCQlMaXN0UmV3cml0ZUV2ZW50IGV2ZW50ID0gdGhpcy5nZXRMaXN0RXZlbnQobm9kZSwgcHJvcGVydHkpOworCQkJTGlzdFJld3JpdGVFdmVudCBldmVudCA9IGdldExpc3RFdmVudChub2RlLCBwcm9wZXJ0eSk7CiAJCQlMaXN0IGxpc3QgPSAoTGlzdClub2RlLmdldFN0cnVjdHVyYWxQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJCQlpbnQgaSA9IGxpc3QuaW5kZXhPZihjaGlsZCk7CiAJCQlpbnQgcyA9IGxpc3Quc2l6ZSgpOwpAQCAtMTcwLDE3ICsxNzYsMTcgQEAKIAkJCX0KIAkJCWV2ZW50Lmluc2VydChjaGlsZCwgaW5kZXgpOwogCQkJaWYoY2hpbGQgIT0gbnVsbCkgewotCQkJCXRoaXMubWFya0FzTW92ZU9yQ29weVRhcmdldChub2RlLCBjaGlsZCk7CisJCQkJbWFya0FzTW92ZU9yQ29weVRhcmdldChub2RlLCBjaGlsZCk7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAl2b2lkIHByZVJlbW92ZUNoaWxkRXZlbnQoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGNoaWxkLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCWlmKHByb3BlcnR5LmlzQ2hpbGRQcm9wZXJ0eSgpKSB7CiAJCQlOb2RlUmV3cml0ZUV2ZW50IGV2ZW50ID0gZ2V0Tm9kZUV2ZW50KG5vZGUsIHByb3BlcnR5KTsKIAkJCWV2ZW50LnNldE5ld1ZhbHVlKG51bGwpOwogCQl9IGVsc2UgaWYocHJvcGVydHkuaXNDaGlsZExpc3RQcm9wZXJ0eSgpKSB7Ci0JCQlMaXN0UmV3cml0ZUV2ZW50IGV2ZW50ID0gdGhpcy5nZXRMaXN0RXZlbnQobm9kZSwgcHJvcGVydHkpOworCQkJTGlzdFJld3JpdGVFdmVudCBldmVudCA9IGdldExpc3RFdmVudChub2RlLCBwcm9wZXJ0eSk7CiAJCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KGNoaWxkLCBMaXN0UmV3cml0ZUV2ZW50Lk5FVyk7CiAJCQlOb2RlUmV3cml0ZUV2ZW50IG5vZGVFdmVudCA9IChOb2RlUmV3cml0ZUV2ZW50KWV2ZW50LmdldENoaWxkcmVuKClbaV07CiAJCQlpZihub2RlRXZlbnQuZ2V0T3JpZ2luYWxWYWx1ZSgpID09IG51bGwpIHsKQEAgLTE5MCwzMyArMTk2LDMzIEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAl2b2lkIHByZVJlcGxhY2VDaGlsZEV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjaGlsZCwgQVNUTm9kZSBuZXdDaGlsZCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewogCQlpZihwcm9wZXJ0eS5pc0NoaWxkUHJvcGVydHkoKSkgewogCQkJTm9kZVJld3JpdGVFdmVudCBldmVudCA9IGdldE5vZGVFdmVudChub2RlLCBwcm9wZXJ0eSk7CiAJCQlldmVudC5zZXROZXdWYWx1ZShuZXdDaGlsZCk7CiAJCQlpZihuZXdDaGlsZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5tYXJrQXNNb3ZlT3JDb3B5VGFyZ2V0KG5vZGUsIG5ld0NoaWxkKTsKKwkJCQltYXJrQXNNb3ZlT3JDb3B5VGFyZ2V0KG5vZGUsIG5ld0NoaWxkKTsKIAkJCX0KIAkJfSBlbHNlIGlmKHByb3BlcnR5LmlzQ2hpbGRMaXN0UHJvcGVydHkoKSkgewotCQkJTGlzdFJld3JpdGVFdmVudCBldmVudCA9IHRoaXMuZ2V0TGlzdEV2ZW50KG5vZGUsIHByb3BlcnR5KTsKKwkJCUxpc3RSZXdyaXRlRXZlbnQgZXZlbnQgPSBnZXRMaXN0RXZlbnQobm9kZSwgcHJvcGVydHkpOwogCQkJaW50IGkgPSBldmVudC5nZXRJbmRleChjaGlsZCwgTGlzdFJld3JpdGVFdmVudC5ORVcpOwogCQkJTm9kZVJld3JpdGVFdmVudCBub2RlRXZlbnQgPSAoTm9kZVJld3JpdGVFdmVudClldmVudC5nZXRDaGlsZHJlbigpW2ldOwogCQkJbm9kZUV2ZW50LnNldE5ld1ZhbHVlKG5ld0NoaWxkKTsKIAkJCWlmKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCQl0aGlzLm1hcmtBc01vdmVPckNvcHlUYXJnZXQobm9kZSwgbmV3Q2hpbGQpOworCQkJCW1hcmtBc01vdmVPckNvcHlUYXJnZXQobm9kZSwgbmV3Q2hpbGQpOwogCQkJfQogCQl9CiAJfQotCQotCQorCisKIAl2b2lkIHByZUNsb25lTm9kZUV2ZW50KEFTVE5vZGUgbm9kZSkgewogCQl0aGlzLmNsb25lRGVwdGgrKzsKIAl9Ci0JCi0JCisKKwogCXZvaWQgcG9zdENsb25lTm9kZUV2ZW50KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBjbG9uZSkgewotCQlpZihub2RlLmFzdCA9PSByb290LmFzdCAmJiBjbG9uZS5hc3QgPT0gcm9vdC5hc3QpIHsKKwkJaWYobm9kZS5hc3QgPT0gdGhpcy5yb290LmFzdCAmJiBjbG9uZS5hc3QgPT0gdGhpcy5yb290LmFzdCkgewogCQkJaWYoKG5vZGUuZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuT1JJR0lOQUwpICE9IDApIHsKIAkJCQl0aGlzLmNsb25lZE5vZGVzLnB1dChjbG9uZSwgbm9kZSk7CiAJCQl9IGVsc2UgewpAQCAtMjI5LDExICsyMzUsMTEgQEAKIAkJfQogCQl0aGlzLmNsb25lRGVwdGgtLTsKIAl9Ci0JCisKIAlwcml2YXRlIE5vZGVSZXdyaXRlRXZlbnQgZ2V0Tm9kZUV2ZW50KEFTVE5vZGUgbm9kZSwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewogCQlyZXR1cm4gdGhpcy5ldmVudFN0b3JlLmdldE5vZGVFdmVudChub2RlLCBwcm9wZXJ0eSwgdHJ1ZSk7CiAJfQotCQorCiAJcHJpdmF0ZSBMaXN0UmV3cml0ZUV2ZW50IGdldExpc3RFdmVudChBU1ROb2RlIG5vZGUsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJcmV0dXJuIHRoaXMuZXZlbnRTdG9yZS5nZXRMaXN0RXZlbnQobm9kZSwgcHJvcGVydHksIHRydWUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9KYXZhZG9jLmphdmEKaW5kZXggZTM3YTAzNC4uY2NjNDY4MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9KYXZhZG9jLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9KYXZhZG9jLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNTAgKzI0LDUxIEBACiAgKiBKYXZhZG9jOgogICogICA8Yj4vKiogPC9iPiB7IFRhZ0VsZW1lbnQgfSA8Yj4qPC9iPjxiPi88L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSmF2YWRvYyBleHRlbmRzIENvbW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJjb21tZW50IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgImNvbW1lbnQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBTdHJpbmd9KSAoSkxTMiBBUEkgb25seSkuCiAJICogQHNpbmNlIDMuMAogCSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayAjVEFHU19QUk9QRVJUWX0gaW4gdGhlIEpMUzMgQVBJLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIENPTU1FTlRfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBDT01NRU5UX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihKYXZhZG9jLmNsYXNzLCAiY29tbWVudCIsIFN0cmluZy5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJ0YWdzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidGFncyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVGFnRWxlbWVudH0pLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUQUdTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVEFHU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoSmF2YWRvYy5jbGFzcywgInRhZ3MiLCBUYWdFbGVtZW50LmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoSmF2YWRvYy5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShDT01NRU5UX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KFRBR1NfUFJPUEVSVFksIHByb3BlcnlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KEphdmFkb2MuY2xhc3MsIHByb3BlcnlMaXN0KTsKIAkJYWRkUHJvcGVydHkoVEFHU19QUk9QRVJUWSwgcHJvcGVyeUxpc3QpOwpAQCAtNzcsMTAgKzc4LDEwIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTkxLDcgKzkyLDcgQEAKIAkJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBDYW5vbmljYWwgbWluaW1hbCBkb2MgY29tbWVudC4KICAgICAgKiBAc2luY2UgMy4wCkBAIC05OSwyMCArMTAwLDIwIEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTklNQUxfRE9DX0NPTU1FTlQgPSAiLyoqICovIjsvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgZG9jIGNvbW1lbnQgc3RyaW5nLCBpbmNsdWRpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBjb21tZW50IAorCSAqIFRoZSBkb2MgY29tbWVudCBzdHJpbmcsIGluY2x1ZGluZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvbW1lbnQKIAkgKiBkZWxpbWl0ZXJzOyBkZWZhdWx0cyB0byBhIG1pbmltYWwgSmF2YWRvYyBjb21tZW50LgogCSAqIEBkZXByZWNhdGVkIFRoZSBjb21tZW50IHN0cmluZyB3YXMgcmVwbGFjZWQgaW4gdGhlIDMuMCByZWxlYXNlCiAJICogYnkgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2MgY29tbWVudC4KIAkgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0IGlzIHN0aWxsIGZ1bmNhdGlvbmFsIGFzIGJlZm9yZS4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBjb21tZW50ID0gTUlOSU1BTF9ET0NfQ09NTUVOVDsKLQkKKwogCS8qKgotCSAqIFRoZSBsaXN0IG9mIHRhZyBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5UYWdFbGVtZW50PC9jb2RlPikuIAorCSAqIFRoZSBsaXN0IG9mIHRhZyBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVGFnRWxlbWVudH0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB0YWdzID0gCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHRhZ3MgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChUQUdTX1BST1BFUlRZKTsKIAogCS8qKgpAQCAtMTIwLDI0ICsxMjEsMjQgQEAKIAkgKiBUaGUgbmV3IG5vZGUgaGFzIGFuIGVtcHR5IGxpc3Qgb2YgdGFnIGVsZW1lbnRzIChhbmQsIGZvciBiYWNrd2FyZHMKIAkgKiBjb21wYXRhYmlsaXR5LCBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBkb2MgY29tbWVudCBzdHJpbmcpLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlKYXZhZG9jKEFTVCBhc3QpIHsKIAkJc3VwZXIoYXN0KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNjQsNyArMTY1LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNzcsMTQgKzE3OCwxNCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJSmF2YWRvYyByZXN1bHQgPSBuZXcgSmF2YWRvYyh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA9PSBBU1QuSkxTMl9JTlRFUk5BTCkgewogCQkJcmVzdWx0LnNldENvbW1lbnQoZ2V0Q29tbWVudCgpKTsKIAkJfQogCQlyZXN1bHQudGFncygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHRhZ3MoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA4LDcgKzIwOSw3IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgZG9jIGNvbW1lbnQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nCiAJICogYW5kIGVuZGluZyBjb21tZW50IGRlbGltaXRlcnMsIGFuZCBhbnkgZW1iZWRkZWQgbGluZSBicmVha3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkb2MgY29tbWVudCBzdHJpbmcKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCkBAIC0yMjUsNyArMjI2LDcgQEAKIAkgKiBTZXRzIG9yIGNsZWFycyB0aGUgZG9jIGNvbW1lbnQgc3RyaW5nLiBUaGUgZG9jdW1lbnRhdGlvbgogCSAqIHN0cmluZyBtdXN0IGluY2x1ZGUgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgY29tbWVudCBkZWxpbWl0ZXJzLAogCSAqIGFuZCBhbnkgZW1iZWRkZWQgbGluZSBicmVha3MuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZG9jQ29tbWVudCB0aGUgZG9jIGNvbW1lbnQgc3RyaW5nCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIEphdmEgY29tbWVudCBzdHJpbmcgaXMgaW52YWxpZAogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgpAQCAtMjY4LDEzICsyNjksMTMgQEAKIAkJdGhpcy5jb21tZW50ID0gZG9jQ29tbWVudDsKIAkJcG9zdFZhbHVlQ2hhbmdlKENPTU1FTlRfUFJPUEVSVFkpOwogCX0KLQkJCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgdGFnIGVsZW1lbnRzIHRoYXQgbWFrZSB1cCB0aGlzIGRvYyAKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgdGFnIGVsZW1lbnRzIHRoYXQgbWFrZSB1cCB0aGlzIGRvYwogCSAqIGNvbW1lbnQuCiAJICogPHA+CiAJICogVGhlIHRhZyBlbGVtZW50cyBjb3ZlciBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZwotCSAqIGNvbW1lbnQgZGVsaW1pdGVycywgYW5kIGdlbmVyYWxseSBvbWl0IGxlYWRpbmcgd2hpdGVzcGFjZSAKKwkgKiBjb21tZW50IGRlbGltaXRlcnMsIGFuZCBnZW5lcmFsbHkgb21pdCBsZWFkaW5nIHdoaXRlc3BhY2UKIAkgKiAoaW5jbHVkaW5nIGEgbGVhZGluZyAiKiIpIGFuZCBlbWJlZGRlZCBsaW5lIGJyZWFrcy4KIAkgKiBUaGUgZmlyc3QgdGFnIGVsZW1lbnQgb2YgYSB0eXBpY2FsIGRvYyBjb21tZW50IHJlcHJlc2VudHMKIAkgKiBhbGwgdGhlIG1hdGVyaWFsIGJlZm9yZSB0aGUgZmlyc3QgZXhwbGljaXQgZG9jIHRhZzsgdGhpcwpAQCAtMjg5LDE1ICsyOTAsMTUgQEAKIAkgKiBBZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzIGZyb20gdGhpcyBsaXN0IGFmZmVjdHMgdGhpcyBub2RlCiAJICogZHluYW1pY2FsbHkuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHRhZyBlbGVtZW50cyBpbiB0aGlzIGRvYyBjb21tZW50Ci0JICogKGVsZW1lbnQgdHlwZTogPGNvZGU+VGFnRWxlbWVudDwvY29kZT4pCisJICogKGVsZW1lbnQgdHlwZToge0BsaW5rIFRhZ0VsZW1lbnR9KQogCSAqIEBzaW5jZSAzLjAKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgdGFncygpIHsKIAkJcmV0dXJuIHRoaXMudGFnczsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTMwOSw3ICszMTAsNyBAQAogCQl9CiAJCXJldHVybiBzaXplOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9MYWJlbGVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQppbmRleCBkMTM1ZTQ5Li4wNDc4OTk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwzMiArMjEsMzMgQEAKICAqIExhYmVsZWRTdGF0ZW1lbnQ6CiAgKiAgICBJZGVudGlmaWVyIDxiPjo8L2I+IFN0YXRlbWVudAogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQkJCisKIAkvKioKLQkgKiBUaGUgImxhYmVsIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibGFiZWwiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTEFCRUxfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIExBQkVMX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKExhYmVsZWRTdGF0ZW1lbnQuY2xhc3MsICJsYWJlbCIsIFNpbXBsZU5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKExhYmVsZWRTdGF0ZW1lbnQuY2xhc3MsICJib2R5IiwgU3RhdGVtZW50LmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KExhYmVsZWRTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC01OCwxOCArNTksMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBsYWJlbDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KQEAgLTc3LDE5ICs3OCwxOSBAQAogCXByaXZhdGUgU2ltcGxlTmFtZSBsYWJlbE5hbWUgPSBudWxsOwogCiAJLyoqCi0JICogVGhlIGJvZHkgc3RhdGVtZW50OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogVGhlIGJvZHkgc3RhdGVtZW50OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQKIAkgKiBsZWdhbCwgc3RhdGVtZW50LgogCSAqLwogCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBsYWJlbGVkIHN0YXRlbWVudCBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBsYWJlbGVkIHN0YXRlbWVudCBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBzdGF0ZW1lbnQgaGFzIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIGxhYmVsCiAJICogYW5kIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHN0YXRlbWVudC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlMYWJlbGVkU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTEwMiw3ICsxMDMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNiw3ICsxMjcsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM5LDcgKzE0MCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlMYWJlbGVkU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBMYWJlbGVkU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldExhYmVsKAogCQkJKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRMYWJlbCgpKSk7CiAJCXJlc3VsdC5zZXRCb2R5KApAQCAtMTY3LDEyICsxNjgsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoaXMgbGFiZWxlZCBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TGFiZWwoKSB7CiAJCWlmICh0aGlzLmxhYmVsTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTg2LDE3ICsxODcsMTcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5sYWJlbE5hbWU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGxhYmVsIG9mIHRoaXMgbGFiZWxlZCBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbGFiZWwgdGhlIG5ldyBsYWJlbAogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TGFiZWwoU2ltcGxlTmFtZSBsYWJlbCkgewogCQlpZiAobGFiZWwgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjA2LDEyICsyMDcsMTIgQEAKIAkJdGhpcy5sYWJlbE5hbWUgPSBsYWJlbDsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbGFiZWwsIExBQkVMX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgbGFiZWxlZCBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBib2R5IHN0YXRlbWVudCBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKIAkJaWYgKHRoaXMuYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjI1LDcgKzIyNiw3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuYm9keTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgbGFiZWxlZCBzdGF0ZW1lbnQuCiAJICogPHA+CkBAIC0yMzYsNyArMjM3LDcgQEAKIAkgKiBjb21waWxlLCBiZSBzdXJlIHRvIGVtYmVkIHRoZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPgogCSAqIGluc2lkZSBhIDxjb2RlPkJsb2NrPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSBib2R5IHN0YXRlbWVudCBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjQ0LDcgKzI0NSw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRCb2R5KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJaWYgKHN0YXRlbWVudCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNTQsMTQgKzI1NSwxNCBAQAogCQl0aGlzLmJvZHkgPSBzdGF0ZW1lbnQ7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIHN0YXRlbWVudCwgQk9EWV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTGluZUNvbW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTGluZUNvbW1lbnQuamF2YQppbmRleCAzNzE0YTc5Li4yZWQyYmMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xpbmVDb21tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9MaW5lQ29tbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI2LDE4ICsyNiwxOSBAQAogICogd2FzIGZvdW5kIGluIGEgc291cmNlIHN0cmluZy4gSXQgaXMgbm90IHVzZWZ1bCBmb3IgY3JlYXRpbmcKICAqIGNvbW1lbnRzLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBMaW5lQ29tbWVudCBleHRlbmRzIENvbW1lbnQgewotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChMaW5lQ29tbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTQ3LDI0ICs0OCwyNCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBsaW5lIGNvbW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCUxpbmVDb21tZW50KEFTVCBhc3QpIHsKQEAgLTc3LDcgKzc4LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC05MCw3ICs5MSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlMaW5lQ29tbWVudCByZXN1bHQgPSBuZXcgTGluZUNvbW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMTA5LDE0ICsxMTAsMTQgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWFya2VyQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NYXJrZXJBbm5vdGF0aW9uLmphdmEKaW5kZXggYmNiOTExNS4uYWRmMmI1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NYXJrZXJBbm5vdGF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NYXJrZXJBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIE1hcmtlciBhbm5vdGF0aW9uIG5vZGUgKGFkZGVkIGluIEpMUzMgQVBJKS4gVGhlIG1hcmtlciBhbm5vdGF0aW9uIAorICogTWFya2VyIGFubm90YXRpb24gbm9kZSAoYWRkZWQgaW4gSkxTMyBBUEkpLiBUaGUgbWFya2VyIGFubm90YXRpb24KICAqICJAZm9vIiBpcyBlcXVpdmFsZW50IHRvIHRoZSBub3JtYWwgYW5ub3RhdGlvbiAiQGZvbygpIi4KICAqIDxwPgogICogPHByZT4KQEAgLTIyLDUxICsyMiw1MiBAQAogICogICA8Yj5APC9iPiBUeXBlTmFtZQogICogPC9wcmU+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1hcmtlckFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKIAogCS8qKgotCSAqIFRoZSAidHlwZU5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlTmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9OQU1FX1BST1BFUlRZID0KIAkJaW50ZXJuYWxUeXBlTmFtZVByb3BlcnR5RmFjdG9yeShNYXJrZXJBbm5vdGF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoTWFya2VyQW5ub3RhdGlvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoVFlQRV9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SUyA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUgQVNULkpMUyogY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbWFya2VyIGFubm90YXRpb24gbm9kZSBvd25lZCAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbWFya2VyIGFubm90YXRpb24gbm9kZSBvd25lZAogCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhbm5vdGF0aW9uIGhhcyBhbgogCSAqIHVuc3BlY2lmaWVkIHR5cGUgbmFtZSAuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJTWFya2VyQW5ub3RhdGlvbihBU1QgYXN0KSB7CkBAIC04MCw3ICs4MSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtOTYsNyArOTcsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCb2R5RGVjbGFyYXRpb24uCiAJICovCkBAIC0xMTYsMTEgKzExNywxMSBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJTWFya2VyQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgTWFya2VyQW5ub3RhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRUeXBlTmFtZSgoTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFR5cGVOYW1lKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyOCw3ICsxMjksNyBAQAogCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCiAJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE0MCwxNCArMTQxLDE0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVtYmVyUmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lbWJlclJlZi5qYXZhCmluZGV4IDJhYWU0NGEuLjA3MmE1NzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVtYmVyUmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZW1iZXJSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywzMyArMjMsMzQgQEAKICAqIE1lbWJlclJlZjoKICAqIAkJWyBOYW1lIF0gPGI+IzwvYj4gSWRlbnRpZmllcgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2VlIEphdmFkb2MKICAqIEBzaW5jZSAzLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgTWVtYmVyUmVmIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElEb2NFbGVtZW50IHsKLQkKKwogCS8qKgotCSAqIFRoZSAicXVhbGlmaWVyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAicXVhbGlmaWVyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFFVQUxJRklFUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUVVBTElGSUVSX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKE1lbWJlclJlZi5jbGFzcywgInF1YWxpZmllciIsIE5hbWUuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKE1lbWJlclJlZi5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KE1lbWJlclJlZi5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTYxLDE2ICs2MiwxNiBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZSBBU1QuSkxTKiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBvcHRpb25hbCBxdWFsaWZpZXI7IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgogCSAqLwpAQCAtODEsMTcgKzgyLDE3IEBACiAJICogbGVnYWwgSmF2YSBtZXRob2QgbmFtZS4KIAkgKi8KIAlwcml2YXRlIFNpbXBsZU5hbWUgbWVtYmVyTmFtZSA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1lbWJlciByZWZlcmVuY2Ugb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgbWVtYmVyIHJlZmVyZW5jZSBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBtZXRob2QgcmVmZXJlbmNlIGlzIGZvciBhIG1lbWJlciB3aXRoIGFuCiAJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgYW5kIG5vIHF1YWxpZmllci4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAotCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZQogCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJTWVtYmVyUmVmKEFTVCBhc3QpIHsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyOCw3ICsxMjksNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTQxLDcgKzE0Miw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlNZW1iZXJSZWYgcmVzdWx0ID0gbmV3IE1lbWJlclJlZih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldE5hbWUoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTU0LDcgKzE1NSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTY3LDI4ICsxNjgsMjggQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzIG1lbWJlciByZWZlcmVuY2UsIG9yIAorCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzIG1lbWJlciByZWZlcmVuY2UsIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllciBuYW1lIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIE5hbWUgZ2V0UXVhbGlmaWVyKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbFF1YWxpZmllcjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIG9yIGNsZWFycyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgbWVtYmVyIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoTmFtZSBuYW1lKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsUXVhbGlmaWVyOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5hbWUsIFFVQUxJRklFUl9QUk9QRVJUWSk7CkBAIC0xOTgsOSArMTk5LDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgbWVtYmVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbWVtYmVyIG5hbWUgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgewogCQlpZiAodGhpcy5tZW1iZXJOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMTQsMTAgKzIxNSwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLm1lbWJlck5hbWU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBtZW1iZXIgdG8gdGhlIGdpdmVuIG5hbWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG1lbWJlciBuYW1lIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yMjUsNyArMjI2LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIG5hbWUpIHsKIAkJaWYgKG5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjQzLDEwICsyNDQsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMpOwogCX0KQEAgLTI1Nyw3ICsyNTgsNyBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVtYmVyVmFsdWVQYWlyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lbWJlclZhbHVlUGFpci5qYXZhCmluZGV4IDQ4ZTU2MGIuLmIxYTAxZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVtYmVyVmFsdWVQYWlyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZW1iZXJWYWx1ZVBhaXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywyOCArMjcsMjkgQEAKICAqCiAgKiBAc2VlIE5vcm1hbEFubm90YXRpb24KICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgTWVtYmVyVmFsdWVQYWlyIGV4dGVuZHMgQVNUTm9kZSB7Ci0JCisKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihNZW1iZXJWYWx1ZVBhaXIuY2xhc3MsICJuYW1lIiwgU2ltcGxlTmFtZS5jbGFzcywgTUFOREFUT1JZLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJ2YWx1ZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVkFMVUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFZBTFVFX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKE1lbWJlclZhbHVlUGFpci5jbGFzcywgInZhbHVlIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChNZW1iZXJWYWx1ZVBhaXIuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC02MCwxNSArNjEsMTUgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUgQVNULkpMUyogY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkJCQkKKwogCS8qKgogCSAqIFRoZSBtZW1iZXIgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIG5hbWUuCkBAIC04MCwxNSArODEsMTUgQEAKIAkgKiBsZWdhbCBleHByZXNzaW9uLgogCSAqLwogCXByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZSA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1lbWJlciB2YWx1ZSBwYWlyIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1lbWJlciB2YWx1ZSBwYWlyIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5vZGUgaGFzIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIG1lbWJlcgogCSAqIG5hbWUgYW5kIHZhbHVlLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCU1lbWJlclZhbHVlUGFpcihBU1QgYXN0KSB7CkBAIC0xMDIsNyArMTAzLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMjYsNyArMTI3LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEzOSw3ICsxNDAsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJTWVtYmVyVmFsdWVQYWlyIHJlc3VsdCA9IG5ldyBNZW1iZXJWYWx1ZVBhaXIodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldE5hbWUoKSkpOwogCQlyZXN1bHQuc2V0VmFsdWUoKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRWYWx1ZSgpKSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xNTIsNyArMTUzLDcgQEAKIAkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAogCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNjUsMTIgKzE2NiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWVtYmVyIG5hbWUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtZW1iZXIgbmFtZSBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4NCwzMiArMTg1LDMyIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgYmluZGluZyBmb3IgdGhpcyBtZW1iZXIgdmFsdWUgcGFpci4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAogCSAqIEBzaW5jZSAzLjIKLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIElNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nIHJlc29sdmVNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nKCkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZU1lbWJlclZhbHVlUGFpcih0aGlzKTsKIAl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSBtZW1iZXIgbmFtZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgbmFtZSBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbmFtZSkgewogCQlpZiAobmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMjIsOSArMjIzLDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBleHByZXNzaW9uCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldFZhbHVlKCkgewogCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjQxLDcgKzI0Miw3IEBACiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhaXIuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI0OSw3ICsyNTAsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSkgewogCQlpZiAodmFsdWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjY2LDEyICsyNjcsMTIgQEAKIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMiAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLm5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKIAkJCSsgKHRoaXMudmFsdWUgPT0gbnVsbCA/IDAgOiBnZXRWYWx1ZSgpLnRyZWVTaXplKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZW1iZXJWYWx1ZVBhaXJCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lbWJlclZhbHVlUGFpckJpbmRpbmcuamF2YQppbmRleCA5NGRhMmUxLi5jZmQ4NjQwIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lbWJlclZhbHVlUGFpckJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lbWJlclZhbHVlUGFpckJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBCRUEgU3lzdGVtcywgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsNyBAQAogICogICAgSUJNIENvcnBvcmF0aW9uIC0gaW1wbGVtZW50ZWQgbWV0aG9kcyBmcm9tIElCaW5kaW5nCiAgKiAgICBJQk0gQ29ycG9yYXRpb24gLSByZW5hbWVkIGZyb20gUmVzb2x2ZWRNZW1iZXJWYWx1ZVBhaXIgdG8gTWVtYmVyVmFsdWVQYWlyQmluZGluZwogICogICAgamdhcm1zQGJlYS5jb20gLSBGaXggZm9yIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICogICAgSUJNIENvcnBvcmF0aW9uIC0gRml4IGZvciAyMjMyMjUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTcyLDcgKzczLDggQEAKIAkJCQkJcmV0dXJuIG5ldyBMb25nKGNvbnN0YW50LmxvbmdWYWx1ZSgpKTsKIAkJCQljYXNlIFR5cGVJZHMuVF9zaG9ydDoKIAkJCQkJcmV0dXJuIG5ldyBTaG9ydChjb25zdGFudC5zaG9ydFZhbHVlKCkpOwotCQkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nOgorCQkJCWRlZmF1bHQ6CisJCQkJCS8vIFR5cGVJZHMuVF9KYXZhTGFuZ1N0cmluZzoKIAkJCQkJcmV0dXJuIGNvbnN0YW50LnN0cmluZ1ZhbHVlKCk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoaW50ZXJuYWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CkBAIC0xMzAsMTUgKzEzMiwxOSBAQAogCX0KIAogCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQorCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKQogCQkJaW5pdCgpOwotCQlyZXR1cm4gdmFsdWUgPT0gTm9WYWx1ZSA/IG51bGwgOiB0aGlzLnZhbHVlOworCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBOb1ZhbHVlID8gbnVsbCA6IHRoaXMudmFsdWU7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGluaXQoKSB7CiAJCXRoaXMudmFsdWUgPSBidWlsZERPTVZhbHVlKHRoaXMuaW50ZXJuYWxQYWlyLmdldFZhbHVlKCksIHRoaXMuYmluZGluZ1Jlc29sdmVyKTsKIAkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkKIAkJCXRoaXMudmFsdWUgPSBOb1ZhbHVlOworCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gZ2V0TWV0aG9kQmluZGluZygpOworCQlpZiAobWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCkuaXNBcnJheSgpICYmICF0aGlzLnZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisJCQl0aGlzLnZhbHVlID0gbmV3IE9iamVjdFtdIHsgdGhpcy52YWx1ZSB9OyAKKwkJfQogCX0KIAogCWNoYXJbXSBpbnRlcm5hbE5hbWUoKSB7CkBAIC0xNjgsMTEgKzE3NCwxMSBAQAogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChiaW5kaW5nLmdldEtpbmQoKSAhPSBJQmluZGluZy5NRU1CRVJfVkFMVUVfUEFJUikKIAkJCXJldHVybiBmYWxzZTsKLQkJSU1lbWJlclZhbHVlUGFpckJpbmRpbmcgb3RoZXIgPSAoSU1lbWJlclZhbHVlUGFpckJpbmRpbmcpIGJpbmRpbmc7Ci0JCWlmICghZ2V0TWV0aG9kQmluZGluZygpLmlzRXF1YWxUbyhvdGhlci5nZXRNZXRob2RCaW5kaW5nKCkpKSB7CisJCUlNZW1iZXJWYWx1ZVBhaXJCaW5kaW5nIG90aGVyTWVtYmVyVmFsdWVQYWlyQmluZGluZyA9IChJTWVtYmVyVmFsdWVQYWlyQmluZGluZykgYmluZGluZzsKKwkJaWYgKCFnZXRNZXRob2RCaW5kaW5nKCkuaXNFcXVhbFRvKG90aGVyTWVtYmVyVmFsdWVQYWlyQmluZGluZy5nZXRNZXRob2RCaW5kaW5nKCkpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJT2JqZWN0IG90aGVyVmFsdWUgPSBvdGhlci5nZXRWYWx1ZSgpOworCQlPYmplY3Qgb3RoZXJWYWx1ZSA9IG90aGVyTWVtYmVyVmFsdWVQYWlyQmluZGluZy5nZXRWYWx1ZSgpOwogCQlPYmplY3QgY3VycmVudFZhbHVlID0gZ2V0VmFsdWUoKTsKIAkJaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gb3RoZXJWYWx1ZSA9PSBudWxsOwpAQCAtMTgzLDcgKzE4OSwzNCBAQAogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCXJldHVybiBjdXJyZW50VmFsdWUuZXF1YWxzKG90aGVyVmFsdWUpOworCQlpZiAoY3VycmVudFZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisJCQlpZiAoIW90aGVyVmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlPYmplY3RbXSBjdXJyZW50VmFsdWVzID0gKE9iamVjdFtdKSBjdXJyZW50VmFsdWU7CisJCQlPYmplY3RbXSBvdGhlclZhbHVlcyA9IChPYmplY3RbXSkgb3RoZXJWYWx1ZTsKKwkJCWZpbmFsIGludCBsZW5ndGggPSBjdXJyZW50VmFsdWVzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggIT0gb3RoZXJWYWx1ZXMubGVuZ3RoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCU9iamVjdCBjdXJyZW50ID0gY3VycmVudFZhbHVlc1tpXTsKKwkJCQlPYmplY3Qgb3RoZXIgPSBvdGhlclZhbHVlc1tpXTsKKwkJCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIElCaW5kaW5nKSB7CisJCQkJCWlmICghKG90aGVyIGluc3RhbmNlb2YgSUJpbmRpbmcpKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJaWYgKCEoKElCaW5kaW5nKSBjdXJyZW50KS5pc0VxdWFsVG8oKElCaW5kaW5nKSBvdGhlcikpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIWN1cnJlbnQuZXF1YWxzKG90aGVyKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY3VycmVudFZhbHVlLmVxdWFscyhvdGhlclZhbHVlKTsKKwkJfQogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lc3NhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVzc2FnZS5qYXZhCmluZGV4IDRiOTM2NjMuLmNmMjMxYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVzc2FnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVzc2FnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDMyICsxOCwzMiBAQAogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZSB7Ci0JCisKIAkvKioKIAkgKiBUaGUgbWVzc2FnZS4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCQorCiAJLyoqCiAJICogVGhlIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc3RyaW5nLCBvciAtMSBpZiBub25lLgogCSAqLwogCXByaXZhdGUgaW50IHN0YXJ0UG9zaXRpb247Ci0JCisKIAkvKioKIAkgKiBUaGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGluZGljYXRpbmcKIAkgKiB3aGVyZSB0aGUgc291cmNlIGZyYWdtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXNzYWdlIGVuZHMuCiAJICovCiAJcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG1lc3NhZ2UuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyCi0JICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IGludG8gdGhlIAorCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZQogCSAqICAgIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgbm8gc291cmNlIHBvc2l0aW9uCiAJICogICAgaW5mb3JtYXRpb24gaXMgdG8gYmUgcmVjb3JkZWQgZm9yIHRoaXMgbWVzc2FnZQogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG51bGwKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RhcnRQb3NpdGlvbiBpcyBsb3dlciB0aGFuIC0xLiAKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RhcnRQb3NpdGlvbiBpcyBsb3dlciB0aGFuIC0xLgogCSAqLwogCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgc3RhcnRQb3NpdGlvbikgewogCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CkBAIC01OSwxNiArNTksMTYgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBtZXNzYWdlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlcgotCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSAKKwkgKiBAcGFyYW0gc3RhcnRQb3NpdGlvbiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggaW50byB0aGUKIAkgKiAgICBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHNvdXJjZSBwb3NpdGlvbgogCSAqICAgIGluZm9ybWF0aW9uIGlzIHRvIGJlIHJlY29yZGVkIGZvciB0aGlzIG1lc3NhZ2UKIAkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVyIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBpbmRpY2F0aW5nCi0JICogCSAgd2hlcmUgdGhlIHNvdXJjZSBmcmFnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVzc2FnZSBlbmRzLiAwIG9yIGEgbmVnYXRpdmUgbnVtYmVyIAorCSAqIAkgIHdoZXJlIHRoZSBzb3VyY2UgZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lc3NhZ2UgZW5kcy4gMCBvciBhIG5lZ2F0aXZlIG51bWJlcgogCSAqICAgIGlmIG5vbmUuIEEgbmVnYXRpdmUgbnVtYmVyIHdpbGwgYmUgY29udmVydGVkIHRvIGEgMC1sZW5ndGguCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbnVsbAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdGFydFBvc2l0aW9uIGlzIGxvd2VyIHRoYW4gLTEuIAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdGFydFBvc2l0aW9uIGlzIGxvd2VyIHRoYW4gLTEuCiAJICovCiAJcHVibGljIE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzdGFydFBvc2l0aW9uLCBpbnQgbGVuZ3RoKSB7CiAJCWlmIChtZXNzYWdlID09IG51bGwpIHsKQEAgLTg1LDE5ICs4NSwxOSBAQAogCQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBtZXNzYWdlCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKKwkJcmV0dXJuIHRoaXMubWVzc2FnZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggaW50byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCwgb3IgPGNvZGU+LTE8L2NvZGU+CiAJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzCiAJICogICAgbWVzc2FnZQpAQCAtMTEwLDI1ICsxMTAsMjUgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4LCBvciA8Y29kZT4tMTwvY29kZT4KIAkgKiAgICBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMKIAkgKiAgICBtZXNzYWdlCiAJICogQHNlZSAjZ2V0TGVuZ3RoKCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBzdGFydFBvc2l0aW9uOworCQlyZXR1cm4gdGhpcy5zdGFydFBvc2l0aW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBpbmRpY2F0aW5nCiAJICogd2hlcmUgdGhlIHNvdXJjZSBmcmFnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVzc2FnZSBlbmRzLgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIGxlbmd0aCwgb3IgPGNvZGU+MDwvY29kZT4KIAkgKiAgICBpZiBubyBzb3VyY2UgbGVuZ3RoIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG1lc3NhZ2UKIAkgKiBAc2VlICNnZXRTdGFydFBvc2l0aW9uKCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKKwkJcmV0dXJuIHRoaXMubGVuZ3RoOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RCaW5kaW5nLmphdmEKaW5kZXggYmEyMTNiMi4uNTM0OTg0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTggKzExLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9va3VwRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RWZXJpZmllcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJhd1R5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKQEAgLTMwLDcgKzIyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5NZW1iZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiAvKioKQEAgLTUzLDcgKzQ0LDcgQEAKIAlwcml2YXRlIElUeXBlQmluZGluZ1tdIHR5cGVQYXJhbWV0ZXJzOwogCXByaXZhdGUgSVR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50czsKIAlwcml2YXRlIElBbm5vdGF0aW9uQmluZGluZ1tdIGFubm90YXRpb25zOwotCXByaXZhdGUgSUFubm90YXRpb25CaW5kaW5nW10gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CisJcHJpdmF0ZSBJQW5ub3RhdGlvbkJpbmRpbmdbXVtdIHBhcmFtZXRlckFubm90YXRpb25zOwogCiAJTWV0aG9kQmluZGluZyhCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBiaW5kaW5nKSB7CiAJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKQEAgLTk0LDM0ICs4NSw0MiBAQAogCSAqIEBzZWUgSUJpbmRpbmcjZ2V0TmFtZSgpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewogCQkJaWYgKHRoaXMuYmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQluYW1lID0gdGhpcy5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKTsKKwkJCQl0aGlzLm5hbWUgPSBnZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbmFtZSA9IG5ldyBTdHJpbmcodGhpcy5iaW5kaW5nLnNlbGVjdG9yKTsKKwkJCQl0aGlzLm5hbWUgPSBuZXcgU3RyaW5nKHRoaXMuYmluZGluZy5zZWxlY3Rvcik7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIG5hbWU7CisJCXJldHVybiB0aGlzLm5hbWU7CiAJfQogCiAJcHVibGljIElBbm5vdGF0aW9uQmluZGluZ1tdIGdldEFubm90YXRpb25zKCkgewogCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uczsKIAkJfQotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nW10gYW5ub3RzID0gdGhpcy5iaW5kaW5nLmdldEFubm90YXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBhbm5vdHMgPT0gbnVsbCA/IDAgOiBhbm5vdHMubGVuZ3RoOwotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gQW5ub3RhdGlvbkJpbmRpbmcuTm9Bbm5vdGF0aW9uczsKLQkJfQotCQlJQW5ub3RhdGlvbkJpbmRpbmdbXSBkb21JbnN0YW5jZXMgPSBuZXcgQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb25JbnN0YW5jZSA9IHRoaXMucmVzb2x2ZXIuZ2V0QW5ub3RhdGlvbkluc3RhbmNlKGFubm90c1tpXSk7Ci0JCQlpZiAoYW5ub3RhdGlvbkluc3RhbmNlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucyA9IEFubm90YXRpb25CaW5kaW5nLk5vQW5ub3RhdGlvbnM7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQW5ub3RhdGlvbkJpbmRpbmdbXSBpbnRlcm5hbEFubm90YXRpb25zID0gdGhpcy5iaW5kaW5nLmdldEFubm90YXRpb25zKCk7CisJCWludCBsZW5ndGggPSBpbnRlcm5hbEFubm90YXRpb25zID09IG51bGwgPyAwIDogaW50ZXJuYWxBbm5vdGF0aW9ucy5sZW5ndGg7CisJCWlmIChsZW5ndGggIT0gMCkgeworCQkJSUFubm90YXRpb25CaW5kaW5nW10gdGVtcEFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uQmluZGluZ1tsZW5ndGhdOworCQkJaW50IGNvbnZlcnRlZEFubm90YXRpb25Db3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZyBpbnRlcm5hbEFubm90YXRpb24gPSBpbnRlcm5hbEFubm90YXRpb25zW2ldOworCQkJCWZpbmFsIElBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uSW5zdGFuY2UgPSB0aGlzLnJlc29sdmVyLmdldEFubm90YXRpb25JbnN0YW5jZShpbnRlcm5hbEFubm90YXRpb24pOworCQkJCWlmIChhbm5vdGF0aW9uSW5zdGFuY2UgPT0gbnVsbCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJdGVtcEFubm90YXRpb25zW2NvbnZlcnRlZEFubm90YXRpb25Db3VudCsrXSA9IGFubm90YXRpb25JbnN0YW5jZTsKIAkJCX0KLQkJCWRvbUluc3RhbmNlc1tpXSA9IGFubm90YXRpb25JbnN0YW5jZTsKKwkJCWlmIChjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQgIT0gbGVuZ3RoKSB7CisJCQkJaWYgKGNvbnZlcnRlZEFubm90YXRpb25Db3VudCA9PSAwKSB7CisJCQkJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gQW5ub3RhdGlvbkJpbmRpbmcuTm9Bbm5vdGF0aW9uczsKKwkJCQl9CisJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wQW5ub3RhdGlvbnMsIDAsICh0ZW1wQW5ub3RhdGlvbnMgPSBuZXcgSUFubm90YXRpb25CaW5kaW5nW2NvbnZlcnRlZEFubm90YXRpb25Db3VudF0pLCAwLCBjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQpOworCQkJfQorCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMgPSB0ZW1wQW5ub3RhdGlvbnM7CiAJCX0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMgPSBkb21JbnN0YW5jZXM7CisJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gQW5ub3RhdGlvbkJpbmRpbmcuTm9Bbm5vdGF0aW9uczsKIAl9CiAKIAkvKioKQEAgLTEzMSwyNyArMTMwLDM3IEBACiAJCWlmICh0aGlzLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsKIAkJCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CiAJCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOworCQlyZXR1cm4gdGhpcy5kZWNsYXJpbmdDbGFzczsKIAl9CiAKIAlwdWJsaWMgSUFubm90YXRpb25CaW5kaW5nW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaW50IGluZGV4KSB7CisJCWlmIChnZXRQYXJhbWV0ZXJUeXBlcygpID09IE5PX1RZUEVfQklORElOR1MpIHsKKwkJCXJldHVybiBBbm5vdGF0aW9uQmluZGluZy5Ob0Fubm90YXRpb25zOworCQl9CiAJCWlmICh0aGlzLnBhcmFtZXRlckFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLnBhcmFtZXRlckFubm90YXRpb25zOworCQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyQW5ub3RhdGlvbnNbaW5kZXhdOwogCQl9Ci0JCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdHMgPSB0aGlzLmJpbmRpbmcuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaW5kZXgpOwotCQlpbnQgbGVuZ3RoID0gYW5ub3RzID09IG51bGwgPyAwIDogYW5ub3RzLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25CaW5kaW5nLk5vQW5ub3RhdGlvbnM7Ci0JCX0KLQkJSUFubm90YXRpb25CaW5kaW5nW10gZG9tSW5zdGFuY2VzID1uZXcgQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZ1tdW10gYmluZGluZ0Fubm90YXRpb25zID0gdGhpcy5iaW5kaW5nLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CisJCWlmIChiaW5kaW5nQW5ub3RhdGlvbnMgPT0gbnVsbCkgcmV0dXJuIEFubm90YXRpb25CaW5kaW5nLk5vQW5ub3RhdGlvbnM7CisKKwkJaW50IGxlbmd0aCA9IGJpbmRpbmdBbm5vdGF0aW9ucy5sZW5ndGg7CisJCUlBbm5vdGF0aW9uQmluZGluZ1tdW10gZG9tQW5ub3RhdGlvbnMgPSBuZXcgSUFubm90YXRpb25CaW5kaW5nW2xlbmd0aF1bXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJZmluYWwgSUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb25JbnN0YW5jZSA9IHRoaXMucmVzb2x2ZXIuZ2V0QW5ub3RhdGlvbkluc3RhbmNlKGFubm90c1tpXSk7Ci0JCQlpZiAoYW5ub3RhdGlvbkluc3RhbmNlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25CaW5kaW5nLk5vQW5ub3RhdGlvbnM7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nW10gcGFyYW1CaW5kaW5nQW5ub3RhdGlvbnMgPSBiaW5kaW5nQW5ub3RhdGlvbnNbaV07CisJCQlpbnQgcExlbmd0aCA9IHBhcmFtQmluZGluZ0Fubm90YXRpb25zLmxlbmd0aDsKKwkJCWRvbUFubm90YXRpb25zW2ldID0gbmV3IEFubm90YXRpb25CaW5kaW5nW3BMZW5ndGhdOworCQkJZm9yIChpbnQgaj0wOyBqPHBMZW5ndGg7IGorKykgeworCQkJCUlBbm5vdGF0aW9uQmluZGluZyBkb21Bbm5vdGF0aW9uID0gdGhpcy5yZXNvbHZlci5nZXRBbm5vdGF0aW9uSW5zdGFuY2UocGFyYW1CaW5kaW5nQW5ub3RhdGlvbnNbal0pOworCQkJCWlmIChkb21Bbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCQkJZG9tQW5ub3RhdGlvbnNbaV0gPSBBbm5vdGF0aW9uQmluZGluZy5Ob0Fubm90YXRpb25zOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZG9tQW5ub3RhdGlvbnNbaV1bal0gPSBkb21Bbm5vdGF0aW9uOwogCQkJfQotCQkJZG9tSW5zdGFuY2VzW2ldID0gYW5ub3RhdGlvbkluc3RhbmNlOwogCQl9Ci0JCXJldHVybiB0aGlzLnBhcmFtZXRlckFubm90YXRpb25zID0gZG9tSW5zdGFuY2VzOworCQl0aGlzLnBhcmFtZXRlckFubm90YXRpb25zID0gZG9tQW5ub3RhdGlvbnM7CisKKwkJcmV0dXJuIHRoaXMucGFyYW1ldGVyQW5ub3RhdGlvbnNbaW5kZXhdOwogCX0KIAogCS8qKgpAQCAtMTU5LDcgKzE2OCw3IEBACiAJICovCiAJcHVibGljIElUeXBlQmluZGluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkgewogCQlpZiAodGhpcy5wYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7CisJCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlczsKIAkJfQogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IHRoaXMuYmluZGluZy5wYXJhbWV0ZXJzOwogCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycyA9PSBudWxsID8gMCA6IHBhcmFtZXRlcnMubGVuZ3RoOwpAQCAtMTc4LDcgKzE4Nyw3IEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gbG9nIGVycm9yCiAJCQkJCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVwb3J0IG1ldGhvZCBiaW5kaW5nIHdoZXJlIGEgcGFyYW1ldGVyIGlzIG51bGw6XG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJbWVzc2FnZS5hcHBlbmQodGhpcy50b1N0cmluZygpKTsKKwkJCQkJbWVzc2FnZS5hcHBlbmQodG9TdHJpbmcoKSk7CiAJCQkJCVV0aWwubG9nKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSwgbWVzc2FnZS50b1N0cmluZygpKTsKIAkJCQkJLy8gcmVwb3J0IG5vIGJpbmRpbmcgc2luY2Ugb25lIG9yIG1vcmUgcGFyYW1ldGVyIGhhcyBubyBiaW5kaW5nCiAJCQkJCXJldHVybiB0aGlzLnBhcmFtZXRlclR5cGVzID0gTk9fVFlQRV9CSU5ESU5HUzsKQEAgLTIwOSw3ICsyMTgsNyBAQAogCSAqLwogCXB1YmxpYyBJVHlwZUJpbmRpbmdbXSBnZXRFeGNlcHRpb25UeXBlcygpIHsKIAkJaWYgKHRoaXMuZXhjZXB0aW9uVHlwZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGV4Y2VwdGlvblR5cGVzOworCQkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uVHlwZXM7CiAJCX0KIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZ1tdIGV4Y2VwdGlvbnMgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9uczsKIAkJaW50IGxlbmd0aCA9IGV4Y2VwdGlvbnMgPT0gbnVsbCA/IDAgOiBleGNlcHRpb25zLmxlbmd0aDsKQEAgLTIzNSw2OCArMjQ0LDE3IEBACiAJfQogCiAJcHJpdmF0ZSBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoKSB7Ci0JCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSAoSVR5cGUpIGdldERlY2xhcmluZ0NsYXNzKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWlmICghKHRoaXMucmVzb2x2ZXIgaW5zdGFuY2VvZiBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSkgcmV0dXJuIG51bGw7Ci0JCUFTVE5vZGUgbm9kZSA9IChBU1ROb2RlKSAoKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMucmVzb2x2ZXIpLmJpbmRpbmdzVG9Bc3ROb2Rlcy5nZXQodGhpcyk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgZGVjbGFyaW5nVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DTEFTU19GSUxFKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJQXJyYXlMaXN0IHBhcmFtZXRlclNpZ25hdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVHlwZSB0eXBlID0gcGFyYW1ldGVyLmdldFR5cGUoKTsKLQkJCQkJU3RyaW5nIHR5cGVTaWcgPSBVdGlsLmdldFNpZ25hdHVyZSh0eXBlKTsKLQkJCQkJaW50IGFycmF5RGltID0gcGFyYW1ldGVyLmdldEV4dHJhRGltZW5zaW9ucygpOwotCQkJCQlpZiAocGFyYW1ldGVyLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzMgJiYgcGFyYW1ldGVyLmlzVmFyYXJncygpKSB7Ci0JCQkJCQlhcnJheURpbSsrOwotCQkJCQl9Ci0JCQkJCWlmIChhcnJheURpbSA+IDApIHsKLQkJCQkJCXR5cGVTaWcgPSBTaWduYXR1cmUuY3JlYXRlQXJyYXlTaWduYXR1cmUodHlwZVNpZywgYXJyYXlEaW0pOwotCQkJCQl9Ci0JCQkJCXBhcmFtZXRlclNpZ25hdHVyZXMuYWRkKHR5cGVTaWcpOwotCQkJCX0KLQkJCQlpbnQgcGFyYW1ldGVyQ291bnQgPSBwYXJhbWV0ZXJTaWduYXR1cmVzLnNpemUoKTsKLQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJDb3VudF07Ci0JCQkJcGFyYW1ldGVyU2lnbmF0dXJlcy50b0FycmF5KHBhcmFtZXRlcnMpOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGRlY2xhcmluZ1R5cGUuZ2V0TWV0aG9kKGdldE5hbWUoKSwgcGFyYW1ldGVycyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGFubm90YXRpb24gdHlwZSBtZW1iZXIgZGVjbGFyYXRpb24KLQkJCQlBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIHR5cGVNZW1iZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKSBub2RlOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGRlY2xhcmluZ1R5cGUuZ2V0TWV0aG9kKHR5cGVNZW1iZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1MpOyAvLyBhbm5vdGF0aW9uIHR5cGUgbWVtYmVycyBkb24ndCBoYXZlIHBhcmFtZXRlcnMKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGNhc2Ugb2YgbWV0aG9kIG5vdCBpbiB0aGUgY3JlYXRlZCBBU1QsIG9yIGEgYmluYXJ5IG1ldGhvZAotCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7Ci0JCQlTdHJpbmcgc2VsZWN0b3IgPSBvcmlnaW5hbC5pc0NvbnN0cnVjdG9yKCkgPyBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCkgOiBuZXcgU3RyaW5nKG9yaWdpbmFsLnNlbGVjdG9yKTsKLQkJCWJvb2xlYW4gaXNCaW5hcnkgPSBkZWNsYXJpbmdUeXBlLmlzQmluYXJ5KCk7Ci0JCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBvcmlnaW5hbC5kZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCk7Ci0JCQlib29sZWFuIGlzSW5uZXJCaW5hcnlUeXBlQ29uc3RydWN0b3IgPSBpc0JpbmFyeSAmJiBvcmlnaW5hbC5pc0NvbnN0cnVjdG9yKCkgJiYgZW5jbG9zaW5nVHlwZSAhPSBudWxsOwotCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gb3JpZ2luYWwucGFyYW1ldGVyczsKLQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzID09IG51bGwgPyAwIDogcGFyYW1ldGVycy5sZW5ndGg7Ci0JCQlpbnQgZGVjbGFyaW5nSW5kZXggPSBpc0lubmVyQmluYXJ5VHlwZUNvbnN0cnVjdG9yID8gMSA6IDA7Ci0JCQlTdHJpbmdbXSBwYXJhbWV0ZXJTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tkZWNsYXJpbmdJbmRleCArIGxlbmd0aF07Ci0JCQlpZiAoaXNJbm5lckJpbmFyeVR5cGVDb25zdHJ1Y3RvcikKLQkJCQlwYXJhbWV0ZXJTaWduYXR1cmVzWzBdID0gbmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCkpLnJlcGxhY2UoJy8nLCAnLicpOwotCQkJZm9yIChpbnQgaSA9IDA7ICBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJTaWduYXR1cmVzW2RlY2xhcmluZ0luZGV4ICsgaV0gPSBuZXcgU3RyaW5nKHBhcmFtZXRlcnNbaV0uZ2VuZXJpY1R5cGVTaWduYXR1cmUoKSkucmVwbGFjZSgnLycsICcuJyk7Ci0JCQl9Ci0JCQlJTWV0aG9kIHJlc3VsdCA9IGRlY2xhcmluZ1R5cGUuZ2V0TWV0aG9kKHNlbGVjdG9yLCBwYXJhbWV0ZXJTaWduYXR1cmVzKTsKLQkJCWlmIChpc0JpbmFyeSkKLQkJCQlyZXR1cm4gKEphdmFFbGVtZW50KSByZXN1bHQ7Ci0JCQlJTWV0aG9kW10gbWV0aG9kcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1ldGhvZHMgPSBkZWNsYXJpbmdUeXBlLmdldE1ldGhvZHMoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZGVjbGFyaW5nIHR5cGUgZG9lc24ndCBleGlzdAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSU1ldGhvZFtdIGNhbmRpZGF0ZXMgPSBNZW1iZXIuZmluZE1ldGhvZHMocmVzdWx0LCBtZXRob2RzKTsKLQkJCWlmIChjYW5kaWRhdGVzID09IG51bGwgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGNhbmRpZGF0ZXNbMF07CisJCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKIAkJfQorCQlpZiAoISh0aGlzLnJlc29sdmVyIGluc3RhbmNlb2YgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcikpIHJldHVybiBudWxsOworCisJCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIgZGVmYXVsdEJpbmRpbmdSZXNvbHZlciA9IChEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSB0aGlzLnJlc29sdmVyOworCQlpZiAoIWRlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuZnJvbUphdmFQcm9qZWN0KSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIFV0aWwuZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KAorCQkJCXRoaXMuYmluZGluZywKKwkJCQlkZWZhdWx0QmluZGluZ1Jlc29sdmVyLndvcmtpbmdDb3B5T3duZXIsCisJCQkJZGVmYXVsdEJpbmRpbmdSZXNvbHZlci5nZXRCaW5kaW5nc1RvTm9kZXNNYXAoKSk7CiAJfQogCiAJLyoqCkBAIC00NTMsMTAgKzQxMSw5IEBACiAKIAlwdWJsaWMgYm9vbGVhbiBpc1N1YnNpZ25hdHVyZShJTWV0aG9kQmluZGluZyBvdGhlck1ldGhvZCkgewogCQl0cnkgewotCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG90aGVyID0gKChNZXRob2RCaW5kaW5nKSBvdGhlck1ldGhvZCkuYmluZGluZzsKLQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5iaW5kaW5nLnNlbGVjdG9yLCBvdGhlci5zZWxlY3RvcikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuYmluZGluZy5hcmVQYXJhbWV0ZXJFcmFzdXJlc0VxdWFsKG90aGVyKSAmJiB0aGlzLmJpbmRpbmcuYXJlVHlwZVZhcmlhYmxlRXJhc3VyZXNFcXVhbChvdGhlcik7CisJCQlMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudCA9IHRoaXMucmVzb2x2ZXIubG9va3VwRW52aXJvbm1lbnQoKTsKKwkJCXJldHVybiBsb29rdXBFbnZpcm9ubWVudCAhPSBudWxsCisJCQkJJiYgbG9va3VwRW52aXJvbm1lbnQubWV0aG9kVmVyaWZpZXIoKS5pc01ldGhvZFN1YnNpZ25hdHVyZSh0aGlzLmJpbmRpbmcsICgoTWV0aG9kQmluZGluZykgb3RoZXJNZXRob2QpLmJpbmRpbmcpOwogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAkJCS8vIGRvbid0IHN1cmZhY2UgaW50ZXJuYWwgZXhjZXB0aW9uIHRvIGNsaWVudHMKIAkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMDEzCkBAIC00NzQsMzcgKzQzMSwxMCBAQAogCS8qKgogCSAqIEBzZWUgSU1ldGhvZEJpbmRpbmcjb3ZlcnJpZGVzKElNZXRob2RCaW5kaW5nKQogCSAqLwotCXB1YmxpYyBib29sZWFuIG92ZXJyaWRlcyhJTWV0aG9kQmluZGluZyBvdmVycmlkZW5NZXRob2QpIHsKLQkJdHJ5IHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBvdmVycmlkZW5Db21waWxlckJpbmRpbmcgPSAoKE1ldGhvZEJpbmRpbmcpIG92ZXJyaWRlbk1ldGhvZCkuYmluZGluZzsKLQkJCWlmICh0aGlzLmJpbmRpbmcgPT0gb3ZlcnJpZGVuQ29tcGlsZXJCaW5kaW5nCi0JCQkJCXx8IG92ZXJyaWRlbkNvbXBpbGVyQmluZGluZy5pc1N0YXRpYygpCi0JCQkJCXx8IG92ZXJyaWRlbkNvbXBpbGVyQmluZGluZy5pc1ByaXZhdGUoKQotCQkJCQl8fCB0aGlzLmJpbmRpbmcuaXNTdGF0aWMoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljaGFyW10gc2VsZWN0b3IgPSB0aGlzLmJpbmRpbmcuc2VsZWN0b3I7Ci0JCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBvdmVycmlkZW5Db21waWxlckJpbmRpbmcuc2VsZWN0b3IpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVR5cGVCaW5kaW5nIG1hdGNoID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmZpbmRTdXBlclR5cGVXaXRoU2FtZUVyYXN1cmUob3ZlcnJpZGVuQ29tcGlsZXJCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKLQkJCWlmICghKG1hdGNoIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBmYWxzZTsKLQotCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nW10gc3VwZXJNZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKW1hdGNoKS5nZXRNZXRob2RzKHNlbGVjdG9yKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlck1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3VwZXJNZXRob2RzW2ldLm9yaWdpbmFsKCkgPT0gb3ZlcnJpZGVuQ29tcGlsZXJCaW5kaW5nKSB7Ci0JCQkJCUxvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50ID0gdGhpcy5yZXNvbHZlci5sb29rdXBFbnZpcm9ubWVudCgpOwotCQkJCQlpZiAobG9va3VwRW52aXJvbm1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJCQlNZXRob2RWZXJpZmllciBtZXRob2RWZXJpZmllciA9IGxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCk7Ci0JCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBzdXBlck1ldGhvZCA9IHN1cGVyTWV0aG9kc1tpXTsKLQkJCQkJcmV0dXJuICEoc3VwZXJNZXRob2QuaXNEZWZhdWx0KCkgJiYgKHN1cGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKSkgIT0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKSkKLQkJCQkJCSYmIG1ldGhvZFZlcmlmaWVyLmRvZXNNZXRob2RPdmVycmlkZSh0aGlzLmJpbmRpbmcsIHN1cGVyTWV0aG9kKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewotCQkJLy8gZG9uJ3Qgc3VyZmFjZSBpbnRlcm5hbCBleGNlcHRpb24gdG8gY2xpZW50cwotCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMwMTMKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorCXB1YmxpYyBib29sZWFuIG92ZXJyaWRlcyhJTWV0aG9kQmluZGluZyBvdGhlck1ldGhvZCkgeworCQkJTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQgPSB0aGlzLnJlc29sdmVyLmxvb2t1cEVudmlyb25tZW50KCk7CisJCQlyZXR1cm4gbG9va3VwRW52aXJvbm1lbnQgIT0gbnVsbAorCQkJCSYmIGxvb2t1cEVudmlyb25tZW50Lm1ldGhvZFZlcmlmaWVyKCkuZG9lc01ldGhvZE92ZXJyaWRlKHRoaXMuYmluZGluZywgKChNZXRob2RCaW5kaW5nKSBvdGhlck1ldGhvZCkuYmluZGluZyk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEKaW5kZXggMDEzZDllOS4uNzE3MDcyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2REZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywxMSArMTcsMTIgQEAKIC8qKgogICogTWV0aG9kIGRlY2xhcmF0aW9uIEFTVCBub2RlIHR5cGUuIEEgbWV0aG9kIGRlY2xhcmF0aW9uCiAgKiBpcyB0aGUgdW5pb24gb2YgYSBtZXRob2QgZGVjbGFyYXRpb24gYW5kIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uCisgKiAKICAqIEZvciBKTFMyOgogICogPHByZT4KICAqIE1ldGhvZERlY2xhcmF0aW9uOgogICogICAgWyBKYXZhZG9jIF0geyBNb2RpZmllciB9ICggVHlwZSB8IDxiPnZvaWQ8L2I+ICkgSWRlbnRpZmllciA8Yj4oPC9iPgotICogICAgICAgIFsgRm9ybWFsUGFyYW1ldGVyIAorICogICAgICAgIFsgRm9ybWFsUGFyYW1ldGVyCiAgKiAJCSAgICAgeyA8Yj4sPC9iPiBGb3JtYWxQYXJhbWV0ZXIgfSBdIDxiPik8L2I+IHs8Yj5bPC9iPiA8Yj5dPC9iPiB9CiAgKiAgICAgICAgWyA8Yj50aHJvd3M8L2I+IFR5cGVOYW1lIHsgPGI+LDwvYj4gVHlwZU5hbWUgfSBdICggQmxvY2sgfCA8Yj47PC9iPiApCiAgKiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOgpAQCAtMzcsNyArMzgsNyBAQAogICogICAgWyBKYXZhZG9jIF0geyBFeHRlbmRlZE1vZGlmaWVyIH0KICAqCQkgIFsgPGI+Jmx0OzwvYj4gVHlwZVBhcmFtZXRlciB7IDxiPiw8L2I+IFR5cGVQYXJhbWV0ZXIgfSA8Yj4mZ3Q7PC9iPiBdCiAgKiAgICAgICAgKCBUeXBlIHwgPGI+dm9pZDwvYj4gKSBJZGVudGlmaWVyIDxiPig8L2I+Ci0gKiAgICAgICAgWyBGb3JtYWxQYXJhbWV0ZXIgCisgKiAgICAgICAgWyBGb3JtYWxQYXJhbWV0ZXIKICAqIAkJICAgICB7IDxiPiw8L2I+IEZvcm1hbFBhcmFtZXRlciB9IF0gPGI+KTwvYj4gezxiPls8L2I+IDxiPl08L2I+IH0KICAqICAgICAgICBbIDxiPnRocm93czwvYj4gVHlwZU5hbWUgeyA8Yj4sPC9iPiBUeXBlTmFtZSB9IF0gKCBCbG9jayB8IDxiPjs8L2I+ICkKICAqIENvbnN0cnVjdG9yRGVjbGFyYXRpb246CkBAIC01MywxMTcgKzU0LDExOSBAQAogICogcmFuZ2UgYmVnaW5zIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgIi8qKiIgY29tbWVudCBkZWxpbWl0ZXIuCiAgKiBXaGVuIHRoZXJlIGlzIG5vIEphdmFkb2MgY29tbWVudCwgdGhlIHNvdXJjZSByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKICAqIGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgbW9kaWZpZXIga2V5d29yZCAoaWYgbW9kaWZpZXJzKSwgb3IgdGhlCi0gKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlICImbHQ7IiB0b2tlbiAobWV0aG9kLCBubyBtb2RpZmllcnMsIHR5cGUgcGFyYW1ldGVycyksIAorICogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSAiJmx0OyIgdG9rZW4gKG1ldGhvZCwgbm8gbW9kaWZpZXJzLCB0eXBlIHBhcmFtZXRlcnMpLAogICogb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcmV0dXJuIHR5cGUgKG1ldGhvZCwgbm8gbW9kaWZpZXJzLCBubyB0eXBlCi0gKiBwYXJhbWV0ZXJzKSwgb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaWRlbnRpZmllciAoY29uc3RydWN0b3IsIAorICogcGFyYW1ldGVycyksIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGlkZW50aWZpZXIgKGNvbnN0cnVjdG9yLAogICogbm8gbW9kaWZpZXJzKS4gVGhlIHNvdXJjZSByYW5nZSBleHRlbmRzIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZQogICogIjsiIHRva2VuIChpZiBubyBib2R5KSwgb3IgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBibG9jayAoaWYgYm9keSkuCiAgKiA8L3A+CisgKiA8cD5UaGUgRm9ybWFsUGFyYW1ldGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259LjwvcD4KICAqCi0gKiBAc2luY2UgMi4wIAorICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgSmF2YWRvY30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPQogCQlpbnRlcm5hbEphdmFkb2NQcm9wZXJ0eUZhY3RvcnkoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOwogCiAJLyoqCi0JICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKEpMUzIgQVBJIG9ubHkpLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pIChKTFMyIEFQSSBvbmx5KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0KIAkJaW50ZXJuYWxNb2RpZmllcnNQcm9wZXJ0eUZhY3RvcnkoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOwotCQorCiAJLyoqCi0JICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGFkZGVkIGluIEpMUzMgQVBJKS4KKwkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9CiAJCWludGVybmFsTW9kaWZpZXJzMlByb3BlcnR5RmFjdG9yeShNZXRob2REZWNsYXJhdGlvbi5jbGFzcyk7Ci0JCisKIAkvKioKLQkgKiBUaGUgImNvbnN0cnVjdG9yIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiY29uc3RydWN0b3IiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBCb29sZWFufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIENPTlNUUlVDVE9SX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgQ09OU1RSVUNUT1JfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzLCAiY29uc3RydWN0b3IiLCBib29sZWFuLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsICJuYW1lIiwgU2ltcGxlTmFtZS5jbGFzcywgTUFOREFUT1JZLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJyZXR1cm5UeXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgInJldHVyblR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBUeXBlfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFJFVFVSTl9UWVBFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBSRVRVUk5fVFlQRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgInJldHVyblR5cGUiLCBUeXBlLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInJldHVyblR5cGUyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJyZXR1cm5UeXBlMiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFR5cGV9KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFJFVFVSTl9UWVBFMl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUkVUVVJOX1RZUEUyX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzLCAicmV0dXJuVHlwZTIiLCBUeXBlLmNsYXNzLCBPUFRJT05BTCwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZXh0cmFEaW1lbnNpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXh0cmFEaW1lbnNpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBFWFRSQV9ESU1FTlNJT05TX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsICJleHRyYURpbWVuc2lvbnMiLCBpbnQuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAidHlwZVBhcmFtZXRlcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGFkZGVkIGluIEpMUzMgQVBJKS4KKwkgKiBUaGUgInR5cGVQYXJhbWV0ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlUGFyYW1ldGVyfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QQVJBTUVURVJTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QQVJBTUVURVJTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgInR5cGVQYXJhbWV0ZXJzIiwgVHlwZVBhcmFtZXRlci5jbGFzcywgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAicGFyYW1ldGVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSkuCisJICogVGhlICJwYXJhbWV0ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFBBUkFNRVRFUlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBQQVJBTUVURVJTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgInBhcmFtZXRlcnMiLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJ0aHJvd25FeGNlcHRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlKS4KKwkgKiBUaGUgInRocm93bkV4Y2VwdGlvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVEhST1dOX0VYQ0VQVElPTlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUSFJPV05fRVhDRVBUSU9OU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsICJ0aHJvd25FeGNlcHRpb25zIiwgTmFtZS5jbGFzcywgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBCbG9ja30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsICJib2R5IiwgQmxvY2suY2xhc3MsIE9QVElPTkFMLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMDsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMTApOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC0xNzcsNyArMTgwLDcgQEAKIAkJYWRkUHJvcGVydHkoVEhST1dOX0VYQ0VQVElPTlNfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEJPRFlfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKLQkJCisKIAkJcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgxMSk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoSkFWQURPQ19QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKQEAgLTE5Niw5ICsxOTksOSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZSBBU1QuSkxTKiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0yMDksMTMgKzIxMiwxMyBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCiAJICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgY29uc3RydWN0b3IsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYSBtZXRob2QuCiAJICogRGVmYXVsdHMgdG8gbWV0aG9kLgogCSAqLwogCXByaXZhdGUgYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCisKIAkvKioKIAkgKiBUaGUgbWV0aG9kIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgpAQCAtMjIzLDEzICsyMjYsMTMgQEAKIAlwcml2YXRlIFNpbXBsZU5hbWUgbWV0aG9kTmFtZSA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyAKLQkgKiAoZWxlbWVudCB0eXBlOiA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogVGhlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMKKwkgKiAoZWxlbWVudCB0eXBlOiB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHBhcmFtZXRlcnMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChQQVJBTUVURVJTX1BST1BFUlRZKTsKLQkKKwogCS8qKgogCSAqIFRoZSByZXR1cm4gdHlwZS4KIAkgKiBKTFMyIGJlaGV2aW9yOiBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIHZvaWQuCkBAIC0yMzcsMTUgKzI0MCwxNSBAQAogCSAqIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQgZm9yIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucy4KIAkgKi8KIAlwcml2YXRlIFR5cGUgcmV0dXJuVHlwZSA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBJbmRpY2F0ZWQgd2hldGhlciB0aGUgcmV0dXJuIHR5cGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgYm9vbGVhbiByZXR1cm5UeXBlMkluaXRpYWxpemVkID0gZmFsc2U7Ci0JCisKIAkvKioKLQkgKiBUaGUgdHlwZSBwYXJhbXRlcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZVBhcmFtZXRlcjwvY29kZT4pLiAKKwkgKiBUaGUgdHlwZSBwYXJhbXRlcnMgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGVQYXJhbWV0ZXJ9KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCkBAIC0yNTUsMTMgKzI1OCwxMyBAQAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2YgYXJyYXkgZGltZW5zaW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgcGFyYW1ldGVycywgcmF0aGVyCiAJICogdGhhbiBhZnRlciB0aGUgcmV0dXJuIHR5cGUgaXRzZWxmOyBkZWZhdWx0cyB0byAwLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDIuMQogCSAqLwogCXByaXZhdGUgaW50IGV4dHJhQXJyYXlEaW1lbnNpb25zID0gMDsKIAogCS8qKgotCSAqIFRoZSBsaXN0IG9mIHRocm93biBleGNlcHRpb24gbmFtZXMgKGVsZW1lbnQgdHlwZTogPGNvZGU+TmFtZTwvY29kZT4pLgorCSAqIFRoZSBsaXN0IG9mIHRocm93biBleGNlcHRpb24gbmFtZXMgKGVsZW1lbnQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB0aHJvd25FeGNlcHRpb25zID0KQEAgLTI3MiwyMCArMjc1LDIwIEBACiAJICogRGVmYXVsdHMgdG8gbm9uZS4KIAkgKi8KIAlwcml2YXRlIEJsb2NrIG9wdGlvbmFsQm9keSA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1ldGhvZCBkZWNsYXJhdGlvbiBvd25lZCAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1ldGhvZCBkZWNsYXJhdGlvbiBvd25lZAogCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBkZWNsYXJhdGlvbiBpcyBmb3IgYSBtZXRob2Qgb2YgYW4KLQkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7IG5vIHR5cGUgCi0JICogcGFyYW1ldGVyczsgdm9pZCByZXR1cm4gdHlwZTsgbm8gcGFyYW1ldGVyczsgbm8gYXJyYXkgZGltZW5zaW9ucyBhZnRlciAKKwkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7IG5vIHR5cGUKKwkgKiBwYXJhbWV0ZXJzOyB2b2lkIHJldHVybiB0eXBlOyBubyBwYXJhbWV0ZXJzOyBubyBhcnJheSBkaW1lbnNpb25zIGFmdGVyCiAJICogdGhlIHBhcmFtZXRlcnM7IG5vIHRocm93biBleGNlcHRpb25zOyBhbmQgbm8gYm9keSAoYXMgb3Bwb3NlZCB0byBhbgogCSAqIGVtcHR5IGJvZHkpLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0KSB7CkBAIC0zMDIsNyArMzA1LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zNDIsNyArMzQ1LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMzkwLDcgKzM5Myw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC00MTAsNyArNDEzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJvZHlEZWNsYXJhdGlvbi4KIAkgKi8KQEAgLTQ0NCw3ICs0NDcsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJTWV0aG9kRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEphdmFkb2MoCiAJCQkoSmF2YWRvYykgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEphdmFkb2MoKSkpOwogCQlpZiAodGhpcy5hc3QuYXBpTGV2ZWwgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKQEAgLTQ3OCw3ICs0ODEsNyBAQAogCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCiAJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTUwMiwyMyArNTA1LDIzIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIGNvbnN0cnVjdG9yIG9yIGEgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24sCiAJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbWV0aG9kIGRlY2xhcmF0aW9uCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CiAJCXJldHVybiB0aGlzLmlzQ29uc3RydWN0b3I7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB3aGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gZGVjbGFyZXMgYSBjb25zdHJ1Y3RvciBvciBhIG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBpc0NvbnN0cnVjdG9yIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGEgbWV0aG9kIGRlY2xhcmF0aW9uCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgewogCQlwcmVWYWx1ZUNoYW5nZShDT05TVFJVQ1RPUl9QUk9QRVJUWSk7CiAJCXRoaXMuaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3I7CkBAIC01MjgsMTMgKzUzMSwxMyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZAogCSAqIGRlY2xhcmF0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuIFRoaXMgbGlzdCBpcyBub24tZW1wdHkgZm9yIHBhcmFtZXRlcml6ZWQgbWV0aG9kcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlcnMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlUGFyYW1ldGVyPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZVBhcmFtZXRlcn0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgdHlwZVBhcmFtZXRlcnMoKSB7CiAJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4ganVzdCBjYWxsaW5nIHVuc3VwcG9ydGVkSW4yKCkgdG8gY2hlY2sKIAkJaWYgKHRoaXMudHlwZVBhcmFtZXRlcnMgPT0gbnVsbCkgewpAQCAtNTQyLDE0ICs1NDUsMTQgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy50eXBlUGFyYW1ldGVyczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgZGVjbGFyZWQgaW4gdGhpcyBtZXRob2QgZGVjbGFyYXRpb24uCi0JICogRm9yIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24sIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBuYW1lIAorCSAqIEZvciBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLCB0aGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZQogCSAqIG9mIHRoZSBjbGFzcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKHRoaXMubWV0aG9kTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtNTYzLDE5ICs1NjYsMTkgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5tZXRob2ROYW1lOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbiB0byB0aGUKLQkgKiBnaXZlbiBuYW1lLiBGb3IgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiwgdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgCisJICogZ2l2ZW4gbmFtZS4gRm9yIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24sIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzCiAJICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5ldyBtZXRob2QgbmFtZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIG1ldGhvZE5hbWUpIHsKIAkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNTg5LDI2ICs1OTIsMjYgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBtZXRob2QgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBmb3IgdGhpcwogCSAqIG1ldGhvZCBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtZXRob2QgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0pCisJICovCiAJcHVibGljIExpc3QgcGFyYW1ldGVycygpIHsKIAkJcmV0dXJuIHRoaXMucGFyYW1ldGVyczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gZGVjbGFyZXMgYQogCSAqIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCAoYWRkZWQgaW4gSkxTMyBBUEkpLiBUaGUgY29udmVuaWVuY2UgbWV0aG9kIGNoZWNrcwogCSAqIHdoZXRoZXIgdGhlIGxhc3QgcGFyYW1ldGVyIGlzIHNvIG1hcmtlZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCBkZWNsYXJhdGlvbiwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2VlIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24jaXNWYXJhcmdzKCkKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzVmFyYXJncygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy5tb2RpZmllcnMgPT0gbnVsbCkgewpAQCAtNjIxLDIxICs2MjQsMjEgQEAKIAkJCXJldHVybiB2LmlzVmFyYXJncygpOwogCQl9CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbiBuYW1lcyBpbiB0aGlzIG1ldGhvZCAKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiB0aHJvd24gZXhjZXB0aW9uIG5hbWVzIGluIHRoaXMgbWV0aG9kCiAJICogZGVjbGFyYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgZXhjZXB0aW9uIG5hbWVzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+TmFtZTwvY29kZT4pCi0JICovIAorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBOYW1lfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCB0aHJvd25FeGNlcHRpb25zKCkgewogCQlyZXR1cm4gdGhpcy50aHJvd25FeGNlcHRpb25zOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZGVjbGFyZWQgaW4gdGhpcyBtZXRob2QgCi0JICogZGVjbGFyYXRpb24sIGV4Y2x1c2l2ZSBvZiBhbnkgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyAoSkxTMiBBUEkgb25seSkuIAorCSAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZGVjbGFyZWQgaW4gdGhpcyBtZXRob2QKKwkgKiBkZWNsYXJhdGlvbiwgZXhjbHVzaXZlIG9mIGFueSBleHRyYSBhcnJheSBkaW1lbnNpb25zIChKTFMyIEFQSSBvbmx5KS4KIAkgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIGlzIG1lYW5pbmdmdWwuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoaXMgY2hpbGQgaXMgbm90IHJlbGV2YW50IGZvciBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMKQEAgLTY0MywxNyArNjQ2LDE3IEBACiAJICogYW5kIHZpc2l0cyksIGFuZCBpcyBkZXZvaWQgb2YgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24gb3JkaW5hcmlseQogCSAqIGF2YWlsYWJsZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSByZXR1cm4gdHlwZSwgcG9zc2libHkgdGhlIHZvaWQgcHJpbWl0aXZlIHR5cGUKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCiAJICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieSB7QGxpbmsgI2dldFJldHVyblR5cGUyKCl9LAogCSAqIHdoaWNoIG1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovIAorCSAqLwogCXB1YmxpYyBUeXBlIGdldFJldHVyblR5cGUoKSB7CiAJCXJldHVybiBpbnRlcm5hbEdldFJldHVyblR5cGUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtNjgyLDcgKzY4NSw3IEBACiAJICogTm90ZSB0aGF0IHRoaXMgY2hpbGQgaXMgbm90IHJlbGV2YW50IGZvciBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMKIAkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucyBhbmQgdmlzaXRzKS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IHJldHVybiB0eXBlLCBwb3NzaWJseSB0aGUgdm9pZCBwcmltaXRpdmUgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTY5MSwxMyArNjk0LDEzIEBACiAJICogPC91bD4KIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCi0JICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieSAKKwkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CiAJICoge0BsaW5rICNzZXRSZXR1cm5UeXBlMihUeXBlKX0sIHdoaWNoIGFjY2VwdHMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoVHlwZSB0eXBlKSB7CiAJCWludGVybmFsU2V0UmV0dXJuVHlwZSh0eXBlKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtNzE1LDIzICs3MTgsMjMgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIGRlY2xhcmVkIGluIHRoaXMgbWV0aG9kIAotCSAqIGRlY2xhcmF0aW9uLCBleGNsdXNpdmUgb2YgYW55IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgKGFkZGVkIGluIEpMUzMgQVBJKS4gCisJICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIG1ldGhvZAorCSAqIGRlY2xhcmF0aW9uLCBleGNsdXNpdmUgb2YgYW55IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIGlzIG1lYW5pbmdmdWwuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoaXMgY2hpbGQgaXMgbm90IHJlbGV2YW50IGZvciBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMKIAkgKiAoYWx0aG91Z2gsIGlmIHByZXNlbnQsIGl0IGRvZXMgc3RpbGwgZmlndXJlIGluIHN1YnRyZWUgZXF1YWxpdHkgY29tcGFyaXNvbnMKIAkgKiBhbmQgdmlzaXRzKSwgYW5kIGlzIGRldm9pZCBvZiB0aGUgYmluZGluZyBpbmZvcm1hdGlvbiBvcmRpbmFyaWx5Ci0JICogYXZhaWxhYmxlLiBJbiB0aGUgSkxTMiBBUEksIHRoZSByZXR1cm4gdHlwZSBpcyBtYW5kYXRvcnkuIAorCSAqIGF2YWlsYWJsZS4gSW4gdGhlIEpMUzIgQVBJLCB0aGUgcmV0dXJuIHR5cGUgaXMgbWFuZGF0b3J5LgogCSAqIEluIHRoZSBKTFMzIEFQSSwgdGhlIHJldHVybiB0eXBlIGlzIG9wdGlvbmFsLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJldHVybiB0eXBlLCBwb3NzaWJseSB0aGUgdm9pZCBwcmltaXRpdmUgdHlwZSwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0UmV0dXJuVHlwZTIoKSB7CiAJICAgIHVuc3VwcG9ydGVkSW4yKCk7CiAJCWlmICh0aGlzLnJldHVyblR5cGUgPT0gbnVsbCAmJiAhdGhpcy5yZXR1cm5UeXBlMkluaXRpYWxpemVkKSB7CkBAIC03NTUsMTAgKzc1OCwxMCBAQAogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zCiAJICogKGFsdGhvdWdoIGl0IGRvZXMgc3RpbGwgZmlndXJlIGluIHN1YnRyZWUgZXF1YWxpdHkgY29tcGFyaXNvbnMgYW5kIHZpc2l0cykuCi0JICogSW4gdGhlIEpMUzIgQVBJLCB0aGUgcmV0dXJuIHR5cGUgaXMgbWFuZGF0b3J5LiAKKwkgKiBJbiB0aGUgSkxTMiBBUEksIHRoZSByZXR1cm4gdHlwZSBpcyBtYW5kYXRvcnkuCiAJICogSW4gdGhlIEpMUzMgQVBJLCB0aGUgcmV0dXJuIHR5cGUgaXMgb3B0aW9uYWwuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGUgdGhlIG5ldyByZXR1cm4gdHlwZSwgcG9zc2libHkgdGhlIHZvaWQgcHJpbWl0aXZlIHR5cGUsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgpAQCAtNzY5LDcgKzc3Miw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZTIoVHlwZSB0eXBlKSB7CiAJICAgIHVuc3VwcG9ydGVkSW4yKCk7CiAJCXRoaXMucmV0dXJuVHlwZTJJbml0aWFsaXplZCA9IHRydWU7CkBAIC03ODAsNDEgKzc4Myw0MSBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zIG92ZXIgYW5kIGFib3ZlIHRoZSAKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUKIAkgKiBleHBsaWNpdGx5LXNwZWNpZmllZCByZXR1cm4gdHlwZS4KIAkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgPGNvZGU+aW50IGZvbygpW11bXTwvY29kZT4gaGFzIGEgcmV0dXJuIHR5cGUgb2YgCi0JICogPGNvZGU+aW50PC9jb2RlPiBhbmQgdHdvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IAorCSAqIEZvciBleGFtcGxlLCA8Y29kZT5pbnQgZm9vKClbXVtdPC9jb2RlPiBoYXMgYSByZXR1cm4gdHlwZSBvZgorCSAqIDxjb2RlPmludDwvY29kZT4gYW5kIHR3byBleHRyYSBhcnJheSBkaW1lbnNpb25zOwogCSAqIDxjb2RlPmludFtdW10gZm9vKCk8L2NvZGU+IGhhcyBhIHJldHVybiB0eXBlIG9mIDxjb2RlPmludFtdW108L2NvZGU+CiAJICogYW5kIHplcm8gZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4gVGhlIHR3byBjb25zdHJ1Y3RzIGhhdmUgZGlmZmVyZW50CiAJICogQVNUcywgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIHJlYWxseSBzeW50YWN0aWMgdmFyaWFudHMgb2YgdGhlIHNhbWUKIAkgKiBtZXRob2QgZGVjbGFyYXRpb24uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMKIAkgKiBAc2luY2UgMi4xCi0JICovIAorCSAqLwogCXB1YmxpYyBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCkgewogCQlyZXR1cm4gdGhpcy5leHRyYUFycmF5RGltZW5zaW9uczsKIAl9CiAKIAkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUgCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgb3ZlciBhbmQgYWJvdmUgdGhlCiAJICogZXhwbGljaXRseS1zcGVjaWZpZWQgcmV0dXJuIHR5cGUuCiAJICogPHA+CiAJICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCBmb28oKVtdW108L2NvZGU+IGlzIHJlbmRlcmVkIGFzIGEgcmV0dXJuCi0JICogdHlwZSBvZiA8Y29kZT5pbnQ8L2NvZGU+IHdpdGggdHdvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IAotCSAqIDxjb2RlPmludFtdW10gZm9vKCk8L2NvZGU+IGlzIHJlbmRlcmVkIGFzIGEgcmV0dXJuIHR5cGUgb2YgCisJICogdHlwZSBvZiA8Y29kZT5pbnQ8L2NvZGU+IHdpdGggdHdvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7CisJICogPGNvZGU+aW50W11bXSBmb28oKTwvY29kZT4gaXMgcmVuZGVyZWQgYXMgYSByZXR1cm4gdHlwZSBvZgogCSAqIDxjb2RlPmludFtdW108L2NvZGU+IHdpdGggemVybyBleHRyYSBhcnJheSBkaW1lbnNpb25zLiBUaGUgdHdvCiAJICogY29uc3RydWN0cyBoYXZlIGRpZmZlcmVudCBBU1RzLCBldmVuIHRob3VnaCB0aGVyZSBhcmUgcmVhbGx5IHN5bnRhY3RpYwogCSAqIHZhcmlhbnRzIG9mIHRoZSBzYW1lIG1ldGhvZCBkZWNsYXJhdGlvbi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gZGltZW5zaW9ucyB0aGUgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMKIAkgKiAgICBuZWdhdGl2ZQogCSAqIEBzaW5jZSAyLjEKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXh0cmFEaW1lbnNpb25zKGludCBkaW1lbnNpb25zKSB7CiAJCWlmIChkaW1lbnNpb25zIDwgMCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtODI1LDE2ICs4MjgsMTYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqIHRoaXMgbWV0aG9kIGhhcyA8Yj5ubzwvYj4gYm9keS4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhhdmluZyBubyBib2R5IGFuZCBoYXZpbmcKIAkgKiBhbiBlbXB0eSBib2R5ICgie30iKS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtZXRob2QgYm9keSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBtZXRob2QgaGFzIG5vCiAJICogICAgYm9keQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgQmxvY2sgZ2V0Qm9keSgpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxCb2R5OwogCX0KQEAgLTg0MiwxMyArODQ1LDEzIEBACiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24uCiAJICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgc3VidGxlIGRpZmZlcmVuY2UgYmV0d2VlbiBoYXZpbmcgbm8gYm9keSAKKwkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhhdmluZyBubyBib2R5CiAJICogKGFzIGluIDxjb2RlPiJ2b2lkIGZvbygpOyI8L2NvZGU+KSBhbmQgaGF2aW5nIGFuIGVtcHR5IGJvZHkgKGFzIGluCiAJICogInZvaWQgZm9vKCkge30iKS4gQWJzdHJhY3QgbWV0aG9kcywgYW5kIG1ldGhvZHMgZGVjbGFyZWQgaW4gaW50ZXJmYWNlcywKIAkgKiBoYXZlIG5vIGJvZHkuIE5vbi1hYnN0cmFjdCBtZXRob2RzLCBhbmQgYWxsIGNvbnN0cnVjdG9ycywgaGF2ZSBhIGJvZHkuCiAJICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBib2R5IHRoZSBibG9jayBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBib2R5IHRoZSBibG9jayBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIHRoZXJlIGlzIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC04NTYsNyArODU5LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEJvZHkoQmxvY2sgYm9keSkgewogCQkvLyBhIE1ldGhvZERlY2xhcmF0aW9uIG1heSBvY2N1ciBpbiBhIEJsb2NrIC0gbXVzdCBjaGVjayBjeWNsZXMKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxCb2R5OwpAQCAtODcyLDEwICs4NzUsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlTWV0aG9kKHRoaXMpOwogCX0KQEAgLTg4Niw3ICs4ODksNyBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgOSAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEludm9jYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kSW52b2NhdGlvbi5qYXZhCmluZGV4IDkwOWYyZDkuLmI5MTI4OWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kSW52b2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kSW52b2NhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMwLDMyICszMCwzMyBAQAogICogPC9wcmU+CiAgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBNZXRob2RJbnZvY2F0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgImV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBPUFRJT05BTCwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAidHlwZUFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAidHlwZUFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfQVJHVU1FTlRTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2RJbnZvY2F0aW9uLmNsYXNzLCAidHlwZUFyZ3VtZW50cyIsIFR5cGUuY2xhc3MsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBBUkdVTUVOVFNfUFJPUEVSVFkgPQpAQCAtMTE5LDcgKzEyMCw3IEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pLgorCSAqIFRoZSB0eXBlIGFyZ3VtZW50cyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIE51bGwgaW4gSkxTMi4gQWRkZWQgaW4gSkxTMzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdAogCSAqIChzZWUgY29uc3RydWN0b3IpLgogCSAqIEBzaW5jZSAzLjEKQEAgLTEzNCw3ICsxMzUsNyBAQAogCiAJLyoqCiAJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKLQkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICoge0BsaW5rIEV4cHJlc3Npb259KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgYXJndW1lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoQVJHVU1FTlRTX1BST1BFUlRZKTsKQEAgLTIxMCw3ICsyMTEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJTWV0aG9kSW52b2NhdGlvbiByZXN1bHQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKQEAgLTI5NSw3ICsyOTYsNyBAQAogCSAqIGludm9jYXRpb24gKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlR5cGU8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQpAQCAtMzUzLDcgKzM1NCw3IEBACiAJICogaW52b2NhdGlvbiBleHByZXNzaW9uLgogCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KQogCSAqLwogCXB1YmxpYyBMaXN0IGFyZ3VtZW50cygpIHsKIAkJcmV0dXJuIHRoaXMuYXJndW1lbnRzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kUmVmLmphdmEKaW5kZXggZTE4NDUxNS4uNTZmNzBmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZFJlZi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDQzICsyMCw0NCBAQAogICogdGFnIGVsZW1lbnRzLCBmb3IgcmVmZXJlbmNlcyB0byBtZXRob2QgYW5kIGNvbnN0cnVjdG9yIG1lbWJlcnMuCiAgKiA8cHJlPgogICogTWV0aG9kUmVmOgotICogICAgIFsgTmFtZSBdIDxiPiM8L2I+IElkZW50aWZpZXIgIAorICogICAgIFsgTmFtZSBdIDxiPiM8L2I+IElkZW50aWZpZXIKICAqICAgICAgICAgPGI+KDwvYj4gWyBNZXRob2RSZWZQYXJhbWV0ZXIgfCB7IDxiPiw8L2I+IE1ldGhvZFJlZlBhcmFtZXRlciB9IF0gPGI+KTwvYj4KICAqIDwvcHJlPgotICogCisgKgogICogQHNlZSBKYXZhZG9jCiAgKiBAc2luY2UgMy4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIE1ldGhvZFJlZiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRG9jRWxlbWVudCB7Ci0JCisKIAkvKioKLQkgKiBUaGUgInF1YWxpZmllciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInF1YWxpZmllciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBRVUFMSUZJRVJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFFVQUxJRklFUl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2RSZWYuY2xhc3MsICJxdWFsaWZpZXIiLCBOYW1lLmNsYXNzLCBPUFRJT05BTCwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2RSZWYuY2xhc3MsICJuYW1lIiwgU2ltcGxlTmFtZS5jbGFzcywgTUFOREFUT1JZLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJwYXJhbWV0ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAicGFyYW1ldGVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgTWV0aG9kUmVmUGFyYW1ldGVyfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFBBUkFNRVRFUlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBQQVJBTUVURVJTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2RSZWYuY2xhc3MsICJwYXJhbWV0ZXJzIiwgTWV0aG9kUmVmUGFyYW1ldGVyLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KE1ldGhvZFJlZi5jbGFzcywgcHJvcGVyeUxpc3QpOwpAQCAtNjksMTYgKzcwLDE2IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIEFTVC5KTFMqIGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIG9wdGlvbmFsIHF1YWxpZmllcjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCkBAIC04OSwyNyArOTAsMjcgQEAKIAkgKiBsZWdhbCBKYXZhIG1ldGhvZCBuYW1lLgogCSAqLwogCXByaXZhdGUgU2ltcGxlTmFtZSBtZXRob2ROYW1lID0gbnVsbDsKLQkKKwogCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIAotCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPk1ldGhvZFJlZlBhcmFtZXRlcjwvY29kZT4pLgorCSAqIFRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zCisJICogKGVsZW1lbnQgdHlwZToge0BsaW5rIE1ldGhvZFJlZlBhcmFtZXRlcn0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHBhcmFtZXRlcnMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChQQVJBTUVURVJTX1BST1BFUlRZKTsKLQkKLQkKKworCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBtZXRob2QgcmVmZXJlbmNlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1ldGhvZCByZWZlcmVuY2Ugb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbWV0aG9kIHJlZmVyZW5jZSBpcyBmb3IgYSBtZXRob2Qgd2l0aCBhbgogCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWU7IG5vIHF1YWxpZmllcjsgYW5kIGFuIGVtcHR5IHBhcmFtZXRlcgogCSAqIGxpc3QuCiAJICogPHA+Ci0JICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUKIAkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCU1ldGhvZFJlZihBU1QgYXN0KSB7CkBAIC0xMjIsNyArMTIzLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDYsNyArMTQ3LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE3MCw3ICsxNzEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJTWV0aG9kUmVmIHJlc3VsdCA9IG5ldyBNZXRob2RSZWYodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0UXVhbGlmaWVyKChOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0UXVhbGlmaWVyKCkpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXROYW1lKCkpKTsKIAkJcmVzdWx0LnBhcmFtZXRlcnMoKS5hZGRBbGwoCkBAIC0xODUsNyArMTg2LDcgQEAKIAkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAogCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xOTksMjggKzIwMCwyOCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgbWV0aG9kIHJlZmVyZW5jZSwgb3IgCisJICogUmV0dXJucyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgbWV0aG9kIHJlZmVyZW5jZSwgb3IKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsUXVhbGlmaWVyOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyBtZXRob2QgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBxdWFsaWZpZXIgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBxdWFsaWZpZXIgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIHRoZXJlIGlzIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihOYW1lIG5hbWUpIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxRdWFsaWZpZXI7CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmFtZSwgUVVBTElGSUVSX1BST1BFUlRZKTsKQEAgLTIzMCw5ICsyMzEsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBtZXRob2Qgb3IgY29uc3RydWN0b3IuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IgbmFtZSBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGhvZE5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI0NiwxMSArMjQ3LDExIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubWV0aG9kTmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIG1ldGhvZCBvciBjb25zdHJ1Y3RvciB0byB0aGUKIAkgKiBnaXZlbiBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5ldyBtZXRob2Qgb3IgY29uc3RydWN0b3IgbmFtZSBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjU4LDcgKzI1OSw3IEBACiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSBuYW1lKSB7CiAJCWlmIChuYW1lID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI3MiwxNCArMjczLDE0IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgbWV0aG9kIHBhcmFtZXRlciByZWZlcmVuY2VzIGZvciB0aGlzCiAJICogbWV0aG9kIHJlZmVyZW5jZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtZXRob2QgcGFyYW1ldGVyIHJlZmVyZW5jZXMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5NZXRob2RSZWZQYXJhbWV0ZXI8L2NvZGU+KQotCSAqLyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgTWV0aG9kUmVmUGFyYW1ldGVyfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCBwYXJhbWV0ZXJzKCkgewogCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzOwogCX0KLQkKKwogCS8qKgogCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgZW50aXR5IHJlZmVycmVkIHRvIGJ5CiAJICogdGhpcyBtZXRob2QgcmVmZXJlbmNlLgpAQCAtMjg3LDEwICsyODgsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlUmVmZXJlbmNlKHRoaXMpOwogCX0KQEAgLTMwMSw3ICszMDIsNyBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kUmVmUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZFJlZlBhcmFtZXRlci5qYXZhCmluZGV4IDQ5MGRmNWIuLmZkMjEzYzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kUmVmUGFyYW1ldGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RSZWZQYXJhbWV0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNCw1NiArMzQsNTcgQEAKICAqIGEgd2F5IHRvIGV4cGxpY2l0bHkgcmVmZXIgdG8gdmFyaWFibGUgYXJpdHkgbWV0aG9kcywgaXQgc2VlbXMgbW9yZSBsaWtlbHkKICAqIHRoYXQgdGhlIEphdmFkb2Mgc3BlYyBpcyB3cm9uZyBpbiB0aGlzIGNhc2UuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2VlIEphdmFkb2MKICAqIEBzaW5jZSAzLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgTWV0aG9kUmVmUGFyYW1ldGVyIGV4dGVuZHMgQVNUTm9kZSB7Ci0JCisKIAkvKioKLQkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kUmVmUGFyYW1ldGVyLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAidmFyYXJncyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAidmFyYXJncyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIEJvb2xlYW59KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBWQVJBUkdTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgVkFSQVJHU19QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoTWV0aG9kUmVmUGFyYW1ldGVyLmNsYXNzLCAidmFyYXJncyIsIGJvb2xlYW4uY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihNZXRob2RSZWZQYXJhbWV0ZXIuY2xhc3MsICJuYW1lIiwgU2ltcGxlTmFtZS5jbGFzcywgT1BUSU9OQUwsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkJCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KE1ldGhvZFJlZlBhcmFtZXRlci5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShUWVBFX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CiAJCWFkZFByb3BlcnR5KE5BTUVfUFJPUEVSVFksIHByb3BlcnlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KE1ldGhvZFJlZlBhcmFtZXRlci5jbGFzcywgcHJvcGVyeUxpc3QpOwogCQlhZGRQcm9wZXJ0eShUWVBFX1BST1BFUlRZLCBwcm9wZXJ5TGlzdCk7CkBAIC05NSw5ICs5Niw5IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIEFTVC5KTFMqIGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTEwOCw3ICsxMDksNyBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCB0eXBlLgpAQCAtMTE4LDcgKzExOSw3IEBACiAJLyoqCiAJICogSW5kaWNhdGVzIHRoZSBsYXN0IHBhcmFtZXRlciBvZiBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZDsKIAkgKiBkZWZhdWx0cyB0byBmYWxzZS4KLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gdmFyaWFibGVBcml0eSA9IGZhbHNlOwpAQCAtMTMwLDEzICsxMzEsMTMgQEAKIAlwcml2YXRlIFNpbXBsZU5hbWUgb3B0aW9uYWxQYXJhbWV0ZXJOYW1lID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgbWV0aG9kIHJlZmVyZW5lY2UgcGFyYW1ldGVyIG93bmVkIGJ5IHRoZSBnaXZlbiAKLQkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLCAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1ldGhvZCByZWZlcmVuZWNlIHBhcmFtZXRlciBvd25lZCBieSB0aGUgZ2l2ZW4KKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLAogCSAqIG5vdCB2YXJpYWJsZSBhcml0eSwgYW5kIG5vIHBhcmFtZXRlciBuYW1lLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCU1ldGhvZFJlZlBhcmFtZXRlcihBU1QgYXN0KSB7CkBAIC0xNDksNyArMTUwLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNzMsNyArMTc0LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE4OSw3ICsxOTAsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCB2YWx1ZSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMDIsNyArMjAzLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCU1ldGhvZFJlZlBhcmFtZXRlciByZXN1bHQgPSBuZXcgTWV0aG9kUmVmUGFyYW1ldGVyKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGUoKFR5cGUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRUeXBlKCkpKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFMzKSB7CiAJCQlyZXN1bHQuc2V0VmFyYXJncyhpc1ZhcmFyZ3MoKSk7CkBAIC0yMTgsNyArMjE5LDcgQEAKIAkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAogCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMzEsMTIgKzIzMiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcGFyYW10ZXIgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciB0eXBlCi0JICovIAorCSAqLwogCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CiAJCWlmICh0aGlzLnR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI1Myw3ICsyNTQsNyBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgcGFyYW10ZXIgdHlwZSB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI2MSw3ICsyNjIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgewogCQlpZiAodHlwZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNzcsMjAgKzI3OCwyMCBAQAogCSAqIHRoZSBsYXN0IHBhcmFtZXRlciBvZiBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGUgYmluZGluZyBmb3IgdGhlIHR5cGUgPGNvZGU+Rm9vPC9jb2RlPmluIHRoZSB2YXJhcmcgbWV0aG9kCi0JICogcmVmZXJlbmNlIDxjb2RlPiNmdW4oRm9vLi4uKTwvY29kZT4gaXMgYWx3YXlzIGZvciB0aGUgdHlwZSBhcyAKKwkgKiByZWZlcmVuY2UgPGNvZGU+I2Z1bihGb28uLi4pPC9jb2RlPiBpcyBhbHdheXMgZm9yIHRoZSB0eXBlIGFzCiAJICogd3JpdHRlbjsgaS5lLiwgdGhlIHR5cGUgYmluZGluZyBmb3IgPGNvZGU+Rm9vPC9jb2RlPi4gSG93ZXZlciwgaWYgeW91CiAJICogbmF2aWdhdGUgZnJvbSB0aGUgTWV0aG9kUmVmIHRvIGl0cyBtZXRob2QgYmluZGluZyB0byB0aGUKIAkgKiB0eXBlIGJpbmRpbmcgZm9yIGl0cyBsYXN0IHBhcmFtZXRlciwgdGhlIHR5cGUgYmluZGluZyBmb3IgdGhlIHZhcmFyZwogCSAqIHBhcmFtZXRlciBpcyBhbHdheXMgYW4gYXJyYXkgdHlwZSAoaS5lLiwgPGNvZGU+Rm9vW108L2NvZGU+KSByZWZsZWN0aW5nCiAJICogdGhlIHdheSB2YXJhcmcgbWV0aG9kcyBnZXQgY29tcGlsZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYXJpdHkgcGFyYW1ldGVyLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNWYXJhcmdzKCkgewogCQl1bnN1cHBvcnRlZEluMigpOwogCQlyZXR1cm4gdGhpcy52YXJpYWJsZUFyaXR5OwpAQCAtMjk5LDExICszMDAsMTEgQEAKIAkvKioKIAkgKiBTZXRzIHdoZXRoZXIgdGhpcyBtZXRob2QgcmVmZXJlbmNlIHBhcmFtZXRlciBpcyBmb3IgdGhlIGxhc3QgcGFyYW1ldGVyIG9mCiAJICogYSB2YXJpYWJsZSBhcml0eSBtZXRob2QgKGFkZGVkIGluIEpMUzMgQVBJKS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB2YXJpYWJsZUFyaXR5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSB2YXJpYWJsZSBhcml0eQogCSAqICAgIHBhcmFtZXRlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFZhcmFyZ3MoYm9vbGVhbiB2YXJpYWJsZUFyaXR5KSB7CiAJCXVuc3VwcG9ydGVkSW4yKCk7CiAJCXByZVZhbHVlQ2hhbmdlKFZBUkFSR1NfUFJPUEVSVFkpOwpAQCAtMzEzLDI0ICszMTQsMjQgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbFBhcmFtZXRlck5hbWU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIHBhcmFtZXRlciBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIHRoZXJlIGlzIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSBuYW1lKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsUGFyYW1ldGVyTmFtZTsKIAkJcHJlUmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuYW1lLCBOQU1FX1BST1BFUlRZKTsKQEAgLTM0NCwxMiArMzQ1LDEyIEBACiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA1OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy50eXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLm9wdGlvbmFsUGFyYW1ldGVyTmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTW9kaWZpZXIuamF2YQppbmRleCAyY2JmN2VkLi42M2ZiZWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01vZGlmaWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Nb2RpZmllci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDggKzM4LDkgQEAKICAqIE5vdGUgdGhhdCBKYXZhIG1vZGVsIGNsYXNzIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnc30gYWxzbwogICogcHJvdmlkZXMgdGhlIHNhbWUgY29uc3RhbnRzIGFzIHRoaXMgY2xhc3MuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1vZGlmaWVyIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHRlbmRlZE1vZGlmaWVyIHsKIApAQCAtNDgsNDMgKzQ5LDQzIEBACiAgCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGlmaWVyS2V5d29yZCB7Ci0JCisKIAkJLyoqICJhYnN0cmFjdCIgbW9kaWZpZXIgd2l0aCBmbGFnIHZhbHVlIHtAbGluayBNb2RpZmllciNBQlNUUkFDVH0uICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kaWZpZXJLZXl3b3JkIEFCU1RSQUNUX0tFWVdPUkQgPSBuZXcgTW9kaWZpZXJLZXl3b3JkKCJhYnN0cmFjdCIsIEFCU1RSQUNUKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKiAiZmluYWwiIG1vZGlmaWVyIHdpdGggZmxhZyB2YWx1ZSB7QGxpbmsgTW9kaWZpZXIjRklOQUx9LiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1vZGlmaWVyS2V5d29yZCBGSU5BTF9LRVlXT1JEID0gbmV3IE1vZGlmaWVyS2V5d29yZCgiZmluYWwiLCBGSU5BTCk7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKioKIAkJICogTWFwIGZyb20gdG9rZW4gdG8gb3BlcmF0b3IgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OwogCQkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5PcGVyYXRvcjwvY29kZT4pLgogCQkgKi8KIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIEtFWVdPUkRTOwotCQkKKwogCQkvKiogIm5hdGl2ZSIgbW9kaWZpZXIgd2l0aCBmbGFnIHZhbHVlIHtAbGluayBNb2RpZmllciNOQVRJVkV9LiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1vZGlmaWVyS2V5d29yZCBOQVRJVkVfS0VZV09SRCA9IG5ldyBNb2RpZmllcktleXdvcmQoIm5hdGl2ZSIsIE5BVElWRSk7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKiogInByaXZhdGUiIG1vZGlmaWVyIHdpdGggZmxhZyB2YWx1ZSB7QGxpbmsgTW9kaWZpZXIjUFJJVkFURX0uICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kaWZpZXJLZXl3b3JkIFBSSVZBVEVfS0VZV09SRCA9IG5ldyBNb2RpZmllcktleXdvcmQoInByaXZhdGUiLCBQUklWQVRFKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKiAicHJvdGVjdGVkIiBtb2RpZmllciB3aXRoIGZsYWcgdmFsdWUge0BsaW5rIE1vZGlmaWVyI1BST1RFQ1RFRH0uICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kaWZpZXJLZXl3b3JkIFBST1RFQ1RFRF9LRVlXT1JEID0gbmV3IE1vZGlmaWVyS2V5d29yZCgicHJvdGVjdGVkIiwgUFJPVEVDVEVEKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKiAicHVibGljIiBtb2RpZmllciB3aXRoIGZsYWcgdmFsdWUge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30uICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kaWZpZXJLZXl3b3JkIFBVQkxJQ19LRVlXT1JEID0gbmV3IE1vZGlmaWVyS2V5d29yZCgicHVibGljIiwgUFVCTElDKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKiAic3RhdGljIiBtb2RpZmllciB3aXRoIGZsYWcgdmFsdWUge0BsaW5rIE1vZGlmaWVyI1NUQVRJQ30uICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kaWZpZXJLZXl3b3JkIFNUQVRJQ19LRVlXT1JEID0gbmV3IE1vZGlmaWVyS2V5d29yZCgic3RhdGljIiwgU1RBVElDKTsvLyROT04tTkxTLTEkCi0JCQorCiAJCS8qKiAic3RyaWN0ZnAiIG1vZGlmaWVyIHdpdGggZmxhZyB2YWx1ZSB7QGxpbmsgTW9kaWZpZXIjU1RSSUNURlB9LiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1vZGlmaWVyS2V5d29yZCBTVFJJQ1RGUF9LRVlXT1JEID0gbmV3IE1vZGlmaWVyS2V5d29yZCgic3RyaWN0ZnAiLCBTVFJJQ1RGUCk7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKiogInN5bmNocm9uaXplZCIgbW9kaWZpZXIgd2l0aCBmbGFnIHZhbHVlIHtAbGluayBNb2RpZmllciNTWU5DSFJPTklaRUR9LiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1vZGlmaWVyS2V5d29yZCBTWU5DSFJPTklaRURfS0VZV09SRCA9IG5ldyBNb2RpZmllcktleXdvcmQoInN5bmNocm9uaXplZCIsIFNZTkNIUk9OSVpFRCk7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKiogInRyYW5zaWVudCIgbW9kaWZpZXIgd2l0aCBmbGFnIHZhbHVlIHtAbGluayBNb2RpZmllciNUUkFOU0lFTlR9LiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1vZGlmaWVyS2V5d29yZCBUUkFOU0lFTlRfS0VZV09SRCA9IG5ldyBNb2RpZmllcktleXdvcmQoInRyYW5zaWVudCIsIFRSQU5TSUVOVCk7Ly8kTk9OLU5MUy0xJAotCQkKKwogCQkvKiogInZvbGF0aWxlIiBtb2RpZmllciB3aXRoIGZsYWcgdmFsdWUge0BsaW5rIE1vZGlmaWVyI1ZPTEFUSUxFfS4gKi8KIAkJcHVibGljIHN0YXRpYyBmaW5hbCBNb2RpZmllcktleXdvcmQgVk9MQVRJTEVfS0VZV09SRCA9IG5ldyBNb2RpZmllcktleXdvcmQoInZvbGF0aWxlIiwgVk9MQVRJTEUpOy8vJE5PTi1OTFMtMSQKIAkJc3RhdGljIHsKQEAgLTExMiwxMCArMTEzLDEwIEBACiAJCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgb3IgaWYgbW9yZSB0aGFuIG9uZSBiaXQgaXMgc2V0LgogCQkgKiA8cD4KIAkJICogPGNvZGU+ZnJvbUZsYWdWYWx1ZTwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvRmxhZ1ZhbHVlPC9jb2RlPjoKLQkJICogdGhhdCBpcywgPGNvZGU+TW9kaWZpZXJLaW5kLmZyb21GbGFnVmFsdWUoay50b0ZsYWdWYWx1ZSgpKSA9PSBrPC9jb2RlPiBmb3IgCisJCSAqIHRoYXQgaXMsIDxjb2RlPk1vZGlmaWVyS2luZC5mcm9tRmxhZ1ZhbHVlKGsudG9GbGFnVmFsdWUoKSkgPT0gazwvY29kZT4gZm9yCiAJCSAqIGFsbCBtb2RpZmllciBrZXl3b3JkcyA8Y29kZT5rPC9jb2RlPi4KIAkJICogPC9wPgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIGZsYWdWYWx1ZSB0aGUgc2luZ2xlLWJpdCBmbGFnIHZhbHVlIGZvciB0aGUgbW9kaWZpZXIKIAkJICogQHJldHVybiB0aGUgbW9kaWZpZXIga2V5d29yZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCQkgKiBAc2VlICN0b0ZsYWdWYWx1ZSgpCkBAIC0xMjksMTYgKzEzMCwxNiBAQAogCQkJfQogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJCisKIAkJLyoqCiAJCSAqIFJldHVybnMgdGhlIG1vZGlmaWVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHN0cmluZywKIAkJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KIAkJICogPHA+CiAJCSAqIDxjb2RlPnRvS2V5d29yZDwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKLQkJICogdGhhdCBpcywgPGNvZGU+TW9kaWZpZXJLaW5kLnRvS2V5d29yZChrLnRvU3RyaW5nKCkpID09IGs8L2NvZGU+IGZvciAKKwkJICogdGhhdCBpcywgPGNvZGU+TW9kaWZpZXJLaW5kLnRvS2V5d29yZChrLnRvU3RyaW5nKCkpID09IGs8L2NvZGU+IGZvcgogCQkgKiBhbGwgbW9kaWZpZXIga2V5d29yZHMgPGNvZGU+azwvY29kZT4uCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSBrZXl3b3JkIHRoZSBsb3dlcmNhc2Ugc3RyaW5nIG5hbWUgZm9yIHRoZSBtb2RpZmllcgogCQkgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBrZXl3b3JkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJCSAqIEBzZWUgI3RvU3RyaW5nKCkKQEAgLTE0NiwyNCArMTQ3LDI0IEBACiAJCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJLZXl3b3JkIHRvS2V5d29yZChTdHJpbmcga2V5d29yZCkgewogCQkJcmV0dXJuIChNb2RpZmllcktleXdvcmQpIEtFWVdPUkRTLmdldChrZXl3b3JkKTsKIAkJfQotCQkKKwogCQkvKioKIAkJICogVGhlIGZsYWcgdmFsdWUgZm9yIHRoZSBtb2RpZmllci4KIAkJICovCiAJCXByaXZhdGUgaW50IGZsYWdWYWx1ZTsKLQkJCisKIAkJLyoqCiAJCSAqIFRoZSBrZXl3b3JkIG1vZGlmaWVyIHN0cmluZy4KIAkJICovCiAJCXByaXZhdGUgU3RyaW5nIGtleXdvcmQ7Ci0JCQorCiAJCS8qKgogCQkgKiBDcmVhdGVzIGEgbmV3IG1vZGlmaWVyIHdpdGggdGhlIGdpdmVuIGtleXdvcmQuCiAJCSAqIDxwPgogCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcwogCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgbW9kaWZpZXJzLgogCQkgKiA8L3A+Ci0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0ga2V5d29yZCB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgbW9kaWZpZXIKIAkJICogQHBhcmFtIGZsYWdWYWx1ZSBmbGFnIHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbgogCQkgKi8KQEAgLTE3MSwyMSArMTcyLDIxIEBACiAJCQl0aGlzLmtleXdvcmQgPSBrZXl3b3JkOwogCQkJdGhpcy5mbGFnVmFsdWUgPSBmbGFnVmFsdWU7CiAJCX0KLQkJCisKIAkJLyoqCiAJCSAqIFJldHVybnMgdGhlIG1vZGlmaWVyIGZsYWcgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGlzIG1vZGlmaWVyIGtleXdvcmQuCiAJCSAqIFRoZXNlIGZsYWcgdmFsdWVzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24uCi0JCSAqIAorCQkgKgogCQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cwogCQkgKiBAc2VlICNmcm9tRmxhZ1ZhbHVlKGludCkKLQkJICovIAorCQkgKi8KIAkJcHVibGljIGludCB0b0ZsYWdWYWx1ZSgpIHsKIAkJCXJldHVybiB0aGlzLmZsYWdWYWx1ZTsKIAkJfQogCiAJCS8qKgogCQkgKiBSZXR1cm5zIHRoZSBrZXl3b3JkIGZvciB0aGUgbW9kaWZpZXIuCi0JCSAqIAorCQkgKgogCQkgKiBAcmV0dXJuIHRoZSBrZXl3b3JkIGZvciB0aGUgbW9kaWZpZXIKIAkJICogQHNlZSAjdG9LZXl3b3JkKFN0cmluZykKIAkJICovCkBAIC0yMDksMTAgKzIxMCwxMCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMID0gMHgwMDEwOwogCiAJLyoqCi0JICogVGhlICJrZXl3b3JkIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAia2V5d29yZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIE1vZGlmaWVyLk1vZGlmaWVyS2V5d29yZH0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBLRVlXT1JEX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgS0VZV09SRF9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoTW9kaWZpZXIuY2xhc3MsICJrZXl3b3JkIiwgTW9kaWZpZXIuTW9kaWZpZXJLZXl3b3JkLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCiAKIAkvKioKQEAgLTIzNiw3ICsyMzcsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEUgPSAweDAwMDI7CiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCkBAIC0zMDEsNyArMzAyLDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAiYWJzdHJhY3QiIG1vZGlmaWVyLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMgYW5kIG1ldGhvZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+QUJTVFJBQ1Q8L2NvZGU+IGJpdCBpcwogCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtMzE0LDcgKzMxNSw3IEBACiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgImZpbmFsIiBtb2RpZmllci4KIAkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBmaWVsZHMsIGFuZCB2YXJpYWJsZXMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+RklOQUw8L2NvZGU+IGJpdCBpcwogCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtMzI3LDcgKzMyOCw3IEBACiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgIm5hdGl2ZSIgbW9kaWZpZXIuCiAJICogQXBwbGljYWJsZSBvbmx5IHRvIG1ldGhvZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+TkFUSVZFPC9jb2RlPiBiaXQgaXMKIAkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTM0MCw3ICszNDEsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZ3MgaW5jbHVkZXMgdGhlICJwcml2YXRlIiBtb2RpZmllci4KIAkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBmaWVsZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+UFJJVkFURTwvY29kZT4gYml0IGlzCiAJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCkBAIC0zNTMsNyArMzU0LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAicHJvdGVjdGVkIiBtb2RpZmllci4KIAkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBmaWVsZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+UFJPVEVDVEVEPC9jb2RlPiBiaXQgaXMKIAkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTM2Niw3ICszNjcsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZ3MgaW5jbHVkZXMgdGhlICJwdWJsaWMiIG1vZGlmaWVyLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGZpZWxkcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5QVUJMSUM8L2NvZGU+IGJpdCBpcwogCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtMzc5LDcgKzM4MCw3IEBACiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgInN0YXRpYyIgbW9kaWZpZXIuCiAJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgZmllbGRzLCBhbmQgaW5pdGlhbGl6ZXJzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncwogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlNUQVRJQzwvY29kZT4gYml0IGlzCiAJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCkBAIC0zODgsMTEgKzM4OSwxMSBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpYyhpbnQgZmxhZ3MpIHsKIAkJcmV0dXJuIChmbGFncyAmIFNUQVRJQykgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAic3RyaWN0ZnAiIG1vZGlmaWVyLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMgYW5kIG1ldGhvZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U1RSSUNURlA8L2NvZGU+IGJpdCBpcwogCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtNDAxLDExICs0MDIsMTEgQEAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdHJpY3RmcChpbnQgZmxhZ3MpIHsKIAkJcmV0dXJuIChmbGFncyAmIFNUUklDVEZQKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZ3MgaW5jbHVkZXMgdGhlICJzeW5jaHJvbml6ZWQiIG1vZGlmaWVyLgogCSAqIEFwcGxpY2FibGUgb25seSB0byBtZXRob2RzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncwogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlNZTkNIUk9OSVpFRDwvY29kZT4gYml0IGlzCiAJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCkBAIC00MTQsMTEgKzQxNSwxMSBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChpbnQgZmxhZ3MpIHsKIAkJcmV0dXJuIChmbGFncyAmIFNZTkNIUk9OSVpFRCkgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAidHJhbnNpZW50IiBtb2RpZmllci4KIAkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncwogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlRSQU5TSUVOVDwvY29kZT4gYml0IGlzCiAJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCkBAIC00MjcsMTEgKzQyOCwxMSBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYW5zaWVudChpbnQgZmxhZ3MpIHsKIAkJcmV0dXJuIChmbGFncyAmIFRSQU5TSUVOVCkgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAidm9sYXRpbGUiIG1vZGlmaWVyLgogCSAqIEFwcGxpY2FibGUgb25seSB0byBmaWVsZHMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+Vk9MQVRJTEU8L2NvZGU+IGJpdCBpcwogCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtNDQ0LDE4ICs0NDUsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBtb2RpZmllciBrZXl3b3JkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCBtb2RpZmllci4KIAkgKiBAc2luY2UgMy4wCkBAIC00NjgsNyArNDY5LDcgQEAKIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC00ODUsMjQgKzQ4NiwyNCBAQAogCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCU1vZGlmaWVyIHJlc3VsdCA9IG5ldyBNb2RpZmllcih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRLZXl3b3JkKGdldEtleXdvcmQoKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbW9kaWZpZXIga2V5d29yZCBvZiB0aGlzIG1vZGlmaWVyIG5vZGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBrZXl3b3JkCiAJICogQHNpbmNlIDMuMAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTW9kaWZpZXJLZXl3b3JkIGdldEtleXdvcmQoKSB7CiAJCXJldHVybiB0aGlzLm1vZGlmaWVyS2V5d29yZDsKIAl9CkBAIC01MTQsNyArNTE1LDcgQEAKIAlmaW5hbCBpbnQgZ2V0Tm9kZVR5cGUwKCkgewogCQlyZXR1cm4gTU9ESUZJRVI7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC01NDAsNyArNTQxLDcgQEAKIAogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgYWJzdHJhY3QgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIGFic3RyYWN0IG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC01NTAsMTQgKzU1MSwxNCBAQAogCiAJLyoqCiAJICogQHNlZSBJRXh0ZW5kZWRNb2RpZmllciNpc0Fubm90YXRpb24oKQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb24oKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIGZpbmFsIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBmaW5hbCBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwpAQCAtNTY3LDEwMSArNTY4LDEwMSBAQAogCiAJLyoqCiAJICogQHNlZSBJRXh0ZW5kZWRNb2RpZmllciNpc01vZGlmaWVyKCkKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNNb2RpZmllcigpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCiAJLyoqCiAJICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBuYXRpdmUgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIG5hdGl2ZSBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlKCkgewogCQlyZXR1cm4gdGhpcy5tb2RpZmllcktleXdvcmQgPT0gTW9kaWZpZXJLZXl3b3JkLk5BVElWRV9LRVlXT1JEOwogCX0KLQkKKwogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgcHJpdmF0ZSBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgcHJpdmF0ZSBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZSgpIHsKIAkJcmV0dXJuIHRoaXMubW9kaWZpZXJLZXl3b3JkID09IE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQ7CiAJfQotCQorCiAJLyoqCiAJICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBwcm90ZWN0ZWQgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIHByb3RlY3RlZCBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUHJvdGVjdGVkKCkgewogCQlyZXR1cm4gdGhpcy5tb2RpZmllcktleXdvcmQgPT0gTW9kaWZpZXJLZXl3b3JkLlBST1RFQ1RFRF9LRVlXT1JEOwogCX0KLQkKKwogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgcHVibGljIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBwdWJsaWMgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKIAkJcmV0dXJuIHRoaXMubW9kaWZpZXJLZXl3b3JkID09IE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRDsKIAl9Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIHN0YXRpYyBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgc3RhdGljIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CiAJCXJldHVybiB0aGlzLm1vZGlmaWVyS2V5d29yZCA9PSBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQ7CiAJfQotCQorCiAJLyoqCiAJICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBzdHJpY3RmcCBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgc3RyaWN0ZnAgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1N0cmljdGZwKCkgewogCQlyZXR1cm4gdGhpcy5tb2RpZmllcktleXdvcmQgPT0gTW9kaWZpZXJLZXl3b3JkLlNUUklDVEZQX0tFWVdPUkQ7CiAJfQotCQorCiAJLyoqCiAJICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSBzeW5jaHJvbml6ZWQgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIHN5bmNocm9uaXplZCBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewogCQlyZXR1cm4gdGhpcy5tb2RpZmllcktleXdvcmQgPT0gTW9kaWZpZXJLZXl3b3JkLlNZTkNIUk9OSVpFRF9LRVlXT1JEOwogCX0KLQkKKwogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgdHJhbnNpZW50IG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSB0cmFuc2llbnQgbW9kaWZpZXIsIGZhbHNlIG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKIAkJcmV0dXJuIHRoaXMubW9kaWZpZXJLZXl3b3JkID09IE1vZGlmaWVyS2V5d29yZC5UUkFOU0lFTlRfS0VZV09SRDsKIAl9Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdGhlIHZvbGF0aWxlIG1vZGlmaWVyLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHRoZSB2b2xhdGlsZSBtb2RpZmllciwgZmFsc2Ugb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzVm9sYXRpbGUoKSB7CiAJCXJldHVybiB0aGlzLm1vZGlmaWVyS2V5d29yZCA9PSBNb2RpZmllcktleXdvcmQuVk9MQVRJTEVfS0VZV09SRDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKiBAc2luY2UgMy4wCkBAIC02NzAsMTQgKzY3MSwxNCBAQAogCQkvLyB0cmVhdCBNb2RpZmllcktleXdvcmQgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBtb2RpZmllciBrZXl3b3JkIG9mIHRoaXMgbW9kaWZpZXIgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXJLZXlvcmQgdGhlIG1vZGlmaWVyIGtleXdvcmQgCisJICoKKwkgKiBAcGFyYW0gbW9kaWZpZXJLZXlvcmQgdGhlIG1vZGlmaWVyIGtleXdvcmQKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAc2luY2UgMy4wCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEtleXdvcmQoTW9kaWZpZXJLZXl3b3JkIG1vZGlmaWVyS2V5b3JkKSB7CiAJCWlmIChtb2RpZmllcktleW9yZCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC02ODYsNyArNjg3LDcgQEAKIAkJdGhpcy5tb2RpZmllcktleXdvcmQgPSBtb2RpZmllcktleW9yZDsKIAkJcG9zdFZhbHVlQ2hhbmdlKEtFWVdPUkRfUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqIEBzaW5jZSAzLjAKQEAgLTY5NSw3ICs2OTYsNyBAQAogCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCiAJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKiBAc2luY2UgMy4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZS5qYXZhCmluZGV4IDRmMWFhZTEuLjY1NDMwZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDcgKzEzLDcgQEAKIAogLyoqCiAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IG5hbWVzLgotICogVGhlcmUgYXJlIGV4YWN0bHkgdHdvIGtpbmRzIG9mIG5hbWU6IHNpbXBsZSBvbmVzIAorICogVGhlcmUgYXJlIGV4YWN0bHkgdHdvIGtpbmRzIG9mIG5hbWU6IHNpbXBsZSBvbmVzCiAgKiAoPGNvZGU+U2ltcGxlTmFtZTwvY29kZT4pIGFuZCBxdWFsaWZpZWQgb25lcyAoPGNvZGU+UXVhbGlmaWVkTmFtZTwvY29kZT4pLgogICogPHA+CiAgKiA8cHJlPgpAQCAtMjIsNTAgKzIyLDUxIEBACiAgKiAgICAgUXVhbGlmaWVkTmFtZQogICogPC9wcmU+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZSBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBJRG9jRWxlbWVudCB7Ci0JCisKIAkvKioKLQkgKiBBcHByb3hpbWF0ZSBiYXNlIHNpemUgb2YgYW4gZXhwcmVzc2lvbiBub2RlIGluc3RhbmNlIGluIGJ5dGVzLCAKKwkgKiBBcHByb3hpbWF0ZSBiYXNlIHNpemUgb2YgYW4gZXhwcmVzc2lvbiBub2RlIGluc3RhbmNlIGluIGJ5dGVzLAogCSAqIGluY2x1ZGluZyBvYmplY3QgaGVhZGVyIGFuZCBpbnN0YW5jZSBmaWVsZHMuCiAJICovCiAJc3RhdGljIGZpbmFsIGludCBCQVNFX05BTUVfTk9ERV9TSVpFID0gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKLQkKKwogCS8qKgogCSAqIFRoaXMgaW5kZXggcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gaW5zaWRlIGEgcXVhbGlmaWVkIG5hbWUuCiAJICovCiAJaW50IGluZGV4OwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBuYW1lIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJTmFtZShBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbmFtZSBpcyBhIHNpbXBsZSBuYW1lCiAJICogKDxjb2RlPlNpbXBsZU5hbWU8L2NvZGU+KS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBzaW1wbGUgbmFtZSwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgc2ltcGxlIG5hbWUsIGFuZAogCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NpbXBsZU5hbWUoKSB7CiAJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpOwogCX0KLQkJCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBuYW1lIGlzIGEgcXVhbGlmaWVkIG5hbWUKIAkgKiAoPGNvZGU+UXVhbGlmaWVkTmFtZTwvY29kZT4pLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHF1YWxpZmllZCBuYW1lLCBhbmQgCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBxdWFsaWZpZWQgbmFtZSwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUXVhbGlmaWVkTmFtZSgpIHsKQEAgLTc4LDIxICs3OSwyMSBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZQogCSAqICAgIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBJQmluZGluZyByZXNvbHZlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVOYW1lKHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRvdC1zZXBhcmF0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBuYW1lLgogCSAqIElmIHRoZSBuYW1lIGlzIGEgc2ltcGxlIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlIG5hbWUncyBpZGVudGlmaWVyLgogCSAqIElmIHRoZSBuYW1lIGlzIGEgcXVhbGlmaWVkIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlIG5hbWUgb2YgdGhlIHF1YWxpZmllcgogCSAqIChhcyBjb21wdXRlZCBieSB0aGlzIG1ldGhvZCkgZm9sbG93ZWQgYnkgIi4iIGZvbGxvd2VkIGJ5IHRoZSBuYW1lJ3MKIAkgKiBpZGVudGlmaWVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMTAsOSArMTExLDkgQEAKIAkvKioKIAkgKiBBcHBlbmRzIHRoZSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5hbWUgdG8gdGhlIGdpdmVuIHN0cmluZwogCSAqIGJ1ZmZlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlcgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlhYnN0cmFjdCB2b2lkIGFwcGVuZE5hbWUoU3RyaW5nQnVmZmVyIGJ1ZmZlcik7CQorCWFic3RyYWN0IHZvaWQgYXBwZW5kTmFtZShTdHJpbmdCdWZmZXIgYnVmZmVyKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmM0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk5hbWVMb29rdXA7CisKKy8qKgorICogQmF0Y2ggbmFtZSBlbnZpcm9ubWVudCB0aGF0IGNhbiBiZSBjYW5jZWxlZCB1c2luZyBhIG1vbml0b3IuCisgKiBAc2luY2UgMy42CisgKi8KK2NsYXNzIE5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcyBleHRlbmRzIEZpbGVTeXN0ZW0gaW1wbGVtZW50cyBJTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzIHsKKwlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CisJCisJcHVibGljIE5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcyhDbGFzc3BhdGhbXSBwYXRocywgU3RyaW5nW10gaW5pdGlhbEZpbGVOYW1lcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXN1cGVyKHBhdGhzLCBpbml0aWFsRmlsZU5hbWVzKTsKKwkJc2V0TW9uaXRvcihtb25pdG9yKTsKKwl9CisJcHJpdmF0ZSB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7CisJCWlmICh0aGlzLm1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLm1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQlpZiAoTmFtZUxvb2t1cC5WRVJCT1NFKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIENBTkNFTExJTkcgTE9PS1VQICIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLypzaWxlbnQqLywgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCkpOworCQl9CisJfQorCXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdIHR5cGVOYW1lLCBjaGFyW11bXSBwYWNrYWdlTmFtZSkgeworCQljaGVja0NhbmNlbGVkKCk7CisJCXJldHVybiBzdXBlci5maW5kVHlwZSh0eXBlTmFtZSwgcGFja2FnZU5hbWUpOworCX0KKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCQljaGVja0NhbmNlbGVkKCk7CisJCXJldHVybiBzdXBlci5maW5kVHlwZShjb21wb3VuZE5hbWUpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoY2hhcltdW10gY29tcG91bmROYW1lLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKKwkJY2hlY2tDYW5jZWxlZCgpOworCQlyZXR1cm4gc3VwZXIuaXNQYWNrYWdlKGNvbXBvdW5kTmFtZSwgcGFja2FnZU5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTm9kZUV2ZW50SGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob2RlRXZlbnRIYW5kbGVyLmphdmEKaW5kZXggMDI4MjhjNC4uOTFmOTg1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob2RlRXZlbnRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob2RlRXZlbnRIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsNyArMTcsNyBAQAogICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2VydmVzIGFzIHRoZSBkZWZhdWx0IGV2ZW50IGhhbmRsZXIKICAqIHRoYXQgZG9lcyBub3RoaW5nLiBJbnRlcm5hbCBzdWJjbGFzc2VzIGRvIGFsbCB0aGUgcmVhbCB3b3JrLgogICogPC9wPgotICogCisgKgogICogQHNlZSBBU1QjZ2V0RXZlbnRIYW5kbGVyKCkKICAqLwogY2xhc3MgTm9kZUV2ZW50SGFuZGxlciB7CkBAIC0yOCwxMSArMjgsMTEgQEAKIAlOb2RlRXZlbnRIYW5kbGVyKCkgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIGFib3V0IHRvIGxvc2UgYSBjaGlsZC4KIAkgKiBUaGUgZmlyc3QgaGFsZiBvZiBhbiBldmVudCBwYWlyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBhYm91dCB0byBiZSBtb2RpZmllZAogCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSBhYm91dCB0byBiZSByZW1vdmVkCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKQEAgLTQzLDExICs0MywxMSBAQAogCQkvLyBkbyBub3RoaW5nCiAJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiREVMMSAiICsgcHJvcGVydHkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBoYXMganVzdCBsb3NlIGEgY2hpbGQuCiAJICogVGhlIHNlY29uZCBoYWxmIG9mIGFuIGV2ZW50IHBhaXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgd2FzIG1vZGlmaWVkCiAJICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCB0aGF0IHdhcyByZW1vdmVkOyBub3RlIHRoYXQgdGhpcyBub2RlIGlzIHVucGFyZW50ZWQKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIGNoaWxkIG9yIGNoaWxkIGxpc3QgcHJvcGVydHkgZGVzY3JpcHRvcgpAQCAtNTgsMTIgKzU4LDEyIEBACiAJCS8vIGRvIG5vdGhpbmcKIAkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJERUwyICIgKyBwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyoqCiAJICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIGFib3V0IHRvIGhhdmUgYSBjaGlsZCByZXBsYWNlZC4KIAkgKiBUaGUgZmlyc3QgaGFsZiBvZiBhbiBldmVudCBwYWlyLgogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGFib3V0IHRvIGJlIG1vZGlmaWVkCiAJICogQHBhcmFtIGNoaWxkIHRoZSBub2RlIGFib3V0IHRvIGJlIHJlcGxhY2VkCiAJICogQHBhcmFtIG5ld0NoaWxkIHRoZSByZXBsYWNlbWVudCBjaGlsZDsgbm90ZSB0aGF0IHRoaXMgbm9kZSBpcyB1bnBhcmVudGVkCkBAIC03NSwxMSArNzUsMTEgQEAKIAkJLy8gZG8gbm90aGluZwogCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJFUDEgIiArIHByb3BlcnR5KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaGFzIGhhZCBpdHMgY2hpbGQgcmVwbGFjZWQuIFRoZSBzZWNvbmQgaGFsZgogCSAqIG9mIGFuIGV2ZW50IHBhaXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgd2FzIG1vZGlmaWVkCiAJICogQHBhcmFtIGNoaWxkIHRoZSBub2RlIHRoYXQgd2FzIHJlcGxhY2VkOyBub3RlIHRoYXQgdGhpcyBub2RlIGlzIHVucGFyZW50ZWQKIAkgKiBAcGFyYW0gbmV3Q2hpbGQgdGhlIHJlcGxhY2VtZW50IGNoaWxkCkBAIC05MSwxMSArOTEsMTEgQEAKIAkJLy8gZG8gbm90aGluZwogCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJFUDIgIiArIHByb3BlcnR5KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gZ2FpbiBhIGNoaWxkLgogCSAqIFRoZSBmaXJzdCBoYWxmIG9mIGFuIGV2ZW50IHBhaXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgdG8gYmUgbW9kaWZpZWQKIAkgKiBAcGFyYW0gY2hpbGQgdGhlIG5vZGUgdGhhdCBpcyB0byBiZSBhZGRlZCBhcyBhIGNoaWxkOyBub3RlIHRoYXQgdGhpcwogCSAqIG5vZGUgaXMgdW5wYXJlbnRlZDsgaW4gdGhlIGNhc2Ugb2YgYSBjaGlsZCBsaXN0IHByb3BlcnR5LCB0aGUgZXhhY3QKQEAgLTExMCwxMSArMTEwLDExIEBACiAJCS8vIGRvIG5vdGhpbmcKIAkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBREQxICIgKyBwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyoqCiAJICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGhhcyBqdXN0IGdhaW5lZCBhIGNoaWxkLgogCSAqIFRoZSBzZWNvbmQgaGFsZiBvZiBhbiBldmVudCBwYWlyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBtb2RpZmllZAogCSAqIEBwYXJhbSBjaGlsZCB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZCBhcyBhIGNoaWxkCiAJICogQHBhcmFtIHByb3BlcnR5IHRoZSBjaGlsZCBvciBjaGlsZCBsaXN0IHByb3BlcnR5IGRlc2NyaXB0b3IKQEAgLTEyNSwxMiArMTI1LDEyIEBACiAJCS8vIGRvIG5vdGhpbmcKIAkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBREQyICIgKyBwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyoqCiAJICogUmVwb3J0cyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIGFib3V0IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYQogCSAqIG5vbi1jaGlsZCBwcm9wZXJ0eS4gVGhlIGZpcnN0IGhhbGYgb2YgYW4gZXZlbnQgcGFpci4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBiZSBtb2RpZmllZAogCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzZWUgI3Bvc3RWYWx1ZUNoYW5nZUV2ZW50KEFTVE5vZGUsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcikKQEAgLTE0NSw3ICsxNDUsNyBAQAogCSAqIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBoYXMganVzdCBjaGFuZ2VkIHRoZSB2YWx1ZSBvZiBhCiAJICogbm9uLWNoaWxkIHByb3BlcnR5LiBUaGUgc2Vjb25kIGhhbGYgb2YgYW4gZXZlbnQgcGFpci4KIAkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHdhcyBtb2RpZmllZAogCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzZWUgI3ByZVZhbHVlQ2hhbmdlRXZlbnQoQVNUTm9kZSwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKQpAQCAtMTU1LDEyICsxNTUsMTIgQEAKIAkJLy8gZG8gbm90aGluZwogCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1PRDIgIiArIHByb3BlcnR5KTsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gYmUgY2xvbmVkLiAKKwkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaXMgYWJvdXQgdG8gYmUgY2xvbmVkLgogCSAqIFRoZSBmaXJzdCBoYWxmIG9mIGFuIGV2ZW50IHBhaXIuCiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYmUgbW9kaWZpZWQKIAkgKiBAc2VlICNwb3N0Q2xvbmVOb2RlRXZlbnQoQVNUTm9kZSwgQVNUTm9kZSkKIAkgKiBAc2luY2UgMy4wCkBAIC0xNzQsNyArMTc0LDcgQEAKIAkgKiBSZXBvcnRzIHRoYXQgdGhlIGdpdmVuIG5vZGUgaGFzIGp1c3QgYmVlbiBjbG9uZWQuCiAJICogVGhlIHNlY29uZCBoYWxmIG9mIGFuIGV2ZW50IHBhaXIuCiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCB3YXMgbW9kaWZpZWQKIAkgKiBAcGFyYW0gY2xvbmUgdGhlIGNsb25lIG9mIDxjb2RlPm5vZGU8L2NvZGU+CiAJICogQHNlZSAjcHJlQ2xvbmVOb2RlRXZlbnQoQVNUTm9kZSkKQEAgLTE4NCw1ICsxODQsNSBAQAogCQkvLyBkbyBub3RoaW5nCiAJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ0xPTkUyIik7CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05vZGVGaW5kZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTm9kZUZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2VmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05vZGVGaW5kZXIuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuVG9vbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CisKKy8qKgorICogRm9yIGEgZ2l2ZW4gcmFuZ2UsIGZpbmRzIHRoZSBjb3ZlcmVkIG5vZGUgYW5kIHRoZSBjb3ZlcmluZyBub2RlLgorICoKKyAqIEBzaW5jZSAzLjUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5vZGVGaW5kZXIgeworCS8qKgorCSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYWN0dWFsIHZpc2l0b3IgdGhhdCBmaW5kcyB0aGUgbm9kZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlRmluZGVyVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgeworCQlwcml2YXRlIGludCBmU3RhcnQ7CisJCXByaXZhdGUgaW50IGZFbmQ7CisJCXByaXZhdGUgQVNUTm9kZSBmQ292ZXJpbmdOb2RlOworCQlwcml2YXRlIEFTVE5vZGUgZkNvdmVyZWROb2RlOworCisJCU5vZGVGaW5kZXJWaXNpdG9yKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJCXN1cGVyKHRydWUpOyAvLyBpbmNsdWRlIEphdmFkb2MgdGFncworCQkJdGhpcy5mU3RhcnQ9IG9mZnNldDsKKwkJCXRoaXMuZkVuZD0gb2Zmc2V0ICsgbGVuZ3RoOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcHJlVmlzaXQyKEFTVE5vZGUgbm9kZSkgeworCQkJaW50IG5vZGVTdGFydD0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQlpbnQgbm9kZUVuZD0gbm9kZVN0YXJ0ICsgbm9kZS5nZXRMZW5ndGgoKTsKKwkJCWlmIChub2RlRW5kIDwgdGhpcy5mU3RhcnQgfHwgdGhpcy5mRW5kIDwgbm9kZVN0YXJ0KSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKG5vZGVTdGFydCA8PSB0aGlzLmZTdGFydCAmJiB0aGlzLmZFbmQgPD0gbm9kZUVuZCkgeworCQkJCXRoaXMuZkNvdmVyaW5nTm9kZT0gbm9kZTsKKwkJCX0KKwkJCWlmICh0aGlzLmZTdGFydCA8PSBub2RlU3RhcnQgJiYgbm9kZUVuZCA8PSB0aGlzLmZFbmQpIHsKKwkJCQlpZiAodGhpcy5mQ292ZXJpbmdOb2RlID09IG5vZGUpIHsgLy8gbm9kZVN0YXJ0ID09IGZTdGFydCAmJiBub2RlRW5kID09IGZFbmQKKwkJCQkJdGhpcy5mQ292ZXJlZE5vZGU9IG5vZGU7CisJCQkJCXJldHVybiB0cnVlOyAvLyBsb29rIGZ1cnRoZXIgZm9yIG5vZGUgd2l0aCBzYW1lIGxlbmd0aCBhcyBwYXJlbnQKKwkJCQl9IGVsc2UgaWYgKHRoaXMuZkNvdmVyZWROb2RlID09IG51bGwpIHsgLy8gbm8gYmV0dGVyIGZvdW5kCisJCQkJCXRoaXMuZkNvdmVyZWROb2RlPSBub2RlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY292ZXJlZCBub2RlLiBJZiBtb3JlIHRoYW4gb25lIG5vZGVzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBzZWxlY3Rpb24sIHRoZQorCQkgKiByZXR1cm5lZCBub2RlIGlzIGZpcnN0IGNvdmVyZWQgbm9kZSBmb3VuZCBpbiBhIHRvcC1kb3duIHRyYXZlcnNhbCBvZiB0aGUgQVNUCisJCSAqIEByZXR1cm4gQVNUTm9kZQorCQkgKi8KKwkJcHVibGljIEFTVE5vZGUgZ2V0Q292ZXJlZE5vZGUoKSB7CisJCQlyZXR1cm4gdGhpcy5mQ292ZXJlZE5vZGU7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgY292ZXJpbmcgbm9kZS4gSWYgbW9yZSB0aGFuIG9uZSBub2RlcyBhcmUgY292ZXJpbmcgdGhlIHNlbGVjdGlvbiwgdGhlCisJCSAqIHJldHVybmVkIG5vZGUgaXMgbGFzdCBjb3ZlcmluZyBub2RlIGZvdW5kIGluIGEgdG9wLWRvd24gdHJhdmVyc2FsIG9mIHRoZSBBU1QKKwkJICogQHJldHVybiBBU1ROb2RlCisJCSAqLworCQlwdWJsaWMgQVNUTm9kZSBnZXRDb3ZlcmluZ05vZGUoKSB7CisJCQlyZXR1cm4gdGhpcy5mQ292ZXJpbmdOb2RlOworCQl9CisJfQorCS8qKgorCSAqIE1hcHMgYSBzZWxlY3Rpb24gdG8gYSBnaXZlbiBBU1ROb2RlLCB3aGVyZSB0aGUgc2VsZWN0aW9uIGlzIGRlZmluZWQgdXNpbmcgYSBzdGFydCBhbmQgYSBsZW5ndGguCisJICogVGhlIHJlc3VsdCBub2RlIGlzIGRldGVybWluZWQgYXMgZm9sbG93czoKKwkgKiA8dWw+CisJICogICA8bGk+Zmlyc3QgdGhlIHZpc2l0b3IgdHJpZXMgdG8gZmluZCBhIG5vZGUgd2l0aCB0aGUgZXhhY3QgPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZCA8Y29kZT5sZW5ndGg8L2NvZGU+PC9saT4KKwkgKiAgIDxsaT5pZiBubyBzdWNoIG5vZGUgZXhpc3RzIHRoZW4gdGhlIG5vZGUgdGhhdCBlbmNsb3NlcyB0aGUgcmFuZ2UgZGVmaW5lZCBieQorCSAqICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+bGVuZ3RoPC9jb2RlPiBpcyByZXR1cm5lZC48L2xpPgorCSAqICAgPGxpPmlmIHRoZSBsZW5ndGggaXMgemVybyB0aGVuIGFsc28gbm9kZXMgYXJlIGNvbnNpZGVyZWQgd2hlcmUgdGhlIG5vZGUncworCSAqICAgICAgIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBtYXRjaGVzIDxjb2RlPnN0YXJ0PC9jb2RlPi48L2xpPgorCSAqICAgPGxpPm90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC48L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBub2RlIGZyb20gd2hpY2ggdGhlIHNlYXJjaCBzdGFydHMKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIGdpdmVuIHN0YXJ0CisJICogQHBhcmFtIGxlbmd0aCB0aGUgZ2l2ZW4gbGVuZ3RoCisJICoKKwkgKiBAcmV0dXJuIHRoZSBmb3VuZCBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBBU1ROb2RlIHBlcmZvcm0oQVNUTm9kZSByb290LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKwkJTm9kZUZpbmRlciBmaW5kZXIgPSBuZXcgTm9kZUZpbmRlcihyb290LCBzdGFydCwgbGVuZ3RoKTsKKwkJQVNUTm9kZSByZXN1bHQ9IGZpbmRlci5nZXRDb3ZlcmVkTm9kZSgpOworCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldFN0YXJ0UG9zaXRpb24oKSAhPSBzdGFydCB8fCByZXN1bHQuZ2V0TGVuZ3RoKCkgIT0gbGVuZ3RoKSB7CisJCQlyZXR1cm4gZmluZGVyLmdldENvdmVyaW5nTm9kZSgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogTWFwcyBhIHNlbGVjdGlvbiB0byBhIGdpdmVuIEFTVE5vZGUsIHdoZXJlIHRoZSBzZWxlY3Rpb24gaXMgZGVmaW5lZCB1c2luZyBhIHNvdXJjZSByYW5nZS4KKwkgKiBJdCBjYWxscyA8Y29kZT5wZXJmb3JtKHJvb3QsIHJhbmdlLmdldE9mZnNldCgpLCByYW5nZS5nZXRMZW5ndGgoKSk8L2NvZGU+LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBub2RlCisJICogQHNlZSAjcGVyZm9ybShBU1ROb2RlLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFTVE5vZGUgcGVyZm9ybShBU1ROb2RlIHJvb3QsIElTb3VyY2VSYW5nZSByYW5nZSkgeworCQlyZXR1cm4gcGVyZm9ybShyb290LCByYW5nZS5nZXRPZmZzZXQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpOworCX0KKworCS8qKgorCSAqIE1hcHMgYSBzZWxlY3Rpb24gdG8gYSBnaXZlbiBBU1ROb2RlLCB3aGVyZSB0aGUgc2VsZWN0aW9uIGlzIGdpdmVuIGJ5IGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgorCSAqIFRoZSByZXN1bHQgbm9kZSBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6CisJICogPHVsPgorCSAqICAgPGxpPmZpcnN0IHRoZSB2aXNpdG9yIHRyaWVzIHRvIGZpbmQgYSBub2RlIHRoYXQgaXMgY292ZXJlZCBieSA8Y29kZT5zdGFydDwvY29kZT4gYW5kCisJICogICAgICAgPGNvZGU+bGVuZ3RoPC9jb2RlPiB3aGVyZSBlaXRoZXIgPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZCA8Y29kZT5sZW5ndGg8L2NvZGU+IGV4YWN0bHkKKwkgKiAgICAgICBtYXRjaGVzIHRoZSBub2RlIG9yIHdoZXJlIHRoZSB0ZXh0IGNvdmVyZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgbm9kZSBvbmx5IGNvbnNpc3RzCisJICogICAgICAgb2Ygd2hpdGUgc3BhY2VzIG9yIGNvbW1lbnRzLjwvbGk+CisJICogICA8bGk+aWYgbm8gc3VjaCBub2RlIGV4aXN0cyB0aGVuIHRoZSBub2RlIHRoYXQgZW5jbG9zZXMgdGhlIHJhbmdlIGRlZmluZWQgYnkKKwkgKiAgICAgICA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmxlbmd0aDwvY29kZT4gaXMgcmV0dXJuZWQuPC9saT4KKwkgKiAgIDxsaT5pZiB0aGUgbGVuZ3RoIGlzIHplcm8gdGhlbiBhbHNvIG5vZGVzIGFyZSBjb25zaWRlcmVkIHdoZXJlIHRoZSBub2RlJ3MKKwkgKiAgICAgICBzdGFydCBvciBlbmQgcG9zaXRpb24gbWF0Y2hlcyA8Y29kZT5zdGFydDwvY29kZT4uPC9saT4KKwkgKiAgIDxsaT5vdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIHJvb3QgdGhlIHJvb3Qgbm9kZSBmcm9tIHdoaWNoIHRoZSBzZWFyY2ggc3RhcnRzCisJICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydAorCSAqIEBwYXJhbSBsZW5ndGggdGhlIGdpdmVuIGxlbmd0aAorCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAorCSAqCisJICogQHJldHVybiB0aGUgcmVzdWx0IG5vZGUKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIEphdmEgbW9kZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFTVE5vZGUgcGVyZm9ybShBU1ROb2RlIHJvb3QsIGludCBzdGFydCwgaW50IGxlbmd0aCwgSVR5cGVSb290IHNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCU5vZGVGaW5kZXIgZmluZGVyID0gbmV3IE5vZGVGaW5kZXIocm9vdCwgc3RhcnQsIGxlbmd0aCk7CisJCUFTVE5vZGUgcmVzdWx0PSBmaW5kZXIuZ2V0Q292ZXJlZE5vZGUoKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWludCBub2RlU3RhcnQ9IHJlc3VsdC5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWlmIChzdGFydCA8PSBub2RlU3RhcnQgJiYgKChub2RlU3RhcnQgKyByZXN1bHQuZ2V0TGVuZ3RoKCkpIDw9IChzdGFydCArIGxlbmd0aCkpKSB7CisJCQlJQnVmZmVyIGJ1ZmZlcj0gc291cmNlLmdldEJ1ZmZlcigpOworCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisJCQkJSVNjYW5uZXIgc2Nhbm5lcj0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCQkJdHJ5IHsKKwkJCQkJc2Nhbm5lci5zZXRTb3VyY2UoYnVmZmVyLmdldFRleHQoc3RhcnQsIGxlbmd0aCkudG9DaGFyQXJyYXkoKSk7CisJCQkJCWludCB0b2tlbj0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQkJaWYgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSB7CisJCQkJCQlpbnQgdFN0YXJ0PSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJCWlmICh0U3RhcnQgPT0gcmVzdWx0LmdldFN0YXJ0UG9zaXRpb24oKSAtIHN0YXJ0KSB7CisJCQkJCQkJc2Nhbm5lci5yZXNldFRvKHRTdGFydCArIHJlc3VsdC5nZXRMZW5ndGgoKSwgbGVuZ3RoIC0gMSk7CisJCQkJCQkJdG9rZW49IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJCQkJaWYgKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKQorCQkJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUwMDEKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmaW5kZXIuZ2V0Q292ZXJpbmdOb2RlKCk7CisJfQorCXByaXZhdGUgQVNUTm9kZSBmQ292ZXJpbmdOb2RlOworCXByaXZhdGUgQVNUTm9kZSBmQ292ZXJlZE5vZGU7CisKKwkvKioKKwkgKiBJbnN0YW50aWF0ZSBhIG5ldyBub2RlIGZpbmRlciB1c2luZyB0aGUgZ2l2ZW4gcm9vdCBub2RlLCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHRoZSBnaXZlbiBsZW5ndGguCisJICoKKwkgKiBAcGFyYW0gcm9vdCB0aGUgZ2l2ZW4gcm9vdCBub2RlCisJICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydAorCSAqIEBwYXJhbSBsZW5ndGggdGhlIGdpdmVuIGxlbmd0aAorCSAqLworCXB1YmxpYyBOb2RlRmluZGVyKEFTVE5vZGUgcm9vdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisJCU5vZGVGaW5kZXJWaXNpdG9yIG5vZGVGaW5kZXJWaXNpdG9yID0gbmV3IE5vZGVGaW5kZXJWaXNpdG9yKHN0YXJ0LCBsZW5ndGgpOworCQlyb290LmFjY2VwdChub2RlRmluZGVyVmlzaXRvcik7CisJCXRoaXMuZkNvdmVyZWROb2RlID0gbm9kZUZpbmRlclZpc2l0b3IuZ2V0Q292ZXJlZE5vZGUoKTsKKwkJdGhpcy5mQ292ZXJpbmdOb2RlID0gbm9kZUZpbmRlclZpc2l0b3IuZ2V0Q292ZXJpbmdOb2RlKCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvdmVyZWQgbm9kZS4gSWYgbW9yZSB0aGFuIG9uZSBub2RlcyBhcmUgY292ZXJlZCBieSB0aGUgc2VsZWN0aW9uLCB0aGUKKwkgKiByZXR1cm5lZCBub2RlIGlzIGZpcnN0IGNvdmVyZWQgbm9kZSBmb3VuZCBpbiBhIHRvcC1kb3duIHRyYXZlcnNhbCBvZiB0aGUgQVNULgorCSAqCisJICogQHJldHVybiB0aGUgY292ZXJlZCBub2RlCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q292ZXJlZE5vZGUoKSB7CisJCXJldHVybiB0aGlzLmZDb3ZlcmVkTm9kZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb3ZlcmluZyBub2RlLiBJZiBtb3JlIHRoYW4gb25lIG5vZGVzIGFyZSBjb3ZlcmluZyB0aGUgc2VsZWN0aW9uLCB0aGUKKwkgKiByZXR1cm5lZCBub2RlIGlzIGxhc3QgY292ZXJpbmcgbm9kZSBmb3VuZCBpbiBhIHRvcC1kb3duIHRyYXZlcnNhbCBvZiB0aGUgQVNULgorCSAqCisJICogQHJldHVybiB0aGUgY292ZXJpbmcgbm9kZQorCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENvdmVyaW5nTm9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuZkNvdmVyaW5nTm9kZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05vZGVTZWFyY2hlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob2RlU2VhcmNoZXIuamF2YQppbmRleCA5MGQwNzAwLi40YTE0NGFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05vZGVTZWFyY2hlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTm9kZVNlYXJjaGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNyArMjQsNyBAQAogCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgZm91bmQ7CiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlOwogCXB1YmxpYyBpbnQgcG9zaXRpb247Ci0JCisKIAlOb2RlU2VhcmNoZXIoaW50IHBvc2l0aW9uKSB7CiAJCXRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKIAl9CkBAIC0zMyw5ICszMyw5IEBACiAJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwKIAkJQ2xhc3NTY29wZSBzY29wZSkgewogCi0JCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gcG9zaXRpb24KLQkJCSYmIHBvc2l0aW9uIDw9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQkJCQlmb3VuZCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb247CisJCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gdGhpcy5wb3NpdGlvbgorCQkJJiYgdGhpcy5wb3NpdGlvbiA8PSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCQkJdGhpcy5mb3VuZCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb247CiAJCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXJldHVybiB0cnVlOwpAQCAtNDQsMTggKzQ0LDE4IEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwKIAkJTWV0aG9kU2NvcGUgc2NvcGUpIHsKLQkJCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gcG9zaXRpb24KLQkJCQkmJiBwb3NpdGlvbiA8PSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7Ci0JCQkJCWZvdW5kID0gZmllbGREZWNsYXJhdGlvbjsKKwkJCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gdGhpcy5wb3NpdGlvbgorCQkJCSYmIHRoaXMucG9zaXRpb24gPD0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCkgeworCQkJCQl0aGlzLmZvdW5kID0gZmllbGREZWNsYXJhdGlvbjsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcmV0dXJuIHRydWU7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7Ci0JCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHBvc2l0aW9uCi0JCQkmJiBwb3NpdGlvbiA8PSBpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCkgewotCQkJCWZvdW5kID0gaW5pdGlhbGl6ZXI7CisJCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHRoaXMucG9zaXRpb24KKwkJCSYmIHRoaXMucG9zaXRpb24gPD0gaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKKwkJCQl0aGlzLmZvdW5kID0gaW5pdGlhbGl6ZXI7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXJldHVybiB0cnVlOwpAQCAtNjQsMjIgKzY0LDIyIEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sCiAJCUNsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCWlmIChtZW1iZXJUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSBwb3NpdGlvbgotCQkJCSYmIHBvc2l0aW9uIDw9IG1lbWJlclR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCkgewotCQkJCQllbmNsb3NpbmdUeXBlID0gbWVtYmVyVHlwZURlY2xhcmF0aW9uOworCQkJaWYgKG1lbWJlclR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHRoaXMucG9zaXRpb24KKwkJCQkmJiB0aGlzLnBvc2l0aW9uIDw9IG1lbWJlclR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCkgeworCQkJCQl0aGlzLmVuY2xvc2luZ1R5cGUgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb247CiAJCQkJCXJldHVybiB0cnVlOwogCiAJCQl9Ci0JCQlyZXR1cm4gZmFsc2U7CQkKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sCiAJCUNsYXNzU2NvcGUgc2NvcGUpIHsKIAotCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSBwb3NpdGlvbgotCQkJJiYgcG9zaXRpb24gPD0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQkJCQlmb3VuZCA9IG1ldGhvZERlY2xhcmF0aW9uOworCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSB0aGlzLnBvc2l0aW9uCisJCQkmJiB0aGlzLnBvc2l0aW9uIDw9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCQkJdGhpcy5mb3VuZCA9IG1ldGhvZERlY2xhcmF0aW9uOwogCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKQEAgLTg4LDEyICs4OCwxMiBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAogCQlDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHBvc2l0aW9uCi0JCQkJJiYgcG9zaXRpb24gPD0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7Ci0JCQkJCWVuY2xvc2luZ1R5cGUgPSB0eXBlRGVjbGFyYXRpb247CisJCQlpZiAodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gdGhpcy5wb3NpdGlvbgorCQkJCSYmIHRoaXMucG9zaXRpb24gPD0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCQkJCXRoaXMuZW5jbG9zaW5nVHlwZSA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQlyZXR1cm4gZmFsc2U7CQkKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTm9ybWFsQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob3JtYWxBbm5vdGF0aW9uLmphdmEKaW5kZXggY2RhMzc5My4uMjM0MzgzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob3JtYWxBbm5vdGF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Ob3JtYWxBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMzAgKzIxLDMxIEBACiAgKiAgIDxiPkA8L2I+IFR5cGVOYW1lIDxiPig8L2I+IFsgTWVtYmVyVmFsdWVQYWlyIHsgPGI+LDwvYj4gTWVtYmVyVmFsdWVQYWlyIH0gXSA8Yj4pPC9iPgogICogPC9wcmU+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5vcm1hbEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAidHlwZU5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlTmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9OQU1FX1BST1BFUlRZID0KIAkJaW50ZXJuYWxUeXBlTmFtZVByb3BlcnR5RmFjdG9yeShOb3JtYWxBbm5vdGF0aW9uLmNsYXNzKTsKIAogCS8qKgotCSAqIFRoZSAidmFsdWVzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidmFsdWVzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBWQUxVRVNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBWQUxVRVNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKE5vcm1hbEFubm90YXRpb24uY2xhc3MsICJ2YWx1ZXMiLCBNZW1iZXJWYWx1ZVBhaXIuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KE5vcm1hbEFubm90YXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC01MiwzNSArNTMsMzUgQEAKIAkJYWRkUHJvcGVydHkoVkFMVUVTX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SUyA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUgQVNULkpMUyogY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCisKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBtZW1iZXIgdmFsdWUgcGFpcnMgKGVsZW1lbnQgdHlwZTogCi0JICogPGNvZGUgTWVtYmVyVmFsdWVQYWlyPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgbWVtYmVyIHZhbHVlIHBhaXJzIChlbGVtZW50IHR5cGU6CisJICoge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB2YWx1ZXMgPSAKKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdmFsdWVzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoVkFMVUVTX1BST1BFUlRZKTsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlIG93bmVkIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlIG93bmVkCiAJICogYnkgdGhlIGdpdmVuIEFTVC4gIEJ5IGRlZmF1bHQsIHRoZSBhbm5vdGF0aW9uIGhhcyBhbgogCSAqIHVuc3BlY2lmaWVkIHR5cGUgbmFtZSBhbmQgYW4gZW1wdHkgbGlzdCBvZiBtZW1iZXIgdmFsdWUKIAkgKiBwYWlycy4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QpIHsKQEAgLTk0LDcgKzk1LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTAsNyArMTExLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE0MSwxMiArMTQyLDEyIEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlOb3JtYWxBbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGVOYW1lKChOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0VHlwZU5hbWUoKSkpOwogCQlyZXN1bHQudmFsdWVzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgdmFsdWVzKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE1NCw3ICsxNTUsNyBAQAogCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCiAJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE2NywyOCArMTY4LDI4IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgbWVtYmVyIHZhbHVlIHBhaXJzIGluIHRoaXMgYW5ub3RhdGlvbi4KIAkgKiBBZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzIGZyb20gdGhpcyBsaXN0IGFmZmVjdHMgdGhpcyBub2RlCi0JICogZHluYW1pY2FsbHkuIEFsbCBub2RlcyBpbiB0aGlzIGxpc3QgbXVzdCBiZSAKLQkgKiB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfXM7IGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIgCisJICogZHluYW1pY2FsbHkuIEFsbCBub2RlcyBpbiB0aGlzIGxpc3QgbXVzdCBiZQorCSAqIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9czsgYXR0ZW1wdHMgdG8gYWRkIGFueSBvdGhlcgogCSAqIHR5cGUgb2Ygbm9kZSB3aWxsIHRyaWdnZXIgYW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtZW1iZXIgdmFsdWUgcGFpcnMgaW4gdGhpcyAKLQkgKiAgICBhbm5vdGF0aW9uIChlbGVtZW50IHR5cGU6IDxjb2RlPk1lbWJlclZhbHVlUGFpcjwvY29kZT4pCi0JICovIAorCSAqCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIG1lbWJlciB2YWx1ZSBwYWlycyBpbiB0aGlzCisJICogICAgYW5ub3RhdGlvbiAoZWxlbWVudCB0eXBlOiB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCB2YWx1ZXMoKSB7CiAJCXJldHVybiB0aGlzLnZhbHVlczsKIAl9Ci0JCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVsbExpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVsbExpdGVyYWwuamF2YQppbmRleCBhMjZmYjVlLi4zZDNmNmQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bGxMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdWxsTGl0ZXJhbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDE4ICsxNiwxOSBAQAogCiAvKioKICAqIE51bGwgbGl0ZXJhbCBub2RlLgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBOdWxsTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChOdWxsTGl0ZXJhbC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTM3LDI0ICszOCwyNCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJTnVsbExpdGVyYWwoQVNUIGFzdCkgewpAQCAtNjcsNyArNjgsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTgwLDcgKzgxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCU51bGxMaXRlcmFsIHJlc3VsdCA9IG5ldyBOdWxsTGl0ZXJhbCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC05OSwxNCArMTAwLDE0IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVtYmVyTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdW1iZXJMaXRlcmFsLmphdmEKaW5kZXggMGQ1Yjk3MC4uYTFlYjA4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdW1iZXJMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdW1iZXJMaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMjUgKzIwLDI2IEBACiAKIC8qKgogICogTnVtYmVyIGxpdGVyYWwgbm9kZXMuCi0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIE51bWJlckxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAogCS8qKgotCSAqIFRoZSAidG9rZW4iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0b2tlbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIFN0cmluZ30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBUT0tFTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIFRPS0VOX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihOdW1iZXJMaXRlcmFsLmNsYXNzLCAidG9rZW4iLCBTdHJpbmcuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoTnVtYmVyTGl0ZXJhbC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTQ5LDE4ICs1MCwxOCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIHRva2VuIHN0cmluZzsgZGVmYXVsdHMgdG8gdGhlIGludGVnZXIgbGl0ZXJhbCAiMCIuCiAJICovCkBAIC03Miw3ICs3Myw3IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJTnVtYmVyTGl0ZXJhbChBU1QgYXN0KSB7CkBAIC04NSw3ICs4Niw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTAxLDcgKzEwMiw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE0LDcgKzExNSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlOdW1iZXJMaXRlcmFsIHJlc3VsdCA9IG5ldyBOdW1iZXJMaXRlcmFsKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFRva2VuKGdldFRva2VuKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTEzNCwyNCArMTM1LDI0IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdG9rZW4gb2YgdGhpcyBudW1iZXIgbGl0ZXJhbCBub2RlLiBUaGUgdmFsdWUgaXMgdGhlIHNlcXVlbmNlCiAJICogb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIHByb2dyYW0uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBudW1lcmljIGxpdGVyYWwgdG9rZW4KLQkgKi8gCisJICovCiAJcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKIAkJcmV0dXJuIHRoaXMudG9rZW5WYWx1ZTsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgdG9rZW4gb2YgdGhpcyBudW1iZXIgbGl0ZXJhbCBub2RlLiBUaGUgdmFsdWUgaXMgdGhlIHNlcXVlbmNlCiAJICogb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIHByb2dyYW0uCi0JICogCisJICoKIAkgKiBAcGFyYW0gdG9rZW4gdGhlIG51bWVyaWMgbGl0ZXJhbCB0b2tlbgogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIHRva2VuKSB7CiAJCS8vIHVwZGF0ZSBpbnRlcm5hbFNldFRva2VuKFN0cmluZykgaWYgdGhpcyBpcyBjaGFuZ2VkCiAJCWlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmxlbmd0aCgpID09IDApIHsKQEAgLTE4Miw3ICsxODMsNyBAQAogCQkJCQkJZGVmYXVsdDoKIAkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciBsaXRlcmFsIDogPiIgKyB0b2tlbiArICI8Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQkJCX0KLQkJCQkJYnJlYWs7CQkKKwkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBudW1iZXIgbGl0ZXJhbCA6ID4iICsgdG9rZW4gKyAiPCIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQl9CkBAIC0xOTYsNyArMTk3LDcgQEAKIAkJdGhpcy50b2tlblZhbHVlID0gdG9rZW47CiAJCXBvc3RWYWx1ZUNoYW5nZShUT0tFTl9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogVGhpcyBtZXRob2QgaXMgYSBjb3B5IG9mIHNldFRva2VuKFN0cmluZykgdGhhdCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLgogCSAqLwpAQCAtMjA5LDEwICsyMTAsMTAgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKLQkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0ICsgc3RyaW5nU2l6ZSh0b2tlblZhbHVlKTsKKwkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0ICsgc3RyaW5nU2l6ZSh0aGlzLnRva2VuVmFsdWUpOwogCQlyZXR1cm4gc2l6ZTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZUJpbmRpbmcuamF2YQppbmRleCBhNjcxNTYxLi45MGFlZmRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhY2thZ2VCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDEwICsxMywxNCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CkBAIC02OCw3ICs3Miw3IEBACiAJCQkJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U6CiAJCQkJCQlTdHJpbmcgdW5pdE5hbWUgPSAicGFja2FnZS1pbmZvLmphdmEiOyAvLyROT04tTkxTLTEkCiAJCQkJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBwa2dzW2ldLmdldENvbXBpbGF0aW9uVW5pdCh1bml0TmFtZSk7Ci0JCQkJCQlpZiAodW5pdCAhPSBudWxsKSB7CisJCQkJCQlpZiAodW5pdCAhPSBudWxsICYmIHVuaXQuZXhpc3RzKCkpIHsKIAkJCQkJCQlBU1RQYXJzZXIgcCA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwogCQkJCQkJCXAuc2V0U291cmNlKHVuaXQpOwogCQkJCQkJCXAuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwpAQCAtOTgsOSArMTAyLDEwIEBACiAJCQkJCQkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlKFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUUsIHRoaXMuYmluZGluZy5jb21wb3VuZE5hbWUpOwogCQkJCQkJaWYgKGFuc3dlciAhPSBudWxsICYmIGFuc3dlci5pc0JpbmFyeVR5cGUoKSkgewogCQkJCQkJCUlCaW5hcnlUeXBlIHR5cGUgPSBhbnN3ZXIuZ2V0QmluYXJ5VHlwZSgpOworCQkJCQkJCWNoYXJbXVtdW10gbWlzc2luZ1R5cGVOYW1lcyA9IHR5cGUuZ2V0TWlzc2luZ1R5cGVOYW1lcygpOwogCQkJCQkJCUlCaW5hcnlBbm5vdGF0aW9uW10gYmluYXJ5QW5ub3RhdGlvbnMgPSB0eXBlLmdldEFubm90YXRpb25zKCk7CiAJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZ1tdIGJpbmFyeUluc3RhbmNlcyA9Ci0JCQkJCQkJCUJpbmFyeVR5cGVCaW5kaW5nLmNyZWF0ZUFubm90YXRpb25zKGJpbmFyeUFubm90YXRpb25zLCB0aGlzLmJpbmRpbmcuZW52aXJvbm1lbnQpOworCQkJCQkJCQlCaW5hcnlUeXBlQmluZGluZy5jcmVhdGVBbm5vdGF0aW9ucyhiaW5hcnlBbm5vdGF0aW9ucywgdGhpcy5iaW5kaW5nLmVudmlyb25tZW50LCBtaXNzaW5nVHlwZU5hbWVzKTsKIAkJCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nW10gYWxsSW5zdGFuY2VzID0KIAkJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZy5hZGRTdGFuZGFyZEFubm90YXRpb25zKGJpbmFyeUluc3RhbmNlcywgdHlwZS5nZXRUYWdCaXRzKCksIHRoaXMuYmluZGluZy5lbnZpcm9ubWVudCk7CiAJCQkJCQkJaW50IHRvdGFsID0gYWxsSW5zdGFuY2VzLmxlbmd0aDsKQEAgLTEyNiwxMCArMTMxLDEwIEBACiAJICogQHNlZSBJQmluZGluZyNnZXROYW1lKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKKwkJaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CiAJCQljb21wdXRlTmFtZUFuZENvbXBvbmVudHMoKTsKIAkJfQotCQlyZXR1cm4gbmFtZTsKKwkJcmV0dXJuIHRoaXMubmFtZTsKIAl9CiAKIAkvKgpAQCAtMTQzLDEwICsxNDgsMTAgQEAKIAkgKiBAc2VlIElQYWNrYWdlQmluZGluZyNnZXROYW1lQ29tcG9uZW50cygpCiAJICovCiAJcHVibGljIFN0cmluZ1tdIGdldE5hbWVDb21wb25lbnRzKCkgewotCQlpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CisJCWlmICh0aGlzLmNvbXBvbmVudHMgPT0gbnVsbCkgewogCQkJY29tcHV0ZU5hbWVBbmRDb21wb25lbnRzKCk7CiAJCX0KLQkJcmV0dXJuIGNvbXBvbmVudHM7CisJCXJldHVybiB0aGlzLmNvbXBvbmVudHM7CiAJfQogCiAJLyoKQEAgLTE5MCwxMCArMTk1LDIwIEBACiAJcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKIAkJSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQgPSB0aGlzLmJpbmRpbmcuZW52aXJvbm1lbnQubmFtZUVudmlyb25tZW50OyAvLyBhIHBhY2thZ2UgYmluZGluZyBhbHdheXMgaGFzIGEgTG9vdXBFbnZpcm9ubWVudCBzZXQKIAkJaWYgKCEobmFtZUVudmlyb25tZW50IGluc3RhbmNlb2YgU2VhcmNoYWJsZUVudmlyb25tZW50KSkgcmV0dXJuIG51bGw7CisJCS8vIHRoaXMgaXMgbm90IHRydWUgaW4gc3RhbmRhbG9uZSBET00vQVNUCiAJCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9ICgoU2VhcmNoYWJsZUVudmlyb25tZW50KSBuYW1lRW52aXJvbm1lbnQpLm5hbWVMb29rdXA7CiAJCWlmIChuYW1lTG9va3VwID09IG51bGwpIHJldHVybiBudWxsOwogCQlJSmF2YUVsZW1lbnRbXSBwa2dzID0gbmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhnZXROYW1lKCksIGZhbHNlLypleGFjdCBtYXRjaCovKTsKIAkJaWYgKHBrZ3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWlmIChwa2dzLmxlbmd0aCA9PSAwKSB7CisJCQkvLyBhZGQgYWRkaXRpb25hbCB0cmFjaW5nIGFzIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5sb2coCisJCQkJbmV3IFN0YXR1cygKKwkJCQkJCUlTdGF0dXMuV0FSTklORywKKwkJCQkJCUphdmFDb3JlLlBMVUdJTl9JRCwKKwkJCQkJCSJTZWFyY2hpbmcgZm9yIHBhY2thZ2UgIiArIGdldE5hbWUoKSArICIgcmV0dXJucyBhbiBlbXB0eSBhcnJheSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm4gbnVsbDsKKwkJfQogCQlyZXR1cm4gcGtnc1swXTsKIAl9CiAKQEAgLTIyNywxOSArMjQyLDE5IEBACiAJcHJpdmF0ZSB2b2lkIGNvbXB1dGVOYW1lQW5kQ29tcG9uZW50cygpIHsKIAkJY2hhcltdW10gY29tcG91bmROYW1lID0gdGhpcy5iaW5kaW5nLmNvbXBvdW5kTmFtZTsKIAkJaWYgKGNvbXBvdW5kTmFtZSA9PSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiB8fCBjb21wb3VuZE5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IFVOTkFNRUQ7Ci0JCQljb21wb25lbnRzID0gTk9fTkFNRV9DT01QT05FTlRTOworCQkJdGhpcy5uYW1lID0gVU5OQU1FRDsKKwkJCXRoaXMuY29tcG9uZW50cyA9IE5PX05BTUVfQ09NUE9ORU5UUzsKIAkJfSBlbHNlIHsKIAkJCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOwotCQkJY29tcG9uZW50cyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJCXRoaXMuY29tcG9uZW50cyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewotCQkJCWNvbXBvbmVudHNbaV0gPSBuZXcgU3RyaW5nKGNvbXBvdW5kTmFtZVtpXSk7CisJCQkJdGhpcy5jb21wb25lbnRzW2ldID0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbaV0pOwogCQkJCWJ1ZmZlci5hcHBlbmQoY29tcG91bmROYW1lW2ldKS5hcHBlbmQoUEFDS0FHRV9OQU1FX1NFUEFSQVRPUik7CiAJCQl9Ci0JCQljb21wb25lbnRzW2xlbmd0aCAtIDFdID0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbbGVuZ3RoIC0gMV0pOworCQkJdGhpcy5jb21wb25lbnRzW2xlbmd0aCAtIDFdID0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbbGVuZ3RoIC0gMV0pOwogCQkJYnVmZmVyLmFwcGVuZChjb21wb3VuZE5hbWVbbGVuZ3RoIC0gMV0pOwotCQkJbmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOworCQkJdGhpcy5uYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDljOGE4NmQuLjAzZTFiYTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSw1NCArMzEsNTUgQEAKICAqIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiB3aGVuIGl0IG9jY3VycyBpbiB0aGUKICAqIHNwZWNpYWwgPGNvZGU+cGFja2FnZS1pbmZvLmphdmE8L2NvZGU+IGNvbXBpbGF0aW9uIHVuaXQgKEpMUzMgNy40LjEuMSkuCiAgKiBUaGUgSmF2YWRvYyBjb21tZW50IGluIHRoYXQgZmlsZSBjb250YWlucyB0aGUgcGFja2FnZSBkZXNjcmlwdGlvbi4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJqYXZhZG9jIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgSmF2YWRvY30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEpBVkFET0NfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzLCAiamF2YWRvYyIsIEphdmFkb2MuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJhbm5vdGF0aW9ucyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAiYW5ub3RhdGlvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFubm90YXRpb259KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBBTk5PVEFUSU9OU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFOTk9UQVRJT05TX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihQYWNrYWdlRGVjbGFyYXRpb24uY2xhc3MsICJhbm5vdGF0aW9ucyIsIEFubm90YXRpb24uY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzLCAibmFtZSIsIE5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18yXzA7Ci0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwogCQlhZGRQcm9wZXJ0eShOQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChQYWNrYWdlRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEpBVkFET0NfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CkBAIC05MCwxMSArOTEsMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMDUsNyArMTA2LDcgQEAKIAkJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7CiAJCX0KIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBkb2MgY29tbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KIAkgKiBEZWZhdWx0cyB0byBub25lLgpAQCAtMTE0LDEzICsxMTUsMTMgQEAKIAlKYXZhZG9jIG9wdGlvbmFsRG9jQ29tbWVudCA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgYW5ub3RhdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+QW5ub3RhdGlvbjwvY29kZT4pLiAKKwkgKiBUaGUgYW5ub3RhdGlvbnMgKGVsZW1lbnQgdHlwZToge0BsaW5rIEFubm90YXRpb259KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGFubm90YXRpb25zID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCBKYXZhIHBhY2thZ2UgaWRlbnRpZmllci4KQEAgLTEzMiwxMSArMTMzLDExIEBACiAJICogZ2l2ZW4gQVNULiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbml0aWFsbHkgaGFzIGFuIHVuc3BlY2lmaWVkLAogCSAqIGJ1dCBsZWdhbCwgSmF2YSBpZGVudGlmaWVyOyBhbmQgYW4gZW1wdHkgbGlzdCBvZiBhbm5vdGF0aW9ucy4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAotCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZQogCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJUGFja2FnZURlY2xhcmF0aW9uKEFTVCBhc3QpIHsKQEAgLTE1Miw3ICsxNTMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE3Niw3ICsxNzcsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjAwLDcgKzIwMSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlQYWNrYWdlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA+PSBBU1QuSkxTMykgewogCQkJcmVzdWx0LnNldEphdmFkb2MoKEphdmFkb2MpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRKYXZhZG9jKCkpKTsKIAkJCXJlc3VsdC5hbm5vdGF0aW9ucygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGFubm90YXRpb25zKCkpKTsKQEAgLTIzMSwxNyArMjMyLDE3IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBhbm5vdGF0aW9ucyBvZiB0aGlzIAorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFubm90YXRpb25zIG9mIHRoaXMKIAkgKiBwYWNrYWdlIGRlY2xhcmF0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgQW5ub3RhdGlvbn0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgYW5ub3RhdGlvbnMoKSB7CiAJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4ganVzdCBjYWxsaW5nIHVuc3VwcG9ydGVkSW4yKCkgdG8gY2hlY2sKIAkJaWYgKHRoaXMuYW5ub3RhdGlvbnMgPT0gbnVsbCkgewpAQCAtMjQ5LDEwICsyNTAsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBkb2MgY29tbWVudCBub2RlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZG9jIGNvbW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKQEAgLTI2OCw3ICsyNjksNyBAQAogCiAJLyoqCiAJICogU2V0cyBvciBjbGVhcnMgdGhlIGRvYyBjb21tZW50IG5vZGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZG9jQ29tbWVudCB0aGUgZG9jIGNvbW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkb2MgY29tbWVudCBzdHJpbmcgaXMgaW52YWxpZAogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgpAQCAtMjg4LDkgKzI4OSw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKHRoaXMucGFja2FnZU5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTMwNCwxNyArMzA1LDE3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbiB0byB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgcGFja2FnZSBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWZgOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5hbWUpIHsKIAkJaWYgKG5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzI0LDcgKzMyNSw3IEBACiAJCXRoaXMucGFja2FnZU5hbWUgPSBuYW1lOwogCQlwb3N0UmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuYW1lLCBOQU1FX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UgZGVjbGFyZWQgaW4gdGhpcyBwYWNrYWdlCiAJICogZGVjbGFyYXRpb24uCkBAIC0zMzIsMjEgKzMzMywyMSBAQAogCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKIAkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZQogCSAqICAgIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBJUGFja2FnZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlUGFja2FnZSh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhcmFtZXRlcml6ZWRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhcmFtZXRlcml6ZWRUeXBlLmphdmEKaW5kZXggOGU1MDk0Yy4uNGM2ZmM5YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJhbWV0ZXJpemVkVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFyYW1ldGVyaXplZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwzNCArMjQsMzUgQEAKICAqIDwvcHJlPgogICogVGhlIGZpcnN0IHR5cGUgbWF5IGJlIGEgc2ltcGxlIHR5cGUgb3IgYSBxdWFsaWZpZWQgdHlwZTsKICAqIG90aGVyIGtpbmRzIG9mIHR5cGVzIGFyZSBtZWFuaW5nbGVzcy4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyaXplZFR5cGUgZXh0ZW5kcyBUeXBlIHsKICAgICAvKioKICAgICAgKiBUaGlzIGluZGV4IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIGluc2lkZSBhIHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkIHR5cGUuCiAgICAgICovCiAgICAgaW50IGluZGV4OwotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUGFyYW1ldGVyaXplZFR5cGUuY2xhc3MsICJ0eXBlIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidHlwZUFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfQVJHVU1FTlRTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLCAidHlwZUFyZ3VtZW50cyIsIFR5cGUuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtNjMsMzAgKzY0LDMwIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKLQkvKiogCisKKwkvKioKIAkgKiBUaGUgdHlwZSBub2RlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2ZpZWQsIGJ1dCBsZWdhbCwKIAkgKiB0eXBlLgogCSAqLwogCXByaXZhdGUgVHlwZSB0eXBlID0gbnVsbDsKLQkKKwogCS8qKgotCSAqIFRoZSB0eXBlIGFyZ3VtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikuIAorCSAqIFRoZSB0eXBlIGFyZ3VtZW50cyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHR5cGVBcmd1bWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChUWVBFX0FSR1VNRU5UU19QUk9QRVJUWSk7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYSBwYXJhbWV0ZXJpemVkIHR5cGUgb3duZWQgYnkgdGhlCiAJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCB0eXBlLCBhbmQgbm8gdHlwZQpAQCAtOTQsNyArOTUsNyBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVBhcmFtZXRlcml6ZWRUeXBlKEFTVCBhc3QpIHsKQEAgLTEwOCw3ICsxMDksNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNCw3ICsxMjUsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlQYXJhbWV0ZXJpemVkVHlwZSByZXN1bHQgPSBuZXcgUGFyYW1ldGVyaXplZFR5cGUodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0VHlwZSgoVHlwZSkgKChBU1ROb2RlKSBnZXRUeXBlKCkpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQudHlwZUFyZ3VtZW50cygpLmFkZEFsbCgKIAkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgdHlwZUFyZ3VtZW50cygpKSk7CkBAIC0xNzUsMTIgKzE3NiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcml6ZWQgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXJpemVkIHR5cGUKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHRoaXMudHlwZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTk0LDE3ICsxOTUsMTcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy50eXBlOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXJpemVkIHR5cGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXJpemVkIHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CiAJCWlmICh0eXBlID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIxNiwxNyArMjE3LDIxIEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMgb2YgdGhpcyBwYXJhbWV0ZXJpemVkIAorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoaXMgcGFyYW1ldGVyaXplZAogCSAqIHR5cGUuIEZvciB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIHRvIGJlIHBsYXVzaWJsZSwgdGhlIGxpc3Qgc2hvdWxkIGNvbnRhaW4KLQkgKiBhdCBsZWFzdCBvbmUgZWxlbWVudCBhbmQgbm90IGNvbnRhaW4gcHJpbWl0aXZlIHR5cGVzLgotCSAqIAorCSAqIGF0IGxlYXN0IG9uZSBlbGVtZW50IGFuZCBub3QgY29udGFpbiBwcmltaXRpdmUgb3IgdW5pb24gdHlwZXMuCisJICogPHA+CisJICogU2luY2Uge0BsaW5rIEFTVCNKTFM0fSwgdGhlIGxpc3QgY2FuIGFsc28gYmUgZW1wdHkgaWYgdGhpcyBpcyB0aGUgdHlwZSBvZiBhCisJICoge0BsaW5rIENsYXNzSW5zdGFuY2VDcmVhdGlvbn0gKGEgc28tY2FsbGVkICJkaWFtb25kIikuCisJICogPC9wPgorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHR5cGUgYXJndW1lbnRzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pCi0JICovIAorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCB0eXBlQXJndW1lbnRzKCkgewogCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjM0LDEyICsyMzksMTIgQEAKIAkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDMgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy50eXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCiAJCQkrIHRoaXMudHlwZUFyZ3VtZW50cy5saXN0U2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhCmluZGV4IDZjNTM0ZTYuLmJhOTdiNDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjUgKzIxLDI2IEBACiAgKiBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjoKICAqICAgICA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUGFyZW50aGVzaXplZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jbGFzcywgImV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtNTAsMTcgKzUxLDE3IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCiAJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAogCSAqIGV4cHJlc3Npb24uCkBAIC02OCwxMyArNjksMTMgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gaGFzIGFuIHVuc3BlY2lmaWVkLCBidXQKIAkgKiBsZWdhbCwgZXhwcmVzc2lvbi4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihBU1QgYXN0KSB7CkBAIC04Nyw3ICs4OCw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTAzLDcgKzEwNCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTYsMTEgKzExNywxMSBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEzOSwxMiArMTQwLDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE1OCwxMCArMTU5LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBuZXcgZXhwcmVzc2lvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMTY5LDcgKzE3MCw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0xODYsMTIgKzE4NywxMiBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Bvc3RmaXhFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKaW5kZXggZjdmNmJmOC4uZGE4ODM3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUG9zdGZpeEV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMyw4ICsyMyw5IEBACiAgKiBQb3N0Zml4RXhwcmVzc2lvbjoKICAqICAgIEV4cHJlc3Npb24gUG9zdGZpeE9wZXJhdG9yCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUG9zdGZpeEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKIApAQCAtMzcsMzkgKzM4LDM5IEBACiAJICogPC9wcmU+CiAJICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBPcGVyYXRvciB7Ci0JCisKIAkJLyoqCiAJCSAqIFRoZSB0b2tlbiBmb3IgdGhlIG9wZXJhdG9yLgogCQkgKi8KIAkJcHJpdmF0ZSBTdHJpbmcgdG9rZW47Ci0JCQorCiAJCS8qKgogCQkgKiBDcmVhdGVzIGEgbmV3IHBvc3RmaXggb3BlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uCiAJCSAqIDxwPgogCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcwogCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgogCQkgKiA8L3A+Ci0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyB0b2tlbikgewogCQkJdGhpcy50b2tlbiA9IHRva2VuOwogCQl9Ci0JCQorCiAJCS8qKgogCQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvci4KLQkJICogCisJCSAqCiAJCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRva2VuOworCQkJcmV0dXJuIHRoaXMudG9rZW47CiAJCX0KLQkJCisKIAkJLyoqIFBvc3RmaXggaW5jcmVtZW50ICIrKyIgb3BlcmF0b3IuICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgSU5DUkVNRU5UID0gbmV3IE9wZXJhdG9yKCIrKyIpOy8vJE5PTi1OTFMtMSQKIAkJLyoqIFBvc3RmaXggZGVjcmVtZW50ICItLSIgb3BlcmF0b3IuICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgREVDUkVNRU5UID0gbmV3IE9wZXJhdG9yKCItLSIpOy8vJE5PTi1OTFMtMSQKLQkJCisKIAkJLyoqCiAJCSAqIE1hcCBmcm9tIHRva2VuIHRvIG9wZXJhdG9yIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsKIAkJICogdmFsdWUgdHlwZTogPGNvZGU+T3BlcmF0b3I8L2NvZGU+KS4KQEAgLTkxLDEwICs5MiwxMCBAQAogCQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCQkgKiA8cD4KIAkJICogPGNvZGU+dG9PcGVyYXRvcjwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKLQkJICogdGhhdCBpcywgPGNvZGU+T3BlcmF0b3IudG9PcGVyYXRvcihvcC50b1N0cmluZygpKSA9PSBvcDwvY29kZT4gZm9yIAorCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IKIAkJICogYWxsIG9wZXJhdG9ycyA8Y29kZT5vcDwvY29kZT4uCiAJCSAqIDwvcD4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSB0b2tlbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKIAkJICogQHJldHVybiB0aGUgcG9zdGZpeCBvcGVyYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCQkgKi8KQEAgLTEwMiwyOCArMTAzLDI4IEBACiAJCQlyZXR1cm4gKE9wZXJhdG9yKSBDT0RFUy5nZXQodG9rZW4pOwogCQl9CiAJfQotCQorCiAJLyoqCi0JICogVGhlICJvcGVyYXRvciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm9wZXJhdG9yIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3J9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgT1BFUkFUT1JfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBPUEVSQVRPUl9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoUG9zdGZpeEV4cHJlc3Npb24uY2xhc3MsICJvcGVyYXRvciIsIFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgIm9wZXJhbmQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJvcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE9QRVJBTkRfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE9QRVJBTkRfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUG9zdGZpeEV4cHJlc3Npb24uY2xhc3MsICJvcGVyYW5kIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChQb3N0Zml4RXhwcmVzc2lvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTEzNSwyMiArMTM2LDIyIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgb3BlcmF0b3I7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkIHBvc3RmaXggb3BlcmF0b3IuCiAJICovCi0JcHJpdmF0ZSBQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvciA9IAorCXByaXZhdGUgUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IgPQogCQlQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQ7CiAKIAkvKioKQEAgLTE2MCwxMCArMTYxLDEwIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIG9wZXJhbmQgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gcG9zdGZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKLQkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSBvcGVyYXRvciBhbmQgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gcG9zdGZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbgorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5vZGUgaGFzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIG9wZXJhdG9yIGFuZAogCSAqIG9wZXJhbmQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJUG9zdGZpeEV4cHJlc3Npb24oQVNUIGFzdCkgewpAQCAtMTc2LDcgKzE3Nyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA4LDcgKzIwOSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMjEsNyArMjIyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVBvc3RmaXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvcigpKTsKIAkJcmVzdWx0LnNldE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldE9wZXJhbmQoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTI0NSwyMiArMjQ2LDIyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcGVyYXRvciBvZiB0aGlzIHBvc3RmaXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG9wZXJhdG9yCi0JICovIAorCSAqLwogCXB1YmxpYyBQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKIAkJcmV0dXJuIHRoaXMub3BlcmF0b3I7CiAJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBwb3N0Zml4IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gb3BlcmF0b3IgdGhlIG9wZXJhdG9yCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgewogCQlpZiAob3BlcmF0b3IgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjcyLDkgKzI3Myw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcGVyYW5kIG9mIHRoaXMgcG9zdGZpeCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgb3BlcmFuZCBleHByZXNzaW9uIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0T3BlcmFuZCgpIHsKIAkJaWYgKHRoaXMub3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI4OCwxMCArMjg5LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMub3BlcmFuZDsKIAl9Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgb3BlcmFuZCBvZiB0aGlzIHBvc3RmaXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvcGVyYW5kIGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI5OSw3ICszMDAsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzE3LDEyICszMTgsMTIgQEAKIAkJLy8gdHJlYXQgT3BlcmF0b3IgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMub3BlcmFuZCA9PSBudWxsID8gMCA6IGdldE9wZXJhbmQoKS50cmVlU2l6ZSgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJlZml4RXhwcmVzc2lvbi5qYXZhCmluZGV4IGM5MGYwMjMuLjMwNzEwOWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJlZml4RXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJlZml4RXhwcmVzc2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDEwICsyMSwxMSBAQAogICoKICAqIDxwcmU+CiAgKiBQcmVmaXhFeHByZXNzaW9uOgotICogICAgUHJlZml4T3BlcmF0b3IgRXhwcmVzc2lvbiAKKyAqICAgIFByZWZpeE9wZXJhdG9yIEV4cHJlc3Npb24KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBQcmVmaXhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKQEAgLTQxLDM0ICs0MiwzNCBAQAogCSAqIDwvcHJlPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlcmF0b3IgewotCQorCiAJCS8qKgogCQkgKiBUaGUgdG9rZW4gZm9yIHRoZSBvcGVyYXRvci4KIAkJICovCiAJCXByaXZhdGUgU3RyaW5nIHRva2VuOwotCQkKKwogCQkvKioKIAkJICogQ3JlYXRlcyBhIG5ldyBwcmVmaXggb3BlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uCiAJCSAqIDxwPgogCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcwogCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgogCQkgKiA8L3A+Ci0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyB0b2tlbikgewogCQkJdGhpcy50b2tlbiA9IHRva2VuOwogCQl9Ci0JCQorCiAJCS8qKgogCQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvci4KLQkJICogCisJCSAqCiAJCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCiAJCSAqLwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRva2VuOworCQkJcmV0dXJuIHRoaXMudG9rZW47CiAJCX0KLQkJCisKIAkJLyoqIFByZWZpeCBpbmNyZW1lbnQgIisrIiBvcGVyYXRvci4gKi8KIAkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBJTkNSRU1FTlQgPSBuZXcgT3BlcmF0b3IoIisrIik7Ly8kTk9OLU5MUy0xJAogCQkvKiogUHJlZml4IGRlY3JlbWVudCAiLS0iIG9wZXJhdG9yLiAqLwpAQCAtODEsNyArODIsNyBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIENPTVBMRU1FTlQgPSBuZXcgT3BlcmF0b3IoIn4iKTsvLyROT04tTkxTLTEkCiAJCS8qKiBMb2dpY2FsIGNvbXBsZW1lbnQgIiEiIG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIE5PVCA9IG5ldyBPcGVyYXRvcigiISIpOy8vJE5PTi1OTFMtMSQKLQkJCisKIAkJLyoqCiAJCSAqIE1hcCBmcm9tIHRva2VuIHRvIG9wZXJhdG9yIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsKIAkJICogdmFsdWUgdHlwZTogPGNvZGU+T3BlcmF0b3I8L2NvZGU+KS4KQEAgLTEwNywxMCArMTA4LDEwIEBACiAJCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCiAJCSAqIDxwPgogCQkgKiA8Y29kZT50b09wZXJhdG9yPC9jb2RlPiBpcyB0aGUgY29udmVyc2Ugb2YgPGNvZGU+dG9TdHJpbmc8L2NvZGU+OgotCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IgCisJCSAqIHRoYXQgaXMsIDxjb2RlPk9wZXJhdG9yLnRvT3BlcmF0b3Iob3AudG9TdHJpbmcoKSkgPT0gb3A8L2NvZGU+IGZvcgogCQkgKiBhbGwgb3BlcmF0b3JzIDxjb2RlPm9wPC9jb2RlPi4KIAkJICogPC9wPgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIHRva2VuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgogCQkgKiBAcmV0dXJuIHRoZSBwcmVmaXggb3BlcmF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkJICovCkBAIC0xMTgsMjggKzExOSwyOCBAQAogCQkJcmV0dXJuIChPcGVyYXRvcikgQ09ERVMuZ2V0KHRva2VuKTsKIAkJfQogCX0KLQkKKwogCS8qKgotCSAqIFRoZSAib3BlcmF0b3IiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJvcGVyYXRvciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3J9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgT1BFUkFUT1JfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBPUEVSQVRPUl9QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIm9wZXJhdG9yIiwgUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJvcGVyYW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAib3BlcmFuZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBPUEVSQU5EX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBPUEVSQU5EX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICJvcGVyYW5kIiwgRXhwcmVzc2lvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtMTUxLDIyICsxNTIsMjIgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBvcGVyYXRvcjsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQgcHJlZml4IG9wZXJhdG9yLgogCSAqLwotCXByaXZhdGUgUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvciA9IAorCXByaXZhdGUgUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvciA9CiAJCVByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUzsKIAogCS8qKgpAQCAtMTc2LDEwICsxNzcsMTAgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gb3BlcmFuZCA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBwcmVmaXggZXhwcmVzc2lvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCi0JICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbm9kZSBoYXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgb3BlcmF0b3IgYW5kIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIHByZWZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbgorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5vZGUgaGFzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIG9wZXJhdG9yIGFuZAogCSAqIG9wZXJhbmQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJUHJlZml4RXhwcmVzc2lvbihBU1QgYXN0KSB7CkBAIC0xOTIsNyArMTkzLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMjQsNyArMjI1LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTIzNyw3ICsyMzgsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJUHJlZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJlZml4RXhwcmVzc2lvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvcigpKTsKIAkJcmVzdWx0LnNldE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldE9wZXJhbmQoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTI2MiwyMiArMjYzLDIyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcGVyYXRvciBvZiB0aGlzIHByZWZpeCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgb3BlcmF0b3IKLQkgKi8gCisJICovCiAJcHVibGljIFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CiAJCXJldHVybiB0aGlzLm9wZXJhdG9yOwogCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIG9wZXJhdG9yIG9mIHRoaXMgcHJlZml4IGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gb3BlcmF0b3IgdGhlIG9wZXJhdG9yCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yKSB7CiAJCWlmIChvcGVyYXRvciA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yODksOSArMjkwLDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG9wZXJhbmQgb2YgdGhpcyBwcmVmaXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG9wZXJhbmQgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldE9wZXJhbmQoKSB7CiAJCWlmICh0aGlzLm9wZXJhbmQgID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0zMDUsMTAgKzMwNiwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLm9wZXJhbmQ7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG9wZXJhbmQgb2YgdGhpcyBwcmVmaXggZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvcGVyYW5kIGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTMxNiw3ICszMTcsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMzM0LDEyICszMzUsMTIgQEAKIAkJLy8gdHJlYXQgT3BlcmF0b3IgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMub3BlcmFuZCA9PSBudWxsID8gMCA6IGdldE9wZXJhbmQoKS50cmVlU2l6ZSgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByaW1pdGl2ZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJpbWl0aXZlVHlwZS5qYXZhCmluZGV4IDEzYjNlOWYuLjlhYjdjM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJpbWl0aXZlVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJpbWl0aXZlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM1LDExICszNSwxMiBAQAogICogaGF2ZSBhIHNwZWNpZmljIHBhcmVudCwgdGhlcmUgbmVlZHMgdG8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZXNlCiAgKiBub2Rlcy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFR5cGUgewotCQorCiAJLyoqCiAgCSAqIFByaW1pdGl2ZSB0eXBlIGNvZGVzICh0eXBlc2FmZSBlbnVtZXJhdGlvbikuCiAJICogPHByZT4KQEAgLTU1LDM1ICs1NiwzNSBAQAogCSAqIDwvcHJlPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29kZSB7Ci0JCisKIAkJLyoqCiAJCSAqIFRoZSBuYW1lIG9mIHRoZSB0eXBlLgogCQkgKi8KIAkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCisKIAkJLyoqCiAJCSAqIENyZWF0ZXMgYSBuZXcgcHJpbWl0aXZlIHR5cGUgY29kZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgogCQkgKiA8cD4KIAkJICogTm90ZTogdGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcwogCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgcHJpbWl0aXZlIHR5cGVzLgogCQkgKiA8L3A+Ci0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RhbmRhcmQgbmFtZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUKIAkJICovCiAJCUNvZGUoU3RyaW5nIG5hbWUpIHsKIAkJCXRoaXMubmFtZSA9IG5hbWU7CiAJCX0KLQkJCisKIAkJLyoqCiAJCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlLgotCQkgKiAKKwkJICoKIAkJICogQHJldHVybiB0aGUgc3RhbmRhcmQgbmFtZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUKIAkJICovCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKKwkJCXJldHVybiB0aGlzLm5hbWU7CiAJCX0KLQl9CQkKLQkKKwl9CisKIAkvKiogVHlwZSBjb2RlIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgImludCIuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIElOVCA9IG5ldyBDb2RlKCJpbnQiKTsvLyROT04tTkxTLTEkCiAJLyoqIFR5cGUgY29kZSBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlICJjaGFyIi4gKi8KQEAgLTEwNiwxMyArMTA3LDEzIEBACiAJICogdHlwZSBhbmQgYXMgYSB0eXBlIGxpdGVyYWwuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIFZPSUQgPSBuZXcgQ29kZSgidm9pZCIpOy8vJE5PTi1OTFMtMSQKLQkJCi0JLyoqIAorCisJLyoqCiAJICogVGhlIHByaW1pdGl2ZSB0eXBlIGNvZGU7IG9uZSBvZiB0aGUgUHJpbWl0aXZlVHlwZSBjb25zdGFudHM7IGRlZmF1bHQKIAkgKiBpcyBpbnQuCiAJICovCiAJcHJpdmF0ZSBQcmltaXRpdmVUeXBlLkNvZGUgdHlwZUNvZGUgPSBJTlQ7Ci0JCisKIAkvKioKIAkgKiBNYXAgZnJvbSB0b2tlbiB0byBwcmltaXRpdmUgdHlwZSBjb2RlIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsKIAkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5QcmltaXRpdmVUeXBlLkNvZGU8L2NvZGU+KS4KQEAgLTEzNSwzOCArMTM2LDM4IEBACiAJCQlDT0RFUy5wdXQob3BzW2ldLnRvU3RyaW5nKCksIG9wc1tpXSk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHN0cmluZywKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCSAqIDxwPgogCSAqIDxjb2RlPnRvQ29kZTwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKLQkgKiB0aGF0IGlzLCAKKwkgKiB0aGF0IGlzLAogCSAqIDxjb2RlPlByaW1pdGl2ZVR5cGUuQ29kZS50b0NvZGUoY29kZS50b1N0cmluZygpKSA9PSBjb2RlPC9jb2RlPgogCSAqIGZvciBhbGwgdHlwZSBjb2RlIDxjb2RlPmNvZGU8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0b2tlbiB0aGUgc3RhbmRhcmQgbmFtZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUKIAkgKiBAcmV0dXJuIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCiAJcHVibGljIHN0YXRpYyBQcmltaXRpdmVUeXBlLkNvZGUgdG9Db2RlKFN0cmluZyB0b2tlbikgewogCQlyZXR1cm4gKFByaW1pdGl2ZVR5cGUuQ29kZSkgQ09ERVMuZ2V0KHRva2VuKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBUaGUgInByaW1pdGl2ZVR5cGVDb2RlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAicHJpbWl0aXZlVHlwZUNvZGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBQcmltaXRpdmVUeXBlLkNvZGV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgUFJJTUlUSVZFX1RZUEVfQ09ERV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIFBSSU1JVElWRV9UWVBFX0NPREVfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFByaW1pdGl2ZVR5cGUuY2xhc3MsICJwcmltaXRpdmVUeXBlQ29kZSIsIFByaW1pdGl2ZVR5cGUuQ29kZS5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChQcmltaXRpdmVUeXBlLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtMTc3LDM4ICsxNzgsMzggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub2RlIGZvciBhIHByaW1pdGl2ZSB0eXBlIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5vZGUgaGFzIHR5cGUgImludCIuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJUHJpbWl0aXZlVHlwZShBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjM3LDcgKzIzOCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlQcmltaXRpdmVUeXBlIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVUeXBlKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFByaW1pdGl2ZVR5cGVDb2RlKGdldFByaW1pdGl2ZVR5cGVDb2RlKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTI1NywyMSArMjU4LDIxIEBACiAJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gb25lIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGlzCiAJICogICAgY2xhc3MKIAkgKi8KIAlwdWJsaWMgUHJpbWl0aXZlVHlwZS5Db2RlIGdldFByaW1pdGl2ZVR5cGVDb2RlKCkgewogCQlyZXR1cm4gdGhpcy50eXBlQ29kZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlQ29kZSBvbmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGNvZGUgY29uc3RhbnRzIGRlY2xhcmVkIGluIAorCSAqCisJICogQHBhcmFtIHR5cGVDb2RlIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZSBjb25zdGFudHMgZGVjbGFyZWQgaW4KIAkgKiAgICB0aGlzIGNsYXNzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAogCSAqLwpAQCAtMjkxLDcgKzI5Miw3IEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUXVhbGlmaWVkTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKaW5kZXggZjFlMjU1ZS4uYzc3NTNiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsMzMgKzI3LDM0IEBACiAgKiBTZWUgPGNvZGU+RmllbGRBY2Nlc3M8L2NvZGU+IGZvciBndWlkZWxpbmVzIG9uIGhhbmRsaW5nIG90aGVyIGV4cHJlc3Npb25zCiAgKiB0aGF0IHJlc2VtYmxlIHF1YWxpZmllZCBuYW1lcy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgRmllbGRBY2Nlc3MKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZSBleHRlbmRzIE5hbWUgewotCQorCiAJLyoqCi0JICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUVVBTElGSUVSX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBRVUFMSUZJRVJfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUXVhbGlmaWVkTmFtZS5jbGFzcywgInF1YWxpZmllciIsIE5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihRdWFsaWZpZWROYW1lLmNsYXNzLCAibmFtZSIsIFNpbXBsZU5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoUXVhbGlmaWVkTmFtZS5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTY1LDUwICs2Niw1MCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGxlZ2FsIAorCSAqIFRoZSBpZGVudGlmaWVyOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGxlZ2FsCiAJICogSmF2YSBpZGVudGlmaWVyLgogCSAqLwogCXByaXZhdGUgTmFtZSBxdWFsaWZpZXIgPSBudWxsOwotCQorCiAJLyoqCiAJICogVGhlIG5hbWUgYmVpbmcgcXVhbGlmaWVkOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgogCSAqLwogCXByaXZhdGUgU2ltcGxlTmFtZSBuYW1lID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgcXVhbGlmaWVkIG5hbWUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAotCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZQogCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJUXVhbGlmaWVkTmFtZShBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTMyLDcgKzEzMyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDUsNyArMTQ2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZE5hbWUodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0UXVhbGlmaWVyKChOYW1lKSBnZXRRdWFsaWZpZXIoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTE3MSwxMiArMTcyLDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZXIgcGFydCBvZiB0aGlzIHF1YWxpZmllZCBuYW1lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CiAJCWlmICh0aGlzLnF1YWxpZmllciA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTkwLDEwICsxOTEsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5xdWFsaWZpZXI7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgcXVhbGlmaWVkIG5hbWUgdG8gdGhlIGdpdmVuIG5hbWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcXVhbGlmaWVyIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIwMSw3ICsyMDIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKE5hbWUgcXVhbGlmaWVyKSB7CiAJCWlmIChxdWFsaWZpZXIgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjExLDEyICsyMTIsMTIgQEAKIAkJdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIHF1YWxpZmllciwgUVVBTElGSUVSX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZCAKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIzMCwxNyArMjMxLDE3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZSB0byB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHF1YWxpZmllZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbmFtZSkgewogCQlpZiAobmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNTAsNyArMjUxLDcgQEAKIAkJdGhpcy5uYW1lID0gbmFtZTsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmFtZSwgTkFNRV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIE5hbWUuCiAJICovCkBAIC0yNjYsMTIgKzI2NywxMiBAQAogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gQkFTRV9OQU1FX05PREVfU0laRSArIDMgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy5uYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLnF1YWxpZmllciA9PSBudWxsID8gMCA6IGdldFF1YWxpZmllcigpLnRyZWVTaXplKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1F1YWxpZmllZFR5cGUuamF2YQppbmRleCBjZjcyN2RkLi5kN2Q0MzlhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1F1YWxpZmllZFR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1F1YWxpZmllZFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw3IEBACiAgKiAgICBUeXBlIDxiPi48L2I+IFNpbXBsZU5hbWUKICAqIDwvcHJlPgogICogPHA+Ci0gKiBOb3QgYWxsIG5vZGUgYXJyYWdlbWVudHMgd2lsbCByZXByZXNlbnQgbGVnYWwgSmF2YSBjb25zdHJ1Y3RzLiBJbiBwYXJ0aWN1bGFyLAorICogTm90IGFsbCBub2RlIGFycmFuZ2VtZW50cyB3aWxsIHJlcHJlc2VudCBsZWdhbCBKYXZhIGNvbnN0cnVjdHMuIEluIHBhcnRpY3VsYXIsCiAgKiBpdCBpcyBub25zZW5zZSBpZiB0aGUgdHlwZSBpcyBhbiBhcnJheSB0eXBlIG9yIHByaW1pdGl2ZSB0eXBlLiBUaGUgbm9ybWFsIHVzZQogICogaXMgd2hlbiB0aGUgdHlwZSBpcyBhIHNpbXBsZSBvciBwYXJhbWV0ZXJpemVkIHR5cGUuCiAgKiA8L3A+CkBAIC0zNSwzOSArMzUsNDAgQEAKICAqIDxjb2RlPlNpbXBsZVR5cGUoUXVhbGlmaWVkTmFtZShTaW1wbGVOYW1lKCJBIiksU2ltcGxlTmFtZSgiQiIpKSk8L2NvZGU+CiAgKiA8L2xpPgogICogPC9vbD4KLSAqIFRoZSBmaXJzdCBmb3JtIGlzIHByZWZlcnJlZCB3aGVuICJBIiBpcyBrbm93biB0byBiZSBhIHR5cGUuIEhvd2V2ZXIsIGEgCisgKiBUaGUgZmlyc3QgZm9ybSBpcyBwcmVmZXJyZWQgd2hlbiAiQSIgaXMga25vd24gdG8gYmUgYSB0eXBlLiBIb3dldmVyLCBhCiAgKiBwYXJzZXIgY2Fubm90IGFsd2F5cyBkZXRlcm1pbmUgdGhpcy4gQ2xpZW50cyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlCiAgKiBlaXRoZXIgcmF0aGVyIHRoYW4gbWFrZSBhc3N1bXB0aW9ucy4gKE5vdGUgYWxzbyB0aGF0IHRoZSBmaXJzdCBmb3JtCiAgKiBiZWNhbWUgcG9zc2libGUgYXMgb2YgSkxTMzsgb25seSB0aGUgc2Vjb25kIGZvcm0gZXhpc3RlZCBpbiBKTFMyIEFQSS4pCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFF1YWxpZmllZFR5cGUgZXh0ZW5kcyBUeXBlIHsKICAgICAvKioKICAgICAgKiBUaGlzIGluZGV4IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIGluc2lkZSBhIHBhcmFtZXRlcml6ZWQgcXVhbGlmaWVkIHR5cGUuCiAgICAgICovCiAgICAgaW50IGluZGV4OwotCQorCiAJLyoqCi0JICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBRVUFMSUZJRVJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFFVQUxJRklFUl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihRdWFsaWZpZWRUeXBlLmNsYXNzLCAicXVhbGlmaWVyIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoUXVhbGlmaWVkVHlwZS5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFF1YWxpZmllZFR5cGUuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC03OSwyMiArODAsMjIgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKLQkvKiogCisKKwkvKioKIAkgKiBUaGUgdHlwZSBub2RlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdHlwZSB3aXRoCiAJICogYW4gdW5zcGVjZmllZCwgYnV0IGxlZ2FsLCBzaW1wbGUgbmFtZS4KIAkgKi8KIAlwcml2YXRlIFR5cGUgcXVhbGlmaWVyID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KQEAgLTEwNyw3ICsxMDgsNyBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVF1YWxpZmllZFR5cGUoQVNUIGFzdCkgewpAQCAtMTIxLDcgKzEyMiw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTQ1LDcgKzE0Niw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNTgsNyArMTU5LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVF1YWxpZmllZFR5cGUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZFR5cGUodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0UXVhbGlmaWVyKChUeXBlKSAoKEFTVE5vZGUpIGdldFF1YWxpZmllcigpKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpICgoQVNUTm9kZSkgZ2V0TmFtZSgpKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTE4NCwxMiArMTg1LDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyBxdWFsaWZpZWQgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllciBvZiB0aGlzIHF1YWxpZmllZCB0eXBlCi0JICovIAorCSAqLwogCXB1YmxpYyBUeXBlIGdldFF1YWxpZmllcigpIHsKIAkJaWYgKHRoaXMucXVhbGlmaWVyID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMDMsMTcgKzIwNCwxNyBAQAogCQl9CiAJCXJldHVybiB0aGlzLnF1YWxpZmllcjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyBxdWFsaWZpZWQgdHlwZSB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgcXVhbGlmaWVyIG9mIHRoaXMgcXVhbGlmaWVkIHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihUeXBlIHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjI2LDkgKzIyNyw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZCAKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTI0MiwxNyArMjQzLDE3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgdHlwZSB0byB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHF1YWxpZmllZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbmFtZSkgewogCQlpZiAobmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNjIsNyArMjYzLDcgQEAKIAkJdGhpcy5uYW1lID0gbmFtZTsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmFtZSwgTkFNRV9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNzAsMTIgKzI3MSwxMiBAQAogCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLnF1YWxpZmllciA9PSBudWxsID8gMCA6IGdldFF1YWxpZmllcigpLnRyZWVTaXplKCkpCiAJCQkrICh0aGlzLm5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JlY292ZXJlZFR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JlY292ZXJlZFR5cGVCaW5kaW5nLmphdmEKaW5kZXggYzc4MWY3NC4uZjBlOGI0MCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZWNvdmVyZWRUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUmVjb3ZlcmVkVHlwZUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxNCArMTQsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudDsKIAogLyoqCkBAIC05MCw2ICs4OSwyMCBAQAogCX0KIAogCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmcjZ2V0R2VuZXJpY1R5cGVPZldpbGRjYXJkVHlwZSgpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXRHZW5lcmljVHlwZU9mV2lsZGNhcmRUeXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNnZXRSYW5rKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFJhbmsoKSB7CisJCXJldHVybiAtMTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNnZXRDb21wb25lbnRUeXBlKCkKIAkgKi8KIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldENvbXBvbmVudFR5cGUoKSB7CkBAIC0yMDAsNyArMjEzLDcgQEAKIAkJCWJyYWNrZXRzW2ldID0gJ10nOwogCQkJYnJhY2tldHNbaSAtIDFdID0gJ1snOwogCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZ2V0SW50ZXJuYWxOYW1lKCkpOworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRJbnRlcm5hbE5hbWUoKSk7CiAJCWJ1ZmZlci5hcHBlbmQoYnJhY2tldHMpOwogCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKIAl9CkBAIC0yMTMsNyArMjI2LDcgQEAKIAkJaWYgKHJlZmVyZW5jZUJpbmRpbmcgIT0gbnVsbCkgewogCQkJcmV0dXJuIG5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5jb21wb3VuZE5hbWVbcmVmZXJlbmNlQmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOwogCQl9Ci0JCXJldHVybiB0aGlzLmdldFR5cGVOYW1lRnJvbShnZXRUeXBlKCkpOworCQlyZXR1cm4gZ2V0VHlwZU5hbWVGcm9tKGdldFR5cGUoKSk7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQpAQCAtMjI2LDYgKzIzOSw3IEBACiAJCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgogCQkJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6IC8vIGluY2x1ZGVzIGNhcHR1cmUgc2NlbmFyaW8KIAkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IHRoaXMucmVzb2x2ZXIuZ2V0UGFja2FnZUJpbmRpbmcodGhpcy5iaW5kaW5nLmdldFBhY2thZ2UoKSk7CkBAIC0yOTUsNyArMzA5LDcgQEAKIAkJCXJldHVybiB0aGlzLnR5cGVBcmd1bWVudHMgPSBUeXBlQmluZGluZy5OT19UWVBFX0JJTkRJTkdTOwogCQl9CiAJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGVBcmd1bWVudHM7CisJCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzOwogCQl9CiAKIAkJaWYgKHRoaXMuaW5uZXJUeXBlQmluZGluZyAhPSBudWxsKSB7CkBAIC0zNzYsNyArMzkwLDcgQEAKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCS8vIHNpbmNlIHJlY292ZXJlZCBiaW5kaW5nIGFyZSBub3QgdW5pcXVlIGlzRXF1YWxUbyBpcyByZXF1aXJlZAotCQlyZXR1cm4gdGhpcy5pc0VxdWFsVG8odHlwZUJpbmRpbmcpOworCQlyZXR1cm4gaXNFcXVhbFRvKHR5cGVCaW5kaW5nKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0zOTQsNyArNDA4LDcgQEAKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCS8vIHNpbmNlIHJlY292ZXJlZCBiaW5kaW5nIGFyZSBub3QgdW5pcXVlIGlzRXF1YWxUbyBpcyByZXF1aXJlZAotCQlyZXR1cm4gdGhpcy5pc0VxdWFsVG8odHlwZUJpbmRpbmcpOworCQlyZXR1cm4gaXNFcXVhbFRvKHR5cGVCaW5kaW5nKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC00OTUsNyArNTA5LDcgQEAKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCS8vIHNpbmNlIHJlY292ZXJlZCBiaW5kaW5nIGFyZSBub3QgdW5pcXVlIGlzRXF1YWxUbyBpcyByZXF1aXJlZAotCQlyZXR1cm4gdGhpcy5pc0VxdWFsVG8odHlwZUJpbmRpbmcpOworCQlyZXR1cm4gaXNFcXVhbFRvKHR5cGVCaW5kaW5nKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC01MzcsMTYgKzU1MSwxMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nI2dldEphdmFFbGVtZW50KCkKIAkgKi8KIAlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQl0cnkgewotCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZSgpOwotCQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKLQkJCQlmaW5hbCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBwYWNrYWdlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOwotCQkJCWlmIChqYXZhRWxlbWVudCE9IG51bGwgJiYgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotCQkJCQlyZXR1cm4gbmV3IENvbXBpbGF0aW9uVW5pdCgoUGFja2FnZUZyYWdtZW50KSBqYXZhRWxlbWVudCwgdGhpcy5nZXRJbnRlcm5hbE5hbWUoKSwgdGhpcy5yZXNvbHZlci5nZXRXb3JraW5nQ29weU93bmVyKCkpLmdldFdvcmtpbmdDb3B5KHRoaXMucmVzb2x2ZXIuZ2V0V29ya2luZ0NvcHlPd25lcigpLCBudWxsKTsKLQkJCQl9CisJCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UoKTsKKwkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKKwkJCWZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHBhY2thZ2VCaW5kaW5nLmdldEphdmFFbGVtZW50KCk7CisJCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCAmJiBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7CisJCQkJLy8gYmVzdCBlZmZvcnQ6IHdlIGRvbid0IGtub3cgaWYgdGhlIHJlY292ZXJlZCBiaW5kaW5nIGlzIGEgYmluYXJ5IG9yIHNvdXJjZSBiaW5kaW5nLCBzbyBnbyB3aXRoIGEgc2ltcGxlIHNvdXJjZSB0eXBlCisJCQkJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50KSBqYXZhRWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KGdldEludGVybmFsTmFtZSgpICsgU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfamF2YSkuZ2V0VHlwZSh0aGlzLmdldE5hbWUoKSk7CiAJCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZQogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTU2NiwxNCArNTc3LDE0IEBACiAJCX0gZWxzZSBpZiAodGhpcy5iaW5kaW5nICE9IG51bGwpIHsKIAkJCWJ1ZmZlci5hcHBlbmQoInR5cGVCaW5kaW5nIikgLy8kTk9OLU5MUy0xJAogCQkJCSAgLmFwcGVuZCh0aGlzLmJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleSgpKTsKLQkJfSBlbHNlIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJfSBlbHNlIGlmICh0aGlzLnZhcmlhYmxlRGVjbGFyYXRpb24gIT0gbnVsbCkgewogCQkJYnVmZmVyCiAJCQkJLmFwcGVuZCgidmFyaWFibGVEZWNsYXJhdGlvbiIpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKHRoaXMudmFyaWFibGVEZWNsYXJhdGlvbi5nZXRDbGFzcygpKQogCQkJCS5hcHBlbmQodGhpcy52YXJpYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpCiAJCQkJLmFwcGVuZCh0aGlzLnZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0RXh0cmFEaW1lbnNpb25zKCkpOwogCQl9Ci0JCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXREaW1lbnNpb25zKCkpOworCQlidWZmZXIuYXBwZW5kKGdldERpbWVuc2lvbnMoKSk7CiAJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJYnVmZmVyLmFwcGVuZCgnPCcpOwogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtNjA2LDcgKzYxNyw3IEBACiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNFcXVhbFRvKElCaW5kaW5nIG90aGVyKSB7CiAJCWlmICghb3RoZXIuaXNSZWNvdmVyZWQoKSB8fCBvdGhlci5nZXRLaW5kKCkgIT0gSUJpbmRpbmcuVFlQRSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5nZXRLZXkoKS5lcXVhbHMob3RoZXIuZ2V0S2V5KCkpOworCQlyZXR1cm4gZ2V0S2V5KCkuZXF1YWxzKG90aGVyLmdldEtleSgpKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JlY292ZXJlZFZhcmlhYmxlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZWNvdmVyZWRWYXJpYWJsZUJpbmRpbmcuamF2YQppbmRleCBlYzVlMzYzLi5iYTUxMmZjIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JlY292ZXJlZFZhcmlhYmxlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUmVjb3ZlcmVkVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtODksNyArODksNyBAQAogCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlidWZmZXIuYXBwZW5kKCJSZWNvdmVyZWQjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhcmlhYmxlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQlpZiAodGhpcy52YXJpYWJsZURlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQoInZhcmlhYmxlRGVjbGFyYXRpb24iKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZCh0aGlzLnZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0Q2xhc3MoKSkKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJcHVibGljIGJvb2xlYW4gaXNFcXVhbFRvKElCaW5kaW5nIGJpbmRpbmcpIHsKIAkJaWYgKGJpbmRpbmcuaXNSZWNvdmVyZWQoKSAmJiBiaW5kaW5nLmdldEtpbmQoKSA9PSBJQmluZGluZy5WQVJJQUJMRSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0S2V5KCkuZXF1YWxzKGJpbmRpbmcuZ2V0S2V5KCkpOworCQkJcmV0dXJuIGdldEtleSgpLmVxdWFscyhiaW5kaW5nLmdldEtleSgpKTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZXR1cm5TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUmV0dXJuU3RhdGVtZW50LmphdmEKaW5kZXggODg3ODU5NS4uMDQ2ZTgxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZXR1cm5TdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JldHVyblN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDI1ICsyMSwyNiBAQAogICogUmV0dXJuU3RhdGVtZW50OgogICogICAgPGI+cmV0dXJuPC9iPiBbIEV4cHJlc3Npb24gXSA8Yj47PC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFJldHVyblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCQkKKwogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihSZXR1cm5TdGF0ZW1lbnQuY2xhc3MsICJleHByZXNzaW9uIiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFJldHVyblN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTUwLDI2ICs1MSwyNiBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBleHByZXNzaW9uOyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsgZGVmYXVsdHMgdG8gbm9uZS4KIAkgKi8KIAlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKLQkKKwogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgcmV0dXJuIHN0YXRlbWVudCBvd25lZCBieSB0aGUgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSByZXR1cm4gc3RhdGVtZW50IG93bmVkIGJ5IHRoZQogCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHN0YXRlbWVudCBoYXMgbm8gZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlSZXR1cm5TdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtODIsNyArODMsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTk4LDcgKzk5LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTExMSw3ICsxMTIsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJUmV0dXJuU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigKIAkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhwcmVzc2lvbigpKSk7CkBAIC0xMzYsMjEgKzEzNywyMSBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHJldHVybiBzdGF0ZW1lbnQsIG9yIAorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyByZXR1cm4gc3RhdGVtZW50LCBvcgogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxFeHByZXNzaW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgcmV0dXJuIHN0YXRlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE1OCwyMSArMTU5LDIxIEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy5vcHRpb25hbEV4cHJlc3Npb247CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZXhwcmVzc2lvbiwgRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJCXRoaXMub3B0aW9uYWxFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZXhwcmVzc2lvbiwgRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKaW5kZXggM2M3ZWViMS4uZDRhMWJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CiAKQEAgLTI1LDcyICsyNiw3MyBAQAogICogU2ltcGxlTmFtZToKICAqICAgICBJZGVudGlmaWVyCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlTmFtZSBleHRlbmRzIE5hbWUgewogCiAJLyoqCi0JICogVGhlICJpZGVudGlmaWVyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgotCSAqIAorCSAqIFRoZSAiaWRlbnRpZmllciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIFN0cmluZ30pLgorCSAqCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIElERU5USUZJRVJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBJREVOVElGSUVSX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihTaW1wbGVOYW1lLmNsYXNzLCAiaWRlbnRpZmllciIsIFN0cmluZy5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoU2ltcGxlTmFtZS5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoSURFTlRJRklFUl9QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlMgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIEFTVC5KTFMqIGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkKKwogCS8qKgogCSAqIEFuIHVuc3BlY2lmaWVkIChidXQgZXh0ZXJuYWxseSBvYnNlcnZhYmxlKSBsZWdhbCBKYXZhIGlkZW50aWZpZXIuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfSURFTlRJRklFUiA9ICJNSVNTSU5HIjsvLyROT04tTkxTLTEkCi0JCisKIAkvKioKIAkgKiBUaGUgaWRlbnRpZmllcjsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgbGVnYWwgSmF2YSBpZGVudGlmaWVyLgogCSAqLwogCXByaXZhdGUgU3RyaW5nIGlkZW50aWZpZXIgPSBNSVNTSU5HX0lERU5USUZJRVI7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHNpbXBsZSBuYW1lIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCiAJICogVGhlIG5ldyBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCwgbGVnYWwgSmF2YSBpZGVudGlmaWVyLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlTaW1wbGVOYW1lKEFTVCBhc3QpIHsKIAkJc3VwZXIoYXN0KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKiBAc2luY2UgMy4wCkBAIC05OCw3ICsxMDAsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNywxMSArMTI5LDExIEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlTaW1wbGVOYW1lIHJlc3VsdCA9IG5ldyBTaW1wbGVOYW1lKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldElkZW50aWZpZXIoZ2V0SWRlbnRpZmllcigpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE1MCwxMyArMTUyLDEzIEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoaXMgbm9kZSdzIGlkZW50aWZpZXIuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CiAJCXJldHVybiB0aGlzLmlkZW50aWZpZXI7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIG5vZGUgdG8gdGhlIGdpdmVuIHZhbHVlLgogCSAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBiZSBsZWdhbCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCkBAIC0xNjYsMzEgKzE2OCw0MSBAQAogCSAqIE5vdGUgdGhhdCB0aGUgbGlzdCBvZiBrZXl3b3JkcyBtYXkgZGVwZW5kIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZQogCSAqIGxhbmd1YWdlIChkZXRlcm1pbmVkIHdoZW4gdGhlIEFTVCBvYmplY3Qgd2FzIGNyZWF0ZWQpLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpZGVudGlmaWVyIGlzIGludmFsaWQKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewogCQkvLyB1cGRhdGUgaW50ZXJuYWxTZXRJZGVudGlmaWVyIGlmIHRoaXMgaXMgY2hhbmdlZAogCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KIAkJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5hc3Quc2Nhbm5lcjsKLQkJY2hhcltdIHNvdXJjZSA9IGlkZW50aWZpZXIudG9DaGFyQXJyYXkoKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKLQkJZmluYWwgaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7Ci0JCXNjYW5uZXIucmVzZXRUbygwLCBsZW5ndGggLSAxKTsKKwkJbG9uZyBzb3VyY2VMZXZlbCA9IHNjYW5uZXIuc291cmNlTGV2ZWw7CisJCWxvbmcgY29tcGxpYW5jZUxldmVsID0gc2Nhbm5lci5jb21wbGlhbmNlTGV2ZWw7CisKIAkJdHJ5IHsKLQkJCWludCB0b2tlblR5cGUgPSBzY2FubmVyLnNjYW5JZGVudGlmaWVyKCk7Ci0JCQlpZiAodG9rZW5UeXBlICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCXNjYW5uZXIuc291cmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zOworCQkJc2Nhbm5lci5jb21wbGlhbmNlTGV2ZWwgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OworCQkJY2hhcltdIHNvdXJjZSA9IGlkZW50aWZpZXIudG9DaGFyQXJyYXkoKTsKKwkJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CisJCQlmaW5hbCBpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKwkJCXNjYW5uZXIucmVzZXRUbygwLCBsZW5ndGggLSAxKTsKKwkJCXRyeSB7CisJCQkJaW50IHRva2VuVHlwZSA9IHNjYW5uZXIuc2NhbklkZW50aWZpZXIoKTsKKwkJCQlpZiAodG9rZW5UeXBlICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCQlpZiAoc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gIT0gbGVuZ3RoKSB7CisJCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBpZGVudGlmaWVyIHNlZSA4Nzg0OQorCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkJfQorCQkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJCX0KLQkJCWlmIChzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAhPSBsZW5ndGgpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgaWRlbnRpZmllciBzZWUgODc4NDkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuYXN0LnNjYW5uZXIuc291cmNlTGV2ZWwgPSBzb3VyY2VMZXZlbDsKKwkJCXRoaXMuYXN0LnNjYW5uZXIuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZUxldmVsOwogCQl9CiAJCXByZVZhbHVlQ2hhbmdlKElERU5USUZJRVJfUFJPUEVSVFkpOwogCQl0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwpAQCAtMjA1LDcgKzIxNyw3IEBACiAJCXRoaXMuaWRlbnRpZmllciA9IGlkZW50OwogCQlwb3N0VmFsdWVDaGFuZ2UoSURFTlRJRklFUl9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2ltcGxlIG5hbWUgcmVwcmVzZW50cyBhIG5hbWUgdGhhdCBpcyBiZWluZyBkZWZpbmVkLAogCSAqIGFzIG9wcG9zZWQgdG8gb25lIGJlaW5nIHJlZmVyZW5jZWQuIFRoZSBmb2xsb3dpbmcgcG9zaXRpb25zIGFyZSBjb25zaWRlcmVkCkBAIC0yMzEsMTAgKzI0MywxMCBAQAogCSAqIHRoaXMgbm9kZSBhcHBlYXJzIGluIHRoZSBkZWNsYXJhdGlvbiBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogCSAqIEl0IGFsd2F5cyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaXMgdW5wYXJlbnRlZC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgZGVjbGFyZXMgYSBuYW1lLCBhbmQgCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9kZSBkZWNsYXJlcyBhIG5hbWUsIGFuZAogCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvbigpIHsKIAkJU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBkID0gZ2V0TG9jYXRpb25JblBhcmVudCgpOwogCQlpZiAoZCA9PSBudWxsKSB7CkBAIC0yNzMsNyArMjg1LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBOYW1lLgogCSAqLwpAQCAtMjg2LDEzICsyOTgsMTMgQEAKIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJaW50IHNpemUgPSBCQVNFX05BTUVfTk9ERV9TSVpFICsgMiAqIDQ7Ci0JCWlmIChpZGVudGlmaWVyICE9IE1JU1NJTkdfSURFTlRJRklFUikgeworCQlpZiAodGhpcy5pZGVudGlmaWVyICE9IE1JU1NJTkdfSURFTlRJRklFUikgewogCQkJLy8gZXZlcnl0aGluZyBidXQgb3VyIG1pc3NpbmcgaWQgY29zdHMKLQkJCXNpemUgKz0gc3RyaW5nU2l6ZShpZGVudGlmaWVyKTsKKwkJCXNpemUgKz0gc3RyaW5nU2l6ZSh0aGlzLmlkZW50aWZpZXIpOwogCQl9CiAJCXJldHVybiBzaXplOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKaW5kZXggMDdjYzcxOC4uYjkwMzhiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDMxICsxNiwzMiBAQAogICogcHJpbWl0aXZlIHR5cGUgKHN1Y2ggYXMgPGNvZGU+aW50PC9jb2RlPiBvciA8Y29kZT5ib29sZWFuPC9jb2RlPikKICAqIG9yIHNvbWUgc2ltcGxlIHZhbHVlIHR5cGUgKHN1Y2ggYXMgPGNvZGU+U3RyaW5nPC9jb2RlPiBvcgogICogPGNvZGU+SW5maXhFeHByZXNzaW9uLk9wZXJhdG9yPC9jb2RlPikuCi0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlI2dldFN0cnVjdHVyYWxQcm9wZXJ0eShTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yKQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSNzZXRTdHJ1Y3R1cmFsUHJvcGVydHkoU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciwgT2JqZWN0KQogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHsKLQkKKwogCS8qKgogCSAqIFZhbHVlIHR5cGUuIEZvciBleGFtcGxlLCBmb3IgYSBub2RlIHR5cGUgbGlrZQogCSAqIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24sIHRoZSBtb2RpZmllcnMgcHJvcGVydHkgaXMgaW50LmNsYXNzCiAJICovCiAJcHJpdmF0ZSBmaW5hbCBDbGFzcyB2YWx1ZVR5cGU7Ci0JCisKIAkvKioKIAkgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHZhbHVlIGlzIG1hbmRhdG9yeS4gQSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbGxvd2VkCiAJICogdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4gb25seSBpZiBpdCBpcyBub3QgbWFuZGF0b3J5LgogCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYW5kYXRvcnk7CQotCQorCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYW5kYXRvcnk7CisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHNpbXBsZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IGlkLgogCSAqIE5vdGUgdGhhdCB0aGlzIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIHBhY2thZ2UtcHJpdmF0ZSBzbyB0aGF0CiAJICogcHJvcGVydHkgZGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSB0aGUgQVNUCiAJICogaW1wbGVtZW50YXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZUNsYXNzIGNvbmNyZXRlIEFTVCBub2RlIHR5cGUgdGhhdCBvd25zIHRoaXMgcHJvcGVydHkKIAkgKiBAcGFyYW0gcHJvcGVydHlJZCB0aGUgcHJvcGVydHkgaWQKIAkgKiBAcGFyYW0gdmFsdWVUeXBlIHRoZSB2YWx1ZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkKQEAgLTU1LDI0ICs1NiwyNCBAQAogCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKIAkJdGhpcy5tYW5kYXRvcnkgPSBtYW5kYXRvcnk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgdHlwZSBvZiB0aGlzIHByb3BlcnR5LgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlLCBmb3IgYSBub2RlIHR5cGUgbGlrZSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLAogCSAqIHRoZSAibW9kaWZpZXJzIiBwcm9wZXJ0eSByZXR1cm5zIDxjb2RlPmludC5jbGFzczwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdmFsdWUgdHlwZSBvZiB0aGUgcHJvcGVydHkKIAkgKi8KIAlwdWJsaWMgQ2xhc3MgZ2V0VmFsdWVUeXBlKCkgewogCQlyZXR1cm4gdGhpcy52YWx1ZVR5cGU7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgbWFuZGF0b3J5LiBBIHByb3BlcnR5IHZhbHVlCiAJICogaXMgbm90IGFsbG93ZWQgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbWFuZGF0b3J5LgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgbWFuZGF0b3J5LAogCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbXBsZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhCmluZGV4IDc3NjI3OTYuLjllMjU2YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDI1ICsyMCwyNiBAQAogICogVGhpcyBraW5kIG9mIG5vZGUgaXMgdXNlZCB0byBjb252ZXJ0IGEgbmFtZSAoPGNvZGU+TmFtZTwvY29kZT4pIGludG8gYSB0eXBlCiAgKiAoPGNvZGU+VHlwZTwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlIGV4dGVuZHMgVHlwZSB7Ci0JCisKIAkvKioKLQkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoU2ltcGxlVHlwZS5jbGFzcywgIm5hbWUiLCBOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFNpbXBsZVR5cGUuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC00OSwzMCArNTAsMzAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCi0JLyoqIAorCisJLyoqCiAJICogVGhlIHR5cGUgbmFtZSBub2RlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdHlwZSB3aXRoCiAJICogYW4gdW5zcGVjZmllZCwgYnV0IGxlZ2FsLCBuYW1lLgogCSAqLwogCXByaXZhdGUgTmFtZSB0eXBlTmFtZSA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYSBzaW1wbGUgdHlwZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgogCSAqIEJ5IGRlZmF1bHQsIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWUuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJU2ltcGxlVHlwZShBU1QgYXN0KSB7CkBAIC04NSw3ICs4Niw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTAxLDcgKzEwMiw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMTQsNyArMTE1LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVNpbXBsZVR5cGUgcmVzdWx0ID0gbmV3IFNpbXBsZVR5cGUodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoTmFtZSkgKGdldE5hbWUoKSkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTM3LDEyICsxMzgsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBzaW1wbGUgdHlwZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBzaW1wbGUgdHlwZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTmFtZSBnZXROYW1lKCkgewogCQlpZiAodGhpcy50eXBlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTU2LDE3ICsxNTcsMTcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy50eXBlTmFtZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgc2ltcGxlIHR5cGUgdG8gdGhlIGdpdmVuIG5hbWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoaXMgc2ltcGxlIHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoTmFtZSB0eXBlTmFtZSkgewogCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMTg0LDEyICsxODUsMTIgQEAKIAkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy50eXBlTmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZU1lbWJlckFubm90YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCmluZGV4IDYwZWE3MGEuLmRkZWUzMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDggKzE0LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBTaW5nbGUgbWVtYmVyIGFubm90YXRpb24gbm9kZSAoYWRkZWQgaW4gSkxTMyBBUEkpLiBUaGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIAotICogIkBmb28oYmFyKSIgaXMgZXF1aXZhbGVudCB0byB0aGUgbm9ybWFsIGFubm90YXRpb24gIkBmb28odmFsdWU9YmFyKSIuIAorICogU2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIG5vZGUgKGFkZGVkIGluIEpMUzMgQVBJKS4gVGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbgorICogIkBmb28oYmFyKSIgaXMgZXF1aXZhbGVudCB0byB0aGUgbm9ybWFsIGFubm90YXRpb24gIkBmb28odmFsdWU9YmFyKSIuCiAgKiA8cD4KICAqIDxwcmU+CiAgKiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOgpAQCAtMjQsMzAgKzI0LDMxIEBACiAgKiBXaXRoaW4gYW5ub3RhdGlvbnMsIG9ubHkgY2VydGFpbiBraW5kcyBvZiBleHByZXNzaW9ucyBhcmUgbWVhbmluZ2Z1bCwKICAqIGluY2x1ZGluZyBvdGhlciBhbm5vdGF0aW9ucy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlTmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInR5cGVOYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgTmFtZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9OQU1FX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX05BTUVfUFJPUEVSVFkgPQogCQlpbnRlcm5hbFR5cGVOYW1lUHJvcGVydHlGYWN0b3J5KFNpbmdsZU1lbWJlckFubm90YXRpb24uY2xhc3MpOwogCiAJLyoqCi0JICogVGhlICJ2YWx1ZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVkFMVUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFZBTFVFX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFNpbmdsZU1lbWJlckFubm90YXRpb24uY2xhc3MsICJ2YWx1ZSIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTU1LDE5ICs1NiwxOSBAQAogCQlhZGRQcm9wZXJ0eShWQUxVRV9QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlMgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlIEFTVC5KTFMqIGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQorCiAJLyoqCiAJICogVGhlIHZhbHVlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleHByZXNzaW9uLgpAQCAtNzUsMTMgKzc2LDEzIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlIG93bmVkIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub3JtYWwgYW5ub3RhdGlvbiBub2RlIG93bmVkCiAJICogYnkgdGhlIGdpdmVuIEFTVC4gIEJ5IGRlZmF1bHQsIHRoZSBhbm5vdGF0aW9uIGhhcyBhbgogCSAqIHVuc3BlY2lmaWVkIHR5cGUgbmFtZSBhbmQgYW4gdW5zcGVjaWZpZWQgdmFsdWUuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QgYXN0KSB7CkBAIC05NSw3ICs5Niw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE5LDcgKzEyMCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJvZHlEZWNsYXJhdGlvbi4KIAkgKi8KQEAgLTEzOSwxMiArMTQwLDEyIEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGVOYW1lKChOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0VHlwZU5hbWUoKSkpOwogCQlyZXN1bHQuc2V0VmFsdWUoKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRWYWx1ZSgpKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNTIsNyArMTUzLDcgQEAKIAkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAogCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNjUsMTIgKzE2NiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdmFsdWUgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKIAkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4NCwxMCArMTg1LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMudmFsdWU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMTk1LDcgKzE5Niw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAJCWlmICh2YWx1ZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMTIsNyArMjEzLDcgQEAKIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQppbmRleCA0OTE3NGFiLi4xYTdhODg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMiw3NiArMzIsNzcgQEAKICAqIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb246CiAgKiAgICB7IEV4dGVuZGVkTW9kaWZpZXIgfSBUeXBlIFsgPGI+Li4uPC9iPiBdIElkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0gWyA8Yj49PC9iPiBFeHByZXNzaW9uIF0KICAqIDwvcHJlPgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgVmFyaWFibGVEZWNsYXJhdGlvbiB7Ci0JCisKIAkvKioKLQkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoSkxTMiBBUEkgb25seSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBJbnRlZ2VyfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlNfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsICJtb2RpZmllcnMiLCBpbnQuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsICJtb2RpZmllcnMiLCBJRXh0ZW5kZWRNb2RpZmllci5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzLCAibmFtZSIsIFNpbXBsZU5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAidmFyYXJncyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAidmFyYXJncyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIEJvb2xlYW59KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBWQVJBUkdTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgVkFSQVJHU19QUk9QRVJUWSA9CiAJCW5ldyBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5jbGFzcywgInZhcmFyZ3MiLCBib29sZWFuLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgImV4dHJhRGltZW5zaW9ucyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4dHJhRGltZW5zaW9ucyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAodHlwZToge0BsaW5rIEludGVnZXJ9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIEVYVFJBX0RJTUVOU0lPTlNfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsICJleHRyYURpbWVuc2lvbnMiLCBpbnQuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAiaW5pdGlhbGl6ZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJpbml0aWFsaXplciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBJTklUSUFMSVpFUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSU5JVElBTElaRVJfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5jbGFzcywgImluaXRpYWxpemVyIiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg2KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC0xMTEsNyArMTEyLDcgQEAKIAkJYWRkUHJvcGVydHkoRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoSU5JVElBTElaRVJfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKLQkJCisKIAkJcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg3KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KE1PRElGSUVSUzJfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CkBAIC0xMjYsMTAgKzEyNywxMCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xNDAsMjIgKzE0MSwyMiBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCi0JICogVGhlIGV4dGVuZGVkIG1vZGlmaWVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JRXh0ZW5kZWRNb2RpZmllcjwvY29kZT4pLiAKKwkgKiBUaGUgZXh0ZW5kZWQgbW9kaWZpZXJzIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pLgogCSAqIE51bGwgaW4gSkxTMi4gQWRkZWQgaW4gSkxTMzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdAogCSAqIChzZWUgY29uc3RydWN0b3IpLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBtb2RpZmllcnMgPSBudWxsOwotCQorCiAJLyoqCiAJICogVGhlIG1vZGlmaWVyczsgYml0LXdpc2Ugb3Igb2YgTW9kaWZpZXIgZmxhZ3MuCiAJICogRGVmYXVsdHMgdG8gbm9uZS4gTm90IHVzZWQgaW4gMy4wLgogCSAqLwogCXByaXZhdGUgaW50IG1vZGlmaWVyRmxhZ3MgPSBNb2RpZmllci5OT05FOwotCQorCiAJLyoqCiAJICogVGhlIHZhcmlhYmxlIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCBKYXZhIGlkZW50aWZpZXIuCkBAIC0xNzEsNyArMTcyLDcgQEAKIAkvKioKIAkgKiBJbmRpY2F0ZXMgdGhlIGxhc3QgcGFyYW1ldGVyIG9mIGEgdmFyaWFibGUgYXJpdHkgbWV0aG9kOwogCSAqIGRlZmF1bHRzIHRvIGZhbHNlLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgYm9vbGVhbiB2YXJpYWJsZUFyaXR5ID0gZmFsc2U7CkBAIC0xNzksNyArMTgwLDcgQEAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIHZhcmlhYmxlOwogCSAqIGRlZmF1bHRzIHRvIDAuCi0JICogCisJICoKIAkgKiBAc2luY2UgMi4xCiAJICovCiAJcHJpdmF0ZSBpbnQgZXh0cmFBcnJheURpbWVuc2lvbnMgPSAwOwpAQCAtMTkxLDE0ICsxOTIsMTQgQEAKIAlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxJbml0aWFsaXplciA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKLQkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBoYXM6IG5vIG1vZGlmaWVycywgYW4gCi0JICogdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdHlwZSwgYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdmFyaWFibGUgbmFtZSwgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4KKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBoYXM6IG5vIG1vZGlmaWVycywgYW4KKwkgKiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLCBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB2YXJpYWJsZSBuYW1lLAogCSAqIDAgZGltZW5zaW9ucyBhZnRlciB0aGUgdmFyaWFibGU7IG5vIGluaXRpYWxpemVyOyBub3QgdmFyaWFibGUgYXJpdHkuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihBU1QgYXN0KSB7CkBAIC0yMzgsNyArMjM5LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNjIsNyArMjYzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCB2YWx1ZSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNzgsNyArMjc5LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMzEwLDcgKzMxMSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zMjEsNyArMzIyLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zMzQsNyArMzM1LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlpZiAodGhpcy5hc3QuYXBpTGV2ZWwgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKIAkJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOwogCQl9IGVsc2UgewpAQCAtMzU2LDcgKzM1Nyw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMzczLDcgKzM3NCw3IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBtb2RpZmllcnMgYW5kIGFubm90YXRpb25zCiAJICogb2YgdGhpcyBkZWNsYXJhdGlvbiAoYWRkZWQgaW4gSkxTMyBBUEkpLgpAQCAtMzgxLDEzICszODIsMTMgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIGZpbmFsIG1vZGlmaWVyIGlzIHRoZSBvbmx5IG1lYW5pbmdmdWwgbW9kaWZpZXIgZm9yIGxvY2FsCiAJICogdmFyaWFibGUgYW5kIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIGFubm90YXRpb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUV4dGVuZGVkTW9kaWZpZXI8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYSBKTFMyIEFTVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIExpc3QgbW9kaWZpZXJzKCkgewogCQkvLyBtb3JlIGVmZmljaWVudCB0aGFuIGp1c3QgY2FsbGluZyB1bnN1cHBvcnRlZEluMigpIHRvIGNoZWNrCiAJCWlmICh0aGlzLm1vZGlmaWVycyA9PSBudWxsKSB7CkBAIC0zOTUsMTcgKzM5NiwxNyBAQAogCQl9CiAJCXJldHVybiB0aGlzLm1vZGlmaWVyczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbi4KIAkgKiA8cD4KIAkgKiBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQKIAkgKiBjb21wdXRlcyB0aGVzZSBmbGFncyBmcm9tIDxjb2RlPm1vZGlmaWVycygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCiAJICogQHNlZSBNb2RpZmllcgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBjaGVja2luZyBnZXRBU1QoKS5BUElfTEVWRUwKIAkJaWYgKHRoaXMubW9kaWZpZXJzID09IG51bGwpIHsKQEAgLTQzMywxNCArNDM0LDE0IEBACiAJICogc3RhdGljLCBmaW5hbCwgdm9sYXRpbGUsIGFuZCB0cmFuc2llbnQuIEZvciBsb2NhbCB2YXJpYWJsZSBhbmQgZm9ybWFsCiAJICogcGFyYW1ldGVyIGRlY2xhcmF0aW9ucywgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBpcyBmaW5hbC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBnaXZlbiBtb2RpZmllcnMgKGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMpCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYW4gQVNUIGxhdGVyIHRoYW4gSkxTMgogCSAqIEBzZWUgTW9kaWZpZXIKLQkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5IAorCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKIAkgKiB7QGxpbmsgICNtb2RpZmllcnMoKX0gd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIGEgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IG5vZGVzLgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgewogCQlpbnRlcm5hbFNldE1vZGlmaWVycyhtb2RpZmllcnMpOwogCX0KQEAgLTQ1OSw3ICs0NjAsNyBAQAogCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLnZhcmlhYmxlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtNDczLDEwICs0NzQsMTAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy52YXJpYWJsZU5hbWU7CiAJfQotCQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgdmFyaWFibGVOYW1lKSB7CiAJCWlmICh2YXJpYWJsZU5hbWUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNDkwLDkgKzQ5MSw5IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiwKIAkgKiBleGNsdXNpdmUgb2YgYW55IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0eXBlCi0JICovIAorCSAqLwogCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CiAJCWlmICh0aGlzLnR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTUwOCwxNiArNTA5LDE2IEBACiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byAKKwkgKiBTZXRzIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvCiAJICogdGhlIGdpdmVuIHR5cGUsIGV4Y2x1c2l2ZSBvZiBhbnkgZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgdHlwZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtNTMzLDIwICs1MzQsMjAgQEAKIAkgKiBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGUgYmluZGluZyBmb3IgdGhlIHR5cGUgPGNvZGU+Rm9vPC9jb2RlPmluIHRoZSB2YXJhcmcgbWV0aG9kCi0JICogZGVjbGFyYXRpb24gPGNvZGU+dm9pZCBmdW4oRm9vLi4uIGFyZ3MpPC9jb2RlPiBpcyBhbHdheXMgZm9yIHRoZSB0eXBlIGFzIAorCSAqIGRlY2xhcmF0aW9uIDxjb2RlPnZvaWQgZnVuKEZvby4uLiBhcmdzKTwvY29kZT4gaXMgYWx3YXlzIGZvciB0aGUgdHlwZSBhcwogCSAqIHdyaXR0ZW47IGkuZS4sIHRoZSB0eXBlIGJpbmRpbmcgZm9yIDxjb2RlPkZvbzwvY29kZT4uIEhvd2V2ZXIsIGlmIHlvdQogCSAqIG5hdmlnYXRlIGZyb20gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiB0byBpdHMgbWV0aG9kIGJpbmRpbmcgdG8gdGhlCiAJICogdHlwZSBiaW5kaW5nIGZvciBpdHMgbGFzdCBwYXJhbWV0ZXIsIHRoZSB0eXBlIGJpbmRpbmcgZm9yIHRoZSB2YXJhcmcKIAkgKiBwYXJhbWV0ZXIgaXMgYWx3YXlzIGFuIGFycmF5IHR5cGUgKGkuZS4sIDxjb2RlPkZvb1tdPC9jb2RlPikgcmVmbGVjdGluZwogCSAqIHRoZSB3YXkgdmFyYXJnIG1ldGhvZHMgZ2V0IGNvbXBpbGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciBkZWNsYXJhdGlvbiwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzVmFyYXJncygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy5tb2RpZmllcnMgPT0gbnVsbCkgewpAQCAtNTU0LDE1ICs1NTUsMTUgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy52YXJpYWJsZUFyaXR5OwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGRlY2xhcmVzIHRoZSBsYXN0IHBhcmFtZXRlciBvZgogCSAqIGEgdmFyaWFibGUgYXJpdHkgbWV0aG9kIChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdmFyaWFibGVBcml0eSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYXJpdHkKIAkgKiAgICBwYXJhbWV0ZXIgZGVjbGFyYXRpb24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRWYXJhcmdzKGJvb2xlYW4gdmFyaWFibGVBcml0eSkgewogCQkvLyBtb3JlIGVmZmljaWVudCB0aGFuIGp1c3QgY2FsbGluZyB1bnN1cHBvcnRlZEluMigpIHRvIGNoZWNrCiAJCWlmICh0aGlzLm1vZGlmaWVycyA9PSBudWxsKSB7CkBAIC01NzYsNyArNTc3LDcgQEAKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KIAkgKiBAc2luY2UgMi4xCi0JICovIAorCSAqLwogCXB1YmxpYyBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCkgewogCQlyZXR1cm4gdGhpcy5leHRyYUFycmF5RGltZW5zaW9uczsKIAl9CkBAIC01ODQsNyArNTg1LDcgQEAKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KIAkgKiBAc2luY2UgMi4xCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4dHJhRGltZW5zaW9ucyhpbnQgZGltZW5zaW9ucykgewogCQlpZiAoZGltZW5zaW9ucyA8IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTU5NiwxNiArNTk3LDE2IEBACiAKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0SW5pdGlhbGl6ZXIoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsSW5pdGlhbGl6ZXI7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVyKEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKLQkJLy8gYSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAKKwkJLy8gYSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbgogCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcwogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy5vcHRpb25hbEluaXRpYWxpemVyOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGluaXRpYWxpemVyLElOSVRJQUxJWkVSX1BST1BFUlRZKTsKQEAgLTYyMCwxMiArNjIxLDEyIEBACiAJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLm1vZGlmaWVycyA9PSBudWxsID8gMCA6IHRoaXMubW9kaWZpZXJzLmxpc3RTaXplKCkpCiAJCQkrICh0aGlzLnR5cGUgPT0gbnVsbCA/IDAgOiBnZXRUeXBlKCkudHJlZVNpemUoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0YXRlbWVudC5qYXZhCmluZGV4IGE2N2FkN2YuLjZhM2FjNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw4MiArMTksNjMgQEAKICAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IHN0YXRlbWVudHMuCiAgKiBUaGVyZSBhcmUgbWFueSBraW5kcyBvZiBzdGF0ZW1lbnRzLgogICogPHA+Ci0gKiBUaGUgZ3JhbW1hciBjb21iaW5lcyBib3RoIFN0YXRlbWVudCBhbmQgQmxvY2tTdGF0ZW1lbnQuCi0gKiBGb3IgSkxTMjoKKyAqIFRoZSBncmFtbWFyIGNvbWJpbmVzIGJvdGggU3RhdGVtZW50IGFuZCBCbG9ja1N0YXRlbWVudC48L3A+CisgKiA8cD5Gb3IgSkxTMjo8L3A+CiAgKiA8cHJlPgogICogU3RhdGVtZW50OgotICogICAgQmxvY2sKLSAqICAgIElmU3RhdGVtZW50Ci0gKiAgICBGb3JTdGF0ZW1lbnQKLSAqICAgIFdoaWxlU3RhdGVtZW50Ci0gKiAgICBEb1N0YXRlbWVudAotICogICAgVHJ5U3RhdGVtZW50Ci0gKiAgICBTd2l0Y2hTdGF0ZW1lbnQKLSAqICAgIFN5bmNocm9uaXplZFN0YXRlbWVudAotICogICAgUmV0dXJuU3RhdGVtZW50Ci0gKiAgICBUaHJvd1N0YXRlbWVudAotICogICAgQnJlYWtTdGF0ZW1lbnQKLSAqICAgIENvbnRpbnVlU3RhdGVtZW50Ci0gKiAgICBFbXB0eVN0YXRlbWVudAotICogICAgRXhwcmVzc2lvblN0YXRlbWVudAotICogICAgTGFiZWxlZFN0YXRlbWVudAotICogICAgQXNzZXJ0U3RhdGVtZW50Ci0gKiAgICBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0gKiAgICBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLSAqICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbgotICogICAgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24KKyAqICAgIHtAbGluayBBc3NlcnRTdGF0ZW1lbnR9LAorICogICAge0BsaW5rIEJsb2NrfSwKKyAqICAgIHtAbGluayBCcmVha1N0YXRlbWVudH0sCisgKiAgICB7QGxpbmsgQ29uc3RydWN0b3JJbnZvY2F0aW9ufSwKKyAqICAgIHtAbGluayBDb250aW51ZVN0YXRlbWVudH0sCisgKiAgICB7QGxpbmsgRG9TdGF0ZW1lbnR9LAorICogICAge0BsaW5rIEVtcHR5U3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBFeHByZXNzaW9uU3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBGb3JTdGF0ZW1lbnR9LAorICogICAge0BsaW5rIElmU3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBMYWJlbGVkU3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBSZXR1cm5TdGF0ZW1lbnR9LAorICogICAge0BsaW5rIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9ufSwKKyAqICAgIHtAbGluayBTd2l0Y2hDYXNlfSwKKyAqICAgIHtAbGluayBTd2l0Y2hTdGF0ZW1lbnR9LAorICogICAge0BsaW5rIFN5bmNocm9uaXplZFN0YXRlbWVudH0sCisgKiAgICB7QGxpbmsgVGhyb3dTdGF0ZW1lbnR9LAorICogICAge0BsaW5rIFRyeVN0YXRlbWVudH0sCisgKiAgICB7QGxpbmsgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50fSwKKyAqICAgIHtAbGluayBXaGlsZVN0YXRlbWVudH0KICAqIDwvcHJlPgotICogRm9yIEpMUzMsIGFuIGVuaGFuY2VkIGZvciBub2RlIHR5cGUgd2FzIGFkZGVkOgorICogPHA+Rm9yIEpMUzMsIGFuIGVuaGFuY2VkIGZvciBub2RlIHR5cGUgd2FzIGFkZGVkOjwvcD4KICAqIDxwcmU+CiAgKiBTdGF0ZW1lbnQ6Ci0gKiAgICBCbG9jawotICogICAgSWZTdGF0ZW1lbnQKLSAqICAgIEZvclN0YXRlbWVudAotICogICAgRW5oYW5jZWRGb3JTdGF0ZW1lbnQKLSAqICAgIFdoaWxlU3RhdGVtZW50Ci0gKiAgICBEb1N0YXRlbWVudAotICogICAgVHJ5U3RhdGVtZW50Ci0gKiAgICBTd2l0Y2hTdGF0ZW1lbnQKLSAqICAgIFN5bmNocm9uaXplZFN0YXRlbWVudAotICogICAgUmV0dXJuU3RhdGVtZW50Ci0gKiAgICBUaHJvd1N0YXRlbWVudAotICogICAgQnJlYWtTdGF0ZW1lbnQKLSAqICAgIENvbnRpbnVlU3RhdGVtZW50Ci0gKiAgICBFbXB0eVN0YXRlbWVudAotICogICAgRXhwcmVzc2lvblN0YXRlbWVudAotICogICAgTGFiZWxlZFN0YXRlbWVudAotICogICAgQXNzZXJ0U3RhdGVtZW50Ci0gKiAgICBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0gKiAgICBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLSAqICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbgotICogICAgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24KKyAqICAgIDxpPiZsdDtKTFMyIHN0YXRlbWVudHMmZ3Q7Li4uPC9pPiwKKyAqICAgIHtAbGluayBFbmhhbmNlZEZvclN0YXRlbWVudH0KICAqIDwvcHJlPgotICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSB7Ci0JCisKIAkvKioKIAkgKiBUaGUgbGVhZGluZyBjb21tZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCSAqIERlZmF1bHRzIHRvIG5vbmUuCi0JICogCisJICoKIAkgKiBAZGVwcmVjYXRlZCBUaGUgbGVhZGluZyBjb21tZW50IGZlYXR1cmUgd2FzIHJlbW92ZWQgaW4gMi4xLgogCSAqLwogCXByaXZhdGUgU3RyaW5nIG9wdGlvbmFsTGVhZGluZ0NvbW1lbnQgPSBudWxsOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBzdGF0ZW1lbnQgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlTdGF0ZW1lbnQoQVNUIGFzdCkgewogCQlzdXBlcihhc3QpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxlYWRpbmcgY29tbWVudCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcKIAkgKiBhbmQgZW5kaW5nIGNvbW1lbnQgZGVsaW1pdGVycywgYW5kIGFueSBlbWJlZGRlZCBsaW5lIGJyZWFrcy4KQEAgLTEwNiw3ICs4Nyw3IEBACiAJICogbXVzdCBlbmQgd2l0aCBhIGxpbmUgZGVsaW1pdGVyIChhcyBwZXIgSkxTIDMuNyksIGFuZCBtdXN0IG5vdCBjb250YWluCiAJICogbGluZSBicmVha3MuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29tbWVudCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAZGVwcmVjYXRlZCBUaGlzIGZlYXR1cmUgd2FzIHJlbW92ZWQgaW4gdGhlIDIuMSByZWxlYXNlIGJlY2F1c2UgaXQgd2FzCiAJICogb25seSBhIHBhcnRpYWwsIGFuZCBpbmFkZXF1YXRlLCBzb2x1dGlvbiB0byB0aGUgaXNzdWUgb2YgYXNzb2NpYXRpbmcKQEAgLTExOCw3ICs5OSw3IEBACiAJICogdGhlIHN0YXRlbWVudCdzIHNvdXJjZSByYW5nZS4KIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldExlYWRpbmdDb21tZW50KCkgewotCQlyZXR1cm4gb3B0aW9uYWxMZWFkaW5nQ29tbWVudDsKKwkJcmV0dXJuIHRoaXMub3B0aW9uYWxMZWFkaW5nQ29tbWVudDsKIAl9CiAKIAkvKioKQEAgLTE0Niw3ICsxMjcsNyBAQAogCSAqIDwvcHJlPgogCSAqIDwvY29kZT4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29tbWVudCBzdHJpbmcgaXMgaW52YWxpZAogCSAqIEBkZXByZWNhdGVkIFRoaXMgZmVhdHVyZSB3YXMgcmVtb3ZlZCBpbiB0aGUgMi4xIHJlbGVhc2UgYmVjYXVzZSBpdCB3YXMKQEAgLTE5MSwxNCArMTcyLDE0IEBACiAKIAkvKioKIAkgKiBDb3BpZXMgdGhlIGxlYWRpbmcgY29tbWVudCBmcm9tIHRoZSBnaXZlbiBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc291cmNlIHRoZSBzdGF0ZW1lbnQgdGhhdCBzdXBwbGllcyB0aGUgbGVhZGluZyBjb21tZW50CiAJICogQHNpbmNlIDIuMQogCSAqLwogCXZvaWQgY29weUxlYWRpbmdDb21tZW50KFN0YXRlbWVudCBzb3VyY2UpIHsKIAkJc2V0TGVhZGluZ0NvbW1lbnQoc291cmNlLmdldExlYWRpbmdDb21tZW50KCkpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA2LDUgKzE4Nyw1IEBACiAJCWludCBzaXplID0gQkFTRV9OT0RFX1NJWkUgKyAxICogNCArIHN0cmluZ1NpemUoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CiAJCXJldHVybiBzaXplOwogCX0KLX0JCit9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RyaW5nTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdHJpbmdMaXRlcmFsLmphdmEKaW5kZXggZDNlYjZmYy4uYzViN2I4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdHJpbmdMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdHJpbmdMaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMjUgKzIwLDI2IEBACiAKIC8qKgogICogU3RyaW5nIGxpdGVyYWwgbm9kZXMuCi0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAogCS8qKgotCSAqIFRoZSAiZXNjYXBlZFZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXNjYXBlZFZhbHVlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgU3RyaW5nfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIEVTQ0FQRURfVkFMVUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBFU0NBUEVEX1ZBTFVFX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmdMaXRlcmFsLmNsYXNzLCAiZXNjYXBlZFZhbHVlIiwgU3RyaW5nLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFN0cmluZ0xpdGVyYWwuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC00OSwyMCArNTAsMjAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBsaXRlcmFsIHN0cmluZywgaW5jbHVkaW5nIHF1b3RlcyBhbmQgZXNjYXBlczsgZGVmYXVsdHMgdG8gdGhlIAorCSAqIFRoZSBsaXRlcmFsIHN0cmluZywgaW5jbHVkaW5nIHF1b3RlcyBhbmQgZXNjYXBlczsgZGVmYXVsdHMgdG8gdGhlCiAJICogbGl0ZXJhbCBmb3IgdGhlIGVtcHR5IHN0cmluZy4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBlc2NhcGVkVmFsdWUgPSAiXCJcIiI7Ly8kTk9OLU5MUy0xJApAQCAtNzMsNyArNzQsNyBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVN0cmluZ0xpdGVyYWwoQVNUIGFzdCkgewpAQCAtODYsNyArODcsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwMiw3ICsxMDMsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldE9iamVjdFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIHZhbHVlKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTExNSw3ICsxMTYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJU3RyaW5nTGl0ZXJhbCByZXN1bHQgPSBuZXcgU3RyaW5nTGl0ZXJhbCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRFc2NhcGVkVmFsdWUoZ2V0RXNjYXBlZFZhbHVlKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTEzNSwyMCArMTM2LDIwIEBACiAJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlIHRvIHRoZSBnaXZlbiBzdHJpbmcKIAkgKiBsaXRlcmFsIHRva2VuLiBUaGUgdG9rZW4gaXMgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBhcHBlYXIKIAkgKiBpbiB0aGUgc291cmNlIHByb2dyYW0sIGluY2x1ZGluZyBlbmNsb3NpbmcgZG91YmxlIHF1b3RlcyBhbmQgZW1iZWRkZWQKIAkgKiBlc2NhcGVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc3RyaW5nIGxpdGVyYWwgdG9rZW4sIGluY2x1ZGluZyBlbmNsb3NpbmcgZG91YmxlCiAJICogICAgcXVvdGVzIGFuZCBlbWJlZGRlZCBlc2NhcGVzCi0JICovIAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy5lc2NhcGVkVmFsdWU7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGlzIGxpdGVyYWwgbm9kZSB0byB0aGUgZ2l2ZW4gc3RyaW5nIGxpdGVyYWwKIAkgKiB0b2tlbi4gVGhlIHRva2VuIGlzIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZQpAQCAtMTU5LDExICsxNjAsMTEgQEAKIAkgKiA8bGk+PGNvZGU+ImhlbGxvIHdvcmxkIjwvY29kZT4gPGNvZGU+c2V0TGl0ZXJhbCgiXCJoZWxsbyB3b3JsZFwiIik8L2NvZGU+PC9saT4KIAkgKiA8bGk+PGNvZGU+ImJvb1xuaG9vIjwvY29kZT4gPGNvZGU+c2V0TGl0ZXJhbCgiXCJib29cXG5ob29cIiIpPC9jb2RlPjwvbGk+CiAJICogPC91bD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0b2tlbiB0aGUgc3RyaW5nIGxpdGVyYWwgdG9rZW4sIGluY2x1ZGluZyBlbmNsb3NpbmcgZG91YmxlCiAJICogICAgcXVvdGVzIGFuZCBlbWJlZGRlZCBlc2NhcGVzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIHRva2VuKSB7CiAJCS8vIHVwZGF0ZSBpbnRlcm5hbFNldEVzY2FwZWRWYWx1ZShTdHJpbmcpIGlmIHRoaXMgaXMgY2hhbmdlZAogCQlpZiAodG9rZW4gPT0gbnVsbCkgewpAQCAtMTk5LDcgKzIwMCw3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuIAorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlLgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlLAogCSAqIDxwcmU+CkBAIC0yMDksMjEgKzIxMCwyMSBAQAogCSAqIDwvcHJlPgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNvbnZlcnRzIGZyb20gdGhlIHN0b3JlZCAKKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNvbnZlcnRzIGZyb20gdGhlIHN0b3JlZAogCSAqIHN0cmluZyBsaXRlcmFsIHRva2VuIHJldHVybmVkIGJ5IDxjb2RlPmdldEVzY2FwZWRMaXRlcmFsPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgd2l0aG91dCBlbmNsb3NpbmcgZG91YmxlIHF1b3RlcyBhbmQgZW1iZWRkZWQKIAkgKiAgICBlc2NhcGVzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIGNvbnZlcnRlZAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWxWYWx1ZSgpIHsKIAkJU3RyaW5nIHMgPSBnZXRFc2NhcGVkVmFsdWUoKTsKIAkJaW50IGxlbiA9IHMubGVuZ3RoKCk7CiAJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcIicgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcIicgKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJCisKIAkJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5hc3Quc2Nhbm5lcjsKIAkJY2hhcltdIHNvdXJjZSA9IHMudG9DaGFyQXJyYXkoKTsKIAkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKQEAgLTI0MiwyMiArMjQzLDIyIEBACiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuIAorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlLgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlLAogCSAqIDxwcmU+CiAJICogU3RyaW5nTGl0ZXJhbCBzOwogCSAqIHMuc2V0TGl0ZXJhbFZhbHVlKCJoZWxsb1xud29ybGQiKTsKLQkgKiBhc3NlcnQgcy5nZXRFc2NhcGVkVmFsdWUoIlwiaGVsbG9cXG53b3JsZFwiIik7CisJICogYXNzZXJ0IHMuZ2V0RXNjYXBlZFZhbHVlKCkuZXF1YWxzKCJcImhlbGxvXFxud29ybGRcIiIpOwogCSAqIGFzc2VydCBzLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaGVsbG9cbndvcmxkIik7CiAJICogPC9wcmU+CiAJICogPC9wPgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29udmVydHMgdG8gdGhlIHN0b3JlZCAKKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNvbnZlcnRzIHRvIHRoZSBzdG9yZWQKIAkgKiBzdHJpbmcgbGl0ZXJhbCB0b2tlbiBhY2NlcHRhYmxlIHRvIDxjb2RlPnNldEVzY2FwZWRMaXRlcmFsPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmcgdmFsdWUgd2l0aG91dCBlbmNsb3NpbmcgZG91YmxlIHF1b3RlcyBhbmQgCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB2YWx1ZSB3aXRob3V0IGVuY2xvc2luZyBkb3VibGUgcXVvdGVzIGFuZAogCSAqICAgIGVtYmVkZGVkIGVzY2FwZXMKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0CiAJICovCkBAIC0yNjcsNyArMjY4LDcgQEAKIAkJfQogCQlpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CiAJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAyKTsKLQkJCisKIAkJYi5hcHBlbmQoIlwiIik7IC8vIG9wZW5pbmcgZGVsaW1pdGVyIC8vJE5PTi1OTFMtMSQKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwpAQCAtMjkwLDkgKzI5MSw2IEBACiAJCQkJY2FzZSAnXCInOgogCQkJCQliLmFwcGVuZCgiXFxcIiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJYi5hcHBlbmQoIlxcXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKIAkJCQljYXNlICdcXCc6CiAJCQkJCWIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJYnJlYWs7CkBAIC0zMTksNyArMzE3LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnXDcnIDoKIAkJCQkJYi5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwkJCQorCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQliLmFwcGVuZChjKTsKIAkJCX0KQEAgLTMzMSwxMCArMzI5LDEwIEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7Ci0JCWludCBzaXplID0gQkFTRV9OT0RFX1NJWkUgKyAxICogNCArIHN0cmluZ1NpemUoZXNjYXBlZFZhbHVlKTsKKwkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0ICsgc3RyaW5nU2l6ZSh0aGlzLmVzY2FwZWRWYWx1ZSk7CiAJCXJldHVybiBzaXplOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQppbmRleCAxZWYyNzZkLi5mMDM2ZGU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSwyOCArMjUsMjkgQEAKICAqIC0gcHJvcGVydGllcyB3aGVyZSB0aGUgdmFsdWUgaXMgYSBsaXN0IG9mIEFTVCBub2RlczsKICAqIGZvciBleGFtcGxlLCB0aGUgc3RhdGVtZW50cyBvZiBhIHtAbGluayBCbG9ja308L2xpPgogICogPC91bD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHsKLQkKKwogCS8qKgogCSAqIFByb3BlcnR5IGlkLgogCSAqLwogCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5SWQ7Ci0JCisKIAkvKioKIAkgKiBUaGUgY29uY3JldGUgQVNUIG5vZGUgdHlwZSB0aGF0IG93bnMgdGhpcyBwcm9wZXJ0eS4KIAkgKi8KIAlwcml2YXRlIGZpbmFsIENsYXNzIG5vZGVDbGFzczsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIG5vZGUgdHlwZQogCSAqIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IGlkLgogCSAqIE5vdGUgdGhhdCB0aGlzIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIHBhY2thZ2UtcHJpdmF0ZSBzbyB0aGF0CiAJICogcHJvcGVydHkgZGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSB0aGUgQVNUCiAJICogaW1wbGVtZW50YXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZUNsYXNzIGNvbmNyZXRlIEFTVCBub2RlIHR5cGUgdGhhdCBvd25zIHRoaXMgcHJvcGVydHkKIAkgKiBAcGFyYW0gcHJvcGVydHlJZCB0aGUgcHJvcGVydHkgaWQKIAkgKi8KQEAgLTU3LDU5ICs1OCw1OSBAQAogCQl0aGlzLnByb3BlcnR5SWQgPSBwcm9wZXJ0eUlkOwogCQl0aGlzLm5vZGVDbGFzcyA9IG5vZGVDbGFzczsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHByb3BlcnR5LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgaWQKIAkgKi8KIAlwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eUlkOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIEFTVCBub2RlIHR5cGUgdGhhdCBvd25zIHRoaXMgcHJvcGVydHkuCiAJICogPHA+CiAJICogRm9yIGV4YW1wbGUsIGZvciBhbGwgcHJvcGVydGllcyBvZiB0aGUgbm9kZSB0eXBlCiAJICogVHlwZURlY2xhcmF0aW9uLCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPlR5cGVEZWNsYXJhdGlvbi5jbGFzczwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbm9kZSB0eXBlIHRoYXQgb3ducyB0aGlzIHByb3BlcnR5CiAJICovCiAJcHVibGljIGZpbmFsIENsYXNzIGdldE5vZGVDbGFzcygpIHsKIAkJcmV0dXJuIHRoaXMubm9kZUNsYXNzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGEgc2ltcGxlIHByb3BlcnR5CiAJICogKGluc3RhbmNlIG9mIHtAbGluayBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3J9LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbXBsZSBwcm9wZXJ0eSwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgc2ltcGxlIHByb3BlcnR5LCBhbmQKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTaW1wbGVQcm9wZXJ0eSgpewogCQlyZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGEgY2hpbGQgcHJvcGVydHkKIAkgKiAoaW5zdGFuY2Ugb2Yge0BsaW5rIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yfS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBjaGlsZCBwcm9wZXJ0eSwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2hpbGQgcHJvcGVydHksIGFuZAogCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoaWxkUHJvcGVydHkoKSB7CiAJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBhIGNoaWxkIGxpc3QgcHJvcGVydHkKIAkgKiAoaW5zdGFuY2Ugb2Yge0BsaW5rIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcn0uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2hpbGQgbGlzdCBwcm9wZXJ0eSwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2hpbGQgbGlzdCBwcm9wZXJ0eSwgYW5kCiAJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGRMaXN0UHJvcGVydHkoKSB7IAorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGRMaXN0UHJvcGVydHkoKSB7CiAJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcik7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEKaW5kZXggYjhkMDJlMS4uMGFkOWQxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCw1NSArMjgsNTYgQEAKICAqICAgICAgICAgWyA8Yj4mbHQ7PC9iPiBUeXBlIHsgPGI+LDwvYj4gVHlwZSB9IDxiPiZndDs8L2I+IF0KICAqICAgICAgICAgPGI+c3VwZXI8L2I+IDxiPig8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb24gfSBdIDxiPik8L2I+IDxiPjs8L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE9QVElPTkFMLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX0FSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uY2xhc3MsICJ0eXBlQXJndW1lbnRzIiwgVHlwZS5jbGFzcywgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAiYXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiYXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEFSR1VNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uY2xhc3MsICJhcmd1bWVudHMiLCBFeHByZXNzaW9uLmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMDsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoRVhQUkVTU0lPTl9QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoQVJHVU1FTlRTX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoRVhQUkVTU0lPTl9QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKQEAgLTg4LDExICs4OSwxMSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTEwMywxNCArMTA0LDE0IEBACiAJCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwogCQl9CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCiAJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pLiAKKwkgKiBUaGUgdHlwZSBhcmd1bWVudHMgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCkBAIC0xMTgsOCArMTE5LDggQEAKIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdHlwZUFyZ3VtZW50cyA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChBUkdVTUVOVFNfUFJPUEVSVFkpOwpAQCAtMTI4LDExICsxMjksMTEgQEAKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudAogCSAqIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIG5vIHR5cGUgYXJndW1lbnRzLCBhbmQgYW4gZW1wdHkgbGlzdAogCSAqIG9mIGFyZ3VtZW50cy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbihBU1QgYXN0KSB7Ci0JCXN1cGVyKGFzdCk7CQorCQlzdXBlcihhc3QpOwogCQlpZiAoYXN0LmFwaUxldmVsID49IEFTVC5KTFMzKSB7CiAJCQl0aGlzLnR5cGVBcmd1bWVudHMgPSBuZXcgQVNUTm9kZS5Ob2RlTGlzdChUWVBFX0FSR1VNRU5UU19QUk9QRVJUWSk7CiAJCX0KQEAgLTE0NCw3ICsxNDUsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTg3LDcgKzE4OCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiByZXN1bHQgPSBuZXcgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigKIAkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhwcmVzc2lvbigpKSk7CkBAIC0yMjEsMjIgKzIyMiwyMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50LAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxFeHByZXNzaW9uOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbgogCSAqIHN0YXRlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI0NCw3ICsyNDUsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxFeHByZXNzaW9uOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGV4cHJlc3Npb24sIEVYUFJFU1NJT05fUFJPUEVSVFkpOwpAQCAtMjU1LDEzICsyNTYsMTMgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cyBvZiB0aGlzIGNvbnN0cnVjdG9yCiAJICogaW52b2NhdGlvbiAoYWRkZWQgaW4gSkxTMyBBUEkpLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHR5cGUgYXJndW1lbnRzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyBMaXN0IHR5cGVBcmd1bWVudHMoKSB7CiAJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4ganVzdCBjYWxsaW5nIHVuc3VwcG9ydGVkSW4yKCkgdG8gY2hlY2sKIAkJaWYgKHRoaXMudHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CkBAIC0yNjksMTQgKzI3MCwxNCBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGVBcmd1bWVudHM7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgaW4gdGhpcyBzdXBlcgogCSAqIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKLQkgKi8gCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pCisJICovCiAJcHVibGljIExpc3QgYXJndW1lbnRzKCkgewogCQlyZXR1cm4gdGhpcy5hcmd1bWVudHM7CiAJfQpAQCAtMjg4LDEwICsyODksMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nCiAJICogICAgY2Fubm90IGJlIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZUNvbnN0cnVjdG9yKHRoaXMpOwogCX0KQEAgLTMwMyw3ICszMDQsNyBAQAogCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyRmllbGRBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCmluZGV4IDAyNTA1MDEuLjEyZWJiZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDM4ICsyMSwzOSBAQAogICogU3VwZXJGaWVsZEFjY2VzczoKICAqICAgICBbIENsYXNzTmFtZSA8Yj4uPC9iPiBdIDxiPnN1cGVyPC9iPiA8Yj4uPC9iPiBJZGVudGlmaWVyCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIDxwPgogICogU2VlIDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPiBmb3IgZ3VpZGVsaW5lcyBvbiBoYW5kbGluZyBvdGhlciBleHByZXNzaW9ucwogICogdGhhdCByZXNlbWJsZSBxdWFsaWZpZWQgbmFtZXMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2VlIEZpZWxkQWNjZXNzCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFN1cGVyRmllbGRBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAogCS8qKgotCSAqIFRoZSAicXVhbGlmaWVyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAicXVhbGlmaWVyIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgTmFtZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFFVQUxJRklFUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUVVBTElGSUVSX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN1cGVyRmllbGRBY2Nlc3MuY2xhc3MsICJxdWFsaWZpZXIiLCBOYW1lLmNsYXNzLCBPUFRJT05BTCwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihTdXBlckZpZWxkQWNjZXNzLmNsYXNzLCAibmFtZSIsIFNpbXBsZU5hbWUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoU3VwZXJGaWVsZEFjY2Vzcy5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTY0LDE3ICs2NSwxNyBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBvcHRpb25hbCBxdWFsaWZpZXI7IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgogCSAqLwpAQCAtODgsMTIgKzg5LDEyIEBACiAKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYSBzdXBlciBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbiBvd25lZAotCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIGZpZWxkIG5hbWUgaXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgCisJICogYnkgdGhlIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgZmllbGQgbmFtZSBpcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAogCSAqIG5hbWUsIGFuZCB0aGVyZSBpcyBubyBxdWFsaWZpZXIuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJU3VwZXJGaWVsZEFjY2VzcyhBU1QgYXN0KSB7CkBAIC0xMDYsNyArMTA3LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMzAsNyArMTMxLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE0Myw3ICsxNDQsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJU3VwZXJGaWVsZEFjY2VzcyByZXN1bHQgPSBuZXcgU3VwZXJGaWVsZEFjY2Vzcyh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0TmFtZSgpKSk7CiAJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTY5LDI4ICsxNzAsMjggQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJzdXBlciIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24sIG9yIAorCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJzdXBlciIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24sIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllciBuYW1lIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIE5hbWUgZ2V0UXVhbGlmaWVyKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbFF1YWxpZmllcjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIG9yIGNsZWFycyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgInN1cGVyIiBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoTmFtZSBuYW1lKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsUXVhbGlmaWVyOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5hbWUsIFFVQUxJRklFUl9QUk9QRVJUWSk7CkBAIC0xOTksMTEgKzIwMCwxMSBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFjY2Vzc2VkIGluIHRoaXMgInN1cGVyIiBmaWVsZCBhY2Nlc3MgCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWNjZXNzZWQgaW4gdGhpcyAic3VwZXIiIGZpZWxkIGFjY2VzcwogCSAqIGV4cHJlc3Npb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBmaWVsZCBuYW1lCi0JICovIAorCSAqLwogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLmZpZWxkTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMjMzLDE4ICsyMzQsMTggQEAKIAlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyByZXNvbHZlRmllbGRCaW5kaW5nKCkgewogCQlyZXR1cm4gdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZUZpZWxkKHRoaXMpOwogCX0KLQkJCisKIAkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhY2Nlc3NlZCBpbiB0aGlzICJzdXBlciIgZmllbGQgYWNjZXNzIAorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFjY2Vzc2VkIGluIHRoaXMgInN1cGVyIiBmaWVsZCBhY2Nlc3MKIAkgKiBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZpZWxkTmFtZSB0aGUgZmllbGQgbmFtZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIGZpZWxkTmFtZSkgewogCQlpZiAoZmllbGROYW1lID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI2MiwxMiArMjYzLDEyIEBACiAJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQogCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQltZW1TaXplKCkKIAkJCSsgKHRoaXMub3B0aW9uYWxRdWFsaWZpZXIgPT0gbnVsbCA/IDAgOiBnZXRRdWFsaWZpZXIoKS50cmVlU2l6ZSgpKQogCQkJKyAodGhpcy5maWVsZE5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyTWV0aG9kSW52b2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdXBlck1ldGhvZEludm9jYXRpb24uamF2YQppbmRleCBjNmYwMjM0Li41M2FmNGYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyTWV0aG9kSW52b2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJNZXRob2RJbnZvY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsMzIgKzMxLDMzIEBACiAgKiA8L3ByZT4KICAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogCiAJLyoqCi0JICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJxdWFsaWZpZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgUVVBTElGSUVSX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN1cGVyTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgInF1YWxpZmllciIsIE5hbWUuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJ0eXBlQXJndW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFN1cGVyTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgInR5cGVBcmd1bWVudHMiLCBUeXBlLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBOQU1FX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN1cGVyTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImFyZ3VtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBBUkdVTUVOVFNfUFJPUEVSVFkgPQpAQCAtMTIwLDcgKzEyMSw3IEBACiAJcHJpdmF0ZSBOYW1lIG9wdGlvbmFsUXVhbGlmaWVyID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSB0eXBlIGFyZ3VtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikuCisJICogVGhlIHR5cGUgYXJndW1lbnRzIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICogTnVsbCBpbiBKTFMyLiBBZGRlZCBpbiBKTFMzOyBkZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0CiAJICogKHNlZSBjb25zdHJ1Y3RvcikuCiAJICogQHNpbmNlIDMuMQpAQCAtMTM1LDcgKzEzNiw3IEBACiAKIAkvKioKIAkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOgotCSAqIDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQogCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChBUkdVTUVOVFNfUFJPUEVSVFkpOwpAQCAtMjExLDcgKzIxMiw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlTdXBlck1ldGhvZEludm9jYXRpb24gcmVzdWx0ID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOwogCQlpZiAodGhpcy5hc3QuYXBpTGV2ZWwgPj0gQVNULkpMUzMpIHsKQEAgLTI5Myw3ICsyOTQsNyBAQAogCSAqIGludm9jYXRpb24gKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlR5cGU8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQpAQCAtMzUxLDcgKzM1Miw3IEBACiAJICogInN1cGVyIiBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLgogCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KQogCSAqLwogCXB1YmxpYyBMaXN0IGFyZ3VtZW50cygpIHsKIAkJcmV0dXJuIHRoaXMuYXJndW1lbnRzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaENhc2UuamF2YQppbmRleCBjNDQ3Y2NkLi44Nzk1M2E2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaENhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwyNSArMjQsMjYgQEAKICAqCQk8Yj5kZWZhdWx0PC9iPiA8Yj46PC9iPgogICogPC9wcmU+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFN3aXRjaENhc2UgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN3aXRjaENhc2UuY2xhc3MsICJleHByZXNzaW9uIiwgRXhwcmVzc2lvbi5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFN3aXRjaENhc2UuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC01MywxNyArNTQsMTcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGxhemlseSBpbml0aWFsaXplZCAoYnV0CiAJICogZG9lcyA8Yj5ub3Q8L2I+IGRlZmF1bHQgdG8gbm9uZSkuCkBAIC03NSwxMSArNzYsMTEgQEAKIAkgKiBJbmRpY2F0ZXMgd2hldGhlciA8Y29kZT5vcHRpb25hbEV4cHJlc3Npb248L2NvZGU+IGhhcyBiZWVuIGluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgYm9vbGVhbiBleHByZXNzaW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKKwogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgc3dpdGNoIGNhc2UgcHNldWRvLXN0YXRlbWVudCBvd25lZCBieSB0aGUgCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBzd2l0Y2ggY2FzZSBwc2V1ZG8tc3RhdGVtZW50IG93bmVkIGJ5IHRoZQogCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgZXhwcmVzc2lvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlTd2l0Y2hDYXNlKEFTVCBhc3QpIHsKQEAgLTkyLDcgKzkzLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMDgsNyArMTA5LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyMSw3ICsxMjIsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJU3dpdGNoQ2FzZSByZXN1bHQgPSBuZXcgU3dpdGNoQ2FzZSh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKQEAgLTE0NiwxMyArMTQ3LDEzIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3dpdGNoIGNhc2UsIG9yIAorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzd2l0Y2ggY2FzZSwgb3IKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lICh0aGUgImRlZmF1bHQ6IiBjYXNlKS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoIXRoaXMuZXhwcmVzc2lvbkluaXRpYWxpemVkKSB7CiAJCQkvLyBsYXp5IGluaXQgbXVzdCBiZSB0aHJlYWQtc2FmZSBmb3IgcmVhZGVycwpAQCAtMTY3LDEyICsxNjgsMTIgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5vcHRpb25hbEV4cHJlc3Npb247CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHN3aXRjaCBjYXNlLCBvciBjbGVhcnMgaXQgKHR1cm5zIGl0IGludG8KIAkgKiB0aGUgICJkZWZhdWx0OiIgY2FzZSkuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gCisJICoKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwogCSAqICAgIHR1cm4gaXQgaW50byB0aGUgICJkZWZhdWx0OiIgY2FzZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE4MCw3ICsxODEsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxFeHByZXNzaW9uOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGV4cHJlc3Npb24sIEVYUFJFU1NJT05fUFJPUEVSVFkpOwpAQCAtMTk1LDI3ICsxOTYsMjcgQEAKIAkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAJICogPGNvZGU+Z2V0RXhwcmVzc2lvbigpID09IG51bGw8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBzd2l0Y2ggY2FzZSwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgYSBub24tZGVmYXVsdCBzd2l0Y2ggY2FzZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSAgewogCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpID09IG51bGw7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgdHJlZVNpemUoKSB7CiAJCXJldHVybgogCQkJbWVtU2l6ZSgpCi0JCQkrICh0aGlzLm9wdGlvbmFsRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IG9wdGlvbmFsRXhwcmVzc2lvbi50cmVlU2l6ZSgpKTsKKwkJCSsgKHRoaXMub3B0aW9uYWxFeHByZXNzaW9uID09IG51bGwgPyAwIDogdGhpcy5vcHRpb25hbEV4cHJlc3Npb24udHJlZVNpemUoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoU3RhdGVtZW50LmphdmEKaW5kZXggNjE0NDczNy4uY2QxOWUyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaFN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDcgQEAKICAqIDxwPgogICogPHByZT4KICAqIFN3aXRjaFN0YXRlbWVudDoKLSAqCQk8Yj5zd2l0Y2g8L2I+IDxiPig8L2I+IEV4cHJlc3Npb24gPGI+KTwvYj4gCisgKgkJPGI+c3dpdGNoPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+CiAgKiAJCQk8Yj57PC9iPiB7IFN3aXRjaENhc2UgfCBTdGF0ZW1lbnQgfSB9IDxiPn08L2I+CiAgKiBTd2l0Y2hDYXNlOgogICoJCTxiPmNhc2U8L2I+IEV4cHJlc3Npb24gIDxiPjo8L2I+CkBAIC0yOCwzMiArMjgsMzMgQEAKICAqIDxjb2RlPlN3aXRjaENhc2U8L2NvZGU+IG5vZGVzIGFyZSB0cmVhdGVkIGFzIGEga2luZCBvZgogICogPGNvZGU+U3RhdGVtZW50PC9jb2RlPi4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkJCQorCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFN3aXRjaFN0YXRlbWVudC5jbGFzcywgImV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInN0YXRlbWVudHMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJzdGF0ZW1lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgU1RBVEVNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFNUQVRFTUVOVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFN3aXRjaFN0YXRlbWVudC5jbGFzcywgInN0YXRlbWVudHMiLCBTdGF0ZW1lbnQuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFN3aXRjaFN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTY1LDE3ICs2NiwxNyBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleHByZXNzaW9uLgpAQCAtODQsMjAgKzg1LDIwIEBACiAKIAkvKioKIAkgKiBUaGUgc3RhdGVtZW50cyBhbmQgU3dpdGNoQ2FzZSBub2RlcwotCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPlN0YXRlbWVudDwvY29kZT4pLgorCSAqIChlbGVtZW50IHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwogCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBzdGF0ZW1lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoU1RBVEVNRU5UU19QUk9QRVJUWSk7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgc3dpdGNoIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgc3dpdGNoIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbgogCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHN3aWN0aCBzdGF0ZW1lbnQgaGFzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCiAJICogZXhwcmVzc2lvbiwgYW5kIGFuIGVtcHR5IGxpc3Qgb2Ygc3dpdGNoIGdyb3Vwcy4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlTd2l0Y2hTdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtMTEwLDcgKzExMSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTI2LDcgKzEyNyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMzcsNyArMTM4LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNTAsNyArMTUxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVN3aXRjaFN0YXRlbWVudCByZXN1bHQgPSBuZXcgU3dpdGNoU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnN0YXRlbWVudHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBzdGF0ZW1lbnRzKCkpKTsKQEAgLTE3NywxMiArMTc4LDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3dpdGNoIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xOTYsMTAgKzE5NywxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yMDcsNyArMjA4LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIxNywyNiArMjE4LDI2IEBACiAJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGV4cHJlc3Npb24sIEVYUFJFU1NJT05fUFJPUEVSVFkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc3dpdGNoIHN0YXRlbWVudC4KLQkgKiBXaXRoaW4gdGhpcyBsaXN0LCA8Y29kZT5Td2l0Y2hDYXNlPC9jb2RlPiBub2RlcyBtYXJrIHRoZSBzdGFydCBvZiAKKwkgKiBXaXRoaW4gdGhpcyBsaXN0LCA8Y29kZT5Td2l0Y2hDYXNlPC9jb2RlPiBub2RlcyBtYXJrIHRoZSBzdGFydCBvZgogCSAqIHRoZSBzd2l0Y2ggZ3JvdXBzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHN0YXRlbWVudCBub2RlcwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlN0YXRlbWVudDwvY29kZT4pCi0JICovIAorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBTdGF0ZW1lbnR9KQorCSAqLwogCXB1YmxpYyBMaXN0IHN0YXRlbWVudHMoKSB7CiAJCXJldHVybiB0aGlzLnN0YXRlbWVudHM7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCmluZGV4IDJlMGU1NzUuLmRiYzI3ZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwzMiArMjEsMzMgQEAKICAqIFN5bmNocm9uaXplZFN0YXRlbWVudDoKICAqICAgIDxiPnN5bmNocm9uaXplZDwvYj4gPGI+KDwvYj4gRXhwcmVzc2lvbiA8Yj4pPC9iPiBCbG9jawogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAKIAkvKioKLQkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgRXhwcmVzc2lvbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEVYUFJFU1NJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoU3luY2hyb25pemVkU3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiYm9keSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBCbG9ja30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoU3luY2hyb25pemVkU3RhdGVtZW50LmNsYXNzLCAiYm9keSIsIEJsb2NrLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFN5bmNocm9uaXplZFN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTU4LDIwICs1OSwyMCBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkJCQorCiAJLyoqCi0JICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwgYnV0CiAJICogbGVnYWwsIGV4cHJlc3Npb24uCiAJICovCiAJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwpAQCAtODIsMTMgKzgzLDEzIEBACiAJcHJpdmF0ZSBCbG9jayBib2R5ID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBhbmQgdGhlCiAJICogYmxvZHkgaXMgYW4gZW1wdHkgYmxvY2suCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJU3luY2hyb25pemVkU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyNSw3ICsxMjYsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM4LDcgKzEzOSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOwpAQCAtMTY1LDEyICsxNjYsMTIgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzeW5jaHJvbml6ZWQgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4NCwxMCArMTg1LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3luY2hyb25pemVkIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTIwOCw5ICsyMDksOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBib2R5IGJsb2NrIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIEJsb2NrIGdldEJvZHkoKSB7CiAJCWlmICh0aGlzLmJvZHkgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIyNCwxMCArMjI1LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuYm9keTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgc3luY2hyb25pemVkIHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBibG9jayB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIzNSw3ICsyMzYsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0Qm9keShCbG9jayBibG9jaykgewogCQlpZiAoYmxvY2sgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjQ1LDE0ICsyNDYsMTQgQEAKIAkJdGhpcy5ib2R5ID0gYmxvY2s7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGJsb2NrLCBCT0RZX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UYWdFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RhZ0VsZW1lbnQuamF2YQppbmRleCAxOTQ4MjgwLi5jYjg0NjkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RhZ0VsZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RhZ0VsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCwzNSArMjgsMzYgQEAKICAqICAgICBNZW1iZXJSZWYKICAqICAgICA8Yj57PC9iPiBUYWdFbGVtZW50IDxiPn08L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzZWUgSmF2YWRvYwogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBUYWdFbGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElEb2NFbGVtZW50IHsKIAogCS8qKgotCSAqIFRoZSAidGFnTmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KLQkgKiAKKwkgKiBUaGUgInRhZ05hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBTdHJpbmd9KS4KKwkgKgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBUQUdfTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIFRBR19OQU1FX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihUYWdFbGVtZW50LmNsYXNzLCAidGFnTmFtZSIsIFN0cmluZy5jbGFzcywgT1BUSU9OQUwpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgImZyYWdtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImZyYWdtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSURvY0VsZW1lbnR9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgRlJBR01FTlRTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgRlJBR01FTlRTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihUYWdFbGVtZW50LmNsYXNzLCAiZnJhZ21lbnRzIiwgSURvY0VsZW1lbnQuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUYWdFbGVtZW50LmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtNjQsMjEgKzY1LDIxIEBACiAJCWFkZFByb3BlcnR5KEZSQUdNRU5UU19QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlMgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExpc3QgcHJvcGVydHlEZXNjcmlwdG9ycyhpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCX0KLQkKKwogCS8qKgogCSAqIFN0YW5kYXJkIGRvYyB0YWcgbmFtZSAodmFsdWUge0B2YWx1ZX0pLgogCSAqLwpAQCAtMTg2LDM2ICsxODcsMzYgQEAKIAkgKiBUaGUgdGFnIG5hbWUsIG9yIG51bGwgaWYgbm9uZTsgZGVmYXVsdHMgdG8gbnVsbC4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBvcHRpb25hbFRhZ05hbWUgPSBudWxsOwotCQorCiAJLyoqCi0JICogVGhlIGxpc3Qgb2YgZG9jIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPklEb2NFbGVtZW50PC9jb2RlPikuIAorCSAqIFRoZSBsaXN0IG9mIGRvYyBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSURvY0VsZW1lbnR9KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwotCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBmcmFnbWVudHMgPSAKKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgZnJhZ21lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRlJBR01FTlRTX1BST1BFUlRZKTsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdGFnIGVsZW1lbnQgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiBUaGUgbmV3IG5vZGUgaGFzIG5vIG5hbWUgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgZnJhZ21lbnRzLgogCSAqIDxwPgotCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCi0JICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZQorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlCiAJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlUYWdFbGVtZW50KEFTVCBhc3QpIHsKIAkJc3VwZXIoYXN0KTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNDIsNyArMjQzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yNTUsMTIgKzI1NiwxMiBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJVGFnRWxlbWVudCByZXN1bHQgPSBuZXcgVGFnRWxlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRUYWdOYW1lKGdldFRhZ05hbWUoKSk7CiAJCXJlc3VsdC5mcmFnbWVudHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBmcmFnbWVudHMoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjkxLDExICsyOTIsMTEgQEAKICAgICAgKiB0aGUgZmlyc3QgZXhwbGljaXQgdGFnLgogICAgICAqCiAJICogQHJldHVybiB0aGUgdGFnIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbFRhZ05hbWU7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgdGFnIG5hbWUgb2YgdGhpcyBub2RlIHRvIHRoZSBnaXZlbiB2YWx1ZS4KIAkgKiBGb3IgdG9wIGxldmVsIGRvYyB0YWdzIHN1Y2ggYXMgcGFyYW1ldGVyIHRhZ3MsIHRoZSB0YWcgbmFtZQpAQCAtMzA3LDIyICszMDgsMjIgQEAKIAkgKiB0aGUgZmlyc3QgZXhwbGljaXQgdGFnLgogCSAqCiAJICogQHBhcmFtIHRhZ05hbWUgdGhlIHRhZyBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKIAkJcHJlVmFsdWVDaGFuZ2UoVEFHX05BTUVfUFJPUEVSVFkpOwogCQl0aGlzLm9wdGlvbmFsVGFnTmFtZSA9IHRhZ05hbWU7CiAJCXBvc3RWYWx1ZUNoYW5nZShUQUdfTkFNRV9QUk9QRVJUWSk7CiAJfQotCQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBmcmFnbWVudHMgaW4gdGhpcyB0YWcgZWxlbWVudC4gCisJICogUmV0dXJucyB0aGUgbGl2ZSBsaXN0IG9mIGZyYWdtZW50cyBpbiB0aGlzIHRhZyBlbGVtZW50LgogCSAqIDxwPgogCSAqIFRoZSBmcmFnbWVudHMgY292ZXIgZXZlcnl0aGluZyBmb2xsb3dpbmcgdGhlIHRhZyBuYW1lCiAJICogKG9yIGV2ZXJ5dGhpbmcgaWYgdGhlcmUgaXMgbm8gdGFnIG5hbWUpLCBhbmQgZ2VuZXJhbGx5IG9taXQKIAkgKiBlbWJlZGRlZCBsaW5lIGJyZWFrcyAoYW5kIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBuZXcgbGluZXMsCiAJICogaW5jbHVkaW5nIGFueSBsZWFkaW5nICIqIikuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudH0KIAkgKiBub2RlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGFnIGVsZW1lbnRzIChlLmcuLCAiQGxpbmsiKQotCSAqIG5lc3RlZCB3aXRoaW4gdGhpcyB0YWcgZWxlbWVudC4gCisJICogbmVzdGVkIHdpdGhpbiB0aGlzIHRhZyBlbGVtZW50LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBIZXJlIGFyZSBzb21lIHR5cGljYWwgZXhhbXBsZXM6CkBAIC0zMzMsNyArMzM0LDcgQEAKIAkgKiBUYWdFbGVtZW50IHdpdGggdGFnIG5hbWUgIkBwYXJhbSI7CiAJICogMiBmcmFnbWVudHM6IFNpbXBsZU5hbWUgKCJhcmdzIiksIFRleHRFbGVtZW50CiAJICogKCIgdGhlIHByb2dyYW0gYXJndW1lbnRzIik8L2xpPgotCSAqIDxsaT4iQHJldHVybiBTZWUgeyYjNjQ7bGluayAjZm9vIGZvb30gaW5zdGVhZC4iIC0gCisJICogPGxpPiJAcmV0dXJuIFNlZSB7JiM2NDtsaW5rICNmb28gZm9vfSBpbnN0ZWFkLiIgLQogCSAqIFRhZ0VsZW1lbnQgd2l0aCB0YWcgbmFtZSAiQHJldHVybiI7CiAJICogMyBmcmFnbWVudHM6IFRleHRFbGVtZW50ICgiU2VlICIpLAogCSAqIFRhZ0VsZW1lbnQgKGZvciAiJiM2NDtsaW5rICNmb28gZm9vIiksCkBAIC0zNDYsMjQgKzM0NywyNCBAQAogCSAqIDxwPgogCSAqIEFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMgZnJvbSB0aGlzIGxpc3QgYWZmZWN0cyB0aGlzIG5vZGUKIAkgKiBkeW5hbWljYWxseS4gVGhlIG5vZGVzIGluIHRoaXMgbGlzdCBtYXkgYmUgb2YgdmFyaW91cwotCSAqIHR5cGVzLCBpbmNsdWRpbmcge0BsaW5rIFRleHRFbGVtZW50fSwgCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UYWdFbGVtZW50fSwge0BsaW5rIE5hbWV9LCAKKwkgKiB0eXBlcywgaW5jbHVkaW5nIHtAbGluayBUZXh0RWxlbWVudH0sCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UYWdFbGVtZW50fSwge0BsaW5rIE5hbWV9LAogCSAqIHtAbGluayBNZW1iZXJSZWZ9LCBhbmQge0BsaW5rIE1ldGhvZFJlZn0uCiAJICogQ2xpZW50cyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIGxpc3Qgb2YgdHlwZXMgbWF5IGdyb3cgaW4KIAkgKiB0aGUgZnV0dXJlLCBhbmQgd3JpdGUgdGhlaXIgY29kZSB0byBkZWFsIHdpdGggdW5leHBlY3RlZAogCSAqIG5vZGVzIHR5cGVzLiBIb3dldmVyLCBhdHRlbXB0cyB0byBhZGQgYSBub24tcHJvc2NyaWJlZCB0eXBlCiAJICogb2Ygbm9kZSB3aWxsIHRyaWdnZXIgYW4gZXhjZXB0aW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGRvYyBlbGVtZW50cyBpbiB0aGlzIHRhZyBlbGVtZW50Ci0JICogKGVsZW1lbnQgdHlwZTogPGNvZGU+QVNUTm9kZTwvY29kZT4pCi0JICovIAorCSAqIChlbGVtZW50IHR5cGU6IHtAbGluayBJRG9jRWxlbWVudH0pCisJICovCiAJcHVibGljIExpc3QgZnJhZ21lbnRzKCkgewogCQlyZXR1cm4gdGhpcy5mcmFnbWVudHM7CiAJfQogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGFnIGVsZW1lbnQgaXMgbmVzdGVkIHdpdGhpbiBhbm90aGVyCi0JICogdGFnIGVsZW1lbnQuIE5lc3RlZCB0YWcgZWxlbWVudHMgYXBwZWFycyBlbmNsb3NlZCBpbiAKKwkgKiB0YWcgZWxlbWVudC4gTmVzdGVkIHRhZyBlbGVtZW50cyBhcHBlYXJzIGVuY2xvc2VkIGluCiAJICogInsiIGFuZCAifSI7IGNlcnRhaW4gZG9jIHRhZ3MsIGluY2x1ZGluZyAiQGxpbmsiIGFuZAogCSAqICJAbGlua3BsYWluIiBhcmUgb25seSBtZWFuaW5nZnVsIGFzIG5lc3RlZCB0YWdzLgogCSAqIFRvcC1sZXZlbCAoaS5lLiwgbm9uLW5lc3RlZCkgZG9jIHRhZ3MgYmVnaW4gb24gYSBuZXcgbGluZTsKQEAgLTM3Myw3ICszNzQsNyBAQAogCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kcyBjaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIHBhcmVudAogCSAqIG9mIHRoaXMgbm9kZSBpcyBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudH0uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaXMgYSBuZXN0ZWQgdGFnIGVsZW1lbnQsCiAJICogYW5kIGZhbHNlIGlmIHRoaXMgbm9kZSBpcyBlaXRoZXIgcGFyZW50ZWQgYnkgYSBkb2MgY29tbWVudCBub2RlCiAJICogKHtAbGluayBKYXZhZG9jfSksIG9yIGlzIHVucGFyZW50ZWQKQEAgLTM4MSw3ICszODIsNyBAQAogCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewogCQlyZXR1cm4gKGdldFBhcmVudCgpIGluc3RhbmNlb2YgVGFnRWxlbWVudCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zODksNyArMzkwLDcgQEAKIAkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDIgKiA0ICsgc3RyaW5nU2l6ZSh0aGlzLm9wdGlvbmFsVGFnTmFtZSk7CiAJCXJldHVybiBzaXplOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UZXh0RWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UZXh0RWxlbWVudC5qYXZhCmluZGV4IGI0OWVmYWUuLjc3NGM4NjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGV4dEVsZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RleHRFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsNzYgKzIyLDc3IEBACiAgKiBUZXh0RWxlbWVudDoKICAqICAgICBTZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIG5vdCBpbmNsdWRpbmcgYSBjbG9zZSBjb21tZW50IGRlbGltaXRlciA8Yj4qPC9iPjxiPi88L2I+CiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzZWUgSmF2YWRvYwogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0RWxlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRG9jRWxlbWVudCB7CiAKIAkvKioKLQkgKiBUaGUgInRlc3QiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCi0JICogCisJICogVGhlICJ0ZXh0IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgU3RyaW5nfSkuCisJICoKIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgVEVYVF9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIFRFWFRfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFRleHRFbGVtZW50LmNsYXNzLCAidGV4dCIsIFN0cmluZy5jbGFzcywgTUFOREFUT1JZKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoVGV4dEVsZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KFRFWFRfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ0eUxpc3QpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCisKIAkvKioKIAkgKiBUaGUgdGV4dCBlbGVtZW50OyBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLgogCSAqLwogCXByaXZhdGUgU3RyaW5nIHRleHQgPSBVdGlsLkVNUFRZX1NUUklORzsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdGV4dCBlbGVtZW50IG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCiAJICogVGhlIG5ldyBub2RlIGhhcyBhbiBlbXB0eSB0ZXh0IHN0cmluZy4KIAkgKiA8cD4KLQkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAotCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZQogCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVGV4dEVsZW1lbnQoQVNUIGFzdCkgewogCQlzdXBlcihhc3QpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEyMCwxMSArMTIxLDExIEBACiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewogCQlUZXh0RWxlbWVudCByZXN1bHQgPSBuZXcgVGV4dEVsZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0VGV4dChnZXRUZXh0KCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTQzLDEzICsxNDQsMTMgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhpcyBub2RlJ3MgdGV4dC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhpcyBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKIAkJcmV0dXJuIHRoaXMudGV4dDsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoaXMgbm9kZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCiAJICogPHA+CkBAIC0xNTgsMTEgKzE1OSwxMSBAQAogCSAqIG9yIGZvbGxvd2luZyBlbGVtZW50cy4gVGhlIHRleHQgZWxlbWVudCBtdXN0IG5vdCBpbmNsdWRlCiAJICogYSBibG9jayBjb21tZW50IGNsb3NpbmcgZGVsaW1pdGVyICIqIisiLyIuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHRleHQgdGhlIHRleHQgb2YgdGhpcyBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRleHQgaXMgbnVsbAogCSAqIG9yIGNvbnRhaW5zIGEgYmxvY2sgY29tbWVudCBjbG9zaW5nIGRlbGltaXRlcgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CiAJCWlmICh0ZXh0ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTE3NCw3ICsxNzUsNyBAQAogCQl0aGlzLnRleHQgPSB0ZXh0OwogCQlwb3N0VmFsdWVDaGFuZ2UoVEVYVF9QUk9QRVJUWSk7CiAJfQotCQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTg2LDcgKzE4Nyw3IEBACiAJCX0KIAkJcmV0dXJuIHNpemU7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RoaXNFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RoaXNFeHByZXNzaW9uLmphdmEKaW5kZXggYzdhZWE0NS4uODhjZTVlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaGlzRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhpc0V4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSwyNiArMjUsMjcgQEAKICAqIFNlZSA8Y29kZT5GaWVsZEFjY2VzczwvY29kZT4gZm9yIGd1aWRlbGluZXMgb24gaGFuZGxpbmcgb3RoZXIgZXhwcmVzc2lvbnMKICAqIHRoYXQgcmVzZW1ibGUgcXVhbGlmaWVkIG5hbWVzLgogICogPC9wPgotICogCisgKgogICogQHNlZSBGaWVsZEFjY2VzcwogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUaGlzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCQkJCisKIAkvKioKLQkgKiBUaGUgInF1YWxpZmllciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgInF1YWxpZmllciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBRVUFMSUZJRVJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFFVQUxJRklFUl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihUaGlzRXhwcmVzc2lvbi5jbGFzcywgInF1YWxpZmllciIsIE5hbWUuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUaGlzRXhwcmVzc2lvbi5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTU1LDI2ICs1NiwyNiBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBvcHRpb25hbCBxdWFsaWZpZXI7IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgogCSAqLwogCXByaXZhdGUgTmFtZSBvcHRpb25hbFF1YWxpZmllciA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhICJ0aGlzIiBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhICJ0aGlzIiBleHByZXNzaW9uIG93bmVkIGJ5IHRoZQogCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gcXVhbGlmaWVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVRoaXNFeHByZXNzaW9uKEFTVCBhc3QpIHsKQEAgLTg3LDcgKzg4LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMDMsNyArMTA0LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTExNiw3ICsxMTcsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJVGhpc0V4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFRoaXNFeHByZXNzaW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFF1YWxpZmllcigoTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFF1YWxpZmllcigpKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTM5LDI4ICsxNDAsMjggQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJ0aGlzIiBleHByZXNzaW9uLCBvciAKKwkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyAidGhpcyIgZXhwcmVzc2lvbiwgb3IKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsUXVhbGlmaWVyOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyAidGhpcyIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoTmFtZSBuYW1lKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsUXVhbGlmaWVyOwogCQlwcmVSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5hbWUsIFFVQUxJRklFUl9QUk9QRVJUWSk7CkBAIC0xNzUsMTIgKzE3NiwxMiBAQAogCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy5vcHRpb25hbFF1YWxpZmllciA9PSBudWxsID8gMCA6IGdldFF1YWxpZmllcigpLnRyZWVTaXplKCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhyb3dTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhyb3dTdGF0ZW1lbnQuamF2YQppbmRleCAxYjFkNTVkLi4yZjliNzdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Rocm93U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaHJvd1N0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDI1ICsyMSwyNiBAQAogICogVGhyb3dTdGF0ZW1lbnQ6CiAgKiAgICA8Yj50aHJvdzwvYj4gRXhwcmVzc2lvbiA8Yj47PC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFRocm93U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLQkJCQorCiAJLyoqCi0JICogVGhlICJleHByZXNzaW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBFWFBSRVNTSU9OX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFRocm93U3RhdGVtZW50LmNsYXNzLCAiZXhwcmVzc2lvbiIsIEV4cHJlc3Npb24uY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoVGhyb3dTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC01MCwxOCArNTEsMTggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKIAkgKiBleHByZXNzaW9uLgpAQCAtNjksMTMgKzcwLDEzIEBACiAJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHRocm93IHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgdGhyb3cgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgdGhyb3cgc3RhdGVtZW50IGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAogCSAqIGV4cHJlc3Npb24uCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVGhyb3dTdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtODgsNyArODksNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTEwNCw3ICsxMDUsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE3LDEyICsxMTgsMTIgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVRocm93U3RhdGVtZW50IHJlc3VsdCA9IG5ldyBUaHJvd1N0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDEsMTIgKzE0MiwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHRocm93IHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xNjAsMTAgKzE2MSwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmV4cHJlc3Npb247CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyB0aHJvdyBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbmV3IGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE3MSw3ICsxNzIsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMTgxLDE0ICsxODIsMTQgQEAKIAkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgZXhwcmVzc2lvbiwgRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHJ5U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RyeVN0YXRlbWVudC5qYXZhCmluZGV4IDk3NjNhYmYuLmJiNGIzMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHJ5U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UcnlTdGF0ZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw0NiArMTYsNzQgQEAKIAogLyoqCiAgKiBUcnkgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCi0gKgorICogRm9yIEpMUzIgYW5kIEpMUzM6CiAgKiA8cHJlPgogICogVHJ5U3RhdGVtZW50OgotICogICAgIDxiPnRyeTwvYj4gQmxvY2sgCi0gKiAgICAgICAgIHsgQ2F0Y2hDbGF1c2UgfQorICogICAgIDxiPnRyeTwvYj4gQmxvY2sKKyAqICAgICAgICAgWyB7IENhdGNoQ2xhdXNlIH0gXQogICogICAgICAgICBbIDxiPmZpbmFsbHk8L2I+IEJsb2NrIF0KICAqIDwvcHJlPgorICogRm9yIEpMUzQsIHJlc291cmNlcyB3ZXJlIGFkZGVkOgorICogPHByZT4KKyAqIFRyeVN0YXRlbWVudDoKKyAqICAgICA8Yj50cnk8L2I+IFsgPGI+KDwvYj4gUmVzb3VyY2VzIDxiPik8L2I+IF0KKyAqICAgICAgICAgQmxvY2sKKyAqICAgICAgICAgWyB7IENhdGNoQ2xhdXNlIH0gXQorICogICAgICAgICBbIDxiPmZpbmFsbHk8L2I+IEJsb2NrIF0KKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogTm90IGFsbCBub2RlIGFycmFuZ2VtZW50cyB3aWxsIHJlcHJlc2VudCBsZWdhbCBKYXZhIGNvbnN0cnVjdHMuIEluIHBhcnRpY3VsYXIsCisgKiBhdCBsZWFzdCBvbmUgcmVzb3VyY2UsIGNhdGNoIGNsYXVzZSwgb3IgZmluYWxseSBibG9jayBtdXN0IGJlIHByZXNlbnQuPC9wPgogICogCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFRyeVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7Ci0JCisKIAkvKioKLQkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJyZXNvdXJjZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9ufSkgKGFkZGVkIGluIEpMUzQgQVBJKS4KKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBSRVNPVVJDRVNfUFJPUEVSVFkgPQorCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFRyeVN0YXRlbWVudC5jbGFzcywgInJlc291cmNlcyIsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlICJib2R5IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgQmxvY2t9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFRyeVN0YXRlbWVudC5jbGFzcywgImJvZHkiLCBCbG9jay5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJjYXRjaENsYXVzZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJjYXRjaENsYXVzZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIENhdGNoQ2xhdXNlfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIENBVENIX0NMQVVTRVNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBDQVRDSF9DTEFVU0VTX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihUcnlTdGF0ZW1lbnQuY2xhc3MsICJjYXRjaENsYXVzZXMiLCBDYXRjaENsYXVzZS5jbGFzcywgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZmluYWxseSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImZpbmFsbHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBCbG9ja30pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEZJTkFMTFlfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEZJTkFMTFlfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHJ5U3RhdGVtZW50LmNsYXNzLCAiZmluYWxseSIsIEJsb2NrLmNsYXNzLCBPUFRJT05BTCwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwogCQorCS8qKgorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgorCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCisJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzRfMDsKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFRyeVN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTYzLDUzICs5MSw3OCBAQAogCQlhZGRQcm9wZXJ0eShDQVRDSF9DTEFVU0VTX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlhZGRQcm9wZXJ0eShGSU5BTExZX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SUyA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKKworCQlwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOworCQljcmVhdGVQcm9wZXJ0eUxpc3QoVHJ5U3RhdGVtZW50LmNsYXNzLCBwcm9wZXJ0eUxpc3QpOworCQlhZGRQcm9wZXJ0eShSRVNPVVJDRVNfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CisJCWFkZFByb3BlcnR5KEJPRFlfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CisJCWFkZFByb3BlcnR5KENBVENIX0NMQVVTRVNfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CisJCWFkZFByb3BlcnR5KEZJTkFMTFlfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CisJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzRfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKIAl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewotCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CisJCXN3aXRjaCAoYXBpTGV2ZWwpIHsKKwkJCWNhc2UgQVNULkpMUzJfSU5URVJOQUwgOgorCQkJY2FzZSBBU1QuSkxTMyA6CisJCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTOworCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzRfMDsKKwkJfQogCX0KLQkJCQorCisJLyoqCisJICogVGhlIHJlc291cmNlIGV4cHJlc3Npb25zIChlbGVtZW50IHR5cGU6IHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbn0pLgorCSAqIE51bGwgaW4gSkxTMiBhbmQgSkxTMy4gQWRkZWQgaW4gSkxTNDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdAorCSAqIChzZWUgY29uc3RydWN0b3IpLgorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgcmVzb3VyY2VzID0gbnVsbDsKKwogCS8qKgogCSAqIFRoZSBib2R5OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrLgogCSAqLwogCXByaXZhdGUgQmxvY2sgYm9keSA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgY2F0Y2ggY2xhdXNlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5DYXRjaENsYXVzZTwvY29kZT4pLgorCSAqIFRoZSBjYXRjaCBjbGF1c2VzIChlbGVtZW50IHR5cGU6IHtAbGluayBDYXRjaENsYXVzZX0pLgogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGNhdGNoQ2xhdXNlcyA9CiAJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KENBVENIX0NMQVVTRVNfUFJPUEVSVFkpOwotCQorCiAJLyoqCiAJICogVGhlIGZpbmFsbHkgYmxvY2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCiAJICogRGVmYXVsdHMgdG8gbm9uZS4KIAkgKi8KIAlwcml2YXRlIEJsb2NrIG9wdGlvbmFsRmluYWxseUJvZHkgPSBudWxsOwogCi0JCQkKKwogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdHJ5IHN0YXRlbWVudCBvd25lZCBieSB0aGUgZ2l2ZW4gCi0JICogQVNULiBCeSBkZWZhdWx0LCB0aGUgdHJ5IHN0YXRlbWVudCBoYXMgYW4gZW1wdHkgYmxvY2ssIG5vIGNhdGNoCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB0cnkgc3RhdGVtZW50IG93bmVkIGJ5IHRoZSBnaXZlbgorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHRyeSBzdGF0ZW1lbnQgaGFzIG5vIHJlc291cmNlcywgYW4gZW1wdHkgYmxvY2ssIG5vIGNhdGNoCiAJICogY2xhdXNlcywgYW5kIG5vIGZpbmFsbHkgYmxvY2suCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVHJ5U3RhdGVtZW50KEFTVCBhc3QpIHsKIAkJc3VwZXIoYXN0KTsKKwkJaWYgKGFzdC5hcGlMZXZlbCA+PSBBU1QuSkxTNCkgeworCQkJdGhpcy5yZXNvdXJjZXMgPSBuZXcgQVNUTm9kZS5Ob2RlTGlzdChSRVNPVVJDRVNfUFJPUEVSVFkpOworCQl9CiAJfQogCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCkBAIC0xMTgsNyArMTcxLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDIsMTEgKzE5NSwxNCBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWZpbmFsIExpc3QgaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKKwkJaWYgKHByb3BlcnR5ID09IFJFU09VUkNFU19QUk9QRVJUWSkgeworCQkJcmV0dXJuIHJlc291cmNlcygpOworCQl9CiAJCWlmIChwcm9wZXJ0eSA9PSBDQVRDSF9DTEFVU0VTX1BST1BFUlRZKSB7CiAJCQlyZXR1cm4gY2F0Y2hDbGF1c2VzKCk7CiAJCX0KQEAgLTE2Niw4ICsyMjIsMTIgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVRyeVN0YXRlbWVudCByZXN1bHQgPSBuZXcgVHJ5U3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKKwkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFM0KSB7CisJCQlyZXN1bHQucmVzb3VyY2VzKCkuYWRkQWxsKAorCQkJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHJlc291cmNlcygpKSk7CisJCX0KIAkJcmVzdWx0LnNldEJvZHkoKEJsb2NrKSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5jYXRjaENsYXVzZXMoKS5hZGRBbGwoCiAJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGNhdGNoQ2xhdXNlcygpKSk7CkBAIC0xOTEsMTggKzI1MSwyMSBAQAogCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQlpZiAodmlzaXRDaGlsZHJlbikgewogCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID49IEFTVC5KTFM0KSB7CisJCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdGhpcy5yZXNvdXJjZXMpOworCQkJfQogCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Qm9keSgpKTsKIAkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHRoaXMuY2F0Y2hDbGF1c2VzKTsKIAkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEZpbmFsbHkoKSk7CiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgdHJ5IHN0YXRlbWVudC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHRyeSBib2R5Ci0JICovIAorCSAqLwogCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgewogCQlpZiAodGhpcy5ib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yMTYsMTAgKzI3OSwxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmJvZHk7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIHRyeSBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYm9keSB0aGUgYmxvY2sgbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTIyNyw3ICsyOTAsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0Qm9keShCbG9jayBib2R5KSB7CiAJCWlmIChib2R5ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI0MCwyOSArMzAzLDI5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBjYXRjaCBjbGF1c2VzIGZvciB0aGlzIHRyeSBzdGF0ZW1lbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgY2F0Y2ggY2xhdXNlcwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkNhdGNoQ2xhdXNlPC9jb2RlPikKLQkgKi8gCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIENhdGNoQ2xhdXNlfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCBjYXRjaENsYXVzZXMoKSB7CiAJCXJldHVybiB0aGlzLmNhdGNoQ2xhdXNlczsKIAl9Ci0JCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZmluYWxseSBibG9jayBvZiB0aGlzIHRyeSBzdGF0ZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqIFJldHVybnMgdGhlIGZpbmFsbHkgYmxvY2sgb2YgdGhpcyB0cnkgc3RhdGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqIHRoaXMgdHJ5IHN0YXRlbWVudCBoYXMgPGI+bm88L2I+IGZpbmFsbHkgYmxvY2suCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBmaW5hbGx5IGJsb2NrLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyeSBzdGF0ZW1lbnQKIAkgKiAgICBoYXMgbm9uZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgQmxvY2sgZ2V0RmluYWxseSgpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxGaW5hbGx5Qm9keTsKIAl9CiAKIAkvKioKIAkgKiBTZXRzIG9yIGNsZWFycyB0aGUgZmluYWxseSBibG9jayBvZiB0aGlzIHRyeSBzdGF0ZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGJsb2NrIHRoZSBmaW5hbGx5IGJsb2NrIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqCisJICogQHBhcmFtIGJsb2NrIHRoZSBmaW5hbGx5IGJsb2NrIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTI3MCwyNyArMzMzLDQ1IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRGaW5hbGx5KEJsb2NrIGJsb2NrKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsRmluYWxseUJvZHk7CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgYmxvY2ssIEZJTkFMTFlfUFJPUEVSVFkpOwogCQl0aGlzLm9wdGlvbmFsRmluYWxseUJvZHkgPSBibG9jazsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgYmxvY2ssIEZJTkFMTFlfUFJPUEVSVFkpOwogCX0KLQkKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHJlc291cmNlcyBmb3IgdGhpcyB0cnkgc3RhdGVtZW50LgorCSAqCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHJlc291cmNlcworCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbn0pCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkCisJICogICAgICAgICAgICBpbiBhIEpMUzIgb3IgSkxTMyBBU1QKKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgTGlzdCByZXNvdXJjZXMoKSB7CisJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4ganVzdCBjYWxsaW5nIHVuc3VwcG9ydGVkSW4yXzMoKSB0byBjaGVjaworCQlpZiAodGhpcy5yZXNvdXJjZXMgIT0gbnVsbCkgeworCQkJdW5zdXBwb3J0ZWRJbjJfMygpOworCQl9CisJCXJldHVybiB0aGlzLnJlc291cmNlczsKKwl9CisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgNCAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewogCQlyZXR1cm4KIAkJCW1lbVNpemUoKQorCQkJKyAodGhpcy5yZXNvdXJjZXMgPT0gbnVsbCA/IDAgOiB0aGlzLnJlc291cmNlcy5saXN0U2l6ZSgpKQogCQkJKyAodGhpcy5ib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpCiAJCQkrIHRoaXMuY2F0Y2hDbGF1c2VzLmxpc3RTaXplKCkKIAkJCSsgKHRoaXMub3B0aW9uYWxGaW5hbGx5Qm9keSA9PSBudWxsID8gMCA6IGdldEZpbmFsbHkoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlLmphdmEKaW5kZXggYzRjMzY3Ni4uY2VkNTRlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMiw3ICsxMiw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGFsbCB0eXBlIEFTVCBub2RlIHR5cGVzLiBBIHR5cGUgbm9kZSByZXByZXNlbnRzIGEgCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGFsbCB0eXBlIEFTVCBub2RlIHR5cGVzLiBBIHR5cGUgbm9kZSByZXByZXNlbnRzIGEKICAqIHJlZmVyZW5jZSB0byBhIHByaW1pdGl2ZSB0eXBlIChpbmNsdWRpbmcgdm9pZCksIHRvIGFuIGFycmF5IHR5cGUsIG9yIHRvIGEKICAqIHNpbXBsZSBuYW1lZCB0eXBlIChvciB0eXBlIHZhcmlhYmxlKSwgdG8gYSBxdWFsaWZpZWQgdHlwZSwgdG8gYQogICogcGFyYW1ldGVyaXplZCB0eXBlLCBvciB0byBhIHdpbGRjYXJkIHR5cGUuIE5vdGUgdGhhdCBub3QgYWxsIG9mIHRoZXNlCkBAIC00NiwzMSArNDYsMzEgQEAKICAqIFF1YWxpZmllZFR5cGU6CiAgKiAgICBUeXBlIDxiPi48L2I+IFNpbXBsZU5hbWUKICAqIFdpbGRjYXJkVHlwZToKLSAqICAgIDxiPj88L2I+IFsgKCA8Yj5leHRlbmRzPC9iPiB8IDxiPnN1cGVyPC9iPikgVHlwZSBdIAorICogICAgPGI+PzwvYj4gWyAoIDxiPmV4dGVuZHM8L2I+IHwgPGI+c3VwZXI8L2I+KSBUeXBlIF0KICAqIDwvcHJlPgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZSBleHRlbmRzIEFTVE5vZGUgewotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB0eXBlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVHlwZShBU1QgYXN0KSB7CiAJCXN1cGVyKGFzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHByaW1pdGl2ZSB0eXBlCi0JICogKDxjb2RlPlByaW1pdGl2ZVR5cGU8L2NvZGU+KS4gCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcHJpbWl0aXZlIHR5cGUsIGFuZCAKKwkgKiAoe0BsaW5rIFByaW1pdGl2ZVR5cGV9KS4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHByaW1pdGl2ZSB0eXBlLCBhbmQKIAkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKCkgewpAQCAtNzgsMTAgKzc4LDEwIEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHNpbXBsZSB0eXBlIAotCSAqICg8Y29kZT5TaW1wbGVUeXBlPC9jb2RlPikuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgc2ltcGxlIHR5cGUsIGFuZCAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgc2ltcGxlIHR5cGUKKwkgKiAoe0BsaW5rIFNpbXBsZVR5cGV9KS4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbXBsZSB0eXBlLCBhbmQKIAkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTaW1wbGVUeXBlKCkgewpAQCAtOTAsOSArOTAsOSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbiBhcnJheSB0eXBlCi0JICogKDxjb2RlPkFycmF5VHlwZTwvY29kZT4pLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlLCBhbmQgCisJICogKHtAbGluayBBcnJheVR5cGV9KS4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlLCBhbmQKIAkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBcnJheVR5cGUoKSB7CkBAIC0xMDEsOSArMTAxLDkgQEAKIAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUKLQkgKiAoPGNvZGU+UGFyYW1ldGVyaXplZFR5cGU8L2NvZGU+KS4gCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBhbmQgCisJICogKHtAbGluayBQYXJhbWV0ZXJpemVkVHlwZX0pLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBhbmQKIAkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgcXVhbGlmaWVkIHR5cGUKLQkgKiAoPGNvZGU+UXVhbGlmaWVkVHlwZTwvY29kZT4pLiAKKwkgKiAoe0BsaW5rIFF1YWxpZmllZFR5cGV9KS4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgYSB0eXBlIGxpa2UgIkEuQiIgY2FuIGJlIHJlcHJlc2VudGVkIGVpdGhlciBvZiB0d28gd2F5czoKIAkgKiA8b2w+CkBAIC0xMjQsMTQgKzEyNCwxNCBAQAogCSAqIDxjb2RlPlNpbXBsZVR5cGUoUXVhbGlmaWVkTmFtZShTaW1wbGVOYW1lKCJBIiksU2ltcGxlTmFtZSgiQiIpKSk8L2NvZGU+CiAJICogPC9saT4KIAkgKiA8L29sPgotCSAqIFRoZSBmaXJzdCBmb3JtIGlzIHByZWZlcnJlZCB3aGVuICJBIiBpcyBrbm93biB0byBiZSBhIHR5cGUuIEhvd2V2ZXIsIGEgCisJICogVGhlIGZpcnN0IGZvcm0gaXMgcHJlZmVycmVkIHdoZW4gIkEiIGlzIGtub3duIHRvIGJlIGEgdHlwZS4gSG93ZXZlciwgYQogCSAqIHBhcnNlciBjYW5ub3QgYWx3YXlzIGRldGVybWluZSB0aGlzLiBDbGllbnRzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBoYW5kbGUKIAkgKiBlaXRoZXIgcmF0aGVyIHRoYW4gbWFrZSBhc3N1bXB0aW9ucy4gKE5vdGUgYWxzbyB0aGF0IHRoZSBmaXJzdCBmb3JtCi0JICogYmVjYW1lIHBvc3NpYmxlIGFzIG9mIEpMUzM7IG9ubHkgdGhlIHNlY29uZCBmb3JtIGV4aXN0ZWQgaW4gdGhlIAorCSAqIGJlY2FtZSBwb3NzaWJsZSBhcyBvZiBKTFMzOyBvbmx5IHRoZSBzZWNvbmQgZm9ybSBleGlzdGVkIGluIHRoZQogCSAqIEpMUzIgQVBJLikKIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcXVhbGlmaWVkIHR5cGUsIGFuZCAKKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHF1YWxpZmllZCB0eXBlLCBhbmQKIAkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTQwLDE0ICsxNDAsMjYgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgdW5pb24gdHlwZQorCSAqICh7QGxpbmsgVW5pb25UeXBlfSkuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSB1bmlvbiB0eXBlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNVbmlvblR5cGUoKSB7CisJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIFVuaW9uVHlwZSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHdpbGRjYXJkIHR5cGUKLQkgKiAoPGNvZGU+V2lsZGNhcmRUeXBlPC9jb2RlPikuCisJICogKHtAbGluayBXaWxkY2FyZFR5cGV9KS4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgYSB3aWxkY2FyZCB0eXBlIGlzIG9ubHkgbWVhbmluZ2Z1bCBhcyBhIAotCSAqIHR5cGUgYXJndW1lbnQgb2YgYSA8Y29kZT5QYXJhbWV0ZXJpemVkVHlwZTwvY29kZT4gbm9kZS4KKwkgKiBOb3RlIHRoYXQgYSB3aWxkY2FyZCB0eXBlIGlzIG9ubHkgbWVhbmluZ2Z1bCBhcyBhCisJICogdHlwZSBhcmd1bWVudCBvZiBhIHtAbGluayBQYXJhbWV0ZXJpemVkVHlwZX0gbm9kZS4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgd2lsZGNhcmQgdHlwZSwgYW5kIAorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgd2lsZGNhcmQgdHlwZSwgYW5kCiAJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTE2MSwxMCArMTczLDEwIEBACiAJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQogCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdHlwZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZQogCSAqICAgIHJlc29sdmVkCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBJVHlwZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiB0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlVHlwZSh0aGlzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVCaW5kaW5nLmphdmEKaW5kZXggOWRkZDNkMy4uZDcyMzUzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUJpbmRpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwyNyArMTEsMTIgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldpbGRjYXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JRGVwZW5kZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKQEAgLTQ0LDE5ICsyOSwyMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmF3VHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5XaWxkY2FyZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50OwogCiAvKioKICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHR5cGUgYmluZGluZ3MuCiAgKi8KIGNsYXNzIFR5cGVCaW5kaW5nIGltcGxlbWVudHMgSVR5cGVCaW5kaW5nIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdMaXRlcmFsIEVYUFJFU1NJT04gPSBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsKDAsMCk7CisKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElNZXRob2RCaW5kaW5nW10gTk9fTUVUSE9EX0JJTkRJTkdTID0gbmV3IElNZXRob2RCaW5kaW5nWzBdOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJApAQCAtODUsNyArNzIsNyBAQAogCiAJcHVibGljIElUeXBlQmluZGluZyBjcmVhdGVBcnJheVR5cGUoaW50IGRpbWVuc2lvbikgewogCQlpbnQgcmVhbERpbWVuc2lvbnMgPSBkaW1lbnNpb247Ci0JCXJlYWxEaW1lbnNpb25zICs9IHRoaXMuZ2V0RGltZW5zaW9ucygpOworCQlyZWFsRGltZW5zaW9ucyArPSBnZXREaW1lbnNpb25zKCk7CiAJCWlmIChyZWFsRGltZW5zaW9ucyA8IDEgfHwgcmVhbERpbWVuc2lvbnMgPiAyNTUpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQpAQCAtOTYsMjMgKzgzLDMxIEBACiAJCWlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLmFubm90YXRpb25zOwogCQl9Ci0JCWlmICh0aGlzLmJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpIHx8IHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzRW51bSgpIHx8IHRoaXMuYmluZGluZy5pc0ludGVyZmFjZSgpKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcgcmVmVHlwZSA9Ci0JCQkJKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcgcmVmVHlwZSA9IG51bGw7CisJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHsKKwkJCXJlZlR5cGUgPSAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nKS5nZW5lcmljVHlwZSgpOworCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkgfHwgdGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNFbnVtKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCXJlZlR5cGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCX0KKwkJaWYgKHJlZlR5cGUgIT0gbnVsbCkgewogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZ1tdIGludGVybmFsQW5ub3RhdGlvbnMgPSByZWZUeXBlLmdldEFubm90YXRpb25zKCk7CiAJCQlpbnQgbGVuZ3RoID0gaW50ZXJuYWxBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGludGVybmFsQW5ub3RhdGlvbnMubGVuZ3RoOwogCQkJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCQkJSUFubm90YXRpb25CaW5kaW5nW10gdGVtcEFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uQmluZGluZ1tsZW5ndGhdOwotCQkJCWludCBhbm5vdGF0aW9uc0NvdW50ZXIgPSAwOworCQkJCWludCBjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQgPSAwOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJZmluYWwgSUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb25JbnN0YW5jZSA9IHRoaXMucmVzb2x2ZXIuZ2V0QW5ub3RhdGlvbkluc3RhbmNlKGludGVybmFsQW5ub3RhdGlvbnNbaV0pOworCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nIGludGVybmFsQW5ub3RhdGlvbiA9IGludGVybmFsQW5ub3RhdGlvbnNbaV07CisJCQkJCUlBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uSW5zdGFuY2UgPSB0aGlzLnJlc29sdmVyLmdldEFubm90YXRpb25JbnN0YW5jZShpbnRlcm5hbEFubm90YXRpb24pOwogCQkJCQlpZiAoYW5ub3RhdGlvbkluc3RhbmNlID09IG51bGwpIHsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9Ci0JCQkJCXRlbXBBbm5vdGF0aW9uc1thbm5vdGF0aW9uc0NvdW50ZXIrK10gPSBhbm5vdGF0aW9uSW5zdGFuY2U7CisJCQkJCXRlbXBBbm5vdGF0aW9uc1tjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQrK10gPSBhbm5vdGF0aW9uSW5zdGFuY2U7CiAJCQkJfQotCQkJCWlmIChsZW5ndGggIT0gYW5ub3RhdGlvbnNDb3VudGVyKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcEFubm90YXRpb25zLCAwLCAodGVtcEFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uQmluZGluZ1thbm5vdGF0aW9uc0NvdW50ZXJdKSwgMCwgYW5ub3RhdGlvbnNDb3VudGVyKTsKKwkJCQlpZiAoY29udmVydGVkQW5ub3RhdGlvbkNvdW50ICE9IGxlbmd0aCkgeworCQkJCQlpZiAoY29udmVydGVkQW5ub3RhdGlvbkNvdW50ID09IDApIHsKKwkJCQkJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gQW5ub3RhdGlvbkJpbmRpbmcuTm9Bbm5vdGF0aW9uczsKKwkJCQkJfQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBBbm5vdGF0aW9ucywgMCwgKHRlbXBBbm5vdGF0aW9ucyA9IG5ldyBJQW5ub3RhdGlvbkJpbmRpbmdbY29udmVydGVkQW5ub3RhdGlvbkNvdW50XSksIDAsIGNvbnZlcnRlZEFubm90YXRpb25Db3VudCk7CiAJCQkJfQogCQkJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gdGVtcEFubm90YXRpb25zOwogCQkJfQpAQCAtMTY0LDY0ICsxNTksNTYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmcjZ2V0Qm91bmQoKQogCSAqLwogCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0Qm91bmQoKSB7Ci0JCWlmICh0aGlzLmJpbmRpbmcuaXNXaWxkY2FyZCgpKSB7Ci0JCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQkJaWYgKHdpbGRjYXJkQmluZGluZy5ib3VuZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMucmVzb2x2ZXIuZ2V0VHlwZUJpbmRpbmcod2lsZGNhcmRCaW5kaW5nLmJvdW5kKTsKLQkJCX0KKwkJc3dpdGNoICh0aGlzLmJpbmRpbmcua2luZCgpKSB7CisJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEUgOgorCQkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZEJpbmRpbmcgPSAoV2lsZGNhcmRCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQkJaWYgKHdpbGRjYXJkQmluZGluZy5ib3VuZCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKHdpbGRjYXJkQmluZGluZy5ib3VuZCk7CisJCQkJfQorCQkJCWJyZWFrOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgY2xhc3MgZmlsZSBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklEZXBlbmRlbnQjZ2V0RmlsZU5hbWUoKQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmcjZ2V0R2VuZXJpY1R5cGVPZldpbGRjYXJkVHlwZSgpCiAJICovCi0JcHJpdmF0ZSBJQ2xhc3NGaWxlIGdldENsYXNzRmlsZShjaGFyW10gZmlsZU5hbWUpIHsKLQkJaW50IGphclNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihJRGVwZW5kZW50LkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiwgZmlsZU5hbWUpOwotCQlpbnQgcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIGZpbGVOYW1lKTsgLy8gcGtnRW5kIGlzIGV4Y2x1c2l2ZQotCQlpZiAocGtnRW5kID09IC0xKQotCQkJcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGZpbGVOYW1lKTsKLQkJaWYgKGphclNlcGFyYXRvciAhPSAtMSAmJiBwa2dFbmQgPCBqYXJTZXBhcmF0b3IpIC8vIGlmIGluIGEgamFyIGFuZCBubyBzbGFzaCwgaXQgaXMgYSBkZWZhdWx0IHBhY2thZ2UgLT4gcGtnRW5kIHNob3VsZCBiZSBlcXVhbCB0byBqYXJTZXBhcmF0b3IKLQkJCXBrZ0VuZCA9IGphclNlcGFyYXRvcjsKLQkJaWYgKHBrZ0VuZCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudChmaWxlTmFtZSwgcGtnRW5kLCBqYXJTZXBhcmF0b3IpOwotCQlpZiAocGtnID09IG51bGwpIHJldHVybiBudWxsOwotCQlpbnQgc3RhcnQ7Ci0JCXJldHVybiBwa2cuZ2V0Q2xhc3NGaWxlKG5ldyBTdHJpbmcoZmlsZU5hbWUsIHN0YXJ0ID0gcGtnRW5kICsgMSwgZmlsZU5hbWUubGVuZ3RoIC0gc3RhcnQpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHRoZSBnaXZlbiBmaWxlIG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JRGVwZW5kZW50I2dldEZpbGVOYW1lKCkKLQkgKi8KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KGNoYXJbXSBmaWxlTmFtZSkgewotCQljaGFyW10gc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShmaWxlTmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQlpbnQgcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHNsYXNoU2VwYXJhdGVkRmlsZU5hbWUpOyAvLyBwa2dFbmQgaXMgZXhjbHVzaXZlCi0JCWlmIChwa2dFbmQgPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZSwgcGtnRW5kLCAtMS8qbm8gamFyIHNlcGFyYXRvciBmb3IgLmphdmEgZmlsZXMqLyk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWludCBzdGFydDsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBrZy5nZXRDb21waWxhdGlvblVuaXQobmV3IFN0cmluZyhzbGFzaFNlcGFyYXRlZEZpbGVOYW1lLCBzdGFydCA9ICBwa2dFbmQrMSwgc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZS5sZW5ndGggLSBzdGFydCkpOwotCQlpZiAodGhpcy5yZXNvbHZlciBpbnN0YW5jZW9mIERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBjdS5maW5kV29ya2luZ0NvcHkoKChEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSB0aGlzLnJlc29sdmVyKS53b3JraW5nQ29weU93bmVyKTsKLQkJCWlmICh3b3JraW5nQ29weSAhPSBudWxsKQotCQkJCXJldHVybiB3b3JraW5nQ29weTsKKwlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEdlbmVyaWNUeXBlT2ZXaWxkY2FyZFR5cGUoKSB7CisJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZEJpbmRpbmcgPSAoV2lsZGNhcmRCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQkJaWYgKHdpbGRjYXJkQmluZGluZy5nZW5lcmljVHlwZSAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKHdpbGRjYXJkQmluZGluZy5nZW5lcmljVHlwZSk7CisJCQkJfQorCQkJCWJyZWFrOwogCQl9Ci0JCXJldHVybiBjdTsKKwkJcmV0dXJuIG51bGw7CiAJfQotCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNnZXRSYW5rKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFJhbmsoKSB7CisJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFIDoKKwkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJCXJldHVybiB3aWxkY2FyZEJpbmRpbmcucmFuazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQogCS8qCiAJICogQHNlZSBJVHlwZUJpbmRpbmcjZ2V0Q29tcG9uZW50VHlwZSgpCiAJICovCiAJcHVibGljIElUeXBlQmluZGluZyBnZXRDb21wb25lbnRUeXBlKCkgewotCQlpZiAoIXRoaXMuaXNBcnJheSgpKSB7CisJCWlmICghaXNBcnJheSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYmluZGluZzsKLQkJcmV0dXJuIHJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUoKSk7CisJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCXJldHVybiB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUoKSk7CiAJfQogCiAJLyoKQEAgLTIzNywxMyArMjI0LDIxIEBACiAJCQkJRmllbGRCaW5kaW5nW10gZmllbGRCaW5kaW5ncyA9IHJlZmVyZW5jZUJpbmRpbmcuYXZhaWxhYmxlRmllbGRzKCk7IC8vIHJlc2lsaWVuY2UKIAkJCQlpbnQgbGVuZ3RoID0gZmllbGRCaW5kaW5ncy5sZW5ndGg7CiAJCQkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQkJCWludCBjb252ZXJ0ZWRGaWVsZENvdW50ID0gMDsKIAkJCQkJSVZhcmlhYmxlQmluZGluZ1tdIG5ld0ZpZWxkcyA9IG5ldyBJVmFyaWFibGVCaW5kaW5nW2xlbmd0aF07CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5yZXNvbHZlci5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGRCaW5kaW5nc1tpXSk7Ci0JCQkJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBmaWVsZEJpbmRpbmdzW2ldOworCQkJCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLnJlc29sdmVyLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZEJpbmRpbmcpOworCQkJCQkJaWYgKHZhcmlhYmxlQmluZGluZyAhPSBudWxsKSB7CisJCQkJCQkJbmV3RmllbGRzW2NvbnZlcnRlZEZpZWxkQ291bnQrK10gPSB2YXJpYWJsZUJpbmRpbmc7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoY29udmVydGVkRmllbGRDb3VudCAhPSBsZW5ndGgpIHsKKwkJCQkJCWlmIChjb252ZXJ0ZWRGaWVsZENvdW50ID09IDApIHsKIAkJCQkJCQlyZXR1cm4gdGhpcy5maWVsZHMgPSBOT19WQVJJQUJMRV9CSU5ESU5HUzsKIAkJCQkJCX0KLQkJCQkJCW5ld0ZpZWxkc1tpXSA9IHZhcmlhYmxlQmluZGluZzsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3RmllbGRzLCAwLCAobmV3RmllbGRzID0gbmV3IElWYXJpYWJsZUJpbmRpbmdbY29udmVydGVkRmllbGRDb3VudF0pLCAwLCBjb252ZXJ0ZWRGaWVsZENvdW50KTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gdGhpcy5maWVsZHMgPSBuZXdGaWVsZHM7CiAJCQkJfQpAQCAtMjcyLDE5ICsyNjcsMjMgQEAKIAkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmdbXSBpbnRlcm5hbE1ldGhvZHMgPSByZWZlcmVuY2VCaW5kaW5nLmF2YWlsYWJsZU1ldGhvZHMoKTsgLy8gYmUgcmVzaWxpZW50CiAJCQkJaW50IGxlbmd0aCA9IGludGVybmFsTWV0aG9kcy5sZW5ndGg7CiAJCQkJaWYgKGxlbmd0aCAhPSAwKSB7Ci0JCQkJCWludCByZW1vdmVTeW50aGV0aWNzQ291bnRlciA9IDA7CisJCQkJCWludCBjb252ZXJ0ZWRNZXRob2RDb3VudCA9IDA7CiAJCQkJCUlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG5ldyBJTWV0aG9kQmluZGluZ1tsZW5ndGhdOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGludGVybmFsTWV0aG9kc1tpXTsKLQkJCQkJCWlmICghc2hvdWxkQmVSZW1vdmVkKG1ldGhvZEJpbmRpbmcpKSB7Ci0JCQkJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzIgPSB0aGlzLnJlc29sdmVyLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZyk7Ci0JCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcyICE9IG51bGwpIHsKLQkJCQkJCQkJbmV3TWV0aG9kc1tyZW1vdmVTeW50aGV0aWNzQ291bnRlcisrXSA9IG1ldGhvZEJpbmRpbmcyOwotCQkJCQkJCX0KKwkJCQkJCWlmIChtZXRob2RCaW5kaW5nLmlzRGVmYXVsdEFic3RyYWN0KCkgfHwgbWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpIHx8IChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSAmJiBpc0ludGVyZmFjZSgpKSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzIgPSB0aGlzLnJlc29sdmVyLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZyk7CisJCQkJCQlpZiAobWV0aG9kQmluZGluZzIgIT0gbnVsbCkgeworCQkJCQkJCW5ld01ldGhvZHNbY29udmVydGVkTWV0aG9kQ291bnQrK10gPSBtZXRob2RCaW5kaW5nMjsKIAkJCQkJCX0KIAkJCQkJfQotCQkJCQlpZiAocmVtb3ZlU3ludGhldGljc0NvdW50ZXIgIT0gbGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld01ldGhvZHMsIDAsIChuZXdNZXRob2RzID0gbmV3IElNZXRob2RCaW5kaW5nW3JlbW92ZVN5bnRoZXRpY3NDb3VudGVyXSksIDAsIHJlbW92ZVN5bnRoZXRpY3NDb3VudGVyKTsKKwkJCQkJaWYgKGNvbnZlcnRlZE1ldGhvZENvdW50ICE9IGxlbmd0aCkgeworCQkJCQkJaWYgKGNvbnZlcnRlZE1ldGhvZENvdW50ID09IDApIHsKKwkJCQkJCQlyZXR1cm4gdGhpcy5tZXRob2RzID0gTk9fTUVUSE9EX0JJTkRJTkdTOworCQkJCQkJfQorCQkJCQkJU3lzdGVtLmFycmF5Y29weShuZXdNZXRob2RzLCAwLCAobmV3TWV0aG9kcyA9IG5ldyBJTWV0aG9kQmluZGluZ1tjb252ZXJ0ZWRNZXRob2RDb3VudF0pLCAwLCBjb252ZXJ0ZWRNZXRob2RDb3VudCk7CiAJCQkJCX0KIAkJCQkJcmV0dXJuIHRoaXMubWV0aG9kcyA9IG5ld01ldGhvZHM7CiAJCQkJfQpAQCAtNDIxLDEwICs0MjAsMTAgQEAKIAkgKiBAc2VlIElUeXBlQmluZGluZyNnZXREaW1lbnNpb25zKCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldERpbWVuc2lvbnMoKSB7Ci0JCWlmICghdGhpcy5pc0FycmF5KCkpIHsKKwkJaWYgKCFpc0FycmF5KCkpIHsKIAkJCXJldHVybiAwOwogCQl9Ci0JCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSBiaW5kaW5nOworCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgdGhpcy5iaW5kaW5nOwogCQlyZXR1cm4gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnM7CiAJfQogCkBAIC00MzIsMTEgKzQzMSwxMSBAQAogCSAqIEBzZWUgSVR5cGVCaW5kaW5nI2dldEVsZW1lbnRUeXBlKCkKIAkgKi8KIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEVsZW1lbnRUeXBlKCkgewotCQlpZiAoIXRoaXMuaXNBcnJheSgpKSB7CisJCWlmICghaXNBcnJheSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYmluZGluZzsKLQkJcmV0dXJuIHJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSk7CisJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCXJldHVybiB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSk7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQpAQCAtNDk5LDEwOCArNDk4LDM4IEBACiAKIAlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewogCQlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCisJCWlmIChlbGVtZW50ICE9IG51bGwpCisJCQlyZXR1cm4gZWxlbWVudC5yZXNvbHZlZCh0aGlzLmJpbmRpbmcpOworCQlpZiAoaXNSZWNvdmVyZWQoKSkgeworCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZSgpOworCQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKKwkJCQlmaW5hbCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBwYWNrYWdlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOworCQkJCWlmIChqYXZhRWxlbWVudCAhPSBudWxsICYmIGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKKwkJCQkJLy8gYmVzdCBlZmZvcnQ6IHdlIGRvbid0IGtub3cgaWYgdGhlIHJlY292ZXJlZCBiaW5kaW5nIGlzIGEgYmluYXJ5IG9yIHNvdXJjZSBiaW5kaW5nLCBzbyBnbyB3aXRoIGEgc2ltcGxlIHNvdXJjZSB0eXBlCisJCQkJCXJldHVybiAoKFBhY2thZ2VGcmFnbWVudCkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdChuZXcgU3RyaW5nKHRoaXMuYmluZGluZy5zb3VyY2VOYW1lKCkpICsgU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfamF2YSkuZ2V0VHlwZSh0aGlzLmdldE5hbWUoKSk7CisJCQkJfQorCQkJfQogCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlbGVtZW50LnJlc29sdmVkKHRoaXMuYmluZGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJcHJpdmF0ZSBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoKSB7CiAJCXJldHVybiBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQodGhpcy5iaW5kaW5nKTsKIAl9CiAJcHJpdmF0ZSBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyB0eXBlQmluZGluZyApIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpCisJCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQkJc3dpdGNoICh0eXBlQmluZGluZy5raW5kKCkpIHsKLQkJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKLQkJCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKSB0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KHR5cGVCaW5kaW5nKTsKLQkJCWNhc2UgQmluZGluZy5CQVNFX1RZUEUgOgotCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgotCQkJCXJldHVybiBudWxsOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKHR5cGVCaW5kaW5nLmlzQ2FwdHVyZSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmc7Ci0JCWlmICh0eXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgdHlwZUJpbmRpbmcuaXNSYXdUeXBlKCkpCi0JCQlyZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nLmVyYXN1cmUoKTsKLQkJZWxzZQotCQkJcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKLQkJY2hhcltdIGZpbGVOYW1lID0gcmVmZXJlbmNlQmluZGluZy5nZXRGaWxlTmFtZSgpOwotCQlpZiAocmVmZXJlbmNlQmluZGluZy5pc0xvY2FsVHlwZSgpIHx8IHJlZmVyZW5jZUJpbmRpbmcuaXNBbm9ueW1vdXNUeXBlKCkpIHsKLQkJCS8vIGxvY2FsIG9yIGFub255bW91cyB0eXBlCi0JCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUoZmlsZU5hbWUpKSB7Ci0JCQkJaW50IGphclNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihJRGVwZW5kZW50LkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiwgZmlsZU5hbWUpOwotCQkJCWludCBwa2dFbmQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcvJywgZmlsZU5hbWUpOyAvLyBwa2dFbmQgaXMgZXhjbHVzaXZlCi0JCQkJaWYgKHBrZ0VuZCA9PSAtMSkKLQkJCQkJcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGZpbGVOYW1lKTsKLQkJCQlpZiAoamFyU2VwYXJhdG9yICE9IC0xICYmIHBrZ0VuZCA8IGphclNlcGFyYXRvcikgLy8gaWYgaW4gYSBqYXIgYW5kIG5vIHNsYXNoLCBpdCBpcyBhIGRlZmF1bHQgcGFja2FnZSAtPiBwa2dFbmQgc2hvdWxkIGJlIGVxdWFsIHRvIGphclNlcGFyYXRvcgotCQkJCQlwa2dFbmQgPSBqYXJTZXBhcmF0b3I7Ci0JCQkJaWYgKHBrZ0VuZCA9PSAtMSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoZmlsZU5hbWUsIHBrZ0VuZCwgamFyU2VwYXJhdG9yKTsKLQkJCQljaGFyW10gY29uc3RhbnRQb29sTmFtZSA9IHJlZmVyZW5jZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpOwotCQkJCWlmIChjb25zdGFudFBvb2xOYW1lID09IG51bGwpIHsKLQkJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIGdldENsYXNzRmlsZShmaWxlTmFtZSk7Ci0JCQkJCXJldHVybiBjbGFzc0ZpbGUgPT0gbnVsbCA/IG51bGwgOiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7Ci0JCQkJfQotCQkJCXBrZ0VuZCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy8nLCBjb25zdGFudFBvb2xOYW1lKTsKLQkJCQljaGFyW10gY2xhc3NGaWxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29uc3RhbnRQb29sTmFtZSwgcGtnRW5kKzEsIGNvbnN0YW50UG9vbE5hbWUubGVuZ3RoKTsKLQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgcGtnLmdldENsYXNzRmlsZShuZXcgU3RyaW5nKGNsYXNzRmlsZU5hbWUpICsgU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfY2xhc3MpOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7Ci0JCQl9Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGZpbGVOYW1lKTsKLQkJCWlmIChjdSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCS8vIG11c3QgdXNlIGdldEVsZW1lbnRBdCguLi4pIGFzIHRoZXJlIGlzIG5vIGJhY2sgcG9pbnRlciB0byB0aGUgZGVmaW5pbmcgbWV0aG9kIChzY29wZSBpcyBudWxsIGFmdGVyIHJlc29sdXRpb24gaGFzIGVuZGVkKQotCQkJdHJ5IHsKLQkJCQlpbnQgc291cmNlU3RhcnQgPSAoKExvY2FsVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpLnNvdXJjZVN0YXJ0OwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGN1LmdldEVsZW1lbnRBdChzb3VyY2VTdGFydCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvZXMgbm90IGV4aXN0Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVmZXJlbmNlQmluZGluZy5pc1R5cGVWYXJpYWJsZSgpKSB7Ci0JCQkvLyB0eXBlIHBhcmFtZXRlcgotCQkJZmluYWwgU3RyaW5nIHR5cGVWYXJpYWJsZU5hbWUgPSBuZXcgU3RyaW5nKHJlZmVyZW5jZUJpbmRpbmcuc291cmNlTmFtZSgpKTsKLQkJCUJpbmRpbmcgZGVjbGFyaW5nRWxlbWVudCA9ICgoVHlwZVZhcmlhYmxlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykuZGVjbGFyaW5nRWxlbWVudDsKLQkJCUlCaW5kaW5nIGRlY2xhcmluZ1R5cGVCaW5kaW5nID0gbnVsbDsKLQkJCWlmIChkZWNsYXJpbmdFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykgewotCQkJCWRlY2xhcmluZ1R5cGVCaW5kaW5nID0gdGhpcy5yZXNvbHZlci5nZXRNZXRob2RCaW5kaW5nKChNZXRob2RCaW5kaW5nKSBkZWNsYXJpbmdFbGVtZW50KTsKLQkJCQlJTWV0aG9kIGRlY2xhcmluZ01ldGhvZCA9IChJTWV0aG9kKSBkZWNsYXJpbmdUeXBlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGRlY2xhcmluZ01ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHR5cGVWYXJpYWJsZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgZGVjbGFyaW5nRWxlbWVudCk7Ci0JCQkJaWYgKHR5cGVCaW5kaW5nMiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCQlkZWNsYXJpbmdUeXBlQmluZGluZyA9IHR5cGVCaW5kaW5nMjsKLQkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gKElUeXBlKSBkZWNsYXJpbmdUeXBlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGRlY2xhcmluZ1R5cGUuZ2V0VHlwZVBhcmFtZXRlcih0eXBlVmFyaWFibGVOYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gY2FzZSBvZiBhIFdpbENhcmRCaW5kaW5nIHRoYXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBKYXZhIGVsZW1lbnQKLQkJCS8vIG1lbWJlciBvciB0b3AgbGV2ZWwgdHlwZQotCQkJSVR5cGVCaW5kaW5nIGRlY2xhcmluZ1R5cGVCaW5kaW5nID0gbnVsbDsKLQkJCWlmICh0aGlzLmlzQXJyYXkoKSkgewotCQkJCWRlY2xhcmluZ1R5cGVCaW5kaW5nID0gdGhpcy5nZXRFbGVtZW50VHlwZSgpLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlY2xhcmluZ1R5cGVCaW5kaW5nID0gdGhpcy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQkJfQotCQkJaWYgKGRlY2xhcmluZ1R5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCQkvLyB0b3AgbGV2ZWwgdHlwZQotCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSkpIHsKLQkJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIGdldENsYXNzRmlsZShmaWxlTmFtZSk7Ci0JCQkJCWlmIChjbGFzc0ZpbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7Ci0JCQkJfQotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoZmlsZU5hbWUpOwotCQkJCWlmIChjdSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCQlyZXR1cm4gKEphdmFFbGVtZW50KSBjdS5nZXRUeXBlKG5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zb3VyY2VOYW1lKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbWVtYmVyIHR5cGUKLQkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gKElUeXBlKSBkZWNsYXJpbmdUeXBlQmluZGluZy5nZXRKYXZhRWxlbWVudCgpOwotCQkJCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGRlY2xhcmluZ1R5cGUuZ2V0VHlwZShuZXcgU3RyaW5nKHJlZmVyZW5jZUJpbmRpbmcuc291cmNlTmFtZSgpKSk7Ci0JCQl9CisJCWlmICh0aGlzLnJlc29sdmVyIGluc3RhbmNlb2YgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcikgeworCQkJRGVmYXVsdEJpbmRpbmdSZXNvbHZlciBkZWZhdWx0QmluZGluZ1Jlc29sdmVyID0gKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMucmVzb2x2ZXI7CisJCQlpZiAoIWRlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuZnJvbUphdmFQcm9qZWN0KSByZXR1cm4gbnVsbDsKKwkJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwuZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KAorCQkJCQl0eXBlQmluZGluZywKKwkJCQkJZGVmYXVsdEJpbmRpbmdSZXNvbHZlci53b3JraW5nQ29weU93bmVyLAorCQkJCQlkZWZhdWx0QmluZGluZ1Jlc29sdmVyLmdldEJpbmRpbmdzVG9Ob2Rlc01hcCgpKTsKIAkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKgpAQCAtNjU2LDYgKzU4NSw3IEBACiAJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgewogCiAJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CiAJCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkQmluZGluZyA9IChXaWxkY2FyZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKIAkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQkJYnVmZmVyLmFwcGVuZChUeXBlQ29uc3RhbnRzLldJTERDQVJEX05BTUUpOwpAQCAtNzM1LDQ5ICs2NjUsMTMgQEAKIAkJCWNhc2UgQmluZGluZy5BUlJBWV9UWVBFIDoKIAkJCWNhc2UgQmluZGluZy5UWVBFX1BBUkFNRVRFUiA6IC8vIGluY2x1ZGVzIGNhcHR1cmUgc2NlbmFyaW8KIAkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRToKIAkJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQlyZXR1cm4gdGhpcy5yZXNvbHZlci5nZXRQYWNrYWdlQmluZGluZyhyZWZlcmVuY2VCaW5kaW5nLmdldFBhY2thZ2UoKSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHRoYXQgaW5jbHVkZXMgdGhlIGdpdmVuIGZpbGUgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogcGtnRW5kID09IGphclNlcGFyYXRvciBpZiBkZWZhdWx0IHBhY2thZ2UgaW4gYSBqYXIKLQkgKiBwa2dFbmQgPiBqYXJTZXBhcmF0b3IgaWYgbm9uIGRlZmF1bHQgcGFja2FnZSBpbiBhIGphcgotCSAqIHBrZ0VuZCA+IDAgaWYgcGFja2FnZSBub3QgaW4gYSBqYXIKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JRGVwZW5kZW50I2dldEZpbGVOYW1lKCkKLQkgKi8KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KGNoYXJbXSBmaWxlTmFtZSwgaW50IHBrZ0VuZCwgaW50IGphclNlcGFyYXRvcikgewotCQlpZiAoamFyU2VwYXJhdG9yICE9IC0xKSB7Ci0JCQlTdHJpbmcgamFyTWVtZW50byA9IG5ldyBTdHJpbmcoZmlsZU5hbWUsIDAsIGphclNlcGFyYXRvcik7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBKYXZhQ29yZS5jcmVhdGUoamFyTWVtZW50byk7Ci0JCQlpZiAocGtnRW5kID09IGphclNlcGFyYXRvcikKLQkJCQlyZXR1cm4gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7Ci0JCQljaGFyW10gcGtnTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZmlsZU5hbWUsIGphclNlcGFyYXRvcisxLCBwa2dFbmQpOwotCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHBrZ05hbWUsICcvJywgJy4nKTsKLQkJCXJldHVybiByb290LmdldFBhY2thZ2VGcmFnbWVudChuZXcgU3RyaW5nKHBrZ05hbWUpKTsKLQkJfSBlbHNlIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ldyBTdHJpbmcoZmlsZU5hbWUsIDAsIHBrZ0VuZCkpOwotCQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJQ29udGFpbmVyIGZvbGRlciA9IHBhdGguc2VnbWVudENvdW50KCkgPT0gMSA/IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXRoLmxhc3RTZWdtZW50KCkpIDogKElDb250YWluZXIpIHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKHBhdGgpOwotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoZm9sZGVyKTsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgotCQkJCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOwotCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9ICgoSUphdmFQcm9qZWN0KSBlbGVtZW50KS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZvbGRlcik7Ci0JCQkJCWlmIChyb290ID09IG51bGwpIHJldHVybiBudWxsOwotCQkJCQlyZXR1cm4gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNnZXRRdWFsaWZpZWROYW1lKCkKIAkgKi8KQEAgLTc4NiwxNyArNjgwLDE4IEBACiAJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgewogCiAJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRSA6CisJCQljYXNlIEJpbmRpbmcuSU5URVJTRUNUSU9OX1RZUEU6CiAJCQkJV2lsZGNhcmRCaW5kaW5nIHdpbGRjYXJkQmluZGluZyA9IChXaWxkY2FyZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKIAkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQkJYnVmZmVyLmFwcGVuZChUeXBlQ29uc3RhbnRzLldJTERDQVJEX05BTUUpOwogCQkJCWZpbmFsIElUeXBlQmluZGluZyBib3VuZCA9IGdldEJvdW5kKCk7CiAJCQkJaWYgKGJvdW5kICE9IG51bGwpIHsKIAkJCQkJc3dpdGNoKHdpbGRjYXJkQmluZGluZy5ib3VuZEtpbmQpIHsKLQkJCQkgICAgICAgIGNhc2UgV2lsZGNhcmQuU1VQRVIgOgotCQkJCSAgICAgICAgCWJ1ZmZlci5hcHBlbmQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9TVVBFUik7Ci0JCQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJICAgICAgICBjYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotCQkJCSAgICAgICAgCWJ1ZmZlci5hcHBlbmQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTKTsKKwkJCQkJCWNhc2UgV2lsZGNhcmQuU1VQRVIgOgorCQkJCQkJCWJ1ZmZlci5hcHBlbmQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9TVVBFUik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgorCQkJCQkJCWJ1ZmZlci5hcHBlbmQoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTKTsKIAkJCQkJfQogCQkJCQlidWZmZXIuYXBwZW5kKGJvdW5kLmdldFF1YWxpZmllZE5hbWUoKSk7CiAJCQkJfQpAQCAtODA4LDcgKzcwMyw3IEBACiAJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRSA6CiAJCQkJSVR5cGVCaW5kaW5nIGVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoKTsKIAkJCQlpZiAoZWxlbWVudFR5cGUuaXNMb2NhbCgpIHx8IGVsZW1lbnRUeXBlLmlzQW5vbnltb3VzKCkgfHwgZWxlbWVudFR5cGUuaXNDYXB0dXJlKCkpIHsKLQkJCQkJcmV0dXJuIE5PX05BTUU7CisJCQkJCXJldHVybiBlbGVtZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7CiAJCQkJfQogCQkJCWZpbmFsIGludCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucygpOwogCQkJCWNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW2RpbWVuc2lvbnMgKiAyXTsKQEAgLTgyOCw2ICs3MjMsOSBAQAogCQkJCXJldHVybiBuZXcgU3RyaW5nKHR5cGVWYXJpYWJsZUJpbmRpbmcuc291cmNlTmFtZSk7CiAKIAkJCWNhc2UgQmluZGluZy5QQVJBTUVURVJJWkVEX1RZUEUgOgorCQkJCWlmICh0aGlzLmJpbmRpbmcuaXNMb2NhbFR5cGUoKSkgeworCQkJCQlyZXR1cm4gTk9fTkFNRTsKKwkJCQl9CiAJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQkJCWlmIChpc01lbWJlcigpKSB7CiAJCQkJCWJ1ZmZlcgpAQCAtODYzLDkgKzc2MSw4IEBACiAJCQkJCWJ1ZmZlci5hcHBlbmQoJz4nKTsKIAkJCQl9CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7Ci0KIAkJCWRlZmF1bHQgOgotCQkJCWlmIChpc0Fub255bW91cygpIHx8IGlzTG9jYWwoKSkgeworCQkJCWlmIChpc0Fub255bW91cygpIHx8IHRoaXMuYmluZGluZy5pc0xvY2FsVHlwZSgpKSB7CiAJCQkJCXJldHVybiBOT19OQU1FOwogCQkJCX0KIAkJCQlpZiAoaXNQcmltaXRpdmUoKSB8fCBpc051bGxUeXBlKCkpIHsKQEAgLTkzMCwyMSArODI3LDE5IEBACiAJCWlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogCQkJcmV0dXJuIHRoaXMudHlwZUFyZ3VtZW50czsKIAkJfQotCQlpZiAodGhpcy5iaW5kaW5nLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzUGFyYW1ldGVyaXplZFR5cGVXaXRoQWN0dWFsQXJndW1lbnRzKCkpIHsKIAkJCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CiAJCQlmaW5hbCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nW10gYXJndW1lbnRzID0gcGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nLmFyZ3VtZW50czsKLQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwotCQkJCUlUeXBlQmluZGluZ1tdIG5ld1R5cGVBcmd1bWVudHMgPSBuZXcgSVR5cGVCaW5kaW5nW2FyZ3VtZW50c0xlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHNMZW5ndGg7IGkrKykgewotCQkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGFyZ3VtZW50c1tpXSk7Ci0JCQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzID0gTk9fVFlQRV9CSU5ESU5HUzsKLQkJCQkJfQotCQkJCQluZXdUeXBlQXJndW1lbnRzW2ldID0gdHlwZUJpbmRpbmc7CisJCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCUlUeXBlQmluZGluZ1tdIG5ld1R5cGVBcmd1bWVudHMgPSBuZXcgSVR5cGVCaW5kaW5nW2FyZ3VtZW50c0xlbmd0aF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50c0xlbmd0aDsgaSsrKSB7CisJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZyhhcmd1bWVudHNbaV0pOworCQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiB0aGlzLnR5cGVBcmd1bWVudHMgPSBOT19UWVBFX0JJTkRJTkdTOwogCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzID0gbmV3VHlwZUFyZ3VtZW50czsKKwkJCQluZXdUeXBlQXJndW1lbnRzW2ldID0gdHlwZUJpbmRpbmc7CiAJCQl9CisJCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzID0gbmV3VHlwZUFyZ3VtZW50czsKIAkJfQogCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnRzID0gTk9fVFlQRV9CSU5ESU5HUzsKIAl9CkBAIC0xMDc2LDcgKzk3MSw3IEBACiAJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNBcnJheSgpCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGJpbmRpbmcuaXNBcnJheVR5cGUoKTsKKwkJcmV0dXJuIHRoaXMuYmluZGluZy5pc0FycmF5VHlwZSgpOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTExMDksMTggKzEwMDQsMTMgQEAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0Nhc3RDb21wYXRpYmxlKElUeXBlQmluZGluZyB0eXBlKSB7CiAJCXRyeSB7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvbigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKIAkJCVNjb3BlIHNjb3BlID0gdGhpcy5yZXNvbHZlci5zY29wZSgpOwogCQkJaWYgKHNjb3BlID09IG51bGwpIHJldHVybiBmYWxzZTsKIAkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBUeXBlQmluZGluZykpIHJldHVybiBmYWxzZTsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSAoKFR5cGVCaW5kaW5nKSB0eXBlKS5iaW5kaW5nOwogCQkJLy8gc2ltdWxhdGUgY2FwdHVyZSBpbiBjYXNlIGNoZWNrZWQgYmluZGluZyBkaWQgbm90IHByb3Blcmx5IGdldCBleHRyYWN0ZWQgZnJvbSBhIHJlZmVyZW5jZQogCQkJZXhwcmVzc2lvblR5cGUgPSBleHByZXNzaW9uVHlwZS5jYXB0dXJlKHNjb3BlLCAwKTsKLQkJCXJldHVybiBleHByZXNzaW9uLmNoZWNrQ2FzdFR5cGVzQ29tcGF0aWJpbGl0eShzY29wZSwgdGhpcy5iaW5kaW5nLCBleHByZXNzaW9uVHlwZSwgbnVsbCk7CisJCQlyZXR1cm4gVHlwZUJpbmRpbmcuRVhQUkVTU0lPTi5jaGVja0Nhc3RUeXBlc0NvbXBhdGliaWxpdHkoc2NvcGUsIHRoaXMuYmluZGluZywgZXhwcmVzc2lvblR5cGUsIG51bGwpOwogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAkJCS8vIGRvbid0IHN1cmZhY2UgaW50ZXJuYWwgZXhjZXB0aW9uIHRvIGNsaWVudHMKIAkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMDEzCkBAIC0xMTMyLDcgKzEwMjIsMTMgQEAKIAkgKiBAc2VlIElUeXBlQmluZGluZyNpc0NsYXNzKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSAmJiAhdGhpcy5iaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkgJiYgIXRoaXMuYmluZGluZy5pc1dpbGRjYXJkKCk7CisJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaXNDbGFzcygpOwogCX0KIAogCS8qCkBAIC0xMjIyLDcgKzExMTgsMTMgQEAKIAkgKiBAc2VlIElUeXBlQmluZGluZyNpc0ludGVyZmFjZSgpCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSAmJiAhdGhpcy5iaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkgJiYgIXRoaXMuYmluZGluZy5pc1dpbGRjYXJkKCk7CisJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSIDoKKwkJCWNhc2UgQmluZGluZy5XSUxEQ0FSRF9UWVBFIDoKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKTsKIAl9CiAKIAkvKgpAQCAtMTI2OSwxNCArMTE3MSwxNCBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNpc1BhcmFtZXRlcml6ZWRUeXBlKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5iaW5kaW5nLmlzUGFyYW1ldGVyaXplZFR5cGUoKSAmJiAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5iaW5kaW5nKS5hcmd1bWVudHMgIT0gbnVsbDsKKwkJcmV0dXJuIHRoaXMuYmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlV2l0aEFjdHVhbEFyZ3VtZW50cygpOwogCX0KIAogCS8qCiAJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNQcmltaXRpdmUoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gIWlzTnVsbFR5cGUoKSAmJiBiaW5kaW5nLmlzQmFzZVR5cGUoKTsKKwkJcmV0dXJuICFpc051bGxUeXBlKCkgJiYgdGhpcy5iaW5kaW5nLmlzQmFzZVR5cGUoKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0xMjkwLDcgKzExOTIsNyBAQAogCSAqIEBzZWUgSUJpbmRpbmcjaXNSZWNvdmVyZWQoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUmVjb3ZlcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiAodGhpcy5iaW5kaW5nLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc01pc3NpbmdUeXBlKSAhPSAwOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTEzNDAsNyArMTI0MiwxMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZyNpc1VwcGVyYm91bmQoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzVXBwZXJib3VuZCgpIHsKLQkJcmV0dXJuIHRoaXMuYmluZGluZy5pc1dpbGRjYXJkKCkgJiYgKChXaWxkY2FyZEJpbmRpbmcpIHRoaXMuYmluZGluZykuYm91bmRLaW5kID09IFdpbGRjYXJkLkVYVEVORFM7CisJCXN3aXRjaCAodGhpcy5iaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJCXJldHVybiAoKFdpbGRjYXJkQmluZGluZykgdGhpcy5iaW5kaW5nKS5ib3VuZEtpbmQgPT0gV2lsZGNhcmQuRVhURU5EUzsKKwkJCWNhc2UgQmluZGluZy5JTlRFUlNFQ1RJT05fVFlQRSA6CisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTEzNTAsMTAgKzEyNTgsNiBAQAogCQlyZXR1cm4gdGhpcy5iaW5kaW5nLmlzV2lsZGNhcmQoKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkQmVSZW1vdmVkKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCXJldHVybiBtZXRob2RCaW5kaW5nLmlzRGVmYXVsdEFic3RyYWN0KCkgfHwgbWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpIHx8IChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSAmJiBpc0ludGVyZmFjZSgpKTsKLQl9Ci0KIAkvKgogCSAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5LgogCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCAxZGI2MWUxLi45ZGZkMmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzQsOCArMzQsOCBAQAogICogCQkJPGI+ezwvYj4geyBJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24gfCA8Yj47PC9iPiB9IDxiPn08L2I+CiAgKiA8L3ByZT4KICAqIEZvciBKTFMzLCB0eXBlIHBhcmFtZXRlcnMgYW5kIHJlaWZpZWQgbW9kaWZpZXJzCi0gKiAoYW5kIGFubm90YXRpb25zKSB3ZXJlIGFkZGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MgdHlwZSBuYW1lIGFuZCBzdXBlcmludGVyZmFjZSAKLSAqIHR5cGVzIG5hbWVzIGFyZSBnZW5lcmFsaXplZCB0byB0eXBlIHNvIHRoYXQgcGFyYW1ldGVyaXplZCB0eXBlcyBjYW4gYmUgCisgKiAoYW5kIGFubm90YXRpb25zKSB3ZXJlIGFkZGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MgdHlwZSBuYW1lIGFuZCBzdXBlcmludGVyZmFjZQorICogdHlwZXMgbmFtZXMgYXJlIGdlbmVyYWxpemVkIHRvIHR5cGUgc28gdGhhdCBwYXJhbWV0ZXJpemVkIHR5cGVzIGNhbiBiZQogICogcmVmZXJlbmNlZDoKICAqIDxwcmU+CiAgKiBUeXBlRGVjbGFyYXRpb246CkBAIC02MiwxMDQgKzYyLDEwNSBAQAogICogbW9kaWZpZXJzIG9yIGFubm90YXRpb25zKS4gVGhlIHNvdXJjZSByYW5nZSBleHRlbmRzIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSAifSIKICAqIHRva2VuIGZvbGxvd2luZyB0aGUgYm9keSBkZWNsYXJhdGlvbnMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHsKLQkKKwogCS8qKgotCSAqIFRoZSAiamF2YWRvYyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImphdmFkb2MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBKYXZhZG9jfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSkFWQURPQ19QUk9QRVJUWSA9CiAJCWludGVybmFsSmF2YWRvY1Byb3BlcnR5RmFjdG9yeShUeXBlRGVjbGFyYXRpb24uY2xhc3MpOwogCiAJLyoqCi0JICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKEpMUzIgQVBJIG9ubHkpLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pIChKTFMyIEFQSSBvbmx5KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0KIAkJaW50ZXJuYWxNb2RpZmllcnNQcm9wZXJ0eUZhY3RvcnkoVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTMl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPQogCQlpbnRlcm5hbE1vZGlmaWVyczJQcm9wZXJ0eUZhY3RvcnkoVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIFRoZSAiaW50ZXJmYWNlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAiaW50ZXJmYWNlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgQm9vbGVhbn0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBJTlRFUkZBQ0VfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBJTlRFUkZBQ0VfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFR5cGVEZWNsYXJhdGlvbi5jbGFzcywgImludGVyZmFjZSIsIGJvb2xlYW4uY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCWludGVybmFsTmFtZVByb3BlcnR5RmFjdG9yeShUeXBlRGVjbGFyYXRpb24uY2xhc3MpOwogCiAJLyoqCi0JICogVGhlICJzdXBlcmNsYXNzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChKTFMyIEFQSSBvbmx5KS4KKwkgKiBUaGUgInN1cGVyY2xhc3MiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBOYW1lfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFNVUEVSQ0xBU1NfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFNVUEVSQ0xBU1NfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAic3VwZXJjbGFzcyIsIE5hbWUuY2xhc3MsIE9QVElPTkFMLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJzdXBlckludGVyZmFjZXMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKEpMUzIgQVBJIG9ubHkpLgorCSAqIFRoZSAic3VwZXJJbnRlcmZhY2VzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBOYW1lfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBTVVBFUl9JTlRFUkZBQ0VTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgU1VQRVJfSU5URVJGQUNFU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAic3VwZXJJbnRlcmZhY2VzIiwgTmFtZS5jbGFzcywgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAic3VwZXJjbGFzc1R5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGFkZGVkIGluIEpMUzMgQVBJKS4KKwkgKiBUaGUgInN1cGVyY2xhc3NUeXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgU1VQRVJDTEFTU19UWVBFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBTVVBFUkNMQVNTX1RZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAic3VwZXJjbGFzc1R5cGUiLCBUeXBlLmNsYXNzLCBPUFRJT05BTCwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAic3VwZXJJbnRlcmZhY2VUeXBlcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAic3VwZXJJbnRlcmZhY2VUeXBlcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFNVUEVSX0lOVEVSRkFDRV9UWVBFU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFNVUEVSX0lOVEVSRkFDRV9UWVBFU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAic3VwZXJJbnRlcmZhY2VUeXBlcyIsIFR5cGUuY2xhc3MsIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgInR5cGVQYXJhbWV0ZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJ0eXBlUGFyYW1ldGVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZVBhcmFtZXRlcn0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUEFSQU1FVEVSU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUEFSQU1FVEVSU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAidHlwZVBhcmFtZXRlcnMiLCBUeXBlUGFyYW1ldGVyLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJib2R5RGVjbGFyYXRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJib2R5RGVjbGFyYXRpb25zIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBCb2R5RGVjbGFyYXRpb259KSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBCT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZID0KIAkJaW50ZXJuYWxCb2R5RGVjbGFyYXRpb25Qcm9wZXJ0eUZhY3RvcnkoVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18yXzA7Ci0JCisKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDgpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoVHlwZURlY2xhcmF0aW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtMTcxLDcgKzE3Miw3IEBACiAJCWFkZFByb3BlcnR5KFNVUEVSX0lOVEVSRkFDRVNfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlQUk9QRVJUWV9ERVNDUklQVE9SU18yXzAgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7Ci0JCQorCiAJCXByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoOSk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUeXBlRGVjbGFyYXRpb24uY2xhc3MsIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEpBVkFET0NfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CkBAIC0xODgsMTEgKzE4OSwxMSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTIwMywxNSArMjA0LDE1IEBACiAJCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwogCQl9CiAJfQotCQkJCisKIAkvKioKIAkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW4gaW50ZXJmYWNlLCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGEgY2xhc3MuCiAJICogRGVmYXVsdHMgdG8gY2xhc3MuCiAJICovCiAJcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJmYWNlID0gZmFsc2U7Ci0JCisKIAkvKioKLQkgKiBUaGUgdHlwZSBwYXJhbXRlcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZVBhcmFtZXRlcjwvY29kZT4pLiAKKwkgKiBUaGUgdHlwZSBwYXJhbWV0ZXJzIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlUGFyYW1ldGVyfSkuCiAJICogTnVsbCBpbiBKTFMyLiBBZGRlZCBpbiBKTFMzOyBkZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0CiAJICogKHNlZSBjb25zdHJ1Y3RvcikuCiAJICogQHNpbmNlIDMuMQpAQCAtMjI2LDEwICsyMjcsMTAgQEAKIAlwcml2YXRlIE5hbWUgb3B0aW9uYWxTdXBlcmNsYXNzTmFtZSA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgc3VwZXJpbnRlcmZhY2UgbmFtZXMgKGVsZW1lbnQgdHlwZTogPGNvZGU+TmFtZTwvY29kZT4pLiAKKwkgKiBUaGUgc3VwZXJpbnRlcmZhY2UgbmFtZXMgKGVsZW1lbnQgdHlwZToge0BsaW5rIE5hbWV9KS4KIAkgKiBKTFMyIG9ubHk7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuIE5vdCB1c2VkIGluIEpMUzMuCiAJICogKHNlZSBjb25zdHJ1Y3RvcikuCi0JICogCisJICoKIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3Qgc3VwZXJJbnRlcmZhY2VOYW1lcyA9IG51bGw7CiAKQEAgLTI0Miw3ICsyNDMsNyBAQAogCXByaXZhdGUgVHlwZSBvcHRpb25hbFN1cGVyY2xhc3NUeXBlID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBzdXBlcmludGVyZmFjZSB0eXBlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5UeXBlPC9jb2RlPikuIAorCSAqIFRoZSBzdXBlcmludGVyZmFjZSB0eXBlcyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIE51bGwgaW4gSkxTMi4gQWRkZWQgaW4gSkxTMzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdAogCSAqIChzZWUgY29uc3RydWN0b3IpLgogCSAqIEBzaW5jZSAzLjEKQEAgLTI1MCwxNyArMjUxLDE3IEBACiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN1cGVySW50ZXJmYWNlVHlwZXMgPSBudWxsOwogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB0eXBlIGRlY2xhcmF0aW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHR5cGUgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpcyBmb3IgYSBjbGFzcyBvZiBhbgotCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWU7IG5vIG1vZGlmaWVyczsgbm8gamF2YWRvYzsgCisJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBqYXZhZG9jOwogCSAqIG5vIHR5cGUgcGFyYW1ldGVyczsgbm8gc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZXM7IGFuZCBhbiBlbXB0eSBsaXN0CiAJICogb2YgYm9keSBkZWNsYXJhdGlvbnMuCiAJICogPHA+Ci0JICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKLQkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUKIAkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVR5cGVEZWNsYXJhdGlvbihBU1QgYXN0KSB7CkBAIC0yODEsNyArMjgyLDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zMTMsNyArMzE0LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMzUzLDcgKzM1NCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0zNzYsNyArMzc3LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJvZHlEZWNsYXJhdGlvbi4KIAkgKi8KQEAgLTQyNSw3ICs0MjYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJVHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0SmF2YWRvYygpKSk7CiAJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA9PSBBU1QuSkxTMl9JTlRFUk5BTCkgewpAQCAtNDU4LDcgKzQ1OSw3IEBACiAJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKIAkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtNDg1LDI2ICs0ODYsMjYgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgZGVjbGFyYXRpb24gZGVjbGFyZXMgYSBjbGFzcyBvciBhbiAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgY2xhc3Mgb3IgYW4KIAkgKiBpbnRlcmZhY2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGRlY2xhcmF0aW9uLAogCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBhIGNsYXNzIGRlY2xhcmF0aW9uCi0JICovIAorCSAqLwogCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewogCQlyZXR1cm4gdGhpcy5pc0ludGVyZmFjZTsKIAl9Ci0JCisKIAkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgY2xhc3Mgb3IgYW4gCisJICogU2V0cyB3aGV0aGVyIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIGNsYXNzIG9yIGFuCiAJICogaW50ZXJmYWNlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGlzSW50ZXJmYWNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlCiAJICogICAgZGVjbGFyYXRpb24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBhIGNsYXNzCiAJICogCSAgZGVjbGFyYXRpb24KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlKGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKIAkJcHJlVmFsdWVDaGFuZ2UoSU5URVJGQUNFX1BST1BFUlRZKTsKIAkJdGhpcy5pc0ludGVyZmFjZSA9IGlzSW50ZXJmYWNlOwpAQCAtNTEyLDE1ICs1MTMsMTUgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyB0eXBlIAorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycyBvZiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbiAoYWRkZWQgaW4gSkxTMyBBUEkpLiBUaGlzIGxpc3QgaXMgbm9uLWVtcHR5IGZvciBwYXJhbWV0ZXJpemVkIHR5cGVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlR5cGVQYXJhbWV0ZXI8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlUGFyYW1ldGVyfSkKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTGlzdCB0eXBlUGFyYW1ldGVycygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy50eXBlUGFyYW1ldGVycyA9PSBudWxsKSB7CkBAIC01MjgsMjggKzUyOSwyOCBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGVQYXJhbWV0ZXJzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MgZGVjbGFyZWQgaW4gdGhpcyB0eXBlCiAJICogZGVjbGFyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUgKEpMUzIgQVBJIG9ubHkpLgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlIAorCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlCiAJICogZGVjbGFyYXRpb25zIChhbHRob3VnaCBpdCBkb2VzIHN0aWxsIGZpZ3VyZSBpbiBzdWJ0cmVlCiAJICogZXF1YWxpdHkgY29tcGFyaXNvbnMpLgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdXBlcmNsYXNzIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBzdXBlcmNsYXNzIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKIAkgKiAgICB0aGVyZSBpcyBub25lCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYW4gQVNUIGxhdGVyIHRoYW4gSkxTMgogCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKIAkgKiB7QGxpbmsgI2dldFN1cGVyY2xhc3NUeXBlKCl9LCB3aGljaCByZXR1cm5zIGEgPGNvZGU+VHlwZTwvY29kZT4KIAkgKiBpbnN0ZWFkIG9mIGEgPGNvZGU+TmFtZTwvY29kZT4uCi0JICovIAorCSAqLwogCXB1YmxpYyBOYW1lIGdldFN1cGVyY2xhc3MoKSB7CiAJCXJldHVybiBpbnRlcm5hbEdldFN1cGVyY2xhc3MoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtNTY0LDE3ICs1NjUsMTcgQEAKIAkqIFJldHVybnMgdGhlIHN1cGVyY2xhc3MgZGVjbGFyZWQgaW4gdGhpcyB0eXBlCiAJKiBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgogCSogPHA+Ci0JKiBOb3RlIHRoYXQgdGhpcyBjaGlsZCBpcyBub3QgcmVsZXZhbnQgZm9yIGludGVyZmFjZSAKKwkqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlCiAJKiBkZWNsYXJhdGlvbnMgKGFsdGhvdWdoIGl0IGRvZXMgc3RpbGwgZmlndXJlIGluIHN1YnRyZWUKIAkqIGVxdWFsaXR5IGNvbXBhcmlzb25zKS4KIAkqIDwvcD4KLQkqIAotCSogQHJldHVybiB0aGUgc3VwZXJjbGFzcyB0eXBlIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSoKKwkqIEByZXR1cm4gdGhlIHN1cGVyY2xhc3MgdHlwZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSogICAgdGhlcmUgaXMgbm9uZQogCSogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJKiBhIEpMUzIgQVNUCiAJKiBAc2luY2UgMy4xCi0JKi8gCisJKi8KIAlwdWJsaWMgVHlwZSBnZXRTdXBlcmNsYXNzVHlwZSgpIHsKIAkgICAgdW5zdXBwb3J0ZWRJbjIoKTsKIAkJcmV0dXJuIHRoaXMub3B0aW9uYWxTdXBlcmNsYXNzVHlwZTsKQEAgLTU4NCwxMiArNTg1LDEyIEBACiAJICogU2V0cyBvciBjbGVhcnMgdGhlIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MgZGVjbGFyZWQgaW4gdGhpcyB0eXBlCiAJICogZGVjbGFyYXRpb24gKEpMUzIgQVBJIG9ubHkpLgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlIAorCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlCiAJICogZGVjbGFyYXRpb25zIChhbHRob3VnaCBpdCBkb2VzIHN0aWxsIGZpZ3VyZSBpbiBzdWJ0cmVlCiAJICogZXF1YWxpdHkgY29tcGFyaXNvbnMpLgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3VwZXJjbGFzc05hbWUgdGhlIHN1cGVyY2xhc3MgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKgorCSAqIEBwYXJhbSBzdXBlcmNsYXNzTmFtZSB0aGUgc3VwZXJjbGFzcyBuYW1lIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTU5OCwxNCArNTk5LDE0IEBACiAJICogPC91bD4KIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCi0JICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieSAKKwkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CiAJICoge0BsaW5rICNzZXRTdXBlcmNsYXNzVHlwZShUeXBlKX0sIHdoaWNoIGV4cGVjdHMgYQogCSAqIDxjb2RlPlR5cGU8L2NvZGU+IGluc3RlYWQgb2YgYSA8Y29kZT5OYW1lPC9jb2RlPi4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0U3VwZXJjbGFzcyhOYW1lIHN1cGVyY2xhc3NOYW1lKSB7CiAJCWludGVybmFsU2V0U3VwZXJjbGFzcyhzdXBlcmNsYXNzTmFtZSk7CiAJfQotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgc3lub255bSBmb3IgZGVwcmVjYXRlZCBtZXRob2QuIFVzZWQgdG8gYXZvaWQKIAkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KQEAgLTYyNiw4ICs2MjcsOCBAQAogCSAqIE5vdGUgdGhhdCB0aGlzIGNoaWxkIGlzIG5vdCByZWxldmFudCBmb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucwogCSAqIChhbHRob3VnaCBpdCBkb2VzIHN0aWxsIGZpZ3VyZSBpbiBzdWJ0cmVlIGVxdWFsaXR5IGNvbXBhcmlzb25zKS4KIAkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN1cGVyY2xhc3NUeXBlIHRoZSBzdXBlcmNsYXNzIHR5cGUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICoKKwkgKiBAcGFyYW0gc3VwZXJjbGFzc1R5cGUgdGhlIHN1cGVyY2xhc3MgdHlwZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIHRoZXJlIGlzIG5vbmUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC02MzcsNyArNjM4LDcgQEAKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRTdXBlcmNsYXNzVHlwZShUeXBlIHN1cGVyY2xhc3NUeXBlKSB7CiAJICAgIHVuc3VwcG9ydGVkSW4yKCk7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsU3VwZXJjbGFzc1R5cGU7CkBAIC02NDcsMjMgKzY0OCwyMyBAQAogIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBuYW1lcyBvZiBzdXBlcmludGVyZmFjZXMgb2YgdGhpcyB0eXBlIAorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIG5hbWVzIG9mIHN1cGVyaW50ZXJmYWNlcyBvZiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbiAoSkxTMiBBUEkgb25seSkuIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgdGhlIG5hbWVzCiAJICogb2YgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHM7IGZvciBhbiBpbnRlcmZhY2UKIAkgKiBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIHRoZSBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlCiAJICogZXh0ZW5kcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5OYW1lPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgTmFtZX0pCiAJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBpcyB1c2VkIGluCiAJICogYW4gQVNUIGxhdGVyIHRoYW4gSkxTMgotCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkgCisJICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieQogCSAqIHtAbGluayAjc3VwZXJJbnRlcmZhY2VUeXBlcygpfS4KLQkgKi8gCisJICovCiAJcHVibGljIExpc3Qgc3VwZXJJbnRlcmZhY2VzKCkgewogCQlyZXR1cm4gaW50ZXJuYWxTdXBlckludGVyZmFjZXMoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtNjc2LDE5ICs2NzcsMTkgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5zdXBlckludGVyZmFjZU5hbWVzOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiB0aGlzIHR5cGUgCisJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2Ygc3VwZXJpbnRlcmZhY2VzIG9mIHRoaXMgdHlwZQogCSAqIGRlY2xhcmF0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgdGhlIGludGVyZmFjZXMKIAkgKiB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50czsgZm9yIGFuIGludGVyZmFjZSBkZWNsYXJhdGlvbiwKIAkgKiB0aGVzZSBhcmUgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGludGVyZmFjZSBleHRlbmRzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGludGVyZmFjZSB0eXBlcwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlR5cGU8L2NvZGU+KQorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTGlzdCBzdXBlckludGVyZmFjZVR5cGVzKCkgewogCQkvLyBtb3JlIGVmZmljaWVudCB0aGFuIGp1c3QgY2FsbGluZyB1bnN1cHBvcnRlZEluMigpIHRvIGNoZWNrCiAJCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlVHlwZXMgPT0gbnVsbCkgewpAQCAtNjk2LDkgKzY5Nyw5IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuc3VwZXJJbnRlcmZhY2VUeXBlczsKIAl9Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZmllbGQgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZSAKKwkgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZmllbGQgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZQogCSAqIGRlY2xhcmF0aW9uLiBGb3IgYSBjbGFzcyBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIHRoZQogCSAqIGZpZWxkIGRlY2xhcmF0aW9uczsgZm9yIGFuIGludGVyZmFjZSBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlCiAJICogdGhlIGNvbnN0YW50IGRlY2xhcmF0aW9ucy4KQEAgLTcwNyw5ICs3MDgsOSBAQAogCSAqIHdpdGggbm9uLWZpZWxkcyBmaWx0ZXJlZCBvdXQuIFVubGlrZSA8Y29kZT5ib2R5RGVjbGFyYXRpb25zPC9jb2RlPiwKIAkgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYSBsaXZlIHJlc3VsdC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgZmllbGQgZGVjbGFyYXRpb25zCi0JICovIAorCSAqLwogCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzKCkgewogCQlMaXN0IGJkID0gYm9keURlY2xhcmF0aW9ucygpOwogCQlpbnQgZmllbGRDb3VudCA9IDA7CkBAIC03MzAsMTcgKzczMSwxNyBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyZWQgbGlzdCBvZiBtZXRob2QgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZSAKKwkgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3Qgb2YgbWV0aG9kIGRlY2xhcmF0aW9ucyBvZiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbi4KIAkgKiA8cD4KIAkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCByZXR1cm5zIHRoaXMgbm9kZSdzIGJvZHkgZGVjbGFyYXRpb25zCiAJICogd2l0aCBub24tbWV0aG9kcyBmaWx0ZXJlZCBvdXQuIFVubGlrZSA8Y29kZT5ib2R5RGVjbGFyYXRpb25zPC9jb2RlPiwKIAkgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYSBsaXZlIHJlc3VsdC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIG1ldGhvZCAoYW5kIGNvbnN0cnVjdG9yKSAKKwkgKgorCSAqIEByZXR1cm4gdGhlIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBtZXRob2QgKGFuZCBjb25zdHJ1Y3RvcikKIAkgKiAgICBkZWNsYXJhdGlvbnMKLQkgKi8gCisJICovCiAJcHVibGljIE1ldGhvZERlY2xhcmF0aW9uW10gZ2V0TWV0aG9kcygpIHsKIAkJTGlzdCBiZCA9IGJvZHlEZWNsYXJhdGlvbnMoKTsKIAkJaW50IG1ldGhvZENvdW50ID0gMDsKQEAgLTc2MSwxNiArNzYyLDE2IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXJlZCBsaXN0IG9mIG1lbWJlciB0eXBlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIHR5cGUgCisJICogUmV0dXJucyB0aGUgb3JkZXJlZCBsaXN0IG9mIG1lbWJlciB0eXBlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIHR5cGUKIAkgKiBkZWNsYXJhdGlvbi4KIAkgKiA8cD4KIAkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCByZXR1cm5zIHRoaXMgbm9kZSdzIGJvZHkgZGVjbGFyYXRpb25zCiAJICogd2l0aCBub24tdHlwZXMgZmlsdGVyZWQgb3V0LiBVbmxpa2UgPGNvZGU+Ym9keURlY2xhcmF0aW9uczwvY29kZT4sCiAJICogdGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgbGl2ZSByZXN1bHQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIG1lbWJlciB0eXBlIGRlY2xhcmF0aW9ucwotCSAqLyAKKwkgKi8KIAlwdWJsaWMgVHlwZURlY2xhcmF0aW9uW10gZ2V0VHlwZXMoKSB7CiAJCUxpc3QgYmQgPSBib2R5RGVjbGFyYXRpb25zKCk7CiAJCWludCB0eXBlQ291bnQgPSAwOwpAQCAtNzk2LDE0ICs3OTcsMTQgQEAKIAlJVHlwZUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVUeXBlKHRoaXMpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCBtZW1TaXplKCkgewogCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgNiAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuamF2YQppbmRleCAxNzM0MjVjLi41MTUwNDJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsNDkgKzMyLDUwIEBACiAgKiAgICBFbnVtRGVjbGFyYXRpb24KICAqIDwvcHJlPgogICogQWx0aG91Z2ggYWxsb3dlZCBhdCB0aGUgQVNULCBub3QgYWxsIGFycmFuZ2VtZW50cyBvZiBBU1Qgbm9kZXMgYXJlIG1lYW5pbmdmdWw7Ci0gKiBpbiBwYXJ0aWN1bGFyLCBvbmx5IGNsYXNzIGFuZCBlbnVtIGRlY2xhcmF0aW9ucyBhcmUgbWVhbmluZ2Z1bCBpbiB0aGUgY29udGV4dCBvZiAKKyAqIGluIHBhcnRpY3VsYXIsIG9ubHkgY2xhc3MgYW5kIGVudW0gZGVjbGFyYXRpb25zIGFyZSBtZWFuaW5nZnVsIGluIHRoZSBjb250ZXh0IG9mCiAgKiBhIGJsb2NrLgotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlRGVjbGFyYXRpb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKEpMUzIgQVBJIG9ubHkpLgorCSAqIFRoZSAidHlwZURlY2xhcmF0aW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfREVDTEFSQVRJT05fUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfREVDTEFSQVRJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmNsYXNzLCAidHlwZURlY2xhcmF0aW9uIiwgVHlwZURlY2xhcmF0aW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImRlY2xhcmF0aW9uIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChhZGRlZCBpbiBKTFMzIEFQSSkuCisJICogVGhlICJkZWNsYXJhdGlvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufSkgKGFkZGVkIGluIEpMUzMgQVBJKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBERUNMQVJBVElPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgREVDTEFSQVRJT05fUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmNsYXNzLCAiZGVjbGFyYXRpb24iLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMDsKLQkKKwogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KFRZUEVfREVDTEFSQVRJT05fUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKLQkJCisKIAkJcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoREVDTEFSQVRJT05fUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CkBAIC04NCwxMSArODUsMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC05OSwyMCArMTAwLDIwIEBACiAJCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlNfM18wOwogCQl9CiAJfQotCQkJCisKIAkvKioKLQkgKiBUaGUgdHlwZSBkZWNsYXJhdGlvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLCAKKwkgKiBUaGUgdHlwZSBkZWNsYXJhdGlvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAogCSAqIGJ1dCBsZWdhbCwgdHlwZSBkZWNsYXJhdGlvbi4gSW4gSkxTMiwgY29ycmVzcG9uZHMgdG8gVFlQRV9ERUNMQVJBVElPTl9QUk9QRVJUWS4KICAgICAgKiBBZnRlciBKTFMyLCBjb3JyZXNwb25kcyB0byBERUNMQVJBVElPTl9QUk9QRVJUWS4KICAgICAgKiBAc2VlICN0eXBlRGVjbFByb3BlcnR5CiAJICovCiAJcHJpdmF0ZSBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IG51bGw7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGUgY2hpbGQgcHJvcGVydHkgc3RvcmVkIG9uIHRoZSA8Y29kZT50eXBlRGVjbDwvY29kZT4gaW5zdGFuY2UgdmFyaWFibGUuCi0gICAgICogSW4gSkxTMiwgY29ycmVzcG9uZHMgdG8gVFlQRV9ERUNMQVJBVElPTl9QUk9QRVJUWS4gQWZ0ZXIgSkxTMiwgY29ycmVzcG9uZHMgdG8gCisgICAgICogSW4gSkxTMiwgY29ycmVzcG9uZHMgdG8gVFlQRV9ERUNMQVJBVElPTl9QUk9QRVJUWS4gQWZ0ZXIgSkxTMiwgY29ycmVzcG9uZHMgdG8KICAgICAgKiBERUNMQVJBVElPTl9QUk9QRVJUWS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIDxjb2RlPnR5cGVEZWNsPC9jb2RlPiBpbnN0YW5jZSB2YXJpYWJsZTsKICAgICAgKiBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqLwpAQCAtMTI2LDEzICsxMjcsMTMgQEAKIAogCiAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQgCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQKIAkgKiBieSB0aGUgZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbiBpcyBhbgogCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIHR5cGUgZGVjbGFyYXRpb24uCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KEFTVCBhc3QpIHsKQEAgLTE0Niw3ICsxNDcsNyBAQAogCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTE3MCw3ICsxNzEsNyBAQAogCQkvLyBhbGxvdyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGZsYWcgdGhlIGVycm9yCiAJCXJldHVybiBzdXBlci5pbnRlcm5hbEdldFNldENoaWxkUHJvcGVydHkocHJvcGVydHksIGdldCwgY2hpbGQpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTgyLDE1ICsxODMsMTUgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7Ci0JCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCByZXN1bHQgPSAKKwkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHJlc3VsdCA9CiAJCQluZXcgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldERlY2xhcmF0aW9uKAogCQkJKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSBnZXREZWNsYXJhdGlvbigpLmNsb25lKHRhcmdldCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA5LDE0ICsyMTAsMTQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGFic3RyYWN0IHR5cGUgZGVjbGFyYXRpb24gb2YgdGhpcyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uCiAJICogc3RhdGVtZW50IChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKIAkJaWYgKHRoaXMudHlwZURlY2wgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIzMCwxMSArMjMxLDExIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMudHlwZURlY2w7CiAJfQotCQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGFic3RyYWN0IHR5cGUgZGVjbGFyYXRpb24gb2YgdGhpcyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uCiAJICogc3RhdGVtZW50IChhZGRlZCBpbiBKTFMzIEFQSSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZGVjbCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjQzLDEyICsyNDQsMTIgQEAKIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgogCSAqIEBzaW5jZSAzLjEKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZGVjbCkgewogCQlpZiAoZGVjbCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJLy8gYSBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiAKKwkJLy8gYSBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbgogCQkvLyBUeXBlRGVjbGFyYXRpb24gLSBtdXN0IGNoZWNrIGN5Y2xlcwogCQlBU1ROb2RlIG9sZENoaWxkID0gdGhpcy50eXBlRGVjbDsKIAkJQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgdHlwZURlY2xQcm9wZXJ0eSA9IHR5cGVEZWNsUHJvcGVydHkoKTsKQEAgLTI1NiwyMiArMjU3LDIyIEBACiAJCXRoaXMudHlwZURlY2w9IGRlY2w7CiAJCXBvc3RSZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIGRlY2wsIHR5cGVEZWNsUHJvcGVydHkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHR5cGUgZGVjbGFyYXRpb24gb2YgdGhpcyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uCiAJICogc3RhdGVtZW50IChKTFMyIEFQSSBvbmx5KS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHR5cGUgZGVjbGFyYXRpb24gbm9kZQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGFuIEFTVCBsYXRlciB0aGFuIEpMUzIKLQkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5IAorCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKIAkgKiB7QGxpbmsgI2dldERlY2xhcmF0aW9uKCl9LCB3aGljaCByZXR1cm5zIDxjb2RlPkFic3RyYWN0VHlwZURlY2xhcmF0aW9uPC9jb2RlPgogCSAqIGluc3RlYWQgb2YgPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPi4KLQkgKi8gCisJICovCiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oKSB7CiAJCXJldHVybiBpbnRlcm5hbEdldFR5cGVEZWNsYXJhdGlvbigpOwogCX0KLQkKKwogCS8qKgogCSAqIEludGVybmFsIHN5bm9ueW0gZm9yIGRlcHJlY2F0ZWQgbWV0aG9kLiBVc2VkIHRvIGF2b2lkCiAJICogZGVwcmVjYXRpb24gd2FybmluZ3MuCkBAIC0yODEsMTEgKzI4MiwxMSBAQAogCQlzdXBwb3J0ZWRPbmx5SW4yKCk7CiAJCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBnZXREZWNsYXJhdGlvbigpOwogCX0KLQkJCisKIAkvKioKIAkgKiBTZXRzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIG9mIHRoaXMgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbgogCSAqIHN0YXRlbWVudCAoSkxTMiBBUEkgb25seSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZGVjbCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBub2RlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgpAQCAtMjk1LDE1ICsyOTYsMTUgQEAKIAkgKiA8L3VsPgogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGFuIEFTVCBsYXRlciB0aGFuIEpMUzIKLSAgICAgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5IAorICAgICAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKICAgICAgKiB7QGxpbmsgI3NldERlY2xhcmF0aW9uKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKX0gd2hpY2ggdGFrZXMKICAgICAgKiA8Y29kZT5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjwvY29kZT4gaW5zdGVhZCBvZgogICAgICAqIDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4uCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gZGVjbCkgewogCQlpbnRlcm5hbFNldFR5cGVEZWNsYXJhdGlvbihkZWNsKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtMzE0LDcgKzMxNSw3IEBACiAJCS8vIGZvcndhcmQgdG8gbm9uLWRlcHJlY2F0ZWQgcmVwbGFjZW1lbnQgbWV0aG9kCiAJCXNldERlY2xhcmF0aW9uKGRlY2wpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmVkIGluCiAJICogdGhpcyB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4KQEAgLTMyMiwxMCArMzIzLDEwIEBACiAJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQogCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqCisJICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlCiAJICogICAgcmVzb2x2ZWQKLQkgKi8JCisJICovCiAJcHVibGljIElUeXBlQmluZGluZyByZXNvbHZlQmluZGluZygpIHsKIAkJLy8gZm9yd2FyZCByZXF1ZXN0IHRvIHRoZSB3cmFwcGVkIHR5cGUgZGVjbGFyYXRpb24KIAkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZCA9IGdldERlY2xhcmF0aW9uKCk7CkBAIC0zMzgsMTQgKzMzOSwxNCBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlTGl0ZXJhbC5qYXZhCmluZGV4IDA3YmY4MTYuLmQzN2UyNjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUxpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVMaXRlcmFsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMjUgKzIxLDI2IEBACiAgKiBUeXBlTGl0ZXJhbDoKICAqICAgICAoIFR5cGUgfCA8Yj52b2lkPC9iPiApIDxiPi48L2I+IDxiPmNsYXNzPC9iPgogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFR5cGVMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAkvKioKLQkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZUxpdGVyYWwuY2xhc3MsICJ0eXBlIiwgVHlwZS5jbGFzcywgTUFOREFUT1JZLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUeXBlTGl0ZXJhbC5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTUwLDE3ICs1MSwxNyBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFRoZSB0eXBlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgdHlwZS4KQEAgLTY4LDEyICs2OSwxMiBAQAogCXByaXZhdGUgVHlwZSB0eXBlID0gbnVsbDsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdHlwZSBsaXRlcmFsIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHR5cGUgbGl0ZXJhbCBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGhhcyBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVR5cGVMaXRlcmFsKEFTVCBhc3QpIHsKQEAgLTg2LDcgKzg3LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMDIsNyArMTAzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRDaGlsZFByb3BlcnR5KHByb3BlcnR5LCBnZXQsIGNoaWxkKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTExNSw3ICsxMTYsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUwKEFTVCB0YXJnZXQpIHsKIAkJVHlwZUxpdGVyYWwgcmVzdWx0ID0gbmV3IFR5cGVMaXRlcmFsKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFR5cGUoKFR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xMzgsMTIgKzEzOSwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdHlwZSBpbiB0aGlzIHR5cGUgbGl0ZXJhbCBleHByZXNzaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdHlwZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogCQlpZiAodGhpcy50eXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xNjAsMTQgKzE2MSwxNCBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgdHlwZSBpbiB0aGlzIHR5cGUgbGl0ZXJhbCBleHByZXNzaW9uIHRvIHRoZSBnaXZlbiB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGUgdGhlIG5ldyB0eXBlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgewogCQlpZiAodHlwZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0xODUsMTIgKzE4NiwxMiBAQAogCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy50eXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZVBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlUGFyYW1ldGVyLmphdmEKaW5kZXggYzM3ZDczNC4uOTczNmUxOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlUGFyYW1ldGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlUGFyYW1ldGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMzAgKzIwLDMxIEBACiAgKiBUeXBlUGFyYW1ldGVyOgogICogICAgVHlwZVZhcmlhYmxlIFsgPGI+ZXh0ZW5kczwvYj4gVHlwZSB7IDxiPiY8L2I+IFR5cGUgfSBdCiAgKiA8L3ByZT4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgVHlwZVBhcmFtZXRlciBleHRlbmRzIEFTVE5vZGUgewotCQorCiAJLyoqCi0JICogVGhlICJuYW1lIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFNpbXBsZU5hbWV9KS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIE5BTUVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZVBhcmFtZXRlci5jbGFzcywgIm5hbWUiLCBTaW1wbGVOYW1lLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInR5cGVCb3VuZHMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlQm91bmRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgVFlQRV9CT1VORFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX0JPVU5EU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoVHlwZVBhcmFtZXRlci5jbGFzcywgInR5cGVCb3VuZHMiLCBUeXBlLmNsYXNzLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlM7Ci0JCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChUeXBlUGFyYW1ldGVyLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtNTUsMzggKzU2LDM4IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKLQkvKiogCi0JICogVGhlIHR5cGUgdmFyaWFibGUgbm9kZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNmaWVkLCAKKworCS8qKgorCSAqIFRoZSB0eXBlIHZhcmlhYmxlIG5vZGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjZmllZCwKIAkgKiBidXQgbGVnYWwsIG5hbWUuCiAJICovCiAJcHJpdmF0ZSBTaW1wbGVOYW1lIHR5cGVWYXJpYWJsZU5hbWUgPSBudWxsOwotCQorCiAJLyoqCi0JICogVGhlIHR5cGUgYm91bmRzIChlbGVtZW50IHR5cGU6IDxjb2RlPlR5cGU8L2NvZGU+KS4gCisJICogVGhlIHR5cGUgYm91bmRzIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkuCiAJICogRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdHlwZUJvdW5kcyA9CiAJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KFRZUEVfQk9VTkRTX1BST1BFUlRZKTsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub2RlIGZvciBhIHBhcmFtZXRlcml6ZWQgdHlwZSBvd25lZCBieSB0aGUKLQkgKiBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIHR5cGUgdmFyaWFibGUgbmFtZSwgCisJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCB0eXBlIHZhcmlhYmxlIG5hbWUsCiAJICogYW5kIG5vIHR5cGUgYm91bmRzLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVR5cGVQYXJhbWV0ZXIoQVNUIGFzdCkgewpAQCAtMTAwLDcgKzEwMSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTE2LDcgKzExNyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMjcsNyArMTI4LDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDAsNyArMTQxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVR5cGVQYXJhbWV0ZXIgcmVzdWx0ID0gbmV3IFR5cGVQYXJhbWV0ZXIodGFyZ2V0KTsKLQkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKGdldFN0YXJ0UG9zaXRpb24oKSwgZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgKChBU1ROb2RlKSBnZXROYW1lKCkpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQudHlwZUJvdW5kcygpLmFkZEFsbCgKIAkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgdHlwZUJvdW5kcygpKSk7CkBAIC0xNjcsMTIgKzE2OCwxMiBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGlzIHR5cGUgcGFyYW1ldGVyLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSB2YXJpYWJsZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgewogCQlpZiAodGhpcy50eXBlVmFyaWFibGVOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0xODYsMzIgKzE4NywzMiBAQAogCQl9CiAJCXJldHVybiB0aGlzLnR5cGVWYXJpYWJsZU5hbWU7CiAJfQotCQorCiAJLyoqCiAJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoaXMgdHlwZSBwYXJhbWV0ZXIuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQogCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqCisJICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlCiAJICogICAgcmVzb2x2ZWQKLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIElUeXBlQmluZGluZyByZXNvbHZlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVUeXBlUGFyYW1ldGVyKHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdmFyaWFibGUgb2YgdGhpcyB0eXBlIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4KIAkgKiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhpcyB0eXBlIHBhcmFtZXRlciAKKwkgKgorCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhpcyB0eXBlIHBhcmFtZXRlcgogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KIAkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIHR5cGVOYW1lKSB7CiAJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yMjgsMTQgKzIyOSwxNCBAQAogCSAqIGNsYXNzIGluIHRoZSBsaXN0LCBhbmQgaXQgbXVzdCBiZSBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgb25lcyBtdXN0IGJlCiAJICogaW50ZXJmYWNlczsgdGhlIGxpc3Qgc2hvdWxkIG5vdCBjb250YWluIHByaW1pdGl2ZSB0eXBlcyAoYnV0IGFycmF5IHR5cGVzCiAJICogYW5kIHBhcmFtZXRlcml6ZWQgdHlwZXMgYXJlIGFsbG93ZWQpLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHR5cGUgYm91bmRzCi0JICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+VHlwZTwvY29kZT4pCi0JICovIAorCSAqICAgIChlbGVtZW50IHR5cGU6IHtAbGluayBUeXBlfSkKKwkgKi8KIAlwdWJsaWMgTGlzdCB0eXBlQm91bmRzKCkgewogCQlyZXR1cm4gdGhpcy50eXBlQm91bmRzOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjQzLDEyICsyNDQsMTIgQEAKIAkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJCW1lbVNpemUoKQogCQkJKyAodGhpcy50eXBlVmFyaWFibGVOYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpCiAJCQkrIHRoaXMudHlwZUJvdW5kcy5saXN0U2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9VbmlvblR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVW5pb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkN2I0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVW5pb25UeXBlLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVHlwZSBub2RlIGZvciBhbiB1bmlvbiB0eXBlIChhZGRlZCBpbiBKTFM0IEFQSSkuCisgKiA8cHJlPgorICogVW5pb25UeXBlOgorICogICAgVHlwZSA8Yj58PC9iPiBUeXBlIHsgPGI+fDwvYj4gVHlwZSB9CisgKiA8L3ByZT4KKyAqIDxwPgorICogVGhpcyBraW5kIG9mIG5vZGUgaXMgdXNlZCBpbnNpZGUgYSBjYXRjaCBjbGF1c2UncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCisgKiA8L3A+CisgKgorICogQHNpbmNlIDMuNy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGNsYXNzIFVuaW9uVHlwZSBleHRlbmRzIFR5cGUgeworCisJLyoqCisJICogVGhlICJ0eXBlcyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVHlwZX0pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIFRZUEVTX1BST1BFUlRZID0KKwkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihVbmlvblR5cGUuY2xhc3MsICJ0eXBlcyIsIFR5cGUuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKKwkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAorCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOworCisJc3RhdGljIHsKKwkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDIpOworCQljcmVhdGVQcm9wZXJ0eUxpc3QoVW5pb25UeXBlLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOworCQlhZGRQcm9wZXJ0eShUWVBFU19QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKKwkJUFJPUEVSVFlfREVTQ1JJUFRPUlMgPSByZWFwUHJvcGVydHlMaXN0KHByb3BlcnR5TGlzdCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCisJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KKwkgKgorCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCisJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cworCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CisJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgeworCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CisJfQorCisJLyoqCisJICogVGhlIGxpc3Qgb2YgdHlwZXMgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KS4gIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHR5cGVzID0gbmV3IEFTVE5vZGUuTm9kZUxpc3QoVFlQRVNfUFJPUEVSVFkpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG5vZGUgZm9yIGFuIHVuaW9uIHR5cGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCBpdCBoYXMgbm8gdHlwZXMuPHA+CisJICogCisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJVW5pb25UeXBlKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwkJdW5zdXBwb3J0ZWRJbjJfMygpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWZpbmFsIExpc3QgaW50ZXJuYWxTdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoaW50IGFwaUxldmVsKSB7CisJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzKGFwaUxldmVsKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlmaW5hbCBMaXN0IGludGVybmFsR2V0Q2hpbGRMaXN0UHJvcGVydHkoQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CisJCWlmIChwcm9wZXJ0eSA9PSBUWVBFU19QUk9QRVJUWSkgeworCQkJcmV0dXJuIHR5cGVzKCk7CisJCX0KKwkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgorCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJZmluYWwgaW50IGdldE5vZGVUeXBlMCgpIHsKKwkJcmV0dXJuIFVOSU9OX1RZUEU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgeworCQlVbmlvblR5cGUgcmVzdWx0ID0gbmV3IFVuaW9uVHlwZSh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CisJCXJlc3VsdC50eXBlcygpLmFkZEFsbCgKKwkJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHR5cGVzKCkpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlmaW5hbCBib29sZWFuIHN1YnRyZWVNYXRjaDAoQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdGhpcy50eXBlcyk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiB0eXBlcyBpbiB0aGlzIHVuaW9uIHR5cGUuCisJICogQWRkaW5nIGFuZCByZW1vdmluZyBub2RlcyBmcm9tIHRoaXMgbGlzdCBhZmZlY3RzIHRoaXMgbm9kZQorCSAqIGR5bmFtaWNhbGx5LiBBbGwgbm9kZXMgaW4gdGhpcyBsaXN0IG11c3QgYmUKKwkgKiA8Y29kZT5UeXBlPC9jb2RlPnM7IGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIKKwkgKiB0eXBlIG9mIG5vZGUgd2lsbCB0cmlnZ2VyIGFuIGV4Y2VwdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB0eXBlcyBpbiB0aGlzIHVuaW9uIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIFR5cGV9KQorCSAqLworCXB1YmxpYyBMaXN0IHR5cGVzKCkgeworCQlyZXR1cm4gdGhpcy50eXBlczsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKQorCQkJKyB0aGlzLnR5cGVzLmxpc3RTaXplKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZUJpbmRpbmcuamF2YQppbmRleCAwMjNmYjQ2Li41MmMzMzhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTUgKzEyLDIyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNb2RpZmllckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlJlZmVyZW5jZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Mb2NhbFZhcmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCiAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB2YXJpYWJsZSBiaW5kaW5ncy4KQEAgLTM2LDYgKzQzLDcgQEAKIAlwcml2YXRlIFN0cmluZyBuYW1lOwogCXByaXZhdGUgQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyOwogCXByaXZhdGUgSVR5cGVCaW5kaW5nIHR5cGU7CisJcHJpdmF0ZSBJQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9uczsKIAogCVZhcmlhYmxlQmluZGluZyhCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcpIHsKIAkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwpAQCAtNDMsMTkgKzUxLDMxIEBACiAJfQogCiAJcHVibGljIElBbm5vdGF0aW9uQmluZGluZ1tdIGdldEFubm90YXRpb25zKCkgewotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nW10gaW50ZXJuYWxBbm5vdGF0aW9ucyA9IHRoaXMuYmluZGluZy5nZXRBbm5vdGF0aW9ucygpOwotCQkvLyB0aGUgdmFyaWFibGUgaXMgbm90IGFuIGVudW0gY29uc3RhbnQgbm9yIGEgZmllbGQgbm9yIGFuIGFyZ3VtZW50LgotCQlpbnQgbGVuZ3RoID0gaW50ZXJuYWxBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGludGVybmFsQW5ub3RhdGlvbnMubGVuZ3RoOwotCQlJQW5ub3RhdGlvbkJpbmRpbmdbXSBkb21JbnN0YW5jZXMgPQotCQkJbGVuZ3RoID09IDAgPyBBbm5vdGF0aW9uQmluZGluZy5Ob0Fubm90YXRpb25zIDogbmV3IEFubm90YXRpb25CaW5kaW5nW2xlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uSW5zdGFuY2UgPSB0aGlzLnJlc29sdmVyLmdldEFubm90YXRpb25JbnN0YW5jZShpbnRlcm5hbEFubm90YXRpb25zW2ldKTsKLQkJCWlmIChhbm5vdGF0aW9uSW5zdGFuY2UgPT0gbnVsbCkgey8vIG5vdCByZXNvbHZpbmcgYmluZGluZwotCQkJCXJldHVybiBBbm5vdGF0aW9uQmluZGluZy5Ob0Fubm90YXRpb25zOwotCQkJfQotCQkJZG9tSW5zdGFuY2VzW2ldID0gYW5ub3RhdGlvbkluc3RhbmNlOworCQlpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uczsKIAkJfQotCQlyZXR1cm4gZG9tSW5zdGFuY2VzOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFubm90YXRpb25CaW5kaW5nW10gaW50ZXJuYWxBbm5vdGF0aW9ucyA9IHRoaXMuYmluZGluZy5nZXRBbm5vdGF0aW9ucygpOworCQlpbnQgbGVuZ3RoID0gaW50ZXJuYWxBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGludGVybmFsQW5ub3RhdGlvbnMubGVuZ3RoOworCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCUlBbm5vdGF0aW9uQmluZGluZ1tdIHRlbXBBbm5vdGF0aW9ucyA9IG5ldyBJQW5ub3RhdGlvbkJpbmRpbmdbbGVuZ3RoXTsKKwkJCWludCBjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQgPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQW5ub3RhdGlvbkJpbmRpbmcgaW50ZXJuYWxBbm5vdGF0aW9uID0gaW50ZXJuYWxBbm5vdGF0aW9uc1tpXTsKKwkJCQlmaW5hbCBJQW5ub3RhdGlvbkJpbmRpbmcgYW5ub3RhdGlvbkluc3RhbmNlID0gdGhpcy5yZXNvbHZlci5nZXRBbm5vdGF0aW9uSW5zdGFuY2UoaW50ZXJuYWxBbm5vdGF0aW9uKTsKKwkJCQlpZiAoYW5ub3RhdGlvbkluc3RhbmNlID09IG51bGwpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXRlbXBBbm5vdGF0aW9uc1tjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQrK10gPSBhbm5vdGF0aW9uSW5zdGFuY2U7CisJCQl9CisJCQlpZiAoY29udmVydGVkQW5ub3RhdGlvbkNvdW50ICE9IGxlbmd0aCkgeworCQkJCWlmIChjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnQgPT0gMCkgeworCQkJCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucyA9IEFubm90YXRpb25CaW5kaW5nLk5vQW5ub3RhdGlvbnM7CisJCQkJfQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcEFubm90YXRpb25zLCAwLCAodGVtcEFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uQmluZGluZ1tjb252ZXJ0ZWRBbm5vdGF0aW9uQ291bnRdKSwgMCwgY29udmVydGVkQW5ub3RhdGlvbkNvdW50KTsKKwkJCX0KKwkJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gdGVtcEFubm90YXRpb25zOworCQl9CisJCXJldHVybiB0aGlzLmFubm90YXRpb25zID0gQW5ub3RhdGlvbkJpbmRpbmcuTm9Bbm5vdGF0aW9uczsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0xMTAsNyArMTMwLDIyIEBACiAJCWlmICghaXNGaWVsZCgpKSB7CiAJCQlBU1ROb2RlIG5vZGUgPSB0aGlzLnJlc29sdmVyLmZpbmREZWNsYXJpbmdOb2RlKHRoaXMpOwogCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpZiAobm9kZSA9PSBudWxsKSBicmVhazsKKwkJCQlpZiAobm9kZSA9PSBudWxsKSB7CisJCQkJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZUJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCQkJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSA9IGxvY2FsVmFyaWFibGVCaW5kaW5nLmRlY2xhcmluZ1Njb3BlOworCQkJCQkJaWYgKGJsb2NrU2NvcGUgIT0gbnVsbCkgeworCQkJCQkJCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCA9IGJsb2NrU2NvcGUucmVmZXJlbmNlQ29udGV4dCgpOworCQkJCQkJCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKKwkJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQkJfQorCQkJCQkJCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgeworCQkJCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlci5nZXRNZXRob2RCaW5kaW5nKCgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCkuYmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KIAkJCQlzd2l0Y2gobm9kZS5nZXROb2RlVHlwZSgpKSB7CiAJCQkJCWNhc2UgQVNUTm9kZS5JTklUSUFMSVpFUiA6CiAJCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTE1OSw3ICsxOTQsNyBAQAogCQlpZiAoaXNGaWVsZCgpKSB7CiAJCQlyZXR1cm4gKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZykuZ2V0QWNjZXNzRmxhZ3MoKSAmIFZBTElEX01PRElGSUVSUzsKIAkJfQotCQlpZiAoYmluZGluZy5pc0ZpbmFsKCkpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0ZpbmFsKCkpIHsKIAkJCXJldHVybiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMOwogCQl9CiAJCXJldHVybiBNb2RpZmllci5OT05FOwpAQCAtMTg2LDQwICsyMjEsOTYgQEAKIAl9CiAKIAlwcml2YXRlIEphdmFFbGVtZW50IGdldFVucmVzb2x2ZWRKYXZhRWxlbWVudCgpIHsKKwkJaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CiAJCWlmIChpc0ZpZWxkKCkpIHsKLQkJCS8vIGZpZWxkCi0JCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOwotCQkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gYXJyYXlsZW5ndGgKLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSAoSVR5cGUpIGdldERlY2xhcmluZ0NsYXNzKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgZGVjbGFyaW5nVHlwZS5nZXRGaWVsZChnZXROYW1lKCkpOworCQkJaWYgKHRoaXMucmVzb2x2ZXIgaW5zdGFuY2VvZiBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSB7CisJCQkJRGVmYXVsdEJpbmRpbmdSZXNvbHZlciBkZWZhdWx0QmluZGluZ1Jlc29sdmVyID0gKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMucmVzb2x2ZXI7CisJCQkJaWYgKCFkZWZhdWx0QmluZGluZ1Jlc29sdmVyLmZyb21KYXZhUHJvamVjdCkgcmV0dXJuIG51bGw7CisJCQkJcmV0dXJuIFV0aWwuZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KAorCQkJCQkJKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nLAorCQkJCQkJZGVmYXVsdEJpbmRpbmdSZXNvbHZlci53b3JraW5nQ29weU93bmVyLAorCQkJCQkJZGVmYXVsdEJpbmRpbmdSZXNvbHZlci5nZXRCaW5kaW5nc1RvTm9kZXNNYXAoKSk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQkvLyBsb2NhbCB2YXJpYWJsZQotCQlJTWV0aG9kQmluZGluZyBkZWNsYXJpbmdNZXRob2QgPSBnZXREZWNsYXJpbmdNZXRob2QoKTsKLQkJaWYgKGRlY2xhcmluZ01ldGhvZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJSmF2YUVsZW1lbnQgbWV0aG9kID0gKEphdmFFbGVtZW50KSBkZWNsYXJpbmdNZXRob2QuZ2V0SmF2YUVsZW1lbnQoKTsKIAkJaWYgKCEodGhpcy5yZXNvbHZlciBpbnN0YW5jZW9mIERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpKSByZXR1cm4gbnVsbDsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbiBsb2NhbFZhciA9IChWYXJpYWJsZURlY2xhcmF0aW9uKSAoKERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIpIHRoaXMucmVzb2x2ZXIpLmJpbmRpbmdzVG9Bc3ROb2Rlcy5nZXQodGhpcyk7CisJCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIgZGVmYXVsdEJpbmRpbmdSZXNvbHZlciA9IChEZWZhdWx0QmluZGluZ1Jlc29sdmVyKSB0aGlzLnJlc29sdmVyOworCQlpZiAoIWRlZmF1bHRCaW5kaW5nUmVzb2x2ZXIuZnJvbUphdmFQcm9qZWN0KSByZXR1cm4gbnVsbDsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbiBsb2NhbFZhciA9IChWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWZhdWx0QmluZGluZ1Jlc29sdmVyLmJpbmRpbmdzVG9Bc3ROb2Rlcy5nZXQodGhpcyk7CiAJCWlmIChsb2NhbFZhciA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJaW50IG5hbWVTdGFydDsKIAkJaW50IG5hbWVMZW5ndGg7CiAJCWludCBzb3VyY2VTdGFydDsKIAkJaW50IHNvdXJjZUxlbmd0aDsKKwkJaW50IG1vZGlmaWVycyA9IDA7CiAJCWlmIChsb2NhbFZhciBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKIAkJCXNvdXJjZVN0YXJ0ID0gbG9jYWxWYXIuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJc291cmNlTGVuZ3RoID0gbG9jYWxWYXIuZ2V0TGVuZ3RoKCk7Ci0JCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGxvY2FsVmFyKS5nZXROYW1lKCk7CisJCQlmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbG9jYWxWYXI7CisJCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKTsKIAkJCW5hbWVTdGFydCA9IHNpbXBsZU5hbWUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJbmFtZUxlbmd0aCA9IHNpbXBsZU5hbWUuZ2V0TGVuZ3RoKCk7CisJCQltb2RpZmllcnMgPSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpOwogCQl9IGVsc2UgewogCQkJbmFtZVN0YXJ0ID0gIGxvY2FsVmFyLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCW5hbWVMZW5ndGggPSBsb2NhbFZhci5nZXRMZW5ndGgoKTsKIAkJCUFTVE5vZGUgbm9kZSA9IGxvY2FsVmFyLmdldFBhcmVudCgpOwogCQkJc291cmNlU3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCXNvdXJjZUxlbmd0aCA9IG5vZGUuZ2V0TGVuZ3RoKCk7CisJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBsb2NhbFZhcjsKKwkJCWZpbmFsIEFTVE5vZGUgcGFyZW50ID0gZnJhZ21lbnQuZ2V0UGFyZW50KCk7CisJCQlzd2l0Y2ggKHBhcmVudC5nZXROb2RlVHlwZSgpKSB7CisJCQkJY2FzZSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04gOgorCQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSBwYXJlbnQ7CisJCQkJCW1vZGlmaWVycyA9IGV4cHJlc3Npb24uZ2V0TW9kaWZpZXJzKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQgOgorCQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBwYXJlbnQ7CisJCQkJCW1vZGlmaWVycyA9IHN0YXRlbWVudC5nZXRNb2RpZmllcnMoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBU1ROb2RlLkZJRUxEX0RFQ0xBUkFUSU9OIDoKKwkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIHBhcmVudDsKKwkJCQkJbW9kaWZpZXJzID0gZmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KKwkJaW50IHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0K3NvdXJjZUxlbmd0aC0xOwogCQljaGFyW10gdHlwZVNpZyA9IHRoaXMuYmluZGluZy50eXBlLmdlbmVyaWNUeXBlU2lnbmF0dXJlKCk7Ci0JCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZShtZXRob2QsIGxvY2FsVmFyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIHNvdXJjZVN0YXJ0LCBzb3VyY2VTdGFydCtzb3VyY2VMZW5ndGgtMSwgbmFtZVN0YXJ0LCBuYW1lU3RhcnQrbmFtZUxlbmd0aC0xLCBuZXcgU3RyaW5nKHR5cGVTaWcpKTsKKwkJSmF2YUVsZW1lbnQgcGFyZW50ID0gbnVsbDsKKwkJSU1ldGhvZEJpbmRpbmcgZGVjbGFyaW5nTWV0aG9kID0gZ2V0RGVjbGFyaW5nTWV0aG9kKCk7CisJCWZpbmFsIExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGVCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCWlmIChkZWNsYXJpbmdNZXRob2QgPT0gbnVsbCkgeworCQkJUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0ID0gbG9jYWxWYXJpYWJsZUJpbmRpbmcuZGVjbGFyaW5nU2NvcGUucmVmZXJlbmNlQ29udGV4dCgpOworCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24peworCQkJCS8vIExvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluc2lkZSBhbiBpbml0aWFsaXplcgorCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0OworCQkJCUphdmFFbGVtZW50IHR5cGVIYW5kbGUgPSBudWxsOworCQkJCXR5cGVIYW5kbGUgPSBVdGlsLmdldFVucmVzb2x2ZWRKYXZhRWxlbWVudCgKKwkJCQkJdHlwZURlY2xhcmF0aW9uLmJpbmRpbmcsCisJCQkJCWRlZmF1bHRCaW5kaW5nUmVzb2x2ZXIud29ya2luZ0NvcHlPd25lciwKKwkJCQkJZGVmYXVsdEJpbmRpbmdSZXNvbHZlci5nZXRCaW5kaW5nc1RvTm9kZXNNYXAoKSk7CisJCQkJcGFyZW50ID0gVXRpbC5nZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgdHlwZUhhbmRsZSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGVsc2UgeworCQkJcGFyZW50ID0gKEphdmFFbGVtZW50KSBkZWNsYXJpbmdNZXRob2QuZ2V0SmF2YUVsZW1lbnQoKTsKKwkJfQorCQlpZiAocGFyZW50ID09IG51bGwpIHJldHVybiBudWxsOworCQlyZXR1cm4gbmV3IExvY2FsVmFyaWFibGUoCisJCQkJcGFyZW50LAorCQkJCWxvY2FsVmFyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksCisJCQkJc291cmNlU3RhcnQsCisJCQkJc291cmNlRW5kLAorCQkJCW5hbWVTdGFydCwKKwkJCQluYW1lU3RhcnQrbmFtZUxlbmd0aC0xLAorCQkJCW5ldyBTdHJpbmcodHlwZVNpZyksCisJCQkJbG9jYWxWYXJpYWJsZUJpbmRpbmcuZGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsCisJCQkJbW9kaWZpZXJzLAorCQkJCShsb2NhbFZhcmlhYmxlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Jc0FyZ3VtZW50KSAhPSAwKTsKIAl9CiAKIAkvKgpAQCAtMjI3LDcgKzMxOCw3IEBACiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBJVmFyaWFibGVCaW5kaW5nIGdldFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7Ci0JCWlmICh0aGlzLmlzRmllbGQoKSkgeworCQlpZiAoaXNGaWVsZCgpKSB7CiAJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZXIuZ2V0VmFyaWFibGVCaW5kaW5nKGZpZWxkQmluZGluZy5vcmlnaW5hbCgpKTsKIAkJfQpAQCAtMjkwLDcgKzM4MSw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoQmluZGluZ0NvbXBhcmF0b3IuaXNFcXVhbCh0aGlzLmJpbmRpbmcsIG90aGVyQmluZGluZykpIHsKLQkJCQlJTWV0aG9kQmluZGluZyBkZWNsYXJpbmdNZXRob2QgPSB0aGlzLmdldERlY2xhcmluZ01ldGhvZCgpOworCQkJCUlNZXRob2RCaW5kaW5nIGRlY2xhcmluZ01ldGhvZCA9IGdldERlY2xhcmluZ01ldGhvZCgpOwogCQkJCUlNZXRob2RCaW5kaW5nIG90aGVyRGVjbGFyaW5nTWV0aG9kID0gKChWYXJpYWJsZUJpbmRpbmcpIG90aGVyKS5nZXREZWNsYXJpbmdNZXRob2QoKTsKIAkJCQlpZiAoZGVjbGFyaW5nTWV0aG9kID09IG51bGwpIHsKIAkJCQkJaWYgKG90aGVyRGVjbGFyaW5nTWV0aG9kICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKaW5kZXggYTVkNThmMi4uZmMzODhlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNyArMTIsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIC8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGUgdHlwZXMgdGhhdCBkZWNsYXJlIGEgc2luZ2xlIGxvY2FsIAorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGUgdHlwZXMgdGhhdCBkZWNsYXJlIGEgc2luZ2xlIGxvY2FsCiAgKiB2YXJpYWJsZS4KICAqIDxwPgogICogPHByZT4KQEAgLTIxLDE3ICsyMSwxNyBAQAogICogICAgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50CiAgKiA8L3ByZT4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgogICogQHNlZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlIHsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgImV4dHJhRGltZW5zaW9ucyIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUuCi0JICogCisJICogb2YgdGhpcyBub2RlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTM5LDggKzM5LDggQEAKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgImV4dHJhRGltZW5zaW9ucyIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUuCi0JICogCisJICogb2YgdGhpcyBub2RlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTUwLDggKzUwLDggQEAKIAogCS8qKgogCSAqIFJldHVybnMgc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgImluaXRpYWxpemVyIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZS4KLQkgKiAKKwkgKiBvZiB0aGlzIG5vZGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtNTksOCArNTksOCBAQAogCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAiaW5pdGlhbGl6ZXIiIHByb3BlcnR5Ci0JICogb2YgdGhpcyBub2RlLgotCSAqIAorCSAqIG9mIHRoaXMgbm9kZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKIAkgKiBAc2luY2UgMy4xCiAJICovCkBAIC03MCw4ICs3MCw4IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlICJuYW1lIiBwcm9wZXJ0eQotCSAqIG9mIHRoaXMgbm9kZS4KLQkgKiAKKwkgKiBvZiB0aGlzIG5vZGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtNzksOCArNzksOCBAQAogCiAJLyoqCiAJICogUmV0dXJucyBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSAibmFtZSIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIG5vZGUuCi0JICogCisJICogb2YgdGhpcyBub2RlIChjaGlsZCB0eXBlOiB7QGxpbmsgU2ltcGxlTmFtZX0pLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTkzLDgxICs5Myw4MSBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVZhcmlhYmxlRGVjbGFyYXRpb24oQVNUIGFzdCkgewogCQlzdXBlcihhc3QpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lIG5vZGUKLQkgKi8gCisJICovCiAJcHVibGljIGFic3RyYWN0IFNpbXBsZU5hbWUgZ2V0TmFtZSgpOwotCQkKKwogCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbgogCSAqIHRvIHRoZSBnaXZlbiBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmV3IHZhcmlhYmxlIG5hbWUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSB2YXJpYWJsZU5hbWUpOwogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgb3ZlciBhbmQgYWJvdmUgdGhlIAorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zIG92ZXIgYW5kIGFib3ZlIHRoZQogCSAqIGV4cGxpY2l0bHktc3BlY2lmaWVkIHR5cGUuCiAJICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCB4W11bXTwvY29kZT4gaGFzIGEgdHlwZSBvZiAKLQkgKiA8Y29kZT5pbnQ8L2NvZGU+IGFuZCB0d28gZXh0cmEgYXJyYXkgZGltZW5zaW9uczsgCisJICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCB4W11bXTwvY29kZT4gaGFzIGEgdHlwZSBvZgorCSAqIDxjb2RlPmludDwvY29kZT4gYW5kIHR3byBleHRyYSBhcnJheSBkaW1lbnNpb25zOwogCSAqIDxjb2RlPmludFtdW10geDwvY29kZT4gaGFzIGEgdHlwZSBvZiA8Y29kZT5pbnRbXVtdPC9jb2RlPgogCSAqIGFuZCB6ZXJvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMuIFRoZSB0d28gY29uc3RydWN0cyBoYXZlIGRpZmZlcmVudAogCSAqIEFTVHMsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSByZWFsbHkgc3ludGFjdGljIHZhcmlhbnRzIG9mIHRoZSBzYW1lCiAJICogdmFyaWFibGUgZGVjbGFyYXRpb24uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMKIAkgKiBAc2luY2UgMi4xCi0JICovIAorCSAqLwogCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCk7CiAKIAkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUgCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgb3ZlciBhbmQgYWJvdmUgdGhlCiAJICogZXhwbGljaXRseS1zcGVjaWZpZWQgdHlwZS4KIAkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgPGNvZGU+aW50IHhbXVtdPC9jb2RlPiBoYXMgYSB0eXBlIG9mIAotCSAqIDxjb2RlPmludDwvY29kZT4gYW5kIHR3byBleHRyYSBhcnJheSBkaW1lbnNpb25zOyAKKwkgKiBGb3IgZXhhbXBsZSwgPGNvZGU+aW50IHhbXVtdPC9jb2RlPiBoYXMgYSB0eXBlIG9mCisJICogPGNvZGU+aW50PC9jb2RlPiBhbmQgdHdvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7CiAJICogPGNvZGU+aW50W11bXSB4PC9jb2RlPiBoYXMgYSB0eXBlIG9mIDxjb2RlPmludFtdW108L2NvZGU+CiAJICogYW5kIHplcm8gZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4gVGhlIHR3byBjb25zdHJ1Y3RzIGhhdmUgZGlmZmVyZW50CiAJICogQVNUcywgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIHJlYWxseSBzeW50YWN0aWMgdmFyaWFudHMgb2YgdGhlIHNhbWUKIAkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gZGltZW5zaW9ucyB0aGUgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMKIAkgKiAgICBuZWdhdGl2ZQogCSAqIEBzaW5jZSAyLjEKLQkgKi8gCisJICovCiAJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXh0cmFEaW1lbnNpb25zKGludCBkaW1lbnNpb25zKTsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIGluaXRpYWxpemVyIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24sIG9yIAorCSAqIFJldHVybnMgdGhlIGluaXRpYWxpemVyIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24sIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqCisJICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIHRoZXJlIGlzIG5vbmUKLQkgKi8gCisJICovCiAJcHVibGljIGFic3RyYWN0IEV4cHJlc3Npb24gZ2V0SW5pdGlhbGl6ZXIoKTsKLQkKKwogCS8qKgogCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBpbml0aWFsaXplciBvZiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogICAgaWYgdGhlcmUgaXMgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgpAQCAtMTc2LDcgKzE3Niw3IEBACiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbml0aWFsaXplcihFeHByZXNzaW9uIGluaXRpYWxpemVyKTsKIAogCS8qKgpAQCAtMTg2LDEwICsxODYsMTAgQEAKIAkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCiAJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUKIAkgKiAgICByZXNvbHZlZAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyByZXNvbHZlQmluZGluZygpIHsKIAkJcmV0dXJuIHRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVWYXJpYWJsZSh0aGlzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggN2IxMDIzNC4uN2MxM2Q0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSw2NCArMjksNjUgQEAKICAqIDxwcmU+CiAgKiBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjoKICAqICAgIHsgTW9kaWZpZXIgfSBUeXBlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAotICogICAgICAgICB7IDxiPiw8L2I+IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB9IAorICogICAgICAgICB7IDxiPiw8L2I+IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB9CiAgKiA8L3ByZT4KICAqIEZvciBKTFMzLCB0aGUgbW9kaWZpZXIgZmxhZ3Mgd2VyZSByZXBsYWNlZCBieQogICogYSBsaXN0IG9mIG1vZGlmaWVyIG5vZGVzIChpbnRlcm1peGVkIHdpdGggYW5ub3RhdGlvbnMpOgogICogPHByZT4KICAqIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOgogICogICAgeyBFeHRlbmRlZE1vZGlmaWVyIH0gVHlwZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKLSAqICAgICAgICAgeyA8Yj4sPC9iPiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgfSAKKyAqICAgICAgICAgeyA8Yj4sPC9iPiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgfQogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKIAkvKioKLQkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoSkxTMiBBUEkgb25seSkuCisJICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBJbnRlZ2VyfSkgKEpMUzIgQVBJIG9ubHkpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlNfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmNsYXNzLCAibW9kaWZpZXJzIiwgaW50LmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5jbGFzcywgIm1vZGlmaWVycyIsIElFeHRlbmRlZE1vZGlmaWVyLmNsYXNzLCBDWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCi0JICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlLgorCSAqIFRoZSAidHlwZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIFR5cGV9KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBUWVBFX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmNsYXNzLCAidHlwZSIsIFR5cGUuY2xhc3MsIE1BTkRBVE9SWSwgTk9fQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSAiZnJhZ21lbnRzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlKS4KKwkgKiBUaGUgImZyYWdtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50fSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEZSQUdNRU5UU19QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIEZSQUdNRU5UU19QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uY2xhc3MsICJmcmFnbWVudHMiLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwpAQCAtOTQsNyArOTUsNyBAQAogCQlhZGRQcm9wZXJ0eShUWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwogCQlhZGRQcm9wZXJ0eShGUkFHTUVOVFNfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCVBST1BFUlRZX0RFU0NSSVBUT1JTXzJfMCA9IHJlYXBQcm9wZXJ0eUxpc3QocHJvcGVydHlMaXN0KTsKLQkJCisKIAkJcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmNsYXNzLCBwcm9wZXJ0eUxpc3QpOwogCQlhZGRQcm9wZXJ0eShNT0RJRklFUlMyX1BST1BFUlRZLCBwcm9wZXJ0eUxpc3QpOwpAQCAtMTA2LDExICsxMDcsMTEgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMjEsMjEgKzEyMiwyMSBAQAogCQkJcmV0dXJuIFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKIAkJfQogCX0KLQkJCQorCiAJLyoqCi0JICogVGhlIGV4dGVuZGVkIG1vZGlmaWVycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5JRXh0ZW5kZWRNb2RpZmllcjwvY29kZT4pLiAKKwkgKiBUaGUgZXh0ZW5kZWQgbW9kaWZpZXJzIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pLgogCSAqIE51bGwgaW4gSkxTMi4gQWRkZWQgaW4gSkxTMzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdAogCSAqIChzZWUgY29uc3RydWN0b3IpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgbW9kaWZpZXJzID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFRoZSBtb2RpZmllciBmbGFnczsgYml0LXdpc2Ugb3Igb2YgTW9kaWZpZXIgZmxhZ3MuCiAJICogRGVmYXVsdHMgdG8gbm9uZS4gTm90IHVzZWQgaW4gMy4wLgogCSAqLwogCXByaXZhdGUgaW50IG1vZGlmaWVyRmxhZ3MgPSBNb2RpZmllci5OT05FOwotCQkKKwogCS8qKgogCSAqIFRoZSBiYXNlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgdHlwZS4KQEAgLTE0MywxMCArMTQ0LDEwIEBACiAJcHJpdmF0ZSBUeXBlIGJhc2VUeXBlID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KS4gIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIChlbGVtZW50IHR5cGU6CisJICoge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudH0pLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KLQlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50cyA9IAorCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRlJBR01FTlRTX1BST1BFUlRZKTsKIAogCS8qKgpAQCAtMTU3LDcgKzE1OCw3IEBACiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oQVNUIGFzdCkgewpAQCAtMTczLDcgKzE3NCw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTg5LDcgKzE5MCw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0SW50UHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA1LDcgKzIwNiw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMTksNyArMjIwLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMzEsOSArMjMyLDkgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHJlc3VsdCA9IAorCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiByZXN1bHQgPQogCQkJbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJaWYgKHRoaXMuYXN0LmFwaUxldmVsID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CiAJCQlyZXN1bHQuc2V0TW9kaWZpZXJzKGdldE1vZGlmaWVycygpKTsKIAkJfQpAQCAtMjQ2LDcgKzI0Nyw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTI2NiwxMSArMjY3LDExIEBACiAJCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdGhpcy5tb2RpZmllcnMpOwogCQkJfQogCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VHlwZSgpKTsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdGhpcy52YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzKTsKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWVycyBhbmQgYW5ub3RhdGlvbnMKIAkgKiBvZiB0aGlzIGRlY2xhcmF0aW9uIChhZGRlZCBpbiBKTFMzIEFQSSkuCkBAIC0yNzgsMTMgKzI3OSwxMyBAQAogCSAqIE5vdGUgdGhhdCB0aGUgZmluYWwgbW9kaWZpZXIgaXMgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBmb3IgbG9jYWwKIAkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIG1vZGlmaWVycyBhbmQgYW5ub3RhdGlvbnMKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5JRXh0ZW5kZWRNb2RpZmllcjwvY29kZT4pCisJICogICAgKGVsZW1lbnQgdHlwZToge0BsaW5rIElFeHRlbmRlZE1vZGlmaWVyfSkKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhIEpMUzIgQVNUCiAJICogQHNpbmNlIDMuMQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgTGlzdCBtb2RpZmllcnMoKSB7CiAJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4ganVzdCBjYWxsaW5nIHVuc3VwcG9ydGVkSW4yKCkgdG8gY2hlY2sKIAkJaWYgKHRoaXMubW9kaWZpZXJzID09IG51bGwpIHsKQEAgLTI5MiwxNyArMjkzLDE3IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubW9kaWZpZXJzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgogCSAqIDxwPgogCSAqIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdAogCSAqIGNvbXB1dGVzIHRoZXNlIGZsYWdzIGZyb20gPGNvZGU+bW9kaWZpZXJzKCk8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKIAkgKiBAc2VlIE1vZGlmaWVyCi0JICovIAorCSAqLwogCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogCQkvLyBtb3JlIGVmZmljaWVudCB0aGFuIGNoZWNraW5nIGdldEFTVCgpLkFQSV9MRVZFTAogCQlpZiAodGhpcy5tb2RpZmllcnMgPT0gbnVsbCkgewpAQCAtMzI5LDE4ICszMzAsMTggQEAKIAkgKiBOb3RlIHRoYXQgdGhlIGZpbmFsIG1vZGlmaWVyIGlzIHRoZSBvbmx5IG1lYW5pbmdmdWwgbW9kaWZpZXIgZm9yIGxvY2FsCiAJICogdmFyaWFibGUgZGVjbGFyYXRpb25zLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIGdpdmVuIG1vZGlmaWVycyAoYml0LXdpc2Ugb3Igb2YgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cykKIAkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgaW4KIAkgKiBhbiBBU1QgbGF0ZXIgdGhhbiBKTFMyCiAJICogQHNlZSBNb2RpZmllcgotCSAqIEBkZXByZWNhdGVkIEluIHRoZSBKTFMzIEFQSSwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkgCisJICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieQogCSAqIHtAbGluayAgI21vZGlmaWVycygpfSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgYSA8Y29kZT5Nb2RpZmllcjwvY29kZT4gbm9kZXMuCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CiAJCWludGVybmFsU2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CiAJfQotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgc3lub255bSBmb3IgZGVwcmVjYXRlZCBtZXRob2QuIFVzZWQgdG8gYXZvaWQKIAkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KQEAgLTM1NiwxMyArMzU3LDEzIEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAJICogPHA+Ci0JICogTi5CLiBUaGUgaW5kaXZpZHVhbCBjaGlsZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgbWF5IHNwZWNpZnkgCi0JICogYWRkaXRpb25hbCBhcnJheSBkaW1lbnNpb25zLiBTbyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgYXJlIG5vdCAKKwkgKiBOLkIuIFRoZSBpbmRpdmlkdWFsIGNoaWxkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBtYXkgc3BlY2lmeQorCSAqIGFkZGl0aW9uYWwgYXJyYXkgZGltZW5zaW9ucy4gU28gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGFyZSBub3QKIAkgKiBuZWNlc3NhcmlseSBleGFjdGx5IHRoaXMgdHlwZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHRoaXMuYmFzZVR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTM4MCwxNCArMzgxLDE0IEBACiAJLyoqCiAJICogU2V0cyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gdG8gdGhlIGdpdmVuCiAJICogdHlwZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgYmFzZSB0eXBlCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgogCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CiAJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KIAkgKiA8L3VsPgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgewogCQlpZiAodHlwZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0zOTksMTUgKzQwMCwxNSBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgaW4gdGhpcyAKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGluIHRoaXMKIAkgKiBleHByZXNzaW9uLiBBZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzIGZyb20gdGhpcyBsaXN0IGFmZmVjdHMgdGhpcyBub2RlCi0JICogZHluYW1pY2FsbHkuIEFsbCBub2RlcyBpbiB0aGlzIGxpc3QgbXVzdCBiZSAKKwkgKiBkeW5hbWljYWxseS4gQWxsIG5vZGVzIGluIHRoaXMgbGlzdCBtdXN0IGJlCiAJICogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPnM7IGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIKIAkgKiB0eXBlIG9mIG5vZGUgd2lsbCB0cmlnZ2VyIGFuIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGluIHRoaXMgCi0JICogICAgZXhwcmVzc2lvbiAoZWxlbWVudCB0eXBlOiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KQotCSAqLyAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgaW4gdGhpcworCSAqICAgIGV4cHJlc3Npb24gKGVsZW1lbnQgdHlwZToge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudH0pCisJICovCiAJcHVibGljIExpc3QgZnJhZ21lbnRzKCkgewogCQlyZXR1cm4gdGhpcy52YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzOwogCX0KQEAgLTQxOSwxMiArNDIwLDEyIEBACiAJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNCAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLm1vZGlmaWVycyA9PSBudWxsID8gMCA6IHRoaXMubW9kaWZpZXJzLmxpc3RTaXplKCkpCiAJCQkrICh0aGlzLmJhc2VUeXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuamF2YQppbmRleCBjMzg4OGI5Li5lOWRlN2M4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIFZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IEFTVCBub2RlIHR5cGUsIHVzZWQgaW4gZmllbGQgZGVjbGFyYXRpb25zLCAKKyAqIFZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IEFTVCBub2RlIHR5cGUsIHVzZWQgaW4gZmllbGQgZGVjbGFyYXRpb25zLAogICogbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zLCBhbmQgPGNvZGU+Rm9yU3RhdGVtZW50PC9jb2RlPiBpbml0aWFsaXplcnMuCiAgKiBJdCBjb250cmFzdCB0byA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPiwgZnJhZ21lbnRzIGFyZQogICogbWlzc2luZyB0aGUgbW9kaWZpZXJzIGFuZCB0aGUgdHlwZTsgdGhlc2UgYXJlIGxvY2F0ZWQgaW4gdGhlIGZyYWdtZW50J3MKQEAgLTI1LDQwICsyNSw0MSBAQAogICogVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OgogICogICAgSWRlbnRpZmllciB7IDxiPls8L2I+PGI+XTwvYj4gfSBbIDxiPj08L2I+IEV4cHJlc3Npb24gXQogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBleHRlbmRzIFZhcmlhYmxlRGVjbGFyYXRpb24gewotCQkKKwogCS8qKgotCSAqIFRoZSAibmFtZSIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgIm5hbWUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBTaW1wbGVOYW1lfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgTkFNRV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MsICJuYW1lIiwgU2ltcGxlTmFtZS5jbGFzcywgTUFOREFUT1JZLCBOT19DWUNMRV9SSVNLKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVGhlICJleHRyYURpbWVuc2lvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJleHRyYURpbWVuc2lvbnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKHR5cGU6IHtAbGluayBJbnRlZ2VyfSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIEVYVFJBX0RJTUVOU0lPTlNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvciBFWFRSQV9ESU1FTlNJT05TX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MsICJleHRyYURpbWVuc2lvbnMiLCBpbnQuY2xhc3MsIE1BTkRBVE9SWSk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgotCSAqIFRoZSAiaW5pdGlhbGl6ZXIiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJpbml0aWFsaXplciIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoY2hpbGQgdHlwZToge0BsaW5rIEV4cHJlc3Npb259KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBJTklUSUFMSVpFUl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgSU5JVElBTElaRVJfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmNsYXNzLCAiaW5pdGlhbGl6ZXIiLCBFeHByZXNzaW9uLmNsYXNzLCBPUFRJT05BTCwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkJCisKIAlzdGF0aWMgewogCQlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoNCk7CiAJCWNyZWF0ZVByb3BlcnR5TGlzdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC03MSwxNyArNzIsMTcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCisKIAkvKioKIAkgKiBUaGUgdmFyaWFibGUgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKIAkgKiBsZWdhbCBKYXZhIGlkZW50aWZpZXIuCkBAIC05OSwxNSArMTAwLDE1IEBACiAJICogZGVmYXVsdHMgdG8gbm9uZS4KIAkgKi8KIAlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxJbml0aWFsaXplciA9IG51bGw7Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IG93bmVkIGJ5IHRoZSAKLQkgKiBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBoYXM6IGFuIHVuc3BlY2lmaWVkIAorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgb3duZWQgYnkgdGhlCisJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaGFzOiBhbiB1bnNwZWNpZmllZAogCSAqIChidXQgbGVnYWwpIHZhcmlhYmxlIG5hbWUsIG5vIGluaXRpYWxpemVyLCBhbmQgbm8gZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKIAkgKi8KIAlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoQVNUIGFzdCkgewpAQCAtMTQ0LDcgKzE0NSw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTYwLDcgKzE2MSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0SW50UHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTg0LDcgKzE4NSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xOTcsNyArMTk4LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCByZXN1bHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEV4dHJhRGltZW5zaW9ucyhnZXRFeHRyYURpbWVuc2lvbnMoKSk7CiAJCXJlc3VsdC5zZXRJbml0aWFsaXplcigKQEAgLTIyNSwxMCArMjI2LDEwIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KLQkgKi8gCisJICovCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKHRoaXMudmFyaWFibGVOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdCBtdXN0IGJlIHRocmVhZC1zYWZlIGZvciByZWFkZXJzCkBAIC0yNDIsMTAgKzI0MywxMCBAQAogCQl9CiAJCXJldHVybiB0aGlzLnZhcmlhYmxlTmFtZTsKIAl9Ci0JCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCi0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSB2YXJpYWJsZU5hbWUpIHsKIAkJaWYgKHZhcmlhYmxlTmFtZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yNjAsMTYgKzI2MSwxNiBAQAogCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zIHRoaXMgdmFyaWFibGUgaGFzIG92ZXIKIAkgKiBhbmQgYWJvdmUgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBlbmNsb3NpbmcgZGVjbGFyYXRpb24uCiAJICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGluIHRoZSBBU1QgZm9yIDxjb2RlPmludFtdIGksIGpbXSwga1tdW108L2NvZGU+IHRoZSAKKwkgKiBGb3IgZXhhbXBsZSwgaW4gdGhlIEFTVCBmb3IgPGNvZGU+aW50W10gaSwgaltdLCBrW11bXTwvY29kZT4gdGhlCiAJICogdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGZvciB0aGUgdmFyaWFibGVzIDxjb2RlPmk8L2NvZGU+LAogCSAqIDxjb2RlPmo8L2NvZGU+LCBhbmQgPGNvZGU+azwvY29kZT4sIGhhdmUgMCwgMSwgYW5kIDIgZXh0cmEgYXJyYXkKIAkgKiBkaW1lbnNpb25zLCByZXNwZWN0aXZlbHkuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgdGhpcyB2YXJpYWJsZSBoYXMgb3ZlcgogCSAqICAgICAgICAgYW5kIGFib3ZlIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uCiAJICogQHNpbmNlIDIuMAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgaW50IGdldEV4dHJhRGltZW5zaW9ucygpIHsKIAkJcmV0dXJuIHRoaXMuZXh0cmFBcnJheURpbWVuc2lvbnM7CiAJfQpAQCAtMjc4LDE1ICsyNzksMTUgQEAKIAkgKiBTZXRzIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyB0aGlzIHZhcmlhYmxlIGhhcyBvdmVyCiAJICogYW5kIGFib3ZlIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLgogCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpbiB0aGUgQVNUIGZvciA8Y29kZT5pbnRbXSBpLCBqW10sIGtbXVtdPC9jb2RlPiB0aGUgCisJICogRm9yIGV4YW1wbGUsIGluIHRoZSBBU1QgZm9yIDxjb2RlPmludFtdIGksIGpbXSwga1tdW108L2NvZGU+IHRoZQogCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBmb3IgdGhlIHZhcmlhYmxlcyA8Y29kZT5pPC9jb2RlPiwKIAkgKiA8Y29kZT5qPC9jb2RlPiwgYW5kIDxjb2RlPms8L2NvZGU+LCBoYXZlIDAsIDEsIGFuZCAyIGV4dHJhIGFycmF5CiAJICogZGltZW5zaW9ucywgcmVzcGVjdGl2ZWx5LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkaW1lbnNpb25zIHRoZSBnaXZlbiBkaW1lbnNpb25zCiAJICogQHNpbmNlIDIuMAotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRFeHRyYURpbWVuc2lvbnMoaW50IGRpbWVuc2lvbnMpIHsKIAkJaWYgKGRpbWVuc2lvbnMgPCAwKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yOTgsMTQgKzI5OSwxNCBAQAogCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEluaXRpYWxpemVyKCkgewogCQlyZXR1cm4gdGhpcy5vcHRpb25hbEluaXRpYWxpemVyOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAJCUFTVE5vZGUgb2xkQ2hpbGQgPSB0aGlzLm9wdGlvbmFsSW5pdGlhbGl6ZXI7CiAJCXByZVJlcGxhY2VDaGlsZChvbGRDaGlsZCwgaW5pdGlhbGl6ZXIsIElOSVRJQUxJWkVSX1BST1BFUlRZKTsKQEAgLTMyMCwxMiArMzIxLDEyIEBACiAJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKIAkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IHRyZWVTaXplKCkgewotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbWVtU2l6ZSgpCiAJCQkrICh0aGlzLnZhcmlhYmxlTmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKQogCQkJKyAodGhpcy5vcHRpb25hbEluaXRpYWxpemVyID09IG51bGwgPyAwIDogZ2V0SW5pdGlhbGl6ZXIoKS50cmVlU2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEKaW5kZXggZGM1YzJjOC4uOTljMTg1YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNzcgKzE5LDc4IEBACiAgKiBMb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KICAqIDxwPgogICogVGhpcyBraW5kIG9mIG5vZGUgY29sbGVjdHMgc2V2ZXJhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMKLSAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgc3RhdGVtZW50IAorICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYSBzdGF0ZW1lbnQKICAqICg8Y29kZT5TdGF0ZW1lbnQ8L2NvZGU+KSwgYWxsIHNoYXJpbmcgdGhlIHNhbWUgbW9kaWZpZXJzIGFuZCBiYXNlIHR5cGUuCiAgKiA8L3A+CiAgKiBGb3IgSkxTMjoKICAqIDxwcmU+CiAgKiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OgotICogICAgeyBNb2RpZmllciB9IFR5cGUgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IAorICogICAgeyBNb2RpZmllciB9IFR5cGUgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50CiAgKiAgICAgICAgeyA8Yj4sPC9iPiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgfSA8Yj47PC9iPgogICogPC9wcmU+CiAgKiBGb3IgSkxTMywgdGhlIG1vZGlmaWVyIGZsYWdzIHdlcmUgcmVwbGFjZWQgYnkKICAqIGEgbGlzdCBvZiBtb2RpZmllciBub2RlcyAoaW50ZXJtaXhlZCB3aXRoIGFubm90YXRpb25zKToKICAqIDxwcmU+CiAgKiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OgotICogICAgeyBFeHRlbmRlZE1vZGlmaWVyIH0gVHlwZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgCisgKiAgICB7IEV4dGVuZGVkTW9kaWZpZXIgfSBUeXBlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAogICogICAgICAgIHsgPGI+LDwvYj4gVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IH0gPGI+OzwvYj4KICAqIDwvcHJlPgogICogPHA+Ci0gKiBOb3RlOiBUaGlzIHR5cGUgb2Ygbm9kZSBpcyBhIGNvbnZlbmllbmNlIG9mIHNvcnRzLiAKKyAqIE5vdGU6IFRoaXMgdHlwZSBvZiBub2RlIGlzIGEgY29udmVuaWVuY2Ugb2Ygc29ydHMuCiAgKiBBbiBlcXVpdmFsZW50IHdheSB0byByZXByZXNlbnQgdGhlIHNhbWUgc3RhdGVtZW50IGlzIHRvIHVzZQogICogYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjwvY29kZT4KICAqIHdyYXBwZWQgaW4gYW4gPGNvZGU+RXhwcmVzc2lvblN0YXRlbWVudDwvY29kZT4uCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewotCQorCiAJLyoqCi0JICogVGhlICJtb2RpZmllcnMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKEpMUzIgQVBJIG9ubHkpLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgSW50ZWdlcn0pIChKTFMyIEFQSSBvbmx5KS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgTU9ESUZJRVJTX1BST1BFUlRZID0KIAkJbmV3IFNpbXBsZVByb3BlcnR5RGVzY3JpcHRvcihWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmNsYXNzLCAibW9kaWZpZXJzIiwgaW50LmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgIm1vZGlmaWVycyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSAoYWRkZWQgaW4gSkxTMyBBUEkpLgorCSAqIFRoZSAibW9kaWZpZXJzIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChlbGVtZW50IHR5cGU6IHtAbGluayBJRXh0ZW5kZWRNb2RpZmllcn0pIChhZGRlZCBpbiBKTFMzIEFQSSkuCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIE1PRElGSUVSUzJfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBNT0RJRklFUlMyX1BST1BFUlRZID0KIAkJbmV3IENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmNsYXNzLCAibW9kaWZpZXJzIiwgSUV4dGVuZGVkTW9kaWZpZXIuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKLQkgKiBUaGUgInR5cGUiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ0eXBlIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIFRZUEVfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5jbGFzcywgInR5cGUiLCBUeXBlLmNsYXNzLCBNQU5EQVRPUlksIE5PX0NZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImZyYWdtZW50cyIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZSkuCisJICogVGhlICJmcmFnbWVudHMiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGVsZW1lbnQgdHlwZToge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudH0pLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBGUkFHTUVOVFNfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBGUkFHTUVOVFNfUFJPUEVSVFkgPQogCQluZXcgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuY2xhc3MsICJmcmFnbWVudHMiLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wOwotCQorCiAJLyoqCi0JICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSksCiAJICogb3IgbnVsbCBpZiB1bmluaXRpYWxpemVkLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTXzNfMDsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCg0KTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC05Nyw3ICs5OCw3IEBACiAJCWFkZFByb3BlcnR5KFRZUEVfUFJPUEVSVFksIHByb3BlcnR5TGlzdCk7CiAJCWFkZFByb3BlcnR5KEZSQUdNRU5UU19QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKIAkJUFJPUEVSVFlfREVTQ1JJUFRPUlNfMl8wID0gcmVhcFByb3BlcnR5TGlzdChwcm9wZXJ0eUxpc3QpOwotCQkKKwogCQlwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDQpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5jbGFzcywgcHJvcGVydHlMaXN0KTsKIAkJYWRkUHJvcGVydHkoTU9ESUZJRVJTMl9QUk9QRVJUWSwgcHJvcGVydHlMaXN0KTsKQEAgLTEwOSwxMSArMTEwLDExIEBACiAJLyoqCiAJICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RydWN0dXJhbCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBub2RlIHR5cGUuCiAJICogQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhcGlMZXZlbCB0aGUgQVBJIGxldmVsOyBvbmUgb2YgdGhlCiAJICogPGNvZGU+QVNULkpMUyo8L2NvZGU+IGNvbnN0YW50cwogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQHJldHVybiBhIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pCiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtMTI0LDIxICsxMjUsMjEgQEAKIAkJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SU18zXzA7CiAJCX0KIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBleHRlbmRlZCBtb2RpZmllcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+SUV4dGVuZGVkTW9kaWZpZXI8L2NvZGU+KS4gCisJICogVGhlIGV4dGVuZGVkIG1vZGlmaWVycyAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KS4KIAkgKiBOdWxsIGluIEpMUzIuIEFkZGVkIGluIEpMUzM7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QKIAkgKiAoc2VlIGNvbnN0cnVjdG9yKS4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IG1vZGlmaWVycyA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBUaGUgbW9kaWZpZXIgZmxhZ3NzOyBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBmbGFncy4KIAkgKiBEZWZhdWx0cyB0byBub25lLiBOb3QgdXNlZCBpbiBKTFMzLgogCSAqLwogCXByaXZhdGUgaW50IG1vZGlmaWVyRmxhZ3MgPSBNb2RpZmllci5OT05FOwotCQkKKwogCS8qKgogCSAqIFRoZSBiYXNlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCiAJICogbGVnYWwgdHlwZS4KQEAgLTE0NiwyMSArMTQ3LDIxIEBACiAJcHJpdmF0ZSBUeXBlIGJhc2VUeXBlID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBsaXN0IG9mIHZhcmlhYmxlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyAoZWxlbWVudCB0eXBlOiAKLQkgKiA8Y29kZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KS4gIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICogVGhlIGxpc3Qgb2YgdmFyaWFibGUgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIChlbGVtZW50IHR5cGU6CisJICoge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudH0pLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KIAkgKi8KLQlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50cyA9IAorCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzID0KIAkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoRlJBR01FTlRTX1BST1BFUlRZKTsKIAogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSBvd25lZCAKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQKIAkgKiBieSB0aGUgZ2l2ZW4gQVNULiAgQnkgZGVmYXVsdCwgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGhhczogbm8gbW9kaWZpZXJzLAotCSAqIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUsIGFuZCBhbiBlbXB0eSBsaXN0IG9mIHZhcmlhYmxlIAorCSAqIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUsIGFuZCBhbiBlbXB0eSBsaXN0IG9mIHZhcmlhYmxlCiAJICogZGVjbGFyYXRpb24gZnJhZ21lbnRzICh3aGljaCBpcyBzeW50YWN0aWNhbGx5IGlsbGVnYWwpLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtMTc2LDcgKzE3Nyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTkyLDcgKzE5Myw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0SW50UHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjA4LDcgKzIwOSw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0yMjIsNyArMjIzLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRDaGlsZExpc3RQcm9wZXJ0eShwcm9wZXJ0eSk7CiAJfQotCQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMjM0LDkgKzIzNSw5IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJQVNUTm9kZSBjbG9uZTAoQVNUIHRhcmdldCkgewotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHJlc3VsdCA9IAorCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHJlc3VsdCA9CiAJCQluZXcgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCWlmICh0aGlzLmFzdC5hcGlMZXZlbCA9PSBBU1QuSkxTMl9JTlRFUk5BTCkgewogCQkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CkBAIC0yNDksNyArMjUwLDcgQEAKIAkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgZnJhZ21lbnRzKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KQEAgLTI3Myw3ICsyNzQsNyBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucwogCSAqIG9mIHRoaXMgZGVjbGFyYXRpb24gKGFkZGVkIGluIEpMUzMgQVBJKS4KQEAgLTI4MSwxMyArMjgyLDEzIEBACiAJICogTm90ZSB0aGF0IHRoZSBmaW5hbCBtb2RpZmllciBpcyB0aGUgb25seSBtZWFuaW5nZnVsIG1vZGlmaWVyIGZvciBsb2NhbAogCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucwotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPklFeHRlbmRlZE1vZGlmaWVyPC9jb2RlPikKKwkgKiAgICAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUV4dGVuZGVkTW9kaWZpZXJ9KQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGEgSkxTMiBBU1QKIAkgKiBAc2luY2UgMy4xCi0JICovIAorCSAqLwogCXB1YmxpYyBMaXN0IG1vZGlmaWVycygpIHsKIAkJLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBqdXN0IGNhbGxpbmcgdW5zdXBwb3J0ZWRJbjIoKSB0byBjaGVjawogCQlpZiAodGhpcy5tb2RpZmllcnMgPT0gbnVsbCkgewpAQCAtMjk1LDE3ICsyOTYsMTcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5tb2RpZmllcnM7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbW9kaWZpZXJzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoaXMgZGVjbGFyYXRpb24uCiAJICogPHA+CiAJICogSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0CiAJICogY29tcHV0ZXMgdGhlc2UgZmxhZ3MgZnJvbSA8Y29kZT5tb2RpZmllcnMoKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYml0LXdpc2Ugb3Igb2YgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cwogCSAqIEBzZWUgTW9kaWZpZXIKLQkgKi8gCisJICovCiAJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CiAJCS8vIG1vcmUgZWZmaWNpZW50IHRoYW4gY2hlY2tpbmcgZ2V0QVNUKCkuQVBJX0xFVkVMCiAJCWlmICh0aGlzLm1vZGlmaWVycyA9PSBudWxsKSB7CkBAIC0zMzIsMTggKzMzMywxOCBAQAogCSAqIE5vdGUgdGhhdCB0aGUgZmluYWwgbW9kaWZpZXIgaXMgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBmb3IgbG9jYWwKIAkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1vZGlmaWVycyB0aGUgZ2l2ZW4gbW9kaWZpZXJzIChiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzKQogCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbgogCSAqIGFuIEFTVCBsYXRlciB0aGFuIEpMUzIKIAkgKiBAc2VlIE1vZGlmaWVyCi0JICogQGRlcHJlY2F0ZWQgSW4gdGhlIEpMUzMgQVBJLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieSAKKwkgKiBAZGVwcmVjYXRlZCBJbiB0aGUgSkxTMyBBUEksIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CiAJICoge0BsaW5rICAjbW9kaWZpZXJzKCl9IHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiBhIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBub2Rlcy4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKIAkJaW50ZXJuYWxTZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciBkZXByZWNhdGVkIG1ldGhvZC4gVXNlZCB0byBhdm9pZAogCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgpAQCAtMzYwLDEyICszNjEsMTIgQEAKIAkgKiBSZXR1cm5zIHRoZSBiYXNlIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCiAJICogPHA+CiAJICogTi5CLiBUaGUgaW5kaXZpZHVhbCBjaGlsZCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgbWF5IHNwZWNpZnkKLQkgKiBhZGRpdGlvbmFsIGFycmF5IGRpbWVuc2lvbnMuIFNvIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBhcmUgbm90IAorCSAqIGFkZGl0aW9uYWwgYXJyYXkgZGltZW5zaW9ucy4gU28gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGFyZSBub3QKIAkgKiBuZWNlc3NhcmlseSBleGFjdGx5IHRoaXMgdHlwZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHRoaXMuYmFzZVR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTM4MSwxNiArMzgyLDE2IEBACiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IHRvIAorCSAqIFNldHMgdGhlIGJhc2UgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCB0bwogCSAqIHRoZSBnaXZlbiB0eXBlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGUgdGhlIG5ldyBiYXNlIHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CiAJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CiAJCWlmICh0eXBlID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTQwNywyMSArNDA4LDIxIEBACiAJICogQWxsIG5vZGVzIGluIHRoaXMgbGlzdCBtdXN0IGJlIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT5zOwogCSAqIGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIHdpbGwgdHJpZ2dlciBhbgogCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGluIHRoaXMgCi0JICogICAgc3RhdGVtZW50IChlbGVtZW50IHR5cGU6IDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pCi0JICovIAorCSAqCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzCisJICogICAgc3RhdGVtZW50IChlbGVtZW50IHR5cGU6IHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnR9KQorCSAqLwogCXB1YmxpYyBMaXN0IGZyYWdtZW50cygpIHsKIAkJcmV0dXJuIHRoaXMudmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50czsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDQgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaGlsZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaGlsZVN0YXRlbWVudC5qYXZhCmluZGV4IDYwNGMzY2IuLmQ3ZTA0Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vV2hpbGVTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1doaWxlU3RhdGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMzIgKzIxLDMzIEBACiAgKiBXaGlsZVN0YXRlbWVudDoKICAqICAgIDxiPndoaWxlPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IFN0YXRlbWVudAogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKIAogCS8qKgotCSAqIFRoZSAiZXhwcmVzc2lvbiIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImV4cHJlc3Npb24iIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUgKGNoaWxkIHR5cGU6IHtAbGluayBFeHByZXNzaW9ufSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgRVhQUkVTU0lPTl9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihXaGlsZVN0YXRlbWVudC5jbGFzcywgImV4cHJlc3Npb24iLCBFeHByZXNzaW9uLmNsYXNzLCBNQU5EQVRPUlksIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgImJvZHkiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJib2R5IiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgU3RhdGVtZW50fSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9EWV9QUk9QRVJUWSA9CiAJCW5ldyBDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihXaGlsZVN0YXRlbWVudC5jbGFzcywgImJvZHkiLCBTdGF0ZW1lbnQuY2xhc3MsIE1BTkRBVE9SWSwgQ1lDTEVfUklTSyk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZToKIAkgKiB7QGxpbmsgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcn0pLAogCSAqIG9yIG51bGwgaWYgdW5pbml0aWFsaXplZC4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFBST1BFUlRZX0RFU0NSSVBUT1JTOwotCQorCiAJc3RhdGljIHsKIAkJTGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KDMpOwogCQljcmVhdGVQcm9wZXJ0eUxpc3QoV2hpbGVTdGF0ZW1lbnQuY2xhc3MsIHByb3BlcnR5TGlzdCk7CkBAIC01OCwzOCArNTksMzggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJ1Y3R1cmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGlzIG5vZGUgdHlwZS4KIAkgKiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFwaUxldmVsIHRoZSBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5BU1QuSkxTKjwvY29kZT4gY29uc3RhbnRzCiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoZWxlbWVudCB0eXBlOgogCSAqIHtAbGluayBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yfSkKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBMaXN0IHByb3BlcnR5RGVzY3JpcHRvcnMoaW50IGFwaUxldmVsKSB7CiAJCXJldHVybiBQUk9QRVJUWV9ERVNDUklQVE9SUzsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dAogCSAqIGxlZ2FsLCBleHByZXNzaW9uLgogCSAqLwogCXByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBib2R5IHN0YXRlbWVudDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiBlbXB0eSBibG9jayAKKwkgKiBUaGUgYm9keSBzdGF0ZW1lbnQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgYmxvY2sKIAkgKiBzdGF0ZW1lbnQuCiAJICovCiAJcHJpdmF0ZSBTdGF0ZW1lbnQgYm9keSA9IG51bGw7CiAKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgd2hpbGUgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCB3aGlsZSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4KIAkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBhbmQKIAkgKiB0aGUgYm9keSBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2suCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCiAJICovCiAJV2hpbGVTdGF0ZW1lbnQoQVNUIGFzdCkgewpAQCAtMTAyLDcgKzEwMyw3IEBACiAJZmluYWwgTGlzdCBpbnRlcm5hbFN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZShpbnQgYXBpTGV2ZWwpIHsKIAkJcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcnMoYXBpTGV2ZWwpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTI2LDcgKzEyNyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMzksNyArMTQwLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVdoaWxlU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBXaGlsZVN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UoZ2V0U3RhcnRQb3NpdGlvbigpLCBnZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRCb2R5KChTdGF0ZW1lbnQpIGdldEJvZHkoKS5jbG9uZSh0YXJnZXQpKTsKQEAgLTE2NiwxMiArMTY3LDEyIEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgd2hpbGUgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCi0JICovIAorCSAqLwogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmICh0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTE4NSwxMCArMTg2LDEwIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgd2hpbGUgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgogCSAqIDx1bD4KQEAgLTE5Niw3ICsxOTcsNyBAQAogCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CiAJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CiAJICogPC91bD4KLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwpAQCAtMjA5LDkgKzIxMCw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgd2hpbGUgc3RhdGVtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CiAJCWlmICh0aGlzLmJvZHkgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0IG11c3QgYmUgdGhyZWFkLXNhZmUgZm9yIHJlYWRlcnMKQEAgLTIyNSw3ICsyMjYsNyBAQAogCQl9CiAJCXJldHVybiB0aGlzLmJvZHk7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIHdoaWxlIHN0YXRlbWVudC4KIAkgKiA8cD4KQEAgLTIzNiw3ICsyMzcsNyBAQAogCSAqIGNvbXBpbGUsIGJlIHN1cmUgdG8gZW1iZWQgdGhlIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ8L2NvZGU+CiAJICogaW5zaWRlIGEgPGNvZGU+QmxvY2s8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+CkBAIC0yNDQsNyArMjQ1LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTI1NCwxNCArMjU1LDE0IEBACiAJCXRoaXMuYm9keSA9IHN0YXRlbWVudDsKIAkJcG9zdFJlcGxhY2VDaGlsZChvbGRDaGlsZCwgc3RhdGVtZW50LCBCT0RZX1BST1BFUlRZKTsKIAl9Ci0JCisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKIAkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaWxkY2FyZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vV2lsZGNhcmRUeXBlLmphdmEKaW5kZXggZDk3Y2JkMi4uODlhYmIyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaWxkY2FyZFR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1dpbGRjYXJkVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDM3ICsxOCwzOCBAQAogICogVHlwZSBub2RlIGZvciBhIHdpbGRjYXJkIHR5cGUgKGFkZGVkIGluIEpMUzMgQVBJKS4KICAqIDxwcmU+CiAgKiBXaWxkY2FyZFR5cGU6Ci0gKiAgICA8Yj4/PC9iPiBbICggPGI+ZXh0ZW5kczwvYj4gfCA8Yj5zdXBlcjwvYj4pIFR5cGUgXSAKKyAqICAgIDxiPj88L2I+IFsgKCA8Yj5leHRlbmRzPC9iPiB8IDxiPnN1cGVyPC9iPikgVHlwZSBdCiAgKiA8L3ByZT4KICAqIDxwPgogICogTm90IGFsbCBub2RlIGFycmFuZ2VtZW50cyB3aWxsIHJlcHJlc2VudCBsZWdhbCBKYXZhIGNvbnN0cnVjdHMuIEluIHBhcnRpY3VsYXIsCiAgKiBpdCBpcyBub25zZW5zZSBpZiBhIHdpbGRjYXJkIHR5cGUgbm9kZSBhcHBlYXJzIGFueXdoZXJlIG90aGVyIHRoYW4gYXMgYW4KICAqIGFyZ3VtZW50IG9mIGEgPGNvZGU+UGFyYW1ldGVyaXplZFR5cGU8L2NvZGU+IG5vZGUuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIFdpbGRjYXJkVHlwZSBleHRlbmRzIFR5cGUgewotCQorCiAJLyoqCi0JICogVGhlICJib3VuZCIgc3RydWN0dXJhbCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUgdHlwZS4KKwkgKiBUaGUgImJvdW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlIChjaGlsZCB0eXBlOiB7QGxpbmsgVHlwZX0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IgQk9VTkRfUFJPUEVSVFkgPSAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIEJPVU5EX1BST1BFUlRZID0KIAkJbmV3IENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKFdpbGRjYXJkVHlwZS5jbGFzcywgImJvdW5kIiwgVHlwZS5jbGFzcywgT1BUSU9OQUwsIENZQ0xFX1JJU0spOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBUaGUgInVwcGVyQm91bmQiIHN0cnVjdHVyYWwgcHJvcGVydHkgb2YgdGhpcyBub2RlIHR5cGUuCisJICogVGhlICJ1cHBlckJvdW5kIiBzdHJ1Y3R1cmFsIHByb3BlcnR5IG9mIHRoaXMgbm9kZSB0eXBlICh0eXBlOiB7QGxpbmsgQm9vbGVhbn0pLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yIFVQUEVSX0JPVU5EX1BST1BFUlRZID0gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgVVBQRVJfQk9VTkRfUFJPUEVSVFkgPQogCQluZXcgU2ltcGxlUHJvcGVydHlEZXNjcmlwdG9yKFdpbGRjYXJkVHlwZS5jbGFzcywgInVwcGVyQm91bmQiLCBib29sZWFuLmNsYXNzLCBNQU5EQVRPUlkpOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBBIGxpc3Qgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGVsZW1lbnQgdHlwZTogCisJICogQSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KSwKIAkgKiBvciBudWxsIGlmIHVuaW5pdGlhbGl6ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBQUk9QRVJUWV9ERVNDUklQVE9SUzsKLQkKKwogCXN0YXRpYyB7CiAJCUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgzKTsKIAkJY3JlYXRlUHJvcGVydHlMaXN0KFdpbGRjYXJkVHlwZS5jbGFzcywgcHJvcGVydHlMaXN0KTsKQEAgLTYwLDI2ICs2MSwyNiBAQAogCS8qKgogCSAqIFJldHVybnMgYSBsaXN0IG9mIHN0cnVjdHVyYWwgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbm9kZSB0eXBlLgogCSAqIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gYXBpTGV2ZWwgdGhlIEFQSSBsZXZlbDsgb25lIG9mIHRoZQogCSAqIDxjb2RlPkFTVC5KTFMqPC9jb2RlPiBjb25zdGFudHMKIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6IAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIChlbGVtZW50IHR5cGU6CiAJICoge0BsaW5rIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3J9KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgTGlzdCBwcm9wZXJ0eURlc2NyaXB0b3JzKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gUFJPUEVSVFlfREVTQ1JJUFRPUlM7CiAJfQotCQkJCi0JLyoqIAorCisJLyoqCiAJICogVGhlIG9wdGlvbmFsIHR5cGUgYm91bmQgbm9kZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsKIAkgKiBkZWZhdWx0cyB0byBub25lLgogCSAqLwogCXByaXZhdGUgVHlwZSBvcHRpb25hbEJvdW5kID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3aWxkY2FyZCBib3VuZCBpcyBhbiB1cHBlciBib3VuZAotCSAqICgiZXh0ZW5kcyIpIGFzIG9wcG9zZWQgdG8gYSBsb3dlciBib3VuZCAoInN1cGVyIikuIAorCSAqICgiZXh0ZW5kcyIpIGFzIG9wcG9zZWQgdG8gYSBsb3dlciBib3VuZCAoInN1cGVyIikuCiAJICogRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaW5pdGlhbGx5LgogCSAqLwogCXByaXZhdGUgYm9vbGVhbiBpc1VwcGVyQm91bmQgPSB0cnVlOwpAQCAtOTAsNyArOTEsNyBAQAogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQogCSAqLwogCVdpbGRjYXJkVHlwZShBU1QgYXN0KSB7CkBAIC0xMDQsNyArMTA1LDcgQEAKIAlmaW5hbCBMaXN0IGludGVybmFsU3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKGludCBhcGlMZXZlbCkgewogCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9ycyhhcGlMZXZlbCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xMjAsNyArMTIxLDcgQEAKIAkJLy8gYWxsb3cgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBmbGFnIHRoZSBlcnJvcgogCQlyZXR1cm4gc3VwZXIuaW50ZXJuYWxHZXRTZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHksIGdldCwgdmFsdWUpOwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwpAQCAtMTM2LDcgKzEzNyw3IEBACiAJCS8vIGFsbG93IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZmxhZyB0aGUgZXJyb3IKIAkJcmV0dXJuIHN1cGVyLmludGVybmFsR2V0U2V0Q2hpbGRQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0LCBjaGlsZCk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCkBAIC0xNDksNyArMTUwLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lMChBU1QgdGFyZ2V0KSB7CiAJCVdpbGRjYXJkVHlwZSByZXN1bHQgPSBuZXcgV2lsZGNhcmRUeXBlKHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZShnZXRTdGFydFBvc2l0aW9uKCksIGdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEJvdW5kKChUeXBlKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0Qm91bmQoKSksIGlzVXBwZXJCb3VuZCgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xNzMsNyArMTc0LDcgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHdpbGRjYXJkIHR5cGUgaXMgYW4gdXBwZXIgYm91bmQKIAkgKiAoImV4dGVuZHMiKSBhcyBvcHBvc2VkIHRvIGEgbG93ZXIgYm91bmQgKCJzdXBlciIpLgpAQCAtMTgxLDM0ICsxODIsMzQgQEAKIAkgKiBOb3RlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBpcnJlbGV2YW50IGZvciB3aWxkY2FyZHMKIAkgKiB0aGF0IGRvIG5vdCBoYXZlIGEgYm91bmQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiB1cHBlciBib3VuZCwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgbG93ZXIgYm91bmQKIAkgKiBAc2VlICNzZXRCb3VuZChUeXBlKQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1VwcGVyQm91bmQoKSB7CiAJCXJldHVybiB0aGlzLmlzVXBwZXJCb3VuZDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBib3VuZCBvZiB0aGlzIHdpbGRjYXJkIHR5cGUgaWYgaXQgaGFzIG9uZS4KIAkgKiBJZiB7QGxpbmsgI2lzVXBwZXJCb3VuZCBpc1VwcGVyQm91bmR9IHJldHVybnMgdHJ1ZSwgdGhpcwogCSAqIGlzIGFuIHVwcGVyIGJvdW5kICgiPyBleHRlbmRzIEIiKTsgaWYgaXQgcmV0dXJucyBmYWxzZSwgdGhpcwogCSAqIGlzIGEgbG93ZXIgYm91bmQgKCI/IHN1cGVyIEIiKS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGJvdW5kIG9mIHRoaXMgd2lsZGNhcmQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBub25lCiAJICogQHNlZSAjc2V0Qm91bmQoVHlwZSkKLQkgKi8gCisJICovCiAJcHVibGljIFR5cGUgZ2V0Qm91bmQoKSB7CiAJCXJldHVybiB0aGlzLm9wdGlvbmFsQm91bmQ7CiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm91bmQgb2YgdGhpcyB3aWxkY2FyZCB0eXBlIHRvIHRoZSBnaXZlbiB0eXBlIGFuZAogCSAqIG1hcmtzIGl0IGFzIGFuIHVwcGVyIG9yIGEgbG93ZXIgYm91bmQuIFRoZSBtZXRob2QgaXMKIAkgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+c2V0Qm91bmQodHlwZSk7IHNldFVwcGVyQm91bmQoaXNVcHBlckJvdW5kKTwvY29kZT4uCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGJvdW5kIG9mIHRoaXMgd2lsZGNhcmQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBub25lCiAJICogQHBhcmFtIGlzVXBwZXJCb3VuZCA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW4gdXBwZXIgYm91bmQgKCI/IGV4dGVuZHMgQiIpLApAQCAtMjIwLDcgKzIyMSw3IEBACiAJICogPC91bD4KIAkgKiBAc2VlICNnZXRCb3VuZCgpCiAJICogQHNlZSAjaXNVcHBlckJvdW5kKCkKLQkgKi8gCisJICovCiAJcHVibGljIHZvaWQgc2V0Qm91bmQoVHlwZSB0eXBlLCBib29sZWFuIGlzVXBwZXJCb3VuZCkgewogCQlzZXRCb3VuZCh0eXBlKTsKIAkJc2V0VXBwZXJCb3VuZChpc1VwcGVyQm91bmQpOwpAQCAtMjI4LDcgKzIyOSw3IEBACiAKIAkvKioKIAkgKiBTZXRzIHRoZSBib3VuZCBvZiB0aGlzIHdpbGRjYXJkIHR5cGUgdG8gdGhlIGdpdmVuIHR5cGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGJvdW5kIG9mIHRoaXMgd2lsZGNhcmQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBub25lCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CkBAIC0yMzcsNyArMjM4LDcgQEAKIAkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgogCSAqIDwvdWw+CiAJICogQHNlZSAjZ2V0Qm91bmQoKQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRCb3VuZChUeXBlIHR5cGUpIHsKIAkJQVNUTm9kZSBvbGRDaGlsZCA9IHRoaXMub3B0aW9uYWxCb3VuZDsKIAkJcHJlUmVwbGFjZUNoaWxkKG9sZENoaWxkLCB0eXBlLCBCT1VORF9QUk9QRVJUWSk7CkBAIC0yNDgsMjkgKzI0OSwyOSBAQAogCS8qKgogCSAqIFNldHMgd2hldGhlciB0aGlzIHdpbGRjYXJkIHR5cGUgaXMgYW4gdXBwZXIgYm91bmQKIAkgKiAoImV4dGVuZHMiKSBhcyBvcHBvc2VkIHRvIGEgbG93ZXIgYm91bmQgKCJzdXBlciIpLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGlzVXBwZXJCb3VuZCA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiB1cHBlciBib3VuZCwKIAkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgbG93ZXIgYm91bmQKIAkgKiBAc2VlICNpc1VwcGVyQm91bmQoKQotCSAqLyAKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRVcHBlckJvdW5kKGJvb2xlYW4gaXNVcHBlckJvdW5kKSB7CiAJCXByZVZhbHVlQ2hhbmdlKFVQUEVSX0JPVU5EX1BST1BFUlRZKTsKIAkJdGhpcy5pc1VwcGVyQm91bmQgPSBpc1VwcGVyQm91bmQ7CiAJCXBvc3RWYWx1ZUNoYW5nZShVUFBFUl9CT1VORF9QUk9QRVJUWSk7CiAJfQotCQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7CiAJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OwogCX0KLQkKKwogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgogCSAqLwogCWludCB0cmVlU2l6ZSgpIHsKLQkJcmV0dXJuIAorCQlyZXR1cm4KIAkJbWVtU2l6ZSgpCiAJCSsgKHRoaXMub3B0aW9uYWxCb3VuZCA9PSBudWxsID8gMCA6IGdldEJvdW5kKCkudHJlZVNpemUoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0FTVFJld3JpdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9BU1RSZXdyaXRlLmphdmEKaW5kZXggN2Q5Y2M0Mi4uY2UwN2VlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0FTVFJld3JpdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDYgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZTsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjYsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJ5U2Nhbm5lckRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZUFuYWx5emVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLkxpbmVJbmZvcm1hdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20ucmV3cml0ZS5Ob2RlSW5mb1N0b3JlOwpAQCAtMzMsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLlJld3JpdGVFdmVudFN0b3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLlRyYWNrZWROb2RlUG9zaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuUmV3cml0ZUV2ZW50U3RvcmUuQ29weVNvdXJjZUluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuUmV3cml0ZUV2ZW50U3RvcmUuUHJvcGVydHlMb2NhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwpAQCAtNDksNyArNTIsNyBAQAogICogcXVpY2sgZml4IHByb3Bvc2FscykuIFRoZSByZXdyaXRlIGluZnJhc3RydWN0dXJlIHRyaWVzIHRvIGdlbmVyYXRlIG1pbmltYWwKICAqIHRleHQgY2hhbmdlcywgcHJlc2VydmUgZXhpc3RpbmcgY29tbWVudHMgYW5kIGluZGVudGF0aW9uLCBhbmQgZm9sbG93IGNvZGUKICAqIGZvcm1hdHRlciBzZXR0aW5ncy4gSWYgdGhlIGZyZWVkb20gdG8gZXhwbG9yZSBtdWx0aXBsZSBhbHRlcm5hdGUgY2hhbmdlcyBpcwotICogbm90IHJlcXVpcmVkLCBjb25zaWRlciB1c2luZyB0aGUgQVNUJ3MgYnVpbHQtaW4gcmV3cml0ZXIgCisgKiBub3QgcmVxdWlyZWQsIGNvbnNpZGVyIHVzaW5nIHRoZSBBU1QncyBidWlsdC1pbiByZXdyaXRlcgogICogKHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCNyZXdyaXRlKElEb2N1bWVudCwgTWFwKX0pLgogICogPHA+CiAgKiBUaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCBpbGx1c3RyYXRlZCB1c2FnZSBvZiB0aGlzIGNsYXNzOgpAQCAtNTcsNyArNjAsNyBAQAogICogPHByZT4KICAqIERvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG5jbGFzcyBYIHt9XG4iKTsKICAqIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLSAqIHBhcnNlci5zZXRTb3VyY2UoZG9jLmdldCgpLnRvQ2hhckFycmF5KCkpOworICogcGFyc2VyLnNldFNvdXJjZShkb2N1bWVudC5nZXQoKS50b0NoYXJBcnJheSgpKTsKICAqIENvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7CiAgKiBBU1QgYXN0ID0gY3UuZ2V0QVNUKCk7CiAgKiBJbXBvcnREZWNsYXJhdGlvbiBpZCA9IGFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwpAQCAtNjgsMjQgKzcxLDMyIEBACiAgKiBMaXN0UmV3cml0ZSBscncgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShjdSwgQ29tcGlsYXRpb25Vbml0LklNUE9SVFNfUFJPUEVSVFkpOwogICogbHJ3Lmluc2VydExhc3QoaWQsIG51bGwpOwogICogVGV4dEVkaXQgZWRpdHMgPSByZXdyaXRlci5yZXdyaXRlQVNUKGRvY3VtZW50LCBudWxsKTsKLSAqIFVuZG9FZGl0IHVuZG8gPSBlZGl0cy5hcHBseShkb2N1bWVudCk7Ci0gKiBhc3NlcnQgImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbmltcG9ydCBqYXZhLnV0aWwuU2V0O1xuY2xhc3MgWCB7fSIuZXF1YWxzKGRvYy5nZXQoKS50b0NoYXJBcnJheSgpKTsKKyAqIFVuZG9FZGl0IHVuZG8gPSBudWxsOworICogdHJ5IHsKKyAqICAgICB1bmRvID0gZWRpdHMuYXBwbHkoZG9jdW1lbnQpOworICogfSBjYXRjaChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKKyAqICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICogfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisgKiAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAqIH0KKyAqIGFzc2VydCAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuaW1wb3J0IGphdmEudXRpbC5TZXQ7XG5jbGFzcyBYIHt9XG4iLmVxdWFscyhkb2N1bWVudC5nZXQoKSk7CiAgKiAvLyB0ZExvY2F0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSBhbmQgdGRMb2NhdGlvbi5nZXRMZW5ndGgoKQotICogLy8gYXJlIG5ldyBzb3VyY2UgcmFuZ2UgZm9yICJjbGFzcyBYIHt9IiBpbiBkb2MuZ2V0KCkKLSAqIDwvcHJlPiAKKyAqIC8vIGFyZSBuZXcgc291cmNlIHJhbmdlIGZvciAiY2xhc3MgWCB7fSIgaW4gZG9jdW1lbnQuZ2V0KCkKKyAqIDwvcHJlPgogICogPHA+CiAgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgogICogPC9wPgogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQVNUUmV3cml0ZSB7Ci0KIAkvKiogcm9vdCBub2RlIGZvciB0aGUgcmV3cml0ZTogT25seSBub2RlcyB1bmRlciB0aGlzIHJvb3QgYXJlIGFjY2VwdGVkICovCiAJcHJpdmF0ZSBmaW5hbCBBU1QgYXN0OwogCiAJcHJpdmF0ZSBmaW5hbCBSZXdyaXRlRXZlbnRTdG9yZSBldmVudFN0b3JlOwogCXByaXZhdGUgZmluYWwgTm9kZUluZm9TdG9yZSBub2RlU3RvcmU7Ci0JCisKIAkvKioKIAkgKiBUYXJnZXQgc291cmNlIHJhbmdlIGNvbXB1dGVyOyBudWxsIG1lYW5zIHVuaW5pdGlhbGl6ZWQ7CiAJICogbGF6eSBpbml0aWFsaXplZCB0byA8Y29kZT5uZXcgVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcigpPC9jb2RlPi4KQEAgLTk0LDkgKzEwNSwyOSBAQAogCXByaXZhdGUgVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlciB0YXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyID0gbnVsbDsKIAkKIAkvKioKKwkgKiBQcmltYXJ5IGZpZWxkIHVzZWQgaW4gcmVwcmVzZW50aW5nIHJld3JpdGUgcHJvcGVydGllcyBlZmZpY2llbnRseS4KKwkgKiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhpcyByZXdyaXRlIGhhcyBubyBwcm9wZXJ0aWVzLgorCSAqIElmIGEge0BsaW5rIFN0cmluZ30sIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhpcyByZXdyaXRlJ3Mgc29sZSBwcm9wZXJ0eSwKKwkgKiBhbmQgPGNvZGU+cHJvcGVydHkyPC9jb2RlPiBjb250YWlucyBpdHMgdmFsdWUuCisJICogSWYgYSB7QGxpbmsgTWFwfSwgdGhpcyBpcyB0aGUgdGFibGUgb2YgcHJvcGVydHkgbmFtZS12YWx1ZQorCSAqIG1hcHBpbmdzLgorCSAqIEluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiAKKwkgKiBAc2VlICNwcm9wZXJ0eTIKKwkgKi8KKwlwcml2YXRlIE9iamVjdCBwcm9wZXJ0eTEgPSBudWxsOworCisJLyoqCisJICogQXV4aWxpYXJ5IGZpZWxkIHVzZWQgaW4gcmVwcmVzZW50aW5nIHJld3JpdGUgcHJvcGVydGllcyBlZmZpY2llbnRseS4KKwkgKgorCSAqIEBzZWUgI3Byb3BlcnR5MQorCSAqLworCXByaXZhdGUgT2JqZWN0IHByb3BlcnR5MiA9IG51bGw7CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciBkZXNjcmliaW5nIG1hbmlwdWxhdGlvbnMgb2YKIAkgKiB0aGUgZ2l2ZW4gQVNULgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFzdCB0aGUgQVNUIHdob3NlIG5vZGVzIHdpbGwgYmUgcmV3cml0dGVuCiAJICogQHJldHVybiB0aGUgbmV3IHJld3JpdGVyIGluc3RhbmNlCiAJICovCkBAIC0xMDcsNyArMTM4LDcgQEAKIAkvKioKIAkgKiBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIEFTVC4KIAkgKiBDbGllbnRzIHNob3VsZCB1c2Uge0BsaW5rICNjcmVhdGUoQVNUKX0gdG8gY3JlYXRlIGluc3RhbmNlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCBiZWluZyByZXdyaXR0ZW4KIAkgKi8KIAlwcm90ZWN0ZWQgQVNUUmV3cml0ZShBU1QgYXN0KSB7CkBAIC0xMTUsMTYgKzE0NiwxNiBAQAogCQl0aGlzLmV2ZW50U3RvcmU9IG5ldyBSZXdyaXRlRXZlbnRTdG9yZSgpOwogCQl0aGlzLm5vZGVTdG9yZT0gbmV3IE5vZGVJbmZvU3RvcmUoYXN0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBBU1QgdGhlIHJld3JpdGUgd2FzIHNldCB1cCBvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIEFTVCB0aGUgcmV3cml0ZSB3YXMgc2V0IHVwIG9uCiAJICovCiAJcHVibGljIGZpbmFsIEFTVCBnZXRBU1QoKSB7CiAJCXJldHVybiB0aGlzLmFzdDsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIEludGVybmFsIG1ldGhvZC4gUmV0dXJucyB0aGUgaW50ZXJuYWwgZXZlbnQgc3RvcmUuCiAJICogQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KQEAgLTEzMyw3ICsxNjQsNyBAQAogCXByb3RlY3RlZCBmaW5hbCBSZXdyaXRlRXZlbnRTdG9yZSBnZXRSZXdyaXRlRXZlbnRTdG9yZSgpIHsKIAkJcmV0dXJuIHRoaXMuZXZlbnRTdG9yZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnRlcm5hbCBtZXRob2QuIFJldHVybnMgdGhlIGludGVybmFsIG5vZGUgaW5mbyBzdG9yZS4KIAkgKiBDbGllbnRzIHNob3VsZCBub3QgdXNlLgpAQCAtMTQyLDcgKzE3Myw3IEBACiAJcHJvdGVjdGVkIGZpbmFsIE5vZGVJbmZvU3RvcmUgZ2V0Tm9kZVN0b3JlKCkgewogCQlyZXR1cm4gdGhpcy5ub2RlU3RvcmU7CiAJfQotCQorCiAJLyoqCiAJICogQ29udmVydHMgYWxsIG1vZGlmaWNhdGlvbnMgcmVjb3JkZWQgYnkgdGhpcyByZXdyaXRlcgogCSAqIGludG8gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyB0ZXh0CkBAIC0xNTEsMTYgKzE4MiwxNiBAQAogCSAqIDxwPgogCSAqIEZvciBub2RlcyBpbiB0aGUgb3JpZ2luYWwgdGhhdCBhcmUgYmVpbmcgcmVwbGFjZWQgb3IgZGVsZXRlZCwKIAkgKiB0aGlzIHJld3JpdGVyIGNvbXB1dGVzIHRoZSBhZGp1c3RlZCBzb3VyY2UgcmFuZ2VzCi0JICogYnkgY2FsbGluZyA8Y29kZT5nZXRUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKCkuY29tcHV0ZVNvdXJjZVJhbmdlKG5vZGUpPC9jb2RlPi4KKwkgKiBieSBjYWxsaW5nIHtAbGluayBUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyI2NvbXB1dGVTb3VyY2VSYW5nZShBU1ROb2RlKSBnZXRFeHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIoKS5jb21wdXRlU291cmNlUmFuZ2Uobm9kZSl9LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBtb2RpZmljYXRpb25zCiAJICogb24gcmVjb3JkLiBTdWJzZXF1ZW5jZSBtb2RpZmljYXRpb25zIGFyZSBhZGRlZCB0byB0aGUgb25lcwogCSAqIGFscmVhZHkgb24gcmVjb3JkLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4gbGF0ZXIsCiAJICogdGhlIHJlc3VsdGluZyB0ZXh0IGVkaXQgb2JqZWN0IHdpbGwgYWNjdXJhdGVseSByZWZsZWN0Ci0JICogdGhlIG5ldCBjdW11bGF0aXZlIGFmZmVjdCBvZiBhbGwgdGhvc2UgY2hhbmdlcy4KKwkgKiB0aGUgbmV0IGN1bXVsYXRpdmUgZWZmZWN0IG9mIGFsbCB0aG9zZSBjaGFuZ2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkb2N1bWVudCBvcmlnaW5hbCBkb2N1bWVudCBjb250YWluaW5nIHNvdXJjZSBjb2RlCiAJICogQHBhcmFtIG9wdGlvbnMgdGhlIHRhYmxlIG9mIGZvcm1hdHRlciBvcHRpb25zCiAJICogKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OyB2YWx1ZSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+KTsKQEAgLTE2OSwyNyArMjAwLDI4IEBACiAJICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZXMgdG8gdGhlCiAJICogZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhbmdlcyByZWNvcmRlZCBieSB0aGlzIHJld3JpdGVyCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gQW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPgotCSAqIGlzIHRocm93biBpZiB0aGUgZG9jdW1lbnQgcGFzc2VkIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIEFTVCB0aGF0IGlzIHJld3JpdHRlbi4gCisJICogaXMgdGhyb3duIGlmIHRoZSBkb2N1bWVudCBwYXNzZWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgQVNUIHRoYXQgaXMgcmV3cml0dGVuLgogCSAqLwogCXB1YmxpYyBUZXh0RWRpdCByZXdyaXRlQVNUKElEb2N1bWVudCBkb2N1bWVudCwgTWFwIG9wdGlvbnMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCiAJCUFTVE5vZGUgcm9vdE5vZGU9IGdldFJvb3ROb2RlKCk7CiAJCWlmIChyb290Tm9kZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsgLy8gbm8gY2hhbmdlcwogCQl9Ci0JCQkKKwogCQljaGFyW10gY29udGVudD0gZG9jdW1lbnQuZ2V0KCkudG9DaGFyQXJyYXkoKTsKIAkJTGluZUluZm9ybWF0aW9uIGxpbmVJbmZvPSBMaW5lSW5mb3JtYXRpb24uY3JlYXRlKGRvY3VtZW50KTsKIAkJU3RyaW5nIGxpbmVEZWxpbT0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCk7Ci0JCQorCiAJCUFTVE5vZGUgYXN0Um9vdD0gcm9vdE5vZGUuZ2V0Um9vdCgpOwogCQlMaXN0IGNvbW1lbnROb2Rlcz0gYXN0Um9vdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCA/ICgoQ29tcGlsYXRpb25Vbml0KSBhc3RSb290KS5nZXRDb21tZW50TGlzdCgpIDogbnVsbDsKLQkJcmV0dXJuIGludGVybmFsUmV3cml0ZUFTVChjb250ZW50LCBsaW5lSW5mbywgbGluZURlbGltLCBjb21tZW50Tm9kZXMsIG9wdGlvbnMsIHJvb3ROb2RlKTsKKwkJTWFwIGN1cnJlbnRPcHRpb25zID0gb3B0aW9ucyA9PSBudWxsID8gSmF2YUNvcmUuZ2V0T3B0aW9ucygpIDogb3B0aW9uczsKKwkJcmV0dXJuIGludGVybmFsUmV3cml0ZUFTVChjb250ZW50LCBsaW5lSW5mbywgbGluZURlbGltLCBjb21tZW50Tm9kZXMsIGN1cnJlbnRPcHRpb25zLCByb290Tm9kZSwgKFJlY292ZXJ5U2Nhbm5lckRhdGEpKChDb21waWxhdGlvblVuaXQpIGFzdFJvb3QpLmdldFN0YXRlbWVudHNSZWNvdmVyeURhdGEoKSk7CiAJfQotCQorCiAJLyoqCiAJICogQ29udmVydHMgYWxsIG1vZGlmaWNhdGlvbnMgcmVjb3JkZWQgYnkgdGhpcyByZXdyaXRlciBpbnRvIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRoZSBjb3JyZXNwb25kaW5nIHRleHQKIAkgKiBlZGl0cyB0byB0aGUgc291cmNlIG9mIGEge0BsaW5rIElUeXBlUm9vdH0gZnJvbSB3aGljaCB0aGUgQVNUIHdhcyBjcmVhdGVkIGZyb20uCkBAIC0yMDUsMjMgKzIzNywyMyBAQAogCSAqIDxwPgogCSAqIEZvciBub2RlcyBpbiB0aGUgb3JpZ2luYWwgdGhhdCBhcmUgYmVpbmcgcmVwbGFjZWQgb3IgZGVsZXRlZCwKIAkgKiB0aGlzIHJld3JpdGVyIGNvbXB1dGVzIHRoZSBhZGp1c3RlZCBzb3VyY2UgcmFuZ2VzCi0JICogYnkgY2FsbGluZyA8Y29kZT5nZXRUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKCkuY29tcHV0ZVNvdXJjZVJhbmdlKG5vZGUpPC9jb2RlPi4KKwkgKiBieSBjYWxsaW5nIHtAbGluayBUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyI2NvbXB1dGVTb3VyY2VSYW5nZShBU1ROb2RlKSBnZXRFeHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIoKS5jb21wdXRlU291cmNlUmFuZ2Uobm9kZSl9LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBtb2RpZmljYXRpb25zCiAJICogb24gcmVjb3JkLiBTdWJzZXF1ZW5jZSBtb2RpZmljYXRpb25zIGFyZSBhZGRlZCB0byB0aGUgb25lcwogCSAqIGFscmVhZHkgb24gcmVjb3JkLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4gbGF0ZXIsCiAJICogdGhlIHJlc3VsdGluZyB0ZXh0IGVkaXQgb2JqZWN0IHdpbGwgYWNjdXJhdGVseSByZWZsZWN0Ci0JICogdGhlIG5ldCBjdW11bGF0aXZlIGFmZmVjdCBvZiBhbGwgdGhvc2UgY2hhbmdlcy4KKwkgKiB0aGUgbmV0IGN1bXVsYXRpdmUgZWZmZWN0IG9mIGFsbCB0aG9zZSBjaGFuZ2VzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2VzIHRvIHRoZQogCSAqIGRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNoYW5nZXMgcmVjb3JkZWQgYnkgdGhpcyByZXdyaXRlcgogCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KIAkgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259CiAJICogaXMgdGhyb3duIGlmIHRoZSBkb2N1bWVudCBwYXNzZWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgQVNUIHRoYXQgaXMgcmV3cml0dGVuLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBUZXh0RWRpdCByZXdyaXRlQVNUKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKQEAgLTIyOSw3ICsyNjEsNyBAQAogCQlpZiAocm9vdE5vZGUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7IC8vIG5vIGNoYW5nZXMKIAkJfQotCQkKKwogCQlBU1ROb2RlIHJvb3Q9IHJvb3ROb2RlLmdldFJvb3QoKTsKIAkJaWYgKCEocm9vdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgQVBJIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIEFTVCBpcyBjcmVhdGVkIGZyb20gYSBjb21waWxhdGlvbiB1bml0IG9yIGNsYXNzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJApAQCAtMjM5LDM0ICsyNzEsMzQgQEAKIAkJaWYgKHR5cGVSb290ID09IG51bGwgfHwgdHlwZVJvb3QuZ2V0QnVmZmVyKCkgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhpcyBBUEkgY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgQVNUIGlzIGNyZWF0ZWQgZnJvbSBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgY2xhc3MgZmlsZSIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJY2hhcltdIGNvbnRlbnQ9IHR5cGVSb290LmdldEJ1ZmZlcigpLmdldENoYXJhY3RlcnMoKTsKIAkJTGluZUluZm9ybWF0aW9uIGxpbmVJbmZvPSBMaW5lSW5mb3JtYXRpb24uY3JlYXRlKGFzdFJvb3QpOwogCQlTdHJpbmcgbGluZURlbGltPSB0eXBlUm9vdC5maW5kUmVjb21tZW5kZWRMaW5lU2VwYXJhdG9yKCk7CiAJCU1hcCBvcHRpb25zPSB0eXBlUm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSk7Ci0JCQotCQlyZXR1cm4gaW50ZXJuYWxSZXdyaXRlQVNUKGNvbnRlbnQsIGxpbmVJbmZvLCBsaW5lRGVsaW0sIGFzdFJvb3QuZ2V0Q29tbWVudExpc3QoKSwgb3B0aW9ucywgcm9vdE5vZGUpOworCisJCXJldHVybiBpbnRlcm5hbFJld3JpdGVBU1QoY29udGVudCwgbGluZUluZm8sIGxpbmVEZWxpbSwgYXN0Um9vdC5nZXRDb21tZW50TGlzdCgpLCBvcHRpb25zLCByb290Tm9kZSwgKFJlY292ZXJ5U2Nhbm5lckRhdGEpYXN0Um9vdC5nZXRTdGF0ZW1lbnRzUmVjb3ZlcnlEYXRhKCkpOwogCX0KLQkKLQlwcml2YXRlIFRleHRFZGl0IGludGVybmFsUmV3cml0ZUFTVChjaGFyW10gY29udGVudCwgTGluZUluZm9ybWF0aW9uIGxpbmVJbmZvLCBTdHJpbmcgbGluZURlbGltLCBMaXN0IGNvbW1lbnROb2RlcywgTWFwIG9wdGlvbnMsIEFTVE5vZGUgcm9vdE5vZGUpIHsKKworCXByaXZhdGUgVGV4dEVkaXQgaW50ZXJuYWxSZXdyaXRlQVNUKGNoYXJbXSBjb250ZW50LCBMaW5lSW5mb3JtYXRpb24gbGluZUluZm8sIFN0cmluZyBsaW5lRGVsaW0sIExpc3QgY29tbWVudE5vZGVzLCBNYXAgb3B0aW9ucywgQVNUTm9kZSByb290Tm9kZSwgUmVjb3ZlcnlTY2FubmVyRGF0YSByZWNvdmVyeVNjYW5uZXJEYXRhKSB7CiAJCVRleHRFZGl0IHJlc3VsdD0gbmV3IE11bHRpVGV4dEVkaXQoKTsKIAkJLy92YWxpZGF0ZUFTVE5vdE1vZGlmaWVkKHJvb3ROb2RlKTsKLQkJCisKIAkJVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlciBzb3VyY2VSYW5nZUNvbXB1dGVyPSBnZXRFeHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIoKTsKIAkJdGhpcy5ldmVudFN0b3JlLnByZXBhcmVNb3ZlZE5vZGVzKHNvdXJjZVJhbmdlQ29tcHV0ZXIpOwotCQkKLQkJQVNUUmV3cml0ZUFuYWx5emVyIHZpc2l0b3I9IG5ldyBBU1RSZXdyaXRlQW5hbHl6ZXIoY29udGVudCwgbGluZUluZm8sIGxpbmVEZWxpbSwgcmVzdWx0LCB0aGlzLmV2ZW50U3RvcmUsIHRoaXMubm9kZVN0b3JlLCBjb21tZW50Tm9kZXMsIG9wdGlvbnMsIHNvdXJjZVJhbmdlQ29tcHV0ZXIpOworCisJCUFTVFJld3JpdGVBbmFseXplciB2aXNpdG9yPSBuZXcgQVNUUmV3cml0ZUFuYWx5emVyKGNvbnRlbnQsIGxpbmVJbmZvLCBsaW5lRGVsaW0sIHJlc3VsdCwgdGhpcy5ldmVudFN0b3JlLCB0aGlzLm5vZGVTdG9yZSwgY29tbWVudE5vZGVzLCBvcHRpb25zLCBzb3VyY2VSYW5nZUNvbXB1dGVyLCByZWNvdmVyeVNjYW5uZXJEYXRhKTsKIAkJcm9vdE5vZGUuYWNjZXB0KHZpc2l0b3IpOyAvLyB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JCQorCiAJCXRoaXMuZXZlbnRTdG9yZS5yZXZlcnRNb3ZlZE5vZGVzKCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJcHJpdmF0ZSBBU1ROb2RlIGdldFJvb3ROb2RlKCkgewogCQlBU1ROb2RlIG5vZGU9IG51bGw7CiAJCWludCBzdGFydD0gLTE7CiAJCWludCBlbmQ9IC0xOwotCQkKKwogCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGdldFJld3JpdGVFdmVudFN0b3JlKCkuZ2V0Q2hhbmdlUm9vdEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogCQkJQVNUTm9kZSBjdXJyPSAoQVNUTm9kZSkgaXRlci5uZXh0KCk7CiAJCQlpZiAoIVJld3JpdGVFdmVudFN0b3JlLmlzTmV3Tm9kZShjdXJyKSkgewpAQCAtMjk5LDcgKzMzMSw3IEBACiAJCX0KIAkJcmV0dXJuIG5vZGU7CiAJfQotCQorCiAJLyoKIAlwcml2YXRlIHZvaWQgdmFsaWRhdGVBU1ROb3RNb2RpZmllZChBU1ROb2RlIHJvb3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCQlHZW5lcmljVmlzaXRvciBpc01vZGlmaWVkVmlzaXRvcj0gbmV3IEdlbmVyaWNWaXNpdG9yKCkgewpAQCAtMzEzLDEzICszNDUsMTQgQEAKIAkJcm9vdC5hY2NlcHQoaXNNb2RpZmllZFZpc2l0b3IpOwogCX0KIAkqLwotCQkKKwogCS8qKgogCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG5vZGUgZnJvbSBpdHMgcGFyZW50IGluIHRoaXMgcmV3cml0ZXIuIFRoZSBBU1QgaXRzZWxmCiAgICAgICogaXMgbm90IGFjdHVhbGx5IG1vZGlmaWVkIGluIGFueSB3YXk7IHJhdGhlciwgdGhlIHJld3JpdGVyIGp1c3QgcmVjb3JkcwogICAgICAqIGEgbm90ZSB0aGF0IHRoaXMgbm9kZSBzaG91bGQgbm90IGJlIHRoZXJlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGJlaW5nIHJlbW92ZWQKKwkgKgorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGJlaW5nIHJlbW92ZWQuIFRoZSBub2RlIGNhbiBlaXRoZXIgYmUgYW4gb3JpZ2luYWwgbm9kZSBpbiB0aGUgQVNUCisJICogb3IgKHNpbmNlIDMuNCkgYSBuZXcgbm9kZSBhbHJlYWR5IGluc2VydGVkIG9yIHVzZWQgYXMgcmVwbGFjZW1lbnQgaW4gdGhpcyBBU1QgcmV3cml0ZXIuCiAJICogQHBhcmFtIGVkaXRHcm91cCB0aGUgZWRpdCBncm91cCBpbiB3aGljaCB0byBjb2xsZWN0IHRoZSBjb3JyZXNwb25kaW5nCiAJICogdGV4dCBlZGl0cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5ncm91cGVkCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbnVsbCwgb3IgaWYgdGhlIG5vZGUgaXMgbm90CkBAIC0zMzAsMTQgKzM2MywyOSBAQAogCQlpZiAobm9kZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eT0gbm9kZS5nZXRMb2NhdGlvbkluUGFyZW50KCk7Ci0JCWlmIChwcm9wZXJ0eS5pc0NoaWxkTGlzdFByb3BlcnR5KCkpIHsKLQkJCWdldExpc3RSZXdyaXRlKG5vZGUuZ2V0UGFyZW50KCksIChDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IpIHByb3BlcnR5KS5yZW1vdmUobm9kZSwgZWRpdEdyb3VwKTsKKworCQlTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5OworCQlBU1ROb2RlIHBhcmVudDsKKwkJaWYgKFJld3JpdGVFdmVudFN0b3JlLmlzTmV3Tm9kZShub2RlKSkgeyAvLyByZW1vdmUgYSBuZXcgbm9kZSwgYnVnIDE2NDg2MgorCQkJUHJvcGVydHlMb2NhdGlvbiBsb2NhdGlvbj0gdGhpcy5ldmVudFN0b3JlLmdldFByb3BlcnR5TG9jYXRpb24obm9kZSwgUmV3cml0ZUV2ZW50U3RvcmUuTkVXKTsKKwkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisJCQkJcHJvcGVydHk9IGxvY2F0aW9uLmdldFByb3BlcnR5KCk7CisJCQkJcGFyZW50PSBsb2NhdGlvbi5nZXRQYXJlbnQoKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm9kZSBpcyBub3QgcGFydCBvZiB0aGUgcmV3cml0ZXIncyBBU1QiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogCQl9IGVsc2UgewotCQkJc2V0KG5vZGUuZ2V0UGFyZW50KCksIHByb3BlcnR5LCBudWxsLCBlZGl0R3JvdXApOworCQkJcHJvcGVydHk9IG5vZGUuZ2V0TG9jYXRpb25JblBhcmVudCgpOworCQkJcGFyZW50PSBub2RlLmdldFBhcmVudCgpOworCQl9CisKKwkJaWYgKHByb3BlcnR5LmlzQ2hpbGRMaXN0UHJvcGVydHkoKSkgeworCQkJZ2V0TGlzdFJld3JpdGUocGFyZW50LCAoQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yKSBwcm9wZXJ0eSkucmVtb3ZlKG5vZGUsIGVkaXRHcm91cCk7CisJCX0gZWxzZSB7CisJCQlzZXQocGFyZW50LCBwcm9wZXJ0eSwgbnVsbCwgZWRpdEdyb3VwKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJlcGxhY2VzIHRoZSBnaXZlbiBub2RlIGluIHRoaXMgcmV3cml0ZXIuIFRoZSByZXBsYWNlbWVudCBub2RlCiAJICogbXVzdCBlaXRoZXIgYmUgYnJhbmQgbmV3IChub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgQVNUKSBvciBhIHBsYWNlaG9sZGVyCkBAIC0zNDUsOCArMzkzLDkgQEAKIAkgKiBvciB7QGxpbmsgI2NyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKFN0cmluZywgaW50KX0pLiBUaGUgQVNUIGl0c2VsZgogICAgICAqIGlzIG5vdCBhY3R1YWxseSBtb2RpZmllZCBpbiBhbnkgd2F5OyByYXRoZXIsIHRoZSByZXdyaXRlciBqdXN0IHJlY29yZHMKICAgICAgKiBhIG5vdGUgdGhhdCB0aGlzIG5vZGUgaGFzIGJlZW4gcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgYmVpbmcgcmVwbGFjZWQKKwkgKgorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGJlaW5nIHJlcGxhY2VkLiBUaGUgbm9kZSBjYW4gZWl0aGVyIGJlIGFuIG9yaWdpbmFsIG5vZGUgaW4gdGhlIEFTVAorCSAqIG9yIChzaW5jZSAzLjQpIGEgbmV3IG5vZGUgYWxyZWFkeSBpbnNlcnRlZCBvciB1c2VkIGFzIHJlcGxhY2VtZW50IGluIHRoaXMgQVNUIHJld3JpdGVyLgogCSAqIEBwYXJhbSByZXBsYWNlbWVudCB0aGUgcmVwbGFjZW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KIAkgKiByZXBsYWNlbWVudAogCSAqIEBwYXJhbSBlZGl0R3JvdXAgdGhlIGVkaXQgZ3JvdXAgaW4gd2hpY2ggdG8gY29sbGVjdCB0aGUgY29ycmVzcG9uZGluZwpAQCAtMzU0LDE2ICs0MDMsMzEgQEAKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBudWxsLCBvciBpZiB0aGUgbm9kZSBpcyBub3QgcGFydAogCSAqIG9mIHRoaXMgcmV3cml0ZXIncyBBU1QsIG9yIGlmIHRoZSByZXBsYWNlbWVudCBub2RlIGlzIG5vdCBhIG5ldyBub2RlIChvcgogICAgICAqIHBsYWNlaG9sZGVyKSwgb3IgaWYgdGhlIGRlc2NyaWJlZCBtb2RpZmljYXRpb24gaXMgb3RoZXJ3aXNlIGludmFsaWQKLQkgKi8JCQorCSAqLwogCXB1YmxpYyBmaW5hbCB2b2lkIHJlcGxhY2UoQVNUTm9kZSBub2RlLCBBU1ROb2RlIHJlcGxhY2VtZW50LCBUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCkgewogCQlpZiAobm9kZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eT0gbm9kZS5nZXRMb2NhdGlvbkluUGFyZW50KCk7Ci0JCWlmIChwcm9wZXJ0eS5pc0NoaWxkTGlzdFByb3BlcnR5KCkpIHsKLQkJCWdldExpc3RSZXdyaXRlKG5vZGUuZ2V0UGFyZW50KCksIChDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IpIHByb3BlcnR5KS5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50LCBlZGl0R3JvdXApOworCisJCVN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHk7CisJCUFTVE5vZGUgcGFyZW50OworCQlpZiAoUmV3cml0ZUV2ZW50U3RvcmUuaXNOZXdOb2RlKG5vZGUpKSB7IC8vIHJlcGxhY2UgYSBuZXcgbm9kZSwgYnVnIDE2NDg2MgorCQkJUHJvcGVydHlMb2NhdGlvbiBsb2NhdGlvbj0gdGhpcy5ldmVudFN0b3JlLmdldFByb3BlcnR5TG9jYXRpb24obm9kZSwgUmV3cml0ZUV2ZW50U3RvcmUuTkVXKTsKKwkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisJCQkJcHJvcGVydHk9IGxvY2F0aW9uLmdldFByb3BlcnR5KCk7CisJCQkJcGFyZW50PSBsb2NhdGlvbi5nZXRQYXJlbnQoKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm9kZSBpcyBub3QgcGFydCBvZiB0aGUgcmV3cml0ZXIncyBBU1QiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogCQl9IGVsc2UgewotCQkJc2V0KG5vZGUuZ2V0UGFyZW50KCksIHByb3BlcnR5LCByZXBsYWNlbWVudCwgZWRpdEdyb3VwKTsKKwkJCXByb3BlcnR5PSBub2RlLmdldExvY2F0aW9uSW5QYXJlbnQoKTsKKwkJCXBhcmVudD0gbm9kZS5nZXRQYXJlbnQoKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eS5pc0NoaWxkTGlzdFByb3BlcnR5KCkpIHsKKwkJCWdldExpc3RSZXdyaXRlKHBhcmVudCwgKENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcikgcHJvcGVydHkpLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnQsIGVkaXRHcm91cCk7CisJCX0gZWxzZSB7CisJCQlzZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQsIGVkaXRHcm91cCk7CiAJCX0KIAl9CiAKQEAgLTM3OCw3ICs0NDIsNyBAQAogCSAqIHZhbHVlIChwcmltaXRpdmUgdHlwZXMgbXVzdCBiZSBib3hlZCkgb3IgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICogVGhlIEFTVCBpdHNlbGYgaXMgbm90IGFjdHVhbGx5IG1vZGlmaWVkIGluIGFueSB3YXk7IHJhdGhlciwgdGhlIHJld3JpdGVyCiAgICAgICoganVzdCByZWNvcmRzIGEgbm90ZSB0aGF0IHRoaXMgbm9kZSBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBzcGVjaWZpZWQgd2F5LgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5vZGUncyBwcm9wZXJ0eTsgZWl0aGVyIGEgc2ltcGxlIHByb3BlcnR5IG9yIGEgY2hpbGQgcHJvcGVydHkKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIHJlcGxhY2VtZW50IGNoaWxkIG9yIG5ldyB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQpAQCAtMzk0LDYgKzQ1OCw3IEBACiAJCX0KIAkJdmFsaWRhdGVJc0NvcnJlY3RBU1Qobm9kZSk7CiAJCXZhbGlkYXRlUHJvcGVydHlUeXBlKHByb3BlcnR5LCB2YWx1ZSk7CisJCXZhbGlkYXRlSXNQcm9wZXJ0eU9mTm9kZShwcm9wZXJ0eSwgbm9kZSk7CiAKIAkJTm9kZVJld3JpdGVFdmVudCBub2RlRXZlbnQ9IHRoaXMuZXZlbnRTdG9yZS5nZXROb2RlRXZlbnQobm9kZSwgcHJvcGVydHksIHRydWUpOwogCQlub2RlRXZlbnQuc2V0TmV3VmFsdWUodmFsdWUpOwpAQCAtNDAxLDcgKzQ2Niw3IEBACiAJCQl0aGlzLmV2ZW50U3RvcmUuc2V0RXZlbnRFZGl0R3JvdXAobm9kZUV2ZW50LCBlZGl0R3JvdXApOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IGFzIG1hbmFnZWQgYnkgdGhpcyByZXdyaXRlci4gSWYgdGhlIHByb3BlcnR5CiAJICogaGFzIGJlZW4gcmVtb3ZlZCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuIElmIGl0IGhhcyBiZWVuIHJlcGxhY2VkLCB0aGUgcmVwbGFjaW5nIHZhbHVlCkBAIC00MDksMTEgKzQ3NCwxMSBAQAogCSAqIDxwPgogCSAqIEZvciBjaGlsZCBsaXN0IHByb3BlcnRpZXMgdXNlIHtAbGluayBMaXN0UmV3cml0ZSNnZXRSZXdyaXR0ZW5MaXN0KCl9IHRvIGdldCBhY2Nlc3MgdG8gdGhlCiAJICogcmV3cml0dGVuIG5vZGVzIGluIGEgbGlzdC4gPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5vZGUncyBwcm9wZXJ0eQogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBhcyBtYW5hZ2VkIGJ5IHRoaXMgcmV3cml0ZXIKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgT2JqZWN0IGdldChBU1ROb2RlIG5vZGUsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKQEAgLTQyOSw3ICs0OTQsNyBAQAogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgcmV3cml0ZXIgZm9yIGRlc2NyaWJpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUKIAkgKiBnaXZlbiBsaXN0IHByb3BlcnR5IG9mIHRoZSBnaXZlbiBub2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5vZGUncyBwcm9wZXJ0eTsgdGhlIGNoaWxkIGxpc3QgcHJvcGVydHkKIAkgKiBAcmV0dXJuIGEgbmV3IGxpc3QgcmV3cml0ZXIgb2JqZWN0CkBAIC00NDEsMTggKzUwNiw1MSBAQAogCQlpZiAobm9kZSA9PSBudWxsIHx8IHByb3BlcnR5ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQotCQl2YWxpZGF0ZUlzTGlzdFByb3BlcnR5KHByb3BlcnR5KTsKIAkJCisJCXZhbGlkYXRlSXNDb3JyZWN0QVNUKG5vZGUpOworCQl2YWxpZGF0ZUlzTGlzdFByb3BlcnR5KHByb3BlcnR5KTsKKwkJdmFsaWRhdGVJc1Byb3BlcnR5T2ZOb2RlKHByb3BlcnR5LCBub2RlKTsKKwogCQlyZXR1cm4gbmV3IExpc3RSZXdyaXRlKHRoaXMsIG5vZGUsIHByb3BlcnR5KTsKIAl9Ci0JCQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIHByb3BlcnR5IG9mIHRoaXMgcmV3cml0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZyxPYmplY3QpCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWlmICh0aGlzLnByb3BlcnR5MSA9PSBudWxsKSB7CisJCQkvLyByZXdyaXRlIGhhcyBubyBwcm9wZXJ0aWVzIGF0IGFsbAorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMucHJvcGVydHkxIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkvLyByZXdyaXRlIGhhcyBvbmx5IGEgc2luZ2xlIHByb3BlcnR5CisJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyh0aGlzLnByb3BlcnR5MSkpIHsKKwkJCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eTI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCS8vIG90aGVyd2lzZSByZXdyaXRlIGhhcyB0YWJsZSBvZiBwcm9wZXJ0aWVzCisJCU1hcCBtID0gKE1hcCkgdGhpcy5wcm9wZXJ0eTE7CisJCXJldHVybiBtLmdldChwcm9wZXJ0eU5hbWUpOworCX0KKwkKIAkvKioKIAkgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IHRyYWNrcyB0aGUgc291cmNlIHJhbmdlIG9mIHRoZSBnaXZlbiBub2RlCiAJICogYWNyb3NzIHRoZSByZXdyaXRlIHRvIGl0cyBBU1QuIFVwb24gcmV0dXJuLCB0aGUgcmVzdWx0IG9iamVjdCByZWZsZWN0cwogCSAqIHRoZSBnaXZlbiBub2RlJ3MgY3VycmVudCBzb3VyY2UgcmFuZ2UgaW4gdGhlIEFTVC4gQWZ0ZXIKIAkgKiA8Y29kZT5yZXdyaXRlPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSByZXN1bHQgb2JqZWN0IGlzIHVwZGF0ZWQgdG8KIAkgKiByZWZsZWN0IHRoZSBnaXZlbiBub2RlJ3Mgc291cmNlIHJhbmdlIGluIHRoZSByZXdyaXR0ZW4gQVNULgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdHJhY2sKIAkgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IHRyYWNrcyB0aGUgc291cmNlIHJhbmdlIG9mIDxjb2RlPm5vZGU8L2NvZGU+CiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbnVsbCwgb3IgaWYgdGhlIG5vZGUKQEAgLTQ2OSwyMCArNTY3LDIwIEBACiAJCQl0aGlzLmV2ZW50U3RvcmUuc2V0VHJhY2tlZE5vZGVEYXRhKG5vZGUsIGdyb3VwKTsKIAkJfQogCQlyZXR1cm4gbmV3IFRyYWNrZWROb2RlUG9zaXRpb24oZ3JvdXAsIG5vZGUpOwotCX0JCi0JCQkKKwl9CisKIAlwcml2YXRlIHZvaWQgdmFsaWRhdGVJc0V4aXN0aW5nTm9kZShBU1ROb2RlIG5vZGUpIHsKIAkJaWYgKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpID09IC0xKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb2RlIGlzIG5vdCBhbiBleGlzdGluZyBub2RlIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUlzQ29ycmVjdEFTVChBU1ROb2RlIG5vZGUpIHsKIAkJaWYgKG5vZGUuZ2V0QVNUKCkgIT0gZ2V0QVNUKCkpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vZGUgaXMgbm90IGluc2lkZSB0aGUgQVNUIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUlzTGlzdFByb3BlcnR5KFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaWYgKCFwcm9wZXJ0eS5pc0NoaWxkTGlzdFByb3BlcnR5KCkpIHsKIAkJCVN0cmluZyBtZXNzYWdlPSBwcm9wZXJ0eS5nZXRJZCgpICsgIiBpcyBub3QgYSBsaXN0IHByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJApAQCAtNDkwLDMzICs1ODgsMjkgQEAKIAkJfQogCX0KIAkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVJc1Byb3BlcnR5T2ZOb2RlKFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIEFTVE5vZGUgbm9kZSkgeworCQlpZiAoIXByb3BlcnR5LmdldE5vZGVDbGFzcygpLmlzSW5zdGFuY2Uobm9kZSkpIHsKKwkJCVN0cmluZyBtZXNzYWdlPSBwcm9wZXJ0eS5nZXRJZCgpICsgIiBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0eXBlICIgKyBub2RlLmdldENsYXNzKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOworCQl9CisJfQorCiAJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlUeXBlKFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcCwgT2JqZWN0IG5vZGUpIHsKIAkJaWYgKHByb3AuaXNDaGlsZExpc3RQcm9wZXJ0eSgpKSB7CiAJCQlTdHJpbmcgbWVzc2FnZT0gIkNhbiBub3QgbW9kaWZ5IGEgbGlzdCBwcm9wZXJ0eSwgdXNlIGEgbGlzdCByZXdyaXRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7CQkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7CiAJCX0KLS8vCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCWlmIChwcm9wLmlzU2ltcGxlUHJvcGVydHkoKSB8fCAocHJvcC5pc0NoaWxkUHJvcGVydHkoKSAmJiAoKENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKSBwcm9wKS5pc01hbmRhdG9yeSgpKSkgewotLy8JCQkJU3RyaW5nIG1lc3NhZ2U9ICJDYW4gbm90IHJlbW92ZSBwcm9wZXJ0eSAiICsgcHJvcC5nZXRJZCgpOwotLy8JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLS8vCQkJfQotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmICghcHJvcC5nZXROb2RlQ2xhc3MoKS5pc0luc3RhbmNlKG5vZGUpKSB7Ci0vLwkJCQlTdHJpbmcgbWVzc2FnZT0gbm9kZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICAiIGlzIG5vdCBhIHZhbGlkIHR5cGUgZm9yIHByb3BlcnR5ICIgKyBwcm9wLmdldElkKCk7Ci0vLwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotLy8JCQl9Ci0vLwkJfQogCX0KLQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYSBzb3VyY2Ugc3RyaW5nIHRoYXQgaXMgdG8gYmUgaW5zZXJ0ZWQgaW50bwogCSAqIHRoZSBvdXRwdXQgZG9jdW1lbnQgYXQgdGhlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBsYWNlaG9sZGVyLgogCSAqIFRoZSBzdHJpbmcgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IGJlaW5nIHJlZm9ybWF0dGVkIGJleW9uZCBjb3JyZWN0aW5nCiAJICogdGhlIGluZGVudGF0aW9uIGxldmVsLiBUaGUgcGxhY2Vob2xkZXIgbm9kZSBjYW4gZWl0aGVyIGJlIGluc2VydGVkIGFzIG5ldyBvcgogCSAqIHVzZWQgdG8gcmVwbGFjZSBhbiBleGlzdGluZyBub2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvZGUgdGhlIHN0cmluZyB0byBiZSBpbnNlcnRlZDsgbGluZXMgc2hvdWxkIHNob3VsZCBub3QgaGF2ZSBleHRyYSBpbmRlbnRhdGlvbgotCSAqIEBwYXJhbSBub2RlVHlwZSB0aGUgQVNUTm9kZSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhc3NlZCBjb2RlLiAKKwkgKiBAcGFyYW0gbm9kZVR5cGUgdGhlIEFTVE5vZGUgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXNzZWQgY29kZS4KIAkgKiBAcmV0dXJuIHRoZSBuZXcgcGxhY2Vob2xkZXIgbm9kZQogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb2RlIGlzIG51bGwsIG9yIGlmIHRoZSBub2RlCiAJICogdHlwZSBpcyBpbnZhbGlkCkBAIC01MjksMTMgKzYyMywxMyBAQAogCQlpZiAocGxhY2Vob2xkZXIgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIHBsYWNlaG9sZGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUiICsgbm9kZVR5cGUpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJZ2V0Tm9kZVN0b3JlKCkubWFya0FzU3RyaW5nUGxhY2Vob2xkZXIocGxhY2Vob2xkZXIsIGNvZGUpOwogCQlyZXR1cm4gcGxhY2Vob2xkZXI7CiAJfQotCQorCiAJLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2Ygbm9kZXMuIAorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIG5vZGVzLgogCSAqIEVhY2ggb2YgdGhlIGdpdmVuIG5vZGVzIG11c3QgYmUgZWl0aGVyIGJlIGJyYW5kIG5ldyAobm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIEFTVCksIG9yCiAJICogYSBwbGFjZWhvbGRlciBub2RlIChmb3IgZXhhbXBsZSwgb25lIGNyZWF0ZWQgYnkge0BsaW5rICNjcmVhdGVDb3B5VGFyZ2V0KEFTVE5vZGUpfQogCSAqIG9yIHtAbGluayAjY3JlYXRlU3RyaW5nUGxhY2Vob2xkZXIoU3RyaW5nLCBpbnQpfSksIG9yIGFub3RoZXIgZ3JvdXAgbm9kZS4KQEAgLTU0NCw3ICs2MzgsNyBAQAogCSAqIFdoZW4gdGhlIGRvY3VtZW50IGlzIHJld3JpdHRlbiwgdGhlIHNvdXJjZSBjb2RlIGZvciBlYWNoIG9mIHRoZSBnaXZlbiBub2RlcyBpcwogCSAqIGluc2VydGVkLCBpbiBvcmRlciwgaW50byB0aGUgb3V0cHV0IGRvY3VtZW50IGF0IHRoZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZQogCSAqIGdyb3VwIChpbmRlbnRhdGlvbiBpcyBhZGp1c3RlZCkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdGFyZ2V0Tm9kZXMgdGhlIG5vZGVzIHRvIGdvIGluIHRoZSBncm91cAogCSAqIEByZXR1cm4gdGhlIG5ldyBncm91cCBub2RlCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRhcmdldE5vZGVzIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5CkBAIC01NjEsOCArNjU1LDggQEAKIAkJfQogCQlyZXR1cm4gcmVzOwogCX0KLQkKLQkKKworCiAJcHJpdmF0ZSBBU1ROb2RlIGNyZWF0ZVRhcmdldE5vZGUoQVNUTm9kZSBub2RlLCBib29sZWFuIGlzTW92ZSkgewogCQlpZiAobm9kZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC01NzAsMjMgKzY2NCwyMyBAQAogCQl2YWxpZGF0ZUlzRXhpc3RpbmdOb2RlKG5vZGUpOwogCQl2YWxpZGF0ZUlzQ29ycmVjdEFTVChub2RlKTsKIAkJQ29weVNvdXJjZUluZm8gaW5mbz0gZ2V0UmV3cml0ZUV2ZW50U3RvcmUoKS5tYXJrQXNDb3B5U291cmNlKG5vZGUuZ2V0UGFyZW50KCksIG5vZGUuZ2V0TG9jYXRpb25JblBhcmVudCgpLCBub2RlLCBpc01vdmUpOwotCQorCiAJCUFTVE5vZGUgcGxhY2Vob2xkZXI9IGdldE5vZGVTdG9yZSgpLm5ld1BsYWNlaG9sZGVyTm9kZShub2RlLmdldE5vZGVUeXBlKCkpOwogCQlpZiAocGxhY2Vob2xkZXIgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ3JlYXRpbmcgYSB0YXJnZXQgbm9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBub2RlcyBvZiB0eXBlIiArIG5vZGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJZ2V0Tm9kZVN0b3JlKCkubWFya0FzQ29weVRhcmdldChwbGFjZWhvbGRlciwgaW5mbyk7Ci0JCQotCQlyZXR1cm4gcGxhY2Vob2xkZXI7CQkKKworCQlyZXR1cm4gcGxhY2Vob2xkZXI7CiAJfQogCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIGEgdHJ1ZSBjb3B5IG9mIHRoZSBnaXZlbiBub2RlLgogCSAqIFRoZSBwbGFjZWhvbGRlciBub2RlIGNhbiBlaXRoZXIgYmUgaW5zZXJ0ZWQgYXMgbmV3IG9yIHVzZWQgdG8gcmVwbGFjZSBhbgotCSAqIGV4aXN0aW5nIG5vZGUuIFdoZW4gdGhlIGRvY3VtZW50IGlzIHJld3JpdHRlbiwgYSBjb3B5IG9mIHRoZSBzb3VyY2UgY29kZSAKKwkgKiBleGlzdGluZyBub2RlLiBXaGVuIHRoZSBkb2N1bWVudCBpcyByZXdyaXR0ZW4sIGEgY29weSBvZiB0aGUgc291cmNlIGNvZGUKIAkgKiBmb3IgdGhlIGdpdmVuIG5vZGUgaXMgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGRvY3VtZW50IGF0IHRoZSBwb3NpdGlvbgogCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBsYWNlaG9sZGVyIChpbmRlbnRhdGlvbiBpcyBhZGp1c3RlZCkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBjcmVhdGUgYSBjb3B5IHBsYWNlaG9sZGVyIGZvcgogCSAqIEByZXR1cm4gdGhlIG5ldyBwbGFjZWhvbGRlciBub2RlCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbnVsbCwgb3IgaWYgdGhlIG5vZGUKQEAgLTU5NSwxNSArNjg5LDE1IEBACiAJcHVibGljIGZpbmFsIEFTVE5vZGUgY3JlYXRlQ29weVRhcmdldChBU1ROb2RlIG5vZGUpIHsKIAkJcmV0dXJuIGNyZWF0ZVRhcmdldE5vZGUobm9kZSwgZmFsc2UpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBwbGFjZWhvbGRlciBub2RlIGZvciB0aGUgbmV3IGxvY2F0aW9ucyBvZiB0aGUgZ2l2ZW4gbm9kZS4KIAkgKiBBZnRlciBvYnRhaW5pbmcgYSBwbGFjZWhvbGRlciwgdGhlIG5vZGUgc2hvdWxkIHRoZW4gdG8gYmUgcmVtb3ZlZCBvciByZXBsYWNlZC4KIAkgKiBUaGUgcGxhY2Vob2xkZXIgbm9kZSBjYW4gZWl0aGVyIGJlIGluc2VydGVkIGFzIG5ldyBvciB1c2VkIHRvIHJlcGxhY2UgYW4KIAkgKiBleGlzdGluZyBub2RlLiBXaGVuIHRoZSBkb2N1bWVudCBpcyByZXdyaXR0ZW4sIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuCiAJICogbm9kZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgZG9jdW1lbnQgYXQgdGhlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0JICogcGxhY2Vob2xkZXIgKGluZGVudGF0aW9uIGlzIGFkanVzdGVkKS4gCi0JICogCisJICogcGxhY2Vob2xkZXIgKGluZGVudGF0aW9uIGlzIGFkanVzdGVkKS4KKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGNyZWF0ZSBhIG1vdmUgcGxhY2Vob2xkZXIgZm9yCiAJICogQHJldHVybiB0aGUgbmV3IHBsYWNlaG9sZGVyIG5vZGUKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBudWxsLCBvciBpZiB0aGUgbm9kZQpAQCAtNjExLDQwICs3MDUsMTIzIEBACiAJICovCiAJcHVibGljIGZpbmFsIEFTVE5vZGUgY3JlYXRlTW92ZVRhcmdldChBU1ROb2RlIG5vZGUpIHsKIAkJcmV0dXJuIGNyZWF0ZVRhcmdldE5vZGUobm9kZSwgdHJ1ZSk7Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHRlbmRlZCBzb3VyY2UgcmFuZ2UgY29tcHV0ZXIgZm9yIHRoaXMgQVNUIHJld3JpdGVyLgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgPGNvZGU+bmV3IFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIoKTwvY29kZT4uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGFuIGV4dGVuZGVkIHNvdXJjZSByYW5nZSBjb21wdXRlcgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAc2VlICNzZXRUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIpCiAJICovCiAJcHVibGljIGZpbmFsIFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgZ2V0RXh0ZW5kZWRTb3VyY2VSYW5nZUNvbXB1dGVyKCkgewogCQlpZiAodGhpcy50YXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZQotCQkJdGhpcy50YXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyID0gbmV3IFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIoKTsgCisJCQl0aGlzLnRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgPSBuZXcgVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcigpOwogCQl9CiAJCXJldHVybiB0aGlzLnRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXI7CiAJfQotCQorCisJLyoqCisJICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgb2YgdGhpcyByZXdyaXRlIHRvIHRoZSBnaXZlbiB2YWx1ZSwKKwkgKiBvciB0byA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciBpdC4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIHNob3VsZCBlbXBsb3kgcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUgc3VmZmljaWVudGx5IHVuaXF1ZQorCSAqIHRvIGF2b2lkIGluYWR2ZXJ0ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyIGNsaWVudHMgdGhhdCBtaWdodCBhbHNvIGJlCisJICogc2V0dGluZyBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIHJld3JpdGUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBpcyBub3QgY29uc2lkZXJlZCBhIG1vZGlmaWNhdGlvbiB0byB0aGUKKwkgKiBBU1QgaXRzZWxmLiBUaGlzIGlzIHRvIGFsbG93IGNsaWVudHMgdG8gZGVjb3JhdGUgZXhpc3RpbmcgcmV3cml0ZXMgd2l0aAorCSAqIHRoZWlyIG93biBwcm9wZXJ0aWVzIHdpdGhvdXQgamVvcGFyZGl6aW5nIGNlcnRhaW4gdGhpbmdzIChsaWtlIHRoZQorCSAqIHZhbGlkaXR5IG9mIGJpbmRpbmdzKSwgd2hpY2ggcmVseSBvbiB0aGUgdW5kZXJseWluZyB0cmVlIHJlbWFpbmluZyBzdGF0aWMuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZQorCSAqIEBwYXJhbSBkYXRhIHRoZSBuZXcgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlICNnZXRQcm9wZXJ0eShTdHJpbmcpCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKKwkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKHRoaXMucHJvcGVydHkxID09IG51bGwpIHsKKwkJCS8vIHJld3JpdGUgaGFzIG5vIHByb3BlcnRpZXMgYXQgYWxsCisJCQlpZiAoZGF0YSA9PSBudWxsKSB7CisJCQkJLy8gcmV3cml0ZSBhbHJlYWR5IGtub3dzIHRoaXMKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyByZXdyaXRlIGdldHMgaXRzIGZpc3QgcHJvcGVydHkKKwkJCXRoaXMucHJvcGVydHkxID0gcHJvcGVydHlOYW1lOworCQkJdGhpcy5wcm9wZXJ0eTIgPSBkYXRhOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLnByb3BlcnR5MSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gcmV3cml0ZSBoYXMgb25seSBhIHNpbmdsZSBwcm9wZXJ0eQorCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHModGhpcy5wcm9wZXJ0eTEpKSB7CisJCQkJLy8gd2UncmUgaW4gbHVjaworCQkJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCQkJLy8ganVzdCBkZWxldGUgbGFzdCBwcm9wZXJ0eQorCQkJCQl0aGlzLnByb3BlcnR5MSA9IG51bGw7CisJCQkJCXRoaXMucHJvcGVydHkyID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnByb3BlcnR5MiA9IGRhdGE7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCQkvLyB3ZSBhbHJlYWR5IGtub3cgdGhpcworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIHJld3JpdGUgYWxyZWFkeSBoYXMgb25lIHByb3BlcnR5IC0gZ2V0dGluZyBpdHMgc2Vjb25kCisJCQkvLyBjb252ZXJ0IHRvIG1vcmUgZmxleGlibGUgcmVwcmVzZW50YXRpb24KKwkJCU1hcCBtID0gbmV3IEhhc2hNYXAoMyk7CisJCQltLnB1dCh0aGlzLnByb3BlcnR5MSwgdGhpcy5wcm9wZXJ0eTIpOworCQkJbS5wdXQocHJvcGVydHlOYW1lLCBkYXRhKTsKKwkJCXRoaXMucHJvcGVydHkxID0gbTsKKwkJCXRoaXMucHJvcGVydHkyID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQkvLyByZXdyaXRlIGhhcyB0d28gb3IgbW9yZSBwcm9wZXJ0aWVzCisJCU1hcCBtID0gKE1hcCkgdGhpcy5wcm9wZXJ0eTE7CisJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCW0ucmVtb3ZlKHByb3BlcnR5TmFtZSk7CisJCQkvLyBjaGVjayBmb3IganVzdCBvbmUgcHJvcGVydHkgbGVmdAorCQkJaWYgKG0uc2l6ZSgpID09IDEpIHsKKwkJCQkvLyBjb252ZXJ0IHRvIG1vcmUgZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uCisJCQkJTWFwLkVudHJ5W10gZW50cmllcyA9IChNYXAuRW50cnlbXSkgbS5lbnRyeVNldCgpLnRvQXJyYXkobmV3IE1hcC5FbnRyeVsxXSk7CisJCQkJdGhpcy5wcm9wZXJ0eTEgPSBlbnRyaWVzWzBdLmdldEtleSgpOworCQkJCXRoaXMucHJvcGVydHkyID0gZW50cmllc1swXS5nZXRWYWx1ZSgpOworCQkJfQorCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJbS5wdXQocHJvcGVydHlOYW1lLCBkYXRhKTsKKwkJCS8vIHN0aWxsIGhhcyB0d28gb3IgbW9yZSBwcm9wZXJ0aWVzCisJCQlyZXR1cm47CisJCX0KKwl9CisKIAkvKioKIAkgKiBTZXRzIGEgY3VzdG9tIHRhcmdldCBzb3VyY2UgcmFuZ2UgY29tcHV0ZXIgZm9yIHRoaXMgQVNUIHJld3JpdGVyLiBUaGlzIGlzIGFkdmFuY2VkIGZlYXR1cmUgdG8gbW9kaWZ5IGhvdwogCSAqIGNvbW1lbnRzIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9kZXMsIHdoaWNoIHNob3VsZCBiZSBkb25lIG9ubHkgaW4gc3BlY2lhbCBjYXNlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjb21wdXRlciBhIHRhcmdldCBzb3VyY2UgcmFuZ2UgY29tcHV0ZXIsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZgogCSAqIDxjb2RlPm5ldyBUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKCk8L2NvZGU+CiAJICogQHNpbmNlIDMuMQorCSAqIEBzZWUgI2dldEV4dGVuZGVkU291cmNlUmFuZ2VDb21wdXRlcigpCiAJICovCiAJcHVibGljIGZpbmFsIHZvaWQgc2V0VGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcihUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyIGNvbXB1dGVyKSB7Ci0JCS8vIGlmIGNvbXB1dGVyPT1udWxsLCByZWx5IG9uIGxhenkgaW5pdCBjb2RlIGluIGdldFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIoKQorCQkvLyBpZiBjb21wdXRlcj09bnVsbCwgcmVseSBvbiBsYXp5IGluaXQgY29kZSBpbiBnZXRFeHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIoKQogCQl0aGlzLnRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgPSBjb21wdXRlcjsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKG9ubHkpLgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIGRlYnVnIHN0cmluZwogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3Jld3JpdGUvSVRyYWNrZWROb2RlUG9zaXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9JVHJhY2tlZE5vZGVQb3NpdGlvbi5qYXZhCmluZGV4IDBmYzFjZWQuLjc4MmUxZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9JVHJhY2tlZE5vZGVQb3NpdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9JVHJhY2tlZE5vZGVQb3NpdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDI3ICsxNiwyOCBAQAogICogPHA+CiAgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgQVNUUmV3cml0ZSN0cmFjayhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSkKICAqIEBzaW5jZSAzLjAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJVHJhY2tlZE5vZGVQb3NpdGlvbiB7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBvciBtb2RpZmllZCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdHJhY2tlZCBub2RlIGRlcGVuZGluZyBpZiBjYWxsZWQgYmVmb3JlCiAJICogb3IgYWZ0ZXIgdGhlIHJld3JpdGUgaXMgYXBwbGllZC4gPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkIGZvciByZW1vdmVkIG5vZGVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgb3JpZ2luYWwgb3IgbW9kaWZpZWQgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHRyYWNrZWQgbm9kZQogCSAqLwogCXB1YmxpYyBpbnQgZ2V0U3RhcnRQb3NpdGlvbigpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgb3JpZ2luYWwgb3IgbW9kaWZpZWQgbGVuZ3RoIG9mIHRoZSB0cmFja2VkIG5vZGUgZGVwZW5kaW5nIGlmIGNhbGxlZCBiZWZvcmUKIAkgKiBvciBhZnRlciB0aGUgcmV3cml0ZSBpcyBhcHBsaWVkLiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQgZm9yIHJlbW92ZWQgbm9kZXMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBvciBtb2RpZmllZCBsZW5ndGggb2YgdGhlIHRyYWNrZWQgbm9kZQogCSAqLwogCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0JCi0JCisKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0ltcG9ydFJld3JpdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9JbXBvcnRSZXdyaXRlLmphdmEKaW5kZXggNjI3ZThkMS4uYzY2ODA0OSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0ltcG9ydFJld3JpdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3Jld3JpdGUvSW1wb3J0UmV3cml0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDcgKzEyLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKQEAgLTIyLDEyICsyNCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZUFuYWx5emVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwogCkBAIC01NSw1MyArNTksNTMgQEAKICAqIEBzaW5jZSAzLjIKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFJld3JpdGUgewotCQorCiAJLyoqCiAJICogQSB7QGxpbmsgSW1wb3J0UmV3cml0ZS5JbXBvcnRSZXdyaXRlQ29udGV4dH0gY2FuIG9wdGlvbmFsbHkgYmUgdXNlZCBpbiBlLmcuIHtAbGluayBJbXBvcnRSZXdyaXRlI2FkZEltcG9ydChTdHJpbmcsIEltcG9ydFJld3JpdGUuSW1wb3J0UmV3cml0ZUNvbnRleHQpfSB0bwogCSAqIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgdmlzaWJsZSBpbiB0aGUgc2NvcGUuIFRoZXNlIHR5cGVzIGNhbiBiZSBmb3IgZXhhbXBsZSBpbmhlcml0ZWQgaW5uZXIgdHlwZXMgd2hlcmUgaXQgaXMKLQkgKiB1bm5lY2Vzc2FyeSB0byBhZGQgaW1wb3J0IHN0YXRlbWVudHMgZm9yLiAKLQkgKiAKKwkgKiB1bm5lY2Vzc2FyeSB0byBhZGQgaW1wb3J0IHN0YXRlbWVudHMgZm9yLgorCSAqCiAJICogPC9wPgogCSAqIDxwPgogCSAqIFRoaXMgY2xhc3MgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAJICogPC9wPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0UmV3cml0ZUNvbnRleHQgewotCQkKKwogCQkvKioKLQkJICogUmVzdWx0IGNvbnN0YW50IHNpZ25hbGluZyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIGtub3cgaW4gdGhlIGNvbnRleHQuIAorCQkgKiBSZXN1bHQgY29uc3RhbnQgc2lnbmFsaW5nIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMga25vdyBpbiB0aGUgY29udGV4dC4KIAkJICovCiAJCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFU19OQU1FX0ZPVU5EPSAxOwotCQkKKwogCQkvKioKLQkJICogUmVzdWx0IGNvbnN0YW50IHNpZ25hbGluZyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIG5vdCBrbm93IGluIHRoZSBjb250ZXh0LiAKKwkJICogUmVzdWx0IGNvbnN0YW50IHNpZ25hbGluZyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIG5vdCBrbm93IGluIHRoZSBjb250ZXh0LgogCQkgKi8KIAkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVTX05BTUVfVU5LTk9XTj0gMjsKLQkJCisKIAkJLyoqCi0JCSAqIFJlc3VsdCBjb25zdGFudCBzaWduYWxpbmcgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBjb25mbGljdGluZyB3aXRoIGFuIG90aGVyIGVsZW1lbnQgaW4gdGhlIGNvbnRleHQuIAorCQkgKiBSZXN1bHQgY29uc3RhbnQgc2lnbmFsaW5nIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBlbGVtZW50IGluIHRoZSBjb250ZXh0LgogCQkgKi8KIAkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVTX05BTUVfQ09ORkxJQ1Q9IDM7Ci0JCQorCiAJCS8qKgogCQkgKiBLaW5kIGNvbnN0YW50IHNwZWNpZnlpbmcgdGhhdCB0aGUgZWxlbWVudCBpcyBhIHR5cGUgaW1wb3J0LgogCQkgKi8KIAkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9UWVBFPSAxOwotCQkKKwogCQkvKioKIAkJICogS2luZCBjb25zdGFudCBzcGVjaWZ5aW5nIHRoYXQgdGhlIGVsZW1lbnQgaXMgYSBzdGF0aWMgZmllbGQgaW1wb3J0LgogCQkgKi8KIAkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9TVEFUSUNfRklFTEQ9IDI7Ci0JCQorCiAJCS8qKgogCQkgKiBLaW5kIGNvbnN0YW50IHNwZWNpZnlpbmcgdGhhdCB0aGUgZWxlbWVudCBpcyBhIHN0YXRpYyBtZXRob2QgaW1wb3J0LgogCQkgKi8KIAkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9TVEFUSUNfTUVUSE9EPSAzOwotCQkKKwogCQkvKioKIAkJICogU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBjb250ZXh0IGFuZCByZXBvcnRzIGlmIHRoZSBlbGVtZW50IGlzIGtub3duICh7QGxpbmsgI1JFU19OQU1FX0ZPVU5EfSksCiAJCSAqIHVua25vd24gKHtAbGluayAjUkVTX05BTUVfVU5LTk9XTn0pIG9yIGlmIGl0cyBuYW1lIGNvbmZsaWN0cyAoe0BsaW5rICNSRVNfTkFNRV9DT05GTElDVH0pIHdpdGggYW4gb3RoZXIgZWxlbWVudC4KLQkJICogQHBhcmFtIHF1YWxpZmllciBUaGUgcXVhbGlmaWVyIG9mIHRoZSBlbGVtZW50LCBjYW4gYmUgcGFja2FnZSBvciB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSB0eXBlIAorCQkgKiBAcGFyYW0gcXVhbGlmaWVyIFRoZSBxdWFsaWZpZXIgb2YgdGhlIGVsZW1lbnQsIGNhbiBiZSBwYWNrYWdlIG9yIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiBhIHR5cGUKIAkJICogQHBhcmFtIG5hbWUgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBlbGVtZW50OyBlaXRoZXIgYSB0eXBlLCBtZXRob2Qgb3IgZmllbGQgbmFtZSBvciAqIGZvciBvbi1kZW1hbmQgaW1wb3J0cy4KIAkJICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIGVsZW1lbnQuIENhbiBiZSBlaXRoZXIge0BsaW5rICNLSU5EX1RZUEV9LCB7QGxpbmsgI0tJTkRfU1RBVElDX0ZJRUxEfSBvcgogCQkgKiB7QGxpbmsgI0tJTkRfU1RBVElDX01FVEhPRH0uIEltcGxlbWVudG9ycyBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIG5ldywgY3VycmVudGx5IHVuc3BlY2lmaWVkIGtpbmRzIGFuZCByZXR1cm4KQEAgLTExMSwzMCArMTE1LDMyIEBACiAJCSAqLwogCQlwdWJsaWMgYWJzdHJhY3QgaW50IGZpbmRJbkNvbnRleHQoU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUsIGludCBraW5kKTsKIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNUQVRJQ19QUkVGSVg9ICdzJzsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5PUk1BTF9QUkVGSVg9ICduJzsKLQkKKwogCXByaXZhdGUgZmluYWwgSW1wb3J0UmV3cml0ZUNvbnRleHQgZGVmYXVsdENvbnRleHQ7CiAKIAlwcml2YXRlIGZpbmFsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwogCXByaXZhdGUgZmluYWwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3Q7Ci0JCisKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVzdG9yZUV4aXN0aW5nSW1wb3J0czsKIAlwcml2YXRlIGZpbmFsIExpc3QgZXhpc3RpbmdJbXBvcnRzOwotCQorCXByaXZhdGUgZmluYWwgTWFwIGltcG9ydHNLaW5kTWFwOworCiAJcHJpdmF0ZSBTdHJpbmdbXSBpbXBvcnRPcmRlcjsKIAlwcml2YXRlIGludCBpbXBvcnRPbkRlbWFuZFRocmVzaG9sZDsKIAlwcml2YXRlIGludCBzdGF0aWNJbXBvcnRPbkRlbWFuZFRocmVzaG9sZDsKLQkKKwogCXByaXZhdGUgTGlzdCBhZGRlZEltcG9ydHM7CiAJcHJpdmF0ZSBMaXN0IHJlbW92ZWRJbXBvcnRzOwogCiAJcHJpdmF0ZSBTdHJpbmdbXSBjcmVhdGVkSW1wb3J0czsKIAlwcml2YXRlIFN0cmluZ1tdIGNyZWF0ZWRTdGF0aWNJbXBvcnRzOwotCQorCiAJcHJpdmF0ZSBib29sZWFuIGZpbHRlckltcGxpY2l0SW1wb3J0czsKLQkKKwlwcml2YXRlIGJvb2xlYW4gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzOworCiAJLyoqCiAJICogQ3JlYXRlcyBhIHtAbGluayBJbXBvcnRSZXdyaXRlfSBmcm9tIGEge0BsaW5rIElDb21waWxhdGlvblVuaXR9LiBJZiA8Y29kZT5yZXN0b3JlRXhpc3RpbmdJbXBvcnRzPC9jb2RlPgogCSAqIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBhbGwgZXhpc3RpbmcgaW1wb3J0cyBhcmUga2VwdCwgYW5kIG5ldyBpbXBvcnRzIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgYmVzdCBtYXRjaGluZyBsb2NhdGlvbnMuIElmCkBAIC0xNTksMTMgKzE2NSwxMyBAQAogCQkJSUltcG9ydERlY2xhcmF0aW9uW10gaW1wb3J0cz0gY3UuZ2V0SW1wb3J0cygpOwogCQkJZm9yIChpbnQgaT0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKIAkJCQlJSW1wb3J0RGVjbGFyYXRpb24gY3Vycj0gaW1wb3J0c1tpXTsKLQkJCQljaGFyIHByZWZpeD0gRmxhZ3MuaXNTdGF0aWMoY3Vyci5nZXRGbGFncygpKSA/IFNUQVRJQ19QUkVGSVggOiBOT1JNQUxfUFJFRklYOwkJCQorCQkJCWNoYXIgcHJlZml4PSBGbGFncy5pc1N0YXRpYyhjdXJyLmdldEZsYWdzKCkpID8gU1RBVElDX1BSRUZJWCA6IE5PUk1BTF9QUkVGSVg7CiAJCQkJZXhpc3RpbmdJbXBvcnQuYWRkKHByZWZpeCArIGN1cnIuZ2V0RWxlbWVudE5hbWUoKSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG5ldyBJbXBvcnRSZXdyaXRlKGN1LCBudWxsLCBleGlzdGluZ0ltcG9ydCk7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIHtAbGluayBJbXBvcnRSZXdyaXRlfSBmcm9tIGEgYW4gQVNUICh7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSkuIFRoZSBBU1QgaGFzIHRvIGJlIGNyZWF0ZWQgZnJvbSBhCiAJICoge0BsaW5rIElDb21waWxhdGlvblVuaXR9LCB0aGF0IG1lYW5zIHtAbGluayBBU1RQYXJzZXIjc2V0U291cmNlKElDb21waWxhdGlvblVuaXQpfSBoYXMgYmVlbiB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlCkBAIC0yMDYsNyArMjEyLDcgQEAKIAkJfQogCQlyZXR1cm4gbmV3IEltcG9ydFJld3JpdGUoKElDb21waWxhdGlvblVuaXQpIHR5cGVSb290LCBhc3RSb290LCBleGlzdGluZ0ltcG9ydCk7CiAJfQotCQkKKwogCXByaXZhdGUgSW1wb3J0UmV3cml0ZShJQ29tcGlsYXRpb25Vbml0IGN1LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgTGlzdCBleGlzdGluZ0ltcG9ydHMpIHsKIAkJdGhpcy5jb21waWxhdGlvblVuaXQ9IGN1OwogCQl0aGlzLmFzdFJvb3Q9IGFzdFJvb3Q7IC8vIG1pZ2h0IGJlIG51bGwKQEAgLTIxOCw2ICsyMjQsOCBAQAogCQkJdGhpcy5yZXN0b3JlRXhpc3RpbmdJbXBvcnRzPSBmYWxzZTsKIAkJfQogCQl0aGlzLmZpbHRlckltcGxpY2l0SW1wb3J0cz0gdHJ1ZTsKKwkJLy8gY29uc2lkZXIgdGhhdCBubyBjb250ZXh0cyBhcmUgdXNlZAorCQl0aGlzLnVzZUNvbnRleHRUb0ZpbHRlckltcGxpY2l0SW1wb3J0cyA9IGZhbHNlOwogCiAJCXRoaXMuZGVmYXVsdENvbnRleHQ9IG5ldyBJbXBvcnRSZXdyaXRlQ29udGV4dCgpIHsKIAkJCXB1YmxpYyBpbnQgZmluZEluQ29udGV4dChTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgaW50IGtpbmQpIHsKQEAgLTIyOCwzMSArMjM2LDMzIEBACiAJCXRoaXMucmVtb3ZlZEltcG9ydHM9IG51bGw7IC8vIEluaXRpYWxpemVkIG9uIHVzZQogCQl0aGlzLmNyZWF0ZWRJbXBvcnRzPSBudWxsOwogCQl0aGlzLmNyZWF0ZWRTdGF0aWNJbXBvcnRzPSBudWxsOwotCQkKKwogCQl0aGlzLmltcG9ydE9yZGVyPSBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CiAJCXRoaXMuaW1wb3J0T25EZW1hbmRUaHJlc2hvbGQ9IDk5OwogCQl0aGlzLnN0YXRpY0ltcG9ydE9uRGVtYW5kVGhyZXNob2xkPSA5OTsKKwkJCisJCXRoaXMuaW1wb3J0c0tpbmRNYXAgPSBuZXcgSGFzaE1hcCgpOwogCX0KLQkKLQkKKworCiAJIC8qKgogCSAqIERlZmluZXMgdGhlIGltcG9ydCBncm91cHMgYW5kIG9yZGVyIHRvIGJlIHVzZWQgYnkgdGhlIHtAbGluayBJbXBvcnRSZXdyaXRlfS4KIAkgKiBJbXBvcnRzIGFyZSBhZGRlZCB0byB0aGUgZ3JvdXAgbWF0Y2hpbmcgdGhlaXIgcXVhbGlmaWVkIG5hbWUgbW9zdC4gVGhlIGVtcHR5IGdyb3VwIG5hbWUgZ3JvdXBzIGFsbCBpbXBvcnRzIG5vdCBtYXRjaGluZwogCSAqIGFueSBvdGhlciBncm91cC4gU3RhdGljIGltcG9ydHMgYXJlIG1hbmFnZWQgaW4gc2VwYXJhdGUgZ3JvdXBzLiBTdGF0aWMgaW1wb3J0IGdyb3VwIG5hbWVzIGFyZSBwcmVmaXhlZCB3aXRoIGEgJyMnIGNoYXJhY3Rlci4KIAkgKiBAcGFyYW0gb3JkZXIgQSBsaXN0IG9mIHN0cmluZ3MgZGVmaW5pbmcgdGhlIGltcG9ydCBncm91cHMuIEEgZ3JvdXAgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcGFja2FnZSBuYW1lIG9yIGVtcHR5LiBJZiBjYW4gYmUKLQkgKiBwcmVmaXhlZCBieSB0aGUgJyMnIGNoYXJhY3RlciBmb3Igc3RhdGljIGltcG9ydCBncm91cHMgCisJICogcHJlZml4ZWQgYnkgdGhlICcjJyBjaGFyYWN0ZXIgZm9yIHN0YXRpYyBpbXBvcnQgZ3JvdXBzCiAJICovCiAJcHVibGljIHZvaWQgc2V0SW1wb3J0T3JkZXIoU3RyaW5nW10gb3JkZXIpIHsKIAkJaWYgKG9yZGVyID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcmRlciBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAkJdGhpcy5pbXBvcnRPcmRlcj0gb3JkZXI7CiAJfQotCQorCiAJIC8qKgogCSAqCVNldHMgdGhlIG9uLWRlbWFuZCBpbXBvcnQgdGhyZXNob2xkIGZvciBub3JtYWwgKG5vbi1zdGF0aWMpIGltcG9ydHMuCiAJICoJVGhpcyB0aHJlc2hvbGQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGltcG9ydHMgdGhhdCBuZWVkIHRvIGJlIGluIGEgZ3JvdXAgdG8gdXNlCiAJICogYSBvbi1kZW1hbmQgKHN0YXIpIGltcG9ydCBkZWNsYXJhdGlvbiBpbnN0ZWFkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHRocmVzaG9sZCBhIHBvc2l0aXZlIG51bWJlciBkZWZpbmluZyB0aGUgb24tZGVtYW5kIGltcG9ydCB0aHJlc2hvbGQKIAkgKiBmb3Igbm9ybWFsIChub24tc3RhdGljKSBpbXBvcnRzLgogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGEge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duCkBAIC0yNjMsMTIgKzI3MywxMiBAQAogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhyZXNob2xkIG11c3QgYmUgcG9zaXRpdmUuIik7IC8vJE5PTi1OTFMtMSQKIAkJdGhpcy5pbXBvcnRPbkRlbWFuZFRocmVzaG9sZD0gdGhyZXNob2xkOwogCX0KLQkKKwogCSAvKioKIAkgKglTZXRzIHRoZSBvbi1kZW1hbmQgaW1wb3J0IHRocmVzaG9sZCBmb3Igc3RhdGljIGltcG9ydHMuCiAJICoJVGhpcyB0aHJlc2hvbGQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGltcG9ydHMgdGhhdCBuZWVkIHRvIGJlIGluIGEgZ3JvdXAgdG8gdXNlCiAJICogYSBvbi1kZW1hbmQgKHN0YXIpIGltcG9ydCBkZWNsYXJhdGlvbiBpbnN0ZWFkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHRocmVzaG9sZCBhIHBvc2l0aXZlIG51bWJlciBkZWZpbmluZyB0aGUgb24tZGVtYW5kIGltcG9ydCB0aHJlc2hvbGQKIAkgKiBmb3Igbm9ybWFsIChub24tc3RhdGljKSBpbXBvcnRzLgogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGEge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duCkBAIC0yNzksNyArMjg5LDcgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRocmVzaG9sZCBtdXN0IGJlIHBvc2l0aXZlLiIpOyAvLyROT04tTkxTLTEkCiAJCXRoaXMuc3RhdGljSW1wb3J0T25EZW1hbmRUaHJlc2hvbGQ9IHRocmVzaG9sZDsKIAl9Ci0JCisKIAkvKioKIAkgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBmb3Igd2hpY2ggdGhpcyBpbXBvcnQgcmV3cml0ZSB3YXMgY3JlYXRlZCBmb3IuCiAJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3Igd2hpY2ggdGhpcyBpbXBvcnQgcmV3cml0ZSB3YXMgY3JlYXRlZCBmb3IuCkBAIC0yOTYsNDIgKzMwNiw3MyBAQAogCXB1YmxpYyBJbXBvcnRSZXdyaXRlQ29udGV4dCBnZXREZWZhdWx0SW1wb3J0UmV3cml0ZUNvbnRleHQoKSB7CiAJCXJldHVybiB0aGlzLmRlZmF1bHRDb250ZXh0OwogCX0KLQkKKwogCS8qKgotCSAqIFNwZWNpZmllcyB0aGF0IGltcGxpY2l0IGltcG9ydHMgKHR5cGVzIGluIGRlZmF1bHQgcGFja2FnZSwgcGFja2FnZSA8Y29kZT5qYXZhLmxhbmc8L2NvZGU+IG9yCi0JICogaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgcmV3cml0ZSBjb21waWxhdGlvbiB1bml0IHNob3VsZCBub3QgYmUgY3JlYXRlZCBleGNlcHQgaWYgbmVjZXNzYXJ5Ci0JICogdG8gcmVzb2x2ZSBhbiBvbi1kZW1hbmQgaW1wb3J0IGNvbmZsaWN0LiBUaGUgZmlsdGVyIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLQkgKiBAcGFyYW0gZmlsdGVySW1wbGljaXRJbXBvcnRzIGlmIHNldCwgaW1wbGljaXQgaW1wb3J0cyB3aWxsIGJlIGZpbHRlcmVkLgorCSAqIFNwZWNpZmllcyB0aGF0IGltcGxpY2l0IGltcG9ydHMgKGZvciB0eXBlcyBpbiA8Y29kZT5qYXZhLmxhbmc8L2NvZGU+LCB0eXBlcyBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSByZXdyaXRlCisJICogY29tcGlsYXRpb24gdW5pdCwgYW5kIHR5cGVzIGluIHRoZSBjb21waWxhdGlvbiB1bml0J3MgbWFpbiB0eXBlKSBzaG91bGQgbm90IGJlIGNyZWF0ZWQsIGV4Y2VwdCBpZiBuZWNlc3NhcnkgdG8KKwkgKiByZXNvbHZlIGFuIG9uLWRlbWFuZCBpbXBvcnQgY29uZmxpY3QuCisJICogPHA+CisJICogVGhlIGZpbHRlciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGU6IHtAbGluayAjc2V0VXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzKGJvb2xlYW4pfSBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgaW1wbGljaXQgaW1wb3J0cworCSAqIHdoZW4gYSBjb250ZXh0IGlzIHVzZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBmaWx0ZXJJbXBsaWNpdEltcG9ydHMKKwkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBpbXBsaWNpdCBpbXBvcnRzIHdpbGwgYmUgZmlsdGVyZWQKKwkgKiAKKwkgKiBAc2VlICNzZXRVc2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMoYm9vbGVhbikKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJJbXBsaWNpdEltcG9ydHMoYm9vbGVhbiBmaWx0ZXJJbXBsaWNpdEltcG9ydHMpIHsKIAkJdGhpcy5maWx0ZXJJbXBsaWNpdEltcG9ydHM9IGZpbHRlckltcGxpY2l0SW1wb3J0czsKIAl9CisKKwkvKioKKwkqIFNldHMgd2hldGhlciBhIGNvbnRleHQgc2hvdWxkIGJlIHVzZWQgdG8gcHJvcGVybHkgZmlsdGVyIGltcGxpY2l0IGltcG9ydHMuCisJKiA8cD4KKwkqIEJ5IGRlZmF1bHQsIHRoZSBvcHRpb24gaXMgZGlzYWJsZWQgdG8gcHJlc2VydmUgcHJlLTMuNiBiZWhhdmlvci4KKwkqIDwvcD4KKwkqIDxwPgorCSogV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSBjb250ZXh0IHBhc3NlZCB0byB0aGUgPGNvZGU+YWRkSW1wb3J0KiguLi4pPC9jb2RlPiBtZXRob2RzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisJKiB3aGV0aGVyIGFuIGltcG9ydCBjYW4gYmUgZmlsdGVyZWQgYmVjYXVzZSB0aGUgdHlwZSBpcyBpbXBsaWNpdGx5IHZpc2libGUuIE5vdGUgdGhhdCB0b28gbWFueSBpbXBvcnRzCisJKiBtYXkgYmUga2VwdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgYW5kIDxjb2RlPmFkZEltcG9ydCooLi4uKTwvY29kZT4gbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYSBjb250ZXh0LgorCSogPC9wPgorCSogCisJKiBAcGFyYW0gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzIHRoZSBnaXZlbiBzZXR0aW5nCisJKiAKKwkqIEBzZWUgI3NldEZpbHRlckltcGxpY2l0SW1wb3J0cyhib29sZWFuKQorCSogQHNpbmNlIDMuNgorCSovCisJcHVibGljIHZvaWQgc2V0VXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzKGJvb2xlYW4gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzKSB7CisJCXRoaXMudXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzID0gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzOworCX0KIAkKIAlwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZUltcG9ydChjaGFyIHByZWZpeCwgU3RyaW5nIHF1YWxpZmllciwgU3RyaW5nIG5hbWUsIFN0cmluZyBjdXJyKSB7CiAJCWlmIChjdXJyLmNoYXJBdCgwKSAhPSBwcmVmaXggfHwgIWN1cnIuZW5kc1dpdGgobmFtZSkpIHsKIAkJCXJldHVybiBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9VTktOT1dOOwogCQl9Ci0JCQorCiAJCWN1cnI9IGN1cnIuc3Vic3RyaW5nKDEpOyAvLyByZW1vdmUgdGhlIHByZWZpeAotCQkKKwogCQlpZiAoY3Vyci5sZW5ndGgoKSA9PSBuYW1lLmxlbmd0aCgpKSB7CiAJCQlpZiAocXVhbGlmaWVyLmxlbmd0aCgpID09IDApIHsKIAkJCQlyZXR1cm4gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfRk9VTkQ7CiAJCQl9Ci0JCQlyZXR1cm4gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfQ09ORkxJQ1Q7IAorCQkJcmV0dXJuIEltcG9ydFJld3JpdGVDb250ZXh0LlJFU19OQU1FX0NPTkZMSUNUOwogCQl9CiAJCS8vIGF0IHRoaXMgcGxhY2U6IGN1cnIubGVuZ3RoID4gbmFtZS5sZW5ndGgKLQkJCisKIAkJaW50IGRvdFBvcz0gY3Vyci5sZW5ndGgoKSAtIG5hbWUubGVuZ3RoKCkgLSAxOwogCQlpZiAoY3Vyci5jaGFyQXQoZG90UG9zKSAhPSAnLicpIHsKIAkJCXJldHVybiBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9VTktOT1dOOwogCQl9CiAJCWlmIChxdWFsaWZpZXIubGVuZ3RoKCkgIT0gZG90UG9zIHx8ICFjdXJyLnN0YXJ0c1dpdGgocXVhbGlmaWVyKSkgewotCQkJcmV0dXJuIEltcG9ydFJld3JpdGVDb250ZXh0LlJFU19OQU1FX0NPTkZMSUNUOyAKKwkJCXJldHVybiBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9DT05GTElDVDsKIAkJfQotCQlyZXR1cm4gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfRk9VTkQ7IAorCQlyZXR1cm4gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfRk9VTkQ7CiAJfQotCQorCiAJLyoqCiAJICogTm90IEFQSSwgcGFja2FnZSB2aXNpYmlsaXR5IGFzIGFjY2Vzc2VkIGZyb20gYW4gYW5vbnltb3VzIHR5cGUKIAkgKi8KQEAgLTMzOSwxOSArMzgwLDMzIEBACiAJCWJvb2xlYW4gYWxsb3dBbWJpZ3VpdHk9ICAoa2luZCA9PSBJbXBvcnRSZXdyaXRlQ29udGV4dC5LSU5EX1NUQVRJQ19NRVRIT0QpIHx8IChuYW1lLmxlbmd0aCgpID09IDEgJiYgbmFtZS5jaGFyQXQoMCkgPT0gJyonKTsKIAkJTGlzdCBpbXBvcnRzPSB0aGlzLmV4aXN0aW5nSW1wb3J0czsKIAkJY2hhciBwcmVmaXg9IChraW5kID09IEltcG9ydFJld3JpdGVDb250ZXh0LktJTkRfVFlQRSkgPyBOT1JNQUxfUFJFRklYIDogU1RBVElDX1BSRUZJWDsKLQkJCisKIAkJZm9yIChpbnQgaT0gaW1wb3J0cy5zaXplKCkgLSAxOyBpID49IDAgOyBpLS0pIHsKIAkJCVN0cmluZyBjdXJyPSAoU3RyaW5nKSBpbXBvcnRzLmdldChpKTsKIAkJCWludCByZXM9IGNvbXBhcmVJbXBvcnQocHJlZml4LCBxdWFsaWZpZXIsIG5hbWUsIGN1cnIpOwogCQkJaWYgKHJlcyAhPSBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9VTktOT1dOKSB7CiAJCQkJaWYgKCFhbGxvd0FtYmlndWl0eSB8fCByZXMgPT0gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfRk9VTkQpIHsKLQkJCQkJcmV0dXJuIHJlczsKKwkJCQkJaWYgKHByZWZpeCAhPSBTVEFUSUNfUFJFRklYKSB7CisJCQkJCQlyZXR1cm4gcmVzOworCQkJCQl9CisJCQkJCU9iamVjdCBjdXJyS2luZCA9IHRoaXMuaW1wb3J0c0tpbmRNYXAuZ2V0KGN1cnIuc3Vic3RyaW5nKDEpKTsKKwkJCQkJaWYgKGN1cnJLaW5kICE9IG51bGwgJiYgY3VycktpbmQuZXF1YWxzKHRoaXMuaW1wb3J0c0tpbmRNYXAuZ2V0KHF1YWxpZmllciArICcuJyArIG5hbWUpKSkgeworCQkJCQkJcmV0dXJuIHJlczsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQorCQlpZiAodGhpcy5maWx0ZXJJbXBsaWNpdEltcG9ydHMgJiYgdGhpcy51c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMpIHsKKwkJCVN0cmluZyBmUGFja2FnZU5hbWU9IHRoaXMuY29tcGlsYXRpb25Vbml0LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7CisJCQlTdHJpbmcgbWFpblR5cGVTaW1wbGVOYW1lPSBKYXZhQ29yZS5yZW1vdmVKYXZhTGlrZUV4dGVuc2lvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCVN0cmluZyBmTWFpblR5cGVOYW1lPSBVdGlsLmNvbmNhdGVuYXRlTmFtZShmUGFja2FnZU5hbWUsIG1haW5UeXBlU2ltcGxlTmFtZSwgJy4nKTsKKwkJCWlmIChraW5kID09IEltcG9ydFJld3JpdGVDb250ZXh0LktJTkRfVFlQRQorCQkJCQkmJiAocXVhbGlmaWVyLmVxdWFscyhmUGFja2FnZU5hbWUpCisJCQkJCQkJfHwgZk1haW5UeXBlTmFtZS5lcXVhbHMoVXRpbC5jb25jYXRlbmF0ZU5hbWUocXVhbGlmaWVyLCBuYW1lLCAnLicpKSkpCisJCQkJcmV0dXJuIEltcG9ydFJld3JpdGVDb250ZXh0LlJFU19OQU1FX0ZPVU5EOworCQl9CiAJCXJldHVybiBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9VTktOT1dOOwogCX0KLQogCS8qKgogCSAqIEFkZHMgYSBuZXcgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHtAbGluayBUeXBlfSBub2RlIHRoYXQgY2FuIGJlIHVzZWQKIAkgKiBpbiB0aGUgY29kZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZS4gVGhlIHR5cGUgYmluZGluZyBjYW4gYmUgYW4gYXJyYXkgYmluZGluZywgdHlwZSB2YXJpYWJsZSBvciB3aWxkY2FyZC4KQEAgLTM3Myw3ICs0MjgsNyBAQAogCXB1YmxpYyBUeXBlIGFkZEltcG9ydEZyb21TaWduYXR1cmUoU3RyaW5nIHR5cGVTaWcsIEFTVCBhc3QpIHsKIAkJcmV0dXJuIGFkZEltcG9ydEZyb21TaWduYXR1cmUodHlwZVNpZywgYXN0LCB0aGlzLmRlZmF1bHRDb250ZXh0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBZGRzIGEgbmV3IGltcG9ydCB0byB0aGUgcmV3cml0ZXIncyByZWNvcmQgYW5kIHJldHVybnMgYSB7QGxpbmsgVHlwZX0gbm9kZSB0aGF0IGNhbiBiZSB1c2VkCiAJICogaW4gdGhlIGNvZGUgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUuIFRoZSB0eXBlIGJpbmRpbmcgY2FuIGJlIGFuIGFycmF5IGJpbmRpbmcsIHR5cGUgdmFyaWFibGUgb3Igd2lsZGNhcmQuCkBAIC0zOTQsNyArNDQ5LDcgQEAKIAkgKiBAcmV0dXJuIHJldHVybnMgYSB0eXBlIHRvIHdoaWNoIHRoZSB0eXBlIGJpbmRpbmcgY2FuIGJlIGFzc2lnbmVkIHRvLiBUaGUgcmV0dXJuZWQgdHlwZSBjb250YWlucyBpcyB1bnF1YWxpZmllZAogCSAqIHdoZW4gYW4gaW1wb3J0IGNvdWxkIGJlIGFkZGVkIG9yIHdhcyBhbHJlYWR5IGtub3duLiBJdCBpcyBmdWxseSBxdWFsaWZpZWQsIGlmIGFuIGltcG9ydCBjb25mbGljdCBwcmV2ZW50ZWQgdGhlIGltcG9ydC4KIAkgKi8KLQlwdWJsaWMgVHlwZSBhZGRJbXBvcnRGcm9tU2lnbmF0dXJlKFN0cmluZyB0eXBlU2lnLCBBU1QgYXN0LCBJbXBvcnRSZXdyaXRlQ29udGV4dCBjb250ZXh0KSB7CQorCXB1YmxpYyBUeXBlIGFkZEltcG9ydEZyb21TaWduYXR1cmUoU3RyaW5nIHR5cGVTaWcsIEFTVCBhc3QsIEltcG9ydFJld3JpdGVDb250ZXh0IGNvbnRleHQpIHsKIAkJaWYgKHR5cGVTaWcgPT0gbnVsbCB8fCB0eXBlU2lnLmxlbmd0aCgpID09IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSBzaWduYXR1cmU6IGVtcHR5IG9yIG51bGwiKTsgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC00NDQsNyArNDk5LDcgQEAKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHR5cGUgc2lnbmF0dXJlIGtpbmQ6ICIgKyB0eXBlU2lnKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCQorCiAKIAogCS8qKgpAQCAtNDUyLDcgKzUwNyw3IEBACiAJICogaW4gdGhlIGNvZGUuIFRoZSB0eXBlIGJpbmRpbmcgY2FuIGJlIGFuIGFycmF5IGJpbmRpbmcsIHR5cGUgdmFyaWFibGUgb3Igd2lsZGNhcmQuCiAJICogSWYgdGhlIGJpbmRpbmcgaXMgYSBnZW5lcmljIHR5cGUsIHRoZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuIEZvciBwYXJhbWV0ZXJpemVkIHR5cGVzLCBhbHNvIHRoZSB0eXBlCiAJICogYXJndW1lbnRzIGFyZSBwcm9jZXNzZWQgYW5kIGltcG9ydHMgYWRkZWQgaWYgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdHlwZXMgaW5zaWRlIHR5cGUgYXJndW1lbnRzIGFyZSBub3JtYWxpemVkIHRvIHRoZWlyIGJhc2UgdHlwZSwgd2lsZGNhcmQKLQkgKiBvZiB3aWxkY2FyZHMgYXJlIGlnbm9yZWQuIAorCSAqIG9mIHdpbGRjYXJkcyBhcmUgaWdub3JlZC4KIAkgKiAJPHA+CiAgCSAqIE5vIGltcG9ydHMgYXJlIGFkZGVkIGZvciB0eXBlcyB0aGF0IGFyZSBhbHJlYWR5IGtub3duLiBJZiBhIGltcG9ydCBmb3IgYSB0eXBlIGlzIHJlY29yZGVkIHRvIGJlIHJlbW92ZWQsIHRoaXMgcmVjb3JkIGlzIGRpc2NhcmRlZCBpbnN0ZWFkLgogCSAqIDwvcD4KQEAgLTQ2Nyw3ICs1MjIsNyBAQAogCXB1YmxpYyBTdHJpbmcgYWRkSW1wb3J0KElUeXBlQmluZGluZyBiaW5kaW5nKSB7CiAJCXJldHVybiBhZGRJbXBvcnQoYmluZGluZywgdGhpcy5kZWZhdWx0Q29udGV4dCk7CiAJfQotCQkKKwogCS8qKgogCSAqIEFkZHMgYSBuZXcgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHVzZWQKIAkgKiBpbiB0aGUgY29kZS4gVGhlIHR5cGUgYmluZGluZyBjYW4gYmUgYW4gYXJyYXkgYmluZGluZywgdHlwZSB2YXJpYWJsZSBvciB3aWxkY2FyZC4KQEAgLTQ5MSw3ICs1NDYsNyBAQAogCQlpZiAoYmluZGluZy5pc1ByaW1pdGl2ZSgpIHx8IGJpbmRpbmcuaXNUeXBlVmFyaWFibGUoKSB8fCBiaW5kaW5nLmlzUmVjb3ZlcmVkKCkpIHsKIAkJCXJldHVybiBiaW5kaW5nLmdldE5hbWUoKTsKIAkJfQotCQkKKwogCQlJVHlwZUJpbmRpbmcgbm9ybWFsaXplZEJpbmRpbmc9IG5vcm1hbGl6ZVR5cGVCaW5kaW5nKGJpbmRpbmcpOwogCQlpZiAobm9ybWFsaXplZEJpbmRpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuICJpbnZhbGlkIjsgLy8kTk9OLU5MUy0xJApAQCAtNTA5LDcgKzU2NCw3IEBACiAJCQl9CiAJCQlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7CiAJCX0KLQkJCisKIAkJaWYgKG5vcm1hbGl6ZWRCaW5kaW5nLmlzQXJyYXkoKSkgewogCQkJU3RyaW5nQnVmZmVyIHJlcz0gbmV3IFN0cmluZ0J1ZmZlcihhZGRJbXBvcnQobm9ybWFsaXplZEJpbmRpbmcuZ2V0RWxlbWVudFR5cGUoKSwgY29udGV4dCkpOwogCQkJZm9yIChpbnQgaT0gbm9ybWFsaXplZEJpbmRpbmcuZ2V0RGltZW5zaW9ucygpOyBpID4gMDsgaS0tKSB7CkBAIC01MTcsMTggKzU3MiwxOCBAQAogCQkJfQogCQkJcmV0dXJuIHJlcy50b1N0cmluZygpOwogCQl9Ci0JCisKIAkJU3RyaW5nIHF1YWxpZmllZE5hbWU9IGdldFJhd1F1YWxpZmllZE5hbWUobm9ybWFsaXplZEJpbmRpbmcpOwogCQlpZiAocXVhbGlmaWVkTmFtZS5sZW5ndGgoKSA+IDApIHsKIAkJCVN0cmluZyBzdHI9IGludGVybmFsQWRkSW1wb3J0KHF1YWxpZmllZE5hbWUsIGNvbnRleHQpOwotCQkJCisKIAkJCUlUeXBlQmluZGluZ1tdIHR5cGVBcmd1bWVudHM9IG5vcm1hbGl6ZWRCaW5kaW5nLmdldFR5cGVBcmd1bWVudHMoKTsKIAkJCWlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHsKIAkJCQlTdHJpbmdCdWZmZXIgcmVzPSBuZXcgU3RyaW5nQnVmZmVyKHN0cik7CiAJCQkJcmVzLmFwcGVuZCgnPCcpOwogCQkJCWZvciAoaW50IGk9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCWlmIChpID4gMCkgewotCQkJCQkJcmVzLmFwcGVuZCgnLCcpOyAKKwkJCQkJCXJlcy5hcHBlbmQoJywnKTsKIAkJCQkJfQogCQkJCQlJVHlwZUJpbmRpbmcgY3Vycj0gdHlwZUFyZ3VtZW50c1tpXTsKIAkJCQkJaWYgKGNvbnRhaW5zTmVzdGVkQ2FwdHVyZShjdXJyLCBmYWxzZSkpIHsgLy8gc2VlIGJ1ZyAxMDMwNDQKQEAgLTU0NCw3ICs1OTksNyBAQAogCQl9CiAJCXJldHVybiBnZXRSYXdOYW1lKG5vcm1hbGl6ZWRCaW5kaW5nKTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNOZXN0ZWRDYXB0dXJlKElUeXBlQmluZGluZyBiaW5kaW5nLCBib29sZWFuIGlzTmVzdGVkKSB7CiAJCWlmIChiaW5kaW5nID09IG51bGwgfHwgYmluZGluZy5pc1ByaW1pdGl2ZSgpIHx8IGJpbmRpbmcuaXNUeXBlVmFyaWFibGUoKSkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNTUzLDcgKzYwOCw3IEBACiAJCQlpZiAoaXNOZXN0ZWQpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KLQkJCXJldHVybiBjb250YWluc05lc3RlZENhcHR1cmUoYmluZGluZy5nZXRXaWxkY2FyZCgpLCB0cnVlKTsgCisJCQlyZXR1cm4gY29udGFpbnNOZXN0ZWRDYXB0dXJlKGJpbmRpbmcuZ2V0V2lsZGNhcmQoKSwgdHJ1ZSk7CiAJCX0KIAkJaWYgKGJpbmRpbmcuaXNXaWxkY2FyZFR5cGUoKSkgewogCQkJcmV0dXJuIGNvbnRhaW5zTmVzdGVkQ2FwdHVyZShiaW5kaW5nLmdldEJvdW5kKCksIHRydWUpOwpAQCAtNTY5LDcgKzYyNCw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBjb250YWluc05lc3RlZENhcHR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgewogCQlyZXR1cm4gc2lnbmF0dXJlLmxlbmd0aCgpID4gMSAmJiBzaWduYXR1cmUuaW5kZXhPZihTaWduYXR1cmUuQ19DQVBUVVJFLCAxKSAhPSAtMTsKIAl9CkBAIC01OTAsNyArNjQ1LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBBZGRzIGEgbmV3IGltcG9ydCB0byB0aGUgcmV3cml0ZXIncyByZWNvcmQgYW5kIHJldHVybnMgYSB7QGxpbmsgVHlwZX0gdGhhdCBjYW4gYmUgdXNlZAogCSAqIGluIHRoZSBjb2RlLiBUaGUgdHlwZSBiaW5kaW5nIGNhbiBiZSBhbiBhcnJheSBiaW5kaW5nLCB0eXBlIHZhcmlhYmxlIG9yIHdpbGRjYXJkLgpAQCAtNjEyLDEzICs2NjcsMTMgQEAKIAlwdWJsaWMgVHlwZSBhZGRJbXBvcnQoSVR5cGVCaW5kaW5nIGJpbmRpbmcsIEFTVCBhc3QpIHsKIAkJcmV0dXJuIGFkZEltcG9ydChiaW5kaW5nLCBhc3QsIHRoaXMuZGVmYXVsdENvbnRleHQpOwogCX0KLQkKKwogCS8qKgogCSAqIEFkZHMgYSBuZXcgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHtAbGluayBUeXBlfSB0aGF0IGNhbiBiZSB1c2VkCiAJICogaW4gdGhlIGNvZGUuIFRoZSB0eXBlIGJpbmRpbmcgY2FuIGJlIGFuIGFycmF5IGJpbmRpbmcsIHR5cGUgdmFyaWFibGUgb3Igd2lsZGNhcmQuCiAJICogSWYgdGhlIGJpbmRpbmcgaXMgYSBnZW5lcmljIHR5cGUsIHRoZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuIEZvciBwYXJhbWV0ZXJpemVkIHR5cGVzLCBhbHNvIHRoZSB0eXBlCiAJICogYXJndW1lbnRzIGFyZSBwcm9jZXNzZWQgYW5kIGltcG9ydHMgYWRkZWQgaWYgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdHlwZXMgaW5zaWRlIHR5cGUgYXJndW1lbnRzIGFyZSBub3JtYWxpemVkIHRvIHRoZWlyIGJhc2UgdHlwZSwgd2lsZGNhcmQKLQkgKiBvZiB3aWxkY2FyZHMgYXJlIGlnbm9yZWQuIAorCSAqIG9mIHdpbGRjYXJkcyBhcmUgaWdub3JlZC4KIAkgKiAJPHA+CiAgCSAqIE5vIGltcG9ydHMgYXJlIGFkZGVkIGZvciB0eXBlcyB0aGF0IGFyZSBhbHJlYWR5IGtub3duLiBJZiBhIGltcG9ydCBmb3IgYSB0eXBlIGlzIHJlY29yZGVkIHRvIGJlIHJlbW92ZWQsIHRoaXMgcmVjb3JkIGlzIGRpc2NhcmRlZCBpbnN0ZWFkLgogCSAqIDwvcD4KQEAgLTYzNywxMiArNjkyLDEyIEBACiAJCWlmIChiaW5kaW5nLmlzUHJpbWl0aXZlKCkpIHsKIAkJCXJldHVybiBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnRvQ29kZShiaW5kaW5nLmdldE5hbWUoKSkpOwogCQl9Ci0JCQorCiAJCUlUeXBlQmluZGluZyBub3JtYWxpemVkQmluZGluZz0gbm9ybWFsaXplVHlwZUJpbmRpbmcoYmluZGluZyk7CiAJCWlmIChub3JtYWxpemVkQmluZGluZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoImludmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQkKKwogCQlpZiAobm9ybWFsaXplZEJpbmRpbmcuaXNUeXBlVmFyaWFibGUoKSkgewogCQkJLy8gbm8gaW1wb3J0CiAJCQlyZXR1cm4gYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoYmluZGluZy5nZXROYW1lKCkpKTsKQEAgLTY1NiwxNiArNzExLDE2IEBACiAJCQl9CiAJCQlyZXR1cm4gd2NUeXBlOwogCQl9Ci0JCQorCiAJCWlmIChub3JtYWxpemVkQmluZGluZy5pc0FycmF5KCkpIHsKIAkJCVR5cGUgZWxlbWVudFR5cGU9IGFkZEltcG9ydChub3JtYWxpemVkQmluZGluZy5nZXRFbGVtZW50VHlwZSgpLCBhc3QsIGNvbnRleHQpOwogCQkJcmV0dXJuIGFzdC5uZXdBcnJheVR5cGUoZWxlbWVudFR5cGUsIG5vcm1hbGl6ZWRCaW5kaW5nLmdldERpbWVuc2lvbnMoKSk7CiAJCX0KLQkJCisKIAkJU3RyaW5nIHF1YWxpZmllZE5hbWU9IGdldFJhd1F1YWxpZmllZE5hbWUobm9ybWFsaXplZEJpbmRpbmcpOwogCQlpZiAocXVhbGlmaWVkTmFtZS5sZW5ndGgoKSA+IDApIHsKIAkJCVN0cmluZyByZXM9IGludGVybmFsQWRkSW1wb3J0KHF1YWxpZmllZE5hbWUsIGNvbnRleHQpOwotCQkJCisKIAkJCUlUeXBlQmluZGluZ1tdIHR5cGVBcmd1bWVudHM9IG5vcm1hbGl6ZWRCaW5kaW5nLmdldFR5cGVBcmd1bWVudHMoKTsKIAkJCWlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHsKIAkJCQlUeXBlIGVyYXN1cmVUeXBlPSBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShyZXMpKTsKQEAgLTY4Niw3ICs3NDEsNyBAQAogCQlyZXR1cm4gYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUoZ2V0UmF3TmFtZShub3JtYWxpemVkQmluZGluZykpKTsKIAl9CiAKLQkKKwogCS8qKgogCSAqIEFkZHMgYSBuZXcgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHVzZWQKIAkgKiBpbiB0aGUgY29kZS4gVGhlIHR5cGUgYmluZGluZyBjYW4gb25seSBiZSBhbiBhcnJheSBvciBub24tZ2VuZXJpYyB0eXBlLgpAQCAtNzE0LDcgKzc2OSw3IEBACiAJCX0KIAkJcmV0dXJuIGludGVybmFsQWRkSW1wb3J0KHF1YWxpZmllZFR5cGVOYW1lLCBjb250ZXh0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBZGRzIGEgbmV3IGltcG9ydCB0byB0aGUgcmV3cml0ZXIncyByZWNvcmQgYW5kIHJldHVybnMgYSB0eXBlIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSB1c2VkCiAJICogaW4gdGhlIGNvZGUuIFRoZSB0eXBlIGJpbmRpbmcgY2FuIG9ubHkgYmUgYW4gYXJyYXkgb3Igbm9uLWdlbmVyaWMgdHlwZS4KQEAgLTczMiw3ICs3ODcsNyBAQAogCXB1YmxpYyBTdHJpbmcgYWRkSW1wb3J0KFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSkgewogCQlyZXR1cm4gYWRkSW1wb3J0KHF1YWxpZmllZFR5cGVOYW1lLCB0aGlzLmRlZmF1bHRDb250ZXh0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBBZGRzIGEgbmV3IHN0YXRpYyBpbXBvcnQgdG8gdGhlIHJld3JpdGVyJ3MgcmVjb3JkIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGNvZGUuIFRoZSByZWZlcmVuY2Ugd2lsbAogCSAqIGJlIGZ1bGx5IHF1YWxpZmllZCBpZiBhbiBpbXBvcnQgY29uZmxpY3QgcHJldmVudGVkIHRoZSBpbXBvcnQgb3IgdW5xdWFsaWZpZWQgaWYgdGhlIGltcG9ydCBzdWNjZWVkZWQgb3Igd2FzIGFscmVhZHkKQEAgLTc1Myw3ICs4MDgsNyBAQAogCXB1YmxpYyBTdHJpbmcgYWRkU3RhdGljSW1wb3J0KElCaW5kaW5nIGJpbmRpbmcpIHsKIAkJcmV0dXJuIGFkZFN0YXRpY0ltcG9ydChiaW5kaW5nLCB0aGlzLmRlZmF1bHRDb250ZXh0KTsKIAl9Ci0JCQorCiAJLyoqCiAJICogQWRkcyBhIG5ldyBzdGF0aWMgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBjb2RlLiBUaGUgcmVmZXJlbmNlIHdpbGwKIAkgKiBiZSBmdWxseSBxdWFsaWZpZWQgaWYgYW4gaW1wb3J0IGNvbmZsaWN0IHByZXZlbnRlZCB0aGUgaW1wb3J0IG9yIHVucXVhbGlmaWVkIGlmIHRoZSBpbXBvcnQgc3VjY2VlZGVkIG9yIHdhcyBhbHJlYWR5CkBAIC03NzMsNyArODI4LDcgQEAKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhlIGJpbmRpbmcgaXMgbm90IGEgc3RhdGljIGZpZWxkCiAJICogb3IgbWV0aG9kLgogCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRkU3RhdGljSW1wb3J0KElCaW5kaW5nIGJpbmRpbmcsIEltcG9ydFJld3JpdGVDb250ZXh0IGNvbnRleHQpIHsJCQorCXB1YmxpYyBTdHJpbmcgYWRkU3RhdGljSW1wb3J0KElCaW5kaW5nIGJpbmRpbmcsIEltcG9ydFJld3JpdGVDb250ZXh0IGNvbnRleHQpIHsKIAkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpKSB7CiAJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpIHsKIAkJCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZz0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7CkBAIC03ODgsNyArODQzLDcgQEAKIAkJfQogCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCaW5kaW5nIG11c3QgYmUgYSBzdGF0aWMgZmllbGQgb3IgbWV0aG9kLiIpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJLyoqCiAJICogQWRkcyBhIG5ldyBzdGF0aWMgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBjb2RlLiBUaGUgcmVmZXJlbmNlIHdpbGwKIAkgKiBiZSBmdWxseSBxdWFsaWZpZWQgaWYgYW4gaW1wb3J0IGNvbmZsaWN0IHByZXZlbnRlZCB0aGUgaW1wb3J0IG9yIHVucXVhbGlmaWVkIGlmIHRoZSBpbXBvcnQgc3VjY2VlZGVkIG9yIHdhcyBhbHJlYWR5CkBAIC04MTAsNyArODY1LDcgQEAKIAlwdWJsaWMgU3RyaW5nIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgZGVjbGFyaW5nVHlwZU5hbWUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRmllbGQpIHsKIAkJcmV0dXJuIGFkZFN0YXRpY0ltcG9ydChkZWNsYXJpbmdUeXBlTmFtZSwgc2ltcGxlTmFtZSwgaXNGaWVsZCwgdGhpcy5kZWZhdWx0Q29udGV4dCk7CiAJfQotCQorCiAJLyoqCiAJICogQWRkcyBhIG5ldyBzdGF0aWMgaW1wb3J0IHRvIHRoZSByZXdyaXRlcidzIHJlY29yZCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBjb2RlLiBUaGUgcmVmZXJlbmNlIHdpbGwKIAkgKiBiZSBmdWxseSBxdWFsaWZpZWQgaWYgYW4gaW1wb3J0IGNvbmZsaWN0IHByZXZlbnRlZCB0aGUgaW1wb3J0IG9yIHVucXVhbGlmaWVkIGlmIHRoZSBpbXBvcnQgc3VjY2VlZGVkIG9yIHdhcyBhbHJlYWR5CkBAIC04MzEsMjYgKzg4NiwyOCBAQAogCSAqIEByZXR1cm4gcmV0dXJucyBlaXRoZXIgdGhlIHNpbXBsZSBtZW1iZXIgbmFtZSBpZiB0aGUgaW1wb3J0IHdhcyBzdWNjZXNzZnVsIG9yIGVsc2UgdGhlIHF1YWxpZmllZCBuYW1lIGlmCiAJICogYW4gaW1wb3J0IGNvbmZsaWN0IHByZXZlbnRlZCB0aGUgaW1wb3J0LgogCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRkU3RhdGljSW1wb3J0KFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSwgU3RyaW5nIHNpbXBsZU5hbWUsIGJvb2xlYW4gaXNGaWVsZCwgSW1wb3J0UmV3cml0ZUNvbnRleHQgY29udGV4dCkgewkKKwlwdWJsaWMgU3RyaW5nIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgZGVjbGFyaW5nVHlwZU5hbWUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRmllbGQsIEltcG9ydFJld3JpdGVDb250ZXh0IGNvbnRleHQpIHsKKwkJU3RyaW5nIGtleSA9IGRlY2xhcmluZ1R5cGVOYW1lICsgJy4nICsgc2ltcGxlTmFtZTsKIAkJaWYgKGRlY2xhcmluZ1R5cGVOYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJcmV0dXJuIGRlY2xhcmluZ1R5cGVOYW1lICsgJy4nICsgc2ltcGxlTmFtZTsKKwkJCXJldHVybiBrZXk7CiAJCX0KIAkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewogCQkJY29udGV4dD0gdGhpcy5kZWZhdWx0Q29udGV4dDsKIAkJfQogCQlpbnQga2luZD0gaXNGaWVsZCA/IEltcG9ydFJld3JpdGVDb250ZXh0LktJTkRfU1RBVElDX0ZJRUxEIDogSW1wb3J0UmV3cml0ZUNvbnRleHQuS0lORF9TVEFUSUNfTUVUSE9EOworCQl0aGlzLmltcG9ydHNLaW5kTWFwLnB1dChrZXksIG5ldyBJbnRlZ2VyKGtpbmQpKTsKIAkJaW50IHJlcz0gY29udGV4dC5maW5kSW5Db250ZXh0KGRlY2xhcmluZ1R5cGVOYW1lLCBzaW1wbGVOYW1lLCBraW5kKTsKIAkJaWYgKHJlcyA9PSBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9DT05GTElDVCkgewotCQkJcmV0dXJuIGRlY2xhcmluZ1R5cGVOYW1lICsgJy4nICsgc2ltcGxlTmFtZTsKKwkJCXJldHVybiBrZXk7CiAJCX0KIAkJaWYgKHJlcyA9PSBJbXBvcnRSZXdyaXRlQ29udGV4dC5SRVNfTkFNRV9VTktOT1dOKSB7Ci0JCQlhZGRFbnRyeShTVEFUSUNfUFJFRklYICsgZGVjbGFyaW5nVHlwZU5hbWUgKyAnLicgKyBzaW1wbGVOYW1lKTsKKwkJCWFkZEVudHJ5KFNUQVRJQ19QUkVGSVggKyBrZXkpOwogCQl9CiAJCXJldHVybiBzaW1wbGVOYW1lOwogCX0KLQkKKwogCXByaXZhdGUgU3RyaW5nIGludGVybmFsQWRkSW1wb3J0KFN0cmluZyBmdWxsVHlwZU5hbWUsIEltcG9ydFJld3JpdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJaW50IGlkeD0gZnVsbFR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CQorCQlpbnQgaWR4PSBmdWxsVHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKIAkJU3RyaW5nIHR5cGVDb250YWluZXJOYW1lLCB0eXBlTmFtZTsKIAkJaWYgKGlkeCAhPSAtMSkgewogCQkJdHlwZUNvbnRhaW5lck5hbWU9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCwgaWR4KTsKQEAgLTg1OSwxNCArOTE2LDE0IEBACiAJCQl0eXBlQ29udGFpbmVyTmFtZT0gIiI7IC8vJE5PTi1OTFMtMSQKIAkJCXR5cGVOYW1lPSBmdWxsVHlwZU5hbWU7CiAJCX0KLQkJCisKIAkJaWYgKHR5cGVDb250YWluZXJOYW1lLmxlbmd0aCgpID09IDAgJiYgUHJpbWl0aXZlVHlwZS50b0NvZGUodHlwZU5hbWUpICE9IG51bGwpIHsKIAkJCXJldHVybiBmdWxsVHlwZU5hbWU7CiAJCX0KLQkJCisKIAkJaWYgKGNvbnRleHQgPT0gbnVsbCkKIAkJCWNvbnRleHQ9IHRoaXMuZGVmYXVsdENvbnRleHQ7Ci0JCQorCiAJCWludCByZXM9IGNvbnRleHQuZmluZEluQ29udGV4dCh0eXBlQ29udGFpbmVyTmFtZSwgdHlwZU5hbWUsIEltcG9ydFJld3JpdGVDb250ZXh0LktJTkRfVFlQRSk7CiAJCWlmIChyZXMgPT0gSW1wb3J0UmV3cml0ZUNvbnRleHQuUkVTX05BTUVfQ09ORkxJQ1QpIHsKIAkJCXJldHVybiBmdWxsVHlwZU5hbWU7CkBAIC04NzYsMjIgKzkzMywyMiBAQAogCQl9CiAJCXJldHVybiB0eXBlTmFtZTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5KSB7CiAJCXRoaXMuZXhpc3RpbmdJbXBvcnRzLmFkZChlbnRyeSk7Ci0JCQorCiAJCWlmICh0aGlzLnJlbW92ZWRJbXBvcnRzICE9IG51bGwpIHsKIAkJCWlmICh0aGlzLnJlbW92ZWRJbXBvcnRzLnJlbW92ZShlbnRyeSkpIHsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KLQkJCisKIAkJaWYgKHRoaXMuYWRkZWRJbXBvcnRzID09IG51bGwpIHsKIAkJCXRoaXMuYWRkZWRJbXBvcnRzPSBuZXcgQXJyYXlMaXN0KCk7CiAJCX0KIAkJdGhpcy5hZGRlZEltcG9ydHMuYWRkKGVudHJ5KTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRW50cnkoU3RyaW5nIGVudHJ5KSB7CiAJCWlmICh0aGlzLmV4aXN0aW5nSW1wb3J0cy5yZW1vdmUoZW50cnkpKSB7CiAJCQlpZiAodGhpcy5hZGRlZEltcG9ydHMgIT0gbnVsbCkgewpAQCAtOTA3LDcgKzk2NCw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qKgogCSAqIFJlY29yZHMgdG8gcmVtb3ZlIGEgaW1wb3J0LiBObyByZW1vdmUgaXMgcmVjb3JkZWQgaWYgbm8gc3VjaCBpbXBvcnQgZXhpc3RzIG9yIGlmIHN1Y2ggYW4gaW1wb3J0IGlzIHJlY29yZGVkCiAJICogdG8gYmUgYWRkZWQuIEluIHRoYXQgY2FzZSB0aGUgcmVjb3JkIG9mIHRoZSBhZGRpdGlvbiBpcyBkaXNjYXJkZWQuCkBAIC05MjEsNyArOTc4LDcgQEAKIAlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbXBvcnQoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKIAkJcmV0dXJuIHJlbW92ZUVudHJ5KE5PUk1BTF9QUkVGSVggKyBxdWFsaWZpZWROYW1lKTsKIAl9Ci0JCQorCiAJLyoqCiAJICogUmVjb3JkcyB0byByZW1vdmUgYSBzdGF0aWMgaW1wb3J0LiBObyByZW1vdmUgaXMgcmVjb3JkZWQgaWYgbm8gc3VjaCBpbXBvcnQgZXhpc3RzIG9yIGlmIHN1Y2ggYW4gaW1wb3J0IGlzIHJlY29yZGVkCiAJICogdG8gYmUgYWRkZWQuIEluIHRoYXQgY2FzZSB0aGUgcmVjb3JkIG9mIHRoZSBhZGRpdGlvbiBpcyBkaXNjYXJkZWQuCkBAIC05MzQsOCArOTkxLDggQEAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiByZW1vdmVTdGF0aWNJbXBvcnQoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKIAkJcmV0dXJuIHJlbW92ZUVudHJ5KFNUQVRJQ19QUkVGSVggKyBxdWFsaWZpZWROYW1lKTsKLQl9CQotCQorCX0KKwogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSYXdOYW1lKElUeXBlQmluZGluZyBub3JtYWxpemVkQmluZGluZykgewogCQlyZXR1cm4gbm9ybWFsaXplZEJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwogCX0KQEAgLTk0Myw3ICsxMDAwLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmF3UXVhbGlmaWVkTmFtZShJVHlwZUJpbmRpbmcgbm9ybWFsaXplZEJpbmRpbmcpIHsKIAkJcmV0dXJuIG5vcm1hbGl6ZWRCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKIAl9Ci0JCisKIAogCS8qKgogCSAqIENvbnZlcnRzIGFsbCBtb2RpZmljYXRpb25zIHJlY29yZGVkIGJ5IHRoaXMgcmV3cml0ZXIgaW50byBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIHRleHQKQEAgLTk1MSw3ICsxMDA4LDcgQEAKIAkgKiA8cD4KIAkgKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBtb2RpZmljYXRpb25zIG9uIHJlY29yZC4gU3Vic2VxdWVuY2UgbW9kaWZpY2F0aW9ucyBhcmUgYWRkZWQKIAkgKiB0byB0aGUgb25lcyBhbHJlYWR5IG9uIHJlY29yZC4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluIGxhdGVyLCB0aGUgcmVzdWx0aW5nIHRleHQgZWRpdCBvYmplY3Qgd2lsbCBhY2N1cmF0ZWx5Ci0JICogcmVmbGVjdCB0aGUgbmV0IGN1bXVsYXRpdmUgYWZmZWN0IG9mIGFsbCB0aG9zZSBjaGFuZ2VzLgorCSAqIHJlZmxlY3QgdGhlIG5ldCBjdW11bGF0aXZlIGVmZmVjdCBvZiBhbGwgdGhvc2UgY2hhbmdlcy4KIAkgKiA8L3A+CiAJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhbmdlcwpAQCAtOTYyLDcgKzEwMTksNyBAQAogCQlpZiAobW9uaXRvciA9PSBudWxsKSB7CiAJCQltb25pdG9yPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwogCQl9Ci0JCQorCiAJCXRyeSB7CiAJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmltcG9ydFJld3JpdGVfcHJvY2Vzc0Rlc2NyaXB0aW9uKSwgMik7CiAJCQlpZiAoIWhhc1JlY29yZGVkQ2hhbmdlcygpKSB7CkBAIC05NzAsMzMgKzEwMjcsNDEgQEAKIAkJCQl0aGlzLmNyZWF0ZWRTdGF0aWNJbXBvcnRzPSBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CiAJCQkJcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7CiAJCQl9Ci0JCQkKKwogCQkJQ29tcGlsYXRpb25Vbml0IHVzZWRBc3RSb290PSB0aGlzLmFzdFJvb3Q7CiAJCQlpZiAodXNlZEFzdFJvb3QgPT0gbnVsbCkgewotCQkJCUFTVFBhcnNlciBwYXJzZXI9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCQkJCUFTVFBhcnNlciBwYXJzZXI9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzQpOwogCQkJCXBhcnNlci5zZXRTb3VyY2UodGhpcy5jb21waWxhdGlvblVuaXQpOwogCQkJCXBhcnNlci5zZXRGb2NhbFBvc2l0aW9uKDApOyAvLyByZWR1Y2VkIEFTVAogCQkJCXBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3MoZmFsc2UpOwogCQkJCXVzZWRBc3RSb290PSAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwogCQkJfQotCQkJCQkJCi0JCQlJbXBvcnRSZXdyaXRlQW5hbHl6ZXIgY29tcHV0ZXI9IG5ldyBJbXBvcnRSZXdyaXRlQW5hbHl6ZXIodGhpcy5jb21waWxhdGlvblVuaXQsIHVzZWRBc3RSb290LCB0aGlzLmltcG9ydE9yZGVyLCB0aGlzLmltcG9ydE9uRGVtYW5kVGhyZXNob2xkLCB0aGlzLnN0YXRpY0ltcG9ydE9uRGVtYW5kVGhyZXNob2xkLCB0aGlzLnJlc3RvcmVFeGlzdGluZ0ltcG9ydHMpOworCisJCQlJbXBvcnRSZXdyaXRlQW5hbHl6ZXIgY29tcHV0ZXI9CisJCQkJbmV3IEltcG9ydFJld3JpdGVBbmFseXplcigKKwkJCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LAorCQkJCQkJdXNlZEFzdFJvb3QsCisJCQkJCQl0aGlzLmltcG9ydE9yZGVyLAorCQkJCQkJdGhpcy5pbXBvcnRPbkRlbWFuZFRocmVzaG9sZCwKKwkJCQkJCXRoaXMuc3RhdGljSW1wb3J0T25EZW1hbmRUaHJlc2hvbGQsCisJCQkJCQl0aGlzLnJlc3RvcmVFeGlzdGluZ0ltcG9ydHMsCisJCQkJCQl0aGlzLnVzZUNvbnRleHRUb0ZpbHRlckltcGxpY2l0SW1wb3J0cyk7CiAJCQljb21wdXRlci5zZXRGaWx0ZXJJbXBsaWNpdEltcG9ydHModGhpcy5maWx0ZXJJbXBsaWNpdEltcG9ydHMpOwotCQkJCisKIAkJCWlmICh0aGlzLmFkZGVkSW1wb3J0cyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaT0gMDsgaSA8IHRoaXMuYWRkZWRJbXBvcnRzLnNpemUoKTsgaSsrKSB7CiAJCQkJCVN0cmluZyBjdXJyPSAoU3RyaW5nKSB0aGlzLmFkZGVkSW1wb3J0cy5nZXQoaSk7CiAJCQkJCWNvbXB1dGVyLmFkZEltcG9ydChjdXJyLnN1YnN0cmluZygxKSwgU1RBVElDX1BSRUZJWCA9PSBjdXJyLmNoYXJBdCgwKSk7CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCWlmICh0aGlzLnJlbW92ZWRJbXBvcnRzICE9IG51bGwpIHsKIAkJCQlmb3IgKGludCBpPSAwOyBpIDwgdGhpcy5yZW1vdmVkSW1wb3J0cy5zaXplKCk7IGkrKykgewogCQkJCQlTdHJpbmcgY3Vycj0gKFN0cmluZykgdGhpcy5yZW1vdmVkSW1wb3J0cy5nZXQoaSk7CiAJCQkJCWNvbXB1dGVyLnJlbW92ZUltcG9ydChjdXJyLnN1YnN0cmluZygxKSwgU1RBVElDX1BSRUZJWCA9PSBjdXJyLmNoYXJBdCgwKSk7CiAJCQkJfQogCQkJfQotCQkJCQorCiAJCQlUZXh0RWRpdCByZXN1bHQ9IGNvbXB1dGVyLmdldFJlc3VsdGluZ0VkaXRzKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwogCQkJdGhpcy5jcmVhdGVkSW1wb3J0cz0gY29tcHV0ZXIuZ2V0Q3JlYXRlZEltcG9ydHMoKTsKIAkJCXRoaXMuY3JlYXRlZFN0YXRpY0ltcG9ydHM9IGNvbXB1dGVyLmdldENyZWF0ZWRTdGF0aWNJbXBvcnRzKCk7CkBAIC0xMDA1LDcgKzEwNzAsNyBAQAogCQkJbW9uaXRvci5kb25lKCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFsbCBuZXcgbm9uLXN0YXRpYyBpbXBvcnRzIGNyZWF0ZWQgYnkgdGhlIGxhc3QgaW52b2NhdGlvbiBvZiB7QGxpbmsgI3Jld3JpdGVJbXBvcnRzKElQcm9ncmVzc01vbml0b3IpfQogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXNlIG1ldGhvZHMgaGF2ZSBub3QgYmVlbiBjYWxsZWQgeWV0LgpAQCAtMTAxOCw3ICsxMDgzLDcgQEAKIAlwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlZEltcG9ydHMoKSB7CiAJCXJldHVybiB0aGlzLmNyZWF0ZWRJbXBvcnRzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYWxsIG5ldyBzdGF0aWMgaW1wb3J0cyBjcmVhdGVkIGJ5IHRoZSBsYXN0IGludm9jYXRpb24gb2Yge0BsaW5rICNyZXdyaXRlSW1wb3J0cyhJUHJvZ3Jlc3NNb25pdG9yKX0KIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVzZSBtZXRob2RzIGhhdmUgbm90IGJlZW4gY2FsbGVkIHlldC4KQEAgLTEwMzEsNDMgKzEwOTYsNDMgQEAKIAlwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlZFN0YXRpY0ltcG9ydHMoKSB7CiAJCXJldHVybiB0aGlzLmNyZWF0ZWRTdGF0aWNJbXBvcnRzOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYWxsIG5vbi1zdGF0aWMgaW1wb3J0cyB0aGF0IGFyZSByZWNvcmRlZCB0byBiZSBhZGRlZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGltcG9ydHMgcmVjb3JkZWQgdG8gYmUgYWRkZWQuCiAJICovCiAJcHVibGljIFN0cmluZ1tdIGdldEFkZGVkSW1wb3J0cygpIHsKIAkJcmV0dXJuIGZpbHRlckZyb21MaXN0KHRoaXMuYWRkZWRJbXBvcnRzLCBOT1JNQUxfUFJFRklYKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFsbCBzdGF0aWMgaW1wb3J0cyB0aGF0IGFyZSByZWNvcmRlZCB0byBiZSBhZGRlZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHN0YXRpYyBpbXBvcnRzIHJlY29yZGVkIHRvIGJlIGFkZGVkLgogCSAqLwogCXB1YmxpYyBTdHJpbmdbXSBnZXRBZGRlZFN0YXRpY0ltcG9ydHMoKSB7CiAJCXJldHVybiBmaWx0ZXJGcm9tTGlzdCh0aGlzLmFkZGVkSW1wb3J0cywgU1RBVElDX1BSRUZJWCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhbGwgbm9uLXN0YXRpYyBpbXBvcnRzIHRoYXQgYXJlIHJlY29yZGVkIHRvIGJlIHJlbW92ZWQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBpbXBvcnRzIHJlY29yZGVkIHRvIGJlIHJlbW92ZWQuCiAJICovCiAJcHVibGljIFN0cmluZ1tdIGdldFJlbW92ZWRJbXBvcnRzKCkgewogCQlyZXR1cm4gZmlsdGVyRnJvbUxpc3QodGhpcy5yZW1vdmVkSW1wb3J0cywgTk9STUFMX1BSRUZJWCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhbGwgc3RhdGljIGltcG9ydHMgdGhhdCBhcmUgcmVjb3JkZWQgdG8gYmUgcmVtb3ZlZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHN0YXRpYyBpbXBvcnRzIHJlY29yZGVkIHRvIGJlIHJlbW92ZWQuCiAJICovCiAJcHVibGljIFN0cmluZ1tdIGdldFJlbW92ZWRTdGF0aWNJbXBvcnRzKCkgewogCQlyZXR1cm4gZmlsdGVyRnJvbUxpc3QodGhpcy5yZW1vdmVkSW1wb3J0cywgU1RBVElDX1BSRUZJWCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbXBvcnRzIGhhdmUgYmVlbiByZWNvcmRlZCB0byBiZSBhZGRlZCBvciByZW1vdmVkLgogCSAqIEByZXR1cm4gYm9vbGVhbiByZXR1cm5zIGlmIGFueSBjaGFuZ2VzIHRvIGltcG9ydHMgaGF2ZSBiZWVuIHJlY29yZGVkLgpAQCAtMTA3Nyw4ICsxMTQyLDggQEAKIAkJCSh0aGlzLmFkZGVkSW1wb3J0cyAhPSBudWxsICYmICF0aGlzLmFkZGVkSW1wb3J0cy5pc0VtcHR5KCkpIHx8CiAJCQkodGhpcy5yZW1vdmVkSW1wb3J0cyAhPSBudWxsICYmICF0aGlzLnJlbW92ZWRJbXBvcnRzLmlzRW1wdHkoKSk7CiAJfQotCQotCQorCisKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmaWx0ZXJGcm9tTGlzdChMaXN0IGltcG9ydHMsIGNoYXIgcHJlZml4KSB7CiAJCWlmIChpbXBvcnRzID09IG51bGwpIHsKIAkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CkBAIC0xMDkyLDUgKzExNTcsNSBAQAogCQl9CiAJCXJldHVybiAoU3RyaW5nW10pIHJlcy50b0FycmF5KG5ldyBTdHJpbmdbcmVzLnNpemUoKV0pOwogCX0KLQkJCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9MaXN0UmV3cml0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0xpc3RSZXdyaXRlLmphdmEKaW5kZXggOWFhMmIxMi4uMGU2ZGQ4MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0xpc3RSZXdyaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL0xpc3RSZXdyaXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzUsNyArMzUsNyBAQAogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTGlzdFJld3JpdGUgewotCQorCiAJcHJpdmF0ZSBBU1ROb2RlIHBhcmVudDsKIAlwcml2YXRlIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgY2hpbGRQcm9wZXJ0eTsKIAlwcml2YXRlIEFTVFJld3JpdGUgcmV3cml0ZXI7CkBAIC00NiwxNSArNDYsMTUgQEAKIAkJdGhpcy5wYXJlbnQ9IHBhcmVudDsKIAkJdGhpcy5jaGlsZFByb3BlcnR5PSBjaGlsZFByb3BlcnR5OwogCX0KLQkKKwogCXByaXZhdGUgUmV3cml0ZUV2ZW50U3RvcmUgZ2V0UmV3cml0ZVN0b3JlKCkgewogCQlyZXR1cm4gdGhpcy5yZXdyaXRlci5nZXRSZXdyaXRlRXZlbnRTdG9yZSgpOwogCX0KLQkKKwogCXByaXZhdGUgTGlzdFJld3JpdGVFdmVudCBnZXRFdmVudCgpIHsKIAkJcmV0dXJuIGdldFJld3JpdGVTdG9yZSgpLmdldExpc3RFdmVudCh0aGlzLnBhcmVudCwgdGhpcy5jaGlsZFByb3BlcnR5LCB0cnVlKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGxpc3QgZm9yIHdoaWNoIHRoaXMgbGlzdCByZXdyaXRlciB3YXMgY3JlYXRlZC4KIApAQCAtNjUsMTAgKzY1LDEwIEBACiAJcHVibGljIEFTVE5vZGUgZ2V0UGFyZW50KCkgewogCQlyZXR1cm4gdGhpcy5wYXJlbnQ7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgb2YgdGhlIHBhcmVudCBub2RlIGZvciB3aGljaCB0aGlzIGxpc3QgcmV3cml0ZXIgd2FzIGNyZWF0ZWQuIAotCSAqIAorCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG9mIHRoZSBwYXJlbnQgbm9kZSBmb3Igd2hpY2ggdGhpcyBsaXN0IHJld3JpdGVyIHdhcyBjcmVhdGVkLgorCSAqCiAJICogQHJldHVybiB0aGUgcHJvcGVydHkgb2YgdGhlIHBhcmVudCBub2RlIGZvciB3aGljaCB0aGlzIGxpc3QgcmV3cml0ZXIgd2FzIGNyZWF0ZWQKIAkgKiBAc2VlICNnZXRQYXJlbnQoKQogCSAqIEBzaW5jZSAzLjEKQEAgLTc2LDE0ICs3NiwxNSBAQAogCXB1YmxpYyBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGdldExvY2F0aW9uSW5QYXJlbnQoKSB7CiAJCXJldHVybiB0aGlzLmNoaWxkUHJvcGVydHk7CiAJfQotCQorCiAJLyoqCiAJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbm9kZSBmcm9tIGl0cyBwYXJlbnQncyBsaXN0IHByb3BlcnR5IGluIHRoZSByZXdyaXRlci4KIAkgKiBUaGUgbm9kZSBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGUgbGlzdC4KIAkgKiBUaGUgQVNUIGl0c2VsZiBpcyBub3QgYWN0dWFsbHkgbW9kaWZpZWQgaW4gYW55IHdheTsgcmF0aGVyLCB0aGUgcmV3cml0ZXIKIAkgKiBqdXN0IHJlY29yZHMgYSBub3RlIHRoYXQgdGhpcyBub2RlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGlzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgYmVpbmcgcmVtb3ZlZAorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgYmVpbmcgcmVtb3ZlZC4gVGhlIG5vZGUgY2FuIGVpdGhlciBiZSBhbiBvcmlnaW5hbCBub2RlIGluIHRoaXMgbGlzdAorCSAqIG9yIChzaW5jZSAzLjQpIGEgbmV3IG5vZGUgYWxyZWFkeSBpbnNlcnRlZCBvciB1c2VkIGFzIHJlcGxhY2VtZW50IGluIHRoaXMgQVNUIHJld3JpdGVyLgogCSAqIEBwYXJhbSBlZGl0R3JvdXAgdGhlIGVkaXQgZ3JvdXAgaW4gd2hpY2ggdG8gY29sbGVjdCB0aGUgY29ycmVzcG9uZGluZwogCSAqIHRleHQgZWRpdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuZ3JvdXBlZAogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBub2RlIGlzIG51bGwsIG9yIGlmIHRoZSBub2RlIGlzIG5vdApAQCAtOTksNyArMTAwLDcgQEAKIAkJCWdldFJld3JpdGVTdG9yZSgpLnNldEV2ZW50RWRpdEdyb3VwKGV2ZW50LCBlZGl0R3JvdXApOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgQVNUUmV3cml0ZSBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoaXMgTGlzdFJld3JpdGVyIGhhcyBiZWVuIGNyZWF0ZWQgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgQVNUIFJld3JpdGVyIGluc3RhbmNlLgpAQCAtMTA4LDcgKzEwOSw3IEBACiAJcHVibGljIEFTVFJld3JpdGUgZ2V0QVNUUmV3cml0ZSgpIHsKIAkJcmV0dXJuIHRoaXMucmV3cml0ZXI7CiAJfQotCQorCiAKIAkvKioKIAkgKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gbm9kZSBmcm9tIGl0cyBwYXJlbnQncyBsaXN0IHByb3BlcnR5IGluIHRoZSByZXdyaXRlci4KQEAgLTExNiwxMiArMTE3LDEzIEBACiAJICogVGhlIHJlcGxhY2VtZW50IG5vZGUgbXVzdCBlaXRoZXIgYmUgYnJhbmQgbmV3IChub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgQVNUKQogCSAqIG9yIGEgcGxhY2Vob2xkZXIgbm9kZSAoZm9yIGV4YW1wbGUsIG9uZSBjcmVhdGVkIGJ5CiAJICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlQ29weVRhcmdldChBU1ROb2RlKX0sCi0JICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlTW92ZVRhcmdldChBU1ROb2RlKX0sIAorCSAqIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZU1vdmVUYXJnZXQoQVNUTm9kZSl9LAogCSAqIG9yIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKFN0cmluZywgaW50KX0pLiBUaGUgQVNUIGl0c2VsZgogICAgICAqIGlzIG5vdCBhY3R1YWxseSBtb2RpZmllZCBpbiBhbnkgd2F5OyByYXRoZXIsIHRoZSByZXdyaXRlciBqdXN0IHJlY29yZHMKICAgICAgKiBhIG5vdGUgdGhhdCB0aGlzIG5vZGUgaGFzIGJlZW4gcmVwbGFjZWQgaW4gdGhpcyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGJlaW5nIHJlcGxhY2VkCisJICoKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBiZWluZyByZW1vdmVkLiBUaGUgbm9kZSBjYW4gZWl0aGVyIGJlIGFuIG9yaWdpbmFsIG5vZGUgaW4gdGhpcyBsaXN0CisJICogb3IgKHNpbmNlIDMuNCkgYSBuZXcgbm9kZSBhbHJlYWR5IGluc2VydGVkIG9yIHVzZWQgYXMgcmVwbGFjZW1lbnQgaW4gdGhpcyBBU1QgcmV3cml0ZXIuCiAJICogQHBhcmFtIHJlcGxhY2VtZW50IHRoZSByZXBsYWNlbWVudCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwogCSAqIHJlcGxhY2VtZW50CiAJICogQHBhcmFtIGVkaXRHcm91cCB0aGUgZWRpdCBncm91cCBpbiB3aGljaCB0byBjb2xsZWN0IHRoZSBjb3JyZXNwb25kaW5nCkBAIC0xMzIsNyArMTM0LDcgQEAKICAgICAgKiAobm90IGEgbWVtYmVyIG9mIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGxpc3QpCiAJICovCiAJcHVibGljIHZvaWQgcmVwbGFjZShBU1ROb2RlIG5vZGUsIEFTVE5vZGUgcmVwbGFjZW1lbnQsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsgCisJCWlmIChub2RlID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGdldEV2ZW50KCkucmVwbGFjZUVudHJ5KG5vZGUsIHJlcGxhY2VtZW50KTsKQEAgLTE0MiwyOSArMTQ0LDI5IEBACiAJfQogCiAJLyoqCi0JICogSW5zZXJ0cyB0aGUgZ2l2ZW4gbm9kZSBpbnRvIHRoZSBsaXN0IGFmdGVyIHRoZSBnaXZlbiBlbGVtZW50LiAKKwkgKiBJbnNlcnRzIHRoZSBnaXZlbiBub2RlIGludG8gdGhlIGxpc3QgYWZ0ZXIgdGhlIGdpdmVuIGVsZW1lbnQuCiAJICogVGhlIGV4aXN0aW5nIG5vZGUgbXVzdCBiZSBpbiB0aGUgbGlzdCwgZWl0aGVyIGFzIGFuIG9yaWdpbmFsIG9yIGFzIGEgbmV3CiAJICogbm9kZSB0aGF0IGhhcyBiZWVuIGluc2VydGVkLgogCSAqIFRoZSBpbnNlcnRlZCBub2RlIG11c3QgZWl0aGVyIGJlIGJyYW5kIG5ldyAobm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIEFTVCkKIAkgKiBvciBhIHBsYWNlaG9sZGVyIG5vZGUgKGZvciBleGFtcGxlLCBvbmUgY3JlYXRlZCBieQotCSAqIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZUNvcHlUYXJnZXQoQVNUTm9kZSl9LCAKLQkgKiB7QGxpbmsgQVNUUmV3cml0ZSNjcmVhdGVNb3ZlVGFyZ2V0KEFTVE5vZGUpfSwgCisJICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlQ29weVRhcmdldChBU1ROb2RlKX0sCisJICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlTW92ZVRhcmdldChBU1ROb2RlKX0sCiAJICogb3Ige0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlU3RyaW5nUGxhY2Vob2xkZXIoU3RyaW5nLCBpbnQpfSkuIFRoZSBBU1QgaXRzZWxmCiAgICAgICogaXMgbm90IGFjdHVhbGx5IG1vZGlmaWVkIGluIGFueSB3YXk7IHJhdGhlciwgdGhlIHJld3JpdGVyIGp1c3QgcmVjb3JkcwogICAgICAqIGEgbm90ZSB0aGF0IHRoaXMgbm9kZSBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gaW5zZXJ0CiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgYWZ0ZXIgd2hpY2ggdGhlIGdpdmVuIG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQKIAkgKiBAcGFyYW0gZWRpdEdyb3VwIHRoZSBlZGl0IGdyb3VwIGluIHdoaWNoIHRvIGNvbGxlY3QgdGhlIGNvcnJlc3BvbmRpbmcKIAkgKiB0ZXh0IGVkaXRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmdyb3VwZWQKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBvciBlbGVtZW50IGlzIG51bGwsIAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBub2RlIG9yIGVsZW1lbnQgaXMgbnVsbCwKIAkgKiBvciBpZiB0aGUgbm9kZSBpcyBub3QgcGFydCBvZiB0aGlzIHJld3JpdGVyJ3MgQVNULCBvciBpZiB0aGUgaW5zZXJ0ZWQgbm9kZQogCSAqIGlzIG5vdCBhIG5ldyBub2RlIChvciBwbGFjZWhvbGRlciksIG9yIGlmIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBhIG1lbWJlcgogCSAqIG9mIHRoZSBsaXN0IChvcmlnaW5hbCBvciBuZXcpLCBvciBpZiB0aGUgZGVzY3JpYmVkIG1vZGlmaWNhdGlvbiBpcwogCSAqIG90aGVyd2lzZSBpbnZhbGlkCiAJICovCiAJcHVibGljIHZvaWQgaW5zZXJ0QWZ0ZXIoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGVsZW1lbnQsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgZWxlbWVudCA9PSBudWxsKSB7IAorCQlpZiAobm9kZSA9PSBudWxsIHx8IGVsZW1lbnQgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCWludCBpbmRleD0gZ2V0RXZlbnQoKS5nZXRJbmRleChlbGVtZW50LCBMaXN0UmV3cml0ZUV2ZW50LkJPVEgpOwpAQCAtMTczLDMxICsxNzUsMzEgQEAKIAkJfQogCQlpbnRlcm5hbEluc2VydEF0KG5vZGUsIGluZGV4ICsgMSwgdHJ1ZSwgZWRpdEdyb3VwKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBJbnNlcnRzIHRoZSBnaXZlbiBub2RlIGludG8gdGhlIGxpc3QgYmVmb3JlIHRoZSBnaXZlbiBlbGVtZW50LiAKKwkgKiBJbnNlcnRzIHRoZSBnaXZlbiBub2RlIGludG8gdGhlIGxpc3QgYmVmb3JlIHRoZSBnaXZlbiBlbGVtZW50LgogCSAqIFRoZSBleGlzdGluZyBub2RlIG11c3QgYmUgaW4gdGhlIGxpc3QsIGVpdGhlciBhcyBhbiBvcmlnaW5hbCBvciBhcyBhIG5ldwogCSAqIG5vZGUgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZC4KIAkgKiBUaGUgaW5zZXJ0ZWQgbm9kZSBtdXN0IGVpdGhlciBiZSBicmFuZCBuZXcgKG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBBU1QpCiAJICogb3IgYSBwbGFjZWhvbGRlciBub2RlIChmb3IgZXhhbXBsZSwgb25lIGNyZWF0ZWQgYnkKLQkgKiB7QGxpbmsgQVNUUmV3cml0ZSNjcmVhdGVDb3B5VGFyZ2V0KEFTVE5vZGUpfSwgCi0JICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlTW92ZVRhcmdldChBU1ROb2RlKX0sIAorCSAqIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZUNvcHlUYXJnZXQoQVNUTm9kZSl9LAorCSAqIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZU1vdmVUYXJnZXQoQVNUTm9kZSl9LAogCSAqIG9yIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKFN0cmluZywgaW50KX0pLiBUaGUgQVNUIGl0c2VsZgogICAgICAqIGlzIG5vdCBhY3R1YWxseSBtb2RpZmllZCBpbiBhbnkgd2F5OyByYXRoZXIsIHRoZSByZXdyaXRlciBqdXN0IHJlY29yZHMKICAgICAgKiBhIG5vdGUgdGhhdCB0aGlzIG5vZGUgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgbGlzdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGluc2VydAogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IGJlZm9yZSB3aGljaCB0aGUgZ2l2ZW4gbm9kZSBpcyB0byBiZSBpbnNlcnRlZAogCSAqIEBwYXJhbSBlZGl0R3JvdXAgdGhlIGVkaXQgZ3JvdXAgaW4gd2hpY2ggdG8gY29sbGVjdCB0aGUgY29ycmVzcG9uZGluZwogCSAqIHRleHQgZWRpdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuZ3JvdXBlZAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBub2RlIG9yIGVsZW1lbnQgaXMgbnVsbCwgCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5vZGUgb3IgZWxlbWVudCBpcyBudWxsLAogCSAqIG9yIGlmIHRoZSBub2RlIGlzIG5vdCBwYXJ0IG9mIHRoaXMgcmV3cml0ZXIncyBBU1QsIG9yIGlmIHRoZSBpbnNlcnRlZCBub2RlCiAJICogaXMgbm90IGEgbmV3IG5vZGUgKG9yIHBsYWNlaG9sZGVyKSwgb3IgaWYgPGNvZGU+ZWxlbWVudDwvY29kZT4gaXMgbm90IGEgbWVtYmVyCiAJICogb2YgdGhlIGxpc3QgKG9yaWdpbmFsIG9yIG5ldyksIG9yIGlmIHRoZSBkZXNjcmliZWQgbW9kaWZpY2F0aW9uIGlzCiAJICogb3RoZXJ3aXNlIGludmFsaWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoQVNUTm9kZSBub2RlLCBBU1ROb2RlIGVsZW1lbnQsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgZWxlbWVudCA9PSBudWxsKSB7IAorCQlpZiAobm9kZSA9PSBudWxsIHx8IGVsZW1lbnQgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCWludCBpbmRleD0gZ2V0RXZlbnQoKS5nZXRJbmRleChlbGVtZW50LCBMaXN0UmV3cml0ZUV2ZW50LkJPVEgpOwpAQCAtMjA2LDExICsyMDgsMTEgQEAKIAkJfQogCQlpbnRlcm5hbEluc2VydEF0KG5vZGUsIGluZGV4LCBmYWxzZSwgZWRpdEdyb3VwKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBJbnNlcnRzIHRoZSBnaXZlbiBub2RlIGludG8gdGhlIGxpc3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgotCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+aW5zZXJ0QXQobm9kZSwgMCwgZWRpdEdyb3VwKTwvY29kZT4uIAotCSAqIAorCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+aW5zZXJ0QXQobm9kZSwgMCwgZWRpdEdyb3VwKTwvY29kZT4uCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBpbnNlcnQKIAkgKiBAcGFyYW0gZWRpdEdyb3VwIHRoZSBlZGl0IGdyb3VwIGluIHdoaWNoIHRvIGNvbGxlY3QgdGhlIGNvcnJlc3BvbmRpbmcKIAkgKiB0ZXh0IGVkaXRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmdyb3VwZWQKQEAgLTIyMSwxNiArMjIzLDE2IEBACiAgICAgICogQHNlZSAjaW5zZXJ0QXQoQVNUTm9kZSwgaW50LCBUZXh0RWRpdEdyb3VwKQogCSAqLwogCXB1YmxpYyB2b2lkIGluc2VydEZpcnN0KEFTVE5vZGUgbm9kZSwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgeyAKKwkJaWYgKG5vZGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCWludGVybmFsSW5zZXJ0QXQobm9kZSwgMCwgZmFsc2UsIGVkaXRHcm91cCk7CiAJfQotCQorCiAJLyoqCiAJICogSW5zZXJ0cyB0aGUgZ2l2ZW4gbm9kZSBpbnRvIHRoZSBsaXN0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0JICogRXF1aXZhbGVudCB0byA8Y29kZT5pbnNlcnRBdChub2RlLCAtMSwgZWRpdEdyb3VwKTwvY29kZT4uIAotCSAqIAorCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+aW5zZXJ0QXQobm9kZSwgLTEsIGVkaXRHcm91cCk8L2NvZGU+LgorCSAqCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gaW5zZXJ0CiAJICogQHBhcmFtIGVkaXRHcm91cCB0aGUgZWRpdCBncm91cCBpbiB3aGljaCB0byBjb2xsZWN0IHRoZSBjb3JyZXNwb25kaW5nCiAJICogdGV4dCBlZGl0cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5ncm91cGVkCkBAIC0yNDEsMjQgKzI0MywyNCBAQAogICAgICAqIEBzZWUgI2luc2VydEF0KEFTVE5vZGUsIGludCwgVGV4dEVkaXRHcm91cCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbnNlcnRMYXN0KEFTVE5vZGUgbm9kZSwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgeyAKKwkJaWYgKG5vZGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCWludGVybmFsSW5zZXJ0QXQobm9kZSwgLTEsIHRydWUsIGVkaXRHcm91cCk7CiAJfQogCiAJLyoqCi0JICogSW5zZXJ0cyB0aGUgZ2l2ZW4gbm9kZSBpbnRvIHRoZSBsaXN0IGF0IHRoZSBnaXZlbiBpbmRleC4gCisJICogSW5zZXJ0cyB0aGUgZ2l2ZW4gbm9kZSBpbnRvIHRoZSBsaXN0IGF0IHRoZSBnaXZlbiBpbmRleC4KIAkgKiBUaGUgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBjb21iaW5lZCBsaXN0IG9mIG9yaWdpbmFsIGFuZCBuZXcgbm9kZXM7CiAJICogcmVtb3ZlZCBvciByZXBsYWNlZCBub2RlcyBhcmUgc3RpbGwgaW4gdGhlIGNvbWJpbmVkIGxpc3QuCiAJICogVGhlIGluc2VydGVkIG5vZGUgbXVzdCBlaXRoZXIgYmUgYnJhbmQgbmV3IChub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgQVNUKQogCSAqIG9yIGEgcGxhY2Vob2xkZXIgbm9kZSAoZm9yIGV4YW1wbGUsIG9uZSBjcmVhdGVkIGJ5Ci0JICoge0BsaW5rIEFTVFJld3JpdGUjY3JlYXRlQ29weVRhcmdldChBU1ROb2RlKX0sIAotCSAqIHtAbGluayBBU1RSZXdyaXRlI2NyZWF0ZU1vdmVUYXJnZXQoQVNUTm9kZSl9LCAKKwkgKiB7QGxpbmsgQVNUUmV3cml0ZSNjcmVhdGVDb3B5VGFyZ2V0KEFTVE5vZGUpfSwKKwkgKiB7QGxpbmsgQVNUUmV3cml0ZSNjcmVhdGVNb3ZlVGFyZ2V0KEFTVE5vZGUpfSwKIAkgKiBvciB7QGxpbmsgQVNUUmV3cml0ZSNjcmVhdGVTdHJpbmdQbGFjZWhvbGRlcihTdHJpbmcsIGludCl9KS4gVGhlIEFTVCBpdHNlbGYKICAgICAgKiBpcyBub3QgYWN0dWFsbHkgbW9kaWZpZWQgaW4gYW55IHdheTsgcmF0aGVyLCB0aGUgcmV3cml0ZXIganVzdCByZWNvcmRzCiAgICAgICogYSBub3RlIHRoYXQgdGhpcyBub2RlIGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIGxpc3QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBpbnNlcnQKIAkgKiBAcGFyYW0gaW5kZXggaW5zZXJ0aW9uIGluZGV4IGluIHRoZSBjb21iaW5lZCBsaXN0IG9mIG9yaWdpbmFsIGFuZAogCSAqIGluc2VydGVkIG5vZGVzOyA8Y29kZT4tMTwvY29kZT4gaW5kaWNhdGVzIGluc2VydGlvbiBhcyB0aGUgbGFzdCBlbGVtZW50CkBAIC0yNjgsMTYgKzI3MCwxNiBAQAogCSAqIG9mIHRoaXMgcmV3cml0ZXIncyBBU1QsIG9yIGlmIHRoZSBpbnNlcnRlZCBub2RlIGlzIG5vdCBhIG5ldyBub2RlIChvcgogICAgICAqIHBsYWNlaG9sZGVyKSwgb3IgaWYgdGhlIGRlc2NyaWJlZCBtb2RpZmljYXRpb24gaXMgb3RoZXJ3aXNlIGludmFsaWQKICAgICAgKiAobm90IGEgbWVtYmVyIG9mIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGxpc3QpCi0JICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSBhbmQgbm90IC0xLCAKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5lZ2F0aXZlIGFuZCBub3QgLTEsCiAJICogb3IgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGNvbWJpbmVkIGxpc3QKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbnNlcnRBdChBU1ROb2RlIG5vZGUsIGludCBpbmRleCwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgeyAKKwkJaWYgKG5vZGUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCWludGVybmFsSW5zZXJ0QXQobm9kZSwgaW5kZXgsIGlzSW5zZXJ0Qm91bmRUb1ByZXZpb3VzQnlEZWZhdWx0KG5vZGUpLCBlZGl0R3JvdXApOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBpbnRlcm5hbEluc2VydEF0KEFTVE5vZGUgbm9kZSwgaW50IGluZGV4LCBib29sZWFuIGJvdW5kVG9QcmV2aW91cywgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudCgpLmluc2VydChub2RlLCBpbmRleCk7CiAJCWlmIChib3VuZFRvUHJldmlvdXMpIHsKQEAgLTI4NSwxMCArMjg3LDEwIEBACiAJCX0KIAkJaWYgKGVkaXRHcm91cCAhPSBudWxsKSB7CiAJCQlnZXRSZXdyaXRlU3RvcmUoKS5zZXRFdmVudEVkaXRHcm91cChldmVudCwgZWRpdEdyb3VwKTsKLQkJfQkJCisJCX0KIAl9Ci0JCi0JCisKKwogCXByaXZhdGUgQVNUTm9kZSBjcmVhdGVUYXJnZXROb2RlKEFTVE5vZGUgZmlyc3QsIEFTVE5vZGUgbGFzdCwgYm9vbGVhbiBpc01vdmUsIEFTVE5vZGUgcmVwbGFjaW5nTm9kZSwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJaWYgKGZpcnN0ID09IG51bGwgfHwgbGFzdCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC0yOTksMjkgKzMwMSwyOSBAQAogCQlpZiAocGxhY2Vob2xkZXIgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ3JlYXRpbmcgYSB0YXJnZXQgbm9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBub2RlcyBvZiB0eXBlIiArIGZpcnN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCUJsb2NrIGludGVybmFsUGxhY2VIb2xkZXI9IG5vZGVTdG9yZS5jcmVhdGVDb2xsYXBzZVBsYWNlaG9sZGVyKCk7CiAJCUNvcHlTb3VyY2VJbmZvIGluZm89IGdldFJld3JpdGVTdG9yZSgpLmNyZWF0ZVJhbmdlQ29weSh0aGlzLnBhcmVudCwgdGhpcy5jaGlsZFByb3BlcnR5LCBmaXJzdCwgbGFzdCwgaXNNb3ZlLCBpbnRlcm5hbFBsYWNlSG9sZGVyLCByZXBsYWNpbmdOb2RlLCBlZGl0R3JvdXApOwogCQlub2RlU3RvcmUubWFya0FzQ29weVRhcmdldChwbGFjZWhvbGRlciwgaW5mbyk7Ci0JCQotCQlyZXR1cm4gcGxhY2Vob2xkZXI7CQkKKworCQlyZXR1cm4gcGxhY2Vob2xkZXI7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIGEgdHJ1ZSBjb3B5IG9mIGEgcmFuZ2Ugb2Ygbm9kZXMgb2YgdGhlCiAJICogY3VycmVudCBsaXN0LgogCSAqIFRoZSBwbGFjZWhvbGRlciBub2RlIGNhbiBlaXRoZXIgYmUgaW5zZXJ0ZWQgYXMgbmV3IG9yIHVzZWQgdG8gcmVwbGFjZSBhbgotCSAqIGV4aXN0aW5nIG5vZGUuIFdoZW4gdGhlIGRvY3VtZW50IGlzIHJld3JpdHRlbiwgYSBjb3B5IG9mIHRoZSBzb3VyY2UgY29kZSAKKwkgKiBleGlzdGluZyBub2RlLiBXaGVuIHRoZSBkb2N1bWVudCBpcyByZXdyaXR0ZW4sIGEgY29weSBvZiB0aGUgc291cmNlIGNvZGUKIAkgKiBmb3IgdGhlIGdpdmVuIG5vZGUgcmFuZ2UgaXMgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGRvY3VtZW50IGF0IHRoZSBwb3NpdGlvbgogCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBsYWNlaG9sZGVyIChpbmRlbnRhdGlvbiBpcyBhZGp1c3RlZCkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmlyc3QgdGhlIG5vZGUgdGhhdCBzdGFydHMgdGhlIHJhbmdlCiAJICogQHBhcmFtIGxhc3QgdGhlIG5vZGUgdGhhdCBlbmRzIHRoZSByYW5nZQogCSAqIEByZXR1cm4gdGhlIG5ldyBwbGFjZWhvbGRlciBub2RlCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmlyc3Qgb3IgbGFzdCBub2RlCiAJICogYXJlIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBhIG5vZGUgaXMgbm90IGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbGlzdCBvciBpZiB0aGUgZmlyc3Qgbm9kZQogCSAqIGlzIG5vdCBiZWZvcmUgdGhlIGxhc3Qgbm9kZS4gQW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIGFsc28gdGhyb3duIGlmIHRoZSBjb3BpZWQgcmFuZ2UgaXMgb3ZlcmxhcHBpbmcgd2l0aCBhbiBvdGhlciBtb3ZlZCBvciBjb3BpZWQgcmFuZ2UuIAorCSAqIGFsc28gdGhyb3duIGlmIHRoZSBjb3BpZWQgcmFuZ2UgaXMgb3ZlcmxhcHBpbmcgd2l0aCBhbiBvdGhlciBtb3ZlZCBvciBjb3BpZWQgcmFuZ2UuCiAJICovCiAJcHVibGljIGZpbmFsIEFTVE5vZGUgY3JlYXRlQ29weVRhcmdldChBU1ROb2RlIGZpcnN0LCBBU1ROb2RlIGxhc3QpIHsKIAkJaWYgKGZpcnN0ID09IGxhc3QpIHsKQEAgLTMzMCwzOCArMzMyLDM4IEBACiAJCQlyZXR1cm4gY3JlYXRlVGFyZ2V0Tm9kZShmaXJzdCwgbGFzdCwgZmFsc2UsIG51bGwsIG51bGwpOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIGEgbW92ZSBvZiBhIHJhbmdlIG9mIG5vZGVzIG9mIHRoZQogCSAqIGN1cnJlbnQgbGlzdC4KIAkgKiBUaGUgcGxhY2Vob2xkZXIgbm9kZSBjYW4gZWl0aGVyIGJlIGluc2VydGVkIGFzIG5ldyBvciB1c2VkIHRvIHJlcGxhY2UgYW4KLQkgKiBleGlzdGluZyBub2RlLiBXaGVuIHRoZSBkb2N1bWVudCBpcyByZXdyaXR0ZW4sIGEgY29weSBvZiB0aGUgc291cmNlIGNvZGUgCisJICogZXhpc3Rpbmcgbm9kZS4gV2hlbiB0aGUgZG9jdW1lbnQgaXMgcmV3cml0dGVuLCBhIGNvcHkgb2YgdGhlIHNvdXJjZSBjb2RlCiAJICogZm9yIHRoZSBnaXZlbiBub2RlIHJhbmdlIGlzIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBkb2N1bWVudCBhdCB0aGUgcG9zaXRpb24KIAkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwbGFjZWhvbGRlciAoaW5kZW50YXRpb24gaXMgYWRqdXN0ZWQpLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZpcnN0IHRoZSBub2RlIHRoYXQgc3RhcnRzIHRoZSByYW5nZQogCSAqIEBwYXJhbSBsYXN0IHRoZSBub2RlIHRoYXQgZW5kcyB0aGUgcmFuZ2UKIAkgKiBAcmV0dXJuIHRoZSBuZXcgcGxhY2Vob2xkZXIgbm9kZQogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZpcnN0IG9yIGxhc3Qgbm9kZQogCSAqIGFyZSA8Y29kZT5udWxsPC9jb2RlPiwgaWYgYSBub2RlIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IGxpc3Qgb3IgaWYgdGhlIGZpcnN0IG5vZGUKIAkgKiBpcyBub3QgYmVmb3JlIHRoZSBsYXN0IG5vZGUuIEFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiBhbHNvIHRocm93biBpZiB0aGUgbW92ZWQgcmFuZ2UgaXMgb3ZlcmxhcHBpbmcgd2l0aCBhbiBvdGhlciBtb3ZlZCBvciBjb3BpZWQgcmFuZ2UuIAotCSAqIAorCSAqIGFsc28gdGhyb3duIGlmIHRoZSBtb3ZlZCByYW5nZSBpcyBvdmVybGFwcGluZyB3aXRoIGFuIG90aGVyIG1vdmVkIG9yIGNvcGllZCByYW5nZS4KKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgZmluYWwgQVNUTm9kZSBjcmVhdGVNb3ZlVGFyZ2V0KEFTVE5vZGUgZmlyc3QsIEFTVE5vZGUgbGFzdCkgewogCQlyZXR1cm4gY3JlYXRlTW92ZVRhcmdldChmaXJzdCwgbGFzdCwgbnVsbCwgbnVsbCk7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIGEgbW92ZSBvZiBhIHJhbmdlIG9mIG5vZGVzIG9mIHRoZQogCSAqIGN1cnJlbnQgbGlzdC4gVGhlIG1vdmVkIG5vZGVzIGNhbiBvcHRpb25hbGx5IGJlIHJlcGxhY2VkIGJ5IGEgc3BlY2lmaWVkIG5vZGUuCi0JICogCisJICoKIAkgKiBUaGUgcGxhY2Vob2xkZXIgbm9kZSBjYW4gZWl0aGVyIGJlIGluc2VydGVkIGFzIG5ldyBvciB1c2VkIHRvIHJlcGxhY2UgYW4KLQkgKiBleGlzdGluZyBub2RlLiBXaGVuIHRoZSBkb2N1bWVudCBpcyByZXdyaXR0ZW4sIGEgY29weSBvZiB0aGUgc291cmNlIGNvZGUgCisJICogZXhpc3Rpbmcgbm9kZS4gV2hlbiB0aGUgZG9jdW1lbnQgaXMgcmV3cml0dGVuLCBhIGNvcHkgb2YgdGhlIHNvdXJjZSBjb2RlCiAJICogZm9yIHRoZSBnaXZlbiBub2RlIHJhbmdlIGlzIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBkb2N1bWVudCBhdCB0aGUgcG9zaXRpb24KIAkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwbGFjZWhvbGRlciAoaW5kZW50YXRpb24gaXMgYWRqdXN0ZWQpLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZpcnN0IHRoZSBub2RlIHRoYXQgc3RhcnRzIHRoZSByYW5nZQogCSAqIEBwYXJhbSBsYXN0IHRoZSBub2RlIHRoYXQgZW5kcyB0aGUgcmFuZ2UKIAkgKiBAcGFyYW0gcmVwbGFjaW5nTm9kZSBhIG5vZGUgdGhhdCBpcyBzZXQgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtb3ZlZCBub2RlcwpAQCAtMzczLDggKzM3NSw4IEBACiAJICogbGFzdCBub2RlIGFyZSA8Y29kZT5udWxsPC9jb2RlPiwgaWYgYSBub2RlIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IGxpc3Qgb3IKIAkgKiBpZiB0aGUgZmlyc3Qgbm9kZSBpcyBub3QgYmVmb3JlIHRoZSBsYXN0IG5vZGUuIEFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqIDwvY29kZT4gaXMgYWxzbyB0aHJvd24gaWYgdGhlIG1vdmVkIHJhbmdlIGlzIG92ZXJsYXBwaW5nIHdpdGggYW4gb3RoZXIgbW92ZWQKLQkgKiBvciBjb3BpZWQgcmFuZ2UuIAotCSAqIAorCSAqIG9yIGNvcGllZCByYW5nZS4KKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgZmluYWwgQVNUTm9kZSBjcmVhdGVNb3ZlVGFyZ2V0KEFTVE5vZGUgZmlyc3QsIEFTVE5vZGUgbGFzdCwgQVNUTm9kZSByZXBsYWNpbmdOb2RlLCBUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCkgewpAQCAtMzg1LDMwICszODcsMzAgQEAKIAkJCXJldHVybiBjcmVhdGVUYXJnZXROb2RlKGZpcnN0LCBsYXN0LCB0cnVlLCByZXBsYWNpbmdOb2RlLCBlZGl0R3JvdXApOwogCQl9CiAJfQotCQorCiAJLyoKLQkgKiBIZXVyaXN0aWMgdG8gZGVjaWRlIGlmIGEgaW5zZXJ0ZWQgbm9kZSBpcyBib3VuZCB0byBwcmV2aW91cyBvciB0aGUgbmV4dCBzaWJsaW5nLiAKKwkgKiBIZXVyaXN0aWMgdG8gZGVjaWRlIGlmIGEgaW5zZXJ0ZWQgbm9kZSBpcyBib3VuZCB0byBwcmV2aW91cyBvciB0aGUgbmV4dCBzaWJsaW5nLgogCSAqLwogCXByaXZhdGUgYm9vbGVhbiBpc0luc2VydEJvdW5kVG9QcmV2aW91c0J5RGVmYXVsdChBU1ROb2RlIG5vZGUpIHsKIAkJcmV0dXJuIChub2RlIGluc3RhbmNlb2YgU3RhdGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBub2RlcyBpbiB0aGUgbGlzdCBwcm9wZXJ0eSBtYW5hZ2VkIGJ5IHRoaXMKIAkgKiByZXdyaXRlci4gVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlLgotCSAqIAorCSAqCiAJICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIG9yaWdpbmFsIG5vZGVzIGluIHRoZSBsaXN0CiAJICovCiAJcHVibGljIExpc3QgZ2V0T3JpZ2luYWxMaXN0KCkgewogCQlMaXN0IGxpc3Q9IChMaXN0KSBnZXRFdmVudCgpLmdldE9yaWdpbmFsVmFsdWUoKTsKIAkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIHJldmlzZWQgbGlzdCBwcm9wZXJ0eSBtYW5hZ2VkIGJ5IHRoaXMKIAkgKiByZXdyaXRlci4gVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBub2RlcyBpbiB0aGUgbGlzdCB0YWtpbmcgaW50byBhY2NvdW50IAorCSAqCisJICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIG5vZGVzIGluIHRoZSBsaXN0IHRha2luZyBpbnRvIGFjY291bnQKIAkgKiBhbGwgdGhlIGRlc2NyaWJlZCBjaGFuZ2VzCiAJICovCiAJcHVibGljIExpc3QgZ2V0UmV3cml0dGVuTGlzdCgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9UYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3Jld3JpdGUvVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlci5qYXZhCmluZGV4IDExMDQ1NTIuLjY1MmZjZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcmV3cml0ZS9UYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9yZXdyaXRlL1RhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw3ICsyNCw3IEBACiAgKiBjb21tZW50cyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRoZW0uCiAgKiA8L3A+CiAgKiA8cD4KLSAqIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzIGlmIHRoZXkgbmVlZCB0byBpbmZsdWVuY2UgdGhlIAorICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgaWYgdGhleSBuZWVkIHRvIGluZmx1ZW5jZSB0aGUKICAqIHRoZSBzb3VyY2UgcmFuZ2UgdG8gYmUgYWZmZWN0ZWQgd2hlbiByZXBsYWNpbmcgb3IgZGVsZXRpbmcgYSBwYXJ0aWN1bGFyIG5vZGUuCiAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgc3ViY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aAogICoge0BsaW5rIEFTVFJld3JpdGUjc2V0VGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcihUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyKX0uCkBAIC0zMiwxNSArMzIsMTUgQEAKICAqIHRoZSB7QGxpbmsgI2NvbXB1dGVTb3VyY2VSYW5nZShBU1ROb2RlKX0gbWV0aG9kIG9uIHRoaXMgb2JqZWN0IHdpbGwgYmUKICAqIHVzZWQgdG8gY29tcHV0ZSB0aGUgc291cmNlIHJhbmdlIGZvciBhIG5vZGUgYmVpbmcgZGVsZXRlZCBvciByZXBsYWNlZC4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGNsYXNzIFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgewotCQorCiAJLyoqCiAJICogUmVpZmllZCBzb3VyY2UgcmFuZ2UuIEluc3RhbmNlcyBhcmUgJnF1b3Q7dmFsdWUmcXVvdDsgb2JqZWN0CiAJICogKGNhbm5vdCBiZSBtb2RpZmllZCkuCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTb3VyY2VSYW5nZSB7CkBAIC00OSwxNiArNDksMTYgQEAKIAkJICogaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIGtub3duLgogCQkgKi8KIAkJcHJpdmF0ZSBpbnQgc3RhcnRQb3NpdGlvbjsKLQkJCisKIAkJLyoqCiAJCSAqIChwb3NzaWJseSAwKSBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+CiAJCSAqIGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyBrbm93bi4KIAkJICovCiAJCXByaXZhdGUgaW50IGxlbmd0aDsKLQkJCisKIAkJLyoqCiAJCSAqIENyZWF0ZXMgYSBuZXcgc291cmNlIHJhbmdlLgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4LCBvciA8Y29kZT4tMTwvY29kZT4KIAkJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIGtub3duCiAJCSAqIEBwYXJhbSBsZW5ndGggdGhlIChwb3NzaWJseSAwKSBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+CkBAIC02OCwxMCArNjgsMTAgQEAKIAkJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CiAJCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKIAkJfQotCQkKKwogCQkvKioKIAkJICogUmV0dXJucyB0aGUgc3RhcnQgcG9zaXRpb24uCi0JCSAqIAorCQkgKgogCQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCwgb3IgPGNvZGU+LTE8L2NvZGU+CiAJCSAqICAgIGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyBrbm93bgogCQkgKi8KQEAgLTgxLDcgKzgxLDcgQEAKIAogCQkvKioKIAkJICogUmV0dXJucyB0aGUgc291cmNlIGxlbmd0aC4KLQkJICogCisJCSAqCiAJCSAqIEByZXR1cm4gYSAocG9zc2libHkgMCkgbGVuZ3RoLCBvciA8Y29kZT4wPC9jb2RlPgogCQkgKiAgICBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMga25vd24KIAkJICovCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkgKiBnaXZlbiBub2RlLiBUaGUgcmVzdWx0aW5nIHNvdXJjZSByYW5nZSBtdXN0IGNvdmVyIGF0IGxlYXN0IHRoZQogCSAqIG9yaWdpbmFsIHNvdXJjZSByYW5nZSBvZiB0aGUgbm9kZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB3aXRoIGEga25vd24gc291cmNlIHJhbmdlIGluIHRoZSBjb21waWxhdGlvbiB1bml0CiAJICogYmVpbmcgcmV3cml0dGVuCiAJICogQHJldHVybiB0aGUgZXhhY3Qgc291cmNlIHJhbmdlIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGJlaW5nIHJld3JpdHRlbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFpdmVBU1RGbGF0dGVuZXIuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhCmluZGV4IDk0NTllNTUuLjkzOTRhZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFpdmVBU1RGbGF0dGVuZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL05haXZlQVNURmxhdHRlbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOCwxMSArOCwxMDYgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJyZWFrU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2F0Y2hDbGF1c2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25kaXRpb25hbEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbnN0cnVjdG9ySW52b2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29udGludWVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlVuaW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRG9TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVtcHR5U3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbmhhbmNlZEZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGRBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSWZTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbmZpeEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbnN0YW5jZW9mRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSmF2YWRvYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTGFiZWxlZFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTGluZUNvbW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kSW52b2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RSZWZQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyZW50aGVzaXplZEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmVmaXhFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmltaXRpdmVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5SZXR1cm5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyRmllbGRBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyTWV0aG9kSW52b2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoQ2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRhZ0VsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRleHRFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhyb3dTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRyeVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaGlsZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOworCiAvKioKICAqIEludGVybmFsIEFTVCB2aXNpdG9yIGZvciBzZXJpYWxpemluZyBhbiBBU1QgaW4gYSBxdWljayBhbmQgZGlydHkgZmFzaGlvbi4KICAqIEZvciB2YXJpb3VzIHJlYXNvbnMgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgbm90IG5lY2Vzc2FyaWx5IGxlZ2FsCkBAIC0zMSw2NiArMTI2LDkxIEBACiAgKiBDYWxsIHRoZSA8Y29kZT5yZXNldDwvY29kZT4gbWV0aG9kIHRvIGNsZWFyIHRoZSBwcmV2aW91cyByZXN1bHQgYmVmb3JlIHJldXNpbmcgYW4KICAqIGV4aXN0aW5nIGluc3RhbmNlLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCi1jbGFzcyBOYWl2ZUFTVEZsYXR0ZW5lciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQorcHVibGljIGNsYXNzIE5haXZlQVNURmxhdHRlbmVyIGV4dGVuZHMgQVNUVmlzaXRvciB7CisJLyoqCisJICogSW50ZXJuYWwgc3lub255bSBmb3Ige0BsaW5rIEFTVCNKTFMyfS4gVXNlIHRvIGFsbGV2aWF0ZQorCSAqIGRlcHJlY2F0aW9uIHdhcm5pbmdzLgorCSAqIEBkZXByZWNhdGVkCisJICogQHNpbmNlIDMuNAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKTFMyID0gQVNULkpMUzI7CisKIAkvKioKIAkgKiBUaGUgc3RyaW5nIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBU1QgaXMKIAkgKiB3cml0dGVuLgogCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKLQkKKwlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKwogCXByaXZhdGUgaW50IGluZGVudCA9IDA7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBwcmludGVyLgogCSAqLwotCU5haXZlQVNURmxhdHRlbmVyKCkgeworCXB1YmxpYyBOYWl2ZUFTVEZsYXR0ZW5lcigpIHsKIAkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJfQotCQorCisJLyoqCisJICogSW50ZXJuYWwgc3lub255bSBmb3Ige0BsaW5rIENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXROYW1lKCl9LiBVc2UgdG8gYWxsZXZpYXRlCisJICogZGVwcmVjYXRpb24gd2FybmluZ3MuCisJICogQGRlcHJlY2F0ZWQKKwkgKiBAc2luY2UgMy40CisJICovCisJcHJpdmF0ZSBOYW1lIGdldE5hbWUoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKKwkJcmV0dXJuIG5vZGUuZ2V0TmFtZSgpOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHN0cmluZyBhY2N1bXVsYXRlZCBpbiB0aGUgdmlzaXQuCiAJICoKLQkgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIAorCSAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKIAkJcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJLyoqCi0JICogUmVzZXRzIHRoaXMgcHJpbnRlciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluLgorCSAqIEludGVybmFsIHN5bm9ueW0gZm9yIHtAbGluayBNZXRob2REZWNsYXJhdGlvbiNnZXRSZXR1cm5UeXBlKCl9LiBVc2UgdG8gYWxsZXZpYXRlCisJICogZGVwcmVjYXRpb24gd2FybmluZ3MuCisJICogQGRlcHJlY2F0ZWQKKwkgKiBAc2luY2UgMy40CiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXRoaXMuYnVmZmVyLnNldExlbmd0aCgwKTsKKwlwcml2YXRlIFR5cGUgZ2V0UmV0dXJuVHlwZShNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CisJCXJldHVybiBub2RlLmdldFJldHVyblR5cGUoKTsKIAl9Ci0JCisKKwkvKioKKwkgKiBJbnRlcm5hbCBzeW5vbnltIGZvciB7QGxpbmsgVHlwZURlY2xhcmF0aW9uI2dldFN1cGVyY2xhc3MoKX0uIFVzZSB0byBhbGxldmlhdGUKKwkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwcml2YXRlIE5hbWUgZ2V0U3VwZXJjbGFzcyhUeXBlRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gbm9kZS5nZXRTdXBlcmNsYXNzKCk7CisJfQorCisJLyoqCisJICogSW50ZXJuYWwgc3lub255bSBmb3Ige0BsaW5rIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCNnZXRUeXBlRGVjbGFyYXRpb24oKX0uIFVzZSB0byBhbGxldmlhdGUKKwkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwcml2YXRlIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIG5vZGUuZ2V0VHlwZURlY2xhcmF0aW9uKCk7CisJfQorCiAJdm9pZCBwcmludEluZGVudCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluZGVudDsgaSsrKSAKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluZGVudDsgaSsrKQogCQkJdGhpcy5idWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCiAJfQotCQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1vZGlmaWVyIGZsYWdzLCBmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZS4KLQkgKiBVc2VkIGZvciAzLjAgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0IHRoZSBsaXN0IG9mIG1vZGlmaWVyIGFuZCBhbm5vdGF0aW9uIG5vZGVzCi0JICogKGVsZW1lbnQgdHlwZTogPGNvZGU+SUV4dGVuZGVkTW9kaWZpZXJzPC9jb2RlPikKLQkgKi8KLQl2b2lkIHByaW50TW9kaWZpZXJzKExpc3QgZXh0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBleHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUFTVE5vZGUgcCA9IChBU1ROb2RlKSBpdC5uZXh0KCk7Ci0JCQlwLmFjY2VwdCh0aGlzKTsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCQotCQorCiAJLyoqCiAJICogQXBwZW5kcyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgZmxhZ3MsIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIHNwYWNlLgogCSAqIFVzZWQgZm9yIEpMUzIgbW9kaWZpZXJzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXIgZmxhZ3MKIAkgKi8KIAl2b2lkIHByaW50TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKQEAgLTEyNyw4ICsyNDcsNDAgQEAKIAkJaWYgKE1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpIHsKIAkJCXRoaXMuYnVmZmVyLmFwcGVuZCgidHJhbnNpZW50ICIpOy8vJE5PTi1OTFMtMSQKIAkJfQotCX0JCQotCQorCX0KKworCS8qKgorCSAqIEFwcGVuZHMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1vZGlmaWVyIGZsYWdzLCBmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZS4KKwkgKiBVc2VkIGZvciAzLjAgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBleHQgdGhlIGxpc3Qgb2YgbW9kaWZpZXIgYW5kIGFubm90YXRpb24gbm9kZXMKKwkgKiAoZWxlbWVudCB0eXBlOiA8Y29kZT5JRXh0ZW5kZWRNb2RpZmllcnM8L2NvZGU+KQorCSAqLworCXZvaWQgcHJpbnRNb2RpZmllcnMoTGlzdCBleHQpIHsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGV4dC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJQVNUTm9kZSBwID0gKEFTVE5vZGUpIGl0Lm5leHQoKTsKKwkJCXAuYWNjZXB0KHRoaXMpOworCQkJdGhpcy5idWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogUmVzZXRzIHRoaXMgcHJpbnRlciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluLgorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQl0aGlzLmJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJfQorCisJLyoqCisJICogSW50ZXJuYWwgc3lub255bSBmb3Ige0BsaW5rIFR5cGVEZWNsYXJhdGlvbiNzdXBlckludGVyZmFjZXMoKX0uIFVzZSB0byBhbGxldmlhdGUKKwkgKiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwcml2YXRlIExpc3Qgc3VwZXJJbnRlcmZhY2VzKFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7CisJCXJldHVybiBub2RlLnN1cGVySW50ZXJmYWNlcygpOworCX0KKwogCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pCiAJICogQHNpbmNlIDMuMQpAQCAtMTQ5LDcgKzMwMSw3IEBACiAJCXRoaXMuYnVmZmVyLmFwcGVuZCgifVxuIik7Ly8kTk9OLU5MUy0xJAogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbikKIAkgKiBAc2luY2UgMy4xCkBAIC0xNzEsNyArMzIzLDcgQEAKIAkJdGhpcy5idWZmZXIuYXBwZW5kKCI7XG4iKTsvLyROT04tTkxTLTEkCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQogCSAqLwpAQCAtMzY2LDggKzUxOCw4IEBACiAJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIi4iKTsvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5idWZmZXIuYXBwZW5kKCJuZXcgIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7Ci0JCQlub2RlLmludGVybmFsR2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyKSB7CisJCQlnZXROYW1lKG5vZGUpLmFjY2VwdCh0aGlzKTsKIAkJfQogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CiAJCQlpZiAoIW5vZGUudHlwZUFyZ3VtZW50cygpLmlzRW1wdHkoKSkgewpAQCAtNDcxLDcgKzYyMyw3IEBACiAJCXRoaXMuYnVmZmVyLmFwcGVuZCgiO1xuIik7Ly8kTk9OLU5MUy0xJAogCQlyZXR1cm4gZmFsc2U7CiAJfQotCisJCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoRG9TdGF0ZW1lbnQpCiAJICovCkBAIC02MTEsNyArNzYzLDcgQEAKIAkJCW5vZGUuZ2V0SmF2YWRvYygpLmFjY2VwdCh0aGlzKTsKIAkJfQogCQlwcmludEluZGVudCgpOwotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgewogCQkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewpAQCAtNjM5LDcgKzc5MSw3IEBACiAJCWZvciAoSXRlcmF0b3IgaXQgPSBub2RlLmluaXRpYWxpemVycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CiAJCQlFeHByZXNzaW9uIGUgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOwogCQkJZS5hY2NlcHQodGhpcyk7Ci0JCQlpZiAoaXQuaGFzTmV4dCgpKSBidWZmZXIuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHRoaXMuYnVmZmVyLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5idWZmZXIuYXBwZW5kKCI7ICIpOy8vJE5PTi1OTFMtMSQKIAkJaWYgKG5vZGUuZ2V0RXhwcmVzc2lvbigpICE9IG51bGwpIHsKQEAgLTY0OSw3ICs4MDEsNyBAQAogCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS51cGRhdGVycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CiAJCQlFeHByZXNzaW9uIGUgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOwogCQkJZS5hY2NlcHQodGhpcyk7Ci0JCQlpZiAoaXQuaGFzTmV4dCgpKSBidWZmZXIuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHRoaXMuYnVmZmVyLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5idWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKIAkJbm9kZS5nZXRCb2R5KCkuYWNjZXB0KHRoaXMpOwpAQCAtNzEzLDIzICs4NjUsMTMgQEAKIAl9CiAKIAkvKgotCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0TGVmdE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCXRoaXMuYnVmZmVyLmFwcGVuZCgiIGluc3RhbmNlb2YgIik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLmdldFJpZ2h0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEluaXRpYWxpemVyKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIG5vZGUpIHsKIAkJaWYgKG5vZGUuZ2V0SmF2YWRvYygpICE9IG51bGwpIHsKIAkJCW5vZGUuZ2V0SmF2YWRvYygpLmFjY2VwdCh0aGlzKTsKIAkJfQotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgewogCQkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewpAQCAtNzQwLDYgKzg4MiwxNiBAQAogCX0KIAogCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKKwkJbm9kZS5nZXRMZWZ0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKCIgaW5zdGFuY2VvZiAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoSmF2YWRvYykKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChKYXZhZG9jIG5vZGUpIHsKQEAgLTc4Miw3ICs5MzQsNyBAQAogCQlub2RlLmdldFR5cGVOYW1lKCkuYWNjZXB0KHRoaXMpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTWVtYmVyUmVmKQogCSAqIEBzaW5jZSAzLjAKQEAgLTc5NSw3ICs5NDcsNyBAQAogCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChNZW1iZXJWYWx1ZVBhaXIpCiAJICogQHNpbmNlIDMuMQpAQCAtODA2LDQ3ICs5NTgsNyBAQAogCQlub2RlLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQotCS8qCi0JICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KE1ldGhvZFJlZikKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgewotCQkJbm9kZS5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJdGhpcy5idWZmZXIuYXBwZW5kKCIjIik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7Ci0JCXRoaXMuYnVmZmVyLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUucGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RSZWZQYXJhbWV0ZXIgZSA9IChNZXRob2RSZWZQYXJhbWV0ZXIpIGl0Lm5leHQoKTsKLQkJCWUuYWNjZXB0KHRoaXMpOwotCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyKQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewotCQlub2RlLmdldFR5cGUoKS5hY2NlcHQodGhpcyk7Ci0JCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCWlmIChub2RlLmlzVmFyYXJncygpKSB7Ci0JCQkJdGhpcy5idWZmZXIuYXBwZW5kKCIuLi4iKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24pCiAJICovCkBAIC04NTUsNyArOTY3LDcgQEAKIAkJCW5vZGUuZ2V0SmF2YWRvYygpLmFjY2VwdCh0aGlzKTsKIAkJfQogCQlwcmludEluZGVudCgpOwotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgewogCQkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewpAQCAtODczLDggKzk4NSw4IEBACiAJCQl9CiAJCX0KIAkJaWYgKCFub2RlLmlzQ29uc3RydWN0b3IoKSkgewotCQkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMl9JTlRFUk5BTCkgewotCQkJCW5vZGUuaW50ZXJuYWxHZXRSZXR1cm5UeXBlKCkuYWNjZXB0KHRoaXMpOworCQkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyKSB7CisJCQkJZ2V0UmV0dXJuVHlwZShub2RlKS5hY2NlcHQodGhpcyk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChub2RlLmdldFJldHVyblR5cGUyKCkgIT0gbnVsbCkgewogCQkJCQlub2RlLmdldFJldHVyblR5cGUyKCkuYWNjZXB0KHRoaXMpOwpAQCAtODk3LDcgKzEwMDksNyBAQAogCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXRFeHRyYURpbWVuc2lvbnMoKTsgaSsrKSB7CiAJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCisJCX0KIAkJaWYgKCFub2RlLnRocm93bkV4Y2VwdGlvbnMoKS5pc0VtcHR5KCkpIHsKIAkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiIHRocm93cyAiKTsvLyROT04tTkxTLTEkCiAJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS50aHJvd25FeGNlcHRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKQEAgLTk1Miw2ICsxMDY0LDQ2IEBACiAJfQogCiAJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTWV0aG9kUmVmKQorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWYgbm9kZSkgeworCQlpZiAobm9kZS5nZXRRdWFsaWZpZXIoKSAhPSBudWxsKSB7CisJCQlub2RlLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIiMiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5wYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCU1ldGhvZFJlZlBhcmFtZXRlciBlID0gKE1ldGhvZFJlZlBhcmFtZXRlcikgaXQubmV4dCgpOworCQkJZS5hY2NlcHQodGhpcyk7CisJCQlpZiAoaXQuaGFzTmV4dCgpKSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXRoaXMuYnVmZmVyLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KE1ldGhvZFJlZlBhcmFtZXRlcikKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyIG5vZGUpIHsKKwkJbm9kZS5nZXRUeXBlKCkuYWNjZXB0KHRoaXMpOworCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CisJCQlpZiAobm9kZS5pc1ZhcmFyZ3MoKSkgeworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiLi4uIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmIChub2RlLmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCisJCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KE1vZGlmaWVyKQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTk1OSw3ICsxMTExLDcgQEAKIAkJdGhpcy5idWZmZXIuYXBwZW5kKG5vZGUuZ2V0S2V5d29yZCgpLnRvU3RyaW5nKCkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTm9ybWFsQW5ub3RhdGlvbikKIAkgKiBAc2luY2UgMy4xCkBAIC05NzgsNyArMTEzMCw3IEBACiAJCXRoaXMuYnVmZmVyLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KE51bGxMaXRlcmFsKQogCSAqLwpAQCAtMTEzMiwxMyArMTI4NCwxMyBAQAogCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogCQlwcmludEluZGVudCgpOwotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgewogCQkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewpAQCAtMTE1NCw3ICsxMzA2LDcgQEAKIAkJbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCk7IGkrKykgewogCQkJdGhpcy5idWZmZXIuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQkKKwkJfQogCQlpZiAobm9kZS5nZXRJbml0aWFsaXplcigpICE9IG51bGwpIHsKIAkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiPSIpOy8vJE5PTi1OTFMtMSQKIAkJCW5vZGUuZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcyk7CkBAIC0xMzM3LDcgKzE0ODksNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChUZXh0RWxlbWVudCkKIAkgKiBAc2luY2UgMy4wCkBAIC0xMzQ2LDcgKzE0OTgsNyBAQAogCQl0aGlzLmJ1ZmZlci5hcHBlbmQobm9kZS5nZXRUZXh0KCkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoVGhpc0V4cHJlc3Npb24pCiAJICovCkBAIC0xMzc2LDYgKzE1MjgsMjAgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewogCQlwcmludEluZGVudCgpOwogCQl0aGlzLmJ1ZmZlci5hcHBlbmQoInRyeSAiKTsvLyROT04tTkxTLTEkCisJCUxpc3QgcmVzb3VyY2VzID0gbm9kZS5yZXNvdXJjZXMoKTsKKwkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTNCkgeworCQkJaWYgKCFub2RlLnJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgnKCcpOworCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGUgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24pIGl0Lm5leHQoKTsKKwkJCQkJdmFyaWFibGUuYWNjZXB0KHRoaXMpOworCQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7CisJCQkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoJzsnKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoJyknKTsKKwkJCX0KKwkJfQogCQlub2RlLmdldEJvZHkoKS5hY2NlcHQodGhpcyk7CiAJCXRoaXMuYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKIAkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuY2F0Y2hDbGF1c2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKQEAgLTEzOTYsNyArMTU2Miw3IEBACiAJCWlmIChub2RlLmdldEphdmFkb2MoKSAhPSBudWxsKSB7CiAJCQlub2RlLmdldEphdmFkb2MoKS5hY2NlcHQodGhpcyk7CiAJCX0KLQkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMl9JTlRFUk5BTCkgeworCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEpMUzIpIHsKIAkJCXByaW50TW9kaWZpZXJzKG5vZGUuZ2V0TW9kaWZpZXJzKCkpOwogCQl9CiAJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKQEAgLTE0MTgsMTUgKzE1ODQsMTUgQEAKIAkJCX0KIAkJfQogCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKLQkJCWlmIChub2RlLmludGVybmFsR2V0U3VwZXJjbGFzcygpICE9IG51bGwpIHsKKwkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyKSB7CisJCQlpZiAoZ2V0U3VwZXJjbGFzcyhub2RlKSAhPSBudWxsKSB7CiAJCQkJdGhpcy5idWZmZXIuYXBwZW5kKCJleHRlbmRzICIpOy8vJE5PTi1OTFMtMSQKLQkJCQlub2RlLmludGVybmFsR2V0U3VwZXJjbGFzcygpLmFjY2VwdCh0aGlzKTsKKwkJCQlnZXRTdXBlcmNsYXNzKG5vZGUpLmFjY2VwdCh0aGlzKTsKIAkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQlpZiAoIW5vZGUuaW50ZXJuYWxTdXBlckludGVyZmFjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCWlmICghc3VwZXJJbnRlcmZhY2VzKG5vZGUpLmlzRW1wdHkoKSkgewogCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChub2RlLmlzSW50ZXJmYWNlKCkgPyAiZXh0ZW5kcyAiIDogImltcGxlbWVudHMgIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5pbnRlcm5hbFN1cGVySW50ZXJmYWNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQkJZm9yIChJdGVyYXRvciBpdCA9IHN1cGVySW50ZXJmYWNlcyhub2RlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewogCQkJCQlOYW1lIG4gPSAoTmFtZSkgaXQubmV4dCgpOwogCQkJCQluLmFjY2VwdCh0aGlzKTsKIAkJCQkJaWYgKGl0Lmhhc05leHQoKSkgewpAQCAtMTQ3MCw4ICsxNjM2LDggQEAKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKLQkJCW5vZGUuaW50ZXJuYWxHZXRUeXBlRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcyk7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgeworCQkJZ2V0VHlwZURlY2xhcmF0aW9uKG5vZGUpLmFjY2VwdCh0aGlzKTsKIAkJfQogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CiAJCQlub2RlLmdldERlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMpOwpAQCAtMTUwOCwxMCArMTY3NCwyNSBAQAogCX0KIAogCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFVuaW9uVHlwZSkKKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVW5pb25UeXBlIG5vZGUpIHsKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUudHlwZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJVHlwZSB0ID0gKFR5cGUpIGl0Lm5leHQoKTsKKwkJCXQuYWNjZXB0KHRoaXMpOworCQkJaWYgKGl0Lmhhc05leHQoKSkgeworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgnfCcpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzJfSU5URVJOQUwpIHsKKwkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyKSB7CiAJCQlwcmludE1vZGlmaWVycyhub2RlLmdldE1vZGlmaWVycygpKTsKIAkJfQogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CkBAIC0xNTQ5LDcgKzE3MzAsNyBAQAogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewogCQlwcmludEluZGVudCgpOwotCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyX0lOVEVSTkFMKSB7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMikgewogCQkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewpAQCAtMTU2OSw2ICsxNzUwLDE4IEBACiAJfQogCiAJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoV2hpbGVTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgeworCQlwcmludEluZGVudCgpOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIndoaWxlICgiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRCb2R5KCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoV2lsZGNhcmRUeXBlKQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTE1ODYsMTYgKzE3NzksNCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JLyoKLQkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoV2hpbGVTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQlwcmludEluZGVudCgpOwotCQl0aGlzLmJ1ZmZlci5hcHBlbmQoIndoaWxlICgiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJdGhpcy5idWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRCb2R5KCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUFuYWx5emVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUFuYWx5emVyLmphdmEKaW5kZXggOGNlMzhkMi4uZmZkYWIyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0FTVFJld3JpdGVBbmFseXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9BU1RSZXdyaXRlQW5hbHl6ZXIuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5LDQ5ICsxOSw2MiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLlRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlci5Tb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkluZGVudE1hbmlwdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyeVNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyeVNjYW5uZXJEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGVGb3JtYXR0ZXIuQmxvY2tDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGVGb3JtYXR0ZXIuTm9kZU1hcmtlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlRm9ybWF0dGVyLlByZWZpeDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20ucmV3cml0ZS5Ob2RlSW5mb1N0b3JlLkNvcHlQbGFjZWhvbGRlckRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuTm9kZUluZm9TdG9yZS5TdHJpbmdQbGFjZWhvbGRlckRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuUmV3cml0ZUV2ZW50U3RvcmUuQ29weVNvdXJjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuQ29weVNvdXJjZUVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Db3B5VGFyZ2V0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTW92ZVNvdXJjZUVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5Nb3ZlVGFyZ2V0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJhbmdlTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0R3JvdXA7CiAKIAogLyoqCiAgKiBJbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IGNvZGUgbW9kaWZpY2F0aW9ucy4gRXhpc3RpbmcgY29kZSBtdXN0IHN0YXkgdW50b3VjaGVkLCBuZXcgY29kZQogICogYWRkZWQgd2l0aCBjb3JyZWN0IGZvcm1hdHRpbmcsIG1vdmVkIGNvZGUgbGVmdCB3aXRoIHRoZSB1c2VyJ3MgZm9ybWF0dGluZyAvIGNvbW1lbnRzLgogICogSWRlYToKLSAqIC0gR2V0IHRoZSBBU1QgZm9yIGV4aXN0aW5nIGNvZGUgCisgKiAtIEdldCB0aGUgQVNUIGZvciBleGlzdGluZyBjb2RlCiAgKiAtIERlc2NyaWJlIGNoYW5nZXMKICAqIC0gVGhpcyB2aXNpdG9yIGFuYWx5emVzIHRoZSBjaGFuZ2VzIG9yIGFubm90YXRpb25zIGFuZCBnZW5lcmF0ZXMgdGV4dCBlZGl0cwotICogKHRleHQgbWFuaXB1bGF0aW9uIEFQSSkgdGhhdCBkZXNjcmliZSB0aGUgcmVxdWlyZWQgY29kZSBjaGFuZ2VzLiAKKyAqICh0ZXh0IG1hbmlwdWxhdGlvbiBBUEkpIHRoYXQgZGVzY3JpYmUgdGhlIHJlcXVpcmVkIGNvZGUgY2hhbmdlcy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEFTVFJld3JpdGVBbmFseXplciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgc3lub255bSBmb3IgZGVwcmVjYXRlZCBjb25zdGFudCBBU1QuSkxTMgogCSAqIHRvIGFsbGV2aWF0ZSBkZXByZWNhdGVkIHdhcm5pbmdzLgogCSAqIEBkZXByZWNhdGVkCiAJICovCiAJLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBKTFMyX0lOVEVSTkFMID0gQVNULkpMUzI7Ci0JCisKIAlUZXh0RWRpdCBjdXJyZW50RWRpdDsKIAlmaW5hbCBSZXdyaXRlRXZlbnRTdG9yZSBldmVudFN0b3JlOyAvLyB1c2VkIGZyb20gaW5uZXIgY2xhc3NlcwotCQorCiAJcHJpdmF0ZSBUb2tlblNjYW5uZXIgdG9rZW5TY2FubmVyOyAvLyBzaGFyZWQgc2Nhbm5lcgotCQorCiAJcHJpdmF0ZSBmaW5hbCBNYXAgc291cmNlQ29weUluZm9Ub0VkaXQ7CiAJcHJpdmF0ZSBmaW5hbCBTdGFjayBzb3VyY2VDb3B5RW5kTm9kZXM7Ci0JCisKIAlwcml2YXRlIGZpbmFsIGNoYXJbXSBjb250ZW50OwogCXByaXZhdGUgZmluYWwgTGluZUluZm9ybWF0aW9uIGxpbmVJbmZvOwogCXByaXZhdGUgZmluYWwgQVNUUmV3cml0ZUZvcm1hdHRlciBmb3JtYXR0ZXI7CkBAIC02OSwxOCArODIsMzcgQEAKIAlwcml2YXRlIGZpbmFsIFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgZXh0ZW5kZWRTb3VyY2VSYW5nZUNvbXB1dGVyOwogCXByaXZhdGUgZmluYWwgTGluZUNvbW1lbnRFbmRPZmZzZXRzIGxpbmVDb21tZW50RW5kT2Zmc2V0czsKIAkKKwlwcml2YXRlIGludCBiZWZvcmVSZXF1aXJlZFNwYWNlSW5kZXggPSAtMTsKKwkKKwlNYXAgb3B0aW9uczsKKwkKKwlwcml2YXRlIFJlY292ZXJ5U2Nhbm5lckRhdGEgcmVjb3ZlcnlTY2FubmVyRGF0YTsKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBBU1RSZXdyaXRlQW5hbHl6ZXIuCisJICogPHA+VGhlIGdpdmVuIG9wdGlvbnMgY2Fubm90IGJlIG51bGwuPC9wPgorCSAqIAogCSAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHJld3JpdGUuCiAJICogQHBhcmFtIGxpbmVJbmZvIGxpbmUgaW5mb3JtYXRpb24gZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHJld3JpdGUuCiAJICogQHBhcmFtIHJvb3RFZGl0IHRoZSBlZGl0IHRvIGFkZCBhbGwgZ2VuZXJhdGVkIGVkaXRzIHRvCiAJICogQHBhcmFtIGV2ZW50U3RvcmUgdGhlIGV2ZW50IHN0b3JlIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0aW9uIG9mIGNoYW5nZXMKIAkgKiBAcGFyYW0gbm9kZUluZm9zIGFubm90YXRpb25zIHRvIG5vZGVzLCBzdWNoIGFzIGlmIGEgbm9kZSBpcyBhIHN0cmluZyBwbGFjZWhvbGRlciBvciBhIGNvcHkgdGFyZ2V0CiAJICogQHBhcmFtIGNvbW1lbnRzIGxpc3Qgb2YgY29tbWVudHMgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gcmV3cml0ZSAoZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5Db21tZW50PC9jb2RlPikgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCUBwYXJhbSBvcHRpb25zIHRoZSBjdXJyZW50IGpkdC5jb3JlIG9wdGlvbnMgKGZvcm1hdHRpbmcvY29tcGxpYW5jZSkgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCUBwYXJhbSBleHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIgdGhlIHNvdXJjZSByYW5nZSBjb21wdXRlciB0byB1c2UKKwkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgY3VycmVudCBqZHQuY29yZSBvcHRpb25zIChmb3JtYXR0aW5nL2NvbXBsaWFuY2UpCisJICogQHBhcmFtIGV4dGVuZGVkU291cmNlUmFuZ2VDb21wdXRlciB0aGUgc291cmNlIHJhbmdlIGNvbXB1dGVyIHRvIHVzZQorCSAqIEBwYXJhbSByZWNvdmVyeVNjYW5uZXJEYXRhIGludGVybmFsIGRhdGEgdXNlZCBieSB7QGxpbmsgUmVjb3ZlcnlTY2FubmVyfQogCSAqLwotCXB1YmxpYyBBU1RSZXdyaXRlQW5hbHl6ZXIoY2hhcltdIGNvbnRlbnQsIExpbmVJbmZvcm1hdGlvbiBsaW5lSW5mbywgU3RyaW5nIGxpbmVEZWxpbSwgVGV4dEVkaXQgcm9vdEVkaXQsIFJld3JpdGVFdmVudFN0b3JlIGV2ZW50U3RvcmUsIE5vZGVJbmZvU3RvcmUgbm9kZUluZm9zLCBMaXN0IGNvbW1lbnRzLCBNYXAgb3B0aW9ucywgVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlciBleHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIpIHsKKwlwdWJsaWMgQVNUUmV3cml0ZUFuYWx5emVyKAorCQkJY2hhcltdIGNvbnRlbnQsCisJCQlMaW5lSW5mb3JtYXRpb24gbGluZUluZm8sCisJCQlTdHJpbmcgbGluZURlbGltLAorCQkJVGV4dEVkaXQgcm9vdEVkaXQsCisJCQlSZXdyaXRlRXZlbnRTdG9yZSBldmVudFN0b3JlLAorCQkJTm9kZUluZm9TdG9yZSBub2RlSW5mb3MsCisJCQlMaXN0IGNvbW1lbnRzLAorCQkJTWFwIG9wdGlvbnMsCisJCQlUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyIGV4dGVuZGVkU291cmNlUmFuZ2VDb21wdXRlciwKKwkJCVJlY292ZXJ5U2Nhbm5lckRhdGEgcmVjb3ZlcnlTY2FubmVyRGF0YSkgewogCQl0aGlzLmV2ZW50U3RvcmU9IGV2ZW50U3RvcmU7CiAJCXRoaXMuY29udGVudD0gY29udGVudDsKIAkJdGhpcy5saW5lSW5mbz0gbGluZUluZm87CkBAIC04OSwzMyArMTIxLDYxIEBACiAJCXRoaXMuY3VycmVudEVkaXQ9IHJvb3RFZGl0OwogCQl0aGlzLnNvdXJjZUNvcHlJbmZvVG9FZGl0PSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7CiAJCXRoaXMuc291cmNlQ29weUVuZE5vZGVzPSBuZXcgU3RhY2soKTsKLQkJCisKIAkJdGhpcy5mb3JtYXR0ZXI9IG5ldyBBU1RSZXdyaXRlRm9ybWF0dGVyKG5vZGVJbmZvcywgZXZlbnRTdG9yZSwgb3B0aW9ucywgbGluZURlbGltKTsKLQkJCisKIAkJdGhpcy5leHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXIgPSBleHRlbmRlZFNvdXJjZVJhbmdlQ29tcHV0ZXI7CiAJCXRoaXMubGluZUNvbW1lbnRFbmRPZmZzZXRzPSBuZXcgTGluZUNvbW1lbnRFbmRPZmZzZXRzKGNvbW1lbnRzKTsKLQl9CiAJCQorCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCQkKKwkJdGhpcy5yZWNvdmVyeVNjYW5uZXJEYXRhID0gcmVjb3ZlcnlTY2FubmVyRGF0YTsKKwl9CisKIAlmaW5hbCBUb2tlblNjYW5uZXIgZ2V0U2Nhbm5lcigpIHsKIAkJaWYgKHRoaXMudG9rZW5TY2FubmVyID09IG51bGwpIHsKLQkJCUlTY2FubmVyIHNjYW5uZXI9IFRvb2xGYWN0b3J5LmNyZWF0ZVNjYW5uZXIodHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyh0aGlzLm9wdGlvbnMpOworCQkJU2Nhbm5lciBzY2FubmVyOworCQkJaWYgKHRoaXMucmVjb3ZlcnlTY2FubmVyRGF0YSA9PSBudWxsKSB7CisJCQkJc2Nhbm5lciA9IAorCQkJCQluZXcgU2Nhbm5lcigKKwkJCQkJCQl0cnVlLC8qdG9rZW5pemVDb21tZW50cyovCisJCQkJCQkJZmFsc2UsLyp0b2tlbml6ZVdoaXRlU3BhY2UqLworCQkJCQkJCWZhbHNlLC8qY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyovCisJCQkJCQkJY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsLAorCQkJCQkJCWNvbXBpbGVyT3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwsCisJCQkJCQkJbnVsbC8qdGFza1RhZ3MqLywKKwkJCQkJCQludWxsLyp0YXNrUHJpb3JpdGllcyovLAorCQkJCQkJCXRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQkJfSBlbHNlIHsKKwkJCQlzY2FubmVyID0KKwkJCQkJbmV3IFJlY292ZXJ5U2Nhbm5lcigKKwkJCQkJCQlmYWxzZSwvKnRva2VuaXplV2hpdGVTcGFjZSovCisJCQkJCQkJZmFsc2UsLypjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzKi8KKwkJCQkJCQljb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwsCisJCQkJCQkJY29tcGlsZXJPcHRpb25zLmNvbXBsaWFuY2VMZXZlbCwKKwkJCQkJCQludWxsLyp0YXNrVGFncyovLAorCQkJCQkJCW51bGwvKnRhc2tQcmlvcml0aWVzKi8sCisJCQkJCQkJdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLywKKwkJCQkJCQl0aGlzLnJlY292ZXJ5U2Nhbm5lckRhdGEpOworCQkJfQogCQkJc2Nhbm5lci5zZXRTb3VyY2UodGhpcy5jb250ZW50KTsKIAkJCXRoaXMudG9rZW5TY2FubmVyPSBuZXcgVG9rZW5TY2FubmVyKHNjYW5uZXIpOwogCQl9CiAJCXJldHVybiB0aGlzLnRva2VuU2Nhbm5lcjsKIAl9Ci0JCisKIAlmaW5hbCBjaGFyW10gZ2V0Q29udGVudCgpIHsKIAkJcmV0dXJuIHRoaXMuY29udGVudDsKIAl9Ci0JCisKIAlmaW5hbCBMaW5lSW5mb3JtYXRpb24gZ2V0TGluZUluZm9ybWF0aW9uKCkgewogCQlyZXR1cm4gdGhpcy5saW5lSW5mbzsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHRlbmRlZCBzb3VyY2UgcmFuZ2UgZm9yIGEgbm9kZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYW4gZXh0ZW5kZWQgc291cmNlIHJhbmdlIChuZXZlciBudWxsKQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTEyNSwxNiArMTg1LDE2IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZXh0ZW5kZWRTb3VyY2VSYW5nZUNvbXB1dGVyLmNvbXB1dGVTb3VyY2VSYW5nZShub2RlKTsKIAl9Ci0JCisKIAlmaW5hbCBpbnQgZ2V0RXh0ZW5kZWRPZmZzZXQoQVNUTm9kZSBub2RlKSB7CiAJCXJldHVybiBnZXRFeHRlbmRlZFJhbmdlKG5vZGUpLmdldFN0YXJ0UG9zaXRpb24oKTsKIAl9Ci0JCisKIAlmaW5hbCBpbnQgZ2V0RXh0ZW5kZWRFbmQoQVNUTm9kZSBub2RlKSB7CiAJCVRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIuU291cmNlUmFuZ2UgcmFuZ2U9IGdldEV4dGVuZGVkUmFuZ2Uobm9kZSk7CiAJCXJldHVybiByYW5nZS5nZXRTdGFydFBvc2l0aW9uKCkgKyByYW5nZS5nZXRMZW5ndGgoKTsKIAl9Ci0JCisKIAlmaW5hbCBUZXh0RWRpdCBnZXRDb3B5U291cmNlRWRpdChDb3B5U291cmNlSW5mbyBpbmZvKSB7CiAJCVRleHRFZGl0IGVkaXQ9IChUZXh0RWRpdCkgdGhpcy5zb3VyY2VDb3B5SW5mb1RvRWRpdC5nZXQoaW5mbyk7CiAJCWlmIChlZGl0ID09IG51bGwpIHsKQEAgLTE1NCw3ICsyMTQsNyBAQAogCQl9CiAJCXJldHVybiBlZGl0OwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgaW50IGdldENoYW5nZUtpbmQoQVNUTm9kZSBub2RlLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQobm9kZSwgcHJvcGVydHkpOwogCQlpZiAoZXZlbnQgIT0gbnVsbCkgewpAQCAtMTYyLDExICsyMjIsMTEgQEAKIAkJfQogCQlyZXR1cm4gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRDsKIAl9Ci0JCisKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzQ2hpbGRyZW5DaGFuZ2VzKEFTVE5vZGUgbm9kZSkgewogCQlyZXR1cm4gdGhpcy5ldmVudFN0b3JlLmhhc0NoYW5nZWRQcm9wZXJ0aWVzKG5vZGUpOwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NoYW5nZWQoQVNUTm9kZSBub2RlLCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQobm9kZSwgcHJvcGVydHkpOwogCQlpZiAoZXZlbnQgIT0gbnVsbCkgewpAQCAtMTc0LDE1ICsyMzQsMTUgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQ29sbGFwc2VkKEFTVE5vZGUgbm9kZSkgewogCQlyZXR1cm4gdGhpcy5ub2RlSW5mb3MuaXNDb2xsYXBzZWQobm9kZSk7CiAJfQotCQorCiAJZmluYWwgYm9vbGVhbiBpc0luc2VydEJvdW5kVG9QcmV2aW91cyhBU1ROb2RlIG5vZGUpIHsKIAkJcmV0dXJuIHRoaXMuZXZlbnRTdG9yZS5pc0luc2VydEJvdW5kVG9QcmV2aW91cyhub2RlKTsKLQl9CQotCQkKKwl9CisKIAlwcml2YXRlIGZpbmFsIFRleHRFZGl0R3JvdXAgZ2V0RWRpdEdyb3VwKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsKSB7CkBAIC0xOTAsNTQgKzI1MCw1NCBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCWZpbmFsIFJld3JpdGVFdmVudCBnZXRFdmVudChBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewogCQlyZXR1cm4gdGhpcy5ldmVudFN0b3JlLmdldEV2ZW50KHBhcmVudCwgcHJvcGVydHkpOwogCX0KLQkKKwogCWZpbmFsIFRleHRFZGl0R3JvdXAgZ2V0RWRpdEdyb3VwKFJld3JpdGVFdmVudCBjaGFuZ2UpIHsKIAkJcmV0dXJuIHRoaXMuZXZlbnRTdG9yZS5nZXRFdmVudEVkaXRHcm91cChjaGFuZ2UpOwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgT2JqZWN0IGdldE9yaWdpbmFsVmFsdWUoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJcmV0dXJuIHRoaXMuZXZlbnRTdG9yZS5nZXRPcmlnaW5hbFZhbHVlKHBhcmVudCwgcHJvcGVydHkpOwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgT2JqZWN0IGdldE5ld1ZhbHVlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCXJldHVybiB0aGlzLmV2ZW50U3RvcmUuZ2V0TmV3VmFsdWUocGFyZW50LCBwcm9wZXJ0eSk7Ci0JfQkKLQkKKwl9CisKIAlmaW5hbCB2b2lkIGFkZEVkaXQoVGV4dEVkaXQgZWRpdCkgewogCQl0aGlzLmN1cnJlbnRFZGl0LmFkZENoaWxkKGVkaXQpOwogCX0KLQkKKwogCWZpbmFsIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewogCQlyZXR1cm4gdGhpcy5mb3JtYXR0ZXIuZ2V0TGluZURlbGltaXRlcigpOwogCX0KLQkKKwogCWZpbmFsIFN0cmluZyBjcmVhdGVJbmRlbnRTdHJpbmcoaW50IGluZGVudCkgewogCSAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXIuY3JlYXRlSW5kZW50U3RyaW5nKGluZGVudCk7CiAJfQotCQorCiAJZmluYWwgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50T2ZMaW5lKGludCBwb3MpIHsKIAkJaW50IGxpbmU9IGdldExpbmVJbmZvcm1hdGlvbigpLmdldExpbmVPZk9mZnNldChwb3MpOwogCQlpZiAobGluZSA+PSAwKSB7CiAJCQljaGFyW10gY29udD0gZ2V0Q29udGVudCgpOwogCQkJaW50IGxpbmVTdGFydD0gZ2V0TGluZUluZm9ybWF0aW9uKCkuZ2V0TGluZU9mZnNldChsaW5lKTsKIAkJICAgIGludCBpPSBsaW5lU3RhcnQ7Ci0JCQl3aGlsZSAoaSA8IGNvbnQubGVuZ3RoICYmIEluZGVudE1hbmlwdWxhdGlvbi5pc0luZGVudENoYXIoY29udGVudFtpXSkpIHsKKwkJCXdoaWxlIChpIDwgY29udC5sZW5ndGggJiYgSW5kZW50TWFuaXB1bGF0aW9uLmlzSW5kZW50Q2hhcih0aGlzLmNvbnRlbnRbaV0pKSB7CiAJCQkgICAgaSsrOwogCQkJfQogCQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udCwgbGluZVN0YXJ0LCBpIC0gbGluZVN0YXJ0KTsKIAkJfQotCQlyZXR1cm4gbmV3IFN0cmluZygpOworCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7CiAJfQotCQotCQkKKworCiAJZmluYWwgU3RyaW5nIGdldEluZGVudEF0T2Zmc2V0KGludCBwb3MpIHsKIAkJcmV0dXJuIHRoaXMuZm9ybWF0dGVyLmdldEluZGVudFN0cmluZyhnZXRJbmRlbnRPZkxpbmUocG9zKSk7CiAJfQotCQorCiAJZmluYWwgdm9pZCBkb1RleHRJbnNlcnQoaW50IG9mZnNldCwgU3RyaW5nIGluc2VydFN0cmluZywgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJaWYgKGluc2VydFN0cmluZy5sZW5ndGgoKSA+IDApIHsKIAkJCS8vIGJ1ZyBmaXggZm9yIDk1ODM5OiBwcm9ibGVtIHdpdGggaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgYSBsaW5lIGNvbW1lbnQKQEAgLTI1OCwxMSArMzE4LDExIEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlmaW5hbCB2b2lkIGFkZEVkaXRHcm91cChUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCwgVGV4dEVkaXQgZWRpdCkgewogCQllZGl0R3JvdXAuYWRkVGV4dEVkaXQoZWRpdCk7CiAJfQotCQorCiAJZmluYWwgVGV4dEVkaXQgZG9UZXh0UmVtb3ZlKGludCBvZmZzZXQsIGludCBsZW4sIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7CiAJCWlmIChsZW4gPT0gMCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC0yNzQsNyArMzM0LDcgQEAKIAkJfQogCQlyZXR1cm4gZWRpdDsKIAl9Ci0JCisKIAlmaW5hbCB2b2lkIGRvVGV4dFJlbW92ZUFuZFZpc2l0KGludCBvZmZzZXQsIGludCBsZW4sIEFTVE5vZGUgbm9kZSwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJVGV4dEVkaXQgZWRpdD0gZG9UZXh0UmVtb3ZlKG9mZnNldCwgbGVuLCBlZGl0R3JvdXApOwogCQlpZiAoZWRpdCAhPSBudWxsKSB7CkBAIC0yODUsMTIgKzM0NSwxMiBAQAogCQkJdm9pZFZpc2l0KG5vZGUpOwogCQl9CiAJfQotCQorCiAJZmluYWwgaW50IGRvVmlzaXQoQVNUTm9kZSBub2RlKSB7CiAJCW5vZGUuYWNjZXB0KHRoaXMpOwogCQlyZXR1cm4gZ2V0RXh0ZW5kZWRFbmQobm9kZSk7CiAJfQotCQorCiAJcHJpdmF0ZSBmaW5hbCBpbnQgZG9WaXNpdChBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSwgaW50IG9mZnNldCkgewogCQlPYmplY3Qgbm9kZT0gZ2V0T3JpZ2luYWxWYWx1ZShwYXJlbnQsIHByb3BlcnR5KTsKIAkJaWYgKHByb3BlcnR5LmlzQ2hpbGRQcm9wZXJ0eSgpICYmIG5vZGUgIT0gbnVsbCkgewpAQCAtMzAwLDcgKzM2MCw3IEBACiAJCX0KIAkJcmV0dXJuIG9mZnNldDsKIAl9Ci0JCisKIAlwcml2YXRlIGludCBkb1Zpc2l0TGlzdChMaXN0IGxpc3QsIGludCBvZmZzZXQpIHsKIAkJaW50IGVuZFBvcz0gb2Zmc2V0OwogCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CkBAIC0zMDksMTEgKzM2OSwxMSBAQAogCQl9CiAJCXJldHVybiBlbmRQb3M7CiAJfQotCQorCiAJZmluYWwgdm9pZCB2b2lkVmlzaXQoQVNUTm9kZSBub2RlKSB7CiAJCW5vZGUuYWNjZXB0KHRoaXMpOwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgdm9pZCB2b2lkVmlzaXQoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJT2JqZWN0IG5vZGU9IGdldE9yaWdpbmFsVmFsdWUocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChwcm9wZXJ0eS5pc0NoaWxkUHJvcGVydHkoKSAmJiBub2RlICE9IG51bGwpIHsKQEAgLTMyMiwxMyArMzgyLDEzIEBACiAJCQl2b2lkVmlzaXRMaXN0KChMaXN0KSBub2RlKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB2b2lkVmlzaXRMaXN0KExpc3QgbGlzdCkgewogCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAJCQlkb1Zpc2l0KCgoQVNUTm9kZSkgaXRlci5uZXh0KCkpKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4oQVNUTm9kZSBwYXJlbnQpIHsKIAkJTGlzdCBwcm9wZXJ0aWVzPSBwYXJlbnQuc3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKCk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7CkBAIC0zMzYsOCArMzk2LDggQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQotCQorCisKIAlwcml2YXRlIGZpbmFsIHZvaWQgZG9UZXh0UmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuLCBTdHJpbmcgaW5zZXJ0U3RyaW5nLCBUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCkgewogCQlpZiAobGVuID4gMCB8fCBpbnNlcnRTdHJpbmcubGVuZ3RoKCkgPiAwKSB7CiAJCQlUZXh0RWRpdCBlZGl0PSBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBsZW4sIGluc2VydFN0cmluZyk7CkBAIC0zNDcsNjAgKzQwNyw2MCBAQAogCQkJfQogCQl9CiAJfQotCQkKKwogCXByaXZhdGUgZmluYWwgVGV4dEVkaXQgZG9UZXh0Q29weShUZXh0RWRpdCBzb3VyY2VFZGl0LCBpbnQgZGVzdE9mZnNldCwgaW50IHNvdXJjZUluZGVudExldmVsLCBTdHJpbmcgZGVzdEluZGVudFN0cmluZywgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJVGV4dEVkaXQgdGFyZ2V0RWRpdDsKIAkJU291cmNlTW9kaWZpZXIgbW9kaWZpZXI9IG5ldyBTb3VyY2VNb2RpZmllcihzb3VyY2VJbmRlbnRMZXZlbCwgZGVzdEluZGVudFN0cmluZywgdGhpcy5mb3JtYXR0ZXIuZ2V0VGFiV2lkdGgoKSwgdGhpcy5mb3JtYXR0ZXIuZ2V0SW5kZW50V2lkdGgoKSk7Ci0JCQorCiAJCWlmIChzb3VyY2VFZGl0IGluc3RhbmNlb2YgTW92ZVNvdXJjZUVkaXQpIHsKIAkJCU1vdmVTb3VyY2VFZGl0IG1vdmVFZGl0PSAoTW92ZVNvdXJjZUVkaXQpIHNvdXJjZUVkaXQ7CiAJCQltb3ZlRWRpdC5zZXRTb3VyY2VNb2RpZmllcihtb2RpZmllcik7Ci0JCQkKKwogCQkJdGFyZ2V0RWRpdD0gbmV3IE1vdmVUYXJnZXRFZGl0KGRlc3RPZmZzZXQsIG1vdmVFZGl0KTsKIAkJCWFkZEVkaXQodGFyZ2V0RWRpdCk7CiAJCX0gZWxzZSB7CiAJCQlDb3B5U291cmNlRWRpdCBjb3B5RWRpdD0gKENvcHlTb3VyY2VFZGl0KSBzb3VyY2VFZGl0OwogCQkJY29weUVkaXQuc2V0U291cmNlTW9kaWZpZXIobW9kaWZpZXIpOwotCQkJCisKIAkJCXRhcmdldEVkaXQ9IG5ldyBDb3B5VGFyZ2V0RWRpdChkZXN0T2Zmc2V0LCBjb3B5RWRpdCk7CiAJCQlhZGRFZGl0KHRhcmdldEVkaXQpOwogCQl9Ci0JCQorCiAJCWlmIChlZGl0R3JvdXAgIT0gbnVsbCkgewogCQkJYWRkRWRpdEdyb3VwKGVkaXRHcm91cCwgc291cmNlRWRpdCk7CiAJCQlhZGRFZGl0R3JvdXAoZWRpdEdyb3VwLCB0YXJnZXRFZGl0KTsKIAkJfQotCQlyZXR1cm4gdGFyZ2V0RWRpdDsJCQkKKwkJcmV0dXJuIHRhcmdldEVkaXQ7CiAKIAl9Ci0JCQkKKwogCXByaXZhdGUgdm9pZCBjaGFuZ2VOb3RTdXBwb3J0ZWQoQVNUTm9kZSBub2RlKSB7CiAJCUFzc2VydC5pc1RydWUoZmFsc2UsICJDaGFuZ2Ugbm90IHN1cHBvcnRlZCBpbiAiICsgbm9kZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCi0JCisKKwogCWNsYXNzIExpc3RSZXdyaXRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgY29udGFudFNlcGFyYXRvcjsKKwkJcHJvdGVjdGVkIFN0cmluZyBjb25zdGFudFNlcGFyYXRvcjsKIAkJcHJvdGVjdGVkIGludCBzdGFydFBvczsKLQkJCisKIAkJcHJvdGVjdGVkIFJld3JpdGVFdmVudFtdIGxpc3Q7Ci0JCQorCiAJCXByb3RlY3RlZCBmaW5hbCBBU1ROb2RlIGdldE9yaWdpbmFsTm9kZShpbnQgaW5kZXgpIHsKIAkJCXJldHVybiAoQVNUTm9kZSkgdGhpcy5saXN0W2luZGV4XS5nZXRPcmlnaW5hbFZhbHVlKCk7CiAJCX0KLQkJCisKIAkJcHJvdGVjdGVkIGZpbmFsIEFTVE5vZGUgZ2V0TmV3Tm9kZShpbnQgaW5kZXgpIHsKIAkJCXJldHVybiAoQVNUTm9kZSkgdGhpcy5saXN0W2luZGV4XS5nZXROZXdWYWx1ZSgpOwogCQl9Ci0JCQorCiAJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VwYXJhdG9yU3RyaW5nKGludCBub2RlSW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhbnRTZXBhcmF0b3I7CisJCQlyZXR1cm4gdGhpcy5jb25zdGFudFNlcGFyYXRvcjsKIAkJfQotCQkKKwogCQlwcm90ZWN0ZWQgaW50IGdldEluaXRpYWxJbmRlbnQoKSB7CiAJCQlyZXR1cm4gZ2V0SW5kZW50KHRoaXMuc3RhcnRQb3MpOwogCQl9Ci0JCQkJCisKIAkJcHJvdGVjdGVkIGludCBnZXROb2RlSW5kZW50KGludCBub2RlSW5kZXgpIHsKIAkJCUFTVE5vZGUgbm9kZT0gZ2V0T3JpZ2luYWxOb2RlKG5vZGVJbmRleCk7CiAJCQlpZiAobm9kZSA9PSBudWxsKSB7CkBAIC00MTQsNyArNDc0LDcgQEAKIAkJCX0KIAkJCXJldHVybiBnZXRJbmRlbnQobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQl9Ci0JCQorCiAJCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZk5leHROb2RlKGludCBuZXh0SW5kZXgsIGludCBkZWZhdWx0UG9zKSB7CiAJCQlmb3IgKGludCBpPSBuZXh0SW5kZXg7IGkgPCB0aGlzLmxpc3QubGVuZ3RoOyBpKyspIHsKIAkJCQlSZXdyaXRlRXZlbnQgZWxlbT0gdGhpcy5saXN0W2ldOwpAQCAtNDI1LDM3ICs0ODUsNDYgQEAKIAkJCX0KIAkJCXJldHVybiBkZWZhdWx0UG9zOwogCQl9Ci0JCQorCiAJCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2ZOb2RlKEFTVE5vZGUgbm9kZSkgewogCQkJcmV0dXJuIGdldEV4dGVuZGVkRW5kKG5vZGUpOwotCQl9CQkKLQkJCi0JCXB1YmxpYyBmaW5hbCBpbnQgcmV3cml0ZUxpc3QoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBvZmZzZXQsIFN0cmluZyBrZXl3b3JkLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCQl0aGlzLmNvbnRhbnRTZXBhcmF0b3I9IHNlcGFyYXRvcjsKLQkJCXJldHVybiByZXdyaXRlTGlzdChwYXJlbnQsIHByb3BlcnR5LCBvZmZzZXQsIGtleXdvcmQpOwogCQl9Ci0JCQorCisJCXB1YmxpYyBmaW5hbCBpbnQgcmV3cml0ZUxpc3QoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBvZmZzZXQsIFN0cmluZyBrZXl3b3JkLCBTdHJpbmcgc2VwYXJhdG9yKSB7CisJCQl0aGlzLmNvbnN0YW50U2VwYXJhdG9yPSBzZXBhcmF0b3I7CisJCQlyZXR1cm4gcmV3cml0ZUxpc3QocGFyZW50LCBwcm9wZXJ0eSwga2V5d29yZCwgbnVsbCwgb2Zmc2V0KTsKKwkJfQorCiAJCXByaXZhdGUgYm9vbGVhbiBpbnNlcnRBZnRlclNlcGFyYXRvcihBU1ROb2RlIG5vZGUpIHsKIAkJCXJldHVybiAhaXNJbnNlcnRCb3VuZFRvUHJldmlvdXMobm9kZSk7CiAJCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBpbnQgcmV3cml0ZUxpc3QoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBvZmZzZXQsIFN0cmluZyBrZXl3b3JkKSB7CisKKwkJcHJvdGVjdGVkIGJvb2xlYW4gbXVzdFJlbW92ZVNlcGFyYXRvcihpbnQgb3JpZ2luYWxPZmZzZXQsIGludCBub2RlSW5kZXgpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHJpdmF0ZSBpbnQgcmV3cml0ZUxpc3QoCisJCQkJQVNUTm9kZSBwYXJlbnQsCisJCQkJU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSwKKwkJCQlTdHJpbmcga2V5d29yZCwKKwkJCQlTdHJpbmcgZW5kS2V5d29yZCwKKwkJCQlpbnQgb2Zmc2V0KSB7CiAJCQl0aGlzLnN0YXJ0UG9zPSBvZmZzZXQ7CiAJCQl0aGlzLmxpc3Q9IGdldEV2ZW50KHBhcmVudCwgcHJvcGVydHkpLmdldENoaWxkcmVuKCk7Ci0JCQkKKwogCQkJaW50IHRvdGFsPSB0aGlzLmxpc3QubGVuZ3RoOwogCQkJaWYgKHRvdGFsID09IDApIHsKIAkJCQlyZXR1cm4gdGhpcy5zdGFydFBvczsKIAkJCX0KLQkJCisKIAkJCWludCBjdXJyUG9zPSAtMTsKLQkJCQorCiAJCQlpbnQgbGFzdE5vbkluc2VydD0gLTE7CiAJCQlpbnQgbGFzdE5vbkRlbGV0ZT0gLTE7Ci0JCQkJCQorCiAJCQlmb3IgKGludCBpPSAwOyBpIDwgdG90YWw7IGkrKykgewogCQkJCWludCBjdXJyTWFyaz0gdGhpcy5saXN0W2ldLmdldENoYW5nZUtpbmQoKTsKLQkJCQkKKwogCQkJCWlmIChjdXJyTWFyayAhPSBSZXdyaXRlRXZlbnQuSU5TRVJURUQpIHsKIAkJCQkJbGFzdE5vbkluc2VydD0gaTsKIAkJCQkJaWYgKGN1cnJQb3MgPT0gLTEpIHsKQEAgLTQ2NSwxMCArNTM0LDExIEBACiAJCQkJfQogCQkJCWlmIChjdXJyTWFyayAhPSBSZXdyaXRlRXZlbnQuUkVNT1ZFRCkgewogCQkJCQlsYXN0Tm9uRGVsZXRlPSBpOwotCQkJCX0JCQkKKwkJCQl9CiAJCQl9Ci0JCQotCQkJaWYgKGN1cnJQb3MgPT0gLTEpIHsgLy8gb25seSBpbnNlcnRzCisKKwkJCWJvb2xlYW4gaW5zZXJ0TmV3ID0gY3VyclBvcyA9PSAtMTsKKwkJCWlmIChpbnNlcnROZXcpIHsgLy8gb25seSBpbnNlcnRzCiAJCQkJaWYgKGtleXdvcmQubGVuZ3RoKCkgPiAwKSB7ICAvLyBjcmVhdGluZyBhIG5ldyBsaXN0IC0+IGluc2VydCBrZXl3b3JkIGZpcnN0IChlLmcuICIgdGhyb3dzICIpCiAJCQkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAodGhpcy5saXN0WzBdKTsgLy8gZmlyc3Qgbm9kZSBpcyBpbnNlcnQKIAkJCQkJZG9UZXh0SW5zZXJ0KG9mZnNldCwga2V5d29yZCwgZWRpdEdyb3VwKTsKQEAgLTQ3OCw5ICs1NDgsMTAgQEAKIAkJCWlmIChsYXN0Tm9uRGVsZXRlID09IC0xKSB7IC8vIGFsbCByZW1vdmVkLCBzZXQgYmFjayB0byBzdGFydCBzbyB0aGUga2V5d29yZCBpcyByZW1vdmVkIGFzIHdlbGwKIAkJCQljdXJyUG9zPSBvZmZzZXQ7CiAJCQl9Ci0JCQkKKwogCQkJaW50IHByZXZFbmQ9IGN1cnJQb3M7Ci0JCQkKKwkJCWludCBwcmV2TWFyaz0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRDsKKwogCQkJZmluYWwgaW50IE5PTkU9IDAsIE5FVz0gMSwgRVhJU1RJTkc9IDI7CiAJCQlpbnQgc2VwYXJhdG9yU3RhdGU9IE5FVzsKIApAQCAtNDkyLDE0ICs1NjMsMTggQEAKIAkJCQlpZiAoY3Vyck1hcmsgPT0gUmV3cml0ZUV2ZW50LklOU0VSVEVEKSB7CiAJCQkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAoY3VyckV2ZW50KTsKIAkJCQkJQVNUTm9kZSBub2RlPSAoQVNUTm9kZSkgY3VyckV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQorCiAJCQkJCWlmIChzZXBhcmF0b3JTdGF0ZSA9PSBOT05FKSB7IC8vIGVsZW1lbnQgYWZ0ZXIgbGFzdCBleGlzdGluZyBlbGVtZW50IChidXQgbm90IGZpcnN0KQogCQkJCQkJZG9UZXh0SW5zZXJ0KGN1cnJQb3MsIGdldFNlcGFyYXRvclN0cmluZyhpIC0gMSksIGVkaXRHcm91cCk7IC8vIGluc2VydCBzZXBhcmF0b3IKIAkJCQkJCXNlcGFyYXRvclN0YXRlPSBORVc7CiAJCQkJCX0KIAkJCQkJaWYgKHNlcGFyYXRvclN0YXRlID09IE5FVyB8fCBpbnNlcnRBZnRlclNlcGFyYXRvcihub2RlKSkgewotCQkJCQkJZG9UZXh0SW5zZXJ0KGN1cnJQb3MsIG5vZGUsIGdldE5vZGVJbmRlbnQoaSksIHRydWUsIGVkaXRHcm91cCk7IC8vIGluc2VydCBub2RlCisJCQkJCQlpZiAoc2VwYXJhdG9yU3RhdGUgPT0gRVhJU1RJTkcpIHsKKwkJCQkJCQl1cGRhdGVJbmRlbnQocHJldk1hcmssIGN1cnJQb3MsIGksIGVkaXRHcm91cCk7CisJCQkJCQl9CiAJCQkJCQkKKwkJCQkJCWRvVGV4dEluc2VydChjdXJyUG9zLCBub2RlLCBnZXROb2RlSW5kZW50KGkpLCB0cnVlLCBlZGl0R3JvdXApOyAvLyBpbnNlcnQgbm9kZQorCiAJCQkJCQlzZXBhcmF0b3JTdGF0ZT0gTkVXOwogCQkJCQkJaWYgKGkgIT0gbGFzdE5vbkRlbGV0ZSkgewogCQkJCQkJCWlmICh0aGlzLmxpc3RbbmV4dEluZGV4XS5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LklOU0VSVEVEKSB7CkBAIC01MTIsMTAgKzU4Nyw0MSBAQAogCQkJCQkJZG9UZXh0SW5zZXJ0KHByZXZFbmQsIGdldFNlcGFyYXRvclN0cmluZyhpIC0gMSksIGVkaXRHcm91cCk7CiAJCQkJCQlkb1RleHRJbnNlcnQocHJldkVuZCwgbm9kZSwgZ2V0Tm9kZUluZGVudChpKSwgdHJ1ZSwgZWRpdEdyb3VwKTsKIAkJCQkJfQorCQkJCQlpZiAoaW5zZXJ0TmV3KSB7CisJCQkJCQlpZiAoZW5kS2V5d29yZCAhPSBudWxsICYmIGVuZEtleXdvcmQubGVuZ3RoKCkgPiAwKSB7CisJCQkJCQkJZG9UZXh0SW5zZXJ0KGN1cnJQb3MsIGVuZEtleXdvcmQsIGVkaXRHcm91cCk7CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKGN1cnJNYXJrID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7CiAJCQkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIGN1cnJFdmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7CiAJCQkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAoY3VyckV2ZW50KTsKIAkJCQkJaW50IGN1cnJFbmQ9IGdldEVuZE9mTm9kZShub2RlKTsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjUyNAorCQkJCQkvLyBDaGVjayBmb3IgbGVhZGluZyBjb21tZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiBleHRlbmRlZCByYW5nZSwgYW5kIHByZXZlbnQgdGhlbQorCQkJCQkvLyBmcm9tIGdldHRpbmcgcmVtb3ZlZC4KKwkJCQkJdHJ5IHsKKwkJCQkJCVRva2VuU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcigpOworCQkJCQkJaW50IG5ld09mZnNldCA9IHByZXZFbmQ7CisJCQkJCQlpbnQgZXh0ZW5kZWRPZmZzZXQgPSBnZXRFeHRlbmRlZE9mZnNldChub2RlKTsKKwkJCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIGxhc3QgY29tbWVudCB3aGljaCBpcyBub3QgcGFydCBvZiBleHRlbmRlZCBzb3VyY2UKKwkJCQkJCS8vIHJhbmdlIG9mIHRoZSBub2RlLgorCQkJCQkJd2hpbGUgKFRva2VuU2Nhbm5lci5pc0NvbW1lbnQoc2Nhbm5lci5yZWFkTmV4dChuZXdPZmZzZXQsIGZhbHNlKSkpIHsKKwkJCQkJCQlpbnQgdGVtcE9mZnNldCA9IHNjYW5uZXIuZ2V0TmV4dEVuZE9mZnNldChuZXdPZmZzZXQsIGZhbHNlKTsKKwkJCQkJCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBjb21tZW50IGlzIHBhcnQgb2YgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG9mIHRoZSBub2RlLgorCQkJCQkJCS8vIElmIGl0IGlzIHRoZW4gd2UgbmVlZCB0byBzdG9wLgorCQkJCQkJCWlmICh0ZW1wT2Zmc2V0IDwgZXh0ZW5kZWRPZmZzZXQpIHsKKwkJCQkJCQkJbmV3T2Zmc2V0ID0gdGVtcE9mZnNldDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoY3VyclBvcyA8IG5ld09mZnNldCkgeworCQkJCQkJCWN1cnJQb3MgPSBleHRlbmRlZE9mZnNldDsKKwkJCQkJCX0gCisJCQkJCQlwcmV2RW5kID0gbmV3T2Zmc2V0OwkJCisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gaWdub3JlCisJCQkJCX0KIAkJCQkJaWYgKGkgPiBsYXN0Tm9uRGVsZXRlICYmIHNlcGFyYXRvclN0YXRlID09IEVYSVNUSU5HKSB7CiAJCQkJCQkvLyBpcyBsYXN0LCByZW1vdmUgcHJldmlvdXMgc2VwYXJhdG9yOiBzcGxpdCBkZWxldGUgdG8gYWxsb3cgcmFuZ2UgY29waWVzCiAJCQkJCQlkb1RleHRSZW1vdmUocHJldkVuZCwgY3VyclBvcyAtIHByZXZFbmQsIGVkaXRHcm91cCk7IC8vIHJlbW92ZSBzZXBhcmF0b3IKQEAgLTUyMywxMCArNjI5LDM1IEBACiAJCQkJCQljdXJyUG9zPSBjdXJyRW5kOwogCQkJCQkJcHJldkVuZD0gY3VyckVuZDsKIAkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChpIDwgbGFzdE5vbkRlbGV0ZSkgeworCQkJCQkJCXVwZGF0ZUluZGVudChwcmV2TWFyaywgY3VyclBvcywgaSwgZWRpdEdyb3VwKTsKKwkJCQkJCX0KKwkJCQkJCQogCQkJCQkJLy8gcmVtb3ZlIGVsZW1lbnQgYW5kIG5leHQgc2VwYXJhdG9yCiAJCQkJCQlpbnQgZW5kPSBnZXRTdGFydE9mTmV4dE5vZGUobmV4dEluZGV4LCBjdXJyRW5kKTsgLy8gc3RhcnQgb2YgbmV4dAorCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjUyNAorCQkJCQkJLy8gQ2hlY2sgZm9yIHRyYWlsaW5nIGNvbW1lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGV4dGVuZGVkIHJhbmdlLCBhbmQgcHJldmVudCB0aGVtCisJCQkJCQkvLyBmcm9tIGdldHRpbmcgcmVtb3ZlZC4KKwkJCQkJCXRyeSB7CisJCQkJCQkJVG9rZW5TY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKCk7CisJCQkJCQkJaW50IG5leHRUb2tlbj0gc2Nhbm5lci5yZWFkTmV4dChjdXJyRW5kLCBmYWxzZSk7CisJCQkJCQkJaWYgKFRva2VuU2Nhbm5lci5pc0NvbW1lbnQobmV4dFRva2VuKSkgeworCQkJCQkJCQkvLyB0aGUgc2VwYXJhdG9yIGFsc28gaGFzIGNvbW1lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGV4dGVuZGVkCisJCQkJCQkJCS8vIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgb3IgdGhlIG5leHQgbm9kZS4gU28gZG9udCByZW1vdmUgdGhlIHNlcGFyYXRvcgorCQkJCQkJCQlpZiAoZW5kICE9IHNjYW5uZXIuZ2V0TmV4dFN0YXJ0T2Zmc2V0KGN1cnJFbmQsIGZhbHNlKSkgeworCQkJCQkJCQkJLy8gSWYgdGhpcyBjb25kaXRpb24gd2VyZSB0cnVlLCBjb21tZW50cyBqdXN0IGZvdW5kIGFzIHBhcnQgb2YgdGhlIHNlcGFyYXRvciB3b3VsZCd2ZSBiYXNpY2FsbHkgYmVlbgorCQkJCQkJCQkJLy8gcGFydCBvZiB0aGUgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG9mIHRoZSBuZXh0IG5vZGUuIFNvICdlbmQnIHd1ZCd2ZSBzYWZlbHkgYmVlbiBzZXQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24KKwkJCQkJCQkJCS8vIGFuZCBubyBjaGFuZ2UgaXMgbmVlZGVkLgorCQkJCQkJCQkJZW5kID0gY3VyckVuZDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJfQogCQkJCQkJZG9UZXh0UmVtb3ZlQW5kVmlzaXQoY3VyclBvcywgY3VyckVuZCAtIGN1cnJQb3MsIG5vZGUsIGdldEVkaXRHcm91cChjdXJyRXZlbnQpKTsgLy8gcmVtb3ZlIG5vZGUKLQkJCQkJCWRvVGV4dFJlbW92ZShjdXJyRW5kLCBlbmQgLSBjdXJyRW5kLCBlZGl0R3JvdXApOyAvLyByZW1vdmUgc2VwYXJhdG9yCisJCQkJCQlpZiAobXVzdFJlbW92ZVNlcGFyYXRvcihjdXJyUG9zLCBpKSkgeworCQkJCQkJCWRvVGV4dFJlbW92ZShjdXJyRW5kLCBlbmQgLSBjdXJyRW5kLCBlZGl0R3JvdXApOyAvLyByZW1vdmUgc2VwYXJhdG9yCisJCQkJCQl9CiAJCQkJCQljdXJyUG9zPSBlbmQ7CiAJCQkJCQlwcmV2RW5kPSBjdXJyRW5kOwogCQkJCQkJc2VwYXJhdG9yU3RhdGU9IE5FVzsKQEAgLTUzNSwxMiArNjY2LDM4IEBACiAJCQkJCWlmIChjdXJyTWFyayA9PSBSZXdyaXRlRXZlbnQuUkVQTEFDRUQpIHsKIAkJCQkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIGN1cnJFdmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7CiAJCQkJCQlpbnQgY3VyckVuZD0gZ2V0RW5kT2ZOb2RlKG5vZGUpOwotCQkJCQkJCisKIAkJCQkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAoY3VyckV2ZW50KTsKIAkJCQkJCUFTVE5vZGUgY2hhbmdlZD0gKEFTVE5vZGUpIGN1cnJFdmVudC5nZXROZXdWYWx1ZSgpOworCQkJCQkJCisJCQkJCQl1cGRhdGVJbmRlbnQocHJldk1hcmssIGN1cnJQb3MsIGksIGVkaXRHcm91cCk7CisJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBjb21tZW50cyBiZXR3ZWVuIGxhc3QgbW9kaWZpZWQgc291cmNlIHBvc2l0aW9uIGFuZCBleHRlbmRlZCBzdGFydGluZyBwb3NpdGlvbiBvZgorCQkJCQkJLy8gbm9kZSB0byBiZSByZXBsYWNlZCBhcmUgbm90IHRvdWNoZWQKKwkJCQkJCXRyeSB7CisJCQkJCQkJVG9rZW5TY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKCk7CisJCQkJCQkJaW50IG5ld09mZnNldCA9IHByZXZFbmQ7CisJCQkJCQkJaW50IGV4dGVuZGVkT2Zmc2V0ID0gZ2V0RXh0ZW5kZWRPZmZzZXQobm9kZSk7CisJCQkJCQkJLy8gVHJ5IHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgbGFzdCBjb21tZW50IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGV4dGVuZGVkIHNvdXJjZQorCQkJCQkJCS8vIHJhbmdlIG9mIHRoZSBub2RlLgorCQkJCQkJCXdoaWxlIChUb2tlblNjYW5uZXIuaXNDb21tZW50KHNjYW5uZXIucmVhZE5leHQobmV3T2Zmc2V0LCBmYWxzZSkpKSB7CisJCQkJCQkJCWludCB0ZW1wT2Zmc2V0ID0gc2Nhbm5lci5nZXROZXh0RW5kT2Zmc2V0KG5ld09mZnNldCwgZmFsc2UpOworCQkJCQkJCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBjb21tZW50IGlzIHBhcnQgb2YgZXh0ZW5kZWQgc291cmNlIHJhbmdlIG9mIHRoZSBub2RlLgorCQkJCQkJCQkvLyBJZiBpdCBpcyB0aGVuIHdlIG5lZWQgdG8gc3RvcC4KKwkJCQkJCQkJaWYgKHRlbXBPZmZzZXQgPCBleHRlbmRlZE9mZnNldCkgeworCQkJCQkJCQkJbmV3T2Zmc2V0ID0gdGVtcE9mZnNldDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmIChjdXJyUG9zIDwgbmV3T2Zmc2V0KSB7CisJCQkJCQkJCWN1cnJQb3MgPSBleHRlbmRlZE9mZnNldDsKKwkJCQkJCQl9IAkJCisJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCX0KIAkJCQkJCWRvVGV4dFJlbW92ZUFuZFZpc2l0KGN1cnJQb3MsIGN1cnJFbmQgLSBjdXJyUG9zLCBub2RlLCBlZGl0R3JvdXApOwogCQkJCQkJZG9UZXh0SW5zZXJ0KGN1cnJQb3MsIGNoYW5nZWQsIGdldE5vZGVJbmRlbnQoaSksIHRydWUsIGVkaXRHcm91cCk7Ci0JCQkJCQkKKwogCQkJCQkJcHJldkVuZD0gY3VyckVuZDsKIAkJCQkJfSBlbHNlIHsgLy8gaXMgdW5jaGFuZ2VkCiAJCQkJCQlBU1ROb2RlIG5vZGU9IChBU1ROb2RlKSBjdXJyRXZlbnQuZ2V0T3JpZ2luYWxWYWx1ZSgpOwpAQCAtNTYwLDE2ICs3MTcsMjggQEAKIAkJCQkJCQlwcmV2RW5kPSBnZXRFbmRPZk5vZGUobm9kZSk7CiAJCQkJCQl9CiAJCQkJCQljdXJyUG9zPSBnZXRTdGFydE9mTmV4dE5vZGUobmV4dEluZGV4LCBwcmV2RW5kKTsgLy8gc3RhcnQgb2YgbmV4dAotCQkJCQkJc2VwYXJhdG9yU3RhdGU9IEVYSVNUSU5HOwkJCQkJCQkKKwkJCQkJCXNlcGFyYXRvclN0YXRlPSBFWElTVElORzsKIAkJCQkJfQogCQkJCX0KLQorCQkJCQorCQkJCXByZXZNYXJrID0gY3Vyck1hcms7CiAJCQl9CiAJCQlyZXR1cm4gY3VyclBvczsKIAkJfQorCQlwdWJsaWMgZmluYWwgaW50IHJld3JpdGVMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBpbnQgb2Zmc2V0LCBTdHJpbmcga2V5d29yZCkgeworCQkJcmV0dXJuIHJld3JpdGVMaXN0KHBhcmVudCwgcHJvcGVydHksIGtleXdvcmQsIG51bGwsIG9mZnNldCk7CisJCX0KIAkJCisJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUluZGVudChpbnQgcHJldk1hcmssIGludCBvcmlnaW5hbE9mZnNldCwgaW50IG5vZGVJbmRleCwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKKwkJCS8vIERvIG5vdGhpbmcuCisJCX0KKworCQlwdWJsaWMgZmluYWwgaW50IHJld3JpdGVMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBpbnQgb2Zmc2V0LCBTdHJpbmcga2V5d29yZCwgU3RyaW5nIGVuZEtleXdvcmQsIFN0cmluZyBzZXBhcmF0b3IpIHsKKwkJCXRoaXMuY29uc3RhbnRTZXBhcmF0b3I9IHNlcGFyYXRvcjsKKwkJCXJldHVybiByZXdyaXRlTGlzdChwYXJlbnQsIHByb3BlcnR5LCBrZXl3b3JkLCBlbmRLZXl3b3JkLCBvZmZzZXQpOworCQl9CiAJfQotCQkJCQorCiAJcHJpdmF0ZSBpbnQgcmV3cml0ZVJlcXVpcmVkTm9kZShBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewogCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGdldEV2ZW50KHBhcmVudCwgcHJvcGVydHkpOwogCQlpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlJFUExBQ0VEKSB7CkBAIC01ODAsMTEgKzc0OSwxMSBAQAogCQkJaW50IGxlbmd0aD0gcmFuZ2UuZ2V0TGVuZ3RoKCk7CiAJCQlkb1RleHRSZW1vdmVBbmRWaXNpdChvZmZzZXQsIGxlbmd0aCwgbm9kZSwgZWRpdEdyb3VwKTsKIAkJCWRvVGV4dEluc2VydChvZmZzZXQsIChBU1ROb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpLCBnZXRJbmRlbnQob2Zmc2V0KSwgdHJ1ZSwgZWRpdEdyb3VwKTsKLQkJCXJldHVybiBvZmZzZXQgKyBsZW5ndGg7CQorCQkJcmV0dXJuIG9mZnNldCArIGxlbmd0aDsKIAkJfQogCQlyZXR1cm4gZG9WaXNpdChwYXJlbnQsIHByb3BlcnR5LCAwKTsKIAl9Ci0JCQorCiAJcHJpdmF0ZSBpbnQgcmV3cml0ZU5vZGUoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBvZmZzZXQsIFByZWZpeCBwcmVmaXgpIHsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChwYXJlbnQsIHByb3BlcnR5KTsKIAkJaWYgKGV2ZW50ICE9IG51bGwpIHsKQEAgLTU5NywxMyArNzY2LDIyIEBACiAJCQkJCWRvVGV4dEluc2VydChvZmZzZXQsIG5vZGUsIGluZGVudCwgdHJ1ZSwgZWRpdEdyb3VwKTsKIAkJCQkJcmV0dXJuIG9mZnNldDsKIAkJCQl9Ci0JCQkJY2FzZSBSZXdyaXRlRXZlbnQuUkVNT1ZFRDogewkKKwkJCQljYXNlIFJld3JpdGVFdmVudC5SRU1PVkVEOiB7CiAJCQkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKTsKIAkJCQkJVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA9IGdldEVkaXRHcm91cChldmVudCk7CiAJCQkJCQotCQkJCQlpbnQgbm9kZUVuZD0gZ2V0RXh0ZW5kZWRFbmQobm9kZSk7CiAJCQkJCS8vIGlmIHRoZXJlIGlzIGEgcHJlZml4LCByZW1vdmUgdGhlIHByZWZpeCBhcyB3ZWxsCi0JCQkJCWludCBsZW49IG5vZGVFbmQgLSBvZmZzZXQ7CisJCQkJCWludCBub2RlRW5kOworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAob2Zmc2V0ID09IDApIHsKKwkJCQkJCVNvdXJjZVJhbmdlIHJhbmdlPSBnZXRFeHRlbmRlZFJhbmdlKG5vZGUpOworCQkJCQkJb2Zmc2V0PSByYW5nZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJCQlsZW49IHJhbmdlLmdldExlbmd0aCgpOworCQkJCQkJbm9kZUVuZD0gb2Zmc2V0K2xlbjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5vZGVFbmQ9IGdldEV4dGVuZGVkRW5kKG5vZGUpOworCQkJCQkJbGVuPSBub2RlRW5kLW9mZnNldDsKKwkJCQkJfQogCQkJCQlkb1RleHRSZW1vdmVBbmRWaXNpdChvZmZzZXQsIGxlbiwgbm9kZSwgZWRpdEdyb3VwKTsKIAkJCQkJcmV0dXJuIG5vZGVFbmQ7CiAJCQkJfQpAQCAtNjIxLDcgKzc5OSw3IEBACiAJCX0KIAkJcmV0dXJuIGRvVmlzaXQocGFyZW50LCBwcm9wZXJ0eSwgb2Zmc2V0KTsKIAl9Ci0JCisKIAlwcml2YXRlIGludCByZXdyaXRlSmF2YWRvYyhBU1ROb2RlIG5vZGUsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaW50IHBvcz0gcmV3cml0ZU5vZGUobm9kZSwgcHJvcGVydHksIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCBBU1RSZXdyaXRlRm9ybWF0dGVyLk5PTkUpOwogCQlpbnQgY2hhbmdlS2luZD0gZ2V0Q2hhbmdlS2luZChub2RlLCBwcm9wZXJ0eSk7CkBAIC02MzksOCArODE3LDggQEAKIAkJfQogCQlyZXR1cm4gcG9zOwogCX0KLQkKLQkKKworCiAJLyoKIAkgKiBlbmRwb3MgY2FuIGJlIC0xIC0+IHVzZSB0aGUgZW5kIHBvcyBvZiB0aGUgYm9keQogCSAqLwpAQCAtNjUxLDkgKzgyOSw5IEBACiAJCQkJY2FzZSBSZXdyaXRlRXZlbnQuSU5TRVJURUQ6IHsKIAkJCQkJQVNUTm9kZSBub2RlPSAoQVNUTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKIAkJCQkJVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA9IGdldEVkaXRHcm91cChldmVudCk7Ci0JCQkJCQorCiAJCQkJCVN0cmluZ1tdIHN0cmluZ3M9IGNvbnRleHQuZ2V0UHJlZml4QW5kU3VmZml4KGluZGVudCwgbm9kZSwgdGhpcy5ldmVudFN0b3JlKTsKLQkJCQkJCisKIAkJCQkJZG9UZXh0SW5zZXJ0KG9mZnNldCwgc3RyaW5nc1swXSwgZWRpdEdyb3VwKTsKIAkJCQkJZG9UZXh0SW5zZXJ0KG9mZnNldCwgbm9kZSwgaW5kZW50LCB0cnVlLCBlZGl0R3JvdXApOwogCQkJCQlkb1RleHRJbnNlcnQob2Zmc2V0LCBzdHJpbmdzWzFdLCBlZGl0R3JvdXApOwpAQCAtNjY0LDcgKzg0Miw3IEBACiAJCQkJCWlmIChlbmRQb3MgPT0gLTEpIHsKIAkJCQkJCWVuZFBvcz0gZ2V0RXh0ZW5kZWRFbmQobm9kZSk7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA9IGdldEVkaXRHcm91cChldmVudCk7CiAJCQkJCS8vIGlmIHRoZXJlIGlzIGEgcHJlZml4LCByZW1vdmUgdGhlIHByZWZpeCBhcyB3ZWxsCiAJCQkJCWludCBsZW49IGVuZFBvcyAtIG9mZnNldDsKQEAgLTY3MywxOCArODUxLDM2IEBACiAJCQkJfQogCQkJCWNhc2UgUmV3cml0ZUV2ZW50LlJFUExBQ0VEOiB7CiAJCQkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKTsKKwkJCQkJYm9vbGVhbiBpbnNlcnROZXdMaW5lID0gZmFsc2U7CiAJCQkJCWlmIChlbmRQb3MgPT0gLTEpIHsKKwkJCQkJCWludCBwcmV2aW91c0VuZCA9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpICsgbm9kZS5nZXRMZW5ndGgoKTsKIAkJCQkJCWVuZFBvcz0gZ2V0RXh0ZW5kZWRFbmQobm9kZSk7CisJCQkJCQlpZiAoZW5kUG9zICE9IHByZXZpb3VzRW5kKSB7CisJCQkJCQkJLy8gY2hlY2sgaWYgdGhlIGVuZCBpcyBhIGNvbW1lbnQKKwkJCQkJCQlpbnQgdG9rZW4gPSBUb2tlblNjYW5uZXIuRU5EX09GX0ZJTEU7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJdG9rZW4gPSBnZXRTY2FubmVyKCkucmVhZE5leHQocHJldmlvdXNFbmQsIGZhbHNlKTsKKwkJCQkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfTElORSkgeworCQkJCQkJCQlpbnNlcnROZXdMaW5lID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CiAJCQkJCX0KIAkJCQkJVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA9IGdldEVkaXRHcm91cChldmVudCk7Ci0JCQkJCWludCBub2RlTGVuPSBlbmRQb3MgLSBvZmZzZXQ7IAotCQkJCQkKKwkJCQkJaW50IG5vZGVMZW49IGVuZFBvcyAtIG9mZnNldDsKKwogCQkJCQlBU1ROb2RlIHJlcGxhY2luZ05vZGU9IChBU1ROb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpOwogCQkJCQlTdHJpbmdbXSBzdHJpbmdzPSBjb250ZXh0LmdldFByZWZpeEFuZFN1ZmZpeChpbmRlbnQsIHJlcGxhY2luZ05vZGUsIHRoaXMuZXZlbnRTdG9yZSk7CiAJCQkJCWRvVGV4dFJlbW92ZUFuZFZpc2l0KG9mZnNldCwgbm9kZUxlbiwgbm9kZSwgZWRpdEdyb3VwKTsKLQkJCQkJCisKIAkJCQkJU3RyaW5nIHByZWZpeD0gc3RyaW5nc1swXTsKLQkJCQkJZG9UZXh0SW5zZXJ0KG9mZnNldCwgcHJlZml4LCBlZGl0R3JvdXApOworCQkJCQlTdHJpbmcgaW5zZXJ0ZWRQcmVmaXggPSBwcmVmaXg7CisJCQkJCWlmIChpbnNlcnROZXdMaW5lKSB7CisJCQkJCQlpbnNlcnRlZFByZWZpeCA9IGdldExpbmVEZWxpbWl0ZXIoKSArIHRoaXMuZm9ybWF0dGVyLmNyZWF0ZUluZGVudFN0cmluZyhpbmRlbnQpICsgaW5zZXJ0ZWRQcmVmaXgudHJpbSgpICsgJyAnOworCQkJCQl9CisJCQkJCWRvVGV4dEluc2VydChvZmZzZXQsIGluc2VydGVkUHJlZml4LCBlZGl0R3JvdXApOwogCQkJCQlTdHJpbmcgbGluZUluUHJlZml4PSBnZXRDdXJyZW50TGluZShwcmVmaXgsIHByZWZpeC5sZW5ndGgoKSk7CiAJCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgIT0gbGluZUluUHJlZml4Lmxlbmd0aCgpKSB7CiAJCQkJCQkvLyBwcmVmaXggY29udGFpbnMgYSBuZXcgbGluZTogdXBkYXRlIHRoZSBpbmRlbnQgdG8gdGhlIG9uZSB1c2VkIGluIHRoZSBwcmVmaXgKQEAgLTcwMiw3ICs4OTgsNiBAQAogCQl9CiAJCXJldHVybiBwb3M7CiAJfQotCQogCXByaXZhdGUgaW50IHJld3JpdGVPcHRpb25hbFF1YWxpZmllcihBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSwgaW50IHN0YXJ0UG9zKSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsKSB7CkBAIC03MTgsNyArOTEzLDcgQEAKIAkJCQkJdHJ5IHsKIAkJCQkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKTsKIAkJCQkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAoZXZlbnQpOwotCQkJCQkJaW50IGRvdEVuZD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9ULCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG5vZGUuZ2V0TGVuZ3RoKCkpOworCQkJCQkJaW50IGRvdEVuZD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyBub2RlLmdldExlbmd0aCgpKTsKIAkJCQkJCWRvVGV4dFJlbW92ZUFuZFZpc2l0KHN0YXJ0UG9zLCBkb3RFbmQgLSBzdGFydFBvcywgbm9kZSwgZWRpdEdyb3VwKTsKIAkJCQkJCXJldHVybiBkb3RFbmQ7CiAJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtNzMyLDExICs5MjcsMTEgQEAKIAkJCQkJU291cmNlUmFuZ2UgcmFuZ2U9IGdldEV4dGVuZGVkUmFuZ2Uobm9kZSk7CiAJCQkJCWludCBvZmZzZXQ9IHJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCQkJaW50IGxlbmd0aD0gcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQorCiAJCQkJCWRvVGV4dFJlbW92ZUFuZFZpc2l0KG9mZnNldCwgbGVuZ3RoLCBub2RlLCBlZGl0R3JvdXApOwogCQkJCQlkb1RleHRJbnNlcnQob2Zmc2V0LCAoQVNUTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSwgZ2V0SW5kZW50KHN0YXJ0UG9zKSwgdHJ1ZSwgZWRpdEdyb3VwKTsKIAkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1QsIG9mZnNldCArIGxlbmd0aCk7CisJCQkJCQlyZXR1cm4gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCwgb2Zmc2V0ICsgbGVuZ3RoKTsKIAkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQkJCX0KQEAgLTc1MCw0MSArOTQ1LDQ1IEBACiAJCX0KIAkJaW50IHBvcz0gZG9WaXNpdCgoQVNUTm9kZSkgbm9kZSk7CiAJCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9ULCBwb3MpOworCQkJcmV0dXJuIGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QsIHBvcyk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQl9CiAJCXJldHVybiBwb3M7Ci0JfQkKLQkKKwl9CisKIAljbGFzcyBQYXJhZ3JhcGhMaXN0UmV3cml0ZXIgZXh0ZW5kcyBMaXN0UmV3cml0ZXIgewotCQkKKwogCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1NQQUNJTkc9IDE7Ci0JCQorCiAJCXByaXZhdGUgaW50IGluaXRpYWxJbmRlbnQ7CiAJCXByaXZhdGUgaW50IHNlcGFyYXRvckxpbmVzOwotCQkKKwogCQlwdWJsaWMgUGFyYWdyYXBoTGlzdFJld3JpdGVyKGludCBpbml0aWFsSW5kZW50LCBpbnQgc2VwYXJhdG9yKSB7CiAJCQl0aGlzLmluaXRpYWxJbmRlbnQ9IGluaXRpYWxJbmRlbnQ7CiAJCQl0aGlzLnNlcGFyYXRvckxpbmVzPSBzZXBhcmF0b3I7CiAJCX0KLQkJCisKIAkJcHJvdGVjdGVkIGludCBnZXRJbml0aWFsSW5kZW50KCkgewogCQkJcmV0dXJuIHRoaXMuaW5pdGlhbEluZGVudDsKIAkJfQotCQkJCQkJCisKIAkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXBhcmF0b3JTdHJpbmcoaW50IG5vZGVJbmRleCkgeworCQkJcmV0dXJuIGdldFNlcGFyYXRvclN0cmluZyhub2RlSW5kZXgsIG5vZGVJbmRleCArIDEpOworCQl9CisJCQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcGFyYXRvclN0cmluZyhpbnQgbm9kZUluZGV4LCBpbnQgbmV4dE5vZGVJbmRleCkgewogCQkJaW50IG5ld0xpbmVzPSB0aGlzLnNlcGFyYXRvckxpbmVzID09IC0xID8gZ2V0TmV3TGluZXMobm9kZUluZGV4KSA6IHRoaXMuc2VwYXJhdG9yTGluZXM7Ci0JCQkKKwogCQkJU3RyaW5nIGxpbmVEZWxpbT0gZ2V0TGluZURlbGltaXRlcigpOwogCQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcihsaW5lRGVsaW0pOwogCQkJZm9yIChpbnQgaT0gMDsgaSA8IG5ld0xpbmVzOyBpKyspIHsKIAkJCQlidWYuYXBwZW5kKGxpbmVEZWxpbSk7CiAJCQl9Ci0JCQlidWYuYXBwZW5kKGNyZWF0ZUluZGVudFN0cmluZyhnZXROb2RlSW5kZW50KG5vZGVJbmRleCArIDEpKSk7CisJCQlidWYuYXBwZW5kKGNyZWF0ZUluZGVudFN0cmluZyhnZXROb2RlSW5kZW50KG5leHROb2RlSW5kZXgpKSk7CiAJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJCX0KLQkJCisKIAkJcHJpdmF0ZSBBU1ROb2RlIGdldE5vZGUoaW50IG5vZGVJbmRleCkgewogCQkJQVNUTm9kZSBlbGVtPSAoQVNUTm9kZSkgdGhpcy5saXN0W25vZGVJbmRleF0uZ2V0T3JpZ2luYWxWYWx1ZSgpOwogCQkJaWYgKGVsZW0gPT0gbnVsbCkgewpAQCAtNzkyLDExICs5OTEsMTEgQEAKIAkJCX0KIAkJCXJldHVybiBlbGVtOwogCQl9Ci0JCQorCiAJCXByaXZhdGUgaW50IGdldE5ld0xpbmVzKGludCBub2RlSW5kZXgpIHsKIAkJCUFTVE5vZGUgY3Vycj0gZ2V0Tm9kZShub2RlSW5kZXgpOwogCQkJQVNUTm9kZSBuZXh0PSBnZXROb2RlKG5vZGVJbmRleCArIDEpOwotCQkJCisKIAkJCWludCBjdXJyS2luZD0gY3Vyci5nZXROb2RlVHlwZSgpOwogCQkJaW50IG5leHRLaW5kPSBuZXh0LmdldE5vZGVUeXBlKCk7CiAKQEAgLTg0NSwxNSArMTA0NCw1MiBAQAogCQkJCX0KIAkJCX0KIAkJCXJldHVybiAwOwotCQl9CQkKLQl9CisJCX0KIAkJCisJCXByb3RlY3RlZCBib29sZWFuIG11c3RSZW1vdmVTZXBhcmF0b3IoaW50IG9yaWdpbmFsT2Zmc2V0LCBpbnQgbm9kZUluZGV4KSB7CisJCQkvLyBEbyBub3QgcmVtb3ZlIHNlcGFyYXRvciBpZiB0aGUgcHJldmlvdXMgbm9uIHJlbW92ZWQgbm9kZSBpcyBvbiB0aGUgc2FtZSBsaW5lIGFuZCB0aGUgbmV4dCBub2RlIGlzIG9uIGFub3RoZXIgbGluZQorCQkJaW50IHByZXZpb3VzTm9uUmVtb3ZlZE5vZGVJbmRleCA9IG5vZGVJbmRleCAtIDE7CisJCQl3aGlsZSAocHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4ID49IDAgJiYgdGhpcy5saXN0W3ByZXZpb3VzTm9uUmVtb3ZlZE5vZGVJbmRleF0uZ2V0Q2hhbmdlS2luZCgpID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7CisJCQkJcHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4LS07CisJCQl9CisJCQkKKwkJCWlmIChwcmV2aW91c05vblJlbW92ZWROb2RlSW5kZXggPiAtMSkgeworCQkJCUxpbmVJbmZvcm1hdGlvbiBsaW5lSW5mb3JtYXRpb24gPSBnZXRMaW5lSW5mb3JtYXRpb24oKTsKKwkJCQkKKwkJCQlSZXdyaXRlRXZlbnQgcHJldkV2ZW50ID0gdGhpcy5saXN0W3ByZXZpb3VzTm9uUmVtb3ZlZE5vZGVJbmRleF07CisJCQkJaW50IHByZXZLaW5kID0gcHJldkV2ZW50LmdldENoYW5nZUtpbmQoKTsKKwkJCQlpZiAocHJldktpbmQgPT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCB8fCBwcmV2S2luZCA9PSBSZXdyaXRlRXZlbnQuUkVQTEFDRUQpIHsKKwkJCQkJQVNUTm9kZSBwcmV2Tm9kZSA9IChBU1ROb2RlKSB0aGlzLmxpc3RbcHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4XS5nZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJCWludCBwcmV2RW5kUG9zaXRpb24gPSBwcmV2Tm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyBwcmV2Tm9kZS5nZXRMZW5ndGgoKTsKKwkJCQkJaW50IHByZXZMaW5lID0gbGluZUluZm9ybWF0aW9uLmdldExpbmVPZk9mZnNldChwcmV2RW5kUG9zaXRpb24pOworCQkJCQlpbnQgbGluZSA9IGxpbmVJbmZvcm1hdGlvbi5nZXRMaW5lT2ZPZmZzZXQob3JpZ2luYWxPZmZzZXQpOworCQkJCQkKKwkJCQkJaWYgKHByZXZMaW5lID09IGxpbmUgJiYgbm9kZUluZGV4ICsgMSA8IHRoaXMubGlzdC5sZW5ndGgpIHsKKwkJCQkJCVJld3JpdGVFdmVudCBuZXh0RXZlbnQgPSB0aGlzLmxpc3Rbbm9kZUluZGV4ICsgMV07CisJCQkJCQlpbnQgbmV4dEtpbmQgPSBuZXh0RXZlbnQuZ2V0Q2hhbmdlS2luZCgpOworCQkJCQkJCisJCQkJCQlpZiAobmV4dEtpbmQgPT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCB8fCBwcmV2S2luZCA9PSBSZXdyaXRlRXZlbnQuUkVQTEFDRUQpIHsKKwkJCQkJCQlBU1ROb2RlIG5leHROb2RlID0gKEFTVE5vZGUpIG5leHRFdmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJCQkJaW50IG5leHRTdGFydFBvc2l0aW9uID0gbmV4dE5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQkJCWludCBuZXh0TGluZSA9IGxpbmVJbmZvcm1hdGlvbi5nZXRMaW5lT2ZPZmZzZXQobmV4dFN0YXJ0UG9zaXRpb24pOworCQkJCQkJCQorCQkJCQkJCXJldHVybiBuZXh0TGluZSA9PSBsaW5lOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwogCXByaXZhdGUgaW50IHJld3JpdGVQYXJhZ3JhcGhMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBpbnQgaW5zZXJ0UG9zLCBpbnQgaW5zZXJ0SW5kZW50LCBpbnQgc2VwYXJhdG9yLCBpbnQgbGVhZCkgewogCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGdldEV2ZW50KHBhcmVudCwgcHJvcGVydHkpOwogCQlpZiAoZXZlbnQgPT0gbnVsbCB8fCBldmVudC5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewogCQkJcmV0dXJuIGRvVmlzaXQocGFyZW50LCBwcm9wZXJ0eSwgaW5zZXJ0UG9zKTsKIAkJfQotCQkKKwogCQlSZXdyaXRlRXZlbnRbXSBldmVudHM9IGV2ZW50LmdldENoaWxkcmVuKCk7CiAJCVBhcmFncmFwaExpc3RSZXdyaXRlciBsaXN0UmV3cml0ZXI9IG5ldyBQYXJhZ3JhcGhMaXN0UmV3cml0ZXIoaW5zZXJ0SW5kZW50LCBzZXBhcmF0b3IpOwogCQlTdHJpbmdCdWZmZXIgbGVhZFN0cmluZz0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtODY1LDcgKzExMDEsNyBAQAogCQl9CiAJCXJldHVybiBsaXN0UmV3cml0ZXIucmV3cml0ZUxpc3QocGFyZW50LCBwcm9wZXJ0eSwgaW5zZXJ0UG9zLCBsZWFkU3RyaW5nLnRvU3RyaW5nKCkpOwogCX0KLQkKKwogCXByaXZhdGUgaW50IHJld3JpdGVPcHRpb25hbFR5cGVQYXJhbWV0ZXJzKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBpbnQgb2Zmc2V0LCBTdHJpbmcga2V5d29yZCwgYm9vbGVhbiBhZGp1c3RPbk5leHQsIGJvb2xlYW4gbmVlZHNTcGFjZU9uUmVtb3ZlQWxsKSB7CiAJCWludCBwb3M9IG9mZnNldDsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChwYXJlbnQsIHByb3BlcnR5KTsKQEAgLTg3OCw3ICsxMTE0LDcgQEAKIAkJCQl9CiAJCQkJYm9vbGVhbiBpc0FsbFJlbW92ZWQ9ICFpc0FsbEluc2VydGVkICYmIGlzQWxsT2ZLaW5kKGNoaWxkcmVuLCBSZXdyaXRlRXZlbnQuUkVNT1ZFRCk7CiAJCQkJaWYgKGlzQWxsUmVtb3ZlZCkgeyAvLyBhbGwgcmVtb3ZlZDogc2V0IHN0YXJ0IHRvIGxlZnQgYnJhY2tldAotCQkJCQlpbnQgcG9zQmVmb3JlT3BlbkJyYWNrZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlblN0YXJ0T2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEVTUywgcG9zKTsKKwkJCQkJaW50IHBvc0JlZm9yZU9wZW5CcmFja2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCBwb3MpOwogCQkJCQlpZiAocG9zQmVmb3JlT3BlbkJyYWNrZXQgIT0gcG9zKSB7CiAJCQkJCQluZWVkc1NwYWNlT25SZW1vdmVBbGw9IGZhbHNlOwogCQkJCQl9CkBAIC04ODYsOSArMTEyMiw5IEBACiAJCQkJfQogCQkJCXBvcz0gbmV3IExpc3RSZXdyaXRlcigpLnJld3JpdGVMaXN0KHBhcmVudCwgcHJvcGVydHksIHBvcywgU3RyaW5nLnZhbHVlT2YoJzwnKSwgIiwgIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlpZiAoaXNBbGxSZW1vdmVkKSB7IC8vIGFsbCByZW1vdmVkOiByZW1vdmUgcmlnaHQgYW5kIHNwYWNlIHVwIHRvIG5leHQgZWxlbWVudAotCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVHUkVBVEVSLCBwb3MpOyAvLyBzZXQgcG9zIHRvICc+JworCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUiwgcG9zKTsgLy8gc2V0IHBvcyB0byAnPicKIAkJCQkJZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0TmV4dFN0YXJ0T2Zmc2V0KGVuZFBvcywgZmFsc2UpOwotCQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQ9IG5lZWRzU3BhY2VPblJlbW92ZUFsbCA/IFN0cmluZy52YWx1ZU9mKCcgJykgOiBuZXcgU3RyaW5nKCk7CisJCQkJCVN0cmluZyByZXBsYWNlbWVudD0gbmVlZHNTcGFjZU9uUmVtb3ZlQWxsID8gU3RyaW5nLnZhbHVlT2YoJyAnKSA6IFV0aWwuRU1QVFlfU1RSSU5HOwogCQkJCQlkb1RleHRSZXBsYWNlKHBvcywgZW5kUG9zIC0gcG9zLCByZXBsYWNlbWVudCwgZ2V0RWRpdEdyb3VwKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKSk7CiAJCQkJCXJldHVybiBlbmRQb3M7CiAJCQkJfSBlbHNlIGlmIChpc0FsbEluc2VydGVkKSB7CkBAIC05MDMsMTQgKzExMzksMTQgQEAKIAkJfQogCQlpZiAocG9zICE9IG9mZnNldCkgeyAvLyBsaXN0IGNvbnRhaW5lZCBzb21lIHR5cGUgLT4gcGFyc2UgYWZ0ZXIgY2xvc2luZyBicmFja2V0CiAJCQl0cnkgewotCQkJCXJldHVybiBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVHUkVBVEVSLCBwb3MpOworCQkJCXJldHVybiBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUiwgcG9zKTsKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gcG9zOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBpc0FsbE9mS2luZChSZXdyaXRlRXZlbnRbXSBjaGlsZHJlbiwgaW50IGtpbmQpIHsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoY2hpbGRyZW5baV0uZ2V0Q2hhbmdlS2luZCgpICE9IGtpbmQpIHsKQEAgLTkxOCw4ICsxMTU0LDE2IEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIHRydWU7Ci0JfQkKLQkKKwl9CisKKwlwcml2YXRlIGludCByZXdyaXRlTm9kZUxpc3QoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBwb3MsIFN0cmluZyBrZXl3b3JkLCBTdHJpbmcgZW5kS2V5d29yZCwgU3RyaW5nIHNlcGFyYXRvcikgeworCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGdldEV2ZW50KHBhcmVudCwgcHJvcGVydHkpOworCQlpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgeworCQkJcmV0dXJuIG5ldyBMaXN0UmV3cml0ZXIoKS5yZXdyaXRlTGlzdChwYXJlbnQsIHByb3BlcnR5LCBwb3MsIGtleXdvcmQsIGVuZEtleXdvcmQsIHNlcGFyYXRvcik7CisJCX0KKwkJcmV0dXJuIGRvVmlzaXQocGFyZW50LCBwcm9wZXJ0eSwgcG9zKTsKKwl9CisKIAlwcml2YXRlIGludCByZXdyaXRlTm9kZUxpc3QoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBwb3MsIFN0cmluZyBrZXl3b3JkLCBTdHJpbmcgc2VwYXJhdG9yKSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsICYmIGV2ZW50LmdldENoYW5nZUtpbmQoKSAhPSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEKSB7CkBAIC05MjcsOCArMTE3MSw4IEBACiAJCX0KIAkJcmV0dXJuIGRvVmlzaXQocGFyZW50LCBwcm9wZXJ0eSwgcG9zKTsKIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJld3JpdGVNZXRob2RCb2R5KE1ldGhvZERlY2xhcmF0aW9uIHBhcmVudCwgaW50IHN0YXJ0UG9zKSB7IAorCisJcHJpdmF0ZSB2b2lkIHJld3JpdGVNZXRob2RCb2R5KE1ldGhvZERlY2xhcmF0aW9uIHBhcmVudCwgaW50IHN0YXJ0UG9zKSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBNZXRob2REZWNsYXJhdGlvbi5CT0RZX1BST1BFUlRZKTsKIAkJaWYgKGV2ZW50ICE9IG51bGwpIHsKIAkJCXN3aXRjaCAoZXZlbnQuZ2V0Q2hhbmdlS2luZCgpKSB7CkBAIC05MzksNyArMTE4Myw3IEBACiAJCQkJCWRvVGV4dFJlbW92ZShzdGFydFBvcywgZW5kUG9zIC0gc3RhcnRQb3MsIGVkaXRHcm91cCk7CiAJCQkJCWludCBpbmRlbnQ9IGdldEluZGVudChwYXJlbnQuZ2V0U3RhcnRQb3NpdGlvbigpKTsKIAkJCQkJU3RyaW5nIHByZWZpeD0gdGhpcy5mb3JtYXR0ZXIuTUVUSE9EX0JPRFkuZ2V0UHJlZml4KGluZGVudCk7Ci0JCQkJCWRvVGV4dEluc2VydChzdGFydFBvcywgcHJlZml4LCBlZGl0R3JvdXApOyAKKwkJCQkJZG9UZXh0SW5zZXJ0KHN0YXJ0UG9zLCBwcmVmaXgsIGVkaXRHcm91cCk7CiAJCQkJCWRvVGV4dEluc2VydChzdGFydFBvcywgYm9keSwgaW5kZW50LCB0cnVlLCBlZGl0R3JvdXApOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtOTYyLDcgKzEyMDYsNyBAQAogCQl9CiAJCXZvaWRWaXNpdChwYXJlbnQsIE1ldGhvZERlY2xhcmF0aW9uLkJPRFlfUFJPUEVSVFkpOwogCX0KLQkKKwogCXByaXZhdGUgaW50IHJld3JpdGVFeHRyYURpbWVuc2lvbnMoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBwb3MpIHsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChwYXJlbnQsIHByb3BlcnR5KTsKIAkJaWYgKGV2ZW50ID09IG51bGwgfHwgZXZlbnQuZ2V0Q2hhbmdlS2luZCgpID09IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpIHsKQEAgLTk3MCwxNiArMTIxNCwxNiBAQAogCQl9CiAJCWludCBvbGREaW09ICgoSW50ZWdlcikgZXZlbnQuZ2V0T3JpZ2luYWxWYWx1ZSgpKS5pbnRWYWx1ZSgpOwogCQlpbnQgbmV3RGltPSAoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQorCiAJCWlmIChvbGREaW0gIT0gbmV3RGltKSB7CiAJCQlUZXh0RWRpdEdyb3VwIGVkaXRHcm91cD0gZ2V0RWRpdEdyb3VwKGV2ZW50KTsKIAkJCXJld3JpdGVFeHRyYURpbWVuc2lvbnMob2xkRGltLCBuZXdEaW0sIHBvcywgZWRpdEdyb3VwKTsKIAkJfQogCQlyZXR1cm4gb2xkRGltOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCByZXdyaXRlRXh0cmFEaW1lbnNpb25zKGludCBvbGREaW0sIGludCBuZXdEaW0sIGludCBwb3MsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7Ci0JCQkKKwogCQlpZiAob2xkRGltIDwgbmV3RGltKSB7CiAJCQlmb3IgKGludCBpPSBvbGREaW07IGkgPCBuZXdEaW07IGkrKykgewogCQkJCWRvVGV4dEluc2VydChwb3MsICJbXSIsIGVkaXRHcm91cCk7IC8vJE5PTi1OTFMtMSQKQEAgLTk4OCwyMiArMTIzMiwyMiBAQAogCQkJdHJ5IHsKIAkJCQlnZXRTY2FubmVyKCkuc2V0T2Zmc2V0KHBvcyk7CiAJCQkJZm9yIChpbnQgaT0gbmV3RGltOyBpIDwgb2xkRGltOyBpKyspIHsKLQkJCQkJZ2V0U2Nhbm5lcigpLnJlYWRUb1Rva2VuKElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNLRVQpOworCQkJCQlnZXRTY2FubmVyKCkucmVhZFRvVG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQpOwogCQkJCX0KIAkJCQlkb1RleHRSZW1vdmUocG9zLCBnZXRTY2FubmVyKCkuZ2V0Q3VycmVudEVuZE9mZnNldCgpIC0gcG9zLCBlZGl0R3JvdXApOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQogCQl9Ci0JfQkKLQkJCisJfQorCiAJLyoKLQkgKiBOZXh0IHRva2VuIGlzIGEgbGVmdCBicmFjZS4gUmV0dXJucyB0aGUgb2Zmc2V0IGFmdGVyIHRoZSBicmFjZS4gRm9yIGluY29tcGxldGUgY29kZSwgcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQuICAKKwkgKiBOZXh0IHRva2VuIGlzIGEgbGVmdCBicmFjZS4gUmV0dXJucyB0aGUgb2Zmc2V0IGFmdGVyIHRoZSBicmFjZS4gRm9yIGluY29tcGxldGUgY29kZSwgcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQuCiAJICovCiAJcHJpdmF0ZSBpbnQgZ2V0UG9zQWZ0ZXJMZWZ0QnJhY2UoaW50IHBvcykgewogCQl0cnkgewogCQkJaW50IG5leHRUb2tlbj0gZ2V0U2Nhbm5lcigpLnJlYWROZXh0KHBvcywgdHJ1ZSk7Ci0JCQlpZiAobmV4dFRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNFKSB7CisJCQlpZiAobmV4dFRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSkgewogCQkJCXJldHVybiBnZXRTY2FubmVyKCkuZ2V0Q3VycmVudEVuZE9mZnNldCgpOwogCQkJfQogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKQEAgLTEwMTEsMTYgKzEyNTUsMzEgQEAKIAkJfQogCQlyZXR1cm4gcG9zOwogCX0KLQkKKworCS8qCisJICogTmV4dCB0b2tlbiBpcyB0cnkga2V5d29yZC4gUmV0dXJucyB0aGUgb2Zmc2V0IGFmdGVyICd0cnknIGtleXdvcmQuIEZvciBpbmNvbXBsZXRlIGNvZGUsIHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0LgorCSAqLworCXByaXZhdGUgaW50IGdldFBvc0FmdGVyVHJ5KGludCBwb3MpIHsKKwkJdHJ5IHsKKwkJCWludCBuZXh0VG9rZW49IGdldFNjYW5uZXIoKS5yZWFkTmV4dChwb3MsIHRydWUpOworCQkJaWYgKG5leHRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0cnkpIHsKKwkJCQlyZXR1cm4gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQloYW5kbGVFeGNlcHRpb24oZSk7CisJCX0KKwkJcmV0dXJuIHBvczsKKwl9CisKIAlmaW5hbCBpbnQgZ2V0SW5kZW50KGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIHRoaXMuZm9ybWF0dGVyLmNvbXB1dGVJbmRlbnRVbml0cyhnZXRJbmRlbnRPZkxpbmUob2Zmc2V0KSk7CiAJfQogCi0JZmluYWwgdm9pZCBkb1RleHRJbnNlcnQoaW50IGluc2VydE9mZnNldCwgQVNUTm9kZSBub2RlLCBpbnQgaW5pdGlhbEluZGVudExldmVsLCBib29sZWFuIHJlbW92ZUxlYWRpbmdJbmRlbnQsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7CQkKKwlmaW5hbCB2b2lkIGRvVGV4dEluc2VydChpbnQgaW5zZXJ0T2Zmc2V0LCBBU1ROb2RlIG5vZGUsIGludCBpbml0aWFsSW5kZW50TGV2ZWwsIGJvb2xlYW4gcmVtb3ZlTGVhZGluZ0luZGVudCwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJQXJyYXlMaXN0IG1hcmtlcnM9IG5ldyBBcnJheUxpc3QoKTsKIAkJU3RyaW5nIGZvcm1hdHRlZD0gdGhpcy5mb3JtYXR0ZXIuZ2V0Rm9ybWF0dGVkUmVzdWx0KG5vZGUsIGluaXRpYWxJbmRlbnRMZXZlbCwgbWFya2Vycyk7CiAKLQkJCisKIAkJaW50IGN1cnJQb3M9IDA7CiAJCWlmIChyZW1vdmVMZWFkaW5nSW5kZW50KSB7CiAJCQl3aGlsZSAoY3VyclBvcyA8IGZvcm1hdHRlZC5sZW5ndGgoKSAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShmb3JtYXR0ZWQuY2hhckF0KGN1cnJQb3MpKSkgewpAQCAtMTAyOSwxMSArMTI4OCwxNCBAQAogCQl9CiAJCWZvciAoaW50IGk9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7IC8vIG1hcmtlcnMuc2l6ZSBjYW4gY2hhbmdlIQogCQkJTm9kZU1hcmtlciBjdXJyPSAoTm9kZU1hcmtlcikgbWFya2Vycy5nZXQoaSk7Ci0JCQkKKwogCQkJaW50IG9mZnNldD0gY3Vyci5vZmZzZXQ7Ci0JCQlpZiAob2Zmc2V0ICE9IGN1cnJQb3MpIHsKLQkJCQlTdHJpbmcgaW5zZXJ0U3RyPSBmb3JtYXR0ZWQuc3Vic3RyaW5nKGN1cnJQb3MsIG9mZnNldCk7IAorCQkJaWYgKG9mZnNldCA+PSBjdXJyUG9zKSB7CisJCQkJU3RyaW5nIGluc2VydFN0cj0gZm9ybWF0dGVkLnN1YnN0cmluZyhjdXJyUG9zLCBvZmZzZXQpOwogCQkJCWRvVGV4dEluc2VydChpbnNlcnRPZmZzZXQsIGluc2VydFN0ciwgZWRpdEdyb3VwKTsgLy8gaW5zZXJ0IHVudGlsIHRoZSBtYXJrZXIncyBiZWdpbgorCQkJfSBlbHNlIHsKKwkJCQkvLyBhbHJlYWR5IHByb2Nlc3NlZAorCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlPYmplY3QgZGF0YT0gY3Vyci5kYXRhOwpAQCAtMTA2Niw3ICsxMzI4LDcgQEAKIAkJCQkJfQogCQkJCX0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZ1BsYWNlaG9sZGVyRGF0YSkgeyAvLyByZXBsYWNlIHdpdGggYSBwbGFjZWhvbGRlcgogCQkJCQlTdHJpbmcgY29kZT0gKChTdHJpbmdQbGFjZWhvbGRlckRhdGEpIGRhdGEpLmNvZGU7Ci0JCQkJCVN0cmluZyBzdHI9IHRoaXMuZm9ybWF0dGVyLmNoYW5nZUluZGVudChjb2RlLCAwLCBkZXN0SW5kZW50U3RyaW5nKTsgCisJCQkJCVN0cmluZyBzdHI9IHRoaXMuZm9ybWF0dGVyLmNoYW5nZUluZGVudChjb2RlLCAwLCBkZXN0SW5kZW50U3RyaW5nKTsKIAkJCQkJZG9UZXh0SW5zZXJ0KGluc2VydE9mZnNldCwgc3RyLCBlZGl0R3JvdXApOwogCQkJCQljdXJyUG9zPSBvZmZzZXQgKyBjdXJyLmxlbmd0aDsgLy8gY29udGludWUgdG8gaW5zZXJ0IGFmdGVyIHRoZSByZXBsYWNlZCBzdHJpbmcKIAkJCQl9CkBAIC0xMDc4LDcgKzEzNDAsNyBAQAogCQkJZG9UZXh0SW5zZXJ0KGluc2VydE9mZnNldCwgaW5zZXJ0U3RyLCBlZGl0R3JvdXApOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIG5lZWRzTmV3TGluZUZvckxpbmVDb21tZW50KEFTVE5vZGUgbm9kZSwgU3RyaW5nIGZvcm1hdHRlZCwgaW50IG9mZnNldCkgewogCQlpZiAoIXRoaXMubGluZUNvbW1lbnRFbmRPZmZzZXRzLmlzRW5kT2ZMaW5lQ29tbWVudChnZXRFeHRlbmRlZEVuZChub2RlKSwgdGhpcy5jb250ZW50KSkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTA4Niw3ICsxMzQ4LDcgQEAKIAkJLy8gY29waWVkIGNvZGUgZW5kcyB3aXRoIGEgbGluZSBjb21tZW50LCBidXQgZG9lc24ndCBjb250YWluIHRoZSBuZXcgbGluZQogCQlyZXR1cm4gb2Zmc2V0IDwgZm9ybWF0dGVkLmxlbmd0aCgpICYmICFJbmRlbnRNYW5pcHVsYXRpb24uaXNMaW5lRGVsaW1pdGVyQ2hhcihmb3JtYXR0ZWQuY2hhckF0KG9mZnNldCkpOwogCX0KLQkKKwogCXByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRMaW5lKFN0cmluZyBzdHIsIGludCBwb3MpIHsKIAkJZm9yIChpbnQgaT0gcG9zIC0gMTsgaT49IDA7IGktLSkgewogCQkJY2hhciBjaD0gc3RyLmNoYXJBdChpKTsKQEAgLTEwOTUsOCArMTM1Nyw4IEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcG9zKTsKLQl9CQotCQorCX0KKwogCiAJcHJpdmF0ZSB2b2lkIHJld3JpdGVNb2RpZmllcnMoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBvZmZzZXQpIHsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChwYXJlbnQsIHByb3BlcnR5KTsKQEAgLTExMDcsNyArMTM2OSw3IEBACiAJCQlpbnQgb2xkTW9kaWZpZXJzPSAoKEludGVnZXIpIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKSkuaW50VmFsdWUoKTsKIAkJCWludCBuZXdNb2RpZmllcnM9ICgoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuaW50VmFsdWUoKTsKIAkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAoZXZlbnQpOwotCQkKKwogCQkJVG9rZW5TY2FubmVyIHNjYW5uZXI9IGdldFNjYW5uZXIoKTsKIAogCQkJaW50IHRvaz0gc2Nhbm5lci5yZWFkTmV4dChvZmZzZXQsIGZhbHNlKTsKQEAgLTExMTksMTcgKzEzODEsMTcgQEAKIAkJCQl9CiAJCQkJYm9vbGVhbiBrZWVwPSB0cnVlOwogCQkJCXN3aXRjaCAodG9rKSB7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVwdWJsaWM6IGtlZXA9IE1vZGlmaWVyLmlzUHVibGljKG5ld01vZGlmaWVycyk7IGJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lcHJvdGVjdGVkOiBrZWVwPSBNb2RpZmllci5pc1Byb3RlY3RlZChuZXdNb2RpZmllcnMpOyBicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXByaXZhdGU6IGtlZXA9IE1vZGlmaWVyLmlzUHJpdmF0ZShuZXdNb2RpZmllcnMpOyBicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXN0YXRpYzoga2VlcD0gTW9kaWZpZXIuaXNTdGF0aWMobmV3TW9kaWZpZXJzKTsgYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmaW5hbDoga2VlcD0gTW9kaWZpZXIuaXNGaW5hbChuZXdNb2RpZmllcnMpOyBicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWFic3RyYWN0OiBrZWVwPSBNb2RpZmllci5pc0Fic3RyYWN0KG5ld01vZGlmaWVycyk7IGJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbmF0aXZlOiBrZWVwPSBNb2RpZmllci5pc05hdGl2ZShuZXdNb2RpZmllcnMpOyBicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXZvbGF0aWxlOiBrZWVwPSBNb2RpZmllci5pc1ZvbGF0aWxlKG5ld01vZGlmaWVycyk7IGJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc3RyaWN0ZnA6IGtlZXA9IE1vZGlmaWVyLmlzU3RyaWN0ZnAobmV3TW9kaWZpZXJzKTsgYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV0cmFuc2llbnQ6IGtlZXA9IE1vZGlmaWVyLmlzVHJhbnNpZW50KG5ld01vZGlmaWVycyk7IGJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc3luY2hyb25pemVkOiBrZWVwPSBNb2RpZmllci5pc1N5bmNocm9uaXplZChuZXdNb2RpZmllcnMpOyBicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwdWJsaWM6IGtlZXA9IE1vZGlmaWVyLmlzUHVibGljKG5ld01vZGlmaWVycyk7IGJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXByb3RlY3RlZDoga2VlcD0gTW9kaWZpZXIuaXNQcm90ZWN0ZWQobmV3TW9kaWZpZXJzKTsgYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcHJpdmF0ZToga2VlcD0gTW9kaWZpZXIuaXNQcml2YXRlKG5ld01vZGlmaWVycyk7IGJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN0YXRpYzoga2VlcD0gTW9kaWZpZXIuaXNTdGF0aWMobmV3TW9kaWZpZXJzKTsgYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZmluYWw6IGtlZXA9IE1vZGlmaWVyLmlzRmluYWwobmV3TW9kaWZpZXJzKTsgYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYWJzdHJhY3Q6IGtlZXA9IE1vZGlmaWVyLmlzQWJzdHJhY3QobmV3TW9kaWZpZXJzKTsgYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbmF0aXZlOiBrZWVwPSBNb2RpZmllci5pc05hdGl2ZShuZXdNb2RpZmllcnMpOyBicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV2b2xhdGlsZToga2VlcD0gTW9kaWZpZXIuaXNWb2xhdGlsZShuZXdNb2RpZmllcnMpOyBicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdHJpY3RmcDoga2VlcD0gTW9kaWZpZXIuaXNTdHJpY3RmcChuZXdNb2RpZmllcnMpOyBicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0cmFuc2llbnQ6IGtlZXA9IE1vZGlmaWVyLmlzVHJhbnNpZW50KG5ld01vZGlmaWVycyk7IGJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN5bmNocm9uaXplZDoga2VlcD0gTW9kaWZpZXIuaXNTeW5jaHJvbml6ZWQobmV3TW9kaWZpZXJzKTsgYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQlicmVhayBsb29wOwogCQkJCX0KQEAgLTExMzksNyArMTQwMSw3IEBACiAJCQkJaWYgKCFrZWVwKSB7CiAJCQkJCWRvVGV4dFJlbW92ZShjdXJyUG9zLCBuZXh0U3RhcnQgLSBjdXJyUG9zLCBlZGl0R3JvdXApOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCQlpbnQgYWRkZWRNb2RpZmllcnM9IG5ld01vZGlmaWVycyAmIH5vbGRNb2RpZmllcnM7CiAJCQlpZiAoYWRkZWRNb2RpZmllcnMgIT0gMCkgewogCQkJCWlmIChzdGFydFBvcyAhPSBuZXh0U3RhcnQpIHsKQEAgLTExNTksMTUgKzE0MjEsMTUgQEAKIAkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJfQogCX0KLQkKKwogCWNsYXNzIE1vZGlmaWVyUmV3cml0ZXIgZXh0ZW5kcyBMaXN0UmV3cml0ZXIgewotCQkKKwogCQlwcml2YXRlIGZpbmFsIFByZWZpeCBhbm5vdGF0aW9uU2VwYXJhdGlvbjsKIAogCQlwdWJsaWMgTW9kaWZpZXJSZXdyaXRlcihQcmVmaXggYW5ub3RhdGlvblNlcGFyYXRpb24pIHsKIAkJCXRoaXMuYW5ub3RhdGlvblNlcGFyYXRpb249IGFubm90YXRpb25TZXBhcmF0aW9uOwogCQl9Ci0JCQorCiAJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlQW5hbHl6ZXIuTGlzdFJld3JpdGVyI2dldFNlcGFyYXRvclN0cmluZyhpbnQpCiAJCSAqLwpAQCAtMTE3OSw4ICsxNDQxLDggQEAKIAkJCXJldHVybiBzdXBlci5nZXRTZXBhcmF0b3JTdHJpbmcobm9kZUluZGV4KTsKIAkJfQogCX0KLQkKLQkKKworCiAJcHJpdmF0ZSBpbnQgcmV3cml0ZU1vZGlmaWVyczIoQVNUTm9kZSBub2RlLCBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksIGludCBwb3MpIHsKIAkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChub2RlLCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCA9PSBudWxsIHx8IGV2ZW50LmdldENoYW5nZUtpbmQoKSA9PSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEKSB7CkBAIC0xMTk3LDE0ICsxNDU5LDIwIEBACiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQogCQl9Ci0JCQotCQlpbnQgZW5kUG9zPSBuZXcgTW9kaWZpZXJSZXdyaXRlcih0aGlzLmZvcm1hdHRlci5BTk5PVEFUSU9OX1NFUEFSQVRJT04pLnJld3JpdGVMaXN0KG5vZGUsIHByb3BlcnR5LCBwb3MsICIiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCisKKwkJUHJlZml4IGZvcm1hdHRlclByZWZpeDsKKwkJaWYgKHByb3BlcnR5ID09IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSkKKwkJCWZvcm1hdHRlclByZWZpeD0gdGhpcy5mb3JtYXR0ZXIuUEFSQU1fQU5OT1RBVElPTl9TRVBBUkFUSU9OOworCQllbHNlCisJCQlmb3JtYXR0ZXJQcmVmaXg9IHRoaXMuZm9ybWF0dGVyLkFOTk9UQVRJT05fU0VQQVJBVElPTjsKKworCQlpbnQgZW5kUG9zPSBuZXcgTW9kaWZpZXJSZXdyaXRlcihmb3JtYXR0ZXJQcmVmaXgpLnJld3JpdGVMaXN0KG5vZGUsIHByb3BlcnR5LCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCAiICIpOyAvLyROT04tTkxTLTEkIAorCiAJCXRyeSB7CiAJCQlpbnQgbmV4dFBvcz0gZ2V0U2Nhbm5lcigpLmdldE5leHRTdGFydE9mZnNldChlbmRQb3MsIGZhbHNlKTsKLQkJCQorCiAJCQlib29sZWFuIGxhc3RVbmNoYW5nZWQ9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLmdldENoYW5nZUtpbmQoKSAhPSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEOwotCQkJCisKIAkJCWlmIChpc0FsbFJlbW92ZSkgewogCQkJCWRvVGV4dFJlbW92ZShlbmRQb3MsIG5leHRQb3MgLSBlbmRQb3MsIGdldEVkaXRHcm91cChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSkpOwogCQkJCXJldHVybiBuZXh0UG9zOwpAQCAtMTIxMiw3ICsxNDgwLDcgQEAKIAkJCQlSZXdyaXRlRXZlbnQgbGFzdENoaWxkPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKIAkJCQlTdHJpbmcgc2VwYXJhdG9yOwogCQkJCWlmIChsYXN0Q2hpbGQuZ2V0TmV3VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLQkJCQkJc2VwYXJhdG9yPSB0aGlzLmZvcm1hdHRlci5BTk5PVEFUSU9OX1NFUEFSQVRJT04uZ2V0UHJlZml4KGdldEluZGVudChwb3MpKTsKKwkJCQkJc2VwYXJhdG9yPSBmb3JtYXR0ZXJQcmVmaXguZ2V0UHJlZml4KGdldEluZGVudChwb3MpKTsKIAkJCQl9IGVsc2UgewogCQkJCQlzZXBhcmF0b3I9IFN0cmluZy52YWx1ZU9mKCcgJyk7CiAJCQkJfQpAQCAtMTIyMyw4ICsxNDkxLDggQEAKIAkJfQogCQlyZXR1cm4gZW5kUG9zOwogCX0KLQkKLQkKKworCiAJcHJpdmF0ZSB2b2lkIHJlcGxhY2VPcGVyYXRpb24oaW50IHBvc0JlZm9yZU9wZXJhdGlvbiwgU3RyaW5nIG5ld09wZXJhdGlvbiwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJdHJ5IHsKIAkJCWdldFNjYW5uZXIoKS5yZWFkTmV4dChwb3NCZWZvcmVPcGVyYXRpb24sIHRydWUpOwpAQCAtMTIzMyw3ICsxNTAxLDcgQEAKIAkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCByZXdyaXRlT3BlcmF0aW9uKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBpbnQgcG9zQmVmb3JlT3BlcmF0aW9uKSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsICYmIGV2ZW50LmdldENoYW5nZUtpbmQoKSAhPSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEKSB7CkBAIC0xMjQ3LDcgKzE1MTUsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjcG9zdFZpc2l0KEFTVE5vZGUpCiAJICovCkBAIC0xMjYzLDkgKzE1MzEsOSBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3ByZVZpc2l0KEFTVE5vZGUpCiAJICovCi0JcHVibGljIHZvaWQgcHJlVmlzaXQoQVNUTm9kZSBub2RlKSB7CQkKKwlwdWJsaWMgdm9pZCBwcmVWaXNpdChBU1ROb2RlIG5vZGUpIHsKIAkJLy8gY29waWVzLCB0aGVuIHJhbmdlIG1hcmtlcgotCQkKKwogCQlDb3B5U291cmNlSW5mb1tdIGluZm9zPSB0aGlzLmV2ZW50U3RvcmUuZ2V0Tm9kZUNvcHlTb3VyY2VzKG5vZGUpOwogCQlkb0NvcHlTb3VyY2VQcmVWaXNpdChpbmZvcywgdGhpcy5zb3VyY2VDb3B5RW5kTm9kZXMpOwogCkBAIC0xMjc5LDggKzE1NDcsMTAgQEAKIAkJCWFkZEVkaXQoZWRpdCk7CiAJCQl0aGlzLmN1cnJlbnRFZGl0PSBlZGl0OwogCQl9CisJCQorCQllbnN1cmVTcGFjZUJlZm9yZVJlcGxhY2Uobm9kZSk7CiAJfQotCQorCiAJZmluYWwgdm9pZCBkb0NvcHlTb3VyY2VQcmVWaXNpdChDb3B5U291cmNlSW5mb1tdIGluZm9zLCBTdGFjayBub2RlRW5kU3RhY2spIHsKIAkJaWYgKGluZm9zICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGk9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewpAQCAtMTI5Miw3ICsxNTYyLDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCWZpbmFsIHZvaWQgZG9Db3B5U291cmNlUG9zdFZpc2l0KEFTVE5vZGUgbm9kZSwgU3RhY2sgbm9kZUVuZFN0YWNrKSB7CiAJCXdoaWxlICghbm9kZUVuZFN0YWNrLmlzRW1wdHkoKSAmJiBub2RlRW5kU3RhY2sucGVlaygpID09IG5vZGUpIHsKIAkJCW5vZGVFbmRTdGFjay5wb3AoKTsKQEAgLTEzMDIsMTggKzE1NzIsMTggQEAKIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KENvbXBpbGF0aW9uVW5pdCkKLQkgKi8gCisJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJaW50IHN0YXJ0UG9zPSByZXdyaXRlTm9kZShub2RlLCBDb21waWxhdGlvblVuaXQuUEFDS0FHRV9QUk9QRVJUWSwgMCwgQVNUUmV3cml0ZUZvcm1hdHRlci5OT05FKTsKLQkJCQorCiAJCWlmIChnZXRDaGFuZ2VLaW5kKG5vZGUsIENvbXBpbGF0aW9uVW5pdC5QQUNLQUdFX1BST1BFUlRZKSA9PSBSZXdyaXRlRXZlbnQuSU5TRVJURUQpIHsKIAkJCWRvVGV4dEluc2VydCgwLCBnZXRMaW5lRGVsaW1pdGVyKCksIGdldEVkaXRHcm91cChub2RlLCBDb21waWxhdGlvblVuaXQuUEFDS0FHRV9QUk9QRVJUWSkpOwogCQl9Ci0JCQkJCisKIAkJc3RhcnRQb3M9IHJld3JpdGVQYXJhZ3JhcGhMaXN0KG5vZGUsIENvbXBpbGF0aW9uVW5pdC5JTVBPUlRTX1BST1BFUlRZLCBzdGFydFBvcywgMCwgMCwgMik7CiAJCXJld3JpdGVQYXJhZ3JhcGhMaXN0KG5vZGUsIENvbXBpbGF0aW9uVW5pdC5UWVBFU19QUk9QRVJUWSwgc3RhcnRQb3MsIDAsIC0xLCAyKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTMyOCw0NiArMTU5OCw1NiBAQAogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQogCQlpbnQgYXBpTGV2ZWw9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKTsKLQkJCisKIAkJaW50IHBvcz0gcmV3cml0ZUphdmFkb2Mobm9kZSwgVHlwZURlY2xhcmF0aW9uLkpBVkFET0NfUFJPUEVSVFkpOwotCQkKLQkJaWYgKGFwaUxldmVsID09IEpMUzJfSU5URVJOQUwpIHsKKworCQlib29sZWFuIGlzSkxTMiA9IGFwaUxldmVsID09IEpMUzJfSU5URVJOQUw7CisJCWlmIChpc0pMUzIpIHsKIAkJCXJld3JpdGVNb2RpZmllcnMobm9kZSwgVHlwZURlY2xhcmF0aW9uLk1PRElGSUVSU19QUk9QRVJUWSwgcG9zKTsKIAkJfSBlbHNlIHsKIAkJCXJld3JpdGVNb2RpZmllcnMyKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZLCBwb3MpOwogCQl9Ci0JCQorCiAJCWJvb2xlYW4gaXNJbnRlcmZhY2U9ICgoQm9vbGVhbikgZ2V0T3JpZ2luYWxWYWx1ZShub2RlLCBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX1BST1BFUlRZKSkuYm9vbGVhblZhbHVlKCk7CiAJCS8vIG1vZGlmaWVycyAmIGNsYXNzL2ludGVyZmFjZQogCQlib29sZWFuIGludmVydFR5cGU9IGlzQ2hhbmdlZChub2RlLCBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX1BST1BFUlRZKTsKIAkJaWYgKGludmVydFR5cGUpIHsKIAkJCXRyeSB7Ci0JCQkJaW50IHR5cGVUb2tlbj0gaXNJbnRlcmZhY2UgPyBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWludGVyZmFjZSA6IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY2xhc3M7Ci0JCQkJZ2V0U2Nhbm5lcigpLnJlYWRUb1Rva2VuKHR5cGVUb2tlbiwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwotCQkJCQorCQkJCWludCB0eXBlVG9rZW49IGlzSW50ZXJmYWNlID8gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50ZXJmYWNlIDogVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2xhc3M7CisJCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQlpZiAoIWlzSkxTMikgeworCQkJCQlMaXN0IG1vZGlmaWVycyA9IG5vZGUubW9kaWZpZXJzKCk7CisJCQkJCWZpbmFsIGludCBzaXplID0gbW9kaWZpZXJzLnNpemUoKTsKKwkJCQkJaWYgKHNpemUgIT0gMCkgeworCQkJCQkJQVNUTm9kZSBtb2RpZmllck5vZGUgPSAoQVNUTm9kZSkgbW9kaWZpZXJzLmdldChzaXplIC0gMSk7CisJCQkJCQlzdGFydFBvc2l0aW9uID0gbW9kaWZpZXJOb2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG1vZGlmaWVyTm9kZS5nZXRMZW5ndGgoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlnZXRTY2FubmVyKCkucmVhZFRvVG9rZW4odHlwZVRva2VuLCBzdGFydFBvc2l0aW9uKTsKKwogCQkJCVN0cmluZyBzdHI9IGlzSW50ZXJmYWNlID8gImNsYXNzIiA6ICJpbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQlpbnQgc3RhcnQ9IGdldFNjYW5uZXIoKS5nZXRDdXJyZW50U3RhcnRPZmZzZXQoKTsKIAkJCQlpbnQgZW5kPSBnZXRTY2FubmVyKCkuZ2V0Q3VycmVudEVuZE9mZnNldCgpOwotCQkJCQorCiAJCQkJZG9UZXh0UmVwbGFjZShzdGFydCwgZW5kIC0gc3RhcnQsIHN0ciwgZ2V0RWRpdEdyb3VwKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfUFJPUEVSVFkpKTsKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCS8vIGlnbm9yZQotCQkJfQkJCQorCQkJfQogCQl9Ci0JCQorCiAJCS8vIG5hbWUKIAkJcG9zPSByZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5OQU1FX1BST1BFUlRZKTsKLQkJCi0JCWlmIChhcGlMZXZlbCA+PSBBU1QuSkxTMykgewotCQkJcG9zPSByZXdyaXRlT3B0aW9uYWxUeXBlUGFyYW1ldGVycyhub2RlLCBUeXBlRGVjbGFyYXRpb24uVFlQRV9QQVJBTUVURVJTX1BST1BFUlRZLCBwb3MsICIiLCBmYWxzZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKworCQlpZiAoIWlzSkxTMikgeworCQkJcG9zPSByZXdyaXRlT3B0aW9uYWxUeXBlUGFyYW1ldGVycyhub2RlLCBUeXBlRGVjbGFyYXRpb24uVFlQRV9QQVJBTUVURVJTX1BST1BFUlRZLCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCBmYWxzZSwgdHJ1ZSk7IAogCQl9Ci0JCQorCiAJCS8vIHN1cGVyY2xhc3MKIAkJaWYgKCFpc0ludGVyZmFjZSB8fCBpbnZlcnRUeXBlKSB7Ci0JCQlDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBzdXBlckNsYXNzUHJvcGVydHk9IChhcGlMZXZlbCA9PSBKTFMyX0lOVEVSTkFMKSA/IFR5cGVEZWNsYXJhdGlvbi5TVVBFUkNMQVNTX1BST1BFUlRZIDogVHlwZURlY2xhcmF0aW9uLlNVUEVSQ0xBU1NfVFlQRV9QUk9QRVJUWTsKKwkJCUNoaWxkUHJvcGVydHlEZXNjcmlwdG9yIHN1cGVyQ2xhc3NQcm9wZXJ0eT0gaXNKTFMyID8gVHlwZURlY2xhcmF0aW9uLlNVUEVSQ0xBU1NfUFJPUEVSVFkgOiBUeXBlRGVjbGFyYXRpb24uU1VQRVJDTEFTU19UWVBFX1BST1BFUlRZOwogCiAJCQlSZXdyaXRlRXZlbnQgc3VwZXJDbGFzc0V2ZW50PSBnZXRFdmVudChub2RlLCBzdXBlckNsYXNzUHJvcGVydHkpOwotCQkJCisKIAkJCWludCBjaGFuZ2VLaW5kPSBzdXBlckNsYXNzRXZlbnQgIT0gbnVsbCA/IHN1cGVyQ2xhc3NFdmVudC5nZXRDaGFuZ2VLaW5kKCkgOiBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEOwogCQkJc3dpdGNoIChjaGFuZ2VLaW5kKSB7CiAJCQkJY2FzZSBSZXdyaXRlRXZlbnQuSU5TRVJURUQ6IHsKQEAgLTEzOTgsNyArMTY3OCw3IEBACiAJCQl9CiAJCX0KIAkJLy8gZXh0ZW5kZWQgaW50ZXJmYWNlcwotCQlDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3Igc3VwZXJJbnRlcmZhY2VQcm9wZXJ0eT0gKGFwaUxldmVsID09IEpMUzJfSU5URVJOQUwpID8gVHlwZURlY2xhcmF0aW9uLlNVUEVSX0lOVEVSRkFDRVNfUFJPUEVSVFkgOiBUeXBlRGVjbGFyYXRpb24uU1VQRVJfSU5URVJGQUNFX1RZUEVTX1BST1BFUlRZOworCQlDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3Igc3VwZXJJbnRlcmZhY2VQcm9wZXJ0eT0gaXNKTFMyID8gVHlwZURlY2xhcmF0aW9uLlNVUEVSX0lOVEVSRkFDRVNfUFJPUEVSVFkgOiBUeXBlRGVjbGFyYXRpb24uU1VQRVJfSU5URVJGQUNFX1RZUEVTX1BST1BFUlRZOwogCiAJCVJld3JpdGVFdmVudCBpbnRlcmZhY2VFdmVudD0gZ2V0RXZlbnQobm9kZSwgc3VwZXJJbnRlcmZhY2VQcm9wZXJ0eSk7CiAJCWlmIChpbnRlcmZhY2VFdmVudCA9PSBudWxsIHx8IGludGVyZmFjZUV2ZW50LmdldENoYW5nZUtpbmQoKSA9PSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEKSB7CkBAIC0xNDIyLDEzICsxNzAyLDEzIEBACiAJCQkJCQlmaXJzdFN0YXJ0PSAoKEFTVE5vZGUpIG9yaWdOb2Rlcy5nZXQoMCkpLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCQkJfQogCQkJCQlkb1RleHRSZXBsYWNlKHBvcywgZmlyc3RTdGFydCAtIHBvcywga2V5d29yZCwgZ2V0RWRpdEdyb3VwKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfUFJPUEVSVFkpKTsKLQkJCQkJa2V5d29yZD0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJa2V5d29yZD0gVXRpbC5FTVBUWV9TVFJJTkc7IAogCQkJCQlwb3M9IGZpcnN0U3RhcnQ7CiAJCQkJfQogCQkJfQogCQkJcG9zPSByZXdyaXRlTm9kZUxpc3Qobm9kZSwgc3VwZXJJbnRlcmZhY2VQcm9wZXJ0eSwgcG9zLCBrZXl3b3JkLCAiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCS8vIHR5cGUgbWVtYmVycwogCQkvLyBzdGFydFBvcyA6IGZpbmQgcG9zaXRpb24gYWZ0ZXIgbGVmdCBicmFjZSBvZiB0eXBlLCBiZSBhd2FyZSB0aGF0IGJyYWNrZXQgbWlnaHQgYmUgbWlzc2luZwogCQlpbnQgc3RhcnRJbmRlbnQ9IGdldEluZGVudChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSkgKyAxOwpAQCAtMTQ0NSw2ICsxNzI1LDcgQEAKIAkJYm9vbGVhbiByZXR1cm5UeXBlRXhpc3RzPSAgb3JpZ2luYWxSZXR1cm5UeXBlICE9IG51bGwgJiYgb3JpZ2luYWxSZXR1cm5UeXBlLmdldFN0YXJ0UG9zaXRpb24oKSAhPSAtMTsKIAkJaWYgKCFpc0NvbnN0cnVjdG9yQ2hhbmdlICYmIHJldHVyblR5cGVFeGlzdHMpIHsKIAkJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgcHJvcGVydHkpOworCQkJZW5zdXJlU3BhY2VBZnRlclJlcGxhY2Uobm9kZSwgcHJvcGVydHkpOwogCQkJcmV0dXJuOwogCQl9CiAJCS8vIGRpZmZpY3VsdCBjYXNlczogcmV0dXJuIHR5cGUgaW5zZXJ0IG9yIHJlbW92ZQpAQCAtMTQ2Myw4ICsxNzQ0LDggQEAKIAkJCX0KIAkJfQogCX0KLQkKLQkKKworCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24pCiAJICovCkBAIC0xNDc5LDcgKzE3NjAsNyBAQAogCQkJcG9zPSByZXdyaXRlTW9kaWZpZXJzMihub2RlLCBNZXRob2REZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZLCBwb3MpOwogCQkJcG9zPSByZXdyaXRlT3B0aW9uYWxUeXBlUGFyYW1ldGVycyhub2RlLCBNZXRob2REZWNsYXJhdGlvbi5UWVBFX1BBUkFNRVRFUlNfUFJPUEVSVFksIHBvcywgIiAiLCB0cnVlLCBwb3MgIT0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2hhbmdlPSBpc0NoYW5nZWQobm9kZSwgTWV0aG9kRGVjbGFyYXRpb24uQ09OU1RSVUNUT1JfUFJPUEVSVFkpOwogCQlib29sZWFuIGlzQ29uc3RydWN0b3I9ICgoQm9vbGVhbikgZ2V0T3JpZ2luYWxWYWx1ZShub2RlLCBNZXRob2REZWNsYXJhdGlvbi5DT05TVFJVQ1RPUl9QUk9QRVJUWSkpLmJvb2xlYW5WYWx1ZSgpOwogCQlpZiAoIWlzQ29uc3RydWN0b3IgfHwgaXNDb25zdHJ1Y3RvckNoYW5nZSkgewpAQCAtMTQ4NywzMiArMTc2OCwzMiBAQAogCQl9CiAJCS8vIG1ldGhvZCBuYW1lCiAJCXBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBNZXRob2REZWNsYXJhdGlvbi5OQU1FX1BST1BFUlRZKTsKLQkJCisKIAkJLy8gcGFyYW1ldGVycwogCQl0cnkgewogCQkJaWYgKGlzQ2hhbmdlZChub2RlLCBNZXRob2REZWNsYXJhdGlvbi5QQVJBTUVURVJTX1BST1BFUlRZKSkgewotCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOwotCQkJCXBvcz0gcmV3cml0ZU5vZGVMaXN0KG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLlBBUkFNRVRFUlNfUFJPUEVSVFksIHBvcywgIiIsICIsICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHBvcyk7CisJCQkJcG9zPSByZXdyaXRlTm9kZUxpc3Qobm9kZSwgTWV0aG9kRGVjbGFyYXRpb24uUEFSQU1FVEVSU19QUk9QRVJUWSwgcG9zLCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCQl9IGVsc2UgewogCQkJCXBvcz0gZG9WaXNpdChub2RlLCBNZXRob2REZWNsYXJhdGlvbi5QQVJBTUVURVJTX1BST1BFUlRZLCBwb3MpOwogCQkJfQotCQkJCi0JCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJQQVJFTiwgcG9zKTsKLQkJCQorCisJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHBvcyk7CisKIAkJCWludCBleHRyYURpbXM9IHJld3JpdGVFeHRyYURpbWVuc2lvbnMobm9kZSwgTWV0aG9kRGVjbGFyYXRpb24uRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSwgcG9zKTsKLQkJCQorCiAJCQlib29sZWFuIGhhc0V4Y2VwdGlvbkNoYW5nZXM9IGlzQ2hhbmdlZChub2RlLCBNZXRob2REZWNsYXJhdGlvbi5USFJPV05fRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCQkKKwogCQkJaW50IGJvZHlDaGFuZ2VLaW5kPSBnZXRDaGFuZ2VLaW5kKG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLkJPRFlfUFJPUEVSVFkpOwotCQkJCisKIAkJCWlmICgoZXh0cmFEaW1zID4gMCkgJiYgKGhhc0V4Y2VwdGlvbkNoYW5nZXMgfHwgYm9keUNoYW5nZUtpbmQgPT0gUmV3cml0ZUV2ZW50LklOU0VSVEVEIHx8IGJvZHlDaGFuZ2VLaW5kID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSkgewogCQkJCWludCBkaW09ICgoSW50ZWdlcikgZ2V0T3JpZ2luYWxWYWx1ZShub2RlLCBNZXRob2REZWNsYXJhdGlvbi5FWFRSQV9ESU1FTlNJT05TX1BST1BFUlRZKSkuaW50VmFsdWUoKTsKIAkJCQl3aGlsZSAoZGltID4gMCkgewotCQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VULCBwb3MpOworCQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0tFVCwgcG9zKTsKIAkJCQkJZGltLS07CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCXBvcz0gcmV3cml0ZU5vZGVMaXN0KG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLlRIUk9XTl9FWENFUFRJT05TX1BST1BFUlRZLCBwb3MsICIgdGhyb3dzICIsICIsICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCXJld3JpdGVNZXRob2RCb2R5KG5vZGUsIHBvcyk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtMTUyMCw3ICsxODAxLDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQoQmxvY2spCiAJICovCkBAIC0xNTI4LDcgKzE4MDksNyBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgc3RhcnRQb3M7CiAJCWlmIChpc0NvbGxhcHNlZChub2RlKSkgewogCQkJc3RhcnRQb3M9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOwpAQCAtMTUzOSwyNiArMTgyMCwyNyBAQAogCQlyZXdyaXRlUGFyYWdyYXBoTGlzdChub2RlLCBCbG9jay5TVEFURU1FTlRTX1BST1BFUlRZLCBzdGFydFBvcywgc3RhcnRJbmRlbnQsIDAsIDEpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQoUmV0dXJuU3RhdGVtZW50KQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7Ci0JCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7Ci0JCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwotCQl9Ci0JCQogCQl0cnkgewotCQkJaW50IG9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lcmV0dXJuLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7Ci0JCQllbnN1cmVTcGFjZUJlZm9yZVJlcGxhY2Uobm9kZSwgUmV0dXJuU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFksIG9mZnNldCwgMCk7CisJCQl0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCA9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVyZXR1cm4sIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKIAkJCQotCQkJcmV3cml0ZU5vZGUobm9kZSwgUmV0dXJuU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFksIG9mZnNldCwgQVNUUmV3cml0ZUZvcm1hdHRlci5TUEFDRSk7CisJCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgeworCQkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CisJCQl9CisJCQkKKwkJCWVuc3VyZVNwYWNlQmVmb3JlUmVwbGFjZShub2RlKTsKKwkJCQorCQkJcmV3cml0ZU5vZGUobm9kZSwgUmV0dXJuU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFksIHRoaXMuYmVmb3JlUmVxdWlyZWRTcGFjZUluZGV4LCBBU1RSZXdyaXRlRm9ybWF0dGVyLlNQQUNFKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwotCX0JCQotCQorCX0KKwogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikKQEAgLTE1NjcsNyArMTg0OSw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCWludCBzdGFydFBvcz0gZ2V0UG9zQWZ0ZXJMZWZ0QnJhY2Uobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQlpbnQgc3RhcnRJbmRlbnQ9IGdldEluZGVudChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSkgKyAxOwogCQlyZXdyaXRlUGFyYWdyYXBoTGlzdChub2RlLCBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLkJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZLCBzdGFydFBvcywgc3RhcnRJbmRlbnQsIC0xLCAyKTsKQEAgLTE1ODEsNyArMTg2Myw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQXJyYXlBY2Nlc3MuQVJSQVlfUFJPUEVSVFkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIEFycmF5QWNjZXNzLklOREVYX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTU5NCwxMSArMTg3NiwxMSBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlBcnJheVR5cGUgYXJyYXlUeXBlPSAoQXJyYXlUeXBlKSBnZXRPcmlnaW5hbFZhbHVlKG5vZGUsIEFycmF5Q3JlYXRpb24uVFlQRV9QUk9QRVJUWSk7CiAJCWludCBuT2xkQnJhY2tldHM9IGdldERpbWVuc2lvbnMoYXJyYXlUeXBlKTsgLy8gbnVtYmVyIG9mIHRvdGFsIGJyYWNrZXRzCiAJCWludCBuTmV3QnJhY2tldHM9IG5PbGRCcmFja2V0czsKLQkJCisKIAkJVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA9IG51bGw7CiAJCVJld3JpdGVFdmVudCB0eXBlRXZlbnQ9IGdldEV2ZW50KG5vZGUsIEFycmF5Q3JlYXRpb24uVFlQRV9QUk9QRVJUWSk7CiAJCWlmICh0eXBlRXZlbnQgIT0gbnVsbCAmJiB0eXBlRXZlbnQuZ2V0Q2hhbmdlS2luZCgpID09IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgeyAvLyBjaGFuZ2VkIGFycmF5dHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgZGltZW5zaW9uIG9yIHR5cGUgbmFtZQpAQCAtMTYxNiwxMCArMTg5OCwxMCBAQAogCQkJbk5ld0JyYWNrZXRzPSByZXBsYWNpbmdUeXBlLmdldERpbWVuc2lvbnMoKTsgLy8gaXMgcmVwbGFjZWQgdHlwZQogCQl9CiAJCXZvaWRWaXNpdChhcnJheVR5cGUpOwotCQkKKwogCiAJCXRyeSB7Ci0JCQlpbnQgb2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDS0VULCBhcnJheVR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKKwkJCWludCBvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlblN0YXJ0T2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDS0VULCBhcnJheVR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKIAkJCS8vIGRpbWVuc2lvbiBub2RlIHdpdGggZXhwcmVzc2lvbnMKIAkJCVJld3JpdGVFdmVudCBkaW1FdmVudD0gZ2V0RXZlbnQobm9kZSwgQXJyYXlDcmVhdGlvbi5ESU1FTlNJT05TX1BST1BFUlRZKTsKIAkJCWJvb2xlYW4gaGFzRGltZW5zaW9uQ2hhbmdlcz0gKGRpbUV2ZW50ICE9IG51bGwgJiYgZGltRXZlbnQuZ2V0Q2hhbmdlS2luZCgpICE9IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpOwpAQCAtMTYzOCw3ICsxOTIwLDcgQEAKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCUFTVE5vZGUgZWxlbT0gKEFTVE5vZGUpIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKTsKIAkJCQkJCWludCBlbGVtRW5kPSBlbGVtLmdldFN0YXJ0UG9zaXRpb24oKSArIGVsZW0uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0tFVCwgZWxlbUVuZCk7CisJCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQsIGVsZW1FbmQpOwogCQkJCQkJaWYgKGNoYW5nZUtpbmQgPT0gUmV3cml0ZUV2ZW50LlJFTU9WRUQpIHsKIAkJCQkJCQllZGl0R3JvdXA9IGdldEVkaXRHcm91cChldmVudCk7CiAJCQkJCQkJZG9UZXh0UmVtb3ZlQW5kVmlzaXQob2Zmc2V0LCBlbmRQb3MgLSBvZmZzZXQsIGVsZW0sIGVkaXRHcm91cCk7CkBAIC0xNjYzLDI0ICsxOTQ1LDI0IEBACiAJCQl9CiAJCQlpZiAobk9sZEJyYWNrZXRzICE9IG5OZXdCcmFja2V0cykgewogCQkJCWlmICghaGFzRGltZW5zaW9uQ2hhbmdlcykgewotCQkJCQlvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VULCBvZmZzZXQpOworCQkJCQlvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0tFVCwgb2Zmc2V0KTsKIAkJCQl9CiAJCQkJcmV3cml0ZUV4dHJhRGltZW5zaW9ucyhuT2xkQnJhY2tldHMsIG5OZXdCcmFja2V0cywgb2Zmc2V0LCBlZGl0R3JvdXApOwogCQkJfQotCQkJCQorCiAJCQlpbnQga2luZD0gZ2V0Q2hhbmdlS2luZChub2RlLCBBcnJheUNyZWF0aW9uLklOSVRJQUxJWkVSX1BST1BFUlRZKTsKIAkJCWlmIChraW5kID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7Ci0JCQkJb2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0UHJldmlvdXNUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRSwgb2Zmc2V0KTsKKwkJCQlvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRQcmV2aW91c1Rva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSwgb2Zmc2V0KTsKIAkJCX0gZWxzZSB7CiAJCQkJb2Zmc2V0PSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG5vZGUuZ2V0TGVuZ3RoKCk7IC8vIGluc2VydCBwb3MKIAkJCX0KIAkJCXJld3JpdGVOb2RlKG5vZGUsIEFycmF5Q3JlYXRpb24uSU5JVElBTElaRVJfUFJPUEVSVFksIG9mZnNldCwgQVNUUmV3cml0ZUZvcm1hdHRlci5TUEFDRSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9CQkKKwkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHJpdmF0ZSBUeXBlIGdldEVsZW1lbnRUeXBlKEFycmF5VHlwZSBwYXJlbnQpIHsKIAkJVHlwZSB0ID0gKFR5cGUpIGdldE9yaWdpbmFsVmFsdWUocGFyZW50LCBBcnJheVR5cGUuQ09NUE9ORU5UX1RZUEVfUFJPUEVSVFkpOwogCQl3aGlsZSAodC5pc0FycmF5VHlwZSgpKSB7CkBAIC0xNjg4LDcgKzE5NzAsNyBAQAogCQl9CiAJCXJldHVybiB0OwogCX0KLQkKKwogCXByaXZhdGUgaW50IGdldERpbWVuc2lvbnMoQXJyYXlUeXBlIHBhcmVudCkgewogCQlUeXBlIHQgPSAoVHlwZSkgZ2V0T3JpZ2luYWxWYWx1ZShwYXJlbnQsIEFycmF5VHlwZS5DT01QT05FTlRfVFlQRV9QUk9QRVJUWSk7CiAJCWludCBkaW1lbnNpb25zID0gMTsgLy8gYWx3YXlzIGluY2x1ZGUgdGhpcyBhcnJheSB0eXBlCkBAIC0xNjk3LDcgKzE5NzksNyBAQAogCQkJdCA9IChUeXBlKSBnZXRPcmlnaW5hbFZhbHVlKHQsIEFycmF5VHlwZS5DT01QT05FTlRfVFlQRV9QUk9QRVJUWSk7CiAJCX0KIAkJcmV0dXJuIGRpbWVuc2lvbnM7Ci0JfQkKKwl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChBcnJheUluaXRpYWxpemVyKQpAQCAtMTcwOCw3ICsxOTkwLDcgQEAKIAkJfQogCiAJCWludCBzdGFydFBvcz0gZ2V0UG9zQWZ0ZXJMZWZ0QnJhY2Uobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwotCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgQXJyYXlJbml0aWFsaXplci5FWFBSRVNTSU9OU19QUk9QRVJUWSwgc3RhcnRQb3MsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXJld3JpdGVOb2RlTGlzdChub2RlLCBBcnJheUluaXRpYWxpemVyLkVYUFJFU1NJT05TX1BST1BFUlRZLCBzdGFydFBvcywgVXRpbC5FTVBUWV9TVFJJTkcsICIsICIpOyAvLyROT04tTkxTLTEkIAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xNzIxLDcgKzIwMDMsNyBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIEFycmF5VHlwZS5DT01QT05FTlRfVFlQRV9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0xNzMwLDEzICsyMDEyLDIwIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChBc3NlcnRTdGF0ZW1lbnQpCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKLQkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CisJCXRyeSB7CisJCQl0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCA9IGdldFNjYW5uZXIoKS5nZXROZXh0RW5kT2Zmc2V0KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCB0cnVlKTsKKwkJCQorCQkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKKwkJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOworCQkJfQorCQkJCisJCQllbnN1cmVTcGFjZUJlZm9yZVJlcGxhY2Uobm9kZSk7CisJCQkKKwkJCWludCBvZmZzZXQ9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQXNzZXJ0U3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFkpOworCQkJcmV3cml0ZU5vZGUobm9kZSwgQXNzZXJ0U3RhdGVtZW50Lk1FU1NBR0VfUFJPUEVSVFksIG9mZnNldCwgQVNUUmV3cml0ZUZvcm1hdHRlci5BU1NFUlRfQ09NTUVOVCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQl9Ci0JCQotCQllbnN1cmVTcGFjZUJlZm9yZVJlcGxhY2Uobm9kZSwgQXNzZXJ0U3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFksIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCAxKTsKLQkJaW50IG9mZnNldD0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBBc3NlcnRTdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSk7Ci0JCXJld3JpdGVOb2RlKG5vZGUsIEFzc2VydFN0YXRlbWVudC5NRVNTQUdFX1BST1BFUlRZLCBvZmZzZXQsIEFTVFJld3JpdGVGb3JtYXR0ZXIuQVNTRVJUX0NPTU1FTlQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xNzQ3LDcgKzIwMzYsNyBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIEFzc2lnbm1lbnQuTEVGVF9IQU5EX1NJREVfUFJPUEVSVFkpOwogCQlyZXdyaXRlT3BlcmF0aW9uKG5vZGUsIEFzc2lnbm1lbnQuT1BFUkFUT1JfUFJPUEVSVFksIHBvcyk7CiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQXNzaWdubWVudC5SSUdIVF9IQU5EX1NJREVfUFJPUEVSVFkpOwpAQCAtMTc2MSw3ICsyMDUwLDcgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJQm9vbGVhbiBuZXdMaXRlcmFsPSAoQm9vbGVhbikgZ2V0TmV3VmFsdWUobm9kZSwgQm9vbGVhbkxpdGVyYWwuQk9PTEVBTl9WQUxVRV9QUk9QRVJUWSk7CiAJCVRleHRFZGl0R3JvdXAgZ3JvdXAgPSBnZXRFZGl0R3JvdXAobm9kZSwgQm9vbGVhbkxpdGVyYWwuQk9PTEVBTl9WQUxVRV9QUk9QRVJUWSk7CiAJCWRvVGV4dFJlcGxhY2Uobm9kZS5nZXRTdGFydFBvc2l0aW9uKCksIG5vZGUuZ2V0TGVuZ3RoKCksIG5ld0xpdGVyYWwudG9TdHJpbmcoKSwgZ3JvdXApOwpAQCAtMTc3NywxMiArMjA2NiwxMiBAQAogCQl9CiAKIAkJdHJ5IHsKLQkJCWludCBvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJyZWFrLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7CisJCQlpbnQgb2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnJlYWssIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKIAkJCXJld3JpdGVOb2RlKG5vZGUsIEJyZWFrU3RhdGVtZW50LkxBQkVMX1BST1BFUlRZLCBvZmZzZXQsIEFTVFJld3JpdGVGb3JtYXR0ZXIuU1BBQ0UpOyAvLyBzcGFjZSBiZXR3ZWVuIGJyZWFrIGFuZCBsYWJlbAogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJfQotCQlyZXR1cm4gZmFsc2U7CQkKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTE3OTIsNyArMjA4MSw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQ2FzdEV4cHJlc3Npb24uVFlQRV9QUk9QRVJUWSk7CiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQ2FzdEV4cHJlc3Npb24uRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKQEAgLTE4MDUsNyArMjA5NCw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQ2F0Y2hDbGF1c2UuRVhDRVBUSU9OX1BST1BFUlRZKTsKIAkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBDYXRjaENsYXVzZS5CT0RZX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTgxOCw3ICsyMTA3LDcgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJU3RyaW5nIGVzY2FwZWRTZXE9IChTdHJpbmcpIGdldE5ld1ZhbHVlKG5vZGUsIENoYXJhY3RlckxpdGVyYWwuRVNDQVBFRF9WQUxVRV9QUk9QRVJUWSk7CiAJCVRleHRFZGl0R3JvdXAgZ3JvdXAgPSBnZXRFZGl0R3JvdXAobm9kZSwgQ2hhcmFjdGVyTGl0ZXJhbC5FU0NBUEVEX1ZBTFVFX1BST1BFUlRZKTsKIAkJZG9UZXh0UmVwbGFjZShub2RlLmdldFN0YXJ0UG9zaXRpb24oKSwgbm9kZS5nZXRMZW5ndGgoKSwgZXNjYXBlZFNlcSwgZ3JvdXApOwpAQCAtMTgzMiwxNCArMjEyMSwxNCBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlT3B0aW9uYWxRdWFsaWZpZXIobm9kZSwgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLkVYUFJFU1NJT05fUFJPUEVSVFksIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyX0lOVEVSTkFMKSB7CiAJCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLk5BTUVfUFJPUEVSVFkpOwogCQl9IGVsc2UgewogCQkJaWYgKGlzQ2hhbmdlZChub2RlLCBDbGFzc0luc3RhbmNlQ3JlYXRpb24uVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkpKSB7CiAJCQkJdHJ5IHsKLQkJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVuZXcsIHBvcyk7IC8vYWZ0ZXIgJ25ldycKKwkJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbmV3LCBwb3MpOyAvL2FmdGVyICduZXcnCiAJCQkJCXJld3JpdGVPcHRpb25hbFR5cGVQYXJhbWV0ZXJzKG5vZGUsIENsYXNzSW5zdGFuY2VDcmVhdGlvbi5UWVBFX0FSR1VNRU5UU19QUk9QRVJUWSwgcG9zLCAiICIsIHRydWUsIHRydWUpOyAvLyROT04tTkxTLTEkCiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKQEAgLTE4NTIsMTkgKzIxNDEsMTkgQEAKIAogCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIENsYXNzSW5zdGFuY2VDcmVhdGlvbi5BUkdVTUVOVFNfUFJPUEVSVFkpKSB7CiAJCQl0cnkgewotCQkJCWludCBzdGFydHBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOwotCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBDbGFzc0luc3RhbmNlQ3JlYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBzdGFydHBvcywgIiIsICIsICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlpbnQgc3RhcnRwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHBvcyk7CisJCQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIENsYXNzSW5zdGFuY2VDcmVhdGlvbi5BUkdVTUVOVFNfUFJPUEVSVFksIHN0YXJ0cG9zLCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQl2b2lkVmlzaXQobm9kZSwgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLkFSR1VNRU5UU19QUk9QRVJUWSk7CiAJCX0KLQkJCisKIAkJaW50IGtpbmQ9IGdldENoYW5nZUtpbmQobm9kZSwgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9QUk9QRVJUWSk7CiAJCWlmIChraW5kID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7CiAJCQl0cnkgewotCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFByZXZpb3VzVG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0UsIHBvcyk7CisJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0UHJldmlvdXNUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UsIHBvcyk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQl9CkBAIC0xODgyLDEwICsyMTcxLDEwIEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQ29uZGl0aW9uYWxFeHByZXNzaW9uLkVYUFJFU1NJT05fUFJPUEVSVFkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIENvbmRpdGlvbmFsRXhwcmVzc2lvbi5USEVOX0VYUFJFU1NJT05fUFJPUEVSVFkpOwotCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIENvbmRpdGlvbmFsRXhwcmVzc2lvbi5FTFNFX0VYUFJFU1NJT05fUFJPUEVSVFkpOwkKKwkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBDb25kaXRpb25hbEV4cHJlc3Npb24uRUxTRV9FWFBSRVNTSU9OX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMTg5OCwxMSArMjE4NywxMSBAQAogCQl9CiAJCWludCBwb3M9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQlwb3M9IHJld3JpdGVPcHRpb25hbFR5cGVQYXJhbWV0ZXJzKG5vZGUsIENvbnN0cnVjdG9ySW52b2NhdGlvbi5UWVBFX0FSR1VNRU5UU19QUk9QRVJUWSwgcG9zLCAiIiwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQkJcG9zPSByZXdyaXRlT3B0aW9uYWxUeXBlUGFyYW1ldGVycyhub2RlLCBDb25zdHJ1Y3Rvckludm9jYXRpb24uVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFksIHBvcywgVXRpbC5FTVBUWV9TVFJJTkcsIGZhbHNlLCBmYWxzZSk7IAogCQl9CiAJCXRyeSB7Ci0JCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxQQVJFTiwgcG9zKTsKLQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBDb25zdHJ1Y3Rvckludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHBvcyk7CisJCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgQ29uc3RydWN0b3JJbnZvY2F0aW9uLkFSR1VNRU5UU19QUk9QRVJUWSwgcG9zLCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQl9CkBAIC0xOTE2LDkgKzIyMDUsOSBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQl0cnkgewotCQkJaW50IG9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY29udGludWUsIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKKwkJCWludCBvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjb250aW51ZSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQkJcmV3cml0ZU5vZGUobm9kZSwgQ29udGludWVTdGF0ZW1lbnQuTEFCRUxfUFJPUEVSVFksIG9mZnNldCwgQVNUUmV3cml0ZUZvcm1hdHRlci5TUEFDRSk7IC8vIHNwYWNlIGJldHdlZW4gY29udGludWUgYW5kIGxhYmVsCiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwpAQCAtMTkzMywxNSArMjIyMiwxNSBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJdHJ5IHsKIAkJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQobm9kZSwgRG9TdGF0ZW1lbnQuQk9EWV9QUk9QRVJUWSk7CiAJCQlpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlJFUExBQ0VEKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVkbywgcG9zKTsKKwkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVkbywgcG9zKTsKIAkJCQlBU1ROb2RlIGJvZHk9IChBU1ROb2RlKSBldmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7CiAJCQkJaW50IGJvZHlFbmQ9IGJvZHkuZ2V0U3RhcnRQb3NpdGlvbigpICsgYm9keS5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXdoaWxlLCBib2R5RW5kKTsKKwkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV3aGlsZSwgYm9keUVuZCk7CiAJCQkJcmV3cml0ZUJvZHlOb2RlKG5vZGUsIERvU3RhdGVtZW50LkJPRFlfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCBlbmRQb3MsIGdldEluZGVudChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSksIHRoaXMuZm9ybWF0dGVyLkRPX0JMT0NLKTsgLy8gYm9keQogCQkJfSBlbHNlIHsKIAkJCQl2b2lkVmlzaXQobm9kZSwgRG9TdGF0ZW1lbnQuQk9EWV9QUk9QRVJUWSk7CkBAIC0xOTUwLDcgKzIyMzksNyBAQAogCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQl9CiAKLQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBEb1N0YXRlbWVudC5FWFBSRVNTSU9OX1BST1BFUlRZKTsJCisJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgRG9TdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTE5NjEsNyArMjI1MCw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCWNoYW5nZU5vdFN1cHBvcnRlZChub2RlKTsgLy8gbm8gbW9kaWZpY2F0aW9uIHBvc3NpYmxlCiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0xOTczLDggKzIyNjIsOCBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKLQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBFeHByZXNzaW9uU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFkpOwkKKworCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIEV4cHJlc3Npb25TdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTE5ODUsNyArMjI3NCw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgRmllbGRBY2Nlc3MuRVhQUkVTU0lPTl9QUk9QRVJUWSk7IC8vIGV4cHJlc3Npb24KIAkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBGaWVsZEFjY2Vzcy5OQU1FX1BST1BFUlRZKTsgLy8gbmFtZQogCQlyZXR1cm4gZmFsc2U7CkBAIC0yMDA1LDkgKzIyOTQsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCXJld3JpdGVNb2RpZmllcnMyKG5vZGUsIEZpZWxkRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSwgcG9zKTsKIAkJfQotCQkKKwogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgRmllbGREZWNsYXJhdGlvbi5UWVBFX1BST1BFUlRZKTsKLQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIEZpZWxkRGVjbGFyYXRpb24uRlJBR01FTlRTX1BST1BFUlRZLCBwb3MsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWVuc3VyZVNwYWNlQWZ0ZXJSZXBsYWNlKG5vZGUsIEZpZWxkRGVjbGFyYXRpb24uVFlQRV9QUk9QRVJUWSk7CisJCXJld3JpdGVOb2RlTGlzdChub2RlLCBGaWVsZERlY2xhcmF0aW9uLkZSQUdNRU5UU19QUk9QRVJUWSwgcG9zLCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTIwMTgsNDMgKzIzMDgsNDMgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJdHJ5IHsKIAkJCWludCBwb3M9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQkJCisKIAkJCWlmIChpc0NoYW5nZWQobm9kZSwgRm9yU3RhdGVtZW50LklOSVRJQUxJWkVSU19QUk9QRVJUWSkpIHsKIAkJCQkvLyBwb3NpdGlvbiBhZnRlciBvcGVuaW5nIHBhcmVudAotCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOwotCQkJCXBvcz0gcmV3cml0ZU5vZGVMaXN0KG5vZGUsIEZvclN0YXRlbWVudC5JTklUSUFMSVpFUlNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgcG9zKTsKKwkJCQlwb3M9IHJld3JpdGVOb2RlTGlzdChub2RlLCBGb3JTdGF0ZW1lbnQuSU5JVElBTElaRVJTX1BST1BFUlRZLCBzdGFydE9mZnNldCwgVXRpbC5FTVBUWV9TVFJJTkcsICIsICIpOyAvLyROT04tTkxTLTEkIAogCQkJfSBlbHNlIHsKIAkJCQlwb3M9IGRvVmlzaXQobm9kZSwgRm9yU3RhdGVtZW50LklOSVRJQUxJWkVSU19QUk9QRVJUWSwgcG9zKTsKIAkJCX0KLQkJCQorCiAJCQkvLyBwb3NpdGlvbiBhZnRlciBmaXJzdCBzZW1pY29sb24KLQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lU0VNSUNPTE9OLCBwb3MpOwotCQkJCisJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHBvcyk7CisKIAkJCXBvcz0gcmV3cml0ZU5vZGUobm9kZSwgRm9yU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFksIHBvcywgQVNUUmV3cml0ZUZvcm1hdHRlci5OT05FKTsKLQkJCQorCiAJCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIEZvclN0YXRlbWVudC5VUERBVEVSU19QUk9QRVJUWSkpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVNFTUlDT0xPTiwgcG9zKTsKLQkJCQlwb3M9IHJld3JpdGVOb2RlTGlzdChub2RlLCBGb3JTdGF0ZW1lbnQuVVBEQVRFUlNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgcG9zKTsKKwkJCQlwb3M9IHJld3JpdGVOb2RlTGlzdChub2RlLCBGb3JTdGF0ZW1lbnQuVVBEQVRFUlNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCQl9IGVsc2UgewogCQkJCXBvcz0gZG9WaXNpdChub2RlLCBGb3JTdGF0ZW1lbnQuVVBEQVRFUlNfUFJPUEVSVFksIHBvcyk7CiAJCQl9CiAKIAkJCVJld3JpdGVFdmVudCBib2R5RXZlbnQ9IGdldEV2ZW50KG5vZGUsIEZvclN0YXRlbWVudC5CT0RZX1BST1BFUlRZKTsKIAkJCWlmIChib2R5RXZlbnQgIT0gbnVsbCAmJiBib2R5RXZlbnQuZ2V0Q2hhbmdlS2luZCgpID09IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgewotCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUlBBUkVOLCBwb3MpOworCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgcG9zKTsKIAkJCQlyZXdyaXRlQm9keU5vZGUobm9kZSwgRm9yU3RhdGVtZW50LkJPRFlfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAtMSwgZ2V0SW5kZW50KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKSwgdGhpcy5mb3JtYXR0ZXIuRk9SX0JMT0NLKTsgLy8gYm9keQogCQkJfSBlbHNlIHsKIAkJCQl2b2lkVmlzaXQobm9kZSwgRm9yU3RhdGVtZW50LkJPRFlfUFJPUEVSVFkpOwogCQkJfQotCQkJCisKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCX0KLQkJCQotCQkKKworCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTIwNjUsMjcgKzIzNTUsMjkgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJaW50IHBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBJZlN0YXRlbWVudC5FWFBSRVNTSU9OX1BST1BFUlRZKTsgLy8gc3RhdGVtZW50Ci0JCQorCiAJCVJld3JpdGVFdmVudCB0aGVuRXZlbnQ9IGdldEV2ZW50KG5vZGUsIElmU3RhdGVtZW50LlRIRU5fU1RBVEVNRU5UX1BST1BFUlRZKTsKIAkJaW50IGVsc2VDaGFuZ2U9IGdldENoYW5nZUtpbmQobm9kZSwgSWZTdGF0ZW1lbnQuRUxTRV9TVEFURU1FTlRfUFJPUEVSVFkpOwogCiAJCWlmICh0aGVuRXZlbnQgIT0gbnVsbCAmJiB0aGVuRXZlbnQuZ2V0Q2hhbmdlS2luZCgpICE9IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpIHsKIAkJCXRyeSB7Ci0JCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSUEFSRU4sIHBvcyk7IC8vIGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudAotCQkJCWludCBpbmRlbnQ9IGdldEluZGVudChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7CisJCQkJaW50IHRvaz0gZ2V0U2Nhbm5lcigpLnJlYWROZXh0KHBvcywgdHJ1ZSk7IC8vIGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudAorCQkJCXBvcz0gKHRvayA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4pID8gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKSA6IGdldFNjYW5uZXIoKS5nZXRDdXJyZW50U3RhcnRPZmZzZXQoKTsKIAkJCQkKKwkJCQlpbnQgaW5kZW50PSBnZXRJbmRlbnQobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOworCiAJCQkJaW50IGVuZFBvcz0gLTE7CiAJCQkJT2JqZWN0IGVsc2VTdGF0ZW1lbnQ9IGdldE9yaWdpbmFsVmFsdWUobm9kZSwgSWZTdGF0ZW1lbnQuRUxTRV9TVEFURU1FTlRfUFJPUEVSVFkpOwogCQkJCWlmIChlbHNlU3RhdGVtZW50ICE9IG51bGwpIHsKIAkJCQkJQVNUTm9kZSB0aGVuU3RhdGVtZW50ID0gKEFTVE5vZGUpIHRoZW5FdmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7Ci0JCQkJCWVuZFBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuU3RhcnRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVlbHNlLCB0aGVuU3RhdGVtZW50LmdldFN0YXJ0UG9zaXRpb24oKSArIHRoZW5TdGF0ZW1lbnQuZ2V0TGVuZ3RoKCkpOyAvLyBlbHNlIGtleXdvcmQKKwkJCQkJZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbHNlLCB0aGVuU3RhdGVtZW50LmdldFN0YXJ0UG9zaXRpb24oKSArIHRoZW5TdGF0ZW1lbnQuZ2V0TGVuZ3RoKCkpOyAvLyBlbHNlIGtleXdvcmQKIAkJCQl9CiAJCQkJaWYgKGVsc2VTdGF0ZW1lbnQgPT0gbnVsbCB8fCBlbHNlQ2hhbmdlICE9IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpIHsKLQkJCQkJcG9zPSByZXdyaXRlQm9keU5vZGUobm9kZSwgSWZTdGF0ZW1lbnQuVEhFTl9TVEFURU1FTlRfUFJPUEVSVFksIHBvcywgZW5kUG9zLCBpbmRlbnQsIHRoaXMuZm9ybWF0dGVyLklGX0JMT0NLX05PX0VMU0UpOyAKKwkJCQkJcG9zPSByZXdyaXRlQm9keU5vZGUobm9kZSwgSWZTdGF0ZW1lbnQuVEhFTl9TVEFURU1FTlRfUFJPUEVSVFksIHBvcywgZW5kUG9zLCBpbmRlbnQsIHRoaXMuZm9ybWF0dGVyLklGX0JMT0NLX05PX0VMU0UpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXBvcz0gcmV3cml0ZUJvZHlOb2RlKG5vZGUsIElmU3RhdGVtZW50LlRIRU5fU1RBVEVNRU5UX1BST1BFUlRZLCBwb3MsIGVuZFBvcywgaW5kZW50LCB0aGlzLmZvcm1hdHRlci5JRl9CTE9DS19XSVRIX0VMU0UpOyAKKwkJCQkJcG9zPSByZXdyaXRlQm9keU5vZGUobm9kZSwgSWZTdGF0ZW1lbnQuVEhFTl9TVEFURU1FTlRfUFJPUEVSVFksIHBvcywgZW5kUG9zLCBpbmRlbnQsIHRoaXMuZm9ybWF0dGVyLklGX0JMT0NLX1dJVEhfRUxTRSk7CiAJCQkJfQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwpAQCAtMjExOSwxMCArMjQxMSwxMCBAQAogCQkJUmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRFdmVudChub2RlLCBJbXBvcnREZWNsYXJhdGlvbi5TVEFUSUNfUFJPUEVSVFkpOwogCQkJaWYgKGV2ZW50ICE9IG51bGwgJiYgZXZlbnQuZ2V0Q2hhbmdlS2luZCgpICE9IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpIHsKIAkJCQl0cnkgewotCQkJCQlpbnQgcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbXBvcnQsIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKKwkJCQkJaW50IHBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWltcG9ydCwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQkJCQlib29sZWFuIHdhc1N0YXRpYz0gKChCb29sZWFuKSBldmVudC5nZXRPcmlnaW5hbFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwogCQkJCQlpZiAod2FzU3RhdGljKSB7Ci0JCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzdGF0aWMsIHBvcyk7CisJCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3RhdGljLCBwb3MpOwogCQkJCQkJZG9UZXh0UmVtb3ZlKHBvcywgZW5kUG9zIC0gcG9zLCBnZXRFZGl0R3JvdXAoZXZlbnQpKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWRvVGV4dEluc2VydChwb3MsICIgc3RhdGljIiwgZ2V0RWRpdEdyb3VwKGV2ZW50KSk7IC8vJE5PTi1OTFMtMSQKQEAgLTIxMzIsOSArMjQyNCw5IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCWludCBwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgSW1wb3J0RGVjbGFyYXRpb24uTkFNRV9QUk9QRVJUWSk7Ci0JCQorCiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQobm9kZSwgSW1wb3J0RGVjbGFyYXRpb24uT05fREVNQU5EX1BST1BFUlRZKTsKIAkJaWYgKGV2ZW50ICE9IG51bGwgJiYgZXZlbnQuZ2V0Q2hhbmdlS2luZCgpICE9IFJld3JpdGVFdmVudC5VTkNIQU5HRUQpIHsKIAkJCWJvb2xlYW4gaXNPbkRlbWFuZD0gKChCb29sZWFuKSBldmVudC5nZXRPcmlnaW5hbFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwpAQCAtMjE0Miw3ICsyNDM0LDcgQEAKIAkJCQlkb1RleHRJbnNlcnQocG9zLCAiLioiLCBnZXRFZGl0R3JvdXAoZXZlbnQpKTsgLy8kTk9OLU5MUy0xJAogCQkJfSBlbHNlIHsKIAkJCQl0cnkgewotCQkJCQlpbnQgZW5kUG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5TdGFydE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVNFTUlDT0xPTiwgcG9zKTsKKwkJCQkJaW50IGVuZFBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuU3RhcnRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCBwb3MpOwogCQkJCQlkb1RleHRSZW1vdmUocG9zLCBlbmRQb3MgLSBwb3MsIGdldEVkaXRHcm91cChldmVudCkpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCQloYW5kbGVFeGNlcHRpb24oZSk7CkBAIC0yMTUxLDkgKzI0NDMsOSBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCiAKLQkKKworCiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChJbmZpeEV4cHJlc3Npb24pCkBAIC0yMTYyLDI0ICsyNDU0LDI0IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCWludCBwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgSW5maXhFeHByZXNzaW9uLkxFRlRfT1BFUkFORF9QUk9QRVJUWSk7Ci0JCQorCiAJCWJvb2xlYW4gbmVlZHNOZXdPcGVyYXRpb249IGlzQ2hhbmdlZChub2RlLCBJbmZpeEV4cHJlc3Npb24uT1BFUkFUT1JfUFJPUEVSVFkpOwogCQlTdHJpbmcgb3BlcmF0aW9uPSBnZXROZXdWYWx1ZShub2RlLCBJbmZpeEV4cHJlc3Npb24uT1BFUkFUT1JfUFJPUEVSVFkpLnRvU3RyaW5nKCk7CiAJCWlmIChuZWVkc05ld09wZXJhdGlvbikgewogCQkJcmVwbGFjZU9wZXJhdGlvbihwb3MsIG9wZXJhdGlvbiwgZ2V0RWRpdEdyb3VwKG5vZGUsIEluZml4RXhwcmVzc2lvbi5PUEVSQVRPUl9QUk9QRVJUWSkpOwogCQl9Ci0JCQkKKwogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgSW5maXhFeHByZXNzaW9uLlJJR0hUX09QRVJBTkRfUFJPUEVSVFkpOwotCQkKKwogCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGdldEV2ZW50KG5vZGUsIEluZml4RXhwcmVzc2lvbi5FWFRFTkRFRF9PUEVSQU5EU19QUk9QRVJUWSk7CiAJCVN0cmluZyBwcmVmaXhTdHJpbmc9ICcgJyArIG9wZXJhdGlvbiArICcgJzsKLQkJCisKIAkJaWYgKG5lZWRzTmV3T3BlcmF0aW9uKSB7CiAJCQlpbnQgc3RhcnRQb3M9IHBvczsKIAkJCVRleHRFZGl0R3JvdXAgZWRpdEdyb3VwPSBnZXRFZGl0R3JvdXAobm9kZSwgSW5maXhFeHByZXNzaW9uLk9QRVJBVE9SX1BST1BFUlRZKTsKLQkJCQorCiAJCQlpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewogCQkJCVJld3JpdGVFdmVudFtdIGV4dGVuZGVkT3BlcmFuZHM9IGV2ZW50LmdldENoaWxkcmVuKCk7CiAJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGV4dGVuZGVkT3BlcmFuZHMubGVuZ3RoOyBpKyspIHsKQEAgLTIxOTgsNyArMjQ5MCw3IEBACiAJCQkJCUFTVE5vZGUgZWxlbT0gKEFTVE5vZGUpIGV4dGVuZGVkT3BlcmFuZHMuZ2V0KGkpOwogCQkJCQlyZXBsYWNlT3BlcmF0aW9uKHN0YXJ0UG9zLCBvcGVyYXRpb24sIGVkaXRHcm91cCk7CiAJCQkJCXN0YXJ0UG9zPSBlbGVtLmdldFN0YXJ0UG9zaXRpb24oKSArIGVsZW0uZ2V0TGVuZ3RoKCk7Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIEluZml4RXhwcmVzc2lvbi5FWFRFTkRFRF9PUEVSQU5EU19QUk9QRVJUWSwgcG9zLCBwcmVmaXhTdHJpbmcsIHByZWZpeFN0cmluZyk7CkBAIC0yMjI5LDE5ICsyNTIxLDE5IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQkJCisKIAkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBJbnN0YW5jZW9mRXhwcmVzc2lvbi5MRUZUX09QRVJBTkRfUFJPUEVSVFkpOwogCQllbnN1cmVTcGFjZUFmdGVyUmVwbGFjZShub2RlLCBJbnN0YW5jZW9mRXhwcmVzc2lvbi5MRUZUX09QRVJBTkRfUFJPUEVSVFkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIEluc3RhbmNlb2ZFeHByZXNzaW9uLlJJR0hUX09QRVJBTkRfUFJPUEVSVFkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW5zdXJlU3BhY2VBZnRlclJlcGxhY2UoQVNUTm9kZSBub2RlLCBDaGlsZFByb3BlcnR5RGVzY3JpcHRvciBkZXNjKSB7CiAJCWlmIChnZXRDaGFuZ2VLaW5kKG5vZGUsIGRlc2MpID09IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgewogCQkJaW50IGxlZnRPcGVyYW5kRW5kPSBnZXRFeHRlbmRlZEVuZCgoQVNUTm9kZSkgZ2V0T3JpZ2luYWxWYWx1ZShub2RlLCBkZXNjKSk7CiAJCQl0cnkgewogCQkJCWludCBvZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXROZXh0U3RhcnRPZmZzZXQobGVmdE9wZXJhbmRFbmQsIHRydWUpOyAvLyBpbnN0YW5jZW9mCi0JCQkJCisKIAkJCQlpZiAob2Zmc2V0ID09IGxlZnRPcGVyYW5kRW5kKSB7CiAJCQkJCWRvVGV4dEluc2VydChvZmZzZXQsIFN0cmluZy52YWx1ZU9mKCcgJyksIGdldEVkaXRHcm91cChub2RlLCBkZXNjKSk7CiAJCQkJfQpAQCAtMjI1MSwyNCArMjU0MywyNiBAQAogCQl9CiAJfQogCQotCXB1YmxpYyB2b2lkIGVuc3VyZVNwYWNlQmVmb3JlUmVwbGFjZShBU1ROb2RlIG5vZGUsIENoaWxkUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MsIGludCBvZmZzZXQsIGludCBudW1Ub2tlbkJlZm9yZSkgewotCQkvLyBidWcgMTAzOTcwCi0JCWlmIChnZXRDaGFuZ2VLaW5kKG5vZGUsIGRlc2MpID09IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAobnVtVG9rZW5CZWZvcmUgPiAwKSB7Ci0JCQkJCW9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldE5leHRFbmRPZmZzZXQob2Zmc2V0LCB0cnVlKTsKLQkJCQkJbnVtVG9rZW5CZWZvcmUtLTsKKwlwdWJsaWMgdm9pZCBlbnN1cmVTcGFjZUJlZm9yZVJlcGxhY2UoQVNUTm9kZSBub2RlKSB7CisJCWlmICh0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCAgPT0gLTEpIHJldHVybjsKKwkJCisJCUxpc3QgZXZlbnRzID0gdGhpcy5ldmVudFN0b3JlLmdldENoYW5nZWRQcm9wZXJ0aWVFdmVudHMobm9kZSk7CisJCQorCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXZlbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKwkJCVJld3JpdGVFdmVudCBldmVudCA9IChSZXdyaXRlRXZlbnQpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChldmVudC5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlJFUExBQ0VEICYmIGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKSBpbnN0YW5jZW9mIEFTVE5vZGUpIHsKKwkJCQlpZiAodGhpcy5iZWZvcmVSZXF1aXJlZFNwYWNlSW5kZXggID09IGdldEV4dGVuZGVkT2Zmc2V0KChBU1ROb2RlKSBldmVudC5nZXRPcmlnaW5hbFZhbHVlKCkpKSB7CisJCQkJCWRvVGV4dEluc2VydCh0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCAsIFN0cmluZy52YWx1ZU9mKCcgJyksIGdldEVkaXRHcm91cChldmVudCkpOworCQkJCQl0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCAgPSAtMTsKKwkJCQkJcmV0dXJuOwogCQkJCX0KLSAgICAJCQlpZiAob2Zmc2V0ID09IGdldEV4dGVuZGVkT2Zmc2V0KChBU1ROb2RlKSBnZXRPcmlnaW5hbFZhbHVlKG5vZGUsIGRlc2MpKSkgewotCQkJCQlkb1RleHRJbnNlcnQob2Zmc2V0LCBTdHJpbmcudmFsdWVPZignICcpLCBnZXRFZGl0R3JvdXAobm9kZSwgZGVzYykpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJCX0KIAkJfQorCQkKKwkJaWYgKHRoaXMuYmVmb3JlUmVxdWlyZWRTcGFjZUluZGV4ICA8IGdldEV4dGVuZGVkT2Zmc2V0KG5vZGUpKSB7CisJCQl0aGlzLmJlZm9yZVJlcXVpcmVkU3BhY2VJbmRleCAgPSAtMTsKKwkJfQogCX0KLQkKLQkKIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KEphdmFkb2MpCkBAIC0yMjc5LDcgKzI1NzMsNyBAQAogCQl9CiAJCWludCBzdGFydFBvcz0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyAzOwogCQlTdHJpbmcgc2VwYXJhdG9yPSBnZXRMaW5lRGVsaW1pdGVyKCkgKyBnZXRJbmRlbnRBdE9mZnNldChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSkgICsgIiAqICI7IC8vJE5PTi1OTFMtMSQKLQkJCisKIAkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIEphdmFkb2MuVEFHU19QUk9QRVJUWSwgc3RhcnRQb3MsIHNlcGFyYXRvciwgc2VwYXJhdG9yKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTIyOTEsOSArMjU4NSw5IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgTGFiZWxlZFN0YXRlbWVudC5MQUJFTF9QUk9QRVJUWSk7Ci0JCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgTGFiZWxlZFN0YXRlbWVudC5CT0RZX1BST1BFUlRZKTsJCQorCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIExhYmVsZWRTdGF0ZW1lbnQuQk9EWV9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTIzMDQsMTkgKzI1OTgsMTkgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJaW50IHBvcz0gcmV3cml0ZU9wdGlvbmFsUXVhbGlmaWVyKG5vZGUsIE1ldGhvZEludm9jYXRpb24uRVhQUkVTU0lPTl9QUk9QRVJUWSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQlwb3M9IHJld3JpdGVPcHRpb25hbFR5cGVQYXJhbWV0ZXJzKG5vZGUsIE1ldGhvZEludm9jYXRpb24uVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFksIHBvcywgIiIsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXBvcz0gcmV3cml0ZU9wdGlvbmFsVHlwZVBhcmFtZXRlcnMobm9kZSwgTWV0aG9kSW52b2NhdGlvbi5UWVBFX0FSR1VNRU5UU19QUk9QRVJUWSwgcG9zLCBVdGlsLkVNUFRZX1NUUklORywgZmFsc2UsIGZhbHNlKTsgCiAJCX0KIAogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgTWV0aG9kSW52b2NhdGlvbi5OQU1FX1BST1BFUlRZKTsKLQkJCisKIAkJaWYgKGlzQ2hhbmdlZChub2RlLCBNZXRob2RJbnZvY2F0aW9uLkFSR1VNRU5UU19QUk9QRVJUWSkpIHsKIAkJCS8vIGV2YWwgcG9zaXRpb24gYWZ0ZXIgb3BlbmluZyBwYXJlbnQKIAkJCXRyeSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMUEFSRU4sIHBvcyk7Ci0JCQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIE1ldGhvZEludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBzdGFydE9mZnNldCwgIiIsICIsICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHBvcyk7CisJCQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIE1ldGhvZEludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBzdGFydE9mZnNldCwgVXRpbC5FTVBUWV9TVFJJTkcsICIsICIpOyAvLyROT04tTkxTLTEkIAogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQpAQCAtMjMzMyw3ICsyNjI3LDcgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJY2hhbmdlTm90U3VwcG9ydGVkKG5vZGUpOyAvLyBubyBtb2RpZmljYXRpb24gcG9zc2libGUKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTIzNjAsOSArMjY1NCw5IEBACiAJCX0KIAkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewogCQkJaW50IHBvcz0gcmV3cml0ZUphdmFkb2Mobm9kZSwgUGFja2FnZURlY2xhcmF0aW9uLkpBVkFET0NfUFJPUEVSVFkpOwotCQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIFBhY2thZ2VEZWNsYXJhdGlvbi5BTk5PVEFUSU9OU19QUk9QRVJUWSwgcG9zLCAiIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXdyaXRlTW9kaWZpZXJzMihub2RlLCBQYWNrYWdlRGVjbGFyYXRpb24uQU5OT1RBVElPTlNfUFJPUEVSVFksIHBvcyk7CiAJCX0KLQkJCisKIAkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBQYWNrYWdlRGVjbGFyYXRpb24uTkFNRV9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yMzc0LDcgKzI2NjgsNyBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLkVYUFJFU1NJT05fUFJPUEVSVFkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMjM4NiwxMCArMjY4MCwxMCBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFBvc3RmaXhFeHByZXNzaW9uLk9QRVJBTkRfUFJPUEVSVFkpOwogCQlyZXdyaXRlT3BlcmF0aW9uKG5vZGUsIFBvc3RmaXhFeHByZXNzaW9uLk9QRVJBVE9SX1BST1BFUlRZLCBwb3MpOwotCQlyZXR1cm4gZmFsc2U7CQkKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTIzOTksMTAgKzI2OTMsMTAgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJcmV3cml0ZU9wZXJhdGlvbihub2RlLCBQcmVmaXhFeHByZXNzaW9uLk9QRVJBVE9SX1BST1BFUlRZLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7CiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgUHJlZml4RXhwcmVzc2lvbi5PUEVSQU5EX1BST1BFUlRZKTsKLQkJcmV0dXJuIGZhbHNlOwkKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTI0MjUsNyArMjcxOSw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgUXVhbGlmaWVkTmFtZS5RVUFMSUZJRVJfUFJPUEVSVFkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFF1YWxpZmllZE5hbWUuTkFNRV9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKQEAgLTI0NTEsNyArMjc0NSw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgU2ltcGxlVHlwZS5OQU1FX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTI0ODMsMTYgKzI3NzcsMjEgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJCWlmICghbm9kZS5pc1ZhcmFyZ3MoKSkgeworCQkJCWVuc3VyZVNwYWNlQWZ0ZXJSZXBsYWNlKG5vZGUsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uVFlQRV9QUk9QRVJUWSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQllbnN1cmVTcGFjZUFmdGVyUmVwbGFjZShub2RlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLlRZUEVfUFJPUEVSVFkpOwogCQl9Ci0JCQorCiAJCXBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLk5BTUVfUFJPUEVSVFkpOwogCQlpbnQgZXh0cmFEaW1zPSByZXdyaXRlRXh0cmFEaW1lbnNpb25zKG5vZGUsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSwgcG9zKTsKLQkJCisKIAkJaWYgKGV4dHJhRGltcyA+IDApIHsKIAkJCWludCBraW5kPSBnZXRDaGFuZ2VLaW5kKG5vZGUsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uSU5JVElBTElaRVJfUFJPUEVSVFkpOwogCQkJaWYgKGtpbmQgPT0gUmV3cml0ZUV2ZW50LlJFTU9WRUQpIHsKIAkJCQl0cnkgewotCQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRQcmV2aW91c1Rva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRVFVQUwsIHBvcyk7CisJCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFByZXZpb3VzVG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRVFVQUwsIHBvcyk7CiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJCQl9CkBAIC0yNTAwLDcgKzI3OTksNyBAQAogCQkJCXBvcz0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyBub2RlLmdldExlbmd0aCgpOyAvLyBpbnNlcnQgcG9zCiAJCQl9CiAJCX0KLQkJCisKIAkJcmV3cml0ZU5vZGUobm9kZSwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUl9QUk9QRVJUWSwgcG9zLCB0aGlzLmZvcm1hdHRlci5WQVJfSU5JVElBTElaRVIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMjUyNiwyNSArMjgyNSwyNSBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlT3B0aW9uYWxRdWFsaWZpZXIobm9kZSwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uRVhQUkVTU0lPTl9QUk9QRVJUWSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCiAJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCXBvcz0gcmV3cml0ZU9wdGlvbmFsVHlwZVBhcmFtZXRlcnMobm9kZSwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFksIHBvcywgIiIsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXBvcz0gcmV3cml0ZU9wdGlvbmFsVHlwZVBhcmFtZXRlcnMobm9kZSwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFksIHBvcywgVXRpbC5FTVBUWV9TVFJJTkcsIGZhbHNlLCBmYWxzZSk7IAogCQl9Ci0JCQorCiAJCWlmIChpc0NoYW5nZWQobm9kZSwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZKSkgewogCQkJLy8gZXZhbCBwb3NpdGlvbiBhZnRlciBvcGVuaW5nIHBhcmVudAogCQkJdHJ5IHsKLQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxQQVJFTiwgcG9zKTsKLQkJCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOworCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5BUkdVTUVOVFNfUFJPUEVSVFksIHBvcywgVXRpbC5FTVBUWV9TVFJJTkcsICIsICIpOyAvLyROT04tTkxTLTEkIAogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQogCQl9IGVsc2UgewogCQkJdm9pZFZpc2l0KG5vZGUsIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLkFSR1VNRU5UU19QUk9QRVJUWSk7CiAJCX0KLQkJcmV0dXJuIGZhbHNlOwkJCisJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0yNTU0LDEwICsyODUzLDEwIEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVPcHRpb25hbFF1YWxpZmllcihub2RlLCBTdXBlckZpZWxkQWNjZXNzLlFVQUxJRklFUl9QUk9QRVJUWSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFN1cGVyRmllbGRBY2Nlc3MuTkFNRV9QUk9QRVJUWSk7Ci0JCXJldHVybiBmYWxzZTsJCQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQpAQCAtMjU2NywzNCArMjg2NiwzNCBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlT3B0aW9uYWxRdWFsaWZpZXIobm9kZSwgU3VwZXJNZXRob2RJbnZvY2F0aW9uLlFVQUxJRklFUl9QUk9QRVJUWSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOwotCQkKKwogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CiAJCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIFN1cGVyTWV0aG9kSW52b2NhdGlvbi5UWVBFX0FSR1VNRU5UU19QUk9QRVJUWSkpIHsKIAkJCQl0cnkgewotCQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVCwgcG9zKTsKLQkJCQkJcmV3cml0ZU9wdGlvbmFsVHlwZVBhcmFtZXRlcnMobm9kZSwgU3VwZXJNZXRob2RJbnZvY2F0aW9uLlRZUEVfQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsICIiLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCwgcG9zKTsKKwkJCQkJcmV3cml0ZU9wdGlvbmFsVHlwZVBhcmFtZXRlcnMobm9kZSwgU3VwZXJNZXRob2RJbnZvY2F0aW9uLlRZUEVfQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCBmYWxzZSwgZmFsc2UpOyAKIAkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgU3VwZXJNZXRob2RJbnZvY2F0aW9uLk5BTUVfUFJPUEVSVFkpOwotCQkKKwogCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIFN1cGVyTWV0aG9kSW52b2NhdGlvbi5BUkdVTUVOVFNfUFJPUEVSVFkpKSB7CiAJCQkvLyBldmFsIHBvc2l0aW9uIGFmdGVyIG9wZW5pbmcgcGFyZW50CiAJCQl0cnkgewotCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOwotCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBTdXBlck1ldGhvZEludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOworCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBTdXBlck1ldGhvZEludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXZvaWRWaXNpdChub2RlLCBTdXBlck1ldGhvZEludm9jYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZKTsKLQkJfQkJCi0JCXJldHVybiBmYWxzZTsJCisJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTI2MDQsMjkgKzI5MDMsMTAxIEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCS8vIGRvbnQgYWxsb3cgc3dpdGNoaW5nIGZyb20gY2FzZSB0byBkZWZhdWx0IG9yIGJhY2suIE5ldyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBjcmVhdGVkLgogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFN3aXRjaENhc2UuRVhQUkVTU0lPTl9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAljbGFzcyBTd2l0Y2hMaXN0UmV3cml0ZXIgZXh0ZW5kcyBQYXJhZ3JhcGhMaXN0UmV3cml0ZXIgeworCQkKKwkJcHJpdmF0ZSBib29sZWFuIGluZGVudFN3aXRjaFN0YXRlbWVudHNDb21wYXJlVG9DYXNlczsKIAogCQlwdWJsaWMgU3dpdGNoTGlzdFJld3JpdGVyKGludCBpbml0aWFsSW5kZW50KSB7CiAJCQlzdXBlcihpbml0aWFsSW5kZW50LCAwKTsKKwkJCXRoaXMuaW5kZW50U3dpdGNoU3RhdGVtZW50c0NvbXBhcmVUb0Nhc2VzID0gCisJCQkJRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoQVNUUmV3cml0ZUFuYWx5emVyLnRoaXMub3B0aW9ucy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOREVOVF9TV0lUQ0hTVEFURU1FTlRTX0NPTVBBUkVfVE9fQ0FTRVMpKTsKIAkJfQotCQkKKwogCQlwcm90ZWN0ZWQgaW50IGdldE5vZGVJbmRlbnQoaW50IG5vZGVJbmRleCkgewogCQkJaW50IGluZGVudD0gZ2V0SW5pdGlhbEluZGVudCgpOwotCQkJQVNUTm9kZSBub2RlPSAoQVNUTm9kZSkgdGhpcy5saXN0W25vZGVJbmRleF0uZ2V0T3JpZ2luYWxWYWx1ZSgpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGU9IChBU1ROb2RlKSB0aGlzLmxpc3Rbbm9kZUluZGV4XS5nZXROZXdWYWx1ZSgpOwotCQkJfQotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLlNXSVRDSF9DQVNFKSB7Ci0JCQkJaW5kZW50Kys7CisJCQkKKwkJCWlmICh0aGlzLmluZGVudFN3aXRjaFN0YXRlbWVudHNDb21wYXJlVG9DYXNlcykgeworCQkJCVJld3JpdGVFdmVudCBldmVudCA9IHRoaXMubGlzdFtub2RlSW5kZXhdOworCQkJCWludCBjaGFuZ2VLaW5kID0gZXZlbnQuZ2V0Q2hhbmdlS2luZCgpOworCQkJCQorCQkJCUFTVE5vZGUgbm9kZTsKKwkJCQlpZiAoY2hhbmdlS2luZCA9PSBSZXdyaXRlRXZlbnQuSU5TRVJURUQgfHwgY2hhbmdlS2luZCA9PSBSZXdyaXRlRXZlbnQuUkVQTEFDRUQpIHsKKwkJCQkJbm9kZT0gKEFTVE5vZGUpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlub2RlPSAoQVNUTm9kZSlldmVudC5nZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJfQorCQkJCQorCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gQVNUTm9kZS5TV0lUQ0hfQ0FTRSkgeworCQkJCQlpbmRlbnQrKzsKKwkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gaW5kZW50OwotCQl9CQkKKwkJfQorCQkKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXBhcmF0b3JTdHJpbmcoaW50IG5vZGVJbmRleCkgeworCQkJaW50IHRvdGFsID0gdGhpcy5saXN0Lmxlbmd0aDsKKwkJCQorCQkJaW50IG5leHROb2RlSW5kZXggPSBub2RlSW5kZXggKyAxOworCQkJd2hpbGUgKG5leHROb2RlSW5kZXggPCB0b3RhbCAmJiB0aGlzLmxpc3RbbmV4dE5vZGVJbmRleF0uZ2V0Q2hhbmdlS2luZCgpID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7CisJCQkJbmV4dE5vZGVJbmRleCsrOworCQkJfQorCQkJaWYgKG5leHROb2RlSW5kZXggPT0gdG90YWwpIHsKKwkJCQlyZXR1cm4gc3VwZXIuZ2V0U2VwYXJhdG9yU3RyaW5nKG5vZGVJbmRleCk7CisJCQl9CisJCQlyZXR1cm4gZ2V0U2VwYXJhdG9yU3RyaW5nKG5vZGVJbmRleCwgbmV4dE5vZGVJbmRleCk7CisJCX0KKwkJCisJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUluZGVudChpbnQgcHJldk1hcmssIGludCBvcmlnaW5hbE9mZnNldCwgaW50IG5vZGVJbmRleCwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKKwkJCWlmIChwcmV2TWFyayAhPSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEICYmIHByZXZNYXJrICE9IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgcmV0dXJuOworCQkJCisJCQkvLyBEbyBub3QgY2hhbmdlIGluZGVudCBpZiB0aGUgcHJldmlvdXMgbm9uIHJlbW92ZWQgbm9kZSBpcyBvbiB0aGUgc2FtZSBsaW5lCisJCQlpbnQgcHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4ID0gbm9kZUluZGV4IC0gMTsKKwkJCXdoaWxlIChwcmV2aW91c05vblJlbW92ZWROb2RlSW5kZXggPj0gMCAmJiB0aGlzLmxpc3RbcHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4XS5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlJFTU9WRUQpIHsKKwkJCQlwcmV2aW91c05vblJlbW92ZWROb2RlSW5kZXgtLTsKKwkJCX0KKwkJCQorCQkJaWYgKHByZXZpb3VzTm9uUmVtb3ZlZE5vZGVJbmRleCA+IC0xKSB7CisJCQkJTGluZUluZm9ybWF0aW9uIGxpbmVJbmZvcm1hdGlvbiA9IGdldExpbmVJbmZvcm1hdGlvbigpOworCQkJCQorCQkJCVJld3JpdGVFdmVudCBwcmV2RXZlbnQgPSB0aGlzLmxpc3RbcHJldmlvdXNOb25SZW1vdmVkTm9kZUluZGV4XTsKKwkJCQlpbnQgcHJldktpbmQgPSBwcmV2RXZlbnQuZ2V0Q2hhbmdlS2luZCgpOworCQkJCWlmIChwcmV2S2luZCA9PSBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEIHx8IHByZXZLaW5kID09IFJld3JpdGVFdmVudC5SRVBMQUNFRCkgeworCQkJCQlBU1ROb2RlIHByZXZOb2RlID0gKEFTVE5vZGUpIHRoaXMubGlzdFtwcmV2aW91c05vblJlbW92ZWROb2RlSW5kZXhdLmdldE9yaWdpbmFsVmFsdWUoKTsKKwkJCQkJaW50IHByZXZFbmRQb3NpdGlvbiA9IHByZXZOb2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIHByZXZOb2RlLmdldExlbmd0aCgpOworCQkJCQlpbnQgcHJldkxpbmUgPSBsaW5lSW5mb3JtYXRpb24uZ2V0TGluZU9mT2Zmc2V0KHByZXZFbmRQb3NpdGlvbik7CisJCQkJCWludCBsaW5lID0gbGluZUluZm9ybWF0aW9uLmdldExpbmVPZk9mZnNldChvcmlnaW5hbE9mZnNldCk7CisJCQkJCQorCQkJCQlpZiAocHJldkxpbmUgPT0gbGluZSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQlpbnQgdG90YWwgPSB0aGlzLmxpc3QubGVuZ3RoOworCQkJd2hpbGUgKG5vZGVJbmRleCA8IHRvdGFsICYmIHRoaXMubGlzdFtub2RlSW5kZXhdLmdldENoYW5nZUtpbmQoKSA9PSBSZXdyaXRlRXZlbnQuUkVNT1ZFRCkgeworCQkJCW5vZGVJbmRleCsrOworCQkJfQorCQkJCisJCQlpbnQgb3JpZ2luYWxJbmRlbnQgPSBnZXRJbmRlbnQob3JpZ2luYWxPZmZzZXQpOworCQkJaW50IG5ld0luZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZUluZGV4KTsKKwkJCQorCQkJaWYgKG9yaWdpbmFsSW5kZW50ICE9IG5ld0luZGVudCkgeworCQkJCQorCQkJCWludCBsaW5lPSBnZXRMaW5lSW5mb3JtYXRpb24oKS5nZXRMaW5lT2ZPZmZzZXQob3JpZ2luYWxPZmZzZXQpOworCQkJCWlmIChsaW5lID49IDApIHsKKwkJCQkJaW50IGxpbmVTdGFydD0gZ2V0TGluZUluZm9ybWF0aW9uKCkuZ2V0TGluZU9mZnNldChsaW5lKTsKKwkJCQkJCisJCQkJCWRvVGV4dFJlbW92ZShsaW5lU3RhcnQsIG9yaWdpbmFsT2Zmc2V0IC0gbGluZVN0YXJ0LCBlZGl0R3JvdXApOyAvLyByZW1vdmUgcHJldmlvdXMgaW5kZW50YXRpb24KKwkJCQkJZG9UZXh0SW5zZXJ0KGxpbmVTdGFydCwgY3JlYXRlSW5kZW50U3RyaW5nKG5ld0luZGVudCksIGVkaXRHcm91cCk7IC8vIGFkZCBuZXcgaW5kZW50YXRpb24KKwkJCQl9CisJCQl9CisJCX0KIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCkBAIC0yNjM2LDI3ICszMDA3LDMwIEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCWludCBwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgU3dpdGNoU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFkpOwotCQkKKwogCQlDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHk9IFN3aXRjaFN0YXRlbWVudC5TVEFURU1FTlRTX1BST1BFUlRZOwogCQlpZiAoZ2V0Q2hhbmdlS2luZChub2RlLCBwcm9wZXJ0eSkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewogCQkJdHJ5IHsKLQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRSwgcG9zKTsKLQkJCQlpbnQgaW5zZXJ0SW5kZW50PSBnZXRJbmRlbnQobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpICsgMTsKKwkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UsIHBvcyk7CisJCQkJaW50IGluc2VydEluZGVudD0gZ2V0SW5kZW50KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKKwkJCQlpZiAoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHModGhpcy5vcHRpb25zLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5ERU5UX1NXSVRDSFNUQVRFTUVOVFNfQ09NUEFSRV9UT19TV0lUQ0gpKSkgeworCQkJCQlpbnNlcnRJbmRlbnQrKzsKKwkJCQl9CiAJCQkJCiAJCQkJUGFyYWdyYXBoTGlzdFJld3JpdGVyIGxpc3RSZXdyaXRlcj0gbmV3IFN3aXRjaExpc3RSZXdyaXRlcihpbnNlcnRJbmRlbnQpOwogCQkJCVN0cmluZ0J1ZmZlciBsZWFkU3RyaW5nPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQkJbGVhZFN0cmluZy5hcHBlbmQoZ2V0TGluZURlbGltaXRlcigpKTsKIAkJCQlsZWFkU3RyaW5nLmFwcGVuZChjcmVhdGVJbmRlbnRTdHJpbmcoaW5zZXJ0SW5kZW50KSk7Ci0JCQkJbGlzdFJld3JpdGVyLnJld3JpdGVMaXN0KG5vZGUsIHByb3BlcnR5LCBwb3MsIGxlYWRTdHJpbmcudG9TdHJpbmcoKSk7CQkJCQorCQkJCWxpc3RSZXdyaXRlci5yZXdyaXRlTGlzdChub2RlLCBwcm9wZXJ0eSwgcG9zLCBsZWFkU3RyaW5nLnRvU3RyaW5nKCkpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQogCQl9IGVsc2UgewogCQkJdm9pZFZpc2l0KG5vZGUsIFN3aXRjaFN0YXRlbWVudC5TVEFURU1FTlRTX1BST1BFUlRZKTsKIAkJfQotCQlyZXR1cm4gZmFsc2U7CQkKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTI2NjYsNyArMzA0MCw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgU3luY2hyb25pemVkU3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFkpOwogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFN5bmNocm9uaXplZFN0YXRlbWVudC5CT0RZX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMjY3OSwyMSArMzA1MywyOSBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlyZXdyaXRlT3B0aW9uYWxRdWFsaWZpZXIobm9kZSwgVGhpc0V4cHJlc3Npb24uUVVBTElGSUVSX1BST1BFUlRZLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7Ci0JCXJldHVybiBmYWxzZTsJCQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQoVGhyb3dTdGF0ZW1lbnQpCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewotCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKKwkJdHJ5IHsKKwkJCXRoaXMuYmVmb3JlUmVxdWlyZWRTcGFjZUluZGV4ID0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRocm93LCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSk7CisJCQkKKwkJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CisJCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKKwkJCX0KKwkJCQorCQkJZW5zdXJlU3BhY2VCZWZvcmVSZXBsYWNlKG5vZGUpOworCisJCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFRocm93U3RhdGVtZW50LkVYUFJFU1NJT05fUFJPUEVSVFkpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJfQotCQkKLQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBUaHJvd1N0YXRlbWVudC5FWFBSRVNTSU9OX1BST1BFUlRZKTsJCQotCQlyZXR1cm4gZmFsc2U7CQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQpAQCAtMjcwMyw4ICszMDg1LDE5IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQotCQlpbnQgcG9zPSByZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFRyeVN0YXRlbWVudC5CT0RZX1BST1BFUlRZKTsKKwkJaW50IHBvcz0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzQpIHsKKwkJCWlmIChpc0NoYW5nZWQobm9kZSwgVHJ5U3RhdGVtZW50LlJFU09VUkNFU19QUk9QRVJUWSkpIHsKKwkJCQlpbnQgaW5kZW50PSBnZXRJbmRlbnQobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOworCQkJCVN0cmluZyBwcmVmaXg9IHRoaXMuZm9ybWF0dGVyLlRSWV9SRVNPVVJDRVMuZ2V0UHJlZml4KGluZGVudCk7CisJCQkJU3RyaW5nIG5ld1BhcmVuID0gdGhpcy5mb3JtYXR0ZXIuVFJZX1JFU09VUkNFU19QQVJFTi5nZXRQcmVmaXgoaW5kZW50KSArICIoIjsgLy8kTk9OLU5MUy0xJAorCQkJCXBvcz0gcmV3cml0ZU5vZGVMaXN0KG5vZGUsIFRyeVN0YXRlbWVudC5SRVNPVVJDRVNfUFJPUEVSVFksIGdldFBvc0FmdGVyVHJ5KHBvcyksIG5ld1BhcmVuLCAiKSIsICI7IiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfSBlbHNlIHsKKwkJCQlwb3M9IGRvVmlzaXQobm9kZSwgVHJ5U3RhdGVtZW50LlJFU09VUkNFU19QUk9QRVJUWSwgcG9zKTsKKwkJCX0KKwkJfQorCisJCXBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBUcnlTdGF0ZW1lbnQuQk9EWV9QUk9QRVJUWSk7CiAJCQogCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIFRyeVN0YXRlbWVudC5DQVRDSF9DTEFVU0VTX1BST1BFUlRZKSkgewogCQkJaW50IGluZGVudD0gZ2V0SW5kZW50KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsKQEAgLTI3MjcsOSArMzEyMCw5IEBACiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9CiAJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMl9JTlRFUk5BTCkgewotCQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuVFlQRV9ERUNMQVJBVElPTl9QUk9QRVJUWSk7CQorCQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuVFlQRV9ERUNMQVJBVElPTl9QUk9QRVJUWSk7CiAJCX0gZWxzZSB7Ci0JCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5ERUNMQVJBVElPTl9QUk9QRVJUWSk7CQorCQkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuREVDTEFSQVRJT05fUFJPUEVSVFkpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yNzQxLDE5ICszMTM0LDM1IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCXJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgVHlwZUxpdGVyYWwuVFlQRV9QUk9QRVJUWSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChVbmlvblR5cGUpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVW5pb25UeXBlIG5vZGUpIHsKKwkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKKwkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CisJCX0KKwkJaW50IHBvcz0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWlmIChpc0NoYW5nZWQobm9kZSwgVW5pb25UeXBlLlRZUEVTX1BST1BFUlRZKSkgeworCQkJcG9zPSByZXdyaXRlTm9kZUxpc3Qobm9kZSwgVW5pb25UeXBlLlRZUEVTX1BST1BFUlRZLCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCAiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXBvcz0gZG9WaXNpdChub2RlLCBVbmlvblR5cGUuVFlQRVNfUFJPUEVSVFksIHBvcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCS8vIHNhbWUgY29kZSBhcyBGaWVsZERlY2xhcmF0aW9uCiAJCWludCBwb3M9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQlpZiAobm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEpMUzJfSU5URVJOQUwpIHsKQEAgLTI3NjIsNyArMzE3MSw3IEBACiAJCQlyZXdyaXRlTW9kaWZpZXJzMihub2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5NT0RJRklFUlMyX1BST1BFUlRZLCBwb3MpOwogCQl9CiAJCXBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5UWVBFX1BST1BFUlRZKTsKLQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLkZSQUdNRU5UU19QUk9QRVJUWSwgcG9zLCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uRlJBR01FTlRTX1BST1BFUlRZLCBwb3MsIFV0aWwuRU1QVFlfU1RSSU5HLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMjc3MywxNiArMzE4MiwxNiBAQAogCQlpZiAoIWhhc0NoaWxkcmVuQ2hhbmdlcyhub2RlKSkgewogCQkJcmV0dXJuIGRvVmlzaXRVbmNoYW5nZWRDaGlsZHJlbihub2RlKTsKIAkJfQotCQkKKwogCQlpbnQgcG9zPSByZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5OQU1FX1BST1BFUlRZKTsKLQkKKwogCQlpbnQgZXh0cmFEaW1zPSByZXdyaXRlRXh0cmFEaW1lbnNpb25zKG5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5FWFRSQV9ESU1FTlNJT05TX1BST1BFUlRZLCBwb3MpOwotCQkKKwogCQlpZiAoZXh0cmFEaW1zID4gMCkgewogCQkJaW50IGtpbmQ9IGdldENoYW5nZUtpbmQobm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LklOSVRJQUxJWkVSX1BST1BFUlRZKTsKIAkJCWlmIChraW5kID09IFJld3JpdGVFdmVudC5SRU1PVkVEKSB7CiAJCQkJdHJ5IHsKLQkJCQkJcG9zPSBnZXRTY2FubmVyKCkuZ2V0UHJldmlvdXNUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVRVUFMLCBwb3MpOworCQkJCQlwb3M9IGdldFNjYW5uZXIoKS5nZXRQcmV2aW91c1Rva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVRVUFMLCBwb3MpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQkJfQpAQCAtMjgwMSw3ICszMjEwLDcgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJLy8gc2FtZSBjb2RlIGFzIEZpZWxkRGVjbGFyYXRpb24KIAkJaW50IHBvcz0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gSkxTMl9JTlRFUk5BTCkgewpAQCAtMjgxMCw4ICszMjE5LDggQEAKIAkJCXJld3JpdGVNb2RpZmllcnMyKG5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuTU9ESUZJRVJTMl9QUk9QRVJUWSwgcG9zKTsKIAkJfQogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5UWVBFX1BST1BFUlRZKTsKLQkJCi0JCXJld3JpdGVOb2RlTGlzdChub2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LkZSQUdNRU5UU19QUk9QRVJUWSwgcG9zLCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCXJld3JpdGVOb2RlTGlzdChub2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LkZSQUdNRU5UU19QUk9QRVJUWSwgcG9zLCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTI4MjIsMTIgKzMyMzEsMTIgQEAKIAkJaWYgKCFoYXNDaGlsZHJlbkNoYW5nZXMobm9kZSkpIHsKIAkJCXJldHVybiBkb1Zpc2l0VW5jaGFuZ2VkQ2hpbGRyZW4obm9kZSk7CiAJCX0KLQkJCisKIAkJaW50IHBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBXaGlsZVN0YXRlbWVudC5FWFBSRVNTSU9OX1BST1BFUlRZKTsKLQkJCisKIAkJdHJ5IHsKIAkJCWlmIChpc0NoYW5nZWQobm9kZSwgV2hpbGVTdGF0ZW1lbnQuQk9EWV9QUk9QRVJUWSkpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJQQVJFTiwgcG9zKTsKKwkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHBvcyk7CiAJCQkJcmV3cml0ZUJvZHlOb2RlKG5vZGUsIFdoaWxlU3RhdGVtZW50LkJPRFlfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAtMSwgZ2V0SW5kZW50KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKSwgdGhpcy5mb3JtYXR0ZXIuV0hJTEVfQkxPQ0spOyAvLyBib2R5CiAJCQl9IGVsc2UgewogCQkJCXZvaWRWaXNpdChub2RlLCBXaGlsZVN0YXRlbWVudC5CT0RZX1BST1BFUlRZKTsKQEAgLTI4MzcsNyArMzI0Niw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJSZWYpCiAJICovCkBAIC0yODUwLDcgKzMyNTksNyBAQAogCQlyZXdyaXRlUmVxdWlyZWROb2RlKG5vZGUsIE1lbWJlclJlZi5OQU1FX1BST1BFUlRZKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RSZWYpCiAJICovCkBAIC0yODY1LDggKzMyNzQsOCBAQAogCQlpZiAoaXNDaGFuZ2VkKG5vZGUsIE1ldGhvZFJlZi5QQVJBTUVURVJTX1BST1BFUlRZKSkgewogCQkJLy8gZXZhbCBwb3NpdGlvbiBhZnRlciBvcGVuaW5nIHBhcmVudAogCQkJdHJ5IHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxQQVJFTiwgcG9zKTsKLQkJCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgTWV0aG9kUmVmLlBBUkFNRVRFUlNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgcG9zKTsKKwkJCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgTWV0aG9kUmVmLlBBUkFNRVRFUlNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCBVdGlsLkVNUFRZX1NUUklORywgIiwgIik7IC8vJE5PTi1OTFMtMSQgCiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQl9CkBAIC0yODc1LDcgKzMyODQsNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kUmVmUGFyYW1ldGVyKQogCSAqLwpAQCAtMjkwMSw3ICszMzEwLDcgQEAKIAkJcmV3cml0ZU5vZGUobm9kZSwgTWV0aG9kUmVmUGFyYW1ldGVyLk5BTUVfUFJPUEVSVFksIHBvcywgQVNUUmV3cml0ZUZvcm1hdHRlci5TUEFDRSk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudCkKIAkgKi8KQEAgLTI5MDksNyArMzMxOCw3IEBACiAJCWlmICghaGFzQ2hpbGRyZW5DaGFuZ2VzKG5vZGUpKSB7CiAJCQlyZXR1cm4gZG9WaXNpdFVuY2hhbmdlZENoaWxkcmVuKG5vZGUpOwogCQl9Ci0JCQorCiAJCWludCBjaGFuZ2VLaW5kPSBnZXRDaGFuZ2VLaW5kKG5vZGUsIFRhZ0VsZW1lbnQuVEFHX05BTUVfUFJPUEVSVFkpOwogCQlzd2l0Y2ggKGNoYW5nZUtpbmQpIHsKIAkJCWNhc2UgUmV3cml0ZUV2ZW50LklOU0VSVEVEOiB7CkBAIC0yOTI3LDcgKzMzMzYsNyBAQAogCQkJICAgIGJyZWFrOwogCQkJfQogCQl9Ci0JCQkJCisKIAkJaWYgKGlzQ2hhbmdlZChub2RlLCBUYWdFbGVtZW50LkZSQUdNRU5UU19QUk9QRVJUWSkpIHsKIAkJCS8vIGV2YWwgcG9zaXRpb24gYWZ0ZXIgbmFtZQogCQkJaW50IGVuZE9mZnNldD0gZmluZFRhZ05hbWVFbmQobm9kZSk7CkBAIC0yOTM3LDcgKzMzNDYsNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCQorCiAJcHJpdmF0ZSBpbnQgZmluZFRhZ05hbWVFbmQoVGFnRWxlbWVudCB0YWdOb2RlKSB7CiAJCWlmICh0YWdOb2RlLmdldFRhZ05hbWUoKSAhPSBudWxsKSB7CiAJCQljaGFyW10gY29udD0gZ2V0Q29udGVudCgpOwpAQCAtMjk1MCw4ICszMzU5LDggQEAKIAkJfQogCSAgICByZXR1cm4gdGFnTm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJfQotCQkKLQkKKworCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRleHRFbGVtZW50KQogCSAqLwpAQCAtMjk3NiwxMyArMzM4NSwxMyBAQAogCQlpbnQgcG9zPSByZXdyaXRlSmF2YWRvYyhub2RlLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLkpBVkFET0NfUFJPUEVSVFkpOwogCQlyZXdyaXRlTW9kaWZpZXJzMihub2RlLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFksIHBvcyk7CiAJCXBvcz0gcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLk5BTUVfUFJPUEVSVFkpOwotCQkKKwogCQlpbnQgc3RhcnRJbmRlbnQ9IGdldEluZGVudChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSkgKyAxOwogCQlpbnQgc3RhcnRQb3M9IGdldFBvc0FmdGVyTGVmdEJyYWNlKHBvcyk7CiAJCXJld3JpdGVQYXJhZ3JhcGhMaXN0KG5vZGUsIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uQk9EWV9ERUNMQVJBVElPTlNfUFJPUEVSVFksIHN0YXJ0UG9zLCBzdGFydEluZGVudCwgLTEsIDIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24pCiAJICovCkBAIC0yOTk0LDExICszNDAzLDExIEBACiAJCXJld3JpdGVNb2RpZmllcnMyKG5vZGUsIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSwgcG9zKTsKIAkJcmV3cml0ZVJlcXVpcmVkTm9kZShub2RlLCBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLlRZUEVfUFJPUEVSVFkpOwogCQlwb3M9IHJld3JpdGVSZXF1aXJlZE5vZGUobm9kZSwgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5OQU1FX1BST1BFUlRZKTsKLQkJCisKIAkJdHJ5IHsKIAkJCWludCBjaGFuZ2VLaW5kPSBnZXRDaGFuZ2VLaW5kKG5vZGUsIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uREVGQVVMVF9QUk9QRVJUWSk7CiAJCQlpZiAoY2hhbmdlS2luZCA9PSBSZXdyaXRlRXZlbnQuSU5TRVJURUQgfHwgY2hhbmdlS2luZCA9PSBSZXdyaXRlRXZlbnQuUkVNT1ZFRCkgewotCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUlBBUkVOLCBwb3MpOworCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgcG9zKTsKIAkJCX0KIAkJCXJld3JpdGVOb2RlKG5vZGUsIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uREVGQVVMVF9QUk9QRVJUWSwgcG9zLCB0aGlzLmZvcm1hdHRlci5BTk5PVF9NRU1CRVJfREVGQVVMVCk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtMzAwNiw3ICszNDE1LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVuaGFuY2VkRm9yU3RhdGVtZW50KQogCSAqLwpAQCAtMzAyMSw3ICszNDMwLDcgQEAKIAkJaWYgKGJvZHlFdmVudCAhPSBudWxsICYmIGJvZHlFdmVudC5nZXRDaGFuZ2VLaW5kKCkgPT0gUmV3cml0ZUV2ZW50LlJFUExBQ0VEKSB7CiAJCQlpbnQgc3RhcnRPZmZzZXQ7CiAJCQl0cnkgewotCQkJCXN0YXJ0T2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSUEFSRU4sIHBvcyk7CisJCQkJc3RhcnRPZmZzZXQ9IGdldFNjYW5uZXIoKS5nZXRUb2tlbkVuZE9mZnNldChUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHBvcyk7CiAJCQkJcmV3cml0ZUJvZHlOb2RlKG5vZGUsIEVuaGFuY2VkRm9yU3RhdGVtZW50LkJPRFlfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAtMSwgZ2V0SW5kZW50KG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKSwgdGhpcy5mb3JtYXR0ZXIuRk9SX0JMT0NLKTsgLy8gYm9keQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwpAQCAtMzAzMSw3ICszNDQwLDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1Db25zdGFudERlY2xhcmF0aW9uKQogCSAqLwpAQCAtMzA0NywxNiArMzQ1NiwxNiBAQAogCQkJUmV3cml0ZUV2ZW50W10gY2hpbGRyZW49IGFyZ3NFdmVudC5nZXRDaGlsZHJlbigpOwogCQkJdHJ5IHsKIAkJCQlpbnQgbmV4dFRvaz0gZ2V0U2Nhbm5lcigpLnJlYWROZXh0KHBvcywgdHJ1ZSk7Ci0JCQkJYm9vbGVhbiBoYXNQYXJlbnRzPSAobmV4dFRvayA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxQQVJFTik7CisJCQkJYm9vbGVhbiBoYXNQYXJlbnRzPSAobmV4dFRvayA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4pOwogCQkJCWJvb2xlYW4gaXNBbGxSZW1vdmVkPSBoYXNQYXJlbnRzICYmIGlzQWxsT2ZLaW5kKGNoaWxkcmVuLCBSZXdyaXRlRXZlbnQuUkVNT1ZFRCk7Ci0JCQkJU3RyaW5nIHByZWZpeD0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgcHJlZml4PSBVdGlsLkVNUFRZX1NUUklORzsgCiAJCQkJaWYgKCFoYXNQYXJlbnRzKSB7CiAJCQkJCXByZWZpeD0gIigiOyAvLyROT04tTkxTLTEkCiAJCQkJfSBlbHNlIGlmICghaXNBbGxSZW1vdmVkKSB7CiAJCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKTsKIAkJCQl9CiAJCQkJcG9zPSByZXdyaXRlTm9kZUxpc3Qobm9kZSwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24uQVJHVU1FTlRTX1BST1BFUlRZLCBwb3MsIHByZWZpeCwgIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKKwogCQkJCWlmICghaGFzUGFyZW50cykgewogCQkJCQlkb1RleHRJbnNlcnQocG9zLCAiKSIsIGdldEVkaXRHcm91cChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSkpOyAvLyROT04tTkxTLTEkCiAJCQkJfSBlbHNlIGlmIChpc0FsbFJlbW92ZWQpIHsKQEAgLTMwNzAsMTMgKzM0NzksMTMgQEAKIAkJfSBlbHNlIHsKIAkJCXBvcz0gZG9WaXNpdChub2RlLCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5BUkdVTUVOVFNfUFJPUEVSVFksIHBvcyk7CiAJCX0KLQkJCisKIAkJaWYgKGlzQ2hhbmdlZChub2RlLCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpKSB7CiAJCQlpbnQga2luZD0gZ2V0Q2hhbmdlS2luZChub2RlLCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpOwogCQkJaWYgKGtpbmQgPT0gUmV3cml0ZUV2ZW50LlJFTU9WRUQpIHsKIAkJCQl0cnkgewogCQkJCQkvLyAncG9zJyBjYW4gYmUgYmVmb3JlIGJyYWNlCi0JCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFByZXZpb3VzVG9rZW5FbmRPZmZzZXQoSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0UsIHBvcyk7CisJCQkJCXBvcz0gZ2V0U2Nhbm5lcigpLmdldFByZXZpb3VzVG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFLCBwb3MpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCQloYW5kbGVFeGNlcHRpb24oZSk7CiAJCQkJfQpAQCAtMzEwMCw4ICszNTA5LDggQEAKIAkJcG9zPSByZXdyaXRlTm9kZUxpc3Qobm9kZSwgRW51bURlY2xhcmF0aW9uLlNVUEVSX0lOVEVSRkFDRV9UWVBFU19QUk9QRVJUWSwgcG9zLCAiIGltcGxlbWVudHMgIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJCXBvcz0gZ2V0UG9zQWZ0ZXJMZWZ0QnJhY2UocG9zKTsKLQkJCi0JCVN0cmluZyBsZWFkU3RyaW5nPSAiIjsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBsZWFkU3RyaW5nPSBVdGlsLkVNUFRZX1NUUklORzsgCiAJCVJld3JpdGVFdmVudCBjb25zdEV2ZW50PSBnZXRFdmVudChub2RlLCBFbnVtRGVjbGFyYXRpb24uRU5VTV9DT05TVEFOVFNfUFJPUEVSVFkpOwogCiAJCWlmIChjb25zdEV2ZW50ICE9IG51bGwgJiYgY29uc3RFdmVudC5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewpAQCAtMzExNiw3ICszNTI1LDcgQEAKIAkJaW50IGluZGVudD0gMDsKIAkJaWYgKGJvZHlFdmVudCAhPSBudWxsICYmIGJvZHlFdmVudC5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewogCQkJYm9vbGVhbiBoYXNDb25zdGFudHM9ICEoKExpc3QpIGdldE5ld1ZhbHVlKG5vZGUsIEVudW1EZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UU19QUk9QRVJUWSkpLmlzRW1wdHkoKTsKLQkJCQorCiAJCQlSZXdyaXRlRXZlbnRbXSBjaGlsZHJlbj0gYm9keUV2ZW50LmdldENoaWxkcmVuKCk7CiAJCQl0cnkgewogCQkJCWlmIChoYXNDb25zdGFudHMpIHsKQEAgLTMxMjUsMTMgKzM1MzQsMjggQEAKIAkJCQkJaW5kZW50PSBnZXRJbmRlbnQobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpICsgMTsKIAkJCQl9CiAJCQkJaW50IHRva2VuPSBnZXRTY2FubmVyKCkucmVhZE5leHQocG9zLCB0cnVlKTsKLQkJCQlib29sZWFuIGhhc1NlbWljb2xvbj0gdG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVTRU1JQ09MT047CisJCQkJYm9vbGVhbiBoYXNTZW1pY29sb249IHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTjsKIAkJCQlpZiAoIWhhc1NlbWljb2xvbiAmJiBpc0FsbE9mS2luZChjaGlsZHJlbiwgUmV3cml0ZUV2ZW50LklOU0VSVEVEKSkgewogCQkJCQlpZiAoIWhhc0NvbnN0YW50cykgewogCQkJCQkJU3RyaW5nIHN0cj0gdGhpcy5mb3JtYXR0ZXIuRklSU1RfRU5VTV9DT05TVC5nZXRQcmVmaXgoaW5kZW50IC0gMSk7CiAJCQkJCQlkb1RleHRJbnNlcnQocG9zLCBzdHIsIGdldEVkaXRHcm91cChjaGlsZHJlblswXSkpOwogCQkJCQl9Ci0JCQkJCWRvVGV4dEluc2VydChwb3MsICI7IiwgZ2V0RWRpdEdyb3VwKGNoaWxkcmVuWzBdKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BKSB7CisJCQkJCQkvLyBhIGNvbW1hIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGVudW0gY29uc3RhbnQgYmVmb3JlIGEgcG90ZW50aWFsIHNlbWljb2xvbgorCQkJCQkJaW50IGVuZFBvcz0gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKTsKKwkJCQkJCWludCBuZXh0VG9rZW49IGdldFNjYW5uZXIoKS5yZWFkTmV4dChlbmRQb3MsIHRydWUpOworCQkJCQkJaWYgKG5leHRUb2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04pIHsKKwkJCQkJCQlkb1RleHRJbnNlcnQoZW5kUG9zLCAiOyIsIGdldEVkaXRHcm91cChjaGlsZHJlblswXSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVuZFBvcz0gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKTsKKwkJCQkJCQlpZiAoaXNBbGxPZktpbmQoY2hpbGRyZW4sIFJld3JpdGVFdmVudC5SRU1PVkVEKSkgeworCQkJCQkJCQlkb1RleHRSZW1vdmUocG9zLCBlbmRQb3MgLSBwb3MsIGdldEVkaXRHcm91cChjaGlsZHJlblswXSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXBvcz0gZW5kUG9zOworCQkJCQl9IGVsc2UgeworCQkJCQkJZG9UZXh0SW5zZXJ0KHBvcywgIjsiLCBnZXRFZGl0R3JvdXAoY2hpbGRyZW5bMF0pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CiAJCQkJfSBlbHNlIGlmIChoYXNTZW1pY29sb24pIHsKIAkJCQkJaW50IGVuZFBvcz0gZ2V0U2Nhbm5lcigpLmdldEN1cnJlbnRFbmRPZmZzZXQoKTsKIAkJCQkJaWYgKGlzQWxsT2ZLaW5kKGNoaWxkcmVuLCBSZXdyaXRlRXZlbnQuUkVNT1ZFRCkpIHsKQEAgLTMxOTEsOCArMzYxNSw4IEBACiAJCWlmIChpc0NoYW5nZWQobm9kZSwgTm9ybWFsQW5ub3RhdGlvbi5WQUxVRVNfUFJPUEVSVFkpKSB7CiAJCQkvLyBldmFsIHBvc2l0aW9uIGFmdGVyIG9wZW5pbmcgcGFyZW50CiAJCQl0cnkgewotCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOwotCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBOb3JtYWxBbm5vdGF0aW9uLlZBTFVFU19QUk9QRVJUWSwgc3RhcnRPZmZzZXQsICIiLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJaW50IHN0YXJ0T2Zmc2V0PSBnZXRTY2FubmVyKCkuZ2V0VG9rZW5FbmRPZmZzZXQoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCBwb3MpOworCQkJCXJld3JpdGVOb2RlTGlzdChub2RlLCBOb3JtYWxBbm5vdGF0aW9uLlZBTFVFU19QUk9QRVJUWSwgc3RhcnRPZmZzZXQsIFV0aWwuRU1QVFlfU1RSSU5HLCAiLCAiKTsgLy8kTk9OLU5MUy0xJCAKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKIAkJCX0KQEAgLTMyMTIsOCArMzYzNiw4IEBACiAJCWlmIChpc0NoYW5nZWQobm9kZSwgUGFyYW1ldGVyaXplZFR5cGUuVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFkpKSB7CiAJCQkvLyBldmFsIHBvc2l0aW9uIGFmdGVyIG9wZW5pbmcgcGFyZW50CiAJCQl0cnkgewotCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEVTUywgcG9zKTsKLQkJCQlyZXdyaXRlTm9kZUxpc3Qobm9kZSwgUGFyYW1ldGVyaXplZFR5cGUuVFlQRV9BUkdVTUVOVFNfUFJPUEVSVFksIHN0YXJ0T2Zmc2V0LCAiIiwgIiwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWludCBzdGFydE9mZnNldD0gZ2V0U2Nhbm5lcigpLmdldFRva2VuRW5kT2Zmc2V0KFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHBvcyk7CisJCQkJcmV3cml0ZU5vZGVMaXN0KG5vZGUsIFBhcmFtZXRlcml6ZWRUeXBlLlRZUEVfQVJHVU1FTlRTX1BST1BFUlRZLCBzdGFydE9mZnNldCwgVXRpbC5FTVBUWV9TVFJJTkcsICIsICIpOyAvLyROT04tTkxTLTEkIAogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwogCQkJfQpAQCAtMzI2OCwxNCArMzY5MiwxNCBAQAogCQl9CiAJCXRyeSB7CiAJCQlpbnQgcG9zPSBnZXRTY2FubmVyKCkuZ2V0TmV4dEVuZE9mZnNldChub2RlLmdldFN0YXJ0UG9zaXRpb24oKSwgdHJ1ZSk7IC8vIHBvcyBhZnRlciBxdWVzdGlvbiBtYXJrCi0JCQkKKwogCQkJUHJlZml4IHByZWZpeDsKIAkJCWlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGdldE5ld1ZhbHVlKG5vZGUsIFdpbGRjYXJkVHlwZS5VUFBFUl9CT1VORF9QUk9QRVJUWSkpKSB7CiAJCQkJcHJlZml4PSB0aGlzLmZvcm1hdHRlci5XSUxEQ0FSRF9FWFRFTkRTOwogCQkJfSBlbHNlIHsKIAkJCQlwcmVmaXg9IHRoaXMuZm9ybWF0dGVyLldJTERDQVJEX1NVUEVSOwogCQkJfQotCQkJCisKIAkJCWludCBib3VuZEtpbmRDaGFuZ2U9IGdldENoYW5nZUtpbmQobm9kZSwgV2lsZGNhcmRUeXBlLlVQUEVSX0JPVU5EX1BST1BFUlRZKTsKIAkJCWlmIChib3VuZEtpbmRDaGFuZ2UgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgewogCQkJCWludCBib3VuZFR5cGVDaGFuZ2U9IGdldENoYW5nZUtpbmQobm9kZSwgV2lsZGNhcmRUeXBlLkJPVU5EX1BST1BFUlRZKTsKQEAgLTMyOTEsNyArMzcxNSw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCWZpbmFsIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7CiAJCUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb2N1bWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgQVNUIik7IC8vJE5PTi1OTFMtMSQKIAkJcnVudGltZUV4Y2VwdGlvbi5pbml0Q2F1c2UoZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUZsYXR0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0FTVFJld3JpdGVGbGF0dGVuZXIuamF2YQppbmRleCBiMWQzNmZhLi40YmUxYjRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUZsYXR0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9BU1RSZXdyaXRlRmxhdHRlbmVyLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNiwxNCArMTYsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQVNUUmV3cml0ZUZsYXR0ZW5lciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgc3lub255bm0gZm9yIGRlcHJlY2F0ZWQgY29uc3RhbnQgQVNULkpTTDIKIAkgKiB0byBhbGxldmlhdGUgZGVwcmVjYXRpb24gd2FybmluZ3MuCiAJICogQGRlcHJlY2F0ZWQKIAkgKi8KIAkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEpMUzJfSU5URVJOQUwgPSBBU1QuSkxTMjsKLQkKKwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKEFTVE5vZGUgbm9kZSwgUmV3cml0ZUV2ZW50U3RvcmUgc3RvcmUpIHsKIAkJQVNUUmV3cml0ZUZsYXR0ZW5lciBmbGF0dGVuZXI9IG5ldyBBU1RSZXdyaXRlRmxhdHRlbmVyKHN0b3JlKTsKIAkJbm9kZS5hY2NlcHQoZmxhdHRlbmVyKTsKQEAgLTM3LDI3ICszNywyNyBAQAogCQl0aGlzLnN0b3JlPSBzdG9yZTsKIAkJdGhpcy5yZXN1bHQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgYWNjdW11bGF0ZWQgaW4gdGhlIHZpc2l0LgogCSAqCi0JICogQHJldHVybiB0aGUgc2VyaWFsaXplZCAKKwkgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7CiAJCS8vIGNvbnZlcnQgdG8gYSBzdHJpbmcsIGJ1dCBsb3NlIGFueSBleHRyYSBzcGFjZSBpbiB0aGUgc3RyaW5nIGJ1ZmZlciBieSBjb3B5aW5nCiAJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMucmVzdWx0LnRvU3RyaW5nKCkpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlc2V0cyB0aGlzIHByaW50ZXIgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2Fpbi4KIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKIAkJdGhpcy5yZXN1bHQuc2V0TGVuZ3RoKDApOwogCX0KLQkKKwogCS8qKgogCSAqIEFwcGVuZHMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1vZGlmaWVyIGZsYWdzLCBmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycwogCSAqIEBwYXJhbSBidWYgVGhlIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gdG8gd3JpdGUgdGhlIHJlc3VsdCB0by4KIAkgKi8KQEAgLTk2LDI3ICs5NiwyNyBAQAogCQkJYnVmLmFwcGVuZCgidHJhbnNpZW50ICIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCQorCiAJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHkpIHsKIAkJcmV0dXJuIChMaXN0KSBnZXRBdHRyaWJ1dGUocGFyZW50LCBjaGlsZFByb3BlcnR5KTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgQVNUTm9kZSBnZXRDaGlsZE5vZGUoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgY2hpbGRQcm9wZXJ0eSkgewogCQlyZXR1cm4gKEFTVE5vZGUpIGdldEF0dHJpYnV0ZShwYXJlbnQsIGNoaWxkUHJvcGVydHkpOwogCX0KLQkKKwogCXByb3RlY3RlZCBpbnQgZ2V0SW50QXR0cmlidXRlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHkpIHsKIAkJcmV0dXJuICgoSW50ZWdlcikgZ2V0QXR0cmlidXRlKHBhcmVudCwgY2hpbGRQcm9wZXJ0eSkpLmludFZhbHVlKCk7CiAJfQotCQorCiAJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Qm9vbGVhbkF0dHJpYnV0ZShBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZFByb3BlcnR5KSB7CiAJCXJldHVybiAoKEJvb2xlYW4pIGdldEF0dHJpYnV0ZShwYXJlbnQsIGNoaWxkUHJvcGVydHkpKS5ib29sZWFuVmFsdWUoKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgT2JqZWN0IGdldEF0dHJpYnV0ZShBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZFByb3BlcnR5KSB7CiAJCXJldHVybiB0aGlzLnN0b3JlLmdldE5ld1ZhbHVlKHBhcmVudCwgY2hpbGRQcm9wZXJ0eSk7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgdmlzaXRMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHksIFN0cmluZyBzZXBhcmF0b3IpIHsKIAkJTGlzdCBsaXN0PSBnZXRDaGlsZExpc3QocGFyZW50LCBjaGlsZFByb3BlcnR5KTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKQEAgLTEyNiw3ICsxMjYsNyBAQAogCQkJKChBU1ROb2RlKSBsaXN0LmdldChpKSkuYWNjZXB0KHRoaXMpOwogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgdmlzaXRMaXN0KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHksIFN0cmluZyBzZXBhcmF0b3IsIFN0cmluZyBsZWFkLCBTdHJpbmcgcG9zdCkgewogCQlMaXN0IGxpc3Q9IGdldENoaWxkTGlzdChwYXJlbnQsIGNoaWxkUHJvcGVydHkpOwogCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7CkBAIC0xNDAsOCArMTQwLDggQEAKIAkJCXRoaXMucmVzdWx0LmFwcGVuZChwb3N0KTsKIAkJfQogCX0KLQkKLQkKKworCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikKIAkgKi8KQEAgLTE2OSw3ICsxNjksNyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewogCQl0aGlzLnJlc3VsdC5hcHBlbmQoIm5ldyAiKTsgLy8kTk9OLU5MUy0xJAogCQlBcnJheVR5cGUgYXJyYXlUeXBlPSAoQXJyYXlUeXBlKSBnZXRDaGlsZE5vZGUobm9kZSwgQXJyYXlDcmVhdGlvbi5UWVBFX1BST1BFUlRZKTsKLQkJCisKIAkJLy8gZ2V0IHRoZSBlbGVtZW50IHR5cGUgYW5kIGNvdW50IGRpbWVuc2lvbnMKIAkJVHlwZSBlbGVtZW50VHlwZT0gKFR5cGUpIGdldENoaWxkTm9kZShhcnJheVR5cGUsIEFycmF5VHlwZS5DT01QT05FTlRfVFlQRV9QUk9QRVJUWSk7CiAJCWludCBkaW1lbnNpb25zPSAxOyAvLyBhbHdheXMgaW5jbHVkZSB0aGlzIGFycmF5IHR5cGUKQEAgLTE3Nyw5ICsxNzcsOSBAQAogCQkJZGltZW5zaW9ucysrOwogCQkJZWxlbWVudFR5cGUgPSAoVHlwZSkgZ2V0Q2hpbGROb2RlKGVsZW1lbnRUeXBlLCBBcnJheVR5cGUuQ09NUE9ORU5UX1RZUEVfUFJPUEVSVFkpOwogCQl9Ci0JCQorCiAJCWVsZW1lbnRUeXBlLmFjY2VwdCh0aGlzKTsKLQkJCisKIAkJTGlzdCBsaXN0PSBnZXRDaGlsZExpc3Qobm9kZSwgQXJyYXlDcmVhdGlvbi5ESU1FTlNJT05TX1BST1BFUlRZKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKIAkJCXRoaXMucmVzdWx0LmFwcGVuZCgnWycpOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCQl0aGlzLnJlc3VsdC5hcHBlbmQoJ10nKTsKIAkJCWRpbWVuc2lvbnMtLTsKIAkJfQotCQkKKwogCQkvLyBhZGQgZW1wdHkgIltdIiBmb3IgZWFjaCBleHRyYSBhcnJheSBkaW1lbnNpb24KIAkJZm9yIChpbnQgaT0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewogCQkJdGhpcy5yZXN1bHQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCkBAIC0xOTgsNyArMTk4LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQXJyYXlJbml0aWFsaXplcikKIAkgKi8KQEAgLTIyNCw3ICsyMjQsNyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAJCXRoaXMucmVzdWx0LmFwcGVuZCgiYXNzZXJ0ICIpOyAvLyROT04tTkxTLTEkCiAJCWdldENoaWxkTm9kZShub2RlLCBBc3NlcnRTdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSkuYWNjZXB0KHRoaXMpOwotCQkKKwogCQlBU1ROb2RlIG1lc3NhZ2U9IGdldENoaWxkTm9kZShub2RlLCBBc3NlcnRTdGF0ZW1lbnQuTUVTU0FHRV9QUk9QRVJUWSk7CiAJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKIAkJCXRoaXMucmVzdWx0LmFwcGVuZCgnOicpOwpAQCAtNTExLDExICs1MTEsMTEgQEAKIAkJZ2V0Q2hpbGROb2RlKG5vZGUsIEluZml4RXhwcmVzc2lvbi5MRUZUX09QRVJBTkRfUFJPUEVSVFkpLmFjY2VwdCh0aGlzKTsKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKCcgJyk7CiAJCVN0cmluZyBvcGVyYXRvcj0gZ2V0QXR0cmlidXRlKG5vZGUsIEluZml4RXhwcmVzc2lvbi5PUEVSQVRPUl9QUk9QRVJUWSkudG9TdHJpbmcoKTsKLQkJCisKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKG9wZXJhdG9yKTsKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKCcgJyk7CiAJCWdldENoaWxkTm9kZShub2RlLCBJbmZpeEV4cHJlc3Npb24uUklHSFRfT1BFUkFORF9QUk9QRVJUWSkuYWNjZXB0KHRoaXMpOwotCQkKKwogCQlMaXN0IGxpc3Q9IGdldENoaWxkTGlzdChub2RlLCBJbmZpeEV4cHJlc3Npb24uRVhURU5ERURfT1BFUkFORFNfUFJPUEVSVFkpOwogCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewogCQkJdGhpcy5yZXN1bHQuYXBwZW5kKG9wZXJhdG9yKTsKQEAgLTU4OSw3ICs1ODksNyBAQAogCQkJdmlzaXRMaXN0KG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFksIFN0cmluZy52YWx1ZU9mKCcgJyksIFV0aWwuRU1QVFlfU1RSSU5HLCBTdHJpbmcudmFsdWVPZignICcpKTsKIAkJCXZpc2l0TGlzdChub2RlLCBNZXRob2REZWNsYXJhdGlvbi5UWVBFX1BBUkFNRVRFUlNfUFJPUEVSVFksIFN0cmluZy52YWx1ZU9mKCcsJyksIFN0cmluZy52YWx1ZU9mKCc8JyksIFN0cmluZy52YWx1ZU9mKCc+JykpOwogCQl9Ci0JCQkJCisKIAkJaWYgKCFnZXRCb29sZWFuQXR0cmlidXRlKG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLkNPTlNUUlVDVE9SX1BST1BFUlRZKSkgewogCQkJaWYgKG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBKTFMyX0lOVEVSTkFMKSB7CiAJCQkJZ2V0Q2hpbGROb2RlKG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLlJFVFVSTl9UWVBFX1BST1BFUlRZKS5hY2NlcHQodGhpcyk7CkBAIC02MTEsNyArNjExLDcgQEAKIAkJaW50IGV4dHJhRGltcz0gZ2V0SW50QXR0cmlidXRlKG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLkVYVFJBX0RJTUVOU0lPTlNfUFJPUEVSVFkpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhRGltczsgaSsrKSB7CiAJCQl0aGlzLnJlc3VsdC5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCisJCX0KIAkJdmlzaXRMaXN0KG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uLlRIUk9XTl9FWENFUFRJT05TX1BST1BFUlRZLCBTdHJpbmcudmFsdWVPZignLCcpLCAiIHRocm93cyAiLCBVdGlsLkVNUFRZX1NUUklORyk7IC8vJE5PTi1OTFMtMSQKIAkJQVNUTm9kZSBib2R5PSBnZXRDaGlsZE5vZGUobm9kZSwgTWV0aG9kRGVjbGFyYXRpb24uQk9EWV9QUk9QRVJUWSk7CiAJCWlmIChib2R5ID09IG51bGwpIHsKQEAgLTc3MCw3ICs3NzAsNyBAQAogCQlpbnQgZXh0cmFEaW1lbnNpb25zPSBnZXRJbnRBdHRyaWJ1dGUobm9kZSwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5FWFRSQV9ESU1FTlNJT05TX1BST1BFUlRZKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYURpbWVuc2lvbnM7IGkrKykgewogCQkJdGhpcy5yZXN1bHQuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQkKKwkJfQogCQlBU1ROb2RlIGluaXRpYWxpemVyPSBnZXRDaGlsZE5vZGUobm9kZSwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUl9QUk9QRVJUWSk7CiAJCWlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAJCQl0aGlzLnJlc3VsdC5hcHBlbmQoJz0nKTsKQEAgLTkwNiw2ICs5MDYsOSBAQAogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7CiAJCXRoaXMucmVzdWx0LmFwcGVuZCgidHJ5ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPj0gQVNULkpMUzQpIHsKKwkJCXZpc2l0TGlzdChub2RlLCBUcnlTdGF0ZW1lbnQuUkVTT1VSQ0VTX1BST1BFUlRZLCBTdHJpbmcudmFsdWVPZignOycpLCBTdHJpbmcudmFsdWVPZignKCcpLCBTdHJpbmcudmFsdWVPZignKScpKTsKKwkJfQogCQlnZXRDaGlsZE5vZGUobm9kZSwgVHJ5U3RhdGVtZW50LkJPRFlfUFJPUEVSVFkpLmFjY2VwdCh0aGlzKTsKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKCcgJyk7CiAJCXZpc2l0TGlzdChub2RlLCBUcnlTdGF0ZW1lbnQuQ0FUQ0hfQ0xBVVNFU19QUk9QRVJUWSwgbnVsbCk7CkBAIC05MjIsNyArOTI1LDcgQEAKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewogCQlpbnQgYXBpTGV2ZWw9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKTsKLQkJCisKIAkJQVNUTm9kZSBqYXZhZG9jPSBnZXRDaGlsZE5vZGUobm9kZSwgVHlwZURlY2xhcmF0aW9uLkpBVkFET0NfUFJPUEVSVFkpOwogCQlpZiAoamF2YWRvYyAhPSBudWxsKSB7CiAJCQlqYXZhZG9jLmFjY2VwdCh0aGlzKTsKQEAgLTkzMyw3ICs5MzYsNyBAQAogCQl9IGVsc2UgewogCQkJdmlzaXRMaXN0KG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZLCBTdHJpbmcudmFsdWVPZignICcpLCBVdGlsLkVNUFRZX1NUUklORywgU3RyaW5nLnZhbHVlT2YoJyAnKSk7CiAJCX0KLQkKKwogCQlib29sZWFuIGlzSW50ZXJmYWNlPSBnZXRCb29sZWFuQXR0cmlidXRlKG5vZGUsIFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfUFJPUEVSVFkpOwogCQl0aGlzLnJlc3VsdC5hcHBlbmQoaXNJbnRlcmZhY2UgPyAiaW50ZXJmYWNlICIgOiAiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlnZXRDaGlsZE5vZGUobm9kZSwgVHlwZURlY2xhcmF0aW9uLk5BTUVfUFJPUEVSVFkpLmFjY2VwdCh0aGlzKTsKQEAgLTk0Miw3ICs5NDUsNyBAQAogCQl9CiAKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQorCiAJCUNoaWxkUHJvcGVydHlEZXNjcmlwdG9yIHN1cGVyQ2xhc3NQcm9wZXJ0eT0gKGFwaUxldmVsID09IEpMUzJfSU5URVJOQUwpID8gVHlwZURlY2xhcmF0aW9uLlNVUEVSQ0xBU1NfUFJPUEVSVFkgOiBUeXBlRGVjbGFyYXRpb24uU1VQRVJDTEFTU19UWVBFX1BST1BFUlRZOwogCQlBU1ROb2RlIHN1cGVyY2xhc3M9IGdldENoaWxkTm9kZShub2RlLCBzdXBlckNsYXNzUHJvcGVydHkpOwogCQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CkBAIC05NTAsNyArOTUzLDcgQEAKIAkJCXN1cGVyY2xhc3MuYWNjZXB0KHRoaXMpOwogCQkJdGhpcy5yZXN1bHQuYXBwZW5kKCcgJyk7CiAJCX0KLQkJCisKIAkJQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIHN1cGVySW50ZXJmYWNlUHJvcGVydHk9IChhcGlMZXZlbCA9PSBKTFMyX0lOVEVSTkFMKSA/IFR5cGVEZWNsYXJhdGlvbi5TVVBFUl9JTlRFUkZBQ0VTX1BST1BFUlRZIDogVHlwZURlY2xhcmF0aW9uLlNVUEVSX0lOVEVSRkFDRV9UWVBFU19QUk9QRVJUWTsKIAkJU3RyaW5nIGxlYWQ9IGlzSW50ZXJmYWNlID8gImV4dGVuZHMgIiA6ICJpbXBsZW1lbnRzICI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQl2aXNpdExpc3Qobm9kZSwgc3VwZXJJbnRlcmZhY2VQcm9wZXJ0eSwgU3RyaW5nLnZhbHVlT2YoJywnKSwgbGVhZCwgVXRpbC5FTVBUWV9TVFJJTkcpOwpAQCAtOTgyLDYgKzk4NSwxNCBAQAogCX0KIAogCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFVuaW9uVHlwZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChVbmlvblR5cGUgbm9kZSkgeworCQl2aXNpdExpc3Qobm9kZSwgVW5pb25UeXBlLlRZUEVTX1BST1BFUlRZLCAiIHwgIiwgVXRpbC5FTVBUWV9TVFJJTkcsIFV0aWwuRU1QVFlfU1RSSU5HKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKQEAgLTEwMzksOCArMTA1MCw4IEBACiAJCWdldENoaWxkTm9kZShub2RlLCBXaGlsZVN0YXRlbWVudC5CT0RZX1BST1BFUlRZKS5hY2NlcHQodGhpcyk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCi0JCisKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQpCiAJICovCkBAIC0xMTQxLDExICsxMTUyLDExIEBACiAJCXRoaXMucmVzdWx0LmFwcGVuZCgiQGludGVyZmFjZSAiKTsvLyROT04tTkxTLTEkCiAJCWdldENoaWxkTm9kZShub2RlLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLk5BTUVfUFJPUEVSVFkpLmFjY2VwdCh0aGlzKTsKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKCd7Jyk7Ci0JCXZpc2l0TGlzdChub2RlLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLkJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZLCBVdGlsLkVNUFRZX1NUUklORyk7IAorCQl2aXNpdExpc3Qobm9kZSwgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5CT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSwgVXRpbC5FTVBUWV9TVFJJTkcpOwogCQl0aGlzLnJlc3VsdC5hcHBlbmQoJ30nKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24pCiAJICogQHNpbmNlIDMuMApAQCAtMTIzMiw3ICsxMjQzLDcgQEAKIAkJZ2V0Q2hpbGROb2RlKG5vZGUsIE1hcmtlckFubm90YXRpb24uVFlQRV9OQU1FX1BST1BFUlRZKS5hY2NlcHQodGhpcyk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChNZW1iZXJWYWx1ZVBhaXIpCiAJICogQHNpbmNlIDMuMApAQCAtMTI1MSw3ICsxMjYyLDcgQEAKIAkJdGhpcy5yZXN1bHQuYXBwZW5kKGdldEF0dHJpYnV0ZShub2RlLCBNb2RpZmllci5LRVlXT1JEX1BST1BFUlRZKS50b1N0cmluZygpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qCiAJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KE5vcm1hbEFubm90YXRpb24pCiAJICogQHNpbmNlIDMuMApAQCAtMTMwNyw3ICsxMzE4LDcgQEAKIAkJdmlzaXRMaXN0KG5vZGUsIFR5cGVQYXJhbWV0ZXIuVFlQRV9CT1VORFNfUFJPUEVSVFksICIgJiAiLCAiIGV4dGVuZHMgIiwgVXRpbC5FTVBUWV9TVFJJTkcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaWxkY2FyZFR5cGUpCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0FTVFJld3JpdGVGb3JtYXR0ZXIuamF2YQppbmRleCA0NWRhM2JjLi44ZTM5ZjdkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvQVNUUmV3cml0ZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9BU1RSZXdyaXRlRm9ybWF0dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTggKzEyLDIwIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuVG9vbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkluZGVudE1hbmlwdWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKQEAgLTQxLDcgKzQzLDcgQEAKIAlwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGVNYXJrZXIgZXh0ZW5kcyBQb3NpdGlvbiB7CiAJCXB1YmxpYyBPYmplY3QgZGF0YTsKIAl9Ci0JCQorCiAJcHJpdmF0ZSBjbGFzcyBFeHRlbmRlZEZsYXR0ZW5lciBleHRlbmRzIEFTVFJld3JpdGVGbGF0dGVuZXIgewogCiAJCXByaXZhdGUgQXJyYXlMaXN0IHBvc2l0aW9uczsKQEAgLTUwLDcgKzUyLDcgQEAKIAkJCXN1cGVyKHN0b3JlKTsKIAkJCXRoaXMucG9zaXRpb25zPSBuZXcgQXJyYXlMaXN0KCk7CiAJCX0KLQkJCisKIAkJLyogKG5vbi1KYXZhZG9jKQogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3ByZVZpc2l0KEFTVE5vZGUpCiAJCSAqLwpAQCAtNzgsNyArODAsNyBAQAogCQkJCWZpeHVwTGVuZ3RoKHRyYWNrRGF0YSwgdGhpcy5yZXN1bHQubGVuZ3RoKCkpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmRvbS5BU1RSZXdyaXRlRmxhdHRlbmVyI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9jaykKIAkJICovCkBAIC04OSw3ICs5MSw3IEBACiAJCQl9CiAJCQlyZXR1cm4gc3VwZXIudmlzaXQobm9kZSk7CiAJCX0KLQkKKwogCQlwcml2YXRlIE5vZGVNYXJrZXIgYWRkTWFya2VyKE9iamVjdCBhbm5vdGF0aW9uLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKIAkJCU5vZGVNYXJrZXIgbWFya2VyPSBuZXcgTm9kZU1hcmtlcigpOwogCQkJbWFya2VyLm9mZnNldD0gc3RhcnRPZmZzZXQ7CkBAIC05OCw3ICsxMDAsNyBAQAogCQkJdGhpcy5wb3NpdGlvbnMuYWRkKG1hcmtlcik7CiAJCQlyZXR1cm4gbWFya2VyOwogCQl9Ci0JCisKIAkJcHJpdmF0ZSB2b2lkIGZpeHVwTGVuZ3RoKE9iamVjdCBkYXRhLCBpbnQgZW5kT2Zmc2V0KSB7CiAJCQlmb3IgKGludCBpPSB0aGlzLnBvc2l0aW9ucy5zaXplKCktMTsgaSA+PSAwIDsgaS0tKSB7CiAJCQkJTm9kZU1hcmtlciBtYXJrZXI9IChOb2RlTWFya2VyKSB0aGlzLnBvc2l0aW9ucy5nZXQoaSk7CkBAIC0xMTMsNTUgKzExNSw1NCBAQAogCQkJcmV0dXJuIChOb2RlTWFya2VyW10pIHRoaXMucG9zaXRpb25zLnRvQXJyYXkobmV3IE5vZGVNYXJrZXJbdGhpcy5wb3NpdGlvbnMuc2l6ZSgpXSk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBsaW5lRGVsaW1pdGVyOwogCXByaXZhdGUgZmluYWwgaW50IHRhYldpZHRoOwogCXByaXZhdGUgZmluYWwgaW50IGluZGVudFdpZHRoOwotCQorCiAJcHJpdmF0ZSBmaW5hbCBOb2RlSW5mb1N0b3JlIHBsYWNlaG9sZGVyczsKIAlwcml2YXRlIGZpbmFsIFJld3JpdGVFdmVudFN0b3JlIGV2ZW50U3RvcmU7CiAKIAlwcml2YXRlIGZpbmFsIE1hcCBvcHRpb25zOwogCi0JCisKIAlwdWJsaWMgQVNUUmV3cml0ZUZvcm1hdHRlcihOb2RlSW5mb1N0b3JlIHBsYWNlaG9sZGVycywgUmV3cml0ZUV2ZW50U3RvcmUgZXZlbnRTdG9yZSwgTWFwIG9wdGlvbnMsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7CiAJCXRoaXMucGxhY2Vob2xkZXJzPSBwbGFjZWhvbGRlcnM7CiAJCXRoaXMuZXZlbnRTdG9yZT0gZXZlbnRTdG9yZTsKKwkKKwkJdGhpcy5vcHRpb25zPSBvcHRpb25zID09IG51bGwgPyBKYXZhQ29yZS5nZXRPcHRpb25zKCkgOiAoTWFwKSBuZXcgSGFzaE1hcChvcHRpb25zKTsKKwkJdGhpcy5vcHRpb25zLnB1dCgKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9SRVNPVVJDRVNfSU5fVFJZLAorCQkJCURlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLmNyZWF0ZUFsaWdubWVudFZhbHVlKHRydWUsIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLldSQVBfTkVYVF9QRVJfTElORSwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuSU5ERU5UX0RFRkFVTFQpKTsKIAotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCX0KLQkJLy9vcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfTElORV9TUExJVCwgU3RyaW5nLnZhbHVlT2YoOTk5OSkpOwotCi0JCXRoaXMub3B0aW9ucz0gb3B0aW9uczsKIAkJdGhpcy5saW5lRGVsaW1pdGVyPSBsaW5lRGVsaW1pdGVyOwotCQkKKwkKIAkJdGhpcy50YWJXaWR0aD0gSW5kZW50TWFuaXB1bGF0aW9uLmdldFRhYldpZHRoKG9wdGlvbnMpOwogCQl0aGlzLmluZGVudFdpZHRoPSBJbmRlbnRNYW5pcHVsYXRpb24uZ2V0SW5kZW50V2lkdGgob3B0aW9ucyk7CiAJfQotCQogCi0JCisKKwogCXB1YmxpYyBOb2RlSW5mb1N0b3JlIGdldFBsYWNlaG9sZGVycygpIHsKIAkJcmV0dXJuIHRoaXMucGxhY2Vob2xkZXJzOwogCX0KLQkKKwogCXB1YmxpYyBSZXdyaXRlRXZlbnRTdG9yZSBnZXRFdmVudFN0b3JlKCkgewogCQlyZXR1cm4gdGhpcy5ldmVudFN0b3JlOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7CiAJCXJldHVybiB0aGlzLnRhYldpZHRoOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgZ2V0SW5kZW50V2lkdGgoKSB7CiAJCXJldHVybiB0aGlzLmluZGVudFdpZHRoOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKIAkJcmV0dXJuIHRoaXMubGluZURlbGltaXRlcjsKIAl9Ci0JCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3RyaW5nIGFjY3VtdWxhdGVkIGluIHRoZSB2aXNpdCBmb3JtYXR0ZWQgdXNpbmcgdGhlIGRlZmF1bHQgZm9ybWF0dGVyLgogCSAqIFVwZGF0ZXMgdGhlIGV4aXN0aW5nIG5vZGUncyBwb3NpdGlvbnMuCkBAIC0xNzAsMTcgKzE3MSwxNyBAQAogCSAqIEBwYXJhbSBpbml0aWFsSW5kZW50YXRpb25MZXZlbCBUaGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbC4KIAkgKiBAcGFyYW0gcmVzdWx0aW5nTWFya2VycyBSZXN1bHRpbmcgdGhlIHVwZGF0ZWQgTm9kZU1hcmtlcnMuCiAJICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIGFuZCBmb3JtYXR0ZWQgY29kZS4KLQkgKi8JCisJICovCiAJcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRSZXN1bHQoQVNUTm9kZSBub2RlLCBpbnQgaW5pdGlhbEluZGVudGF0aW9uTGV2ZWwsIENvbGxlY3Rpb24gcmVzdWx0aW5nTWFya2VycykgewotCQkKKwogCQlFeHRlbmRlZEZsYXR0ZW5lciBmbGF0dGVuZXI9IG5ldyBFeHRlbmRlZEZsYXR0ZW5lcih0aGlzLmV2ZW50U3RvcmUpOwogCQlub2RlLmFjY2VwdChmbGF0dGVuZXIpOwogCiAJCU5vZGVNYXJrZXJbXSBtYXJrZXJzPSBmbGF0dGVuZXIuZ2V0TWFya2VycygpOwogCQlmb3IgKGludCBpPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewogCQkJcmVzdWx0aW5nTWFya2Vycy5hZGQobWFya2Vyc1tpXSk7IC8vIGFkZCB0byByZXN1bHQKLQkJfQkJCi0JCQorCQl9CisKIAkJU3RyaW5nIHVuZm9ybWF0dGVkPSBmbGF0dGVuZXIuZ2V0UmVzdWx0KCk7CiAJCVRleHRFZGl0IGVkaXQ9IGZvcm1hdE5vZGUobm9kZSwgdW5mb3JtYXR0ZWQsIGluaXRpYWxJbmRlbnRhdGlvbkxldmVsKTsKIAkJaWYgKGVkaXQgPT0gbnVsbCkgewpAQCAtMTk3LDIzICsxOTgsMjMgQEAKIAkJfQogCQlyZXR1cm4gZXZhbHVhdGVGb3JtYXR0ZXJFZGl0KHVuZm9ybWF0dGVkLCBlZGl0LCBtYXJrZXJzKTsKIAl9Ci0JCisKICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluZGVudFN0cmluZyhpbnQgaW5kZW50YXRpb25Vbml0cykgewogICAgIAlyZXR1cm4gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcih0aGlzLm9wdGlvbnMpLmNyZWF0ZUluZGVudGF0aW9uU3RyaW5nKGluZGVudGF0aW9uVW5pdHMpOwogICAgIH0KLQkKKwogCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKFN0cmluZyBjdXJyZW50TGluZSkgewogCQlyZXR1cm4gSW5kZW50TWFuaXB1bGF0aW9uLmV4dHJhY3RJbmRlbnRTdHJpbmcoY3VycmVudExpbmUsIHRoaXMudGFiV2lkdGgsIHRoaXMuaW5kZW50V2lkdGgpOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgY2hhbmdlSW5kZW50KFN0cmluZyBjb2RlLCBpbnQgY29kZUluZGVudExldmVsLCBTdHJpbmcgbmV3SW5kZW50KSB7CiAJCXJldHVybiBJbmRlbnRNYW5pcHVsYXRpb24uY2hhbmdlSW5kZW50KGNvZGUsIGNvZGVJbmRlbnRMZXZlbCwgdGhpcy50YWJXaWR0aCwgdGhpcy5pbmRlbnRXaWR0aCwgbmV3SW5kZW50LCB0aGlzLmxpbmVEZWxpbWl0ZXIpOwogCX0KLQkKKwogCXB1YmxpYyBpbnQgY29tcHV0ZUluZGVudFVuaXRzKFN0cmluZyBsaW5lKSB7CiAJCXJldHVybiBJbmRlbnRNYW5pcHVsYXRpb24ubWVhc3VyZUluZGVudFVuaXRzKGxpbmUsIHRoaXMudGFiV2lkdGgsIHRoaXMuaW5kZW50V2lkdGgpOwogCX0KLQkKKwogCS8qKgogCSAqIEV2YWx1YXRlcyB0aGUgZWRpdCBvbiB0aGUgZ2l2ZW4gc3RyaW5nLgogCSAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBmb3JtYXQKQEAgLTIzOSwxNiArMjQwLDE2IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQkKKwogCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXRTdHJpbmcoaW50IGtpbmQsIFN0cmluZyBzdHJpbmcsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbmRlbnRhdGlvbkxldmVsKSB7CiAJCXJldHVybiBUb29sRmFjdG9yeS5jcmVhdGVDb2RlRm9ybWF0dGVyKHRoaXMub3B0aW9ucykuZm9ybWF0KGtpbmQsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGluZGVudGF0aW9uTGV2ZWwsIHRoaXMubGluZURlbGltaXRlcik7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBlZGl0cyB0aGF0IGRlc2NyaWJlIGhvdyB0byBmb3JtYXQgdGhlIGdpdmVuIHN0cmluZy4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29kZSBjb3VsZCBub3QgYmUgZm9ybWF0dGVkIGZvciB0aGUgZ2l2ZW4ga2luZC4KIAkgKiBAcGFyYW0gbm9kZSBOb2RlIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhlIHN0cmluZwogCSAqIEBwYXJhbSBzdHIgVGhlIHVuZm9ybWF0dGVkIHN0cmluZwotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsCiAJICogQHJldHVybiBSZXR1cm5zIHRoZSBlZGl0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBmb3JtYXR0ZXIKIAkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIG5vdCBpbnNpZGUgdGhlIHN0cmluZywgYQogCSAqICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgpAQCAtMjY1LDcgKzI2NiwxMiBAQAogCQkJCWNvZGU9IENvZGVGb3JtYXR0ZXIuS19TVEFURU1FTlRTOwogCQkJfQogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04pIHsKLQkJCWNvZGU9IENvZGVGb3JtYXR0ZXIuS19FWFBSRVNTSU9OOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7CisJCQkJc3VmZml4PSAiXG5jbGFzcyBBIHt9IjsgLy8kTk9OLU5MUy0xJAorCQkJCWNvZGU9IENvZGVGb3JtYXR0ZXIuS19DT01QSUxBVElPTl9VTklUOworCQkJfSBlbHNlIHsKKwkJCQljb2RlPSBDb2RlRm9ybWF0dGVyLktfRVhQUkVTU0lPTjsKKwkJCX0KIAkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQm9keURlY2xhcmF0aW9uKSB7CiAJCQljb2RlPSBDb2RlRm9ybWF0dGVyLktfQ0xBU1NfQk9EWV9ERUNMQVJBVElPTlM7CiAJCX0gZWxzZSB7CkBAIC0yOTUsNyArMzAxLDcgQEAKIAkJCQkJcHJlZml4PSAiQSAiOyAvLyROT04tTkxTLTEkCiAJCQkJCXN1ZmZpeD0gIjsiOyAvLyROT04tTkxTLTEkCiAJCQkJCWNvZGU9IENvZGVGb3JtYXR0ZXIuS19TVEFURU1FTlRTOwotCQkJCQlicmVhazsJCQkKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBBU1ROb2RlLlBBQ0tBR0VfREVDTEFSQVRJT046CiAJCQkJY2FzZSBBU1ROb2RlLklNUE9SVF9ERUNMQVJBVElPTjoKIAkJCQkJc3VmZml4PSAiXG5jbGFzcyBBIHt9IjsgLy8kTk9OLU5MUy0xJApAQCAtMzIxLDcgKzMyNyw3IEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVNUTm9kZS5NT0RJRklFUjoKIAkJCQkJc3VmZml4PSAiIGNsYXNzIHgge30iOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvZGU9IENvZGVGb3JtYXR0ZXIuS19DT01QSUxBVElPTl9VTklUOwkJCQkKKwkJCQkJY29kZT0gQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQ7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVNUTm9kZS5UWVBFX1BBUkFNRVRFUjoKIAkJCQkJcHJlZml4PSAiY2xhc3MgWDwiOyAvLyROT04tTkxTLTEkCkBAIC0zMzQsOSArMzQwLDkgQEAKIAkJCQljYXNlIEFTVE5vZGUuVEFHX0VMRU1FTlQ6CiAJCQkJY2FzZSBBU1ROb2RlLlRFWFRfRUxFTUVOVDoKIAkJCQkJLy8gamF2YWRvYyBmb3JtYXR0aW5nIGRpc2FibGVkIGR1ZSB0byBidWcgOTM2NDQKLQkJCQkJcmV0dXJuIG51bGw7IAorCQkJCQlyZXR1cm4gbnVsbDsKIAotLy8JCQkJd2lhdCBmb3IgYnVnIDkzNjQ0IAorLy8JCQkJd2lhdCBmb3IgYnVnIDkzNjQ0CiAvLwkJCQljYXNlIEFTVE5vZGUuTUVNQkVSX1JFRjoKIC8vCQkJCWNhc2UgQVNUTm9kZS5NRVRIT0RfUkVGOgogLy8JCQkJCXByZWZpeD0gIi8qKlxuICogQHNlZSAiOwpAQCAtMzU5LDE2ICszNjUsMTYgQEAKIAkJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCX0KLQkJCisKIAkJU3RyaW5nIGNvbmNhdFN0cj0gcHJlZml4ICsgc3RyICsgc3VmZml4OwogCQlUZXh0RWRpdCBlZGl0PSBmb3JtYXRTdHJpbmcoY29kZSwgY29uY2F0U3RyLCBwcmVmaXgubGVuZ3RoKCksIHN0ci5sZW5ndGgoKSwgaW5kZW50YXRpb25MZXZlbCk7Ci0JCQorCiAJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CiAJCQllZGl0PSBzaGlmRWRpdChlZGl0LCBwcmVmaXgubGVuZ3RoKCkpOwotCQl9CQkKKwkJfQogCQlyZXR1cm4gZWRpdDsKLQl9CQotCQkJCisJfQorCiAJcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgc2hpZkVkaXQoVGV4dEVkaXQgb2xkRWRpdCwgaW50IGRpZmYpIHsKIAkJVGV4dEVkaXQgbmV3RWRpdDsKIAkJaWYgKG9sZEVkaXQgaW5zdGFuY2VvZiBSZXBsYWNlRWRpdCkgewpAQCAtMzgxLDcgKzM4Nyw3IEBACiAJCQlEZWxldGVFZGl0IGVkaXQ9IChEZWxldGVFZGl0KSBvbGRFZGl0OwogCQkJbmV3RWRpdD0gbmV3IERlbGV0ZUVkaXQoZWRpdC5nZXRPZmZzZXQoKSAtIGRpZmYsICBlZGl0LmdldExlbmd0aCgpKTsKIAkJfSBlbHNlIGlmIChvbGRFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCkgewotCQkJbmV3RWRpdD0gbmV3IE11bHRpVGV4dEVkaXQoKTsJCQkKKwkJCW5ld0VkaXQ9IG5ldyBNdWx0aVRleHRFZGl0KCk7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gbnVsbDsgLy8gbm90IHN1cHBvcnRlZAogCQl9CkBAIC0zOTQsMTMgKzQwMCwxMyBAQAogCQl9CiAJCXJldHVybiBuZXdFZGl0OwogCX0KLQkJCisKIAlwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgc3RyaW5nLCBQb3NpdGlvbltdIHBvc2l0aW9ucykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAJCURvY3VtZW50IGRvYz0gbmV3IERvY3VtZW50KHN0cmluZyk7CiAJCXRyeSB7CiAJCQlpZiAocG9zaXRpb25zICE9IG51bGwpIHsKIAkJCQlmaW5hbCBTdHJpbmcgUE9TX0NBVEVHT1JZPSAibXlDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKKwogCQkJCWRvYy5hZGRQb3NpdGlvbkNhdGVnb3J5KFBPU19DQVRFR09SWSk7CiAJCQkJZG9jLmFkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVmYXVsdFBvc2l0aW9uVXBkYXRlcihQT1NfQ0FURUdPUlkpIHsKIAkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gbm90RGVsZXRlZCgpIHsKQEAgLTQyNyw0MSArNDMzLDQxIEBACiAJCXJldHVybiBkb2M7CiAJfQogCi0gICAgCisKIAogICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFByZWZpeCB7CiAJCVN0cmluZyBnZXRQcmVmaXgoaW50IGluZGVudCk7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQmxvY2tDb250ZXh0IHsKIAkJU3RyaW5nW10gZ2V0UHJlZml4QW5kU3VmZml4KGludCBpbmRlbnQsIEFTVE5vZGUgbm9kZSwgUmV3cml0ZUV2ZW50U3RvcmUgZXZlbnRzKTsKLQl9CQotCQorCX0KKwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RQcmVmaXggaW1wbGVtZW50cyBQcmVmaXggewogCQlwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0JCQorCiAJCXB1YmxpYyBDb25zdFByZWZpeChTdHJpbmcgcHJlZml4KSB7CiAJCQl0aGlzLnByZWZpeD0gcHJlZml4OwogCQl9Ci0JCQorCiAJCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KGludCBpbmRlbnQpIHsKIAkJCXJldHVybiB0aGlzLnByZWZpeDsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgY2xhc3MgRm9ybWF0dGluZ1ByZWZpeCBpbXBsZW1lbnRzIFByZWZpeCB7CiAJCXByaXZhdGUgaW50IGtpbmQ7CiAJCXByaXZhdGUgU3RyaW5nIHN0cmluZzsKIAkJcHJpdmF0ZSBpbnQgc3RhcnQ7CiAJCXByaXZhdGUgaW50IGxlbmd0aDsKLQkJCisKIAkJcHVibGljIEZvcm1hdHRpbmdQcmVmaXgoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN1YiwgaW50IGtpbmQpIHsKIAkJCXRoaXMuc3RhcnQ9IHN0cmluZy5pbmRleE9mKHN1Yik7CiAJCQl0aGlzLmxlbmd0aD0gc3ViLmxlbmd0aCgpOwogCQkJdGhpcy5zdHJpbmc9IHN0cmluZzsKIAkJCXRoaXMua2luZD0ga2luZDsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeChpbnQgaW5kZW50KSB7CiAJCQlQb3NpdGlvbiBwb3M9IG5ldyBQb3NpdGlvbih0aGlzLnN0YXJ0LCB0aGlzLmxlbmd0aCk7CiAJCQlTdHJpbmcgc3RyPSB0aGlzLnN0cmluZzsKQEAgLTQ3NiwxMiArNDgyLDEyIEBACiAJcHJpdmF0ZSBjbGFzcyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXggaW1wbGVtZW50cyBCbG9ja0NvbnRleHQgewogCQlwcml2YXRlIFN0cmluZyBwcmVmaXg7CiAJCXByaXZhdGUgaW50IHN0YXJ0OwotCQkKKwogCQlwdWJsaWMgQmxvY2tGb3JtYXR0aW5nUHJlZml4KFN0cmluZyBwcmVmaXgsIGludCBzdGFydCkgewogCQkJdGhpcy5zdGFydD0gc3RhcnQ7CiAJCQl0aGlzLnByZWZpeD0gcHJlZml4OwogCQl9Ci0JCQorCiAJCXB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmaXhBbmRTdWZmaXgoaW50IGluZGVudCwgQVNUTm9kZSBub2RlLCBSZXdyaXRlRXZlbnRTdG9yZSBldmVudHMpIHsKIAkJCVN0cmluZyBub2RlU3RyaW5nPSBBU1RSZXdyaXRlRmxhdHRlbmVyLmFzU3RyaW5nKG5vZGUsIGV2ZW50cyk7CiAJCQlTdHJpbmcgc3RyPSB0aGlzLnByZWZpeCArIG5vZGVTdHJpbmc7CkBAIC00OTQsMjUgKzUwMCwyNSBAQAogCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHN0ci5zdWJzdHJpbmcocG9zLm9mZnNldCArIDEsIHBvcy5vZmZzZXQgKyBwb3MubGVuZ3RoIC0gMSksICIifTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBjbGFzcyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXhTdWZmaXggaW1wbGVtZW50cyBCbG9ja0NvbnRleHQgewogCQlwcml2YXRlIFN0cmluZyBwcmVmaXg7CiAJCXByaXZhdGUgU3RyaW5nIHN1ZmZpeDsKIAkJcHJpdmF0ZSBpbnQgc3RhcnQ7Ci0JCQorCiAJCXB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXhTdWZmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCwgaW50IHN0YXJ0KSB7CiAJCQl0aGlzLnN0YXJ0PSBzdGFydDsKIAkJCXRoaXMuc3VmZml4PSBzdWZmaXg7CiAJCQl0aGlzLnByZWZpeD0gcHJlZml4OwogCQl9Ci0JCQorCiAJCXB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmaXhBbmRTdWZmaXgoaW50IGluZGVudCwgQVNUTm9kZSBub2RlLCBSZXdyaXRlRXZlbnRTdG9yZSBldmVudHMpIHsKIAkJCVN0cmluZyBub2RlU3RyaW5nPSBBU1RSZXdyaXRlRmxhdHRlbmVyLmFzU3RyaW5nKG5vZGUsIGV2ZW50cyk7CiAJCQlpbnQgbm9kZVN0YXJ0PSB0aGlzLnByZWZpeC5sZW5ndGgoKTsKIAkJCWludCBub2RlRW5kPSBub2RlU3RhcnQgKyBub2RlU3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJCQorCiAJCQlTdHJpbmcgc3RyPSB0aGlzLnByZWZpeCArIG5vZGVTdHJpbmcgKyB0aGlzLnN1ZmZpeDsKLQkJCQorCiAJCQlQb3NpdGlvbiBwb3MxPSBuZXcgUG9zaXRpb24odGhpcy5zdGFydCwgbm9kZVN0YXJ0ICsgMSAtIHRoaXMuc3RhcnQpOwogCQkJUG9zaXRpb24gcG9zMj0gbmV3IFBvc2l0aW9uKG5vZGVFbmQsIDIpOwogCkBAIC01MjUsMTIgKzUzMSwxMiBAQAogCQkJCXN0ci5zdWJzdHJpbmcocG9zMi5vZmZzZXQgKyAxLCBwb3MyLm9mZnNldCArIHBvczIubGVuZ3RoIC0gMSkKIAkJCX07CiAJCX0KLQl9CQotCQorCX0KKwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgUHJlZml4IE5PTkU9IG5ldyBDb25zdFByZWZpeCgiIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFByZWZpeCBTUEFDRT0gbmV3IENvbnN0UHJlZml4KCIgIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFByZWZpeCBBU1NFUlRfQ09NTUVOVD0gbmV3IENvbnN0UHJlZml4KCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJcHVibGljIGZpbmFsIFByZWZpeCBWQVJfSU5JVElBTElaRVI9IG5ldyBGb3JtYXR0aW5nUHJlZml4KCJBIGE9e307IiwgImE9eyIgLCBDb2RlRm9ybWF0dGVyLktfU1RBVEVNRU5UUyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCXB1YmxpYyBmaW5hbCBQcmVmaXggTUVUSE9EX0JPRFk9IG5ldyBGb3JtYXR0aW5nUHJlZml4KCJ2b2lkIGEoKSB7fSIsICIpIHsiICwgQ29kZUZvcm1hdHRlci5LX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJcHVibGljIGZpbmFsIFByZWZpeCBGSU5BTExZX0JMT0NLPSBuZXcgRm9ybWF0dGluZ1ByZWZpeCgidHJ5IHt9IGZpbmFsbHkge30iLCAifSBmaW5hbGx5IHsiLCBDb2RlRm9ybWF0dGVyLktfU1RBVEVNRU5UUyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtNTQzLDExICs1NDksMTQgQEAKIAogCXB1YmxpYyBmaW5hbCBQcmVmaXggRklSU1RfRU5VTV9DT05TVD0gbmV3IEZvcm1hdHRpbmdQcmVmaXgoImVudW0gRSB7IFg7fSIsICJ7IFgiICwgQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAlwdWJsaWMgZmluYWwgUHJlZml4IEFOTk9UQVRJT05fU0VQQVJBVElPTj0gbmV3IEZvcm1hdHRpbmdQcmVmaXgoIkBBIEBCIGNsYXNzIEMge30iLCAiQSBAIiAsIENvZGVGb3JtYXR0ZXIuS19DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KKwlwdWJsaWMgZmluYWwgUHJlZml4IFBBUkFNX0FOTk9UQVRJT05fU0VQQVJBVElPTj0gbmV3IEZvcm1hdHRpbmdQcmVmaXgoInZvaWQgZm9vKEBBIEBCIHApIHsgfSIsICJBIEAiICwgQ29kZUZvcm1hdHRlci5LX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJcHVibGljIGZpbmFsIFByZWZpeCBUUllfUkVTT1VSQ0VTID0gbmV3IEZvcm1hdHRpbmdQcmVmaXgoInRyeSAoQSBhID0gbmV3IEEoKTsgQiBiID0gbmV3IEIoKSkge30iLCAiOyBCIiAsIENvZGVGb3JtYXR0ZXIuS19TVEFURU1FTlRTKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJcHVibGljIGZpbmFsIFByZWZpeCBUUllfUkVTT1VSQ0VTX1BBUkVOID0gbmV3IEZvcm1hdHRpbmdQcmVmaXgoInRyeSAoQSBhID0gbmV3IEEoKTsgQiBiID0gbmV3IEIoKSkge30iLCAieSAoIiAsIENvZGVGb3JtYXR0ZXIuS19TVEFURU1FTlRTKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCiAJcHVibGljIGZpbmFsIEJsb2NrQ29udGV4dCBJRl9CTE9DS19XSVRIX0VMU0U9IG5ldyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXhTdWZmaXgoImlmICh0cnVlKSIsICJlbHNle30iLCA4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJcHVibGljIGZpbmFsIEJsb2NrQ29udGV4dCBJRl9CTE9DS19OT19FTFNFPSBuZXcgQmxvY2tGb3JtYXR0aW5nUHJlZml4KCJpZiAodHJ1ZSkiLCA4KTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBCbG9ja0NvbnRleHQgRUxTRV9BRlRFUl9TVEFURU1FTlQ9IG5ldyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXgoImlmICh0cnVlKSBmb28oKTsgZWxzZSAiLCAxNSk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgQmxvY2tDb250ZXh0IEVMU0VfQUZURVJfQkxPQ0s9IG5ldyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXgoImlmICh0cnVlKSB7fSBlbHNlICIsIDExKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBCbG9ja0NvbnRleHQgRUxTRV9BRlRFUl9TVEFURU1FTlQ9IG5ldyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXgoImlmICh0cnVlKSBmb28oKTtlbHNlICIsIDE1KTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBCbG9ja0NvbnRleHQgRUxTRV9BRlRFUl9CTE9DSz0gbmV3IEJsb2NrRm9ybWF0dGluZ1ByZWZpeCgiaWYgKHRydWUpIHt9ZWxzZSAiLCAxMSk7IC8vJE5PTi1OTFMtMSQKIAogCXB1YmxpYyBmaW5hbCBCbG9ja0NvbnRleHQgRk9SX0JMT0NLPSBuZXcgQmxvY2tGb3JtYXR0aW5nUHJlZml4KCJmb3IgKDs7KSAiLCA3KTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBCbG9ja0NvbnRleHQgV0hJTEVfQkxPQ0s9IG5ldyBCbG9ja0Zvcm1hdHRpbmdQcmVmaXgoIndoaWxlICh0cnVlKSIsIDExKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0ltcG9ydFJld3JpdGVBbmFseXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0ltcG9ydFJld3JpdGVBbmFseXplci5qYXZhCmluZGV4IDlkZjI4M2QuLjY4NDNlYWYgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9JbXBvcnRSZXdyaXRlQW5hbHl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvSW1wb3J0UmV3cml0ZUFuYWx5emVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKQEAgLTMzLDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwpAQCAtNDAsNDEgKzQyLDUwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0UmV3cml0ZUFuYWx5emVyIHsKLQkKKwogCXByaXZhdGUgZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7CiAJcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgcGFja2FnZUVudHJpZXM7Ci0JCisKIAlwcml2YXRlIGZpbmFsIExpc3QgaW1wb3J0c0NyZWF0ZWQ7CiAJcHJpdmF0ZSBmaW5hbCBMaXN0IHN0YXRpY0ltcG9ydHNDcmVhdGVkOwogCiAJcHJpdmF0ZSBmaW5hbCBJUmVnaW9uIHJlcGxhY2VSYW5nZTsKLQkKKwogCXByaXZhdGUgZmluYWwgaW50IGltcG9ydE9uRGVtYW5kVGhyZXNob2xkOwogCXByaXZhdGUgZmluYWwgaW50IHN0YXRpY0ltcG9ydE9uRGVtYW5kVGhyZXNob2xkOwogCiAJcHJpdmF0ZSBib29sZWFuIGZpbHRlckltcGxpY2l0SW1wb3J0czsKKwlwcml2YXRlIGJvb2xlYW4gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzOwogCXByaXZhdGUgYm9vbGVhbiBmaW5kQW1iaWd1b3VzSW1wb3J0czsKLQkKKwogCXByaXZhdGUgaW50IGZsYWdzPSAwOwotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZfTkVFRFNfTEVBRElOR19ERUxJTT0gMjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRl9ORUVEU19UUkFJTElOR19ERUxJTT0gNDsKLQkKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkc9ICJqYXZhLmxhbmciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEltcG9ydFJld3JpdGVBbmFseXplcihJQ29tcGlsYXRpb25Vbml0IGN1LCBDb21waWxhdGlvblVuaXQgcm9vdCwgU3RyaW5nW10gaW1wb3J0T3JkZXIsIGludCB0aHJlc2hvbGQsIGludCBzdGF0aWNUaHJlc2hvbGQsIGJvb2xlYW4gcmVzdG9yZUV4aXN0aW5nSW1wb3J0cykgeworCisJcHVibGljIEltcG9ydFJld3JpdGVBbmFseXplcigKKwkJCUlDb21waWxhdGlvblVuaXQgY3UsCisJCQlDb21waWxhdGlvblVuaXQgcm9vdCwKKwkJCVN0cmluZ1tdIGltcG9ydE9yZGVyLAorCQkJaW50IHRocmVzaG9sZCwKKwkJCWludCBzdGF0aWNUaHJlc2hvbGQsCisJCQlib29sZWFuIHJlc3RvcmVFeGlzdGluZ0ltcG9ydHMsCisJCQlib29sZWFuIHVzZUNvbnRleHRUb0ZpbHRlckltcGxpY2l0SW1wb3J0cykgewogCQl0aGlzLmNvbXBpbGF0aW9uVW5pdD0gY3U7CiAJCXRoaXMuaW1wb3J0T25EZW1hbmRUaHJlc2hvbGQ9IHRocmVzaG9sZDsKIAkJdGhpcy5zdGF0aWNJbXBvcnRPbkRlbWFuZFRocmVzaG9sZD0gc3RhdGljVGhyZXNob2xkOwotCQkKKwkJdGhpcy51c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMgPSB1c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHM7CisKIAkJdGhpcy5maWx0ZXJJbXBsaWNpdEltcG9ydHM9IHRydWU7CiAJCXRoaXMuZmluZEFtYmlndW91c0ltcG9ydHM9IHRydWU7IC8vIXJlc3RvcmVFeGlzdGluZ0ltcG9ydHM7Ci0JCQorCiAJCXRoaXMucGFja2FnZUVudHJpZXM9IG5ldyBBcnJheUxpc3QoMjApOwogCQl0aGlzLmltcG9ydHNDcmVhdGVkPSBuZXcgQXJyYXlMaXN0KCk7CiAJCXRoaXMuc3RhdGljSW1wb3J0c0NyZWF0ZWQ9IG5ldyBBcnJheUxpc3QoKTsKIAkJdGhpcy5mbGFncz0gMDsKLQkJCisKIAkJdGhpcy5yZXBsYWNlUmFuZ2U9IGV2YWx1YXRlUmVwbGFjZVJhbmdlKHJvb3QpOwogCQlpZiAocmVzdG9yZUV4aXN0aW5nSW1wb3J0cykgewogCQkJYWRkRXhpc3RpbmdJbXBvcnRzKHJvb3QpOwpAQCAtOTAsMTAgKzEwMSwxMCBAQAogCQkJCW9yZGVyW2ldPSBuZXcgUGFja2FnZUVudHJ5KGN1cnIsIGN1cnIsIGZhbHNlKTsgLy8gbm9ybWFsIGltcG9ydCBncm91cAogCQkJfQogCQl9Ci0JCQorCiAJCWFkZFByZWZlcmVuY2VPcmRlckhvbGRlcnMob3JkZXIpOwogCX0KLQkKKwogCXByaXZhdGUgaW50IGdldFNwYWNlc0JldHdlZW5JbXBvcnRHcm91cHMoKSB7CiAJCXRyeSB7CiAJCQlpbnQgbnVtPSBJbnRlZ2VyLnBhcnNlSW50KHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9uKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9CTEFOS19MSU5FU19CRVRXRUVOX0lNUE9SVF9HUk9VUFMsIHRydWUpKTsKQEAgLTEwNSw2ICsxMTYsMTAgQEAKIAkJcmV0dXJuIDE7CiAJfQogCQorCXByaXZhdGUgYm9vbGVhbiBpbnNlcnRTcGFjZUJlZm9yZVNlbWljb2xvbigpIHsKKwkJcmV0dXJuIEphdmFDb3JlLklOU0VSVC5lcXVhbHModGhpcy5jb21waWxhdGlvblVuaXQuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb24oRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfU0VNSUNPTE9OLCB0cnVlKSk7CisJfQorCiAJcHJpdmF0ZSB2b2lkIGFkZFByZWZlcmVuY2VPcmRlckhvbGRlcnMoUGFja2FnZUVudHJ5W10gcHJlZmVyZW5jZU9yZGVyKSB7CiAJCWlmICh0aGlzLnBhY2thZ2VFbnRyaWVzLmlzRW1wdHkoKSkgewogCQkJLy8gYWxsIG5ldzogY29weSB0aGUgZWxlbWVudHMKQEAgLTExNCw5ICsxMjksOSBAQAogCQl9IGVsc2UgewogCQkJLy8gbWF0Y2ggdGhlIHByZWZlcmVuY2Ugb3JkZXIgZW50cmllcyB0byBleGlzdGluZyBpbXBvcnRzCiAJCQkvLyBlbnRyaWVzIG5vdCBmb3VuZCBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IG1hdGNoZWQgZW50cnkKLQkJCQorCiAJCQlQYWNrYWdlRW50cnlbXSBsYXN0QXNzaWduZWQ9IG5ldyBQYWNrYWdlRW50cnlbcHJlZmVyZW5jZU9yZGVyLmxlbmd0aF07Ci0JCQkKKwogCQkJLy8gZmluZCBhbiBleGlzdGluZyBwYWNrYWdlIGVudHJ5IHRoYXQgbWF0Y2hlcyBtb3N0CiAJCQlmb3IgKGludCBrPSAwOyBrIDwgdGhpcy5wYWNrYWdlRW50cmllcy5zaXplKCk7IGsrKykgewogCQkJCVBhY2thZ2VFbnRyeSBlbnRyeT0gKFBhY2thZ2VFbnRyeSkgdGhpcy5wYWNrYWdlRW50cmllcy5nZXQoayk7CkBAIC0xNDIsNyArMTU3LDcgQEAKIAkJCQkJfQogCQkJCQlpZiAoYmVzdEdyb3VwSW5kZXggIT0gLTEpIHsKIAkJCQkJCWVudHJ5LnNldEdyb3VwSUQocHJlZmVyZW5jZU9yZGVyW2Jlc3RHcm91cEluZGV4XS5nZXROYW1lKCkpOwotCQkJCQkJbGFzdEFzc2lnbmVkW2Jlc3RHcm91cEluZGV4XT0gZW50cnk7IC8vIHJlbWVtYmVyIGxhc3QgZW50cnkgCisJCQkJCQlsYXN0QXNzaWduZWRbYmVzdEdyb3VwSW5kZXhdPSBlbnRyeTsgLy8gcmVtZW1iZXIgbGFzdCBlbnRyeQogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMTY0LDI4ICsxNzksNzQgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRRdWFsaWZpZXIoSW1wb3J0RGVjbGFyYXRpb24gZGVjbCkgewotCQlTdHJpbmcgbmFtZT0gZGVjbC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCXJldHVybiBkZWNsLmlzT25EZW1hbmQoKSA/IG5hbWUgOiBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKG5hbWUpOworCXByaXZhdGUgU3RyaW5nIGdldFF1YWxpZmllcihJbXBvcnREZWNsYXJhdGlvbiBkZWNsKSB7CisJCVN0cmluZyBuYW1lID0gZGVjbC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCS8qCisJCSAqIElmIGl0J3Mgb24gZGVtYW5kIGltcG9ydCwgcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gKGUuZy4gcGFjazEuRm9vLiogPT4gcGFjay5Gb28sIHBhY2sxLiogPT4gcGFjazEpCisJCSAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIGhhdmUgcGFjazEuRm9vLiogYW5kIHBhY2sxLkJhciB1bmRlciBkaWZmZXJlbnQgcXVhbGlmaWVyIGdyb3Vwcy4KKwkJICovCisJCWlmIChkZWNsLmlzT25EZW1hbmQoKSkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJcmV0dXJuIGdldFF1YWxpZmllcihuYW1lLCBkZWNsLmlzU3RhdGljKCkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFF1YWxpZmllcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYykgeworCQkvLyBGb3Igc3RhdGljIGltcG9ydHMsIHJldHVybiB0aGUgVHlwZSBuYW1lIGFzIHdlbGwgYXMgcGFydCBvZiB0aGUgcXVhbGlmaWVyCisJCWlmIChpc1N0YXRpYyB8fCAhdGhpcy51c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMpIHsKKwkJCXJldHVybiBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKG5hbWUpOworCQl9CisKKwkJY2hhcltdIHNlYXJjaGVkTmFtZSA9IG5hbWUudG9DaGFyQXJyYXkoKTsKKwkJaW50IGluZGV4ID0gbmFtZS5sZW5ndGgoKTsKKwkJLyogU3RvcCBhdCB0aGUgbGFzdCBmcmFnbWVudCAqLworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhUHJvamVjdCgpOworCQlkbyB7CisJCQlTdHJpbmcgdGVzdGVkTmFtZSA9IG5ldyBTdHJpbmcoc2VhcmNoZWROYW1lLCAwLCBpbmRleCk7CisJCQlJSmF2YUVsZW1lbnQgZnJhZ21lbnQgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlmcmFnbWVudCA9IHByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudCh0ZXN0ZWROYW1lKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG5hbWU7CisJCQl9CisJCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgeworCQkJCXJldHVybiB0ZXN0ZWROYW1lOworCQkJfQorCQkJdHJ5IHsKKwkJCQlmcmFnbWVudCA9IHByb2plY3QuZmluZFR5cGUodGVzdGVkTmFtZSk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKKwkJCQlpbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoU2lnbmF0dXJlLkNfRE9ULCBzZWFyY2hlZE5hbWUsIDAsIGluZGV4IC0gMSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdlIHVzZSB0aGUgaGV1cmlzdGljIHRoYXQgYSBuYW1lIHN0YXJ0aW5nIHdpdGggYSBsb3dlcmNhc2UgaXMgYSBwYWNrYWdlIG5hbWUKKwkJCQlpbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoU2lnbmF0dXJlLkNfRE9ULCBzZWFyY2hlZE5hbWUsIDAsIGluZGV4IC0gMSk7CisJCQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzZWFyY2hlZE5hbWVbaW5kZXggKyAxXSkpIHsKKwkJCQkJcmV0dXJuIHRlc3RlZE5hbWU7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChpbmRleCA+PSAwKTsgCisJCXJldHVybiBuYW1lOwogCX0KIAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdWxsTmFtZShJbXBvcnREZWNsYXJhdGlvbiBkZWNsKSB7CiAJCVN0cmluZyBuYW1lPSBkZWNsLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKIAkJcmV0dXJuIGRlY2wuaXNPbkRlbWFuZCgpID8gbmFtZSArICIuKiI6IG5hbWU7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgYWRkRXhpc3RpbmdJbXBvcnRzKENvbXBpbGF0aW9uVW5pdCByb290KSB7CiAJCUxpc3QvKkltcG9ydERlY2xhcmF0aW9uKi8gZGVjbHM9IHJvb3QuaW1wb3J0cygpOwogCQlpZiAoZGVjbHMuaXNFbXB0eSgpKSB7CiAJCQlyZXR1cm47Ci0JCX0JCQkJCisJCX0KIAkJUGFja2FnZUVudHJ5IGN1cnJQYWNrYWdlPSBudWxsOwotCQkJCisKIAkJSW1wb3J0RGVjbGFyYXRpb24gY3Vycj0gKEltcG9ydERlY2xhcmF0aW9uKSBkZWNscy5nZXQoMCk7CiAJCWludCBjdXJyT2Zmc2V0PSBjdXJyLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJaW50IGN1cnJMZW5ndGg9IGN1cnIuZ2V0TGVuZ3RoKCk7CiAJCWludCBjdXJyRW5kTGluZT0gcm9vdC5nZXRMaW5lTnVtYmVyKGN1cnJPZmZzZXQgKyBjdXJyTGVuZ3RoKTsKLQkJCisKIAkJZm9yIChpbnQgaT0gMTsgaSA8IGRlY2xzLnNpemUoKTsgaSsrKSB7CiAJCQlib29sZWFuIGlzU3RhdGljPSBjdXJyLmlzU3RhdGljKCk7CiAJCQlTdHJpbmcgbmFtZT0gZ2V0RnVsbE5hbWUoY3Vycik7CkBAIC0xOTgsMjUgKzI1OSwyNSBAQAogCQkJSW1wb3J0RGVjbGFyYXRpb24gbmV4dD0gKEltcG9ydERlY2xhcmF0aW9uKSBkZWNscy5nZXQoaSk7CiAJCQlpbnQgbmV4dE9mZnNldD0gbmV4dC5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCQlpbnQgbmV4dExlbmd0aD0gbmV4dC5nZXRMZW5ndGgoKTsKLQkJCWludCBuZXh0T2Zmc2V0TGluZT0gcm9vdC5nZXRMaW5lTnVtYmVyKG5leHRPZmZzZXQpOyAKKwkJCWludCBuZXh0T2Zmc2V0TGluZT0gcm9vdC5nZXRMaW5lTnVtYmVyKG5leHRPZmZzZXQpOwogCiAJCQkvLyBpZiBuZXh0IGltcG9ydCBpcyBvbiBhIGRpZmZlcmVudCBsaW5lLCBtb2RpZnkgdGhlIGVuZCBwb3NpdGlvbiB0byB0aGUgbmV4dCBsaW5lIGJlZ2luIG9mZnNldAogCQkJaWYgKGN1cnJFbmRMaW5lIDwgbmV4dE9mZnNldExpbmUpIHsKIAkJCQljdXJyRW5kTGluZSsrOwogCQkJCW5leHRPZmZzZXQ9IHJvb3QuZ2V0UG9zaXRpb24oY3VyckVuZExpbmUsIDApOwogCQkJfQotCQkJY3VyclBhY2thZ2UuYWRkKG5ldyBJbXBvcnREZWNsRW50cnkobmFtZSwgaXNTdGF0aWMsIG5ldyBSZWdpb24oY3Vyck9mZnNldCwgbmV4dE9mZnNldCAtIGN1cnJPZmZzZXQpKSk7CisJCQljdXJyUGFja2FnZS5hZGQobmV3IEltcG9ydERlY2xFbnRyeShwYWNrTmFtZS5sZW5ndGgoKSwgbmFtZSwgaXNTdGF0aWMsIG5ldyBSZWdpb24oY3Vyck9mZnNldCwgbmV4dE9mZnNldCAtIGN1cnJPZmZzZXQpKSk7CiAJCQljdXJyT2Zmc2V0PSBuZXh0T2Zmc2V0OwogCQkJY3Vycj0gbmV4dDsKLQkJCQkKKwogCQkJLy8gYWRkIGEgY29tbWVudCBlbnRyeSBmb3Igc3BhY2luZyBiZXR3ZWVuIGltcG9ydHMKIAkJCWlmIChjdXJyRW5kTGluZSA8IG5leHRPZmZzZXRMaW5lKSB7CiAJCQkJbmV4dE9mZnNldD0gcm9vdC5nZXRQb3NpdGlvbihuZXh0T2Zmc2V0TGluZSwgMCk7Ci0JCQkJCisKIAkJCQljdXJyUGFja2FnZT0gbmV3IFBhY2thZ2VFbnRyeSgpOyAvLyBjcmVhdGUgYSBjb21tZW50IHBhY2thZ2UgZW50cnkgZm9yIHRoaXMKIAkJCQl0aGlzLnBhY2thZ2VFbnRyaWVzLmFkZChjdXJyUGFja2FnZSk7Ci0JCQkJY3VyclBhY2thZ2UuYWRkKG5ldyBJbXBvcnREZWNsRW50cnkobnVsbCwgZmFsc2UsIG5ldyBSZWdpb24oY3Vyck9mZnNldCwgbmV4dE9mZnNldCAtIGN1cnJPZmZzZXQpKSk7Ci0JCQkJCQorCQkJCWN1cnJQYWNrYWdlLmFkZChuZXcgSW1wb3J0RGVjbEVudHJ5KHBhY2tOYW1lLmxlbmd0aCgpLCBudWxsLCBmYWxzZSwgbmV3IFJlZ2lvbihjdXJyT2Zmc2V0LCBuZXh0T2Zmc2V0IC0gY3Vyck9mZnNldCkpKTsKKwogCQkJCWN1cnJPZmZzZXQ9IG5leHRPZmZzZXQ7CiAJCQl9CiAJCQljdXJyRW5kTGluZT0gcm9vdC5nZXRMaW5lTnVtYmVyKG5leHRPZmZzZXQgKyBuZXh0TGVuZ3RoKTsKQEAgLTIzMCwyMSArMjkxLDI5IEBACiAJCQl0aGlzLnBhY2thZ2VFbnRyaWVzLmFkZChjdXJyUGFja2FnZSk7CiAJCX0KIAkJaW50IGxlbmd0aD0gdGhpcy5yZXBsYWNlUmFuZ2UuZ2V0T2Zmc2V0KCkgKyB0aGlzLnJlcGxhY2VSYW5nZS5nZXRMZW5ndGgoKSAtIGN1cnIuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQljdXJyUGFja2FnZS5hZGQobmV3IEltcG9ydERlY2xFbnRyeShuYW1lLCBpc1N0YXRpYywgbmV3IFJlZ2lvbihjdXJyLmdldFN0YXJ0UG9zaXRpb24oKSwgbGVuZ3RoKSkpOworCQljdXJyUGFja2FnZS5hZGQobmV3IEltcG9ydERlY2xFbnRyeShwYWNrTmFtZS5sZW5ndGgoKSwgbmFtZSwgaXNTdGF0aWMsIG5ldyBSZWdpb24oY3Vyci5nZXRTdGFydFBvc2l0aW9uKCksIGxlbmd0aCkpKTsKIAl9Ci0JCQkKKwogCS8qKgotCSAqIFNldHMgdGhhdCBpbXBsaWNpdCBpbXBvcnRzICh0eXBlcyBpbiBkZWZhdWx0IHBhY2thZ2UsIENVLSBwYWNrYWdlIGFuZAotCSAqICdqYXZhLmxhbmcnKSBzaG91bGQgbm90IGJlIGNyZWF0ZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGEgaGV1cmlzdGljIGZpbHRlciBhbmQgY2FuCi0JICogbGVhZCB0byBtaXNzaW5nIGltcG9ydHMsIGUuZy4gaW4gY2FzZXMgd2hlcmUgYSB0eXBlIGlzIGZvcmNlZCB0byBiZSBzcGVjaWZpZWQKLQkgKiBkdWUgdG8gYSBuYW1lIGNvbmZsaWN0LgotCSAqIEJ5IGRlZmF1bHQsIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZC4KLQkgKiBAcGFyYW0gZmlsdGVySW1wbGljaXRJbXBvcnRzIFRoZSBmaWx0ZXJJbXBsaWNpdEltcG9ydHMgdG8gc2V0CisJICogU3BlY2lmaWVzIHRoYXQgaW1wbGljaXQgaW1wb3J0cyAoZm9yIHR5cGVzIGluIDxjb2RlPmphdmEubGFuZzwvY29kZT4sIHR5cGVzIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHJld3JpdGUKKwkgKiBjb21waWxhdGlvbiB1bml0IGFuZCB0eXBlcyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCdzIG1haW4gdHlwZSkgc2hvdWxkIG5vdCBiZSBjcmVhdGVkLCBleGNlcHQgaWYgbmVjZXNzYXJ5IHRvCisJICogcmVzb2x2ZSBhbiBvbi1kZW1hbmQgaW1wb3J0IGNvbmZsaWN0LgorCSAqIDxwPgorCSAqIFRoZSBmaWx0ZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBOb3RlOiB7QGxpbmsgI0ltcG9ydFJld3JpdGVBbmFseXplcihJQ29tcGlsYXRpb25Vbml0LCBDb21waWxhdGlvblVuaXQsIFN0cmluZ1tdLCBpbnQsIGludCwgYm9vbGVhbiwgYm9vbGVhbil9IHdpdGggdHJ1ZSBhcyB0aGUgbGFzdAorCSAqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgaW1wbGljaXQgaW1wb3J0cyB3aGVuIGEgY29udGV4dCBpcyB1c2VkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsdGVySW1wbGljaXRJbXBvcnRzCisJICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW1wbGljaXQgaW1wb3J0cyB3aWxsIGJlIGZpbHRlcmVkCisJICogCisJICogQHNlZSAjSW1wb3J0UmV3cml0ZUFuYWx5emVyKElDb21waWxhdGlvblVuaXQsIENvbXBpbGF0aW9uVW5pdCwgU3RyaW5nW10sIGludCwgaW50LCBib29sZWFuLCBib29sZWFuKQogCSAqLwogCXB1YmxpYyB2b2lkIHNldEZpbHRlckltcGxpY2l0SW1wb3J0cyhib29sZWFuIGZpbHRlckltcGxpY2l0SW1wb3J0cykgewogCQl0aGlzLmZpbHRlckltcGxpY2l0SW1wb3J0cz0gZmlsdGVySW1wbGljaXRJbXBvcnRzOwogCX0KLQkKIAkvKioKIAkgKiBXaGVuIHNldCBzZWFyY2hlcyBmb3IgaW1wb3J0cyB0aGF0IGNhbiBub3QgYmUgZm9sZGVkIGludG8gb24tZGVtYW5kCiAJICogaW1wb3J0cyBidXQgbXVzdCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseQpAQCAtMjUyLDIzICszMjEsMjMgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRGaW5kQW1iaWd1b3VzSW1wb3J0cyhib29sZWFuIGZpbmRBbWJpZ3VvdXNJbXBvcnRzKSB7CiAJCXRoaXMuZmluZEFtYmlndW91c0ltcG9ydHM9IGZpbmRBbWJpZ3VvdXNJbXBvcnRzOwotCX0JCi0JCQkKKwl9CisKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWNrYWdlTWF0Y2hlciB7CiAJCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7CiAJCXByaXZhdGUgU3RyaW5nIGJlc3ROYW1lOwogCQlwcml2YXRlIGludCBiZXN0TWF0Y2hMZW47Ci0JCQorCiAJCXB1YmxpYyBQYWNrYWdlTWF0Y2hlcigpIHsKIAkJCS8vIGluaXRpYWxpemF0aW9uIGluICdpbml0aWFsaXplJwogCQl9Ci0JCQorCiAJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIG5ld0ltcG9ydE5hbWUsIFN0cmluZyBiZXN0SW1wb3J0TmFtZSkgewogCQkJdGhpcy5uZXdOYW1lPSBuZXdJbXBvcnROYW1lOwogCQkJdGhpcy5iZXN0TmFtZT0gYmVzdEltcG9ydE5hbWU7CiAJCQl0aGlzLmJlc3RNYXRjaExlbj0gZ2V0Q29tbW9uUHJlZml4TGVuZ3RoKGJlc3RJbXBvcnROYW1lLCBuZXdJbXBvcnROYW1lKTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiBpc0JldHRlck1hdGNoKFN0cmluZyBjdXJyTmFtZSwgYm9vbGVhbiBwcmVmZXJDdXJyKSB7CiAJCQlib29sZWFuIGlzQmV0dGVyOwogCQkJaW50IGN1cnJNYXRjaExlbj0gZ2V0Q29tbW9uUHJlZml4TGVuZ3RoKGN1cnJOYW1lLCB0aGlzLm5ld05hbWUpOwpAQCAtMjg5LDcgKzM1OCw3IEBACiAJCQl9CiAJCQlyZXR1cm4gaXNCZXR0ZXI7CiAJCX0KLQkJCQkKKwogCQlwcml2YXRlIGJvb2xlYW4gc2FtZU1hdGNoTGVuVGVzdChTdHJpbmcgY3Vyck5hbWUpIHsKIAkJCWludCBtYXRjaExlbj0gdGhpcy5iZXN0TWF0Y2hMZW47CiAJCQkvLyBrbm93bjogYmVzdE5hbWUgYW5kIGN1cnJOYW1lIGRpZmZlciBmcm9tIG5ld05hbWUgYXQgcG9zaXRpb24gJ21hdGNoTGVuJwpAQCAtMzQwLDcgKzQwOSw3IEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJfQotCQorCiAJcHJpdmF0ZSBQYWNrYWdlRW50cnkgZmluZEJlc3RNYXRjaChTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiBpc1N0YXRpYykgewogCQlpZiAodGhpcy5wYWNrYWdlRW50cmllcy5pc0VtcHR5KCkpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtMzU3LDcgKzQyNiw3IEBACiAJCQkJCWlmIChwcmVmaXhMZW4gPT0gbmV3TmFtZS5sZW5ndGgoKSkgewogCQkJCQkJcmV0dXJuIGN1cnI7IC8vIHBlcmZlY3QgZml0LCB1c2UgZW50cnkKIAkJCQkJfQotCQkJCQlpZiAoKG5ld05hbWUuY2hhckF0KHByZWZpeExlbikgPT0gJy4nKSAmJiBwcmVmaXhMZW4gPiBsb25nZXN0UHJlZml4KSB7CisJCQkJCWlmICgobmV3TmFtZS5jaGFyQXQocHJlZml4TGVuKSA9PSAnLicgfHwgcHJlZml4TGVuID09IDApICYmIHByZWZpeExlbiA+IGxvbmdlc3RQcmVmaXgpIHsKIAkJCQkJCWxvbmdlc3RQcmVmaXg9IHByZWZpeExlbjsKIAkJCQkJCWdyb3VwSWQ9IGN1cnJHcm91cDsKIAkJCQkJfQpAQCAtMzgwLDExICs0NDksMTIgQEAKIAkJfQogCQlyZXR1cm4gYmVzdE1hdGNoOwogCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ltcGxpY2l0SW1wb3J0KFN0cmluZyBxdWFsaWZpZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKEpBVkFfTEFORy5lcXVhbHMocXVhbGlmaWVyKSkgeyAKKworCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0SW1wb3J0KFN0cmluZyBxdWFsaWZpZXIpIHsKKwkJaWYgKEpBVkFfTEFORy5lcXVhbHMocXVhbGlmaWVyKSkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KKwkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gdGhpcy5jb21waWxhdGlvblVuaXQ7CiAJCVN0cmluZyBwYWNrYWdlTmFtZT0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKIAkJaWYgKHF1YWxpZmllci5lcXVhbHMocGFja2FnZU5hbWUpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTM5NSwxNiArNDY1LDE2IEBACiAJCX0KIAkJcmV0dXJuIHF1YWxpZmllci5lcXVhbHMocGFja2FnZU5hbWUgKycuJyArIG1haW5UeXBlTmFtZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgYWRkSW1wb3J0KFN0cmluZyBmdWxsVHlwZU5hbWUsIGJvb2xlYW4gaXNTdGF0aWMpIHsKLQkJU3RyaW5nIHR5cGVDb250YWluZXJOYW1lPSBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGZ1bGxUeXBlTmFtZSk7Ci0JCUltcG9ydERlY2xFbnRyeSBkZWNsPSBuZXcgSW1wb3J0RGVjbEVudHJ5KGZ1bGxUeXBlTmFtZSwgaXNTdGF0aWMsIG51bGwpOworCQlTdHJpbmcgdHlwZUNvbnRhaW5lck5hbWU9IGdldFF1YWxpZmllcihmdWxsVHlwZU5hbWUsIGlzU3RhdGljKTsKKwkJSW1wb3J0RGVjbEVudHJ5IGRlY2w9IG5ldyBJbXBvcnREZWNsRW50cnkodHlwZUNvbnRhaW5lck5hbWUubGVuZ3RoKCksIGZ1bGxUeXBlTmFtZSwgaXNTdGF0aWMsIG51bGwpOwogCQlzb3J0SW4odHlwZUNvbnRhaW5lck5hbWUsIGRlY2wsIGlzU3RhdGljKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbXBvcnQoU3RyaW5nIHF1YWxpZmllZE5hbWUsIGJvb2xlYW4gaXNTdGF0aWMpIHsKLQkJU3RyaW5nIGNvbnRhaW5lck5hbWU9IFNpZ25hdHVyZS5nZXRRdWFsaWZpZXIocXVhbGlmaWVkTmFtZSk7Ci0JCQorCQlTdHJpbmcgY29udGFpbmVyTmFtZT0gZ2V0UXVhbGlmaWVyKHF1YWxpZmllZE5hbWUsIGlzU3RhdGljKTsKKwogCQlpbnQgblBhY2thZ2VzPSB0aGlzLnBhY2thZ2VFbnRyaWVzLnNpemUoKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IG5QYWNrYWdlczsgaSsrKSB7CiAJCQlQYWNrYWdlRW50cnkgZW50cnk9IChQYWNrYWdlRW50cnkpIHRoaXMucGFja2FnZUVudHJpZXMuZ2V0KGkpOwpAQCAtNDE2LDcgKzQ4Niw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXByaXZhdGUgaW50IGdldEluZGV4QWZ0ZXJTdGF0aWNzKCkgewogCQlmb3IgKGludCBpPSAwOyBpIDwgdGhpcy5wYWNrYWdlRW50cmllcy5zaXplKCk7IGkrKykgewogCQkJaWYgKCEoKFBhY2thZ2VFbnRyeSkgdGhpcy5wYWNrYWdlRW50cmllcy5nZXQoaSkpLmlzU3RhdGljKCkpIHsKQEAgLTQyNSw4ICs0OTUsOCBAQAogCQl9CiAJCXJldHVybiB0aGlzLnBhY2thZ2VFbnRyaWVzLnNpemUoKTsKIAl9Ci0JCi0JCisKKwogCXByaXZhdGUgdm9pZCBzb3J0SW4oU3RyaW5nIHR5cGVDb250YWluZXJOYW1lLCBJbXBvcnREZWNsRW50cnkgZGVjbCwgYm9vbGVhbiBpc1N0YXRpYykgewogCQlQYWNrYWdlRW50cnkgYmVzdE1hdGNoPSBmaW5kQmVzdE1hdGNoKHR5cGVDb250YWluZXJOYW1lLCBpc1N0YXRpYyk7CiAJCWlmIChiZXN0TWF0Y2ggPT0gbnVsbCkgewpAQCAtNDQ5LDIxICs1MTksMjMgQEAKIAkJCQlQYWNrYWdlRW50cnkgcGFja0VudHJ5PSBuZXcgUGFja2FnZUVudHJ5KHR5cGVDb250YWluZXJOYW1lLCBncm91cCwgaXNTdGF0aWMpOwogCQkJCXBhY2tFbnRyeS5hZGQoZGVjbCk7CiAJCQkJaW50IGluZGV4PSB0aGlzLnBhY2thZ2VFbnRyaWVzLmluZGV4T2YoYmVzdE1hdGNoKTsKLQkJCQlpZiAoY21wIDwgMCkgeyAJLy8gaW5zZXJ0IGFoZWFkIG9mIGJlc3QgbWF0Y2gKKwkJCQlpZiAoY21wIDwgMCkgeworCQkJCQkvLyBpbnNlcnQgYWhlYWQgb2YgYmVzdCBtYXRjaAogCQkJCQl0aGlzLnBhY2thZ2VFbnRyaWVzLmFkZChpbmRleCwgcGFja0VudHJ5KTsKLQkJCQl9IGVsc2UgewkJLy8gaW5zZXJ0IGFmdGVyIGJlc3QgbWF0Y2gKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBpbnNlcnQgYWZ0ZXIgYmVzdCBtYXRjaAogCQkJCQl0aGlzLnBhY2thZ2VFbnRyaWVzLmFkZChpbmRleCArIDEsIHBhY2tFbnRyeSk7CiAJCQkJfQogCQkJfQogCQl9CiAJfQotCQkJCisKIAlwcml2YXRlIElSZWdpb24gZXZhbHVhdGVSZXBsYWNlUmFuZ2UoQ29tcGlsYXRpb25Vbml0IHJvb3QpIHsKIAkJTGlzdCBpbXBvcnRzPSByb290LmltcG9ydHMoKTsKIAkJaWYgKCFpbXBvcnRzLmlzRW1wdHkoKSkgewogCQkJSW1wb3J0RGVjbGFyYXRpb24gZmlyc3Q9IChJbXBvcnREZWNsYXJhdGlvbikgaW1wb3J0cy5nZXQoMCk7CiAJCQlJbXBvcnREZWNsYXJhdGlvbiBsYXN0PSAoSW1wb3J0RGVjbGFyYXRpb24pIGltcG9ydHMuZ2V0KGltcG9ydHMuc2l6ZSgpIC0gMSk7Ci0JCQkKKwogCQkJaW50IHN0YXJ0UG9zPSBmaXJzdC5nZXRTdGFydFBvc2l0aW9uKCk7IC8vIG5vIGV4dGVuZGVkIHJhbmdlIGZvciBmaXJzdDogYnVnIDEyMTQyOAogCQkJaW50IGVuZFBvcz0gcm9vdC5nZXRFeHRlbmRlZFN0YXJ0UG9zaXRpb24obGFzdCkgKyByb290LmdldEV4dGVuZGVkTGVuZ3RoKGxhc3QpOwogCQkJaW50IGVuZExpbmU9IHJvb3QuZ2V0TGluZU51bWJlcihlbmRQb3MpOwpAQCAtNDgyLDUyICs1NTQsNDkgQEAKIAkJfSBlbHNlIHsKIAkJCWludCBzdGFydD0gZ2V0UGFja2FnZVN0YXRlbWVudEVuZFBvcyhyb290KTsKIAkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCAwKTsKLQkJfQkJCisJCX0KIAl9Ci0JCisKIAlwdWJsaWMgTXVsdGlUZXh0RWRpdCBnZXRSZXN1bHRpbmdFZGl0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlpZiAobW9uaXRvciA9PSBudWxsKSB7CiAJCQltb25pdG9yPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwogCQl9Ci0JCXRyeSB7CQkJCisJCXRyeSB7CiAJCQlpbnQgaW1wb3J0c1N0YXJ0PSAgdGhpcy5yZXBsYWNlUmFuZ2UuZ2V0T2Zmc2V0KCk7CiAJCQlpbnQgaW1wb3J0c0xlbj0gdGhpcy5yZXBsYWNlUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQorCiAJCQlTdHJpbmcgbGluZURlbGltPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5maW5kUmVjb21tZW5kZWRMaW5lU2VwYXJhdG9yKCk7CiAJCQlJQnVmZmVyIGJ1ZmZlcj0gdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCk7Ci0JCQkJCQkJCQkKKwogCQkJaW50IGN1cnJQb3M9IGltcG9ydHNTdGFydDsKIAkJCU11bHRpVGV4dEVkaXQgcmVzRWRpdD0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQorCiAJCQlpZiAoKHRoaXMuZmxhZ3MgJiBGX05FRURTX0xFQURJTkdfREVMSU0pICE9IDApIHsKIAkJCQkvLyBuZXcgaW1wb3J0IGNvbnRhaW5lcgogCQkJCXJlc0VkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoY3VyclBvcywgbGluZURlbGltKSk7CiAJCQl9Ci0JCQkKKwogCQkJUGFja2FnZUVudHJ5IGxhc3RQYWNrYWdlPSBudWxsOwotCQkJCisKIAkJCVNldCBvbkRlbWFuZENvbmZsaWN0cz0gbnVsbDsKIAkJCWlmICh0aGlzLmZpbmRBbWJpZ3VvdXNJbXBvcnRzKSB7CiAJCQkJb25EZW1hbmRDb25mbGljdHM9IGV2YWx1YXRlU3RhckltcG9ydENvbmZsaWN0cyhtb25pdG9yKTsKIAkJCX0KLQkJCQorCiAJCQlpbnQgc3BhY2VzQmV0d2Vlbkdyb3Vwcz0gZ2V0U3BhY2VzQmV0d2VlbkltcG9ydEdyb3VwcygpOwotCQkJCisKIAkJCUFycmF5TGlzdCBzdHJpbmdzVG9JbnNlcnQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQorCiAJCQlpbnQgblBhY2thZ2VFbnRyaWVzPSB0aGlzLnBhY2thZ2VFbnRyaWVzLnNpemUoKTsKIAkJCWZvciAoaW50IGk9IDA7IGkgPCBuUGFja2FnZUVudHJpZXM7IGkrKykgewogCQkJCVBhY2thZ2VFbnRyeSBwYWNrPSAoUGFja2FnZUVudHJ5KSB0aGlzLnBhY2thZ2VFbnRyaWVzLmdldChpKTsKLQkJCQlpbnQgbkltcG9ydHM9IHBhY2suZ2V0TnVtYmVyT2ZJbXBvcnRzKCk7Ci0JCi0JCQkJaWYgKHRoaXMuZmlsdGVySW1wbGljaXRJbXBvcnRzICYmICFwYWNrLmlzU3RhdGljKCkgJiYgaXNJbXBsaWNpdEltcG9ydChwYWNrLmdldE5hbWUoKSwgdGhpcy5jb21waWxhdGlvblVuaXQpKSB7Ci0JCQkJCXBhY2sucmVtb3ZlQWxsTmV3KG9uRGVtYW5kQ29uZmxpY3RzKTsKLQkJCQkJbkltcG9ydHM9IHBhY2suZ2V0TnVtYmVyT2ZJbXBvcnRzKCk7CisJCQkJaWYgKHRoaXMuZmlsdGVySW1wbGljaXRJbXBvcnRzICYmICFwYWNrLmlzU3RhdGljKCkgJiYgaXNJbXBsaWNpdEltcG9ydChwYWNrLmdldE5hbWUoKSkpIHsKKwkJCQkJcGFjay5maWx0ZXJJbXBsaWNpdEltcG9ydHModGhpcy51c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMpOwogCQkJCX0KKwkJCQlpbnQgbkltcG9ydHM9IHBhY2suZ2V0TnVtYmVyT2ZJbXBvcnRzKCk7CiAJCQkJaWYgKG5JbXBvcnRzID09IDApIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQotCQkJCQogCiAJCQkJaWYgKHNwYWNlc0JldHdlZW5Hcm91cHMgPiAwKSB7CiAJCQkJCS8vIGFkZCBhIHNwYWNlIGJldHdlZW4gdHdvIGRpZmZlcmVudCBncm91cHMgYnkgbG9va2luZyBhdCB0aGUgdHdvIGFkamFjZW50IGltcG9ydHMKQEAgLTU0Miw0MCArNjExLDU1IEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJbGFzdFBhY2thZ2U9IHBhY2s7Ci0JCQkJCisKIAkJCQlib29sZWFuIGlzU3RhdGljPSBwYWNrLmlzU3RhdGljKCk7Ci0JCQkJaW50IHRocmVzaG9sZD0gaXNTdGF0aWMgPyBzdGF0aWNJbXBvcnRPbkRlbWFuZFRocmVzaG9sZCA6IGltcG9ydE9uRGVtYW5kVGhyZXNob2xkOwotCQkJCQorCQkJCWludCB0aHJlc2hvbGQ9IGlzU3RhdGljID8gdGhpcy5zdGF0aWNJbXBvcnRPbkRlbWFuZFRocmVzaG9sZCA6IHRoaXMuaW1wb3J0T25EZW1hbmRUaHJlc2hvbGQ7CisKIAkJCQlib29sZWFuIGRvU3RhckltcG9ydD0gcGFjay5oYXNTdGFySW1wb3J0KHRocmVzaG9sZCwgb25EZW1hbmRDb25mbGljdHMpOwogCQkJCWlmIChkb1N0YXJJbXBvcnQgJiYgKHBhY2suZmluZCgiKiIpID09IG51bGwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHN0YXJJbXBvcnRTdHJpbmc9IHBhY2suZ2V0TmFtZSgpICsgIi4qIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgc3RyPSBnZXROZXdJbXBvcnRTdHJpbmcoc3RhckltcG9ydFN0cmluZywgaXNTdGF0aWMsIGxpbmVEZWxpbSk7Ci0JCQkJCXN0cmluZ3NUb0luc2VydC5hZGQoc3RyKTsKKwkJCQkJU3RyaW5nW10gaW1wb3J0cyA9IGdldE5ld0ltcG9ydFN0cmluZ3MocGFjaywgaXNTdGF0aWMsIGxpbmVEZWxpbSk7CisJCQkJCWZvciAoaW50IGogPSAwLCBtYXggPSBpbXBvcnRzLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7CisJCQkJCQlzdHJpbmdzVG9JbnNlcnQuYWRkKGltcG9ydHNbal0pOworCQkJCQl9CiAJCQkJfQotCQkJCQorCiAJCQkJZm9yIChpbnQgaz0gMDsgayA8IG5JbXBvcnRzOyBrKyspIHsKIAkJCQkJSW1wb3J0RGVjbEVudHJ5IGN1cnJEZWNsPSBwYWNrLmdldEltcG9ydEF0KGspOwogCQkJCQlJUmVnaW9uIHJlZ2lvbj0gY3VyckRlY2wuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCisKIAkJCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7IC8vIG5ldyBlbnRyeQogCQkJCQkJaWYgKCFkb1N0YXJJbXBvcnQgfHwgY3VyckRlY2wuaXNPbkRlbWFuZCgpIHx8IChvbkRlbWFuZENvbmZsaWN0cyAhPSBudWxsICYmIG9uRGVtYW5kQ29uZmxpY3RzLmNvbnRhaW5zKGN1cnJEZWNsLmdldFNpbXBsZU5hbWUoKSkpKSB7CiAJCQkJCQkJU3RyaW5nIHN0cj0gZ2V0TmV3SW1wb3J0U3RyaW5nKGN1cnJEZWNsLmdldEVsZW1lbnROYW1lKCksIGlzU3RhdGljLCBsaW5lRGVsaW0pOwogCQkJCQkJCXN0cmluZ3NUb0luc2VydC5hZGQoc3RyKTsKKwkJCQkJCX0gZWxzZSBpZiAoZG9TdGFySW1wb3J0ICYmICFjdXJyRGVjbC5pc09uRGVtYW5kKCkpIHsKKwkJCQkJCQlTdHJpbmcgc2ltcGxlTmFtZSA9IGN1cnJEZWNsLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7CisJCQkJCQkJaWYgKHNpbXBsZU5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7CisJCQkJCQkJCVN0cmluZyBzdHI9IGdldE5ld0ltcG9ydFN0cmluZyhjdXJyRGVjbC5nZXRFbGVtZW50TmFtZSgpLCBpc1N0YXRpYywgbGluZURlbGltKTsKKwkJCQkJCQkJaWYgKHN0cmluZ3NUb0luc2VydC5pbmRleE9mKHN0cikgPT0gLTEpIHsKKwkJCQkJCQkJCXN0cmluZ3NUb0luc2VydC5hZGQoc3RyKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghZG9TdGFySW1wb3J0IHx8IGN1cnJEZWNsLmlzT25EZW1hbmQoKSB8fCBvbkRlbWFuZENvbmZsaWN0cyA9PSBudWxsIHx8IG9uRGVtYW5kQ29uZmxpY3RzLmNvbnRhaW5zKGN1cnJEZWNsLmdldFNpbXBsZU5hbWUoKSkpIHsKLQkJCQkJCQlpbnQgb2Zmc2V0PSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJcmVtb3ZlQW5kSW5zZXJ0TmV3KGJ1ZmZlciwgY3VyclBvcywgb2Zmc2V0LCBzdHJpbmdzVG9JbnNlcnQsIHJlc0VkaXQpOwotCQkJCQkJCXN0cmluZ3NUb0luc2VydC5jbGVhcigpOwotCQkJCQkJCWN1cnJQb3M9IG9mZnNldCArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKKwkJCQkJfSBlbHNlIGlmICghZG9TdGFySW1wb3J0IHx8IGN1cnJEZWNsLmlzT25EZW1hbmQoKSB8fCBvbkRlbWFuZENvbmZsaWN0cyA9PSBudWxsIHx8IG9uRGVtYW5kQ29uZmxpY3RzLmNvbnRhaW5zKGN1cnJEZWNsLmdldFNpbXBsZU5hbWUoKSkpIHsKKwkJCQkJCWludCBvZmZzZXQ9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKKwkJCQkJCXJlbW92ZUFuZEluc2VydE5ldyhidWZmZXIsIGN1cnJQb3MsIG9mZnNldCwgc3RyaW5nc1RvSW5zZXJ0LCByZXNFZGl0KTsKKwkJCQkJCXN0cmluZ3NUb0luc2VydC5jbGVhcigpOworCQkJCQkJY3VyclBvcz0gb2Zmc2V0ICsgcmVnaW9uLmdldExlbmd0aCgpOworCQkJCQl9IGVsc2UgaWYgKGRvU3RhckltcG9ydCAmJiAhY3VyckRlY2wuaXNPbkRlbWFuZCgpKSB7CisJCQkJCQlTdHJpbmcgc2ltcGxlTmFtZSA9IGN1cnJEZWNsLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7CisJCQkJCQlpZiAoc2ltcGxlTmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKKwkJCQkJCQlTdHJpbmcgc3RyPSBnZXROZXdJbXBvcnRTdHJpbmcoY3VyckRlY2wuZ2V0RWxlbWVudE5hbWUoKSwgaXNTdGF0aWMsIGxpbmVEZWxpbSk7CisJCQkJCQkJaWYgKHN0cmluZ3NUb0luc2VydC5pbmRleE9mKHN0cikgPT0gLTEpIHsKKwkJCQkJCQkJc3RyaW5nc1RvSW5zZXJ0LmFkZChzdHIpOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlpbnQgZW5kPSBpbXBvcnRzU3RhcnQgKyBpbXBvcnRzTGVuOwogCQkJcmVtb3ZlQW5kSW5zZXJ0TmV3KGJ1ZmZlciwgY3VyclBvcywgZW5kLCBzdHJpbmdzVG9JbnNlcnQsIHJlc0VkaXQpOwotCQkJCisKIAkJCWlmIChpbXBvcnRzTGVuID09IDApIHsKIAkJCQlpZiAoIXRoaXMuaW1wb3J0c0NyZWF0ZWQuaXNFbXB0eSgpIHx8ICF0aGlzLnN0YXRpY0ltcG9ydHNDcmVhdGVkLmlzRW1wdHkoKSkgeyAvLyBuZXcgaW1wb3J0IGNvbnRhaW5lcgogCQkJCQlpZiAoKHRoaXMuZmxhZ3MgJiBGX05FRURTX1RSQUlMSU5HX0RFTElNKSAhPSAwKSB7CkBAIC02NDEsMTIgKzcyNSwxMiBAQAogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0JCisKIAlwcml2YXRlIFNldCBldmFsdWF0ZVN0YXJJbXBvcnRDb25mbGljdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJLy9sb25nIHN0YXJ0PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCisKIAkJZmluYWwgSGFzaFNldC8qU3RyaW5nKi8gb25EZW1hbmRDb25mbGljdHM9IG5ldyBIYXNoU2V0KCk7Ci0JCQorCiAJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHsgdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0SmF2YVByb2plY3QoKSB9KTsKIAogCQlBcnJheUxpc3QvKjxjaGFyW11bXT4qLyAgc3RhckltcG9ydFBhY2thZ2VzPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC02NTQsNyArNzM4LDcgQEAKIAkJaW50IG5QYWNrYWdlRW50cmllcz0gdGhpcy5wYWNrYWdlRW50cmllcy5zaXplKCk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBuUGFja2FnZUVudHJpZXM7IGkrKykgewogCQkJUGFja2FnZUVudHJ5IHBhY2s9IChQYWNrYWdlRW50cnkpIHRoaXMucGFja2FnZUVudHJpZXMuZ2V0KGkpOwotCQkJaWYgKCFwYWNrLmlzU3RhdGljKCkgJiYgcGFjay5oYXNTdGFySW1wb3J0KGltcG9ydE9uRGVtYW5kVGhyZXNob2xkLCBudWxsKSkgeworCQkJaWYgKCFwYWNrLmlzU3RhdGljKCkgJiYgcGFjay5oYXNTdGFySW1wb3J0KHRoaXMuaW1wb3J0T25EZW1hbmRUaHJlc2hvbGQsIG51bGwpKSB7CiAJCQkJc3RhckltcG9ydFBhY2thZ2VzLmFkZChwYWNrLmdldE5hbWUoKS50b0NoYXJBcnJheSgpKTsKIAkJCQlmb3IgKGludCBrPSAwOyBrIDwgcGFjay5nZXROdW1iZXJPZkltcG9ydHMoKTsgaysrKSB7CiAJCQkJCUltcG9ydERlY2xFbnRyeSBjdXJyPSBwYWNrLmdldEltcG9ydEF0KGspOwpAQCAtNjY3LDE2ICs3NTEsMTYgQEAKIAkJaWYgKHN0YXJJbXBvcnRQYWNrYWdlcy5pc0VtcHR5KCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCQorCiAJCXN0YXJJbXBvcnRQYWNrYWdlcy5hZGQodGhpcy5jb21waWxhdGlvblVuaXQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKIAkJc3RhckltcG9ydFBhY2thZ2VzLmFkZChKQVZBX0xBTkcudG9DaGFyQXJyYXkoKSk7Ci0JCQorCiAJCWNoYXJbXVtdIGFsbFBhY2thZ2VzPSAoY2hhcltdW10pIHN0YXJJbXBvcnRQYWNrYWdlcy50b0FycmF5KG5ldyBjaGFyW3N0YXJJbXBvcnRQYWNrYWdlcy5zaXplKCldW10pOwogCQljaGFyW11bXSBhbGxUeXBlcz0gKGNoYXJbXVtdKSBzaW1wbGVUeXBlTmFtZXMudG9BcnJheShuZXcgY2hhcltzaW1wbGVUeXBlTmFtZXMuc2l6ZSgpXVtdKTsKLQkJCisKIAkJVHlwZU5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yPSBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKSB7CiAJCQlIYXNoTWFwIGZvdW5kVHlwZXM9IG5ldyBIYXNoTWFwKCk7Ci0JCQkKKwogCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZUNvbnRhaW5lck5hbWUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMpIHsKIAkJCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQkJYnVmLmFwcGVuZChwYWNrYWdlTmFtZSk7CkBAIC02ODcsMTEgKzc3MSwxMSBAQAogCQkJCX0KIAkJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJCQl9Ci0JCQkKKwogCQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCkgewogCQkJCVN0cmluZyBuYW1lPSBuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lKTsKIAkJCQlTdHJpbmcgY29udGFpbmVyTmFtZT0gZ2V0VHlwZUNvbnRhaW5lck5hbWUocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcyk7Ci0JCQkJCisKIAkJCQlTdHJpbmcgb2xkQ29udGFpbmVyPSAoU3RyaW5nKSB0aGlzLmZvdW5kVHlwZXMucHV0KG5hbWUsIGNvbnRhaW5lck5hbWUpOwogCQkJCWlmIChvbGRDb250YWluZXIgIT0gbnVsbCAmJiAhb2xkQ29udGFpbmVyLmVxdWFscyhjb250YWluZXJOYW1lKSkgewogCQkJCQlvbkRlbWFuZENvbmZsaWN0cy5hZGQobmFtZSk7CkBAIC03MDEsNyArNzg1LDcgQEAKIAkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaEFsbFR5cGVOYW1lcyhhbGxQYWNrYWdlcywgYWxsVHlwZXMsIHNjb3BlLCByZXF1ZXN0b3IsIElKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBtb25pdG9yKTsKIAkJcmV0dXJuIG9uRGVtYW5kQ29uZmxpY3RzOwogCX0KLQkJCisKIAlwcml2YXRlIFN0cmluZyBnZXROZXdJbXBvcnRTdHJpbmcoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gaXNTdGF0aWMsIFN0cmluZyBsaW5lRGVsaW0pIHsKIAkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlidWYuYXBwZW5kKCJpbXBvcnQgIik7IC8vJE5PTi1OTFMtMSQKQEAgLTcwOSw5ICs3OTMsMTAgQEAKIAkJCWJ1Zi5hcHBlbmQoInN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCWJ1Zi5hcHBlbmQoaW1wb3J0TmFtZSk7CisJCWlmIChpbnNlcnRTcGFjZUJlZm9yZVNlbWljb2xvbigpKSBidWYuYXBwZW5kKCcgJyk7CiAJCWJ1Zi5hcHBlbmQoJzsnKTsKIAkJYnVmLmFwcGVuZChsaW5lRGVsaW0pOwotCQkKKwogCQlpZiAoaXNTdGF0aWMpIHsKIAkJCXRoaXMuc3RhdGljSW1wb3J0c0NyZWF0ZWQuYWRkKGltcG9ydE5hbWUpOwogCQl9IGVsc2UgewpAQCAtNzIwLDYgKzgwNSwyNSBAQAogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJfQogCQorCXByaXZhdGUgU3RyaW5nW10gZ2V0TmV3SW1wb3J0U3RyaW5ncyhQYWNrYWdlRW50cnkgcGFja2FnZUVudHJ5LCBib29sZWFuIGlzU3RhdGljLCBTdHJpbmcgbGluZURlbGltKSB7CisJCWJvb2xlYW4gaXNTdGFySW1wb3J0QWRkZWQgPSBmYWxzZTsKKwkJTGlzdCBhbGxJbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOworCQlpbnQgbkltcG9ydHMgPSBwYWNrYWdlRW50cnkuZ2V0TnVtYmVyT2ZJbXBvcnRzKCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBuSW1wb3J0czsgaSsrKSB7CisJCQlJbXBvcnREZWNsRW50cnkgY3Vycj0gcGFja2FnZUVudHJ5LmdldEltcG9ydEF0KGkpOworCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBjdXJyLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7CisJCQlpZiAoc2ltcGxlTmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKKwkJCQkvLyBtZW1iZXIgdHlwZSBpbXBvcnRzIC0gd2UgcHJlc2VydmUgaXQKKwkJCQlhbGxJbXBvcnRzLmFkZChnZXROZXdJbXBvcnRTdHJpbmcoY3Vyci5nZXRFbGVtZW50TmFtZSgpLCBpc1N0YXRpYywgbGluZURlbGltKSk7CisJCQl9IGVsc2UgaWYgKCFpc1N0YXJJbXBvcnRBZGRlZCkgeworCQkJCVN0cmluZyBzdGFySW1wb3J0U3RyaW5nPSBwYWNrYWdlRW50cnkuZ2V0TmFtZSgpICsgIi4qIjsgLy8kTk9OLU5MUy0xJAorCQkJCWFsbEltcG9ydHMuYWRkKGdldE5ld0ltcG9ydFN0cmluZyhzdGFySW1wb3J0U3RyaW5nLCBpc1N0YXRpYywgbGluZURlbGltKSk7CisJCQkJaXNTdGFySW1wb3J0QWRkZWQgPSB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiAoU3RyaW5nW10pIGFsbEltcG9ydHMudG9BcnJheShuZXcgU3RyaW5nW2FsbEltcG9ydHMuc2l6ZSgpXSk7CisJfQorCiAJcHJpdmF0ZSBzdGF0aWMgaW50IGdldEZpcnN0VHlwZUJlZ2luUG9zKENvbXBpbGF0aW9uVW5pdCByb290KSB7CiAJCUxpc3QgdHlwZXM9IHJvb3QudHlwZXMoKTsKIAkJaWYgKCF0eXBlcy5pc0VtcHR5KCkpIHsKQEAgLTcyNywzMSArODMxLDM1IEBACiAJCX0KIAkJcmV0dXJuIC0xOwogCX0KLQkKKwogCXByaXZhdGUgaW50IGdldFBhY2thZ2VTdGF0ZW1lbnRFbmRQb3MoQ29tcGlsYXRpb25Vbml0IHJvb3QpIHsKIAkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2tEZWNsPSByb290LmdldFBhY2thZ2UoKTsKIAkJaWYgKHBhY2tEZWNsICE9IG51bGwpIHsKLQkJCWludCBsaW5lQWZ0ZXJQYWNrYWdlPSByb290LmdldExpbmVOdW1iZXIocGFja0RlY2wuZ2V0U3RhcnRQb3NpdGlvbigpICsgcGFja0RlY2wuZ2V0TGVuZ3RoKCkpICsgMTsKLQkJCWludCBhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3M9IHJvb3QuZ2V0UG9zaXRpb24obGluZUFmdGVyUGFja2FnZSwgMCk7Ci0JCQlpZiAoYWZ0ZXJQYWNrYWdlU3RhdGVtZW50UG9zID49IDApIHsKLQkJCQlpbnQgZmlyc3RUeXBlUG9zPSBnZXRGaXJzdFR5cGVCZWdpblBvcyhyb290KTsKLQkJCQlpZiAoZmlyc3RUeXBlUG9zICE9IC0xICYmIGZpcnN0VHlwZVBvcyA8PSBhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3MpIHsKLQkJCQkJaWYgKGZpcnN0VHlwZVBvcyA8PSBhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3MpIHsKLQkJCQkJCXRoaXMuZmxhZ3MgfD0gRl9ORUVEU19UUkFJTElOR19ERUxJTTsKLQkJCQkJCWlmIChmaXJzdFR5cGVQb3MgPT0gYWZ0ZXJQYWNrYWdlU3RhdGVtZW50UG9zKSB7Ci0JCQkJCQkJdGhpcy5mbGFncyB8PSBGX05FRURTX0xFQURJTkdfREVMSU07Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmlyc3RUeXBlUG9zOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRoaXMuZmxhZ3MgfD0gRl9ORUVEU19MRUFESU5HX0RFTElNOwotCQkJCXJldHVybiBhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3M7IC8vIGluc2VydCBhIGxpbmUgYWZ0ZXIgYWZ0ZXIgcGFja2FnZSBzdGF0ZW1lbnQKKwkJCWludCBhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3M9IC0xOworCQkJaW50IGxpbmVOdW1iZXI9IHJvb3QuZ2V0TGluZU51bWJlcihwYWNrRGVjbC5nZXRTdGFydFBvc2l0aW9uKCkgKyBwYWNrRGVjbC5nZXRMZW5ndGgoKSk7CisJCQlpZiAobGluZU51bWJlciA+PSAwKSB7CisJCQkJaW50IGxpbmVBZnRlclBhY2thZ2U9IGxpbmVOdW1iZXIgKyAxOworCQkJCWFmdGVyUGFja2FnZVN0YXRlbWVudFBvcz0gcm9vdC5nZXRQb3NpdGlvbihsaW5lQWZ0ZXJQYWNrYWdlLCAwKTsKIAkJCX0KKwkJCWlmIChhZnRlclBhY2thZ2VTdGF0ZW1lbnRQb3MgPCAwKSB7CisJCQkJdGhpcy5mbGFnc3w9IEZfTkVFRFNfTEVBRElOR19ERUxJTTsKKwkJCQlyZXR1cm4gcGFja0RlY2wuZ2V0U3RhcnRQb3NpdGlvbigpICsgcGFja0RlY2wuZ2V0TGVuZ3RoKCk7CisJCQl9CisJCQlpbnQgZmlyc3RUeXBlUG9zPSBnZXRGaXJzdFR5cGVCZWdpblBvcyhyb290KTsKKwkJCWlmIChmaXJzdFR5cGVQb3MgIT0gLTEgJiYgZmlyc3RUeXBlUG9zIDw9IGFmdGVyUGFja2FnZVN0YXRlbWVudFBvcykgeworCQkJCXRoaXMuZmxhZ3N8PSBGX05FRURTX1RSQUlMSU5HX0RFTElNOworCQkJCWlmIChmaXJzdFR5cGVQb3MgPT0gYWZ0ZXJQYWNrYWdlU3RhdGVtZW50UG9zKSB7CisJCQkJCXRoaXMuZmxhZ3N8PSBGX05FRURTX0xFQURJTkdfREVMSU07CisJCQkJfQorCQkJCXJldHVybiBmaXJzdFR5cGVQb3M7CisJCQl9CisJCQl0aGlzLmZsYWdzfD0gRl9ORUVEU19MRUFESU5HX0RFTElNOworCQkJcmV0dXJuIGFmdGVyUGFja2FnZVN0YXRlbWVudFBvczsgLy8gaW5zZXJ0IGEgbGluZSBhZnRlciBhZnRlciBwYWNrYWdlIHN0YXRlbWVudAogCQl9CiAJCXRoaXMuZmxhZ3MgfD0gRl9ORUVEU19UUkFJTElOR19ERUxJTTsKIAkJcmV0dXJuIDA7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaW50IG5QYWNrYWdlcz0gdGhpcy5wYWNrYWdlRW50cmllcy5zaXplKCk7CiAJCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCkBAIC03NjIsMjUgKzg3MCwyNyBAQAogCQkJfQogCQkJYnVmLmFwcGVuZChlbnRyeS50b1N0cmluZygpKTsKIAkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW1wb3J0RGVjbEVudHJ5IHsKLQkJCisKIAkJcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7CiAJCXByaXZhdGUgSVJlZ2lvbiBzb3VyY2VSYW5nZTsKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU3RhdGljOwotCQkKLQkJcHVibGljIEltcG9ydERlY2xFbnRyeShTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNTdGF0aWMsIElSZWdpb24gc291cmNlUmFuZ2UpIHsKKwkJcHJpdmF0ZSBpbnQgY29udGFpbmVyTmFtZUxlbmd0aDsKKworCQlwdWJsaWMgSW1wb3J0RGVjbEVudHJ5KGludCBjb250YWluZXJOYW1lTGVuZ3RoLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNTdGF0aWMsIElSZWdpb24gc291cmNlUmFuZ2UpIHsKIAkJCXRoaXMuZWxlbWVudE5hbWU9IGVsZW1lbnROYW1lOwogCQkJdGhpcy5zb3VyY2VSYW5nZT0gc291cmNlUmFuZ2U7CiAJCQl0aGlzLmlzU3RhdGljPSBpc1N0YXRpYzsKKwkJCXRoaXMuY29udGFpbmVyTmFtZUxlbmd0aCA9IGNvbnRhaW5lck5hbWVMZW5ndGg7CiAJCX0KLQkJCQkKKwogCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewogCQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWU7CiAJCX0KLQkJCisKIAkJcHVibGljIGludCBjb21wYXJlVG8oU3RyaW5nIGZ1bGxOYW1lLCBib29sZWFuIGlzU3RhdGljSW1wb3J0KSB7CiAJCQlpbnQgY21wPSB0aGlzLmVsZW1lbnROYW1lLmNvbXBhcmVUbyhmdWxsTmFtZSk7CiAJCQlpZiAoY21wID09IDApIHsKQEAgLTc5MSw1OSArOTAxLDU0IEBACiAJCQl9CiAJCQlyZXR1cm4gY21wOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKIAkJCXJldHVybiBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZSh0aGlzLmVsZW1lbnROYW1lKTsKLQkJfQkJCisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKCkgeworCQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUuc3Vic3RyaW5nKHRoaXMuY29udGFpbmVyTmFtZUxlbmd0aCArIDEpOworCQl9CiAJCQogCQlwdWJsaWMgYm9vbGVhbiBpc09uRGVtYW5kKCkgewogCQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUgIT0gbnVsbCAmJiB0aGlzLmVsZW1lbnROYW1lLmVuZHNXaXRoKCIuKiIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CiAJCQlyZXR1cm4gdGhpcy5pc1N0YXRpYzsKIAkJfQotCQkJCisKIAkJcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7CiAJCQlyZXR1cm4gdGhpcy5zb3VyY2VSYW5nZSA9PSBudWxsOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKIAkJCXJldHVybiB0aGlzLmVsZW1lbnROYW1lID09IG51bGw7CiAJCX0KLQkJCisKIAkJcHVibGljIElSZWdpb24gZ2V0U291cmNlUmFuZ2UoKSB7CiAJCQlyZXR1cm4gdGhpcy5zb3VyY2VSYW5nZTsKIAkJfQotCQkJCQorCiAJfQotCQorCiAJLyoKIAkgKiBJbnRlcm5hbCBlbGVtZW50IGZvciB0aGUgaW1wb3J0IHN0cnVjdHVyZTogQSBjb250YWluZXIgZm9yIGltcG9ydHMKIAkgKiBvZiBhbGwgdHlwZXMgZnJvbSB0aGUgc2FtZSBwYWNrYWdlCiAJICovCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgUGFja2FnZUVudHJ5IHsKLQkJCi0JCXB1YmxpYyBzdGF0aWMgUGFja2FnZUVudHJ5IGNyZWF0ZU9uUGxhY2Vob2xkZXJFbnRyeShTdHJpbmcgcHJlZmVyZW5jZU9yZGVyKSB7Ci0JCQlpZiAocHJlZmVyZW5jZU9yZGVyLmxlbmd0aCgpID4gMCAmJiBwcmVmZXJlbmNlT3JkZXIuY2hhckF0KDApID09ICcjJykgewotCQkJCVN0cmluZyBjdXJyPSBwcmVmZXJlbmNlT3JkZXIuc3Vic3RyaW5nKDEpOwotCQkJCXJldHVybiBuZXcgUGFja2FnZUVudHJ5KGN1cnIsIGN1cnIsIHRydWUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBQYWNrYWdlRW50cnkocHJlZmVyZW5jZU9yZGVyLCBwcmVmZXJlbmNlT3JkZXIsIGZhbHNlKTsKLQkJfQotCQkKIAkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKIAkJcHJpdmF0ZSBBcnJheUxpc3QgaW1wb3J0RW50cmllczsKIAkJcHJpdmF0ZSBTdHJpbmcgZ3JvdXA7CiAJCXByaXZhdGUgYm9vbGVhbiBpc1N0YXRpYzsKLQkKKwogCQkvKioKIAkJICogQ29tbWVudCBwYWNrYWdlIGVudHJ5CiAJCSAqLwogCQlwdWJsaWMgUGFja2FnZUVudHJ5KCkgewogCQkJdGhpcygiISIsIG51bGwsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCS8qKgogCQkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGVudHJ5LiBlLmcuIG9yZy5lY2xpcHNlLmpkdC51aSwgY29udGFpbmluZyBpbXBvcnRzIGxpa2UKIAkJICogb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSS4KQEAgLTg1NiwxMSArOTYxLDExIEBACiAJCQl0aGlzLmdyb3VwPSBncm91cDsKIAkJCXRoaXMuaXNTdGF0aWM9IGlzU3RhdGljOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewogCQkJcmV0dXJuIHRoaXMuaXNTdGF0aWM7CiAJCX0KLQkJCisKIAkJcHVibGljIGludCBjb21wYXJlVG8oU3RyaW5nIG90aGVyTmFtZSwgYm9vbGVhbiBpc090aGVyU3RhdGljKSB7CiAJCQlpbnQgY21wPSB0aGlzLm5hbWUuY29tcGFyZVRvKG90aGVyTmFtZSk7CiAJCQlpZiAoY21wID09IDApIHsKQEAgLTg3MSw3ICs5NzYsNyBAQAogCQkJfQogCQkJcmV0dXJuIGNtcDsKIAkJfQotCQkJCQkJCisKIAkJcHVibGljIHZvaWQgc29ydEluKEltcG9ydERlY2xFbnRyeSBpbXApIHsKIAkJCVN0cmluZyBmdWxsSW1wb3J0TmFtZT0gaW1wLmdldEVsZW1lbnROYW1lKCk7CiAJCQlpbnQgaW5zZXJ0UG9zaXRpb249IC0xOwpAQCAtODkzLDEyICs5OTgsMTIgQEAKIAkJCQl0aGlzLmltcG9ydEVudHJpZXMuYWRkKGluc2VydFBvc2l0aW9uLCBpbXApOwogCQkJfQogCQl9Ci0JCQotCQkKKworCiAJCXB1YmxpYyB2b2lkIGFkZChJbXBvcnREZWNsRW50cnkgaW1wKSB7CiAJCQl0aGlzLmltcG9ydEVudHJpZXMuYWRkKGltcCk7CiAJCX0KLQkJCisKIAkJcHVibGljIEltcG9ydERlY2xFbnRyeSBmaW5kKFN0cmluZyBzaW1wbGVOYW1lKSB7CiAJCQlpbnQgbklucG9ydHM9IHRoaXMuaW1wb3J0RW50cmllcy5zaXplKCk7CiAJCQlmb3IgKGludCBpPSAwOyBpIDwgbklucG9ydHM7IGkrKykgewpAQCAtOTEwLDEyICsxMDE1LDEyIEBACiAJCQkJCQlpZiAoKGRvdFBvcyA9PSAtMSkgfHwgKGRvdFBvcyA+IDAgJiYgY3Vyck5hbWUuY2hhckF0KGRvdFBvcykgPT0gJy4nKSkgewogCQkJCQkJCXJldHVybiBjdXJyOwogCQkJCQkJfQotCQkJCQl9CQkJCQkJCisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoU3RyaW5nIGZ1bGxOYW1lLCBib29sZWFuIGlzU3RhdGljSW1wb3J0KSB7CiAJCQlpbnQgbklucG9ydHM9IHRoaXMuaW1wb3J0RW50cmllcy5zaXplKCk7CiAJCQlmb3IgKGludCBpPSAwOyBpIDwgbklucG9ydHM7IGkrKykgewpAQCAtOTI3LDIxICsxMDMyLDMwIEBACiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE5ldyhTZXQgb25EZW1hbmRDb25mbGljdHMpIHsKKworCQlwdWJsaWMgdm9pZCBmaWx0ZXJJbXBsaWNpdEltcG9ydHMoYm9vbGVhbiB1c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMpIHsKIAkJCWludCBuSW5wb3J0cz0gdGhpcy5pbXBvcnRFbnRyaWVzLnNpemUoKTsKIAkJCWZvciAoaW50IGk9IG5JbnBvcnRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJCQlJbXBvcnREZWNsRW50cnkgY3Vycj0gZ2V0SW1wb3J0QXQoaSk7Ci0JCQkJaWYgKGN1cnIuaXNOZXcoKSAvKiYmIChvbkRlbWFuZENvbmZsaWN0cyA9PSBudWxsIHx8IG9uRGVtYW5kQ29uZmxpY3RzLmNvbnRhaW5zKGN1cnIuZ2V0U2ltcGxlTmFtZSgpKSkqLykgewotCQkJCQl0aGlzLmltcG9ydEVudHJpZXMucmVtb3ZlKGkpOworCQkJCWlmIChjdXJyLmlzTmV3KCkpIHsKKwkJCQkJaWYgKCF1c2VDb250ZXh0VG9GaWx0ZXJJbXBsaWNpdEltcG9ydHMpIHsKKwkJCQkJCXRoaXMuaW1wb3J0RW50cmllcy5yZW1vdmUoaSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjdXJyLmdldEVsZW1lbnROYW1lKCk7CisJCQkJCQlpbnQgbGFzdEluZGV4T2YgPSBlbGVtZW50TmFtZS5sYXN0SW5kZXhPZignLicpOworCQkJCQkJYm9vbGVhbiBpbnRlcm5hbENsYXNzSW1wb3J0ID0gbGFzdEluZGV4T2YgPiBnZXROYW1lKCkubGVuZ3RoKCk7CisJCQkJCQlpZiAoIWludGVybmFsQ2xhc3NJbXBvcnQpIHsKKwkJCQkJCQl0aGlzLmltcG9ydEVudHJpZXMucmVtb3ZlKGkpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCXB1YmxpYyBJbXBvcnREZWNsRW50cnkgZ2V0SW1wb3J0QXQoaW50IGluZGV4KSB7CiAJCQlyZXR1cm4gKEltcG9ydERlY2xFbnRyeSkgdGhpcy5pbXBvcnRFbnRyaWVzLmdldChpbmRleCk7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gaGFzU3RhckltcG9ydChpbnQgdGhyZXNob2xkLCBTZXQgZXhwbGljaXRJbXBvcnRzKSB7CiAJCQlpZiAoaXNDb21tZW50KCkgfHwgaXNEZWZhdWx0UGFja2FnZSgpKSB7IC8vIGNhbiBub3Qgc3RhciBpbXBvcnQgZGVmYXVsdCBwYWNrYWdlCiAJCQkJcmV0dXJuIGZhbHNlOwpAQCAtOTYyLDQ3ICsxMDc2LDM5IEBACiAJCQl9CiAJCQlyZXR1cm4gKGNvdW50ID49IHRocmVzaG9sZCkgJiYgY29udGFpbnNOZXc7CiAJCX0KLQkJCisKIAkJcHVibGljIGludCBnZXROdW1iZXJPZkltcG9ydHMoKSB7CiAJCQlyZXR1cm4gdGhpcy5pbXBvcnRFbnRyaWVzLnNpemUoKTsKLQkJfQkKLQkJCQorCQl9CisKIAkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQkJcmV0dXJuIHRoaXMubmFtZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwSUQoKSB7CiAJCQlyZXR1cm4gdGhpcy5ncm91cDsKIAkJfQotCQkKKwogCQlwdWJsaWMgdm9pZCBzZXRHcm91cElEKFN0cmluZyBncm91cElEKSB7CiAJCQl0aGlzLmdyb3VwPSBncm91cElEOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIGlzU2FtZUdyb3VwKFBhY2thZ2VFbnRyeSBvdGhlcikgewogCQkJaWYgKHRoaXMuZ3JvdXAgPT0gbnVsbCkgewogCQkJCXJldHVybiBvdGhlci5nZXRHcm91cElEKCkgPT0gbnVsbDsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIHRoaXMuZ3JvdXAuZXF1YWxzKG90aGVyLmdldEdyb3VwSUQoKSkgJiYgKHRoaXMuaXNTdGF0aWMgPT0gb3RoZXIuaXNTdGF0aWMoKSk7CiAJCQl9Ci0JCX0JCQotCQkJCQotCQlwdWJsaWMgSW1wb3J0RGVjbEVudHJ5IGdldExhc3QoKSB7Ci0JCQlpbnQgbkltcG9ydHM9IGdldE51bWJlck9mSW1wb3J0cygpOwotCQkJaWYgKG5JbXBvcnRzID4gMCkgewotCQkJCXJldHVybiBnZXRJbXBvcnRBdChuSW1wb3J0cyAtIDEpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgewogCQkJcmV0dXJuICIhIi5lcXVhbHModGhpcy5uYW1lKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBhY2thZ2UoKSB7CiAJCQlyZXR1cm4gdGhpcy5uYW1lLmxlbmd0aCgpID09IDA7CiAJCX0KLQkJCisKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJCWlmIChpc0NvbW1lbnQoKSkgewpAQCAtMTAxMiwxMSArMTExOCwxMSBAQAogCQkJCWludCBuSW1wb3J0cz0gZ2V0TnVtYmVyT2ZJbXBvcnRzKCk7CiAJCQkJZm9yIChpbnQgaT0gMDsgaSA8IG5JbXBvcnRzOyBpKyspIHsKIAkJCQkJSW1wb3J0RGVjbEVudHJ5IGN1cnI9IGdldEltcG9ydEF0KGkpOwotCQkJCQlidWYuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlpZiAoY3Vyci5pc1N0YXRpYygpKSB7CiAJCQkJCQlidWYuYXBwZW5kKCJzdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQotCQkJCQlidWYuYXBwZW5kKGN1cnIuZ2V0U2ltcGxlTmFtZSgpKTsKKwkJCQkJYnVmLmFwcGVuZChjdXJyLmdldFR5cGVRdWFsaWZpZWROYW1lKCkpOwogCQkJCQlpZiAoY3Vyci5pc05ldygpKSB7CiAJCQkJCQlidWYuYXBwZW5kKCIgKG5ldykiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CkBAIC0xMDI1LDE0ICsxMTMxLDE0IEBACiAJCQl9CiAJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJCX0KLQl9CQotCQorCX0KKwogCXB1YmxpYyBTdHJpbmdbXSBnZXRDcmVhdGVkSW1wb3J0cygpIHsKIAkgICAgcmV0dXJuIChTdHJpbmdbXSkgdGhpcy5pbXBvcnRzQ3JlYXRlZC50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5pbXBvcnRzQ3JlYXRlZC5zaXplKCldKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nW10gZ2V0Q3JlYXRlZFN0YXRpY0ltcG9ydHMoKSB7CiAJICAgIHJldHVybiAoU3RyaW5nW10pIHRoaXMuc3RhdGljSW1wb3J0c0NyZWF0ZWQudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuc3RhdGljSW1wb3J0c0NyZWF0ZWQuc2l6ZSgpXSk7CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTGluZUNvbW1lbnRFbmRPZmZzZXRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTGluZUNvbW1lbnRFbmRPZmZzZXRzLmphdmEKaW5kZXggMmY4M2JmYi4uMDI2YjFjZiAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0xpbmVDb21tZW50RW5kT2Zmc2V0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9MaW5lQ29tbWVudEVuZE9mZnNldHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNSArMTksMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgTGluZUNvbW1lbnRFbmRPZmZzZXRzIHsKLQkKKwogCXByaXZhdGUgaW50W10gb2Zmc2V0czsKIAlwcml2YXRlIGZpbmFsIExpc3QgY29tbWVudExpc3Q7Ci0JCisKIAlwdWJsaWMgTGluZUNvbW1lbnRFbmRPZmZzZXRzKExpc3QgY29tbWVudExpc3QpIHsKIAkJdGhpcy5jb21tZW50TGlzdD0gY29tbWVudExpc3Q7CiAJCXRoaXMub2Zmc2V0cz0gbnVsbDsgLy8gY3JlYXRlIG9uIGRlbWFuZAogCX0KLQkKKwogCXByaXZhdGUgaW50W10gZ2V0T2Zmc2V0cygpIHsKIAkJaWYgKHRoaXMub2Zmc2V0cyA9PSBudWxsKSB7CiAJCQlpZiAodGhpcy5jb21tZW50TGlzdCAhPSBudWxsKSB7CkBAIC01NSwxOCArNTUsMTggQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5vZmZzZXRzOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzRW5kT2ZMaW5lQ29tbWVudChpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBvZmZzZXQgPj0gMCAmJiBBcnJheXMuYmluYXJ5U2VhcmNoKGdldE9mZnNldHMoKSwgb2Zmc2V0KSA+PSAwOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzRW5kT2ZMaW5lQ29tbWVudChpbnQgb2Zmc2V0LCBjaGFyW10gY29udGVudCkgewogCQlpZiAob2Zmc2V0IDwgMCB8fCAob2Zmc2V0IDwgY29udGVudC5sZW5ndGggJiYgIUluZGVudE1hbmlwdWxhdGlvbi5pc0xpbmVEZWxpbWl0ZXJDaGFyKGNvbnRlbnRbb2Zmc2V0XSkpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJcmV0dXJuIEFycmF5cy5iaW5hcnlTZWFyY2goZ2V0T2Zmc2V0cygpLCBvZmZzZXQpID49IDA7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gcmVtb3ZlKGludCBvZmZzZXQpIHsKIAkJaW50W10gb2Zmc2V0QXJyYXk9IGdldE9mZnNldHMoKTsgLy8gcmV0dXJucyB0aGUgc2hhcmVkIGFycmF5CiAJCWludCBpbmRleD0gQXJyYXlzLmJpbmFyeVNlYXJjaChvZmZzZXRBcnJheSwgb2Zmc2V0KTsKQEAgLTgxLDUgKzgxLDUgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTGluZUluZm9ybWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTGluZUluZm9ybWF0aW9uLmphdmEKaW5kZXggMDU1ZWUwOC4uMjAwZGI4MCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0xpbmVJbmZvcm1hdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9MaW5lSW5mb3JtYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxMCArMTYsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKIAogLyoqCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5lSW5mb3JtYXRpb24gewotCQorCiAJcHVibGljIHN0YXRpYyBMaW5lSW5mb3JtYXRpb24gY3JlYXRlKGZpbmFsIElEb2N1bWVudCBkb2MpIHsKIAkJcmV0dXJuIG5ldyBMaW5lSW5mb3JtYXRpb24oKSB7CiAJCQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7CkBAIC0zOSw3ICszOSw3IEBACiAJCQl9CiAJCX07CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBMaW5lSW5mb3JtYXRpb24gY3JlYXRlKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCXJldHVybiBuZXcgTGluZUluZm9ybWF0aW9uKCkgewogCQkJcHVibGljIGludCBnZXRMaW5lT2ZPZmZzZXQoaW50IG9mZnNldCkgewpAQCAtNTAsMTAgKzUwLDEwIEBACiAJCQl9CiAJCX07CiAJfQotCQotCQotCQorCisKKwogCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZU9mT2Zmc2V0KGludCBvZmZzZXQpOwogCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZU9mZnNldChpbnQgbGluZSk7Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9MaXN0UmV3cml0ZUV2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTGlzdFJld3JpdGVFdmVudC5qYXZhCmluZGV4IGI0MGNjMTYuLjdiYTlhMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9MaXN0UmV3cml0ZUV2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL0xpc3RSZXdyaXRlRXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwyMSArMTksMjEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBMaXN0UmV3cml0ZUV2ZW50IGV4dGVuZHMgUmV3cml0ZUV2ZW50IHsKLQkKKwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5FVz0gMTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBPTEQ9IDI7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQk9USD0gTkVXIHwgT0xEOwotCQorCiAJLyoqIG9yaWdpbmFsIGxpc3Qgb2YgJ0FTVE5vZGUnICovCiAJcHJpdmF0ZSBMaXN0IG9yaWdpbmFsTm9kZXM7CiAKIAkvKiogbGlzdCBvZiB0eXBlICdSZXdyaXRlRXZlbnQnICovCiAJcHJpdmF0ZSBMaXN0IGxpc3RFbnRyaWVzOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIExpc3RSZXdyaXRlRXZlbnQgZnJvbSB0aGUgb3JpZ2luYWwgQVNUTm9kZXMuIFRoZSByZXN1bHRpbmcgZXZlbnQKIAkgKiByZXByZXNlbnRzIHRoZSB1bm1vZGlmaWVkIGxpc3QuCi0JICogQHBhcmFtIG9yaWdpbmFsTm9kZXMgVGhlIG9yaWdpbmFsIG5vZGVzICh0eXBlIEFTVE5vZGUpIAorCSAqIEBwYXJhbSBvcmlnaW5hbE5vZGVzIFRoZSBvcmlnaW5hbCBub2RlcyAodHlwZSBBU1ROb2RlKQogCSAqLwogCXB1YmxpYyBMaXN0UmV3cml0ZUV2ZW50KExpc3Qgb3JpZ2luYWxOb2RlcykgewogCQl0aGlzLm9yaWdpbmFsTm9kZXM9IG5ldyBBcnJheUxpc3Qob3JpZ2luYWxOb2Rlcyk7CkBAIC01NCw3ICs1NCw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIExpc3QgZ2V0RW50cmllcygpIHsKIAkJaWYgKHRoaXMubGlzdEVudHJpZXMgPT0gbnVsbCkgewogCQkJLy8gY3JlYXRlIGlmIG5vdCB5ZXQgZXhpc3RpbmcKQEAgLTY4LDcgKzY4LDcgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5saXN0RW50cmllczsKIAl9Ci0JCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5kb20uQVNUUmV3cml0ZUNoYW5nZSNnZXRDaGFuZ2VLaW5kKCkKIAkgKi8KQEAgLTkwLDcgKzkwLDcgQEAKIAlwdWJsaWMgYm9vbGVhbiBpc0xpc3RSZXdyaXRlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmRvbS5SZXdyaXRlRXZlbnQjZ2V0Q2hpbGRyZW4oKQogCSAqLwpAQCAtMTIwLDQxICsxMjAsNDUgQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gcmVzOwotCX0JCi0JCisJfQorCiAJLy8gQVBJIHRvIG1vZGlmeSB0aGUgbGlzdCBub2RlcwotCQorCiAJcHVibGljIFJld3JpdGVFdmVudCByZW1vdmVFbnRyeShBU1ROb2RlIG9yaWdpbmFsRW50cnkpIHsKIAkJcmV0dXJuIHJlcGxhY2VFbnRyeShvcmlnaW5hbEVudHJ5LCBudWxsKTsKIAl9Ci0JCi0JcHVibGljIFJld3JpdGVFdmVudCByZXBsYWNlRW50cnkoQVNUTm9kZSBvcmlnaW5hbEVudHJ5LCBBU1ROb2RlIG5ld0VudHJ5KSB7Ci0JCWlmIChvcmlnaW5hbEVudHJ5ID09IG51bGwpIHsKKworCXB1YmxpYyBSZXdyaXRlRXZlbnQgcmVwbGFjZUVudHJ5KEFTVE5vZGUgZW50cnksIEFTVE5vZGUgbmV3RW50cnkpIHsKKwkJaWYgKGVudHJ5ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQotCQkKKwogCQlMaXN0IGVudHJpZXM9IGdldEVudHJpZXMoKTsKIAkJaW50IG5FbnRyaWVzPSBlbnRyaWVzLnNpemUoKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IG5FbnRyaWVzOyBpKyspIHsKIAkJCU5vZGVSZXdyaXRlRXZlbnQgY3Vycj0gKE5vZGVSZXdyaXRlRXZlbnQpIGVudHJpZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnIuZ2V0T3JpZ2luYWxWYWx1ZSgpID09IG9yaWdpbmFsRW50cnkpIHsKKwkJCWlmIChjdXJyLmdldE9yaWdpbmFsVmFsdWUoKSA9PSBlbnRyeSB8fCBjdXJyLmdldE5ld1ZhbHVlKCkgPT0gZW50cnkpIHsKIAkJCQljdXJyLnNldE5ld1ZhbHVlKG5ld0VudHJ5KTsKKwkJCQlpZiAoY3Vyci5nZXROZXdWYWx1ZSgpID09IG51bGwgJiYgY3Vyci5nZXRPcmlnaW5hbFZhbHVlKCkgPT0gbnVsbCkgeyAvLyByZW1vdmVkIGFuIGluc2VydGVkIG5vZGUKKwkJCQkJZW50cmllcy5yZW1vdmUoaSk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KIAkJCQlyZXR1cm4gY3VycjsKIAkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXZlcnRDaGFuZ2UoTm9kZVJld3JpdGVFdmVudCBldmVudCkgewogCQlPYmplY3Qgb3JpZ2luYWxWYWx1ZSA9IGV2ZW50LmdldE9yaWdpbmFsVmFsdWUoKTsKLQkJaWYob3JpZ2luYWxWYWx1ZSA9PSBudWxsKSB7CisJCWlmIChvcmlnaW5hbFZhbHVlID09IG51bGwpIHsKIAkJCUxpc3QgZW50cmllcz0gZ2V0RW50cmllcygpOwogCQkJZW50cmllcy5yZW1vdmUoZXZlbnQpOwogCQl9IGVsc2UgewogCQkJZXZlbnQuc2V0TmV3VmFsdWUob3JpZ2luYWxWYWx1ZSk7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgaW50IGdldEluZGV4KEFTVE5vZGUgbm9kZSwgaW50IGtpbmQpIHsKIAkJTGlzdCBlbnRyaWVzPSBnZXRFbnRyaWVzKCk7CiAJCWZvciAoaW50IGk9IGVudHJpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTE2OCw3ICsxNzIsNyBAQAogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0JCQorCiAJcHVibGljIFJld3JpdGVFdmVudCBpbnNlcnQoQVNUTm9kZSBpbnNlcnRlZE5vZGUsIGludCBpbnNlcnRJbmRleCkgewogCQlOb2RlUmV3cml0ZUV2ZW50IGNoYW5nZT0gbmV3IE5vZGVSZXdyaXRlRXZlbnQobnVsbCwgaW5zZXJ0ZWROb2RlKTsKIAkJaWYgKGluc2VydEluZGV4ICE9IC0xKSB7CkBAIC0xNzgsMjMgKzE4MiwyMyBAQAogCQl9CiAJCXJldHVybiBjaGFuZ2U7CiAJfQotCQorCiAJcHVibGljIHZvaWQgc2V0TmV3VmFsdWUoQVNUTm9kZSBuZXdWYWx1ZSwgaW50IGluc2VydEluZGV4KSB7CiAJCU5vZGVSZXdyaXRlRXZlbnQgY3Vycj0gKE5vZGVSZXdyaXRlRXZlbnQpIGdldEVudHJpZXMoKS5nZXQoaW5zZXJ0SW5kZXgpOwogCQljdXJyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGdldENoYW5nZUtpbmQoaW50IGluZGV4KSB7CiAJCXJldHVybiAoKE5vZGVSZXdyaXRlRXZlbnQpIGdldEVudHJpZXMoKS5nZXQoaW5kZXgpKS5nZXRDaGFuZ2VLaW5kKCk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCiAJICovCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlidWYuYXBwZW5kKCIgW2xpc3QgY2hhbmdlXG5cdCIpOyAvLyROT04tTkxTLTEkCi0JCQorCiAJCVJld3JpdGVFdmVudFtdIGV2ZW50cz0gZ2V0Q2hpbGRyZW4oKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogCQkJaWYgKGkgIT0gMCkgewpAQCAtMjA3LDUgKzIxMSw1IEBACiAJfQogCiAKLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL05vZGVJbmZvU3RvcmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9Ob2RlSW5mb1N0b3JlLmphdmEKaW5kZXggOGE1MjIyZS4uYTFmMThjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL05vZGVJbmZvU3RvcmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTm9kZUluZm9TdG9yZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMwLDkgKzMwLDkgQEAKIC8qKgogICoKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vZGVJbmZvU3RvcmUgewkKK3B1YmxpYyBmaW5hbCBjbGFzcyBOb2RlSW5mb1N0b3JlIHsKIAlwcml2YXRlIEFTVCBhc3Q7Ci0JCisKIAlwcml2YXRlIE1hcCBwbGFjZWhvbGRlck5vZGVzOwogCXByaXZhdGUgU2V0IGNvbGxhcHNlZE5vZGVzOwogCkBAIC01NCw3ICs1NCw3IEBACiAJCWRhdGEuY29kZT0gY29kZTsKIAkJc2V0UGxhY2Vob2xkZXJEYXRhKHBsYWNlaG9sZGVyLCBkYXRhKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBNYXJrcyBhIG5vZGUgYXMgYSBjb3B5IG9yIG1vdmUgdGFyZ2V0LiBUaGUgY29weSB0YXJnZXQgcmVwcmVzZW50cyBhIGNvcGllZCBub2RlIGF0IHRoZSB0YXJnZXQgKGNvcGllZCkgc2l0ZS4KIAkgKiBAcGFyYW0gdGFyZ2V0IFRoZSBub2RlIGF0IHRoZSB0YXJnZXQgc2l0ZS4gQ2FuIGJlIGEgcGxhY2Vob2xkZXIgbm9kZSBidXQgYWxzbyB0aGUgc291cmNlIG5vZGUgaXRzZWxmLgpAQCAtNjUsNyArNjUsNyBAQAogCQlkYXRhLmNvcHlTb3VyY2U9IGNvcHlTb3VyY2U7CiAJCXNldFBsYWNlaG9sZGVyRGF0YSh0YXJnZXQsIGRhdGEpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBwbGFjZWhvbGRlciBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCiAJICogQHBhcmFtIG5vZGVUeXBlIFR5cGUgb2YgdGhlIG5vZGUgdG8gY3JlYXRlLiBVc2UgdGhlIHR5cGUgY29uc3RhbnRzIGluIHtAbGluayBOb2RlSW5mb1N0b3JlfS4KQEAgLTk5LDEyICs5OSwxMiBAQAogCSAgICAgICAgcmV0dXJuIG51bGw7CiAJICAgIH0KICAJfQotCQotCQorCisKIAkvLyBjb2xsYXBzZWQgbm9kZXM6IGluIHNvdXJjZTogdXNlIG9uZSBub2RlIHRoYXQgcmVwcmVzZW50cyBtYW55OyB0byBiZSB1c2VkIGFzCiAJLy8gY29weS9tb3ZlIHNvdXJjZSBvciB0byByZXBsYWNlIGF0IG9uY2UuCiAJLy8gaW4gdGhlIHRhcmdldDogb25lIGJsb2NrIG5vZGUgdGhhdCBpcyBub3QgZmxhdHRlbmVkLgotCQorCiAJcHVibGljIEJsb2NrIGNyZWF0ZUNvbGxhcHNlUGxhY2Vob2xkZXIoKSB7CiAJCUJsb2NrIHBsYWNlSG9sZGVyPSB0aGlzLmFzdC5uZXdCbG9jaygpOwogCQlpZiAodGhpcy5jb2xsYXBzZWROb2RlcyA9PSBudWxsKSB7CkBAIC0xMTMsMzkgKzExMywzOSBAQAogCQl0aGlzLmNvbGxhcHNlZE5vZGVzLmFkZChwbGFjZUhvbGRlcik7CiAJCXJldHVybiBwbGFjZUhvbGRlcjsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbGxhcHNlZChBU1ROb2RlIG5vZGUpIHsKIAkJaWYgKHRoaXMuY29sbGFwc2VkTm9kZXMgIT0gbnVsbCkgewogCQkJcmV0dXJuIHRoaXMuY29sbGFwc2VkTm9kZXMuY29udGFpbnMobm9kZSk7CiAJCX0KLQkJcmV0dXJuIGZhbHNlOwkKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBPYmplY3QgZ2V0UGxhY2Vob2xkZXJEYXRhKEFTVE5vZGUgbm9kZSkgewogCQlpZiAodGhpcy5wbGFjZWhvbGRlck5vZGVzICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLnBsYWNlaG9sZGVyTm9kZXMuZ2V0KG5vZGUpOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHNldFBsYWNlaG9sZGVyRGF0YShBU1ROb2RlIG5vZGUsIFBsYWNlaG9sZGVyRGF0YSBkYXRhKSB7CiAJCWlmICh0aGlzLnBsYWNlaG9sZGVyTm9kZXMgPT0gbnVsbCkgewogCQkJdGhpcy5wbGFjZWhvbGRlck5vZGVzPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7CiAJCX0KLQkJdGhpcy5wbGFjZWhvbGRlck5vZGVzLnB1dChub2RlLCBkYXRhKTsJCQorCQl0aGlzLnBsYWNlaG9sZGVyTm9kZXMucHV0KG5vZGUsIGRhdGEpOwogCX0KLQkKKwogCXN0YXRpYyBjbGFzcyBQbGFjZWhvbGRlckRhdGEgewogCQkvLyBiYXNlIGNsYXNzCiAJfQotCQkJCisKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIENvcHlQbGFjZWhvbGRlckRhdGEgZXh0ZW5kcyBQbGFjZWhvbGRlckRhdGEgewogCQlwdWJsaWMgQ29weVNvdXJjZUluZm8gY29weVNvdXJjZTsKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCXJldHVybiAiW3BsYWNlaG9sZGVyICIgKyB0aGlzLmNvcHlTb3VyY2UgKyJdIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCX0KLQl9CQotCQorCX0KKwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3RyaW5nUGxhY2Vob2xkZXJEYXRhIGV4dGVuZHMgUGxhY2Vob2xkZXJEYXRhIHsKIAkJcHVibGljIFN0cmluZyBjb2RlOwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTU0LDcgKzE1NCw3IEBACiAJfQogCiAJLyoqCi0JICogCisJICoKIAkgKi8KIAlwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAkJdGhpcy5wbGFjZWhvbGRlck5vZGVzPSBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL05vZGVSZXdyaXRlRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9Ob2RlUmV3cml0ZUV2ZW50LmphdmEKaW5kZXggNDA2NTk5OC4uNDJiMTNjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL05vZGVSZXdyaXRlRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvTm9kZVJld3JpdGVFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDI5ICsxNiwyOSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIE5vZGVSZXdyaXRlRXZlbnQgZXh0ZW5kcyBSZXdyaXRlRXZlbnQgewotCQorCiAJcHJpdmF0ZSBPYmplY3Qgb3JpZ2luYWxWYWx1ZTsKIAlwcml2YXRlIE9iamVjdCBuZXdWYWx1ZTsKLQkJCisKIAlwdWJsaWMgTm9kZVJld3JpdGVFdmVudChPYmplY3Qgb3JpZ2luYWxWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXRoaXMub3JpZ2luYWxWYWx1ZT0gb3JpZ2luYWxWYWx1ZTsKIAkJdGhpcy5uZXdWYWx1ZT0gbmV3VmFsdWU7CiAJfQotCQkJCisKIAkvKioKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyB2YWx1ZS4KIAkgKi8KIAlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy5uZXdWYWx1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWdpbmFsIHZhbHVlLgogCSAqLwogCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKIAkJcmV0dXJuIHRoaXMub3JpZ2luYWxWYWx1ZTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmRvbS5SZXdyaXRlRXZlbnQjZ2V0Q2hhbmdlS2luZCgpCiAJICovCkBAIC01Nyw3ICs1Nyw3IEBACiAJCX0KIAkJcmV0dXJuIFJFUExBQ0VEOwogCX0KLQkJCisKIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuZG9tLlJld3JpdGVFdmVudCNpc0xpc3RSZXdyaXRlKCkKQEAgLTgwLDcgKzgwLDcgQEAKIAlwdWJsaWMgUmV3cml0ZUV2ZW50W10gZ2V0Q2hpbGRyZW4oKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogCSAqLwpAQCAtMTA5LDYgKzEwOSw2IEBACiAJCX0KIAkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogCX0KLQkKKwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvUmV3cml0ZUV2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvUmV3cml0ZUV2ZW50LmphdmEKaW5kZXggYTc5NGNlNC4uMjBkYzMyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1Jld3JpdGVFdmVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9SZXdyaXRlRXZlbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwyNSArMTUsMjUgQEAKICAqCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXdyaXRlRXZlbnQgewotCQorCiAJLyoqCiAJICogQ2hhbmdlIGtpbmQgdG8gZGVzY3JpYmUgdGhhdCB0aGUgZXZlbnQgaXMgYW4gaW5zZXJ0IGV2ZW50LgogCSAqIERvZXMgbm90IGFwcGx5IGZvciBsaXN0IGV2ZW50cy4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlRFRD0gMTsKLQkKKwogCS8qKgogCSAqIENoYW5nZSBraW5kIHRvIGRlc2NyaWJlIHRoYXQgdGhlIGV2ZW50IGlzIGFuIHJlbW92ZSBldmVudC4KIAkgKiBEb2VzIG5vdCBhcHBseSBmb3IgbGlzdCBldmVudHMuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRD0gMjsKLQkKKwogCS8qKgogCSAqIENoYW5nZSBraW5kIHRvIGRlc2NyaWJlIHRoYXQgdGhlIGV2ZW50IGlzIGFuIHJlcGxhY2UgZXZlbnQuCiAJICogRG9lcyBub3QgYXBwbHkgZm9yIGxpc3QgZXZlbnRzLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VEPSA0OwotCQorCiAJLyoqCiAJICogQ2hhbmdlIGtpbmQgdG8gc2lnbmFsIHRoYXQgY2hpbGRyZW4gY2hhbmdlZC4gRG9lcyBvbmx5IGFwcGx5IGZvciBsaXN0IGV2ZW50cy4KIAkgKi8KQEAgLTQzLDIzICs0MywyMyBAQAogCSAqIENoYW5nZSBraW5kIHRvIHNpZ25hbCB0aGF0IHRoZSBwcm9wZXJ0eSBkaWQgbm90IGNoYW5nZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ0hBTkdFRD0gMDsKLQkKKwogCS8qKgogCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXZlbnQncyBjaGFuZ2Uga2luZC4KIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgaW50IGdldENoYW5nZUtpbmQoKTsKLQkKKwogCS8qKgogCSAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhIGxpc3QgZXZlbnQuCiAJICovCiAJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMaXN0UmV3cml0ZSgpOwotCQorCiAJLyoqCiAJICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmlnaW5hbCB2YWx1ZS4gRm9yIGxpc3RzIHRoaXMgaXMgYSA8Y29kZT5MaXN0PGNvZGU+IG9mIEFTVE5vZGUncywgZm9yIG5vbi1saXN0CiAJICogZXZlbnRzIHRoaXMgY2FuIGJlIGFuIEFTVE5vZGUgKGZvciBub2RlIHByb3BlcnRpZXMpLCBJbnRlZ2VyIChmb3IgYW4gaW50ZWdlciBwcm9wZXJ0eSksCiAJICogQm9vbGVhbiAoZm9yIGJvb2xlYW4gbm9kZSBwcm9wZXJ0aWVzKSBvciBwcm9wZXJ0aWVzIGxpa2UgT3BlcmF0b3IuCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IGlzIGEgaW5zZXJ0IGV2ZW50LgotCSAqLwkKKwkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldE9yaWdpbmFsVmFsdWUoKTsKIAogCS8qKgpAQCAtNjcsMTMgKzY3LDEzIEBACiAJICogZXZlbnRzIHRoaXMgY2FuIGJlIGFuIEFTVE5vZGUgKGZvciBub2RlIHByb3BlcnRpZXMpLCBJbnRlZ2VyIChmb3IgYW4gaW50ZWdlciBwcm9wZXJ0eSksCiAJICogQm9vbGVhbiAoZm9yIGJvb2xlYW4gbm9kZSBwcm9wZXJ0aWVzKSBvciBwcm9wZXJ0aWVzIGxpa2UgT3BlcmF0b3IuCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IGlzIGEgcmVtb3ZlIGV2ZW50LgotCSAqLwkKKwkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldE5ld1ZhbHVlKCk7Ci0JCisKIAkvKioKIAkgKiBAcmV0dXJuIFJldHVybiB0aGUgZXZlbnRzIGRlc2NyaWJpbmcgdGhlIGNoYW5nZXMgaW4gYSBsaXN0LiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQogCSAqIGV2ZW50IGlzIG5vdCBhIGxpc3QgZXZlbnQuCiAJICovCiAJcHVibGljIGFic3RyYWN0IFJld3JpdGVFdmVudFtdIGdldENoaWxkcmVuKCk7Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9SZXdyaXRlRXZlbnRTdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1Jld3JpdGVFdmVudFN0b3JlLmphdmEKaW5kZXggM2M1MWJiYi4uNjU4MDViYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1Jld3JpdGVFdmVudFN0b3JlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1Jld3JpdGVFdmVudFN0b3JlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsMTIgKzI1LDEyIEBACiAgKiBhcmUgY29weSBvciBtb3ZlIHNvdXJjZXMgb3IgdHJhY2tlZC4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFJld3JpdGVFdmVudFN0b3JlIHsKLQkKKwogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUxvY2F0aW9uIHsKIAkJcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIHBhcmVudDsKIAkJcHJpdmF0ZSBmaW5hbCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5OwotCQkKKwogCQlwdWJsaWMgUHJvcGVydHlMb2NhdGlvbihBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgewogCQkJdGhpcy5wYXJlbnQ9IHBhcmVudDsKIAkJCXRoaXMucHJvcGVydHk9IHByb3BlcnR5OwpAQCAtNDMsMjEgKzQzLDIxIEBACiAJCXB1YmxpYyBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5KCkgewogCQkJcmV0dXJuIHRoaXMucHJvcGVydHk7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogIT0gbnVsbCAmJiBvYmouZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy5nZXRDbGFzcygpKSkgeworCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iai5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgewogCQkJCVByb3BlcnR5TG9jYXRpb24gb3RoZXI9IChQcm9wZXJ0eUxvY2F0aW9uKSBvYmo7CiAJCQkJcmV0dXJuIG90aGVyLmdldFBhcmVudCgpLmVxdWFscyhnZXRQYXJlbnQoKSkgJiYgb3RoZXIuZ2V0UHJvcGVydHkoKS5lcXVhbHMoZ2V0UHJvcGVydHkoKSk7CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJCisKIAkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJCXJldHVybiBnZXRQYXJlbnQoKS5oYXNoQ29kZSgpICsgZ2V0UHJvcGVydHkoKS5oYXNoQ29kZSgpOwogCQl9Ci0JCQorCiAJfQotCQorCiAJLyoqCiAJICogSW50ZXJmYWNlIHRoYXQgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSB3YXkgaG93IGNoaWxkcmVuIGFyZSBhY2Nlc3NlZCBmcm9tCiAJICogYSBwYXJlbnQuIFVzZSB0aGlzIGludGVyZmFjZSB3aGVuIHRoZSByZXdyaXRlciBpcyBzZXQgdXAgb24gYW4gYWxyZWFkeQpAQCAtNjUsMTQgKzY1LDE0IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSU5vZGVQcm9wZXJ0eU1hcHBlciB7CiAJCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBub2RlIGF0dHJpYnV0ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBuYW1lLiAKKwkJICogUmV0dXJucyB0aGUgbm9kZSBhdHRyaWJ1dGUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZS4KIAkJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG5vZGUKLQkJICogQHBhcmFtIGNoaWxkUHJvcGVydHkgVGhlIGNoaWxkIHByb3BlcnR5IHRvIGFjY2VzcyAKKwkJICogQHBhcmFtIGNoaWxkUHJvcGVydHkgVGhlIGNoaWxkIHByb3BlcnR5IHRvIGFjY2VzcwogCQkgKiBAcmV0dXJuIFRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBwcm9wZXJ0eSBsb2NhdGlvbi4KIAkJICovCiAJCU9iamVjdCBnZXRPcmlnaW5hbFZhbHVlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHkpOwogCX0KLQkKKwogCS8qCiAJICogU3RvcmUgZWxlbWVudCB0byBhc3NvY2lhdGUgZXZlbnQgYW5kIG5vZGUgcG9zaXRpb24vCiAJICovCkBAIC04MCwxMyArODAsMTMgQEAKIAkJcHVibGljIGZpbmFsIEFTVE5vZGUgcGFyZW50OwogCQlwdWJsaWMgZmluYWwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZFByb3BlcnR5OwogCQlwdWJsaWMgZmluYWwgUmV3cml0ZUV2ZW50IGV2ZW50OwotCQkKKwogCQlwdWJsaWMgRXZlbnRIb2xkZXIoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgY2hpbGRQcm9wZXJ0eSwgUmV3cml0ZUV2ZW50IGNoYW5nZSkgewogCQkJdGhpcy5wYXJlbnQ9IHBhcmVudDsKIAkJCXRoaXMuY2hpbGRQcm9wZXJ0eT0gY2hpbGRQcm9wZXJ0eTsKIAkJCXRoaXMuZXZlbnQ9IGNoYW5nZTsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQkJYnVmLmFwcGVuZCh0aGlzLnBhcmVudCkuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJApAQCAtOTUsMjYgKzk1LDI2IEBACiAJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGNsYXNzIENvcHlTb3VyY2VJbmZvIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CiAJCXB1YmxpYyBmaW5hbCBQcm9wZXJ0eUxvY2F0aW9uIGxvY2F0aW9uOyAvLyBjYW4gYmUgbnVsbCwgb25seSB1c2VkIHRvIG1hcmsgYXMgcmVtb3ZlZCBvbiBtb3ZlCiAJCXByaXZhdGUgZmluYWwgQVNUTm9kZSBub2RlOwogCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc01vdmU7Ci0JCQorCiAJCXB1YmxpYyBDb3B5U291cmNlSW5mbyhQcm9wZXJ0eUxvY2F0aW9uIGxvY2F0aW9uLCBBU1ROb2RlIG5vZGUsIGJvb2xlYW4gaXNNb3ZlKSB7CiAJCQl0aGlzLmxvY2F0aW9uPSBsb2NhdGlvbjsKIAkJCXRoaXMubm9kZT0gbm9kZTsKIAkJCXRoaXMuaXNNb3ZlPSBpc01vdmU7CiAJCX0KLQkJCisKIAkJcHVibGljIEFTVE5vZGUgZ2V0Tm9kZSgpIHsKIAkJCXJldHVybiB0aGlzLm5vZGU7CiAJCX0KLQkJCisKIAkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8yKSB7CiAJCQlDb3B5U291cmNlSW5mbyByMj0gKENvcHlTb3VyY2VJbmZvKSBvMjsKLQkJCi0JCQlpbnQgc3RhcnREaWZmPSB0aGlzLmdldE5vZGUoKS5nZXRTdGFydFBvc2l0aW9uKCkgLSByMi5nZXROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpOworCisJCQlpbnQgc3RhcnREaWZmPSBnZXROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpIC0gcjIuZ2V0Tm9kZSgpLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCWlmIChzdGFydERpZmYgIT0gMCkgewogCQkJCXJldHVybiBzdGFydERpZmY7IC8vIGluc2VydCBiZWZvcmUgaWYgc3RhcnQgbm9kZSBpcyBmaXJzdAogCQkJfQpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQkJaWYgKHRoaXMuaXNNb3ZlKSB7CkBAIC0xMzYsMTQgKzEzNiwxNCBAQAogCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVJhbmdlSW5mbyBpbXBsZW1lbnRzIENvbXBhcmFibGUgewogCQlwcml2YXRlIGZpbmFsIEFTVE5vZGUgZmlyc3Q7CiAJCXByaXZhdGUgZmluYWwgQVNUTm9kZSBsYXN0OwogCQlwdWJsaWMgZmluYWwgQ29weVNvdXJjZUluZm8gY29weUluZm87IC8vIGNvbnRhaW5pbmcgdGhlIGludGVybmFsIHBsYWNlaG9sZGVyIGFuZCB0aGUgJ2lzTW92ZScgZmxhZwogCQlwdWJsaWMgZmluYWwgQVNUTm9kZSByZXBsYWNpbmdOb2RlOwogCQlwdWJsaWMgZmluYWwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXA7Ci0JCQorCiAJCXB1YmxpYyBOb2RlUmFuZ2VJbmZvKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHksIEFTVE5vZGUgZmlyc3QsIEFTVE5vZGUgbGFzdCwgQ29weVNvdXJjZUluZm8gY29weUluZm8sIEFTVE5vZGUgcmVwbGFjaW5nTm9kZSwgVGV4dEVkaXRHcm91cCBlZGl0R3JvdXApIHsKIAkJCXRoaXMuZmlyc3Q9IGZpcnN0OwogCQkJdGhpcy5sYXN0PSBsYXN0OwpAQCAtMTUxLDUwICsxNTEsNTAgQEAKIAkJCXRoaXMucmVwbGFjaW5nTm9kZT0gcmVwbGFjaW5nTm9kZTsKIAkJCXRoaXMuZWRpdEdyb3VwPSBlZGl0R3JvdXA7CiAJCX0KLQkJCisKIAkJcHVibGljIEFTVE5vZGUgZ2V0U3RhcnROb2RlKCkgewogCQkJcmV0dXJuIHRoaXMuZmlyc3Q7CiAJCX0KLQkJCisKIAkJcHVibGljIEFTVE5vZGUgZ2V0RW5kTm9kZSgpIHsKIAkJCXJldHVybiB0aGlzLmxhc3Q7CiAJCX0KLQkJCisKIAkJcHVibGljIGJvb2xlYW4gaXNNb3ZlKCkgewogCQkJcmV0dXJuIHRoaXMuY29weUluZm8uaXNNb3ZlOwogCQl9Ci0JCQorCiAJCXB1YmxpYyBCbG9jayBnZXRJbnRlcm5hbFBsYWNlaG9sZGVyKCkgewogCQkJcmV0dXJuIChCbG9jaykgdGhpcy5jb3B5SW5mby5nZXROb2RlKCk7CiAJCX0KLQkJCQkKKwogCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbzIpIHsKIAkJCU5vZGVSYW5nZUluZm8gcjI9IChOb2RlUmFuZ2VJbmZvKSBvMjsKLQkJCi0JCQlpbnQgc3RhcnREaWZmPSB0aGlzLmdldFN0YXJ0Tm9kZSgpLmdldFN0YXJ0UG9zaXRpb24oKSAtIHIyLmdldFN0YXJ0Tm9kZSgpLmdldFN0YXJ0UG9zaXRpb24oKTsKKworCQkJaW50IHN0YXJ0RGlmZj0gZ2V0U3RhcnROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpIC0gcjIuZ2V0U3RhcnROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJaWYgKHN0YXJ0RGlmZiAhPSAwKSB7CiAJCQkJcmV0dXJuIHN0YXJ0RGlmZjsgLy8gaW5zZXJ0IGJlZm9yZSBpZiBzdGFydCBub2RlIGlzIGZpcnN0CiAJCQl9Ci0JCQlpbnQgZW5kRGlmZj0gdGhpcy5nZXRFbmROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpIC0gcjIuZ2V0RW5kTm9kZSgpLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCWludCBlbmREaWZmPSBnZXRFbmROb2RlKCkuZ2V0U3RhcnRQb3NpdGlvbigpIC0gcjIuZ2V0RW5kTm9kZSgpLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCWlmIChlbmREaWZmICE9IDApIHsKIAkJCQlyZXR1cm4gLWVuZERpZmY7IC8vIGluc2VydCBiZWZvcmUgaWYgbGVuZ3RoIGlzIGxvbmdlcgogCQkJfQotCQkJaWYgKHIyLmlzTW92ZSgpICE9IHRoaXMuaXNNb3ZlKCkpIHsKLQkJCQlyZXR1cm4gdGhpcy5pc01vdmUoKSA/IC0xIDogMTsgLy8gZmlyc3QgbW92ZSB0aGVuIGNvcHkKKwkJCWlmIChyMi5pc01vdmUoKSAhPSBpc01vdmUoKSkgeworCQkJCXJldHVybiBpc01vdmUoKSA/IC0xIDogMTsgLy8gZmlyc3QgbW92ZSB0aGVuIGNvcHkKIAkJCX0KIAkJCXJldHVybiAwOwogCQl9Ci0JCQorCiAJCXB1YmxpYyB2b2lkIHVwZGF0ZVBsYWNlaG9sZGVyU291cmNlUmFuZ2VzKFRhcmdldFNvdXJjZVJhbmdlQ29tcHV0ZXIgc291cmNlUmFuZ2VDb21wdXRlcikgewogCQkJVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlci5Tb3VyY2VSYW5nZSBzdGFydFJhbmdlPSBzb3VyY2VSYW5nZUNvbXB1dGVyLmNvbXB1dGVTb3VyY2VSYW5nZShnZXRTdGFydE5vZGUoKSk7CiAJCQlUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyLlNvdXJjZVJhbmdlIGVuZFJhbmdlPSBzb3VyY2VSYW5nZUNvbXB1dGVyLmNvbXB1dGVTb3VyY2VSYW5nZShnZXRFbmROb2RlKCkpOwogCQkJaW50IHN0YXJ0UG9zPSBzdGFydFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJCWludCBlbmRQb3M9IGVuZFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSArIGVuZFJhbmdlLmdldExlbmd0aCgpOwotCQkJCisKIAkJCUJsb2NrIGludGVybmFsUGxhY2Vob2xkZXI9IGdldEludGVybmFsUGxhY2Vob2xkZXIoKTsKIAkJCWludGVybmFsUGxhY2Vob2xkZXIuc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyAtIHN0YXJ0UG9zKTsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQkJaWYgKHRoaXMuZmlyc3QgIT0gdGhpcy5sYXN0KSB7CkBAIC0yMTMsMTcgKzIxMywxNyBAQAogCiAKIAl9Ci0JCisKIAkvKioKLQkgKiBJdGVyYXRlcyBvdmVyIGFsbCBldmVudCBwYXJlbnQgbm9kZXMsIHRyYWNrZWQgbm9kZXMgYW5kIGFsbCBjb3B5L21vdmUgc291cmNlcyAKKwkgKiBJdGVyYXRlcyBvdmVyIGFsbCBldmVudCBwYXJlbnQgbm9kZXMsIHRyYWNrZWQgbm9kZXMgYW5kIGFsbCBjb3B5L21vdmUgc291cmNlcwogCSAqLwogCXByaXZhdGUgY2xhc3MgUGFyZW50SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCQorCiAJCXByaXZhdGUgSXRlcmF0b3IgZXZlbnRJdGVyOwogCQlwcml2YXRlIEl0ZXJhdG9yIHNvdXJjZU5vZGVJdGVyOwogCQlwcml2YXRlIEl0ZXJhdG9yIHJhbmdlTm9kZUl0ZXI7CiAJCXByaXZhdGUgSXRlcmF0b3IgdHJhY2tlZE5vZGVJdGVyOwotCQkKKwogCQlwdWJsaWMgUGFyZW50SXRlcmF0b3IoKSB7CiAJCQl0aGlzLmV2ZW50SXRlcj0gUmV3cml0ZUV2ZW50U3RvcmUudGhpcy5ldmVudExvb2t1cC5rZXlTZXQoKS5pdGVyYXRvcigpOwogCQkJaWYgKFJld3JpdGVFdmVudFN0b3JlLnRoaXMubm9kZUNvcHlTb3VyY2VzICE9IG51bGwpIHsKQEAgLTI3Myw1MyArMjczLDUzIEBACiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5FVz0gMTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBPUklHSU5BTD0gMjsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCT1RIPSBORVcgfCBPUklHSU5BTDsKLQkJCi0JCQorCisKIAkvKiogYWxsIGV2ZW50cyBieSBwYXJlbnQqLwogCWZpbmFsIE1hcCBldmVudExvb2t1cDsKLQkKKwogCS8qKiBjYWNoZSBmb3IgbGFzdCBhY2Nlc3NlZCBldmVudCAqLwogCXByaXZhdGUgRXZlbnRIb2xkZXIgbGFzdEV2ZW50OwotCQorCiAJLyoqIE1hcHMgZXZlbnRzIHRvIGdyb3VwIGRlc2NyaXB0aW9ucyAqLwogCXByaXZhdGUgTWFwIGVkaXRHcm91cHM7Ci0JCQorCiAJLyoqIFN0b3JlcyB3aGljaCBub2RlcyBhcmUgc291cmNlIG9mIGEgY29weSBvciBtb3ZlIChsaXN0IG9mIENvcHlTb3VyY2VJbmZvKSovCiAJTGlzdCBub2RlQ29weVNvdXJjZXM7Ci0JCisKIAkvKiogU3RvcmVzIG5vZGUgcmFuZ2VzIHRoYXQgYXJlIHVzZWQgdG8gY29weSBvciBtb3ZlIChtYXAgb2YgPFByb3BlcnR5TG9jYXRpb24sIENvcHlSYW5nZUluZm8+KSovCiAJTWFwIG5vZGVSYW5nZUluZm9zOwotCQorCiAJLyoqIFN0b3JlcyB3aGljaCBub2RlcyBhcmUgdHJhY2tlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBncm91cCovCiAJTWFwIHRyYWNrZWROb2RlczsKLQkKKwogCS8qKiBTdG9yZXMgd2hpY2ggaW5zZXJ0ZWQgbm9kZXMgYm91bmQgdG8gdGhlIHByZXZpb3VzIG5vZGUuIElmIG5vdCwgYSBub2RlIGlzCiAJICogYWx3YXlzIGJvdW5kIHRvIHRoZSBuZXh0IG5vZGUgKi8KIAlwcml2YXRlIFNldCBpbnNlcnRCb3VuZFRvUHJldmlvdXM7Ci0JCisKIAkvKiogb3B0aW9uYWwgbWFwcGVyIHRvIGFsbG93IGZpeCBhbHJlYWR5IG1vZGlmaWVkIEFTVCB0cmVlcyAqLwogCXByaXZhdGUgSU5vZGVQcm9wZXJ0eU1hcHBlciBub2RlUHJvcGVydHlNYXBwZXI7Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfUExBQ0VIT0xERVJfUFJPUEVSVFk9ICJyZXdyaXRlX2ludGVybmFsX3BsYWNlaG9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCQkKKwogCXB1YmxpYyBSZXdyaXRlRXZlbnRTdG9yZSgpIHsKIAkJdGhpcy5ldmVudExvb2t1cD0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5sYXN0RXZlbnQ9IG51bGw7Ci0JCQorCiAJCXRoaXMuZWRpdEdyb3Vwcz0gbnVsbDsgLy8gbGF6eSBpbml0aWFsaXphdGlvbgotCQkKKwogCQl0aGlzLnRyYWNrZWROb2Rlcz0gbnVsbDsKIAkJdGhpcy5pbnNlcnRCb3VuZFRvUHJldmlvdXM9IG51bGw7Ci0JCQorCiAJCXRoaXMubm9kZVByb3BlcnR5TWFwcGVyPSBudWxsOwogCQl0aGlzLm5vZGVDb3B5U291cmNlcz0gbnVsbDsKIAkJdGhpcy5ub2RlUmFuZ2VJbmZvcz0gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCB3YXkgaG93IHRvIGFjY2VzcyBjaGlsZHJlbiBmcm9tIGEgcGFyZW50IG5vZGUuCiAJICogQHBhcmFtIG5vZGVQcm9wZXJ0eU1hcHBlciBUaGUgbmV3IDxjb2RlPklOb2RlUHJvcGVydHlNYXBwZXI8L2NvZGU+IG9yCkBAIC0zMjgsMjYgKzMyOCwyNiBAQAogCXB1YmxpYyB2b2lkIHNldE5vZGVQcm9wZXJ0eU1hcHBlcihJTm9kZVByb3BlcnR5TWFwcGVyIG5vZGVQcm9wZXJ0eU1hcHBlcikgewogCQl0aGlzLm5vZGVQcm9wZXJ0eU1hcHBlcj0gbm9kZVByb3BlcnR5TWFwcGVyOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNsZWFyKCkgewogCQl0aGlzLmV2ZW50TG9va3VwLmNsZWFyKCk7CiAJCXRoaXMubGFzdEV2ZW50PSBudWxsOwogCQl0aGlzLnRyYWNrZWROb2Rlcz0gbnVsbDsKLQkJCisKIAkJdGhpcy5lZGl0R3JvdXBzPSBudWxsOyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCiAJCXRoaXMuaW5zZXJ0Qm91bmRUb1ByZXZpb3VzPSBudWxsOwogCQl0aGlzLm5vZGVDb3B5U291cmNlcz0gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBhZGRFdmVudChBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZFByb3BlcnR5LCBSZXdyaXRlRXZlbnQgZXZlbnQpIHsKIAkJdmFsaWRhdGVIYXNDaGlsZFByb3BlcnR5KHBhcmVudCwgY2hpbGRQcm9wZXJ0eSk7Ci0JCQorCiAJCWlmIChldmVudC5pc0xpc3RSZXdyaXRlKCkpIHsKIAkJCXZhbGlkYXRlSXNMaXN0UHJvcGVydHkoY2hpbGRQcm9wZXJ0eSk7CiAJCX0KLQkJCisKIAkJRXZlbnRIb2xkZXIgaG9sZGVyPSBuZXcgRXZlbnRIb2xkZXIocGFyZW50LCBjaGlsZFByb3BlcnR5LCBldmVudCk7Ci0JCQorCiAJCUxpc3QgZW50cmllc0xpc3QgPSAoTGlzdCkgdGhpcy5ldmVudExvb2t1cC5nZXQocGFyZW50KTsKIAkJaWYgKGVudHJpZXNMaXN0ICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGk9IDA7IGkgPCBlbnRyaWVzTGlzdC5zaXplKCk7IGkrKykgewpAQCAtMzY0LDE0ICszNjQsMTQgQEAKIAkJfQogCQllbnRyaWVzTGlzdC5hZGQoaG9sZGVyKTsKIAl9Ci0JCisKIAlwdWJsaWMgUmV3cml0ZUV2ZW50IGdldEV2ZW50KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCXZhbGlkYXRlSGFzQ2hpbGRQcm9wZXJ0eShwYXJlbnQsIHByb3BlcnR5KTsKLQkJCisKIAkJaWYgKHRoaXMubGFzdEV2ZW50ICE9IG51bGwgJiYgdGhpcy5sYXN0RXZlbnQucGFyZW50ID09IHBhcmVudCAmJiB0aGlzLmxhc3RFdmVudC5jaGlsZFByb3BlcnR5ID09IHByb3BlcnR5KSB7CiAJCQlyZXR1cm4gdGhpcy5sYXN0RXZlbnQuZXZlbnQ7CiAJCX0KLQkJCisKIAkJTGlzdCBlbnRyaWVzTGlzdCA9IChMaXN0KSB0aGlzLmV2ZW50TG9va3VwLmdldChwYXJlbnQpOwogCQlpZiAoZW50cmllc0xpc3QgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVudHJpZXNMaXN0LnNpemUoKTsgaSsrKSB7CkBAIC0zODQsNyArMzg0LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgTm9kZVJld3JpdGVFdmVudCBnZXROb2RlRXZlbnQoQVNUTm9kZSBwYXJlbnQsIFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgY2hpbGRQcm9wZXJ0eSwgYm9vbGVhbiBmb3JjZUNyZWF0aW9uKSB7CiAJCXZhbGlkYXRlSXNOb2RlUHJvcGVydHkoY2hpbGRQcm9wZXJ0eSk7CiAJCU5vZGVSZXdyaXRlRXZlbnQgZXZlbnQ9IChOb2RlUmV3cml0ZUV2ZW50KSBnZXRFdmVudChwYXJlbnQsIGNoaWxkUHJvcGVydHkpOwpAQCAtMzkzLDkgKzM5Myw5IEBACiAJCQlldmVudD0gbmV3IE5vZGVSZXdyaXRlRXZlbnQob3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSk7CiAJCQlhZGRFdmVudChwYXJlbnQsIGNoaWxkUHJvcGVydHksIGV2ZW50KTsKIAkJfQotCQlyZXR1cm4gZXZlbnQ7CQkKKwkJcmV0dXJuIGV2ZW50OwogCX0KLQkKKwogCXB1YmxpYyBMaXN0UmV3cml0ZUV2ZW50IGdldExpc3RFdmVudChBU1ROb2RlIHBhcmVudCwgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZFByb3BlcnR5LCBib29sZWFuIGZvcmNlQ3JlYXRpb24pIHsKIAkJdmFsaWRhdGVJc0xpc3RQcm9wZXJ0eShjaGlsZFByb3BlcnR5KTsKIAkJTGlzdFJld3JpdGVFdmVudCBldmVudD0gKExpc3RSZXdyaXRlRXZlbnQpIGdldEV2ZW50KHBhcmVudCwgY2hpbGRQcm9wZXJ0eSk7CkBAIC00MDYsMTIgKzQwNiwxMiBAQAogCQl9CiAJCXJldHVybiBldmVudDsKIAl9Ci0JCisKIAlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hhbmdlUm9vdEl0ZXJhdG9yKCkgewogCQlyZXR1cm4gbmV3IFBhcmVudEl0ZXJhdG9yKCk7CiAJfQotCQotCQorCisKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkUHJvcGVydGllcyhBU1ROb2RlIHBhcmVudCkgewogCQlMaXN0IGVudHJpZXNMaXN0ID0gKExpc3QpIHRoaXMuZXZlbnRMb29rdXAuZ2V0KHBhcmVudCk7CiAJCWlmIChlbnRyaWVzTGlzdCAhPSBudWxsKSB7CkBAIC00MjQsNyArNDI0LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIFByb3BlcnR5TG9jYXRpb24gZ2V0UHJvcGVydHlMb2NhdGlvbihPYmplY3QgdmFsdWUsIGludCBraW5kKSB7CiAJCWZvciAoSXRlcmF0b3IgaXRlcj0gdGhpcy5ldmVudExvb2t1cC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKIAkJCUxpc3QgZXZlbnRzPSAoTGlzdCkgaXRlci5uZXh0KCk7CkBAIC00NDYsMTIgKzQ0NiwxMiBAQAogCQl9CiAJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFTVE5vZGUpIHsKIAkJCUFTVE5vZGUgbm9kZT0gKEFTVE5vZGUpIHZhbHVlOwotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxvY2F0aW9uKG5vZGUuZ2V0UGFyZW50KCksIG5vZGUuZ2V0TG9jYXRpb25JblBhcmVudCgpKTsgCisJCQlyZXR1cm4gbmV3IFByb3BlcnR5TG9jYXRpb24obm9kZS5nZXRQYXJlbnQoKSwgbm9kZS5nZXRMb2NhdGlvbkluUGFyZW50KCkpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKLQkKKworCiAJLyoqCiAJICogS2luZCBpcyBlaXRoZXIgT1JJR0lOQUwsIE5FVywgb3IgQk9USAogCSAqIEBwYXJhbSB2YWx1ZQpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIGlzTm9kZUluRXZlbnQoUmV3cml0ZUV2ZW50IGV2ZW50LCBPYmplY3QgdmFsdWUsIGludCBraW5kKSB7CiAJCWlmICgoKGtpbmQgJiBORVcpICE9IDApICYmIGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gdmFsdWUpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNDg4LDggKzQ4OCw4IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKLQkKKworCiAJcHVibGljIE9iamVjdCBnZXRPcmlnaW5hbFZhbHVlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsKSB7CkBAIC00OTcsNyArNDk3LDcgQEAKIAkJfQogCQlyZXR1cm4gYWNjZXNzT3JpZ2luYWxWYWx1ZShwYXJlbnQsIHByb3BlcnR5KTsKIAl9Ci0JCisKIAlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZ2V0RXZlbnQocGFyZW50LCBwcm9wZXJ0eSk7CiAJCWlmIChldmVudCAhPSBudWxsKSB7CkBAIC01MDYsNiArNTA2LDIxIEBACiAJCXJldHVybiBhY2Nlc3NPcmlnaW5hbFZhbHVlKHBhcmVudCwgcHJvcGVydHkpOwogCX0KIAkKKwlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VkUHJvcGVydGllRXZlbnRzKEFTVE5vZGUgcGFyZW50KSB7CisJCUxpc3QgY2hhbmdlZFByb3BlcnRpZXNFdmVudCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCisJCUxpc3QgZW50cmllc0xpc3QgPSAoTGlzdCkgdGhpcy5ldmVudExvb2t1cC5nZXQocGFyZW50KTsKKwkJaWYgKGVudHJpZXNMaXN0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGk9IDA7IGkgPCBlbnRyaWVzTGlzdC5zaXplKCk7IGkrKykgeworCQkJCUV2ZW50SG9sZGVyIGhvbGRlcj0gKEV2ZW50SG9sZGVyKSBlbnRyaWVzTGlzdC5nZXQoaSk7CisJCQkJaWYgKGhvbGRlci5ldmVudC5nZXRDaGFuZ2VLaW5kKCkgIT0gUmV3cml0ZUV2ZW50LlVOQ0hBTkdFRCkgeworCQkJCQljaGFuZ2VkUHJvcGVydGllc0V2ZW50LmFkZChob2xkZXIuZXZlbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gY2hhbmdlZFByb3BlcnRpZXNFdmVudDsKKwl9CisKIAlwdWJsaWMgaW50IGdldENoYW5nZUtpbmQoQVNUTm9kZSBub2RlKSB7CiAJCVJld3JpdGVFdmVudCBldmVudD0gZmluZEV2ZW50KG5vZGUsIE9SSUdJTkFMKTsKIAkJaWYgKGV2ZW50ICE9IG51bGwpIHsKQEAgLTUxMyw3ICs1MjgsNyBAQAogCQl9CiAJCXJldHVybiBSZXdyaXRlRXZlbnQuVU5DSEFOR0VEOwogCX0KLQkKKwogCS8qCiAJICogR2V0cyBhbiBvcmlnaW5hbCBjaGlsZCBmcm9tIHRoZSBBU1QuCiAJICogVGVtcG9yYXJpbHkgb3ZlcnJpZGRlbiB0byBwb3J0IHRoZSBvbGQgcmV3cml0ZXIgdG8gdGhlIG5ldyBpbmZyYXN0cnVjdHVyZS4KQEAgLTUyMiwzOSArNTM3LDM5IEBACiAJCWlmICh0aGlzLm5vZGVQcm9wZXJ0eU1hcHBlciAhPSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpcy5ub2RlUHJvcGVydHlNYXBwZXIuZ2V0T3JpZ2luYWxWYWx1ZShwYXJlbnQsIGNoaWxkUHJvcGVydHkpOwogCQl9Ci0JCQorCiAJCXJldHVybiBwYXJlbnQuZ2V0U3RydWN0dXJhbFByb3BlcnR5KGNoaWxkUHJvcGVydHkpOwotCX0JCi0JCisJfQorCiAJcHVibGljIFRleHRFZGl0R3JvdXAgZ2V0RXZlbnRFZGl0R3JvdXAoUmV3cml0ZUV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLmVkaXRHcm91cHMgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJcmV0dXJuIChUZXh0RWRpdEdyb3VwKSB0aGlzLmVkaXRHcm91cHMuZ2V0KGV2ZW50KTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBzZXRFdmVudEVkaXRHcm91cChSZXdyaXRlRXZlbnQgZXZlbnQsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7CiAJCWlmICh0aGlzLmVkaXRHcm91cHMgPT0gbnVsbCkgewogCQkJdGhpcy5lZGl0R3JvdXBzPSBuZXcgSWRlbnRpdHlIYXNoTWFwKDUpOwotCQl9CQorCQl9CiAJCXRoaXMuZWRpdEdyb3Vwcy5wdXQoZXZlbnQsIGVkaXRHcm91cCk7CiAJfQotCQotCQorCisKIAlwdWJsaWMgZmluYWwgVGV4dEVkaXRHcm91cCBnZXRUcmFja2VkTm9kZURhdGEoQVNUTm9kZSBub2RlKSB7CiAJCWlmICh0aGlzLnRyYWNrZWROb2RlcyAhPSBudWxsKSB7CiAJCQlyZXR1cm4gKFRleHRFZGl0R3JvdXApIHRoaXMudHJhY2tlZE5vZGVzLmdldChub2RlKTsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHNldFRyYWNrZWROb2RlRGF0YShBU1ROb2RlIG5vZGUsIFRleHRFZGl0R3JvdXAgZWRpdEdyb3VwKSB7CiAJCWlmICh0aGlzLnRyYWNrZWROb2RlcyA9PSBudWxsKSB7CiAJCQl0aGlzLnRyYWNrZWROb2Rlcz0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwogCQl9CiAJCXRoaXMudHJhY2tlZE5vZGVzLnB1dChub2RlLCBlZGl0R3JvdXApOwogCX0KLQkKKwogCS8qKgogCSAqIE1hcmtzIGEgbm9kZSBhcyB0cmFja2VkLiBUaGUgZWRpdHMgYWRkZWQgdG8gdGhlIGdyb3VwIGVkaXRHcm91cCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlCiAJICogcG9zaXRpb24gb2YgdGhlIG5vZGUgYWZ0ZXIgdGhlIHJld3JpdGUgb3BlcmF0aW9uLgpAQCAtNTY2LDM0ICs1ODEsMzQgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vZGUgaXMgYWxyZWFkeSBtYXJrZWQgYXMgdHJhY2tlZCIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJc2V0VHJhY2tlZE5vZGVEYXRhKG5vZGUsIGVkaXRHcm91cCk7Ci0JfQkKLQkKKwl9CisKIAlwcml2YXRlIGZpbmFsIENvcHlTb3VyY2VJbmZvIGNyZWF0ZUNvcHlTb3VyY2VJbmZvKFByb3BlcnR5TG9jYXRpb24gbG9jYXRpb24sIEFTVE5vZGUgbm9kZSwgYm9vbGVhbiBpc01vdmUpIHsKIAkJQ29weVNvdXJjZUluZm8gY29weVNvdXJjZT0gbmV3IENvcHlTb3VyY2VJbmZvKGxvY2F0aW9uLCBub2RlLCBpc01vdmUpOwotCQkKKwogCQlpZiAodGhpcy5ub2RlQ29weVNvdXJjZXMgPT0gbnVsbCkgewogCQkJdGhpcy5ub2RlQ29weVNvdXJjZXM9IG5ldyBBcnJheUxpc3QoKTsKIAkJfQogCQl0aGlzLm5vZGVDb3B5U291cmNlcy5hZGQoY29weVNvdXJjZSk7CiAJCXJldHVybiBjb3B5U291cmNlOwogCX0KLQkKKwogCXB1YmxpYyBmaW5hbCBDb3B5U291cmNlSW5mbyBtYXJrQXNDb3B5U291cmNlKEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBBU1ROb2RlIG5vZGUsIGJvb2xlYW4gaXNNb3ZlKSB7CiAJCXJldHVybiBjcmVhdGVDb3B5U291cmNlSW5mbyhuZXcgUHJvcGVydHlMb2NhdGlvbihwYXJlbnQsIHByb3BlcnR5KSwgbm9kZSwgaXNNb3ZlKTsKIAl9Ci0JCisKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JhbmdlQ29weVBsYWNlaG9sZGVyKEFTVE5vZGUgbm9kZSkgewogCQlyZXR1cm4gbm9kZS5nZXRQcm9wZXJ0eShJTlRFUk5BTF9QTEFDRUhPTERFUl9QUk9QRVJUWSkgIT0gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgZmluYWwgQ29weVNvdXJjZUluZm8gY3JlYXRlUmFuZ2VDb3B5KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHksIEFTVE5vZGUgZmlyc3QsIEFTVE5vZGUgbGFzdCwgYm9vbGVhbiBpc01vdmUsIEFTVE5vZGUgaW50ZXJuYWxQbGFjZWhvbGRlciwgQVNUTm9kZSByZXBsYWNpbmdOb2RlLCBUZXh0RWRpdEdyb3VwIGVkaXRHcm91cCkgewogCQlDb3B5U291cmNlSW5mbyBjb3B5SW5mbz0gY3JlYXRlQ29weVNvdXJjZUluZm8obnVsbCwgaW50ZXJuYWxQbGFjZWhvbGRlciwgaXNNb3ZlKTsKIAkJaW50ZXJuYWxQbGFjZWhvbGRlci5zZXRQcm9wZXJ0eShJTlRFUk5BTF9QTEFDRUhPTERFUl9QUk9QRVJUWSwgaW50ZXJuYWxQbGFjZWhvbGRlcik7Ci0JCQorCiAJCU5vZGVSYW5nZUluZm8gY29weVJhbmdlSW5mbz0gbmV3IE5vZGVSYW5nZUluZm8ocGFyZW50LCBjaGlsZFByb3BlcnR5LCBmaXJzdCwgbGFzdCwgY29weUluZm8sIHJlcGxhY2luZ05vZGUsIGVkaXRHcm91cCk7Ci0JCQorCiAJCUxpc3RSZXdyaXRlRXZlbnQgbGlzdEV2ZW50PSBnZXRMaXN0RXZlbnQocGFyZW50LCBjaGlsZFByb3BlcnR5LCB0cnVlKTsKLQkJCisKIAkJaW50IGluZGV4Rmlyc3Q9IGxpc3RFdmVudC5nZXRJbmRleChmaXJzdCwgTGlzdFJld3JpdGVFdmVudC5PTEQpOwogCQlpZiAoaW5kZXhGaXJzdCA9PSAtMSkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RhcnQgbm9kZSBpcyBub3QgYSBvcmlnaW5hbCBjaGlsZCBvZiB0aGUgZ2l2ZW4gbGlzdCIpOyAvLyROT04tTkxTLTEkCkBAIC02MDYsNyArNjIxLDcgQEAKIAkJaWYgKGluZGV4Rmlyc3QgPiBpbmRleExhc3QpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXJ0IG5vZGUgbXVzdCBiZSBiZWZvcmUgZW5kIG5vZGUiKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCWlmICh0aGlzLm5vZGVSYW5nZUluZm9zID09IG51bGwpIHsKIAkJCXRoaXMubm9kZVJhbmdlSW5mb3M9IG5ldyBIYXNoTWFwKCk7CiAJCX0KQEAgLTYxOSwxOSArNjM0LDE5IEBACiAJCQlhc3NlcnROb092ZXJsYXAobGlzdEV2ZW50LCBpbmRleEZpcnN0LCBpbmRleExhc3QsIGlubmVyTGlzdCk7CiAJCX0KIAkJaW5uZXJMaXN0LmFkZChjb3B5UmFuZ2VJbmZvKTsKLQkJCi0JCQorCisKIAkJcmV0dXJuIGNvcHlJbmZvOwogCX0KLQkKKwogCXB1YmxpYyBDb3B5U291cmNlSW5mb1tdIGdldE5vZGVDb3B5U291cmNlcyhBU1ROb2RlIG5vZGUpIHsKIAkJaWYgKHRoaXMubm9kZUNvcHlTb3VyY2VzID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJCXJldHVybiBpbnRlcm5hbEdldENvcHlTb3VyY2VzKHRoaXMubm9kZUNvcHlTb3VyY2VzLCBub2RlKTsKIAl9Ci0JCi0JCisKKwogCXB1YmxpYyBDb3B5U291cmNlSW5mb1tdIGludGVybmFsR2V0Q29weVNvdXJjZXMoTGlzdCBjb3B5U291cmNlcywgQVNUTm9kZSBub2RlKSB7CiAJCUFycmF5TGlzdCByZXM9IG5ldyBBcnJheUxpc3QoMyk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBjb3B5U291cmNlcy5zaXplKCk7IGkrKykgewpAQCAtNjQzLDEzICs2NTgsMTMgQEAKIAkJaWYgKHJlcy5pc0VtcHR5KCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCQorCiAJCUNvcHlTb3VyY2VJbmZvW10gYXJyPSAoQ29weVNvdXJjZUluZm9bXSkgcmVzLnRvQXJyYXkobmV3IENvcHlTb3VyY2VJbmZvW3Jlcy5zaXplKCldKTsKIAkJQXJyYXlzLnNvcnQoYXJyKTsKIAkJcmV0dXJuIGFycjsKIAl9Ci0JCi0JCisKKwogCXByaXZhdGUgdm9pZCBhc3NlcnROb092ZXJsYXAoTGlzdFJld3JpdGVFdmVudCBsaXN0RXZlbnQsIGludCBpbmRleEZpcnN0LCBpbnQgaW5kZXhMYXN0LCBMaXN0IGlubmVyTGlzdCkgewogCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IGlubmVyTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKIAkJCU5vZGVSYW5nZUluZm8gY3Vycj0gKE5vZGVSYW5nZUluZm8pIGl0ZXIubmV4dCgpOwpAQCAtNjU3LDI3ICs2NzIsMjcgQEAKIAkJCWludCBjdXJyRW5kPSBsaXN0RXZlbnQuZ2V0SW5kZXgoY3Vyci5nZXRFbmROb2RlKCksIExpc3RSZXdyaXRlRXZlbnQuQk9USCk7CiAJCQlpZiAoY3VyclN0YXJ0IDwgaW5kZXhGaXJzdCAmJiBjdXJyRW5kIDwgaW5kZXhMYXN0ICYmIGN1cnJFbmQgPj0gaW5kZXhGaXJzdAogCQkJCQl8fCBjdXJyU3RhcnQgPiBpbmRleEZpcnN0ICYmIGN1cnJTdGFydCA8PSBjdXJyRW5kICYmIGN1cnJFbmQgPiBpbmRleExhc3QpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSYW5nZSBvdmVybGFwcHMgd2l0aCBhbiBleGlzdGluZyBjb3B5IG9yIG1vdmUgcmFuZ2UiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSYW5nZSBvdmVybGFwcHMgd2l0aCBhbiBleGlzdGluZyBjb3B5IG9yIG1vdmUgcmFuZ2UiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgcHJlcGFyZU1vdmVkTm9kZXMoVGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlciBzb3VyY2VSYW5nZUNvbXB1dGVyKSB7CiAJCWlmICh0aGlzLm5vZGVDb3B5U291cmNlcyAhPSBudWxsKSB7CiAJCQlwcmVwYXJlU2luZ2xlTm9kZUNvcGllcygpOwogCQl9Ci0JCQorCiAJCWlmICh0aGlzLm5vZGVSYW5nZUluZm9zICE9IG51bGwpIHsKIAkJCXByZXBhcmVOb2RlUmFuZ2VDb3BpZXMoc291cmNlUmFuZ2VDb21wdXRlcik7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCByZXZlcnRNb3ZlZE5vZGVzKCkgewogCQlpZiAodGhpcy5ub2RlUmFuZ2VJbmZvcyAhPSBudWxsKSB7CiAJCQlyZW1vdmVNb3ZlUmFuZ2VQbGFjZWhvbGRlcnMoKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCByZW1vdmVNb3ZlUmFuZ2VQbGFjZWhvbGRlcnMoKSB7CiAJCWZvciAoSXRlcmF0b3IgaXRlcj0gdGhpcy5ub2RlUmFuZ2VJbmZvcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogCQkJTWFwLkVudHJ5IGVudHJ5PSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKQEAgLTY4NiwxNyArNzAxLDE3IEBACiAJCQlmb3IgKGludCBpPSAwOyBpIDwgcmFuZ2VJbmZvcy5zaXplKCk7IGkrKykgewogCQkJCXBsYWNlaG9sZGVycy5hZGQoKChOb2RlUmFuZ2VJbmZvKSByYW5nZUluZm9zLmdldChpKSkuZ2V0SW50ZXJuYWxQbGFjZWhvbGRlcigpKTsKIAkJCX0KLQkJCQorCiAJCQlQcm9wZXJ0eUxvY2F0aW9uIGxvYz0gKFByb3BlcnR5TG9jYXRpb24pIGVudHJ5LmdldEtleSgpOwotCQkJCisKIAkJCVJld3JpdGVFdmVudFtdIGNoaWxkcmVuPSBnZXRMaXN0RXZlbnQobG9jLmdldFBhcmVudCgpLCBsb2MuZ2V0UHJvcGVydHkoKSwgdHJ1ZSkuZ2V0Q2hpbGRyZW4oKTsKIAkJCUxpc3QgcmV2ZXJ0ZWRDaGlsZHJlbj0gbmV3IEFycmF5TGlzdCgpOwogCQkJcmV2ZXJ0TGlzdFdpdGhSYW5nZXMoY2hpbGRyZW4sIHBsYWNlaG9sZGVycywgcmV2ZXJ0ZWRDaGlsZHJlbik7CiAJCQlSZXdyaXRlRXZlbnRbXSByZXZlcnRlZENoaWxkcmVuQXJyPSAoUmV3cml0ZUV2ZW50W10pIHJldmVydGVkQ2hpbGRyZW4udG9BcnJheShuZXcgUmV3cml0ZUV2ZW50W3JldmVydGVkQ2hpbGRyZW4uc2l6ZSgpXSk7CiAJCQlhZGRFdmVudChsb2MuZ2V0UGFyZW50KCksIGxvYy5nZXRQcm9wZXJ0eSgpLCBuZXcgTGlzdFJld3JpdGVFdmVudChyZXZlcnRlZENoaWxkcmVuQXJyKSk7IC8vIHJlcGxhY2UgdGhlIGN1cnJlbnQgZWRpdHMKLQkJfQkKKwkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCByZXZlcnRMaXN0V2l0aFJhbmdlcyhSZXdyaXRlRXZlbnRbXSBjaGlsZEV2ZW50cywgU2V0IHBsYWNlaG9sZGVycywgTGlzdCByZXZlcnRlZENoaWxkcmVuKSB7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZEV2ZW50cy5sZW5ndGg7IGkrKykgewogCQkJUmV3cml0ZUV2ZW50IGV2ZW50PSBjaGlsZEV2ZW50c1tpXTsKQEAgLTcxNSwxMyArNzMwLDEzIEBACiAJCQlNYXAuRW50cnkgZW50cnk9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwogCQkJTGlzdCByYW5nZUluZm9zPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsgLy8gbGlzdCBvZiBDb3B5U291cmNlUmFuZ2UKIAkJCUNvbGxlY3Rpb25zLnNvcnQocmFuZ2VJbmZvcyk7IC8vIHNvcnQgYnkgc3RhcnQgaW5kZXgsIGxlbmd0aCwgbW92ZSBvciBjb3B5Ci0JCQkKKwogCQkJUHJvcGVydHlMb2NhdGlvbiBsb2M9IChQcm9wZXJ0eUxvY2F0aW9uKSBlbnRyeS5nZXRLZXkoKTsKIAkJCVJld3JpdGVFdmVudFtdIGNoaWxkcmVuPSBnZXRMaXN0RXZlbnQobG9jLmdldFBhcmVudCgpLCBsb2MuZ2V0UHJvcGVydHkoKSwgdHJ1ZSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQorCiAJCQlSZXdyaXRlRXZlbnRbXSBuZXdDaGlsZHJlbj0gcHJvY2Vzc0xpc3RXaXRoUmFuZ2VzKHJhbmdlSW5mb3MsIGNoaWxkcmVuLCBzb3VyY2VSYW5nZUNvbXB1dGVyKTsKIAkJCWFkZEV2ZW50KGxvYy5nZXRQYXJlbnQoKSwgbG9jLmdldFByb3BlcnR5KCksIG5ldyBMaXN0UmV3cml0ZUV2ZW50KG5ld0NoaWxkcmVuKSk7IC8vIHJlcGxhY2UgdGhlIGN1cnJlbnQgZWRpdHMKLQkJfQkJCisJCX0KIAl9CiAKIAlwcml2YXRlIFJld3JpdGVFdmVudFtdIHByb2Nlc3NMaXN0V2l0aFJhbmdlcyhMaXN0IHJhbmdlSW5mb3MsIFJld3JpdGVFdmVudFtdIGNoaWxkRXZlbnRzLCBUYXJnZXRTb3VyY2VSYW5nZUNvbXB1dGVyIHNvdXJjZVJhbmdlQ29tcHV0ZXIpIHsKQEAgLTczMiwxNCArNzQ3LDE0IEBACiAKIAkJSXRlcmF0b3IgcmFuZ2VJbmZvSXRlcmF0b3I9IHJhbmdlSW5mb3MuaXRlcmF0b3IoKTsKIAkJTm9kZVJhbmdlSW5mbyBuZXh0SW5mbz0gKE5vZGVSYW5nZUluZm8pIHJhbmdlSW5mb0l0ZXJhdG9yLm5leHQoKTsKLQkJCisKIAkJZm9yIChpbnQgaz0gMDsgayA8IGNoaWxkRXZlbnRzLmxlbmd0aDsgaysrKSB7CiAJCQlSZXdyaXRlRXZlbnQgZXZlbnQ9IGNoaWxkRXZlbnRzW2tdOwogCQkJQVNUTm9kZSBub2RlPSAoQVNUTm9kZSkgZXZlbnQuZ2V0T3JpZ2luYWxWYWx1ZSgpOwogCQkJLy8gY2hlY2sgZm9yIHJhbmdlcyBhbmQgYWRkIGEgcGxhY2Vob2xkZXIgZm9yIHRoZW0KIAkJCXdoaWxlIChuZXh0SW5mbyAhPSBudWxsICYmIG5vZGUgPT0gbmV4dEluZm8uZ2V0U3RhcnROb2RlKCkpIHsgLy8gaXMgdGhpcyBjaGlsZCB0aGUgYmVnaW5uaW5nIG9mIGEgcmFuZ2U/CiAJCQkJbmV4dEluZm8udXBkYXRlUGxhY2Vob2xkZXJTb3VyY2VSYW5nZXMoc291cmNlUmFuZ2VDb21wdXRlcik7Ci0JCQkJCisKIAkJCQlCbG9jayBpbnRlcm5hbFBsYWNlaG9sZGVyPSBuZXh0SW5mby5nZXRJbnRlcm5hbFBsYWNlaG9sZGVyKCk7CiAJCQkJUmV3cml0ZUV2ZW50IG5ld0V2ZW50OwogCQkJCWlmIChuZXh0SW5mby5pc01vdmUoKSkgewpAQCAtNzUxLDIzICs3NjYsMjMgQEAKIAkJCQlpZiAobmV4dEluZm8uZWRpdEdyb3VwICE9IG51bGwpIHsKIAkJCQkJc2V0RXZlbnRFZGl0R3JvdXAobmV3RXZlbnQsIG5leHRJbmZvLmVkaXRHcm91cCk7CiAJCQkJfQotCQkJCQorCiAJCQkJbmV3Q2hpbGRyZW5TdGFjay5wdXNoKG5ld0NoaWxkRXZlbnRzKTsKIAkJCQl0b3BJbmZvU3RhY2sucHVzaCh0b3BJbmZvKTsKLQkJCQkKKwogCQkJCW5ld0NoaWxkRXZlbnRzPSBuZXcgQXJyYXlMaXN0KGNoaWxkRXZlbnRzLmxlbmd0aCk7CiAJCQkJdG9wSW5mbz0gbmV4dEluZm87Ci0JCQkJCisKIAkJCQluZXh0SW5mbz0gcmFuZ2VJbmZvSXRlcmF0b3IuaGFzTmV4dCgpID8gKE5vZGVSYW5nZUluZm8pIHJhbmdlSW5mb0l0ZXJhdG9yLm5leHQoKSA6IG51bGw7CiAJCQl9Ci0JCQkKKwogCQkJbmV3Q2hpbGRFdmVudHMuYWRkKGV2ZW50KTsKIAogCQkJd2hpbGUgKHRvcEluZm8gIT0gbnVsbCAmJiBub2RlID09IHRvcEluZm8uZ2V0RW5kTm9kZSgpKSB7CiAJCQkJUmV3cml0ZUV2ZW50W10gcGxhY2Vob2xkZXJDaGlsZEV2ZW50cz0gKFJld3JpdGVFdmVudFtdKSBuZXdDaGlsZEV2ZW50cy50b0FycmF5KG5ldyBSZXdyaXRlRXZlbnRbbmV3Q2hpbGRFdmVudHMuc2l6ZSgpXSk7CiAJCQkJQmxvY2sgaW50ZXJuYWxQbGFjZWhvbGRlcj0gdG9wSW5mby5nZXRJbnRlcm5hbFBsYWNlaG9sZGVyKCk7CiAJCQkJYWRkRXZlbnQoaW50ZXJuYWxQbGFjZWhvbGRlciwgQmxvY2suU1RBVEVNRU5UU19QUk9QRVJUWSwgbmV3IExpc3RSZXdyaXRlRXZlbnQocGxhY2Vob2xkZXJDaGlsZEV2ZW50cykpOwotCQkJCQorCiAJCQkJbmV3Q2hpbGRFdmVudHM9IChMaXN0KSBuZXdDaGlsZHJlblN0YWNrLnBvcCgpOwogCQkJCXRvcEluZm89IChOb2RlUmFuZ2VJbmZvKSB0b3BJbmZvU3RhY2sucG9wKCk7CiAJCQl9CkBAIC03ODUsOSArODAwLDkgQEAKIAkJCQlkb01hcmtNb3ZlZEFzUmVtb3ZlZChjdXJyLCBjdXJyLmxvY2F0aW9uLmdldFBhcmVudCgpLCBjdXJyLmxvY2F0aW9uLmdldFByb3BlcnR5KCkpOwogCQkJfQogCQl9Ci0JCQorCiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGRvTWFya01vdmVkQXNSZW1vdmVkKENvcHlTb3VyY2VJbmZvIGN1cnIsIEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkUHJvcGVydHkpIHsKIAkJaWYgKGNoaWxkUHJvcGVydHkuaXNDaGlsZExpc3RQcm9wZXJ0eSgpKSB7CiAJCQlMaXN0UmV3cml0ZUV2ZW50IGV2ZW50PSBnZXRMaXN0RXZlbnQocGFyZW50LCBjaGlsZFByb3BlcnR5LCB0cnVlKTsKQEAgLTgwMyw3ICs4MTgsNyBAQAogCQl9CiAJfQogCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRCb3VuZFRvUHJldmlvdXMoQVNUTm9kZSBub2RlKSB7CQorCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0Qm91bmRUb1ByZXZpb3VzKEFTVE5vZGUgbm9kZSkgewogCQlpZiAodGhpcy5pbnNlcnRCb3VuZFRvUHJldmlvdXMgIT0gbnVsbCkgewogCQkJcmV0dXJuIHRoaXMuaW5zZXJ0Qm91bmRUb1ByZXZpb3VzLmNvbnRhaW5zKG5vZGUpOwogCQl9CkBAIC04MTYsMjggKzgzMSwyOCBAQAogCQl9CiAJCXRoaXMuaW5zZXJ0Qm91bmRUb1ByZXZpb3VzLmFkZChub2RlKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgdmFsaWRhdGVJc0xpc3RQcm9wZXJ0eShTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCWlmICghcHJvcGVydHkuaXNDaGlsZExpc3RQcm9wZXJ0eSgpKSB7CiAJCQlTdHJpbmcgbWVzc2FnZT0gcHJvcGVydHkuZ2V0SWQoKSArICIgaXMgbm90IGEgbGlzdCBwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgdmFsaWRhdGVIYXNDaGlsZFByb3BlcnR5KEFTVE5vZGUgcGFyZW50LCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5KSB7CiAJCWlmICghcGFyZW50LnN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSgpLmNvbnRhaW5zKHByb3BlcnR5KSkgewogCQkJU3RyaW5nIG1lc3NhZ2U9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHBhcmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgKyAiIGhhcyBubyBwcm9wZXJ0eSAiICsgcHJvcGVydHkuZ2V0SWQoKTsgLy8kTk9OLU5MUy0xJAogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUlzTm9kZVByb3BlcnR5KFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKIAkJaWYgKHByb3BlcnR5LmlzQ2hpbGRMaXN0UHJvcGVydHkoKSkgewogCQkJU3RyaW5nIG1lc3NhZ2U9IHByb3BlcnR5LmdldElkKCkgKyAiIGlzIG5vdCBhIG5vZGUgcHJvcGVydHkiOyAvLyROT04tTkxTLTEkCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwogCQl9Ci0JfQkKLQkKKwl9CisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZXZlbnRMb29rdXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CkBAIC04NDgsNyArODYzLDcgQEAKIAkJfQogCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmV3Tm9kZShBU1ROb2RlIG5vZGUpIHsKIAkJcmV0dXJuIChub2RlLmdldEZsYWdzKCkgJiBBU1ROb2RlLk9SSUdJTkFMKSA9PSAwOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9Tb3VyY2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1NvdXJjZU1vZGlmaWVyLmphdmEKaW5kZXggMTUwN2EyNC4uYTIyNjY5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1NvdXJjZU1vZGlmaWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1NvdXJjZU1vZGlmaWVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMjQgKzE5LDI0IEBACiAKIAogcHVibGljIGNsYXNzIFNvdXJjZU1vZGlmaWVyIGltcGxlbWVudHMgSVNvdXJjZU1vZGlmaWVyIHsKLQkKKwogCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uSW5kZW50OwogCXByaXZhdGUgZmluYWwgaW50IHNvdXJjZUluZGVudExldmVsOwogCXByaXZhdGUgZmluYWwgaW50IHRhYldpZHRoOwogCXByaXZhdGUgZmluYWwgaW50IGluZGVudFdpZHRoOwotCQkKKwogCXB1YmxpYyBTb3VyY2VNb2RpZmllcihpbnQgc291cmNlSW5kZW50TGV2ZWwsIFN0cmluZyBkZXN0aW5hdGlvbkluZGVudCwgaW50IHRhYldpZHRoLCBpbnQgaW5kZW50V2lkdGgpIHsKIAkJdGhpcy5kZXN0aW5hdGlvbkluZGVudD0gZGVzdGluYXRpb25JbmRlbnQ7CiAJCXRoaXMuc291cmNlSW5kZW50TGV2ZWw9IHNvdXJjZUluZGVudExldmVsOwogCQl0aGlzLnRhYldpZHRoPSB0YWJXaWR0aDsKIAkJdGhpcy5pbmRlbnRXaWR0aD0gaW5kZW50V2lkdGg7CiAJfQotCQkKKwogCXB1YmxpYyBJU291cmNlTW9kaWZpZXIgY29weSgpIHsKIAkJLy8gV2UgYXJlIHN0YXRlIGxlc3MKIAkJcmV0dXJuIHRoaXM7CiAJfQotCQorCiAJcHVibGljIFJlcGxhY2VFZGl0W10gZ2V0TW9kaWZpY2F0aW9ucyhTdHJpbmcgc291cmNlKSB7CiAJCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7CiAJCWludCBkZXN0SW5kZW50TGV2ZWw9IEluZGVudE1hbmlwdWxhdGlvbi5tZWFzdXJlSW5kZW50VW5pdHModGhpcy5kZXN0aW5hdGlvbkluZGVudCwgdGhpcy50YWJXaWR0aCwgdGhpcy5pbmRlbnRXaWR0aCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvVG9rZW5TY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvVG9rZW5TY2FubmVyLmphdmEKaW5kZXggYjJlY2VjMi4uMzQ0MjcyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1Rva2VuU2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9Ub2tlblNjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwzOSArMTQsMzkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOwogCiAvKioKLSAqIFdyYXBzIGEgc2Nhbm5lciBhbmQgb2ZmZXJzIGNvbnZlbmllbnQgbWV0aG9kcyBmb3IgZmluZGluZyB0b2tlbnMgCisgKiBXcmFwcyBhIHNjYW5uZXIgYW5kIG9mZmVycyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGZpbmRpbmcgdG9rZW5zCiAgKi8KIHB1YmxpYyBjbGFzcyBUb2tlblNjYW5uZXIgewotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0ZJTEU9IDIwMDAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1I9IDIwMDAyOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UX0VSUk9SPSAyMDAwMzsKLQkKLQlwcml2YXRlIGZpbmFsIElTY2FubmVyIHNjYW5uZXI7CisKKwlwcml2YXRlIGZpbmFsIFNjYW5uZXIgc2Nhbm5lcjsKIAlwcml2YXRlIGZpbmFsIGludCBlbmRQb3NpdGlvbjsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBUb2tlblNjYW5uZXIKIAkgKiBAcGFyYW0gc2Nhbm5lciBUaGUgc2Nhbm5lciB0byBiZSB3cmFwcGVkCiAJICovCi0JcHVibGljIFRva2VuU2Nhbm5lcihJU2Nhbm5lciBzY2FubmVyKSB7CisJcHVibGljIFRva2VuU2Nhbm5lcihTY2FubmVyIHNjYW5uZXIpIHsKIAkJdGhpcy5zY2FubmVyPSBzY2FubmVyOwogCQl0aGlzLmVuZFBvc2l0aW9uPSB0aGlzLnNjYW5uZXIuZ2V0U291cmNlKCkubGVuZ3RoIC0gMTsKIAl9Ci0JCQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHdyYXBwZWQgc2Nhbm5lcgogCSAqIEByZXR1cm4gSVNjYW5uZXIKIAkgKi8KLQlwdWJsaWMgSVNjYW5uZXIgZ2V0U2Nhbm5lcigpIHsKKwlwdWJsaWMgU2Nhbm5lciBnZXRTY2FubmVyKCkgewogCQlyZXR1cm4gdGhpcy5zY2FubmVyOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHNjYW5uZXIgb2Zmc2V0IHRvIHRoZSBnaXZlbiBvZmZzZXQuCiAJICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIHNldApAQCAtNTQsMjcgKzU0LDI3IEBACiAJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKIAkJdGhpcy5zY2FubmVyLnJlc2V0VG8ob2Zmc2V0LCB0aGlzLmVuZFBvc2l0aW9uKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9mZnNldCBhZnRlciB0aGUgY3VycmVudCB0b2tlbgotCSAqLwkKKwkgKi8KIAlwdWJsaWMgaW50IGdldEN1cnJlbnRFbmRPZmZzZXQoKSB7CiAJCXJldHVybiB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSArIDE7CiAJfQogCiAJLyoqCiAJICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdG9rZW4KLQkgKi8JCQorCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFN0YXJ0T2Zmc2V0KCkgewogCQlyZXR1cm4gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbgotCSAqLwkKKwkgKi8KIAlwdWJsaWMgaW50IGdldEN1cnJlbnRMZW5ndGgoKSB7CiAJCXJldHVybiBnZXRDdXJyZW50RW5kT2Zmc2V0KCkgLSBnZXRDdXJyZW50U3RhcnRPZmZzZXQoKTsKLQl9CQorCX0KIAogCS8qKgogCSAqIFJlYWRzIHRoZSBuZXh0IHRva2VuLgpAQCAtODgsNyArODgsNyBAQAogCQlkbyB7CiAJCQl0cnkgewogCQkJCWN1cnI9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJCQlpZiAoY3VyciA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJCWlmIChjdXJyID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihjcmVhdGVFcnJvcihFTkRfT0ZfRklMRSwgIkVuZCBPZiBGaWxlIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKQEAgLTk3LDcgKzk3LDcgQEAKIAkJfSB3aGlsZSAoaWdub3JlQ29tbWVudHMgJiYgaXNDb21tZW50KGN1cnIpKTsKIAkJcmV0dXJuIGN1cnI7CiAJfQotCQkKKwogCS8qKgogCSAqIFJlYWRzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIGdpdmVuIG9mZnNldC4KIAkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgpAQCAtMTA1LDM3ICsxMDUsMzcgQEAKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuIGlkLgogCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKGNvZGUgRU5EX09GX0ZJTEUpCiAJICogb3IgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSBzY2FubmluZyAoY29kZSBMRVhJQ0FMX0VSUk9SKQotCSAqLwkJCisJICovCiAJcHVibGljIGludCByZWFkTmV4dChpbnQgb2Zmc2V0LCBib29sZWFuIGlnbm9yZUNvbW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXNldE9mZnNldChvZmZzZXQpOwogCQlyZXR1cm4gcmVhZE5leHQoaWdub3JlQ29tbWVudHMpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlYWRzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIGdpdmVuIG9mZnNldCBhbmQgcmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0b2tlbi4KIAkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgogCSAqIEBwYXJhbSBpZ25vcmVDb21tZW50cyBJZiBzZXQsIGNvbW1lbnRzIHdpbGwgYmUgb3ZlcnJlYWQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRva2VuLiAKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRva2VuLgogCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKGNvZGUgRU5EX09GX0ZJTEUpCiAJICogb3IgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSBzY2FubmluZyAoY29kZSBMRVhJQ0FMX0VSUk9SKQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgaW50IGdldE5leHRTdGFydE9mZnNldChpbnQgb2Zmc2V0LCBib29sZWFuIGlnbm9yZUNvbW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXJlYWROZXh0KG9mZnNldCwgaWdub3JlQ29tbWVudHMpOwogCQlyZXR1cm4gZ2V0Q3VycmVudFN0YXJ0T2Zmc2V0KCk7CiAJfQotCQorCiAJLyoqCiAJICogUmVhZHMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgZ2l2ZW4gb2Zmc2V0IGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgYWZ0ZXIgdGhlIHRva2VuLgogCSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBzdGFydCByZWFkaW5nIGZyb20uCiAJICogQHBhcmFtIGlnbm9yZUNvbW1lbnRzIElmIHNldCwgY29tbWVudHMgd2lsbCBiZSBvdmVycmVhZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5leHQgdG9rZW4uIAorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5leHQgdG9rZW4uCiAJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIFRocm93biB3aGVuIHRoZSBlbmQgb2YgdGhlIGZpbGUgaGFzIGJlZW4gcmVhY2hlZCAoY29kZSBFTkRfT0ZfRklMRSkKIAkgKiBvciBhIGxleGljYWwgZXJyb3Igd2FzIGRldGVjdGVkIHdoaWxlIHNjYW5uaW5nIChjb2RlIExFWElDQUxfRVJST1IpCi0JICovCQkKKwkgKi8KIAlwdWJsaWMgaW50IGdldE5leHRFbmRPZmZzZXQoaW50IG9mZnNldCwgYm9vbGVhbiBpZ25vcmVDb21tZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlyZWFkTmV4dChvZmZzZXQsIGlnbm9yZUNvbW1lbnRzKTsKIAkJcmV0dXJuIGdldEN1cnJlbnRFbmRPZmZzZXQoKTsKLQl9CQkKKwl9CiAKIAkvKioKIAkgKiBSZWFkcyB1bnRpbCBhIHRva2VuIGlzIHJlYWNoZWQuCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJaW50IGN1cnI9IDA7CiAJCWRvIHsKIAkJCWN1cnI9IHJlYWROZXh0KGZhbHNlKTsKLQkJfSB3aGlsZSAoY3VyciAhPSB0b2spOyAKKwkJfSB3aGlsZSAoY3VyciAhPSB0b2spOwogCX0KIAogCS8qKgpAQCAtMTU2LDcgKzE1Niw3IEBACiAJICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KIAkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gVGhyb3duIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkIChjb2RlIEVORF9PRl9GSUxFKQogCSAqIG9yIGEgbGV4aWNhbCBlcnJvciB3YXMgZGV0ZWN0ZWQgd2hpbGUgc2Nhbm5pbmcgKGNvZGUgTEVYSUNBTF9FUlJPUikKLQkgKi8JCQkKKwkgKi8KIAlwdWJsaWMgdm9pZCByZWFkVG9Ub2tlbihpbnQgdG9rLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXNldE9mZnNldChvZmZzZXQpOwogCQlyZWFkVG9Ub2tlbih0b2spOwpAQCAtMTY2LDI4ICsxNjYsMjggQEAKIAkgKiBSZWFkcyBmcm9tIHRoZSBnaXZlbiBvZmZzZXQgdW50aWwgYSB0b2tlbiBpcyByZWFjaGVkIGFuZCByZXR1cm5zIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHRva2VuLgogCSAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gYmUgZm91bmQuCiAJICogQHBhcmFtIHN0YXJ0T2Zmc2V0IFRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGZvdW5kIHRva2VuLiAKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBmb3VuZCB0b2tlbi4KIAkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gVGhyb3duIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkIChjb2RlIEVORF9PRl9GSUxFKQogCSAqIG9yIGEgbGV4aWNhbCBlcnJvciB3YXMgZGV0ZWN0ZWQgd2hpbGUgc2Nhbm5pbmcgKGNvZGUgTEVYSUNBTF9FUlJPUikKLQkgKi8JCisJICovCiAJcHVibGljIGludCBnZXRUb2tlblN0YXJ0T2Zmc2V0KGludCB0b2tlbiwgaW50IHN0YXJ0T2Zmc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXJlYWRUb1Rva2VuKHRva2VuLCBzdGFydE9mZnNldCk7CiAJCXJldHVybiBnZXRDdXJyZW50U3RhcnRPZmZzZXQoKTsKLQl9CQorCX0KIAogCS8qKgogCSAqIFJlYWRzIGZyb20gdGhlIGdpdmVuIG9mZnNldCB1bnRpbCBhIHRva2VuIGlzIHJlYWNoZWQgYW5kIHJldHVybnMgdGhlIG9mZnNldCBhZnRlciB0aGUgdG9rZW4uCiAJICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBmb3VuZC4KIAkgKiBAcGFyYW0gc3RhcnRPZmZzZXQgT2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBmb3VuZCB0b2tlbi4gCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGZvdW5kIHRva2VuLgogCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKGNvZGUgRU5EX09GX0ZJTEUpCiAJICogb3IgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSBzY2FubmluZyAoY29kZSBMRVhJQ0FMX0VSUk9SKQotCSAqLwkJCisJICovCiAJcHVibGljIGludCBnZXRUb2tlbkVuZE9mZnNldChpbnQgdG9rZW4sIGludCBzdGFydE9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlyZWFkVG9Ub2tlbih0b2tlbiwgc3RhcnRPZmZzZXQpOwogCQlyZXR1cm4gZ2V0Q3VycmVudEVuZE9mZnNldCgpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlYWRzIGZyb20gdGhlIGdpdmVuIG9mZnNldCB1bnRpbCBhIHRva2VuIGlzIHJlYWNoZWQgYW5kIHJldHVybnMgdGhlIG9mZnNldCBhZnRlciB0aGUgcHJldmlvdXMgdG9rZW4uCiAJICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBmb3VuZC4KQEAgLTE5NSw3ICsxOTUsNyBAQAogCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdG9rZW4gcHJldmlvdXMgdG8gdGhlIGdpdmVuIHRva2VuLgogCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKGNvZGUgRU5EX09GX0ZJTEUpCiAJICogb3IgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSBzY2FubmluZyAoY29kZSBMRVhJQ0FMX0VSUk9SKQotCSAqLwkJCisJICovCiAJcHVibGljIGludCBnZXRQcmV2aW91c1Rva2VuRW5kT2Zmc2V0KGludCB0b2tlbiwgaW50IHN0YXJ0T2Zmc2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXNldE9mZnNldChzdGFydE9mZnNldCk7CiAJCWludCByZXM9IHN0YXJ0T2Zmc2V0OwpAQCAtMjA2LDMxICsyMDYsMzEgQEAKIAkJfQogCQlyZXR1cm4gcmVzOwogCX0KLQkJCisKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KGludCB0b2tlbikgewotCQlyZXR1cm4gdG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIHx8IHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIAotCQkJfHwgdG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVDT01NRU5UX0xJTkU7CisJCXJldHVybiB0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIHx8IHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQworCQkJfHwgdG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FOwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vZGlmaWVyKGludCB0b2tlbikgewogCQlzd2l0Y2ggKHRva2VuKSB7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lcHVibGljOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXByb3RlY3RlZDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVwcml2YXRlOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXN0YXRpYzoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmaW5hbDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVhYnN0cmFjdDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVuYXRpdmU6Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldm9sYXRpbGU6Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc3RyaWN0ZnA6Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldHJhbnNpZW50OgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXN5bmNocm9uaXplZDoKKwkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcHVibGljOgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwcm90ZWN0ZWQ6CisJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXByaXZhdGU6CisJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN0YXRpYzoKKwkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZmluYWw6CisJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWFic3RyYWN0OgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVuYXRpdmU6CisJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXZvbGF0aWxlOgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdHJpY3RmcDoKKwkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJhbnNpZW50OgorCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzeW5jaHJvbml6ZWQ6CiAJCQkJcmV0dXJuIHRydWU7CiAJCQlkZWZhdWx0OgogCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvcihpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKIAkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCBtZXNzYWdlLCB0aHJvd2FibGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9UcmFja2VkTm9kZVBvc2l0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZG9tL3Jld3JpdGUvVHJhY2tlZE5vZGVQb3NpdGlvbi5qYXZhCmluZGV4IDUzMTBlN2QuLmMyYmM4MzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9kb20vcmV3cml0ZS9UcmFja2VkTm9kZVBvc2l0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2RvbS9yZXdyaXRlL1RyYWNrZWROb2RlUG9zaXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw3ICsyNCw3IEBACiAKIAlwcml2YXRlIGZpbmFsIFRleHRFZGl0R3JvdXAgZ3JvdXA7CiAJcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIG5vZGU7Ci0JCisKIAlwdWJsaWMgVHJhY2tlZE5vZGVQb3NpdGlvbihUZXh0RWRpdEdyb3VwIGdyb3VwLCBBU1ROb2RlIG5vZGUpIHsKIAkJdGhpcy5ncm91cD0gZ3JvdXA7CiAJCXRoaXMubm9kZT0gbm9kZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggZmU1ODUzYy4uNTVkNDdmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTYgKzEwLDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BbGxvY2F0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldpbGRjYXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbU1ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CkBAIC0zNSwxNSArNDIsMTIgQEAKIHB1YmxpYyBDb2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uKEV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0KSB7CiAJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCA9IGV2YWx1YXRpb25Db250ZXh0OwogfQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAotCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCAKLQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIAotCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gdGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwlNZXRob2RCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CiAKLQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeShhbGxvY2F0ZWRUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJaWYgKGNvZGVnZW5CaW5kaW5nLmNhbkJlU2VlbkJ5KGFsbG9jYXRlZFR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKIAkJY29kZVN0cmVhbS5uZXdfKGFsbG9jYXRlZFR5cGUpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJY29kZVN0cmVhbS5kdXAoKTsKQEAgLTczLDEwICs3NywxMCBAQAogCQkJCXRoaXMpOwogCQl9CiAJCS8vIGludm9rZSBjb25zdHJ1Y3RvcgotCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXNwZWNpYWwsIGNvZGVnZW5CaW5kaW5nLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOwogCX0gZWxzZSB7CiAJCS8vIHByaXZhdGUgZW11bGF0aW9uIHVzaW5nIHJlZmxlY3QKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckNvbnN0cnVjdG9yKGN1cnJlbnRTY29wZSwgdGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JDb25zdHJ1Y3RvcihjdXJyZW50U2NvcGUsIGNvZGVnZW5CaW5kaW5nKTsKIAkJLy8gZ2VuZXJhdGUgYXJndW1lbnRzCiAJCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlpbnQgYXJnc0xlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKQEAgLTg2LDI1ICs5MCwyNSBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzTGVuZ3RoOyBpKyspIHsKIAkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOwogCQkJCXRoaXMuYXJndW1lbnRzW2ldLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlckJpbmRpbmcgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV07CisJCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA9IGNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV07CiAJCQkJaWYgKHBhcmFtZXRlckJpbmRpbmcuaXNCYXNlVHlwZSgpICYmIHBhcmFtZXRlckJpbmRpbmcgIT0gVHlwZUJpbmRpbmcuTlVMTCkgewotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQm94aW5nQ29udmVyc2lvbih0aGlzLmNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV0uaWQpOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQm94aW5nQ29udmVyc2lvbihjb2RlZ2VuQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKTsKIAkJCQl9CiAJCQkJY29kZVN0cmVhbS5hYXN0b3JlKCk7CiAJCQkJaWYgKGkgPCBhcmdzTGVuZ3RoIC0gMSkgewogCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCX0JCisJCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKLQkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY3VycmVudFNjb3BlLmNyZWF0ZUFycmF5VHlwZShjdXJyZW50U2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIDMpLCAxKSk7CQkJCisJCQljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZS5jcmVhdGVBcnJheVR5cGUoY3VycmVudFNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCAzKSwgMSkpOwogCQl9CiAJCWNvZGVTdHJlYW0uaW52b2tlSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3JOZXdJbnN0YW5jZSgpOwogCQljb2RlU3RyZWFtLmNoZWNrY2FzdChhbGxvY2F0ZWRUeXBlKTsKIAl9CiAJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIH0KLS8qIElubmVyIGVtdWxhdGlvbiBjb25zaXN0cyBpbiBlaXRoZXIgcmVjb3JkaW5nIGEgZGVwZW5kZW5jeSAKKy8qIElubmVyIGVtdWxhdGlvbiBjb25zaXN0cyBpbiBlaXRoZXIgcmVjb3JkaW5nIGEgZGVwZW5kZW5jeQogICogbGluayBvbmx5LCBvciBwZXJmb3JtaW5nIG9uZSBsZXZlbCBvZiBwcm9wYWdhdGlvbi4KICAqCiAgKiBEZXBlbmRlbmN5IG1lY2hhbmlzbSBpcyB1c2VkIHdoZW5ldmVyIGRlYWxpbmcgd2l0aCBzb3VyY2UgdGFyZ2V0CkBAIC0xMTUsMTYgKzExOSw1OCBAQAogCS8vIG5vdCBzdXBwb3J0ZWQgeWV0CiB9CiBwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0luZm8gZmxvd0luZm8pIHsKLQkJaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKLQotCQkvLyBpZiBjb25zdHJ1Y3RvciBmcm9tIHBhcmFtZXRlcml6ZWQgdHlwZSBnb3QgZm91bmQsIHVzZSB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYXQgY29kZWdlbiB0aW1lCi0JCXRoaXMuY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKLQkJfQorCS8vIGRvIG5vdGhpbmcKIH0KIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJLy8gUHJvcGFnYXRlIHRoZSB0eXBlIGNoZWNraW5nIHRvIHRoZSBhcmd1bWVudHMsIGFuZCBjaGVjayBpZiB0aGUgY29uc3RydWN0b3IgaXMgZGVmaW5lZC4KIAl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCXRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVUeXBlKHNjb3BlLCB0cnVlIC8qIGNoZWNrIGJvdW5kcyovKTsgLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBhcmdzIGFyZSByZXNvbHZlZAorCWNoZWNrUGFyYW1ldGVyaXplZEFsbG9jYXRpb246IHsKKwkJaWYgKHRoaXMudHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7IC8vIGRpc2FsbG93IG5ldyBYPFN0cmluZz4uWTxJbnRlZ2VyPigpCisJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5yZXNvbHZlZFR5cGU7CisJCQlpZiAoY3VycmVudFR5cGUgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnRUeXBlOworCQkJZG8geworCQkJCS8vIGlzU3RhdGljKCkgaXMgYW5zd2VyaW5nIHRydWUgZm9yIHRvcGxldmVsIHR5cGVzCisJCQkJaWYgKChjdXJyZW50VHlwZS5tb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSAhPSAwKSBicmVhayBjaGVja1BhcmFtZXRlcml6ZWRBbGxvY2F0aW9uOworCQkJCWlmIChjdXJyZW50VHlwZS5pc1Jhd1R5cGUoKSkgYnJlYWsgY2hlY2tQYXJhbWV0ZXJpemVkQWxsb2NhdGlvbjsKKwkJCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLmVuY2xvc2luZ1R5cGUoKSkhPSBudWxsKTsKKwkJCVBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHFSZWYgPSAoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHRoaXMudHlwZTsKKwkJCWZvciAoaW50IGkgPSBxUmVmLnR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJCQlpZiAocVJlZi50eXBlQXJndW1lbnRzW2ldICE9IG51bGwpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFF1YWxpZmllZFBhcmFtZXRlcml6ZWRUeXBlQWxsb2NhdGlvbih0aGlzLnR5cGUsIHRoaXMucmVzb2x2ZWRUeXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWZpbmFsIGJvb2xlYW4gaXNEaWFtb25kID0gdGhpcy50eXBlICE9IG51bGwgJiYgKHRoaXMudHlwZS5iaXRzICYgQVNUTm9kZS5Jc0RpYW1vbmQpICE9IDA7CisJLy8gcmVzb2x2ZSB0eXBlIGFyZ3VtZW50cyAoZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgY2FsbCkKKwlpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7CisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBzY29wZS5jb21waWxlck9wdGlvbnMoKS5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7CisJCXRoaXMuZ2VuZXJpY1R5cGVBcmd1bWVudHMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gdGhpcy50eXBlQXJndW1lbnRzW2ldOworCQkJaWYgKCh0aGlzLmdlbmVyaWNUeXBlQXJndW1lbnRzW2ldID0gdHlwZVJlZmVyZW5jZS5yZXNvbHZlVHlwZShzY29wZSwgdHJ1ZSAvKiBjaGVjayBib3VuZHMqLykpID09IG51bGwpIHsKKwkJCQlhcmdIYXNFcnJvciA9IHRydWU7CisJCQl9CisJCQlpZiAoYXJnSGFzRXJyb3IgJiYgdHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFVzYWdlT2ZXaWxkY2FyZCh0eXBlUmVmZXJlbmNlKTsKKwkJCX0KKwkJfQorCQlpZiAoaXNEaWFtb25kKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kaWFtb25kTm90V2l0aEV4cGxpY2l0VHlwZUFyZ3VtZW50cyh0aGlzLnR5cGVBcmd1bWVudHMpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGFyZ0hhc0Vycm9yKSB7CisJCQlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgeyAvLyBzdGlsbCBhdHRlbXB0IHRvIHJlc29sdmUgYXJndW1lbnRzCisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCXRoaXMuYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KIAogCS8vIGJ1ZmZlcmluZyB0aGUgYXJndW1lbnRzJyB0eXBlcwogCWJvb2xlYW4gYXJnc0NvbnRhaW5DYXN0ID0gZmFsc2U7CkBAIC0xNTQsNiArMjAwLDE0IEBACiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluc3RhbnRpYXRlKHRoaXMudHlwZSwgdGhpcy5yZXNvbHZlZFR5cGUpOwogCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQorCWlmIChpc0RpYW1vbmQpIHsKKwkJVHlwZUJpbmRpbmcgW10gaW5mZXJyZWRUeXBlcyA9IGluZmVyRWxpZGVkVHlwZXMoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpLCBudWxsLCBhcmd1bWVudFR5cGVzLCBzY29wZSk7CisJCWlmIChpbmZlcnJlZFR5cGVzID09IG51bGwpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluZmVyRWxpZGVkVHlwZXModGhpcyk7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBudWxsOworCQl9CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUoKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIHRoaXMucmVzb2x2ZWRUeXBlKS5nZW5lcmljVHlwZSgpLCBpbmZlcnJlZFR5cGVzLCAoKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGUpLmVuY2xvc2luZ1R5cGUoKSk7CisgCX0KIAlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZXNvbHZlZFR5cGU7CiAJaWYgKCEodGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IoYWxsb2NhdGVkVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1NZXRob2RCaW5kaW5nCkBAIC0xNjQsNiArMjE4LDkgQEAKIAkJCQkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CiAJCQkJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOwogCQkJCQl9CisJCQkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCAmJiAhdGhpcy50eXBlLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nKTsKIAkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJCX0KQEAgLTE3MSwyNCArMjI4LDMzIEBACiAJCQkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CiAJCQkJCXRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IGFsbG9jYXRlZFR5cGU7CiAJCQkJfQorCQkJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCAmJiAhdGhpcy50eXBlLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nKTsKIAkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJCQl9Ci0JCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CQkJCisJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CiAJCQlNZXRob2RCaW5kaW5nIHByaXZhdGVCaW5kaW5nID0gbG9jYWxTY29wZS5nZXRDb25zdHJ1Y3RvcigoUmVmZXJlbmNlQmluZGluZyl0aGlzLmRlbGVnYXRlVGhpcy50eXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKIAkJCWlmICghcHJpdmF0ZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgewogCQkJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOwogCQkJCX0KKwkJCQlpZiAodGhpcy50eXBlICE9IG51bGwgJiYgIXRoaXMudHlwZS5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIHRoaXMuYmluZGluZyk7CiAJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLmJpbmRpbmcgPSBwcml2YXRlQmluZGluZzsKLQkJCX0JCQkJCisJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsKIAkJCQl0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOwogCQkJfQorCQkJaWYgKHRoaXMudHlwZSAhPSBudWxsICYmICF0aGlzLnR5cGUucmVzb2x2ZWRUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmJpbmRpbmcpOwogCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQl9CkBAIC0xOTYsMjEgKzI2MiwyNCBAQAogCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQodGhpcy5iaW5kaW5nLCBzY29wZSwgdHJ1ZSkpIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZE1ldGhvZCh0aGlzLmJpbmRpbmcsIHRoaXMpOwogCX0KLQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJICAgIFR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGUgPSBiaW5kaW5nLnBhcmFtZXRlcnNbaV07Ci0JCSAgICBUeXBlQmluZGluZyBhcmd1bWVudFR5cGUgPSBhcmd1bWVudFR5cGVzW2ldOwotCQkJYXJndW1lbnRzW2ldLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCBwYXJhbWV0ZXJUeXBlLCBhcmd1bWVudFR5cGUpOworCWlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlclR5cGUgPSB0aGlzLmJpbmRpbmcucGFyYW1ldGVyc1tpXTsKKwkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXNbaV07CisJCQl0aGlzLmFyZ3VtZW50c1tpXS5jb21wdXRlQ29udmVyc2lvbihzY29wZSwgcGFyYW1ldGVyVHlwZSwgYXJndW1lbnRUeXBlKTsKIAkJCWlmIChhcmd1bWVudFR5cGUubmVlZHNVbmNoZWNrZWRDb252ZXJzaW9uKHBhcmFtZXRlclR5cGUpKSB7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5zYWZlVHlwZUNvbnZlcnNpb24oYXJndW1lbnRzW2ldLCBhcmd1bWVudFR5cGUsIHBhcmFtZXRlclR5cGUpOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZVR5cGVDb252ZXJzaW9uKHRoaXMuYXJndW1lbnRzW2ldLCBhcmd1bWVudFR5cGUsIHBhcmFtZXRlclR5cGUpOwogCQkJfQogCQl9CiAJCWlmIChhcmdzQ29udGFpbkNhc3QpIHsKLQkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoc2NvcGUsIG51bGwsIGFsbG9jYXRlZFR5cGUsIGJpbmRpbmcsIHRoaXMuYXJndW1lbnRzLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKKwkJCUNhc3RFeHByZXNzaW9uLmNoZWNrTmVlZEZvckFyZ3VtZW50Q2FzdHMoc2NvcGUsIG51bGwsIGFsbG9jYXRlZFR5cGUsIHRoaXMuYmluZGluZywgdGhpcy5hcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOwogCQl9CiAJfQogCWlmIChhbGxvY2F0ZWRUeXBlLmlzUmF3VHlwZSgpICYmIHRoaXMuYmluZGluZy5oYXNTdWJzdGl0dXRlZFBhcmFtZXRlcnMoKSkgewotCSAgICBzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnNhZmVSYXdJbnZvY2F0aW9uKHRoaXMsIHRoaXMuYmluZGluZyk7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuc2FmZVJhd0ludm9jYXRpb24odGhpcywgdGhpcy5iaW5kaW5nKTsKKwl9CisJaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHRoaXMuYmluZGluZy5vcmlnaW5hbCgpLnR5cGVWYXJpYWJsZXMgPT0gQmluZGluZy5OT19UWVBFX1ZBUklBQkxFUykgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeVR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uKHRoaXMuYmluZGluZywgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cywgdGhpcy50eXBlQXJndW1lbnRzKTsKIAl9CiAJcmV0dXJuIGFsbG9jYXRlZFR5cGU7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q2xhc3NGaWxlLmphdmEKaW5kZXggMjkzMmY2YS4uNTJjOTQzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENsYXNzRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDbGFzc0ZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCw2ICsyNCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0Q2xhc3NGaWxlIGV4dGVuZHMgQ2xhc3NGaWxlIHsKIC8qKgpAQCAtNTIsMTcgKzU1LDE3IEBACiAJdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDgpOwogCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAwKTsKIAotCXRoaXMudGFyZ2V0SkRLID0gdGhpcy5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLnRhcmdldEpESzsKLQl0aGlzLmhlYWRlclt0aGlzLmhlYWRlck9mZnNldCsrXSA9IChieXRlKSAodGFyZ2V0SkRLID4+IDgpOyAvLyBtaW5vciBoaWdoCi0JdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRhcmdldEpESyA+PiAwKTsgLy8gbWlub3IgbG93Ci0JdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRhcmdldEpESyA+PiAyNCk7IC8vIG1ham9yIGhpZ2gKLQl0aGlzLmhlYWRlclt0aGlzLmhlYWRlck9mZnNldCsrXSA9IChieXRlKSAodGFyZ2V0SkRLID4+IDE2KTsgLy8gbWFqb3IgbG93CisJbG9uZyB0YXJnZXRWZXJzaW9uID0gdGhpcy50YXJnZXRKREsgPSB0aGlzLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUuY29tcGlsZXJPcHRpb25zKCkudGFyZ2V0SkRLOworCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICh0YXJnZXRWZXJzaW9uID4+IDgpOyAvLyBtaW5vciBoaWdoCisJdGhpcy5oZWFkZXJbdGhpcy5oZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKHRhcmdldFZlcnNpb24gPj4gMCk7IC8vIG1pbm9yIGxvdworCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICh0YXJnZXRWZXJzaW9uID4+IDI0KTsgLy8gbWFqb3IgaGlnaAorCXRoaXMuaGVhZGVyW3RoaXMuaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICh0YXJnZXRWZXJzaW9uID4+IDE2KTsgLy8gbWFqb3IgbG93CiAKIAl0aGlzLmNvbnN0YW50UG9vbE9mZnNldCA9IHRoaXMuaGVhZGVyT2Zmc2V0OwogCXRoaXMuaGVhZGVyT2Zmc2V0ICs9IDI7CiAJdGhpcy5jb25zdGFudFBvb2wgPSBuZXcgQ29uc3RhbnRQb29sKHRoaXMpOwogCWludCBhY2Nlc3NGbGFncyA9IGFUeXBlLmdldEFjY2Vzc0ZsYWdzKCk7Ci0JCisKIAlpZiAoIWFUeXBlLmlzSW50ZXJmYWNlKCkpIHsgLy8gY2xhc3Mgb3IgZW51bQogCQlhY2Nlc3NGbGFncyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3VwZXI7CiAJfQpAQCAtMTEzLDE4ICsxMTYsMTcgQEAKIAl0aGlzLmNyZWF0aW5nUHJvYmxlbVR5cGUgPSBjcmVhdGluZ1Byb2JsZW1UeXBlOwogCWlmICh0aGlzLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82KSB7CiAJCXRoaXMuY29kZVN0cmVhbSA9IG5ldyBTdGFja01hcEZyYW1lQ29kZVN0cmVhbSh0aGlzKTsKKwkJdGhpcy5wcm9kdWNlQXR0cmlidXRlcyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQVRUUl9TVEFDS19NQVBfVEFCTEU7CisJfSBlbHNlIGlmICh0aGlzLnRhcmdldEpESyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQ0xEQ18xXzEpIHsKKwkJdGhpcy50YXJnZXRKREsgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8xOyAvLyBwdXQgYmFjayA0NS4zCiAJCXRoaXMucHJvZHVjZUF0dHJpYnV0ZXMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFUVFJfU1RBQ0tfTUFQOworCQl0aGlzLmNvZGVTdHJlYW0gPSBuZXcgU3RhY2tNYXBGcmFtZUNvZGVTdHJlYW0odGhpcyk7CiAJfSBlbHNlIHsKIAkJdGhpcy5jb2RlU3RyZWFtID0gbmV3IENvZGVTdHJlYW0odGhpcyk7CiAJfQogCS8vIHJldHJpZXZlIHRoZSBlbmNsb3Npbmcgb25lIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG9uZSBtYXRjaGluZyB0aGUgcHJvcGFnYXRlZCBmbG93IGluZm8KIAkvLyAxRkY5WkJVOiBMRkNPTTpBTEwgLSBMb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzIGJ1c3RlZCAoU2FuaXR5IGNoZWNrKQotCWlmICh0aGlzLmVuY2xvc2luZ0NsYXNzRmlsZSA9PSBudWxsKSB7Ci0JCXRoaXMuY29kZVN0cmVhbS5tYXhGaWVsZENvdW50ID0gYVR5cGUuc2NvcGUucmVmZXJlbmNlVHlwZSgpLm1heEZpZWxkQ291bnQ7Ci0JfSBlbHNlIHsKLQkJQ2xhc3NGaWxlIG91dGVybW9zdENsYXNzRmlsZSA9IHRoaXMub3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCk7Ci0JCXRoaXMuY29kZVN0cmVhbS5tYXhGaWVsZENvdW50ID0gb3V0ZXJtb3N0Q2xhc3NGaWxlLmNvZGVTdHJlYW0ubWF4RmllbGRDb3VudDsKLQl9CisJdGhpcy5jb2RlU3RyZWFtLm1heEZpZWxkQ291bnQgPSBhVHlwZS5zY29wZS5vdXRlck1vc3RDbGFzc1Njb3BlKCkucmVmZXJlbmNlVHlwZSgpLm1heEZpZWxkQ291bnQ7CiB9CiAvKioKICAqIElOVEVSTkFMIFVTRS1PTkxZCkBAIC0xMzgsOSArMTQwLDI1IEBACiAJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDb2RlU25pcHBldENsYXNzRmlsZSh0eXBlQmluZGluZywgbnVsbCwgdHJ1ZSk7CiAKIAkvLyBpbm5lciBhdHRyaWJ1dGVzCisJaWYgKHR5cGVCaW5kaW5nLmhhc01lbWJlclR5cGVzKCkpIHsKKwkJLy8gc2VlIGJ1ZyAxODAxMDkKKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlcnMgPSB0eXBlQmluZGluZy5tZW1iZXJUeXBlczsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBtZW1iZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXMobWVtYmVyc1tpXSk7CisJfQorCS8vIFRPRE8gKG9saXZpZXIpIGhhbmRsZSBjYXNlcyB3aGVyZSBhIGZpZWxkIGNhbm5vdCBiZSBnZW5lcmF0ZWQgKG5hbWUgdG9vIGxvbmcpCisJLy8gVE9ETyAob2xpdmllcikgaGFuZGxlIHRvbyBtYW55IG1ldGhvZHMKKwkvLyBpbm5lciBhdHRyaWJ1dGVzCiAJaWYgKHR5cGVCaW5kaW5nLmlzTmVzdGVkVHlwZSgpKSB7CiAJCWNsYXNzRmlsZS5yZWNvcmRJbm5lckNsYXNzZXModHlwZUJpbmRpbmcpOwogCX0KKwlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IHR5cGVCaW5kaW5nLnR5cGVWYXJpYWJsZXMoKTsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlUeXBlVmFyaWFibGVCaW5kaW5nIHR5cGVWYXJpYWJsZUJpbmRpbmcgPSB0eXBlVmFyaWFibGVzW2ldOworCQlpZiAoKHR5cGVWYXJpYWJsZUJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuQ29udGFpbnNOZXN0ZWRUeXBlUmVmZXJlbmNlcykgIT0gMCkgeworCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgdHlwZVZhcmlhYmxlQmluZGluZyk7CisJCX0KKwl9CiAKIAkvLyBhZGQgaXRzIGZpZWxkcwogCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHR5cGVCaW5kaW5nLmZpZWxkcygpOwpAQCAtMTcxLDggKzE4OSw5IEBACiAJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kRGVjbHNbaV07CiAJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2REZWNsLmJpbmRpbmc7CiAJCQkJaWYgKG1ldGhvZCA9PSBudWxsIHx8IG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlOworCQkJCW1ldGhvZC5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0Fic3RyYWN0OwogCQkJCWNsYXNzRmlsZS5hZGRBYnN0cmFjdE1ldGhvZChtZXRob2REZWNsLCBtZXRob2QpOwotCQkJfQkJCisJCQl9CiAJCX0gZWxzZSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kRGVjbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBtZXRob2REZWNsc1tpXTsKQEAgLTE4MCw2ICsxOTksOCBAQAogCQkJCWlmIChtZXRob2QgPT0gbnVsbCkgY29udGludWU7CiAJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKIAkJCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1Db25zdHJ1Y3RvcihtZXRob2REZWNsLCBtZXRob2QsIHByb2JsZW1zQ29weSk7CisJCQkJfSBlbHNlIGlmIChtZXRob2QuaXNBYnN0cmFjdCgpKSB7CisJCQkJCWNsYXNzRmlsZS5hZGRBYnN0cmFjdE1ldGhvZChtZXRob2REZWNsLCBtZXRob2QpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKG1ldGhvZERlY2wsIG1ldGhvZCwgcHJvYmxlbXNDb3B5KTsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29tcGlsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb21waWxlci5qYXZhCmluZGV4IDM0NjU3MTYuLmNhOTg3MTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb21waWxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb21waWxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDE0ICsxOCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIAogLyoqCi0gKiBBIGNvbXBpbGVyIHRoYXQgY29tcGlsZXMgY29kZSBzbmlwcGV0cy4gCisgKiBBIGNvbXBpbGVyIHRoYXQgY29tcGlsZXMgY29kZSBzbmlwcGV0cy4KICAqLwogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0Q29tcGlsZXIgZXh0ZW5kcyBDb21waWxlciB7Ci0JCisKIAlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKIAlpbnQgY29kZVNuaXBwZXRTdGFydDsKIAlpbnQgY29kZVNuaXBwZXRFbmQ7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGNvZGUgc25pcHBldCBjb21waWxlciBpbml0aWFsaXplZCB3aXRoIGEgY29kZSBzbmlwcGV0IHBhcnNlci4KIAkgKi8KQEAgLTUyLDcgKzUyLDcgQEAKIAkJdGhpcy5wYXJzZVRocmVzaG9sZCA9IDE7CiAJCS8vIGZ1bGx5IHBhcnNlIG9ubHkgdGhlIGNvZGUgc25pcHBldCBjb21waWxhdGlvbiB1bml0CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyI2luaXRpYWxpemVQYXJzZXIoKQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEV2YWx1YXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEV2YWx1YXRvci5qYXZhCmluZGV4IDc3ZDNkNmQuLjU1NjEyZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFdmFsdWF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RXZhbHVhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CkBAIC0yNiw3ICsyNyw3IEBACiAKIC8qKgogICogQSBjb2RlIHNuaXBwZXQgZXZhbHVhdG9yIGNvbXBpbGVzIGFuZCByZXR1cm5zIGNsYXNzIGZpbGUgZm9yIGEgY29kZSBzbmlwcGV0LgotICogT3IgaXQgcmVwb3J0cyBwcm9ibGVtcyBhZ2FpbnN0IHRoZSBjb2RlIHNuaXBwZXQuIAorICogT3IgaXQgcmVwb3J0cyBwcm9ibGVtcyBhZ2FpbnN0IHRoZSBjb2RlIHNuaXBwZXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBDb2RlU25pcHBldEV2YWx1YXRvciBleHRlbmRzIEV2YWx1YXRvciBpbXBsZW1lbnRzIEV2YWx1YXRpb25Db25zdGFudHMgewogCS8qKgpAQCAtNjMsMTMgKzY0LDEzIEBACiAJc3dpdGNoKGV2YWx1YXRpb25UeXBlKSB7CiAJCWNhc2UgRXZhbHVhdGlvblJlc3VsdC5UX1BBQ0tBR0U6CiAJCQlldmFsdWF0aW9uSUQgPSB0aGlzLmNvbnRleHQucGFja2FnZU5hbWU7Ci0JCQkKKwogCQkJLy8gc2hpZnQgbGluZSBudW1iZXIsIHNvdXJjZSBzdGFydCBhbmQgc291cmNlIGVuZAogCQkJcHJvYmxlbS5zZXRTb3VyY2VMaW5lTnVtYmVyKDEpOwogCQkJcHJvYmxlbS5zZXRTb3VyY2VTdGFydCgwKTsKIAkJCXByb2JsZW0uc2V0U291cmNlRW5kKGV2YWx1YXRpb25JRC5sZW5ndGggLSAxKTsKIAkJCWJyZWFrOwotCQkJCisKIAkJY2FzZSBFdmFsdWF0aW9uUmVzdWx0LlRfSU1QT1JUOgogCQkJZXZhbHVhdGlvbklEID0gc291cmNlTWFwcGVyLmdldEltcG9ydChwYkxpbmVOdW1iZXIpOwogCkBAIC04MSwxMyArODIsMTMgQEAKIAogCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQ6CiAJCQlldmFsdWF0aW9uSUQgPSB0aGlzLmNvZGVTbmlwcGV0OwotCQkKKwogCQkJLy8gc2hpZnQgbGluZSBudW1iZXIsIHNvdXJjZSBzdGFydCBhbmQgc291cmNlIGVuZAogCQkJcHJvYmxlbS5zZXRTb3VyY2VMaW5lTnVtYmVyKHBiTGluZU51bWJlciAtIHRoaXMubWFwcGVyLmxpbmVOdW1iZXJPZmZzZXQpOwogCQkJcHJvYmxlbS5zZXRTb3VyY2VTdGFydChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgLSB0aGlzLm1hcHBlci5zdGFydFBvc09mZnNldCk7CiAJCQlwcm9ibGVtLnNldFNvdXJjZUVuZChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIC0gdGhpcy5tYXBwZXIuc3RhcnRQb3NPZmZzZXQpOwogCQkJYnJlYWs7Ci0JCQkKKwogCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9JTlRFUk5BTDoKIAkJCWV2YWx1YXRpb25JRCA9IGN1U291cmNlOwogCQkJYnJlYWs7CkBAIC0xMTMsMTggKzExNCwxOCBAQAogCUNvbXBpbGVyIGNvbXBpbGVyID0gbnVsbDsKIAlpZiAoIURFVkVMT1BNRU5UX01PREUpIHsKIAkJLy8gSWYgd2UgYXJlIG5vdCBkZXZlbG9wcGluZyB0aGUgY29kZSBzbmlwcGV0IHN1cHBvcnQgY2xhc3NlcywKLQkJLy8gdXNlIGEgcmVndWxhciBjb21waWxlciBhbmQgZmVlZCBpdHMgbG9va3VwIGVudmlyb25tZW50IHdpdGggCisJCS8vIHVzZSBhIHJlZ3VsYXIgY29tcGlsZXIgYW5kIGZlZWQgaXRzIGxvb2t1cCBlbnZpcm9ubWVudCB3aXRoCiAJCS8vIHRoZSBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzCiAKIAkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnModGhpcy5vcHRpb25zKTsKIAkJY29tcGlsZXJPcHRpb25zLnBlcmZvcm1NZXRob2RzRnVsbFJlY292ZXJ5ID0gdHJ1ZTsKIAkJY29tcGlsZXJPcHRpb25zLnBlcmZvcm1TdGF0ZW1lbnRzUmVjb3ZlcnkgPSB0cnVlOwotCQljb21waWxlciA9IAorCQljb21waWxlciA9CiAJCQluZXcgQ29kZVNuaXBwZXRDb21waWxlcigKLQkJCQl0aGlzLmVudmlyb25tZW50LCAKLQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksIAotCQkJCWNvbXBpbGVyT3B0aW9ucywgCi0JCQkJY29tcGlsZXJSZXF1ZXN0b3IsIAorCQkJCXRoaXMuZW52aXJvbm1lbnQsCisJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLAorCQkJCWNvbXBpbGVyT3B0aW9ucywKKwkJCQljb21waWxlclJlcXVlc3RvciwKIAkJCQl0aGlzLnByb2JsZW1GYWN0b3J5LAogCQkJCXRoaXMuY29udGV4dCwKIAkJCQlnZXRNYXBwZXIoKS5zdGFydFBvc09mZnNldCwKQEAgLTE1NywxMCArMTU4LDEwIEBACiAJCWNvbXBpbGVyT3B0aW9ucy5wZXJmb3JtTWV0aG9kc0Z1bGxSZWNvdmVyeSA9IHRydWU7CiAJCWNvbXBpbGVyT3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gdHJ1ZTsKIAkJY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoCi0JCQlnZXRXcmFwcGVyRW52aXJvbm1lbnQoKSwgCi0JCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksIAotCQkJY29tcGlsZXJPcHRpb25zLCAKLQkJCWNvbXBpbGVyUmVxdWVzdG9yLCAKKwkJCWdldFdyYXBwZXJFbnZpcm9ubWVudCgpLAorCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLAorCQkJY29tcGlsZXJPcHRpb25zLAorCQkJY29tcGlsZXJSZXF1ZXN0b3IsCiAJCQl0aGlzLnByb2JsZW1GYWN0b3J5KTsKIAl9CiAJcmV0dXJuIGNvbXBpbGVyOwpAQCAtMTc2LDE5ICsxNzcsMjAgQEAKIAkJCX0gZWxzZSB7CiAJCQkJdmFyQ2xhc3NOYW1lID0gaW5zdGFsbGVkVmFycy5jbGFzc05hbWU7CiAJCQl9Ci0JCQkKKwogCQl9CiAJCXRoaXMubWFwcGVyID0gbmV3IENvZGVTbmlwcGV0VG9DdU1hcHBlcigKLQkJCXRoaXMuY29kZVNuaXBwZXQsIAorCQkJdGhpcy5jb2RlU25pcHBldCwKIAkJCXRoaXMuY29udGV4dC5wYWNrYWdlTmFtZSwKIAkJCXRoaXMuY29udGV4dC5pbXBvcnRzLAogCQkJZ2V0Q2xhc3NOYW1lKCksCiAJCQl2YXJDbGFzc05hbWUsCi0JCQl0aGlzLmNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzLCAKLQkJCXRoaXMuY29udGV4dC5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCAKLQkJCXRoaXMuY29udGV4dC5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCAKKwkJCXRoaXMuY29udGV4dC5sb2NhbFZhcmlhYmxlTmFtZXMsCisJCQl0aGlzLmNvbnRleHQubG9jYWxWYXJpYWJsZVR5cGVOYW1lcywKKwkJCXRoaXMuY29udGV4dC5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAogCQkJdGhpcy5jb250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lLAotCQkJdGhpcy5jb250ZXh0LmxpbmVTZXBhcmF0b3IKKwkJCXRoaXMuY29udGV4dC5saW5lU2VwYXJhdG9yLAorCQkJQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKHRoaXMub3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpCiAJCSk7CiAKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZS5qYXZhCmluZGV4IDc3MjE5ZDMuLmVhN2ZiM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsMjcgKzcsMjUgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gQ29udHJpYnV0aW9uIGZvciBidWcgMTg1NjgyIC0gSW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgbWFyayBsb2NhbCB2YXJpYWJsZXMgYXMgcmVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwotIAorCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcG91bmRBc3NpZ25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW50TGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZEZpZWxkQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwogCiBwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZSBleHRlbmRzIEZpZWxkUmVmZXJlbmNlIGltcGxlbWVudHMgUHJvYmxlbVJlYXNvbnMsIEV2YWx1YXRpb25Db25zdGFudHMgewogCkBAIC00MywyNiArNDEsMzAgQEAKIAl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7CiB9CiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQotCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7Ci0JCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIXRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CisJRmllbGRCaW5kaW5nIGNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nLm9yaWdpbmFsKCk7CisJaWYgKGNvZGVnZW5CaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIWNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpOwogCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgdGhpcy5jb2RlZ2VuQmluZGluZywgbnVsbCwgdmFsdWVSZXF1aXJlZCk7CisJCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBjb2RlZ2VuQmluZGluZywgbnVsbCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSwgdmFsdWVSZXF1aXJlZCk7CiAJfSBlbHNlIHsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOwotCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICF0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpOwotCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGNvZGVnZW5CaW5kaW5nKTsKKwkJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CisJCWlmIChjb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KIAkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKIAkJfQogCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKLQkJCX0KKwkJCXN3aXRjaCAoY29kZWdlbkJpbmRpbmcudHlwZS5pZCkgeworCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKKwkJCQkJYnJlYWs7CisJCQl9CQkJCiAJCX0KLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChjb2RlZ2VuQmluZGluZyk7CiAJfQogCWlmICh2YWx1ZVJlcXVpcmVkKXsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CkBAIC03NiwzMyArNzgsMzQgQEAKICAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpZiAodGhpcy5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCh0aGlzLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCX0KIAl9IGVsc2UgewotCQlib29sZWFuIGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOworCQlGaWVsZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwkJYm9vbGVhbiBpc1N0YXRpYyA9IGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CiAJCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIWlzU3RhdGljKTsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCUNvbnN0YW50IGZpZWxkQ29uc3RhbnQgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50KCk7CisJCQlDb25zdGFudCBmaWVsZENvbnN0YW50ID0gY29kZWdlbkJpbmRpbmcuY29uc3RhbnQoKTsKIAkJCWlmIChmaWVsZENvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCisJCQkJaWYgKGNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCiAJCQkJCWNvZGVTdHJlYW0uYXJyYXlsZW5ndGgoKTsKIAkJCQl9IGVsc2UgewotCQkJCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCQlpZiAoY29kZWdlbkJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5CaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKTsKIAkJCQkJCWlmIChpc1N0YXRpYykgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljICwgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYgKGlzU3RhdGljKSB7CiAJCQkJCQkJLy8gd2UgbmVlZCBhIG51bGwgb24gdGhlIHN0YWNrIHRvIHVzZSB0aGUgcmVmbGVjdCBlbXVsYXRpb24KIAkJCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQkJCQl9Ci0JCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoY29kZWdlbkJpbmRpbmcpOwogCQkJCQl9CiAJCQkJfQogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwpAQCAtMTI0LDE1ICsxMjcsMTYgQEAKIH0KIAogcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkKIAlib29sZWFuIGlzU3RhdGljOwotCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7Ci0JCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIShpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOworCUZpZWxkQmluZGluZyBjb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZy5vcmlnaW5hbCgpOworCWlmIChjb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICEoaXNTdGF0aWMgPSBjb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJCVR5cGVCaW5kaW5nIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzID0gQ29kZVN0cmVhbS5nZXRDb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyhjdXJyZW50U2NvcGUsIGNvZGVnZW5CaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5yZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKTsKIAkJaWYgKGlzU3RhdGljKSB7Ci0JCQljb2RlU3RyZWFtLmdldHN0YXRpYyh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9IGVsc2UgewogCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQl9CiAJCWludCBvcGVyYXRpb25UeXBlSUQ7CiAJCXN3aXRjaChvcGVyYXRpb25UeXBlSUQgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpIHsKQEAgLTE0NiwyNiArMTUwLDI2IEBACiAJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCiAJCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpeyAvLyBwcmVmaXggb3BlcmF0aW9uCi0JCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CQkJCisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCQl9CQkKKwkJCQl9CiAJCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCiAJCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7CiAJCQkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKIAkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOwogCQl9Ci0JCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgdGhpcy5jb2RlZ2VuQmluZGluZywgbnVsbCwgdmFsdWVSZXF1aXJlZCk7CisJCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBjb2RlZ2VuQmluZGluZywgbnVsbCwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSwgdmFsdWVSZXF1aXJlZCk7CiAJfSBlbHNlIHsKLQkJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhKGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIShpc1N0YXRpYyA9IGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKTsKIAkJaWYgKGlzU3RhdGljKSB7CiAJCQkvLyB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGNvZGVnZW5CaW5kaW5nKTsKIAkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKIAogCQkJLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHZhbHVlCiAJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoY29kZWdlbkJpbmRpbmcpOwogCQl9IGVsc2UgewogCQkJLy8gdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZCh0aGlzLmJpbmRpbmcpOwpAQCAtMTczLDcgKzE3Nyw3IEBACiAKIAkJCS8vIHVzZWQgdG8gcmV0cmlldmUgdGhlIGFjdHVhbCB2YWx1ZQogCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChjb2RlZ2VuQmluZGluZyk7CiAJCX0KIAkJaW50IG9wZXJhdGlvblR5cGVJRDsKIAkJaWYgKChvcGVyYXRpb25UeXBlSUQgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKQEAgLTE4MywxMCArMTg3LDEwIEBACiAJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQogCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpeyAvLyBwcmVmaXggb3BlcmF0aW9uCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsJCQkKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJfSBlbHNlIHsKIAkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQkJfQkJCisJCQl9CiAJCQkvLyBwZXJmb3JtIHRoZSBvcGVyYXRpb24KIAkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKG9wZXJhdG9yLCBvcGVyYXRpb25UeXBlSUQpOwogCQkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKQEAgLTE5NSw5NCArMTk5LDc3IEBACiAJCS8vIGN1cnJlbnQgc3RhY2sgaXM6CiAJCS8vIGZpZWxkIHJlY2VpdmVyIHZhbHVlCiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKKwkJCWlmICgoY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7CiAJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CiAJCQl9IGVsc2UgewogCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CiAJCQl9CiAJCX0KIAkJLy8gY3VycmVudCBzdGFjayBpczoKLQkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUJCQkJCi0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIHZhbHVlCisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQoY29kZWdlbkJpbmRpbmcpOwogCX0KIH0KIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJYm9vbGVhbiBpc1N0YXRpYzsKLQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICEoaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKTsKLQkJaWYgKGlzU3RhdGljKSB7Ci0JCQljb2RlU3RyZWFtLmdldHN0YXRpYyh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQljb2RlU3RyZWFtLmdldGZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOwotCQl9Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpZiAoaXNTdGF0aWMpIHsKLQkJCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXSAgLS0tPiBbb2xkIGZpZWxkIHZhbHVlXVtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXQotCQkJCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8ICh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZS5pZCk7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOwotCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIHRoaXMuY29kZWdlbkJpbmRpbmcsIG51bGwsIGZhbHNlKTsKKwlGaWVsZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwlpZiAoY29kZWdlbkJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJc3VwZXIuZ2VuZXJhdGVQb3N0SW5jcmVtZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgcG9zdEluY3JlbWVudCwgdmFsdWVSZXF1aXJlZCk7CiAJfSBlbHNlIHsKLQkJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhKGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJCXRoaXMucmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIShpc1N0YXRpYyA9IGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKTsKIAkJaWYgKGlzU3RhdGljKSB7CiAJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCX0KIAkJLy8gdGhlIGFjdHVhbCBzdGFjayBpczogcmVjZWl2ZXIKIAkJY29kZVN0cmVhbS5kdXAoKTsKIAkJLy8gdGhlIGFjdHVhbCBzdGFjayBpczogcmVjZWl2ZXIgcmVjZWl2ZXIKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoY29kZWdlbkJpbmRpbmcpOwogCQkvLyB0aGUgYWN0dWFsIHN0YWNrIGlzOiByZWNlaXZlciB2YWx1ZQogCQkvLyByZWNlaXZlciB2YWx1ZQogCQkvLyB2YWx1ZSByZWNlaXZlciB2YWx1ZSAJCQkJCQkJZHVwX3gxIG9yIGR1cDJfeDEgaWYgdmFsdWUgcmVxdWlyZWQKLQkJLy8gdmFsdWUgdmFsdWUgcmVjZWl2ZXIgdmFsdWUJCQkJCQlkdXBfeDEgb3IgZHVwMl94MQotCQkvLyB2YWx1ZSB2YWx1ZSByZWNlaXZlcgkJCQkJCQkJcG9wIG9yIHBvcDIKKwkJLy8gdmFsdWUgdmFsdWUgcmVjZWl2ZXIgdmFsdWUJCQkJCWR1cF94MSBvciBkdXAyX3gxCisJCS8vIHZhbHVlIHZhbHVlIHJlY2VpdmVyCQkJCQkJCXBvcCBvciBwb3AyCiAJCS8vIHZhbHVlIHZhbHVlIHJlY2VpdmVyIGZpZWxkCQkJCQkJZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZAotCQkvLyB2YWx1ZSB2YWx1ZSBmaWVsZCByZWNlaXZlciAJCQkJCQlzd2FwCi0JCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIHZhbHVlIGZpZWxkIHJlY2VpdmVyIAkJZHVwMl94MSBvciBkdXAyX3gyCi0JCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIHZhbHVlIAkJCQkgCQlwb3AyCi0JCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIG5ld3ZhbHVlIAkJCQkgCWdlbmVyYXRlIGNvbnN0YW50ICsgb3AKLQkJLy8gdmFsdWUgCQkJCQkJCQkJCQlzdG9yZQotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7CisJCS8vIHZhbHVlIHZhbHVlIGZpZWxkIHJlY2VpdmVyIAkJCQkJc3dhcAorCQkvLyB2YWx1ZSBmaWVsZCByZWNlaXZlciB2YWx1ZSBmaWVsZCByZWNlaXZlciAJZHVwMl94MSBvciBkdXAyX3gyCisJCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIHZhbHVlIAkJCQkgCXBvcDIKKwkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgbmV3dmFsdWUgCQkJCWdlbmVyYXRlIGNvbnN0YW50ICsgb3AKKwkJLy8gdmFsdWUgCQkJCQkJCQkJCQkJc3RvcmUKKwkJaW50IHR5cGVJRDsKKwkJc3dpdGNoICh0eXBlSUQgPSBjb2RlZ2VuQmluZGluZy50eXBlLmlkKSB7CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7CisJCQkJfQogCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOwotCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJfQogCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7Ci0JCQl9CisJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQlicmVhazsKIAkJfQotCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOwotCQkJY29kZVN0cmVhbS5wb3AyKCk7Ci0JCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJY29kZVN0cmVhbS5wb3AoKTsKLQkJfQotCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChjb2RlZ2VuQmluZGluZyk7CiAJCWNvZGVTdHJlYW0uc3dhcCgpOwotCQkKLQkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKLQkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOworCQlzd2l0Y2ggKHR5cGVJRCkgeworCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7CisJCQkJYnJlYWs7CiAJCX0KIAkJY29kZVN0cmVhbS5wb3AyKCk7CiAKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwotCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUuaWQpOworCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCBjb2RlZ2VuQmluZGluZy50eXBlLmlkKTsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQoY29kZWdlbkJpbmRpbmcpOwogCX0KIH0KIC8qCkBAIC0yOTEsNTggKzI3OCwyMSBAQAogcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvLCBib29sZWFuIGlzUmVhZEFjY2Vzcyl7CiAJLy8gVGhlIHByaXZhdGUgYWNjZXNzIHdpbGwgYmUgbWFuYWdlZCB0aHJvdWdoIHRoZSBjb2RlIGdlbmVyYXRpb24KIAotCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFKSAhPSAwKSByZXR1cm47Ci0JCi0JLy8gaWYgZmllbGQgZnJvbSBwYXJhbWV0ZXJpemVkIHR5cGUgZ290IGZvdW5kLCB1c2UgdGhlIG9yaWdpbmFsIGZpZWxkIGF0IGNvZGVnZW4gdGltZQotCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkRmllbGRCaW5kaW5nKSB7Ci0JICAgIFBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcgcGFyYW1ldGVyaXplZEZpZWxkID0gKFBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQkgICAgdGhpcy5jb2RlZ2VuQmluZGluZyA9IHBhcmFtZXRlcml6ZWRGaWVsZC5vcmlnaW5hbEZpZWxkOwotCSAgICAvLyBleHRyYSBjYXN0IG5lZWRlZCBpZiBmaWVsZCB0eXBlIHdhcyB0eXBlIHZhcmlhYmxlCi0JICAgIGlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCSAgICAgICAgVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZVJldHVyblR5cGUgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZy50eXBlOwotCSAgICAgICAgaWYgKHZhcmlhYmxlUmV0dXJuVHlwZS5maXJzdEJvdW5kICE9IHBhcmFtZXRlcml6ZWRGaWVsZC50eXBlKSB7IC8vIG5vIG5lZWQgZm9yIGV4dHJhIGNhc3QgaWYgc2FtZSBhcyBmaXJzdCBib3VuZCBhbnl3YXkKLQkJCSAgICB0aGlzLmdlbmVyaWNDYXN0ID0gcGFyYW1ldGVyaXplZEZpZWxkLnR5cGUuZXJhc3VyZSgpOwotCSAgICAgICAgfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZzsKLQl9Ci0JCQotCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgotCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCi0JLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCi0JVHlwZUJpbmRpbmcgc29tZVJlY2VpdmVyVHlwZSA9IHRoaXMuZGVsZWdhdGVUaGlzICE9IG51bGwgPyB0aGlzLmRlbGVnYXRlVGhpcy50eXBlIDogdGhpcy5yZWNlaXZlclR5cGU7Ci0JaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBzb21lUmVjZWl2ZXJUeXBlCi0JCQkmJiAhc29tZVJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCi0JCQkmJiB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKLQkJCSYmIHRoaXMuYmluZGluZy5jb25zdGFudCgpID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQotCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IGN1cnJlbnRTY29wZS5jb21waWxlck9wdGlvbnMoKTsKLQkJaWYgKChvcHRpb25zLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8yCi0JCQkJJiYgKG9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgfHwgIXJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkgfHwgIXRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkKLQkJCQkmJiB0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9KYXZhTGFuZ09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzCi0JCQl8fCAhdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpIHsKLQotCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9Ci0JCQkJY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKAotCQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nLAotCQkJCQkoUmVmZXJlbmNlQmluZGluZykgc29tZVJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpOwotCQl9Ci0JfQkKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSByZXR1cm47CiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCS8vIEFuc3dlciB0aGUgc2lnbmF0dXJlIHR5cGUgb2YgdGhlIGZpZWxkLgogCS8vIGNvbnN0YW50cyBhcmUgcHJvcGFnZWQgd2hlbiB0aGUgZmllbGQgaXMgZmluYWwKLQkvLyBhbmQgaW5pdGlhbGl6ZWQgd2l0aCBhIChjb21waWxlIHRpbWUpIGNvbnN0YW50IAorCS8vIGFuZCBpbml0aWFsaXplZCB3aXRoIGEgKGNvbXBpbGUgdGltZSkgY29uc3RhbnQKIAotCS8vIHJlZ3VsYXIgcmVjZWl2ZXIgcmVmZXJlbmNlIAotCXRoaXMucmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JaWYgKHRoaXMucmVjZWl2ZXJUeXBlID09IG51bGwpeworCS8vIHJlZ3VsYXIgcmVjZWl2ZXIgcmVmZXJlbmNlCisJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKKwlpZiAodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPT0gbnVsbCl7CiAJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCXJldHVybiBudWxsOwogCX0KIAkvLyB0aGUgY2FzZSByZWNlaXZlclR5cGUuaXNBcnJheVR5cGUgYW5kIHRva2VuID0gJ2xlbmd0aCcgaXMgaGFuZGxlZCBieSB0aGUgc2NvcGUgQVBJCi0JdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEZpZWxkKHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLnRva2VuLCB0aGlzKTsKKwl0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRGaWVsZCh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy50b2tlbiwgdGhpcyk7CiAJRmllbGRCaW5kaW5nIGZpcnN0QXR0ZW1wdCA9IHRoaXMuYmluZGluZzsKIAlib29sZWFuIGlzTm90VmlzaWJsZSA9IGZhbHNlOwogCWlmICghdGhpcy5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKQEAgLTM1MywyOSArMzAzLDMwIEBACiAJCQkJCXRoaXMuZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKIAkJCQkJaWYgKHRoaXMuZGVsZWdhdGVUaGlzID09IG51bGwpeyAgLy8gaWYgbm90IGZvdW5kIHRoZW4gaW50ZXJuYWwgZXJyb3IsIGZpZWxkIHNob3VsZCBoYXZlIGJlZW4gZm91bmQKIAkJCQkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgdGhpcy5yZWNlaXZlclR5cGUpOworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKIAkJCQkJCXJldHVybiBudWxsOwogCQkJCQl9CisJCQkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZTsKIAkJCQl9IGVsc2UgewogCQkJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgdGhpcy5yZWNlaXZlclR5cGUpOworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpOwogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7Ci0JCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOworCQkJdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOwogCQl9CiAJfQogCiAJaWYgKCF0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlpZiAoaXNOb3RWaXNpYmxlKSB7Ci0JCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gZmlyc3RBdHRlbXB0OworCQkJdGhpcy5iaW5kaW5nID0gZmlyc3RBdHRlbXB0OwogCQl9Ci0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCB0aGlzLnJlY2VpdmVyVHlwZSk7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSk7CiAJCXJldHVybiBudWxsOwogCX0KIAotCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZCh0aGlzLmJpbmRpbmcsIHNjb3BlLCAodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSAhPTApKSB7CisJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZywgc2NvcGUsIHRoaXMuYml0cykpIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKHRoaXMuYmluZGluZywgdGhpcyk7CiAJfQogCS8vIGNoZWNrIGZvciB0aGlzLnggaW4gc3RhdGljIGlzIGRvbmUgaW4gdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlY2VpdmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0TWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRNZXNzYWdlU2VuZC5qYXZhCmluZGV4IDMxODA2OTYuLmZhMzBjMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRNZXNzYWdlU2VuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRNZXNzYWdlU2VuZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE0ICsxMSwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwpAQCAtMzIsNyArMzMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVWYXJpYWJsZUJpbmRpbmc7CiAKLXB1YmxpYyBjbGFzcyBDb2RlU25pcHBldE1lc3NhZ2VTZW5kIGV4dGVuZHMgTWVzc2FnZVNlbmQgaW1wbGVtZW50cyBQcm9ibGVtUmVhc29ucywgRXZhbHVhdGlvbkNvbnN0YW50cyB7CitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRNZXNzYWdlU2VuZCBleHRlbmRzIE1lc3NhZ2VTZW5kIHsKIAlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKIAlGaWVsZEJpbmRpbmcgZGVsZWdhdGVUaGlzOwogLyoqCkBAIC00OCwxNiArNDksMTIgQEAKICAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KICAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KICAqLwotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAotCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAotCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0KLQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCU1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwlpZiAoY29kZWdlbkJpbmRpbmcuY2FuQmVTZWVuQnkodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKIAkJLy8gZ2VuZXJhdGUgcmVjZWl2ZXIvZW5jbG9zaW5nIGluc3RhbmNlIGFjY2VzcwotCQlib29sZWFuIGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOworCQlib29sZWFuIGlzU3RhdGljID0gY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKTsKIAkJLy8gb3V0ZXIgYWNjZXNzID8KIAkJaWYgKCFpc1N0YXRpYyAmJiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkpIHsKIAkJCS8vIG91dGVyIG1ldGhvZCBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGVtdWxhdGlvbgpAQCAtNjUsNDUgKzYyLDQ2IEBACiAJCQlPYmplY3RbXSBwYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7CiAJCQlpZiAocGF0aCA9PSBudWxsKSB7CiAJCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCi0JCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24odGhpcyk7CiAJCQl9IGVsc2UgewogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhwYXRoLCB0aGlzLCB0YXJnZXRUeXBlLCBjdXJyZW50U2NvcGUpOwogCQkJfQogCQl9IGVsc2UgewogCQkJdGhpcy5yZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOwotCQkJaWYgKHRoaXMucmVjZWl2ZXJHZW5lcmljQ2FzdCAhPSBudWxsKSAKLQkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLnJlY2VpdmVyR2VuZXJpY0Nhc3QpOwotCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsJCQkKKwkJCWlmICgodGhpcy5iaXRzICYgTmVlZFJlY2VpdmVyR2VuZXJpY0Nhc3QpICE9IDApIHsKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSk7CisJCQl9CQkJCisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQl9CiAJCS8vIGdlbmVyYXRlIGFyZ3VtZW50cwotCQlnZW5lcmF0ZUFyZ3VtZW50cyhiaW5kaW5nLCBhcmd1bWVudHMsIGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCWdlbmVyYXRlQXJndW1lbnRzKHRoaXMuYmluZGluZywgdGhpcy5hcmd1bWVudHMsIGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJCS8vIGFjdHVhbCBtZXNzYWdlIGludm9jYXRpb24KKwkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgY29kZWdlbkJpbmRpbmcsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpOwogCQlpZiAoaXNTdGF0aWMpIHsKLQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3RhdGljLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOworCQl9IGVsc2UgaWYoICh0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKSkgfHwgY29kZWdlbkJpbmRpbmcuaXNQcml2YXRlKCkpeworCQkJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tlc3BlY2lhbCwgY29kZWdlbkJpbmRpbmcsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKSkgewotCQkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCWlmIChjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7IC8vIGludGVyZmFjZSBvciBhbm5vdGF0aW9uIHR5cGUKKwkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VpbnRlcmZhY2UsIGNvZGVnZW5CaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CiAJCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQkJY29kZVN0cmVhbS5pbnZva2VpbnRlcmZhY2UodGhpcy5jb2RlZ2VuQmluZGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29kZVN0cmVhbS5pbnZva2V2aXJ0dWFsKHRoaXMuY29kZWdlbkJpbmRpbmcpOwotCQkJCX0KKwkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2V2aXJ0dWFsLCBjb2RlZ2VuQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvck1ldGhvZChjdXJyZW50U2NvcGUsIHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yTWV0aG9kKGN1cnJlbnRTY29wZSwgY29kZWdlbkJpbmRpbmcpOwogCQkvLyBnZW5lcmF0ZSByZWNlaXZlci9lbmNsb3NpbmcgaW5zdGFuY2UgYWNjZXNzCi0JCWJvb2xlYW4gaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CisJCWJvb2xlYW4gaXNTdGF0aWMgPSBjb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOwogCQkvLyBvdXRlciBhY2Nlc3MgPwogCQlpZiAoIWlzU3RhdGljICYmICgodGhpcy5iaXRzICYgRGVwdGhNQVNLKSAhPSAwKSkgewogCQkJLy8gbm90IHN1cHBvcnRlZCB5ZXQKLQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24odGhpcyk7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLnJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7Ci0JCQlpZiAodGhpcy5yZWNlaXZlckdlbmVyaWNDYXN0ICE9IG51bGwpIAotCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMucmVjZWl2ZXJHZW5lcmljQ2FzdCk7Ci0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwkJCQorCQkJaWYgKCh0aGlzLmJpdHMgJiBOZWVkUmVjZWl2ZXJHZW5lcmljQ2FzdCkgIT0gMCkgeworCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKKwkJCX0JCQkKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCX0KIAkJaWYgKGlzU3RhdGljKSB7CiAJCQkvLyB3ZSBuZWVkIGFuIG9iamVjdCBvbiB0aGUgc3RhY2sgd2hpY2ggaXMgaWdub3JlZCBmb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCkBAIC0xMTgsMjQgKzExNiwyNCBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzTGVuZ3RoOyBpKyspIHsKIAkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOwogCQkJCXRoaXMuYXJndW1lbnRzW2ldLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlckJpbmRpbmcgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV07CisJCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA9IGNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV07CiAJCQkJaWYgKHBhcmFtZXRlckJpbmRpbmcuaXNCYXNlVHlwZSgpICYmIHBhcmFtZXRlckJpbmRpbmcgIT0gVHlwZUJpbmRpbmcuTlVMTCkgewotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQm94aW5nQ29udmVyc2lvbih0aGlzLmNvZGVnZW5CaW5kaW5nLnBhcmFtZXRlcnNbaV0uaWQpOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQm94aW5nQ29udmVyc2lvbihjb2RlZ2VuQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKTsKIAkJCQl9CiAJCQkJY29kZVN0cmVhbS5hYXN0b3JlKCk7CiAJCQkJaWYgKGkgPCBhcmdzTGVuZ3RoIC0gMSkgewogCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCX0JCisJCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKLQkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY3VycmVudFNjb3BlLmNyZWF0ZUFycmF5VHlwZShjdXJyZW50U2NvcGUuZ2V0VHlwZShUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIDMpLCAxKSk7CQkJCisJCQljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZS5jcmVhdGVBcnJheVR5cGUoY3VycmVudFNjb3BlLmdldFR5cGUoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNULCAzKSwgMSkpOwogCQl9CiAJCWNvZGVTdHJlYW0uaW52b2tlSmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCk7CiAKIAkJLy8gY29udmVydCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciBwcmltaXRpdmUgdHlwZXMKLQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcucmV0dXJuVHlwZS5pc0Jhc2VUeXBlKCkpIHsKLQkJCWludCB0eXBlSUQgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaWQ7CisJCWlmIChjb2RlZ2VuQmluZGluZy5yZXR1cm5UeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJaW50IHR5cGVJRCA9IGNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaWQ7CiAJCQlpZiAodHlwZUlEID09IFRfdm9pZCkgewogCQkJCS8vIHJlbW92ZSB0aGUgbnVsbCBmcm9tIHRoZSBzdGFjawogCQkJCWNvZGVTdHJlYW0ucG9wKCk7CkBAIC0xNDMsMTkgKzE0MSwxOSBAQAogCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodHlwZUlEKTsKIAkJCWNvZGVTdHJlYW0uZ2V0QmFzZVR5cGVWYWx1ZSh0eXBlSUQpOwogCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5jb2RlZ2VuQmluZGluZy5yZXR1cm5UeXBlKTsKKwkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KGNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUpOwogCQl9CiAJfQogCS8vIHJlcXVpcmVkIGNhc3QgbXVzdCBvY2N1ciBldmVuIGlmIG5vIHZhbHVlIGlzIHJlcXVpcmVkCiAJaWYgKHRoaXMudmFsdWVDYXN0ICE9IG51bGwpIGNvZGVTdHJlYW0uY2hlY2tjYXN0KHRoaXMudmFsdWVDYXN0KTsKIAlpZiAodmFsdWVSZXF1aXJlZCl7CiAJCS8vIGltcGxpY2l0IGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJfSBlbHNlIHsKLQkJYm9vbGVhbiBpc1VuYm94aW5nID0gKGltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7CisJCWJvb2xlYW4gaXNVbmJveGluZyA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7CiAJCS8vIGNvbnZlcnNpb24gb25seSBnZW5lcmF0ZWQgaWYgdW5ib3hpbmcKLQkJaWYgKGlzVW5ib3hpbmcpIGNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJc3dpdGNoIChpc1VuYm94aW5nID8gcG9zdENvbnZlcnNpb25UeXBlKGN1cnJlbnRTY29wZSkuaWQgOiB0aGlzLmNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaWQpIHsKKwkJaWYgKGlzVW5ib3hpbmcpIGNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQlzd2l0Y2ggKGlzVW5ib3hpbmcgPyBwb3N0Q29udmVyc2lvblR5cGUoY3VycmVudFNjb3BlKS5pZCA6IGNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaWQpIHsKIAkJCWNhc2UgVF9sb25nIDoKIAkJCWNhc2UgVF9kb3VibGUgOgogCQkJCWNvZGVTdHJlYW0ucG9wMigpOwpAQCAtMTY1LDQzICsxNjMsMjMgQEAKIAkJCWRlZmF1bHQgOgogCQkJCWNvZGVTdHJlYW0ucG9wKCk7CiAJCX0KLQl9CQorCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIChpbnQpKHRoaXMubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMikpOyAvLyBoaWdobGlnaHQgc2VsZWN0b3IKIH0KIHB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93SW5mbyBmbG93SW5mbykgewogCi0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpID09IDApIHsKLQotCS8vIGlmIG1ldGhvZCBmcm9tIHBhcmFtZXRlcml6ZWQgdHlwZSBnb3QgZm91bmQsIHVzZSB0aGUgb3JpZ2luYWwgbWV0aG9kIGF0IGNvZGVnZW4gdGltZQotCXRoaXMuY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKLQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZyAhPSB0aGlzLmJpbmRpbmcpIHsKLQkgICAgLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgbWV0aG9kIHJldHVybiB0eXBlIHdhcyB0eXBlIHZhcmlhYmxlCi0JICAgIGlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLnJldHVyblR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCSAgICAgICAgVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZVJldHVyblR5cGUgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZy5yZXR1cm5UeXBlOwotCSAgICAgICAgaWYgKHZhcmlhYmxlUmV0dXJuVHlwZS5maXJzdEJvdW5kICE9IHRoaXMuYmluZGluZy5yZXR1cm5UeXBlKSB7IC8vIG5vIG5lZWQgZm9yIGV4dHJhIGNhc3QgaWYgc2FtZSBhcyBmaXJzdCBib3VuZCBhbnl3YXkKLQkJCSAgICB0aGlzLnZhbHVlQ2FzdCA9IHRoaXMuYmluZGluZy5yZXR1cm5UeXBlOwotCSAgICAgICAgfQotCSAgICB9Ci0JfSAKLQkKLQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KLQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKLQkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4JCi0JaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZQotCQkJJiYgIXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCk7Ci0JCWlmICgob3B0aW9ucy50YXJnZXRKREsgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMgotCQkJCSYmIChvcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80IHx8ICFyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpIHx8ICF0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpCi0JCQkJJiYgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfSmF2YUxhbmdPYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IG1ldGhvZHMKLQkJCXx8ICF0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkgewotCi0JCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkTWV0aG9kQmluZGluZygKLQkJCSAgICAgICAgCQkJCQkJCQkJCXRoaXMuY29kZWdlbkJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpOworCWlmICgoZmxvd0luZm8udGFnQml0cyAmIEZsb3dJbmZvLlVOUkVBQ0hBQkxFX09SX0RFQUQpID09IDApIHsKKwkJLy8gaWYgbWV0aG9kIGZyb20gcGFyYW1ldGVyaXplZCB0eXBlIGdvdCBmb3VuZCwgdXNlIHRoZSBvcmlnaW5hbCBtZXRob2QgYXQgY29kZWdlbiB0aW1lCisJCU1ldGhvZEJpbmRpbmcgY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcub3JpZ2luYWwoKTsKKwkJaWYgKGNvZGVnZW5CaW5kaW5nICE9IHRoaXMuYmluZGluZykgeworCQkgICAgLy8gZXh0cmEgY2FzdCBuZWVkZWQgaWYgbWV0aG9kIHJldHVybiB0eXBlIHdhcyB0eXBlIHZhcmlhYmxlCisJCSAgICBpZiAoY29kZWdlbkJpbmRpbmcucmV0dXJuVHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisJCSAgICAgICAgVHlwZVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZVJldHVyblR5cGUgPSAoVHlwZVZhcmlhYmxlQmluZGluZykgY29kZWdlbkJpbmRpbmcucmV0dXJuVHlwZTsKKwkJICAgICAgICBpZiAodmFyaWFibGVSZXR1cm5UeXBlLmZpcnN0Qm91bmQgIT0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGUpIHsgLy8gbm8gbmVlZCBmb3IgZXh0cmEgY2FzdCBpZiBzYW1lIGFzIGZpcnN0IGJvdW5kIGFueXdheQorCQkJCSAgICB0aGlzLnZhbHVlQ2FzdCA9IHRoaXMuYmluZGluZy5yZXR1cm5UeXBlOworCQkgICAgICAgIH0KKwkJICAgIH0KIAkJfQotCQkvLyBQb3N0IDEuNC4wIHRhcmdldCwgYXJyYXkgY2xvbmUoKSBpbnZvY2F0aW9ucyBhcmUgcXVhbGlmaWVkIHdpdGggYXJyYXkgdHlwZSAKLQkJLy8gVGhpcyBpcyBoYW5kbGVkIGluIGFycmF5IHR5cGUgI2Nsb25lIG1ldGhvZCBiaW5kaW5nIHJlc29sdXRpb24gKHNlZSBTY29wZSBhbmQgVXBkYXRlZE1ldGhvZEJpbmRpbmcpCi0JfQogCX0KIH0KIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CkBAIC0yMDksMTYgKzE4NywxNiBAQAogCS8vIEJhc2UgdHlwZSBwcm9tb3Rpb24KIAogCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JYm9vbGVhbiByZWNlaXZlckNhc3QgPSBmYWxzZSwgYXJnc0NvbnRhaW5DYXN0ID0gZmFsc2U7IAorCWJvb2xlYW4gcmVjZWl2ZXJDYXN0ID0gZmFsc2UsIGFyZ3NDb250YWluQ2FzdCA9IGZhbHNlOwogCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKIAkJdGhpcy5yZWNlaXZlci5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgogCQlyZWNlaXZlckNhc3QgPSB0cnVlOwogCX0KLQl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsgCisJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLnJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKIAlpZiAocmVjZWl2ZXJDYXN0ICYmIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKIAkJIC8vIGR1ZSB0byBjaGFuZ2Ugb2YgZGVjbGFyaW5nIGNsYXNzIHdpdGggcmVjZWl2ZXIgdHlwZSwgb25seSBpZGVudGl0eSBjYXN0IHNob3VsZCBiZSBub3RpZmllZAotCQlpZiAoKChDYXN0RXhwcmVzc2lvbil0aGlzLnJlY2VpdmVyKS5leHByZXNzaW9uLnJlc29sdmVkVHlwZSA9PSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSkgeyAKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcik7CQkKKwkJaWYgKCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcikuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUgPT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5Q2FzdCgoQ2FzdEV4cHJlc3Npb24pdGhpcy5yZWNlaXZlcik7CiAJCX0KIAl9CiAJLy8gcmVzb2x2ZSB0eXBlIGFyZ3VtZW50cyAoZm9yIGdlbmVyaWMgY29uc3RydWN0b3IgY2FsbCkKQEAgLTIzOCwxMSArMjE2LDExIEBACiAJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBhcmdzIGFyZSByZXNvbHZlZAogCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IEJpbmRpbmcuTk9fUEFSQU1FVEVSUzsKIAlpZiAodGhpcy5hcmd1bWVudHMgIT0gbnVsbCkgewotCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gZmFsc2U7IC8vIHR5cGVDaGVja3MgYWxsIGFyZ3VtZW50cyAKKwkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOyAvLyB0eXBlQ2hlY2tzIGFsbCBhcmd1bWVudHMKIAkJaW50IGxlbmd0aCA9IHRoaXMuYXJndW1lbnRzLmxlbmd0aDsKIAkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlFeHByZXNzaW9uIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOworCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IHRoaXMuYXJndW1lbnRzW2ldOwogCQkJaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKIAkJCQlhcmd1bWVudC5iaXRzIHw9IERpc2FibGVVbm5lY2Vzc2FyeUNhc3RDaGVjazsgLy8gd2lsbCBjaGVjayBsYXRlciBvbgogCQkJCWFyZ3NDb250YWluQ2FzdCA9IHRydWU7CkBAIC0yNTEsMTAgKzIyOSwxMCBAQAogCQkJCWFyZ0hhc0Vycm9yID0gdHJ1ZTsKIAkJfQogCQlpZiAoYXJnSGFzRXJyb3IpIHsKLQkJCWlmKGFjdHVhbFJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCWlmKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCS8vIHJlY29yZCBhbnkgc2VsZWN0b3IgbWF0Y2gsIGZvciBjbGllbnRzIHdobyBtYXkgc3RpbGwgbmVlZCBoaW50IGFib3V0IHBvc3NpYmxlIG1ldGhvZCBtYXRjaAotCQkJCXRoaXMuYmluZGluZyA9IHNjb3BlLmZpbmRNZXRob2QoKFJlZmVyZW5jZUJpbmRpbmcpYWN0dWFsUmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgbmV3IFR5cGVCaW5kaW5nW117fSwgdGhpcyk7Ci0JCQl9CQkJCisJCQkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZyl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5zZWxlY3RvciwgbmV3IFR5cGVCaW5kaW5nW117fSwgdGhpcyk7CisJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KQEAgLTI2NywxNSArMjQ1LDE1IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXRoaXMuYmluZGluZyA9IAorCXRoaXMuYmluZGluZyA9CiAJCXRoaXMucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKQogCQkJPyBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZCh0aGlzLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKQotCQkJOiBzY29wZS5nZXRNZXRob2QodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMuc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOyAKKwkJCTogc2NvcGUuZ2V0TWV0aG9kKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKIAlpZiAoIXRoaXMuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtTWV0aG9kQmluZGluZwotCQkJJiYgKChQcm9ibGVtTWV0aG9kQmluZGluZykgdGhpcy5iaW5kaW5nKS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKSB7CisJCQkmJiAoKFByb2JsZW1NZXRob2RCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpIHsKIAkJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lICE9IG51bGwpIHsKLQkJCQl0aGlzLmRlbGVnYXRlVGhpcyA9IHNjb3BlLmdldEZpZWxkKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgREVMRUdBVEVfVEhJUywgdGhpcyk7CisJCQkJdGhpcy5kZWxlZ2F0ZVRoaXMgPSBzY29wZS5nZXRGaWVsZChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIEV2YWx1YXRpb25Db25zdGFudHMuREVMRUdBVEVfVEhJUywgdGhpcyk7CiAJCQkJaWYgKHRoaXMuZGVsZWdhdGVUaGlzID09IG51bGwpeyAvLyBpZiBub3QgZm91bmQgdGhlbiBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAogCQkJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkTWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZyk7CkBAIC0yODYsMTEgKzI2NCwxMSBAQAogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRNZXRob2QodGhpcywgdGhpcy5iaW5kaW5nKTsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KLQkJCUNvZGVTbmlwcGV0U2NvcGUgbG9jYWxTY29wZSA9IG5ldyBDb2RlU25pcHBldFNjb3BlKHNjb3BlKTsJCQkKLQkJCU1ldGhvZEJpbmRpbmcgcHJpdmF0ZUJpbmRpbmcgPSAKKwkJCUNvZGVTbmlwcGV0U2NvcGUgbG9jYWxTY29wZSA9IG5ldyBDb2RlU25pcHBldFNjb3BlKHNjb3BlKTsKKwkJCU1ldGhvZEJpbmRpbmcgcHJpdmF0ZUJpbmRpbmcgPQogCQkJCXRoaXMucmVjZWl2ZXIgaW5zdGFuY2VvZiBDb2RlU25pcHBldFRoaXNSZWZlcmVuY2UgJiYgKChDb2RlU25pcHBldFRoaXNSZWZlcmVuY2UpIHRoaXMucmVjZWl2ZXIpLmlzSW1wbGljaXQKIAkJCQkJPyBsb2NhbFNjb3BlLmdldEltcGxpY2l0TWV0aG9kKChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMuc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpCi0JCQkJCTogbG9jYWxTY29wZS5nZXRNZXRob2QodGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy5zZWxlY3RvciwgYXJndW1lbnRUeXBlcywgdGhpcyk7IAorCQkJCQk6IGxvY2FsU2NvcGUuZ2V0TWV0aG9kKHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMuc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOwogCQkJaWYgKCFwcml2YXRlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkJaWYgKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CiAJCQkJCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKQEAgLTMyMCw0MSArMjk4LDQ5IEBACiAJfQogCWlmICghdGhpcy5iaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJLy8gdGhlICJyZWNlaXZlciIgbXVzdCBub3QgYmUgYSB0eXBlLCBpbiBvdGhlciB3b3JkcywgYSBOYW1lUmVmZXJlbmNlIHRoYXQgdGhlIFRDIGhhcyBib3VuZCB0byBhIFR5cGUKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSAKLQkJCQkmJiAoKChOYW1lUmVmZXJlbmNlKSByZWNlaXZlcikuYml0cyAmIEJpbmRpbmcuVFlQRSkgIT0gMCkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubXVzdFVzZUFTdGF0aWNNZXRob2QodGhpcywgYmluZGluZyk7CisJCWlmICh0aGlzLnJlY2VpdmVyIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZQorCQkJCSYmICgoKE5hbWVSZWZlcmVuY2UpIHRoaXMucmVjZWl2ZXIpLmJpdHMgJiBCaW5kaW5nLlRZUEUpICE9IDApIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm11c3RVc2VBU3RhdGljTWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZyk7CiAJCX0gZWxzZSB7Ci0JCQkvLyBjb21wdXRlIGdlbmVyaWMgY2FzdCBpZiBuZWNlc3NhcnkKLQkJCVR5cGVCaW5kaW5nIHJlY2VpdmVyRXJhc3VyZSA9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmVyYXN1cmUoKTsKLQkJCWlmIChyZWNlaXZlckVyYXN1cmUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCQkJaWYgKHJlY2VpdmVyRXJhc3VyZS5maW5kU3VwZXJUeXBlV2l0aFNhbWVFcmFzdXJlKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcykgPT0gbnVsbCkgewotCQkJCQl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzczsgLy8gaGFuZGxlIGluZGlyZWN0IGluaGVyaXRhbmNlIHRocnUgdmFyaWFibGUgc2Vjb25kYXJ5IGJvdW5kCi0JCQkJfQotCQkJfQotCQkJcmVjZWl2ZXIuY29tcHV0ZUNvbnZlcnNpb24oc2NvcGUsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSk7CisJCQkvLyBoYW5kbGUgaW5kaXJlY3QgaW5oZXJpdGFuY2UgdGhydSB2YXJpYWJsZSBzZWNvbmRhcnkgYm91bmQKKwkJCS8vIHJlY2VpdmVyIG1heSByZWNlaXZlIGdlbmVyaWMgY2FzdCwgYXMgcGFydCBvZiBpbXBsaWNpdCBjb252ZXJzaW9uCisJCQlUeXBlQmluZGluZyBvbGRSZWNlaXZlclR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUuZ2V0RXJhc3VyZUNvbXBhdGlibGVUeXBlKHRoaXMuYmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQl0aGlzLnJlY2VpdmVyLmNvbXB1dGVDb252ZXJzaW9uKHNjb3BlLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpOworCQkJaWYgKHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlICE9IG9sZFJlY2VpdmVyVHlwZSAmJiB0aGlzLnJlY2VpdmVyLnBvc3RDb252ZXJzaW9uVHlwZShzY29wZSkgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpIHsgLy8gcmVjb3JkIG5lZWQgZm9yIGV4cGxpY2l0IGNhc3QgYXQgY29kZWdlbiBzaW5jZSByZWNlaXZlciBjb3VsZCBub3QgaGFuZGxlIGl0CisJCQkJdGhpcy5iaXRzIHw9IE5lZWRSZWNlaXZlckdlbmVyaWNDYXN0OworCQkJfQkJCQogCQl9CiAJfQotCWNoZWNrSW52b2NhdGlvbkFyZ3VtZW50cyhzY29wZSwgdGhpcy5yZWNlaXZlciwgYWN0dWFsUmVjZWl2ZXJUeXBlLCBiaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKTsKKwlpZiAoY2hlY2tJbnZvY2F0aW9uQXJndW1lbnRzKHNjb3BlLCB0aGlzLnJlY2VpdmVyLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5iaW5kaW5nLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRUeXBlcywgYXJnc0NvbnRhaW5DYXN0LCB0aGlzKSkgeworCQl0aGlzLmJpdHMgfD0gQVNUTm9kZS5VbmNoZWNrZWQ7CisJfQogCiAJLy8tLS0tLS0tbWVzc2FnZSBzZW5kIHRoYXQgYXJlIGtub3duIHRvIGZhaWwgYXQgY29tcGlsZSB0aW1lLS0tLS0tLS0tLS0KLQlpZiAoYmluZGluZy5pc0Fic3RyYWN0KCkpIHsKLQkJaWYgKHJlY2VpdmVyLmlzU3VwZXIoKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90RGlyZWNseUludm9rZUFic3RyYWN0TWV0aG9kKHRoaXMsIGJpbmRpbmcpOworCWlmICh0aGlzLmJpbmRpbmcuaXNBYnN0cmFjdCgpKSB7CisJCWlmICh0aGlzLnJlY2VpdmVyLmlzU3VwZXIoKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90RGlyZWNseUludm9rZUFic3RyYWN0TWV0aG9kKHRoaXMsIHRoaXMuYmluZGluZyk7CiAJCX0KIAkJLy8gYWJzdHJhY3QgcHJpdmF0ZSBtZXRob2RzIGNhbm5vdCBvY2N1ciBub3IgYWJzdHJhY3Qgc3RhdGljLi4uLi4uLi4uLi4uCiAJfQotCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQoYmluZGluZywgc2NvcGUsIHRydWUpKQotCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOworCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQodGhpcy5iaW5kaW5nLCBzY29wZSwgdHJ1ZSkpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QodGhpcy5iaW5kaW5nLCB0aGlzKTsKIAogCS8vIGZyb20gMS41IGNvbXBsaWFuY2Ugb24sIGFycmF5I2Nsb25lKCkgcmV0dXJucyB0aGUgYXJyYXkgdHlwZSAoYnV0IGJpbmRpbmcgc3RpbGwgc2hvd3MgT2JqZWN0KQotCWlmIChhY3R1YWxSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKSAKLQkJCSYmIHRoaXMuYmluZGluZy5wYXJhbWV0ZXJzID09IEJpbmRpbmcuTk9fUEFSQU1FVEVSUyAKLQkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81IAorCWlmICh0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCisJCQkmJiB0aGlzLmJpbmRpbmcucGFyYW1ldGVycyA9PSBCaW5kaW5nLk5PX1BBUkFNRVRFUlMKKwkJCSYmIHNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81CiAJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmJpbmRpbmcuc2VsZWN0b3IsIENMT05FKSkgewotCQl0aGlzLnJlc29sdmVkVHlwZSA9IGFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKIAl9IGVsc2UgewogCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gdGhpcy5iaW5kaW5nLnJldHVyblR5cGU7Ci0JCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHJldHVyblR5cGUgPSByZXR1cm5UeXBlLmNhcHR1cmUoc2NvcGUsIHRoaXMuc291cmNlRW5kKTsKKwkJCisJCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKKwkJCWlmICgodGhpcy5iaXRzICYgQVNUTm9kZS5VbmNoZWNrZWQpICE9IDAgJiYgdGhpcy5nZW5lcmljVHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CisJCQkJcmV0dXJuVHlwZSA9IHNjb3BlLmVudmlyb25tZW50KCkuY29udmVydFRvUmF3VHlwZShyZXR1cm5UeXBlLmVyYXN1cmUoKSwgdHJ1ZSk7CisJCQl9CisJCQlyZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5jYXB0dXJlKHNjb3BlLCB0aGlzLnNvdXJjZUVuZCk7CQkJCisJCX0KIAkJdGhpcy5yZXNvbHZlZFR5cGUgPSByZXR1cm5UeXBlOwogCX0KIAlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEKaW5kZXggYjYwMDI3NC4uMGI0ZTA1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC02MiwxMyArNjIsMTUgQEAKIAkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLCAKLQkJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOwogCQl9CiAJCWFsbG9jLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCQljaGVja0ZvckRpYW1vbmQoYWxsb2MudHlwZSk7CisJCQogCQkvL3RoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50CiAJCS8vd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCBieSB0aGUgVEMgKHNlZSBjcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKQogCQlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CkBAIC03OSwxMiArODEsNjIgQEAKIAkJYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKIAkJaWYgKGFub255bW91c1R5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uICE9IG51bGwpIHsKIAkJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247Ci0JCX0JCQorCQl9CisJCXRoaXMuYXN0UHRyLS07CisJCXRoaXMuYXN0TGVuZ3RoUHRyLS07CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpIHsKKwkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBUeXBlQXJndW1lbnRzIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKwlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYzsKKwlpbnQgbGVuZ3RoOworCWlmICgoKGxlbmd0aCA9IHRoaXMuYXN0TGVuZ3RoU3RhY2tbdGhpcy5hc3RMZW5ndGhQdHItLV0pID09IDEpCisJCSYmICh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSA9PSBudWxsKSkgeworCQkvL05PIENsYXNzQm9keQorCQl0aGlzLmFzdFB0ci0tOworCQlhbGxvYyA9IG5ldyBDb2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOworCQlhbGxvYy5zb3VyY2VFbmQgPSB0aGlzLmVuZFBvc2l0aW9uOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQorCisJCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCQl0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOworCQl9CisJCWFsbG9jLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCisJCWxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOworCQl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmdlbmVyaWNzU3RhY2ssIHRoaXMuZ2VuZXJpY3NQdHIgKyAxLCBhbGxvYy50eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJdGhpcy5pbnRQdHItLTsKKworCQkvL3RoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50CisJCS8vd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCBieSB0aGUgVEMgKHNlZSBjcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKQorCQlhbGxvYy5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhhbGxvYyk7CisJfSBlbHNlIHsKKwkJZGlzcGF0Y2hEZWNsYXJhdGlvbkludG8obGVuZ3RoKTsKKwkJVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CisJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gdGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwkJaWYgKGxlbmd0aCA9PSAwICYmICFjb250YWluc0NvbW1lbnQoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmJvZHlTdGFydCwgYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmJvZHlFbmQpKSB7CisJCQlhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24uYml0cyB8PSBBU1ROb2RlLlVuZG9jdW1lbnRlZEVtcHR5QmxvY2s7CisJCX0KIAkJdGhpcy5hc3RQdHItLTsKIAkJdGhpcy5hc3RMZW5ndGhQdHItLTsKIAotCQkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQkJbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uKTsKKwkJUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24gPSBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbjsKKwkJaWYgKGFsbG9jYXRpb25FeHByZXNzaW9uICE9IG51bGwpIHsKKwkJCWFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZUVuZCA9IHRoaXMuZW5kU3RhdGVtZW50UG9zaXRpb247CisJCQkvLyBoYW5kbGUgdHlwZSBhcmd1bWVudHMKKwkJCWxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS1dOworCQkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGVBcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAwLCBsZW5ndGgpOworCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24uc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCQl9CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzRGVjbGFyYXRpb24oKSB7CkBAIC0xMTgsNyArMTcwLDcgQEAKIAl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIAogCS8vY29tcHV0ZSB0aGUgZGVjbGFyYXRpb24gc291cmNlIHRvbwotCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOyAKKwl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0aGlzLmludFB0ci0tOwogCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggYW4gaW50IHBvc2l0aW9uCiAJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwpAQCAtMTMxLDcgKzE4Myw3IEBACiAKIAl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiByZWFkaW5nIHN1cGVyLWludGVyZmFjZXMKIAkvLyByZWNvdmVyeQotCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKKwlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKXsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGVEZWNsLmJvZHlTdGFydDsKIAkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuYWRkKHR5cGVEZWNsLCAwKTsKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CkBAIC0xNDgsNyArMjAwLDcgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbmhhbmNlZEZvclN0YXRlbWVudCgpIHsKIAlzdXBlci5jb25zdW1lRW5oYW5jZWRGb3JTdGF0ZW1lbnQoKTsKIAkvKiByZWNvdmVyeSAqLwotCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOwkKKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeHByZXNzaW9uU3RhdGVtZW50KCkgewogCXN1cGVyLmNvbnN1bWVFeHByZXNzaW9uU3RhdGVtZW50KCk7CkBAIC0xNjYsNyArMjE4LDcgQEAKIAkJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOwogCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOwogCWlmIChpc1N1cGVyQWNjZXNzKSB7Ci0JCS8vY29uc2lkZXJhdGVzIHRoZSBmaWVsZFJlZmVyZW5jZSBiZWdpbm5pbmcgYXQgdGhlICdzdXBlcicgLi4uLgkKKwkJLy9jb25zaWRlcmF0ZXMgdGhlIGZpZWxkUmVmZXJlbmNlIGJlZ2lubmluZyBhdCB0aGUgJ3N1cGVyJyAuLi4uCiAJCWZyLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJcHJvYmxlbVJlcG9ydGVyKCkuY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MobnVsbCwwLCAwKTsKIAkJZnIucmVjZWl2ZXIgPSBuZXcgQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZShmci5zb3VyY2VTdGFydCwgdGhpcy5lbmRQb3NpdGlvbik7CkBAIC0xODAsNTMgKzIzMiw2IEBACiAJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gPSBmcjsKIAl9CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlSGVhZGVyTmFtZTEoKSB7Ci0JLy8gSW50ZXJmYWNlSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdpbnRlcmZhY2UnICdJZGVudGlmaWVyJwotCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbDsKLQlpZiAodGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSA9PSAwKSB7Ci0JCWlmICh0aGlzLm5lc3RlZFR5cGUgIT0gMCkgewotCQkJdHlwZURlY2wgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJCXR5cGVEZWNsLmJpdHMgfD0gQVNUTm9kZS5Jc01lbWJlclR5cGU7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlRGVjbCA9IG5ldyBDb2RlU25pcHBldFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCi0JCXR5cGVEZWNsID0gbmV3IFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCXR5cGVEZWNsLmJpdHMgfD0gQVNUTm9kZS5Jc0xvY2FsVHlwZTsKLQkJbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsgCi0JCWJsb2NrUmVhbCgpOwotCX0KLQotCS8vaGlnaGxpZ2h0IHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0JbG9uZyBwb3MgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07Ci0JdHlwZURlY2wuc291cmNlRW5kID0gKGludCkgcG9zOwotCXR5cGVEZWNsLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOwotCXR5cGVEZWNsLm5hbWUgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07Ci0JdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07Ci0KLQkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KLQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKLQl0aGlzLmludFB0ci0tOwotCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggYW4gaW50IHBvc2l0aW9uCi0JdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwotCXR5cGVEZWNsLm1vZGlmaWVycyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07Ci0JaWYgKHR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID49IDApIHsKLQkJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0OwotCX0KLQl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zb3VyY2VFbmQgKyAxOwotCXB1c2hPbkFzdFN0YWNrKHR5cGVEZWNsKTsKLQl0aGlzLmxpc3RMZW5ndGggPSAwOyAvLyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiByZWFkaW5nIHN1cGVyLWludGVyZmFjZXMKLQkvLyByZWNvdmVyeQotCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAvLyBpcyByZWNvdmVyaW5nCi0JCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7Ci0JCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZCh0eXBlRGVjbCwgMCk7Ci0JCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCi0JfQotCS8vIGphdmFkb2MKLQl0eXBlRGVjbC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwotCXRoaXMuamF2YWRvYyA9IG51bGw7Ci19CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJuYWxDb21waWxhdGlvblVuaXQoKSB7CiAJLy8gSW50ZXJuYWxDb21waWxhdGlvblVuaXQgOjo9IFBhY2thZ2VEZWNsYXJhdGlvbgogCS8vIEludGVybmFsQ29tcGlsYXRpb25Vbml0IDo6PSBQYWNrYWdlRGVjbGFyYXRpb24gSW1wb3J0RGVjbGFyYXRpb25zIFJlZHVjZUltcG9ydHMKQEAgLTI1Miw3ICsyNTcsNyBAQAogfQogCiAvKioKLSAqIEluIGNhc2UgZW11bGF0aW5nIGxvY2FsIHZhcmlhYmxlcywgd3JhcCB0aGUgKHJlY292ZXJlZCkgc3RhdGVtZW50cyBpbnNpZGUgYSAKKyAqIEluIGNhc2UgZW11bGF0aW5nIGxvY2FsIHZhcmlhYmxlcywgd3JhcCB0aGUgKHJlY292ZXJlZCkgc3RhdGVtZW50cyBpbnNpZGUgYQogICogdHJ5IHN0YXRlbWVudCBzbyBhcyB0byBhY2hpZXZlIGxvY2FsIHN0YXRlIGNvbW1pdGluZyAoY29weSBsb2NhbCB2YXJzIGJhY2sgdG8gZmllbGRzKS4KICAqIFRoZSBDU1RvQ3VNYXBwZXIgY291bGQgbm90IGJlIHVzZWQsIHNpbmNlIGl0IGNvdWxkIGhhdmUgaW50ZXJmZXJlZCB3aXRoCiAgKiB0aGUgc3ludGF4IHJlY292ZXJ5IHNwZWNpZmljIHRvIGNvZGUgc25pcHBldHMuCkBAIC0yNjIsMjMgKzI2NywyMyBAQAogCS8vIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciAnOycKIAogCXN1cGVyLmNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihpc05vdEFic3RyYWN0KTsKLQkKKwogCS8vIG5vdyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhIG1ldGhvZCBkZWNsYXJhdGlvbiBhdCB0aGUgdG9wIG9mIHRoZSBhc3Qgc3RhY2sKIAlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAogCS8vIGF1dG9tYXRpY2FsbHkgd3JhcCB0aGUgbGFzdCBzdGF0ZW1lbnQgaW5zaWRlIGEgcmV0dXJuIHN0YXRlbWVudCwgaWYgaXQgaXMgYW4gZXhwcmVzc2lvbgogCS8vIHN1cHBvcnQgaGF2ZSB0byBiZSBkZWZpbmVkIGF0IHRvcGxldmVsIG9ubHkKLQlpZiAodGhpcy5pc1RvcExldmVsVHlwZSgpKSB7CisJaWYgKGlzVG9wTGV2ZWxUeXBlKCkpIHsKIAkJaW50IGxhc3QgPSBtZXRob2REZWNsLnN0YXRlbWVudHMgPT0gbnVsbCA/IC0xIDogbWV0aG9kRGVjbC5zdGF0ZW1lbnRzLmxlbmd0aCAtIDE7CiAJCWlmIChsYXN0ID49IDAgJiYgbWV0aG9kRGVjbC5zdGF0ZW1lbnRzW2xhc3RdIGluc3RhbmNlb2YgRXhwcmVzc2lvbil7CiAJCQlFeHByZXNzaW9uIGxhc3RFeHByZXNzaW9uID0gKEV4cHJlc3Npb24pIG1ldGhvZERlY2wuc3RhdGVtZW50c1tsYXN0XTsKIAkJCW1ldGhvZERlY2wuc3RhdGVtZW50c1tsYXN0XSA9IG5ldyBDb2RlU25pcHBldFJldHVyblN0YXRlbWVudCgKLQkJCQkJCQkJCQkJbGFzdEV4cHJlc3Npb24sIAotCQkJCQkJCQkJCQlsYXN0RXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgCisJCQkJCQkJCQkJCWxhc3RFeHByZXNzaW9uLAorCQkJCQkJCQkJCQlsYXN0RXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJCQkJCQkJCQkJbGFzdEV4cHJlc3Npb24uc291cmNlRW5kKTsKIAkJfQogCX0KLQkKKwogCWludCBzdGFydCA9IG1ldGhvZERlY2wuYm9keVN0YXJ0LTEsIGVuZCA9IHN0YXJ0OwogCWxvbmcgcG9zaXRpb24gPSAoKGxvbmcpc3RhcnQgPDwgMzIpICsgZW5kOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tde3Bvc2l0aW9ufTsKQEAgLTI5OCwxMiArMzAzLDE3IEBACiAJCQlpZiAobmFtZUVuZCA+PSAwKSB7CiAJCQkJdHJpbW1lZFR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0cmltbWVkVHlwZU5hbWUsIDAsIG5hbWVFbmQpOwogCQkJfQotCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCi0JCQkJQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHJpbW1lZFR5cGVOYW1lKSwKLQkJCQlwb3NpdGlvbnMpOworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlOworCQkJaWYgKENoYXJPcGVyYXRpb24uaW5kZXhPZignLicsIHRyaW1tZWRUeXBlTmFtZSkgPT0gLTEpIHsKKwkJCQl0eXBlUmVmZXJlbmNlID0gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UodHJpbW1lZFR5cGVOYW1lLCBwb3NpdGlvbik7CisJCQl9IGVsc2UgeworCQkJCXR5cGVSZWZlcmVuY2UgPSBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHRyaW1tZWRUeXBlTmFtZSksCisJCQkJCQlwb3NpdGlvbnMpOworCQkJfQogCQkJaW50IGRpbUNvdW50ID0gQ2hhck9wZXJhdGlvbi5vY2N1cmVuY2VzT2YoJ1snLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVUeXBlTmFtZXNbaV0pOwogCQkJaWYgKGRpbUNvdW50ID4gMCkgewotCQkJCXR5cGVSZWZlcmVuY2UgPSB0aGlzLmNvcHlEaW1zKHR5cGVSZWZlcmVuY2UsIGRpbUNvdW50KTsKKwkJCQl0eXBlUmVmZXJlbmNlID0gY29weURpbXModHlwZVJlZmVyZW5jZSwgZGltQ291bnQpOwogCQkJfQogCQkJTmFtZVJlZmVyZW5jZSBpbml0ID0gbmV3IFNpbmdsZU5hbWVSZWZlcmVuY2UoCiAJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdChMT0NBTF9WQVJfUFJFRklYLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSksIHBvc2l0aW9uKTsKQEAgLTMyOCwxMCArMzM4LDExIEBACiAJCWZpbmFsbHlCbG9jay5zb3VyY2VFbmQgPSBlbmQ7CiAJCWZpbmFsbHlCbG9jay5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFt2YXJDb3VudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyQ291bnQ7IGkrKyl7CisJCQlTaW5nbGVOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBuZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSwgcG9zaXRpb24pOwogCQkJZmluYWxseUJsb2NrLnN0YXRlbWVudHNbaV0gPSBuZXcgQXNzaWdubWVudCgKIAkJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdChMT0NBTF9WQVJfUFJFRklYLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSksIHBvc2l0aW9uKSwKLQkJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSwgcG9zaXRpb24pLAotCQkJCShpbnQpIHBvc2l0aW9uKTsKKwkJCQluYW1lUmVmLAorCQkJCW5hbWVSZWYuc291cmNlRW5kKTsKIAkJfQogCQl0cnlTdGF0ZW1lbnQuZmluYWxseUJsb2NrID0gZmluYWxseUJsb2NrOwogCkBAIC0zNDYsMTMgKzM1NywxMyBAQAogCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA+PSB0aGlzLmNvZGVTbmlwcGV0U3RhcnQKIAkJJiYgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jb2RlU25pcHBldEVuZCArIDEgKyB0aGlzLmxpbmVTZXBhcmF0b3JMZW5ndGggLy8gMTQ4MzgKIAkJJiYgaXNUb3BMZXZlbFR5cGUoKSkgewotCQkJCisKIAkJLy8gd2hlbiB0aGUgbmFtZSBpcyBvbmx5IGFuIGlkZW50aWZpZXIuLi53ZSBoYXZlIGEgbWVzc2FnZSBzZW5kIHRvICJ0aGlzIiAoaW1wbGljaXQpCiAKIAkJTWVzc2FnZVNlbmQgbSA9IG5ld01lc3NhZ2VTZW5kKCk7CiAJCW0uc291cmNlRW5kID0gdGhpcy5yUGFyZW5Qb3M7Ci0JCW0uc291cmNlU3RhcnQgPSAKLQkJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7IAorCQltLnNvdXJjZVN0YXJ0ID0KKwkJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0pID4+PiAzMik7CiAJCW0uc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CiAJCWlmICh0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdID09IDEpIHsKIAkJCW0ucmVjZWl2ZXIgPSBuZXcgQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlKDAsMCx0aGlzLmV2YWx1YXRpb25Db250ZXh0LCB0cnVlKTsKQEAgLTM2MCwxNCArMzcxLDQyIEBACiAJCX0gZWxzZSB7CiAJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdLS07CiAJCQltLnJlY2VpdmVyID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKLQkJCW0uc291cmNlU3RhcnQgPSBtLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwkJCisJCQltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsKIAkJfQogCQlwdXNoT25FeHByZXNzaW9uU3RhY2sobSk7CiAJfSBlbHNlIHsKIAkJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCk7CiAJfQogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lV2l0aFR5cGVBcmd1bWVudHMoKSB7CisJLy8gTWV0aG9kSW52b2NhdGlvbiA6Oj0gTmFtZSAnLicgVHlwZUFyZ3VtZW50cyAnSWRlbnRpZmllcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKIAorCS8vIHdoZW4gdGhlIG5hbWUgaXMgb25seSBhbiBpZGVudGlmaWVyLi4ud2UgaGF2ZSBhIG1lc3NhZ2Ugc2VuZCB0byAidGhpcyIgKGltcGxpY2l0KQorCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA+PSB0aGlzLmNvZGVTbmlwcGV0U3RhcnQKKwkJCSYmIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxICsgdGhpcy5saW5lU2VwYXJhdG9yTGVuZ3RoIC8vIDE0ODM4CisJCQkmJiBpc1RvcExldmVsVHlwZSgpKSB7CisKKwkKKwkJTWVzc2FnZVNlbmQgbSA9IG5ld01lc3NhZ2VTZW5kV2l0aFR5cGVBcmd1bWVudHMoKTsKKwkJbS5zb3VyY2VFbmQgPSB0aGlzLnJQYXJlblBvczsKKwkJbS5zb3VyY2VTdGFydCA9CisJCQkoaW50KSAoKG0ubmFtZVNvdXJjZVBvc2l0aW9uID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdKSA+Pj4gMzIpOworCQltLnNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkKKwkJLy8gaGFuZGxlIHR5cGUgYXJndW1lbnRzCisJCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKKwkJdGhpcy5nZW5lcmljc1B0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5nZW5lcmljc1N0YWNrLCB0aGlzLmdlbmVyaWNzUHRyICsgMSwgbS50eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJdGhpcy5pbnRQdHItLTsKKwkKKwkJbS5yZWNlaXZlciA9IGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CisJCW0uc291cmNlU3RhcnQgPSBtLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OworCQlwdXNoT25FeHByZXNzaW9uU3RhY2sobSk7CisJfSBlbHNlIHsKKwkJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lV2l0aFR5cGVBcmd1bWVudHMoKTsKKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCkgewogCS8vIE1ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJwogCkBAIC0zODAsNiArNDE5LDI1IEBACiAJbS5yZWNlaXZlciA9IG5ldyBDb2RlU25pcHBldFN1cGVyUmVmZXJlbmNlKG0uc291cmNlU3RhcnQsIHRoaXMuZW5kUG9zaXRpb24pOwogCXB1c2hPbkV4cHJlc3Npb25TdGFjayhtKTsKIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXJXaXRoVHlwZUFyZ3VtZW50cygpIHsKKwkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcuJyBUeXBlQXJndW1lbnRzICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworCisJTWVzc2FnZVNlbmQgbSA9IG5ld01lc3NhZ2VTZW5kV2l0aFR5cGVBcmd1bWVudHMoKTsKKwl0aGlzLmludFB0ci0tOyAvLyBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdHlwZUFyZ3VtZW50cworCW0uc291cmNlRW5kID0gdGhpcy5yUGFyZW5Qb3M7CisJbS5uYW1lU291cmNlUG9zaXRpb24gPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl07CisJbS5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vIGhhbmRsZSB0eXBlIGFyZ3VtZW50cworCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0ci0tXTsKKwl0aGlzLmdlbmVyaWNzUHRyIC09IGxlbmd0aDsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZ2VuZXJpY3NTdGFjaywgdGhpcy5nZW5lcmljc1B0ciArIDEsIG0udHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJbS5zb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07IC8vIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzdXBlciBrZXl3b3JkCisKKwltLnJlY2VpdmVyID0gbmV3IENvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UobS5zb3VyY2VTdGFydCwgdGhpcy5lbmRQb3NpdGlvbik7CisJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG0pOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5VGhpcygpIHsKIAkvLyBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gJ3RoaXMnCiAKQEAgLTQ0NSw3ICs1MDMsNyBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudFJldHVybigpIHsKIAkvLyBSZXR1cm5TdGF0ZW1lbnQgOjo9ICdyZXR1cm4nIEV4cHJlc3Npb25vcHQgJzsnCiAKLQkvLyByZXR1cm5lZCB2YWx1ZSBpbnRlcmNlcHRlZCBieSBjb2RlIHNuaXBwZXQgCisJLy8gcmV0dXJuZWQgdmFsdWUgaW50ZXJjZXB0ZWQgYnkgY29kZSBzbmlwcGV0CiAJLy8gc3VwcG9ydCBoYXZlIHRvIGJlIGRlZmluZWQgYXQgdG9wbGV2ZWwgb25seQogCWlmICgodGhpcy5oYXNSZWNvdmVyZWRPbkV4cHJlc3Npb24KIAkJCXx8ICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA+PSB0aGlzLmNvZGVTbmlwcGV0U3RhcnQgJiYgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jb2RlU25pcHBldEVuZCsxK3RoaXMubGluZVNlcGFyYXRvckxlbmd0aCAvKiAxNDgzOCovKSkKQEAgLTQ1NSw4ICs1MTMsOCBAQAogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07CiAJCXB1c2hPbkFzdFN0YWNrKAogCQkJbmV3IENvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50KAotCQkJCWV4cHJlc3Npb24sIAotCQkJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsIAorCQkJCWV4cHJlc3Npb24sCisJCQkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJCQlleHByZXNzaW9uLnNvdXJjZUVuZCkpOwogCX0gZWxzZSB7CiAJCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKTsKQEAgLTQ3OSw4ICs1MzcsOCBAQAogCS8qIHJlY292ZXJ5ICovCiAJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50VHJ5KGJvb2xlYW4gYXJnXzApIHsKLQlzdXBlci5jb25zdW1lU3RhdGVtZW50VHJ5KGFyZ18wKTsKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRUcnkoYm9vbGVhbiBhcmdfMCwgYm9vbGVhbiBhcmdfMSkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRUcnkoYXJnXzAsIGFyZ18xKTsKIAkvKiByZWNvdmVyeSAqLwogCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOwogfQpAQCAtNTA3LDEyICs1NjUsMTIgQEAKIAogCQkJLy8gY29uc3VtZSBleHByZXNpb24gYXMgYSByZXR1cm4gc3RhdGVtZW50CiAJCQljb25zdW1lU3RhdGVtZW50UmV0dXJuKCk7Ci0JCQlpbnQgZmllbGRzQ291bnQgPSAKKwkJCWludCBmaWVsZHNDb3VudCA9CiAJCQkJKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzID09IG51bGwgPyAwIDogdGhpcy5ldmFsdWF0aW9uQ29udGV4dC5sb2NhbFZhcmlhYmxlTmFtZXMubGVuZ3RoKQogCQkJCSsgKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWUgPT0gbnVsbCA/IDAgOiAxKTsKLQkJCWlmICh0aGlzLmFzdFB0ciA+ICh0aGlzLmRpZXQgPyAwIDogMiArIGZpZWxkc0NvdW50KSkgeyAKKwkJCWlmICh0aGlzLmFzdFB0ciA+ICh0aGlzLmRpZXQgPyAwIDogMiArIGZpZWxkc0NvdW50KSkgewogCQkJCQkvLyBpbiBkaWV0IG1vZGUsIHRoZSBhc3Qgc3RhY2sgd2FzIGVtcHR5IHdoZW4gd2Ugd2VudCBmb3IgbWV0aG9kIGJvZHkKLQkJCQkJLy8gb3RoZXJ3aXNlIGl0IGNvbnRhaW5lZCB0aGUgdHlwZSwgdGhlIGdlbmVyYXRlZCBmaWVsZHMgZm9yIGxvY2FsIHZhcmlhYmxlcywgCisJCQkJCS8vIG90aGVyd2lzZSBpdCBjb250YWluZWQgdGhlIHR5cGUsIHRoZSBnZW5lcmF0ZWQgZmllbGRzIGZvciBsb2NhbCB2YXJpYWJsZXMsCiAJCQkJCS8vIHRoZSBnZW5lcmF0ZWQgZmllbGQgZm9yICd0aGlzJyBhbmQgdGhlIG1ldGhvZAogCQkJCWNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKTsKIAkJCX0KQEAgLTUzNyw3ICs1OTUsNyBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5OyBpKyspIHsKIAkJCQkvLyBza2lwIHVubWF0Y2hlZCBicmFja2V0IHByb2JsZW1zCiAJCQkJaWYgKHVuaXRSZXN1bHQucHJvYmxlbXNbaV0uZ2V0SUQoKSA9PSBJUHJvYmxlbS5Vbm1hdGNoZWRCcmFja2V0KSBjb250aW51ZTsKLQkJCQkKKwogCQkJCWludCBzdGFydCA9IHVuaXRSZXN1bHQucHJvYmxlbXNbaV0uZ2V0U291cmNlU3RhcnQoKTsKIAkJCQlpZiAoc3RhcnQgPiBtYXhSZWd1bGFyUG9zICYmIHN0YXJ0IDw9IHRoaXMuY29kZVNuaXBwZXRFbmQpIHsKIAkJCQkJbWF4UmVndWxhclBvcyA9IHN0YXJ0OwpAQCAtNTQ3LDcgKzYwNSw3IEBACiAJCQlmb3IgKGludCBpID0gdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeTsgaSA8IHByb2JsZW1Db3VudDsgaSsrKSB7CiAJCQkJLy8gc2tpcCB1bm1hdGNoZWQgYnJhY2tldCBwcm9ibGVtcwogCQkJCWlmICh1bml0UmVzdWx0LnByb2JsZW1zW2ldLmdldElEKCkgPT0gSVByb2JsZW0uVW5tYXRjaGVkQnJhY2tldCkgY29udGludWU7Ci0JCQkJCisKIAkJCQlpbnQgc3RhcnQgPSB1bml0UmVzdWx0LnByb2JsZW1zW2ldLmdldFNvdXJjZVN0YXJ0KCk7CiAJCQkJaWYgKHN0YXJ0ID4gbWF4UmVjb3ZlcnlQb3MgJiYgc3RhcnQgPD0gdGhpcy5jb2RlU25pcHBldEVuZCkgewogCQkJCQltYXhSZWNvdmVyeVBvcyA9IHN0YXJ0OwpAQCAtNTU1LDcgKzYxMyw3IEBACiAJCQl9CiAJCQlpZiAobWF4UmVjb3ZlcnlQb3MgPiBtYXhSZWd1bGFyUG9zKSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weSh1bml0UmVzdWx0LnByb2JsZW1zLCB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5LCB1bml0UmVzdWx0LnByb2JsZW1zLCAwLCBwcm9ibGVtQ291bnQgLSB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5KTsKLQkJCQl1bml0UmVzdWx0LnByb2JsZW1Db3VudCAtPSB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5OwkJCQkKKwkJCQl1bml0UmVzdWx0LnByb2JsZW1Db3VudCAtPSB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5OwogCQkJfSBlbHNlIHsKIAkJCQl1bml0UmVzdWx0LnByb2JsZW1Db3VudCAtPSAocHJvYmxlbUNvdW50IC0gdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeSk7CiAJCQl9CkBAIC01NzAsMTcgKzYyOCwxNyBAQAogcHJvdGVjdGVkIE5hbWVSZWZlcmVuY2UgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKSB7CiAJLyogYnVpbGQgYSAodW5zcGVjaWZpZWQpIE5hbWVSZWZlcmVuY2Ugd2hpY2ggbWF5IGJlIHF1YWxpZmllZCovCiAKLQlpZiAodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gdGhpcy5jb2RlU25pcHBldFN0YXJ0IAorCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA+PSB0aGlzLmNvZGVTbmlwcGV0U3RhcnQKIAkJJiYgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jb2RlU25pcHBldEVuZCsxK3RoaXMubGluZVNlcGFyYXRvckxlbmd0aCAvKjE0ODM4Ki8pewogCQlpbnQgbGVuZ3RoOwogCQlOYW1lUmVmZXJlbmNlIHJlZjsKIAkJaWYgKChsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKIAkJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKLQkJCXJlZiA9IAorCQkJcmVmID0KIAkJCQluZXcgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKAotCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLCAKKwkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKIAkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0sCi0JCQkJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOyAKKwkJCQkJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCk7CiAJCX0gZWxzZSB7CiAJCQkvL1F1YWxpZmllZCB2YXJpYWJsZSByZWZlcmVuY2UKIAkJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKQEAgLTU4OCw5ICs2NDYsOSBAQAogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKLQkJCXJlZiA9IAorCQkJcmVmID0KIAkJCQluZXcgQ29kZVNuaXBwZXRRdWFsaWZpZWROYW1lUmVmZXJlbmNlKHRva2VucywKLQkJCQkJcG9zaXRpb25zLCAKKwkJCQkJcG9zaXRpb25zLAogCQkJCQkoaW50KSAodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyAxXSA+PiAzMiksIC8vIHNvdXJjZVN0YXJ0CiAJCQkJCShpbnQpIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgbGVuZ3RoXSwKIAkJCQkJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCk7IC8vIHNvdXJjZUVuZApAQCAtNjA4LDE3ICs2NjYsMTcgQEAKIAl0aGF0IHdoZW4gYSBOYW1lUmVmZXJlbmNlIGlzIGJ1aWxkLCB0aGUgdHlwZSBjaGVja2VyIHNob3VsZCBhbHdheXMKIAlsb29rIGZvciB0aGF0IGl0IGlzIG5vdCBhIHR5cGUgcmVmZXJlbmNlICovCiAKLQlpZiAodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gdGhpcy5jb2RlU25pcHBldFN0YXJ0IAorCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA+PSB0aGlzLmNvZGVTbmlwcGV0U3RhcnQKIAkJJiYgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jb2RlU25pcHBldEVuZCsxK3RoaXMubGluZVNlcGFyYXRvckxlbmd0aCAvKjE0ODM4Ki8pewogCQlpbnQgbGVuZ3RoOwogCQlOYW1lUmVmZXJlbmNlIHJlZjsKIAkJaWYgKChsZW5ndGggPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKIAkJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKLQkJCXJlZiA9IAorCQkJcmVmID0KIAkJCQluZXcgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKAotCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLCAKKwkJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKIAkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV0sCi0JCQkJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOyAKKwkJCQkJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCk7CiAJCQlyZWYuYml0cyAmPSB+QVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOwogCQkJcmVmLmJpdHMgfD0gQmluZGluZy5MT0NBTCB8IEJpbmRpbmcuRklFTEQ7CiAJCQlyZXR1cm4gcmVmOwpAQCAtNjM3LDcgKzY5NSw3IEBACiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBsZW5ndGgpOwogCQlyZWYgPSBuZXcgQ29kZVNuaXBwZXRRdWFsaWZpZWROYW1lUmVmZXJlbmNlKAogCQkJCXRva2VucywKLQkJCQlwb3NpdGlvbnMsIAorCQkJCXBvc2l0aW9ucywKIAkJCQkoaW50KSAodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyAxXSA+PiAzMiksIC8vIHNvdXJjZVN0YXJ0CiAJCQkJKGludCkgdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHIgKyBsZW5ndGhdLAogCQkJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOyAvLyBzb3VyY2VFbmQKQEAgLTY2OCwxMSArNzI2LDI3IEBACiAJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJdGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aDsKIAkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLCAKLQkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsIAotCQkJbS5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAKLQkJCTAsIAotCQkJbGVuZ3RoKTsgCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCXRoaXMuZXhwcmVzc2lvblB0ciArIDEsCisJCQltLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKKwl9CisJcmV0dXJuIG07Cit9Citwcm90ZWN0ZWQgTWVzc2FnZVNlbmQgbmV3TWVzc2FnZVNlbmRXaXRoVHlwZUFyZ3VtZW50cygpIHsKKwkvLyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworCS8vIHRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBleHByZXNzaW9uIHN0YWNrCisJQ29kZVNuaXBwZXRNZXNzYWdlU2VuZCBtID0gbmV3IENvZGVTbmlwcGV0TWVzc2FnZVNlbmQodGhpcy5ldmFsdWF0aW9uQ29udGV4dCk7CisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQl0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQl0aGlzLmV4cHJlc3Npb25QdHIgKyAxLAorCQkJbS5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCXJldHVybiBtOwogfQpAQCAtNjg4LDcgKzc2Miw3IEBACiBwcm90ZWN0ZWQgdm9pZCByZXBvcnRTeW50YXhFcnJvcnMoYm9vbGVhbiBpc0RpZXRQYXJzZSwgaW50IG9sZEZpcnN0VG9rZW4pIHsKIAlpZiAoIWlzRGlldFBhcnNlKSB7CiAJCXRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPSB0aGlzLmxhc3RTdGF0ZW1lbnQ7Ci0JCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxOyAvLyBzdG9wIGFmdGVyIGV4cHJlc3Npb24gCisJCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxOyAvLyBzdG9wIGFmdGVyIGV4cHJlc3Npb24KIAkJb2xkRmlyc3RUb2tlbiA9IFRva2VuTmFtZVRXSURETEU7Ly9Ub2tlbk5hbWVSRU1BSU5ERVI7IC8vIGZpcnN0IHRva2VuIG9mIHRoIGV4cHJlc3Npb24gcGFyc2UKIAl9CiAJc3VwZXIucmVwb3J0U3ludGF4RXJyb3JzKGlzRGlldFBhcnNlLCBvbGRGaXJzdFRva2VuKTsKQEAgLTcwMSw3ICs3NzUsNyBAQAogCWlmICh0aGlzLmRpZXQgfHwgdGhpcy5oYXNSZWNvdmVyZWRPbkV4cHJlc3Npb24pIHsgLy8gbm8gcmVlbnRlcmluZyBpbnNpZGUgZXhwcmVzc2lvbiByZWNvdmVyeQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLy8gcmVjb3JkIHByZXZpb3VzIGVycm9yLCBpbiBjYXNlIG1vcmUgYWNjdXJhdGUgdGhhbiBwb3RlbnRpYWwgb25lIGluIGV4cHJlc3Npb24gcmVjb3ZlcnkKIAkvLyBlLmcuICJyZXR1cm4gZm9vKGEgYSk7IDErMyIKIAl0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5ID0gdGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50OwpAQCAtNzEzLDcgKzc4Nyw3IEBACiAJdGhpcy5zY2FubmVyLmluaXRpYWxQb3NpdGlvbiA9IHRoaXMubGFzdFN0YXRlbWVudDsKIAl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHRoaXMubGFzdFN0YXRlbWVudDsKIAl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy5sYXN0U3RhdGVtZW50OwotCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRFbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxIDogdGhpcy5jb2RlU25pcHBldEVuZDsgLy8gc3RvcCBhZnRlciBleHByZXNzaW9uIAorCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRFbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxIDogdGhpcy5jb2RlU25pcHBldEVuZDsgLy8gc3RvcCBhZnRlciBleHByZXNzaW9uCiAJdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKIAogCS8vIHJlc2V0IHN0YWNrcyBpbiBjb25zaXN0ZW50IHN0YXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQppbmRleCBjMGY5OGRhLi44MzFjMjJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRRdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw5ICs3LDExIEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDE4NTY4MiAtIEluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0b3JzIG1hcmsgbG9jYWwgdmFyaWFibGVzIGFzIHJlYWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21wb3VuZEFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOwpAQCAtMTcsMjQgKzE5LDI0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWROYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkludm9jYXRpb25TaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKIAotcHVibGljIGNsYXNzIENvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBleHRlbmRzIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBJbnZvY2F0aW9uU2l0ZSwgUHJvYmxlbVJlYXNvbnMgeworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBleHRlbmRzIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBQcm9ibGVtUmVhc29ucyB7CiAKIAlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKIAlGaWVsZEJpbmRpbmcgZGVsZWdhdGVUaGlzOwpAQCAtNDYsMjU5ICs0OCwyNjEgQEAKICAqLwogcHVibGljIENvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZShjaGFyW11bXSBzb3VyY2VzLCBsb25nW10gcG9zaXRpb25zLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQsIEV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0KSB7CiAJc3VwZXIoc291cmNlcywgcG9zaXRpb25zLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKLQl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7CQorCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQgPSBldmFsdWF0aW9uQ29udGV4dDsKIH0KKwogLyoqCiAgKiBDaGVjayBhbmQvb3IgcmVkaXJlY3QgdGhlIGZpZWxkIGFjY2VzcyB0byB0aGUgZGVsZWdhdGUgcmVjZWl2ZXIgaWYgYW55CiAgKi8KIHB1YmxpYyBUeXBlQmluZGluZyBjaGVja0ZpZWxkQWNjZXNzKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOworCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKKwlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGZpZWxkQmluZGluZy5vcmlnaW5hbCgpLmRlY2xhcmluZ0NsYXNzOwogCS8vIGNoZWNrIGZvciBmb3J3YXJkIHJlZmVyZW5jZXMKLQl0aGlzLmJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKKwlpZiAoKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEgfHwgZGVjbGFyaW5nQ2xhc3MuaXNFbnVtKCkpCisJCQkmJiBtZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgPT0gZGVjbGFyaW5nQ2xhc3MKKwkJCSYmIG1ldGhvZFNjb3BlLmxhc3RWaXNpYmxlRmllbGRJRCA+PSAwCisJCQkmJiBmaWVsZEJpbmRpbmcuaWQgPj0gbWV0aG9kU2NvcGUubGFzdFZpc2libGVGaWVsZElECisJCQkmJiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpIHx8IG1ldGhvZFNjb3BlLmlzU3RhdGljKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5mb3J3YXJkUmVmZXJlbmNlKHRoaXMsIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nLTEsIGZpZWxkQmluZGluZyk7CisJfQorCXRoaXMuYml0cyAmPSB+QVNUTm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCiAJdGhpcy5iaXRzIHw9IEJpbmRpbmcuRklFTEQ7CiAJcmV0dXJuIGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CiB9Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAotCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKLQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKLQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGxhc3RGaWVsZEJpbmRpbmcsIG51bGwsIHZhbHVlUmVxdWlyZWQpOwotCX0gZWxzZSB7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKLQkJY29kZVN0cmVhbS5zd2FwKCk7Ci0JCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKCh0aGlzLmJpdHMgJiBCaW5kaW5nLlZBUklBQkxFKSA9PSAwKSB7IC8vIG5vdGhpbmcgdG8gZG8gaWYgdHlwZSByZWYKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJcmV0dXJuOworCX0KKwlGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZyA9IHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nIDogdGhpcy5vdGhlckJpbmRpbmdzW3RoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGgtMV07CisJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0RmluYWxSZWNlaXZlclR5cGUoKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQlzdXBlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmV0dXJuOworCX0KKwlsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsKSB7CisJCWJvb2xlYW4gaXNTdGF0aWMgPSBsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCk7CisJCUNvbnN0YW50IGZpZWxkQ29uc3RhbnQgPSBsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50KCk7CisJCWlmIChmaWVsZENvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJaWYgKCFpc1N0YXRpYyl7CisJCQkJY29kZVN0cmVhbS5pbnZva2VPYmplY3RHZXRDbGFzcygpOworCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQl9CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeyAvLyBpbmxpbmUgdGhlIGxhc3QgZmllbGQgY29uc3RhbnQKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRDb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJfQorCQl9IGVsc2UgeworCQkJYm9vbGVhbiBpc0ZpcnN0ID0gbGFzdEZpZWxkQmluZGluZyA9PSB0aGlzLmJpbmRpbmcKKwkJCQkJCQkJCQkJJiYgKHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEgfHwgbGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nUmVjZWl2ZXJUeXBlKCkpCisJCQkJCQkJCQkJCSYmIHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsOyAvLyBjb3VsZCBiZSBkdXA6IG5leHQubmV4dC5uZXh0CisJCQlUeXBlQmluZGluZyByZXF1aXJlZEdlbmVyaWNDYXN0ID0gZ2V0R2VuZXJpY0Nhc3QodGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aCk7CisJCQlpZiAodmFsdWVSZXF1aXJlZAorCQkJCQl8fCAoIWlzRmlyc3QgJiYgY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80KQorCQkJCQl8fCAoKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgVHlwZUlkcy5VTkJPWElORykgIT0gMCkKKwkJCQkJfHwgcmVxdWlyZWRHZW5lcmljQ2FzdCAhPSBudWxsKSB7CisJCQkJaW50IGxhc3RGaWVsZFBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7IC8vIGFycmF5IGxlbmd0aAorCQkJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGNvdWxkIG9jY3VyIGlmICF2YWx1ZVJlcXVpcmVkIGJ1dCBjb21wbGlhbmNlID49IDEuNAorCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJaWYgKHJlcXVpcmVkR2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QocmVxdWlyZWRHZW5lcmljQ2FzdCk7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJvb2xlYW4gaXNVbmJveGluZyA9ICh0aGlzLmltcGxpY2l0Q29udmVyc2lvbiAmIFR5cGVJZHMuVU5CT1hJTkcpICE9IDA7CisJCQkJCQkvLyBjb252ZXJzaW9uIG9ubHkgZ2VuZXJhdGVkIGlmIHVuYm94aW5nCisJCQkJCQlpZiAoaXNVbmJveGluZykgY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJCQlzd2l0Y2ggKGlzVW5ib3hpbmcgPyBwb3N0Q29udmVyc2lvblR5cGUoY3VycmVudFNjb3BlKS5pZCA6IGxhc3RGaWVsZEJpbmRpbmcudHlwZS5pZCkgeworCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQkJY29kZVN0cmVhbS5wb3AyKCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaW50IGZpZWxkUG9zaXRpb24gPSAoaW50KSAodGhpcy5zb3VyY2VQb3NpdGlvbnNbdGhpcy5zb3VyY2VQb3NpdGlvbnMubGVuZ3RoIC0gMV0gPj4+IDMyKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20obGFzdEZpZWxkUGMsIGZpZWxkUG9zaXRpb24pOwogCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCWlmICghaXNTdGF0aWMpeworCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCX0KIAkJCX0KIAkJfQotCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwogCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorLyoqCisgKiBDaGVjayBhbmQvb3IgcmVkaXJlY3QgdGhlIGZpZWxkIGFjY2VzcyB0byB0aGUgZGVsZWdhdGUgcmVjZWl2ZXIgaWYgYW55CisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworICAgIEZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gdGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcgOiB0aGlzLm90aGVyQmluZGluZ3NbdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aC0xXTsKKwlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRGaW5hbFJlY2VpdmVyVHlwZSgpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCXN1cGVyLmdlbmVyYXRlQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGFzc2lnbm1lbnQsIHZhbHVlUmVxdWlyZWQpOworCQlyZXR1cm47CisJfQorCWxhc3RGaWVsZEJpbmRpbmcgPSBnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwljb2RlU3RyZWFtLnN3YXAoKTsKKwlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJc3dpdGNoIChsYXN0RmllbGRCaW5kaW5nLnR5cGUuaWQpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQlicmVhazsJCisJCX0JCQorCX0KKwljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwogCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwogCX0KIH0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCWlmICh0aGlzLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHRoaXMuY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsgCi0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpZiAobGFzdEZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7IC8vIGFycmF5IGxlbmd0aAotCQkJCWNvZGVTdHJlYW0uYXJyYXlsZW5ndGgoKTsKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQoKTsKLQkJCQlpZiAoZmllbGRDb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCQkJaWYgKCFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpewotCQkJCQkJY29kZVN0cmVhbS5pbnZva2VPYmplY3RHZXRDbGFzcygpOwotCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKLQkJCQkJfQotCQkJCQkvLyBpbmxpbmUgdGhlIGxhc3QgZmllbGQgY29uc3RhbnQKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGZpZWxkQ29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKLQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKLQkJCQkJfQkKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbih0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcgIT0gbnVsbCAmJiAhbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKLQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjawotCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQotCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKLQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKLQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworICAgIEZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gdGhpcy5vdGhlckJpbmRpbmdzID09IG51bGwgPyAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcgOiB0aGlzLm90aGVyQmluZGluZ3NbdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aC0xXTsKKwlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRGaW5hbFJlY2VpdmVyVHlwZSgpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCXN1cGVyLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZXhwcmVzc2lvbiwgb3BlcmF0b3IsIGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOworCQlyZXR1cm47CisJfQorCWxhc3RGaWVsZEJpbmRpbmcgPSBnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpeworCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCWNvZGVTdHJlYW0uc3dhcCgpOworCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCWNvZGVTdHJlYW0uc3dhcCgpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJfSBlbHNlIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQljb2RlU3RyZWFtLnN3YXAoKTsKKwkJY29kZVN0cmVhbS5kdXAoKTsKKworCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJfQorCS8vIHRoZSBsYXN0IGZpZWxkIGFjY2VzcyBpcyBhIHdyaXRlIGFjY2VzcworCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KKwlpbnQgb3BlcmF0aW9uVHlwZUlEOworCWlmICgob3BlcmF0aW9uVHlwZUlEID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSA9PSBUX0phdmFMYW5nU3RyaW5nKSB7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJfSBlbHNlIHsKKwkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCisJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKXsgLy8gcHJlZml4IG9wZXJhdGlvbgorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfSBlbHNlIHsKLQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJfQotCQkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKLQkJLy8gcGVyZm9ybSB0aGUgYWN0dWFsIGNvbXBvdW5kIG9wZXJhdGlvbgotCQlpbnQgb3BlcmF0aW9uVHlwZUlEOwotCQlzd2l0Y2gob3BlcmF0aW9uVHlwZUlEID0gKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSB7Ci0JCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgotCQkJY2FzZSBUX0phdmFMYW5nT2JqZWN0IDoKLQkJCWNhc2UgVF91bmRlZmluZWQgOgotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwl9CisJLy8gYWN0dWFsIGFzc2lnbm1lbnQKKworCS8vIGN1cnJlbnQgc3RhY2sgaXM6CisJLy8gZmllbGQgcmVjZWl2ZXIgdmFsdWUKKwlpZiAodmFsdWVSZXF1aXJlZCkgeworCQlzd2l0Y2ggKGxhc3RGaWVsZEJpbmRpbmcudHlwZS5pZCkgeworCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6Ci0JCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQotCQkJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKXsgLy8gcHJlZml4IG9wZXJhdGlvbgotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgotCQkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKG9wZXJhdG9yLCBvcGVyYXRpb25UeXBlSUQpOwotCQkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfQotCQkvLyBhY3R1YWwgYXNzaWdubWVudAotCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGxhc3RGaWVsZEJpbmRpbmcsIG51bGwsIHZhbHVlUmVxdWlyZWQpOwotCX0gZWxzZSB7Ci0JCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJY29kZVN0cmVhbS5zd2FwKCk7Ci0JCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7Ci0JCQljb2RlU3RyZWFtLnN3YXAoKTsKLQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQl9IGVsc2UgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJY29kZVN0cmVhbS5zd2FwKCk7Ci0JCQljb2RlU3RyZWFtLmR1cCgpOwotCi0JCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7Ci0JCX0KLQkJLy8gdGhlIGxhc3QgZmllbGQgYWNjZXNzIGlzIGEgd3JpdGUgYWNjZXNzCi0JCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KLQkJaW50IG9wZXJhdGlvblR5cGVJRDsKLQkJaWYgKChvcGVyYXRpb25UeXBlSUQgPSAodGhpcy5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpID09IFRfSmF2YUxhbmdTdHJpbmcpIHsKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdDb25jYXRlbmF0aW9uQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBwcm9tb3RlIHRoZSBhcnJheSByZWZlcmVuY2UgdG8gdGhlIHN1aXRhYmxlIG9wZXJhdGlvbiB0eXBlCi0JCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQotCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpeyAvLyBwcmVmaXggb3BlcmF0aW9uCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKLQkJCX0KLQkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgotCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7Ci0JCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKLQkJfQotCQkvLyBhY3R1YWwgYXNzaWdubWVudAotCi0JCS8vIGN1cnJlbnQgc3RhY2sgaXM6Ci0JCS8vIGZpZWxkIHJlY2VpdmVyIHZhbHVlCi0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpZiAoKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKLQkJCX0gZWxzZSB7CiAJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKLQkJCX0KKwkJCWJyZWFrOwkKIAkJfQotCQkvLyBjdXJyZW50IHN0YWNrIGlzOgotCQkvLyB2YWx1ZSBmaWVsZCByZWNlaXZlciB2YWx1ZQkJCQkKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKIAl9CisJLy8gY3VycmVudCBzdGFjayBpczoKKwkvLyB2YWx1ZSBmaWVsZCByZWNlaXZlciB2YWx1ZQorCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CiB9CiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCi0gICAgRmllbGRCaW5kaW5nIGxhc3RGaWVsZEJpbmRpbmcgPSBnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwotCWlmIChsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7Ci0JCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpewotCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKLQkJfQkKLQkJLy8gZHVwbGljYXRlIHRoZSBvbGQgZmllbGQgdmFsdWUKLQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQlpZiAoKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXSAgLS0tPiBbb2xkIGZpZWxkIHZhbHVlXVtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXQotCQkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGxhc3RGaWVsZEJpbmRpbmcudHlwZS5pZCk7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOwotCQkKLQkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCBudWxsLCBmYWxzZSk7Ci0JfSBlbHNlIHsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaWYgKChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQl9Ci0JCX0KLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQlpZiAoKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7Ci0JCQljb2RlU3RyZWFtLnBvcCgpOwotCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKLQkJCX0KLQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7Ci0JCQljb2RlU3RyZWFtLnBvcCgpOwkJCQkJCi0JCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJY29kZVN0cmVhbS5wb3AoKTsKLQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7Ci0JCQl9IGVsc2UgewotCQkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7Ci0JCQl9Ci0JCQljb2RlU3RyZWFtLmR1cF94MSgpOwotCQkJY29kZVN0cmVhbS5wb3AoKTsJCQkJCQotCQl9Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgbGFzdEZpZWxkQmluZGluZy50eXBlLmlkKTsKLQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisgICAgRmllbGRCaW5kaW5nIGxhc3RGaWVsZEJpbmRpbmcgPSB0aGlzLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZyA6IHRoaXMub3RoZXJCaW5kaW5nc1t0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoLTFdOworCWlmIChsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldEZpbmFsUmVjZWl2ZXJUeXBlKCksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJc3VwZXIuZ2VuZXJhdGVQb3N0SW5jcmVtZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgcG9zdEluY3JlbWVudCwgdmFsdWVSZXF1aXJlZCk7CisJCXJldHVybjsKIAl9CisJbGFzdEZpZWxkQmluZGluZyA9IGdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCXN3aXRjaCAobGFzdEZpZWxkQmluZGluZy50eXBlLmlkKSB7CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJYnJlYWs7CQorCQl9CQkKKwl9CisJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgeworCQljb2RlU3RyZWFtLmR1cF94MigpOworCQljb2RlU3RyZWFtLnBvcCgpOworCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCX0gZWxzZSB7CisJCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQl9CisJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCWNvZGVTdHJlYW0ucG9wKCk7CisJfSBlbHNlIHsKKwkJY29kZVN0cmVhbS5kdXBfeDEoKTsKKwkJY29kZVN0cmVhbS5wb3AoKTsKKwkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQl9IGVsc2UgeworCQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJfQorCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQljb2RlU3RyZWFtLnBvcCgpOworCX0KKwljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgbGFzdEZpZWxkQmluZGluZy50eXBlLmlkKTsKKwljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQucHJlQXNzaWduSW1wbGljaXRDb252ZXJzaW9uKTsKKwljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwogfQorCiAvKgogICogR2VuZXJhdGUgY29kZSBmb3IgYWxsIGJpbmRpbmdzIChsb2NhbCBhbmQgZmllbGRzKSBleGNsdWRpbmcgdGhlIGxhc3Qgb25lLCB3aGljaCBtYXkgdGhlbiBiZSBnZW5lcmF0ZWQgY29kZQogICogZm9yIGEgcmVhZCBvciB3cml0ZSBhY2Nlc3MuCiAgKi8KIHB1YmxpYyBGaWVsZEJpbmRpbmcgZ2VuZXJhdGVSZWFkU2VxdWVuY2UoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotICAgIAogCS8vIGRldGVybWluZSB0aGUgcmFuayB1bnRpbCB3aGljaCB3ZSBub3cgd2UgZG8gbm90IG5lZWQgYW55IGFjdHVhbCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGFjY2VzcwotCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IG51bGwgPyAwIDogdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGg7CisJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHRoaXMub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7CiAJYm9vbGVhbiBuZWVkVmFsdWUgPSBvdGhlckJpbmRpbmdzQ291bnQgPT0gMCB8fCAhdGhpcy5vdGhlckJpbmRpbmdzWzBdLmlzU3RhdGljKCk7Ci0JRmllbGRCaW5kaW5nIGxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOwotCVR5cGVCaW5kaW5nIGxhc3RHZW5lcmljQ2FzdCA9IG51bGw7CisJRmllbGRCaW5kaW5nIGxhc3RGaWVsZEJpbmRpbmc7CisJVHlwZUJpbmRpbmcgbGFzdEdlbmVyaWNDYXN0OworCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGU7CisJYm9vbGVhbiBjb21wbHlUbzE0ID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OwogCQogCXN3aXRjaCAodGhpcy5iaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewogCQljYXNlIEJpbmRpbmcuRklFTEQgOgotCQkJbGFzdEZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQlsYXN0RmllbGRCaW5kaW5nID0gKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZykub3JpZ2luYWwoKTsKIAkJCWxhc3RHZW5lcmljQ2FzdCA9IHRoaXMuZ2VuZXJpY0Nhc3Q7CisJCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7CiAJCQkvLyBpZiBmaXJzdCBmaWVsZCBpcyBhY3R1YWxseSBjb25zdGFudCwgd2UgY2FuIGlubGluZSBpdAogCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChuZWVkVmFsdWUpIHsKLQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CiAJCQkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CiAJCQkJCQlpZiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOwpAQCAtMzEzLDE5ICszMTcsMjIgQEAKIAkJCQkJCWlmICgodGhpcy5iaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CiAJCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKIAkJCQkJCQkvLyBub3QgeWV0IHN1cHBvcnRlZAotCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKHRoaXMpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewogCQkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOwogCQkJCQl9Ci0JCQkJfQkJCQkKKwkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gcmVhZGluZyB0aGUgZmlyc3QgbG9jYWwgdmFyaWFibGUKKwkJCWxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOworCQkJbGFzdEdlbmVyaWNDYXN0ID0gbnVsbDsKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJbGFzdFJlY2VpdmVyVHlwZSA9IGxvY2FsQmluZGluZy50eXBlOwogCQkJaWYgKCFuZWVkVmFsdWUpIGJyZWFrOyAvLyBubyB2YWx1ZSBuZWVkZWQKLQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKIAkJCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgcmVhZAogCQkJQ29uc3RhbnQgbG9jYWxDb25zdGFudCA9IGxvY2FsQmluZGluZy5jb25zdGFudCgpOwogCQkJaWYgKGxvY2FsQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CkBAIC0zMzMsNyArMzQwLDcgQEAKIAkJCQkvLyBubyBpbXBsaWNpdCBjb252ZXJzaW9uCiAJCQl9IGVsc2UgewogCQkJCS8vIG91dGVyIGxvY2FsPwotCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCWlmICgodGhpcy5iaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CiAJCQkJCS8vIG91dGVyIGxvY2FsIGNhbiBiZSByZWFjaGVkIGVpdGhlciB0aHJvdWdoIGEgc3ludGhldGljIGFyZyBvciBhIHN5bnRoZXRpYyBmaWVsZAogCQkJCQlWYXJpYWJsZUJpbmRpbmdbXSBwYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgobG9jYWxCaW5kaW5nKTsKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGxvY2FsQmluZGluZywgY3VycmVudFNjb3BlKTsKQEAgLTM0MSw2MiArMzQ4LDEwNyBAQAogCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKIAkJCQl9CiAJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdCA6IC8vIHNob3VsZCBub3Qgb2NjdXIKKwkJCXJldHVybiBudWxsOwkJCQogCX0KLQogCS8vIGFsbCBpbnRlcm1lZGlhdGUgZmllbGQgYWNjZXNzZXMgYXJlIHJlYWQgYWNjZXNzZXMKIAkvLyBvbmx5IHRoZSBsYXN0IGZpZWxkIGJpbmRpbmcgaXMgYSB3cml0ZSBhY2Nlc3MKLQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyAhPSBudWxsKSB7CisJaW50IHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc291cmNlUG9zaXRpb25zLmxlbmd0aDsKKwlGaWVsZEJpbmRpbmcgaW5pdGlhbEZpZWxkQmluZGluZyA9IGxhc3RGaWVsZEJpbmRpbmc7IC8vIGNhbiBiZSBudWxsIGlmIGluaXRpYWwgd2FzIGEgbG9jYWwgYmluZGluZworCWlmICh0aGlzLm90aGVyQmluZGluZ3MgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7Ci0JCQlGaWVsZEJpbmRpbmcgbmV4dEZpZWxkID0gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5nc1tpXTsKKwkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQlGaWVsZEJpbmRpbmcgbmV4dEZpZWxkID0gdGhpcy5vdGhlckJpbmRpbmdzW2ldLm9yaWdpbmFsKCk7CiAJCQlUeXBlQmluZGluZyBuZXh0R2VuZXJpY0Nhc3QgPSB0aGlzLm90aGVyR2VuZXJpY0Nhc3RzID09IG51bGwgPyBudWxsIDogdGhpcy5vdGhlckdlbmVyaWNDYXN0c1tpXTsKIAkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwpIHsKIAkJCQluZWVkVmFsdWUgPSAhbmV4dEZpZWxkLmlzU3RhdGljKCk7Ci0JCQkJaWYgKG5lZWRWYWx1ZSkgewotCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQkJCQkJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQoKTsKLQkJCQkJCWlmIChmaWVsZENvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IHRoaXMuY29kZWdlbkJpbmRpbmcgJiYgIWxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjawotCQkJCQkJCQljb2RlU3RyZWFtLnBvcCgpOwotCQkJCQkJCX0KLQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRDb25zdGFudCwgMCk7Ci0JCQkJCQl9IGVsc2UgaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJCQl9Ci0JCQkJCWlmIChsYXN0R2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QobGFzdEdlbmVyaWNDYXN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZyAhPSBsYXN0RmllbGRCaW5kaW5nICYmICFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpeworCQkJCUNvbnN0YW50IGZpZWxkQ29uc3RhbnQgPSBsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50KCk7CisJCQkJaWYgKGZpZWxkQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQkJCWlmIChpID4gMCAmJiAhbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CiAJCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjawogCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKLQkJCQkJfQkJCQkJCQorCQkJCQl9CisJCQkJCWlmIChuZWVkVmFsdWUpIHsKKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChmaWVsZENvbnN0YW50LCAwKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChuZWVkVmFsdWUgfHwgKGkgPiAwICYmIGNvbXBseVRvMTQpIHx8IGxhc3RHZW5lcmljQ2FzdCAhPSBudWxsKSB7CisJCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShsYXN0UmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJCQkJTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ludGhldGljUmVhZEFjY2Vzc29yc1tpXTsKKwkJCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBsYXN0RmllbGRCaW5kaW5nLCBsYXN0UmVjZWl2ZXJUeXBlLCBpID09IDAgJiYgdGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPT0gMSk7CisJCQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBsYXN0RmllbGRCaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCBsYXN0RmllbGRCaW5kaW5nLCBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmludm9rZShPcGNvZGVzLk9QQ19pbnZva2VzdGF0aWMsIGFjY2Vzc29yLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQkJfQorCQkJCQkJaWYgKGxhc3RHZW5lcmljQ2FzdCAhPSBudWxsKSB7CisJCQkJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QobGFzdEdlbmVyaWNDYXN0KTsKKwkJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gbGFzdEdlbmVyaWNDYXN0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gbGFzdEZpZWxkQmluZGluZy50eXBlOworCQkJCQkJfQorCQkJCQkJaWYgKCFuZWVkVmFsdWUpIGNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZyA9PSBpbml0aWFsRmllbGRCaW5kaW5nKSB7CisJCQkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CisJCQkJCQkJCS8vIGlmIG5vIHZhbHVlUmVxdWlyZWQsIHN0aWxsIG5lZWQgcG9zc2libGUgc2lkZS1lZmZlY3RzIG9mIDxjbGluaXQ+IGludm9jYXRpb24sIGlmIGZpZWxkIGJlbG9uZ3MgdG8gZGlmZmVyZW50IGNsYXNzCisJCQkJCQkJCWlmIChpbml0aWFsRmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSkgeworCQkJCQkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkobGFzdFJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCQkJCQkJCU1ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPSB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY1JlYWRBY2Nlc3NvcnNbaV07CisJCQkJCQkJCQkJaWYgKGFjY2Vzc29yID09IG51bGwpIHsKKwkJCQkJCQkJCQkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgbGFzdFJlY2VpdmVyVHlwZSwgaSA9PSAwICYmIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpOworCQkJCQkJCQkJCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldHN0YXRpYywgbGFzdEZpZWxkQmluZGluZywgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlKE9wY29kZXMuT1BDX2ludm9rZXN0YXRpYywgYWNjZXNzb3IsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKKwkJCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQl9CisJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gbGFzdEZpZWxkQmluZGluZy50eXBlOworCQkJCQl9CisJCQkJCWlmICgocG9zaXRpb25zTGVuZ3RoIC0gb3RoZXJCaW5kaW5nc0NvdW50ICsgaSAtIDEpID49IDApIHsKKwkJCQkJCWludCBmaWVsZFBvc2l0aW9uID0gKGludCkgKHRoaXMuc291cmNlUG9zaXRpb25zW3Bvc2l0aW9uc0xlbmd0aCAtIG90aGVyQmluZGluZ3NDb3VudCArIGkgLSAxXSA+Pj4zMik7CisJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIGZpZWxkUG9zaXRpb24pOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJbGFzdEZpZWxkQmluZGluZyA9IG5leHRGaWVsZDsKIAkJCWxhc3RHZW5lcmljQ2FzdCA9IG5leHRHZW5lcmljQ2FzdDsKLQkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwgJiYgIWxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwgJiYgIWxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkobGFzdFJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOwogCQkJCX0KLQkJCX0KLQkJfQkJCQorCQkJfQkJCQorCQl9CiAJfQotCXJldHVybiBsYXN0RmllbGRCaW5kaW5nOworCXJldHVybiBsYXN0RmllbGRCaW5kaW5nOwkKIH0KIAorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlY2VpdmVyKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwogCWlmICh0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsKSB7Ci0JCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5kZWxlZ2F0ZVRoaXMpOyAvLyBkZWxlZ2F0ZWQgZmllbGQgYWNjZXNzCisJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIHRoaXMuZGVsZWdhdGVUaGlzLCBudWxsIC8qIGRlZmF1bHQgZGVjbGFyaW5nQ2xhc3MgKi8pOyAvLyBkZWxlZ2F0ZWQgZmllbGQgYWNjZXNzCiAJfQogfQorCiBwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBBdCB0aGlzIHBvaW50IHJlc3RyaWN0aXZlRmxhZyBtYXkgT05MWSBoYXZlIHR3byBwb3RlbnRpYWwgdmFsdWUgOiBGSUVMRCBMT0NBTCAoaS5lIGNhc3QgPDwoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nPj4gaXMgdmFsaWQpCi0KIAlpbnQgbGVuZ3RoID0gdGhpcy50b2tlbnMubGVuZ3RoOwogCWlmICgodGhpcy5iaXRzICYgQmluZGluZy5GSUVMRCkgIT0gMCkgewogCQlpZiAoISgoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLmlzU3RhdGljKCkpIHsgLy9tdXN0IGNoZWNrIGZvciB0aGUgc3RhdGljIHN0YXR1cy4uLi4KQEAgLTQwNiwxMyArNDU4LDEzIEBACiAJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSh0aGlzLCAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpOwogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9Ci0JCQl9IGVsc2UgeyAvL2FjY2Vzc2luZyB0byBhIGZpZWxkIHVzaW5nIGEgdHlwZSBhcyAicmVjZWl2ZXIiIGlzIGFsbG93ZWQgb25seSB3aXRoIHN0YXRpYyBmaWVsZAkKKwkJCX0gZWxzZSB7IC8vYWNjZXNzaW5nIHRvIGEgZmllbGQgdXNpbmcgYSB0eXBlIGFzICJyZWNlaXZlciIgaXMgYWxsb3dlZCBvbmx5IHdpdGggc3RhdGljIGZpZWxkCiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKHRoaXMsIChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZyk7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCX0KIAkJLy8gb25seSBsYXN0IGZpZWxkIGlzIGFjdHVhbGx5IGEgd3JpdGUgYWNjZXNzIGlmIGFueQotCQlpZiAoaXNGaWVsZFVzZURlcHJlY2F0ZWQoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nLCBzY29wZSwgKHRoaXMuYml0cyAmIElzU3RyaWN0bHlBc3NpZ25lZCkgIT0wICYmIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IGxlbmd0aCkpIHsKKwkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZywgc2NvcGUsIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IGxlbmd0aCA/IHRoaXMuYml0cyA6IDApKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nLCB0aGlzKTsKIAkJfQogCX0KQEAgLTQyNiwxMiArNDc4LDEyIEBACiAKIAkvLyBhbGxvY2F0aW9uIG9mIHRoZSBmaWVsZEJpbmRpbmdzIGFycmF5CWFuZCBpdHMgcmVzcGVjdGl2ZSBjb25zdGFudHMKIAlpbnQgb3RoZXJCaW5kaW5nc0xlbmd0aCA9IGxlbmd0aCAtIGluZGV4OwotCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPSB0aGlzLm90aGVyQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW290aGVyQmluZGluZ3NMZW5ndGhdOwotCQorCXRoaXMub3RoZXJCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbb3RoZXJCaW5kaW5nc0xlbmd0aF07CisKIAkvLyBmaWxsIHRoZSBmaXJzdCBjb25zdGFudCAodGhlIG9uZSBvZiB0aGUgYmluZGluZykKIAl0aGlzLmNvbnN0YW50ID0oKFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nKS5jb25zdGFudCgpOwogCi0JLy8gaXRlcmF0aW9uIG9uIGVhY2ggZmllbGQJCisJLy8gaXRlcmF0aW9uIG9uIGVhY2ggZmllbGQKIAl3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHsKIAkJY2hhcltdIHRva2VuID0gdGhpcy50b2tlbnNbaW5kZXhdOwogCQlpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gY291bGQgbm90IHJlc29sdmUgdHlwZSBwcmlvciB0byB0aGlzIHBvaW50CkBAIC00NDcsNiArNDk5LDcgQEAKIAkJCQkJaWYgKHRoaXMuZGVsZWdhdGVUaGlzID09IG51bGwpeyAgLy8gaWYgbm90IGZvdW5kIHRoZW4gaW50ZXJuYWwgZXJyb3IsIGZpZWxkIHNob3VsZCBoYXZlIGJlZW4gZm91bmQKIAkJCQkJCXJldHVybiBzdXBlci5yZXBvcnRFcnJvcihzY29wZSk7CiAJCQkJCX0KKwkJCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcy50eXBlOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7IC8vZG9uJ3QgZmlsbCBvdGhlciBjb25zdGFudHMgc2xvdHMuLi4KIAkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIGZpZWxkLCBpbmRleCwgdHlwZSk7CkBAIC00NTgsNyArNTExLDcgQEAKIAkJfQogCQlpZiAoZmllbGQuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJLy8gb25seSBsYXN0IGZpZWxkIGlzIGFjdHVhbGx5IGEgd3JpdGUgYWNjZXNzIGlmIGFueQotCQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkLCBzY29wZSwgKHRoaXMuYml0cyAmIElzU3RyaWN0bHlBc3NpZ25lZCkgIT0wICYmIGluZGV4KzEgPT0gbGVuZ3RoKSkgeworCQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkLCBzY29wZSwgaW5kZXgrMSA9PSBsZW5ndGggPyB0aGlzLmJpdHMgOiAwKSkgewogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZCwgdGhpcyk7CiAJCQl9CiAJCQkvLyBjb25zdGFudCBwcm9wYWdhdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgcHJldmlvdXMgb25lIGlzIGEgY29uc3RhbnQgdG9vLgpAQCAtNDc1LDkzICs1MjgsMjQgQEAKIAl9CiAJcmV0dXJuICh0aGlzLm90aGVyQmluZGluZ3Nbb3RoZXJCaW5kaW5nc0xlbmd0aCAtIDFdKS50eXBlOwogfQotCS8qKgotCSAqIENoZWNrIGFuZC9vciByZWRpcmVjdCB0aGUgZmllbGQgYWNjZXNzIHRvIHRoZSBkZWxlZ2F0ZSByZWNlaXZlciBpZiBhbnkKLQkgKi8KLQlwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0UmVjZWl2ZXJUeXBlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7Ci0JCVNjb3BlIHNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsKLQkJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6Ci0JCQkJCQlyZXR1cm4gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7Ci0JCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIGluZGV4IGlzIDwwIHRvIGRlbm90ZSB3cml0ZSBhY2Nlc3MgZW11bGF0aW9uCi0JICovCQkKLQlwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsCi0JCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGUsCi0JCWludCBpbmRleCwKLQkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAotCQlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRSkgIT0gMCkgcmV0dXJuOwotCQotCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KLQkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCi0JCWJvb2xlYW4gdXNlRGVsZWdhdGU7Ci0JCWlmIChpbmRleCA8IDApIHsgLy8gd3JpdGUtYWNjZXNzPwotCQkgICAgdXNlRGVsZWdhdGUgPSBmaWVsZEJpbmRpbmcgPT0gdGhpcy5iaW5kaW5nICYmIHRoaXMuZGVsZWdhdGVUaGlzICE9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VEZWxlZ2F0ZSA9IGluZGV4ID09IDAgJiYgdGhpcy5kZWxlZ2F0ZVRoaXMgIT0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHVzZURlbGVnYXRlKSB7Ci0JCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZTsKLQkJfQotCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KLQkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCi0JCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIGZpZWxkIGFjY2Vzcy4JCi0JCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbGFzdFJlY2VpdmVyVHlwZQotCQkJCSYmICFsYXN0UmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKLQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKLQkJCQkmJiBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKSA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gY3VycmVudFNjb3BlLmNvbXBpbGVyT3B0aW9ucygpOwotCQkJaWYgKChvcHRpb25zLnRhcmdldEpESyA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8yCi0JCQkJCSYmIChvcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80IHx8IChpbmRleCA8IDAgPyBmaWVsZEJpbmRpbmcgIT0gYmluZGluZyA6IGluZGV4ID4gMCkgfHwgdGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAxIHx8ICFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkKLQkJCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfSmF2YUxhbmdPYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcwotCQkJCXx8ICEodXNlRGVsZWdhdGUKLQkJCQkJCT8gbmV3IENvZGVTbmlwcGV0U2NvcGUoY3VycmVudFNjb3BlKS5jYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUpCi0JCQkJCQk6IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSkgewotCQotCQkJICAgIGlmIChpbmRleCA8IDApIHsgLy8gd3JpdGUtYWNjZXNzPwotCQkJCQlpZiAoZmllbGRCaW5kaW5nID09IHRoaXMuYmluZGluZyl7Ci0JCQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKGZpZWxkQmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpbGFzdFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPT0gdGhpcy5vdGhlckJpbmRpbmdzKXsKLQkJCQkJCQlpbnQgbCA9IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm90aGVyQmluZGluZ3MsIDAsIHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2xdLCAwLCBsKTsKLQkJCQkJCX0KLQkJCQkJCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGgtMV0gPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoZmllbGRCaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZylsYXN0UmVjZWl2ZXJUeXBlLmVyYXN1cmUoKSk7Ci0JCQkJCX0KLQkJCSAgICB9IGlmIChpbmRleCA9PSAwKXsKLQkJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKWxhc3RSZWNlaXZlclR5cGUuZXJhc3VyZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSB0aGlzLm90aGVyQmluZGluZ3MpewotCQkJCQkJaW50IGwgPSB0aGlzLm90aGVyQmluZGluZ3MubGVuZ3RoOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm90aGVyQmluZGluZ3MsIDAsIHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2xdLCAwLCBsKTsKLQkJCQkJfQotCQkJCQl0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2luZGV4LTFdID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKGZpZWxkQmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpbGFzdFJlY2VpdmVyVHlwZS5lcmFzdXJlKCkpOwotCQkJCX0KLQkJCX0JCQotCQl9Ci0JfQorLyoqCisgKiBpbmRleCBpcyA8MCB0byBkZW5vdGUgd3JpdGUgYWNjZXNzIGVtdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywgaW50IGluZGV4LCBGbG93SW5mbyBmbG93SW5mbykgeworCS8vIGRvIG5vdGhpbmcKK30KKwogLyoqCiAgKiBOb3JtYWwgZmllbGQgYmluZGluZyBkaWQgbm90IHdvcmssIHRyeSB0byBiaW5kIHRvIGEgZmllbGQgb2YgdGhlIGRlbGVnYXRlIHJlY2VpdmVyLgogICovCiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVwb3J0RXJyb3IoQmxvY2tTY29wZSBzY29wZSkgewotCiAJaWYgKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWUgIT0gbnVsbCkgewogCQl0aGlzLmRlbGVnYXRlVGhpcyA9IHNjb3BlLmdldEZpZWxkKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgREVMRUdBVEVfVEhJUywgdGhpcyk7CiAJCWlmICh0aGlzLmRlbGVnYXRlVGhpcyA9PSBudWxsKXsgIC8vIGlmIG5vdCBmb3VuZCB0aGVuIGludGVybmFsIGVycm9yLCBmaWVsZCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kCiAJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOwogCQl9CisJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZTsKIAl9IGVsc2UgewogCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOwogCX0KQEAgLTU3NCw5ICs1NTgsOSBAQAogCQkJaWYgKCgoUHJvYmxlbUZpZWxkQmluZGluZykgZmllbGRCaW5kaW5nKS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKSB7CiAJCQkJLy8gbWFuYWdlIHRoZSBhY2Nlc3MgdG8gYSBwcml2YXRlIGZpZWxkIG9mIHRoZSBlbmNsb3NpbmcgdHlwZQogCQkJCUNvZGVTbmlwcGV0U2NvcGUgbG9jYWxTY29wZSA9IG5ldyBDb2RlU25pcHBldFNjb3BlKHNjb3BlKTsKLQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW5zWzBdLCB0aGlzKTsKKwkJCQl0aGlzLmJpbmRpbmcgPSBsb2NhbFNjb3BlLmdldEZpZWxkRm9yQ29kZVNuaXBwZXQodGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbnNbMF0sIHRoaXMpOwogCQkJCWlmICh0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CQkJCQkJCisJCQkJCXJldHVybiBjaGVja0ZpZWxkQWNjZXNzKHNjb3BlKTsKIAkJCQl9IGVsc2UgewogCQkJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOwogCQkJCX0KQEAgLTU4NCwzNyArNTY4LDI3IEBACiAJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKIAkJCX0KIAkJfQotCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gZmllbGRCaW5kaW5nOworCQl0aGlzLmJpbmRpbmcgPSBmaWVsZEJpbmRpbmc7CiAJCXJldHVybiBjaGVja0ZpZWxkQWNjZXNzKHNjb3BlKTsKIAl9CiAKIAlUeXBlQmluZGluZyByZXN1bHQ7Ci0JaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcKLQkJJiYgKChQcm9ibGVtRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpIHsKLQkJcmVzdWx0ID0gcmVzb2x2ZVR5cGVWaXNpYmlsaXR5KHNjb3BlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJaWYgKHRoaXMuYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcgJiYgKChQcm9ibGVtRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpIHsKKwkJLy8gZmllbGQgYW5kL29yIGxvY2FsIGFyZSBkb25lIGJlZm9yZSB0eXBlIGxvb2t1cHMKKwkJLy8gdGhlIG9ubHkgYXZhaWxhYmxlIHZhbHVlIGZvciB0aGUgcmVzdHJpY3RpdmVGbGFnIEJFRk9SRQorCQkvLyB0aGUgVEMgaXMgRmxhZ19UeXBlIEZsYWdfTG9jYWxGaWVsZCBhbmQgRmxhZ19UeXBlTG9jYWxGaWVsZAorCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CisJCWlmICgodGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRCaW5kaW5nKHRoaXMudG9rZW5zLCB0aGlzLmJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLLCB0aGlzLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSkpLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCXRoaXMuYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cworCQkJdGhpcy5iaXRzIHw9IEJpbmRpbmcuRklFTEQ7CisJCQlyZXN1bHQgPSBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOworCQl9IGVsc2UgewogCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKIAkJfQotCQlpZiAocmVzdWx0LmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJfQotCi0JcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKLX0KLXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZVZpc2liaWxpdHkoQmxvY2tTY29wZSBzY29wZSkgewotCS8vIGZpZWxkIGFuZC9vciBsb2NhbCBhcmUgZG9uZSBiZWZvcmUgdHlwZSBsb29rdXBzCi0KLQkvLyB0aGUgb25seSBhdmFpbGFibGUgdmFsdWUgZm9yIHRoZSByZXN0cmljdGl2ZUZsYWcgQkVGT1JFCi0JLy8gdGhlIFRDIGlzIEZsYWdfVHlwZSBGbGFnX0xvY2FsRmllbGQgYW5kIEZsYWdfVHlwZUxvY2FsRmllbGQgCi0KLQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7Ci0JaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRCaW5kaW5nKHRoaXMudG9rZW5zLCB0aGlzLmJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLLCB0aGlzLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSkpLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJdGhpcy5iaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCi0JCXRoaXMuYml0cyB8PSBCaW5kaW5nLkZJRUxEOwotCQlyZXR1cm4gZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKHNjb3BlKTsKLQl9Ci0JLy89PT09PT09PWVycm9yIGNhc2VzPT09PT09PT09PT09PT09CiAJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YQppbmRleCA1NTEzMGI2Li42ZGFmMDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFJldHVyblN0YXRlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJldHVyblN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRyeVN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLk9wY29kZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CkBAIC00Nyw3ICs0OCw3IEBACiAgKgogICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJldHVybkJ5dGVjb2RlKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQorCiAJLy8gb3V0cHV0IHRoZSByZXR1cm4gYnl0ZWNvZGUKIAljb2RlU3RyZWFtLnJldHVybl8oKTsKIH0KQEAgLTc0LDcgKzc1LDcgQEAKIAkJfQogCiAJCS8vIGdlbmVyYXRlIHdyYXBwZXIgaWYgbmVlZGVkCi0JCWlmICh0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSAmJiB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwpIHsgCisJCWlmICh0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlLmlzQmFzZVR5cGUoKSAmJiB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlICE9IFR5cGVCaW5kaW5nLk5VTEwpIHsKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVCb3hpbmdDb252ZXJzaW9uKHRoaXMuZXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUuaWQpOwogCQl9CiAKQEAgLTgzLDcgKzg0LDcgQEAKIAl9CiAKIAkvLyBnZW5lcmF0ZSB0aGUgaW52b2tlIHZpcnR1YWwgdG8gInNldFJlc3VsdChPYmplY3QsQ2xhc3MpIgotCWNvZGVTdHJlYW0uaW52b2tldmlydHVhbCh0aGlzLnNldFJlc3VsdE1ldGhvZCk7CisJY29kZVN0cmVhbS5pbnZva2UoT3Bjb2Rlcy5PUENfaW52b2tldmlydHVhbCwgdGhpcy5zZXRSZXN1bHRNZXRob2QsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7CiB9CiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCkBAIC0xMDEsNyArMTAyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIHB1YmxpYyB2b2lkIHByZXBhcmVTYXZlVmFsdWVMb2NhdGlvbihUcnlTdGF0ZW1lbnQgdGFyZ2V0VHJ5U3RhdGVtZW50KXsKLQkJCisKIAkvLyBkbyBub3RoaW5nOiBubyBzdG9yYWdlIGlzIG5lY2Vzc2FyeSBmb3Igc25pcHBldHMKIH0KIHB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewpAQCAtMTQwLDUgKzE0MSw0IEBACiBwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBkZXB0aCkgewogCS8vIGlnbm9yZWQKIH0KLQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQppbmRleCBjYmYzNGRiLi40ZWM4ZTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMjMsOCArMTIzLDEzIEBACiAJCXJldHVybiBmYWxzZTsKIAlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOwogCVBhY2thZ2VCaW5kaW5nIGRlY2xhcmluZ1BhY2thZ2UgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJVHlwZUJpbmRpbmcgb3JpZ2luYWxEZWNsYXJpbmdDbGFzcyA9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAub3JpZ2luYWwoKTsKIAlkbyB7Ci0JCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gdHlwZSkgcmV0dXJuIHRydWU7CisJCWlmICh0eXBlLmlzQ2FwdHVyZSgpKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODUwMDIKKwkJCWlmIChvcmlnaW5hbERlY2xhcmluZ0NsYXNzID09IHR5cGUuZXJhc3VyZSgpLm9yaWdpbmFsKCkpIHJldHVybiB0cnVlOwkKKwkJfSBlbHNlIHsKKwkJCWlmIChvcmlnaW5hbERlY2xhcmluZ0NsYXNzID09IHR5cGUub3JpZ2luYWwoKSkgcmV0dXJuIHRydWU7CisJCX0KIAkJaWYgKGRlY2xhcmluZ1BhY2thZ2UgIT0gdHlwZS5mUGFja2FnZSkgcmV0dXJuIGZhbHNlOwogCX0gd2hpbGUgKCh0eXBlID0gdHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBmYWxzZTsKQEAgLTEzOSw3ICsxNDQsNyBAQAogCWlmIChtZXRob2RCaW5kaW5nLmlzUHVibGljKCkpIHJldHVybiB0cnVlOwogCiAJUmVmZXJlbmNlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7Ci0JaWYgKGludm9jYXRpb25UeXBlID09IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgJiYgaW52b2NhdGlvblR5cGUgPT0gcmVjZWl2ZXJUeXBlKSByZXR1cm4gdHJ1ZTsKKwlpZiAoaW52b2NhdGlvblR5cGUgPT0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7CiAKIAlpZiAobWV0aG9kQmluZGluZy5pc1Byb3RlY3RlZCgpKSB7CiAJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQpAQCAtMTkzLDggKzE5OCwxMyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKIAlQYWNrYWdlQmluZGluZyBkZWNsYXJpbmdQYWNrYWdlID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZTsKKwlUeXBlQmluZGluZyBvcmlnaW5hbERlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyAub3JpZ2luYWwoKTsKIAlkbyB7Ci0JCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IHR5cGUpIHJldHVybiB0cnVlOworCQlpZiAodHlwZS5pc0NhcHR1cmUoKSkgeyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1MDAyCisJCQlpZiAob3JpZ2luYWxEZWNsYXJpbmdDbGFzcyA9PSB0eXBlLmVyYXN1cmUoKS5vcmlnaW5hbCgpKSByZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcmlnaW5hbERlY2xhcmluZ0NsYXNzID09IHR5cGUub3JpZ2luYWwoKSkgcmV0dXJuIHRydWU7CisJCX0KIAkJaWYgKGRlY2xhcmluZ1BhY2thZ2UgIT0gdHlwZS5mUGFja2FnZSkgcmV0dXJuIGZhbHNlOwogCX0gd2hpbGUgKCh0eXBlID0gdHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBmYWxzZTsKQEAgLTIxMiw5ICsyMjIsOSBAQAogCWlmIChyZWNlaXZlclR5cGUgPT0gcmVmZXJlbmNlQmluZGluZykgcmV0dXJuIHRydWU7CiAKIAlpZiAocmVmZXJlbmNlQmluZGluZy5pc1Byb3RlY3RlZCgpKSB7Ci0JCS8vIGFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciAob3IgaXRzIGVuY2xvc2luZyB0eXBlKSBpcyB0aGUgc3VwZXJjbGFzcyAKKwkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIChvciBpdHMgZW5jbG9zaW5nIHR5cGUpIGlzIHRoZSBzdXBlcmNsYXNzCiAJCS8vCW9mIHRoZSByZWNlaXZlclR5cGUgb3IgaW4gdGhlIHNhbWUgcGFja2FnZQotCQlyZXR1cm4gcmVjZWl2ZXJUeXBlLmZQYWNrYWdlID09IHJlZmVyZW5jZUJpbmRpbmcuZlBhY2thZ2UgCisJCXJldHVybiByZWNlaXZlclR5cGUuZlBhY2thZ2UgPT0gcmVmZXJlbmNlQmluZGluZy5mUGFja2FnZQogCQkJCXx8IHJlZmVyZW5jZUJpbmRpbmcuaXNTdXBlcmNsYXNzT2YocmVjZWl2ZXJUeXBlKQogCQkJCXx8IHJlZmVyZW5jZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpLmlzU3VwZXJjbGFzc09mKHJlY2VpdmVyVHlwZSk7IC8vIHByb3RlY3RlZCB0eXBlcyBhbHdheXMgaGF2ZSBhbiBlbmNsb3Npbmcgb25lCiAJfQpAQCAtMjcxLDcgKzI4MSw3IEBACiAJCWlmICghKChSZWZlcmVuY2VCaW5kaW5nKWxlYWZUeXBlKS5jYW5CZVNlZW5CeSh0aGlzKSkgewogCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKWxlYWZUeXBlLCBmaWVsZE5hbWUsIFByb2JsZW1SZWFzb25zLlJlY2VpdmVyVHlwZU5vdFZpc2libGUpOwogCQl9Ci0JCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZE5hbWUsIExFTkdUSCkpCisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZE5hbWUsIFR5cGVDb25zdGFudHMuTEVOR1RIKSkKIAkJCXJldHVybiBBcnJheUJpbmRpbmcuQXJyYXlMZW5ndGg7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTM3MSw4ICszODEsOCBAQAogCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG9iamVjdC5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgbnVsbCk7CiAJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgewogCQkvLyBoYW5kbGUgdGhlIG1ldGhvZCBjbG9uZSgpIHNwZWNpYWxseS4uLiBjYW5ub3QgYmUgcHJvdGVjdGVkIG9yIHRocm93IGV4Y2VwdGlvbnMKLQkJaWYgKGFyZ3VtZW50VHlwZXMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBDTE9ORSkpCi0JCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmcoKG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQpIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYywgQ0xPTkUsIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwgYXJndW1lbnRUeXBlcywgbnVsbCwgb2JqZWN0KTsKKwkJaWYgKGFyZ3VtZW50VHlwZXMgPT0gQmluZGluZy5OT19QQVJBTUVURVJTICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLkNMT05FKSkKKwkJCXJldHVybiBuZXcgTWV0aG9kQmluZGluZygobWV0aG9kQmluZGluZy5tb2RpZmllcnMgJiB+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY1Byb3RlY3RlZCkgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljLCBUeXBlQ29uc3RhbnRzLkNMT05FLCBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUsIGFyZ3VtZW50VHlwZXMsIG51bGwsIG9iamVjdCk7CiAJCWlmIChjYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KG1ldGhvZEJpbmRpbmcsIHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQogCQkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CiAJfQpAQCAtNDA1LDcgKzQxNSw3IEBACiAJCU9ubHkgaWYgYWxsIG9mIHRoZSBpbnB1dCBpcyBjb25zdW1lZCBpcyB0aGUgdHlwZSBhbnN3ZXJlZAogCiAJQWxsIG90aGVyIGNvbmRpdGlvbnMgYXJlIGVycm9ycywgYW5kIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLgotCQorCiAJTk9URTogSWYgYSBwcm9ibGVtIGJpbmRpbmcgaXMgcmV0dXJuZWQsIHNlbmRlcnMgc2hvdWxkIGV4dHJhY3QgdGhlIGNvbXBvdW5kIG5hbWUKIAlmcm9tIHRoZSBiaW5kaW5nICYgbm90IGFzc3VtZSB0aGUgcHJvYmxlbSBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY29tcG91bmROYW1lLgogCkBAIC00NDYsOCArNDU2LDggQEAKICAJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKIAkgCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCiAJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCi0JCQkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgCi0JCQkJCQkJCQkoKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoKCksCisJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKIAkJCQkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwogCSAJCQlpZiAoIXRoaXMuY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldCgoUmVmZXJlbmNlQmluZGluZykgYmluZGluZywgcmVjZWl2ZXJUeXBlKSkKIAkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcsIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpOwpAQCAtNDY4LDggKzQ3OCw4IEBACiAJCWlmICgoYmluZGluZyA9IGZpbmRGaWVsZEZvckNvZGVTbmlwcGV0KHR5cGVCaW5kaW5nLCBuZXh0TmFtZSwgaW52b2NhdGlvblNpdGUpKSAhPSBudWxsKSB7CiAJCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKLQkJCQkJCShGaWVsZEJpbmRpbmcpYmluZGluZywgCi0JCQkJCQkoKEZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywgCisJCQkJCQkoRmllbGRCaW5kaW5nKWJpbmRpbmcsCisJCQkJCQkoKEZpZWxkQmluZGluZyliaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKIAkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgJy4nKSwKIAkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOwogCQkJfQpAQCAtNDc5LDggKzQ4OSw4IEBACiAJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCB0eXBlQmluZGluZywgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpOwogCQkgaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAotCQkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgCi0JCQkJCQkJCSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKKwkJCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSgoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKS5jbG9zZXN0TWF0Y2goKSwKIAkJCQkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CiAJfQogCkBAIC00ODgsNyArNDk4LDcgQEAKIAkJRmllbGRCaW5kaW5nIGZpZWxkID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKIAkJaWYgKCFmaWVsZC5pc1N0YXRpYygpKSB7CiAJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCi0JCQkJCWZpZWxkLCAKKwkJCQkJZmllbGQsCiAJCQkJCWZpZWxkLmRlY2xhcmluZ0NsYXNzLAogCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksICcuJyksCiAJCQkJCVByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCk7CkBAIC01MDYsNyArNTE2LDcgQEAKIAogCUFuc3dlciB0aGUgY29uc3RydWN0b3IgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcy4KIAotCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMgCisJSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cwogCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgY29uc3RydWN0b3IgaXMgdmlzaWJsZS4KIAogCUlmIG5vIHZpc2libGUgY29uc3RydWN0b3IgaXMgZGlzY292ZXJlZCwgYW4gZXJyb3IgYmluZGluZyBpcyBhbnN3ZXJlZC4KQEAgLTU3Miw3ICs1ODIsNyBAQAogCiAJQW5zd2VyIHRoZSBtZXRob2QgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLgogCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlci4KLQlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIAorCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMKIAkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIG1ldGhvZCBpcyB2aXNpYmxlLgogCQlzZXREZXB0aChpbnQpOyB0aGlzIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBkZXB0aCBvZiB0aGUgZGlzY292ZXJlZCBtZXRob2QKIAkJCXJlbGF0aXZlIHRvIHRoZSBlbmNsb3NpbmcgdHlwZSBvZiB0aGUgcmVjZWl2ZXIuIChJZiB0aGUgbWV0aG9kIGlzIGRlZmluZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDc3MWRhNjIuLmVhMjg3N2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxODU2ODIgLSBJbmNyZW1lbnQvZGVjcmVtZW50IG9wZXJhdG9ycyBtYXJrIGxvY2FsIHZhcmlhYmxlcyBhcyByZWFkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKQEAgLTE2LDM1ICsxNywzOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkludExpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PcGNvZGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlRhZ0JpdHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRNZXRob2Q7CiAKIC8qKgogICogQSBzaW5nbGUgbmFtZSByZWZlcmVuY2UgaW5zaWRlIGEgY29kZSBzbmlwcGV0IGNhbiBkZW5vdGUgYSBmaWVsZCBvZiBhIHJlbW90ZQogICogcmVjZWl2ZXIgb2JqZWN0ICh0aGF0IGlzLCB0aGUgcmVjZWl2ZXIgb2YgdGhlIGNvbnRleHQgaW4gdGhlIHN0YWNrIGZyYW1lKS4KICAqLwotcHVibGljIGNsYXNzIENvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZSBleHRlbmRzIFNpbmdsZU5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBJbnZvY2F0aW9uU2l0ZSwgUHJvYmxlbVJlYXNvbnMgeworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZSBleHRlbmRzIFNpbmdsZU5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBQcm9ibGVtUmVhc29ucyB7CiAKIAlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKIAlGaWVsZEJpbmRpbmcgZGVsZWdhdGVUaGlzOwotCQorCiBwdWJsaWMgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgewogCXN1cGVyKHNvdXJjZSwgcG9zKTsKIAl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7CkBAIC01NSw5ICs1OSwxMCBAQAogCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKIAkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAogCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKLQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5pc0JsYW5rRmluYWwoKSAKKwkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5pc0JsYW5rRmluYWwoKQogCQkJCQkmJiBjdXJyZW50U2NvcGUubmVlZEJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uQ2hlY2soZmllbGRCaW5kaW5nKSkgewotCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgeworCQkJCUZsb3dJbmZvIGZpZWxkSW5pdHMgPSBmbG93Q29udGV4dC5nZXRJbml0c0ZvckZpbmFsQmxhbmtJbml0aWFsaXphdGlvbkNoZWNrKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5vcmlnaW5hbCgpLCBmbG93SW5mbyk7CisJCQkJaWYgKCFmaWVsZEluaXRzLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKIAkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKIAkJCQl9CiAJCQl9CkBAIC05OCwxNCArMTAzLDEzIEBACiAJfQogCXRoaXMuY29uc3RhbnQgPSBmaWVsZEJpbmRpbmcuY29uc3RhbnQoKTsKIAotCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZEJpbmRpbmcsIHNjb3BlLCAodGhpcy5iaXRzICYgSXNTdHJpY3RseUFzc2lnbmVkKSAhPTApKSB7CisJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUsIHRoaXMuYml0cykpIHsKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CiAJfQogCXJldHVybiBmaWVsZEJpbmRpbmcudHlwZTsKIAogfQogcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0KIAkvLyBvcHRpbWl6aW5nIGFzc2lnbm1lbnQgbGlrZTogaSA9IGkgKyAxIG9yIGkgPSAxICsgaQogCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24uaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpKSB7CiAJCUJpbmFyeUV4cHJlc3Npb24gb3BlcmF0aW9uID0gKEJpbmFyeUV4cHJlc3Npb24pIGFzc2lnbm1lbnQuZXhwcmVzc2lvbjsKQEAgLTEyMCwxMSArMTI0LDExIEBACiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKChvcGVyYXRpb24ucmlnaHQgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKQotCQkJJiYgKChvcGVyYXRvciA9PSBQTFVTKSB8fCAob3BlcmF0b3IgPT0gTVVMVElQTFkpKSAvLyBvbmx5IGNvbW11dGF0aXZlIG9wZXJhdGlvbnMKLQkJCSYmICgodmFyaWFibGVSZWZlcmVuY2UgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgb3BlcmF0aW9uLnJpZ2h0KS5iaW5kaW5nID09IHRoaXMuYmluZGluZykKLQkJCSYmIChvcGVyYXRpb24ubGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIC8vIGV4Y2x1ZGUgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zLCBzaW5jZSBjb3VsZCBoYXZlIHNpZGUtZWZmZWN0Ci0JCQkmJiAoKChvcGVyYXRpb24ubGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpICE9IFRfSmF2YUxhbmdTdHJpbmcpIC8vIGV4Y2x1ZGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gd2hpY2ggd291bGQgb2NjdXIgYmFja3dhcmRzCi0JCQkmJiAoKChvcGVyYXRpb24ucmlnaHQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUX0phdmFMYW5nU3RyaW5nKSkgeyAvLyBleGNsdWRlIHN0cmluZyBjb25jYXRlbmF0aW9uIHdoaWNoIHdvdWxkIG9jY3VyIGJhY2t3YXJkcworCQkJCSYmICgob3BlcmF0b3IgPT0gUExVUykgfHwgKG9wZXJhdG9yID09IE1VTFRJUExZKSkgLy8gb25seSBjb21tdXRhdGl2ZSBvcGVyYXRpb25zCisJCQkJJiYgKCh2YXJpYWJsZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBvcGVyYXRpb24ucmlnaHQpLmJpbmRpbmcgPT0gdGhpcy5iaW5kaW5nKQorCQkJCSYmIChvcGVyYXRpb24ubGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIC8vIGV4Y2x1ZGUgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zLCBzaW5jZSBjb3VsZCBoYXZlIHNpZGUtZWZmZWN0CisJCQkJJiYgKCgob3BlcmF0aW9uLmxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgSU1QTElDSVRfQ09OVkVSU0lPTl9NQVNLKSA+PiA0KSAhPSBUX0phdmFMYW5nU3RyaW5nKSAvLyBleGNsdWRlIHN0cmluZyBjb25jYXRlbmF0aW9uIHdoaWNoIHdvdWxkIG9jY3VyIGJhY2t3YXJkcworCQkJCSYmICgoKG9wZXJhdGlvbi5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gJiBJTVBMSUNJVF9DT05WRVJTSU9OX01BU0spID4+IDQpICE9IFRfSmF2YUxhbmdTdHJpbmcpKSB7IC8vIGV4Y2x1ZGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gd2hpY2ggd291bGQgb2NjdXIgYmFja3dhcmRzCiAJCQkvLyBpID0gdmFsdWUgKyBpLCB0aGVuIHVzZSB0aGUgdmFyaWFibGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgc2luY2UgaXQgaGFzIHRoZSBjb3JyZWN0IGltcGxpY2l0IGNvbnZlcnNpb24KIAkJCXZhcmlhYmxlUmVmZXJlbmNlLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdGhpcy5zeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sIG9wZXJhdGlvbi5sZWZ0LCBvcGVyYXRvciwgb3BlcmF0aW9uLmltcGxpY2l0Q29udmVyc2lvbiwgdmFsdWVSZXF1aXJlZCk7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewpAQCAtMTM1LDUxICsxMzksNTEgQEAKIAl9CiAJc3dpdGNoICh0aGlzLmJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CiAJCWNhc2UgQmluZGluZy5GSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCi0JCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKLQkJCWlmIChmaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKLQkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJCUZpZWxkQmluZGluZyBjb2RlZ2VuRmllbGQgPSAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpOworCQkJaWYgKGNvZGVnZW5GaWVsZC5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCWlmICghY29kZWdlbkZpZWxkLmlzU3RhdGljKCkpIHsgLy8gbmVlZCBhIHJlY2VpdmVyPwogCQkJCQlpZiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CiAJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7CiAJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQkJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgZmllbGRCaW5kaW5nLCBudWxsLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQlmaWVsZFN0b3JlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgY29kZWdlbkZpZWxkLCBudWxsLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgdGhpcy5kZWxlZ2F0ZVRoaXMgPT0gbnVsbCAvKmltcGxpY2l0IHRoaXMqLywgdmFsdWVSZXF1aXJlZCk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKLQkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoY29kZWdlbkZpZWxkKTsKKwkJCQlpZiAoIWNvZGVnZW5GaWVsZC5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KIAkJCQkJaWYgKCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKIAkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CiAJCQkJCQkvLyBub3QgeWV0IHN1cHBvcnRlZAotCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbih0aGlzKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQkJfQogCQkJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7CisJCQkJCWlmICgoY29kZWdlbkZpZWxkLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGNvZGVnZW5GaWVsZC50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKIAkJCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKIAkJCQkJfQogCQkJCX0KLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChjb2RlZ2VuRmllbGQpOwogCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0KIAkJCX0KIAkJCXJldHVybjsKIAkJY2FzZSBCaW5kaW5nLkxPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKLQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJaWYgKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uICE9IC0xKSB7CiAJCQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQkJfSBlbHNlIHsKQEAgLTIyNCwxNSArMjI4LDE3IEBACiAJfSBlbHNlIHsKIAkJc3dpdGNoICh0aGlzLmJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CiAJCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKLQkJCQlpZiAoIXZhbHVlUmVxdWlyZWQpIAorCQkJCWlmICghdmFsdWVSZXF1aXJlZCkKIAkJCQkJYnJlYWs7Ci0JCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQkJQ29uc3RhbnQgZmllbGRDb25zdGFudCA9IGZpZWxkQmluZGluZy5jb25zdGFudCgpOworCQkJCUZpZWxkQmluZGluZyBjb2RlZ2VuRmllbGQgPSAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpOworCQkJCUNvbnN0YW50IGZpZWxkQ29uc3RhbnQgPSBjb2RlZ2VuRmllbGQuY29uc3RhbnQoKTsKIAkJCQlpZiAoZmllbGRDb25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsgLy8gZGlyZWN0bHkgdXNlIGlubGluZWQgdmFsdWUgZm9yIGNvbnN0YW50IGZpZWxkcwotCQkJCQlpZiAoZmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7Ci0JCQkJCQkgLy8gZGlyZWN0bHkgdXNlIGlubGluZWQgdmFsdWUgZm9yIGNvbnN0YW50IGZpZWxkcwotCQkJCQkJYm9vbGVhbiBpc1N0YXRpYzsKLQkJCQkJCWlmICghKGlzU3RhdGljID0gZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpKSB7CisJCQkJCWlmIChjb2RlZ2VuRmllbGQuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJCVR5cGVCaW5kaW5nIHNvbWVSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsID8gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSA6IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQkJVHlwZUJpbmRpbmcgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MgPSBDb2RlU3RyZWFtLmdldENvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKGN1cnJlbnRTY29wZSwgY29kZWdlbkZpZWxkLCBzb21lUmVjZWl2ZXJUeXBlLCB0cnVlIC8qIGltcGxpY2l0IHRoaXMgKi8pOworCQkJCQkJaWYgKGNvZGVnZW5GaWVsZC5pc1N0YXRpYygpKSB7CisJCQkJCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRzdGF0aWMsIGNvZGVnZW5GaWVsZCwgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOworCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgodGhpcy5iaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKIAkJCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwpAQCAtMjQwLDM2ICsyNDYsNDAgQEAKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIG1hbmFnaW5nIHByaXZhdGUgYWNjZXNzCQkJCQkJCQotCQkJCQkJaWYgKGlzU3RhdGljKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMoZmllbGRCaW5kaW5nKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGNvZGVnZW5GaWVsZCwgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewogCQkJCQkJLy8gbWFuYWdpbmcgcHJpdmF0ZSBhY2Nlc3MKLQkJCQkJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCWlmICghY29kZWdlbkZpZWxkLmlzU3RhdGljKCkpIHsKIAkJCQkJCQlpZiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAogCQkJCQkJCQkvLyBub3QgeWV0IHN1cHBvcnRlZAotCQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24odGhpcyk7CiAJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKIAkJCQkJCX0KLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQkJCX0KLQkJCQkJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7CQkKKwkJCQkJaWYgKHRoaXMuZ2VuZXJpY0Nhc3QgIT0gbnVsbCkgY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5nZW5lcmljQ2FzdCk7CiAJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0gZWxzZSB7IC8vIGRpcmVjdGx5IHVzZSB0aGUgaW5saW5lZCB2YWx1ZQogCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRDb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbAotCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCQlpZiAobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gPT0gLTEpIHsKKwkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCS8vIHJlc3RhcnQgY29kZSBnZW4KKwkJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChDb2RlU3RyZWFtLlJFU1RBUlRfQ09ERV9HRU5fRk9SX1VOVVNFRF9MT0NBTFNfTU9ERSwgbnVsbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KIAkJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCiAJCQkJCWJyZWFrOwogCQkJCS8vIG91dGVyIGxvY2FsPwpAQCAtMjk0LDIxICszMDQsMjMgQEAKIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIE1ldGhvZEJpbmRpbmcgd3JpdGVBY2Nlc3NvciwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAlzd2l0Y2ggKHRoaXMuYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKLQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOworCQkJRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9ICgoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLm9yaWdpbmFsKCk7CisJCQlpZiAoY29kZWdlbkZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQlpZiAoY29kZWdlbkZpZWxkLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJCVR5cGVCaW5kaW5nIHNvbWVSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsID8gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSA6IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuRmllbGQsIHNvbWVSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0c3RhdGljLCBjb2RlZ2VuRmllbGQsIGNvbnN0YW50UG9vbERlY2xhcmluZ0NsYXNzKTsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZQotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKIAogCQkJCQkvLyB1c2VkIHRvIHJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUKIAkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOwotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJaWYgKGNvZGVnZW5GaWVsZC5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkJCQlpZiAoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKHRoaXMuYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CiAJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7CkBAIC0zMTcsMjggKzMyOSwyOSBAQAogCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKIAkJCQkJfQogCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJCVR5cGVCaW5kaW5nIHNvbWVSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsID8gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSA6IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQlUeXBlQmluZGluZyBjb25zdGFudFBvb2xEZWNsYXJpbmdDbGFzcyA9IENvZGVTdHJlYW0uZ2V0Q29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MoY3VycmVudFNjb3BlLCBjb2RlZ2VuRmllbGQsIHNvbWVSZWNlaXZlclR5cGUsIHRydWUgLyogaW1wbGljaXQgdGhpcyAqLyk7CisJCQkJCWNvZGVTdHJlYW0uZmllbGRBY2Nlc3MoT3Bjb2Rlcy5PUENfZ2V0ZmllbGQsIGNvZGVnZW5GaWVsZCwgY29uc3RhbnRQb29sRGVjbGFyaW5nQ2xhc3MpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmICgodGhpcy5iaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CiAJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAogCQkJCQkJLy8gbm90IHlldCBzdXBwb3J0ZWQKLQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24odGhpcyk7CiAJCQkJCX0KIAkJCQkJLy8gdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChjb2RlZ2VuRmllbGQpOwogCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCiAJCQkJCS8vIHVzZWQgdG8gcmV0cmlldmUgdGhlIGFjdHVhbCB2YWx1ZQogCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlIChjYW5ub3QgYXNzaWduIHRvIG91dGVyIGxvY2FsKQotCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJQ29uc3RhbnQgYXNzaWduQ29uc3RhbnQ7Ci0JCQlpbnQgaW5jcmVtZW50OworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CiAJCQkvLyB1c2luZyBpbmNyIGJ5dGVjb2RlIGlmIHBvc3NpYmxlCisJCQlDb25zdGFudCBhc3NpZ25Db25zdGFudDsKIAkJCXN3aXRjaCAobG9jYWxCaW5kaW5nLnR5cGUuaWQpIHsKIAkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgogCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQ29uY2F0ZW5hdGlvbkFwcGVuZChjdXJyZW50U2NvcGUsIHRoaXMsIGV4cHJlc3Npb24pOwpAQCAtMzQ4LDI2ICszNjEsNjIgQEAKIAkJCQkJY29kZVN0cmVhbS5zdG9yZShsb2NhbEJpbmRpbmcsIGZhbHNlKTsKIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgVF9pbnQgOgotCQkJCQlpZiAoKChhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQpICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgCi0JCQkJCQkmJiAoYXNzaWduQ29uc3RhbnQudHlwZUlEKCkgIT0gVF9mbG9hdCkgLy8gb25seSBmb3IgaW50ZWdyYWwgdHlwZXMKLQkJCQkJCSYmIChhc3NpZ25Db25zdGFudC50eXBlSUQoKSAhPSBUX2RvdWJsZSkJCQotCQkJCQkJJiYgKChpbmNyZW1lbnQgPSBhc3NpZ25Db25zdGFudC5pbnRWYWx1ZSgpKSA9PSAoc2hvcnQpIGluY3JlbWVudCkpIHsgLy8gMTYgYml0cyB2YWx1ZQorCQkJCQlhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQ7CisJCQkJCWlmIChsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiA9PSAtMSkgeworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIHJlc3RhcnQgY29kZSBnZW4gYmVjYXVzZSB3ZSBlaXRoZXI6CisJCQkJCQkJICogLSBuZWVkIHRoZSB2YWx1ZQorCQkJCQkJCSAqIC0gdGhlIGNvbnN0YW50IGNhbiBoYXZlIHBvdGVudGlhbCBzaWRlLWVmZmVjdAorCQkJCQkJCSAqLworCQkJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQkJCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QoQ29kZVN0cmVhbS5SRVNUQVJUX0NPREVfR0VOX0ZPUl9VTlVTRURfTE9DQUxTX01PREUsIG51bGwpOworCQkJCQkJfSBlbHNlIGlmIChhc3NpZ25Db25zdGFudCA9PSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCQkJCQkvLyB3ZSBvbmx5IG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uJ3MgY29uc3RhbnQgaWYgaXQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorCQkJCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWlmICgoYXNzaWduQ29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCSYmIChhc3NpZ25Db25zdGFudC50eXBlSUQoKSAhPSBUeXBlSWRzLlRfZmxvYXQpIC8vIG9ubHkgZm9yIGludGVncmFsIHR5cGVzCisJCQkJCQkJJiYgKGFzc2lnbkNvbnN0YW50LnR5cGVJRCgpICE9IFR5cGVJZHMuVF9kb3VibGUpKSB7IC8vIFRPRE8gKHBoaWxpcHBlKSBpcyB0aGlzIHRlc3QgbmVlZGVkID8KIAkJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKIAkJCQkJCQljYXNlIFBMVVMgOgorCQkJCQkJCQlpbnQgaW5jcmVtZW50ICA9IGFzc2lnbkNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCQkJCWlmIChpbmNyZW1lbnQgIT0gKHNob3J0KSBpbmNyZW1lbnQpIGJyZWFrOyAvLyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIDE2LWJpdHMgdmFsdWUKIAkJCQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCBpbmNyZW1lbnQpOwogCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCWNhc2UgTUlOVVMgOgotCQkJCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIC1pbmNyZW1lbnQpOworCQkJCQkJCQlpbmNyZW1lbnQgID0gLWFzc2lnbkNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCQkJCWlmIChpbmNyZW1lbnQgIT0gKHNob3J0KSBpbmNyZW1lbnQpIGJyZWFrOyAvLyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIDE2LWJpdHMgdmFsdWUKKwkJCQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCBpbmNyZW1lbnQpOwogCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJcmV0dXJuOwogCQkJCQkJfQogCQkJCQl9CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uID09IC0xKSB7CisJCQkJCQlhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQ7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJCS8qCisJCQkJCQkJICogcmVzdGFydCBjb2RlIGdlbiBiZWNhdXNlIHdlIGVpdGhlcjoKKwkJCQkJCQkgKiAtIG5lZWQgdGhlIHZhbHVlCisJCQkJCQkJICogLSB0aGUgY29uc3RhbnQgY2FuIGhhdmUgcG90ZW50aWFsIHNpZGUtZWZmZWN0CisJCQkJCQkJICovCisJCQkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOworCQkJCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChDb2RlU3RyZWFtLlJFU1RBUlRfQ09ERV9HRU5fRk9SX1VOVVNFRF9MT0NBTFNfTU9ERSwgbnVsbCk7CisJCQkJCQl9IGVsc2UgaWYgKGFzc2lnbkNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24ncyBjb25zdGFudCBpZiBpdCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uCisJCQkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm47CisJCQkJCX0KIAkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CiAJCQl9CiAJfQpAQCAtMzg0LDEwICs0MzMsMTAgQEAKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCiAJCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSl7IC8vIHByZWZpeCBvcGVyYXRpb24KLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwkJCQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCB0aGlzLmltcGxpY2l0Q29udmVyc2lvbik7CiAJCQl9IGVsc2UgewogCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCQl9CQkKKwkJCX0KIAkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgogCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7CiAJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQpAQCAtMzk2LDMyICs0NDUsNDAgQEAKIAkvLyBzdG9yZSB0aGUgcmVzdWx0IGJhY2sgaW50byB0aGUgdmFyaWFibGUKIAlzd2l0Y2ggKHRoaXMuYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKIAkJY2FzZSBCaW5kaW5nLkZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKLQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQkJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgZmllbGRCaW5kaW5nLCB3cml0ZUFjY2Vzc29yLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCUZpZWxkQmluZGluZyBjb2RlZ2VuRmllbGQgPSAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5vcmlnaW5hbCgpOworCQkJaWYgKGNvZGVnZW5GaWVsZC5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCWZpZWxkU3RvcmUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBjb2RlZ2VuRmllbGQsIHdyaXRlQWNjZXNzb3IsIHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLCB0aGlzLmRlbGVnYXRlVGhpcyA9PSBudWxsIC8qIGltcGxpY2l0IHRoaXMgKi8sIHZhbHVlUmVxdWlyZWQpOwogCQkJfSBlbHNlIHsKIAkJCQkvLyBjdXJyZW50IHN0YWNrIGlzOgogCQkJCS8vIGZpZWxkIHJlY2VpdmVyIHZhbHVlCiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmR1cF94MigpOwotCQkJCQl9CisJCQkJCXN3aXRjaCAoY29kZWdlbkZpZWxkLnR5cGUuaWQpIHsKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQkJCQkJCiAJCQkJfQogCQkJCS8vIGN1cnJlbnQgc3RhY2sgaXM6Ci0JCQkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUJCQkJCi0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCS8vIHZhbHVlIGZpZWxkIHJlY2VpdmVyIHZhbHVlCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChjb2RlZ2VuRmllbGQpOwogCQkJfQogCQkJcmV0dXJuOwogCQljYXNlIEJpbmRpbmcuTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZQotCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCWlmICgobG9jYWxCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuTE9ORykgfHwgKGxvY2FsQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkRPVUJMRSkpIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKLQkJCQl9CisJCQkJc3dpdGNoIChsb2NhbEJpbmRpbmcudHlwZS5pZCkgeworCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJY2FzZSBUeXBlSWRzLlRfZG91YmxlIDoKKwkJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQkJYnJlYWs7CisJCQkJfQkJCQkKIAkJCX0KIAkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7CiAJfQpAQCAtNDI5LDEyMSArNDg2LDczIEBACiBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCXN3aXRjaCAodGhpcy5iaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewogCQljYXNlIEJpbmRpbmcuRklFTEQgOiAvLyBhc3NpZ25pbmcgdG8gYSBmaWVsZAotCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQlpZiAoZmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7Ci0JCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOwotCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwotCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKLQkJCQl9Ci0JCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQkJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7IC8vIFN0YWNrOiAgW293bmVyXVtvbGQgZmllbGQgdmFsdWVdICAtLS0+IFtvbGQgZmllbGQgdmFsdWVdW293bmVyXVtvbGQgZmllbGQgdmFsdWVdCi0JCQkJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IFR5cGVCaW5kaW5nLkxPTkcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5ET1VCTEUpKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGZpZWxkQmluZGluZy50eXBlLmlkKTsKLQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQucHJlQXNzaWduSW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGZpZWxkQmluZGluZywgbnVsbCwgZmFsc2UpOworCQkJRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9ICgoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmcpLm9yaWdpbmFsKCk7CisJCQlpZiAoY29kZWdlbkZpZWxkLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJc3VwZXIuZ2VuZXJhdGVQb3N0SW5jcmVtZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgcG9zdEluY3JlbWVudCwgdmFsdWVSZXF1aXJlZCk7CiAJCQl9IGVsc2UgewotCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWlmIChjb2RlZ2VuRmllbGQuaXNTdGF0aWMoKSkgewogCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKCh0aGlzLmJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKIAkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CiAJCQkJCQkvLyBub3QgeWV0IHN1cHBvcnRlZAotCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbih0aGlzKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQlzd2l0Y2ggKGNvZGVnZW5GaWVsZC50eXBlLmlkKSB7CisJCQkJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKGZpZWxkQmluZGluZyk7Ci0JCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChjb2RlZ2VuRmllbGQpOworCQkJCXN3aXRjaCAoY29kZWdlbkZpZWxkLnR5cGUuaWQpIHsKKwkJCQkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJCWlmIChjb2RlZ2VuRmllbGQuaXNTdGF0aWMoKSkgeworCQkJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCX0KKwkJCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOwogCQkJCQljb2RlU3RyZWFtLnBvcCgpOwotCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKLQkJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKLQkJCQkJY29kZVN0cmVhbS5wb3AoKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7Ci0JCQkJCWNvZGVTdHJlYW0ucG9wKCk7Ci0JCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQlpZiAoY29kZWdlbkZpZWxkLmlzU3RhdGljKCkpIHsKIAkJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KIAkJCQkJY29kZVN0cmVhbS5kdXBfeDEoKTsKLQkJCQkJY29kZVN0cmVhbS5wb3AoKTsJCQkJCQorCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCBmaWVsZEJpbmRpbmcudHlwZS5pZCk7CisJCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgY29kZWdlbkZpZWxkLnR5cGUuaWQpOwogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5wcmVBc3NpZ25JbXBsaWNpdENvbnZlcnNpb24pOwotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGNvZGVnZW5GaWVsZCk7CiAJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgQmluZGluZy5MT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlCi0JCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7Ci0JCQkvLyB1c2luZyBpbmNyIGJ5dGVjb2RlIGlmIHBvc3NpYmxlCi0JCQlpZiAobG9jYWxCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuSU5UKSB7Ci0JCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7Ci0JCQkJfQotCQkJCWlmIChwb3N0SW5jcmVtZW50Lm9wZXJhdG9yID09IFBMVVMpIHsKLQkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIC0xKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwotCQkJCWlmICh2YWx1ZVJlcXVpcmVkKXsKLQkJCQkJaWYgKChsb2NhbEJpbmRpbmcudHlwZSA9PSBUeXBlQmluZGluZy5MT05HKSB8fCAobG9jYWxCaW5kaW5nLnR5cGUgPT0gVHlwZUJpbmRpbmcuRE9VQkxFKSkgewotCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmR1cCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIHRoaXMuaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCBsb2NhbEJpbmRpbmcudHlwZS5pZCk7Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LnByZUFzc2lnbkltcGxpY2l0Q29udmVyc2lvbik7Ci0KLQkJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOwotCQkJfQorCQkJc3VwZXIuZ2VuZXJhdGVQb3N0SW5jcmVtZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgcG9zdEluY3JlbWVudCwgdmFsdWVSZXF1aXJlZCk7CiAJfQogfQogcHVibGljIHZvaWQgZ2VuZXJhdGVSZWNlaXZlcihDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKIAljb2RlU3RyZWFtLmFsb2FkXzAoKTsKIAlpZiAodGhpcy5kZWxlZ2F0ZVRoaXMgIT0gbnVsbCkgewotCQljb2RlU3RyZWFtLmdldGZpZWxkKHRoaXMuZGVsZWdhdGVUaGlzKTsgLy8gZGVsZWdhdGVkIGZpZWxkIGFjY2VzcworCQljb2RlU3RyZWFtLmZpZWxkQWNjZXNzKE9wY29kZXMuT1BDX2dldGZpZWxkLCB0aGlzLmRlbGVnYXRlVGhpcywgbnVsbCAvKiBkZWZhdWx0IGRlY2xhcmluZ0NsYXNzICovKTsgLy8gZGVsZWdhdGUgZmllbGQgYWNjZXNzCiAJfQogfQogLyoqCkBAIC01NjcsNDIgKzU3NiwxOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKChmbG93SW5mby50YWdCaXRzICYgRmxvd0luZm8uVU5SRUFDSEFCTEUpICE9IDApIHJldHVybjsKKwlpZiAoKGZsb3dJbmZvLnRhZ0JpdHMgJiBGbG93SW5mby5VTlJFQUNIQUJMRV9PUl9ERUFEKSAhPSAwKSByZXR1cm47CiAJLy9JZiBpbmxpbmFibGUgZmllbGQsIGZvcmdldCB0aGUgYWNjZXNzIGVtdWxhdGlvbiwgdGhlIGNvZGUgZ2VuIHdpbGwgZGlyZWN0bHkgdGFyZ2V0IGl0CiAJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQotCQlyZXR1cm47CQorCQlyZXR1cm47CiAJLy8gaWYgZmllbGQgZnJvbSBwYXJhbWV0ZXJpemVkIHR5cGUgZ290IGZvdW5kLCB1c2UgdGhlIG9yaWdpbmFsIGZpZWxkIGF0IGNvZGVnZW4gdGltZQogCWlmICh0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkRmllbGRCaW5kaW5nKSB7CiAJICAgIFBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcgcGFyYW1ldGVyaXplZEZpZWxkID0gKFBhcmFtZXRlcml6ZWRGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQkgICAgdGhpcy5jb2RlZ2VuQmluZGluZyA9IHBhcmFtZXRlcml6ZWRGaWVsZC5vcmlnaW5hbEZpZWxkOwotCSAgICBGaWVsZEJpbmRpbmcgZmllbGRDb2RlZ2VuQmluZGluZyA9IChGaWVsZEJpbmRpbmcpdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkgICAgRmllbGRCaW5kaW5nIGNvZGVnZW5GaWVsZCA9IHBhcmFtZXRlcml6ZWRGaWVsZC5vcmlnaW5hbEZpZWxkOwogCSAgICAvLyBleHRyYSBjYXN0IG5lZWRlZCBpZiBmaWVsZCB0eXBlIHdhcyB0eXBlIHZhcmlhYmxlCi0JICAgIGlmICgoZmllbGRDb2RlZ2VuQmluZGluZy50eXBlLnRhZ0JpdHMgJiBUYWdCaXRzLkhhc1R5cGVWYXJpYWJsZSkgIT0gMCkgewotCSAgICAgICAgdGhpcy5nZW5lcmljQ2FzdCA9IGZpZWxkQ29kZWdlbkJpbmRpbmcudHlwZS5nZW5lcmljQ2FzdChjdXJyZW50U2NvcGUuYm94aW5nKHBhcmFtZXRlcml6ZWRGaWVsZC50eXBlKSk7IC8vIHJ1bnRpbWVUeXBlIGNvdWxkIGJlIGJhc2UgdHlwZSBpbiBib3hpbmcgY2FzZQotCSAgICB9CQkgICAgCi0JfQkJCi0JaWYgKCh0aGlzLmJpdHMgJiBCaW5kaW5nLkZJRUxEKSAhPSAwKSB7Ci0JCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmJpbmRpbmc7Ci0JCQotCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KLQkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCi0JCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIGZpZWxkIGFjY2Vzcy4JCi0JCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZQotCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsIC8vIGFycmF5Lmxlbmd0aAotCQkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCgpID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewotCQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBjdXJyZW50U2NvcGUuY29tcGlsZXJPcHRpb25zKCk7Ci0JCQlpZiAoKG9wdGlvbnMudGFyZ2V0SkRLID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzIKLQkJCQkJJiYgKG9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQgfHwgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKQotCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9KYXZhTGFuZ09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzCi0JCQkJfHwgIWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSB7Ci0JCi0JCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IAotCQkJCSAgICBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoCi0JCQkJCSAgICAgICAoRmllbGRCaW5kaW5nKXRoaXMuY29kZWdlbkJpbmRpbmcsIAotCQkJCQkgICAgICAgIChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuZGVsZWdhdGVUaGlzLnR5cGUuZXJhc3VyZSgpKTsKLQkJCX0KLQkJfQkJCQkKKwkgICAgaWYgKChjb2RlZ2VuRmllbGQudHlwZS50YWdCaXRzICYgVGFnQml0cy5IYXNUeXBlVmFyaWFibGUpICE9IDApIHsKKwkgICAgICAgIHRoaXMuZ2VuZXJpY0Nhc3QgPSBjb2RlZ2VuRmllbGQudHlwZS5nZW5lcmljQ2FzdChjdXJyZW50U2NvcGUuYm94aW5nKHBhcmFtZXRlcml6ZWRGaWVsZC50eXBlKSk7IC8vIHJ1bnRpbWVUeXBlIGNvdWxkIGJlIGJhc2UgdHlwZSBpbiBib3hpbmcgY2FzZQorCSAgICB9CiAJfQogfQogLyoqCkBAIC02MTUsOCArNjAwLDkgQEAKIAkJaWYgKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWUgIT0gbnVsbCkgewogCQkJdGhpcy5kZWxlZ2F0ZVRoaXMgPSBzY29wZS5nZXRGaWVsZChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIERFTEVHQVRFX1RISVMsIHRoaXMpOwogCQkJaWYgKHRoaXMuZGVsZWdhdGVUaGlzICE9IG51bGwpeyAgLy8gaWYgbm90IGZvdW5kIHRoZW4gaW50ZXJuYWwgZXJyb3IsIGZpZWxkIHNob3VsZCBoYXZlIGJlZW4gZm91bmQKKwkJCQl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMuZGVsZWdhdGVUaGlzLnR5cGU7CiAJCQkJLy8gd2lsbCBub3Qgc3VwcG9ydCBpbm5lcmNsYXNzIGVtdWxhdGlvbiBpbnNpZGUgZGVsZWdhdGUKLQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbiwgdGhpcyk7CisJCQkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbiwgdGhpcyk7CiAJCQkJaWYgKCF0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOwogCQkJCX0KQEAgLTYyOCwxOSArNjE0LDIwIEBACiAJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lICE9IG51bGwpIHsKIAkJCXRoaXMuZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKIAkJCWlmICh0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsKXsgIC8vIGlmIG5vdCBmb3VuZCB0aGVuIGludGVybmFsIGVycm9yLCBmaWVsZCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kCisJCQkJdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcy50eXBlOwogCQkJCS8vIHdpbGwgbm90IHN1cHBvcnQgaW5uZXJjbGFzcyBlbXVsYXRpb24gaW5zaWRlIGRlbGVnYXRlCiAJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHNjb3BlLmdldEZpZWxkKHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOwogCQkJCWlmICghZmllbGRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCQkJaWYgKCgoUHJvYmxlbUZpZWxkQmluZGluZykgZmllbGRCaW5kaW5nKS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKSB7CiAJCQkJCQkvLyBtYW5hZ2UgdGhlIGFjY2VzcyB0byBhIHByaXZhdGUgZmllbGQgb2YgdGhlIGVuY2xvc2luZyB0eXBlCiAJCQkJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7Ci0JCQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOwotCQkJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOwkJCQkJCQorCQkJCQkJdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KHRoaXMuZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOworCQkJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKIAkJCQkJfQogCQkJCX0KLQkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gZmllbGRCaW5kaW5nOworCQkJCXRoaXMuYmluZGluZyA9IGZpZWxkQmluZGluZzsKIAkJCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTa2VsZXRvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEKaW5kZXggMTQ4MmIyMi4uZTg5NDc1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsNiArMjgsNTYgQEAKICAqIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvIHdpdGhvdXQgaGF2aW5nIHRvIGNhdGNoIHRob3NlLgogICovCiBwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRTa2VsZXRvbiBpbXBsZW1lbnRzIElCaW5hcnlUeXBlLCBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmFyeU1ldGhvZFNrZWxldG9uIGltcGxlbWVudHMgSUJpbmFyeU1ldGhvZCB7CisJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVOYW1lczsKKwkJY2hhcltdIG1ldGhvZERlc2NyaXB0b3I7CisJCWNoYXJbXSBzZWxlY3RvcjsKKwkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yOworCisJCXB1YmxpYyBCaW5hcnlNZXRob2RTa2VsZXRvbihjaGFyW10gc2VsZWN0b3IsIGNoYXJbXSBtZXRob2REZXNjcmlwdG9yLCBjaGFyW11bXSBleGNlcHRpb25UeXBlTmFtZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJdGhpcy5tZXRob2REZXNjcmlwdG9yID0gbWV0aG9kRGVzY3JpcHRvcjsKKwkJCXRoaXMuZXhjZXB0aW9uVHlwZU5hbWVzID0gZXhjZXB0aW9uVHlwZU5hbWVzOworCQkJdGhpcy5pc0NvbnN0cnVjdG9yID0gaXNDb25zdHJ1Y3RvcjsKKwkJfQorCQlwdWJsaWMgSUJpbmFyeUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXB1YmxpYyBjaGFyW11bXSBnZXRBcmd1bWVudE5hbWVzKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlwdWJsaWMgY2hhcltdW10gZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCkgeworCQkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uVHlwZU5hbWVzOworCQl9CisJCXB1YmxpYyBjaGFyW10gZ2V0R2VuZXJpY1NpZ25hdHVyZSgpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXB1YmxpYyBjaGFyW10gZ2V0TWV0aG9kRGVzY3JpcHRvcigpIHsKKwkJCXJldHVybiB0aGlzLm1ldGhvZERlc2NyaXB0b3I7CisJCX0KKwkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCQlyZXR1cm4gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1B1YmxpYzsKKwkJfQorCQlwdWJsaWMgSUJpbmFyeUFubm90YXRpb25bXSBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXB1YmxpYyBjaGFyW10gZ2V0U2VsZWN0b3IoKSB7CisJCQlyZXR1cm4gdGhpcy5zZWxlY3RvcjsKKwkJfQorCQlwdWJsaWMgbG9uZyBnZXRUYWdCaXRzKCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNDbGluaXQoKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKwkJCXJldHVybiB0aGlzLmlzQ29uc3RydWN0b3I7CisJCX0KK30KKwogCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gbmV3IElCaW5hcnlNZXRob2RbXSB7CiAJCW5ldyBCaW5hcnlNZXRob2RTa2VsZXRvbigKIAkJCSI8aW5pdD4iLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKQEAgLTQ5LDYyICs5OSwxOCBAQAogCQkpCiAJfTsKIAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmluYXJ5TWV0aG9kU2tlbGV0b24gaW1wbGVtZW50cyBJQmluYXJ5TWV0aG9kIHsKLQkJY2hhcltdW10gZXhjZXB0aW9uVHlwZU5hbWVzOwotCQljaGFyW10gbWV0aG9kRGVzY3JpcHRvcjsKLQkJY2hhcltdIHNlbGVjdG9yOwotCQlib29sZWFuIGlzQ29uc3RydWN0b3I7Ci0JCQotCQlwdWJsaWMgQmluYXJ5TWV0aG9kU2tlbGV0b24oY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gbWV0aG9kRGVzY3JpcHRvciwgY2hhcltdW10gZXhjZXB0aW9uVHlwZU5hbWVzLCBib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKLQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKLQkJCXRoaXMubWV0aG9kRGVzY3JpcHRvciA9IG1ldGhvZERlc2NyaXB0b3I7Ci0JCQl0aGlzLmV4Y2VwdGlvblR5cGVOYW1lcyA9IGV4Y2VwdGlvblR5cGVOYW1lczsKLQkJCXRoaXMuaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3I7Ci0JCX0KLQkJcHVibGljIGNoYXJbXVtdIGdldEV4Y2VwdGlvblR5cGVOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmV4Y2VwdGlvblR5cGVOYW1lczsKLQkJfQotCQlwdWJsaWMgY2hhcltdIGdldE1ldGhvZERlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2REZXNjcmlwdG9yOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQdWJsaWM7Ci0JCX0KLQkJcHVibGljIGNoYXJbXSBnZXRTZWxlY3RvcigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdG9yOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pc0NvbnN0cnVjdG9yOwotCQl9Ci0JCXB1YmxpYyBjaGFyW11bXSBnZXRBcmd1bWVudE5hbWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGNoYXJbXSBnZXRHZW5lcmljU2lnbmF0dXJlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBJQmluYXJ5QW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci19Ci0JCiAvKioKICAqIENvZGVTbmlwcGV0U2tlbGV0b24gY29uc3RydWN0b3IgY29tbWVudC4KICAqLwogcHVibGljIENvZGVTbmlwcGV0U2tlbGV0b24oKSB7CiAJc3VwZXIoKTsKIH0KK3B1YmxpYyBJQmluYXJ5QW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgeworCXJldHVybiBudWxsOworfQorcHVibGljIGNoYXJbXSBnZXRFbmNsb3NpbmdNZXRob2QoKSB7CisJcmV0dXJuIG51bGw7Cit9CiBwdWJsaWMgY2hhcltdIGdldEVuY2xvc2luZ1R5cGVOYW1lKCkgewogCXJldHVybiBudWxsOwogfQpAQCAtMTIzLDYgKzEyOSwxMiBAQAogcHVibGljIGNoYXJbXVtdIGdldEludGVyZmFjZU5hbWVzKCkgewogCXJldHVybiBudWxsOwogfQorcHVibGljIFN0cmluZyBnZXRKYXZhZG9jQ29udGVudHMoKSB7CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgU3RyaW5nIGdldEphdmFkb2NDb250ZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBudWxsOworfQogcHVibGljIElCaW5hcnlOZXN0ZWRUeXBlW10gZ2V0TWVtYmVyVHlwZXMoKSB7CiAJcmV0dXJuIG51bGw7CiB9CkBAIC0xMzIsNiArMTQ0LDkgQEAKIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogCXJldHVybiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljOwogfQorcHVibGljIGNoYXJbXVtdW10gZ2V0TWlzc2luZ1R5cGVOYW1lcygpIHsKKwlyZXR1cm4gbnVsbDsKK30KIHB1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKIAlyZXR1cm4gQ09ERV9TTklQUEVUX05BTUU7CiB9CkBAIC0xNDEsNiArMTU2LDEyIEBACiBwdWJsaWMgY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCkgewogCXJldHVybiBudWxsOwogfQorcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKKwlyZXR1cm4gMDsKK30KK3B1YmxpYyBTdHJpbmcgZ2V0VVJMQ29udGVudHMoU3RyaW5nIGRvY1VybFZhbHVlLCBTdHJpbmcgZGVmYXVsdEVuY29kaW5nKSB7CisJcmV0dXJuIG51bGw7Cit9CiBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0xNTYsMTkgKzE3Nyw0IEBACiBwdWJsaWMgY2hhcltdIHNvdXJjZUZpbGVOYW1lKCkgewogCXJldHVybiBudWxsOwogfQotcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgbG9uZyBnZXRUYWdCaXRzKCkgewotCXJldHVybiAwOwotfQotcHVibGljIFN0cmluZyBnZXRKYXZhZG9jQ29udGVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgZGVmYXVsdEVuY29kaW5nKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0SmF2YWRvY0NvbnRlbnRzKCkgewotCXJldHVybiBudWxsOwotfQotcHVibGljIFN0cmluZyBnZXRVUkxDb250ZW50cyhTdHJpbmcgZG9jVXJsVmFsdWUsIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcpIHsKLQlyZXR1cm4gbnVsbDsKLX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFN1cGVyUmVmZXJlbmNlLmphdmEKaW5kZXggODU2YTEyZS4uY2MzYTc3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFN1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFN1cGVyUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTMgKzE3LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIAogLyoqCi0gKiBBIHN1cGVyIHJlZmVyZW5jZSBpbnNpZGUgYSBjb2RlIHNuaXBwZXQgZGVub3RlcyBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgdHlwZSBvZiAKLSAqIHRoZSByZW1vdGUgcmVjZWl2ZXIgb2JqZWN0ICh0aGF0IGlzLCB0aGUgcmVjZWl2ZXIgb2YgdGhlIGNvbnRleHQgaW4gdGhlIHN0YWNrIGZyYW1lKS4gVGhpcyBpcyAKKyAqIEEgc3VwZXIgcmVmZXJlbmNlIGluc2lkZSBhIGNvZGUgc25pcHBldCBkZW5vdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciB0eXBlIG9mCisgKiB0aGUgcmVtb3RlIHJlY2VpdmVyIG9iamVjdCAodGhhdCBpcywgdGhlIHJlY2VpdmVyIG9mIHRoZSBjb250ZXh0IGluIHRoZSBzdGFjayBmcmFtZSkuIFRoaXMgaXMKICAqIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yIHRocm91Z2ggSmF2YU1vZGVsRXhjZXB0aW9uIGFjY29yZGluZyB0byB0aGUgZmFjdCB0aGF0IHN1cGVyCiAgKiByZWZlcmVuY2UgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gY29kZSBzbmlwcGV0LgogICovCiBwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZSBleHRlbmRzIFN1cGVyUmVmZXJlbmNlIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cywgSW52b2NhdGlvblNpdGUgewotCQorCiBwdWJsaWMgQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZShpbnQgcG9zLCBpbnQgc291cmNlRW5kKSB7CiAJc3VwZXIocG9zLCBzb3VyY2VFbmQpOwogfQpAQCAtNTQsNiArNTQsNSBAQAogcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgaW5kZXgpewogCS8vIGlnbm9yZWQKIH0KLQogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YQppbmRleCA0MjE4ZmI0Li5iZjA0ZTRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uT3Bjb2RlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CkBAIC0yNSwxMSArMjYsMTEgQEAKICAqIHJlY2VpdmVyIG9iamVjdCAodGhhdCBpcywgdGhlIHJlY2VpdmVyIG9mIHRoZSBjb250ZXh0IGluIHRoZSBzdGFjayBmcmFtZSkKICAqLwogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZSBleHRlbmRzIFRoaXNSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBJbnZvY2F0aW9uU2l0ZSB7Ci0JCisKIAlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKIAlGaWVsZEJpbmRpbmcgZGVsZWdhdGVUaGlzOwogCWJvb2xlYW4gaXNJbXBsaWNpdDsKLQkKKwogCS8qKgogCSAqIENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgogCSAqIEBwYXJhbSBzIGludApAQCAtNDAsMTMgKzQxLDE0IEBACiAJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQgPSBldmFsdWF0aW9uQ29udGV4dDsKIAkJdGhpcy5pc0ltcGxpY2l0ID0gaXNJbXBsaWNpdDsKIAl9CisJCiAJcHVibGljIGJvb2xlYW4gY2hlY2tBY2Nlc3MoTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUpIHsKIAkJLy8gdGhpcy9zdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBjb25zdHJ1Y3RvciBjYWxsCiAJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmlzQ29uc3RydWN0b3JDYWxsKSB7CiAJCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5maWVsZHNPclRoaXNCZWZvcmVDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkKKwogCQkvLyBzdGF0aWMgbWF5IG5vdCByZWZlciB0byB0aGlzL3N1cGVyCiAJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lID09IG51bGwgfHwgdGhpcy5ldmFsdWF0aW9uQ29udGV4dC5pc1N0YXRpYykgewogCQkJbWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZXJyb3JUaGlzU3VwZXJJblN0YXRpYyh0aGlzKTsKQEAgLTU0LDM4ICs1Niw0MyBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KKwkKIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKLQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5kZWxlZ2F0ZVRoaXMpOworCQkJY29kZVN0cmVhbS5maWVsZEFjY2VzcyhPcGNvZGVzLk9QQ19nZXRmaWVsZCwgdGhpcy5kZWxlZ2F0ZVRoaXMsIG51bGwgLyogZGVmYXVsdCBkZWNsYXJpbmdDbGFzcyAqLyk7IC8vIGRlbGVnYXRlIGZpZWxkIGFjY2VzcwogCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQorCQogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZSNnZW5lcmljVHlwZUFyZ3VtZW50cygpCiAJICovCiAJcHVibGljIFR5cGVCaW5kaW5nW10gZ2VuZXJpY1R5cGVBcmd1bWVudHMoKSB7CiAJCXJldHVybiBudWxsOwotCX0JCisJfQorCQogCXB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKXsKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKXsKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwkKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHByaW50RXhwcmVzc2lvbihpbnQgaW5kZW50LCBTdHJpbmdCdWZmZXIgb3V0cHV0KXsKLQkJCisKIAkJY2hhcltdIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lOwogCQlvdXRwdXQuYXBwZW5kKCcoJyk7Ci0JCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIAorCQlpZiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKQogCQkJb3V0cHV0LmFwcGVuZCgiPE5PIERFQ0xBUklORyBUWVBFPiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgCisJCWVsc2UKIAkJCW91dHB1dC5hcHBlbmQoZGVjbGFyaW5nVHlwZSk7CiAJCXJldHVybiBvdXRwdXQuYXBwZW5kKCIpdGhpcyIpOyAvLyROT04tTkxTLTEkCiAJfQotCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCisJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJLy8gaW1wbGljaXQgdGhpcwogCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQlUeXBlQmluZGluZyBzbmlwcGV0VHlwZSA9IG51bGw7CkBAIC05NCw3ICsxMDEsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJc25pcHBldFR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCQorCiAJCXRoaXMuZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc25pcHBldFR5cGUsIERFTEVHQVRFX1RISVMsIHRoaXMpOwogCQlpZiAodGhpcy5kZWxlZ2F0ZVRoaXMgPT0gbnVsbCB8fCAhdGhpcy5kZWxlZ2F0ZVRoaXMuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KQEAgLTEwNCwxMiArMTExLDE1IEBACiAJCX0KIAkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZTsKIAl9CisJCiAJcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CiAJCS8vIGlnbm9yZWQKIAl9CisJCiAJcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKXsKIAkJLy8gaWdub3JlZAogCX0KKwkKIAlwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBpbmRleCl7CiAJCS8vIGlnbm9yZWQKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YQppbmRleCA5N2M4NDdkLi5jODM5MWQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUb0N1TWFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsMTIgKzE2LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlbGVjdGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogCiAvKioKICAqIE1hcHMgYmFjayBhbmQgZm9ydGggYSBjb2RlIHNuaXBwZXQgdG8gYSBjb21waWxhdGlvbiB1bml0LgogICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBhcyBmb2xsb3dzOgorICogPHByZT4KICAqIFtwYWNrYWdlIDxwYWNrYWdlIG5hbWU+O10KICAqIFtpbXBvcnQgPGltcG9ydCBuYW1lPjtdKgogICogcHVibGljIGNsYXNzIDxjb2RlIHNuaXBwZXQgY2xhc3MgbmFtZT4gZXh0ZW5kcyA8Z2xvYmFsIHZhcmlhYmxlIGNsYXNzIG5hbWU+IHsKQEAgLTMwLDEzICszMSwxNCBAQAogICogICAgIDxjb2RlIHNuaXBwZXQ+CiAgKiAgIH0KICAqIH0KKyAqIDwvcHJlPgogICovCiBjbGFzcyBDb2RlU25pcHBldFRvQ3VNYXBwZXIgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKIAkvKioKIAkgKiBUaGUgZ2VuZXJhdGVkIGNvbXBpbGF0aW9uIHVuaXQuCiAJICovCiAJcHVibGljIGNoYXJbXSBjdVNvdXJjZTsKLQkKKwogCS8qKgogCSAqIFdoZXJlIHRoZSBjb2RlIHNuaXBwZXQgc3RhcnRzIGluIHRoZSBnZW5lcmF0ZWQgY29tcGlsYXRpb24gdW5pdC4KIAkgKi8KQEAgLTQ3LDE5ICs0OSwzMSBAQAogCWNoYXJbXSBjb2RlU25pcHBldDsKIAljaGFyW10gc25pcHBldFBhY2thZ2VOYW1lOwogCWNoYXJbXVtdIHNuaXBwZXRJbXBvcnRzOwotCWNoYXJbXSBzbmlwcGV0Q2xhc3NOYW1lOyAKKwljaGFyW10gc25pcHBldENsYXNzTmFtZTsKIAljaGFyW10gc25pcHBldFZhckNsYXNzTmFtZTsKIAljaGFyW10gc25pcHBldERlY2xhcmluZ1R5cGVOYW1lOwogCiAJLy8gTWFwcGluZyBvZiBleHRlcm5hbCBsb2NhbCB2YXJpYWJsZXMKIAljaGFyW11bXSBsb2NhbFZhck5hbWVzOwogCWNoYXJbXVtdIGxvY2FsVmFyVHlwZU5hbWVzOwotCWludFtdIGxvY2FsVmFyTW9kaWZpZXJzOwogCQorCWxvbmcgY29tcGxpYW5jZVZlcnNpb247CisKIC8qKgogICogUmVidWlsZCBzb3VyY2UgaW4gcHJlc2VuY2Ugb2YgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGVzCiAgKi8KLSBwdWJsaWMgQ29kZVNuaXBwZXRUb0N1TWFwcGVyKGNoYXJbXSBjb2RlU25pcHBldCwgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW11bXSBpbXBvcnRzLCBjaGFyW10gY2xhc3NOYW1lLCBjaGFyW10gdmFyQ2xhc3NOYW1lLCBjaGFyW11bXSBsb2NhbFZhck5hbWVzLCBjaGFyW11bXSBsb2NhbFZhclR5cGVOYW1lcywgaW50W10gbG9jYWxWYXJNb2RpZmllcnMsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgU3RyaW5nIGxpbmVTZXBhcmF0b3IpIHsKKyBwdWJsaWMgQ29kZVNuaXBwZXRUb0N1TWFwcGVyKAorCQljaGFyW10gY29kZVNuaXBwZXQsCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJY2hhcltdW10gaW1wb3J0cywKKwkJY2hhcltdIGNsYXNzTmFtZSwKKwkJY2hhcltdIHZhckNsYXNzTmFtZSwKKwkJY2hhcltdW10gbG9jYWxWYXJOYW1lcywKKwkJY2hhcltdW10gbG9jYWxWYXJUeXBlTmFtZXMsCisJCWludFtdIGxvY2FsVmFyTW9kaWZpZXJzLAorCQljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCisJCVN0cmluZyBsaW5lU2VwYXJhdG9yLAorCQlsb25nIGNvbXBsaWFuY2VWZXJzaW9uKSB7CiAJdGhpcy5jb2RlU25pcHBldCA9IGNvZGVTbmlwcGV0OwogCXRoaXMuc25pcHBldFBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CiAJdGhpcy5zbmlwcGV0SW1wb3J0cyA9IGltcG9ydHM7CkBAIC02Nyw5ICs4MSw5IEBACiAJdGhpcy5zbmlwcGV0VmFyQ2xhc3NOYW1lID0gdmFyQ2xhc3NOYW1lOwogCXRoaXMubG9jYWxWYXJOYW1lcyA9IGxvY2FsVmFyTmFtZXM7CiAJdGhpcy5sb2NhbFZhclR5cGVOYW1lcyA9IGxvY2FsVmFyVHlwZU5hbWVzOwotCXRoaXMubG9jYWxWYXJNb2RpZmllcnMgPSBsb2NhbFZhck1vZGlmaWVyczsKIAl0aGlzLnNuaXBwZXREZWNsYXJpbmdUeXBlTmFtZSA9IGRlY2xhcmluZ1R5cGVOYW1lOwotCXRoaXMuYnVpbGRDVVNvdXJjZShsaW5lU2VwYXJhdG9yKTsKKwl0aGlzLmNvbXBsaWFuY2VWZXJzaW9uID0gY29tcGxpYW5jZVZlcnNpb247CisJYnVpbGRDVVNvdXJjZShsaW5lU2VwYXJhdG9yKTsKIH0KIHByaXZhdGUgdm9pZCBidWlsZENVU291cmNlKFN0cmluZyBsaW5lU2VwYXJhdG9yKSB7CiAJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTEyOSw2ICsxNDMsOSBAQAogCQl9CiAJfQogCS8vIHJ1bigpIG1ldGhvZCBkZWNsYXJhdGlvbgorCWlmICh0aGlzLmNvbXBsaWFuY2VWZXJzaW9uID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJYnVmZmVyLmFwcGVuZCgiQE92ZXJyaWRlICIpOyAvLyROT04tTkxTLTEkCisJfQogCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGUgeyIpLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsgLy8kTk9OLU5MUy0xJAogCXRoaXMubGluZU51bWJlck9mZnNldCsrOwogCXRoaXMuc3RhcnRQb3NPZmZzZXQgPSBidWZmZXIubGVuZ3RoKCk7CkBAIC0xNDgsNyArMTY1LDcgQEAKIH0KIC8qKgogICogUmV0dXJucyBhIGNvbXBsZXRpb24gcmVxdWVzdG9yIHRoYXQgd3JhcHMgdGhlIGdpdmVuIHJlcXVlc3RvciBhbmQgc2hpZnQgdGhlIHJlc3VsdHMKLSAqIGFjY29yZGluZyB0byB0aGUgc3RhcnQgb2Zmc2V0IGFuZCBsaW5lIG51bWJlciBvZmZzZXQgb2YgdGhlIGNvZGUgc25pcHBldCBpbiB0aGUgZ2VuZXJhdGVkIGNvbXBpbGF0aW9uIHVuaXQuIAorICogYWNjb3JkaW5nIHRvIHRoZSBzdGFydCBvZmZzZXQgYW5kIGxpbmUgbnVtYmVyIG9mZnNldCBvZiB0aGUgY29kZSBzbmlwcGV0IGluIHRoZSBnZW5lcmF0ZWQgY29tcGlsYXRpb24gdW5pdC4KICAqLwogcHVibGljIENvbXBsZXRpb25SZXF1ZXN0b3IgZ2V0Q29tcGxldGlvblJlcXVlc3RvcihmaW5hbCBDb21wbGV0aW9uUmVxdWVzdG9yIG9yaWdpbmFsUmVxdWVzdG9yKSB7CiAJcmV0dXJuIG5ldyBDb21wbGV0aW9uUmVxdWVzdG9yKCkgewpAQCAtMTYxLDU3ICsxNzgsNTggQEAKIAkJCQkJCS8vIFJlbW92ZSBjb21wbGV0aW9uIG9uIGdlbmVyYXRlZCBjbGFzcyBuYW1lIG9yIGdlbmVyYXRlZCBnbG9iYWwgdmFyaWFibGUgY2xhc3MgbmFtZQogCQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKIAkJCQkJCWNoYXJbXSBjbGFzc05hbWUgPSBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSk7Ci0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnNuaXBwZXRQYWNrYWdlTmFtZSkgCisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnNuaXBwZXRQYWNrYWdlTmFtZSkKIAkJCQkJCQkJJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNsYXNzTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMuc25pcHBldENsYXNzTmFtZSkKIAkJCQkJCQkJCXx8IENoYXJPcGVyYXRpb24uZXF1YWxzKGNsYXNzTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMuc25pcHBldFZhckNsYXNzTmFtZSkpKSByZXR1cm47Ci0JCQkJCQkKLQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwYWNrYWdlTmFtZSwgUEFDS0FHRV9OQU1FKSAKKworCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhY2thZ2VOYW1lLCBQQUNLQUdFX05BTUUpCiAJCQkJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGNsYXNzTmFtZSwgUk9PVF9DTEFTU19OQU1FKSkgcmV0dXJuOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUY6CiAJCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OOgorCQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI6CiAJCQkJCS8vIFJlbW92ZSBjb21wbGV0aW9uIG9uIGdlbmVyYXRlZCBtZXRob2QKIAkJCQkJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVRdWFsaWZpZXIocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7CiAJCQkJCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotCQkJCQkKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMuc25pcHBldFBhY2thZ2VOYW1lKSAKKworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy5zbmlwcGV0UGFja2FnZU5hbWUpCiAJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnNuaXBwZXRDbGFzc05hbWUpKSByZXR1cm47Ci0JCQkJCQotCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBQQUNLQUdFX05BTUUpIAorCisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIFBBQ0tBR0VfTkFNRSkKIAkJCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhkZWNsYXJpbmdUeXBlTmFtZSwgUk9PVF9DTEFTU19OQU1FKSkgcmV0dXJuOwogCQkJCQlicmVhazsKIAkJCX0KIAkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdChwcm9wb3NhbCk7CiAJCX0KLQkJCisKIAkJcHVibGljIHZvaWQgY29tcGxldGlvbkZhaWx1cmUoSVByb2JsZW0gcHJvYmxlbSkgewogCQkJcHJvYmxlbS5zZXRTb3VyY2VTdGFydChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgLSBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy5zdGFydFBvc09mZnNldCk7CiAJCQlwcm9ibGVtLnNldFNvdXJjZUVuZChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIC0gQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMuc3RhcnRQb3NPZmZzZXQpOwogCQkJcHJvYmxlbS5zZXRTb3VyY2VMaW5lTnVtYmVyKHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpIC0gIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLmxpbmVOdW1iZXJPZmZzZXQpOwogCQkJb3JpZ2luYWxSZXF1ZXN0b3IuY29tcGxldGlvbkZhaWx1cmUocHJvYmxlbSk7CiAJCX0KLQkJCisKIAkJcHVibGljIHZvaWQgYWNjZXB0Q29udGV4dChDb21wbGV0aW9uQ29udGV4dCBjb250ZXh0KSB7CiAJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRDb250ZXh0KGNvbnRleHQpOwogCQl9Ci0JCQorCiAJCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewogCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYmVnaW5SZXBvcnRpbmcoKTsKIAkJfQotCQkKKwogCQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7CiAJCQlvcmlnaW5hbFJlcXVlc3Rvci5lbmRSZXBvcnRpbmcoKTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZWQoaW50IGNvbXBsZXRpb25Qcm9wb3NhbEtpbmQpIHsKIAkJCXJldHVybiBvcmlnaW5hbFJlcXVlc3Rvci5pc0lnbm9yZWQoY29tcGxldGlvblByb3Bvc2FsS2luZCk7CiAJCX0KLQkJCisKIAkJcHVibGljIHZvaWQgc2V0SWdub3JlZChpbnQgY29tcGxldGlvblByb3Bvc2FsS2luZCwgYm9vbGVhbiBpZ25vcmUpIHsKIAkJCW9yaWdpbmFsUmVxdWVzdG9yLnNldElnbm9yZWQoY29tcGxldGlvblByb3Bvc2FsS2luZCwgaWdub3JlKTsKIAkJfQotCQkKKwogCQlwdWJsaWMgYm9vbGVhbiBpc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoaW50IG1haW5LaW5kLCBpbnQgcmVxdWlyZWRLaW5kKSB7CiAJCQlyZXR1cm4gb3JpZ2luYWxSZXF1ZXN0b3IuaXNBbGxvd2luZ1JlcXVpcmVkUHJvcG9zYWxzKG1haW5LaW5kLCByZXF1aXJlZEtpbmQpOwogCQl9CkBAIC0yMzMsNyArMjUxLDcgQEAKIHB1YmxpYyBpbnQgZ2V0RXZhbHVhdGlvblR5cGUoaW50IGxpbmVOdW1iZXIpIHsKIAlpbnQgY3VycmVudExpbmUgPSAxOwogCi0JLy8gY2hlY2sgcGFja2FnZSBkZWNsYXJhdGlvbgkKKwkvLyBjaGVjayBwYWNrYWdlIGRlY2xhcmF0aW9uCiAJaWYgKHRoaXMuc25pcHBldFBhY2thZ2VOYW1lICE9IG51bGwgJiYgdGhpcy5zbmlwcGV0UGFja2FnZU5hbWUubGVuZ3RoICE9IDApIHsKIAkJaWYgKGxpbmVOdW1iZXIgPT0gMSkgewogCQkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVF9QQUNLQUdFOwpAQCAtMjUwLDcgKzI2OCw3IEBACiAKIAkvLyBjaGVjayBnZW5lcmF0ZWQgZmllbGRzCiAJY3VycmVudExpbmUgKz0KLQkJKHRoaXMuc25pcHBldERlY2xhcmluZ1R5cGVOYW1lID09IG51bGwgPyAwIDogMSkgCisJCSh0aGlzLnNuaXBwZXREZWNsYXJpbmdUeXBlTmFtZSA9PSBudWxsID8gMCA6IDEpCiAJCSsgKHRoaXMubG9jYWxWYXJOYW1lcyA9PSBudWxsID8gMCA6IHRoaXMubG9jYWxWYXJOYW1lcy5sZW5ndGgpOwogCWlmIChjdXJyZW50TGluZSA+IGxpbmVOdW1iZXIpIHsKIAkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVF9JTlRFUk5BTDsKQEAgLTI2Niw3ICsyODQsNyBAQAogCXJldHVybiBFdmFsdWF0aW9uUmVzdWx0LlRfSU5URVJOQUw7CiB9CiAvKioKLSAqIFJldHVybnMgdGhlIGltcG9ydCBkZWZpbmVkIGF0IHRoZSBnaXZlbiBsaW5lIG51bWJlci4gCisgKiBSZXR1cm5zIHRoZSBpbXBvcnQgZGVmaW5lZCBhdCB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0SW1wb3J0KGludCBsaW5lTnVtYmVyKSB7CiAJaW50IGltcG9ydFN0YXJ0TGluZSA9IHRoaXMubGluZU51bWJlck9mZnNldCAtIDEgLSB0aGlzLnNuaXBwZXRJbXBvcnRzLmxlbmd0aDsKQEAgLTI3NCw3ICsyOTIsNyBAQAogfQogLyoqCiAgKiBSZXR1cm5zIGEgc2VsZWN0aW9uIHJlcXVlc3RvciB0aGF0IHdyYXBzIHRoZSBnaXZlbiByZXF1ZXN0b3IgYW5kIHNoaWZ0IHRoZSBwcm9ibGVtcwotICogYWNjb3JkaW5nIHRvIHRoZSBzdGFydCBvZmZzZXQgYW5kIGxpbmUgbnVtYmVyIG9mZnNldCBvZiB0aGUgY29kZSBzbmlwcGV0IGluIHRoZSBnZW5lcmF0ZWQgY29tcGlsYXRpb24gdW5pdC4gCisgKiBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0IG9mZnNldCBhbmQgbGluZSBudW1iZXIgb2Zmc2V0IG9mIHRoZSBjb2RlIHNuaXBwZXQgaW4gdGhlIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0LgogICovCiBwdWJsaWMgSVNlbGVjdGlvblJlcXVlc3RvciBnZXRTZWxlY3Rpb25SZXF1ZXN0b3IoZmluYWwgSVNlbGVjdGlvblJlcXVlc3RvciBvcmlnaW5hbFJlcXVlc3RvcikgewogCXJldHVybiBuZXcgSVNlbGVjdGlvblJlcXVlc3RvcigpIHsKQEAgLTI5Niw3ICszMTQsNyBAQAogCQlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSkgewogCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShwYWNrYWdlTmFtZSk7CiAJCX0KLQkJCisKIAkJcHVibGljIHZvaWQgYWNjZXB0VHlwZVBhcmFtZXRlcihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdFR5cGVQYXJhbWV0ZXIoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgdHlwZVBhcmFtZXRlck5hbWUsIGlzRGVjbGFyYXRpb24sIHN0YXJ0LCBlbmQpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEKaW5kZXggYmI1MDYwOC4uYTJjMTIxOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFR5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZVZhcmlhYmxlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIHsKIApAQCAtMjgsNyArMzEsNyBAQAogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzRmlsZSBlbmNsb3NpbmdDbGFzc0ZpbGUpIHsKIAlpZiAoKHRoaXMuYml0cyAmIEFTVE5vZGUuSGFzQmVlbkdlbmVyYXRlZCkgIT0gMCkgcmV0dXJuOwogCXRoaXMuYml0cyB8PSBBU1ROb2RlLkhhc0JlZW5HZW5lcmF0ZWQ7Ci0JCisKIAlpZiAodGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikgewogCQlpZiAodGhpcy5iaW5kaW5nID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC00Niw3ICs0OSwxMyBAQAogCQkJZW5jbG9zaW5nQ2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3Nlcyh0aGlzLmJpbmRpbmcpOwogCQkJY2xhc3NGaWxlLnJlY29yZElubmVyQ2xhc3Nlcyh0aGlzLmJpbmRpbmcpOwogCQl9Ci0KKwkJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZXMgPSB0aGlzLmJpbmRpbmcudHlwZVZhcmlhYmxlcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGVCaW5kaW5nID0gdHlwZVZhcmlhYmxlc1tpXTsKKwkJCWlmICgodHlwZVZhcmlhYmxlQmluZGluZy50YWdCaXRzICYgVGFnQml0cy5Db250YWluc05lc3RlZFR5cGVSZWZlcmVuY2VzKSAhPSAwKSB7CisJCQkJVXRpbC5yZWNvcmROZXN0ZWRUeXBlKGNsYXNzRmlsZSwgdHlwZVZhcmlhYmxlQmluZGluZyk7CisJCQl9CisJCX0KIAkJaWYgKHRoaXMubWVtYmVyVHlwZXMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZSA9IHRoaXMubWVtYmVyVHlwZXNbaV07CkBAIC02MSw3ICs3MCw3IEBACiAJCQkJdGhpcy5tZXRob2RzW2ldLmdlbmVyYXRlQ29kZSh0aGlzLnNjb3BlLCBjbGFzc0ZpbGUpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIGdlbmVyYXRlIGFsbCBtZXRob2RzCiAJCWNsYXNzRmlsZS5hZGRTcGVjaWFsTWV0aG9kcygpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhCmluZGV4IDQ2ZGYyZDAuLjUyNjZjNWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDUgKzI3LDUgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfVFlQRV9GSUVMRCA9ICJyZXN1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIExPQ0FMX1ZBUl9QUkVGSVggPSAidmFsJCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIERFTEVHQVRFX1RISVMgPSAidmFsJHRoaXMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29udGV4dC5qYXZhCmluZGV4IDJiNThiYTcuLmVkNWRjMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsOCArMTMsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuQ29tcGxldGlvbkVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VsZWN0aW9uUmVxdWVzdG9yOwpAQCAtMjYsNiArMjksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlN1ZmZpeENvbnN0YW50czsKQEAgLTM3LDExICs0MSw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBFdmFsdWF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEV2YWx1YXRpb25Db25zdGFudHMsIFN1ZmZpeENvbnN0YW50cyB7CiAJLyoqCi0JICogV2hldGhlciB0aW1pbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIG91dHB1dCB0byB0aGUgc3Rkb3V0Ci0JICovCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gVElNSU5HID0gZmFsc2U7Ci0KLQkvKioKIAkgKiBHbG9iYWwgY291bnRlcnMgc28gdGhhdCBzZXZlcmFsIGV2YWx1YXRpb24gY29udGV4dCBjYW4gZGVwbG95IG9uIHRoZSBzYW1lIHJ1bnRpbWUuCiAJICovCiAJc3RhdGljIGludCBWQVJfQ0xBU1NfQ09VTlRFUiA9IDA7CkBAIC02MSw3ICs2MCw3IEBACiAJaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVyczsKIAljaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzOwogCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lczsKLQkKKwogCS8qIGNhbiAndGhpcycgYmUgdXNlZCBpbiB0aGlzIGNvbnRleHQgKi8KIAlib29sZWFuIGlzU3RhdGljOwogCWJvb2xlYW4gaXNDb25zdHJ1Y3RvckNhbGw7CkBAIC05MCwxOCArODksMzIgQEAKICAqIENvbXB1dGVzIGEgY29tcGxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQuCiAgKiAoTm90ZSB0aGF0IHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0J3MgVk0gZG9lc24ndCBuZWVkIHRvIGJlIHJ1bm5pbmcuKQogICoKLSAqICBAcGFyYW0gZW52aXJvbm1lbnQgCisgKiAgQHBhcmFtIGVudmlyb25tZW50CiAgKiAgICAgIHVzZWQgdG8gcmVzb2x2ZSB0eXBlL3BhY2thZ2UgcmVmZXJlbmNlcyBhbmQgc2VhcmNoIGZvciB0eXBlcy9wYWNrYWdlcwogICogICAgICBiYXNlZCBvbiBwYXJ0aWFsIG5hbWVzLgogICoKLSAqICBAcGFyYW0gcmVxdWVzdG9yIAotICogICAgICBzaW5jZSB0aGUgZW5naW5lIG1pZ2h0IHByb2R1Y2UgYW5zd2VycyBvZiB2YXJpb3VzIGZvcm1zLCB0aGUgZW5naW5lIAorICogIEBwYXJhbSByZXF1ZXN0b3IKKyAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZQogICogICAgICBpcyBhc3NvY2lhdGVkIHdpdGggYSByZXF1ZXN0b3IgYWJsZSB0byBhY2NlcHQgYWxsIHBvc3NpYmxlIGNvbXBsZXRpb25zLgogICoKICAqICBAcGFyYW0gb3B0aW9ucwogICoJCXNldCBvZiBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjb2RlIGFzc2lzdCBlbmdpbmUuCisgKgorICogIEBwYXJhbSBvd25lcgorICogIAl0aGUgb3duZXIgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworICogIAorICogIEBwYXJhbSBtb25pdG9yCisgKiAgCXRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCiAgKi8KLXB1YmxpYyB2b2lkIGNvbXBsZXRlKGNoYXJbXSBjb2RlU25pcHBldCwgaW50IGNvbXBsZXRpb25Qb3NpdGlvbiwgU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIG9wdGlvbnMsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CitwdWJsaWMgdm9pZCBjb21wbGV0ZSgKKwkJY2hhcltdIGNvZGVTbmlwcGV0LAorCQlpbnQgY29tcGxldGlvblBvc2l0aW9uLAorCQlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCisJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlNYXAgb3B0aW9ucywKKwkJZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QsCisJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCXRyeSB7CiAJCUlSZXF1ZXN0b3IgdmFyaWFibGVSZXF1ZXN0b3IgPSBuZXcgSVJlcXVlc3RvcigpIHsKIAkJCXB1YmxpYyBib29sZWFuIGFjY2VwdENsYXNzRmlsZXMoQ2xhc3NGaWxlW10gY2xhc3NGaWxlcywgY2hhcltdIGNvZGVTbmlwcGV0Q2xhc3NOYW1lKSB7CkBAIC0xMTIsMjIgKzEyNSwyNCBAQAogCQkJCS8vIERvIG5vdGhpbmcKIAkJCX0KIAkJfTsKLQkJdGhpcy5ldmFsdWF0ZVZhcmlhYmxlcyhlbnZpcm9ubWVudCwgb3B0aW9ucywgdmFyaWFibGVSZXF1ZXN0b3IsIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpOworCQlldmFsdWF0ZVZhcmlhYmxlcyhlbnZpcm9ubWVudCwgb3B0aW9ucywgdmFyaWFibGVSZXF1ZXN0b3IsIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpOwogCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewogCQkvLyBEbyBub3RoaW5nCiAJfQogCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRDb21wbGV0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgbG9uZyBjb21wbGlhbmNlVmVyc2lvbiA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChvcHRpb25zLmdldChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKSk7CiAJZmluYWwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IG5ldyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoCi0JCWNvZGVTbmlwcGV0LCAKLQkJdGhpcy5wYWNrYWdlTmFtZSwgCi0JCXRoaXMuaW1wb3J0cywgCi0JCWNsYXNzTmFtZSwgCisJCWNvZGVTbmlwcGV0LAorCQl0aGlzLnBhY2thZ2VOYW1lLAorCQl0aGlzLmltcG9ydHMsCisJCWNsYXNzTmFtZSwKIAkJdGhpcy5pbnN0YWxsZWRWYXJzID09IG51bGwgPyBudWxsIDogdGhpcy5pbnN0YWxsZWRWYXJzLmNsYXNzTmFtZSwKLQkJdGhpcy5sb2NhbFZhcmlhYmxlTmFtZXMsIAotCQl0aGlzLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIAotCQl0aGlzLmxvY2FsVmFyaWFibGVNb2RpZmllcnMsIAorCQl0aGlzLmxvY2FsVmFyaWFibGVOYW1lcywKKwkJdGhpcy5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCQl0aGlzLmxvY2FsVmFyaWFibGVNb2RpZmllcnMsCiAJCXRoaXMuZGVjbGFyaW5nVHlwZU5hbWUsCi0JCXRoaXMubGluZVNlcGFyYXRvcgorCQl0aGlzLmxpbmVTZXBhcmF0b3IsCisJCWNvbXBsaWFuY2VWZXJzaW9uCiAJKTsKIAlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsKIAkJcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKQEAgLTE0MywxNiArMTU4LDE2IEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX07Ci0JCi0JQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbWFwcGVyLmdldENvbXBsZXRpb25SZXF1ZXN0b3IocmVxdWVzdG9yKSwgb3B0aW9ucywgcHJvamVjdCk7Ci0JCisKKwlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCBtYXBwZXIuZ2V0Q29tcGxldGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLCBvcHRpb25zLCBwcm9qZWN0LCBvd25lciwgbW9uaXRvcik7CisKIAlpZiAodGhpcy5pbnN0YWxsZWRWYXJzICE9IG51bGwpIHsKLQkJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IHRoaXMuZ2V0Um9vdENvZGVTbmlwcGV0QmluYXJ5KCk7CisJCUlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSBnZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKTsKIAkJaWYgKGJpbmFyeVR5cGUgIT0gbnVsbCkgewogCQkJZW5naW5lLmxvb2t1cEVudmlyb25tZW50LmNhY2hlQmluYXJ5VHlwZShiaW5hcnlUeXBlLCBudWxsIC8qbm8gYWNjZXNzIHJlc3RyaWN0aW9uKi8pOwogCQl9Ci0JCQotCQlDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzID0gaW5zdGFsbGVkVmFycy5jbGFzc0ZpbGVzOworCisJCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSB0aGlzLmluc3RhbGxlZFZhcnMuY2xhc3NGaWxlczsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0ZpbGVzLmxlbmd0aDsgaSsrKSB7CiAJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gY2xhc3NGaWxlc1tpXTsKIAkJCUlCaW5hcnlUeXBlIGJpbmFyeSA9IG51bGw7CkBAIC0xNjQsOCArMTc5LDggQEAKIAkJCWVuZ2luZS5sb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5LCBudWxsIC8qbm8gYWNjZXNzIHJlc3RyaWN0aW9uKi8pOwogCQl9CiAJfQotCQotCWVuZ2luZS5jb21wbGV0ZShzb3VyY2VVbml0LCBtYXBwZXIuc3RhcnRQb3NPZmZzZXQgKyBjb21wbGV0aW9uUG9zaXRpb24sIG1hcHBlci5zdGFydFBvc09mZnNldCk7CisKKwllbmdpbmUuY29tcGxldGUoc291cmNlVW5pdCwgbWFwcGVyLnN0YXJ0UG9zT2Zmc2V0ICsgY29tcGxldGlvblBvc2l0aW9uLCBtYXBwZXIuc3RhcnRQb3NPZmZzZXQsIG51bGwvKmV4dGVuZGVkIGNvbnRleHQgaXNuJ3QgY29tcHV0ZWQqLyk7CiB9CiAvKioKICAqIERlbGV0ZXMgdGhlIGdpdmVuIHZhcmlhYmxlIGZyb20gdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIFRoaXMgd2lsbCB0YWtlIGVmZmVjdCBpbiB0aGUgdGFyZ2V0IFZNIG9ubHkKQEAgLTE5MSwxMCArMjA2LDEwIEBACiAJdmFyc1tlbGVtZW50Q291bnQgLSAxXSA9IG51bGw7CiAJdGhpcy52YXJzQ2hhbmdlZCA9IHRydWU7CiB9Ci1wcml2YXRlIHZvaWQgZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Citwcml2YXRlIHZvaWQgZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiB7CiAJaWYgKHRoaXMuY29kZVNuaXBwZXRCaW5hcnkgPT0gbnVsbCkgewogCQkvLyBEZXBsb3kgQ29kZVNuaXBwZXQgY2xhc3MgKG9ubHkgb25jZSkKLQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzRmlsZXMoCisJCWlmICghcmVxdWVzdG9yLmFjY2VwdENsYXNzRmlsZXMoCiAJCQluZXcgQ2xhc3NGaWxlW10gewogCQkJCW5ldyBDbGFzc0ZpbGUoKSB7CiAJCQkJCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CkBAIC0yMDQsOCArMjE5LDkgQEAKIAkJCQkJCXJldHVybiBFdmFsdWF0aW9uQ29uc3RhbnRzLlJPT1RfQ09NUE9VTkRfTkFNRTsKIAkJCQkJfQogCQkJCX0KLQkJCX0sIAotCQkJbnVsbCk7CisJCQl9LAorCQkJbnVsbCkpCisJCQkJdGhyb3cgbmV3IEluc3RhbGxFeGNlcHRpb24oKTsKIAl9CiB9CiAvKioKQEAgLTIxMywxNiArMjI5LDE2IEBACiAgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGNvZGUgc25pcHBldCBjbGFzcyBmaWxlcyBjb3VsZCBub3QgYmUgZGVwbG95ZWQuCiAgKi8KIHB1YmxpYyB2b2lkIGV2YWx1YXRlKAotCWNoYXJbXSBjb2RlU25pcHBldCwgCisJY2hhcltdIGNvZGVTbmlwcGV0LAogCWNoYXJbXVtdIGNvbnRleHRMb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAotCWNoYXJbXVtdIGNvbnRleHRMb2NhbFZhcmlhYmxlTmFtZXMsIAorCWNoYXJbXVtdIGNvbnRleHRMb2NhbFZhcmlhYmxlTmFtZXMsCiAJaW50W10gY29udGV4dExvY2FsVmFyaWFibGVNb2RpZmllcnMsCiAJY2hhcltdIGNvbnRleHREZWNsYXJpbmdUeXBlTmFtZSwKIAlib29sZWFuIGNvbnRleHRJc1N0YXRpYywKIAlib29sZWFuIGNvbnRleHRJc0NvbnN0cnVjdG9yQ2FsbCwKLQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCAKLQlNYXAgb3B0aW9ucywgCi0JZmluYWwgSVJlcXVlc3RvciByZXF1ZXN0b3IsIAorCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCisJTWFwIG9wdGlvbnMsCisJZmluYWwgSVJlcXVlc3RvciByZXF1ZXN0b3IsCiAJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiB7CiAKIAkvLyBJbml0aWFsaWFsaXplIGNvbnRleHQKQEAgLTIzMyw3ICsyNDksNyBAQAogCXRoaXMuaXNTdGF0aWMgPSBjb250ZXh0SXNTdGF0aWM7CiAJdGhpcy5pc0NvbnN0cnVjdG9yQ2FsbCA9IGNvbnRleHRJc0NvbnN0cnVjdG9yQ2FsbDsKIAotCXRoaXMuZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKHJlcXVlc3Rvcik7CisJZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKHJlcXVlc3Rvcik7CiAKIAl0cnkgewogCQkvLyBJbnN0YWxsIG5ldyB2YXJpYWJsZXMgaWYgbmVlZGVkCkBAIC0yNTMsMzUgKzI2OSwyOSBAQAogCQlpZiAodGhpcy52YXJzQ2hhbmdlZCkgewogCQkJZXZhbHVhdGVWYXJpYWJsZXMoZW52aXJvbm1lbnQsIG9wdGlvbnMsIGZvcndhcmRpbmdSZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsKIAkJfQotCQkKKwogCQkvLyBDb21waWxlIGNvZGUgc25pcHBldCBpZiB0aGVyZSB3YXMgbm8gZXJyb3JzIHdoaWxlIGV2YWx1YXRpbmcgdGhlIHZhcmlhYmxlcwogCQlpZiAoIWZvcndhcmRpbmdSZXF1ZXN0b3IuaGFzRXJyb3JzKSB7Ci0JCQlFdmFsdWF0b3IgZXZhbHVhdG9yID0gCisJCQlFdmFsdWF0b3IgZXZhbHVhdG9yID0KIAkJCQluZXcgQ29kZVNuaXBwZXRFdmFsdWF0b3IoCiAJCQkJCWNvZGVTbmlwcGV0LAotCQkJCQl0aGlzLCAKKwkJCQkJdGhpcywKIAkJCQkJZW52aXJvbm1lbnQsCi0JCQkJCW9wdGlvbnMsIAotCQkJCQlyZXF1ZXN0b3IsIAorCQkJCQlvcHRpb25zLAorCQkJCQlyZXF1ZXN0b3IsCiAJCQkJCXByb2JsZW1GYWN0b3J5KTsKLQkJCUNsYXNzRmlsZVtdIGNsYXNzZXMgPSBudWxsOwotCQkJaWYgKFRJTUlORykgewotCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQljbGFzc2VzID0gZXZhbHVhdG9yLmdldENsYXNzZXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gY29tcGlsZSBbIiArIG5ldyBTdHJpbmcoY29kZVNuaXBwZXQpICsgIl0gd2FzICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJY2xhc3NlcyA9IGV2YWx1YXRvci5nZXRDbGFzc2VzKCk7Ci0JCQl9CisJCQlDbGFzc0ZpbGVbXSBjbGFzc2VzID0gZXZhbHVhdG9yLmdldENsYXNzZXMoKTsKIAkJCS8vIFNlbmQgY29kZSBzbmlwcGV0IG9uIHRhcmdldAogCQkJaWYgKGNsYXNzZXMgIT0gbnVsbCAmJiBjbGFzc2VzLmxlbmd0aCA+IDApIHsKIAkJCQljaGFyW10gc2ltcGxlQ2xhc3NOYW1lID0gZXZhbHVhdG9yLmdldENsYXNzTmFtZSgpOwotCQkJCWNoYXJbXSBwa2dOYW1lID0gdGhpcy5nZXRQYWNrYWdlTmFtZSgpOworCQkJCWNoYXJbXSBwa2dOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKIAkJCQljaGFyW10gcXVhbGlmaWVkQ2xhc3NOYW1lID0KIAkJCQkJcGtnTmFtZS5sZW5ndGggPT0gMCA/CiAJCQkJCQlzaW1wbGVDbGFzc05hbWUgOgogCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQocGtnTmFtZSwgc2ltcGxlQ2xhc3NOYW1lLCAnLicpOwogCQkJCUNPREVfU05JUFBFVF9DT1VOVEVSKys7Ci0JCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzRmlsZXMoY2xhc3NlcywgcXVhbGlmaWVkQ2xhc3NOYW1lKTsKKwkJCQlpZiAoIXJlcXVlc3Rvci5hY2NlcHRDbGFzc0ZpbGVzKGNsYXNzZXMsIHF1YWxpZmllZENsYXNzTmFtZSkpCisJCQkJCXRocm93IG5ldyBJbnN0YWxsRXhjZXB0aW9uKCk7CiAJCQl9CiAJCX0KIAl9IGZpbmFsbHkgewpAQCAtMzY5LDcgKzM3OSw3IEBACiAgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkluc3RhbGxFeGNlcHRpb24gaWYgdGhlIGNvZGUgc25pcHBldCBjbGFzcyBmaWxlcyBjb3VsZCBub3QgYmUgZGVwbG95ZWQuCiAgKi8KIHB1YmxpYyB2b2lkIGV2YWx1YXRlVmFyaWFibGVzKElOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIE1hcCBvcHRpb25zLCBJUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiB7Ci0JdGhpcy5kZXBsb3lDb2RlU25pcHBldENsYXNzSWZOZWVkZWQocmVxdWVzdG9yKTsKKwlkZXBsb3lDb2RlU25pcHBldENsYXNzSWZOZWVkZWQocmVxdWVzdG9yKTsKIAlWYXJpYWJsZXNFdmFsdWF0b3IgZXZhbHVhdG9yID0gbmV3IFZhcmlhYmxlc0V2YWx1YXRvcih0aGlzLCBlbnZpcm9ubWVudCwgb3B0aW9ucywgcmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSk7CiAJQ2xhc3NGaWxlW10gY2xhc3NlcyA9IGV2YWx1YXRvci5nZXRDbGFzc2VzKCk7CiAJaWYgKGNsYXNzZXMgIT0gbnVsbCkgewpAQCAtMzg5LDcgKzM5OSw3IEBACiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CiAJCQl9KTsKLQkJCQorCiAJCQkvLyBTZW5kIGNsYXNzZXMKIAkJCWlmICghcmVxdWVzdG9yLmFjY2VwdENsYXNzRmlsZXMoY2xhc3NlcywgbnVsbCkpIHsKIAkJCQl0aHJvdyBuZXcgSW5zdGFsbEV4Y2VwdGlvbigpOwpAQCAtMzk4LDcgKzQwOCw3IEBACiAJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIGluc3RhbGxlZAogCQkJaW50IGNvdW50ID0gdGhpcy52YXJpYWJsZUNvdW50OwogCQkJR2xvYmFsVmFyaWFibGVbXSB2YXJpYWJsZXNDb3B5ID0gbmV3IEdsb2JhbFZhcmlhYmxlW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy52YXJpYWJsZXMsIDAsIHZhcmlhYmxlc0NvcHksIDAsIGNvdW50KTsgCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudmFyaWFibGVzLCAwLCB2YXJpYWJsZXNDb3B5LCAwLCBjb3VudCk7CiAJCQl0aGlzLmluc3RhbGxlZFZhcnMgPSBuZXcgVmFyaWFibGVzSW5mbyhldmFsdWF0b3IuZ2V0UGFja2FnZU5hbWUoKSwgZXZhbHVhdG9yLmdldENsYXNzTmFtZSgpLCBjbGFzc2VzLCB2YXJpYWJsZXNDb3B5LCBjb3VudCk7CiAJCQlWQVJfQ0xBU1NfQ09VTlRFUisrOwogCQl9CkBAIC00OTksMTQgKzUwOSwxNCBAQAogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29kZSBzbmlwcGV0cyBhcmUgcnVuIGludG8uCi0gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIAorICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpZgogICogdGhlIHBhY2thZ2UgbmFtZSBoYXMgbmV2ZXIgYmVlbiBzZXQuCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0UGFja2FnZU5hbWUoKSB7CiAJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7CiB9CiAvKioKLSAqIFJldHVybiB0aGUgYmluYXJ5IGZvciB0aGUgcm9vdCBjb2RlIHNuaXBwZXQgY2xhc3MgKGllLiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQpLgorICogUmV0dXJuIHRoZSBiaW5hcnkgZm9yIHRoZSByb290IGNvZGUgc25pcHBldCBjbGFzcyAoaS5lLiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQpLgogICovCiBJQmluYXJ5VHlwZSBnZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKSB7CiAJaWYgKHRoaXMuY29kZVNuaXBwZXRCaW5hcnkgPT0gbnVsbCkgewpAQCAtNTE1LDggKzUyNSw4IEBACiAJcmV0dXJuIHRoaXMuY29kZVNuaXBwZXRCaW5hcnk7CiB9CiBwdWJsaWMgY2hhcltdIGdldFZhckNsYXNzTmFtZSgpIHsKLQlpZiAoaW5zdGFsbGVkVmFycyA9PSBudWxsKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChpbnN0YWxsZWRWYXJzLnBhY2thZ2VOYW1lLCBpbnN0YWxsZWRWYXJzLmNsYXNzTmFtZSwgJy4nKTsKKwlpZiAodGhpcy5pbnN0YWxsZWRWYXJzID09IG51bGwpIHJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMuaW5zdGFsbGVkVmFycy5wYWNrYWdlTmFtZSwgdGhpcy5pbnN0YWxsZWRWYXJzLmNsYXNzTmFtZSwgJy4nKTsKIH0KIC8qKgogICogQ3JlYXRlcyBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdHlwZSBhbmQgaW5pdGlhbGl6ZXIuCkBAIC01MzgsNDIgKzU0OCw0NSBAQAogICogKE5vdGUgdGhhdCB0aGlzIGV2YWx1YXRpb24gY29udGV4dCdzIFZNIGRvZXNuJ3QgbmVlZCB0byBiZSBydW5uaW5nLikKICAqICBAcGFyYW0gY29kZVNuaXBwZXQgY2hhcltdCiAgKiAJCVRoZSBjb2RlIHNuaXBwZXIgc291cmNlCi0gKiAKKyAqCiAgKiAgQHBhcmFtIHNlbGVjdGlvblNvdXJjZVN0YXJ0IGludAotICogCisgKgogICogIEBwYXJhbSBzZWxlY3Rpb25Tb3VyY2VFbmQgaW50Ci0gKiAKKyAqCiAgKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNlYXJjaGFibGVFbnZpcm9ubWVudAogICogICAgICB1c2VkIHRvIHJlc29sdmUgdHlwZS9wYWNrYWdlIHJlZmVyZW5jZXMgYW5kIHNlYXJjaCBmb3IgdHlwZXMvcGFja2FnZXMKICAqICAgICAgYmFzZWQgb24gcGFydGlhbCBuYW1lcy4KICAqCiAgKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VsZWN0aW9uUmVxdWVzdG9yCi0gKiAgICAgIHNpbmNlIHRoZSBlbmdpbmUgbWlnaHQgcHJvZHVjZSBhbnN3ZXJzIG9mIHZhcmlvdXMgZm9ybXMsIHRoZSBlbmdpbmUgCisgKiAgICAgIHNpbmNlIHRoZSBlbmdpbmUgbWlnaHQgcHJvZHVjZSBhbnN3ZXJzIG9mIHZhcmlvdXMgZm9ybXMsIHRoZSBlbmdpbmUKICAqICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVxdWVzdG9yIGFibGUgdG8gYWNjZXB0IGFsbCBwb3NzaWJsZSBzZWxlY3Rpb25zLgogICoKICAqICBAcGFyYW0gb3B0aW9ucyBqYXZhLnV0aWwuTWFwCiAgKgkJc2V0IG9mIG9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIGNvZGUgYXNzaXN0IGVuZ2luZS4KICAqLwotcHVibGljIHZvaWQgc2VsZWN0KCAKK3B1YmxpYyB2b2lkIHNlbGVjdCgKIAljaGFyW10gY29kZVNuaXBwZXQsCiAJaW50IHNlbGVjdGlvblNvdXJjZVN0YXJ0LAogCWludCBzZWxlY3Rpb25Tb3VyY2VFbmQsCi0JU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50LCAKKwlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAJSVNlbGVjdGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCi0JTWFwIG9wdGlvbnMpIHsKLQkJCisJTWFwIG9wdGlvbnMsCisJV29ya2luZ0NvcHlPd25lciBvd25lcikgeworCiAJZmluYWwgY2hhcltdIGNsYXNzTmFtZSA9ICJDb2RlU25pcHBldFNlbGVjdGlvbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGxvbmcgY29tcGxpYW5jZVZlcnNpb24gPSBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwob3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpOwogCWZpbmFsIENvZGVTbmlwcGV0VG9DdU1hcHBlciBtYXBwZXIgPSBuZXcgQ29kZVNuaXBwZXRUb0N1TWFwcGVyKAotCQljb2RlU25pcHBldCwgCi0JCXRoaXMucGFja2FnZU5hbWUsIAotCQl0aGlzLmltcG9ydHMsIAotCQljbGFzc05hbWUsIAorCQljb2RlU25pcHBldCwKKwkJdGhpcy5wYWNrYWdlTmFtZSwKKwkJdGhpcy5pbXBvcnRzLAorCQljbGFzc05hbWUsCiAJCXRoaXMuaW5zdGFsbGVkVmFycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuaW5zdGFsbGVkVmFycy5jbGFzc05hbWUsCi0JCXRoaXMubG9jYWxWYXJpYWJsZU5hbWVzLCAKLQkJdGhpcy5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCAKLQkJdGhpcy5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCAKKwkJdGhpcy5sb2NhbFZhcmlhYmxlTmFtZXMsCisJCXRoaXMubG9jYWxWYXJpYWJsZVR5cGVOYW1lcywKKwkJdGhpcy5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAogCQl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lLAotCQl0aGlzLmxpbmVTZXBhcmF0b3IKKwkJdGhpcy5saW5lU2VwYXJhdG9yLAorCQljb21wbGlhbmNlVmVyc2lvbgogCSk7CiAJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IElDb21waWxhdGlvblVuaXQoKSB7CiAJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CkBAIC01ODksNyArNjAyLDcgQEAKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfTsKLQlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbWFwcGVyLmdldFNlbGVjdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLCBvcHRpb25zKTsKKwlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbWFwcGVyLmdldFNlbGVjdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLCBvcHRpb25zLCBvd25lcik7CiAJZW5naW5lLnNlbGVjdChzb3VyY2VVbml0LCBtYXBwZXIuc3RhcnRQb3NPZmZzZXQgKyBzZWxlY3Rpb25Tb3VyY2VTdGFydCwgbWFwcGVyLnN0YXJ0UG9zT2Zmc2V0ICsgc2VsZWN0aW9uU291cmNlRW5kKTsKIH0KIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YQppbmRleCBiNDhmMTFlLi5jMDgyOGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywxOCArMTMsMTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DYXRlZ29yaXplZFByb2JsZW07CiAKIC8qKgotICogQW4gRXZhbHVhdGlvblJlc3VsdCBpcyB0aGUgcmVzdWx0IG9mIGEgY29kZSBzbmlwcGV0IGV2YWx1YXRpb24sIGEgZ2xvYmFsIAorICogQW4gRXZhbHVhdGlvblJlc3VsdCBpcyB0aGUgcmVzdWx0IG9mIGEgY29kZSBzbmlwcGV0IGV2YWx1YXRpb24sIGEgZ2xvYmFsCiAgKiB2YXJpYWJsZSBldmFsdWF0aW9uIG9yIGl0IGlzIHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIGFnYWluc3QgaW1wb3J0cyBhbmQKICAqIHBhY2thZ2UgZGVjbGFyYXRpb24uCi0gKiBJdCBwcmltYXJpbHkgY29udGFpbnMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgdmFsdWUgKGVnLiBpdHMgCi0gKiB0b1N0cmluZygpIHJlcHJlc2VudGF0aW9uKS4gSG93ZXZlciBpZiB0aGUgY29kZSBzbmlwcGV0LCBhIGdsb2JhbCB2YXJpYWJsZSAKLSAqIGRlZmluaXRpb24sIGFuIGltcG9ydCBvciB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQsIGl0IAorICogSXQgcHJpbWFyaWx5IGNvbnRhaW5zIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIHZhbHVlIChlLmcuIGl0cworICogdG9TdHJpbmcoKSByZXByZXNlbnRhdGlvbikuIEhvd2V2ZXIgaWYgdGhlIGNvZGUgc25pcHBldCwgYSBnbG9iYWwgdmFyaWFibGUKKyAqIGRlZmluaXRpb24sIGFuIGltcG9ydCBvciB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQsIGl0CiAgKiBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiBwcm9ibGVtcy4KICAqLwogcHVibGljIGNsYXNzIEV2YWx1YXRpb25SZXN1bHQgewogCiAJc3RhdGljIGZpbmFsIENhdGVnb3JpemVkUHJvYmxlbVtdIE5PX1BST0JMRU1TID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVswXTsKLQkKKwogCWNoYXJbXSBldmFsdWF0aW9uSUQ7CiAJaW50IGV2YWx1YXRpb25UeXBlOwogCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zOwpAQCAtNjAsNyArNjAsNyBAQAogCSAqIFRoZSBldmFsdWF0aW9uIHJlc3VsdCByZXBvcnRzIGFuIGludGVybmFsIHByb2JsZW0uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9JTlRFUk5BTCA9IDU7Ci0JCisKIHB1YmxpYyBFdmFsdWF0aW9uUmVzdWx0KGNoYXJbXSBldmFsdWF0aW9uSUQsIGludCBldmFsdWF0aW9uVHlwZSwgY2hhcltdIGRpc3BsYXlTdHJpbmcsIGNoYXJbXSB0eXBlTmFtZSkgewogCXRoaXMuZXZhbHVhdGlvbklEID0gZXZhbHVhdGlvbklEOwogCXRoaXMuZXZhbHVhdGlvblR5cGUgPSBldmFsdWF0aW9uVHlwZTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZXN1bHQncyB2YWx1ZS4KICAqIFRoaXMgaXMgb2J0YWluZWQgYnkgc2VuZGluZyB0b1N0cmluZygpIHRvIHRoZSByZXN1bHQgb2JqZWN0IG9uIHRoZSB0YXJnZXQgc2lkZQogICogaWYgaXQgaXMgbm90IGEgcHJpbWl0aXZlIHZhbHVlLiBJZiBpdCBpcyBhIHByaW1pdGl2ZSB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIHN0YXRpYyB0b1N0cmluZyguLi4pIGlzIHVzZWQsIGVnLiBJbnRlZ2VyLnRvU3RyaW5nKGludCBuKSBpZiBpdCBpcyBhbiBpbnQuCisgKiBzdGF0aWMgdG9TdHJpbmcoLi4uKSBpcyB1c2VkLCBlLmcuIEludGVnZXIudG9TdHJpbmcoaW50IG4pIGlmIGl0IGlzIGFuIGludC4KICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4KICAqLwogcHVibGljIGNoYXJbXSBnZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKIC8qKgogICogUmV0dXJucyB0aGUgZG90LXNlcGFyYXRlZCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHJlc3VsdCdzIHZhbHVlIHR5cGUuCiAgKiBJZiB0aGUgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUsIHJldHVybnMgdGhlIHRvU3RyaW5nKCkgcmVwcmVzZW50YXRpb24gb2YgaXRzIHR5cGUKLSAqIChlZy4gImludCIsICJib29sZWFuIiwgZXRjLikKKyAqIChlLmcuICJpbnQiLCAiYm9vbGVhbiIsIGV0Yy4pCiAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gdmFsdWUuCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0VmFsdWVUeXBlTmFtZSgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhCmluZGV4IDc5YTI2ODguLmRlNWM1NmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01OCw3ICs1OCw3IEBACiAvKioKICAqIFJldHVybnMgdGhlIGV2YWx1YXRpb24gcmVzdWx0cyB0aGF0IGNvbnZlcnRzIHRoZSBnaXZlbiBjb21waWxhdGlvbiByZXN1bHQgdGhhdCBoYXMgcHJvYmxlbXMuCiAgKiBJZiB0aGUgY29tcGlsYXRpb24gcmVzdWx0IGhhcyBtb3JlIHRoYW4gb25lIHByb2JsZW0sIHRoZW4gdGhlIHByb2JsZW1zIGFyZSBicm9rZW4gZG93biBzbyB0aGF0Ci0gKiBlYWNoIGV2YWx1YXRpb24gcmVzdWx0IGhhcyB0aGUgc2FtZSBldmFsdWF0aW9uIGlkLiAKKyAqIGVhY2ggZXZhbHVhdGlvbiByZXN1bHQgaGFzIHRoZSBzYW1lIGV2YWx1YXRpb24gaWQuCiAgKi8KIHByb3RlY3RlZCBFdmFsdWF0aW9uUmVzdWx0W10gZXZhbHVhdGlvblJlc3VsdHNGb3JDb21waWxhdGlvblByb2JsZW1zKENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIGN1U291cmNlKSB7CiAJLy8gQnJlYWsgZG93biB0aGUgcHJvYmxlbXMgYW5kIGdyb3VwIHRoZW0gYnkgaWRzIGluIGV2YWx1YXRpb24gcmVzdWx0cwpAQCAtMTA2LDggKzEwNiw4IEBACiAJCQkJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IHJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0ZpbGVzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBjbGFzc0ZpbGVzW2ldOwotLyogCi0JCQkKKy8qCisKIAkJCQkJY2hhcltdIGZpbGVuYW1lID0gY2xhc3NGaWxlLmZpbGVOYW1lKCk7CiAJCQkJCWludCBsZW5ndGggPSBmaWxlbmFtZS5sZW5ndGg7CiAJCQkJCWNoYXJbXSByZWxhdGl2ZU5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyA2XTsKQEAgLTExNiw4ICsxMTYsOCBAQAogCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UocmVsYXRpdmVOYW1lLCAnLycsIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKIAkJCQkJQ2xhc3NGaWxlLndyaXRlVG9EaXNrKCJkOi90ZXN0L3NuaXBwZXQiLCBuZXcgU3RyaW5nKHJlbGF0aXZlTmFtZSksIGNsYXNzRmlsZS5nZXRCeXRlcygpKTsKIAkJCQkJU3RyaW5nIHN0ciA9ICJkOi90ZXN0L3NuaXBwZXQiICsgIi8iICsgbmV3IFN0cmluZyhyZWxhdGl2ZU5hbWUpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ob3JnLmVjbGlwc2UuamR0LmNvcmUudG9vbHMuY2xhc3NmbXQuZGlzYXNzZW1ibGVyLkNsYXNzRmlsZURpc2Fzc2VtYmxlci5kaXNhc3NlbWJsZShzdHIpKTsJCQkJCi0gKi8JCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvcmcuZWNsaXBzZS5qZHQuY29yZS50b29scy5jbGFzc2ZtdC5kaXNhc3NlbWJsZXIuQ2xhc3NGaWxlRGlzYXNzZW1ibGVyLmRpc2Fzc2VtYmxlKHN0cikpOworICovCiAJCQkJCWNsYXNzRGVmaW5pdGlvbnMuYWRkKGNsYXNzRmlsZSk7CiAJCQkJfQogCQkJfQpAQCAtMTYzLDEwICsxNjMsMTAgQEAKIAljb21waWxlck9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkgPSB0cnVlOwogCWNvbXBpbGVyT3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gdHJ1ZTsKIAlyZXR1cm4gbmV3IENvbXBpbGVyKAotCQl0aGlzLmVudmlyb25tZW50LCAKLQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLCAKLQkJY29tcGlsZXJPcHRpb25zLCAKLQkJY29tcGlsZXJSZXF1ZXN0b3IsIAorCQl0aGlzLmVudmlyb25tZW50LAorCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksCisJCWNvbXBpbGVyT3B0aW9ucywKKwkJY29tcGlsZXJSZXF1ZXN0b3IsCiAJCXRoaXMucHJvYmxlbUZhY3RvcnkpOwogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0dsb2JhbFZhcmlhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0dsb2JhbFZhcmlhYmxlLmphdmEKaW5kZXggNjYwMzIwNi4uNGIyOGRmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9HbG9iYWxWYXJpYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvR2xvYmFsVmFyaWFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSw3ICszMSw3IEBACiB9CiAvKioKICAqIFJldHVybnMgdGhlIGluaXRpYWxpemVyIG9mIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLiBUaGUgaW5pdGlhbGl6ZXIgaXMgYQotICogdmFyaWFibGUgaW5pdGlhbGl6ZXIgKGllLiBhbiBleHByZXNzaW9uIG9yIGFuIGFycmF5IGluaXRpYWxpemVyKSBhcyBkZWZpbmVkIAorICogdmFyaWFibGUgaW5pdGlhbGl6ZXIgKGkuZS4gYW4gZXhwcmVzc2lvbiBvciBhbiBhcnJheSBpbml0aWFsaXplcikgYXMgZGVmaW5lZAogICogaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbnMuCiAgKi8KIHB1YmxpYyBjaGFyW10gZ2V0SW5pdGlhbGl6ZXIoKSB7CkBAIC00NSw3ICs0NSw3IEBACiB9CiAvKioKICAqIFJldHVybnMgdGhlIGRvdCBzZXBhcmF0ZWQgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBnbG9iYWwgdmFyaWFibGUsCi0gKiBvciBpdHMgc2ltcGxlIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUgKGVnLiBpbnQsIGJvb2xlYW4sIGV0Yy4pCisgKiBvciBpdHMgc2ltcGxlIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUgKGUuZy4gaW50LCBib29sZWFuLCBldGMuKQogICovCiBwdWJsaWMgY2hhcltdIGdldFR5cGVOYW1lKCkgewogCXJldHVybiB0aGlzLnR5cGVOYW1lOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JbnN0YWxsRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0luc3RhbGxFeGNlcHRpb24uamF2YQppbmRleCA3ODFiN2M3Li42Nzc0NjA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0luc3RhbGxFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0luc3RhbGxFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSw3ICsxNSw3IEBACiAgKiBmb3IgYW55IHJlYXNvbi4KICAqLwogcHVibGljIGNsYXNzIEluc3RhbGxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4NzA4OTc3NDc4MTA2NTQyMDNMOwkvLyBiYWNrd2FyZCBjb21wYXRpYmxlCiAvKioKICAqIENvbnN0cnVjdHMgYSA8Y29kZT5JbnN0YWxsRXhjZXB0aW9uPC9jb2RlPiB3aXRoIG5vIGRldGFpbCAgbWVzc2FnZS4KQEAgLTI0LDggKzI0LDggQEAKIAlzdXBlcigpOwogfQogLyoqCi0gKiBDb25zdHJ1Y3RzIGEgPGNvZGU+SW5zdGFsbEV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIAotICogZGV0YWlsIG1lc3NhZ2UuIAorICogQ29uc3RydWN0cyBhIDxjb2RlPkluc3RhbGxFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICogZGV0YWlsIG1lc3NhZ2UuCiAgKgogICogQHBhcmFtICAgcyAgIHRoZSBkZXRhaWwgbWVzc2FnZS4KICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9WYXJpYWJsZXNFdmFsdWF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzRXZhbHVhdG9yLmphdmEKaW5kZXggM2VmYmMyNC4uZjljYjEzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9WYXJpYWJsZXNFdmFsdWF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlpbnQgcGJMaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7CiAJaW50IGN1cnJlbnRMaW5lID0gMTsKIAotCS8vIGNoZWNrIHBhY2thZ2UgZGVjbGFyYXRpb24JCisJLy8gY2hlY2sgcGFja2FnZSBkZWNsYXJhdGlvbgogCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7CiAJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCA+IDApIHsKIAkJaWYgKHBiTGluZSA9PSAxKSB7CkBAIC03OCw3ICs3OCw3IEBACiAJaW50IHZhckNvdW50ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlQ291bnQ7CiAJaWYgKChjdXJyZW50TGluZSA8PSBwYkxpbmUpICYmIChwYkxpbmUgPCBjdXJyZW50TGluZSArIHZhckNvdW50KSkgewogCQlHbG9iYWxWYXJpYWJsZSB2YXIgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzW3BiTGluZSAtIGN1cnJlbnRMaW5lXTsKLQkJCisKIAkJLy8gc2V0IGV2YWx1YXRpb24gaWQgYW5kIHR5cGUKIAkJZXZhbHVhdGlvbklEID0gdmFyLmdldE5hbWUoKTsKIAkJZXZhbHVhdGlvblR5cGUgPSBFdmFsdWF0aW9uUmVzdWx0LlRfVkFSSUFCTEU7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAqLwogQ29tcGlsZXIgZ2V0Q29tcGlsZXIoSUNvbXBpbGVyUmVxdWVzdG9yIGNvbXBpbGVyUmVxdWVzdG9yKSB7CiAJQ29tcGlsZXIgY29tcGlsZXIgPSBzdXBlci5nZXRDb21waWxlcihjb21waWxlclJlcXVlc3Rvcik7Ci0JCisKIAkvLyBJbml0aWFsaXplIHRoZSBjb21waWxlcidzIGxvb2t1cCBlbnZpcm9ubWVudCB3aXRoIHRoZSBhbHJlYWR5IGNvbXBpbGVkIHN1cGVyIGNsYXNzCiAJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IHRoaXMuY29udGV4dC5nZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKTsKIAlpZiAoYmluYXJ5VHlwZSAhPSBudWxsKSB7CkBAIC0xNjYsOCArMTY2LDggQEAKIAkJCWNvbXBpbGVyLmxvb2t1cEVudmlyb25tZW50LmNhY2hlQmluYXJ5VHlwZShiaW5hcnksIG51bGwgLypubyBhY2Nlc3MgcmVzdHJpY3Rpb24qLyk7CiAJCX0KIAl9Ci0JCi0JcmV0dXJuIGNvbXBpbGVyOwkKKworCXJldHVybiBjb21waWxlcjsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgbmFtZSBvZiBwYWNrYWdlIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCkBAIC0xODEsNyArMTgxLDcgQEAKIHByb3RlY3RlZCBjaGFyW10gZ2V0U291cmNlKCkgewogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJaW50IGxpbmVOdW1iZXJPZmZzZXQgPSAxOwotCQorCiAJLy8gcGFja2FnZSBkZWNsYXJhdGlvbgogCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7CiAJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCAhPSAwKSB7CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJfQogCX0KIAlidWZmZXIuYXBwZW5kKCJcdH0iKS5hcHBlbmQodGhpcy5jb250ZXh0LmxpbmVTZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvLyBlbmQgb2YgY2xhc3MgZGVjbGFyYXRpb24KIAlidWZmZXIuYXBwZW5kKCd9JykuYXBwZW5kKHRoaXMuY29udGV4dC5saW5lU2VwYXJhdG9yKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YQppbmRleCBkNWUyYjNiLi43ODdkNGU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwzNyArMTEsNzkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKIAogLyoqCiAgKiBTcGVjaWZpY2F0aW9uIGZvciBhIGdlbmVyaWMgc291cmNlIGNvZGUgZm9ybWF0dGVyLgotICogCisgKgogICogQHNpbmNlIDMuMAorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVGb3JtYXR0ZXIgewogCiAJLyoqCiAJICogVW5rbm93biBraW5kCisJICo8cD4KKwkgKiA8Yj5TaW5jZSAzLjY8L2I+LCBpZiB0aGUgY29ycmVzcG9uZGluZyBjb21tZW50IG9wdGlvbnMgYXJlIHNldCB0bworCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBmb3JtYXQgdGhlIGNvbW1lbnRzIG9uIHRoZSBmbHkKKwkgKiBieSBhZGRpbmcgdGhlIHtAbGluayAjRl9JTkNMVURFX0NPTU1FTlRTfSBmbGFnIHRvIHRoaXMga2luZCBvZiBmb3JtYXQuCisJICogPC9wPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtfVU5LTk9XTiA9IDB4MDA7CiAKIAkvKioKIAkgKiBLaW5kIHVzZWQgdG8gZm9ybWF0IGFuIGV4cHJlc3Npb24KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdXNpbmcgdGhpcyBjb25zdGFudCwgdGhlIGNvbW1lbnRzIGVuY291bnRlcmVkIHdoaWxlIGZvcm1hdHRpbmcKKwkgKiB0aGUgZXhwcmVzc2lvbiBtYXkgYmUgc2hpZnRlZCB0byBtYXRjaCB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbiBidXQgYXJlIG5vdAorCSAqIGZvcm1hdHRlZC4KKwkgKiA8L3A+PHA+CisJICogPGI+U2luY2UgMy42PC9iPiwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBvcHRpb25zIGFyZSBzZXQgdG8KKwkgKiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZm9ybWF0IHRoZSBjb21tZW50cyBvbiB0aGUgZmx5CisJICogYnkgYWRkaW5nIHRoZSB7QGxpbmsgI0ZfSU5DTFVERV9DT01NRU5UU30gZmxhZyB0byB0aGlzIGtpbmQgb2YgZm9ybWF0LgorCSAqIDwvcD4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0VYUFJFU1NJT04gPSAweDAxOwotCQorCiAJLyoqCiAJICogS2luZCB1c2VkIHRvIGZvcm1hdCBhIHNldCBvZiBzdGF0ZW1lbnRzCisJICogPHA+CisJICogTm90ZSB0aGF0IHVzaW5nIHRoaXMgY29uc3RhbnQsIHRoZSBjb21tZW50cyBlbmNvdW50ZXJlZCB3aGlsZSBmb3JtYXR0aW5nCisJICogdGhlIHN0YXRlbWVudHMgbWF5IGJlIHNoaWZ0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYnV0IGFyZSBub3QKKwkgKiBmb3JtYXR0ZWQuCisJICogPC9wPjxwPgorCSAqIDxiPlNpbmNlIDMuNjwvYj4sIGlmIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgb3B0aW9ucyBhcmUgc2V0IHRvCisJICogPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGZvcm1hdCB0aGUgY29tbWVudHMgb24gdGhlIGZseQorCSAqIGJ5IGFkZGluZyB0aGUge0BsaW5rICNGX0lOQ0xVREVfQ09NTUVOVFN9IGZsYWcgdG8gdGhpcyBraW5kIG9mIGZvcm1hdC4KKwkgKiA8L3A+CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS19TVEFURU1FTlRTID0gMHgwMjsKLQkKKwogCS8qKgogCSAqIEtpbmQgdXNlZCB0byBmb3JtYXQgYSBzZXQgb2YgY2xhc3MgYm9keSBkZWNsYXJhdGlvbnMKKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdXNpbmcgdGhpcyBjb25zdGFudCwgdGhlIGNvbW1lbnRzIGVuY291bnRlcmVkIHdoaWxlIGZvcm1hdHRpbmcKKwkgKiB0aGUgYm9keSBkZWNsYXJhdGlvbnMgbWF5IGJlIHNoaWZ0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYnV0CisJICogYXJlIG5vdCBmb3JtYXR0ZWQuCisJICogPC9wPjxwPgorCSAqIDxiPlNpbmNlIDMuNjwvYj4sIGlmIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgb3B0aW9ucyBhcmUgc2V0IHRvCisJICogPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGZvcm1hdCB0aGUgY29tbWVudHMgb24gdGhlIGZseQorCSAqIGJ5IGFkZGluZyB0aGUge0BsaW5rICNGX0lOQ0xVREVfQ09NTUVOVFN9IGZsYWcgdG8gdGhpcyBraW5kIG9mIGZvcm1hdC4KKwkgKiA8L3A+CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS19DTEFTU19CT0RZX0RFQ0xBUkFUSU9OUyA9IDB4MDQ7Ci0JCisKIAkvKioKIAkgKiBLaW5kIHVzZWQgdG8gZm9ybWF0IGEgY29tcGlsYXRpb24gdW5pdAorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB1c2luZyB0aGlzIGNvbnN0YW50LCB0aGUgY29tbWVudHMgYXJlIG9ubHkgaW5kZW50ZWQgd2hpbGUKKwkgKiBmb3JtYXR0aW5nIHRoZSBjb21waWxhdGlvbiB1bml0LgorCSAqIDwvcD48cD4KKwkgKiA8Yj5TaW5jZSAzLjQ8L2I+LCBpZiB0aGUgY29ycmVzcG9uZGluZyBjb21tZW50IG9wdGlvbiBpcyBzZXQgdG8KKwkgKiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZm9ybWF0IHRoZSBjb21tZW50cyBvbiB0aGUgZmx5CisJICogYnkgYWRkaW5nIHRoZSB7QGxpbmsgI0ZfSU5DTFVERV9DT01NRU5UU30gZmxhZyB0byB0aGlzIGtpbmQgb2YgZm9ybWF0LgorCSAqIDwvcD4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0NPTVBJTEFUSU9OX1VOSVQgPSAweDA4OwogCkBAIC01MCwzMiArOTIsMTI4IEBACiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtfU0lOR0xFX0xJTkVfQ09NTUVOVCA9IDB4MTA7CisKIAkvKioKIAkgKiBLaW5kIHVzZWQgdG8gZm9ybWF0IGEgbXVsdGktbGluZSBjb21tZW50CiAJICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtfTVVMVElfTElORV9DT01NRU5UID0gMHgyMDsKKwogCS8qKgogCSAqIEtpbmQgdXNlZCB0byBmb3JtYXQgYSBKYXZhZG9jIGNvbW1lbnQKKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0pBVkFfRE9DID0gMHg0MDsKIAotCS8qKiAKKwkvKioKKwkgKiBGbGFnIHVzZWQgdG8gaW5jbHVkZSB0aGUgY29tbWVudHMgZHVyaW5nIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBjb2RlCisJICogc25pcHBldC4KKwkgKiA8cD4KKwkgKiBUaGlzIGZsYWcgY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBraW5kczoKKwkgKiA8dWw+CisJICogCQk8bGk+e0BsaW5rICNLX0NPTVBJTEFUSU9OX1VOSVR9PC9saT4KKwkgKiAJCTxsaT57QGxpbmsgI0tfVU5LTk9XTn08L2xpPgorCSAqIAkJPGxpPntAbGluayAjS19DTEFTU19CT0RZX0RFQ0xBUkFUSU9OU30gPGk+KHNpbmNlIDMuNik8L2k+PC9saT4KKwkgKiAJCTxsaT57QGxpbmsgI0tfRVhQUkVTU0lPTn0gPGk+KHNpbmNlIDMuNik8L2k+PC9saT4KKwkgKiAJCTxsaT57QGxpbmsgI0tfU1RBVEVNRU5UU30gPGk+KHNpbmNlIDMuNik8L2k+PC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD48cD4KKwkgKiBOb3RlIGFsc28gdGhhdCBpdCBoYXMgYW4gZWZmZWN0IG9ubHkgd2hlbiBvbmUgb3Igc2V2ZXJhbCBmb3JtYXQgY29tbWVudHMKKwkgKiBvcHRpb25zIGZvcgorCSAqIHtAbGluayBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfSkFWQURPQ19DT01NRU5UIGphdmFkb2N9CisJICogLAorCSAqIHtAbGluayBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfQkxPQ0tfQ09NTUVOVCBibG9ja30KKwkgKiBvcgorCSAqIHtAbGluayBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UIGxpbmV9CisJICogYXJlIHNldCB0byB7QGxpbmsgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjVFJVRSB0cnVlfSB3aGlsZSBjYWxsaW5nCisJICoge0BsaW5rICNmb3JtYXQoaW50LCBTdHJpbmcsIGludCwgaW50LCBpbnQsIFN0cmluZyl9IG9yCisJICoge0BsaW5rICNmb3JtYXQoaW50LCBTdHJpbmcsIElSZWdpb25bXSwgaW50LCBTdHJpbmcpfSBtZXRob2RzCisJICogPC9wPjxwPgorCSAqIEZvciBleGFtcGxlLCB3aXRoIHRoZSBFY2xpcHNlIGRlZmF1bHQgZm9ybWF0dGVyIG9wdGlvbnMsIHRoZSBmb3JtYXR0aW5nCisJICogb2YgdGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgdXNpbmcge0BsaW5rICNLX0NPTVBJTEFUSU9OX1VOSVR9OgorCSAqIDxwcmU+CisJICogcHVibGljIGNsYXNzIFggeworCSAqICYjMDQ3OyYjMDQyOyYjMDQyOworCSAqICAmIzA0MjsgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIGV4YW1wbGUgdG8gc2hvdyB0aGF0IGNvbW1lbnRzIHdpbGwgYmUgZm9ybWF0dGVkIHdoaWxlIHByb2Nlc3NpbmcgYSBjb21waWxhdGlvbiB1bml0IG9ubHkgaWYgdGhlIGNvbnN0YW50IGZsYWcgPGNvZGU+Rl9JTkNMVURFX0NPTU1FTlQ8L2NvZGU+IGZsYWcgaXMgc2V0LgorCSAqICAmIzA0MjsgJiMwNjQ7cGFyYW0gc3RyIFRoZSBpbnB1dCBzdHJpbmcKKwkgKiAgJiMwNDI7JiMwNDc7CisJICogIHZvaWQgZm9vKFN0cmluZyBzdHIpe319CisJICogPC9wcmU+CisJICogd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorCSAqIDxwcmU+CisJICogcHVibGljIGNsYXNzIFggeworCSAqIAkmIzA0NzsmIzA0MjsmIzA0MjsKKwkgKiAgCSAmIzA0MjsgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIGV4YW1wbGUgdG8gc2hvdyB0aGF0IGNvbW1lbnRzIHdpbGwgYmUgZm9ybWF0dGVkIHdoaWxlIHByb2Nlc3NpbmcgYSBjb21waWxhdGlvbiB1bml0IG9ubHkgaWYgdGhlIGNvbnN0YW50IGZsYWcgPGNvZGU+Rl9JTkNMVURFX0NPTU1FTlQ8L2NvZGU+IGZsYWcgaXMgc2V0LgorCSAqICAJICYjMDQyOworCSAqICAJICYjMDQyOyAmIzA2NDtwYXJhbSBzdHIgVGhlIGlucHV0IHN0cmluZworCSAqICAJICYjMDQyOyYjMDQ3OworCSAqICAJdm9pZCBmb28oU3RyaW5nIHN0cil7CisJICogIAl9CisJICogIH0KKwkgKiA8L3ByZT4KKwkgKiBBZGRpbmcgdGhpcyBmbGF2b3IgdG8gdGhlIGtpbmQgZ2l2ZW4gd2hpbGUgZm9ybWF0dGluZyB0aGUgc2FtZSBzb3VyY2UKKwkgKiAoZS5nLiB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH0gfCB7QGxpbmsgI0ZfSU5DTFVERV9DT01NRU5UU30pCisJICogd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IGluc3RlYWQ6CisJICogPHByZT4KKwkgKiBwdWJsaWMgY2xhc3MgWCB7CisJICogCSYjMDQ3OyYjMDQyOyYjMDQyOworCSAqICAJICYjMDQyOyBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgZXhhbXBsZSB0byBzaG93IHRoYXQgY29tbWVudHMgd2lsbCBiZSBmb3JtYXR0ZWQKKwkgKiAgCSAmIzA0Mjsgd2hpbGUgcHJvY2Vzc2luZyBhIGNvbXBpbGF0aW9uIHVuaXQgb25seSBpZiB0aGUgY29uc3RhbnQgZmxhZworCSAqICAJICYjMDQyOyA8Y29kZT5GX0lOQ0xVREVfQ09NTUVOVDwvY29kZT4gZmxhZyBpcyBzZXQuCisJICogIAkgJiMwNDI7CisJICogIAkgJiMwNDI7ICYjMDY0O3BhcmFtIHN0cgorCSAqICAJICYjMDQyOyAJCVRoZSBpbnB1dCBzdHJpbmcKKwkgKiAgCSAmIzA0MjsmIzA0NzsKKwkgKiAgCXZvaWQgZm9vKFN0cmluZyBzdHIpeworCSAqICAJfQorCSAqICB9CisJICogPC9wcmU+CisJICogPC9wPjxwPgorCSAqIDxpPjx1Pk5vdGU8L3U+OiBBbHRob3VnaCB3ZSdyZSBjb252aW5jZWQgdGhhdCB0aGUgZm9ybWF0dGVyIHNob3VsZAorCSAqIGFsd2F5cyBpbmNsdWRlIHRoZSBjb21tZW50cyB3aGlsZSBwcm9jZXNzaW5nIGEKKwkgKiB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVCBraW5kIG9mIGNvbXBpbGF0aW9uIHVuaXR9LCB3ZQorCSAqIGhhdmUgZGVjaWRlZCB0byBhZGQgYSBzcGVjaWZpYyBmbGFnIHRvIGZpeCB0aGlzIGZvcm1hdHRlciBpbmNvcnJlY3QgYmVoYXZpb3IuCisJICogVGhpcyB3aWxsIHByZXZlbnQgYWxsIGV4aXN0aW5nIGNsaWVudHMgKGUuZy4gMy4zIGFuZCBwcmV2aW91cyB2ZXJzaW9ucykgdXNpbmcKKwkgKiB0aGUge0BsaW5rICNLX0NPTVBJTEFUSU9OX1VOSVR9IGtpbmQgdG8gYmUgYnJva2VuIHdoaWxlIGZvcm1hdHRpbmcuPC9pPgorCSAqIDwvcD4KKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9JTkNMVURFX0NPTU1FTlRTID0gMHgxMDAwOworCisJLyoqCiAJICogRm9ybWF0IDxjb2RlPnNvdXJjZTwvY29kZT4sCi0JICogYW5kIHJldHVybnMgYSB0ZXh0IGVkaXQgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGdpdmVuIHN0cmluZyBhbmQgdGhlIGZvcm1hdHRlZCBzdHJpbmcuCi0JICogPHA+SXQgcmV0dXJucyBudWxsIGlmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIGZvcm1hdHRlZC48L3A+Ci0JICogCi0JICogPHA+SWYgdGhlIG9mZnNldCBwb3NpdGlvbiBpcyBtYXRjaGluZyBhIHdoaXRlc3BhY2UsIHRoZSByZXN1bHQgY2FuIGluY2x1ZGUgd2hpdGVzcGFjZXMuIEl0IHdvdWxkIGJlIHVwIHRvIHRoZQotCSAqIGNhbGxlciB0byBnZXQgcmlkIG9mIHByZWNlZWRpbmcgd2hpdGVzcGFjZXMuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIFVzZSB0byBzcGVjaWZ5IHRoZSBraW5kIG9mIHRoZSBjb2RlIHNuaXBwZXQgdG8gZm9ybWF0LiBJdCBjYW4gYmUgYW55IG9mIHRoZXNlOgotCSAqICAgICAgICBLX0VYUFJFU1NJT04sIEtfU1RBVEVNRU5UUywgS19DTEFTU19CT0RZX0RFQ0xBUkFUSU9OUywgS19DT01QSUxBVElPTl9VTklULCBLX1VOS05PV04sCi0JICogICAgICAgIEtfU0lOR0xFX0xJTkVfQ09NTUVOVCwgS19NVUxUSV9MSU5FX0NPTU1FTlQsIEtfSkFWQV9ET0MKKwkgKiBhbmQgcmV0dXJucyBhIHRleHQgZWRpdCB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4KKwkgKiBzdHJpbmcgYW5kIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorCSAqIDxwPgorCSAqIEl0IHJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGNhbm5vdCBiZSBmb3JtYXR0ZWQuCisJICogPC9wPjxwPgorCSAqIElmIHRoZSBvZmZzZXQgcG9zaXRpb24gaXMgbWF0Y2hpbmcgYSB3aGl0ZXNwYWNlLCB0aGUgcmVzdWx0IGNhbiBpbmNsdWRlCisJICogd2hpdGVzcGFjZXMuIEl0IHdvdWxkIGJlIHVwIHRvIHRoZSBjYWxsZXIgdG8gZ2V0IHJpZCBvZiBwcmVjZWRpbmcKKwkgKiB3aGl0ZXNwYWNlcy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0ga2luZCBVc2UgdG8gc3BlY2lmeSB0aGUga2luZCBvZiB0aGUgY29kZSBzbmlwcGV0IHRvIGZvcm1hdC4gSXQgY2FuCisJICogYmUgYW55IG9mIHRoZXNlOgorCSAqIDx1bD4KKwkgKiAJPGxpPntAbGluayAjS19FWFBSRVNTSU9OfTwvbGk+CisJICogCTxsaT57QGxpbmsgI0tfU1RBVEVNRU5UU308L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TfTwvbGk+CisJICogCTxsaT57QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH08YnI+CisJICogCQk8Yj5TaW5jZSAzLjQ8L2I+LCB0aGUgY29tbWVudHMgY2FuIGJlIGZvcm1hdHRlZCBvbiB0aGUgZmx5IHdoaWxlCisJICogCQl1c2luZyB0aGlzIGtpbmQgb2YgY29kZSBzbmlwcGV0PGJyPgorCSAqIAkJKHNlZSB7QGxpbmsgI0ZfSU5DTFVERV9DT01NRU5UU30gZm9yIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb24KKwkgKiAJCXRoaXMgZmxhZykKKwkgKiAJPC9saT4KKwkgKiAJPGxpPntAbGluayAjS19VTktOT1dOfTwvbGk+CisJICogCTxsaT57QGxpbmsgI0tfU0lOR0xFX0xJTkVfQ09NTUVOVH08L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX01VTFRJX0xJTkVfQ09NTUVOVH08L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX0pBVkFfRE9DfTwvbGk+CisJICogPC91bD4KIAkgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgdG8gZm9ybWF0CiAJICogQHBhcmFtIG9mZnNldCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIHN0YXJ0IHJlY29yZGluZyB0aGUgZWRpdHMgKGluY2x1c2l2ZSkuCiAJICogQHBhcmFtIGxlbmd0aCB0aGUgZ2l2ZW4gbGVuZ3RoIHRvIHN0b3AgcmVjb3JkaW5nIHRoZSBlZGl0cyAoZXhjbHVzaXZlKS4KLQkgKiBAcGFyYW0gaW5kZW50YXRpb25MZXZlbCB0aGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbCwgdXNlZCAKKwkgKiBAcGFyYW0gaW5kZW50YXRpb25MZXZlbCB0aGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbCwgdXNlZAogCSAqICAgICAgdG8gc2hpZnQgbGVmdC9yaWdodCB0aGUgZW50aXJlIHNvdXJjZSBmcmFnbWVudC4gQW4gaW5pdGlhbCBpbmRlbnRhdGlvbgogCSAqICAgICAgbGV2ZWwgb2YgemVybyBvciBiZWxvdyBoYXMgbm8gZWZmZWN0LgogCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UgaW4gZm9ybWF0dGVkIHNvdXJjZSwKQEAgLTg1LDE0ICsyMjMsNTcgQEAKIAkgKiBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHNvdXJjZSBsZW5ndGguCiAJICovCiAJcHVibGljIGFic3RyYWN0IFRleHRFZGl0IGZvcm1hdChpbnQga2luZCwgU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yKTsKLQkKKworCS8qKgorCSAqIEZvcm1hdCA8Y29kZT5zb3VyY2U8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIGEgdGV4dCBlZGl0IHRoYXQgY29ycmVzcG9uZCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorCSAqIDxwPkl0IHJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGNhbm5vdCBiZSBmb3JtYXR0ZWQuPC9wPgorCSAqCisJICogPHA+SWYgYW4gb2Zmc2V0IHBvc2l0aW9uIGlzIG1hdGNoaW5nIGEgd2hpdGVzcGFjZSwgdGhlIHJlc3VsdCBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlcy4gSXQgd291bGQgYmUgdXAgdG8gdGhlCisJICogY2FsbGVyIHRvIGdldCByaWQgb2YgcHJlY2VkaW5nIHdoaXRlc3BhY2VzLjwvcD4KKwkgKgorCSAqIDxwPk5vIHJlZ2lvbiBpbiA8Y29kZT5yZWdpb25zPC9jb2RlPiBtdXN0IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgcmVnaW9uIGluIDxjb2RlPnJlZ2lvbnM8L2NvZGU+LgorCSAqIEVhY2ggcmVnaW9uIG11c3QgYmUgd2l0aGluIHNvdXJjZS4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVnaW9uLiBSZWdpb25zIG11c3QgYmUgc29ydGVkCisJICogYnkgdGhlaXIgb2Zmc2V0cywgc21hbGxlciBvZmZzZXQgZmlyc3QuPC9wPgorCSAqCisJICogQHBhcmFtIGtpbmQgVXNlIHRvIHNwZWNpZnkgdGhlIGtpbmQgb2YgdGhlIGNvZGUgc25pcHBldCB0byBmb3JtYXQuIEl0IGNhbgorCSAqIGJlIGFueSBvZiB0aGVzZToKKwkgKiA8dWw+CisJICogCTxsaT57QGxpbmsgI0tfRVhQUkVTU0lPTn08L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX1NUQVRFTUVOVFN9PC9saT4KKwkgKiAJPGxpPntAbGluayAjS19DTEFTU19CT0RZX0RFQ0xBUkFUSU9OU308L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX0NPTVBJTEFUSU9OX1VOSVR9PGJyPgorCSAqIAkJPGI+U2luY2UgMy40PC9iPiwgdGhlIGNvbW1lbnRzIGNhbiBiZSBmb3JtYXR0ZWQgb24gdGhlIGZseSB3aGlsZQorCSAqIAkJdXNpbmcgdGhpcyBraW5kIG9mIGNvZGUgc25pcHBldDxicj4KKwkgKiAJCShzZWUge0BsaW5rICNGX0lOQ0xVREVfQ09NTUVOVFN9IGZvciBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uCisJICogCQl0aGlzIGZsYWcpCisJICogCTwvbGk+CisJICogCTxsaT57QGxpbmsgI0tfVU5LTk9XTn08L2xpPgorCSAqIAk8bGk+e0BsaW5rICNLX1NJTkdMRV9MSU5FX0NPTU1FTlR9PC9saT4KKwkgKiAJPGxpPntAbGluayAjS19NVUxUSV9MSU5FX0NPTU1FTlR9PC9saT4KKwkgKiAJPGxpPntAbGluayAjS19KQVZBX0RPQ308L2xpPgorCSAqIDwvdWw+CisJICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHRvIGZvcm1hdAorCSAqIEBwYXJhbSByZWdpb25zIGEgc2V0IG9mIHJlZ2lvbnMgaW4gc291cmNlIHRvIGZvcm1hdAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbml0aWFsIGluZGVudGF0aW9uIGxldmVsLCB1c2VkCisJICogICAgICB0byBzaGlmdCBsZWZ0L3JpZ2h0IHRoZSBlbnRpcmUgc291cmNlIGZyYWdtZW50LiBBbiBpbml0aWFsIGluZGVudGF0aW9uCisJICogICAgICBsZXZlbCBvZiB6ZXJvIG9yIGJlbG93IGhhcyBubyBlZmZlY3QuCisJICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgdGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZSBpbiBmb3JtYXR0ZWQgc291cmNlLAorCSAqICAgICBpZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQgb25lIHdpbGwgYmUgdXNlZC4KKwkgKiBAcmV0dXJuIHRoZSB0ZXh0IGVkaXQKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyByZWdpb24sIGEgcmVnaW9uIG92ZXJsYXBzIHdpdGggYW5vdGhlciByZWdpb24sIG9yIHRoZSByZWdpb25zIGFyZSBub3QKKwkgKiBzb3J0ZWQgaW4gdGhlIGFzY2VuZGluZyBvcmRlci4KKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGFic3RyYWN0IFRleHRFZGl0IGZvcm1hdChpbnQga2luZCwgU3RyaW5nIHNvdXJjZSwgSVJlZ2lvbltdIHJlZ2lvbnMsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvcik7CisKIAkvKioKIAkgKiBBbnN3ZXJzIHRoZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaW5kZW50YXRpb24gdG8gdGhlIGdpdmVuIGluZGVudGF0aW9uIGxldmVsIG9yIGFuIGVtcHR5IHN0cmluZwogCSAqIGlmIHRoZSBpbmRlbnRhdGlvbiBjYW5ub3QgYmUgY29tcHV0ZWQuCi0JICogPHA+VGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgb3ZlcnJpZGVuIGluIGEgc3ViY2xhc3MuPC9wPgotCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcy48L3A+CisJICoKIAkgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy48L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gaW5kZW50YXRpb25MZXZlbCB0aGUgZ2l2ZW4gaW5kZW50YXRpb24gbGV2ZWwKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgcmlnaHQgaW5kZW50YXRpb24gbGV2ZWwKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gaW5kZW50YXRpb24gbGV2ZWwgaXMgbG93ZXIgdGhhbiB6ZXJvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXJBcHBsaWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyQXBwbGljYXRpb24uamF2YQppbmRleCAyZjQ4M2YwLi5kNDBjNzE4IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXJBcHBsaWNhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlckFwcGxpY2F0aW9uLmphdmEKQEAgLTEsMTYgKzEsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgQmVuIEtvbnJhdGggPGJlbkBiYWd1Lm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwNiBSZWQgSGF0IEluY29ycG9yYXRlZAotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICAqIAotICogQ29udHJpYnV0b3JzOgorICogIENvbnRyaWJ1dG9yczoKICAqICAgICBCZW4gS29ucmF0aCA8YmVuQGJhZ3Uub3JnPiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KICAqICAgICBSZWQgSGF0IEluY29ycG9yYXRlZCAtIGltcHJvdmVtZW50cyBiYXNlZCBvbiBjb21tZW50cyBmcm9tIEpEVCBkZXZlbG9wZXJzCiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQ29kZSByZXZpZXcgYW5kIGludGVncmF0aW9uCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gRml4IGZvciAzNDAxODEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXI7CiAKQEAgLTM4LDE1ICszNywxOCBAQAogLyoqCiAgKiBJbXBsZW1lbnRzIGFuIEVjbGlwc2UgQXBwbGljYXRpb24gZm9yIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb2RlRm9ybWF0dGVyLgogICogCi0gKiBUaGVyZSBhcmUgYSBjb3VwbGUgaW1wcm92bWVudHMgdGhhdCBjb3VsZCBiZSBtYWRlOiAxLiBNYWtlIGEgbGlzdCBvZiBhbGwgdGhlCisgKiA8cD5PbiBNYWNPUywgd2hlbiBpbnZva2VkIHVzaW5nIHRoZSBFY2xpcHNlIGV4ZWN1dGFibGUsIHRoZSAidXNlci5kaXIiIHByb3BlcnR5IGlzIHNldCB0byB0aGUgZm9sZGVyCisgKiBpbiB3aGljaCB0aGUgZWNsaXBzZS5pbmkgZmlsZSBpcyBsb2NhdGVkLiBUaGlzIG1ha2VzIGl0IGhhcmRlciB0byB1c2UgcmVsYXRpdmUgcGF0aHMgdG8gcG9pbnQgdG8gdGhlIAorICogZmlsZXMgdG8gYmUgZm9ybWF0dGVkIG9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlIHRvIHNldCB0aGUgY29kZSBmb3JtYXR0ZXIncyBvcHRpb25zLjwvcD4KKyAqCisgKiA8cD5UaGVyZSBhcmUgYSBjb3VwbGUgaW1wcm92ZW1lbnRzIHRoYXQgY291bGQgYmUgbWFkZTogMS4gTWFrZSBhIGxpc3Qgb2YgYWxsIHRoZQogICogZmlsZXMgZmlyc3Qgc28gdGhhdCBhIGZpbGUgZG9lcyBub3QgZ2V0IGZvcm1hdHRlZCB0d2ljZS4gMi4gVXNlIGEgdGV4dCBiYXNlZAotICogcHJvZ3Jlc3MgbW9uaXRvciBmb3Igb3V0cHV0LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCisgKiBwcm9ncmVzcyBtb25pdG9yIGZvciBvdXRwdXQuPC9wPgorICoKICAqIEBhdXRob3IgQmVuIEtvbnJhdGggPGJrb25yYXRoQHJlZGhhdC5jb20+CiAgKiBAc2luY2UgMy4yCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBDb2RlRm9ybWF0dGVyQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewogCkBAIC02MywxMiArNjUsMTQgQEAKIAogCQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTGluZUVycm9yQ29uZmlnOwogCisJCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1hbmRMaW5lRXJyb3JGaWxlVHJ5RnVsbFBhdGg7CisKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZExpbmVFcnJvckZpbGU7CiAKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZExpbmVFcnJvckZpbGVEaXI7CiAKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZExpbmVFcnJvclF1aWV0VmVyYm9zZTsKLQkJCisKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZExpbmVFcnJvck5vQ29uZmlnRmlsZTsKIAogCQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTGluZUZvcm1hdHRpbmc7CkBAIC03Nyw2ICs4MSw4IEBACiAKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZExpbmVVc2FnZTsKIAorCQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdGaWxlTm90Rm91bmRFcnJvclRyeUZ1bGxQYXRoOworCiAJCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ0ZpbGVSZWFkaW5nRXJyb3I7CiAKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0UHJvYmxlbTsKQEAgLTkyLDcgKzk4LDcgQEAKIAkJLyoqCiAJCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZwogCQkgKiB2YWx1ZXMuCi0JCSAqIAorCQkgKgogCQkgKiBAcGFyYW0gbWVzc2FnZQogCQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCiAJCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwpAQCAtMTA0LDcgKzExMCw3IEBACiAJCS8qKgogCQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcKIAkJICogdmFsdWVzLgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIG1lc3NhZ2UKIAkJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAogCQkgKiBAcGFyYW0gYmluZGluZwpAQCAtMTIwLDcgKzEyNiw3IEBACiAJCS8qKgogCQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcKIAkJICogdmFsdWVzLgotCQkgKiAKKwkJICoKIAkJICogQHBhcmFtIG1lc3NhZ2UKIAkJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAogCQkgKiBAcGFyYW0gYmluZGluZzEKQEAgLTEzOCw3ICsxNDQsNyBAQAogCQkvKioKIAkJICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nCiAJCSAqIHZhbHVlcy4KLQkJICogCisJCSAqCiAJCSAqIEBwYXJhbSBtZXNzYWdlCiAJCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKIAkJICogQHBhcmFtIGJpbmRpbmdzCkBAIC0xNjgsNyArMTc0LDcgQEAKIAogCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CiAKLQkvKiogCisJLyoqCiAJICogRGlzcGxheSB0aGUgY29tbWFuZCBsaW5lIHVzYWdlIG1lc3NhZ2UuCiAJICovCiAJcHJpdmF0ZSB2b2lkIGRpc3BsYXlIZWxwKCkgewpAQCAtMjE0LDcgKzIyMCw3IEBACiAJCQlTdHJpbmcgY29udGVudHMgPSBuZXcgU3RyaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KGZpbGUsIG51bGwpKTsKIAkJCS8vIGZvcm1hdCB0aGUgZmlsZSAodGhlIG1lYXQgYW5kIHBvdGF0b2VzKQogCQkJZG9jLnNldChjb250ZW50cyk7Ci0JCQlUZXh0RWRpdCBlZGl0ID0gY29kZUZvcm1hdHRlci5mb3JtYXQoQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQsIGNvbnRlbnRzLCAwLCBjb250ZW50cy5sZW5ndGgoKSwgMCwgbnVsbCk7CisJCQlUZXh0RWRpdCBlZGl0ID0gY29kZUZvcm1hdHRlci5mb3JtYXQoQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQgfCBDb2RlRm9ybWF0dGVyLkZfSU5DTFVERV9DT01NRU5UUywgY29udGVudHMsIDAsIGNvbnRlbnRzLmxlbmd0aCgpLCAwLCBudWxsKTsKIAkJCWlmIChlZGl0ICE9IG51bGwpIHsKIAkJCQllZGl0LmFwcGx5KGRvYyk7CiAJCQl9IGVsc2UgewpAQCAtMjU2LDExICsyNjIsMTEgQEAKIAogCQlmaW5hbCBpbnQgREVGQVVMVF9NT0RFID0gMDsKIAkJZmluYWwgaW50IENPTkZJR19NT0RFID0gMTsKLQkJCisKIAkJaW50IG1vZGUgPSBERUZBVUxUX01PREU7CiAJCWZpbmFsIGludCBJTklUSUFMX1NJWkUgPSAxOwogCQlpbnQgZmlsZUNvdW50ZXIgPSAwOwotCQkKKwogCQlGaWxlW10gZmlsZXNUb0Zvcm1hdCA9IG5ldyBGaWxlW0lOSVRJQUxfU0laRV07CiAKIAkJbG9vcDogd2hpbGUgKGluZGV4IDwgYXJnQ291bnQpIHsKQEAgLTI3Myw3ICsyNzksNyBAQAogCQkJCQl9CiAJCQkJCWlmIChBUkdfSEVMUC5lcXVhbHMoY3VycmVudEFyZykpIHsKIAkJCQkJCWRpc3BsYXlIZWxwKCk7Ci0JCQkJCQlyZXR1cm4gbnVsbDsJCQkJCisJCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQkJfQogCQkJCQlpZiAoQVJHX1ZFUkJPU0UuZXF1YWxzKGN1cnJlbnRBcmcpKSB7CiAJCQkJCQl0aGlzLnZlcmJvc2UgPSB0cnVlOwpAQCAtMjk1LDcgKzMwMSwxNiBAQAogCQkJCQkJfQogCQkJCQkJZmlsZXNUb0Zvcm1hdFtmaWxlQ291bnRlcisrXSA9IGZpbGU7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlkaXNwbGF5SGVscChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLkNvbW1hbmRMaW5lRXJyb3JGaWxlLCBjdXJyZW50QXJnKSk7CisJCQkJCQlTdHJpbmcgY2Fub25pY2FsUGF0aDsKKwkJCQkJCXRyeSB7CisJCQkJCQkJY2Fub25pY2FsUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlMikgeworCQkJCQkJCWNhbm9uaWNhbFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworCQkJCQkJfQorCQkJCQkJU3RyaW5nIGVycm9yTXNnID0gZmlsZS5pc0Fic29sdXRlKCk/CisJCQkJCQkJCQkJICBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLkNvbW1hbmRMaW5lRXJyb3JGaWxlLCBjYW5vbmljYWxQYXRoKToKKwkJCQkJCQkJCQkgIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuQ29tbWFuZExpbmVFcnJvckZpbGVUcnlGdWxsUGF0aCwgY2Fub25pY2FsUGF0aCk7CisJCQkJCQlkaXNwbGF5SGVscChlcnJvck1zZyk7CiAJCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQkJfQogCQkJCQlicmVhazsKQEAgLTMwOCwxMiArMzIzLDEyIEBACiAJCQkJCX0KIAkJCQkJbW9kZSA9IERFRkFVTFRfTU9ERTsKIAkJCQkJY29udGludWUgbG9vcDsKLQkJCX0JCQkKKwkJCX0KIAkJfQogCiAJCWlmIChtb2RlID09IENPTkZJR19NT0RFIHx8IHRoaXMub3B0aW9ucyA9PSBudWxsKSB7CiAJCQlkaXNwbGF5SGVscChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLkNvbW1hbmRMaW5lRXJyb3JOb0NvbmZpZ0ZpbGUpKTsKLQkJCXJldHVybiBudWxsOwkJCQorCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJaWYgKHRoaXMucXVpZXQgJiYgdGhpcy52ZXJib3NlKSB7CiAJCQlkaXNwbGF5SGVscCgKQEAgLTMzNSwxNyArMzUwLDM1IEBACiAKIAkvKioKIAkgKiBSZXR1cm4gYSBKYXZhIFByb3BlcnRpZXMgZmlsZSByZXByZXNlbnRpbmcgdGhlIG9wdGlvbnMgdGhhdCBhcmUgaW4gdGhlCi0JICogc3BlY2lmaWVkIGNvbmZpZyBmaWxlLgorCSAqIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUuCiAJICovCiAJcHJpdmF0ZSBQcm9wZXJ0aWVzIHJlYWRDb25maWcoU3RyaW5nIGZpbGVuYW1lKSB7CiAJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKwkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwogCQl0cnkgewotCQkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlbmFtZSkpKTsKKwkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oY29uZmlnRmlsZSkpOwogCQkJZmluYWwgUHJvcGVydGllcyBmb3JtYXR0ZXJPcHRpb25zID0gbmV3IFByb3BlcnRpZXMoKTsKIAkJCWZvcm1hdHRlck9wdGlvbnMubG9hZChzdHJlYW0pOwogCQkJcmV0dXJuIGZvcm1hdHRlck9wdGlvbnM7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVV0aWwubG9nKGUsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuQ29uZmlnRmlsZVJlYWRpbmdFcnJvcikpOworCQkJU3RyaW5nIGNhbm9uaWNhbFBhdGggPSBudWxsOworCQkJdHJ5IHsKKwkJCQljYW5vbmljYWxQYXRoID0gY29uZmlnRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUyKSB7CisJCQkJY2Fub25pY2FsUGF0aCA9IGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQl9CisJCQlTdHJpbmcgZXJyb3JNZXNzYWdlOworCQkJaWYgKCFjb25maWdGaWxlLmV4aXN0cygpICYmICFjb25maWdGaWxlLmlzQWJzb2x1dGUoKSkgeworCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuQ29uZmlnRmlsZU5vdEZvdW5kRXJyb3JUcnlGdWxsUGF0aCwgbmV3IE9iamVjdFtdIHsKKwkJCQkJY2Fub25pY2FsUGF0aCwKKwkJCQkJU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpIC8vJE5PTi1OTFMtMSQKKwkJCQl9KTsKKworCQkJfSBlbHNlIHsKKwkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ0ZpbGVSZWFkaW5nRXJyb3IsIGNhbm9uaWNhbFBhdGgpOworCQkJfQorCQkJVXRpbC5sb2coZSwgZXJyb3JNZXNzYWdlKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJvck1lc3NhZ2UpOwogCQl9IGZpbmFsbHkgewogCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKQEAgLTM4Myw3ICs0MTYsNyBAQAogCQkJCWZvcm1hdERpclRyZWUoZmlsZSwgY29kZUZvcm1hdHRlcik7CiAJCQl9IGVsc2UgaWYgKFV0aWwuaXNKYXZhTGlrZUZpbGVOYW1lKGZpbGUuZ2V0UGF0aCgpKSkgewogCQkJCWZvcm1hdEZpbGUoZmlsZSwgY29kZUZvcm1hdHRlcik7Ci0JCQl9CQkJCisJCQl9CiAJCX0KIAkJaWYgKCF0aGlzLnF1aWV0KSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuYmluZChNZXNzYWdlcy5Db21tYW5kTGluZURvbmUpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuamF2YQppbmRleCA1OWZiYmQ5Li4xNjk0YjQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0RlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5qYXZhCkBAIC0xLDEyICsxLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICAqCiAgKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSUJNIENvcnBvcmF0aW9uICAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJyb2NrIEphbmljemFrICAgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxNTA3NDEKKyAqICAgICBSYXkgVi4gKHZvaWRzdGFyQGdtYWlsLmNvbSkgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAyODI5ODgKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXI7CiAKQEAgLTE5LDExICsyMSwxMCBAQAogCiAvKioKICAqIENvbnN0YW50cyB1c2VkIHRvIHNldCB1cCB0aGUgb3B0aW9ucyBvZiB0aGUgY29kZSBmb3JtYXR0ZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CiAgKgogICogQHNpbmNlIDMuMAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMgewogCkBAIC00OSw3ICs1MCw3IEBACiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gYWxpZ24gdHlwZSBtZW1iZXJzIG9mIGEgdHlwZSBkZWNsYXJhdGlvbiBvbiBjb2x1bW4KQEAgLTYyLDcgKzYzLDcgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0FMSUdOX1RZUEVfTUVNQkVSU19PTl9DT0xVTU5TID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnMiOwkgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gZm9yIGFsaWdubWVudCBvZiBhcmd1bWVudHMgaW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCkBAIC04Nyw2ICs4OCwxNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0FSR1VNRU5UU19JTl9FTlVNX0NPTlNUQU5UID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCI7CSAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gZm9yIGFsaWdubWVudCBvZiBhcmd1bWVudHMgaW4gYW5ub3RhdGlvbgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb24iCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHZhbHVlcyByZXR1cm5lZCBieSA8Y29kZT5jcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCk8L2NvZGU+IGNhbGwKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgY3JlYXRlQWxpZ25tZW50VmFsdWUoZmFsc2UsIFdSQVBfTk9fU1BMSVQsIElOREVOVF9ERUZBVUxUKQorCSAqIDwvcHJlPgorCSAqIEBzZWUgI2NyZWF0ZUFsaWdubWVudFZhbHVlKGJvb2xlYW4sIGludCwgaW50KQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9BUkdVTUVOVFNfSU5fQU5OT1RBVElPTiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb24iOwkgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIGZvciBhbGlnbm1lbnQgb2YgYXJndW1lbnRzIGluIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwKIAkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCkBAIC0xMjMsNyArMTM1LDcgQEAKIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gZm9yIGFsaWdubWVudCBvZiBhc3NpZ25tZW50CiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50IgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCi0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIGNyZWF0ZUFsaWdubWVudFZhbHVlKGZhbHNlLCBNX05PX0FMSUdOTUVOVCwgSU5ERU5UX0RFRkFVTFQpCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIGNyZWF0ZUFsaWdubWVudFZhbHVlKGZhbHNlLCBXUkFQX05PX1NQTElULCBJTkRFTlRfREVGQVVMVCkKIAkgKiA8L3ByZT4KIAkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKIAkgKiBAc2luY2UgMy4yCkBAIC0xODYsNiArMTk4LDE3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfRVhQUkVTU0lPTlNfSU5fQVJSQVlfSU5JVElBTElaRVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyIjsJIC8vJE5PTi1OTFMtMSQKIAkvKioKIAkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiBmb3IgYWxpZ25tZW50IG9mIG1ldGhvZCBkZWNsYXJhdGlvbgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIGNyZWF0ZUFsaWdubWVudFZhbHVlKGZhbHNlLCBXUkFQX05PX1NQTElULCBJTkRFTlRfREVGQVVMVCkKKwkgKiA8L3ByZT4KKwkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKKwkgKiBAc2luY2UgMy42CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfTUVUSE9EX0RFQ0xBUkFUSU9OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb24iOwkgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIGZvciBhbGlnbm1lbnQgb2YgbXVsdGlwbGUgZmllbGRzCiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHMiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHZhbHVlcyByZXR1cm5lZCBieSA8Y29kZT5jcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCk8L2NvZGU+IGNhbGwKQEAgLTE5NCw3ICsyMTcsNyBAQAogCSAqIEBzZWUgI2NyZWF0ZUFsaWdubWVudFZhbHVlKGJvb2xlYW4sIGludCwgaW50KQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9NVUxUSVBMRV9GSUVMRFMgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyI7Ly8kTk9OLU5MUy0xJAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9NVUxUSVBMRV9GSUVMRFMgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyI7Ly8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIGZvciBhbGlnbm1lbnQgb2YgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgpAQCAtMjE5LDYgKzI0MiwxNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1BBUkFNRVRFUlNfSU5fTUVUSE9EX0RFQ0xBUkFUSU9OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbiI7CSAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gZm9yIGFsaWdubWVudCBvZiByZXNvdXJjZXMgaW4gYSB0cnkgd2l0aCByZXNvdXJjZXMgc3RhdGVtZW50CisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIGNyZWF0ZUFsaWdubWVudFZhbHVlKGZhbHNlLCBXUkFQX05FWFRfUEVSX0xJTkUsIElOREVOVF9ERUZBVUxUKQorCSAqIDwvcHJlPgorCSAqIEBzZWUgI2NyZWF0ZUFsaWdubWVudFZhbHVlKGJvb2xlYW4sIGludCwgaW50KQorCSAqIEBzaW5jZSAzLjcuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1JFU09VUkNFU19JTl9UUlkgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnkiOwkgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIGZvciBhbGlnbm1lbnQgb2Ygc2VsZWN0b3IgaW4gbWV0aG9kIGludm9jYXRpb24KIAkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCkBAIC0yODMsNyArMzE3LDE3IEBACiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1RIUk9XU19DTEFVU0VfSU5fTUVUSE9EX0RFQ0xBUkFUSU9OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiI7CSAvLyROT04tTkxTLTEkCi0KKwkvKioKKwkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiBmb3IgYWxpZ25tZW50IG9mIGV4Y2VwdGlvbnMgZGVjbGFyZWQgaW4gYSBVbmlvbiBUeXBlIGluIHRoZSBhcmd1bWVudCBvZiBhIG11bHRpY2F0Y2ggc3RhdGVtZW50CisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2giCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHZhbHVlcyByZXR1cm5lZCBieSA8Y29kZT5jcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCk8L2NvZGU+IGNhbGwKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgY3JlYXRlQWxpZ25tZW50VmFsdWUoZmFsc2UsIFdSQVBfQ09NUEFDVCwgSU5ERU5UX0RFRkFVTFQpCisJICogPC9wcmU+CisJICogQHNlZSAjY3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfVU5JT05fVFlQRV9JTl9NVUxUSUNBVENIID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2giOwkgLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGFkZCBibGFuayBsaW5lcyBhZnRlciB0aGUgaW1wb3J0cyBkZWNsYXJhdGlvbgpAQCAtNTc0LDkgKzYxOCw5IEBACiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2luY2UgMy4xCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjRk9STUFUVEVSX0NPTU1FTlRfQ0xFQVJfQkxBTktfTElORVNfSU5fQkxPQ0tfQ09NTUVOVH0gYW5kIHtAbGluayAjRk9STUFUVEVSX0NPTU1FTlRfQ0xFQVJfQkxBTktfTElORVNfSU5fSkFWQURPQ19DT01NRU5UfQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9DTEVBUl9CTEFOS19MSU5FUyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcyI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGNvbnRyb2wgd2hldGhlciBibGFuayBsaW5lcyBhcmUgY2xlYXJlZCBpbnNpZGUgamF2YWRvYyBjb21tZW50cwpAQCAtNTg3LDcgKzYzMSw3IEBACiAJICogQHNlZSAjVFJVRQogCSAqIEBzZWUgI0ZBTFNFCiAJICogQHNpbmNlIDMuMwotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9DTEVBUl9CTEFOS19MSU5FU19JTl9KQVZBRE9DX0NPTU1FTlQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCkBAIC02MDAsNyArNjQ0LDcgQEAKIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2luY2UgMy4zCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0NMRUFSX0JMQU5LX0xJTkVTX0lOX0JMT0NLX0NPTU1FTlQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNjE1LDcgKzY1OSw3IEBACiAJICogQHNpbmNlIDMuMQogCSAqIEBkZXByZWNhdGVkIFVzZSBtdWx0aXBsZSBzZXR0aW5ncyBmb3IgZWFjaCBraW5kIG9mIGNvbW1lbnRzLiBTZWUge0BsaW5rICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfQkxPQ0tfQ09NTUVOVH0sCiAJICoge0BsaW5rICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfSkFWQURPQ19DT01NRU5UfSBhbmQge0BsaW5rICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UfS4KLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNjI4LDggKzY3MiwzOSBAQAogCSAqIEBzZWUgI1RSVUUKIAkgKiBAc2VlICNGQUxTRQogCSAqIEBzaW5jZSAzLjMKLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0xJTkVfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBmb3JtYXQgbGluZSBjb21tZW50cyB0aGF0IHN0YXJ0IG9uIHRoZSBmaXJzdCBjb2x1bW4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfbGluZV9jb21tZW50X3N0YXJ0aW5nX29uX2ZpcnN0X2NvbHVtbiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKwkgKiA8L3ByZT4KKwkgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBlaXRoZXIgdGhlCisJICoge0BsaW5rICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UfSBvcHRpb24gaGFzIGJlZW4gc2V0IHRvCisJICoge0BsaW5rICNGQUxTRX0gb3IgdGhlIGZvcm1hdHRlciBpcyBjcmVhdGVkIHdpdGggdGhlIG1vZGUKKwkgKiB7QGxpbmsgVG9vbEZhY3RvcnkjTV9GT1JNQVRfTkVXfS4KKwkgKiAKKwkgKiBAc2VlICNUUlVFCisJICogQHNlZSAjRkFMU0UKKwkgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoTWFwLCBpbnQpCisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9MSU5FX0NPTU1FTlRfU1RBUlRJTkdfT05fRklSU1RfQ09MVU1OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW4iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgdGhlIHdoaXRlIHNwYWNlIGJldHdlZW4gY29kZSBhbmQgbGluZSBjb21tZW50cyBzaG91bGQgYmUgcHJlc2VydmVkIG9yIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgc3BhY2UKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIEZBTFNFCisJICogPC9wcmU+CisJICogQHNlZSAjVFJVRQorCSAqIEBzZWUgI0ZBTFNFCisJICogQHNpbmNlIDMuNworCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX1BSRVNFUlZFX1dISVRFX1NQQUNFX0JFVFdFRU5fQ09ERV9BTkRfTElORV9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIDxwcmU+CkBAIC02NDEsNyArNzE2LDcgQEAKIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2luY2UgMy4zCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9CTE9DS19DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNjU0LDcgKzcyOSw3IEBACiAJICogQHNlZSAjVFJVRQogCSAqIEBzZWUgI0ZBTFNFCiAJICogQHNpbmNlIDMuMwotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfSkFWQURPQ19DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCkBAIC02NjcsNyArNzQyLDcgQEAKIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2luY2UgMy4xCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9IRUFERVIgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlciI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNjgwLDcgKzc1NSw3IEBACiAJICogQHNlZSAjVFJVRQogCSAqIEBzZWUgI0ZBTFNFCiAJICogQHNpbmNlIDMuMQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfSFRNTCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNjkzLDkgKzc2OCw5IEBACiAJICogQHNlZSAjVFJVRQogCSAqIEBzZWUgI0ZBTFNFCiAJICogQHNpbmNlIDMuMQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfU09VUkNFID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZSI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGNvbnRyb2wgd2hldGhlciBkZXNjcmlwdGlvbiBvZiBKYXZhZG9jIHBhcmFtZXRlcnMgYXJlIGluZGVudGVkCkBAIC03MDYsNyArNzgxLDcgQEAKIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2luY2UgMy4xCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0lOREVOVF9QQVJBTUVURVJfREVTQ1JJUFRJT04gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtNzE5LDcgKzc5NCw3IEBACiAJICogQHNlZSAjVFJVRQogCSAqIEBzZWUgI0ZBTFNFCiAJICogQHNpbmNlIDMuMQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9JTkRFTlRfUk9PVF9UQUdTID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3MiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKQEAgLTczMiw3ICs4MDcsNyBAQAogCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCiAJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCiAJICogQHNpbmNlIDMuMQotCSAqLwkKKwkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9JTlNFUlRfRU1QVFlfTElORV9CRUZPUkVfUk9PVF9UQUdTID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCkBAIC03NDUsNyArODIwLDcgQEAKIAkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAogCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAogCSAqIEBzaW5jZSAzLjEKLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUVEVSX0NPTU1FTlRfSU5TRVJUX05FV19MSU5FX0ZPUl9QQVJBTUVURVIgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKQEAgLTc1NiwxMSArODMxLDM3IEBACiAJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICI4MCIKIAkgKiA8L3ByZT4KIAkgKiBAc2luY2UgMy4xCi0JICovCQorCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX0xJTkVfTEVOR1RIID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gY29udHJvbCB3aGV0aGVyIGJsb2NrIGNvbW1lbnRzIHdpbGwgaGF2ZSBuZXcgbGluZXMgYXQgYm91bmRhcmllcworCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCisJICogPC9wcmU+CisJICogQHNlZSAjVFJVRQorCSAqIEBzZWUgI0ZBTFNFCisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVFRFUl9DT01NRU5UX05FV19MSU5FU19BVF9CTE9DS19CT1VOREFSSUVTID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gY29udHJvbCB3aGV0aGVyIGphdmFkb2MgY29tbWVudHMgd2lsbCBoYXZlIG5ldyBsaW5lcyBhdCBib3VuZGFyaWVzCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgVFJVRQorCSAqIDwvcHJlPgorCSAqIEBzZWUgI1RSVUUKKwkgKiBAc2VlICNGQUxTRQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRURVJfQ09NTUVOVF9ORVdfTElORVNfQVRfSkFWQURPQ19CT1VOREFSSUVTID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiA8cHJlPgogCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBjb21wYWN0IGVsc2UvaWYKIAkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQpAQCAtNzk0LDYgKzg5NSwyNzMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQ09OVElOVUFUSU9OX0lOREVOVEFUSU9OX0ZPUl9BUlJBWV9JTklUSUFMSVpFUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIiOwkvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gdXNlIHRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIHRhZ3MgZGVmaW5lZCByZXNwZWN0aXZlbHkgYnkgdGhlIHtAbGluayAjRk9STUFUVEVSX0RJU0FCTElOR19UQUd9IGFuZCB0aGUge0BsaW5rICNGT1JNQVRURVJfRU5BQkxJTkdfVEFHfSBvcHRpb25zLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgVFJVRSAvIEZBTFNFCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIEZBTFNFCisJICogPC9wcmU+CisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9VU0VfT05fT0ZGX1RBR1MgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3MiOwkvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gZGVmaW5lIHRoZSB0YWcgdG8gcHV0IGluIGEgY29tbWVudCB0byBkaXNhYmxlIHRoZSBmb3JtYXR0aW5nLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWciCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIFN0cmluZywgd2l0aCBjb25zdHJhaW50cyBtZW50aW9uZWQgYmVsb3cKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIkBmb3JtYXR0ZXI6b2ZmIgorCSAqIAorCSAqIFNlZSB0aGUge0BsaW5rICNGT1JNQVRURVJfRU5BQkxJTkdfVEFHfSBvcHRpb24gdG8gcmUtZW5hYmxlIGl0LgorCSAqIDwvcHJlPgorCSAqIAorCSAqIDxwPgorCSAqIE5vdGUgdGhhdDoKKwkgKiA8b2w+CisJICogPGxpPlRoaXMgdGFnIGlzIHVzZWQgYnkgdGhlIGZvcm1hdHRlciBvbmx5IGlmIHRoZSAKKwkgKiB7QGxpbmsgI0ZPUk1BVFRFUl9VU0VfT05fT0ZGX1RBR1N9IG9wdGlvbiBpcyBzZXQgdG8ge0BsaW5rICNUUlVFfS48L2xpPgorCSAqIDxsaT5UaGUgdGFnIG5hbWUgd2lsbCBiZSB0cmltbWVkLiBIZW5jZSBpZiBpdCBkb2VzIGNvbnRhaW4gd2hpdGUgc3BhY2VzCisJICogYXQgdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kLCB0aGV5IHdpbGwgbm90IGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZQorCSAqIHNlYXJjaGluZyBmb3IgdGhlIHRhZyBpbiB0aGUgY29tbWVudHM8L2xpPgorCSAqIDxsaT5JZiBhIHRhZyBpcyBzdGFydGluZyB3aXRoIGEgbGV0dGVyIG9yIGRpZ2l0LCB0aGVuIGl0IGNhbm5vdCBiZSBsZWFkZWQgYnkKKwkgKiBhbm90aGVyIGxldHRlciBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkCisJICogKDxjb2RlPiJUb0Rpc2FibGVGb3JtYXR0ZXIiPC9jb2RlPiB3aWxsIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgZGlzYWJsaW5nIHRhZworCSAqIDxjb2RlPiJEaXNhYmxlRm9ybWF0dGVyIjwvY29kZT4sIGJ1dCA8Y29kZT4iVG86RGlzYWJsZUZvcm1hdHRlciI8L2NvZGU+CisJICogd2lsbCBiZSBkZXRlY3RlZCBmb3IgZWl0aGVyIHRhZyA8Y29kZT4iRGlzYWJsZUZvcm1hdHRlciI8L2NvZGU+IG9yCisJICogPGNvZGU+IjpEaXNhYmxlRm9ybWF0dGVyIjwvY29kZT4pLjxicj4KKwkgKiBSZXNwZWN0aXZlbHksIGEgdGFnIGVuZGluZyB3aXRoIGEgbGV0dGVyIG9yIGRpZ2l0IGNhbm5vdCBiZSBmb2xsb3dlZCBieSBhIGxldHRlcgorCSAqIG9yIGRpZ2l0IHRvIGJlIHJlY29nbml6ZWQgKDxjb2RlPiJEaXNhYmxlRm9ybWF0dGVyMSI8L2NvZGU+IHdpbGwgbm90IGJlCisJICogcmVjb2duaXplZCBhcyBhIGRpc2FibGluZyB0YWcgPGNvZGU+IkRpc2FibGVGb3JtYXR0ZXIiPC9jb2RlPiwgYnV0CisJICogPGNvZGU+IkRpc2FibGVGb3JtYXR0ZXI6MSI8L2NvZGU+IHdpbGwgYmUgZGV0ZWN0ZWQgZWl0aGVyIGZvciB0YWcKKwkgKiA8Y29kZT4iRGlzYWJsZUZvcm1hdHRlciI8L2NvZGU+IG9yIDxjb2RlPiJEaXNhYmxlRm9ybWF0dGVyOiI8L2NvZGU+KTwvbGk+CisJICogPGxpPkFzIHNvb24gYXMgdGhlIGZvcm1hdHRlciBlbmNvdW50ZXJzIHRoZSBkZWZpbmVkIGRpc2FibGluZyB0YWcsIGl0IHN0b3BzIHRvCisJICogZm9ybWF0IHRoZSBjb2RlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tbWVudCBpbmNsdWRpbmcgdGhpcyB0YWcuIElmIGl0CisJICogd2FzIGFscmVhZHkgZGlzYWJsZWQsIHRoZSB0YWcgaGFzIG5vIHNwZWNpYWwgZWZmZWN0LgorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlLCB0aGUgc2Vjb25kIGRlZmF1bHQgZW5hYmxpbmcgdGFnICZxdW90OzxiPkBmb3JtYXR0ZXI6b2ZmPC9iPiZxdW90OworCSAqIGluIHRoZSBmb2xsb3dpbmcgc25pcHBldCBpcyBub3QgbmVjZXNzYXJ5IGFzIHRoZSBmb3JtYXR0ZXIgd2FzIGFscmVhZHkgZGlzYWJsZWQKKwkgKiBzaW5jZSB0aGUgZmlyc3Qgb25lOgorCSAqIDxwcmU+CisJICogY2xhc3MgWCB7CisJICogLy8gQGZvcm1hdHRlcjpvZmYKKwkgKiB2b2lkIGZvbzEoKSB7fQorCSAqIC8vIEBmb3JtYXR0ZXI6b2ZmCisJICogdm9pZCBmb28yKCkge30KKwkgKiB2b2lkIGJhcjEoKSB7fQorCSAqIHZvaWQgYmFyMigpIHt9CisJICogfQorCSAqIDwvcHJlPjwvcD4KKwkgKiA8L2xpPgorCSAqIDxsaT5JZiBubyBlbmFibGluZyB0YWcgaXMgZm91bmQgYnkgdGhlIGZvcm1hdHRlciBhZnRlciB0aGUgZGlzYWJsaW5nIHRhZywgdGhlbgorCSAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQgd29uJ3QgYmUgZm9ybWF0dGVkLjxicj4KKwkgKiBGb3IgZXhhbXBsZSwgd2hlbiBhIGRpc2FibGluZyB0YWcgaXMgcHV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvZGUsIHRoZW4KKwkgKiB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBmb3JtYXR0ZWQ6CisJICogPHByZT4KKwkgKiAvLyBAZm9ybWF0dGVyOm9mZgorCSAqIGNsYXNzIFggeworCSAqIHZvaWQgZm9vMSgpIHt9CisJICogdm9pZCBmb28yKCkge30KKwkgKiB2b2lkIGJhcjEoKSB7fQorCSAqIHZvaWQgYmFyMigpIHt9CisJICogfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPklmIGEgbWl4IG9mIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgdGFncyBpcyBkb25lIGluIHRoZSBzYW1lIGNvbW1lbnQsIHRoZW4KKwkgKiB0aGUgZm9ybWF0dGVyIHdpbGwgb25seSB0YWtlIGludG8gYWNjb3VudCB0aGUgbGFzdCBlbmNvdW50ZXJlZCB0YWcgaW4gdGhlCisJICogY29tbWVudC4KKwkgKiA8cD5Gb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBzbmlwcGV0LCB0aGUgZm9ybWF0dGVyIHdpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIKKwkgKiB0aGUgY29tbWVudDo8L3A+CisJICogPHByZT4KKwkgKiBjbGFzcyBYIHsKKwkgKiAmIzQ3OyYjNDI7CisJICogJm5ic3A7JiM0MjsgVGhpcyBpcyBhIGNvbW1lbnQgd2l0aCBhIG1peCBvZiBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIHRhZ3M6CisJICogJm5ic3A7JiM0MjsgIC0gPGI+QGZvcm1hdHRlcjpvZmY8L2I+CisJICogJm5ic3A7JiM0MjsgIC0gPGI+QGZvcm1hdHRlcjpvbjwvYj4KKwkgKiAmbmJzcDsmIzQyOyAgLSA8Yj5AZm9ybWF0dGVyOm9mZjwvYj4KKwkgKiAmbmJzcDsmIzQyOyBUaGUgZm9ybWF0dGVyIHdpbGwgc3RvcCB0byBmb3JtYXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgY29tbWVudC4uLgorCSAqICZuYnNwOyYjNDI7JiM0NzsKKwkgKiB2b2lkIGZvbygpIHt9CisJICogdm9pZCBiYXIoKSB7fQorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT5UaGUgdGFnIGNhbm5vdCBpbmNsdWRlIG5ld2xpbmUgY2hhcmFjdGVyIChpLmUuICdcbicpIGJ1dCBpdCBjYW4gaGF2ZSB3aGl0ZQorCSAqIHNwYWNlcy48YnI+CisJICogRS5nLiAiPGI+Zm9ybWF0OiBvZmY8L2I+IiBpcyBhIHZhbGlkIGRpc2FibGluZyB0YWcuPGJyPgorCSAqIEluIHRoZSBmdXR1cmUsIG5ld2xpbmVzIG1heSBiZSB1c2VkIHRvIHN1cHBvcnQgbXVsdGlwbGUgZGlzYWJsaW5nIHRhZ3MuCisJICogPC9saT4KKwkgKiA8bGk+VGhlIHRhZyBjYW4gaW5jbHVkZSBsaW5lIG9yIGJsb2NrIGNvbW1lbnRzIHN0YXJ0L2VuZCB0b2tlbnMuCisJICogPHA+SWYgc3VjaCB0YWdzIGFyZSB1c2VkLCBlLmcuICI8Yj4vL0otPC9iPiIsIHRoZW4gdGhlIHNpbmdsZSBjb21tZW50IGNhbgorCSAqIGFsc28gc3RvcCB0aGUgZm9ybWF0dGluZyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6PC9wPgorCSAqIDxwcmU+CisJICogLy9KLQorCSAqIC8vIEZvcm1hdHRpbmcgd2FzIHN0b3BwZWQgZnJvbSBjb21tZW50IGFib3ZlLi4uCisJICogcHVibGljIGNsYXNzIFggeworCSAqIC8vSisKKwkgKiAvLyBGb3JtYXR0aW5nIGlzIHJlc3RhcnRlZCBmcm9tIGhlcmUuLi4KKwkgKiB2b2lkIGZvbygpIHt9CisJICogPC9wcmU+CisJICogPHA+QXMgYW55IGRpc2FibGluZyB0YWdzLCBhcyBzb29uIGFzIGEgY29tbWVudCBpbmNsdWRlcyBpdCwKKwkgKiB0aGUgZm9ybWF0dGluZyBzdG9wcyBmcm9tIHRoaXMgY29tbWVudDo8L3A+CisJICogPHByZT4KKwkgKiBwdWJsaWMgY2xhc3MgWCB7CisJICogLy8gTGluZSBjb21tZW50IGluY2x1ZGluZyB0aGUgZGlzYWJsaW5nIHRhZzogLy9KLQorCSAqIC8vIEZvcm1hdHRpbmcgd2FzIHN0b3BwZWQgZnJvbSBjb21tZW50IGFib3ZlLi4uCisJICogdm9pZCAgIGZvbzEoKSAgIHt9CisJICogLy9KKworCSAqIC8vIEZvcm1hdHRpbmcgcmVzdGFydHMgZnJvbSBoZXJlLi4uCisJICogdm9pZCAgIGJhcjEoKSAgIHt9CisJICogJiM0NzsmIzQyOworCSAqICZuYnNwOyYjNDI7IEJsb2NrIGNvbW1lbnQgaW5jbHVkaW5nIHRoZSBkaXNhYmxpbmcgdGFnOiAvL0orCisJICogJm5ic3A7JiM0MjsgVGhlIGZvcm1hdHRlciBzdG9wcyBmcm9tIHRoaXMgY29tbWVudC4uLgorCSAqICZuYnNwOyYjNDI7JiM0NzsKKwkgKiB2b2lkICAgZm9vMigpICAge30KKwkgKiAvL0orCisJICogLy8gRm9ybWF0dGluZyByZXN0YXJ0cyBmcm9tIGhlcmUuLi4KKwkgKiB2b2lkICAgYmFyMigpICAge30KKwkgKiAmIzQ3OyYjNDI7JiM0MjsKKwkgKiAmbmJzcDsmIzQyOyBKYXZhZG9jIGNvbW1lbnQgaW5jbHVkaW5nIHRoZSBlbmFibGluZyB0YWc6IC8vSisKKwkgKiAmbmJzcDsmIzQyOyBUaGUgZm9ybWF0dGVyIHN0b3BzIGZyb20gdGhpcyBjb21tZW50Li4uCisJICogJm5ic3A7JiM0MjsmIzQ3OworCSAqIHZvaWQgICBmb28zKCkgICB7fQorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogPC9wPgorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfRElTQUJMSU5HX1RBRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmRpc2FibGluZ190YWciOwkvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gZGVmaW5lIHRoZSB0YWcgdG8gcHV0IGluIGEgY29tbWVudCB0byByZS1lbmFibGUgdGhlIGZvcm1hdHRpbmcgYWZ0ZXIgaXQgaGFzIGJlZW4gZGlzYWJsZWQgKHNlZSB7QGxpbmsgI0ZPUk1BVFRFUl9ESVNBQkxJTkdfVEFHfSkKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWciCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIFN0cmluZywgd2l0aCBjb25zdHJhaW50cyBtZW50aW9uZWQgYmVsb3cKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIkBmb3JtYXR0ZXI6b24iCisJICogPC9wcmU+CisJICogCisJICogPHA+CisJICogTm90ZSB0aGF0OgorCSAqIDxvbD4KKwkgKiA8bGk+VGhpcyB0YWcgaXMgdXNlZCBieSB0aGUgZm9ybWF0dGVyIG9ubHkgaWYgdGhlIAorCSAqIHtAbGluayAjRk9STUFUVEVSX1VTRV9PTl9PRkZfVEFHU30gb3B0aW9uIGlzIHNldCB0byB7QGxpbmsgI1RSVUV9LjwvbGk+CisJICogPGxpPlRoZSB0YWcgbmFtZSB3aWxsIGJlIHRyaW1tZWQuIEhlbmNlIGlmIGl0IGRvZXMgY29udGFpbiB3aGl0ZSBzcGFjZXMKKwkgKiBhdCB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQsIHRoZXkgd2lsbCBub3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoaWxlCisJICogc2VhcmNoaW5nIGZvciB0aGUgdGFnIGluIHRoZSBjb21tZW50czwvbGk+CisJICogPGxpPklmIGEgdGFnIGlzIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQsIHRoZW4gaXQgY2Fubm90IGJlIGxlYWRlZCBieQorCSAqIGFub3RoZXIgbGV0dGVyIG9yIGRpZ2l0IHRvIGJlIHJlY29nbml6ZWQKKwkgKiAoPGNvZGU+IlJlRW5hYmxlRm9ybWF0dGVyIjwvY29kZT4gd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcyBhbiBlbmFibGluZyB0YWcKKwkgKiA8Y29kZT4iRW5hYmxlRm9ybWF0dGVyIjwvY29kZT4sIGJ1dCA8Y29kZT4iUmU6RW5hYmxlRm9ybWF0dGVyIjwvY29kZT4KKwkgKiB3aWxsIGJlIGRldGVjdGVkIGZvciBlaXRoZXIgdGFnIDxjb2RlPiJFbmFibGVGb3JtYXR0ZXIiPC9jb2RlPiBvcgorCSAqIDxjb2RlPiI6RW5hYmxlRm9ybWF0dGVyIjwvY29kZT4pLjxicj4KKwkgKiBSZXNwZWN0aXZlbHksIGEgdGFnIGVuZGluZyB3aXRoIGEgbGV0dGVyIG9yIGRpZ2l0IGNhbm5vdCBiZSBmb2xsb3dlZCBieSBhIGxldHRlcgorCSAqIG9yIGRpZ2l0IHRvIGJlIHJlY29nbml6ZWQgKDxjb2RlPiJFbmFibGVGb3JtYXR0ZXIxIjwvY29kZT4gd2lsbCBub3QgYmUKKwkgKiByZWNvZ25pemVkIGFzIGFuIGVuYWJsaW5nIHRhZyA8Y29kZT4iRW5hYmxlRm9ybWF0dGVyIjwvY29kZT4sIGJ1dAorCSAqIDxjb2RlPiJFbmFibGVGb3JtYXR0ZXI6MSI8L2NvZGU+IHdpbGwgYmUgZGV0ZWN0ZWQgZWl0aGVyIGZvciB0YWcKKwkgKiA8Y29kZT4iRW5hYmxlRm9ybWF0dGVyIjwvY29kZT4gb3IgPGNvZGU+IkVuYWJsZUZvcm1hdHRlcjoiPC9jb2RlPik8L2xpPgorCSAqIDxsaT5BcyBzb29uIGFzIHRoZSBmb3JtYXR0ZXIgZW5jb3VudGVycyB0aGUgZGVmaW5lZCBlbmFibGluZyB0YWcsIGl0IHJlLXN0YXJ0cworCSAqIHRvIGZvcm1hdCB0aGUgY29kZSBqdXN0IGFmdGVyIHRoZSBjb21tZW50IGluY2x1ZGluZyB0aGlzIHRhZy4gSWYgaXQgd2FzIGFscmVhZHkKKwkgKiBhY3RpdmUsIGkuZS4gYWxyZWFkeSByZS1lbmFibGVkIG9yIG5ldmVyIGRpc2FibGVkLCB0aGUgdGFnIGhhcyBubyBzcGVjaWFsIGVmZmVjdC4KKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgZW5hYmxpbmcgdGFnICZxdW90OzxiPkBmb3JtYXR0ZXI6b248L2I+JnF1b3Q7CisJICogaW4gdGhlIGZvbGxvd2luZyBzbmlwcGV0IGlzIG5vdCBuZWNlc3NhcnkgYXMgdGhlIGZvcm1hdHRlciBoYXMgbmV2ZXIgYmVlbgorCSAqIGRpc2FibGVkOgorCSAqIDxwcmU+CisJICogY2xhc3MgWCB7CisJICogdm9pZCBmb28xKCkge30KKwkgKiB2b2lkIGZvbzIoKSB7fQorCSAqIC8vIEBmb3JtYXR0ZXI6b24KKwkgKiB2b2lkIGJhcjEoKSB7fQorCSAqIHZvaWQgYmFyMigpIHt9CisJICogfQorCSAqIDwvcHJlPgorCSAqIE9yLCBpbiB0aGUgZm9sbG93aW5nIG90aGVyIHNuaXBwZXQsIHRoZSBzZWNvbmQgZW5hYmxpbmcgdGFnIGlzIG5vdCBuZWNlc3NhcnkgYXMKKwkgKiB0aGUgZm9ybWF0dGluZyB3aWxsIGhhdmUgYmVlbiByZS1lbmFibGVkIGJ5IHRoZSBmaXJzdCBvbmU6CisJICogPHByZT4KKwkgKiBjbGFzcyBYIHsKKwkgKiAvLyBAZm9ybWF0dGVyOm9mZgorCSAqIHZvaWQgZm9vMSgpIHt9CisJICogdm9pZCBmb28yKCkge30KKwkgKiAvLyBAZm9ybWF0dGVyOm9uCisJICogdm9pZCBiYXIxKCkge30KKwkgKiAvLyBAZm9ybWF0dGVyOm9uCisJICogdm9pZCBiYXIyKCkge30KKwkgKiB9CisJICogPC9wcmU+PC9wPgorCSAqIDwvbGk+CisJICogPGxpPklmIGEgbWl4IG9mIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgdGFncyBpcyBkb25lIGluIHRoZSBzYW1lIGNvbW1lbnQsIHRoZW4KKwkgKiB0aGUgZm9ybWF0dGVyIHdpbGwgb25seSB0YWtlIGludG8gYWNjb3VudCB0aGUgbGFzdCBlbmNvdW50ZXJlZCB0YWcgaW4gdGhlCisJICogY29tbWVudC4KKwkgKiA8cD5Gb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBzbmlwcGV0LCB0aGUgZm9ybWF0dGVyIHdpbGwgYmUgcmUtZW5hYmxlZCBhZnRlcgorCSAqIHRoZSBjb21tZW50OjwvcD4KKwkgKiA8cHJlPgorCSAqIC8vIEBmb3JtYXR0ZXI6b2ZmCisJICogY2xhc3MgWCB7CisJICogJiM0NzsmIzQyOworCSAqICZuYnNwOyYjNDI7IFRoaXMgaXMgYSBjb21tZW50IHdpdGggYSBtaXggb2YgZGlzYWJsaW5nIGFuZCBlbmFibGluZyB0YWdzOgorCSAqICZuYnNwOyYjNDI7ICAtIDxiPkBmb3JtYXR0ZXI6b248L2I+CisJICogJm5ic3A7JiM0MjsgIC0gPGI+QGZvcm1hdHRlcjpvZmY8L2I+CisJICogJm5ic3A7JiM0MjsgIC0gPGI+QGZvcm1hdHRlcjpvbjwvYj4KKwkgKiAmbmJzcDsmIzQyOyBUaGUgZm9ybWF0dGVyIHdpbGwgcmVzdGFydCB0byBmb3JtYXQgYWZ0ZXIgdGhpcyBjb21tZW50Li4uCisJICogJm5ic3A7JiM0MjsmIzQ3OworCSAqIHZvaWQgZm9vKCkge30KKwkgKiB2b2lkIGJhcigpIHt9CisJICogfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPlRoZSB0YWcgY2Fubm90IGluY2x1ZGUgbmV3bGluZSBjaGFyYWN0ZXIgKGkuZS4gJ1xuJykgYnV0IGl0IGNhbiBoYXZlIHdoaXRlCisJICogc3BhY2VzLjxicj4KKwkgKiBFLmcuICI8Yj5mb3JtYXQ6IG9uPC9iPiIgaXMgYSB2YWxpZCBlbmFibGluZyB0YWc8YnI+CisJICogSW4gdGhlIGZ1dHVyZSwgbmV3bGluZXMgbWF5IGJlIHVzZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBlbmFibGluZyB0YWdzLgorCSAqIDwvbGk+CisJICogPGxpPlRoZSB0YWcgY2FuIGluY2x1ZGUgbGluZSBvciBibG9jayBjb21tZW50cyBzdGFydC9lbmQgdG9rZW5zLiBKYXZhZG9jCisJICogdG9rZW5zIGFyZSBub3QgY29uc2lkZXJlZCBhcyB2YWxpZCB0YWdzLgorCSAqIDxwPklmIHN1Y2ggdGFncyBhcmUgdXNlZCwgZS5nLiAiPGI+Ly9KKzwvYj4iLCB0aGVuIHRoZSBzaW5nbGUgY29tbWVudCBjYW4KKwkgKiBhbHNvIHN0YXJ0IHRoZSBmb3JtYXR0aW5nIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgc25pcHBldDo8L3A+CisJICogPHByZT4KKwkgKiAvL0otCisJICogLy8gRm9ybWF0dGluZyB3YXMgc3RvcHBlZCBmcm9tIGNvbW1lbnQgYWJvdmUuLi4KKwkgKiBwdWJsaWMgY2xhc3MgWCB7CisJICogLy9KKworCSAqIC8vIEZvcm1hdHRpbmcgcmVzdGFydHMgZnJvbSBoZXJlLi4uCisJICogdm9pZCBmb28oKSB7fQorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiA8cD5BcyBhbnkgZW5hYmxpbmcgdGFncywgYXMgc29vbiBhcyBhIGNvbW1lbnQgaW5jbHVkZXMgaXQsCisJICogdGhlIGZvcm1hdHRpbmcgcmVzdGFydHMganVzdCBhZnRlciB0aGUgY29tbWVudDo8L3A+CisJICogPHByZT4KKwkgKiBwdWJsaWMgY2xhc3MgWCB7CisJICogLy9KLQorCSAqIC8vIEZvcm1hdHRpbmcgd2FzIHN0b3BwZWQgZnJvbSBjb21tZW50IGFib3ZlLi4uCisJICogdm9pZCAgIGZvbzEoKSAgIHt9CisJICogLy8gTGluZSBjb21tZW50IGluY2x1ZGluZyB0aGUgZW5hYmxpbmcgdGFnOiAvL0orCisJICogLy8gRm9ybWF0dGluZyByZXN0YXJ0cyBmcm9tIGhlcmUuLi4KKwkgKiB2b2lkICAgYmFyMSgpICAge30KKwkgKiAvL0otCisJICogLy8gRm9ybWF0dGluZyB3YXMgc3RvcHBlZCBmcm9tIGNvbW1lbnQgYWJvdmUuLi4KKwkgKiB2b2lkICAgZm9vMigpICAge30KKwkgKiAmIzQ3OyYjNDI7CisJICogJm5ic3A7JiM0MjsgQmxvY2sgY29tbWVudCBpbmNsdWRpbmcgdGhlIGVuYWJsaW5nIHRhZzogLy9KKworCSAqICZuYnNwOyYjNDI7IFRoZSBmb3JtYXR0ZXIgcmVzdGFydHMgYWZ0ZXIgdGhpcyBjb21tZW50Li4uCisJICogJm5ic3A7JiM0MjsmIzQ3OworCSAqIC8vIEZvcm1hdHRpbmcgcmVzdGFydHMgZnJvbSBoZXJlLi4uCisJICogdm9pZCAgIGJhcjIoKSAgIHt9CisJICogLy9KLQorCSAqIC8vIEZvcm1hdHRpbmcgd2FzIHN0b3BwZWQgZnJvbSBjb21tZW50IGFib3ZlLi4uCisJICogdm9pZCAgIGZvbzMoKSAgIHt9CisJICogJiM0NzsmIzQyOyYjNDI7CisJICogJm5ic3A7JiM0MjsgSmF2YWRvYyBjb21tZW50IGluY2x1ZGluZyB0aGUgZW5hYmxpbmcgdGFnOiAvL0orCisJICogJm5ic3A7JiM0MjsgVGhlIGZvcm1hdHRlciByZXN0YXJ0cyBhZnRlciB0aGlzIGNvbW1lbnQuLi4KKwkgKiAmbmJzcDsmIzQyOyYjNDc7CisJICogdm9pZCAgIGJhcjMoKSAgIHt9CisJICogfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiA8L3A+CisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9FTkFCTElOR19UQUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5lbmFibGluZ190YWciOwkvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5kZW50IGJvZHkgZGVjbGFyYXRpb25zIGNvbXBhcmUgdG8gaXRzIGVuY2xvc2luZyBhbm5vdGF0aW9uIGRlY2xhcmF0aW9uIGhlYWRlcgogCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KQEAgLTg2Myw3ICsxMjMxLDcgQEAKIAkgKiBAc2VlICNGQUxTRQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5ERU5UX0VNUFRZX0xJTkVTID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzIjsgLy8kTk9OLU5MUy0xJAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5ERU5UX0VNUFRZX0xJTkVTID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzIjsgLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluZGVudCBzdGF0ZW1lbnRzIGluc2lkZSBhIGJsb2NrCkBAIC05MTUsNyArMTI4Myw3IEBACiAKIAkvKioKIAkgKiA8cHJlPgotCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBzcGVjaWZ5IHRoZSBlcXVpdmFsZW50IG51bWJlciBvZiBzcGFjZXMgdGhhdCByZXByZXNlbnRzIG9uZSBpbmRlbnRhdGlvbiAKKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gc3BlY2lmeSB0aGUgZXF1aXZhbGVudCBudW1iZXIgb2Ygc3BhY2VzIHRoYXQgcmVwcmVzZW50cyBvbmUgaW5kZW50YXRpb24KIAkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICAiJmx0O24mZ3Q7Iiwgd2hlcmUgbiBpcyB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlcgogCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiNCIKQEAgLTkzNywxMSArMTMwNSwxMjYgQEAKIAkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAogCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAogCSAqIEBzaW5jZSAzLjEKKwkgKiBAZGVwcmVjYXRlZAorCSAqIEFsbCBuZXcgb3B0aW9ucyBtdXN0IGJlIGVuYWJsZWQgdG8gYWN0aXZhdGUgb2xkIHN0cmF0ZWd5CisJICoge0BsaW5rICNGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTUVNQkVSfQorCSAqIHtAbGluayAjRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX0xPQ0FMX1ZBUklBQkxFfQorCSAqIHtAbGluayAjRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX1BBUkFNRVRFUn0KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT04gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbiI7Ly8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5zZXJ0IGEgbmV3IGxpbmUgYWZ0ZXIgYW4gYW5ub3RhdGlvbiBvbiBhIG1lbWJlciAocGFja2FnZSwgY2xhc3MsIG1ldGhvZCwgZmllbGQgZGVjbGFyYXRpb24pCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIElOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNAorCSAqIEBkZXByZWNhdGVkCisJICogQWxsIG5ldyBvcHRpb25zIG11c3QgYmUgZW5hYmxlZCB0byBhY3RpdmF0ZSBvbGQgc3RyYXRlZ3kKKwkgKiB7QGxpbmsgI0ZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9GSUVMRH0KKwkgKiB7QGxpbmsgI0ZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9NRVRIT0R9CisJICoge0BsaW5rICNGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fUEFDS0FHRX0KKwkgKiB7QGxpbmsgI0ZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9UWVBFfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9NRU1CRVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXIiOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSBmaWVsZCBkZWNsYXJhdGlvbgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIElOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9GSUVMRCA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkIjsvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgbWV0aG9kIGRlY2xhcmF0aW9uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIElOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9NRVRIT0QgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2QiOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSBwYWNrYWdlIGRlY2xhcmF0aW9uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZSIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKKwkgKiA8L3ByZT4KKwkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAorCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fUEFDS0FHRSA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UiOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSB0eXBlIGRlY2xhcmF0aW9uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZSIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKKwkgKiA8L3ByZT4KKwkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAorCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fVFlQRSA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUiOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSBwYXJhbWV0ZXIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRE9fTk9UX0lOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9QQVJBTUVURVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIiOy8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGFuIGFubm90YXRpb24gb24gYSBsb2NhbCB2YXJpYWJsZQorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIElOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9MT0NBTF9WQVJJQUJMRSA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlIjsvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhIGxhYmVsCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIERPX05PVF9JTlNFUlQKKwkgKiA8L3ByZT4KKwkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAorCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0xBQkVMID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsIjsJLy8kTk9OLU5MUy0xJAkKKworCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNlIGluIGFuIGFycmF5IGluaXRpYWxpemVyCiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KQEAgLTE3MzUsNiArMjIxOCwxOCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfT1BFTklOR19QQVJFTl9JTl9TWU5DSFJPTklaRUQgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5zZXJ0IGEgc3BhY2UgYWZ0ZXIgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgaW4gYSB0cnkgd2l0aCByZXNvdXJjZXMgc3RhdGVtZW50CisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIERPX05PVF9JTlNFUlQKKwkgKiA8L3ByZT4KKwkgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAorCSAqIEBzZWUgSmF2YUNvcmUjRE9fTk9UX0lOU0VSVAorCSAqIEBzaW5jZSAzLjcuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfT1BFTklOR19QQVJFTl9JTl9UUlkgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnkiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5zZXJ0IGEgc3BhY2UgYWZ0ZXIgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgaW4gYSB3aGlsZSBzdGF0ZW1lbnQKIAkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZSIKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQpAQCAtMTgwNyw2ICsyMzAyLDE5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9TRU1JQ09MT05fSU5fRk9SID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3IiOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5zZXJ0IGEgc3BhY2UgYWZ0ZXIgc2VtaWNvbG9ucyBmb2xsb3dpbmcgZWFjaCByZXNvdXJjZSBkZWNsYXJhdGlvbiBpbiBhIHRyeSB3aXRoIAorCSAqIHJlc291cmNlcyBzdGF0ZW1lbnQKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgSU5TRVJUCisJICogPC9wcmU+CisJICogQHNlZSBKYXZhQ29yZSNJTlNFUlQKKwkgKiBAc2VlIEphdmFDb3JlI0RPX05PVF9JTlNFUlQKKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX1NFTUlDT0xPTl9JTl9UUllfUkVTT1VSQ0VTID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIHNwYWNlIGFmdGVyIGFuIHVuYXJ5IG9wZXJhdG9yCiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CkBAIC0yMDgzLDYgKzI1OTEsMTggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9DTE9TSU5HX1BBUkVOX0lOX1NZTkNIUk9OSVpFRCA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiOwkvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5zZXJ0IGEgc3BhY2UgYmVmb3JlIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIGluIGEgdHJ5IHdpdGggcmVzb3VyY2VzIHN0YXRlbWVudAorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnkiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRE9fTk9UX0lOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ0xPU0lOR19QQVJFTl9JTl9UUlkgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5IjsJLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyBpbiBhIHdoaWxlIHN0YXRlbWVudAogCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQpAQCAtMjc0Myw2ICszMjYzLDE4IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9TWU5DSFJPTklaRUQgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkIjsJLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyBpbiBhIHRyeSB3aXRoIHJlc291cmNlcyBzdGF0ZW1lbnQKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIElOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9UUlkgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5IjsJLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyBpbiBhIHdoaWxlIHN0YXRlbWVudAogCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZSIKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQpAQCAtMjc2MCw3ICszMjkyLDcgQEAKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQogCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKIAkgKiA8L3ByZT4KLQkgKiAKKwkgKgogCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCiAJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCiAJICogQHNpbmNlIDMuMgpAQCAtMjc3Myw3ICszMzA1LDcgQEAKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQogCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKIAkgKiA8L3ByZT4KLQkgKiAKKwkgKgogCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCiAJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCiAJICogQHNpbmNlIDMuMwpAQCAtMjg1Myw2ICszMzg1LDE5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfU0VNSUNPTE9OX0lOX0ZPUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciI7CS8vJE5PTi1OTFMtMSQKIAkvKioKIAkgKiA8cHJlPgorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBzcGFjZSBiZWZvcmUgc2VtaWNvbG9ucyBmb2xsb3dpbmcgZWFjaCByZXNvdXJjZSBkZWNsYXJhdGlvbiBpbiBhIHRyeSB3aXRoCisJICogcmVzb3VyY2VzIHN0YXRlbWVudAorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRE9fTk9UX0lOU0VSVAorCSAqIDwvcHJlPgorCSAqIEBzZWUgSmF2YUNvcmUjSU5TRVJUCisJICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfU0VNSUNPTE9OX0lOX1RSWV9SRVNPVVJDRVMgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzIjsJLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluc2VydCBhIHNwYWNlIGJlZm9yZSB1bmFyeSBvcGVyYXRvcgogCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3IiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KQEAgLTMwNDQsNyArMzU4OSw3IEBACiAJICogQHNlZSBUb29sRmFjdG9yeSNjcmVhdGVDb2RlRm9ybWF0dGVyKE1hcCwgaW50KQogCSAqIEBzaW5jZSAzLjMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVWRVJfSU5ERU5UX0JMT0NLX0NPTU1FTlRTX09OX0ZJUlNUX0NPTFVNTiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW4iOyAvLyROT04tTkxTLTEkCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfQkxPQ0tfQ09NTUVOVFNfT05fRklSU1RfQ09MVU1OID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKIAkgKiA8cHJlPgogCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbmRlbnQgbGluZSBjb21tZW50cyB0aGF0IHN0YXJ0IG9uIHRoZSBmaXJzdCBjb2x1bW4KQEAgLTMwNTIsMTMgKzM1OTcsMTggQEAKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CiAJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIEZBTFNFCiAJICogPC9wcmU+Ci0JICogTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgdGhlIGZvcm1hdHRlciBpcyBjcmVhdGVkIHdpdGggdGhlIG1vZGUge0BsaW5rIFRvb2xGYWN0b3J5I01fRk9STUFUX05FV30uCisJICogTm90ZSB0aGF0OgorCSAqIDx1bD4KKwkgKiA8bGk+dGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgZm9ybWF0dGVyIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbW9kZSB7QGxpbmsgVG9vbEZhY3RvcnkjTV9GT1JNQVRfTkVXfTwvbGk+CisJICogPGxpPmV2ZW4gd2l0aCB0aGlzIG9wdGlvbiBhY3RpdmF0ZWQsIHRoZSBmb3JtYXR0ZXIgc3RpbGwgY2FuIGlnbm9yZSBsaW5lIGNvbW1lbnRzIHN0YXJ0aW5nIGF0IGZpcnN0IGNvbHVtbgorCSAqIGlmIHRoZSBvcHRpb24ge0BsaW5rICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UX1NUQVJUSU5HX09OX0ZJUlNUX0NPTFVNTn0gaXMgc2V0IHRvIHtAdmFsdWUgI0ZBTFNFfTwvbGk+CisJICogPC91bD4KIAkgKiBAc2VlICNUUlVFCiAJICogQHNlZSAjRkFMU0UKIAkgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoTWFwLCBpbnQpCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfTElORV9DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iOyAvLyROT04tTkxTLTEkCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfTElORV9DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGVtcHR5IGxpbmVzIHRvIHByZXNlcnZlCkBAIC0zMDcxLDYgKzM2MjEsNTkgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTlVNQkVSX09GX0VNUFRZX0xJTkVTX1RPX1BSRVNFUlZFID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlIjsJLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgZm9ybWF0dGVyIGNhbiBqb2luIHdyYXBwZWQgbGluZXMgb3Igbm90CisJICogCisJICogCQlGb3IgZXhhbXBsZSwgdGhlIHdyYXBwZWQgbGluZXMgb2YgbWV0aG9kIGZvbyByZXR1cm4gc3RhdGVtZW50IGluIGZvbGxvd2luZyB0ZXN0IGNhc2U6CisJICogCQkJY2xhc3MgWCB7CisJICogCQkJU3RyaW5nIGZvbygpIHsKKwkgKiAJCQlyZXR1cm4gInNlbGVjdCB4ICIKKwkgKiAJCQkgICAgICAgKyAiZnJvbSB5ICIKKwkgKiAJCQkgICAgICAgKyAid2hlcmUgej1hIjsKKwkgKiAJCQl9CisJICogCQkJfQorCSAqCisJICogCQl3aWxsIGJlIHByZXNlcnZlZCBieSB0aGUgZm9ybWF0dGVyIHdoZW4gdGhlIG5ldyBwcmVmZXJlbmNlIGlzIHVzZWQKKwkgKiAJCWV2ZW4gaWYgdGhlIG1heGltdW0gbGluZSB3aWR0aCB3b3VsZCBnaXZlIGl0IGVub3VnaCBzcGFjZSB0byBqb2luIHRoZSBsaW5lcy4KKwkgKiAJCUhlbmNlIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorCSAqIAkJCWNsYXNzIFggeworCSAqIAkJCSAgICBTdHJpbmcgZm9vKCkgeworCSAqIAkJCSAgICAgICAgcmV0dXJuICJzZWxlY3QgeCAiCisJICogCQkJICAgICAgICAgICAgICAgICsgImZyb20geSAiCisJICogCQkJICAgICAgICAgICAgICAgICsgIndoZXJlIHo9YSI7CisJICogCQkJICAgIH0KKwkgKiAJCQl9CisJICoKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX3dyYXBwZWRfbGluZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCisJICogPC9wcmU+CisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9KT0lOX1dSQVBQRURfTElORVMgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5qb2luX3dyYXBwZWRfbGluZXMiOwkvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBmb3JtYXR0ZXIgY2FuIGpvaW4gdGV4dCBsaW5lcyBpbiBjb21tZW50cyBvciBub3QKKwkgKiAKKwkgKiAJCUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CisJICogCQkJLyoqCisJICogCQkJICogVGhlIGZvbyBtZXRob2QuCisJICogCQkJICogZm9vIGlzIGEgc3Vic3RpdHV0ZSBmb3IgYmFyLgorCSAqIAkJCSAqJiMwMDQ3OworCSAqIAkJCXB1YmxpYyBjbGFzcyBYIHsKKwkgKiAJCQl9CisJICogCisJICogCQl3aWxsIGJlIHVuY2hhbmdlZCBieSB0aGUgZm9ybWF0dGVyIHdoZW4gdGhpcyBuZXcgcHJlZmVyZW5jZSBpcyB1c2VkLAorCSAqIAkJZXZlbiBpZiB0aGUgbWF4aW11bSBsaW5lIHdpZHRoIHdvdWxkIGdpdmUgaXQgZW5vdWdoIHNwYWNlIHRvIGpvaW4gdGhlIGxpbmVzLgorCSAqCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKwkgKiA8L3ByZT4KKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0pPSU5fTElORVNfSU5fQ09NTUVOVFMgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5qb2luX2xpbmVzX2luX2NvbW1lbnRzIjsJLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIDxwcmU+CiAJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgZW1wdHkgc3RhdGVtZW50IHNob3VsZCBiZSBvbiBhIG5ldyBsaW5lCiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZSIKIAkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CkBAIC0zMDg5LDcgKzM2OTIsNyBAQAogCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUQUIKIAkgKiA8L3ByZT4KIAkgKiBNb3JlIHZhbHVlcyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiAKKwkgKgogCSAqIEBzZWUgSmF2YUNvcmUjVEFCCiAJICogQHNlZSBKYXZhQ29yZSNTUEFDRQogCSAqIEBzZWUgI01JWEVECkBAIC0zMDk4LDcgKzM3MDEsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9UQUJfQ0hBUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhciI7IC8vJE5PTi1OTFMtMSQKIAkvKioKIAkgKiA8cHJlPgotCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBzcGVjaWZ5IHRoZSBlcXVpdmFsZW50IG51bWJlciBvZiBzcGFjZXMgdGhhdCByZXByZXNlbnRzIG9uZSB0YWJ1bGF0aW9uIAorCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBzcGVjaWZ5IHRoZSBlcXVpdmFsZW50IG51bWJlciBvZiBzcGFjZXMgdGhhdCByZXByZXNlbnRzIG9uZSB0YWJ1bGF0aW9uCiAJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICAiJmx0O24mZ3Q7Iiwgd2hlcmUgbiBpcyB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlcgogCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiNCIKQEAgLTMxMDksNyArMzcxMiw3IEBACiAKIAkvKioKIAkgKiA8cHJlPgotCSAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byB1c2UgdGFidWxhdGlvbnMgb25seSBmb3IgbGVhZGluZyBpbmRlbnRhdGlvbnMgCisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIHVzZSB0YWJ1bGF0aW9ucyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgbGluZSB3cmFwcGluZwogCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KIAkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRkFMU0UKQEAgLTMxMzQsMTIgKzM3MzcsNzAgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfV1JBUF9CRUZPUkVfQklOQVJZX09QRVJBVE9SID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIDxwcmU+CisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIHdyYXAgYmVmb3JlIHRoZSAnfCcgb3BlcmF0b3IgaW4gbXVsdGktY2F0Y2ggc3RhdGVtZW50cworCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2giCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCisJICogPC9wcmU+CisJICogVGhpcyBvcHRpb24gaXMgdXNlZCBvbmx5IGlmIHRoZSBvcHRpb24ge0BsaW5rICNGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9VTklPTl9UWVBFX0lOX01VTFRJQ0FUQ0h9IGlzIHNldC4KKwkgKiBAc2VlICNUUlVFCisJICogQHNlZSAjRkFMU0UKKwkgKiBAc2luY2UgMy43LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfV1JBUF9CRUZPUkVfT1JfT1BFUkFUT1JfTVVMVElDQVRDSCA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2giOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gd3JhcCBvdXRlciBleHByZXNzaW9ucyBpbiBuZXN0ZWQgZXhwcmVzc2lvbnMKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgVFJVRQorCSAqIDwvcHJlPgorCSAqIDxwPgorCSAqIFRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIGZvcm1hdHRlciBiZWhhdmlvciB3aGVuIG5lc3RlZCBtZXRob2QgY2FsbHMgYXJlIGVuY291bnRlcmVkLgorCSAqIFNpbmNlIDMuNiwgdGhlIGZvcm1hdHRlciB0cmllcyB0byB3cmFwIG91dGVybW9zdCBtZXRob2QgY2FsbHMgZmlyc3QgdG8gaGF2ZSBhIGJldHRlciBvdXRwdXQuPC9wPgorCSAqIDxwPkZvciBleGFtcGxlLCBsZXQncyBzYXkgd2UgYXJlIHVzaW5nIHRoZSBFY2xpcHNlIGJ1aWx0LWluIHByb2ZpbGUgd2l0aCBhIG1heCBsaW5lIHdpZHRoPTQwK3NwYWNlIGZvciB0YWIgcG9saWN5LgorCSAqIFRoZW4gY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzbmlwcGV0OjwvcD4KKwkgKiA8cHJlPgorCSAqIHB1YmxpYyBjbGFzcyBYMDEgeworCSAqICAgICB2b2lkIHRlc3QoKSB7CisJICogICAgICAgICBmb28oYmFyKDEsIDIsIDMsIDQpLCBiYXIoNSwgNiwgNywgOCkpOworCSAqICAgICB9CisJICogfQorCSAqIDwvcHJlPgorCSAqIDxwPldpdGggdGhpcyBuZXcgc3RyYXRlZ3ksIHRoZSBmb3JtYXR0ZXIgd2lsbCB3cmFwIHRoZSBsaW5lIGVhcmxpZXIsIGJldHdlZW4gdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWVzc2FnZSBjYWxsCisJICogZm9yIHRoaXMgZXhhbXBsZSwgYW5kIHRoZW4gaXQgd2lsbCBhbGxvdyB0byBrZWVwIGVhY2ggbmVzdGVkIGNhbGwgb24gYSBzaW5nbGUgbGluZS48L3A+CisJICogPHA+SGVuY2UsIHRoZSBvdXRwdXQgd2lsbCBiZTo8L3A+CisJICogPHByZT4KKwkgKiBwdWJsaWMgY2xhc3MgWDAxIHsKKwkgKiAgICAgdm9pZCB0ZXN0KCkgeworCSAqICAgICAgICAgZm9vKGJhcigxLCAyLCAzLCA0KSwKKwkgKiAgICAgICAgICAgICBiYXIoNSwgNiwgNywgOCkpOworCSAqICAgICB9CisJICogfQorCSAqIDwvcHJlPgorCSAqIDxwPgorCSAqIDwvcD4KKwkgKiA8cD48Yj48dT5JbXBvcnRhbnQgbm90ZXM8L3U+PC9iPjo8L3A+CisJICogPG9sPgorCSAqIDxsaT5UaGlzIG5ldyBiZWhhdmlvciBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCAoaS5lLiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcmVmZXJlbmNlIGlzIHtAbGluayAjVFJVRX0pLgorCSAqIElmIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlZ2FyZGluZyBwcmV2aW91cyB2ZXJzaW9ucycgZm9ybWF0dGVyIGJlaGF2aW9yIChpLmUuIGJlZm9yZSAzLjYgdmVyc2lvbikgaXMgbmVjZXNzYXJ5LAorCSAqIHRoZW4gdGhlIHByZWZlcmVuY2UgbmVlZHMgdG8gYmUgc2V0IHRvIHtAbGluayAjRkFMU0V9IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBmb3JtYXR0ZXIgYmVoYXZpb3IuPC9saT4KKwkgKiA8bGk+VGhlIG5ldyBzdHJhdGVneSBjdXJyZW50bHkgb25seSBhcHBsaWVzIHRvIG5lc3RlZCBtZXRob2QgY2FsbHMsIGJ1dCBtaWdodCBiZSBleHRlbmRlZCB0byBvdGhlciBuZXN0ZWQgZXhwcmVzc2lvbnMgaW4gZnV0dXJlIHZlcnNpb25zPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBzZWUgI1RSVUUKKwkgKiBAc2VlICNGQUxTRQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfV1JBUF9PVVRFUl9FWFBSRVNTSU9OU19XSEVOX05FU1RFRCA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogPHByZT4KIAkgKiBGT1JNQVRURVIgLyBUaGUgd3JhcHBpbmcgaXMgZG9uZSBieSBpbmRlbnRpbmcgYnkgb25lIGNvbXBhcmUgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24uCiAJICogPC9wcmU+CiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVOVF9CWV9PTkU9IDI7Ci0JCisKIAkvKioKIAkgKiA8cHJlPgogCSAqIEZPUk1BVFRFUiAvIFRoZSB3cmFwcGluZyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBjdXJyZW50IGluZGVudGF0aW9uLgpAQCAtMzE1NCw3ICszODE1LDcgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERU5UX09OX0NPTFVNTiA9IDE7Ci0JCisKIAkvKioKIAkgKiA8cHJlPgogCSAqIEZPUk1BVFRFUiAvIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgb3B0aW9uIEZPUk1BVFRFUl9UQUJfQ0hBUgpAQCAtMzI3MSwxNSArMzkzMiwxNSBAQAogCS8qKgogCSAqIENyZWF0ZSBhIG5ldyBhbGlnbm1lbnQgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB2YWx1ZXMuIFRoaXMgbXVzdCBiZSB1c2VkIHRvIHNldCB1cAogCSAqIHRoZSBhbGlnbm1lbnQgb3B0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmb3JjZVNwbGl0IHRoZSBnaXZlbiBmb3JjZSB2YWx1ZQogCSAqIEBwYXJhbSB3cmFwU3R5bGUgdGhlIGdpdmVuIHdyYXBwaW5nIHN0eWxlCiAJICogQHBhcmFtIGluZGVudFN0eWxlIHRoZSBnaXZlbiBpbmRlbnQgc3R5bGUKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5ldyBhbGlnbmVtZW50IHZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiBmb3JjZVNwbGl0LCBpbnQgd3JhcFN0eWxlLCBpbnQgaW5kZW50U3R5bGUpIHsKLQkJaW50IGFsaWdubWVudFZhbHVlID0gMDsgCisJCWludCBhbGlnbm1lbnRWYWx1ZSA9IDA7CiAJCXN3aXRjaCh3cmFwU3R5bGUpIHsKIAkJCWNhc2UgV1JBUF9DT01QQUNUIDoKIAkJCQlhbGlnbm1lbnRWYWx1ZSB8PSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOwpAQCAtMzI5Niw3ICszOTU3LDcgQEAKIAkJCWNhc2UgV1JBUF9PTkVfUEVSX0xJTkUgOgogCQkJCWFsaWdubWVudFZhbHVlIHw9IEFsaWdubWVudC5NX09ORV9QRVJfTElORV9TUExJVDsKIAkJCQlicmVhazsKLQkJfQkJCisJCX0KIAkJaWYgKGZvcmNlU3BsaXQpIHsKIAkJCWFsaWdubWVudFZhbHVlIHw9IEFsaWdubWVudC5NX0ZPUkNFOwogCQl9CkBAIC0zMzEzLDcgKzM5NzQsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlciBzZXR0aW5ncyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZQogCSAqIHRoZSBkZWZhdWx0IGZvcm1hdHRlciBzZXR0aW5ncyBvZiBFY2xpcHNlIHZlcnNpb24gMi4xLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgRWNsaXBzZSAyLjEgc2V0dGluZ3MKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0zMzIzLDcgKzM5ODQsNyBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZGVmYXVsdCBFY2xpcHNlIGZvcm1hdHRlciBzZXR0aW5ncwotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgRWNsaXBzZSBkZWZhdWx0IHNldHRpbmdzCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMzM0MCw3ICs0MDAxLDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIGdpdmVuIGFsaWdubWVudCB2YWx1ZQogCSAqIEByZXR1cm4gdGhlIGZvcmNlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUKIAkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYWxpZ25tZW50IHZhbHVlIGlzIG51bGwsIG9yIGlmIGl0IAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUgaXMgbnVsbCwgb3IgaWYgaXQKIAkgKiBkb2Vzbid0IGhhdmUgYSB2YWxpZCBmb3JtYXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGdldEZvcmNlV3JhcHBpbmcoU3RyaW5nIHZhbHVlKSB7CkBAIC0zMzU0LDcgKzQwMTUsNyBAQAogCQkJdGhyb3cgV1JPTkdfQVJHVU1FTlQ7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiA8cD5SZXR1cm4gdGhlIGluZGVudGF0aW9uIHN0eWxlIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUuCiAJICogVGhlIGdpdmVuIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyB0aGUgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPgpAQCAtMzM2NCw3ICs0MDI1LDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIGdpdmVuIGFsaWdubWVudCB2YWx1ZQogCSAqIEByZXR1cm4gdGhlIGluZGVudGF0aW9uIHN0eWxlIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUKIAkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYWxpZ25tZW50IHZhbHVlIGlzIG51bGwsIG9yIGlmIGl0IAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUgaXMgbnVsbCwgb3IgaWYgaXQKIAkgKiBkb2Vzbid0IGhhdmUgYSB2YWxpZCBmb3JtYXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5kZW50U3R5bGUoU3RyaW5nIHZhbHVlKSB7CkBAIC0zMzg3LDcgKzQwNDgsNyBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBKYXZhIGNvbnZlbnRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBKYXZhIGNvbnZlbnRpb25zCiAJICogQHNpbmNlIDMuMAogCSAqLwpAQCAtMzQwMyw3ICs0MDY0LDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIGdpdmVuIGFsaWdubWVudCB2YWx1ZQogCSAqIEByZXR1cm4gdGhlIHdyYXBwaW5nIHN0eWxlIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUKIAkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYWxpZ25tZW50IHZhbHVlIGlzIG51bGwsIG9yIGlmIGl0IAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUgaXMgbnVsbCwgb3IgaWYgaXQKIAkgKiBkb2Vzbid0IGhhdmUgYSB2YWxpZCBmb3JtYXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgZ2V0V3JhcHBpbmdTdHlsZShTdHJpbmcgdmFsdWUpIHsKQEAgLTM0NDAsNyArNDEwMSw3IEBACiAJICogQHBhcmFtIGZvcmNlIHRoZSBnaXZlbiBmb3JjZSB2YWx1ZQogCSAqIEByZXR1cm4gdGhlIG5ldyBhbGlnbm1lbnQgdmFsdWUKIAkgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYWxpZ25tZW50IHZhbHVlIGlzIG51bGwsIG9yIGlmIGl0IAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUgaXMgbnVsbCwgb3IgaWYgaXQKIAkgKiBkb2Vzbid0IGhhdmUgYSB2YWxpZCBmb3JtYXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0Rm9yY2VXcmFwcGluZyhTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZm9yY2UpIHsKQEAgLTM0NTcsOSArNDExOCw5IEBACiAJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZXhpc3RpbmdWYWx1ZSk7CiAJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBXUk9OR19BUkdVTUVOVDsKLQkJfQkJCisJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiA8cD5TZXQgdGhlIGluZGVudGF0aW9uIHN0eWxlIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnQgdmFsdWUgYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgogCSAqIFRoZSBnaXZlbiB2YWx1ZSBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyB0aGUgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9JbmRlbnRNYW5pcHVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvSW5kZW50TWFuaXB1bGF0aW9uLmphdmEKaW5kZXggZGIwM2EzOC4uZGE1MTlhNyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9JbmRlbnRNYW5pcHVsYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL0luZGVudE1hbmlwdWxhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI2LDE5ICsyNiwyMCBAQAogCiAvKioKICAqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIFN0cmluZyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBpbmRlbnRhdGlvbnMuCi0gKiAKKyAqCiAgKiBAc2luY2UgMy4yCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEluZGVudE1hbmlwdWxhdGlvbiB7Ci0JCisKIAlwcml2YXRlIEluZGVudE1hbmlwdWxhdGlvbigpIHsKIAkJLy8gZG9uJ3QgaW5zdGFudGlhdGUKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYW4gaW5kZW50YXRpb24gY2hhcmFjdGVyLiBJbmRlbnRhdGlvbiBjaGFyYWN0ZXIgYXJlIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKIAkgKiBleGNlcHQgdGhlIGxpbmUgZGVsaW1pdGVyIGNoYXJhY3RlcnMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gY2ggdGhlIGdpdmVuIGNoYXJhY3RlcgogCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHRoZSBjaGFyYWN0ZXIgaXMgYSBpbmRlbnQgY2hhcmFjdGVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCkBAIC00OCw0NiArNDksNDcgQEAKIAogCS8qKgogCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGxpbmUgZGVsaW1pdGVyIGNoYXJhY3Rlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjaCB0aGUgZ2l2ZW4gY2hhcmFjdGVyCiAJICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdGhlIGNoYXJhY3RlciBpcyBhIGxpbmUgZGVsaW1pdGVyIGNoYXJhY3RlciwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpbmVEZWxpbWl0ZXJDaGFyKGNoYXIgY2gpIHsgCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGluZURlbGltaXRlckNoYXIoY2hhciBjaCkgewogCQlyZXR1cm4gY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInOwotCX0JCi0JCisJfQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGdpdmVuIGxpbmUgaW4gaW5kZW50YXRpb24gdW5pdHMuIE9kZCBzcGFjZXMgYXJlCiAJICogbm90IGNvdW50ZWQuIFRoaXMgbWV0aG9kIG9ubHkgYW5hbHl6ZXMgdGhlIGNvbnRlbnQgb2YgPGNvZGU+bGluZTwvY29kZT4gdXAgdG8gdGhlIGZpcnN0CiAJICogbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGxpbmUgdGhlIHN0cmluZyB0byBtZWFzdXJlIHRoZSBpbmRlbnQgb2YKIAkgKiBAcGFyYW0gdGFiV2lkdGggdGhlIHdpZHRoIG9mIG9uZSB0YWIgY2hhcmFjdGVyIGluIHNwYWNlIGVxdWl2YWxlbnRzCiAJICogQHBhcmFtIGluZGVudFdpZHRoIHRoZSB3aWR0aCBvZiBvbmUgaW5kZW50YXRpb24gdW5pdCBpbiBzcGFjZSBlcXVpdmFsZW50cwogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbmRlbnRhdGlvbiB1bml0cyB0aGF0IGxpbmUgaXMgaW5kZW50ZWQgYnkKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+Ci0JICogPGxpPnRoZSBnaXZlbiA8Y29kZT5pbmRlbnRXaWR0aDwvY29kZT4gaXMgbG93ZXIgb3IgZXF1YWxzIHRvIHplcm88L2xpPgorCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50V2lkdGg8L2NvZGU+IGlzIGxvd2VyIHRoYW4gemVybzwvbGk+CiAJICogPGxpPnRoZSBnaXZlbiA8Y29kZT50YWJXaWR0aDwvY29kZT4gaXMgbG93ZXIgdGhhbiB6ZXJvPC9saT4KIAkgKiA8bGk+dGhlIGdpdmVuIDxjb2RlPmxpbmU8L2NvZGU+IGlzIG51bGw8L2xpPgogCSAqIDwvdWw+CiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgbWVhc3VyZUluZGVudFVuaXRzKENoYXJTZXF1ZW5jZSBsaW5lLCBpbnQgdGFiV2lkdGgsIGludCBpbmRlbnRXaWR0aCkgewotCQlpZiAoaW5kZW50V2lkdGggPD0gMCB8fCB0YWJXaWR0aCA8IDAgfHwgbGluZSA9PSBudWxsKSB7CisJCWlmIChpbmRlbnRXaWR0aCA8IDAgfHwgdGFiV2lkdGggPCAwIHx8IGxpbmUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCisJCWlmIChpbmRlbnRXaWR0aCA9PSAwKSByZXR1cm4gMDsKIAkJaW50IHZpc3VhbExlbmd0aD0gbWVhc3VyZUluZGVudEluU3BhY2VzKGxpbmUsIHRhYldpZHRoKTsKIAkJcmV0dXJuIHZpc3VhbExlbmd0aCAvIGluZGVudFdpZHRoOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBnaXZlbiBsaW5lIGluIHNwYWNlIGVxdWl2YWxlbnRzLgotCSAqIAorCSAqCiAJICogPHA+VGFiIGNoYXJhY3RlcnMgYXJlIGNvdW50ZWQgdXNpbmcgdGhlIGdpdmVuIDxjb2RlPnRhYldpZHRoPC9jb2RlPiBhbmQgZXZlcnkgb3RoZXIgaW5kZW50CiAJICogY2hhcmFjdGVyIGFzIG9uZS4gVGhpcyBtZXRob2QgYW5hbHl6ZXMgdGhlIGNvbnRlbnQgb2YgPGNvZGU+bGluZTwvY29kZT4gdXAgdG8gdGhlIGZpcnN0CiAJICogbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLjwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBsaW5lIHRoZSBzdHJpbmcgdG8gbWVhc3VyZSB0aGUgaW5kZW50IG9mCiAJICogQHBhcmFtIHRhYldpZHRoIHRoZSB3aWR0aCBvZiBvbmUgdGFiIGluIHNwYWNlIGVxdWl2YWxlbnRzCiAJICogQHJldHVybiB0aGUgbWVhc3VyZWQgaW5kZW50IHdpZHRoIGluIHNwYWNlIGVxdWl2YWxlbnRzCkBAIC0xMDEsMTQgKzEwMywxMyBAQAogCQlpZiAodGFiV2lkdGggPCAwIHx8IGxpbmUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCiAJCWludCBsZW5ndGg9IDA7CiAJCWludCBtYXg9IGxpbmUubGVuZ3RoKCk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBtYXg7IGkrKykgewogCQkJY2hhciBjaD0gbGluZS5jaGFyQXQoaSk7CiAJCQlpZiAoY2ggPT0gJ1x0JykgewotCQkJCWludCByZW1pbmRlcj0gbGVuZ3RoICUgdGFiV2lkdGg7Ci0JCQkJbGVuZ3RoICs9IHRhYldpZHRoIC0gcmVtaW5kZXI7CisJCQkJbGVuZ3RoID0gY2FsY3VsYXRlU3BhY2VFcXVpdmFsZW50cyh0YWJXaWR0aCwgbGVuZ3RoKTsKIAkJCX0gZWxzZSBpZiAoaXNJbmRlbnRDaGFyKGNoKSkgewogCQkJCWxlbmd0aCsrOwogCQkJfSBlbHNlIHsKQEAgLTExNywzOCArMTE4LDM3IEBACiAJCX0KIAkJcmV0dXJuIGxlbmd0aDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsZWFkaW5nIGluZGVudGF0aW9uIHN0cmluZyBvZiB0aGUgZ2l2ZW4gbGluZS4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzdHJpbmcKIAkgKiBuZWVkIG5vdCBiZSBlcXVhbCB0byB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIGFzIG9kZCBzcGFjZXMgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCiAJICogaW5kZW50YXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBzY2FuCiAJICogQHBhcmFtIHRhYldpZHRoIHRoZSBzaXplIG9mIG9uZSB0YWIgaW4gc3BhY2UgZXF1aXZhbGVudHMKIAkgKiBAcGFyYW0gaW5kZW50V2lkdGggdGhlIHdpZHRoIG9mIG9uZSBpbmRlbnRhdGlvbiB1bml0IGluIHNwYWNlIGVxdWl2YWxlbnRzCiAJICogQHJldHVybiB0aGUgaW5kZW50IHBhcnQgb2YgPGNvZGU+bGluZTwvY29kZT4sIGJ1dCBubyBvZGQgc3BhY2VzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgotCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50V2lkdGg8L2NvZGU+IGlzIGxvd2VyIG9yIGVxdWFscyB0byB6ZXJvPC9saT4KKwkgKiA8bGk+dGhlIGdpdmVuIDxjb2RlPmluZGVudFdpZHRoPC9jb2RlPiBpcyBsb3dlciB0aGFuIHplcm88L2xpPgogCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+dGFiV2lkdGg8L2NvZGU+IGlzIGxvd2VyIHRoYW4gemVybzwvbGk+CiAJICogPGxpPnRoZSBnaXZlbiA8Y29kZT5saW5lPC9jb2RlPiBpcyBudWxsPC9saT4KIAkgKiA8L3VsPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RJbmRlbnRTdHJpbmcoU3RyaW5nIGxpbmUsIGludCB0YWJXaWR0aCwgaW50IGluZGVudFdpZHRoKSB7Ci0JCWlmICh0YWJXaWR0aCA8IDAgfHwgaW5kZW50V2lkdGggPD0gMCB8fCBsaW5lID09IG51bGwpIHsKKwkJaWYgKHRhYldpZHRoIDwgMCB8fCBpbmRlbnRXaWR0aCA8IDAgfHwgbGluZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJCi0JCWludCBzaXplPSBsaW5lLmxlbmd0aCgpOwotCQlpbnQgZW5kPSAwOwotCQkKLQkJaW50IHNwYWNlRXF1aXZzPSAwOwotCQlpbnQgY2hhcmFjdGVycz0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2hhciBjPSBsaW5lLmNoYXJBdChpKTsKKworCQlpbnQgc2l6ZSA9IGxpbmUubGVuZ3RoKCk7CisJCWludCBlbmQgPSAwOworCisJCWludCBzcGFjZUVxdWl2cyA9IDA7CisJCWludCBjaGFyYWN0ZXJzID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWNoYXIgYyA9IGxpbmUuY2hhckF0KGkpOwogCQkJaWYgKGMgPT0gJ1x0JykgewotCQkJCWludCByZW1haW5kZXI9IHNwYWNlRXF1aXZzICUgdGFiV2lkdGg7Ci0JCQkJc3BhY2VFcXVpdnMgKz0gdGFiV2lkdGggLSByZW1haW5kZXI7CisJCQkJc3BhY2VFcXVpdnMgPSBjYWxjdWxhdGVTcGFjZUVxdWl2YWxlbnRzKHRhYldpZHRoLCBzcGFjZUVxdWl2cyk7CiAJCQkJY2hhcmFjdGVycysrOwogCQkJfSBlbHNlIGlmIChpc0luZGVudENoYXIoYykpIHsKIAkJCQlzcGFjZUVxdWl2cysrOwpAQCAtMTU4LDggKzE1OCwxMiBAQAogCQkJfQogCQkJaWYgKHNwYWNlRXF1aXZzID49IGluZGVudFdpZHRoKSB7CiAJCQkJZW5kICs9IGNoYXJhY3RlcnM7Ci0JCQkJY2hhcmFjdGVycz0gMDsKLQkJCQlzcGFjZUVxdWl2cz0gc3BhY2VFcXVpdnMgJSBpbmRlbnRXaWR0aDsKKwkJCQljaGFyYWN0ZXJzID0gMDsKKwkJCQlpZihpbmRlbnRXaWR0aCA9PSAwKSB7CisJCQkJCXNwYWNlRXF1aXZzID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlzcGFjZUVxdWl2cyA9IHNwYWNlRXF1aXZzICUgaW5kZW50V2lkdGg7CisJCQkJfQogCQkJfQogCQl9CiAJCWlmIChlbmQgPT0gMCkgewpAQCAtMTcxLDExICsxNzUsMTEgQEAKIAkJfQogCX0KIAotCQorCiAJLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGluZGVudGF0aW9uIHVuaXRzIGZyb20gYSBnaXZlbiBsaW5lLiBJZiB0aGUgbGluZSAKLQkgKiBoYXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBpbmRlbnQsIGFsbCB0aGUgYXZhaWxhYmxlIGluZGVudGF0aW9uIGlzIHJlbW92ZWQuCi0JICogSWYgPGNvZGU+aW5kZW50c1RvUmVtb3ZlIDw9IDA8L2NvZGU+IHRoZSBsaW5lIGlzIHJldHVybmVkLgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG51bWJlciBvZiBpbmRlbnRhdGlvbiB1bml0cyBmcm9tIGEgZ2l2ZW4gbGluZS4gSWYgdGhlIGxpbmUKKwkgKiBoYXMgbGVzcyBpbmRlbnQgdGhhbiB0aGUgZ2l2ZW4gaW5kZW50VW5pdHNUb1JlbW92ZSwgYWxsIHRoZSBhdmFpbGFibGUgaW5kZW50YXRpb24gaXMgcmVtb3ZlZC4KKwkgKiBJZiA8Y29kZT5pbmRlbnRzVG9SZW1vdmUgPD0gMCBvciBpbmRlbnQgPT0gMDwvY29kZT4gdGhlIGxpbmUgaXMgcmV0dXJuZWQuCiAJICoKIAkgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byB0cmltCiAJICogQHBhcmFtIHRhYldpZHRoIHRoZSB3aWR0aCBvZiBvbmUgdGFiIGluIHNwYWNlIGVxdWl2YWxlbnRzCkBAIC0xODMsMjEgKzE4NywyMSBAQAogCSAqIEByZXR1cm4gdGhlIHRyaW1tZWQgc3RyaW5nCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgotCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50V2lkdGg8L2NvZGU+IGlzIGxvd2VyIG9yIGVxdWFscyB0byB6ZXJvPC9saT4KKwkgKiA8bGk+dGhlIGdpdmVuIDxjb2RlPmluZGVudFdpZHRoPC9jb2RlPiBpcyBsb3dlciB0aGFuIHplcm88L2xpPgogCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+dGFiV2lkdGg8L2NvZGU+IGlzIGxvd2VyIHRoYW4gemVybzwvbGk+CiAJICogPGxpPnRoZSBnaXZlbiA8Y29kZT5saW5lPC9jb2RlPiBpcyBudWxsPC9saT4KIAkgKiA8L3VsPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyaW1JbmRlbnQoU3RyaW5nIGxpbmUsIGludCBpbmRlbnRVbml0c1RvUmVtb3ZlLCBpbnQgdGFiV2lkdGgsIGludCBpbmRlbnRXaWR0aCkgewotCQlpZiAodGFiV2lkdGggPCAwIHx8IGluZGVudFdpZHRoIDw9IDAgfHwgbGluZSA9PSBudWxsKSB7CisJCWlmICh0YWJXaWR0aCA8IDAgfHwgaW5kZW50V2lkdGggPCAwIHx8IGxpbmUgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQotCQlpZiAoaW5kZW50VW5pdHNUb1JlbW92ZSA8PSAwKQotCQkJcmV0dXJuIGxpbmU7CiAKKwkJaWYgKGluZGVudFVuaXRzVG9SZW1vdmUgPD0gMCB8fCBpbmRlbnRXaWR0aCA9PSAwKSB7CisJCQlyZXR1cm4gbGluZTsKKwkJfQogCQlmaW5hbCBpbnQgc3BhY2VFcXVpdmFsZW50c1RvUmVtb3ZlPSBpbmRlbnRVbml0c1RvUmVtb3ZlICogaW5kZW50V2lkdGg7Ci0JCQorCiAJCWludCBzdGFydD0gMDsKIAkJaW50IHNwYWNlRXF1aXZhbGVudHM9IDA7CiAJCWludCBzaXplPSBsaW5lLmxlbmd0aCgpOwpAQCAtMjA1LDE0ICsyMDksMTMgQEAKIAkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewogCQkJY2hhciBjPSBsaW5lLmNoYXJBdChpKTsKIAkJCWlmIChjID09ICdcdCcpIHsKLQkJCQlpbnQgcmVtYWluZGVyPSBzcGFjZUVxdWl2YWxlbnRzICUgdGFiV2lkdGg7Ci0JCQkJc3BhY2VFcXVpdmFsZW50cyArPSB0YWJXaWR0aCAtIHJlbWFpbmRlcjsKKwkJCQlzcGFjZUVxdWl2YWxlbnRzID0gY2FsY3VsYXRlU3BhY2VFcXVpdmFsZW50cyh0YWJXaWR0aCwgc3BhY2VFcXVpdmFsZW50cyk7CiAJCQl9IGVsc2UgaWYgKGlzSW5kZW50Q2hhcihjKSkgewogCQkJCXNwYWNlRXF1aXZhbGVudHMrKzsKIAkJCX0gZWxzZSB7CiAJCQkJLy8gQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkxpbmUgZG9lcyBub3QgaGF2ZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGluZGVudHMiKTsKIAkJCQlzdGFydD0gaTsKLQkJCQlicmVhazsgCisJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoc3BhY2VFcXVpdmFsZW50cyA9PSBzcGFjZUVxdWl2YWxlbnRzVG9SZW1vdmUpIHsKIAkJCQlzdGFydD0gaSArIDE7CkBAIC0yMzQsNyArMjM3LDcgQEAKIAkJCXRyaW1tZWQ9IFV0aWwuRU1QVFlfU1RSSU5HOwogCQllbHNlCiAJCQl0cmltbWVkPSBsaW5lLnN1YnN0cmluZyhzdGFydCk7Ci0JCQorCiAJCWlmIChwcmVmaXggPT0gbnVsbCkKIAkJCXJldHVybiB0cmltbWVkOwogCQlyZXR1cm4gcHJlZml4ICsgdHJpbW1lZDsKQEAgLTI0NSw3ICsyNDgsNyBAQAogCSAqIGFuZCBhIG5ldyBpbmRlbnQgc3RyaW5nIGlzIGFkZGVkLgogCSAqIDxwPlRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb2RlIHdpbGwgbm90IGJlIGNoYW5nZWQgKEl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBpbmRlbnQgYXMgaXQgbWlnaHQgc3RhcnQgaW4KIAkgKiB0aGUgbWlkZGxlIG9mIGEgbGluZSkuPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvZGUgdGhlIGNvZGUgdG8gY2hhbmdlIHRoZSBpbmRlbnQgb2YKIAkgKiBAcGFyYW0gaW5kZW50VW5pdHNUb1JlbW92ZSB0aGUgbnVtYmVyIG9mIGluZGVudCB1bml0cyB0byByZW1vdmUgZnJvbSBlYWNoIGxpbmUgKGV4Y2VwdCB0aGUgZmlyc3QpIG9mIHRoZSBnaXZlbiBjb2RlCiAJICogQHBhcmFtIHRhYldpZHRoIHRoZSBzaXplIG9mIG9uZSB0YWIgaW4gc3BhY2UgZXF1aXZhbGVudHMKQEAgLTI1NSw3ICsyNTgsNyBAQAogCSAqIEByZXR1cm4gdGhlIG5ld2x5IGluZGVudCBjb2RlLCBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGxpbmUgZGVsaW1pdGVycy4KIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKIAkgKiA8dWw+Ci0JICogPGxpPnRoZSBnaXZlbiA8Y29kZT5pbmRlbnRXaWR0aDwvY29kZT4gaXMgbG93ZXIgb3IgZXF1YWxzIHRvIHplcm88L2xpPgorCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50V2lkdGg8L2NvZGU+IGlzIGxvd2VyIHRoYW4gemVybzwvbGk+CiAJICogPGxpPnRoZSBnaXZlbiA8Y29kZT50YWJXaWR0aDwvY29kZT4gaXMgbG93ZXIgdGhhbiB6ZXJvPC9saT4KIAkgKiA8bGk+dGhlIGdpdmVuIDxjb2RlPmNvZGU8L2NvZGU+IGlzIG51bGw8L2xpPgogCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50VW5pdHNUb1JlbW92ZTwvY29kZT4gaXMgbG93ZXIgdGhhbiB6ZXJvPC9saT4KQEAgLTI2NCwxMCArMjY3LDEwIEBACiAJICogPC91bD4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VJbmRlbnQoU3RyaW5nIGNvZGUsIGludCBpbmRlbnRVbml0c1RvUmVtb3ZlLCBpbnQgdGFiV2lkdGgsIGludCBpbmRlbnRXaWR0aCwgU3RyaW5nIG5ld0luZGVudFN0cmluZywgU3RyaW5nIGxpbmVEZWxpbSkgewotCQlpZiAodGFiV2lkdGggPCAwIHx8IGluZGVudFdpZHRoIDw9IDAgfHwgY29kZSA9PSBudWxsIHx8IGluZGVudFVuaXRzVG9SZW1vdmUgPCAwIHx8IG5ld0luZGVudFN0cmluZyA9PSBudWxsIHx8IGxpbmVEZWxpbSA9PSBudWxsKSB7CisJCWlmICh0YWJXaWR0aCA8IDAgfHwgaW5kZW50V2lkdGggPCAwIHx8IGNvZGUgPT0gbnVsbCB8fCBpbmRlbnRVbml0c1RvUmVtb3ZlIDwgMCB8fCBuZXdJbmRlbnRTdHJpbmcgPT0gbnVsbCB8fCBsaW5lRGVsaW0gPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCiAJCXRyeSB7CiAJCQlJTGluZVRyYWNrZXIgdHJhY2tlcj0gbmV3IERlZmF1bHRMaW5lVHJhY2tlcigpOwogCQkJdHJhY2tlci5zZXQoY29kZSk7CkBAIC0yNzUsMjEgKzI3OCwyNSBAQAogCQkJaWYgKG5MaW5lcyA9PSAxKSB7CiAJCQkJcmV0dXJuIGNvZGU7CiAJCQl9Ci0JCQkKKwogCQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCisKIAkJCWZvciAoaW50IGk9IDA7IGkgPCBuTGluZXM7IGkrKykgewogCQkJCUlSZWdpb24gcmVnaW9uPSB0cmFja2VyLmdldExpbmVJbmZvcm1hdGlvbihpKTsKIAkJCQlpbnQgc3RhcnQ9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKIAkJCQlpbnQgZW5kPSBzdGFydCArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKIAkJCQlTdHJpbmcgbGluZT0gY29kZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJCisKIAkJCQlpZiAoaSA9PSAwKSB7ICAvLyBubyBpbmRlbnQgZm9yIGZpcnN0IGxpbmUgKGNvbnRhaW5lZCBpbiB0aGUgZm9ybWF0dGVkIHN0cmluZykKIAkJCQkJYnVmLmFwcGVuZChsaW5lKTsKIAkJCQl9IGVsc2UgeyAvLyBubyBuZXcgbGluZSBhZnRlciBsYXN0IGxpbmUKIAkJCQkJYnVmLmFwcGVuZChsaW5lRGVsaW0pOwotCQkJCQlidWYuYXBwZW5kKG5ld0luZGVudFN0cmluZyk7IAotCQkJCQlidWYuYXBwZW5kKHRyaW1JbmRlbnQobGluZSwgaW5kZW50VW5pdHNUb1JlbW92ZSwgdGFiV2lkdGgsIGluZGVudFdpZHRoKSk7CisJCQkJCWJ1Zi5hcHBlbmQobmV3SW5kZW50U3RyaW5nKTsKKwkJCQkJaWYoaW5kZW50V2lkdGggIT0gMCkgeworCQkJCQkJYnVmLmFwcGVuZCh0cmltSW5kZW50KGxpbmUsIGluZGVudFVuaXRzVG9SZW1vdmUsIHRhYldpZHRoLCBpbmRlbnRXaWR0aCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYnVmLmFwcGVuZChsaW5lKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKQEAgLTMwMSwxMSArMzA4LDExIEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0ZXh0IGVkaXRzIHJldHJpZXZlZCBhZnRlciBjaGFuZ2luZyB0aGUgaW5kZW50YXRpb24gb2YgYSwgcG9zc2libGUgbXVsdGktbGluZSwgY29kZSBzdHJpbmcuCi0JICogCisJICoKIAkgKiA8cD5UaGUgZ2l2ZW4gbnVtYmVyIG9mIGluZGVudCB1bml0cyBpcyByZW1vdmVkLCBhbmQgYSBuZXcgaW5kZW50IHN0cmluZyBpcyBhZGRlZC48L3A+CiAJICogPHA+VGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvZGUgd2lsbCBub3QgYmUgY2hhbmdlZCAoSXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIG5vIGluZGVudCBhcyBpdCBtaWdodCBzdGFydCBpbgogCSAqIHRoZSBtaWRkbGUgb2YgYSBsaW5lKS48L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc291cmNlIFRoZSBjb2RlIHRvIGNoYW5nZSB0aGUgaW5kZW50IG9mCiAJICogQHBhcmFtIGluZGVudFVuaXRzVG9SZW1vdmUgdGhlIG51bWJlciBvZiBpbmRlbnQgdW5pdHMgdG8gcmVtb3ZlIGZyb20gZWFjaCBsaW5lIChleGNlcHQgdGhlIGZpcnN0KSBvZiB0aGUgZ2l2ZW4gY29kZQogCSAqIEBwYXJhbSB0YWJXaWR0aCB0aGUgc2l6ZSBvZiBvbmUgdGFiIGluIHNwYWNlIGVxdWl2YWxlbnRzCkBAIC0zMTQsNyArMzIxLDcgQEAKIAkgKiBAcmV0dXJuIHJldHVybnMgdGhlIHJlc3VsdGluZyB0ZXh0IGVkaXRzCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CiAJICogPHVsPgotCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50V2lkdGg8L2NvZGU+IGlzIGxvd2VyIG9yIGVxdWFscyB0byB6ZXJvPC9saT4KKwkgKiA8bGk+dGhlIGdpdmVuIDxjb2RlPmluZGVudFdpZHRoPC9jb2RlPiBpcyBsb3dlciB0aGFuIHplcm88L2xpPgogCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+dGFiV2lkdGg8L2NvZGU+IGlzIGxvd2VyIHRoYW4gemVybzwvbGk+CiAJICogPGxpPnRoZSBnaXZlbiA8Y29kZT5zb3VyY2U8L2NvZGU+IGlzIG51bGw8L2xpPgogCSAqIDxsaT50aGUgZ2l2ZW4gPGNvZGU+aW5kZW50VW5pdHNUb1JlbW92ZTwvY29kZT4gaXMgbG93ZXIgdGhhbiB6ZXJvPC9saT4KQEAgLTMyMiwxMCArMzI5LDEwIEBACiAJICogPC91bD4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFJlcGxhY2VFZGl0W10gZ2V0Q2hhbmdlSW5kZW50RWRpdHMoU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudFVuaXRzVG9SZW1vdmUsIGludCB0YWJXaWR0aCwgaW50IGluZGVudFdpZHRoLCBTdHJpbmcgbmV3SW5kZW50U3RyaW5nKSB7Ci0JCWlmICh0YWJXaWR0aCA8IDAgfHwgaW5kZW50V2lkdGggPD0gMCB8fCBzb3VyY2UgPT0gbnVsbCB8fCBpbmRlbnRVbml0c1RvUmVtb3ZlIDwgMCB8fCBuZXdJbmRlbnRTdHJpbmcgPT0gbnVsbCkgeworCQlpZiAodGFiV2lkdGggPCAwIHx8IGluZGVudFdpZHRoIDwgMCB8fCBzb3VyY2UgPT0gbnVsbCB8fCBpbmRlbnRVbml0c1RvUmVtb3ZlIDwgMCB8fCBuZXdJbmRlbnRTdHJpbmcgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCiAJCUFycmF5TGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKIAkJdHJ5IHsKIAkJCUlMaW5lVHJhY2tlciB0cmFja2VyPSBuZXcgRGVmYXVsdExpbmVUcmFja2VyKCk7CkBAIC0zNTAsMjQgKzM1NywyMyBAQAogCQl9CiAJCXJldHVybiAoUmVwbGFjZUVkaXRbXSlyZXN1bHQudG9BcnJheShuZXcgUmVwbGFjZUVkaXRbcmVzdWx0LnNpemUoKV0pOwogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGluZGVudCBvZiB0aGUgZ2l2ZW4gc2l6ZSBlbmRzLgogCSAqIFJldHVybnMgPGNvZGU+LTE8Y29kZT4gaWYgdGhlIGxpbmUgaXNuJ3QgcHJlZml4ZWQgd2l0aCBhbiBpbmRlbnQgb2YKIAkgKiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGluZGVudHMuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZJbmRlbnQoQ2hhclNlcXVlbmNlIGxpbmUsIGludCBudW1iZXJPZkluZGVudFVuaXRzLCBpbnQgdGFiV2lkdGgsIGludCBpbmRlbnRXaWR0aCkgewotCQkKKwogCQlpbnQgc3BhY2VFcXVpdmFsZW50cz0gbnVtYmVyT2ZJbmRlbnRVbml0cyAqIGluZGVudFdpZHRoOwotCQkKKwogCQlpbnQgc2l6ZT0gbGluZS5sZW5ndGgoKTsKIAkJaW50IHJlc3VsdD0gLTE7CiAJCWludCBibGFua3M9IDA7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplICYmIGJsYW5rcyA8IHNwYWNlRXF1aXZhbGVudHM7IGkrKykgewogCQkJY2hhciBjPSBsaW5lLmNoYXJBdChpKTsKIAkJCWlmIChjID09ICdcdCcpIHsKLQkJCQlpbnQgcmVtYWluZGVyPSBibGFua3MgJSB0YWJXaWR0aDsKLQkJCQlibGFua3MgKz0gdGFiV2lkdGggLSByZW1haW5kZXI7CisJCQkJYmxhbmtzID0gY2FsY3VsYXRlU3BhY2VFcXVpdmFsZW50cyh0YWJXaWR0aCwgYmxhbmtzKTsKIAkJCX0gZWxzZSBpZiAoaXNJbmRlbnRDaGFyKGMpKSB7CiAJCQkJYmxhbmtzKys7CiAJCQl9IGVsc2UgewpAQCAtMzc5LDEzICszODUsMjUgQEAKIAkJCXJldHVybiAtMTsKIAkJcmV0dXJuIHJlc3VsdCArIDE7CiAJfQotCQorCisJLyoKKwkgKiBDYWxjdWxhdGVzIHNwYWNlIGVxdWl2YWxlbnRzIHVwIHRvIHRoZSBuZXh0IHRhYiBzdG9wCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZVNwYWNlRXF1aXZhbGVudHMoaW50IHRhYldpZHRoLCBpbnQgc3BhY2VFcXVpdmFsZW50cykgeworCQlpZiAodGFiV2lkdGggPT0gMCl7CisJCQlyZXR1cm4gc3BhY2VFcXVpdmFsZW50czsKKwkJfQorCQlpbnQgcmVtYWluZGVyID0gc3BhY2VFcXVpdmFsZW50cyAlIHRhYldpZHRoOworCQlzcGFjZUVxdWl2YWxlbnRzICs9IHRhYldpZHRoIC0gcmVtYWluZGVyOworCQlyZXR1cm4gc3BhY2VFcXVpdmFsZW50czsKKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0YWIgd2lkdGggYXMgY29uZmlndXJlZCBpbiB0aGUgZ2l2ZW4gbWFwLgogCSAqIDxwPlVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0I2dldE9wdGlvbnMoYm9vbGVhbil9IHRvIGdldCB0aGUgbW9zdCBjdXJyZW50IHByb2plY3Qgb3B0aW9ucy48L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgbWFwIHRvIGdldCB0aGUgZm9ybWF0dGVyIHNldHRpbmdzIGZyb20uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0YWIgd2lkdGgKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gPGNvZGU+b3B0aW9uczwvY29kZT4gaXMgbnVsbAogCSAqLwpAQCAtMzk1LDEzICs0MTMsMTMgQEAKIAkJfQogCQlyZXR1cm4gZ2V0SW50VmFsdWUob3B0aW9ucywgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX1RBQl9TSVpFLCA0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0YWIgd2lkdGggYXMgY29uZmlndXJlZCBpbiB0aGUgZ2l2ZW4gbWFwLgogCSAqIDxwPlVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0I2dldE9wdGlvbnMoYm9vbGVhbil9IHRvIGdldCB0aGUgbW9zdCBjdXJyZW50IHByb2plY3Qgb3B0aW9ucy48L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgbWFwIHRvIGdldCB0aGUgZm9ybWF0dGVyIHNldHRpbmdzIGZyb20KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGluZGVudCB3aWR0aAogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiA8Y29kZT5vcHRpb25zPC9jb2RlPiBpcyBudWxsCiAJICovCkBAIC00MTYsNyArNDM0LDcgQEAKIAkJfQogCQlyZXR1cm4gdGFiV2lkdGg7CiAJfQotCQorCiAJcHJpdmF0ZSBzdGF0aWMgaW50IGdldEludFZhbHVlKE1hcCBvcHRpb25zLCBTdHJpbmcga2V5LCBpbnQgZGVmKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBvcHRpb25zLmdldChrZXkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9mb3JtYXR0ZXIvbWVzc2FnZXMucHJvcGVydGllcwppbmRleCAxNTQxMzNhLi5jNjA2ZTM4IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvZm9ybWF0dGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2Zvcm1hdHRlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgQmVuIEtvbnJhdGggPGJlbkBiYWd1Lm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIEJlbiBLb25yYXRoIDxiZW5AYmFndS5vcmc+CiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04LDYgKzgsNyBAQAogIyBDb250cmlidXRvcnM6CiAjICAgICBCZW4gS29ucmF0aCA8YmVuQGJhZ3Uub3JnPiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KICMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIENvZGUgcmV2aWV3IGFuZCBpbnRlZ3JhdGlvbgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gRml4IGZvciAzNDAxODEKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIENvbW1hbmRMaW5lU3RhcnQ9U3RhcnRpbmcgZm9ybWF0IGpvYiAuLi4KIENvbW1hbmRMaW5lRG9uZT1Eb25lLgpAQCAtMjcsNiArMjgsNyBAQAogXCAgIC1xdWlldCAgICAgICAgICAgICAgIE9ubHkgcHJpbnQgZXJyb3IgbWVzc2FnZXMuXG5cCiBcICAgLXZlcmJvc2UgICAgICAgICAgICAgQmUgdmVyYm9zZSBhYm91dCB0aGUgZm9ybWF0dGluZyBqb2IuCiAKK0NvbW1hbmRMaW5lRXJyb3JGaWxlVHJ5RnVsbFBhdGg9ezB9IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgdHJ5IHNwZWNpZnlpbmcgdmFsaWQgYWJzb2x1dGUgcGF0aC4gCiBDb21tYW5kTGluZUVycm9yRmlsZT17MH0gZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBzcGVjaWZ5IG9ubHkgdmFsaWQgSmF2YSBTb3VyY2UgZmlsZXMuCiBDb21tYW5kTGluZUVycm9yQ29uZmlnPUEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHRoZSBjb25maWcgZmlsZSB7MH0uCiBDb21tYW5kTGluZUVycm9yRmlsZURpcj1Zb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBmb3JtYXQuCkBAIC0zNiw2ICszOCw3IEBACiBDYXVnaHRFeGNlcHRpb249Q2F1Z2h0IHswfSA6IHsxfQogRXhjZXB0aW9uU2tpcD0gezB9XG5Ta2lwcGluZyBGaWxlLgogCi1Db25maWdGaWxlUmVhZGluZ0Vycm9yPUVycm9yIFJlYWRpbmcgY29uZmlnIGZpbGUuCitDb25maWdGaWxlTm90Rm91bmRFcnJvclRyeUZ1bGxQYXRoPUVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlIChmaWxlIHBhdGggOiB7MH0sIGN1cnJlbnQgdXNlciBkaXJlY3RvcnkgdXNlZCB0byByZWFkIHRoZSBmaWxlOiB7MX0pLiBUcnkgc3BlY2lmeWluZyBhYnNvbHV0ZSBwYXRoLgorQ29uZmlnRmlsZVJlYWRpbmdFcnJvcj1FcnJvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSB7MH0uCiAKIEZvcm1hdFByb2JsZW09VGhlIEVjbGlwc2UgZm9ybWF0dGVyIGZhaWxlZCB0byBmb3JtYXQgezB9LiBTa2lwIHRoZSBmaWxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Fib3J0Rm9ybWF0dGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJvcnRGb3JtYXR0aW5nLmphdmEKaW5kZXggNGY2NmEzNi4uMTU2Yjk0NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJvcnRGb3JtYXR0aW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJvcnRGb3JtYXR0aW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTUgKzEyLDE1IEBACiAKIC8qKgogICogVW5jaGVja2VkIGV4Y2VwdGlvbiB3cmFwcGluZyBpbnZhbGlkIGlucHV0IGNoZWNrZWQgZXhjZXB0aW9uIHdoaWNoIG1heSBvY2N1cgotICogd2hlbiBzY2FubmluZyBvcmlnaW5hbCBmb3JtYXR0ZWQgc291cmNlLiAKLSAqIAorICogd2hlbiBzY2FubmluZyBvcmlnaW5hbCBmb3JtYXR0ZWQgc291cmNlLgorICoKICAqIEBzaW5jZSAyLjEKICAqLwogcHVibGljIGNsYXNzIEFib3J0Rm9ybWF0dGluZyBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCiAJVGhyb3dhYmxlIG5lc3RlZEV4Y2VwdGlvbjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTc5NjUwNzI3NjMxMTQyODUyNkw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogCXB1YmxpYyBBYm9ydEZvcm1hdHRpbmcoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQmluYXJ5RXhwcmVzc2lvbkZyYWdtZW50QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQmluYXJ5RXhwcmVzc2lvbkZyYWdtZW50QnVpbGRlci5qYXZhCmluZGV4IDZlOGEyMjguLjJjMTk2ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0JpbmFyeUV4cHJlc3Npb25GcmFnbWVudEJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9CaW5hcnlFeHByZXNzaW9uRnJhZ21lbnRCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNjIsNyArNjIsNyBAQAogCiBjbGFzcyBCaW5hcnlFeHByZXNzaW9uRnJhZ21lbnRCdWlsZGVyCiAJZXh0ZW5kcyBBU1RWaXNpdG9yIHsKLQkJCisKIAlBcnJheUxpc3QgZnJhZ21lbnRzTGlzdDsKIAlBcnJheUxpc3Qgb3BlcmF0b3JzTGlzdDsKIAlwcml2YXRlIGludCByZWFsRnJhZ21lbnRzU2l6ZTsKQEAgLTc3LDcgKzc3LDcgQEAKIAkJdGhpcy5mcmFnbWVudHNMaXN0LmFkZChub2RlKTsKIAkJdGhpcy5yZWFsRnJhZ21lbnRzU2l6ZSsrOwogCX0KLQkKKwogCXByaXZhdGUgZmluYWwgdm9pZCBhZGRTbWFsbEZyYWdtZW50KEFTVE5vZGUgbm9kZSkgewogCQl0aGlzLmZyYWdtZW50c0xpc3QuYWRkKG5vZGUpOwogCX0KQEAgLTg2LDkgKzg2LDggQEAKIAkJaWYgKCgoZXhwcmVzc2lvbi5iaXRzICYgQVNUTm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPj4gQVNUTm9kZS5QYXJlbnRoZXNpemVkU0hJRlQpICE9IDApIHsKIAkJCWFkZFJlYWxGcmFnbWVudChleHByZXNzaW9uKTsKIAkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwogCQl9CisJCXJldHVybiB0cnVlOwogCX0KIAogCXB1YmxpYyBBU1ROb2RlW10gZnJhZ21lbnRzKCkgewpAQCAtOTYsMTIgKzk1LDEyIEBACiAJCXRoaXMuZnJhZ21lbnRzTGlzdC50b0FycmF5KGZyYWdtZW50cyk7CiAJCXJldHVybiBmcmFnbWVudHM7CiAJfQotCQorCiAJcHVibGljIGludFtdIG9wZXJhdG9ycygpIHsKLQkJaW50IGxlbmd0aCA9IG9wZXJhdG9yc0xpc3Quc2l6ZSgpOworCQlpbnQgbGVuZ3RoID0gdGhpcy5vcGVyYXRvcnNMaXN0LnNpemUoKTsKIAkJaW50W10gdGFiID0gbmV3IGludFtsZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0YWJbaV0gPSAoKEludGVnZXIpb3BlcmF0b3JzTGlzdC5nZXQoaSkpLmludFZhbHVlKCk7CisJCQl0YWJbaV0gPSAoKEludGVnZXIpdGhpcy5vcGVyYXRvcnNMaXN0LmdldChpKSkuaW50VmFsdWUoKTsKIAkJfQogCQlyZXR1cm4gdGFiOwogCX0KQEAgLTEwOSwxMSArMTA4LDExIEBACiAJcHVibGljIGludCByZWFsRnJhZ21lbnRzU2l6ZSgpIHsKIAkJcmV0dXJuIHRoaXMucmVhbEZyYWdtZW50c1NpemU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChhbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJCQlhZGRSZWFsRnJhZ21lbnQoYWxsb2NhdGlvbkV4cHJlc3Npb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMTM0LDUwICsxMzMsNTAgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKTsKKwkJCWFkZFJlYWxGcmFnbWVudChhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKTsKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoYXJyYXlJbml0aWFsaXplcik7CisJCWFkZFJlYWxGcmFnbWVudChhcnJheUluaXRpYWxpemVyKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOworCQkJYWRkUmVhbEZyYWdtZW50KGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCiAJCUNsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSk7CisJCQlhZGRSZWFsRnJhZ21lbnQoYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudChhcnJheVJlZmVyZW5jZSk7CisJCWFkZFJlYWxGcmFnbWVudChhcnJheVJlZmVyZW5jZSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwKIAkJQmxvY2tTY29wZSBzY29wZSkgewotCQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoYXJyYXlUeXBlUmVmZXJlbmNlKTsKKwkJCWFkZFJlYWxGcmFnbWVudChhcnJheVR5cGVSZWZlcmVuY2UpOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlBcnJheVR5cGVSZWZlcmVuY2UgYXJyYXlUeXBlUmVmZXJlbmNlLAogCQlDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChhcnJheVR5cGVSZWZlcmVuY2UpOworCQkJYWRkUmVhbEZyYWdtZW50KGFycmF5VHlwZVJlZmVyZW5jZSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KGFzc2lnbm1lbnQpOworCQlhZGRSZWFsRnJhZ21lbnQoYXNzaWdubWVudCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTE5MCw3ICsxODksNyBAQAogCQl9CiAJCWZpbmFsIGludCBudW1iZXJPZlBhcmVucyA9IChiaW5hcnlFeHByZXNzaW9uLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewotCQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoYmluYXJ5RXhwcmVzc2lvbik7CisJCQlhZGRSZWFsRnJhZ21lbnQoYmluYXJ5RXhwcmVzc2lvbik7CiAJCX0gZWxzZSB7CiAJCQlzd2l0Y2goKGJpbmFyeUV4cHJlc3Npb24uYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQpIHsKIAkJCQljYXNlIE9wZXJhdG9ySWRzLlBMVVMgOgpAQCAtMjUwLDcgKzI0OSw3IEBACiAJCQkJCX0KIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCWRlZmF1bHQ6Ci0JCQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGJpbmFyeUV4cHJlc3Npb24pOworCQkJCQlhZGRSZWFsRnJhZ21lbnQoYmluYXJ5RXhwcmVzc2lvbik7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwpAQCAtMjU5LDEyOCArMjU4LDEyNyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbiBjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJLy8ga2VlcCBpbXBsZW1lbnRhdGlvbiBpbiBzeW5jIHdpdGggQmluYXJ5RXhwcmVzc2lvbiNyZXNvbHZlVHlwZQogCQlpZiAoY29tYmluZWRCaW5hcnlFeHByZXNzaW9uLnJlZmVyZW5jZXNUYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24ubGVmdCk7CisJCQlhZGRSZWFsRnJhZ21lbnQoY29tYmluZWRCaW5hcnlFeHByZXNzaW9uLmxlZnQpOwogCQkJdGhpcy5vcGVyYXRvcnNMaXN0LmFkZChuZXcgSW50ZWdlcihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVQTFVTKSk7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24ucmlnaHQpOworCQkJYWRkUmVhbEZyYWdtZW50KGNvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbi5yaWdodCk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJQmluYXJ5RXhwcmVzc2lvbiBjdXJzb3IgPSBjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24ucmVmZXJlbmNlc1RhYmxlWzBdOwogCQlpZiAoY3Vyc29yLmxlZnQgaW5zdGFuY2VvZiBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24pIHsKIAkJCXRoaXMudmlzaXQoKENvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbikgY3Vyc29yLmxlZnQsIHNjb3BlKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGN1cnNvci5sZWZ0KTsKKwkJCWFkZFJlYWxGcmFnbWVudChjdXJzb3IubGVmdCk7CiAJCX0KIAkJZm9yIChpbnQgaSA9IDAsIGVuZCA9IGNvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbi5hcml0eTsgaSA8IGVuZDsgaSArKykgewogCQkJdGhpcy5vcGVyYXRvcnNMaXN0LmFkZChuZXcgSW50ZWdlcihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVQTFVTKSk7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24ucmVmZXJlbmNlc1RhYmxlW2ldLnJpZ2h0KTsKKwkJCWFkZFJlYWxGcmFnbWVudChjb21iaW5lZEJpbmFyeUV4cHJlc3Npb24ucmVmZXJlbmNlc1RhYmxlW2ldLnJpZ2h0KTsKIAkJfQogCQl0aGlzLm9wZXJhdG9yc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVBMVVMpKTsKLQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoY29tYmluZWRCaW5hcnlFeHByZXNzaW9uLnJpZ2h0KTsKKwkJYWRkUmVhbEZyYWdtZW50KGNvbWJpbmVkQmluYXJ5RXhwcmVzc2lvbi5yaWdodCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudChjYXN0RXhwcmVzc2lvbik7CisJCWFkZFJlYWxGcmFnbWVudChjYXN0RXhwcmVzc2lvbik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChDaGFyTGl0ZXJhbCBjaGFyTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFNtYWxsRnJhZ21lbnQoY2hhckxpdGVyYWwpOworCQlhZGRTbWFsbEZyYWdtZW50KGNoYXJMaXRlcmFsKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlDbGFzc0xpdGVyYWxBY2Nlc3MgY2xhc3NMaXRlcmFsQWNjZXNzLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChjbGFzc0xpdGVyYWxBY2Nlc3MpOworCQkJYWRkUmVhbEZyYWdtZW50KGNsYXNzTGl0ZXJhbEFjY2Vzcyk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUNvbXBvdW5kQXNzaWdubWVudCBjb21wb3VuZEFzc2lnbm1lbnQsCiAJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGNvbXBvdW5kQXNzaWdubWVudCk7CisJCQlhZGRSZWFsRnJhZ21lbnQoY29tcG91bmRBc3NpZ25tZW50KTsKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwKIAkJQmxvY2tTY29wZSBzY29wZSkgewotCQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoY29uZGl0aW9uYWxFeHByZXNzaW9uKTsKKwkJCWFkZFJlYWxGcmFnbWVudChjb25kaXRpb25hbEV4cHJlc3Npb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KERvdWJsZUxpdGVyYWwgZG91YmxlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFNtYWxsRnJhZ21lbnQoZG91YmxlTGl0ZXJhbCk7CisJCWFkZFNtYWxsRnJhZ21lbnQoZG91YmxlTGl0ZXJhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChFcXVhbEV4cHJlc3Npb24gZXF1YWxFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KGVxdWFsRXhwcmVzc2lvbik7CisJCWFkZFJlYWxGcmFnbWVudChlcXVhbEV4cHJlc3Npb24pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRlZFN0cmluZ0xpdGVyYWwsCiAJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGV4dGVuZGVkU3RyaW5nTGl0ZXJhbCk7CisJCQlhZGRSZWFsRnJhZ21lbnQoZXh0ZW5kZWRTdHJpbmdMaXRlcmFsKTsKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGYWxzZUxpdGVyYWwgZmFsc2VMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkU21hbGxGcmFnbWVudChmYWxzZUxpdGVyYWwpOworCQlhZGRTbWFsbEZyYWdtZW50KGZhbHNlTGl0ZXJhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudChmaWVsZFJlZmVyZW5jZSk7CisJCWFkZFJlYWxGcmFnbWVudChmaWVsZFJlZmVyZW5jZSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGbG9hdExpdGVyYWwgZmxvYXRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkU21hbGxGcmFnbWVudChmbG9hdExpdGVyYWwpOworCQlhZGRTbWFsbEZyYWdtZW50KGZsb2F0TGl0ZXJhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJSW5zdGFuY2VPZkV4cHJlc3Npb24gaW5zdGFuY2VPZkV4cHJlc3Npb24sCiAJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KGluc3RhbmNlT2ZFeHByZXNzaW9uKTsKKwkJCWFkZFJlYWxGcmFnbWVudChpbnN0YW5jZU9mRXhwcmVzc2lvbik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW50TGl0ZXJhbCBpbnRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkU21hbGxGcmFnbWVudChpbnRMaXRlcmFsKTsKKwkJYWRkU21hbGxGcmFnbWVudChpbnRMaXRlcmFsKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KExvbmdMaXRlcmFsIGxvbmdMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkU21hbGxGcmFnbWVudChsb25nTGl0ZXJhbCk7CisJCWFkZFNtYWxsRnJhZ21lbnQobG9uZ0xpdGVyYWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQobWVzc2FnZVNlbmQpOworCQlhZGRSZWFsRnJhZ21lbnQobWVzc2FnZVNlbmQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbENvbmNhdGVuYXRpb24gc3RyaW5nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgewogCQlpZiAoKChzdHJpbmdMaXRlcmFsLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVCkgIT0gMCkgewogCQkJYWRkUmVhbEZyYWdtZW50KHN0cmluZ0xpdGVyYWwpOwotCQkJcmV0dXJuIGZhbHNlOwogCQl9IGVsc2UgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0cmluZ0xpdGVyYWwuY291bnRlcjsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQoc3RyaW5nTGl0ZXJhbC5saXRlcmFsc1tpXSk7CisJCQkJYWRkUmVhbEZyYWdtZW50KHN0cmluZ0xpdGVyYWwubGl0ZXJhbHNbaV0pOwogCQkJCWlmIChpIDwgbWF4IC0gMSkgewogCQkJCQl0aGlzLm9wZXJhdG9yc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVBMVVMpKTsKIAkJCQl9CiAJCQl9Ci0JCQlyZXR1cm4gZmFsc2U7CiAJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bGxMaXRlcmFsIG51bGxMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KG51bGxMaXRlcmFsKTsKKwkJYWRkUmVhbEZyYWdtZW50KG51bGxMaXRlcmFsKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMzkyLDMxICszOTAsMzEgQEAKIAkJCXRoaXMub3BlcmF0b3JzTGlzdC5hZGQobmV3IEludGVnZXIoVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lT1JfT1IpKTsKIAkJCW9yX29yX0V4cHJlc3Npb24ucmlnaHQudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQl9Ci0JCXJldHVybiBmYWxzZTsJCQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChwb3N0Zml4RXhwcmVzc2lvbik7CisJCQlhZGRSZWFsRnJhZ21lbnQocG9zdGZpeEV4cHJlc3Npb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudChwcmVmaXhFeHByZXNzaW9uKTsKKwkJYWRkUmVhbEZyYWdtZW50KHByZWZpeEV4cHJlc3Npb24pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJCQlhZGRSZWFsRnJhZ21lbnQocXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmFkZFJlYWxGcmFnbWVudChxdWFsaWZpZWROYW1lUmVmZXJlbmNlKTsKKwkJCWFkZFJlYWxGcmFnbWVudChxdWFsaWZpZWROYW1lUmVmZXJlbmNlKTsKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTQyNiw3ICs0MjQsNyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQkJUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsCiAJCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KHF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKTsKKwkJYWRkUmVhbEZyYWdtZW50KHF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNDM2LDE5ICs0MzQsMTkgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKIAkJCVF1YWxpZmllZFRoaXNSZWZlcmVuY2UgcXVhbGlmaWVkVGhpc1JlZmVyZW5jZSwKIAkJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5hZGRSZWFsRnJhZ21lbnQocXVhbGlmaWVkVGhpc1JlZmVyZW5jZSk7CisJCWFkZFJlYWxGcmFnbWVudChxdWFsaWZpZWRUaGlzUmVmZXJlbmNlKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsCiAJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuYWRkUmVhbEZyYWdtZW50KHNpbmdsZU5hbWVSZWZlcmVuY2UpOworCQkJYWRkUmVhbEZyYWdtZW50KHNpbmdsZU5hbWVSZWZlcmVuY2UpOwogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudChzdHJpbmdMaXRlcmFsKTsKKwkJYWRkUmVhbEZyYWdtZW50KHN0cmluZ0xpdGVyYWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC00NTYsMjIgKzQ1NCwyMiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdXBlclJlZmVyZW5jZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyUmVmZXJlbmNlIHN1cGVyUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KHN1cGVyUmVmZXJlbmNlKTsKKwkJYWRkUmVhbEZyYWdtZW50KHN1cGVyUmVmZXJlbmNlKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgewotCQl0aGlzLmFkZFJlYWxGcmFnbWVudCh0aGlzUmVmZXJlbmNlKTsKKwkJYWRkUmVhbEZyYWdtZW50KHRoaXNSZWZlcmVuY2UpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ1ZUxpdGVyYWwgdHJ1ZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5hZGRTbWFsbEZyYWdtZW50KHRydWVMaXRlcmFsKTsKKwkJYWRkU21hbGxGcmFnbWVudCh0cnVlTGl0ZXJhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChVbmFyeUV4cHJlc3Npb24gdW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXRoaXMuYWRkUmVhbEZyYWdtZW50KHVuYXJ5RXhwcmVzc2lvbik7CisJCWFkZFJlYWxGcmFnbWVudCh1bmFyeUV4cHJlc3Npb24pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9DYXNjYWRpbmdNZXRob2RJbnZvY2F0aW9uRnJhZ21lbnRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9DYXNjYWRpbmdNZXRob2RJbnZvY2F0aW9uRnJhZ21lbnRCdWlsZGVyLmphdmEKaW5kZXggNmM3MDkwNy4uMDNhYTliYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2FzY2FkaW5nTWV0aG9kSW52b2NhdGlvbkZyYWdtZW50QnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Nhc2NhZGluZ01ldGhvZEludm9jYXRpb25GcmFnbWVudEJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw3ICsxOSw3IEBACiAKIGNsYXNzIENhc2NhZGluZ01ldGhvZEludm9jYXRpb25GcmFnbWVudEJ1aWxkZXIKIAlleHRlbmRzIEFTVFZpc2l0b3IgewotCQkKKwogCUFycmF5TGlzdCBmcmFnbWVudHNMaXN0OwogCiAJQ2FzY2FkaW5nTWV0aG9kSW52b2NhdGlvbkZyYWdtZW50QnVpbGRlcigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXJWaXNpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyVmlzaXRvci5qYXZhCmluZGV4IDE4MTFhNjMuLjcxZTIyYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXJWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlclZpc2l0b3IuamF2YQpAQCAtMSwxMiArMSwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQnJvY2sgSmFuaWN6YWsgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxNTA3NDEKKyAqICAgICBOYW5kYSBGaXJkYXVzaSAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDI5ODg0NAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CiAKQEAgLTE2LDkgKzE4LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFORF9BTkRfRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWxsb2NhdGlvbkV4cHJlc3Npb247CkBAIC0zMSw3ICszNSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NlcnRTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJpbmFyeUV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJyZWFrU3RhdGVtZW50OwpAQCAtNDYsNiArNDksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uZGl0aW9uYWxFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnRpbnVlU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVW5pb25UeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRG9TdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Eb3VibGVMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRW1wdHlTdGF0ZW1lbnQ7CkBAIC03MSwxMyArNzUsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsQ29uY2F0ZW5hdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk51bGxMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT1JfT1JfRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBvc3RmaXhFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUHJlZml4RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOwpAQCAtODYsMTAgKzg4LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRUaGlzUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJldHVyblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU1lbWJlckFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsQ29uY2F0ZW5hdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN1cGVyUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3dpdGNoU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3luY2hyb25pemVkU3RhdGVtZW50OwpAQCAtMTA1LDcgKzEwOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaWxkY2FyZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsYXRpb25Vbml0U2NvcGU7CkBAIC0xMTYsNyArMTE5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNvZGVTbmlwcGV0UGFyc2luZ1V0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5hbGlnbi5BbGlnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5hbGlnbi5BbGlnbm1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50LkNvbW1lbnRSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7CiAKIC8qKgpAQCAtMTM2LDE1ICsxMzksMTUgQEAKIHB1YmxpYyBjbGFzcyBDb2RlRm9ybWF0dGVyVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewogCiAJcHVibGljIHN0YXRpYyBjbGFzcyBNdWx0aUZpZWxkRGVjbGFyYXRpb24gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uIHsKLQkJCisKIAkJRmllbGREZWNsYXJhdGlvbltdIGRlY2xhcmF0aW9uczsKLQkJCisKIAkJTXVsdGlGaWVsZERlY2xhcmF0aW9uKEZpZWxkRGVjbGFyYXRpb25bXSBkZWNsYXJhdGlvbnMpewogCQkJdGhpcy5kZWNsYXJhdGlvbnMgPSBkZWNsYXJhdGlvbnM7Ci0JCQl0aGlzLm1vZGlmaWVycyA9IGRlY2xhcmF0aW9uc1swXS5tb2RpZmllcnM7IAorCQkJdGhpcy5tb2RpZmllcnMgPSBkZWNsYXJhdGlvbnNbMF0ubW9kaWZpZXJzOwogCQl9CiAJfQotCQorCiAJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX01PRElGSUVSUyA9IDA7CiAJLyoKQEAgLTE2NSwyNSArMTY4LDM2IEBACiAJfTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TID0gbmV3IGludFtdIHsKIAkJVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUklHSFRfU0hJRlQsCisJCVRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUdSRUFURVIsCiAJCVRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZULAotCQlUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVHUkVBVEVSCiAJfTsKLQlwcml2YXRlIGludCBjaHVua0tpbmQ7CiAJcHVibGljIGludCBsYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCWludCBsYXN0QmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudEJyZWFrSW5kZW50YXRpb247CiAJcHJpdmF0ZSBTY2FubmVyIGxvY2FsU2Nhbm5lcjsKIAlwdWJsaWMgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zIHByZWZlcmVuY2VzOwogCXB1YmxpYyBTY3JpYmUgc2NyaWJlOwogCi0JcHVibGljIENvZGVGb3JtYXR0ZXJWaXNpdG9yKERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucyBwcmVmZXJlbmNlcywgTWFwIHNldHRpbmdzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDb2RlU25pcHBldFBhcnNpbmdVdGlsIGNvZGVTbmlwcGV0UGFyc2luZ1V0aWwpIHsKKwkvLyBCaW5hcnkgZXhwcmVzc2lvbiBwb3NpdGlvbnMgc3RvcmFnZQorCWZpbmFsIHN0YXRpYyBsb25nICBFWFBSRVNTSU9OU19QT1NfRU5URVJfRVFVQUxJVFkgPSAxOworCWZpbmFsIHN0YXRpYyBsb25nICBFWFBSRVNTSU9OU19QT1NfRU5URVJfVFdPID0gMjsKKwlmaW5hbCBzdGF0aWMgbG9uZyAgRVhQUkVTU0lPTlNfUE9TX0JFVFdFRU5fVFdPID0gMzsKKwlmaW5hbCBzdGF0aWMgbG9uZyAgRVhQUkVTU0lPTlNfUE9TX01BU0sgPSBFWFBSRVNTSU9OU19QT1NfQkVUV0VFTl9UV087CisJbG9uZyBleHByZXNzaW9uc1BvczsKKwlpbnQgZXhwcmVzc2lvbnNEZXB0aCA9IC0xOworCisJLy8gQXJyYXkgaW5pdGlhbGl6ZXJzIGluZm9ybWF0aW9uCisJaW50IGFycmF5SW5pdGlhbGl6ZXJzRGVwdGggPSAtMTsKKworCXB1YmxpYyBDb2RlRm9ybWF0dGVyVmlzaXRvcihEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMgcHJlZmVyZW5jZXMsIE1hcCBzZXR0aW5ncywgSVJlZ2lvbltdIHJlZ2lvbnMsIENvZGVTbmlwcGV0UGFyc2luZ1V0aWwgY29kZVNuaXBwZXRQYXJzaW5nVXRpbCwgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJbG9uZyBzb3VyY2VMZXZlbCA9IHNldHRpbmdzID09IG51bGwKIAkJCT8gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMwogCQkJOiBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc2V0dGluZ3MuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSkpOwogCQl0aGlzLmxvY2FsU2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsIGZhbHNlLCBmYWxzZS8qbmxzKi8sIHNvdXJjZUxldmVsLypzb3VyY2VMZXZlbCovLCBudWxsLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKLQkJCisKIAkJdGhpcy5wcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VzOwotCQl0aGlzLnNjcmliZSA9IG5ldyBTY3JpYmUodGhpcywgc291cmNlTGV2ZWwsIG9mZnNldCwgbGVuZ3RoLCBjb2RlU25pcHBldFBhcnNpbmdVdGlsKTsKKwkJdGhpcy5zY3JpYmUgPSBuZXcgU2NyaWJlKHRoaXMsIHNvdXJjZUxldmVsLCByZWdpb25zLCBjb2RlU25pcHBldFBhcnNpbmdVdGlsLCBpbmNsdWRlQ29tbWVudHMpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbSkKIAkgKi8KQEAgLTI1OSwxNSArMjczLDggQEAKIAogCQltZXNzYWdlU2VuZC50cmF2ZXJzZShidWlsZGVyLCBzY29wZSk7CiAJCXJldHVybiBidWlsZGVyOwotCX0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDaHVua1N0YXJ0KGludCBraW5kKSB7Ci0JCWlmICh0aGlzLmNodW5rS2luZCAhPSBraW5kKSB7Ci0JCQl0aGlzLmNodW5rS2luZCA9IGtpbmQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIGNvbW1lbnRTdGFydHNCbG9jayhpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJdGhpcy5sb2NhbFNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKIAkJdHJ5IHsKQEAgLTMzMCw5ICszMzcsOSBAQAogCQkJcmV0dXJuIG5vZGVzOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBBU1ROb2RlW10gY29tcHV0ZU1lcmdlZE1lbWJlckRlY2xhcmF0aW9ucyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKXsKLQkJCisKIAkJaW50IGZpZWxkSW5kZXggPSAwLCBmaWVsZENvdW50ID0gKHR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPT0gbnVsbCkgPyAwIDogdHlwZURlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGg7CiAJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZENvdW50ID09IDAgPyBudWxsIDogdHlwZURlY2xhcmF0aW9uLmZpZWxkc1tmaWVsZEluZGV4XTsKIAkJaW50IGZpZWxkU3RhcnQgPSBmaWVsZCA9PSBudWxsID8gSW50ZWdlci5NQVhfVkFMVUUgOiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwpAQCAtMzQ0LDcgKzM1MSw3IEBACiAJCWludCB0eXBlSW5kZXggPSAwLCB0eXBlQ291bnQgPSAodHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzID09IG51bGwpID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcy5sZW5ndGg7CiAJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gdHlwZUNvdW50ID09IDAgPyBudWxsIDogdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzW3R5cGVJbmRleF07CiAJCWludCB0eXBlU3RhcnQgPSB0eXBlID09IG51bGwgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkKKwogCQlmaW5hbCBpbnQgbWVtYmVyTGVuZ3RoID0gZmllbGRDb3VudCttZXRob2RDb3VudCt0eXBlQ291bnQ7CiAJCUFTVE5vZGVbXSBtZW1iZXJzID0gbmV3IEFTVE5vZGVbbWVtYmVyTGVuZ3RoXTsKIAkJaWYgKG1lbWJlckxlbmd0aCAhPSAwKSB7CkBAIC0zNjMsNyArMzcwLDcgQEAKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCS8vIG5leHQgbWVtYmVyIGlzIGEgZmllbGQKLQkJCQkJaWYgKGZpZWxkU3RhcnQgPT0gcHJldmlvdXNGaWVsZFN0YXJ0KXsgCisJCQkJCWlmIChmaWVsZFN0YXJ0ID09IHByZXZpb3VzRmllbGRTdGFydCl7CiAJCQkJCQlBU1ROb2RlIHByZXZpb3VzTWVtYmVyID0gbWVtYmVyc1tpbmRleCAtIDFdOwogCQkJCQkJaWYgKHByZXZpb3VzTWVtYmVyIGluc3RhbmNlb2YgTXVsdGlGaWVsZERlY2xhcmF0aW9uKSB7CiAJCQkJCQkJTXVsdGlGaWVsZERlY2xhcmF0aW9uIG11bHRpRmllbGQgPSAoTXVsdGlGaWVsZERlY2xhcmF0aW9uKSBwcmV2aW91c01lbWJlcjsKQEAgLTM4OCw3ICszOTUsNyBAQAogCQkJCX0gZWxzZSBpZiAobWV0aG9kU3RhcnQgPCBmaWVsZFN0YXJ0ICYmIG1ldGhvZFN0YXJ0IDwgdHlwZVN0YXJ0KSB7CiAJCQkJCS8vIG5leHQgbWVtYmVyIGlzIGEgbWV0aG9kCiAJCQkJCWlmICghbWV0aG9kLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc0NsaW5pdCgpKSB7Ci0JCQkJCQltZW1iZXJzW2luZGV4KytdID0gbWV0aG9kOwkJCQkJCisJCQkJCQltZW1iZXJzW2luZGV4KytdID0gbWV0aG9kOwogCQkJCQl9CiAJCQkJCWlmICgrK21ldGhvZEluZGV4IDwgbWV0aG9kQ291bnQpIHsgLy8gZmluZCBuZXh0IG1ldGhvZCBpZiBhbnkKIAkJCQkJCW1ldGhvZFN0YXJ0ID0gKG1ldGhvZCA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW21ldGhvZEluZGV4XSkuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKQEAgLTQwNSwxNCArNDEyLDE0IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IHdoaWxlICgoZmllbGRJbmRleCA8IGZpZWxkQ291bnQpIHx8ICh0eXBlSW5kZXggPCB0eXBlQ291bnQpIHx8IChtZXRob2RJbmRleCA8IG1ldGhvZENvdW50KSk7Ci0JCQkKKwogCQkJaWYgKG1lbWJlcnMubGVuZ3RoICE9IGluZGV4KSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weShtZW1iZXJzLCAwLCBtZW1iZXJzPW5ldyBBU1ROb2RlW2luZGV4XSwgMCwgaW5kZXgpOwogCQkJfQogCQl9CiAJCXJldHVybiBtZW1iZXJzOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBkdW1wQmluYXJ5RXhwcmVzc2lvbigKIAkJQmluYXJ5RXhwcmVzc2lvbiBiaW5hcnlFeHByZXNzaW9uLAogCQlpbnQgb3BlcmF0b3IsCkBAIC00MjIsNjIgKzQyOSw5NSBAQAogCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZU9wZW5pbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihiaW5hcnlFeHByZXNzaW9uLCBudW1iZXJPZlBhcmVucyk7Ci0JCX0JCisJCX0KIAkJQmluYXJ5RXhwcmVzc2lvbkZyYWdtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRGcmFnbWVudHMoYmluYXJ5RXhwcmVzc2lvbiwgc2NvcGUpOwogCQlmaW5hbCBpbnQgZnJhZ21lbnRzU2l6ZSA9IGJ1aWxkZXIuc2l6ZSgpOwotCQkKLQkJaWYgKChidWlsZGVyLnJlYWxGcmFnbWVudHNTaXplKCkgPiAxIHx8IGJ1aWxkZXIuc2l6ZSgpID4gNCkgJiYgbnVtYmVyT2ZQYXJlbnMgPT0gMCkgewotCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7Ci0JCQlBbGlnbm1lbnQgYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgiYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCIsIHRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiwgQWxpZ25tZW50LlJfT1VURVJNT1NULCBmcmFnbWVudHNTaXplLCB0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KGJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnQpOwotCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJQVNUTm9kZVtdIGZyYWdtZW50cyA9IGJ1aWxkZXIuZnJhZ21lbnRzKCk7Ci0JCQlpbnRbXSBvcGVyYXRvcnMgPSBidWlsZGVyLm9wZXJhdG9ycygpOwotCQkJZG8gewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzU2l6ZSAtIDE7IGkrKykgewotCQkJCQkJQVNUTm9kZSBmcmFnbWVudCA9IGZyYWdtZW50c1tpXTsKLQkJCQkJCWZyYWdtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7Ci0JCQkJCQlpZiAodGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPT0gMSkgewotCQkJCQkJCS8vIGEgbmV3IGxpbmUgaGFzIGJlZW4gaW5zZXJ0ZWQgYnkgcHJpbnRUcmFpbGluZ0NvbW1lbnQoKQotCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSBiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKLQkJCQkJCX0KLQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcikgewotCQkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCwgaSk7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4ob3BlcmF0b3JzW2ldLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4ob3BlcmF0b3JzW2ldLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yKTsKLQkJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnQsIGkpOwotCQkJCQkJfQotCQkJCQkJaWYgKG9wZXJhdG9yc1tpXSA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUyAmJiBpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUykpIHsKLQkJCQkJCQkvLyB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBtaW51cyAodW5hcnkgb3BlcmF0b3IpCi0JCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IpIHsKLQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZyYWdtZW50c1tmcmFnbWVudHNTaXplIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOwotCQkJCQlvayA9IHRydWU7Ci0JCQkJfSBjYXRjaChBbGlnbm1lbnRFeGNlcHRpb24gZSl7Ci0JCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7Ci0JCQkJfQotCQkJfSB3aGlsZSAoIW9rKTsJCQotCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LCB0cnVlKTsKKworCQlpZiAodGhpcy5leHByZXNzaW9uc0RlcHRoIDwgMCkgeworCQkJdGhpcy5leHByZXNzaW9uc0RlcHRoID0gMDsKIAkJfSBlbHNlIHsKLQkJCWJpbmFyeUV4cHJlc3Npb24ubGVmdC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihvcGVyYXRvciwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcik7Ci0JCQlpZiAob3BlcmF0b3IgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMgJiYgaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpKSB7Ci0JCQkJLy8gdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbWludXMgKHVuYXJ5IG9wZXJhdG9yKQotCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQl0aGlzLmV4cHJlc3Npb25zRGVwdGgrKzsKKwkJCXRoaXMuZXhwcmVzc2lvbnNQb3MgPDw9IDI7CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMubGFzdEJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnRCcmVha0luZGVudGF0aW9uID0gMDsKKwkJCWlmICgoYnVpbGRlci5yZWFsRnJhZ21lbnRzU2l6ZSgpID4gMSB8fCBmcmFnbWVudHNTaXplID4gNCkgJiYgbnVtYmVyT2ZQYXJlbnMgPT0gMCkgeworCQkJCWludCBzY3JpYmVMaW5lID0gdGhpcy5zY3JpYmUubGluZTsKKwkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKKwkJCQlBbGlnbm1lbnQgYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKKwkJCQkJCUFsaWdubWVudC5CSU5BUllfRVhQUkVTU0lPTiwKKwkJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiwKKwkJCQkJCUFsaWdubWVudC5SX09VVEVSTU9TVCwKKwkJCQkJCWZyYWdtZW50c1NpemUsCisJCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisJCQkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQoYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCk7CisJCQkJYm9vbGVhbiBvayA9IGZhbHNlOworCQkJCUFTVE5vZGVbXSBmcmFnbWVudHMgPSBidWlsZGVyLmZyYWdtZW50cygpOworCQkJCWludFtdIG9wZXJhdG9ycyA9IGJ1aWxkZXIub3BlcmF0b3JzKCk7CisJCQkJZG8geworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgaW50IG1heCA9IGZyYWdtZW50c1NpemUgLSAxOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCQkJCUFTVE5vZGUgZnJhZ21lbnQgPSBmcmFnbWVudHNbaV07CisJCQkJCQkJZnJhZ21lbnQudHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQkJCWlmICh0aGlzLnNjcmliZS5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAxKSB7CisJCQkJCQkJCS8vIGEgbmV3IGxpbmUgaGFzIGJlZW4gaW5zZXJ0ZWQgd2hpbGUgcHJpbnRpbmcgdGhlIGNvbW1lbnQKKwkJCQkJCQkJLy8gaGVuY2Ugd2UgbmVlZCB0byB1c2UgdGhlIGJyZWFrIGluZGVudGF0aW9uIGxldmVsIGJlZm9yZSBwcmludGluZyBuZXh0IHRva2VuLi4uCisJCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSBiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yKSB7CisJCQkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCwgaSk7CisJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKG9wZXJhdG9yc1tpXSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcik7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4ob3BlcmF0b3JzW2ldLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yKTsKKwkJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LCBpKTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKG9wZXJhdG9yc1tpXSA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUyAmJiBpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUykpIHsKKwkJCQkJCQkJLy8gdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbWludXMgKHVuYXJ5IG9wZXJhdG9yKQorCQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yKSB7CisJCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZnJhZ21lbnRzW21heF0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CisJCQkJCQlvayA9IHRydWU7CisJCQkJCX0gY2F0Y2goQWxpZ25tZW50RXhjZXB0aW9uIGUpeworCQkJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKKwkJCQkJfQorCQkJCX0gd2hpbGUgKCFvayk7CisJCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LCB0cnVlKTsKKwkJCQlpZiAodGhpcy5zY3JpYmUubGluZSA9PSBzY3JpYmVMaW5lKSB7CisJCQkJCS8vIFRoZSBleHByZXNzaW9uIHdhcyBub3QgYnJva2VuID0+IHJlc2V0IGxhc3QgYnJlYWsgaW5kZW50YXRpb24KKwkJCQkJdGhpcy5sYXN0QmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMubGFzdEJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnRCcmVha0luZGVudGF0aW9uID0gYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmV4cHJlc3Npb25zUG9zIHw9IEVYUFJFU1NJT05TX1BPU19FTlRFUl9UV087CisJCQkJYmluYXJ5RXhwcmVzc2lvbi5sZWZ0LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQl0aGlzLmV4cHJlc3Npb25zUG9zICY9IH5FWFBSRVNTSU9OU19QT1NfTUFTSzsKKwkJCQl0aGlzLmV4cHJlc3Npb25zUG9zIHw9IEVYUFJFU1NJT05TX1BPU19CRVRXRUVOX1RXTzsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihvcGVyYXRvciwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciwgU2NyaWJlLlBSRVNFUlZFX0VNUFRZX0xJTkVTX0lOX0JJTkFSWV9FWFBSRVNTSU9OKTsKKwkJCQlpZiAob3BlcmF0b3IgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMgJiYgaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpKSB7CisJCQkJCS8vIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG1pbnVzICh1bmFyeSBvcGVyYXRvcikKKwkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQl9CisJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcikgeworCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJCX0KKwkJCQliaW5hcnlFeHByZXNzaW9uLnJpZ2h0LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCX0KLQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IpIHsKLQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQl9CisJCWZpbmFsbHkgeworCQkJdGhpcy5leHByZXNzaW9uc0RlcHRoLS07CisJCQl0aGlzLmV4cHJlc3Npb25zUG9zID4+PSAyOworCQkJaWYgKHRoaXMuZXhwcmVzc2lvbnNEZXB0aCA8IDApIHsKKwkJCQl0aGlzLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9IDA7CiAJCQl9Ci0JCQliaW5hcnlFeHByZXNzaW9uLnJpZ2h0LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJfQkKKwkJfQogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oYmluYXJ5RXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CkBAIC00ODgsMTkgKzUyOCwzMSBAQAogCQlCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sCiAJCWludCBvcGVyYXRvciwKIAkJQmxvY2tTY29wZSBzY29wZSkgewotCQorCiAJCWZpbmFsIGludCBudW1iZXJPZlBhcmVucyA9IChiaW5hcnlFeHByZXNzaW9uLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKLQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oYmluYXJ5RXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwotCQl9CQotCQliaW5hcnlFeHByZXNzaW9uLmxlZnQudHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihvcGVyYXRvciwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcik7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IpIHsKLQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KLQkJYmluYXJ5RXhwcmVzc2lvbi5yaWdodC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0KKwkJaWYgKHRoaXMuZXhwcmVzc2lvbnNEZXB0aCA8IDApIHsKKwkJCXRoaXMuZXhwcmVzc2lvbnNEZXB0aCA9IDA7CisJCX0gZWxzZSB7CisJCQl0aGlzLmV4cHJlc3Npb25zRGVwdGgrKzsKKwkJCXRoaXMuZXhwcmVzc2lvbnNQb3MgPDw9IDI7CisJCX0KKwkJdHJ5IHsKKwkJCXRoaXMuZXhwcmVzc2lvbnNQb3MgfD0gRVhQUkVTU0lPTlNfUE9TX0VOVEVSX0VRVUFMSVRZOworCQkJYmluYXJ5RXhwcmVzc2lvbi5sZWZ0LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKG9wZXJhdG9yLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yLCBTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fRVFVQUxJVFlfRVhQUkVTU0lPTik7CisJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yKSB7CisJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCX0KKwkJCWJpbmFyeUV4cHJlc3Npb24ucmlnaHQudHJhdmVyc2UodGhpcywgc2NvcGUpOworCQl9CisJCWZpbmFsbHkgeworCQkJdGhpcy5leHByZXNzaW9uc0RlcHRoLS07CisJCQl0aGlzLmV4cHJlc3Npb25zUG9zID4+PSAyOworCQl9CiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihiaW5hcnlFeHByZXNzaW9uLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KQEAgLTU0Miw3ICs1OTQsNyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBmb3JtYXQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBBU1RWaXNpdG9yIHZpc2l0b3IsIE1ldGhvZFNjb3BlIHNjb3BlLCBib29sZWFuIGlzQ2h1bmtTdGFydCwgYm9vbGVhbiBpc0ZpcnN0Q2xhc3NCb2R5RGVjbGFyYXRpb24pIHsKLQkJCisKIAkJaWYgKGlzRmlyc3RDbGFzc0JvZHlEZWNsYXJhdGlvbikgewogCQkJaW50IG5ld0xpbmVzQmVmb3JlRmlyc3RDbGFzc0JvZHlEZWNsYXJhdGlvbiA9IHRoaXMucHJlZmVyZW5jZXMuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb247CiAJCQlpZiAobmV3TGluZXNCZWZvcmVGaXJzdENsYXNzQm9keURlY2xhcmF0aW9uID4gMCkgewpAQCAtNTU5LDIyICs2MTEsMjIgQEAKIAkJCX0KIAkJfQogCQlBbGlnbm1lbnQgbWVtYmVyQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuZ2V0TWVtYmVyQWxpZ25tZW50KCk7Ci0JCisKICAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7Ci0JCXRoaXMuc2NyaWJlLnByaW50TW9kaWZpZXJzKGZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHRoaXMpOworCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhmaWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzLCBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX0ZJRUxEKTsKIAkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJLyoKIAkJICogRmllbGQgdHlwZQogCQkgKi8KIAkJZmllbGREZWNsYXJhdGlvbi50eXBlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCisKIAkJLyoKIAkJICogRmllbGQgbmFtZQogCQkgKi8KIAkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChtZW1iZXJBbGlnbm1lbnQsIDApOwotCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIsIHRydWUpOwotCQorCiAJCS8qCiAJCSAqIENoZWNrIGZvciBleHRyYSBkaW1lbnNpb25zCiAJCSAqLwpAQCAtNTg1LDcgKzYzNyw3IEBACiAJCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCSB9CiAJCX0KLQkKKwogCQkvKgogCQkgKiBGaWVsZCBpbml0aWFsaXphdGlvbgogCQkgKi8KQEAgLTU5Niw3ICs2NDgsMTIgQEAKIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yKSB7CiAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCX0KLQkJCUFsaWdubWVudCBhc3NpZ25tZW50QWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KCJmaWVsZERlY2xhcmF0aW9uQXNzaWdubWVudEFsaWdubWVudCIsIHRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50LCBBbGlnbm1lbnQuUl9PVVRFUk1PU1QsIDEsIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJQWxpZ25tZW50IGFzc2lnbm1lbnRBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCUFsaWdubWVudC5GSUVMRF9ERUNMQVJBVElPTl9BU1NJR05NRU5ULAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCwKKwkJCQkJQWxpZ25tZW50LlJfSU5ORVJNT1NULAorCQkJCQkxLAorCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CiAJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhc3NpZ25tZW50QWxpZ25tZW50KTsKIAkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAkJCWRvIHsKQEAgLTYwNyw0OSArNjY0LDUxIEBACiAJCQkJfSBjYXRjaChBbGlnbm1lbnRFeGNlcHRpb24gZSl7CiAJCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQkJfQotCQkJfSB3aGlsZSAoIW9rKTsJCQotCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhc3NpZ25tZW50QWxpZ25tZW50LCB0cnVlKTsJCQkKKwkJCX0gd2hpbGUgKCFvayk7CisJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFzc2lnbm1lbnRBbGlnbm1lbnQsIHRydWUpOwogCQl9Ci0JCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7CiAKIAkJaWYgKG1lbWJlckFsaWdubWVudCAhPSBudWxsKSB7CiAJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KG1lbWJlckFsaWdubWVudCwgMik7Ci0JCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBib29sZWFuIGlzTGFzdCkgewogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbXBvcnQpOwotCQl0aGlzLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSA9IHRoaXMucHJlZmVyZW5jZXMuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzOworCQlpZiAoIWlzTGFzdCkgdGhpcy5zY3JpYmUuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM7CiAJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCWlmIChpbXBvcnRSZWYuaXNTdGF0aWMoKSkgewogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3RhdGljKTsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KIAkJaWYgKChpbXBvcnRSZWYuYml0cyAmIEFTVE5vZGUuT25EZW1hbmQpICE9IDApIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGltcG9ydFJlZi5zb3VyY2VFbmQpOworCQkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoaW1wb3J0UmVmLnNvdXJjZUVuZCwgZmFsc2UvKmRvIG5vdCBleHBlY3QgcGFyZW50aGVzaXMqLyk7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpOwotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFkpOwkJCQorCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFkpOwogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGltcG9ydFJlZi5zb3VyY2VFbmQpOworCQkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoaW1wb3J0UmVmLnNvdXJjZUVuZCwgZmFsc2UvKmRvIG5vdCBleHBlY3QgcGFyZW50aGVzaXMqLyk7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwogCQl9CiAJCWlmIChpc0xhc3QpIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQl0aGlzLnNjcmliZS5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHMgPSAtMTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLklNUE9SVF9UUkFJTElOR19DT01NRU5UKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KHRoaXMucHJlZmVyZW5jZXMuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLk5PX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJdGhpcy5zY3JpYmUuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzID0gLTE7CiAJCX0KLQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CQkJCisJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCX0KIAogCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdChNdWx0aUZpZWxkRGVjbGFyYXRpb24gbXVsdGlGaWVsZERlY2xhcmF0aW9uLCBBU1RWaXNpdG9yIHZpc2l0b3IsIE1ldGhvZFNjb3BlIHNjb3BlLCBib29sZWFuIGlzQ2h1bmtTdGFydCwgYm9vbGVhbiBpc0ZpcnN0Q2xhc3NCb2R5RGVjbGFyYXRpb24pIHsKLQkKKwogCQlpZiAoaXNGaXJzdENsYXNzQm9keURlY2xhcmF0aW9uKSB7CiAJCQlpbnQgbmV3TGluZXNCZWZvcmVGaXJzdENsYXNzQm9keURlY2xhcmF0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbjsKIAkJCWlmIChuZXdMaW5lc0JlZm9yZUZpcnN0Q2xhc3NCb2R5RGVjbGFyYXRpb24gPiAwKSB7CkBAIC02NjYsMjIgKzcyNSwyMiBAQAogCQkJfQogCQl9CiAJCUFsaWdubWVudCBmaWVsZEFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmdldE1lbWJlckFsaWdubWVudCgpOwotCQorCiAgICAgICAgIHRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwotCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhtdWx0aUZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHRoaXMpOworCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhtdWx0aUZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHRoaXMsIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fRklFTEQpOwogCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQorCiAJCW11bHRpRmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnNbMF0udHlwZS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCisKIAkJZmluYWwgaW50IG11bHRpcGxlRmllbGREZWNsYXJhdGlvbnNMZW5ndGggPSBtdWx0aUZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmxlbmd0aDsKIAogCQlBbGlnbm1lbnQgbXVsdGlGaWVsZERlY2xhcmF0aW9uc0FsaWdubWVudCA9dGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAotCQkJCSJtdWx0aXBsZV9maWVsZCIsLy8kTk9OLU5MUy0xJAorCQkJCUFsaWdubWVudC5NVUxUSVBMRV9GSUVMRCwKIAkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzLAogCQkJCW11bHRpcGxlRmllbGREZWNsYXJhdGlvbnNMZW5ndGggLSAxLAogCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKIAkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQobXVsdGlGaWVsZERlY2xhcmF0aW9uc0FsaWdubWVudCk7Ci0JCisKIAkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQlkbyB7CiAJCQl0cnkgewpAQCAtNjk2LDcgKzc1NSw3IEBACiAJCQkJCX0gZWxzZSB7CiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCBmYWxzZSk7CiAJCQkJCX0KLQkJCQorCiAJCQkJCS8qCiAJCQkJCSAqIENoZWNrIGZvciBleHRyYSBkaW1lbnNpb25zCiAJCQkJCSAqLwpAQCAtNzA3LDcgKzc2Niw3IEBACiAJCQkJCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCQkJCSB9CiAJCQkJCX0KLQkJCQkKKwogCQkJCQkvKgogCQkJCQkgKiBGaWVsZCBpbml0aWFsaXphdGlvbgogCQkJCQkgKi8KQEAgLTcyMiwxMCArNzgxLDEwIEBACiAJCQkJCQl9CiAJCQkJCQlpbml0aWFsaXphdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJaWYgKGkgIT0gbGVuZ3RoIC0gMSkgewogCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMpOwotCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChtdWx0aUZpZWxkRGVjbGFyYXRpb25zQWxpZ25tZW50LCBpKTsKIAogCQkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucykgewpAQCAtNzM0LDcgKzc5Myw3IEBACiAJCQkJCX0gZWxzZSB7CiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwogCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChmaWVsZEFsaWdubWVudCwgMik7Ci0JCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJb2sgPSB0cnVlOwpAQCAtNzQyLDIyICs4MDEsMjUgQEAKIAkJCQl0aGlzLnNjcmliZS5yZWRvQWxpZ25tZW50KGUpOwogCQkJfQogCQl9IHdoaWxlICghb2spOwotCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KG11bHRpRmllbGREZWNsYXJhdGlvbnNBbGlnbm1lbnQsIHRydWUpOwkJCQkKKwkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChtdWx0aUZpZWxkRGVjbGFyYXRpb25zQWxpZ25tZW50LCB0cnVlKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyI2Zvcm1hdChpbnQsIFN0cmluZywgaW50LCBpbnQsIGludCwgU3RyaW5nKQogCSAqLwogCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoU3RyaW5nIHN0cmluZywgQVNUTm9kZVtdIG5vZGVzKSB7CiAJCS8vIHJlc2V0IHRoZSBzY3JpYmUKIAkJdGhpcy5zY3JpYmUucmVzZXQoKTsKLQkJCi0JCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJbG9uZyBzdGFydFRpbWUgPSAwOworCQlpZiAoREVCVUcpIHsKKwkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CiAKIAkJZmluYWwgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkKKwogCQl0aGlzLmxvY2FsU2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0U291cmNlKTsKLQkJdGhpcy5zY3JpYmUuaW5pdGlhbGl6ZVNjYW5uZXIoY29tcGlsYXRpb25Vbml0U291cmNlKTsKKwkJdGhpcy5zY3JpYmUucmVzZXRTY2FubmVyKGNvbXBpbGF0aW9uVW5pdFNvdXJjZSk7CiAKIAkJaWYgKG5vZGVzID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtNzgxLDE3ICs4NDMsMjAgQEAKIAlwdWJsaWMgVGV4dEVkaXQgZm9ybWF0KFN0cmluZyBzdHJpbmcsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSB7CiAJCS8vIHJlc2V0IHRoZSBzY3JpYmUKIAkJdGhpcy5zY3JpYmUucmVzZXQoKTsKLQkJCisKIAkJaWYgKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID09IG51bGwgfHwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKIAkJCXJldHVybiBmYWlsZWRUb0Zvcm1hdCgpOwogCQl9CiAKLQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJbG9uZyBzdGFydFRpbWUgPSAwOworCQlpZiAoREVCVUcpIHsKKwkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CiAKIAkJZmluYWwgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkKKwogCQl0aGlzLmxvY2FsU2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0U291cmNlKTsKLQkJdGhpcy5zY3JpYmUuaW5pdGlhbGl6ZVNjYW5uZXIoY29tcGlsYXRpb25Vbml0U291cmNlKTsKKwkJdGhpcy5zY3JpYmUucmVzZXRTY2FubmVyKGNvbXBpbGF0aW9uVW5pdFNvdXJjZSk7CiAKIAkJdGhpcy5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gLTE7CiAJCXRyeSB7CkBAIC04MTEsMTMgKzg3NiwxNiBAQAogCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoU3RyaW5nIHN0cmluZywgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CiAJCS8vIHJlc2V0IHRoZSBzY3JpYmUKIAkJdGhpcy5zY3JpYmUucmVzZXQoKTsKLQkJCi0JCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJbG9uZyBzdGFydFRpbWUgPSAwOworCQlpZiAoREVCVUcpIHsKKwkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CiAKIAkJZmluYWwgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkKKwogCQl0aGlzLmxvY2FsU2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0U291cmNlKTsKLQkJdGhpcy5zY3JpYmUuaW5pdGlhbGl6ZVNjYW5uZXIoY29tcGlsYXRpb25Vbml0U291cmNlKTsKKwkJdGhpcy5zY3JpYmUucmVzZXRTY2FubmVyKGNvbXBpbGF0aW9uVW5pdFNvdXJjZSk7CiAKIAkJaWYgKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC04NTIsMTMgKzkyMCwxNiBAQAogCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoU3RyaW5nIHN0cmluZywgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCS8vIHJlc2V0IHRoZSBzY3JpYmUKIAkJdGhpcy5zY3JpYmUucmVzZXQoKTsKLQkJCi0JCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJbG9uZyBzdGFydFRpbWUgPSAwOworCQlpZiAoREVCVUcpIHsKKwkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CiAKIAkJZmluYWwgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkKKwogCQl0aGlzLmxvY2FsU2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0U291cmNlKTsKLQkJdGhpcy5zY3JpYmUuaW5pdGlhbGl6ZVNjYW5uZXIoY29tcGlsYXRpb25Vbml0U291cmNlKTsKKwkJdGhpcy5zY3JpYmUucmVzZXRTY2FubmVyKGNvbXBpbGF0aW9uVW5pdFNvdXJjZSk7CiAKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC04NzYsNzcgKzk0Nyw1MyBAQAogCQl9CiAJCXJldHVybiB0aGlzLnNjcmliZS5nZXRSb290RWRpdCgpOwogCX0KLQkKKwogCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXIjZm9ybWF0KGludCwgU3RyaW5nLCBpbnQsIGludCwgaW50LCBTdHJpbmcpCisJICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9mIHRoZSBjb21tZW50IHRvIGZvcm1hdAogCSAqLwotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoU3RyaW5nIHN0cmluZywgQ29tbWVudFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gcmVzZXQgdGhlIHNjcmliZQotCQl0aGlzLnNjcmliZS5yZXNldCgpOwotCQkKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFpbGVkVG9Gb3JtYXQoKTsKLQkJfQotCi0JCWxvbmcgc3RhcnRUaW1lID0gMDsKLQkJaWYgKERFQlVHKXsKLQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0KLQkJZmluYWwgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkKLQkJdGhpcy5zY3JpYmUuaW5pdGlhbGl6ZVNjYW5uZXIoY29tcGlsYXRpb25Vbml0U291cmNlKTsKLQotCQlUZXh0RWRpdCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmZvcm1hdCh0aGlzLnByZWZlcmVuY2VzLmluaXRpYWxfaW5kZW50YXRpb25fbGV2ZWwsIHRydWUpOwotCQl9IGNhdGNoKEFib3J0Rm9ybWF0dGluZyBlKXsKLQkJCXJldHVybiBmYWlsZWRUb0Zvcm1hdCgpOwotCQl9Ci0JCWlmIChERUJVRyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1hdHRpbmcgdGltZTogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7CisJcHVibGljIHZvaWQgZm9ybWF0Q29tbWVudChpbnQga2luZCwgU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgaW5kZW50YXRpb25MZXZlbCkgeworCQlpZiAoc291cmNlID09IG51bGwpIHJldHVybjsKKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KGtpbmQsIHNvdXJjZSwgc3RhcnQsIGVuZCwgaW5kZW50YXRpb25MZXZlbCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKXsKLSAgICAgICAgLyoKLSAgICAgICAgICogUHJpbnQgY29tbWVudHMgdG8gZ2V0IHByb3BlciBsaW5lIG51bWJlcgotICAgICAgICAgKi8KLSAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7Ci0gICAgICAgIGludCBsaW5lID0gdGhpcy5zY3JpYmUubGluZTsgCisJCS8qCisJCSAqIFByaW50IGNvbW1lbnRzIHRvIGdldCBwcm9wZXIgbGluZSBudW1iZXIKKwkJICovCisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOworCQlpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7CiAKLQkJdGhpcy5zY3JpYmUucHJpbnRNb2RpZmllcnModHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRNb2RpZmllcnModHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzLCBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX1RZUEUpOwogCiAJCWlmICh0aGlzLnNjcmliZS5saW5lID4gbGluZSkgewotICAgICAgICAJLy8gYW5ub3RhdGlvbnMgaW50cm9kdWNlZCBuZXcgbGluZSwgYnV0IHRoaXMgaXMgbm90IGEgbGluZSB3cmFwcGluZworCQkJLy8gYW5ub3RhdGlvbnMgaW50cm9kdWNlZCBuZXcgbGluZSwgYnV0IHRoaXMgaXMgbm90IGEgbGluZSB3cmFwcGluZwogCQkJLy8gc2VlIDE1ODI2NwogCQkJbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7CiAJCX0KIAotICAgICAgICAvKgorCQkvKgogCQkgKiBUeXBlIG5hbWUKIAkJICovCi0gICAgICAgIHN3aXRjaChUeXBlRGVjbGFyYXRpb24ua2luZCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKSkgewotICAgICAgICAJY2FzZSBUeXBlRGVjbGFyYXRpb24uQ0xBU1NfREVDTCA6Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2xhc3MsIHRydWUpOyAKLSAgICAgICAgCQlicmVhazsKLSAgICAgICAgCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMIDoKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbnRlcmZhY2UsIHRydWUpOyAKLSAgICAgICAgCQlicmVhazsKLSAgICAgICAgCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZW51bSwgdHJ1ZSk7IAotICAgICAgICAJCWJyZWFrOwotICAgICAgICAJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wgOgorCQlzd2l0Y2goVHlwZURlY2xhcmF0aW9uLmtpbmQodHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycykpIHsKKwkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0wgOgorCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNsYXNzLCB0cnVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMIDoKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbnRlcmZhY2UsIHRydWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uRU5VTV9ERUNMIDoKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbnVtLCB0cnVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkFOTk9UQVRJT05fVFlQRV9ERUNMIDoKIAkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBVCwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbik7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50ZXJmYWNlLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24pOyAKLSAgICAgICAgCQlicmVhazsKLSAgICAgICAgfQotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsgCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50ZXJmYWNlLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24pOworCQkJCWJyZWFrOworCQl9CisJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIsIHRydWUpOwogCiAJCVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IHR5cGVEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKIAkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKTsgCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyk7CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgewogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQl9CkBAIC05NTYsMjMgKzEwMDMsMjMgQEAKIAkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycyk7CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycykgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJCX0JCQkJCisJCQkJfQogCQkJfQogCQkJdHlwZVBhcmFtZXRlcnNbbGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgdHlwZURlY2xhcmF0aW9uLnNjb3BlKTsKIAkJCWlmIChpc0Nsb3NpbmdHZW5lcmljVG9rZW4oKSkgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKTsgCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMpOwogCQkJfQogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMpIHsKIAkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJfQogCQl9Ci0JCS8qIAotCQkgKiBTdXBlcmNsYXNzIAorCQkvKgorCQkgKiBTdXBlcmNsYXNzCiAJCSAqLwogCQlmaW5hbCBUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzczsKIAkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogCQkJQWxpZ25tZW50IHN1cGVyY2xhc3NBbGlnbm1lbnQgPXRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLQkJCQkJInN1cGVyY2xhc3MiLCAvLyROT04tTkxTLTEkCisJCQkJCUFsaWdubWVudC5TVVBFUl9DTEFTUywKIAkJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbiwKIAkJCQkJMiwKIAkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwpAQCAtOTkwLDExICsxMDM3LDExIEBACiAJCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQkJfQogCQkJfSB3aGlsZSAoIW9rKTsKLQkJCXRoaXMuc2NyaWJlLmV4aXRBbGlnbm1lbnQoc3VwZXJjbGFzc0FsaWdubWVudCwgdHJ1ZSk7IAorCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChzdXBlcmNsYXNzQWxpZ25tZW50LCB0cnVlKTsKIAkJfQogCi0JCS8qIAotCQkgKiBTdXBlciBJbnRlcmZhY2VzIAorCQkvKgorCQkgKiBTdXBlciBJbnRlcmZhY2VzCiAJCSAqLwogCQlmaW5hbCBUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKIAkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CkBAIC0xMDEwLDcgKzEwNTcsNyBAQAogCQkJfQogCQkJaW50IHN1cGVySW50ZXJmYWNlTGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKIAkJCUFsaWdubWVudCBpbnRlcmZhY2VBbGlnbm1lbnQgPXRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLQkJCQkJInN1cGVySW50ZXJmYWNlcyIsLy8kTk9OLU5MUy0xJAorCQkJCQlBbGlnbm1lbnQuU1VQRVJfSU5URVJGQUNFUywKIAkJCQkJYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXMsCiAJCQkJCXN1cGVySW50ZXJmYWNlTGVuZ3RoKzEsICAvLyBpbXBsZW1lbnRzIHRva2VuIGlzIGZpcnN0IGZyYWdtZW50CiAJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKQEAgLTEwMjcsNyArMTA3NCw3IEBACiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VMZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKGkgPiAwKSB7CiAJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMpOwotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChpbnRlcmZhY2VBbGlnbm1lbnQsIGkrMSk7CiAJCQkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcykgewogCQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwpAQCAtMTA2Nyw5ICsxMTE0LDkgQEAKIAkJCQlzcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZSA9IHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb247CiAJCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgY2xhc3NfZGVjbGFyYXRpb25fYnJhY2UpOworCQlmb3JtYXRMZWZ0Q3VybHlCcmFjZShsaW5lLCBjbGFzc19kZWNsYXJhdGlvbl9icmFjZSk7CiAJCWZvcm1hdFR5cGVPcGVuaW5nQnJhY2UoY2xhc3NfZGVjbGFyYXRpb25fYnJhY2UsIHNwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlLCB0eXBlRGVjbGFyYXRpb24pOwotCQkKKwogCQlib29sZWFuIGluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2hlYWRlcjsKIAkJc3dpdGNoKGtpbmQpIHsKIAkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6CkBAIC0xMDgxLDE3ICsxMTI4LDE3IEBACiAJCQlkZWZhdWx0OgogCQkJCWluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2hlYWRlciA9IHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI7CiAJCQkJYnJlYWs7Ci0JCX0JCQorCQl9CiAJCWlmIChpbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19oZWFkZXIpIHsKIAkJCXRoaXMuc2NyaWJlLmluZGVudCgpOwogCQl9Ci0JCQorCiAJCWlmIChraW5kID09IFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0wpIHsKIAkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CiAJCQlib29sZWFuIGhhc0NvbnN0YW50cyA9IGZhbHNlOworCQkJaW50IGxlbmd0aCA9IGZpZWxkRGVjbGFyYXRpb25zICE9IG51bGwgPyBmaWVsZERlY2xhcmF0aW9ucy5sZW5ndGggOiAwOworCQkJaW50IGVudW1Db25zdGFudHNMZW5ndGggPSAwOwogCQkJaWYgKGZpZWxkRGVjbGFyYXRpb25zICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoOwotCQkJCWludCBlbnVtQ29uc3RhbnRzTGVuZ3RoID0gMDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGZpZWxkRGVjbGFyYXRpb25zW2ldOwogCQkJCQlpZiAoZmllbGREZWNsYXJhdGlvbi5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQpIHsKQEAgLTExMDMsNyArMTE1MCw3IEBACiAJCQkJaGFzQ29uc3RhbnRzID0gZW51bUNvbnN0YW50c0xlbmd0aCAhPSAwOwogCQkJCWlmIChlbnVtQ29uc3RhbnRzTGVuZ3RoID4gMSkgewogCQkJCQlBbGlnbm1lbnQgZW51bUNvbnN0YW50c0FsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLQkJCQkJCQkiZW51bUNvbnN0YW50cyIsLy8kTk9OLU5MUy0xJAorCQkJCQkJCUFsaWdubWVudC5FTlVNX0NPTlNUQU5UUywKIAkJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMsCiAJCQkJCQkJZW51bUNvbnN0YW50c0xlbmd0aCwKIAkJCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiwKQEAgLTExMjIsNyArMTE2OSw3IEBACiAJCQkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMpIHsKIAkJCQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQkJCQkJfQotCQkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQkJCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgewogCQkJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCQkJCQkJCQkJfQpAQCAtMTEzNCw3ICsxMTgxLDggQEAKIAkJCQkJCX0KIAkJCQkJfSB3aGlsZSAoIW9rKTsKIAkJCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChlbnVtQ29uc3RhbnRzQWxpZ25tZW50LCB0cnVlKTsKLQkJCQl9IGVsc2UgeworCQkJCX0gZWxzZSBpZiAoaGFzQ29uc3RhbnRzKSB7CisJCQkJCS8vIG9ubHkgb25lIGVudW0gY29uc3RhbnQKIAkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gZmllbGREZWNsYXJhdGlvbnNbMF07CiAJCQkJCWZpZWxkRGVjbGFyYXRpb24udHJhdmVyc2UodGhpcywgdHlwZURlY2xhcmF0aW9uLmluaXRpYWxpemVyU2NvcGUpOwogCQkJCQlpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEpKSB7CkBAIC0xMTQyLDcgKzExOTAsNyBAQAogCQkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zKSB7CiAJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQkJCX0KLQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCWlmIChmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQkJCX0KQEAgLTExNTEsMTkgKzExOTksMjcgQEAKIAkJCX0KIAkJCWlmIChpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04pKSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOwotCQkJfQotCQkJaWYgKGhhc0NvbnN0YW50cykgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwkKKwkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQlpZiAoaGFzQ29uc3RhbnRzCisJCQkJCQl8fCAoKGVudW1Db25zdGFudHNMZW5ndGggLSBsZW5ndGgpICE9IDApCisJCQkJCQl8fCB0eXBlRGVjbGFyYXRpb24ubWV0aG9kcyAhPSBudWxsCisJCQkJCQl8fCB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBlbXB0eSBlbnVtcyBkb24ndCBnZXQgYSBuZXcgbGluZQorCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGhhc0NvbnN0YW50cykgeworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCS8vIG9ubHkgaGFkIGEgbmV3IGxpbmUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVudW0gY29uc3RhbnQKKwkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCX0KIAkJfQogCiAJCWZvcm1hdFR5cGVNZW1iZXJzKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQorCiAJCWlmIChpbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19oZWFkZXIpIHsKIAkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCX0KLQkJCisKIAkJc3dpdGNoKGtpbmQpIHsKIAkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb24pIHsKQEAgLTExODEsNyArMTIzNyw3IEBACiAJCQkJfQogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSk7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlpZiAoY2xhc3NfZGVjbGFyYXRpb25fYnJhY2UuZXF1YWxzKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLk5FWFRfTElORV9TSElGVEVEKSkgewogCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJfQpAQCAtMTIxMywxNSArMTI2OSwxNSBAQAogCQl9CiAJCW1lbWJlclR5cGVEZWNsYXJhdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdEFub255bW91c1R5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJCS8qCiAJCSAqIFR5cGUgYm9keQogCQkgKi8KIAkJU3RyaW5nIGFub255bW91c190eXBlX2RlY2xhcmF0aW9uX2JyYWNlX3Bvc2l0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb247Ci0JCQorCiAJCWZvcm1hdFR5cGVPcGVuaW5nQnJhY2UoYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb25fYnJhY2VfcG9zaXRpb24sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uLCB0eXBlRGVjbGFyYXRpb24pOwotCQkKKwogCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKIAogCQlmb3JtYXRUeXBlTWVtYmVycyh0eXBlRGVjbGFyYXRpb24pOwpAQCAtMTIzNSw3ICsxMjkxLDcgQEAKIAkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAcGFyYW0gYmxvY2sKIAkgKiBAcGFyYW0gc2NvcGUKQEAgLTEyNTAsOCArMTMwNiw4IEBACiAJCQkJdGhpcy5zY3JpYmUuaW5kZW50KCk7CiAJCQl9CiAJCQlmb3JtYXRTdGF0ZW1lbnRzKHNjb3BlLCBzdGF0ZW1lbnRzLCB0cnVlKTsKLQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwotCQorCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KFNjcmliZS5QUkVTRVJWRV9FTVBUWV9MSU5FU19BVF9FTkRfT0ZfQkxPQ0spOworCiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrKSB7CiAJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCX0KQEAgLTEyNjAsOCArMTMxNiw4IEBACiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrKSB7CiAJCQkJdGhpcy5zY3JpYmUuaW5kZW50KCk7CiAJCQl9Ci0JCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKLQkKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfQVRfRU5EX09GX0JMT0NLKTsKKwogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaykgewogCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCQl9CkBAIC0xMjY5LDE0ICsxMzI1LDE0IEBACiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrKSB7CiAJCQkJdGhpcy5zY3JpYmUuaW5kZW50KCk7CiAJCQl9Ci0JCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKLQkKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfQVRfRU5EX09GX0JMT0NLKTsKKwogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaykgewogCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCQl9CiAJCX0KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFKTsKLQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCWlmIChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkVfU0hJRlRFRC5lcXVhbHMoYmxvY2tfYnJhY2VfcG9zaXRpb24pKSB7CiAJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwogCQl9CkBAIC0xMjk4LDcgKzEzNTQsNyBAQAogCQkJQVNUTm9kZVtdIGFyZ3VtZW50cyA9IGN1cnJlbnRNZXNzYWdlU2VuZC5hcmd1bWVudHM7CiAJCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IGN1cnJlbnRNZXNzYWdlU2VuZC50eXBlQXJndW1lbnRzOwogCQkJaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsgCisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKSB7CiAJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQl9CkBAIC0xMzA4LDExICsxMzY0LDExIEBACiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzKTsKIAkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQkJCQl9CQkJCQorCQkJCQkJfQogCQkJCQl9CiAJCQkJCXR5cGVBcmd1bWVudHNbbGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKLQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOyAKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCQl9CiAJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CkBAIC0xMzI2LDcgKzEzODIsNyBAQAogCQkJCX0KIAkJCQlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogCQkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCQkibWVzc2FnZUFyZ3VtZW50cyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCUFsaWdubWVudC5NRVNTQUdFX0FSR1VNRU5UUywKIAkJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24sCiAJCQkJCQlBbGlnbm1lbnQuUl9PVVRFUk1PU1QsCiAJCQkJCQlhcmd1bWVudExlbmd0aCwKQEAgLTEzMzgsNyArMTM5NCw3IEBACiAJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFyZ3VtZW50TGVuZ3RoOyBqKyspIHsKIAkJCQkJCQlpZiAoaiA+IDApIHsKIAkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpOwotCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCQl9CiAJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcmd1bWVudHNBbGlnbm1lbnQsIGopOwogCQkJCQkJCWlmIChqID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpIHsKQEAgLTEzNjEsMTYgKzE0MTcsMzAgQEAKIAkJCX0KIAkJCXN0YXJ0aW5nUG9zaXRpb25JbkNhc2NhZGUgPSAyOwogCQl9CisJCWludCB0aWVCcmVha1J1bGUgPSB0aGlzLnByZWZlcmVuY2VzLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQgJiYgc2l6ZS1zdGFydGluZ1Bvc2l0aW9uSW5DYXNjYWRlID4gMgorCQkJPyBBbGlnbm1lbnQuUl9PVVRFUk1PU1QKKwkJCTogQWxpZ25tZW50LlJfSU5ORVJNT1NUOwogCQlBbGlnbm1lbnQgY2FzY2FkaW5nTWVzc2FnZVNlbmRBbGlnbm1lbnQgPQogCQkJdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAotCQkJCSJjYXNjYWRpbmdNZXNzYWdlU2VuZEFsaWdubWVudCIsIC8vJE5PTi1OTFMtMSQKKwkJCQlBbGlnbm1lbnQuQ0FTQ0FESU5HX01FU1NBR0VfU0VORCwKIAkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb24sCi0JCQkJQWxpZ25tZW50LlJfSU5ORVJNT1NULAorCQkJCXRpZUJyZWFrUnVsZSwKIAkJCQlzaXplLAogCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKIAkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQoY2FzY2FkaW5nTWVzc2FnZVNlbmRBbGlnbm1lbnQpOwogCQlib29sZWFuIG9rID0gZmFsc2U7CisJCWJvb2xlYW4gc2V0U3RhcnRpbmdDb2x1bW4gPSB0cnVlOworCQlzd2l0Y2ggKHRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24gJiBBbGlnbm1lbnQuU1BMSVRfTUFTSykgeworCQkJY2FzZSBBbGlnbm1lbnQuTV9DT01QQUNUX0ZJUlNUX0JSRUFLX1NQTElUOgorCQkJY2FzZSBBbGlnbm1lbnQuTV9ORVhUX1NISUZURURfU1BMSVQ6CisJCQljYXNlIEFsaWdubWVudC5NX09ORV9QRVJfTElORV9TUExJVDoKKwkJCQlzZXRTdGFydGluZ0NvbHVtbiA9IGZhbHNlOworCQkJCWJyZWFrOworCQl9CiAJCWRvIHsKKwkJCWlmIChzZXRTdGFydGluZ0NvbHVtbikgeworCQkJCWNhc2NhZGluZ01lc3NhZ2VTZW5kQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gdGhpcy5zY3JpYmUuY29sdW1uOworCQkJfQogCQkJdHJ5IHsKIAkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGNhc2NhZGluZ01lc3NhZ2VTZW5kQWxpZ25tZW50LCAwKTsKIAkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpOwpAQCAtMTM4Miw3ICsxNDUyLDcgQEAKIAkJCQkJfQogCQkJCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IGN1cnJlbnRNZXNzYWdlU2VuZC50eXBlQXJndW1lbnRzOwogCQkJCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7IAorCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQkJCQl9CkBAIC0xMzkyLDExICsxNDYyLDExIEBACiAJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQkJCQkJCX0JCQkJCisJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJdHlwZUFyZ3VtZW50c1tsZW5ndGggLSAxXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJCQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7Ci0JCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOyAKKwkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJCQkJfQogCQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKQEAgLTE0MTAsMjYgKzE0ODAsMzkgQEAKIAkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQkJfQogCQkJCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQkJCWludCBhbGlnbm1lbnRNb2RlID0gdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbjsKIAkJCQkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCQkJCSJtZXNzYWdlQXJndW1lbnRzIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uLAorCQkJCQkJCQlBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFMsCisJCQkJCQkJCWFsaWdubWVudE1vZGUsCiAJCQkJCQkJCUFsaWdubWVudC5SX09VVEVSTU9TVCwKIAkJCQkJCQkJYXJndW1lbnRMZW5ndGgsCiAJCQkJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKIAkJCQkJCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KGFyZ3VtZW50c0FsaWdubWVudCk7CiAJCQkJCQlib29sZWFuIG9rRm9yQXJndW1lbnRzID0gZmFsc2U7CiAJCQkJCQlkbyB7CisJCQkJCQkJc3dpdGNoIChhbGlnbm1lbnRNb2RlICYgQWxpZ25tZW50LlNQTElUX01BU0spIHsKKwkJCQkJCQkJY2FzZSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOgorCQkJCQkJCQljYXNlIEFsaWdubWVudC5NX05FWFRfUEVSX0xJTkVfU1BMSVQ6CisJCQkJCQkJCQlhcmd1bWVudHNBbGlnbm1lbnQuc3RhcnRpbmdDb2x1bW4gPSB0aGlzLnNjcmliZS5jb2x1bW47CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CiAJCQkJCQkJdHJ5IHsKIAkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmd1bWVudExlbmd0aDsgaisrKSB7CiAJCQkJCQkJCQlpZiAoaiA+IDApIHsKIAkJCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyk7Ci0JCQkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYXJndW1lbnRzQWxpZ25tZW50LCBqKTsKLQkJCQkJCQkJCWlmIChqID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpIHsKKwkJCQkJCQkJCWlmIChqID09IDApIHsKKwkJCQkJCQkJCQlpbnQgZnJhZ21lbnRJbmRlbnRhdGlvbiA9IGFyZ3VtZW50c0FsaWdubWVudC5mcmFnbWVudEluZGVudGF0aW9uc1tqXTsKKwkJCQkJCQkJCQlpZiAoKGFyZ3VtZW50c0FsaWdubWVudC5tb2RlICYgQWxpZ25tZW50Lk1fSU5ERU5UX09OX0NPTFVNTikgIT0gMCAmJiBmcmFnbWVudEluZGVudGF0aW9uID4gMCkgeworCQkJCQkJCQkJCQl0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsID0gZnJhZ21lbnRJbmRlbnRhdGlvbjsKKwkJCQkJCQkJCQl9CQorCQkJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpIHsKIAkJCQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQkJCQkJfQogCQkJCQkJCQkJYXJndW1lbnRzW2pdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQkJCQkJCWFyZ3VtZW50c0FsaWdubWVudC5zdGFydGluZ0NvbHVtbiA9IC0xOwogCQkJCQkJCQl9CiAJCQkJCQkJCW9rRm9yQXJndW1lbnRzID0gdHJ1ZTsKIAkJCQkJCQl9IGNhdGNoIChBbGlnbm1lbnRFeGNlcHRpb24gZSkgewpAQCAtMTQ0NCw2ICsxNTI3LDcgQEAKIAkJCQkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnRNZXNzYWdlU2VuZCwgbnVtYmVyT2ZQYXJlbnMpOwogCQkJCQl9CisJCQkJCWNhc2NhZGluZ01lc3NhZ2VTZW5kQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gLTE7CiAJCQkJCWlmIChpIDwgc2l6ZSAtIDEpIHsKIAkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoY2FzY2FkaW5nTWVzc2FnZVNlbmRBbGlnbm1lbnQsIGkpOwogCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UKTsKQEAgLTE0NTMsMTAgKzE1MzcsMTAgQEAKIAkJCX0gY2F0Y2goQWxpZ25tZW50RXhjZXB0aW9uIGUpewogCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQl9Ci0JCX0gd2hpbGUgKCFvayk7CQkKKwkJfSB3aGlsZSAoIW9rKTsKIAkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChjYXNjYWRpbmdNZXNzYWdlU2VuZEFsaWdubWVudCwgdHJ1ZSk7CiAJfQotCQorCiAJLyoKIAkgKiBNZXJnZWQgdHJhdmVyc2FsIG9mIG1lbWJlciAodHlwZXMsIGZpZWxkcywgbWV0aG9kcykKIAkgKi8KQEAgLTE0NjQsNyArMTU0OCwxMSBAQAogCQlmaW5hbCBpbnQgRklFTEQgPSAxLCBNRVRIT0QgPSAyLCBUWVBFID0gMzsKIAkJdGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPSAxOwogCQlBU1ROb2RlW10gbWVyZ2VkTm9kZXMgPSBjb21wdXRlTWVyZ2VkTWVtYmVyRGVjbGFyYXRpb25zKG5vZGVzKTsKLQkJQWxpZ25tZW50IG1lbWJlckFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZU1lbWJlckFsaWdubWVudCgidHlwZU1lbWJlcnMiLCB0aGlzLnByZWZlcmVuY2VzLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zID8gQWxpZ25tZW50Lk1fTVVMVElDT0xVTU4gOiBBbGlnbm1lbnQuTV9OT19BTElHTk1FTlQsIDQsIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQlBbGlnbm1lbnQgbWVtYmVyQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlTWVtYmVyQWxpZ25tZW50KAorCQkJCUFsaWdubWVudC5UWVBFX01FTUJFUlMsCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyA/IEFsaWdubWVudC5NX01VTFRJQ09MVU1OIDogQWxpZ25tZW50Lk1fTk9fQUxJR05NRU5ULAorCQkJCTQsCisJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogCQl0aGlzLnNjcmliZS5lbnRlck1lbWJlckFsaWdubWVudChtZW1iZXJBbGlnbm1lbnQpOwogCQlib29sZWFuIGlzQ2h1bmtTdGFydCA9IGZhbHNlOwogCQlib29sZWFuIG9rID0gZmFsc2U7CkBAIC0xNTAxLDkgKzE1ODksOSBAQAogCQkJCQkJaXNDaHVua1N0YXJ0ID0gbWVtYmVyQWxpZ25tZW50LmNoZWNrQ2h1bmtTdGFydChUWVBFLCBpLCB0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CiAJCQkJCQlmb3JtYXQoKFR5cGVEZWNsYXJhdGlvbiltZW1iZXIsIG51bGwsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKIAkJCQkJfQotCQkJCQlpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OKSkgeworCQkJCQl3aGlsZSAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OKSkgewogCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJfQogCQkJCQlpZiAoaSAhPSBtYXggLSAxKSB7CiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKQEAgLTE1MTQsNyArMTYwMiw3IEBACiAJCQkJc3RhcnRJbmRleCA9IG1lbWJlckFsaWdubWVudC5jaHVua1N0YXJ0SW5kZXg7CiAJCQkJdGhpcy5zY3JpYmUucmVkb01lbWJlckFsaWdubWVudChlKTsKIAkJCX0KLQkJfSB3aGlsZSAoIW9rKTsJCQorCQl9IHdoaWxlICghb2spOwogCQl0aGlzLnNjcmliZS5leGl0TWVtYmVyQWxpZ25tZW50KG1lbWJlckFsaWdubWVudCk7CiAJCWlmIChoYXNDb21tZW50cygpKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKQEAgLTE1MjcsNyArMTYxNSw3IEBACiAJCXdoaWxlKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTikpIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJfQogCQlpZiAoaGFzU2VtaUNvbG9uICYmIGlzRmlyc3QpIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwpAQCAtMTU0Miw0NSArMTYzMCw0NSBAQAogCQlmaW5hbCBTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50czsKIAkJc3RhdGVtZW50c1swXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSwgdHJ1ZSk7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCX0KIAotICAgIHByaXZhdGUgdm9pZCBmb3JtYXRMZWZ0Q3VybHlCcmFjZShmaW5hbCBpbnQgbGluZSwgZmluYWwgU3RyaW5nIGJyYWNlUG9zaXRpb24pIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogZGVhbCB3aXRoIChxdWl0ZSB1bmV4cGVjdGVkKSBjb21tZW50cyByaWdodCBiZWZvcmUgbGN1cmx5Ci0gICAgICAgICAqLwotICAgICAgICB0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKLSAgICAgICAgaWYgKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLk5FWFRfTElORV9PTl9XUkFQLmVxdWFscyhicmFjZVBvc2l0aW9uKQotICAgICAgICAgICAgICAgICYmICh0aGlzLnNjcmliZS5saW5lID4gbGluZSB8fCB0aGlzLnNjcmliZS5jb2x1bW4gPj0gdGhpcy5wcmVmZXJlbmNlcy5wYWdlX3dpZHRoKSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAorCXByaXZhdGUgdm9pZCBmb3JtYXRMZWZ0Q3VybHlCcmFjZShmaW5hbCBpbnQgbGluZSwgZmluYWwgU3RyaW5nIGJyYWNlUG9zaXRpb24pIHsKKwkJLyoKKwkJICogZGVhbCB3aXRoIChxdWl0ZSB1bmV4cGVjdGVkKSBjb21tZW50cyByaWdodCBiZWZvcmUgbGN1cmx5CisJCSAqLworCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoU2NyaWJlLlBSRVNFUlZFX0VNUFRZX0xJTkVTX0lOX0ZPUk1BVF9MRUZUX0NVUkxZX0JSQUNFKTsKKwkJaWYgKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLk5FWFRfTElORV9PTl9XUkFQLmVxdWFscyhicmFjZVBvc2l0aW9uKQorCQkJCSYmICh0aGlzLnNjcmliZS5saW5lID4gbGluZSB8fCB0aGlzLnNjcmliZS5jb2x1bW4gPj0gdGhpcy5wcmVmZXJlbmNlcy5wYWdlX3dpZHRoKSkKKwkJeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCX0KKwl9CisKIAlwcml2YXRlIHZvaWQgZm9ybWF0TG9jYWxEZWNsYXJhdGlvbihMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gaW5zZXJ0U3BhY2VCZWZvcmVDb21tYSwgYm9vbGVhbiBpbnNlcnRTcGFjZUFmdGVyQ29tbWEpIHsKIAogCQlpZiAoIWlzTXVsdGlwbGVMb2NhbERlY2xhcmF0aW9uKGxvY2FsRGVjbGFyYXRpb24pKSB7CiAJCQlpZiAobG9jYWxEZWNsYXJhdGlvbi5tb2RpZmllcnMgIT0gTk9fTU9ESUZJRVJTIHx8IGxvY2FsRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkgICAgICAgIHRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwotCQkJCXRoaXMuc2NyaWJlLnByaW50TW9kaWZpZXJzKGxvY2FsRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHRoaXMpOworCQkJCXRoaXMuc2NyaWJlLnByaW50TW9kaWZpZXJzKGxvY2FsRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsIHRoaXMsIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fTE9DQUxfVkFSSUFCTEUpOwogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQl9Ci0JCisKIAkJCS8qCi0JCQkgKiBBcmd1bWVudCB0eXBlIAotCQkJICovCQkKKwkJCSAqIEFyZ3VtZW50IHR5cGUKKwkJCSAqLwogCQkJaWYgKGxvY2FsRGVjbGFyYXRpb24udHlwZSAhPSBudWxsKSB7CiAJCQkJbG9jYWxEZWNsYXJhdGlvbi50eXBlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCX0KIAkJCS8qCiAJCQkgKiBQcmludCB0aGUgYXJndW1lbnQgbmFtZQogCQkgCSovCi0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsgCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBQcmludCB0aGUgYXJndW1lbnQgbmFtZQogCQkgCSovCi0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCBmYWxzZSk7IAorCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciwgZmFsc2UpOwogCQl9CiAJCS8qCiAJCSAqIENoZWNrIGZvciBleHRyYSBkaW1lbnNpb25zCkBAIC0xNTkyLDE3ICsxNjgwLDIyIEBACiAJCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCSB9CiAJCX0KLQkKKwogCQlmaW5hbCBFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uID0gbG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbjsKIAkJaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKIAkJCS8qCiAJCQkgKiBQcmludCB0aGUgbWV0aG9kIG5hbWUKLQkJCSAqLwkKKwkJCSAqLwogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRVFVQUwsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yKTsKIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yKSB7CiAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCX0KLQkJCUFsaWdubWVudCBhc3NpZ25tZW50QWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KCJsb2NhbERlY2xhcmF0aW9uQXNzaWdubWVudEFsaWdubWVudCIsIHRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50LCBBbGlnbm1lbnQuUl9PVVRFUk1PU1QsIDEsIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJQWxpZ25tZW50IGFzc2lnbm1lbnRBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCUFsaWdubWVudC5MT0NBTF9ERUNMQVJBVElPTl9BU1NJR05NRU5ULAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCwKKwkJCQkJQWxpZ25tZW50LlJfT1VURVJNT1NULAorCQkJCQkxLAorCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CiAJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhc3NpZ25tZW50QWxpZ25tZW50KTsKIAkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAkJCWRvIHsKQEAgLTE2MTMsMTYgKzE3MDYsMTYgQEAKIAkJCQl9IGNhdGNoKEFsaWdubWVudEV4Y2VwdGlvbiBlKXsKIAkJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKIAkJCQl9Ci0JCQl9IHdoaWxlICghb2spOwkJCi0JCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFzc2lnbm1lbnRBbGlnbm1lbnQsIHRydWUpOwkJCQorCQkJfSB3aGlsZSAoIW9rKTsKKwkJCXRoaXMuc2NyaWJlLmV4aXRBbGlnbm1lbnQoYXNzaWdubWVudEFsaWdubWVudCwgdHJ1ZSk7CiAJCX0KIAogCQlpZiAoaXNQYXJ0T2ZNdWx0aXBsZUxvY2FsRGVjbGFyYXRpb24oKSkgewotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIGluc2VydFNwYWNlQmVmb3JlQ29tbWEpOyAKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCBpbnNlcnRTcGFjZUJlZm9yZUNvbW1hKTsKIAkJCWlmIChpbnNlcnRTcGFjZUFmdGVyQ29tbWEpIHsKIAkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJfQotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQl9CiAJfQogCkBAIC0xNjMyLDEyICsxNzI1LDE0IEBACiAJCUFsaWdubWVudCBtZXNzYWdlQWxpZ25tZW50KSB7CiAKIAkJaWYgKG1lc3NhZ2VBbGlnbm1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChtZXNzYWdlQWxpZ25tZW50LCAwKTsKKwkJCWlmICghdGhpcy5wcmVmZXJlbmNlcy53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkIHx8IG1lc3NhZ2VBbGlnbm1lbnQuY2FuQWxpZ24oKSkgeworCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQobWVzc2FnZUFsaWdubWVudCwgMCk7CisJCQl9CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpOwogCQl9CiAJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbWVzc2FnZVNlbmQudHlwZUFyZ3VtZW50czsKIAkJaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOyAKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsKIAkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQkJfQpAQCAtMTY0NywxMSArMTc0MiwxMSBAQAogCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzKTsKIAkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzKSB7CiAJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJCQl9CQkJCQorCQkJCQl9CiAJCQkJfQogCQkJCXR5cGVBcmd1bWVudHNbbGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJCWlmIChpc0Nsb3NpbmdHZW5lcmljVG9rZW4oKSkgewotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsgCisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCX0KIAkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CkBAIC0xNjY3LDI1ICsxNzYyLDQ4IEBACiAJCQl9CiAJCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJCWlmIChhcmd1bWVudHNMZW5ndGggPiAxKSB7CisJCQkJaW50IGFsaWdubWVudE1vZGUgPSB0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uOwogCQkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCQkibWVzc2FnZUFyZ3VtZW50cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24sCisJCQkJCQlBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFMsCisJCQkJCQlhbGlnbm1lbnRNb2RlLAogCQkJCQkJYXJndW1lbnRzTGVuZ3RoLAogCQkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogCQkJCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KGFyZ3VtZW50c0FsaWdubWVudCk7CiAJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQkJCWRvIHsKKwkJCQkJc3dpdGNoIChhbGlnbm1lbnRNb2RlICYgQWxpZ25tZW50LlNQTElUX01BU0spIHsKKwkJCQkJCWNhc2UgQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDoKKwkJCQkJCWNhc2UgQWxpZ25tZW50Lk1fTkVYVF9QRVJfTElORV9TUExJVDoKKwkJCQkJCQlhcmd1bWVudHNBbGlnbm1lbnQuc3RhcnRpbmdDb2x1bW4gPSB0aGlzLnNjcmliZS5jb2x1bW47CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KIAkJCQkJdHJ5IHsKIAkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKIAkJCQkJCQlpZiAoaSA+IDApIHsKIAkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpOwotCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCQkJaWYgKHRoaXMuc2NyaWJlLmxhc3ROdW1iZXJPZk5ld0xpbmVzID09IDEpIHsKKwkJCQkJCQkJCS8vIGEgbmV3IGxpbmUgaGFzIGJlZW4gaW5zZXJ0ZWQgd2hpbGUgcHJpbnRpbmcgdGhlIGNvbW1lbnQKKwkJCQkJCQkJCS8vIGhlbmNlIHdlIG5lZWQgdG8gdXNlIHRoZSBicmVhayBpbmRlbnRhdGlvbiBsZXZlbCBiZWZvcmUgcHJpbnRpbmcgbmV4dCB0b2tlbi4uLgorCQkJCQkJCQkJdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbCA9IGFyZ3VtZW50c0FsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWw7CisJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcmd1bWVudHNBbGlnbm1lbnQsIGkpOwogCQkJCQkJCWlmIChpID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpIHsKIAkJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQkJCQl9CisJCQkJCQkJaW50IGZyYWdtZW50SW5kZW50YXRpb24gPSAwOworCQkJCQkJCWlmIChpID09IDApIHsKKwkJCQkJCQkJaW50IHdyYXBwZWRJbmRleCA9IGFyZ3VtZW50c0FsaWdubWVudC53cmFwcGVkSW5kZXgoKTsKKwkJCQkJCQkJaWYgKHdyYXBwZWRJbmRleCA+PSAwKSB7CisJCQkJCQkJCQlmcmFnbWVudEluZGVudGF0aW9uID0gYXJndW1lbnRzQWxpZ25tZW50LmZyYWdtZW50SW5kZW50YXRpb25zW3dyYXBwZWRJbmRleF07CisJCQkJCQkJCQlpZiAoKGFyZ3VtZW50c0FsaWdubWVudC5tb2RlICYgQWxpZ25tZW50Lk1fSU5ERU5UX09OX0NPTFVNTikgIT0gMCAmJiBmcmFnbWVudEluZGVudGF0aW9uID4gMCkgeworCQkJCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSBmcmFnbWVudEluZGVudGF0aW9uOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQogCQkJCQkJCWFyZ3VtZW50c1tpXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CisJCQkJCQkJYXJndW1lbnRzQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gLTE7CiAJCQkJCQl9CiAJCQkJCQlvayA9IHRydWU7CiAJCQkJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7CkBAIC0xNjk0LDM1ICsxODEyLDk1IEBACiAJCQkJfSB3aGlsZSAoIW9rKTsKIAkJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFyZ3VtZW50c0FsaWdubWVudCwgdHJ1ZSk7CiAJCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyk7Ci0JCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChpID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMpIHsKLQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQkJCX0KLQkJCQkJYXJndW1lbnRzW2ldLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQl9CisJCQkJYXJndW1lbnRzWzBdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCX0KLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24pOyAKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24pOwogCQl9IGVsc2UgewogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbik7CiAJCX0KIAl9CiAKKwlwcml2YXRlIHZvaWQgZm9ybWF0VHJ5UmVzb3VyY2VzKAorCQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCwKKwkJCWJvb2xlYW4gc3BhY2VCZWZvcmVPcGVuUGFyZW4sCisJCQlib29sZWFuIHNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuLAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUZpcnN0UmVzb3VyY2UsCisJCQlib29sZWFuIHNwYWNlQmVmb3JlU2VtaWNvbG9uLAorCQkJYm9vbGVhbiBzcGFjZUFmdGVyU2VtaWNvbG9uLAorCQkJaW50IHRyeVJlc291cmNlc0FsaWdtZW50KSB7CisKKwkJTG9jYWxEZWNsYXJhdGlvbltdIHJlc291cmNlcyA9IHRyeVN0YXRlbWVudC5yZXNvdXJjZXM7CisJCWludCBsZW5ndGggPSByZXNvdXJjZXMgIT0gbnVsbCA/IHJlc291cmNlcy5sZW5ndGggOiAwOworCQlpZiAobGVuZ3RoID4gMCkgeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCBzcGFjZUJlZm9yZU9wZW5QYXJlbik7CisJCQlpZiAoc3BhY2VCZWZvcmVGaXJzdFJlc291cmNlKSB7CisJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCX0KKwkJCUFsaWdubWVudCByZXNvdXJjZXNBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCUFsaWdubWVudC5UUllfUkVTT1VSQ0VTLAorCQkJCQl0cnlSZXNvdXJjZXNBbGlnbWVudCwKKwkJCQkJLy8gbWFrZSBzdXJlIGFsaWdubWVudCBvcHRpb25zIGZvciB0cnkgd2l0aCByZXNvdXJjZXMgdGFrZXMgcHJlY2VkZW5jZQorCQkJCQlBbGlnbm1lbnQuUl9PVVRFUk1PU1QsCisJCQkJCWxlbmd0aCwKKwkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOworCQkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQocmVzb3VyY2VzQWxpZ25tZW50KTsKKwkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKKwkJCWRvIHsKKwkJCQlzd2l0Y2ggKHRyeVJlc291cmNlc0FsaWdtZW50ICYgQWxpZ25tZW50LlNQTElUX01BU0spIHsKKwkJCQkJY2FzZSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOgorCQkJCQljYXNlIEFsaWdubWVudC5NX05FWFRfUEVSX0xJTkVfU1BMSVQ6CisJCQkJCQlyZXNvdXJjZXNBbGlnbm1lbnQuc3RhcnRpbmdDb2x1bW4gPSB0aGlzLnNjcmliZS5jb2x1bW47CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdHJ5IHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCBzcGFjZUJlZm9yZVNlbWljb2xvbik7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CisJCQkJCQkJaWYgKHRoaXMuc2NyaWJlLmxhc3ROdW1iZXJPZk5ld0xpbmVzID09IDEpIHsKKwkJCQkJCQkJLy8gYSBuZXcgbGluZSBoYXMgYmVlbiBpbnNlcnRlZCB3aGlsZSBwcmludGluZyB0aGUgY29tbWVudAorCQkJCQkJCQkvLyBoZW5jZSB3ZSBuZWVkIHRvIHVzZSB0aGUgYnJlYWsgaW5kZW50YXRpb24gbGV2ZWwgYmVmb3JlIHByaW50aW5nIG5leHQgdG9rZW4uLi4KKwkJCQkJCQkJdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbCA9IHJlc291cmNlc0FsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWw7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChyZXNvdXJjZXNBbGlnbm1lbnQsIGkpOworCQkJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkJCWludCBmcmFnbWVudEluZGVudGF0aW9uID0gcmVzb3VyY2VzQWxpZ25tZW50LmZyYWdtZW50SW5kZW50YXRpb25zWzBdOworCQkJCQkJCWlmICgocmVzb3VyY2VzQWxpZ25tZW50Lm1vZGUgJiBBbGlnbm1lbnQuTV9JTkRFTlRfT05fQ09MVU1OKSAhPSAwICYmIGZyYWdtZW50SW5kZW50YXRpb24gPiAwKSB7CisJCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSBmcmFnbWVudEluZGVudGF0aW9uOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoc3BhY2VBZnRlclNlbWljb2xvbikgeworCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQl9CisJCQkJCQlyZXNvdXJjZXNbaV0udHJhdmVyc2UodGhpcywgbnVsbCk7CisJCQkJCQlyZXNvdXJjZXNBbGlnbm1lbnQuc3RhcnRpbmdDb2x1bW4gPSAtMTsKKwkJCQkJfQorCQkJCQlvayA9IHRydWU7CisJCQkJfSBjYXRjaCAoQWxpZ25tZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKKwkJCQl9CisJCQl9IHdoaWxlICghb2spOworCQkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTikpIHsKKwkJCQkvLyB0YWtlIGNhcmUgb2YgdHJhaWxpbmcgc2VtaWNvbG9uCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCBzcGFjZUJlZm9yZVNlbWljb2xvbik7CisJCQl9CisJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KHJlc291cmNlc0FsaWdubWVudCwgdHJ1ZSk7CisKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgc3BhY2VCZWZvcmVDbG9zaW5nUGFyZW4pOworCQl9CisJfQogCXByaXZhdGUgdm9pZCBmb3JtYXRNZXRob2RBcmd1bWVudHMoCi0JCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCAKLQkJCWJvb2xlYW4gc3BhY2VCZWZvcmVPcGVuUGFyZW4sIAorCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKKwkJCWJvb2xlYW4gc3BhY2VCZWZvcmVPcGVuUGFyZW4sCiAJCQlib29sZWFuIHNwYWNlQmV0d2VlbkVtcHR5UGFyYW1ldGVycywKLQkJCWJvb2xlYW4gc3BhY2VCZWZvcmVDbG9zaW5nUGFyZW4sIAotCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUZpcnN0UGFyYW1ldGVyLCAKLQkJCWJvb2xlYW4gc3BhY2VCZWZvcmVDb21tYSwgCisJCQlib29sZWFuIHNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuLAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUZpcnN0UGFyYW1ldGVyLAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUNvbW1hLAogCQkJYm9vbGVhbiBzcGFjZUFmdGVyQ29tbWEsCiAJCQlpbnQgbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzQWxpZ25tZW50KSB7Ci0JCQkJCi0JCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgc3BhY2VCZWZvcmVPcGVuUGFyZW4pOyAKLQkJCisKKwkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCBzcGFjZUJlZm9yZU9wZW5QYXJlbik7CisKIAkJZmluYWwgQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHM7CiAJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogCQkJaWYgKHNwYWNlQmVmb3JlRmlyc3RQYXJhbWV0ZXIpIHsKQEAgLTE3MzAsMjQgKzE5MDgsNDEgQEAKIAkJCX0KIAkJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAJCQlBbGlnbm1lbnQgYXJndW1lbnRzQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAotCQkJCQkibWV0aG9kQXJndW1lbnRzIiwvLyROT04tTkxTLTEkCisJCQkJCUFsaWdubWVudC5NRVRIT0RfQVJHVU1FTlRTLAogCQkJCQltZXRob2REZWNsYXJhdGlvblBhcmFtZXRlcnNBbGlnbm1lbnQsCiAJCQkJCWFyZ3VtZW50TGVuZ3RoLAogCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CiAJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhcmd1bWVudHNBbGlnbm1lbnQpOwogCQkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQkJZG8geworCQkJCXN3aXRjaCAobWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzQWxpZ25tZW50ICYgQWxpZ25tZW50LlNQTElUX01BU0spIHsKKwkJCQkJY2FzZSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOgorCQkJCQljYXNlIEFsaWdubWVudC5NX05FWFRfUEVSX0xJTkVfU1BMSVQ6CisJCQkJCQlhcmd1bWVudHNBbGlnbm1lbnQuc3RhcnRpbmdDb2x1bW4gPSB0aGlzLnNjcmliZS5jb2x1bW47CisJCQkJCQlicmVhazsKKwkJCQl9CiAJCQkJdHJ5IHsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAoaSA+IDApIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgc3BhY2VCZWZvcmVDb21tYSk7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCQlpZiAodGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPT0gMSkgeworCQkJCQkJCQkvLyBhIG5ldyBsaW5lIGhhcyBiZWVuIGluc2VydGVkIHdoaWxlIHByaW50aW5nIHRoZSBjb21tZW50CisJCQkJCQkJCS8vIGhlbmNlIHdlIG5lZWQgdG8gdXNlIHRoZSBicmVhayBpbmRlbnRhdGlvbiBsZXZlbCBiZWZvcmUgcHJpbnRpbmcgbmV4dCB0b2tlbi4uLgorCQkJCQkJCQl0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsID0gYXJndW1lbnRzQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGFyZ3VtZW50c0FsaWdubWVudCwgaSk7Ci0JCQkJCQlpZiAoaSA+IDAgJiYgc3BhY2VBZnRlckNvbW1hKSB7CisJCQkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCQkJaW50IGZyYWdtZW50SW5kZW50YXRpb24gPSBhcmd1bWVudHNBbGlnbm1lbnQuZnJhZ21lbnRJbmRlbnRhdGlvbnNbMF07CisJCQkJCQkJaWYgKChhcmd1bWVudHNBbGlnbm1lbnQubW9kZSAmIEFsaWdubWVudC5NX0lOREVOVF9PTl9DT0xVTU4pICE9IDAgJiYgZnJhZ21lbnRJbmRlbnRhdGlvbiA+IDApIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbCA9IGZyYWdtZW50SW5kZW50YXRpb247CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChzcGFjZUFmdGVyQ29tbWEpIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQkJfQogCQkJCQkJYXJndW1lbnRzW2ldLnRyYXZlcnNlKHRoaXMsIG1ldGhvZERlY2xhcmF0aW9uLnNjb3BlKTsKKwkJCQkJCWFyZ3VtZW50c0FsaWdubWVudC5zdGFydGluZ0NvbHVtbiA9IC0xOwogCQkJCQl9CiAJCQkJCW9rID0gdHJ1ZTsKIAkJCQl9IGNhdGNoIChBbGlnbm1lbnRFeGNlcHRpb24gZSkgewpAQCAtMTc1NSwzMyArMTk1MCwzMyBAQAogCQkJCX0KIAkJCX0gd2hpbGUgKCFvayk7CiAJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFyZ3VtZW50c0FsaWdubWVudCwgdHJ1ZSk7Ci0JCQotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCBzcGFjZUJlZm9yZUNsb3NpbmdQYXJlbik7IAorCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgc3BhY2VCZXR3ZWVuRW1wdHlQYXJhbWV0ZXJzKTsgCi0JCX0JCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHNwYWNlQmV0d2VlbkVtcHR5UGFyYW1ldGVycyk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgZm9ybWF0RW51bUNvbnN0YW50QXJndW1lbnRzKAogCQkJRmllbGREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnQsCi0JCQlib29sZWFuIHNwYWNlQmVmb3JlT3BlblBhcmVuLCAKKwkJCWJvb2xlYW4gc3BhY2VCZWZvcmVPcGVuUGFyZW4sCiAJCQlib29sZWFuIHNwYWNlQmV0d2VlbkVtcHR5UGFyYW1ldGVycywKLQkJCWJvb2xlYW4gc3BhY2VCZWZvcmVDbG9zaW5nUGFyZW4sIAotCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUZpcnN0UGFyYW1ldGVyLCAKLQkJCWJvb2xlYW4gc3BhY2VCZWZvcmVDb21tYSwgCisJCQlib29sZWFuIHNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuLAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUZpcnN0UGFyYW1ldGVyLAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZUNvbW1hLAogCQkJYm9vbGVhbiBzcGFjZUFmdGVyQ29tbWEsCiAJCQlpbnQgbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzQWxpZ25tZW50KSB7Ci0JCQkJCisKIAkJaWYgKCFpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4pKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJCi0JCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgc3BhY2VCZWZvcmVPcGVuUGFyZW4pOyAKKworCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHNwYWNlQmVmb3JlT3BlblBhcmVuKTsKIAkJZmluYWwgRXhwcmVzc2lvbltdIGFyZ3VtZW50cyA9ICgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGVudW1Db25zdGFudC5pbml0aWFsaXphdGlvbikuYXJndW1lbnRzOwogCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAJCQlBbGlnbm1lbnQgYXJndW1lbnRzQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAotCQkJCQkiZW51bUNvbnN0YW50QXJndW1lbnRzIiwvLyROT04tTkxTLTEkCisJCQkJCUFsaWdubWVudC5FTlVNX0NPTlNUQU5UU19BUkdVTUVOVFMsCiAJCQkJCW1ldGhvZERlY2xhcmF0aW9uUGFyYW1ldGVyc0FsaWdubWVudCwKIAkJCQkJYXJndW1lbnRMZW5ndGgsCiAJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKQEAgLTE3OTUsNyArMTk5MCw3IEBACiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRMZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKGkgPiAwKSB7CiAJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHNwYWNlQmVmb3JlQ29tbWEpOwotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCQl9CiAJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGFyZ3VtZW50c0FsaWdubWVudCwgaSk7CiAJCQkJCQlpZiAoaSA+IDAgJiYgc3BhY2VBZnRlckNvbW1hKSB7CkBAIC0xODA5LDExICsyMDA0LDExIEBACiAJCQkJfQogCQkJfSB3aGlsZSAoIW9rKTsKIAkJCXRoaXMuc2NyaWJlLmV4aXRBbGlnbm1lbnQoYXJndW1lbnRzQWxpZ25tZW50LCB0cnVlKTsKLQkJCi0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuKTsgCisKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgc3BhY2VCZWZvcmVDbG9zaW5nUGFyZW4pOwogCQl9IGVsc2UgewotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCBzcGFjZUJldHdlZW5FbXB0eVBhcmFtZXRlcnMpOyAKLQkJfQkKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgc3BhY2VCZXR3ZWVuRW1wdHlQYXJhbWV0ZXJzKTsKKwkJfQogCX0KIAogCXByaXZhdGUgdm9pZCBmb3JtYXROZWNlc3NhcnlFbXB0eVN0YXRlbWVudCgpIHsKQEAgLTE4MjEsMjUgKzIwMTYsMjQgQEAKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCQkJdGhpcy5zY3JpYmUuaW5kZW50KCk7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCX0KIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdE9wZW5pbmdCcmFjZShTdHJpbmcgYnJhY2VQb3NpdGlvbiwgYm9vbGVhbiBpbnNlcnRTcGFjZUJlZm9yZUJyYWNlKSB7Ci0JCi0JCWlmIChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkUuZXF1YWxzKGJyYWNlUG9zaXRpb24pKSB7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKLQkJfSBlbHNlIGlmIChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkVfU0hJRlRFRC5lcXVhbHMoYnJhY2VQb3NpdGlvbikpIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwotCQkJdGhpcy5zY3JpYmUuaW5kZW50KCk7Ci0JCX0KLQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFLCBpbnNlcnRTcGFjZUJlZm9yZUJyYWNlKTsKIAotCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCXByaXZhdGUgdm9pZCBmb3JtYXRPcGVuaW5nQnJhY2UoU3RyaW5nIGJyYWNlUG9zaXRpb24sIGJvb2xlYW4gaW5zZXJ0U3BhY2VCZWZvcmVCcmFjZSkgeworCisJCQlpZiAoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuTkVYVF9MSU5FLmVxdWFscyhicmFjZVBvc2l0aW9uKSkgeworCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJfSBlbHNlIGlmIChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkVfU0hJRlRFRC5lcXVhbHMoYnJhY2VQb3NpdGlvbikpIHsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKKwkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKKwkJCX0KKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSwgaW5zZXJ0U3BhY2VCZWZvcmVCcmFjZSwgU2NyaWJlLlBSRVNFUlZFX0VNUFRZX0xJTkVTX0lOX0ZPUk1BVF9PUEVOSU5HX0JSQUNFKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLlVOTU9ESUZJQUJMRV9UUkFJTElOR19DT01NRU5UKTsKIAl9CiAJcHJpdmF0ZSB2b2lkIGZvcm1hdFN0YXRlbWVudHMoQmxvY2tTY29wZSBzY29wZSwgZmluYWwgU3RhdGVtZW50W10gc3RhdGVtZW50cywgYm9vbGVhbiBpbnNlcnROZXdMaW5lQWZ0ZXJMYXN0U3RhdGVtZW50KSB7CiAJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CkBAIC0xODUxLDcgKzIwNDUsNyBAQAogCQkJc3RhdGVtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCWlmIChpICE9IHN0YXRlbWVudHNMZW5ndGggLSAxKSB7CiAJCQkJCWlmICghKHN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSAmJiAhKHN0YXRlbWVudHNbaSArIDFdIGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpKSB7CiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKQEAgLTE4NjIsMTQgKzIwNTYsMTQgQEAKIAkJCX0gZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgewogCQkJCUxvY2FsRGVjbGFyYXRpb24gY3VycmVudExvY2FsID0gKExvY2FsRGVjbGFyYXRpb24pIHN0YXRlbWVudDsKIAkJCQlpZiAoaSA8IChzdGF0ZW1lbnRzTGVuZ3RoIC0gMSkpIHsKLQkJCQkJLyogCisJCQkJCS8qCiAJCQkJCSAqIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbmV4dCBzdGF0ZW1lbnQgaXMgYSBsb2NhbCBkZWNsYXJhdGlvbgogCQkJCQkgKi8KIAkJCQkJaWYgKHN0YXRlbWVudHNbaSArIDFdIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgewogCQkJCQkJTG9jYWxEZWNsYXJhdGlvbiBuZXh0TG9jYWwgPSAoTG9jYWxEZWNsYXJhdGlvbikgc3RhdGVtZW50c1tpICsgMV07CiAJCQkJCQlpZiAoY3VycmVudExvY2FsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgIT0gbmV4dExvY2FsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQpIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCQkJaWYgKGkgIT0gc3RhdGVtZW50c0xlbmd0aCAtIDEpIHsKIAkJCQkJCQkJaWYgKCEoc3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpICYmICEoc3RhdGVtZW50c1tpICsgMV0gaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkpIHsKIAkJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwpAQCAtMTg4MCw3ICsyMDc0LDcgQEAKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCQlpZiAoaSAhPSBzdGF0ZW1lbnRzTGVuZ3RoIC0gMSkgewogCQkJCQkJCWlmICghKHN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSAmJiAhKHN0YXRlbWVudHNbaSArIDFdIGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpKSB7CiAJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwpAQCAtMTg5MSw3ICsyMDg1LDcgQEAKIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQlpZiAoaSAhPSBzdGF0ZW1lbnRzTGVuZ3RoIC0gMSkgewogCQkJCQkJaWYgKCEoc3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpICYmICEoc3RhdGVtZW50c1tpICsgMV0gaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkpIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKQEAgLTE5MDksMzMgKzIxMDMsMzMgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBmb3JtYXRUaHJvd3NDbGF1c2UoCiAJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sCiAJCWJvb2xlYW4gc3BhY2VCZWZvcmVDb21tYSwKIAkJYm9vbGVhbiBzcGFjZUFmdGVyQ29tbWEsCiAJCWludCBhbGlnbm1lbnRGb3JUaHJvd3NDbGF1c2UpIHsKLQkJCQorCiAJCWZpbmFsIFR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKIAkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgewogCQkJaW50IHRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKIAkJCUFsaWdubWVudCB0aHJvd3NBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCSJ0aHJvd3MiLC8vJE5PTi1OTFMtMSQKKwkJCQkJQWxpZ25tZW50LlRIUk9XUywKIAkJCQkJYWxpZ25tZW50Rm9yVGhyb3dzQ2xhdXNlLAogCQkJCQl0aHJvd25FeGNlcHRpb25zTGVuZ3RoLCAvLyB0aHJvd3MgaXMgdGhlIGZpcnN0IHRva2VuCiAJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKLQkJCisKIAkJCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KHRocm93c0FsaWdubWVudCk7CiAJCQlib29sZWFuIG9rID0gZmFsc2U7CiAJCQlkbyB7CiAJCQkJdHJ5IHsKIAkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudCh0aHJvd3NBbGlnbm1lbnQsIDApOwotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aHJvd3MsIHRydWUpOyAKLQkJCisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRocm93cywgdHJ1ZSk7CisKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd25FeGNlcHRpb25zTGVuZ3RoOyBpKyspIHsKIAkJCQkJCWlmIChpID4gMCkgewogCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCBzcGFjZUJlZm9yZUNvbW1hKTsKLQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQodGhyb3dzQWxpZ25tZW50LCBpKTsKIAkJCQkJCQlpZiAoc3BhY2VBZnRlckNvbW1hKSB7CiAJCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CkBAIC0xOTU4LDc1ICsyMTUyLDkxIEBACiAJICogTWVyZ2VkIHRyYXZlcnNhbCBvZiBtZW1iZXIgKHR5cGVzLCBmaWVsZHMsIG1ldGhvZHMpCiAJICovCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdFR5cGVNZW1iZXJzKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLQkJQWxpZ25tZW50IG1lbWJlckFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZU1lbWJlckFsaWdubWVudCgidHlwZU1lbWJlcnMiLCB0aGlzLnByZWZlcmVuY2VzLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zID8gQWxpZ25tZW50Lk1fTVVMVElDT0xVTU4gOiBBbGlnbm1lbnQuTV9OT19BTElHTk1FTlQsIDMsIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQlBbGlnbm1lbnQgbWVtYmVyQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlTWVtYmVyQWxpZ25tZW50KAorCQkJCUFsaWdubWVudC5UWVBFX01FTUJFUlMsCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyA/IEFsaWdubWVudC5NX01VTFRJQ09MVU1OIDogQWxpZ25tZW50Lk1fTk9fQUxJR05NRU5ULAorCQkJCTMsCisJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogCQl0aGlzLnNjcmliZS5lbnRlck1lbWJlckFsaWdubWVudChtZW1iZXJBbGlnbm1lbnQpOwogCQlBU1ROb2RlW10gbWVtYmVycyA9IGNvbXB1dGVNZXJnZWRNZW1iZXJEZWNsYXJhdGlvbnModHlwZURlY2xhcmF0aW9uKTsKIAkJYm9vbGVhbiBpc0NodW5rU3RhcnQgPSBmYWxzZTsKIAkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXgsIG1heCA9IG1lbWJlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJQVNUTm9kZSBtZW1iZXIgPSBtZW1iZXJzW2ldOwotCQkJCQlpZiAobWVtYmVyIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewotCQkJCQkJaXNDaHVua1N0YXJ0ID0gbWVtYmVyQWxpZ25tZW50LmNoZWNrQ2h1bmtTdGFydChBbGlnbm1lbnQuQ0hVTktfRklFTEQsIGksIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKLQkJCQkJCWlmIChtZW1iZXIgaW5zdGFuY2VvZiBNdWx0aUZpZWxkRGVjbGFyYXRpb24pIHsKLQkJCQkJCQlNdWx0aUZpZWxkRGVjbGFyYXRpb24gbXVsdGlGaWVsZCA9IChNdWx0aUZpZWxkRGVjbGFyYXRpb24pIG1lbWJlcjsKLQkJCQkJCQkKLQkJCQkJCQlpZiAobXVsdGlGaWVsZC5pc1N0YXRpYygpKSB7Ci0JCQkJCQkJCWZvcm1hdChtdWx0aUZpZWxkLCB0aGlzLCB0eXBlRGVjbGFyYXRpb24uc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwgaXNDaHVua1N0YXJ0LCBpID09IDApOworCQlpbnQgbWVtYmVyc0xlbmd0aCA9IG1lbWJlcnMubGVuZ3RoOworCQlpZiAobWVtYmVyc0xlbmd0aCA+IDApIHsKKwkJCWludCBzdGFydEluZGV4ID0gMDsKKwkJCWRvIHsKKwkJCQl0cnkgeworCQkJCQlmb3IgKGludCBpID0gc3RhcnRJbmRleCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkJd2hpbGUgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTikpIHsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOworCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQkJfQorCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCQkJCQlBU1ROb2RlIG1lbWJlciA9IG1lbWJlcnNbaV07CisJCQkJCQlpZiAobWVtYmVyIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQkJCQkJCWlzQ2h1bmtTdGFydCA9IG1lbWJlckFsaWdubWVudC5jaGVja0NodW5rU3RhcnQoQWxpZ25tZW50LkNIVU5LX0ZJRUxELCBpLCB0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisJCQkJCQkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIE11bHRpRmllbGREZWNsYXJhdGlvbikgeworCQkJCQkJCQlNdWx0aUZpZWxkRGVjbGFyYXRpb24gbXVsdGlGaWVsZCA9IChNdWx0aUZpZWxkRGVjbGFyYXRpb24pIG1lbWJlcjsKKwkKKwkJCQkJCQkJaWYgKG11bHRpRmllbGQuaXNTdGF0aWMoKSkgeworCQkJCQkJCQkJZm9ybWF0KG11bHRpRmllbGQsIHRoaXMsIHR5cGVEZWNsYXJhdGlvbi5zdGF0aWNJbml0aWFsaXplclNjb3BlLCBpc0NodW5rU3RhcnQsIGkgPT0gMCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlmb3JtYXQobXVsdGlGaWVsZCwgdGhpcywgdHlwZURlY2xhcmF0aW9uLmluaXRpYWxpemVyU2NvcGUsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKKwkJCQkJCQkJaW50IG5ld0xpbmVCZWZvcmVDaHVuayA9IGlzQ2h1bmtTdGFydCA/IHRoaXMucHJlZmVyZW5jZXMuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuayA6IDA7CisJCQkJCQkJCWlmIChuZXdMaW5lQmVmb3JlQ2h1bmsgPiAwICYmIGkgIT0gMCkgeworCQkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRFbXB0eUxpbmVzKG5ld0xpbmVCZWZvcmVDaHVuayk7CisJCQkJCQkJCX0gZWxzZSBpZiAoaSA9PSAwKSB7CisJCQkJCQkJCQlpbnQgbmV3TGluZXNCZWZvcmVGaXJzdENsYXNzQm9keURlY2xhcmF0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbjsKKwkJCQkJCQkJCWlmIChuZXdMaW5lc0JlZm9yZUZpcnN0Q2xhc3NCb2R5RGVjbGFyYXRpb24gPiAwKSB7CisJCQkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRFbXB0eUxpbmVzKG5ld0xpbmVzQmVmb3JlRmlyc3RDbGFzc0JvZHlEZWNsYXJhdGlvbik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIG1lbWJlcjsKKwkJCQkJCQkJaWYgKGluaXRpYWxpemVyLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCWluaXRpYWxpemVyLnRyYXZlcnNlKHRoaXMsIHR5cGVEZWNsYXJhdGlvbi5zdGF0aWNJbml0aWFsaXplclNjb3BlKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWluaXRpYWxpemVyLnRyYXZlcnNlKHRoaXMsIHR5cGVEZWNsYXJhdGlvbi5pbml0aWFsaXplclNjb3BlKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWZvcm1hdChtdWx0aUZpZWxkLCB0aGlzLCB0eXBlRGVjbGFyYXRpb24uaW5pdGlhbGl6ZXJTY29wZSwgaXNDaHVua1N0YXJ0LCBpID09IDApOwotCQkJCQkJCX0JCQkJCQotCQkJCQkJfSBlbHNlIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgewotCQkJCQkJCWludCBuZXdMaW5lQmVmb3JlQ2h1bmsgPSBpc0NodW5rU3RhcnQgPyB0aGlzLnByZWZlcmVuY2VzLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsgOiAwOwotCQkJCQkJCWlmIChuZXdMaW5lQmVmb3JlQ2h1bmsgPiAwICYmIGkgIT0gMCkgewotCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludEVtcHR5TGluZXMobmV3TGluZUJlZm9yZUNodW5rKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGkgPT0gMCkgewotCQkJCQkJCQlpbnQgbmV3TGluZXNCZWZvcmVGaXJzdENsYXNzQm9keURlY2xhcmF0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbjsKLQkJCQkJCQkJaWYgKG5ld0xpbmVzQmVmb3JlRmlyc3RDbGFzc0JvZHlEZWNsYXJhdGlvbiA+IDApIHsKLQkJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50RW1wdHlMaW5lcyhuZXdMaW5lc0JlZm9yZUZpcnN0Q2xhc3NCb2R5RGVjbGFyYXRpb24pOworCQkJCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIG1lbWJlcjsKKwkJCQkJCQkJaWYgKGZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJCWZvcm1hdChmaWVsZCwgdGhpcywgdHlwZURlY2xhcmF0aW9uLnN0YXRpY0luaXRpYWxpemVyU2NvcGUsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWZvcm1hdChmaWVsZCwgdGhpcywgdHlwZURlY2xhcmF0aW9uLmluaXRpYWxpemVyU2NvcGUsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KLQkJCQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgbWVtYmVyOwotCQkJCQkJCWlmIChpbml0aWFsaXplci5pc1N0YXRpYygpKSB7Ci0JCQkJCQkJCWluaXRpYWxpemVyLnRyYXZlcnNlKHRoaXMsIHR5cGVEZWNsYXJhdGlvbi5zdGF0aWNJbml0aWFsaXplclNjb3BlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpbml0aWFsaXplci50cmF2ZXJzZSh0aGlzLCB0eXBlRGVjbGFyYXRpb24uaW5pdGlhbGl6ZXJTY29wZSk7Ci0JCQkJCQkJfQkJCQkJCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSAoRmllbGREZWNsYXJhdGlvbikgbWVtYmVyOwotCQkJCQkJCWlmIChmaWVsZC5pc1N0YXRpYygpKSB7Ci0JCQkJCQkJCWZvcm1hdChmaWVsZCwgdGhpcywgdHlwZURlY2xhcmF0aW9uLnN0YXRpY0luaXRpYWxpemVyU2NvcGUsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlmb3JtYXQoZmllbGQsIHRoaXMsIHR5cGVEZWNsYXJhdGlvbi5pbml0aWFsaXplclNjb3BlLCBpc0NodW5rU3RhcnQsIGkgPT0gMCk7Ci0JCQkJCQkJfQkJCQkJCisJCQkJCQl9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkJCQlpc0NodW5rU3RhcnQgPSBtZW1iZXJBbGlnbm1lbnQuY2hlY2tDaHVua1N0YXJ0KEFsaWdubWVudC5DSFVOS19NRVRIT0QsIGksIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJCQlmb3JtYXQoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlciwgdHlwZURlY2xhcmF0aW9uLnNjb3BlLCBpc0NodW5rU3RhcnQsIGkgPT0gMCk7CisJCQkJCQl9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCQkJCWlzQ2h1bmtTdGFydCA9IG1lbWJlckFsaWdubWVudC5jaGVja0NodW5rU3RhcnQoQWxpZ25tZW50LkNIVU5LX1RZUEUsIGksIHRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJCQlmb3JtYXQoKFR5cGVEZWNsYXJhdGlvbiltZW1iZXIsIHR5cGVEZWNsYXJhdGlvbi5zY29wZSwgaXNDaHVua1N0YXJ0LCBpID09IDApOwogCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCQkJCWlzQ2h1bmtTdGFydCA9IG1lbWJlckFsaWdubWVudC5jaGVja0NodW5rU3RhcnQoQWxpZ25tZW50LkNIVU5LX01FVEhPRCwgaSwgdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwotCQkJCQkJZm9ybWF0KChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBtZW1iZXIsIHR5cGVEZWNsYXJhdGlvbi5zY29wZSwgaXNDaHVua1N0YXJ0LCBpID09IDApOwotCQkJCQl9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotCQkJCQkJaXNDaHVua1N0YXJ0ID0gbWVtYmVyQWxpZ25tZW50LmNoZWNrQ2h1bmtTdGFydChBbGlnbm1lbnQuQ0hVTktfVFlQRSwgaSwgdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwotCQkJCQkJZm9ybWF0KChUeXBlRGVjbGFyYXRpb24pbWVtYmVyLCB0eXBlRGVjbGFyYXRpb24uc2NvcGUsIGlzQ2h1bmtTdGFydCwgaSA9PSAwKTsKKwkJCQkJCXdoaWxlIChpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04pKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJCQkJLy8gcmVhbGlnbiB0byB0aGUgcHJvcGVyIHZhbHVlCisJCQkJCQlpZiAodGhpcy5zY3JpYmUubWVtYmVyQWxpZ25tZW50ICE9IG51bGwpIHsKKwkJCQkJCQkvLyBzZWxlY3QgdGhlIGxhc3QgYWxpZ25tZW50CisJCQkJCQkJdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMuc2NyaWJlLm1lbWJlckFsaWdubWVudC5vcmlnaW5hbEluZGVudGF0aW9uTGV2ZWw7CisJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTikpIHsKLQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOwotCQkJCQl9Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwotCQkJCQkvLyByZWFsaWduIHRvIHRoZSBwcm9wZXIgdmFsdWUKLQkJCQkJaWYgKHRoaXMuc2NyaWJlLm1lbWJlckFsaWdubWVudCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBzZWxlY3QgdGhlIGxhc3QgYWxpZ25tZW50Ci0JCQkJCQl0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsID0gdGhpcy5zY3JpYmUubWVtYmVyQWxpZ25tZW50Lm9yaWdpbmFsSW5kZW50YXRpb25MZXZlbDsKLQkJCQkJfQorCQkJCQlvayA9IHRydWU7CisJCQkJfSBjYXRjaChBbGlnbm1lbnRFeGNlcHRpb24gZSl7CisJCQkJCXN0YXJ0SW5kZXggPSBtZW1iZXJBbGlnbm1lbnQuY2h1bmtTdGFydEluZGV4OworCQkJCQl0aGlzLnNjcmliZS5yZWRvTWVtYmVyQWxpZ25tZW50KGUpOwogCQkJCX0KLQkJCQlvayA9IHRydWU7Ci0JCQl9IGNhdGNoKEFsaWdubWVudEV4Y2VwdGlvbiBlKXsKLQkJCQlzdGFydEluZGV4ID0gbWVtYmVyQWxpZ25tZW50LmNodW5rU3RhcnRJbmRleDsKLQkJCQl0aGlzLnNjcmliZS5yZWRvTWVtYmVyQWxpZ25tZW50KGUpOwotCQkJfQotCQl9IHdoaWxlICghb2spOwotCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKKwkJCX0gd2hpbGUgKCFvayk7CisJCX0gZWxzZSBpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OKSkgeworCQkJLy8gdGhlIG9ubHkgYm9keSBkZWNsYXJhdGlvbiBpcyBhbiBlbXB0eSBkZWNsYXJhdGlvbiAoJzsnKQorCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQl9CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuRE9fTk9UX1BSRVNFUlZFX0VNUFRZX0xJTkVTKTsKIAkJdGhpcy5zY3JpYmUuZXhpdE1lbWJlckFsaWdubWVudChtZW1iZXJBbGlnbm1lbnQpOwogCX0KIApAQCAtMjAzNCw3ICsyMjQ0LDcgQEAKIAkJaW50IGZpZWxkQ291bnQgPSAodHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9PSBudWxsKSA/IDAgOiB0eXBlRGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aDsKIAkJaW50IG1ldGhvZENvdW50ID0gKHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzID09IG51bGwpID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aDsKIAkJaW50IHR5cGVDb3VudCA9ICh0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPT0gbnVsbCkgPyAwIDogdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLmxlbmd0aDsKLQkKKwogCQlpZiAobWV0aG9kQ291bnQgPD0gMikgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZENvdW50OyBpIDwgbWF4OyBpKyspIHsKIAkJCQlmaW5hbCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXTsKQEAgLTIwNDgsMTUgKzIyNTgsMTUgQEAKIAkJZmluYWwgaW50IG1lbWJlckxlbmd0aCA9IGZpZWxkQ291bnQgKyBtZXRob2RDb3VudCt0eXBlQ291bnQ7CiAKIAkJYm9vbGVhbiBpbnNlcnROZXdMaW5lID0gbWVtYmVyTGVuZ3RoID4gMDsKLQkJCisKIAkJaWYgKCFpbnNlcnROZXdMaW5lKSB7CiAJCQlpZiAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsKIAkJCQlpbnNlcnROZXdMaW5lID0gdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudDsKIAkJCX0KIAkJfQotCQorCiAJCWZvcm1hdE9wZW5pbmdCcmFjZShicmFjZVBvc2l0aW9uLCBpbnNlcnRTcGFjZUJlZm9yZUJyYWNlKTsKLQkJCisKIAkJaWYgKGluc2VydE5ld0xpbmUpIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCQl9CkBAIC0yMDY1LDcgKzIyNzUsNyBAQAogCQlpbnQgZmllbGRDb3VudCA9ICh0eXBlRGVjbGFyYXRpb24uZmllbGRzID09IG51bGwpID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOwogCQlpbnQgbWV0aG9kQ291bnQgPSAodHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPT0gbnVsbCkgPyAwIDogdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMubGVuZ3RoOwogCQlpbnQgdHlwZUNvdW50ID0gKHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9PSBudWxsKSA/IDAgOiB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOwotCQorCiAJCWlmIChtZXRob2RDb3VudCA8PSAyKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kQ291bnQ7IGkgPCBtYXg7IGkrKykgewogCQkJCWZpbmFsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gYWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzW2ldOwpAQCAtMjA3OSw3ICsyMjg5LDcgQEAKIAkJZmluYWwgaW50IG1lbWJlckxlbmd0aCA9IGZpZWxkQ291bnQgKyBtZXRob2RDb3VudCArIHR5cGVDb3VudDsKIAogCQlib29sZWFuIGluc2VydE5ld0xpbmUgPSBtZW1iZXJMZW5ndGggPiAwOwotCQkKKwogCQlpZiAoIWluc2VydE5ld0xpbmUpIHsKIAkJCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZCh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKSA9PSBUeXBlRGVjbGFyYXRpb24uRU5VTV9ERUNMKSB7CiAJCQkJaW5zZXJ0TmV3TGluZSA9IHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb247CkBAIC0yMDg4LDEyICsyMjk4LDEyIEBACiAJCQl9IGVsc2UgaWYgKFR5cGVEZWNsYXJhdGlvbi5raW5kKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpID09IFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCkgewogCQkJCWluc2VydE5ld0xpbmUgPSB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uOwogCQkJfSBlbHNlIHsKLQkJCQlpbnNlcnROZXdMaW5lID0gdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbjsJCQkJCisJCQkJaW5zZXJ0TmV3TGluZSA9IHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb247CiAJCQl9CiAJCX0KLQkKKwogCQlmb3JtYXRPcGVuaW5nQnJhY2UoYnJhY2VQb3NpdGlvbiwgaW5zZXJ0U3BhY2VCZWZvcmVCcmFjZSk7Ci0JCQorCiAJCWlmIChpbnNlcnROZXdMaW5lKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJfQpAQCAtMjI0Niw3ICsyNDU2LDIzIEBACiAJCQl9CiAJCX0KIAl9Ci0JCQkKKworCXByaXZhdGUgdm9pZCBwcmludENvbW1lbnQoKSB7CisJCXRoaXMubG9jYWxTY2FubmVyLnJlc2V0VG8odGhpcy5zY3JpYmUuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0aGlzLnNjcmliZS5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlbiA9IHRoaXMubG9jYWxTY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOgorCSAgICAJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQodG9rZW4sIFNjcmliZS5OT19UUkFJTElOR19DT01NRU5UKTsKKwkgICAgCQkJYnJlYWs7CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZQorCQl9CisgICAgfQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFsbG9jYXRpb25FeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCkBAIC0yMjYyLDcgKzI0ODgsNyBAQAogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVuZXcpOwogCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGVBcmd1bWVudHM7CiAJCWlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsgCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCX0KQEAgLTIyNzIsMTEgKzI0OTgsMTEgQEAKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJfQkJCQkKKwkJCQkJfQogCQkJCX0KIAkJCQl0eXBlQXJndW1lbnRzW2xlbmd0aCAtIDFdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7IAorCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsKIAkJCQl9CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwpAQCAtMjI4NiwxNyArMjUxMiwxNyBAQAogCQl9CiAKIAkJYWxsb2NhdGlvbkV4cHJlc3Npb24udHlwZS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24pOwogCiAJCWZpbmFsIEV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBhbGxvY2F0aW9uRXhwcmVzc2lvbi5hcmd1bWVudHM7CiAJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24pIHsKIAkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJfQkJCQorCQkJfQogCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPXRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLQkJCQkJImFsbG9jYXRpb24iLC8vJE5PTi1OTFMtMSQKKwkJCQkJQWxpZ25tZW50LkFMTE9DQVRJT04sCiAJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uLAogCQkJCQlhcmd1bWVudExlbmd0aCwKIAkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwpAQCAtMjMwNyw3ICsyNTMzLDcgQEAKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAoaSA+IDApIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbik7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCX0KIAkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYXJndW1lbnRzQWxpZ25tZW50LCBpKTsKIAkJCQkJCWlmIChpID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24pIHsKQEAgLTIzMjEsMTEgKzI1NDcsMTEgQEAKIAkJCQl9CiAJCQl9IHdoaWxlICghb2spOwogCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhcmd1bWVudHNBbGlnbm1lbnQsIHRydWUpOwotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbik7IAorCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbik7CiAJCX0gZWxzZSB7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uKTsgCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uKTsKIAkJfQotCQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oYWxsb2NhdGlvbkV4cHJlc3Npb24sIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtMjMzOCwzMyArMjU2NCwzMyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlBTkRfQU5EX0V4cHJlc3Npb24gYW5kX2FuZF9FeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQkKKwogCQlyZXR1cm4gZHVtcEJpbmFyeUV4cHJlc3Npb24oYW5kX2FuZF9FeHByZXNzaW9uLCBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBTkRfQU5ELCBzY29wZSk7CiAJfQogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQkJQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24sCi0JCQlDbGFzc1Njb3BlIHNjb3BlKSB7ICAgICAgICAKKwkJCUNsYXNzU2NvcGUgc2NvcGUpIHsKICAgICAgICAgLyoKICAgICAgICAgICogUHJpbnQgY29tbWVudHMgdG8gZ2V0IHByb3BlciBsaW5lIG51bWJlcgogICAgICAgICAgKi8KLSAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7ICAgICAgICAKLSAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRNb2RpZmllcnMoYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgdGhpcyk7CisgICAgICAgIHRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOworICAgICAgICB0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzLCBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX01FVEhPRCk7CiAJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCS8qCiAJCSAqIFByaW50IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUKLQkJICovCQorCQkgKi8KIAkJZmluYWwgVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gYW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbi5yZXR1cm5UeXBlOwogCQlmaW5hbCBNZXRob2RTY29wZSBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uU2NvcGUgPSBhbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uLnNjb3BlOwotCQkKKwogCQlpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7CiAJCQlyZXR1cm5UeXBlLnRyYXZlcnNlKHRoaXMsIGFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb25TY29wZSk7CiAJCX0KIAkJLyoKIAkJICogUHJpbnQgdGhlIG1ldGhvZCBuYW1lCiAJCSAqLwotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsgCi0JCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbik7IAotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb24pOyAKKwkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciwgdHJ1ZSk7CisJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbik7CisJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbik7CiAKIAkJLyoKIAkJICogQ2hlY2sgZm9yIGV4dHJhIGRpbWVuc2lvbnMKQEAgLTIzODQsNyArMjYxMCw3IEBACiAJCQlkZWZhdWx0VmFsdWUudHJhdmVyc2UodGhpcywgKEJsb2NrU2NvcGUpIG51bGwpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0yMzk1LDE3ICsyNjIxLDI2IEBACiAKIAkJaWYgKGFyZ3VtZW50Lm1vZGlmaWVycyAhPSBOT19NT0RJRklFUlMgfHwgYXJndW1lbnQuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCSAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7Ci0JCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhhcmd1bWVudC5hbm5vdGF0aW9ucywgdGhpcyk7CisJCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhhcmd1bWVudC5hbm5vdGF0aW9ucywgdGhpcywgSUNvZGVGb3JtYXR0ZXJDb25zdGFudHMuQU5OT1RBVElPTl9PTl9QQVJBTUVURVIpOwogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQogCiAJCS8qCi0JCSAqIEFyZ3VtZW50IHR5cGUgCisJCSAqIEFyZ3VtZW50IHR5cGUKIAkJICovCiAJCWlmIChhcmd1bWVudC50eXBlICE9IG51bGwpIHsKLQkJCWFyZ3VtZW50LnR5cGUudHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJaWYgKGFyZ3VtZW50LnR5cGUgaW5zdGFuY2VvZiBVbmlvblR5cGVSZWZlcmVuY2UpIHsKKwkJCQlmb3JtYXRNdWx0aUNhdGNoQXJndW1lbnRzKAorCQkJCQkJYXJndW1lbnQsIAorCQkJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciwgCisJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IsCisJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoLAorCQkJCQkJc2NvcGUpOworCQkJfSBlbHNlIHsKKwkJCQlhcmd1bWVudC50eXBlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCX0KIAkJfQotCQkKKwogCQlpZiAoYXJndW1lbnQuaXNWYXJBcmdzKCkpIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVMTElQU0lTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXMpOwogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzKSB7CkBAIC0yNDE1LDcgKzI2NTAsNyBAQAogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFByaW50IHRoZSBhcmd1bWVudCBuYW1lCi0JCQkgKi8JCisJCQkgKi8KIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIsIHRydWUpOwogCQl9CiAKQEAgLTI0MzAsNyArMjY2NSw3IEBACiAJCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCSB9CiAJCX0KLQkJCisKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMjQ0OCw3ICsyNjgzLDcgQEAKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZW5ldyk7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQorCiAJCQlmaW5hbCBFeHByZXNzaW9uW10gZGltZW5zaW9ucyA9IGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uZGltZW5zaW9uczsKIAkJCWludCBkaW1lbnNpb25zTGVuZ3RoID0gZGltZW5zaW9ucy5sZW5ndGg7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnNMZW5ndGg7IGkrKykgewpAQCAtMjQ4MCwxMTUgKzI3MTUsMTYwIEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5SW5pdGlhbGl6ZXIsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsJCWZpbmFsIGludCBudW1iZXJPZlBhcmVucyA9IChhcnJheUluaXRpYWxpemVyLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZmluYWwgaW50IG51bWJlck9mUGFyZW5zID0gKGFycmF5SW5pdGlhbGl6ZXIuYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUOwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oYXJyYXlJbml0aWFsaXplciwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9Ci0JCQotCQlmaW5hbCBFeHByZXNzaW9uW10gZXhwcmVzc2lvbnMgPSBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zOwotCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkgewotCQkJU3RyaW5nIGFycmF5X2luaXRpYWxpemVyX2JyYWNlX3Bvc2l0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI7Ci0JCQlmb3JtYXRPcGVuaW5nQnJhY2UoYXJyYXlfaW5pdGlhbGl6ZXJfYnJhY2VfcG9zaXRpb24sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyKTsKLQkJCi0JCQlpbnQgZXhwcmVzc2lvbnNMZW5ndGggPSBleHByZXNzaW9ucy5sZW5ndGg7Ci0JCQlmaW5hbCBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlID0gdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcjsKLQkJCWlmIChleHByZXNzaW9uc0xlbmd0aCA+IDEpIHsKLQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7Ci0JCQkJfQotCQkJCUFsaWdubWVudCBhcnJheUluaXRpYWxpemVyQWxpZ25tZW50ID10aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCQkiYXJyYXlfaW5pdGlhbGl6ZXIiLC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciwKLQkJCQkJCUFsaWdubWVudC5SX09VVEVSTU9TVCwKLQkJCQkJCWV4cHJlc3Npb25zTGVuZ3RoLAotCQkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sCi0JCQkJCQl0aGlzLnByZWZlcmVuY2VzLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIsCi0JCQkJCQl0cnVlKTsKLQkJCQkKLQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKLQkJCQkgICAgYXJyYXlJbml0aWFsaXplckFsaWdubWVudC5mcmFnbWVudEluZGVudGF0aW9uc1swXSA9IGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQuYnJlYWtJbmRlbnRhdGlvbkxldmVsOwotCQkJCX0KLQkJCQkKLQkJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50KTsKKworCQlpZiAodGhpcy5hcnJheUluaXRpYWxpemVyc0RlcHRoIDwgMCkgeworCQkJdGhpcy5hcnJheUluaXRpYWxpemVyc0RlcHRoID0gMDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYXJyYXlJbml0aWFsaXplcnNEZXB0aCsrOworCQl9CisJCWludCBhcnJheUluaXRpYWxpemVySW5kZW50YXRpb25MZXZlbCA9IHRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWw7CisJCXRyeSB7CisJCQlmaW5hbCBFeHByZXNzaW9uW10gZXhwcmVzc2lvbnMgPSBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zOworCQkJaWYgKGV4cHJlc3Npb25zICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgYXJyYXlfaW5pdGlhbGl6ZXJfYnJhY2VfcG9zaXRpb24gPSB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcjsKKwkJCQlmb3JtYXRPcGVuaW5nQnJhY2UoYXJyYXlfaW5pdGlhbGl6ZXJfYnJhY2VfcG9zaXRpb24sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyKTsKKworCQkJCWludCBleHByZXNzaW9uc0xlbmd0aCA9IGV4cHJlc3Npb25zLmxlbmd0aDsKKwkJCQlmaW5hbCBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlID0gdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcjsKIAkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJZG8gewotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50LCAwKTsKLQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyKSB7Ci0JCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCWV4cHJlc3Npb25zWzBdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgZXhwcmVzc2lvbnNMZW5ndGg7IGkrKykgewotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOwotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7Ci0JCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50LCBpKTsKLQkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpIHsKKwkJCQlBbGlnbm1lbnQgYXJyYXlJbml0aWFsaXplckFsaWdubWVudCA9IG51bGw7CisJCQkJaWYgKGV4cHJlc3Npb25zTGVuZ3RoID4gMSkgeworCQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJCQl9CisJCQkJCWFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCQkJQWxpZ25tZW50LkFSUkFZX0lOSVRJQUxJWkVSLAorCQkJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciwKKwkJCQkJCQlBbGlnbm1lbnQuUl9PVVRFUk1PU1QsCisJCQkJCQkJZXhwcmVzc2lvbnNMZW5ndGgsCisJCQkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sCisJCQkJCQkJdGhpcy5wcmVmZXJlbmNlcy5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyLAorCQkJCQkJCXRydWUpOworCQorCQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKKwkJCQkJCWFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQuZnJhZ21lbnRJbmRlbnRhdGlvbnNbMF0gPSBhcnJheUluaXRpYWxpemVyQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJfQorCQorCQkJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50KTsKKwkJCQkJZG8geworCQkJCQkJdHJ5IHsKKwkJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQsIDApOworCQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyKSB7CiAJCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQkJCQkJfQotCQkJCQkJCWV4cHJlc3Npb25zW2ldLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQkJCQlpZiAoaSA9PSBleHByZXNzaW9uc0xlbmd0aCAtIDEpIHsKLQkJCQkJCQkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BKSkgewotCQkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcik7Ci0JCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCWV4cHJlc3Npb25zWzBdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGV4cHJlc3Npb25zTGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcik7CisJCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQsIGkpOworCQkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpIHsKKwkJCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZXhwcmVzc2lvbnNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJCQlpZiAoaSA9PSBleHByZXNzaW9uc0xlbmd0aCAtIDEpIHsKKwkJCQkJCQkJCWlmIChpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSkpIHsKKwkJCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyKTsKKwkJCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KKwkJCQkJCQlvayA9IHRydWU7CisJCQkJCQl9IGNhdGNoIChBbGlnbm1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQkJCQl9Ci0JCQkJCQlvayA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aGlzLnNjcmliZS5yZWRvQWxpZ25tZW50KGUpOwotCQkJCQl9Ci0JCQkJfSB3aGlsZSAoIW9rKTsKLQkJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7Ci0JCQkJCXRoaXMuc2NyaWJlLmluZGVudCgpOwotCQkJCX0KLQkJCQkvLyB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhbiBhbGlnbm1lbnQKLQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcikgewotCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJCQl9IHdoaWxlICghb2spOworCQkJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQsIHRydWUpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuc2NyaWJlLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJCQkvLyBVc2UgYW4gYWxpZ25tZW50IHdpdGggbm8gYnJlYWsgaW4gY2FzZSB3aGVuIHRoZSBhcnJheSBpbml0aWFsaXplcgorCQkJCQkvLyBpcyBub3QgaW5zaWRlIG1ldGhvZCBhcmd1bWVudHMgYWxpZ25tZW50cworCQkJCQlpZiAodGhpcy5zY3JpYmUuY3VycmVudEFsaWdubWVudCA9PSBudWxsIHx8IHRoaXMuc2NyaWJlLmN1cnJlbnRBbGlnbm1lbnQua2luZCAhPSBBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFMpIHsKKwkJCQkJCWFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCQkJCUFsaWdubWVudC5BUlJBWV9JTklUSUFMSVpFUiwKKwkJCQkJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyLAorCQkJCQkJCQlBbGlnbm1lbnQuUl9PVVRFUk1PU1QsCisJCQkJCQkJCTAsCisJCQkJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLAorCQkJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIsCisJCQkJCQkJCXRydWUpOworCQkJCQkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQoYXJyYXlJbml0aWFsaXplckFsaWdubWVudCk7CisJCQkJCX0KKwkJCQkJZG8geworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudCgpOworCQkJCQkJCX0KKwkJCQkJCQkvLyB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhbiBhbGlnbm1lbnQKKwkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcikgeworCQkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRoaXMuc2NyaWJlLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJCQkJCX0KKwkJCQkJCQlleHByZXNzaW9uc1swXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CisJCQkJCQkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BKSkgeworCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyKTsKKwkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZSkgeworCQkJCQkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOworCQkJCQkJCX0KKwkJCQkJCQlvayA9IHRydWU7CisJCQkJCQl9IGNhdGNoIChBbGlnbm1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkJCWlmIChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50ID09IG51bGwpIHRocm93IGU7CisJCQkJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKKwkJCQkJCX0KKwkJCQkJfSB3aGlsZSAoIW9rKTsKKwkJCQkJaWYgKGFycmF5SW5pdGlhbGl6ZXJBbGlnbm1lbnQgIT0gbnVsbCkgeworCQkJCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhcnJheUluaXRpYWxpemVyQWxpZ25tZW50LCB0cnVlKTsKKwkJCQkJfQogCQkJCX0KLQkJCQlleHByZXNzaW9uc1swXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BKSkgewotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyKTsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpIHsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCQkJfSBlbHNlIGlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcikgeworCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCX0KLQkJCQlpZiAoaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2UpIHsKLQkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpIHsKLQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJfQotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFLCBmYWxzZSk7IAotCQkJaWYgKGFycmF5X2luaXRpYWxpemVyX2JyYWNlX3Bvc2l0aW9uLmVxdWFscyhEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkVfU0hJRlRFRCkpIHsKLQkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwotCQkJfQkKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4ga2VlcEVtcHR5QXJyYXlJbml0aWFsaXplck9uVGhlU2FtZUxpbmUgPSB0aGlzLnByZWZlcmVuY2VzLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU7Ci0JCQlTdHJpbmcgYXJyYXlfaW5pdGlhbGl6ZXJfYnJhY2VfcG9zaXRpb24gPSB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcjsKLQkJCWlmIChrZWVwRW1wdHlBcnJheUluaXRpYWxpemVyT25UaGVTYW1lTGluZSkgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOwotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJZm9ybWF0T3BlbmluZ0JyYWNlKGFycmF5X2luaXRpYWxpemVyX2JyYWNlX3Bvc2l0aW9uLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcik7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFLCBmYWxzZSk7IAorCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSwgZmFsc2UsIFNjcmliZS5QUkVTRVJWRV9FTVBUWV9MSU5FU19JTl9DTE9TSU5HX0FSUkFZX0lOSVRJQUxJWkVSICsgKGFycmF5SW5pdGlhbGl6ZXJJbmRlbnRhdGlvbkxldmVsIDw8IDE2KSk7CiAJCQkJaWYgKGFycmF5X2luaXRpYWxpemVyX2JyYWNlX3Bvc2l0aW9uLmVxdWFscyhEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5ORVhUX0xJTkVfU0hJRlRFRCkpIHsKIAkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJvb2xlYW4ga2VlcEVtcHR5QXJyYXlJbml0aWFsaXplck9uVGhlU2FtZUxpbmUgPSB0aGlzLnByZWZlcmVuY2VzLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU7CisJCQkJU3RyaW5nIGFycmF5X2luaXRpYWxpemVyX2JyYWNlX3Bvc2l0aW9uID0gdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI7CisJCQkJaWYgKGtlZXBFbXB0eUFycmF5SW5pdGlhbGl6ZXJPblRoZVNhbWVMaW5lKSB7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOworCQkJCQlpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEpKSB7CisJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyKTsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQl9CisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOworCQkJCX0gZWxzZSB7CisJCQkJCWZvcm1hdE9wZW5pbmdCcmFjZShhcnJheV9pbml0aWFsaXplcl9icmFjZV9wb3NpdGlvbiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOworCQkJCQlpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEpKSB7CisJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyKTsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQl9CisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIpOworCQkJCQlpZiAoYXJyYXlfaW5pdGlhbGl6ZXJfYnJhY2VfcG9zaXRpb24uZXF1YWxzKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLk5FWFRfTElORV9TSElGVEVEKSkgeworCQkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKKwkJCQkJfQorCQkJCX0KIAkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuYXJyYXlJbml0aWFsaXplcnNEZXB0aC0tOwogCQl9Ci0JCisJCQorCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihhcnJheUluaXRpYWxpemVyLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KQEAgLTI2NTYsMTMgKzI5MzYsMTMgQEAKIAkJfQogCQlhcnJheVJlZmVyZW5jZS5wb3NpdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VULCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSk7Ci0JCQorCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihhcnJheVJlZmVyZW5jZSwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlUeXBlUmVmZXJlbmNlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCkBAIC0yNjc1LDcgKzI5NTUsNyBAQAogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGFycmF5VHlwZVJlZmVyZW5jZSwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFNJTkdMRVRZUEVSRUZFUkVOQ0VfRVhQRUNURURUT0tFTlMpOwotCQkKKwogCQlpbnQgZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoKTsKIAkJaWYgKGRpbWVuc2lvbnMgIT0gMCkgewogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UpIHsKQEAgLTI3MDMsNyArMjk4Myw3IEBACiAJCUNsYXNzU2NvcGUgc2NvcGUpIHsKIAogCQlmaW5hbCBpbnQgbnVtYmVyT2ZQYXJlbnMgPSAoYXJyYXlUeXBlUmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKLQkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgeyAKKwkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGFycmF5VHlwZVJlZmVyZW5jZSwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFNJTkdMRVRZUEVSRUZFUkVOQ0VfRVhQRUNURURUT0tFTlMpOwpAQCAtMjczMCwxMSArMzAxMCwxMSBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NlcnRTdGF0ZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWFzc2VydCk7CiAJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCWFzc2VydFN0YXRlbWVudC5hc3NlcnRFeHByZXNzaW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCisKIAkJaWYgKGFzc2VydFN0YXRlbWVudC5leGNlcHRpb25Bcmd1bWVudCAhPSBudWxsKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydCk7CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0KSB7CkBAIC0yNzQyLDExICszMDIyLDExIEBACiAJCQl9CiAJCQlhc3NlcnRTdGF0ZW1lbnQuZXhjZXB0aW9uQXJndW1lbnQudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQl9Ci0JCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7CQkKLQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzaWdubWVudCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlKQogCSAqLwpAQCAtMjc2Miw3ICszMDQyLDEyIEBACiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQl9CiAKLQkJQWxpZ25tZW50IGFzc2lnbm1lbnRBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoImFzc2lnbm1lbnRBbGlnbm1lbnQiLCB0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCwgQWxpZ25tZW50LlJfT1VURVJNT1NULCAxLCB0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJQWxpZ25tZW50IGFzc2lnbm1lbnRBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJQWxpZ25tZW50LkFTU0lHTk1FTlQsCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQsCisJCQkJQWxpZ25tZW50LlJfT1VURVJNT1NULAorCQkJCTEsCisJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhc3NpZ25tZW50QWxpZ25tZW50KTsKIAkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQlkbyB7CkBAIC0yNzczLDcgKzMwNTgsNyBAQAogCQkJfSBjYXRjaChBbGlnbm1lbnRFeGNlcHRpb24gZSl7CiAJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKIAkJCX0KLQkJfSB3aGlsZSAoIW9rKTsJCQorCQl9IHdoaWxlICghb2spOwogCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFzc2lnbm1lbnRBbGlnbm1lbnQsIHRydWUpOwogCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKQEAgLTI4MjIsMTIgKzMxMDcsMTIgQEAKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2ssIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBibG9jaywgQmxvY2tTY29wZSBzY29wZSkgewotCQlmb3JtYXRCbG9jayhibG9jaywgc2NvcGUsIHRoaXMucHJlZmVyZW5jZXMuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayk7CQorCQlmb3JtYXRCbG9jayhibG9jaywgc2NvcGUsIHRoaXMucHJlZmVyZW5jZXMuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTI4MzUsMjAgKzMxMjAsMjAgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQnJlYWtTdGF0ZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgewotCQkKKwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVicmVhayk7CiAJCWlmIChicmVha1N0YXRlbWVudC5sYWJlbCAhPSBudWxsKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXNlU3RhdGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CQkKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXNlU3RhdGVtZW50IGNhc2VTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJaWYgKGNhc2VTdGF0ZW1lbnQuY29uc3RhbnRFeHByZXNzaW9uID09IG51bGwpIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRlZmF1bHQpOwogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0KTsKQEAgLTI4ODMsNyArMzE2OCw3IEBACiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQl9CiAJCWNhc3RFeHByZXNzaW9uLmV4cHJlc3Npb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY2FzdEV4cHJlc3Npb24sIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtMjkyMCw3ICszMjA1LDcgQEAKIAkJY2xhc3NMaXRlcmFsLnR5cGUudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjbGFzcyk7Ci0JCQorCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjbGFzc0xpdGVyYWwsIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtMjkzNCw0NyArMzIxOSw1MiBAQAogCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsYXRpb25Vbml0U2NvcGUpCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLAogCQlDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSkgewotCQkKKwogCQkvLyBmYWtlIG5ldyBsaW5lIHRvIGhhbmRsZSBlbXB0eSBsaW5lcyBiZWZvcmUgcGFja2FnZSBkZWNsYXJhdGlvbiBvciBpbXBvcnQgZGVjbGFyYXRpb25zCiAJCXRoaXMuc2NyaWJlLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMTsKLQkJLyogCisKKwkJLy8gU2V0IGhlYWRlciBlbmQgcG9zaXRpb24KKwkJZmluYWwgVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKKwkJaW50IGhlYWRlckVuZFBvc2l0aW9uID0gdHlwZXMgPT0gbnVsbCA/IGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNvdXJjZUVuZCA6IHR5cGVzWzBdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCXRoaXMuc2NyaWJlLnNldEhlYWRlckNvbW1lbnQoaGVhZGVyRW5kUG9zaXRpb24pOworCisJCS8qCiAJCSAqIFBhY2thZ2UgZGVjbGFyYXRpb24KIAkJICovCi0JCWZpbmFsIGJvb2xlYW4gaGFzUGFja2FnZSA9IGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmN1cnJlbnRQYWNrYWdlICE9IG51bGw7CisJCUltcG9ydFJlZmVyZW5jZSBjdXJyZW50UGFja2FnZSA9IGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmN1cnJlbnRQYWNrYWdlOworCQlmaW5hbCBib29sZWFuIGhhc1BhY2thZ2UgPSBjdXJyZW50UGFja2FnZSAhPSBudWxsOwogCQlpZiAoaGFzUGFja2FnZSkgewotCQkJaWYgKGhhc0NvbW1lbnRzKCkpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKLQkJCX0KKwkJCXByaW50Q29tbWVudCgpOwogCQkJaW50IGJsYW5rTGluZXNCZWZvcmVQYWNrYWdlID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZTsKIAkJCWlmIChibGFua0xpbmVzQmVmb3JlUGFja2FnZSA+IDApIHsKIAkJCQl0aGlzLnNjcmliZS5wcmludEVtcHR5TGluZXMoYmxhbmtMaW5lc0JlZm9yZVBhY2thZ2UpOwogCQkJfQogCi0JCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jdXJyZW50UGFja2FnZS5hbm5vdGF0aW9ucywgdGhpcyk7CisJCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhjdXJyZW50UGFja2FnZS5hbm5vdGF0aW9ucywgdGhpcywgSUNvZGVGb3JtYXR0ZXJDb25zdGFudHMuQU5OT1RBVElPTl9PTl9QQUNLQUdFKTsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQkvLyBkdW1wIHRoZSBwYWNrYWdlIGtleXdvcmQKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXBhY2thZ2UpOwogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmN1cnJlbnRQYWNrYWdlLnNvdXJjZUVuZCk7CisJCQl0aGlzLnNjcmliZS5wcmludFF1YWxpZmllZFJlZmVyZW5jZShjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jdXJyZW50UGFja2FnZS5zb3VyY2VFbmQsIGZhbHNlLypkbyBub3QgZXhwZWN0IHBhcmVudGhlc2lzKi8pOwogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCWludCBibGFua0xpbmVzQWZ0ZXJQYWNrYWdlID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlOwogCQkJaWYgKGJsYW5rTGluZXNBZnRlclBhY2thZ2UgPiAwKSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnRFbXB0eUxpbmVzKGJsYW5rTGluZXNBZnRlclBhY2thZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKLQkJCX0JCQkKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwogCQl9Ci0JCQorCiAJCS8qCiAJCSAqIEltcG9ydCBzdGF0ZW1lbnRzCiAJCSAqLwpAQCAtMjk4NywxOSArMzI3NywxNiBAQAogCQkJCX0KIAkJCX0KIAkJCWludCBpbXBvcnRMZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsKLQkJCWludCBzYXZlZE51bWJlck9mTGluZVRvUHJlc2VydmUgPSB0aGlzLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZTsKIAkJCWlmIChpbXBvcnRMZW5ndGggIT0gMSkgewogCQkJCWZvcm1hdChpbXBvcnRzWzBdLCBmYWxzZSk7CiAgICAgCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBpbXBvcnRMZW5ndGggLSAxOyBpKyspIHsKICAgICAJCQkJZm9ybWF0KGltcG9ydHNbaV0sIGZhbHNlKTsKICAgICAJCQl9CiAgICAgCQkJZm9ybWF0KGltcG9ydHNbaW1wb3J0TGVuZ3RoIC0gMV0sIHRydWUpOwotICAgIAkJCXRoaXMucHJlZmVyZW5jZXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlID0gc2F2ZWROdW1iZXJPZkxpbmVUb1ByZXNlcnZlOwogCQkJfSBlbHNlIHsKIAkJCQlmb3JtYXQoaW1wb3J0c1swXSwgdHJ1ZSk7CiAJCQl9Ci0JCQl0aGlzLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSA9IHNhdmVkTnVtYmVyT2ZMaW5lVG9QcmVzZXJ2ZTsKLQkJCQorCiAJCQlpbnQgYmxhbmtMaW5lc0FmdGVySW1wb3J0cyA9IHRoaXMucHJlZmVyZW5jZXMuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0czsKIAkJCWlmIChibGFua0xpbmVzQWZ0ZXJJbXBvcnRzID4gMCkgewogCQkJCXRoaXMuc2NyaWJlLnByaW50RW1wdHlMaW5lcyhibGFua0xpbmVzQWZ0ZXJJbXBvcnRzKTsKQEAgLTMwMDcsMTIgKzMyOTQsMTEgQEAKIAkJfQogCiAJCWZvcm1hdEVtcHR5VHlwZURlY2xhcmF0aW9uKHRydWUpOwotCQkKKwogCQlpbnQgYmxhbmtMaW5lQmV0d2VlblR5cGVEZWNsYXJhdGlvbnMgPSB0aGlzLnByZWZlcmVuY2VzLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM7CiAJCS8qCiAJCSAqIFR5cGUgZGVjbGFyYXRpb25zCiAJCSAqLwotCQlmaW5hbCBUeXBlRGVjbGFyYXRpb25bXSB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnR5cGVzOwogCQlpZiAodHlwZXMgIT0gbnVsbCkgewogCQkJaW50IHR5cGVzTGVuZ3RoID0gdHlwZXMubGVuZ3RoOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aCAtIDE7IGkrKykgewpAQCAtMzAzNiwxMyArMzMyMiwxMyBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlDb21wb3VuZEFzc2lnbm1lbnQgY29tcG91bmRBc3NpZ25tZW50LAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQkKKwogCQlmaW5hbCBpbnQgbnVtYmVyT2ZQYXJlbnMgPSAoY29tcG91bmRBc3NpZ25tZW50LmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGNvbXBvdW5kQXNzaWdubWVudCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAJCWNvbXBvdW5kQXNzaWdubWVudC5saHMudHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkKKwogCQkvKgogCQkgKiBQcmludCB0aGUgb3BlcmF0b3IKIAkJICovCkBAIC0zMDgxLDEyICszMzY3LDE3IEBACiAJCQlkZWZhdWx0OiAvLyBPcGVyYXRvcklkcy5VTlNJR05FRF9SSUdIVF9TSElGVCA6CiAJCQkJb3BlcmF0b3IgPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTDsKIAkJfQotCQkKKwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihvcGVyYXRvciwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3IpOwogCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcikgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQotCQlBbGlnbm1lbnQgYXNzaWdubWVudEFsaWdubWVudCA9IHRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgiY29tcG91bmRBc3NpZ25tZW50QWxpZ25tZW50IiwgdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQsIEFsaWdubWVudC5SX09VVEVSTU9TVCwgMSwgdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOyAvLyROT04tTkxTLTEkCisJCUFsaWdubWVudCBhc3NpZ25tZW50QWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAorCQkJCUFsaWdubWVudC5DT01QT1VORF9BU1NJR05NRU5ULAorCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50LAorCQkJCUFsaWdubWVudC5SX09VVEVSTU9TVCwKKwkJCQkxLAorCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKIAkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQoYXNzaWdubWVudEFsaWdubWVudCk7CiAJCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAkJZG8gewpAQCAtMzA5Nyw5ICszMzg4LDkgQEAKIAkJCX0gY2F0Y2goQWxpZ25tZW50RXhjZXB0aW9uIGUpewogCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQl9Ci0JCX0gd2hpbGUgKCFvayk7CQkKKwkJfSB3aGlsZSAoIW9rKTsKIAkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhc3NpZ25tZW50QWxpZ25tZW50LCB0cnVlKTsKLQkJCisKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGNvbXBvdW5kQXNzaWdubWVudCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CkBAIC0zMTEyLDUwICszNDAzLDUwIEBACiAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoCiAgICAgCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24sCiAgICAgCUJsb2NrU2NvcGUgc2NvcGUpIHsKLSAgICAKKwogICAgIAlmaW5hbCBpbnQgbnVtYmVyT2ZQYXJlbnMgPSAoY29uZGl0aW9uYWxFeHByZXNzaW9uLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKICAgICAJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogICAgIAkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwogICAgIAl9CiAgICAgCWNvbmRpdGlvbmFsRXhwcmVzc2lvbi5jb25kaXRpb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwotICAgIAorCiAgICAgCUFsaWdubWVudCBjb25kaXRpb25hbEV4cHJlc3Npb25BbGlnbm1lbnQgPXRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLSAgICAJCQkiY29uZGl0aW9uYWxFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgIAkJCUFsaWdubWVudC5DT05ESVRJT05BTF9FWFBSRVNTSU9OLAogICAgIAkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uLAogICAgIAkJCTIsCiAgICAgCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwotICAgIAorCiAgICAgCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KGNvbmRpdGlvbmFsRXhwcmVzc2lvbkFsaWdubWVudCk7CiAgICAgCWJvb2xlYW4gb2sgPSBmYWxzZTsKICAgICAJZG8gewogICAgIAkJdHJ5IHsKICAgICAJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGNvbmRpdGlvbmFsRXhwcmVzc2lvbkFsaWdubWVudCwgMCk7CiAgICAgCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUVVFU1RJT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCk7Ci0gICAgCisKICAgICAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWwpIHsKICAgICAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKICAgICAJCQl9CiAgICAgCQkJY29uZGl0aW9uYWxFeHByZXNzaW9uLnZhbHVlSWZUcnVlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLSAgICAJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworICAgIAkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogICAgIAkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoY29uZGl0aW9uYWxFeHByZXNzaW9uQWxpZ25tZW50LCAxKTsKICAgICAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsKTsKLSAgICAKKwogICAgIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbCkgewogICAgIAkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogICAgIAkJCX0KICAgICAJCQljb25kaXRpb25hbEV4cHJlc3Npb24udmFsdWVJZkZhbHNlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLSAgICAKKwogICAgIAkJCW9rID0gdHJ1ZTsKICAgICAJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKICAgICAJCX0KICAgICAJfSB3aGlsZSAoIW9rKTsKICAgICAJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChjb25kaXRpb25hbEV4cHJlc3Npb25BbGlnbm1lbnQsIHRydWUpOwotICAgIAkJCisKICAgICAJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogICAgIAkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwogICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsJCisgICAgCXJldHVybiBmYWxzZTsKICAgICB9CiAKIApAQCAtMzE2NSwxNCArMzQ1NiwxNCBAQAogCXB1YmxpYyBib29sZWFuIHZpc2l0KAogCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sCiAJCUNsYXNzU2NvcGUgc2NvcGUpIHsKLQkJCQorCiAJCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKIAkJCWlmICh0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsICE9IDApIHsKIAkJCQl0aGlzLnNjcmliZS5wcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoKTsKIAkJCX0KIAkJCXRoaXMuc2NyaWJlLnNjYW5uZXIucmVzZXRUbyhjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMSwgdGhpcy5zY3JpYmUuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQlzd2l0Y2godGhpcy5zY3JpYmUuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dKSB7CiAJCQkJY2FzZSAnXG4nIDoKIAkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsKQEAgLTMxOTIsNyArMzQ4Myw3IEBACiAgICAgICAgICAqLwogICAgICAgICB0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKICAgICAgICAgaW50IGxpbmUgPSB0aGlzLnNjcmliZS5saW5lOwotCQl0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRNb2RpZmllcnMoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgdGhpcywgSUNvZGVGb3JtYXR0ZXJDb25zdGFudHMuQU5OT1RBVElPTl9PTl9NRVRIT0QpOwogCQlpZiAodGhpcy5zY3JpYmUubGluZSA+IGxpbmUpIHsKICAgICAgICAgCS8vIGFubm90YXRpb25zIGludHJvZHVjZWQgbmV3IGxpbmUsIGJ1dCB0aGlzIGlzIG5vdCBhIGxpbmUgd3JhcHBpbmcKIAkJCS8vIHNlZSAxNTgyNjcKQEAgLTMyMDIsNyArMzQ5Myw3IEBACiAKIAkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKIAkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKTsgCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyk7CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgewogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQl9CkBAIC0zMjEyLDExICszNTAzLDExIEBACiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMpOwogCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMpIHsKIAkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQl9CQkJCQorCQkJCX0KIAkJCX0KIAkJCXR5cGVQYXJhbWV0ZXJzW2xlbmd0aCAtIDFdLnRyYXZlcnNlKHRoaXMsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2NvcGUpOwogCQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMpOyAKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyk7CiAJCQl9CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgewogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CkBAIC0zMjI1LDExICszNTE2LDExIEBACiAKIAkJLyoKIAkJICogUHJpbnQgdGhlIG1ldGhvZCBuYW1lCi0JCSAqLwkKLQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciwgdHJ1ZSk7IAorCQkgKi8KKwkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciwgdHJ1ZSk7CiAKIAkJZm9ybWF0TWV0aG9kQXJndW1lbnRzKAotCQkJY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgCisJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLAogCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24sCiAJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiwKIAkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uLApAQCAtMzI3Niw4ICszNTY3LDEwIEBACiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5KSB7CiAJCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCQkJfQotCQkJfSBlbHNlIGlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keSkgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHkpIHsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCQkJfQogCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSkgewogCQkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKIAkJCQl9CkBAIC0zMjg3LDE0ICszNTgwLDE0IEBACiAJCQkJfQogCQkJfQogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFKTsKLQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCWlmIChjb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9icmFjZS5lcXVhbHMoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuTkVYVF9MSU5FX1NISUZURUQpKSB7CiAJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIG5vIG1ldGhvZCBib2R5CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0zMzA5LDExICszNjAyLDEwIEBACiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkRvU3RhdGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCkBAIC0zMzIxLDcgKzM2MTMsNyBAQAogCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRvKTsKIAkJZmluYWwgaW50IGxpbmUgPSB0aGlzLnNjcmliZS5saW5lOwotCQkKKwogCQlmaW5hbCBTdGF0ZW1lbnQgYWN0aW9uID0gZG9TdGF0ZW1lbnQuYWN0aW9uOwogCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKIAkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBCbG9jaykgewpAQCAtMzMzOCw3ICszNjMwLDcgQEAKIAkJCQlhY3Rpb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCX0KIAkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwpAQCAtMzM0NywyNCArMzYzOSwyNCBAQAogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYW4gZW1wdHkgc3RhdGVtZW50CiAJCQkgKi8KLQkJCWZvcm1hdE5lY2Vzc2FyeUVtcHR5U3RhdGVtZW50KCk7IAorCQkJZm9ybWF0TmVjZXNzYXJ5RW1wdHlTdGF0ZW1lbnQoKTsKIAkJfQotCQkKKwogCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudCkgewogCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCX0KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ld2hpbGUsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2spOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlKTsKLQkJCisKIAkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUpIHsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KLQkJCisKIAkJZG9TdGF0ZW1lbnQuY29uZGl0aW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCisKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSk7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0zMzc3LDkgKzM2NjksOCBAQAogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZG91YmxlTGl0ZXJhbCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9Ci0JCUNvbnN0YW50IGNvbnN0YW50ID0gZG91YmxlTGl0ZXJhbC5jb25zdGFudDsKLQkJaWYgKGNvbnN0YW50ICE9IG51bGwgJiYgY29uc3RhbnQuZG91YmxlVmFsdWUoKSA8IDApIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTKTsJCQkKKwkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTKSkgeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURvdWJsZUxpdGVyYWwpOwogCkBAIC0zMzk3LDggKzM2ODgsOCBAQAogCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCX0KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwkKKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CisJCXJldHVybiBmYWxzZTsKIAl9CiAJLy8gZmllbGQgaXMgYW4gZW51bSBjb25zdGFudAogCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZW51bUNvbnN0YW50LCBNZXRob2RTY29wZSBzY29wZSkgewpAQCAtMzQwNiwxMCArMzY5Nyw5IEBACiAgICAgICAgICAqIFByaW50IGNvbW1lbnRzIHRvIGdldCBwcm9wZXIgbGluZSBudW1iZXIKICAgICAgICAgICovCiAgICAgICAgIHRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwotICAgICAgICBmaW5hbCBpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7IAotICAgICAgICAKLSAgICAgICAgdGhpcy5zY3JpYmUucHJpbnRNb2RpZmllcnMoZW51bUNvbnN0YW50LmFubm90YXRpb25zLCB0aGlzKTsKLQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciwgZmFsc2UpOyAKKyAgICAgICAgZmluYWwgaW50IGxpbmUgPSB0aGlzLnNjcmliZS5saW5lOworICAgICAgICB0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhlbnVtQ29uc3RhbnQuYW5ub3RhdGlvbnMsIHRoaXMsIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fRklFTEQpOworCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCBmYWxzZSk7CiAJCWZvcm1hdEVudW1Db25zdGFudEFyZ3VtZW50cygKIAkJCWVudW1Db25zdGFudCwKIAkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQsCkBAIC0zNDE4LDI3ICszNzA4LDI3IEBACiAJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQsCiAJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMsCiAJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cywKLQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCk7CQkJCi0JCQorCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50KTsKKwogCQlFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uID0gZW51bUNvbnN0YW50LmluaXRpYWxpemF0aW9uOwogCQlpZiAoaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9ICgoUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGluaXRpYWxpemF0aW9uKS5hbm9ueW1vdXNUeXBlOwogCQkJaW50IGZpZWxkc0NvdW50ID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9PSBudWxsID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOwogCQkJaW50IG1ldGhvZHNDb3VudCA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzID09IG51bGwgPyAwIDogdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMubGVuZ3RoOwogCQkJaW50IG1lbWJlcnNDb3VudCA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcy5sZW5ndGg7Ci0JCQkKKwogCQkJLyoKIAkJCSAqIFR5cGUgYm9keQogCQkJICovCiAJCQlTdHJpbmcgZW51bV9jb25zdGFudF9icmFjZSA9IHRoaXMucHJlZmVyZW5jZXMuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ7Ci0JCi0JICAgICAgICBmb3JtYXRMZWZ0Q3VybHlCcmFjZShsaW5lLCBlbnVtX2NvbnN0YW50X2JyYWNlKTsKKworCQkJZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgZW51bV9jb25zdGFudF9icmFjZSk7CiAJCQlmb3JtYXRUeXBlT3BlbmluZ0JyYWNlRm9yRW51bUNvbnN0YW50KGVudW1fY29uc3RhbnRfYnJhY2UsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQsIHR5cGVEZWNsYXJhdGlvbik7Ci0JCQkKKwogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXIpIHsKIAkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKIAkJCX0KLQkKKwogCQkJaWYgKGZpZWxkc0NvdW50ICE9IDAgfHwgbWV0aG9kc0NvdW50ICE9IDAgfHwgbWVtYmVyc0NvdW50ICE9IDApIHsKIAkJCQlmb3JtYXRUeXBlTWVtYmVycyh0eXBlRGVjbGFyYXRpb24pOwogCQkJfQpAQCAtMzQ0NiwxMiArMzczNiwxMiBAQAogCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXIpIHsKIAkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwogCQkJfQotCQkJCisKIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50KSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCQl9CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UpOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJaWYgKGVudW1fY29uc3RhbnRfYnJhY2UuZXF1YWxzKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLk5FWFRfTElORV9TSElGVEVEKSkgewogCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCQl9CkBAIC0zNDcwLDcgKzM3NjAsNyBAQAogCQkJcmV0dXJuIGR1bXBFcXVhbGl0eUV4cHJlc3Npb24oZXF1YWxFeHByZXNzaW9uLCBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFUVVBTF9FUVVBTCwgc2NvcGUpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIGR1bXBFcXVhbGl0eUV4cHJlc3Npb24oZXF1YWxFeHByZXNzaW9uLCBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVOT1RfRVFVQUwsIHNjb3BlKTsKLQkJfQkJCQorCQl9CiAJfQogCiAJLyoqCkBAIC0zNDkxLDcgKzM3ODEsNyBAQAogCiAJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gZXhwbGljaXRDb25zdHJ1Y3Rvci50eXBlQXJndW1lbnRzOwogCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7IAorCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQl9CkBAIC0zNTAxLDI0ICszNzkxLDI0IEBACiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMpOwogCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQkJCX0JCQkJCisJCQkJCX0KIAkJCQl9CiAJCQkJdHlwZUFyZ3VtZW50c1tsZW5ndGggLSAxXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpOyAKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJfQogCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMpIHsKIAkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQl9CiAJCX0KLQkJCisKIAkJaWYgKGV4cGxpY2l0Q29uc3RydWN0b3IuaXNTdXBlckFjY2VzcygpKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdXBlcik7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aGlzKTsKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uKTsKLQkJCisKIAkJZmluYWwgRXhwcmVzc2lvbltdIGFyZ3VtZW50cyA9IGV4cGxpY2l0Q29uc3RydWN0b3IuYXJndW1lbnRzOwogCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uKSB7CkBAIC0zNTI2LDcgKzM4MTYsNyBAQAogCQkJfQogCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPXRoaXMuc2NyaWJlLmNyZWF0ZUFsaWdubWVudCgKLQkJCQkJImV4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiLC8vJE5PTi1OTFMtMSQKKwkJCQkJQWxpZ25tZW50LkVYUExJQ0lUX0NPTlNUUlVDVE9SX0NBTEwsCiAJCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbCwKIAkJCQkJYXJndW1lbnRMZW5ndGgsCiAJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKQEAgLTM1MzcsNyArMzgyNyw3IEBACiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRMZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKGkgPiAwKSB7CiAJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsX2FyZ3VtZW50cyk7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCX0KIAkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYXJndW1lbnRzQWxpZ25tZW50LCBpKTsKIAkJCQkJCWlmIChpID4gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsX2FyZ3VtZW50cykgewpAQCAtMzU1MSwxMiArMzg0MSwxMiBAQAogCQkJCX0KIAkJCX0gd2hpbGUgKCFvayk7CiAJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFyZ3VtZW50c0FsaWdubWVudCwgdHJ1ZSk7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uKTsgCisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uKTsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb24pOyAKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb24pOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCS8qKgpAQCAtMzU4Nyw3ICszODc3LDcgQEAKIAkJZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKTsKLQkJCisKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGZpZWxkUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KQEAgLTM2MDMsOSArMzg5Myw4IEBACiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZU9wZW5pbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihmbG9hdExpdGVyYWwsIG51bWJlck9mUGFyZW5zKTsKIAkJfQotCQlDb25zdGFudCBjb25zdGFudCA9IGZsb2F0TGl0ZXJhbC5jb25zdGFudDsKLQkJaWYgKGNvbnN0YW50ICE9IG51bGwgJiYgZmxvYXRMaXRlcmFsLmNvbnN0YW50LmZsb2F0VmFsdWUoKSA8IDApIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTKTsJCQkKKwkJaWYgKGlzTmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTKSkgeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsKTsKIApAQCAtMzYxOCw3ICszOTA3LDcgQEAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZm9yKTsKIAkgICAgZmluYWwgaW50IGxpbmUgPSB0aGlzLnNjcmliZS5saW5lOwogCSAgICB0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcik7Ci0JCQorCiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2ZvcikgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQpAQCAtMzYzMSwxMSArMzkyMCwxMSBAQAogCQlmb3JTdGF0ZW1lbnQuY29sbGVjdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IpOwotCQkKKwogCQlmaW5hbCBTdGF0ZW1lbnQgYWN0aW9uID0gZm9yU3RhdGVtZW50LmFjdGlvbjsKIAkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CiAJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spIHsKLQkgICAgICAgICAgICBmb3JtYXRMZWZ0Q3VybHlCcmFjZShsaW5lLCB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayk7CisJCQkJZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2spOwogCQkJCWFjdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQl9IGVsc2UgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSB7CiAJCQkJLyoKQEAgLTM2NTAsMTMgKzM5MzksMTMgQEAKIAkJCX0KIAkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYW4gZW1wdHkgc3RhdGVtZW50CiAJCQkgKi8KLQkJCWZvcm1hdE5lY2Vzc2FyeUVtcHR5U3RhdGVtZW50KCk7IAorCQkJZm9ybWF0TmVjZXNzYXJ5RW1wdHlTdGF0ZW1lbnQoKTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzY2NSwxMSArMzk1NCwxMSBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Gb3JTdGF0ZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCisKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZm9yKTsKIAkgICAgZmluYWwgaW50IGxpbmUgPSB0aGlzLnNjcmliZS5saW5lOwogCSAgICB0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcik7Ci0JCQorCiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2ZvcikgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQpAQCAtMzY4Niw4ICszOTc1LDggQEAKIAkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHMpIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCQkJfQotCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKLQkJCQkJfQkJCQkKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CkBAIC0zNzEyLDE2ICs0MDAxLDE2IEBACiAJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cykgewogCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQkJfQotCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IpOwotCQkKKwogCQlmaW5hbCBTdGF0ZW1lbnQgYWN0aW9uID0gZm9yU3RhdGVtZW50LmFjdGlvbjsKIAkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CiAJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spIHsKLQkgICAgICAgICAgICBmb3JtYXRMZWZ0Q3VybHlCcmFjZShsaW5lLCB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayk7CisJCQkJZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2spOwogCQkJCWFjdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQl9IGVsc2UgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSB7CiAJCQkJLyoKQEAgLTM3MzYsMTMgKzQwMjUsMTMgQEAKIAkJCX0KIAkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYW4gZW1wdHkgc3RhdGVtZW50CiAJCQkgKi8KLQkJCWZvcm1hdE5lY2Vzc2FyeUVtcHR5U3RhdGVtZW50KCk7IAorCQkJZm9ybWF0TmVjZXNzYXJ5RW1wdHlTdGF0ZW1lbnQoKTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzc3MCw3ICs0MDU5LDcgQEAKIAkJCWlmICh0aGVuU3RhdGVtZW50IGluc3RhbmNlb2YgQmxvY2spIHsKIAkJCQl0aGVuU3RhdGVtZW50SXNCbG9jayA9IHRydWU7CiAJCQkJaWYgKGlzR3VhcmRDbGF1c2UoKEJsb2NrKXRoZW5TdGF0ZW1lbnQpICYmIGVsc2VTdGF0ZW1lbnQgPT0gbnVsbCAmJiB0aGlzLnByZWZlcmVuY2VzLmtlZXBfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lKSB7Ci0JCQkJCS8qIAorCQkJCQkvKgogCQkJCQkgKiBOZWVkIGEgc3BlY2lmaWMgZm9ybWF0dGluZyBmb3IgZ3VhcmQgY2xhdXNlcwogCQkJCQkgKiBndWFyZCBjbGF1c2VzIGFyZSBibG9jayB3aXRoIGEgc2luZ2xlIHJldHVybiBvciB0aHJvdwogCQkJCQkgKiBzdGF0ZW1lbnQKQEAgLTM3ODUsNyArNDA3NCw3IEBACiAJCQkJfQogCQkJfSBlbHNlIGlmIChlbHNlU3RhdGVtZW50ID09IG51bGwgJiYgdGhpcy5wcmVmZXJlbmNlcy5rZWVwX3NpbXBsZV9pZl9vbl9vbmVfbGluZSkgewogCQkJCUFsaWdubWVudCBjb21wYWN0SWZBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCQkiY29tcGFjdElmIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJQWxpZ25tZW50LkNPTVBBQ1RfSUYsCiAJCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZiwKIAkJCQkJCUFsaWdubWVudC5SX09VVEVSTU9TVCwKIAkJCQkJCTEsCkBAIC0zODAxLDcgKzQwOTAsNyBAQAogCQkJCQkJdGhlblN0YXRlbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJCQlpZiAodGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCQl9CiAJCQkJCQlvayA9IHRydWU7CiAJCQkJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7CkBAIC0zODE0LDE5ICs0MTAzLDE5IEBACiAJCQkJdGhlblN0YXRlbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCX0KIAkJCQlpZiAoZWxzZVN0YXRlbWVudCAhPSBudWxsKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKIAkJCQl0aGVuU3RhdGVtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCQlpZiAodGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJfQogCQkJCWlmIChlbHNlU3RhdGVtZW50ICE9IG51bGwpIHsKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CkBAIC0zODM0LDEyICs0MTIzLDEyIEBACiAJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCX0KIAkJfQotCQkKKwogCQlpZiAoZWxzZVN0YXRlbWVudCAhPSBudWxsKSB7CiAJCQlpZiAodGhlblN0YXRlbWVudElzQmxvY2spIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbHNlLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrKTsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbHNlLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrLCBTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfQkVGT1JFX0VMU0UpOwogCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbHNlLCB0cnVlKTsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVlbHNlLCB0cnVlLCBTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfQkVGT1JFX0VMU0UpOwogCQkJfQogCQkJaWYgKGVsc2VTdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9jaykgewogCQkJCWVsc2VTdGF0ZW1lbnQudHJhdmVyc2UodGhpcywgc2NvcGUpOwpAQCAtMzg1OCw3ICs0MTQ3LDcgQEAKIAkJCQllbHNlU3RhdGVtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCQlpZiAoZWxzZVN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKQEAgLTM4NjYsNyArNDE1NSw3IEBACiAJCQkJZWxzZVN0YXRlbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJaWYgKGVsc2VTdGF0ZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCX0KIAkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwogCQkJfQpAQCAtMzkwMSw3ICs0MTkwLDcgQEAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW5zdGFuY2VvZiwgdHJ1ZSk7CiAJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCWluc3RhbmNlT2ZFeHByZXNzaW9uLnR5cGUudHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oaW5zdGFuY2VPZkV4cHJlc3Npb24sIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtMzkxNyw5ICs0MjA2LDggQEAKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGludExpdGVyYWwsIG51bWJlck9mUGFyZW5zKTsKIAkJfQotCQlDb25zdGFudCBjb25zdGFudCA9IGludExpdGVyYWwuY29uc3RhbnQ7Ci0JCWlmIChjb25zdGFudCAhPSBudWxsICYmIGNvbnN0YW50LmludFZhbHVlKCkgPCAwKSB7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUyk7CQkJCisJCWlmIChpc05leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUykpIHsKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTKTsKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCk7CiAKQEAgLTM5MjksNyArNDIxNyw2IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5MYWJlbGVkU3RhdGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCkBAIC0zOTQwLDExICs0MjI3LDE0IEBACiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCkgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQorCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWwpIHsKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQl9CiAJCWZpbmFsIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBsYWJlbGVkU3RhdGVtZW50LnN0YXRlbWVudDsKIAkJc3RhdGVtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTM5NjYsOSArNDI1Niw4IEBACiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZU9wZW5pbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihsb25nTGl0ZXJhbCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9Ci0JCUNvbnN0YW50IGNvbnN0YW50ID0gbG9uZ0xpdGVyYWwuY29uc3RhbnQ7Ci0JCWlmIChjb25zdGFudCAhPSBudWxsICYmIGNvbnN0YW50LmxvbmdWYWx1ZSgpIDwgMCkgewotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpOwkJCQorCQlpZiAoaXNOZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVMpKSB7CisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUyk7CiAJCX0KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTG9uZ0xpdGVyYWwpOwogCkBAIC0zOTgyLDcgKzQyNzEsNyBAQAogCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbikgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQotCQl0aGlzLnNjcmliZS5wcmludFF1YWxpZmllZFJlZmVyZW5jZShhbm5vdGF0aW9uLnNvdXJjZUVuZCk7CisJCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGFubm90YXRpb24uc291cmNlRW5kLCBmYWxzZS8qZG8gbm90IGV4cGVjdCBwYXJlbnRoZXNpcyovKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKQEAgLTM5OTAsNyArNDI3OSw3IEBACiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uKSB7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQl9Ci0JCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGFubm90YXRpb24uc291cmNlRW5kKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoYW5ub3RhdGlvbi5zb3VyY2VFbmQsIGZhbHNlLypkbyBub3QgZXhwZWN0IHBhcmVudGhlc2lzKi8pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclZhbHVlUGFpciBwYWlyLCBCbG9ja1Njb3BlIHNjb3BlKSB7CkBAIC0zOTk5LDkgKzQyODgsMTAgQEAKIAkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3IpIHsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KLQkJcGFpci52YWx1ZS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CQorCQlwYWlyLnZhbHVlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXNzYWdlU2VuZCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlKQogCSAqLwpAQCAtNDAxMiwyMSArNDMwMiwyOCBAQAogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG1lc3NhZ2VTZW5kLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KIAkJQ2FzY2FkaW5nTWV0aG9kSW52b2NhdGlvbkZyYWdtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRGcmFnbWVudHMobWVzc2FnZVNlbmQsIHNjb3BlKTsKLQkJCisKIAkJaWYgKGJ1aWxkZXIuc2l6ZSgpID49IDMgJiYgbnVtYmVyT2ZQYXJlbnMgPT0gMCkgewogCQkJZm9ybWF0Q2FzY2FkaW5nTWVzc2FnZVNlbmRzKGJ1aWxkZXIsIHNjb3BlKTsKIAkJfSBlbHNlIHsKIAkJCUFsaWdubWVudCBtZXNzYWdlQWxpZ25tZW50ID0gbnVsbDsKIAkJCWlmICghbWVzc2FnZVNlbmQucmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkgewogCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQlpbnQgYWxpZ25tZW50TW9kZSA9IHRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbjsKIAkJCQltZXNzYWdlQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAotCQkJCQkJIm1lc3NhZ2VBbGlnbm1lbnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb24sCisJCQkJCQlBbGlnbm1lbnQuTUVTU0FHRV9TRU5ELAorCQkJCQkJYWxpZ25tZW50TW9kZSwKIAkJCQkJCTEsCiAJCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CiAJCQkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQobWVzc2FnZUFsaWdubWVudCk7CiAJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQkJCWRvIHsKKwkJCQkJc3dpdGNoIChhbGlnbm1lbnRNb2RlICYgQWxpZ25tZW50LlNQTElUX01BU0spIHsKKwkJCQkJCWNhc2UgQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDoKKwkJCQkJCWNhc2UgQWxpZ25tZW50Lk1fTkVYVF9QRVJfTElORV9TUExJVDoKKwkJCQkJCQltZXNzYWdlQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gdGhpcy5zY3JpYmUuY29sdW1uOworCQkJCQkJCWJyZWFrOworCQkJCQl9CiAJCQkJCXRyeSB7CiAJCQkJCQlmb3JtYXRNZXNzYWdlU2VuZChtZXNzYWdlU2VuZCwgc2NvcGUsIG1lc3NhZ2VBbGlnbm1lbnQpOwogCQkJCQkJb2sgPSB0cnVlOwpAQCAtNDAzNiw3ICs0MzMzLDcgQEAKIAkJCQl9IHdoaWxlICghb2spOwogCQkJCXRoaXMuc2NyaWJlLmV4aXRBbGlnbm1lbnQobWVzc2FnZUFsaWdubWVudCwgdHJ1ZSk7CiAJCQl9IGVsc2UgewotCQkJCWZvcm1hdE1lc3NhZ2VTZW5kKG1lc3NhZ2VTZW5kLCBzY29wZSwgbnVsbCk7CQkJCisJCQkJZm9ybWF0TWVzc2FnZVNlbmQobWVzc2FnZVNlbmQsIHNjb3BlLCBudWxsKTsKIAkJCX0KIAkJfQogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CkBAIC00MDU4LDEwNyArNDM1NSwxMzQgQEAKIAkJCQl0aGlzLnNjcmliZS5wcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoKTsKIAkJCX0KIAkJCXRoaXMuc2NyaWJlLnNjYW5uZXIucmVzZXRUbyhtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDEsIHRoaXMuc2NyaWJlLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKLQkJCXN3aXRjaCh0aGlzLnNjcmliZS5zY2FubmVyLnNvdXJjZVt0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0pIHsKLQkJCQljYXNlICdcbicgOgotCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOwotCQkJCQl0aGlzLnNjcmliZS5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKys7Ci0JCQkJCWlmICh0aGlzLnNjcmliZS5zY2FubmVyLnNvdXJjZVt0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CisJCQlpZiAoIXRoaXMuc2NyaWJlLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCXN3aXRjaCh0aGlzLnNjcmliZS5zY2FubmVyLnNvdXJjZVt0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0pIHsKKwkJCQkJY2FzZSAnXG4nIDoKIAkJCQkJCXRoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKys7Ci0JCQkJCX0KLQkJCQkJdGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPSAxOworCQkJCQkJdGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ1xyJyA6CisJCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJaWYgKHRoaXMuc2NyaWJlLnNjYW5uZXIuc291cmNlW3RoaXMuc2NyaWJlLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc2NyaWJlLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMTsKKwkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByaW50IGNvbW1lbnRzIHRvIGdldCBwcm9wZXIgbGluZSBudW1iZXIKLSAgICAgICAgICovCi0gICAgICAgIHRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOwotICAgICAgICBpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNjcmliZS5wcmludE1vZGlmaWVycyhtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywgdGhpcyk7Ci0gICAgICAgIAotCQlpZiAodGhpcy5zY3JpYmUubGluZSA+IGxpbmUpIHsKLSAgICAgICAgCS8vIGFubm90YXRpb25zIGludHJvZHVjZWQgbmV3IGxpbmUsIGJ1dCB0aGlzIGlzIG5vdCBhIGxpbmUgd3JhcHBpbmcKLQkJCS8vIHNlZSAxNTgyNjcKLQkJCWxpbmUgPSB0aGlzLnNjcmliZS5saW5lOwotCQl9Ci0JCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQotCQlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVyczsKLQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKLQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKTsgCi0JCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgewotCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQl9Ci0JCQlpbnQgbGVuZ3RoID0gdHlwZVBhcmFtZXRlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKLQkJCQl0eXBlUGFyYW1ldGVyc1tpXS50cmF2ZXJzZSh0aGlzLCBtZXRob2REZWNsYXJhdGlvbi5zY29wZSk7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMpOwotCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMpIHsKLQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQl9CQkJCQotCQkJfQotCQkJdHlwZVBhcmFtZXRlcnNbbGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgbWV0aG9kRGVjbGFyYXRpb24uc2NvcGUpOwotCQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMpOyAKLQkJCX0KLQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKSB7Ci0JCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCX0KLQkJfQotCQkKKwogCQkvKgotCQkgKiBQcmludCB0aGUgbWV0aG9kIHJldHVybiB0eXBlCi0JCSAqLwkKLQkJZmluYWwgVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24ucmV0dXJuVHlwZTsKKwkJICogUHJpbnQgY29tbWVudHMgdG8gZ2V0IHByb3BlciBsaW5lIG51bWJlcgorCQkgKi8KKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CisJCWludCBsaW5lID0gdGhpcy5zY3JpYmUubGluZTsKKworCQkvLyBDcmVhdGUgYWxpZ25tZW50CisJCUFsaWdubWVudCBtZXRob2REZWNsQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAorCQkJCUFsaWdubWVudC5NRVRIT0RfREVDTEFSQVRJT04sCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiwKKwkJCQlBbGlnbm1lbnQuUl9JTk5FUk1PU1QsCisJCQkJMywKKwkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisJCXRoaXMuc2NyaWJlLmVudGVyQWxpZ25tZW50KG1ldGhvZERlY2xBbGlnbm1lbnQpOworCQlib29sZWFuIG9rID0gZmFsc2U7CiAJCWZpbmFsIE1ldGhvZFNjb3BlIG1ldGhvZERlY2xhcmF0aW9uU2NvcGUgPSBtZXRob2REZWNsYXJhdGlvbi5zY29wZTsKKwkJZG8geworCQkJdHJ5IHsKKworCQkJCXRoaXMuc2NyaWJlLnByaW50TW9kaWZpZXJzKG1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zLCB0aGlzLCBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX01FVEhPRCk7CisJCQkJaW50IGZyYWdtZW50SW5kZXggPSAwOworCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQobWV0aG9kRGVjbEFsaWdubWVudCwgZnJhZ21lbnRJbmRleCk7CisKKwkJCQlpZiAodGhpcy5zY3JpYmUubGluZSA+IGxpbmUpIHsKKwkJCQkJLy8gYW5ub3RhdGlvbnMgaW50cm9kdWNlZCBuZXcgbGluZSwgYnV0IHRoaXMgaXMgbm90IGEgbGluZSB3cmFwcGluZworCQkJCQkvLyBzZWUgMTU4MjY3CisJCQkJCWxpbmUgPSB0aGlzLnNjcmliZS5saW5lOworCQkJCX0KKwkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCisJCQkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM7CisJCQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMpOworCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgeworCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJfQorCQkJCQlpbnQgbGVuZ3RoID0gdHlwZVBhcmFtZXRlcnMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgeworCQkJCQkJdHlwZVBhcmFtZXRlcnNbaV0udHJhdmVyc2UodGhpcywgbWV0aG9kRGVjbGFyYXRpb24uc2NvcGUpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMpOworCQkJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycykgeworCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdHlwZVBhcmFtZXRlcnNbbGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgbWV0aG9kRGVjbGFyYXRpb24uc2NvcGUpOworCQkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzKTsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycykgeworCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJfQorCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KG1ldGhvZERlY2xBbGlnbm1lbnQsICsrZnJhZ21lbnRJbmRleCk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBQcmludCB0aGUgbWV0aG9kIHJldHVybiB0eXBlCisJCQkJICovCisJCQkJZmluYWwgVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24ucmV0dXJuVHlwZTsKIAkJCi0JCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKLQkJCXJldHVyblR5cGUudHJhdmVyc2UodGhpcywgbWV0aG9kRGVjbGFyYXRpb25TY29wZSk7Ci0JCX0KLQkJLyoKLQkJICogUHJpbnQgdGhlIG1ldGhvZCBuYW1lCi0JCSAqLwotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsgCisJCQkJaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgeworCQkJCQlyZXR1cm5UeXBlLnRyYXZlcnNlKHRoaXMsIG1ldGhvZERlY2xhcmF0aW9uU2NvcGUpOworCQkJCX0KKwkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KG1ldGhvZERlY2xBbGlnbm1lbnQsICsrZnJhZ21lbnRJbmRleCk7CiAKLQkJZm9ybWF0TWV0aG9kQXJndW1lbnRzKAotCQkJbWV0aG9kRGVjbGFyYXRpb24sIAotCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uLAotCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uLAotCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uLAotCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24sCi0JCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMsCi0JCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycywKLQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbik7CisJCQkJLyoKKwkJCQkgKiBQcmludCB0aGUgbWV0aG9kIG5hbWUKKwkJCQkgKi8KKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyLCB0cnVlKTsKIAotCQkvKgotCQkgKiBDaGVjayBmb3IgZXh0cmEgZGltZW5zaW9ucwotCQkgKi8KLQkJaW50IGV4dHJhRGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoKTsKLQkJaWYgKGV4dHJhRGltZW5zaW9ucyAhPSAwKSB7Ci0JCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYURpbWVuc2lvbnM7IGkrKykgewotCQkJIAl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0tFVCk7Ci0JCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKLQkJCSB9Ci0JCX0KLQkJCQkKLQkJZm9ybWF0VGhyb3dzQ2xhdXNlKAotCQkJbWV0aG9kRGVjbGFyYXRpb24sCi0JCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cywKLQkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MsCi0JCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24pOworCQkJCS8vIEZvcm1hdCBhcmd1bWVudHMKKwkJCQlmb3JtYXRNZXRob2RBcmd1bWVudHMoCisJCQkJCW1ldGhvZERlY2xhcmF0aW9uLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24sCisJCQkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbiwKKwkJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiwKKwkJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycywKKwkJCQkJdGhpcy5wcmVmZXJlbmNlcy5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uKTsKKworCQkJCS8qCisJCQkJICogQ2hlY2sgZm9yIGV4dHJhIGRpbWVuc2lvbnMKKwkJCQkgKi8KKwkJCQlpbnQgZXh0cmFEaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucygpOworCQkJCWlmIChleHRyYURpbWVuc2lvbnMgIT0gMCkgeworCQkJCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYURpbWVuc2lvbnM7IGkrKykgeworCQkJCQkgCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDS0VUKTsKKwkJCQkJIAl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0tFVCk7CisJCQkJCSB9CisJCQkJfQorCisJCQkJLy8gRm9ybWF0IHRocm93cworCQkJCWZvcm1hdFRocm93c0NsYXVzZSgKKwkJCQkJbWV0aG9kRGVjbGFyYXRpb24sCisJCQkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24pOworCQkJCW9rID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKKwkJCX0KKwkJfSB3aGlsZSAoIW9rKTsKKwkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChtZXRob2REZWNsQWxpZ25tZW50LCB0cnVlKTsKIAogCQlpZiAoIW1ldGhvZERlY2xhcmF0aW9uLmlzTmF0aXZlKCkgJiYgIW1ldGhvZERlY2xhcmF0aW9uLmlzQWJzdHJhY3QoKSAmJiAoKG1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjU2VtaWNvbG9uQm9keSkgPT0gMCkpIHsKIAkJCS8qCiAJCQkgKiBNZXRob2QgYm9keQogCQkJICovCiAJCQlTdHJpbmcgbWV0aG9kX2RlY2xhcmF0aW9uX2JyYWNlID0gdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uOwotICAgICAgICAgICAgZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgbWV0aG9kX2RlY2xhcmF0aW9uX2JyYWNlKTsKKwkJCWZvcm1hdExlZnRDdXJseUJyYWNlKGxpbmUsIG1ldGhvZF9kZWNsYXJhdGlvbl9icmFjZSk7CiAJCQlmb3JtYXRPcGVuaW5nQnJhY2UobWV0aG9kX2RlY2xhcmF0aW9uX2JyYWNlLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb24pOwogCQkJZmluYWwgaW50IG51bWJlck9mQmxhbmtMaW5lc0F0QmVnaW5uaW5nT2ZNZXRob2RCb2R5ID0gdGhpcy5wcmVmZXJlbmNlcy5ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk7CiAJCQlpZiAobnVtYmVyT2ZCbGFua0xpbmVzQXRCZWdpbm5pbmdPZk1ldGhvZEJvZHkgPiAwKSB7CkBAIC00MTcxLDM4ICs0NDk1LDQxIEBACiAJCQkJCXRoaXMuc2NyaWJlLmluZGVudCgpOwogCQkJCX0KIAkJCQlmb3JtYXRTdGF0ZW1lbnRzKG1ldGhvZERlY2xhcmF0aW9uU2NvcGUsIHN0YXRlbWVudHMsIHRydWUpOwotCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfQVRfRU5EX09GX01FVEhPRF9ERUNMQVJBVElPTik7CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5KSB7CiAJCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7CiAJCQkJfQotCQkJfSBlbHNlIGlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keSkgewotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHkpIHsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CisJCQkJfQogCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSkgewogCQkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKIAkJCQl9Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CisJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KFNjcmliZS5QUkVTRVJWRV9FTVBUWV9MSU5FU19BVF9FTkRfT0ZfTUVUSE9EX0RFQ0xBUkFUSU9OKTsKIAkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHkpIHsKIAkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCQl9CiAJCQl9CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UpOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJaWYgKG1ldGhvZF9kZWNsYXJhdGlvbl9icmFjZS5lcXVhbHMoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuTkVYVF9MSU5FX1NISUZURUQpKSB7CiAJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIG5vIG1ldGhvZCBib2R5CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkNPTVBMRVhfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgewogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBVCk7CiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uKSB7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQl9Ci0JCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGFubm90YXRpb24uc291cmNlRW5kKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoYW5ub3RhdGlvbi5zb3VyY2VFbmQsIGZhbHNlLypkbyBub3QgZXhwZWN0IHBhcmVudGhlc2lzKi8pOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24pOwogCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uKSB7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwpAQCAtNDIxMCwxNCArNDUzNywzMiBAQAogCQlNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5tZW1iZXJWYWx1ZVBhaXJzOwogCQlpZiAobWVtYmVyVmFsdWVQYWlycyAhPSBudWxsKSB7CiAJCQlpbnQgbGVuZ3RoID0gbWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewotCQkJCW1lbWJlclZhbHVlUGFpcnNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbik7Ci0JCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb24pIHsKLQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCUFsaWdubWVudCBhbm5vdGF0aW9uQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAorCQkJCQlBbGlnbm1lbnQuQU5OT1RBVElPTl9NRU1CRVJTX1ZBTFVFX1BBSVJTLAorCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb24sCisJCQkJCWxlbmd0aCwKKwkJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOworCQkJdGhpcy5zY3JpYmUuZW50ZXJBbGlnbm1lbnQoYW5ub3RhdGlvbkFsaWdubWVudCk7CisJCQlib29sZWFuIG9rID0gZmFsc2U7CisJCQlkbyB7CisJCQkJdHJ5IHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc2NyaWJlLmFsaWduRnJhZ21lbnQoYW5ub3RhdGlvbkFsaWdubWVudCwgaSk7CisJCQkJCQlpZiAoaSA+IDAgJiYgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbikgeworCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQl9CisJCQkJCQltZW1iZXJWYWx1ZVBhaXJzW2ldLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQkJfQorCQkJCQlvayA9IHRydWU7CisJCQkJfSBjYXRjaCAoQWxpZ25tZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhpcy5zY3JpYmUucmVkb0FsaWdubWVudChlKTsKIAkJCQl9Ci0JCQl9Ci0JCQltZW1iZXJWYWx1ZVBhaXJzW2xlbmd0aCAtIDFdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCX0gd2hpbGUgKCFvayk7CisJCQl0aGlzLnNjcmliZS5leGl0QWxpZ25tZW50KGFubm90YXRpb25BbGlnbm1lbnQsIHRydWUpOwogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbik7CiAJCXJldHVybiBmYWxzZTsKQEAgLTQyNTcsMjMgKzQ2MDIsMjggQEAKIAkJaW50IGxlbmd0aCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKTsKLQkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwkJCQorCQkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CiAJCQlpZiAodHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewotCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJCX0KIAkJCQlpbnQgdHlwZUFyZ3VtZW50TGVuZ3RoID0gdHlwZUFyZ3VtZW50Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVBcmd1bWVudExlbmd0aCAtIDE7IGorKykgewotCQkJCQl0eXBlQXJndW1lbnRbal0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgeworCQkJCWlmICh0eXBlQXJndW1lbnRMZW5ndGggPiAwKSB7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewogCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJfQkJCQotCQkJCX0KLQkJCQl0eXBlQXJndW1lbnRbdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCWlmIChpc0Nsb3NpbmdHZW5lcmljVG9rZW4oKSkgewotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJCQl9CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMTsgaisrKSB7CisJCQkJCQl0eXBlQXJndW1lbnRbal0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKKwkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0eXBlQXJndW1lbnRbdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TKTsKIAkJCQl9CiAJCQl9CiAJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKQEAgLTQyOTIsNyArNDY0Miw3IEBACiAJCQkJfQogCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCX0KLQkJfQkJCisJCX0KIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KQEAgLTQzMDksMjMgKzQ2NTksMjggQEAKIAkJaW50IGxlbmd0aCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKTsKLQkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwkJCQorCQkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CiAJCQlpZiAodHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewotCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwotCQkJCX0KIAkJCQlpbnQgdHlwZUFyZ3VtZW50TGVuZ3RoID0gdHlwZUFyZ3VtZW50Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVBcmd1bWVudExlbmd0aCAtIDE7IGorKykgewotCQkJCQl0eXBlQXJndW1lbnRbal0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgeworCQkJCWlmICh0eXBlQXJndW1lbnRMZW5ndGggPiAwKSB7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewogCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJfQkJCQotCQkJCX0KLQkJCQl0eXBlQXJndW1lbnRbdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCWlmIChpc0Nsb3NpbmdHZW5lcmljVG9rZW4oKSkgewotCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJCQl9CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMTsgaisrKSB7CisJCQkJCQl0eXBlQXJndW1lbnRbal0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKKwkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0eXBlQXJndW1lbnRbdHlwZUFyZ3VtZW50TGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TKTsKIAkJCQl9CiAJCQl9CiAJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKQEAgLTQzNDQsNyArNDY5OSw3IEBACiAJCQkJfQogCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCX0KLQkJfQkJCisJCX0KIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KQEAgLTQzNTksMjMgKzQ3MTQsMjkgQEAKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKTsKIAotCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpIHsKLQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCX0KIAkJVHlwZVJlZmVyZW5jZVtdIHR5cGVBcmd1bWVudHMgPSBwYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZS50eXBlQXJndW1lbnRzOwogCQlpbnQgdHlwZUFyZ3VtZW50c0xlbmd0aCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHNMZW5ndGggLSAxOyBpKyspIHsKLQkJCXR5cGVBcmd1bWVudHNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKLQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKSB7CisJCWlmICh0eXBlQXJndW1lbnRzTGVuZ3RoID4gMCkgeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKKwkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQl9CQkJCisJCQl9CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHNMZW5ndGggLSAxOyBpKyspIHsKKwkJCQl0eXBlQXJndW1lbnRzW2ldLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKSB7CisJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJfQorCQkJfQorCQkJdHlwZUFyZ3VtZW50c1t0eXBlQXJndW1lbnRzTGVuZ3RoIC0gMV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7CisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TKTsKIAkJfQotCQl0eXBlQXJndW1lbnRzW3R5cGVBcmd1bWVudHNMZW5ndGggLSAxXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCWlmIChpc0Nsb3NpbmdHZW5lcmljVG9rZW4oKSkgewotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKLQkJfQorCiAJCWludCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucygpOwogCQlpZiAoZGltZW5zaW9ucyAhPSAwICYmIGRpbWVuc2lvbnMgPD0gcGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UuZGltZW5zaW9ucygpKSB7CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZSkgewpAQCAtNDM4OCw3ICs0NzQ5LDcgQEAKIAkJCQl9CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQpOwogCQkJfQotCQl9CQkKKwkJfQogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24ocGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtNDQwMywyMyArNDc2NCwyOSBAQAogCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpOwogCi0JCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1MsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSkgewotCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJfQogCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLnR5cGVBcmd1bWVudHM7CiAJCWludCB0eXBlQXJndW1lbnRzTGVuZ3RoID0gdHlwZUFyZ3VtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50c0xlbmd0aCAtIDE7IGkrKykgewotCQkJdHlwZUFyZ3VtZW50c1tpXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpIHsKKwkJaWYgKHR5cGVBcmd1bWVudHNMZW5ndGggPiAwKSB7CisJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKSB7CiAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCX0JCQkKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50c0xlbmd0aCAtIDE7IGkrKykgeworCQkJCXR5cGVBcmd1bWVudHNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSk7CisJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpIHsKKwkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQl9CisJCQl9CisJCQl0eXBlQXJndW1lbnRzW3R5cGVBcmd1bWVudHNMZW5ndGggLSAxXS50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CisJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKENMT1NJTkdfR0VORVJJQ1NfRVhQRUNURURUT0tFTlMpOwogCQl9Ci0JCXR5cGVBcmd1bWVudHNbdHlwZUFyZ3VtZW50c0xlbmd0aCAtIDFdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJaWYgKGlzQ2xvc2luZ0dlbmVyaWNUb2tlbigpKSB7Ci0JCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UpOwotCQl9CisKIAkJaW50IGRpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKCk7CiAJCWlmIChkaW1lbnNpb25zICE9IDAgJiYgZGltZW5zaW9ucyA8PSBwYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZS5kaW1lbnNpb25zKCkpIHsKIAkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlKSB7CkBAIC00NDMyLDEzICs0Nzk5LDEzIEBACiAJCQkJfQogCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUKTsKIAkJCX0KLQkJfQkJCisJCX0KIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Qb3N0Zml4RXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlKQogCSAqLwpAQCAtNDQ1MSw3ICs0ODE4LDcgQEAKIAkJCW1hbmFnZU9wZW5pbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihwb3N0Zml4RXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAJCXBvc3RmaXhFeHByZXNzaW9uLmxocy50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCWludCBvcGVyYXRvciA9IHBvc3RmaXhFeHByZXNzaW9uLm9wZXJhdG9yID09IE9wZXJhdG9ySWRzLlBMVVMgCisJCWludCBvcGVyYXRvciA9IHBvc3RmaXhFeHByZXNzaW9uLm9wZXJhdG9yID09IE9wZXJhdG9ySWRzLlBMVVMKIAkJCT8gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUExVU19QTFVTIDogVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVNfTUlOVVM7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKG9wZXJhdG9yLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcik7CiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yKSB7CkBAIC00NDcyLDcgKzQ4MzksNyBAQAogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24ocHJlZml4RXhwcmVzc2lvbiwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9Ci0JCWludCBvcGVyYXRvciA9IHByZWZpeEV4cHJlc3Npb24ub3BlcmF0b3IgPT0gT3BlcmF0b3JJZHMuUExVUyAKKwkJaW50IG9wZXJhdG9yID0gcHJlZml4RXhwcmVzc2lvbi5vcGVyYXRvciA9PSBPcGVyYXRvcklkcy5QTFVTCiAJCQk/IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVBMVVNfUExVUyA6IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTX01JTlVTOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihvcGVyYXRvciwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcik7CiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3IpIHsKQEAgLTQ0ODQsMTQgKzQ4NTEsMTQgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQkKKwogCQlmaW5hbCBpbnQgbnVtYmVyT2ZQYXJlbnMgPSAocXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uYml0cyAmIEFTVE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFTVE5vZGUuUGFyZW50aGVzaXplZFNISUZUOwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24ocXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24sIG51bWJlck9mUGFyZW5zKTsKQEAgLTQ1MDEsMTIgKzQ4NjgsMTIgQEAKIAkJCWVuY2xvc2luZ0luc3RhbmNlLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCk7CiAJCX0KLQkJCisKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbmV3KTsKIAkJLy8gdXNlZCBmb3IgdGhlIG5ldyBsaW5lIG9uIHdyYXAgc3R5bGUgb2YgZm9ybWF0dGluZwogCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IHF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGVBcmd1bWVudHM7CiAJCWlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsgCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCX0KQEAgLTQ1MTYsMTEgKzQ4ODMsMTEgQEAKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyk7CiAJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJfQkJCQkKKwkJCQkJfQogCQkJCX0KIAkJCQl0eXBlQXJndW1lbnRzW2xlbmd0aCAtIDFdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCQlpZiAoaXNDbG9zaW5nR2VuZXJpY1Rva2VuKCkpIHsKLQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oQ0xPU0lOR19HRU5FUklDU19FWFBFQ1RFRFRPS0VOUywgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyk7IAorCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihDTE9TSU5HX0dFTkVSSUNTX0VYUEVDVEVEVE9LRU5TLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzKTsKIAkJCQl9CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cykgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwpAQCAtNDUzMSw3ICs0ODk4LDcgQEAKIAogCQlmaW5hbCBpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7CiAJCXF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUudHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkKKwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uKTsKIAogCQlmaW5hbCBFeHByZXNzaW9uW10gYXJndW1lbnRzID0gcXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uYXJndW1lbnRzOwpAQCAtNDU0MSw3ICs0OTA4LDcgQEAKIAkJCX0KIAkJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAJCQlBbGlnbm1lbnQgYXJndW1lbnRzQWxpZ25tZW50ID10aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCi0JCQkJCSJhbGxvY2F0aW9uIiwvLyROT04tTkxTLTEkCisJCQkJCUFsaWdubWVudC5BTExPQ0FUSU9OLAogCQkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb24sCiAJCQkJCWFyZ3VtZW50TGVuZ3RoLAogCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CkBAIC00NTUyLDcgKzQ5MTksNyBAQAogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspIHsKIAkJCQkJCWlmIChpID4gMCkgewogCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uKTsKLQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQkJfQogCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcmd1bWVudHNBbGlnbm1lbnQsIGkpOwogCQkJCQkJaWYgKGkgPiAwICYmIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbikgewpAQCAtNDU2Niw3ICs0OTMzLDcgQEAKIAkJCQl9CiAJCQl9IHdoaWxlICghb2spOwogCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhcmd1bWVudHNBbGlnbm1lbnQsIHRydWUpOwotCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbik7IAorCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbik7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uKTsKIAkJfQpAQCAtNDU5Miw3ICs0OTU5LDcgQEAKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHF1YWxpZmllZE5hbWVSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQotCQl0aGlzLnNjcmliZS5wcmludFF1YWxpZmllZFJlZmVyZW5jZShxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCXRoaXMuc2NyaWJlLnByaW50UXVhbGlmaWVkUmVmZXJlbmNlKHF1YWxpZmllZE5hbWVSZWZlcmVuY2Uuc291cmNlRW5kLCBudW1iZXJPZlBhcmVucz49MC8qZXhwZWN0IHBhcmVudGhlc2lzKi8pOwogCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihxdWFsaWZpZWROYW1lUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CkBAIC00NjE0LDcgKzQ5ODEsNyBAQAogCQlxdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5xdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UKTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXIpOwotCQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24ocXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtNDYzNSw3ICs1MDAyLDcgQEAKIAkJcXVhbGlmaWVkVGhpc1JlZmVyZW5jZS5xdWFsaWZpY2F0aW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UKTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhpcyk7Ci0JCQorCiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihxdWFsaWZpZWRUaGlzUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KQEAgLTQ2NTMsOCArNTAyMCw4IEBACiAJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCW1hbmFnZU9wZW5pbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCX0KLQkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQpOwotCQkKKwkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQsIG51bWJlck9mUGFyZW5zPj0wLypleHBlY3QgcGFyZW50aGVzaXMqLyk7CisKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtNDY3Miw4ICs1MDM5LDggQEAKIAkJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24ocXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgbnVtYmVyT2ZQYXJlbnMpOwogCQkJfQotCQkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQpOwotCQkJCisJCQl0aGlzLnNjcmliZS5wcmludFF1YWxpZmllZFJlZmVyZW5jZShxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZUVuZCwgbnVtYmVyT2ZQYXJlbnM+PTAvKmV4cGVjdCBwYXJlbnRoZXNpcyovKTsKKwogCQkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCQl9CkBAIC00Njg0LDcgKzUwNTEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZXR1cm5TdGF0ZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXJldHVybik7CiAJCWZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5leHByZXNzaW9uOwogCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CkBAIC00Njk3LDkgKzUwNjQsOSBAQAogCQl9CiAJCS8qCiAJCSAqIFByaW50IHRoZSBzZW1pLWNvbG9uCi0JCSAqLwkKKwkJICovCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgewpAQCAtNDcwNyw3ICs1MDc0LDcgQEAKIAkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb24pIHsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KLQkJdGhpcy5zY3JpYmUucHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoYW5ub3RhdGlvbi5zb3VyY2VFbmQpOworCQl0aGlzLnNjcmliZS5wcmludFF1YWxpZmllZFJlZmVyZW5jZShhbm5vdGF0aW9uLnNvdXJjZUVuZCwgZmFsc2UvKmRvIG5vdCBleHBlY3QgcGFyZW50aGVzaXMqLyk7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbik7CiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24pIHsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CkBAIC00NzI2LDcgKzUwOTMsNyBAQAogCQkJbWFuYWdlT3BlbmluZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHNpbmdsZU5hbWVSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihTSU5HTEVUWVBFUkVGRVJFTkNFX0VYUEVDVEVEVE9LRU5TKTsKLQkJCisKIAkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJbWFuYWdlQ2xvc2luZ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHNpbmdsZU5hbWVSZWZlcmVuY2UsIG51bWJlck9mUGFyZW5zKTsKIAkJfQpAQCAtNDc4MSw3ICs1MTQ4LDcgQEAKIAkJfQogCQl0aGlzLnNjcmliZS5jaGVja05MU1RhZyhzdHJpbmdMaXRlcmFsLnNvdXJjZVN0YXJ0KTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCk7Ci0JCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oc3RyaW5nTGl0ZXJhbCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CkBAIC00Nzk3LDEwICs1MTY0LDE1IEBACiAJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oc3RyaW5nTGl0ZXJhbCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CiAKLQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CisJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fU1RSSU5HX0xJVEVSQUxfQ09OQ0FURU5BVElPTik7CiAJCUFTVE5vZGVbXSBmcmFnbWVudHMgPSBzdHJpbmdMaXRlcmFsLmxpdGVyYWxzOwogCQlpbnQgZnJhZ21lbnRzU2l6ZSA9IHN0cmluZ0xpdGVyYWwuY291bnRlcjsKLQkJQWxpZ25tZW50IGJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoImJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnQiLCB0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb24sIEFsaWdubWVudC5SX09VVEVSTU9TVCwgZnJhZ21lbnRzU2l6ZSwgdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOyAvLyROT04tTkxTLTEkCisJCUFsaWdubWVudCBiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50ID0gdGhpcy5zY3JpYmUuY3JlYXRlQWxpZ25tZW50KAorCQkJCUFsaWdubWVudC5TVFJJTkdfQ09OQ0FURU5BVElPTiwKKwkJCQl0aGlzLnByZWZlcmVuY2VzLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb24sCisJCQkJQWxpZ25tZW50LlJfT1VURVJNT1NULAorCQkJCWZyYWdtZW50c1NpemUsCisJCQkJdGhpcy5zY3JpYmUuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50KTsKIAkJYm9vbGVhbiBvayA9IGZhbHNlOwogCQlkbyB7CkBAIC00ODA4LDkgKzUxODAsOSBAQAogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzU2l6ZSAtIDE7IGkrKykgewogCQkJCQlBU1ROb2RlIGZyYWdtZW50ID0gZnJhZ21lbnRzW2ldOwogCQkJCQlmcmFnbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQlpZiAodGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPT0gMSkgewotCQkJCQkJLy8gYSBuZXcgbGluZSBoYXMgYmVlbiBpbnNlcnRlZCBieSBwcmludFRyYWlsaW5nQ29tbWVudCgpCisJCQkJCQkvLyBhIG5ldyBsaW5lIGhhcyBiZWVuIGluc2VydGVkIGJ5IHByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpCiAJCQkJCQl0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsID0gYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWw7CiAJCQkJCX0KIAkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LCBpKTsKQEAgLTQ4MjAsMTQgKzUxOTIsMTQgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlmcmFnbWVudHNbZnJhZ21lbnRzU2l6ZSAtIDFdLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCW9rID0gdHJ1ZTsKIAkJCX0gY2F0Y2goQWxpZ25tZW50RXhjZXB0aW9uIGUpewogCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CiAJCQl9Ci0JCX0gd2hpbGUgKCFvayk7CQkKKwkJfSB3aGlsZSAoIW9rKTsKIAkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChiaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50LCB0cnVlKTsKLQkKKwogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24oc3RyaW5nTGl0ZXJhbCwgbnVtYmVyT2ZQYXJlbnMpOwogCQl9CkBAIC00ODU3LDExICs1MjI5LDEwIEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgewogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzd2l0Y2gpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCk7Ci0JCQorCiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCkgewogCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJfQotCQkKIAkJc3dpdGNoU3RhdGVtZW50LmV4cHJlc3Npb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaCk7CiAJCS8qCkBAIC00ODcxLDg5ICs1MjQyLDg0IEBACiAJCWZvcm1hdE9wZW5pbmdCcmFjZShzd2l0Y2hfYnJhY2UsIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaCk7CiAJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwogCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoKSB7Ci0JCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKLQkJfQogCQlmaW5hbCBTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzID0gc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHM7CisJCWludCBzd2l0Y2hJbmRlbnRhdGlvbkxldmVsID0gdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbDsKKwkJaW50IGNhc2VJbmRlbnRhdGlvbiA9IDA7CisJCWludCBzdGF0ZW1lbnRJbmRlbnRhdGlvbiA9IDA7CisJCWludCBicmVha0luZGVudGF0aW9uID0gMDsKKwkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2gpIHsKKwkJCWNhc2VJbmRlbnRhdGlvbisrOworCQkJc3RhdGVtZW50SW5kZW50YXRpb24rKzsKKwkJCWJyZWFrSW5kZW50YXRpb24rKzsKKwkJfQorCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzKSB7CisJCQlzdGF0ZW1lbnRJbmRlbnRhdGlvbisrOworCQl9CisJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcykgeworCQkJYnJlYWtJbmRlbnRhdGlvbisrOworCQl9CiAJCWJvb2xlYW4gd2FzQUNhc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiB3YXNBU3RhdGVtZW50ID0gZmFsc2U7CisJCWJvb2xlYW4gd2FzQUJyZWFrID0gZmFsc2U7CiAJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKIAkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHNMZW5ndGg7IGkrKykgewogCQkJCWZpbmFsIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzW2ldOwogCQkJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBDYXNlU3RhdGVtZW50KSB7CisJCQkJCWlmICh3YXNBQnJlYWspIHsKKwkJCQkJCXRoaXMuc2NyaWJlLnNldEluZGVudGF0aW9uKHN3aXRjaEluZGVudGF0aW9uTGV2ZWwsIGNhc2VJbmRlbnRhdGlvbik7CisJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh3YXNBQ2FzZSkgeworCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChTY3JpYmUuUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fU1dJVENIX0NBU0UpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc2NyaWJlLnNldEluZGVudGF0aW9uKHN3aXRjaEluZGVudGF0aW9uTGV2ZWwsIGNhc2VJbmRlbnRhdGlvbik7CisJCQkJCX0KIAkJCQkJaWYgKHdhc0FDYXNlKSB7CiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQkJfQotCQkJCQlpZiAoKHdhc0FDYXNlICYmIHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcykgCi0JCQkJCQl8fCAod2FzQVN0YXRlbWVudCAmJiB0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXMpKSB7Ci0JCQkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwotCQkJCQl9CiAJCQkJCXN0YXRlbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCS8vIFByaW50IGZvbGxvd2luZyB0cmFpbGluZyAoaWYgYW55KSBjb21tZW50IGF0IHN0YXRlbWVudCBpbmRlbnRhdGlvbgorCQkJCQl0aGlzLnNjcmliZS5zZXRJbmRlbnRhdGlvbihzd2l0Y2hJbmRlbnRhdGlvbkxldmVsLCBzdGF0ZW1lbnRJbmRlbnRhdGlvbik7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkNPTVBMRVhfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCQkJCXdhc0FDYXNlID0gdHJ1ZTsKLQkJCQkJd2FzQVN0YXRlbWVudCA9IGZhbHNlOwotCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzKSB7Ci0JCQkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKLQkJCQkJfQorCQkJCQl3YXNBQnJlYWsgPSBmYWxzZTsKIAkJCQl9IGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEJyZWFrU3RhdGVtZW50KSB7Ci0JCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcykgewotCQkJCQkJaWYgKHdhc0FTdGF0ZW1lbnQgJiYgIXRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcykgewotCQkJCQkJCXRoaXMuc2NyaWJlLmluZGVudCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHdhc0FTdGF0ZW1lbnQpIHsKLQkJCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzKSB7Ci0JCQkJCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHdhc0FDYXNlICYmIHRoaXMucHJlZmVyZW5jZXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcykgewotCQkJCQkJCXRoaXMuc2NyaWJlLnVuSW5kZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KKwkJCQkJdGhpcy5zY3JpYmUuc2V0SW5kZW50YXRpb24oc3dpdGNoSW5kZW50YXRpb25MZXZlbCwgYnJlYWtJbmRlbnRhdGlvbik7CiAJCQkJCWlmICh3YXNBQ2FzZSkgewogCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCQkJCX0KKwkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CiAJCQkJCXN0YXRlbWVudC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcykgewotCQkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKLQkJCQkJfQogCQkJCQl3YXNBQ2FzZSA9IGZhbHNlOwotCQkJCQl3YXNBU3RhdGVtZW50ID0gZmFsc2U7CisJCQkJCXdhc0FCcmVhayA9IHRydWU7CiAJCQkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9jaykgewotCQkJCQlTdHJpbmcgYnJhY2VQb3NpdGlvbjsKLQkJCQkJaWYgKHdhc0FDYXNlKSB7Ci0JCQkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzKSB7Ci0JCQkJCQkJdGhpcy5zY3JpYmUudW5JbmRlbnQoKTsKLQkJCQkJCX0KLQkJCQkJCWJyYWNlUG9zaXRpb24gPQl0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlOwotCQkJCQkJZm9ybWF0QmxvY2soKEJsb2NrKSBzdGF0ZW1lbnQsIHNjb3BlLCBicmFjZVBvc2l0aW9uLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlKTsKLQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXMpIHsKLQkJCQkJCQl0aGlzLnNjcmliZS5pbmRlbnQoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJyYWNlUG9zaXRpb24gPQl0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jazsKLQkJCQkJCWZvcm1hdEJsb2NrKChCbG9jaykgc3RhdGVtZW50LCBzY29wZSwgYnJhY2VQb3NpdGlvbiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2spOwotCQkJCQl9Ci0JCQkJCXdhc0FTdGF0ZW1lbnQgPSB0cnVlOworCQkJCQl0aGlzLnNjcmliZS5zZXRJbmRlbnRhdGlvbihzd2l0Y2hJbmRlbnRhdGlvbkxldmVsLCB3YXNBQ2FzZSA/IGNhc2VJbmRlbnRhdGlvbiA6IHN0YXRlbWVudEluZGVudGF0aW9uKTsKKwkJCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CisJCQkJCVN0cmluZyBicmFjZVBvc2l0aW9uID0gd2FzQUNhc2UgPyB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlIDogdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s7CisJCQkJCWZvcm1hdEJsb2NrKChCbG9jaykgc3RhdGVtZW50LCBzY29wZSwgYnJhY2VQb3NpdGlvbiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2spOwogCQkJCQl3YXNBQ2FzZSA9IGZhbHNlOworCQkJCQl3YXNBQnJlYWsgPSBmYWxzZTsKIAkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnNjcmliZS5zZXRJbmRlbnRhdGlvbihzd2l0Y2hJbmRlbnRhdGlvbkxldmVsLCBzdGF0ZW1lbnRJbmRlbnRhdGlvbik7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoKTsKIAkJCQkJc3RhdGVtZW50LnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKLQkJCQkJd2FzQVN0YXRlbWVudCA9IHRydWU7CiAJCQkJCXdhc0FDYXNlID0gZmFsc2U7CisJCQkJCXdhc0FCcmVhayA9IGZhbHNlOwogCQkJCX0KIAkJCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbikgewogCQkJCQkvKgogCQkJCQkgKiBQcmludCB0aGUgc2VtaS1jb2xvbgotCQkJCQkgKi8JCisJCQkJCSAqLwogCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCQkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CiAJCQkJCUxvY2FsRGVjbGFyYXRpb24gY3VycmVudExvY2FsID0gKExvY2FsRGVjbGFyYXRpb24pIHN0YXRlbWVudDsKIAkJCQkJaWYgKGkgPCAoc3RhdGVtZW50c0xlbmd0aCAtIDEpKSB7Ci0JCQkJCQkvKiAKKwkJCQkJCS8qCiAJCQkJCQkgKiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIG5leHQgc3RhdGVtZW50IGlzIGEgbG9jYWwgZGVjbGFyYXRpb24KIAkJCQkJCSAqLwogCQkJCQkJaWYgKHN0YXRlbWVudHNbaSArIDFdIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgewpAQCAtNDk2MSw0NiArNTMyNyw0NSBAQAogCQkJCQkJCWlmIChjdXJyZW50TG9jYWwuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAhPSBuZXh0TG9jYWwuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgewogCQkJCQkJCQkvKgogCQkJCQkJCQkgKiBQcmludCB0aGUgc2VtaS1jb2xvbgotCQkJCQkJCQkgKi8JCisJCQkJCQkJCSAqLwogCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkvKgogCQkJCQkJCSAqIFByaW50IHRoZSBzZW1pLWNvbG9uCi0JCQkJCQkJICovCQorCQkJCQkJCSAqLwogCQkJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8qCiAJCQkJCQkgKiBQcmludCB0aGUgc2VtaS1jb2xvbgotCQkJCQkJICovCQorCQkJCQkJICovCiAJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwotCQkJCQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKCF3YXNBQ2FzZSkgewogCQkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKIAkJCQl9Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CiAJCQl9CiAJCX0KLQkJCi0JCWlmICgod2FzQUNhc2UgfHwgd2FzQVN0YXRlbWVudCkgJiYgdGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzKSB7Ci0JCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwotCQl9Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoKSB7Ci0JCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwotCQl9CiAJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOworCQlpZiAod2FzQUJyZWFrKSB7CisJCQl0aGlzLnNjcmliZS5zZXRJbmRlbnRhdGlvbihzd2l0Y2hJbmRlbnRhdGlvbkxldmVsLCAwKTsKKwkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudCgpOworCQl9IGVsc2UgeworCQkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KCk7CisJCQl0aGlzLnNjcmliZS5zZXRJbmRlbnRhdGlvbihzd2l0Y2hJbmRlbnRhdGlvbkxldmVsLCAwKTsKKwkJfQogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UpOwotCQl0aGlzLnNjcmliZS5wcmludFRyYWlsaW5nQ29tbWVudCgpOworCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKIAkJaWYgKHN3aXRjaF9icmFjZS5lcXVhbHMoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuTkVYVF9MSU5FX1NISUZURUQpKSB7CiAJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwotCQl9CQkKKwkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC01MDEwLDIwICs1Mzc1LDIwIEBACiAJcHVibGljIGJvb2xlYW4gdmlzaXQoCiAJCVN5bmNocm9uaXplZFN0YXRlbWVudCBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQsCiAJCUJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3luY2hyb25pemVkKTsKIAogCQlmaW5hbCBpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7CiAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQpOwotCQkKKwogCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQpIHsKIAkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCX0KIAkJc3luY2hyb25pemVkU3RhdGVtZW50LmV4cHJlc3Npb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkKTsKLQkJCisKIAkJZm9ybWF0TGVmdEN1cmx5QnJhY2UobGluZSwgdGhpcy5wcmVmZXJlbmNlcy5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2spOwogCQlzeW5jaHJvbml6ZWRTdGF0ZW1lbnQuYmxvY2sudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQlyZXR1cm4gZmFsc2U7CkBAIC01MDMyLDE0ICs1Mzk3LDE0IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRoaXNSZWZlcmVuY2UsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzUmVmZXJlbmNlIHRoaXNSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJCisKIAkJaWYgKCF0aGlzUmVmZXJlbmNlLmlzSW1wbGljaXRUaGlzKCkpIHsKIAkJCWZpbmFsIGludCBudW1iZXJPZlBhcmVucyA9ICh0aGlzUmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKIAkJCWlmIChudW1iZXJPZlBhcmVucyA+IDApIHsKIAkJCQltYW5hZ2VPcGVuaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGhpc1JlZmVyZW5jZSwgbnVtYmVyT2ZQYXJlbnMpOwogCQkJfQogCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhpcyk7Ci0JCQkKKwogCQkJaWYgKG51bWJlck9mUGFyZW5zID4gMCkgewogCQkJCW1hbmFnZUNsb3NpbmdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbih0aGlzUmVmZXJlbmNlLCBudW1iZXJPZlBhcmVucyk7CiAJCQl9CkBAIC01MDYyLDkgKzU0MjcsOSBAQAogCQlleHByZXNzaW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJLyoKIAkJICogUHJpbnQgdGhlIHNlbWktY29sb24KLQkJICovCQorCQkgKi8KIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKLQkJdGhpcy5zY3JpYmUucHJpbnRUcmFpbGluZ0NvbW1lbnQoKTsKKwkJdGhpcy5zY3JpYmUucHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBTY3JpYmUuQkFTSUNfVFJBSUxJTkdfQ09NTUVOVCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTUwOTEsMjQgKzU0NTYsMzEgQEAKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ5KTsKKwkJZm9ybWF0VHJ5UmVzb3VyY2VzKAorCQkJCXRyeVN0YXRlbWVudCwgCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5LCAKKwkJCQl0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnksCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnksCisJCQkJdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzLAorCQkJCXRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzLAorCQkJCXRoaXMucHJlZmVyZW5jZXMuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5KTsKIAkJdHJ5U3RhdGVtZW50LnRyeUJsb2NrLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJaWYgKHRyeVN0YXRlbWVudC5jYXRjaEFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHJ5U3RhdGVtZW50LmNhdGNoQmxvY2tzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJaWYgKHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50KSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwotCQkJCX0JCisJCQkJfQogCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNhdGNoLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrKTsKIAkJCQlmaW5hbCBpbnQgbGluZSA9IHRoaXMuc2NyaWJlLmxpbmU7CiAJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCk7Ci0JCQkJCisKIAkJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCkgewogCQkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCX0KLQkJCQkKIAkJCQl0cnlTdGF0ZW1lbnQuY2F0Y2hBcmd1bWVudHNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQkJCisKIAkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoKTsKLQkJCQkKKwogCQkJCWZvcm1hdExlZnRDdXJseUJyYWNlKGxpbmUsIHRoaXMucHJlZmVyZW5jZXMuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrKTsKIAkJCQl0cnlTdGF0ZW1lbnQuY2F0Y2hCbG9ja3NbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJfQpAQCAtNTExNiwxMyArNTQ4OCw3NSBAQAogCQlpZiAodHJ5U3RhdGVtZW50LmZpbmFsbHlCbG9jayAhPSBudWxsKSB7CiAJCQlpZiAodGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCkgewogCQkJCXRoaXMuc2NyaWJlLnByaW50TmV3TGluZSgpOwotCQkJfQkKKwkJCX0KIAkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZpbmFsbHksIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2spOwogCQkJdHJ5U3RhdGVtZW50LmZpbmFsbHlCbG9jay50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCXByaXZhdGUgdm9pZCBmb3JtYXRNdWx0aUNhdGNoQXJndW1lbnRzKEFyZ3VtZW50IGFyZ3VtZW50LAorCQkJYm9vbGVhbiBzcGFjZUJlZm9yZVBpcGUsCisJCQlib29sZWFuIHNwYWNlQWZ0ZXJQaXBlLAorCQkJaW50IG11bHRpQ2F0Y2hBbGlnbm1lbnQsCisJCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGUgPSAoVW5pb25UeXBlUmVmZXJlbmNlKSBhcmd1bWVudC50eXBlOworCQlpbnQgbGVuZ3RoID0gdW5pb25UeXBlLnR5cGVSZWZlcmVuY2VzICE9IG51bGwgPyB1bmlvblR5cGUudHlwZVJlZmVyZW5jZXMubGVuZ3RoIDogMDsKKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCUFsaWdubWVudCBhcmd1bWVudHNBbGlnbm1lbnQgPSB0aGlzLnNjcmliZS5jcmVhdGVBbGlnbm1lbnQoCisJCQkJCUFsaWdubWVudC5NVUxUSV9DQVRDSCwKKwkJCQkJbXVsdGlDYXRjaEFsaWdubWVudCwKKwkJCQkJbGVuZ3RoLAorCQkJCQl0aGlzLnNjcmliZS5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisJCQl0aGlzLnNjcmliZS5lbnRlckFsaWdubWVudChhcmd1bWVudHNBbGlnbm1lbnQpOworCQkJYm9vbGVhbiBvayA9IGZhbHNlOworCQkJZG8geworCQkJCXN3aXRjaCAobXVsdGlDYXRjaEFsaWdubWVudCAmIEFsaWdubWVudC5TUExJVF9NQVNLKSB7CisJCQkJCWNhc2UgQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDoKKwkJCQkJY2FzZSBBbGlnbm1lbnQuTV9ORVhUX1BFUl9MSU5FX1NQTElUOgorCQkJCQkJYXJndW1lbnRzQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gdGhpcy5zY3JpYmUuY29sdW1uOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRyeSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChpID4gMCkgeworCQkJCQkJCWlmICh0aGlzLnByZWZlcmVuY2VzLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2gpIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcmd1bWVudHNBbGlnbm1lbnQsIGkpOworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVPUiwgc3BhY2VCZWZvcmVQaXBlKTsKKwkJCQkJCQl0aGlzLnNjcmliZS5wcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIFNjcmliZS5CQVNJQ19UUkFJTElOR19DT01NRU5UKTsKKwkJCQkJCQlpZiAodGhpcy5zY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXMgPT0gMSkgeworCQkJCQkJCQkvLyBhIG5ldyBsaW5lIGhhcyBiZWVuIGluc2VydGVkIHdoaWxlIHByaW50aW5nIHRoZSBjb21tZW50CisJCQkJCQkJCS8vIGhlbmNlIHdlIG5lZWQgdG8gdXNlIHRoZSBicmVhayBpbmRlbnRhdGlvbiBsZXZlbCBiZWZvcmUgcHJpbnRpbmcgbmV4dCB0b2tlbi4uLgorCQkJCQkJCQl0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsID0gYXJndW1lbnRzQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKCF0aGlzLnByZWZlcmVuY2VzLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2gpIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUuYWxpZ25GcmFnbWVudChhcmd1bWVudHNBbGlnbm1lbnQsIGkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChpID09IDApIHsKKwkJCQkJCQl0aGlzLnNjcmliZS5hbGlnbkZyYWdtZW50KGFyZ3VtZW50c0FsaWdubWVudCwgaSk7CisJCQkJCQkJaW50IGZyYWdtZW50SW5kZW50YXRpb24gPSBhcmd1bWVudHNBbGlnbm1lbnQuZnJhZ21lbnRJbmRlbnRhdGlvbnNbMF07CisJCQkJCQkJaWYgKChhcmd1bWVudHNBbGlnbm1lbnQubW9kZSAmIEFsaWdubWVudC5NX0lOREVOVF9PTl9DT0xVTU4pICE9IDAgJiYgZnJhZ21lbnRJbmRlbnRhdGlvbiA+IDApIHsKKwkJCQkJCQkJdGhpcy5zY3JpYmUuaW5kZW50YXRpb25MZXZlbCA9IGZyYWdtZW50SW5kZW50YXRpb247CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChzcGFjZUFmdGVyUGlwZSkgeworCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CisJCQkJCQl9CisJCQkJCQl1bmlvblR5cGUudHlwZVJlZmVyZW5jZXNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQkJCQkJYXJndW1lbnRzQWxpZ25tZW50LnN0YXJ0aW5nQ29sdW1uID0gLTE7CisJCQkJCX0KKwkJCQkJb2sgPSB0cnVlOworCQkJCX0gY2F0Y2ggKEFsaWdubWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCXRoaXMuc2NyaWJlLnJlZG9BbGlnbm1lbnQoZSk7CisJCQkJfQorCQkJfSB3aGlsZSAoIW9rKTsKKwkJCQorCQkJdGhpcy5zY3JpYmUuZXhpdEFsaWdubWVudChhcmd1bWVudHNBbGlnbm1lbnQsIHRydWUpOworCQl9CisJCQorCX0KKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KQEAgLTUxMzgsMTAgKzU1NzIsMTAgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGUpCiAJICovCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQlmb3JtYXQobWVtYmVyVHlwZURlY2xhcmF0aW9uKTsJCisJCWZvcm1hdChtZW1iZXJUeXBlRGVjbGFyYXRpb24pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZSkKIAkgKi8KQEAgLTUyNDgsMTkgKzU2ODIsMzUgQEAKIAkJCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTOgogCQkJCQkJaWYgKHByZWZpeEV4cHJlc3Npb24ub3BlcmF0b3IgPT0gT3BlcmF0b3JJZHMuUExVUykgewogCQkJCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7Ci0JCQkJCQl9CQkJCQkJCisJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VUzoKIAkJCQkJCWlmIChwcmVmaXhFeHByZXNzaW9uLm9wZXJhdG9yID09IE9wZXJhdG9ySWRzLk1JTlVTKSB7CiAJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKLQkJCQkJCX0JCQkJCQkKKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCWV4cHJlc3Npb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwotCQl9IGVsc2UgewotCQkJZXhwcmVzc2lvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFVuYXJ5RXhwcmVzc2lvbikgeworCQkJVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbjIgPSAoVW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uOworCQkJZmluYWwgaW50IG51bWJlck9mUGFyZW5zRm9yRXhwcmVzc2lvbiA9ICh1bmFyeUV4cHJlc3Npb24yLmJpdHMgJiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSA+PiBBU1ROb2RlLlBhcmVudGhlc2l6ZWRTSElGVDsKKwkJCWlmIChudW1iZXJPZlBhcmVuc0ZvckV4cHJlc3Npb24gPT0gMCkgeworCQkJCWludCBvcGVyYXRvclZhbHVlMiA9ICh1bmFyeUV4cHJlc3Npb24yLmJpdHMgJiBBU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gQVNUTm9kZS5PcGVyYXRvclNISUZUOworCQkJCXN3aXRjaChvcGVyYXRvclZhbHVlKSB7CisJCQkJCWNhc2UgT3BlcmF0b3JJZHMuUExVUzoKKwkJCQkJCWlmIChvcGVyYXRvclZhbHVlMiA9PSBPcGVyYXRvcklkcy5QTFVTKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdG9ySWRzLk1JTlVTOgorCQkJCQkJaWYgKG9wZXJhdG9yVmFsdWUyID09IE9wZXJhdG9ySWRzLk1JTlVTKSB7CisJCQkJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAkJfQorCQlleHByZXNzaW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAogCQlpZiAobnVtYmVyT2ZQYXJlbnMgPiAwKSB7CiAJCQltYW5hZ2VDbG9zaW5nUGFyZW50aGVzaXplZEV4cHJlc3Npb24odW5hcnlFeHByZXNzaW9uLCBudW1iZXJPZlBhcmVucyk7CkBAIC01MjY5LDYgKzU3MTksNDIgQEAKIAl9CiAKIAkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVW5pb25UeXBlUmVmZXJlbmNlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlUeXBlUmVmZXJlbmNlW10gdHlwZVJlZmVyZW5jZXMgPSB1bmlvblR5cGVSZWZlcmVuY2UudHlwZVJlZmVyZW5jZXM7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGkgIT0gMCkgeworCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU9SLCB0cnVlKTsKKwkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJfQorCQkJdHlwZVJlZmVyZW5jZXNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVW5pb25UeXBlUmVmZXJlbmNlLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCVVuaW9uVHlwZVJlZmVyZW5jZSB1bmlvblR5cGVSZWZlcmVuY2UsCisJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKworCQlUeXBlUmVmZXJlbmNlW10gdHlwZVJlZmVyZW5jZXMgPSB1bmlvblR5cGVSZWZlcmVuY2UudHlwZVJlZmVyZW5jZXM7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGkgIT0gMCkgeworCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU9SLCB0cnVlKTsKKwkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOworCQkJfQorCQkJdHlwZVJlZmVyZW5jZXNbaV0udHJhdmVyc2UodGhpcywgc2NvcGUpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2hpbGVTdGF0ZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZSkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgewpAQCAtNTI3NiwxOCArNTc2MiwxOCBAQAogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV3aGlsZSk7CiAJCWZpbmFsIGludCBsaW5lID0gdGhpcy5zY3JpYmUubGluZTsKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOLCB0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZSk7Ci0JCQorCiAJCWlmICh0aGlzLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlKSB7CiAJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQl9CiAJCXdoaWxlU3RhdGVtZW50LmNvbmRpdGlvbi50cmF2ZXJzZSh0aGlzLCBzY29wZSk7Ci0JCQorCiAJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGUpOwotCQkKKwogCQlmaW5hbCBTdGF0ZW1lbnQgYWN0aW9uID0gd2hpbGVTdGF0ZW1lbnQuYWN0aW9uOwogCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKIAkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBCbG9jaykgewotICAgICAgICAgICAgICAgIGZvcm1hdExlZnRDdXJseUJyYWNlKGxpbmUsIHRoaXMucHJlZmVyZW5jZXMuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrKTsKKwkJCQlmb3JtYXRMZWZ0Q3VybHlCcmFjZShsaW5lLCB0aGlzLnByZWZlcmVuY2VzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayk7CiAJCQkJYWN0aW9uLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCX0gZWxzZSBpZiAoYWN0aW9uIGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHsKIAkJCQkvKgpAQCAtNTMwMCw3ICs1Nzg2LDcgQEAKIAkJCQlhY3Rpb24udHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAJCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbik7Ci0JCQkJCXRoaXMuc2NyaWJlLnByaW50VHJhaWxpbmdDb21tZW50KCk7CisJCQkJCXRoaXMuc2NyaWJlLnByaW50Q29tbWVudChDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgU2NyaWJlLkJBU0lDX1RSQUlMSU5HX0NPTU1FTlQpOwogCQkJCX0KIAkJCQl0aGlzLnNjcmliZS51bkluZGVudCgpOwogCQkJfQpAQCAtNTMxNiwxMiArNTgwMiwxMiBAQAogCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVRVUVTVElPTiwgdGhpcy5wcmVmZXJlbmNlcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGNhcmQpOwogCQlzd2l0Y2god2lsZGNhcmQua2luZCkgewogCQkJY2FzZSBXaWxkY2FyZC5TVVBFUiA6Ci0JCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXIsIHRydWUpOwkJCQkKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdXBlciwgdHJ1ZSk7CiAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQl3aWxkY2FyZC5ib3VuZC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFdpbGRjYXJkLkVYVEVORFMgOgotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWV4dGVuZHMsIHRydWUpOwkJCQkKKwkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVleHRlbmRzLCB0cnVlKTsKIAkJCQl0aGlzLnNjcmliZS5zcGFjZSgpOwogCQkJCXdpbGRjYXJkLmJvdW5kLnRyYXZlcnNlKHRoaXMsIHNjb3BlKTsKIAkJCQlicmVhazsKQEAgLTUzMzYsMTIgKzU4MjIsMTIgQEAKIAkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUVVFU1RJT04sIHRoaXMucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxjYXJkKTsKIAkJc3dpdGNoKHdpbGRjYXJkLmtpbmQpIHsKIAkJCWNhc2UgV2lsZGNhcmQuU1VQRVIgOgotCQkJCXRoaXMuc2NyaWJlLnByaW50TmV4dFRva2VuKFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN1cGVyLCB0cnVlKTsJCQkJCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXIsIHRydWUpOwogCQkJCXRoaXMuc2NyaWJlLnNwYWNlKCk7CiAJCQkJd2lsZGNhcmQuYm91bmQudHJhdmVyc2UodGhpcywgc2NvcGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBXaWxkY2FyZC5FWFRFTkRTIDoKLQkJCQl0aGlzLnNjcmliZS5wcmludE5leHRUb2tlbihUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVleHRlbmRzLCB0cnVlKTsJCQkJCisJCQkJdGhpcy5zY3JpYmUucHJpbnROZXh0VG9rZW4oVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZXh0ZW5kcywgdHJ1ZSk7CiAJCQkJdGhpcy5zY3JpYmUuc3BhY2UoKTsKIAkJCQl3aWxkY2FyZC5ib3VuZC50cmF2ZXJzZSh0aGlzLCBzY29wZSk7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q29kZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXIuamF2YQppbmRleCBjMGY4NjE1Li5mOTg3ZDBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q29kZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDb2RlRm9ybWF0dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNTYgKzI1LDQ1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNvZGVTbmlwcGV0UGFyc2luZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50LkNvbW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50LkphdmFEb2NSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50Lk11bHRpQ29tbWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwogCiBwdWJsaWMgY2xhc3MgRGVmYXVsdENvZGVGb3JtYXR0ZXIgZXh0ZW5kcyBDb2RlRm9ybWF0dGVyIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIFNjYW5uZXIgUHJvYmluZ1NjYW5uZXI7Ci0KIAkvKioKLQkgKiBDcmVhdGVzIGEgY29tbWVudCByZWdpb24gZm9yIGEgc3BlY2lmaWMgZG9jdW1lbnQgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGNvbW1lbnQgc25pcHBldCBraW5kCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB3aGljaCBjb250YWlucyB0aGUgY29tbWVudCByZWdpb24KLQkgKiBAcGFyYW0gcmFuZ2UgcmFuZ2Ugb2YgdGhlIGNvbW1lbnQgcmVnaW9uIGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gYSBuZXcgY29tbWVudCByZWdpb24gZm9yIHRoZSBjb21tZW50IHJlZ2lvbiByYW5nZSBpbiB0aGUKLQkgKiAgICAgICAgIGRvY3VtZW50Ci0JICogQHNpbmNlIDMuMQorCSAqIERlYnVnIHRyYWNlCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21tZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihpbnQga2luZCwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiByYW5nZSwgQ29kZUZvcm1hdHRlclZpc2l0b3IgZm9ybWF0dGVyKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBDb2RlRm9ybWF0dGVyLktfU0lOR0xFX0xJTkVfQ09NTUVOVDoKLQkJCQlyZXR1cm4gbmV3IENvbW1lbnRSZWdpb24oZG9jdW1lbnQsIHJhbmdlLCBmb3JtYXR0ZXIpOwotCQkJY2FzZSBDb2RlRm9ybWF0dGVyLktfTVVMVElfTElORV9DT01NRU5UOgotCQkJCXJldHVybiBuZXcgTXVsdGlDb21tZW50UmVnaW9uKGRvY3VtZW50LCByYW5nZSwgZm9ybWF0dGVyKTsKLQkJCWNhc2UgQ29kZUZvcm1hdHRlci5LX0pBVkFfRE9DOgotCQkJCXJldHVybiBuZXcgSmF2YURvY1JlZ2lvbihkb2N1bWVudCwgcmFuZ2UsIGZvcm1hdHRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisJLy8gTWFzayBmb3IgY29kZSBmb3JtYXR0ZXIga2luZHMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS19NQVNLID0gS19VTktOT1dOCisJCXwgIEtfRVhQUkVTU0lPTgorCQl8IEtfU1RBVEVNRU5UUworCQl8IEtfQ0xBU1NfQk9EWV9ERUNMQVJBVElPTlMKKwkJfCBLX0NPTVBJTEFUSU9OX1VOSVQKKwkJfCBLX1NJTkdMRV9MSU5FX0NPTU1FTlQKKwkJfCBLX01VTFRJX0xJTkVfQ09NTUVOVAorCQl8IEtfSkFWQV9ET0M7CisKKwkvLyBTY2FubmVyIHVzZSB0byBwcm9iZSB0aGUga2luZCBvZiB0aGUgc291cmNlIGdpdmVuIHRvIHRoZSBmb3JtYXR0ZXIKKwlwcml2YXRlIHN0YXRpYyBTY2FubmVyIFBST0JJTkdfU0NBTk5FUjsKIAogCXByaXZhdGUgQ29kZVNuaXBwZXRQYXJzaW5nVXRpbCBjb2RlU25pcHBldFBhcnNpbmdVdGlsOwogCXByaXZhdGUgTWFwIGRlZmF1bHRDb21waWxlck9wdGlvbnM7Ci0JCisKIAlwcml2YXRlIENvZGVGb3JtYXR0ZXJWaXNpdG9yIG5ld0NvZGVGb3JtYXR0ZXI7CiAJcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQkKKwogCXByaXZhdGUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zIHByZWZlcmVuY2VzOwotCQorCiAJcHVibGljIERlZmF1bHRDb2RlRm9ybWF0dGVyKCkgewogCQl0aGlzKG5ldyBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuZ2V0SmF2YUNvbnZlbnRpb25zU2V0dGluZ3MoKSksIG51bGwpOwogCX0KLQkKKwogCXB1YmxpYyBEZWZhdWx0Q29kZUZvcm1hdHRlcihEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMgcHJlZmVyZW5jZXMpIHsKIAkJdGhpcyhwcmVmZXJlbmNlcywgbnVsbCk7CiAJfQpAQCAtOTYsMTIgKzg1LDEyIEBACiAJcHVibGljIERlZmF1bHRDb2RlRm9ybWF0dGVyKE1hcCBvcHRpb25zKSB7CiAJCXRoaXMobnVsbCwgb3B0aW9ucyk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyBjcmVhdGVJbmRlbnRhdGlvblN0cmluZyhmaW5hbCBpbnQgaW5kZW50YXRpb25MZXZlbCkgewogCQlpZiAoaW5kZW50YXRpb25MZXZlbCA8IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQotCQkKKwogCQlpbnQgdGFicyA9IDA7CiAJCWludCBzcGFjZXMgPSAwOwogCQlzd2l0Y2godGhpcy5wcmVmZXJlbmNlcy50YWJfY2hhcikgewpAQCAtMTEzLDkgKzEwMiwxMSBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMuTUlYRUQgOgogCQkJCWludCB0YWJTaXplID0gdGhpcy5wcmVmZXJlbmNlcy50YWJfc2l6ZTsKLQkJCQlpbnQgc3BhY2VFcXVpdmFsZW50cyA9IGluZGVudGF0aW9uTGV2ZWwgKiB0aGlzLnByZWZlcmVuY2VzLmluZGVudGF0aW9uX3NpemU7Ci0JCQkJdGFicyA9IHNwYWNlRXF1aXZhbGVudHMgLyB0YWJTaXplOwotCQkJCXNwYWNlcyA9IHNwYWNlRXF1aXZhbGVudHMgJSB0YWJTaXplOworCQkJCWlmICh0YWJTaXplICE9IDApIHsKKwkJCQkJaW50IHNwYWNlRXF1aXZhbGVudHMgPSBpbmRlbnRhdGlvbkxldmVsICogdGhpcy5wcmVmZXJlbmNlcy5pbmRlbnRhdGlvbl9zaXplOworCQkJCQl0YWJzID0gc3BhY2VFcXVpdmFsZW50cyAvIHRhYlNpemU7CisJCQkJCXNwYWNlcyA9IHNwYWNlRXF1aXZhbGVudHMgJSB0YWJTaXplOworCQkJCX0KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwpAQCAtMTMyLDc1ICsxMjMsODUgQEAKIAkJfQogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlciNmb3JtYXQoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLwotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoCi0JCQlpbnQga2luZCwKLQkJCVN0cmluZyBzb3VyY2UsCi0JCQlpbnQgb2Zmc2V0LAotCQkJaW50IGxlbmd0aCwKLQkJCWludCBpbmRlbnRhdGlvbkxldmVsLAotCQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IpIHsKLQorCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoaW50IGtpbmQsIFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvcikgewogCQlpZiAob2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwIHx8IGxlbmd0aCA+IHNvdXJjZS5sZW5ndGgoKSkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CisKKwkJc3dpdGNoKGtpbmQgJiBLX01BU0spIHsKKwkJCWNhc2UgS19KQVZBX0RPQyA6CisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc4MAorCQkJCS8vIHVzZSB0aGUgaW50ZWdyYXRlZCBjb21tZW50IGZvcm1hdHRlciB0byBmb3JtYXQgY29tbWVudAorICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRDb21tZW50KGtpbmQgJiBLX01BU0ssIHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgbmV3IElSZWdpb25bXSB7bmV3IFJlZ2lvbihvZmZzZXQsIGxlbmd0aCl9KTsKKwkJCQkvLyAkRkFMTC1USFJPVUdIJCAtIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2Ugd2hlbiBvbGQgY29tbWVudCBmb3JtYXR0ZXIgaXMgYWN0aXZhdGVkCisJCQljYXNlIEtfTVVMVElfTElORV9DT01NRU5UIDoKKwkJCWNhc2UgS19TSU5HTEVfTElORV9DT01NRU5UIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0Q29tbWVudChraW5kICYgS19NQVNLLCBzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIG5ldyBJUmVnaW9uW10ge25ldyBSZWdpb24ob2Zmc2V0LCBsZW5ndGgpfSk7CisJCX0KKworCQlyZXR1cm4gZm9ybWF0KGtpbmQsIHNvdXJjZSwgbmV3IElSZWdpb25bXSB7bmV3IFJlZ2lvbihvZmZzZXQsIGxlbmd0aCl9LCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIFRleHRFZGl0IGZvcm1hdChpbnQga2luZCwgU3RyaW5nIHNvdXJjZSwgSVJlZ2lvbltdIHJlZ2lvbnMsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvcikgeworCQlpZiAoIXJlZ2lvbnNTYXRpc2ZpZXNQcmVjb25kaXRpb25zKHJlZ2lvbnMsIHNvdXJjZS5sZW5ndGgoKSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCiAJCXRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbCA9IG5ldyBDb2RlU25pcHBldFBhcnNpbmdVdGlsKCk7Ci0JCXN3aXRjaChraW5kKSB7CisJCWJvb2xlYW4gaW5jbHVkZUNvbW1lbnRzID0gIChraW5kICYgRl9JTkNMVURFX0NPTU1FTlRTKSAhPSAwOworCQlzd2l0Y2goa2luZCAmIEtfTUFTSykgewogCQkJY2FzZSBLX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TIDoKLQkJCQlyZXR1cm4gZm9ybWF0Q2xhc3NCb2R5RGVjbGFyYXRpb25zKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgb2Zmc2V0LCBsZW5ndGgpOworCQkJCXJldHVybiBmb3JtYXRDbGFzc0JvZHlEZWNsYXJhdGlvbnMoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOwogCQkJY2FzZSBLX0NPTVBJTEFUSU9OX1VOSVQgOgotCQkJCXJldHVybiBmb3JtYXRDb21waWxhdGlvblVuaXQoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBvZmZzZXQsIGxlbmd0aCk7CisJCQkJcmV0dXJuIGZvcm1hdENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIHJlZ2lvbnMsIGluY2x1ZGVDb21tZW50cyk7CiAJCQljYXNlIEtfRVhQUkVTU0lPTiA6Ci0JCQkJcmV0dXJuIGZvcm1hdEV4cHJlc3Npb24oc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBvZmZzZXQsIGxlbmd0aCk7CisJCQkJcmV0dXJuIGZvcm1hdEV4cHJlc3Npb24oc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOwogCQkJY2FzZSBLX1NUQVRFTUVOVFMgOgotCQkJCXJldHVybiBmb3JtYXRTdGF0ZW1lbnRzKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgb2Zmc2V0LCBsZW5ndGgpOworCQkJCXJldHVybiBmb3JtYXRTdGF0ZW1lbnRzKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgcmVnaW9ucywgaW5jbHVkZUNvbW1lbnRzKTsKIAkJCWNhc2UgS19VTktOT1dOIDoKLQkJCQlyZXR1cm4gcHJvYmVGb3JtYXR0aW5nKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgb2Zmc2V0LCBsZW5ndGgpOworCQkJCXJldHVybiBwcm9iZUZvcm1hdHRpbmcoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOwogCQkJY2FzZSBLX0pBVkFfRE9DIDoKIAkJCWNhc2UgS19NVUxUSV9MSU5FX0NPTU1FTlQgOgogCQkJY2FzZSBLX1NJTkdMRV9MSU5FX0NPTU1FTlQgOgotCQkJCXJldHVybiBmb3JtYXRDb21tZW50KGtpbmQsIHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgb2Zmc2V0LCBsZW5ndGgpOworCQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDA5MQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIFRleHRFZGl0IGZvcm1hdENsYXNzQm9keURlY2xhcmF0aW9ucyhTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwlwcml2YXRlIFRleHRFZGl0IGZvcm1hdENsYXNzQm9keURlY2xhcmF0aW9ucyhTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIElSZWdpb25bXSByZWdpb25zLCBib29sZWFuIGluY2x1ZGVDb21tZW50cykgewogCQlBU1ROb2RlW10gYm9keURlY2xhcmF0aW9ucyA9IHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZUNsYXNzQm9keURlY2xhcmF0aW9ucyhzb3VyY2UudG9DaGFyQXJyYXkoKSwgZ2V0RGVmYXVsdENvbXBpbGVyT3B0aW9ucygpLCB0cnVlKTsKLQkJCisKIAkJaWYgKGJvZHlEZWNsYXJhdGlvbnMgPT0gbnVsbCkgewotCQkJLy8gYSBwcm9ibGVtIG9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgc291cmNlCisJCQkvLyBhIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgc291cmNlCiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRDbGFzc0JvZHlEZWNsYXJhdGlvbnMoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBib2R5RGVjbGFyYXRpb25zLCBvZmZzZXQsIGxlbmd0aCk7CisJCXJldHVybiBpbnRlcm5hbEZvcm1hdENsYXNzQm9keURlY2xhcmF0aW9ucyhzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIGJvZHlEZWNsYXJhdGlvbnMsIHJlZ2lvbnMsIGluY2x1ZGVDb21tZW50cyk7CiAJfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIHRleHQgZWRpdCBhZnRlciBmb3JtYXR0aW5nIHRoZSBnaXZlbiBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBnaXZlbiBraW5kCi0JICogQHBhcmFtIHNvdXJjZSB0aGUgZ2l2ZW4gc291cmNlCi0JICogQHBhcmFtIGluZGVudGF0aW9uTGV2ZWwgdGhlIGdpdmVuIGluZGVudGF0aW9uIGxldmVsCi0JICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgdGhlIGdpdmVuIGxpbmUgc2VwYXJhdG9yCi0JICogQHBhcmFtIG9mZnNldCB0aGUgZ2l2ZW4gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aCB0aGUgZ2l2ZW4gbGVuZ3RoCi0JICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHRleHQgZWRpdAotCSAqIEBkZXByZWNhdGVkCisJLyoKKwkgKiBGb3JtYXQgYSBqYXZhZG9jIGNvbW1lbnQuCisJICogU2luY2UgYnVnIDEwMjc4MCB0aGlzIGlzIGRvbmUgYnkgYSBzcGVjaWZpYyBtZXRob2Qgd2hlbiBuZXcgamF2YWRvYyBmb3JtYXR0ZXIgaXMgYWN0aXZhdGVkLgogCSAqLwotCXByaXZhdGUgVGV4dEVkaXQgZm9ybWF0Q29tbWVudChpbnQga2luZCwgU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCU9iamVjdCBvbGRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVCk7CisJcHJpdmF0ZSBUZXh0RWRpdCBmb3JtYXRDb21tZW50KGludCBraW5kLCBTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIElSZWdpb25bXSByZWdpb25zKSB7CisJCU9iamVjdCBvbGRPcHRpb24gPSBvbGRDb21tZW50Rm9ybWF0T3B0aW9uKCk7CiAJCWJvb2xlYW4gaXNGb3JtYXR0aW5nQ29tbWVudHMgPSBmYWxzZTsKIAkJaWYgKG9sZE9wdGlvbiA9PSBudWxsKSB7Ci0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQljYXNlIENvZGVGb3JtYXR0ZXIuS19TSU5HTEVfTElORV9DT01NRU5UOgorCQkJc3dpdGNoIChraW5kICYgS19NQVNLKSB7CisJCQkJY2FzZSBLX1NJTkdMRV9MSU5FX0NPTU1FTlQ6CiAJCQkJCWlzRm9ybWF0dGluZ0NvbW1lbnRzID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHModGhpcy5vcHRpb25zLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UKSk7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29kZUZvcm1hdHRlci5LX01VTFRJX0xJTkVfQ09NTUVOVDoKKwkJCQljYXNlIEtfTVVMVElfTElORV9DT01NRU5UOgogCQkJCQlpc0Zvcm1hdHRpbmdDb21tZW50cyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKHRoaXMub3B0aW9ucy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0JMT0NLX0NPTU1FTlQpKTsKIAkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2RlRm9ybWF0dGVyLktfSkFWQV9ET0M6CisJCQkJY2FzZSBLX0pBVkFfRE9DOgogCQkJCQlpc0Zvcm1hdHRpbmdDb21tZW50cyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKHRoaXMub3B0aW9ucy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0pBVkFET0NfQ09NTUVOVCkpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMjEzLDE4ICsyMTQsMjEgQEAKIAkJCQl0aGlzLnByZWZlcmVuY2VzLmxpbmVfc2VwYXJhdG9yID0gVXRpbC5MSU5FX1NFUEFSQVRPUjsKIAkJCX0KIAkJCXRoaXMucHJlZmVyZW5jZXMuaW5pdGlhbF9pbmRlbnRhdGlvbl9sZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7Ci0JCQl0aGlzLm5ld0NvZGVGb3JtYXR0ZXIgPSBuZXcgQ29kZUZvcm1hdHRlclZpc2l0b3IodGhpcy5wcmVmZXJlbmNlcywgdGhpcy5vcHRpb25zLCBvZmZzZXQsIGxlbmd0aCwgbnVsbCk7Ci0JCQlmaW5hbCBDb21tZW50UmVnaW9uIHJlZ2lvbiA9IGNyZWF0ZVJlZ2lvbihraW5kLCBuZXcgRG9jdW1lbnQoc291cmNlKSwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSwgdGhpcy5uZXdDb2RlRm9ybWF0dGVyKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLm5ld0NvZGVGb3JtYXR0ZXIuZm9ybWF0KHNvdXJjZSwgcmVnaW9uKTsKLQkJCX0KKwkJCWlmICh0aGlzLmNvZGVTbmlwcGV0UGFyc2luZ1V0aWwgPT0gbnVsbCkgdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsID0gbmV3IENvZGVTbmlwcGV0UGFyc2luZ1V0aWwoKTsKKwkJCXRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZUNvbXBpbGF0aW9uVW5pdChzb3VyY2UudG9DaGFyQXJyYXkoKSwgZ2V0RGVmYXVsdENvbXBpbGVyT3B0aW9ucygpLCB0cnVlKTsKKwkJCXRoaXMubmV3Q29kZUZvcm1hdHRlciA9IG5ldyBDb2RlRm9ybWF0dGVyVmlzaXRvcih0aGlzLnByZWZlcmVuY2VzLCB0aGlzLm9wdGlvbnMsIHJlZ2lvbnMsIHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbCwgdHJ1ZSk7CisJCQlJUmVnaW9uIGNvdmVyZWRSZWdpb24gPSBnZXRDb3ZlcmVkUmVnaW9uKHJlZ2lvbnMpOworCQkJaW50IHN0YXJ0ID0gY292ZXJlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKKwkJCWludCBlbmQgPSBzdGFydCArIGNvdmVyZWRSZWdpb24uZ2V0TGVuZ3RoKCk7CisJCQl0aGlzLm5ld0NvZGVGb3JtYXR0ZXIuZm9ybWF0Q29tbWVudChraW5kLCBzb3VyY2UsIHN0YXJ0LCBlbmQsIGluZGVudGF0aW9uTGV2ZWwpOworCQkJcmV0dXJuIHRoaXMubmV3Q29kZUZvcm1hdHRlci5zY3JpYmUuZ2V0Um9vdEVkaXQoKTsKIAkJfQotCQlyZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKKwkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSBUZXh0RWRpdCBmb3JtYXRDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJcHJpdmF0ZSBUZXh0RWRpdCBmb3JtYXRDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBJUmVnaW9uW10gcmVnaW9ucywgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSB0aGlzLmNvZGVTbmlwcGV0UGFyc2luZ1V0aWwucGFyc2VDb21waWxhdGlvblVuaXQoc291cmNlLnRvQ2hhckFycmF5KCksIGdldERlZmF1bHRDb21waWxlck9wdGlvbnMoKSwgdHJ1ZSk7Ci0JCQorCiAJCWlmIChsaW5lU2VwYXJhdG9yICE9IG51bGwpIHsKIAkJCXRoaXMucHJlZmVyZW5jZXMubGluZV9zZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yOwogCQl9IGVsc2UgewpAQCAtMjMyLDI5ICsyMzYsNDEgQEAKIAkJfQogCQl0aGlzLnByZWZlcmVuY2VzLmluaXRpYWxfaW5kZW50YXRpb25fbGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsOwogCi0JCXRoaXMubmV3Q29kZUZvcm1hdHRlciA9IG5ldyBDb2RlRm9ybWF0dGVyVmlzaXRvcih0aGlzLnByZWZlcmVuY2VzLCB0aGlzLm9wdGlvbnMsIG9mZnNldCwgbGVuZ3RoLCB0aGlzLmNvZGVTbmlwcGV0UGFyc2luZ1V0aWwpOwotCQkKKwkJdGhpcy5uZXdDb2RlRm9ybWF0dGVyID0gbmV3IENvZGVGb3JtYXR0ZXJWaXNpdG9yKHRoaXMucHJlZmVyZW5jZXMsIHRoaXMub3B0aW9ucywgcmVnaW9ucywgdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsLCBpbmNsdWRlQ29tbWVudHMpOworCiAJCXJldHVybiB0aGlzLm5ld0NvZGVGb3JtYXR0ZXIuZm9ybWF0KHNvdXJjZSwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOwogCX0KIAotCXByaXZhdGUgVGV4dEVkaXQgZm9ybWF0RXhwcmVzc2lvbihTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwlwcml2YXRlIFRleHRFZGl0IGZvcm1hdEV4cHJlc3Npb24oU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBJUmVnaW9uW10gcmVnaW9ucywgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsLnBhcnNlRXhwcmVzc2lvbihzb3VyY2UudG9DaGFyQXJyYXkoKSwgZ2V0RGVmYXVsdENvbXBpbGVyT3B0aW9ucygpLCB0cnVlKTsKLQkJCisKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJLy8gYSBwcm9ibGVtIG9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgc291cmNlCisJCQkvLyBhIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgc291cmNlCiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRFeHByZXNzaW9uKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgZXhwcmVzc2lvbiwgb2Zmc2V0LCBsZW5ndGgpOworCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRFeHByZXNzaW9uKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgZXhwcmVzc2lvbiwgcmVnaW9ucywgaW5jbHVkZUNvbW1lbnRzKTsKIAl9CiAKLQlwcml2YXRlIFRleHRFZGl0IGZvcm1hdFN0YXRlbWVudHMoU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJcHJpdmF0ZSBUZXh0RWRpdCBmb3JtYXRTdGF0ZW1lbnRzKFN0cmluZyBzb3VyY2UsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgSVJlZ2lvbltdIHJlZ2lvbnMsIGJvb2xlYW4gaW5jbHVkZUNvbW1lbnRzKSB7CiAJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZVN0YXRlbWVudHMoc291cmNlLnRvQ2hhckFycmF5KCksIGdldERlZmF1bHRDb21waWxlck9wdGlvbnMoKSwgdHJ1ZSwgZmFsc2UpOwotCQkKKwogCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zdGF0ZW1lbnRzID09IG51bGwpIHsKIAkJCS8vIGEgcHJvYmxlbSBvY2N1cmVkIHdoaWxlIHBhcnNpbmcgdGhlIHNvdXJjZQogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIGludGVybmFsRm9ybWF0U3RhdGVtZW50cyhzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIG9mZnNldCwgbGVuZ3RoKTsKKwkJcmV0dXJuIGludGVybmFsRm9ybWF0U3RhdGVtZW50cyhzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIHJlZ2lvbnMsIGluY2x1ZGVDb21tZW50cyk7CisJfQorCisJcHJpdmF0ZSBJUmVnaW9uIGdldENvdmVyZWRSZWdpb24oSVJlZ2lvbltdIHJlZ2lvbnMpIHsKKwkJaW50IGxlbmd0aCA9IHJlZ2lvbnMubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDEpIHsKKwkJCXJldHVybiByZWdpb25zWzBdOworCQl9CisKKwkJaW50IG9mZnNldCA9IHJlZ2lvbnNbMF0uZ2V0T2Zmc2V0KCk7CisJCUlSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnNbbGVuZ3RoIC0gMV07CisKKwkJcmV0dXJuIG5ldyBSZWdpb24ob2Zmc2V0LCBsYXN0UmVnaW9uLmdldE9mZnNldCgpICsgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSAtIG9mZnNldCk7CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXREZWJ1Z091dHB1dCgpIHsKQEAgLTI2NCwyNSArMjgwLDI2IEBACiAJcHJpdmF0ZSBNYXAgZ2V0RGVmYXVsdENvbXBpbGVyT3B0aW9ucygpIHsKIAkJaWYgKHRoaXMuZGVmYXVsdENvbXBpbGVyT3B0aW9ucyA9PSAgbnVsbCkgewogCQkJTWFwIG9wdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgzMCk7Ci0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsIENvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOyAKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgQ29tcGlsZXJPcHRpb25zLkRPX05PVF9HRU5FUkFURSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsIENvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlLCBDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUHJlc2VydmVVbnVzZWRMb2NhbCwgQ29tcGlsZXJPcHRpb25zLlBSRVNFUlZFKTsKLQkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fRG9jQ29tbWVudFN1cHBvcnQsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7IAotCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsgCisJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0RvY0NvbW1lbnRTdXBwb3J0LCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ01ldGhvZFdpdGhvdXRTdXBlckludm9jYXRpb24sIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsgCi0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOyAKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkT2JqZWN0QWxsb2NhdGlvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZEltcG9ydCwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vRWZmZWN0QXNzaWdubWVudCwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7IAorCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW5kaXJlY3RTdGF0aWNBY2Nlc3MsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwpAQCAtMjk4LDYgKzMxNSw3IEBACiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eSwgQ29tcGlsZXJPcHRpb25zLlBVQkxJQyk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEludmFsaWRKYXZhZG9jVGFncywgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbiwgQ29tcGlsZXJPcHRpb25zLlJFVFVSTl9UQUcpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNaXNzaW5nSmF2YWRvY1RhZ3MsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwpAQCAtMzA4LDE4ICszMjYsMjEgQEAKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmcsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseSwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZywgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsgCisJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmcsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVucXVhbGlmaWVkRmllbGRBY2Nlc3MsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwogCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOwotCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8yKTsgCi0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1ByaW9yaXRpZXMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8yKTsKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1RhZ3MsIFV0aWwuRU1QVFlfU1RSSU5HKTsKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1ByaW9yaXRpZXMsIFV0aWwuRU1QVFlfU1RSSU5HKTsKIAkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza0Nhc2VTZW5zaXRpdmUsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7Ci0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsgCi0JCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7IAotCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7IAorCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUsIENvbXBpbGVyT3B0aW9ucy5ESVNBQkxFRCk7CisJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCwgQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5hdm9pZGFibGVHZW5lcmljVHlwZVByb2JsZW1zLCBDb21waWxlck9wdGlvbnMuRU5BQkxFRCk7CiAJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX01heFByb2JsZW1QZXJVbml0LCBTdHJpbmcudmFsdWVPZigxMDApKTsKLQkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fSW5saW5lSnNyLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOyAKKwkJCW9wdGlvbnNNYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fSW5saW5lSnNyLCBDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJb3B0aW9uc01hcC5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RDYW5CZVN0YXRpYywgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQlvcHRpb25zTWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwogCQkJdGhpcy5kZWZhdWx0Q29tcGlsZXJPcHRpb25zID0gb3B0aW9uc01hcDsKIAkJfQogCQlPYmplY3Qgc291cmNlT3B0aW9uID0gdGhpcy5vcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSk7CkBAIC0zMjgsMTAgKzM0OSwxMCBAQAogCQl9IGVsc2UgewogCQkJdGhpcy5kZWZhdWx0Q29tcGlsZXJPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29tcGlsZXJPcHRpb25zOwkJCisJCXJldHVybiB0aGlzLmRlZmF1bHRDb21waWxlck9wdGlvbnM7CiAJfQogCi0JcHJpdmF0ZSBUZXh0RWRpdCBpbnRlcm5hbEZvcm1hdENsYXNzQm9keURlY2xhcmF0aW9ucyhTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIEFTVE5vZGVbXSBib2R5RGVjbGFyYXRpb25zLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJcHJpdmF0ZSBUZXh0RWRpdCBpbnRlcm5hbEZvcm1hdENsYXNzQm9keURlY2xhcmF0aW9ucyhTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIEFTVE5vZGVbXSBib2R5RGVjbGFyYXRpb25zLCBJUmVnaW9uW10gcmVnaW9ucywgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJaWYgKGxpbmVTZXBhcmF0b3IgIT0gbnVsbCkgewogCQkJdGhpcy5wcmVmZXJlbmNlcy5saW5lX3NlcGFyYXRvciA9IGxpbmVTZXBhcmF0b3I7CiAJCX0gZWxzZSB7CkBAIC0zMzksMTEgKzM2MCwxMSBAQAogCQl9CiAJCXRoaXMucHJlZmVyZW5jZXMuaW5pdGlhbF9pbmRlbnRhdGlvbl9sZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7CiAKLQkJdGhpcy5uZXdDb2RlRm9ybWF0dGVyID0gbmV3IENvZGVGb3JtYXR0ZXJWaXNpdG9yKHRoaXMucHJlZmVyZW5jZXMsIHRoaXMub3B0aW9ucywgb2Zmc2V0LCBsZW5ndGgsIHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbCk7CisJCXRoaXMubmV3Q29kZUZvcm1hdHRlciA9IG5ldyBDb2RlRm9ybWF0dGVyVmlzaXRvcih0aGlzLnByZWZlcmVuY2VzLCB0aGlzLm9wdGlvbnMsIHJlZ2lvbnMsIHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbCwgaW5jbHVkZUNvbW1lbnRzKTsKIAkJcmV0dXJuIHRoaXMubmV3Q29kZUZvcm1hdHRlci5mb3JtYXQoc291cmNlLCBib2R5RGVjbGFyYXRpb25zKTsKIAl9Ci0JCi0JcHJpdmF0ZSBUZXh0RWRpdCBpbnRlcm5hbEZvcm1hdEV4cHJlc3Npb24oU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKworCXByaXZhdGUgVGV4dEVkaXQgaW50ZXJuYWxGb3JtYXRFeHByZXNzaW9uKFN0cmluZyBzb3VyY2UsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUmVnaW9uW10gcmVnaW9ucywgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJaWYgKGxpbmVTZXBhcmF0b3IgIT0gbnVsbCkgewogCQkJdGhpcy5wcmVmZXJlbmNlcy5saW5lX3NlcGFyYXRvciA9IGxpbmVTZXBhcmF0b3I7CiAJCX0gZWxzZSB7CkBAIC0zNTEsMTMgKzM3MiwxMyBAQAogCQl9CiAJCXRoaXMucHJlZmVyZW5jZXMuaW5pdGlhbF9pbmRlbnRhdGlvbl9sZXZlbCA9IGluZGVudGF0aW9uTGV2ZWw7CiAKLQkJdGhpcy5uZXdDb2RlRm9ybWF0dGVyID0gbmV3IENvZGVGb3JtYXR0ZXJWaXNpdG9yKHRoaXMucHJlZmVyZW5jZXMsIHRoaXMub3B0aW9ucywgb2Zmc2V0LCBsZW5ndGgsIHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbCk7Ci0JCQorCQl0aGlzLm5ld0NvZGVGb3JtYXR0ZXIgPSBuZXcgQ29kZUZvcm1hdHRlclZpc2l0b3IodGhpcy5wcmVmZXJlbmNlcywgdGhpcy5vcHRpb25zLCByZWdpb25zLCB0aGlzLmNvZGVTbmlwcGV0UGFyc2luZ1V0aWwsIGluY2x1ZGVDb21tZW50cyk7CisKIAkJVGV4dEVkaXQgdGV4dEVkaXQgPSB0aGlzLm5ld0NvZGVGb3JtYXR0ZXIuZm9ybWF0KHNvdXJjZSwgZXhwcmVzc2lvbik7CiAJCXJldHVybiB0ZXh0RWRpdDsKIAl9CiAKLQlwcml2YXRlIFRleHRFZGl0IGludGVybmFsRm9ybWF0U3RhdGVtZW50cyhTdHJpbmcgc291cmNlLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCXByaXZhdGUgVGV4dEVkaXQgaW50ZXJuYWxGb3JtYXRTdGF0ZW1lbnRzKFN0cmluZyBzb3VyY2UsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBJUmVnaW9uW10gcmVnaW9ucywgYm9vbGVhbiBpbmNsdWRlQ29tbWVudHMpIHsKIAkJaWYgKGxpbmVTZXBhcmF0b3IgIT0gbnVsbCkgewogCQkJdGhpcy5wcmVmZXJlbmNlcy5saW5lX3NlcGFyYXRvciA9IGxpbmVTZXBhcmF0b3I7CiAJCX0gZWxzZSB7CkBAIC0zNjUsNTkgKzM4NiwxMTIgQEAKIAkJfQogCQl0aGlzLnByZWZlcmVuY2VzLmluaXRpYWxfaW5kZW50YXRpb25fbGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsOwogCi0JCXRoaXMubmV3Q29kZUZvcm1hdHRlciA9IG5ldyBDb2RlRm9ybWF0dGVyVmlzaXRvcih0aGlzLnByZWZlcmVuY2VzLCB0aGlzLm9wdGlvbnMsIG9mZnNldCwgbGVuZ3RoLCB0aGlzLmNvZGVTbmlwcGV0UGFyc2luZ1V0aWwpOwotCQkKKwkJdGhpcy5uZXdDb2RlRm9ybWF0dGVyID0gbmV3IENvZGVGb3JtYXR0ZXJWaXNpdG9yKHRoaXMucHJlZmVyZW5jZXMsIHRoaXMub3B0aW9ucywgcmVnaW9ucywgdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsLCBpbmNsdWRlQ29tbWVudHMpOworCiAJCXJldHVybiB0aGlzLm5ld0NvZGVGb3JtYXR0ZXIuZm9ybWF0KHNvdXJjZSwgY29uc3RydWN0b3JEZWNsYXJhdGlvbik7CiAJfQogCi0JcHJpdmF0ZSBUZXh0RWRpdCBwcm9iZUZvcm1hdHRpbmcoU3RyaW5nIHNvdXJjZSwgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChQcm9iaW5nU2Nhbm5lciA9PSBudWxsKSB7Ci0JCQkvLyBzY2FubmVyIHVzZSB0byBjaGVjayBpZiB0aGUga2luZCBjb3VsZCBiZSBLX0pBVkFfRE9DLCBLX01VTFRJX0xJTkVfQ09NTUVOVCBvciBLX1NJTkdMRV9MSU5FX0NPTU1FTlQgCi0JCQlQcm9iaW5nU2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsIHRydWUsIGZhbHNlLypubHMqLywgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMywgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMywgbnVsbC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CisJLyoqCisJICogRGVwcmVjYXRlZCBhcyB1c2luZyBvbGQgb3B0aW9uIGNvbnN0YW50CisJICogQGRlcHJlY2F0ZWQKKwkgKi8KKwlwcml2YXRlIE9iamVjdCBvbGRDb21tZW50Rm9ybWF0T3B0aW9uKCkgeworCSAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9GT1JNQVQpOworICAgIH0KKworCXByaXZhdGUgVGV4dEVkaXQgcHJvYmVGb3JtYXR0aW5nKFN0cmluZyBzb3VyY2UsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgSVJlZ2lvbltdIHJlZ2lvbnMsIGJvb2xlYW4gaW5jbHVkZUNvbW1lbnRzKSB7CisJCWlmIChQUk9CSU5HX1NDQU5ORVIgPT0gbnVsbCkgeworCQkJLy8gc2Nhbm5lciB1c2UgdG8gY2hlY2sgaWYgdGhlIGtpbmQgY291bGQgYmUgS19KQVZBX0RPQywgS19NVUxUSV9MSU5FX0NPTU1FTlQgb3IgS19TSU5HTEVfTElORV9DT01NRU5UCisJCQkvLyBkbyBub3QgdG9rZW5pemUgd2hpdGUgc3BhY2VzIHRvIGdldCBzaW5nbGUgY29tbWVudHMgZXZlbiB3aXRoIHNwYWNlcyBiZWZvcmUuLi4KKwkJCVBST0JJTkdfU0NBTk5FUiA9IG5ldyBTY2FubmVyKHRydWUsIGZhbHNlLypkbyBub3QgdG9rZW5pemUgd2hpdGVzcGFjZXMqLywgZmFsc2UvKm5scyovLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82LCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV82LCBudWxsLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKIAkJfQotCQlQcm9iaW5nU2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlLnRvQ2hhckFycmF5KCkpOwotCQlQcm9iaW5nU2Nhbm5lci5yZXNldFRvKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKwkJUFJPQklOR19TQ0FOTkVSLnNldFNvdXJjZShzb3VyY2UudG9DaGFyQXJyYXkoKSk7CisKKwkJSVJlZ2lvbiBjb3ZlcmVkUmVnaW9uID0gZ2V0Q292ZXJlZFJlZ2lvbihyZWdpb25zKTsKKwkJaW50IG9mZnNldCA9IGNvdmVyZWRSZWdpb24uZ2V0T2Zmc2V0KCk7CisJCWludCBsZW5ndGggPSBjb3ZlcmVkUmVnaW9uLmdldExlbmd0aCgpOworCisJCVBST0JJTkdfU0NBTk5FUi5yZXNldFRvKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoIC0gMSk7CiAJCXRyeSB7Ci0JCQlzd2l0Y2goUHJvYmluZ1NjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKKwkJCWludCBraW5kID0gLTE7CisJCQlzd2l0Y2goUFJPQklOR19TQ0FOTkVSLmdldE5leHRUb2tlbigpKSB7CiAJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgotCQkJCQlpZiAoUHJvYmluZ1NjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSA9PSBvZmZzZXQgKyBsZW5ndGggLSAxKSB7Ci0JCQkJCQlyZXR1cm4gZm9ybWF0Q29tbWVudChLX01VTFRJX0xJTkVfQ09NTUVOVCwgc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBvZmZzZXQsIGxlbmd0aCk7CisJCQkJCWlmIChQUk9CSU5HX1NDQU5ORVIuZ2V0TmV4dFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJCQlraW5kID0gS19NVUxUSV9MSU5FX0NPTU1FTlQ7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1FTlRfTElORSA6Ci0JCQkJCWlmIChQcm9iaW5nU2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpID09IG9mZnNldCArIGxlbmd0aCAtIDEpIHsKLQkJCQkJCXJldHVybiBmb3JtYXRDb21tZW50KEtfU0lOR0xFX0xJTkVfQ09NTUVOVCwgc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBvZmZzZXQsIGxlbmd0aCk7CisJCQkJCWlmIChQUk9CSU5HX1NDQU5ORVIuZ2V0TmV4dFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJCQlraW5kID0gS19TSU5HTEVfTElORV9DT01NRU5UOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOgotCQkJCQlpZiAoUHJvYmluZ1NjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSA9PSBvZmZzZXQgKyBsZW5ndGggLSAxKSB7Ci0JCQkJCQlyZXR1cm4gZm9ybWF0Q29tbWVudChLX0pBVkFfRE9DLCBzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIG9mZnNldCwgbGVuZ3RoKTsKKwkJCQkJaWYgKFBST0JJTkdfU0NBTk5FUi5nZXROZXh0VG9rZW4oKSA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKKwkJCQkJCWtpbmQgPSBLX0pBVkFfRE9DOwogCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGtpbmQgIT0gLTEpIHsKKwkJCQlyZXR1cm4gZm9ybWF0Q29tbWVudChraW5kLCBzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIHJlZ2lvbnMpOwogCQkJfQogCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCX0KLQkJUHJvYmluZ1NjYW5uZXIuc2V0U291cmNlKChjaGFyW10pIG51bGwpOworCQlQUk9CSU5HX1NDQU5ORVIuc2V0U291cmNlKChjaGFyW10pIG51bGwpOwogCiAJCS8vIHByb2JlIGZvciBleHByZXNzaW9uCiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHRoaXMuY29kZVNuaXBwZXRQYXJzaW5nVXRpbC5wYXJzZUV4cHJlc3Npb24oc291cmNlLnRvQ2hhckFycmF5KCksIGdldERlZmF1bHRDb21waWxlck9wdGlvbnMoKSwgdHJ1ZSk7CiAJCWlmIChleHByZXNzaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBpbnRlcm5hbEZvcm1hdEV4cHJlc3Npb24oc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBleHByZXNzaW9uLCBvZmZzZXQsIGxlbmd0aCk7CisJCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRFeHByZXNzaW9uKHNvdXJjZSwgaW5kZW50YXRpb25MZXZlbCwgbGluZVNlcGFyYXRvciwgZXhwcmVzc2lvbiwgcmVnaW9ucywgaW5jbHVkZUNvbW1lbnRzKTsKIAkJfQogCiAJCS8vIHByb2JlIGZvciBib2R5IGRlY2xhcmF0aW9ucyAoZmllbGRzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMpCiAJCUFTVE5vZGVbXSBib2R5RGVjbGFyYXRpb25zID0gdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsLnBhcnNlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKHNvdXJjZS50b0NoYXJBcnJheSgpLCBnZXREZWZhdWx0Q29tcGlsZXJPcHRpb25zKCksIHRydWUpOwogCQlpZiAoYm9keURlY2xhcmF0aW9ucyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRDbGFzc0JvZHlEZWNsYXJhdGlvbnMoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBib2R5RGVjbGFyYXRpb25zLCBvZmZzZXQsIGxlbmd0aCk7CisJCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXRDbGFzc0JvZHlEZWNsYXJhdGlvbnMoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBib2R5RGVjbGFyYXRpb25zLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOwogCQl9CiAKIAkJLy8gcHJvYmUgZm9yIHN0YXRlbWVudHMKIAkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gdGhpcy5jb2RlU25pcHBldFBhcnNpbmdVdGlsLnBhcnNlU3RhdGVtZW50cyhzb3VyY2UudG9DaGFyQXJyYXkoKSwgZ2V0RGVmYXVsdENvbXBpbGVyT3B0aW9ucygpLCB0cnVlLCBmYWxzZSk7CiAJCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGludGVybmFsRm9ybWF0U3RhdGVtZW50cyhzb3VyY2UsIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIG9mZnNldCwgbGVuZ3RoKTsKKwkJCXJldHVybiBpbnRlcm5hbEZvcm1hdFN0YXRlbWVudHMoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOwogCQl9CiAKIAkJLy8gdGhpcyBoYXMgdG8gYmUgYSBjb21waWxhdGlvbiB1bml0Ci0JCXJldHVybiBmb3JtYXRDb21waWxhdGlvblVuaXQoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCBvZmZzZXQsIGxlbmd0aCk7CisJCXJldHVybiBmb3JtYXRDb21waWxhdGlvblVuaXQoc291cmNlLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yLCByZWdpb25zLCBpbmNsdWRlQ29tbWVudHMpOworCX0KKworCS8qKgorCSAqIFRydWUgaWYKKwkgKiAxLiBBbGwgcmVnaW9ucyBhcmUgd2l0aGluIG1heExlbmd0aAorCSAqIDIuIHJlZ2lvbnMgYXJlIHNvcnRlZAorCSAqIDMuIHJlZ2lvbnMgYXJlIG5vdCBvdmVybGFwcGluZworCSAqLworCXByaXZhdGUgYm9vbGVhbiByZWdpb25zU2F0aXNmaWVzUHJlY29uZGl0aW9ucyhJUmVnaW9uW10gcmVnaW9ucywgaW50IG1heExlbmd0aCkgeworCQlpbnQgcmVnaW9uc0xlbmd0aCA9IHJlZ2lvbnMgPT0gbnVsbCA/IDAgOiByZWdpb25zLmxlbmd0aDsKKwkJaWYgKHJlZ2lvbnNMZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJSVJlZ2lvbiBmaXJzdCA9IHJlZ2lvbnNbMF07CisJCWlmIChmaXJzdC5nZXRPZmZzZXQoKSA8IDAgfHwgZmlyc3QuZ2V0TGVuZ3RoKCkgPCAwIHx8IGZpcnN0LmdldE9mZnNldCgpICsgZmlyc3QuZ2V0TGVuZ3RoKCkgPiBtYXhMZW5ndGgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWludCBsYXN0T2Zmc2V0ID0gZmlyc3QuZ2V0T2Zmc2V0KCkgKyBmaXJzdC5nZXRMZW5ndGgoKSAtIDE7CisJCWZvciAoaW50IGk9IDE7IGkgPCByZWdpb25zTGVuZ3RoOyBpKyspIHsKKwkJCUlSZWdpb24gY3VycmVudCA9IHJlZ2lvbnNbaV07CisJCQlpZiAobGFzdE9mZnNldCA+IGN1cnJlbnQuZ2V0T2Zmc2V0KCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWlmIChjdXJyZW50LmdldE9mZnNldCgpIDwgMCB8fCBjdXJyZW50LmdldExlbmd0aCgpIDwgMCB8fCBjdXJyZW50LmdldE9mZnNldCgpICsgY3VycmVudC5nZXRMZW5ndGgoKSA+IG1heExlbmd0aCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJbGFzdE9mZnNldCA9IGN1cnJlbnQuZ2V0T2Zmc2V0KCkgKyBjdXJyZW50LmdldExlbmd0aCgpIC0gMTsKKwkJfQorCisJCXJldHVybiB0cnVlOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLmphdmEKaW5kZXggNjJhNWY0My4uNmMzNTc5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDggQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQnJvY2sgSmFuaWN6YWsgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAxNTA3NDEKKyAqICAgICBSYXkgVi4gKHZvaWRzdGFyQGdtYWlsLmNvbSkgLSBDb250cmlidXRpb24gZm9yIGJ1ZyAyODI5ODgKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOwogCkBAIC0xNSw2ICsxNyw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmFsaWduLkFsaWdubWVudDsKIAogLyoqCkBAIC0yNiwxMyArMjksMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUIgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFID0gMjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRCA9IDQ7Ci0JCisKIAlwdWJsaWMgc3RhdGljIERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucyBnZXREZWZhdWx0U2V0dGluZ3MoKSB7CiAJCURlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucygpOwogCQlvcHRpb25zLnNldERlZmF1bHRTZXR0aW5ncygpOwogCQlyZXR1cm4gb3B0aW9uczsKIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucyBnZXRFY2xpcHNlRGVmYXVsdFNldHRpbmdzKCkgewogCQlEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMoKTsKIAkJb3B0aW9ucy5zZXRFY2xpcHNlRGVmYXVsdFNldHRpbmdzKCk7CkBAIC00Niw2ICs0OSw3IEBACiAJfQogCiAJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb247CisJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uOwogCXB1YmxpYyBpbnQgYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudDsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw7CiAJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbjsKQEAgLTU2LDYgKzYwLDcgQEAKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbjsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM7CiAJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyOworCXB1YmxpYyBpbnQgYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb247CiAJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkczsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbjsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb247CkBAIC02NSw5ICs3MCwxMSBAQAogCXB1YmxpYyBpbnQgYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbjsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbjsKIAlwdWJsaWMgaW50IGFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb247Ci0JCisJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk7CisJcHVibGljIGludCBhbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaDsKKwogCXB1YmxpYyBib29sZWFuIGFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zOwotCQorCiAJcHVibGljIFN0cmluZyBicmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uOwogCXB1YmxpYyBTdHJpbmcgYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uOwogCXB1YmxpYyBTdHJpbmcgYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyOwpAQCAtNzksMTAgKzg2LDEwIEBACiAJcHVibGljIFN0cmluZyBicmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uOwogCXB1YmxpYyBTdHJpbmcgYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb247CiAJcHVibGljIFN0cmluZyBicmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoOwotCQorCiAJcHVibGljIGludCBjb250aW51YXRpb25faW5kZW50YXRpb247CiAJcHVibGljIGludCBjb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyOwotCQorCiAJcHVibGljIGludCBibGFua19saW5lc19hZnRlcl9pbXBvcnRzOwogCXB1YmxpYyBpbnQgYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZTsKIAlwdWJsaWMgaW50IGJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZDsKQEAgLTk1LDExICsxMDIsMTQgQEAKIAlwdWJsaWMgaW50IGJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3VwczsKIAlwdWJsaWMgaW50IGJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM7CiAJcHVibGljIGludCBibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk7Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBjb21tZW50X2NsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudDsKIAlwdWJsaWMgYm9vbGVhbiBjb21tZW50X2NsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ7CisJcHVibGljIGJvb2xlYW4gY29tbWVudF9uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllczsKKwlwdWJsaWMgYm9vbGVhbiBjb21tZW50X25ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM7CiAJcHVibGljIGJvb2xlYW4gY29tbWVudF9mb3JtYXRfamF2YWRvY19jb21tZW50OwogCXB1YmxpYyBib29sZWFuIGNvbW1lbnRfZm9ybWF0X2xpbmVfY29tbWVudDsKKwlwdWJsaWMgYm9vbGVhbiBjb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uOwogCXB1YmxpYyBib29sZWFuIGNvbW1lbnRfZm9ybWF0X2Jsb2NrX2NvbW1lbnQ7CiAJcHVibGljIGJvb2xlYW4gY29tbWVudF9mb3JtYXRfaGVhZGVyOwogCXB1YmxpYyBib29sZWFuIGNvbW1lbnRfZm9ybWF0X2h0bWw7CkBAIC0xMDgsOCArMTE4LDE1IEBACiAJcHVibGljIGJvb2xlYW4gY29tbWVudF9pbmRlbnRfcm9vdF90YWdzOwogCXB1YmxpYyBib29sZWFuIGNvbW1lbnRfaW5zZXJ0X2VtcHR5X2xpbmVfYmVmb3JlX3Jvb3RfdGFnczsKIAlwdWJsaWMgYm9vbGVhbiBjb21tZW50X2luc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyOworCXB1YmxpYyBib29sZWFuIGNvbW1lbnRfcHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzOwogCXB1YmxpYyBpbnQgY29tbWVudF9saW5lX2xlbmd0aDsKLQkKKworCXB1YmxpYyBib29sZWFuIHVzZV90YWdzOworCXB1YmxpYyBjaGFyW10gZGlzYWJsaW5nX3RhZzsKKwlwdWJsaWMgY2hhcltdIGVuYWJsaW5nX3RhZzsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gREVGQVVMVF9ESVNBQkxJTkdfVEFHID0gIkBmb3JtYXR0ZXI6b2ZmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIERFRkFVTFRfRU5BQkxJTkdfVEFHID0gIkBmb3JtYXR0ZXI6b24iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwogCXB1YmxpYyBib29sZWFuIGluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s7CiAJcHVibGljIGJvb2xlYW4gaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5OwogCXB1YmxpYyBib29sZWFuIGluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyOwpAQCAtMTIyLDcgKzEzOSwxMyBAQAogCXB1YmxpYyBib29sZWFuIGluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoOwogCXB1YmxpYyBpbnQgaW5kZW50YXRpb25fc2l6ZTsKIAotCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uOworCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU7CisJcHVibGljIGJvb2xlYW4gaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ7CisJcHVibGljIGJvb2xlYW4gaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kOworCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U7CisJcHVibGljIGJvb2xlYW4gaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyOworCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlOworCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZzsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ7CkBAIC0xMzIsNyArMTU1LDcgQEAKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb247CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrOwotCXB1YmxpYyBib29sZWFuIGluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uOwkKKwlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk7CkBAIC0xODksMTIgKzIxMiwxNCBAQAogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g7CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkOworCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeTsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZTsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsY2FyZDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2ZvcjsKKwlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM7CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uOwpAQCAtMjE4LDYgKzI0Myw3IEBACiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ7CisJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeTsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU7CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ7CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlOwpAQCAtMjczLDYgKzI5OSw3IEBACiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb247CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaDsKKwlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5OwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g7CiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uOwpAQCAtMjgyLDYgKzMwOSw3IEBACiAJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbDsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbjsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I7CisJcHVibGljIGJvb2xlYW4gaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlczsKIAlwdWJsaWMgYm9vbGVhbiBpbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlOwogCXB1YmxpYyBib29sZWFuIGluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcjsKQEAgLTMwMCw2ICszMjgsOCBAQAogCXB1YmxpYyBib29sZWFuIG5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW47CiAJcHVibGljIGJvb2xlYW4gbmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uOwogCXB1YmxpYyBpbnQgbnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlOworCXB1YmxpYyBib29sZWFuIGpvaW5fd3JhcHBlZF9saW5lczsKKwlwdWJsaWMgYm9vbGVhbiBqb2luX2xpbmVzX2luX2NvbW1lbnRzOwogCXB1YmxpYyBib29sZWFuIHB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU7CiAJcHVibGljIGludCB0YWJfc2l6ZTsKIAlwdWJsaWMgZmluYWwgY2hhciBmaWxsaW5nX3NwYWNlID0gJyAnOwpAQCAtMzA3LDEwICszMzcsMTIgQEAKIAlwdWJsaWMgaW50IHRhYl9jaGFyOwogCXB1YmxpYyBib29sZWFuIHVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zOwogCXB1YmxpYyBib29sZWFuIHdyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcjsKLQkKKwlwdWJsaWMgYm9vbGVhbiB3cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoOworCXB1YmxpYyBib29sZWFuIHdyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ7CisKIAlwdWJsaWMgaW50IGluaXRpYWxfaW5kZW50YXRpb25fbGV2ZWw7CiAJcHVibGljIFN0cmluZyBsaW5lX3NlcGFyYXRvcjsKLQkKKwogCXByaXZhdGUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zKCkgewogCQkvLyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCiAJfQpAQCAtMzI4LDYgKzM2MCw3IEBACiAJcHVibGljIE1hcCBnZXRNYXAoKSB7CiAJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfQVJHVU1FTlRTX0lOX0FMTE9DQVRJT05fRVhQUkVTU0lPTiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uKSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0FSR1VNRU5UU19JTl9BTk5PVEFUSU9OLCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0FSR1VNRU5UU19JTl9FTlVNX0NPTlNUQU5ULCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50KSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0FSR1VNRU5UU19JTl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9DQUxMLCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0FSR1VNRU5UU19JTl9NRVRIT0RfSU5WT0NBVElPTiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24pKTsKQEAgLTMzOCwxNSArMzcxLDE4IEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX0NPTkRJVElPTkFMX0VYUFJFU1NJT04sIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbikpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9FTlVNX0NPTlNUQU5UUywgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cykpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9FWFBSRVNTSU9OU19JTl9BUlJBWV9JTklUSUFMSVpFUiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcikpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9NRVRIT0RfREVDTEFSQVRJT04sIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX01VTFRJUExFX0ZJRUxEUywgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHMpKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfUEFSQU1FVEVSU19JTl9DT05TVFJVQ1RPUl9ERUNMQVJBVElPTiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1BBUkFNRVRFUlNfSU5fTUVUSE9EX0RFQ0xBUkFUSU9OLCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uKSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1JFU09VUkNFU19JTl9UUlksIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeSkpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9TRUxFQ1RPUl9JTl9NRVRIT0RfSU5WT0NBVElPTiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbikpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9TVVBFUkNMQVNTX0lOX1RZUEVfREVDTEFSQVRJT04sIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1NVUEVSSU5URVJGQUNFU19JTl9FTlVNX0RFQ0xBUkFUSU9OLCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1NVUEVSSU5URVJGQUNFU19JTl9UWVBFX0RFQ0xBUkFUSU9OLCBnZXRBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1RIUk9XU19DTEFVU0VfSU5fQ09OU1RSVUNUT1JfREVDTEFSQVRJT04sIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbikpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9USFJPV1NfQ0xBVVNFX0lOX01FVEhPRF9ERUNMQVJBVElPTiwgZ2V0QWxpZ25tZW50KHRoaXMuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbikpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9VTklPTl9UWVBFX0lOX01VTFRJQ0FUQ0gsIGdldEFsaWdubWVudCh0aGlzLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTl9UWVBFX01FTUJFUlNfT05fQ09MVU1OUywgdGhpcy5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9CUkFDRV9QT1NJVElPTl9GT1JfQU5OT1RBVElPTl9UWVBFX0RFQ0xBUkFUSU9OLCB0aGlzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24pOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQlJBQ0VfUE9TSVRJT05fRk9SX0FOT05ZTU9VU19UWVBFX0RFQ0xBUkFUSU9OLCB0aGlzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbik7CkBAIC0zNTksMTggKzM5NSwyMiBAQAogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQlJBQ0VfUE9TSVRJT05fRk9SX01FVEhPRF9ERUNMQVJBVElPTiwgdGhpcy5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0JSQUNFX1BPU0lUSU9OX0ZPUl9UWVBFX0RFQ0xBUkFUSU9OLCB0aGlzLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0JSQUNFX1BPU0lUSU9OX0ZPUl9TV0lUQ0gsIHRoaXMuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaCk7Ci0JCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0NMRUFSX0JMQU5LX0xJTkVTX0lOX0JMT0NLX0NPTU1FTlQsIHRoaXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwotCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9DTEVBUl9CTEFOS19MSU5FU19JTl9KQVZBRE9DX0NPTU1FTlQsIHRoaXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50ID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKLQkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0pBVkFET0NfQ09NTUVOVCwgdGhpcy5jb21tZW50X2Zvcm1hdF9qYXZhZG9jX2NvbW1lbnQgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwotCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5ULCB0aGlzLmNvbW1lbnRfZm9ybWF0X2xpbmVfY29tbWVudCA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0NMRUFSX0JMQU5LX0xJTkVTX0lOX0JMT0NLX0NPTU1FTlQsIHRoaXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50ID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfQ0xFQVJfQkxBTktfTElORVNfSU5fSkFWQURPQ19DT01NRU5ULCB0aGlzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50ID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfTkVXX0xJTkVTX0FUX0JMT0NLX0JPVU5EQVJJRVMsIHRoaXMuY29tbWVudF9uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcyA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX05FV19MSU5FU19BVF9KQVZBRE9DX0JPVU5EQVJJRVMsIHRoaXMuY29tbWVudF9uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0JMT0NLX0NPTU1FTlQsIHRoaXMuY29tbWVudF9mb3JtYXRfYmxvY2tfY29tbWVudCA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9IRUFERVIsIHRoaXMuY29tbWVudF9mb3JtYXRfaGVhZGVyID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0hUTUwsIHRoaXMuY29tbWVudF9mb3JtYXRfaHRtbCA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9KQVZBRE9DX0NPTU1FTlQsIHRoaXMuY29tbWVudF9mb3JtYXRfamF2YWRvY19jb21tZW50ID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0xJTkVfQ09NTUVOVCwgdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnQgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UX1NUQVJUSU5HX09OX0ZJUlNUX0NPTFVNTiwgdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX1NPVVJDRSwgdGhpcy5jb21tZW50X2Zvcm1hdF9zb3VyY2UgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9JTkRFTlRfUEFSQU1FVEVSX0RFU0NSSVBUSU9OLCB0aGlzLmNvbW1lbnRfaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbiA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0lOREVOVF9ST09UX1RBR1MsIHRoaXMuY29tbWVudF9pbmRlbnRfcm9vdF90YWdzID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfSU5TRVJUX0VNUFRZX0xJTkVfQkVGT1JFX1JPT1RfVEFHUywgdGhpcy5jb21tZW50X2luc2VydF9lbXB0eV9saW5lX2JlZm9yZV9yb290X3RhZ3MgPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfSU5TRVJUX05FV19MSU5FX0ZPUl9QQVJBTUVURVIsIHRoaXMuY29tbWVudF9pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlciA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9QUkVTRVJWRV9XSElURV9TUEFDRV9CRVRXRUVOX0NPREVfQU5EX0xJTkVfQ09NTUVOVCwgdGhpcy5jb21tZW50X3ByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cyA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0xJTkVfTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuY29tbWVudF9saW5lX2xlbmd0aCkpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09OVElOVUFUSU9OX0lOREVOVEFUSU9OLCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuY29udGludWF0aW9uX2luZGVudGF0aW9uKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT05USU5VQVRJT05fSU5ERU5UQVRJT05fRk9SX0FSUkFZX0lOSVRJQUxJWkVSLCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcikpOwpAQCAtMzk3LDcgKzQzNywxMiBAQAogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5ERU5UX1NXSVRDSFNUQVRFTUVOVFNfQ09NUEFSRV9UT19DQVNFUywgdGhpcy5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOREVOVF9TV0lUQ0hTVEFURU1FTlRTX0NPTVBBUkVfVE9fU1dJVENILCB0aGlzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOREVOVEFUSU9OX1NJWkUsIEludGVnZXIudG9TdHJpbmcodGhpcy5pbmRlbnRhdGlvbl9zaXplKSk7Ci0JCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTiwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbiA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fVFlQRSwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlID8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9GSUVMRCwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZCA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTUVUSE9ELCB0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZCA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fUEFDS0FHRSwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlID8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9QQVJBTUVURVIsIHRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyID8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9MT0NBTF9WQVJJQUJMRSwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZSA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX09QRU5JTkdfQlJBQ0VfSU5fQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FUX0VORF9PRl9GSUxFX0lGX01JU1NJTkcsIHRoaXMuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3NpbmcgPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9CRUZPUkVfQ0FUQ0hfSU5fVFJZX1NUQVRFTUVOVCwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwpAQCAtNDEyLDYgKzQ1Nyw3IEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfSU5fRU1QVFlfRU5VTV9ERUNMQVJBVElPTiwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfSU5fRU1QVFlfTUVUSE9EX0JPRFksIHRoaXMuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9JTl9FTVBUWV9UWVBFX0RFQ0xBUkFUSU9OLCB0aGlzLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9MQUJFTCwgdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX0FORF9JTl9UWVBFX1BBUkFNRVRFUiwgdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9BU1NJR05NRU5UX09QRVJBVE9SLCB0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9BVF9JTl9BTk5PVEFUSU9OLCB0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKQEAgLTQ2NCwxMiArNTEwLDE0IEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfT1BFTklOR19QQVJFTl9JTl9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04sIHRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9PUEVOSU5HX1BBUkVOX0lOX1NXSVRDSCwgdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX09QRU5JTkdfUEFSRU5fSU5fU1lOQ0hST05JWkVELCB0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfT1BFTklOR19QQVJFTl9JTl9UUlksIHRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9PUEVOSU5HX1BBUkVOX0lOX1dISUxFLCB0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9QT1NURklYX09QRVJBVE9SLCB0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9QUkVGSVhfT1BFUkFUT1IsIHRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfUVVFU1RJT05fSU5fQ09ORElUSU9OQUwsIHRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9RVUVTVElPTl9JTl9XSUxEQ0FSRCwgdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsY2FyZD8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfU0VNSUNPTE9OX0lOX0ZPUiwgdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfU0VNSUNPTE9OX0lOX1RSWV9SRVNPVVJDRVMsIHRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9VTkFSWV9PUEVSQVRPUiwgdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9BTkRfSU5fVFlQRV9QQVJBTUVURVIsIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIgPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQVRfSU5fQU5OT1RBVElPTl9UWVBFX0RFQ0xBUkFUSU9OLCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uID8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CkBAIC00OTMsNiArNTQxLDcgQEAKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ0xPU0lOR19QQVJFTl9JTl9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04sIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfUEFSRU5fSU5fU1dJVENILCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9DTE9TSU5HX1BBUkVOX0lOX1NZTkNIUk9OSVpFRCwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ0xPU0lOR19QQVJFTl9JTl9UUlksIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfUEFSRU5fSU5fV0hJTEUsIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ09MT05fSU5fQVNTRVJULCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ09MT05fSU5fQ0FTRSwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwpAQCAtNTQ3LDYgKzU5Niw3IEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX09QRU5JTkdfUEFSRU5fSU5fU1dJVENILCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9PUEVOSU5HX0JSQUNFX0lOX1NXSVRDSCwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9TWU5DSFJPTklaRUQsIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX09QRU5JTkdfUEFSRU5fSU5fVFJZLCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9PUEVOSU5HX1BBUkVOX0lOX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTiwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9XSElMRSwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fSU5fUkVUVVJOLCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybiA/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwpAQCAtNTU3LDYgKzYwNyw3IEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX1FVRVNUSU9OX0lOX1dJTERDQVJELCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsY2FyZD8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX1NFTUlDT0xPTiwgdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX1NFTUlDT0xPTl9JTl9GT1IsIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPyBKYXZhQ29yZS5JTlNFUlQgOiBKYXZhQ29yZS5ET19OT1RfSU5TRVJUKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfU0VNSUNPTE9OX0lOX1RSWV9SRVNPVVJDRVMsIHRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX1VOQVJZX09QRVJBVE9SLCB0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFVFdFRU5fQlJBQ0tFVFNfSU5fQVJSQVlfVFlQRV9SRUZFUkVOQ0UsIHRoaXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U/IEphdmFDb3JlLklOU0VSVCA6IEphdmFDb3JlLkRPX05PVF9JTlNFUlQpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFVFdFRU5fRU1QVFlfQlJBQ0VTX0lOX0FSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj8gSmF2YUNvcmUuSU5TRVJUIDogSmF2YUNvcmUuRE9fTk9UX0lOU0VSVCk7CkBAIC01NzUsNiArNjI2LDggQEAKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX05FVkVSX0lOREVOVF9CTE9DS19DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4sIHRoaXMubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfTElORV9DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4sIHRoaXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX05VTUJFUl9PRl9FTVBUWV9MSU5FU19UT19QUkVTRVJWRSwgSW50ZWdlci50b1N0cmluZyh0aGlzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSkpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSk9JTl9XUkFQUEVEX0xJTkVTLCB0aGlzLmpvaW5fd3JhcHBlZF9saW5lcyA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9KT0lOX0xJTkVTX0lOX0NPTU1FTlRTLCB0aGlzLmpvaW5fbGluZXNfaW5fY29tbWVudHMgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfUFVUX0VNUFRZX1NUQVRFTUVOVF9PTl9ORVdfTElORSwgdGhpcy5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lID8gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSA6IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0xJTkVfU1BMSVQsIEludGVnZXIudG9TdHJpbmcodGhpcy5wYWdlX3dpZHRoKSk7CiAJCXN3aXRjaCh0aGlzLnRhYl9jaGFyKSB7CkBAIC01OTEsNiArNjQ0LDExIEBACiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9UQUJfU0laRSwgSW50ZWdlci50b1N0cmluZyh0aGlzLnRhYl9zaXplKSk7CiAJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9VU0VfVEFCU19PTkxZX0ZPUl9MRUFESU5HX0lOREVOVEFUSU9OUywgdGhpcy51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucyA/ICBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwogCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfV1JBUF9CRUZPUkVfQklOQVJZX09QRVJBVE9SLCB0aGlzLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9XUkFQX0JFRk9SRV9PUl9PUEVSQVRPUl9NVUxUSUNBVENILCB0aGlzLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2ggPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOworCQlvcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfRElTQUJMSU5HX1RBRywgdGhpcy5kaXNhYmxpbmdfdGFnID09IG51bGwgPyBVdGlsLkVNUFRZX1NUUklORyA6IG5ldyBTdHJpbmcodGhpcy5kaXNhYmxpbmdfdGFnKSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9FTkFCTElOR19UQUcsIHRoaXMuZW5hYmxpbmdfdGFnID09IG51bGwgPyBVdGlsLkVNUFRZX1NUUklORyA6IG5ldyBTdHJpbmcodGhpcy5lbmFibGluZ190YWcpKTsKKwkJb3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX1VTRV9PTl9PRkZfVEFHUywgdGhpcy51c2VfdGFncyA/IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUgOiBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CisJCW9wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9XUkFQX09VVEVSX0VYUFJFU1NJT05TX1dIRU5fTkVTVEVELCB0aGlzLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQgPyBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFIDogRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRkFMU0UpOwogCQlyZXR1cm4gb3B0aW9uczsKIAl9CiAKQEAgLTYwNSw2ICs2NjMsMTYgQEAKIAkJCQl0aGlzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCQl9CiAJCX0KKwkJZmluYWwgT2JqZWN0IGFsaWdubWVudEZvckFyZ3VtZW50c0luQW5ub3RhdGlvbk9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9BUkdVTUVOVFNfSU5fQU5OT1RBVElPTik7CisJCWlmIChhbGlnbm1lbnRGb3JBcmd1bWVudHNJbkFubm90YXRpb25PcHRpb24gIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl0aGlzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIGFsaWdubWVudEZvckFyZ3VtZW50c0luQW5ub3RhdGlvbk9wdGlvbik7CisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCXRoaXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbiA9IEFsaWdubWVudC5NX05PX0FMSUdOTUVOVDsKKwkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uID0gQWxpZ25tZW50Lk1fTk9fQUxJR05NRU5UOworCQkJfQorCQl9CiAJCWZpbmFsIE9iamVjdCBhbGlnbm1lbnRGb3JBcmd1bWVudHNJbkVudW1Db25zdGFudE9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9BUkdVTUVOVFNfSU5fRU5VTV9DT05TVEFOVCk7CiAJCWlmIChhbGlnbm1lbnRGb3JBcmd1bWVudHNJbkVudW1Db25zdGFudE9wdGlvbiAhPSBudWxsKSB7CiAJCQl0cnkgewpAQCAtNzA1LDYgKzc3MywxNiBAQAogCQkJCXRoaXMuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCQl9CiAJCX0KKwkJZmluYWwgT2JqZWN0IGFsaWdubWVudEZvck1ldGhvZERlY2xhcmF0aW9uT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX01FVEhPRF9ERUNMQVJBVElPTik7CisJCWlmIChhbGlnbm1lbnRGb3JNZXRob2REZWNsYXJhdGlvbk9wdGlvbiAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXRoaXMuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIGFsaWdubWVudEZvck1ldGhvZERlY2xhcmF0aW9uT3B0aW9uKTsKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCQl9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCQl9CisJCX0KIAkJZmluYWwgT2JqZWN0IGFsaWdubWVudEZvck11bHRpcGxlRmllbGRzT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX01VTFRJUExFX0ZJRUxEUyk7CiAJCWlmIChhbGlnbm1lbnRGb3JNdWx0aXBsZUZpZWxkc09wdGlvbiAhPSBudWxsKSB7CiAJCQl0cnkgewpAQCAtNzM1LDYgKzgxMywxNiBAQAogCQkJCXRoaXMuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCQl9CiAJCX0KKwkJZmluYWwgT2JqZWN0IGFsaWdubWVudEZvclJlc291cmNlc0luVHJ5ID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTk1FTlRfRk9SX1JFU09VUkNFU19JTl9UUlkpOworCQlpZiAoYWxpZ25tZW50Rm9yUmVzb3VyY2VzSW5UcnkgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl0aGlzLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgYWxpZ25tZW50Rm9yUmVzb3VyY2VzSW5UcnkpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQl0aGlzLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeSA9IEFsaWdubWVudC5NX05FWFRfUEVSX0xJTkVfU1BMSVQ7CisJCQl9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnkgPSBBbGlnbm1lbnQuTV9ORVhUX1BFUl9MSU5FX1NQTElUOworCQkJfQorCQl9CiAJCWZpbmFsIE9iamVjdCBhbGlnbm1lbnRGb3JTZWxlY3RvckluTWV0aG9kSW52b2NhdGlvbk9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9TRUxFQ1RPUl9JTl9NRVRIT0RfSU5WT0NBVElPTik7CiAJCWlmIChhbGlnbm1lbnRGb3JTZWxlY3RvckluTWV0aG9kSW52b2NhdGlvbk9wdGlvbiAhPSBudWxsKSB7CiAJCQl0cnkgewpAQCAtNzk1LDYgKzg4MywxNiBAQAogCQkJCXRoaXMuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCQl9CiAJCX0KKwkJZmluYWwgT2JqZWN0IGFsaWdubWVudEZvclVuaW9uVHlwZUluTXVsdGljYXRjaCA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9VTklPTl9UWVBFX0lOX01VTFRJQ0FUQ0gpOworCQlpZiAoYWxpZ25tZW50Rm9yVW5pb25UeXBlSW5NdWx0aWNhdGNoICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgYWxpZ25tZW50Rm9yVW5pb25UeXBlSW5NdWx0aWNhdGNoKTsKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaCA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCQl9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhpcy5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaCA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCQl9CisJCX0KIAkJZmluYWwgT2JqZWN0IGFsaWduVHlwZU1lbWJlcnNPbkNvbHVtbnNPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0FMSUdOX1RZUEVfTUVNQkVSU19PTl9DT0xVTU5TKTsKIAkJaWYgKGFsaWduVHlwZU1lbWJlcnNPbkNvbHVtbnNPcHRpb24gIT0gbnVsbCkgewogCQkJdGhpcy5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKGFsaWduVHlwZU1lbWJlcnNPbkNvbHVtbnNPcHRpb24pOwpAQCAtMTAzOSw3ICsxMTM3LDExIEBACiAJCWZpbmFsIE9iamVjdCBjb21tZW50Rm9ybWF0TGluZUNvbW1lbnRPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0xJTkVfQ09NTUVOVCk7CiAJCWlmIChjb21tZW50Rm9ybWF0TGluZUNvbW1lbnRPcHRpb24gIT0gbnVsbCkgewogCQkJdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnQgPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFLmVxdWFscyhjb21tZW50Rm9ybWF0TGluZUNvbW1lbnRPcHRpb24pOwotCQl9CQkKKwkJfQorCQlmaW5hbCBPYmplY3QgZm9ybWF0TGluZUNvbW1lbnRTdGFydGluZ09uRmlyc3RDb2x1bW5PcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0xJTkVfQ09NTUVOVF9TVEFSVElOR19PTl9GSVJTVF9DT0xVTU4pOworCQlpZiAoZm9ybWF0TGluZUNvbW1lbnRTdGFydGluZ09uRmlyc3RDb2x1bW5PcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoZm9ybWF0TGluZUNvbW1lbnRTdGFydGluZ09uRmlyc3RDb2x1bW5PcHRpb24pOworCQl9CiAJCWZpbmFsIE9iamVjdCBjb21tZW50Rm9ybWF0SGVhZGVyT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9IRUFERVIpOwogCQlpZiAoY29tbWVudEZvcm1hdEhlYWRlck9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2hlYWRlciA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKGNvbW1lbnRGb3JtYXRIZWFkZXJPcHRpb24pOwpAQCAtMTA2OCw2ICsxMTcwLDEwIEBACiAJCWlmIChjb21tZW50SW5zZXJ0TmV3TGluZUZvclBhcmFtZXRlck9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmNvbW1lbnRfaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGNvbW1lbnRJbnNlcnROZXdMaW5lRm9yUGFyYW1ldGVyT3B0aW9uKTsKIAkJfQorCQlmaW5hbCBPYmplY3QgY29tbWVudFByZXNlcnZlV2hpdGVTcGFjZUJldHdlZW5Db2RlQW5kTGluZUNvbW1lbnRzT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX1BSRVNFUlZFX1dISVRFX1NQQUNFX0JFVFdFRU5fQ09ERV9BTkRfTElORV9DT01NRU5UKTsKKwkJaWYgKGNvbW1lbnRQcmVzZXJ2ZVdoaXRlU3BhY2VCZXR3ZWVuQ29kZUFuZExpbmVDb21tZW50c09wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmNvbW1lbnRfcHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoY29tbWVudFByZXNlcnZlV2hpdGVTcGFjZUJldHdlZW5Db2RlQW5kTGluZUNvbW1lbnRzT3B0aW9uKTsKKwkJfQogCQlmaW5hbCBPYmplY3QgY29tbWVudExpbmVMZW5ndGhPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfTElORV9MRU5HVEgpOwogCQlpZiAoY29tbWVudExpbmVMZW5ndGhPcHRpb24gIT0gbnVsbCkgewogCQkJdHJ5IHsKQEAgLTEwNzgsNiArMTE4NCwxNCBAQAogCQkJCXRoaXMuY29tbWVudF9saW5lX2xlbmd0aCA9IDgwOwogCQkJfQogCQl9CisJCWZpbmFsIE9iamVjdCBjb21tZW50TmV3TGluZXNBdEJsb2NrQm91bmRhcmllc09wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9ORVdfTElORVNfQVRfQkxPQ0tfQk9VTkRBUklFUyk7CisJCWlmIChjb21tZW50TmV3TGluZXNBdEJsb2NrQm91bmRhcmllc09wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmNvbW1lbnRfbmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXMgPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFLmVxdWFscyhjb21tZW50TmV3TGluZXNBdEJsb2NrQm91bmRhcmllc09wdGlvbik7CisJCX0KKwkJZmluYWwgT2JqZWN0IGNvbW1lbnROZXdMaW5lc0F0SmF2YWRvY0JvdW5kYXJpZXNPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfTkVXX0xJTkVTX0FUX0pBVkFET0NfQk9VTkRBUklFUyk7CisJCWlmIChjb21tZW50TmV3TGluZXNBdEphdmFkb2NCb3VuZGFyaWVzT3B0aW9uICE9IG51bGwpIHsKKwkJCXRoaXMuY29tbWVudF9uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoY29tbWVudE5ld0xpbmVzQXRKYXZhZG9jQm91bmRhcmllc09wdGlvbik7CisJCX0KIAkJZmluYWwgT2JqZWN0IGluZGVudFN0YXRlbWVudHNDb21wYXJlVG9CbG9ja09wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5ERU5UX1NUQVRFTUVOVFNfQ09NUEFSRV9UT19CTE9DSyk7CiAJCWlmIChpbmRlbnRTdGF0ZW1lbnRzQ29tcGFyZVRvQmxvY2tPcHRpb24gIT0gbnVsbCkgewogCQkJdGhpcy5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoaW5kZW50U3RhdGVtZW50c0NvbXBhcmVUb0Jsb2NrT3B0aW9uKTsKQEAgLTExMjgsMTAgKzEyNDIsNiBAQAogCQkJCXRoaXMuaW5kZW50YXRpb25fc2l6ZSA9IDQ7CiAJCQl9CiAJCX0KLQkJZmluYWwgT2JqZWN0IGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OKTsKLQkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PcHRpb24gIT0gbnVsbCkgewotCQkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbiA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9wdGlvbik7Ci0JCX0KIAkJZmluYWwgT2JqZWN0IGluc2VydE5ld0xpbmVBZnRlck9wZW5pbmdCcmFjZUluQXJyYXlJbml0aWFsaXplck9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX09QRU5JTkdfQlJBQ0VfSU5fQVJSQVlfSU5JVElBTElaRVIpOwogCQlpZiAoaW5zZXJ0TmV3TGluZUFmdGVyT3BlbmluZ0JyYWNlSW5BcnJheUluaXRpYWxpemVyT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVBZnRlck9wZW5pbmdCcmFjZUluQXJyYXlJbml0aWFsaXplck9wdGlvbik7CkBAIC0xMTg4LDYgKzEyOTgsMTAgQEAKIAkJaWYgKGluc2VydE5ld0xpbmVJbkVtcHR5VHlwZURlY2xhcmF0aW9uT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb24gPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVJbkVtcHR5VHlwZURlY2xhcmF0aW9uT3B0aW9uKTsKIAkJfQorCQlmaW5hbCBPYmplY3QgaW5zZXJ0TmV3TGluZUFmdGVyTGFiZWxPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9MQUJFTCk7CisJCWlmIChpbnNlcnROZXdMaW5lQWZ0ZXJMYWJlbE9wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbCA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0TmV3TGluZUFmdGVyTGFiZWxPcHRpb24pOworCQl9CiAJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUFmdGVyQW5kSW5XaWxkY2FyZE9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX0FORF9JTl9UWVBFX1BBUkFNRVRFUik7CiAJCWlmIChpbnNlcnRTcGFjZUFmdGVyQW5kSW5XaWxkY2FyZE9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQWZ0ZXJBbmRJbldpbGRjYXJkT3B0aW9uKTsKQEAgLTEzOTYsNiArMTUxMCwxMCBAQAogCQlpZiAoaW5zZXJ0U3BhY2VBZnRlck9wZW5pbmdQYXJlbkluU3luY2hyb25pemVkT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnRTcGFjZUFmdGVyT3BlbmluZ1BhcmVuSW5TeW5jaHJvbml6ZWRPcHRpb24pOwogCQl9CisJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUFmdGVyT3BlbmluZ1BhcmVuSW5UcnlPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9PUEVOSU5HX1BBUkVOX0lOX1RSWSk7CisJCWlmIChpbnNlcnRTcGFjZUFmdGVyT3BlbmluZ1BhcmVuSW5UcnlPcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnkgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQWZ0ZXJPcGVuaW5nUGFyZW5JblRyeU9wdGlvbik7CisJCX0KIAkJZmluYWwgT2JqZWN0IGluc2VydFNwYWNlQWZ0ZXJPcGVuaW5nUGFyZW5JbldoaWxlT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfT1BFTklOR19QQVJFTl9JTl9XSElMRSk7CiAJCWlmIChpbnNlcnRTcGFjZUFmdGVyT3BlbmluZ1BhcmVuSW5XaGlsZU9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnRTcGFjZUFmdGVyT3BlbmluZ1BhcmVuSW5XaGlsZU9wdGlvbik7CkBAIC0xNDIwLDYgKzE1MzgsMTAgQEAKIAkJaWYgKGluc2VydFNwYWNlQWZ0ZXJTZW1pY29sb25JbkZvck9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnRTcGFjZUFmdGVyU2VtaWNvbG9uSW5Gb3JPcHRpb24pOwogCQl9CisJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUFmdGVyU2VtaWNvbG9uSW5UcnlPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9TRU1JQ09MT05fSU5fVFJZX1JFU09VUkNFUyk7CisJCWlmIChpbnNlcnRTcGFjZUFmdGVyU2VtaWNvbG9uSW5UcnlPcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQWZ0ZXJTZW1pY29sb25JblRyeU9wdGlvbik7CisJCX0KIAkJZmluYWwgT2JqZWN0IGluc2VydFNwYWNlQWZ0ZXJVbmFyeU9wZXJhdG9yT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfVU5BUllfT1BFUkFUT1IpOwogCQlpZiAoaW5zZXJ0U3BhY2VBZnRlclVuYXJ5T3BlcmF0b3JPcHRpb24gIT0gbnVsbCkgewogCQkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3IgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQWZ0ZXJVbmFyeU9wZXJhdG9yT3B0aW9uKTsKQEAgLTE1MTIsNiArMTYzNCwxMCBAQAogCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVDbG9zaW5nUGFyZW5JblN5bmNocm9uaXplZE9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuSW5TeW5jaHJvbml6ZWRPcHRpb24pOwogCQl9CisJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUJlZm9yZUNsb3NpbmdQYXJlbkluVHJ5T3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfUEFSRU5fSU5fVFJZKTsKKwkJaWYgKGluc2VydFNwYWNlQmVmb3JlQ2xvc2luZ1BhcmVuSW5UcnlPcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5ID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnRTcGFjZUJlZm9yZUNsb3NpbmdQYXJlbkluVHJ5T3B0aW9uKTsKKwkJfQogCQlmaW5hbCBPYmplY3QgaW5zZXJ0U3BhY2VCZWZvcmVDbG9zaW5nUGFyZW5JbldoaWxlT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfUEFSRU5fSU5fV0hJTEUpOwogCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVDbG9zaW5nUGFyZW5JbldoaWxlT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnRTcGFjZUJlZm9yZUNsb3NpbmdQYXJlbkluV2hpbGVPcHRpb24pOwpAQCAtMTcyOCw2ICsxODU0LDEwIEBACiAJCWlmIChpbnNlcnRTcGFjZUJlZm9yZU9wZW5pbmdQYXJlbkluU3luY2hyb25pemVkT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0U3BhY2VCZWZvcmVPcGVuaW5nUGFyZW5JblN5bmNocm9uaXplZE9wdGlvbik7CiAJCX0KKwkJZmluYWwgT2JqZWN0IGluc2VydFNwYWNlQmVmb3JlT3BlbmluZ1BhcmVuSW5UcnlPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9UUlkpOworCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVPcGVuaW5nUGFyZW5JblRyeU9wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnkgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQmVmb3JlT3BlbmluZ1BhcmVuSW5UcnlPcHRpb24pOworCQl9CiAJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUJlZm9yZU9wZW5pbmdQYXJlbkluUGFyZW50aGVzaXplZEV4cHJlc3Npb25PcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfT1BFTklOR19QQVJFTl9JTl9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOwogCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVPcGVuaW5nUGFyZW5JblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0U3BhY2VCZWZvcmVPcGVuaW5nUGFyZW5JblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3B0aW9uKTsKQEAgLTE3NjgsNiArMTg5OCwxMCBAQAogCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVTZW1pY29sb25JbkZvck9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0U3BhY2VCZWZvcmVTZW1pY29sb25JbkZvck9wdGlvbik7CiAJCX0KKwkJZmluYWwgT2JqZWN0IGluc2VydFNwYWNlQmVmb3JlU2VtaWNvbG9uSW5UcnlPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfU0VNSUNPTE9OX0lOX1RSWV9SRVNPVVJDRVMpOworCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVTZW1pY29sb25JblRyeU9wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydFNwYWNlQmVmb3JlU2VtaWNvbG9uSW5UcnlPcHRpb24pOworCQl9CiAJCWZpbmFsIE9iamVjdCBpbnNlcnRTcGFjZUJlZm9yZVVuYXJ5T3BlcmF0b3JPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfVU5BUllfT1BFUkFUT1IpOwogCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmVVbmFyeU9wZXJhdG9yT3B0aW9uICE9IG51bGwpIHsKIAkJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvciA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0U3BhY2VCZWZvcmVVbmFyeU9wZXJhdG9yT3B0aW9uKTsKQEAgLTE4NDYsNiArMTk4MCwxNCBAQAogCQkJCXRoaXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlID0gMDsKIAkJCX0KIAkJfQorCQlmaW5hbCBPYmplY3Qgam9pbkxpbmVzSW5Db21tZW50c09wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSk9JTl9MSU5FU19JTl9DT01NRU5UUyk7CisJCWlmIChqb2luTGluZXNJbkNvbW1lbnRzT3B0aW9uICE9IG51bGwpIHsKKwkJCXRoaXMuam9pbl9saW5lc19pbl9jb21tZW50cyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKGpvaW5MaW5lc0luQ29tbWVudHNPcHRpb24pOworCQl9CisJCWZpbmFsIE9iamVjdCBqb2luV3JhcHBlZExpbmVzT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9KT0lOX1dSQVBQRURfTElORVMpOworCQlpZiAoam9pbldyYXBwZWRMaW5lc09wdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmpvaW5fd3JhcHBlZF9saW5lcyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKGpvaW5XcmFwcGVkTGluZXNPcHRpb24pOworCQl9CiAJCWZpbmFsIE9iamVjdCBwdXRFbXB0eVN0YXRlbWVudE9uTmV3TGluZU9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfUFVUX0VNUFRZX1NUQVRFTUVOVF9PTl9ORVdfTElORSk7CiAJCWlmIChwdXRFbXB0eVN0YXRlbWVudE9uTmV3TGluZU9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmUgPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5UUlVFLmVxdWFscyhwdXRFbXB0eVN0YXRlbWVudE9uTmV3TGluZU9wdGlvbik7CkBAIC0xODg4LDkgKzIwMzAsNTggQEAKIAkJaWYgKHdyYXBCZWZvcmVCaW5hcnlPcGVyYXRvck9wdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKHdyYXBCZWZvcmVCaW5hcnlPcGVyYXRvck9wdGlvbik7CiAJCX0KKwkJZmluYWwgT2JqZWN0IHdyYXBCZWZvcmVPck9wZXJhdG9yTXVsdGljYXRjaE9wdGlvbiA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfV1JBUF9CRUZPUkVfT1JfT1BFUkFUT1JfTVVMVElDQVRDSCk7CisJCWlmICh3cmFwQmVmb3JlT3JPcGVyYXRvck11bHRpY2F0Y2hPcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMod3JhcEJlZm9yZU9yT3BlcmF0b3JNdWx0aWNhdGNoT3B0aW9uKTsKKwkJfQorCQlmaW5hbCBPYmplY3QgdXNlVGFncyA9IHNldHRpbmdzLmdldChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfVVNFX09OX09GRl9UQUdTKTsKKwkJaWYgKHVzZVRhZ3MgIT0gbnVsbCkgeworCQkJdGhpcy51c2VfdGFncyA9IERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLlRSVUUuZXF1YWxzKHVzZVRhZ3MpOworCQl9CisJCWZpbmFsIE9iamVjdCBkaXNhYmxlVGFnT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9ESVNBQkxJTkdfVEFHKTsKKwkJaWYgKGRpc2FibGVUYWdPcHRpb24gIT0gbnVsbCkgeworCQkJaWYgKGRpc2FibGVUYWdPcHRpb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBkaXNhYmxlVGFnT3B0aW9uOworCQkJCWludCBpZHggPSBzdHJpbmdWYWx1ZS5pbmRleE9mKCdcbicpOworCQkJCWlmIChpZHggPT0gMCkgeworCQkJCQl0aGlzLmRpc2FibGluZ190YWcgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCVN0cmluZyB0YWcgPSBpZHggPCAwID8gc3RyaW5nVmFsdWUudHJpbSgpIDogc3RyaW5nVmFsdWUuc3Vic3RyaW5nKDAsIGlkeCkudHJpbSgpOworCQkJCQlpZiAodGFnLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCXRoaXMuZGlzYWJsaW5nX3RhZyA9IG51bGw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLmRpc2FibGluZ190YWcgPSB0YWcudG9DaGFyQXJyYXkoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmaW5hbCBPYmplY3QgZW5hYmxlVGFnT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9FTkFCTElOR19UQUcpOworCQlpZiAoZW5hYmxlVGFnT3B0aW9uICE9IG51bGwpIHsKKwkJCWlmIChlbmFibGVUYWdPcHRpb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBlbmFibGVUYWdPcHRpb247CisJCQkJaW50IGlkeCA9IHN0cmluZ1ZhbHVlLmluZGV4T2YoJ1xuJyk7CisJCQkJaWYgKGlkeCA9PSAwKSB7CisJCQkJCXRoaXMuZW5hYmxpbmdfdGFnID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQlTdHJpbmcgdGFnID0gaWR4IDwgMCA/IHN0cmluZ1ZhbHVlLnRyaW0oKSA6IHN0cmluZ1ZhbHVlLnN1YnN0cmluZygwLCBpZHgpLnRyaW0oKTsKKwkJCQkJaWYgKHRhZy5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQl0aGlzLmVuYWJsaW5nX3RhZyA9IG51bGw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLmVuYWJsaW5nX3RhZyA9IHRhZy50b0NoYXJBcnJheSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWZpbmFsIE9iamVjdCB3cmFwV3JhcE91dGVyRXhwcmVzc2lvbnNXaGVuTmVzdGVkT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9XUkFQX09VVEVSX0VYUFJFU1NJT05TX1dIRU5fTkVTVEVEKTsKKwkJaWYgKHdyYXBXcmFwT3V0ZXJFeHByZXNzaW9uc1doZW5OZXN0ZWRPcHRpb24gIT0gbnVsbCkgeworCQkJdGhpcy53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMod3JhcFdyYXBPdXRlckV4cHJlc3Npb25zV2hlbk5lc3RlZE9wdGlvbik7CisJCX0KIAl9CiAKIAkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGhhbmRsZSBkZXByZWNhdGVkIHByZWZlcmVuY2VzIHdoaWNoIG1pZ2h0IGJlIHJlcGxhY2VkIGJ5CisJICogb25lIG9yIG1vcmUgcHJlZmVyZW5jZXMuCisJICogRGVwZW5kaW5nIG9uIGRlcHJlY2F0ZWQgb3B0aW9uIGhhbmRsaW5nIHBvbGljeSwgc2V0IHRoZSBuZXcgZm9ybWF0dGluZyBvcHRpb24ocykuCiAJICogQHBhcmFtIHNldHRpbmdzIHRoZSBnaXZlbiBtYXAKIAkgKiBAZGVwcmVjYXRlZAogCSAqLwpAQCAtMTkxMCwxMCArMjEwMSw3OCBAQAogCQkJCXRoaXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50ID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRS5lcXVhbHMoY29tbWVudENsZWFyQmxhbmtMaW5lc0luQmxvY2tDb21tZW50T3B0aW9uKTsKIAkJCX0KIAkJfQorCQkKKwkJLy8gTmV3IGxpbmUgYWZ0ZXIgYW5ub3RhdGlvbnMKKwkJZmluYWwgT2JqZWN0IGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OKTsKKwkJCisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25NZW1iZXJPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX01FTUJFUik7CisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25UeXBlT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9UWVBFKTsKKwkJZmluYWwgT2JqZWN0IGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkZpZWxkT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9GSUVMRCk7CisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25NZXRob2RPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX01FVEhPRCk7CisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYWNrYWdlT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9QQUNLQUdFKTsKKwkJCisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYXJhbWV0ZXJPcHRpb24gPSBzZXR0aW5ncy5nZXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX1BBUkFNRVRFUik7CisJCWZpbmFsIE9iamVjdCBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25Mb2NhbFZhcmlhYmxlT3B0aW9uID0gc2V0dGluZ3MuZ2V0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9MT0NBTF9WQVJJQUJMRSk7CisKKwkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PblR5cGVPcHRpb24gPT0gbnVsbAorCQkJCSYmIGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkZpZWxkT3B0aW9uID09IG51bGwKKwkJCQkmJiBpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25NZXRob2RPcHRpb24gPT0gbnVsbAorCQkJCSYmIGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PblBhY2thZ2VPcHRpb24gPT0gbnVsbCkgeworCQkJLy8gaWYgbm9uZSBvZiB0aGUgbmV3IDMuNyBvcHRpb25zIGlzIHVzZWQsIGZhbGwgYmFjayB0byB0aGUgZGVwcmVjYXRlZCAzLjQgb3B0aW9uCisJCQlpZiAoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTWVtYmVyT3B0aW9uICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGluc2VydCA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTWVtYmVyT3B0aW9uKTsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUgPSBpbnNlcnQ7CisJCQkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZCA9IGluc2VydDsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZCA9IGluc2VydDsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UgPSBpbnNlcnQ7CisJCQkJCisJCQkJLy8gYW5kIHVzZSB0aGUgb3RoZXIgMy40IG9wdGlvbnMgaWYgYXZhaWxhYmxlCisJCQkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PblBhcmFtZXRlck9wdGlvbiAhPSBudWxsKSB7CisJCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYXJhbWV0ZXJPcHRpb24pOworCQkJCX0KKwkJCQlpZiAoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTG9jYWxWYXJpYWJsZU9wdGlvbiAhPSBudWxsKSB7CisJCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGUgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkxvY2FsVmFyaWFibGVPcHRpb24pOworCQkJCX0KKwkJCQkKKwkJCX0gZWxzZSBpZiAoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uUGFyYW1ldGVyT3B0aW9uID09IG51bGwKKwkJCQkJJiYgaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTG9jYWxWYXJpYWJsZU9wdGlvbiA9PSBudWxsKSB7CisJCQkJLy8gaWYgbm9uZSBvZiB0aGUgbmV3IDMuNCBvcHRpb25zIGlzIHVzZWQsIGZhbGwgYmFjayB0byB0aGUgZGVwcmVjYXRlZCAzLjEgb3B0aW9uCisJCQkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PcHRpb24gIT0gbnVsbCkgeworCQkJCQlib29sZWFuIGluc2VydCA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9wdGlvbik7CisJCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZSA9IGluc2VydDsKKwkJCQkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZCA9IGluc2VydDsKKwkJCQkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2QgPSBpbnNlcnQ7CisJCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZSA9IGluc2VydDsKKwkJCQkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIgPSBpbnNlcnQ7CisJCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGUgPSBpbnNlcnQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeyAvLyBvdGhlcndpc2UgdXNlIG5ldyAzLjcgb3B0aW9ucyBpZiBhdmFpbGFibGUKKwkJCWlmIChpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25UeXBlT3B0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PblR5cGVPcHRpb24pOworCQkJfQorCQkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkZpZWxkT3B0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25GaWVsZE9wdGlvbik7CisJCQl9CisJCQlpZiAoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTWV0aG9kT3B0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZCA9IEphdmFDb3JlLklOU0VSVC5lcXVhbHMoaW5zZXJ0TmV3TGluZUFmdGVyQW5ub3RhdGlvbk9uTWV0aG9kT3B0aW9uKTsKKwkJCX0KKwkJCWlmIChpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYWNrYWdlT3B0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PblBhY2thZ2VPcHRpb24pOworCQkJfQorCQkJLy8gYW5kIHRoZSBvdGhlciAzLjQgb3B0aW9ucyBpZiBhdmFpbGFibGUKKwkJCWlmIChpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYXJhbWV0ZXJPcHRpb24gIT0gbnVsbCkgeworCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyID0gSmF2YUNvcmUuSU5TRVJULmVxdWFscyhpbnNlcnROZXdMaW5lQWZ0ZXJBbm5vdGF0aW9uT25QYXJhbWV0ZXJPcHRpb24pOworCQkJfQorCQkJaWYgKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkxvY2FsVmFyaWFibGVPcHRpb24gIT0gbnVsbCkgeworCQkJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGUgPSBKYXZhQ29yZS5JTlNFUlQuZXF1YWxzKGluc2VydE5ld0xpbmVBZnRlckFubm90YXRpb25PbkxvY2FsVmFyaWFibGVPcHRpb24pOworCQkJfQorCQl9CiAJfQogCiAJcHVibGljIHZvaWQgc2V0RGVmYXVsdFNldHRpbmdzKCkgewogCQl0aGlzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCXRoaXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbiA9IEFsaWdubWVudC5NX05PX0FMSUdOTUVOVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50ID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CkBAIC0xOTI0LDE1ICsyMTgzLDE4IEBACiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uID0gQWxpZ25tZW50Lk1fT05FX1BFUl9MSU5FX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMgPSBBbGlnbm1lbnQuTk9ORTsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKKwkJdGhpcy5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX05PX0FMSUdOTUVOVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKKwkJdGhpcy5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnkgPSBBbGlnbm1lbnQuTV9ORVhUX1BFUl9MSU5FX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb24gPSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uID0gQWxpZ25tZW50Lk1fTkVYVF9TSElGVEVEX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb24gPSBBbGlnbm1lbnQuTV9ORVhUX1NISUZURURfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX05FWFRfU0hJRlRFRF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24gPSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24gPSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOworCQl0aGlzLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyA9IGZhbHNlOwogCQl0aGlzLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24gPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5FTkRfT0ZfTElORTsKIAkJdGhpcy5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24gPSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5FTkRfT0ZfTElORTsKQEAgLTE5NTAsNiArMjIxMiw3IEBACiAJCXRoaXMuY29tbWVudF9mb3JtYXRfYmxvY2tfY29tbWVudCA9IHRydWU7CiAJCXRoaXMuY29tbWVudF9mb3JtYXRfamF2YWRvY19jb21tZW50ID0gdHJ1ZTsKIAkJdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnQgPSB0cnVlOworCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW4gPSB0cnVlOwogCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2hlYWRlciA9IGZhbHNlOwogCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2h0bWwgPSB0cnVlOwogCQl0aGlzLmNvbW1lbnRfZm9ybWF0X3NvdXJjZSA9IHRydWU7CkBAIC0xOTU3LDcgKzIyMjAsMTAgQEAKIAkJdGhpcy5jb21tZW50X2luZGVudF9yb290X3RhZ3MgPSB0cnVlOwogCQl0aGlzLmNvbW1lbnRfaW5zZXJ0X2VtcHR5X2xpbmVfYmVmb3JlX3Jvb3RfdGFncyA9IHRydWU7CiAJCXRoaXMuY29tbWVudF9pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlciA9IHRydWU7CisJCXRoaXMuY29tbWVudF9uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcyA9IHRydWU7CisJCXRoaXMuY29tbWVudF9uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzID0gdHJ1ZTsKIAkJdGhpcy5jb21tZW50X2xpbmVfbGVuZ3RoID0gODA7CisJCXRoaXMuY29tbWVudF9wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9IGZhbHNlOyAKIAkJdGhpcy5jb250aW51YXRpb25faW5kZW50YXRpb24gPSAyOwogCQl0aGlzLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIgPSAyOwogCQl0aGlzLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHMgPSAwOwpAQCAtMTk4Myw3ICsyMjQ5LDEyIEBACiAJCXRoaXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcyA9IHRydWU7CiAJCXRoaXMuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2ggPSB0cnVlOwogCQl0aGlzLmluZGVudGF0aW9uX3NpemUgPSA0OwotCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZCA9IHRydWU7CisJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIgPSBmYWxzZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZSA9IHRydWU7CiAJCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZyA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudCA9IGZhbHNlOwpAQCAtMjA1MCwxMiArMjMyMSwxNCBAQAogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCA9IGZhbHNlOworCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeSA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3IgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsID0gdHJ1ZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsY2FyZCA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvciA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyID0gdHJ1ZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiA9IHRydWU7CkBAIC0yMDc5LDYgKzIzNTIsNyBAQAogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24gPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCA9IGZhbHNlOworCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnkgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGUgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydCA9IHRydWU7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlID0gdHJ1ZTsKQEAgLTIxMzQsNiArMjQwOCw3IEBACiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2ggPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQgPSB0cnVlOworCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnkgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24gPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGUgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvciA9IGZhbHNlOwpAQCAtMjE0Miw2ICsyNDE3LDcgQEAKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGNhcmQgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciA9IGZhbHNlOworCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIgPSBmYWxzZTsKQEAgLTIxNjAsMTQgKzI0MzYsMjEgQEAKIAkJdGhpcy5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uID0gZmFsc2U7CiAJCXRoaXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uID0gZmFsc2U7CiAJCXRoaXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlID0gMTsKKwkJdGhpcy5qb2luX2xpbmVzX2luX2NvbW1lbnRzID0gdHJ1ZTsKKwkJdGhpcy5qb2luX3dyYXBwZWRfbGluZXMgPSB0cnVlOwogCQl0aGlzLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmUgPSBmYWxzZTsKIAkJdGhpcy50YWJfc2l6ZSA9IDQ7CiAJCXRoaXMucGFnZV93aWR0aCA9IDgwOwogCQl0aGlzLnRhYl9jaGFyID0gVEFCOyAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MDgxCiAJCXRoaXMudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnMgPSBmYWxzZTsKIAkJdGhpcy53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IgPSB0cnVlOworCQl0aGlzLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2ggPSB0cnVlOworCQl0aGlzLnVzZV90YWdzID0gZmFsc2U7CisJCXRoaXMuZGlzYWJsaW5nX3RhZyA9IERFRkFVTFRfRElTQUJMSU5HX1RBRzsKKwkJdGhpcy5lbmFibGluZ190YWcgPSBERUZBVUxUX0VOQUJMSU5HX1RBRzsKKwkJdGhpcy53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkID0gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBzZXRFY2xpcHNlRGVmYXVsdFNldHRpbmdzKCkgewogCQlzZXRKYXZhQ29udmVudGlvbnNTZXR0aW5ncygpOwogCQl0aGlzLnRhYl9jaGFyID0gVEFCOwpAQCAtMjE3Niw2ICsyNDU5LDcgQEAKIAogCXB1YmxpYyB2b2lkIHNldEphdmFDb252ZW50aW9uc1NldHRpbmdzKCkgewogCQl0aGlzLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCXRoaXMuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbiA9IEFsaWdubWVudC5NX05PX0FMSUdOTUVOVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50ID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CkBAIC0yMTg2LDE1ICsyNDcwLDE4IEBACiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uID0gQWxpZ25tZW50Lk1fTkVYVF9QRVJfTElORV9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzID0gQWxpZ25tZW50Lk5PTkU7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCXRoaXMuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb24gPSBBbGlnbm1lbnQuTV9OT19BTElHTk1FTlQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHMgPSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUOwogCQl0aGlzLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CisJCXRoaXMuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5ID0gQWxpZ25tZW50Lk1fTkVYVF9QRVJfTElORV9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKIAkJdGhpcy5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uID0gQWxpZ25tZW50Lk1fQ09NUEFDVF9TUExJVDsKKwkJdGhpcy5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaCA9IEFsaWdubWVudC5NX0NPTVBBQ1RfU1BMSVQ7CiAJCXRoaXMuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnMgPSBmYWxzZTsKIAkJdGhpcy5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRU5EX09GX0xJTkU7CiAJCXRoaXMuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRU5EX09GX0xJTkU7CkBAIC0yMjEyLDYgKzI0OTksNyBAQAogCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2Jsb2NrX2NvbW1lbnQgPSB0cnVlOwogCQl0aGlzLmNvbW1lbnRfZm9ybWF0X2phdmFkb2NfY29tbWVudCA9IHRydWU7CiAJCXRoaXMuY29tbWVudF9mb3JtYXRfbGluZV9jb21tZW50ID0gdHJ1ZTsKKwkJdGhpcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uID0gdHJ1ZTsKIAkJdGhpcy5jb21tZW50X2Zvcm1hdF9oZWFkZXIgPSBmYWxzZTsKIAkJdGhpcy5jb21tZW50X2Zvcm1hdF9odG1sID0gdHJ1ZTsKIAkJdGhpcy5jb21tZW50X2Zvcm1hdF9zb3VyY2UgPSB0cnVlOwpAQCAtMjIxOSw3ICsyNTA3LDEwIEBACiAJCXRoaXMuY29tbWVudF9pbmRlbnRfcm9vdF90YWdzID0gdHJ1ZTsKIAkJdGhpcy5jb21tZW50X2luc2VydF9lbXB0eV9saW5lX2JlZm9yZV9yb290X3RhZ3MgPSB0cnVlOwogCQl0aGlzLmNvbW1lbnRfaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIgPSB0cnVlOworCQl0aGlzLmNvbW1lbnRfbmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXMgPSB0cnVlOworCQl0aGlzLmNvbW1lbnRfbmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcyA9IHRydWU7CiAJCXRoaXMuY29tbWVudF9saW5lX2xlbmd0aCA9IDgwOworCQl0aGlzLmNvbW1lbnRfcHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPSBmYWxzZTsgCiAJCXRoaXMuY29udGludWF0aW9uX2luZGVudGF0aW9uID0gMjsKIAkJdGhpcy5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyID0gMjsKIAkJdGhpcy5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzID0gMTsKQEAgLTIyNDUsNyArMjUzNiwxMiBAQAogCQl0aGlzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXMgPSB0cnVlOwogCQl0aGlzLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoID0gZmFsc2U7CiAJCXRoaXMuaW5kZW50YXRpb25fc2l6ZSA9IDQ7Ci0JCXRoaXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb24gPSB0cnVlOworCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUgPSB0cnVlOworCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkID0gdHJ1ZTsKKwkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2QgPSB0cnVlOworCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UgPSB0cnVlOworCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlciA9IGZhbHNlOworCQl0aGlzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlID0gdHJ1ZTsKIAkJdGhpcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50ID0gZmFsc2U7CkBAIC0yMzEyLDEyICsyNjA4LDE0IEBACiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkID0gZmFsc2U7CisJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5ID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3IgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWwgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxjYXJkID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3IgPSB0cnVlOworCQl0aGlzLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcyA9IHRydWU7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uID0gdHJ1ZTsKQEAgLTIzNDEsNiArMjYzOSw3IEBACiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2ggPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkID0gZmFsc2U7CisJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeSA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0ID0gdHJ1ZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2UgPSBmYWxzZTsKQEAgLTIzOTYsNiArMjY5NSw3IEBACiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2ggPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQgPSB0cnVlOworCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnkgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24gPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGUgPSB0cnVlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvciA9IGZhbHNlOwpAQCAtMjQwNCw2ICsyNzA0LDcgQEAKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGNhcmQgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbiA9IGZhbHNlOwogCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciA9IGZhbHNlOworCQl0aGlzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yID0gZmFsc2U7CiAJCXRoaXMuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UgPSBmYWxzZTsKIAkJdGhpcy5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIgPSBmYWxzZTsKQEAgLTI0MjIsMTEgKzI3MjMsMTggQEAKIAkJdGhpcy5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uID0gZmFsc2U7CiAJCXRoaXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uID0gZmFsc2U7CiAJCXRoaXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlID0gMTsKKwkJdGhpcy5qb2luX2xpbmVzX2luX2NvbW1lbnRzID0gdHJ1ZTsKKwkJdGhpcy5qb2luX3dyYXBwZWRfbGluZXMgPSB0cnVlOwogCQl0aGlzLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmUgPSB0cnVlOwogCQl0aGlzLnRhYl9zaXplID0gODsKIAkJdGhpcy5wYWdlX3dpZHRoID0gODA7CiAJCXRoaXMudGFiX2NoYXIgPSBNSVhFRDsKIAkJdGhpcy51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucyA9IGZhbHNlOwogCQl0aGlzLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciA9IHRydWU7CisJCXRoaXMud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaCA9IHRydWU7CisJCXRoaXMudXNlX3RhZ3MgPSBmYWxzZTsKKwkJdGhpcy5kaXNhYmxpbmdfdGFnID0gREVGQVVMVF9ESVNBQkxJTkdfVEFHOworCQl0aGlzLmVuYWJsaW5nX3RhZyA9IERFRkFVTFRfRU5BQkxJTkdfVEFHOworCQl0aGlzLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQgPSB0cnVlOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NiMDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0SmF2YWRvYy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5KYXZhZG9jOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBmdWxsIEphdmFkb2MgY29tbWVudCBmb3IgdGhlIHtAbGluayBGb3JtYXR0ZXJDb21tZW50UGFyc2VyfS4KKyAqIDxwPgorICogSXQgbWlnaHQgaGF2ZSBvbmUgb3Igc2V2ZXJhbCBibG9ja3MgKCBzZWUge0BsaW5rIEZvcm1hdEphdmFkb2NCbG9ja30pLiBUaGUKKyAqIGphdmFkb2MgY29tbWVudCBtaWdodCBzdGFydHMgd2l0aCBhIDxiPmRlc2NyaXB0aW9uPC9iPiB3aGljaCBtZWFucyB0aGF0IGl0cworICogZmlyc3QgYmxvY2sgaGFzIG5vIHRhZy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIEZvcm1hdEphdmFkb2MgZXh0ZW5kcyBKYXZhZG9jIHsKKworCUZvcm1hdEphdmFkb2NCbG9ja1tdIGJsb2NrczsKKwlpbnQgdGV4dFN0YXJ0LCB0ZXh0RW5kOworCWludCBsaW5lU3RhcnQsIGxpbmVFbmQ7CisKK3B1YmxpYyBGb3JtYXRKYXZhZG9jKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCwgaW50IGxlbmd0aCkgeworCXN1cGVyKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCWlmIChsZW5ndGggPiAwKSB7CisJCXRoaXMuYmxvY2tzID0gbmV3IEZvcm1hdEphdmFkb2NCbG9ja1tsZW5ndGhdOworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBqYXZhZG9jIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGhhcyBubyBibG9jaworICogYXQgYWxsLgorICoKKyAqIEByZXR1cm4gYSB7QGxpbmsgRm9ybWF0SmF2YWRvY0Jsb2NrfSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAqLworcHVibGljIEZvcm1hdEphdmFkb2NCbG9jayBnZXRGaXJzdEJsb2NrKCkgeworCWlmICh0aGlzLmJsb2NrcyAhPSBudWxsKSB7CisJCXJldHVybiB0aGlzLmJsb2Nrc1swXTsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGl0IGhhcyBzZXZlcmFsIGxpbmVzIG9yIG5vdC4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBqYXZhZG9jIGNvbW1lbnQgaGFzIHNldmVyYWwgbGluZXMKKyAqIAk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIChlLmcuIGhlYWRlciBhbmQgZm9vdGVyIGFyZSBvbiB0aGUgc2FtZQorICogCWxpbmUpLgorICovCitwdWJsaWMgYm9vbGVhbiBpc011bHRpTGluZSgpIHsKKwlyZXR1cm4gdGhpcy5saW5lU3RhcnQgPCB0aGlzLmxpbmVFbmQ7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9EZWJ1Z1N0cmluZyhjaGFyW10gc291cmNlKSB7CisJaWYgKHRoaXMuYmxvY2tzID09IG51bGwpIHsKKwkJcmV0dXJuICJObyBibG9jayBpbiBjdXJyZW50IEphdmFkb2MgY29tbWVudCI7IC8vJE5PTi1OTFMtMSQKKwl9CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5ibG9ja3MubGVuZ3RoOworCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQl0aGlzLmJsb2Nrc1tpXS50b1N0cmluZ0RlYnVnKGJ1ZmZlciwgc291cmNlKTsKKwkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKKwl9CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jQmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2NCbG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jQmxvY2suamF2YQpAQCAtMCwwICsxLDQ1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50LklKYXZhRG9jVGFnQ29uc3RhbnRzOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBibG9jayBpbiBhIHtAbGluayBGb3JtYXRKYXZhZG9jfSB3aGljaCBtaWdodCBiZSBhCisgKiA8Yj5kZXNjcmlwdGlvbjwvYj4gb3IgYSA8Yj50YWc8L2I+IChzZWV7QGxpbmsgI2lzRGVzY3JpcHRpb24oKX0pLgorICogPC9wPjxwPgorICogVGhlIGJsb2NrIG1pZ2h0IGhhdmUgYSB0YWcsIGEgcmVmZXJlbmNlIGFuZCBub2RlcyAoc2VlCisgKiB7QGxpbmsgRm9ybWF0SmF2YWRvY05vZGV9LiBFYWNoIG9mIHRoZXNlIGVsZW1lbnRzIG1pZ2h0IGJlIHByZXNlbnQgb3Igbm90LAorICogYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgRm9ybWF0SmF2YWRvY0Jsb2NrIGV4dGVuZHMgRm9ybWF0SmF2YWRvY05vZGUgaW1wbGVtZW50cyBJSmF2YURvY1RhZ0NvbnN0YW50cyB7CisJLy8gZmxhZ3MKKwlmaW5hbCBzdGF0aWMgaW50IElOTElORUQgPSAweDAwMDE7CisJZmluYWwgc3RhdGljIGludCBGSVJTVCA9IDB4MDAwMjsKKwlmaW5hbCBzdGF0aWMgaW50IE9OX0hFQURFUl9MSU5FID0gMHgwMDA0OworCWZpbmFsIHN0YXRpYyBpbnQgVEVYVF9PTl9UQUdfTElORSA9IDB4MDAwODsKKwlmaW5hbCBzdGF0aWMgaW50IE9ORV9MSU5FX1RBRyA9IDB4MDAxMDsKKwlmaW5hbCBzdGF0aWMgaW50IFBBUkFNX1RBRyA9IDB4MDAyMDsKKwlmaW5hbCBzdGF0aWMgaW50IElOX1BBUkFNX1RBRyA9IDB4MDA0MDsKKwlmaW5hbCBzdGF0aWMgaW50IElOX0RFU0NSSVBUSU9OID0gMHgwMDgwOworCWZpbmFsIHN0YXRpYyBpbnQgSU1NVVRBQkxFID0gMHgwMTAwOworCisJLy8gY29uc3RhbnRzCisJZmluYWwgc3RhdGljIGludCBNQVhfVEFHX0hJRVJBUkNIWSA9IDEwOworCisJcHJpdmF0ZSBpbnQgdGFnVmFsdWUgPSBOT19UQUdfVkFMVUU7CisJaW50IHRhZ0VuZDsKKwlGb3JtYXRKYXZhZG9jUmVmZXJlbmNlIHJlZmVyZW5jZTsKKwlGb3JtYXRKYXZhZG9jTm9kZVtdIG5vZGVzOworCWludCBub2Rlc1B0ciA9IC0xOworCWludCBmbGFncyA9IDA7CisKK3B1YmxpYyBGb3JtYXRKYXZhZG9jQmxvY2soaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSwgaW50IHZhbHVlKSB7CisJc3VwZXIoc3RhcnQsIGVuZCwgbGluZSk7CisJdGhpcy50YWdWYWx1ZSA9IHZhbHVlOworCXRoaXMudGFnRW5kID0gZW5kOworCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSBUQUdfUEFSQU1fVkFMVUU6CisJCS8vIFRPRE8gd2h5IGFyZSBmb2xsb3dpbmcgdGFncyBjb25zaWRlcmVkIGxpa2UgQHBhcmFtIGJ5IHRoZSBmb3JtYXR0ZXI/CisJCWNhc2UgVEFHX1NFUklBTF9GSUVMRF9WQUxVRToKKwkJY2FzZSBUQUdfVEhST1dTX1ZBTFVFOgorCQljYXNlIFRBR19FWENFUFRJT05fVkFMVUU6CisJCQl0aGlzLmZsYWdzIHw9IFBBUkFNX1RBRzsKKwkJCWJyZWFrOworCQljYXNlIFRBR19DT0RFX1ZBTFVFOgorCQljYXNlIFRBR19MSVRFUkFMX1ZBTFVFOgorCQkJdGhpcy5mbGFncyB8PSBJTU1VVEFCTEU7CisJCQlicmVhazsKKwl9Cit9CisKK3ByaXZhdGUgdm9pZCBhZGROb2RlKEZvcm1hdEphdmFkb2NOb2RlIG5vZGUpIHsKKwkvLyBJbml0aWFsaXplIG9yIHJlc2l6ZSBhcnJheSBpZiBuZWNlc3NhcnkKKwlpZiAoKyt0aGlzLm5vZGVzUHRyID09IDApIHsKKwkJdGhpcy5ub2RlcyA9IG5ldyBGb3JtYXRKYXZhZG9jTm9kZVtERUZBVUxUX0FSUkFZX1NJWkVdOworCX0gZWxzZSBpZiAodGhpcy5ub2Rlc1B0ciA+PSB0aGlzLm5vZGVzLmxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy5ub2RlcywgMCwKKwkJCXRoaXMubm9kZXMgPSBuZXcgRm9ybWF0SmF2YWRvY05vZGVbdGhpcy5ub2Rlcy5sZW5ndGgrSU5DUkVNRU5UX0FSUkFZX1NJWkVdLCAwLAorCQkJdGhpcy5ub2Rlc1B0cik7CisJfQorCisJLy8gU3RvcmUgdGhlIG5vZGUKKwl0aGlzLm5vZGVzW3RoaXMubm9kZXNQdHJdID0gbm9kZTsKKwl0aGlzLnNvdXJjZUVuZCA9IG5vZGUuc291cmNlRW5kOworfQorCit2b2lkIGFkZEJsb2NrKEZvcm1hdEphdmFkb2NCbG9jayBibG9jaywgaW50IGh0bWxMZXZlbCkgeworCWlmICh0aGlzLm5vZGVzICE9IG51bGwpIHsKKwkJRm9ybWF0SmF2YWRvY1RleHRbXSB0ZXh0SGllcmFyY2h5ID0gZ2V0VGV4dEhpZXJhcmNoeShibG9jaywgaHRtbExldmVsKTsKKwkJaWYgKHRleHRIaWVyYXJjaHkgIT0gbnVsbCkgeworCQkJRm9ybWF0SmF2YWRvY1RleHQgbGFzdFRleHQgPSB0ZXh0SGllcmFyY2h5W2h0bWxMZXZlbF07CisJCQlpZiAobGFzdFRleHQgIT0gbnVsbCkgeworCQkJCWxhc3RUZXh0LmFwcGVuZE5vZGUoYmxvY2spOworCQkJCWZvciAoaW50IGk9aHRtbExldmVsLTE7IGk+PTA7IGktLSkgeworCQkJCQl0ZXh0SGllcmFyY2h5W2ldLnNvdXJjZUVuZCA9IGJsb2NrLnNvdXJjZUVuZDsKKwkJCQl9CisJCQkJdGhpcy5zb3VyY2VFbmQgPSBibG9jay5zb3VyY2VFbmQ7CisJCQkJaWYgKGlzUGFyYW1UYWcoKSkgeworCQkJCQlibG9jay5mbGFncyB8PSBJTl9QQVJBTV9UQUc7CisJCQkJfSBlbHNlIGlmIChpc0Rlc2NyaXB0aW9uKCkpIHsKKwkJCQkJYmxvY2suZmxhZ3MgfD0gSU5fREVTQ1JJUFRJT047CisJCQkJfQorCQkJCWJsb2NrLmZsYWdzIHw9IElOTElORUQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCWFkZE5vZGUoYmxvY2spOworCWlmIChpc1BhcmFtVGFnKCkpIHsKKwkJYmxvY2suZmxhZ3MgfD0gSU5fUEFSQU1fVEFHOworCX0gZWxzZSBpZiAoaXNEZXNjcmlwdGlvbigpKSB7CisJCWJsb2NrLmZsYWdzIHw9IElOX0RFU0NSSVBUSU9OOworCX0KKwlibG9jay5mbGFncyB8PSBJTkxJTkVEOworfQorCit2b2lkIGFkZFRleHQoRm9ybWF0SmF2YWRvY1RleHQgdGV4dCkgeworCWlmICh0aGlzLm5vZGVzICE9IG51bGwpIHsKKwkJRm9ybWF0SmF2YWRvY1RleHRbXSB0ZXh0SGllcmFyY2h5ID0gZ2V0VGV4dEhpZXJhcmNoeSh0ZXh0LCB0ZXh0LmRlcHRoKTsKKwkJaWYgKHRleHRIaWVyYXJjaHkgIT0gbnVsbCkgeworCQkJRm9ybWF0SmF2YWRvY1RleHQgbGFzdFRleHQgPSB0ZXh0SGllcmFyY2h5W3RleHQuZGVwdGhdOworCQkJaWYgKGxhc3RUZXh0ICE9IG51bGwpIHsKKwkJCQlsYXN0VGV4dC5hcHBlbmRUZXh0KHRleHQpOworCQkJCWZvciAoaW50IGk9dGV4dC5kZXB0aC0xOyBpPj0wOyBpLS0pIHsKKwkJCQkJdGV4dEhpZXJhcmNoeVtpXS5zb3VyY2VFbmQgPSB0ZXh0LnNvdXJjZUVuZDsKKwkJCQl9CisJCQkJdGhpcy5zb3VyY2VFbmQgPSB0ZXh0LnNvdXJjZUVuZDsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAodGV4dC5kZXB0aCA+IDApIHsKKwkJCQlGb3JtYXRKYXZhZG9jVGV4dCBwYXJlbnRUZXh0ID0gdGV4dEhpZXJhcmNoeVt0ZXh0LmRlcHRoLTFdOworCQkJCWlmIChwYXJlbnRUZXh0ICE9IG51bGwpIHsKKwkJCQkJcGFyZW50VGV4dC5hcHBlbmRUZXh0KHRleHQpOworCQkJCQlmb3IgKGludCBpPXRleHQuZGVwdGgtMjsgaT49MDsgaS0tKSB7CisJCQkJCQl0ZXh0SGllcmFyY2h5W2ldLnNvdXJjZUVuZCA9IHRleHQuc291cmNlRW5kOworCQkJCQl9CisJCQkJCXRoaXMuc291cmNlRW5kID0gdGV4dC5zb3VyY2VFbmQ7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHRleHQuaXNIdG1sVGFnKCkpIHsKKwkJc3dpdGNoICh0ZXh0LmdldEh0bWxUYWdJRCgpKSB7CisJCQljYXNlIEpBVkFET0NfQ09ERV9UQUdTX0lEOgorCQkJCXRleHQubGluZXNCZWZvcmUgPSB0aGlzLm5vZGVzUHRyID09IC0xID8gMCA6IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEpBVkFET0NfU0VQQVJBVE9SX1RBR1NfSUQ6CisJCQkJdGV4dC5saW5lc0JlZm9yZSA9IDE7CisJCQkJYnJlYWs7CisvLwkgICAgCWNhc2UgSkFWQURPQ19CUkVBS19UQUdTX0lEOgorLy8JCQkJaWYgKHRoaXMubm9kZXNQdHIgPj0gMCkgdGV4dC5saW5lc0JlZm9yZSA9IDE7CisJCX0KKwl9CisJYWRkTm9kZSh0ZXh0KTsKKwlpZiAoaXNJbW11dGFibGUoKSkgeworCQl0ZXh0LmltbXV0YWJsZSA9IHRydWU7CisJfQorfQorCit2b2lkIGNsZWFuKCkgeworCWludCBsZW5ndGggPSB0aGlzLm5vZGVzID09IG51bGwgPyAwIDogdGhpcy5ub2Rlcy5sZW5ndGg7CisJaWYgKHRoaXMubm9kZXNQdHIgIT0gKGxlbmd0aC0xKSkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubm9kZXMsIDAsIHRoaXMubm9kZXMgPSBuZXcgRm9ybWF0SmF2YWRvY05vZGVbdGhpcy5ub2Rlc1B0cisxXSwgMCwgdGhpcy5ub2Rlc1B0cisxKTsKKwl9CisJZm9yIChpbnQgaT0wOyBpPD10aGlzLm5vZGVzUHRyOyBpKyspIHsKKwkJdGhpcy5ub2Rlc1tpXS5jbGVhbigpOworCX0KK30KKworRm9ybWF0SmF2YWRvY05vZGUgZ2V0TGFzdE5vZGUoKSB7CisJaWYgKHRoaXMubm9kZXMgIT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzUHRyXTsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHRleHQgaGllcmFyY2h5IGZvciB0aGUgZ2l2ZW4gbm9kZQorICovCitGb3JtYXRKYXZhZG9jVGV4dFtdIGdldFRleHRIaWVyYXJjaHkoRm9ybWF0SmF2YWRvY05vZGUgbm9kZSwgaW50IGh0bWxEZXB0aCkgeworCWlmICh0aGlzLm5vZGVzID09IG51bGwpIHJldHVybiBudWxsOworCUZvcm1hdEphdmFkb2NUZXh0W10gdGV4dEhpZXJhcmNoeSA9IG51bGw7CisJaW50IHB0ciA9IDA7CisJRm9ybWF0SmF2YWRvY1RleHQgdGV4dCA9IG5vZGUuaXNUZXh0KCkgPyAoRm9ybWF0SmF2YWRvY1RleHQpIG5vZGUgOiBudWxsOworCUZvcm1hdEphdmFkb2NOb2RlIGxhc3ROb2RlID0gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzUHRyXTsKKwl3aGlsZSAobGFzdE5vZGUuaXNUZXh0KCkpIHsKKwkJRm9ybWF0SmF2YWRvY1RleHQgbGFzdFRleHQgPSAoRm9ybWF0SmF2YWRvY1RleHQpIGxhc3ROb2RlOworCQlpbnQgbGFzdFRhZ0NhdGVnb3J5ID0gbGFzdFRleHQuZ2V0SHRtbFRhZ0lEKCk7CisJCWJvb2xlYW4gbGFzdFNpbmdsZVRhZyA9IGxhc3RUYWdDYXRlZ29yeSA8PSBKQVZBRE9DX1NJTkdMRV9UQUdTX0lEOworCQlib29sZWFuIGxhc3RUZXh0Q2FuSGF2ZUNoaWxkcmVuID0gbGFzdFRleHQuaXNIdG1sVGFnKCkgJiYgIWxhc3RUZXh0LmlzQ2xvc2luZ0h0bWxUYWcoKSAmJiAhbGFzdFNpbmdsZVRhZzsKKwkJaWYgKGxhc3RUZXh0LmRlcHRoID09IGh0bWxEZXB0aCB8fCAvLyBmb3VuZCBzYW1lIGh0bWwgdGFnIGxldmVsID0+IHVzZSBpdAorCQkJbGFzdFRleHQuaHRtbE5vZGVzUHRyID09IC0xKSB7CS8vIG5vIG1vcmUgc3ViLWxldmVscyA9PiBhZGQgb25lCisJCQkvLyBUZXh0IGJyZWFrYWdlCisJCQlpZiAobGFzdFRleHQuaXNIdG1sVGFnKCkpIHsKKwkJCQkvLyBTZXQgc29tZSBsaW5lcyBiZWZvcmUgaWYgcHJldmlvdXMgd2FzIHNwZWNpZmljIGh0bWwgdGFnCisJCQkJLy8gVGhlIGFkZGVkIHRleHQgaXMgY29uY2VybmVkIGlmIHRoZSBwYXJlbnQgaGFzIG5vIGNoaWxkIHlldCBvciBpcyB0b3AgbGV2ZWwgYW5kIGNsb3NpbmcgaHRtbCB0YWcKKwkJCQlib29sZWFuIHNldExpbmVzQmVmb3JlID0gbGFzdFRleHQuc2VwYXJhdG9yc1B0ciA9PSAtMSB8fCAocHRyID09IDAgJiYgbGFzdFRleHQuaXNDbG9zaW5nSHRtbFRhZygpKTsKKwkJCQlpZiAoIXNldExpbmVzQmVmb3JlICYmIHB0ciA+IDAgJiYgbGFzdFRleHQuaXNDbG9zaW5nSHRtbFRhZygpKSB7CisJCQkJCS8vIGZvciBub24tdG9wIGxldmVsIGNsb3NpbmcgaHRtbCB0YWcsIHRleHQgaXMgY29uY2VybmVkIG9ubHkgaWYgbm8gbmV3IHRleHQgaGFzIGJlZW4gd3JpdHRlbiBhZnRlcgorCQkJCQlGb3JtYXRKYXZhZG9jVGV4dCBwYXJlbnRUZXh0ID0gdGV4dEhpZXJhcmNoeVtwdHItMV07CisJCQkJCWludCB0ZXh0U3RhcnQgPSAoaW50KSBwYXJlbnRUZXh0LnNlcGFyYXRvcnNbcGFyZW50VGV4dC5zZXBhcmF0b3JzUHRyXTsKKwkJCQkJaWYgKHRleHRTdGFydCA8IGxhc3RUZXh0LnNvdXJjZVN0YXJ0KSB7CisJCQkJCQlzZXRMaW5lc0JlZm9yZSA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHNldExpbmVzQmVmb3JlKSB7CisJCQkJCXN3aXRjaCAobGFzdFRleHQuZ2V0SHRtbFRhZ0lEKCkpIHsKKwkJCQkJCWNhc2UgSkFWQURPQ19DT0RFX1RBR1NfSUQ6CisJCQkJCQkJaWYgKG5vZGUubGluZXNCZWZvcmUgPCAyKSB7CisJCQkJCQkJCW5vZGUubGluZXNCZWZvcmUgPSAyOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSkFWQURPQ19TRVBBUkFUT1JfVEFHU19JRDoKKwkJCQkgICAgCWNhc2UgSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEOgorCQkJCQkJCWlmIChub2RlLmxpbmVzQmVmb3JlIDwgMSkgeworCQkJCQkJCQlub2RlLmxpbmVzQmVmb3JlID0gMTsKKwkJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gSWYgYWRkaW5nIGFuIGh0bWwgdGFnIG9uIHNhbWUgaHRtbCB0YWcsIHRoZW4gY2xvc2UgcHJldmlvdXMgb25lIGFuZCBsZWF2ZQorCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5pc0h0bWxUYWcoKSAmJiAhdGV4dC5pc0Nsb3NpbmdIdG1sVGFnKCkgJiYgdGV4dC5nZXRIdG1sVGFnSW5kZXgoKSA9PSBsYXN0VGV4dC5nZXRIdG1sVGFnSW5kZXgoKSAmJiAhbGFzdFRleHQuaXNDbG9zaW5nSHRtbFRhZygpKSB7CisJCQkJCWxhc3RUZXh0LmNsb3NlVGFnKCk7CisJCQkJCXJldHVybiB0ZXh0SGllcmFyY2h5OworCQkJCX0KKwkJCX0KKwkJCS8vIElmIHdlIGhhdmUgYSB0ZXh0IGFmdGVyIGFub3RoZXIgdGV4dCwga2VlcCB0aGUgc2FtZSBsZXZlbCB0byBhcHBlbmQKKwkJCWlmIChsYXN0VGV4dENhbkhhdmVDaGlsZHJlbiB8fCAoaHRtbERlcHRoID09IDAgJiYgIWxhc3RUZXh0LmlzSHRtbFRhZygpICYmIHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0h0bWxUYWcoKSkpIHsKKwkJCQlpZiAodGV4dEhpZXJhcmNoeSA9PSBudWxsKSB0ZXh0SGllcmFyY2h5ID0gbmV3IEZvcm1hdEphdmFkb2NUZXh0W2h0bWxEZXB0aCsxXTsKKwkJCQl0ZXh0SGllcmFyY2h5W3B0cl0gPSBsYXN0VGV4dDsKKwkJCQlyZXR1cm4gdGV4dEhpZXJhcmNoeTsKKwkJCX0KKwkJCS8vIExhc3QgdGV4dCBjYW5ub3QgaGF2ZSBjaGlsZHJlbiwgc28gcmV0dXJuIHRoZSBidWlsdCBoaWVyYXJjaHkKKwkJCXJldHVybiB0ZXh0SGllcmFyY2h5OworCQl9CisJCWlmICh0ZXh0SGllcmFyY2h5ID09IG51bGwpIHRleHRIaWVyYXJjaHkgPSBuZXcgRm9ybWF0SmF2YWRvY1RleHRbaHRtbERlcHRoKzFdOworCQl0ZXh0SGllcmFyY2h5W3B0cisrXSA9IGxhc3RUZXh0OworCQlsYXN0Tm9kZSA9IGxhc3RUZXh0Lmh0bWxOb2Rlc1tsYXN0VGV4dC5odG1sTm9kZXNQdHJdOworCX0KKwlyZXR1cm4gdGV4dEhpZXJhcmNoeTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgaXMgb24gdGhlIHNhbWUgbGluZSBvZiB0aGUgdGFnIG9yIG5vdC4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0ZXh0IGlzIG9uIHRoZSBzYW1lIGxpbmUgdGhhbiB0aGUgdGFnLAorICogCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGhhc1RleHRPblRhZ0xpbmUoKSB7CisJcmV0dXJuICh0aGlzLmZsYWdzICYgVEVYVF9PTl9UQUdfTElORSkgIT0gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJsb2NrIGlzIHRoZSBqYXZhZG9jIGNvbW1lbnQgZGVzY3JpcHRpb24gb3Igbm90LgorICogVGhlIGRlc2NyaXB0aW9uIGJlZ2lucyBhZnRlciB0aGUgc3RhcnRpbmcgZGVsaW1pdGVyIGFuZCBjb250aW51ZXMgdW50aWwgdGhlIHRhZworICogc2VjdGlvbi4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBibG9jayBpcyB0aGUgamF2YWRvYyBkZXNjcmlwdGlvbiwKKyAqIAk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICovCitwdWJsaWMgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uKCkgeworCXJldHVybiB0aGlzLnRhZ1ZhbHVlID09IE5PX1RBR19WQUxVRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJsb2NrIGlzIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgamF2YWRvYyBjb21tZW50IG9yIG5vdAorICogKGluZGVwZW5kZW50bHkgb2YgdGhlIGZhY3QgaXQncyBhIGRlc2NyaXB0aW9uIG9yIG5vdCkuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYmxvY2sgaXMgdGhlIGZpcnN0IG9mIHRoZSBqYXZhZG9jCisgKiAJY29tbWVudCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBGSVJTVCkgIT0gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpcnN0IGJsb2NrIHN0YXJ0cyBvbiB0aGUgc2FtZSBsaW5lIHRoYW4gdGhlIGphdmFkb2MKKyAqIHN0YXJ0aW5nIGRlbGltaXRlciBvciBub3QuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGhlIGZpcnN0IGJsb2NrIHN0YXJ0cyBvbiB0aGUgc2FtZSBsaW5lCisgKiAJdGhhbiB0aGUgamF2YWRvYyBzdGFydGluZyBkZWxpbWl0ZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSGVhZGVyTGluZSgpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBPTl9IRUFERVJfTElORSkgIT0gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJsb2NrIGlzIGltbXV0YWJsZSBvciBub3QuCisgKiA8cD4KKyAqIEN1cnJlbnRseSwgb25seSB7QGNvZGV9IGFuZCB7QGxpdGVyYWx9IGlubGluZSB0YWdzIGJsb2NrIGFyZSBjb25zaWRlcmVkIGFzCisgKiBpbW11dGFibGUuCisgKiA8L3A+CisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBibG9jayBpcyBpbW11dGFibGUsCisgKiAJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKSB7CisJcmV0dXJuICh0aGlzLmZsYWdzICYgSU1NVVRBQkxFKSA9PSBJTU1VVEFCTEU7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBibG9jayBpcyBhIGRlc2NyaXB0aW9uIG9yIGlubGluZWQgaW4gYSBkZXNjcmlwdGlvbi4KKyAqIEBzZWUgI2lzUGFyYW1UYWcoKQorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJsb2NrIGlzIGEgZGVzY3JpcHRpb24gb3IgaW5saW5lZCBpbiBhCisgKiAJZGVzY3JpcHRpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSW5EZXNjcmlwdGlvbigpIHsKKwlyZXR1cm4gdGhpcy50YWdWYWx1ZSA9PSBOT19UQUdfVkFMVUUgfHwgKHRoaXMuZmxhZ3MgJiBJTl9ERVNDUklQVElPTikgPT0gSU5fREVTQ1JJUFRJT047Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSB0ZXh0IGlzIG9uIHRoZSBzYW1lIGxpbmUgb2YgdGhlIHRhZy4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0ZXh0IGlzIG9uIHRoZSBzYW1lIGxpbmUgdGhhbiB0aGUgdGFnLAorICogCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSW5saW5lZCgpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBJTkxJTkVEKSAhPSAwOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgYmxvY2sgaXMgYSBwYXJhbSB0YWcgb3IgaW5saW5lZCBpbiBhIHBhcmFtIHRhZy4KKyAqIEBzZWUgI2lzUGFyYW1UYWcoKQorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJsb2NrIGlzIGEgcGFyYW0gdGFnIG9yIGlubGluZWQgaW4gYSBwYXJhbQorICogCXRhZywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNJblBhcmFtVGFnKCkgeworCXJldHVybiAodGhpcy5mbGFncyAmIChQQVJBTV9UQUcgfCBJTl9QQVJBTV9UQUcpKSAhPSAwOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgdGhlIHRhZyBpcyBvbiBvbmUgbGluZSBvbmx5LgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRhZyBpcyBvbiBvbmUgbGluZSBvbmx5LAorICogCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzT25lTGluZVRhZygpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBPTkVfTElORV9UQUcpICE9IDA7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBibG9jayBpcyBhIHBhcmFtIHRhZyBvciBub3QuICBOb3RlIHRoYXQgdGhpcyBhbHNvIGluY2x1ZGVzCisgKiAmIzA2NDtzZXJpYWxGaWVsZCwgJiMwNjQ7dGhyb3dzIGFuZCAmIzA2NDtleGNlcHRpb24gdGFncy4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBibG9jayBpcyBhIHBhcmFtIHRhZywKKyAqIAk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICovCitwdWJsaWMgYm9vbGVhbiBpc1BhcmFtVGFnKCkgeworCXJldHVybiAodGhpcy5mbGFncyAmIFBBUkFNX1RBRykgPT0gUEFSQU1fVEFHOworfQorCit2b2lkIHNldEhlYWRlckxpbmUoaW50IGphdmFkb2NMaW5lU3RhcnQpIHsKKwlpZiAoamF2YWRvY0xpbmVTdGFydCA9PSB0aGlzLmxpbmVTdGFydCkgeworCQl0aGlzLmZsYWdzIHw9IE9OX0hFQURFUl9MSU5FOworCX0KKwlmb3IgKGludCBpPTA7IGk8dGhpcy5ub2Rlc1B0cjsgaSsrKSB7CisJCXRoaXMubm9kZXNbaV0uc2V0SGVhZGVyTGluZShqYXZhZG9jTGluZVN0YXJ0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwlib29sZWFuIGlubGluZWQgPSAodGhpcy5mbGFncyAmIElOTElORUQpICE9IDA7CisJaWYgKGlubGluZWQpIGJ1ZmZlci5hcHBlbmQoIgl7Iik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCdAJyk7CisJaWYgKHRoaXMudGFnVmFsdWUgPT0gVEFHX09USEVSU19WQUxVRSkgeworCQlidWZmZXIuYXBwZW5kKCJvdGhlcnNfdGFnIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKFRBR19OQU1FU1t0aGlzLnRhZ1ZhbHVlXSk7CisJfQorCXN1cGVyLnRvU3RyaW5nKGJ1ZmZlcik7CisJaWYgKHRoaXMucmVmZXJlbmNlID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKCIgKCIpOyAvLyROT04tTkxTLTEkCisJCXRoaXMucmVmZXJlbmNlLnRvU3RyaW5nKGJ1ZmZlcik7CisJCWJ1ZmZlci5hcHBlbmQoIilcbiIpOyAvLyROT04tTkxTLTEkCisJfQorCVN0cmluZ0J1ZmZlciBmbGFnc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlpZiAoaXNEZXNjcmlwdGlvbigpKSB7CisJCWlmIChmbGFnc0J1ZmZlci5sZW5ndGgoKSA+IDApIGZsYWdzQnVmZmVyLmFwcGVuZCgnLCcpOworCQlmbGFnc0J1ZmZlci5hcHBlbmQoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKGlzRmlyc3QoKSkgeworCQlpZiAoZmxhZ3NCdWZmZXIubGVuZ3RoKCkgPiAwKSBmbGFnc0J1ZmZlci5hcHBlbmQoJywnKTsKKwkJZmxhZ3NCdWZmZXIuYXBwZW5kKCJmaXJzdCIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChpc0hlYWRlckxpbmUoKSkgeworCQlpZiAoZmxhZ3NCdWZmZXIubGVuZ3RoKCkgPiAwKSBmbGFnc0J1ZmZlci5hcHBlbmQoJywnKTsKKwkJZmxhZ3NCdWZmZXIuYXBwZW5kKCJoZWFkZXIgbGluZSIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChpc0ltbXV0YWJsZSgpKSB7CisJCWlmIChmbGFnc0J1ZmZlci5sZW5ndGgoKSA+IDApIGZsYWdzQnVmZmVyLmFwcGVuZCgnLCcpOworCQlmbGFnc0J1ZmZlci5hcHBlbmQoImltbXV0YWJsZSIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChpc0luRGVzY3JpcHRpb24oKSkgeworCQlpZiAoZmxhZ3NCdWZmZXIubGVuZ3RoKCkgPiAwKSBmbGFnc0J1ZmZlci5hcHBlbmQoJywnKTsKKwkJZmxhZ3NCdWZmZXIuYXBwZW5kKCJpbiBkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChpc0lubGluZWQoKSkgeworCQlpZiAoZmxhZ3NCdWZmZXIubGVuZ3RoKCkgPiAwKSBmbGFnc0J1ZmZlci5hcHBlbmQoJywnKTsKKwkJZmxhZ3NCdWZmZXIuYXBwZW5kKCJpbmxpbmVkIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKGlzSW5QYXJhbVRhZygpKSB7CisJCWlmIChmbGFnc0J1ZmZlci5sZW5ndGgoKSA+IDApIGZsYWdzQnVmZmVyLmFwcGVuZCgnLCcpOworCQlmbGFnc0J1ZmZlci5hcHBlbmQoImluIHBhcmFtIHRhZyIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChpc09uZUxpbmVUYWcoKSkgeworCQlpZiAoZmxhZ3NCdWZmZXIubGVuZ3RoKCkgPiAwKSBmbGFnc0J1ZmZlci5hcHBlbmQoJywnKTsKKwkJZmxhZ3NCdWZmZXIuYXBwZW5kKCJvbmUgbGluZSB0YWciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAoaXNQYXJhbVRhZygpKSB7CisJCWlmIChmbGFnc0J1ZmZlci5sZW5ndGgoKSA+IDApIGZsYWdzQnVmZmVyLmFwcGVuZCgnLCcpOworCQlmbGFnc0J1ZmZlci5hcHBlbmQoInBhcmFtIHRhZyIpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChmbGFnc0J1ZmZlci5sZW5ndGgoKSA+IDApIHsKKwkJaWYgKGlubGluZWQpIGJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCWJ1ZmZlci5hcHBlbmQoIglmbGFnczogIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChmbGFnc0J1ZmZlcik7CisJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CisJfQorCWlmICh0aGlzLm5vZGVzUHRyID4gLTEpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5ub2Rlc1B0cjsgaSsrKSB7CisJCQlpZiAoaW5saW5lZCkgYnVmZmVyLmFwcGVuZCgnXHQnKTsKKwkJCXRoaXMubm9kZXNbaV0udG9TdHJpbmcoYnVmZmVyKTsKKwkJfQorCX0KK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZ0RlYnVnKGNoYXJbXSBzb3VyY2UpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworcHVibGljIHZvaWQgdG9TdHJpbmdEZWJ1ZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyW10gc291cmNlKSB7CisJaWYgKHRoaXMudGFnVmFsdWUgPiAwKSB7CisJCWJ1ZmZlci5hcHBlbmQoc291cmNlLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnRhZ0VuZC10aGlzLnNvdXJjZVN0YXJ0KzEpOworCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJfQorCWlmICh0aGlzLnJlZmVyZW5jZSAhPSBudWxsKSB7CisJCXRoaXMucmVmZXJlbmNlLnRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCX0KKwlmb3IgKGludCBpPTA7IGk8PXRoaXMubm9kZXNQdHI7IGkrKykgeworCQl0aGlzLm5vZGVzW2ldLnRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCX0KK30KKwordm9pZCB1cGRhdGUoU2Nhbm5lciBzY2FubmVyKSB7CisJaW50IGJsb2NrRW5kID0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHRoaXMuc291cmNlRW5kKTsKKwlpZiAoYmxvY2tFbmQgPT0gdGhpcy5saW5lU3RhcnQpIHsKKwkJdGhpcy5mbGFncyB8PSBGb3JtYXRKYXZhZG9jQmxvY2suT05FX0xJTkVfVEFHOworCX0KKwlmb3IgKGludCBpPTA7IGk8PXRoaXMubm9kZXNQdHI7IGkrKykgeworCQlpZiAoIXRoaXMubm9kZXNbaV0uaXNUZXh0KCkpIHsKKwkJCSgoRm9ybWF0SmF2YWRvY0Jsb2NrKXRoaXMubm9kZXNbaV0pLnVwZGF0ZShzY2FubmVyKTsKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2NOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jTm9kZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5KYXZhZG9jVGFnQ29uc3RhbnRzOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwge0BsaW5rIEZvcm1hdEphdmFkb2N9IG5vZGVzLgorICogPHA+CisgKiBUaGUgYmFzaWMgaW5mb3JtYXRpb24gZm9yIHRoZXNlIG5vZGVzIGFyZSB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgaW4gdGhlCisgKiBzb3VyY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXRKYXZhZG9jTm9kZSBpbXBsZW1lbnRzIEphdmFkb2NUYWdDb25zdGFudHMgeworCisJLy8gZGVmYXVsdCBzaXplIHVzZWQgZm9yIGFycmF5CisJZmluYWwgc3RhdGljIGludCBERUZBVUxUX0FSUkFZX1NJWkUgPSAxMDsKKwlmaW5hbCBzdGF0aWMgaW50IElOQ1JFTUVOVF9BUlJBWV9TSVpFID0gMTA7CisJcHJvdGVjdGVkIGludCBzb3VyY2VTdGFydCwgc291cmNlRW5kOworCXByb3RlY3RlZCBpbnQgbGluZVN0YXJ0OworCXByb3RlY3RlZCBpbnQgbGluZXNCZWZvcmUgPSAwOworCitwdWJsaWMgRm9ybWF0SmF2YWRvY05vZGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSkgeworCXRoaXMuc291cmNlU3RhcnQgPSBzdGFydDsKKwl0aGlzLnNvdXJjZUVuZCA9IGVuZDsKKwl0aGlzLmxpbmVTdGFydCA9IGxpbmU7Cit9CisKK2Fic3RyYWN0IHZvaWQgY2xlYW4oKTsKKworRm9ybWF0SmF2YWRvY05vZGUgZ2V0TGFzdE5vZGUoKSB7CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCXJldHVybiB0aGlzLnNvdXJjZUVuZCAtIHRoaXMuc291cmNlU3RhcnQgKyAxOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgbm9kZSBpcyBhIHRleHQgKHNlZSB7QGxpbmsgRm9ybWF0SmF2YWRvY1RleHR9IG9yIG5vdC4KKyAqIEluIGNhc2Ugbm90LCB0aGF0IG1lYW5zIHRoYXQgdGhlIG5vZGUgaXMgYW4gYmxvY2sgKHNlZQorICoge0BsaW5rIEZvcm1hdEphdmFkb2NCbG9ja30pLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5vZGUgaXMgYSB0ZXh0IDxjb2RlPmZhbHNlPC9jb2RlPgorICogCW90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNUZXh0KCkgeworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG5vZGUgaXMgaW1tdXRhYmxlIG9yIG5vdC4gSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4KKyAqIHRoZSBmb3JtYXR0ZXIgd2lsbCBsZWF2ZSBpdCBjb250ZW50cyB1bmNoYW5nZWQuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZSBpcyBpbW11dGFibGUsIDxjb2RlPmZhbHNlPC9jb2RlPgorICogCW90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKSB7CisJcmV0dXJuIGZhbHNlOworfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJdG9TdHJpbmcoYnVmZmVyKTsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2VTdGFydCk7CisJYnVmZmVyLmFwcGVuZCgiIC0+ICIpOwkvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZUVuZCk7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdEZWJ1ZyhjaGFyW10gc291cmNlKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwl0b1N0cmluZ0RlYnVnKGJ1ZmZlciwgc291cmNlKTsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKK3B1YmxpYyB2b2lkIHRvU3RyaW5nRGVidWcoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgY2hhcltdIHNvdXJjZSkgeworCWJ1ZmZlci5hcHBlbmQoc291cmNlLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZC10aGlzLnNvdXJjZVN0YXJ0KzEpOworCWJ1ZmZlci5hcHBlbmQoJyAnKTsKK30KKwordm9pZCBzZXRIZWFkZXJMaW5lKGludCBqYXZhZG9jTGluZVN0YXJ0KSB7CisJLy8gZG8gbm90aGluZworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRKYXZhZG9jUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3MjY2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2NSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcmVmZXJlbmNlIGluIGEgamF2YWRvYyBjb21tZW50IGJsb2NrIChzZWUKKyAqIHtAbGluayBGb3JtYXRKYXZhZG9jQmxvY2t9LgorICogPHA+CisgKiBBIHNwZWNpZmljIGNsYXNzIGlzIHVzZWQgYXMgaW50ZXJtZWRpYXRlIHBvc2l0aW9ucyBuZWVkIHRvIGJlIHN0b3JlZCBmb3IgZnVydGhlcgorICogZm9ybWF0dGluZyBpbXByb3ZlbWVudHMgKHR5cGljYWxseSBmb3IgcXVhbGlmaWVkIHJlZmVyZW5jZXMpLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgRm9ybWF0SmF2YWRvY1JlZmVyZW5jZSBleHRlbmRzIEZvcm1hdEphdmFkb2NOb2RlIHsKKworcHVibGljIEZvcm1hdEphdmFkb2NSZWZlcmVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSkgeworCXN1cGVyKHN0YXJ0LCBlbmQsIGxpbmUpOworfQorCitwdWJsaWMgRm9ybWF0SmF2YWRvY1JlZmVyZW5jZShsb25nIHBvc2l0aW9uLCBpbnQgbGluZSkgeworCXN1cGVyKChpbnQpIChwb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBwb3NpdGlvbiwgbGluZSk7Cit9CisKK3ZvaWQgY2xlYW4oKSB7CisJLy8gQ2xlYW4gcG9zaXRpb25zIHdoZW4gdXNlZAorfQorCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJYnVmZmVyLmFwcGVuZCgicmVmIik7CS8vJE5PTi1OTFMtMSQKKwlzdXBlci50b1N0cmluZyhidWZmZXIpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0SmF2YWRvY1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2NUZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmZjFlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdEphdmFkb2NUZXh0LmphdmEKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50LklKYXZhRG9jVGFnQ29uc3RhbnRzOworCisvKioKKyAqIFJlcHJlc2VudHMgdGV4dCBpbnNpZGUgYSBqYXZhZG9jIGNvbW1lbnQgYmxvY2suCisgKiA8cD4KKyAqIFRleHQgbWF5IGJlIHNpbXBsZSBhcyA8Y29kZT5MaW5lIGluc2lkZSBhIGphdmFkb2MgY29tbWVudCBibG9jazwvY29kZT4KKyAqIG9yIG1heSBiZSBhIGh0bWwgdGFnLiBOb3RlIHRoYXQgdG8gbWluaW1pemUgbWVtb3J5IGZvb3RwcmludCwgb25seSB0ZXh0CisgKiBwb3NpdGlvbnMgYXJlIHN0b3JlZC4KKyAqIDwvcD48cD4KKyAqIFNpbXBsZSB0ZXh0IG1heSBoYXZlIG9uZSBvciBzZXZlcmFsIGxpbmVzLiBXaGVuIGl0IGhhcyBzZXZlcmFsIGxpbmVzLCB0aGUKKyAqIHBvc2l0aW9ucyBvZiB0aGUgbGluZSBicmVha3MgYXJlIGFsc28gc3RvcmVkIGluIHRoZSB7QGxpbmsgI3NlcGFyYXRvcnN9IGFycmF5LgorICogPC9wPjxwPgorICogV2hlbiB0ZXh0IGhhcyBodG1sIHRhZ3MsIHRoZW4gdGhleSBhcmUgc3RvcmVkIGluIHtAbGluayAjaHRtbE5vZGVzfSBhcnJheQorICogaW4gYSByZWN1cnNpdmUgd2F5LgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgRm9ybWF0SmF2YWRvY1RleHQgZXh0ZW5kcyBGb3JtYXRKYXZhZG9jTm9kZSBpbXBsZW1lbnRzIElKYXZhRG9jVGFnQ29uc3RhbnRzIHsKKworCWxvbmdbXSBzZXBhcmF0b3JzOworCWludCBzZXBhcmF0b3JzUHRyID0gLTE7CisJcHJpdmF0ZSBpbnQgaHRtbFRhZ0luZGV4ID0gLTE7CisJYm9vbGVhbiBpbW11dGFibGUgPSBmYWxzZTsKKwlGb3JtYXRKYXZhZG9jTm9kZVtdIGh0bWxOb2RlczsKKwlpbnRbXSBodG1sSW5kZXhlczsKKwlpbnQgaHRtbE5vZGVzUHRyID0gLTE7CisJaW50IGRlcHRoID0gMDsKKworcHVibGljIEZvcm1hdEphdmFkb2NUZXh0KGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmUsIGludCBodG1sSW5kZXgsIGludCBodG1sRGVwdGgpIHsKKwlzdXBlcihzdGFydCwgZW5kLCBsaW5lKTsKKwl0aGlzLmh0bWxUYWdJbmRleCA9IGh0bWxJbmRleDsKKwl0aGlzLmRlcHRoID0gaHRtbERlcHRoOworfQorCisvKgorICogQXBwZW5kIGEgdGV4dCB0byBjdXJyZW50IG9uZS4KKyAqIElmIHRoZSBnaXZlbiB0ZXh0IGlzIG5vdCBhbiBodG1sIHRhZyBvciBpcyBhIGNsb3NpbmcgdGFnLCB0aGVuIGp1c3QgYXBwZW5kIHRvCisgKiB0aGUgY3VycmVudCB0ZXh0IHJlY29yZGluZyB0aGUgc2VwYXJhdG9ycy4gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgaHRtbCB0YWcKKyAqIGNoaWxkIG5vZGUuCisgKi8KK3ZvaWQgYXBwZW5kVGV4dChGb3JtYXRKYXZhZG9jVGV4dCB0ZXh0KSB7CisJdGV4dC5pbW11dGFibGUgPSB0aGlzLmltbXV0YWJsZTsKKwlpZiAodGhpcy5kZXB0aCA9PSB0ZXh0LmRlcHRoKSB7CisJCWFkZFNlcGFyYXRvcih0ZXh0KTsKKwkJdGhpcy5zb3VyY2VFbmQgPSB0ZXh0LnNvdXJjZUVuZDsKKwkJaWYgKHRleHQuaXNDbG9zaW5nSHRtbFRhZygpKSB7CisJCQkvLyBjbG9zZSB0aGUgdGFnCisJCQl0aGlzLmh0bWxUYWdJbmRleCA9IHRleHQuaHRtbFRhZ0luZGV4OworCQl9CisJfSBlbHNlIHsKKwkJYXBwZW5kTm9kZSh0ZXh0KTsKKwl9CisJaWYgKHRleHQuaXNIdG1sVGFnKCkpIHsKKwkJc3dpdGNoICh0ZXh0Lmh0bWxUYWdJbmRleCAmIEpBVkFET0NfVEFHU19JRF9NQVNLKSB7CisJCQljYXNlIEpBVkFET0NfQ09ERV9UQUdTX0lEOgorCQkJCXRleHQubGluZXNCZWZvcmUgPSB0aGlzLmh0bWxOb2Rlc1B0ciA9PSAtMSA/IDAgOiAyOworCQkJCWJyZWFrOworCQkJY2FzZSBKQVZBRE9DX1NFUEFSQVRPUl9UQUdTX0lEOgorCQkJCXRleHQubGluZXNCZWZvcmUgPSAxOworCQkJCWJyZWFrOworCSAgICAJY2FzZSBKQVZBRE9DX1NJTkdMRV9CUkVBS19UQUdfSUQ6CisJCQkJaWYgKCF0ZXh0LmlzQ2xvc2luZ0h0bWxUYWcoKSkgdGV4dC5saW5lc0JlZm9yZSA9IDE7CisJCQkJYnJlYWs7CisJICAgIAljYXNlIEpBVkFET0NfQlJFQUtfVEFHU19JRDoKKwkJCQlpZiAoIXRleHQuaXNDbG9zaW5nSHRtbFRhZygpKSB0ZXh0LmxpbmVzQmVmb3JlID0gMTsKKwkJfQorCX0KK30KK3ZvaWQgYXBwZW5kTm9kZShGb3JtYXRKYXZhZG9jTm9kZSBub2RlKSB7CisJaWYgKCsrdGhpcy5odG1sTm9kZXNQdHIgPT0gMCkgeyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCisJCXRoaXMuaHRtbE5vZGVzID0gbmV3IEZvcm1hdEphdmFkb2NOb2RlW0RFRkFVTFRfQVJSQVlfU0laRV07CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuaHRtbE5vZGVzUHRyID09IHRoaXMuaHRtbE5vZGVzLmxlbmd0aCkgeworCQkJaW50IHNpemUgPSB0aGlzLmh0bWxOb2Rlc1B0ciArIERFRkFVTFRfQVJSQVlfU0laRTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5odG1sTm9kZXMsIDAsICh0aGlzLmh0bWxOb2Rlcz0gbmV3IEZvcm1hdEphdmFkb2NOb2RlW3NpemVdKSwgMCwgdGhpcy5odG1sTm9kZXNQdHIpOworCQl9CisJfQorCWFkZFNlcGFyYXRvcihub2RlKTsKKwl0aGlzLmh0bWxOb2Rlc1t0aGlzLmh0bWxOb2Rlc1B0cl0gPSBub2RlOworCXRoaXMuc291cmNlRW5kID0gbm9kZS5zb3VyY2VFbmQ7Cit9CisKK3ByaXZhdGUgdm9pZCBhZGRTZXBhcmF0b3IoRm9ybWF0SmF2YWRvY05vZGUgbm9kZSkgeworCS8vIEp1c3QgYXBwZW5kIHRoZSB0ZXh0CisJaWYgKCsrdGhpcy5zZXBhcmF0b3JzUHRyID09IDApIHsgLy8gbGF6eSBpbml0aWFsaXphdGlvbgorCQl0aGlzLnNlcGFyYXRvcnMgPSBuZXcgbG9uZ1tERUZBVUxUX0FSUkFZX1NJWkVdOworCQl0aGlzLmh0bWxJbmRleGVzID0gbmV3IGludFtERUZBVUxUX0FSUkFZX1NJWkVdOworCX0gZWxzZSB7IC8vIHJlc2l6ZSBpZiBuZWVkZWQKKwkJaWYgKHRoaXMuc2VwYXJhdG9yc1B0ciA9PSB0aGlzLnNlcGFyYXRvcnMubGVuZ3RoKSB7CisJCQlpbnQgc2l6ZSA9IHRoaXMuc2VwYXJhdG9yc1B0ciArIERFRkFVTFRfQVJSQVlfU0laRTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zZXBhcmF0b3JzLCAwLCAodGhpcy5zZXBhcmF0b3JzID0gbmV3IGxvbmdbc2l6ZV0pLCAwLCB0aGlzLnNlcGFyYXRvcnNQdHIpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmh0bWxJbmRleGVzLCAwLCAodGhpcy5odG1sSW5kZXhlcyA9IG5ldyBpbnRbc2l6ZV0pLCAwLCB0aGlzLnNlcGFyYXRvcnNQdHIpOworCQl9CisJfQorCXRoaXMuc2VwYXJhdG9yc1t0aGlzLnNlcGFyYXRvcnNQdHJdID0gKCgobG9uZykgdGhpcy5zb3VyY2VFbmQpIDw8IDMyKSArIG5vZGUuc291cmNlU3RhcnQ7CisJdGhpcy5odG1sSW5kZXhlc1t0aGlzLnNlcGFyYXRvcnNQdHJdID0gbm9kZS5pc1RleHQoKSA/ICgoRm9ybWF0SmF2YWRvY1RleHQpbm9kZSkuaHRtbFRhZ0luZGV4IDogLTE7Cit9CisKK3ZvaWQgY2xlYW4oKSB7CisJaW50IGxlbmd0aCA9IHRoaXMuc2VwYXJhdG9ycyA9PSBudWxsID8gMCA6IHRoaXMuc2VwYXJhdG9ycy5sZW5ndGg7CisJaWYgKHRoaXMuc2VwYXJhdG9yc1B0ciAhPSAobGVuZ3RoLTEpKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zZXBhcmF0b3JzLCAwLCB0aGlzLnNlcGFyYXRvcnMgPSBuZXcgbG9uZ1t0aGlzLnNlcGFyYXRvcnNQdHIrMV0sIDAsIHRoaXMuc2VwYXJhdG9yc1B0cisxKTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmh0bWxJbmRleGVzLCAwLCB0aGlzLmh0bWxJbmRleGVzID0gbmV3IGludFt0aGlzLnNlcGFyYXRvcnNQdHIrMV0sIDAsIHRoaXMuc2VwYXJhdG9yc1B0cisxKTsKKwl9CisJbGVuZ3RoID0gdGhpcy5odG1sTm9kZXMgPT0gbnVsbCA/IDAgOiB0aGlzLmh0bWxOb2Rlcy5sZW5ndGg7CisJaWYgKHRoaXMuaHRtbE5vZGVzUHRyICE9IChsZW5ndGgtMSkpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmh0bWxOb2RlcywgMCwgdGhpcy5odG1sTm9kZXMgPSBuZXcgRm9ybWF0SmF2YWRvY05vZGVbdGhpcy5odG1sTm9kZXNQdHIrMV0sIDAsIHRoaXMuaHRtbE5vZGVzUHRyKzEpOworCQlmb3IgKGludCBpPTA7IGk8PXRoaXMuaHRtbE5vZGVzUHRyOyBpKyspIHsKKwkJCXRoaXMuaHRtbE5vZGVzW2ldLmNsZWFuKCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgY2xvc2VUYWcoKSB7CisJdGhpcy5odG1sVGFnSW5kZXggfD0gSkFWQURPQ19DTE9TRURfVEFHOworfQorCitpbnQgZ2V0SHRtbFRhZ0luZGV4KCkgeworCXJldHVybiB0aGlzLmh0bWxUYWdJbmRleCAmIEpBVkFET0NfVEFHU19JTkRFWF9NQVNLOworfQorCitpbnQgZ2V0SHRtbFRhZ0lEKCkgeworCXJldHVybiB0aGlzLmh0bWxUYWdJbmRleCAmIEpBVkFET0NfVEFHU19JRF9NQVNLOworfQorCitGb3JtYXRKYXZhZG9jTm9kZSBnZXRMYXN0Tm9kZSgpIHsKKwlpZiAodGhpcy5odG1sTm9kZXMgIT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5odG1sTm9kZXNbdGhpcy5odG1sTm9kZXNQdHJdOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgaXMgYSBjbG9zaW5nIGh0bWwgdGFnIG9yIG5vdC4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlIGlzIGFuIGh0bWwgdGFnIGFuZCBoYXMgJy8nIGJlZm9yZSBpdHMKKyAqIAluYW1lIChlLmcuIDwvYmxhPiksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ2xvc2luZ0h0bWxUYWcoKSB7CisJcmV0dXJuIHRoaXMuaHRtbFRhZ0luZGV4ICE9IC0xICYmICh0aGlzLmh0bWxUYWdJbmRleCAmIEpBVkFET0NfQ0xPU0VEX1RBRykgIT0gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgaXMgYSBodG1sIHRhZyBvciBub3QuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZSBpcyBhIGh0bWwgdGFnLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIAlvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSHRtbFRhZygpIHsKKwlyZXR1cm4gdGhpcy5odG1sVGFnSW5kZXggIT0gLTE7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBub2RlIGlzIGFuIGltbXV0YWJsZSBodG1sIHRhZyBvciBub3QuCisgKiA8cD4KKyAqIFRoZSB0ZXh0IGluIGFuIGltbXV0YWJsZSB0YWdzIGlzIDxiPm5ldmVyPC9iPiBmb3JtYXR0ZWQuCisgKiA8L3A+CisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZSBpcyBhbiBpbW11dGFibGUgdGFnLAorICoJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlSHRtbFRhZygpIHsKKwlyZXR1cm4gdGhpcy5odG1sVGFnSW5kZXggIT0gLTEgJiYgKHRoaXMuaHRtbFRhZ0luZGV4ICYgSkFWQURPQ19UQUdTX0lEX01BU0spID09IEpBVkFET0NfSU1NVVRBQkxFX1RBR1NfSUQ7CisKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgaXMgaW1tdXRhYmxlIG9yIG5vdC4KKyAqIDxwPgorICogQSB0ZXh0IGluIGNvbnNpZGVyZWQgYXMgaW1tdXRhYmxlIHdoZW4gaXQgIGJlbG9uZ3MgdG8gYW4gaW1tdXRhYmxlIGJsb2NrCisgKiBvciB3aGVuIGl0J3MgYW4gaW1tdXRhYmxlIGh0bWwgdGFnLgorICogPC9wPgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5vZGUgaXMgYW4gaW1tdXRhYmxlIHRhZywKKyAqCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICovCitwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpIHsKKwlyZXR1cm4gdGhpcy5pbW11dGFibGUgfHwgKHRoaXMuaHRtbFRhZ0luZGV4ICE9IC0xICYmICh0aGlzLmh0bWxUYWdJbmRleCAmIEpBVkFET0NfVEFHU19JRF9NQVNLKSA9PSBKQVZBRE9DX0lNTVVUQUJMRV9UQUdTX0lEKTsKKworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgdGV4dCBhdCB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGluZGV4IHBvc2l0aW9uIGlzIGFmdGVyIGEKKyAqIHNlcGFyYXRvciB0YWcgb3Igbm90LgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRleHQgaXMgYWZ0ZXIgYSBzZXBhcmF0b3IgdGFnLAorICoJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2Ugb3IgaWYgdGhlIGdpdmVuIGluZGV4IGlzIG91dCB0aGUgcmFuZ2Ugb2YKKyAqCQl0aGUgdGV4dCBzZXBhcmF0b3JzLgorICovCitwdWJsaWMgYm9vbGVhbiBpc1RleHRBZnRlckh0bWxTZXBhcmF0b3JUYWcoaW50IHNlcGFyYXRvckluZGV4KSB7CisJaW50IHB0ciA9IHNlcGFyYXRvckluZGV4OworCWlmIChwdHIgPiB0aGlzLnNlcGFyYXRvcnNQdHIpIHJldHVybiBmYWxzZTsKKwlpbnQgdGFnSW5kZXggPSB0aGlzLmh0bWxJbmRleGVzW3B0cl0gJiBKQVZBRE9DX1RBR1NfSURfTUFTSzsKKwlyZXR1cm4gdGFnSW5kZXggIT0gLTEgJiYgdGFnSW5kZXggPT0gSkFWQURPQ19TRVBBUkFUT1JfVEFHU19JRDsKKworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuRm9ybWF0SmF2YWRvY05vZGUjaXNUZXh0KCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNUZXh0KCkgeworCXJldHVybiB0cnVlOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuRm9ybWF0SmF2YWRvY05vZGUjc2V0SGVhZGVyTGluZShpbnQpCisgKi8KK3ZvaWQgc2V0SGVhZGVyTGluZShpbnQgamF2YWRvY0xpbmVTdGFydCkgeworCWZvciAoaW50IGk9MDsgaTx0aGlzLmh0bWxOb2Rlc1B0cjsgaSsrKSB7CisJCUZvcm1hdEphdmFkb2NOb2RlIG5vZGUgPSB0aGlzLmh0bWxOb2Rlc1tpXTsKKwkJaWYgKCFub2RlLmlzVGV4dCgpKSB7CisJCQkoKEZvcm1hdEphdmFkb2NCbG9jaykgbm9kZSkuc2V0SGVhZGVyTGluZShqYXZhZG9jTGluZVN0YXJ0KTsKKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCVN0cmluZ0J1ZmZlciBpbmRlbnRhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlmb3IgKGludCB0PTA7IHQ8PXRoaXMuZGVwdGg7IHQrKykgaW5kZW50YXRpb24uYXBwZW5kKCdcdCcpOworCWJ1ZmZlci5hcHBlbmQoaW5kZW50YXRpb24pOworCWlmIChpc0ltbXV0YWJsZSgpKSB7CisJCWJ1ZmZlci5hcHBlbmQoImltbXV0YWJsZSAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlidWZmZXIuYXBwZW5kKCJ0ZXh0Iik7IC8vJE5PTi1OTFMtMSQKKwlzdXBlci50b1N0cmluZyhidWZmZXIpOworCWJ1ZmZlci5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMuc2VwYXJhdG9yc1B0cisxKS5hcHBlbmQoIiBzZWN0aW9ucywgIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMuaHRtbE5vZGVzUHRyKzEpLmFwcGVuZCgiIGh0bWwgdGFncywgIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMuZGVwdGgpLmFwcGVuZCgiIGRlcHRoLCAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5saW5lc0JlZm9yZSkuYXBwZW5kKCIgYmVmb3JlLCAiKTsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyB0YWdJRCA9ICJubyI7IC8vJE5PTi1OTFMtMSQKKwlzd2l0Y2ggKGdldEh0bWxUYWdJRCgpKSB7CisJCWNhc2UgSkFWQURPQ19UQUdTX0lEX01BU0s6CisJCQl0YWdJRCA9ICJtYXNrIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEOgorCQkJdGFnSUQgPSAic2luZ2xlIGJyZWFrIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgSkFWQURPQ19DT0RFX1RBR1NfSUQ6CisJCQl0YWdJRCA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgSkFWQURPQ19CUkVBS19UQUdTX0lEOgorCQkJdGFnSUQgPSAiYnJlYWsiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBKQVZBRE9DX0lNTVVUQUJMRV9UQUdTX0lEOgorCQkJdGFnSUQgPSAiaW1tdXRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgSkFWQURPQ19TRVBBUkFUT1JfVEFHU19JRDoKKwkJCXRhZ0lEID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlidWZmZXIuYXBwZW5kKHRhZ0lEKS5hcHBlbmQoIiB0YWcgaWQpIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCdcbicpOworfQorCitwdWJsaWMgdm9pZCB0b1N0cmluZ0RlYnVnKFN0cmluZ0J1ZmZlciBidWZmZXIsIGNoYXJbXSBzb3VyY2UpIHsKKwlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgeworCQlmb3IgKGludCBsPTA7IGw8dGhpcy5saW5lc0JlZm9yZTsgbCsrKSB7CisJCQlidWZmZXIuYXBwZW5kKCdcbicpOworCQkJZm9yIChpbnQgdD0wOyB0PHRoaXMuZGVwdGg7IHQrKykgYnVmZmVyLmFwcGVuZCgnXHQnKTsKKwkJfQorCX0KKwlpZiAodGhpcy5zZXBhcmF0b3JzUHRyID09IC0xKSB7CisJCXN1cGVyLnRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCQlyZXR1cm47CisJfQorCWludCBwdHIgPSAwOworCWludCBuZXh0U3RhcnQgPSB0aGlzLnNvdXJjZVN0YXJ0OworCWludCBpZHggPSAwOworCXdoaWxlIChpZHg8PXRoaXMuc2VwYXJhdG9yc1B0ciB8fCAodGhpcy5odG1sTm9kZXNQdHIgIT0gLTEgJiYgcHRyIDw9IHRoaXMuaHRtbE5vZGVzUHRyKSkgeworCQlpZiAoaWR4ID4gdGhpcy5zZXBhcmF0b3JzUHRyKSB7CisJCQkvLyBsYXN0IG5vZGUKKwkJCUZvcm1hdEphdmFkb2NOb2RlIG5vZGUgPSB0aGlzLmh0bWxOb2Rlc1twdHIrK107CisJCQlub2RlLnRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCQkJcmV0dXJuOworCQl9CisJCWludCBlbmQgPSAoaW50KSAodGhpcy5zZXBhcmF0b3JzW2lkeF0gPj4+IDMyKTsKKwkJaWYgKHRoaXMuaHRtbE5vZGVzUHRyID49IDAgJiYgcHRyIDw9IHRoaXMuaHRtbE5vZGVzUHRyICYmIGVuZCA+IHRoaXMuaHRtbE5vZGVzW3B0cl0uc291cmNlU3RhcnQpIHsKKwkJCUZvcm1hdEphdmFkb2NOb2RlIG5vZGUgPSB0aGlzLmh0bWxOb2Rlc1twdHIrK107CisJCQlub2RlLnRvU3RyaW5nRGVidWcoYnVmZmVyLCBzb3VyY2UpOworCQl9IGVsc2UgeworCQkJaWYgKGlkeCA+IDEgJiYgc291cmNlW25leHRTdGFydF0gIT0gJzwnKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKKwkJCQlmb3IgKGludCB0PTA7IHQ8dGhpcy5kZXB0aDsgdCsrKSBidWZmZXIuYXBwZW5kKCdcdCcpOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UsIG5leHRTdGFydCwgZW5kIC0gbmV4dFN0YXJ0ICsgMSk7CisJCX0KKwkJbmV4dFN0YXJ0ID0gKGludCkgdGhpcy5zZXBhcmF0b3JzW2lkeCsrXTsKKwl9CisJaWYgKHNvdXJjZVtuZXh0U3RhcnRdID09ICc8JykgeworCQlzd2l0Y2ggKGdldEh0bWxUYWdJRCgpKSB7CisJCQljYXNlIEpBVkFET0NfQ09ERV9UQUdTX0lEOgorCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CisJCQkJZm9yIChpbnQgdD0wOyB0PHRoaXMuZGVwdGg7IHQrKykgYnVmZmVyLmFwcGVuZCgnXHQnKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKHNvdXJjZSwgbmV4dFN0YXJ0LCB0aGlzLnNvdXJjZUVuZC1uZXh0U3RhcnQrMSk7CisJYnVmZmVyLmFwcGVuZCgnICcpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0dGVyQ29tbWVudFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0dGVyQ29tbWVudFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlM2UxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXR0ZXJDb21tZW50UGFyc2VyLmphdmEKQEAgLTAsMCArMSw4MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQuSUphdmFEb2NUYWdDb25zdGFudHM7CisKKy8qKgorICogSW50ZXJuYWwgcGFyc2VyIHVzZWQgZm9yIGZvcm1hdHRpbmcgamF2YWRvYyBjb21tZW50cy4KKyAqLworcHVibGljIGNsYXNzIEZvcm1hdHRlckNvbW1lbnRQYXJzZXIgZXh0ZW5kcyBKYXZhZG9jUGFyc2VyIGltcGxlbWVudHMgSUphdmFEb2NUYWdDb25zdGFudHMgeworCWNoYXJbXVtdIGh0bWxUYWdzOworCWludCBodG1sVGFnc1B0ciA9IC0xOworCWludCBpbmxpbmVIdG1sVGFnc1B0ciA9IC0xOworCXByaXZhdGUgYm9vbGVhbiBpbnZhbGlkVGFnTmFtZTsKKwlwdWJsaWMgYm9vbGVhbiBwYXJzZUh0bWxUYWdzOworCitwdWJsaWMgRm9ybWF0dGVyQ29tbWVudFBhcnNlcihsb25nIHNvdXJjZUxldmVsKSB7CisJc3VwZXIobnVsbCk7CisJdGhpcy5raW5kID0gRk9STUFUVEVSX0NPTU1FTlRfUEFSU0VSIHwgVEVYVF9QQVJTRTsKKwl0aGlzLnJlcG9ydFByb2JsZW1zID0gZmFsc2U7CisJdGhpcy5jaGVja0RvY0NvbW1lbnQgPSB0cnVlOworCXRoaXMuc291cmNlTGV2ZWwgPSBzb3VyY2VMZXZlbDsKK30KKworcHVibGljIGJvb2xlYW4gcGFyc2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisKKwkvLyBJbml0CisJdGhpcy5qYXZhZG9jU3RhcnQgPSBzdGFydDsKKwl0aGlzLmphdmFkb2NFbmQgPSBlbmQ7CisJdGhpcy5maXJzdFRhZ1Bvc2l0aW9uID0gdGhpcy5qYXZhZG9jU3RhcnQ7CisJLy8gTmVlZCB0byBmbHVzaCBodG1sIHRhZ3Mgc3RhY2sgaW4gY2FzZSBvZiB1bmNsb3NlZCBvbmVzIGluIHByZXZpb3VzIGphdmFkb2MgY29tbWVudHMKKwkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk5NDEKKwl0aGlzLmh0bWxUYWdzUHRyID0gLTE7CisKKwkvLyBwYXJzZSBjb21tZW50CisJYm9vbGVhbiB2YWxpZCA9IGNvbW1lbnRQYXJzZSgpOworCisJcmV0dXJuIHZhbGlkICYmIHRoaXMuZG9jQ29tbWVudCAhPSBudWxsOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNjcmVhdGVBcmd1bWVudFJlZmVyZW5jZShjaGFyW10sIGludCwgYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCwgbG9uZ1tdLCBsb25nKQorICovCitwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUFyZ3VtZW50UmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBpbnQgZGltLCBib29sZWFuIGlzVmFyYXJncywgT2JqZWN0IHJlZiwgbG9uZ1tdIGRpbVBvc2l0aW9ucywgbG9uZyBhcmdOYW1lUG9zKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlGb3JtYXRKYXZhZG9jUmVmZXJlbmNlIHR5cGVSZWYgPSAoRm9ybWF0SmF2YWRvY1JlZmVyZW5jZSkgcmVmOworCWlmIChkaW0gPiAwKSB7CisJCXR5cGVSZWYuc291cmNlRW5kID0gKGludCkgZGltUG9zaXRpb25zW2RpbS0xXTsKKwl9CisJaWYgKGFyZ05hbWVQb3MgPj0gMCkgdHlwZVJlZi5zb3VyY2VFbmQgPSAoaW50KSBhcmdOYW1lUG9zOworCXJldHVybiByZWY7Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjY3JlYXRlRmFrZVJlZmVyZW5jZShpbnQpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGNyZWF0ZUZha2VSZWZlcmVuY2UoaW50IHN0YXJ0KSB7CisJLy8gc3luY2ggc2Nhbm5lciBhbmQgcGFyc2VyIHBvc2l0aW9ucworCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSB0aGlzLmluZGV4OworCS8vIGNyZWF0ZSByZWZlcmVuY2UgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBmb3JtYXQgaXQKKwlpbnQgbGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldExpbmVOdW1iZXIoc3RhcnQpOworCUZvcm1hdEphdmFkb2NSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IEZvcm1hdEphdmFkb2NSZWZlcmVuY2Uoc3RhcnQsIHRoaXMuaW5kZXgtMSwgbGluZVN0YXJ0KTsKKwlyZXR1cm4gcHVzaFNlZVJlZihyZWZlcmVuY2UpOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNjcmVhdGVGaWVsZFJlZmVyZW5jZShqYXZhLmxhbmcuT2JqZWN0KQorICovCitwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZpZWxkUmVmZXJlbmNlKE9iamVjdCByZWNlaXZlcikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJaW50IHN0YXJ0ID0gcmVjZWl2ZXIgPT0gbnVsbCA/IHRoaXMubWVtYmVyU3RhcnQgOiAoKEZvcm1hdEphdmFkb2NSZWZlcmVuY2UpcmVjZWl2ZXIpLnNvdXJjZVN0YXJ0OworCWludCBsaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0TGluZU51bWJlcihzdGFydCk7CisJcmV0dXJuIG5ldyBGb3JtYXRKYXZhZG9jUmVmZXJlbmNlKHN0YXJ0LCAoaW50KSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrWzBdLCBsaW5lU3RhcnQpOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNjcmVhdGVNZXRob2RSZWZlcmVuY2UoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QpCisgKi8KK3Byb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0aG9kUmVmZXJlbmNlKE9iamVjdCByZWNlaXZlciwgTGlzdCBhcmd1bWVudHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWludCBzdGFydCA9IHJlY2VpdmVyID09IG51bGwgPyB0aGlzLm1lbWJlclN0YXJ0IDogKChGb3JtYXRKYXZhZG9jUmVmZXJlbmNlKSByZWNlaXZlcikuc291cmNlU3RhcnQ7CisJaW50IGxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHN0YXJ0KTsKKwlyZXR1cm4gbmV3IEZvcm1hdEphdmFkb2NSZWZlcmVuY2Uoc3RhcnQsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpLCBsaW5lU3RhcnQpOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNjcmVhdGVUYWcoKQorICovCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWcoKSB7CisJaW50IGxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHRoaXMudGFnU291cmNlU3RhcnQpOworCWlmICh0aGlzLmlubGluZVRhZ1N0YXJ0ZWQpIHsKKwkJRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrID0gbmV3IEZvcm1hdEphdmFkb2NCbG9jayh0aGlzLmlubGluZVRhZ1N0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCwgbGluZVN0YXJ0LCB0aGlzLnRhZ1ZhbHVlKTsKKwkJRm9ybWF0SmF2YWRvY0Jsb2NrIHByZXZpb3VzQmxvY2sgPSBudWxsOworCQlpZiAodGhpcy5hc3RQdHIgPT0gLTEpIHsKKwkJCXByZXZpb3VzQmxvY2sgPSBuZXcgRm9ybWF0SmF2YWRvY0Jsb2NrKHRoaXMuaW5saW5lVGFnU3RhcnQsIHRoaXMudGFnU291cmNlRW5kLCBsaW5lU3RhcnQsIE5PX1RBR19WQUxVRSk7CisJCQlwdXNoT25Bc3RTdGFjayhwcmV2aW91c0Jsb2NrLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXByZXZpb3VzQmxvY2sgPSAoRm9ybWF0SmF2YWRvY0Jsb2NrKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJfQorCQlwcmV2aW91c0Jsb2NrLmFkZEJsb2NrKGJsb2NrLCB0aGlzLmh0bWxUYWdzUHRyID09IC0xID8gMCA6IHRoaXMuaHRtbFRhZ3NQdHIpOworCX0gZWxzZSB7CisJCUZvcm1hdEphdmFkb2NCbG9jayBibG9jayA9IG5ldyBGb3JtYXRKYXZhZG9jQmxvY2sodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQsIGxpbmVTdGFydCwgdGhpcy50YWdWYWx1ZSk7CisJCXB1c2hPbkFzdFN0YWNrKGJsb2NrLCB0cnVlKTsKKwl9Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5KYXZhZG9jUGFyc2VyI2NyZWF0ZVR5cGVSZWZlcmVuY2UoaW50KQorICovCitwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50IHByaW1pdGl2ZVRva2VuKSB7CisJaW50IHNpemUgPSB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdOworCWlmIChzaXplID09IDApIHJldHVybiBudWxsOworCWludCBzdGFydCA9IChpbnQpICh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0gPj4+IDMyKTsKKwlpbnQgbGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldExpbmVOdW1iZXIoc3RhcnQpOworCWlmIChzaXplID09IDEpIHsKKwkJcmV0dXJuIG5ldyBGb3JtYXRKYXZhZG9jUmVmZXJlbmNlKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwgbGluZVN0YXJ0KTsKKwl9CisJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW3NpemVdOworCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyIC0gc2l6ZSArIDEsIHBvc2l0aW9ucywgMCwgc2l6ZSk7CisJcmV0dXJuIG5ldyBGb3JtYXRKYXZhZG9jUmVmZXJlbmNlKChpbnQpIChwb3NpdGlvbnNbMF0gPj4+IDMyKSwgKGludCkgcG9zaXRpb25zW3Bvc2l0aW9ucy5sZW5ndGgtMV0sIGxpbmVTdGFydCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGh0bWwgdGFnIGluZGV4IGluIHRoZSB2YXJpb3VzIGFycmF5cyBvZiBJSmF2YURvY1RhZ0NvbnN0YW50cy4KKyAqIFRoZSByZXR1cm5lZCBpbnQgaXMgc2V0IGFzIGZvbGxvdzoKKyAqIAktIHRoZSBhcnJheSBpbmRleCBpcyBzZXQgb24gYml0cyAwIHRvIDcKKyAqIAktIHRoZSB0YWcgY2F0ZWdvcnkgaXMgc2V0IG9uIGJpdCA4IHRvIDE1ICgweEZGMDAgaWYgbm8gYXJyYXkgaW5jbHVkZXMgdGhlIHRhZykKKyAqLworcHJpdmF0ZSBpbnQgZ2V0SHRtbFRhZ0luZGV4KGNoYXJbXSBodG1sVGFnKSB7CisJaW50IGxlbmd0aCA9IGh0bWxUYWcgPT0gbnVsbCA/IDAgOiBodG1sVGFnLmxlbmd0aDsKKwlpbnQgdGFnSWQgPSAwOworCWlmIChsZW5ndGggPiAwKSB7CisJCWZvciAoaW50IGk9MCwgbWF4PUpBVkFET0NfU0lOR0xFX0JSRUFLX1RBRy5sZW5ndGg7IGk8bWF4OyBpKyspIHsKKwkJCWNoYXJbXSB0YWcgPSBKQVZBRE9DX1NJTkdMRV9CUkVBS19UQUdbaV07CisJCQlpZiAobGVuZ3RoID09IHRhZy5sZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoaHRtbFRhZywgdGFnLCBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gKHRhZ0lkIHwgSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEKSArIGk7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaT0wLCBtYXg9SkFWQURPQ19DT0RFX1RBR1MubGVuZ3RoOyBpPG1heDsgaSsrKSB7CisJCQljaGFyW10gdGFnID0gSkFWQURPQ19DT0RFX1RBR1NbaV07CisJCQlpZiAobGVuZ3RoID09IHRhZy5sZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoaHRtbFRhZywgdGFnLCBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gKHRhZ0lkIHwgSkFWQURPQ19DT0RFX1RBR1NfSUQpICsgaTsKKwkJCX0KKwkJfQorCQlmb3IgKGludCBpPTAsIG1heD1KQVZBRE9DX0JSRUFLX1RBR1MubGVuZ3RoOyBpPG1heDsgaSsrKSB7CisJCQljaGFyW10gdGFnID0gSkFWQURPQ19CUkVBS19UQUdTW2ldOworCQkJaWYgKGxlbmd0aCA9PSB0YWcubGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGh0bWxUYWcsIHRhZywgZmFsc2UpKSB7CisJCQkJcmV0dXJuICh0YWdJZCB8IEpBVkFET0NfQlJFQUtfVEFHU19JRCkgKyBpOworCQkJfQorCQl9CisJCWZvciAoaW50IGk9MCwgbWF4PUpBVkFET0NfSU1NVVRBQkxFX1RBR1MubGVuZ3RoOyBpPG1heDsgaSsrKSB7CisJCQljaGFyW10gdGFnID0gSkFWQURPQ19JTU1VVEFCTEVfVEFHU1tpXTsKKwkJCWlmIChsZW5ndGggPT0gdGFnLmxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhodG1sVGFnLCB0YWcsIGZhbHNlKSkgeworCQkJCXJldHVybiAodGFnSWQgfCBKQVZBRE9DX0lNTVVUQUJMRV9UQUdTX0lEKSArIGk7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaT0wLCBtYXg9SkFWQURPQ19TRVBBUkFUT1JfVEFHUy5sZW5ndGg7IGk8bWF4OyBpKyspIHsKKwkJCWNoYXJbXSB0YWcgPSBKQVZBRE9DX1NFUEFSQVRPUl9UQUdTW2ldOworCQkJaWYgKGxlbmd0aCA9PSB0YWcubGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGh0bWxUYWcsIHRhZywgZmFsc2UpKSB7CisJCQkJcmV0dXJuICh0YWdJZCB8IEpBVkFET0NfU0VQQVJBVE9SX1RBR1NfSUQpICsgaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gSkFWQURPQ19UQUdTX0lEX01BU0s7Cit9CisKKy8qCisgKiBQYXJzZSBhbiBIVE1MIHRhZyBleHBlY3RlZCB0byBiZSBlaXRoZXIgb3BlbmluZyAoZS5nLiA8dGFnX25hbWU+ICkgb3IKKyAqIGNsb3NpbmcgKGUuZy4gPC90YWdfbmFtZT4pLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUh0bWxUYWcoaW50IHByZXZpb3VzUG9zaXRpb24sIGludCBlbmRUZXh0UG9zaXRpb24pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWlmICghdGhpcy5wYXJzZUh0bWxUYWdzKSByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBjbG9zaW5nID0gZmFsc2U7CisgICAgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworICAgIGJvb2xlYW4gaW5jcmVtZW50ZWQgPSBmYWxzZTsKKyAgICBpbnQgc3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBzdGFydDsKKyAgICBpbnQgaHRtbFB0ciA9IHRoaXMuaHRtbFRhZ3NQdHI7CisgICAgY2hhciBmaXJzdENoYXIgPSBwZWVrQ2hhcigpOworICAgIGJvb2xlYW4gaGFzV2hpdGVzcGFjZXMgPSBmaXJzdENoYXIgPT0gJyAnIHx8IFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGZpcnN0Q2hhcik7CisJdHJ5IHsKKwkgICAgaW50IHRva2VuID0gcmVhZFRva2VuQW5kQ29uc3VtZSgpOworCSAgICBjaGFyW10gaHRtbFRhZzsKKwkgICAgaW50IGh0bWxJbmRleDsKKwkgICAgc3dpdGNoICh0b2tlbikgeworCSAgICAJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyOgorCSAgICAJCS8vIEhUTUwgdGFnIG9wZW5pbmcKKwkJCQlodG1sVGFnID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7CisJCQkJaHRtbEluZGV4ID0gZ2V0SHRtbFRhZ0luZGV4KGh0bWxUYWcpOworCQkJCWlmIChodG1sSW5kZXggPT0gSkFWQURPQ19UQUdTX0lEX01BU0spIHJldHVybiBmYWxzZTsKKwkJCQlpZiAoaHRtbFB0ciA+PSAwKSB7CisJCSAgICAJCWludCBsYXN0SHRtbFRhZ0luZGV4ID0gZ2V0SHRtbFRhZ0luZGV4KHRoaXMuaHRtbFRhZ3NbaHRtbFB0cl0pOworCQkJCQlpZiAoKGxhc3RIdG1sVGFnSW5kZXggJiBKQVZBRE9DX1RBR1NfSURfTUFTSykgPT0gSkFWQURPQ19JTU1VVEFCTEVfVEFHU19JRCkgeworCQkJCQkJLy8gRG8gbm90IGFjY2VwdCB0YWdzIGluc2lkZSBpbW11dGFibGUgdGFncyBleGNlcHQgdGhlIDxwcmU+IHRhZworCQkJCQkJaWYgKChodG1sSW5kZXggJiBKQVZBRE9DX1RBR1NfSURfTUFTSykgPT0gSkFWQURPQ19DT0RFX1RBR1NfSUQpIHsKKwkJCQkJCQlGb3JtYXRKYXZhZG9jQmxvY2sgcHJldmlvdXNCbG9jayA9IChGb3JtYXRKYXZhZG9jQmxvY2spIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQkJCQkJCUZvcm1hdEphdmFkb2NOb2RlIHBhcmVudE5vZGUgPSBwcmV2aW91c0Jsb2NrOworCQkJCQkJCUZvcm1hdEphdmFkb2NOb2RlIGxhc3ROb2RlID0gcGFyZW50Tm9kZTsKKwkJCQkJCQl3aGlsZSAobGFzdE5vZGUuZ2V0TGFzdE5vZGUoKSAhPSBudWxsKSB7CisJCQkJCQkJCXBhcmVudE5vZGUgPSBsYXN0Tm9kZTsKKwkJCQkJCQkJbGFzdE5vZGUgPSBsYXN0Tm9kZS5nZXRMYXN0Tm9kZSgpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAobGFzdE5vZGUuaXNUZXh0KCkpIHsKKwkJCQkJCQkJRm9ybWF0SmF2YWRvY1RleHQgdGV4dCA9IChGb3JtYXRKYXZhZG9jVGV4dCkgbGFzdE5vZGU7CisJCQkJCQkJCWlmICh0ZXh0LnNlcGFyYXRvcnNQdHIgPT0gLTEpIHsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkgICAgCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJICAgIAkJfQorCQkJCWlmICgoaHRtbEluZGV4ICYgSkFWQURPQ19UQUdTX0lEX01BU0spID4gSkFWQURPQ19TSU5HTEVfVEFHU19JRCkgeworCQkgICAgCQlpZiAodGhpcy5odG1sVGFnc1B0ciA9PSAtMSB8fCAhQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5odG1sVGFnc1t0aGlzLmh0bWxUYWdzUHRyXSwgaHRtbFRhZywgZmFsc2UpKSB7CisJCQkJCQlpZiAoKyt0aGlzLmh0bWxUYWdzUHRyID09IDApIHsgLy8gbGF6eSBpbml0aWFsaXphdGlvbgorCQkJCQkJCXRoaXMuaHRtbFRhZ3MgPSBuZXcgY2hhcltBU1RfU1RBQ0tfSU5DUkVNRU5UXVtdOworCQkJCQkJfSBlbHNlIHsgLy8gcmVzaXplIGlmIG5lZWRlZAorCQkJCQkJCWlmICh0aGlzLmh0bWxUYWdzUHRyID09IHRoaXMuaHRtbFRhZ3MubGVuZ3RoKSB7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5odG1sVGFncywgMCwgKHRoaXMuaHRtbFRhZ3MgPSBuZXcgY2hhclt0aGlzLmh0bWxUYWdzLmxlbmd0aCArIEFTVF9TVEFDS19JTkNSRU1FTlRdW10pLCAwLCB0aGlzLmh0bWxUYWdzUHRyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQl0aGlzLmh0bWxUYWdzW3RoaXMuaHRtbFRhZ3NQdHJdID0gaHRtbFRhZzsKKwkJCQkJCWluY3JlbWVudGVkID0gdHJ1ZTsKKwkJICAgIAkJfQorCQkJCX0KKwkJCQkvLyBBY2NlcHQgeGh0bWwgc3ludGF4CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQlpZiAocmVhZFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRElWSURFKSB7CisJCQkJCWNvbnN1bWVUb2tlbigpOworCQkJCX0KKwkJICAgIAlicmVhazsKKwkgICAgCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRElWSURFOgorCSAgICAJCS8vIEhUTUwgdGFnIGNsb3NpbmcKKwkgICAgCQlpZiAodGhpcy5odG1sVGFnc1B0ciA9PSAtMSkgcmV0dXJuIGZhbHNlOworCSAgICAJCWh0bWxUYWcgPSB0aGlzLmh0bWxUYWdzW3RoaXMuaHRtbFRhZ3NQdHJdOworCSAgICAJCWlmICgodG9rZW4gPSByZWFkVG9rZW5BbmRDb25zdW1lKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkgICAgCQkJLy8gbm90IGEgY2xvc2luZyBodG1sIHRhZworCSAgICAJCQlyZXR1cm4gZmFsc2U7CisJICAgIAkJfQorCQkJCWNoYXJbXSBpZGVudGlmaWVyID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7CisJCQkJaHRtbEluZGV4ID0gZ2V0SHRtbFRhZ0luZGV4KGlkZW50aWZpZXIpOworCQkJCWlmIChodG1sSW5kZXggPT0gSkFWQURPQ19UQUdTX0lEX01BU0spIHJldHVybiBmYWxzZTsKKwkJCQlpbnQgcHRyID0gdGhpcy5odG1sVGFnc1B0cjsKKwkgICAgCQl3aGlsZSAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGh0bWxUYWcsIGlkZW50aWZpZXIsIGZhbHNlKSkgeworCSAgICAJCQlpZiAodGhpcy5odG1sVGFnc1B0ciA8PSAwKSB7CisJICAgIAkJCQkvLyBjb25zaWRlciB0aGUgY2xvc2luZyB0YWcgYXMgaW52YWxpZAorCSAgICAJCQkJdGhpcy5odG1sVGFnc1B0ciA9IHB0cjsKKwkgICAgCQkJCXJldHVybiBmYWxzZTsKKwkgICAgCQkJfQorCSAgICAJCQl0aGlzLmh0bWxUYWdzUHRyLS07CisJCSAgICAJCWh0bWxUYWcgPSB0aGlzLmh0bWxUYWdzW3RoaXMuaHRtbFRhZ3NQdHJdOworCSAgICAJCX0KKwkJCQkvLyBzZXQgY2xvc2luZyBmbGFnCisJCQkJaHRtbEluZGV4IHw9IEpBVkFET0NfQ0xPU0VEX1RBRzsKKwkJCQljbG9zaW5nID0gdHJ1ZTsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCSAgICAJCWJyZWFrOworCSAgICAJZGVmYXVsdDoKKyAgICAJCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgICAgCisJICAgIC8vIExvb2tpbmcgZm9yIHRhZyBjbG9zaW5nCisJICAgIHN3aXRjaCAocmVhZFRva2VuQW5kQ29uc3VtZSgpKSB7CisJICAgIAljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1M6CisJICAgIAljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1NfRVFVQUw6CisJICAgIAkJLy8gY29uc2lkZXIgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgbWlzc2luZworCSAgICAJCXJldHVybiBmYWxzZTsKKwkgICAgCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUjoKKwkgICAgCQkvLyBzaW1wbGUgdGFnIHdpdGhvdXQgYXR0cmlidXRlcworCSAgICAJCWJyZWFrOworCSAgICAJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVHUkVBVEVSX0VRVUFMOgorCSAgICAJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSSUdIVF9TSElGVDoKKwkgICAgCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUw6CisJICAgIAkJLy8gc2ltcGxlIHRhZyB3aXRob3V0IGF0dHJpYnV0ZXMsIGJ1dCB0aGUgY2xvc2luZyAnPicgaXMgZm9sbG93ZWQgYnkgYW4gJz0nIG9yICc+JworCSAgICAJCWJyZWFrOworCSAgICAJZGVmYXVsdDoKKwkgICAgCQl0aGlzLmluZGV4ID0gY3VycmVudFBvc2l0aW9uOworCSAgICAJCWxvb3A6IHdoaWxlICh0cnVlKSB7CisvLwkgICAgCQkJY3VycmVudFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwkJCQkgICAgc3dpdGNoIChyZWFkQ2hhcigpKSB7CisJCQkJICAgIAljYXNlICc8JzoKKwkJCQkgICAgCQlpZiAoaGFzV2hpdGVzcGFjZXMpIHsKKwkJCQkgICAgCQkJLy8gbm90IDEwMCUgc3VyZSB0aGlzIGlzIGEgdGFnIGRlZmluaXRpb24gPT4gZ2l2ZSB1cAorCQkJCSAgICAJCQlyZXR1cm4gZmFsc2U7CisJCQkJICAgIAkJfQorCQkJCSAgICAJCS8vIG9wZW5pbmcgdGFnID0+IGNvbnNpZGVyIHRoZSBjdXJyZW50IG9uZSBhcyBjbG9zZWQKKwkJCQkgICAgCQl0aGlzLmluZGV4ID0gY3VycmVudFBvc2l0aW9uOworCQkJCSAgICAJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uOworCQkJCSAgICAJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247CisJCQkJICAgIAkJdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSAnPCc7CisJCQkJICAgIAkJYnJlYWsgbG9vcDsKKwkJCQkgICAgCWNhc2UgJz4nOgorCQkJCSAgICAJCS8vIHNpbXBsZSB0YWcgd2l0aG91dCBhdHRyaWJ1dGVzCisJCQkJICAgIAkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmluZGV4OworCQkJCSAgICAJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSB0aGlzLmluZGV4OworCQkJCSAgICAJCXRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gcGVla0NoYXIoKTsKKwkJCQkgICAgCQlicmVhayBsb29wOworCQkJICAgIAkJZGVmYXVsdDoKKwkJCSAgICAJCQlicmVhazsKKwkJCQkgICAgfQorCQkJCSAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLmphdmFkb2NUZXh0RW5kKSB7CisJCSAgICAJCQkvLyB0aGUgZW5kIG9mIHRoZSBjb21tZW50IGlzIHJlYWNoZWQgPT4gY29uc2lkZXIgY3VycmVudCB0YWcgYXMgY2xvc2VkCisJCQkgICAgCQl0aGlzLmluZGV4ID0gY3VycmVudFBvc2l0aW9uOworCQkJICAgIAkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247CisJCQkgICAgCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uOworCQkJICAgIAkJYnJlYWs7CisJCQkJICAgIH0KKwkgICAgCQl9CisJCX0KKworCSAgICAvLyBQdXNoIHRleHRzCisJCWlmICh0aGlzLmxpbmVTdGFydGVkICYmIHRoaXMudGV4dFN0YXJ0ICE9IC0xICYmIHRoaXMudGV4dFN0YXJ0IDwgZW5kVGV4dFBvc2l0aW9uKSB7CisJCQlwdXNoVGV4dCh0aGlzLnRleHRTdGFydCwgZW5kVGV4dFBvc2l0aW9uLCAtMSwgaHRtbFB0cik7CisJCX0KKwkJcHVzaFRleHQocHJldmlvdXNQb3NpdGlvbiwgdGhpcy5pbmRleCwgaHRtbEluZGV4LCB0aGlzLmh0bWxUYWdzUHRyKTsKKwkJdGhpcy50ZXh0U3RhcnQgPSAtMTsKKwkJdmFsaWQgPSB0cnVlOworCX0KKwlmaW5hbGx5IHsKKwkJaWYgKHZhbGlkKSB7CisJCQlpZiAoY2xvc2luZykgeworCQkJCXRoaXMuaHRtbFRhZ3NQdHItLTsKKwkJCX0KKwkJfSBlbHNlIGlmICghdGhpcy5hYm9ydCkgeworCSAgICAJaWYgKGluY3JlbWVudGVkKSB7CisJICAgIAkJdGhpcy5odG1sVGFnc1B0ci0tOworCSAgICAJCWlmICh0aGlzLmh0bWxUYWdzUHRyID09IC0xKSB0aGlzLmh0bWxUYWdzID0gbnVsbDsKKwkgICAgCX0KKwkgICAgCXRoaXMuc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24tMSk7CisJICAgIAl0aGlzLmluZGV4ID0gc3RhcnQ7CisJCX0KKwl9CisgICAgcmV0dXJuIHZhbGlkOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuQWJzdHJhY3RDb21tZW50UGFyc2VyI3BhcnNlSWRlbnRpZmllclRhZyhib29sZWFuKQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUlkZW50aWZpZXJUYWcoYm9vbGVhbiByZXBvcnQpIHsKKwlpZiAoc3VwZXIucGFyc2VJZGVudGlmaWVyVGFnKHJlcG9ydCkpIHsKKwkJY3JlYXRlVGFnKCk7CisJCXRoaXMuaW5kZXggPSB0aGlzLnRhZ1NvdXJjZUVuZCsxOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLmluZGV4LCB0aGlzLmphdmFkb2NFbmQpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJdGhpcy50YWdWYWx1ZSA9IFRBR19PVEhFUlNfVkFMVUU7IC8vIHRhZyBpcyBpbnZhbGlkLCBkbyBub3Qga2VlcCB0aGUgcGFyc2VkIHRhZyB2YWx1ZQorCXJldHVybiBmYWxzZTsKK30KKworLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLkphdmFkb2NQYXJzZXIjcGFyc2VQYXJhbSgpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHBhcnNlUGFyYW0oKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlib29sZWFuIHZhbGlkID0gc3VwZXIucGFyc2VQYXJhbSgpOworCWlmICghdmFsaWQpIHsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy50YWdTb3VyY2VFbmQrMSwgdGhpcy5qYXZhZG9jRW5kKTsKKwkJdGhpcy5pbmRleCA9IHRoaXMudGFnU291cmNlRW5kKzE7CisJCWNoYXIgY2ggPSBwZWVrQ2hhcigpOworCQkvLyBUcnkgdG8gcHVzaCBhbiBpZGVudGlmaWVyIGluIHRoZSBzdGFjaywgb3RoZXJ3aXNlIHJlc3RhcnQgZnJvbSB0aGUgZW5kIHRhZyBwb3NpdGlvbgorCQlpZiAoY2ggPT0gJyAnIHx8IFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCQkJaW50IHRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCQljaCA9IHBlZWtDaGFyKCk7CisJCQkJaWYgKGNoID09ICcgJyB8fCBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQkJcHVzaElkZW50aWZpZXIodHJ1ZSwgZmFsc2UpOworCQkJCQlwdXNoUGFyYW1OYW1lKGZhbHNlKTsKKwkJCQkJdGhpcy5pbmRleCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCXZhbGlkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLnRhZ1NvdXJjZUVuZCsxLCB0aGlzLmphdmFkb2NFbmQpOworCQl9CisJCXRoaXMudGFnVmFsdWUgPSBUQUdfT1RIRVJTX1ZBTFVFOyAvLyB0YWcgaXMgaW52YWxpZCwgZG8gbm90IGtlZXAgdGhlIHBhcnNlZCB0YWcgdmFsdWUKKwl9CisJcmV0dXJuIHZhbGlkOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuQWJzdHJhY3RDb21tZW50UGFyc2VyI3BhcnNlUmVmZXJlbmNlKCkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VSZWZlcmVuY2UoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlib29sZWFuIHZhbGlkID0gc3VwZXIucGFyc2VSZWZlcmVuY2UoKTsKKwlpZiAoIXZhbGlkKSB7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMudGFnU291cmNlRW5kKzEsIHRoaXMuamF2YWRvY0VuZCk7CisJCXRoaXMuaW5kZXggPSB0aGlzLnRhZ1NvdXJjZUVuZCsxOworCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX09USEVSU19WQUxVRTsgLy8gdGFnIGlzIGludmFsaWQsIGRvIG5vdCBrZWVwIHRoZSBwYXJzZWQgdGFnIHZhbHVlCisJfQorCXJldHVybiB2YWxpZDsKK30KKworLyoKKyAqIFBhcnNlIEByZXR1cm4gdGFnIGRlY2xhcmF0aW9uCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHBhcnNlUmV0dXJuKCkgeworCWNyZWF0ZVRhZygpOworCXJldHVybiB0cnVlOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNwYXJzZVRhZyhpbnQpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHBhcnNlVGFnKGludCBwcmV2aW91c1Bvc2l0aW9uKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKworCS8vIERvIG5vdCBwYXJzZSBqYXZhZG9jIHRhZyBpbnNpZGUgPHByZT4uLi48L3ByZT4gdGFncworCWlmICh0aGlzLmh0bWxUYWdzUHRyID49IDApIHsKKwkJaW50IHB0ciA9IHRoaXMuaHRtbFRhZ3NQdHI7CisgICAJCXdoaWxlIChwdHIgPj0gMCkgeworCQkJaWYgKGdldEh0bWxUYWdJbmRleCh0aGlzLmh0bWxUYWdzW3B0ci0tXSkgPT0gSkFWQURPQ19DT0RFX1RBR1NfSUQpIHsKKwkJCQlpZiAodGhpcy50ZXh0U3RhcnQgPT0gLTEpIHRoaXMudGV4dFN0YXJ0ID0gdGhpcy5pbmxpbmVUYWdTdGFydGVkID8gdGhpcy5pbmxpbmVUYWdTdGFydCA6IHByZXZpb3VzUG9zaXRpb247CisJCQkJdGhpcy5pbmxpbmVUYWdTdGFydGVkID0gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisKKwkvLyBSZWFkIHRhZyBuYW1lCisJaW50IHB0ciA9IHRoaXMuYXN0UHRyOworCXRoaXMudGFnU291cmNlU3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gdGhpcy5pbmRleDsKKwl0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9IHJlYWRDaGFyKCk7CisJc3dpdGNoICh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlcikgeworCQljYXNlICcgJzoKKwkJY2FzZSAnKic6CisJCWNhc2UgJ30nOgorCQkJLy8gdGFnIG5hbWUgaXMgZW1wdHkKKwkJCXRoaXMudGFnU291cmNlRW5kID0gcHJldmlvdXNQb3NpdGlvbjsKKwkJCWlmICh0aGlzLnRleHRTdGFydCA9PSAtMSkgdGhpcy50ZXh0U3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJcmV0dXJuIHRydWU7CisJCWRlZmF1bHQ6CisJCQlpZiAoU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJLy8gdGFnIG5hbWUgaXMgZW1wdHkKKwkJCQl0aGlzLnRhZ1NvdXJjZUVuZCA9IHByZXZpb3VzUG9zaXRpb247CisJCQkJaWYgKHRoaXMudGV4dFN0YXJ0ID09IC0xKSB0aGlzLnRleHRTdGFydCA9IHByZXZpb3VzUG9zaXRpb247CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlicmVhazsKKwl9CisJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CisJY2hhciBjdXJyZW50Q2hhciA9IHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyOworCXdoaWxlIChjdXJyZW50Q2hhciAhPSAnICcgJiYgY3VycmVudENoYXIgIT0gJyonICYmIGN1cnJlbnRDaGFyICE9ICd9JyAmJiAhU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXIpKSB7CisJCWN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuaW5kZXg7CisJCWN1cnJlbnRDaGFyID0gcmVhZENoYXIoKTsKKwl9CisJdGhpcy50YWdTb3VyY2VFbmQgPSBjdXJyZW50UG9zaXRpb24gLSAxOworCXRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gY3VycmVudENoYXI7CisJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwljaGFyW10gdGFnTmFtZSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOworCWludCBsZW5ndGggPSB0YWdOYW1lLmxlbmd0aDsKKwl0aGlzLmluZGV4ID0gdGhpcy50YWdTb3VyY2VFbmQrMTsKKworCS8vIERlY2lkZSB3aGljaCBwYXJzZSB0byBwZXJmb3JtIGRlcGVuZGluZyBvbiB0YWcgbmFtZQorCXRoaXMudGFnVmFsdWUgPSBUQUdfT1RIRVJTX1ZBTFVFOworCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKwlzd2l0Y2ggKHRhZ05hbWVbMF0pIHsKKwkJY2FzZSAnYSc6CisJCQlpZiAobGVuZ3RoID09IFRBR19BVVRIT1JfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19BVVRIT1IsIHRhZ05hbWUpKSB7CisJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19BVVRIT1JfVkFMVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlpZiAobGVuZ3RoID09IFRBR19DQVRFR09SWV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0NBVEVHT1JZLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfQ0FURUdPUllfVkFMVUU7CisJCQkJdmFsaWQgPSBwYXJzZUlkZW50aWZpZXJUYWcoZmFsc2UpOyAvLyBUT0RPIChmcmVkZXJpYykgcmVjb25zaWRlciBwYXJhbWV0ZXIgdmFsdWUgd2hlbiBAY2F0ZWdvcnkgd2lsbCBiZSBzaWduaWZpY2FudCBpbiBzcGVjCisJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSBUQUdfQ09ERV9MRU5HVEggJiYgdGhpcy5pbmxpbmVUYWdTdGFydGVkICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19DT0RFLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfQ09ERV9WQUxVRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlmIChsZW5ndGggPT0gVEFHX0RFUFJFQ0FURURfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19ERVBSRUNBVEVELCB0YWdOYW1lKSkgeworCQkJCXRoaXMuZGVwcmVjYXRlZCA9IHRydWU7CisJCQkJdmFsaWQgPSB0cnVlOworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfREVQUkVDQVRFRF9WQUxVRTsKKwkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19ET0NfUk9PVF9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0RPQ19ST09ULCB0YWdOYW1lKSkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc3MzAKKwkJCQkvLyBpZGVudGlmeSBAZG9jUm9vdCB0YWcgYXMgYSBiYXNlIHRhZyB0aGF0IGRvZXMgbm90IGV4cGVjdCBhbnkgYXJndW1lbnQKKwkJCQl2YWxpZCA9IHRydWU7CisJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19ET0NfUk9PVF9WQUxVRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWlmIChsZW5ndGggPT0gVEFHX0VYQ0VQVElPTl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0VYQ0VQVElPTiwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0VYQ0VQVElPTl9WQUxVRTsKKwkJCQl2YWxpZCA9IHBhcnNlVGhyb3dzKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpZiAobGVuZ3RoID09IFRBR19JTkhFUklURE9DX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfSU5IRVJJVERPQywgdGFnTmFtZSkpIHsKKwkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgeworCQkJCQlyZWNvcmRJbmhlcml0ZWRQb3NpdGlvbigoKChsb25nKSB0aGlzLnRhZ1NvdXJjZVN0YXJ0KSA8PCAzMikgKyB0aGlzLnRhZ1NvdXJjZUVuZCk7CisJCQkJfQorCQkJCXZhbGlkID0gdHJ1ZTsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0lOSEVSSVRET0NfVkFMVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlpZiAobGVuZ3RoID09IFRBR19MSU5LX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfTElOSywgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0xJTktfVkFMVUU7CisJCQkJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCB8fCAodGhpcy5raW5kICYgQ09NUExFVElPTl9QQVJTRVIpICE9IDApIHsKKwkJCQkJdmFsaWQgPSBwYXJzZVJlZmVyZW5jZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMyOTAKKwkJCQkJLy8gQ2Fubm90IGhhdmUgQGxpbmsgb3V0c2lkZSBpbmxpbmUgY29tbWVudAorCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgeworCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX0xJTktQTEFJTl9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX0xJTktQTEFJTiwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0xJTktQTEFJTl9WQUxVRTsKKwkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCXZhbGlkID0gcGFyc2VSZWZlcmVuY2UoKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQlpZiAodGhpcy5yZXBvcnRQcm9ibGVtcykgeworCQkJCQkJdGhpcy5zb3VyY2VQYXJzZXIucHJvYmxlbVJlcG9ydGVyKCkuamF2YWRvY1VuZXhwZWN0ZWRUYWcodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX0xJVEVSQUxfTEVOR1RIICYmIHRoaXMuaW5saW5lVGFnU3RhcnRlZCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfTElURVJBTCwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX0xJVEVSQUxfVkFMVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpZiAobGVuZ3RoID09IFRBR19QQVJBTV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1BBUkFNLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfUEFSQU1fVkFMVUU7CisJCQkJdmFsaWQgPSBwYXJzZVBhcmFtKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlpZiAobGVuZ3RoID09IFRBR19TRUVfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19TRUUsIHRhZ05hbWUpKSB7CisJCQkJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQkJCQkvLyBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMjkwCisJCQkJCS8vIENhbm5vdCBoYXZlIEBzZWUgaW5zaWRlIGlubGluZSBjb21tZW50CisJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCWlmICh0aGlzLnJlcG9ydFByb2JsZW1zKSB7CisJCQkJCQl0aGlzLnNvdXJjZVBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5qYXZhZG9jVW5leHBlY3RlZFRhZyh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFRV9WQUxVRTsKKwkJCQkJdmFsaWQgPSBwYXJzZVJlZmVyZW5jZSgpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19TRVJJQUxfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19TRVJJQUwsIHRhZ05hbWUpKSB7CisJCQkJdGhpcy50YWdWYWx1ZSA9IFRBR19TRVJJQUxfVkFMVUU7CisJCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSBUQUdfU0VSSUFMX0RBVEFfTEVOR1RIICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFRBR19TRVJJQUxfREFUQSwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFUklBTF9EQVRBX1ZBTFVFOworCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gVEFHX1NFUklBTF9GSUVMRF9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1NFUklBTF9GSUVMRCwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1NFUklBTF9GSUVMRF9WQUxVRTsKKwkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19TSU5DRV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1NJTkNFLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfU0lOQ0VfVkFMVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAobGVuZ3RoID09IFRBR19WQUxVRV9MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1ZBTFVFLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfVkFMVUVfVkFMVUU7CisJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQkJCQl2YWxpZCA9IHBhcnNlUmVmZXJlbmNlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQkJaWYgKHRoaXMucmVwb3J0UHJvYmxlbXMpIHRoaXMuc291cmNlUGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLmphdmFkb2NVbmV4cGVjdGVkVGFnKHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAobGVuZ3RoID09IFRBR19WRVJTSU9OX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfVkVSU0lPTiwgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1ZFUlNJT05fVkFMVUU7CisJCQl9IGVsc2UgeworCQkJCWNyZWF0ZVRhZygpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaWYgKGxlbmd0aCA9PSBUQUdfUkVUVVJOX0xFTkdUSCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUQUdfUkVUVVJOLCB0YWdOYW1lKSkgeworCQkJCXRoaXMudGFnVmFsdWUgPSBUQUdfUkVUVVJOX1ZBTFVFOworCQkJCXZhbGlkID0gcGFyc2VSZXR1cm4oKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmIChsZW5ndGggPT0gVEFHX1RIUk9XU19MRU5HVEggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoVEFHX1RIUk9XUywgdGFnTmFtZSkpIHsKKwkJCQl0aGlzLnRhZ1ZhbHVlID0gVEFHX1RIUk9XU19WQUxVRTsKKwkJCQl2YWxpZCA9IHBhcnNlVGhyb3dzKCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNyZWF0ZVRhZygpOworCQkJYnJlYWs7CisJfQorCWNvbnN1bWVUb2tlbigpOworCXRoaXMudGV4dFN0YXJ0ID0gLTE7CisKKwkvLyB0aGUgamF2YWRvYyBwYXJzZXIgbWF5IG5vdCBjcmVhdGUgdGFnIGZvciBzb21lIHZhbGlkIHRhZ3M6IGZvcmNlIHRhZyBjcmVhdGlvbiBmb3Igc3VjaCB0YWcuCisJaWYgKHZhbGlkKSB7CisJCXN3aXRjaCAodGhpcy50YWdWYWx1ZSkgeworCQkJY2FzZSBUQUdfSU5IRVJJVERPQ19WQUxVRToKKwkJCWNhc2UgVEFHX0RFUFJFQ0FURURfVkFMVUU6CisJCQkJY3JlYXRlVGFnKCk7CisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHRoaXMuaW52YWxpZFRhZ05hbWUpIHsKKwkJdGhpcy50ZXh0U3RhcnQgPSBwcmV2aW91c1Bvc2l0aW9uOworCX0gZWxzZSBpZiAodGhpcy5hc3RQdHIgPT0gcHRyKSB7CisJCWNyZWF0ZVRhZygpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLkphdmFkb2NQYXJzZXIjcGFyc2VUaHJvd3MoKQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVRocm93cygpIHsKKwlib29sZWFuIHZhbGlkID0gc3VwZXIucGFyc2VUaHJvd3MoKTsKKwlpZiAoIXZhbGlkKSB7CisJCS8vIElmIGludmFsaWQsIHJlc3RhcnQgZnJvbSB0aGUgZW5kIHRhZyBwb3NpdGlvbgorCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLnRhZ1NvdXJjZUVuZCsxLCB0aGlzLmphdmFkb2NFbmQpOworCQl0aGlzLmluZGV4ID0gdGhpcy50YWdTb3VyY2VFbmQrMTsKKwkJdGhpcy50YWdWYWx1ZSA9IFRBR19PVEhFUlNfVkFMVUU7IC8vIHRhZyBpcyBpbnZhbGlkLCBkbyBub3Qga2VlcCB0aGUgcGFyc2VkIHRhZyB2YWx1ZQorCX0KKwlyZXR1cm4gdmFsaWQ7Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5KYXZhZG9jUGFyc2VyI3B1c2hQYXJhbU5hbWUoYm9vbGVhbikKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcHVzaFBhcmFtTmFtZShib29sZWFuIGlzVHlwZVBhcmFtKSB7CisJaW50IGxpbmVUYWdTdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHRoaXMudGFnU291cmNlU3RhcnQpOworCUZvcm1hdEphdmFkb2NCbG9jayBibG9jayA9IG5ldyBGb3JtYXRKYXZhZG9jQmxvY2sodGhpcy50YWdTb3VyY2VTdGFydCwgdGhpcy50YWdTb3VyY2VFbmQsIGxpbmVUYWdTdGFydCwgVEFHX1BBUkFNX1ZBTFVFKTsKKwlpbnQgc3RhcnQgPSAoaW50KSAodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1swXSA+Pj4gMzIpOworCWludCBsaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0TGluZU51bWJlcihzdGFydCk7CisJRm9ybWF0SmF2YWRvY1JlZmVyZW5jZSByZWZlcmVuY2U7CisJcmVmZXJlbmNlID0gbmV3IEZvcm1hdEphdmFkb2NSZWZlcmVuY2Uoc3RhcnQsIChpbnQpIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaXNUeXBlUGFyYW0gPyAyIDogMF0sIGxpbmVTdGFydCk7CisJYmxvY2sucmVmZXJlbmNlID0gcmVmZXJlbmNlOworCWJsb2NrLnNvdXJjZUVuZCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQ7CisJcHVzaE9uQXN0U3RhY2soYmxvY2ssIHRydWUpOworCXJldHVybiB0cnVlOworfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNwdXNoU2VlUmVmKGphdmEubGFuZy5PYmplY3QpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHB1c2hTZWVSZWYoT2JqZWN0IHN0YXRlbWVudCkgeworCUZvcm1hdEphdmFkb2NSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEZvcm1hdEphdmFkb2NSZWZlcmVuY2UpIHN0YXRlbWVudDsKKwlpbnQgbGluZVRhZ1N0YXJ0ID0gdGhpcy5zY2FubmVyLmdldExpbmVOdW1iZXIodGhpcy50YWdTb3VyY2VTdGFydCk7CisJRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrID0gbmV3IEZvcm1hdEphdmFkb2NCbG9jayh0aGlzLnRhZ1NvdXJjZVN0YXJ0LCB0aGlzLnRhZ1NvdXJjZUVuZCwgbGluZVRhZ1N0YXJ0LCB0aGlzLnRhZ1ZhbHVlKTsKKwlibG9jay5yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJYmxvY2suc291cmNlRW5kID0gcmVmZXJlbmNlLnNvdXJjZUVuZDsKKwlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbmxpbmVUYWdTdGFydDsKKwkJRm9ybWF0SmF2YWRvY0Jsb2NrIHByZXZpb3VzQmxvY2sgPSBudWxsOworCQlpZiAodGhpcy5hc3RQdHIgPT0gLTEpIHsKKwkJCWludCBsaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0TGluZU51bWJlcih0aGlzLmlubGluZVRhZ1N0YXJ0KTsKKwkJCXByZXZpb3VzQmxvY2sgPSBuZXcgRm9ybWF0SmF2YWRvY0Jsb2NrKHRoaXMuaW5saW5lVGFnU3RhcnQsIHRoaXMudGFnU291cmNlRW5kLCBsaW5lU3RhcnQsIE5PX1RBR19WQUxVRSk7CisJCQlwcmV2aW91c0Jsb2NrLnNvdXJjZUVuZCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQ7CisJCQlwdXNoT25Bc3RTdGFjayhwcmV2aW91c0Jsb2NrLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXByZXZpb3VzQmxvY2sgPSAoRm9ybWF0SmF2YWRvY0Jsb2NrKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJfQorCQlwcmV2aW91c0Jsb2NrLmFkZEJsb2NrKGJsb2NrLCB0aGlzLmh0bWxUYWdzUHRyID09IC0xID8gMCA6IHRoaXMuaHRtbFRhZ3NQdHIpOworCQlibG9jay5mbGFncyB8PSBGb3JtYXRKYXZhZG9jQmxvY2suSU5MSU5FRDsKKwl9IGVsc2UgeworCQlwdXNoT25Bc3RTdGFjayhibG9jaywgdHJ1ZSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjcHVzaFRleHQoaW50LCBpbnQpCisgKi8KK3Byb3RlY3RlZCB2b2lkIHB1c2hUZXh0KGludCBzdGFydCwgaW50IGVuZCkgeworCXB1c2hUZXh0KHN0YXJ0LCBlbmQsIC0xLCB0aGlzLmh0bWxUYWdzUHRyID09IC0xID8gMCA6IHRoaXMuaHRtbFRhZ3NQdHIpOworfQorCitwcml2YXRlIHZvaWQgcHVzaFRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgaHRtbEluZGV4LCBpbnQgaHRtbERlcHRoKSB7CisKKwkvLyBTZWFyY2ggcHJldmlvdXMgdGFnIG9uIHdoaWNoIHRvIGFkZCB0aGUgdGV4dCBlbGVtZW50CisJRm9ybWF0SmF2YWRvY0Jsb2NrIHByZXZpb3VzQmxvY2sgPSBudWxsOworCWludCBwcmV2aW91c1N0YXJ0ID0gc3RhcnQ7CisJaW50IGxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHN0YXJ0KTsKKwlpZiAodGhpcy5hc3RQdHIgPT0gLTEpIHsKKwkJcHJldmlvdXNCbG9jayA9IG5ldyBGb3JtYXRKYXZhZG9jQmxvY2soc3RhcnQsIHN0YXJ0LCBsaW5lU3RhcnQsIE5PX1RBR19WQUxVRSk7CisJCXB1c2hPbkFzdFN0YWNrKHByZXZpb3VzQmxvY2ssIHRydWUpOworCX0gZWxzZSB7CisJCXByZXZpb3VzQmxvY2sgPSAoRm9ybWF0SmF2YWRvY0Jsb2NrKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJcHJldmlvdXNTdGFydCA9IHByZXZpb3VzQmxvY2suc291cmNlU3RhcnQ7CisJfQorCisJLy8gSWYgd2UncmUgaW4gYSBpbmxpbmUgdGFnLCB0aGVuIHJldHJpZXZlIHByZXZpb3VzIHRhZyBpbiBpdHMgZnJhZ21lbnRzCisJaWYgKHRoaXMuaW5saW5lVGFnU3RhcnRlZCkgeworCQlpZiAocHJldmlvdXNCbG9jay5ub2RlcyA9PSBudWxsKSB7CisJCQkvLyBubyBleGlzdGluZyBmcmFnbWVudCA9PiBqdXN0IGFkZCB0aGUgZWxlbWVudAorCQl9IGVsc2UgeworCQkJLy8gSWYgbGFzdCBmcmFnbWVudCBpcyBhIHRhZywgdGhlbiB1c2UgaXQgYXMgcHJldmlvdXMgdGFnCisJCQlGb3JtYXRKYXZhZG9jTm9kZSBsYXN0Tm9kZSA9IHByZXZpb3VzQmxvY2subm9kZXNbcHJldmlvdXNCbG9jay5ub2Rlc1B0cl07CisJCQl3aGlsZSAobGFzdE5vZGUgIT0gbnVsbCAmJiBsYXN0Tm9kZS5pc1RleHQoKSkgeworCQkJCWxhc3ROb2RlID0gbGFzdE5vZGUuZ2V0TGFzdE5vZGUoKTsKKwkJCX0KKwkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7CisJCQkJcHJldmlvdXNCbG9jayA9IChGb3JtYXRKYXZhZG9jQmxvY2spIGxhc3ROb2RlOworCQkJCXByZXZpb3VzU3RhcnQgPSBwcmV2aW91c0Jsb2NrLnNvdXJjZVN0YXJ0OworCQkJfQorCQl9CisJfQorCisJLy8gQWRkIHRoZSB0ZXh0CisJRm9ybWF0SmF2YWRvY1RleHQgdGV4dCA9IG5ldyBGb3JtYXRKYXZhZG9jVGV4dChzdGFydCwgZW5kLTEsIGxpbmVTdGFydCwgaHRtbEluZGV4LCBodG1sRGVwdGg9PS0xID8gMCA6IGh0bWxEZXB0aCk7CisJcHJldmlvdXNCbG9jay5hZGRUZXh0KHRleHQpOworCXByZXZpb3VzQmxvY2suc291cmNlU3RhcnQgPSBwcmV2aW91c1N0YXJ0OworCWlmIChsaW5lU3RhcnQgPT0gcHJldmlvdXNCbG9jay5saW5lU3RhcnQpIHsKKwkJcHJldmlvdXNCbG9jay5mbGFncyB8PSBGb3JtYXRKYXZhZG9jQmxvY2suVEVYVF9PTl9UQUdfTElORTsKKwl9CisJdGhpcy50ZXh0U3RhcnQgPSAtMTsKK30KKworLyoKKyAqIChub24tSmF2YWRvYykKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuQWJzdHJhY3RDb21tZW50UGFyc2VyI3B1c2hUaHJvd05hbWUoamF2YS5sYW5nLk9iamVjdCkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcHVzaFRocm93TmFtZShPYmplY3QgdHlwZVJlZikgeworCWludCBsaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuZ2V0TGluZU51bWJlcih0aGlzLnRhZ1NvdXJjZVN0YXJ0KTsKKwlGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2sgPSBuZXcgRm9ybWF0SmF2YWRvY0Jsb2NrKHRoaXMudGFnU291cmNlU3RhcnQsIHRoaXMudGFnU291cmNlRW5kLCBsaW5lU3RhcnQsIHRoaXMudGFnVmFsdWUpOworCWJsb2NrLnJlZmVyZW5jZSA9IChGb3JtYXRKYXZhZG9jUmVmZXJlbmNlKSB0eXBlUmVmOworCWJsb2NrLnNvdXJjZUVuZCA9IGJsb2NrLnJlZmVyZW5jZS5zb3VyY2VFbmQ7CisJcHVzaE9uQXN0U3RhY2soYmxvY2ssIHRydWUpOworCXJldHVybiB0cnVlOworfQorCisvKgorICogKG5vbi1KYXZhZG9jKQorICogV2lsbCB1cGRhdGUgdGhlIGlubGluZSB0YWcgcG9zaXRpb24gKGVuZCBwb3NpdGlvbikgb25jZSB0YWcgd2FzIGZ1bGx5IHBhcnNlZC4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5BYnN0cmFjdENvbW1lbnRQYXJzZXIjcmVmcmVzaElubGluZVRhZ1Bvc2l0aW9uKGludCkKKyAqLworcHJvdGVjdGVkIHZvaWQgcmVmcmVzaElubGluZVRhZ1Bvc2l0aW9uKGludCBwcmV2aW91c1Bvc2l0aW9uKSB7CisJaWYgKHRoaXMuYXN0UHRyICE9IC0xKSB7CisJCUZvcm1hdEphdmFkb2NOb2RlIHByZXZpb3VzQmxvY2sgPSAoRm9ybWF0SmF2YWRvY05vZGUpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQlpZiAodGhpcy5pbmxpbmVUYWdTdGFydGVkKSB7CisJCQlGb3JtYXRKYXZhZG9jTm9kZSBsYXN0Tm9kZSA9IHByZXZpb3VzQmxvY2s7CisJCQl3aGlsZSAobGFzdE5vZGUgIT0gbnVsbCkgeworCQkJCWxhc3ROb2RlLnNvdXJjZUVuZCA9IHByZXZpb3VzUG9zaXRpb247CisJCQkJbGFzdE5vZGUgPSBsYXN0Tm9kZS5nZXRMYXN0Tm9kZSgpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogU3RvcmUgdGhlIGh0bWwgdGFncyBsZXZlbCB3aGVuIGVudGVyaW5nIGFuIGlubGluZSB0YWcgaW4gY2FzZSBhIHdyb25nIHNlcXVlbmNlCisgKiBvZiBvcGVuaW5nL2Nsb3NpbmcgdGFncyBpcyBkZWZpbmVkIGluc2lkZSBpdC4gVGhlbiwgd2hlbiBsZWF2aW5nIHRoZSBpbmxpbmUgdGFnCisgKiB0aGUgbGV2ZWwgaXMgcmVzZXQgdG8gdGhlIGVudGVyaW5nIHZhbHVlIGFuZCBhdm9pZCB0byB3cm9uZ2x5IGF0dGFjaCBzdWJzZXF1ZW50CisgKiBodG1sIHRhZ3MgdG8gbm9kZSBpbnNpZGUgdGhlIGlubGluZSB0YWcgbGFzdCBub2RlLi4uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldElubGluZVRhZ1N0YXJ0ZWQoYm9vbGVhbiBzdGFydGVkKSB7CisJc3VwZXIuc2V0SW5saW5lVGFnU3RhcnRlZChzdGFydGVkKTsKKwlpZiAoc3RhcnRlZCkgeworCQl0aGlzLmlubGluZUh0bWxUYWdzUHRyID0gdGhpcy5odG1sVGFnc1B0cjsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5odG1sVGFnc1B0ciA+IHRoaXMuaW5saW5lSHRtbFRhZ3NQdHIpIHsKKwkJCXRoaXMuaHRtbFRhZ3NQdHIgPSB0aGlzLmlubGluZUh0bWxUYWdzUHRyOworCQl9CisJfQorfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmZmVyLmFwcGVuZCgiRm9ybWF0dGVyQ29tbWVudFBhcnNlclxuIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworcHVibGljIFN0cmluZyB0b0RlYnVnU3RyaW5nKCkgeworCWlmICh0aGlzLmRvY0NvbW1lbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gIk5vIGphdmFkb2MhIjsJLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gKChGb3JtYXRKYXZhZG9jKXRoaXMuZG9jQ29tbWVudCkudG9EZWJ1Z1N0cmluZyh0aGlzLnNvdXJjZSk7Cit9CisKKy8qCisgKiBBZGQgc3RvcmVkIHRhZyBlbGVtZW50cyB0byBhc3NvY2lhdGVkIGNvbW1lbnQuCisgKiBDbGVhbiBhbGwgYmxvY2tzIChpLmUuIHJlc2l6ZSBhcnJheXMgdG8gYXZvaWQgbnVsbCBzbG90cykKKyAqIFNldCBleHRyYSBpbmZvcm1hdGlvbiBvbiBibG9jayBhYm91dCBsaW5lIHJlbGF0aXZlIHBvc2l0aW9ucy4KKyAqLworcHJvdGVjdGVkIHZvaWQgdXBkYXRlRG9jQ29tbWVudCgpIHsKKwlpbnQgbGVuZ3RoID0gdGhpcy5hc3RQdHIgKyAxOworCUZvcm1hdEphdmFkb2MgZm9ybWF0SmF2YWRvYyA9IG5ldyBGb3JtYXRKYXZhZG9jKHRoaXMuamF2YWRvY1N0YXJ0LCB0aGlzLmphdmFkb2NFbmQsIGxlbmd0aCk7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJZm9ybWF0SmF2YWRvYy5ibG9ja3MgPSBuZXcgRm9ybWF0SmF2YWRvY0Jsb2NrW2xlbmd0aF07CisJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQkJRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrID0gKEZvcm1hdEphdmFkb2NCbG9jaykgdGhpcy5hc3RTdGFja1tpXTsKKwkJCWJsb2NrLmNsZWFuKCk7CisJCQlibG9jay51cGRhdGUodGhpcy5zY2FubmVyKTsKKwkJCWZvcm1hdEphdmFkb2MuYmxvY2tzW2ldID0gYmxvY2s7CisJCQlpZiAoaT09IDApIHsKKwkJCQlibG9jay5mbGFncyB8PSBGb3JtYXRKYXZhZG9jQmxvY2suRklSU1Q7CisJCQl9CisJCX0KKwl9CisJZm9ybWF0SmF2YWRvYy50ZXh0U3RhcnQgPSB0aGlzLmphdmFkb2NUZXh0U3RhcnQ7CisJZm9ybWF0SmF2YWRvYy50ZXh0RW5kID0gdGhpcy5qYXZhZG9jVGV4dEVuZDsKKwlmb3JtYXRKYXZhZG9jLmxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHRoaXMuamF2YWRvY1RleHRTdGFydCk7CisJZm9ybWF0SmF2YWRvYy5saW5lRW5kID0gdGhpcy5zY2FubmVyLmdldExpbmVOdW1iZXIodGhpcy5qYXZhZG9jVGV4dEVuZCk7CisJRm9ybWF0SmF2YWRvY0Jsb2NrIGZpcnN0QmxvY2sgPSBmb3JtYXRKYXZhZG9jLmdldEZpcnN0QmxvY2soKTsKKwlpZiAoZmlyc3RCbG9jayAhPSBudWxsKSB7CisJCWZpcnN0QmxvY2suc2V0SGVhZGVyTGluZShmb3JtYXRKYXZhZG9jLmxpbmVTdGFydCk7CisJfQorCXRoaXMuZG9jQ29tbWVudCA9IGZvcm1hdEphdmFkb2M7CisJaWYgKERlZmF1bHRDb2RlRm9ybWF0dGVyLkRFQlVHKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0b0RlYnVnU3RyaW5nKCkpOworCX0KK30KKworLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLkFic3RyYWN0Q29tbWVudFBhcnNlciN2ZXJpZnlFbmRMaW5lKGludCkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RW5kTGluZShpbnQgdGV4dFBvc2l0aW9uKSB7CisJLy8gZG8gbm90IHZlcmlmeSBhbnl0aGluZyBhdCBlbmQgb2YgbGluZSB3aGlsZSBmb3JtYXR0aW5nCisJcmV0dXJuIHRydWU7Cit9CisKK3Byb3RlY3RlZCBib29sZWFuIHZlcmlmeVNwYWNlT3JFbmRDb21tZW50KCkgeworCS8vIERvbid0IGNhcmUgaWYgdGhlcmUncyBubyBzcGFjZXMgYWZ0ZXIgYSByZWZlcmVuY2UuLi4KKwlyZXR1cm4gdHJ1ZTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0lDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9JQ29kZUZvcm1hdHRlckNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDZkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9JQ29kZUZvcm1hdHRlckNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CisKKy8qKgorICogSW50ZXJuYWwgY29kZSBmb3JtYXR0ZXIgY29uc3RhbnRzLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzIHsKKyAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyMjQ3CisgICAgLy8gY29uc3RhbnRzIHVzZWQgdG8gaGFuZGxlIHRoZSBhZGRpdGlvbiBvZiBuZXcgbGluZXMgYWZ0ZXIgYW5ub3RhdGlvbnMKKworCS8qKiBhbm5vdGF0aW9uIG9uIHVuc3BlY2lmaWVkIHNvdXJjZSovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9VTlNQRUNJRklFRCA9IDA7CisKKwkvKiogYW5ub3RhdGlvbiBvbiBhIHR5cGUgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX09OX1RZUEUgPSAxOworCisJLyoqIGFubm90YXRpb24gb24gYSBmaWVsZCAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOTk9UQVRJT05fT05fRklFTEQgPSAyOworCisJLyoqIGFubm90YXRpb24gb24gYSBtZXRob2QgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX09OX01FVEhPRCA9IDM7CisKKwkvKiogYW5ub3RhdGlvbiBvbiBhIHBhY2thZ2UgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX09OX1BBQ0tBR0UgPSA0OworCisJLyoqIGFubm90YXRpb24gb24gYSBwYXJhbWV0ZXIgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX09OX1BBUkFNRVRFUiA9IDU7CisKKwkvKiogYW5ub3RhdGlvbiBvbiBhIGxvY2FsIHZhcmlhYmxlICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9PTl9MT0NBTF9WQVJJQUJMRSA9IDY7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Mb2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvTG9jYXRpb24uamF2YQppbmRleCA5NGY4NzdmLi5iZjgyNTcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Mb2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0xvY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNiArMTgsOCBAQAogcHVibGljIGNsYXNzIExvY2F0aW9uIHsKIAogCXB1YmxpYyBpbnQgaW5wdXRPZmZzZXQ7CisJLyoqIGRlcHJlY2F0ZWQgKi8KKwlwdWJsaWMgaW50IGlucHV0Q29sdW1uOwogCXB1YmxpYyBpbnQgb3V0cHV0TGluZTsKIAlwdWJsaWMgaW50IG91dHB1dENvbHVtbjsKIAlwdWJsaWMgaW50IG91dHB1dEluZGVudGF0aW9uTGV2ZWw7CkBAIC0yOSwxOSArMzEsMjAgQEAKIAogCS8vIGNodW5rIG1hbmFnZW1lbnQKIAlwdWJsaWMgaW50IGxhc3ROdW1iZXJPZk5ld0xpbmVzOwotCQorCiAJLy8gZWRpdHMgbWFuYWdlbWVudAogCWludCBlZGl0c0luZGV4OwogCU9wdGltaXplZFJlcGxhY2VFZGl0IHRleHRFZGl0OwotCQorCiAJcHVibGljIExvY2F0aW9uKFNjcmliZSBzY3JpYmUsIGludCBzb3VyY2VSZXN0YXJ0KXsKIAkJdXBkYXRlKHNjcmliZSwgc291cmNlUmVzdGFydCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdXBkYXRlKFNjcmliZSBzY3JpYmUsIGludCBzb3VyY2VSZXN0YXJ0KXsKIAkJdGhpcy5vdXRwdXRDb2x1bW4gPSBzY3JpYmUuY29sdW1uOwogCQl0aGlzLm91dHB1dExpbmUgPSBzY3JpYmUubGluZTsKIAkJdGhpcy5pbnB1dE9mZnNldCA9IHNvdXJjZVJlc3RhcnQ7CisJCXRoaXMuaW5wdXRDb2x1bW4gPSBzY3JpYmUuZ2V0Q3VycmVudEluZGVudGF0aW9uKHNvdXJjZVJlc3RhcnQpICsgMTsKIAkJdGhpcy5vdXRwdXRJbmRlbnRhdGlvbkxldmVsID0gc2NyaWJlLmluZGVudGF0aW9uTGV2ZWw7CiAJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPSBzY3JpYmUubGFzdE51bWJlck9mTmV3TGluZXM7CiAJCXRoaXMubmVlZFNwYWNlID0gc2NyaWJlLm5lZWRTcGFjZTsKQEAgLTQ5LDYgKzUyLDE3IEBACiAJCXRoaXMuZWRpdHNJbmRleCA9IHNjcmliZS5lZGl0c0luZGV4OwogCQl0aGlzLm5sc1RhZ0NvdW50ZXIgPSBzY3JpYmUubmxzVGFnQ291bnRlcjsKIAkJdGhpcy5udW1iZXJPZkluZGVudGF0aW9ucyA9IHNjcmliZS5udW1iZXJPZkluZGVudGF0aW9uczsKLQkJdGV4dEVkaXQgPSBzY3JpYmUuZ2V0TGFzdEVkaXQoKTsKKwkJdGhpcy50ZXh0RWRpdCA9IHNjcmliZS5nZXRMYXN0RWRpdCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWJ1ZmZlci5hcHBlbmQoIm91dHB1dCAoY29sdW1uPSIrdGhpcy5vdXRwdXRDb2x1bW4pOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIiwgbGluZT0iK3RoaXMub3V0cHV0TGluZSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiLCBpbmRlbnRhdGlvbiBsZXZlbD0iK3RoaXMub3V0cHV0SW5kZW50YXRpb25MZXZlbCk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiKSBpbnB1dCAob2Zmc2V0PSIrdGhpcy5pbnB1dE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiLCBjb2x1bW49Iit0aGlzLmlucHV0Q29sdW1uKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCcpJyk7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9PcHRpbWl6ZWRSZXBsYWNlRWRpdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvT3B0aW1pemVkUmVwbGFjZUVkaXQuamF2YQppbmRleCA4NDlhZjA1Li42OTA1YWRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9PcHRpbWl6ZWRSZXBsYWNlRWRpdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL09wdGltaXplZFJlcGxhY2VFZGl0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTggKzExLDE4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CiAKIHB1YmxpYyBjbGFzcyBPcHRpbWl6ZWRSZXBsYWNlRWRpdCB7Ci0JCisKIAlpbnQgb2Zmc2V0OwogCWludCBsZW5ndGg7CiAJU3RyaW5nIHJlcGxhY2VtZW50OwotCQorCiAJcHVibGljIE9wdGltaXplZFJlcGxhY2VFZGl0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyByZXBsYWNlbWVudCkgewogCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKIAkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAJCXRoaXMucmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIigiICsgdGhpcy5vZmZzZXQgKyAiLCBsZW5ndGggIiArIHRoaXMubGVuZ3RoICsgIiA6PiIgKyB0aGlzLnJlcGxhY2VtZW50ICsgIjwiOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCisJCXJldHVybiAodGhpcy5vZmZzZXQgPCAwID8gIigiIDogIlgoIikgKyB0aGlzLm9mZnNldCArICIsIGxlbmd0aCAiICsgdGhpcy5sZW5ndGggKyAiIDo+IiArIHRoaXMucmVwbGFjZW1lbnQgKyAiPCI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL1NjcmliZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvU2NyaWJlLmphdmEKaW5kZXggZDU0ZWQ5OC4uY2VkNTY4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvU2NyaWJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvU2NyaWJlLmphdmEKQEAgLTEsMjIgKzEsMzIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKKyAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFJheSBWLiAodm9pZHN0YXJAZ21haWwuY29tKSAtIENvbnRyaWJ1dGlvbiBmb3IgYnVnIDI4Mjk4OAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOwpAQCAtMjUsNiArMzUsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuYWxpZ24uQWxpZ25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuYWxpZ24uQWxpZ25tZW50RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudC5Db21tZW50Rm9ybWF0dGVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQuSFRNTEVudGl0eTJKYXZhUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudC5JSmF2YURvY1RhZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQuSmF2YTJIVE1MRW50aXR5UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwpAQCAtMzMsNTQgKzUzLDEyOCBAQAogICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZHVtcGluZyBmb3JtYXR0ZWQgc291cmNlCiAgKiBAc2luY2UgMi4xCiAgKi8KLXB1YmxpYyBjbGFzcyBTY3JpYmUgeworcHVibGljIGNsYXNzIFNjcmliZSBpbXBsZW1lbnRzIElKYXZhRG9jVGFnQ29uc3RhbnRzIHsKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NJWkUgPSAxMDA7Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gY2hlY2tMaW5lV3JhcHBpbmc7CiAJLyoqIG9uZS1iYXNlZCBjb2x1bW4gKi8KIAlwdWJsaWMgaW50IGNvbHVtbjsKIAlwcml2YXRlIGludFtdW10gY29tbWVudFBvc2l0aW9uczsKLQkJCi0JLy8gTW9zdCBzcGVjaWZpYyBhbGlnbm1lbnQuIAorCisJLy8gTW9zdCBzcGVjaWZpYyBhbGlnbm1lbnQuCiAJcHVibGljIEFsaWdubWVudCBjdXJyZW50QWxpZ25tZW50OwogCXB1YmxpYyBpbnQgY3VycmVudFRva2VuOwotCQorCiAJLy8gZWRpdHMgbWFuYWdlbWVudAogCXByaXZhdGUgT3B0aW1pemVkUmVwbGFjZUVkaXRbXSBlZGl0czsKIAlwdWJsaWMgaW50IGVkaXRzSW5kZXg7Ci0JCisKIAlwdWJsaWMgQ29kZUZvcm1hdHRlclZpc2l0b3IgZm9ybWF0dGVyOwotCXB1YmxpYyBpbnQgaW5kZW50YXRpb25MZXZlbDsJCisJcHVibGljIGludCBpbmRlbnRhdGlvbkxldmVsOwogCXB1YmxpYyBpbnQgbGFzdE51bWJlck9mTmV3TGluZXM7CisJcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlTGluZUJyZWFrSW5kZW50YXRpb24gPSBmYWxzZTsKIAlwdWJsaWMgaW50IGxpbmU7Ci0JCisKIAlwcml2YXRlIGludFtdIGxpbmVFbmRzOwotCXByaXZhdGUgU3RyaW5nIGxpbmVTZXBhcmF0b3I7CisJcHJpdmF0ZSBpbnQgbWF4TGluZXM7CiAJcHVibGljIEFsaWdubWVudCBtZW1iZXJBbGlnbm1lbnQ7CiAJcHVibGljIGJvb2xlYW4gbmVlZFNwYWNlID0gZmFsc2U7Ci0JCisKKwkvLyBMaW5lIHNlcGFyYXRvciBpbmZvcworCWZpbmFsIHByaXZhdGUgU3RyaW5nIGxpbmVTZXBhcmF0b3I7CisJZmluYWwgcHJpdmF0ZSBTdHJpbmcgbGluZVNlcGFyYXRvckFuZFNwYWNlOworCWZpbmFsIHByaXZhdGUgY2hhciBmaXJzdExTOworCWZpbmFsIHByaXZhdGUgaW50IGxzTGVuZ3RoOworCiAJcHVibGljIGludCBubHNUYWdDb3VudGVyOwogCXB1YmxpYyBpbnQgcGFnZVdpZHRoOwogCXB1YmxpYyBib29sZWFuIHBlbmRpbmdTcGFjZSA9IGZhbHNlOwogCiAJcHVibGljIFNjYW5uZXIgc2Nhbm5lcjsKIAlwdWJsaWMgaW50IHNjYW5uZXJFbmRQb3NpdGlvbjsKLQlwdWJsaWMgaW50IHRhYkxlbmd0aDsJCi0JcHVibGljIGludCBpbmRlbnRhdGlvblNpemU7CQotCXByaXZhdGUgaW50IHRleHRSZWdpb25FbmQ7Ci0JcHJpdmF0ZSBpbnQgdGV4dFJlZ2lvblN0YXJ0OworCXB1YmxpYyBpbnQgdGFiTGVuZ3RoOworCXB1YmxpYyBpbnQgaW5kZW50YXRpb25TaXplOworCXByaXZhdGUgZmluYWwgSVJlZ2lvbltdIHJlZ2lvbnM7CisJcHJpdmF0ZSBJUmVnaW9uW10gYWRhcHRlZFJlZ2lvbnM7CiAJcHVibGljIGludCB0YWJDaGFyOwogCXB1YmxpYyBpbnQgbnVtYmVyT2ZJbmRlbnRhdGlvbnM7CiAJcHJpdmF0ZSBib29sZWFuIHVzZVRhYnNPbmx5Rm9yTGVhZGluZ0luZGVudHM7CiAKLQkvKiogaW5kZW50IGVtcHR5IGxpbmVzKi8KKwkvKiogZW1wdHkgbGluZXMqLwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmRlbnRFbXB0eUxpbmVzOwotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmb3JtYXRKYXZhZG9jQ29tbWVudDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZm9ybWF0QmxvY2tDb21tZW50OwotCQotCVNjcmliZShDb2RlRm9ybWF0dGVyVmlzaXRvciBmb3JtYXR0ZXIsIGxvbmcgc291cmNlTGV2ZWwsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENvZGVTbmlwcGV0UGFyc2luZ1V0aWwgY29kZVNuaXBwZXRQYXJzaW5nVXRpbCkgewotCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0cnVlLCB0cnVlLCBmYWxzZS8qbmxzKi8sIHNvdXJjZUxldmVsLypzb3VyY2VMZXZlbCovLCBudWxsLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKKwlpbnQgYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzID0gLTE7CisKKwkvLyBQcmVzZXJ2ZSBlbXB0eSBsaW5lcyBjb25zdGFudHMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19OT1RfUFJFU0VSVkVfRU1QVFlfTElORVMgPSAtMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19LRUVQX0xBU1RfTkVXX0xJTkVTX0lOREVOVEFUSU9OID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19JTl9GT1JNQVRfTEVGVF9DVVJMWV9CUkFDRSA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fU1RSSU5HX0xJVEVSQUxfQ09OQ0FURU5BVElPTiA9IDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fQ0xPU0lOR19BUlJBWV9JTklUSUFMSVpFUiA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fRk9STUFUX09QRU5JTkdfQlJBQ0UgPSA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFUlZFX0VNUFRZX0xJTkVTX0lOX0JJTkFSWV9FWFBSRVNTSU9OID0gNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19JTl9FUVVBTElUWV9FWFBSRVNTSU9OID0gNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19CRUZPUkVfRUxTRSA9IDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fU1dJVENIX0NBU0UgPSA5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFUlZFX0VNUFRZX0xJTkVTX0FUX0VORF9PRl9NRVRIT0RfREVDTEFSQVRJT04gPSAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19BVF9FTkRfT0ZfQkxPQ0sgPSAxMTsKKwlmaW5hbCBzdGF0aWMgaW50IFBSRVNFUlZFX0VNUFRZX0xJTkVTX0RPX05PVF9VU0VfQU5ZX0lOREVOVEFUSU9OID0gLTE7CisJZmluYWwgc3RhdGljIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19VU0VfQ1VSUkVOVF9JTkRFTlRBVElPTiA9IDA7CisJZmluYWwgc3RhdGljIGludCBQUkVTRVJWRV9FTVBUWV9MSU5FU19VU0VfVEVNUE9SQVJZX0lOREVOVEFUSU9OID0gMTsKKworCS8qKiBkaXNhYmxpbmcgKi8KKwlib29sZWFuIGVkaXRzRW5hYmxlZDsKKwlib29sZWFuIHVzZVRhZ3M7CisJaW50IHRhZ3NLaW5kOworCisJLyogQ29tbWVudHMgZm9ybWF0dGluZyAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0JMT0NLX0NPTU1FTlRTID0gQ29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVFMgfCBDb2RlRm9ybWF0dGVyLktfTVVMVElfTElORV9DT01NRU5UOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0pBVkFfRE9DID0gQ29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVFMgfCBDb2RlRm9ybWF0dGVyLktfSkFWQV9ET0M7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfTElORV9DT01NRU5UUyA9IENvZGVGb3JtYXR0ZXIuRl9JTkNMVURFX0NPTU1FTlRTIHwgQ29kZUZvcm1hdHRlci5LX1NJTkdMRV9MSU5FX0NPTU1FTlQ7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNLSVBfRklSU1RfV0hJVEVTUEFDRV9UT0tFTiA9IC0yOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RPS0VOID0gMjAwMDsKKwlzdGF0aWMgZmluYWwgaW50IE5PX1RSQUlMSU5HX0NPTU1FTlQgPSAweDAwMDA7CisJc3RhdGljIGZpbmFsIGludCBCQVNJQ19UUkFJTElOR19DT01NRU5UID0gMHgwMTAwOworCXN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9UUkFJTElOR19DT01NRU5UID0gMHgwMjAwOworCXN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUX1RSQUlMSU5HX0NPTU1FTlQgPSBDT01QTEVYX1RSQUlMSU5HX0NPTU1FTlQgfCAweDAwMDE7CisJc3RhdGljIGZpbmFsIGludCBVTk1PRElGSUFCTEVfVFJBSUxJTkdfQ09NTUVOVCA9IDB4MDQwMDsKKwlwcml2YXRlIGludCBmb3JtYXRDb21tZW50cyA9IDA7CisJcHJpdmF0ZSBpbnQgaGVhZGVyRW5kUG9zaXRpb24gPSAtMTsKKwlTdHJpbmcgY29tbWVudEluZGVudGF0aW9uOyAvLyBpbmRlbnRhdGlvbiByZXF1ZXN0ZWQgaW4gY29tbWVudHMgKHVzdWFsbHkgaW4gamF2YWRvYyByb290IHRhZ3MgZGVzY3JpcHRpb24pCisKKwkvLyBDbGFzcyB0byBzdG9yZSBwcmV2aW91cyBsaW5lIGNvbW1lbnQgaW5mb3JtYXRpb24KKwlzdGF0aWMgY2xhc3MgTGluZUNvbW1lbnQgeworCQlib29sZWFuIGNvbnRpZ3VvdXMgPSBmYWxzZTsKKwkJaW50IGN1cnJlbnRJbmRlbnRhdGlvbiwgaW5kZW50YXRpb247CisJCWludCBsaW5lczsKKwkJY2hhcltdIGxlYWRpbmdTcGFjZXM7CisJfQorCWZpbmFsIExpbmVDb21tZW50IGxhc3RMaW5lQ29tbWVudCA9IG5ldyBMaW5lQ29tbWVudCgpOworCisJLy8gTmV3IHdheSB0byBmb3JtYXQgamF2YWRvYworCXByaXZhdGUgRm9ybWF0dGVyQ29tbWVudFBhcnNlciBmb3JtYXR0ZXJDb21tZW50UGFyc2VyOyAvLyBzcGVjaWFsaXplZCBwYXJzZXIgdG8gZm9ybWF0IGNvbW1lbnRzCisKKwkvLyBEaXNhYmxpbmcgYW5kIGVuYWJsaW5nIHRhZ3MKKwlPcHRpbWl6ZWRSZXBsYWNlRWRpdCBwcmV2aW91c0Rpc2FibGVkRWRpdDsKKwlwcml2YXRlIGNoYXJbXSBkaXNhYmxpbmdUYWcsIGVuYWJsaW5nVGFnOworCisJLy8gV2VsbCBrbm93IHN0cmluZ3MKKwlwcml2YXRlIFN0cmluZ1tdIG5ld0VtcHR5TGluZXMgPSBuZXcgU3RyaW5nWzEwXTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBDT01NRU5UX0lOREVOVEFUSU9OUyA9IG5ldyBTdHJpbmdbMjBdOworCisJLy8gZmluYWwgc3RyaW5nIGJ1ZmZlcnMKKwlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciB0ZW1wQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgYmxvY2tDb21tZW50QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBjb2RlU25pcHBldEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBqYXZhZG9jQmxvY2tSZWZCdWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBqYXZhZG9jR2FwTGluZXNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJcHJpdmF0ZSBTdHJpbmdCdWZmZXJbXSBqYXZhZG9jSHRtbFRhZ0J1ZmZlcnMgPSBuZXcgU3RyaW5nQnVmZmVyWzVdOworCXByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGphdmFkb2NUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGphdmFkb2NUb2tlbnNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwlTY3JpYmUoQ29kZUZvcm1hdHRlclZpc2l0b3IgZm9ybWF0dGVyLCBsb25nIHNvdXJjZUxldmVsLCBJUmVnaW9uW10gcmVnaW9ucywgQ29kZVNuaXBwZXRQYXJzaW5nVXRpbCBjb2RlU25pcHBldFBhcnNpbmdVdGlsLCBib29sZWFuIGluY2x1ZGVDb21tZW50cykgeworCQlpbml0aWFsaXplU2Nhbm5lcihzb3VyY2VMZXZlbCwgZm9ybWF0dGVyLnByZWZlcmVuY2VzKTsKIAkJdGhpcy5mb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7CiAJCXRoaXMucGFnZVdpZHRoID0gZm9ybWF0dGVyLnByZWZlcmVuY2VzLnBhZ2Vfd2lkdGg7CiAJCXRoaXMudGFiTGVuZ3RoID0gZm9ybWF0dGVyLnByZWZlcmVuY2VzLnRhYl9zaXplOwpAQCAtOTUsOSArMTg5LDExIEBACiAJCQl0aGlzLmluZGVudGF0aW9uU2l6ZSA9IHRoaXMudGFiTGVuZ3RoOwogCQl9CiAJCXRoaXMubGluZVNlcGFyYXRvciA9IGZvcm1hdHRlci5wcmVmZXJlbmNlcy5saW5lX3NlcGFyYXRvcjsKKwkJdGhpcy5saW5lU2VwYXJhdG9yQW5kU3BhY2UgPSB0aGlzLmxpbmVTZXBhcmF0b3IrJyAnOworCQl0aGlzLmZpcnN0TFMgPSB0aGlzLmxpbmVTZXBhcmF0b3IuY2hhckF0KDApOworCQl0aGlzLmxzTGVuZ3RoID0gdGhpcy5saW5lU2VwYXJhdG9yLmxlbmd0aCgpOwogCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBmb3JtYXR0ZXIucHJlZmVyZW5jZXMuaW5pdGlhbF9pbmRlbnRhdGlvbl9sZXZlbCAqIHRoaXMuaW5kZW50YXRpb25TaXplOwotCQl0aGlzLnRleHRSZWdpb25TdGFydCA9IG9mZnNldDsKLQkJdGhpcy50ZXh0UmVnaW9uRW5kID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMTsKKwkJdGhpcy5yZWdpb25zPSByZWdpb25zOwogCQlpZiAoY29kZVNuaXBwZXRQYXJzaW5nVXRpbCAhPSBudWxsKSB7CiAJCQlmaW5hbCBSZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiBpbmZvcm1hdGlvbiA9IGNvZGVTbmlwcGV0UGFyc2luZ1V0aWwucmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb247CiAJCQlpZiAoaW5mb3JtYXRpb24gIT0gbnVsbCkgewpAQCAtMTA1LDExICsyMDEsMzUwIEBACiAJCQkJdGhpcy5jb21tZW50UG9zaXRpb25zID0gaW5mb3JtYXRpb24uY29tbWVudFBvc2l0aW9uczsKIAkJCX0KIAkJfQotCQl0aGlzLmZvcm1hdEJsb2NrQ29tbWVudCA9IGZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9ibG9ja19jb21tZW50OwotCQl0aGlzLmZvcm1hdEphdmFkb2NDb21tZW50ID0gZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfZm9ybWF0X2phdmFkb2NfY29tbWVudDsKKwkJaWYgKGZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnQpIHRoaXMuZm9ybWF0Q29tbWVudHMgfD0gQ29kZUZvcm1hdHRlci5LX1NJTkdMRV9MSU5FX0NPTU1FTlQ7CisJCWlmIChmb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9mb3JtYXRfYmxvY2tfY29tbWVudCkgdGhpcy5mb3JtYXRDb21tZW50cyB8PSBDb2RlRm9ybWF0dGVyLktfTVVMVElfTElORV9DT01NRU5UOworCQlpZiAoZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfZm9ybWF0X2phdmFkb2NfY29tbWVudCkgdGhpcy5mb3JtYXRDb21tZW50cyB8PSBDb2RlRm9ybWF0dGVyLktfSkFWQV9ET0M7CisJCWlmIChpbmNsdWRlQ29tbWVudHMpIHRoaXMuZm9ybWF0Q29tbWVudHMgfD0gQ29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVFM7CiAJCXJlc2V0KCk7CiAJfQotCQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCBhZGFwdCB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBpZiBuZWVkZWQuCisJICogSWYgYSByZWdpb24gc2hvdWxkIGJlIGFkYXB0ZWQgKHNlZSBpc0FkYXB0YWJsZVJlZ2lvbihJUmVnaW9uKSkKKwkgKiByZXRyaWV2ZSBjb3JyZWN0IHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHJlcGxhY2UgdGhlIHJlZ2lvbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRhcHRSZWdpb25zKCkgeworCQlpbnQgbWF4ID0gdGhpcy5yZWdpb25zLmxlbmd0aDsKKwkJaWYgKG1heCA9PSAxKSB7CisJCQkvLyBJdCdzIG5vdCBuZWNlc3NhcnkgdG8gYWRhcHQgdGhlIHNpbmdsZSByZWdpb24gd2hpY2ggY292ZXJzIGFsbCB0aGUgc291cmNlCisJCQlpZiAodGhpcy5yZWdpb25zWzBdLmdldE9mZnNldCgpID09IDAgJiYgdGhpcy5yZWdpb25zWzBdLmdldExlbmd0aCgpID09IHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uKSB7CisJCQkJdGhpcy5hZGFwdGVkUmVnaW9ucyA9IHRoaXMucmVnaW9uczsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJdGhpcy5hZGFwdGVkUmVnaW9ucyA9IG5ldyBJUmVnaW9uW21heF07CisJCWludCBjb21tZW50SW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlJUmVnaW9uIGFSZWdpb24gPSB0aGlzLnJlZ2lvbnNbaV07CisJCQlpbnQgb2Zmc2V0ID0gYVJlZ2lvbi5nZXRPZmZzZXQoKTsKKwkJCWludCBsZW5ndGggPSBhUmVnaW9uLmdldExlbmd0aCgpOworCisJCQkvLyBGaXJzdCBsb29rIGlmIHRoZSByZWdpb24gc3RhcnRzIG9yIGVuZHMgaW5zaWRlIGEgY29tbWVudAorCQkJaW50IGluZGV4ID0gZ2V0Q29tbWVudEluZGV4KGNvbW1lbnRJbmRleCwgb2Zmc2V0KTsKKwkJCWludCBhZGFwdGVkT2Zmc2V0ID0gb2Zmc2V0OworCQkJaW50IGFkYXB0ZWRMZW5ndGggPSBsZW5ndGg7CisJCQlpZiAoaW5kZXggPj0gMCkgeworCQkJCS8vIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbiBpcyBpbnNpZGUgYSBjb21tZW50ID0+IHJlc3RhcnQgdGhlIHJlZ2lvbiBmcm9tIHRoZSBjb21tZW50IHN0YXJ0CisJCQkJYWRhcHRlZE9mZnNldCA9IHRoaXMuY29tbWVudFBvc2l0aW9uc1tpbmRleF1bMF07CisJCQkJaWYgKGFkYXB0ZWRPZmZzZXQgPj0gMCkgeworCQkJCQkvLyBhZGFwdCBvbmx5IGphdmFkb2Mgb3IgYmxvY2sgY29tbWVudHMuIFNpbmNlIGZpeCBmb3IgYnVnCisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzgyMTAKKwkJCQkJLy8gZWRpdHMgaW4gbGluZSBjb21tZW50cyBvbmx5IGNvbmNlcm5zIHdoaXRlc3BhY2VzIGhlbmNlIGNhbiBiZQorCQkJCQkvLyB0cmVhdGVkIGFzIGVkaXRzIGluIGNvZGUKKwkJCQkJYWRhcHRlZExlbmd0aCA9IGxlbmd0aCArIG9mZnNldCAtIGFkYXB0ZWRPZmZzZXQ7CisJCQkJCWNvbW1lbnRJbmRleCA9IGluZGV4OworCQkJCX0KKwkJCX0KKwkJCWluZGV4ID0gZ2V0Q29tbWVudEluZGV4KGNvbW1lbnRJbmRleCwgb2Zmc2V0K2xlbmd0aC0xKTsKKwkJCWlmIChpbmRleCA+PSAwICYmIHRoaXMuY29tbWVudFBvc2l0aW9uc1tpbmRleF1bMF0gPj0gMCkgeyAvLyBvbmx5IGphdmFkb2Mgb3IgYmxvY2sgY29tbWVudAorCQkJCS8vIHRoZSByZWdpb24gZW5kIGlzIGluc2lkZSBhIGNvbW1lbnQgPT4gc2V0IHRoZSByZWdpb24gZW5kIGF0IHRoZSBjb21tZW50IGVuZAorCQkJCWludCBjb21tZW50RW5kID0gdGhpcy5jb21tZW50UG9zaXRpb25zW2luZGV4XVsxXTsKKwkJCQlpZiAoY29tbWVudEVuZCA8IDApIGNvbW1lbnRFbmQgPSAtY29tbWVudEVuZDsKKwkJCQlhZGFwdGVkTGVuZ3RoID0gY29tbWVudEVuZCAtIGFkYXB0ZWRPZmZzZXQ7CisJCQkJY29tbWVudEluZGV4ID0gaW5kZXg7CisJCQl9CisJCQlpZiAoYWRhcHRlZExlbmd0aCAhPSBsZW5ndGgpIHsKKwkJCQkvLyBhZGFwdCB0aGUgcmVnaW9uIGFuZCBqdW1wIHRvIG5leHQgb25lCisJCQkJdGhpcy5hZGFwdGVkUmVnaW9uc1tpXSA9IG5ldyBSZWdpb24oYWRhcHRlZE9mZnNldCwgYWRhcHRlZExlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuYWRhcHRlZFJlZ2lvbnNbaV0gPSBhUmVnaW9uOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBBZGFwdCBlZGl0cyB0byByZWdpb25zLgorCSAqIAorCSAqIEBzZWUgImh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ1ODMiCisJICogCWZvciBtb3JlIGRldGFpbHMKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRhcHRFZGl0cygpIHsKKworCQkvLyBTZWUgaWYgYWRhcHRpbmcgZWRpdHMgaXMgcmVhbGx5IG5lY2Vzc2FyeQorCQlpbnQgbWF4ID0gdGhpcy5yZWdpb25zLmxlbmd0aDsKKwkJaWYgKG1heCA9PSAxKSB7CisJCQlpZiAodGhpcy5yZWdpb25zWzBdLmdldE9mZnNldCgpID09IDAgJiYgdGhpcy5yZWdpb25zWzBdLmdldExlbmd0aCgpID09IHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uKSB7CisJCQkJLy8gTm8gbmVlZCB0byBhZGFwdCBhcyB0aGUgcmVnaW9ucyBjb3ZlcnMgdGhlIHdob2xlIHNvdXJjZQorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8vIFNvcnQgZWRpdHMKKwkJT3B0aW1pemVkUmVwbGFjZUVkaXRbXSBzb3J0ZWRFZGl0cyA9IG5ldyBPcHRpbWl6ZWRSZXBsYWNlRWRpdFt0aGlzLmVkaXRzSW5kZXhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWRpdHMsIDAsIHNvcnRlZEVkaXRzLCAwLCB0aGlzLmVkaXRzSW5kZXgpOworCQlBcnJheXMuc29ydChzb3J0ZWRFZGl0cywgbmV3IENvbXBhcmF0b3IoKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKwkJICAgIAlPcHRpbWl6ZWRSZXBsYWNlRWRpdCBlZGl0MSA9IChPcHRpbWl6ZWRSZXBsYWNlRWRpdCkgbzE7CisJCSAgICAJT3B0aW1pemVkUmVwbGFjZUVkaXQgZWRpdDIgPSAoT3B0aW1pemVkUmVwbGFjZUVkaXQpIG8yOworCQkJCXJldHVybiBlZGl0MS5vZmZzZXQgLSBlZGl0Mi5vZmZzZXQ7CisgICAgICAgICAgICB9CisJCX0pOworCisJCS8vIEFkYXB0IG92ZXJsYXBwaW5nIGVkaXRzCisJCWludCBjdXJyZW50RWRpdCA9IC0xOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlJUmVnaW9uIHJlZ2lvbiA9IHRoaXMuYWRhcHRlZFJlZ2lvbnNbaV07CisJCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpOworCQkJaW50IGxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKKworCQkJLy8gbW9kaWZ5IG92ZXJsYXBwaW5nIGVkaXRzIG9uIHRoZSByZWdpb24gKGlmIGFueSkKKwkJCWludCBpbmRleCA9IGFkYXB0RWRpdChzb3J0ZWRFZGl0cywgY3VycmVudEVkaXQsIG9mZnNldCwgb2Zmc2V0K2xlbmd0aCk7CisJCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCQljdXJyZW50RWRpdCA9IGluZGV4OworCQkJfQorCQl9CisKKyAgICAJLy8gU2V0IGludmFsaWQgYWxsIGVkaXRzIG91dHNpZGUgdGhlIHJlZ2lvbgorCQlpZiAoY3VycmVudEVkaXQgIT0gLTEpIHsKKwkJCWludCBsZW5ndGggPSBzb3J0ZWRFZGl0cy5sZW5ndGg7CisJICAgIAlmb3IgKGludCBlPWN1cnJlbnRFZGl0OyBlPGxlbmd0aDsgZSsrKSB7CisJICAgIAkJc29ydGVkRWRpdHNbZV0ub2Zmc2V0ID0gLTE7CisJICAgIAl9CisgICAgCX0KKwl9CisKKwkvKgorICAgICAqIFNlYXJjaCB3aGV0aGVyIGEgcmVnaW9uIG92ZXJsYXAgZWRpdChzKSBhdCBpdHMgc3RhcnQgYW5kL29yIGF0IGl0cyBlbmQuCisgICAgICogSWYgc28sIG1vZGlmeSB0aGUgY29uY2VybmVkIGVkaXRzIHRvIGtlZXAgb25seSB0aGUgbW9kaWZpY2F0aW9ucyB3aGljaCBhcmUKKyAgICAgKiBpbnNpZGUgdGhlIGdpdmVuIHJlZ2lvbi4KKyAgICAgKiAKKyAgICAgKiBUaGUgZWRpdCBtb2RpZmljYXRpb24gaXMgZG9uZSBhcyBmb2xsb3c6CisgICAgICogMSkgc3RhcnQgaXQgZnJvbSB0aGUgcmVnaW9uIHN0YXJ0IGlmIGl0IG92ZXJsYXBzIHRoZSByZWdpb24ncyBzdGFydAorICAgICAqIDIpIGVuZCBpdCBhdCB0aGUgcmVnaW9uIGVuZCBpZiBpdCBvdmVybGFwcyB0aGUgcmVnaW9uJ3MgZW5kCisgICAgICogMykgcmVtb3ZlIGZyb20gdGhlIHJlcGxhY2VtZW50IHN0cmluZyB0aGUgbnVtYmVyIG9mIGxpbmVzIHdoaWNoIGFyZSBvdXRzaWRlCisgICAgICogdGhlIHJlZ2lvbjogYmVmb3JlIHdoZW4gb3ZlcmxhcHBpbmcgcmVnaW9uJ3Mgc3RhcnQgYW5kIGFmdGVyIHdoZW4gb3ZlcmxhcHBpbmcKKyAgICAgKiByZWdpb24ncyBlbmQuIE5vdGUgdGhhdCB0aGUgdHJhaWxpbmcgaW5kZW50YXRpb24gb2YgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpcyBub3QKKyAgICAgKiBrZXB0IHdoZW4gdGhlIHJlZ2lvbidzIGVuZCBpcyBvdmVybGFwcGVkIGJlY2F1c2UgaXQncyBhbHdheXMgb3V0c2lkZSB0aGUKKyAgICAgKiByZWdpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYWRhcHRFZGl0KE9wdGltaXplZFJlcGxhY2VFZGl0W10gc29ydGVkRWRpdHMsIGludCBzdGFydCwgaW50IHJlZ2lvblN0YXJ0LCBpbnQgcmVnaW9uRW5kKSB7CisgICAgCWludCBpbml0aWFsU3RhcnQgPSBzdGFydD09LTEgPyAwIDogc3RhcnQ7CisJCWludCBib3R0b20gPSBpbml0aWFsU3RhcnQsIHRvcCA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7CisgICAgCWludCB0b3BFbmQgPSB0b3A7CisgICAgCWludCBpID0gMDsKKyAgICAJT3B0aW1pemVkUmVwbGFjZUVkaXQgZWRpdCA9IG51bGw7CisgICAgCWludCBvdmVybGFwSW5kZXggPSAtMTsKKworICAgIAkvLyBMb29rIGZvciBhbiBlZGl0IG92ZXJsYXBwaW5nIHRoZSByZWdpb24gc3RhcnQKKyAgICAJd2hpbGUgKGJvdHRvbSA8PSB0b3ApIHsKKyAgICAJCWkgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvMjsKKyAgICAJCWVkaXQgPSBzb3J0ZWRFZGl0c1tpXTsKKyAgICAJCWludCBlZGl0U3RhcnQgPSBlZGl0Lm9mZnNldDsKKyAgIAkJCWludCBlZGl0RW5kID0gZWRpdFN0YXJ0ICsgZWRpdC5sZW5ndGg7CisgICAgCQlpZiAoZWRpdFN0YXJ0ID4gcmVnaW9uU3RhcnQpIHsgIC8vIHRoZSBlZGl0IHN0YXJ0cyBhZnRlciB0aGUgcmVnaW9uJ3Mgc3RhcnQgPT4gbm8gcG9zc2libGUgb3ZlcmxhcCBvZiByZWdpb24ncyBzdGFydAorICAgIAkJCXRvcCA9IGktMTsKKyAgICAJCQlpZiAoZWRpdFN0YXJ0ID4gcmVnaW9uRW5kKSB7IC8vIHRoZSBlZGl0IHN0YXJ0cyBhZnRlciB0aGUgcmVnaW9uJ3MgZW5kID0+IG5vIHBvc3NpYmxlIG92ZXJsYXAgb2YgcmVnaW9uJ3MgZW5kCisgICAgCQkJCXRvcEVuZCA9IHRvcDsKKyAgICAJCQl9CisgICAgCQl9IGVsc2UgeworICAgIAkJCWlmIChlZGl0RW5kIDwgcmVnaW9uU3RhcnQpIHsgLy8gdGhlIGVkaXQgZW5kcyBiZWZvcmUgdGhlIHJlZ2lvbidzIHN0YXJ0ID0+IG5vIHBvc3NpYmxlIG92ZXJsYXAgb2YgcmVnaW9uJ3Mgc3RhcnQKKwkgICAgCQkJYm90dG9tID0gaSsxOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIENvdW50IHRoZSBsaW5lcyBvZiB0aGUgZWRpdCB3aGljaCBhcmUgb3V0c2lkZSB0aGUgcmVnaW9uCisJCQkJCWludCBsaW5lc091dHNpZGUgPSAwOworCQkJCQlTdHJpbmdCdWZmZXIgc3BhY2VzT3V0c2lkZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oZWRpdFN0YXJ0LCBlZGl0RW5kLTEpOworCQkJCQl3aGlsZSAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA8IHJlZ2lvblN0YXJ0ICYmICF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCQkJY2hhciBjaCA9IChjaGFyKSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQkJCQljYXNlICdcbic6CisJCQkJCQkJCWxpbmVzT3V0c2lkZSsrOworCQkJCQkJCQlzcGFjZXNPdXRzaWRlLnNldExlbmd0aCgwKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnXHInOgorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlzcGFjZXNPdXRzaWRlLmFwcGVuZChjaCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gUmVzdGFydCB0aGUgZWRpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHdoZXJlIHRoZSByZWdpb24gc3RhcnQKKwkJCQkJZWRpdC5vZmZzZXQgPSByZWdpb25TdGFydDsKKwkJCQkJaW50IGVkaXRMZW5ndGggPSBlZGl0Lmxlbmd0aDsKKwkJCQkJZWRpdC5sZW5ndGggLT0gZWRpdC5vZmZzZXQgLSBlZGl0U3RhcnQ7CisKKwkJCQkJLy8gQ3V0IHJlcGxhY2VtZW50IHN0cmluZyBpZiBuZWNlc3NhcnkKKwkJCQkJaW50IGxlbmd0aCA9IGVkaXQucmVwbGFjZW1lbnQubGVuZ3RoKCk7CisJCQkJCWlmIChsZW5ndGggPiAwKSB7CisKKwkJCQkJCS8vIENvdW50IHRoZSBsaW5lcyBpbiByZXBsYWNlbWVudCBzdHJpbmcKKwkJCQkJCWludCBsaW5lc1JlcGxhY2VkID0gMDsKKwkJCQkJCWZvciAoaW50IGlkeD0wOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7CisJCQkJCQkJaWYgKGVkaXQucmVwbGFjZW1lbnQuY2hhckF0KGlkeCkgPT0gJ1xuJykgbGluZXNSZXBsYWNlZCsrOworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZWRpdCB3YXMgYSByZXBsYWNlbWVudCBidXQgYmVjb21lIGFuIGluc2VydGlvbiBkdWUgdG8gdGhlIGxlbmd0aCByZWR1Y3Rpb24KKwkJCQkJCS8vIGFuZCBpZiB0aGUgZWRpdCBmaW5pc2hlcyBqdXN0IGJlZm9yZSB0aGUgcmVnaW9uIHN0YXJ0cyBhbmQgaWYgdGhlcmUncyBubyBsaW5lIHRvIHJlcGxhY2UKKwkJCQkJCS8vIHRoZW4gdGhlcmUncyBubyByZXBsYWNlbWVudCB0byBkby4uLgorCQkJCQkJaWYgKGVkaXRMZW5ndGggPiAwICYmIGVkaXQubGVuZ3RoID09IDAgJiYgZWRpdEVuZCA9PSByZWdpb25TdGFydCAmJiBsaW5lc1JlcGxhY2VkID09IDAgJiYgbGluZXNPdXRzaWRlPT0gMCkgeworCQkJCQkJCWVkaXQub2Zmc2V0ID0gLTE7CisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJLy8gQXMgdGhlIGVkaXQgc3RhcnRzIG91dHNpZGUgdGhlIHJlZ2lvbiwgcmVtb3ZlIGZpcnN0IGxpbmVzIGZyb20gZWRpdCBzdHJpbmcgaWYgYW55CisJCQkJCQkJaWYgKGxpbmVzUmVwbGFjZWQgPiAwKSB7CisJCQkJCQkJCWludCBsaW5lc0NvdW50ID0gbGluZXNPdXRzaWRlID49IGxpbmVzUmVwbGFjZWQgPyBsaW5lc1JlcGxhY2VkIDogbGluZXNPdXRzaWRlOworCQkJCQkJCQlpZiAobGluZXNDb3VudCA+IDApIHsKKwkJCQkJCQkJCWludCBpZHggPSAwOworCQkJCQkJCQkJbG9vcDogd2hpbGUgKGlkeCA8IGxlbmd0aCkgeworCQkJCQkJCQkJCWNoYXIgY2ggPSBlZGl0LnJlcGxhY2VtZW50LmNoYXJBdChpZHgpOworCQkJCQkJCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQkJCQkJCQkJY2FzZSAnXG4nOgorCQkJCQkJCQkJCQkJbGluZXNDb3VudC0tOworCQkJCQkJCQkJCQkJaWYgKGxpbmVzQ291bnQgPT0gMCkgeworCQkJCQkJCQkJCQkJCWlkeCsrOworCQkJCQkJCQkJCQkJCWJyZWFrIGxvb3A7CisJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkJY2FzZSAnXHInOgorCQkJCQkJCQkJCQljYXNlICcgJzoKKwkJCQkJCQkJCQkJY2FzZSAnXHQnOgorCQkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkJCQlicmVhayBsb29wOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZHgrKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vIENvbXBhcmUgc3BhY2VzIG91dHNpZGUgdGhlIHJlZ2lvbiBhbmQgdGhlIGJlZ2lubmluZworCQkJCQkJCQkJLy8gb2YgdGhlIHJlcGxhY2VtZW50IHN0cmluZyB0byByZW1vdmUgdGhlIGNvbW1vbiBwYXJ0CisJCQkJCQkJCQlpbnQgc3BhY2VzT3V0c2lkZUxlbmd0aCA9IHNwYWNlc091dHNpZGUubGVuZ3RoKCk7CisJCQkJCQkJCQlpbnQgcmVwbGFjZW1lbnRTdGFydCA9IGlkeDsKKwkJCQkJCQkJCWZvciAoaW50IG89MCwgcj0wOyBvIDwgc3BhY2VzT3V0c2lkZUxlbmd0aCAmJiByPChsZW5ndGgtaWR4KTsgbysrKSB7CisJCQkJCQkJCQkJY2hhciByY2ggPSBlZGl0LnJlcGxhY2VtZW50LmNoYXJBdChpZHggKyByKTsKKwkJCQkJCQkJCQljaGFyIG9jaCA9IHNwYWNlc091dHNpZGUuY2hhckF0KG8pOworCQkJCQkJCQkJCWlmIChyY2ggPT0gb2NoKSB7CisJCQkJCQkJCQkJCXJlcGxhY2VtZW50U3RhcnQrKzsKKwkJCQkJCQkJCQkJcisrOworCQkJCQkJCQkJCX0gZWxzZSBpZiAocmNoID09ICdcdCcgJiYgKHRoaXMudGFiTGVuZ3RoID4gMCAmJiBvY2ggPT0gJyAnKSkgeworCQkJCQkJCQkJCQlpZiAoKG8rMSkldGhpcy50YWJMZW5ndGggPT0gMCkgeworCQkJCQkJCQkJCQkJcmVwbGFjZW1lbnRTdGFydCsrOworCQkJCQkJCQkJCQkJcisrOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy8gVXBkYXRlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcKKwkJCQkJCQkJCWlmIChyZXBsYWNlbWVudFN0YXJ0ID4gbGVuZ3RoIHx8IChyZXBsYWNlbWVudFN0YXJ0ID09IGxlbmd0aCAmJiBzcGFjZXNPdXRzaWRlTGVuZ3RoID4gMCkpIHsKKwkJCQkJCQkJCQllZGl0Lm9mZnNldCA9IC0xOworCQkJCQkJCQkJfSBlbHNlIGlmIChzcGFjZXNPdXRzaWRlTGVuZ3RoID09IDAgJiYgcmVwbGFjZW1lbnRTdGFydCA9PSBsZW5ndGgpIHsKKwkJCQkJCQkJCQllZGl0LnJlcGxhY2VtZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJZWRpdC5yZXBsYWNlbWVudCA9IGVkaXQucmVwbGFjZW1lbnQuc3Vic3RyaW5nKHJlcGxhY2VtZW50U3RhcnQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCW92ZXJsYXBJbmRleCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKyAgICAJfQorICAgIAlpbnQgdmFsaWRJbmRleCA9IChvdmVybGFwSW5kZXggIT0gLTEpID8gb3ZlcmxhcEluZGV4IDogYm90dG9tOworCisgICAgCS8vIExvb2sgZm9yIGFuIGVkaXQgb3ZlcmxhcHBpbmcgdGhlIHJlZ2lvbiBlbmQKKyAgICAJaWYgKG92ZXJsYXBJbmRleCAhPSAtMSkgYm90dG9tID0gb3ZlcmxhcEluZGV4OworICAgIAl3aGlsZSAoYm90dG9tIDw9IHRvcEVuZCkgeworICAgIAkJaSA9IGJvdHRvbSArICh0b3BFbmQgLSBib3R0b20pIC8yOworICAgIAkJZWRpdCA9IHNvcnRlZEVkaXRzW2ldOworICAgIAkJaW50IGVkaXRTdGFydCA9IGVkaXQub2Zmc2V0OworICAgCQkJaW50IGVkaXRFbmQgPSBlZGl0U3RhcnQgKyBlZGl0Lmxlbmd0aDsKKyAgIAkJCWlmIChyZWdpb25FbmQgPCBlZGl0U3RhcnQpIHsJLy8gdGhlIGVkaXQgc3RhcnRzIGFmdGVyIHRoZSByZWdpb24ncyBlbmQgPT4gbm8gcG9zc2libGUgb3ZlcmxhcCBvZiByZWdpb24ncyBlbmQKKyAgICAJCQl0b3BFbmQgPSBpLTE7CisgICAgCQl9IGVsc2UgaWYgKHJlZ2lvbkVuZCA9PSBlZGl0U3RhcnQpIHsJLy8gc3BlY2lhbCBjYXNlIHdoZW4gdGhlIGVkaXQgc3RhcnRzIGp1c3QgYWZ0ZXIgdGhlIHJlZ2lvbidzIGVuZC4uLgorICAgIAkJCS8vIC4uLndlIGdvdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgZWRpdCBpbnNpZGUgdGhlIHJlZ2lvbgorCQkJCXRvcEVuZCA9IGkgLSAxOworICAgIAkJCS8vIHRoaXMgbGFzdCBlZGl0IGlzIHZhbGlkIG9ubHkgaWYgaXQncyBhbiBpbnNlcnRpb24gYW5kIGlmIGl0IGhhcyBpbmRlbnRhdGlvbgorICAgIAkJCWlmIChlZGl0Lmxlbmd0aCA9PSAwKSB7CisgICAgCQkJCWludCBuckxlbmd0aCA9IDA7CisgICAgCQkJCWludCByTGVuZ3RoID0gZWRpdC5yZXBsYWNlbWVudC5sZW5ndGgoKTsKKyAgICAJCQkJaWYgKG5yTGVuZ3RoIDwgckxlbmd0aCkgeworCSAgICAJCQkJaW50IGNoID0gZWRpdC5yZXBsYWNlbWVudC5jaGFyQXQobnJMZW5ndGgpOworCSAgICAJCQkJbG9vcDogd2hpbGUgKG5yTGVuZ3RoIDwgckxlbmd0aCkgeworCQkgICAgCQkJCXN3aXRjaCAoY2gpIHsKKwkJICAgIAkJCQkJY2FzZSAnICc6CisJCSAgICAJCQkJCWNhc2UgJ1x0JzoKKwkJICAgIAkJCQkJCW5yTGVuZ3RoKys7CisJCSAgICAJCQkJCQlicmVhazsKKwkJICAgIAkJCQkJZGVmYXVsdDoKKwkJICAgIAkJCQkJCWJyZWFrIGxvb3A7CisJCSAgICAJCQkJfQorCSAgICAJCQkJfQorICAgIAkJCQl9CisgICAgCQkJCWlmIChuckxlbmd0aCA+IDApIHsKKwkgICAgCQkJCXRvcEVuZCsrOworCSAgICAJCQkJaWYgKG5yTGVuZ3RoIDwgckxlbmd0aCkgeworCSAgICAJCQkJCWVkaXQucmVwbGFjZW1lbnQgPSBlZGl0LnJlcGxhY2VtZW50LnN1YnN0cmluZygwLCBuckxlbmd0aCk7CisJICAgIAkJCQl9CisgICAgCQkJCX0KKyAgICAJCQl9CisgICAgCQkJYnJlYWs7CisgICAgICAgCQl9IGVsc2UgaWYgKGVkaXRFbmQgPD0gcmVnaW9uRW5kKSB7CS8vIHRoZSBlZGl0IGVuZHMgYmVmb3JlIHRoZSByZWdpb24ncyBlbmQgPT4gbm8gcG9zc2libGUgb3ZlcmxhcCBvZiByZWdpb24ncyBlbmQKKyAgICAJCQlib3R0b20gPSBpKzE7CisJCQl9IGVsc2UgeworCQkJCS8vIENvdW50IHRoZSBsaW5lcyBvZiB0aGUgZWRpdCB3aGljaCBhcmUgb3V0c2lkZSB0aGUgcmVnaW9uCisJCQkJaW50IGxpbmVzT3V0c2lkZSA9IDA7CisJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oZWRpdFN0YXJ0LCBlZGl0RW5kLTEpOworCQkJCXdoaWxlICghdGhpcy5zY2FubmVyLmF0RW5kKCkpIHsKKwkJCQkJYm9vbGVhbiBhZnRlciA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPj0gcmVnaW9uRW5kOworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gKGNoYXIpIHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworICAgICAgICAgICAgICAgIAlpZiAoY2ggPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAJCWlmIChhZnRlcikgbGluZXNPdXRzaWRlKys7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisKKwkJCQkvLyBDdXQgcmVwbGFjZW1lbnQgc3RyaW5nIGlmIG5lY2Vzc2FyeQorCQkJCWludCBsZW5ndGggPSBlZGl0LnJlcGxhY2VtZW50Lmxlbmd0aCgpOworCQkJCWlmIChsZW5ndGggPiAwKSB7CisKKwkJCQkJLy8gQ291bnQgdGhlIGxpbmVzIGluIHJlcGxhY2VtZW50IHN0cmluZworCQkJCQlpbnQgbGluZXNSZXBsYWNlZCA9IDA7CisJCQkJCWZvciAoaW50IGlkeD0wOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7CisJCQkJCQlpZiAoZWRpdC5yZXBsYWNlbWVudC5jaGFyQXQoaWR4KSA9PSAnXG4nKSBsaW5lc1JlcGxhY2VkKys7CisJCQkJCX0KKworCQkJCQkvLyBTZXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZyB0byB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgbmV3IGxpbmVzCisJCQkJCS8vIEFzIHRoZSBlbmQgb2YgdGhlIGVkaXQgaXMgb3V0IG9mIHRoZSByZWdpb24sIHRoZSBwb3NzaWJsZSB0cmFpbGluZworCQkJCQkvLyBpbmRlbnRhdGlvbiBzaG91bGQgbm90IGJlIGFkZGVkLi4uCisJCQkJCWlmIChsaW5lc1JlcGxhY2VkID09IDApIHsKKwkJICAgIAkJCWVkaXQucmVwbGFjZW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IGxpbmVzQ291bnQgPSBsaW5lc1JlcGxhY2VkID4gbGluZXNPdXRzaWRlID8gbGluZXNSZXBsYWNlZCAtIGxpbmVzT3V0c2lkZSA6IDA7CisJCQkJCQlpZiAobGluZXNDb3VudCA9PSAwKSB7CisJCQkgICAgCQkJZWRpdC5yZXBsYWNlbWVudCA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVkaXQucmVwbGFjZW1lbnQgPSBnZXROZXdMaW5lU3RyaW5nKGxpbmVzQ291bnQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVkaXQubGVuZ3RoID0gcmVnaW9uRW5kIC0gZWRpdFN0YXJ0OworCisJCSAgICAJLy8gV2UgZ290IHRoZSBsYXN0IGVkaXQgb2YgdGhlIHJlZ2lvbnMsIGdpdmUgdXAKKwkJCQl0b3BFbmQgPSBpOworCQkJCWJyZWFrOworCQkJfQorICAgIAl9CisKKyAgICAJLy8gU2V0IGludmFsaWQgYWxsIGVkaXRzIG91dHNpZGUgdGhlIHJlZ2lvbgorICAgIAlmb3IgKGludCBlPWluaXRpYWxTdGFydDsgZTx2YWxpZEluZGV4OyBlKyspIHsKKyAgICAJCXNvcnRlZEVkaXRzW2VdLm9mZnNldCA9IC0xOworICAgIAl9CisgICAgCQorICAgIAkvLyBSZXR1cm4gdGhlIGluZGV4IG9mIG5leHQgZWRpdCB0byBsb29rIGF0CisgICAgCXJldHVybiB0b3BFbmQrMTsKKyAgICB9CisKIAlwcml2YXRlIGZpbmFsIHZvaWQgYWRkRGVsZXRlRWRpdChpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJaWYgKHRoaXMuZWRpdHMubGVuZ3RoID09IHRoaXMuZWRpdHNJbmRleCkgewogCQkJLy8gcmVzaXplCkBAIC0xMjcsNiArNTYyLDE4IEBACiAJfQogCiAJcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZE9wdGltaXplZFJlcGxhY2VFZGl0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyByZXBsYWNlbWVudCkgeworCQlpZiAoIXRoaXMuZWRpdHNFbmFibGVkKSB7CisJCQlpZiAodGhpcy5wcmV2aW91c0Rpc2FibGVkRWRpdCAhPSBudWxsICYmIHRoaXMucHJldmlvdXNEaXNhYmxlZEVkaXQub2Zmc2V0ID09IG9mZnNldCkgeworCQkJCXJlcGxhY2VtZW50ID0gdGhpcy5wcmV2aW91c0Rpc2FibGVkRWRpdC5yZXBsYWNlbWVudDsKKwkJCX0KKwkJCXRoaXMucHJldmlvdXNEaXNhYmxlZEVkaXQgPSBudWxsOworCQkJaWYgKHJlcGxhY2VtZW50LmluZGV4T2YodGhpcy5saW5lU2VwYXJhdG9yKSA+PSAwKSB7CisJCQkJaWYgKGxlbmd0aCA9PSAwIHx8IHByaW50TmV3TGluZXNDaGFyYWN0ZXJzKG9mZnNldCwgbGVuZ3RoKSkgeworCQkJCQl0aGlzLnByZXZpb3VzRGlzYWJsZWRFZGl0ID0gbmV3IE9wdGltaXplZFJlcGxhY2VFZGl0KG9mZnNldCwgbGVuZ3RoLCByZXBsYWNlbWVudCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuOworCQl9CiAJCWlmICh0aGlzLmVkaXRzSW5kZXggPiAwKSB7CiAJCQkvLyB0cnkgdG8gbWVyZ2UgbGFzdCB0d28gZWRpdHMKIAkJCWZpbmFsIE9wdGltaXplZFJlcGxhY2VFZGl0IHByZXZpb3VzID0gdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXgtMV07CkBAIC0xNTUsNyArNjAyLDcgQEAKIAkJCQkJCS8vIGNoZWNrIHRoZSBjaGFyYWN0ZXJzLiBJZiB0aGV5IGFyZSBpZGVudGljYWwsIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBwcmV2aW91cyBlZGl0CiAJCQkJCQlib29sZWFuIGNhbkJlUmVtb3ZlZCA9IHRydWU7CiAJCQkJCQlsb29wOiBmb3IgKGludCBpID0gcHJldmlvdXNPZmZzZXQ7IGkgPCBwcmV2aW91c09mZnNldCArIHByZXZpb3VzUmVwbGFjZW1lbnRMZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChzY2FubmVyLnNvdXJjZVtpXSAhPSBwcmV2aW91c1JlcGxhY2VtZW50LmNoYXJBdChpIC0gcHJldmlvdXNPZmZzZXQpKSB7CisJCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5zb3VyY2VbaV0gIT0gcHJldmlvdXNSZXBsYWNlbWVudC5jaGFyQXQoaSAtIHByZXZpb3VzT2Zmc2V0KSkgewogCQkJCQkJCQl0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleCAtIDFdID0gbmV3IE9wdGltaXplZFJlcGxhY2VFZGl0KHByZXZpb3VzT2Zmc2V0LCBwcmV2aW91c1JlcGxhY2VtZW50TGVuZ3RoLCBwcmV2aW91c1JlcGxhY2VtZW50KTsKIAkJCQkJCQkJY2FuQmVSZW1vdmVkID0gZmFsc2U7CiAJCQkJCQkJCWJyZWFrIGxvb3A7CkBAIC0xODQsNyArNjMxLDcgQEAKIAkJCQlib29sZWFuIGNhbkJlUmVtb3ZlZCA9IHRydWU7CiAJCQkJU3RyaW5nIHRvdGFsUmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudCArIHByZXZpb3VzUmVwbGFjZW1lbnQ7CiAJCQkJbG9vcDogZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2aW91c0xlbmd0aCArIGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzY2FubmVyLnNvdXJjZVtpICsgb2Zmc2V0XSAhPSB0b3RhbFJlcGxhY2VtZW50LmNoYXJBdChpKSkgeworCQkJCQlpZiAodGhpcy5zY2FubmVyLnNvdXJjZVtpICsgb2Zmc2V0XSAhPSB0b3RhbFJlcGxhY2VtZW50LmNoYXJBdChpKSkgewogCQkJCQkJdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXggLSAxXSA9IG5ldyBPcHRpbWl6ZWRSZXBsYWNlRWRpdChvZmZzZXQsIHByZXZpb3VzTGVuZ3RoICsgbGVuZ3RoLCB0b3RhbFJlcGxhY2VtZW50KTsKIAkJCQkJCWNhbkJlUmVtb3ZlZCA9IGZhbHNlOwogCQkJCQkJYnJlYWsgbG9vcDsKQEAgLTIwNyw3ICs2NTQsNyBAQAogCQkJdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXgrK10gPSBuZXcgT3B0aW1pemVkUmVwbGFjZUVkaXQob2Zmc2V0LCBsZW5ndGgsIHJlcGxhY2VtZW50KTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFJlcGxhY2VFZGl0KGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHJlcGxhY2VtZW50KSB7CiAJCWlmICh0aGlzLmVkaXRzLmxlbmd0aCA9PSB0aGlzLmVkaXRzSW5kZXgpIHsKIAkJCS8vIHJlc2l6ZQpAQCAtMjIxLDM5ICs2NjgsNjUgQEAKIAkJYWxpZ25tZW50LmNoZWNrQ29sdW1uKCk7CiAJCWFsaWdubWVudC5wZXJmb3JtRnJhZ21lbnRFZmZlY3QoKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjaGVja05MU1RhZyhpbnQgc291cmNlU3RhcnQpIHsKIAkJaWYgKGhhc05MU1RhZyhzb3VyY2VTdGFydCkpIHsKIAkJCXRoaXMubmxzVGFnQ291bnRlcisrOwogCQl9CiAJfQotCXB1YmxpYyB2b2lkIGNvbnN1bWVOZXh0VG9rZW4oKSB7Ci0JCXByaW50Q29tbWVudCgpOwotCQl0cnkgewotCQkJdGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQlhZGREZWxldGVFZGl0KHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBYm9ydEZvcm1hdHRpbmcoZSk7CisKKwlwcml2YXRlIGludCBjb25zdW1lSW52YWxpZFRva2VuKGludCBlbmQpIHsKKwkgICAgdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIGVuZCk7CisgICAgCS8vIEluIGNhc2Ugb2YgaW52YWxpZCB1bmljb2RlIGNoYXJhY3RlciwgY29uc3VtZSB0aGUgY3VycmVudCBiYWNrc2xhc2ggY2hhcmFjdGVyIGJlZm9yZSBjb250aW51aW5nCisgICAgCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMjI4CisJICAgIGlmICh0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CisJICAgIAl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24rMTsKKwkgICAgfQorCSAgICBpbnQgcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJICAgIGNoYXIgY2ggPSAoY2hhcikgdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7CisJICAgIGlmICh0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCSAgICAJLy8gYXZvaWQgaW5maW5pdGUgbG9vcAorCSAgICAJcmV0dXJuIElOVkFMSURfVE9LRU47CisJICAgIH0KKwkgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSAmJiBjaCAhPSAnKicgJiYgIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCSAgICAJcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJICAgIAljaCA9IChjaGFyKSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkgICAgfQorCSAgICAvLyByZXN0b3JlIGxhc3Qgd2hpdGVzcGFjZQorCSAgICB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gcHJldmlvdXNQb3NpdGlvbjsKKwkgICAgcmV0dXJuIElOVkFMSURfVE9LRU47CisgICAgfQorCisJcHVibGljIEFsaWdubWVudCBjcmVhdGVBbGlnbm1lbnQoaW50IGtpbmQsIGludCBtb2RlLCBpbnQgY291bnQsIGludCBzb3VyY2VSZXN0YXJ0KXsKKwkJcmV0dXJuIGNyZWF0ZUFsaWdubWVudChraW5kLCBtb2RlLCBBbGlnbm1lbnQuUl9JTk5FUk1PU1QsIGNvdW50LCBzb3VyY2VSZXN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgQWxpZ25tZW50IGNyZWF0ZUFsaWdubWVudChpbnQga2luZCwgaW50IG1vZGUsIGludCB0aWVCcmVha1J1bGUsIGludCBjb3VudCwgaW50IHNvdXJjZVJlc3RhcnQpeworCQlyZXR1cm4gY3JlYXRlQWxpZ25tZW50KGtpbmQsIG1vZGUsIHRpZUJyZWFrUnVsZSwgY291bnQsIHNvdXJjZVJlc3RhcnQsIHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbiwgZmFsc2UpOworCX0KKworCXB1YmxpYyBBbGlnbm1lbnQgY3JlYXRlQWxpZ25tZW50KGludCBraW5kLCBpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgc291cmNlUmVzdGFydCwgaW50IGNvbnRpbnVhdGlvbkluZGVudCwgYm9vbGVhbiBhZGp1c3QpeworCQlyZXR1cm4gY3JlYXRlQWxpZ25tZW50KGtpbmQsIG1vZGUsIEFsaWdubWVudC5SX0lOTkVSTU9TVCwgY291bnQsIHNvdXJjZVJlc3RhcnQsIGNvbnRpbnVhdGlvbkluZGVudCwgYWRqdXN0KTsKKwl9CisKKwlwdWJsaWMgQWxpZ25tZW50IGNyZWF0ZUFsaWdubWVudChpbnQga2luZCwgaW50IG1vZGUsIGludCB0aWVCcmVha1J1bGUsIGludCBjb3VudCwgaW50IHNvdXJjZVJlc3RhcnQsIGludCBjb250aW51YXRpb25JbmRlbnQsIGJvb2xlYW4gYWRqdXN0KXsKKwkJQWxpZ25tZW50IGFsaWdubWVudCA9IG5ldyBBbGlnbm1lbnQoa2luZCwgbW9kZSwgdGllQnJlYWtSdWxlLCB0aGlzLCBjb3VudCwgc291cmNlUmVzdGFydCwgY29udGludWF0aW9uSW5kZW50KTsKKwkJLy8gc3BlY2lmaWMgYnJlYWsgaW5kZW50YXRpb24gZm9yIG1lc3NhZ2UgYXJndW1lbnRzIGluc2lkZSBiaW5hcnkgZXhwcmVzc2lvbnMKKwkJaWYgKCh0aGlzLmN1cnJlbnRBbGlnbm1lbnQgPT0gbnVsbCAmJiB0aGlzLmZvcm1hdHRlci5leHByZXNzaW9uc0RlcHRoID49IDApIHx8CisJCQkodGhpcy5jdXJyZW50QWxpZ25tZW50ICE9IG51bGwgJiYgdGhpcy5jdXJyZW50QWxpZ25tZW50LmtpbmQgPT0gQWxpZ25tZW50LkJJTkFSWV9FWFBSRVNTSU9OICYmCisJCQkJKHRoaXMuZm9ybWF0dGVyLmV4cHJlc3Npb25zUG9zICYgQ29kZUZvcm1hdHRlclZpc2l0b3IuRVhQUkVTU0lPTlNfUE9TX01BU0spID09IENvZGVGb3JtYXR0ZXJWaXNpdG9yLkVYUFJFU1NJT05TX1BPU19CRVRXRUVOX1RXTykpIHsKKwkJCXN3aXRjaCAoa2luZCkgeworCQkJCWNhc2UgQWxpZ25tZW50LkNPTkRJVElPTkFMX0VYUFJFU1NJT046CisJCQkJY2FzZSBBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFM6CisJCQkJY2FzZSBBbGlnbm1lbnQuTUVTU0FHRV9TRU5EOgorCQkJCQlpZiAodGhpcy5mb3JtYXR0ZXIubGFzdEJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnRCcmVha0luZGVudGF0aW9uID09IGFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWwpIHsKKwkJCQkJCWFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWwgKz0gdGhpcy5pbmRlbnRhdGlvblNpemU7CisJCQkJCQlhbGlnbm1lbnQuc2hpZnRCcmVha0luZGVudGF0aW9uTGV2ZWwgKz0gdGhpcy5pbmRlbnRhdGlvblNpemU7CisJCQkJCQl0aGlzLmZvcm1hdHRlci5sYXN0QmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQogCQl9Ci0JfQotCXB1YmxpYyBBbGlnbm1lbnQgY3JlYXRlQWxpZ25tZW50KFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgc291cmNlUmVzdGFydCl7Ci0JCXJldHVybiBjcmVhdGVBbGlnbm1lbnQobmFtZSwgbW9kZSwgQWxpZ25tZW50LlJfSU5ORVJNT1NULCBjb3VudCwgc291cmNlUmVzdGFydCk7Ci0JfQotCi0JcHVibGljIEFsaWdubWVudCBjcmVhdGVBbGlnbm1lbnQoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBpbnQgY291bnQsIGludCBzb3VyY2VSZXN0YXJ0LCBib29sZWFuIGFkanVzdCl7Ci0JCXJldHVybiBjcmVhdGVBbGlnbm1lbnQobmFtZSwgbW9kZSwgQWxpZ25tZW50LlJfSU5ORVJNT1NULCBjb3VudCwgc291cmNlUmVzdGFydCwgYWRqdXN0KTsKLQl9Ci0JCi0JcHVibGljIEFsaWdubWVudCBjcmVhdGVBbGlnbm1lbnQoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBpbnQgdGllQnJlYWtSdWxlLCBpbnQgY291bnQsIGludCBzb3VyY2VSZXN0YXJ0KXsKLQkJcmV0dXJuIGNyZWF0ZUFsaWdubWVudChuYW1lLCBtb2RlLCB0aWVCcmVha1J1bGUsIGNvdW50LCBzb3VyY2VSZXN0YXJ0LCB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb250aW51YXRpb25faW5kZW50YXRpb24sIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQWxpZ25tZW50IGNyZWF0ZUFsaWdubWVudChTdHJpbmcgbmFtZSwgaW50IG1vZGUsIGludCBjb3VudCwgaW50IHNvdXJjZVJlc3RhcnQsIGludCBjb250aW51YXRpb25JbmRlbnQsIGJvb2xlYW4gYWRqdXN0KXsKLQkJcmV0dXJuIGNyZWF0ZUFsaWdubWVudChuYW1lLCBtb2RlLCBBbGlnbm1lbnQuUl9JTk5FUk1PU1QsIGNvdW50LCBzb3VyY2VSZXN0YXJ0LCBjb250aW51YXRpb25JbmRlbnQsIGFkanVzdCk7Ci0JfQotCi0JcHVibGljIEFsaWdubWVudCBjcmVhdGVBbGlnbm1lbnQoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBpbnQgdGllQnJlYWtSdWxlLCBpbnQgY291bnQsIGludCBzb3VyY2VSZXN0YXJ0LCBpbnQgY29udGludWF0aW9uSW5kZW50LCBib29sZWFuIGFkanVzdCl7Ci0JCUFsaWdubWVudCBhbGlnbm1lbnQgPSBuZXcgQWxpZ25tZW50KG5hbWUsIG1vZGUsIHRpZUJyZWFrUnVsZSwgdGhpcywgY291bnQsIHNvdXJjZVJlc3RhcnQsIGNvbnRpbnVhdGlvbkluZGVudCk7CiAJCS8vIGFkanVzdCBicmVhayBpbmRlbnRhdGlvbgogCQlpZiAoYWRqdXN0ICYmIHRoaXMubWVtYmVyQWxpZ25tZW50ICE9IG51bGwpIHsKIAkJCUFsaWdubWVudCBjdXJyZW50ID0gdGhpcy5tZW1iZXJBbGlnbm1lbnQ7CkBAIC0zMTIsMTUgKzc4NSwxNSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gYWxpZ25tZW50OyAKKwkJcmV0dXJuIGFsaWdubWVudDsKIAl9CiAKLQlwdWJsaWMgQWxpZ25tZW50IGNyZWF0ZU1lbWJlckFsaWdubWVudChTdHJpbmcgbmFtZSwgaW50IG1vZGUsIGludCBjb3VudCwgaW50IHNvdXJjZVJlc3RhcnQpIHsKLQkJQWxpZ25tZW50IG1BbGlnbm1lbnQgPSBjcmVhdGVBbGlnbm1lbnQobmFtZSwgbW9kZSwgQWxpZ25tZW50LlJfSU5ORVJNT1NULCBjb3VudCwgc291cmNlUmVzdGFydCk7CisJcHVibGljIEFsaWdubWVudCBjcmVhdGVNZW1iZXJBbGlnbm1lbnQoaW50IGtpbmQsIGludCBtb2RlLCBpbnQgY291bnQsIGludCBzb3VyY2VSZXN0YXJ0KSB7CisJCUFsaWdubWVudCBtQWxpZ25tZW50ID0gY3JlYXRlQWxpZ25tZW50KGtpbmQsIG1vZGUsIEFsaWdubWVudC5SX0lOTkVSTU9TVCwgY291bnQsIHNvdXJjZVJlc3RhcnQpOwogCQltQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbCA9IHRoaXMuaW5kZW50YXRpb25MZXZlbDsKIAkJcmV0dXJuIG1BbGlnbm1lbnQ7CiAJfQotCQorCiAJcHVibGljIHZvaWQgZW50ZXJBbGlnbm1lbnQoQWxpZ25tZW50IGFsaWdubWVudCl7CiAJCWFsaWdubWVudC5lbmNsb3NpbmcgPSB0aGlzLmN1cnJlbnRBbGlnbm1lbnQ7CiAJCWFsaWdubWVudC5sb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKQEAgLTM0NCwxMiArODE3LDE1IEBACiAJCX0KIAkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gYWxpZ25tZW50LmxvY2F0aW9uLm91dHB1dEluZGVudGF0aW9uTGV2ZWw7CiAJCXRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSBhbGlnbm1lbnQubG9jYXRpb24ubnVtYmVyT2ZJbmRlbnRhdGlvbnM7Ci0JCXRoaXMuZm9ybWF0dGVyLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBhbGlnbm1lbnQubG9jYXRpb24ubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydDsJCi0JCWlmIChkaXNjYXJkQWxpZ25tZW50KXsgCisJCXRoaXMuZm9ybWF0dGVyLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBhbGlnbm1lbnQubG9jYXRpb24ubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJaWYgKGRpc2NhcmRBbGlnbm1lbnQpewogCQkJdGhpcy5jdXJyZW50QWxpZ25tZW50ID0gYWxpZ25tZW50LmVuY2xvc2luZzsKKwkJCWlmICh0aGlzLmN1cnJlbnRBbGlnbm1lbnQgPT0gbnVsbCkgeworCQkJCXRoaXMuZm9ybWF0dGVyLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9IDA7CisJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBleGl0TWVtYmVyQWxpZ25tZW50KEFsaWdubWVudCBhbGlnbm1lbnQpewogCQlBbGlnbm1lbnQgY3VycmVudCA9IHRoaXMubWVtYmVyQWxpZ25tZW50OwogCQl3aGlsZSAoY3VycmVudCAhPSBudWxsKXsKQEAgLTM2MSwyNSArODM3LDE4IEBACiAJCX0KIAkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gY3VycmVudC5sb2NhdGlvbi5vdXRwdXRJbmRlbnRhdGlvbkxldmVsOwogCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gY3VycmVudC5sb2NhdGlvbi5udW1iZXJPZkluZGVudGF0aW9uczsKLQkJdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGFsaWdubWVudC5sb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwkKKwkJdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGFsaWdubWVudC5sb2NhdGlvbi5sYXN0TG9jYWxEZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCQl0aGlzLm1lbWJlckFsaWdubWVudCA9IGN1cnJlbnQuZW5jbG9zaW5nOwogCX0KLQkKLQlwdWJsaWMgQWxpZ25tZW50IGdldEFsaWdubWVudChTdHJpbmcgbmFtZSl7Ci0JCWlmICh0aGlzLmN1cnJlbnRBbGlnbm1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY3VycmVudEFsaWdubWVudC5nZXRBbGlnbm1lbnQobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKiAKKworCS8qKgogCSAqIEFuc3dlciBhY3R1YWwgaW5kZW50YXRpb24gbGV2ZWwgYmFzZWQgb24gdHJ1ZSBjb2x1bW4gcG9zaXRpb24KIAkgKiBAcmV0dXJuIGludAogCSAqLwogCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZW50YXRpb25MZXZlbCgpIHsKIAkJcmV0dXJuIHRoaXMuY29sdW1uIC0gMTsKLQl9CQotCQorCX0KKwogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tbWVudEluZGV4KGludCBwb3NpdGlvbikgewogCQlpZiAodGhpcy5jb21tZW50UG9zaXRpb25zID09IG51bGwpCiAJCQlyZXR1cm4gLTE7CkBAIC00MDYsODcgKzg3NSwyMjEgQEAKIAkJcmV0dXJuIC0oZyArIDEpOwogCX0KIAotCXByaXZhdGUgaW50IGdldEN1cnJlbnRDb21tZW50T2Zmc2V0KGludCBzdGFydCkgeworCS8qCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNvbW1lbnQgaW5jbHVkaW5nIHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24KKyAgICAgKiBzdGFydGluZyB0aGUgc2VhcmNoIGZyb20gdGhlIGdpdmVuIHN0YXJ0IGluZGV4LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIHJlc2VhcmNoCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBjb21tZW50IGlmIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBsb2NhdGVkIGluc2lkZSBpdCwgLTEgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q29tbWVudEluZGV4KGludCBzdGFydCwgaW50IHBvc2l0aW9uKSB7CisgICAgCWludCBjb21tZW50c0xlbmd0aCA9IHRoaXMuY29tbWVudFBvc2l0aW9ucyA9PSBudWxsID8gMCA6IHRoaXMuY29tbWVudFBvc2l0aW9ucy5sZW5ndGg7CisgICAgCWlmIChjb21tZW50c0xlbmd0aCA9PSAwKSByZXR1cm4gLTE7CisgICAgCWlmIChwb3NpdGlvbiA9PSAwKSB7CisgICAgCQlpZiAoY29tbWVudHNMZW5ndGggPiAwICYmIHRoaXMuY29tbWVudFBvc2l0aW9uc1swXVswXT09IDApIHsKKyAgICAJCQlyZXR1cm4gMDsKKyAgICAJCX0KKyAgICAJCXJldHVybiAtMTsKKyAgICAJfQorICAgIAlpbnQgYm90dG9tID0gc3RhcnQsIHRvcCA9IGNvbW1lbnRzTGVuZ3RoIC0gMTsKKyAgICAJaW50IGkgPSAwOworICAgIAlpbnRbXSBjb21tZW50ID0gbnVsbDsKKyAgICAJd2hpbGUgKGJvdHRvbSA8PSB0b3ApIHsKKyAgICAJCWkgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvMjsKKyAgICAJCWNvbW1lbnQgPSB0aGlzLmNvbW1lbnRQb3NpdGlvbnNbaV07CisgICAgCQlpbnQgY29tbWVudFN0YXJ0ID0gY29tbWVudFswXTsKKyAgICAJCWlmIChjb21tZW50U3RhcnQgPCAwKSBjb21tZW50U3RhcnQgPSAtY29tbWVudFN0YXJ0OworICAgIAkJaWYgKHBvc2l0aW9uIDwgY29tbWVudFN0YXJ0KSB7CisgICAgCQkJdG9wID0gaS0xOworICAgIAkJfSBlbHNlIHsKKyAgICAJCQlpbnQgY29tbWVudEVuZCA9IGNvbW1lbnRbMV07CisgICAgCQkJaWYgKGNvbW1lbnRFbmQgPCAwKSBjb21tZW50RW5kID0gLWNvbW1lbnRFbmQ7CisgICAgCQkJaWYgKHBvc2l0aW9uID49IGNvbW1lbnRFbmQpIHsKKyAgICAJCQkJYm90dG9tID0gaSsxOworICAgIAkJCX0gZWxzZSB7CisgICAgCQkJCXJldHVybiBpOworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJfQorICAgIAlyZXR1cm4gLTE7CisgICAgfQorCisJcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudENvbW1lbnRJbmRlbnRhdGlvbihpbnQgc3RhcnQpIHsKIAkJaW50IGxpbmVQdHIgPSAtQXJyYXlzLmJpbmFyeVNlYXJjaCh0aGlzLmxpbmVFbmRzLCBzdGFydCk7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgYmVnaW5uaW5nT2ZMaW5lID0gdGhpcy5nZXRMaW5lRW5kKGxpbmVQdHIgLSAxKTsKKwkJaW50IGluZGVudGF0aW9uID0gMDsKKwkJaW50IGJlZ2lubmluZ09mTGluZSA9IGdldExpbmVFbmQobGluZVB0ciAtIDEpKzE7CiAJCWlmIChiZWdpbm5pbmdPZkxpbmUgPT0gLTEpIHsKIAkJCWJlZ2lubmluZ09mTGluZSA9IDA7CiAJCX0KIAkJaW50IGN1cnJlbnRTdGFydFBvc2l0aW9uID0gc3RhcnQ7Ci0JCWNoYXJbXSBzb3VyY2UgPSBzY2FubmVyLnNvdXJjZTsKKwkJY2hhcltdIHNvdXJjZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2U7CiAKIAkJLy8gZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBjb21tZW50CiAJCXdoaWxlIChiZWdpbm5pbmdPZkxpbmUgPiBjdXJyZW50U3RhcnRQb3NpdGlvbikgewogCQkJaWYgKGxpbmVQdHIgPiAwKSB7Ci0JCQkJYmVnaW5uaW5nT2ZMaW5lID0gdGhpcy5nZXRMaW5lRW5kKC0tbGluZVB0cik7CisJCQkJYmVnaW5uaW5nT2ZMaW5lID0gZ2V0TGluZUVuZCgtLWxpbmVQdHIpKzE7CiAJCQl9IGVsc2UgewogCQkJCWJlZ2lubmluZ09mTGluZSA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJZm9yIChpbnQgaSA9IGN1cnJlbnRTdGFydFBvc2l0aW9uIC0gMTsgaSA+PSBiZWdpbm5pbmdPZkxpbmUgOyBpLS0pIHsKKwkJZm9yIChpbnQgaT1iZWdpbm5pbmdPZkxpbmU7IGkgPCBjdXJyZW50U3RhcnRQb3NpdGlvbiA7IGkrKykgewogCQkJY2hhciBjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2ldOwogCQkJc3dpdGNoIChjdXJyZW50Q2hhcmFjdGVyKSB7CiAJCQkJY2FzZSAnXHQnIDoKLQkJCQkJb2Zmc2V0ICs9IHRoaXMudGFiTGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcgJyA6Ci0JCQkJCW9mZnNldCsrOworCQkJCQlpZiAodGhpcy50YWJMZW5ndGggIT0gMCkgeworCQkJCQkJaW50IHJlbWluZGVyID0gaW5kZW50YXRpb24gJSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCWlmIChyZW1pbmRlciA9PSAwKSB7CisJCQkJCQkJaW5kZW50YXRpb24gKz0gdGhpcy50YWJMZW5ndGg7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWluZGVudGF0aW9uID0gKChpbmRlbnRhdGlvbiAvIHRoaXMudGFiTGVuZ3RoKSArIDEpICogdGhpcy50YWJMZW5ndGg7CisJCQkJCQl9CisJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnXHInIDoKIAkJCQljYXNlICdcbicgOgorCQkJCQlpbmRlbnRhdGlvbiA9IDA7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBvZmZzZXQ7CisJCQkJCWluZGVudGF0aW9uKys7CisJCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCXJldHVybiBvZmZzZXQ7CisJCXJldHVybiBpbmRlbnRhdGlvbjsKKwl9CisKKwlpbnQgZ2V0Q3VycmVudEluZGVudGF0aW9uKGNoYXJbXSB3aGl0ZXNwYWNlcywgaW50IG9mZnNldCkgeworCQlpZiAod2hpdGVzcGFjZXMgPT0gbnVsbCkgcmV0dXJuIG9mZnNldDsKKwkJaW50IGxlbmd0aCA9IHdoaXRlc3BhY2VzLmxlbmd0aDsKKwkJaWYgKHRoaXMudGFiTGVuZ3RoID09IDApIHJldHVybiBsZW5ndGg7CisJCWludCBpbmRlbnRhdGlvbiA9IG9mZnNldDsKKwkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisJCQljaGFyIGNoID0gd2hpdGVzcGFjZXNbaV07CisJCQlzd2l0Y2ggKGNoKSB7CisJCQkJY2FzZSAnXHQnIDoKKwkJCQkJaW50IHJlbWluZGVyID0gaW5kZW50YXRpb24gJSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJaWYgKHJlbWluZGVyID09IDApIHsKKwkJCQkJCWluZGVudGF0aW9uICs9IHRoaXMudGFiTGVuZ3RoOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW5kZW50YXRpb24gPSAoKGluZGVudGF0aW9uIC8gdGhpcy50YWJMZW5ndGgpICsgMSkgKiB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICdccicgOgorCQkJCWNhc2UgJ1xuJyA6CisJCQkJCWluZGVudGF0aW9uID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJaW5kZW50YXRpb24rKzsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGluZGVudGF0aW9uOworCX0KKworCWludCBnZXRDdXJyZW50SW5kZW50YXRpb24oaW50IHN0YXJ0KSB7CisJCWludCBsaW5lUHRyID0gQXJyYXlzLmJpbmFyeVNlYXJjaCh0aGlzLmxpbmVFbmRzLCBzdGFydCk7CisJCWlmIChsaW5lUHRyIDwgMCkgeworCQkJbGluZVB0ciA9IC1saW5lUHRyIC0gMTsKKwkJfQorCQlpbnQgaW5kZW50YXRpb24gPSAwOworCQlpbnQgYmVnaW5uaW5nT2ZMaW5lID0gZ2V0TGluZUVuZChsaW5lUHRyKSsxOworCQlpZiAoYmVnaW5uaW5nT2ZMaW5lID09IC0xKSB7CisJCQliZWdpbm5pbmdPZkxpbmUgPSAwOworCQl9CisJCWNoYXJbXSBzb3VyY2UgPSB0aGlzLnNjYW5uZXIuc291cmNlOworCisJCWZvciAoaW50IGk9YmVnaW5uaW5nT2ZMaW5lOyBpPHN0YXJ0OyBpKyspIHsKKwkJCWNoYXIgY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtpXTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXJhY3RlcikgeworCQkJCWNhc2UgJ1x0JyA6CisJCQkJCWlmICh0aGlzLnRhYkxlbmd0aCAhPSAwKSB7CisJCQkJCQlpbnQgcmVtaW5kZXIgPSBpbmRlbnRhdGlvbiAlIHRoaXMudGFiTGVuZ3RoOworCQkJCQkJaWYgKHJlbWluZGVyID09IDApIHsKKwkJCQkJCQlpbmRlbnRhdGlvbiArPSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaW5kZW50YXRpb24gPSAoKGluZGVudGF0aW9uIC8gdGhpcy50YWJMZW5ndGgpICsgMSkgKiB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICdccicgOgorCQkJCWNhc2UgJ1xuJyA6CisJCQkJCWluZGVudGF0aW9uID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnICc6CisJCQkJCWluZGVudGF0aW9uKys7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBpbmRlbnRhdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5kZW50YXRpb247CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXRFbXB0eUxpbmVzKGludCBsaW5lc051bWJlcikgewogCQlpZiAodGhpcy5ubHNUYWdDb3VudGVyID4gMCkgewogCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwogCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChsYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAwKSB7CisJCVN0cmluZyBlbXB0eUxpbmVzOworCQlpZiAodGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAwKSB7CiAJCQlsaW5lc051bWJlcisrOyAvLyBhZGQgYW4gZXh0cmEgbGluZSBicmVha3MKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXNOdW1iZXI7IGkrKykgewotCQkJCWlmIChpbmRlbnRFbXB0eUxpbmVzKSBwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoYnVmZmVyKTsKLQkJCQlidWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQlpZiAodGhpcy5pbmRlbnRFbXB0eUxpbmVzKSB7CisJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzTnVtYmVyOyBpKyspIHsKKwkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMudGVtcEJ1ZmZlcik7CisJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkJCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJCX0KKwkJCQllbXB0eUxpbmVzID0gdGhpcy50ZW1wQnVmZmVyLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCWVtcHR5TGluZXMgPSBnZXROZXdMaW5lU3RyaW5nKGxpbmVzTnVtYmVyKTsKIAkJCX0KLQkJCWxhc3ROdW1iZXJPZk5ld0xpbmVzICs9IGxpbmVzTnVtYmVyOwotCQkJbGluZSArPSBsaW5lc051bWJlcjsKLQkJCWNvbHVtbiA9IDE7Ci0JCQluZWVkU3BhY2UgPSBmYWxzZTsKKwkJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgKz0gbGluZXNOdW1iZXI7CisJCQl0aGlzLmxpbmUgKz0gbGluZXNOdW1iZXI7CisJCQl0aGlzLmNvbHVtbiA9IDE7CisJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwogCQkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChsYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAxKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzTnVtYmVyOyBpKyspIHsKLQkJCQlpZiAoaW5kZW50RW1wdHlMaW5lcykgcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KGJ1ZmZlcik7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQl9IGVsc2UgaWYgKHRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPT0gMSkgeworCQkJaWYgKHRoaXMuaW5kZW50RW1wdHlMaW5lcykgeworCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lc051bWJlcjsgaSsrKSB7CisJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQl9CisJCQkJZW1wdHlMaW5lcyA9IHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpOworCQkJfSBlbHNlIHsKKwkJCQllbXB0eUxpbmVzID0gZ2V0TmV3TGluZVN0cmluZyhsaW5lc051bWJlcik7CiAJCQl9Ci0JCQlsYXN0TnVtYmVyT2ZOZXdMaW5lcyArPSBsaW5lc051bWJlcjsKLQkJCWxpbmUgKz0gbGluZXNOdW1iZXI7Ci0JCQljb2x1bW4gPSAxOwotCQkJbmVlZFNwYWNlID0gZmFsc2U7CisJCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzICs9IGxpbmVzTnVtYmVyOworCQkJdGhpcy5saW5lICs9IGxpbmVzTnVtYmVyOworCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJdGhpcy5uZWVkU3BhY2UgPSBmYWxzZTsKIAkJCXRoaXMucGVuZGluZ1NwYWNlID0gZmFsc2U7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoKGxhc3ROdW1iZXJPZk5ld0xpbmVzIC0gMSkgPj0gbGluZXNOdW1iZXIpIHsKKwkJCWlmICgodGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyAtIDEpID49IGxpbmVzTnVtYmVyKSB7CiAJCQkJLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgbmV3IGxpbmVzCiAJCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwogCQkJfQotCQkJZmluYWwgaW50IHJlYWxOZXdMaW5lTnVtYmVyID0gbGluZXNOdW1iZXIgLSBsYXN0TnVtYmVyT2ZOZXdMaW5lcyArIDE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWxOZXdMaW5lTnVtYmVyOyBpKyspIHsKLQkJCQlpZiAoaW5kZW50RW1wdHlMaW5lcykgcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KGJ1ZmZlcik7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJZmluYWwgaW50IHJlYWxOZXdMaW5lTnVtYmVyID0gbGluZXNOdW1iZXIgLSB0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzICsgMTsKKwkJCWlmICh0aGlzLmluZGVudEVtcHR5TGluZXMpIHsKKwkJCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVhbE5ld0xpbmVOdW1iZXI7IGkrKykgeworCQkJCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy50ZW1wQnVmZmVyKTsKKwkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCQl0aGlzLmNvbHVtbiA9IDE7CisJCQkJfQorCQkJCWVtcHR5TGluZXMgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCX0gZWxzZSB7CisJCQkJZW1wdHlMaW5lcyA9IGdldE5ld0xpbmVTdHJpbmcocmVhbE5ld0xpbmVOdW1iZXIpOwogCQkJfQotCQkJbGFzdE51bWJlck9mTmV3TGluZXMgKz0gcmVhbE5ld0xpbmVOdW1iZXI7Ci0JCQlsaW5lICs9IHJlYWxOZXdMaW5lTnVtYmVyOwotCQkJY29sdW1uID0gMTsKLQkJCW5lZWRTcGFjZSA9IGZhbHNlOworCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyArPSByZWFsTmV3TGluZU51bWJlcjsKKwkJCXRoaXMubGluZSArPSByZWFsTmV3TGluZU51bWJlcjsKKwkJCXRoaXMuY29sdW1uID0gMTsKKwkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CiAJCQl0aGlzLnBlbmRpbmdTcGFjZSA9IGZhbHNlOwogCQl9Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOworCQlyZXR1cm4gZW1wdHlMaW5lczsKIAl9CiAKIAlwdWJsaWMgT3B0aW1pemVkUmVwbGFjZUVkaXQgZ2V0TGFzdEVkaXQoKSB7CkBAIC00OTUsMzggKzEwOTgsNTUgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgZmluYWwgaW50IGdldExpbmVFbmQoaW50IGxpbmVOdW1iZXIpIHsKLQkJaWYgKHRoaXMubGluZUVuZHMgPT0gbnVsbCkgCisJCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwpCiAJCQlyZXR1cm4gLTE7Ci0JCWlmIChsaW5lTnVtYmVyID49IHRoaXMubGluZUVuZHMubGVuZ3RoICsgMSkgCisJCWlmIChsaW5lTnVtYmVyID49IHRoaXMubGluZUVuZHMubGVuZ3RoICsgMSkKIAkJCXJldHVybiB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbjsKLQkJaWYgKGxpbmVOdW1iZXIgPD0gMCkgCisJCWlmIChsaW5lTnVtYmVyIDw9IDApCiAJCQlyZXR1cm4gLTE7Ci0JCXJldHVybiB0aGlzLmxpbmVFbmRzW2xpbmVOdW1iZXItMV07IC8vIG5leHQgbGluZSBzdGFydCBvbmUgY2hhcmFjdGVyIGJlaGluZCB0aGUgbGluZUVuZCBvZiB0aGUgcHJldmlvdXMgbGluZQkKKwkJcmV0dXJuIHRoaXMubGluZUVuZHNbbGluZU51bWJlci0xXTsgLy8gbmV4dCBsaW5lIHN0YXJ0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBsaW5lRW5kIG9mIHRoZSBwcmV2aW91cyBsaW5lCiAJfQotCQorCiAJQWxpZ25tZW50IGdldE1lbWJlckFsaWdubWVudCgpIHsKIAkJcmV0dXJuIHRoaXMubWVtYmVyQWxpZ25tZW50OwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgZ2V0TmV3TGluZSgpIHsKIAkJaWYgKHRoaXMubmxzVGFnQ291bnRlciA+IDApIHsKIAkJCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKIAkJfQotCQlpZiAobGFzdE51bWJlck9mTmV3TGluZXMgPj0gMSkgewotCQkJY29sdW1uID0gMTsgLy8gZW5zdXJlIHRoYXQgdGhlIHNjcmliZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IGxpbmUKKwkJaWYgKHRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPj0gMSkgeworCQkJdGhpcy5jb2x1bW4gPSAxOyAvLyBlbnN1cmUgdGhhdCB0aGUgc2NyaWJlIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbGluZQogCQkJcmV0dXJuIFV0aWwuRU1QVFlfU1RSSU5HOwogCQl9Ci0JCWxpbmUrKzsKLQkJbGFzdE51bWJlck9mTmV3TGluZXMgPSAxOwotCQljb2x1bW4gPSAxOwotCQluZWVkU3BhY2UgPSBmYWxzZTsKKwkJdGhpcy5saW5lKys7CisJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPSAxOworCQl0aGlzLmNvbHVtbiA9IDE7CisJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CiAJCXRoaXMucGVuZGluZ1NwYWNlID0gZmFsc2U7CiAJCXJldHVybiB0aGlzLmxpbmVTZXBhcmF0b3I7CiAJfQogCi0JLyoqIAorCXByaXZhdGUgU3RyaW5nIGdldE5ld0xpbmVTdHJpbmcoaW50IGxpbmVzQ291bnQpIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMubmV3RW1wdHlMaW5lcy5sZW5ndGg7CisJCWlmIChsaW5lc0NvdW50ID4gbGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubmV3RW1wdHlMaW5lcywgMCwgdGhpcy5uZXdFbXB0eUxpbmVzID0gbmV3IFN0cmluZ1tsaW5lc0NvdW50KzEwXSwgMCwgbGVuZ3RoKTsKKwkJfQorCQlTdHJpbmcgbmV3TGluZVN0cmluZyA9IHRoaXMubmV3RW1wdHlMaW5lc1tsaW5lc0NvdW50LTFdOworCQlpZiAobmV3TGluZVN0cmluZyA9PSBudWxsKSB7CisJCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJZm9yIChpbnQgaj0wOyBqPGxpbmVzQ291bnQ7IGorKykgeworCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkJCX0KKwkJCW5ld0xpbmVTdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCXRoaXMubmV3RW1wdHlMaW5lc1tsaW5lc0NvdW50LTFdID0gbmV3TGluZVN0cmluZzsKKwkJfQorCQlyZXR1cm4gbmV3TGluZVN0cmluZzsKKwl9CisKKwkvKioKIAkgKiBBbnN3ZXIgbmV4dCBpbmRlbnRhdGlvbiBsZXZlbCBiYXNlZCBvbiBjb2x1bW4gZXN0aW1hdGVkIHBvc2l0aW9uCiAJICogKGlmIGNvbHVtbiBpcyBub3QgaW5kZW50ZWQsIHRoZW4gdXNlIGluZGVudGF0aW9uTGV2ZWwpCiAJICovCkBAIC01MzgsNDkgKzExNTgsMTk3IEBACiAJCQlpZiAodGhpcy51c2VUYWJzT25seUZvckxlYWRpbmdJbmRlbnRzKSB7CiAJCQkJcmV0dXJuIGluZGVudDsKIAkJCX0KKwkJCWlmICh0aGlzLmluZGVudGF0aW9uU2l6ZSA9PSAwKSB7CisJCQkJcmV0dXJuIGluZGVudDsKKwkJCX0KIAkJCWludCByZW0gPSBpbmRlbnQgJSB0aGlzLmluZGVudGF0aW9uU2l6ZTsKIAkJCWludCBhZGRpdGlvbiA9IHJlbSA9PSAwID8gMCA6IHRoaXMuaW5kZW50YXRpb25TaXplIC0gcmVtOyAvLyByb3VuZCB0byBzdXBlcmlvcgogCQkJcmV0dXJuIGluZGVudCArIGFkZGl0aW9uOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGluZGVudDsKIAkJfQorCQlyZXR1cm4gaW5kZW50OwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGdldFByZXNlcnZlRW1wdHlMaW5lcyhpbnQgY291bnQpIHsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSAhPSAwKSB7Ci0JCQkJaW50IGxpbmVzVG9QcmVzZXJ2ZSA9IE1hdGgubWluKGNvdW50LCB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmUpOwotCQkJCXJldHVybiB0aGlzLmdldEVtcHR5TGluZXMobGluZXNUb1ByZXNlcnZlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGdldE5ld0xpbmUoKTsKKwkvKgorCSAqIFByZXNlcnZlIGVtcHR5IGxpbmVzIGRlcGVuZGluZyBvbiBnaXZlbiBjb3VudCBhbmQgcHJlZmVyZW5jZXMuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlc2VydmVFbXB0eUxpbmVzKGludCBjb3VudCwgaW50IGVtcHR5TGluZXNSdWxlcykgeworCQlpZiAoY291bnQgPT0gMCkgeworCQkJaW50IGN1cnJlbnRJbmRlbnRhdGlvbkxldmVsID0gdGhpcy5pbmRlbnRhdGlvbkxldmVsOworCQkJaW50IHVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gPSB1c2VBbGlnbm1lbnRCcmVha0luZGVudGF0aW9uKGVtcHR5TGluZXNSdWxlcyk7CisJCQlzd2l0Y2ggKHVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24pIHsKKwkJCQljYXNlIFBSRVNFUlZFX0VNUFRZX0xJTkVTX0RPX05PVF9VU0VfQU5ZX0lOREVOVEFUSU9OOgorCQkJCQlyZXR1cm4gVXRpbC5FTVBUWV9TVFJJTkc7CisJCQkJZGVmYXVsdDoKKwkJCQkJLy8gUmV0dXJuIHRoZSBuZXcgaW5kZW50ZWQgbGluZQorCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXROZXdMaW5lKCkpOworCQkJCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoYnVmZmVyKTsKKwkJCQkJaWYgKHVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gPT0gUFJFU0VSVkVfRU1QVFlfTElORVNfVVNFX1RFTVBPUkFSWV9JTkRFTlRBVElPTikgeworCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gY3VycmVudEluZGVudGF0aW9uTGV2ZWw7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCQkJfQogCQl9Ci0JCXJldHVybiBVdGlsLkVNUFRZX1NUUklORzsKKwkJaWYgKHRoaXMuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzID49IDApIHsKKwkJCXVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24oZW1wdHlMaW5lc1J1bGVzKTsKKwkJCXJldHVybiBnZXRFbXB0eUxpbmVzKHRoaXMuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzKTsKKwkJfQorCQlpZiAodGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlICE9IDApIHsKKwkJCXVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24oZW1wdHlMaW5lc1J1bGVzKTsKKwkJCWludCBsaW5lc1RvUHJlc2VydmUgPSBNYXRoLm1pbihjb3VudCwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlKTsKKwkJCXJldHVybiBnZXRFbXB0eUxpbmVzKGxpbmVzVG9QcmVzZXJ2ZSk7CisJCX0KKwkJcmV0dXJuIGdldE5ld0xpbmUoKTsKIAl9Ci0JCisJcHJpdmF0ZSBpbnQgdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbihpbnQgZW1wdHlMaW5lc1J1bGVzKSB7CisJCS8vIHByZXNlcnZlIGxpbmUgYnJlYWtzIGluIHdyYXBwaW5nIGlmIHNwZWNpZmllZAorCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgwNzQKKwkJYm9vbGVhbiBzcGVjaWZpY0VtcHR5TGluZXNSdWxlID0gZW1wdHlMaW5lc1J1bGVzICE9IFBSRVNFUlZFX0VNUFRZX0xJTkVTX0tFRVBfTEFTVF9ORVdfTElORVNfSU5ERU5UQVRJT047CisJCWlmICgodGhpcy5jdXJyZW50QWxpZ25tZW50ICE9IG51bGwgfHwgc3BlY2lmaWNFbXB0eUxpbmVzUnVsZSkgJiYgIXRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmpvaW5fd3JhcHBlZF9saW5lcykgeworCQkJLy8gaW5zZXJ0IGEgbmV3IGxpbmUgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gYWxyZWFkeSBkb25lIGJlZm9yZQorCQkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzNDc2CisJCQlpZiAodGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAwIHx8IHNwZWNpZmljRW1wdHlMaW5lc1J1bGUgfHwgdGhpcy5mb3JtYXR0ZXIuYXJyYXlJbml0aWFsaXplcnNEZXB0aCA+PSAwKSB7CisJCQkJCisJCQkJLy8gRG8gbm90IHVzZSBhbGlnbm1lbnQgYnJlYWsgaW5kZW50YXRpb24gaW4gc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworCQkJCWJvb2xlYW4gdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbjsKKwkJCQlib29sZWFuIHVzZUFsaWdubWVudFNoaWZ0QnJlYWtJbmRlbnRhdGlvbiA9IGZhbHNlOworCQkJCWJvb2xlYW4gdXNlTGFzdEJpbmFyeUV4cHJlc3Npb25BbGlnbm1lbnRCcmVha0luZGVudGF0aW9uID0gZmFsc2U7CisJCQkJc3dpdGNoIChlbXB0eUxpbmVzUnVsZXMpIHsKKwkJCQkJY2FzZSBET19OT1RfUFJFU0VSVkVfRU1QVFlfTElORVM6CisJCQkJCWNhc2UgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fU1dJVENIX0NBU0U6CisJCQkJCWNhc2UgUFJFU0VSVkVfRU1QVFlfTElORVNfQVRfRU5EX09GX01FVEhPRF9ERUNMQVJBVElPTjoKKwkJCQkJY2FzZSBQUkVTRVJWRV9FTVBUWV9MSU5FU19BVF9FTkRfT0ZfQkxPQ0s6CisJCQkJCQlyZXR1cm4gUFJFU0VSVkVfRU1QVFlfTElORVNfRE9fTk9UX1VTRV9BTllfSU5ERU5UQVRJT047CisJCQkJCWNhc2UgUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fQklOQVJZX0VYUFJFU1NJT046CisJCQkJCQl1c2VBbGlnbm1lbnRCcmVha0luZGVudGF0aW9uID0gdHJ1ZTsKKwkJCQkJCWlmICgodGhpcy5mb3JtYXR0ZXIuZXhwcmVzc2lvbnNQb3MgJiBDb2RlRm9ybWF0dGVyVmlzaXRvci5FWFBSRVNTSU9OU19QT1NfTUFTSykgPT0gQ29kZUZvcm1hdHRlclZpc2l0b3IuRVhQUkVTU0lPTlNfUE9TX0JFVFdFRU5fVFdPKSB7CisJCQkJCQkJLy8gd2UncmUganVzdCBiZWZvcmUgdGhlIGxlZnQgZXhwcmVzc2lvbiwgdHJ5IHRvIHVzZSB0aGUgbGFzdAorCQkJCQkJCS8vIGJpbmFyeSBleHByZXNzaW9uIGJyZWFrIGluZGVudGF0aW9uIGlmIGFueQorCQkJCQkJCXVzZUxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9IHRydWU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBQUkVTRVJWRV9FTVBUWV9MSU5FU19JTl9FUVVBTElUWV9FWFBSRVNTSU9OOgorCQkJCQkJdXNlQWxpZ25tZW50U2hpZnRCcmVha0luZGVudGF0aW9uID0gdGhpcy5jdXJyZW50QWxpZ25tZW50ID09IG51bGwgfHwgdGhpcy5jdXJyZW50QWxpZ25tZW50LmtpbmQgPT0gQWxpZ25tZW50LkJJTkFSWV9FWFBSRVNTSU9OOworCQkJCQkJdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9ICF1c2VBbGlnbm1lbnRTaGlmdEJyZWFrSW5kZW50YXRpb247CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBQUkVTRVJWRV9FTVBUWV9MSU5FU19JTl9GT1JNQVRfT1BFTklOR19CUkFDRToKKwkJCQkJCXVzZUFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gPSB0aGlzLmZvcm1hdHRlci5hcnJheUluaXRpYWxpemVyc0RlcHRoIDw9IDEKKwkJCQkJCQkmJiB0aGlzLmN1cnJlbnRBbGlnbm1lbnQgIT0gbnVsbAorCQkJCQkJCSYmIHRoaXMuY3VycmVudEFsaWdubWVudC5raW5kID09IEFsaWdubWVudC5BUlJBWV9JTklUSUFMSVpFUjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFBSRVNFUlZFX0VNUFRZX0xJTkVTX0lOX0ZPUk1BVF9MRUZUX0NVUkxZX0JSQUNFOgorCQkJCQkJdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9IGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoKGVtcHR5TGluZXNSdWxlcyAmIDB4RkZGRikgPT0gUFJFU0VSVkVfRU1QVFlfTElORVNfSU5fQ0xPU0lOR19BUlJBWV9JTklUSUFMSVpFUiAmJiB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnfScgKSB7CisJCQkJCQkJLy8gbGFzdCBhcnJheSBpbml0aWFsaXplciBjbG9zaW5nIGJyYWNlCisJCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gZW1wdHlMaW5lc1J1bGVzID4+IDE2OworCQkJCQkJCXRoaXMucHJlc2VydmVMaW5lQnJlYWtJbmRlbnRhdGlvbiA9IHRydWU7CisJCQkJCQkJcmV0dXJuIFBSRVNFUlZFX0VNUFRZX0xJTkVTX1VTRV9DVVJSRU5UX0lOREVOVEFUSU9OOworCQkJCQkJfQorCQkJCQkJdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbiA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBJZiB0aGVyZSdzIGFuIGFsaWdubWVudCB0cnkgdG8gYWxpZ24gb24gaXRzIGJyZWFrIGluZGVudGF0aW9uIGxldmVsCisJCQkJQWxpZ25tZW50IGFsaWdubWVudCA9IHRoaXMuY3VycmVudEFsaWdubWVudDsKKwkJCQlpZiAoYWxpZ25tZW50ID09IG51bGwpIHsKKwkJCQkJaWYgKHVzZUxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCA8IHRoaXMuZm9ybWF0dGVyLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMuZm9ybWF0dGVyLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodXNlQWxpZ25tZW50U2hpZnRCcmVha0luZGVudGF0aW9uICYmIHRoaXMubWVtYmVyQWxpZ25tZW50ICE9IG51bGwpIHsKKwkJCQkJCWlmICh0aGlzLmluZGVudGF0aW9uTGV2ZWwgPCB0aGlzLm1lbWJlckFsaWdubWVudC5zaGlmdEJyZWFrSW5kZW50YXRpb25MZXZlbCkgeworCQkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMubWVtYmVyQWxpZ25tZW50LnNoaWZ0QnJlYWtJbmRlbnRhdGlvbkxldmVsOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gVXNlIHRoZSBtZW1iZXIgYWxpZ25tZW50IGJyZWFrIGluZGVudGF0aW9uIGxldmVsIHdoZW4KKwkJCQkJLy8gaXQncyBjbG9zZXIgZnJvbSB0aGUgd3JhcHBlZCBsaW5lIHRoYW4gdGhlIGN1cnJlbnQgYWxpZ25tZW50CisJCQkJCWlmICh0aGlzLm1lbWJlckFsaWdubWVudCAhPSBudWxsICYmIHRoaXMubWVtYmVyQWxpZ25tZW50LmxvY2F0aW9uLmlucHV0T2Zmc2V0ID4gYWxpZ25tZW50LmxvY2F0aW9uLmlucHV0T2Zmc2V0KSB7CisJCQkJCQlhbGlnbm1lbnQgPSB0aGlzLm1lbWJlckFsaWdubWVudDsKKwkJCQkJfQorCisJCQkJCS8vIFVzZSB0aGUgYnJlYWsgaW5kZW50YXRpb24gbGV2ZWwgaWYgcG9zc2libGUuLi4KKwkJCQkJaWYgKHVzZUxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCA8IHRoaXMuZm9ybWF0dGVyLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMuZm9ybWF0dGVyLmxhc3RCaW5hcnlFeHByZXNzaW9uQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCA8IGFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWwpIHsKKwkJCQkJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBhbGlnbm1lbnQuYnJlYWtJbmRlbnRhdGlvbkxldmVsOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKHVzZUFsaWdubWVudFNoaWZ0QnJlYWtJbmRlbnRhdGlvbikgeworCQkJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCA8IGFsaWdubWVudC5zaGlmdEJyZWFrSW5kZW50YXRpb25MZXZlbCkgeworCQkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IGFsaWdubWVudC5zaGlmdEJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLnByZXNlcnZlTGluZUJyZWFrSW5kZW50YXRpb24gPSB0cnVlOworCQkJCWlmICh1c2VMYXN0QmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudEJyZWFrSW5kZW50YXRpb24gfHwgdXNlQWxpZ25tZW50U2hpZnRCcmVha0luZGVudGF0aW9uKSB7CisJCQkJCXJldHVybiBQUkVTRVJWRV9FTVBUWV9MSU5FU19VU0VfVEVNUE9SQVJZX0lOREVOVEFUSU9OOworCQkJCX0KKwkJCQlyZXR1cm4gUFJFU0VSVkVfRU1QVFlfTElORVNfVVNFX0NVUlJFTlRfSU5ERU5UQVRJT047CisJCQl9CisJCX0KKwkJcmV0dXJuIFBSRVNFUlZFX0VNUFRZX0xJTkVTX0RPX05PVF9VU0VfQU5ZX0lOREVOVEFUSU9OOworCX0KKwogCXB1YmxpYyBUZXh0RWRpdCBnZXRSb290RWRpdCgpIHsKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODU0MQorCQlhZGFwdFJlZ2lvbnMoKTsKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDU4MworCQlhZGFwdEVkaXRzKCk7CisKIAkJTXVsdGlUZXh0RWRpdCBlZGl0ID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHRoaXMudGV4dFJlZ2lvbkVuZCAtIHRoaXMudGV4dFJlZ2lvblN0YXJ0ICsgMTsKLQkJaWYgKHRoaXMudGV4dFJlZ2lvblN0YXJ0IDw9IDApIHsKKwkJaW50IHJlZ2lvbnNMZW5ndGggPSB0aGlzLmFkYXB0ZWRSZWdpb25zLmxlbmd0aDsKKwkJaW50IHRleHRSZWdpb25TdGFydDsKKwkJaW50IHRleHRSZWdpb25FbmQ7CisJCWlmIChyZWdpb25zTGVuZ3RoID09IDEpIHsKKwkJCUlSZWdpb24gbGFzdFJlZ2lvbiA9IHRoaXMuYWRhcHRlZFJlZ2lvbnNbMF07CisJCQl0ZXh0UmVnaW9uU3RhcnQgPSBsYXN0UmVnaW9uLmdldE9mZnNldCgpOworCQkJdGV4dFJlZ2lvbkVuZCA9IHRleHRSZWdpb25TdGFydCArIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7CisJCX0gZWxzZSB7CisJCQl0ZXh0UmVnaW9uU3RhcnQgPSB0aGlzLmFkYXB0ZWRSZWdpb25zWzBdLmdldE9mZnNldCgpOworCQkJSVJlZ2lvbiBsYXN0UmVnaW9uID0gdGhpcy5hZGFwdGVkUmVnaW9uc1tyZWdpb25zTGVuZ3RoIC0gMV07CisJCQl0ZXh0UmVnaW9uRW5kID0gbGFzdFJlZ2lvbi5nZXRPZmZzZXQoKSArIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7CisJCX0KKworCQlpbnQgbGVuZ3RoID0gdGV4dFJlZ2lvbkVuZCAtIHRleHRSZWdpb25TdGFydCArIDE7CisJCWlmICh0ZXh0UmVnaW9uU3RhcnQgPD0gMCkgewogCQkJaWYgKGxlbmd0aCA8PSAwKSB7CiAJCQkJZWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KDAsIDApOwogCQkJfSBlbHNlIHsKLQkJCQllZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoMCwgdGhpcy50ZXh0UmVnaW9uRW5kICsgMSk7CisJCQkJZWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KDAsIHRleHRSZWdpb25FbmQpOwogCQkJfQogCQl9IGVsc2UgewotCQkJZWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KHRoaXMudGV4dFJlZ2lvblN0YXJ0LCB0aGlzLnRleHRSZWdpb25FbmQgLSB0aGlzLnRleHRSZWdpb25TdGFydCArIDEpOworCQkJZWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KHRleHRSZWdpb25TdGFydCwgbGVuZ3RoIC0gMSk7CiAJCX0KIAkJZm9yIChpbnQgaT0gMCwgbWF4ID0gdGhpcy5lZGl0c0luZGV4OyBpIDwgbWF4OyBpKyspIHsKLQkJCU9wdGltaXplZFJlcGxhY2VFZGl0IGN1cnJlbnRFZGl0ID0gZWRpdHNbaV07Ci0JCQlpZiAoaXNWYWxpZEVkaXQoY3VycmVudEVkaXQpKSB7Ci0JCQkJZWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoY3VycmVudEVkaXQub2Zmc2V0LCBjdXJyZW50RWRpdC5sZW5ndGgsIGN1cnJlbnRFZGl0LnJlcGxhY2VtZW50KSk7CisJCQlPcHRpbWl6ZWRSZXBsYWNlRWRpdCBjdXJyZW50RWRpdCA9IHRoaXMuZWRpdHNbaV07CisJCQlpZiAoY3VycmVudEVkaXQub2Zmc2V0ID49IDAgJiYgY3VycmVudEVkaXQub2Zmc2V0IDw9IHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uKSB7CisJCQkJaWYgKGN1cnJlbnRFZGl0Lmxlbmd0aCA9PSAwIHx8IChjdXJyZW50RWRpdC5vZmZzZXQgIT0gdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gJiYgaXNNZWFuaW5nZnVsRWRpdChjdXJyZW50RWRpdCkpKSB7CisJCQkJCXRyeSB7CisJCQkJCQllZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChjdXJyZW50RWRpdC5vZmZzZXQsIGN1cnJlbnRFZGl0Lmxlbmd0aCwgY3VycmVudEVkaXQucmVwbGFjZW1lbnQpKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gbG9nIGV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yCisJCQkJCQlDb21tZW50Rm9ybWF0dGVyVXRpbC5sb2coZXgpOworCSAJCQkJCXRocm93IGV4OworCQkJCQl9CisJCQkJfQogCQkJfQogCQl9CiAJCXRoaXMuZWRpdHMgPSBudWxsOwogCQlyZXR1cm4gZWRpdDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBoYW5kbGVMaW5lVG9vTG9uZygpIHsKKwkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQpIHsKKwkJCWhhbmRsZUxpbmVUb29Mb25nU21hcnRseSgpOworCQkJcmV0dXJuOworCQl9CiAJCS8vIHNlYXJjaCBmb3IgY2xvc2VzdCBicmVha2FibGUgYWxpZ25tZW50LCB1c2luZyB0aWVicmVhayBydWxlcwogCQkvLyBsb29rIGZvciBvdXRlcm1vc3QgYnJlYWthYmxlIG9uZQogCQlpbnQgcmVsYXRpdmVEZXB0aCA9IDAsIG91dGVyTW9zdERlcHRoID0gLTE7CkBAIC02MDgsNiArMTM3Niw3OSBAQAogCQkvLyBkaWQgbm90IGZpbmQgYW55IGJyZWFrYWJsZSBsb2NhdGlvbiAtIHByb2NlZWQKIAl9CiAKKwlwcml2YXRlIHZvaWQgaGFuZGxlTGluZVRvb0xvbmdTbWFydGx5KCkgeworCQkvLyBzZWFyY2ggZm9yIGNsb3Nlc3QgYnJlYWthYmxlIGFsaWdubWVudCwgdXNpbmcgdGllYnJlYWsgcnVsZXMKKwkJLy8gbG9vayBmb3Igb3V0ZXJtb3N0IGJyZWFrYWJsZSBvbmUKKwkJaW50IHJlbGF0aXZlRGVwdGggPSAwLCBvdXRlck1vc3REZXB0aCA9IC0xOworCQlBbGlnbm1lbnQgdGFyZ2V0QWxpZ25tZW50ID0gdGhpcy5jdXJyZW50QWxpZ25tZW50OworCQlpbnQgcHJldmlvdXNLaW5kID0gLTE7CisJCWludCBpbnNpZGVNZXNzYWdlID0gMDsKKwkJYm9vbGVhbiBpbnNpZGVTdHJpbmdDb25jYXQgPSBmYWxzZTsKKwkJd2hpbGUgKHRhcmdldEFsaWdubWVudCAhPSBudWxsKXsKKwkJCWJvb2xlYW4gY291bGRCcmVhayA9IHRhcmdldEFsaWdubWVudC50aWVCcmVha1J1bGUgPT0gQWxpZ25tZW50LlJfT1VURVJNT1NUIHx8CisJCQkJKCFpbnNpZGVTdHJpbmdDb25jYXQgJiYKKwkJCQkJCWluc2lkZU1lc3NhZ2UgPiAwICYmIHRhcmdldEFsaWdubWVudC5raW5kID09IEFsaWdubWVudC5NRVNTQUdFX0FSR1VNRU5UUyAmJgorCQkJCQkJKCF0YXJnZXRBbGlnbm1lbnQud2FzUmVzZXQoKSB8fCBwcmV2aW91c0tpbmQgIT0gQWxpZ25tZW50Lk1FU1NBR0VfU0VORCkpOworCQkJaWYgKGNvdWxkQnJlYWsgJiYgdGFyZ2V0QWxpZ25tZW50LmNvdWxkQnJlYWsoKSl7CisJCQkJb3V0ZXJNb3N0RGVwdGggPSByZWxhdGl2ZURlcHRoOworCQkJfQorCQkJc3dpdGNoICh0YXJnZXRBbGlnbm1lbnQua2luZCkgeworCQkJCWNhc2UgQWxpZ25tZW50Lk1FU1NBR0VfQVJHVU1FTlRTOgorCQkJCWNhc2UgQWxpZ25tZW50Lk1FU1NBR0VfU0VORDoKKwkJCQkJaW5zaWRlTWVzc2FnZSsrOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFsaWdubWVudC5TVFJJTkdfQ09OQ0FURU5BVElPTjoKKwkJCQkJaW5zaWRlU3RyaW5nQ29uY2F0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2aW91c0tpbmQgPSB0YXJnZXRBbGlnbm1lbnQua2luZDsKKwkJCXRhcmdldEFsaWdubWVudCA9IHRhcmdldEFsaWdubWVudC5lbmNsb3Npbmc7CisJCQlyZWxhdGl2ZURlcHRoKys7CisJCX0KKwkJaWYgKG91dGVyTW9zdERlcHRoID49IDApIHsKKwkJCXRocm93IG5ldyBBbGlnbm1lbnRFeGNlcHRpb24oQWxpZ25tZW50RXhjZXB0aW9uLkxJTkVfVE9PX0xPTkcsIG91dGVyTW9zdERlcHRoKTsKKwkJfQorCQkvLyBsb29rIGZvciBpbm5lcm1vc3QgYnJlYWthYmxlIG9uZQorCQlyZWxhdGl2ZURlcHRoID0gMDsKKwkJdGFyZ2V0QWxpZ25tZW50ID0gdGhpcy5jdXJyZW50QWxpZ25tZW50OworCQlBbGlnbm1lbnRFeGNlcHRpb24gYWxpZ25tZW50RXhjZXB0aW9uID0gbnVsbDsKKwkJaW50IG1zZ0FyZ3NEZXB0aCA9IC0xOworCQl3aGlsZSAodGFyZ2V0QWxpZ25tZW50ICE9IG51bGwpIHsKKwkJCWlmICh0YXJnZXRBbGlnbm1lbnQua2luZCA9PSBBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFMpIHsKKwkJCQltc2dBcmdzRGVwdGggPSByZWxhdGl2ZURlcHRoOworCQkJfQorCQkJaWYgKGFsaWdubWVudEV4Y2VwdGlvbiA9PSBudWxsKSB7CisJCQkJaWYgKHRhcmdldEFsaWdubWVudC5jb3VsZEJyZWFrKCkpIHsKKwkJCQkJLy8gZG8gbm90IHRocm93IHRoZSBleGNlcHRpb24gaW1tZWRpYXRlbHkgdG8gaGF2ZSBhIGNoYW5jZSB0byByZXNldAorCQkJCQkvLyBwcmV2aW91c2x5IGJyb2tlbiBhbGlnbm1lbnRzIChzZWUgYnVnIDIwMzU4OCkKKwkJCQkJYWxpZ25tZW50RXhjZXB0aW9uID0gbmV3IEFsaWdubWVudEV4Y2VwdGlvbihBbGlnbm1lbnRFeGNlcHRpb24uTElORV9UT09fTE9ORywgcmVsYXRpdmVEZXB0aCk7CisJCQkJCWlmIChpbnNpZGVTdHJpbmdDb25jYXQpIHRocm93IGFsaWdubWVudEV4Y2VwdGlvbjsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRhcmdldEFsaWdubWVudC53YXNTcGxpdCkgeworCQkJCS8vIHJlc2V0IHRoZSBuZWFyZXN0IGFscmVhZHkgYnJva2VuIG91dGVybW9zdCBhbGlnbm1lbnQuCisJCQkJLy8gTm90ZSB0aGF0IGl0J3Mgbm90IGRvbmUgdHdpY2UgdG8gYXZvaWQgaW5maW5pdGUgbG9vcCB3aGlsZSByYWlzaW5nCisJCQkJLy8gdGhlIGV4Y2VwdGlvbiBvbiBhbiBpbm5lcm1vc3QgYWxpZ25tZW50Li4uCisJCQkJaWYgKCF0YXJnZXRBbGlnbm1lbnQud2FzUmVzZXQoKSkgeworCQkJCQl0YXJnZXRBbGlnbm1lbnQucmVzZXQoKTsKKwkJCQkJaWYgKG1zZ0FyZ3NEZXB0aCA+IGFsaWdubWVudEV4Y2VwdGlvbi5yZWxhdGl2ZURlcHRoKSB7CisJCQkJCQlhbGlnbm1lbnRFeGNlcHRpb24ucmVsYXRpdmVEZXB0aCA9IG1zZ0FyZ3NEZXB0aDsKKwkJCQkJfQorCQkJCQl0aHJvdyBhbGlnbm1lbnRFeGNlcHRpb247CisJCQkJfQorCQkJfQorCQkJdGFyZ2V0QWxpZ25tZW50ID0gdGFyZ2V0QWxpZ25tZW50LmVuY2xvc2luZzsKKwkJCXJlbGF0aXZlRGVwdGgrKzsKKwkJfQorCQlpZiAoYWxpZ25tZW50RXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCXRocm93IGFsaWdubWVudEV4Y2VwdGlvbjsKKwkJfQorCQkvLyBkaWQgbm90IGZpbmQgYW55IGJyZWFrYWJsZSBsb2NhdGlvbiAtIHByb2NlZWQKKwkJaWYgKHRoaXMuY3VycmVudEFsaWdubWVudCAhPSBudWxsKSB7CisJCQl0aGlzLmN1cnJlbnRBbGlnbm1lbnQuYmxvY2tBbGlnbiA9IGZhbHNlOworCQkJdGhpcy5jdXJyZW50QWxpZ25tZW50LnRvb0xvbmcgPSB0cnVlOworCQl9CisJfQorCiAJLyoKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIE5MUyB0YWcgb24gdGhpcyBsaW5lLiBJZiB5ZXMsIHJldHVybiB0cnVlLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KQEAgLTYxNSw3ICsxNDU2LDcgQEAKIAkJLy8gc2VhcmNoIHRoZSBsYXN0IGNvbW1lbnQgd2hlcmUgY29tbWVudEVuZCA8IGN1cnJlbnQgbGluZUVuZAogCQlpZiAodGhpcy5saW5lRW5kcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAJCWludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2godGhpcy5saW5lRW5kcywgc291cmNlU3RhcnQpOwotCQlpbnQgY3VycmVudExpbmVFbmQgPSB0aGlzLmdldExpbmVFbmQoLWluZGV4KTsKKwkJaW50IGN1cnJlbnRMaW5lRW5kID0gZ2V0TGluZUVuZCgtaW5kZXgpOwogCQlpZiAoY3VycmVudExpbmVFbmQgIT0gLTEpIHsKIAkJCWludCBjb21tZW50SW5kZXggPSBnZXRDb21tZW50SW5kZXgoY3VycmVudExpbmVFbmQpOwogCQkJaWYgKGNvbW1lbnRJbmRleCA8IDApIHsKQEAgLTYzNiw4MSArMTQ3NywxMjIgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlc0Jsb2NrQ29tbWVudHMoKSB7CisJICAgIHJldHVybiAoKHRoaXMuZm9ybWF0Q29tbWVudHMgJiBJTkNMVURFX0JMT0NLX0NPTU1FTlRTKSA9PSBJTkNMVURFX0JMT0NLX0NPTU1FTlRTICYmIHRoaXMuaGVhZGVyRW5kUG9zaXRpb24gPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB8fAorCSAgICAJKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfZm9ybWF0X2hlYWRlciAmJiB0aGlzLmhlYWRlckVuZFBvc2l0aW9uID49IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOworICAgIH0KKworCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlc0phdmFkb2NDb21tZW50cygpIHsKKwkgICAgcmV0dXJuICgodGhpcy5mb3JtYXRDb21tZW50cyAmIElOQ0xVREVfSkFWQV9ET0MpID09IElOQ0xVREVfSkFWQV9ET0MgJiYgdGhpcy5oZWFkZXJFbmRQb3NpdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHx8CisJICAgIAkodGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9mb3JtYXRfaGVhZGVyICYmIHRoaXMuaGVhZGVyRW5kUG9zaXRpb24gPj0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisgICAgfQorCisJcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVzTGluZUNvbW1lbnRzKCkgeworCSAgICByZXR1cm4gKCh0aGlzLmZvcm1hdENvbW1lbnRzICYgSU5DTFVERV9MSU5FX0NPTU1FTlRTKSA9PSBJTkNMVURFX0xJTkVfQ09NTUVOVFMgJiYgdGhpcy5oZWFkZXJFbmRQb3NpdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHx8CisJICAgIAkodGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9mb3JtYXRfaGVhZGVyICYmIHRoaXMuaGVhZGVyRW5kUG9zaXRpb24gPj0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisgICAgfQorCisJYm9vbGVhbiBpbmNsdWRlc0NvbW1lbnRzKCkgeworCSAgICByZXR1cm4gKHRoaXMuZm9ybWF0Q29tbWVudHMgJiBDb2RlRm9ybWF0dGVyLkZfSU5DTFVERV9DT01NRU5UUykgIT0gMDsKKyAgICB9CisKIAlwdWJsaWMgdm9pZCBpbmRlbnQoKSB7CiAJCXRoaXMuaW5kZW50YXRpb25MZXZlbCArPSB0aGlzLmluZGVudGF0aW9uU2l6ZTsKIAkJdGhpcy5udW1iZXJPZkluZGVudGF0aW9ucysrOwotCX0JCisJfQogCi0JLyoqCi0JICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdFNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKGNoYXJbXSBjb21waWxhdGlvblVuaXRTb3VyY2UpIHsKLQkJdGhpcy5zY2FubmVyLnNldFNvdXJjZShjb21waWxhdGlvblVuaXRTb3VyY2UpOwotCQl0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiA9IGNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGg7Ci0JCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCXRoaXMuZWRpdHMgPSBuZXcgT3B0aW1pemVkUmVwbGFjZUVkaXRbSU5JVElBTF9TSVpFXTsKLQl9CQorCXZvaWQgc2V0SW5kZW50YXRpb24oaW50IGxldmVsLCBpbnQgbikgeworCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBsZXZlbCArIG4gKiB0aGlzLmluZGVudGF0aW9uU2l6ZTsKKwkJdGhpcy5udW1iZXJPZkluZGVudGF0aW9ucyA9IHRoaXMuaW5kZW50YXRpb25MZXZlbCAvIHRoaXMuaW5kZW50YXRpb25TaXplOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Nhbm5lcihsb25nIHNvdXJjZUxldmVsLCBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMgcHJlZmVyZW5jZXMpIHsKKwkJdGhpcy51c2VUYWdzID0gcHJlZmVyZW5jZXMudXNlX3RhZ3M7CisJCXRoaXMudGFnc0tpbmQgPSAwOworCQljaGFyW11bXSB0YXNrVGFncyA9IG51bGw7CisJCWlmICh0aGlzLnVzZVRhZ3MpIHsKKwkJCXRoaXMuZGlzYWJsaW5nVGFnID0gcHJlZmVyZW5jZXMuZGlzYWJsaW5nX3RhZzsKKwkJCXRoaXMuZW5hYmxpbmdUYWcgPSBwcmVmZXJlbmNlcy5lbmFibGluZ190YWc7CisJCQlpZiAodGhpcy5kaXNhYmxpbmdUYWcgPT0gbnVsbCkgeworCQkJCWlmICh0aGlzLmVuYWJsaW5nVGFnICE9IG51bGwpIHsKKwkJCQkJdGFza1RhZ3MgPSBuZXcgY2hhcltdW10geyB0aGlzLmVuYWJsaW5nVGFnIH07CisJCQkJfQorCQkJfSBlbHNlIGlmICh0aGlzLmVuYWJsaW5nVGFnID09IG51bGwpIHsKKwkJCQl0YXNrVGFncyA9IG5ldyBjaGFyW11bXSB7IHRoaXMuZGlzYWJsaW5nVGFnIH07CisJCQl9IGVsc2UgeworCQkJCXRhc2tUYWdzID0gbmV3IGNoYXJbXVtdIHsgdGhpcy5kaXNhYmxpbmdUYWcsIHRoaXMuZW5hYmxpbmdUYWcgfTsKKwkJCX0KKwkJfQorCQlpZiAodGFza1RhZ3MgIT0gbnVsbCkgeworCQkJbG9vcDogZm9yIChpbnQgaT0wLGxlbmd0aD10YXNrVGFncy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodGFza1RhZ3NbaV0ubGVuZ3RoID4gMiAmJiB0YXNrVGFnc1tpXVswXSA9PSAnLycpIHsKKwkJCQkJc3dpdGNoICh0YXNrVGFnc1tpXVsxXSkgeworCQkJCQkJY2FzZSAnLyc6CisJCQkJCQkJdGhpcy50YWdzS2luZCA9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfTElORTsKKwkJCQkJCQlicmVhayBsb29wOworCQkJCQkJY2FzZSAnKic6CisJCQkJCQkJaWYgKHRhc2tUYWdzW2ldWzJdICE9ICcqJykgeworCQkJCQkJCQl0aGlzLnRhZ3NLaW5kID0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSzsKKwkJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIodHJ1ZSwgdHJ1ZSwgZmFsc2UvKm5scyovLCBzb3VyY2VMZXZlbC8qc291cmNlTGV2ZWwqLywgdGFza1RhZ3MsIG51bGwvKnRhc2tQcmlvcml0aWVzKi8sIHRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQl0aGlzLmVkaXRzRW5hYmxlZCA9IHRydWU7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRGb3JtYXR0ZXJDb21tZW50UGFyc2VyKCkgeworCQlpZiAodGhpcy5mb3JtYXR0ZXJDb21tZW50UGFyc2VyID09IG51bGwpIHsKKwkJCXRoaXMuZm9ybWF0dGVyQ29tbWVudFBhcnNlciA9IG5ldyBGb3JtYXR0ZXJDb21tZW50UGFyc2VyKHRoaXMuc2Nhbm5lci5zb3VyY2VMZXZlbCk7CisJCX0KKwkJdGhpcy5mb3JtYXR0ZXJDb21tZW50UGFyc2VyLnNjYW5uZXIuc2V0U291cmNlKHRoaXMuc2Nhbm5lci5zb3VyY2UpOworCQl0aGlzLmZvcm1hdHRlckNvbW1lbnRQYXJzZXIuc291cmNlID0gdGhpcy5zY2FubmVyLnNvdXJjZTsKKwkJdGhpcy5mb3JtYXR0ZXJDb21tZW50UGFyc2VyLnNjYW5uZXIubGluZUVuZHMgPSB0aGlzLmxpbmVFbmRzOworCQl0aGlzLmZvcm1hdHRlckNvbW1lbnRQYXJzZXIuc2Nhbm5lci5saW5lUHRyID0gdGhpcy5tYXhMaW5lczsKKwkJdGhpcy5mb3JtYXR0ZXJDb21tZW50UGFyc2VyLnBhcnNlSHRtbFRhZ3MgPSB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9odG1sOworCX0KIAogCXByaXZhdGUgYm9vbGVhbiBpc09uRmlyc3RDb2x1bW4oaW50IHN0YXJ0KSB7CiAJCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwpIHJldHVybiBzdGFydCA9PSAwOwogCQlpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKHRoaXMubGluZUVuZHMsIHN0YXJ0KTsKIAkJLy8gd2Ugd2FudCB0aGUgbGluZSBlbmQgb2YgdGhlIHByZXZpb3VzIGxpbmUKLQkJaW50IHByZXZpb3VzTGluZUVuZCA9IHRoaXMuZ2V0TGluZUVuZCgtaW5kZXggLSAxKTsKKwkJaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVFbmQoLWluZGV4IC0gMSk7CiAJCXJldHVybiBwcmV2aW91c0xpbmVFbmQgIT0gLTEgJiYgcHJldmlvdXNMaW5lRW5kID09IHN0YXJ0IC0gMTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEVkaXQoT3B0aW1pemVkUmVwbGFjZUVkaXQgZWRpdCkgeworCXByaXZhdGUgYm9vbGVhbiBpc01lYW5pbmdmdWxFZGl0KE9wdGltaXplZFJlcGxhY2VFZGl0IGVkaXQpIHsKIAkJZmluYWwgaW50IGVkaXRMZW5ndGg9IGVkaXQubGVuZ3RoOwogCQlmaW5hbCBpbnQgZWRpdFJlcGxhY2VtZW50TGVuZ3RoPSBlZGl0LnJlcGxhY2VtZW50Lmxlbmd0aCgpOwogCQlmaW5hbCBpbnQgZWRpdE9mZnNldD0gZWRpdC5vZmZzZXQ7Ci0JCWlmIChlZGl0TGVuZ3RoICE9IDApIHsKLQkJCWlmICh0aGlzLnRleHRSZWdpb25TdGFydCA8PSBlZGl0T2Zmc2V0ICYmIChlZGl0T2Zmc2V0ICsgZWRpdExlbmd0aCAtIDEpIDw9IHRoaXMudGV4dFJlZ2lvbkVuZCkgewotCQkJCWlmIChlZGl0UmVwbGFjZW1lbnRMZW5ndGggIT0gMCAmJiBlZGl0TGVuZ3RoID09IGVkaXRSZXBsYWNlbWVudExlbmd0aCkgewotCQkJCQlmb3IgKGludCBpID0gZWRpdE9mZnNldCwgbWF4ID0gZWRpdE9mZnNldCArIGVkaXRMZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCQkJaWYgKHNjYW5uZXIuc291cmNlW2ldICE9IGVkaXQucmVwbGFjZW1lbnQuY2hhckF0KGkgLSBlZGl0T2Zmc2V0KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVkaXRPZmZzZXQgKyBlZGl0TGVuZ3RoID09IHRoaXMudGV4dFJlZ2lvblN0YXJ0KSB7Ci0JCQkJaW50IGkgPSBlZGl0T2Zmc2V0OwotCQkJCWZvciAoaW50IG1heCA9IGVkaXRPZmZzZXQgKyBlZGl0TGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJaW50IHJlcGxhY2VtZW50U3RyaW5nSW5kZXggPSBpIC0gZWRpdE9mZnNldDsKLQkJCQkJaWYgKHJlcGxhY2VtZW50U3RyaW5nSW5kZXggPj0gZWRpdFJlcGxhY2VtZW50TGVuZ3RoIHx8IHNjYW5uZXIuc291cmNlW2ldICE9IGVkaXQucmVwbGFjZW1lbnQuY2hhckF0KHJlcGxhY2VtZW50U3RyaW5nSW5kZXgpKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaSAtIGVkaXRPZmZzZXQgIT0gZWRpdFJlcGxhY2VtZW50TGVuZ3RoICYmIGkgIT0gZWRpdE9mZnNldCArIGVkaXRMZW5ndGggLSAxKSB7Ci0JCQkJCWVkaXQub2Zmc2V0ID0gdGV4dFJlZ2lvblN0YXJ0OwotCQkJCQllZGl0Lmxlbmd0aCA9IDA7Ci0JCQkJCWVkaXQucmVwbGFjZW1lbnQgPSBlZGl0LnJlcGxhY2VtZW50LnN1YnN0cmluZyhpIC0gZWRpdE9mZnNldCk7CisJCWlmIChlZGl0UmVwbGFjZW1lbnRMZW5ndGggIT0gMCAmJiBlZGl0TGVuZ3RoID09IGVkaXRSZXBsYWNlbWVudExlbmd0aCkgeworCQkJZm9yIChpbnQgaSA9IGVkaXRPZmZzZXQsIG1heCA9IGVkaXRPZmZzZXQgKyBlZGl0TGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlpZiAodGhpcy5zY2FubmVyLnNvdXJjZVtpXSAhPSBlZGl0LnJlcGxhY2VtZW50LmNoYXJBdChpIC0gZWRpdE9mZnNldCkpIHsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQogCQkJfQotCQl9IGVsc2UgaWYgKHRoaXMudGV4dFJlZ2lvblN0YXJ0IDw9IGVkaXRPZmZzZXQgJiYgZWRpdE9mZnNldCA8PSB0aGlzLnRleHRSZWdpb25FbmQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVkaXRPZmZzZXQgPT0gdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gJiYgZWRpdE9mZnNldCA9PSB0aGlzLnRleHRSZWdpb25FbmQgKyAxKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOwogCX0KIAogCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZUVtcHR5TGluZXMoaW50IGNvdW50LCBpbnQgaW5zZXJ0UG9zaXRpb24pIHsKIAkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSAhPSAwKSB7CisJCQlpZiAodGhpcy5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHMgPj0gMCkgeworCQkJCXByaW50RW1wdHlMaW5lcyh0aGlzLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3VwcywgaW5zZXJ0UG9zaXRpb24pOworCQkJfSBlbHNlIGlmICh0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmUgIT0gMCkgewogCQkJCWludCBsaW5lc1RvUHJlc2VydmUgPSBNYXRoLm1pbihjb3VudCwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlKTsKLQkJCQl0aGlzLnByaW50RW1wdHlMaW5lcyhsaW5lc1RvUHJlc2VydmUsIGluc2VydFBvc2l0aW9uKTsKKwkJCQlwcmludEVtcHR5TGluZXMobGluZXNUb1ByZXNlcnZlLCBpbnNlcnRQb3NpdGlvbik7CiAJCQl9IGVsc2UgewogCQkJCXByaW50TmV3TGluZShpbnNlcnRQb3NpdGlvbik7CiAJCQl9CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJpbnQoY2hhcltdIHMsIGJvb2xlYW4gY29uc2lkZXJTcGFjZUlmQW55KSB7Ci0JCWlmIChjaGVja0xpbmVXcmFwcGluZyAmJiBzLmxlbmd0aCArIGNvbHVtbiA+IHRoaXMucGFnZVdpZHRoKSB7CisJcHJpdmF0ZSB2b2lkIHByaW50KGludCBsZW5ndGgsIGJvb2xlYW4gY29uc2lkZXJTcGFjZUlmQW55KSB7CisJCWlmICh0aGlzLmNoZWNrTGluZVdyYXBwaW5nICYmIGxlbmd0aCArIHRoaXMuY29sdW1uID4gdGhpcy5wYWdlV2lkdGgpIHsKIAkJCWhhbmRsZUxpbmVUb29Mb25nKCk7CiAJCX0KIAkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDA7CkBAIC03MTgsMjEgKzE2MDAsMjEgQEAKIAkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSgpOwogCQl9CiAJCWlmIChjb25zaWRlclNwYWNlSWZBbnkpIHsKLQkJCXRoaXMuc3BhY2UoKTsKKwkJCXNwYWNlKCk7CiAJCX0KIAkJaWYgKHRoaXMucGVuZGluZ1NwYWNlKSB7Ci0JCQl0aGlzLmFkZEluc2VydEVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkSW5zZXJ0RWRpdCh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCAiICIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsJCi0JCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CQkKLQkJY29sdW1uICs9IHMubGVuZ3RoOwotCQluZWVkU3BhY2UgPSB0cnVlOworCQl0aGlzLnBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQl0aGlzLmNvbHVtbiArPSBsZW5ndGg7CisJCXRoaXMubmVlZFNwYWNlID0gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJpbnRCbG9ja0NvbW1lbnQoY2hhcltdIHMsIGJvb2xlYW4gaXNKYXZhZG9jKSB7CisJcHJpdmF0ZSB2b2lkIHByaW50QmxvY2tDb21tZW50KGJvb2xlYW4gaXNKYXZhZG9jKSB7CiAJCWludCBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKIAkJaW50IGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkgKyAxOwotCQkKKwkJYm9vbGVhbiBpbmNsdWRlc0Jsb2NrQ29tbWVudHMgPSAhaXNKYXZhZG9jICYmIGluY2x1ZGVzQmxvY2tDb21tZW50cygpOworCiAJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uIC0gMSk7CiAJCWludCBjdXJyZW50Q2hhcmFjdGVyOwogCQlib29sZWFuIGlzTmV3TGluZSA9IGZhbHNlOwpAQCAtNzUxLDUwICsxNjMzLDkyIEBACiAJCQl9CiAJCX0KIAkJaWYgKHRoaXMucGVuZGluZ1NwYWNlKSB7Ci0JCQl0aGlzLmFkZEluc2VydEVkaXQoY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkSW5zZXJ0RWRpdChjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCAiICIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5uZWVkU3BhY2UgPSBmYWxzZTsKIAkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsKIAotCQlpbnQgY3VycmVudENvbW1lbnRPZmZzZXQgPSBvbkZpcnN0Q29sdW1uID8gMCA6IGdldEN1cnJlbnRDb21tZW50T2Zmc2V0KHN0YXJ0KTsKLQkJYm9vbGVhbiBmb3JtYXRDb21tZW50ID0gKGlzSmF2YWRvYyAmJiBmb3JtYXRKYXZhZG9jQ29tbWVudCkgfHwgKCFpc0phdmFkb2MgJiYgZm9ybWF0QmxvY2tDb21tZW50KTsKKwkJaW50IGNvbW1lbnRDb2x1bW4gPSB0aGlzLmNvbHVtbjsKKwkJaWYgKGluY2x1ZGVzQmxvY2tDb21tZW50cykgeworCQkJaWYgKHByaW50QmxvY2tDb21tZW50KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQogCi0JCXdoaWxlIChuZXh0Q2hhcmFjdGVyU3RhcnQgPD0gY3VycmVudFRva2VuRW5kUG9zaXRpb24gJiYgKGN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKSkgIT0gLTEpIHsKLQkJCW5leHRDaGFyYWN0ZXJTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCWludCBjdXJyZW50SW5kZW50YXRpb25MZXZlbCA9IHRoaXMuaW5kZW50YXRpb25MZXZlbDsKKwkJaWYgKChjb21tZW50Q29sdW1uLTEpID4gdGhpcy5pbmRlbnRhdGlvbkxldmVsKSB7CisJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBjb21tZW50Q29sdW1uLTE7CisJCX0KKwkJaW50IGN1cnJlbnRDb21tZW50SW5kZW50YXRpb24gPSBvbkZpcnN0Q29sdW1uID8gMCA6IGdldEN1cnJlbnRDb21tZW50SW5kZW50YXRpb24oc3RhcnQpOworCQlib29sZWFuIGZvcm1hdENvbW1lbnQgPSAoaXNKYXZhZG9jICYmICh0aGlzLmZvcm1hdENvbW1lbnRzICYgQ29kZUZvcm1hdHRlci5LX0pBVkFfRE9DKSAhPSAwKSB8fCAoIWlzSmF2YWRvYyAmJiAodGhpcy5mb3JtYXRDb21tZW50cyAmIENvZGVGb3JtYXR0ZXIuS19NVUxUSV9MSU5FX0NPTU1FTlQpICE9IDApOwogCi0JCQlzd2l0Y2goY3VycmVudENoYXJhY3RlcikgewotCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCXN0YXJ0ID0gcHJldmlvdXNTdGFydDsKLQkJCQkJaXNOZXdMaW5lID0gdHJ1ZTsKLQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcignXG4nKSkgewotCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdcbic7CisJCXRyeSB7CisJCQl3aGlsZSAobmV4dENoYXJhY3RlclN0YXJ0IDw9IGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uICYmIChjdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCkpICE9IC0xKSB7CisJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKworCQkJCXN3aXRjaChjdXJyZW50Q2hhcmFjdGVyKSB7CisJCQkJCWNhc2UgJ1xyJyA6CisJCQkJCQlzdGFydCA9IHByZXZpb3VzU3RhcnQ7CisJCQkJCQlpc05ld0xpbmUgPSB0cnVlOworCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcignXG4nKSkgeworCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAnXG4nOworCQkJCQkJCW5leHRDaGFyYWN0ZXJTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnXG4nIDoKKwkJCQkJCXN0YXJ0ID0gcHJldmlvdXNTdGFydDsKKwkJCQkJCWlzTmV3TGluZSA9IHRydWU7CiAJCQkJCQluZXh0Q2hhcmFjdGVyU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJyA6Ci0JCQkJCXN0YXJ0ID0gcHJldmlvdXNTdGFydDsKLQkJCQkJaXNOZXdMaW5lID0gdHJ1ZTsKLQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJaWYgKGlzTmV3TGluZSkgewotCQkJCQkJdGhpcy5jb2x1bW4gPSAxOwotCQkJCQkJdGhpcy5saW5lKys7Ci0JCQkJCQlpc05ld0xpbmUgPSBmYWxzZTsKLQkJCQkJCQotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWlmIChvbkZpcnN0Q29sdW1uKSB7Ci0JCQkJCQkJLy8gc2ltcGx5IGluc2VydCBpbmRlbnRhdGlvbiBpZiBuZWNlc3NhcnkKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7Ci0JCQkJCQkJaWYgKGluZGVudENvbW1lbnQpIHsKLQkJCQkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KGJ1ZmZlcik7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmb3JtYXRDb21tZW50KSB7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmIChpc05ld0xpbmUpIHsKKwkJCQkJCQl0aGlzLmNvbHVtbiA9IDE7CisJCQkJCQkJdGhpcy5saW5lKys7CisJCQkJCQkJaXNOZXdMaW5lID0gZmFsc2U7CisKKwkJCQkJCQlib29sZWFuIGFkZFNwYWNlID0gZmFsc2U7CisJCQkJCQkJaWYgKG9uRmlyc3RDb2x1bW4pIHsKKwkJCQkJCQkJaWYgKGZvcm1hdENvbW1lbnQpIHsKKwkJCQkJCQkJCWlmIChTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCQkJCQlpbnQgcHJldmlvdXNTdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQkJCQl3aGlsZShjdXJyZW50Q2hhcmFjdGVyICE9IC0xICYmIGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdcbicgJiYgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoKGNoYXIpIGN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJCQkJCQkJCXByZXZpb3VzU3RhcnQgPSBuZXh0Q2hhcmFjdGVyU3RhcnQ7CisJCQkJCQkJCQkJCXByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJyB8fCBjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpIHsKKwkJCQkJCQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gcHJldmlvdXNTdGFydFBvc2l0aW9uOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CisJCQkJCQkJCQkJYWRkU3BhY2UgPSB0cnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjdXJyZW50Q2hhcmFjdGVyKSkgewogCQkJCQkJCQkJaW50IHByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCQl3aGlsZShjdXJyZW50Q2hhcmFjdGVyICE9IC0xICYmIGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdcbicgJiYgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoKGNoYXIpIGN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJCQkJCQlpbnQgY3VycmVudEluZGVudGF0aW9uID0gMDsKKwkJCQkJCQkJCWxvb3A6IHdoaWxlKGN1cnJlbnRDaGFyYWN0ZXIgIT0gLTEgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXHInICYmIGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJyAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCQkJCQlpZiAoY3VycmVudEluZGVudGF0aW9uID49IGN1cnJlbnRDb21tZW50SW5kZW50YXRpb24pIHsKKwkJCQkJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJcHJldmlvdXNTdGFydCA9IG5leHRDaGFyYWN0ZXJTdGFydDsKIAkJCQkJCQkJCQlwcmV2aW91c1N0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkJCXN3aXRjaChjdXJyZW50Q2hhcmFjdGVyKSB7CisJCQkJCQkJCQkJCWNhc2UgJ1x0JyA6CisJCQkJCQkJCQkJCQlpZiAodGhpcy50YWJMZW5ndGggIT0gMCkgeworCQkJCQkJCQkJCQkJCWludCByZW1pbmRlciA9IGN1cnJlbnRJbmRlbnRhdGlvbiAlIHRoaXMudGFiTGVuZ3RoOworCQkJCQkJCQkJCQkJCWlmIChyZW1pbmRlciA9PSAwKSB7CisJCQkJCQkJCQkJCQkJCWN1cnJlbnRJbmRlbnRhdGlvbiArPSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCQljdXJyZW50SW5kZW50YXRpb24gPSAoKGN1cnJlbnRJbmRlbnRhdGlvbiAvIHRoaXMudGFiTGVuZ3RoKSArIDEpICogdGhpcy50YWJMZW5ndGg7CisJCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCQkJCQkJY3VycmVudEluZGVudGF0aW9uICsrOworCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7CiAJCQkJCQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCQkJCX0KQEAgLTgwMiw3MSArMTcyNiwzOTcgQEAKIAkJCQkJCQkJCQluZXh0Q2hhcmFjdGVyU3RhcnQgPSBwcmV2aW91c1N0YXJ0UG9zaXRpb247CiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdcbicpIHsKLQkJCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCQkJaWYgKGZvcm1hdENvbW1lbnQpIHsKKwkJCQkJCQkJCWludCBwcmV2aW91c1N0YXJ0VGVtcCA9IHByZXZpb3VzU3RhcnQ7CisJCQkJCQkJCQlpbnQgbmV4dENoYXJhY3RlclN0YXJ0VGVtcCA9IG5leHRDaGFyYWN0ZXJTdGFydDsKKwkJCQkJCQkJCXdoaWxlKGN1cnJlbnRDaGFyYWN0ZXIgIT0gLTEgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXHInICYmIGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJyAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCQkJCQlwcmV2aW91c1N0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0OworCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCQkJCQluZXh0Q2hhcmFjdGVyU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CisJCQkJCQkJCQkJYWRkU3BhY2UgPSB0cnVlOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlwcmV2aW91c1N0YXJ0ID0gcHJldmlvdXNTdGFydFRlbXA7CisJCQkJCQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0VGVtcDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBuZXh0Q2hhcmFjdGVyU3RhcnQ7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY3VycmVudENoYXJhY3RlcikpIHsKLQkJCQkJCQkJaW50IHByZXZpb3VzU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCWludCBjb3VudCA9IDA7Ci0JCQkJCQkJCWxvb3A6IHdoaWxlKGN1cnJlbnRDaGFyYWN0ZXIgIT0gLTEgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXHInICYmIGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJyAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY3VycmVudENoYXJhY3RlcikpIHsKLQkJCQkJCQkJCWlmIChjb3VudCA+PSBjdXJyZW50Q29tbWVudE9mZnNldCkgewotCQkJCQkJCQkJCWJyZWFrIGxvb3A7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlwcmV2aW91c1N0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0OwotCQkJCQkJCQkJcHJldmlvdXNTdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQkJCQkJCXN3aXRjaChjdXJyZW50Q2hhcmFjdGVyKSB7Ci0JCQkJCQkJCQkJY2FzZSAnXHQnIDoKLQkJCQkJCQkJCQkJY291bnQgKz0gdGhpcy50YWJMZW5ndGg7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCQljb3VudCArKzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKLQkJCQkJCQkJCW5leHRDaGFyYWN0ZXJTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJyB8fCBjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpIHsKLQkJCQkJCQkJCW5leHRDaGFyYWN0ZXJTdGFydCA9IHByZXZpb3VzU3RhcnRQb3NpdGlvbjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlidWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50OwogCQkJCQkJCWlmIChpbmRlbnRDb21tZW50KSB7Ci0JCQkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeShidWZmZXIpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZm9ybWF0Q29tbWVudCkgewotCQkJCQkJCQlpbnQgcHJldmlvdXNTdGFydFRlbXAgPSBwcmV2aW91c1N0YXJ0OwotCQkJCQkJCQlpbnQgbmV4dENoYXJhY3RlclN0YXJ0VGVtcCA9IG5leHRDaGFyYWN0ZXJTdGFydDsKLQkJCQkJCQkJd2hpbGUoY3VycmVudENoYXJhY3RlciAhPSAtMSAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nICYmIFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjdXJyZW50Q2hhcmFjdGVyKSkgewotCQkJCQkJCQkJcHJldmlvdXNTdGFydCA9IG5leHRDaGFyYWN0ZXJTdGFydDsKLQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKLQkJCQkJCQkJCW5leHRDaGFyYWN0ZXJTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkJCQkJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCA+IDApIHsKKwkJCQkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOwogCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICcqJykgewotCQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcHJldmlvdXNTdGFydCA9IHByZXZpb3VzU3RhcnRUZW1wOwotCQkJCQkJCQkJbmV4dENoYXJhY3RlclN0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0VGVtcDsKKwkJCQkJCQkJaWYgKGFkZFNwYWNlKSB7CisJCQkJCQkJCQl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKCcgJyk7CiAJCQkJCQkJCX0KLQkJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IG5leHRDaGFyYWN0ZXJTdGFydDsKKwkJCQkJCQkJcmVwbGFjZW1lbnQgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlyZXBsYWNlbWVudCA9IGFkZFNwYWNlID8gdGhpcy5saW5lU2VwYXJhdG9yQW5kU3BhY2UgOiB0aGlzLmxpbmVTZXBhcmF0b3I7CiAJCQkJCQkJfQorCQkJCQkJCWFkZFJlcGxhY2VFZGl0KHN0YXJ0LCBwcmV2aW91c1N0YXJ0IC0gMSwgcmVwbGFjZW1lbnQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLmNvbHVtbiArPSAobmV4dENoYXJhY3RlclN0YXJ0IC0gcHJldmlvdXNTdGFydCk7CiAJCQkJCQl9Ci0JCQkJCQlhZGRSZXBsYWNlRWRpdChzdGFydCwgcHJldmlvdXNTdGFydCAtIDEsIFN0cmluZy52YWx1ZU9mKGJ1ZmZlcikpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhpcy5jb2x1bW4gKz0gKG5leHRDaGFyYWN0ZXJTdGFydCAtIHByZXZpb3VzU3RhcnQpOwotCQkJCQl9CisJCQkJfQorCQkJCXByZXZpb3VzU3RhcnQgPSBuZXh0Q2hhcmFjdGVyU3RhcnQ7CisJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IG5leHRDaGFyYWN0ZXJTdGFydDsKIAkJCX0KLQkJCXByZXZpb3VzU3RhcnQgPSBuZXh0Q2hhcmFjdGVyU3RhcnQ7Ci0JCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gbmV4dENoYXJhY3RlclN0YXJ0OworCQl9IGZpbmFsbHkgeworCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gY3VycmVudEluZGVudGF0aW9uTGV2ZWw7CiAJCX0KIAkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDA7Ci0JCW5lZWRTcGFjZSA9IGZhbHNlOworCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwogCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKLQkJaWYgKGlzSmF2YWRvYykgewotCQkJcHJpbnROZXdMaW5lKCk7Ci0JCX0KIAl9Ci0JCisKKwlwcml2YXRlIGJvb2xlYW4gcHJpbnRCbG9ja0NvbW1lbnQoaW50IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIGludCBjdXJyZW50VG9rZW5FbmRQb3NpdGlvbikgeworCisJCS8vIENvbXB1dGUgaW5kZW50YXRpb24KKwkJaW50IG1heENvbHVtbiA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfbGluZV9sZW5ndGggKyAxOworCQlpbnQgaW5kZW50TGV2ZWwgPSB0aGlzLmluZGVudGF0aW9uTGV2ZWw7CisJCWludCBpbmRlbnRhdGlvbnMgPSB0aGlzLm51bWJlck9mSW5kZW50YXRpb25zOworCQlzd2l0Y2ggKHRoaXMudGFiQ2hhcikgeworCQkJY2FzZSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMuVEFCOgorCQkJCXN3aXRjaCAodGhpcy50YWJMZW5ndGgpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gMDsKKwkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCXRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMToKKwkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMuY29sdW1uIC0gMTsKKwkJCQkJCXRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSB0aGlzLmluZGVudGF0aW9uTGV2ZWw7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9ICh0aGlzLmNvbHVtbiAvIHRoaXMudGFiTGVuZ3RoKSAqIHRoaXMudGFiTGVuZ3RoOworCQkJCQkJdGhpcy5jb2x1bW4gPSB0aGlzLmluZGVudGF0aW9uTGV2ZWwgKyAxOworCQkJCQkJdGhpcy5udW1iZXJPZkluZGVudGF0aW9ucyA9IHRoaXMuaW5kZW50YXRpb25MZXZlbCAvIHRoaXMudGFiTGVuZ3RoOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLk1JWEVEOgorCQkJCWlmICh0aGlzLnRhYkxlbmd0aCA9PSAwKSB7CisJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IDA7CisJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJdGhpcy5udW1iZXJPZkluZGVudGF0aW9ucyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gdGhpcy5jb2x1bW4gLSAxOworCQkJCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gdGhpcy5pbmRlbnRhdGlvbkxldmVsIC8gdGhpcy50YWJMZW5ndGg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMuU1BBQ0U6CisJCQkJaWYgKHRoaXMuaW5kZW50YXRpb25TaXplID09IDApIHsKKwkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gMDsKKwkJCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmNvbHVtbiAtIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJLy8gQ29uc3VtZSB0aGUgY29tbWVudCBwcmVmaXgKKwkJdGhpcy5ibG9ja0NvbW1lbnRCdWZmZXIuc2V0TGVuZ3RoKDApOworCQl0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7CisJCXRoaXMuY29sdW1uICs9IDI7CisJCXRoaXMuc2Nhbm5lci5za2lwQ29tbWVudHMgPSB0cnVlOworCQl0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCWludCBlZGl0U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQlpbnQgZWRpdEVuZCA9IC0xOworCisJCS8vIENvbnN1bWUgdGV4dCB0b2tlbiBwZXIgdG9rZW4KKwkJaW50IHByZXZpb3VzVG9rZW4gPSAtMTsKKwkJYm9vbGVhbiBuZXdMaW5lID0gZmFsc2U7CisJCWJvb2xlYW4gbXVsdGlMaW5lcyA9IGZhbHNlOworCQlib29sZWFuIGhhc011bHRpTGluZXMgPSBmYWxzZTsKKwkJYm9vbGVhbiBoYXNUb2tlbnMgPSBmYWxzZTsKKwkJYm9vbGVhbiBidWZmZXJIYXNUb2tlbnMgPSBmYWxzZTsKKwkJYm9vbGVhbiBidWZmZXJIYXNOZXdMaW5lID0gZmFsc2U7CisJCWJvb2xlYW4gbGluZUhhc1Rva2VucyA9IGZhbHNlOworCQlpbnQgaGFzVGV4dE9uRmlyc3RMaW5lID0gMDsKKwkJYm9vbGVhbiBmaXJzdFdvcmQgPSB0cnVlOworCQlib29sZWFuIGNsZWFyQmxhbmtMaW5lcyA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudDsKKwkJYm9vbGVhbiBqb2luTGluZXMgPSB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5qb2luX2xpbmVzX2luX2NvbW1lbnRzOworCQlib29sZWFuIG5ld0xpbmVzQXRCb3VuZGFyaWVzID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllczsKKwkJaW50IHNjYW5uZXJMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubWF4TGluZXMpOworCQlpbnQgZmlyc3RMaW5lID0gc2Nhbm5lckxpbmU7CisJCWludCBsaW5lTnVtYmVyID0gc2Nhbm5lckxpbmU7CisJCWludCBsYXN0VGV4dExpbmUgPSAtMTsKKwkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCisJCQkvLyBDb25zdW1lIHRva2VuCisJCQlpbnQgdG9rZW47CisJCQl0cnkgeworCQkJCXRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGlpZSkgeworCSAgICAJCXRva2VuID0gY29uc3VtZUludmFsaWRUb2tlbihjdXJyZW50VG9rZW5FbmRQb3NpdGlvbi0xKTsKKwkJCQluZXdMaW5lID0gZmFsc2U7CisJCQl9CisKKwkJCS8vIExvb2sgYXQgc3BlY2lmaWMgdG9rZW5zCisgICAgCQlib29sZWFuIGluc2VydFNwYWNlID0gKHByZXZpb3VzVG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSkgJiYgKCFmaXJzdFdvcmQgfHwgIWhhc1Rva2Vucyk7CisgICAgCQlib29sZWFuIGlzVG9rZW5TdGFyID0gZmFsc2U7CisJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQlpZiAodGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIubGVuZ3RoKCkgPiAwKSB7CisJCQkJCQlpZiAoaGFzVGV4dE9uRmlyc3RMaW5lID09IDEgJiYgbXVsdGlMaW5lcykgeworCQkJCQkJCXByaW50QmxvY2tDb21tZW50SGVhZGVyTGluZSh0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlcik7CisJCQkJCQkJaGFzVGV4dE9uRmlyc3RMaW5lID0gLTE7CisJCQkJCQl9CisJCQkJCQl0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5hcHBlbmQodGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIpOworCQkJCQkJdGhpcy5jb2x1bW4gKz0gdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIubGVuZ3RoKCk7CisJCQkJCQl0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCQlidWZmZXJIYXNUb2tlbnMgPSB0cnVlOworCQkJCQkJYnVmZmVySGFzTmV3TGluZSA9IGZhbHNlOworCQkJCQl9CisJCQkJCWlmIChwcmV2aW91c1Rva2VuID09IC0xKSB7CisJCQkJCQkvLyBkbyBub3QgcmVtZW1iZXIgdGhlIGZpcnN0IHdoaXRlc3BhY2UKKwkJCQkJCXByZXZpb3VzVG9rZW4gPSBTS0lQX0ZJUlNUX1dISVRFU1BBQ0VfVE9LRU47CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47CisJCQkJCX0KKwkJCQkJbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcih0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLCB0aGlzLmxpbmVFbmRzLCBzY2FubmVyTGluZT4xID8gc2Nhbm5lckxpbmUtMiA6IDAsIHRoaXMubWF4TGluZXMpOworCQkJCQlpZiAobGluZU51bWJlciA+IHNjYW5uZXJMaW5lKSB7CisJCQkJCQloYXNNdWx0aUxpbmVzID0gdHJ1ZTsKKwkJCQkJCW5ld0xpbmUgPSB0cnVlOworCQkJCQl9CisJCQkJCXNjYW5uZXJMaW5lID0gbGluZU51bWJlcjsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNVUxUSVBMWToKKwkJCQkJaXNUb2tlblN0YXIgPSB0cnVlOworCQkJCQlsaW5lTnVtYmVyID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sIHRoaXMubGluZUVuZHMsIHNjYW5uZXJMaW5lPjEgPyBzY2FubmVyTGluZS0yIDogMCwgdGhpcy5tYXhMaW5lcyk7CisJCQkJCWlmIChsaW5lTnVtYmVyID09IGZpcnN0TGluZSAmJiBwcmV2aW91c1Rva2VuID09IFNLSVBfRklSU1RfV0hJVEVTUEFDRV9UT0tFTikgeworCQkJCQkJdGhpcy5ibG9ja0NvbW1lbnRCdWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJCX0KKwkJCQkJcHJldmlvdXNUb2tlbiA9IHRva2VuOworCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CisJCQkJCQllZGl0RW5kID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxOworCQkJCQkJLy8gQWRkIHJlbWFpbmluZyBidWZmZXJlZCB0b2tlbnMKKwkJCQkJCWlmICh0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlci5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCQl0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5hcHBlbmQodGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIpOworCQkJCQkJCXRoaXMuY29sdW1uICs9IHRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyLmxlbmd0aCgpOworCQkJCQkJfQorCQkJCQkJLy8gZW5kIG9mIGNvbW1lbnQKKwkJCQkJCWlmIChuZXdMaW5lc0F0Qm91bmRhcmllcykgeworCQkJCQkJCWlmIChtdWx0aUxpbmVzIHx8IGhhc011bHRpTGluZXMpIHsKKwkJCQkJCSAgICAJdGhpcy5ibG9ja0NvbW1lbnRCdWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQkgICAgCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCSAgICAJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMuYmxvY2tDb21tZW50QnVmZmVyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQl0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCXRoaXMuY29sdW1uICs9IEJMT0NLX0ZPT1RFUl9MRU5HVEggKyAxOworCQkJCSAgICAJdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7IC8vIHJlYWNoIHRoZSBlbmQgb2Ygc2Nhbm5lcgorCQkJCSAgICAJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKG5ld0xpbmUpIHsKKwkJCQkJCXNjYW5uZXJMaW5lID0gbGluZU51bWJlcjsKKwkJCQkJCW5ld0xpbmUgPSBmYWxzZTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFlfRVFVQUw6CisJCQkJCWlmIChuZXdMaW5lKSB7CisJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgY3VycmVudFRva2VuRW5kUG9zaXRpb24tMSk7CisJCQkJCQl0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsgLy8gY29uc3VtZSB0aGUgbXVsdGlwbHkKKwkJCQkJCXByZXZpb3VzVG9rZW4gPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNVUxUSVBMWTsKKwkJCQkJCXNjYW5uZXJMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sIHRoaXMubGluZUVuZHMsIHNjYW5uZXJMaW5lPjEgPyBzY2FubmVyTGluZS0yIDogMCwgdGhpcy5tYXhMaW5lcyk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1JTlVTOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVNfTUlOVVM6CisJCQkJCWlmIChwcmV2aW91c1Rva2VuID09IC0xKSB7CisJCQkJCQkvLyBEbyBub3QgZm9ybWF0IGNvbW1lbnQgc3RhcnRpbmcgd2l0aCAvKi0KKwkJCQkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDk0NAorCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gaW5kZW50TGV2ZWw7CisJCQkJCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gaW5kZW50YXRpb25zOworCQkJCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDA7CisJCQkJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJCQkJdGhpcy5zY2FubmVyLnNraXBDb21tZW50cyA9IGZhbHNlOworCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgY3VycmVudFRva2VuRW5kUG9zaXRpb24gLSAxKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBkbyBub3RoaW5nCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBMb29rIGF0IGdhcCBhbmQgaW5zZXJ0IGNvcnJlc3BvbmRpbmcgbGluZXMgaWYgbmVjZXNzYXJ5CisJCQlpbnQgbGluZXNHYXA7CisJCQlpbnQgbWF4OworCQkJbGluZU51bWJlciA9IFV0aWwuZ2V0TGluZU51bWJlcih0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLCB0aGlzLmxpbmVFbmRzLCBzY2FubmVyTGluZT4xID8gc2Nhbm5lckxpbmUtMiA6IDAsIHRoaXMubWF4TGluZXMpOworCQkJaWYgKGxhc3RUZXh0TGluZSA9PSAtMSkgeworCQkJCWxpbmVzR2FwID0gbmV3TGluZXNBdEJvdW5kYXJpZXMgPyBsaW5lTnVtYmVyIC0gZmlyc3RMaW5lIDogMDsKKwkJCQltYXggPSAwOworCQkJfSBlbHNlIHsKKwkJCQlsaW5lc0dhcCA9IGxpbmVOdW1iZXIgLSBsYXN0VGV4dExpbmU7CisJCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUFUICYmIGxpbmVzR2FwID09MSkgeworCQkJCQkvLyBpbnNlcnQgb25lIGJsYW5rIGxpbmUgYmVmb3JlIHJvb3QgdGFncworCQkJCQlsaW5lc0dhcCA9IDI7CisJCQkJfQorCQkJCW1heCA9IGpvaW5MaW5lcyAmJiBsaW5lSGFzVG9rZW5zID8gMSA6IDA7CisJCQl9CisJCQlpZiAobGluZXNHYXAgPiBtYXgpIHsKKwkJCQlpZiAoY2xlYXJCbGFua0xpbmVzKSB7CisJCQkJCS8vIFRPRE8gKGZyZWRlcmljKSBzZWUgaWYgdGhlcmUncyBhIGJ1ZyBmb3IgdGhlIHVucmVtb3ZlZCBibGFuayBsaW5lIGZvciByb290IHRhZ3MKKwkJCQkJIGlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBVCkgeworCQkJCQkJIGxpbmVzR2FwID0gMTsKKwkJCQkJIH0gZWxzZSB7CisJCQkJCQlsaW5lc0dhcCA9IChtYXg9PTAgfHwgIWpvaW5MaW5lcykgPyAxIDogMDsKKwkJCQkJIH0KKwkJCQl9CisJCQkJZm9yIChpbnQgaT0wOyBpPGxpbmVzR2FwOyBpKyspIHsKKwkJCQkJLy8gQWRkIHJlbWFpbmluZyBidWZmZXJlZCB0b2tlbnMKKwkJCQkJaWYgKHRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyLmxlbmd0aCgpID4gMCkgeworCQkJCQkJaWYgKGhhc1RleHRPbkZpcnN0TGluZSA9PSAxKSB7CisJCQkJCQkJcHJpbnRCbG9ja0NvbW1lbnRIZWFkZXJMaW5lKHRoaXMuYmxvY2tDb21tZW50QnVmZmVyKTsKKwkJCQkJCQloYXNUZXh0T25GaXJzdExpbmUgPSAtMTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZCh0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlcik7CisJCQkJCQl0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCQlidWZmZXJIYXNUb2tlbnMgPSB0cnVlOworCQkJCQl9CisJCQkgICAgCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJICAgIAl0aGlzLmNvbHVtbiA9IDE7CisJCQkgICAgCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlcik7CisJCSAgICAJCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCSAgICAJCXRoaXMuY29sdW1uICs9IEJMT0NLX0xJTkVfUFJFRklYX0xFTkdUSDsKKwkJICAgIAkJZmlyc3RXb3JkID0gdHJ1ZTsKKwkJCQkJbXVsdGlMaW5lcyA9IHRydWU7CisJCQkJCWJ1ZmZlckhhc05ld0xpbmUgPSB0cnVlOworCQkJCX0KKwkJCQlpbnNlcnRTcGFjZSA9IGluc2VydFNwYWNlICYmIGxpbmVzR2FwID09IDA7CisJCQl9CisgICAgCQlpZiAobmV3TGluZSkgbGluZUhhc1Rva2VucyA9IGZhbHNlOworCisJCQkvLyBJbmNyZW1lbnQgY29sdW1uCisJCQlpbnQgdG9rZW5TdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisgICAgCQlpbnQgdG9rZW5MZW5ndGggPSAodGhpcy5zY2FubmVyLmF0RW5kKCkgPyB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gOiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSAtIHRva2VuU3RhcnQ7CisgICAgCQloYXNUb2tlbnMgPSB0cnVlOworICAgIAkJaWYgKCFpc1Rva2VuU3RhcikgbGluZUhhc1Rva2VucyA9IHRydWU7CisgICAgCQlpZiAoaGFzVGV4dE9uRmlyc3RMaW5lID09IDAgJiYgIWlzVG9rZW5TdGFyKSB7CisgICAgCQkJaWYgKGZpcnN0TGluZSA9PSBsaW5lTnVtYmVyKSB7CisJICAgIAkJCWhhc1RleHRPbkZpcnN0TGluZSA9IDE7CisJICAgIAkJCXRoaXMuY29sdW1uKys7IC8vIGluY2x1ZGUgZmlyc3Qgc3BhY2UKKwkgICAgCQl9IGVsc2UgeworCSAgICAJCQloYXNUZXh0T25GaXJzdExpbmUgPSAtMTsKKwkgICAgCQl9CisgICAgCQl9CisgICAgCQlpbnQgbGFzdENvbHVtbiA9IHRoaXMuY29sdW1uICsgdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIubGVuZ3RoKCkgKyB0b2tlbkxlbmd0aDsKKyAgICAJCWlmIChpbnNlcnRTcGFjZSkgbGFzdENvbHVtbisrOworCisgICAgCQkvLyBBcHBlbmQgbmV4dCB0b2tlbiBpbnNlcnRpbmcgYSBuZXcgbGluZSBpZiBtYXggbGluZSBpcyByZWFjaGVkCisJCQlpZiAobGluZUhhc1Rva2VucyAmJiAhZmlyc3RXb3JkICYmIGxhc3RDb2x1bW4gPiBtYXhDb2x1bW4pIHsKKwkJICAgIAlTdHJpbmcgdG9rZW5zU3RyaW5nID0gdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIudG9TdHJpbmcoKS50cmltKCk7CisJCSAgICAJaW50IHRva2Vuc1N0cmluZ0xlbmd0aCA9IHRva2Vuc1N0cmluZy5sZW5ndGgoKTsKKwkJCQkvLyBub3QgZW5vdWdoIHNwYWNlIG9uIHRoZSBsaW5lCisJCQkJaWYgKGhhc1RleHRPbkZpcnN0TGluZSA9PSAxKSB7CisJCQkJCXByaW50QmxvY2tDb21tZW50SGVhZGVyTGluZSh0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlcik7CisJCQkJfQorCQkJCWlmICgodGhpcy5pbmRlbnRhdGlvbkxldmVsK3Rva2Vuc1N0cmluZ0xlbmd0aCt0b2tlbkxlbmd0aCkgPiBtYXhDb2x1bW4pIHsKKwkJCQkJLy8gdGhlcmUgd29uJ3QgYmUgZW5vdWdoIHJvb20gZXZlbiBpZiB3ZSBicmVhayB0aGUgbGluZSBiZWZvcmUgdGhlIGJ1ZmZlcmVkIHRva2VucworCQkJCQkvLyBTbyBhZGQgdGhlIGJ1ZmZlcmVkIHRva2VucyBub3cKKwkJCQkJdGhpcy5ibG9ja0NvbW1lbnRCdWZmZXIuYXBwZW5kKHRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyKTsKKwkJCQkJdGhpcy5jb2x1bW4gKz0gdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIubGVuZ3RoKCk7CisJCQkJCXRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJYnVmZmVySGFzTmV3TGluZSA9IGZhbHNlOworCQkJCQlidWZmZXJIYXNUb2tlbnMgPSB0cnVlOworCQkJCX0KKwkJCQlpZiAoYnVmZmVySGFzVG9rZW5zICYmICFidWZmZXJIYXNOZXdMaW5lKSB7CisJCQkgICAgCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJICAgIAl0aGlzLmNvbHVtbiA9IDE7CisJCQkgICAgCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlcik7CisJCSAgICAJCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkgICAgCXRoaXMuY29sdW1uICs9IEJMT0NLX0xJTkVfUFJFRklYX0xFTkdUSDsKKwkJCQl9CisJCSAgICAJaWYgKHRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyLmxlbmd0aCgpID4gMCkgeworCQkJCQl0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5hcHBlbmQodG9rZW5zU3RyaW5nKTsKKwkJCQkJdGhpcy5jb2x1bW4gKz0gdG9rZW5zU3RyaW5nTGVuZ3RoOworCQkJCQl0aGlzLmJsb2NrQ29tbWVudFRva2Vuc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCSAgICAJfQorCQkJCXRoaXMuYmxvY2tDb21tZW50QnVmZmVyLmFwcGVuZCh0aGlzLnNjYW5uZXIuc291cmNlLCB0b2tlblN0YXJ0LCB0b2tlbkxlbmd0aCk7CisJCQkJYnVmZmVySGFzVG9rZW5zID0gdHJ1ZTsKKwkJCQlidWZmZXJIYXNOZXdMaW5lID0gZmFsc2U7CisJCQkJdGhpcy5jb2x1bW4gKz0gdG9rZW5MZW5ndGg7CisJCQkJbXVsdGlMaW5lcyA9IHRydWU7CisJCQkJaGFzVGV4dE9uRmlyc3RMaW5lID0gLTE7CisJCQl9IGVsc2UgeworCQkJCS8vIGFwcGVuZCB0b2tlbiB0byB0aGUgbGluZQorCQkJCWlmIChpbnNlcnRTcGFjZSkgIHsKKwkJCQkJdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJfQorCQkJCXRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyLmFwcGVuZCh0aGlzLnNjYW5uZXIuc291cmNlLCB0b2tlblN0YXJ0LCB0b2tlbkxlbmd0aCk7CisJCQl9CisJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47CisJCQluZXdMaW5lID0gZmFsc2U7CisgICAgCQlmaXJzdFdvcmQgPSBmYWxzZTsKKwkJCXNjYW5uZXJMaW5lID0gbGluZU51bWJlcjsKKwkJCWxhc3RUZXh0TGluZSA9IGxpbmVOdW1iZXI7CisJCX0KKworCQkvLyBSZXBsYWNlIGJsb2NrIGNvbW1lbnQgdGV4dAorCQlpZiAodGhpcy5ubHNUYWdDb3VudGVyID09IDAgfHwgIW11bHRpTGluZXMpIHsKKwkJCWlmIChoYXNUb2tlbnMgfHwgbXVsdGlMaW5lcykgeworCQkJCVN0cmluZ0J1ZmZlciByZXBsYWNlbWVudDsKKwkJCQlpZiAoaGFzVGV4dE9uRmlyc3RMaW5lID09IDEpIHsKKwkJCQkJdGhpcy5ibG9ja0NvbW1lbnRUb2tlbnNCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCQlyZXBsYWNlbWVudCA9IHRoaXMuYmxvY2tDb21tZW50VG9rZW5zQnVmZmVyOworCQkJCQlpZiAoKGhhc011bHRpTGluZXMgfHwgbXVsdGlMaW5lcykpIHsKKwkJCQkJCWludCBjb2wgPSB0aGlzLmNvbHVtbjsKKwkJCQkJCXJlcGxhY2VtZW50LmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHJlcGxhY2VtZW50KTsKKwkJCQkJCXJlcGxhY2VtZW50LmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJICAgIAl0aGlzLmNvbHVtbiA9IGNvbDsKKwkJCQkJfSBlbHNlIGlmICh0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5sZW5ndGgoKT09MCB8fCB0aGlzLmJsb2NrQ29tbWVudEJ1ZmZlci5jaGFyQXQoMCkhPScgJykgeworCQkJCQkJcmVwbGFjZW1lbnQuYXBwZW5kKCcgJyk7CisJCQkJCX0KKwkJCQkJcmVwbGFjZW1lbnQuYXBwZW5kKHRoaXMuYmxvY2tDb21tZW50QnVmZmVyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXBsYWNlbWVudCA9IHRoaXMuYmxvY2tDb21tZW50QnVmZmVyOworCQkJCX0KKwkJCQlhZGRSZXBsYWNlRWRpdChlZGl0U3RhcnQsIGVkaXRFbmQsIHJlcGxhY2VtZW50LnRvU3RyaW5nKCkpOworCQkJfQorCQl9CisKKwkJLy8gUmVzZXQKKwkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gaW5kZW50TGV2ZWw7CisJCXRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSBpbmRlbnRhdGlvbnM7CisJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPSAwOworCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKwkJdGhpcy5zY2FubmVyLnNraXBDb21tZW50cyA9IGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRCbG9ja0NvbW1lbnRIZWFkZXJMaW5lKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJaWYgKCF0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X25ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzKSB7CisJCQlidWZmZXIuaW5zZXJ0KDAsICcgJyk7CisJCQl0aGlzLmNvbHVtbisrOworCQl9CisJICAgIGVsc2UgaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSB7CisJICAgIAlidWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJICAgIAl0aGlzLmNvbHVtbiA9IDE7CisJICAgIAlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoYnVmZmVyKTsKKwkgICAgCWJ1ZmZlci5hcHBlbmQoQkxPQ0tfTElORV9QUkVGSVgpOworCSAgICAJdGhpcy5jb2x1bW4gKz0gQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCSAgICB9IGVsc2UgeworCSAgICAJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkgICAgCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkgICAgCXRoaXMuY29sdW1uID0gMTsKKwkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCSAgICAJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJICAgIAl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJICAgIAlidWZmZXIuaW5zZXJ0KDAsIHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpKTsKKwkgICAgfQorICAgIH0KKwogCXB1YmxpYyB2b2lkIHByaW50RW5kT2ZDb21waWxhdGlvblVuaXQoKSB7CiAJCXRyeSB7CiAJCQkvLyBpZiB3ZSBoYXZlIGEgc3BhY2UgYmV0d2VlbiB0d28gdG9rZW5zIHdlIGVuc3VyZSBpdCB3aWxsIGJlIGR1bXBlZCBpbiB0aGUgZm9ybWF0dGVkIHN0cmluZwpAQCAtODk4LDYgKzIxNDgsOSBAQAogCQkJCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQkJCQloYXNXaGl0ZXNwYWNlID0gdHJ1ZTsKIAkJCQkJCQlhZGREZWxldGVFZGl0KHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpKTsKKwkJCQkJCX0gZWxzZSBpZiAoaGFzTGluZUNvbW1lbnQpIHsKKwkJCQkJCQlwcmVzZXJ2ZUVtcHR5TGluZXMoY291bnQsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOworCQkJCQkJCWFkZERlbGV0ZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOwogCQkJCQkJfSBlbHNlIGlmIChoYXNDb21tZW50KSB7CiAJCQkJCQkJaWYgKGNvdW50ID09IDEpIHsKIAkJCQkJCQkJdGhpcy5wcmludE5ld0xpbmUodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7CkBAIC05MDUsMTMgKzIxNTgsMTAgQEAKIAkJCQkJCQkJcHJlc2VydmVFbXB0eUxpbmVzKGNvdW50IC0gMSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7CiAJCQkJCQkJfQogCQkJCQkJCWFkZERlbGV0ZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOwotCQkJCQkJfSBlbHNlIGlmIChoYXNMaW5lQ29tbWVudCkgewotCQkJCQkJCXRoaXMucHJlc2VydmVFbXB0eUxpbmVzKGNvdW50LCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpKTsKLQkJCQkJCQlhZGREZWxldGVFZGl0KHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJYWRkRGVsZXRlRWRpdCh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7CiAJCQkJCQl9Ci0JCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCQkJCQkKKwkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FIDoKIAkJCQkJCWlmIChjb3VudCA+PSAxKSB7CkBAIC05MjIsMTEgKzIxNzIsMTEgQEAKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgaWYgKGhhc1doaXRlc3BhY2UpIHsKIAkJCQkJCQlzcGFjZSgpOwotCQkJCQkJfSAKKwkJCQkJCX0KIAkJCQkJCWhhc1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCQkJCXRoaXMucHJpbnRMaW5lQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQlwcmludExpbmVDb21tZW50KCk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQkJCWhhc0xpbmVDb21tZW50ID0gdHJ1ZTsJCQorCQkJCQkJaGFzTGluZUNvbW1lbnQgPSB0cnVlOwogCQkJCQkJY291bnQgPSAwOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6CkBAIC05MzgsOSArMjE4OCw5IEBACiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIGlmIChoYXNXaGl0ZXNwYWNlKSB7CiAJCQkJCQkJc3BhY2UoKTsKLQkJCQkJCX0gCisJCQkJCQl9CiAJCQkJCQloYXNXaGl0ZXNwYWNlID0gZmFsc2U7Ci0JCQkJCQl0aGlzLnByaW50QmxvY2tDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpLCBmYWxzZSk7CisJCQkJCQlwcmludEJsb2NrQ29tbWVudChmYWxzZSk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWhhc0xpbmVDb21tZW50ID0gZmFsc2U7CiAJCQkJCQloYXNDb21tZW50ID0gdHJ1ZTsKQEAgLTk0OSwyMyArMjE5OSwyNyBAQAogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQyA6CiAJCQkJCQlpZiAoY291bnQgPj0gMSkgewogCQkJCQkJCWlmIChjb3VudCA+IDEpIHsKLQkJCQkJCQkJcHJlc2VydmVFbXB0eUxpbmVzKGNvdW50IC0gMSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7CisJCQkJCQkJCXByZXNlcnZlRW1wdHlMaW5lcyhjb3VudCAtIDEsIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKIAkJCQkJCQl9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsKLQkJCQkJCQkJcHJpbnROZXdMaW5lKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOworCQkJCQkJCQlwcmludE5ld0xpbmUodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSBpZiAoaGFzV2hpdGVzcGFjZSkgewogCQkJCQkJCXNwYWNlKCk7Ci0JCQkJCQl9IAorCQkJCQkJfQogCQkJCQkJaGFzV2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJCQkJdGhpcy5wcmludEJsb2NrQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSwgdHJ1ZSk7CisJCQkJCQlpZiAoaW5jbHVkZXNKYXZhZG9jQ29tbWVudHMoKSkgeworCQkJCQkJCXByaW50SmF2YWRvY0NvbW1lbnQodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwcmludEJsb2NrQ29tbWVudCh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJCXByaW50TmV3TGluZSgpOwogCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQkJCQloYXNMaW5lQ29tbWVudCA9IGZhbHNlOwogCQkJCQkJaGFzQ29tbWVudCA9IHRydWU7CiAJCQkJCQljb3VudCA9IDA7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04gOgotCQkJCQkJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSA9IHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpOwotCQkJCQkJdGhpcy5wcmludChjdXJyZW50VG9rZW5Tb3VyY2UsIHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uKTsKKwkJCQkJCXByaW50KHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24pOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GIDoKIAkJCQkJCWlmIChjb3VudCA+PSAxIHx8IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nKSB7CkBAIC05ODMsMTkgKzIyMzcsMjA1IEBACiAJCX0KIAl9CiAKLQlwdWJsaWMgdm9pZCBwcmludENvbW1lbnQoKSB7CisJLyoKKwkgKiBwcmludHMgYSBjb2RlIHNuaXBwZXQKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJpbnRDb2RlU25pcHBldChpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgbGluZXNHYXApIHsKKwkJU3RyaW5nIHNuaXBwZXQgPSBuZXcgU3RyaW5nKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpOworCQorCQkvLyAxIC0gc3RyaXAgY29udGVudCBwcmVmaXggKEBzZWUgSmF2YURvY1JlZ2lvbiNwcmVwcm9jZXNzQ29kZVNuaXBwZXQpCisJCWludCBmaXJzdExpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIoc3RhcnRQb3NpdGlvbiwgdGhpcy5saW5lRW5kcywgMCwgdGhpcy5tYXhMaW5lcykgLSAxOworCQlpbnQgbGFzdExpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIoZW5kUG9zaXRpb24sIHRoaXMubGluZUVuZHMsIGZpcnN0TGluZT4xID8gZmlyc3RMaW5lLTIgOiAwLCB0aGlzLm1heExpbmVzKSAtIDE7CisJCXRoaXMuY29kZVNuaXBwZXRCdWZmZXIuc2V0TGVuZ3RoKDApOworCQlpZiAoZmlyc3RMaW5lID09IGxhc3RMaW5lICYmIGxpbmVzR2FwID09IDApIHsKKwkJCXRoaXMuY29kZVNuaXBwZXRCdWZmZXIuYXBwZW5kKHNuaXBwZXQpOworCQl9IGVsc2UgeworCQkJYm9vbGVhbiBoYXNDaGFyc0FmdGVyU3RhciA9IGZhbHNlOworCQkJaWYgKGxpbmVzR2FwID09IDApIHsKKwkJCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZCh0aGlzLnNjYW5uZXIuc291cmNlLCBzdGFydFBvc2l0aW9uLCB0aGlzLmxpbmVFbmRzW2ZpcnN0TGluZV0rMS1zdGFydFBvc2l0aW9uKTsKKwkJCQlmaXJzdExpbmUrKzsKKwkJCX0KKwkJCWludCBpbml0aWFsTGVuZ3RoID0gdGhpcy5jb2RlU25pcHBldEJ1ZmZlci5sZW5ndGgoKTsKKwkJCWZvciAoaW50IGN1cnJlbnRMaW5lPWZpcnN0TGluZTsgY3VycmVudExpbmU8PWxhc3RMaW5lOyBjdXJyZW50TGluZSsrKSB7CisJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5saW5lRW5kc1tjdXJyZW50TGluZS0xXSsxLCB0aGlzLmxpbmVFbmRzW2N1cnJlbnRMaW5lXSk7CisJCQkJaW50IGxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJYm9vbGVhbiBoYXNTdGFyID0gZmFsc2U7CisJCQkJbG9vcDogd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCQljaGFyIGNoID0gKGNoYXIpIHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJCQlzd2l0Y2ggKGNoKSB7CisJCQkJCQljYXNlICcgJzoKKwkJCQkJCWNhc2UgJ1x0JyA6CisJCQkJCQljYXNlICdcdTAwMGMnIDoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ1xyJyA6CisJCQkJCQljYXNlICdcbicgOgorCQkJCQkJCWJyZWFrIGxvb3A7CisJCQkJCQljYXNlICcqJzoKKwkJCQkJCQloYXNTdGFyID0gdHJ1ZTsKKwkJCQkJCQlicmVhayBsb29wOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlicmVhayBsb29wOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChoYXNTdGFyKSB7CisJCQkJCWxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCWlmICghaGFzQ2hhcnNBZnRlclN0YXIgJiYgIXRoaXMuc2Nhbm5lci5hdEVuZCgpKSB7CisJCQkJCQljaGFyIGNoID0gKGNoYXIpIHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJCQkJYm9vbGVhbiBhdEVuZCA9IHRoaXMuc2Nhbm5lci5hdEVuZCgpOworCQkJCQkJc3dpdGNoIChjaCkgeworCQkJCQkJCWNhc2UgJyAnOgorCQkJCQkJCWNhc2UgJ1x0JyA6CisJCQkJCQkJY2FzZSAnXHUwMDBjJyA6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ1xyJyA6CisJCQkJCQkJY2FzZSAnXG4nIDoKKwkJCQkJCQkJYXRFbmQgPSB0cnVlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCQkJCQkJCQkJaWYgKGhhc1N0YXIpIHsKKwkJCQkJCQkJCQkvLyBBIG5vbiB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBqdXN0IGFmdGVyIHRoZSBzdGFyCisJCQkJCQkJCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIHdpdGhvdXQKKwkJCQkJCQkJCQkvLyBjb25zdW1pbmcgdGhlIHNwYWNlIGFmdGVyIHRoZSBzdGFyCisJCQkJCQkJCQkJaGFzQ2hhcnNBZnRlclN0YXIgPSB0cnVlOworCQkJCQkJCQkJCWN1cnJlbnRMaW5lID0gZmlyc3RMaW5lLTE7CisJCQkJCQkJCQkJdGhpcy5jb2RlU25pcHBldEJ1ZmZlci5zZXRMZW5ndGgoaW5pdGlhbExlbmd0aCk7CisJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoIWhhc0NoYXJzQWZ0ZXJTdGFyICYmICFhdEVuZCkgeworCQkJCQkJCS8vIFVudGlsIHRoZW4sIHRoZXJlJ3MgYWx3YXlzIGEgd2hpdGVzcGFjZSBhZnRlciBlYWNoIHN0YXIKKwkJCQkJCQkvLyBvZiB0aGUgY29tbWVudCwgaGVuY2Ugd2UgbmVlZCB0byBjb25zdW1lIGl0IGFzIGl0IHdpbGwKKwkJCQkJCQkvLyBiZSByZXdyaXR0ZW4gd2hpbGUgcmVpbmRlbnRpbmcgdGhlIHNuaXBwZXQgbGluZXMKKwkJCQkJCQlsaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWludCBlbmQgPSBjdXJyZW50TGluZSA9PSBsYXN0TGluZSA/IGVuZFBvc2l0aW9uIDogdGhpcy5saW5lRW5kc1tjdXJyZW50TGluZV07CisJCQkJdGhpcy5jb2RlU25pcHBldEJ1ZmZlci5hcHBlbmQodGhpcy5zY2FubmVyLnNvdXJjZSwgbGluZVN0YXJ0LCBlbmQrMS1saW5lU3RhcnQpOworCQkJfQorCQl9CisJCisJCS8vIDIgLSBjb252ZXJ0IEhUTUwgdG8gSmF2YSAoQHNlZSBKYXZhRG9jUmVnaW9uI2NvbnZlcnRIdG1sMkphdmEpCisJCUhUTUxFbnRpdHkySmF2YVJlYWRlciByZWFkZXI9IG5ldyBIVE1MRW50aXR5MkphdmFSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLnRvU3RyaW5nKCkpKTsKKwkJY2hhcltdIGJ1Zj0gbmV3IGNoYXJbdGhpcy5jb2RlU25pcHBldEJ1ZmZlci5sZW5ndGgoKV07IC8vIGh0bWwydGV4dCBuZXZlciBnZXRzIGxvbmdlciwgb25seSBzaG9ydGVyIQorCQlTdHJpbmcgY29udmVydGVkU25pcHBldDsKKwkJdHJ5IHsKKwkJCWludCByZWFkPSByZWFkZXIucmVhZChidWYpOworCQkJY29udmVydGVkU25pcHBldCA9IG5ldyBTdHJpbmcoYnVmLCAwLCByZWFkKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KKwkJCUNvbW1lbnRGb3JtYXR0ZXJVdGlsLmxvZyhlKTsKKwkJCXJldHVybjsKKwkJfQorCQorCQkvLyAzIC0gZm9ybWF0IHNuaXBwZXQgKEBzZWUgSmF2YURvY1JlZ2lvbiNmb3JtYXRDb2RlU25pcHBldCkKKwkJLy8gaW5jbHVkZSBjb21tZW50cyBpbiBjYXNlIG9mIGxpbmUgY29tbWVudHMgYXJlIHByZXNlbnQgaW4gdGhlIHNuaXBwZXQKKwkJU3RyaW5nIGZvcm1hdHRlZFNuaXBwZXQgPSBjb252ZXJ0ZWRTbmlwcGV0OworCQlNYXAgb3B0aW9ucyA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmdldE1hcCgpOworCQlpZiAodGhpcy5zY2FubmVyLnNvdXJjZUxldmVsID4gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMykgeworCQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBDb21waWxlck9wdGlvbnMudmVyc2lvbkZyb21KZGtMZXZlbCh0aGlzLnNjYW5uZXIuc291cmNlTGV2ZWwpKTsKKwkJfQorCQlUZXh0RWRpdCBlZGl0PSBDb21tZW50Rm9ybWF0dGVyVXRpbC5mb3JtYXQyKENvZGVGb3JtYXR0ZXIuS19VTktOT1dOIHwgQ29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVFMsIGNvbnZlcnRlZFNuaXBwZXQsIDAsIHRoaXMubGluZVNlcGFyYXRvciwgb3B0aW9ucyk7CisJCWlmIChlZGl0ID09IG51bGwpIHsKKwkJCS8vIDMuYSAtIG5vdCBhIHZhbGlkIGNvZGUgdG8gZm9ybWF0LCBrZWVwIGluaXRpYWwgYnVmZmVyCisJCQlmb3JtYXR0ZWRTbmlwcGV0ID0gdGhpcy5jb2RlU25pcHBldEJ1ZmZlci50b1N0cmluZygpOworCQl9IGVsc2UgeworCQkJLy8gMy5iIC0gdmFsaWQgY29kZSBmb3JtYXR0ZWQKKwkJCS8vIDMuYi5pIC0gZ2V0IHRoZSByZXN1bHQKKwkJCWZvcm1hdHRlZFNuaXBwZXQgPSBDb21tZW50Rm9ybWF0dGVyVXRpbC5ldmFsdWF0ZUZvcm1hdHRlckVkaXQoY29udmVydGVkU25pcHBldCwgZWRpdCwgbnVsbCk7CisJCisJCQkvLyAzLmIuaWktIGNvbnZlcnQgYmFjayB0byBIVE1MIChAc2VlIEphdmFEb2NSZWdpb24jY29udmVydEphdmEySHRtbCkKKwkJCUphdmEySFRNTEVudGl0eVJlYWRlciBqYXZhUmVhZGVyPSBuZXcgSmF2YTJIVE1MRW50aXR5UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoZm9ybWF0dGVkU25pcHBldCkpOworCQkJYnVmPSBuZXcgY2hhclsyNTZdOworCQkJdGhpcy5jb2RlU25pcHBldEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQlpbnQgbDsKKwkJCXRyeSB7CisJCQkJZG8geworCQkJCQlsPSBqYXZhUmVhZGVyLnJlYWQoYnVmKTsKKwkJCQkJaWYgKGwgIT0gLTEpCisJCQkJCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZChidWYsIDAsIGwpOworCQkJCX0gd2hpbGUgKGwgPiAwKTsKKwkJCQlmb3JtYXR0ZWRTbmlwcGV0ID0gdGhpcy5jb2RlU25pcHBldEJ1ZmZlci50b1N0cmluZygpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIHNob3VsZCBub3QgaGFwcGVuCisJCQkJQ29tbWVudEZvcm1hdHRlclV0aWwubG9nKGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQorCQkvLyA0IC0gYWRkIHRoZSBjb250ZW50IHByZWZpeCAoQHNlZSBKYXZhRG9jUmVnaW9uI3Bvc3Rwcm9jZXNzQ29kZVNuaXBwZXQpCisJCXRoaXMuY29kZVNuaXBwZXRCdWZmZXIuc2V0TGVuZ3RoKDApOworCQlJTGluZVRyYWNrZXIgdHJhY2tlciA9IG5ldyBEZWZhdWx0TGluZVRyYWNrZXIoKTsKKwkJdGhpcy5jb2x1bW4gPSAxOworCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy5jb2RlU25pcHBldEJ1ZmZlcik7IC8vIGFwcGVuZCBpbmRlbnRhdGlvbgorCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCVN0cmluZyBsaW5lUHJlZml4ID0gdGhpcy5jb2RlU25pcHBldEJ1ZmZlci50b1N0cmluZygpOworCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLnNldExlbmd0aCgwKTsKKwkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZm9ybWF0dGVkU25pcHBldDsKKwkJdHJhY2tlci5zZXQoZm9ybWF0dGVkU25pcHBldCk7CisJCWludCBudW1iZXJPZkxpbmVzID0gdHJhY2tlci5nZXROdW1iZXJPZkxpbmVzKCk7CisJCWlmIChudW1iZXJPZkxpbmVzID4gMSkgeworCQkJaW50IGxhc3RMaW5lT2Zmc2V0ID0gLTE7CisJCQlmb3IgKGludCBpPTA7IGk8bnVtYmVyT2ZMaW5lcy0xOyBpKyspIHsKKwkJCQlpZiAoaT4wKSB0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZChsaW5lUHJlZml4KTsKKwkJCQl0cnkgeworCQkJCQlsYXN0TGluZU9mZnNldCA9IHRyYWNrZXIuZ2V0TGluZU9mZnNldChpKzEpOworCQkJCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZChmb3JtYXR0ZWRTbmlwcGV0LnN1YnN0cmluZyh0cmFja2VyLmdldExpbmVPZmZzZXQoaSksIGxhc3RMaW5lT2Zmc2V0KSk7CisJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworCQkJCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQkJCQlDb21tZW50Rm9ybWF0dGVyVXRpbC5sb2coZSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQl0aGlzLmNvZGVTbmlwcGV0QnVmZmVyLmFwcGVuZChsaW5lUHJlZml4KTsKKwkJCXRoaXMuY29kZVNuaXBwZXRCdWZmZXIuYXBwZW5kKGZvcm1hdHRlZFNuaXBwZXQuc3Vic3RyaW5nKGxhc3RMaW5lT2Zmc2V0KSk7CisJCQlyZXBsYWNlbWVudCA9IHRoaXMuY29kZVNuaXBwZXRCdWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCQorCQkvLyA1IC0gcmVwbGFjZSBvbGQgdGV4dCB3aXRoIHRoZSBmb3JtYXR0ZWQgc25pcHBldAorCQlhZGRSZXBsYWNlRWRpdChzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgcmVwbGFjZW1lbnQpOworCX0KKworCXZvaWQgcHJpbnRDb21tZW50KCkgeworCQlwcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIE5PX1RSQUlMSU5HX0NPTU1FTlQsIFBSRVNFUlZFX0VNUFRZX0xJTkVTX0tFRVBfTEFTVF9ORVdfTElORVNfSU5ERU5UQVRJT04pOworCX0KKworCXZvaWQgcHJpbnRDb21tZW50KGludCBlbXB0eUxpbmVzUnVsZXMpIHsKKwkJcHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBOT19UUkFJTElOR19DT01NRU5ULCBlbXB0eUxpbmVzUnVsZXMpOworCX0KKworCXZvaWQgcHJpbnRDb21tZW50KGludCBraW5kLCBpbnQgdHJhaWxpbmcpIHsKKwkJcHJpbnRDb21tZW50KGtpbmQsIHRyYWlsaW5nLCBQUkVTRVJWRV9FTVBUWV9MSU5FU19LRUVQX0xBU1RfTkVXX0xJTkVTX0lOREVOVEFUSU9OKTsKKwl9CisKKwkvKgorCSAqIE1haW4gbWV0aG9kIHRvIHByaW50IGFuZCBmb3JtYXQgY29tbWVudHMgKGphdmFkb2MsIGJsb2NrIGFuZCBzaW5nbGUgbGluZSBjb21tZW50cykKKwkgKi8KKwl2b2lkIHByaW50Q29tbWVudChpbnQga2luZCwgaW50IHRyYWlsaW5nLCBpbnQgZW1wdHlMaW5lc1J1bGVzKSB7CisJCWZpbmFsIGJvb2xlYW4gcmVqZWN0TGluZUNvbW1lbnQgPSBraW5kICA9PSBDb2RlRm9ybWF0dGVyLktfTVVMVElfTElORV9DT01NRU5UIHx8IGtpbmQgPT0gQ29kZUZvcm1hdHRlci5LX0pBVkFfRE9DOworCQlmaW5hbCBib29sZWFuIHJlamVjdEJsb2NrQ29tbWVudCA9IGtpbmQgID09IENvZGVGb3JtYXR0ZXIuS19TSU5HTEVfTElORV9DT01NRU5UIHx8IGtpbmQgID09IENvZGVGb3JtYXR0ZXIuS19KQVZBX0RPQzsKKwkJZmluYWwgYm9vbGVhbiByZWplY3RKYXZhZG9jQ29tbWVudCA9IGtpbmQgID09IENvZGVGb3JtYXR0ZXIuS19TSU5HTEVfTElORV9DT01NRU5UIHx8IGtpbmQgID09IENvZGVGb3JtYXR0ZXIuS19NVUxUSV9MSU5FX0NPTU1FTlQ7CiAJCXRyeSB7CiAJCQkvLyBpZiB3ZSBoYXZlIGEgc3BhY2UgYmV0d2VlbiB0d28gdG9rZW5zIHdlIGVuc3VyZSBpdCB3aWxsIGJlIGR1bXBlZCBpbiB0aGUgZm9ybWF0dGVkIHN0cmluZwogCQkJaW50IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJYm9vbGVhbiBoYXNDb21tZW50ID0gZmFsc2U7CiAJCQlib29sZWFuIGhhc0xpbmVDb21tZW50ID0gZmFsc2U7Ci0JCQlib29sZWFuIGhhc1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCWludCBjb3VudCA9IDA7CisJCQlib29sZWFuIGhhc1doaXRlc3BhY2VzID0gZmFsc2U7CisJCQlpbnQgbGluZXMgPSAwOwogCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJaW50IGZvdW5kVGFza0NvdW50ID0gdGhpcy5zY2FubmVyLmZvdW5kVGFza0NvdW50OworCQkJCWludCB0b2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOwogCQkJCXN3aXRjaCh0aGlzLmN1cnJlbnRUb2tlbikgewogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0UgOgogCQkJCQkJY2hhcltdIHdoaXRlU3BhY2VzID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQkJCQkJY291bnQgPSAwOworCQkJCQkJaW50IHdoaXRlc3BhY2VzRW5kUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKKwkJCQkJCWxpbmVzID0gMDsKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB3aGl0ZVNwYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJCXN3aXRjaCh3aGl0ZVNwYWNlc1tpXSkgewogCQkJCQkJCQljYXNlICdccicgOgpAQCAtMTAwNCw4MyArMjQ0NCwyNTYgQEAKIAkJCQkJCQkJCQkJaSsrOwogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0KLQkJCQkJCQkJCWNvdW50Kys7CisJCQkJCQkJCQlsaW5lcysrOwogCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCWNhc2UgJ1xuJyA6Ci0JCQkJCQkJCQljb3VudCsrOworCQkJCQkJCQkJbGluZXMrKzsKIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCQlpZiAoY291bnQgPT0gMCkgewotCQkJCQkJCWhhc1doaXRlc3BhY2UgPSB0cnVlOwotCQkJCQkJCWFkZERlbGV0ZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOwotCQkJCQkJfSBlbHNlIGlmIChoYXNDb21tZW50KSB7Ci0JCQkJCQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCQkJCQkJdGhpcy5wcmludE5ld0xpbmUodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcHJlc2VydmVFbXB0eUxpbmVzKGNvdW50IC0gMSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7CisJCQkJCQkvLyBJZiBmb2xsb3dpbmcgdG9rZW4gaXMgYSBsaW5lIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSBvciB0aGUgbGluZSBqdXN0IGFmdGVyLAorCQkJCQkJLy8gdGhlbiBpdCBtaWdodCBiZSBub3QgcmVhbGx5IGZvcm1hdHRlZCBhcyBhIHRyYWlsaW5nIGNvbW1lbnQKKwkJCQkJCWJvb2xlYW4gcmVhbFRyYWlsaW5nID0gdHJhaWxpbmcgPiBOT19UUkFJTElOR19DT01NRU5UOworCQkJCQkJaWYgKHJlYWxUcmFpbGluZyAmJiB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnLycgJiYgKGxpbmVzID09IDAgfHwgKGxpbmVzID09IDEgJiYgIWhhc0xpbmVDb21tZW50ICYmIHRyYWlsaW5nID09IElNUE9SVF9UUkFJTElOR19DT01NRU5UKSkpIHsKKwkJCQkJCQkvLyBzb21ldGltZXMgY2hhbmdpbmcgdGhlIHRyYWlsaW5nIG1heSBub3QgYmUgdGhlIGJlc3QgaWRlYQorCQkJCQkJCS8vIGZvciBjb21wbGV4IHRyYWlsaW5nIGNvbW1lbnQsIGl0J3MgYmFzaWNhbGx5IGEgZ29vZCBpZGVhCisJCQkJCQkJYm9vbGVhbiBjYW5DaGFuZ2VUcmFpbGluZyA9ICh0cmFpbGluZyAmIENPTVBMRVhfVFJBSUxJTkdfQ09NTUVOVCkgIT0gMDsKKwkJCQkJCQkvLyBmb3IgYmFzaWMgdHJhaWxpbmcgY29tbWVudCBwcmVjZWRlZCBieSBhIGxpbmUgY29tbWVudCwgdGhlbiBpdCBkZXBlbmRzIG9uIHRoZSBjb21tZW50cyByZWxhdGl2ZSBwb3NpdGlvbgorCQkJCQkJCS8vIHdoZW4gZm9sbG93aW5nIGNvbW1lbnQgY29sdW1uIChhZnRlciBoYXZpbmcgYmVlbiByb3VuZGVkKSBpcyBiZWxvdyB0aGUgcHJlY2VkaW5nIG9uZSwKKwkJCQkJCQkvLyB0aGVuIGl0IGJlY29tZXMgbm90IGEgZ29vZCBpZGVhIHRvIGNoYW5nZSB0aGUgdHJhaWxpbmcgZmxhZworCQkJCQkJCWlmICh0cmFpbGluZyA9PSBCQVNJQ19UUkFJTElOR19DT01NRU5UICYmIGhhc0xpbmVDb21tZW50KSB7CisJCQkJCQkJCWludCBjdXJyZW50Q29tbWVudEluZGVudGF0aW9uID0gZ2V0Q3VycmVudEluZGVudGF0aW9uKHdoaXRlU3BhY2VzLCAwKTsKKwkJCQkJCQkJaW50IHJlbGF0aXZlSW5kZW50YXRpb24gPSBjdXJyZW50Q29tbWVudEluZGVudGF0aW9uIC0gdGhpcy5sYXN0TGluZUNvbW1lbnQuY3VycmVudEluZGVudGF0aW9uOworCQkJCQkJCQlpZiAodGhpcy50YWJMZW5ndGggPT0gMCkgeworCQkJCQkJCQkJY2FuQ2hhbmdlVHJhaWxpbmcgPSByZWxhdGl2ZUluZGVudGF0aW9uID09IDA7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljYW5DaGFuZ2VUcmFpbGluZyA9IHJlbGF0aXZlSW5kZW50YXRpb24gPiAtdGhpcy50YWJMZW5ndGg7CisJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJYWRkRGVsZXRlRWRpdCh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGhhc0xpbmVDb21tZW50KSB7Ci0JCQkJCQkJdGhpcy5wcmVzZXJ2ZUVtcHR5TGluZXMoY291bnQsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOwotCQkJCQkJCWFkZERlbGV0ZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOwotCQkJCQkJfSBlbHNlIGlmIChjb3VudCAhPSAwICYmIHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSAhPSAwKSB7Ci0JCQkJCQkJYWRkUmVwbGFjZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCksIHRoaXMuZ2V0UHJlc2VydmVFbXB0eUxpbmVzKGNvdW50IC0gMSkpOworCQkJCQkJCS8vIGlmIHRoZSB0cmFpbGluZyBjYW4gYmUgY2hhbmdlLCB0aGVuIGxvb2sgYXQgdGhlIGZvbGxvd2luZyB0b2tlbnMKKwkJCQkJCQlpZiAoY2FuQ2hhbmdlVHJhaWxpbmcpIHsKKwkJCQkJCQkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FKSB7CisJCQkJCQkJCQlyZWFsVHJhaWxpbmcgPSAhaGFzTGluZUNvbW1lbnQ7CisJCQkJCQkJCQlzd2l0Y2ggKHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgeworCQkJCQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FOgorCQkJCQkJCQkJCQkvLyBhdCBsZWFzdCB0d28gY29udGlndW91cyBsaW5lIGNvbW1lbnRzCisJCQkJCQkJCQkJCS8vIHRoZSBmb3JtYXR0ZXIgc2hvdWxkIG5vdCBjb25zaWRlciBjb21tZW50cyBhcyB0cmFpbGluZyBvbmVzCisJCQkJCQkJCQkJCXJlYWxUcmFpbGluZyA9IGZhbHNlOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0U6CisJCQkJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FKSB7CisJCQkJCQkJCQkJCQkvLyBhdCBsZWFzdCB0d28gY29udGlndW91cyBsaW5lIGNvbW1lbnRzCisJCQkJCQkJCQkJCQkvLyB0aGUgZm9ybWF0dGVyIHNob3VsZCBub3QgY29uc2lkZXIgY29tbWVudHMgYXMgdHJhaWxpbmcgb25lcworCQkJCQkJCQkJCQkJcmVhbFRyYWlsaW5nID0gZmFsc2U7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFBvc2l0aW9uLCB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gLSAxKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBMb29rIHdoZXRoZXIgY29tbWVudHMgbGluZSBtYXkgYmUgY29udGlndW91cyBvciBub3QKKwkJCQkJCS8vIE5vdGUgdGhhdCB3aGVuIHByZWNlZGluZyB0b2tlbiBpcyBhIGNvbW1lbnQgbGluZSwgdGhlbiBvbmx5IG9uZSBsaW5lCisJCQkJCQkvLyBpcyBlbm91Z2ggdG8gaGF2ZSBhbiBlbXB0eSBsaW5lIGFzIHRoZSBsaW5lIGVuZCBpcyBpbmNsdWRlZCBpbiB0aGUgY29tbWVudCBsaW5lLi4uCisJCQkJCQkvLyBJZiBjb21tZW50cyBhcmUgY29udGlndW91cywgc3RvcmUgdGhlIHdoaXRlIHNwYWNlcyB0byBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlIGN1cnJlbnQgY29tbWVudCBpbmRlbnRhdGlvbgorCQkJCQkJaWYgKGxpbmVzID4gMSB8fCAobGluZXMgPT0gMSAmJiBoYXNMaW5lQ29tbWVudCkpIHsKKwkJCQkJCQl0aGlzLmxhc3RMaW5lQ29tbWVudC5jb250aWd1b3VzID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQl0aGlzLmxhc3RMaW5lQ29tbWVudC5sZWFkaW5nU3BhY2VzID0gd2hpdGVTcGFjZXM7CisJCQkJCQl0aGlzLmxhc3RMaW5lQ29tbWVudC5saW5lcyA9IGxpbmVzOworCQkJCQkJLy8gU3RyYXRlZ3kgdG8gY29uc3VtZSBzcGFjZXMgYW5kIGV2ZW50dWFsbHkgbGVhdmUgYXQgdGhpcyBzdGFnZQorCQkJCQkJLy8gZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IGEgdHJhaWxpbmcgY29tbWVudCBpcyBleHBlY3RlZCBvciBub3QKKwkJCQkJCWlmIChyZWFsVHJhaWxpbmcpIHsKKwkJCQkJCQkvLyBpZiBhIGxpbmUgY29tbWVudCBpcyBjb25zdW1lZCwgbm8gb3RoZXIgY29tbWVudCBjYW4gYmUgb24gdGhlIHNhbWUgbGluZSBhZnRlcgorCQkJCQkJCWlmIChoYXNMaW5lQ29tbWVudCkgeworCQkJCQkJCQlpZiAobGluZXMgPj0gMSkgeworCQkJCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRva2VuU3RhcnRQb3NpdGlvbjsKKwkJCQkJCQkJCXByZXNlcnZlRW1wdHlMaW5lcyhsaW5lcywgY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbik7CisJCQkJCQkJCQlhZGREZWxldGVFZGl0KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHdoaXRlc3BhY2VzRW5kUG9zaXRpb24pOworCQkJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKwkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJfQorCQkJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfSAKKwkJCQkJCQkvLyBpZiBvbmUgb3Igc2V2ZXJhbCBuZXcgbGluZXMgYXJlIGNvbnN1bWVkLCBmb2xsb3dpbmcgY29tbWVudHMgY2Fubm90IGJlIGNvbnNpZGVyZWQgYXMgdHJhaWxpbmcgb25lcworCQkJCQkJCWlmIChsaW5lcyA+PSAxKSB7CisJCQkJCQkJCWlmIChoYXNDb21tZW50KSB7CisJCQkJCQkJCQl0aGlzLnByaW50TmV3TGluZSh0b2tlblN0YXJ0UG9zaXRpb24pOworCQkJCQkJCQl9CisJCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisJCQkJCQkJLy8gZGVsZXRlIGNvbnN1bWVkIHdoaXRlIHNwYWNlcworCQkJCQkJCWhhc1doaXRlc3BhY2VzID0gdHJ1ZTsKKwkJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQlhZGREZWxldGVFZGl0KHRva2VuU3RhcnRQb3NpdGlvbiwgd2hpdGVzcGFjZXNFbmRQb3NpdGlvbik7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCWFkZERlbGV0ZUVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkpOworCQkJCQkJCWlmIChsaW5lcyA9PSAwKSB7CisJCQkJCQkJCWhhc1doaXRlc3BhY2VzID0gdHJ1ZTsKKwkJCQkJCQkJaWYgKGhhc0xpbmVDb21tZW50ICYmIGVtcHR5TGluZXNSdWxlcyAhPSBQUkVTRVJWRV9FTVBUWV9MSU5FU19LRUVQX0xBU1RfTkVXX0xJTkVTX0lOREVOVEFUSU9OKSB7CisJCQkJCQkJCQlhZGRSZXBsYWNlRWRpdCh0b2tlblN0YXJ0UG9zaXRpb24sIHdoaXRlc3BhY2VzRW5kUG9zaXRpb24sIGdldFByZXNlcnZlRW1wdHlMaW5lcygwLCBlbXB0eUxpbmVzUnVsZXMpKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWFkZERlbGV0ZUVkaXQodG9rZW5TdGFydFBvc2l0aW9uLCB3aGl0ZXNwYWNlc0VuZFBvc2l0aW9uKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoaGFzTGluZUNvbW1lbnQpIHsKKwkJCQkJCQkJdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbihlbXB0eUxpbmVzUnVsZXMpOworCQkJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdG9rZW5TdGFydFBvc2l0aW9uOworCQkJCQkJCQlwcmVzZXJ2ZUVtcHR5TGluZXMobGluZXMsIGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24pOworCQkJCQkJCQlhZGREZWxldGVFZGl0KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHdoaXRlc3BhY2VzRW5kUG9zaXRpb24pOworCQkJCQkJCX0gZWxzZSBpZiAoaGFzQ29tbWVudCkgeworCQkJCQkJCQl1c2VBbGlnbm1lbnRCcmVha0luZGVudGF0aW9uKGVtcHR5TGluZXNSdWxlcyk7CisJCQkJCQkJCWlmIChsaW5lcyA9PSAxKSB7CisJCQkJCQkJCQl0aGlzLnByaW50TmV3TGluZSh0b2tlblN0YXJ0UG9zaXRpb24pOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJcHJlc2VydmVFbXB0eUxpbmVzKGxpbmVzIC0gMSwgdG9rZW5TdGFydFBvc2l0aW9uKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlhZGREZWxldGVFZGl0KHRva2VuU3RhcnRQb3NpdGlvbiwgd2hpdGVzcGFjZXNFbmRQb3NpdGlvbik7CisJCQkJCQkJfSBlbHNlIGlmIChsaW5lcyAhPSAwICYmICghdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuam9pbl93cmFwcGVkX2xpbmVzIHx8IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSAhPSAwIHx8IHRoaXMuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzID4gMCkpIHsKKwkJCQkJCQkJYWRkUmVwbGFjZUVkaXQodG9rZW5TdGFydFBvc2l0aW9uLCB3aGl0ZXNwYWNlc0VuZFBvc2l0aW9uLCBnZXRQcmVzZXJ2ZUVtcHR5TGluZXMobGluZXMtMSwgZW1wdHlMaW5lc1J1bGVzKSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdXNlQWxpZ25tZW50QnJlYWtJbmRlbnRhdGlvbihlbXB0eUxpbmVzUnVsZXMpOworCQkJCQkJCQlhZGREZWxldGVFZGl0KHRva2VuU3RhcnRQb3NpdGlvbiwgd2hpdGVzcGFjZXNFbmRQb3NpdGlvbik7CisJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CQkJCQkJCisJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfTElORSA6Ci0JCQkJCQlpZiAoY291bnQgPj0gMSkgewotCQkJCQkJCWlmIChjb3VudCA+IDEpIHsKLQkJCQkJCQkJcHJlc2VydmVFbXB0eUxpbmVzKGNvdW50IC0gMSwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7Ci0JCQkJCQkJfSBlbHNlIGlmIChjb3VudCA9PSAxKSB7CisJCQkJCQlpZiAodGhpcy51c2VUYWdzICYmIHRoaXMuZWRpdHNFbmFibGVkKSB7CisJCQkJCQkJYm9vbGVhbiB0dXJuT2ZmID0gZmFsc2U7CisJCQkJCQkJaWYgKGZvdW5kVGFza0NvdW50ID4gMCkgeworCQkJCQkJCQlzZXRFZGl0c0VuYWJsZWQoZm91bmRUYXNrQ291bnQpOworCQkJCQkJCQl0dXJuT2ZmID0gdHJ1ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKHRoaXMudGFnc0tpbmQgPT0gdGhpcy5jdXJyZW50VG9rZW4KKwkJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyh0aGlzLmRpc2FibGluZ1RhZywgdGhpcy5zY2FubmVyLnNvdXJjZSwgdG9rZW5TdGFydFBvc2l0aW9uLCB0cnVlKSkgeworICAgIAkJCQkJCQl0aGlzLmVkaXRzRW5hYmxlZCA9IGZhbHNlOworCQkJCQkJCQl0dXJuT2ZmID0gdHJ1ZTsKKwkJCQkJICAgIAl9CisJCQkJCQkJaWYgKHR1cm5PZmYpIHsKKwkJCQkJCQkJaWYgKCF0aGlzLmVkaXRzRW5hYmxlZCAmJiB0aGlzLmVkaXRzSW5kZXggPiAxKSB7CisJCQkJCQkJCQlPcHRpbWl6ZWRSZXBsYWNlRWRpdCBjdXJyZW50RWRpdCA9IHRoaXMuZWRpdHNbdGhpcy5lZGl0c0luZGV4LTFdOworCQkJCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID09IGN1cnJlbnRFZGl0Lm9mZnNldCtjdXJyZW50RWRpdC5sZW5ndGgpIHsKKwkJCQkJCQkJCQlwcmludE5ld0xpbmVzQmVmb3JlRGlzYWJsaW5nQ29tbWVudCgpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKHJlamVjdExpbmVDb21tZW50KSBicmVhazsKKwkJCQkJCWlmIChsaW5lcyA+PSAxKSB7CisJCQkJCQkJaWYgKGxpbmVzID4gMSkgeworCQkJCQkJCQlwcmVzZXJ2ZUVtcHR5TGluZXMobGluZXMgLSAxLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpKTsKKwkJCQkJCQl9IGVsc2UgaWYgKGxpbmVzID09IDEpIHsKIAkJCQkJCQkJcHJpbnROZXdMaW5lKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOwogCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoaGFzV2hpdGVzcGFjZSkgeworCQkJCQkJfSBlbHNlIGlmIChoYXNXaGl0ZXNwYWNlcykgewogCQkJCQkJCXNwYWNlKCk7Ci0JCQkJCQl9IAotCQkJCQkJaGFzV2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJCQkJdGhpcy5wcmludExpbmVDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpKTsKKwkJCQkJCX0KKwkJCQkJCWhhc1doaXRlc3BhY2VzID0gZmFsc2U7CisJCQkJCQlwcmludExpbmVDb21tZW50KCk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQkJCWhhc0xpbmVDb21tZW50ID0gdHJ1ZTsJCQotCQkJCQkJY291bnQgPSAwOworCQkJCQkJaGFzTGluZUNvbW1lbnQgPSB0cnVlOworCQkJCQkJbGluZXMgPSAwOworCQkJCQkJaWYgKHRoaXMudXNlVGFncyAmJiAhdGhpcy5lZGl0c0VuYWJsZWQpIHsKKwkJCQkJCQlpZiAoZm91bmRUYXNrQ291bnQgPiAwKSB7CisJCQkJCQkJCXNldEVkaXRzRW5hYmxlZChmb3VuZFRhc2tDb3VudCk7CisJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnRhZ3NLaW5kID09IHRoaXMuY3VycmVudFRva2VuKSB7CisJICAgIAkJCQkJCXRoaXMuZWRpdHNFbmFibGVkID0gQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyh0aGlzLmVuYWJsaW5nVGFnLCB0aGlzLnNjYW5uZXIuc291cmNlLCB0b2tlblN0YXJ0UG9zaXRpb24sIHRydWUpOworCQkJCQkgICAgCX0KKwkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgotCQkJCQkJaWYgKGNvdW50ID49IDEpIHsKLQkJCQkJCQlpZiAoY291bnQgPiAxKSB7Ci0JCQkJCQkJCXByZXNlcnZlRW1wdHlMaW5lcyhjb3VudCAtIDEsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOwotCQkJCQkJCX0gZWxzZSBpZiAoY291bnQgPT0gMSkgeworCQkJCQkJaWYgKHRoaXMudXNlVGFncyAmJiB0aGlzLmVkaXRzRW5hYmxlZCkgeworCQkJCQkJCWJvb2xlYW4gdHVybk9mZiA9IGZhbHNlOworCQkJCQkJCWlmIChmb3VuZFRhc2tDb3VudCA+IDApIHsKKwkJCQkJCQkJc2V0RWRpdHNFbmFibGVkKGZvdW5kVGFza0NvdW50KTsKKwkJCQkJCQkJdHVybk9mZiA9IHRydWU7CisJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnRhZ3NLaW5kID09IHRoaXMuY3VycmVudFRva2VuCisJCQkJCQkJCSYmIENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHModGhpcy5kaXNhYmxpbmdUYWcsIHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnRQb3NpdGlvbiwgdHJ1ZSkpIHsKKyAgICAJCQkJCQkJdGhpcy5lZGl0c0VuYWJsZWQgPSBmYWxzZTsKKwkJCQkJCQkJdHVybk9mZiA9IHRydWU7CisJCQkJCSAgICAJfQorCQkJCQkJCWlmICh0dXJuT2ZmKSB7CisJCQkJCQkJCWlmICghdGhpcy5lZGl0c0VuYWJsZWQgJiYgdGhpcy5lZGl0c0luZGV4ID4gMSkgeworCQkJCQkJCQkJT3B0aW1pemVkUmVwbGFjZUVkaXQgY3VycmVudEVkaXQgPSB0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXTsKKwkJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9PSBjdXJyZW50RWRpdC5vZmZzZXQrY3VycmVudEVkaXQubGVuZ3RoKSB7CisJCQkJCQkJCQkJcHJpbnROZXdMaW5lc0JlZm9yZURpc2FibGluZ0NvbW1lbnQoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmICh0cmFpbGluZyA+IE5PX1RSQUlMSU5HX0NPTU1FTlQgJiYgbGluZXMgPj0gMSkgeworCQkJCQkJCS8vIGEgYmxvY2sgY29tbWVudCBvbiBuZXh0IGxpbmUgbWVhbnMgdGhhdCB0aGVyZSdzIG5vIHRyYWlsaW5nIGNvbW1lbnQKKwkJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCXRoaXMubGFzdExpbmVDb21tZW50LmNvbnRpZ3VvdXMgPSBmYWxzZTsKKwkJCQkJCWlmIChyZWplY3RCbG9ja0NvbW1lbnQpIGJyZWFrOworCQkJCQkJaWYgKGxpbmVzID49IDEpIHsKKwkJCQkJCQlpZiAobGluZXMgPiAxKSB7CisJCQkJCQkJCXByZXNlcnZlRW1wdHlMaW5lcyhsaW5lcyAtIDEsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOworCQkJCQkJCX0gZWxzZSBpZiAobGluZXMgPT0gMSkgewogCQkJCQkJCQlwcmludE5ld0xpbmUodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSk7CiAJCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChoYXNXaGl0ZXNwYWNlKSB7CisJCQkJCQl9IGVsc2UgaWYgKGhhc1doaXRlc3BhY2VzKSB7CiAJCQkJCQkJc3BhY2UoKTsKLQkJCQkJCX0gCi0JCQkJCQloYXNXaGl0ZXNwYWNlID0gZmFsc2U7Ci0JCQkJCQl0aGlzLnByaW50QmxvY2tDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCQloYXNXaGl0ZXNwYWNlcyA9IGZhbHNlOworCQkJCQkJcHJpbnRCbG9ja0NvbW1lbnQoZmFsc2UpOwogCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQkJCQloYXNMaW5lQ29tbWVudCA9IGZhbHNlOwogCQkJCQkJaGFzQ29tbWVudCA9IHRydWU7Ci0JCQkJCQljb3VudCA9IDA7CisJCQkJCQlsaW5lcyA9IDA7CisJCQkJCQlpZiAodGhpcy51c2VUYWdzICYmICF0aGlzLmVkaXRzRW5hYmxlZCkgeworCQkJCQkJCWlmIChmb3VuZFRhc2tDb3VudCA+IDApIHsKKwkJCQkJCQkJc2V0RWRpdHNFbmFibGVkKGZvdW5kVGFza0NvdW50KTsKKwkJCQkJCQl9IGVsc2UgaWYgKHRoaXMudGFnc0tpbmQgPT0gdGhpcy5jdXJyZW50VG9rZW4pIHsKKwkgICAgCQkJCQkJdGhpcy5lZGl0c0VuYWJsZWQgPSBDaGFyT3BlcmF0aW9uLmZyYWdtZW50RXF1YWxzKHRoaXMuZW5hYmxpbmdUYWcsIHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnRQb3NpdGlvbiwgdHJ1ZSk7CisJCQkJCSAgICAJfQorCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoKLQkJCQkJCWlmIChjb3VudCA+PSAxKSB7Ci0JCQkJCQkJaWYgKGNvdW50ID4gMSkgewotCQkJCQkJCQlwcmVzZXJ2ZUVtcHR5TGluZXMoY291bnQgLSAxLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsKKwkJCQkJCWlmICh0aGlzLnVzZVRhZ3MgJiYgdGhpcy5lZGl0c0VuYWJsZWQgJiYgZm91bmRUYXNrQ291bnQgPiAwKSB7CisJCQkJCQkJc2V0RWRpdHNFbmFibGVkKGZvdW5kVGFza0NvdW50KTsKKwkJCQkJCQlpZiAoIXRoaXMuZWRpdHNFbmFibGVkICYmIHRoaXMuZWRpdHNJbmRleCA+IDEpIHsKKwkJCQkJCQkJT3B0aW1pemVkUmVwbGFjZUVkaXQgY3VycmVudEVkaXQgPSB0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXTsKKwkJCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID09IGN1cnJlbnRFZGl0Lm9mZnNldCtjdXJyZW50RWRpdC5sZW5ndGgpIHsKKwkJCQkJCQkJCXByaW50TmV3TGluZXNCZWZvcmVEaXNhYmxpbmdDb21tZW50KCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAodHJhaWxpbmcgPiBOT19UUkFJTElOR19DT01NRU5UKSB7CisJCQkJCQkJLy8gYSBqYXZhZG9jIGNvbW1lbnQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgdHJhaWxpbmcgY29tbWVudAorCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJdGhpcy5sYXN0TGluZUNvbW1lbnQuY29udGlndW91cyA9IGZhbHNlOworCQkJCQkJaWYgKHJlamVjdEphdmFkb2NDb21tZW50KSBicmVhazsKKwkJCQkJCWlmIChsaW5lcyA+PSAxKSB7CisJCQkJCQkJaWYgKGxpbmVzID4gMSkgeworCQkJCQkJCQlwcmVzZXJ2ZUVtcHR5TGluZXMobGluZXMgLSAxLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpKTsKKwkJCQkJCQl9IGVsc2UgaWYgKGxpbmVzID09IDEpIHsKIAkJCQkJCQkJcHJpbnROZXdMaW5lKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOwogCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoaGFzV2hpdGVzcGFjZSkgeworCQkJCQkJfSBlbHNlIGlmIChoYXNXaGl0ZXNwYWNlcykgewogCQkJCQkJCXNwYWNlKCk7Ci0JCQkJCQl9IAotCQkJCQkJaGFzV2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJCQkJdGhpcy5wcmludEJsb2NrQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCQloYXNXaGl0ZXNwYWNlcyA9IGZhbHNlOworCQkJCQkJaWYgKGluY2x1ZGVzSmF2YWRvY0NvbW1lbnRzKCkpIHsKKwkJCQkJCQlwcmludEphdmFkb2NDb21tZW50KHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcHJpbnRCbG9ja0NvbW1lbnQodHJ1ZSk7CisJCQkJCQl9CisJCQkJCQlpZiAodGhpcy51c2VUYWdzICYmICF0aGlzLmVkaXRzRW5hYmxlZCAmJiBmb3VuZFRhc2tDb3VudCA+IDApIHsKKwkJCQkJCQlzZXRFZGl0c0VuYWJsZWQoZm91bmRUYXNrQ291bnQpOworCQkJCQkJfQorCQkJCQkJcHJpbnROZXdMaW5lKCk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWhhc0xpbmVDb21tZW50ID0gZmFsc2U7CiAJCQkJCQloYXNDb21tZW50ID0gdHJ1ZTsKLQkJCQkJCWNvdW50ID0gMDsKKwkJCQkJCWxpbmVzID0gMDsKIAkJCQkJCWJyZWFrOwogCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXRoaXMubGFzdExpbmVDb21tZW50LmNvbnRpZ3VvdXMgPSBmYWxzZTsKIAkJCQkJCS8vIHN0ZXAgYmFjayBvbmUgdG9rZW4KIAkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CiAJCQkJCQlyZXR1cm47CkBAIC0xMDkwLDcwICsyNzAzLDM0NSBAQAogCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZyhlKTsKIAkJfQogCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRMaW5lQ29tbWVudChjaGFyW10gcykgewotCQlpbnQgY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7Ci0JCWludCBjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpICsgMTsKLQkJaWYgKENoYXJPcGVyYXRpb24uaW5kZXhPZihTY2FubmVyLlRBR19QUkVGSVgsIHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRydWUsIGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKSAhPSAtMSkgewotCQkJdGhpcy5ubHNUYWdDb3VudGVyID0gMDsKLQkJfQotCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCBjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiAtIDEpOwotCQlpbnQgY3VycmVudENoYXJhY3RlcjsKLQkJaW50IHN0YXJ0ID0gY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbjsKLQkJaW50IG5leHRDaGFyYWN0ZXJTdGFydCA9IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb247Ci0JCQotCQlpZiAodGhpcy5pbmRlbnRhdGlvbkxldmVsICE9IDApIHsKLQkJCWlmICghdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uCi0JCQkJCXx8ICFpc09uRmlyc3RDb2x1bW4oc3RhcnQpKSB7Ci0JCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMucGVuZGluZ1NwYWNlKSB7Ci0JCQl0aGlzLmFkZEluc2VydEVkaXQoY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7Ci0JCXRoaXMucGVuZGluZ1NwYWNlID0gZmFsc2U7Ci0JCWludCBwcmV2aW91c1N0YXJ0ID0gY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbjsKIAotCQlsb29wOiB3aGlsZSAobmV4dENoYXJhY3RlclN0YXJ0IDw9IGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uICYmIChjdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCkpICE9IC0xKSB7Ci0JCQluZXh0Q2hhcmFjdGVyU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCXZvaWQgcHJpbnRDb21tZW50KGludCBraW5kLCBTdHJpbmcgc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZXZlbCkgewogCi0JCQlzd2l0Y2goY3VycmVudENoYXJhY3RlcikgewotCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCXN0YXJ0ID0gcHJldmlvdXNTdGFydDsKLQkJCQkJYnJlYWsgbG9vcDsKLQkJCQljYXNlICdcbicgOgotCQkJCQlzdGFydCA9IHByZXZpb3VzU3RhcnQ7Ci0JCQkJCWJyZWFrIGxvb3A7Ci0JCQl9Ci0JCQlwcmV2aW91c1N0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0OwotCQl9Ci0JCWlmIChzdGFydCAhPSBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKSB7Ci0JCQkvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGxpbmUgY29tbWVudCBkb2Vzbid0IGVuZCB0aGUgZmlsZQotCQkJYWRkUmVwbGFjZUVkaXQoc3RhcnQsIGN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uIC0gMSwgbGluZVNlcGFyYXRvcik7Ci0JCQl0aGlzLmxpbmUrKzsgCi0JCQl0aGlzLmNvbHVtbiA9IDE7Ci0JCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMTsKLQkJfQotCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwotCQl0aGlzLnBlbmRpbmdTcGFjZSA9IGZhbHNlOwotCQkvLyByZWFsaWduIHRvIHRoZSBwcm9wZXIgdmFsdWUKLQkJaWYgKHRoaXMuY3VycmVudEFsaWdubWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5tZW1iZXJBbGlnbm1lbnQgIT0gbnVsbCkgewotCQkJCS8vIHNlbGVjdCB0aGUgbGFzdCBhbGlnbm1lbnQKLQkJCQlpZiAodGhpcy5jdXJyZW50QWxpZ25tZW50LmxvY2F0aW9uLmlucHV0T2Zmc2V0ID4gdGhpcy5tZW1iZXJBbGlnbm1lbnQubG9jYXRpb24uaW5wdXRPZmZzZXQpIHsKLQkJCQkJaWYgKHRoaXMuY3VycmVudEFsaWdubWVudC5jb3VsZEJyZWFrKCkgJiYgdGhpcy5jdXJyZW50QWxpZ25tZW50Lndhc1NwbGl0KSB7Ci0JCQkJCQl0aGlzLmN1cnJlbnRBbGlnbm1lbnQucGVyZm9ybUZyYWdtZW50RWZmZWN0KCk7CisJCS8vIFNldCBzY2FubmVyCisJCXJlc2V0U2Nhbm5lcihzb3VyY2UudG9DaGFyQXJyYXkoKSk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQkvLyBQdXQgYmFjayAzLjRSQzIgY29kZSA9PiBjb21tZW50IGZvbGxvd2luZyBsaW5lICBhcyBpdCBoYXMgYW4gaW1wYWN0IG9uIExpbnV4IHRlc3RzCisJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDMzNgorCQkvLyBUT0RPIChmcmVkZXJpYykgTmVlZCBtb3JlIGludmVzdGlnYXRpb25zIGFuZCBhIGJldHRlciBmaXggaW4KKwkJLy8gaXNBZGFwdGFibGVSZWdpb24oaW50KSBhbmQgYWRhcHRSZWdpb25zKCkKKwkJLy8gdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gPSBlbmQ7CisKKwkJLy8gU2V0IGluZGVudGF0aW9uIGxldmVsCisJICAgIHRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSBsZXZlbDsKKwkgICAgdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gbGV2ZWwgKiB0aGlzLmluZGVudGF0aW9uU2l6ZTsKKwkgICAgdGhpcy5jb2x1bW4gPSB0aGlzLmluZGVudGF0aW9uTGV2ZWwgKyAxOworCisJICAgIC8vIFByaW50IGNvcnJlc3BvbmRpbmcgY29tbWVudAorCSAgICBzd2l0Y2ggKGtpbmQpIHsKKwkgICAgCWNhc2UgQ29kZUZvcm1hdHRlci5LX1NJTkdMRV9MSU5FX0NPTU1FTlQ6CisJCQkgICAgcHJpbnRDb21tZW50KGtpbmQsIE5PX1RSQUlMSU5HX0NPTU1FTlQpOworCSAgICAJCWJyZWFrOworCSAgICAJY2FzZSBDb2RlRm9ybWF0dGVyLktfTVVMVElfTElORV9DT01NRU5UOgorCQkJICAgIHByaW50Q29tbWVudChraW5kLCBOT19UUkFJTElOR19DT01NRU5UKTsKKwkgICAgCQlicmVhazsKKwkgICAgCWNhc2UgQ29kZUZvcm1hdHRlci5LX0pBVkFfRE9DOgorCSAgICAJCXByaW50SmF2YWRvY0NvbW1lbnQoc3RhcnQsIGVuZCk7CisJICAgIAkJYnJlYWs7CisJICAgIH0KKyAgICB9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRMaW5lQ29tbWVudCgpIHsKKyAgICAJaW50IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpOworICAgIAlpbnQgY3VycmVudFRva2VuRW5kUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSArIDE7CisgICAgCWJvb2xlYW4gaW5jbHVkZXNMaW5lQ29tbWVudHMgPSBpbmNsdWRlc0xpbmVDb21tZW50cygpOworICAgIAlib29sZWFuIGlzTmxzVGFnID0gZmFsc2U7CisgICAgCWlmIChDaGFyT3BlcmF0aW9uLmluZGV4T2YoU2Nhbm5lci5UQUdfUFJFRklYLCB0aGlzLnNjYW5uZXIuc291cmNlLCB0cnVlLCBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCBjdXJyZW50VG9rZW5FbmRQb3NpdGlvbikgIT0gLTEpIHsKKyAgICAJCXRoaXMubmxzVGFnQ291bnRlciA9IDA7CisgICAgCQlpc05sc1RhZyA9IHRydWU7CisgICAgCX0KKyAgICAJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgY3VycmVudFRva2VuRW5kUG9zaXRpb24gLSAxKTsKKyAgICAJaW50IGN1cnJlbnRDaGFyYWN0ZXI7CisgICAgCWludCBzdGFydCA9IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb247CisgICAgCWludCBuZXh0Q2hhcmFjdGVyU3RhcnQgPSBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uOworCisgICAgCS8vIFByaW50IGNvbW1lbnQgbGluZSBpbmRlbnRhdGlvbgorICAgIAlpbnQgY29tbWVudEluZGVudGF0aW9uTGV2ZWw7CisgICAJCWJvb2xlYW4gb25GaXJzdENvbHVtbiA9IGlzT25GaXJzdENvbHVtbihzdGFydCk7CisgICAgCWlmICh0aGlzLmluZGVudGF0aW9uTGV2ZWwgPT0gMCkgeworICAgIAkJY29tbWVudEluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmNvbHVtbiAtIDE7CisgICAgCX0gZWxzZSB7CisJCQlpZiAob25GaXJzdENvbHVtbiAmJgorCQkJCQkoKGluY2x1ZGVzTGluZUNvbW1lbnRzICYmICF0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uKSB8fAorCQkJCQkgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uKQorICAgIAkJCSkgeworCSAgIAkJCWNvbW1lbnRJbmRlbnRhdGlvbkxldmVsID0gdGhpcy5jb2x1bW4gLSAxOworICAgIAkJfSBlbHNlIHsKKyAgICAJCQkvLyBJbmRlbnRhdGlvbiBtYXkgYmUgc3BlY2lmaWMgZm9yIGNvbnRpZ3VvdXMgY29tbWVudAorICAgIAkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzMwMAorCQkJCWlmICh0aGlzLmxhc3RMaW5lQ29tbWVudC5jb250aWd1b3VzKSB7CisJCQkJCS8vIFRoZSBsZWFkaW5nIHNwYWNlcyBoYXZlIGJlZW4gc2V0IHdoaWxlIGxvb3BpbmcgaW4gdGhlIHByaW50Q29tbWVudChpbnQpIG1ldGhvZAorCQkJCQlpbnQgY3VycmVudENvbW1lbnRJbmRlbnRhdGlvbiA9IGdldEN1cnJlbnRJbmRlbnRhdGlvbih0aGlzLmxhc3RMaW5lQ29tbWVudC5sZWFkaW5nU3BhY2VzLCAwKTsKKwkJCQkJLy8gS2VlcCB0aGUgY3VycmVudCBjb21tZW50IGluZGVudGF0aW9uIHdoZW4gb3ZlciB0aGUgcHJldmlvdXMgY29udGlndW91cyBsaW5lIGNvbW1lbnQKKwkJCQkJLy8gYW5kIHRoZSBwcmV2aW91cyBjb21tZW50IGhhcyBub3QgYmVlbiByZWluZGVudGVkCisJCQkJCWludCByZWxhdGl2ZUluZGVudGF0aW9uID0gY3VycmVudENvbW1lbnRJbmRlbnRhdGlvbiAtIHRoaXMubGFzdExpbmVDb21tZW50LmN1cnJlbnRJbmRlbnRhdGlvbjsKKwkJCQkJYm9vbGVhbiBzaW1pbGFyQ29tbWVudHNJbmRlbnRhdGlvbiA9IGZhbHNlOworCQkJCQlpZiAodGhpcy50YWJMZW5ndGggPT0gMCkgeworCQkJCQkJc2ltaWxhckNvbW1lbnRzSW5kZW50YXRpb24gPSByZWxhdGl2ZUluZGVudGF0aW9uID09IDA7CisJCQkJCX0gZWxzZSBpZiAocmVsYXRpdmVJbmRlbnRhdGlvbiA+IC10aGlzLnRhYkxlbmd0aCkgeworCQkJCQkJc2ltaWxhckNvbW1lbnRzSW5kZW50YXRpb24gPSByZWxhdGl2ZUluZGVudGF0aW9uID09IDAgfHwgY3VycmVudENvbW1lbnRJbmRlbnRhdGlvbiAhPSAwICYmIHRoaXMubGFzdExpbmVDb21tZW50LmN1cnJlbnRJbmRlbnRhdGlvbiAhPSAwOworCQkJCQl9CisJCQkJCWlmIChzaW1pbGFyQ29tbWVudHNJbmRlbnRhdGlvbiAmJiB0aGlzLmxhc3RMaW5lQ29tbWVudC5pbmRlbnRhdGlvbiAhPSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKKwkJCQkJCWludCBjdXJyZW50SW5kZW50YXRpb25MZXZlbCA9IHRoaXMuaW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMubGFzdExpbmVDb21tZW50LmluZGVudGF0aW9uIDsKKwkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSgpOworCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsID0gY3VycmVudEluZGVudGF0aW9uTGV2ZWw7CisJCQkgICAJCQljb21tZW50SW5kZW50YXRpb25MZXZlbCA9IHRoaXMubGFzdExpbmVDb21tZW50LmluZGVudGF0aW9uIDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSgpOworCQkJICAgCQkJY29tbWVudEluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmNvbHVtbiAtIDE7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBNYXRoLm1heCh0aGlzLmluZGVudGF0aW9uTGV2ZWwsIHRoaXMubWVtYmVyQWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbCk7CisJCQkJCWlmICh0aGlzLmN1cnJlbnRBbGlnbm1lbnQgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRBbGlnbm1lbnQua2luZCA9PSBBbGlnbm1lbnQuQVJSQVlfSU5JVElBTElaRVIgJiYKKwkJCQkJCXRoaXMuY3VycmVudEFsaWdubWVudC5mcmFnbWVudENvdW50ID4gMCAmJgorCQkJCQkJdGhpcy5pbmRlbnRhdGlvbkxldmVsIDwgdGhpcy5jdXJyZW50QWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbCAmJgorCQkJCQkJdGhpcy5sYXN0TGluZUNvbW1lbnQubGluZXMgPiAwKQorCQkJCQl7CisJCQkJCQlpbnQgY3VycmVudEluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmluZGVudGF0aW9uTGV2ZWw7CisJCQkJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmN1cnJlbnRBbGlnbm1lbnQuYnJlYWtJbmRlbnRhdGlvbkxldmVsOworCQkgICAgCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KCk7CisJCQkJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBjdXJyZW50SW5kZW50YXRpb25MZXZlbDsKKwkJCSAgIAkJCWNvbW1lbnRJbmRlbnRhdGlvbkxldmVsID0gdGhpcy5jdXJyZW50QWxpZ25tZW50LmJyZWFrSW5kZW50YXRpb25MZXZlbDsKKwkJCQkJfSBlbHNlIHsKKwkJICAgIAkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSgpOworCQkJICAgCQkJY29tbWVudEluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmNvbHVtbiAtIDE7CisJCQkJCX0KIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY3VycmVudEFsaWdubWVudC5jb3VsZEJyZWFrKCkgJiYgdGhpcy5jdXJyZW50QWxpZ25tZW50Lndhc1NwbGl0KSB7Ci0JCQkJdGhpcy5jdXJyZW50QWxpZ25tZW50LnBlcmZvcm1GcmFnbWVudEVmZmVjdCgpOworICAgIAkJfQorICAgIAl9CisgICAgCQorICAgIAkvLyBTdG9yZSBsaW5lIGNvbW1lbnQgaW5mb3JtYXRpb24KKyAgIAkJdGhpcy5sYXN0TGluZUNvbW1lbnQuY29udGlndW91cyA9IHRydWU7CisJCXRoaXMubGFzdExpbmVDb21tZW50LmN1cnJlbnRJbmRlbnRhdGlvbiA9IGdldEN1cnJlbnRDb21tZW50SW5kZW50YXRpb24oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbik7CisJCXRoaXMubGFzdExpbmVDb21tZW50LmluZGVudGF0aW9uID0gY29tbWVudEluZGVudGF0aW9uTGV2ZWw7CisJCQorCQkvLyBBZGQgcGVuZGluZyBzcGFjZSBpZiBuZWNlc3NhcnkKKyAgICAJaWYgKHRoaXMucGVuZGluZ1NwYWNlKSB7CisgICAgCQlpZiAodGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHMpIHsKKyAgICAJCQlhZGRJbnNlcnRFZGl0KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIG5ldyBTdHJpbmcodGhpcy5sYXN0TGluZUNvbW1lbnQubGVhZGluZ1NwYWNlcykpOworICAgIAkJfSBlbHNlIHsKKyAgICAJCQlhZGRJbnNlcnRFZGl0KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sICIgIik7IC8vJE5PTi1OTFMtMSQKKyAgICAJCX0KKyAgICAJfQorICAgIAl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworICAgIAl0aGlzLnBlbmRpbmdTcGFjZSA9IGZhbHNlOworICAgIAlpbnQgcHJldmlvdXNTdGFydCA9IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb247CisKKwkJaWYgKCFpc05sc1RhZyAmJiBpbmNsdWRlc0xpbmVDb21tZW50cyAmJiAoIW9uRmlyc3RDb2x1bW4gfHwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9mb3JtYXRfbGluZV9jb21tZW50X3N0YXJ0aW5nX29uX2ZpcnN0X2NvbHVtbikpIHsKKwkJCXByaW50TGluZUNvbW1lbnQoY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgY3VycmVudFRva2VuRW5kUG9zaXRpb24tMSk7CisJCX0gZWxzZSB7CisJCQkvLyBkbyBub3RoaW5nIT8KKwkgICAgCWxvb3A6IHdoaWxlIChuZXh0Q2hhcmFjdGVyU3RhcnQgPD0gY3VycmVudFRva2VuRW5kUG9zaXRpb24gJiYgKGN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKSkgIT0gLTEpIHsKKwkgICAgCQluZXh0Q2hhcmFjdGVyU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCisJICAgIAkJc3dpdGNoKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkgICAgCQkJY2FzZSAnXHInIDoKKwkgICAgCQkJCXN0YXJ0ID0gcHJldmlvdXNTdGFydDsKKwkgICAgCQkJCWJyZWFrIGxvb3A7CisJICAgIAkJCWNhc2UgJ1xuJyA6CisJICAgIAkJCQlzdGFydCA9IHByZXZpb3VzU3RhcnQ7CisJICAgIAkJCQlicmVhayBsb29wOworCSAgICAJCX0KKwkgICAgCQlwcmV2aW91c1N0YXJ0ID0gbmV4dENoYXJhY3RlclN0YXJ0OworCSAgICAJfQorCSAgICAJaWYgKHN0YXJ0ICE9IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24pIHsKKwkgICAgCQkvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGxpbmUgY29tbWVudCBkb2Vzbid0IGVuZCB0aGUgZmlsZQorCSAgICAJCWFkZFJlcGxhY2VFZGl0KHN0YXJ0LCBjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiAtIDEsIHRoaXMubGluZVNlcGFyYXRvcik7CisJICAgIAkJdGhpcy5saW5lKys7CisJICAgIAkJdGhpcy5jb2x1bW4gPSAxOworCSAgICAJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPSAxOworCSAgICAJfQorCQl9CisgICAgCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisgICAgCXRoaXMucGVuZGluZ1NwYWNlID0gZmFsc2U7CisgICAgCS8vIHJlYWxpZ24gdG8gdGhlIHByb3BlciB2YWx1ZQorICAgIAlpZiAodGhpcy5jdXJyZW50QWxpZ25tZW50ICE9IG51bGwpIHsKKyAgICAJCWlmICh0aGlzLm1lbWJlckFsaWdubWVudCAhPSBudWxsKSB7CisgICAgCQkJLy8gc2VsZWN0IHRoZSBsYXN0IGFsaWdubWVudAorICAgIAkJCWlmICh0aGlzLmN1cnJlbnRBbGlnbm1lbnQubG9jYXRpb24uaW5wdXRPZmZzZXQgPiB0aGlzLm1lbWJlckFsaWdubWVudC5sb2NhdGlvbi5pbnB1dE9mZnNldCkgeworICAgIAkJCQlpZiAodGhpcy5jdXJyZW50QWxpZ25tZW50LmNvdWxkQnJlYWsoKSAmJiB0aGlzLmN1cnJlbnRBbGlnbm1lbnQud2FzU3BsaXQpIHsKKyAgICAJCQkJCXRoaXMuY3VycmVudEFsaWdubWVudC5wZXJmb3JtRnJhZ21lbnRFZmZlY3QoKTsKKyAgICAJCQkJfQorICAgIAkJCX0gZWxzZSB7CisgICAgCQkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IE1hdGgubWF4KHRoaXMuaW5kZW50YXRpb25MZXZlbCwgdGhpcy5tZW1iZXJBbGlnbm1lbnQuYnJlYWtJbmRlbnRhdGlvbkxldmVsKTsKKyAgICAJCQl9CisgICAgCQl9IGVsc2UgaWYgKHRoaXMuY3VycmVudEFsaWdubWVudC5jb3VsZEJyZWFrKCkgJiYgdGhpcy5jdXJyZW50QWxpZ25tZW50Lndhc1NwbGl0KSB7CisgICAgCQkJdGhpcy5jdXJyZW50QWxpZ25tZW50LnBlcmZvcm1GcmFnbWVudEVmZmVjdCgpOworICAgIAkJfQorICAgIAkJaWYgKHRoaXMuY3VycmVudEFsaWdubWVudC5raW5kID09IEFsaWdubWVudC5CSU5BUllfRVhQUkVTU0lPTiAmJgorICAgIAkJCXRoaXMuY3VycmVudEFsaWdubWVudC5lbmNsb3NpbmcgIT0gbnVsbCAmJgorICAgIAkJCXRoaXMuY3VycmVudEFsaWdubWVudC5lbmNsb3Npbmcua2luZCA9PSBBbGlnbm1lbnQuQklOQVJZX0VYUFJFU1NJT04gJiYKKyAgICAJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPCB0aGlzLmN1cnJlbnRBbGlnbm1lbnQuYnJlYWtJbmRlbnRhdGlvbkxldmVsKQorICAgIAkJeworICAgIAkJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IHRoaXMuY3VycmVudEFsaWdubWVudC5icmVha0luZGVudGF0aW9uTGV2ZWw7CisgICAgCQl9CisgICAgCX0KKyAgICAJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuRW5kUG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CisgICAgfQorCisJcHJpdmF0ZSB2b2lkIHByaW50TGluZUNvbW1lbnQoaW50IGNvbW1lbnRTdGFydCwgaW50IGNvbW1lbnRFbmQpIHsKKworCQkvLyBDb21wdXRlIGluZGVudGF0aW9uCisJCWludCBmaXJzdENvbHVtbiA9IHRoaXMuY29sdW1uOworCQlpbnQgaW5kZW50TGV2ZWwgPSB0aGlzLmluZGVudGF0aW9uTGV2ZWw7CisJCWludCBpbmRlbnRhdGlvbnMgPSB0aGlzLm51bWJlck9mSW5kZW50YXRpb25zOworCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBnZXROZXh0SW5kZW50YXRpb25MZXZlbChmaXJzdENvbHVtbik7CisJCWlmICh0aGlzLmluZGVudGF0aW9uU2l6ZSAhPSAwKSB7CisJCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gdGhpcy5pbmRlbnRhdGlvbkxldmVsIC8gdGhpcy5pbmRlbnRhdGlvblNpemU7CisJCX0KKwkJZWxzZXsKKwkJCXRoaXMubnVtYmVyT2ZJbmRlbnRhdGlvbnMgPSAwOworCQl9CisKKwkJLy8gQ29uc3VtZSB0aGUgY29tbWVudCBwcmVmaXgKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY29tbWVudFN0YXJ0LCBjb21tZW50RW5kKTsKKwkJdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7CisJCXRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQl0aGlzLmNvbHVtbiArPSAyOworCisJCS8vIFNjYW4gdGhlIHRleHQgdG9rZW4gcGVyIHRva2VuIHRvIGNvbXBhY3QgaXQgYW5kIHNpemUgaXQgdGhlIG1heCBsaW5lIGxlbmd0aAorCQlpbnQgbWF4Q29sdW1uID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9saW5lX2xlbmd0aCArIDE7CisJCWludCBwcmV2aW91c1Rva2VuID0gLTE7CisJCWludCBsYXN0VG9rZW5FbmRQb3NpdGlvbiA9IGNvbW1lbnRTdGFydDsKKwkJaW50IHNwYWNlU3RhcnRQb3NpdGlvbiA9IC0xOworCQlpbnQgc3BhY2VFbmRQb3NpdGlvbiA9IC0xOworCQl0aGlzLnNjYW5uZXIuc2tpcENvbW1lbnRzID0gdHJ1ZTsKKwkJU3RyaW5nIG5ld0xpbmVTdHJpbmcgPSBudWxsOworCQl0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiA9IG51bGw7CisKKwkJLy8gQ29uc3VtZSB0ZXh0IHRva2VuIHBlciB0b2tlbgorCQl3aGlsZSAoIXRoaXMuc2Nhbm5lci5hdEVuZCgpKSB7CisJCQlpbnQgdG9rZW47CisJCQl0cnkgeworCQkJCXRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGlpZSkgeworCSAgICAJCXRva2VuID0gY29uc3VtZUludmFsaWRUb2tlbihjb21tZW50RW5kKTsKKwkJCX0KKwkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0U6CisJCQkJCWlmIChwcmV2aW91c1Rva2VuID09IC0xKSB7CisJCQkJCQkvLyBkbyBub3QgcmVtZW1iZXIgdGhlIGZpcnN0IHdoaXRlc3BhY2UKKwkJCQkJCXByZXZpb3VzVG9rZW4gPSBTS0lQX0ZJUlNUX1dISVRFU1BBQ0VfVE9LRU47CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47CisJCQkJCX0KKwkJCQkJLy8gUmVtZW1iZXIgc3BhY2UgcG9zaXRpb24KKwkJCQkJc3BhY2VTdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJc3BhY2VFbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRjoKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyOgorCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSAtMSB8fCBwcmV2aW91c1Rva2VuID09IFNLSVBfRklSU1RfV0hJVEVTUEFDRV9UT0tFTikgeworCQkJCQkJY2hhcltdIGlkZW50aWZpZXIgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQkJCQlpbnQgc3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisJCQkJCQlpbnQgcmVzdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhpZGVudGlmaWVyLCBQYXJzZXIuRkFMTF9USFJPVUdIX1RBRywgMCwgNS8qbGVuZ3RoIG9mIHN0cmluZyAiJEZBTEwiKi8pICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICctJykgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCXRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsgLy8gIGNvbnN1bWUgdGhlICctJworCQkJCQkJCQl0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsgLy8gY29uc3VtZSB0aGUgIlRIUk9VR0giCisJCQkJCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKSB7CisJCQkJCQkJCQlpZGVudGlmaWVyID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZW5kc1dpdGgoUGFyc2VyLkZBTExfVEhST1VHSF9UQUcsIGlkZW50aWZpZXIpKSB7CisJCQkJCQkJCQkJLy8gdGhlIGNvbW1lbnQgc3RhcnRzIHdpdGggYSBmYWxsIHRocm91Z2gKKwkJCQkJCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBTS0lQX0ZJUlNUX1dISVRFU1BBQ0VfVE9LRU4pIHsKKwkJCQkJCQkJCQkJYWRkUmVwbGFjZUVkaXQoc3BhY2VTdGFydFBvc2l0aW9uLCBzdGFydFBvc2l0aW9uLTEsICIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOworCQkJCQkJCQkJCXByZXZpb3VzVG9rZW4gPSB0b2tlbjsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBpaWUpIHsKKwkJCQkJCQkJLy8gc2tpcAorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIHRoaXMgd2FzIG5vdCBhIHZhbGlkIGZhbGwtdGhyb3VnaCB0YWcsIGhlbmNlIGNvbnRpbnVlIHRvIHByb2Nlc3MgdGhlIGNvbW1lbnQgbm9ybWFsbHkKKwkJCQkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKKwkJCSAgICAJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSByZXN0YXJ0UG9zaXRpb247CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpbnQgdG9rZW5TdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisgICAgCQlpbnQgdG9rZW5MZW5ndGggPSAodGhpcy5zY2FubmVyLmF0RW5kKCkgPyB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gOiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSAtIHRva2VuU3RhcnQ7CisKKwkJCS8vIGluc2VydCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIGlmIG5vdCBwcmVzZW50CisJCQlpZiAocHJldmlvdXNUb2tlbiA9PSAtMSApIHsKKyAgICAJCQlhZGRJbnNlcnRFZGl0KHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAiICIpOyAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5jb2x1bW4rKzsKKwkJCX0KKwkJCS8vIHJlcGxhY2Ugc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBpZiBwcmVzZW50CisJCQllbHNlIGlmIChwcmV2aW91c1Rva2VuID09IFNLSVBfRklSU1RfV0hJVEVTUEFDRV9UT0tFTikgeworCQkJCWFkZFJlcGxhY2VFZGl0KHNwYWNlU3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24tMSwgIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuY29sdW1uKys7CisJCQkJc3BhY2VTdGFydFBvc2l0aW9uID0gLTE7IC8vIGRvIG5vdCB1c2UgdGhpcyBwb3NpdGlvbiB0byBzcGxpdCB0aGUgY29tbWVudAorCQkJfSBlbHNlIHsKKwkJCQkvLyBub3Qgb24gdGhlIGZpcnN0IHRva2VuCisJCQkJYm9vbGVhbiBpbnNlcnRTcGFjZSA9IHByZXZpb3VzVG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRTsKKwkJCQlpZiAoaW5zZXJ0U3BhY2UpIHsKKwkJCQkJLy8gY291bnQgaW5zZXJ0ZWQgc3BhY2UgaWYgYW55IGluIHRva2VuIGxlbmd0aAorCQkJCQl0b2tlbkxlbmd0aCsrOworCQkJCX0KKwkJCQkvLyBpbnNlcnQgbmV3IGxpbmUgaWYgbWF4IGxpbmUgd2lkdGggaXMgcmVhY2hlZCBhbmQgYSBzcGFjZSB3YXMgcHJldmlvdXNseSBlbmNvdW50ZXJlZAorCQkJCWlmIChzcGFjZVN0YXJ0UG9zaXRpb24gPiAwICYmICh0aGlzLmNvbHVtbit0b2tlbkxlbmd0aCkgPiBtYXhDb2x1bW4pIHsKKwkJCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcysrOworCQkJCQl0aGlzLmxpbmUrKzsKKwkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCWlmICghdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uKSB7CisJCQkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMudGVtcEJ1ZmZlcik7CisJCQkJCQl9CisJCQkJCSAgICB0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKExJTkVfQ09NTUVOVF9QUkVGSVgpOworCQkJCQkJdGhpcy5jb2x1bW4gKz0gTElORV9DT01NRU5UX1BSRUZJWF9MRU5HVEg7CisJCQkJCQluZXdMaW5lU3RyaW5nID0gdGhpcy50ZW1wQnVmZmVyLnRvU3RyaW5nKCk7CisJCQkJICAgIAlmaXJzdENvbHVtbiA9IHRoaXMuY29sdW1uOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGhpcy5jb2x1bW4gPSBmaXJzdENvbHVtbjsKKwkJCQkJfQorCQkJCQlpZiAobGFzdFRva2VuRW5kUG9zaXRpb24gPiBzcGFjZUVuZFBvc2l0aW9uKSB7CisJCQkJCQl0aGlzLmNvbHVtbiArPSBsYXN0VG9rZW5FbmRQb3NpdGlvbiAtIChzcGFjZUVuZFBvc2l0aW9uICsgMSk7IC8vIGFkZCBhbGwgcHJldmlvdXMgdG9rZW5zIGxlbmd0aHMgc2luY2UgbGFzdCBzcGFjZQorCQkJCQl9CisJCQkJCWlmICh0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXS5vZmZzZXQgPT0gc3BhY2VTdGFydFBvc2l0aW9uKSB7CisJCQkJCQkvLyBwcmV2aW91cyBzcGFjZSB3YXMgYWxyZWFkeSBlZGl0ZWQsIHNvIHJlbW92ZSBpdAorCQkJCQkJdGhpcy5lZGl0c0luZGV4LS07CisJCQkJCX0KKwkJCQkJYWRkUmVwbGFjZUVkaXQoc3BhY2VTdGFydFBvc2l0aW9uLCBzcGFjZUVuZFBvc2l0aW9uLCBuZXdMaW5lU3RyaW5nKTsKKwkJCQkJc3BhY2VTdGFydFBvc2l0aW9uID0gLTE7CisJCQkJCWlmIChpbnNlcnRTcGFjZSkgeworCQkJCQkJdG9rZW5MZW5ndGgtLTsgLy8gcmVkdWNlIHRva2VuIGxlbmd0aCBhcyB0aGUgc3BhY2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV3IGxpbmUKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyByZXBsYWNlIHNwYWNlIGlmIG5lZWRlZAorCQkJCWVsc2UgaWYgKGluc2VydFNwYWNlKSB7CisJCQkJCWFkZFJlcGxhY2VFZGl0KHNwYWNlU3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24tMSwgIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJCS8vIHVwZGF0ZSBjb2x1bW4gcG9zaXRpb24gYW5kIHN0b3JlIGluZm8gb2YgdGhlIGN1cnJlbnQgdG9rZW4KKwkJCXRoaXMuY29sdW1uICs9IHRva2VuTGVuZ3RoOworCQkJcHJldmlvdXNUb2tlbiA9IHRva2VuOworCQkJbGFzdFRva2VuRW5kUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQl9CisJCXRoaXMuc2Nhbm5lci5za2lwQ29tbWVudHMgPSBmYWxzZTsKKworCQkvLyBTa2lwIHNlcGFyYXRvciBpZiB0aGUgY29tbWVudCBpcyBub3QgYXQgdGhlIGVuZCBvZiBmaWxlCisJCXRoaXMuaW5kZW50YXRpb25MZXZlbCA9IGluZGVudExldmVsOworCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zID0gaW5kZW50YXRpb25zOworCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMDsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8obGFzdFRva2VuRW5kUG9zaXRpb24sIGNvbW1lbnRFbmQpOworCQl3aGlsZSAoIXRoaXMuc2Nhbm5lci5hdEVuZCgpKSB7CisJCQlzcGFjZUVuZFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCXRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicgfHwgdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgeworCQkJCS8vIGxpbmUgY29tbWVudCBpcyBub3JtYWxseSBlbmRlZCB3aXRoIG5ldyBsaW5lCisJCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJCXRoaXMubGluZSsrOworCQkJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMrKzsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQotCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5FbmRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKworCQkvLyBSZXBsYWNlIHRoZSBsaW5lIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBjb21tZW50IGlmIGFueS4uLgorCQlpbnQgc3RhcnRSZXBsYWNlID0gcHJldmlvdXNUb2tlbiA9PSBTS0lQX0ZJUlNUX1dISVRFU1BBQ0VfVE9LRU4gPyBzcGFjZVN0YXJ0UG9zaXRpb24gOiBsYXN0VG9rZW5FbmRQb3NpdGlvbjsKKwkJaWYgKHRoaXMuY29sdW1uID09IDEgJiYgY29tbWVudEVuZCA+PSBzdGFydFJlcGxhY2UpIHsKKwkJCWFkZFJlcGxhY2VFZGl0KHN0YXJ0UmVwbGFjZSwgY29tbWVudEVuZCwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMubGluZV9zZXBhcmF0b3IpOworCQl9CiAJfQorCiAJcHVibGljIHZvaWQgcHJpbnRFbXB0eUxpbmVzKGludCBsaW5lc051bWJlcikgewogCQl0aGlzLnByaW50RW1wdHlMaW5lcyhsaW5lc051bWJlciwgdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkgKyAxKTsKIAl9CkBAIC0xMTYxLDE1ICszMDQ5LDE0IEBACiAJcHJpdmF0ZSB2b2lkIHByaW50RW1wdHlMaW5lcyhpbnQgbGluZXNOdW1iZXIsIGludCBpbnNlcnRQb3NpdGlvbikgewogCQlmaW5hbCBTdHJpbmcgYnVmZmVyID0gZ2V0RW1wdHlMaW5lcyhsaW5lc051bWJlcik7CiAJCWlmIChVdGlsLkVNUFRZX1NUUklORyA9PSBidWZmZXIpIHJldHVybjsKLQogCQlhZGRJbnNlcnRFZGl0KGluc2VydFBvc2l0aW9uLCBidWZmZXIpOwogCX0KIAogCXZvaWQgcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoYnVmZmVyKTsKLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCWFkZEluc2VydEVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgYnVmZmVyLnRvU3RyaW5nKCkpOworCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy50ZW1wQnVmZmVyKTsKKwkJaWYgKHRoaXMudGVtcEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKwkJCWFkZEluc2VydEVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKSwgdGhpcy50ZW1wQnVmZmVyLnRvU3RyaW5nKCkpOwogCQkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsKIAkJfQogCX0KQEAgLTExODIsMjEgKzMwNjksMjAgQEAKIAkJCQlpbnQgaW5kZW50YXRpb25zQXNUYWIgPSAwOwogCQkJCWlmICh1c2VUYWJzRm9yTGVhZGluZ0luZGVudHMpIHsKIAkJCQkJd2hpbGUgKHRoaXMuY29sdW1uIDw9IHRoaXMuaW5kZW50YXRpb25MZXZlbCkgewotCQkJCQkJaWYgKGluZGVudGF0aW9uc0FzVGFiIDwgbnVtYmVyT2ZMZWFkaW5nSW5kZW50cykgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCQkJCQlpZiAodGhpcy50YWJMZW5ndGggPiAwICYmIGluZGVudGF0aW9uc0FzVGFiIDwgbnVtYmVyT2ZMZWFkaW5nSW5kZW50cykgeworCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnXHQnKTsKIAkJCQkJCQlpbmRlbnRhdGlvbnNBc1RhYisrOwogCQkJCQkJCWludCBjb21wbGVtZW50ID0gdGhpcy50YWJMZW5ndGggLSAoKHRoaXMuY29sdW1uIC0gMSkgJSB0aGlzLnRhYkxlbmd0aCk7IC8vIGFtb3VudCBvZiBzcGFjZQogCQkJCQkJCXRoaXMuY29sdW1uICs9IGNvbXBsZW1lbnQ7Ci0JCQkJCQkJdGhpcy5uZWVkU3BhY2UgPSBmYWxzZTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJCQkJCXRoaXMuY29sdW1uKys7Ci0JCQkJCQkJdGhpcy5uZWVkU3BhY2UgPSBmYWxzZTsKIAkJCQkJCX0KKwkJCQkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CiAJCQkJCX0KLQkJCQl9IGVsc2UgeworCQkJCX0gZWxzZSBpZiAodGhpcy50YWJMZW5ndGggPiAwKSB7CiAJCQkJCXdoaWxlICh0aGlzLmNvbHVtbiA8PSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CiAJCQkJCQlpbnQgY29tcGxlbWVudCA9IHRoaXMudGFiTGVuZ3RoIC0gKCh0aGlzLmNvbHVtbiAtIDEpICUgdGhpcy50YWJMZW5ndGgpOyAvLyBhbW91bnQgb2Ygc3BhY2UKIAkJCQkJCXRoaXMuY29sdW1uICs9IGNvbXBsZW1lbnQ7CiAJCQkJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwpAQCAtMTIwNSw3ICszMDkxLDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLlNQQUNFIDoKIAkJCQl3aGlsZSAodGhpcy5jb2x1bW4gPD0gdGhpcy5pbmRlbnRhdGlvbkxldmVsKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCcgJyk7CiAJCQkJCXRoaXMuY29sdW1uKys7CiAJCQkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CiAJCQkJfQpAQCAtMTIxOCwyMiArMzEwNCwyNCBAQAogCQkJCQlmaW5hbCBpbnQgY29sdW1uRm9yTGVhZGluZ0luZGVudHMgPSBudW1iZXJPZkxlYWRpbmdJbmRlbnRzICogdGhpcy5pbmRlbnRhdGlvblNpemU7CiAJCQkJCXdoaWxlICh0aGlzLmNvbHVtbiA8PSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKIAkJCQkJCWlmICh0aGlzLmNvbHVtbiA8PSBjb2x1bW5Gb3JMZWFkaW5nSW5kZW50cykgewotCQkJCQkJCWlmICgodGhpcy5jb2x1bW4gLSAxICsgdGhpcy50YWJMZW5ndGgpIDw9IHRoaXMuaW5kZW50YXRpb25MZXZlbCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCdcdCcpOworCQkJCQkJCWlmICh0aGlzLnRhYkxlbmd0aCA+IDAgJiYgKHRoaXMuY29sdW1uIC0gMSArIHRoaXMudGFiTGVuZ3RoKSA8PSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKKwkJCQkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCdcdCcpOwogCQkJCQkJCQl0aGlzLmNvbHVtbiArPSB0aGlzLnRhYkxlbmd0aDsKIAkJCQkJCQl9IGVsc2UgaWYgKCh0aGlzLmNvbHVtbiAtIDEgKyB0aGlzLmluZGVudGF0aW9uU2l6ZSkgPD0gdGhpcy5pbmRlbnRhdGlvbkxldmVsKSB7CiAJCQkJCQkJCS8vIHByaW50IG9uZSBpbmRlbnRhdGlvbgorCQkJCQkJCQkvLyBub3RlIHRoYXQgdGhpcy5pbmRlbnRhdGlvblNpemUgPiAwIHdoZW4gZW50ZXJpbmcgaW4gdGhlIGZvbGxvd2luZyBsb29wCisJCQkJCQkJCS8vIGhlbmNlIHRoaXMuY29sdW1uIHdpbGwgYmUgaW5jcmVtZW50ZWQgYW5kIHRoZW4gYXZvaWQgZW5kbGVzcyBsb29wIChzZWUgYnVnIDI5MDkwNSkKIAkJCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuaW5kZW50YXRpb25TaXplOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJCQkJCQkJdGhpcy5jb2x1bW4rKzsKIAkJCQkJCQkJfQogCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCcgJyk7CiAJCQkJCQkJCXRoaXMuY29sdW1uKys7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlmb3IgKGludCBpID0gdGhpcy5jb2x1bW4sIG1heCA9IHRoaXMuaW5kZW50YXRpb25MZXZlbDsgaSA8PSBtYXg7IGkrKykgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJCQkJCQl0aGlzLmNvbHVtbisrOwogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTEyNDEsMTcgKzMxMjksMTcgQEAKIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCXdoaWxlICh0aGlzLmNvbHVtbiA8PSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKLQkJCQkJCWlmICgodGhpcy5jb2x1bW4gLSAxICsgdGhpcy50YWJMZW5ndGgpIDw9IHRoaXMuaW5kZW50YXRpb25MZXZlbCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCQkJCQlpZiAodGhpcy50YWJMZW5ndGggPiAwICYmICh0aGlzLmNvbHVtbiAtIDEgKyB0aGlzLnRhYkxlbmd0aCkgPD0gdGhpcy5pbmRlbnRhdGlvbkxldmVsKSB7CisJCQkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCdcdCcpOwogCQkJCQkJCXRoaXMuY29sdW1uICs9IHRoaXMudGFiTGVuZ3RoOwotCQkJCQkJfSBlbHNlIGlmICgodGhpcy5jb2x1bW4gLSAxICsgdGhpcy5pbmRlbnRhdGlvblNpemUpIDw9IHRoaXMuaW5kZW50YXRpb25MZXZlbCkgeworCQkJCQkJfSBlbHNlIGlmICh0aGlzLmluZGVudGF0aW9uU2l6ZSA+IDAgJiYgKHRoaXMuY29sdW1uIC0gMSArIHRoaXMuaW5kZW50YXRpb25TaXplKSA8PSB0aGlzLmluZGVudGF0aW9uTGV2ZWwpIHsKIAkJCQkJCQkvLyBwcmludCBvbmUgaW5kZW50YXRpb24KIAkJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5pbmRlbnRhdGlvblNpemU7IGkgPCBtYXg7IGkrKykgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJCQkJCQl0aGlzLmNvbHVtbisrOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJCQkJCXRoaXMuY29sdW1uKys7CiAJCQkJCQl9CiAJCQkJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwpAQCAtMTI2MSw3ICszMTQ5LDEzODYgQEAKIAkJfQogCX0KIAorCXByaXZhdGUgdm9pZCBwcmludEphdmFkb2NCbG9jayhGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2spIHsKKwkJaWYoIGJsb2NrID09IG51bGwpIHJldHVybjsKKworCQkvLyBJbml0IHBvc2l0aW9ucworCQlpbnQgcHJldmlvdXNFbmQgPSBibG9jay50YWdFbmQ7CisJCWludCBtYXhOb2RlcyA9IGJsb2NrLm5vZGVzUHRyOworCisJCS8vIENvbXB1dGUgaW5kZW50YXRpb24KKwkJYm9vbGVhbiBoZWFkZXJMaW5lID0gYmxvY2suaXNIZWFkZXJMaW5lKCkgJiYgdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAwOworCQlpbnQgbWF4Q29sdW1uID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9saW5lX2xlbmd0aCArIDE7CisJCWlmIChoZWFkZXJMaW5lKSB7CisJCQltYXhDb2x1bW4rKzsKKwkJfQorCisJCS8vIGZvcm1hdCB0YWcgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKwkJaWYgKCFibG9jay5pc0lubGluZWQoKSkgeworCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDA7CisJCX0KKwkJaWYgKGJsb2NrLmlzRGVzY3JpcHRpb24oKSkgeworCQkJaWYgKCFibG9jay5pc0lubGluZWQoKSkgeworCQkJICAgIHRoaXMuY29tbWVudEluZGVudGF0aW9uID0gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCB0YWdMZW5ndGggPSBwcmV2aW91c0VuZCAtIGJsb2NrLnNvdXJjZVN0YXJ0ICsgMTsKKwkJCXRoaXMuY29sdW1uICs9IHRhZ0xlbmd0aDsKKwkJCWlmICghYmxvY2suaXNJbmxpbmVkKCkpIHsKKwkJCSAgICBib29sZWFuIGluZGVudFJvb3RUYWdzID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9pbmRlbnRfcm9vdF90YWdzICYmICFibG9jay5pc0luRGVzY3JpcHRpb24oKTsKKwkJCSAgICBpbnQgY29tbWVudEluZGVudGF0aW9uTGV2ZWwgPSAwOworCQkJCWlmIChpbmRlbnRSb290VGFncykgeworCQkJCSAgICBjb21tZW50SW5kZW50YXRpb25MZXZlbCA9IHRhZ0xlbmd0aCArIDE7CisJCQkJCWJvb2xlYW4gaW5kZW50UGFyYW1UYWcgPSB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2luZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb24gJiYgYmxvY2suaXNJblBhcmFtVGFnKCk7CisJCQkJCWlmIChpbmRlbnRQYXJhbVRhZykgeworCQkJCQkJY29tbWVudEluZGVudGF0aW9uTGV2ZWwgKz0gdGhpcy5pbmRlbnRhdGlvblNpemU7CisJCQkJCX0KKwkJCQl9CisJCQkJc2V0Q29tbWVudEluZGVudGF0aW9uKGNvbW1lbnRJbmRlbnRhdGlvbkxldmVsKTsKKwkJCX0KKwkJCUZvcm1hdEphdmFkb2NSZWZlcmVuY2UgcmVmZXJlbmNlPSBibG9jay5yZWZlcmVuY2U7CisJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKKwkJCQkvLyBmb3JtYXQgcmVmZXJlbmNlCisJCQkJcHJpbnRKYXZhZG9jQmxvY2tSZWZlcmVuY2UoYmxvY2ssIHJlZmVyZW5jZSk7CisJCQkJcHJldmlvdXNFbmQgPSByZWZlcmVuY2Uuc291cmNlRW5kOworCQkJfQorCisJCQkvLyBOb3RoaW5nIGVsc2UgdG8gZG8gaWYgdGhlIHRhZyBoYXMgbm8gbm9kZQorCQkJaWYgKG1heE5vZGVzIDwgMCkgIHsKKwkJCQlpZiAoYmxvY2suaXNJbmxpbmVkKCkpIHsKKwkJCQkJdGhpcy5jb2x1bW4rKzsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLy8gdGFnIHNlY3Rpb246IGl0ZXJhdGUgdGhyb3VnaCB0aGUgYmxvY2tzIGNvbXBvc2luZyB0aGlzIHRhZyBidXQgdGhlIGxhc3Qgb25lCisJCWludCBwcmV2aW91c0xpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIocHJldmlvdXNFbmQsIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubWF4TGluZXMpOworCQlib29sZWFuIGNsZWFyQmxhbmtMaW5lcyA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50OworCQlib29sZWFuIGpvaW5MaW5lcyA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmpvaW5fbGluZXNfaW5fY29tbWVudHM7CisJCWZvciAoaW50IGk9MDsgaTw9bWF4Tm9kZXM7IGkrKykgeworCQkJRm9ybWF0SmF2YWRvY05vZGUgbm9kZSA9IGJsb2NrLm5vZGVzW2ldOworCQkJaW50IG5vZGVTdGFydCA9IG5vZGUuc291cmNlU3RhcnQ7CisKKwkJCS8vIFByaW50IGVtcHR5IGxpbmVzIGJlZm9yZSB0aGUgbm9kZQorCQkJaW50IG5ld0xpbmVzOworCQkJaWYgKGkgPT0gMCkgeworCQkJCW5ld0xpbmVzID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlciAmJiBibG9jay5pc1BhcmFtVGFnKCkgPyAxIDogMDsKKwkJCQlpZiAobm9kZVN0YXJ0ID4gKHByZXZpb3VzRW5kKzEpKSB7CisJCQkJCWlmICghY2xlYXJCbGFua0xpbmVzIHx8ICFqb2luTGluZXMpIHsKKwkJCQkJCWludCBzdGFydExpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIobm9kZVN0YXJ0LCB0aGlzLmxpbmVFbmRzLCBwcmV2aW91c0xpbmUtMSwgdGhpcy5tYXhMaW5lcyk7CisJCQkJCQlpbnQgZ2FwTGluZSA9IHByZXZpb3VzTGluZTsKKwkJCQkJCWlmIChqb2luTGluZXMpIGdhcExpbmUrKzsgLy8gaWYgbm90IHByZXNlcnZpbmcgbGluZSBicmVhayB0aGVuIGdhcCBtdXN0IGJlIGF0IGxlYXN0IG9mIG9uZSBsaW5lCisJCQkJCQlpZiAoc3RhcnRMaW5lID4gZ2FwTGluZSkgeworCQkJCQkJCW5ld0xpbmVzID0gc3RhcnRMaW5lIC0gcHJldmlvdXNMaW5lOworCQkJCQkJfQorCQkJCQkJaWYgKGNsZWFyQmxhbmtMaW5lcykgeworCQkJCQkJCS8vIGNsZWFyaW5nIGJsYW5rIGxpbmVzIGluIHRoaXMgYmxvY2sgbWVhbnMgdGhhdCBicmVhayBsaW5lcyBzaG91bGQgYmUgcHJlc2VydmVkLCBoZW5jZSBvbmx5IGtlZXAgb25lIG5ldyBsaW5lCisJCQkJCQkJaWYgKG5ld0xpbmVzID4gMCkgIG5ld0xpbmVzID0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAobmV3TGluZXMgPT0gMCAmJiAoIW5vZGUuaXNJbW11dGFibGUoKSB8fCBibG9jay5yZWZlcmVuY2UgIT0gbnVsbCkpIHsKKwkJCQkJCW5ld0xpbmVzID0gcHJpbnRKYXZhZG9jQmxvY2tOb2Rlc05ld0xpbmVzKGJsb2NrLCBub2RlLCBwcmV2aW91c0VuZCk7CisJCQkJCX0KKwkJCQkJaWYgKGJsb2NrLmlzSW1tdXRhYmxlKCkpIHsKKwkJCQkJCXByaW50SmF2YWRvY0dhcExpbmVzRm9ySW1tdXRhYmxlQmxvY2soYmxvY2spOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNFbmQrMSwgbm9kZVN0YXJ0LTEsIG5ld0xpbmVzLCBjbGVhckJsYW5rTGluZXMsIGZhbHNlLCBudWxsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCWlmIChuZXdMaW5lcyA+IDApIHsKKwkJCQkJCWZvciAoaW50IGo9MDsgajxuZXdMaW5lczsgaisrKSB7CisJCQkJCQkJcHJpbnRKYXZhZG9jTmV3TGluZSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQkJfQorCQkJCQkJYWRkSW5zZXJ0RWRpdChub2RlU3RhcnQsIHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmV3TGluZXMgPSB0aGlzLmNvbHVtbiA+IG1heENvbHVtbiA/IDEgOiAwOworCQkJCWlmICghY2xlYXJCbGFua0xpbmVzICYmIG5vZGUubGluZVN0YXJ0ID4gKHByZXZpb3VzTGluZSsxKSkgbmV3TGluZXMgPSBub2RlLmxpbmVTdGFydCAtIHByZXZpb3VzTGluZTsKKwkJCQlpZiAobmV3TGluZXMgPCBub2RlLmxpbmVzQmVmb3JlKSBuZXdMaW5lcyA9IG5vZGUubGluZXNCZWZvcmU7CisJCQkJaWYgKG5ld0xpbmVzID09IDApIHsKKwkJCQkJbmV3TGluZXMgPSBwcmludEphdmFkb2NCbG9ja05vZGVzTmV3TGluZXMoYmxvY2ssIG5vZGUsIHByZXZpb3VzRW5kKTsKKwkJCQl9CisJCQkJaWYgKG5ld0xpbmVzID4gMCB8fCBub2RlU3RhcnQgPiAocHJldmlvdXNFbmQrMSkpIHsKKwkJICAgCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNFbmQrMSwgbm9kZVN0YXJ0LTEsIG5ld0xpbmVzLCBjbGVhckJsYW5rTGluZXMsIGZhbHNlLCBudWxsKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaGVhZGVyTGluZSAmJiBuZXdMaW5lcyA+IDApIHsKKwkJCQloZWFkZXJMaW5lID0gZmFsc2U7CisJCQkJbWF4Q29sdW1uLS07CisJCQl9CisKKwkJCS8vIFByaW50IG5vZGUKKwkJCWlmIChub2RlLmlzVGV4dCgpKSB7CisJCQkJRm9ybWF0SmF2YWRvY1RleHQgdGV4dCA9IChGb3JtYXRKYXZhZG9jVGV4dCkgbm9kZTsKKwkJCQlpZiAodGV4dC5pc0ltbXV0YWJsZSgpKSB7CisJCQkJCS8vIEluZGVudCBpZiBuZXcgbGluZSB3YXMgYWRkZWQKKwkJCQkJaWYgKHRleHQuaXNJbW11dGFibGVIdG1sVGFnKCkgJiYgbmV3TGluZXMgPiAwICYmIHRoaXMuY29tbWVudEluZGVudGF0aW9uICE9IG51bGwpIHsKKwkJCQkgICAgCWFkZEluc2VydEVkaXQobm9kZS5zb3VyY2VTdGFydCwgdGhpcy5jb21tZW50SW5kZW50YXRpb24pOworCQkJCSAgICAJdGhpcy5jb2x1bW4gKz0gdGhpcy5jb21tZW50SW5kZW50YXRpb24ubGVuZ3RoKCk7CisJCQkJCX0KKwkJCQkJcHJpbnRKYXZhZG9jSW1tdXRhYmxlVGV4dCh0ZXh0LCBibG9jaywgbmV3TGluZXMgPiAwKTsKKwkJCQkJdGhpcy5jb2x1bW4gKz0gZ2V0VGV4dExlbmd0aChibG9jaywgdGV4dCk7CisJCQkJfSBlbHNlIGlmICh0ZXh0LmlzSHRtbFRhZygpKSB7CisJCQkJCXByaW50SmF2YWRvY0h0bWxUYWcodGV4dCwgYmxvY2ssIG5ld0xpbmVzPjApOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50SmF2YWRvY1RleHQodGV4dCwgYmxvY2ssIG5ld0xpbmVzPjApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5ld0xpbmVzID4gMCAmJiB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiAhPSBudWxsKSB7CisJCQkgICAgCWFkZEluc2VydEVkaXQobm9kZS5zb3VyY2VTdGFydCwgdGhpcy5jb21tZW50SW5kZW50YXRpb24pOworCQkJICAgIAl0aGlzLmNvbHVtbiArPSB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbi5sZW5ndGgoKTsKKwkJCQl9CisJCQkJcHJpbnRKYXZhZG9jQmxvY2soKEZvcm1hdEphdmFkb2NCbG9jaylub2RlKTsKKwkJCX0KKworCQkJLy8gUHJpbnQgZW1wdHkgbGluZXMgYmVmb3JlIHRoZSBub2RlCisJCQlwcmV2aW91c0VuZCA9IG5vZGUuc291cmNlRW5kOworCQkJcHJldmlvdXNMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHByZXZpb3VzRW5kLCB0aGlzLmxpbmVFbmRzLCBub2RlLmxpbmVTdGFydCA+IDEgPyBub2RlLmxpbmVTdGFydC0yIDogMCwgdGhpcy5tYXhMaW5lcyk7CisJCX0KKwkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDA7CisJfQorCisJcHJpdmF0ZSBpbnQgcHJpbnRKYXZhZG9jQmxvY2tOb2Rlc05ld0xpbmVzKEZvcm1hdEphdmFkb2NCbG9jayBibG9jaywgRm9ybWF0SmF2YWRvY05vZGUgbm9kZSwgaW50IHByZXZpb3VzRW5kKSB7CisJICAgCWludCBtYXhDb2x1bW4gPSB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2xpbmVfbGVuZ3RoKzE7CisgICAgCWludCBub2RlU3RhcnQgPSBub2RlLnNvdXJjZVN0YXJ0OworIAkgICAgdHJ5IHsKKwkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKG5vZGVTdGFydCAsIG5vZGUuc291cmNlRW5kKTsKKwkgICAgCWludCBsZW5ndGggPSAwOworCSAgICAJYm9vbGVhbiBuZXdMaW5lID0gZmFsc2U7CisJCQlib29sZWFuIGhlYWRlckxpbmUgPSBibG9jay5pc0hlYWRlckxpbmUoKSAmJiB0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzID09IDA7CisJCQlpbnQgZmlyc3RDb2x1bW4gPSAxICsgdGhpcy5pbmRlbnRhdGlvbkxldmVsICsgQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQkJaWYgKHRoaXMuY29tbWVudEluZGVudGF0aW9uICE9IG51bGwpIGZpcnN0Q29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCQkJaWYgKGhlYWRlckxpbmUpIG1heENvbHVtbisrOworCQkJRm9ybWF0SmF2YWRvY1RleHQgdGV4dCA9IG51bGw7CisJCQlib29sZWFuIGlzSW1tdXRhYmxlTm9kZSA9IG5vZGUuaXNJbW11dGFibGUoKTsKKwkJCWJvb2xlYW4gbm9kZUlzVGV4dCA9IG5vZGUuaXNUZXh0KCk7CisJCQlpZiAobm9kZUlzVGV4dCkgeworCSAgICAJCXRleHQgPSAoRm9ybWF0SmF2YWRvY1RleHQpbm9kZTsKKwkJCX0gZWxzZSB7CisJCQkJRm9ybWF0SmF2YWRvY0Jsb2NrIGlubGluZWRCbG9jayA9IChGb3JtYXRKYXZhZG9jQmxvY2spbm9kZTsKKwkJCQlpZiAoaXNJbW11dGFibGVOb2RlKSB7CisJCQkJCXRleHQgPSAoRm9ybWF0SmF2YWRvY1RleHQpIGlubGluZWRCbG9jay5nZXRMYXN0Tm9kZSgpOworCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQkgICAgCQlsZW5ndGggKz0gaW5saW5lZEJsb2NrLnRhZ0VuZCAtIGlubGluZWRCbG9jay5zb3VyY2VTdGFydCArIDE7ICAvLyB0YWcgbGVuZ3RoCisJCQkJICAgIAlpZiAobm9kZVN0YXJ0ID4gKHByZXZpb3VzRW5kKzEpKSB7CisJCQkJICAgIAkJbGVuZ3RoKys7IC8vIGluY2x1ZGUgc3BhY2UgYmV0d2VlbiBub2RlcworCQkJCSAgICAJfQorCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGV4dC5zb3VyY2VTdGFydCAsIG5vZGUuc291cmNlRW5kKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkgICAgCWlmICh0ZXh0ICE9IG51bGwpIHsKKyAgICAJCQlpZiAoaXNJbW11dGFibGVOb2RlKSB7CisJCQkgICAgCWlmIChub2RlU3RhcnQgPiAocHJldmlvdXNFbmQrMSkpIHsKKwkJCSAgICAJCWxlbmd0aCsrOyAvLyBpbmNsdWRlIHNwYWNlIGJldHdlZW4gbm9kZXMKKwkJCSAgICAJfQorICAgIAkJCQlpbnQgbGFzdENvbHVtbiA9IHRoaXMuY29sdW1uICsgbGVuZ3RoOworCSAgICAJCQl3aGlsZSAoIXRoaXMuc2Nhbm5lci5hdEVuZCgpKSB7CisJICAgIAkJCQl0cnkgeworCQkgICAgCQkJCWludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJICAgIAkJCQlzd2l0Y2ggKHRva2VuKSB7CisJCSAgICAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRToKKwkJICAgIAkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmluZGV4T2YoJ1xuJywgdGhpcy5zY2FubmVyLnNvdXJjZSwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pID49IDApIHsKKwkJICAgIAkJCQkJCQlyZXR1cm4gMDsKKwkJICAgIAkJCQkJCX0KKwkJCQkJCQkJCWxhc3RDb2x1bW4gPSBnZXRDdXJyZW50SW5kZW50YXRpb24odGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpLCBsYXN0Q29sdW1uKTsKKwkJICAgIAkJCQkJCWJyZWFrOworCQkgICAgCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1VTFRJUExZOgorCQkgICAgCQkJCQkJaWYgKG5ld0xpbmUpIHsKKwkJICAgIAkJCQkJCQluZXdMaW5lID0gZmFsc2U7CisJCSAgICAJCQkJCQkJY29udGludWU7CisJCSAgICAJCQkJCQl9CisJCSAgICAJCQkJCQlsYXN0Q29sdW1uKys7CisJCSAgICAJCQkJCQlicmVhazsKKwkJICAgIAkJCQkJZGVmYXVsdDoKKwkJCQkJICAgIAkJCWxhc3RDb2x1bW4gKz0gKHRoaXMuc2Nhbm5lci5hdEVuZCgpID8gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDogdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgLSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJICAgIAkJCQkJCWJyZWFrOworCQkgICAgCQkJCX0KKwkgICAgCQkJCX0KKwkgICAgCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWllKSB7CisJICAgIAkJCQkJLy8gbWF5YmUgYW4gdW50ZXJtaW5hdGVkIHN0cmluZyBvciBjb21tZW50CisJCQkgICAgCQkJbGFzdENvbHVtbiArPSAodGhpcy5zY2FubmVyLmF0RW5kKCkgPyB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gOiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCSAgICAJCQkJfQorCSAgICAJCQkJaWYgKGxhc3RDb2x1bW4gPiBtYXhDb2x1bW4pIHsKKwkgICAgCQkJCQlyZXR1cm4gMTsKKwkJCQkJCX0KKwkgICAgCQkJfQorCSAgICAJCQlyZXR1cm4gMDsKKyAgICAJCQl9CisgICAgCQkJaWYgKHRleHQuaXNIdG1sVGFnKCkpIHsKKyAgICAJCQkJaWYgKHRleHQuZ2V0SHRtbFRhZ0lEKCkgPT0gSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEKSB7CisgICAgCQkJCQkvLyBuZXZlciBicmVhayBiZWZvcmUgc2luZ2xlIGJyZWFrIHRhZworICAgIAkJCQkJcmV0dXJuIDA7CisgICAgCQkJCX0KKwkgICAgCQkJLy8gcmVhZCB0aGUgaHRtbCB0YWcKKyAgICAJCQkJdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOworCSAgICAJCQlpZiAodGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURJVklERSkgeworCSAgICAJCQkJbGVuZ3RoKys7CisJICAgIAkJCQl0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJICAgIAkJCX0KKwkgICAgCQkJbGVuZ3RoICs9ICh0aGlzLnNjYW5uZXIuYXRFbmQoKSA/IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA6IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIC0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247CisJICAgIAkJCXRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsgLy8gJz4nCisJICAgIAkJCWxlbmd0aCsrOworCSAgICAJCX0gZWxzZSB7CisJICAgIAkJCXdoaWxlICh0cnVlKSB7CisJICAgIAkJCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJICAgIAkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSB8fCB0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIGJyZWFrOworCQkgICAgCQkJaW50IHRva2VuTGVuZ3RoID0gKHRoaXMuc2Nhbm5lci5hdEVuZCgpID8gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDogdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgLSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJICAgIAkJCWxlbmd0aCArPSB0b2tlbkxlbmd0aDsKKwkJICAgIAkJCWlmICgodGhpcy5jb2x1bW4gKyBsZW5ndGgpID49IG1heENvbHVtbikgeworCQkgICAgCQkJCWJyZWFrOworCQkgICAgCQkJfQorCSAgICAJCQl9CisJICAgIAkJfQorCSAgICAJfSBlbHNlIHsKKwkgICAgCQlGb3JtYXRKYXZhZG9jQmxvY2sgaW5saW5lZEJsb2NrID0gKEZvcm1hdEphdmFkb2NCbG9jaykgbm9kZTsKKwkgICAgCQlsZW5ndGggKz0gaW5saW5lZEJsb2NrLnRhZ0VuZCAtIGlubGluZWRCbG9jay5zb3VyY2VTdGFydCArIDE7ICAvLyB0YWcgbGVuZ3RoCisJICAgIAkJaWYgKGlubGluZWRCbG9jay5yZWZlcmVuY2UgIT0gbnVsbCkgeworCQkgICAgCQlsZW5ndGgrKzsgLy8gc3BhY2UgYmV0d2VlbiB0YWcgYW5kIHJlZmVyZW5jZQorCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhpbmxpbmVkQmxvY2sucmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCBpbmxpbmVkQmxvY2sucmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCQkJCWludCBwcmV2aW91c1Rva2VuID0gLTE7CisJCQkJCWxvb3A6IHdoaWxlICghdGhpcy5zY2FubmVyLmF0RW5kKCkpIHsKKwkJCQkJCWludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCSAgICAJCWludCB0b2tlbkxlbmd0aCA9ICh0aGlzLnNjYW5uZXIuYXRFbmQoKSA/IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA6IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIC0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSkgeyAvLyBzcGFjZSBiZXR3ZWVuIG1ldGhvZCBhcmd1bWVudHMKKwkJCQkJCQkJCWxlbmd0aCsrOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFk6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWxlbmd0aCArPSB0b2tlbkxlbmd0aDsKKwkJCQkJCQkJaWYgKCh0aGlzLmNvbHVtbitsZW5ndGgpID4gbWF4Q29sdW1uKSB7CisJCQkJCQkJCQlicmVhayBsb29wOworCQkJCQkJCQl9CisJCQkJCSAgICAJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcHJldmlvdXNUb2tlbiA9IHRva2VuOworCQkgICAgCQl9CisJICAgIAkJfQorCSAgICAJCWxlbmd0aCsrOyAvLyBvbmUgbW9yZSBmb3IgY2xvc2luZyBicmFjZQorCSAgICAJfQorCSAgICAJaWYgKG5vZGVTdGFydCA+IChwcmV2aW91c0VuZCsxKSkgeworCSAgICAJCWxlbmd0aCsrOyAvLyBpbmNsdWRlIHNwYWNlIGJldHdlZW4gbm9kZXMKKwkgICAgCX0KKyAgICAJCWlmICgoZmlyc3RDb2x1bW4gKyBsZW5ndGgpID49IG1heENvbHVtbiAmJiBub2RlID09IGJsb2NrLm5vZGVzWzBdKSB7CisgICAgCQkJLy8gRG8gbm90IHNwbGl0IGluIHRoaXMgcGVjdWxpYXIgY2FzZSBhcyBsZW5ndGggd291bGQgYmUgYWxzbyBvdmVyIHRoZSBtYXgKKyAgICAJCQkvLyBsZW5ndGggb24gbmV4dCBsaW5lCisgICAgCQkJcmV0dXJuIDA7CisgICAgCQl9CisJCQlpZiAoKHRoaXMuY29sdW1uICsgbGVuZ3RoKSA+IG1heENvbHVtbikgeworCSAgICAJCXJldHVybiAxOworCSAgICAJfQorCSAgICB9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWllKSB7CisJICAgIAkvLyBBc3N1bWUgbGVuZ3RoIGlzIG9uZQorCSAgICAJaW50IHRva2VuTGVuZ3RoID0gMTsKKwkgICAgCWlmIChub2RlU3RhcnQgPiAocHJldmlvdXNFbmQrMSkpIHsKKwkgICAgCQl0b2tlbkxlbmd0aCsrOyAvLyBpbmNsdWRlIHNwYWNlIGJldHdlZW4gbm9kZXMKKwkgICAgCX0KKwkJCWlmICgodGhpcy5jb2x1bW4gKyB0b2tlbkxlbmd0aCkgPiBtYXhDb2x1bW4pIHsKKwkgICAgCQlyZXR1cm4gMTsKKwkgICAgCX0KKwkgICAgfQorCSAgICByZXR1cm4gMDsKKyAgICB9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jQmxvY2tSZWZlcmVuY2UoRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrLCBGb3JtYXRKYXZhZG9jUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlpbnQgbWF4Q29sdW1uID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9saW5lX2xlbmd0aCArIDE7CisJCWJvb2xlYW4gaGVhZGVyTGluZSA9IGJsb2NrLmlzSGVhZGVyTGluZSgpOworCQlib29sZWFuIGlubGluZWQgPSBibG9jay5pc0lubGluZWQoKTsKKwkJaWYgKGhlYWRlckxpbmUpIG1heENvbHVtbisrOworCisJCS8vIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB3aGF0IGlzIHRoZSBpbmRlbnRhdGlvbgorCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhibG9jay50YWdFbmQrMSwgcmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCXRoaXMuamF2YWRvY0Jsb2NrUmVmQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJYm9vbGVhbiBuZWVkRm9ybWF0ID0gZmFsc2U7CisJCWludCBwcmV2aW91c1Rva2VuID0gLTE7CisJCWludCBzcGFjZVBvc2l0aW9uID0gLTE7CisJCVN0cmluZyBuZXdMaW5lU3RyaW5nID0gbnVsbDsKKwkJaW50IGZpcnN0Q29sdW1uID0gLTE7CisJCXdoaWxlICghdGhpcy5zY2FubmVyLmF0RW5kKCkpIHsKKwkJCWludCB0b2tlbjsKKwkJCXRyeSB7CisJCQkJdG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJICAgIAkJaW50IHRva2VuTGVuZ3RoID0gKHRoaXMuc2Nhbm5lci5hdEVuZCgpID8gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDogdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgLSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRToKKwkJCQkJCWlmIChwcmV2aW91c1Rva2VuICE9IC0xIHx8IHRva2VuTGVuZ3RoID4gMSB8fCB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciAhPSAnICcpIG5lZWRGb3JtYXQgPSB0cnVlOworCQkJCQkJc3dpdGNoIChwcmV2aW91c1Rva2VuKSB7CisJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNVUxUSVBMWSA6CisJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU46CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CS8vIHNwYWNlIGJldHdlZW4gbWV0aG9kIGFyZ3VtZW50cworCQkJCQkJCQlzcGFjZVBvc2l0aW9uID0gdGhpcy5qYXZhZG9jQmxvY2tSZWZCdWZmZXIubGVuZ3RoKCk7CisJCQkJCQkJCS8vICRGQUxMLVRIUk9VR0gkIC0gZmFsbCB0aHJvdWdoIG5leHQgY2FzZQorCQkJCQkJCWNhc2UgLTE6CisJCQkJCQkJCXRoaXMuamF2YWRvY0Jsb2NrUmVmQnVmZmVyLmFwcGVuZCgnICcpOworCQkJCQkJCQl0aGlzLmNvbHVtbisrOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoIWlubGluZWQgJiYgc3BhY2VQb3NpdGlvbiA+IDAgJiYgKHRoaXMuY29sdW1uK3Rva2VuTGVuZ3RoKSA+IG1heENvbHVtbikgeworCQkJCQkJCS8vIG5vdCBlbm91Z2ggc3BhY2Ugb24gdGhlIGxpbmUKKwkJCQkJCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzKys7CisJCQkJCQkJdGhpcy5saW5lKys7CisJCQkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCQkJCQl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQkgICAgCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCSAgICAJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMudGVtcEJ1ZmZlcik7CisJCQkJCSAgICAJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQoQkxPQ0tfTElORV9QUkVGSVgpOworCQkJCQkgICAgCQl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJCQkJCWlmICh0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJICAgIAl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKHRoaXMuY29tbWVudEluZGVudGF0aW9uKTsKKwkJCQkJCQkgICAgCXRoaXMuY29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCQkJCQkJICAgIAl9CisJCQkJCQkgICAgCW5ld0xpbmVTdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIuc3Vic3RyaW5nKDAsIHRoaXMudGVtcEJ1ZmZlci5sZW5ndGgoKS0xKTsgLy8gcmVtb3ZlIGxhc3Qgc3BhY2UgYXMgYnVmZmVyIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIGEgc3BhY2UKKwkJCQkJCSAgICAJZmlyc3RDb2x1bW4gPSB0aGlzLmNvbHVtbjsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0aGlzLmNvbHVtbiA9IGZpcnN0Q29sdW1uOworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLmNvbHVtbiA9IGZpcnN0Q29sdW1uICsgdGhpcy5qYXZhZG9jQmxvY2tSZWZCdWZmZXIubGVuZ3RoKCkgLSBzcGFjZVBvc2l0aW9uIC0gMTsKKwkJCQkJCQl0aGlzLmphdmFkb2NCbG9ja1JlZkJ1ZmZlci5pbnNlcnQoc3BhY2VQb3NpdGlvbiwgbmV3TGluZVN0cmluZyk7CisJCQkJCQkJaWYgKGhlYWRlckxpbmUpIHsKKwkJCQkJCQkJaGVhZGVyTGluZSA9IGZhbHNlOworCQkJCQkJCQltYXhDb2x1bW4tLTsKKwkJCQkJCQl9CisJCQkJCQkJc3BhY2VQb3NpdGlvbiA9IC0xOworCQkJCQkJfQorCQkJCQkJdGhpcy5qYXZhZG9jQmxvY2tSZWZCdWZmZXIuYXBwZW5kKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0b2tlbkxlbmd0aCk7CisJCQkgICAgCQl0aGlzLmNvbHVtbiArPSB0b2tlbkxlbmd0aDsKKwkJCSAgICAJCWJyZWFrOworCQkJCX0KKwkJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47CisJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWllKSB7CisJCQkJLy8gZG9lcyBub3QgaGFwcGVuIGFzIHN5bnRheCBpcyBjb3JyZWN0CisJCQl9CisJCX0KKwkJaWYgKG5lZWRGb3JtYXQpIHsKKwkJICAgIGFkZFJlcGxhY2VFZGl0KGJsb2NrLnRhZ0VuZCsxLCByZWZlcmVuY2Uuc291cmNlRW5kLCB0aGlzLmphdmFkb2NCbG9ja1JlZkJ1ZmZlci50b1N0cmluZygpKTsKKwkJfQorICAgIH0KKworCXByaXZhdGUgaW50IGdldFRleHRMZW5ndGgoRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrLCBGb3JtYXRKYXZhZG9jVGV4dCB0ZXh0KSB7CisKKwkJLy8gU3BlY2lhbCBjYXNlIGZvciBpbW11dGFibGUgdGFncworCQlpZiAodGV4dC5pc0ltbXV0YWJsZSgpKSB7CisJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0ZXh0LnNvdXJjZVN0YXJ0ICwgdGV4dC5zb3VyY2VFbmQpOworCQkJaW50IHRleHRMZW5ndGggPSAwOworCQkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCXRyeSB7CisJICAgICAgICAgICAgICAgIGludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkgICAgCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVdISVRFU1BBQ0UpIHsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmluZGV4T2YoJ1xuJywgdGhpcy5zY2FubmVyLnNvdXJjZSwgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pID49IDApIHsKKwkJCQkJCQl0ZXh0TGVuZ3RoID0gMDsKKwkJCQkJCQl0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CisJCQkJCQkJCXRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJyAnKSB7CisJCQkJCQkJCQl0ZXh0TGVuZ3RoKys7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0ZXh0TGVuZ3RoKys7CisJCQkJCQkJfQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCSAgICAJCQl9CisJICAgIAkJCXRleHRMZW5ndGggKz0gKHRoaXMuc2Nhbm5lci5hdEVuZCgpID8gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDogdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgLSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworICAgCQkJCQkvLyBtYXliZSBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nIG9yIGNvbW1lbnQKKwkgICAgCQkJdGV4dExlbmd0aCArPSAodGhpcy5zY2FubmVyLmF0RW5kKCkgPyB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gOiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKwkJCX0KKwkJCXJldHVybiB0ZXh0TGVuZ3RoOworCQl9CisKKwkJLy8gU2ltcGxlIGZvciBvbmUgbGluZSB0YWdzCisJICAgIGlmIChibG9jay5pc09uZUxpbmVUYWcoKSkgeworCSAgICAJcmV0dXJuIHRleHQuc291cmNlRW5kIC0gdGV4dC5zb3VyY2VTdGFydCArIDE7CisJICAgIH0KKworCSAgICAvLyBGaW5kIGxhc3QgbGluZQorICAgIAlpbnQgc3RhcnRMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRleHQuc291cmNlU3RhcnQsIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubWF4TGluZXMpOworICAgIAlpbnQgZW5kTGluZSA9IHN0YXJ0TGluZTsKKyAgICAJaW50IHByZXZpb3VzRW5kID0gLTE7CisgICAgCWZvciAoaW50IGk9MDsgaTw9dGV4dC5zZXBhcmF0b3JzUHRyOyBpKyspIHsKKyAgICAJCWludCBlbmQgPSAoaW50KSAodGV4dC5zZXBhcmF0b3JzW2ldID4+PiAzMik7CisgICAgCQllbmRMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKGVuZCwgdGhpcy5saW5lRW5kcywgZW5kTGluZS0xLCB0aGlzLm1heExpbmVzKTsKKyAgICAJCWlmIChlbmRMaW5lID4gc3RhcnRMaW5lKSB7CisgICAgCQkJcmV0dXJuIHByZXZpb3VzRW5kIC0gdGV4dC5zb3VyY2VTdGFydCArIDE7CisgICAgCQl9CisgICAgCQlwcmV2aW91c0VuZCA9IGVuZDsKKyAgICAJfQorCisgICAgCS8vIFRoaXMgd2FzIGEgb25lIGxpbmUgdGV4dAorCQlyZXR1cm4gdGV4dC5zb3VyY2VFbmQgLSB0ZXh0LnNvdXJjZVN0YXJ0ICsgMTsKKyAgICB9CisKKwkvKgorCSAqIFByaW50IGFuZCBmb3JtYXRzIGEgamF2YWRvYyBjb21tZW50cworCSAqLworCXZvaWQgcHJpbnRKYXZhZG9jQ29tbWVudChpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaW50IGxhc3RJbmRlbnRhdGlvbkxldmVsID0gdGhpcy5pbmRlbnRhdGlvbkxldmVsOworCQl0cnkgeworCQkJLy8gcGFyc2UgdGhlIGNvbW1lbnQgb24gdGhlIGZseQorCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZC0xKTsKKwkJCWlmICghIHRoaXMuZm9ybWF0dGVyQ29tbWVudFBhcnNlci5wYXJzZShzdGFydCwgZW5kLTEpKSB7CisJCQkJLy8gcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBqYXZhZG9jLCBlYXJseSBhYm9ydCBmb3JtYXR0aW5nCisJCQkJcmV0dXJuOworCQkJfQorCisJCQlGb3JtYXRKYXZhZG9jIGphdmFkb2MgPSAoRm9ybWF0SmF2YWRvYykgdGhpcy5mb3JtYXR0ZXJDb21tZW50UGFyc2VyLmRvY0NvbW1lbnQ7CisKKwkJCS8vIGhhbmRsZSBpbmRlbnRhdGlvbgorCQkJaWYgKHRoaXMuaW5kZW50YXRpb25MZXZlbCAhPSAwKSB7CisJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KCk7CisJCQl9CisKKwkJCS8vIGhhbmRsZSBwZW5kaW5nIHNwYWNlIGlmIGFueQorCQkJaWYgKHRoaXMucGVuZGluZ1NwYWNlKSB7CisJCQkJYWRkSW5zZXJ0RWRpdChzdGFydCwgIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQlpZiAoamF2YWRvYy5ibG9ja3MgPT0gbnVsbCkgeworCQkJCS8vIG5vIEZvcm1hdEphdmFkb2NUYWdzIGluIHRoaXMgdGhpcyBqYXZhZG9jCisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBpbml0IHByb3Blcmx5CisJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCWludCBsZW5ndGggPSBqYXZhZG9jLmJsb2Nrcy5sZW5ndGg7CisKKwkJCS8vIGZvcm1hdCBlbXB0eSBsaW5lcyBiZXR3ZWVuIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2sKKwkJCUZvcm1hdEphdmFkb2NCbG9jayBwcmV2aW91c0Jsb2NrID0gamF2YWRvYy5ibG9ja3NbMF07CisJCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMDsKKwkJCWludCBjdXJyZW50TGluZSA9IHRoaXMubGluZTsKKwkJCWludCBmaXJzdEJsb2NrU3RhcnQgPSBwcmV2aW91c0Jsb2NrLnNvdXJjZVN0YXJ0OworCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KG51bGwpOworCQkJdGhpcy5jb2x1bW4gKz0gSkFWQURPQ19IRUFERVJfTEVOR1RIOyAvLyBjb25zaWRlciB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBzY2FubmVkCisKKwkJCS8vIElmIHRoZXJlIGFyZSBzZXZlcmFsIGJsb2NrcyBpbiB0aGUgamF2YWRvYworCQkJaW50IGluZGV4ID0gMTsKKwkJCWlmIChsZW5ndGggPiAxKSB7CisJCQkJLy8gZm9ybWF0IHRoZSBkZXNjcmlwdGlvbiBpZiBhbnkKKwkJCQlpZiAocHJldmlvdXNCbG9jay5pc0Rlc2NyaXB0aW9uKCkpIHsKKwkJCQkJcHJpbnRKYXZhZG9jQmxvY2socHJldmlvdXNCbG9jayk7CisJCQkJCUZvcm1hdEphdmFkb2NCbG9jayBibG9jayA9IGphdmFkb2MuYmxvY2tzW2luZGV4KytdOworCQkJCQlpbnQgbmV3TGluZXMgPSB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2luc2VydF9lbXB0eV9saW5lX2JlZm9yZV9yb290X3RhZ3MgPyAyIDogMTsKKwkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNCbG9jay5zb3VyY2VFbmQrMSwgYmxvY2suc291cmNlU3RhcnQtMSwgbmV3TGluZXMsIHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50LCBmYWxzZSwgbnVsbCk7CisJCQkJCXByZXZpb3VzQmxvY2sgPSBibG9jazsKKwkJCQl9CisKKwkJCQkvLyBmb3JtYXQgYWxsIHRhZ3MgYnV0IHRoZSBsYXN0IG9uZSBjb21wb3NpbmcgdGhpcyBjb21tZW50CisJCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CisJCQkJCXByaW50SmF2YWRvY0Jsb2NrKHByZXZpb3VzQmxvY2spOworCQkJCQlGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2sgPSBqYXZhZG9jLmJsb2Nrc1tpbmRleCsrXTsKKwkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNCbG9jay5zb3VyY2VFbmQrMSwgYmxvY2suc291cmNlU3RhcnQtMSwgMSwgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQsIGZhbHNlLCBudWxsKTsKKwkJCQkJcHJldmlvdXNCbG9jayA9IGJsb2NrOworCQkJCX0KKwkJCX0KKworCQkJLy8gZm9ybWF0IHRoZSBsYXN0IGJsb2NrCisJCQlwcmludEphdmFkb2NCbG9jayhwcmV2aW91c0Jsb2NrKTsKKworCQkJLy8gZm9ybWF0IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBlbXB0eSBzcGFjZXMKKwkJCWludCBuZXdMaW5lcyA9ICh0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X25ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXMgJiYgKHRoaXMubGluZSA+IGN1cnJlbnRMaW5lIHx8IGphdmFkb2MuaXNNdWx0aUxpbmUoKSkpID8gMSA6IDA7CisJCQlwcmludEphdmFkb2NHYXBMaW5lcyhqYXZhZG9jLnRleHRTdGFydCwgZmlyc3RCbG9ja1N0YXJ0LTEsIG5ld0xpbmVzLCB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2NsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudCwgZmFsc2UsIG51bGwpOworCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNCbG9jay5zb3VyY2VFbmQrMSwgamF2YWRvYy50ZXh0RW5kLCBuZXdMaW5lcywgdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQsIHRydWUsIG51bGwpOworCQl9CisJCWZpbmFsbHkgeworCQkJLy8gcmVzZXQgdGhlIHNjYW5uZXIKKwkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGVuZCwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKwkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisJCQl0aGlzLmluZGVudGF0aW9uTGV2ZWwgPSBsYXN0SW5kZW50YXRpb25MZXZlbDsKKwkJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBwcmludHMgdGhlIGVtcHR5IGphdmFkb2MgbGluZSBiZXR3ZWVuIHRoZSAyIGdpdmVuIHBvc2l0aW9ucy4KKwkgKiBNYXkgaW5zZXJ0IG5ldyAnKicgYmVmb3JlIGVhY2ggbmV3IGxpbmUKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jR2FwTGluZXMoaW50IHRleHRTdGFydFBvc2l0aW9uLCBpbnQgdGV4dEVuZFBvc2l0aW9uLCBpbnQgbmV3TGluZXMsIGJvb2xlYW4gY2xlYXJCbGFua0xpbmVzLCBib29sZWFuIGZvb3RlciwgU3RyaW5nQnVmZmVyIG91dHB1dCkgeworCQl0cnkgeworCQkJLy8gSWYgbm8gbGluZXMgdG8gc2V0IGluIHRoZSBnYXAgdGhlbiBqdXN0IGluc2VydCBhIHNwYWNlIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gdG8KKwkJCWlmIChuZXdMaW5lcyA9PSAwKSB7CisJCQkJaWYgKG91dHB1dCA9PSBudWxsKSB7CisJCQkJCWFkZFJlcGxhY2VFZGl0KHRleHRTdGFydFBvc2l0aW9uLCB0ZXh0RW5kUG9zaXRpb24sICAiICIpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0cHV0LmFwcGVuZCgnICcpOworCQkJCX0KKwkJCQl0aGlzLmNvbHVtbisrOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gaWYgdGhlcmUncyBubyBlbm91Z2ggcm9vbSB0byByZXBsYWNlIHRleHQsIHRoZW4gaW5zZXJ0IHRoZSBnYXAKKwkJCWlmICh0ZXh0U3RhcnRQb3NpdGlvbiA+IHRleHRFbmRQb3NpdGlvbikgeworCQkJCWlmIChuZXdMaW5lcyA+IDApIHsKKwkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCQlmb3IgKGludCBpPTA7IGk8bmV3TGluZXM7IGkrKykgeworCQkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQl0aGlzLmNvbHVtbiA9IDE7CisJCQkJCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIpOworCQkJCQkJaWYgKGZvb3RlcikgeworCQkJCQkJCXRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLmFwcGVuZCgnICcpOworCQkJCQkJCXRoaXMuY29sdW1uKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJCQkJdGhpcy5jb2x1bW4gKz0gQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChvdXRwdXQgPT0gbnVsbCkgeworCQkJCQkJYWRkSW5zZXJ0RWRpdCh0ZXh0U3RhcnRQb3NpdGlvbiwgdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIudG9TdHJpbmcoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvdXRwdXQuYXBwZW5kKHRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIFRoZXJlJ3MgZW5vdWdoIHJvb20gYW5kIHNvbWUgbGluZXMgdG8gc2V0Li4uCisJCQkvLyBTa2lwIHRoZSB0ZXh0IHRva2VuIHBlciB0b2tlbiB0byBrZWVwIGV4aXN0aW5nIHN0YXJzIHdoZW4gcG9zc2libGUKKwkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRleHRTdGFydFBvc2l0aW9uLCB0ZXh0RW5kUG9zaXRpb24pOworCQkJdGhpcy5zY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSB0cnVlOworCQkJdGhpcy5zY2FubmVyLmxpbmVQdHIgPSBVdGlsLmdldExpbmVOdW1iZXIodGV4dFN0YXJ0UG9zaXRpb24sIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubWF4TGluZXMpIC0gMjsKKwkJCWludCBsaW5lUHRyID0gdGhpcy5zY2FubmVyLmxpbmVQdHI7CisJCQlpbnQgbGluZUNvdW50ID0gMDsKKwkJCWludCBzdGFydCA9IHRleHRTdGFydFBvc2l0aW9uOworCQkJYm9vbGVhbiBlbmRzT25NdWx0aXBseSA9IGZhbHNlOworCQkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCXN3aXRjaCAodGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFk6CisJCQkJCQkvLyB3ZSBqdXN0IG5lZWQgdG8gcmVwbGFjZSBlYWNoIGxpbmVzIGJldHdlZW4gJyonIHdpdGggdGhlIGphdmFkb2MgZm9ybWF0dGVkIG9uZXMKKwkJCQkJCWludCBsaW5lc0dhcCA9IHRoaXMuc2Nhbm5lci5saW5lUHRyIC0gbGluZVB0cjsKKwkJCQkJCWlmIChsaW5lc0dhcCA+IDApIHsKKwkJCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCQkJaWYgKGxpbmVDb3VudCA+IDApIHsKKwkJCQkJCQkJLy8gVE9ETyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk2MTkKKwkJCQkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuYXBwZW5kKCAnICcpOworCQkJCQkJCX0KKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzR2FwIDsgaSsrKSB7CisJCQkJCQkJCWlmIChjbGVhckJsYW5rTGluZXMgJiYgbGluZUNvdW50ID49IG5ld0xpbmVzKSB7CisJCQkJCQkJCQkvLyBsZWF2ZSBhcyB0aGUgcmVxdWlyZWQgbmV3IGxpbmVzIGhhdmUgYmVlbiBpbnNlcnRlZAorCQkJCQkJCQkJLy8gc28gcmVtb3ZlIGFueSByZW1haW5pbmcgYmxhbmtzIGFuZCBsZWF2ZQorCQkJCQkJCQkJaWYgKHRleHRFbmRQb3NpdGlvbiA+PSBzdGFydCkgeworCQkJCQkJCQkJCWlmIChvdXRwdXQgPT0gbnVsbCkgeworCQkJCQkJCQkJCQlhZGRSZXBsYWNlRWRpdChzdGFydCwgdGV4dEVuZFBvc2l0aW9uLCB0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQlvdXRwdXQuYXBwZW5kKHRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCX0KKwkJCQkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuYXBwZW5kKHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyKTsKKwkJCQkJCQkJaWYgKGkgPT0gKGxpbmVzR2FwLTEpKSB7CisJCQkJCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCQkJCXRoaXMuY29sdW1uKys7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5hcHBlbmQoQkxPQ0tfTElORV9QUkVGSVgpOworCQkJCQkJCQkJdGhpcy5jb2x1bW4gKz0gQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQkJCQkJCQl9CisJCQkJCQkJCWxpbmVDb3VudCsrOworCQkJCQkJCX0KKwkJCQkJCQlpbnQgY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisJCQkJCQkJaW50IHRva2VuTGVuZ3RoID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb247CisJCQkJCQkJaWYgKG91dHB1dCA9PSBudWxsKSB7CisJCQkJCQkJCWFkZFJlcGxhY2VFZGl0KHN0YXJ0LCBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLTEsIHRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLnRvU3RyaW5nKCkpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCW91dHB1dC5hcHBlbmQodGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIpOworCQkJCQkJCQlvdXRwdXQuYXBwZW5kKHRoaXMuc2Nhbm5lci5zb3VyY2UsIGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRva2VuTGVuZ3RoKTsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5jb2x1bW4gKz0gdG9rZW5MZW5ndGg7CisJCQkJCQkJaWYgKGZvb3RlciAmJiBjbGVhckJsYW5rTGluZXMgJiYgbGluZUNvdW50ID09IG5ld0xpbmVzKSB7CisJCQkJCQkJCWlmICh0ZXh0RW5kUG9zaXRpb24gPj0gY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbikgeworCQkJCQkJCQkJaWYgKG91dHB1dCA9PSBudWxsKSB7CisJCQkJCQkJCQkJYWRkRGVsZXRlRWRpdChjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0ZXh0RW5kUG9zaXRpb24pOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBuZXh0IHN0YXJ0IGlzIGp1c3QgYWZ0ZXIgdGhlIGN1cnJlbnQgdG9rZW4KKwkJCQkJCXN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCWxpbmVQdHIgPSB0aGlzLnNjYW5uZXIubGluZVB0cjsKKwkJCQkJCWVuZHNPbk11bHRpcGx5ID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJZW5kc09uTXVsdGlwbHkgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLy8gRm9ybWF0IHRoZSBsYXN0IHdoaXRlc3BhY2VzCisJCQlpZiAobGluZUNvdW50IDwgbmV3TGluZXMpIHsKKwkJCQkvLyBJbnNlcnQgbmV3IGxpbmVzIGFzIG5vdCBlbm91Z2ggd2FzIGVuY291bnRlcmVkIHdoaWxlIHNjYW5uaW5nIHRoZSB3aGl0ZXNwYWNlcworCQkJCXRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQlpZiAobGluZUNvdW50ID4gMCkgeworCQkJCQkvLyBUT0RPIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTYxOQorCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5hcHBlbmQoICcgJyk7CisJCQkJfQorCQkJCWZvciAoaW50IGkgPSBsaW5lQ291bnQ7IGkgPCBuZXdMaW5lcy0xOyBpKyspIHsKKwkJCQkJcHJpbnRKYXZhZG9jTmV3TGluZSh0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlcik7CisJCQkJfQorCQkJCXRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIpOworCQkJCWlmIChmb290ZXIpIHsKKwkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJCXRoaXMuY29sdW1uKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIuYXBwZW5kKEJMT0NLX0xJTkVfUFJFRklYKTsKKwkJCQkJdGhpcy5jb2x1bW4gKz0gQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQkJCX0KKwkJCQlpZiAob3V0cHV0ID09IG51bGwpIHsKKwkJCQkJaWYgKHRleHRFbmRQb3NpdGlvbiA+PSBzdGFydCkgeworCQkJCQkJYWRkUmVwbGFjZUVkaXQoc3RhcnQsIHRleHRFbmRQb3NpdGlvbiwgdGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIudG9TdHJpbmcoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhZGRJbnNlcnRFZGl0KHRleHRFbmRQb3NpdGlvbisxLCB0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW91dHB1dC5hcHBlbmQodGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gUmVwbGFjZSBhbGwgcmVtYWluaW5nIHdoaXRlc3BhY2VzIGJ5IGEgc2luZ2xlIHNwYWNlCisJCQkJaWYgKHRleHRFbmRQb3NpdGlvbiA+PSBzdGFydCkgeworCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCWlmICh0aGlzLnNjYW5uZXIubGluZVB0ciA+IGxpbmVQdHIpIHsKKwkJCQkJCWlmIChsaW5lQ291bnQgPiAwKSB7CisJCQkJCQkJLy8gVE9ETyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk2MTkKKwkJCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCQkJdGhpcy5jb2x1bW4gPSAxOworCQkJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMuamF2YWRvY0dhcExpbmVzQnVmZmVyKTsKKwkJCQkJfQorCQkJCQl0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQkJaWYgKG91dHB1dCA9PSBudWxsKSB7CisJCQkJCQlhZGRSZXBsYWNlRWRpdChzdGFydCwgdGV4dEVuZFBvc2l0aW9uLCB0aGlzLmphdmFkb2NHYXBMaW5lc0J1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dHB1dC5hcHBlbmQodGhpcy5qYXZhZG9jR2FwTGluZXNCdWZmZXIpOworCQkJCQl9CisJCQkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisJCQkJfSBlbHNlIGlmIChlbmRzT25NdWx0aXBseSkgeworCQkJCQlpZiAob3V0cHV0ID09IG51bGwpIHsKKwkJCQkJCWFkZEluc2VydEVkaXQodGV4dEVuZFBvc2l0aW9uKzEsICIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dHB1dC5hcHBlbmQoJyAnKTsKKwkJCQkJfQorCQkJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJCX0KKwkJCQl0aGlzLmNvbHVtbisrOworCQkJfQorCQl9CisJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWllKSB7CisJCQkvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaWYgdGhpcyBleGNlcHRpb24gaGFwcGVucworCQl9CisJCWZpbmFsbHkgeworCQkJdGhpcy5zY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKKwkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0ZXh0RW5kUG9zaXRpb24rMSwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKKwkJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMgKz0gbmV3TGluZXM7CisJCQl0aGlzLmxpbmUgKz0gbmV3TGluZXM7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jSW1tdXRhYmxlVGV4dChGb3JtYXRKYXZhZG9jVGV4dCB0ZXh0LCBGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2ssIGJvb2xlYW4gdGV4dE9uTmV3TGluZSkgeworCisJCXRyeSB7CisJCQkvLyBJdGVyYXRlIG9uIHRleHQgbGluZSBzZXBhcmF0b3JzCisJCQlpbnQgdGV4dExpbmVTdGFydCA9IHRleHQubGluZVN0YXJ0OworCQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IGZhbHNlOworCQkJU3RyaW5nIG5ld0xpbmVTdHJpbmcgPSBudWxsOworCQkJZm9yIChpbnQgaWR4PTAsIG1heD10ZXh0LnNlcGFyYXRvcnNQdHI7IGlkeDw9bWF4IDsgaWR4KyspIHsKKwkJCQlpbnQgc3RhcnQgPSAoaW50KSB0ZXh0LnNlcGFyYXRvcnNbaWR4XTsKKwkJCQlpbnQgbGluZVN0YXJ0ID0gVXRpbC5nZXRMaW5lTnVtYmVyKHN0YXJ0LCB0aGlzLmxpbmVFbmRzLCB0ZXh0TGluZVN0YXJ0LTEsIHRoaXMubWF4TGluZXMpOworCQkJCXdoaWxlICh0ZXh0TGluZVN0YXJ0IDwgbGluZVN0YXJ0KSB7CisJCQkJCWludCBlbmQgPSB0aGlzLmxpbmVFbmRzW3RleHRMaW5lU3RhcnQtMV07CisJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGVuZCwgc3RhcnQpOworCQkJCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTVVMVElQTFk6CisJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZU1VTFRJUExZX0VRVUFMOgorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgeworCQkJCQkJdGhpcy5zY2FubmVyLmdldE5leHRDaGFyKCk7CisJCQkJCX0KKwkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJCQl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJCQluZXdMaW5lU3RyaW5nID0gdGhpcy50ZW1wQnVmZmVyLnRvU3RyaW5nKCk7CisJCQkJCX0KKwkJCQkJYWRkUmVwbGFjZUVkaXQoZW5kKzEsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpLCBuZXdMaW5lU3RyaW5nKTsKKwkJCQkJdGV4dExpbmVTdGFydCA9IFV0aWwuZ2V0TGluZU51bWJlcih0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLTEsIHRoaXMubGluZUVuZHMsIHRleHRMaW5lU3RhcnQsIHRoaXMubWF4TGluZXMpOworCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGlpZSkgeworCQkJLy8gbGVhdmUKKwkJfQorCQlmaW5hbGx5IHsKKwkJCS8vIFJlc2V0CisJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJdGhpcy5zY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRydWU7CisJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0ZXh0LnNvdXJjZUVuZCsxLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCQl9CisJfQorCisJLyoKKwkgKiAgUHJpbnQgdGhlIGdhcCBsaW5lcyBmb3IgYW4gaW1tdXRhYmxlIGJsb2NrLgorCSAqICBUaGF0J3MgbmVlZGVkIHRvICBiZSBzcGVjaWZpYyBhcyB0aGUgZm9ybWF0dGVyIG5lZWRzIHRvIGtlZXAgd2hpdGUgc3BhY2VzCisJICogIGlmIHBvc3NpYmxlIGV4Y2VwdCB0aG9zZSB3aGljaCBhcmUgaW5kZW50YXRpb24gb25lcy4KKwkgKiAgTm90ZSB0aGF0IGluIHRoZSBwZWN1bGlhciBjYXNlIG9mIGEgdHdvIGxpbmVzIGltbXV0YWJsZSB0YWcgKG11bHRpIGxpbmVzIGJsb2NrKSwKKwkgKiAgdGhlIGZvcm1hdHRlciB3aWxsIGpvaW4gdGhlIHR3byBsaW5lcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jR2FwTGluZXNGb3JJbW11dGFibGVCbG9jayhGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2spIHsKKworCQkvLyBJbml0CisJCWludCBmaXJzdExpbmVFbmQgPSAtMTsgLy8gbm90IGluaXRpYWxpemVkCisJCWludCBuZXdMaW5lU3RhcnQgPSAtMTsgLy8gbm90IGluaXRpYWxpemVkCisJCWludCBzZWNvbmRMaW5lU3RhcnQgPSAtMTsgLy8gbm90IGluaXRpYWxpemVkCisJCWludCBzdGFyUG9zaXRpb24gPSAtMTsgLy8gbm90IGluaXRpYWxpemVkCisJCWludCBvZmZzZXQgPSAwOworCQlpbnQgc3RhcnQgPSBibG9jay50YWdFbmQgKyAxOworCQlpbnQgZW5kID0gYmxvY2subm9kZXNbMF0uc291cmNlU3RhcnQtMTsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCWludCBsaW5lU3RhcnQgPSBibG9jay5saW5lU3RhcnQ7CisJCWludCBsaW5lRW5kID0gVXRpbC5nZXRMaW5lTnVtYmVyKGJsb2NrLm5vZGVzWzBdLnNvdXJjZUVuZCwgdGhpcy5saW5lRW5kcywgbGluZVN0YXJ0LTEsIHRoaXMubWF4TGluZXMpOworCQlib29sZWFuIG11bHRpTGluZXNCbG9jayA9IGxpbmVFbmQgPiAobGluZVN0YXJ0KzEpOworCQlpbnQgcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCVN0cmluZyBuZXdMaW5lU3RyaW5nID0gbnVsbDsKKwkJaW50IGluZGVudGF0aW9uQ29sdW1uID0gMDsKKwkJaW50IGxlYWRpbmdTcGFjZXMgPSAtMTsKKworCQkvLyBTY2FuIHRoZSBleGlzdGluZyBnYXAKKwkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJY2hhciBjaCA9IChjaGFyKSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCXN3aXRjaCAoY2gpIHsKKwkJCQljYXNlICdcdCcgOgorCQkJCQkvLyBpbmNyZWFzZSB0aGUgY29ycmVzcG9uZGluZyBjb3VudGVyIGZyb20gdGhlIGFwcHJvcHJpYXRlIHRhYiB2YWx1ZQorCQkJCQlpZiAoc2Vjb25kTGluZVN0YXJ0ID4gMCB8fCBmaXJzdExpbmVFbmQgPCAwKSB7CisJCQkJCQlpbnQgcmVtaW5kZXIgPSB0aGlzLnRhYkxlbmd0aCA9PSAwID8gMCA6IG9mZnNldCAlIHRoaXMudGFiTGVuZ3RoOworCQkJCQkJaWYgKHJlbWluZGVyID09IDApIHsKKwkJCQkJCQlvZmZzZXQgKz0gdGhpcy50YWJMZW5ndGg7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW9mZnNldCA9ICgob2Zmc2V0IC8gdGhpcy50YWJMZW5ndGgpICsgMSkgKiB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChsZWFkaW5nU3BhY2VzID49IDApIHsKKwkJCQkJCWludCByZW1pbmRlciA9IHRoaXMudGFiTGVuZ3RoID09IDAgPyAwIDogb2Zmc2V0ICUgdGhpcy50YWJMZW5ndGg7CisJCQkJCQlpZiAocmVtaW5kZXIgPT0gMCkgeworCQkJCQkJCWxlYWRpbmdTcGFjZXMgKz0gdGhpcy50YWJMZW5ndGg7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxlYWRpbmdTcGFjZXMgPSAoKG9mZnNldCAvIHRoaXMudGFiTGVuZ3RoKSArIDEpICogdGhpcy50YWJMZW5ndGg7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHInIDoKKwkJCQljYXNlICdcbicgOgorCQkJCQkvLyBuZXcgbGluZSwgc3RvcmUgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgb25lCisJCQkJCWlmIChmaXJzdExpbmVFbmQgPCAwKSB7CisJCQkJCQlmaXJzdExpbmVFbmQgPSBwcmV2aW91c1Bvc2l0aW9uOworCQkJCQl9CisJCQkJCS8vIHByaW50IGluZGVudGF0aW9uIGlmIHRoZXJlIHdlcmUgc3BhY2VzIHdpdGhvdXQgYW55IHN0YXIgb24gdGhlIGxpbmUKKwkJCQkJaWYgKGxlYWRpbmdTcGFjZXMgPiAwICYmIG11bHRpTGluZXNCbG9jaykgeworCQkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQoQkxPQ0tfTElORV9QUkVGSVgpOworCQkJCQkJCXRoaXMuY29sdW1uICs9IEJMT0NLX0xJTkVfUFJFRklYX0xFTkdUSDsKKwkJCQkJCQluZXdMaW5lU3RyaW5nID0gdGhpcy50ZW1wQnVmZmVyLnRvU3RyaW5nKCk7CisJCQkJCQkJaW5kZW50YXRpb25Db2x1bW4gPSB0aGlzLmNvbHVtbjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5jb2x1bW4gPSBpbmRlbnRhdGlvbkNvbHVtbjsKKwkJCQkJCX0KKwkJCQkJCWFkZFJlcGxhY2VFZGl0KG5ld0xpbmVTdGFydCwgbmV3TGluZVN0YXJ0K2luZGVudGF0aW9uQ29sdW1uLTIsIG5ld0xpbmVTdHJpbmcpOworCQkJCQl9CisJCQkJCS8vIHN0b3JlIGxpbmUgc3RhcnQgYW5kIHJlc2V0IHBvc2l0aW9ucworCQkJCQluZXdMaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQlsZWFkaW5nU3BhY2VzID0gMDsKKwkJCQkJc3RhclBvc2l0aW9uID0gLTE7CisJCQkJCWlmIChtdWx0aUxpbmVzQmxvY2spIHsKKwkJCQkJCW9mZnNldCA9IDA7CisJCQkJCQlzZWNvbmRMaW5lU3RhcnQgPSAtMTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICcqJyA6CisJCQkJCS8vIHN0b3JlIGxpbmUgc3RhcnQgcG9zaXRpb24gaWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3RhciBvZiB0aGUgbGluZQorCQkJCQlpZiAoc3RhclBvc2l0aW9uIDwgMCAmJiBmaXJzdExpbmVFbmQgPiAwKSB7CisJCQkJCQlzZWNvbmRMaW5lU3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJc3RhclBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCWxlYWRpbmdTcGFjZXMgPSAtMTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJLy8gaW5jcmVtZW50IG9mZnNldCBpZiBsaW5lIGhhcyBzdGFydGVkCisJCQkJCWlmIChzZWNvbmRMaW5lU3RhcnQgPiAwKSB7CisJCQkJCQkvLyBza2lwIGZpcnN0IHdoaXRlIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCAnKicKKwkJCQkJCWlmIChzZWNvbmRMaW5lU3RhcnQgPT0gc3RhclBvc2l0aW9uKSB7CisJCQkJCQkJc2Vjb25kTGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gcHJpbnQgaW5kZW50YXRpb24gYmVmb3JlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycworCQkJCQkJCWlmIChvZmZzZXQgPT0gMCAmJiBtdWx0aUxpbmVzQmxvY2spIHsKKwkJCQkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCQkJCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJCQkJCQl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJCQkJCQlpbmRlbnRhdGlvbkNvbHVtbiA9IHRoaXMuY29sdW1uOworCQkJCQkJCQkJbmV3TGluZVN0cmluZyA9IHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhpcy5jb2x1bW4gPSBpbmRlbnRhdGlvbkNvbHVtbjsKKwkJCQkJCQkJfQorCQkJCQkJCQlhZGRSZXBsYWNlRWRpdChuZXdMaW5lU3RhcnQsIHNlY29uZExpbmVTdGFydC0xLCBuZXdMaW5lU3RyaW5nKTsKKwkJCQkJCQl9CisJCQkJCQkJb2Zmc2V0Kys7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoZmlyc3RMaW5lRW5kIDwgMCkgeworCQkJCQkJLy8gbm8gbmV3IGxpbmUgeWV0LCBpbmNyZW1lbnQgdGhlIG9mZnNldAorCQkJCQkJb2Zmc2V0Kys7CisJCQkJCX0gZWxzZSBpZiAobGVhZGluZ1NwYWNlcyA+PSAwKSB7CisJCQkJCQkvLyBubyBzdGFyIHlldCwgaW5jcmVtZW50IHRoZSBsZWFkaW5nIHNwYWNlcworCQkJCQkJbGVhZGluZ1NwYWNlcysrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJldmlvdXNQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCX0KKwkJCisJCS8vIEluY3JlbWVudCB0aGUgY29sdW1ucyBmcm9tIHRoZSBudW1iZXJzIG9mIGNoYXJhY3RlcnMgY291bnRlZCBvbiB0aGUgbGluZQorCQlpZiAobXVsdGlMaW5lc0Jsb2NrKSB7CisJCQl0aGlzLmNvbHVtbiArPSBvZmZzZXQ7CisJCX0gZWxzZSB7CisJCQl0aGlzLmNvbHVtbisrOworCQl9CisJCQorCQkvLyBSZXBsYWNlIHRoZSBuZXcgbGluZSB3aXRoIGEgc2luZ2xlIHNwYWNlIHdoZW4gdGhlcmUncyBvbmx5IG9uZSBzZXBhcmF0b3IKKwkJLy8gb3IsIGlmIG5lY2Vzc2FyeSwgcHJpbnQgdGhlIGluZGVudGF0aW9uIG9uIHRoZSBsYXN0IGxpbmUKKwkJaWYgKCFtdWx0aUxpbmVzQmxvY2spIHsKKwkJCWlmIChmaXJzdExpbmVFbmQgPiAwKSB7CisJCQkJYWRkUmVwbGFjZUVkaXQoZmlyc3RMaW5lRW5kLCBlbmQsICIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzZWNvbmRMaW5lU3RhcnQgPiAwKSB7CisJCQlpZiAobmV3TGluZVN0cmluZyA9PSBudWxsKSB7CisJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQl0aGlzLmNvbHVtbiA9IDE7CisJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMudGVtcEJ1ZmZlcik7CisJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJdGhpcy5jb2x1bW4gKz0gQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQkJCW5ld0xpbmVTdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCQlpbmRlbnRhdGlvbkNvbHVtbiA9IHRoaXMuY29sdW1uOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmNvbHVtbiA9IGluZGVudGF0aW9uQ29sdW1uOworCQkJfQorCQkJYWRkUmVwbGFjZUVkaXQobmV3TGluZVN0YXJ0LCBzZWNvbmRMaW5lU3RhcnQtMSwgbmV3TGluZVN0cmluZyk7CisJCX0KKwkJZWxzZSBpZiAobGVhZGluZ1NwYWNlcyA+IDApIHsKKwkJCWlmIChuZXdMaW5lU3RyaW5nID09IG51bGwpIHsKKwkJCQl0aGlzLnRlbXBCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCXRoaXMuY29sdW1uID0gMTsKKwkJCQlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy50ZW1wQnVmZmVyKTsKKwkJCQl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKEJMT0NLX0xJTkVfUFJFRklYKTsKKwkJCQl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJbmV3TGluZVN0cmluZyA9IHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpOworCQkJCWluZGVudGF0aW9uQ29sdW1uID0gdGhpcy5jb2x1bW47CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY29sdW1uID0gaW5kZW50YXRpb25Db2x1bW47CisJCQl9CisJCQlhZGRSZXBsYWNlRWRpdChuZXdMaW5lU3RhcnQsIG5ld0xpbmVTdGFydCtpbmRlbnRhdGlvbkNvbHVtbi0yLCBuZXdMaW5lU3RyaW5nKTsKKwkJfQorCisJCS8vIFJlc2V0CisJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGVuZCsxLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCX0KKworCXByaXZhdGUgaW50IHByaW50SmF2YWRvY0h0bWxUYWcoRm9ybWF0SmF2YWRvY1RleHQgdGV4dCwgRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrLCBib29sZWFuIHRleHRPbk5ld0xpbmUpIHsKKworCQkvLyBDb21wdXRlIGluZGVudGF0aW9uIGlmIG5lY2Vzc2FyeQorCQlib29sZWFuIGNsZWFyQmxhbmtMaW5lcyA9IHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50OworCisJCS8vIExvY2FsIHZhcmlhYmxlcyBpbml0CisJCWludCB0ZXh0U3RhcnQgPSB0ZXh0LnNvdXJjZVN0YXJ0OworCQlpbnQgbmV4dFN0YXJ0ID0gdGV4dFN0YXJ0OworCQlpbnQgc3RhcnRMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRleHRTdGFydCwgdGhpcy5saW5lRW5kcywgMCwgdGhpcy5tYXhMaW5lcyk7CisJICAgIGludCBodG1sVGFnSUQgPSB0ZXh0LmdldEh0bWxUYWdJRCgpOworCSAgICBpZiAodGV4dC5kZXB0aCA+PSB0aGlzLmphdmFkb2NIdG1sVGFnQnVmZmVycy5sZW5ndGgpIHsKKwkgICAgCWludCBsZW5ndGggPSB0aGlzLmphdmFkb2NIdG1sVGFnQnVmZmVycy5sZW5ndGg7CisJICAgIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuamF2YWRvY0h0bWxUYWdCdWZmZXJzLCAwLCB0aGlzLmphdmFkb2NIdG1sVGFnQnVmZmVycyA9IG5ldyBTdHJpbmdCdWZmZXJbdGV4dC5kZXB0aCs2XSwgMCwgbGVuZ3RoKTsKKwkgICAgfQorCSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gdGhpcy5qYXZhZG9jSHRtbFRhZ0J1ZmZlcnNbdGV4dC5kZXB0aF07CisJICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworCSAgICAJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICAJdGhpcy5qYXZhZG9jSHRtbFRhZ0J1ZmZlcnNbdGV4dC5kZXB0aF0gPSBidWZmZXI7CisJICAgIH0gZWxzZSB7CisJICAgIAlidWZmZXIuc2V0TGVuZ3RoKDApOworCSAgICB9CisKKwkgICAgLy8gTmV3IGxpbmUgd2lsbCBiZSBhZGRlZCBiZWZvcmUgbmV4dCBub2RlCisJICAgIGludCBtYXggPSB0ZXh0LnNlcGFyYXRvcnNQdHI7CisJCWludCBsaW5lc0FmdGVyID0gMDsKKwkJaW50IHByZXZpb3VzRW5kID0gLTE7CisJICAgIGJvb2xlYW4gaXNIdG1sQnJlYWtUYWcgPSBodG1sVGFnSUQgPT0gSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEOworCQlib29sZWFuIGlzSHRtbFNlcGFyYXRvclRhZyA9IGh0bWxUYWdJRCA9PSBKQVZBRE9DX1NFUEFSQVRPUl9UQUdTX0lEOworCQlpZiAoaXNIdG1sQnJlYWtUYWcpIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLy8gSXRlcmF0ZSBvbiB0ZXh0IGxpbmUgc2VwYXJhdG9ycworCQlib29sZWFuIGlzQ29kZSA9IGh0bWxUYWdJRCA9PSBKQVZBRE9DX0NPREVfVEFHU19JRDsKKwkJZm9yIChpbnQgaWR4PTAsIHB0cj0wOyBpZHg8PW1heCB8fCAodGV4dC5odG1sTm9kZXNQdHIgIT0gLTEgJiYgcHRyIDw9IHRleHQuaHRtbE5vZGVzUHRyKTsgaWR4KyspIHsKKworCQkJLy8gYXBwZW5kIHRleHQgdG8gYnVmZmVyIHJlYWxpZ25pbmcgd2l0aCB0aGUgbGluZSBsZW5ndGgKKwkJCWludCBlbmQgPSAoaWR4ID4gbWF4KSA/IHRleHQuc291cmNlRW5kIDogKGludCkgKHRleHQuc2VwYXJhdG9yc1tpZHhdID4+PiAzMik7CisJCQlpbnQgbm9kZUtpbmQgPSAwOyAvLyB0ZXh0IGJyZWFrCisJCQlpZiAodGV4dC5odG1sTm9kZXNQdHIgPj0gMCAmJiBwdHIgPD0gdGV4dC5odG1sTm9kZXNQdHIgJiYgZW5kID4gdGV4dC5odG1sTm9kZXNbcHRyXS5zb3VyY2VTdGFydCkgeworCQkJCUZvcm1hdEphdmFkb2NOb2RlIG5vZGUgPSB0ZXh0Lmh0bWxOb2Rlc1twdHJdOworCQkJCUZvcm1hdEphdmFkb2NUZXh0IGh0bWxUYWcgPSBub2RlLmlzVGV4dCgpID8gKEZvcm1hdEphdmFkb2NUZXh0KSBub2RlIDogbnVsbDsKKwkJCQlpbnQgbmV3TGluZXMgPSBodG1sVGFnID09IG51bGwgPyAwIDogaHRtbFRhZy5saW5lc0JlZm9yZTsKKwkJCQlpZiAobGluZXNBZnRlciA+IG5ld0xpbmVzKSB7CisJCQkJCW5ld0xpbmVzID0gbGluZXNBZnRlcjsKKwkJCQkJaWYgKG5ld0xpbmVzID4gMSAmJiBjbGVhckJsYW5rTGluZXMpIHsKKwkJCQkJCWlmIChpZHggPCAyIHx8ICh0ZXh0Lmh0bWxJbmRleGVzW2lkeC0yXSAmIEpBVkFET0NfVEFHU19JRF9NQVNLKSAhPSBKQVZBRE9DX0NPREVfVEFHU19JRCkgeworCQkJCQkJCW5ld0xpbmVzID0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodGV4dFN0YXJ0IDwgcHJldmlvdXNFbmQpIHsKKwkJCQkJYWRkUmVwbGFjZUVkaXQodGV4dFN0YXJ0LCBwcmV2aW91c0VuZCwgYnVmZmVyLnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCQlib29sZWFuIGltbXV0YWJsZSA9IG5vZGUuaXNJbW11dGFibGUoKTsKKwkJCQlpZiAobmV3TGluZXMgPT0gMCkgeworCQkJCQluZXdMaW5lcyA9IHByaW50SmF2YWRvY0Jsb2NrTm9kZXNOZXdMaW5lcyhibG9jaywgbm9kZSwgcHJldmlvdXNFbmQpOworCQkJCX0KKwkJCQlpbnQgbm9kZVN0YXJ0ID0gbm9kZS5zb3VyY2VTdGFydDsKKwkJCQlpZiAobmV3TGluZXMgPiAwIHx8IChpZHggPiAxICYmIG5vZGVTdGFydCA+IChwcmV2aW91c0VuZCsxKSkpIHsKKwkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMocHJldmlvdXNFbmQrMSwgbm9kZVN0YXJ0LTEsIG5ld0xpbmVzLCBjbGVhckJsYW5rTGluZXMsIGZhbHNlLCBudWxsKTsKKwkJCQl9CisJCQkJaWYgKG5ld0xpbmVzID4gMCkgdGV4dE9uTmV3TGluZSA9IHRydWU7CisJCQkJYnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQlpZiAobm9kZS5pc1RleHQoKSkgeworCQkJCQlpZiAoaW1tdXRhYmxlKSB7CisJCQkJCQkvLyBkbyBub3QgY2hhbmdlIGltbXV0YWJsZSB0YWdzLCBqdXN0IGluY3JlbWVudCBjb2x1bW4KKwkJCQkJCWlmICh0ZXh0T25OZXdMaW5lICYmIHRoaXMuY29tbWVudEluZGVudGF0aW9uICE9IG51bGwpIHsKKwkJCQkJICAgIAlhZGRJbnNlcnRFZGl0KG5vZGUuc291cmNlU3RhcnQsIHRoaXMuY29tbWVudEluZGVudGF0aW9uKTsKKwkJCQkJICAgIAl0aGlzLmNvbHVtbiArPSB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbi5sZW5ndGgoKTsKKwkJCQkJCX0KKwkJCQkJCXByaW50SmF2YWRvY0ltbXV0YWJsZVRleHQoaHRtbFRhZywgYmxvY2ssIHRleHRPbk5ld0xpbmUpOworCQkJCQkJdGhpcy5jb2x1bW4gKz0gZ2V0VGV4dExlbmd0aChibG9jaywgaHRtbFRhZyk7CisJCQkJCQlsaW5lc0FmdGVyID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpbmVzQWZ0ZXIgPSBwcmludEphdmFkb2NIdG1sVGFnKGh0bWxUYWcsIGJsb2NrLCB0ZXh0T25OZXdMaW5lKTsKKwkJCQkJfQorCQkJCQlub2RlS2luZCA9IDE7IC8vIHRleHQKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodGV4dE9uTmV3TGluZSAmJiB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiAhPSBudWxsKSB7CisJCQkJICAgIAlhZGRJbnNlcnRFZGl0KG5vZGUuc291cmNlU3RhcnQsIHRoaXMuY29tbWVudEluZGVudGF0aW9uKTsKKwkJCQkgICAgCXRoaXMuY29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCQkJCQl9CisJCQkJCXByaW50SmF2YWRvY0Jsb2NrKChGb3JtYXRKYXZhZG9jQmxvY2spbm9kZSk7CisJCQkJCWxpbmVzQWZ0ZXIgPSAwOworCQkJCQlub2RlS2luZCA9IDI7IC8vIGJsb2NrCisJCQkJfQorCQkJCXRleHRTdGFydCA9IG5vZGUuc291cmNlRW5kKzE7CisJCQkJcHRyKys7CisJCQkJaWYgKGlkeCA+IG1heCkgIHsKKwkJCQkJcmV0dXJuIGxpbmVzQWZ0ZXI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaWR4ID4gMCAmJiBsaW5lc0FmdGVyID4gMCkgeworCQkJCQlwcmludEphdmFkb2NHYXBMaW5lcyhwcmV2aW91c0VuZCsxLCBuZXh0U3RhcnQtMSwgbGluZXNBZnRlciwgY2xlYXJCbGFua0xpbmVzLCBmYWxzZSwgYnVmZmVyKTsKKwkJCQkJdGV4dE9uTmV3TGluZSA9IHRydWU7CisJCQkJfQorCQkJCWJvb2xlYW4gbmVlZEluZGVudGF0aW9uID0gdGV4dE9uTmV3TGluZTsKKwkJCQlpZiAoaWR4ID4gMCkgeworCQkJCQlpZiAoIW5lZWRJbmRlbnRhdGlvbiAmJiB0ZXh0LmlzVGV4dEFmdGVySHRtbFNlcGFyYXRvclRhZyhpZHgtMSkpIHsKKwkJCQkJCW5lZWRJbmRlbnRhdGlvbiA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJdGhpcy5uZWVkU3BhY2UgPSBpZHggPiAxICYmIChwcmV2aW91c0VuZCsxKSA8IG5leHRTdGFydDsgLy8gVGhlcmUncyBubyBzcGFjZSBiZXR3ZWVuIHRleHQgYW5kIGh0bWwgdGFnIG9yIGlubGluZSBibG9jayA9PiBkbyBub3QgaW5zZXJ0IHNwYWNlIGEgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dAorCQkJCXByaW50SmF2YWRvY1RleHRMaW5lKGJ1ZmZlciwgbmV4dFN0YXJ0LCBlbmQsIGJsb2NrLCBpZHg9PTAsIG5lZWRJbmRlbnRhdGlvbiwgaWR4PT0wLyogb3BlbmluZyBodG1sIHRhZz8qLyB8fCB0ZXh0Lmh0bWxJbmRleGVzW2lkeC0xXSAhPSAtMSk7CisJCQkJbGluZXNBZnRlciA9IDA7CisJCQkgICAgaWYgKGlkeD09MCkgeworCQkJICAgIAlpZiAoaXNIdG1sU2VwYXJhdG9yVGFnKSB7CisJCQkJICAgIAlsaW5lc0FmdGVyID0gMTsKKwkJCQkgICAgfQorCQkJCX0gZWxzZSBpZiAodGV4dC5odG1sSW5kZXhlc1tpZHgtMV0gPT0gSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEKSB7CisJCQkgICAgCWxpbmVzQWZ0ZXIgPSAxOworCQkJICAgIH0KKwkJCX0KKworCQkJLy8gUmVwbGFjZSB3aXRoIGN1cnJlbnQgYnVmZmVyIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGVtcHR5IGxpbmVzIGJldHdlZW4gdGV4dCBsaW5lcworCQkJbmV4dFN0YXJ0ID0gKGludCkgdGV4dC5zZXBhcmF0b3JzW2lkeF07CisJCQlpbnQgZW5kTGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihlbmQsIHRoaXMubGluZUVuZHMsIHN0YXJ0TGluZS0xLCB0aGlzLm1heExpbmVzKTsKKwkJCXN0YXJ0TGluZSA9IFV0aWwuZ2V0TGluZU51bWJlcihuZXh0U3RhcnQsIHRoaXMubGluZUVuZHMsIGVuZExpbmUtMSwgdGhpcy5tYXhMaW5lcyk7CisJCQlpbnQgbGluZXNHYXAgPSBzdGFydExpbmUgLSBlbmRMaW5lOworCQkJaWYgKGxpbmVzR2FwID4gMCkgeworCQkJCWlmIChjbGVhckJsYW5rTGluZXMpIHsKKwkJCQkJLy8ga2VlcCBwcmV2aW91c2x5IGNvbXB1dGVkIGxpbmVzIGFmdGVyCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGlkeD09MCB8fCBsaW5lc0dhcCA+IDEgfHwgKGlkeCA8IG1heCAmJiBub2RlS2luZD09MSAmJiAodGV4dC5odG1sSW5kZXhlc1tpZHgtMV0gJiBKQVZBRE9DX1RBR1NfSURfTUFTSykgIT0gSkFWQURPQ19JTU1VVEFCTEVfVEFHU19JRCkpIHsKKwkJCQkJCWlmIChsaW5lc0FmdGVyIDwgbGluZXNHYXApIHsKKwkJCQkJCQlsaW5lc0FmdGVyID0gbGluZXNHYXA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl0ZXh0T25OZXdMaW5lID0gbGluZXNBZnRlciA+IDA7CisKKwkJCS8vIHByaW50IDxwcmU+IHRhZworCQkJaWYgKGlzQ29kZSkgeworICAgIAkJCWludCBjb2RlRW5kID0gKGludCkgKHRleHQuc2VwYXJhdG9yc1ttYXhdID4+PiAzMik7CisgICAgCQkJaWYgKGNvZGVFbmQgPiBlbmQpIHsKKyAgICAJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmNvbW1lbnRfZm9ybWF0X3NvdXJjZSkgeworCQkJCQkJaWYgKHRleHRTdGFydCA8IGVuZCkgYWRkUmVwbGFjZUVkaXQodGV4dFN0YXJ0LCBlbmQsIGJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJCS8vIFNlZSB3aGV0aGVyIHRoZXJlJ3MgYSBzcGFjZSBiZWZvcmUgdGhlIGNvZGUKKwkJCQkJCWlmIChsaW5lc0dhcCA+IDApIHsKKwkJCQkJCQlpbnQgbGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmdldExpbmVTdGFydChzdGFydExpbmUpOworCQkJCQkJCWlmIChuZXh0U3RhcnQgPiBsaW5lU3RhcnQpIHsgLy8gaWYgY29kZSBzdGFydHMgYXQgdGhlIGxpbmUsIHRoZW4gbm8gbGVhZGluZyBzcGFjZSBpcyBuZWVkZWQKKwkJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8obGluZVN0YXJ0LCBuZXh0U3RhcnQtMSk7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJCQkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSkgeworCQkJCQkJCQkJCS8vIHNraXAgaW5kZW50YXRpb24KKwkJCQkJCQkJCQl0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNVUxUSVBMWSkgeworCQkJCQkJCQkJCW5leHRTdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBpaWUpIHsKKwkJCQkJCQkJCS8vIHNraXAKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIEZvcm1hdCBnYXAgbGluZXMgYmVmb3JlIGNvZGUKKwkJCQkJCWludCBuZXdMaW5lcyA9IGxpbmVzR2FwOworCQkJCQkJaWYgKG5ld0xpbmVzID09IDApIG5ld0xpbmVzPTE7CisJCQkJCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMoZW5kKzEsIG5leHRTdGFydC0xLCBuZXdMaW5lcywgZmFsc2UvKiBjbGVhciBmaXJzdCBibGFuayBsaW5lcyBpbnNpZGUgPHByZT4gdGFnIGFzIGRvbmUgYnkgb2xkIGZvcm1hdHRlciAqLywgZmFsc2UsIG51bGwpOworCQkJCQkJLy8gRm9ybWF0IHRoZSBjb2RlCisJCQkJCQlwcmludENvZGVTbmlwcGV0KG5leHRTdGFydCwgY29kZUVuZCwgbGluZXNHYXApOworCQkJCQkJLy8gRm9ybWF0IHRoZSBnYXAgbGluZXMgYWZ0ZXIgdGhlIGNvZGUKKwkJCQkJCW5leHRTdGFydCA9IChpbnQpIHRleHQuc2VwYXJhdG9yc1ttYXhdOworCSAgICAJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMoY29kZUVuZCsxLCBuZXh0U3RhcnQtMSwgMSwgZmFsc2UvKiBjbGVhciBibGFuayBsaW5lcyBpbnNpZGUgPHByZT4gdGFnIGFzIGRvbmUgYnkgb2xkIGZvcm1hdHRlciAqLywgZmFsc2UsIG51bGwpOworCSAgICAJCQkJcmV0dXJuIDI7CisgICAgCQkJCX0KKyAgICAJCQl9IGVsc2UgeworCQkJCQluZXh0U3RhcnQgPSAoaW50KSB0ZXh0LnNlcGFyYXRvcnNbbWF4XTsKKwkJCQkJaWYgKChuZXh0U3RhcnQtMSkgPiAoZW5kKzEpKSB7CisJCQkJCQlpbnQgbGluZTEgPSBVdGlsLmdldExpbmVOdW1iZXIoZW5kKzEsIHRoaXMubGluZUVuZHMsIHN0YXJ0TGluZS0xLCB0aGlzLm1heExpbmVzKTsKKwkJCQkJCWludCBsaW5lMiA9IFV0aWwuZ2V0TGluZU51bWJlcihuZXh0U3RhcnQtMSwgdGhpcy5saW5lRW5kcywgbGluZTEtMSwgdGhpcy5tYXhMaW5lcyk7CisJICAgIAkJCQlpbnQgZ2FwTGluZXMgPSBsaW5lMi1saW5lMS0xOworCQkJCQkJcHJpbnRKYXZhZG9jR2FwTGluZXMoZW5kKzEsIG5leHRTdGFydC0xLCBnYXBMaW5lcywgZmFsc2UvKiBuZXZlciBjbGVhciBibGFuayBsaW5lcyBpbnNpZGUgPHByZT4gdGFnKi8sIGZhbHNlLCBudWxsKTsKKwkJCQkJCWlmIChnYXBMaW5lcyA+IDApIHRleHRPbk5ld0xpbmUgPSB0cnVlOworCQkJCQl9CisgICAgCQkJfQorCQkJCXJldHVybiAxOworCQkJfQorCisJCQkvLyBzdG9yZSBwcmV2aW91cyBlbmQKKwkJCXByZXZpb3VzRW5kID0gZW5kOworCQl9CisKKwkJLy8gSW5zZXJ0IGxhc3QgZ2FwCisJICAgIGJvb2xlYW4gY2xvc2luZ1RhZyA9IGlzSHRtbEJyZWFrVGFnIHx8ICh0ZXh0Lmh0bWxJbmRleGVzICE9IG51bGwgJiYgKHRleHQuaHRtbEluZGV4ZXNbbWF4XSAmIEpBVkFET0NfVEFHU19JRF9NQVNLKSA9PSBodG1sVGFnSUQpOworCQlib29sZWFuIGlzVmFsaWRIdG1sU2VwYXJhdG9yVGFnID0gbWF4ID4gMCAmJiBpc0h0bWxTZXBhcmF0b3JUYWcgJiYgY2xvc2luZ1RhZzsKKwkJaWYgKHByZXZpb3VzRW5kICE9IC0xKSB7CisJCSAgICBpZiAoaXNWYWxpZEh0bWxTZXBhcmF0b3JUYWcpIHsKKwkJCQlpZiAobGluZXNBZnRlciA9PSAwKSBsaW5lc0FmdGVyID0gMTsKKwkJCX0KKwkJCWlmIChsaW5lc0FmdGVyID4gMCkgeworCQkJCXByaW50SmF2YWRvY0dhcExpbmVzKHByZXZpb3VzRW5kKzEsIG5leHRTdGFydC0xLCBsaW5lc0FmdGVyLCBjbGVhckJsYW5rTGluZXMsIGZhbHNlLCBidWZmZXIpOworCQkJCXRleHRPbk5ld0xpbmUgPSBsaW5lc0FmdGVyID4gMDsKKwkJCX0KKwkJfQorCisJICAgIC8vIFByaW50IGNsb3NpbmcgdGFnCisJCWJvb2xlYW4gbmVlZEluZGVudGF0aW9uID0gdGV4dE9uTmV3TGluZTsKKwkJaWYgKCFuZWVkSW5kZW50YXRpb24gJiYgIWlzSHRtbEJyZWFrVGFnICYmIHRleHQuaHRtbEluZGV4ZXMgIT0gbnVsbCAmJiB0ZXh0LmlzVGV4dEFmdGVySHRtbFNlcGFyYXRvclRhZyhtYXgpKSB7CisJCQluZWVkSW5kZW50YXRpb24gPSB0cnVlOworCQl9CisJCXRoaXMubmVlZFNwYWNlID0gIWNsb3NpbmdUYWcgJiYgbWF4ID4gMCAvLyBub3QgYSBzaW5nbGUgb3Igbm90IGNsb3NlZCB0YWcgKGUuZy4gPGJyPikKKwkJCSYmIChwcmV2aW91c0VuZCsxKSA8IG5leHRTdGFydDsgLy8gVGhlcmUncyBubyBzcGFjZSBiZXR3ZWVuIHRleHQgYW5kIGh0bWwgdGFnIG9yIGlubGluZSBibG9jayA9PiBkbyBub3QgaW5zZXJ0IHNwYWNlIGEgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dAorCQlwcmludEphdmFkb2NUZXh0TGluZShidWZmZXIsIG5leHRTdGFydCwgdGV4dC5zb3VyY2VFbmQsIGJsb2NrLCBtYXggPD0gMCwgbmVlZEluZGVudGF0aW9uLCBjbG9zaW5nVGFnLyogY2xvc2luZyBodG1sIHRhZyovKTsKKwkJaWYgKHRleHRTdGFydCA8IHRleHQuc291cmNlRW5kKSB7CisJCQlhZGRSZXBsYWNlRWRpdCh0ZXh0U3RhcnQsIHRleHQuc291cmNlRW5kLCBidWZmZXIudG9TdHJpbmcoKSk7CisJCX0KKworCQkvLyBSZXNldAorCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0ZXh0LnNvdXJjZUVuZCsxLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCisJCS8vIFJldHVybiB0aGUgbmV3IGxpbmVzIHRvIGluc2VydCBhZnRlcgorCSAgICByZXR1cm4gaXNWYWxpZEh0bWxTZXBhcmF0b3JUYWcgPyAxIDogMDsKKyAgICB9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jTmV3TGluZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJICAgIGJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkgICAgdGhpcy5jb2x1bW4gPSAxOworCSAgICBwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkoYnVmZmVyKTsKKwkgICAgYnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJICAgIHRoaXMuY29sdW1uICs9IEJMT0NLX0xJTkVfUFJFRklYX0xFTkdUSDsKKwkgICAgdGhpcy5saW5lKys7CisJICAgIHRoaXMubGFzdE51bWJlck9mTmV3TGluZXMrKzsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhZG9jVGV4dChGb3JtYXRKYXZhZG9jVGV4dCB0ZXh0LCBGb3JtYXRKYXZhZG9jQmxvY2sgYmxvY2ssIGJvb2xlYW4gdGV4dE9uTmV3TGluZSkgeworCisJCWJvb2xlYW4gY2xlYXJCbGFua0xpbmVzID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ7CisJCWJvb2xlYW4gam9pbkxpbmVzID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuam9pbl9saW5lc19pbl9jb21tZW50czsKKwkJdGhpcy5qYXZhZG9jVGV4dEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCWludCB0ZXh0U3RhcnQgPSB0ZXh0LnNvdXJjZVN0YXJ0OworCQlpbnQgbmV4dFN0YXJ0ID0gdGV4dFN0YXJ0OworCQlpbnQgc3RhcnRMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKHRleHRTdGFydCwgdGhpcy5saW5lRW5kcywgMCwgdGhpcy5tYXhMaW5lcyk7CisKKwkJLy8gSXRlcmF0ZSBvbiB0ZXh0IGxpbmUgc2VwYXJhdG9ycworCQlmb3IgKGludCBpZHg9MCwgbWF4PXRleHQuc2VwYXJhdG9yc1B0cjsgaWR4PD1tYXggOyBpZHgrKykgeworCisJCQkvLyBhcHBlbmQgdGV4dCB0byBidWZmZXIgcmVhbGlnbmluZyB3aXRoIHRoZSBsaW5lIGxlbmd0aAorCQkJaW50IGVuZCA9IChpbnQpICh0ZXh0LnNlcGFyYXRvcnNbaWR4XSA+Pj4gMzIpOworCQkJYm9vbGVhbiBuZWVkSW5kZW50YXRpb24gPSB0ZXh0T25OZXdMaW5lOworCQkJaWYgKGlkeCA+IDApIHsKKwkJCQlpZiAoIW5lZWRJbmRlbnRhdGlvbiAmJiB0ZXh0LmlzVGV4dEFmdGVySHRtbFNlcGFyYXRvclRhZyhpZHgtMSkpIHsKKwkJCQkJbmVlZEluZGVudGF0aW9uID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQl0aGlzLm5lZWRTcGFjZSA9IGlkeCA+IDA7CisJCQlwcmludEphdmFkb2NUZXh0TGluZSh0aGlzLmphdmFkb2NUZXh0QnVmZmVyLCBuZXh0U3RhcnQsIGVuZCwgYmxvY2ssIGlkeD09MCB8fCAoIWpvaW5MaW5lcyAmJiB0ZXh0T25OZXdMaW5lKS8qZmlyc3QgdGV4dD8qLywgbmVlZEluZGVudGF0aW9uLCBmYWxzZSAvKm5vdCBhbiBodG1sIHRhZyovKTsKKwkJCXRleHRPbk5ld0xpbmUgPSBmYWxzZTsKKworCQkJLy8gUmVwbGFjZSB3aXRoIGN1cnJlbnQgYnVmZmVyIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGVtcHR5IGxpbmVzIGJldHdlZW4gdGV4dCBsaW5lcworCQkJbmV4dFN0YXJ0ID0gKGludCkgdGV4dC5zZXBhcmF0b3JzW2lkeF07CisJCQlpZiAoIWNsZWFyQmxhbmtMaW5lcyB8fCAham9pbkxpbmVzKSB7CisJCQkJaW50IGVuZExpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIoZW5kLCB0aGlzLmxpbmVFbmRzLCBzdGFydExpbmUtMSwgdGhpcy5tYXhMaW5lcyk7CisJCQkJc3RhcnRMaW5lID0gVXRpbC5nZXRMaW5lTnVtYmVyKG5leHRTdGFydCwgdGhpcy5saW5lRW5kcywgZW5kTGluZS0xLCB0aGlzLm1heExpbmVzKTsKKwkJCQlpbnQgZ2FwTGluZSA9IGVuZExpbmU7CisJCQkJaWYgKGpvaW5MaW5lcykgZ2FwTGluZSsrOyAvLyBpZiBub3QgcHJlc2VydmluZyBsaW5lIGJyZWFrIHRoZW4gZ2FwIG11c3QgYmUgYXQgbGVhc3Qgb2Ygb25lIGxpbmUKKwkJCQlpZiAoc3RhcnRMaW5lID4gZ2FwTGluZSkgeworCQkJCQlhZGRSZXBsYWNlRWRpdCh0ZXh0U3RhcnQsIGVuZCwgdGhpcy5qYXZhZG9jVGV4dEJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJdGV4dFN0YXJ0ID0gbmV4dFN0YXJ0OworCQkJCQl0aGlzLmphdmFkb2NUZXh0QnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJaW50IG5ld0xpbmVzID0gc3RhcnRMaW5lIC0gZW5kTGluZTsKKwkJCQkJaWYgKGNsZWFyQmxhbmtMaW5lcykgbmV3TGluZXMgPSAxOworCQkJCQlwcmludEphdmFkb2NHYXBMaW5lcyhlbmQrMSwgbmV4dFN0YXJ0LTEsIG5ld0xpbmVzLCB0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5jb21tZW50X2NsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudCwgZmFsc2UsIG51bGwpOworCQkJCQl0ZXh0T25OZXdMaW5lID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoc3RhcnRMaW5lID4gZW5kTGluZSkgeworCQkJCQl0ZXh0T25OZXdMaW5lID0gIWpvaW5MaW5lczsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBSZXBsYWNlIHJlbWFpbmluZyBsaW5lCisJCWJvb2xlYW4gbmVlZEluZGVudGF0aW9uID0gdGV4dE9uTmV3TGluZTsKKwkJdGhpcy5uZWVkU3BhY2UgPSB0ZXh0LnNlcGFyYXRvcnNQdHIgPj0gMDsKKwkJcHJpbnRKYXZhZG9jVGV4dExpbmUodGhpcy5qYXZhZG9jVGV4dEJ1ZmZlciwgbmV4dFN0YXJ0LCB0ZXh0LnNvdXJjZUVuZCwgYmxvY2ssIHRleHQuc2VwYXJhdG9yc1B0cj09LTEgLyogZmlyc3QgdGV4dD8qLywgbmVlZEluZGVudGF0aW9uLCBmYWxzZSAvKm5vdCBhbiBodG1sIHRhZyovKTsKKwkJLy8gVE9ETyBCcmluZyBiYWNrIGZvbGxvd2luZyBvcHRpbWl6YXRpb24KKwkJLy8gaWYgKGxhc3ROZXdMaW5lcyAhPSB0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzIHx8ICh0aGlzLmNvbHVtbiAtIGN1cnJlbnRDb2x1bW4pICE9ICh0ZXh0LnNvdXJjZUVuZCAtIHRleHQuc291cmNlU3RhcnQgKyAxKSkgeworCQkJYWRkUmVwbGFjZUVkaXQodGV4dFN0YXJ0LCB0ZXh0LnNvdXJjZUVuZCwgdGhpcy5qYXZhZG9jVGV4dEJ1ZmZlci50b1N0cmluZygpKTsKKwkJLy8gfQorCisJCS8vIFJlc2V0CisJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRleHQuc291cmNlRW5kKzEsIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LgorCSAqLworCXByaXZhdGUgdm9pZCBwcmludEphdmFkb2NUZXh0TGluZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCwgRm9ybWF0SmF2YWRvY0Jsb2NrIGJsb2NrLCBib29sZWFuIGZpcnN0VGV4dCwgYm9vbGVhbiBuZWVkSW5kZW50YXRpb24sIGJvb2xlYW4gaXNIdG1sVGFnKSB7CisKKwkJYm9vbGVhbiBoZWFkZXJMaW5lID0gYmxvY2suaXNIZWFkZXJMaW5lKCkgJiYgdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9PSAwOworCisJCS8vIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB3aGF0IGlzIHRoZSBpbmRlbnRhdGlvbgorCQl0aGlzLmphdmFkb2NUb2tlbnNCdWZmZXIuc2V0TGVuZ3RoKDApOworCQlpbnQgZmlyc3RDb2x1bW4gPSAxICsgdGhpcy5pbmRlbnRhdGlvbkxldmVsICsgQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIOworCQlpbnQgbWF4Q29sdW1uID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuY29tbWVudF9saW5lX2xlbmd0aCArIDE7CisJCWlmIChoZWFkZXJMaW5lKSB7CisJCQlmaXJzdENvbHVtbisrOworCQkJbWF4Q29sdW1uKys7CisJCX0KKwkJaWYgKG5lZWRJbmRlbnRhdGlvbiAmJiB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuY29tbWVudEluZGVudGF0aW9uKTsKKwkgICAgCXRoaXMuY29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCSAgICAJZmlyc3RDb2x1bW4gKz0gdGhpcy5jb21tZW50SW5kZW50YXRpb24ubGVuZ3RoKCk7CisJCX0KKwkJaWYgKHRoaXMuY29sdW1uIDwgZmlyc3RDb2x1bW4pIHsKKwkJCXRoaXMuY29sdW1uID0gZmlyc3RDb2x1bW47CisJCX0KKworCQkvLyBTY2FuIHRoZSB0ZXh0IHRva2VuIHBlciB0b2tlbiB0byBjb21wYWN0IGl0IGFuZCBzaXplIGl0IHRoZSBtYXggbGluZSBsZW5ndGgKKwkJU3RyaW5nIG5ld0xpbmVTdHJpbmcgPSBudWxsOworCQl0cnkgeworCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGV4dFN0YXJ0LCB0ZXh0RW5kKTsKKwkJCXRoaXMuc2Nhbm5lci5za2lwQ29tbWVudHMgPSB0cnVlOworCQkJaW50IHByZXZpb3VzVG9rZW4gPSAtMTsKKwkJCWJvb2xlYW4gdGV4dE9uTmV3TGluZSA9IG5lZWRJbmRlbnRhdGlvbjsKKworCQkJLy8gQ29uc3VtZSB0ZXh0IHRva2VuIHBlciB0b2tlbgorICAgIAkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCWludCB0b2tlbjsKKwkJCQl0cnkgeworCQkJCQl0b2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWllKSB7CisJCQkJCXRva2VuID0gY29uc3VtZUludmFsaWRUb2tlbih0ZXh0RW5kKTsKKwkJCQl9CisJICAgIAkJaW50IHRva2Vuc0J1ZmZlckxlbmd0aCA9IHRoaXMuamF2YWRvY1Rva2Vuc0J1ZmZlci5sZW5ndGgoKTsKKyAgICAJCQlpbnQgdG9rZW5TdGFydCA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCk7CisJICAgIAkJaW50IHRva2VuTGVuZ3RoID0gKHRoaXMuc2Nhbm5lci5hdEVuZCgpID8gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDogdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgLSB0b2tlblN0YXJ0OworCQkJCWJvb2xlYW4gaW5zZXJ0U3BhY2UgPSAocHJldmlvdXNUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFIHx8IHRoaXMubmVlZFNwYWNlKSAmJiAhdGV4dE9uTmV3TGluZTsKKwkJCQlTdHJpbmcgdG9rZW5zQnVmZmVyU3RyaW5nID0gdGhpcy5qYXZhZG9jVG9rZW5zQnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOworCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJaWYgKHRva2Vuc0J1ZmZlckxlbmd0aCA+IDApIHsKKwkJCQkJCQlib29sZWFuIHNob3VsZFNwbGl0ID0gKHRoaXMuY29sdW1uK3Rva2Vuc0J1ZmZlckxlbmd0aCkgPiBtYXhDb2x1bW4gLy8gdGhlIG1heCBsZW5ndGggaXMgcmVhY2hlZAorCQkJCQkJCQkmJiAhaXNIdG1sVGFnCisJCQkJCQkJCSYmIChpbnNlcnRTcGFjZSB8fCB0b2tlbnNCdWZmZXJMZW5ndGggPiAxKSAvLyBhbGxvdyB0byBzcGxpdCBhdCB0aGUgYmVnaW5uaW5nIG9ubHkgd2hlbiBzdGFydGluZyB3aXRoIGFuIGlkZW50aWZpZXIgb3IgYSB0b2tlbiB3aXRoIGEgbGVuZ3RoID4gMQorCQkJCQkJCQkmJiB0b2tlbnNCdWZmZXJTdHJpbmcuY2hhckF0KDApICE9ICdAJzsgLy8gYXZvaWQgdG8gc3BsaXQganVzdCBiZWZvcmUgYSAnQCcKKwkJCQkJCQlpZiAoc2hvdWxkU3BsaXQpIHsKKwkJCQkJCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcysrOworCQkJCQkJCQl0aGlzLmxpbmUrKzsKKwkJCQkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJCQkJdGhpcy50ZW1wQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKKwkJCQkJCQkgICAgCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJCQkgICAgCXByaW50SW5kZW50YXRpb25JZk5lY2Vzc2FyeSh0aGlzLnRlbXBCdWZmZXIpOworCQkJCQkJICAgIAkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChCTE9DS19MSU5FX1BSRUZJWCk7CisJCQkJCQkJICAgIAl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJCQkJCQlpZiAodGhpcy5jb21tZW50SW5kZW50YXRpb24gIT0gbnVsbCkgeworCQkJCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQodGhpcy5jb21tZW50SW5kZW50YXRpb24pOworCQkJCQkJCQkgICAgCXRoaXMuY29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCQkJCQkJCQkJfQorCQkJCQkJICAgIAkJZmlyc3RDb2x1bW4gPSB0aGlzLmNvbHVtbjsKKwkJCQkJCSAgICAJCW5ld0xpbmVTdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXRoaXMuY29sdW1uID0gZmlyc3RDb2x1bW47CisJCQkJCQkJCX0KKwkJCQkJCQkJYnVmZmVyLmFwcGVuZChuZXdMaW5lU3RyaW5nKTsKKwkJCQkJCQkJYnVmZmVyLmFwcGVuZCh0b2tlbnNCdWZmZXJTdHJpbmcpOworCQkJCQkJCQl0aGlzLmNvbHVtbiArPSB0b2tlbnNCdWZmZXJTdHJpbmcubGVuZ3RoKCk7CisJCQkJCQkJCWlmIChoZWFkZXJMaW5lKSB7CisJCQkJCQkJCQlmaXJzdENvbHVtbi0tOworCQkJCQkJCQkJbWF4Q29sdW1uLS07CisJCQkJCQkJCQloZWFkZXJMaW5lID0gZmFsc2U7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlidWZmZXIuYXBwZW5kKHRoaXMuamF2YWRvY1Rva2Vuc0J1ZmZlcik7CisJCQkJCQkJCXRoaXMuY29sdW1uICs9IHRva2Vuc0J1ZmZlckxlbmd0aDsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5qYXZhZG9jVG9rZW5zQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCX0KKwkJCQkJCXRleHRPbk5ld0xpbmUgPSBmYWxzZTsKKwkJCQkJCXByZXZpb3VzVG9rZW4gPSB0b2tlbjsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw6CisJCQkJCQlpZiAodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA+IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbikgeworCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCB0ZXh0RW5kKTsKKwkJCQkJCQl0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQkJCQl0b2tlbiA9IDE7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJICAgIAkJaW50IGxhc3RDb2x1bW4gPSB0aGlzLmNvbHVtbiArIHRva2Vuc0J1ZmZlckxlbmd0aCArIHRva2VuTGVuZ3RoOworCSAgICAJCWlmIChpbnNlcnRTcGFjZSkgbGFzdENvbHVtbisrOworCQkJCWJvb2xlYW4gc2hvdWxkU3BsaXQgPSBsYXN0Q29sdW1uID4gbWF4Q29sdW1uIC8vIHRoZSBtYXggbGVuZ3RoIGlzIHJlYWNoZWQKKwkJCQkJJiYgKCFpc0h0bWxUYWcgfHwgcHJldmlvdXNUb2tlbiA9PSAtMSkgLy8gbm90IGFuIGh0bWwgdGFnIG9yIGp1c3QgYXQgdGhlIGJlZ2lubmluZyBvZiBpdAorCQkJCQkmJiB0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBVCAmJiAodG9rZW5zQnVmZmVyTGVuZ3RoID09IDAgfHwgdGhpcy5qYXZhZG9jVG9rZW5zQnVmZmVyLmNoYXJBdCh0b2tlbnNCdWZmZXJMZW5ndGgtMSkgIT0gJ0AnKTsgLy8gYXZvaWQgdG8gc3BsaXQganVzdCBiZWZvcmUgYSAnQCcKKwkJCQlpZiAoc2hvdWxkU3BsaXQpIHsKKwkJCQkJLy8gbm90IGVub3VnaCBzcGFjZSBvbiB0aGUgbGluZQorCQkJCQlpZiAoKHRva2Vuc0J1ZmZlckxlbmd0aCA+IDAgfHwgdG9rZW5MZW5ndGggPCBtYXhDb2x1bW4pICYmICFpc0h0bWxUYWcgJiYgdG9rZW5zQnVmZmVyTGVuZ3RoID4gMCAmJiAoZmlyc3RDb2x1bW4rdG9rZW5zQnVmZmVyTGVuZ3RoK3Rva2VuTGVuZ3RoKSA+PSBtYXhDb2x1bW4pIHsKKwkJCQkJCS8vIHRoZXJlIHdvbid0IGJlIGVub3VnaCByb29tIGV2ZW4gaWYgd2UgYnJlYWsgdGhlIGxpbmUgYmVmb3JlIHRoZSBidWZmZXJlZCB0b2tlbnMKKwkJCQkJCS8vIFNvIGFkZCB0aGUgYnVmZmVyZWQgdG9rZW5zIG5vdworCQkJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmphdmFkb2NUb2tlbnNCdWZmZXIpOworCQkJCQkJdGhpcy5jb2x1bW4gKz0gdG9rZW5zQnVmZmVyTGVuZ3RoOworCQkJCQkJdGhpcy5qYXZhZG9jVG9rZW5zQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJCQkJCXRva2Vuc0J1ZmZlckxlbmd0aCA9IDA7CisJCQkJCQl0ZXh0T25OZXdMaW5lID0gZmFsc2U7CisJCQkJCX0KKwkJCQkJaWYgKCh0b2tlbnNCdWZmZXJMZW5ndGggPiAwIHx8IC8qKGZpcnN0Q29sdW1uK3Rva2VuTGVuZ3RoKSA8IG1heENvbHVtbiB8fCAoaW5zZXJ0U3BhY2UgJiYqLyB0aGlzLmNvbHVtbiA+IGZpcnN0Q29sdW1uKSAmJiAoIXRleHRPbk5ld0xpbmUgfHwgIWZpcnN0VGV4dCkpIHsKKwkJCQkJCXRoaXMubGFzdE51bWJlck9mTmV3TGluZXMrKzsKKwkJCQkJCXRoaXMubGluZSsrOworCQkJCQkJaWYgKG5ld0xpbmVTdHJpbmcgPT0gbnVsbCkgeworCQkJCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCQkgICAgCXRoaXMuY29sdW1uID0gMTsKKwkJCQkJICAgIAlwcmludEluZGVudGF0aW9uSWZOZWNlc3NhcnkodGhpcy50ZW1wQnVmZmVyKTsKKwkJCQkgICAgCQl0aGlzLnRlbXBCdWZmZXIuYXBwZW5kKEJMT0NLX0xJTkVfUFJFRklYKTsKKwkJCQkJICAgIAl0aGlzLmNvbHVtbiArPSBCTE9DS19MSU5FX1BSRUZJWF9MRU5HVEg7CisJCQkJCQkJaWYgKHRoaXMuY29tbWVudEluZGVudGF0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZCh0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbik7CisJCQkJCQkgICAgCXRoaXMuY29sdW1uICs9IHRoaXMuY29tbWVudEluZGVudGF0aW9uLmxlbmd0aCgpOworCQkJCQkJCX0KKwkJCQkgICAgCQlmaXJzdENvbHVtbiA9IHRoaXMuY29sdW1uOworCQkJCSAgICAJCW5ld0xpbmVTdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5jb2x1bW4gPSBmaXJzdENvbHVtbjsKKwkJCQkJCX0KKwkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3TGluZVN0cmluZyk7CisJCQkJCX0KKwkJCSAgICAJaWYgKHRva2Vuc0J1ZmZlckxlbmd0aCA+IDApIHsKKwkJCSAgICAJCVN0cmluZyB0b2tlbnNTdHJpbmcgPSB0b2tlbnNCdWZmZXJTdHJpbmc7CisJCQkJCQlidWZmZXIuYXBwZW5kKHRva2Vuc1N0cmluZyk7CisJCQkJCQl0aGlzLmNvbHVtbiArPSB0b2tlbnNTdHJpbmcubGVuZ3RoKCk7CisJCQkJCQl0aGlzLmphdmFkb2NUb2tlbnNCdWZmZXIuc2V0TGVuZ3RoKDApOworCQkJCQkJdG9rZW5zQnVmZmVyTGVuZ3RoID0gMDsKKwkJICAgIAkJfQorCQkJCQlidWZmZXIuYXBwZW5kKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnQsIHRva2VuTGVuZ3RoKTsKKwkJCQkJdGhpcy5jb2x1bW4gKz0gdG9rZW5MZW5ndGg7CisJCQkJCXRleHRPbk5ld0xpbmUgPSBmYWxzZTsKKwkJCQkJaWYgKGhlYWRlckxpbmUpIHsKKwkJCQkJCWZpcnN0Q29sdW1uLS07CisJCQkJCQltYXhDb2x1bW4tLTsKKwkJCQkJCWhlYWRlckxpbmUgPSBmYWxzZTsKKwkJCQkJfQorICAgIAkJCX0gZWxzZSB7CisJCQkJCS8vIGFwcGVuZCB0b2tlbiB0byB0aGUgbGluZQorCQkgICAgCQlpZiAoaW5zZXJ0U3BhY2UpIHsKKwkJICAgIAkJCXRoaXMuamF2YWRvY1Rva2Vuc0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJICAgIAkJfQorCQkJCQl0aGlzLmphdmFkb2NUb2tlbnNCdWZmZXIuYXBwZW5kKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnQsIHRva2VuTGVuZ3RoKTsKKyAgICAJCQl9CisJCQkJcHJldmlvdXNUb2tlbiA9IHRva2VuOworICAgIAkJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CisgICAgCQkJaWYgKGhlYWRlckxpbmUgJiYgbGFzdENvbHVtbiA9PSBtYXhDb2x1bW4gJiYgdGhpcy5zY2FubmVyLmF0RW5kKCkpIHsKKwkJCQkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcysrOworCQkJCQl0aGlzLmxpbmUrKzsKKyAgICAJCQl9CisgICAgCQl9CisJCX0KKwkJZmluYWxseSB7CisJCQl0aGlzLnNjYW5uZXIuc2tpcENvbW1lbnRzID0gZmFsc2U7CisJCQkvLyBBZGQgcmVtYWluaW5nIGJ1ZmZlcmVkIHRva2VucworCQkJaWYgKHRoaXMuamF2YWRvY1Rva2Vuc0J1ZmZlci5sZW5ndGgoKSA+IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuamF2YWRvY1Rva2Vuc0J1ZmZlcik7CisJCQkJdGhpcy5jb2x1bW4gKz0gdGhpcy5qYXZhZG9jVG9rZW5zQnVmZmVyLmxlbmd0aCgpOworCQkJfQorCQl9CisgICAgfQorCiAJcHVibGljIHZvaWQgcHJpbnRNb2RpZmllcnMoQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJcHJpbnRNb2RpZmllcnMoYW5ub3RhdGlvbnMsIHZpc2l0b3IsIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fVU5TUEVDSUZJRUQpOworCX0KKworCXB1YmxpYyB2b2lkIHByaW50TW9kaWZpZXJzKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgQVNUVmlzaXRvciB2aXNpdG9yLCBpbnQgYW5ub3RhdGlvblNvdXJjZUtpbmQpIHsKIAkJdHJ5IHsKIAkJCWludCBhbm5vdGF0aW9uc0xlbmd0aCA9IGFubm90YXRpb25zICE9IG51bGwgPyBhbm5vdGF0aW9ucy5sZW5ndGggOiAwOwogCQkJaW50IGFubm90YXRpb25zSW5kZXggPSAwOwpAQCAtMTI3MCw2ICs0NTM3LDkgQEAKIAkJCWJvb2xlYW4gaGFzQ29tbWVudCA9IGZhbHNlOwogCQkJYm9vbGVhbiBoYXNNb2RpZmllcnMgPSBmYWxzZTsKIAkJCXdoaWxlICgodGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgeworCQkJCWludCBmb3VuZFRhc2tDb3VudCA9IHRoaXMuc2Nhbm5lci5mb3VuZFRhc2tDb3VudDsKKwkJCQlpbnQgdG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKwkJCQlpbnQgdG9rZW5FbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpOwogCQkJCXN3aXRjaCh0aGlzLmN1cnJlbnRUb2tlbikgewogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXB1YmxpYyA6CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcHJvdGVjdGVkIDoKQEAgLTEyODMsMTkgKzQ1NTMsNjIgQEAKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV2b2xhdGlsZSA6CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3RyaWN0ZnAgOgogCQkJCQkJaGFzTW9kaWZpZXJzID0gdHJ1ZTsKLQkJCQkJCXRoaXMucHJpbnQodGhpcy5zY2FubmVyLmdldFJhd1Rva2VuU291cmNlKCksICFpc0ZpcnN0TW9kaWZpZXIpOworCQkJCQkJcHJpbnQodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAhaXNGaXJzdE1vZGlmaWVyKTsKIAkJCQkJCWlzRmlyc3RNb2RpZmllciA9IGZhbHNlOwogCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBVCA6CiAJCQkJCQloYXNNb2RpZmllcnMgPSB0cnVlOwogCQkJCQkJaWYgKCFpc0ZpcnN0TW9kaWZpZXIpIHsKLQkJCQkJCQl0aGlzLnNwYWNlKCk7CisJCQkJCQkJc3BhY2UoKTsKIAkJCQkJCX0KIAkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7CiAJCQkJCQlpZiAoYW5ub3RhdGlvbnNJbmRleCA8IGFubm90YXRpb25zTGVuZ3RoKSB7Ci0JCQkJCQkJYW5ub3RhdGlvbnNbYW5ub3RhdGlvbnNJbmRleCsrXS50cmF2ZXJzZSh2aXNpdG9yLCAoQmxvY2tTY29wZSkgbnVsbCk7Ci0JCQkJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uKSB7CisJCQkJCQkJYm9vbGVhbiBpbnNlcnRTcGFjZUJlZm9yZUJyYWNlID0gdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyOworCQkJCQkJCXRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciA9IGZhbHNlOworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWFubm90YXRpb25zW2Fubm90YXRpb25zSW5kZXgrK10udHJhdmVyc2UodmlzaXRvciwgKEJsb2NrU2NvcGUpIG51bGwpOworCQkJCQkJCX0KKwkJCQkJCQlmaW5hbGx5IHsKKwkJCQkJCQkJdGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyID0gaW5zZXJ0U3BhY2VCZWZvcmVCcmFjZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjI0NworCQkJCQkJCWJvb2xlYW4gc2hvdWxkQWRkTmV3TGluZSA9IGZhbHNlOworCQkJCQkJCXN3aXRjaCAoYW5ub3RhdGlvblNvdXJjZUtpbmQpIHsKKwkJCQkJCQkJY2FzZSBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX1RZUEUgOgorCQkJCQkJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUpIHsKKwkJCQkJCQkJCQlzaG91bGRBZGROZXdMaW5lID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fRklFTEQgOgorCQkJCQkJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkKSB7CisJCQkJCQkJCQkJc2hvdWxkQWRkTmV3TGluZSA9IHRydWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX01FVEhPRCA6CisJCQkJCQkJCQlpZiAodGhpcy5mb3JtYXR0ZXIucHJlZmVyZW5jZXMuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kKSB7CisJCQkJCQkJCQkJc2hvdWxkQWRkTmV3TGluZSA9IHRydWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBJQ29kZUZvcm1hdHRlckNvbnN0YW50cy5BTk5PVEFUSU9OX09OX1BBQ0tBR0UgOgorCQkJCQkJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UpIHsKKwkJCQkJCQkJCQlzaG91bGRBZGROZXdMaW5lID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fUEFSQU1FVEVSIDoKKwkJCQkJCQkJCWlmICh0aGlzLmZvcm1hdHRlci5wcmVmZXJlbmNlcy5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIpIHsKKwkJCQkJCQkJCQlzaG91bGRBZGROZXdMaW5lID0gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIElDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkFOTk9UQVRJT05fT05fTE9DQUxfVkFSSUFCTEUgOgorCQkJCQkJCQkJaWYgKHRoaXMuZm9ybWF0dGVyLnByZWZlcmVuY2VzLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlKSB7CisJCQkJCQkJCQkJc2hvdWxkQWRkTmV3TGluZSA9IHRydWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCS8vIGRvIG5vdGhpbmcgd2hlbiBubyBhbm5vdGF0aW9uIGZvcm1hdHRpbmcgb3B0aW9uIHNwZWNpZmllZAorCQkJCQkJCX0KKwkJCQkJCQlpZiAoc2hvdWxkQWRkTmV3TGluZSkgewogCQkJCQkJCQl0aGlzLnByaW50TmV3TGluZSgpOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7CkBAIC0xMzA1LDE3ICs0NjE4LDY2IEBACiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgotCQkJCQkJdGhpcy5wcmludEJsb2NrQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSwgZmFsc2UpOwotCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQloYXNDb21tZW50ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQyA6Ci0JCQkJCQl0aGlzLnByaW50QmxvY2tDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpLCB0cnVlKTsKKwkJCQkJCWlmICh0aGlzLnVzZVRhZ3MgJiYgdGhpcy5lZGl0c0VuYWJsZWQpIHsKKwkJCQkJCQlib29sZWFuIHR1cm5PZmYgPSBmYWxzZTsKKwkJCQkJCQlpZiAoZm91bmRUYXNrQ291bnQgPiAwKSB7CisJCQkJCQkJCXNldEVkaXRzRW5hYmxlZChmb3VuZFRhc2tDb3VudCk7CisJCQkJCQkJCXR1cm5PZmYgPSB0cnVlOworCQkJCQkJCX0gZWxzZSBpZiAodGhpcy50YWdzS2luZCA9PSB0aGlzLmN1cnJlbnRUb2tlbgorCQkJCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmRpc2FibGluZ1RhZywgdGhpcy5zY2FubmVyLnNvdXJjZSwgdG9rZW5TdGFydFBvc2l0aW9uLCB0b2tlbkVuZFBvc2l0aW9uKzEpKSB7CisgICAgCQkJCQkJCXRoaXMuZWRpdHNFbmFibGVkID0gZmFsc2U7CisJCQkJCQkJCXR1cm5PZmYgPSB0cnVlOworCQkJCQkgICAgCX0KKwkJCQkJCQlpZiAodHVybk9mZikgeworCQkJCQkJCQlpZiAoIXRoaXMuZWRpdHNFbmFibGVkICYmIHRoaXMuZWRpdHNJbmRleCA+IDEpIHsKKwkJCQkJCQkJCU9wdGltaXplZFJlcGxhY2VFZGl0IGN1cnJlbnRFZGl0ID0gdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXgtMV07CisJCQkJCQkJCQlpZiAodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPT0gY3VycmVudEVkaXQub2Zmc2V0K2N1cnJlbnRFZGl0Lmxlbmd0aCkgeworCQkJCQkJCQkJCXByaW50TmV3TGluZXNCZWZvcmVEaXNhYmxpbmdDb21tZW50KCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlwcmludEJsb2NrQ29tbWVudCh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MpOworCQkJCQkJaWYgKHRoaXMudXNlVGFncyAmJiAhdGhpcy5lZGl0c0VuYWJsZWQpIHsKKwkJCQkJCQlpZiAoZm91bmRUYXNrQ291bnQgPiAwKSB7CisJCQkJCQkJCXNldEVkaXRzRW5hYmxlZChmb3VuZFRhc2tDb3VudCk7CisJCQkJCQkJfSBlbHNlIGlmICh0aGlzLnRhZ3NLaW5kID09IHRoaXMuY3VycmVudFRva2VuKSB7CisJICAgIAkJCQkJCXRoaXMuZWRpdHNFbmFibGVkID0gQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5lbmFibGluZ1RhZywgdGhpcy5zY2FubmVyLnNvdXJjZSwgdG9rZW5TdGFydFBvc2l0aW9uLCB0b2tlbkVuZFBvc2l0aW9uKzEpOworCQkJCQkgICAgCX0KKwkJCQkJCX0KIAkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJaGFzQ29tbWVudCA9IHRydWU7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOgotCQkJCQkJdGhpcy5wcmludExpbmVDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpKTsKKwkJCQkJCXRva2VuRW5kUG9zaXRpb24gPSAtdGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wc1t0aGlzLnNjYW5uZXIuY29tbWVudFB0cl07CisJCQkJCQlpZiAodGhpcy51c2VUYWdzICYmIHRoaXMuZWRpdHNFbmFibGVkKSB7CisJCQkJCQkJYm9vbGVhbiB0dXJuT2ZmID0gZmFsc2U7CisJCQkJCQkJaWYgKGZvdW5kVGFza0NvdW50ID4gMCkgeworCQkJCQkJCQlzZXRFZGl0c0VuYWJsZWQoZm91bmRUYXNrQ291bnQpOworCQkJCQkJCQl0dXJuT2ZmID0gdHJ1ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKHRoaXMudGFnc0tpbmQgPT0gdGhpcy5jdXJyZW50VG9rZW4KKwkJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5kaXNhYmxpbmdUYWcsIHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnRQb3NpdGlvbiwgdG9rZW5FbmRQb3NpdGlvbikpIHsKKyAgICAJCQkJCQkJdGhpcy5lZGl0c0VuYWJsZWQgPSBmYWxzZTsKKwkJCQkJCQkJdHVybk9mZiA9IHRydWU7CisJCQkJCSAgICAJfQorCQkJCQkJCWlmICh0dXJuT2ZmKSB7CisJCQkJCQkJCWlmICghdGhpcy5lZGl0c0VuYWJsZWQgJiYgdGhpcy5lZGl0c0luZGV4ID4gMSkgeworCQkJCQkJCQkJT3B0aW1pemVkUmVwbGFjZUVkaXQgY3VycmVudEVkaXQgPSB0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXTsKKwkJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9PSBjdXJyZW50RWRpdC5vZmZzZXQrY3VycmVudEVkaXQubGVuZ3RoKSB7CisJCQkJCQkJCQkJcHJpbnROZXdMaW5lc0JlZm9yZURpc2FibGluZ0NvbW1lbnQoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXByaW50TGluZUNvbW1lbnQoKTsKKwkJCQkJCWlmICh0aGlzLnVzZVRhZ3MgJiYgIXRoaXMuZWRpdHNFbmFibGVkKSB7CisJCQkJCQkJaWYgKGZvdW5kVGFza0NvdW50ID4gMCkgeworCQkJCQkJCQlzZXRFZGl0c0VuYWJsZWQoZm91bmRUYXNrQ291bnQpOworCQkJCQkJCX0gZWxzZSBpZiAodGhpcy50YWdzS2luZCA9PSB0aGlzLmN1cnJlbnRUb2tlbikgeworCSAgICAJCQkJCQl0aGlzLmVkaXRzRW5hYmxlZCA9IENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZW5hYmxpbmdUYWcsIHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRva2VuU3RhcnRQb3NpdGlvbiwgdG9rZW5FbmRQb3NpdGlvbik7CisJCQkJCSAgICAJfQorCQkJCQkJfQogCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFIDoKQEAgLTEzNDQsNjMgKzQ3MDYsMTk4IEBACiAJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdDoKIAkJCQkJCWlmIChoYXNNb2RpZmllcnMpIHsKLQkJCQkJCQl0aGlzLnNwYWNlKCk7CisJCQkJCQkJc3BhY2UoKTsKIAkJCQkJCX0KIAkJCQkJCS8vIHN0ZXAgYmFjayBvbmUgdG9rZW4KIAkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQlyZXR1cm47CQkJCQkKKwkJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgQWJvcnRGb3JtYXR0aW5nKGUpOwogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgcHJpbnROZXdMaW5lKCkgewotCQlpZiAodGhpcy5ubHNUYWdDb3VudGVyID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsYXN0TnVtYmVyT2ZOZXdMaW5lcyA+PSAxKSB7Ci0JCQljb2x1bW4gPSAxOyAvLyBlbnN1cmUgdGhhdCB0aGUgc2NyaWJlIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbGluZQotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZEluc2VydEVkaXQodGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCkgKyAxLCB0aGlzLmxpbmVTZXBhcmF0b3IpOwotCQlsaW5lKys7Ci0JCWxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMTsKLQkJY29sdW1uID0gMTsKLQkJbmVlZFNwYWNlID0gZmFsc2U7Ci0JCXRoaXMucGVuZGluZ1NwYWNlID0gZmFsc2U7CisJCXRoaXMucHJpbnROZXdMaW5lKHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpICsgMSk7CiAJfQogCiAJcHVibGljIHZvaWQgcHJpbnROZXdMaW5lKGludCBpbnNlcnRQb3NpdGlvbikgewogCQlpZiAodGhpcy5ubHNUYWdDb3VudGVyID4gMCkgewogCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChsYXN0TnVtYmVyT2ZOZXdMaW5lcyA+PSAxKSB7Ci0JCQljb2x1bW4gPSAxOyAvLyBlbnN1cmUgdGhhdCB0aGUgc2NyaWJlIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbGluZQorCQlpZiAodGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA+PSAxKSB7CisJCQkvLyBlbnN1cmUgdGhhdCB0aGUgc2NyaWJlIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbGluZQorCQkJLy8gb25seSBpZiBubyBzcGVjaWZpYyBpbmRlbnRhdGlvbiBoYXMgYmVlbiBwcmV2aW91c2x5IHNldAorCQkJaWYgKCF0aGlzLnByZXNlcnZlTGluZUJyZWFrSW5kZW50YXRpb24pIHsKKwkJCQl0aGlzLmNvbHVtbiA9IDE7IAorCQkJfQorCQkJdGhpcy5wcmVzZXJ2ZUxpbmVCcmVha0luZGVudGF0aW9uID0gZmFsc2U7CiAJCQlyZXR1cm47CiAJCX0KIAkJYWRkSW5zZXJ0RWRpdChpbnNlcnRQb3NpdGlvbiwgdGhpcy5saW5lU2VwYXJhdG9yKTsKLQkJbGluZSsrOwotCQlsYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDE7Ci0JCWNvbHVtbiA9IDE7Ci0JCW5lZWRTcGFjZSA9IGZhbHNlOworCQl0aGlzLmxpbmUrKzsKKwkJdGhpcy5sYXN0TnVtYmVyT2ZOZXdMaW5lcyA9IDE7CisJCXRoaXMuY29sdW1uID0gMTsKKwkJdGhpcy5uZWVkU3BhY2UgPSBmYWxzZTsKIAkJdGhpcy5wZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJdGhpcy5wcmVzZXJ2ZUxpbmVCcmVha0luZGVudGF0aW9uID0gZmFsc2U7CisJCXRoaXMubGFzdExpbmVDb21tZW50LmNvbnRpZ3VvdXMgPSBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFByaW50IHRoZSBpbmRlbnRhdGlvbiBvZiBhIGRpc2FibGluZyBjb21tZW50CisJICovCisJcHJpdmF0ZSB2b2lkIHByaW50TmV3TGluZXNCZWZvcmVEaXNhYmxpbmdDb21tZW50KCkgeworCisJCS8vIEdldCB0aGUgYmVnaW5uaW5nIG9mIGNvbW1lbnQgbGluZQorCQlpbnQgbGluZVB0ciA9IEFycmF5cy5iaW5hcnlTZWFyY2godGhpcy5saW5lRW5kcywgdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOworCQlpZiAobGluZVB0ciA8IDApIHsKKwkJCWxpbmVQdHIgPSAtbGluZVB0ciAtIDE7CisJCX0KKwkJaW50IGluZGVudGF0aW9uID0gMDsKKwkJaW50IGJlZ2lubmluZ09mTGluZSA9IGdldExpbmVFbmQobGluZVB0cikrMTsKKwkJaWYgKGJlZ2lubmluZ09mTGluZSA9PSAtMSkgeworCQkJYmVnaW5uaW5nT2ZMaW5lID0gMDsKKwkJfQorCQkKKwkJLy8gSWYgdGhlIGNvbW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGluZSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8KKwkJT3B0aW1pemVkUmVwbGFjZUVkaXQgY3VycmVudEVkaXQgPSB0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXTsKKwkJaW50IG9mZnNldCA9IGN1cnJlbnRFZGl0Lm9mZnNldDsKKwkJaWYgKG9mZnNldCA+PSBiZWdpbm5pbmdPZkxpbmUpIHJldHVybjsKKworCQkvLyBDb21wdXRlIHRoZSBjb21tZW50IGluZGVudGF0aW9uCisJCWludCBzY2FubmVyU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQlpbnQgc2Nhbm5lckVvZlBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uOworCQlpbnQgc2Nhbm5lckN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCWNoYXIgc2Nhbm5lckN1cnJlbnRDaGFyID0gdGhpcy5zY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXI7CisJCWludCBsZW5ndGggPSBjdXJyZW50RWRpdC5sZW5ndGg7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGJlZ2lubmluZ09mTGluZSwgb2Zmc2V0K2xlbmd0aC0xKTsKKwkJdHJ5IHsKKwkJCXdoaWxlICghdGhpcy5zY2FubmVyLmF0RW5kKCkpIHsKKwkJCQljaGFyIGNoID0gKGNoYXIpIHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQkJY2FzZSAnXHQnIDoKKwkJCQkJCWlmICh0aGlzLnRhYkxlbmd0aCAhPSAwKSB7CisJCQkJCQkJaW50IHJlbWluZGVyID0gaW5kZW50YXRpb24gJSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCQlpZiAocmVtaW5kZXIgPT0gMCkgeworCQkJCQkJCQlpbmRlbnRhdGlvbiArPSB0aGlzLnRhYkxlbmd0aDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpbmRlbnRhdGlvbiA9ICgoaW5kZW50YXRpb24gLyB0aGlzLnRhYkxlbmd0aCkgKyAxKSAqIHRoaXMudGFiTGVuZ3RoOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICcgJzoKKwkJCQkJCWluZGVudGF0aW9uKys7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCS8vIFNob3VsZCBub3QgaGFwcGVuIGFzIHRoZSBvZmZzZXQgb2YgdGhlIGVkaXQgaXMgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgbGluZQorCQkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCisJCQkvLyBTcGxpdCB0aGUgZXhpc3RpbmcgZWRpdCB0byBrZWVwIHRoZSBjaGFuZ2UgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3QgbGluZQorCQkJLy8gYnV0IGNoYW5nZSB0aGUgaW5kZW50YXRpb24gYWZ0ZXIuIE5vdGUgdGhhdCBhdCB0aGlzIHN0YWdlLCB0aGUgYWRkKkVkaXQgbWV0aG9kcworCQkJLy8gY2Fubm90IGJlIGxvbmdlciB1c2VkIGFzIHRoZSBlZGl0cyBhcmUgZGlzYWJsZWQKKwkJCVN0cmluZyBpbmRlbnRhdGlvblN0cmluZzsKKwkJCWludCBjdXJyZW50SW5kZW50YXRpb24gPSBnZXRDdXJyZW50SW5kZW50YXRpb24odGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbik7CisJCQlpZiAoY3VycmVudEluZGVudGF0aW9uID4gMCAmJiB0aGlzLmluZGVudGF0aW9uTGV2ZWwgPiAwKSB7CisJCQkJaW50IGNvbCA9IHRoaXMuY29sdW1uOworCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJcHJpbnRJbmRlbnRhdGlvbklmTmVjZXNzYXJ5KHRoaXMudGVtcEJ1ZmZlcik7CisJCQkJaW5kZW50YXRpb25TdHJpbmcgPSB0aGlzLnRlbXBCdWZmZXIudG9TdHJpbmcoKTsKKwkJCQl0aGlzLmNvbHVtbiA9IGNvbDsKKwkJCX0gZWxzZSB7CisJCQkJaW5kZW50YXRpb25TdHJpbmcgPSBVdGlsLkVNUFRZX1NUUklORzsKKwkJCX0KKwkJCVN0cmluZyByZXBsYWNlbWVudCA9IGN1cnJlbnRFZGl0LnJlcGxhY2VtZW50OworCQkJaWYgKHJlcGxhY2VtZW50Lmxlbmd0aCgpID09IDApIHsKKwkJCQkvLyBwcmV2aW91cyBlZGl0IHdhcyBhIGRlbGV0ZSwgYXMgd2UncmUgc3VyZSB0byBoYXZlIGEgbmV3IGxpbmUgYmVmb3JlCisJCQkJLy8gdGhlIGNvbW1lbnQsIHRoZW4gdGhlIGVkaXQgbmVlZHMgdG8gYmUgZWl0aGVyIHJlcGxhY2VkIGVudGlyZWx5IHdpdGgKKwkJCQkvLyB0aGUgZXhwZWN0ZWQgaW5kZW50YXRpb24KKwkJCQl0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXSA9IG5ldyBPcHRpbWl6ZWRSZXBsYWNlRWRpdChiZWdpbm5pbmdPZkxpbmUsIG9mZnNldCtsZW5ndGgtYmVnaW5uaW5nT2ZMaW5lLCBpbmRlbnRhdGlvblN0cmluZyk7CisJCQl9IGVsc2UgeworCQkJCWludCBpZHggPSByZXBsYWNlbWVudC5sYXN0SW5kZXhPZih0aGlzLmxpbmVTZXBhcmF0b3IpOworCQkJCWlmIChpZHggPj0gMCkgeworCQkJCQkvLyByZXBsYWNlIGN1cnJlbnQgZWRpdCBpZiBpdCBjb250YWlucyBhIGxpbmUgc2VwYXJhdG9yCisJCQkJCWludCBzdGFydCA9IGlkeCArIHRoaXMubHNMZW5ndGg7CisJCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJCXRoaXMudGVtcEJ1ZmZlci5hcHBlbmQocmVwbGFjZW1lbnQuc3Vic3RyaW5nKDAsIHN0YXJ0KSk7CisJCQkJCWlmIChpbmRlbnRhdGlvblN0cmluZyAhPSBVdGlsLkVNUFRZX1NUUklORykgeworCQkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZChpbmRlbnRhdGlvblN0cmluZyk7CisJCQkJCX0KKwkJCQkJdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXgtMV0gPSBuZXcgT3B0aW1pemVkUmVwbGFjZUVkaXQob2Zmc2V0LCBsZW5ndGgsIHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZmluYWxseSB7CisJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHNjYW5uZXJTdGFydFBvc2l0aW9uOworCQkJdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uID0gc2Nhbm5lckVvZlBvc2l0aW9uOworCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHNjYW5uZXJDdXJyZW50UG9zaXRpb247CisJCQl0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9IHNjYW5uZXJDdXJyZW50Q2hhcjsKKwkJfQorCX0KKworCS8qCisJICogUHJpbnQgbmV3IGxpbmVzIGNoYXJhY3RlcnMgd2hlbiB0aGUgZWRpdHMgYXJlIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIG9ubHkKKwkgKiB0aGUgbGluZSBzZXBhcmF0b3IgaXMgcmVwbGFjZWQgaWYgbmVjZXNzYXJ5LCB0aGUgb3RoZXIgd2hpdGUgc3BhY2VzIGFyZSB1bnRvdWNoZWQuCisJICovCisJcHJpdmF0ZSBib29sZWFuIHByaW50TmV3TGluZXNDaGFyYWN0ZXJzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJYm9vbGVhbiBmb3VuZE5ld0xpbmUgPSBmYWxzZTsKKwkJaW50IHNjYW5uZXJTdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCWludCBzY2FubmVyRW9mUG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb247CisJCWludCBzY2FubmVyQ3VycmVudFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJY2hhciBzY2FubmVyQ3VycmVudENoYXIgPSB0aGlzLnNjYW5uZXIuY3VycmVudENoYXJhY3RlcjsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8ob2Zmc2V0LCBvZmZzZXQrbGVuZ3RoLTEpOworCQl0cnkgeworCQkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuYXRFbmQoKSkgeworCQkJCWludCBzdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJY2hhciBjaCA9IChjaGFyKSB0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKTsKKwkJCQlib29sZWFuIG5lZWRSZXBsYWNlID0gY2ggIT0gdGhpcy5maXJzdExTOworCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQkJY2FzZSAnXHInOgorCQkJCQkJaWYgKHRoaXMuc2Nhbm5lci5hdEVuZCgpKSBicmVhazsKKwkJCQkJCWNoID0gKGNoYXIpIHRoaXMuc2Nhbm5lci5nZXROZXh0Q2hhcigpOworCQkJCQkJaWYgKGNoICE9ICdcbicpIGJyZWFrOworCQkJCQkJbmVlZFJlcGxhY2UgPSBuZWVkUmVwbGFjZSB8fCB0aGlzLmxzTGVuZ3RoICE9IDI7CisJCQkJCQkvLyRGQUxMLVRIUk9VR0gkCisJCQkJCWNhc2UgJ1xuJzoKKwkJCQkJCWlmIChuZWVkUmVwbGFjZSkgeworCQkJCQkJCWlmICh0aGlzLmVkaXRzSW5kZXggPT0gMCB8fCB0aGlzLmVkaXRzW3RoaXMuZWRpdHNJbmRleC0xXS5vZmZzZXQgIT0gc3RhcnQpIHsKKwkJCQkJCQkJdGhpcy5lZGl0c1t0aGlzLmVkaXRzSW5kZXgrK10gPSBuZXcgT3B0aW1pemVkUmVwbGFjZUVkaXQoc3RhcnQsIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tc3RhcnQsIHRoaXMubGluZVNlcGFyYXRvcik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZm91bmROZXdMaW5lID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlmaW5hbGx5IHsKKwkJCXRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gc2Nhbm5lclN0YXJ0UG9zaXRpb247CisJCQl0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPSBzY2FubmVyRW9mUG9zaXRpb247CisJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gc2Nhbm5lckN1cnJlbnRQb3NpdGlvbjsKKwkJCXRoaXMuc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gc2Nhbm5lckN1cnJlbnRDaGFyOworCQl9CisJCXJldHVybiBmb3VuZE5ld0xpbmU7CQkKIAl9CiAKIAlwdWJsaWMgdm9pZCBwcmludE5leHRUb2tlbihpbnQgZXhwZWN0ZWRUb2tlblR5cGUpewogCQlwcmludE5leHRUb2tlbihleHBlY3RlZFRva2VuVHlwZSwgZmFsc2UpOwogCX0KIAotCXB1YmxpYyB2b2lkIHByaW50TmV4dFRva2VuKGludCBleHBlY3RlZFRva2VuVHlwZSwgYm9vbGVhbiBjb25zaWRlclNwYWNlSWZBbnkpewotCQlwcmludENvbW1lbnQoKTsKKwlwdWJsaWMgdm9pZCBwcmludE5leHRUb2tlbihpbnQgZXhwZWN0ZWRUb2tlblR5cGUsIGJvb2xlYW4gY29uc2lkZXJTcGFjZUlmQW55KSB7CisJCXByaW50TmV4dFRva2VuKGV4cGVjdGVkVG9rZW5UeXBlLCBjb25zaWRlclNwYWNlSWZBbnksIFBSRVNFUlZFX0VNUFRZX0xJTkVTX0tFRVBfTEFTVF9ORVdfTElORVNfSU5ERU5UQVRJT04pOworCX0KKworCXB1YmxpYyB2b2lkIHByaW50TmV4dFRva2VuKGludCBleHBlY3RlZFRva2VuVHlwZSwgYm9vbGVhbiBjb25zaWRlclNwYWNlSWZBbnksIGludCBlbXB0eUxpbmVSdWxlcykgeworCQkvLyBTZXQgYnJhY2UgZmxhZywgaXQncyB1c2VmdWwgZm9yIHRoZSBzY3JpYmUgd2hpbGUgcHJlc2VydmluZyBsaW5lIGJyZWFrcworCQlwcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIE5PX1RSQUlMSU5HX0NPTU1FTlQsIGVtcHR5TGluZVJ1bGVzKTsKIAkJdHJ5IHsKIAkJCXRoaXMuY3VycmVudFRva2VuID0gdGhpcy5zY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSA9IHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpOwogCQkJaWYgKGV4cGVjdGVkVG9rZW5UeXBlICE9IHRoaXMuY3VycmVudFRva2VuKSB7CiAJCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZygidW5leHBlY3RlZCB0b2tlbiB0eXBlLCBleHBlY3Rpbmc6IitleHBlY3RlZFRva2VuVHlwZSsiLCBhY3R1YWw6Iit0aGlzLmN1cnJlbnRUb2tlbik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJCX0KLQkJCXRoaXMucHJpbnQoY3VycmVudFRva2VuU291cmNlLCBjb25zaWRlclNwYWNlSWZBbnkpOworCQkJcHJpbnQodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBjb25zaWRlclNwYWNlSWZBbnkpOwogCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZyhlKTsKIAkJfQpAQCAtMTQxMSwxMCArNDkwOCw5IEBACiAJfQogCiAJcHVibGljIHZvaWQgcHJpbnROZXh0VG9rZW4oaW50W10gZXhwZWN0ZWRUb2tlblR5cGVzLCBib29sZWFuIGNvbnNpZGVyU3BhY2VJZkFueSl7Ci0JCXByaW50Q29tbWVudCgpOworCQlwcmludENvbW1lbnQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIE5PX1RSQUlMSU5HX0NPTU1FTlQpOwogCQl0cnkgewogCQkJdGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQljaGFyW10gY3VycmVudFRva2VuU291cmNlID0gdGhpcy5zY2FubmVyLmdldFJhd1Rva2VuU291cmNlKCk7CiAJCQlpZiAoQXJyYXlzLmJpbmFyeVNlYXJjaChleHBlY3RlZFRva2VuVHlwZXMsIHRoaXMuY3VycmVudFRva2VuKSA8IDApIHsKIAkJCQlTdHJpbmdCdWZmZXIgZXhwZWN0YXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcig1KTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5UeXBlcy5sZW5ndGg7IGkrKyl7CkBAIC0xNDIyLDEwICs0OTE4LDEwIEBACiAJCQkJCQlleHBlY3RhdGlvbnMuYXBwZW5kKCcsJyk7CiAJCQkJCX0KIAkJCQkJZXhwZWN0YXRpb25zLmFwcGVuZChleHBlY3RlZFRva2VuVHlwZXNbaV0pOwotCQkJCX0JCQkJCisJCQkJfQogCQkJCXRocm93IG5ldyBBYm9ydEZvcm1hdHRpbmcoInVuZXhwZWN0ZWQgdG9rZW4gdHlwZSwgZXhwZWN0aW5nOlsiK2V4cGVjdGF0aW9ucy50b1N0cmluZygpKyJdLCBhY3R1YWw6Iit0aGlzLmN1cnJlbnRUb2tlbik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJCX0KLQkJCXRoaXMucHJpbnQoY3VycmVudFRva2VuU291cmNlLCBjb25zaWRlclNwYWNlSWZBbnkpOworCQkJcHJpbnQodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBjb25zaWRlclNwYWNlSWZBbnkpOwogCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZyhlKTsKIAkJfQpAQCAtMTQzNiw3ICs0OTMyLDcgQEAKIAkJaW50IG51bWJlck9mSWRlbnRpZmllcnMgPSAwOwogCQl0cnkgewogCQkJZG8gewotCQkJCXRoaXMucHJpbnRDb21tZW50KCk7CisJCQkJcHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBOT19UUkFJTElOR19DT01NRU5UKTsKIAkJCQlzd2l0Y2godGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YgOgogCQkJCQkJcmV0dXJuOwpAQCAtMTQ0NiwyNSArNDk0MiwyOCBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoKLQkJCQkJCXRoaXMucHJpbnRCbG9ja0NvbW1lbnQodGhpcy5zY2FubmVyLmdldFJhd1Rva2VuU291cmNlKCksIGZhbHNlKTsKKwkJCQkJCXByaW50QmxvY2tDb21tZW50KGZhbHNlKTsKIAkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FIDoKLQkJCQkJCXRoaXMucHJpbnRMaW5lQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQlwcmludExpbmVDb21tZW50KCk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgOgotCQkJCQkJdGhpcy5wcmludCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSwgZmFsc2UpOworCQkJCQkJcHJpbnQodGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBmYWxzZSk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWlmICgrKyBudW1iZXJPZklkZW50aWZpZXJzID09IG51bWJlck9mVG9rZW5zKSB7CiAJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKIAkJCQkJCQlyZXR1cm47CiAJCQkJCQl9Ci0JCQkJCQlicmVhazsJCQkJCQkKKwkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCA6Ci0JCQkJCQl0aGlzLnByaW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpLCBmYWxzZSk7CisJCQkJCQlwcmludCh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIGZhbHNlKTsKIAkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOOgorCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlLi4uCiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOwogCQkJCQkJcmV0dXJuOwpAQCAtMTQ3NSwxMSArNDk3NCwxMSBAQAogCQl9CiAJfQogCi0JcHVibGljIHZvaWQgcHJpbnRRdWFsaWZpZWRSZWZlcmVuY2UoaW50IHNvdXJjZUVuZCkgeworCXB1YmxpYyB2b2lkIHByaW50UXVhbGlmaWVkUmVmZXJlbmNlKGludCBzb3VyY2VFbmQsIGJvb2xlYW4gZXhwZWN0UGFyZW50aGVzaXMpIHsKIAkJaW50IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQl0cnkgewogCQkJZG8gewotCQkJCXRoaXMucHJpbnRDb21tZW50KCk7CisJCQkJcHJpbnRDb21tZW50KENvZGVGb3JtYXR0ZXIuS19VTktOT1dOLCBOT19UUkFJTElOR19DT01NRU5UKTsKIAkJCQlzd2l0Y2godGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKIAkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YgOgogCQkJCQkJcmV0dXJuOwpAQCAtMTQ4OSwxOCArNDk4OCwyMyBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoKLQkJCQkJCXRoaXMucHJpbnRCbG9ja0NvbW1lbnQodGhpcy5zY2FubmVyLmdldFJhd1Rva2VuU291cmNlKCksIGZhbHNlKTsKKwkJCQkJCXByaW50QmxvY2tDb21tZW50KGZhbHNlKTsKIAkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FIDoKLQkJCQkJCXRoaXMucHJpbnRMaW5lQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQlwcmludExpbmVDb21tZW50KCk7CiAJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgOgogCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCA6Ci0JCQkJCQl0aGlzLnByaW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpLCBmYWxzZSk7CisJCQkJCQlwcmludCh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIGZhbHNlKTsKIAkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOOgorCQkJCQkJaWYgKGV4cGVjdFBhcmVudGhlc2lzKSB7CisJCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlLi4uCiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOwogCQkJCQkJcmV0dXJuOwpAQCAtMTUxMiwxNjUgKzUwMTYsMTkgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgcHJpbnRSdWxlKFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIpIHsKKwkJLy8gb25seSBjYWxsZWQgaWYgdGhpcy50YWJMZW5ndGggPiAwCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYWdlV2lkdGg7IGkrKyl7Ci0JCQlpZiAoKGkgJSB0aGlzLnRhYkxlbmd0aCkgPT0gMCkgeyAKKwkJCWlmICgoaSAlIHRoaXMudGFiTGVuZ3RoKSA9PSAwKSB7CiAJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnKycpOwogCQkJfSBlbHNlIHsKIAkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCctJyk7CiAJCQl9CiAJCX0KIAkJc3RyaW5nQnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAocGFnZVdpZHRoIC8gdGFiTGVuZ3RoKTsgaSsrKSB7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAodGhpcy5wYWdlV2lkdGggLyB0aGlzLnRhYkxlbmd0aCk7IGkrKykgewogCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChpKTsKIAkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ1x0Jyk7Ci0JCX0JCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRyYWlsaW5nQ29tbWVudChpbnQgbnVtYmVyT2ZOZXdMaW5lc1RvSW5zZXJ0KSB7Ci0JCXRyeSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgc3BhY2UgYmV0d2VlbiB0d28gdG9rZW5zIHdlIGVuc3VyZSBpdCB3aWxsIGJlIGR1bXBlZCBpbiB0aGUgZm9ybWF0dGVkIHN0cmluZwotCQkJaW50IGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJYm9vbGVhbiBoYXNXaGl0ZXNwYWNlcyA9IGZhbHNlOwotCQkJYm9vbGVhbiBoYXNMaW5lQ29tbWVudCA9IGZhbHNlOwotCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7Ci0JCQkJc3dpdGNoKHRoaXMuY3VycmVudFRva2VuKSB7Ci0JCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSA6Ci0JCQkJCQlpbnQgY291bnQgPSAwOwotCQkJCQkJY2hhcltdIHdoaXRlU3BhY2VzID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHdoaXRlU3BhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQkJc3dpdGNoKHdoaXRlU3BhY2VzW2ldKSB7Ci0JCQkJCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCQkJCQlpZiAoKGkgKyAxKSA8IG1heCkgewotCQkJCQkJCQkJCWlmICh3aGl0ZVNwYWNlc1tpICsgMV0gPT0gJ1xuJykgewotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY291bnQrKzsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlICdcbicgOgotCQkJCQkJCQkJY291bnQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaGFzTGluZUNvbW1lbnQpIHsKLQkJCQkJCQlpZiAoY291bnQgPj0gMSkgewotCQkJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKLQkJCQkJCQkJdGhpcy5wcmVzZXJ2ZUVtcHR5TGluZXMobnVtYmVyT2ZOZXdMaW5lc1RvSW5zZXJ0LCBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKTsKLQkJCQkJCQkJYWRkRGVsZXRlRWRpdChjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7Ci0JCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChjb3VudCA+IDEpIHsKLQkJCQkJCQl0aGlzLnByaW50RW1wdHlMaW5lcyhudW1iZXJPZk5ld0xpbmVzVG9JbnNlcnQsIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCkpOwotCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQloYXNXaGl0ZXNwYWNlcyA9IHRydWU7Ci0JCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CQkJCQkJCi0JCQkJCQkJYWRkRGVsZXRlRWRpdCh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOgotCQkJCQkJaWYgKGhhc1doaXRlc3BhY2VzKSB7Ci0JCQkJCQkJc3BhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCXRoaXMucHJpbnRMaW5lQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSk7Ci0JCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQkJCWhhc0xpbmVDb21tZW50ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgotCQkJCQkJaWYgKGhhc1doaXRlc3BhY2VzKSB7Ci0JCQkJCQkJc3BhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCXRoaXMucHJpbnRCbG9ja0NvbW1lbnQodGhpcy5zY2FubmVyLmdldFJhd1Rva2VuU291cmNlKCksIGZhbHNlKTsKLQkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJLy8gc3RlcCBiYWNrIG9uZSB0b2tlbgotCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQWJvcnRGb3JtYXR0aW5nKGUpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHByaW50VHJhaWxpbmdDb21tZW50KCkgewotCQl0cnkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIHNwYWNlIGJldHdlZW4gdHdvIHRva2VucyB3ZSBlbnN1cmUgaXQgd2lsbCBiZSBkdW1wZWQgaW4gdGhlIGZvcm1hdHRlZCBzdHJpbmcKLQkJCWludCBjdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCWJvb2xlYW4gaGFzV2hpdGVzcGFjZXMgPSBmYWxzZTsKLQkJCWJvb2xlYW4gaGFzQ29tbWVudCA9IGZhbHNlOwotCQkJYm9vbGVhbiBoYXNMaW5lQ29tbWVudCA9IGZhbHNlOwotCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMuc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7Ci0JCQkJc3dpdGNoKHRoaXMuY3VycmVudFRva2VuKSB7Ci0JCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRSA6Ci0JCQkJCQlpbnQgY291bnQgPSAwOwotCQkJCQkJY2hhcltdIHdoaXRlU3BhY2VzID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHdoaXRlU3BhY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQkJc3dpdGNoKHdoaXRlU3BhY2VzW2ldKSB7Ci0JCQkJCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCQkJCQlpZiAoKGkgKyAxKSA8IG1heCkgewotCQkJCQkJCQkJCWlmICh3aGl0ZVNwYWNlc1tpICsgMV0gPT0gJ1xuJykgewotCQkJCQkJCQkJCQlpKys7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY291bnQrKzsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlICdcbicgOgotCQkJCQkJCQkJY291bnQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaGFzTGluZUNvbW1lbnQpIHsKLQkJCQkJCQlpZiAoY291bnQgPj0gMSkgewotCQkJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKLQkJCQkJCQkJdGhpcy5wcmVzZXJ2ZUVtcHR5TGluZXMoY291bnQsIGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24pOwotCQkJCQkJCQlhZGREZWxldGVFZGl0KGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpKTsKLQkJCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGNvdW50ID49IDEpIHsKLQkJCQkJCQlpZiAoaGFzQ29tbWVudCkgewotCQkJCQkJCQl0aGlzLnByaW50TmV3TGluZSh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGhpcy5zY2FubmVyLnJlc2V0VG8oY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiwgdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gLSAxKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWhhc1doaXRlc3BhY2VzID0gdHJ1ZTsKLQkJCQkJCQljdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCQkJCQkKLQkJCQkJCQlhZGREZWxldGVFZGl0KHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCksIHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfTElORSA6Ci0JCQkJCQlpZiAoaGFzV2hpdGVzcGFjZXMpIHsKLQkJCQkJCQlzcGFjZSgpOwotCQkJCQkJfQotCQkJCQkJdGhpcy5wcmludExpbmVDb21tZW50KHRoaXMuc2Nhbm5lci5nZXRSYXdUb2tlblNvdXJjZSgpKTsKLQkJCQkJCWN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24gPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJaGFzTGluZUNvbW1lbnQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSyA6Ci0JCQkJCQlpZiAoaGFzV2hpdGVzcGFjZXMpIHsKLQkJCQkJCQlzcGFjZSgpOwotCQkJCQkJfQotCQkJCQkJdGhpcy5wcmludEJsb2NrQ29tbWVudCh0aGlzLnNjYW5uZXIuZ2V0UmF3VG9rZW5Tb3VyY2UoKSwgZmFsc2UpOwotCQkJCQkJY3VycmVudFRva2VuU3RhcnRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQloYXNDb21tZW50ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCS8vIHN0ZXAgYmFjayBvbmUgdG9rZW4KLQkJCQkJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24sIHRoaXMuc2Nhbm5lckVuZFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEFib3J0Rm9ybWF0dGluZyhlKTsKIAkJfQogCX0KIApAQCAtMTY3OSwxOCArNTAzNywxOCBAQAogCQkJZS5yZWxhdGl2ZURlcHRoLS07IC8vIHJlY29yZCBmYWN0IHRoYXQgY3VycmVudCBjb250ZXh0IGdvdCB0cmF2ZXJzZWQKIAkJCXRoaXMuY3VycmVudEFsaWdubWVudCA9IHRoaXMuY3VycmVudEFsaWdubWVudC5lbmNsb3Npbmc7IC8vIHBvcCBjdXJyZW50TG9jYXRpb24KIAkJCXRocm93IGU7IC8vIHJldGhyb3cKLQkJfSAKKwkJfQogCQkvLyByZXNldCBzY3JpYmUvc2Nhbm5lciB0byByZXN0YXJ0IGF0IHRoaXMgZ2l2ZW4gbG9jYXRpb24KLQkJdGhpcy5yZXNldEF0KHRoaXMuY3VycmVudEFsaWdubWVudC5sb2NhdGlvbik7Ci0JCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMuY3VycmVudEFsaWdubWVudC5sb2NhdGlvbi5pbnB1dE9mZnNldCwgdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uKTsKKwkJcmVzZXRBdCh0aGlzLmN1cnJlbnRBbGlnbm1lbnQubG9jYXRpb24pOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbyh0aGlzLmN1cnJlbnRBbGlnbm1lbnQubG9jYXRpb24uaW5wdXRPZmZzZXQsIHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiAtIDEpOwogCQkvLyBjbGVhbiBhbGlnbm1lbnQgY2h1bmtLaW5kIHNvIGl0IHdpbGwgdGhpbmsgaXQgaXMgYSBuZXcgY2h1bmsgYWdhaW4KIAkJdGhpcy5jdXJyZW50QWxpZ25tZW50LmNodW5rS2luZCA9IDA7CiAJfQogCiAJdm9pZCByZWRvTWVtYmVyQWxpZ25tZW50KEFsaWdubWVudEV4Y2VwdGlvbiBlKXsKIAkJLy8gcmVzZXQgc2NyaWJlL3NjYW5uZXIgdG8gcmVzdGFydCBhdCB0aGlzIGdpdmVuIGxvY2F0aW9uCi0JCXRoaXMucmVzZXRBdCh0aGlzLm1lbWJlckFsaWdubWVudC5sb2NhdGlvbik7Ci0JCXRoaXMuc2Nhbm5lci5yZXNldFRvKHRoaXMubWVtYmVyQWxpZ25tZW50LmxvY2F0aW9uLmlucHV0T2Zmc2V0LCB0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24pOworCQlyZXNldEF0KHRoaXMubWVtYmVyQWxpZ25tZW50LmxvY2F0aW9uKTsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8odGhpcy5tZW1iZXJBbGlnbm1lbnQubG9jYXRpb24uaW5wdXRPZmZzZXQsIHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiAtIDEpOwogCQkvLyBjbGVhbiBhbGlnbm1lbnQgY2h1bmtLaW5kIHNvIGl0IHdpbGwgdGhpbmsgaXQgaXMgYSBuZXcgY2h1bmsgYWdhaW4KIAkJdGhpcy5tZW1iZXJBbGlnbm1lbnQuY2h1bmtLaW5kID0gMDsKIAl9CkBAIC0xNzAyLDcgKzUwNjAsNyBAQAogCQl0aGlzLmVkaXRzSW5kZXggPSAwOwogCQl0aGlzLm5sc1RhZ0NvdW50ZXIgPSAwOwogCX0KLQkJCisKIAlwcml2YXRlIHZvaWQgcmVzZXRBdChMb2NhdGlvbiBsb2NhdGlvbikgewogCQl0aGlzLmxpbmUgPSBsb2NhdGlvbi5vdXRwdXRMaW5lOwogCQl0aGlzLmNvbHVtbiA9IGxvY2F0aW9uLm91dHB1dENvbHVtbjsKQEAgLTE3MTksMTYgKzUwNzcsODAgQEAKIAkJdGhpcy5mb3JtYXR0ZXIubGFzdExvY2FsRGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGxvY2F0aW9uLmxhc3RMb2NhbERlY2xhcmF0aW9uU291cmNlU3RhcnQ7CiAJfQogCisJLyoqCisJICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdFNvdXJjZQorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0U2Nhbm5lcihjaGFyW10gY29tcGlsYXRpb25Vbml0U291cmNlKSB7CisJCXRoaXMuc2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0U291cmNlKTsKKwkJdGhpcy5zY2FubmVyRW5kUG9zaXRpb24gPSBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbygwLCB0aGlzLnNjYW5uZXJFbmRQb3NpdGlvbiAtIDEpOworCQl0aGlzLmVkaXRzID0gbmV3IE9wdGltaXplZFJlcGxhY2VFZGl0W0lOSVRJQUxfU0laRV07CisJCXRoaXMubWF4TGluZXMgPSB0aGlzLmxpbmVFbmRzID09IG51bGwgPyAtMSA6IHRoaXMubGluZUVuZHMubGVuZ3RoIC0gMTsKKwkJdGhpcy5zY2FubmVyLmxpbmVFbmRzID0gdGhpcy5saW5lRW5kczsKKwkJdGhpcy5zY2FubmVyLmxpbmVQdHIgPSB0aGlzLm1heExpbmVzOworCQlpbml0Rm9ybWF0dGVyQ29tbWVudFBhcnNlcigpOworCX0KKwogCXByaXZhdGUgdm9pZCByZXNpemUoKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lZGl0cywgMCwgKHRoaXMuZWRpdHMgPSBuZXcgT3B0aW1pemVkUmVwbGFjZUVkaXRbdGhpcy5lZGl0c0luZGV4ICogMl0pLCAwLCB0aGlzLmVkaXRzSW5kZXgpOwogCX0KIAorCXByaXZhdGUgdm9pZCBzZXRDb21tZW50SW5kZW50YXRpb24oaW50IGNvbW1lbnRJbmRlbnRhdGlvbkxldmVsKSB7CisJCWlmIChjb21tZW50SW5kZW50YXRpb25MZXZlbCA9PSAwKSB7CisJCSAgICB0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiA9IG51bGw7CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gQ09NTUVOVF9JTkRFTlRBVElPTlMubGVuZ3RoOworCQkJaWYgKGNvbW1lbnRJbmRlbnRhdGlvbkxldmVsID4gbGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShDT01NRU5UX0lOREVOVEFUSU9OUywgMCwgQ09NTUVOVF9JTkRFTlRBVElPTlMgPSBuZXcgU3RyaW5nW2NvbW1lbnRJbmRlbnRhdGlvbkxldmVsKzEwXSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMuY29tbWVudEluZGVudGF0aW9uID0gQ09NTUVOVF9JTkRFTlRBVElPTlNbY29tbWVudEluZGVudGF0aW9uTGV2ZWwtMV07CisJCQlpZiAodGhpcy5jb21tZW50SW5kZW50YXRpb24gPT0gbnVsbCkgeworCQkJCXRoaXMudGVtcEJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJZm9yIChpbnQgaT0wOyBpPGNvbW1lbnRJbmRlbnRhdGlvbkxldmVsOyBpKyspIHsKKwkJCQkJdGhpcy50ZW1wQnVmZmVyLmFwcGVuZCgnICcpOworCQkJCX0KKwkJCQl0aGlzLmNvbW1lbnRJbmRlbnRhdGlvbiA9IHRoaXMudGVtcEJ1ZmZlci50b1N0cmluZygpOworCQkJCUNPTU1FTlRfSU5ERU5UQVRJT05TW2NvbW1lbnRJbmRlbnRhdGlvbkxldmVsLTFdID0gdGhpcy5jb21tZW50SW5kZW50YXRpb247CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIExvb2sgZm9yIHRoZSB0YWdzIGlkZW50aWZpZWQgYnkgdGhlIHNjYW5uZXIgdG8gc2VlIHdoZXRoZXIgc29tZSBvZiB0aGVtCisJICogbWF5IGNoYW5nZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0aW9uIGZvciB0aGUgZm9ybWF0dGVyLgorCSAqIERvIG5vdCByZXR1cm4gYXMgc29vbiBhcyBhIG1hdGNoIGlzIGZvdW5kLCBhcyB0aGVyZSBtYXkgaGF2ZSBzZXZlcmFsCisJICogZGlzYWJsaW5nL2VuYWJsaW5nIHRhZ3MgaW4gYSBjb21tZW50LCBoZW5jZSB0aGUgbGFzdCBvbmUgd2lsbCBiZSB0aGUgb25lIHJlYWxseQorCSAqIGNoYW5naW5nIHRoZSBmb3JtYXR0ZXIgYmVoYXZpb3IuLi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0RWRpdHNFbmFibGVkKGludCBjb3VudCkgeworCQlmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgeworCQkJaWYgKHRoaXMuZGlzYWJsaW5nVGFnICE9IG51bGwgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5zY2FubmVyLmZvdW5kVGFza1RhZ3NbaV0sIHRoaXMuZGlzYWJsaW5nVGFnKSkgeworCQkJCXRoaXMuZWRpdHNFbmFibGVkID0gZmFsc2U7CisJCQl9CisJCQlpZiAodGhpcy5lbmFibGluZ1RhZyAhPSBudWxsICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2Nhbm5lci5mb3VuZFRhc2tUYWdzW2ldLCB0aGlzLmVuYWJsaW5nVGFnKSkgeworCQkJCXRoaXMuZWRpdHNFbmFibGVkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgc2V0SW5jbHVkZUNvbW1lbnRzKGJvb2xlYW4gb24pIHsKKwkJaWYgKG9uKSB7CisJCQl0aGlzLmZvcm1hdENvbW1lbnRzIHw9IENvZGVGb3JtYXR0ZXIuRl9JTkNMVURFX0NPTU1FTlRTOworCQl9IGVsc2UgeworCQkJdGhpcy5mb3JtYXRDb21tZW50cyAmPSB+Q29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVFM7CisJCX0KKwl9CisKKwl2b2lkIHNldEhlYWRlckNvbW1lbnQoaW50IHBvc2l0aW9uKSB7CisJCXRoaXMuaGVhZGVyRW5kUG9zaXRpb24gPSBwb3NpdGlvbjsKKwl9CisKIAlwdWJsaWMgdm9pZCBzcGFjZSgpIHsKIAkJaWYgKCF0aGlzLm5lZWRTcGFjZSkgcmV0dXJuOwogCQl0aGlzLmxhc3ROdW1iZXJPZk5ld0xpbmVzID0gMDsKIAkJdGhpcy5wZW5kaW5nU3BhY2UgPSB0cnVlOwogCQl0aGlzLmNvbHVtbisrOwotCQl0aGlzLm5lZWRTcGFjZSA9IGZhbHNlOwkJCisJCXRoaXMubmVlZFNwYWNlID0gZmFsc2U7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTE3NTQsMTAgKzUxNzYsMTIgQEAKIAkJCS5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKQogCQkJLmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCS8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQodGhpcy5saW5lU2VwYXJhdG9yKTsKLQkJcHJpbnRSdWxlKHN0cmluZ0J1ZmZlcik7CisJCWlmICh0aGlzLnRhYkxlbmd0aCA+IDApIHsKKwkJCXByaW50UnVsZShzdHJpbmdCdWZmZXIpOworCQl9CiAJCXJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB1bkluZGVudCgpIHsKIAkJdGhpcy5pbmRlbnRhdGlvbkxldmVsIC09IHRoaXMuaW5kZW50YXRpb25TaXplOwogCQl0aGlzLm51bWJlck9mSW5kZW50YXRpb25zLS07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9hbGlnbi9BbGlnbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2FsaWduL0FsaWdubWVudC5qYXZhCmluZGV4IDgxZDU1OTcuLjY5MTdlNDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2FsaWduL0FsaWdubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2FsaWduL0FsaWdubWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDI1ICsxMCw4NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuYWxpZ247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuTG9jYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5TY3JpYmU7CiAKIC8qKgogICogQWxpZ25tZW50IG1hbmFnZW1lbnQKLSAqIAorICoKICAqIEBzaW5jZSAyLjEKICAqLwogcHVibGljIGNsYXNzIEFsaWdubWVudCB7CiAKKwkvLyBLaW5kIG9mIGFsaWdubWVudAorCXB1YmxpYyBpbnQga2luZDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ0FUSU9OID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX01FTUJFUlNfVkFMVUVfUEFJUlMgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZX0lOSVRJQUxJWkVSID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJR05NRU5UID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5BUllfRVhQUkVTU0lPTiA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FESU5HX01FU1NBR0VfU0VORCA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFDVF9JRiA9IDc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9VTkRfQVNTSUdOTUVOVCA9IDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9DT05TVEFOVFMgPSAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNX0NPTlNUQU5UU19BUkdVTUVOVFMgPSAxMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVF9DT05TVFJVQ1RPUl9DQUxMID0gMTI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfREVDTEFSQVRJT05fQVNTSUdOTUVOVCA9IDEzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0RFQ0xBUkFUSU9OX0FTU0lHTk1FTlQgPSAxNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0FSR1VNRU5UUyA9IDE1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VORCA9IDE2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BUkdVTUVOVFMgPSAxNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfREVDTEFSQVRJT04gPSAxODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVUxUSVBMRV9GSUVMRCA9IDE5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSX0NMQVNTID0gMjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVJfSU5URVJGQUNFUyA9IDIxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUk9XUyA9IDIyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUVNQkVSUyA9IDIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19DT05DQVRFTkFUSU9OID0gMjQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJZX1JFU09VUkNFUyA9IDI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1VTFRJX0NBVENIID0gMjY7CisKIAkvLyBuYW1lIG9mIGFsaWdubWVudAogCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5BTUVTID0geworCQkiIiwgLy8kTk9OLU5MUy0xJAorCQkiYWxsb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKKwkJImFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXJzIiwgLy8kTk9OLU5MUy0xJAorCQkiYXJyYXlfaW5pdGlhbGl6ZXIiLCAvLyROT04tTkxTLTEkCisJCSJhc3NpZ25tZW50QWxpZ25tZW50IiwgLy8kTk9OLU5MUy0xJAorCQkiYmluYXJ5RXhwcmVzc2lvbkFsaWdubWVudCIsIC8vJE5PTi1OTFMtMSQKKwkJImNhc2NhZGluZ01lc3NhZ2VTZW5kQWxpZ25tZW50IiwgLy8kTk9OLU5MUy0xJAorCQkiY29tcGFjdElmIiwgLy8kTk9OLU5MUy0xJAorCQkiY29tcG91bmRBc3NpZ25tZW50QWxpZ25tZW50IiwgLy8kTk9OLU5MUy0xJAorCQkiY29uZGl0aW9uYWxFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorCQkiZW51bUNvbnN0YW50cyIsIC8vJE5PTi1OTFMtMSQKKwkJImVudW1Db25zdGFudEFyZ3VtZW50cyIsIC8vJE5PTi1OTFMtMSQKKwkJImV4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiLCAvLyROT04tTkxTLTEkCisJCSJmaWVsZERlY2xhcmF0aW9uQXNzaWdubWVudEFsaWdubWVudCIsIC8vJE5PTi1OTFMtMSQKKwkJImxvY2FsRGVjbGFyYXRpb25Bc3NpZ25tZW50QWxpZ25tZW50IiwgLy8kTk9OLU5MUy0xJAorCQkibWVzc2FnZUFyZ3VtZW50cyIsIC8vJE5PTi1OTFMtMSQKKwkJIm1lc3NhZ2VBbGlnbm1lbnQiLCAvLyROT04tTkxTLTEkCisJCSJtZXRob2RBcmd1bWVudHMiLCAvLyROT04tTkxTLTEkCisJCSJtZXRob2REZWNsYXJhdGlvbiIsIC8vJE5PTi1OTFMtMSQKKwkJIm11bHRpcGxlX2ZpZWxkIiwgLy8kTk9OLU5MUy0xJAorCQkic3VwZXJjbGFzcyIsIC8vJE5PTi1OTFMtMSQKKwkJInN1cGVySW50ZXJmYWNlcyIsIC8vJE5PTi1OTFMtMSQKKwkJInRocm93cyIsIC8vJE5PTi1OTFMtMSQKKwkJInR5cGVNZW1iZXJzIiwgLy8kTk9OLU5MUy0xJAorCQkic3RyaW5nQ29uY2F0ZW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQKKwkJInRyeVJlc291cmNlcyIsIC8vJE5PTi1OTFMtMSQKKwkJInVuaW9uVHlwZUluTXVsdGljYXRjaCIsIC8vJE5PTi1OTFMtMSQKKwl9OworCiAJLy8gbGluayB0byBlbmNsb3NpbmcgYWxpZ25tZW50CiAJcHVibGljIEFsaWdubWVudCBlbmNsb3Npbmc7Ci0JIAorCiAJLy8gc3RhcnQgbG9jYXRpb24gb2YgdGhpcyBhbGlnbm1lbnQKIAlwdWJsaWMgTG9jYXRpb24gbG9jYXRpb247Ci0JCisKIAkvLyBpbmRlbnRhdGlvbiBtYW5hZ2VtZW50CiAJcHVibGljIGludCBmcmFnbWVudEluZGV4OwogCXB1YmxpYyBpbnQgZnJhZ21lbnRDb3VudDsKQEAgLTM5LDE2ICs5OCwyMSBAQAogCXB1YmxpYyBpbnQgY2h1bmtTdGFydEluZGV4OwogCXB1YmxpYyBpbnQgY2h1bmtLaW5kOwogCi0JLy8gYnJlYWsgbWFuYWdlbWVudAkKKwkvLyBicmVhayBtYW5hZ2VtZW50CiAJcHVibGljIGludCBvcmlnaW5hbEluZGVudGF0aW9uTGV2ZWw7CiAJcHVibGljIGludCBicmVha0luZGVudGF0aW9uTGV2ZWw7CiAJcHVibGljIGludCBzaGlmdEJyZWFrSW5kZW50YXRpb25MZXZlbDsKIAlwdWJsaWMgaW50W10gZnJhZ21lbnRCcmVha3M7CiAJcHVibGljIGJvb2xlYW4gd2FzU3BsaXQ7CisJcHVibGljIGJvb2xlYW4gYmxvY2tBbGlnbiA9IGZhbHNlOworCXB1YmxpYyBib29sZWFuIHRvb0xvbmcgPSBmYWxzZTsKIAogCXB1YmxpYyBTY3JpYmUgc2NyaWJlOwotCQotCS8qIAorCisJLy8gcmVzZXQKKwlwcml2YXRlIGJvb2xlYW4gcmVzZXQgPSBmYWxzZTsKKworCS8qCiAJICogQWxpZ25tZW50IG1vZGVzCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9GT1JDRSA9IDE7IC8vIGlmIGJpdCBzZXQsIHRoZW4gYWxpZ25tZW50IHdpbGwgYmUgbm9uLW9wdGlvbmFsIChkZWZhdWx0IGlzIG9wdGlvbmFsKQpAQCAtNTYsNyArMTIwLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludAlNX0lOREVOVF9CWV9PTkUgPSA0OyAvLyBpZiBiaXQgc2V0LCBicm9rZW4gZnJhZ21lbnRzIHdpbGwgYmUgaW5kZW50ZWQgb25lIGxldmVsIGJlbG93IGN1cnJlbnQgKG5vdCB1c2luZyBjb250aW51YXRpb24gaW5kZW50YXRpb24pCiAKIAkvLyBzcGxpdCBtb2RlcyBjYW4gYmUgY29tYmluZWQgZWl0aGVyIHdpdGggTV9GT1JDRSBvciBNX0lOREVOVF9PTl9DT0xVTU4KLQkKKwogCS8qKiBmb29iYXIoI2ZyYWdtZW50MSwgI2ZyYWdtZW50MiwgPHVsPgogCSAqICA8bGk+ICAgICNmcmFnbWVudDMsICNmcmFnbWVudDQgPC9saT4KIAkgKiA8L3VsPgpAQCAtNzksMTQgKzE0MywxNCBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fT05FX1BFUl9MSU5FX1NQTElUID0gMzIrMTY7IC8vIG9uZSBmcmFnbWVudCBwZXIgbGluZQogCi0JLyoqIAorCS8qKgogCSAqIGZvb2Jhcig8dWw+CiAJICogPGxpPiAgICAgI2ZyYWdtZW50MSwgIDwvbGk+CiAJICogPGxpPiAgICAgICAgI2ZyYWdtZW50MiwgIDwvbGk+CiAJICogPGxpPiAgICAgICAgI2ZyYWdtZW50MyA8L2xpPgogCSAqIDxsaT4gICAgICAgICNmcmFnbWVudDQsICA8L2xpPgogCSAqIDwvdWw+Ci0JICovIAorCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fTkVYVF9TSElGVEVEX1NQTElUID0gNjQ7IC8vIG9uZSBmcmFnbWVudCBwZXIgbGluZSwgc3Vic2VxdWVudCBhcmUgaW5kZW50ZWQgZnVydGhlcgogCiAJLyoqIGZvb2JhcigjZnJhZ21lbnQxLCA8dWw+CkBAIC05OSw5ICsxNjMsOSBAQAogCiAJLy82NCszMgogCS8vNjQrMzIrMTYKLQkKKwogCS8vIG1vZGUgY29udHJvbGxpbmcgY29sdW1uIGFsaWdubWVudHMKLQkvKiogCisJLyoqCiAJICogPHRhYmxlIEJPUkRFUiBDT0xTPTQgV0lEVEg9IjEwMCUiID4KIAkgKiA8dHI+PHRkPiNmcmFnbWVudDFBPC90ZD4gICAgICAgICAgICA8dGQ+I2ZyYWdtZW50MkE8L3RkPiAgICAgICA8dGQ+I2ZyYWdtZW50M0E8L3RkPiAgPHRkPiN2ZXJ5LWxvbmctZnJhZ21lbnQ0QTwvdGQ+PC90cj4KIAkgKiA8dHI+PHRkPiNmcmFnbWVudDFCPC90ZD4gICAgICAgICAgICA8dGQ+I2xvbmctZnJhZ21lbnQyQjwvdGQ+ICA8dGQ+I2ZyYWdtZW50M0I8L3RkPiAgPHRkPiNmcmFnbWVudDRCPC90ZD48L3RyPgpAQCAtMTA5LDIyICsxNzMsMjMgQEAKIAkgKiA8L3RhYmxlPgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fTVVMVElDT0xVTU4gPSAyNTY7IC8vIGZyYWdtZW50cyBhcmUgb24gc2FtZSBsaW5lLCBidXQgbXVsdGlwbGUgbGluZSBvZiBmcmFnbWVudHMgd2lsbCBiZSBhbGlnbmVkIHZlcnRpY2FsbHkKLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fTk9fQUxJR05NRU5UID0gMDsKLQkKKwogCXB1YmxpYyBpbnQgbW9kZTsKLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQTElUX01BU0sgPSBNX09ORV9QRVJfTElORV9TUExJVCB8IE1fTkVYVF9TSElGVEVEX1NQTElUIHwgTV9DT01QQUNUX1NQTElUIHwgTV9DT01QQUNUX0ZJUlNUX0JSRUFLX1NQTElUIHwgTV9ORVhUX1BFUl9MSU5FX1NQTElUOwogCiAJLy8gYWxpZ25tZW50IHRpZS1icmVhayBydWxlcyAtIHdoZW4gc3BsaXQgaXMgbmVlZGVkLCB3aWxsIGRlY2lkZSB3aGV0aGVyIGlubmVybW9zdC9vdXRlcm1vc3QgYWxpZ25tZW50IGlzIHRvIGJlIGNob3NlbgogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfT1VURVJNT1NUID0gMTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSX0lOTkVSTU9TVCA9IDI7CiAJcHVibGljIGludCB0aWVCcmVha1J1bGU7Ci0JCisJcHVibGljIGludCBzdGFydGluZ0NvbHVtbiA9IC0xOworCiAJLy8gYWxpZ25tZW50IGVmZmVjdHMgb24gYSBwZXIgZnJhZ21lbnQgYmFzaXMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkVBSyA9IDE7Ci0JCisKIAkvLyBjaHVuayBraW5kCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfRklFTEQgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX01FVEhPRCA9IDI7CkBAIC0xMzIsOSArMTk3LDExIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfRU5VTSA9IDQ7CiAKIAkvLyBsb2NhdGlvbiB0byBhbGlnbiBhbmQgYnJlYWsgb24uCi0JcHVibGljIEFsaWdubWVudChTdHJpbmcgbmFtZSwgaW50IG1vZGUsIGludCB0aWVCcmVha1J1bGUsIFNjcmliZSBzY3JpYmUsIGludCBmcmFnbWVudENvdW50LCBpbnQgc291cmNlUmVzdGFydCwgaW50IGNvbnRpbnVhdGlvbkluZGVudCl7Ci0JCQotCQl0aGlzLm5hbWUgPSBuYW1lOworCXB1YmxpYyBBbGlnbm1lbnQoaW50IGtpbmQsIGludCBtb2RlLCBpbnQgdGllQnJlYWtSdWxlLCBTY3JpYmUgc2NyaWJlLCBpbnQgZnJhZ21lbnRDb3VudCwgaW50IHNvdXJjZVJlc3RhcnQsIGludCBjb250aW51YXRpb25JbmRlbnQpeworCisJCUFzc2VydC5pc1RydWUoa2luZCA+PUFMTE9DQVRJT04gJiYga2luZCA8PU1VTFRJX0NBVENIKTsKKwkJdGhpcy5raW5kID0ga2luZDsKKwkJdGhpcy5uYW1lID0gTkFNRVNba2luZF07CiAJCXRoaXMubG9jYXRpb24gPSBuZXcgTG9jYXRpb24oc2NyaWJlLCBzb3VyY2VSZXN0YXJ0KTsKIAkJdGhpcy5tb2RlID0gbW9kZTsKIAkJdGhpcy50aWVCcmVha1J1bGUgPSB0aWVCcmVha1J1bGU7CkBAIC0xNDIsMTQgKzIwOSwxNCBAQAogCQl0aGlzLnNjcmliZSA9IHNjcmliZTsKIAkJdGhpcy5vcmlnaW5hbEluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLnNjcmliZS5pbmRlbnRhdGlvbkxldmVsOwogCQl0aGlzLndhc1NwbGl0ID0gZmFsc2U7Ci0JCQorCiAJCS8vIGluaXRpYWxpemUgdGhlIGJyZWFrIGluZGVudGF0aW9uIGxldmVsLCB1c2luZyBtb2RlcyBhbmQgY29udGludWF0aW9uSW5kZW50YXRpb25MZXZlbCBwcmVmZXJlbmNlCiAJCWZpbmFsIGludCBpbmRlbnRTaXplID0gdGhpcy5zY3JpYmUuaW5kZW50YXRpb25TaXplOwogCQlpbnQgY3VycmVudENvbHVtbiA9IHRoaXMubG9jYXRpb24ub3V0cHV0Q29sdW1uOwogCQlpZiAoY3VycmVudENvbHVtbiA9PSAxKSB7CiAJCSAgICBjdXJyZW50Q29sdW1uID0gdGhpcy5sb2NhdGlvbi5vdXRwdXRJbmRlbnRhdGlvbkxldmVsICsgMTsKIAkJfQotCQkKKwogCQlpZiAoKG1vZGUgJiBNX0lOREVOVF9PTl9DT0xVTU4pICE9IDApIHsKIAkJCS8vIGluZGVudCBicm9rZW4gZnJhZ21lbnRzIGF0IG5leHQgaW5kZW50YXRpb24gbGV2ZWwsIGJhc2VkIG9uIGN1cnJlbnQgY29sdW1uCiAJCQl0aGlzLmJyZWFrSW5kZW50YXRpb25MZXZlbCA9IHRoaXMuc2NyaWJlLmdldE5leHRJbmRlbnRhdGlvbkxldmVsKGN1cnJlbnRDb2x1bW4pOwpAQCAtMTcwLDEzICsyMzcsMTMgQEAKIAkJLy8gY2hlY2sgZm9yIGZvcmNlZCBhbGlnbm1lbnRzCiAJCWlmICgodGhpcy5tb2RlICYgTV9GT1JDRSkgIT0gMCkgewogCQkJY291bGRCcmVhaygpOwotCQl9CQkJCQkKKwkJfQogCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NodW5rU3RhcnQoaW50IGtpbmQsIGludCBzdGFydEluZGV4LCBpbnQgc291cmNlUmVzdGFydCkgewotCQlpZiAodGhpcy5jaHVua0tpbmQgIT0ga2luZCkgewotCQkJdGhpcy5jaHVua0tpbmQgPSBraW5kOwotCQkJCisKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0NodW5rU3RhcnQoaW50IGNodW5rLCBpbnQgc3RhcnRJbmRleCwgaW50IHNvdXJjZVJlc3RhcnQpIHsKKwkJaWYgKHRoaXMuY2h1bmtLaW5kICE9IGNodW5rKSB7CisJCQl0aGlzLmNodW5rS2luZCA9IGNodW5rOworCiAJCQkvLyB3aGVuIHJlZG9pbmcgc2FtZSBjaHVuayBhbGlnbm1lbnQsIG11c3Qgbm90IHJlc2V0CiAJCQlpZiAoc3RhcnRJbmRleCAhPSB0aGlzLmNodW5rU3RhcnRJbmRleCkgewogCQkJCXRoaXMuY2h1bmtTdGFydEluZGV4ID0gc3RhcnRJbmRleDsKQEAgLTE4OSw3ICsyNTYsNyBAQAogCX0KIAogCXB1YmxpYyB2b2lkIGNoZWNrQ29sdW1uKCkgewotCQlpZiAoKHRoaXMubW9kZSAmIE1fTVVMVElDT0xVTU4pICE9IDApIHsKKwkJaWYgKCh0aGlzLm1vZGUgJiBNX01VTFRJQ09MVU1OKSAhPSAwICYmIHRoaXMuZnJhZ21lbnRDb3VudCA+IDApIHsKIAkJCWludCBjdXJyZW50SW5kZW50YXRpb24gPSB0aGlzLnNjcmliZS5nZXROZXh0SW5kZW50YXRpb25MZXZlbCh0aGlzLnNjcmliZS5jb2x1bW4rKHRoaXMuc2NyaWJlLm5lZWRTcGFjZSA/IDEgOiAwKSk7CiAJCQlpbnQgZnJhZ21lbnRJbmRlbnRhdGlvbiA9IHRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbdGhpcy5mcmFnbWVudEluZGV4XTsKIAkJCWlmIChjdXJyZW50SW5kZW50YXRpb24gPiBmcmFnbWVudEluZGVudGF0aW9uKSB7CkBAIC0yMjEsMjggKzI4OCw5NCBAQAogCQkJfQogCQl9CiAJfQotCQkKKworCXB1YmxpYyBpbnQgZGVwdGgoKSB7CisJCWludCBkZXB0aCA9IDA7CisJCUFsaWdubWVudCBjdXJyZW50ID0gdGhpcy5lbmNsb3Npbmc7CisJCXdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKwkJCWRlcHRoKys7CisJCQljdXJyZW50ID0gY3VycmVudC5lbmNsb3Npbmc7CisJCX0KKwkJcmV0dXJuIGRlcHRoOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFsaWdubWVudCBjYW4gYmUgYWxpZ25lZCBvciBub3QuCisJICogT25seSB1c2VkIGZvciBtZXNzYWdlIHNlbmQgYWxpZ25tZW50LCBpdCBjdXJyZW50bHkgYmxvY2tzIGl0cyBhbGlnbm1lbnQKKwkgKiB3aGVuIGl0J3MgYXQgdGhlIGZpcnN0IG5lc3RpbmcgbGV2ZWwgb2YgYSBtZXNzYWdlIHNlbmQuIEl0IGFsbG93IHRvIHNhdmUKKwkgKiBzcGFjZSBvbiB0aGUgYXJndW1lbnQgYnJva2VuIGxpbmUgYnkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBpbmRlbnRhdGlvbnMuCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuQWxpZ24oKSB7CisJCWlmICh0aGlzLnRvb0xvbmcpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWJvb2xlYW4gY2FuQWxpZ24gPSB0cnVlOworCQlBbGlnbm1lbnQgZW5jbG9zaW5nQWxpZ25tZW50ID0gdGhpcy5lbmNsb3Npbmc7CisJCXdoaWxlIChlbmNsb3NpbmdBbGlnbm1lbnQgIT0gbnVsbCkgeworCQkJc3dpdGNoIChlbmNsb3NpbmdBbGlnbm1lbnQua2luZCkgeworCQkJCWNhc2UgQWxpZ25tZW50LkFMTE9DQVRJT046CisJCQkJY2FzZSBBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFM6CisJCQkJCS8vIG1lc3NhZ2Ugc2VuZCBpbnNpZGUgYXJndW1lbnRzLCBhdm9pZCB0byBhbGlnbgorCQkJCQlpZiAoZW5jbG9zaW5nQWxpZ25tZW50LmlzV3JhcHBlZCgpICYmIAorCQkJCQkJCShlbmNsb3NpbmdBbGlnbm1lbnQuZnJhZ21lbnRJbmRleCA+IDAgfHwgZW5jbG9zaW5nQWxpZ25tZW50LmZyYWdtZW50Q291bnQgPCAyKSkgeworCQkJCQkJcmV0dXJuICF0aGlzLmJsb2NrQWxpZ247CisJCQkJCX0KKwkJCQkJaWYgKGVuY2xvc2luZ0FsaWdubWVudC50b29Mb25nKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQljYW5BbGlnbiA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFsaWdubWVudC5NRVNTQUdFX1NFTkQ6CisJCQkJCS8vIG11bHRpcGxlIGRlcHRoIG9mIG1lc3NhZ2Ugc2VuZCwgaGVuY2UgYWxsb3cgY3VycmVudCB0byBhbGlnbgorCQkJCQlzd2l0Y2ggKHRoaXMua2luZCkgeworCQkJCQkJY2FzZSBBbGlnbm1lbnQuQUxMT0NBVElPTjoKKwkJCQkJCWNhc2UgQWxpZ25tZW50Lk1FU1NBR0VfQVJHVU1FTlRTOgorCQkJCQkJY2FzZSBBbGlnbm1lbnQuTUVTU0FHRV9TRU5EOgorCQkJCQkJCUFsaWdubWVudCBzdXBlckVuY2xvc2luZ0FsaWdubWVudCA9IGVuY2xvc2luZ0FsaWdubWVudC5lbmNsb3Npbmc7CisJCQkJCQkJd2hpbGUgKHN1cGVyRW5jbG9zaW5nQWxpZ25tZW50ICE9IG51bGwpIHsKKwkJCQkJCQkJc3dpdGNoIChzdXBlckVuY2xvc2luZ0FsaWdubWVudC5raW5kKSB7CisJCQkJCQkJCQljYXNlIEFsaWdubWVudC5BTExPQ0FUSU9OOgorCQkJCQkJCQkJY2FzZSBBbGlnbm1lbnQuTUVTU0FHRV9BUkdVTUVOVFM6CisJCQkJCQkJCQljYXNlIEFsaWdubWVudC5NRVNTQUdFX1NFTkQ6CisJCQkJCQkJCQkJLy8gYmxvY2sgdGhlIGFsaWdubWVudCBvZiB0aGUgaW50ZXJtZWRpYXRlIG1lc3NhZ2Ugc2VuZAorCQkJCQkJCQkJCWlmICh0aGlzLnNjcmliZS5ubHNUYWdDb3VudGVyID09IDApIHsKKwkJCQkJCQkJCQkJZW5jbG9zaW5nQWxpZ25tZW50LmJsb2NrQWxpZ24gPSB0cnVlOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlyZXR1cm4gIXRoaXMuYmxvY2tBbGlnbjsKKwkJCQkJCQkJfQorCQkJCQkJCQlzdXBlckVuY2xvc2luZ0FsaWdubWVudCA9IHN1cGVyRW5jbG9zaW5nQWxpZ25tZW50LmVuY2xvc2luZzsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcmV0dXJuICF0aGlzLmJsb2NrQWxpZ247CisJCQl9CisJCQllbmNsb3NpbmdBbGlnbm1lbnQgPSBlbmNsb3NpbmdBbGlnbm1lbnQuZW5jbG9zaW5nOworCQl9CisJCXJldHVybiBjYW5BbGlnbiAmJiAhdGhpcy5ibG9ja0FsaWduOworCX0KKwogCXB1YmxpYyBib29sZWFuIGNvdWxkQnJlYWsoKXsKKwkJaWYgKHRoaXMuZnJhZ21lbnRDb3VudCA9PSAwKSByZXR1cm4gZmFsc2U7CiAJCWludCBpOwotCQlzd2l0Y2gobW9kZSAmIFNQTElUX01BU0speworCQlzd2l0Y2godGhpcy5tb2RlICYgU1BMSVRfTUFTSyl7CiAKIAkJCS8qICAjIGFsaWduZWQgZnJhZ21lbnQKIAkJCSAqICBmb28oCiAJCQkgKiAgICAgI0FBQUFBLCAjQkJCQkIsCiAJCQkgKiAgICAgI0NDQ0MpOwogCQkJICovCi0JCQljYXNlIE1fQ09NUEFDVF9GSVJTVF9CUkVBS19TUExJVCA6IAorCQkJY2FzZSBNX0NPTVBBQ1RfRklSU1RfQlJFQUtfU1BMSVQgOgogCQkJCWlmICh0aGlzLmZyYWdtZW50QnJlYWtzWzBdID09IE5PTkUpIHsKIAkJCQkJdGhpcy5mcmFnbWVudEJyZWFrc1swXSA9IEJSRUFLOwogCQkJCQl0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zWzBdID0gdGhpcy5icmVha0luZGVudGF0aW9uTGV2ZWw7Ci0JCQkJCXJldHVybiB3YXNTcGxpdCA9IHRydWU7CisJCQkJCXJldHVybiB0aGlzLndhc1NwbGl0ID0gdHJ1ZTsKIAkJCQl9CiAJCQkJaSA9IHRoaXMuZnJhZ21lbnRJbmRleDsKIAkJCQlkbyB7CiAJCQkJCWlmICh0aGlzLmZyYWdtZW50QnJlYWtzW2ldID09IE5PTkUpIHsKIAkJCQkJCXRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPSBCUkVBSzsKIAkJCQkJCXRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbaV0gPSB0aGlzLmJyZWFrSW5kZW50YXRpb25MZXZlbDsKLQkJCQkJCXJldHVybiB3YXNTcGxpdCA9IHRydWU7CisJCQkJCQlyZXR1cm4gdGhpcy53YXNTcGxpdCA9IHRydWU7CiAJCQkJCX0KIAkJCQl9IHdoaWxlICgtLWkgPj0gMCk7CiAJCQkJYnJlYWs7CkBAIC0yNTAsMTMgKzM4MywxMyBAQAogCQkJICogIGZvbygjQUFBQUEsICNCQkJCQiwKIAkJCSAqICAgICAjQ0NDQyk7CiAJCQkgKi8KLQkJCWNhc2UgTV9DT01QQUNUX1NQTElUIDogCisJCQljYXNlIE1fQ09NUEFDVF9TUExJVCA6CiAJCQkJaSA9IHRoaXMuZnJhZ21lbnRJbmRleDsKIAkJCQlkbyB7CiAJCQkJCWlmICh0aGlzLmZyYWdtZW50QnJlYWtzW2ldID09IE5PTkUpIHsKIAkJCQkJCXRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPSBCUkVBSzsKLQkJCQkJCXRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbaV0gPSB0aGlzLmJyZWFrSW5kZW50YXRpb25MZXZlbDsJCQkJCQkKLQkJCQkJCXJldHVybiB3YXNTcGxpdCA9IHRydWU7CisJCQkJCQl0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zW2ldID0gdGhpcy5icmVha0luZGVudGF0aW9uTGV2ZWw7CisJCQkJCQlyZXR1cm4gdGhpcy53YXNTcGxpdCA9IHRydWU7CiAJCQkJCX0KIAkJCQl9IHdoaWxlICgtLWkgPj0gMCk7CiAJCQkJYnJlYWs7CkBAIC0yNjksMTYgKzQwMiwxNiBAQAogCQkJICovCiAJCQljYXNlIE1fTkVYVF9TSElGVEVEX1NQTElUIDoKIAkJCQlpZiAodGhpcy5mcmFnbWVudEJyZWFrc1swXSA9PSBOT05FKSB7Ci0JCQkJCXRoaXMuZnJhZ21lbnRCcmVha3NbMF0gPSBCUkVBSzsJCQkJCQorCQkJCQl0aGlzLmZyYWdtZW50QnJlYWtzWzBdID0gQlJFQUs7CiAJCQkJCXRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbMF0gPSB0aGlzLmJyZWFrSW5kZW50YXRpb25MZXZlbDsKIAkJCQkJZm9yIChpID0gMTsgaSA8IHRoaXMuZnJhZ21lbnRDb3VudDsgaSsrKXsKIAkJCQkJCXRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPSBCUkVBSzsKIAkJCQkJCXRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbaV0gPSB0aGlzLnNoaWZ0QnJlYWtJbmRlbnRhdGlvbkxldmVsOwogCQkJCQl9Ci0JCQkJCXJldHVybiB3YXNTcGxpdCA9IHRydWU7CisJCQkJCXJldHVybiB0aGlzLndhc1NwbGl0ID0gdHJ1ZTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkJCisKIAkJCS8qICAjIGFsaWduZWQgZnJhZ21lbnQKIAkJCSAqICBmb28oCiAJCQkgKiAgICAgICNBQUFBQSwKQEAgLTI5MSwxNCArNDI0LDE1IEBACiAJCQkJCQl0aGlzLmZyYWdtZW50QnJlYWtzW2ldID0gQlJFQUs7CiAJCQkJCQl0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zW2ldID0gdGhpcy5icmVha0luZGVudGF0aW9uTGV2ZWw7CiAJCQkJCX0KLQkJCQkJcmV0dXJuIHdhc1NwbGl0ID0gdHJ1ZTsKKwkJCQkJcmV0dXJuIHRoaXMud2FzU3BsaXQgPSB0cnVlOwogCQkJCX0KKwkJCQlicmVhazsKIAkJCS8qICAjIGFsaWduZWQgZnJhZ21lbnQKIAkJCSAqICBmb28oI0FBQUFBLAogCQkJICogICAgICAjQkJCQkIsCiAJCQkgKiAgICAgICNDQ0NDKTsKIAkJCSAqLwotCQkJY2FzZSBNX05FWFRfUEVSX0xJTkVfU1BMSVQgOiAKKwkJCWNhc2UgTV9ORVhUX1BFUl9MSU5FX1NQTElUIDoKIAkJCQlpZiAodGhpcy5mcmFnbWVudEJyZWFrc1swXSA9PSBOT05FKSB7CiAJCQkJCWlmICh0aGlzLmZyYWdtZW50Q291bnQgPiAxCiAJCQkJCQkJJiYgdGhpcy5mcmFnbWVudEJyZWFrc1sxXSA9PSBOT05FKSB7CkBAIC0zMDksMjQgKzQ0MywzMSBAQAogCQkJCQkJCXRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPSBCUkVBSzsKIAkJCQkJCQl0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zW2ldID0gdGhpcy5icmVha0luZGVudGF0aW9uTGV2ZWw7CiAJCQkJCQl9Ci0JCQkJCQlyZXR1cm4gd2FzU3BsaXQgPSB0cnVlOworCQkJCQkJcmV0dXJuIHRoaXMud2FzU3BsaXQgPSB0cnVlOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwotCQl9CQkKKwkJfQogCQlyZXR1cm4gZmFsc2U7IC8vIGNhbm5vdCBzcGxpdCBiZXR0ZXIKIAl9CiAJCi0JcHVibGljIEFsaWdubWVudCBnZXRBbGlnbm1lbnQoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQotCQlpZiAodGFyZ2V0TmFtZS5lcXVhbHModGhpcy5uYW1lKSkgcmV0dXJuIHRoaXM7Ci0JCWlmICh0aGlzLmVuY2xvc2luZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiB0aGlzLmVuY2xvc2luZy5nZXRBbGlnbm1lbnQodGFyZ2V0TmFtZSk7CisJcHVibGljIGJvb2xlYW4gaXNXcmFwcGVkKCkgeworCQlpZiAodGhpcy5mcmFnbWVudENvdW50ID09IDApIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRoaXMuZnJhZ21lbnRCcmVha3NbdGhpcy5mcmFnbWVudEluZGV4XSA9PSBCUkVBSzsKIAl9Ci0JCQorCisJcHVibGljIGludCB3cmFwcGVkSW5kZXgoKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmZyYWdtZW50Q291bnQ7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKHRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPT0gQlJFQUspIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCiAJLy8gcGVyZm9ybSBhbGlnbm1lbnQgZWZmZWN0IGZvciBjdXJyZW50IGZyYWdtZW50CiAJcHVibGljIHZvaWQgcGVyZm9ybUZyYWdtZW50RWZmZWN0KCl7CisJCWlmICh0aGlzLmZyYWdtZW50Q291bnQgPT0gMCkgcmV0dXJuOwogCQlpZiAoKHRoaXMubW9kZSAmIE1fTVVMVElDT0xVTU4pID09IDApIHsKIAkJCXN3aXRjaCh0aGlzLm1vZGUgJiBTUExJVF9NQVNLKSB7CiAJCQkJY2FzZSBBbGlnbm1lbnQuTV9DT01QQUNUX1NQTElUIDoKQEAgLTMzOSw1MiArNDgwLDg4IEBACiAJCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQkKLQkJaWYgKHRoaXMuZnJhZ21lbnRCcmVha3NbdGhpcy5mcmFnbWVudEluZGV4XSA9PSBCUkVBSykgewotCQkJdGhpcy5zY3JpYmUucHJpbnROZXdMaW5lKCk7Ci0JCX0KLQkJaWYgKHRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbdGhpcy5mcmFnbWVudEluZGV4XSA+IDApIHsKLQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSB0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zW3RoaXMuZnJhZ21lbnRJbmRleF07Ci0JCX0KLQl9CQkJCQkKIAotCS8vIHJlc2V0IGZyYWdtZW50IGluZGVudGF0aW9uL2JyZWFrIHN0YXR1cwkKKwkJaW50IGZyYWdtZW50SW5kZW50YXRpb24gPSB0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zW3RoaXMuZnJhZ21lbnRJbmRleF07CisJCWlmICh0aGlzLnN0YXJ0aW5nQ29sdW1uIDwgMCB8fCAoZnJhZ21lbnRJbmRlbnRhdGlvbisxKSA8IHRoaXMuc3RhcnRpbmdDb2x1bW4pIHsKKwkJCWlmICh0aGlzLmZyYWdtZW50QnJlYWtzW3RoaXMuZnJhZ21lbnRJbmRleF0gPT0gQlJFQUspIHsKKwkJCQl0aGlzLnNjcmliZS5wcmludE5ld0xpbmUoKTsKKwkJCX0KKwkJCWlmIChmcmFnbWVudEluZGVudGF0aW9uID4gMCkgeworCQkJCXRoaXMuc2NyaWJlLmluZGVudGF0aW9uTGV2ZWwgPSBmcmFnbWVudEluZGVudGF0aW9uOworCQkJfQorCQl9CisJfQorCisJLy8gcmVzZXQgZnJhZ21lbnQgaW5kZW50YXRpb24vYnJlYWsgc3RhdHVzCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAKLQkJaWYgKGZyYWdtZW50Q291bnQgPiAwKXsKKwkJdGhpcy53YXNTcGxpdCA9IGZhbHNlOworCQlpZiAodGhpcy5mcmFnbWVudENvdW50ID4gMCl7CiAJCQl0aGlzLmZyYWdtZW50SW5kZW50YXRpb25zID0gbmV3IGludFt0aGlzLmZyYWdtZW50Q291bnRdOwogCQkJdGhpcy5mcmFnbWVudEJyZWFrcyA9IG5ldyBpbnRbdGhpcy5mcmFnbWVudENvdW50XTsKIAkJfQogCiAJCS8vIGNoZWNrIGZvciBmb3JjZWQgYWxpZ25tZW50cwotCQlpZiAoKG1vZGUgJiBNX0ZPUkNFKSAhPSAwKSB7CisJCWlmICgodGhpcy5tb2RlICYgTV9GT1JDRSkgIT0gMCkgewogCQkJY291bGRCcmVhaygpOwotCQl9CQkKLQl9CQkKKwkJfQorCQl0aGlzLnJlc2V0ID0gdHJ1ZTsKKwl9CiAKIAlwdWJsaWMgdm9pZCB0b0ZyYWdtZW50c1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKXsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJcmV0dXJuIHRvU3RyaW5nKGJ1ZmZlciwgLTEpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGxldmVsKSB7CisJCQorCQkvLyBDb21wdXRlIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwKKwkJU3RyaW5nQnVmZmVyIGluZGVudGF0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpPTA7IGk8bGV2ZWw7IGkrKykgeworCQkJaW5kZW50YXRpb24uYXBwZW5kKCdcdCcpOworCQl9CisJCQorCQkvLyBGaXJzdCBsaW5lIGlzIGZvciBjbGFzcyBhbmQgbmFtZQorCQlidWZmZXIuYXBwZW5kKGluZGVudGF0aW9uKTsKIAkJYnVmZmVyCi0JCQkuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKQotCQkJLmFwcGVuZCgnOicpCisJCQkuYXBwZW5kKCI8a2luZDogIikJLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCh0aGlzLmtpbmQpCisJCQkuYXBwZW5kKCI+ICIpOwkvLyROT04tTkxTLTEkCisJCWJ1ZmZlcgogCQkJLmFwcGVuZCgiPG5hbWU6ICIpCS8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQodGhpcy5uYW1lKQotCQkJLmFwcGVuZCgiPiIpOwkvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLmVuY2xvc2luZyAhPSBudWxsKSB7Ci0JCQlidWZmZXIKLQkJCQkuYXBwZW5kKCI8ZW5jbG9zaW5nTmFtZTogIikJLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQodGhpcy5lbmNsb3NpbmcubmFtZSkKLQkJCQkuYXBwZW5kKCc+Jyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsJCisJCQkuYXBwZW5kKCI+XG4iKTsJLy8kTk9OLU5MUy0xJAorCQkKKwkJLy8gTGluZSBmb3IgZGVwdGggYW5kIGJyZWFrIGluZGVudGF0aW9uCisJCWJ1ZmZlci5hcHBlbmQoaW5kZW50YXRpb24pOworCQlidWZmZXIKKwkJCS5hcHBlbmQoIjxkZXB0aD0iKQkvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGRlcHRoKCkpCisJCQkuYXBwZW5kKCI+PGJyZWFrSW5kZW50PSIpCS8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQodGhpcy5icmVha0luZGVudGF0aW9uTGV2ZWwpCisJCQkuYXBwZW5kKCI+PHNoaWZ0QnJlYWtJbmRlbnQ9IikJLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCh0aGlzLnNoaWZ0QnJlYWtJbmRlbnRhdGlvbkxldmVsKQorCQkJLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKIAorCQkvLyBMaW5lIHRvIGRpc3BsYXkgdGhlIGxvY2F0aW9uCisJCWJ1ZmZlci5hcHBlbmQoaW5kZW50YXRpb24pOworCQlidWZmZXIKKwkJCS5hcHBlbmQoIjxsb2NhdGlvbj0iKQkvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHRoaXMubG9jYXRpb24udG9TdHJpbmcoKSkKKwkJCS5hcHBlbmQoIj5cbiIpOwkvLyROT04tTkxTLTEkCisKKwkJLy8gTGluZXMgZm9yIGZyYWdtZW50cworCQlidWZmZXIKKwkJCS5hcHBlbmQoaW5kZW50YXRpb24pCisJCQkuYXBwZW5kKCI8ZnJhZ21lbnRzOlxuIik7CS8vJE5PTi1OTFMtMSQKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmZyYWdtZW50Q291bnQ7IGkrKyl7CiAJCQlidWZmZXIKLQkJCQkuYXBwZW5kKCIgLSBmcmFnbWVudCAiKQkvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChpbmRlbnRhdGlvbikKKwkJCQkuYXBwZW5kKCIgLSAiKQkvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChpKQogCQkJCS5hcHBlbmQoIjogIikJLy8kTk9OLU5MUy0xJAogCQkJCS5hcHBlbmQoIjxicmVhazogIikJLy8kTk9OLU5MUy0xJApAQCAtMzk0LDEwICs1NzEsMjUgQEAKIAkJCQkuYXBwZW5kKHRoaXMuZnJhZ21lbnRJbmRlbnRhdGlvbnNbaV0pCiAJCQkJLmFwcGVuZCgiPlxuIik7CS8vJE5PTi1OTFMtMSQKIAkJfQotCQlidWZmZXIuYXBwZW5kKCdcbicpOwkKKwkJYnVmZmVyCisJCQkuYXBwZW5kKGluZGVudGF0aW9uKQorCQkJLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCS8vIERpc3BsYXkgZW5jbG9zaW5nCisJCWlmICh0aGlzLmVuY2xvc2luZyAhPSBudWxsICYmIGxldmVsID49IDApIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoaW5kZW50YXRpb24pCisJCQkJLmFwcGVuZCgiPGVuY2xvc2luZyBhc3NpZ25lbWVudDpcbiIpOwkvLyROT04tTkxTLTEkCisJCQl0aGlzLmVuY2xvc2luZy50b1N0cmluZyhidWZmZXIsIGxldmVsKzEpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChpbmRlbnRhdGlvbikKKwkJCQkuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQkvLyBSZXR1cm4gdGhlIHJlc3VsdAogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgdXBkYXRlKCkgewogCQlmb3IgKGludCBpID0gMTsgaSA8IHRoaXMuZnJhZ21lbnRDb3VudDsgaSsrKXsKIAkJICAgIGlmICh0aGlzLmZyYWdtZW50QnJlYWtzW2ldID09IEJSRUFLKSB7CkBAIC00MDYsMTIgKzU5OCw3IEBACiAJCX0KIAl9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZWQoKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmZyYWdtZW50Q291bnQ7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKHRoaXMuZnJhZ21lbnRCcmVha3NbaV0gPT0gQlJFQUspIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7CisJcHVibGljIGJvb2xlYW4gd2FzUmVzZXQoKSB7CisJCXJldHVybiB0aGlzLnJlc2V0OwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2FsaWduL0FsaWdubWVudEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvYWxpZ24vQWxpZ25tZW50RXhjZXB0aW9uLmphdmEKaW5kZXggODI3YjA3MS4uZmVhMDNjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvYWxpZ24vQWxpZ25tZW50RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvYWxpZ24vQWxpZ25tZW50RXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTUgKzE3LDE1IEBACiAgKiBAc2luY2UgMi4xCiAgKi8KIHB1YmxpYyBjbGFzcyBBbGlnbm1lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVfVE9PX0xPTkcgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOX1RPT19TTUFMTCA9IDI7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMzMjQxMzQ5ODY0NjYyNTMzMTRMOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlCi0JCisKIAlpbnQgcmVhc29uOwogCWludCB2YWx1ZTsKIAlwdWJsaWMgaW50IHJlbGF0aXZlRGVwdGg7Ci0JCisKIAlwdWJsaWMgQWxpZ25tZW50RXhjZXB0aW9uKGludCByZWFzb24sIGludCByZWxhdGl2ZURlcHRoKSB7CiAJCXRoaXMocmVhc29uLCAwLCByZWxhdGl2ZURlcHRoKTsKIAl9CkBAIC0zNSw3ICszNSw3IEBACiAJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAkJdGhpcy5yZWxhdGl2ZURlcHRoID0gcmVsYXRpdmVEZXB0aDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKIAkJc3dpdGNoKHRoaXMucmVhc29uKXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudEZvcm1hdHRlclV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudEZvcm1hdHRlclV0aWwuamF2YQppbmRleCA0N2Y2MWI4Li4yMTdhMGJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0NvbW1lbnRGb3JtYXR0ZXJVdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9Db21tZW50Rm9ybWF0dGVyVXRpbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDE0ICsyNywxNCBAQAogCiAvKioKICAqIENvbW1lbnQgZm9ybWF0dGluZyB1dGlscy4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGNsYXNzIENvbW1lbnRGb3JtYXR0ZXJVdGlsIHsKIAogCS8qKgogCSAqIEV2YWx1YXRlcyB0aGUgZWRpdCBvbiB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqIAorCSAqCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBvc2l0aW9ucyBhcmUgbm90IGluc2lkZSB0aGUKIAkgKiAgICAgICAgICAgICAgICAgc3RyaW5nCiAJICovCkBAIC01NCwxMiArNTQsMTIgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGVkaXRzIHRoYXQgZGVzY3JpYmUgaG93IHRvIGZvcm1hdCB0aGUgZ2l2ZW4gc3RyaW5nLiBSZXR1cm5zCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvZGUgY291bGQgbm90IGJlIGZvcm1hdHRlZCBmb3IgdGhlIGdpdmVuCiAJICoga2luZC4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgbm90CiAJICogICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgc3RyaW5nCiAJICovCkBAIC03NCw3ICs3NCw3IEBACiAJLyoqCiAJICogUmV0dXJucyBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbnMKIAkgKiByZWdpc3RlcmVkIHdpdGggdGhlIHtAbGluayBEZWZhdWx0UG9zaXRpb25VcGRhdGVyfS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50CiAJICogQHBhcmFtIHBvc2l0aW9ucyB0aGUgcG9zaXRpb25zCiAJICogQHJldHVybiB0aGUgZG9jdW1lbnQKQEAgLTg1LDEyICs4NSwxMiBAQAogCQl0cnkgewogCQkJaWYgKHBvc2l0aW9ucyAhPSBudWxsKSB7CiAJCQkJZmluYWwgU3RyaW5nIFBPU19DQVRFR09SWT0gIm15Q2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCQkJCisKIAkJCQlkb2MuYWRkUG9zaXRpb25DYXRlZ29yeShQT1NfQ0FURUdPUlkpOwogCQkJCWRvYy5hZGRQb3NpdGlvblVwZGF0ZXIobmV3IERlZmF1bHRQb3NpdGlvblVwZGF0ZXIoUE9TX0NBVEVHT1JZKSB7CiAJCQkJCXByb3RlY3RlZCBib29sZWFuIG5vdERlbGV0ZWQoKSB7Ci0JCQkJCQlpZiAoZk9mZnNldCA8IGZQb3NpdGlvbi5vZmZzZXQgJiYgKGZQb3NpdGlvbi5vZmZzZXQgKyBmUG9zaXRpb24ubGVuZ3RoIDwgZk9mZnNldCArIGZMZW5ndGgpKSB7Ci0JCQkJCQkJZlBvc2l0aW9uLm9mZnNldD0gZk9mZnNldCArIGZMZW5ndGg7IC8vIGRlbGV0ZWQgcG9zaXRpb25zOiBzZXQgdG8gZW5kIG9mIHJlbW92ZQorCQkJCQkJaWYgKHRoaXMuZk9mZnNldCA8IHRoaXMuZlBvc2l0aW9uLm9mZnNldCAmJiAodGhpcy5mUG9zaXRpb24ub2Zmc2V0ICsgdGhpcy5mUG9zaXRpb24ubGVuZ3RoIDwgdGhpcy5mT2Zmc2V0ICsgdGhpcy5mTGVuZ3RoKSkgeworCQkJCQkJCXRoaXMuZlBvc2l0aW9uLm9mZnNldD0gdGhpcy5mT2Zmc2V0ICsgdGhpcy5mTGVuZ3RoOyAvLyBkZWxldGVkIHBvc2l0aW9uczogc2V0IHRvIGVuZCBvZiByZW1vdmUKIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJLyoqCiAJICogTG9ncyB0aGUgZ2l2ZW4gdGhyb3dhYmxlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHQgdGhlIHRocm93YWJsZQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudExpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudExpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyYWU0MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0NvbW1lbnRMaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7Ci0KLS8qKgotICogR2VuZXJhbCBjb21tZW50IGxpbmUgaW4gYSBjb21tZW50IHJlZ2lvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbWVudExpbmUgaW1wbGVtZW50cyBJQm9yZGVyQXR0cmlidXRlcyB7Ci0KLQkvKiogUHJlZml4IG9mIG5vbi1mb3JtYXR0YWJsZSBjb21tZW50IGxpbmVzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0ZPUk1BVF9TVEFSVF9QUkVGSVg9ICIvKi0iOyAvLyROT04tTkxTLTEkCi0KLQkvKiogVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBsaW5lICovCi0JcHJpdmF0ZSBpbnQgZkF0dHJpYnV0ZXM9IDA7Ci0KLQkvKiogVGhlIHBhcmVudCByZWdpb24gb2YgdGhpcyBsaW5lICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tZW50UmVnaW9uIGZQYXJlbnQ7Ci0KLQkvKiogVGhlIGNvbW1lbnQgcmFuZ2VzIGluIHRoaXMgbGluZSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUmFuZ2VzPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb21tZW50IGxpbmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBjb21tZW50IHJlZ2lvbiB0byBjcmVhdGUgdGhlIGNvbW1lbnQgbGluZSBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudExpbmUoZmluYWwgQ29tbWVudFJlZ2lvbiBwYXJlbnQpIHsKLQkJZlBhcmVudD0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEFkYXB0cyB0aGUgbGluZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHByZXZpb3VzIGxpbmUgaW4gdGhlIGNvbW1lbnQKLQkgKiByZWdpb24uCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzIHRoZSBwcmV2aW91cyBjb21tZW50IGxpbmUgaW4gdGhlIGNvbW1lbnQgcmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRhcHQoZmluYWwgQ29tbWVudExpbmUgcHJldmlvdXMpOwotCi0JLyoqCi0JICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGNvbW1lbnQgcmFuZ2UgdG8gdGhpcyBjb21tZW50IGxpbmUuCi0JICogCi0JICogQHBhcmFtIHJhbmdlIGNvbW1lbnQgcmFuZ2UgdG8gYXBwZW5kIHRvIHRoaXMgbGluZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZChmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UpIHsKLQkJZlJhbmdlcy5hZGQocmFuZ2UpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhpcyBjb21tZW50IGxpbmUgYXMgY29udGVudCBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvciB0aGUgcHJlZGVjZXNzb3IgY29tbWVudCBsaW5lIGluIHRoZSBjb21tZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsYXN0IHRoZSBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBjb21tZW50IHJhbmdlCi0JICogQHBhcmFtIGluZGVudGF0aW9uIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgY29tbWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhpcyBjb21tZW50IGxpbmUgaW4gdGhlIGNvbW1lbnQgcmVnaW9uCi0JICogQHJldHVybiB0aGUgZmlyc3QgY29tbWVudCByYW5nZSBpbiB0aGlzIGNvbW1lbnQgbGluZQotCSAqLwotCXByb3RlY3RlZCBDb21tZW50UmFuZ2UgZm9ybWF0TGluZShmaW5hbCBDb21tZW50TGluZSBwcmVkZWNlc3NvciwgZmluYWwgQ29tbWVudFJhbmdlIGxhc3QsIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvbiwgZmluYWwgaW50IGxpbmUpIHsKLQotCQlpbnQgb2Zmc2V0PSAwOwotCQlpbnQgbGVuZ3RoPSAwOwotCi0JCUNvbW1lbnRSYW5nZSBuZXh0PSBsYXN0OwotCQlDb21tZW50UmFuZ2UgcHJldmlvdXM9IG51bGw7Ci0KLQkJZmluYWwgaW50IHN0b3A9IGZSYW5nZXMuc2l6ZSgpIC0gMTsKLQkJZmluYWwgaW50IGVuZD0gZlBhcmVudC5nZXRTaXplKCkgLSAxOwotCi0JCWZvciAoaW50IGluZGV4PSBzdG9wOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7Ci0KLQkJCXByZXZpb3VzPSBuZXh0OwotCQkJbmV4dD0gKENvbW1lbnRSYW5nZSlmUmFuZ2VzLmdldChpbmRleCk7Ci0KLQkJCWlmIChmUGFyZW50LmNhbkZvcm1hdChwcmV2aW91cywgbmV4dCkpIHsKLQotCQkJCW9mZnNldD0gbmV4dC5nZXRPZmZzZXQoKSArIG5leHQuZ2V0TGVuZ3RoKCk7Ci0JCQkJbGVuZ3RoPSBwcmV2aW91cy5nZXRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQkJCWlmIChpbmRleCA9PSBzdG9wICYmIGxpbmUgIT0gZW5kKQotCQkJCQlmUGFyZW50LmxvZ0VkaXQoZlBhcmVudC5nZXREZWxpbWl0ZXIocHJlZGVjZXNzb3IsIHRoaXMsIHByZXZpb3VzLCBuZXh0LCBpbmRlbnRhdGlvbiksIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQllbHNlCi0JCQkJCWZQYXJlbnQubG9nRWRpdChmUGFyZW50LmdldERlbGltaXRlcihwcmV2aW91cywgbmV4dCksIG9mZnNldCwgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoaXMgY29tbWVudCBsaW5lIGFzIGVuZCBsaW5lIGhhdmluZyBhIGxvd2VyIGJvcmRlcgotCSAqIGNvbnNpc3Rpbmcgb2YgY29udGVudCBsaW5lIHByZWZpeGVzLgotCSAqIAotCSAqIEBwYXJhbSByYW5nZSBsYXN0IGNvbW1lbnQgcmFuZ2Ugb2YgdGhlIGxhc3QgY29tbWVudCBsaW5lIGluIHRoZQotCSAqICAgICAgICAgICAgICAgIGNvbW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluZGVudGF0aW9uIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgY29tbWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBtYXhpbWFsIGxlbmd0aCBvZiB0ZXh0IGluIHRoaXMgY29tbWVudCByZWdpb24KLQkgKiAgICAgICAgICAgICAgICBtZWFzdXJlZCBpbiBhdmVyYWdlIGNoYXJhY3RlciB3aWR0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRMb3dlckJvcmRlcihmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvbiwgZmluYWwgaW50IGxlbmd0aCkgewotCi0JCWZpbmFsIGludCBvZmZzZXQ9IHJhbmdlLmdldE9mZnNldCgpICsgcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQlmaW5hbCBTdHJpbmcgZW5kPSBnZXRFbmRpbmdQcmVmaXgoKTsKLQkJZmluYWwgU3RyaW5nIGRlbGltaXRlcj0gZlBhcmVudC5nZXREZWxpbWl0ZXIoKTsKLQotCQlpZiAoZlBhcmVudC5pc1NpbmdsZUxpbmUoKSAmJiBmUGFyZW50LmdldFNpemUoKSA9PSAxKQotCQkJYnVmZmVyLmFwcGVuZChlbmQpOwotCQllbHNlIHsKLQotCQkJZmluYWwgU3RyaW5nIGZpbGxlcj0gZ2V0Q29udGVudFByZWZpeCgpLnRyaW0oKTsKLQotCQkJYnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJYnVmZmVyLmFwcGVuZChpbmRlbnRhdGlvbik7Ci0KLQkJCWlmIChmUGFyZW50Lmhhc0JvcmRlcihCT1JERVJfTE9XRVIpKSB7Ci0KLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJZm9yIChpbnQgY2hhcmFjdGVyPSAwOyBjaGFyYWN0ZXIgPCBsZW5ndGg7IGNoYXJhY3RlcisrKQotCQkJCQlidWZmZXIuYXBwZW5kKGZpbGxlcik7Ci0KLQkJCQlidWZmZXIuYXBwZW5kKGVuZC50cmltKCkpOwotCi0JCQl9IGVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKGVuZCk7Ci0JCX0KLQkJZlBhcmVudC5sb2dFZGl0KGJ1ZmZlci50b1N0cmluZygpLCBvZmZzZXQsIGZQYXJlbnQuZ2V0TGVuZ3RoKCkgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhpcyBjb21tZW50IGxpbmUgYXMgc3RhcnQgbGluZSBoYXZpbmcgYW4gdXBwZXIgYm9yZGVyCi0JICogY29uc2lzdGluZyBvZiBjb250ZW50IGxpbmUgcHJlZml4ZXMuCi0JICogCi0JICogQHBhcmFtIHJhbmdlIHRoZSBmaXJzdCBjb21tZW50IHJhbmdlIGluIHRoZSBjb21tZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbiB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGNvbW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aCB0aGUgbWF4aW1hbCBsZW5ndGggb2YgdGV4dCBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uCi0JICogICAgICAgICAgICAgICAgbWVhc3VyZWQgaW4gYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGhzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VXBwZXJCb3JkZXIoZmluYWwgQ29tbWVudFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24sIGZpbmFsIGludCBsZW5ndGgpIHsKLQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCWZpbmFsIFN0cmluZyBzdGFydD0gZ2V0U3RhcnRpbmdQcmVmaXgoKTsKLQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IGdldENvbnRlbnRQcmVmaXgoKTsKLQotCQlpZiAoZlBhcmVudC5pc1NpbmdsZUxpbmUoKSAmJiBmUGFyZW50LmdldFNpemUoKSA9PSAxKQotCQkJYnVmZmVyLmFwcGVuZChzdGFydCk7Ci0JCWVsc2UgewotCi0JCQlmaW5hbCBTdHJpbmcgdHJpbW1lZD0gc3RhcnQudHJpbSgpOwotCQkJZmluYWwgU3RyaW5nIGZpbGxlcj0gY29udGVudC50cmltKCk7Ci0KLQkJCWJ1ZmZlci5hcHBlbmQodHJpbW1lZCk7Ci0KLQkJCWlmIChmUGFyZW50Lmhhc0JvcmRlcihCT1JERVJfVVBQRVIpKSB7Ci0KLQkJCQlmb3IgKGludCBjaGFyYWN0ZXI9IDA7IGNoYXJhY3RlciA8IGxlbmd0aCAtIHRyaW1tZWQubGVuZ3RoKCkgKyBzdGFydC5sZW5ndGgoKTsgY2hhcmFjdGVyKyspCi0JCQkJCWJ1ZmZlci5hcHBlbmQoZmlsbGVyKTsKLQkJCX0KLQotCQkJYnVmZmVyLmFwcGVuZChmUGFyZW50LmdldERlbGltaXRlcigpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoaW5kZW50YXRpb24pOwotCQkJYnVmZmVyLmFwcGVuZChjb250ZW50KTsKLQkJfQotCQlmUGFyZW50LmxvZ0VkaXQoYnVmZmVyLnRvU3RyaW5nKCksIDAsIHJhbmdlLmdldE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIHByZWZpeCBvZiBjb250ZW50IGxpbmVzLgotCSAqIAotCSAqIEByZXR1cm4gbGluZSBwcmVmaXggb2YgY29udGVudCBsaW5lcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBwcmVmaXggb2YgZW5kIGxpbmVzLgotCSAqIAotCSAqIEByZXR1cm4gbGluZSBwcmVmaXggb2YgZW5kIGxpbmVzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFbmRpbmdQcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNvbW1lbnQgcmFuZ2UgaW4gdGhpcyBjb21tZW50IGxpbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3QgY29tbWVudCByYW5nZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tZW50UmFuZ2UgZ2V0Rmlyc3QoKSB7Ci0JCXJldHVybiAoQ29tbWVudFJhbmdlKWZSYW5nZXMuZ2V0Rmlyc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRlbnRhdGlvbiByZWZlcmVuY2Ugc3RyaW5nIGZvciB0aGlzIGxpbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgaW5kZW50YXRpb24gcmVmZXJlbmNlIHN0cmluZyBmb3IgdGhpcyBsaW5lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnRhdGlvblJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCBjb21tZW50IHJhbmdlIGluIHRoaXMgY29tbWVudCBsaW5lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhc3QgY29tbWVudCByYW5nZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tZW50UmFuZ2UgZ2V0TGFzdCgpIHsKLQkJcmV0dXJuIChDb21tZW50UmFuZ2UpZlJhbmdlcy5nZXRMYXN0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IGNvbW1lbnQgcmVnaW9uIG9mIHRoaXMgY29tbWVudCBsaW5lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBjb21tZW50IHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tZW50UmVnaW9uIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGZQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmFuZ2VzIGluIHRoaXMgY29tbWVudCBsaW5lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhpcyBsaW5lCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlJhbmdlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBwcmVmaXggb2Ygc3RhcnQgbGluZXMuCi0JICogCi0JICogQHJldHVybiBsaW5lIHByZWZpeCBvZiBzdGFydCBsaW5lcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhcnRpbmdQcmVmaXgoKTsKLQotCS8qKgotCSAqIElzIHRoZSBhdHRyaWJ1dGUgPGNvZGU+YXR0cmlidXRlPC9jb2RlPiB0cnVlPwotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB0byBnZXQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0F0dHJpYnV0ZShmaW5hbCBpbnQgYXR0cmlidXRlKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgJiBhdHRyaWJ1dGUpID09IGF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTY2FucyB0aGlzIGNvbW1lbnQgbGluZSBmb3IgY29tbWVudCByYW5nZSBib3VuZGFyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lIHRoZSBpbmRleCBvZiB0aGlzIGxpbmUgaW4gdGhlIGNvbW1lbnQgcmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2NhbkxpbmUoZmluYWwgaW50IGxpbmUpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhdHRyaWJ1dGUgPGNvZGU+YXR0cmlidXRlPC9jb2RlPiB0byB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKGZpbmFsIGludCBhdHRyaWJ1dGUpIHsKLQkJZkF0dHJpYnV0ZXMgfD0gYXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIFRva2VuaXplcyB0aGlzIGNvbW1lbnQgbGluZSBpbnRvIGNvbW1lbnQgcmFuZ2VzCi0JICogCi0JICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoaXMgbGluZSBpbiB0aGUgY29tbWVudCByZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2tlbml6ZUxpbmUoZmluYWwgaW50IGxpbmUpIHsKLQotCQlpbnQgb2Zmc2V0PSAwOwotCQlpbnQgaW5kZXg9IG9mZnNldDsKLQotCQlmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2U9IChDb21tZW50UmFuZ2UpZlJhbmdlcy5nZXQoMCk7Ci0JCWZpbmFsIGludCBiZWdpbj0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0KLQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IGZQYXJlbnQuZ2V0VGV4dChiZWdpbiwgcmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQlmaW5hbCBpbnQgbGVuZ3RoPSBjb250ZW50Lmxlbmd0aCgpOwotCi0JCXdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLQotCQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjb250ZW50LmNoYXJBdChvZmZzZXQpKSkKLQkJCQlvZmZzZXQrKzsKLQotCQkJaW5kZXg9IG9mZnNldDsKLQotCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmICFTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjb250ZW50LmNoYXJBdChpbmRleCkpKQotCQkJCWluZGV4Kys7Ci0KLQkJCWlmIChpbmRleCAtIG9mZnNldCA+IDApIHsKLQkJCQlmUGFyZW50LmFwcGVuZChuZXcgQ29tbWVudFJhbmdlKGJlZ2luICsgb2Zmc2V0LCBpbmRleCAtIG9mZnNldCkpOwotCi0JCQkJb2Zmc2V0PSBpbmRleDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmaW5hbCBpbnQgc2l6ZSA9IHRoaXMuZlJhbmdlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRoaXMuZlJhbmdlcy5nZXQoaSkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudFJhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0NvbW1lbnRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU1ZWM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci0KLS8qKgotICogUmFuZ2UgaW4gYSBjb21tZW50IHJlZ2lvbiBpbiBjb21tZW50IHJlZ2lvbiBjb29yZGluYXRlcy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudFJhbmdlIGV4dGVuZHMgUG9zaXRpb24gaW1wbGVtZW50cyBJQ29tbWVudEF0dHJpYnV0ZXMsIElIdG1sVGFnRGVsaW1pdGVycyB7Ci0KLQkvKiogVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyByYW5nZSAqLwotCXByaXZhdGUgaW50IGZBdHRyaWJ1dGVzPSAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb21tZW50IHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbiBvZmZzZXQgb2YgdGhlIHJhbmdlCi0JICogQHBhcmFtIGNvdW50IGxlbmd0aCBvZiB0aGUgcmFuZ2UKLQkgKi8KLQlwdWJsaWMgQ29tbWVudFJhbmdlKGZpbmFsIGludCBwb3NpdGlvbiwgZmluYWwgaW50IGNvdW50KSB7Ci0JCXN1cGVyKHBvc2l0aW9uLCBjb3VudCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGF0dHJpYnV0ZSA8Y29kZT5hdHRyaWJ1dGU8L2NvZGU+IHRydWU/Ci0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGdldAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPnRydWU8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0F0dHJpYnV0ZShmaW5hbCBpbnQgYXR0cmlidXRlKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgJiBhdHRyaWJ1dGUpID09IGF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoaXMgY29tbWVudCByYW5nZSBjb250YWluIGEgY2xvc2luZyBIVE1MIHRhZz8KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4gdG9rZW4gYmVsb25naW5nIHRvIHRoZSBjb21tZW50IHJhbmdlCi0JICogQHBhcmFtIHRhZyB0aGUgSFRNTCB0YWcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGNvbW1lbnQgcmFuZ2UgY29udGFpbnMgYSBjbG9zaW5nCi0JICogICAgICAgICBodG1sIHRhZywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzQ2xvc2luZ1RhZyhmaW5hbCBjaGFyW10gdG9rZW4sIGZpbmFsIGNoYXJbXSB0YWcpIHsKLQotCQlib29sZWFuIHJlc3VsdD0gKENoYXJPcGVyYXRpb24uaW5kZXhPZihIVE1MX0NMT1NFX1BSRUZJWCwgdG9rZW4sIGZhbHNlKSA9PSAwKQotCQkJCSYmIHRva2VuW3Rva2VuLmxlbmd0aCAtIDFdID09IEhUTUxfVEFHX1BPU1RGSVg7Ci0JCWlmIChyZXN1bHQpIHsKLQotCQkJc2V0QXR0cmlidXRlKENPTU1FTlRfQ0xPU0UpOwotCQkJcmVzdWx0PSBDaGFyT3BlcmF0aW9uLmVxdWFscyh0YWcsIHRva2VuLCBIVE1MX0NMT1NFX1BSRUZJWC5sZW5ndGgsIHRva2VuLmxlbmd0aCAtIDEsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhpcyBjb21tZW50IHJhbmdlIGNvbnRhaW4gYW4gb3BlbmluZyBIVE1MIHRhZz8KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4gdG9rZW4gYmVsb25naW5nIHRvIHRoZSBjb21tZW50IHJhbmdlCi0JICogQHBhcmFtIHRhZyB0aGUgSFRNTCB0YWcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGNvbW1lbnQgcmFuZ2UgY29udGFpbnMgYW4KLQkgKiAgICAgICAgIG9wZW5pbmcgaHRtbCB0YWcsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc09wZW5pbmdUYWcoZmluYWwgY2hhcltdIHRva2VuLCBmaW5hbCBjaGFyW10gdGFnKSB7Ci0KLQkJYm9vbGVhbiByZXN1bHQ9IHRva2VuLmxlbmd0aCA+IDAKLQkJCQkmJiB0b2tlblswXSA9PSBIVE1MX1RBR19QUkVGSVgKLQkJCQkmJiAoQ2hhck9wZXJhdGlvbi5pbmRleE9mKEhUTUxfQ0xPU0VfUFJFRklYLCB0b2tlbiwgZmFsc2UpICE9IDApCi0JCQkJJiYgdG9rZW5bdG9rZW4ubGVuZ3RoIC0gMV0gPT0gSFRNTF9UQUdfUE9TVEZJWDsKLQkJaWYgKHJlc3VsdCkgewotCi0JCQlzZXRBdHRyaWJ1dGUoQ09NTUVOVF9PUEVOKTsKLQkJCXJlc3VsdD0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRhZywgdG9rZW4sIGZhbHNlKSA9PSAxOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgY29tbWVudCByYW5nZSB3aXRoIHRoZSBvY2N1cnJlZCBIVE1MIHRhZ3MuCi0JICogCi0JICogQHBhcmFtIHRhZ3MgdGhlIEhUTUwgdGFncyB0byB0ZXN0IGZvciB0aGVpciBvY2N1cnJlbmNlCi0JICogQHBhcmFtIHRva2VuIHRva2VuIGJlbG9uZ2luZyB0byB0aGUgY29tbWVudCByYW5nZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgYXR0cmlidXRlIHRvIHNldCBpZiBhIEhUTUwgdGFnIGlzIHByZXNlbnQKLQkgKiBAcGFyYW0gb3BlbiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgb3BlbmluZyB0YWdzIHNob3VsZCBiZSBtYXJrZWQsCi0JICogICAgICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBjbG9zZSA8Y29kZT50cnVlPC9jb2RlPiBpZmYgY2xvc2luZyB0YWdzIHNob3VsZCBiZSBtYXJrZWQsCi0JICogICAgICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmtIdG1sVGFnKGZpbmFsIGNoYXJbXVtdIHRhZ3MsIGZpbmFsIGNoYXJbXSB0b2tlbiwgZmluYWwgaW50IGF0dHJpYnV0ZSwgZmluYWwgYm9vbGVhbiBvcGVuLCBmaW5hbCBib29sZWFuIGNsb3NlKSB7Ci0JCWlmICh0b2tlblswXSA9PSBIVE1MX1RBR19QUkVGSVggJiYgdG9rZW5bdG9rZW4ubGVuZ3RoIC0gMV0gPT0gSFRNTF9UQUdfUE9TVEZJWCkgewotCi0JCQljaGFyW10gdGFnPSBudWxsOwotCQkJYm9vbGVhbiBpc09wZW49IGZhbHNlOwotCQkJYm9vbGVhbiBpc0Nsb3NlPSBmYWxzZTsKLQotCQkJZm9yIChpbnQgaW5kZXg9IDA7IGluZGV4IDwgdGFncy5sZW5ndGg7IGluZGV4KyspIHsKLQotCQkJCXRhZz0gdGFnc1tpbmRleF07Ci0KLQkJCQlpc09wZW49IGlzT3BlbmluZ1RhZyh0b2tlbiwgdGFnKTsKLQkJCQlpc0Nsb3NlPSBpc0Nsb3NpbmdUYWcodG9rZW4sIHRhZyk7Ci0KLQkJCQlpZiAoKG9wZW4gJiYgaXNPcGVuKSB8fCAoY2xvc2UgJiYgaXNDbG9zZSkpIHsKLQotCQkJCQlzZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgY29tbWVudCByYW5nZSB3aXRoIHRoZSBvY2N1cnJlZCB0YWdzLgotCSAqIAotCSAqIEBwYXJhbSB0YWdzIHRoZSB0YWdzIHRvIHRlc3QgZm9yIHRoZWlyIG9jY3VycmVuY2UKLQkgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggd2hpY2ggaXMgY29tbW9uIHRvIGFsbCB0aGUgdGFncyB0byB0ZXN0Ci0JICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiBiZWxvbmdpbmcgdG8gdGhlIGNvbW1lbnQgcmFuZ2UKLQkgKiBAcGFyYW0gYXR0cmlidXRlIGF0dHJpYnV0ZSB0byBzZXQgaWYgYSB0YWcgaXMgcHJlc2VudAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmtQcmVmaXhUYWcoZmluYWwgY2hhcltdW10gdGFncywgZmluYWwgY2hhciBwcmVmaXgsIGZpbmFsIGNoYXJbXSB0b2tlbiwgZmluYWwgaW50IGF0dHJpYnV0ZSkgewotCi0JCWlmICh0b2tlblswXSA9PSBwcmVmaXgpIHsKLQotCQkJY2hhcltdIHRhZz0gbnVsbDsKLQkJCWZvciAoaW50IGluZGV4PSAwOyBpbmRleCA8IHRhZ3MubGVuZ3RoOyBpbmRleCsrKSB7Ci0KLQkJCQl0YWc9IHRhZ3NbaW5kZXhdOwotCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0b2tlbiwgdGFnKSkgewotCi0JCQkJCXNldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29tbWVudCByYW5nZSB3aXRoIHRoZSBIVE1MIHJhbmdlIHRhZy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIGJlbG9uZ2luZyB0byB0aGUgY29tbWVudCByYW5nZQotCSAqIEBwYXJhbSB0YWcgdGhlIEhUTUwgdGFnIHdoaWNoIGNvbmZpbmVzIHRoZSBIVE1MIHJhbmdlCi0JICogQHBhcmFtIGxldmVsIHRoZSBuZXN0aW5nIGxldmVsIG9mIHRoZSBjdXJyZW50IEhUTUwgcmFuZ2UKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQgaWYgdGhlIGNvbW1lbnQgcmFuZ2UgaXMgaW4KLQkgKiAgICAgICAgICAgICAgICB0aGUgSFRNTCByYW5nZQotCSAqIEBwYXJhbSBodG1sIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgSFRNTCB0YWdzIGluIHRoaXMgSFRNTCByYW5nZQotCSAqICAgICAgICAgICAgICAgIHNob3VsZCBiZSBtYXJrZWQgdG9vLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHJldHVybiB0aGUgbmV3IG5lc3RpbmcgbGV2ZWwgb2YgdGhlIEhUTUwgcmFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IG1hcmtUYWdSYW5nZShmaW5hbCBjaGFyW10gdG9rZW4sIGZpbmFsIGNoYXJbXSB0YWcsIGludCBsZXZlbCwgZmluYWwgaW50IGtleSwgZmluYWwgYm9vbGVhbiBodG1sKSB7Ci0KLQkJaWYgKGlzT3BlbmluZ1RhZyh0b2tlbiwgdGFnKSkgewotCQkJaWYgKGxldmVsKysgPiAwKQotCQkJCXNldEF0dHJpYnV0ZShrZXkpOwotCQl9IGVsc2UgaWYgKGlzQ2xvc2luZ1RhZyh0b2tlbiwgdGFnKSkgewotCQkJaWYgKC0tbGV2ZWwgPiAwKQotCQkJCXNldEF0dHJpYnV0ZShrZXkpOwotCQl9IGVsc2UgaWYgKGxldmVsID4gMCkgewotCQkJaWYgKGh0bWwgfHwgIWhhc0F0dHJpYnV0ZShDT01NRU5UX0hUTUwpKQotCQkJCXNldEF0dHJpYnV0ZShrZXkpOwotCQl9Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGlzIGNvbW1lbnQgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIHRoZSBkZWx0YSB0byBtb3ZlIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdmUoZmluYWwgaW50IGRlbHRhKSB7Ci0JCW9mZnNldCArPSBkZWx0YTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGF0dHJpYnV0ZSA8Y29kZT5hdHRyaWJ1dGU8L2NvZGU+IHRvIHRydWUuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgaW50IGF0dHJpYnV0ZSkgewotCQlmQXR0cmlidXRlcyB8PSBhdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogVHJpbXMgdGhpcyBjb21tZW50IHJhbmdlIGF0IHRoZSBiZWdpbm5pbmcuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGFtb3VudCB0byB0cmltIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRyaW1CZWdpbihmaW5hbCBpbnQgZGVsdGEpIHsKLQkJb2Zmc2V0ICs9IGRlbHRhOwotCQlsZW5ndGggLT0gZGVsdGE7Ci0JfQotCi0JLyoqCi0JICogVHJpbXMgdGhpcyBjb21tZW50IHJhbmdlIGF0IHRoZSBlbmQuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGFtb3VudCB0byB0cmltIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRyaW1FbmQoZmluYWwgaW50IGRlbHRhKSB7Ci0JCWxlbmd0aCArPSBkZWx0YTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlMaXN0IGF0dHJpYnV0ZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkpCi0JCQlhdHRyaWJ1dGVzLmFkZCgiQ09NTUVOVF9CTEFOS0xJTkUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaGFzQXR0cmlidXRlKENPTU1FTlRfQlJFQUspKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfQlJFQUsiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaGFzQXR0cmlidXRlKENPTU1FTlRfQ0xPU0UpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfQ0xPU0UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaGFzQXR0cmlidXRlKENPTU1FTlRfQ09ERSkpCi0JCQlhdHRyaWJ1dGVzLmFkZCgiQ09NTUVOVF9DT0RFIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX0hUTUwpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfSFRNTCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoYXNBdHRyaWJ1dGUoQ09NTUVOVF9JTU1VVEFCTEUpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfSU1NVVRBQkxFIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX05FV0xJTkUpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfTkVXTElORSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoYXNBdHRyaWJ1dGUoQ09NTUVOVF9PUEVOKSkKLQkJCWF0dHJpYnV0ZXMuYWRkKCJDT01NRU5UX09QRU4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaGFzQXR0cmlidXRlKENPTU1FTlRfUEFSQUdSQVBIKSkKLQkJCWF0dHJpYnV0ZXMuYWRkKCJDT01NRU5UX1BBUkFHUkFQSCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoYXNBdHRyaWJ1dGUoQ09NTUVOVF9QQVJBTUVURVIpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfUEFSQU1FVEVSIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX1JPT1QpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfUk9PVCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoYXNBdHRyaWJ1dGUoQ09NTUVOVF9TRVBBUkFUT1IpKQotCQkJYXR0cmlidXRlcy5hZGQoIkNPTU1FTlRfU0VQQVJBVE9SIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX0ZJUlNUX1RPS0VOKSkKLQkJCWF0dHJpYnV0ZXMuYWRkKCJDT01NRU5UX0ZJUlNUX1RPS0VOIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX1NUQVJUU19XSVRIX1JBTkdFX0RFTElNSVRFUikpCi0JCQlhdHRyaWJ1dGVzLmFkZCgiQ09NTUVOVF9TVEFSVFNfV0lUSF9SQU5HRV9ERUxJTUlURVIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigiQ29tbWVudFJhbmdlIFsiICsgb2Zmc2V0ICsgIisiICsgbGVuZ3RoICsgIl0geyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlmb3IgKEl0ZXJhdG9yIGl0PSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzdHJpbmc9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQoc3RyaW5nKTsKLQkJCWlmIChpdC5oYXNOZXh0KCkpCi0JCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCkgKyAifSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0NvbW1lbnRSZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTExNzA4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvQ29tbWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLlNjcmliZTsKLQotLyoqCi0gKiBDb21tZW50IHJlZ2lvbiBpbiBhIHNvdXJjZSBjb2RlIGRvY3VtZW50LgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50UmVnaW9uIGV4dGVuZHMgUG9zaXRpb24gaW1wbGVtZW50cyBJSHRtbFRhZ0RlbGltaXRlcnMsIElCb3JkZXJBdHRyaWJ1dGVzLCBJQ29tbWVudEF0dHJpYnV0ZXMgewotCi0JLyoqIERlZmF1bHQgY29tbWVudCByYW5nZSBkZWxpbWl0ZXIgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1JBTkdFX0RFTElNSVRFUj0gIiAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogRGVmYXVsdCBsaW5lIHByZWZpeCBsZW5ndGggKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9QUkVGSVhfTEVOR1RIPSAzOwotCi0JLyoqIFRoZSBib3JkZXJzIG9mIHRoaXMgcmVnaW9uICovCi0JcHJpdmF0ZSBpbnQgZkJvcmRlcnM9IDA7Ci0KLQkvKiogU2hvdWxkIGFsbCBibGFuayBsaW5lcyBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nPyAqLwotCXByb3RlY3RlZCBib29sZWFuIGZDbGVhcjsKLQotCS8qKiBUaGUgbGluZSBkZWxpbWl0ZXIgdXNlZCBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZkRlbGltaXRlcjsKLQotCS8qKiBUaGUgZG9jdW1lbnQgdG8gZm9ybWF0ICovCi0JcHJpdmF0ZSBmaW5hbCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JLyoqIFRoZSBsaW5lcyBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZMaW5lcz0gbmV3IExpbmtlZExpc3QoKTsKLQkKLQkvKiogVGhlIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXMgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zIHByZWZlcmVuY2VzOwotCQotCS8qKiBUaGUgY29tbWVudCByYW5nZXMgaW4gdGhpcyBjb21tZW50IHJlZ2lvbiAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUmFuZ2VzPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqIElzIHRoaXMgY29tbWVudCByZWdpb24gYSBzaW5nbGUgbGluZSByZWdpb24/ICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZTaW5nbGVMaW5lOwotCi0JLyoqIE51bWJlciBvZiBzcGFjZXMgcmVwcmVzZW50aW5nIHRhYnVsYXRvciAqLwotCXByaXZhdGUgaW50IGZUYWJTaXplOwotCi0JLyoqIHRoZSBzY3JpYmUgdXNlZCB0byBjcmVhdGUgZWRpdHMgKi8KLQlwcm90ZWN0ZWQgU2NyaWJlIHNjcmliZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29tbWVudCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB3aGljaCBjb250YWlucyB0aGUgY29tbWVudCByZWdpb24KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoaXMgY29tbWVudCByZWdpb24gaW4gdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIGZvcm1hdHRlciB0aGUgZ2l2ZW4gY29kZSBmb3JtYXR0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tbWVudFJlZ2lvbihmaW5hbCBJRG9jdW1lbnQgZG9jdW1lbnQsIGZpbmFsIFBvc2l0aW9uIHBvc2l0aW9uLCBmaW5hbCBDb2RlRm9ybWF0dGVyVmlzaXRvciBmb3JtYXR0ZXIpIHsKLQkJc3VwZXIocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQotCQl0aGlzLnByZWZlcmVuY2VzID0gZm9ybWF0dGVyLnByZWZlcmVuY2VzOwotCQlmRGVsaW1pdGVyID0gdGhpcy5wcmVmZXJlbmNlcy5saW5lX3NlcGFyYXRvcjsKLQkJZkRvY3VtZW50PSBkb2N1bWVudDsKLQkJCi0JCWZUYWJTaXplPSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnMuU1BBQ0UgPT0gdGhpcy5wcmVmZXJlbmNlcy50YWJfY2hhciA/IHRoaXMucHJlZmVyZW5jZXMuaW5kZW50YXRpb25fc2l6ZSA6IHRoaXMucHJlZmVyZW5jZXMudGFiX3NpemU7Ci0KLQkJdGhpcy5zY3JpYmUgPSBmb3JtYXR0ZXIuc2NyaWJlOwotCi0JCWZpbmFsIElMaW5lVHJhY2tlciB0cmFja2VyPSBuZXcgRGVmYXVsdExpbmVUcmFja2VyKCk7Ci0KLQkJSVJlZ2lvbiByYW5nZT0gbnVsbDsKLQkJQ29tbWVudExpbmUgbGluZT0gbnVsbDsKLQotCQl0cmFja2VyLnNldChnZXRUZXh0KDAsIGdldExlbmd0aCgpKSk7Ci0JCWZpbmFsIGludCBsaW5lcz0gdHJhY2tlci5nZXROdW1iZXJPZkxpbmVzKCk7Ci0KLQkJZlNpbmdsZUxpbmU9IGxpbmVzID09IDE7Ci0KLQkJdHJ5IHsKLQotCQkJZm9yIChpbnQgaW5kZXg9IDA7IGluZGV4IDwgbGluZXM7IGluZGV4KyspIHsKLQotCQkJCXJhbmdlPSB0cmFja2VyLmdldExpbmVJbmZvcm1hdGlvbihpbmRleCk7Ci0JCQkJbGluZT0gY3JlYXRlTGluZSgpOwotCQkJCWxpbmUuYXBwZW5kKG5ldyBDb21tZW50UmFuZ2UocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKSk7Ci0KLQkJCQlmTGluZXMuYWRkKGxpbmUpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIGNvbW1lbnQgcmFuZ2UgdG8gdGhpcyBjb21tZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmFuZ2UgY29tbWVudCByYW5nZSB0byBhcHBlbmQgdG8gdGhpcyBjb21tZW50IHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFwcGVuZChmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UpIHsKLQkJZlJhbmdlcy5hZGRMYXN0KHJhbmdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gdGhlIGNvbW1lbnQgcmFuZ2UgYmUgYXBwZW5kZWQgdG8gdGhlIGNvbW1lbnQgbGluZT8KLQkgKiAKLQkgKiBAcGFyYW0gbGluZSBjb21tZW50IGxpbmUgd2hlcmUgdG8gYXBwZW5kIHRoZSBjb21tZW50IHJhbmdlCi0JICogQHBhcmFtIHByZXZpb3VzIGNvbW1lbnQgcmFuZ2Ugd2hpY2ggaXMgdGhlIHByZWRlY2Vzc29yIG9mIHRoZSBjdXJyZW50Ci0JICogICAgICAgICAgICAgICAgY29tbWVudCByYW5nZQotCSAqIEBwYXJhbSBuZXh0IGNvbW1lbnQgcmFuZ2UgdG8gdGVzdCB3aGV0aGVyIGl0IGNhbiBiZSBhcHBlbmRlZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICBjb21tZW50IGxpbmUKLQkgKiBAcGFyYW0gaW5kZXggYW1vdW50IG9mIHNwYWNlIGluIHRoZSBjb21tZW50IGxpbmUgdXNlZCBieSBhbHJlYWR5Ci0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgY29tbWVudCByYW5nZXMKLQkgKiBAcGFyYW0gd2lkdGggdGhlIG1heGltYWwgd2lkdGggb2YgdGV4dCBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uCi0JICogICAgICAgICAgICAgICAgbWVhc3VyZWQgaW4gYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGhzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGNvbW1lbnQgcmFuZ2UgY2FuIGJlIGFkZGVkIHRvIHRoZQotCSAqICAgICAgICAgbGluZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkFwcGVuZChmaW5hbCBDb21tZW50TGluZSBsaW5lLCBmaW5hbCBDb21tZW50UmFuZ2UgcHJldmlvdXMsIGZpbmFsIENvbW1lbnRSYW5nZSBuZXh0LCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCB3aWR0aCkgewotCQlyZXR1cm4gaW5kZXggPT0gMCB8fCBpbmRleCArIG5leHQuZ2V0TGVuZ3RoKCkgPD0gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogQ2FuIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIHR3byBjb21tZW50IHJhbmdlcyBiZSBmb3JtYXR0ZWQ/Ci0JICogCi0JICogQHBhcmFtIHByZXZpb3VzIHByZXZpb3VzIGNvbW1lbnQgcmFuZ2Ugd2hpY2ggd2FzIGFscmVhZHkgZm9ybWF0dGVkLAotCSAqICAgICAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBuZXh0IG5leHQgY29tbWVudCByYW5nZSB0byBiZSBmb3JtYXR0ZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgbmV4dCBjb21tZW50IHJhbmdlIGNhbiBiZQotCSAqICAgICAgICAgZm9ybWF0dGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkZvcm1hdChmaW5hbCBDb21tZW50UmFuZ2UgcHJldmlvdXMsIGZpbmFsIENvbW1lbnRSYW5nZSBuZXh0KSB7Ci0JCXJldHVybiBwcmV2aW91cyAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGNvbW1lbnQgcmVnaW9uIHdpdGggdGhlIGdpdmVuIGluZGVudGF0aW9uIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbmRlbnRhdGlvbiBsZXZlbAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyB0ZXh0IGVkaXQgb2YgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcwotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgZmluYWwgVGV4dEVkaXQgZm9ybWF0KGludCBpbmRlbnRhdGlvbkxldmVsLCBib29sZWFuIHJldHVybkVkaXQpIHsKLQkJZmluYWwgU3RyaW5nIHByb2JlPSBnZXRUZXh0KDAsIENvbW1lbnRMaW5lLk5PTl9GT1JNQVRfU1RBUlRfUFJFRklYLmxlbmd0aCgpKTsKLQkJaWYgKCFwcm9iZS5zdGFydHNXaXRoKENvbW1lbnRMaW5lLk5PTl9GT1JNQVRfU1RBUlRfUFJFRklYKSkgewotCi0JCQlpbnQgbWFyZ2luPSB0aGlzLnByZWZlcmVuY2VzLmNvbW1lbnRfbGluZV9sZW5ndGg7Ci0JCQlTdHJpbmcgaW5kZW50YXRpb249IGNvbXB1dGVJbmRlbnRhdGlvbihpbmRlbnRhdGlvbkxldmVsKTsKLQkJCW1hcmdpbj0gTWF0aC5tYXgoQ09NTUVOVF9QUkVGSVhfTEVOR1RIICsgMSwgbWFyZ2luIC0gc3RyaW5nVG9MZW5ndGgoaW5kZW50YXRpb24pIC0gQ09NTUVOVF9QUkVGSVhfTEVOR1RIKTsKLQotCQkJdG9rZW5pemVSZWdpb24oKTsKLQkJCW1hcmtSZWdpb24oKTsKLQkJCXdyYXBSZWdpb24obWFyZ2luKTsKLQkJCWZvcm1hdFJlZ2lvbihpbmRlbnRhdGlvbiwgbWFyZ2luKTsKLQotCQl9Ci0JCWlmIChyZXR1cm5FZGl0KSB7Ci0JCQlyZXR1cm4gdGhpcy5zY3JpYmUuZ2V0Um9vdEVkaXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoaXMgY29tbWVudCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGluZGVudGF0aW9uIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGlzIGNvbW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIHdpZHRoIHRoZSBtYXhpbWFsIHdpZHRoIG9mIHRleHQgaW4gdGhpcyBjb21tZW50IHJlZ2lvbgotCSAqICAgICAgICAgICAgICAgIG1lYXN1cmVkIGluIGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRocwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFJlZ2lvbihmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24sIGZpbmFsIGludCB3aWR0aCkgewotCi0JCWZpbmFsIGludCBsYXN0PSBmTGluZXMuc2l6ZSgpIC0gMTsKLQkJaWYgKGxhc3QgPj0gMCkgewotCi0JCQlDb21tZW50TGluZSBsYXN0TGluZT0gKENvbW1lbnRMaW5lKWZMaW5lcy5nZXQobGFzdCk7Ci0JCQlDb21tZW50UmFuZ2UgbGFzdFJhbmdlPSBsYXN0TGluZS5nZXRMYXN0KCk7Ci0JCQlsYXN0TGluZS5mb3JtYXRMb3dlckJvcmRlcihsYXN0UmFuZ2UsIGluZGVudGF0aW9uLCB3aWR0aCk7Ci0KLQkJCUNvbW1lbnRMaW5lIHByZXZpb3VzOwotCQkJQ29tbWVudExpbmUgbmV4dD0gbnVsbDsKLQkJCUNvbW1lbnRSYW5nZSByYW5nZT0gbnVsbDsKLQkJCWZvciAoaW50IGxpbmU9IGxhc3Q7IGxpbmUgPj0gMDsgbGluZS0tKSB7Ci0KLQkJCQlwcmV2aW91cz0gbmV4dDsKLQkJCQluZXh0PSAoQ29tbWVudExpbmUpZkxpbmVzLmdldChsaW5lKTsKLQotCQkJCXJhbmdlPSBuZXh0LmZvcm1hdExpbmUocHJldmlvdXMsIHJhbmdlLCBpbmRlbnRhdGlvbiwgbGluZSk7Ci0JCQl9Ci0JCQluZXh0LmZvcm1hdFVwcGVyQm9yZGVyKHJhbmdlLCBpbmRlbnRhdGlvbiwgd2lkdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBkZWxpbWl0ZXIgdXNlZCBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpbmUgZGVsaW1pdGVyIGZvciB0aGlzIGNvbW1lbnQgcmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXREZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBmRGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpbmUgZGVsaW1pdGVyIHVzZWQgaW4gdGhpcyBjb21tZW50IGxpbmUgYnJlYWsuCi0JICogCi0JICogQHBhcmFtIHByZWRlY2Vzc29yIHRoZSBwcmVkZWNlc3NvciBjb21tZW50IGxpbmUgYWZ0ZXIgdGhlIGxpbmUgYnJlYWsKLQkgKiBAcGFyYW0gc3VjY2Vzc29yIHRoZSBzdWNjZXNzb3IgY29tbWVudCBsaW5lIGJlZm9yZSB0aGUgbGluZSBicmVhawotCSAqIEBwYXJhbSBwcmV2aW91cyB0aGUgY29tbWVudCByYW5nZSBhZnRlciB0aGUgbGluZSBicmVhawotCSAqIEBwYXJhbSBuZXh0IHRoZSBjb21tZW50IHJhbmdlIGJlZm9yZSB0aGUgbGluZSBicmVhawotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbiBpbmRlbnRhdGlvbiBvZiB0aGUgZm9ybWF0dGVkIGxpbmUgYnJlYWsKLQkgKiBAcmV0dXJuIHRoZSBsaW5lIGRlbGltaXRlciBmb3IgdGhpcyBjb21tZW50IGxpbmUgYnJlYWsKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlbGltaXRlcihmaW5hbCBDb21tZW50TGluZSBwcmVkZWNlc3NvciwgZmluYWwgQ29tbWVudExpbmUgc3VjY2Vzc29yLCBmaW5hbCBDb21tZW50UmFuZ2UgcHJldmlvdXMsIGZpbmFsIENvbW1lbnRSYW5nZSBuZXh0LCBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24pIHsKLQkJcmV0dXJuIGZEZWxpbWl0ZXIgKyBpbmRlbnRhdGlvbiArIHN1Y2Nlc3Nvci5nZXRDb250ZW50UHJlZml4KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmFuZ2UgZGVsaW1pdGVyIGZvciB0aGlzIGNvbW1lbnQgcmFuZ2UgYnJlYWsuCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzIHRoZSBwcmV2aW91cyBjb21tZW50IHJhbmdlIHRvIHRoZSByaWdodCBvZiB0aGUgcmFuZ2UKLQkgKiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIKLQkgKiBAcGFyYW0gbmV4dCB0aGUgbmV4dCBjb21tZW50IHJhbmdlIHRvIHRoZSBsZWZ0IG9mIHRoZSByYW5nZSBkZWxpbWl0ZXIKLQkgKiBAcmV0dXJuIHRoZSBkZWxpbWl0ZXIgZm9yIHRoaXMgY29tbWVudCByYW5nZSBicmVhawotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsaW1pdGVyKGZpbmFsIENvbW1lbnRSYW5nZSBwcmV2aW91cywgZmluYWwgQ29tbWVudFJhbmdlIG5leHQpIHsKLQkJcmV0dXJuIENPTU1FTlRfUkFOR0VfREVMSU1JVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IG9mIHRoaXMgY29tbWVudCByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2YgdGhpcyByZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1lbnQgcmFuZ2VzIGluIHRoaXMgY29tbWVudCByZWdpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21tZW50IHJhbmdlcyBpbiB0aGlzIHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaW5rZWRMaXN0IGdldFJhbmdlcygpIHsKLQkJcmV0dXJuIGZSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgbGluZXMgaW4gdGhpcyBjb21tZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBjb21tZW50IHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGZMaW5lcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIGNvbW1lbnQgcmVnaW9uIGluIHRoZSBpbmRpY2F0ZWQgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBvZmZzZXQgb2YgdGhlIGNvbW1lbnQgcmFuZ2UgdG8gcmV0cmlldmUgaW4KLQkgKiAgICAgICAgICAgICAgICBjb21tZW50IHJlZ2lvbiBjb29yZGluYXRlcwotCSAqIEBwYXJhbSBjb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tZW50IHJhbmdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGlzIGNvbW1lbnQgcmVnaW9uIGluIHRoZSBpbmRpY2F0ZWQgcmFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRleHQoZmluYWwgaW50IHBvc2l0aW9uLCBmaW5hbCBpbnQgY291bnQpIHsKLQotCQlTdHJpbmcgY29udGVudD0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWNvbnRlbnQ9IGZEb2N1bWVudC5nZXQoZ2V0T2Zmc2V0KCkgKyBwb3NpdGlvbiwgY291bnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNob3VsZCBub3QgaGFwcGVuCi0JCX0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgYm9yZGVyIDxjb2RlPmJvcmRlcjwvY29kZT4gZXhpc3Q/Ci0JICogCi0JICogQHBhcmFtIGJvcmRlciB0aGUgdHlwZSBvZiB0aGUgYm9yZGVyLCBtdXN0IGJlIGEgYm9yZGVyIGF0dHJpYnV0ZSBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNvbW1lbnRSZWdpb248L2NvZGU+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhpcyBib3JkZXIgZXhpc3RzLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0JvcmRlcihmaW5hbCBpbnQgYm9yZGVyKSB7Ci0JCXJldHVybiAoZkJvcmRlcnMgJiBib3JkZXIpID09IGJvcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSBjb21tZW50IHJhbmdlIGNvbnNpc3Qgb2YgbGV0dGVycyBhbmQgZGlnaXRzIG9ubHk/Ci0JICogCi0JICogQHBhcmFtIHJhbmdlIHRoZSBjb21tZW50IHJhbmdlIHRvIHRleHQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgY29tbWVudCByYW5nZSBjb25zaXN0cyBvZiBsZXR0ZXJzCi0JICogICAgICAgICBhbmQgZGlnaXRzIG9ubHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0FscGhhTnVtZXJpYyhmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UpIHsKLQotCQlmaW5hbCBTdHJpbmcgdG9rZW49IGdldFRleHQocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLQotCQlmb3IgKGludCBpbmRleD0gMDsgaW5kZXggPCB0b2tlbi5sZW5ndGgoKTsgaW5kZXgrKykgewotCQkJaWYgKCFTY2FubmVySGVscGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaW5kZXgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgY29tbWVudCByYW5nZSBjb250YWluIG5vIGxldHRlcnMgYW5kIGRpZ2l0cz8KLQkgKiAKLQkgKiBAcGFyYW0gcmFuZ2UgdGhlIGNvbW1lbnQgcmFuZ2UgdG8gdGV4dAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBjb21tZW50IHJhbmdlIGNvbnRhaW5zIG5vIGxldHRlcnMKLQkgKiAgICAgICAgIGFuZCBkaWdpdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc05vbkFscGhhTnVtZXJpYyhmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UpIHsKLQotCQlmaW5hbCBTdHJpbmcgdG9rZW49IGdldFRleHQocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLQotCQlmb3IgKGludCBpbmRleD0gMDsgaW5kZXggPCB0b2tlbi5sZW5ndGgoKTsgaW5kZXgrKykgewotCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNMZXR0ZXJPckRpZ2l0KHRva2VuLmNoYXJBdChpbmRleCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgYmxhbmsgbGluZXMgYmUgY2xlYXJlZCBkdXJpbmcgZm9ybWF0dGluZz8KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiBibGFuayBsaW5lcyBzaG91bGQgYmUgY2xlYXJlZCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0NsZWFyTGluZXMoKSB7Ci0JCXJldHVybiBmQ2xlYXI7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBjb21tZW50IHJlZ2lvbiBhIHNpbmdsZSBsaW5lIHJlZ2lvbj8KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIHJlZ2lvbiBpcyBzaW5nbGUgbGluZSwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1NpbmdsZUxpbmUoKSB7Ci0JCXJldHVybiBmU2luZ2xlTGluZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdGV4dCBlZGl0IG9wZXJhdGlvbiBvY2N1cnJlZCBkdXJpbmcgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2UgdGhlIGNoYW5nZWQgdGV4dAotCSAqIEBwYXJhbSBwb3NpdGlvbiBvZmZzZXQgbWVhc3VyZWQgaW4gY29tbWVudCByZWdpb24gY29vcmRpbmF0ZXMgd2hlcmUKLQkgKiAgICAgICAgICAgICAgICB0byBhcHBseSB0aGUgY2hhbmdlZCB0ZXh0Ci0JICogQHBhcmFtIGNvdW50IGxlbmd0aCBvZiB0aGUgcmFuZ2Ugd2hlcmUgdG8gYXBwbHkgdGhlIGNoYW5nZWQgdGV4dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGxvZ0VkaXQoZmluYWwgU3RyaW5nIGNoYW5nZSwgZmluYWwgaW50IHBvc2l0aW9uLCBmaW5hbCBpbnQgY291bnQpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIGludCBiYXNlPSBnZXRPZmZzZXQoKSArIHBvc2l0aW9uOwotCQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IGZEb2N1bWVudC5nZXQoYmFzZSwgY291bnQpOwotCi0JCQlpZiAoIWNoYW5nZS5lcXVhbHMoY29udGVudCkpIHsKLQkJCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJCXRoaXMuc2NyaWJlLmFkZFJlcGxhY2VFZGl0KGJhc2UsIGJhc2UgKyBjb3VudCAtIDEsIGNoYW5nZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5zY3JpYmUuYWRkSW5zZXJ0RWRpdChiYXNlLCBjaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBTaG91bGQgbm90IGhhcHBlbgotCQkJQ29tbWVudEZvcm1hdHRlclV0aWwubG9nKGV4Y2VwdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBEbyBub3RoaW5nCi0JCQlDb21tZW50Rm9ybWF0dGVyVXRpbC5sb2coZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmtzIHRoZSBjb21tZW50IHJhbmdlcyBpbiB0aGlzIGNvbW1lbnQgcmVnaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtSZWdpb24oKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJvcmRlciB0eXBlIDxjb2RlPmJvcmRlcjwvY29kZT4gdG8gdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYm9yZGVyIHRoZSB0eXBlIG9mIHRoZSBib3JkZXIuIE11c3QgYmUgYSBib3JkZXIgYXR0cmlidXRlIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+Q29tbWVudFJlZ2lvbjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRCb3JkZXIoZmluYWwgaW50IGJvcmRlcikgewotCQlmQm9yZGVycyB8PSBib3JkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGdpdmVuIGluZGVudGF0aW9uIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbmRlbnRhdGlvbiBsZXZlbAotCSAqIEByZXR1cm4gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBnaXZlbiBpbmRlbnRhdGlvbiBsZXZlbAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlSW5kZW50YXRpb24oaW50IGluZGVudGF0aW9uTGV2ZWwpIHsKLQkJaWYgKERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9ucy5UQUIgPT0gdGhpcy5wcmVmZXJlbmNlcy50YWJfY2hhcikKLQkJCXJldHVybiByZXBsaWNhdGUoIlx0IiwgaW5kZW50YXRpb25MZXZlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLlNQQUNFID09IHRoaXMucHJlZmVyZW5jZXMudGFiX2NoYXIpCi0JCQlyZXR1cm4gcmVwbGljYXRlKCIgIiwgaW5kZW50YXRpb25MZXZlbCAqIHRoaXMucHJlZmVyZW5jZXMudGFiX3NpemUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zLk1JWEVEID09IHRoaXMucHJlZmVyZW5jZXMudGFiX2NoYXIpIHsKLQkJCWludCB0YWJTaXplPSB0aGlzLnByZWZlcmVuY2VzLnRhYl9zaXplOwotCQkJaW50IGluZGVudFNpemU9IHRoaXMucHJlZmVyZW5jZXMuaW5kZW50YXRpb25fc2l6ZTsKLQkJCWludCBzcGFjZUVxdWl2YWxlbnRzPSBpbmRlbnRhdGlvbkxldmVsICogaW5kZW50U2l6ZTsKLQkJCXJldHVybiByZXBsaWNhdGUoIlx0Iiwgc3BhY2VFcXVpdmFsZW50cyAvIHRhYlNpemUpICsgcmVwbGljYXRlKCIgIiwgc3BhY2VFcXVpdmFsZW50cyAlIHRhYlNpemUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgbi10aW1lcyByZXBsaWNhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZwotCSAqIEBwYXJhbSBuIG4KLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBzdHJpbmcgbi10aW1lcyByZXBsaWNhdGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlcGxpY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbikgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKG4qc3RyaW5nLmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IG47IGkrKykKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBlcXVpdmFsZW50IGluZGVudGF0aW9uIGZvciBhIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2UgdGhlIHN0cmluZyB0byBjb21wdXRlIHRoZSBpbmRlbnRhdGlvbiBmb3IKLQkgKiBAcmV0dXJuIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHN0cmluZ1RvSW5kZW50KGZpbmFsIFN0cmluZyByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIHJlcGxpY2F0ZSgiICIsIHN0cmluZ1RvTGVuZ3RoKHJlZmVyZW5jZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gZXhwYW5kZWQgY2hhcmFjdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSBzdHJpbmcgdG8gZ2V0IHRoZSBsZW5ndGggZm9yCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gZXhwYW5kZWQgY2hhcmFjdGVycwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgc3RyaW5nVG9MZW5ndGgoZmluYWwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQlyZXR1cm4gZXhwYW5kVGFicyhyZWZlcmVuY2UpLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIEV4cGFuZHMgdGhlIGdpdmVuIHN0cmluZydzIHRhYnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0YWIgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBleHBhbmRlZCBzdHJpbmcKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZXhwYW5kVGFicyhTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBleHBhbmRlZD0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPSAwLCBuPSBzdHJpbmcubGVuZ3RoKCksIGNoYXJzPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQljaGFyIGNoPSBzdHJpbmcuY2hhckF0KGkpOwotCQkJaWYgKGNoID09ICdcdCcpIHsKLQkJCQlmb3IgKDsgY2hhcnMgPCBmVGFiU2l6ZTsgY2hhcnMrKykKLQkJCQkJZXhwYW5kZWQuYXBwZW5kKCcgJyk7Ci0JCQkJY2hhcnM9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWV4cGFuZGVkLmFwcGVuZChjaCk7Ci0JCQkJY2hhcnMrKzsKLQkJCQlpZiAoY2hhcnMgPj0gZlRhYlNpemUpCi0JCQkJCWNoYXJzPSAwOwotCQkJfQotCQkKLQkJfQotCQlyZXR1cm4gZXhwYW5kZWQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2tlbml6ZXMgdGhlIGNvbW1lbnQgcmVnaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRva2VuaXplUmVnaW9uKCkgewotCi0JCWludCBpbmRleD0gMDsKLQkJQ29tbWVudExpbmUgbGluZT0gbnVsbDsKLQotCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yPSBmTGluZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0KLQkJCWxpbmU9IChDb21tZW50TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWxpbmUuc2NhbkxpbmUoaW5kZXgpOwotCQkJbGluZS50b2tlbml6ZUxpbmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JhcHMgdGhlIGNvbW1lbnQgcmFuZ2VzIGluIHRoaXMgY29tbWVudCByZWdpb24gaW50byBjb21tZW50IGxpbmVzLgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aCB0aGUgbWF4aW1hbCB3aWR0aCBvZiB0ZXh0IGluIHRoaXMgY29tbWVudCByZWdpb24KLQkgKiAgICAgICAgICAgICAgICBtZWFzdXJlZCBpbiBhdmVyYWdlIGNoYXJhY3RlciB3aWR0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cmFwUmVnaW9uKGZpbmFsIGludCB3aWR0aCkgewotCi0JCWZMaW5lcy5jbGVhcigpOwotCi0JCWludCBpbmRleD0gMDsKLQkJYm9vbGVhbiBhZGFwdGVkPSBmYWxzZTsKLQotCQlDb21tZW50TGluZSBzdWNjZXNzb3I9IG51bGw7Ci0JCUNvbW1lbnRMaW5lIHByZWRlY2Vzc29yPSBudWxsOwotCi0JCUNvbW1lbnRSYW5nZSBwcmV2aW91cz0gbnVsbDsKLQkJQ29tbWVudFJhbmdlIG5leHQ9IG51bGw7Ci0KLQkJd2hpbGUgKCFmUmFuZ2VzLmlzRW1wdHkoKSkgewotCi0JCQlpbmRleD0gMDsKLQkJCWFkYXB0ZWQ9IGZhbHNlOwotCi0JCQlwcmVkZWNlc3Nvcj0gc3VjY2Vzc29yOwotCQkJc3VjY2Vzc29yPSBjcmVhdGVMaW5lKCk7Ci0JCQlmTGluZXMuYWRkKHN1Y2Nlc3Nvcik7Ci0KLQkJCXdoaWxlICghZlJhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCQluZXh0PSAoQ29tbWVudFJhbmdlKWZSYW5nZXMuZ2V0Rmlyc3QoKTsKLQotCQkJCWlmIChjYW5BcHBlbmQoc3VjY2Vzc29yLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIHdpZHRoKSkgewotCi0JCQkJCWlmICghYWRhcHRlZCAmJiBwcmVkZWNlc3NvciAhPSBudWxsKSB7Ci0KLQkJCQkJCXN1Y2Nlc3Nvci5hZGFwdChwcmVkZWNlc3Nvcik7Ci0JCQkJCQlhZGFwdGVkPSB0cnVlOwotCQkJCQl9Ci0KLQkJCQkJZlJhbmdlcy5yZW1vdmVGaXJzdCgpOwotCQkJCQlzdWNjZXNzb3IuYXBwZW5kKG5leHQpOwotCi0JCQkJCWluZGV4ICs9IChuZXh0LmdldExlbmd0aCgpICsgMSk7Ci0JCQkJCXByZXZpb3VzPSBuZXh0OwotCQkJCX0gZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGluZSBmb3IgdGhpcyByZWdpb24uCi0JICogCi0JICogQHJldHVybiBhIG5ldyBsaW5lIGZvciB0aGlzIHJlZ2lvbgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudExpbmUgY3JlYXRlTGluZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVDb21tZW50TGluZSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0hUTUxFbnRpdHkySmF2YVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9IVE1MRW50aXR5MkphdmFSZWFkZXIuamF2YQppbmRleCA1Yzc1YTQyLi43MWY5M2Y1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0hUTUxFbnRpdHkySmF2YVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSFRNTEVudGl0eTJKYXZhUmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsMTQgKzIyLDE0IEBACiAgKiA8Y29kZT5TdWJzdGl0dXRpb25UZXh0UmVhZGVyPC9jb2RlPiB0aGF0IHdpbGwgc3Vic3RpdHV0ZSBwbGFpbiB0ZXh0IHZhbHVlcwogICogZm9yIGh0bWwgZW50aXRpZXMgZW5jb3VudGVyZWQgaW4gdGhlIG9yaWdpbmFsIHRleHQuIExpbmUgYnJlYWtzIGFuZAogICogd2hpdGVzcGFjZSBhcmUgcHJlc2VydmVkLgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgSFRNTEVudGl0eTJKYXZhUmVhZGVyIGV4dGVuZHMgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciB7CiAKIAkvKiogVGhlIGhhcmQtY29kZWQgZW50aXR5IG1hcC4gKi8KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmdFbnRpdHlMb29rdXA7Ci0JCisKIAlzdGF0aWMgewogCQlmZ0VudGl0eUxvb2t1cD0gbmV3IEhhc2hNYXAoNyk7CiAJCWZnRW50aXR5TG9va3VwLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTQzLDcgKzQzLDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCB3aWxsIHJlYWQgZnJvbSA8Y29kZT5yZWFkZXI8L2NvZGU+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcmVhZGVyIHRoZSBzb3VyY2UgcmVhZGVyCiAJICovCiAJcHVibGljIEhUTUxFbnRpdHkySmF2YVJlYWRlcihSZWFkZXIgcmVhZGVyKSB7CkBAIC02Myw3ICs2Myw3IEBACiAJLyoqCiAJICogUmVwbGFjZXMgYW4gSFRNTCBlbnRpdHkgYm9keSAod2l0aG91dCAmYW1wOyBhbmQgOykgd2l0aCBpdHMKIAkgKiBwbGFpbi90ZXh0IChvciBwbGFpbi9qYXZhKSBjb3VudGVycGFydC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzeW1ib2wgdGhlIGVudGl0eSBib2R5IHRvIHJlc29sdmUKIAkgKiBAcmV0dXJuIHRoZSBwbGFpbi90ZXh0IGNvdW50ZXJwYXJ0IG9mIDxjb2RlPnN5bWJvbDwvY29kZT4KIAkgKi8KQEAgLTkyLDcgKzkyLDcgQEAKIAkvKioKIAkgKiBSZWFkcyBhbiBIVE1MIGVudGl0eSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHBsYWluL3RleHQKIAkgKiBjb3VudGVycGFydC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYW4gZW50aXR5IHJlYWQgZnJvbSB0aGUgc3RyZWFtLCBvciB0aGUgc3RyZWFtIGNvbnRlbnQuCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyByZWFkZXIgdGhyb3dzIG9uZQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9JQm9yZGVyQXR0cmlidXRlcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9JQm9yZGVyQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTNiYzkwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSUJvcmRlckF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudDsKLQotLyoqCi0gKiBDb21tZW50IHJlZ2lvbiBib3JkZXIgYXR0cmlidXRlcy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCb3JkZXJBdHRyaWJ1dGVzIHsKLQotCS8qKiBSZWdpb24gaGFzIGxvd2VyIGJvcmRlciBhdHRyaWJ1dGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfTE9XRVI9IDEgPDwgMDsKLQotCS8qKiBSZWdpb24gaGFzIHVwcGVyIGJvcmRlciBhdHRyaWJ1dGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfVVBQRVI9IDEgPDwgMTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSUNvbW1lbnRBdHRyaWJ1dGVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0lDb21tZW50QXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE2NmI3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSUNvbW1lbnRBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQ7Ci0KLS8qKgotICogR2VuZXJhbCBjb21tZW50IHJhbmdlIGF0dHJpYnV0ZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWVudEF0dHJpYnV0ZXMgewotCi0JLyoqIFJhbmdlIGhhcyBibGFuayBsaW5lIGF0dHJpYnV0ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfQkxBTktMSU5FPSAxIDw8IDE7Ci0KLQkvKiogUmFuZ2UgaGFzIGxpbmUgYnJlYWsgYXR0cmlidXRlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9CUkVBSz0gMSA8PCAyOwotCi0JLyoqIFJhbmdlIGhhcyBjbG9zZSB0YWcgYXR0cmlidXRlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9DTE9TRT0gMSA8PCAzOwotCi0JLyoqIFJhbmdlIGhhcyBzb3VyY2UgY29kZSBhdHRyaWJ1dGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX0NPREU9IDEgPDwgNDsKLQotCS8qKiBSYW5nZSBoYXMgaHRtbCB0YWcgYXR0cmlidXRlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9IVE1MPSAxIDw8IDU7Ci0KLQkvKiogUmFuZ2UgaGFzIHRoZSBpbW11dGFibGUgcmVnaW9uIGF0dHJpYnV0ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfSU1NVVRBQkxFPSAxIDw8IDY7Ci0KLQkvKiogUmFuZ2UgaGFzIG5ldyBsaW5lIGF0dHJpYnV0ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfTkVXTElORT0gMSA8PCA3OwotCi0JLyoqIFJhbmdlIGhhcyBvcGVuIHRhZyBhdHRyaWJ1dGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX09QRU49IDEgPDwgODsKLQotCS8qKiBSYW5nZSBoYXMgcGFyYWdyYXBoIGF0dHJpYnV0ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfUEFSQUdSQVBIPSAxIDw8IDk7Ci0KLQkvKiogUmFuZ2UgaGFzIHBhcmFtZXRlciB0YWcgYXR0cmlidXRlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9QQVJBTUVURVI9IDEgPDwgMTA7Ci0KLQkvKiogUmFuZ2UgaGFzIHJvb3QgdGFnIGF0dHJpYnV0ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfUk9PVD0gMSA8PCAxMTsKLQotCS8qKiBSYW5nZSBoYXMgcGFyYWdyYXBoIHNlcGFyYXRvciBhdHRyaWJ1dGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX1NFUEFSQVRPUj0gMSA8PCAxMjsKLQotCS8qKiBSYW5nZSBpcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGxpbmUgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRfRklSU1RfVE9LRU49IDEgPDwgMTM7Ci0JCi0JLyoqCi0JICogUmFuZ2Ugd2FzIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UgLyBsaW5lIGRlbGltaXRlcnMKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9TVEFSVFNfV0lUSF9SQU5HRV9ERUxJTUlURVI9IDEgPDwgMTQ7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0lIdG1sVGFnRGVsaW1pdGVycy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9JSHRtbFRhZ0RlbGltaXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1MjIxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0lIdG1sVGFnRGVsaW1pdGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50OwotCi0vKioKLSAqIEh0bWwgdGFnIGNvbnN0YW50cy4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIdG1sVGFnRGVsaW1pdGVycyB7Ci0KLQkvKiogSHRtbCB0YWcgY2xvc2UgcHJlZml4ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSFRNTF9DTE9TRV9QUkVGSVg9ICI8LyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIEh0bWwgdGFnIHBvc3RmaXggKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSFRNTF9UQUdfUE9TVEZJWD0gJz4nOwotCi0JLyoqIEh0bWwgdGFnIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBIVE1MX1RBR19QUkVGSVg9ICc8JzsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSUphdmFEb2NUYWdDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSUphdmFEb2NUYWdDb25zdGFudHMuamF2YQppbmRleCBhMThjMDM0Li44YTlhZmQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0lKYXZhRG9jVGFnQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9JSmF2YURvY1RhZ0NvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDExICsxMywxNyBAQAogCiAvKioKICAqIEphdmFkb2MgdGFnIGNvbnN0YW50cy4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSmF2YURvY1RhZ0NvbnN0YW50cyB7CiAKKwkvKiogSmF2YWRvYyBzaW5nbGUgYnJlYWsgdGFnICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBKQVZBRE9DX1NJTkdMRV9CUkVBS19UQUc9IG5ldyBjaGFyW11bXSB7ICJiciIudG9DaGFyQXJyYXkoKSB9OyAvLyROT04tTkxTLTEkCisKKwkvKiogSmF2YWRvYyBjb2RlIHRhZ3MgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIEpBVkFET0NfQ09ERV9UQUdTPSBuZXcgY2hhcltdW10geyAicHJlIi50b0NoYXJBcnJheSgpIH07IC8vJE5PTi1OTFMtMSQKKwogCS8qKiBKYXZhZG9jIGJyZWFrIHRhZ3MgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIEpBVkFET0NfQlJFQUtfVEFHUyA9IG5ldyBjaGFyW11bXSB7CiAJCSJkZCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJApAQCAtMjUsNyArMzEsNiBAQAogCQkibGkiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKIAkJInRkIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCiAJCSJ0aCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkidHIiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKIAkJImgxIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCiAJCSJoMiIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAogCQkiaDMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKQEAgLTM1LDEyICs0MCw2IEBACiAJCSJxIi50b0NoYXJBcnJheSgpIC8vJE5PTi1OTFMtMSQKIAl9OwogCi0JLyoqIEphdmFkb2Mgc2luZ2xlIGJyZWFrIHRhZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHPSBuZXcgY2hhcltdW10geyAiYnIiLnRvQ2hhckFycmF5KCkgfTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIEphdmFkb2MgY29kZSB0YWdzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBKQVZBRE9DX0NPREVfVEFHUz0gbmV3IGNoYXJbXVtdIHsgInByZSIudG9DaGFyQXJyYXkoKSB9OyAvLyROT04tTkxTLTEkCi0KIAkvKiogSmF2YWRvYyBpbW11dGFibGUgdGFncyAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gSkFWQURPQ19JTU1VVEFCTEVfVEFHUz0gbmV3IGNoYXJbXVtdIHsKIAkJCSJjb2RlIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCkBAIC02OCw2ICs2Nyw4IEBACiAJfTsKIAogCS8qKiBKYXZhZG9jIHBhcmFtZXRlciB0YWdzICovCisJLy8gVE9ETyAoZnJlZGVyaWMpIHNob3VsZCBoYXZlIGFub3RoZXIgbmFtZSB0aGFuICdwYXJhbScgZm9yIHRoZSBmb2xsb3dpbmcgdGFncworCS8vIFRPRE8gKGZyZWRlcmljKSBpbnZlc3RpZ2F0ZSBob3cgYW5kIHdoeSB0aGlzIGxpc3Qgd2FzIGNyZWF0ZWQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIEpBVkFET0NfUEFSQU1fVEFHUz0gbmV3IGNoYXJbXVtdIHsKIAkJCSJAZXhjZXB0aW9uIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCiAJCQkiQHBhcmFtIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCkBAIC04Myw3ICs4NCw5IEBACiAJCQkicCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAogCQkJInByZSIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAogCQkJInVsIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCQkib2wiLnRvQ2hhckFycmF5KCkgLy8kTk9OLU5MUy0xJAorCQkJIm9sIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCQkidGFibGUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCSJ0ciIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAogCX07CiAKIAkvKiogSmF2YWRvYyB0YWcgcHJlZml4ICovCkBAIC05Nyw3ICsxMDAsNyBAQAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gTElOS19UQUdfUFJFRklYPSBMSU5LX1RBR19QUkVGSVhfU1RSSU5HLnRvQ2hhckFycmF5KCk7CiAKLQkKKwogCS8qKiBDb21tZW50IHJvb3QgdGFncyAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gQ09NTUVOVF9ST09UX1RBR1M9IG5ldyBjaGFyW11bXSB7CiAJCQkiQGRlcHJlY2F0ZWQiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKQEAgLTEwOCw0ICsxMTEsMzQgQEAKIAogCS8qKiBUYWcgcHJlZml4IG9mIGNvbW1lbnQgdGFncyAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDT01NRU5UX1RBR19QUkVGSVg9ICdAJzsKKworCS8qKiBCTE9DSyBDT01NRU5UUyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0NLX0hFQURFUiA9ICIvKiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DS19IRUFERVJfTEVOR1RIID0gQkxPQ0tfSEVBREVSLmxlbmd0aCgpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFET0NfSEVBREVSID0gIi8qKiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX0hFQURFUl9MRU5HVEggPSBKQVZBRE9DX0hFQURFUi5sZW5ndGgoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19MSU5FX1BSRUZJWCA9ICIgKiAiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfTElORV9QUkVGSVhfTEVOR1RIID0gQkxPQ0tfTElORV9QUkVGSVgubGVuZ3RoKCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfRk9PVEVSID0gIiovIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMT0NLX0ZPT1RFUl9MRU5HVEggPSBCTE9DS19GT09URVIubGVuZ3RoKCk7CisKKwkvKiogTElORSBDT01NRU5UUyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfQ09NTUVOVF9QUkVGSVggPSAiLy8gIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVfQ09NTUVOVF9QUkVGSVhfTEVOR1RIID0gTElORV9DT01NRU5UX1BSRUZJWC5sZW5ndGgoKTsKKworCS8qKiBKQVZBRE9DIFNUQVIgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBRE9DX1NUQVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKKworCS8qCisJICogIFRhZ3MgSURzCisJICovCisJc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX1RBR1NfSU5ERVhfTUFTSyA9IDB4RkZGRjsKKwlzdGF0aWMgZmluYWwgaW50IEpBVkFET0NfVEFHU19JRF9NQVNLID0gMHhGRjAwOworCXN0YXRpYyBmaW5hbCBpbnQgSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHX0lEID0gMHgxMDA7CisJc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX0NPREVfVEFHU19JRCA9IDB4MjAwOworCXN0YXRpYyBmaW5hbCBpbnQgSkFWQURPQ19CUkVBS19UQUdTX0lEID0gMHg0MDA7CisJc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX0lNTVVUQUJMRV9UQUdTX0lEID0gMHg4MDA7CisJc3RhdGljIGZpbmFsIGludCBKQVZBRE9DX1NFUEFSQVRPUl9UQUdTX0lEID0gMHgxMDAwOworCXN0YXRpYyBmaW5hbCBpbnQgSkFWQURPQ19TSU5HTEVfVEFHU19JRCA9IEpBVkFET0NfU0lOR0xFX0JSRUFLX1RBR19JRDsgLy8gSUQgbWF4IGZvciB0YWdzIElEIHdpdGggbm8gb3BlbmluZy9jbG9zaW5nIChlLmcuIDxibGE+Li4uLjwvYmxhPikKKwlzdGF0aWMgZmluYWwgaW50IEpBVkFET0NfQ0xPU0VEX1RBRyA9IDB4MTAwMDA7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0phdmEySFRNTEVudGl0eVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9KYXZhMkhUTUxFbnRpdHlSZWFkZXIuamF2YQppbmRleCBhM2Q2N2ZlLi41NTA5NGRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0phdmEySFRNTEVudGl0eVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSmF2YTJIVE1MRW50aXR5UmVhZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsMjIgKzE2LDI4IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiAKIC8qKgogICogPGNvZGU+U3Vic3RpdHV0aW9uVGV4dFJlYWRlcjwvY29kZT4gdGhhdCB3aWxsIHN1YnN0aXR1dGUgaHRtbCBlbnRpdGllcyBmb3IKICAqIGh0bWwgc3ltYm9scyBlbmNvdW50ZXJlZCBpbiB0aGUgb3JpZ2luYWwgdGV4dC4gTGluZSBicmVha3MgYW5kIHdoaXRlc3BhY2VzCiAgKiBhcmUgcHJlc2VydmVkLgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgSmF2YTJIVE1MRW50aXR5UmVhZGVyIGV4dGVuZHMgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciB7Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU5fTElORSA9IDB4MDE7CiAKIAkvKiogVGhlIGhhcmRjb2RlZCBlbnRpdHkgbWFwLiAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmZ0VudGl0eUxvb2t1cDsKLQkKKworCS8qKgorCSAqIFRydWUgaWYgd2UgaGF2ZSBub3QgeWV0IHNlZW4gYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24gdGhlIGN1cnJlbnQKKwkgKiBsaW5lLgorCSAqLworCXByaXZhdGUgaW50IGJpdHMgPSBCRUdJTl9MSU5FOworCiAJc3RhdGljIHsKIAkJZmdFbnRpdHlMb29rdXA9IG5ldyBIYXNoTWFwKDcpOwogCQlmZ0VudGl0eUxvb2t1cC5wdXQoIjwiLCAiJmx0OyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTQyLDExICs0OCw5IEBACiAJCWZnRW50aXR5TG9va3VwLnB1dCgiXCIiLCAiJnF1b3Q7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgaW50IGJpdHMgPSBCRUdJTl9MSU5FOwotCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB0aGF0IHdpbGwgcmVhZCBmcm9tIDxjb2RlPnJlYWRlcjwvY29kZT4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSByZWFkZXIgdGhlIHNvdXJjZSByZWFkZXIKIAkgKi8KIAlwdWJsaWMgSmF2YTJIVE1MRW50aXR5UmVhZGVyKFJlYWRlciByZWFkZXIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSmF2YURvY0xpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSmF2YURvY0xpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0MmRlNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L0phdmFEb2NMaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQ7Ci0KLS8qKgotICogSmF2YWRvYyBjb21tZW50IGxpbmUgaW4gYSBjb21tZW50IHJlZ2lvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURvY0xpbmUgZXh0ZW5kcyBNdWx0aUNvbW1lbnRMaW5lIHsKLQotCS8qKiBMaW5lIHByZWZpeCBvZiBqYXZhZG9jIHN0YXJ0IGxpbmVzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQURPQ19TVEFSVF9QUkVGSVg9ICIvKioiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGphdmFkb2MgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uIGNvbW1lbnQgcmVnaW9uIHRvIGNyZWF0ZSB0aGUgbGluZSBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YURvY0xpbmUoZmluYWwgQ29tbWVudFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIocmVnaW9uKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjZm9ybWF0VXBwZXJCb3JkZXIob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VXBwZXJCb3JkZXIoZmluYWwgQ29tbWVudFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24sIGZpbmFsIGludCBsZW5ndGgpIHsKLQotCQlmaW5hbCBDb21tZW50UmVnaW9uIHBhcmVudD0gZ2V0UGFyZW50KCk7Ci0KLQkJaWYgKHBhcmVudC5pc1NpbmdsZUxpbmUoKSAmJiBwYXJlbnQuZ2V0U2l6ZSgpID09IDEpIHsKLQkJCXBhcmVudC5sb2dFZGl0KGdldFN0YXJ0aW5nUHJlZml4KCkgKyBDb21tZW50UmVnaW9uLkNPTU1FTlRfUkFOR0VfREVMSU1JVEVSLCAwLCByYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuZm9ybWF0VXBwZXJCb3JkZXIocmFuZ2UsIGluZGVudGF0aW9uLCBsZW5ndGgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSNnZXRTdGFydGluZ1ByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdGFydGluZ1ByZWZpeCgpIHsKLQkJcmV0dXJuIEpBVkFET0NfU1RBUlRfUFJFRklYOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvSmF2YURvY1JlZ2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9KYXZhRG9jUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDkzYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9KYXZhRG9jUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlclZpc2l0b3I7Ci0KLQotLyoqCi0gKiBKYXZhZG9jIHJlZ2lvbiBpbiBhIHNvdXJjZSBjb2RlIGRvY3VtZW50LgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRG9jUmVnaW9uIGV4dGVuZHMgTXVsdGlDb21tZW50UmVnaW9uIGltcGxlbWVudHMgSUphdmFEb2NUYWdDb25zdGFudHMgewotCi0JLyoqIFRoZSBwb3NpdGlvbnMgb2YgY29kZSByYW5nZXMgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBmQ29kZVBvc2l0aW9ucz0gbmV3IEFycmF5TGlzdCgpOwotCSAKLQkvKiogU2hvdWxkIEhUTUwgdGFncyBiZSBmb3JtYXR0ZWQ/ICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZGb3JtYXRIdG1sOwotCi0JLyoqIFNob3VsZCBzb3VyY2UgY29kZSByZWdpb25zIGJlIGZvcm1hdHRlZD8gKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZkZvcm1hdFNvdXJjZTsKLQkKLSAJLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBKYXZhZG9jIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21tZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhpcyBjb21tZW50IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gZm9ybWF0dGVyIHRoZSBnaXZlbiBmb3JtYXR0ZXIKLQkgKi8JCi0JcHVibGljIEphdmFEb2NSZWdpb24oZmluYWwgSURvY3VtZW50IGRvY3VtZW50LCBmaW5hbCBQb3NpdGlvbiBwb3NpdGlvbiwgZmluYWwgQ29kZUZvcm1hdHRlclZpc2l0b3IgZm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBwb3NpdGlvbiwgZm9ybWF0dGVyKTsKLQotCQlmRm9ybWF0U291cmNlID0gdGhpcy5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9zb3VyY2U7Ci0JCWZGb3JtYXRIdG1sID0gdGhpcy5wcmVmZXJlbmNlcy5jb21tZW50X2Zvcm1hdF9odG1sOwotCQlmQ2xlYXIgPSB0aGlzLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmVnaW9uI2NhbkZvcm1hdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmFuZ2UsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSYW5nZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Gb3JtYXQoZmluYWwgQ29tbWVudFJhbmdlIHByZXZpb3VzLCBmaW5hbCBDb21tZW50UmFuZ2UgbmV4dCkgewotCQkKLQkJaWYgKHByZXZpb3VzICE9IG51bGwpIHsKLQkJCQotCQkJZmluYWwgYm9vbGVhbiBpc0N1cnJlbnRDb2RlPSBuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0NPREUpOwotCQkJZmluYWwgYm9vbGVhbiBpc0xhc3RDb2RlPSBwcmV2aW91cy5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9DT0RFKTsKLQkJCQotCQkJZmluYWwgaW50IGJhc2U9IGdldE9mZnNldCgpOwotCQkJCi0JCQlpZiAoIWlzTGFzdENvZGUgJiYgaXNDdXJyZW50Q29kZSkKLQkJCQlmQ29kZVBvc2l0aW9ucy5hZGQobmV3IFBvc2l0aW9uKGJhc2UgKyBwcmV2aW91cy5nZXRPZmZzZXQoKSkpOwotCQkJZWxzZSBpZiAoaXNMYXN0Q29kZSAmJiAhaXNDdXJyZW50Q29kZSkKLQkJCQlmQ29kZVBvc2l0aW9ucy5hZGQobmV3IFBvc2l0aW9uKGJhc2UgKyBuZXh0LmdldE9mZnNldCgpICsgbmV4dC5nZXRMZW5ndGgoKSkpOwotCQkJCi0JCQlpZiAocHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfSU1NVVRBQkxFKSAmJiBuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSZWdpb24jZm9ybWF0UmVnaW9uKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRSZWdpb24oZmluYWwgU3RyaW5nIGluZGVudGF0aW9uLCBmaW5hbCBpbnQgd2lkdGgpIHsKLQkKLQkJc3VwZXIuZm9ybWF0UmVnaW9uKGluZGVudGF0aW9uLCB3aWR0aCk7Ci0JCQotCQlpZiAoZkZvcm1hdFNvdXJjZSkgewotCQkJCi0JCQl0cnkgewotCQkJCQotCQkJCWlmIChmQ29kZVBvc2l0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJCQotCQkJCQlpbnQgYmVnaW49IDA7Ci0JCQkJCWludCBlbmQ9IDA7Ci0JCQkJCQotCQkJCQlQb3NpdGlvbiBwb3NpdGlvbj0gbnVsbDsKLQkJCQkJCi0JCQkJCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudD0gZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGluZGV4PSBmQ29kZVBvc2l0aW9ucy5zaXplKCkgLSAxOyBpbmRleCA+PSAwOykgewotCQkJCQkJCi0JCQkJCQlwb3NpdGlvbj0gKFBvc2l0aW9uKWZDb2RlUG9zaXRpb25zLmdldChpbmRleC0tKTsKLQkJCQkJCWJlZ2luPSBwb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQkJCQotCQkJCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQkJCQlwb3NpdGlvbj0gKFBvc2l0aW9uKWZDb2RlUG9zaXRpb25zLmdldChpbmRleC0tKTsKLQkJCQkJCQllbmQ9IHBvc2l0aW9uLmdldE9mZnNldCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvKiAKLQkJCQkJCQkgKiBIYW5kbGUgbWlzc2luZyBjbG9zaW5nIHRhZwotCQkJCQkJCSAqIHNlZTogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3MDExCi0JCQkJCQkJICovCi0JCQkJCQkJcG9zaXRpb249IG51bGw7Ci0JCQkJCQkJZW5kPSBnZXRPZmZzZXQoKSArIGdldExlbmd0aCgpIC0gTXVsdGlDb21tZW50TGluZS5NVUxUSV9DT01NRU5UX0VORF9QUkVGSVgudHJpbSgpLmxlbmd0aCgpOwotCQkJCQkJCXdoaWxlIChlbmQgPiBiZWdpbiAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShkb2N1bWVudC5nZXRDaGFyKGVuZCAtIDEpKSkKLQkJCQkJCQkJZW5kLS07Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCVN0cmluZyBzbmlwcGV0PSBkb2N1bWVudC5nZXQoYmVnaW4sIGVuZCAtIGJlZ2luKTsKLQkJCQkJCXNuaXBwZXQ9IHByZXByb2Nlc3NDb2RlU25pcHBldChzbmlwcGV0KTsKLQkJCQkJCXNuaXBwZXQ9IGZvcm1hdENvZGVTbmlwcGV0KHNuaXBwZXQpOwotCQkJCQkJc25pcHBldD0gcG9zdHByb2Nlc3NDb2RlU25pcHBldChzbmlwcGV0LCBpbmRlbnRhdGlvbik7Ci0JCQkJCQkKLQkJCQkJCWxvZ0VkaXQoc25pcHBldCwgYmVnaW4gLSBnZXRPZmZzZXQoKSwgZW5kIC0gYmVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIENhbiBub3QgaGFwcGVuCi0JCQkJQ29tbWVudEZvcm1hdHRlclV0aWwubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlcHJvY2VzcyBhIGdpdmVuIGNvZGUgc25pcHBldC4KLQkgKiAKLQkgKiBAcGFyYW0gc25pcHBldCB0aGUgY29kZSBzbmlwcGV0Ci0JICogQHJldHVybiB0aGUgcHJlcHJvY2Vzc2VkIGNvZGUgc25pcHBldAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByZXByb2Nlc3NDb2RlU25pcHBldChTdHJpbmcgc25pcHBldCkgewotCQkvLyBzdHJpcCBjb250ZW50IHByZWZpeAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUlMaW5lVHJhY2tlciB0cmFja2VyPSBuZXcgRGVmYXVsdExpbmVUcmFja2VyKCk7Ci0JCVN0cmluZyBjb250ZW50UHJlZml4PSBNdWx0aUNvbW1lbnRMaW5lLk1VTFRJX0NPTU1FTlRfQ09OVEVOVF9QUkVGSVgudHJpbSgpOwotCQkKLQkJYnVmZmVyLnNldExlbmd0aCgwKTsKLQkJYnVmZmVyLmFwcGVuZChzbmlwcGV0KTsKLQkJdHJhY2tlci5zZXQoc25pcHBldCk7Ci0JCWZvciAoaW50IGxpbmU9IHRyYWNrZXIuZ2V0TnVtYmVyT2ZMaW5lcygpIC0gMTsgbGluZSA+IDA7IGxpbmUtLSkgewotCQkJaW50IGxpbmVPZmZzZXQ7Ci0JCQl0cnkgewotCQkJCWxpbmVPZmZzZXQ9IHRyYWNrZXIuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBDYW4gbm90IGhhcHBlbgotCQkJCUNvbW1lbnRGb3JtYXR0ZXJVdGlsLmxvZyhlKTsKLQkJCQlyZXR1cm4gc25pcHBldDsKLQkJCX0KLQkJCWludCBwcmVmaXhPZmZzZXQ9IGJ1ZmZlci5pbmRleE9mKGNvbnRlbnRQcmVmaXgsIGxpbmVPZmZzZXQpOwotCQkJaWYgKHByZWZpeE9mZnNldCA+PSAwICYmIGJ1ZmZlci5zdWJzdHJpbmcobGluZU9mZnNldCwgcHJlZml4T2Zmc2V0KS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlidWZmZXIuZGVsZXRlKGxpbmVPZmZzZXQsIHByZWZpeE9mZnNldCArIGNvbnRlbnRQcmVmaXgubGVuZ3RoKCkgKyAxKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbnZlcnRIdG1sMkphdmEoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdCB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0Ci0JICogCi0JICogQHBhcmFtIHNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAotCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBjb2RlIHNuaXBwZXQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRDb2RlU25pcHBldChTdHJpbmcgc25pcHBldCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlcj0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihnZXREb2N1bWVudCgpKTsKLQkJVGV4dEVkaXQgZWRpdD0gQ29tbWVudEZvcm1hdHRlclV0aWwuZm9ybWF0MihDb2RlRm9ybWF0dGVyLktfVU5LTk9XTiwgc25pcHBldCwgMCwgbGluZURlbGltaXRlciwgdGhpcy5wcmVmZXJlbmNlcy5nZXRNYXAoKSk7Ci0JCWlmIChlZGl0ICE9IG51bGwpCi0JCQlzbmlwcGV0PSBDb21tZW50Rm9ybWF0dGVyVXRpbC5ldmFsdWF0ZUZvcm1hdHRlckVkaXQoc25pcHBldCwgZWRpdCwgbnVsbCk7Ci0JCXJldHVybiBzbmlwcGV0OwotCX0KLQotCS8qKgotCSAqIFBvc3Rwcm9jZXNzZXMgdGhlIGdpdmVuIGNvZGUgc25pcHBldCB3aXRoIHRoZSBnaXZlbiBpbmRlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc25pcHBldCB0aGUgY29kZSBzbmlwcGV0Ci0JICogQHBhcmFtIGluZGVudGF0aW9uIHRoZSBpbmRlbnRhdGlvbgotCSAqIEByZXR1cm4gdGhlIHBvc3Rwcm9jZXNzZWQgY29kZSBzbmlwcGV0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcG9zdHByb2Nlc3NDb2RlU25pcHBldChTdHJpbmcgc25pcHBldCwgU3RyaW5nIGluZGVudGF0aW9uKSB7Ci0JCS8vIHBhdGNoIGNvbnRlbnQgcHJlZml4Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSUxpbmVUcmFja2VyIHRyYWNrZXI9IG5ldyBEZWZhdWx0TGluZVRyYWNrZXIoKTsKLQkJU3RyaW5nIHBhdGNoPSBpbmRlbnRhdGlvbiArIE11bHRpQ29tbWVudExpbmUuTVVMVElfQ09NTUVOVF9DT05URU5UX1BSRUZJWDsKLQotCQkvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCi0JCWludCBpPSBzbmlwcGV0Lmxlbmd0aCgpOwotCQl3aGlsZSAoaSA+IDAgJiYgJyAnID09IHNuaXBwZXQuY2hhckF0KGktMSkpCi0JCQlpLS07Ci0JCXNuaXBwZXQ9IHNuaXBwZXQuc3Vic3RyaW5nKDAsIGkpOwotCQkKLQkJYnVmZmVyLnNldExlbmd0aCgwKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXI9IGdldERlbGltaXRlcigpOwotCQlpZiAobGluZURlbGltaXRlciAhPSBudWxsICYmIHNuaXBwZXQuaW5kZXhPZihsaW5lRGVsaW1pdGVyKSAhPSAwKQotCQkJYnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJYnVmZmVyLmFwcGVuZChjb252ZXJ0SmF2YTJIdG1sKHNuaXBwZXQpKTsKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCAmJiBzbmlwcGV0Lmxhc3RJbmRleE9mKGxpbmVEZWxpbWl0ZXIpICE9IHNuaXBwZXQubGVuZ3RoKCkgLSBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKQotCQkJYnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJdHJhY2tlci5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkKLQkJZm9yIChpbnQgbGluZT0gdHJhY2tlci5nZXROdW1iZXJPZkxpbmVzKCkgLSAxOyBsaW5lID4gMDsgbGluZS0tKQotCQkJdHJ5IHsKLQkJCQlidWZmZXIuaW5zZXJ0KHRyYWNrZXIuZ2V0TGluZU9mZnNldChsaW5lKSwgcGF0Y2gpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIENhbiBub3QgaGFwcGVuCi0JCQkJQ29tbWVudEZvcm1hdHRlclV0aWwubG9nKGUpOwotCQkJCXJldHVybiBzbmlwcGV0OwotCQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5NdWx0aUNvbW1lbnRSZWdpb24jbWFya0h0bWxSYW5nZXMoKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmtIdG1sUmFuZ2VzKCkgewotCi0JCW1hcmtUYWdSYW5nZXMoSkFWQURPQ19JTU1VVEFCTEVfVEFHUywgQ09NTUVOVF9JTU1VVEFCTEUsIHRydWUpOwotCi0JCWlmIChmRm9ybWF0U291cmNlKQotCQkJbWFya1RhZ1JhbmdlcyhKQVZBRE9DX0NPREVfVEFHUywgQ09NTUVOVF9DT0RFLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50Lk11bHRpQ29tbWVudFJlZ2lvbiNtYXJrSHRtbFRhZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmFuZ2UsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWFya0h0bWxUYWcoZmluYWwgQ29tbWVudFJhbmdlIHJhbmdlLCBmaW5hbCBjaGFyW10gdG9rZW4pIHsKLQotCQlpZiAocmFuZ2UuaGFzQXR0cmlidXRlKENPTU1FTlRfSFRNTCkpIHsKLQotCQkJcmFuZ2UubWFya0h0bWxUYWcoSkFWQURPQ19JTU1VVEFCTEVfVEFHUywgdG9rZW4sIENPTU1FTlRfSU1NVVRBQkxFLCB0cnVlLCB0cnVlKTsKLQkJCWlmIChmRm9ybWF0SHRtbCkgewotCi0JCQkJcmFuZ2UubWFya0h0bWxUYWcoSkFWQURPQ19TRVBBUkFUT1JfVEFHUywgdG9rZW4sIENPTU1FTlRfU0VQQVJBVE9SLCB0cnVlLCB0cnVlKTsKLQkJCQlyYW5nZS5tYXJrSHRtbFRhZyhKQVZBRE9DX0JSRUFLX1RBR1MsIHRva2VuLCBDT01NRU5UX0JSRUFLLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJcmFuZ2UubWFya0h0bWxUYWcoSkFWQURPQ19TSU5HTEVfQlJFQUtfVEFHLCB0b2tlbiwgQ09NTUVOVF9CUkVBSywgdHJ1ZSwgZmFsc2UpOwotCQkJCXJhbmdlLm1hcmtIdG1sVGFnKEpBVkFET0NfTkVXTElORV9UQUdTLCB0b2tlbiwgQ09NTUVOVF9ORVdMSU5FLCB0cnVlLCBmYWxzZSk7Ci0KLQkJCX0gZWxzZQotCQkJCXJhbmdlLm1hcmtIdG1sVGFnKEpBVkFET0NfQ09ERV9UQUdTLCB0b2tlbiwgQ09NTUVOVF9TRVBBUkFUT1IsIHRydWUsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50Lk11bHRpQ29tbWVudFJlZ2lvbiNtYXJrSmF2YWRvY1RhZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmFuZ2UsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWFya0phdmFkb2NUYWcoZmluYWwgQ29tbWVudFJhbmdlIHJhbmdlLCBmaW5hbCBjaGFyW10gdG9rZW4pIHsKLQotCQlyYW5nZS5tYXJrUHJlZml4VGFnKEpBVkFET0NfUEFSQU1fVEFHUywgQ09NTUVOVF9UQUdfUFJFRklYLCB0b2tlbiwgQ09NTUVOVF9QQVJBTUVURVIpOwotCi0JCWlmICh0b2tlblswXSA9PSBKQVZBRE9DX1RBR19QUkVGSVggJiYgIXJhbmdlLmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikpCi0JCQlyYW5nZS5zZXRBdHRyaWJ1dGUoQ09NTUVOVF9ST09UKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29tbWVudCByZWdpb24gd2l0aCB0aGUgSFRNTCByYW5nZSB0YWcuCi0JICogCi0JICogQHBhcmFtIHRhZ3MgdGhlIEhUTUwgdGFnIHdoaWNoIGNvbmZpbmVzIHRoZSBIVE1MIHJhbmdlCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIHNldCBpZiB0aGUgY29tbWVudCByYW5nZSBpcyBpbiB0aGUKLQkgKiAgICAgICAgICAgICAgICBIVE1MIHJhbmdlCi0JICogQHBhcmFtIGh0bWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBIVE1MIHRhZ3MgaW4gdGhpcyBIVE1MIHJhbmdlCi0JICogICAgICAgICAgICAgICAgc2hvdWxkIGJlIG1hcmtlZCB0b28sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtYXJrVGFnUmFuZ2VzKGZpbmFsIGNoYXJbXVtdIHRhZ3MsIGZpbmFsIGludCBhdHRyaWJ1dGUsIGZpbmFsIGJvb2xlYW4gaHRtbCkgewotCQkKLQkJaW50IGxldmVsPSAwOwotCQlpbnQgY291bnQ9IDA7Ci0JCWNoYXJbXSB0b2tlbj0gbnVsbDsKLQkJQ29tbWVudFJhbmdlIGN1cnJlbnQ9IG51bGw7Ci0JCQotCQlmb3IgKGludCBpbmRleD0gMDsgaW5kZXggPCB0YWdzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCi0JCQlsZXZlbD0gMDsKLQkJCWZvciAoZmluYWwgSXRlcmF0b3IgaXRlcmF0b3I9IGdldFJhbmdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkKLQkJCQljdXJyZW50PSAoQ29tbWVudFJhbmdlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQljb3VudD0gY3VycmVudC5nZXRMZW5ndGgoKTsKLQkJCQkKLQkJCQlpZiAoY291bnQgPiAwIHx8IGxldmVsID4gMCkgeyAvLyBQUjQ0MDM1OiB3aGVuIGluc2lkZSBhIHRhZywgbWFyayBibGFuayBsaW5lcyBhcyB3ZWxsIHRvIGdldCBwcm9wZXIgc25pcHBldCBmb3JtYXR0aW5nCi0JCQkJCQotCQkJCQl0b2tlbj0gZ2V0VGV4dChjdXJyZW50LmdldE9mZnNldCgpLCBjdXJyZW50LmdldExlbmd0aCgpKS50b0NoYXJBcnJheSgpOwotCQkJCQlsZXZlbD0gY3VycmVudC5tYXJrVGFnUmFuZ2UodG9rZW4sIHRhZ3NbaW5kZXhdLCBsZXZlbCwgYXR0cmlidXRlLCBodG1sKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJlZ2lvbiNjYW5BcHBlbmQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSYW5nZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5BcHBlbmQoQ29tbWVudExpbmUgbGluZSwgQ29tbWVudFJhbmdlIHByZXZpb3VzLCBDb21tZW50UmFuZ2UgbmV4dCwgaW50IGluZGV4LCBpbnQgY291bnQpIHsKLQkJLy8gZG9uJ3QgYXBwZW5kIGNvZGUgc2VjdGlvbnMKLQkJaWYgKG5leHQuaGFzQXR0cmlidXRlKENPTU1FTlRfQ09ERSB8IENPTU1FTlRfRklSU1RfVE9LRU4pICYmIGxpbmUuZ2V0U2l6ZSgpICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jYW5BcHBlbmQobGluZSwgcHJldmlvdXMsIG5leHQsIGluZGV4LCBjb3VudCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgPGNvZGU+Zm9ybWF0dGVkPC9jb2RlPiBpbnRvIHZhbGlkIGh0bWwgY29kZSBzdWl0YWJsZSB0byBiZQotCSAqIHB1dCBpbnNpZGUgJmx0O3ByZSZndDsmbHQ7L3ByZSZndDsgdGFncyBieSByZXBsYWNpbmcgYW55IGh0bWwgc3ltYm9scwotCSAqIGJ5IHRoZSByZWxldmFudCBlbnRpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybWF0dGVkIHRoZSBmb3JtYXR0ZWQgamF2YSBjb2RlCi0JICogQHJldHVybiBodG1sIHZlcnNpb24gb2YgdGhlIGZvcm1hdHRlZCBjb2RlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydEphdmEySHRtbChTdHJpbmcgZm9ybWF0dGVkKSB7Ci0JCUphdmEySFRNTEVudGl0eVJlYWRlciByZWFkZXI9IG5ldyBKYXZhMkhUTUxFbnRpdHlSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihmb3JtYXR0ZWQpKTsKLQkJY2hhcltdIGJ1Zj0gbmV3IGNoYXJbMjU2XTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbDsKLQkJdHJ5IHsKLQkJCWRvIHsKLQkJCQlsPSByZWFkZXIucmVhZChidWYpOwotCQkJCWlmIChsICE9IC0xKQotCQkJCQlidWZmZXIuYXBwZW5kKGJ1ZiwgMCwgbCk7Ci0JCQl9IHdoaWxlIChsID4gMCk7Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmb3JtYXR0ZWQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyA8Y29kZT5odG1sPC9jb2RlPiBpbnRvIGphdmEgY29kZSBzdWl0YWJsZSBmb3IgZm9ybWF0dGluZwotCSAqIGJ5IHJlcGxhY2luZyBhbnkgaHRtbCBlbnRpdGllcyBieSB0aGVpciBwbGFpbiB0ZXh0IHJlcHJlc2VudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBodG1sIGh0bWwgY29kZSwgbWF5IGNvbnRhaW4gaHRtbCBlbnRpdGllcwotCSAqIEByZXR1cm4gcGxhaW4gdGV4dGlmaWVkIHZlcnNpb24gb2YgPGNvZGU+aHRtbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0SHRtbDJKYXZhKFN0cmluZyBodG1sKSB7Ci0JCUhUTUxFbnRpdHkySmF2YVJlYWRlciByZWFkZXI9IG5ldyBIVE1MRW50aXR5MkphdmFSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihodG1sKSk7Ci0JCWNoYXJbXSBidWY9IG5ldyBjaGFyW2h0bWwubGVuZ3RoKCldOyAvLyBodG1sMnRleHQgbmV2ZXIgZ2V0cyBsb25nZXIsIG9ubHkgc2hvcnRlciEKLQkJCi0JCXRyeSB7Ci0JCQlpbnQgcmVhZD0gcmVhZGVyLnJlYWQoYnVmKTsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgcmVhZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBodG1sOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmVnaW9uI2NyZWF0ZUxpbmUoKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudExpbmUgY3JlYXRlTGluZSgpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRG9jTGluZSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L011bHRpQ29tbWVudExpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvTXVsdGlDb21tZW50TGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTRkOWNlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvTXVsdGlDb21tZW50TGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotCi0vKioKLSAqIE11bHRpLWxpbmUgY29tbWVudCBsaW5lIGluIGEgY29tbWVudCByZWdpb24uCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQ29tbWVudExpbmUgZXh0ZW5kcyBDb21tZW50TGluZSBpbXBsZW1lbnRzIElDb21tZW50QXR0cmlidXRlcywgSUh0bWxUYWdEZWxpbWl0ZXJzLCBJSmF2YURvY1RhZ0NvbnN0YW50cyB7Ci0KLQkvKiogTGluZSBwcmVmaXggb2YgbXVsdGktbGluZSBjb21tZW50IGNvbnRlbnQgbGluZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9DT01NRU5UX0NPTlRFTlRfUFJFRklYPSAiICogIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIExpbmUgcHJlZml4IG9mIG11bHRpLWxpbmUgY29tbWVudCBlbmQgbGluZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9DT01NRU5UX0VORF9QUkVGSVg9ICIgKi8iOyAvLyROT04tTkxTLTEkCi0KLQkvKiogTGluZSBwcmVmaXggb2YgbXVsdGktbGluZSBjb21tZW50IGNvbnRlbnQgbGluZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9DT01NRU5UX1NUQVJUX1BSRUZJWD0gIi8qICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBUaGUgaW5kZW50YXRpb24gcmVmZXJlbmNlIG9mIHRoaXMgbGluZSAqLwotCXByaXZhdGUgU3RyaW5nIGZSZWZlcmVuY2VJbmRlbnRhdGlvbj0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVGhlIGphdmFkb2MgdGFnIGxvb2t1cC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgZmdUYWdMb29rdXA7Ci0JCi0Jc3RhdGljIHsKLQkJZmdUYWdMb29rdXA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBKQVZBRE9DX0JSRUFLX1RBR1MubGVuZ3RoOyBpKyspIHsKLQkJCWZnVGFnTG9va3VwLmFkZChuZXcgU3RyaW5nKEpBVkFET0NfQlJFQUtfVEFHU1tpXSkpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBKQVZBRE9DX1NJTkdMRV9CUkVBS19UQUcubGVuZ3RoOyBpKyspIHsKLQkJCWZnVGFnTG9va3VwLmFkZChuZXcgU3RyaW5nKEpBVkFET0NfU0lOR0xFX0JSRUFLX1RBR1tpXSkpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBKQVZBRE9DX0NPREVfVEFHUy5sZW5ndGg7IGkrKykgewotCQkJZmdUYWdMb29rdXAuYWRkKG5ldyBTdHJpbmcoSkFWQURPQ19DT0RFX1RBR1NbaV0pKTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgSkFWQURPQ19JTU1VVEFCTEVfVEFHUy5sZW5ndGg7IGkrKykgewotCQkJZmdUYWdMb29rdXAuYWRkKG5ldyBTdHJpbmcoSkFWQURPQ19JTU1VVEFCTEVfVEFHU1tpXSkpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBKQVZBRE9DX05FV0xJTkVfVEFHUy5sZW5ndGg7IGkrKykgewotCQkJZmdUYWdMb29rdXAuYWRkKG5ldyBTdHJpbmcoSkFWQURPQ19ORVdMSU5FX1RBR1NbaV0pKTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgSkFWQURPQ19TRVBBUkFUT1JfVEFHUy5sZW5ndGg7IGkrKykgewotCQkJZmdUYWdMb29rdXAuYWRkKG5ldyBTdHJpbmcoSkFWQURPQ19TRVBBUkFUT1JfVEFHU1tpXSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtdWx0aS1saW5lIGNvbW1lbnQgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uIGNvbW1lbnQgcmVnaW9uIHRvIGNyZWF0ZSB0aGUgbGluZSBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlDb21tZW50TGluZShmaW5hbCBDb21tZW50UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcihyZWdpb24pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSNhZGFwdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdChmaW5hbCBDb21tZW50TGluZSBwcmV2aW91cykgewotCi0JCWlmICghaGFzQXR0cmlidXRlKENPTU1FTlRfUk9PVCkgJiYgIWhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikgJiYgIXByZXZpb3VzLmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkpCi0JCQlmUmVmZXJlbmNlSW5kZW50YXRpb249IHByZXZpb3VzLmdldEluZGVudGF0aW9uUmVmZXJlbmNlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI2FwcGVuZChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmFuZ2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kKGZpbmFsIENvbW1lbnRSYW5nZSByYW5nZSkgewotCi0JCWZpbmFsIE11bHRpQ29tbWVudFJlZ2lvbiBwYXJlbnQ9IChNdWx0aUNvbW1lbnRSZWdpb24pZ2V0UGFyZW50KCk7Ci0KLQkJaWYgKHJhbmdlLmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikpCi0JCQlzZXRBdHRyaWJ1dGUoQ09NTUVOVF9QQVJBTUVURVIpOwotCQllbHNlIGlmIChyYW5nZS5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9ST09UKSkKLQkJCXNldEF0dHJpYnV0ZShDT01NRU5UX1JPT1QpOwotCQllbHNlIGlmIChyYW5nZS5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9CTEFOS0xJTkUpKQotCQkJc2V0QXR0cmlidXRlKENPTU1FTlRfQkxBTktMSU5FKTsKLQotCQlmaW5hbCBpbnQgcmFuZ2VzPSBnZXRTaXplKCk7Ci0JCWlmIChyYW5nZXMgPT0gMSkgewotCi0JCQlpZiAocGFyZW50LmlzSW5kZW50Um9vdHMoKSkgewotCi0JCQkJZmluYWwgQ29tbWVudFJhbmdlIGZpcnN0PSBnZXRGaXJzdCgpOwotCQkJCWZpbmFsIFN0cmluZyBjb21tb249IHBhcmVudC5nZXRUZXh0KGZpcnN0LmdldE9mZnNldCgpLCBmaXJzdC5nZXRMZW5ndGgoKSkgKyBDb21tZW50UmVnaW9uLkNPTU1FTlRfUkFOR0VfREVMSU1JVEVSOwotCi0JCQkJaWYgKGhhc0F0dHJpYnV0ZShDT01NRU5UX1JPT1QpKQotCQkJCQlmUmVmZXJlbmNlSW5kZW50YXRpb249IGNvbW1vbjsKLQkJCQllbHNlIGlmIChoYXNBdHRyaWJ1dGUoQ09NTUVOVF9QQVJBTUVURVIpKSB7Ci0JCQkJCWlmIChwYXJlbnQuaXNJbmRlbnREZXNjcmlwdGlvbnMoKSkKLQkJCQkJCWZSZWZlcmVuY2VJbmRlbnRhdGlvbj0gIlx0IiArIGNvbW1vbjsgLy8kTk9OLU5MUy0xJAotCQkJCQllbHNlCi0JCQkJCQlmUmVmZXJlbmNlSW5kZW50YXRpb249IGNvbW1vbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYXBwZW5kKHJhbmdlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjZ2V0Q29udGVudExpbmVQcmVmaXgoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFByZWZpeCgpIHsKLQkJcmV0dXJuIE1VTFRJX0NPTU1FTlRfQ09OVEVOVF9QUkVGSVg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI2dldEVuZExpbmVQcmVmaXgoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW5kaW5nUHJlZml4KCkgewotCQlyZXR1cm4gTVVMVElfQ09NTUVOVF9FTkRfUFJFRklYOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBpbmRlbnRhdGlvbiB0byB1c2UgZm9yIHRoaXMgbGluZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2UgaW5kZW50YXRpb24gZm9yIHRoaXMgbGluZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0SW5kZW50YXRpb25SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBmUmVmZXJlbmNlSW5kZW50YXRpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI2dldFN0YXJ0TGluZVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdGFydGluZ1ByZWZpeCgpIHsKLQkJcmV0dXJuIE1VTFRJX0NPTU1FTlRfU1RBUlRfUFJFRklYOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSNzY2FuTGluZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2NhbkxpbmUoZmluYWwgaW50IGxpbmUpIHsKLQotCQlmaW5hbCBDb21tZW50UmVnaW9uIHBhcmVudD0gZ2V0UGFyZW50KCk7Ci0JCWZpbmFsIFN0cmluZyBzdGFydD0gZ2V0U3RhcnRpbmdQcmVmaXgoKS50cmltKCk7Ci0JCWZpbmFsIFN0cmluZyBlbmQ9IGdldEVuZGluZ1ByZWZpeCgpLnRyaW0oKTsKLQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IGdldENvbnRlbnRQcmVmaXgoKS50cmltKCk7Ci0KLQkJZmluYWwgaW50IGxpbmVzPSBwYXJlbnQuZ2V0U2l6ZSgpOwotCQlmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2U9IGdldEZpcnN0KCk7Ci0KLQkJaW50IG9mZnNldD0gMDsKLQkJaW50IHBvc3RmaXg9IDA7Ci0KLQkJU3RyaW5nIHRleHQ9IHBhcmVudC5nZXRUZXh0KHJhbmdlLmdldE9mZnNldCgpLCByYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCWlmIChsaW5lID09IDApIHsKLQotCQkJb2Zmc2V0PSB0ZXh0LmluZGV4T2Yoc3RhcnQpOwotCQkJaWYgKG9mZnNldCA+PSAwICYmIHRleHQuc3Vic3RyaW5nKDAsIG9mZnNldCkudHJpbSgpLmxlbmd0aCgpICE9IDApCi0JCQkJb2Zmc2V0PSAtMTsKLQkJCQotCQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0KLQkJCQlvZmZzZXQgKz0gc3RhcnQubGVuZ3RoKCk7Ci0JCQkJcmFuZ2UudHJpbUJlZ2luKG9mZnNldCk7Ci0KLQkJCQlwb3N0Zml4PSB0ZXh0Lmxhc3RJbmRleE9mKGVuZCk7Ci0JCQkJaWYgKHBvc3RmaXggPj0gMCAmJiB0ZXh0LnN1YnN0cmluZyhwb3N0Zml4ICsgZW5kLmxlbmd0aCgpKS50cmltKCkubGVuZ3RoKCkgIT0gMCkKLQkJCQkJcG9zdGZpeD0gLTE7Ci0JCQkJCi0JCQkJaWYgKHBvc3RmaXggPj0gb2Zmc2V0KQotCQkJCQkvLyBjb21tZW50IGVuZHMgb24gc2FtZSBsaW5lCi0JCQkJCXJhbmdlLnNldExlbmd0aChwb3N0Zml4IC0gb2Zmc2V0KTsKLQkJCQllbHNlIHsKLQkJCQkJcG9zdGZpeD0gdGV4dC5sYXN0SW5kZXhPZihjb250ZW50KTsKLQkJCQkJaWYgKHBvc3RmaXggPj0gMCAmJiB0ZXh0LnN1YnN0cmluZyhwb3N0Zml4ICsgY29udGVudC5sZW5ndGgoKSkudHJpbSgpLmxlbmd0aCgpICE9IDApCi0JCQkJCQlwb3N0Zml4PSAtMTsKLQkJCQkJCi0JCQkJCWlmIChwb3N0Zml4ID49IG9mZnNldCkgewotCi0JCQkJCQlyYW5nZS5zZXRMZW5ndGgocG9zdGZpeCAtIG9mZnNldCk7Ci0JCQkJCQlwYXJlbnQuc2V0Qm9yZGVyKEJPUkRFUl9VUFBFUik7Ci0KLQkJCQkJCWlmIChwb3N0Zml4ID4gb2Zmc2V0KSB7Ci0KLQkJCQkJCQl0ZXh0PSBwYXJlbnQuZ2V0VGV4dChyYW5nZS5nZXRPZmZzZXQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWZpbmFsIElSZWdpb24gcmVnaW9uPSB0cmltTGluZSh0ZXh0LCBjb250ZW50KTsKLQotCQkJCQkJCXJhbmdlLm1vdmUocmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCQlyYW5nZS5zZXRMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChsaW5lID09IGxpbmVzIC0gMSkgewotCi0JCQlvZmZzZXQ9IHRleHQuaW5kZXhPZihjb250ZW50KTsKLQkJCWlmIChvZmZzZXQgPj0gMCAmJiB0ZXh0LnN1YnN0cmluZygwLCBvZmZzZXQpLnRyaW0oKS5sZW5ndGgoKSAhPSAwKQotCQkJCW9mZnNldD0gLTE7Ci0JCQlwb3N0Zml4PSB0ZXh0Lmxhc3RJbmRleE9mKGVuZCk7Ci0JCQlpZiAocG9zdGZpeCA+PSAwICYmIHRleHQuc3Vic3RyaW5nKHBvc3RmaXggKyBlbmQubGVuZ3RoKCkpLnRyaW0oKS5sZW5ndGgoKSAhPSAwKQotCQkJCXBvc3RmaXg9IC0xOwotCQkJCi0JCQlpZiAob2Zmc2V0ID49IDAgJiYgb2Zmc2V0ID09IHBvc3RmaXgpCi0JCQkJLy8gbm8gY29udGVudCBvbiBsaW5lLCBvbmx5IHRoZSBjb21tZW50IHBvc3RmaXgKLQkJCQlyYW5nZS5zZXRMZW5ndGgoMCk7Ci0JCQllbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID49IDApCi0JCQkJCS8vIG9taXQgdGhlIGNvbnRlbnQgcHJlZml4Ci0JCQkJCXJhbmdlLnRyaW1CZWdpbihvZmZzZXQgKyBjb250ZW50Lmxlbmd0aCgpKTsKLQkJCQkKLQkJCQlpZiAocG9zdGZpeCA+PSAwKQotCQkJCQkvLyBvbWl0IHRoZSBjb21tZW50IHBvc3RmaXgKLQkJCQkJcmFuZ2UudHJpbUVuZCgtZW5kLmxlbmd0aCgpKTsKLQkJCQkKLQkJCQl0ZXh0PSBwYXJlbnQuZ2V0VGV4dChyYW5nZS5nZXRPZmZzZXQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQkJCWZpbmFsIElSZWdpb24gcmVnaW9uPSB0cmltTGluZSh0ZXh0LCBjb250ZW50KTsKLQkJCQlpZiAocmVnaW9uLmdldE9mZnNldCgpICE9IDAgfHwgcmVnaW9uLmdldExlbmd0aCgpICE9IHRleHQubGVuZ3RoKCkpIHsKLQotCQkJCQlyYW5nZS5tb3ZlKHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCXJhbmdlLnNldExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJCXBhcmVudC5zZXRCb3JkZXIoQk9SREVSX1VQUEVSKTsKLQkJCQkJcGFyZW50LnNldEJvcmRlcihCT1JERVJfTE9XRVIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQotCQkJb2Zmc2V0PSB0ZXh0LmluZGV4T2YoY29udGVudCk7Ci0JCQlpZiAob2Zmc2V0ID49IDAgJiYgdGV4dC5zdWJzdHJpbmcoMCwgb2Zmc2V0KS50cmltKCkubGVuZ3RoKCkgIT0gMCkKLQkJCQlvZmZzZXQ9IC0xOwotCQkJCi0JCQlpZiAob2Zmc2V0ID49IDApIHsKLQotCQkJCW9mZnNldCArPSBjb250ZW50Lmxlbmd0aCgpOwotCQkJCXJhbmdlLnRyaW1CZWdpbihvZmZzZXQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI3Rva2VuaXplTGluZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9rZW5pemVMaW5lKGludCBsaW5lKSB7Ci0KLQkJaW50IG9mZnNldD0gMDsKLQkJaW50IGluZGV4PSBvZmZzZXQ7Ci0KLQkJZmluYWwgQ29tbWVudFJlZ2lvbiBwYXJlbnQ9IGdldFBhcmVudCgpOwotCQlmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2U9IGdldEZpcnN0KCk7Ci0JCWZpbmFsIGludCBiZWdpbj0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0KLQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IHBhcmVudC5nZXRUZXh0KGJlZ2luLCByYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCWZpbmFsIGludCBsZW5ndGg9IGNvbnRlbnQubGVuZ3RoKCk7Ci0KLQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjb250ZW50LmNoYXJBdChvZmZzZXQpKSkKLQkJCW9mZnNldCsrOwotCi0JCUNvbW1lbnRSYW5nZSByZXN1bHQ9IG51bGw7Ci0JCWlmIChvZmZzZXQgPj0gbGVuZ3RoICYmICFwYXJlbnQuaXNDbGVhckxpbmVzKCkgJiYgKGxpbmUgPiAwICYmIGxpbmUgPCBwYXJlbnQuZ2V0U2l6ZSgpIC0gMSkpIHsKLQotCQkJcmVzdWx0PSBuZXcgQ29tbWVudFJhbmdlKGJlZ2luLCAwKTsKLQkJCXJlc3VsdC5zZXRBdHRyaWJ1dGUoQ09NTUVOVF9CTEFOS0xJTkUpOwotCQkJcmVzdWx0LnNldEF0dHJpYnV0ZShDT01NRU5UX0ZJUlNUX1RPS0VOKTsKLQotCQkJcGFyZW50LmFwcGVuZChyZXN1bHQpOwotCQl9Ci0KLQkJaW50IGF0dHJpYnV0ZT0gQ09NTUVOVF9GSVJTVF9UT0tFTiB8IENPTU1FTlRfU1RBUlRTX1dJVEhfUkFOR0VfREVMSU1JVEVSOwotCQl3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0KLQkJCXdoaWxlIChvZmZzZXQgPCBsZW5ndGggJiYgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoY29udGVudC5jaGFyQXQob2Zmc2V0KSkpIHsKLQkJCQlvZmZzZXQrKzsKLQkJCQlhdHRyaWJ1dGUgfD0gQ09NTUVOVF9TVEFSVFNfV0lUSF9SQU5HRV9ERUxJTUlURVI7Ci0JCQl9Ci0KLQkJCWluZGV4PSBvZmZzZXQ7Ci0KLQkJCWlmIChpbmRleCA8IGxlbmd0aCkgewotCi0JCQkJaWYgKGNvbnRlbnQuY2hhckF0KGluZGV4KSA9PSBIVE1MX1RBR19QUkVGSVgpIHsKLQotCQkJCQkvLyBpbiBvcmRlciB0byBhdm9pZCByZWNvZ25pemluZyBhbnkgPCBpbiBhIGNvbW1lbnQsIGV2ZW4gdGhvc2Ugd2hpY2ggYXJlIHBhcnQgb2YgZS5nLgotCQkJCQkvLyBqYXZhIHNvdXJjZSBjb2RlLCB3ZSB2YWxpZGF0ZSB0aGUgdGFnIGNvbnRlbnQgdG8gYmUgb25lIG9mIHRoZSByZWNvZ25pemVkCi0JCQkJCS8vIHRhZ3MgKHN0cnVjdHVyYWwsIGJyZWFrcywgcHJlLCBjb2RlKS4KLQkJCQkJaW50IHRhZz0gKytpbmRleDsKLQkJCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIGNvbnRlbnQuY2hhckF0KGluZGV4KSAhPSBIVE1MX1RBR19QT1NURklYICYmIGNvbnRlbnQuY2hhckF0KGluZGV4KSAhPSBIVE1MX1RBR19QUkVGSVgpCi0JCQkJCQlpbmRleCsrOwotCi0JCQkJCWlmIChpbmRleCA8IGxlbmd0aCAmJiBjb250ZW50LmNoYXJBdChpbmRleCkgPT0gSFRNTF9UQUdfUE9TVEZJWCAmJiBpc1ZhbGlkVGFnKGNvbnRlbnQuc3Vic3RyaW5nKHRhZywgaW5kZXgpKSkgewotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWF0dHJpYnV0ZSB8PSBDT01NRU5UX0hUTUw7IC8vIG9ubHkgc2V0IGh0bWwgYXR0cmlidXRlIGlmIHBvc3RmaXggZm91bmQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIHRhZyAtIGRvIHRoZSB1c3VhbCB0aGluZyBmcm9tIHRoZSBvcmlnaW5hbCBvZmZzZXQKLQkJCQkJCWluZGV4PSB0YWc7Ci0JCQkJCQl3aGlsZSAoaW5kZXggPCBsZW5ndGgKLQkJCQkJCQkJJiYgIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGNvbnRlbnQuY2hhckF0KGluZGV4KSkKLQkJCQkJCQkJJiYgY29udGVudC5jaGFyQXQoaW5kZXgpICE9IEhUTUxfVEFHX1BSRUZJWCAKLQkJCQkJCQkJJiYgIWNvbnRlbnQuc3RhcnRzV2l0aChMSU5LX1RBR19QUkVGSVhfU1RSSU5HLCBpbmRleCkpCi0JCQkJCQkJaW5kZXgrKzsKLQkJCQkJfQotCi0KLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aChMSU5LX1RBR19QUkVGSVhfU1RSSU5HLCBpbmRleCkpIHsKLQotCQkJCQl3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgY29udGVudC5jaGFyQXQoaW5kZXgpICE9IExJTktfVEFHX1BPU1RGSVgpCi0JCQkJCQlpbmRleCsrOwotCi0JCQkJCWlmIChpbmRleCA8IGxlbmd0aCAmJiBjb250ZW50LmNoYXJBdChpbmRleCkgPT0gTElOS19UQUdfUE9TVEZJWCkKLQkJCQkJCWluZGV4Kys7Ci0KLQkJCQkJYXR0cmlidXRlIHw9IENPTU1FTlRfT1BFTiB8IENPTU1FTlRfQ0xPU0U7Ci0KLQkJCQl9IGVsc2UgewotCi0JCQkJCXdoaWxlIChpbmRleCA8IGxlbmd0aAotCQkJCQkJCSYmICFTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjb250ZW50LmNoYXJBdChpbmRleCkpCi0JCQkJCQkJJiYgY29udGVudC5jaGFyQXQoaW5kZXgpICE9IEhUTUxfVEFHX1BSRUZJWAotCQkJCQkJCSYmICFjb250ZW50LnN0YXJ0c1dpdGgoTElOS19UQUdfUFJFRklYX1NUUklORywgaW5kZXgpKQotCQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmRleCAtIG9mZnNldCA+IDApIHsKLQotCQkJCXJlc3VsdD0gbmV3IENvbW1lbnRSYW5nZShiZWdpbiArIG9mZnNldCwgaW5kZXggLSBvZmZzZXQpOwotCQkJCXJlc3VsdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLQotCQkJCXBhcmVudC5hcHBlbmQocmVzdWx0KTsKLQkJCQlvZmZzZXQ9IGluZGV4OwotCQkJfQotCQkJCi0JCQlhdHRyaWJ1dGU9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT50YWc8L2NvZGU+IGlzIGEgdmFsaWQgdGFnIGNvbnRlbnQgKHRleHQgaW5zaWRlCi0JICogdGhlIGFuZ3VsYXIgYnJhY2tldHMgJmx0OywgJmd0OykuCi0JICogPHA+Ci0JICogVGhlIGFsZ29yaXRobSBpcyB0byBzZWUgaWYgdGhlIHRhZyB0cmltbWVkIG9mIHdoaXRlc3BhY2UgYW5kIGFuCi0JICogb3B0aW9uYWwgc2xhc2ggc3RhcnRzIHdpdGggb25lIG9mIG91ciByZWNvZ25pemVkIHRhZ3MuCi0JICogCi0JICogQHBhcmFtIHRhZyB0aGUgdGFnIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50YWc8L2NvZGU+IGlzIGEgdmFsaWQgdGFnCi0JICogICAgICAgICBjb250ZW50Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRUYWcoU3RyaW5nIHRhZykgewotCQkvLyBzdHJpcCB0aGUgc2xhc2gKLQkJaWYgKHRhZy5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRhZz0gdGFnLnN1YnN0cmluZygxLCB0YWcubGVuZ3RoKCkpOwotCQkKLQkJLy8gc3RyaXAgd3MKLQkJdGFnPSB0YWcudHJpbSgpOwotCQkKLQkJLy8gZXh0cmFjdCBmaXJzdCB0b2tlbgotCQlpbnQgaT0gMDsKLQkJd2hpbGUgKGkgPCB0YWcubGVuZ3RoKCkgJiYgIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRhZy5jaGFyQXQoaSkpKQotCQkJaSsrOwotCQl0YWc9IHRhZy5zdWJzdHJpbmcoMCwgaSk7Ci0JCQotCQkvLyBzZWUgaWYgaXQncyBhIHRhZwotCQlyZXR1cm4gaXNUYWdOYW1lKHRhZy50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT50YWc8L2NvZGU+IGlzIG9uZSBvZiB0aGUgY29uZmlndXJlZCB0YWdzLgotCSAqIAotCSAqIEBwYXJhbSB0YWcgdGhlIHRhZyB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+dGFnPC9jb2RlPiBpcyBhIGNvbmZpZ3VyZWQgdGFnCi0JICogICAgICAgICBuYW1lCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnTmFtZShTdHJpbmcgdGFnKSB7Ci0JCXJldHVybiBmZ1RhZ0xvb2t1cC5jb250YWlucyh0YWcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG9jY3VycmVuY2VzIGZyb20gPGNvZGU+bGluZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGxpbmUgdGhlIHN0cmluZyB0byByZW1vdmUgdGhlIG9jY3VycmVuY2VzIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+dHJpbW1hYmxlPC9jb2RlPgotCSAqIEBwYXJhbSB0cmltbWFibGUgdGhlIHN0cmluZyB0byByZW1vdmUgZnJvbSA8Y29kZT5saW5lPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHJlZ2lvbiBvZiB0aGUgdHJpbW1lZCBzdWJzdHJpbmcgd2l0aGluIDxjb2RlPmxpbmU8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElSZWdpb24gdHJpbUxpbmUoZmluYWwgU3RyaW5nIGxpbmUsIGZpbmFsIFN0cmluZyB0cmltbWFibGUpIHsKLQotCQlmaW5hbCBpbnQgdHJpbT0gdHJpbW1hYmxlLmxlbmd0aCgpOwotCi0JCWludCBvZmZzZXQ9IDA7Ci0JCWludCBsZW5ndGg9IGxpbmUubGVuZ3RoKCkgLSB0cmltOwotCi0JCXdoaWxlIChsaW5lLnN0YXJ0c1dpdGgodHJpbW1hYmxlLCBvZmZzZXQpKQotCQkJb2Zmc2V0ICs9IHRyaW07Ci0KLQkJd2hpbGUgKGxpbmUuc3RhcnRzV2l0aCh0cmltbWFibGUsIGxlbmd0aCkpCi0JCQlsZW5ndGggLT0gdHJpbTsKLQotCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIGxlbmd0aCArIHRyaW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvTXVsdGlDb21tZW50UmVnaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L011bHRpQ29tbWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjA3MzRhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvTXVsdGlDb21tZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5jb21tZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLQotLyoqCi0gKiBNdWx0aS1jb21tZW50IHJlZ2lvbiBpbiBhIHNvdXJjZSBjb2RlIGRvY3VtZW50LgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUNvbW1lbnRSZWdpb24gZXh0ZW5kcyBDb21tZW50UmVnaW9uIGltcGxlbWVudHMgSUphdmFEb2NUYWdDb25zdGFudHMgewotCi0JLyoqIFNob3VsZCByb290IHRhZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zIGJlIGluZGVudGVkIGFmdGVyIHRoZSB0YWc/ICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZJbmRlbnREZXNjcmlwdGlvbnM7Ci0KLQkvKiogU2hvdWxkIHJvb3QgdGFnIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMgYmUgaW5kZW50ZWQ/ICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZJbmRlbnRSb290czsKLQotCS8qKiBTaG91bGQgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBnbyB0byB0aGUgbmV4dCBsaW5lPyAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmUGFyYW1ldGVyTmV3TGluZTsKLQotCS8qKiBTaG91bGQgcm9vdCB0YWdzIGJlIHNlcGFyYXRlZCBmcm9tIGRlc2NyaXB0aW9uPyAqLwotCXByaXZhdGUgYm9vbGVhbiBmU2VwYXJhdGVSb290czsKLQotIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG11bHRpLWNvbW1lbnQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGNvbW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGlzIGNvbW1lbnQgcmVnaW9uIGluIHRoZSBkb2N1bWVudAotCSAqIEBwYXJhbSBmb3JtYXR0ZXIgdGhlIGdpdmVuIGZvcm1hdHRlcgotCSAqLwotCXB1YmxpYyBNdWx0aUNvbW1lbnRSZWdpb24oZmluYWwgSURvY3VtZW50IGRvY3VtZW50LCBmaW5hbCBQb3NpdGlvbiBwb3NpdGlvbiwgZmluYWwgQ29kZUZvcm1hdHRlclZpc2l0b3IgZm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBwb3NpdGlvbiwgZm9ybWF0dGVyKTsKLQotCQlmSW5kZW50Um9vdHM9IHRoaXMucHJlZmVyZW5jZXMuY29tbWVudF9pbmRlbnRfcm9vdF90YWdzOwotCQlmSW5kZW50RGVzY3JpcHRpb25zPSB0aGlzLnByZWZlcmVuY2VzLmNvbW1lbnRfaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbjsKLQkJZlNlcGFyYXRlUm9vdHM9IHRoaXMucHJlZmVyZW5jZXMuY29tbWVudF9pbnNlcnRfZW1wdHlfbGluZV9iZWZvcmVfcm9vdF90YWdzOwotCQlmUGFyYW1ldGVyTmV3TGluZT0gdGhpcy5wcmVmZXJlbmNlcy5jb21tZW50X2luc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyOwotCQlmQ2xlYXIgPSB0aGlzLnByZWZlcmVuY2VzLmNvbW1lbnRfY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJlZ2lvbiNjYW5BcHBlbmQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSYW5nZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5BcHBlbmQoZmluYWwgQ29tbWVudExpbmUgbGluZSwgZmluYWwgQ29tbWVudFJhbmdlIHByZXZpb3VzLCBmaW5hbCBDb21tZW50UmFuZ2UgbmV4dCwgZmluYWwgaW50IGluZGV4LCBpbnQgY291bnQpIHsKLQotCQlmaW5hbCBib29sZWFuIGJsYW5rPSBuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSk7Ci0KLQkJLy8gQXZvaWQgd3JhcHBpbmcgcHVuY3R1YXRpb24KLQkJaWYgKG5leHQuZ2V0TGVuZ3RoKCkgPD0gMiAmJiAhYmxhbmsgJiYgaXNOb25BbHBoYU51bWVyaWMobmV4dCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZlBhcmFtZXRlck5ld0xpbmUgJiYgbGluZS5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9QQVJBTUVURVIpICYmIGxpbmUuZ2V0U2l6ZSgpID4gMSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAocHJldmlvdXMgIT0gbnVsbCkgewotCQkJCi0JCQlpZiAoaW5kZXggIT0gMCAmJiAoYmxhbmsgfHwgcHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfQkxBTktMSU5FKSB8fCBuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikgfHwgbmV4dC5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9ST09UKSB8fCBuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX1NFUEFSQVRPUikgfHwgbmV4dC5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9ORVdMSU5FKSB8fCBwcmV2aW91cy5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9CUkVBSykgfHwgcHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfU0VQQVJBVE9SKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAocHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfUk9PVCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCWlmIChuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSkgJiYgcHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfSU1NVVRBQkxFKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGFsd2F5cyBhcHBlbmQgZWxlbWVudHMgdGhhdCBkaWQgbm90IGhhdmUgYW55IHJhbmdlIHNlcGFyYXRvcnMKLQkJaWYgKCFuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX1NUQVJUU19XSVRIX1JBTkdFX0RFTElNSVRFUikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKGZJbmRlbnRSb290cyAmJiAhbGluZS5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9ST09UKSAmJiAhbGluZS5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9QQVJBTUVURVIpKQotCQkJY291bnQgLT0gc3RyaW5nVG9MZW5ndGgobGluZS5nZXRJbmRlbnRhdGlvblJlZmVyZW5jZSgpKTsKLQotCQkvLyBBdm9pZCBhcHBlbmRpbmcgY29uc2VjdXRpdmUgaW1tdXRhYmxlIHJhbmdlcywgd2hpY2ggdG9nZXRoZXIgZXhjZWVkIHRoZSBsaW5lIHdpZHRoCi0JCWlmIChuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSkgJiYgKHByZXZpb3VzID09IG51bGwgfHwgIXByZXZpb3VzLmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSkpKSB7Ci0JCQkvLyBCcmVha2luZyB0aGUgYWJzdHJhY3Rpb24gYnkgZGlyZWN0bHkgYWNjZXNzaW5nIHRoZSBsaXN0IG9mIHJhbmdlcyBmb3IgbG9va2luZyBhaGVhZAotCQkJSXRlcmF0b3IgaXRlcj0gZ2V0UmFuZ2VzKCkuaXRlcmF0b3IoKTsKLQkJCUNvbW1lbnRSYW5nZSBjdXJyZW50PSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnQgIT0gbmV4dCkKLQkJCQljdXJyZW50PSAoQ29tbWVudFJhbmdlKSBpdGVyLm5leHQoKTsKLQkJCQotCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBsaW5lTnVtYmVyPSBnZXREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChnZXRPZmZzZXQoKSArIGN1cnJlbnQuZ2V0T2Zmc2V0KCkpOwotCQkJCQlDb21tZW50UmFuZ2UgbGFzdD0gY3VycmVudDsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQljdXJyZW50PSAoQ29tbWVudFJhbmdlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChjdXJyZW50Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSkgJiYgZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2ZPZmZzZXQoZ2V0T2Zmc2V0KCkgKyBjdXJyZW50LmdldE9mZnNldCgpKSA9PSBsaW5lTnVtYmVyKQotCQkJCQkJCWxhc3Q9IGN1cnJlbnQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY291bnQgLT0gbGFzdC5nZXRPZmZzZXQoKSArIGxhc3QuZ2V0TGVuZ3RoKCkgLSAobmV4dC5nZXRPZmZzZXQoKSArIG5leHQuZ2V0TGVuZ3RoKCkpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuY2FuQXBwZW5kKGxpbmUsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgY291bnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmVnaW9uI2dldERlbGltaXRlcihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSYW5nZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsaW1pdGVyKENvbW1lbnRMaW5lIHByZWRlY2Vzc29yLCBDb21tZW50TGluZSBzdWNjZXNzb3IsIENvbW1lbnRSYW5nZSBwcmV2aW91cywgQ29tbWVudFJhbmdlIG5leHQsIFN0cmluZyBpbmRlbnRhdGlvbikgewotCi0JCWZpbmFsIFN0cmluZyBkZWxpbWl0ZXI9IHN1cGVyLmdldERlbGltaXRlcihwcmVkZWNlc3Nvciwgc3VjY2Vzc29yLCBwcmV2aW91cywgbmV4dCwgaW5kZW50YXRpb24pOwotCi0JCWlmIChwcmV2aW91cyAhPSBudWxsKSB7Ci0KLQkJCS8vIEJsYW5rIGxpbmUgYmVmb3JlIDxwcmU+IHRhZwotCQkJaWYgKHByZXZpb3VzLmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSB8IENPTU1FTlRfU0VQQVJBVE9SKSAmJiAhbmV4dC5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9DT0RFKSAmJiAhc3VjY2Vzc29yLmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkpCi0JCQkJcmV0dXJuIGRlbGltaXRlciArIGRlbGltaXRlcjsKLQotCQkJLy8gQmxhbmsgbGluZSBhZnRlciA8L3ByZT4gdGFnCi0JCQllbHNlIGlmIChuZXh0Lmhhc0F0dHJpYnV0ZShDT01NRU5UX0lNTVVUQUJMRSB8IENPTU1FTlRfU0VQQVJBVE9SKSAmJiAhc3VjY2Vzc29yLmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkgJiYgIXByZWRlY2Vzc29yLmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkpCi0JCQkJcmV0dXJuIGRlbGltaXRlciArIGRlbGltaXRlcjsKLQotCQkJLy8gQWRkIGJsYW5rIGxpbmUgYmVmb3JlIGZpcnN0IHJvb3QvcGFyYW1ldGVyIHRhZywgaWYgIkJsYW5rIGxpbmUgYmVmb3JlIEphdmFkb2MgdGFncyIKLQkJCWVsc2UgaWYgKGZTZXBhcmF0ZVJvb3RzICYmIHByZXZpb3VzLmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFHUkFQSCkgJiYgIXN1Y2Nlc3Nvci5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9CTEFOS0xJTkUpICYmICFwcmVkZWNlc3Nvci5oYXNBdHRyaWJ1dGUoQ09NTUVOVF9CTEFOS0xJTkUpKQotCQkJCXJldHVybiBkZWxpbWl0ZXIgKyBkZWxpbWl0ZXI7Ci0KLQkJCWVsc2UgaWYgKGZJbmRlbnRSb290cyAmJiAhcHJlZGVjZXNzb3IuaGFzQXR0cmlidXRlKENPTU1FTlRfUk9PVCkgJiYgIXByZWRlY2Vzc29yLmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikgJiYgIXByZWRlY2Vzc29yLmhhc0F0dHJpYnV0ZShDT01NRU5UX0JMQU5LTElORSkpCi0JCQkJcmV0dXJuIGRlbGltaXRlciArIHN0cmluZ1RvSW5kZW50KHByZWRlY2Vzc29yLmdldEluZGVudGF0aW9uUmVmZXJlbmNlKCkpOwotCQl9Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSZWdpb24jZ2V0RGVsaW1pdGVyKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSYW5nZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsaW1pdGVyKGZpbmFsIENvbW1lbnRSYW5nZSBwcmV2aW91cywgZmluYWwgQ29tbWVudFJhbmdlIG5leHQpIHsKLQkJLy8gc2ltcGx5IHByZXNlcnZlIHJhbmdlICh+IHdvcmQpIGJyZWFrcwotCQlpZiAocHJldmlvdXMgIT0gbnVsbCAmJiAhcHJldmlvdXMuaGFzQXR0cmlidXRlKENPTU1FTlRfU1RBUlRTX1dJVEhfUkFOR0VfREVMSU1JVEVSKSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVsaW1pdGVyKHByZXZpb3VzLCBuZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNob3VsZCByb290IHRhZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zIGJlIGluZGVudGVkIGFmdGVyIHRoZSB0YWc/Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGRlc2NyaXB0aW9ucyBzaG91bGQgYmUgaW5kZW50ZWQKLQkgKiAgICAgICAgIGFmdGVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzSW5kZW50RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gZkluZGVudERlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgcm9vdCB0YWcgcGFyYW1ldGVyIGRlc2NyaXB0aW9ucyBiZSBpbmRlbnRlZD8KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgcm9vdCB0YWdzIHNob3VsZCBiZSBpbmRlbnRlZCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNJbmRlbnRSb290cygpIHsKLQkJcmV0dXJuIGZJbmRlbnRSb290czsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29tbWVudCByYW5nZXMgY29uZmluZWQgYnkgSFRNTCByYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFya0h0bWxSYW5nZXMoKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29tbWVudCByYW5nZSB3aXRoIGl0cyBIVE1MIHRhZyBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSByYW5nZSB0aGUgY29tbWVudCByYW5nZSB0byBtYXJrCi0JICogQHBhcmFtIHRva2VuIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWVudCByYW5nZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtIdG1sVGFnKGZpbmFsIENvbW1lbnRSYW5nZSByYW5nZSwgZmluYWwgY2hhcltdIHRva2VuKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgY29tbWVudCByYW5nZSB3aXRoIGl0cyBqYXZhZG9jIHRhZyBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSByYW5nZSB0aGUgY29tbWVudCByYW5nZSB0byBtYXJrCi0JICogQHBhcmFtIHRva2VuIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWVudCByYW5nZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtKYXZhZG9jVGFnKGZpbmFsIENvbW1lbnRSYW5nZSByYW5nZSwgZmluYWwgY2hhcltdIHRva2VuKSB7Ci0JCXJhbmdlLm1hcmtQcmVmaXhUYWcoQ09NTUVOVF9ST09UX1RBR1MsIENPTU1FTlRfVEFHX1BSRUZJWCwgdG9rZW4sIENPTU1FTlRfUk9PVCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRSZWdpb24jbWFya1JlZ2lvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFya1JlZ2lvbigpIHsKLQotCQlpbnQgY291bnQ9IDA7Ci0JCWJvb2xlYW4gcGFyYWdyYXBoPSBmYWxzZTsKLQotCQljaGFyW10gdG9rZW49IG51bGw7Ci0JCUNvbW1lbnRSYW5nZSByYW5nZT0gbnVsbDsKLQotCQlmb3IgKGZpbmFsIExpc3RJdGVyYXRvciBpdGVyYXRvcj0gZ2V0UmFuZ2VzKCkubGlzdEl0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQotCQkJcmFuZ2U9IChDb21tZW50UmFuZ2UpaXRlcmF0b3IubmV4dCgpOwotCQkJY291bnQ9IHJhbmdlLmdldExlbmd0aCgpOwotCi0JCQlpZiAoY291bnQgPiAwKSB7Ci0KLQkJCQl0b2tlbj0gZ2V0VGV4dChyYW5nZS5nZXRPZmZzZXQoKSwgY291bnQpLnRvTG93ZXJDYXNlKCkudG9DaGFyQXJyYXkoKTsKLQotCQkJCW1hcmtKYXZhZG9jVGFnKHJhbmdlLCB0b2tlbik7Ci0JCQkJaWYgKCFwYXJhZ3JhcGggJiYgKHJhbmdlLmhhc0F0dHJpYnV0ZShDT01NRU5UX1JPT1QpIHx8IHJhbmdlLmhhc0F0dHJpYnV0ZShDT01NRU5UX1BBUkFNRVRFUikpKSB7Ci0JCQkJCXJhbmdlLnNldEF0dHJpYnV0ZShDT01NRU5UX1BBUkFHUkFQSCk7Ci0JCQkJCXBhcmFncmFwaD0gdHJ1ZTsKLQkJCQl9Ci0JCQkJbWFya0h0bWxUYWcocmFuZ2UsIHRva2VuKTsKLQkJCX0KLQkJfQotCQltYXJrSHRtbFJhbmdlcygpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJlZ2lvbiNjcmVhdGVMaW5lKCkKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIENvbW1lbnRMaW5lIGNyZWF0ZUxpbmUoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlDb21tZW50TGluZSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L1NpbmdsZUNvbW1lbnRMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L1NpbmdsZUNvbW1lbnRMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjg4MjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvY29tbWVudC9TaW5nbGVDb21tZW50TGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuY29tbWVudDsKLQotLyoqCi0gKiBTaW5nbGUtbGluZSBjb21tZW50IGxpbmUgaW4gYSBjb21tZW50IHJlZ2lvbi4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQ29tbWVudExpbmUgZXh0ZW5kcyBDb21tZW50TGluZSB7Ci0KLQkvKiogTGluZSBwcmVmaXggZm9yIHNpbmdsZSBsaW5lIGNvbW1lbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX0NPTU1FTlRfUFJFRklYPSAiLy8gIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5MUyB0YWcgcHJlZml4ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5MU19UQUdfUFJFRklYPSAiLy8kTk9OLU5MUy0iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIElzIHRoZSBjb21tZW50IGEgTkxTIGxvY2FsZSB0YWcgc2VxdWVuY2U/ICovCi0JcHJpdmF0ZSBib29sZWFuIGZMb2NhbGVTZXF1ZW5jZT0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNpbmdsZS1saW5lIGNvbW1lbnQgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uIGNvbW1lbnQgcmVnaW9uIHRvIGNyZWF0ZSB0aGUgbGluZSBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgU2luZ2xlQ29tbWVudExpbmUoZmluYWwgQ29tbWVudFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIocmVnaW9uKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjYWRhcHQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHQoZmluYWwgQ29tbWVudExpbmUgcHJldmlvdXMpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50TGluZSNmb3JtYXRMb3dlckJvcmRlcihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnRleHQuY29tbWVudC5Db21tZW50UmFuZ2UsIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRMb3dlckJvcmRlcihmaW5hbCBDb21tZW50UmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvbiwgZmluYWwgaW50IGxlbmd0aCkgewotCi0JCWZpbmFsIGludCBvZmZzZXQ9IHJhbmdlLmdldE9mZnNldCgpICsgcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCWZpbmFsIENvbW1lbnRSZWdpb24gcGFyZW50PSBnZXRQYXJlbnQoKTsKLQotCQlwYXJlbnQubG9nRWRpdChwYXJlbnQuZ2V0RGVsaW1pdGVyKCksIG9mZnNldCwgcGFyZW50LmdldExlbmd0aCgpIC0gb2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjZm9ybWF0VXBwZXJCb3JkZXIob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudFJhbmdlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VXBwZXJCb3JkZXIoZmluYWwgQ29tbWVudFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24sIGZpbmFsIGludCBsZW5ndGgpIHsKLQotCQlmaW5hbCBDb21tZW50UmVnaW9uIHBhcmVudD0gZ2V0UGFyZW50KCk7Ci0KLQkJcGFyZW50LmxvZ0VkaXQoZ2V0Q29udGVudFByZWZpeCgpLCAwLCByYW5nZS5nZXRPZmZzZXQoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI2dldENvbnRlbnRQcmVmaXgoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFByZWZpeCgpIHsKLQkJcmV0dXJuIFNJTkdMRV9DT01NRU5UX1BSRUZJWDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjZ2V0RW5kaW5nUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuZGluZ1ByZWZpeCgpIHsKLQkJcmV0dXJuIFNJTkdMRV9DT01NRU5UX1BSRUZJWDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjZ2V0U3RhcnRpbmdQcmVmaXgoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RhcnRpbmdQcmVmaXgoKSB7Ci0JCXJldHVybiBTSU5HTEVfQ09NTUVOVF9QUkVGSVg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQudGV4dC5jb21tZW50LkNvbW1lbnRMaW5lI3NjYW5MaW5lKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzY2FuTGluZShmaW5hbCBpbnQgbGluZSkgewotCi0JCWZpbmFsIENvbW1lbnRSYW5nZSByYW5nZT0gZ2V0Rmlyc3QoKTsKLQkJZmluYWwgU3RyaW5nIGNvbnRlbnQ9IGdldFBhcmVudCgpLmdldFRleHQocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLQkJZmluYWwgU3RyaW5nIHByZWZpeD0gZ2V0Q29udGVudFByZWZpeCgpLnRyaW0oKTsKLQotCQlmaW5hbCBpbnQgb2Zmc2V0PSBjb250ZW50LmluZGV4T2YocHJlZml4KTsKLQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0KLQkJCWlmIChjb250ZW50LnN0YXJ0c1dpdGgoTkxTX1RBR19QUkVGSVgpKQotCQkJCWZMb2NhbGVTZXF1ZW5jZT0gdHJ1ZTsKLQotCQkJcmFuZ2UudHJpbUJlZ2luKG9mZnNldCArIHByZWZpeC5sZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC50ZXh0LmNvbW1lbnQuQ29tbWVudExpbmUjdG9rZW5pemVMaW5lKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2tlbml6ZUxpbmUoZmluYWwgaW50IGxpbmUpIHsKLQotCQlpZiAoIWZMb2NhbGVTZXF1ZW5jZSkKLQkJCXN1cGVyLnRva2VuaXplTGluZShsaW5lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9jb21tZW50L1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCmluZGV4IDMxMTgwOTguLmMwNDllZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2NvbW1lbnQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTgsOSArOCwxMSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIE1hdHQgTWNDdXRjaGVuIC0gYWRkIGNoZWNrIGZvciBFT0YgaGFuZGxpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmNvbW1lbnQ7CiAKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiAKQEAgLTE4LDExICsyMCwxMSBAQAogCiAvKioKICAqIFJlYWRzIHRoZSB0ZXh0IGNvbnRlbnRzIGZyb20gYSByZWFkZXIgYW5kIGNvbXB1dGVzIGZvciBlYWNoIGNoYXJhY3RlcgotICogYSBwb3RlbnRpYWwgc3Vic3RpdHV0aW9uLiBUaGUgc3Vic3RpdHV0aW9uIG1heSBlYXQgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gCisgKiBhIHBvdGVudGlhbCBzdWJzdGl0dXRpb24uIFRoZSBzdWJzdGl0dXRpb24gbWF5IGVhdCBtb3JlIGNoYXJhY3RlcnMgdGhhbgogICogb25seSB0aGUgb25lIHBhc3NlZCBpbnRvIHRoZSBjb21wdXRhdGlvbiByb3V0aW5lLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JCisKIAlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwogCXByaXZhdGUgYm9vbGVhbiBmV2FzV2hpdGVTcGFjZTsKIAlwcml2YXRlIGludCBmQ2hhckFmdGVyV2hpdGVTcGFjZTsKQEAgLTMxLDIxICszMywyMSBAQAogCSAqIFRlbGxzIHdoZXRoZXIgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyBhcmUgc2tpcHBlZC4KIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gZlNraXBXaGl0ZVNwYWNlPSB0cnVlOwotCQorCiAJcHJpdmF0ZSBib29sZWFuIGZSZWFkRnJvbUJ1ZmZlcjsKIAlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyOwogCXByaXZhdGUgaW50IGZJbmRleDsKIAogCiAJcHJvdGVjdGVkIFN1YnN0aXR1dGlvblRleHRSZWFkZXIoUmVhZGVyIHJlYWRlcikgewotCQlmUmVhZGVyPSByZWFkZXI7Ci0JCWZCdWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZkluZGV4PSAwOwotCQlmUmVhZEZyb21CdWZmZXI9IGZhbHNlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZT0gLTE7Ci0JCWZXYXNXaGl0ZVNwYWNlPSB0cnVlOworCQl0aGlzLmZSZWFkZXI9IHJlYWRlcjsKKwkJdGhpcy5mQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXRoaXMuZkluZGV4PSAwOworCQl0aGlzLmZSZWFkRnJvbUJ1ZmZlcj0gZmFsc2U7CisJCXRoaXMuZkNoYXJBZnRlcldoaXRlU3BhY2U9IC0xOworCQl0aGlzLmZXYXNXaGl0ZVNwYWNlPSB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKIAkgKi8KQEAgLTU3LDc1ICs1OSw3NSBAQAogCQl9CiAJCXJldHVybiBidWYudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBJbXBsZW1lbnQgdG8gY29tcHV0ZSB0aGUgc3Vic3RpdHV0aW9uIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuZCAKKwkgKiBJbXBsZW1lbnQgdG8gY29tcHV0ZSB0aGUgc3Vic3RpdHV0aW9uIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuZAogCSAqIGlmIG5lY2Vzc2FyeSBzdWJzZXF1ZW50IGNoYXJhY3RlcnMuIFVzZSA8Y29kZT5uZXh0Q2hhcjwvY29kZT4KIAkgKiB0byByZWFkIHN1YnNlcXVlbnQgY2hhcmFjdGVycy4KIAkgKi8KIAlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGNvbXB1dGVTdWJzdGl0dXRpb24oaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGludGVybmFsIHJlYWRlci4KIAkgKi8KIAlwcm90ZWN0ZWQgUmVhZGVyIGdldFJlYWRlcigpIHsKLQkJcmV0dXJuIGZSZWFkZXI7CisJCXJldHVybiB0aGlzLmZSZWFkZXI7CiAJfQotCSAKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyLgogCSAqLwogCXByb3RlY3RlZCBpbnQgbmV4dENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZEZyb21CdWZmZXI9IChmQnVmZmVyLmxlbmd0aCgpID4gMCk7Ci0JCWlmIChmUmVhZEZyb21CdWZmZXIpIHsKLQkJCWNoYXIgY2g9IGZCdWZmZXIuY2hhckF0KGZJbmRleCsrKTsKLQkJCWlmIChmSW5kZXggPj0gZkJ1ZmZlci5sZW5ndGgoKSkgewotCQkJCWZCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQkJCWZJbmRleD0gMDsKKwkJdGhpcy5mUmVhZEZyb21CdWZmZXI9ICh0aGlzLmZCdWZmZXIubGVuZ3RoKCkgPiAwKTsKKwkJaWYgKHRoaXMuZlJlYWRGcm9tQnVmZmVyKSB7CisJCQljaGFyIGNoPSB0aGlzLmZCdWZmZXIuY2hhckF0KHRoaXMuZkluZGV4KyspOworCQkJaWYgKHRoaXMuZkluZGV4ID49IHRoaXMuZkJ1ZmZlci5sZW5ndGgoKSkgeworCQkJCXRoaXMuZkJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJCQkJdGhpcy5mSW5kZXg9IDA7CiAJCQl9CiAJCQlyZXR1cm4gY2g7CiAJCX0gZWxzZSB7Ci0JCQlpbnQgY2g9IGZDaGFyQWZ0ZXJXaGl0ZVNwYWNlOworCQkJaW50IGNoPSB0aGlzLmZDaGFyQWZ0ZXJXaGl0ZVNwYWNlOwogCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJY2g9IGZSZWFkZXIucmVhZCgpOworCQkJCWNoPSB0aGlzLmZSZWFkZXIucmVhZCgpOwogCQkJfQotCQkJaWYgKGZTa2lwV2hpdGVTcGFjZSAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhciljaCkpIHsKKwkJCWlmICh0aGlzLmZTa2lwV2hpdGVTcGFjZSAmJiBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSgoY2hhciljaCkpIHsKIAkJCQlkbyB7Ci0JCQkJCWNoPSBmUmVhZGVyLnJlYWQoKTsKKwkJCQkJY2g9IHRoaXMuZlJlYWRlci5yZWFkKCk7CiAJCQkJfSB3aGlsZSAoU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoKGNoYXIpY2gpKTsKIAkJCQlpZiAoY2ggIT0gLTEpIHsKLQkJCQkJZkNoYXJBZnRlcldoaXRlU3BhY2U9IGNoOworCQkJCQl0aGlzLmZDaGFyQWZ0ZXJXaGl0ZVNwYWNlPSBjaDsKIAkJCQkJcmV0dXJuICcgJzsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWZDaGFyQWZ0ZXJXaGl0ZVNwYWNlPSAtMTsKKwkJCQl0aGlzLmZDaGFyQWZ0ZXJXaGl0ZVNwYWNlPSAtMTsKIAkJCX0KIAkJCXJldHVybiBjaDsKIAkJfQogCX0KLQkKKwogCS8qCiAJICogQHNlZSBSZWFkZXIjcmVhZCgpCiAJICovCiAJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IGM7CiAJCWRvIHsKLQkJCQorCiAJCQljPSBuZXh0Q2hhcigpOwotCQkJd2hpbGUgKCFmUmVhZEZyb21CdWZmZXIgJiYgYyAhPSAtMSkgeworCQkJd2hpbGUgKCF0aGlzLmZSZWFkRnJvbUJ1ZmZlciAmJiBjICE9IC0xKSB7CiAJCQkJU3RyaW5nIHM9IGNvbXB1dGVTdWJzdGl0dXRpb24oYyk7CiAJCQkJaWYgKHMgPT0gbnVsbCkKIAkJCQkJYnJlYWs7CiAJCQkJaWYgKHMubGVuZ3RoKCkgPiAwKQotCQkJCQlmQnVmZmVyLmluc2VydCgwLCBzKTsKKwkJCQkJdGhpcy5mQnVmZmVyLmluc2VydCgwLCBzKTsKIAkJCQljPSBuZXh0Q2hhcigpOwogCQkJfQotCQkJCi0JCX0gd2hpbGUgKGZTa2lwV2hpdGVTcGFjZSAmJiBmV2FzV2hpdGVTcGFjZSAmJiAoYyA9PSAnICcpKTsKLQkJZldhc1doaXRlU3BhY2U9IChjID09ICcgJyB8fCBjID09ICdccicgfHwgYyA9PSAnXG4nKTsKKworCQl9IHdoaWxlICh0aGlzLmZTa2lwV2hpdGVTcGFjZSAmJiB0aGlzLmZXYXNXaGl0ZVNwYWNlICYmIChjID09ICcgJykpOworCQl0aGlzLmZXYXNXaGl0ZVNwYWNlPSAoYyA9PSAnICcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyk7CiAJCXJldHVybiBjOwogCX0KLQkJCisKIAkvKgogCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCiAJICovCkBAIC0xNDMsMzggKzE0NSwzOCBAQAogCQkJY2J1ZltpXT0gKGNoYXIpY2g7CiAJCX0KIAkJcmV0dXJuIGxlbjsKLQl9CQkKLQkKKwl9CisKIAkvKgogCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjcmVhZHkoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZSZWFkZXIucmVhZHkoKTsKKwkJcmV0dXJuIHRoaXMuZlJlYWRlci5yZWFkeSgpOwogCX0KLQkJCisKIAkvKgogCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8JCQorCSAqLwogCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jbG9zZSgpOworCQl0aGlzLmZSZWFkZXIuY2xvc2UoKTsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgUmVhZGVyI3Jlc2V0KCkKLQkgKi8JCQorCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5yZXNldCgpOwotCQlmV2FzV2hpdGVTcGFjZT0gdHJ1ZTsKLQkJZkNoYXJBZnRlcldoaXRlU3BhY2U9IC0xOwotCQlmQnVmZmVyLnNldExlbmd0aCgwKTsKLQkJZkluZGV4PSAwOwkJCisJCXRoaXMuZlJlYWRlci5yZXNldCgpOworCQl0aGlzLmZXYXNXaGl0ZVNwYWNlPSB0cnVlOworCQl0aGlzLmZDaGFyQWZ0ZXJXaGl0ZVNwYWNlPSAtMTsKKwkJdGhpcy5mQnVmZmVyLnNldExlbmd0aCgwKTsKKwkJdGhpcy5mSW5kZXg9IDA7CiAJfQogCiAJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2tpcFdoaXRlc3BhY2UoYm9vbGVhbiBzdGF0ZSkgewotCQlmU2tpcFdoaXRlU3BhY2U9IHN0YXRlOworCQl0aGlzLmZTa2lwV2hpdGVTcGFjZT0gc3RhdGU7CiAJfQogCiAJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNTa2lwcGluZ1doaXRlc3BhY2UoKSB7Ci0JCXJldHVybiBmU2tpcFdoaXRlU3BhY2U7CisJCXJldHVybiB0aGlzLmZTa2lwV2hpdGVTcGFjZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9vbGQvQ29kZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvb2xkL0NvZGVGb3JtYXR0ZXIuamF2YQppbmRleCAzNzU5MzhhLi42ZjJjNTExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9vbGQvQ29kZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL29sZC9Db2RlRm9ybWF0dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMTIgKzI0LDEyIEBACiAgKiA8bGk+VXNlIHRoZSBtZXRob2QgPGNvZGU+dm9pZCBmb3JtYXQoYVN0cmluZyk8L2NvZGU+CiAgKiBvbiB0aGlzIGluc3RhbmNlIHRvIGZvcm1hdCA8Y29kZT5hU3RyaW5nPC9jb2RlPi4KICAqIEl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLjwvdWw+Ci0gKiBAZGVwcmVjYXRlZCAKKyAqIEBkZXByZWNhdGVkCiAqLwogcHVibGljIGNsYXNzIENvZGVGb3JtYXR0ZXIgaW1wbGVtZW50cyBUZXJtaW5hbFRva2Vucywgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVGb3JtYXR0ZXIgewogCiAJcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQkKKwogCXB1YmxpYyBDb2RlRm9ybWF0dGVyKE1hcCBvcHRpb25zKSB7CiAJCWlmIChvcHRpb25zID09IG51bGwpIHsKIAkJCXRoaXMub3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKQEAgLTM3LDcgKzM3LDcgQEAKIAkJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZW50TGV2ZWwsIGludFtdIHBvc2l0aW9ucywgU3RyaW5nIGxpbmVTZXBhcmF0b3IpIHsKIAkJLy8gaW5pdGlhbGl6ZSB0aGUgbmV3IGZvcm1hdHRlciB3aXRoIG9sZCBvcHRpb25zCiAJCU1hcCBuZXdPcHRpb25zID0gRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuZ2V0RWNsaXBzZTIxU2V0dGluZ3MoKTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQluZXdPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9PUEVOSU5HX0JSQUNFX0lOX0FSUkFZX0lOSVRJQUxJWkVSLCBKYXZhQ29yZS5JTlNFUlQpOwogCQluZXdPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX09QRU5JTkdfQlJBQ0VfSU5fQVJSQVlfSU5JVElBTElaRVIsIEphdmFDb3JlLklOU0VSVCk7CiAJCW5ld09wdGlvbnMucHV0KERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfQlJBQ0VfSU5fQVJSQVlfSU5JVElBTElaRVIsIEphdmFDb3JlLklOU0VSVCk7Ci0JCQorCiAJCURlZmF1bHRDb2RlRm9ybWF0dGVyIGRlZmF1bHRDb2RlRm9ybWF0dGVyID0gbmV3IERlZmF1bHRDb2RlRm9ybWF0dGVyKG5ld09wdGlvbnMpOwogCQlUZXh0RWRpdCB0ZXh0RWRpdCA9IGRlZmF1bHRDb2RlRm9ybWF0dGVyLmZvcm1hdChvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCgpLCBpbmRlbnRMZXZlbCwgbGluZVNlcGFyYXRvcik7CiAJCWlmIChwb3NpdGlvbnMgIT0gbnVsbCAmJiB0ZXh0RWRpdCAhPSBudWxsKSB7CkBAIC0xNjEsNSArMTYxLDUgQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmVkaXRlZFN0cmluZyhzdHJpbmcsIHRleHRFZGl0KTsKLQl9CQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2dyYW1tYXIvamF2YS5nIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZ3JhbW1hci9qYXZhLmcKaW5kZXggMzkwNmFjMS4uOGViMGQwYyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZ3JhbW1hci9qYXZhLmcKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZ3JhbW1hci9qYXZhLmcKQEAgLTE2NCwxMyArMTY0LDExIEBACiAKICRSdWxlcwogCi0vLi8vIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gYXV0b21hdGljIGdlbmVyYXRpb24gOiBkbyBOT1QgZWRpdC1tb2RpZnkgIAorLy4vLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUnVsZShpbnQgYWN0KSB7CiAgIHN3aXRjaCAoIGFjdCApIHsKIC4vCiAKLQotCiBHb2FsIDo6PSAnKysnIENvbXBpbGF0aW9uVW5pdAogR29hbCA6Oj0gJy0tJyBNZXRob2RCb2R5CiAtLSBJbml0aWFsaXplcgpAQCAtMjM3LDcgKzIzNSw3IEBACiAvOiRyZWFkYWJsZU5hbWUgRmxvYXRpbmdQb2ludFR5cGU6LwogCiBSZWZlcmVuY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZQotLy4kcHV0Q2FzZSBjb25zdW1lUmVmZXJlbmNlVHlwZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICRicmVhayAuLwogUmVmZXJlbmNlVHlwZSAtPiBBcnJheVR5cGUKIC86JHJlYWRhYmxlTmFtZSBSZWZlcmVuY2VUeXBlOi8KIApAQCAtMjQ5LDE1ICsyNDcsMjAgQEAKIC86JHJlYWRhYmxlTmFtZSBUeXBlOi8KIAogQ2xhc3NPckludGVyZmFjZSA6Oj0gTmFtZQotLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NPckludGVyZmFjZU5hbWUoKTsgICRicmVhayAuLworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NPckludGVyZmFjZU5hbWUoKTsgJGJyZWFrIC4vCiBDbGFzc09ySW50ZXJmYWNlIDo6PSBHZW5lcmljVHlwZSAnLicgTmFtZQotLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NPckludGVyZmFjZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc09ySW50ZXJmYWNlKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFR5cGU6LwogCiBHZW5lcmljVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZSBUeXBlQXJndW1lbnRzCi0vLiRwdXRDYXNlIGNvbnN1bWVHZW5lcmljVHlwZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVHZW5lcmljVHlwZSgpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBHZW5lcmljVHlwZTovCiAKK0dlbmVyaWNUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlICc8JyAnPicKKy8uJHB1dENhc2UgY29uc3VtZUdlbmVyaWNUeXBlV2l0aERpYW1vbmQoKTsgJGJyZWFrIC4vCisvOiRyZWFkYWJsZU5hbWUgR2VuZXJpY1R5cGU6LworLzokY29tcGxpYW5jZSAxLjc6LworCiAtLQogLS0gVGhlc2UgcnVsZXMgaGF2ZSBiZWVuIHJld3JpdHRlbiB0byBhdm9pZCBzb21lIGNvbmZsaWN0cyBpbnRyb2R1Y2VkCiAtLSBieSBhZGRpbmcgdGhlIDEuMSBmZWF0dXJlcwpAQCAtMjY4LDE3ICsyNzEsMTcgQEAKIC0tCiAKIEFycmF5VHlwZVdpdGhUeXBlQXJndW1lbnRzTmFtZSA6Oj0gR2VuZXJpY1R5cGUgJy4nIE5hbWUKLS8uJHB1dENhc2UgY29uc3VtZUFycmF5VHlwZVdpdGhUeXBlQXJndW1lbnRzTmFtZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheVR5cGVXaXRoVHlwZUFyZ3VtZW50c05hbWUoKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgQXJyYXlUeXBlV2l0aFR5cGVBcmd1bWVudHNOYW1lOi8KIAogQXJyYXlUeXBlIDo6PSBQcmltaXRpdmVUeXBlIERpbXMKLS8uJHB1dENhc2UgY29uc3VtZVByaW1pdGl2ZUFycmF5VHlwZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltaXRpdmVBcnJheVR5cGUoKTsgJGJyZWFrIC4vCiBBcnJheVR5cGUgOjo9IE5hbWUgRGltcwotLy4kcHV0Q2FzZSBjb25zdW1lTmFtZUFycmF5VHlwZSgpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVOYW1lQXJyYXlUeXBlKCk7ICRicmVhayAuLwogQXJyYXlUeXBlIDo6PSBBcnJheVR5cGVXaXRoVHlwZUFyZ3VtZW50c05hbWUgRGltcwotLy4kcHV0Q2FzZSBjb25zdW1lR2VuZXJpY1R5cGVOYW1lQXJyYXlUeXBlKCk7ICAkYnJlYWsgLi8KKy8uJHB1dENhc2UgY29uc3VtZUdlbmVyaWNUeXBlTmFtZUFycmF5VHlwZSgpOyAkYnJlYWsgLi8KIEFycmF5VHlwZSA6Oj0gR2VuZXJpY1R5cGUgRGltcwotLy4kcHV0Q2FzZSBjb25zdW1lR2VuZXJpY1R5cGVBcnJheVR5cGUoKTsgICRicmVhayAuLworLy4kcHV0Q2FzZSBjb25zdW1lR2VuZXJpY1R5cGVBcnJheVR5cGUoKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgQXJyYXlUeXBlOi8KIAogQ2xhc3NUeXBlIC0+IENsYXNzT3JJbnRlcmZhY2VUeXBlCkBAIC0zNTAsNyArMzUzLDcgQEAKIEhlYWRlcjIgLT4gRW51bUNvbnN0YW50SGVhZGVyCiAvOiRyZWFkYWJsZU5hbWUgSGVhZGVyMjovCiAKLUNhdGNoSGVhZGVyIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICd7JworQ2F0Y2hIZWFkZXIgOjo9ICdjYXRjaCcgJygnIENhdGNoRm9ybWFsUGFyYW1ldGVyICcpJyAneycKIC8uJHB1dENhc2UgY29uc3VtZUNhdGNoSGVhZGVyKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIENhdGNoSGVhZGVyOi8KIApAQCAtMzY1LDIwICszNjgsMjAgQEAKIC86JHJlYWRhYmxlTmFtZSBUeXBlRGVjbGFyYXRpb25zOi8KIAogUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lICc7JwotLy4kcHV0Q2FzZSAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKy8uJHB1dENhc2UgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBQYWNrYWdlRGVjbGFyYXRpb246LwogCiBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSBNb2RpZmllcnMgJ3BhY2thZ2UnIFB1c2hSZWFsTW9kaWZpZXJzIE5hbWUKLS8uJHB1dENhc2UgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lV2l0aE1vZGlmaWVycygpOyAkYnJlYWsgLi8KKy8uJHB1dENhc2UgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWVXaXRoTW9kaWZpZXJzKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFBhY2thZ2VEZWNsYXJhdGlvbk5hbWU6LwogLzokY29tcGxpYW5jZSAxLjU6LwogCiBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSBQYWNrYWdlQ29tbWVudCAncGFja2FnZScgTmFtZQotLy4kcHV0Q2FzZSAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWUoKTsgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFBhY2thZ2VEZWNsYXJhdGlvbk5hbWU6LwogCiBQYWNrYWdlQ29tbWVudCA6Oj0gJGVtcHR5Ci0vLiRwdXRDYXNlICBjb25zdW1lUGFja2FnZUNvbW1lbnQoKTsgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVQYWNrYWdlQ29tbWVudCgpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBQYWNrYWdlQ29tbWVudDovCiAKIEltcG9ydERlY2xhcmF0aW9uIC0+IFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbgpAQCAtMzkzLDExICszOTYsMTEgQEAKIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSAnOycKIC8uJHB1dENhc2UgY29uc3VtZUltcG9ydERlY2xhcmF0aW9uKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbjovCi0JCQkgIAorCiBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lCiAvLiRwdXRDYXNlIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWU6LwotCQkJICAKKwogVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24gOjo9IFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSAnOycKIC8uJHB1dENhc2UgY29uc3VtZUltcG9ydERlY2xhcmF0aW9uKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uOi8KQEAgLTUwMCw3ICs1MDMsNyBAQAogQ2xhc3NCb2R5RGVjbGFyYXRpb24gLT4gU3RhdGljSW5pdGlhbGl6ZXIKIENsYXNzQm9keURlY2xhcmF0aW9uIC0+IENvbnN0cnVjdG9yRGVjbGFyYXRpb24KIC0tMS4xIGZlYXR1cmUKLUNsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jaworQ2xhc3NCb2R5RGVjbGFyYXRpb24gOjo9IERpZXQgTmVzdGVkTWV0aG9kIENyZWF0ZUluaXRpYWxpemVyIEJsb2NrCiAvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBDbGFzc0JvZHlEZWNsYXJhdGlvbjovCiAKQEAgLTUwOCwxMCArNTExLDE0IEBACiAvLiRwdXRDYXNlIGNvbnN1bWVEaWV0KCk7ICRicmVhay4vCiAvOiRyZWFkYWJsZU5hbWUgRGlldDovCiAKLUluaXRpYWxpemVyIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jaworSW5pdGlhbGl6ZXIgOjo9IERpZXQgTmVzdGVkTWV0aG9kIENyZWF0ZUluaXRpYWxpemVyIEJsb2NrCiAvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBJbml0aWFsaXplcjovCiAKK0NyZWF0ZUluaXRpYWxpemVyIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUNyZWF0ZUluaXRpYWxpemVyKCk7ICRicmVhay4vCisvOiRyZWFkYWJsZU5hbWUgQ3JlYXRlSW5pdGlhbGl6ZXI6LworCiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IEZpZWxkRGVjbGFyYXRpb24KIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gLT4gTWV0aG9kRGVjbGFyYXRpb24KIC0tMS4xIGZlYXR1cmUKQEAgLTYwMSwxMiArNjA4LDEyIEBACiBNZXRob2REZWNsYXJhdGlvbiAtPiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCiBNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkgCiAvLiRwdXRDYXNlIC8vIHNldCB0byB0cnVlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aCBhIGJvZHkKLSAgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOyAgJGJyZWFrIC4vCisgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBNZXRob2REZWNsYXJhdGlvbjovCiAKIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciAnOycKIC8uJHB1dENhc2UgLy8gc2V0IHRvIGZhbHNlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aG91dCBib2R5Ci0gIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICRicmVhayAuLworIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIE1ldGhvZERlY2xhcmF0aW9uOi8KIAogTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIEZvcm1hbFBhcmFtZXRlckxpc3RvcHQgTWV0aG9kSGVhZGVyUmlnaHRQYXJlbiBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0CkBAIC02MzYsOSArNjQzLDkgQEAKIC8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIENvbnN0cnVjdG9yRGVjbGFyYXRpb246LwogCi1Db25zdHJ1Y3RvckhlYWRlck5hbWUgOjo9ICBNb2RpZmllcnNvcHQgVHlwZVBhcmFtZXRlcnMgJ0lkZW50aWZpZXInICcoJworQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZVBhcmFtZXRlcnMgJ0lkZW50aWZpZXInICcoJwogLy4kcHV0Q2FzZSBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCk7ICRicmVhayAuLwotQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKK0NvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKIC8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBDb25zdHJ1Y3RvckhlYWRlck5hbWU6LwogCkBAIC02NTYsNiArNjYzLDIyIEBACiAvOiRjb21wbGlhbmNlIDEuNTovCiAvOiRyZWNvdmVyeV90ZW1wbGF0ZSBJZGVudGlmaWVyIElkZW50aWZpZXI6LwogCitDYXRjaEZvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzb3B0IENhdGNoVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZAorLy4kcHV0Q2FzZSBjb25zdW1lQ2F0Y2hGb3JtYWxQYXJhbWV0ZXIoKTsgJGJyZWFrIC4vCisvOiRyZWFkYWJsZU5hbWUgRm9ybWFsUGFyYW1ldGVyOi8KKy86JHJlY292ZXJ5X3RlbXBsYXRlIElkZW50aWZpZXIgSWRlbnRpZmllcjovCisKK0NhdGNoVHlwZSA6Oj0gVW5pb25UeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVDYXRjaFR5cGUoKTsgJGJyZWFrIC4vCisvOiRyZWFkYWJsZU5hbWUgQ2F0Y2hUeXBlOi8KKworVW5pb25UeXBlIDo6PSBUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVVbmlvblR5cGVBc0NsYXNzVHlwZSgpOyAkYnJlYWsgLi8KK1VuaW9uVHlwZSA6Oj0gVW5pb25UeXBlICd8JyBUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVVbmlvblR5cGUoKTsgJGJyZWFrIC4vCisvOiRyZWFkYWJsZU5hbWUgVW5pb25UeXBlOi8KKy86JGNvbXBsaWFuY2UgMS43Oi8KKwogQ2xhc3NUeXBlTGlzdCAtPiBDbGFzc1R5cGVFbHQKIENsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgJywnIENsYXNzVHlwZUVsdAogLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NUeXBlTGlzdCgpOyAkYnJlYWsgLi8KQEAgLTY3Niw3ICs2OTksNyBAQAogCiAtLTE4LjguNCBQcm9kdWN0aW9ucyBmcm9tIDguNTogU3RhdGljIEluaXRpYWxpemVycwogCi1TdGF0aWNJbml0aWFsaXplciA6Oj0gIFN0YXRpY09ubHkgQmxvY2sKK1N0YXRpY0luaXRpYWxpemVyIDo6PSBTdGF0aWNPbmx5IEJsb2NrCiAvLiRwdXRDYXNlIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOyAkYnJlYWsuLwogLzokcmVhZGFibGVOYW1lIFN0YXRpY0luaXRpYWxpemVyOi8KIApAQCAtNzk0LDEzICs4MTcsMjAgQEAKIAogLS0gVGhlc2UgcnVsZXMgYXJlIGFkZGVkIHRvIGJlIGFibGUgdG8gcGFyc2UgY29uc3RydWN0b3JzIGluc2lkZSBpbnRlcmZhY2UgYW5kIHRoZW4gcmVwb3J0IGEgcmVsZXZlbnQgZXJyb3IgbWVzc2FnZQogSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIE1ldGhvZEJvZHkKLS8uJHB1dENhc2UgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRydWUpOyAgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0cnVlKTsgJGJyZWFrIC4vCiBJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgJzsnCi0vLiRwdXRDYXNlIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihmYWxzZSk7ICAkYnJlYWsgLi8KKy8uJHB1dENhc2UgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGZhbHNlKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb246LwogCistLSBUaGVzZSBydWxlcyBhcmUgYWRkZWQgdG8gYmUgYWJsZSB0byBwYXJzZSBpbml0aWFsaXplcnMgaW5zaWRlIGFuIGludGVyZmFjZSBhbmQgdGhlbiByZXBvcnQgYSByZWxldmVudCBlcnJvciBtZXNzYWdlIChidWcgMjEyNzEzKQorSW52YWxpZEluaXRpYWxpemVyIC0+IFN0YXRpY0luaXRpYWxpemVyCitJbnZhbGlkSW5pdGlhbGl6ZXIgLT4gSW5pdGlhbGl6ZXIKKy86JHJlYWRhYmxlTmFtZSBJbnZhbGlkSW5pdGlhbGl6ZXI6LworCisKIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiAtPiBJbnZhbGlkSW5pdGlhbGl6ZXIKIC0tMS4xIGZlYXR1cmUKIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KIC0tMS4xIGZlYXR1cmUKQEAgLTkxOSw2ICs5NDksNyBAQAogU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFN5bmNocm9uaXplZFN0YXRlbWVudAogU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFRocm93U3RhdGVtZW50CiBTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gVHJ5U3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gVHJ5U3RhdGVtZW50V2l0aFJlc291cmNlcwogLzokcmVhZGFibGVOYW1lIFN0YXRlbWVudDovCiAKIEVtcHR5U3RhdGVtZW50IDo6PSAnOycKQEAgLTk1MSwxNSArOTgyLDE1IEBACiBTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uCiAvOiRyZWFkYWJsZU5hbWUgRXhwcmVzc2lvbjovCiAKLUlmVGhlblN0YXRlbWVudCA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudAorSWZUaGVuU3RhdGVtZW50IDo6PSAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnQKIC8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIElmU3RhdGVtZW50Oi8KIAotSWZUaGVuRWxzZVN0YXRlbWVudCA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudE5vU2hvcnRJZiAnZWxzZScgU3RhdGVtZW50CitJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudAogLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBJZlN0YXRlbWVudDovCiAKLUlmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudE5vU2hvcnRJZgorSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyBTdGF0ZW1lbnROb1Nob3J0SWYKIC8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudElmV2l0aEVsc2UoKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgSWZTdGF0ZW1lbnQ6LwogCkBAIC0xMDYzLDcgKzEwOTQsNyBAQAogLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50VGhyb3coKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgVGhyb3dTdGF0ZW1lbnQ6LwogCi1TeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgJygnIEV4cHJlc3Npb24gJyknICAgIEJsb2NrCitTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgJygnIEV4cHJlc3Npb24gJyknIEJsb2NrCiAvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgU3luY2hyb25pemVkU3RhdGVtZW50Oi8KIApAQCAtMTA3MiwxMSArMTEwMyw1MiBAQAogLzokcmVhZGFibGVOYW1lIE9ubHlTeW5jaHJvbml6ZWQ6LwogCiBUcnlTdGF0ZW1lbnQgOjo9ICd0cnknIFRyeUJsb2NrIENhdGNoZXMKLS8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeShmYWxzZSk7ICRicmVhayAuLworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlLCBmYWxzZSk7ICRicmVhayAuLwogVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyBUcnlCbG9jayBDYXRjaGVzb3B0IEZpbmFsbHkKLS8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeSh0cnVlKTsgJGJyZWFrIC4vCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSwgZmFsc2UpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBUcnlTdGF0ZW1lbnQ6LwogCitUcnlTdGF0ZW1lbnRXaXRoUmVzb3VyY2VzIDo6PSAndHJ5JyBSZXNvdXJjZVNwZWNpZmljYXRpb24gVHJ5QmxvY2sgQ2F0Y2hlc29wdAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlLCB0cnVlKTsgJGJyZWFrIC4vCitUcnlTdGF0ZW1lbnRXaXRoUmVzb3VyY2VzIDo6PSAndHJ5JyBSZXNvdXJjZVNwZWNpZmljYXRpb24gVHJ5QmxvY2sgQ2F0Y2hlc29wdCBGaW5hbGx5CisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSwgdHJ1ZSk7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIFRyeVN0YXRlbWVudFdpdGhSZXNvdXJjZXM6LworLzokY29tcGxpYW5jZSAxLjc6LworCitSZXNvdXJjZVNwZWNpZmljYXRpb24gOjo9ICcoJyBSZXNvdXJjZXMgO29wdCAnKScKKy8uJHB1dENhc2UgY29uc3VtZVJlc291cmNlU3BlY2lmaWNhdGlvbigpOyAkYnJlYWsgLi8KKy86JHJlYWRhYmxlTmFtZSBSZXNvdXJjZVNwZWNpZmljYXRpb246LworLzokY29tcGxpYW5jZSAxLjc6LworCis7b3B0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZVJlc291cmNlT3B0aW9uYWxUcmFpbGluZ1NlbWlDb2xvbihmYWxzZSk7ICRicmVhayAuLworO29wdCA6Oj0gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVSZXNvdXJjZU9wdGlvbmFsVHJhaWxpbmdTZW1pQ29sb24odHJ1ZSk7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIDs6LworLzokY29tcGxpYW5jZSAxLjc6LworCitSZXNvdXJjZXMgOjo9IFJlc291cmNlCisvLiRwdXRDYXNlIGNvbnN1bWVTaW5nbGVSZXNvdXJjZSgpOyAkYnJlYWsgLi8KK1Jlc291cmNlcyA6Oj0gUmVzb3VyY2VzIFRyYWlsaW5nU2VtaUNvbG9uIFJlc291cmNlCisvLiRwdXRDYXNlIGNvbnN1bWVNdWx0aXBsZVJlc291cmNlcygpOyAkYnJlYWsgLi8KKy86JHJlYWRhYmxlTmFtZSBSZXNvdXJjZXM6LworLzokY29tcGxpYW5jZSAxLjc6LworCitUcmFpbGluZ1NlbWlDb2xvbiA6Oj0gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVSZXNvdXJjZU9wdGlvbmFsVHJhaWxpbmdTZW1pQ29sb24odHJ1ZSk7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIDs6LworLzokY29tcGxpYW5jZSAxLjc6LworCitSZXNvdXJjZSA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcklkIEVudGVyVmFyaWFibGUgJz0nIEZvcmNlTm9EaWV0IFZhcmlhYmxlSW5pdGlhbGl6ZXIgUmVzdG9yZURpZXQgRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVSZXNvdXJjZUFzTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIFJlc291cmNlOi8KKy86JGNvbXBsaWFuY2UgMS43Oi8KKworUmVzb3VyY2UgOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hSZWFsTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcklkIEVudGVyVmFyaWFibGUgJz0nIEZvcmNlTm9EaWV0IFZhcmlhYmxlSW5pdGlhbGl6ZXIgUmVzdG9yZURpZXQgRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVSZXNvdXJjZUFzTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIFJlc291cmNlOi8KKy86JGNvbXBsaWFuY2UgMS43Oi8KKwogVHJ5QmxvY2sgOjo9IEJsb2NrIEV4aXRUcnlCbG9jawogLzokcmVhZGFibGVOYW1lIEJsb2NrOi8KIApAQCAtMTA4OSwxNyArMTE2MSwxNyBAQAogLy4kcHV0Q2FzZSBjb25zdW1lQ2F0Y2hlcygpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBDYXRjaGVzOi8KIAotQ2F0Y2hDbGF1c2UgOjo9ICdjYXRjaCcgJygnIEZvcm1hbFBhcmFtZXRlciAnKScgICAgQmxvY2sKK0NhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyBDYXRjaEZvcm1hbFBhcmFtZXRlciAnKScgQmxvY2sKIC8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudENhdGNoKCkgOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBDYXRjaENsYXVzZTovCiAKLUZpbmFsbHkgOjo9ICdmaW5hbGx5JyAgICBCbG9jaworRmluYWxseSA6Oj0gJ2ZpbmFsbHknIEJsb2NrCiAvOiRyZWFkYWJsZU5hbWUgRmluYWxseTovCiAvOiRyZWNvdmVyeV90ZW1wbGF0ZSBmaW5hbGx5IHsgfTovCiAKIC0tMTguMTIgUHJvZHVjdGlvbnMgZnJvbSAxNDogRXhwcmVzc2lvbnMKIAotLS1mb3Igc291cmNlIHBvc2l0aW9ubmluZyBwdXJwb3NlCistLWZvciBzb3VyY2UgcG9zaXRpb25pbmcgcHVycG9zZQogUHVzaExQQVJFTiA6Oj0gJygnCiAvLiRwdXRDYXNlIGNvbnN1bWVMZWZ0UGFyZW4oKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgKDovCkBAIC0xMTE4LDEwICsxMTkwLDEwIEBACiBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gJ3RoaXMnCiAvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVRoaXMoKTsgJGJyZWFrIC4vCiAKLVByaW1hcnlOb05ld0FycmF5IDo6PSAgUHVzaExQQVJFTiBFeHByZXNzaW9uX05vdE5hbWUgUHVzaFJQQVJFTiAKK1ByaW1hcnlOb05ld0FycmF5IDo6PSBQdXNoTFBBUkVOIEV4cHJlc3Npb25fTm90TmFtZSBQdXNoUlBBUkVOIAogLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKTsgJGJyZWFrIC4vCiAKLVByaW1hcnlOb05ld0FycmF5IDo6PSAgUHVzaExQQVJFTiBOYW1lIFB1c2hSUEFSRU4gCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHVzaExQQVJFTiBOYW1lIFB1c2hSUEFSRU4gCiAvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVdpdGhOYW1lKCk7ICRicmVhayAuLwogCiBQcmltYXJ5Tm9OZXdBcnJheSAtPiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uCkBAIC0xMTMzLDcgKzEyMDUsNyBAQAogLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lU3VwZXIoKTsgJGJyZWFrIC4vCiAKIC0tMS4xIGZlYXR1cmUKLS0tUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFR5cGUgJy4nICdjbGFzcycgICAKKy0tUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFR5cGUgJy4nICdjbGFzcycKIC0taW5saW5lIFR5cGUgaW4gdGhlIHByZXZpb3VzIHJ1bGUgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZ3JhbW1hciBMTDEgaW5zdGVhZCAKIC0tIG9mIExMMi4gVGhlIHJlc3VsdCBpcyB0aGUgMyBuZXh0IHJ1bGVzLgogCkBAIC0xMTYyLDI1ICsxMjM0LDI1IEBACiAvLiRwdXRDYXNlIGNvbnN1bWVBbGxvY2F0aW9uSGVhZGVyKCk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIEFsbG9jYXRpb25IZWFkZXI6LwogCi1DbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBPbmx5VHlwZUFyZ3VtZW50cyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBPbmx5VHlwZUFyZ3VtZW50cyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgVW5xdWFsaWZpZWRDbGFzc0JvZHlvcHQKIC8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpOyAkYnJlYWsgLi8KIAotQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIFVucXVhbGlmaWVkQ2xhc3NCb2R5b3B0CiAvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKCk7ICRicmVhayAuLwogLS0xLjEgZmVhdHVyZQogCi1DbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBPbmx5VHlwZUFyZ3VtZW50cyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBPbmx5VHlwZUFyZ3VtZW50cyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgUXVhbGlmaWVkQ2xhc3NCb2R5b3B0CiAvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkV2l0aFR5cGVBcmd1bWVudHMoKSA7ICRicmVhayAuLwogCi1DbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgUXVhbGlmaWVkQ2xhc3NCb2R5b3B0CiAvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCkgOyAkYnJlYWsgLi8KIAogLS0xLjEgZmVhdHVyZQotQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIFF1YWxpZmllZENsYXNzQm9keW9wdAogLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpIDsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbjovCiAKLUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIE9ubHlUeXBlQXJndW1lbnRzIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKK0NsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIE9ubHlUeXBlQXJndW1lbnRzIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBRdWFsaWZpZWRDbGFzc0JvZHlvcHQKIC8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWRXaXRoVHlwZUFyZ3VtZW50cygpIDsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbjovCiAKQEAgLTExODgsMTQgKzEyNjAsMjQgQEAKIC8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lKCkgOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZTovCiAKLUNsYXNzQm9keW9wdCA6Oj0gJGVtcHR5IC0tdGVzdCBtYWRlIHVzaW5nIG51bGwgYXMgY29udGVudHMKK1VucXVhbGlmaWVkQ2xhc3NCb2R5b3B0IDo6PSAkZW1wdHkgLS10ZXN0IG1hZGUgdXNpbmcgbnVsbCBhcyBjb250ZW50cwogLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NCb2R5b3B0KCk7ICRicmVhayAuLwotQ2xhc3NCb2R5b3B0IDo6PSBFbnRlckFub255bW91c0NsYXNzQm9keSBDbGFzc0JvZHkKK1VucXVhbGlmaWVkQ2xhc3NCb2R5b3B0IDo6PSBVbnF1YWxpZmllZEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IENsYXNzQm9keQogLzokcmVhZGFibGVOYW1lIENsYXNzQm9keTovCiAvOiRub19zdGF0ZW1lbnRzX3JlY292ZXJ5Oi8KIAotRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9ICRlbXB0eQotLy4kcHV0Q2FzZSBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKTsgJGJyZWFrIC4vCitVbnF1YWxpZmllZEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KGZhbHNlKTsgJGJyZWFrIC4vCisvOiRyZWFkYWJsZU5hbWUgRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHk6LworCitRdWFsaWZpZWRDbGFzc0JvZHlvcHQgOjo9ICRlbXB0eSAtLXRlc3QgbWFkZSB1c2luZyBudWxsIGFzIGNvbnRlbnRzCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlvcHQoKTsgJGJyZWFrIC4vCitRdWFsaWZpZWRDbGFzc0JvZHlvcHQgOjo9IFF1YWxpZmllZEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IENsYXNzQm9keQorLzokcmVhZGFibGVOYW1lIENsYXNzQm9keTovCisvOiRub19zdGF0ZW1lbnRzX3JlY292ZXJ5Oi8KKworUXVhbGlmaWVkRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkodHJ1ZSk7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5Oi8KIAogQXJndW1lbnRMaXN0IDo6PSBFeHByZXNzaW9uCkBAIC0xMzY3LDE4ICsxNDQ5LDE4IEBACiAvOiRyZWFkYWJsZU5hbWUgRXhwcmVzc2lvbjovCiAKIFNoaWZ0RXhwcmVzc2lvbiAtPiBBZGRpdGl2ZUV4cHJlc3Npb24KLVNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc8PCcgIEFkZGl0aXZlRXhwcmVzc2lvbgorU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJzw8JyBBZGRpdGl2ZUV4cHJlc3Npb24KIC8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTEVGVF9TSElGVCk7ICRicmVhayAuLwotU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJz4+JyAgQWRkaXRpdmVFeHByZXNzaW9uCitTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiAnPj4nIEFkZGl0aXZlRXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5SSUdIVF9TSElGVCk7ICRicmVhayAuLwogU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJz4+PicgQWRkaXRpdmVFeHByZXNzaW9uCiAvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgRXhwcmVzc2lvbjovCiAKIFJlbGF0aW9uYWxFeHByZXNzaW9uIC0+IFNoaWZ0RXhwcmVzc2lvbgotUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc8JyAgU2hpZnRFeHByZXNzaW9uCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJzwnIFNoaWZ0RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5MRVNTKTsgJGJyZWFrIC4vCi1SZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJz4nICBTaGlmdEV4cHJlc3Npb24KK1JlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPicgU2hpZnRFeHByZXNzaW9uCiAvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkdSRUFURVIpOyAkYnJlYWsgLi8KIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPD0nIFNoaWZ0RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5MRVNTX0VRVUFMKTsgJGJyZWFrIC4vCkBAIC0xNTg4LDYgKzE2NzAsOSBAQAogCiBFbnVtSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdlbnVtJyBJZGVudGlmaWVyCiAvLiAkcHV0Q2FzZSBjb25zdW1lRW51bUhlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisvOiRjb21wbGlhbmNlIDEuNTovCitFbnVtSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdlbnVtJyBJZGVudGlmaWVyIFR5cGVQYXJhbWV0ZXJzCisvLiAkcHV0Q2FzZSBjb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgRW51bUhlYWRlck5hbWU6LwogLzokY29tcGxpYW5jZSAxLjU6LwogCkBAIC0xOTUyLDEzICsyMDM3LDEzIEBACiAvOiRyZWFkYWJsZU5hbWUgRXhwcmVzc2lvbjovCiAKIFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lIC0+IEFkZGl0aXZlRXhwcmVzc2lvbl9Ob3ROYW1lCi1TaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgJzw8JyAgQWRkaXRpdmVFeHByZXNzaW9uCitTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgJzw8JyBBZGRpdGl2ZUV4cHJlc3Npb24KIC8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTEVGVF9TSElGVCk7ICRicmVhayAuLwotU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJzw8JyAgQWRkaXRpdmVFeHByZXNzaW9uCitTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSAnPDwnIEFkZGl0aXZlRXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkxFRlRfU0hJRlQpOyAkYnJlYWsgLi8KLVNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSAnPj4nICBBZGRpdGl2ZUV4cHJlc3Npb24KK1NoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSAnPj4nIEFkZGl0aXZlRXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvcklkcy5SSUdIVF9TSElGVCk7ICRicmVhayAuLwotU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJz4+JyAgQWRkaXRpdmVFeHByZXNzaW9uCitTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSAnPj4nIEFkZGl0aXZlRXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLlJJR0hUX1NISUZUKTsgJGJyZWFrIC4vCiBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSA6Oj0gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUgJz4+PicgQWRkaXRpdmVFeHByZXNzaW9uCiAvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCkBAIC0xOTY3LDEzICsyMDUyLDEzIEBACiAvOiRyZWFkYWJsZU5hbWUgRXhwcmVzc2lvbjovCiAKIFJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgLT4gU2hpZnRFeHByZXNzaW9uX05vdE5hbWUKLVJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lICc8JyAgU2hpZnRFeHByZXNzaW9uCitSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSAnPCcgU2hpZnRFeHByZXNzaW9uCiAvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkxFU1MpOyAkYnJlYWsgLi8KLVJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJzwnICBTaGlmdEV4cHJlc3Npb24KK1JlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJzwnIFNoaWZ0RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkxFU1MpOyAkYnJlYWsgLi8KLVJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IFNoaWZ0RXhwcmVzc2lvbl9Ob3ROYW1lICc+JyAgU2hpZnRFeHByZXNzaW9uCitSZWxhdGlvbmFsRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBTaGlmdEV4cHJlc3Npb25fTm90TmFtZSAnPicgU2hpZnRFeHByZXNzaW9uCiAvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9ySWRzLkdSRUFURVIpOyAkYnJlYWsgLi8KLVJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJz4nICBTaGlmdEV4cHJlc3Npb24KK1JlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IE5hbWUgJz4nIFNoaWZ0RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbldpdGhOYW1lKE9wZXJhdG9ySWRzLkdSRUFURVIpOyAkYnJlYWsgLi8KIFJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uX05vdE5hbWUgJzw9JyBTaGlmdEV4cHJlc3Npb24KIC8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JJZHMuTEVTU19FUVVBTCk7ICRicmVhayAuLwpAQCAtMTk4OCw3ICsyMDczLDcgQEAKIEluc3RhbmNlb2ZFeHByZXNzaW9uX05vdE5hbWUgLT4gUmVsYXRpb25hbEV4cHJlc3Npb25fTm90TmFtZQogSW5zdGFuY2VvZkV4cHJlc3Npb25fTm90TmFtZSA6Oj0gTmFtZSAnaW5zdGFuY2VvZicgUmVmZXJlbmNlVHlwZQogLy4kcHV0Q2FzZSBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb25XaXRoTmFtZSgpOyAkYnJlYWsgLi8KLUluc3RhbmNlb2ZFeHByZXNzaW9uX05vdE5hbWUgIDo6PSBJbnN0YW5jZW9mRXhwcmVzc2lvbl9Ob3ROYW1lICdpbnN0YW5jZW9mJyBSZWZlcmVuY2VUeXBlCitJbnN0YW5jZW9mRXhwcmVzc2lvbl9Ob3ROYW1lIDo6PSBJbnN0YW5jZW9mRXhwcmVzc2lvbl9Ob3ROYW1lICdpbnN0YW5jZW9mJyBSZWZlcmVuY2VUeXBlCiAvLiRwdXRDYXNlIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBFeHByZXNzaW9uOi8KIApAQCAtMjA2MCw2ICsyMTQ1LDEyIEBACiBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzICdAJyBQdXNoUmVhbE1vZGlmaWVycyBpbnRlcmZhY2UgSWRlbnRpZmllcgogLy4kcHV0Q2FzZSBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUoKSA7ICRicmVhayAuLwogLzokY29tcGxpYW5jZSAxLjU6LworQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUgOjo9IE1vZGlmaWVycyAnQCcgUHVzaFJlYWxNb2RpZmllcnMgaW50ZXJmYWNlIElkZW50aWZpZXIgVHlwZVBhcmFtZXRlcnMKKy8uJHB1dENhc2UgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgOyAkYnJlYWsgLi8KKy86JGNvbXBsaWFuY2UgMS41Oi8KK0Fubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lIDo6PSAnQCcgUHVzaE1vZGlmaWVyc0ZvckhlYWRlciBpbnRlcmZhY2UgSWRlbnRpZmllciBUeXBlUGFyYW1ldGVycworLy4kcHV0Q2FzZSBjb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKSA7ICRicmVhayAuLworLzokY29tcGxpYW5jZSAxLjU6LwogQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWUgOjo9ICdAJyBQdXNoTW9kaWZpZXJzRm9ySGVhZGVyIGludGVyZmFjZSBJZGVudGlmaWVyCiAvLiRwdXRDYXNlIGNvbnN1bWVBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uSGVhZGVyTmFtZSgpIDsgJGJyZWFrIC4vCiAvOiRyZWFkYWJsZU5hbWUgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbkhlYWRlck5hbWU6LwpAQCAtMjA5OSw2ICsyMTkwLDcgQEAKIEFubm90YXRpb25NZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSAnSWRlbnRpZmllcicgJygnCiAvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKHRydWUpOyAkYnJlYWsgLi8KIC86JHJlYWRhYmxlTmFtZSBNZXRob2RIZWFkZXJOYW1lOi8KKy86JGNvbXBsaWFuY2UgMS41Oi8KIAogQW5ub3RhdGlvbk1ldGhvZEhlYWRlckRlZmF1bHRWYWx1ZW9wdCA6Oj0gJGVtcHR5CiAvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eU1ldGhvZEhlYWRlckRlZmF1bHRWYWx1ZSgpIDsgJGJyZWFrIC4vCkBAIC0yMTg1LDYgKzIyNzcsNyBAQAogLzokY29tcGxpYW5jZSAxLjU6LwogTWVtYmVyVmFsdWUgLT4gTWVtYmVyVmFsdWVBcnJheUluaXRpYWxpemVyCiAvOiRyZWFkYWJsZU5hbWUgTWVtYmVyVmFsdWU6LworLzokcmVjb3ZlcnlfdGVtcGxhdGUgSWRlbnRpZmllcjovCiAvOiRjb21wbGlhbmNlIDEuNTovCiAKIE1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplciA6Oj0gRW50ZXJNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgJ3snIFB1c2hMZWZ0QnJhY2UgTWVtYmVyVmFsdWVzICcsJyAnfScKQEAgLTIyMTgsNyArMjMxMSwxMiBAQAogLzokcmVhZGFibGVOYW1lIE1hcmtlckFubm90YXRpb246LwogLzokY29tcGxpYW5jZSAxLjU6LwogCi1TaW5nbGVNZW1iZXJBbm5vdGF0aW9uIDo6PSBBbm5vdGF0aW9uTmFtZSAnKCcgTWVtYmVyVmFsdWUgJyknCitTaW5nbGVNZW1iZXJBbm5vdGF0aW9uTWVtYmVyVmFsdWUgOjo9IE1lbWJlclZhbHVlCisvLiRwdXRDYXNlIGNvbnN1bWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uTWVtYmVyVmFsdWUoKSA7ICRicmVhayAuLworLzokcmVhZGFibGVOYW1lIE1lbWJlclZhbHVlOi8KKy86JGNvbXBsaWFuY2UgMS41Oi8KKworU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiA6Oj0gQW5ub3RhdGlvbk5hbWUgJygnIFNpbmdsZU1lbWJlckFubm90YXRpb25NZW1iZXJWYWx1ZSAnKScKIC8uJHB1dENhc2UgY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSA7ICRicmVhayAuLwogLzokcmVhZGFibGVOYW1lIFNpbmdsZU1lbWJlckFubm90YXRpb246LwogLzokY29tcGxpYW5jZSAxLjU6LwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQmluZGluZ0tleS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQmluZGluZ0tleS5qYXZhCmluZGV4IGMzMjM0YjUuLjcwMzkyMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0JpbmRpbmdLZXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9CaW5kaW5nS2V5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuS2V5S2luZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLktleVRvU2lnbmF0dXJlOwogCkBAIC0xOCwyMyArMTksMjMgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgotICogCisgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmcjZ2V0S2V5KCkKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJpbmRpbmdLZXkgewotCQorCiAJcHJpdmF0ZSBTdHJpbmcga2V5OwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBiaW5kaW5nIGtleS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBkZWNvZGUKIAkgKi8KIAlwdWJsaWMgQmluZGluZ0tleShTdHJpbmcga2V5KSB7CiAJCXRoaXMua2V5ID0ga2V5OwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgdHlwZSBiaW5kaW5nIGtleSBmcm9tIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcga2V5IGFuZCB0aGUgZ2l2ZW4gYXJyYXkgZGltZW5zaW9uLgogCSAqIDxwPgpAQCAtNTIsMTQgKzUzLDE0IEBACiAJICogQHJldHVybiBhIG5ldyBhcnJheSB0eXBlIGJpbmRpbmcga2V5CiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQXJyYXlUeXBlQmluZGluZ0tleShTdHJpbmcgdHlwZUtleSwgaW50IGFycmF5RGltZW5zaW9uKSB7Ci0JCS8vIE5vdGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiBBcnJheVR5cGVCaW5kaW5nI2NvbXB1dGVVbmlxdWVLZXkoKSAKKwkJLy8gTm90ZSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGhlYXZpbHkgZGVwZW5kZW50IG9uIEFycmF5VHlwZUJpbmRpbmcjY29tcHV0ZVVuaXF1ZUtleSgpCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCXdoaWxlIChhcnJheURpbWVuc2lvbi0tID4gMCkKIAkJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKIAkJYnVmZmVyLmFwcGVuZCh0eXBlS2V5KTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyaXplZCB0eXBlIGJpbmRpbmcga2V5IGZyb20gdGhlIGdpdmVuIGdlbmVyaWMgdHlwZSBiaW5kaW5nIGtleSBhbmQgdGhlIGdpdmVuIGFyZ3VtZW50IHR5cGUgYmluZGluZyBrZXlzLgogCSAqIElmIHRoZSBhcmd1bWVudCB0eXBlIGtleXMgYXJyYXkgaXMgZW1wdHksIHRoZW4gYSByYXcgdHlwZSBiaW5kaW5nIGtleSBpcyBjcmVhdGVkLgpAQCAtNjgsMTEgKzY5LDExIEBACiAJICogPHByZT4KIAkgKiA8Y29kZT4KIAkgKiBjcmVhdGVQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmdLZXkoCi0JICogICAgICJMamF2YS91dGlsL01hcCZsdDtUSztUVjsmZ3Q7OyIsIAotCSAqICAgICBuZXcgU3RyaW5nW10geyJMamF2YS9sYW5nL1N0cmluZzsiLCAiTGphdmEvbGFuZy9PYmplY3Q7In0pIC0mZ3Q7IAorCSAqICAgICAiTGphdmEvdXRpbC9NYXAmbHQ7VEs7VFY7Jmd0OzsiLAorCSAqICAgICBuZXcgU3RyaW5nW10geyJMamF2YS9sYW5nL1N0cmluZzsiLCAiTGphdmEvbGFuZy9PYmplY3Q7In0pIC0mZ3Q7CiAJICogICAgICAgIkxqYXZhL3V0aWwvTWFwJmx0O0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OyZndDs7IgogCSAqIGNyZWF0ZVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZ0tleSgKLQkgKiAgICAgIkxqYXZhL3V0aWwvTGlzdCZsdDtURTsmZ3Q7OyIsIG5ldyBTdHJpbmdbXSB7fSkgLSZndDsgCisJICogICAgICJMamF2YS91dGlsL0xpc3QmbHQ7VEU7Jmd0OzsiLCBuZXcgU3RyaW5nW10ge30pIC0mZ3Q7CiAJICogICAgICAgIkxqYXZhL3V0aWwvTGlzdCZsdDsmZ3Q7OyIKIAkgKiA8L2NvZGU+CiAJICogPC9wcmU+CkBAIC05NCwxMSArOTUsMTEgQEAKIAkJYnVmZmVyLmluc2VydChidWZmZXIubGVuZ3RoKCktMSwgJz4nKTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQkKKwogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdHlwZSBiaW5kaW5nIGtleSBmcm9tIHRoZSBnaXZlbiB0eXBlIG5hbWUuIFRoZSB0eXBlIG5hbWUgbXVzdCBiZSBlaXRoZXIgCi0JICogYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYW4gYXJyYXkgdHlwZSBuYW1lIG9yIGEgcHJpbWl0aXZlIHR5cGUgbmFtZS4gCi0JICogSWYgdGhlIHR5cGUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQsIHRoZW4gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLiAKKwkgKiBDcmVhdGVzIGEgbmV3IHR5cGUgYmluZGluZyBrZXkgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBuYW1lLiBUaGUgdHlwZSBuYW1lIG11c3QgYmUgZWl0aGVyCisJICogYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYW4gYXJyYXkgdHlwZSBuYW1lIG9yIGEgcHJpbWl0aXZlIHR5cGUgbmFtZS4KKwkgKiBJZiB0aGUgdHlwZSBuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCwgdGhlbiBpdCBpcyBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCiAJICogTm90ZSB0aGF0IGlubmVyIHR5cGVzLCBnZW5lcmljIHR5cGVzIGFuZCBwYXJhbWV0ZXJpemVkIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkLgogCSAqIDxwPgogCSAqIEZvciBleGFtcGxlOgpAQCAtMTE4LDcgKzExOSw3IEBACiAJCS8vIE5vdGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiBUeXBlQmluZGluZyNjb21wdXRlVW5pcXVlS2V5KCkgYW5kIGl0cyBzdWJjbGFzc2VzCiAJCXJldHVybiBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSwgdHJ1ZS8qcmVzb2x2ZWQqLyk7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyB0eXBlIHZhcmlhYmxlIGJpbmRpbmcga2V5IGZyb20gdGhlIGdpdmVuIHR5cGUgdmFyaWFibGUgbmFtZSBhbmQgdGhlIGdpdmVuIGRlY2xhcmluZyBrZXkuCiAJICogVGhlIGRlY2xhcmluZyBrZXkgY2FuIGVpdGhlciBiZSBhIHR5cGUgYmluZGluZyBrZXkgb3IgYSBtZXRob2QgYmluZGluZyBrZXkuCkBAIC0xMjYsOSArMTI3LDkgQEAKIAkgKiBGb3IgZXhhbXBsZToKIAkgKiA8cHJlPgogCSAqIDxjb2RlPgotCSAqIGNyZWF0ZVR5cGVWYXJpYWJsZUJpbmRpbmdLZXkoIlQiLCAiTGphdmEvdXRpbC9MaXN0Jmx0O1RFOyZndDs7IikgLSZndDsgCisJICogY3JlYXRlVHlwZVZhcmlhYmxlQmluZGluZ0tleSgiVCIsICJMamF2YS91dGlsL0xpc3QmbHQ7VEU7Jmd0OzsiKSAtJmd0OwogCSAqICAgIkxqYXZhL3V0aWwvTGlzdCZsdDtURTsmZ3Q7OzpUVDsiCi0JICogY3JlYXRlVHlwZVZhcmlhYmxlQmluZGluZ0tleSgiU29tZVR5cGVWYXJpYWJsZSIsICJMcC9YOy5mb28oKVYiKSAtJmd0OyAKKwkgKiBjcmVhdGVUeXBlVmFyaWFibGVCaW5kaW5nS2V5KCJTb21lVHlwZVZhcmlhYmxlIiwgIkxwL1g7LmZvbygpViIpIC0mZ3Q7CiAJICogICAiTHAvWDsuZm9vKClWOlRTb21lVHlwZVZhcmlhYmxlOyIKIAkgKiA8L2NvZGU+CiAJICogPC9wcmU+CkBAIC0xMzksNyArMTQwLDcgQEAKIAkgKiBAcmV0dXJuIGEgbmV3IHR5cGUgdmFyaWFibGUgYmluZGluZyBrZXkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVUeXBlVmFyaWFibGVCaW5kaW5nS2V5KFN0cmluZyB0eXBlVmFyaWFibGVOYW1lLCBTdHJpbmcgZGVjbGFyaW5nS2V5KSB7Ci0JCS8vIE5vdGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiBUeXBlVmFyaWFibGVCaW5kaW5nI2NvbXB1dGVVbmlxdWVLZXkoKSAKKwkJLy8gTm90ZSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGhlYXZpbHkgZGVwZW5kZW50IG9uIFR5cGVWYXJpYWJsZUJpbmRpbmcjY29tcHV0ZVVuaXF1ZUtleSgpCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nS2V5KTsKIAkJYnVmZmVyLmFwcGVuZCgnOicpOwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgd2lsZGNhcmQgdHlwZSBiaW5kaW5nIGtleSBmcm9tIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcga2V5IGFuZCB0aGUgZ2l2ZW4gd2lsZGNhcmQga2luZAogCSAqIChvbmUgb2Yge0BsaW5rIFNpZ25hdHVyZSNDX1NUQVJ9LCB7QGxpbmsgU2lnbmF0dXJlI0NfU1VQRVJ9LCBvciB7QGxpbmsgU2lnbmF0dXJlI0NfRVhURU5EU30uCkBAIC0xNjksOSArMTcwLDEyIEBACiAJICogQHBhcmFtIHR5cGVLZXkgdGhlIGJpbmRpbmcga2V5IG9mIHRoZSBnaXZlbiB0eXBlCiAJICogQHBhcmFtIGtpbmQgb25lIG9mIHtAbGluayBTaWduYXR1cmUjQ19TVEFSfSwge0BsaW5rIFNpZ25hdHVyZSNDX1NVUEVSfSwgb3Ige0BsaW5rIFNpZ25hdHVyZSNDX0VYVEVORFN9CiAJICogQHJldHVybiBhIG5ldyB3aWxkY2FyZCB0eXBlIGJpbmRpbmcga2V5CisJICogQGRlcHJlY2F0ZWQgIFRoaXMgbWV0aG9kIGlzIG1pc3NpbmcgY3J1Y2lhbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3BlciB3aWxkY2FyZCBiaW5kaW5nIGtleSBjcmVhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkJpbmRpbmdLZXkjY3JlYXRlV2lsZGNhcmRUeXBlQmluZGluZ0tleShTdHJpbmcsIGNoYXIsIFN0cmluZywgaW50KQogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVdpbGNhcmRUeXBlQmluZGluZ0tleShTdHJpbmcgdHlwZUtleSwgY2hhciBraW5kKSB7Ci0JCS8vIE5vdGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiBXaWxkY2FyZEJpbmRpbmcjY29tcHV0ZVVuaXF1ZUtleSgpIAorCQkvLyBOb3RlIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3VwcG9zZWQgdG8gY2xvc2VseSBmb2xsb3cgdGhlIGJlaGF2aW9yIGluIFdpbGRjYXJkQmluZGluZyNjb21wdXRlVW5pcXVlS2V5KCkKKwkJLy8gYnV0IGl0IGRvZXNuJ3QgYW5kIGhlbmNlIHRoZSBkZXByZWNhdGlvbi4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ2MDkKIAkJc3dpdGNoIChraW5kKSB7CiAJCQljYXNlIFNpZ25hdHVyZS5DX1NUQVI6CiAJCQkJcmV0dXJuICIqIjsgLy8kTk9OLU5MUy0xJApAQCAtMTg0LDEwICsxODgsODMgQEAKIAl9CiAKIAkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHdpbGRjYXJkIHR5cGUgYmluZGluZyBrZXkgZnJvbSB0aGUgZ2l2ZW4gZ2VuZXJpYyB0eXBlIGJpbmRpbmcga2V5LCB0aGUgZ2l2ZW4gd2lsZGNhcmQKKwkgKiBraW5kIChvbmUgb2Yge0BsaW5rIFNpZ25hdHVyZSNDX1NUQVJ9LCB7QGxpbmsgU2lnbmF0dXJlI0NfU1VQRVJ9LCBvciB7QGxpbmsgU2lnbmF0dXJlI0NfRVhURU5EU30KKwkgKiB0aGUgZ2l2ZW4gYm91bmQgdHlwZSBiaW5kaW5nIGtleSBhbmQgdGhlIGdpdmVuIHJhbmsuIElmIHRoZSB3aWxkY2FyZCBraW5kIGlzIHtAbGluayBTaWduYXR1cmUjQ19TVEFSfSwKKwkgKiB0aGUgZ2l2ZW4gYm91bmQgdHlwZSBiaW5kaW5nIGtleSBpcyBpZ25vcmVkLgorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxwcmU+CisJICogPGNvZGU+CisJICogY3JlYXRlV2lsZGNhcmRUeXBlQmluZGluZ0tleSgiTGphdmEvdXRpbC9BcnJheUxpc3Q7IiwgU2lnbmF0dXJlLkNfU1RBUiwgbnVsbCwgMCkgLSZndDsgIkxqYXZhL3V0aWwvQXJyYXlMaXN0O3swfSoiCisJICogY3JlYXRlV2lsZGNhcmRUeXBlQmluZGluZ0tleSgiTGphdmEvdXRpbC9BcnJheUxpc3Q7IiwgU2lnbmF0dXJlLkNfU1VQRVIsICJMamF2YS9sYW5nL1N0cmluZzsiLCAwKSAtJmd0OyAiTGphdmEvdXRpbC9BcnJheUxpc3Q7ezB9LUxqYXZhL2xhbmcvU3RyaW5nOyIKKwkgKiBjcmVhdGVXaWxkY2FyZFR5cGVCaW5kaW5nS2V5KCJMamF2YS91dGlsL0hhc2hNYXA7IiwgU2lnbmF0dXJlLkNfRVhURU5EUywgIkxqYXZhL2xhbmcvU3RyaW5nOyIsIDEpIC0mZ3Q7CisJICogICAgIkxqYXZhL3V0aWwvSGFzaE1hcDt7MX0rTGphdmEvbGFuZy9TdHJpbmc7IgorCSAqIDwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gZ2VuZXJpY1R5cGVLZXkgdGhlIGJpbmRpbmcga2V5IG9mIHRoZSBnZW5lcmljIHR5cGUKKwkgKiBAcGFyYW0gYm91bmRLaW5kIG9uZSBvZiB7QGxpbmsgU2lnbmF0dXJlI0NfU1RBUn0sIHtAbGluayBTaWduYXR1cmUjQ19TVVBFUn0sIG9yIHtAbGluayBTaWduYXR1cmUjQ19FWFRFTkRTfQorCSAqIEBwYXJhbSBib3VuZFR5cGVLZXkgdGhlIGJpbmRpbmcga2V5IG9mIHRoZSBib3VuZGluZyB0eXBlLgorCSAqIEBwYXJhbSByYW5rIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGlzIHdpbGQgY2FyZCB0eXBlIGluIHRoZSBwYXJhbWV0ZXJpemF0aW9uIG9mIHRoZSBnZW5lcmljIHR5cGUuIAorCSAqIEByZXR1cm4gYSBuZXcgd2lsZGNhcmQgdHlwZSBiaW5kaW5nIGtleQorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVXaWxkY2FyZFR5cGVCaW5kaW5nS2V5KFN0cmluZyBnZW5lcmljVHlwZUtleSwgY2hhciBib3VuZEtpbmQsIFN0cmluZyBib3VuZFR5cGVLZXksIGludCByYW5rKSB7CisJCS8vIE5vdGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiBXaWxkY2FyZEJpbmRpbmcjY29tcHV0ZVVuaXF1ZUtleSgpCisJCVN0cmluZyB3aWxkQ2FyZEtleTsKKwkJc3dpdGNoIChib3VuZEtpbmQpIHsKKwkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUjoKKwkJCQl3aWxkQ2FyZEtleSA9IG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9TVEFSKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnbmF0dXJlLkNfU1VQRVI6CisJCQkJd2lsZENhcmRLZXkgPSBuZXcgU3RyaW5nKFR5cGVDb25zdGFudHMuV0lMRENBUkRfTUlOVVMpICsgYm91bmRUeXBlS2V5OworCQkJCWJyZWFrOworCQkJY2FzZSBTaWduYXR1cmUuQ19FWFRFTkRTOgorCQkJCXdpbGRDYXJkS2V5ID0gbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLldJTERDQVJEX1BMVVMpICsgYm91bmRUeXBlS2V5OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2VuZXJpY1R5cGVLZXkgKyAneycgKyByYW5rICsgJ30nICsgd2lsZENhcmRLZXk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYmluZGluZyBrZXkgb2YgdGhlIGRlY2xhcmluZyB0eXBlIG9mIHRoZSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgYmluZGluZyBrZXkuIElmIHRoZSBiaW5kaW5nIGtleQorCSAqIGRvZXMgbm90IHJlcHJlc2VudCBhIG1lbWJlciBvciBpZiB0aGUgbWVtYmVyIGRvZXNuJ3QgaGF2ZSBhIGRlY2xhcmluZyB0eXBlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBvbmx5IGJpbmRpbmcga2V5cyBmb3IgcmVmZXJlbmNlcyB0byBtZXRob2RzIGFuZCBmaWVsZHMKKwkgKiBhcmUgZnVsbHkgc3VwcG9ydGVkLiBUaGUgYmluZGluZyBrZXlzIGZvciBkZWNsYXJhdGlvbnMgd2lsbCBub3QgaGF2ZSB0eXBlIHBhcmFtZXRlcnMuCisJICogCisJICogQHJldHVybiB0aGUgdHlwZSBiaW5kaW5nIGtleSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBzaW5jZSAzLjcuMQorCSAqLworCXB1YmxpYyBCaW5kaW5nS2V5IGdldERlY2xhcmluZ1R5cGUoKSB7CisJCWludCBlbmQgPSB0aGlzLmtleS5sYXN0SW5kZXhPZihTaWduYXR1cmUuQ19ET1QpOworCQlpZiAoZW5kID09IC0xKSB7CisJCQllbmQgPSB0aGlzLmtleS5sYXN0SW5kZXhPZihTaWduYXR1cmUuQ19ET0xMQVIpOyAvLyBmb3IgaW5uZXIgdHlwZXMKKwkJCWlmIChlbmQgPT0gLTEpIHJldHVybiBudWxsOworCQl9CisJCUtleUtpbmQga2luZCA9IG5ldyBLZXlLaW5kKHRoaXMua2V5KTsKKwkJa2luZC5wYXJzZSgpOworCQlpZiAoKGtpbmQuZmxhZ3MgJiBLZXlLaW5kLkZfTE9DQUxfVkFSKSAhPSAwKSB7CisJCQkvLyBkZWNsYXJpbmcgdHlwZSBmb3IgbG9jYWxzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgaGVuY2UgcmV0dXJuIG51bGwuCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgdHlwZUtleSA9IHRoaXMua2V5LnN1YnN0cmluZygwLCBlbmQpOworCQlpZiAodHlwZUtleS5jaGFyQXQodHlwZUtleS5sZW5ndGgoKS0xKSAhPSBTaWduYXR1cmUuQ19TRU1JQ09MT04pICB7CisJCQl0eXBlS2V5ICs9IFNpZ25hdHVyZS5DX1NFTUlDT0xPTjsKKwkJfQorCQlyZXR1cm4gbmV3IEJpbmRpbmdLZXkodHlwZUtleSk7CisJfQorCS8qKgogCSAqIFJldHVybnMgdGhlIHRocm93biBleGNlcHRpb24gc2lnbmF0dXJlcyBvZiB0aGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcga2V5LgogCSAqIElmIHRoaXMgYmluZGluZyBrZXkgZG9lcyBub3QgIHJlcHJlc2VudCBhIG1ldGhvZCBvciBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uLAogCSAqIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0aHJvd24gZXhjZXB0aW9ucyBzaWduYXR1cmVzCiAJICogQHNpbmNlIDMuMwogCSAqLwpAQCAtMjAxLDE4ICsyNzgsMTggQEAKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nIGtleS4KIAkgKiBJZiB0aGlzIGJpbmRpbmcga2V5IGRvZXNuJ3QgcmVwcmVzZW50IGEgcGFyYW1ldGVyaXplZCB0eXBlIG9yIGEgcGFyYW1ldGVyaXplZCBtZXRob2QsCiAJICogcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMgCisJICoKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMKIAkgKi8KIAlwdWJsaWMgU3RyaW5nW10gZ2V0VHlwZUFyZ3VtZW50cygpIHsKIAkJS2V5VG9TaWduYXR1cmUga2V5VG9TaWduYXR1cmUgPSBuZXcgS2V5VG9TaWduYXR1cmUodGhpcy5rZXksIEtleVRvU2lnbmF0dXJlLlRZUEVfQVJHVU1FTlRTKTsKIAkJa2V5VG9TaWduYXR1cmUucGFyc2UoKTsKIAkJcmV0dXJuIGtleVRvU2lnbmF0dXJlLmdldFR5cGVBcmd1bWVudHMoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcmF3IHR5cGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcmF3IHR5cGUKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1Jhd1R5cGUoKSB7CkBAIC0yMjAsMTAgKzI5NywxMCBAQAogCQlraW5kLnBhcnNlKCk7CiAJCXJldHVybiAoa2luZC5mbGFncyAmIEtleUtpbmQuRl9SQVdfVFlQRSkgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBvciBpZiBpdHMgZGVjbGFyaW5nIHR5cGUgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcGFyYW1ldGVyaXplZCB0eXBlCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkVHlwZSgpIHsKQEAgLTIzMSwxMCArMzA4LDEwIEBACiAJCWtpbmQucGFyc2UoKTsKIAkJcmV0dXJuIChraW5kLmZsYWdzICYgS2V5S2luZC5GX1BBUkFNRVRFUklaRURfVFlQRSkgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcGFyYW1ldGVyaXplZCBtZXRob2QsIG9yIGlmIGl0cyBkZWNsYXJpbmcgbWV0aG9kIGlzIGEgcGFyYW1ldGVyaXplZCBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGtleSByZXByZXNlbnRzIGEgcGFyYW1ldGVyaXplZCBtZXRob2QKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWRNZXRob2QoKSB7CkBAIC0yNDIsMTIgKzMxOSwxMiBAQAogCQlraW5kLnBhcnNlKCk7CiAJCXJldHVybiAoa2luZC5mbGFncyAmIEtleUtpbmQuRl9QQVJBTUVURVJJWkVEX01FVEhPRCkgIT0gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBUcmFuc2Zvcm1zIHRoaXMgYmluZGluZyBrZXkgaW50byBhIHJlc29sdmVkIHNpZ25hdHVyZS4KIAkgKiBJZiB0aGlzIGJpbmRpbmcga2V5IHJlcHJlc2VudHMgYSBmaWVsZCwgdGhlIHJldHVybmVkIHNpZ25hdHVyZSBpcwotCSAqIHRoZSBkZWNsYXJpbmcgdHlwZSdzIHNpZ25hdHVyZS4KLQkgKiAKKwkgKiB0aGUgZmllbGQgdHlwZSdzIHNpZ25hdHVyZS4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHNpZ25hdHVyZSBmb3IgdGhpcyBiaW5kaW5nIGtleQogCSAqIEBzZWUgU2lnbmF0dXJlCiAJICogQHNpbmNlIDMuMgpAQCAtMjU3LDcgKzMzNCw3IEBACiAJCWtleVRvU2lnbmF0dXJlLnBhcnNlKCk7CiAJCXJldHVybiBrZXlUb1NpZ25hdHVyZS5zaWduYXR1cmUudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0J1ZmZlckNoYW5nZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKaW5kZXggMmIwOWFkOS4uYWM1YTJhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsNyArMjYsNyBAQAogICogYW5kIDxjb2RlPmdldExlbmd0aDwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0aGF0IHdhcyByZW1vdmVkLgogICogPC9wPgogICogPHA+Ci0gKiBGb3IgcmVwbGFjZW1lbnRzIChpbmNsdWRpbmcgPGNvZGU+SUJ1ZmZlci5zZXRDb250ZW50czwvY29kZT4pLCAKKyAqIEZvciByZXBsYWNlbWVudHMgKGluY2x1ZGluZyA8Y29kZT5JQnVmZmVyLnNldENvbnRlbnRzPC9jb2RlPiksCiAgKiA8Y29kZT5nZXRPZmZzZXQ8L2NvZGU+IGlzIHRoZSBvZmZzZXQKICAqIG9mIHRoZSBmaXJzdCByZXBsYWNlZCBjaGFyYWN0ZXIsIDxjb2RlPmdldFRleHQ8L2NvZGU+IGlzIHRoZSByZXBsYWNlbWVudAogICogdGV4dCwgYW5kIDxjb2RlPmdldExlbmd0aDwvY29kZT4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwgdGV4dApAQCAtMzYsMTIgKzM2LDkgQEAKICAqIFdoZW4gYSBidWZmZXIgaXMgY2xvc2VkLCA8Y29kZT5nZXRPZmZzZXQ8L2NvZGU+IGlzIDAsIDxjb2RlPmdldExlbmd0aDwvY29kZT4KICAqIGlzIDAsIGFuZCA8Y29kZT5nZXRUZXh0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KICAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIEphdmEgbW9kZWwuCi0gKiA8L3A+CiAgKgogICogQHNlZSBJQnVmZmVyCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewogCkBAIC01OSwxMiArNTYsMTIgQEAKIAkgKiBUaGUgdGV4dCB0aGF0IHdhcyBtb2RpZmllZC4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyB0ZXh0OwotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjU1Mzc5NDczODkxNzQ1OTk5TDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQogCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgYnVmZmVyIGNoYW5nZWQgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBnaXZlbiBidWZmZXIgaGFzIGNoYW5nZWQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gYnVmZmVyIHRoZSBnaXZlbiBidWZmZXIKICAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldAogICogQHBhcmFtIGxlbmd0aCB0aGUgZ2l2ZW4gbGVuZ3RoCkBAIC04OCw3ICs4NSw3IEBACiAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCByZW1vdmVkIG9yIHJlcGxhY2VkIGluIHRoZSBidWZmZXIsIG9yCiAgKiAwIGlmIHRleHQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVyLgogICoKLSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwgdGV4dCBmcmFnbWVudCBtb2RpZmllZCBieSB0aGUgCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIHRleHQgZnJhZ21lbnQgbW9kaWZpZWQgYnkgdGhlCiAgKiAgIGJ1ZmZlciBjaGFuZ2UgKDxjb2RlPiAwIDwvY29kZT4gaW4gY2FzZSBvZiBpbnNlcnRpb24pLgogICovCiBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YQppbmRleCBmMjc3Mjg0Li4wZDg3OTI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDcgQEAKICAqIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzIHRoaXMgY2xhc3MgdG8gaW1wbGVtZW50IGEgc3BlY2lmaWMgY2xhc3NwYXRoCiAgKiB2YXJpYWJsZSBpbml0aWFsaXplci4gVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50CiAgKiBjb25zdHJ1Y3RvciBhbmQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5pbml0aWFsaXplPC9jb2RlPi4KLSAqIAorICoKICAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CiAgKiBAc2luY2UgMi4wCiAgKi8KQEAgLTM0LDE2ICszNCwxNiBAQAogCiAgICAgLyoqCiAgICAgICogQmluZHMgYSB2YWx1ZSB0byB0aGUgd29ya3NwYWNlIGNsYXNzcGF0aCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLAotICAgICAqIG9yIGZhaWxzIHNpbGVudGx5IGlmIHRoaXMgY2Fubm90IGJlIGRvbmUuIAorICAgICAqIG9yIGZhaWxzIHNpbGVudGx5IGlmIHRoaXMgY2Fubm90IGJlIGRvbmUuCiAgICAgICogPHA+CiAgICAgICogQSB2YXJpYWJsZSBpbml0aWFsaXplciBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCB3aGVuZXZlciBhIHZhcmlhYmxlIHZhbHVlCiAgICAgICogaXMgbmVlZGVkIGFuZCBub25lIGhhcyBiZWVuIHJlY29yZGVkIHNvIGZhci4gVGhlIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICogdGhlIGluaXRpYWxpemVyIGNhbiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdXNpbmcgCisgICAgICogdGhlIGluaXRpYWxpemVyIGNhbiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdXNpbmcKICAgICAgKiA8Y29kZT5KYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZTwvY29kZT4uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdmFyaWFibGUgdGhlIG5hbWUgb2YgdGhlIHdvcmtzcGFjZSBjbGFzc3BhdGggdmFyaWFibGUKICAgICAgKiAgICB0aGF0IHJlcXVpcmVzIGEgYmluZGluZwotICAgICAqIAorICAgICAqCiAgICAgICogQHNlZSBKYXZhQ29yZSNnZXRDbGFzc3BhdGhWYXJpYWJsZShTdHJpbmcpCiAgICAgICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZShTdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCiAgICAgICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZXMoU3RyaW5nW10sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aFtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uQ29udGV4dC5qYXZhCmluZGV4IGUwN2UzY2IuLmZiZGFjNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25Db250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvbkNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwyOCArMTAsNTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LkludGVybmFsQ29tcGxldGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvbk9uSmF2YWRvYzsKLQogLyoqCiAgKiBDb21wbGV0aW9uIGNvbnRleHQuCi0gKiAKKyAqCiAgKiBSZXByZXNlbnQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbXBsZXRpb24gb2NjdXJzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCisgKgogICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdENvbnRleHQoQ29tcGxldGlvbkNvbnRleHQpCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbXBsZXRpb25Db250ZXh0IGV4dGVuZHMgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dCB7CitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbkNvbnRleHQgeworCisJLyoqCisJICogVGhlIGNvbXBsZXRlZCB0b2tlbiBpcyB0aGUgZmlyc3QgdG9rZW4gb2YgYSBtZW1iZXIgZGVjbGFyYXRpb24uPGJyPgorCSAqIGUuZy4KKwkgKiA8cHJlPgorCSAqIHB1YmxpYyBjbGFzcyBYIHsKKwkgKiAgIEZvb3wgLy8gY29tcGxldGlvbiBvY2N1cnMgYXQgfAorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBzZWUgI2dldFRva2VuTG9jYXRpb24oKQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRMX01FTUJFUl9TVEFSVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgY29tcGxldGVkIHRva2VuIGlzIHRoZSBmaXJzdCB0b2tlbiBvZiBhIHN0YXRlbWVudC48YnI+CisJICogZS5nLgorCSAqIDxwcmU+CisJICogcHVibGljIGNsYXNzIFggeworCSAqICAgcHVibGljIHZvaWQgYmFyKCkgeworCSAqICAgICBGb298IC8vIGNvbXBsZXRpb24gb2NjdXJzIGF0IHwKKwkgKiAgIH0KKwkgKiB9CisJICogPC9wcmU+CisJICoKKwkgKiBAc2VlICNnZXRUb2tlbkxvY2F0aW9uKCkKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTF9TVEFURU1FTlRfU1RBUlQgPSAyOwogCiAJLyoqCiAJICogVGhlIGNvbXBsZXRpb24gdG9rZW4gaXMgdW5rbm93bi4KIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fS0lORF9VTktOT1dOID0gMDsKLQkKKwogCS8qKgogCSAqIFRoZSBjb21wbGV0aW9uIHRva2VuIGlzIGEgbmFtZS4KIAkgKiBAc2luY2UgMy4yCkBAIC00MCwyOSArNjcsMjkgQEAKIAkvKioKIAkgKiBUaGUgY29tcGxldGlvbiB0b2tlbiBpcyBhIHN0cmluZyBsaXRlcmFsLgogCSAqIFRoZSBzdHJpbmcgbGl0ZXJhbCBlbmRzIHF1b3RlIGNhbiBiZSBub3QgcHJlc2VudCB0aGUgc291cmNlLgotCSAqIDxjb2RlPiJmb28iPC9jb2RlPiBvciA8Y29kZT4iZm9vPC9jb2RlPi4gCisJICogPGNvZGU+ImZvbyI8L2NvZGU+IG9yIDxjb2RlPiJmb288L2NvZGU+LgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0tJTkRfU1RSSU5HX0xJVEVSQUwgPSAyOwogCS8qKgogCSAqIFRlbGwgdXNlciB3aGV0aGVyIGNvbXBsZXRpb24gdGFrZXMgcGxhY2UgaW4gYSBqYXZhZG9jIGNvbW1lbnQgb3Igbm90LgotCSAqIAorCSAqCiAJICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY29tcGxldGlvbiB0YWtlcyBwbGFjZSBpbiBhIGphdmFkb2MgY29tbWVudCwgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0luSmF2YWRvYygpIHsKLQkJcmV0dXJuIHRoaXMuamF2YWRvYyAhPSAwOworCQlyZXR1cm4gZmFsc2U7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KIAogCS8qKgogCSAqIFRlbGwgdXNlciB3aGV0aGVyIGNvbXBsZXRpb24gdGFrZXMgcGxhY2UgaW4gdGV4dCBhcmVhIG9mIGEgamF2YWRvYyBjb21tZW50IG9yIG5vdC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNvbXBsZXRpb24gdGFrZXMgcGxhY2UgaW4gYSB0ZXh0IGFyZWEgb2YgYSBqYXZhZG9jIGNvbW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KIAkgKiBAc2luY2UgMy4yCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNJbkphdmFkb2NUZXh0KCkgewotCQlyZXR1cm4gKHRoaXMuamF2YWRvYyAmIENvbXBsZXRpb25PbkphdmFkb2MuVEVYVCkgIT0gMDsKKwlwdWJsaWMgIGJvb2xlYW4gaXNJbkphdmFkb2NUZXh0KCkgeworCQlyZXR1cm4gZmFsc2U7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KIAogCS8qKgpAQCAtNzYsNTYgKzEwMyw2OSBAQAogCSAqIAk8bGk+eyYjNjQ7bGlua3BsYWluIE9iamVjdH08L2xpPgogCSAqIAk8bGk+eyYjNjQ7dmFsdWV9IHdoZW4gY29tcGlsZXIgY29tcGxpYW5jZSBpcyBzZXQgYXQgbGVhdHMgdG8gMS41PC9saT4KIAkgKiA8L3VsPgotCSAqIAorCSAqCiAJICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY29tcGxldGlvbiB0YWtlcyBwbGFjZSBpbiBmb3JtYWwgcmVmZXJlbmNlIG9mIGEgamF2YWRvYyB0YWcsIGZhbHNlIG90aGVyd2lzZS4KIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNJbkphdmFkb2NGb3JtYWxSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAodGhpcy5qYXZhZG9jICYgQ29tcGxldGlvbk9uSmF2YWRvYy5GT1JNQUxfUkVGRVJFTkNFKSAhPSAwOworCQlyZXR1cm4gZmFsc2U7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbXBsZXRpb24gY29udGV4dCBpcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqIFNvbWUgbWV0aG9kcyBvZiB0aGlzIGNvbnRleHQgY2FuIGJlIHVzZWQgb25seSBpZiB0aGlzIGNvbnRleHQgaXMgYW4gZXh0ZW5kZWQgY29udGV4dCBidXQgYW4gZXh0ZW5kZWQgY29udGV4dCBjb25zdW1lcyBtb3JlIG1lbW9yeS4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb21wbGV0aW9uIGNvbnRleHQgaXMgYW4gZXh0ZW5kZWQgY29udGV4dC4KKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZGVkKCkgeworCQlyZXR1cm4gZmFsc2U7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KIAogCS8qKgogCSAqIFJldHVybiBzaWduYXR1cmVzIG9mIGV4cGVjdGVkIHR5cGVzIG9mIGEgcG90ZW50aWFsIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgdGhlIGNvbXBsZXRpb24gcG9zaXRpb24uCi0JICogCi0JICogSXQncyBub3QgbWFuZGF0b3J5IHRvIGEgY29tcGxldGlvbiBwcm9wb3NhbCB0byByZXNwZWN0IHRoaXMgZXhwZWN0YXRpb24uIAotCSAqIAorCSAqCisJICogSXQncyBub3QgbWFuZGF0b3J5IHRvIGEgY29tcGxldGlvbiBwcm9wb3NhbCB0byByZXNwZWN0IHRoaXMgZXhwZWN0YXRpb24uCisJICoKIAkgKiBAcmV0dXJuIHNpZ25hdHVyZXMgZXhwZWN0ZWQgdHlwZXMgb2YgYSBwb3RlbnRpYWwgY29tcGxldGlvbiBwcm9wb3NhbCBhdCB0aGUgY29tcGxldGlvbiBwb3NpdGlvbiBvcgogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4cGVjdGVkIHR5cGVzLgotCSAqIAorCSAqCiAJICogQHNlZSBTaWduYXR1cmUKIAkgKi8KIAlwdWJsaWMgY2hhcltdW10gZ2V0RXhwZWN0ZWRUeXBlc1NpZ25hdHVyZXMoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGVjdGVkVHlwZXNTaWduYXR1cmVzOwotCX0KLQkvKioKLQkgKiBSZXR1cm4ga2V5cyBvZiBleHBlY3RlZCB0eXBlcyBvZiBhIHBvdGVudGlhbCBjb21wbGV0aW9uIHByb3Bvc2FsIGF0IHRoZSBjb21wbGV0aW9uIHBvc2l0aW9uLgotCSAqIAotCSAqIEl0J3Mgbm90IG1hbmRhdG9yeSB0byBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdG8gcmVzcGVjdCB0aGlzIGV4cGVjdGF0aW9uLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGtleXMgb2YgZXhwZWN0ZWQgdHlwZXMgb2YgYSBwb3RlbnRpYWwgY29tcGxldGlvbiBwcm9wb3NhbCBhdCB0aGUgY29tcGxldGlvbiBwb3NpdGlvbiBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4cGVjdGVkIHR5cGVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBjaGFyW11bXSBnZXRFeHBlY3RlZFR5cGVzS2V5cygpIHsKLQkJcmV0dXJuIHRoaXMuZXhwZWN0ZWRUeXBlc0tleXM7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9CiAJCiAJLyoqCisJICogUmV0dXJuIGtleXMgb2YgZXhwZWN0ZWQgdHlwZXMgb2YgYSBwb3RlbnRpYWwgY29tcGxldGlvbiBwcm9wb3NhbCBhdCB0aGUgY29tcGxldGlvbiBwb3NpdGlvbi4KKwkgKgorCSAqIEl0J3Mgbm90IG1hbmRhdG9yeSB0byBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdG8gcmVzcGVjdCB0aGlzIGV4cGVjdGF0aW9uLgorCSAqCisJICogQHJldHVybiBrZXlzIG9mIGV4cGVjdGVkIHR5cGVzIG9mIGEgcG90ZW50aWFsIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgdGhlIGNvbXBsZXRpb24gcG9zaXRpb24gb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleHBlY3RlZCB0eXBlcy4KKwkgKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBjaGFyW11bXSBnZXRFeHBlY3RlZFR5cGVzS2V5cygpIHsKKwkJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbXBsZXRlZCB0b2tlbi4KIAkgKiBUaGlzIHRva2VuIGlzIGVpdGhlciB0aGUgaWRlbnRpZmllciBvciBKYXZhIGxhbmd1YWdlIGtleXdvcmQKLQkgKiBvciB0aGUgc3RyaW5nIGxpdGVyYWwgdW5kZXIsIGltbWVkaWF0ZWx5IHByZWNlZGluZywgCisJICogb3IgdGhlIHN0cmluZyBsaXRlcmFsIHVuZGVyLCBpbW1lZGlhdGVseSBwcmVjZWRpbmcsCiAJICogdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0LiBJZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQKIAkgKiBpcyBub3Qgd2l0aGluIG9yIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGlkZW50aWZpZXIgb3Iga2V5d29yZCBvcgogCSAqIGEgc3RyaW5nIGxpdGVyYWwgdGhlbiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGNvbXBsZXRlZCB0b2tlbiBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgY2hhcltdIGdldFRva2VuKCkgewotCQlyZXR1cm4gdGhpcy50b2tlbjsKKwkJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgY29tcGxldGlvbiB0b2tlbiBiZWluZyBwcm9wb3NlZC4KIAkgKiA8cD4KQEAgLTEzNSwxMTIgKzE3NSwxNDYgQEAKIAkgKiBvbmVzIHRoZXkga25vdyBhYm91dCwgYW5kIGNvZGUgZGVmZW5zaXZlbHkgZm9yIHRoZQogCSAqIHBvc3NpYmlsaXR5IG9mIHVuZXhwZWN0ZWQgZnV0dXJlIGdyb3d0aC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBraW5kOyBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkIG9uCiAJICogdGhpcyBjbGFzcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIDxjb2RlPlRPS0VOX0tJTkQ8L2NvZGU+LAogCSAqIG9yIHBvc3NpYmx5IGEga2luZCB1bmtub3duIHRvIHRoZSBjYWxsZXIKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGludCBnZXRUb2tlbktpbmQoKSB7Ci0JCXJldHVybiB0aGlzLnRva2VuS2luZDsKKwkJcmV0dXJuIC0xOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiBjb21wbGV0aW9uIHRva2VuIGJlaW5nIHByb3Bvc2VkLgorCSAqIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBpcyBhIGJpdCBtYXNrIHdoaWNoIGNhbiBjb250YWluIHNvbWUgdmFsdWVzCisJICogb2YgdGhlIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB0aGlzIGNsYXNzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggPGNvZGU+VEw8L2NvZGU+LAorCSAqIG9yIHBvc3NpYmx5IHZhbHVlcyB1bmtub3duIHRvIHRoZSBjYWxsZXIuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgc2V0IG9mIGRpZmZlcmVudCBsb2NhdGlvbiB2YWx1ZXMgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIG92ZXIgdGltZS4KKwkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgZG8gPGI+bm90PC9iPiBhc3N1bWUgdGhhdAorCSAqIHRoZSBsb2NhdGlvbiBjb250YWlucyBvbmx5IGtub3duIHZhbHVlLCBhbmQgY29kZSBkZWZlbnNpdmVseSBmb3IKKwkgKiB0aGUgcG9zc2liaWxpdHkgb2YgdW5leHBlY3RlZCBmdXR1cmUgZ3Jvd3RoLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGludCBnZXRUb2tlbkxvY2F0aW9uKCkgeworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlCiAJICogc3VicmFuZ2UgaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQogCSAqIHJlbGV2YW50IHRva2VuIGJlaW5nIGNvbXBsZXRlZC4gVGhpcwogCSAqIHRva2VuIGlzIGVpdGhlciB0aGUgaWRlbnRpZmllciBvciBKYXZhIGxhbmd1YWdlIGtleXdvcmQKLQkgKiB1bmRlciwgb3IgaW1tZWRpYXRlbHkgcHJlY2VkaW5nLCB0aGUgb3JpZ2luYWwgcmVxdWVzdCAKKwkgKiB1bmRlciwgb3IgaW1tZWRpYXRlbHkgcHJlY2VkaW5nLCB0aGUgb3JpZ2luYWwgcmVxdWVzdAogCSAqIG9mZnNldC4gSWYgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0IGlzIG5vdCB3aXRoaW4KIAkgKiBvciBpbW1lZGlhdGVseSBhZnRlciBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQsIHRoZW4gdGhlCiAJICogcG9zaXRpb24gcmV0dXJuZWQgaXMgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQgYW5kIHRoZQogCSAqIHRva2VuIHJhbmdlIGlzIGVtcHR5LgotCSAqIAorCSAqCiAJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGludCBnZXRUb2tlblN0YXJ0KCkgewotCQlyZXR1cm4gdGhpcy50b2tlblN0YXJ0OworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBzdWJyYW5nZQogCSAqIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUKIAkgKiByZWxldmFudCB0b2tlbi4gV2hlbiB0aGVyZSBpcyBubyByZWxldmFudCB0b2tlbiwgdGhlCiAJICogcmFuZ2UgaXMgZW1wdHkKIAkgKiAoPGNvZGU+Z2V0VG9rZW5FbmQoKSA9PSBnZXRUb2tlblN0YXJ0KCkgLSAxPC9jb2RlPikuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGNoYXJhY3RlciBpbmRleCBvZiB0b2tlbiBlbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJLy8gVE9ETyAoZGF2aWQpIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI1NTgKIAlwdWJsaWMgaW50IGdldFRva2VuRW5kKCkgewotCQlyZXR1cm4gdGhpcy50b2tlbkVuZDsKKwkJcmV0dXJuIC0xOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlcgogCSAqIGFmdGVyIHdoaWNoIGNvZGUgYXNzaXN0IGlzIHJlcXVlc3RlZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gb2Zmc2V0IHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKKwkJcmV0dXJuIC0xOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWJ1ZmZlci5hcHBlbmQoImNvbXBsZXRpb24gb2Zmc2V0PSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy5vZmZzZXQpOwotCQlidWZmZXIuYXBwZW5kKCdcbicpOwotCQkKLQkJYnVmZmVyLmFwcGVuZCgiY29tcGxldGlvbiByYW5nZT1bIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnRva2VuU3RhcnQpOwotCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy50b2tlbkVuZCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIl1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlidWZmZXIuYXBwZW5kKCJjb21wbGV0aW9uIHRva2VuPSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmcgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodG9rZW4gPT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgnXCInKTsKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy50b2tlbik7Ci0JCQlidWZmZXIuYXBwZW5kKCdcIicpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQotCQlidWZmZXIuYXBwZW5kKCJleHBlY3RlZFR5cGVzU2lnbmF0dXJlcz0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmV4cGVjdGVkVHlwZXNTaWduYXR1cmVzID09IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ3snKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5leHBlY3RlZFR5cGVzU2lnbmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGkgPiAwKSBidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmV4cGVjdGVkVHlwZXNTaWduYXR1cmVzW2ldKTsKLQkJCQkKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCdcbicpOwotCQkKLQkJYnVmZmVyLmFwcGVuZCgiZXhwZWN0ZWRUeXBlc0tleXM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYoZXhwZWN0ZWRUeXBlc1NpZ25hdHVyZXMgPT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4cGVjdGVkVHlwZXNLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoaSA+IDApIGJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZXhwZWN0ZWRUeXBlc0tleXNbaV0pOwotCQkJCQotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBKYXZhIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGNvbXBsZXRpb24gbG9jYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGNhbm5vdCBiZSBjb21wdXRlZC4KKwkgKiBUaGUgcmV0dXJuZWQgSmF2YSBlbGVtZW50IGFuZCBhbGwgSmF2YSBlbGVtZW50cyBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IHdoaWNoIGNhbiBiZSBuYXZpZ2F0ZWQgdG8gZnJvbSB0aGUgcmV0dXJuZWQgSmF2YSBlbGVtZW50IGFyZSBzcGVjaWFsIEphdmEgZWxlbWVudHM6CisJICogPHVsPgorCSAqIDxsaT50aGV5IGFyZSBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0J3MgYnVmZmVyLCB0aGV5IGFyZSBub3QgdGhlIHJlc3VsdCBvZiBhIHJlY29uY2lsZSBvcGVyYXRpb248L2xpPgorCSAqIDxsaT50aGV5IGFyZSBub3QgdXBkYXRlZCBpZiB0aGUgYnVmZmVyIGNoYW5nZXMuPC9saT4KKwkgKiA8bGk+dGhleSBkbyBub3QgY29udGFpbiBsb2NhbCB0eXBlcyB3aGljaCBhcmUgbm90IHZpc2libGUgZnJvbSB0aGUgY29tcGxldGlvbiBsb2NhdGlvbi48L2xpPgorCSAqIDxsaT50aGV5IGRvIG5vdCBnaXZlIGluZm9ybWF0aW9uIGFib3V0IGNhdGVnb3JpZXMuIHtAbGluayBJTWVtYmVyI2dldENhdGVnb3JpZXMoKX0gd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXk8L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBSZWFzb25zIGZvciByZXR1cm5pbmcgPGNvZGU+bnVsbDwvY29kZT4gaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPnRoZSBjb21waWxhdGlvbiB1bml0IG5vIGxvbmdlciBleGlzdHM8L2xpPgorCSAqIDxsaT50aGUgY29tcGxldGlvbiBvY2N1cnJlZCBpbiBhIGJpbmFyeSB0eXBlLiBIb3dldmVyIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgYmUgcmVsYXhlZCBpbiB0aGUgZnV0dXJlLjwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgSmF2YSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBjYW5ub3QgYmUgY29tcHV0ZWQuCisJICoKKwkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb250ZXh0IGlzIG5vdCBhbiBleHRlbmRlZCBjb250ZXh0CisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBnZXRFbmNsb3NpbmdFbGVtZW50KCkgeworCQlyZXR1cm4gbnVsbDsgLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uIGFuZCB3aGljaCBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIHR5cGUuCisJICogQW4gZWxlbWVudCBpcyBhc3NpZ25hYmxlIGlmIGl0cyB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlCisJICogb2YgdGhlIGdpdmVuIHR5cGUsIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDUuMiBvZiA8ZW0+VGhlIEphdmEgTGFuZ3VhZ2UKKwkgKiBTcGVjaWZpY2F0aW9uLCBUaGlyZCBFZGl0aW9uPC9lbT4gKEpMUzMpLgorCSAqIEEgdmlzaWJsZSBlbGVtZW50IGlzIGVpdGhlcjoKKwkgKiA8dWw+CisJICogPGxpPmEge0BsaW5rIElMb2NhbFZhcmlhYmxlfSAtIHRoZSBlbGVtZW50IHR5cGUgaXMge0BsaW5rIElMb2NhbFZhcmlhYmxlI2dldFR5cGVTaWduYXR1cmUoKX08L2xpPgorCSAqIDxsaT5hIHtAbGluayBJRmllbGR9IC0gdGhlIGVsZW1lbnQgdHlwZSBpcyB7QGxpbmsgSUZpZWxkI2dldFR5cGVTaWduYXR1cmUoKX08L2xpPgorCSAqIDxsaT5hIHtAbGluayBJTWV0aG9kfSAtIHRoZSBlbGVtZW50IHR5cGUgaXMge0BsaW5rIElNZXRob2QjZ2V0UmV0dXJuVHlwZSgpfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIFJldHVybmVkIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIGNvbXBsZXRlZCBjb21waWxhdGlvbiB1bml0IGFyZSBzcGVjaWFsIEphdmEgZWxlbWVudHM6CisJICogPHVsPgorCSAqIDxsaT50aGV5IGFyZSBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0J3MgYnVmZmVyLCB0aGV5IGFyZSBub3QgdGhlIHJlc3VsdCBvZiBhIHJlY29uY2lsZSBvcGVyYXRpb248L2xpPgorCSAqIDxsaT50aGV5IGFyZSBub3QgdXBkYXRlZCBpZiB0aGUgYnVmZmVyIGNoYW5nZXMuPC9saT4KKwkgKiA8bGk+dGhleSBkbyBub3QgY29udGFpbiBsb2NhbCB0eXBlcyB3aGljaCBhcmUgbm90IHZpc2libGUgZnJvbSB0aGUgY29tcGxldGlvbiBsb2NhdGlvbi48L2xpPgorCSAqIDxsaT50aGV5IGRvIG5vdCBnaXZlIGluZm9ybWF0aW9uIGFib3V0IGNhdGVnb3JpZXMuIHtAbGluayBJTWVtYmVyI2dldENhdGVnb3JpZXMoKX0gd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXk8L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBOb3RlIHRoZSBhcnJheSBjYW4gYmUgZW1wdHkgaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgY29tcGlsYXRpb24gdW5pdCBubyBsb25nZXIgZXhpc3RzPC9saT4KKwkgKiA8bGk+dGhlIGNvbXBsZXRpb24gb2NjdXJyZWQgaW4gYSBiaW5hcnkgdHlwZS4gSG93ZXZlciB0aGlzIHJlc3RyaWN0aW9uIG1pZ2h0IGJlIHJlbGF4ZWQgaW4gdGhlIGZ1dHVyZS48L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSBlbGVtZW50cyB3aGljaCBjYW4gYmUgYXNzaWduZWQgdG8gdGhpcyB0eXBlIGFyZSByZXR1cm5lZC4KKwkgKiAJCUlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZXJlIGlzIG5vIGNvbnN0cmFpbnQgb24gdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGVsZW1lbnRzLgorCSAqCisJICogQHJldHVybiBlbGVtZW50cyB3aGljaCBhcmUgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uIGFuZCB3aGljaCBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIHR5cGUuCisJICoKKwkgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb250ZXh0IGlzIG5vdCBhbiBleHRlbmRlZCBjb250ZXh0CisJICoKKwkgKiBAc2VlICNpc0V4dGVuZGVkKCkKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0VmlzaWJsZUVsZW1lbnRzKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KKwl9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25GbGFncy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvbkZsYWdzLmphdmEKaW5kZXggYmRhN2MzNi4uYTE3Y2YxNyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvbkZsYWdzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvbkZsYWdzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogICogPC9wPgogICoKICAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldEFkZGl0aW9uYWxGbGFncygpCi0gKiAKKyAqCiAgKiBAc2luY2UgMy4zCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wbGV0aW9uRmxhZ3MgewpAQCAtMjYsNyArMjYsNyBAQAogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgYWJzZW5jZSBvZiBhbnkgZmxhZwogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERlZmF1bHQgPSAweDAwMDA7Ci0JCisKIAkvKioKIAkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBzdGF0aWMgaW1wb3J0CiAJICovCkBAIC0zOCw3ICszOCw3IEBACiAJcHJpdmF0ZSBDb21wbGV0aW9uRmxhZ3MoKSB7CiAJCS8vIE5vdCBpbnN0YW50aWFibGUKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIHtAbGluayAjU3RhdGljSW1wb3J0fSBmbGFnLgogCSAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmluZGV4IGNmOGQ4YmYuLmIxYThmNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCkBAIC0xLDE3ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSW50ZXJuYWxDb21wbGV0aW9uUHJvcG9zYWw7CiAKIC8qKgpAQCAtMzEsMTAgKzMwLDEwIEBACiAgKiA8cD4KICAqIFRoZSBwcm9wb3NhbCBpcyBhcyBmb2xsb3dzOiBpbnNlcnQKICAqIHRoZSB7QGxpbmtwbGFpbiAjZ2V0Q29tcGxldGlvbigpIGNvbXBsZXRpb24gc3RyaW5nfSBpbnRvIHRoZQotICogc291cmNlIGZpbGUgYnVmZmVyLCByZXBsYWNpbmcgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiAKKyAqIHNvdXJjZSBmaWxlIGJ1ZmZlciwgcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4KICAqIHtAbGlua3BsYWluICNnZXRSZXBsYWNlU3RhcnQoKSB0aGUgc3RhcnR9CiAgKiBhbmQge0BsaW5rcGxhaW4gI2dldFJlcGxhY2VFbmQoKSBlbmR9LiBUaGUgc3RyaW5nCi0gKiBjYW4gYmUgYXJiaXRyYXJ5OyBmb3IgZXhhbXBsZSwgaXQgbWlnaHQgaW5jbHVkZSBub3Qgb25seSB0aGUgCisgKiBjYW4gYmUgYXJiaXRyYXJ5OyBmb3IgZXhhbXBsZSwgaXQgbWlnaHQgaW5jbHVkZSBub3Qgb25seSB0aGUKICAqIG5hbWUgb2YgYSBtZXRob2QgYnV0IGEgc2V0IG9mIHBhcmVudGhlc2VzLiBNb3Jlb3ZlciwgdGhlIHNvdXJjZQogICogcmFuZ2UgbWF5IGluY2x1ZGUgc291cmNlIHBvc2l0aW9ucyBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNvdXJjZQogICogcG9zaXRpb24gd2hlcmUgPGNvZGU+SUNvZGVBc3Npc3QuY29kZUNvbXBsZXRlPC9jb2RlPiB3YXMgaW52b2tlZC4KQEAgLTQzLDIwICs0MiwyMCBAQAogICogY29tcGV0aW5nIHByb3Bvc2Fscy4KICAqIDwvcD4KICAqIDxwPgotICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3M7IGl0IGlzIG5vdCBpbnRlbmRlZCAKLSAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgQ29tcGxldGlvblJlcXVlc3RvcikKICAqIEBzaW5jZSAzLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsIHsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29tcGxldGlvbiA9IGZhbHNlOworcHVibGljIGNsYXNzIENvbXBsZXRpb25Qcm9wb3NhbCB7CiAKIAkvKioKIAkgKiBDb21wbGV0aW9uIGlzIGEgZGVjbGFyYXRpb24gb2YgYW4gYW5vbnltb3VzIGNsYXNzLgogCSAqIFRoaXMga2luZCBvZiBjb21wbGV0aW9uIG1pZ2h0IG9jY3VyIGluIGEgY29udGV4dCBsaWtlCi0JICogPGNvZGU+Im5ldyBMaXN0XjsiPC9jb2RlPiBhbmQgY29tcGxldGUgaXQgdG8KKwkgKiA8Y29kZT4ibmV3IExpc3QoXjsiPC9jb2RlPiBhbmQgY29tcGxldGUgaXQgdG8KIAkgKiA8Y29kZT4ibmV3IExpc3QoKSB7fSI8L2NvZGU+LgogCSAqIDxwPgogCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQpAQCAtODAsNyArNzksNyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04gPSAxOwpAQCAtMTEwLDcgKzEwOSw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFRiA9IDI7CkBAIC0xMzIsNyArMTMxLDcgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRCA9IDM7CkBAIC0xNTEsNyArMTUwLDcgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxfUkVGID0gNDsKQEAgLTE3Niw3ICsxNzUsNyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9WQVJJQUJMRV9SRUYgPSA1OwpAQCAtMjA0LDcgKzIwMyw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9SRUYgPSA2OwpAQCAtMjQ0LDcgKzI0Myw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUNMQVJBVElPTiA9IDc7CkBAIC0yNjMsNyArMjYyLDcgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9SRUYgPSA4OwpAQCAtMjkyLDcgKzI5MSw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVGID0gOTsKQEAgLTM0NiwxMiArMzQ1LDEyIEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogICAgICAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OID0gMTE7Ci0JCisKIAkvKioKIAkgKiBDb21wbGV0aW9uIGlzIGEgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIG5hbWUuCiAJICogVGhpcyBraW5kIG9mIGNvbXBsZXRpb24gbWlnaHQgb2NjdXIgaW4gYSBjb250ZXh0IGxpa2UKQEAgLTM3NSwxMiArMzc0LDEyIEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogICAgICAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfTkFNRV9SRUZFUkVOQ0UgPSAxMjsKLQkKKwogCS8qKgogCSAqIENvbXBsZXRpb24gaXMgYSByZWZlcmVuY2UgdG8gYW5ub3RhdGlvbidzIGF0dHJpYnV0ZS4KIAkgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQpAQCAtNDA2LDcgKzQwNSw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTQzNyw3ICs0MzYsNyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC00NjYsNyArNDY1LDcgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCiAJICogQHNpbmNlIDMuMgogCSAqLwpAQCAtNDk2LDcgKzQ5NSw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KQEAgLTUyNyw3ICs1MjYsNyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC01NjIsNyArNTYxLDcgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCiAJICogQHNpbmNlIDMuMgogCSAqLwpAQCAtNTkzLDcgKzU5Miw3IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgI2dldEtpbmQoKQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KQEAgLTYyNCw3ICs2MjMsNyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKIAkgKiBAc2luY2UgMy4yCiAJICovCkBAIC02NTYsMTMgKzY1NSwxMyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9JTVBPUlQgPSAyMTsKLQkKKwogCS8qKgogCSAqIENvbXBsZXRpb24gaXMgYW4gaW1wb3J0IG9mIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBtZXRob2QuCiAJICogPHA+CkBAIC02ODcsMTMgKzY4NiwxMyBAQAogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfSU1QT1JUID0gMjI7Ci0JCisKIAkvKioKIAkgKiBDb21wbGV0aW9uIGlzIGFuIGltcG9ydCBvZiByZWZlcmVuY2UgdG8gYSB0eXBlLgogCSAqIE9ubHkgcmVmZXJlbmNlIHRvIHJlZmVyZW5jZSB0eXBlcyBhcmUgYWxsb3dlZC4KQEAgLTcxOCwxNDYgKzcxNywxNzQgQEAKIAkgKiA8L2xpPgogCSAqIDwvdWw+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0S2luZCgpCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTVBPUlQgPSAyMzsKKworCS8qKgorCSAqIENvbXBsZXRpb24gaXMgYSByZWZlcmVuY2UgdG8gYSBtZXRob2Qgd2l0aCBhIGNhc3RlZCByZWNlaXZlci4KKwkgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQorCSAqIDxjb2RlPiJyZWNlaXZlci5mb14oKTsiPC9jb2RlPiBhbmQgY29tcGxldGUgaXQgdG8KKwkgKiA8Y29kZT4iIigoWClyZWNlaXZlcikuZm9vKCk7IjwvY29kZT4uCisJICogPHA+CisJICogVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisJICogZm9yIHRoaXMga2luZCBvZiBjb21wbGV0aW9uIHByb3Bvc2FsIGF0IGxpdHRsZSBleHRyYSBjb3N0OgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNnZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpfSAtCisJICogdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldEZsYWdzKCl9IC0KKwkgKiB0aGUgbW9kaWZpZXJzIGZsYWdzIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXROYW1lKCl9IC0KKwkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldFJlY2VpdmVyU2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJlY2VpdmVyIHR5cGUuIEl0J3MgdGhlIHR5cGUgb2YgdGhlIGNhc3QgZXhwcmVzc2lvbi4KKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldFNpZ25hdHVyZSgpfSAtCisJICogdGhlIG1ldGhvZCBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiA9IDI0OworCisJLyoqCisJICogQ29tcGxldGlvbiBpcyBhIHJlZmVyZW5jZSB0byBhIGZpZWxkIHdpdGggYSBjYXN0ZWQgcmVjZWl2ZXIuCisJICogVGhpcyBraW5kIG9mIGNvbXBsZXRpb24gbWlnaHQgb2NjdXIgaW4gYSBjb250ZXh0IGxpa2UKKwkgKiA8Y29kZT4icmVjZXZpZXIucmVmXiA9IDA7IjwvY29kZT4gYW5kIGNvbXBsZXRlIGl0IHRvCisJICogPGNvZGU+IigoWClyZWNlaXZlcikucmVmY291bnQgPSAwOyI8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorCSAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKX0gLQorCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldEZsYWdzKCl9IC0KKwkgKiB0aGUgbW9kaWZpZXJzIGZsYWdzIChpbmNsdWRpbmcgQUNDX0VOVU0pIG9mIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldE5hbWUoKX0gLQorCSAqIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXRSZWNlaXZlclNpZ25hdHVyZSgpfSAtCisJICogdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZWNlaXZlciB0eXBlLiBJdCdzIHRoZSB0eXBlIG9mIHRoZSBjYXN0IGV4cHJlc3Npb24uCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXRTaWduYXR1cmUoKX0gLQorCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgZmllbGQncyB0eXBlIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSBpbiB3aGljaCB0aGUgcmVmZXJlbmNlZCBmaWVsZAorCSAqIGlzIGRlY2xhcmVkKQorCSAqIDwvbGk+CisJICoKKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKgorCSAqIEBzZWUgI2dldEtpbmQoKQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiA9IDI1OwogCQogCS8qKgotCSAqIEZpcnN0IHZhbGlkIGNvbXBsZXRpb24ga2luZC4KKwkgKiBDb21wbGV0aW9uIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3RydWN0b3IuCisJICogVGhpcyBraW5kIG9mIGNvbXBsZXRpb24gbWlnaHQgb2NjdXIgaW4gYSBjb250ZXh0IGxpa2UKKwkgKiA8Y29kZT4ibmV3IExpcyI8L2NvZGU+IGFuZCBjb21wbGV0ZSBpdCB0bworCSAqIDxjb2RlPiJuZXcgTGlzdCgpOyI8L2NvZGU+IGlmIExpc3QgaXMgYSBjbGFzcyB0aGF0IGlzIG5vdCBhYnN0cmFjdC4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6CisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXRGbGFncygpfSAtCisJICogdGhlIG1vZGlmaWVycyBmbGFncyBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXROYW1lKCl9IC0KKwkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgcmVmZXJlbmNlZAorCSAqIDwvbGk+CisJICogPGxpPntAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogPC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGlzIGtpbmQgb2YgcHJvcG9zYWwgY291bGQgcmVxdWlyZSBhIGxvbmcgY29tcHV0YXRpb24sIHNvIHRoZXkgYXJlIGNvbXB1dGVkIG9ubHkgaWYgY29tcGxldGlvbiBvcGVyYXRpb24gaXMgY2FsbGVkIHdpdGggYSB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0KKwkgKiAoZS5nLiB7QGxpbmsgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgQ29tcGxldGlvblJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9KS48YnI+CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGlzIGFsd2F5cyBpcyBvbmx5IHByb3Bvc2FscyB3aXRoIGEge0BsaW5rICNUWVBFX1JFRn0gcmVxdWlyZWQgcHJvcG9zYWwsIHNvIHRoaXMga2luZCBvZiByZXF1aXJlZCBwcm9wb3NhbCBtdXN0IGJlIGFsbG93ZWQ6CisJICogPGNvZGU+cmVxdWVzdG9yLnNldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKENPTlNUUlVDVE9SX0lOVk9DQVRJT04sIFRZUEVfUkVGLCB0cnVlKTwvY29kZT4uCisJICogPC9wPgorCSAqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQogCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID0gMjY7CisJCisJLyoqCisJICogQ29tcGxldGlvbiBpcyBhIHJlZmVyZW5jZSBvZiBhIGNvbnN0cnVjdG9yIG9mIGFuIGFub255bW91cyBjbGFzcy4KKwkgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQorCSAqIDxjb2RlPiJuZXcgTGlzXjsiPC9jb2RlPiBhbmQgY29tcGxldGUgaXQgdG8KKwkgKiA8Y29kZT4ibmV3IExpc3QoKSB7fSI8L2NvZGU+IGlmIExpc3QgaXMgYW4gaW50ZXJmYWNlIG9yIGFic3RyYWN0IGNsYXNzLgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorCSAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKX0gLQorCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSBiZWluZyBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXREZWNsYXJhdGlvbktleSgpfSAtCisJICogdGhlIHR5cGUgdW5pcXVlIGtleSBvZiB0aGUgdHlwZSBiZWluZyBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkCisJICogPC9saT4KKwkgKiA8bGk+e0BsaW5rICNnZXRTaWduYXR1cmUoKX0gLQorCSAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiA8L2xpPgorCSAqIDxsaT57QGxpbmsgI2dldEtleSgpfSAtCisJICogdGhlIG1ldGhvZCB1bmlxdWUga2V5IG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiBpZiB0aGUgZGVjbGFyaW5nIHR5cGUgaXMgbm90IGFuIGludGVyZmFjZQorCSAqIDwvbGk+CisJICogPGxpPntAbGluayAjZ2V0RmxhZ3MoKX0gLQorCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3Mgb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgcmVmZXJlbmNlZAorCSAqIDwvbGk+CisJICogPC91bD4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGNvdWxkIHJlcXVpcmUgYSBsb25nIGNvbXB1dGF0aW9uLCBzbyB0aGV5IGFyZSBjb21wdXRlZCBvbmx5IGlmIGNvbXBsZXRpb24gb3BlcmF0aW9uIGlzIGNhbGxlZCB3aXRoIGEge0BsaW5rIElQcm9ncmVzc01vbml0b3J9CisJICogKGUuZy4ge0BsaW5rIElDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIENvbXBsZXRpb25SZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfSk8YnI+CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGlzIGFsd2F5cyBpcyBvbmx5IHByb3Bvc2FscyB3aXRoIGEge0BsaW5rICNUWVBFX1JFRn0gcmVxdWlyZWQgcHJvcG9zYWwsIHNvIHRoaXMga2luZCBvZiByZXF1aXJlZCBwcm9wb3NhbCBtdXN0IGJlIGFsbG93ZWQ6CisJICogPGNvZGU+cmVxdWVzdG9yLnNldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKENPTlNUUlVDVE9SX0lOVk9DQVRJT04sIFRZUEVfUkVGLCB0cnVlKTwvY29kZT4uCisJICogPC9wPgorCSAqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA9IDI3OworCisJLyoqCisJICogRmlyc3QgdmFsaWQgY29tcGxldGlvbiBraW5kLgorCSAqCiAJICogQHNpbmNlIDMuMQogCSAqLwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0tJTkQgPSBBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT047Ci0JCisKIAkvKioKIAkgKiBMYXN0IHZhbGlkIGNvbXBsZXRpb24ga2luZC4KLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMQVNUX0tJTkQgPSBUWVBFX0lNUE9SVDsKLQkKLQkvKioKLQkgKiBLaW5kIG9mIGNvbXBsZXRpb24gcmVxdWVzdC4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wbGV0aW9uS2luZDsKLQkKLQkvKioKLQkgKiBPZmZzZXQgaW4gb3JpZ2luYWwgYnVmZmVyIHdoZXJlIElDb2RlQXNzaXN0LmNvZGVDb21wbGV0ZSgpIHdhcwotCSAqIHJlcXVlc3RlZC4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wbGV0aW9uTG9jYXRpb247Ci0JCi0JLyoqCi0JICogU3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2Ygc291cmNlIHJhbmdlIGluIG9yaWdpbmFsIGJ1ZmZlciAKLQkgKiBjb250YWluaW5nIHRoZSByZWxldmFudCB0b2tlbgotCSAqIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgotCSAqLwotCXByaXZhdGUgaW50IHRva2VuU3RhcnQgPSAwOwotCQotCS8qKgotCSAqIEVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKSBvZiBzb3VyY2UgcmFuZ2UgaW4gb3JpZ2luYWwgYnVmZmVyIAotCSAqIGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHRva2VuOwotCSAqIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgotCSAqLwotCXByaXZhdGUgaW50IHRva2VuRW5kID0gMDsKLQkKLQkvKioKLQkgKiBDb21wbGV0aW9uIHN0cmluZzsgZGVmYXVsdHMgdG8gZW1wdHkgc3RyaW5nLgotCSAqLwotCXByaXZhdGUgY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCi0JLyoqCi0JICogU3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2Ygc291cmNlIHJhbmdlIGluIG9yaWdpbmFsIGJ1ZmZlciAKLQkgKiB0byBiZSByZXBsYWNlZCBieSBjb21wbGV0aW9uIHN0cmluZzsgCi0JICogZGVmYXVsdHMgdG8gZW1wdHkgc3VicmFuZ2UgYXQgWzAsMCkuCi0JICovCi0JcHJpdmF0ZSBpbnQgcmVwbGFjZVN0YXJ0ID0gMDsKLQkKLQkvKioKLQkgKiBFbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkgb2Ygc291cmNlIHJhbmdlIGluIG9yaWdpbmFsIGJ1ZmZlciAKLQkgKiB0byBiZSByZXBsYWNlZCBieSBjb21wbGV0aW9uIHN0cmluZzsKLQkgKiBkZWZhdWx0cyB0byBlbXB0eSBzdWJyYW5nZSBhdCBbMCwwKS4KLQkgKi8KLQlwcml2YXRlIGludCByZXBsYWNlRW5kID0gMDsKLQkKLQkvKioKLQkgKiBSZWxldmFuY2UgcmF0aW5nOyBwb3NpdGl2ZTsgaGlnaGVyIG1lYW5zIGJldHRlcjsKLQkgKiBkZWZhdWx0cyB0byBtaW5pbXVtIHJhdGluZy4KLQkgKi8KLQlwcml2YXRlIGludCByZWxldmFuY2UgPSAxOwotCQotCS8qKgotCSAqIFNpZ25hdHVyZSBvZiB0aGUgcmVsZXZhbnQgcGFja2FnZSBvciB0eXBlIGRlY2xhcmF0aW9uCi0JICogaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogRGVmYXVsdHMgdG8gbnVsbC4KLQkgKi8KLQlwcml2YXRlIGNoYXJbXSBkZWNsYXJhdGlvblNpZ25hdHVyZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogVW5pcXVlIGtleSBvZiB0aGUgcmVsZXZhbnQgcGFja2FnZSBvciB0eXBlIGRlY2xhcmF0aW9uCi0JICogaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogRGVmYXVsdHMgdG8gbnVsbC4KLQkgKi8KLQlwcml2YXRlIGNoYXJbXSBkZWNsYXJhdGlvbktleSA9IG51bGw7Ci0JCi0JLyoqCi0JICogU2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCwgZmllbGQsCi0JICogbWVtYmVyLCBvciB2YXJpYWJsZSByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIERlZmF1bHRzIHRvIG51bGwuCi0JICovCi0JcHJpdmF0ZSBjaGFyW10gbmFtZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogU2lnbmF0dXJlIG9mIHRoZSBtZXRob2QsIGZpZWxkIHR5cGUsIG1lbWJlciB0eXBlLAotCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIERlZmF1bHRzIHRvIG51bGwuCi0JICovCi0JcHJpdmF0ZSBjaGFyW10gc2lnbmF0dXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBVbmlxdWUgb2YgdGhlIG1ldGhvZCwgZmllbGQgdHlwZSwgbWVtYmVyIHR5cGUsCi0JICogcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogRGVmYXVsdHMgdG8gbnVsbC4KLQkgKi8KLQlwcml2YXRlIGNoYXJbXSBrZXkgPSBudWxsOwotCQotCS8qKgotCSAqIEFycmF5IG9mIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIFRoZSBwcm9wb3NhbCBjYW4gbm90IGJlIGFwcGxpZWQgaWYgdGhlIHJlcXVpcmVkIHByb3Bvc2FscyBhcmVuJ3QgYXBwbGllZC4KLQkgKiBEZWZhdWx0cyB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXRpb25Qcm9wb3NhbFtdIHJlcXVpcmVkUHJvcG9zYWxzOwotCQotCS8qKgotCSAqIE1vZGlmaWVyIGZsYWdzIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvcgotCSAqIDxjb2RlPkZsYWdzLkFjY0RlZmF1bHQ8L2NvZGU+IGlmIG5vbmUuCi0JICogRGVmYXVsdHMgdG8gPGNvZGU+RmxhZ3MuQWNjRGVmYXVsdDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBpbnQgZmxhZ3MgPSBGbGFncy5BY2NEZWZhdWx0OwotCQotCS8qKgotCSAqIENvbXBsZXRpb24gZmxhZ3MgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yCi0JICogPGNvZGU+Q29tcGxldGlvbkZsYWdzLkRlZmF1bHQ8L2NvZGU+IGlmIG5vbmUuCi0JICogRGVmYXVsdHMgdG8gPGNvZGU+Q29tcGxldGlvbkZsYWdzLkRlZmF1bHQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgaW50IGFkZGl0aW9uYWxGbGFncyA9IENvbXBsZXRpb25GbGFncy5EZWZhdWx0OwotCQotCS8qKgotCSAqIFBhcmFtZXRlciBuYW1lcyAoZm9yIG1ldGhvZCBjb21wbGV0aW9ucyksIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gTGF6aWx5IGNvbXB1dGVkLgotCSAqIERlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBudWxsOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHBhcmFtZXRlciBuYW1lcyBoYXZlIGJlZW4gY29tcHV0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBhcmFtZXRlck5hbWVzQ29tcHV0ZWQgPSBmYWxzZTsKLQkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMQVNUX0tJTkQgPSBBTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTjsKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBiYXNpYyBjb21wbGV0aW9uIHByb3Bvc2FsLiBBbGwgaW5zdGFuY2UKIAkgKiBmaWVsZCBoYXZlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgpAQCAtODY2LDQ1ICs4OTMsMTUgQEAKIAkgKiBKYXZhIG1vZGVsIGltcGxlbWVudGF0aW9uLiBDbGllbnRzIGNhbm5vdCBkaXJlY3RseSBjcmVhdGUKIAkgKiBDb21wbGV0aW9uUHJvcG9zYWwgb2JqZWN0cy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHRoaXMgY2xhc3MKIAkgKiBAcGFyYW0gY29tcGxldGlvbk9mZnNldCBvcmlnaW5hbCBvZmZzZXQgb2YgY29kZSBjb21wbGV0aW9uIHJlcXVlc3QKIAkgKiBAcmV0dXJuIGEgbmV3IGNvbXBsZXRpb24gcHJvcG9zYWwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGUoaW50IGtpbmQsIGludCBjb21wbGV0aW9uT2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGtpbmQsIGNvbXBsZXRpb25PZmZzZXQpOworCQlyZXR1cm4gbmV3IEludGVybmFsQ29tcGxldGlvblByb3Bvc2FsKGtpbmQsIGNvbXBsZXRpb25PZmZzZXQpOwogCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgYmFzaWMgY29tcGxldGlvbiBwcm9wb3NhbC4gQWxsIGluc3RhbmNlCi0JICogZmllbGQgaGF2ZSBwbGF1c2libGUgZGVmYXVsdCB2YWx1ZXMgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBmb3IgdGhpcyBjbGFzcyBhcmUgaW50ZXJuYWwgdG8gdGhlCi0JICogSmF2YSBtb2RlbCBpbXBsZW1lbnRhdGlvbi4gQ2xpZW50cyBjYW5ub3QgZGlyZWN0bHkgY3JlYXRlCi0JICogQ29tcGxldGlvblByb3Bvc2FsIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUga2luZCBjb25zdGFudHMgZGVjbGFyZWQgb24gdGhpcyBjbGFzcwotCSAqIEBwYXJhbSBjb21wbGV0aW9uTG9jYXRpb24gb3JpZ2luYWwgb2Zmc2V0IG9mIGNvZGUgY29tcGxldGlvbiByZXF1ZXN0Ci0JICovCi0JQ29tcGxldGlvblByb3Bvc2FsKGludCBraW5kLCBpbnQgY29tcGxldGlvbkxvY2F0aW9uKSB7Ci0JCWlmICgoa2luZCA8IENvbXBsZXRpb25Qcm9wb3NhbC5GSVJTVF9LSU5EKQotCQkJCXx8IChraW5kID4gQ29tcGxldGlvblByb3Bvc2FsLkxBU1RfS0lORCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAodGhpcy5jb21wbGV0aW9uID09IG51bGwgfHwgY29tcGxldGlvbkxvY2F0aW9uIDwgMCkgewotCQkJLy8gV29yayBhcm91bmQgZm9yIGJ1ZyAxMzI1NTggKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI1NTgpLgotCQkJLy8gY29tcGxldGlvbkxvY2F0aW9uIGNhbiBiZSAtMSBpZiB0aGUgY29tcGxldGlvbiBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlIG9yCi0JCQkvLyB0aGUgc3RhcnQgb2YgYSBjb2RlIHNuaXBwZXQgYnV0IHRoaXMgQVBJIGlzbid0IGRlc2lnbiB0byBzdXBwb3J0IG5lZ2F0aXZlIHBvc2l0aW9uLgotCQkJaWYodGhpcy5jb21wbGV0aW9uID09IG51bGwgfHwgY29tcGxldGlvbkxvY2F0aW9uICE9IC0xKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJY29tcGxldGlvbkxvY2F0aW9uID0gMDsKLQkJfQotCQl0aGlzLmNvbXBsZXRpb25LaW5kID0ga2luZDsKLQkJdGhpcy5jb21wbGV0aW9uTG9jYXRpb24gPSBjb21wbGV0aW9uTG9jYXRpb247Ci0JfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY29tcGxldGlvbiBmbGFncyByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKIAkgKiA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuRGVmYXVsdDwvY29kZT4gaWYgbm9uZS4KQEAgLTkyNSwxNSArOTIyLDE1IEBACiAJICogRm9yIG90aGVyIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCiAJICogPGNvZGU+Q29tcGxldGlvbkZsYWdzLkRlZmF1bHQ8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbXBsZXRpb24gZmxhZ3MsIG9yCiAJICogPGNvZGU+Q29tcGxldGlvbkZsYWdzLkRlZmF1bHQ8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2VlIENvbXBsZXRpb25GbGFncwotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyBpbnQgZ2V0QWRkaXRpb25hbEZsYWdzKCkgewotCQlyZXR1cm4gdGhpcy5hZGRpdGlvbmFsRmxhZ3M7CisJCXJldHVybiAtMTsgLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQogCiAJLyoqCkBAIC05NDUsMTYgKzk0MiwxNiBAQAogCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCiAJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGFkZGl0aW9uYWxGbGFncyB0aGUgY29tcGxldGlvbiBmbGFncywgb3IKIAkgKiA8Y29kZT5Db21wbGV0aW9uRmxhZ3MuRGVmYXVsdDwvY29kZT4gaWYgbm9uZQotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGbGFncyhpbnQgYWRkaXRpb25hbEZsYWdzKSB7Ci0JCXRoaXMuYWRkaXRpb25hbEZsYWdzID0gYWRkaXRpb25hbEZsYWdzOworCQkvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGNvbXBsZXRpb24gYmVpbmcgcHJvcG9zZWQuCiAJICogPHA+CkBAIC05NjQsNTkgKzk2MSw1OSBAQAogCSAqIG9uZXMgdGhleSBrbm93IGFib3V0LCBhbmQgY29kZSBkZWZlbnNpdmVseSBmb3IgdGhlCiAJICogcG9zc2liaWxpdHkgb2YgdW5leHBlY3RlZCBmdXR1cmUgZ3Jvd3RoLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGtpbmQ7IG9uZSBvZiB0aGUga2luZCBjb25zdGFudHMKIAkgKiBkZWNsYXJlZCBvbiB0aGlzIGNsYXNzLCBvciBwb3NzaWJseSBhIGtpbmQgdW5rbm93bgogCSAqIHRvIHRoZSBjYWxsZXIKIAkgKi8KIAlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBsZXRpb25LaW5kOworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyCi0JICogd2hlcmUgc291cmNlIGNvbXBsZXRpb24gd2FzIHJlcXVlc3RlZCAodGhlIAorCSAqIHdoZXJlIHNvdXJjZSBjb21wbGV0aW9uIHdhcyByZXF1ZXN0ZWQgKHRoZQogCSAqIDxjb2RlPm9mZnNldDwvY29kZT4gcGFyYW1ldGVyIHRvCiAJICogPGNvZGU+SUNvZGVBc3Npc3QuY29kZUNvbXBsZXRlPC9jb2RlPiBtaW51cyBvbmUpLgotCSAqIAorCSAqCiAJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggaW4gc291cmNlIGZpbGUgYnVmZmVyCiAJICogQHNlZSBJQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LENvbXBsZXRpb25SZXF1ZXN0b3IpCiAJICovCiAJLy8gVE9ETyAoZGF2aWQpIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI1NTgKIAlwdWJsaWMgaW50IGdldENvbXBsZXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29tcGxldGlvbkxvY2F0aW9uOworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlCiAJICogc3VicmFuZ2UgaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQogCSAqIHJlbGV2YW50IHRva2VuIGJlaW5nIGNvbXBsZXRlZC4gVGhpcwogCSAqIHRva2VuIGlzIGVpdGhlciB0aGUgaWRlbnRpZmllciBvciBKYXZhIGxhbmd1YWdlIGtleXdvcmQKLQkgKiB1bmRlciwgb3IgaW1tZWRpYXRlbHkgcHJlY2VkaW5nLCB0aGUgb3JpZ2luYWwgcmVxdWVzdCAKKwkgKiB1bmRlciwgb3IgaW1tZWRpYXRlbHkgcHJlY2VkaW5nLCB0aGUgb3JpZ2luYWwgcmVxdWVzdAogCSAqIG9mZnNldC4gSWYgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2Zmc2V0IGlzIG5vdCB3aXRoaW4KIAkgKiBvciBpbW1lZGlhdGVseSBhZnRlciBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQsIHRoZW4gdGhlCiAJICogcG9zaXRpb24gcmV0dXJuZWQgaXMgb3JpZ2luYWwgcmVxdWVzdCBvZmZzZXQgYW5kIHRoZQogCSAqIHRva2VuIHJhbmdlIGlzIGVtcHR5LgotCSAqIAorCSAqCiAJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKIAkgKi8KIAlwdWJsaWMgaW50IGdldFRva2VuU3RhcnQoKSB7Ci0JCXJldHVybiB0aGlzLnRva2VuU3RhcnQ7CisJCXJldHVybiAtMTsgLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBlbmQgKGV4Y2x1c2l2ZSkgb2YgdGhlIHN1YnJhbmdlCiAJICogaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQogCSAqIHJlbGV2YW50IHRva2VuLiBXaGVuIHRoZXJlIGlzIG5vIHJlbGV2YW50IHRva2VuLCB0aGUKIAkgKiByYW5nZSBpcyBlbXB0eQogCSAqICg8Y29kZT5nZXRFbmRUb2tlbigpID09IGdldFN0YXJ0VG9rZW4oKTwvY29kZT4pLgotCSAqIAorCSAqCiAJICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCiAJICovCiAJcHVibGljIGludCBnZXRUb2tlbkVuZCgpIHsKLQkJcmV0dXJuIHRoaXMudG9rZW5FbmQ7CisJCXJldHVybiAtMTsgLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgY2hhcmFjdGVyIGluZGljZXMgb2YgdGhlIHN1YnJhbmdlIGluIHRoZQogCSAqIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZSByZWxldmFudCB0b2tlbiBiZWluZwpAQCAtMTAyOSwxOCArMTAyNiwxNCBAQAogCSAqIDxwPgogCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGFydEluZGV4IGNoYXJhY3RlciBpbmRleCBvZiB0b2tlbiBzdGFydCBwb3NpdGlvbiAoaW5jbHVzaXZlKQogCSAqIEBwYXJhbSBlbmRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgdG9rZW4gZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCiAJICovCiAJcHVibGljIHZvaWQgc2V0VG9rZW5SYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCWlmIChzdGFydEluZGV4IDwgMCB8fCBlbmRJbmRleCA8IHN0YXJ0SW5kZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRva2VuU3RhcnQgPSBzdGFydEluZGV4OwotCQl0aGlzLnRva2VuRW5kID0gZW5kSW5kZXg7CisJCS8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHByb3Bvc2VkIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0IGludG8gdGhlCiAJICogc291cmNlIGZpbGUgYnVmZmVyLCByZXBsYWNpbmcgdGhlIGNoYXJhY3RlcnMgYXQgdGhlIHNwZWNpZmllZApAQCAtMTA0OSw0MyArMTA0MiwxMyBAQAogCSAqIDxwPgogCSAqIFRoZSBjbGllbnQgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheSByZXR1cm5lZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjb21wbGV0aW9uIHN0cmluZwogCSAqLwogCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvbigpIHsKLQkJaWYodGhpcy5jb21wbGV0aW9uS2luZCA9PSBNRVRIT0RfREVDTEFSQVRJT04pIHsKLQkJCXRoaXMuZmluZFBhcmFtZXRlck5hbWVzKG51bGwpOwotCQkJaWYodGhpcy51cGRhdGVDb21wbGV0aW9uKSB7Ci0JCQkJdGhpcy51cGRhdGVDb21wbGV0aW9uID0gZmFsc2U7Ci0JCQkJCi0JCQkJaWYodGhpcy5wYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCWludCBsZW5ndGggPSB0aGlzLnBhcmFtZXRlck5hbWVzLmxlbmd0aDsKLQkJCQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRpb25CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuY29tcGxldGlvbi5sZW5ndGgpOwotCQkJCQkJCi0JCQkJCWludCBzdGFydCA9IDA7Ci0JCQkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyUnLCB0aGlzLmNvbXBsZXRpb24pOwotCQotCQkJCQljb21wbGV0aW9uQnVmZmVyLmFwcGVuZCh0aGlzLmNvbXBsZXRpb24sIHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJCQotCQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKyl7Ci0JCQkJCQljb21wbGV0aW9uQnVmZmVyLmFwcGVuZCh0aGlzLnBhcmFtZXRlck5hbWVzW2ldKTsKLQkJCQkJCXN0YXJ0ID0gZW5kICsgMTsKLQkJCQkJCWVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignJScsIHRoaXMuY29tcGxldGlvbiwgc3RhcnQpOwotCQkJCQkJaWYoZW5kID4gLTEpewotCQkJCQkJCWNvbXBsZXRpb25CdWZmZXIuYXBwZW5kKHRoaXMuY29tcGxldGlvbiwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29tcGxldGlvbkJ1ZmZlci5hcHBlbmQodGhpcy5jb21wbGV0aW9uLCBzdGFydCwgdGhpcy5jb21wbGV0aW9uLmxlbmd0aCAtIHN0YXJ0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnQgbmFtZUxlbmd0aCA9IGNvbXBsZXRpb25CdWZmZXIubGVuZ3RoKCk7Ci0JCQkJCXRoaXMuY29tcGxldGlvbiA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOwotCQkJCQljb21wbGV0aW9uQnVmZmVyLmdldENoYXJzKDAsIG5hbWVMZW5ndGgsIHRoaXMuY29tcGxldGlvbiwgMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmNvbXBsZXRpb247CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBwcm9wb3NlZCBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydCBpbnRvIHRoZQogCSAqIHNvdXJjZSBmaWxlIGJ1ZmZlciwgcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXJzIGF0IHRoZSBzcGVjaWZpZWQKQEAgLTEwOTgsMTMgKzEwNjEsMTMgQEAKIAkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cwogCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjb21wbGV0aW9uIHRoZSBjb21wbGV0aW9uIHN0cmluZwogCSAqLwogCXB1YmxpYyB2b2lkIHNldENvbXBsZXRpb24oY2hhcltdIGNvbXBsZXRpb24pIHsKLQkJdGhpcy5jb21wbGV0aW9uID0gY29tcGxldGlvbjsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCQkKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZQogCSAqIHN1YnJhbmdlIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgdG8gYmUgcmVwbGFjZWQKQEAgLTExMTMsMjMgKzEwNzYsMjMgQEAKIAkgKiB0aGUgY29tcGxldGlvbiBzdHJpbmcgaXMgdG8gYmUgaW5zZXJ0ZWQgYXQgdGhpcwogCSAqIGluZGV4LgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB3aGlsZSB0aGUgdG9rZW4gc3VicmFuZ2UgaXMgcHJlY2lzZWx5IAorCSAqIE5vdGUgdGhhdCB3aGlsZSB0aGUgdG9rZW4gc3VicmFuZ2UgaXMgcHJlY2lzZWx5CiAJICogc3BlY2lmaWVkLCB0aGUgcmVwbGFjZW1lbnQgcmFuZ2UgaXMgbG9vc2VseQogCSAqIGNvbnN0cmFpbmVkIGFuZCBtYXkgbm90IGJlYXIgYW55IGRpcmVjdCByZWxhdGlvbgogCSAqIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IG9mZnNldC4gRm9yIGV4YW1wbGUsCi0JICogaXQgd291bGQgYmUgcG9zc2libGUgZm9yIGEgdHlwZSBjb21wbGV0aW9uIHRvIAorCSAqIGl0IHdvdWxkIGJlIHBvc3NpYmxlIGZvciBhIHR5cGUgY29tcGxldGlvbiB0bwogCSAqIHByb3Bvc2UgaW5zZXJ0aW5nIGFuIGltcG9ydCBkZWNsYXJhdGlvbiBhdCB0aGUKIAkgKiB0b3Agb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7IG9yIHRoZSBjb21wbGV0aW9uCiAJICogbWlnaHQgaW5jbHVkZSB0cmFpbGluZyBwYXJlbnRoZXNlcyBhbmQKIAkgKiBwdW5jdHVhdGlvbiBmb3IgYSBtZXRob2QgY29tcGxldGlvbi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHJlcGxhY2VtZW50IHN0YXJ0IHBvc2l0aW9uIChpbmNsdXNpdmUpCiAJICovCiAJcHVibGljIGludCBnZXRSZXBsYWNlU3RhcnQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcGxhY2VTdGFydDsKKwkJcmV0dXJuIC0xOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGVuZCBvZiB0aGUKIAkgKiBzdWJyYW5nZSBpbiB0aGUgc291cmNlIGZpbGUgYnVmZmVyIHRvIGJlIHJlcGxhY2VkCkBAIC0xMTM3LDEzICsxMTAwLDEzIEBACiAJICogKDxjb2RlPmdldFJlcGxhY2VFbmQoKSA9PSBnZXRSZXBsYWNlU3RhcnQoKTwvY29kZT4pLAogCSAqIHRoZSBjb21wbGV0aW9uIHN0cmluZyBpcyB0byBiZSBpbnNlcnRlZCBhdCB0aGlzCiAJICogaW5kZXguCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHJlcGxhY2VtZW50IGVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKQogCSAqLwogCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZUVuZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVwbGFjZUVuZDsKKwkJcmV0dXJuIC0xOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgaW5kaWNlcyBvZiB0aGUgc3VicmFuZ2UgaW4gdGhlCiAJICogc291cmNlIGZpbGUgYnVmZmVyIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uCkBAIC0xMTU4LDI3ICsxMTIxLDIzIEBACiAJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKIAkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc3RhcnRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgcmVwbGFjZW1lbnQgc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKIAkgKiBAcGFyYW0gZW5kSW5kZXggY2hhcmFjdGVyIGluZGV4IG9mIHJlcGxhY2VtZW50IGVuZCBwb3NpdGlvbiAoZXhjbHVzaXZlKQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VSYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCWlmIChzdGFydEluZGV4IDwgMCB8fCBlbmRJbmRleCA8IHN0YXJ0SW5kZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJlcGxhY2VTdGFydCA9IHN0YXJ0SW5kZXg7Ci0JCXRoaXMucmVwbGFjZUVuZCA9IGVuZEluZGV4OworCQkvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSByZWxldmFuY2UgcmF0aW5nIG9mIHRoaXMgcHJvcG9zYWwuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHJlbGV2YW5jZSByYXRpbmcgb2YgdGhpcyBwcm9wb3NhbDsgcmF0aW5ncyBhcmUgcG9zaXRpdmU7IGhpZ2hlciBtZWFucyBiZXR0ZXIKIAkgKi8KIAlwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVsZXZhbmNlOworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHJlbGF0aXZlIHJlbGV2YW5jZSByYXRpbmcgb2YgdGhpcyBwcm9wb3NhbC4KIAkgKiA8cD4KQEAgLTExODgsMTYgKzExNDcsMTMgQEAKIAkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cwogCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSByYXRpbmcgcmVsZXZhbmNlIHJhdGluZyBvZiB0aGlzIHByb3Bvc2FsOyByYXRpbmdzIGFyZSBwb3NpdGl2ZTsgaGlnaGVyIG1lYW5zIGJldHRlcgogCSAqLwogCXB1YmxpYyB2b2lkIHNldFJlbGV2YW5jZShpbnQgcmF0aW5nKSB7Ci0JCWlmIChyYXRpbmcgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucmVsZXZhbmNlID0gcmF0aW5nOworCQkvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBvciBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlbGV2YW50CiAJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCkBAIC0xMjEzLDE4ICsxMTY5LDIyIEBACiAJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZDwvbGk+CiAJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKIAkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KIAkgKiAJPGxpPjxjb2RlPk1FVEhPRF9JTVBPUlQ8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKIAkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZDwvbGk+CiAJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCiAJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CisJICogIDxsaT48Y29kZT5NRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCisJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CiAJICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKIAkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZwogCSAqIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgotCSAqIAk8bGk+PGNvZGU+UEFDS0FHRV9SRUY8L2NvZGU+IC0gZG90LWJhc2VkIHBhY2thZ2UgCisJICogCTxsaT48Y29kZT5QQUNLQUdFX1JFRjwvY29kZT4gLSBkb3QtYmFzZWQgcGFja2FnZQogCSAqIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KLQkgKiAJPGxpPjxjb2RlPlRZUEVfSU1QT1JUPC9jb2RlPiAtIGRvdC1iYXNlZCBwYWNrYWdlIAorCSAqIAk8bGk+PGNvZGU+VFlQRV9JTVBPUlQ8L2NvZGU+IC0gZG90LWJhc2VkIHBhY2thZ2UKIAkgKiBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZDwvbGk+Ci0JICogIDxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT4gLSBkb3QtYmFzZWQgcGFja2FnZSAKKwkgKiAgPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIGRvdC1iYXNlZCBwYWNrYWdlCiAJICogbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSB0eXBlIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+CiAJICogIDxsaT48Y29kZT5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHR5cGUgc2lnbmF0dXJlCiAJICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgY3JlYXRlZDwvbGk+CkBAIC0xMjMzLDE1ICsxMTkzLDE2IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQogCSAqIHJldHVybmVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYSB0eXBlIHNpZ25hdHVyZSBvciBhIHBhY2thZ2UgbmFtZSAoZGVwZW5kaW5nCiAJICogb24gdGhlIGtpbmQgb2YgY29tcGxldGlvbiksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2VlIFNpZ25hdHVyZQogCSAqLwogCXB1YmxpYyBjaGFyW10gZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uU2lnbmF0dXJlOworCQlyZXR1cm4gbnVsbDsgLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCisKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIHJlbGV2YW50CiAJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCkBAIC0xMjU5LDE1ICsxMjIwLDE1IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQogCSAqIHJldHVybmVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYSBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXIjY3JlYXRlQVNUcyhJQ29tcGlsYXRpb25Vbml0W10sIFN0cmluZ1tdLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKQogICAgICAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgY2hhcltdIGdldERlY2xhcmF0aW9uS2V5KCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbktleTsKKwkJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHR5cGUgb3IgcGFja2FnZSBzaWduYXR1cmUgb2YgdGhlIHJlbGV2YW50CiAJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCkBAIC0xMjc4LDE0ICsxMjM5LDE0IEBACiAJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKIAkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIG9yIHBhY2thZ2Ugc2lnbmF0dXJlLCBvcgogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXREZWNsYXJhdGlvblNpZ25hdHVyZShjaGFyW10gc2lnbmF0dXJlKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb25TaWduYXR1cmUgPSBzaWduYXR1cmU7CisJCS8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIHR5cGUgb3IgcGFja2FnZSBrZXkgb2YgdGhlIHJlbGV2YW50CiAJICogZGVjbGFyYXRpb24gaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCkBAIC0xMjk2LDE1ICsxMjU3LDE1IEBACiAJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKIAkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0ga2V5IHRoZSB0eXBlIG9yIHBhY2thZ2Uga2V5LCBvcgogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKICAgICAgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb25LZXkoY2hhcltdIGtleSkgewotCQl0aGlzLmRlY2xhcmF0aW9uS2V5ID0ga2V5OworCQkvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kLCBmaWVsZCwKIAkgKiBtZW1iZXIsIG9yIHZhcmlhYmxlIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvcgpAQCAtMTMxNiwxMSArMTI3NywxMyBAQAogCSAqICA8bGk+PGNvZGU+QU5OT1RBVElPTl9BVFRSSUJVVF9SRUY8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZTwvbGk+CiAJICogCTxsaT48Y29kZT5GSUVMRF9JTVBPUlQ8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIGZpZWxkPC9saT4KIAkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgZmllbGQ8L2xpPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBmaWVsZDwvbGk+CiAJICogCTxsaT48Y29kZT5LRVlXT1JEPC9jb2RlPiAtIHRoZSBrZXl3b3JkPC9saT4KIAkgKiAJPGxpPjxjb2RlPkxBQkVMX1JFRjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgbGFiZWw8L2xpPgogCSAqIAk8bGk+PGNvZGU+TE9DQUxfVkFSSUFCTEVfUkVGPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZTwvbGk+CiAJICogCTxsaT48Y29kZT5NRVRIT0RfSU1QT1JUPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Q8L2xpPgogCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kICh0aGUgdHlwZSBzaW1wbGUgbmFtZSBmb3IgY29uc3RydWN0b3IpPC9saT4KKwkgKiAgPGxpPjxjb2RlPk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZDwvbGk+CiAJICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCAodGhlIHR5cGUgc2ltcGxlIG5hbWUgZm9yIGNvbnN0cnVjdG9yKTwvbGk+CiAJICogCTxsaT48Y29kZT5WQVJJQUJMRV9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGU8L2xpPgogCSAqICA8bGk+PGNvZGU+UE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kPC9saT4KQEAgLTEzMjksMTUgKzEyOTIsMTUgQEAKIAkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5CiAJICogcmV0dXJuZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUga2V5d29yZCwgZmllbGQsIG1ldGhvZCwgbG9jYWwgdmFyaWFibGUsIG9yIG1lbWJlcgogCSAqIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KIAlwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCi0JCisKKwogCS8qKgogCSAqIFNldHMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgKHR5cGUgc2ltcGxlIG5hbWUgZm9yIGNvbnN0cnVjdG9yKSwgZmllbGQsCiAJICogbWVtYmVyLCBvciB2YXJpYWJsZSByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IKQEAgLTEzNDksMTQgKzEzMTIsMTQgQEAKIAkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cwogCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBrZXl3b3JkLCBmaWVsZCwgbWV0aG9kLCBsb2NhbCB2YXJpYWJsZSwKIAkgKiBvciBtZW1iZXIgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldE5hbWUoY2hhcltdIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2Qgb3IgdHlwZQogCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgpAQCAtMTM3MiwxMiArMTMzNSwxNiBAQAogCSAqIG9mIHRoZSByZWZlcmVuY2VkIGZpZWxkJ3MgdHlwZTwvbGk+CiAJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIHR5cGUgc2lnbmF0dXJlCiAJICogb2YgdGhlIHJlZmVyZW5jZWQgZmllbGQncyB0eXBlPC9saT4KKwkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSB0aGUgdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgcmVmZXJlbmNlZCBmaWVsZCdzIHR5cGU8L2xpPgogCSAqIAk8bGk+PGNvZGU+TE9DQUxfVkFSSUFCTEVfUkVGPC9jb2RlPiAtIHRoZSB0eXBlIHNpZ25hdHVyZQogCSAqIG9mIHRoZSByZWZlcmVuY2VkIGxvY2FsIHZhcmlhYmxlJ3MgdHlwZTwvbGk+CiAJICogCTxsaT48Y29kZT5NRVRIT0RfSU1QT1JUPC9jb2RlPiAtIG1ldGhvZCBzaWduYXR1cmUKIAkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgaW1wb3J0ZWQ8L2xpPgogCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSBtZXRob2Qgc2lnbmF0dXJlCiAJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSBtZXRob2Qgc2lnbmF0dXJlCisJICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgogCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIG1ldGhvZCBzaWduYXR1cmUKIAkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgaW1wbGVtZW50ZWQgb3Igb3ZlcnJpZGRlbjwvbGk+CiAJICogCTxsaT48Y29kZT5UWVBFX0lNUE9SVDwvY29kZT4gLSB0eXBlIHNpZ25hdHVyZQpAQCAtMTM5MywxNCArMTM2MCwxNCBAQAogCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKIAkgKiByZXR1cm5lZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAc2VlIFNpZ25hdHVyZQogCSAqLwogCXB1YmxpYyBjaGFyW10gZ2V0U2lnbmF0dXJlKCkgewotCQlyZXR1cm4gdGhpcy5zaWduYXR1cmU7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBrZXkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KQEAgLTE0MTgsMjIwICsxMzg1LDE1IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQogCSAqIHJldHVybmVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNjcmVhdGVBU1RzKElDb21waWxhdGlvblVuaXRbXSwgU3RyaW5nW10sIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCiAgICAgICogQHNpbmNlIDMuMQogCSAqLwogCXB1YmxpYyBjaGFyW10gZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCi0vLwkvKioKLS8vCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVsZXZhbnQKLS8vCSAqIGRlY2xhcmF0aW9uIGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotLy8JICogPHA+Ci0vLwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgotLy8JICogY29tcGxldGlvbiBwcm9wb3NhbHM6Ci0vLwkgKiA8dWw+Ci0vLwkgKiA8bGk+PGNvZGU+QU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCi0vLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIHN1YmNsYXNzZWQgb3IgaW1wbGVtZW50ZWQ8L2xpPgotLy8JICogCTxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgotLy8JICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nCi0vLwkgKiBpbXBsZW1lbnRlZCBvciBvdmVycmlkZGVuPC9saT4KLS8vCSAqIDwvdWw+Ci0vLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKLS8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKLS8vCSAqIHJldHVybmVkLgotLy8JICogPC9wPgotLy8JICogCi0vLwkgKiBAcmV0dXJuIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lLCBvcgotLy8JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotLy8JICogQHNlZSAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKQotLy8JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLS8vCSAqIAotLy8JICogQHNpbmNlIDMuMQotLy8JICovCi0vLwlwdWJsaWMgY2hhcltdIGdldERlY2xhcmF0aW9uUGFja2FnZU5hbWUoKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25QYWNrYWdlTmFtZTsKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIHJlbGV2YW50Ci0vLwkgKiBkZWNsYXJhdGlvbiBpbiB0aGUgY29udGV4dCB3aXRob3V0IHRoZSBwYWNrYWdlIGZyYWdtZW50LAotLy8JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gCi0vLwkgKiA8cD4KLS8vCSAqIFRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIGtpbmRzIG9mCi0vLwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKLS8vCSAqIDx1bD4KLS8vCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgc3ViY2xhc3NlZCBvciBpbXBsZW1lbnRlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPkZJRUxEX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQotLy8JICogb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkCi0vLwkgKiBvciBhbiBhbm9ueW1vdXMgdHlwZSBpbnN0YW50aWF0aW9uICgibmV3IFgoKXt9IikgaWYgaXQgaXMgYW4gYW5vbnltb3VzIHR5cGU8L2xpPgotLy8JICogCTxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgdHlwZSBuYW1lCi0vLwkgKiBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkCi0vLwkgKiBvciBhbiBhbm9ueW1vdXMgdHlwZSBpbnN0YW50aWF0aW9uICgibmV3IFgoKXt9IikgaWYgaXQgaXMgYW4gYW5vbnltb3VzIHR5cGU8L2xpPgotLy8JICogCTxsaT48Y29kZT5NRVRIT0RfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nCi0vLwkgKiBpbXBsZW1lbnRlZCBvciBvdmVycmlkZGVuPC9saT4KLS8vCSAqIDwvdWw+Ci0vLwkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKLS8vCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBDbGllbnRzIG11c3Qgbm90IG1vZGlmeSB0aGUgYXJyYXkKLS8vCSAqIHJldHVybmVkLgotLy8JICogPC9wPgotLy8JICogCi0vLwkgKiBAcmV0dXJuIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lLCBvcgotLy8JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotLy8JICogQHNlZSAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKQotLy8JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLS8vCSAqIAotLy8JICogQHNpbmNlIDMuMQotLy8JICovCi0vLwlwdWJsaWMgY2hhcltdIGdldERlY2xhcmF0aW9uVHlwZU5hbWUoKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZTsKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1ldGhvZCBvciB0eXBlCi0vLwkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLS8vCSAqIDxwPgotLy8JICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKLS8vCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgotLy8JICogPHVsPgotLy8JICogCTxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSByZWZlcmVuY2VkIGZpZWxkJ3MgdHlwZTwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPkxPQ0FMX1ZBUklBQkxFX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQotLy8JICogb2YgdGhlIHJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGUncyB0eXBlPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX1JFRjwvY29kZT4gLSAgdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQotLy8JICogb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBpbXBsZW1lbnRlZAotLy8JICogb3Igb3ZlcnJpZGRlbjwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPlBBQ0tBR0VfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCi0vLwkgKiBvZiB0aGUgcGFja2FnZSB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgotLy8JICogCTxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZQotLy8JICogb2YgdGhlIHR5cGUgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+VkFSSUFCTEVfREVDTEFSQVRJT048L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCBwYWNrYWdlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBkZWNsYXJlZDwvbGk+Ci0vLwkgKiA8L3VsPgotLy8JICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCi0vLwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5Ci0vLwkgKiByZXR1cm5lZC4KLS8vCSAqIDwvcD4KLS8vCSAqIAotLy8JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0vLwkgKiAKLS8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKLS8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0vLwkgKiAKLS8vCSAqIEBzaW5jZSAzLjEKLS8vCSAqLwotLy8JcHVibGljIGNoYXJbXSBnZXRQYWNrYWdlTmFtZSgpIHsKLS8vCQlyZXR1cm4gdGhpcy5wYWNrYWdlTmFtZTsKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZSBmcmFnbWVudCBvZiB0aGUgbWV0aG9kIG9yIHR5cGUKLS8vCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotLy8JICogPHA+Ci0vLwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgotLy8JICogY29tcGxldGlvbiBwcm9wb3NhbHM6Ci0vLwkgKiA8dWw+Ci0vLwkgKiAJPGxpPjxjb2RlPkZJRUxEX1JFRjwvY29kZT4gLSB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQotLy8JICogb2YgdGhlIHJlZmVyZW5jZWQgZmllbGQncyB0eXBlPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+TE9DQUxfVkFSSUFCTEVfUkVGPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgdHlwZSBuYW1lCi0vLwkgKiBvZiB0aGUgcmVmZXJlbmNlZCBsb2NhbCB2YXJpYWJsZSdzIHR5cGU8L2xpPgotLy8JICogCTxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtICB0aGUgZG90LWJhc2VkIHR5cGUgbmFtZQotLy8JICogb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgdHlwZSBuYW1lCi0vLwkgKiBvZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGltcGxlbWVudGVkCi0vLwkgKiBvciBvdmVycmlkZGVuPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+VFlQRV9SRUY8L2NvZGU+IC0gdGhlIGRvdC1iYXNlZCB0eXBlIG5hbWUKLS8vCSAqIG9mIHRoZSB0eXBlIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPlZBUklBQkxFX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHRoZSBkb3QtYmFzZWQgcGFja2FnZSBuYW1lCi0vLwkgKiBvZiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgZGVjbGFyZWQ8L2xpPgotLy8JICogPC91bD4KLS8vCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucwotLy8JICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQotLy8JICogcmV0dXJuZWQuCi0vLwkgKiA8L3A+Ci0vLwkgKiAKLS8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotLy8JICogCi0vLwkgKiBAc2VlICNnZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpCi0vLwkgKiBAc2VlICNnZXRTaWduYXR1cmUoKQotLy8JICogCi0vLwkgKiBAc2luY2UgMy4xCi0vLwkgKi8KLS8vCXB1YmxpYyBjaGFyW10gZ2V0VHlwZU5hbWUoKSB7Ci0vLwkJcmV0dXJuIHRoaXMudHlwZU5hbWU7Ci0vLwl9Ci0vLwkKLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHBhY2thZ2UgbmFtZXMgb2YgdGhlIG1ldGhvZCAKLS8vCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotLy8JICogPHA+Ci0vLwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgotLy8JICogY29tcGxldGlvbiBwcm9wb3NhbHM6Ci0vLwkgKiA8dWw+Ci0vLwkgKiAJPGxpPjxjb2RlPkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjwvY29kZT4gLSBwYXJhbWV0ZXIgcGFja2FnZSBuYW1lcwotLy8JICogb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgYmVpbmcgaW52b2tlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9SRUY8L2NvZGU+IC0gcGFyYW1ldGVyIHBhY2thZ2UgbmFtZXMKLS8vCSAqIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KLS8vCSAqIAk8bGk+PGNvZGU+TUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPiAtIHBhcmFtZXRlciBwYWNrYWdlIG5hbWVzCi0vLwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgaW1wbGVtZW50ZWQgb3Igb3ZlcnJpZGRlbjwvbGk+Ci0vLwkgKiA8L3VsPgotLy8JICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCi0vLwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQ2xpZW50cyBtdXN0IG5vdCBtb2RpZnkgdGhlIGFycmF5Ci0vLwkgKiByZXR1cm5lZC4KLS8vCSAqIDwvcD4KLS8vCSAqIAotLy8JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0vLwkgKiAKLS8vCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkKLS8vCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0vLwkgKiAKLS8vCSAqIEBzaW5jZSAzLjEKLS8vCSAqLwotLy8JcHVibGljIGNoYXJbXVtdIGdldFBhcmFtZXRlclBhY2thZ2VOYW1lcygpIHsKLS8vCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJQYWNrYWdlTmFtZXM7Ci0vLwl9Ci0vLwkKLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgbmFtZXMgd2l0aG91dCB0aGUgcGFja2FnZSBmcmFnbWVudCBvZgotLy8JICogdGhlIG1ldGhvZCByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLS8vCSAqIDxwPgotLy8JICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKLS8vCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgotLy8JICogPHVsPgotLy8JICogCTxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gcGFyYW1ldGVyIHR5cGUgbmFtZXMKLS8vCSAqIG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIGJlaW5nIGludm9rZWQ8L2xpPgotLy8JICogCTxsaT48Y29kZT5NRVRIT0RfUkVGPC9jb2RlPiAtIHBhcmFtZXRlciB0eXBlIG5hbWVzCi0vLwkgKiBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZDwvbGk+Ci0vLwkgKiAJPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSBwYXJhbWV0ZXIgdHlwZSBuYW1lcwotLy8JICogb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGltcGxlbWVudGVkIG9yIG92ZXJyaWRkZW48L2xpPgotLy8JICogPC91bD4KLS8vCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucwotLy8JICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQotLy8JICogcmV0dXJuZWQuCi0vLwkgKiA8L3A+Ci0vLwkgKiAKLS8vCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotLy8JICogCi0vLwkgKiBAc2VlICNnZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpCi0vLwkgKiBAc2VlICNnZXRTaWduYXR1cmUoKQotLy8JICogCi0vLwkgKiBAc2luY2UgMy4xCi0vLwkgKi8KLS8vCXB1YmxpYyBjaGFyW11bXSBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKSB7Ci0vLwkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzOwotLy8JfQotCQorCiAJLyoqCiAJICogU2V0cyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QsIGZpZWxkIHR5cGUsIG1lbWJlciB0eXBlLAogCSAqIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgpAQCAtMTY0MiwxMyArMTQwNCwxMyBAQAogCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCiAJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCiAJcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlKGNoYXJbXSBzaWduYXR1cmUpIHsKLQkJdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisJCS8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGtleSBvZiB0aGUgbWV0aG9kLCBmaWVsZCB0eXBlLCBtZW1iZXIgdHlwZSwKIAkgKiByZWxldmFudCBpbiB0aGUgY29udGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KQEAgLTE2NTksMTQgKzE0MjEsMTQgQEAKIAkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cwogCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBrZXkgdGhlIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogICAgICAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRLZXkoY2hhcltdIGtleSkgewotCQl0aGlzLmtleSA9IGtleTsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbW9kaWZpZXIgZmxhZ3MgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQsIG9yCiAJICogPGNvZGU+RmxhZ3MuQWNjRGVmYXVsdDwvY29kZT4gaWYgbm9uZS4KQEAgLTE2NzUsMTYgKzE0MzcsMTkgQEAKIAkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKIAkgKiA8dWw+CiAJICogPGxpPjxjb2RlPkFOTk9UQVRJT05fQVRUUklCVVRfUkVGPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCi0JICogb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGlzIHJlZmVyZW5jZWQ7IAorCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyByZWZlcmVuY2VkOwogCSAqIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKIAkgKiBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkPC9saT4KIAkgKiAJPGxpPjxjb2RlPkZJRUxEX0lNUE9SVDwvY29kZT4gLSBtb2RpZmllciBmbGFncwogCSAqIG9mIHRoZSBmaWVsZCB0aGF0IGlzIGltcG9ydGVkLjwvbGk+CiAJICogIDxsaT48Y29kZT5GSUVMRF9SRUY8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKLQkgKiBvZiB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkOyAKKwkgKiBvZiB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkOwogCSAqIDxjb2RlPkZsYWdzLkFjY0VudW08L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZQogCSAqIHJlZmVyZW5jZXMgdG8gZW51bSBjb25zdGFudHMKIAkgKiA8L2xpPgorCSAqICA8bGk+PGNvZGU+RklFTERfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCisJICogb2YgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZC4KKwkgKiA8L2xpPgogCSAqIAk8bGk+PGNvZGU+S0VZV09SRDwvY29kZT4gLSBtb2RpZmllciBmbGFnCiAJICogY29ycmVzcG9uZGluZyB0byB0aGUgbW9kaWZpZXIga2V5d29yZDwvbGk+CiAJICogCTxsaT48Y29kZT5MT0NBTF9WQVJJQUJMRV9SRUY8L2NvZGU+IC0gbW9kaWZpZXIgZmxhZ3MKQEAgLTE2OTcsMTYgKzE0NjIsMTkgQEAKIAkgKiA8Y29kZT5GbGFncy5BY2NBbm5vdGF0aW9uPC9jb2RlPiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUKIAkgKiByZWZlcmVuY2VzIHRvIGFubm90YXRpb24gdHlwZSBtZW1iZXJzCiAJICogPC9saT4KKwkgKiA8bGk+PGNvZGU+TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSBtb2RpZmllciBmbGFncworCSAqIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkLgorCSAqIDwvbGk+CiAJICogPGxpPjxjb2RlPk1FVEhPRF9ERUNMQVJBVElPTjwvY29kZT4gLSBtb2RpZmllciBmbGFncwogCSAqIGZvciB0aGUgbWV0aG9kIHRoYXQgaXMgYmVpbmcgaW1wbGVtZW50ZWQgb3Igb3ZlcnJpZGRlbjwvbGk+CiAJICogPGxpPjxjb2RlPlRZUEVfSU1QT1JUPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCiAJICogb2YgdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZDsgPGNvZGU+RmxhZ3MuQWNjSW50ZXJmYWNlPC9jb2RlPgotCSAqIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSByZWZlcmVuY2VzIHRvIGludGVyZmFjZXMsIAorCSAqIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSByZWZlcmVuY2VzIHRvIGludGVyZmFjZXMsCiAJICogPGNvZGU+RmxhZ3MuQWNjRW51bTwvY29kZT4gZW51bSB0eXBlcywKIAkgKiBhbmQgPGNvZGU+RmxhZ3MuQWNjQW5ub3RhdGlvbjwvY29kZT4gYW5ub3RhdGlvbiB0eXBlczwvbGk+CiAJICogPGxpPjxjb2RlPlRZUEVfUkVGPC9jb2RlPiAtIG1vZGlmaWVyIGZsYWdzCiAJICogb2YgdGhlIHR5cGUgdGhhdCBpcyByZWZlcmVuY2VkOyA8Y29kZT5GbGFncy5BY2NJbnRlcmZhY2U8L2NvZGU+Ci0JICogY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplIHJlZmVyZW5jZXMgdG8gaW50ZXJmYWNlcywgCisJICogY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplIHJlZmVyZW5jZXMgdG8gaW50ZXJmYWNlcywKIAkgKiA8Y29kZT5GbGFncy5BY2NFbnVtPC9jb2RlPiBlbnVtIHR5cGVzLAogCSAqIGFuZCA8Y29kZT5GbGFncy5BY2NBbm5vdGF0aW9uPC9jb2RlPiBhbm5vdGF0aW9uIHR5cGVzCiAJICogPC9saT4KQEAgLTE3MTgsMTUgKzE0ODYsMTUgQEAKIAkgKiBGb3Igb3RoZXIga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKIAkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBmbGFncywgb3IKIAkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPiBpZiBub25lCiAJICogQHNlZSBGbGFncwogCSAqLwogCXB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmZsYWdzOworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG1vZGlmaWVyIGZsYWdzIHJlbGV2YW50IGluIHRoZSBjb250ZXh0LgogCSAqIDxwPgpAQCAtMTczNiwxOSArMTUwNCwxOSBAQAogCSAqIFRoZSBjb21wbGV0aW9uIGVuZ2luZSBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFuZCBzZXRzCiAJICogaXRzIHByb3BlcnRpZXM7IHRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGNsaWVudHMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncywgb3IKIAkgKiA8Y29kZT5GbGFncy5BY2NEZWZhdWx0PC9jb2RlPiBpZiBub25lCiAJICovCiAJcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCXRoaXMuZmxhZ3MgPSBmbGFnczsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMuCiAJICogVGhlIHByb3Bvc2FsIGNhbiBiZSBhcHBseSBvbmx5IGlmIHRoZXNlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzIGFyZSBhbHNvIGFwcGxpZWQuCiAJICogSWYgdGhlIHJlcXVpcmVkIHByb3Bvc2FsIGFyZW4ndCBhcHBsaWVkIHRoZSBjb21wbGV0aW9uIGNvdWxkIGNyZWF0ZSBjb21wbGV0aW9uIHByb2JsZW1zLgotCSAqIAorCSAqCiAJICogPHA+CiAJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKIAkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKQEAgLTE3NjcsMjggKzE1MzUsNTMgQEAKIAkgKiAgICA8bGk+PGNvZGU+TUVUSE9EX0lNUE9SVDwvY29kZT48L2xpPgogCSAqICAgPC91bD4KIAkgKiAgPC9saT4KKwkgKiA8L2xpPgorCSAqIAk8bGk+PGNvZGU+VFlQRV9SRUY8L2NvZGU+IC0gVGhlIGFsbG93ZWQgcmVxdWlyZWQgcHJvcG9zYWxzIGZvciB0aGlzIGtpbmQgYXJlOgorCSAqICAgPHVsPgorCSAqICAgIDxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT48L2xpPgorCSAqICAgPC91bD4KKwkgKiAgPC9saT4KKwkgKiAgPGxpPjxjb2RlPkNPTlNUUlVDVE9SX0lOVk9DQVRJT048L2NvZGU+IC0gVGhlIGFsbG93ZWQgcmVxdWlyZWQgcHJvcG9zYWxzIGZvciB0aGlzIGtpbmQgYXJlOgorCSAqICAgPHVsPgorCSAqICAgIDxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT48L2xpPgorCSAqICAgPC91bD4KKwkgKiAgPC9saT4KKwkgKiAgPGxpPjxjb2RlPkFOT05ZTU9VU19DTEFTU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OPC9jb2RlPiAtIFRoZSBhbGxvd2VkIHJlcXVpcmVkIHByb3Bvc2FscyBmb3IgdGhpcyBraW5kIGFyZToKKwkgKiAgIDx1bD4KKwkgKiAgICA8bGk+PGNvZGU+VFlQRV9SRUY8L2NvZGU+PC9saT4KKwkgKiAgIDwvdWw+CisJICogIDwvbGk+CisJICogIDxsaT48Y29kZT5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT048L2NvZGU+IC0gVGhlIGFsbG93ZWQgcmVxdWlyZWQgcHJvcG9zYWxzIGZvciB0aGlzIGtpbmQgYXJlOgorCSAqICAgPHVsPgorCSAqICAgIDxsaT48Y29kZT5UWVBFX1JFRjwvY29kZT48L2xpPgorCSAqICAgPC91bD4KKwkgKiAgPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBPdGhlciBraW5kcyBvZiByZXF1aXJlZCBwcm9wb3NhbHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgZnV0dXJlLCB0aGVyZWZvcmUgY2xpZW50cyBvZiB0aGlzCi0JICogQVBJIG11c3QgYWxsb3cgd2l0aCB7QGxpbmsgQ29tcGxldGlvblJlcXVlc3RvciNzZXRBbGxvd3NSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCwgYm9vbGVhbil9IAorCSAqIEFQSSBtdXN0IGFsbG93IHdpdGgge0BsaW5rIENvbXBsZXRpb25SZXF1ZXN0b3Ijc2V0QWxsb3dzUmVxdWlyZWRQcm9wb3NhbHMoaW50LCBpbnQsIGJvb2xlYW4pfQogCSAqIG9ubHkga2luZHMgd2hpY2ggYXJlIGluIHRoaXMgbGlzdCB0byBhdm9pZCB1bmV4cGVjdGVkIHJlc3VsdHMgaW4gdGhlIGZ1dHVyZS4KIAkgKiA8L3A+CiAJICogPHA+CisJICogQSByZXF1aXJlZCBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgaXMgcHJvcG9zZWQgZXZlbiBpZiB7QGxpbmsgQ29tcGxldGlvblJlcXVlc3RvciNpc0lnbm9yZWQoaW50KX0KKwkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoYXQga2luZC4KKwkgKiA8L3A+CisJICogPHA+CiAJICogQSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2FsIGNhbm5vdCBoYXZlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LGJvb2xlYW4pCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIENvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFJlcXVpcmVkUHJvcG9zYWxzKCkgewotCQlyZXR1cm4gdGhpcy5yZXF1aXJlZFByb3Bvc2FsczsKKwkJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKLQkKKworCiAJLyoqCiAJICogU2V0cyB0aGUgbGlzdCBvZiByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KIAkgKiA8cD4KQEAgLTE3OTgsMTUgKzE1OTEsMTUgQEAKIAkgKiBUaGUgY29tcGxldGlvbiBlbmdpbmUgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhbmQgc2V0cwogCSAqIGl0cyBwcm9wZXJ0aWVzOyB0aGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBjbGllbnRzLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wb3NhbHMgdGhlIGxpc3Qgb2YgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMsIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogICAgICAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMpIHsKLQkJdGhpcy5yZXF1aXJlZFByb3Bvc2FscyA9IHByb3Bvc2FsczsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogRmluZHMgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgbmFtZXMuCiAJICogVGhpcyBpbmZvcm1hdGlvbiBpcyByZWxldmFudCB0byBtZXRob2QgcmVmZXJlbmNlIChhbmQKQEAgLTE4MTksNzIgKzE2MTIsMTUgQEAKIAkgKiA8Yj5Ob3RlIHRoYXQgdGhpcyBpcyBhbiBleHBlbnNpdmUgdGhpbmcgdG8gY29tcHV0ZSwgd2hpY2ggbWF5IHJlcXVpcmUKIAkgKiBwYXJzaW5nIEphdmEgc291cmNlIGZpbGVzLCBldGMuIFVzZSBzcGFyaW5nbHkuPC9iPgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWVzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogb3Igbm90IGF2YWlsYWJsZSBvciBub3QgcmVsZXZhbnQKIAkgKi8KIAlwdWJsaWMgY2hhcltdW10gZmluZFBhcmFtZXRlck5hbWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIXRoaXMucGFyYW1ldGVyTmFtZXNDb21wdXRlZCkgewotCQkJdGhpcy5wYXJhbWV0ZXJOYW1lc0NvbXB1dGVkID0gdHJ1ZTsKLQkJCQotCQkJc3dpdGNoKHRoaXMuY29tcGxldGlvbktpbmQpIHsKLQkJCQljYXNlIEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjoKLQkJCQkJdHJ5IHsKLQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSB0aGlzLmZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcygKLQkJCQkJCQkJdGhpcy5kZWNsYXJhdGlvblBhY2thZ2VOYW1lLAotCQkJCQkJCQl0aGlzLmRlY2xhcmF0aW9uVHlwZU5hbWUsCi0JCQkJCQkJCUNoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodGhpcy5kZWNsYXJhdGlvblR5cGVOYW1lLCAnLicpLAotCQkJCQkJCQlTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXModGhpcy5vcmlnaW5hbFNpZ25hdHVyZSA9PSBudWxsID8gdGhpcy5zaWduYXR1cmUgOiB0aGlzLm9yaWdpbmFsU2lnbmF0dXJlKSk7Ci0JCQkJCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHByb3RlY3Rpb24gZm9yIGludmFsaWQgc2lnbmF0dXJlCi0JCQkJCQlpZih0aGlzLnBhcmFtZXRlclR5cGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9ICB0aGlzLmNyZWF0ZURlZmF1bHRQYXJhbWV0ZXJOYW1lcyh0aGlzLnBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE1FVEhPRF9SRUY6Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gdGhpcy5maW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoCi0JCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25QYWNrYWdlTmFtZSwKLQkJCQkJCQkJdGhpcy5kZWNsYXJhdGlvblR5cGVOYW1lLAotCQkJCQkJCQl0aGlzLm5hbWUsCi0JCQkJCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyh0aGlzLm9yaWdpbmFsU2lnbmF0dXJlID09IG51bGwgPyB0aGlzLnNpZ25hdHVyZSA6IHRoaXMub3JpZ2luYWxTaWduYXR1cmUpKTsKLQkJCQkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gcHJvdGVjdGlvbiBmb3IgaW52YWxpZCBzaWduYXR1cmUKLQkJCQkJCWlmKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzICE9IG51bGwpIHsKLQkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gIHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtZXRlck5hbWVzKHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTUVUSE9EX0RFQ0xBUkFUSU9OOgotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9IHRoaXMuZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKAotCQkJCQkJCQl0aGlzLmRlY2xhcmF0aW9uUGFja2FnZU5hbWUsCi0JCQkJCQkJCXRoaXMuZGVjbGFyYXRpb25UeXBlTmFtZSwKLQkJCQkJCQkJdGhpcy5uYW1lLAotCQkJCQkJCQlTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXModGhpcy5vcmlnaW5hbFNpZ25hdHVyZSA9PSBudWxsID8gdGhpcy5zaWduYXR1cmUgOiB0aGlzLm9yaWdpbmFsU2lnbmF0dXJlKSk7Ci0JCQkJCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIHByb3RlY3Rpb24gZm9yIGludmFsaWQgc2lnbmF0dXJlCi0JCQkJCQlpZih0aGlzLnBhcmFtZXRlclR5cGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9ICB0aGlzLmNyZWF0ZURlZmF1bHRQYXJhbWV0ZXJOYW1lcyh0aGlzLnBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZih0aGlzLnBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKLQkJCQkJCXRoaXMudXBkYXRlQ29tcGxldGlvbiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyTmFtZXM7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHRoZSBtZXRob2QgcGFyYW1ldGVyIG5hbWVzLgogCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcmVsZXZhbnQgdG8gbWV0aG9kIHJlZmVyZW5jZSAoYW5kCkBAIC0xODkzLDE0ICsxNjI5LDEzIEBACiAJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKIAkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgdGhlIHBhcmFtZXRlciBuYW1lcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlck5hbWVzKGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzKSB7Ci0JCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lczsKLQkJdGhpcy5wYXJhbWV0ZXJOYW1lc0NvbXB1dGVkID0gdHJ1ZTsKKwkJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgcHJvcG9zYWwuCiAJICogPHA+CkBAIC0xOTE0LDE3ICsxNjQ5LDE3IEBACiAJICogb3Ige0BsaW5rIElBY2Nlc3NSdWxlI0tfTk9OX0FDQ0VTU0lCTEV9LgogCSAqIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgcmV0dXJuIHtAbGluayBJQWNjZXNzUnVsZSNLX0FDQ0VTU0lCTEV9LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBzZWUgSUFjY2Vzc1J1bGUKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIHByb3Bvc2FsCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIGludCBnZXRBY2Nlc3NpYmlsaXR5KCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3NpYmlsaXR5OworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3Bvc2FsIGlzIGEgY29uc3RydWN0b3IuCiAJICogPHA+CkBAIC0xOTM5LDExNyArMTY3NCwxNDAgQEAKIAkgKiBGb3Iga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMsIHRoaXMgbWV0aG9kIHJldHVybnMKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zYWwgaXMgYSBjb25zdHJ1Y3Rvci4KIAkgKiBAc2luY2UgMy4xCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuaXNDb25zdHJ1Y3RvcjsKKwkJcmV0dXJuIGZhbHNlOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIAl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQlzd2l0Y2godGhpcy5jb21wbGV0aW9uS2luZCkgewotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJBTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuRklFTERfUkVGIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJGSUVMRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuS0VZV09SRCA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiS0VZV09SRCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5MQUJFTF9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIkxBQkVMX1JFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5MT0NBTF9WQVJJQUJMRV9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIkxPQ0FMX1ZBUklBQkxFX1JFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04gOgotCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9ERUNMQVJBVElPTiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYodGhpcy5pc0NvbnN0cnVjdG9yKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIjxDT05TVFJVQ1RPUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKHRoaXMuaXNDb25zdHJ1Y3RvcikgewotCQkJCQlidWZmZXIuYXBwZW5kKCI8Q09OU1RSVUNUT1I+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5QQUNLQUdFX1JFRiA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiUEFDS0FHRV9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIlRZUEVfUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLlZBUklBQkxFX0RFQ0xBUkFUSU9OIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJWQVJJQUJMRV9ERUNMQVJBVElPTiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJQT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiTUVUSE9EX0lNUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5BTk5PVEFUSU9OX0FUVFJJQlVURV9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIkFOTk9UQVRJT05fQVRUUklCVVRFX1JFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX0JMT0NLX1RBRyA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19CTE9DS19UQUciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19JTkxJTkVfVEFHIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJKQVZBRE9DX0lOTElORV9UQUciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19GSUVMRF9SRUY6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19GSUVMRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19NRVRIT0RfUkVGIDoKLQkJCQlidWZmZXIuYXBwZW5kKCJKQVZBRE9DX01FVEhPRF9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19UWVBFX1JFRiA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19UWVBFX1JFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5KQVZBRE9DX1BBUkFNX1JFRiA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiSkFWQURPQ19QQVJBTV9SRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuSkFWQURPQ19WQUxVRV9SRUYgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIkpBVkFET0NfVkFMVUVfUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLkZJRUxEX0lNUE9SVCA6Ci0JCQkJYnVmZmVyLmFwcGVuZCgiRklFTERfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9JTVBPUlQgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIk1FVEhPRF9JTVBPUlQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9JTVBPUlQgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIlRZUEVfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJ1ZmZlci5hcHBlbmQoIlBST1BPU0FMIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCQkKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJde2NvbXBsZXRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuY29tcGxldGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHRoaXMuY29tcGxldGlvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgZGVjbFNpZ246Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZGVjbGFyYXRpb25TaWduYXR1cmUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLmRlY2xhcmF0aW9uU2lnbmF0dXJlKTsgIAotCQlidWZmZXIuYXBwZW5kKCIsIHNpZ246Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuc2lnbmF0dXJlICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQodGhpcy5zaWduYXR1cmUpOwotCQlidWZmZXIuYXBwZW5kKCIsIGRlY2xLZXk6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZGVjbGFyYXRpb25LZXkgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLmRlY2xhcmF0aW9uS2V5KTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBrZXk6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMua2V5ICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoa2V5KTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBuYW1lOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCIsIFsiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMucmVwbGFjZVN0YXJ0KTsKLQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQlidWZmZXIuYXBwZW5kKHRoaXMucmVwbGFjZUVuZCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIl0sIHJlbGV2YW5jZT0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMucmVsZXZhbmNlKTsKLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBvciBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlbGV2YW50CisJICogcmVjZWl2ZXIgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+IC0gdHlwZSBzaWduYXR1cmUKKwkgKiBvZiB0aGUgdHlwZSB0aGF0IGNhc3QgdGhlIHJlY2VpdmVyIG9mIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4gLSB0eXBlIHNpZ25hdHVyZQorCSAqIG9mIHRoZSB0eXBlIHRoYXQgY2FzdCB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQ8L2xpPgorCSAqIDwvdWw+CisJICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4uIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQorCSAqIHJldHVybmVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gYSB0eXBlIHNpZ25hdHVyZSBvciBhIHBhY2thZ2UgbmFtZSAoZGVwZW5kaW5nCisJICogb24gdGhlIGtpbmQgb2YgY29tcGxldGlvbiksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAc2VlIFNpZ25hdHVyZQorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0UmVjZWl2ZXJTaWduYXR1cmUoKSB7CisJCXJldHVybiBudWxsOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHN1YnJhbmdlIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUKKwkgKiByZWxldmFudCByZWNlaXZlciBvZiB0aGUgbWVtYmVyIGJlaW5nIGNvbXBsZXRlZC4gVGhpcworCSAqIHJlY2VpdmVyIGlzIGFuIGV4cHJlc3Npb24uCisJICoKKwkgKiA8cD4KKwkgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorCSAqIDx1bD4KKwkgKiAgPGxpPjxjb2RlPkZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT48L2xpPgorCSAqICA8bGk+PGNvZGU+TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT48L2xpPgorCSAqIDwvdWw+CisJICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPjA8L2NvZGU+LgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gY2hhcmFjdGVyIGluZGV4IG9mIHJlY2VpdmVyIHN0YXJ0IHBvc2l0aW9uIChpbmNsdXNpdmUpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGludCBnZXRSZWNlaXZlclN0YXJ0KCkgeworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBzdWJyYW5nZQorCSAqIGluIHRoZSBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUKKwkgKiByZWxldmFudCByZWNlaXZlciBvZiB0aGUgbWVtYmVyIGJlaW5nIGNvbXBsZXRlZC4KKwkgKgorCSAqICogPHA+CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiA8dWw+CisJICogIDxsaT48Y29kZT5GSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+PC9saT4KKwkgKiAgPGxpPjxjb2RlPk1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIGNoYXJhY3RlciBpbmRleCBvZiByZWNlaXZlciBlbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFJlY2VpdmVyRW5kKCkgeworCQlyZXR1cm4gLTE7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHR5cGUgb3IgcGFja2FnZSBzaWduYXR1cmUgb2YgdGhlIHJlbGV2YW50CisJICogcmVjZWl2ZXIgaW4gdGhlIGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogPHA+CisJICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGNvbXBsZXRpb24gZW5naW5lIGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYW5kIHNldHMKKwkgKiBpdHMgcHJvcGVydGllczsgdGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXIgY2xpZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIG9yIHBhY2thZ2Ugc2lnbmF0dXJlLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWNlaXZlclNpZ25hdHVyZShjaGFyW10gc2lnbmF0dXJlKSB7CisJCS8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNoYXJhY3RlciBpbmRpY2VzIG9mIHRoZSBzdWJyYW5nZSBpbiB0aGUKKwkgKiBzb3VyY2UgZmlsZSBidWZmZXIgY29udGFpbmluZyB0aGUgcmVsZXZhbnQgcmVjZWl2ZXIKKwkgKiBvZiB0aGUgbWVtYmVyIGJlaW5nIGNvbXBsZXRlZC4KKwkgKgorCSAqIDxwPgorCSAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGVtcHR5IHN1YnJhbmdlIGF0IFswLDApLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4IGNoYXJhY3RlciBpbmRleCBvZiByZWNlaXZlciBzdGFydCBwb3NpdGlvbiAoaW5jbHVzaXZlKQorCSAqIEBwYXJhbSBlbmRJbmRleCBjaGFyYWN0ZXIgaW5kZXggb2YgcmVjZWl2ZXIgZW5kIHBvc2l0aW9uIChleGNsdXNpdmUpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIHZvaWQgc2V0UmVjZWl2ZXJSYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7CisJCS8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorCX0KKworCS8qKiAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgaXQgaXMgc2FmZSB0byB1c2UgdGhlICc8PicgKGRpYW1vbmQpIG9wZXJhdG9yIGluIHBsYWNlIG9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZworCSAqIHR5cGUgYXJndW1lbnRzIGZvciB0aGlzIHByb3Bvc2FsLgorCSAqIAorCSAqIDxwPgorCSAqIFRoaXMgaXMgb25seSByZWxldmFudCBmb3Igc291cmNlIGxldmVsIDEuNyBvciBncmVhdGVyLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gY29yZUNvbnRleHQgdGhlIGNvbXBsZXRpb24gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2FsCisJICogQHNpbmNlIDMuNy4xCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgZGlhbW9uZCBvcGVyYXRvciBmb3IgdGhlIGNvbnN0cnVjdG9yIGludm9jYXRpb24sIAorCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIEFsc28gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIHNvdXJjZSBsZXZlbHMgYmVsb3cgMS43CisJICovCisJcHVibGljIGJvb2xlYW4gY2FuVXNlRGlhbW9uZChDb21wbGV0aW9uQ29udGV4dCBjb3JlQ29udGV4dCkgeworCQlyZXR1cm4gZmFsc2U7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25SZXF1ZXN0b3IuamF2YQppbmRleCBmZTFmYjFjLi40ODdjOWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIFRoZSBjbGFzcyB3YXMgaW50cm9kdWNlZCBpbiAzLjAgYXMgYSBtb3JlIGV2b2x2YWJsZSByZXBsYWNlbWVudAogICogZm9yIHRoZSA8Y29kZT5JQ29tcGxldGlvblJlcXVlc3RvcjwvY29kZT4gaW50ZXJmYWNlLgogICogPC9wPgotICogCisgKgogICogQHNlZSBJQ29kZUFzc2lzdAogICogQHNpbmNlIDMuMAogICovCkBAIC01OSw5ICs1OSw5IEBACiAJICogMSA8PCBjb21wbGV0aW9uUHJvcG9zYWxLaW5kCiAJICovCiAJcHJpdmF0ZSBpbnQgaWdub3JlU2V0ID0gMDsKLQkKKwogCXByaXZhdGUgU3RyaW5nW10gZmF2b3JpdGVSZWZlcmVuY2VzOwotCQorCiAJLyoqCiAJICogVGhlIHNldCBvZiBDb21wbGV0aW9uUHJvcG9zYWwga2luZHMgdGhhdCB0aGlzIHJlcXVlc3RvcgogCSAqIGFsbG93cyBmb3IgcmVxdWlyZWQgcHJvcG9zYWxzOyA8Y29kZT4wPC9jb2RlPiBtZWFucyB0aGUgc2V0IGlzIGVtcHR5LgpAQCAtNjksMTggKzY5LDM5IEBACiAJICovCiAJcHJpdmF0ZSBpbnQgcmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0W10gPSBudWxsOwogCisJcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVFeHRlbmRlZENvbnRleHQgPSBmYWxzZTsKKwogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiByZXF1ZXN0b3IuCiAJICogVGhlIHJlcXVlc3RvciBpcyBpbnRlcmVzdGVkIGluIGFsbCBraW5kcyBvZiBjb21wbGV0aW9uCiAJICogcHJvcG9zYWxzOyBub25lIHdpbGwgYmUgaWdub3JlZC4KKwkgKgorCSAqIENhbGxzIHRvIHRoaXMgY29uc3RydWN0b3IgYXJlIGlkZW50aWNhbCB0byBjYWxscyB0byA8Y29kZT5Db21wbGV0aW9uUmVxdWVzdG9yKGZhbHNlKTwvY29kZT4KIAkgKi8KIAlwdWJsaWMgQ29tcGxldGlvblJlcXVlc3RvcigpIHsKLQkJLy8gZG8gbm90aGluZworCQl0aGlzKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gcmVxdWVzdG9yLgorCSAqIElmIDxjb2RlPmlnbm9yZUFsbDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIHJlcXVlc3RvciBpcyBub3QgaW50ZXJlc3RlZCBpbgorCSAqIGFsbCBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FsczsgYWxsIHdpbGwgYmUgaWdub3JlZC4gRm9yIGVhY2gga2luZCBvZiBjb21wbGV0aW9uIHByb3Bvc2FscworCSAqIHRoYXQgaXMgb2YgaW50ZXJlc3QsIDxjb2RlPnNldElnbm9yZWQoa2luZCwgZmFsc2UpPC9jb2RlPiBtdXN0IGJlIGNhbGxlZC4KKwkgKiBJZiA8Y29kZT5pZ25vcmVBbGw8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgcmVxdWVzdG9yIGlzIGludGVyZXN0ZWQgaW4KKwkgKiBhbGwga2luZHMgb2YgY29tcGxldGlvbiBwcm9wb3NhbHM7IG5vbmUgd2lsbCBiZSBpZ25vcmVkLgorCSAqCisJICogQHBhcmFtIGlnbm9yZUFsbCA8Y29kZT50cnVlPC9jb2RlPiB0byBpZ25vcmUgYWxsIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLAorCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gcHJvcG9zZSBhbGwga2luZHMKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgQ29tcGxldGlvblJlcXVlc3Rvcihib29sZWFuIGlnbm9yZUFsbCkgeworCQl0aGlzLmlnbm9yZVNldCA9IGlnbm9yZUFsbCA/IDB4ZmZmZmZmZmYgOiAweDAwMDAwMDAwOwogCX0KIAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4ga2luZCBvZiBjb21wbGV0aW9uIHByb3Bvc2FsIGlzIGlnbm9yZWQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gY29tcGxldGlvblByb3Bvc2FsS2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCiAJICogb24gPGNvZGU+Q29tcGxldGlvblByb3Bvc2FsPC9jb2RlPgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbApAQCAtOTYsMTAgKzExNywxMCBAQAogCQl9CiAJCXJldHVybiAwICE9ICh0aGlzLmlnbm9yZVNldCAmICgxIDw8IGNvbXBsZXRpb25Qcm9wb3NhbEtpbmQpKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBpcyBpZ25vcmVkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNvbXBsZXRpb25Qcm9wb3NhbEtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZAogCSAqIG9uIDxjb2RlPkNvbXBsZXRpb25Qcm9wb3NhbDwvY29kZT4KIAkgKiBAcGFyYW0gaWdub3JlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwKQEAgLTExOSwxNiArMTQwLDE2IEBACiAJCQl0aGlzLmlnbm9yZVNldCAmPSB+KDEgPDwgY29tcGxldGlvblByb3Bvc2FsS2luZCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCiAJICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wb3NhbEtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZAogCSAqIEBwYXJhbSByZXF1aXJlZFByb3Bvc2FsS2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCiAJICogb24gPGNvZGU+Q29tcGxldGlvblByb3Bvc2FsPC9jb2RlPgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCi0JICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZCBieSB0aGlzIHJlcXVlc3RvciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiAKKwkgKiBvZiB0aGUgZ2l2ZW4ga2luZCBpcyBhbGxvd2VkIGJ5IHRoaXMgcmVxdWVzdG9yLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CiAJICogaWYgaXQgaXNuJ3Qgb2YgaW50ZXJlc3QuCiAJICogPHA+CiAJICogQnkgZGVmYXVsdCwgYWxsIGtpbmRzIG9mIHJlcXVpcmVkIHByb3Bvc2FscyBhcmVuJ3QgYWxsb3dlZC4KQEAgLTEzNiw3ICsxNTcsNyBAQAogCSAqIEBzZWUgI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQogCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldEtpbmQoKQogCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldFJlcXVpcmVkUHJvcG9zYWxzKCkKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kKSB7CkBAIC0xNDQsMzQgKzE2NSwzNyBAQAogCQkJfHwgcHJvcG9zYWxLaW5kID4gQ29tcGxldGlvblByb3Bvc2FsLkxBU1RfS0lORCkgewogCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24ga2luZCBvZiBjb21wbGV0aW9uIHByb3Bvc2FsOiAiK3JlcXVpcmVkUHJvcG9zYWxLaW5kKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQkKKwogCQlpZiAocmVxdWlyZWRQcm9wb3NhbEtpbmQgPCBDb21wbGV0aW9uUHJvcG9zYWwuRklSU1RfS0lORAogCQkJfHwgcmVxdWlyZWRQcm9wb3NhbEtpbmQgPiBDb21wbGV0aW9uUHJvcG9zYWwuTEFTVF9LSU5EKSB7CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biByZXF1aXJlZCBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWw6ICIrcmVxdWlyZWRQcm9wb3NhbEtpbmQpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJaWYgKHRoaXMucmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCisKIAkJcmV0dXJuIDAgIT0gKHRoaXMucmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0W3Byb3Bvc2FsS2luZF0gJiAoMSA8PCByZXF1aXJlZFByb3Bvc2FsS2luZCkpOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgd2hldGhlciBhIHByb3Bvc2FsIG9mIGEgZ2l2ZW4ga2luZCB3aXRoIGEgcmVxdWlyZWQgcHJvcG9zYWwKIAkgKiBvZiB0aGUgZ2l2ZW4ga2luZCBpcyBhbGxvd2VkLgotCSAqIAorCSAqCisJICogQSByZXF1aXJlZCBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgaXMgcHJvcG9zZWQgZXZlbiBpZiB7QGxpbmsgI2lzSWdub3JlZChpbnQpfQorCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhhdCBraW5kLgorCSAqCiAJICogQ3VycmVudGx5IG9ubHkgYSBzdWJzZXQgb2Yga2luZHMgc3VwcG9ydCByZXF1aXJlZCBwcm9wb3NhbHMuIFRvIHNlZSB3aGF0IGNvbWJpbmF0aW9ucwogCSAqIGFyZSBzdXBwb3J0ZWQgeW91IG11c3QgbG9vayBhdCB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsI2dldFJlcXVpcmVkUHJvcG9zYWxzKCl9CiAJICogZG9jdW1lbnRhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wb3NhbEtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZAogCSAqIEBwYXJhbSByZXF1aXJlZFByb3Bvc2FsS2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCiAJICogb24gPGNvZGU+Q29tcGxldGlvblByb3Bvc2FsPC9jb2RlPgogCSAqIEBwYXJhbSBhbGxvdyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHByb3Bvc2FsIG9mIGEgZ2l2ZW4ga2luZCB3aXRoIGEgcmVxdWlyZWQgcHJvcG9zYWwKLQkgKiBvZiB0aGUgZ2l2ZW4ga2luZCBpcyBhbGxvd2VkIGJ5IHRoaXMgcmVxdWVzdG9yLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IAorCSAqIG9mIHRoZSBnaXZlbiBraW5kIGlzIGFsbG93ZWQgYnkgdGhpcyByZXF1ZXN0b3IsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KIAkgKiBpZiBpdCBpc24ndCBvZiBpbnRlcmVzdAogCSAqIEBzZWUgI2lzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCkKIAkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRLaW5kKCkKIAkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRSZXF1aXJlZFByb3Bvc2FscygpCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHZvaWQgc2V0QWxsb3dzUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kLCBib29sZWFuIGFsbG93KSB7CkBAIC0xODMsMTggKzIwNywxOCBAQAogCQkJfHwgcmVxdWlyZWRQcm9wb3NhbEtpbmQgPiBDb21wbGV0aW9uUHJvcG9zYWwuTEFTVF9LSU5EKSB7CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biByZXF1aXJlZCBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWw6ICIrcmVxdWlyZWRQcm9wb3NhbEtpbmQpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJaWYgKHRoaXMucmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0ID09IG51bGwpIHsKIAkJCXRoaXMucmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0ID0gbmV3IGludFtDb21wbGV0aW9uUHJvcG9zYWwuTEFTVF9LSU5EICsgMV07CiAJCX0KLQkJCisKIAkJaWYgKGFsbG93KSB7CiAJCQl0aGlzLnJlcXVpcmVkUHJvcG9zYWxBbGxvd1NldFtwcm9wb3NhbEtpbmRdIHw9ICgxIDw8IHJlcXVpcmVkUHJvcG9zYWxLaW5kKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMucmVxdWlyZWRQcm9wb3NhbEFsbG93U2V0W3Byb3Bvc2FsS2luZF0gJj0gfigxIDw8IHJlcXVpcmVkUHJvcG9zYWxLaW5kKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGZhdm9yaXRlIHJlZmVyZW5jZXMgd2hpY2ggYXJlIHVzZWQgdG8gY29tcHV0ZSBzb21lIGNvbXBsZXRpb24gcHJvcG9zYWxzLgogCSAqIDxwPgpAQCAtMjExLDI3ICsyMzUsMjcgQEAKIAkgKiBPdGhlciBraW5kIG9mIHJlZmVyZW5jZSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmdXR1cmUuCiAJICogPC9wPgogCSAqIEByZXR1cm4gZmF2b3JpdGUgaW1wb3J0cwotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyBTdHJpbmdbXSBnZXRGYXZvcml0ZVJlZmVyZW5jZXMoKSB7CiAJCXJldHVybiB0aGlzLmZhdm9yaXRlUmVmZXJlbmNlczsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXQgdGhlIGZhdm9yaXRlIHJlZmVyZW5jZXMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNvbXB1dGUgc29tZSBjb21wbGV0aW9uIHByb3Bvc2Fscy4KIAkgKiBBIGZhdm9yaXRlIHJlZmVyZW5jZSBpcyBhIHF1YWxpZmllZCByZWZlcmVuY2UgYXMgaXQgY2FuIGJlIHNlZW4gaW4gYW4gaW1wb3J0IHN0YXRlbWVudC48YnI+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gZmF2b3JpdGVJbXBvcnRzCi0JICogCisJICoKIAkgKiBAc2VlICNnZXRGYXZvcml0ZVJlZmVyZW5jZXMoKQotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyB2b2lkIHNldEZhdm9yaXRlUmVmZXJlbmNlcyhTdHJpbmdbXSBmYXZvcml0ZUltcG9ydHMpIHsKIAkJdGhpcy5mYXZvcml0ZVJlZmVyZW5jZXMgPSBmYXZvcml0ZUltcG9ydHM7CiAJfQotCQorCiAJLyoqCiAJICogUHJvIGZvcm1hIG5vdGlmaWNhdGlvbiBzZW50IGJlZm9yZSByZXBvcnRpbmcgYSBiYXRjaCBvZgogCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzLgpAQCAtMjYzLDcgKzI4Nyw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogCSAqIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHJlY2VpdmUgdGhpcyBraW5kIG9mIG5vdGljZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvYmxlbSB0aGUgcHJvYmxlbSBvYmplY3QKIAkgKi8KIAlwdWJsaWMgdm9pZCBjb21wbGV0aW9uRmFpbHVyZShJUHJvYmxlbSBwcm9ibGVtKSB7CkBAIC0yNzYsMTcgKzMwMCwxNyBAQAogCSAqIGNoZWNraW5nIHtAbGluayAjaXNJZ25vcmVkKGludCl9IGJlZm9yZSBhdm9pZCBjcmVhdGluZyBwcm9wb3NhbAogCSAqIG9iamVjdHMgdGhhdCB3b3VsZCBvbmx5IGJlIGlnbm9yZWQuCiAJICogPHA+Ci0JICogU2ltaWxhcmx5LCBpbXBsZW1lbnRlcnMgc2hvdWxkIGNoZWNrIAotCSAqIHtAbGluayAjaXNJZ25vcmVkKGludCkgaXNJZ25vcmVkKHByb3Bvc2FsLmdldEtpbmQoKSl9IAorCSAqIFNpbWlsYXJseSwgaW1wbGVtZW50ZXJzIHNob3VsZCBjaGVjaworCSAqIHtAbGluayAjaXNJZ25vcmVkKGludCkgaXNJZ25vcmVkKHByb3Bvc2FsLmdldEtpbmQoKSl9CiAJICogYW5kIGlnbm9yZSBwcm9wb3NhbHMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgYXMgdW5pbnRlcmVzdGluZy4KIAkgKiBUaGUgcHJvcG9zYWwgb2JqZWN0IHBhc3NlZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgZHVyYXRpb24gb2YKIAkgKiBjb21wbGV0aW9uIG9wZXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wb3NhbCB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm9wb3NhbCBpcyBudWxsCiAJICovCiAJcHVibGljIGFic3RyYWN0IHZvaWQgYWNjZXB0KENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCk7Ci0JCisKIAkvKioKIAkgKiBQcm9wb3NlIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjb21wbGV0aW9uIG9jY3Vycy4KIAkgKiA8cD4KQEAgLTI5NiwxMCArMzIwLDM5IEBACiAJICogQ2xpZW50cyBtYXkgb3ZlcnJpZGUuCiAJICogPC9wPgogCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb21wbGV0aW9uIGNvbnRleHQKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgdm9pZCBhY2NlcHRDb250ZXh0KENvbXBsZXRpb25Db250ZXh0IGNvbnRleHQpIHsKIAkJLy8gZG8gbm90aGluZwogCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJlcXVlc3RvciByZXF1aXJlcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqCisJICogQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJlcXVlc3RvciByZXF1aXJlcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqCisJICogQHNlZSBDb21wbGV0aW9uQ29udGV4dCNpc0V4dGVuZGVkKCkKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZGVkQ29udGV4dFJlcXVpcmVkKCkgeworCQlyZXR1cm4gdGhpcy5yZXF1aXJlRXh0ZW5kZWRDb250ZXh0OworCX0KKworCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgcmVxdWVzdG9yIHJlcXVpcmVzIGFuIGV4dGVuZGVkIGNvbnRleHQuCisJICoKKwkgKiBAcGFyYW0gcmVxdWlyZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJlcXVlc3RvciByZXF1aXJlcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqCisJICogQHNlZSBDb21wbGV0aW9uQ29udGV4dCNpc0V4dGVuZGVkKCkKKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlRXh0ZW5kZWRDb250ZXh0KGJvb2xlYW4gcmVxdWlyZSkgeworCQl0aGlzLnJlcXVpcmVFeHRlbmRlZENvbnRleHQgPSByZXF1aXJlOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvcnJlY3Rpb25FbmdpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvcnJlY3Rpb25FbmdpbmUuamF2YQppbmRleCAyYjFmNzFmLi4wOTAyZjFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db3JyZWN0aW9uRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29ycmVjdGlvbkVuZ2luZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDcgKzE2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwpAQCAtMjQsMTMgKzIzLDE0IEBACiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNvdXJjZSBjb3JyZWN0aW9ucy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBAc2luY2UgMi4wIAorICoKKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisgKgorICogQHNpbmNlIDIuMAorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25FbmdpbmUgaW1wbGVtZW50cyBQcm9ibGVtUmVhc29ucyB7Ci0JCitwdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkVuZ2luZSB7CisKIAkvKioKIAkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KIAkgKi8KQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KIAkgKi8KIAlwcm90ZWN0ZWQgaW50IGZpbHRlcjsKLQkJCisKIAkvKioKIAkgKiBUaGUgQ29ycmVjdGlvbkVuZ2luZSBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHByb2JsZW0gY29ycmVjdGlvbnMuCiAJICoKQEAgLTkwLDEzICs5MCwxMyBAQAogCXB1YmxpYyBDb3JyZWN0aW9uRW5naW5lKE1hcCBzZXR0aW5nKSB7CiAJCS8vIHNldHRpbmdzIGlnbm9yZWQgZm9yIG5vdwogCX0KLQkKKwogCS8qKgogCSAqIFBlcmZvcm1zIGNvZGUgY29ycmVjdGlvbiBmb3IgdGhlIGdpdmVuIG1hcmtlciwKIAkgKiByZXBvcnRpbmcgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gY29ycmVjdGlvbiByZXF1ZXN0b3IuCi0JICogCisJICoKIAkgKiBDb3JyZWN0aW9uIHJlc3VsdHMgYXJlIGFuc3dlcmVkIHRocm91Z2ggYSByZXF1ZXN0b3IuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWFya2VyCiAJICogCQl0aGUgbWFya2VyIHdoaWNoIGRlc2NyaWJlIHRoZSBwcm9ibGVtIHRvIGNvcnJlY3QuCiAJICogQHBhcmFtIHRhcmdldFVuaXQKQEAgLTEwNywzMiArMTA3LDMyIEBACiAJICogCQl0aGUgZ2l2ZW4gY29ycmVjdGlvbiByZXF1ZXN0b3IKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5yZXF1ZXN0b3I8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gY3VycmVudGx5IHRoaXMgZXhjZXB0aW9uIGlzIG5ldmVyIHRocm93biwgYnV0IHRoZSBvcHBvcnR1bml0eSB0byB0aHJvd24gYW4gZXhjZXB0aW9uCi0JICogCXdoZW4gdGhlIGNvcnJlY3Rpb24gZmFpbGVkIGlzIGtlcHQgZm9yIGxhdGVyLiAKLQkgKiBAc2luY2UgMi4wIAorCSAqIAl3aGVuIHRoZSBjb3JyZWN0aW9uIGZhaWxlZCBpcyBrZXB0IGZvciBsYXRlci4KKwkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHZvaWQgY29tcHV0ZUNvcnJlY3Rpb25zKElNYXJrZXIgbWFya2VyLCBJQ29tcGlsYXRpb25Vbml0IHRhcmdldFVuaXQsIGludCBwb3NpdGlvbk9mZnNldCwgSUNvcnJlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSB0YXJnZXRVbml0ID09IG51bGwgPyBKYXZhQ29yZS5jcmVhdGUobWFya2VyLmdldFJlc291cmNlKCkpIDogdGFyZ2V0VW5pdDsKLQkJCisKIAkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpCiAJCQlyZXR1cm47Ci0JCQkKKwogCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLQkJCisKIAkJaW50IGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCAtMSk7CiAJCVN0cmluZ1tdIGFyZ3MgPSBVdGlsLmdldFByb2JsZW1Bcmd1bWVudHNGcm9tTWFya2VyKG1hcmtlci5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5BUkdVTUVOVFMsICIiKSk7IC8vJE5PTi1OTFMtMSQKIAkJaW50IHN0YXJ0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKTsKIAkJaW50IGVuZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgLTEpOwotCQkKKwogCQljb21wdXRlQ29ycmVjdGlvbnModW5pdCwgaWQsIHN0YXJ0ICsgcG9zaXRpb25PZmZzZXQsIGVuZCArIHBvc2l0aW9uT2Zmc2V0LCBhcmdzLCByZXF1ZXN0b3IpOwogCX0KLQkKKwogCS8qKgogCSAqIFBlcmZvcm1zIGNvZGUgY29ycmVjdGlvbiBmb3IgdGhlIGdpdmVuIElQcm9ibGVtLAogCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb3JyZWN0aW9uIHJlcXVlc3Rvci4KLQkgKiAKKwkgKgogCSAqIENvcnJlY3Rpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3Rvci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9ibGVtCiAJICogCQl0aGUgcHJvYmxlbSB3aGljaCBkZXNjcmliZSB0aGUgcHJvYmxlbSB0byBjb3JyZWN0LgogCSAqIEBwYXJhbSB0YXJnZXRVbml0CkBAIC0xNDIsMTYgKzE0MiwxNiBAQAogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnRhcmdldFVuaXQ8L2NvZGU+IG9yIDxjb2RlPnJlcXVlc3RvcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBjdXJyZW50bHkgdGhpcyBleGNlcHRpb24gaXMgbmV2ZXIgdGhyb3duLCBidXQgdGhlIG9wcG9ydHVuaXR5IHRvIHRocm93biBhbiBleGNlcHRpb24KIAkgKiAJd2hlbiB0aGUgY29ycmVjdGlvbiBmYWlsZWQgaXMga2VwdCBmb3IgbGF0ZXIuCi0JICogQHNpbmNlIDIuMCAKKwkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHZvaWQgY29tcHV0ZUNvcnJlY3Rpb25zKElQcm9ibGVtIHByb2JsZW0sIElDb21waWxhdGlvblVuaXQgdGFyZ2V0VW5pdCwgSUNvcnJlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmNvcnJlY3Rpb25fbnVsbFVuaXQpOwogCQl9CiAJCXRoaXMuY29tcHV0ZUNvcnJlY3Rpb25zKAotCQkJdGFyZ2V0VW5pdCwgcHJvYmxlbS5nZXRJRCgpLCAKLQkJCXByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSwgCi0JCQlwcm9ibGVtLmdldFNvdXJjZUVuZCgpLCAKKwkJCXRhcmdldFVuaXQsIHByb2JsZW0uZ2V0SUQoKSwKKwkJCXByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSwKKwkJCXByb2JsZW0uZ2V0U291cmNlRW5kKCksCiAJCQlwcm9ibGVtLmdldEFyZ3VtZW50cygpLAogCQkJcmVxdWVzdG9yKTsKIAl9CkBAIC0xNjMsMTkgKzE2MywxOSBAQAogCSAqCiAJICogIEBwYXJhbSB1bml0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLklDb21waWxhdGlvblVuaXQKIAkgKiAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqICAKKwkgKgogCSAqIAlAcGFyYW0gaWQgaW50CiAJICogCQl0aGUgaWQgb2YgdGhlIHByb2JsZW0uCi0JICogCisJICoKIAkgKiAJQHBhcmFtIHN0YXJ0IGludAogCSAqIAkJYSBwb3NpdGlvbiBpbiB0aGUgc291cmNlIHdoZXJlIHRoZSBlcnJvciBiZWdpbi4KIAkgKgogCSAqICBAcGFyYW0gZW5kIGludAotCSAqICAgICAgYSBwb3NpdGlvbiBpbiB0aGUgc291cmNlIHdoZXJlIHRoZSBlcnJvciBmaW5pc2guIAotCSAqIAorCSAqICAgICAgYSBwb3NpdGlvbiBpbiB0aGUgc291cmNlIHdoZXJlIHRoZSBlcnJvciBmaW5pc2guCisJICoKIAkgKiAJQHBhcmFtIGFyZ3VtZW50cyBTdHJpbmdbXQogCSAqIAkJYXJndW1lbnRzIG9mIHRoZSBwcm9ibGVtLgotCSAqIAorCSAqCiAJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cmVxdWVzdG9yPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGN1cnJlbnRseSB0aGlzIGV4Y2VwdGlvbiBpcyBuZXZlciB0aHJvd24sIGJ1dCB0aGUgb3Bwb3J0dW5pdHkgdG8gdGhyb3duIGFuIGV4Y2VwdGlvbgogCSAqIAl3aGVuIHRoZSBjb3JyZWN0aW9uIGZhaWxlZCBpcyBrZXB0IGZvciBsYXRlci4KQEAgLTE4NCwxNiArMTg0LDE2IEBACiAJcHJpdmF0ZSB2b2lkIGNvbXB1dGVDb3JyZWN0aW9ucyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCBpZCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmdbXSBhcmd1bWVudHMsIElDb3JyZWN0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgewogCiAJCWlmKGlkID09IC0xIHx8IGFyZ3VtZW50cyA9PSBudWxsIHx8IHN0YXJ0ID09IC0xIHx8IGVuZCA9PSAtMSkKLQkJCXJldHVybjsJCQorCQkJcmV0dXJuOwogCQlpZiAocmVxdWVzdG9yID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuY29ycmVjdGlvbl9udWxsUmVxdWVzdG9yKTsKIAkJfQotCQkKKwogCQl0aGlzLmNvcnJlY3Rpb25SZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CiAJCXRoaXMuY29ycmVjdGlvblN0YXJ0ID0gc3RhcnQ7CiAJCXRoaXMuY29ycmVjdGlvbkVuZCA9IGVuZDsKIAkJdGhpcy5jb21waWxhdGlvblVuaXQgPSB1bml0OwotCQkKKwogCQlTdHJpbmcgYXJndW1lbnQgPSBudWxsOwogCQl0cnkgewogCQkJc3dpdGNoIChpZCkgewpAQCAtMjA2LDE5ICsyMDYsMjAgQEAKIAkJCQkJdGhpcy5maWx0ZXIgPSBDTEFTU0VTIHwgSU5URVJGQUNFUzsKIAkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMF07CiAJCQkJCWJyZWFrOwotCQkJCQkKKwogCQkJCS8vIE1ldGhvZCBjb3JyZWN0aW9uCiAJCQkJY2FzZSBJUHJvYmxlbS5VbmRlZmluZWRNZXRob2QgOgogCQkJCQl0aGlzLmZpbHRlciA9IE1FVEhPRDsKIAkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMV07CiAJCQkJCWJyZWFrOwotCQkJCQkKKwogCQkJCS8vIEZpZWxkIGFuZCBsb2NhbCB2YXJpYWJsZSBjb3JyZWN0aW9uCiAJCQkJY2FzZSBJUHJvYmxlbS5VbmRlZmluZWRGaWVsZCA6CiAJCQkJCXRoaXMuZmlsdGVyID0gRklFTEQ7CiAJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzBdOwogCQkJCQlicmVhazsKIAkJCQljYXNlIElQcm9ibGVtLlVuZGVmaW5lZE5hbWUgOgorCQkJCWNhc2UgSVByb2JsZW0uVW5yZXNvbHZlZFZhcmlhYmxlIDoKIAkJCQkJdGhpcy5maWx0ZXIgPSBGSUVMRCB8IExPQ0FMOwogCQkJCQlhcmd1bWVudCA9IGFyZ3VtZW50c1swXTsKIAkJCQkJYnJlYWs7CkBAIC0yMzQsMzggKzIzNSw1MSBAQAogCXByaXZhdGUgdm9pZCBjb3JyZWN0KGNoYXJbXSBhcmd1bWVudCkgewogCQl0cnkgewogCQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuY29tcGlsYXRpb25Vbml0LmdldFNvdXJjZSgpOwotCQkJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTsKLQkJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKKwkJCU1hcCBjdXJyZW50UHJvamVjdE9wdGlvbnMgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSk7CisJCQlsb25nIHNvdXJjZUxldmVsID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGN1cnJlbnRQcm9qZWN0T3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKSk7CisJCQlsb25nIGNvbXBsaWFuY2VMZXZlbCA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjdXJyZW50UHJvamVjdE9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpKTsKIAkJCQorCQkJU2Nhbm5lciBzY2FubmVyID0KKwkJCQluZXcgU2Nhbm5lcigKKwkJCQkJZmFsc2UgLypjb21tZW50Ki8sCisJCQkJCWZhbHNlIC8qd2hpdGVzcGFjZSovLAorCQkJCQlmYWxzZSAvKm5scyovLAorCQkJCQlzb3VyY2VMZXZlbCwKKwkJCQkJY29tcGxpYW5jZUxldmVsLAorCQkJCQludWxsLyp0YXNrVGFnKi8sCisJCQkJCW51bGwvKnRhc2tQcmlvcml0aWVzKi8sCisJCQkJCXRydWUgLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKKwkJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKKwogCQkJc2Nhbm5lci5yZXNldFRvKHRoaXMuY29ycmVjdGlvblN0YXJ0LCB0aGlzLmNvcnJlY3Rpb25FbmQpOwogCQkJaW50IHRva2VuID0gMDsKIAkJCWNoYXJbXSBhcmd1bWVudFNvdXJjZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQkJCQorCiAJCQkvLyBzZWFyY2ggbGFzdCBzZWdtZW50IHBvc2l0aW9uCiAJCQl3aGlsZSh0cnVlKSB7CiAJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHJldHVybjsKLQkJCQkKKwogCQkJCWNoYXJbXSB0b2tlblNvdXJjZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7Ci0JCQkJCisKIAkJCQlhcmd1bWVudFNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGFyZ3VtZW50U291cmNlLCB0b2tlblNvdXJjZSk7CiAJCQkJaWYoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGFyZ3VtZW50U291cmNlLCBhcmd1bWVudCkpCiAJCQkJCXJldHVybjsKLQkJCQkKKwogCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGFyZ3VtZW50LCBhcmd1bWVudFNvdXJjZSkpIHsKIAkJCQkJdGhpcy5jb3JyZWN0aW9uU3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CiAJCQkJCXRoaXMuY29ycmVjdGlvbkVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQl0aGlzLnByZWZpeExlbmd0aCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBhcmd1bWVudCkgKyAxOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJCisKIAkJCX0KLQkJCisKIAkJCS8vIHNlYXJjaCBjb21wbGV0aW9uIHBvc2l0aW9uCiAJCQlpbnQgY29tcGxldGlvblBvc2l0aW9uID0gdGhpcy5jb3JyZWN0aW9uU3RhcnQ7CiAJCQlzY2FubmVyLnJlc2V0VG8oY29tcGxldGlvblBvc2l0aW9uLCB0aGlzLmNvcnJlY3Rpb25FbmQpOwogCQkJaW50IHBvc2l0aW9uID0gY29tcGxldGlvblBvc2l0aW9uOwotCQkJCisKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQkJaWYoc2Nhbm5lci5nZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkpIHsKIAkJCQkJY29tcGxldGlvblBvc2l0aW9uID0gcG9zaXRpb247CkBAIC0yNzksNyArMjkzLDcgQEAKIAkJCQlIYXNodGFibGUgb3B0aW9ucyA9IG5ldyBIYXNodGFibGUob2xkT3B0aW9ucyk7CiAJCQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9DQU1FTF9DQVNFX01BVENILCBKYXZhQ29yZS5ESVNBQkxFRCk7CiAJCQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJCQkKKwogCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmNvZGVDb21wbGV0ZSgKIAkJCQkJY29tcGxldGlvblBvc2l0aW9uLAogCQkJCQl0aGlzLmNvbXBsZXRpb25SZXF1ZXN0b3IKQEAgLTMyMyw3ICszMzcsNyBAQAogCQkJCQkJCQlwcm9wb3NhbC5nZXRGbGFncygpLAogCQkJCQkJCQlDb3JyZWN0aW9uRW5naW5lLnRoaXMuY29ycmVjdGlvblN0YXJ0LAogCQkJCQkJCQlDb3JyZWN0aW9uRW5naW5lLnRoaXMuY29ycmVjdGlvbkVuZCk7Ci0JCQkJCQl9CQkJCQkKKwkJCQkJCX0KIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbC5GSUVMRF9SRUY6CkBAIC0zOTYsMTggKzQxMCwxOCBAQAogCQl9CiAJfTsKIAotCQorCiAJLyoqCiAJICogUmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggY29udGFpbnMgb25lIGVudHJ5IHBlciB3YXJuaW5nIHRva2VuCiAJICogYWNjZXB0ZWQgYnkgdGhlIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBhbm5vdGF0aW9uLiBUaGlzIGFycmF5IGlzCiAJICogbmVpdGhlciBudWxsIG5vciBlbXB0eSwgaXQgY29udGFpbnMgYXQgbGVhc3QgdGhlIFN0cmluZyA8Y29kZT5hbGw8L2NvZGU+LgogCSAqIEl0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGNhbGxlciAocGxlYXNlIHRha2UgYSBjb3B5IGlmIG1vZGlmaWNhdGlvbnMKIAkgKiBhcmUgbmVlZGVkKS48YnI+Ci0JICogPGI+Tm90ZTo8L2I+IFRoZSB0b2tlbnMgcmV0dXJuZWQgYXJlIG5vdCBuZWNlc3NhcmlseSBzdGFuZGFyZGl6ZWQgYWNyb3NzIEphdmEgCi0JICogY29tcGlsZXJzLiBJZiB5b3Ugd2VyZSB0byB1c2Ugb25lIG9mIHRoZXNlIHRva2VucyBpbiBhIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiAKLQkgKiBhbm5vdGF0aW9uIGluIHRoZSBKYXZhIHNvdXJjZSBjb2RlLCB0aGUgZWZmZWN0cyAoaWYgYW55KSBtYXkgdmFyeSBmcm9tIAorCSAqIDxiPk5vdGU6PC9iPiBUaGUgdG9rZW5zIHJldHVybmVkIGFyZSBub3QgbmVjZXNzYXJpbHkgc3RhbmRhcmRpemVkIGFjcm9zcyBKYXZhCisJICogY29tcGlsZXJzLiBJZiB5b3Ugd2VyZSB0byB1c2Ugb25lIG9mIHRoZXNlIHRva2VucyBpbiBhIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPgorCSAqIGFubm90YXRpb24gaW4gdGhlIEphdmEgc291cmNlIGNvZGUsIHRoZSBlZmZlY3RzIChpZiBhbnkpIG1heSB2YXJ5IGZyb20KIAkgKiBjb21waWxlciB0byBjb21waWxlci4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBjb250YWlucyBvbmUgZW50cnkgcGVyIHdhcm5pbmcgdG9rZW4KIAkgKiAJCQlhY2NlcHRlZCBieSB0aGUgPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGFubm90YXRpb24uCiAJICogQHNpbmNlIDMuMgpAQCAtNDE1LDEyICs0MjksMTIgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbFdhcm5pbmdUb2tlbnMoKSB7CiAJCXJldHVybiBDb21waWxlck9wdGlvbnMud2FybmluZ1Rva2VuczsKIAl9Ci0JCisKIAkvKioKIAkgKiBIZWxwZXIgbWV0aG9kIGZvciBkZWNvZGluZyBwcm9ibGVtIG1hcmtlciBhdHRyaWJ1dGVzLiBSZXR1cm5zIGFuIGFycmF5IG9mIFN0cmluZyBhcmd1bWVudHMKLQkgKiBleHRyYWN0ZWQgZnJvbSB0aGUgcHJvYmxlbSBtYXJrZXIgImFyZ3VtZW50cyIgYXR0cmlidXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWFya2VyIAorCSAqIGV4dHJhY3RlZCBmcm9tIHRoZSBwcm9ibGVtIG1hcmtlciAiYXJndW1lbnRzIiBhdHRyaWJ1dGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXJrZXIKIAkgKiAiYXJndW1lbnRzIiBhdHRyaWJ1dGUgaXMgbWlzc2luZyBvciBpbGwtZm9ybWVkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb2JsZW1NYXJrZXIKIAkgKiAJCXRoZSBwcm9ibGVtIG1hcmtlciB0byBkZWNvZGUgYXJndW1lbnRzIGZyb20uCiAJICogQHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmcgYXJndW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gZXh0cmFjdCBhcmd1bWVudHMKQEAgLTQyOSwzNyArNDQzLDM3IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9ibGVtQXJndW1lbnRzKElNYXJrZXIgcHJvYmxlbU1hcmtlcil7CiAJCVN0cmluZyBhcmd1bWVudHNTdHJpbmcgPSBwcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkFSR1VNRU5UUywgbnVsbCk7CiAJCXJldHVybiBVdGlsLmdldFByb2JsZW1Bcmd1bWVudHNGcm9tTWFya2VyKGFyZ3VtZW50c1N0cmluZyk7Ci0JfQkKLQkKKwl9CisKIAkvKioKLQkgKiBSZXR1cm5zIGEgdG9rZW4gd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgYSBnaXZlbiB3YXJuaW5nIHVzaW5nIAotCSAqIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBhbm5vdGF0aW9uLCBmb3IgYSBnaXZlbiBwcm9ibGVtIElEIAotCSAqICh7QGxpbmsgSVByb2JsZW0gfSkuIElmIGEgcGFydGljdWxhciBwcm9ibGVtIGlzIG5vdCBzdXBwcmVzc2FibGUsIAotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQuIAorCSAqIFJldHVybnMgYSB0b2tlbiB3aGljaCBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBhIGdpdmVuIHdhcm5pbmcgdXNpbmcKKwkgKiA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gYW5ub3RhdGlvbiwgZm9yIGEgZ2l2ZW4gcHJvYmxlbSBJRAorCSAqICh7QGxpbmsgSVByb2JsZW0gfSkuIElmIGEgcGFydGljdWxhciBwcm9ibGVtIGlzIG5vdCBzdXBwcmVzc2FibGUsCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSByZXR1cm5lZC4KIAkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGNhbiBvbmx5IHN1cHByZXNzIHdhcm5pbmdzLCAKLQkgKiB3aGljaCBtZWFucyB0aGF0IGlmIHNvbWUgcHJvYmxlbXMgZ290IHByb21vdGVkIHRvIEVSUk9SIHVzaW5nIGN1c3RvbSBjb21waWxlciAKLQkgKiBzZXR0aW5ncyAoe0BsaW5rIElKYXZhUHJvamVjdCNzZXRPcHRpb24oU3RyaW5nLCBTdHJpbmcpfSksIHRoZSAKKwkgKiA8Yj5Ob3RlOjwvYj4gPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGNhbiBvbmx5IHN1cHByZXNzIHdhcm5pbmdzLAorCSAqIHdoaWNoIG1lYW5zIHRoYXQgaWYgc29tZSBwcm9ibGVtcyBnb3QgcHJvbW90ZWQgdG8gRVJST1IgdXNpbmcgY3VzdG9tIGNvbXBpbGVyCisJICogc2V0dGluZ3MgKHtAbGluayBJSmF2YVByb2plY3Qjc2V0T3B0aW9uKFN0cmluZywgU3RyaW5nKX0pLCB0aGUKIAkgKiA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gYW5ub3RhdGlvbiB3aWxsIGJlIGluZWZmZWN0aXZlLgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGNhbiBiZSBhcmd1bWVudGVkIHdpdGggCisJICogPGI+Tm90ZTo8L2I+IDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBjYW4gYmUgYXJndW1lbnRlZCB3aXRoCiAJICogPGNvZGU+ImFsbCI8L2NvZGU+IHNvIGFzIHRvIHN1cHByZXNzIGFsbCBwb3NzaWJsZSB3YXJuaW5ncyBhdCBvbmNlLgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhlIHRva2VucyByZXR1cm5lZCBhcmUgbm90IG5lY2Vzc2FyaWx5IHN0YW5kYXJkaXplZCBhY3Jvc3MgSmF2YSAKLQkgKiBjb21waWxlcnMuIElmIHlvdSB3ZXJlIHRvIHVzZSBvbmUgb2YgdGhlc2UgdG9rZW5zIGluIGFuIEBTdXBwcmVzc1dhcm5pbmdzIAotCSAqIGFubm90YXRpb24gaW4gdGhlIEphdmEgc291cmNlIGNvZGUsIHRoZSBlZmZlY3RzIChpZiBhbnkpIG1heSB2YXJ5IGZyb20gCisJICogPGI+Tm90ZTo8L2I+IFRoZSB0b2tlbnMgcmV0dXJuZWQgYXJlIG5vdCBuZWNlc3NhcmlseSBzdGFuZGFyZGl6ZWQgYWNyb3NzIEphdmEKKwkgKiBjb21waWxlcnMuIElmIHlvdSB3ZXJlIHRvIHVzZSBvbmUgb2YgdGhlc2UgdG9rZW5zIGluIGFuIEBTdXBwcmVzc1dhcm5pbmdzCisJICogYW5ub3RhdGlvbiBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZSwgdGhlIGVmZmVjdHMgKGlmIGFueSkgbWF5IHZhcnkgZnJvbQogCSAqIGNvbXBpbGVyIHRvIGNvbXBpbGVyLgogCSAqIDwvcD4KIAkgKiBAcGFyYW0gcHJvYmxlbUlECiAJICogICAgICAgICB0aGUgSUQgb2YgYSBnaXZlbiB3YXJuaW5nIHRvIHN1cHByZXNzCi0JICogQHJldHVybiBhIFN0cmluZyB3aGljaCBjYW4gYmUgdXNlZCBpbiA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gYW5ub3RhdGlvbiwgCisJICogQHJldHVybiBhIFN0cmluZyB3aGljaCBjYW4gYmUgdXNlZCBpbiA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gYW5ub3RhdGlvbiwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXYXJuaW5nVG9rZW4oaW50IHByb2JsZW1JRCl7Ci0JCWxvbmcgaXJyaXRhbnQgPSBQcm9ibGVtUmVwb3J0ZXIuZ2V0SXJyaXRhbnQocHJvYmxlbUlEKTsKKwkJaW50IGlycml0YW50ID0gUHJvYmxlbVJlcG9ydGVyLmdldElycml0YW50KHByb2JsZW1JRCk7CiAJCWlmIChpcnJpdGFudCAhPSAwKSB7CiAJCQlyZXR1cm4gQ29tcGlsZXJPcHRpb25zLndhcm5pbmdUb2tlbkZyb21JcnJpdGFudChpcnJpdGFudCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0VsZW1lbnRDaGFuZ2VkRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0VsZW1lbnRDaGFuZ2VkRXZlbnQuamF2YQppbmRleCAyYTNlZDA4Li43YTVjMjM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9FbGVtZW50Q2hhbmdlZEV2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRWxlbWVudENoYW5nZWRFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDExICsyMywxMyBAQAogICoKICAqIEBzZWUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIKICAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCisKIAkvKioKLQkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdCAKKwkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdAogCSAqIHJlcG9ydCBvZiBjcmVhdGlvbnMsIGRlbGV0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMKIAkgKiB0byBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnQocykgZXhwcmVzc2VkIGFzIGEgaGllcmFyY2hpY2FsCiAJICogamF2YSBlbGVtZW50IGRlbHRhIGFzIHJldHVybmVkIGJ5IDxjb2RlPmdldERlbHRhKCk8L2NvZGU+LgpAQCAtNDQsMTkgKzQ2LDE5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9DSEFOR0UgPSAxOwogCiAJLyoqCi0JICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCisJICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QKIAkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCiAJICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAogCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCiAJICoKIAkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIFBSRV9BVVRPX0JVSUxECiAJICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4gVGhlIGRlbHRhLCB3aGljaCBpcyBub3RpZmllZCBoZXJlLCBvbmx5IGNvbnRhaW5zCi0JICogaW5mb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIEphdmFNb2RlbCBvcGVyYXRpb25zIChpbiBvdGhlciB3b3JkcywgCi0JICogaXQgaWdub3JlcyB0aGUgcG9zc2libGUgcmVzb3VyY2VzIHdoaWNoIGhhdmUgY2hhbmdlZCBvdXRzaWRlIEphdmEgb3BlcmF0aW9ucykuIAorCSAqIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBKYXZhTW9kZWwgb3BlcmF0aW9ucyAoaW4gb3RoZXIgd29yZHMsCisJICogaXQgaWdub3JlcyB0aGUgcG9zc2libGUgcmVzb3VyY2VzIHdoaWNoIGhhdmUgY2hhbmdlZCBvdXRzaWRlIEphdmEgb3BlcmF0aW9ucykuCiAJICogSW4gcGFydGljdWxhciwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgSmF2YU1vZGVsIGJlIGluY29uc2lzdGVudCB3aXRoIHJlc3BlY3QgdG8KIAkgKiByZXNvdXJjZXMsIHdoaWNoIGdvdCBtb2RpZmllZCBvdXRzaWRlIEphdmFNb2RlbCBvcGVyYXRpb25zIChpdCB3aWxsIG9ubHkgYmUKIAkgKiBmdWxseSBjb25zaXN0ZW50IG9uY2UgdGhlIFBPU1RfQ0hBTkdFIG5vdGlmaWNhdGlvbiBoYXMgb2NjdXJyZWQpLgotCSAqIAorCSAqCiAJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQKIAkgKiBAc2VlICNnZXREZWx0YSgpCkBAIC02Niw3ICs2OCw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0FVVE9fQlVJTEQgPSAyOwogCiAJLyoqCi0JICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCisJICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QKIAkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCiAJICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAogCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCkBAIC03OSwxOSArODEsMTkgQEAKIAkgKiBAc2VlICNnZXREZWx0YSgpCiAJICogQHNpbmNlIDIuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlQT1NUX1JFQ09OQ0lMRSA9IDQ7CQotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAlQT1NUX1JFQ09OQ0lMRSA9IDQ7CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODk0NzI0MDQzMTYxMjg0NDQyMEw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogCS8qCi0JICogRXZlbnQgdHlwZSBpbmRpY2F0aW5nIHRoZSBuYXR1cmUgb2YgdGhpcyBldmVudC4gCisJICogRXZlbnQgdHlwZSBpbmRpY2F0aW5nIHRoZSBuYXR1cmUgb2YgdGhpcyBldmVudC4KIAkgKiBJdCBjYW4gYmUgYSBjb21iaW5hdGlvbiBlaXRoZXI6CiAJICogIC0gUE9TVF9DSEFOR0UKIAkgKiAgLSBQUkVfQVVUT19CVUlMRAogCSAqICAtIFBPU1RfUkVDT05DSUxFCiAJICovCi0JcHJpdmF0ZSBpbnQgdHlwZTsgCi0JCisJcHJpdmF0ZSBpbnQgdHlwZTsKKwogCS8qKgogCSAqIENyZWF0ZXMgYW4gbmV3IGVsZW1lbnQgY2hhbmdlZCBldmVudCAoYmFzZWQgb24gYSA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4pLgogCSAqCkBAIC0xMTAsNyArMTEyLDcgQEAKIAlwdWJsaWMgSUphdmFFbGVtZW50RGVsdGEgZ2V0RGVsdGEoKSB7CiAJCXJldHVybiAoSUphdmFFbGVtZW50RGVsdGEpIHRoaXMuc291cmNlOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgZXZlbnQgYmVpbmcgcmVwb3J0ZWQuCiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9GbGFncy5qYXZhCmluZGV4IDY4N2FmOWUuLjE2YTdlODYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRmxhZ3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04LDcgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIGNvbnN0YW50IEFjY0RlZmF1bHQKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBjb25zdGFudHMgQWNjQnJpZGdlIGFuZCBBY2NWYXJhcmdzIGZvciBKMlNFIDEuNSAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBjb25zdGFudHMgQWNjQnJpZGdlIGFuZCBBY2NWYXJhcmdzIGZvciBKMlNFIDEuNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCkBAIC0xNyw4ICsxNyw3IEBACiAvKioKICAqIFV0aWxpdHkgY2xhc3MgZm9yIGRlY29kaW5nIG1vZGlmaWVyIGZsYWdzIGluIEphdmEgZWxlbWVudHMuCiAgKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBvbmx5LgogICogPC9wPgogICogPHA+CiAgKiBOb3RlIHRoYXQgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZXNlIGZsYWdzIG1hdGNoIHRoZSBvbmVzIGZvciBjbGFzcyBmaWxlcwpAQCAtMjgsNiArMjcsNyBAQAogICogPC9wPgogICoKICAqIEBzZWUgSU1lbWJlciNnZXRGbGFncygpCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZsYWdzIHsKIApAQCAtMTExLDcgKzExMSw3IEBACiAJICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY0RlcHJlY2F0ZWQgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZDsKLQkKKwogCS8qKgogCSAqIEJyaWRnZSBtZXRob2QgcHJvcGVydHkgZmxhZyAoYWRkZWQgaW4gSjJTRSAxLjUpLiBVc2VkIHRvIGZsYWcgYSBjb21waWxlci1nZW5lcmF0ZWQKIAkgKiBicmlkZ2UgbWV0aG9kcy4KQEAgLTE1OCw3ICsxNTgsNyBAQAogCQlyZXR1cm4gKGZsYWdzICYgQWNjQWJzdHJhY3QpICE9IDA7CiAJfQogCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBpbmNsdWRlcyB0aGUgaW5kaWNhdGlvbiB0aGF0IHRoZSAKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIGluZGljYXRpb24gdGhhdCB0aGUKIAkgKiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgKDxjb2RlPkBkZXByZWNhdGVkPC9jb2RlPiB0YWcgaW4gSmF2YWRvYyBjb21tZW50KS4KIAkgKgogCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQlyZXR1cm4gKGZsYWdzICYgQWNjTmF0aXZlKSAhPSAwOwogCX0KIAkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgZG9lcyBub3QgaW5jbHVkZSBvbmUgb2YgdGhlIAorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBkb2VzIG5vdCBpbmNsdWRlIG9uZSBvZiB0aGUKIAkgKiA8Y29kZT5wdWJsaWM8L2NvZGU+LCA8Y29kZT5wcml2YXRlPC9jb2RlPiwgb3IgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiBmbGFncy4KIAkgKgogCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQlyZXR1cm4gKGZsYWdzICYgQWNjU3luY2hyb25pemVkKSAhPSAwOwogCX0KIAkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIGluZGljYXRpb24gdGhhdCB0aGUgCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBpbnRlZ2VyIGluY2x1ZGVzIHRoZSBpbmRpY2F0aW9uIHRoYXQgdGhlCiAJICogZWxlbWVudCBpcyBzeW50aGV0aWMuCiAJICoKIAkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCkBAIC0yOTgsNyArMjk4LDcgQEAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWb2xhdGlsZShpbnQgZmxhZ3MpIHsKIAkJcmV0dXJuIChmbGFncyAmIEFjY1ZvbGF0aWxlKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBoYXMgdGhlIDxjb2RlPkFjY0JyaWRnZTwvY29kZT4KIAkgKiBiaXQgc2V0LgpAQCAtMzExLDcgKzMxMSw3IEBACiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnJpZGdlKGludCBmbGFncykgewogCQlyZXR1cm4gKGZsYWdzICYgQWNjQnJpZGdlKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBoYXMgdGhlIDxjb2RlPkFjY1ZhcmFyZ3M8L2NvZGU+CiAJICogYml0IHNldC4KQEAgLTMyNCw3ICszMjQsNyBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhcmFyZ3MoaW50IGZsYWdzKSB7CiAJCXJldHVybiAoZmxhZ3MgJiBBY2NWYXJhcmdzKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBoYXMgdGhlIDxjb2RlPkFjY0VudW08L2NvZGU+CiAJICogYml0IHNldC4KQEAgLTMzNyw3ICszMzcsNyBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VudW0oaW50IGZsYWdzKSB7CiAJCXJldHVybiAoZmxhZ3MgJiBBY2NFbnVtKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBoYXMgdGhlIDxjb2RlPkFjY0Fubm90YXRpb248L2NvZGU+CiAJICogYml0IHNldC4KQEAgLTM1MCw3ICszNTAsNyBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fubm90YXRpb24oaW50IGZsYWdzKSB7CiAJCXJldHVybiAoZmxhZ3MgJiBBY2NBbm5vdGF0aW9uKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBzdGFuZGFyZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gbW9kaWZpZXIgZmxhZ3MuCiAJICogT25seSBtb2RpZmllciBmbGFncyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dDsgZGVwcmVjYXRlZCwKQEAgLTM1OCwxNCArMzU4LDE0IEBACiAJICogPHA+CiAJICogVGhlIGZsYWdzIGFyZSBvdXRwdXQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKIAkgKiA8cHJlPgotCSAqICAgPGNvZGU+cHVibGljPC9jb2RlPiA8Y29kZT5wcm90ZWN0ZWQ8L2NvZGU+IDxjb2RlPnByaXZhdGU8L2NvZGU+IAotCSAqICAgPGNvZGU+c3RhdGljPC9jb2RlPiAKKwkgKiAgIDxjb2RlPnB1YmxpYzwvY29kZT4gPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiA8Y29kZT5wcml2YXRlPC9jb2RlPgorCSAqICAgPGNvZGU+c3RhdGljPC9jb2RlPgogCSAqICAgPGNvZGU+YWJzdHJhY3Q8L2NvZGU+IDxjb2RlPmZpbmFsPC9jb2RlPiA8Y29kZT5uYXRpdmU8L2NvZGU+IDxjb2RlPnN5bmNocm9uaXplZDwvY29kZT4gPGNvZGU+dHJhbnNpZW50PC9jb2RlPiA8Y29kZT52b2xhdGlsZTwvY29kZT4gPGNvZGU+c3RyaWN0ZnA8L2NvZGU+CiAJICogPC9wcmU+CiAJICogVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiB0aGUgb3JkZXJzIHNwZWNpZmllZCBpbiBzZWN0aW9ucyA4LjEuMSwKLQkgKiA4LjMuMSwgOC40LjMsIDguOC4zLCA5LjEuMSwgYW5kIDkuMyBvZiA8ZW0+VGhlIEphdmEgTGFuZ3VhZ2UgCisJICogOC4zLjEsIDguNC4zLCA4LjguMywgOS4xLjEsIGFuZCA5LjMgb2YgPGVtPlRoZSBKYXZhIExhbmd1YWdlCiAJICogU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb248L2VtPiAoSkxTMikuCi0JICogPC9wPiAKKwkgKiA8L3A+CiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoZSBmbGFncyBvZiBhIG1ldGhvZCBjYW4gaW5jbHVkZSB0aGUgQWNjVmFyYXJncyBmbGFnIHRoYXQgaGFzIG5vIHN0YW5kYXJkIGRlc2NyaXB0aW9uLiBTaW5jZSB0aGUgQWNjVmFyYXJncyBmbGFnIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcwogCSAqIHRoZSBBY2NUcmFuc2llbnQgZmxhZyAodmFsaWQgZm9yIGZpZWxkcyBvbmx5KSwgYXR0ZW1wdGluZyB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIG9mIG1ldGhvZCBtb2RpZmllcnMgd2l0aCB0aGUgQWNjVmFyYXJncyBmbGFnIHNldCB3b3VsZCByZXN1bHQgaW4gYW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lBY2Nlc3NSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQWNjZXNzUnVsZS5qYXZhCmluZGV4IGVlOTUyYmIuLmRiNTdmYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lBY2Nlc3NSdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUFjY2Vzc1J1bGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCw0NyArMTgsNTAgQEAKICAqIG5vbiBhY2Nlc3NpYmxlLCBvciBkaXNjb3VyYWdlZCkuCiAgKiA8cD4KICAqIE9uIGEgZ2l2ZW4gY2xhc3NwYXRoIGVudHJ5LCB0aGUgYWNjZXNzIHJ1bGVzIGFyZSBjb25zaWRlcmVkIGluIHRoZSBvcmRlciBnaXZlbgotICogd2hlbiB0aGUgZW50cnkgd2FzIGNyZWF0ZWQuIFdoZW4gYSBzb3VyY2Ugb3IgY2xhc3MgZmlsZSBtYXRjaGVzIGFuIGFjY2VzcyAKKyAqIHdoZW4gdGhlIGVudHJ5IHdhcyBjcmVhdGVkLiBXaGVuIGEgc291cmNlIG9yIGNsYXNzIGZpbGUgbWF0Y2hlcyBhbiBhY2Nlc3MKICAqIHJ1bGUncyBwYXR0ZXJuLCB0aGUgYWNjZXNzIHJ1bGUncyBraW5kIGRlZmluZSB3aGV0aGVyIHRoZSBmaWxlIGlzIGNvbnNpZGVyZWQKICAqIGFjY2Vzc2libGUsIG5vbiBhY2Nlc3NpYmxlLCBvciBpdHMgYWNjZXNzIGlzIGRpc2NvdXJhZ2VkLiBJZiB0aGUgc291cmNlIG9yIGNsYXNzCi0gKiBmaWxlIGRvZXNuJ3QgbWF0Y2ggYW55IGFjY2Vzc2libGUgcnVsZSwgaXQgaXMgY29uc2lkZXJlZCBhY2Nlc3NpYmxlLiBBIHNvdXJjZSBvciBjbGFzcyAKLSAqIGZpbGUgdGhhdCBpcyBub3QgYWNjZXNzaWJsZSBvciBkaXNjb3VyYWdlZCBjYW4gc3RpbGwgYmUgcmVmZXJlZCB0byBidXQgaXQgaXMgdGFnZ2VkIGFzIGJlaW5nIG5vdCAKLSAqIGFjY2Vzc2libGUgLSB0aGUgSmF2YSBidWlsZGVyIHdpbGwgY3JlYXRlIGEgcHJvYmxlbSBtYXJrZXIgZm9yIGV4YW1wbGUuIAorICogZmlsZSBkb2Vzbid0IG1hdGNoIGFueSBhY2Nlc3NpYmxlIHJ1bGUsIGl0IGlzIGNvbnNpZGVyZWQgYWNjZXNzaWJsZS4gQSBzb3VyY2Ugb3IgY2xhc3MKKyAqIGZpbGUgdGhhdCBpcyBub3QgYWNjZXNzaWJsZSBvciBkaXNjb3VyYWdlZCBjYW4gc3RpbGwgYmUgcmVmZXJlZCB0byBidXQgaXQgaXMgdGFnZ2VkIGFzIGJlaW5nIG5vdAorICogYWNjZXNzaWJsZSAtIHRoZSBKYXZhIGJ1aWxkZXIgd2lsbCBjcmVhdGUgYSBwcm9ibGVtIG1hcmtlciBmb3IgZXhhbXBsZS4KICAqIFRoZSBzZXZlcml0eSBvZiB0aGUgbWFya2VyIGNyZWF0ZWQgZnJvbSBhIG5vbiBhY2Nlc3NpYmxlIHJ1bGUgaXMgY29udHJvbGVkIHRocm91Z2gKICAqIHRoZSB7QGxpbmsgSmF2YUNvcmUjQ09NUElMRVJfUEJfRk9SQklEREVOX1JFRkVSRU5DRX0gY29tcGlsZXIgb3B0aW9uLgogICogVGhlIHNldmVyaXR5IG9mIHRoZSBtYXJrZXIgY3JlYXRlZCBmcm9tIGEgZGlzY291cmFnZWQgcnVsZSBpcyBjb250cm9sZWQgdGhyb3VnaAogICogdGhlIHtAbGluayBKYXZhQ29yZSNDT01QSUxFUl9QQl9ESVNDT1VSQUdFRF9SRUZFUkVOQ0V9IGNvbXBpbGVyIG9wdGlvbi4KLSAqIE5vdGUgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiBwYXR0ZXJucyBvbiBzb3VyY2UgY2xhc3NwYXRoIGVudHJpZXMsIAorICogTm90ZSB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIHBhdHRlcm5zIG9uIHNvdXJjZSBjbGFzc3BhdGggZW50cmllcywKICAqIHdoZXJlIGEgc291cmNlIGZpbGUgdGhhdCBpcyBleGNsdWRlZCBpcyBub3QgZXZlbiBjb21waWxlZC4KLSAqIEZpbGVzIHBhdHRlcm5zIGxvb2sgbGlrZSByZWxhdGl2ZSBmaWxlIHBhdGhzIHdpdGggd2lsZGNhcmRzIGFuZCBhcmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgCisgKiBGaWxlcyBwYXR0ZXJucyBsb29rIGxpa2UgcmVsYXRpdmUgZmlsZSBwYXRocyB3aXRoIHdpbGRjYXJkcyBhbmQgYXJlIGludGVycHJldGVkIHJlbGF0aXZlCiAgKiB0byBlYWNoIGVudHJ5J3MgcGF0aC4KLSAqIEZpbGUgcGF0dGVybnMgYXJlIGNhc2Utc2Vuc2l0aXZlIGFuZCB0aGV5IGNhbiBjb250YWluICcqKicsICcqJyBvciAnPycgd2lsZGNhcmRzIChzZWUgCisgKiBGaWxlIHBhdHRlcm5zIGFyZSBjYXNlLXNlbnNpdGl2ZSBhbmQgdGhleSBjYW4gY29udGFpbiAnKionLCAnKicgb3IgJz8nIHdpbGRjYXJkcyAoc2VlCiAgKiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zKCl9IGZvciB0aGUgZnVsbCBkZXNjcmlwdGlvbgogICogb2YgdGhlaXIgc3ludGF4IGFuZCBzZW1hbnRpY3MpLgotICogTm90ZSB0aGF0IGZpbGUgcGF0dGVybnMgbXVzdCBub3QgaW5jbHVkZSB0aGUgZmlsZSBleHRlbnNpb24uIAotICogPGNvZGU+Y29tL3h5ei90ZXN0cy9NeUNsYXNzPC9jb2RlPiBpcyBhIHZhbGlkIGZpbGUgcGF0dGVybiwgd2hlcmVhcyAKKyAqIE5vdGUgdGhhdCBmaWxlIHBhdHRlcm5zIG11c3Qgbm90IGluY2x1ZGUgdGhlIGZpbGUgZXh0ZW5zaW9uLgorICogPGNvZGU+Y29tL3h5ei90ZXN0cy9NeUNsYXNzPC9jb2RlPiBpcyBhIHZhbGlkIGZpbGUgcGF0dGVybiwgd2hlcmVhcwogICogPGNvZGU+Y29tL3h5ei90ZXN0cy9NeUNsYXNzLmNsYXNzPC9jb2RlPiBpcyBub3QgdmFsaWQuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIEZvciBleGFtcGxlLCBpZiBvbmUgb2YgdGhlIGVudHJ5IHBhdGggaXMgPGNvZGU+L1Byb2plY3Qvc29tZUxpYi5qYXI8L2NvZGU+LCAKLSAqIHRoZXJlIGFyZSBubyBhY2Nlc3NpYmxlIHJ1bGVzLCBhbmQgdGhlcmUgaXMgb25lIG5vbiBhY2Nlc3NpYmxlIHJ1bGUgd2hpdGggcGF0dGVybiAKKyAqIEZvciBleGFtcGxlLCBpZiBvbmUgb2YgdGhlIGVudHJ5IHBhdGggaXMgPGNvZGU+L1Byb2plY3Qvc29tZUxpYi5qYXI8L2NvZGU+LAorICogdGhlcmUgYXJlIG5vIGFjY2Vzc2libGUgcnVsZXMsIGFuZCB0aGVyZSBpcyBvbmUgbm9uIGFjY2Vzc2libGUgcnVsZSB3aGl0aCBwYXR0ZXJuCiAgKiA8Y29kZT5jb20veHl6L3Rlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+LCB0aGVuIGNsYXNzIGZpbGVzCiAgKiBsaWtlIDxjb2RlPi9Qcm9qZWN0L3NvbWVMaWIuamFyL2NvbS94eXovRm9vLmNsYXNzPC9jb2RlPgogICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NvbWVMaWIuamFyL2NvbS94eXovdXRpbHMvQmFyLmNsYXNzPC9jb2RlPiB3b3VsZCBiZSBhY2Nlc3NpYmxlLAogICogd2hlcmVhcyA8Y29kZT4vUHJvamVjdC9zb21lTGliLmphci9jb20veHl6L3Rlc3RzL1QxLmNsYXNzPC9jb2RlPgogICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NvbWVMaWIuamFyL2NvbS94eXovdGVzdHMvcXVpY2svVDIuY2xhc3M8L2NvZGU+IHdvdWxkIG5vdCBiZQotICogYWNjZXNzaWJsZS4gCisgKiBhY2Nlc3NpYmxlLgogICogPC9wPgotICogCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGludGVyZmFjZSBJQWNjZXNzUnVsZSB7Ci0JCisKIAkvKioKIAkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgZmlsZXMgbWF0Y2hpbmcgdGhlIHJ1bGUncyBwYXR0ZXJuIGFyZSBhY2Nlc3NpYmxlLgogCSAqLwogCWludCBLX0FDQ0VTU0lCTEUgPSAwOwotCQorCiAJLyoqCiAJICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGZpbGVzIG1hdGNoaW5nIHRoZSBydWxlJ3MgcGF0dGVybiBhcmUgbm9uIGFjY2Vzc2libGUuCiAJICovCkBAIC03MCw0NiArNzMsNDYgQEAKIAlpbnQgS19ESVNDT1VSQUdFRCA9IDI7CiAKIAkvKioKLQkgKiA8cD5GbGFnIGluZGljYXRpbmcgdGhhdCB3aGV0aGVyIGEgdHlwZSBtYXRjaGluZyB0aGlzIHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWQgaWZmIGEgdHlwZSB3aXRoIAotCSAqIHRoZSBzYW1lIHF1YWxpZmllZCBuYW1lIGNhbiBiZSBmb3VuZCBvbiBhIGxhdGVyIGNsYXNzcGF0aCBlbnRyeSB3aXRoIGEgYmV0dGVyIAorCSAqIDxwPkZsYWcgaW5kaWNhdGluZyB0aGF0IHdoZXRoZXIgYSB0eXBlIG1hdGNoaW5nIHRoaXMgcnVsZSBzaG91bGQgYmUgaWdub3JlZCBpZmYgYSB0eXBlIHdpdGgKKwkgKiB0aGUgc2FtZSBxdWFsaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQgb24gYSBsYXRlciBjbGFzc3BhdGggZW50cnkgd2l0aCBhIGJldHRlcgogCSAqIGFjY2Vzc2liaWxpdHkuPC9wPgotCSAqIDxwPkUuZy4gaWYgYSB0eXBlIHAuWCBtYXRjaGVzIGEgcnVsZSBLX05PTl9BQ0NFU1NJQkxFIHwgSUdOT1JFX0lGX0JFVFRFUiAKLQkgKiBvbiBhIGxpYnJhcnkgZW50cnkgJ2xpYjEnIGFuZCBhbm90aGVyIHR5cGUgcC5YIGFsc28gbWF0Y2hlcyBhIHJ1bGUgCi0JICogS19ESVNDT1VSQUdFRCBvbiBsaWJyYXJ5IGVudHJ5ICdsaWIyJyAoJ2xpYjInIGJlaW5nIGFmdGVyICdsaWIxJyBvbiB0aGUgCi0JICogY2xhc3NwYXRoKSwgdGhlbiBwLlggZnJvbSAnbGliMicgd2lsbCBiZSB1c2VkIGFuZCByZXBvcnRlZCBhcyAKKwkgKiA8cD5FLmcuIGlmIGEgdHlwZSBwLlggbWF0Y2hlcyBhIHJ1bGUgS19OT05fQUNDRVNTSUJMRSB8IElHTk9SRV9JRl9CRVRURVIKKwkgKiBvbiBhIGxpYnJhcnkgZW50cnkgJ2xpYjEnIGFuZCBhbm90aGVyIHR5cGUgcC5YIGFsc28gbWF0Y2hlcyBhIHJ1bGUKKwkgKiBLX0RJU0NPVVJBR0VEIG9uIGxpYnJhcnkgZW50cnkgJ2xpYjInICgnbGliMicgYmVpbmcgYWZ0ZXIgJ2xpYjEnIG9uIHRoZQorCSAqIGNsYXNzcGF0aCksIHRoZW4gcC5YIGZyb20gJ2xpYjInIHdpbGwgYmUgdXNlZCBhbmQgcmVwb3J0ZWQgYXMKIAkgKiBkaXNjb3VyYWdlZC48L3A+Ci0JICogCisJICoKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJaW50IElHTk9SRV9JRl9CRVRURVIgPSAweDEwMDsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGZpbGUgcGF0dGVybiBmb3IgdGhpcyBhY2Nlc3MgcnVsZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGZpbGUgcGF0dGVybiBmb3IgdGhpcyBhY2Nlc3MgcnVsZQogCSAqLwogCUlQYXRoIGdldFBhdHRlcm4oKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBhY2Nlc3MgcnVsZSAob25lIG9mIHtAbGluayAjS19BQ0NFU1NJQkxFfSwge0BsaW5rICNLX05PTl9BQ0NFU1NJQkxFfQogCSAqIG9yIHtAbGluayAjS19ESVNDT1VSQUdFRH0pLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIGFjY2VzcyBydWxlCiAJICovCiAJaW50IGdldEtpbmQoKTsKLQkKKwogCS8qKgotCSAqIDxwPlJldHVybnMgd2hldGhlciBhIHR5cGUgbWF0Y2hpbmcgdGhpcyBydWxlIHNob3VsZCBiZSBpZ25vcmVkIGlmZiBhIHR5cGUgd2l0aCAKLQkgKiB0aGUgc2FtZSBxdWFsaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQgb24gYSBsYXRlciBjbGFzc3BhdGggZW50cnkgd2l0aCBhIGJldHRlciAKKwkgKiA8cD5SZXR1cm5zIHdoZXRoZXIgYSB0eXBlIG1hdGNoaW5nIHRoaXMgcnVsZSBzaG91bGQgYmUgaWdub3JlZCBpZmYgYSB0eXBlIHdpdGgKKwkgKiB0aGUgc2FtZSBxdWFsaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQgb24gYSBsYXRlciBjbGFzc3BhdGggZW50cnkgd2l0aCBhIGJldHRlcgogCSAqIGFjY2Vzc2liaWxpdHkuPC9wPgotCSAqIDxwPkUuZy4gaWYgYSB0eXBlIHAuWCBtYXRjaGVzIGEgcnVsZSBLX05PTl9BQ0NFU1NJQkxFIHwgSUdOT1JFX0lGX0JFVFRFUiAKLQkgKiBvbiBhIGxpYnJhcnkgZW50cnkgJ2xpYjEnIGFuZCBhbm90aGVyIHR5cGUgcC5YIGFsc28gbWF0Y2hlcyBhIHJ1bGUgCi0JICogS19ESVNDT1VSQUdFRCBvbiBsaWJyYXJ5IGVudHJ5ICdsaWIyJyAoJ2xpYjInIGJlaW5nIGFmdGVyICdsaWIxJyBvbiB0aGUgCi0JICogY2xhc3NwYXRoKSwgdGhlbiBwLlggZnJvbSAnbGliMicgd2lsbCBiZSB1c2VkIGFuZCByZXBvcnRlZCBhcyAKKwkgKiA8cD5FLmcuIGlmIGEgdHlwZSBwLlggbWF0Y2hlcyBhIHJ1bGUgS19OT05fQUNDRVNTSUJMRSB8IElHTk9SRV9JRl9CRVRURVIKKwkgKiBvbiBhIGxpYnJhcnkgZW50cnkgJ2xpYjEnIGFuZCBhbm90aGVyIHR5cGUgcC5YIGFsc28gbWF0Y2hlcyBhIHJ1bGUKKwkgKiBLX0RJU0NPVVJBR0VEIG9uIGxpYnJhcnkgZW50cnkgJ2xpYjInICgnbGliMicgYmVpbmcgYWZ0ZXIgJ2xpYjEnIG9uIHRoZQorCSAqIGNsYXNzcGF0aCksIHRoZW4gcC5YIGZyb20gJ2xpYjInIHdpbGwgYmUgdXNlZCBhbmQgcmVwb3J0ZWQgYXMKIAkgKiBkaXNjb3VyYWdlZC48L3A+Ci0JICogCi0JICogQHJldHVybiB3aGV0aGVyIGEgdHlwZSBtYXRjaGluZyB0aGlzIHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWQgaWZmIGEgdHlwZSAKLQkgKiAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBxdWFsaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQgb24gYSBsYXRlciBjbGFzc3BhdGggCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgYSB0eXBlIG1hdGNoaW5nIHRoaXMgcnVsZSBzaG91bGQgYmUgaWdub3JlZCBpZmYgYSB0eXBlCisJICogICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgcXVhbGlmaWVkIG5hbWUgY2FuIGJlIGZvdW5kIG9uIGEgbGF0ZXIgY2xhc3NwYXRoCiAJICogICAgICAgICAgICAgIGVudHJ5IHdpdGggYSBiZXR0ZXIgYWNjZXNzaWJpbGl0eQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lBbm5vdGF0YWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUFubm90YXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MDEwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lBbm5vdGF0YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBjYW4gYmUgYW5ub3RhdGVkLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRhYmxlIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBkZWNsYXJlZCBvbiB0aGlzIGVsZW1lbnQuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gVGhlIGFubm90YXRpb24gbWF5IG9yIG1heSBub3QgZXhpc3QuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgZGVjbGFyZWQgb24gdGhpcyBlbGVtZW50CisJICovCisJSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgbmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LgorCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBlbGVtZW50IGhhcyBubyBhbm5vdGF0aW9ucy4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHJldHVybiB0aGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBlbGVtZW50LAorCSAqIAkJaW4gdGhlIG9yZGVyIGRlY2xhcmVkIGluIHRoZSBzb3VyY2UsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKwkgKiBAc2luY2UgMy40CisJICovCisJSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA2NjIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIG9uIGEgcGFja2FnZSBkZWNsYXJhdGlvbiwgYSB0eXBlLCBhIG1ldGhvZCwgYSBmaWVsZAorICogb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBjbGFzcyBmaWxlLgorICogPHA+CisgKiBBbm5vdGF0aW9ucyBhcmUgb2J0YWluZWQgdXNpbmcge0BsaW5rIElBbm5vdGF0YWJsZSNnZXRBbm5vdGF0aW9uKFN0cmluZyl9LgorICogPC9wPjxwPgorICogTm90ZSB0aGF0IGFubm90YXRpb25zIGFyZSBub3QgY2hpbGRyZW4gb2YgdGhlaXIgZGVjbGFyaW5nIGVsZW1lbnQuCisgKiBUbyBnZXQgYSBsaXN0IG9mIHRoZSBhbm5vdGF0aW9ucyB1c2Uge0BsaW5rIElBbm5vdGF0YWJsZSNnZXRBbm5vdGF0aW9ucygpfS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJU291cmNlUmVmZXJlbmNlIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhbm5vdGF0aW9uLiBJZiB0aGlzIGFubm90YXRpb24gaXMgY29taW5nIGZyb20KKwkgKiBhIGNvbXBpbGF0aW9uIHVuaXQsIHRoaXMgaXMgZWl0aGVyIGEgc2ltcGxlIG5hbWUgKGUuZy4gZm9yIDxjb2RlPkBNeUFubm90PC9jb2RlPiwgdGhlIG5hbWUKKyAJICogaXMgIk15QW5ub3QiKSwgb3IgYSBxdWFsaWZpZWQgbmFtZSAgKGUuZy4gZm9yIDxjb2RlPkB4LiB5LiAgICBNeUFubm90PC9jb2RlPiwgdGhlIG5hbWUgaXMKKyAJICogIngueS5NeUFubm90IikuIElmIHRoaXMgYW5ub3RhdGlvbiBpcyBjb21pbmcgZnJvbSBhIGNsYXNzIGZpbGUsIHRoaXMgaXMgYWx3YXlzIGEgZnVsbHkKKyAJICogcXVhbGlmaWVkIG5hbWUuCisgCSAqIDxwPk5vdGUgdGhhdCB0aGUgbmFtZSBoYXMgYmVlbiB0cmltbWVkIGZyb20gaXRzIHdoaXRlc3BhY2VzLiBUbyBleHRyYWN0IHRoZSBuYW1lIGFzIGl0CisgCSAqIGFwcGVhcnMgaW4gdGhlIHNvdXJjZSwgdXNlIHtAbGluayAjZ2V0TmFtZVJhbmdlKCl9LgorIAkgKiA8L3A+PHA+CisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSBhbm5vdGF0aW9uIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFubm90YXRpb24KKwkgKi8KKwlTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1lbWJlci12YWx1ZSBwYWlycyBvZiB0aGlzIGFubm90YXRpb24uIFJldHVybnMgYW4gZW1wdHkKKwkgKiBhcnJheSBpZiB0aGlzIGFubm90YXRpb24gaXMgYSBtYXJrZXIgYW5ub3RhdGlvbi4gUmV0dXJucyBhIHNpemUtMSBhcnJheSBpZiB0aGlzCisJICogYW5ub3RhdGlvbiBpcyBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgbWVtYmVyCisJICogbmFtZSBpcyBhbHdheXMgPGNvZGU+InZhbHVlIjwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBtZW1iZXItdmFsdWUgcGFpcnMgb2YgdGhpcyBhbm5vdGF0aW9uCisJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICovCisJSU1lbWJlclZhbHVlUGFpcltdIGdldE1lbWJlclZhbHVlUGFpcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yZGVyIHRoaXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBzb3VyY2UuCisJICogTnVtYmVyaW5nIHN0YXJ0cyBhdCAxICh0aHVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlzIG9jY3VycmVuY2UgMSwgbm90IG9jY3VycmVuY2UgMCkuCisJICogPHA+CisJICogVHdvIGFubm90YXRpb25zIGFubjEgYW5kIGFubjIgdGhhdCBhcmUgZXF1YWwgKGUuZy4gMiBhbm5vdGF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgb24KKwkgKiB0aGUgc2FtZSB0eXBlKSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCB1c2luZyB0aGVpciBvY2N1cnJlbmNlIGNvdW50cy4gSWYgYW5ub3RhdGlvbgorCSAqIGFubjEgYXBwZWFycyBmaXJzdCBpbiB0aGUgc291cmNlLCBpdCB3aWxsIGhhdmUgYW4gb2NjdXJyZW5jZSBjb3VudCBvZiAxLiBJZiBhbm5vdGF0aW9uCisJICogYW5uMiBhcHBlYXJzIHJpZ2h0IGFmdGVyIGFubm90YXRpb24gYW5uMSwgaXQgd2lsbCBoYXZlIGFuIG9jY3VycmVuY2UgY291bnQgb2YgMi4KKwkgKiA8L3A+PHA+CisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSBhbm5vdGF0aW9uIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yZGVyIHRoaXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBzb3VyY2UKKwkgKi8KKwlpbnQgZ2V0T2NjdXJyZW5jZUNvdW50KCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyLmphdmEKaW5kZXggYzUwZDcwNC4uOWNlYmFhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxOCArMTIsMjAgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVW5kb0VkaXQ7CiAKIC8qKgogICogQSBidWZmZXIgY29udGFpbnMgdGhlIHRleHQgY29udGVudHMgb2YgYSByZXNvdXJjZS4gSXQgaXMgbm90IGxhbmd1YWdlLXNwZWNpZmljLgotICogVGhlIGNvbnRlbnRzIG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBlZGl0ZWQsIGRpZmZlcmluZyBmcm9tIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIAotICogdW5kZXJseWluZyByZXNvdXJjZS4gQSBidWZmZXIgaGFzIGFuIG93bmVyLCB3aGljaCBpcyBhbiA8Y29kZT5JT3BlbmFibGU8L2NvZGU+LiAKLSAqIElmIGEgYnVmZmVyIGRvZXMgbm90IGhhdmUgYW4gdW5kZXJseWluZyByZXNvdXJjZSwgc2F2aW5nIHRoZSBidWZmZXIgaGFzIG5vIGVmZmVjdC4gCisgKiBUaGUgY29udGVudHMgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGVkaXRlZCwgZGlmZmVyaW5nIGZyb20gdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUKKyAqIHVuZGVybHlpbmcgcmVzb3VyY2UuIEEgYnVmZmVyIGhhcyBhbiBvd25lciwgd2hpY2ggaXMgYW4gPGNvZGU+SU9wZW5hYmxlPC9jb2RlPi4KKyAqIElmIGEgYnVmZmVyIGRvZXMgbm90IGhhdmUgYW4gdW5kZXJseWluZyByZXNvdXJjZSwgc2F2aW5nIHRoZSBidWZmZXIgaGFzIG5vIGVmZmVjdC4KICAqIEJ1ZmZlcnMgY2FuIGJlIHJlYWQtb25seS4KICAqIDxwPgotICogTm90ZSB0aGF0IGphdmEgbW9kZWwgb3BlcmF0aW9ucyB0aGF0IG1hbmlwdWxhdGUgYW4gPGNvZGU+SUJ1ZmZlcjwvY29kZT4gKGZvciBleGFtcGxlLCAKLSAqIDxjb2RlPklUeXBlLmNyZWF0ZU1ldGhvZCguLi4pPC9jb2RlPikgZW5zdXJlcyB0aGF0IHRoZSBzYW1lIGxpbmUgZGVsaW1pdGVyIAotICogKGVpdGhlciA8Y29kZT4iXG4iPC9jb2RlPiBvciA8Y29kZT4iXHIiPC9jb2RlPiBvciA8Y29kZT4iXHJcbiI8L2NvZGU+KSBpcyAKLSAqIHVzZWQgYWNyb3NzIHRoZSB3aG9sZSBidWZmZXIuIFRodXMgdGhlc2Ugb3BlcmF0aW9ucyBtYXkgY2hhbmdlIHRoZSBsaW5lIGRlbGltaXRlcihzKSAKKyAqIE5vdGUgdGhhdCBqYXZhIG1vZGVsIG9wZXJhdGlvbnMgdGhhdCBtYW5pcHVsYXRlIGFuIDxjb2RlPklCdWZmZXI8L2NvZGU+IChmb3IgZXhhbXBsZSwKKyAqIDxjb2RlPklUeXBlLmNyZWF0ZU1ldGhvZCguLi4pPC9jb2RlPikgZW5zdXJlcyB0aGF0IHRoZSBzYW1lIGxpbmUgZGVsaW1pdGVyCisgKiAoZWl0aGVyIDxjb2RlPiJcbiI8L2NvZGU+IG9yIDxjb2RlPiJcciI8L2NvZGU+IG9yIDxjb2RlPiJcclxuIjwvY29kZT4pIGlzCisgKiB1c2VkIGFjcm9zcyB0aGUgd2hvbGUgYnVmZmVyLiBUaHVzIHRoZXNlIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSB0aGUgbGluZSBkZWxpbWl0ZXIocykKICAqIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kLCBvciByZXBsYWNlZC4KICAqIEhvd2V2ZXIgaW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBhd2FyZSB0aGF0IG90aGVyIGNsaWVudHMgb2YgPGNvZGU+SUJ1ZmZlcjwvY29kZT4KICAqIG1pZ2h0IG5vdCBkbyBzdWNoIHRyYW5zZm9ybWF0aW9ucyBiZWZvcmVoYW5kLgpAQCAtMzIsNyArMzQsMzMgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGludGVyZmFjZSBJQnVmZmVyIHsKLQkKKworLyoqCisgKiBJbXBsZW1lbnRvcnMgb2Yge0BsaW5rIElCdWZmZXJ9IGNhbiBhZGRpdGlvbmFsbHkgaW1wbGVtZW50IHtAbGluayBJQnVmZmVyLklUZXh0RWRpdENhcGFiaWxpdHl9LgorICogVGhpcyBhZGRzIHRoZSBjYXBhYmlsaXR5IHRvIGFwcGx5IHRleHQgZWRpdHMgdG8gdGhlIGJ1ZmZlciBhbmQgd2lsbCBiZSB1c2VkIGJ5CisgKiB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNhcHBseVRleHRFZGl0KFRleHRFZGl0LCBJUHJvZ3Jlc3NNb25pdG9yKX0uCisgKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIGludGVyZmFjZSBJVGV4dEVkaXRDYXBhYmlsaXR5IHsKKwkvKioKKwkgKiBBcHBsaWVzIGEgdGV4dCBlZGl0IHRvIHRoaXMgdW5kZXJseWluZyBidWZmZXIuCisJICoKKwkgKiBAcGFyYW0gZWRpdCB0aGUgZWRpdCB0byBhcHBseQorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQKKwkgKiBAcmV0dXJuIHRoZSB1bmRvIGVkaXQKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVkaXQgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBidWZmZXIuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPlRoZSBwcm92aWRlZCBlZGl0IGNhbiBub3QgYmUgYXBwbGllZCBhcyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgdGV4dCBlZGl0IGxvY2F0aW9ucyAoe0BsaW5rIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjQkFEX1RFWFRfRURJVF9MT0NBVElPTn0pfS48L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIFVuZG9FZGl0IGFwcGx5VGV4dEVkaXQoVGV4dEVkaXQgZWRpdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQorCisKIC8qKgogICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBidWZmZXIuCiAgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb3IgaWYgdGhlIGJ1ZmZlcgpAQCAtMTI0LDEyICsxNTIsMTQgQEAKICAqIFJldHVybnMgdGhlIGdpdmVuIHJhbmdlIG9mIHRleHQgaW4gdGhpcyBidWZmZXIuCiAgKiA8cD4KICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1bmRlZmluZWQgaWYgdGhlIGJ1ZmZlciBpcyBjbG9zZWQuCisgKiA8L3A+CiAgKgotICogQHBhcmFtIG9mZnNldCB0aGUgIHplcm8tYmFzZWQgc3RhcnRpbmcgb2Zmc2V0CisgKiBAcGFyYW0gb2Zmc2V0IHRoZSB6ZXJvLWJhc2VkIHN0YXJ0aW5nIG9mZnNldAogICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0cmlldmUKICAqIEByZXR1cm4gdGhlIGdpdmVuIHJhbmdlIG9mIHRleHQgaW4gdGhpcyBidWZmZXIKKyAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIGJ1ZmZlciBpcyBvdXQgb2Ygc3luY2gKICAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpOworcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwogLyoqCiAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZvciB3aGljaCB0aGlzIGJ1ZmZlciB3YXMgb3BlbmVkLAogICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBidWZmZXIgd2FzIG5vdCBvcGVuZWQgb24gYSByZXNvdXJjZS4KQEAgLTE0NCw3ICsxNzQsNyBAQAogICogSWYgYSBidWZmZXIgZG9lcyBub3QgaGF2ZSBhbiB1bmRlcmx5aW5nIHJlc291cmNlLCB0aGlzIG1ldGhvZCBhbHdheXMKICAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uCiAgKiA8cD4KLSAqIE5PVEU6IHdoZW4gYSBidWZmZXIgZG9lcyBub3QgaGF2ZSB1bnNhdmVkIGNoYW5nZXMsIHRoZSBtb2RlbCBtYXkgZGVjaWRlIHRvIGNsb3NlIGl0IAorICogTk9URTogd2hlbiBhIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIHVuc2F2ZWQgY2hhbmdlcywgdGhlIG1vZGVsIG1heSBkZWNpZGUgdG8gY2xvc2UgaXQKICAqIHRvIGNsYWltIHNvbWUgbWVtb3J5IGJhY2suIElmIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgbmVlZHMgdG8gYmUgcmVvcGVuZWQgbGF0ZXIgb24sIGl0cwogICogYnVmZmVyIGZhY3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlci4KICAqIDwvcD4KQEAgLTE2Niw3ICsxOTYsNyBAQAogcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpOwogLyoqCiAgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgYnVmZmVyLgotICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgb3IgaWYgdGhlIGJ1ZmZlciBpcyBjbG9zZWQuCisgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZCBvciBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KICAqCiAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCiAgKi8KQEAgLTIwNywxMiArMjM3LDEyIEBACiAgKiBjYXNlcyB3aGVyZSB0aGUgd29ya2JlbmNoIGlzIG5vdCBjb21wbGV0ZWx5IGluIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCiAgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYXR0ZW1wdAogICogdG8gb3ZlcndyaXRlIGEgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBwcm92aWRlZAotICogaXQgaXMgaW4gc3luYyB3aXRoIHRoZSB3b3JrYmVuY2guIFRoaXMgb3B0aW9uIGVuc3VyZXMgdGhlcmUgaXMgbm8gCisgKiBpdCBpcyBpbiBzeW5jIHdpdGggdGhlIHdvcmtiZW5jaC4gVGhpcyBvcHRpb24gZW5zdXJlcyB0aGVyZSBpcyBubwogICogdW5pbnRlbmRlZCBkYXRhIGxvc3M7IGl0IGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLgogICogSG93ZXZlciwgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZQotICogdG8gd3JpdGUgYSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCAKKyAqIHRvIHdyaXRlIGEgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwKICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBvbmUgaWYgbmVlZCBiZS4KLSAqIEluIGVpdGhlciBjYXNlLCBpZiB0aGlzIG1ldGhvZCBzdWNjZWVkcywgdGhlIHJlc291cmNlIHdpbGwgYmUgbWFya2VkIAorICogSW4gZWl0aGVyIGNhc2UsIGlmIHRoaXMgbWV0aG9kIHN1Y2NlZWRzLCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBtYXJrZWQKICAqIGFzIGJlaW5nIGxvY2FsIChldmVuIGlmIGl0IHdhc24ndCBiZWZvcmUpLgogICogPHA+CiAgKiBIYXMgbm8gZWZmZWN0IGlmIHRoaXMgYnVmZmVyIGlzIHJlYWQtb25seSBvciBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YQppbmRleCAyZGIzODViLi5iMTQ2YjE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBJQnVmZmVyQ2hhbmdlZExpc3RlbmVyIHsKIAotCS8qKiAKKwkvKioKIAkgKiBOb3RpZmllcyB0aGF0IHRoZSBnaXZlbiBldmVudCBoYXMgb2NjdXJyZWQuCiAJICoKIAkgKiBAcGFyYW0gZXZlbnQgdGhlIGNoYW5nZSBldmVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJGYWN0b3J5LmphdmEKaW5kZXggY2I5M2QxYS4uZWVjYWQ4YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDEwICsyMiwxMCBAQAogCiAJLyoqCiAJICogQ3JlYXRlcyBhIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIG93bmVyLgotCSAqIFRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG93bmVyIAotCSAqIGlmIGFuZCBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSBpbml0aWFsaXplZCBieSB0aGUgZmFjdG9yeSAoYSBidWZmZXIgaXMgdW5pbml0aWFsaXplZCBpZiAKKwkgKiBUaGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lcgorCSAqIGlmIGFuZCBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSBpbml0aWFsaXplZCBieSB0aGUgZmFjdG9yeSAoYSBidWZmZXIgaXMgdW5pbml0aWFsaXplZCBpZgogCSAqIGl0cyBjb250ZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+KS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2YgdGhlIGJ1ZmZlcgogCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYnVmZmVyCiAJICogQHNlZSBJQnVmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NGaWxlLmphdmEKaW5kZXggYjliZDExNS4uOWM1MWVjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc0ZpbGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSwxMSArMjUsOSBAQAogICogY2xhc3MgZmlsZS4gVGhlIHNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcyBmaWxlIGlzIHRoZSBzb3VyY2UgY29kZSBvZgogICogdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXQgd2FzIChub21pbmFsbHkpIGdlbmVyYXRlZCBmcm9tLgogICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KICAqCiAgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290I2F0dGFjaFNvdXJjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogCiBwdWJsaWMgaW50ZXJmYWNlIElDbGFzc0ZpbGUgZXh0ZW5kcyBJVHlwZVJvb3QgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEF0dHJpYnV0ZS5qYXZhCmluZGV4IDBlOTc2ZTEuLmQ5MGFiMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc3BhdGhBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNzUgKzEzLDc1IEBACiAvKioKICAqIEEgY2xhc3NwYXRoIGF0dHJpYnV0ZSBkZWZpbmVzIGEgbmFtZS92YWx1ZSBwYWlyIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCB3aXRoIGEgY2xhc3NwYXRoIGVudHJ5LiBTdWNoIGFuIGF0dHJpYnV0ZQogICogY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIGZhY3RvcnkgbWV0aG9kIHtAbGluayBKYXZhQ29yZSNuZXdDbGFzc3BhdGhBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpIG5ld0NsYXNzcGF0aEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKX0uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCisgKgogICogQHNlZSBKYXZhQ29yZSNuZXdDb250YWluZXJFbnRyeSgKLSAqCQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGNvbnRhaW5lclBhdGgsIAotICoJCQlJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLCAKKyAqCQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGNvbnRhaW5lclBhdGgsCisgKgkJCUlBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXMsCiAgKgkJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMsCiAgKgkJCWJvb2xlYW4gaXNFeHBvcnRlZCkKICAqIEBzZWUgSmF2YUNvcmUjbmV3TGlicmFyeUVudHJ5KAogICoJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggcGF0aCwKICAqCQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLAogICoJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAotICoJCQlJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLCAKKyAqCQkJSUFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywKICAqCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcywKICAqCQkJYm9vbGVhbiBpc0V4cG9ydGVkKQogICogQHNlZSBKYXZhQ29yZSNuZXdQcm9qZWN0RW50cnkoCi0gKgkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBwYXRoLCAKLSAqCQkJSUFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywgCisgKgkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBwYXRoLAorICoJCQlJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLAogICoJCQlib29sZWFuIGNvbWJpbmVBY2Nlc3NSZXN0cmljdGlvbnMsCiAgKgkJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMsCi0gKgkJCWJvb2xlYW4gaXNFeHBvcnRlZCkJCisgKgkJCWJvb2xlYW4gaXNFeHBvcnRlZCkKICAqIEBzZWUgSmF2YUNvcmUjbmV3U291cmNlRW50cnkoCi0gKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggcGF0aCwgCi0gKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGhbXSBpbmNsdXNpb25QYXR0ZXJucywgCi0gKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJucywgCi0gKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggc3BlY2lmaWNPdXRwdXRMb2NhdGlvbiwgCisgKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggcGF0aCwKKyAqIAkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aFtdIGluY2x1c2lvblBhdHRlcm5zLAorICogCQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoW10gZXhjbHVzaW9uUGF0dGVybnMsCisgKiAJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggc3BlY2lmaWNPdXRwdXRMb2NhdGlvbiwKICAqIAkJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMpCiAgKiBAc2VlIEphdmFDb3JlI25ld1ZhcmlhYmxlRW50cnkoCiAgKgkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCB2YXJpYWJsZVBhdGgsCiAgKgkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCB2YXJpYWJsZVNvdXJjZUF0dGFjaG1lbnRQYXRoLAogICoJCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggdmFyaWFibGVTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCi0gKgkJCUlBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXMsIAorICoJCQlJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLAogICoJCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzLAogICoJCQlib29sZWFuIGlzRXhwb3J0ZWQpCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aEF0dHJpYnV0ZSB7Ci0JCisKIAkvKioKIAkgKiBDb25zdGFudCBmb3IgdGhlIG5hbWUgb2YgdGhlIGphdmFkb2MgbG9jYXRpb24gYXR0cmlidXRlLgogCSAqIAorCSAqIDxwPlRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaGFzIHRvIGJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBVUkwuPC9wPgorCSAqCiAJICogQHNpbmNlIDMuMQogCSAqLwogCVN0cmluZyBKQVZBRE9DX0xPQ0FUSU9OX0FUVFJJQlVURV9OQU1FID0gImphdmFkb2NfbG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKIAkgKiBDb25zdGFudCBmb3IgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbmFsIGF0dHJpYnV0ZS4gVGhlIHBvc3NpYmxlIHZhbHVlcwotCSAqIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgPGNvZGU+InRydWUiPC9jb2RlPiBvciA8Y29kZT4iZmFsc2UiPC9jb2RlPi4gCisJICogZm9yIHRoaXMgYXR0cmlidXRlIGFyZSA8Y29kZT4idHJ1ZSI8L2NvZGU+IG9yIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgogCSAqIFdoZW4gbm90IHByZXNlbnQsIDxjb2RlPiJmYWxzZSI8L2NvZGU+IGlzIGFzc3VtZWQuCiAJICogSWYgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4sIHRoZSBjbGFzc3BhdGggZW50cnkKIAkgKiBpcyBvcHRpb25hbC4gSWYgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb3IgamFyIGZpbGUgZG9lc24ndCBleGlzdCwgbm8gZXJyb3IKIAkgKiBpcyByZXBvcnRlZCBhbmQgdGhlIGNsYXNzcGF0aCBlbnRyeSBpcyBpZ25vcmVkLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMgogCSAqLwogCVN0cmluZyBPUFRJT05BTCA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjbGFzc3BhdGggYXR0cmlidXRlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzcGF0aCBhdHRyaWJ1dGUuCiAJICogQHNpbmNlIDMuMQogCSAqLwogCVN0cmluZyBnZXROYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGNsYXNzcGF0aCBhdHRyaWJ1dGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGNsYXNzcGF0aCBhdHRyaWJ1dGUuCiAJICogQHNpbmNlIDMuMQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmluZGV4IGQ0ZTAwNzIuLjViODYyZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTMgKzEyLDEzIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiAKLS8qKiAKKy8qKgogICogSW50ZXJmYWNlIG9mIGEgY2xhc3NwYXRoIGNvbnRhaW5lci4KICAqIEEgY2xhc3NwYXRoIGNvbnRhaW5lciBwcm92aWRlcyBhIHdheSB0byBpbmRpcmVjdGx5IHJlZmVyZW5jZSBhIHNldCBvZiBjbGFzc3BhdGggZW50cmllcyB0aHJvdWdoCiAgKiBhIGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9DT05UQUlORVI8L2NvZGU+LiBUeXBpY2FsbHksIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW4KLSAqIGJlIHVzZWQgdG8gZGVzY3JpYmUgYSBjb21wbGV4IGxpYnJhcnkgY29tcG9zZWQgb2YgbXVsdGlwbGUgSkFScyBvciBwcm9qZWN0cywgY29uc2lkZXJpbmcgYWxzbyAKLSAqIHRoYXQgY29udGFpbmVycyBjYW4gbWFwIHRvIGRpZmZlcmVudCBzZXQgb2YgZW50cmllcyBvbiBlYWNoIHByb2plY3QsIGluIG90aGVyIHdvcmRzLCBzZXZlcmFsIAotICogcHJvamVjdHMgY2FuIHJlZmVyZW5jZSB0aGUgc2FtZSBnZW5lcmljIGNvbnRhaW5lciBwYXRoLCBidXQgaGF2ZSBlYWNoIG9mIHRoZW0gYWN0dWFsbHkgYm91bmQgCisgKiBiZSB1c2VkIHRvIGRlc2NyaWJlIGEgY29tcGxleCBsaWJyYXJ5IGNvbXBvc2VkIG9mIG11bHRpcGxlIEpBUnMgb3IgcHJvamVjdHMsIGNvbnNpZGVyaW5nIGFsc28KKyAqIHRoYXQgY29udGFpbmVycyBjYW4gbWFwIHRvIGRpZmZlcmVudCBzZXQgb2YgZW50cmllcyBvbiBlYWNoIHByb2plY3QsIGluIG90aGVyIHdvcmRzLCBzZXZlcmFsCisgKiBwcm9qZWN0cyBjYW4gcmVmZXJlbmNlIHRoZSBzYW1lIGdlbmVyaWMgY29udGFpbmVyIHBhdGgsIGJ1dCBoYXZlIGVhY2ggb2YgdGhlbSBhY3R1YWxseSBib3VuZAogICogdG8gYSBkaWZmZXJlbnQgY29udGFpbmVyIG9iamVjdC4KICAqIDxwPgogICogVGhlIHNldCBvZiBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYXNzcGF0aCBjb250YWluZXIgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmc6CkBAIC0yNyw5ICsyNywxMyBAQAogICogPGxpPiBwcm9qZWN0IGVudHJpZXMgKDxjb2RlPkNQRV9QUk9KRUNUPC9jb2RlPikgPC9saT4KICAqIDwvdWw+CiAgKiBJbiBwYXJ0aWN1bGFyLCBhIGNsYXNzcGF0aCBjb250YWluZXIgY2FuIG5laXRoZXIgcmVmZXJlbmNlIGZ1cnRoZXIgY2xhc3NwYXRoIGNvbnRhaW5lcnMgb3IgY2xhc3NwYXRoIHZhcmlhYmxlcy4KKyAqIDxwPiAKKyAqIEEgbGlicmFyeSBlbnRyeSBjYW4gcmVmZXJlbmNlIG90aGVyIGxpYnJhcmllcyB0aHJvdWdoIHRoZSBDbGFzcy1QYXRoIHNlY3Rpb24gb2YgdGhlIEpBUidzIE1BTklGRVNULk1GIGZpbGUuIElmIHRoZQorICogY29udGFpbmVyIHdhbnRzIHN1Y2ggcmVmZXJlbmNlZCBlbnRyaWVzIHRvIGJlIHBhcnQgb2YgdGhlIGNsYXNzcGF0aCwgdGhlIGNvbnRhaW5lciBtdXN0IGV4cGxpY2l0bHkgYWRkIHRoZW0gdG8gdGhlCisgKiBhcnJheSByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0Q2xhc3NwYXRoRW50cmllcygpfS4KICAqIDxwPgotICogQ2xhc3NwYXRoIGNvbnRhaW5lciB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGJ1dCBhcmUgbm90IHByZXNlcnZlZCBmcm9tIGEgCi0gKiBzZXNzaW9uIHRvIGFub3RoZXIuIEl0IGlzIHRodXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHJlZ2lzdGVyIGEgPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IAorICogQ2xhc3NwYXRoIGNvbnRhaW5lciB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGJ1dCBhcmUgbm90IHByZXNlcnZlZCBmcm9tIGEKKyAqIHNlc3Npb24gdG8gYW5vdGhlci4gSXQgaXMgdGh1cyBoaWdobHkgcmVjb21tZW5kZWQgdG8gcmVnaXN0ZXIgYSA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4KICAqIGZvciBlYWNoIHJlZmVyZW5jZWQgY29udGFpbmVyICh0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIikuCiAgKiA8cD4KICAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CkBAIC0zNyw3ICs0MSw3IEBACiAgKi8KIAogcHVibGljIGludGVyZmFjZSBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQkKKwogCS8qKgogCSAqIEtpbmQgZm9yIGEgY29udGFpbmVyIG1hcHBpbmcgdG8gYW4gYXBwbGljYXRpb24gbGlicmFyeQogCSAqLwpAQCAtNjMsNyArNjcsMTAgQEAKIAkgKiA8L3VsPgogCSAqIEEgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW4gbmVpdGhlciByZWZlcmVuY2UgZnVydGhlciBjbGFzc3BhdGggY29udGFpbmVycwogCSAqIG9yIGNsYXNzcGF0aCB2YXJpYWJsZXMuCi0JICogPC9wPgorCSAqIDxwPgorCSAqIEEgbGlicmFyeSBlbnRyeSBjYW4gcmVmZXJlbmNlIG90aGVyIGxpYnJhcmllcyB0aHJvdWdoIHRoZSBDbGFzcy1QYXRoIHNlY3Rpb24gb2YgdGhlIEpBUidzIE1BTklGRVNULk1GIGZpbGUuIElmCisJICogdGhlIGNvbnRhaW5lciB3YW50cyBzdWNoIHJlZmVyZW5jZWQgZW50cmllcyB0byBiZSBwYXJ0IG9mIHRoZSBjbGFzc3BhdGgsIHRoZSBjb250YWluZXIgbXVzdCBleHBsaWNpdGx5IGFkZCB0aGVtCisJICogdG8gdGhlIHJlc3VsdC4KIAkgKiA8cD4KIAkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIEphdmEgbW9kZWwgd2hlbiBpdCBuZWVkcyB0byByZXNvbHZlIHRoaXMKIAkgKiBjbGFzc3BhdGggY29udGFpbmVyIGVudHJ5IGludG8gYSBsaXN0IG9mIGxpYnJhcnkgYW5kIHByb2plY3QgZW50cmllcy4KQEAgLTgwLDYgKzg3LDcgQEAKIAkgKiA8bGk+e0BsaW5rIEphdmFDb3JlI25ld1Byb2plY3RFbnRyeShJUGF0aCwgYm9vbGVhbil9IGFuZCB2YXJpYW50czwvbGk+CiAJICogPGxpPntAbGluayBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QpfTwvbGk+CiAJICogPGxpPntAbGluayBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpfTwvbGk+CisJICogPGxpPntAbGluayBKYXZhQ29yZSNnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnksIElKYXZhUHJvamVjdCl9IHdpdGggPGNvZGU+bnVsbDwvY29kZT4gYXMgcHJvamVjdDwvbGk+CiAJICogPGxpPntAbGluayBJSmF2YU1vZGVsI2dldEphdmFQcm9qZWN0cygpfTwvbGk+CiAJICogPGxpPntAbGluayBJSmF2YVByb2plY3QjZ2V0UmF3Q2xhc3NwYXRoKCl9PC9saT4KIAkgKiA8bGk+e0BsaW5rIElKYXZhUHJvamVjdCNyZWFkUmF3Q2xhc3NwYXRoKCl9PC9saT4KQEAgLTg5LDE3ICs5NywxNyBAQAogCSAqIDwvdWw+CiAJICogVGhlIGVmZmVjdHMgb2YgdXNpbmcgb3RoZXIgSmF2YSBtb2RlbCBBUElzIGFyZSB1bnNwZWNpZmllZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIElDbGFzc3BhdGhFbnRyeVtdIC0gdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRoaXMgY29udGFpbmVyIHJlcHJlc2VudHMKIAkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQotCSAqLwkKKwkgKi8KICAgICBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXJzIGEgcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBjb250YWluZXIKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gU3RyaW5nIC0gYSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRhaW5lcgotCSAqLwkKKwkgKi8KICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKIAogCS8qKgpAQCAtMTEyLDEyICsxMjAsMTIgQEAKIAkgKiA8L3VsPgogCSAqIFR5cGljYWxseSwgc3lzdGVtIGNvbnRhaW5lcnMgc2hvdWxkIGJlIHBsYWNlZCBmaXJzdCBvbiBhIGJ1aWxkIHBhdGguCiAJICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIGNvbnRhaW5lcgotCSAqLwkKKwkgKi8KICAgICBpbnQgZ2V0S2luZCgpOwogCiAJLyoqCiAJICogQW5zd2VycyB0aGUgY29udGFpbmVyIHBhdGggaWRlbnRpZnlpbmcgdGhpcyBjb250YWluZXIuCi0JICogQSBjb250YWluZXIgcGF0aCBpcyBmb3JtZWQgYnkgYSBmaXJzdCBJRCBzZWdtZW50IGZvbGxvd2VkIHdpdGggZXh0cmEgc2VnbWVudHMsIHdoaWNoIAorCSAqIEEgY29udGFpbmVyIHBhdGggaXMgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLCB3aGljaAogCSAqIGNhbiBiZSB1c2VkIGFzIGFkZGl0aW9uYWwgaGludHMgZm9yIHJlc29sdmluZyB0byB0aGlzIGNvbnRhaW5lci4KIAkgKiA8cD4KIAkgKiBUaGUgY29udGFpbmVyIElEIGlzIGFsc28gdXNlZCB0byBpZGVudGlmeSBhPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+CkBAIC0xMjUsNyArMTMzLDcgQEAKIAkgKiBiZSBpbnZva2VkIGlmIG5lZWRpbmcgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGJlZm9yZSBpdCBpcyBleHBsaWNpdGx5IHNldC4KIAkgKiA8cD4KIAkgKiBAcmV0dXJuIElQYXRoIC0gdGhlIGNvbnRhaW5lciBwYXRoIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyCi0JICovCQorCSAqLwogICAgIElQYXRoIGdldFBhdGgoKTsKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoRW50cnkuamF2YQppbmRleCA2OTQ4YzA5Li44Yzg4MmZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoRW50cnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw2NCArMTIsNjQgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIAotLyoqIAorLyoqCiAgKiBBbiBlbnRyeSBvbiBhIEphdmEgcHJvamVjdCBjbGFzc3BhdGggaWRlbnRpZnlpbmcgb25lIG9yIG1vcmUgcGFja2FnZSBmcmFnbWVudAotICogcm9vdHMuIEEgY2xhc3NwYXRoIGVudHJ5IGhhcyBhIGNvbnRlbnQga2luZCAoZWl0aGVyIHNvdXJjZSwgCisgKiByb290cy4gQSBjbGFzc3BhdGggZW50cnkgaGFzIGEgY29udGVudCBraW5kIChlaXRoZXIgc291cmNlLAogICoge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290I0tfU09VUkNFfSwgb3IgYmluYXJ5LCB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3QjS19CSU5BUll9KSwgd2hpY2ggaXMgaW5oZXJpdGVkCiAgKiBieSBlYWNoIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBhbmQgcGFja2FnZSBmcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LgogICogPHA+CiAgKiBBIGNsYXNzcGF0aCBlbnRyeSBjYW4gcmVmZXIgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6PHVsPgotICogCisgKgogICoJPGxpPlNvdXJjZSBjb2RlIGluIHRoZSBjdXJyZW50IHByb2plY3QuIEluIHRoaXMgY2FzZSwgdGhlIGVudHJ5IGlkZW50aWZpZXMgYQogICoJCXJvb3QgZm9sZGVyIGluIHRoZSBjdXJyZW50IHByb2plY3QgY29udGFpbmluZyBwYWNrYWdlIGZyYWdtZW50cyBhbmQKLSAqCQlzb3VyY2UgZmlsZXMgd2l0aCBvbmUgb2YgdGhlIHtAbGluayBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKSAKKyAqCQlzb3VyY2UgZmlsZXMgd2l0aCBvbmUgb2YgdGhlIHtAbGluayBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKQogICoJCUphdmEtbGlrZSBleHRlbnNpb25zfS4gVGhlIHJvb3QgZm9sZGVyIGl0c2VsZiByZXByZXNlbnRzIGEgZGVmYXVsdAogICoJCXBhY2thZ2UsIHN1YmZvbGRlcnMgcmVwcmVzZW50IHBhY2thZ2UgZnJhZ21lbnRzLCBhbmQgZmlsZXMgd2l0aCBhCiAgKiAgICAgSmF2YS1saWtlIGV4dGVuc2lvbiAoZS5nLiA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMpCiAgKgkJcmVwcmVzZW50IGNvbXBpbGF0aW9uIHVuaXRzLiBBbGwgY29tcGlsYXRpb24gdW5pdHMgd2lsbCBiZSBjb21waWxlZCB3aGVuCiAgKiAJCXRoZSBwcm9qZWN0IGlzIGJ1aWx0LiBUaGUgY2xhc3NwYXRoIGVudHJ5IG11c3Qgc3BlY2lmeSB0aGUKLSAqCQlhYnNvbHV0ZSBwYXRoIHRvIHRoZSByb290IGZvbGRlci4gRW50cmllcyBvZiB0aGlzIGtpbmQgYXJlIAorICoJCWFic29sdXRlIHBhdGggdG8gdGhlIHJvb3QgZm9sZGVyLiBFbnRyaWVzIG9mIHRoaXMga2luZCBhcmUKICAqCQlhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayAjQ1BFX1NPVVJDRX0gY29uc3RhbnQuCiAgKiAgICAgIFNvdXJjZSBjbGFzc3BhdGggZW50cmllcyBjYW4gY2FycnkgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gcGF0dGVybnMgZm9yCiAgKiAgICAgIHNlbGVjdGluZyB3aGljaCBzb3VyY2UgZmlsZXMgYXBwZWFyIGFzIGNvbXBpbGF0aW9uCiAgKiAgICAgIHVuaXRzIGFuZCBnZXQgY29tcGlsZWQgd2hlbiB0aGUgcHJvamVjdCBpcyBidWlsdC4KICAqICA8L2xpPgotICogCisgKgogICoJPGxpPkEgYmluYXJ5IGxpYnJhcnkgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCwgaW4gYW5vdGhlciBwcm9qZWN0LCBvciBpbiB0aGUgZXh0ZXJuYWwKICAqCQlmaWxlIHN5c3RlbS4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyeSBpZGVudGlmaWVzIGEgSkFSIChvciByb290IGZvbGRlcikgY29udGFpbmluZwogICoJCXBhY2thZ2UgZnJhZ21lbnRzIGFuZCA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLiAgVGhlIGNsYXNzcGF0aCBlbnRyeQogICoJCW11c3Qgc3BlY2lmeSB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgSkFSIChvciByb290IGZvbGRlciksIGFuZCBpbiBjYXNlIGl0IHJlZmVycwotICoJCXRvIGFuIGV4dGVybmFsIEpBUiwgdGhlbiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHJlc291cmNlIGluIHRoZSB3b3JrYmVuY2guIEVudHJpZXMgCisgKgkJdG8gYW4gZXh0ZXJuYWwgSkFSLCB0aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UgaW4gdGhlIHdvcmtiZW5jaC4gRW50cmllcwogICoJCW9mIHRoaXMga2luZCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgI0NQRV9MSUJSQVJZfSBjb25zdGFudC48L2xpPgotICogCisgKgogICoJPGxpPkEgcmVxdWlyZWQgcHJvamVjdC4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyeSBpZGVudGlmaWVzIGFub3RoZXIgcHJvamVjdCBpbgogICoJCXRoZSB3b3Jrc3BhY2UuIFRoZSByZXF1aXJlZCBwcm9qZWN0IGlzIHVzZWQgYXMgYSBiaW5hcnkgbGlicmFyeSB3aGVuIGNvbXBpbGluZwogICoJCSh0aGF0IGlzLCB0aGUgYnVpbGRlciBsb29rcyBpbiB0aGUgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSByZXF1aXJlZCBwcm9qZWN0CiAgKgkJZm9yIHJlcXVpcmVkIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgd2hlbiBidWlsZGluZykuIFdoZW4gcGVyZm9ybWluZyBvdGhlcgogICoJCSJkZXZlbG9wbWVudCIgb3BlcmF0aW9ucyAtIHN1Y2ggYXMgY29kZSBhc3Npc3QsIGNvZGUgcmVzb2x2ZSwgdHlwZSBoaWVyYXJjaHkKICAqCQljcmVhdGlvbiwgZXRjLiAtIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcHJvamVjdCBpcyByZWZlcnJlZCB0by4gVGh1cywgZGV2ZWxvcG1lbnQKLSAqCQlpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIHJlcXVpcmVkIHByb2plY3QncyBzb3VyY2UgY29kZSwgYW5kIGNvbXBpbGF0aW9uIGlzIAorICoJCWlzIHBlcmZvcm1lZCBhZ2FpbnN0IGEgcmVxdWlyZWQgcHJvamVjdCdzIHNvdXJjZSBjb2RlLCBhbmQgY29tcGlsYXRpb24gaXMKICAqCQlwZXJmb3JtZWQgYWdhaW5zdCBhIHJlcXVpcmVkIHByb2plY3QncyBsYXN0IGJ1aWx0IHN0YXRlLiAgVGhlCiAgKgkJY2xhc3NwYXRoIGVudHJ5IG11c3Qgc3BlY2lmeSB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUKICAqCQlwcm9qZWN0LiBFbnRyaWVzIG9mIHRoaXMga2luZCBhcmUgIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rICNDUEVfUFJPSkVDVH0KLSAqCQljb25zdGFudC4gCi0gKiAJCU5vdGU6IHJlZmVyZW5jaW5nIGEgcmVxdWlyZWQgcHJvamVjdCB3aXRoIGEgY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byB0aGUgc291cmNlIAotICogICAgIGNvZGUgb3IgYXNzb2NpYXRlZCA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGxvY2F0ZWQgaW4gaXRzIG91dHB1dCBsb2NhdGlvbi4gCi0gKiAgICAgSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbnkgb3RoZXIgbGlicmFyaWVzIG9yIHByb2plY3RzIHRoYXQgdGhlIHJlcXVpcmVkIHByb2plY3QncyBjbGFzc3BhdGggCi0gKiAgICAgcmVmZXJzIHRvLCBpZmYgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJpZXMgYXJlIHRhZ2dlZCBhcyBiZWluZyBleHBvcnRlZCAKLSAqICAgICAoe0BsaW5rIElDbGFzc3BhdGhFbnRyeSNpc0V4cG9ydGVkfSkuIAotICogICAgVW5sZXNzIGV4cG9ydGluZyBzb21lIGNsYXNzcGF0aCBlbnRyaWVzLCBjbGFzc3BhdGhzIGFyZSBub3QgY2hhaW5lZCBieSBkZWZhdWx0IC0gCisgKgkJY29uc3RhbnQuCisgKiAJCU5vdGU6IHJlZmVyZW5jaW5nIGEgcmVxdWlyZWQgcHJvamVjdCB3aXRoIGEgY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byB0aGUgc291cmNlCisgKiAgICAgY29kZSBvciBhc3NvY2lhdGVkIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgbG9jYXRlZCBpbiBpdHMgb3V0cHV0IGxvY2F0aW9uLgorICogICAgIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYW55IG90aGVyIGxpYnJhcmllcyBvciBwcm9qZWN0cyB0aGF0IHRoZSByZXF1aXJlZCBwcm9qZWN0J3MgY2xhc3NwYXRoCisgKiAgICAgcmVmZXJzIHRvLCBpZmYgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJpZXMgYXJlIHRhZ2dlZCBhcyBiZWluZyBleHBvcnRlZAorICogICAgICh7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I2lzRXhwb3J0ZWR9KS4KKyAqICAgIFVubGVzcyBleHBvcnRpbmcgc29tZSBjbGFzc3BhdGggZW50cmllcywgY2xhc3NwYXRocyBhcmUgbm90IGNoYWluZWQgYnkgZGVmYXVsdCAtCiAgKiAgICBlYWNoIHByb2plY3QgbXVzdCBzcGVjaWZ5IGl0cyBvd24gY2xhc3NwYXRoIGluIGl0cyBlbnRpcmV0eS48L2xpPgotICogCisgKgogICogIDxsaT4gQSBwYXRoIGJlZ2lubmluZyBpbiBhIGNsYXNzcGF0aCB2YXJpYWJsZSBkZWZpbmVkIGdsb2JhbGx5IHRvIHRoZSB3b3Jrc3BhY2UuCi0gKgkJRW50cmllcyBvZiB0aGlzIGtpbmQgYXJlICBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayAjQ1BFX1ZBUklBQkxFfSBjb25zdGFudC4gIAorICoJCUVudHJpZXMgb2YgdGhpcyBraW5kIGFyZSAgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgI0NQRV9WQVJJQUJMRX0gY29uc3RhbnQuCiAgKiAgICAgIENsYXNzcGF0aCB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgdXNpbmcge0BsaW5rIEphdmFDb3JlI3NldENsYXNzcGF0aFZhcmlhYmxlKFN0cmluZywgSVBhdGgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKX0sCiAgKiAJCWFuZCBnZXRzIHJlc29sdmVkLCB0byBlaXRoZXIgYSBwcm9qZWN0IG9yIGxpYnJhcnkgZW50cnksIHVzaW5nCiAgKiAgICAgIHtAbGluayBKYXZhQ29yZSNnZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSl9LgogICoJCUl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVnaXN0ZXIgYW4gYXV0b21hdGljIGluaXRpYWxpemVyICh7QGxpbmsgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcn0pLAogICogCXdoaWNoIHdpbGwgYmUgaW52b2tlZCB0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiLgogICogCUFmdGVyIHJlc29sdXRpb24sIGEgY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJ5IG1heSBlaXRoZXIgY29ycmVzcG9uZCB0byBhIHByb2plY3Qgb3IgYSBsaWJyYXJ5IGVudHJ5LiA8L2xpPgotICogCisgKgogICogIDxsaT4gQSBuYW1lZCBjbGFzc3BhdGggY29udGFpbmVyIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRhaW5lciBwYXRoLgogICogICAgIEEgY2xhc3NwYXRoIGNvbnRhaW5lciBwcm92aWRlcyBhIHdheSB0byBpbmRpcmVjdGx5IHJlZmVyZW5jZSBhIHNldCBvZiBjbGFzc3BhdGggZW50cmllcyB0aHJvdWdoCiAgKiAgICAgYSBjbGFzc3BhdGggZW50cnkgb2Yga2luZCB7QGxpbmsgI0NQRV9DT05UQUlORVJ9LiBUeXBpY2FsbHksIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW4KQEAgLTc3LDIwICs3NywyMCBAQAogICogICAgIGNvbnNpZGVyaW5nIGFsc28gdGhhdCBjb250YWluZXJzIGNhbiBiZSBtYXBwZWQgZGlmZmVyZW50bHkgb24gZWFjaCBwcm9qZWN0LiBTZXZlcmFsIHByb2plY3RzIGNhbgogICogICAgIHJlZmVyZW5jZSB0aGUgc2FtZSBnZW5lcmljIGNvbnRhaW5lciBwYXRoLCBidXQgaGF2ZSBlYWNoIG9mIHRoZW0gYWN0dWFsbHkgYm91bmQgdG8gYSBkaWZmZXJlbnQKICAqICAgICBjb250YWluZXIgb2JqZWN0LgotICogICAgIFRoZSBjb250YWluZXIgcGF0aCBpcyBhIGZvcm1lZCBieSBhIGZpcnN0IElEIHNlZ21lbnQgZm9sbG93ZWQgd2l0aCBleHRyYSBzZWdtZW50cywgCi0gKiAgICAgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYWRkaXRpb25hbCBoaW50cyBmb3IgcmVzb2x2aW5nIHRoaXMgY29udGFpbmVyIHJlZmVyZW5jZS4gSWYgbm8gY29udGFpbmVyIHdhcyBldmVyIAotICogICAgIHJlY29yZGVkIGZvciB0aGlzIGNvbnRhaW5lciBwYXRoIG9udG8gdGhpcyBwcm9qZWN0ICh1c2luZyB7QGxpbmsgSmF2YUNvcmUjc2V0Q2xhc3NwYXRoQ29udGFpbmVyfSwgCi0gKiAJdGhlbiBhIHtAbGluayBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcn0gd2lsbCBiZSBhY3RpdmF0ZWQgaWYgYW55IHdhcyByZWdpc3RlcmVkIGZvciB0aGlzIAorICogICAgIFRoZSBjb250YWluZXIgcGF0aCBpcyBhIGZvcm1lZCBieSBhIGZpcnN0IElEIHNlZ21lbnQgZm9sbG93ZWQgd2l0aCBleHRyYSBzZWdtZW50cywKKyAqICAgICB3aGljaCBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHZpbmcgdGhpcyBjb250YWluZXIgcmVmZXJlbmNlLiBJZiBubyBjb250YWluZXIgd2FzIGV2ZXIKKyAqICAgICByZWNvcmRlZCBmb3IgdGhpcyBjb250YWluZXIgcGF0aCBvbnRvIHRoaXMgcHJvamVjdCAodXNpbmcge0BsaW5rIEphdmFDb3JlI3NldENsYXNzcGF0aENvbnRhaW5lcn0sCisgKiAJdGhlbiBhIHtAbGluayBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcn0gd2lsbCBiZSBhY3RpdmF0ZWQgaWYgYW55IHdhcyByZWdpc3RlcmVkIGZvciB0aGlzCiAgKiAJY29udGFpbmVyIElEIG9udG8gdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLgogICogCUEgY2xhc3NwYXRoIGNvbnRhaW5lciBlbnRyeSBjYW4gYmUgcmVzb2x2ZWQgZXhwbGljaXRseSB1c2luZyB7QGxpbmsgSmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyfQogICogCWFuZCB0aGUgcmVzdWx0aW5nIGNvbnRhaW5lciBlbnRyaWVzIGNhbiBjb250YWluIGFueSBub24tY29udGFpbmVyIGVudHJ5LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXkgY29udGFpbiB2YXJpYWJsZQotICogICAgIGVudHJpZXMsIHdoaWNoIGluIHR1cm4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGJlaW5nIGRpcmVjdGx5IHVzZWQuIAorICogICAgIGVudHJpZXMsIHdoaWNoIGluIHR1cm4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGJlaW5nIGRpcmVjdGx5IHVzZWQuCiAgKiAJPGJyPiBBbHNvIG5vdGUgdGhhdCB0aGUgY29udGFpbmVyIHJlc29sdXRpb24gQVBJcyBpbmNsdWRlIGFuIElKYXZhUHJvamVjdCBhcmd1bWVudCwgc28gYXMgdG8gYWxsb3cgdGhlIHNhbWUKICAqIAljb250YWluZXIgcGF0aCB0byBiZSBpbnRlcnByZXRlZCBpbiBkaWZmZXJlbnQgd2F5cyBmb3IgZGlmZmVyZW50IHByb2plY3RzLiA8L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZXNvbHZlZENsYXNzcGF0aH0gd2lsbCBoYXZlIGFsbCBlbnRyaWVzIG9mIHR5cGUKLSAqIHtAbGluayAjQ1BFX1ZBUklBQkxFfSBhbmQge0BsaW5rICNDUEVfQ09OVEFJTkVSfSByZXNvbHZlZCB0byBhIHNldCBvZiAKKyAqIHtAbGluayAjQ1BFX1ZBUklBQkxFfSBhbmQge0BsaW5rICNDUEVfQ09OVEFJTkVSfSByZXNvbHZlZCB0byBhIHNldCBvZgogICoge0BsaW5rICNDUEVfU09VUkNFfSwge0BsaW5rICNDUEVfTElCUkFSWX0gb3Ige0BsaW5rICNDUEVfUFJPSkVDVH0KICAqIGNsYXNzcGF0aCBlbnRyaWVzLgogICogPHA+CkBAIC0xMDEsNyArMTAxLDYgQEAKICAqIGNsYXNzcGF0aCBlbnRyaWVzLiBUaGUgcHJvamVjdCdzIG91dHB1dCBmb2xkZXIocykgYXJlIGFsd2F5cyBsaXN0ZWQgZmlyc3QsCiAgKiBmb2xsb3dlZCBieSB0aGUgYW55IGV4cG9ydGVkIGVudHJpZXMuCiAgKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICogQ2xhc3NwYXRoIGVudHJpZXMgY2FuIGJlIGNyZWF0ZWQgdmlhIG1ldGhvZHMgb24ge0BsaW5rIEphdmFDb3JlfS4KICAqIDwvcD4KICAqCkBAIC0xMTIsNiArMTExLDcgQEAKICAqIEBzZWUgSmF2YUNvcmUjbmV3Q29udGFpbmVyRW50cnkob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQogICogQHNlZSBDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyCiAgKiBAc2VlIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aEVudHJ5IHsKIApAQCAtMTQ0LDE2ICsxNDQsMTYgQEAKIAkvKioKIAkgKiBFbnRyeSBraW5kIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBjbGFzc3BhdGggZW50cnkgcmVwcmVzZW50aW5nCiAJICogYSBuYW1lIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCisJICoKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJaW50IENQRV9DT05UQUlORVIgPSA1OwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3MgcnVsZXMgb2YgdGhlIHByb2plY3QncyBleHBvcnRlZCBlbnRyaWVzIHNob3VsZCBiZSBjb21iaW5lZCB3aXRoIHRoaXMgZW50cnkncyBhY2Nlc3MgcnVsZXMuCiAJICogUmV0dXJucyB0cnVlIGZvciBjb250YWluZXIgZW50cmllcy4KIAkgKiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gd2hldGhlciB0aGUgYWNjZXNzIHJ1bGVzIG9mIHRoZSBwcm9qZWN0J3MgZXhwb3J0ZWQgZW50cmllcyBzaG91bGQgYmUgY29tYmluZWQgd2l0aCB0aGlzIGVudHJ5J3MgYWNjZXNzIHJ1bGVzCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIGFjY2VzcyBydWxlcyBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgYWNjZXNzIHJ1bGVzIGZvciB0aGlzIGVudHJ5CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMjA4LDEwICsyMDgsMTAgQEAKIAkgKiBhcmUgc3BlY2lmaWVkLCB0aGlzIHNvdXJjZSBlbnRyeSBpbmNsdWRlcyBhbGwgcmVsZXZlbnQgZmlsZXMuIEVhY2ggcGF0aAogCSAqIHNwZWNpZmllZCBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aCwgYW5kIHdpbGwgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUKIAkgKiB0byB0aGlzIHNvdXJjZSBlbnRyeSdzIHBhdGguIEZpbGUgcGF0dGVybnMgYXJlIGNhc2Utc2Vuc2l0aXZlLiBBIGZpbGUKLQkgKiBtYXRjaGVkIGJ5IG9uZSBvciBtb3JlIG9mIHRoZXNlIHBhdHRlcm5zIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIAorCSAqIG1hdGNoZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlc2UgcGF0dGVybnMgaXMgZXhjbHVkZWQgZnJvbSB0aGUKIAkgKiBjb3JyZXNwb25kaW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KIAkgKiBFeGNsdXNpb24gcGF0dGVybnMgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGluY2x1c2lvbiBwYXR0ZXJuczsKLQkgKiBpbiBvdGhlciB3b3JkcywgZXhjbHVzaW9uIHBhdHRlcm5zIGNhbiByZW1vdmUgZmlsZXMgZm9yIHRoZSBvbmVzIHRoYXQgCisJICogaW4gb3RoZXIgd29yZHMsIGV4Y2x1c2lvbiBwYXR0ZXJucyBjYW4gcmVtb3ZlIGZpbGVzIGZvciB0aGUgb25lcyB0aGF0CiAJICogYXJlIHRvIGJlIGluY2x1ZGVkLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuCiAJICogPC9wPgogCSAqIDxwPgpAQCAtMjMwLDggKzIzMCw4IEBACiAJICogKGRvZXMgbm90IGVuZCB3aXRoIDxjb2RlPi5qYXZhPC9jb2RlPikuCiAJICogPC9wPgogCSAqIDxwPgotCSAqICc/JyBtYXRjaGVzIDEgY2hhcmFjdGVyIHdpdGhpbiBhIHNlZ21lbnQuIFNvIDxjb2RlPj8uamF2YTwvY29kZT4gCi0JICogbWF0Y2hlcyA8Y29kZT5hLmphdmE8L2NvZGU+LCA8Y29kZT5BLmphdmE8L2NvZGU+LCAKKwkgKiAnPycgbWF0Y2hlcyAxIGNoYXJhY3RlciB3aXRoaW4gYSBzZWdtZW50LiBTbyA8Y29kZT4/LmphdmE8L2NvZGU+CisJICogbWF0Y2hlcyA8Y29kZT5hLmphdmE8L2NvZGU+LCA8Y29kZT5BLmphdmE8L2NvZGU+LAogCSAqIGJ1dCBub3QgPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPnh5ei5qYXZhPC9jb2RlPiAobmVpdGhlciBoYXZlCiAJICoganVzdCBvbmUgY2hhcmFjdGVyIGJlZm9yZSA8Y29kZT4uamF2YTwvY29kZT4pLgogCSAqIDwvcD4KQEAgLTI0OCw0OCArMjQ4LDQ4IEBACiAJICogRXhhbXBsZSBwYXR0ZXJucyBpbiBzb3VyY2UgZW50cmllcyAoYXNzdW1pbmcgdGhhdCAiamF2YSIgaXMgdGhlIG9ubHkge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpIEphdmEtbGlrZSBleHRlbnNpb259KToKIAkgKiA8dWw+CiAJICogPGxpPgotCSAqIDxjb2RlPnRlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+IChvciBzaW1wbHkgPGNvZGU+dGVzdHMvPC9jb2RlPikgCisJICogPGNvZGU+dGVzdHMvJiM0MjsmIzQyOzwvY29kZT4gKG9yIHNpbXBseSA8Y29kZT50ZXN0cy88L2NvZGU+KQogCSAqIG1hdGNoZXMgYWxsIGZpbGVzIHVuZGVyIGEgcm9vdCBmb2xkZXIKIAkgKiBuYW1lZCA8Y29kZT50ZXN0czwvY29kZT4uIFRoaXMgaW5jbHVkZXMgPGNvZGU+dGVzdHMvRm9vLmphdmE8L2NvZGU+Ci0JICogYW5kIDxjb2RlPnRlc3RzL2NvbS9leGFtcGxlL0Zvby5qYXZhPC9jb2RlPiwgYnV0IG5vdCAKKwkgKiBhbmQgPGNvZGU+dGVzdHMvY29tL2V4YW1wbGUvRm9vLmphdmE8L2NvZGU+LCBidXQgbm90CiAJICogPGNvZGU+Y29tL2V4YW1wbGUvdGVzdHMvRm9vLmphdmE8L2NvZGU+IChub3QgdW5kZXIgYSByb290IGZvbGRlciBuYW1lZAogCSAqIDxjb2RlPnRlc3RzPC9jb2RlPikuCiAJICogPC9saT4KIAkgKiA8bGk+Ci0JICogPGNvZGU+dGVzdHMvJiM0Mjs8L2NvZGU+IG1hdGNoZXMgYWxsIGZpbGVzIGRpcmVjdGx5IGJlbG93IGEgcm9vdCAKKwkgKiA8Y29kZT50ZXN0cy8mIzQyOzwvY29kZT4gbWF0Y2hlcyBhbGwgZmlsZXMgZGlyZWN0bHkgYmVsb3cgYSByb290CiAJICogZm9sZGVyIG5hbWVkIDxjb2RlPnRlc3RzPC9jb2RlPi4gVGhpcyBpbmNsdWRlcyA8Y29kZT50ZXN0cy9Gb28uamF2YTwvY29kZT4KIAkgKiBhbmQgPGNvZGU+dGVzdHMvRm9vSGVscC5qYXZhPC9jb2RlPgogCSAqIGJ1dCBub3QgPGNvZGU+dGVzdHMvY29tL2V4YW1wbGUvRm9vLmphdmE8L2NvZGU+IChub3QgZGlyZWN0bHkgdW5kZXIKLQkgKiBhIGZvbGRlciBuYW1lZCA8Y29kZT50ZXN0czwvY29kZT4pIG9yIAorCSAqIGEgZm9sZGVyIG5hbWVkIDxjb2RlPnRlc3RzPC9jb2RlPikgb3IKIAkgKiA8Y29kZT5jb20vRm9vLmphdmE8L2NvZGU+IChub3QgdW5kZXIgYSBmb2xkZXIgbmFtZWQgPGNvZGU+dGVzdHM8L2NvZGU+KS4KIAkgKiA8L2xpPgogCSAqIDxsaT4KIAkgKiA8Y29kZT4mIzQyOyYjNDI7L3Rlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+IG1hdGNoZXMgYWxsIGZpbGVzIHVuZGVyIGFueQogCSAqIGZvbGRlciBuYW1lZCA8Y29kZT50ZXN0czwvY29kZT4uIFRoaXMgaW5jbHVkZXMgPGNvZGU+dGVzdHMvRm9vLmphdmE8L2NvZGU+LAotCSAqIDxjb2RlPmNvbS9leGFtcGxlcy90ZXN0cy9Gb28uamF2YTwvY29kZT4sIGFuZCAKLQkgKiA8Y29kZT5jb20vZXhhbXBsZXMvdGVzdHMvdW5pdC9Gb28uamF2YTwvY29kZT4sIGJ1dCBub3QgCisJICogPGNvZGU+Y29tL2V4YW1wbGVzL3Rlc3RzL0Zvby5qYXZhPC9jb2RlPiwgYW5kCisJICogPGNvZGU+Y29tL2V4YW1wbGVzL3Rlc3RzL3VuaXQvRm9vLmphdmE8L2NvZGU+LCBidXQgbm90CiAJICogPGNvZGU+Y29tL2V4YW1wbGUvRm9vLmphdmE8L2NvZGU+IChub3QgdW5kZXIgYSBmb2xkZXIgbmFtZWQKIAkgKiA8Y29kZT50ZXN0czwvY29kZT4pLgogCSAqIDwvbGk+CiAJICogPC91bD4KIAkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcG9zc2libHkgZW1wdHkgbGlzdCBvZiByZXNvdXJjZSBleGNsdXNpb24gcGF0dGVybnMgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIHJlc291cmNlIGV4Y2x1c2lvbiBwYXR0ZXJucwogCSAqICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3NwYXRoIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGtpbmQKIAkgKiAgIG9mIGNsYXNzcGF0aCBlbnRyeSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBwYXR0ZXJucwogCSAqIEBzaW5jZSAyLjEKIAkgKi8KIAlJUGF0aFtdIGdldEV4Y2x1c2lvblBhdHRlcm5zKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleHRyYSBjbGFzc3BhdGggYXR0cmlidXRlcyBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBlbnRyeQogCSAqIGhhcyBubyBleHRyYSBhdHRyaWJ1dGVzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBleHRyYSBjbGFzc3BhdGggYXR0cmlidXRlcyBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGdldEV4dHJhQXR0cmlidXRlcygpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc2V0IG9mIHBhdHRlcm5zIHVzZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgcmVzb3VyY2VzIG9yIGNsYXNzZXMKIAkgKiB0byBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgY2xhc3NwYXRoIGVudHJ5LgpAQCAtMzMzLDggKzMzMyw4IEBACiAJICogPC9saT4KIAkgKiA8L3VsPgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIHJlc291cmNlIGluY2x1c2lvbiBwYXR0ZXJucyAKKwkgKgorCSAqIEByZXR1cm4gdGhlIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgcmVzb3VyY2UgaW5jbHVzaW9uIHBhdHRlcm5zCiAJICogICBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzc3BhdGggZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMga2luZAogCSAqICAgb2YgY2xhc3NwYXRoIGVudHJ5IGRvZXMgbm90IHN1cHBvcnQgaW5jbHVzaW9uIHBhdHRlcm5zCiAJICogQHNpbmNlIDMuMApAQCAtMzQyLDggKzM0Miw4IEBACiAJSVBhdGhbXSBnZXRJbmNsdXNpb25QYXR0ZXJucygpOwogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzcGVjaWZpYyBsb2NhdGlvbiB3aGVyZSB0aGUgYnVpbGRlciB3cml0ZXMgCi0JICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBnZW5lcmF0ZWQgZm9yIHRoaXMgc291cmNlIGVudHJ5IAorCSAqIFJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgc3BlY2lmaWMgbG9jYXRpb24gd2hlcmUgdGhlIGJ1aWxkZXIgd3JpdGVzCisJICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBnZW5lcmF0ZWQgZm9yIHRoaXMgc291cmNlIGVudHJ5CiAJICogKGVudHJ5IGtpbmQge0BsaW5rICNDUEVfU09VUkNFfSkuCiAJICogPHA+CiAJICogU291cmNlIGVudHJpZXMgY2FuIG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uLgpAQCAtMzUyLDM1ICszNTIsMzUgQEAKIAkgKiA8L3A+PHA+CiAJICogTk9URTogQSBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24gY2Fubm90IGNvaW5jaWRhdGUgd2l0aCBhbm90aGVyIHNvdXJjZS9saWJyYXJ5IGVudHJ5LgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHBhdGggdG8gdGhlIHNwZWNpZmljIGxvY2F0aW9uIHdoZXJlIHRoZSBidWlsZGVyIHdyaXRlcyAKKwkgKgorCSAqIEByZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byB0aGUgc3BlY2lmaWMgbG9jYXRpb24gd2hlcmUgdGhlIGJ1aWxkZXIgd3JpdGVzCiAJICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBmb3IgdGhpcyBzb3VyY2UgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogaWYgdXNpbmcgZGVmYXVsdCBvdXRwdXQgZm9sZGVyCiAJICogQHNpbmNlIDIuMQogCSAqLwogCUlQYXRoIGdldE91dHB1dExvY2F0aW9uKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoaXMgY2xhc3NwYXRoIGVudHJ5LgogCSAqCiAJICogVGhlIG1lYW5pbmcgb2YgdGhlIHBhdGggb2YgYSBjbGFzc3BhdGggZW50cnkgZGVwZW5kcyBvbiBpdHMgZW50cnkga2luZDo8dWw+Ci0JICoJPGxpPlNvdXJjZSBjb2RlIGluIHRoZSBjdXJyZW50IHByb2plY3QgKHtAbGluayAjQ1BFX1NPVVJDRX0pIC0gIAorCSAqCTxsaT5Tb3VyY2UgY29kZSBpbiB0aGUgY3VycmVudCBwcm9qZWN0ICh7QGxpbmsgI0NQRV9TT1VSQ0V9KSAtCiAJICogICAgICBUaGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeSBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcm9vdCBmb2xkZXIuIDwvbGk+CiAJICoJPGxpPkEgYmluYXJ5IGxpYnJhcnkgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCAoe0BsaW5rICNDUEVfTElCUkFSWX0pIC0gdGhlIHBhdGgKLQkgKgkJYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50cnkgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIEpBUiAob3Igcm9vdCBmb2xkZXIpLCBhbmQgCi0JICoJCWluIGNhc2UgaXQgcmVmZXJzIHRvIGFuIGV4dGVybmFsIEpBUiwgdGhlbiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHJlc291cmNlIGluIAorCSAqCQlhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeSBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgSkFSIChvciByb290IGZvbGRlciksIGFuZAorCSAqCQlpbiBjYXNlIGl0IHJlZmVycyB0byBhbiBleHRlcm5hbCBsaWJyYXJ5LCB0aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UgaW4KIAkgKgkJdGhlIHdvcmtiZW5jaC4KIAkgKgk8bGk+QSByZXF1aXJlZCBwcm9qZWN0ICh7QGxpbmsgI0NQRV9QUk9KRUNUfSkgLSB0aGUgcGF0aCBvZiB0aGUgZW50cnkgZGVub3RlcyB0aGUKIAkgKgkJcGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IHJlc291cmNlLjwvbGk+Ci0JICogIDxsaT5BIHZhcmlhYmxlIGVudHJ5ICh7QGxpbmsgI0NQRV9WQVJJQUJMRX0pIC0gdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGggCisJICogIDxsaT5BIHZhcmlhYmxlIGVudHJ5ICh7QGxpbmsgI0NQRV9WQVJJQUJMRX0pIC0gdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGgKIAkgKiAgICAgIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLiBJZiB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZQogCSAqCQlpcyBib3VuZCB0byB0aGUgcGF0aCA8aT5QPC9pPiwgdGhlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJ5CiAJICoJCWlzIGNvbXB1dGVkIGJ5IGFwcGVuZGluZyB0byA8aT5QPC9pPiB0aGUgc2VnbWVudHMgb2YgdGhlIHJldHVybmVkCiAJICoJCXBhdGggd2l0aG91dCB0aGUgdmFyaWFibGUuPC9saT4KIAkgKiAgPGxpPiBBIGNvbnRhaW5lciBlbnRyeSAoe0BsaW5rICNDUEVfQ09OVEFJTkVSfSkgLSB0aGUgcGF0aCBvZiB0aGUgZW50cnkKLQkgKiAJaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCBjb250YWluZXIsIHdoaWNoIGNhbiBiZSBib3VuZCBpbmRpcmVjdGx5IHRvIGEgc2V0IG9mIGNsYXNzcGF0aCAKLQkgKiAJZW50cmllcyBhZnRlciByZXNvbHV0aW9uLiBUaGUgY29udGFpbmVyUGF0aCBpcyBhIGZvcm1lZCBieSBhIGZpcnN0IElEIHNlZ21lbnQgZm9sbG93ZWQgd2l0aCAKLQkgKiAgICAgZXh0cmEgc2VnbWVudHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHZpbmcgdGhpcyBjb250YWluZXIgCisJICogCWlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLCB3aGljaCBjYW4gYmUgYm91bmQgaW5kaXJlY3RseSB0byBhIHNldCBvZiBjbGFzc3BhdGgKKwkgKiAJZW50cmllcyBhZnRlciByZXNvbHV0aW9uLiBUaGUgY29udGFpbmVyUGF0aCBpcyBhIGZvcm1lZCBieSBhIGZpcnN0IElEIHNlZ21lbnQgZm9sbG93ZWQgd2l0aAorCSAqICAgICBleHRyYSBzZWdtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGFkZGl0aW9uYWwgaGludHMgZm9yIHJlc29sdmluZyB0aGlzIGNvbnRhaW5lcgogCSAqIAlyZWZlcmVuY2UgKGFsc28gc2VlIHtAbGluayBJQ2xhc3NwYXRoQ29udGFpbmVyfSkuCiAJICogPC9saT4KIAkgKiA8L3VsPgpAQCAtMzk2LDkgKzM5Niw5IEBACiAJICogPHA+CiAJICogT25seSBsaWJyYXJ5IGFuZCB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcyBtYXkgaGF2ZSBzb3VyY2UgYXR0YWNobWVudHMuCiAJICogRm9yIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJpZXMsIHRoZSByZXN1bHQgcGF0aCAoaWYgcHJlc2VudCkgbG9jYXRlcyBhIHNvdXJjZQotCSAqIGFyY2hpdmUgb3IgZm9sZGVyLiBUaGlzIGFyY2hpdmUgb3IgZm9sZGVyIGNhbiBiZSBsb2NhdGVkIGluIGEgcHJvamVjdCBvZiB0aGUgCi0JICogd29ya3NwYWNlIG9yIG91dHNpZGUgdGhyIHdvcmtzcGFjZS4gRm9yIHZhcmlhYmxlIGNsYXNzcGF0aCBlbnRyaWVzLCB0aGUgCi0JICogcmVzdWx0IHBhdGggKGlmIHByZXNlbnQpIGhhcyBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUgCisJICogYXJjaGl2ZSBvciBmb2xkZXIuIFRoaXMgYXJjaGl2ZSBvciBmb2xkZXIgY2FuIGJlIGxvY2F0ZWQgaW4gYSBwcm9qZWN0IG9mIHRoZQorCSAqIHdvcmtzcGFjZSBvciBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuIEZvciB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcywgdGhlCisJICogcmVzdWx0IHBhdGggKGlmIHByZXNlbnQpIGhhcyBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUKIAkgKiB2YXJpYWJsZSBwYXRoLCBuYW1lbHkgdGhlIGZpcnN0IHNlZ21lbnQgaXMgdGhlIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUuCiAJICogPC9wPgogCSAqCkBAIC00MTAsMjggKzQxMCw1MCBAQAogCSAqIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIgd2hlcmUgcGFja2FnZSBmcmFnbWVudHMKIAkgKiBhcmUgbG9jYXRlZC4gQW4gZW1wdHkgcGF0aCBpbmRpY2F0ZXMgdGhhdCBwYWNrYWdlcyBhcmUgbG9jYXRlZCBhdAogCSAqIHRoZSByb290IG9mIHRoZSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIuIFJldHVybnMgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUKLQkgKiBpZiBhbmQgb25seSBpZiB7QGxpbmsgI2dldFNvdXJjZUF0dGFjaG1lbnRQYXRofSByZXR1cm5zIAorCSAqIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjZ2V0U291cmNlQXR0YWNobWVudFBhdGh9IHJldHVybnMKIAkgKiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KIAkgKgogCSAqIEByZXR1cm4gdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCiAJICogICAgbm90IGFwcGxpY2FibGUKIAkgKi8KIAlJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKKwogCQogCS8qKgorCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGlzIG1ha2luZyBhIHJlZmVyZW5jZSB0byB0aGlzIGNsYXNzcGF0aCBlbnRyeS4gRm9yIGVudHJ5IGtpbmRzIAorCSAqIHtAbGluayAjQ1BFX0xJQlJBUll9LCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBlbnRyeSB0aGF0IGlzIHJlcHJlc2VudGluZyB0aGUgSkFSIHRoYXQgaW5jbHVkZXMgCisJICogPGNvZGU+dGhpczwvY29kZT4gaW4gdGhlIE1BTklGRVNULk1GIGZpbGUncyBDbGFzcy1QYXRoIHNlY3Rpb24uIEZvciBlbnRyeSBraW5kcyBvdGhlciB0aGFuIAorCSAqIHtAbGluayAjQ1BFX0xJQlJBUll9LCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIEZvciB0aG9zZSBlbnRyaWVzIHRoYXQgYXJlIG9uIHRoZSByYXcgY2xhc3NwYXRoIGFscmVhZHksIAorCSAqIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gIAorCSAqIDxwPgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgbXVsdGlwbGUgbGlicmFyeSBlbnRyaWVzIHJlZmVyIHRvIHRoZSBzYW1lIGVudHJ5CisJICogdmlhIHRoZSBNQU5JRkVTVC5NRiBmaWxlLiBJbiB0aG9zZSBjYXNlcywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgY2xhc3NwYXRoIGVudHJ5IAorCSAqIHRoYXQgYXBwZWFycyBpbiB0aGUgcmF3IGNsYXNzcGF0aC4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIG90aGVyIHJlZmVyZW5jaW5nIAorCSAqIGVudHJpZXMgZG8gbm90IHJlbGF0ZSB0byB0aGVpciByZWZlcmVuY2VkIGVudHJpZXMuIAorCSAqIFNlZSB7QGxpbmsgSmF2YUNvcmUjZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5LCBJSmF2YVByb2plY3QpfSBmb3IgCisJICogbW9yZSBkZXRhaWxzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBpcyByZWZlcmVuY2luZyB0aGlzIGVudHJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqIAkJbm90IGFwcGxpY2FibGUuCisJICogQHNpbmNlIDMuNgorCSAqLworCUlDbGFzc3BhdGhFbnRyeSBnZXRSZWZlcmVuY2luZ0VudHJ5KCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBleHBvcnRlZCB0byBkZXBlbmRlbnQgcHJvamVjdHMuCiAJICogQWx3YXlzIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBzb3VyY2UgZW50cmllcyAoa2luZAogCSAqIHtAbGluayAjQ1BFX1NPVVJDRX0pLCB3aGljaCBjYW5ub3QgYmUgZXhwb3J0ZWQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGV4cG9ydGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlib29sZWFuIGlzRXhwb3J0ZWQoKTsKLQkKKwogCS8qKgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgZGVub3RlZCAKLQkgKiBieSBhbiBlbnRyeSAoaWYgaXQgaXMgYSB2YXJpYWJsZSBlbnRyeSkuIEl0IGlzIG9idGFpbmVkIGJ5IHJlc29sdmluZyB0aGUgdmFyaWFibGUgCi0JICogcmVmZXJlbmNlIGluIHRoZSBmaXJzdCBzZWdtZW50LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZXNvbHZlIHVzaW5nIAorCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgZGVub3RlZAorCSAqIGJ5IGFuIGVudHJ5IChpZiBpdCBpcyBhIHZhcmlhYmxlIGVudHJ5KS4gSXQgaXMgb2J0YWluZWQgYnkgcmVzb2x2aW5nIHRoZSB2YXJpYWJsZQorCSAqIHJlZmVyZW5jZSBpbiB0aGUgZmlyc3Qgc2VnbWVudC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gcmVzb2x2ZSB1c2luZwogCSAqIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgogCSAqIDx1bD4KIAkgKiA8bGk+IGlmIHZhcmlhYmxlIHNlZ21lbnQgY2Fubm90IGJlIHJlc29sdmVkLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KQEAgLTQ0NCwxMCArNDY2LDEwIEBACiAJICogPHA+CiAJICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbGlicmFyeSBvciBwcm9qZWN0IGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgIGlmIHRoZSBnaXZlbiBwYXRoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhIGNsYXNzcGF0aCBlbnRyeQotCSAqCTxwPiAKKwkgKgk8cD4KIAkgKiBOb3RlIHRoYXQgdGhpcyBkZXByZWNhdGVkIEFQSSBkb2Vzbid0IGhhbmRsZSBDUEVfQ09OVEFJTkVSIGVudHJpZXMuCi0JICogCisJICoKIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFDb3JlI2dldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5KX0gaW5zdGVhZAogCSAqLwotCUlDbGFzc3BhdGhFbnRyeSBnZXRSZXNvbHZlZEVudHJ5KCk7CQorCUlDbGFzc3BhdGhFbnRyeSBnZXRSZXNvbHZlZEVudHJ5KCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUFzc2lzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVBc3Npc3QuamF2YQppbmRleCAxMTQxMGRkLi43N2YxNGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUFzc2lzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQXNzaXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTIgKzEwLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKwogLyoqCiAgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHNvdXJjZSBjb2RlIGFzc2lzdCBhbmQgY29kZQogICogcmVzb2x2ZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDb2RlQXNzaXN0IHsKIApAQCAtMjUsNyArMjYsNyBAQAogCSAqIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIsIGFmdGVyIHdoaWNoIGNvZGUgYXNzaXN0IGlzIGRlc2lyZWQuCiAJICogQW4gPGNvZGU+b2Zmc2V0PC9jb2RlPiBvZiAtMSBpbmRpY2F0ZXMgdG8gY29kZSBhc3Npc3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzCiAJICogY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbgogCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yCiAJICoKQEAgLTYxLDcgKzYyLDcgQEAKICAJICovCiAJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUGVyZm9ybXMgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LAogCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4gVGhlIDxjb2RlPm9mZnNldDwvY29kZT4KQEAgLTkwLDcgKzkxLDUwIEBACiAJICogaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciwgYWZ0ZXIgd2hpY2ggY29kZSBhc3Npc3QgaXMgZGVzaXJlZC4KIAkgKiBBbiA8Y29kZT5vZmZzZXQ8L2NvZGU+IG9mIC0xIGluZGljYXRlcyB0byBjb2RlIGFzc2lzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKIAkgKiBjb21waWxhdGlvbiB1bml0LgotCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLCAKKwkgKiA8cD4KKwkgKiA8cD4KKwkgKiBJZiB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gc29tZSBwcm9wb3NhbHMgd2hpY2gKKwkgKiBjYW4gYmUgdmVyeSBsb25nIHRvIGNvbXB1dGUgYXJlIHByb3Bvc2VkLiBUbyBhdm9pZCB0aGF0IHRoZSBjb2RlIGFzc2lzdCBvcGVyYXRpb24KKwkgKiB0YWtlIHRvbyBtdWNoIHRpbWUgYSB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gd2hpY2ggYXV0b21hdGljYWxseSBjYW5jZWwgdGhlIGNvZGUKKwkgKiBhc3Npc3Qgb3BlcmF0aW9uIHdoZW4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaXMgcmVhY2hlZCBjb3VsZCBiZSB1c2VkLgorCSAqIAorCSAqIDxwcmU+CisJICogbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisJICogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBUSU1FT1VUID0gNTAwOyAvL21zCisJICogICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lOworCSAqICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKwkgKiAgICAgICAgIGZFbmRUaW1lPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7CisJICogICAgIH0KKwkgKiAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKwkgKiAgICAgICAgIHJldHVybiBlbmRUaW1lIDw9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCSAqICAgICB9CisJICogICAgIC4uLgorCSAqIH07CisJICogPC9wcmU+CisJICogPHA+CisJICoKKwkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24KKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3RvcgorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSBhc3Npc3QgY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOjx1bD4KKwkgKiAgPGxpPlRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogIDxsaT4gVGhlIHBvc2l0aW9uIHNwZWNpZmllZCBpcyA8IC0xIG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQncworCSAqICAgICAgc291cmNlIGxlbmd0aCAoSU5ERVhfT1VUX09GX0JPVU5EUykKKwkgKiA8L3VsPgorCSAqCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cmVxdWVzdG9yPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBzaW5jZSAzLjUKKyAJICovCisJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFBlcmZvcm1zIGNvZGUgY29tcGxldGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHBvc2l0aW9uIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCwKKwkgKiByZXBvcnRpbmcgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IuIFRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+CisJICogaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciwgYWZ0ZXIgd2hpY2ggY29kZSBhc3Npc3QgaXMgZGVzaXJlZC4KKwkgKiBBbiA8Y29kZT5vZmZzZXQ8L2NvZGU+IG9mIC0xIGluZGljYXRlcyB0byBjb2RlIGFzc2lzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKKwkgKiBjb21waWxhdGlvbiB1bml0LgorCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLAogCSAqIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKIAkgKiBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgpAQCAtMTIwLDcgKzE2NCw3IEBACiAJICogaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciwgYWZ0ZXIgd2hpY2ggY29kZSBhc3Npc3QgaXMgZGVzaXJlZC4KIAkgKiBBbiA8Y29kZT5vZmZzZXQ8L2NvZGU+IG9mIC0xIGluZGljYXRlcyB0byBjb2RlIGFzc2lzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKIAkgKiBjb21waWxhdGlvbiB1bml0LgotCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLCAKKwkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywKIAkgKiB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCiAJICogaW4gdGhlIHdvcmtzcGFjZS4KIAkgKiA8cD4KQEAgLTE0MiwxNiArMTg2LDY2IEBACiAJICovCiAJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUGVyZm9ybXMgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LAorCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4gVGhlIDxjb2RlPm9mZnNldDwvY29kZT4KKwkgKiBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLCBhZnRlciB3aGljaCBjb2RlIGFzc2lzdCBpcyBkZXNpcmVkLgorCSAqIEFuIDxjb2RlPm9mZnNldDwvY29kZT4gb2YgLTEgaW5kaWNhdGVzIHRvIGNvZGUgYXNzaXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcworCSAqIGNvbXBpbGF0aW9uIHVuaXQuCisJICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsCisJICogdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworCSAqIGluIHRoZSB3b3Jrc3BhY2UuCisJICogPHA+CisJICogTm90ZSB0aGF0IGlmIGEgd29ya2luZyBjb3B5IGlzIGVtcHR5LCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgorCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYge0BsaW5rIElQcm9ncmVzc01vbml0b3J9IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHNvbWUgcHJvcG9zYWxzIHdoaWNoCisJICogY2FuIGJlIHZlcnkgbG9uZyB0byBjb21wdXRlIGFyZSBwcm9wb3NlZC4gVG8gYXZvaWQgdGhhdCB0aGUgY29kZSBhc3Npc3Qgb3BlcmF0aW9uCisJICogdGFrZSB0b28gbXVjaCB0aW1lIGEge0BsaW5rIElQcm9ncmVzc01vbml0b3J9IHdoaWNoIGF1dG9tYXRpY2FsbHkgY2FuY2VsIHRoZSBjb2RlCisJICogYXNzaXN0IG9wZXJhdGlvbiB3aGVuIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGlzIHJlYWNoZWQgY291bGQgYmUgdXNlZC4KKwkgKiAKKwkgKiA8cHJlPgorCSAqIG5ldyBJUHJvZ3Jlc3NNb25pdG9yKCkgeworCSAqICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRU9VVCA9IDUwMDsgLy9tcworCSAqICAgICBwcml2YXRlIGxvbmcgZW5kVGltZTsKKwkgKiAgICAgcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7CisJICogICAgICAgICBmRW5kVGltZT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOworCSAqICAgICB9CisJICogICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisJICogICAgICAgICByZXR1cm4gZW5kVGltZSA8PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkgKiAgICAgfQorCSAqICAgICAuLi4KKwkgKiB9OworCSAqIDwvcHJlPgorCSAqIDxwPgorCSAqCisJICogQHBhcmFtIG9mZnNldCB0aGUgZ2l2ZW4gb2Zmc2V0IHBvc2l0aW9uCisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IKKwkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcworCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgYXNzaXN0IGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIFJlYXNvbnMgaW5jbHVkZTo8dWw+CisJICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqICA8bGk+IFRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaXMgPCAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhpcyBjb21waWxhdGlvbiB1bml0J3MKKwkgKiAgICAgIHNvdXJjZSBsZW5ndGggKElOREVYX09VVF9PRl9CT1VORFMpCisJICogPC91bD4KKwkgKgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnJlcXVlc3RvcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAc2luY2UgMy41CisJICovCisJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0ZWQgdGV4dCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIAotCSAqIFRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBzZWxlY3RlZCBjaGFyYWN0ZXIuIAorCSAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0ZWQgdGV4dCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisJICogVGhlIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGZpcnN0IHNlbGVjdGVkIGNoYXJhY3Rlci4KIAkgKiBUaGUgPGNvZGU+bGVuZ3RoPC9jb2RlPiBpcyB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMuCiAJICogPHA+Ci0JICogTm90ZSB0aGF0IGlmIHRoZSA8Y29kZT5sZW5ndGg8L2NvZGU+IGlzIDAgYW5kIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGluc2lkZSBhbiBpZGVudGlmaWVyIAorCSAqIE5vdGUgdGhhdCBpZiB0aGUgPGNvZGU+bGVuZ3RoPC9jb2RlPiBpcyAwIGFuZCB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBpbnNpZGUgYW4gaWRlbnRpZmllcgogCSAqIG9yIHRoZSBpbmRleCBqdXN0IGFmdGVyIGFuIGlkZW50aWZpZXIgdGhlbiB0aGlzIGlkZW50aWZpZXIgaXMgY29uc2lkZXJlZCBhcyB0aGUgc2VsZWN0aW9uLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbgogCSAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzCiAJICogQHJldHVybiB0aGUgSmF2YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzZWxlY3RlZCB0ZXh0CkBAIC0xNjYsMjEgKzI2MCwyMSBAQAogCSAqLwogCUlKYXZhRWxlbWVudFtdIGNvZGVTZWxlY3QoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNlbGVjdGVkIHRleHQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LiAKLQkgKiBUaGUgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgZmlyc3Qgc2VsZWN0ZWQgY2hhcmFjdGVyLiAKKwkgKiBSZXR1cm5zIHRoZSBKYXZhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNlbGVjdGVkIHRleHQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorCSAqIFRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBzZWxlY3RlZCBjaGFyYWN0ZXIuCiAJICogVGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gaXMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzLgotCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLCAKKwkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywKIAkgKiB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCiAJICogaW4gdGhlIHdvcmtzcGFjZS4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgaWYgdGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gaXMgMCBhbmQgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgaW5zaWRlIGFuIGlkZW50aWZpZXIgCisJICogTm90ZSB0aGF0IGlmIHRoZSA8Y29kZT5sZW5ndGg8L2NvZGU+IGlzIDAgYW5kIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGluc2lkZSBhbiBpZGVudGlmaWVyCiAJICogb3IgdGhlIGluZGV4IGp1c3QgYWZ0ZXIgYW4gaWRlbnRpZmllciB0aGVuIHRoaXMgaWRlbnRpZmllciBpcyBjb25zaWRlcmVkIGFzIHRoZSBzZWxlY3Rpb24uCiAJICogPC9wPgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KIAkgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9mZnNldCB0aGUgZ2l2ZW4gb2Zmc2V0IHBvc2l0aW9uCiAJICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMKIAkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKaW5kZXggOTBiYjBlNi4uZjhjMjU0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogcHVibGljIGludGVyZmFjZSBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgewogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBjbGFzcyBjb21wbGV0aW9uLgotICogCisgKgogICogQHBhcmFtIHBhY2thZ2VOYW1lIERlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLgogICogQHBhcmFtIGNsYXNzTmFtZSBOYW1lIG9mIHRoZSBjbGFzcy4KICAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIGNsYXNzLgpAQCAtNjIsMjEgKzYyLDIxIEBACiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBmaWVsZCBjb21wbGV0aW9uLgogICoKICAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQgaXMgZGVjbGFyZWQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgZmllbGQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZC4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLgotICogCisgKgogICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZC4KLSAqIAorICoKICAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIGZpZWxkLgotICogCisgKgogICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoaXMgZmllbGQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4KLSAqIAorICoKICAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQuCiAgKgogICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKQEAgLTEzOSwxNSArMTM5LDE1IEBACiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSBjb21wbGV0aW9uLgogICoKICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBsb2NhbCB2YXJpYWJsZS4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLgotICogCisgKgogICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLgotICogCisgKgogICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLgotICogCisgKgogICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuCiAgKgogICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKQEAgLTE2OCwyOCArMTY4LDI4IEBACiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBtZXRob2QgY29tcGxldGlvbi4KICAqCiAgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLgotICogCisgKgogICogQHBhcmFtIHNlbGVjdG9yIE5hbWUgb2YgdGhlIG5ldyBtZXRob2QuCi0gKiAKKyAqCiAgKiBAcGFyYW0gcGFyYW1ldGVyUGFja2FnZU5hbWVzIE5hbWVzIG9mIHRoZSBwYWNrYWdlcyBpbiB3aGljaCB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBkZWNsYXJlZC4KICAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclR5cGVOYW1lcy4KLSAqIAorICoKICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZXMgTmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZXMuCiAgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMuCi0gKiAKKyAqCiAgKiBAcGFyYW0gcmV0dXJuVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHJldHVybiB0eXBlIGlzIGRlY2xhcmVkLgotICogCisgKgogICogQHBhcmFtIHJldHVyblR5cGVOYW1lIE5hbWUgb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbmV3IG1ldGhvZCwgc2hvdWxkIGJlIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGNvbnN0cnVjdG9yLgotICogCisgKgogICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgbWV0aG9kLgogICogICAJQ2FuIGluY2x1ZGUgemVybywgb25lIG9yIHR3byBicmFja2V0cy4gSWYgdGhlIGNsb3NpbmcgYnJhY2tldCBpcyBpbmNsdWRlZCwgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYmVmb3JlIGl0LgotICogCisgKgogICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoaXMgbmV3IG1ldGhvZC4KLSAqIAorICoKICAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtZXRob2QuCi0gKiAKKyAqCiAgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtZXRob2QuCiAgKgogICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKQEAgLTI0MSw3ICsyNDEsNyBAQAogCWludCBjb21wbGV0aW9uRW5kKTsKIC8qKgogICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgdHlwZSBjb21wbGV0aW9uLgotICogCisgKgogICogQHBhcmFtIHBhY2thZ2VOYW1lIERlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIHR5cGUuCiAgKiBAcGFyYW0gdHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZS4KICAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIHR5cGUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVGb3JtYXR0ZXIuamF2YQppbmRleCBhNTkwZmMxLi43YmJhZGZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlRm9ybWF0dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNyArMTQsNyBAQAogICogU3BlY2lmaWNhdGlvbiBmb3IgYSBnZW5lcmljIHNvdXJjZSBjb2RlIGZvcm1hdHRlci4gQ2xpZW50IHBsdWctaW5zIGNhbiBjb250cmlidXRlCiAgKiBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gSUNvZGVGb3JtYXR0ZXIsIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciIuCiAgKiBJbiBjYXNlIG5vbmUgaXMgZm91bmQsIGEgZGVmYXVsdCBmb3JtYXR0ZXIgY2FuIGJlIHByb3ZpZGVkIHRocm91Z2ggdGhlIFRvb2xGYWN0b3J5LgotICogCisgKgogICogQHNlZSBUb29sRmFjdG9yeSNjcmVhdGVDb2RlRm9ybWF0dGVyKCkKICAqIEBzZWUgVG9vbEZhY3RvcnkjY3JlYXRlRGVmYXVsdENvZGVGb3JtYXR0ZXIoamF2YS51dGlsLk1hcCBvcHRpb25zKQogICogQHNpbmNlIDIuMApAQCAtMjIsMTkgKzIyLDE5IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvZGVGb3JtYXR0ZXIgewogCi0JLyoqIAorCS8qKgogCSAqIEZvcm1hdHMgdGhlIFN0cmluZyA8Y29kZT5zb3VyY2VTdHJpbmc8L2NvZGU+LAogCSAqIGFuZCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB2ZXJzaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIGZvcm1hdAotCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbml0aWFsIGluZGVudGF0aW9uIGxldmVsLCB1c2VkIAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbml0aWFsIGluZGVudGF0aW9uIGxldmVsLCB1c2VkCiAJICogICAgICB0byBzaGlmdCBsZWZ0L3JpZ2h0IHRoZSBlbnRpcmUgc291cmNlIGZyYWdtZW50LiBBbiBpbml0aWFsIGluZGVudGF0aW9uCiAJICogICAgICBsZXZlbCBvZiB6ZXJvIGhhcyBubyBlZmZlY3QuCiAJICogQHBhcmFtIHBvc2l0aW9ucyBhbiBhcnJheSBvZiBwb3NpdGlvbnMgdG8gbWFwLiBUaGVzZSBhcmUKIAkgKiAgICAgIGNoYXJhY3Rlci1iYXNlZCBzb3VyY2UgcG9zaXRpb25zIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlLAotCSAqIAkJYXJyYW5nZWQgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIsIGZvciB3aGljaCBjb3JyZXNwb25kaW5nIHBvc2l0aW9ucyBpbiAKLQkgKiAgICAgdGhlIGZvcm1hdHRlZCBzb3VyY2Ugd2lsbCBiZSBjb21wdXRlZCAoc28gYXMgdG8gcmVsb2NhdGUgZWxlbWVudHMgYXNzb2NpYXRlZCAKLQkgKiAgICAgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlKS4gSXQgdXBkYXRlcyB0aGUgcG9zaXRpb25zIGFycmF5IHdpdGggdXBkYXRlZCAKKwkgKiAJCWFycmFuZ2VkIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyLCBmb3Igd2hpY2ggY29ycmVzcG9uZGluZyBwb3NpdGlvbnMgaW4KKwkgKiAgICAgdGhlIGZvcm1hdHRlZCBzb3VyY2Ugd2lsbCBiZSBjb21wdXRlZCAoc28gYXMgdG8gcmVsb2NhdGUgZWxlbWVudHMgYXNzb2NpYXRlZAorCSAqICAgICB3aXRoIHRoZSBvcmlnaW5hbCBzb3VyY2UpLiBJdCB1cGRhdGVzIHRoZSBwb3NpdGlvbnMgYXJyYXkgd2l0aCB1cGRhdGVkCiAJICogICAgIHBvc2l0aW9ucy4gSWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIG5vIHBvc2l0aW9ucyBhcmUgbWFwcGVkLgogCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UgaW4gZm9ybWF0dGVkIHNvdXJjZSwKIAkgKiAgICAgaWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IG9uZSB3aWxsIGJlIHVzZWQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggNDIxYmM0MS4uNzI4ZTVjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw2ICsxNiw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVW5kb0VkaXQ7CiAKIAogLyoqCkBAIC0yOCw5ICszMCw4IEBACiAgKiBJZiBhIHNvdXJjZSBmaWxlIGNhbm5vdCBiZSBwYXJzZWQsIGl0cyBzdHJ1Y3R1cmUgcmVtYWlucyB1bmtub3duLgogICogVXNlIHtAbGluayBJSmF2YUVsZW1lbnQjaXNTdHJ1Y3R1cmVLbm93bn0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcwogICogdGhlIGNhc2UuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgSVR5cGVSb290LCBJV29ya2luZ0NvcHksIElTb3VyY2VNYW5pcHVsYXRpb24gewogLyoqCkBAIC02Miw2ICs2MywzOCBAQAogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0JJTkRJTkdTX1JFQ09WRVJZID0gMHgwNDsKIAogLyoqCisgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSByZWNvbmNpbGUgb3BlcmF0aW9uIGNvdWxkIGlnbm9yZSB0byBwYXJzZSB0aGUgbWV0aG9kIGJvZGllcy4KKyAqIEBzZWUgQVNUUGFyc2VyI3NldElnbm9yZU1ldGhvZEJvZGllcyhib29sZWFuKQorICogQHNpbmNlIDMuNS4yCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9NRVRIT0RfQk9ESUVTID0gMHgwODsKKworCisvKioKKyAqIEFwcGxpZXMgYSB0ZXh0IGVkaXQgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBidWZmZXIuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGUgZWRpdCBpcyBzaW1wbHkgYXBwbGllZCB0byB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGJ1ZmZlci4KKyAqIEluIHBhcnRpY3VsYXIgdGhlIHVuZG8gZWRpdCBpcyBub3QgZ3JvdXBlZCB3aXRoIHByZXZpb3VzIHVuZG8gZWRpdHMKKyAqIGlmIHRoZSBidWZmZXIgZG9lc24ndCBpbXBsZW1lbnQge0BsaW5rIElCdWZmZXIuSVRleHRFZGl0Q2FwYWJpbGl0eX0uCisgKiBJZiBpdCBkb2VzLCB0aGUgZXhhY3Qgc2VtYW50aWNzIGZvciBncm91cGluZyB1bmRvIGVkaXQgZGVwZW5kcworICogb24gaG93IHtAbGluayBJQnVmZmVyLklUZXh0RWRpdENhcGFiaWxpdHkjYXBwbHlUZXh0RWRpdChUZXh0RWRpdCwgSVByb2dyZXNzTW9uaXRvcil9CisgKiBpcyBpbXBsZW1lbnRlZC4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gZWRpdCB0aGUgZWRpdCB0byBhcHBseQorICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZAorICogQHJldHVybiB0aGUgdW5kbyBlZGl0CisgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVkaXQgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBjb21waWxhdGlvbiB1bml0J3MgYnVmZmVyLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiA8bGk+VGhpcyBjb21waWxhdGlvbiB1bml0IGRvZXMgbm90IGV4aXN0ICh7QGxpbmsgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cyNFTEVNRU5UX0RPRVNfTk9UX0VYSVNUfSkuPC9saT4KKyAqIDxsaT5UaGUgcHJvdmlkZWQgZWRpdCBjYW4gbm90IGJlIGFwcGxpZWQgYXMgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHRleHQgZWRpdCBsb2NhdGlvbnMgKHtAbGluayBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzI0JBRF9URVhUX0VESVRfTE9DQVRJT059KS48L2xpPgorICogPC91bD4KKyAqCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBVbmRvRWRpdCBhcHBseVRleHRFZGl0KFRleHRFZGl0IGVkaXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCiAgKiBDaGFuZ2VzIHRoaXMgY29tcGlsYXRpb24gdW5pdCBoYW5kbGUgaW50byBhIHdvcmtpbmcgY29weS4gQSBuZXcge0BsaW5rIElCdWZmZXJ9IGlzCiAgKiBjcmVhdGVkIHVzaW5nIHRoaXMgY29tcGlsYXRpb24gdW5pdCBoYW5kbGUncyBvd25lci4gVXNlcyB0aGUgcHJpbWFyeSBvd25lciBpZiBub25lIHdhcwogICogc3BlY2lmaWVkIHdoZW4gdGhpcyBjb21waWxhdGlvbiB1bml0IGhhbmRsZSB3YXMgY3JlYXRlZC4KQEAgLTEyNyw3ICsxNjAsNyBAQAogICoKICAqIDxwPkl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKICAqIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIGFuIHVwZGF0ZSBjb25mbGljdC4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisgKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgYWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgogICogc3VjaCBhIGNvbmZsaWN0Ojx1bD4KICAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IGFyZSBhcHBsaWVkIHRvCiAgKiAJdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZXZlbiB0aG91Z2ggdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQgYmVmb3JlCkBAIC0yNDcsNyArMjgwLDcgQEAKICAqIHRvIHRoZSBlbmQgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LgogICoKICAqIDxwPkl0IGlzIHBvc3NpYmxlIHRoYXQgYSB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgZWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgorICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGFmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKICAqIHN1Y2ggYSBjb25mbGljdDo8dWw+CiAgKiA8bGk+IDxjb2RlPnRydWU8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIHRoZSB0eXBlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3IGNvbnRlbnRzPC9saT4KICAqIDxsaT4gPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIGEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duPC9saT4KQEAgLTM3NiwxMCArNDA5LDEzIEBACiAgKi8KIElDb21waWxhdGlvblVuaXQgZ2V0UHJpbWFyeSgpOwogLyoqCi0gKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgb3duZXIgb2YgdGhpcyB3b3JraW5nIGNvcHkuCi0gKiBSZXR1cm5zIG51bGwgaWYgaXQgaXMgbm90IGEgd29ya2luZyBjb3B5IG9yIGlmIGl0IGhhcyBubyBvd25lci4KLSAqCi0gKiBAcmV0dXJuIFdvcmtpbmdDb3B5T3duZXIgdGhlIG93bmVyIG9mIHRoaXMgd29ya2luZyBjb3B5IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBSZXR1cm5zIDx0dD5udWxsPC90dD4gaWYgdGhpcyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBpcyB0aGUgcHJpbWFyeQorICogd29ya2luZyBjb3B5LCBvciB0aGlzIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+IGlzIG5vdCBhIHdvcmtpbmcgY29weSwKKyAqIG90aGVyd2lzZSB0aGUgPGNvZGU+V29ya2luZ0NvcHlPd25lcjwvY29kZT4KKyAqIAorICogQHJldHVybiA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gaXMgdGhlIHByaW1hcnkKKyAqIHdvcmtpbmcgY29weSwgb3IgdGhpcyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBpcyBub3QgYSB3b3JraW5nIGNvcHksCisgKiBvdGhlcndpc2UgdGhlIDxjb2RlPldvcmtpbmdDb3B5T3duZXI8L2NvZGU+CiAgKiBAc2luY2UgMy4wCiAgKi8KIFdvcmtpbmdDb3B5T3duZXIgZ2V0T3duZXIoKTsKQEAgLTU0MywxMCArNTc5LDEwIEBACiAgKiA8L3A+CiAgKiA8cD4KICAqIElmIHJlcXVlc3RlZCwgYSBET00gQVNUIHJlcHJlc2VudGluZyB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyByZXR1cm5lZC4KLSAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLCBvciBpZiB0aGUKLSAqIHByb2JsZW0gZGV0ZWN0aW9uIGlzIGZvcmNlZC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAqIGNyZWF0aW9uIG9mIHRoZSBET00gQVNUIHdhcyBub3QgcmVxdWVzdGVkLCBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVAotICogQVBJIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmIHRoZSB3b3JraW5nIGNvcHkgd2FzIGFscmVhZHkgY29uc2lzdGVudC4KKyAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLgorICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIERPTSBBU1Qgd2FzIG5vdCByZXF1ZXN0ZWQsCisgKiBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVCBBUEkgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYgdGhlIHdvcmtpbmcgY29weSB3YXMKKyAqIGFscmVhZHkgY29uc2lzdGVudC4KICAqIDwvcD4KICAqCiAgKiA8cD4KQEAgLTYwNiwxMCArNjQyLDEwIEBACiAgKiA8L3A+CiAgKiA8cD4KICAqIElmIHJlcXVlc3RlZCwgYSBET00gQVNUIHJlcHJlc2VudGluZyB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyByZXR1cm5lZC4KLSAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLCBvciBpZiB0aGUKLSAqIHByb2JsZW0gZGV0ZWN0aW9uIGlzIGZvcmNlZC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAqIGNyZWF0aW9uIG9mIHRoZSBET00gQVNUIHdhcyBub3QgcmVxdWVzdGVkLCBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVAotICogQVBJIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmIHRoZSB3b3JraW5nIGNvcHkgd2FzIGFscmVhZHkgY29uc2lzdGVudC4KKyAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLgorICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIERPTSBBU1Qgd2FzIG5vdCByZXF1ZXN0ZWQsCisgKiBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVCBBUEkgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYgdGhlIHdvcmtpbmcgY29weSB3YXMKKyAqIGFscmVhZHkgY29uc2lzdGVudC4KICAqIDwvcD4KICAqCiAgKiA8cD4KQEAgLTY3NCwxMCArNzEwLDEwIEBACiAgKiA8L3A+CiAgKiA8cD4KICAqIElmIHJlcXVlc3RlZCwgYSBET00gQVNUIHJlcHJlc2VudGluZyB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyByZXR1cm5lZC4KLSAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLCBvciBpZiB0aGUKLSAqIHByb2JsZW0gZGV0ZWN0aW9uIGlzIGZvcmNlZC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAqIGNyZWF0aW9uIG9mIHRoZSBET00gQVNUIHdhcyBub3QgcmVxdWVzdGVkLCBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVAotICogQVBJIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmIHRoZSB3b3JraW5nIGNvcHkgd2FzIGFscmVhZHkgY29uc2lzdGVudC4KKyAqIEl0cyBiaW5kaW5ncyBhcmUgY29tcHV0ZWQgb25seSBpZiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgYWN0aXZlLgorICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIERPTSBBU1Qgd2FzIG5vdCByZXF1ZXN0ZWQsCisgKiBvciBpZiB0aGUgcmVxdWVzdGVkIGxldmVsIG9mIEFTVCBBUEkgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYgdGhlIHdvcmtpbmcgY29weSB3YXMKKyAqIGFscmVhZHkgY29uc2lzdGVudC4KICAqIDwvcD4KICAqCiAgKiA8cD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGVmNDUwMjguLmM5N2FhNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBsZXRpb25SZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiwxNCArMjYsMTQgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXRpb25SZXF1ZXN0b3IgewogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYW4gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24gY29tcGxldGlvbi4KLSAqIEBwYXJhbSBzdXBlclR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHN1cGVyIHR5cGUgb2YgdGhpcyAKKyAqIEBwYXJhbSBzdXBlclR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHN1cGVyIHR5cGUgb2YgdGhpcwogICogCQluZXcgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24uCiAgKiBAcGFyYW0gc3VwZXJUeXBlTmFtZSBOYW1lIG9mIHRoZSBzdXBlciB0eXBlIG9mIHRoaXMgbmV3IGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uLgogICogQHBhcmFtIHBhcmFtZXRlclBhY2thZ2VOYW1lcyBOYW1lcyBvZiB0aGUgcGFja2FnZXMgaW4gd2hpY2ggdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgZGVjbGFyZWQuCiAgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJUeXBlTmFtZXMuCi0gKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWVzIE5hbWVzIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZXMuIAorICogQHBhcmFtIHBhcmFtZXRlclR5cGVOYW1lcyBOYW1lcyBvZiB0aGUgcGFyYW1ldGVyIHR5cGVzLgogICogCQlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclBhY2thZ2VOYW1lcy4KLSAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lcyBOYW1lcyBvZiB0aGUgcGFyYW1ldGVycy4gCisgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgTmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMuCiAgKiAJCVNob3VsZCBjb250YWluIGFzIG1hbnkgZWxlbWVudHMgYXMgcGFyYW1ldGVyUGFja2FnZU5hbWVzLgogICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24uCiAgKiAJCUNhbiBpbmNsdWRlIHplcm8sIG9uZSBvciB0d28gYnJhY2tldHMuIElmIHRoZSBjbG9zaW5nIGJyYWNrZXQgaXMgaW5jbHVkZWQsCkBAIC00NSw3ICs0NSw3IEBACiAgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCiAgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQogICogCQl2YWx1ZSBpcyBoaWdoZXIuCi0gKiAKKyAqCiAgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgogICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KICAqICAgIEJhc2UgdHlwZXMgYXJlIGluIHRoZSBmb3JtICJpbnQiIG9yICJib29sZWFuIi4KQEAgLTU0LDcgKzU0LDcgQEAKICAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCiAgKgogICogTk9URTogcGFyYW1ldGVyIG5hbWVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsIGFmdGVyIHRoZSB1c2VyIHNlbGVjdHMgYSBzcGVjaWZpYyBtZXRob2QuCi0gKiAKKyAqCiAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0KENvbXBsZXRpb25Qcm9wb3NhbCl9IGluc3RlYWQuCiAgKi8KIHZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZSgKQEAgLTcwLDcgKzcwLDcgQEAKIAlpbnQgcmVsZXZhbmNlKTsKIC8qKgogICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgY2xhc3MgY29tcGxldGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcy4KICAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgY2xhc3MuCiAgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSBjbGFzcy4JQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCBjbGFzc2VzLgpAQCAtODYsNyArODYsNyBAQAogICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KICAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCiAgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgotICogICAgCisgKgogICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdChDb21wbGV0aW9uUHJvcG9zYWwpfSBpbnN0ZWFkLgogICovCiB2b2lkIGFjY2VwdENsYXNzKApAQCAtOTksNyArOTksNyBAQAogCWludCByZWxldmFuY2UpOwogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBjb21waWxhdGlvbiBlcnJvciBkZXRlY3RlZCBkdXJpbmcgY29tcGxldGlvbi4KLSAqICBAcGFyYW0gZXJyb3IgT25seSBwcm9ibGVtcyB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYXMgbm9uLXN5bnRheCBlcnJvcnMgYXJlIG5vdGlmaWVkIHRvIHRoZSAKKyAqICBAcGFyYW0gZXJyb3IgT25seSBwcm9ibGVtcyB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYXMgbm9uLXN5bnRheCBlcnJvcnMgYXJlIG5vdGlmaWVkIHRvIHRoZQogICogICAgIHJlcXVlc3Rvciwgd2FybmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCiAgKgkJSW4gY2FzZSBhbiBlcnJvciBnb3Qgc2lnbmFsbGVkLCBubyBvdGhlciBjb21wbGV0aW9ucyBtaWdodCBiZSBhdmFpbGFibGUsCiAgKgkJdGhlcmVmb3JlIHRoZSBwcm9ibGVtIG1lc3NhZ2Ugc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KQEAgLTEwNywxMyArMTA3LDEzIEBACiAgKgkJZGV0ZWN0ZWQgKG1pZ2h0IGJlIGluIGFub3RoZXIgY29tcGlsYXRpb24gdW5pdCwgaWYgaXQgd2FzIGluZGlyZWN0bHkgcmVxdWVzdGVkCiAgKgkJZHVyaW5nIHRoZSBjb2RlIGFzc2lzdCBwcm9jZXNzKS4KICAqICAgICAgTm90ZTogdGhlIHByb2JsZW0ga25vd3MgaXRzIG9yaWdpbmF0aW5nIGZpbGUgbmFtZS4KLSAqICAgICAgCisgKgogICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI2NvbXBsZXRpb25GYWlsdXJlKElQcm9ibGVtKX0gaW5zdGVhZC4KICAqLwogdm9pZCBhY2NlcHRFcnJvcihJUHJvYmxlbSBlcnJvcik7CiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGZpZWxkIGNvbXBsZXRpb24uCi0gKiAKKyAqCiAgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLgogICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbmV3IGZpZWxkLgogICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZmllbGQuCkBAIC0xMjcsNyArMTI3LDcgQEAKICAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4KICAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlCiAgKiAJCXZhbHVlIGlzIGhpZ2hlci4KLSAqIAorICoKICAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CiAgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgogICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgpAQCAtMTUwLDcgKzE1MCw3IEBACiAJaW50IHJlbGV2YW5jZSk7CiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhbiBpbnRlcmZhY2UgY29tcGxldGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UuCiAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBOYW1lIG9mIHRoZSBpbnRlcmZhY2UuCiAgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSBpbnRlcmZhY2UuCUNhbiBpbmNsdWRlICc7JyBmb3IgaW1wb3J0ZWQgaW50ZXJmYWNlcy4KQEAgLTE2Niw3ICsxNjYsNyBAQAogICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KICAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCiAgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgotICogICAgCisgKgogICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdChDb21wbGV0aW9uUHJvcG9zYWwpfSBpbnN0ZWFkLgogICovCiB2b2lkIGFjY2VwdEludGVyZmFjZSgKQEAgLTE5MSw3ICsxOTEsNyBAQAogdm9pZCBhY2NlcHRLZXl3b3JkKGNoYXJbXSBrZXl3b3JkTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpOwogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBsYWJlbCBjb21wbGV0aW9uLgotICogCisgKgogICogQHBhcmFtIGxhYmVsTmFtZSBUaGUgbGFiZWwgc291cmNlLgogICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbGFiZWwuCiAgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGxhYmVsLgpAQCAtMjA0LDcgKzIwNCw3IEBACiB2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsKIC8qKgogICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUgY29tcGxldGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBsb2NhbCB2YXJpYWJsZS4KICAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KICAqIEBwYXJhbSB0eXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLgpAQCAtMjIyLDcgKzIyMiw3IEBACiAgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCiAgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgogICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KLSAqICAgIAorICoKICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHQoQ29tcGxldGlvblByb3Bvc2FsKX0gaW5zdGVhZC4KICAqLwogdm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKApAQCAtMjM1LDcgKzIzNSw3IEBACiAJaW50IHJlbGV2YW5jZSk7CiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBjb21wbGV0aW9uLgotICogCisgKgogICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBuZXcgbWV0aG9kIGlzIGRlY2xhcmVkLgogICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbmV3IG1ldGhvZC4KICAqIEBwYXJhbSBzZWxlY3RvciBOYW1lIG9mIHRoZSBuZXcgbWV0aG9kLgpAQCAtMjY0LDcgKzI2NCw3IEBACiAgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgogICoKICAqIE5PVEU6IHBhcmFtZXRlciBuYW1lcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHNvdXJjZSBtb2RlbCBhZnRlciB0aGUgdXNlciBzZWxlY3RzIGEgc3BlY2lmaWMgbWV0aG9kLgotICogCisgKgogICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdChDb21wbGV0aW9uUHJvcG9zYWwpfSBpbnN0ZWFkLgogICovCiB2b2lkIGFjY2VwdE1ldGhvZCgKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBjb21wbGV0aW9uLgotICogCisgKgogICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBuZXcgbWV0aG9kIGlzIGRlY2xhcmVkLgogICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbmV3IG1ldGhvZC4KICAqIEBwYXJhbSBzZWxlY3RvciBOYW1lIG9mIHRoZSBuZXcgbWV0aG9kLgpAQCAtMzEzLDcgKzMxMyw3IEBACiAgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgogICoKICAqIE5PVEU6IHBhcmFtZXRlciBuYW1lcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHNvdXJjZSBtb2RlbCBhZnRlciB0aGUgdXNlciBzZWxlY3RzIGEgc3BlY2lmaWMgbWV0aG9kLgotICogCisgKgogICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdChDb21wbGV0aW9uUHJvcG9zYWwpfSBpbnN0ZWFkLgogICovCiB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKApAQCAtMzMyLDcgKzMzMiw3IEBACiAJaW50IHJlbGV2YW5jZSk7CiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1vZGlmaWVyIGNvbXBsZXRpb24uCi0gKiAKKyAqCiAgKiBAcGFyYW0gbW9kaWZpZXJOYW1lIFRoZSBuZXcgbW9kaWZpZXIuCiAgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbW9kaWZpZXIuCiAgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtb2RpZmllci4KQEAgLTM0NSw3ICszNDUsNyBAQAogdm9pZCBhY2NlcHRNb2RpZmllcihjaGFyW10gbW9kaWZpZXJOYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSk7CiAvKioKICAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIHBhY2thZ2UgY29tcGxldGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgcGFja2FnZSBuYW1lLgogICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgcGFja2FnZS4gQ2FuIGluY2x1ZGUgJy4qOycgZm9yIGltcG9ydHMuCiAgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgcGFja2FnZS4KQEAgLTM2OCw3ICszNjgsNyBAQAogCWludCByZWxldmFuY2UpOwogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSB0eXBlIGNvbXBsZXRpb24uCi0gKiAKKyAqCiAgKiBAcGFyYW0gcGFja2FnZU5hbWUgRGVjbGFyaW5nIHBhY2thZ2UgbmFtZSBvZiB0aGUgdHlwZS4KICAqIEBwYXJhbSB0eXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlLgogICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgdHlwZS4gQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCB0eXBlcy4KQEAgLTM5MiwxMCArMzkyLDEwIEBACiAJaW50IGNvbXBsZXRpb25TdGFydCwKIAlpbnQgY29tcGxldGlvbkVuZCwKIAlpbnQgcmVsZXZhbmNlKTsKLQkKKwogLyoqCiAgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSB2YXJpYWJsZSBuYW1lIGNvbXBsZXRpb24uCi0gKiAKKyAqCiAgKiBAcGFyYW0gdHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KICAqIEBwYXJhbSB0eXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuCiAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YXJpYWJsZS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb3JyZWN0aW9uUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29ycmVjdGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGNhZjkwM2QuLjRiYzM4MmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb3JyZWN0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvcnJlY3Rpb25SZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxMyArMTIsMTMgQEAKIAogLyoqCiAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGphdmEgcHJvYmxlbSBjb3JyZWN0aW9uLgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDb3JyZWN0aW9uUmVxdWVzdG9yIHsKIC8qKgogICogTm90aWZpY2F0aW9uIG9mIGEgY2xhc3MgY29ycmVjdGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcy4KICAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgY2xhc3MuCiAgKiBAcGFyYW0gY29ycmVjdGlvbk5hbWUgVGhlIGNvcnJlY3Rpb24gZm9yIHRoZSBjbGFzcy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhCmluZGV4IDcyYzA2OGUuLmVlMzUyNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw5ICsxNiwxMSBAQAogICogPHA+CiAgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KKyAqIAorICogQHNlZSBKYXZhQ29yZSNhZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyKQogICovCiBwdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkKKwogLyoqCiAgKiBOb3RpZmllcyB0aGF0IG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2Ygb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50cyBoYXZlIGNoYW5nZWQuCiAgKiBUaGUgc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgY2hhbmdlIGFyZSBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGV2ZW50LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YQppbmRleCA5ZjIyODY2Li4xNWNmMTY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywxMSArMTMsMTEgQEAKIAogLyoqCiAgKiBSZXByZXNlbnRzIGEgZmllbGQgZGVjbGFyZWQgaW4gYSB0eXBlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkIGV4dGVuZHMgSU1lbWJlciB7CitwdWJsaWMgaW50ZXJmYWNlIElGaWVsZCBleHRlbmRzIElNZW1iZXIsIElBbm5vdGF0YWJsZSB7CisKIC8qKgogICogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGQKICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmllbGQgaGFzIG5vbmUuIFRoZSBmaWVsZCBuZWVkcyB0byBiZSBzdGF0aWMgYW5kIGZpbmFsIHRvIGhhdmUKQEAgLTk1LDEzICs5NSwxNiBAQAogICovCiBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKIC8qKgotICogUmV0dXJucyB0aGUgYmluZGluZyBrZXkgZm9yIHRoaXMgZmllbGQuIEEgYmluZGluZyBrZXkgaXMgYSBrZXkgdGhhdCB1bmlxdWVseQotICogaWRlbnRpZmllcyB0aGlzIGZpZWxkLiBJdCBhbGxvd3MgYWNjZXNzIHRvIGdlbmVyaWMgaW5mbyBmb3IgcGFyYW1ldGVyaXplZAotICogZmllbGRzLgotICogCisgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGtleSBmb3IgdGhpcyBmaWVsZCBvbmx5IGlmIHRoZSBnaXZlbiBmaWVsZCBpcyB7QGxpbmsgI2lzUmVzb2x2ZWQoKSByZXNvbHZlZH0uCisgKiBBIGJpbmRpbmcga2V5IGlzIGEga2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGZpZWxkLiBJdCBhbGxvd3MgYWNjZXNzIHRvIGdlbmVyaWMgaW5mbworICogZm9yIHBhcmFtZXRlcml6ZWQgZmllbGRzLgorICoKKyAqIDxwPklmIHRoZSBnaXZlbiBmaWVsZCBpcyBub3QgcmVzb2x2ZWQsIHRoZSByZXR1cm5lZCBrZXkgaXMgc2ltcGx5IHRoZSBqYXZhIGVsZW1lbnQncyBrZXkuCisgKiA8L3A+CiAgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGtleSBmb3IgdGhpcyBmaWVsZAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmcjZ2V0S2V5KCkKICAqIEBzZWUgQmluZGluZ0tleQorICogQHNlZSAjaXNSZXNvbHZlZCgpCiAgKiBAc2luY2UgMy4xCiAgKi8KIFN0cmluZyBnZXRLZXkoKTsKQEAgLTEyMiw3ICsxMjUsNyBAQAogU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCByZXByZXNlbnRzIGFuIGVudW0gY29uc3RhbnQuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmaWVsZCByZXByZXNlbnRzIGFuIGVudW0gY29uc3RhbnQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQpAQCAtMTMxLDggKzEzNCw4IEBACiBib29sZWFuIGlzRW51bUNvbnN0YW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgcmVwcmVzZW50cyBhIHJlc29sdmVkIGZpZWxkLgotICogSWYgYSBmaWVsZCBpcyByZXNvdmVkLCBpdHMga2V5IGNvbnRhaW5zIHJlc29sdmVkIGluZm9ybWF0aW9uLgotICogCisgKiBJZiBhIGZpZWxkIGlzIHJlc29sdmVkLCBpdHMga2V5IGNvbnRhaW5zIHJlc29sdmVkIGluZm9ybWF0aW9uLgorICoKICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZpZWxkIHJlcHJlc2VudHMgYSByZXNvbHZlZCBmaWVsZC4KICAqIEBzaW5jZSAzLjEKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhCmluZGV4IGY3ODBiZDcuLjdhOThkMTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnRDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0Q29udGFpbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTcgKzE0LDE2IEBACiAgKiBSZXByZXNlbnRzIGFuIGltcG9ydCBjb250YWluZXIgaXMgYSBjaGlsZCBvZiBhIEphdmEgY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvbnRhaW5zCiAgKiBhbGwgKGFuZCBvbmx5KSB0aGUgaW1wb3J0IGRlY2xhcmF0aW9ucy4gSWYgYSBjb21waWxhdGlvbiB1bml0IGhhcyBubyBpbXBvcnQKICAqIGRlY2xhcmF0aW9ucywgbm8gaW1wb3J0IGNvbnRhaW5lciB3aWxsIGJlIHByZXNlbnQuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJSW1wb3J0Q29udGFpbmVyIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJUGFyZW50LCBJU291cmNlUmVmZXJlbmNlIHsKIC8qKgogICogUmV0dXJucyB0aGUgZmlyc3QgaW1wb3J0IGRlY2xhcmF0aW9uIGluIHRoaXMgaW1wb3J0IGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gVGhlIGltcG9ydCBkZWNsYXJhdGlvbiBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLSAqIAorICoKICAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbXBvcnQgZGVjbGFyYXRpb24gaW4gdGhpcyBpbXBvcnQgY29udGFpbmVyIHdpdGggdGhlIGdpdmVuIG5hbWUKICAqLwogSUltcG9ydERlY2xhcmF0aW9uIGdldEltcG9ydChTdHJpbmcgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCmluZGV4IGRkNDEyMWMuLjc4OTI3OWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDI2ICsxMywyNSBAQAogCiAvKioKICAqIFJlcHJlc2VudHMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uIGluIEphdmEgY29tcGlsYXRpb24gdW5pdC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJbXBvcnREZWNsYXJhdGlvbiBleHRlbmRzIElKYXZhRWxlbWVudCwgSVNvdXJjZVJlZmVyZW5jZSwgSVNvdXJjZU1hbmlwdWxhdGlvbiB7CiAvKioKLSAqIFJldHVybnMgdGhlIG5hbWUgdGhhdCBoYXMgYmVlbiBpbXBvcnRlZC4gCisgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgaGFzIGJlZW4gaW1wb3J0ZWQuCiAgKiBGb3IgYW4gb24tZGVtYW5kIGltcG9ydCwgdGhpcyBpbmNsdWRlcyB0aGUgdHJhaWxpbmcgPGNvZGU+Ii4qIjwvY29kZT4uCiAgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBzdGF0ZW1lbnQgPGNvZGU+ImltcG9ydCBqYXZhLnV0aWwuKiI8L2NvZGU+LAogICogdGhpcyByZXR1cm5zIDxjb2RlPiJqYXZhLnV0aWwuKiI8L2NvZGU+LgogICogRm9yIHRoZSBzdGF0ZW1lbnQgPGNvZGU+ImltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlIjwvY29kZT4sCiAgKiB0aGlzIHJldHVybnMgPGNvZGU+ImphdmEudXRpbC5IYXNodGFibGUiPC9jb2RlPi4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIG5hbWUgdGhhdCBoYXMgYmVlbiBpbXBvcnRlZAogICovCiBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKIC8qKgogICogUmV0dXJucyB0aGUgbW9kaWZpZXIgZmxhZ3MgZm9yIHRoaXMgaW1wb3J0LiBUaGUgZmxhZ3MgY2FuIGJlIGV4YW1pbmVkIHVzaW5nIGNsYXNzCiAgKiA8Y29kZT5GbGFnczwvY29kZT4uIE9ubHkgdGhlIHN0YXRpYyBmbGFnIGlzIG1lYW5pbmdmdWwgZm9yIGltcG9ydCBkZWNsYXJhdGlvbnMuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBmbGFncyBmb3IgdGhpcyBpbXBvcnQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KQEAgLTQwLDcgKzM5LDYgQEAKICAqIEBzaW5jZSAzLjAKICAqLwogaW50IGdldEZsYWdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGltcG9ydCBpcyBvbi1kZW1hbmQuIEFuIGltcG9ydCBpcyBvbi1kZW1hbmQgaWYgaXQgZW5kcwogICogd2l0aCA8Y29kZT4iLioiPC9jb2RlPi4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUluaXRpYWxpemVyLmphdmEKaW5kZXggNmNkNzYyNy4uYmJhNmIyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUluaXRpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsOSArMTIsOCBAQAogCiAvKioKICAqIFJlcHJlc2VudHMgYSBzdGFuZC1hbG9uZSBpbnN0YW5jZSBvciBjbGFzcyAoc3RhdGljKSBpbml0aWFsaXplciBpbiBhIHR5cGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJTWVtYmVyIHsKIAkvLyBpbnRlcmZhY2UgdXNlZCBhcyBhIG1hcmtlcjogZGVmaW5lcyBubyBtZW1iZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXJFbnRyeVJlc291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmFyRW50cnlSZXNvdXJjZS5qYXZhCmluZGV4IDdhNmU4OWMuLjgwZDIzNDMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXJFbnRyeVJlc291cmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphckVudHJ5UmVzb3VyY2UuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyLDUxICsyMiw1MyBAQAogICogPC9wPjxwPgogICogSmFyIGVudHJ5IHJlc291cmNlcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGVsZW1lbnQgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwsIGJ1dCBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLgogICogPHA+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4zCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUphckVudHJ5UmVzb3VyY2UgZXh0ZW5kcyBJU3RvcmFnZSB7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMgamFyIGVudHJ5IHJlc291cmNlLgogCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBqYXIgZW50cnkgaXMgYSBmaWxlLCBvciBpZiB0aGlzIGphciBlbnRyeSBpcyBhIGRpcmVjdG9yeSBhbmQgaXQgaGFzIG5vIGNoaWxkcmVuLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBqYXIgZW50cnkgcmVzb3VyY2UKIAkgKi8KIAlJSmFyRW50cnlSZXNvdXJjZVtdIGdldENoaWxkcmVuKCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIG9mIHRoaXMgamFyIGVudHJ5IHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBhcmNoaXZlIHRoaXMgamFyIAorCSAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggb2YgdGhpcyBqYXIgZW50cnkgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGFyY2hpdmUgdGhpcyBqYXIKIAkgKiBlbnRyeSBiZWxvbmdzIHRvLgogCSAqIDxwPgogCSAqIEEgamFyIGVudHJ5IHJlc291cmNlJ3MgZnVsbCBwYXRoIGluZGljYXRlcyB0aGUgcm91dGUgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZQogCSAqIHRvIHRoZSBqYXIgZW50cnkgcmVzb3VyY2UuICBXaXRoaW4gYW4gYXJjaGl2ZSwgdGhlcmUgaXMgZXhhY3RseSBvbmUgc3VjaCBwYXRoCi0JICogZm9yIGFueSBnaXZlbiBqYXIgZW50cnkgcmVzb3VyY2UuIFRoZSByZXR1cm5lZCBwYXRoIG5ldmVyIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvci4gIAorCSAqIGZvciBhbnkgZ2l2ZW4gamFyIGVudHJ5IHJlc291cmNlLiA8L3A+CisJICogPHA+CisJICogVGhlIHJldHVybmVkIHBhdGggaXMgYWJzb2x1dGUgKGkuZS4gaXQgc3RhcnRzIHdpdGggYSBzZXBhcmF0b3IpIGFuZCBpdCBuZXZlciBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIGphciBlbnRyeSByZXNvdXJjZQogCSAqLwogCUlQYXRoIGdldEZ1bGxQYXRoKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBqYXIgZW50cnkgcmVzb3VyY2UuIFRoaXMgaXMgZWl0aGVyIGFuIHtAbGluayBJSmFyRW50cnlSZXNvdXJjZX0sIGFuIHtAbGluayBJUGFja2FnZUZyYWdtZW50fQogCSAqIG9yIGFuIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdH0uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBqYXIgZW50cnkgcmVzb3VyY2UKIAkgKi8KIAlPYmplY3QgZ2V0UGFyZW50KCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhpcyBqYXIgZW50cnkgZmlsZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB0aGlzIGphciBlbnRyeSBmaWxlIGJlbG9uZ3MgdG8uCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IHRoaXMgamFyIGVudHJ5IHJlc291cmNlIGJlbG9uZ3MgdG8uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhpcyBqYXIgZW50cnkgcmVzb3VyY2UgYmVsb25ncyB0by4KIAkgKi8KIAlJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgamFyIGVudHJ5IHJlcHJlc2VudHMgYSBmaWxlLgogCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGEgZGlyZWN0b3J5LgotCSAqIAorCSAqCiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgamFyIGVudHJ5IGlzIGEgZmlsZQogCSAqLwogCWJvb2xlYW4gaXNGaWxlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudC5qYXZhCmluZGV4IGJkZjE4ZGIuLjM3OTcyNjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDkgKzI4LDcgQEAKICAqIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbi5pc0RvZXNOb3RFeGlzdDwvY29kZT4gY2FuIGJlIHVzZWQgdG8gcmVjb2duaXplCiAgKiB0aGlzIGNvbW1vbiBzcGVjaWFsIGNhc2UuCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhRWxlbWVudCBleHRlbmRzIElBZGFwdGFibGUgewogCkBAIC0xMjcsNiArMTI1LDEzIEBACiAJaW50IFRZUEVfUEFSQU1FVEVSID0gMTU7CiAKIAkvKioKKwkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYW4gYW5ub3RhdGlvbi4KKwkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8ge0BsaW5rIElBbm5vdGF0aW9ufS4KKwkgKiBAc2luY2UgMy40CisJICovCisJaW50IEFOTk9UQVRJT04gPSAxNjsKKworCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBleGlzdHMgaW4gdGhlIG1vZGVsLgogCSAqIDxwPgogCSAqIEphdmEgZWxlbWVudHMgYXJlIGhhbmRsZSBvYmplY3RzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYmFja2VkIGJ5IGFuCkBAIC0yNzQsMTEgKzI3OSwxMiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQuCi0JICogSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLAorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgbGlicmFyeSwKIAkgKiB0aGUgcGF0aCByZXR1cm5lZCBpcyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCB0byB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwKIAkgKiByZWxhdGl2ZSB0byB0aGUgd29ya2JlbmNoLgotCSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLAotCSAqIHRoZSBwYXRoIHJldHVybmVkIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBhcmNoaXZlIGluIHRoZSBmaWxlIHN5c3RlbS4KKwkgKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgbGlicmFyeSwKKwkgKiB0aGUgcGF0aCByZXR1cm5lZCBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYXJjaGl2ZSBvciB0byB0aGUKKwkgKiBmb2xkZXIgaW4gdGhlIGZpbGUgc3lzdGVtLgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudApAQCAtMzAzLDcgKzMwOSw3IEBACiAJICogUmV0dXJucyB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQuCiAJICogSWYgdGhpcyBlbGVtZW50IGlzIGluY2x1ZGVkIGluIGFuIGFyY2hpdmUgYW5kIHRoaXMgYXJjaGl2ZSBpcyBub3QgZXh0ZXJuYWwsCiAJICogdGhpcyBpcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcmNoaXZlLgotCSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBsaWJyYXJ5LCA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlzIHJldHVybmVkLgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAJICoKQEAgLTM0OSw5ICszNTUsMTAgQEAKIAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZWxlbWVudCBpcyBrbm93bi4gRm9yIGV4YW1wbGUsIGZvciBhCi0JICogY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvdWxkIG5vdCBiZSBwYXJzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKiBjb21waWxhdGlvbiB1bml0IHRoYXQgaGFzIHN5bnRheCBlcnJvcnMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KIAkgKiBJZiB0aGUgc3RydWN0dXJlIG9mIGFuIGVsZW1lbnQgaXMgdW5rbm93biwgbmF2aWdhdGlvbnMgd2lsbCByZXR1cm4gcmVhc29uYWJsZQotCSAqIGRlZmF1bHRzLiBGb3IgZXhhbXBsZSwgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24uCisJICogZGVmYXVsdHMuIEZvciBleGFtcGxlLCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gZm9yIGEgY29tcGlsYXRpb24gdW5pdCB3aXRoCisJICogc3ludGF4IGVycm9ycyB3aWxsIHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhlIGNoaWxkcmVuIHRoYXQgY291bGQgYmUgcGFyc2VkLgogCSAqIDxwPgogCSAqIE5vdGU6IFRoaXMgZG9lcyBub3QgaW1wbHkgYW55dGhpbmcgYWJvdXQgY29uc2lzdGVuY3kgd2l0aCB0aGUKIAkgKiB1bmRlcmx5aW5nIHJlc291cmNlL2J1ZmZlciBjb250ZW50cy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudERlbHRhLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnREZWx0YS5qYXZhCmluZGV4IGQwODkyMGUuLmJjMTdiMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudERlbHRhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50RGVsdGEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwyMCArMTUsMjAgQEAKIAogLyoqCiAgKiBBIEphdmEgZWxlbWVudCBkZWx0YSBkZXNjcmliZXMgY2hhbmdlcyBpbiBKYXZhIGVsZW1lbnQgYmV0d2VlbiB0d28gZGlzY3JldGUKLSAqIHBvaW50cyBpbiB0aW1lLiAgR2l2ZW4gYSBkZWx0YSwgY2xpZW50cyBjYW4gYWNjZXNzIHRoZSBlbGVtZW50IHRoYXQgaGFzIAorICogcG9pbnRzIGluIHRpbWUuICBHaXZlbiBhIGRlbHRhLCBjbGllbnRzIGNhbiBhY2Nlc3MgdGhlIGVsZW1lbnQgdGhhdCBoYXMKICAqIGNoYW5nZWQsIGFuZCBhbnkgY2hpbGRyZW4gdGhhdCBoYXZlIGNoYW5nZWQuCiAgKiA8cD4KLSAqIERlbHRhcyBoYXZlIGEgZGlmZmVyZW50IHN0YXR1cyBkZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YgY2hhbmdlIHRoZXkgcmVwcmVzZW50LiAgCisgKiBEZWx0YXMgaGF2ZSBhIGRpZmZlcmVudCBzdGF0dXMgZGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIGNoYW5nZSB0aGV5IHJlcHJlc2VudC4KICAqIFRoZSBsaXN0IGJlbG93IHN1bW1hcml6ZXMgZWFjaCBzdGF0dXMgKGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0S2luZH0pCiAgKiBhbmQgaXRzIG1lYW5pbmcgKHNlZSBpbmRpdmlkdWFsIGNvbnN0YW50cyBmb3IgYSBtb3JlIGRldGFpbGxlZCBkZXNjcmlwdGlvbik6CiAgKiA8dWw+CiAgKiA8bGk+e0BsaW5rICNBRERFRH0gLSBUaGUgZWxlbWVudCBkZXNjcmliZWQgYnkgdGhlIGRlbHRhIGhhcyBiZWVuIGFkZGVkLjwvbGk+CiAgKiA8bGk+e0BsaW5rICNSRU1PVkVEfSAtIFRoZSBlbGVtZW50IGRlc2NyaWJlZCBieSB0aGUgZGVsdGEgaGFzIGJlZW4gcmVtb3ZlZC48L2xpPgotICogPGxpPntAbGluayAjQ0hBTkdFRH0gLSBUaGUgZWxlbWVudCBkZXNjcmliZWQgYnkgdGhlIGRlbHRhIGhhcyBiZWVuIGNoYW5nZWQgaW4gc29tZSB3YXkuICAKKyAqIDxsaT57QGxpbmsgI0NIQU5HRUR9IC0gVGhlIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZSBkZWx0YSBoYXMgYmVlbiBjaGFuZ2VkIGluIHNvbWUgd2F5LgogICogU3BlY2lmaWNhdGlvbiBvZiB0aGUgdHlwZSBvZiBjaGFuZ2UgaXMgcHJvdmlkZWQgYnkge0BsaW5rICNnZXRGbGFnc30gd2hpY2ggcmV0dXJucyB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqIDx1bD4KICAqIDxsaT57QGxpbmsgI0ZfQURERURfVE9fQ0xBU1NQQVRIfSAtIEEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQKLSAqIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbgogICoge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS48L2xpPgogICogPGxpPntAbGluayAjRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRH0gLSBUaGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZQogICogaGFzIGNoYW5nZWQgaW4gc29tZSB3YXkuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdH0KQEAgLTM2LDcgKzM2LDcgQEAKICAqIDxsaT57QGxpbmsgI0ZfQ0hJTERSRU59IC0gQSBjaGlsZCBvZiB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZCBpbiBzb21lIHdheS4gIFRoaXMgZmxhZwogICogaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhcmVudH0uPC9saT4KICAqIDxsaT57QGxpbmsgI0ZfQ0xBU1NQQVRIX1JFT1JERVJ9IC0gQSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudAotICogaGFzIGNoYW5nZWQgcG9zaXRpb24gaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIAorICogaGFzIGNoYW5nZWQgcG9zaXRpb24gaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuCiAgKiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LjwvbGk+CiAgKiA8bGk+e0BsaW5rICNGX0NMT1NFRH0gLSBUaGUgdW5kZXJseWluZyB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3R9CiAgKiBoYXMgYmVlbiBjbG9zZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJSmF2YVByb2plY3R9LjwvbGk+CkBAIC00NCwxOCArNDQsMTggQEAKICAqIGlzIG9ubHkgdmFsaWQgZm9yIGVsZW1lbnRzIHdoaWNoIGNvcnJlc3BvbmQgdG8gZmlsZXMuPC9saT4KICAqPGxpPntAbGluayAjRl9GSU5FX0dSQUlORUR9IC0gVGhlIGRlbHRhIGlzIGEgZmluZS1ncmFpbmVkIGRlbHRhLCB0aGF0IGlzLCBhbiBhbmFseXNpcyBkb3duCiAgKiB0byB0aGUgbWVtYmVycyBsZXZlbCB3YXMgZG9uZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgd2VyZSBzdHJ1Y3R1cmFsIGNoYW5nZXMgdG8gbWVtYmVycyBvZiB0aGUgZWxlbWVudC48L2xpPgotICogPGxpPntAbGluayAjRl9NT0RJRklFUlN9IC0gVGhlIG1vZGlmaWVycyBvbiB0aGUgZWxlbWVudCBoYXZlIGNoYW5nZWQgaW4gc29tZSB3YXkuIAorICogPGxpPntAbGluayAjRl9NT0RJRklFUlN9IC0gVGhlIG1vZGlmaWVycyBvbiB0aGUgZWxlbWVudCBoYXZlIGNoYW5nZWQgaW4gc29tZSB3YXkuCiAgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSU1lbWJlcn0uPC9saT4KICAqIDxsaT57QGxpbmsgI0ZfT1BFTkVEfSAtIFRoZSB1bmRlcmx5aW5nIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdH0KICAqIGhhcyBiZWVuIG9wZW5lZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uPC9saT4KLSAqIDxsaT57QGxpbmsgI0ZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSH0gLSBBIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IAotICogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIDxsaT57QGxpbmsgI0ZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSH0gLSBBIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50CisgKiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuCiAgKiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LjwvbGk+CiAgKiA8bGk+e0BsaW5rICNGX1NPVVJDRUFUVEFDSEVEfSAtIFRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGgKLSAqIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbgogICoge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS48L2xpPgogICogPGxpPntAbGluayAjRl9TT1VSQ0VERVRBQ0hFRH0gLSBUaGUgc291cmNlIGF0dGFjaG1lbnQgcGF0aCBvciB0aGUgc291cmNlIGF0dGFjaG1lbnQgcm9vdCBwYXRoCi0gKiBvZiBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuCiAgKiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LjwvbGk+CiAgKiA8bGk+e0BsaW5rICNGX1NVUEVSX1RZUEVTfSAtIE9uZSBvZiB0aGUgc3VwZXJ0eXBlcyBvZiBhbiB7QGxpbmsgSVR5cGV9IGhhcyBjaGFuZ2VkPC9saT4uCiAgKiA8L3VsPgpAQCAtODAsMTEgKzgwLDExIEBACiAgKiA8cD4KICAqIFRoZSB7QGxpbmsgI0ZfQURERURfVE9fQ0xBU1NQQVRIfSwge0BsaW5rICNGX1JFTU9WRURfRlJPTV9DTEFTU1BBVEh9IGFuZAogICoge0BsaW5rICNGX0NMQVNTUEFUSF9SRU9SREVSfSBmbGFncyBhcmUgdHJpZ2dlcmVkIGJ5IGNoYW5nZXMgdG8gYSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGV5IGRvIG5vdCBtZWFuIHRoYXQKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHdhcyBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgaWYgYSBwcm9qZWN0IFAgYWxyZWFkeSBjb250YWlucyBhIGZvbGRlciBzcmMsIHRoZW4gCi0gKiBhZGRpbmcgYSBjbGFzc3BhdGggZW50cnkgd2l0aCB0aGUgJ1Avc3JjJyBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpbGwgcmVzdWx0IGluIGFuIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YX0gCisgKiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSB3YXMgYWRkZWQsIHJlbW92ZWQgb3IgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGlmIGEgcHJvamVjdCBQIGFscmVhZHkgY29udGFpbnMgYSBmb2xkZXIgc3JjLCB0aGVuCisgKiBhZGRpbmcgYSBjbGFzc3BhdGggZW50cnkgd2l0aCB0aGUgJ1Avc3JjJyBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpbGwgcmVzdWx0IGluIGFuIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YX0KICAqIHdpdGggdGhlIHtAbGluayAjRl9BRERFRF9UT19DTEFTU1BBVEh9IGZsYWcgZm9yIHRoZSB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9IFAvc3JjLgogICogT24gdGhlIGNvbnRyYXJ5LCBpZiBhIHJlc291cmNlIGlzIHBoeXNpY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgY2hhbmdlZCBhbmQgdGhpcyByZXNvdXJjZSBjb3JyZXNwb25kcyB0byBhIGNsYXNzcGF0aAotICogZW50cnkgb2YgdGhlIHByb2plY3QsIHRoZW4gYW4ge0BsaW5rIElKYXZhRWxlbWVudERlbHRhfSB3aXRoIHRoZSB7QGxpbmsgI0FEREVEfSwgCisgKiBlbnRyeSBvZiB0aGUgcHJvamVjdCwgdGhlbiBhbiB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGF9IHdpdGggdGhlIHtAbGluayAjQURERUR9LAogICoge0BsaW5rICNSRU1PVkVEfSwgb3Ige0BsaW5rICNDSEFOR0VEfSBraW5kIHdpbGwgYmUgZmlyZWQuCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTk5LDkgKzk5LDEwIEBACiAgKiB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGF9IG9iamVjdCBhcmUgbm90IHZhbGlkIG91dHNpZGUgdGhlIGR5bmFtaWMgc2NvcGUKICAqIG9mIHRoZSBub3RpZmljYXRpb24uCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBzZWUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIKKyAqIEBzZWUgRWxlbWVudENoYW5nZWRFdmVudAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhRWxlbWVudERlbHRhIHsKIApAQCAtMTIwLDcgKzEyMSw3IEBACiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBoYXMgYmVlbiBjaGFuZ2VkLAogCSAqIGFzIGRlc2NyaWJlZCBieSB0aGUgY2hhbmdlIGZsYWdzLgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0RmxhZ3MoKQogCSAqLwogCXB1YmxpYyBpbnQgQ0hBTkdFRCA9IDQ7CkBAIC0xMzMsMTMgKzEzNCwxMyBAQAogCiAJLyoqCiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBtb2RpZmllcnMgb2YgdGhlIGVsZW1lbnQgaGF2ZSBjaGFuZ2VkLgotCSAqIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJTWVtYmVyfS4gCisJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElNZW1iZXJ9LgogCSAqLwogCXB1YmxpYyBpbnQgRl9NT0RJRklFUlMgPSAweDAwMDAwMjsKIAogCS8qKgogCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuCi0JICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYXJlbnR9LiAKKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhcmVudH0uCiAJICovCiAJcHVibGljIGludCBGX0NISUxEUkVOID0gMHgwMDAwMDg7CiAKQEAgLTE1Niw0MSArMTU3LDQxIEBACiAJcHVibGljIGludCBGX01PVkVEX1RPID0gMHgwMDAwMjA7CiAKIAkvKioKLQkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4gCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCiAJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS4KIAkgKi8KIAlwdWJsaWMgaW50IEZfQURERURfVE9fQ0xBU1NQQVRIID0gMHgwMDAwNDA7CiAKIAkvKioKLQkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QncyAKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QncwogCSAqIGNsYXNzcGF0aC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS4KIAkgKi8KIAlwdWJsaWMgaW50IEZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCA9IDB4MDAwMDgwOwogCiAJLyoqCi0JICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgcG9zaXRpb24gaW4gdGhlIHByb2plY3QncyAKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZCBwb3NpdGlvbiBpbiB0aGUgcHJvamVjdCdzCiAJICogY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI0ZfUkVPUkRFUn0gaW5zdGVhZC4KIAkgKi8KIAlwdWJsaWMgaW50IEZfQ0xBU1NQQVRIX1JFT1JERVIgPSAweDAwMDEwMDsKIAkvKioKLQkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgcG9zaXRpb24gcmVsYXRpdmVseSB0byBpdHMgc2libGluZ3MuIAotCSAqIElmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdH0sICBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIAorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZCBwb3NpdGlvbiByZWxhdGl2ZWx5IHRvIGl0cyBzaWJsaW5ncy4KKwkgKiBJZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LCAgYSBjbGFzc3BhdGggZW50cnkgY29ycmVzcG9uZGluZwogCSAqIHRvIHRoZSBlbGVtZW50IGhhcyBjaGFuZ2VkIHBvc2l0aW9uIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDIuMQogCSAqLwogCXB1YmxpYyBpbnQgRl9SRU9SREVSID0gMHgwMDAxMDA7CiAKIAkvKioKIAkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHVuZGVybHlpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0fSBoYXMgYmVlbgotCSAqIG9wZW5lZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uIAorCSAqIG9wZW5lZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCiAJICovCiAJcHVibGljIGludCBGX09QRU5FRCA9IDB4MDAwMjAwOwogCiAJLyoqCiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdH0gaGFzIGJlZW4KLQkgKiBjbG9zZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJSmF2YVByb2plY3R9LiAKKwkgKiBjbG9zZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJSmF2YVByb2plY3R9LgogCSAqLwogCXB1YmxpYyBpbnQgRl9DTE9TRUQgPSAweDAwMDQwMDsKIApAQCAtMjAxLDMwICsyMDIsMzAgQEAKIAlwdWJsaWMgaW50IEZfU1VQRVJfVFlQRVMgPSAweDAwMDgwMDsKIAogCS8qKgotCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgc291cmNlIGF0dGFjaG1lbnQgcGF0aCBvciB0aGUgc291cmNlIGF0dGFjaG1lbnQgcm9vdCBwYXRoIG9mIGEgY2xhc3NwYXRoIGVudHJ5IAotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHNvdXJjZSBhdHRhY2htZW50IHBhdGggb3IgdGhlIHNvdXJjZSBhdHRhY2htZW50IHJvb3QgcGF0aCBvZiBhIGNsYXNzcGF0aCBlbnRyeQorCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbgogCSAqIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdH0uCiAJICovCi0JcHVibGljIGludCBGX1NPVVJDRUFUVEFDSEVEID0gMHgwMDEwMDA7CQorCXB1YmxpYyBpbnQgRl9TT1VSQ0VBVFRBQ0hFRCA9IDB4MDAxMDAwOwogCiAJLyoqCi0JICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggb2YgYSBjbGFzc3BhdGggZW50cnkgCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggb2YgYSBjbGFzc3BhdGggZW50cnkKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbgogCSAqIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdH0uCiAJICovCi0JcHVibGljIGludCBGX1NPVVJDRURFVEFDSEVEID0gMHgwMDIwMDA7CQotCQorCXB1YmxpYyBpbnQgRl9TT1VSQ0VERVRBQ0hFRCA9IDB4MDAyMDAwOworCiAJLyoqCiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYSBmaW5lLWdyYWluZWQgZGVsdGEsIHRoYXQgaXMsIGFuIGFuYWx5c2lzIGRvd24KIAkgKiB0byB0aGUgbWVtYmVycyBsZXZlbCB3YXMgZG9uZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgd2VyZSBzdHJ1Y3R1cmFsIGNoYW5nZXMgdG8KIAkgKiBtZW1iZXJzLgogCSAqIDxwPgotCSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGZsYWcgdG8gZmluZCBvdXQgaWYgYSBjb21waWxhdGlvbiB1bml0IAotICAgICAqIHRoYXQgaGF2ZSBhIHtAbGluayAjRl9DT05URU5UfSBjaGFuZ2Ugc2hvdWxkIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSAKLSAgICAgKiBubyBmaW5lciBncmFpbmVkIGNoYW5nZXMgKHtAbGluayAjRl9GSU5FX0dSQUlORUR9IGlzIHNldCkgb3IgaWYgCi0gICAgICogZmluZXIgZ3JhaW5lZCBjaGFuZ2VzIHdlcmUgbm90IGNvbnNpZGVyZWQgKHtAbGluayAjRl9GSU5FX0dSQUlORUR9IAotICAgICAqIGlzIG5vdCBzZXQpLiAKLSAgICAgKiAKKwkgKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBmbGFnIHRvIGZpbmQgb3V0IGlmIGEgY29tcGlsYXRpb24gdW5pdAorICAgICAqIHRoYXQgaGF2ZSBhIHtAbGluayAjRl9DT05URU5UfSBjaGFuZ2Ugc2hvdWxkIGFzc3VtZSB0aGF0IHRoZXJlIGFyZQorICAgICAqIG5vIGZpbmVyIGdyYWluZWQgY2hhbmdlcyAoe0BsaW5rICNGX0ZJTkVfR1JBSU5FRH0gaXMgc2V0KSBvciBpZgorICAgICAqIGZpbmVyIGdyYWluZWQgY2hhbmdlcyB3ZXJlIG5vdCBjb25zaWRlcmVkICh7QGxpbmsgI0ZfRklORV9HUkFJTkVEfQorICAgICAqIGlzIG5vdCBzZXQpLgorICAgICAqCiAgICAgICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBpbnQgRl9GSU5FX0dSQUlORUQgPSAweDAwNDAwMDsKQEAgLTIzMywyNCArMjM0LDMxIEBACiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50J3MgYXJjaGl2ZSBjb250ZW50IG9uIHRoZSBjbGFzc3BhdGggaGFzIGNoYW5nZWQuCiAJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fQogCSAqIHdoaWNoIGlzIGFuIGFyY2hpdmUuCi0JICogCisJICoKIAkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290I2lzQXJjaGl2ZSgpCiAJICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBpbnQgRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCA9IDB4MDA4MDAwOwotCQorCiAJLyoqCi0JICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEgY29tcGlsYXRpb24gdW5pdCBoYXMgYmVjb21lIGEgcHJpbWFyeSB3b3JraW5nIGNvcHksIG9yIHRoYXQgYSAKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBjb21waWxhdGlvbiB1bml0IGhhcyBiZWNvbWUgYSBwcmltYXJ5IHdvcmtpbmcgY29weSwgb3IgdGhhdCBhCiAJICogcHJpbWFyeSB3b3JraW5nIGNvcHkgaGFzIHJldmVydGVkIHRvIGEgY29tcGlsYXRpb24gdW5pdC4KIAkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0uCi0JICogCisJICoKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIGludCBGX1BSSU1BUllfV09SS0lOR19DT1BZID0gMHgwMTAwMDA7CiAKIAkvKioKLQkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHJhdyBjbGFzc3BhdGggKG9yIHRoZSBvdXRwdXQgZm9sZGVyKSBvZiBhIHByb2plY3QgaGFzIGNoYW5nZWQuIAorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSYXdDbGFzc3BhdGgoKSByYXcgY2xhc3NwYXRofQorCSAqIChvciB0aGUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRPdXRwdXRMb2NhdGlvbigpIG91dHB1dCBmb2xkZXJ9KSBvZiBhIHByb2plY3QgaGFzIGNoYW5nZWQuCiAJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCisJICogQWxzbyBzZWUge0BsaW5rICNGX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEfSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYQorCSAqIGNoYW5nZSB0byB0aGUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZXNvbHZlZENsYXNzcGF0aChib29sZWFuKSByZXNvbHZlZCBjbGFzcyBwYXRofS4KKwkgKiBUaGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGNhbiBjaGFuZ2Ugd2l0aG91dCB0aGUgcmF3IGNsYXNzcGF0aCBjaGFuZ2luZyAoZS5nLgorCSAqIGlmIGEgY29udGFpbmVyIHJlc29sdmVzIHRvIGEgZGlmZmVyZW50IHNldCBvZiBjbGFzc3BhdGggZW50cmllcykuCisJICogQW5kIGNvbnZlcnNlbHksIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhIGNhc2Ugd2hlcmUgdGhlIHJhdyBjbGFzc3BhdGgKKwkgKiBjYW4gY2hhbmdlIHdpdGhvdXQgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBjaGFuZ2luZy4KIAkgKgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTI1OSwyOCArMjY3LDUyIEBACiAJLyoqCiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBvZiBhIHByaW1hcnkgY29tcGlsYXRpb24gdW5pdCBoYXMgY2hhbmdlZC4KIAkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhIHByaW1hcnkge0BsaW5rIElDb21waWxhdGlvblVuaXR9LgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBpbnQgRl9QUklNQVJZX1JFU09VUkNFID0gMHgwNDAwMDA7CiAKIAkvKioKLQkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSByZWNvbmNpbGUgb3BlcmF0aW9uIGhhcyBhZmZlY3RlZCB0aGUgY29tcGlsYXRpb24gdW5pdCBBU1QgY3JlYXRlZCBpbiBhIAorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCBhIHJlY29uY2lsZSBvcGVyYXRpb24gaGFzIGFmZmVjdGVkIHRoZSBjb21waWxhdGlvbiB1bml0IEFTVCBjcmVhdGVkIGluIGEKIAkgKiBwcmV2aW91cyByZWNvbmNpbGUgb3BlcmF0aW9uLiBVc2Uge0BsaW5rICNnZXRDb21waWxhdGlvblVuaXRBU1QoKX0gdG8gcmV0cmlldmUgdGhlIEFTVCAoaWYgYW55IGlzIGF2YWlsYWJsZSkuCiAJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElDb21waWxhdGlvblVuaXR9IGluIHdvcmtpbmcgY29weSBtb2RlLgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBpbnQgRl9BU1RfQUZGRUNURUQgPSAweDA4MDAwMDsKLQkKKwogCS8qKgogCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY2F0ZWdvcmllcyBvZiB0aGUgZWxlbWVudCBoYXZlIGNoYW5nZWQuCi0JICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElNZW1iZXJ9LiAKLQkgKiAKKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSU1lbWJlcn0uCisJICoKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIGludCBGX0NBVEVHT1JJRVMgPSAweDEwMDAwMDsKLQkKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZXNvbHZlZENsYXNzcGF0aChib29sZWFuKQorCSAqIHJlc29sdmVkIGNsYXNzcGF0aH0gb2YgYSBwcm9qZWN0IGhhcyBjaGFuZ2VkLgorCSAqIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIHtAbGluayBJSmF2YVByb2plY3R9LgorCSAqIEFsc28gc2VlIHtAbGluayAjRl9DTEFTU1BBVEhfQ0hBTkdFRH0sIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKKwkgKiBjaGFuZ2UgdG8gdGhlIHtAbGluayBJSmF2YVByb2plY3QjZ2V0UmF3Q2xhc3NwYXRoKCkgcmF3IGNsYXNzIHBhdGh9LgorCSAqIFRoZSByZXNvbHZlZCBjbGFzc3BhdGggY2FuIGNoYW5nZSB3aXRob3V0IHRoZSByYXcgY2xhc3NwYXRoIGNoYW5naW5nIChlLmcuCisJICogaWYgYSBjb250YWluZXIgcmVzb2x2ZXMgdG8gYSBkaWZmZXJlbnQgc2V0IG9mIGNsYXNzcGF0aCBlbnRyaWVzKS4KKwkgKiBBbmQgY29udmVyc2VseSwgaXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IGEgY2FzZSB3aGVyZSB0aGUgcmF3IGNsYXNzcGF0aAorCSAqIGNhbiBjaGFuZ2Ugd2l0aG91dCB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGNoYW5naW5nLgorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBpbnQgRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCA9IDB4MjAwMDAwOworCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgZWxlbWVudCBoYXZlIGNoYW5nZWQuCisJICogVXNlIHtAbGluayAjZ2V0QW5ub3RhdGlvbkRlbHRhcygpfSB0byBnZXQgdGhlIGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBhbm5vdGF0aW9ucy4KKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiB7QGxpbmsgSUFubm90YXRhYmxlfS4KKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgaW50IEZfQU5OT1RBVElPTlMgPSAweDQwMDAwMDsKKwogCS8qKgogCSAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgY2hpbGRyZW4gdGhhdCBoYXZlIGJlZW4gYWRkZWQuCiAJICogQHJldHVybiBkZWx0YXMgZm9yIHRoZSBjaGlsZHJlbiB0aGF0IGhhdmUgYmVlbiBhZGRlZApAQCAtMjkyLDcgKzMyNCwxOCBAQAogCSAqIEByZXR1cm4gZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQgKGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkKSBjaGlsZHJlbgogCSAqLwogCXB1YmxpYyBJSmF2YUVsZW1lbnREZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkKKworCS8qKgorCSAqIFJldHVybnMgZGVsdGFzIGZvciBhZmZlY3RlZCBhbm5vdGF0aW9ucyAoYWRkZWQsIHJlbW92ZWQsIG9yIGNoYW5nZWQpLgorCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgbm8gYW5ub3RhdGlvbnMgd2FzIGFmZmVjdGVkLCBvciBpZiB0aGlzIGRlbHRhJ3MgZWxlbWVudCBpcyBub3QKKwkgKiBhbiB7QGxpbmsgSUFubm90YXRhYmxlfS4KKwkgKgorCSAqIEByZXR1cm4gZGVsdGFzIGZvciBhZmZlY3RlZCBhbm5vdGF0aW9ucyAoYWRkZWQsIHJlbW92ZWQsIG9yIGNoYW5nZWQpCisJICoKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZ2V0QW5ub3RhdGlvbkRlbHRhcygpOworCiAJLyoqCiAJICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBBU1QgY3JlYXRlZCBieSB0aGUgbGFzdCByZWNvbmNpbGUgb3BlcmF0aW9uIG9uIHRoaXMgZGVsdGEncyBlbGVtZW50LgogCSAqIFRoaXMgcmV0dXJucyBhIG5vbi1udWxsIHZhbHVlIGlmIGFuZCBvbmx5IGlmOgpAQCAtMzAxLDcgKzM0NCw3IEBACiAJICogPGxpPnRoaXMgZGVsdGEncyBlbGVtZW50IGlzIGFuIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSBpbiB3b3JraW5nIGNvcHkgbW9kZTwvbGk+CiAJICogPGxpPnRoZSBkZWx0YSBjb21lcyBmcm9tIGEge0BsaW5rIEVsZW1lbnRDaGFuZ2VkRXZlbnQjUE9TVF9SRUNPTkNJTEV9IGV2ZW50CiAJICogPC91bD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIEFTVCBjcmVhdGVkIGR1cmluZyB0aGUgbGFzdCByZWNvbmNpbGUgb3BlcmF0aW9uCiAJICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I3JlY29uY2lsZShpbnQsIGJvb2xlYW4sIFdvcmtpbmdDb3B5T3duZXIsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQogCSAqIEBzZWUgI0ZfQVNUX0FGRkVDVEVECkBAIC0zMjIsNyArMzY1LDcgQEAKIAlwdWJsaWMgSUphdmFFbGVtZW50IGdldEVsZW1lbnQoKTsKIAogCS8qKgotCSAqIFJldHVybnMgZmxhZ3MgdGhhdCBkZXNjcmliZSBob3cgYW4gZWxlbWVudCBoYXMgY2hhbmdlZC4gCisJICogUmV0dXJucyBmbGFncyB0aGF0IGRlc2NyaWJlIGhvdyBhbiBlbGVtZW50IGhhcyBjaGFuZ2VkLgogCSAqIFN1Y2ggZmxhZ3Mgc2hvdWxkIGJlIHRlc3RlZCB1c2luZyB0aGUgPGNvZGU+JjwvY29kZT4gb3BlcmFuZC4gRm9yIGV4YW1wbGU6CiAJICogPHByZT4KIAkgKiBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpICE9IDApIHsKQEAgLTMzNyw3ICszODAsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBkZWx0YSAtIG9uZSBvZiB7QGxpbmsgI0FEREVEfSwge0BsaW5rICNSRU1PVkVEfSwKIAkgKiBvciB7QGxpbmsgI0NIQU5HRUR9LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIGRlbHRhCiAJICovCiAJcHVibGljIGludCBnZXRLaW5kKCk7CkBAIC0zNDUsOCArMzg4LDggQEAKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGVsZW1lbnQgZGVzY3JpYmluZyB0aGlzIGVsZW1lbnQgYmVmb3JlIGl0IHdhcyBtb3ZlZAogCSAqIHRvIGl0cyBjdXJyZW50IGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiB7QGxpbmsgI0ZfTU9WRURfRlJPTX0gY2hhbmdlIGZsYWcgaXMgbm90IHNldC4gCi0JICogCisJICoge0BsaW5rICNGX01PVkVEX0ZST019IGNoYW5nZSBmbGFnIGlzIG5vdCBzZXQuCisJICoKIAkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVzY3JpYmluZyB0aGlzIGVsZW1lbnQgYmVmb3JlIGl0IHdhcyBtb3ZlZAogCSAqIHRvIGl0cyBjdXJyZW50IGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKIAkgKiB7QGxpbmsgI0ZfTU9WRURfRlJPTX0gY2hhbmdlIGZsYWcgaXMgbm90IHNldApAQCAtMzU3LDcgKzQwMCw3IEBACiAJICogUmV0dXJucyBhbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBlbGVtZW50IGluIGl0cyBuZXcgbG9jYXRpb24sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHtAbGluayAjRl9NT1ZFRF9UT30gY2hhbmdlCiAJICogZmxhZyBpcyBub3Qgc2V0LgotCSAqIAorCSAqCiAJICogQHJldHVybiBhbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBlbGVtZW50IGluIGl0cyBuZXcgbG9jYXRpb24sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHtAbGluayAjRl9NT1ZFRF9UT30gY2hhbmdlCiAJICogZmxhZyBpcyBub3Qgc2V0CkBAIC0zNjYsNyArNDA5LDcgQEAKIAogCS8qKgogCSAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgY2hpbGRyZW4gd2hpY2ggaGF2ZSBiZWVuIHJlbW92ZWQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGRlbHRhcyBmb3IgdGhlIGNoaWxkcmVuIHdoaWNoIGhhdmUgYmVlbiByZW1vdmVkCiAJICovCiAJcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZ2V0UmVtb3ZlZENoaWxkcmVuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsLmphdmEKaW5kZXggZjI5MTgwYS4uMmRmMzU2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwzNCArMTIsMzUgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIAogLyoqCi0gKiBSZXByZXNlbnQgdGhlIHJvb3QgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdvcmtzcGFjZS4gCisgKiBSZXByZXNlbnQgdGhlIHJvb3QgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdvcmtzcGFjZS4KICAqIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIHN1Y2ggcm9vdCBlbGVtZW50LCBpdCBpcyBjb21tb25seSByZWZlcnJlZCB0byBhcwogICogPGVtPnRoZTwvZW0+IEphdmEgbW9kZWwgZWxlbWVudC4KICAqIFRoZSBKYXZhIG1vZGVsIGVsZW1lbnQgbmVlZHMgdG8gYmUgb3BlbmVkIGJlZm9yZSBpdCBjYW4gYmUgbmF2aWdhdGVkIG9yIG1hbmlwdWxhdGVkLgotICogVGhlIEphdmEgbW9kZWwgZWxlbWVudCBoYXMgbm8gcGFyZW50IChpdCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBlbGVtZW50IAorICogVGhlIEphdmEgbW9kZWwgZWxlbWVudCBoYXMgbm8gcGFyZW50IChpdCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBlbGVtZW50CiAgKiBoaWVyYXJjaHkpLiBJdHMgY2hpbGRyZW4gYXJlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT5zLgogICogPHA+CiAgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBwZXJmb3JtaW5nIGNvcHksIG1vdmUsIHJlbmFtZSwgYW5kCiAgKiBkZWxldGUgb3BlcmF0aW9ucyBvbiBtdWx0aXBsZSBKYXZhIGVsZW1lbnRzLgogICogPC9wPgogICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gQW4gaW5zdGFuY2UKLSAqIG9mIG9uZSBvZiB0aGVzZSBoYW5kbGVzIGNhbiBiZSBjcmVhdGVkIHZpYQorICogQW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZXNlIGhhbmRsZXMgY2FuIGJlIGNyZWF0ZWQgdmlhCiAgKiA8Y29kZT5KYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlLmdldFJvb3QoKSk8L2NvZGU+LgogICogPC9wPgogICoKICAqIEBzZWUgSmF2YUNvcmUjY3JlYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290KQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhTW9kZWwgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElPcGVuYWJsZSwgSVBhcmVudCB7CiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgbW9kZWwgY29udGFpbnMgYW4gPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPiB3aG9zZQogICogcmVzb3VyY2UgaXMgdGhlIGdpdmVuIHJlc291cmNlIG9yIGEgbm9uLUphdmEgcmVzb3VyY2Ugd2hpY2ggaXMgdGhlIGdpdmVuIHJlc291cmNlLgogICogPHA+Ci0gKiBOb3RlOiBubyBleGlzdGVuY3kgY2hlY2sgaXMgcGVyZm9ybWVkIG9uIHRoZSBhcmd1bWVudCByZXNvdXJjZS4gSWYgaXQgaXMgbm90IGFjY2Vzc2libGUgCi0gKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5pc0FjY2Vzc2libGUoKTwvY29kZT4pIHlldCBidXQgd291bGQgYmUgbG9jYXRlZCBpbiBKYXZhIG1vZGVsIAorICogTm90ZTogbm8gZXhpc3RlbmN5IGNoZWNrIGlzIHBlcmZvcm1lZCBvbiB0aGUgYXJndW1lbnQgcmVzb3VyY2UuIElmIGl0IGlzIG5vdCBhY2Nlc3NpYmxlCisgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5pc0FjY2Vzc2libGUoKTwvY29kZT4pIHlldCBidXQgd291bGQgYmUgbG9jYXRlZCBpbiBKYXZhIG1vZGVsCiAgKiByYW5nZSwgdGhlbiBpdCB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KICAqIDwvcD48cD4KICAqIElmIHRoZSByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLCBpdCBjYW4gYmUgcmVhY2hlZCBieSBuYXZpZ2F0aW5nIHRoZSBKYXZhIG1vZGVsIGRvd24gdXNpbmcgdGhlCkBAIC02Miw5ICs2Myw5IEBACiAgKiBpcyBpbnNlcnRlZCBhcyB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIE9wdGlvbmFsbHksIGVhY2ggY29weSBjYW4gYmUgcmVuYW1lZC4gSWYgCisgKiBPcHRpb25hbGx5LCBlYWNoIGNvcHkgY2FuIGJlIHJlbmFtZWQuIElmCiAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQgZm9yIHRoZSBuZXcgbmFtZSwgdGhlIGNvcHkKLSAqIGlzIG5vdCByZW5hbWVkLiAKKyAqIGlzIG5vdCByZW5hbWVkLgogICogPC9wPgogICogPHA+CiAgKiBPcHRpb25hbGx5LCBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoCkBAIC05NSw2ICs5Niw3IEBACiAgKiAJCW5hbWUgYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4gKDxjb2RlPk5BTUVfQ09MTElTSU9OPC9jb2RlPik8L2xpPgogICogPGxpPiBBIGNvbnRhaW5lciBvciBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgPC9saT4KICAqIDwvdWw+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjSU5WQUxJRF9ERVNUSU5BVElPTgogICovCiB2b2lkIGNvcHkoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogLyoqCkBAIC0xMTQsOSArMTE2LDExIEBACiAgKi8KIHZvaWQgZGVsZXRlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAvKioKLSAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAKKyAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IGJlIGEgdmFsaWQKKyAqIHBhdGggc2VnbWVudCBhcyBkZWZpbmVkIGJ5IHtAbGluayBJUGF0aCNpc1ZhbGlkU2VnbWVudChTdHJpbmcpfS4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAgKiBUaGUgcHJvamVjdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLSAqIAorICoKICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBKYXZhIHByb2plY3QKICAqIEByZXR1cm4gdGhlIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lCiAgKi8KQEAgLTEzNyw4ICsxNDEsOCBAQAogICogTm9uLUphdmEgcHJvamVjdHMgaW5jbHVkZSBhbGwgcHJvamVjdHMgdGhhdCBhcmUgY2xvc2VkIChldmVuIGlmIHRoZXkgaGF2ZSB0aGUKICAqIEphdmEgbmF0dXJlKS4KICAqIDwvcD4KLSAqIAotICogQHJldHVybiBhbiBhcnJheSBvZiBub24tSmF2YSBwcm9qZWN0cyAoPGNvZGU+SVByb2plY3Q8L2NvZGU+cykgY29udGFpbmVkIAorICoKKyAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygbm9uLUphdmEgcHJvamVjdHMgKDxjb2RlPklQcm9qZWN0PC9jb2RlPnMpIGNvbnRhaW5lZAogICogICAgICAgICAgICAgIGluIHRoZSB3b3Jrc3BhY2UuCiAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KICAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQpAQCAtMTQ3LDcgKzE1MSw3IEBACiBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIC8qKgogICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEphdmEgbW9kZWwuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YSBtb2RlbAogICovCiBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpOwpAQCAtMTYzLDkgKzE2Nyw5IEBACiAgKiBpcyBpbnNlcnRlZCBhcyB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIE9wdGlvbmFsbHksIGVhY2ggZWxlbWVudCBjYW4gYmUgcmVuYW1lZC4gSWYgCisgKiBPcHRpb25hbGx5LCBlYWNoIGVsZW1lbnQgY2FuIGJlIHJlbmFtZWQuIElmCiAgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQgZm9yIHRoZSBuZXcgbmFtZSwgdGhlIGVsZW1lbnQKLSAqIGlzIG5vdCByZW5hbWVkLiAKKyAqIGlzIG5vdCByZW5hbWVkLgogICogPC9wPgogICogPHA+CiAgKiBPcHRpb25hbGx5LCBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoCkBAIC0xOTgsNiArMjAyLDcgQEAKICAqIDwvdWw+CiAgKgogICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYW55IGVsZW1lbnQgb3IgY29udGFpbmVyIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjSU5WQUxJRF9ERVNUSU5BVElPTgogICovCiB2b2lkIG1vdmUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCkBAIC0yMDYsNyArMjExLDcgQEAKICAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgaXNzdWUgYSBKYXZhTW9kZWwgZGVsdGEgZGVzY3JpYmluZyB0aGUgZGlzY292ZXJlZCBjaGFuZ2VzLCBpbiB0ZXJtCiAgKiBvZiBKYXZhIGVsZW1lbnQgcGFja2FnZSBmcmFnbWVudCByb290cyBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLgogICogTm90ZSB0aGF0IGEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBjYW4gYmUgcGFzc2VkIHNvIGFzIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGFyY2hpdmVzCi0gKiB0byByZWZyZXNoIChwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IGFsb25nIGlzIGVxdWl2YWxlbnQgdG8gcmVmcmVzaGluZyB0aGUgZW50aXJlIG1vZGUpLiAKKyAqIHRvIHJlZnJlc2ggKHBhc3NpbmcgPGNvZGU+bnVsbDwvY29kZT4gYWxvbmcgaXMgZXF1aXZhbGVudCB0byByZWZyZXNoaW5nIHRoZSBlbnRpcmUgbW9kZSkuCiAgKiBUaGUgZWxlbWVudHMgY2FuIGJlOgogICogPHVsPgogICogPGxpPiBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGNvcnJlc3BvbmRpbmcgdG8gZXh0ZXJuYWwgYXJjaGl2ZXMKQEAgLTIxNywxMyArMjIyLDE2IEBACiAgKiBhbGwgb2YgdGhlbS4gVGhpcyBtZWFucyB0aGF0IGV2ZW4gaWYgYSBwcm9qZWN0IHdhcyBub3QgcGFydCBvZiB0aGUgZWxlbWVudHMgc2NvcGUsIGl0CiAgKiBtYXkgc3RpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyBpZiBpdCBpcyByZWZlcmVuY2luZyBhIGxpYnJhcnkgY29tcHJpc2VkIGluIHRoZSBzY29wZS4KICAqIDxwPgorICogPGI+U2luY2UgMy43PC9iPiwgYSBwcm9qZWN0IHJlZnJlc2ggYXV0b21hdGljYWxseSB0cmlnZ2VycyBhIHJlZnJlc2ggb2YgZXh0ZXJuYWwgYXJjaGl2ZXMuCisgKiBIZW5jZSwgdGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY2FsbGVkIGFmdGVyIGEgcHJvamVjdCByZWZyZXNoLgorICogPHA+CiAgKiBAcGFyYW0gZWxlbWVudHNTY29wZSAtIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBkZWZpbmluZyB0aGUgc2NvcGUgb2YgdGhlIHJlZnJlc2gKICAqIEBwYXJhbSBtb25pdG9yIC0gYSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpbiBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2l0dWF0aW9uOgogICogPHVsPgogICogICAgPGxpPiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBwcm9qZWN0IHJlc291cmNlcyA8L2xpPgogICogPC91bD4KLSAqIAorICoKICAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKICAqIEBzaW5jZSAyLjAKICAqLwpAQCAtMjUwLDcgKzI1OCw3IEBACiAgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQogICogPGxpPiBBIG5ldyBuYW1lIGlzIGludmFsaWQgKDxjb2RlPklOVkFMSURfTkFNRTwvY29kZT4pCiAgKiA8bGk+IEEgY2hpbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCA8Y29kZT5yZXBsYWNlPC9jb2RlPiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT5OQU1FX0NPTExJU0lPTjwvY29kZT4pCi0gKiA8bGk+IEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5ICg8Y29kZT5SRUFEX09OTFk8L2NvZGU+KSAKKyAqIDxsaT4gQW4gZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pCiAgKiA8L3VsPgogICovCiB2b2lkIHJlbmFtZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gZGVzdGluYXRpb25zLCBTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiByZXBsYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEKaW5kZXggZjFlMWFhNS4uOGQ0ODVhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbE1hcmtlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxMiArMTAsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CisKIC8qKgogICogTWFya2VycyB1c2VkIGJ5IHRoZSBKYXZhIG1vZGVsLgogICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBkZWNsYXJlcyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCi0gKiBvciBleHRlbmRlZC4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlY2xhcmVzIGNvbnN0YW50cyBvbmx5LgogICogPC9wPgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhTW9kZWxNYXJrZXIgewogCkBAIC0zNiw3ICszOCw3IEBACiAJICogdHJhbnNpZW50IHByb2JsZW1zIGFyZSByZXBvcnRlZCBhcyA8Y29kZT5JUHJvYmxlbTwvY29kZT4gdGhyb3VnaAogCSAqIHZhcmlvdXMgQVBJLiBPbmx5IHRoZSBldmFsdWF0aW9uIEFQSSBpcyBzdGlsbCBwcm9kdWNpbmcgbWFya2VycyBmb3IKIAkgKiB0cmFuc2llbnQgcHJvYmxlbXMuCi0JICogCisJICoKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklDb2RlU25pcHBldFJlcXVlc3RvciNhY2NlcHRQcm9ibGVtKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIsU3RyaW5nLAogCSAqICAgICAgaW50KQpAQCAtNTEsNyArNTMsNyBAQAogCSAqIGV4YW1wbGUsICdUTy1ETzogLi4uJykuIFRhc2tzIGFyZSBpZGVudGlmaWVkIGJ5IGEgdGFzayB0YWcsIHdoaWNoIGNhbiBiZQogCSAqIGN1c3RvbWl6ZWQgdGhyb3VnaCA8Y29kZT5KYXZhQ29yZTwvY29kZT4gb3B0aW9uCiAJICogPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tUYWciPC9jb2RlPi4KLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAyLjEKIAkgKi8KIAlTdHJpbmcgVEFTS19NQVJLRVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLnRhc2siOyAvLyROT04tTkxTLTEkCkBAIC02MCw5ICs2MiwxNCBAQAogCSAqIElkIG1hcmtlciBhdHRyaWJ1dGUgKHZhbHVlIDxjb2RlPiJhcmd1bWVudHMiPC9jb2RlPikuIEFyZ3VtZW50cyBhcmUKIAkgKiBjb25jYXRlbmF0ZWQgaW50byBvbmUgU3RyaW5nLCBwcmVmaXhlZCB3aXRoIGFuIGFyZ3VtZW50IGNvdW50IChmb2xsb3dlZAogCSAqIHdpdGggY29sb24gc2VwYXJhdG9yKSBhbmQgc2VwYXJhdGVkIHdpdGggJyMnIGNoYXJhY3RlcnMuIEZvciBleGFtcGxlOiB7Ci0JICogImZvbyIsICJiYXIiIH0gaXMgZW5jb2RlZCBhcyAiMjpmb28jYmFyIiwgeyB9IGlzIGVuY29kZWQgYXMgIjA6ICIKKwkgKiAiZm9vIiwgImJhciIgfSBpcyBlbmNvZGVkIGFzICIyOmZvbyNiYXIiLCB7IH0gaXMgZW5jb2RlZCBhcyAiMDoiLgorCSAqIDxwPkVtcHR5IGFyZ3VtZW50IGlzIGVuY29kZWQgYXMgdGhyZWUgc3BhY2VzICgiICAgIikuPC9wPgorCSAqIDxwPklmIHRoZSBhcmd1bWVudCBjb250YWlucyBhICcjJywgdGhlIGNoYXJhY3RlciBpcyBkb3VibGVkLjxicj4KKwkgKiB7ImZvbyN0ZXN0IiwgImJhciIgfSBpcyBlbmNvZGVkIGFzICIyOmZvbyMjdGVzdCNiYXIiCisJICogPC9wPgogCSAqIAogCSAqIEBzaW5jZSAyLjAKKwkgKiBAc2VlIENvcnJlY3Rpb25FbmdpbmUjZ2V0UHJvYmxlbUFyZ3VtZW50cyhJTWFya2VyKQogCSAqLwogCVN0cmluZyBBUkdVTUVOVFMgPSAiYXJndW1lbnRzIjsgLy8kTk9OLU5MUy0xJAogCkBAIC0xMDMsOCArMTEwLDE3IEBACiAJICogQ2xhc3NwYXRoIGZpbGUgZm9ybWF0IG1hcmtlciBhdHRyaWJ1dGUgKHZhbHVlCiAJICogPGNvZGU+ImNsYXNzcGF0aEZpbGVGb3JtYXQiPC9jb2RlPikuIFVzZWQgb25seSBvbiBidWlsZHBhdGggcHJvYmxlbQogCSAqIG1hcmtlcnMuIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBlaXRoZXIgInRydWUiIG9yICJmYWxzZSIuCi0JICogCisJICoKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJU3RyaW5nIENMQVNTUEFUSF9GSUxFX0ZPUk1BVCA9ICJjbGFzc3BhdGhGaWxlRm9ybWF0IjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIE91dHB1dCBvdmVybGFwcGluZyBhbm90aGVyIHNvdXJjZSBhdHRyaWJ1dGUgKHZhbHVlIDxjb2RlPiJvdXRwdXRPdmVybGFwcGluZ1NvdXJjZSI8L2NvZGU+KS4gCisJICogVXNlZCBvbmx5IG9uIGJ1aWxkcGF0aCBwcm9ibGVtIG1hcmtlcnMuIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyAKKwkgKiBlaXRoZXIgInRydWUiIG9yICJmYWxzZSIuCisJICogCisJICogQHNpbmNlIDMuNi40CisJICovCisJU3RyaW5nIE9VVFBVVF9PVkVSTEFQUElOR19TT1VSQ0UgPSAib3V0cHV0T3ZlcmxhcHBpbmdTb3VyY2UiOyAvLyROT04tTkxTLTEkCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzLmphdmEKaW5kZXggODQxMzFjZC4uY2MwM2ExYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwxOCArMjQsMTYgQEAKICAqIDxjb2RlPklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM8L2NvZGU+LgogICogPC9wPgogICogPHA+Ci0gKiBBIEphdmEgbW9kZWwgc3RhdHVzIG1heSBhbHNvIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKHRoYXQgaXMsIGluIAorICogQSBKYXZhIG1vZGVsIHN0YXR1cyBtYXkgYWxzbyBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh0aGF0IGlzLCBpbgogICogYWRkaXRpb24gdG8gdGhlIGluZm9ybWF0aW9uIGRlZmluZWQgaW4gPGNvZGU+SVN0YXR1czwvY29kZT4pOgogICogPHVsPgogICogICA8bGk+ZWxlbWVudHMgLSBvcHRpb25hbCBoYW5kbGVzIHRvIEphdmEgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmYWlsdXJlPC9saT4KICAqICAgPGxpPnN0cmluZyAtIG9wdGlvbmFsIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGZhaWx1cmU8L2xpPgogICogPC91bD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cwogICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUphdmFNb2RlbFN0YXR1cyBleHRlbmRzIElTdGF0dXMgewogLyoqCkBAIC00OSw4ICs0Nyw4IEBACiBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50cygpOwogLyoqCiAgKiBSZXR1cm5zIHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFpbHVyZSAoc2VlIHNwZWNpZmljYXRpb24KLSAqIG9mIHRoZSBzdGF0dXMgY29kZSksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmYWlsdXJlIGlzIG5vdCAKLSAqIG9uZSBvZiA8Y29kZT5ERVZJQ0VfUEFUSDwvY29kZT4sIDxjb2RlPklOVkFMSURfUEFUSDwvY29kZT4sIAorICogb2YgdGhlIHN0YXR1cyBjb2RlKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZhaWx1cmUgaXMgbm90CisgKiBvbmUgb2YgPGNvZGU+REVWSUNFX1BBVEg8L2NvZGU+LCA8Y29kZT5JTlZBTElEX1BBVEg8L2NvZGU+LAogICogPGNvZGU+UEFUSF9PVVRTSURFX1BST0pFQ1Q8L2NvZGU+LCBvciA8Y29kZT5SRUxBVElWRV9QQVRIPC9jb2RlPi4KICAqCiAgKiBAcmV0dXJuIHRoZSBwYXRoIHRoYXQgY2F1c2VkIHRoZSBmYWlsdXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEKaW5kZXggYWQ2NTlmNi4uYTg4ZGI1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDcgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAorICoKICAqIFRPRE8gbWlzc2luZyAyLjEgYW5kIHN1YnNlcXVlbnQgY29udHJpYnV0aW9ucwogICogQ09NUElMRVJfRkFJTFVSRQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNiwxOSArMTYsMTkgQEAKIC8qKgogICogU3RhdHVzIGNvZGVzIHVzZWQgd2l0aCBKYXZhIG1vZGVsIHN0YXR1cyBvYmplY3RzLgogICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBkZWNsYXJlcyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCi0gKiBvciBleHRlbmRlZC4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlY2xhcmVzIGNvbnN0YW50cyBvbmx5LgogICogPC9wPgogICoKICAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cwogICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRDb2RlKCkKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzIHsKIAogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBjb250YWluZXIgcGF0aCB3YXMgcmVzb2x2ZWQKIAkgKiB0byBpbnZhbGlkIGVudHJpZXMgKG51bGwgb3IgY29udGFpbmVyKS4KLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NQX0NPTlRBSU5FUl9FTlRSWSA9IDk2MjsKQEAgLTM2LDcgKzM2LDcgQEAKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgY29udGFpbmVyIHBhdGggd2FzIG5vdCByZXNvbHZhYmxlCiAJICogaW5kaWNhdGluZyBlaXRoZXIgdGhlIHJlZmVycmVkIGNvbnRhaW5lciBpcyB1bmRlZmluZWQsIHVuYm91bmQuCi0JICogCisJICoKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BfQ09OVEFJTkVSX1BBVEhfVU5CT1VORCA9IDk2MzsKQEAgLTU4LDExICs1OCwxMSBAQAogCSAqIFVzZSA8Y29kZT5nZXRFeGNlcHRpb248L2NvZGU+IHRvIHJldHJpZXZlIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SRV9FWENFUFRJT04gPSA5NjY7Ci0gICAgCisKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgZWxlbWVudHMKIAkgKiBzdXBwbGllZCBhcmUgbm90IG9mIGEgdmFsaWQgdHlwZSBmb3IgdGhlIG9wZXJhdGlvbiB0bwotCSAqIHByb2Nlc3MuIAorCSAqIHByb2Nlc3MuCiAJICogVGhlIGVsZW1lbnQocykgY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gb24gdGhlIHN0YXR1cyBvYmplY3QuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9FTEVNRU5UX1RZUEVTID0gOTY3OwpAQCAtNzUsNyArNzUsNyBAQAogCiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBvbmUgb3IgbW9yZSBlbGVtZW50cwotCSAqIHN1cHBsaWVkIGRvIG5vdCBleGlzdC4gCisJICogc3VwcGxpZWQgZG8gbm90IGV4aXN0LgogCSAqIFRoZSBlbGVtZW50KHMpIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IG9uIHRoZSBzdGF0dXMgb2JqZWN0LgogCSAqCiAJICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzI2lzRG9lc05vdEV4aXN0KCkKQEAgLTg3LDIyICs4NywyMiBAQAogCSAqIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9QQVRIID0gOTcwOwotICAgIAorCiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHBhdGggb3V0c2lkZSBvZiB0aGUKLQkgKiBwcm9qZWN0IHdhcyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uLiBUaGUgcGF0aCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIAorCSAqIHByb2plY3Qgd2FzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24uIFRoZSBwYXRoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKIAkgKiA8Y29kZT5nZXRQYXRoPC9jb2RlPiBvbiB0aGUgc3RhdHVzIG9iamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVRIX09VVFNJREVfUFJPSkVDVCA9IDk3MTsKLSAgICAKKwogCS8qKgotCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSByZWxhdGl2ZSBwYXRoIAorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSByZWxhdGl2ZSBwYXRoCiAJICogd2FzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24gd2hlbiBhbiBhYnNvbHV0ZSBwYXRoIGlzCiAJICogcmVxdWlyZWQuIFRoZSBwYXRoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0UGF0aDwvY29kZT4gb24gdGhlCiAJICogc3RhdHVzIG9iamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElWRV9QQVRIID0gOTcyOwotICAgIAorCiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHBhdGggc3BlY2lmeWluZyBhIGRldmljZQogCSAqIHdhcyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIHdoZW4gYSBwYXRoIHdpdGggbm8gZGV2aWNlIGlzCkBAIC0xMTAsNDUgKzExMCw1MCBAQAogCSAqIHN0YXR1cyBvYmplY3QuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BBVEggPSA5NzM7Ci0gICAgCisKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgc3RyaW5nCiAJICogd2FzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24gdGhhdCB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9TVFJJTkcgPSA5NzQ7Ci0gICAgCisKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gZW5jb3VudGVyZWQKIAkgKiBhIHJlYWQtb25seSBlbGVtZW50LgogCSAqIFRoZSBlbGVtZW50KHMpIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IG9uIHRoZSBzdGF0dXMgb2JqZWN0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfT05MWSA9IDk3NjsKLSAgICAKKwogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBuYW1pbmcgY29sbGlzaW9uIHdvdWxkIG9jY3VyCiAJICogaWYgdGhlIG9wZXJhdGlvbiBwcm9jZWVkZWQuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xMSVNJT04gPSA5Nzc7Ci0gICAgCisKIAkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgZGVzdGluYXRpb24gcHJvdmlkZWQgZm9yIGEgY29weS9tb3ZlL3JlbmFtZSBvcGVyYXRpb24gCi0JICogaXMgaW52YWxpZC4gCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIGRlc3RpbmF0aW9uIHByb3ZpZGVkIGZvciBhIGNvcHkvbW92ZS9yZW5hbWUgb3BlcmF0aW9uCisJICogaXMgaW52YWxpZC4gVGhlIGRlc3RpbmF0aW9uIGZvciBhIHBhY2thZ2UgZnJhZ21lbnQgbXVzdCBiZSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdDsgdGhlIAorCSAqIGRlc3RpbmF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgbXVzdCBiZSBhIHBhY2thZ2UgZnJhZ21lbnQ7IHRoZSBkZXN0aW5hdGlvbiBmb3IgCisJICogYSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9yIGltcG9ydCBkZWNsYXJhdGlvbiBtdXN0IGJlIGEgY29tcGlsYXRpb24gdW5pdDsgdGhlIAorCSAqIGRlc3RpbmF0aW9uIGZvciBhIHR5cGUgbXVzdCBiZSBhIHR5cGUgb3IgY29tcGlsYXRpb24gdW5pdDsgdGhlIGRlc3RpbmF0aW9uIGZvciBhbnkgCisJICogdHlwZSBtZW1iZXIgKG90aGVyIHRoYW4gYSB0eXBlKSBtdXN0IGJlIGEgdHlwZS4gPGJyPgorCSAqIAogCSAqIFRoZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IG9uIHRoZSBzdGF0dXMgb2JqZWN0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfREVTVElOQVRJT04gPSA5Nzg7Ci0gICAgCisKIAkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgcGF0aCBwcm92aWRlZCB0byBhbiBvcGVyYXRpb24gCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHBhdGggcHJvdmlkZWQgdG8gYW4gb3BlcmF0aW9uCiAJICogaXMgaW52YWxpZC4gVGhlIHBhdGggY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRQYXRoPC9jb2RlPiBvbiB0aGUKIAkgKiBzdGF0dXMgb2JqZWN0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUEFUSCA9IDk3OTsKLSAgICAKKwogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kcy4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRFWF9PVVRfT0ZfQk9VTkRTID0gOTgwOwotICAgIAorCiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhlcmUgaXMgYW4gdXBkYXRlIGNvbmZsaWN0CiAJICogZm9yIGEgd29ya2luZyBjb3B5LiBUaGUgY29tcGlsYXRpb24gdW5pdCBvbiB3aGljaCB0aGUKQEAgLTE3NywxOSArMTgyLDE5IEBACiAKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGFuIDxjb2RlPmphdmEuaW8uSU9FeGNlcHRpb248L2NvZGU+Ci0JICogb2NjdXJyZWQuIAorCSAqIG9jY3VycmVkLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElPX0VYQ0VQVElPTiA9IDk4NTsKIAogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+Ci0JICogb2NjdXJyZWQuIAorCSAqIG9jY3VycmVkLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTV9FWENFUFRJT04gPSA5ODY7CiAKIAkvKioKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgPGNvZGU+VGFyZ2V0RXhjZXB0aW9uPC9jb2RlPgotCSAqIG9jY3VycmVkLiAKKwkgKiBvY2N1cnJlZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVJHRVRfRVhDRVBUSU9OID0gOTg3OwogCkBAIC0yNTIsNyArMjU3LDcgQEAKIAkgKiBoYXMgYmVlbiBtYWRlIGxvY2FsbHkgYXZhaWxhYmxlLgogCSAqLwogCSBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19MT0NBTF9DT05URU5UUyA9IDk5OTsKLQkgCisKIAkgLyoqCiAJICAqIFN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgYSAuY2xhc3NwYXRoIGZpbGUgaXMgaWxsLWZvcm1lZCwgYW5kIHRodXMgY2Fubm90CiAJICAqIGJlIHJlYWQvd3JpdHRlbiBzdWNjZXNzZnVsbHkuCkBAIC0yNjUsMTAgKzI3MCwxMCBAQAogCSAgKiBAc2luY2UgMi4xCiAJICAqLwogCSBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU1BBVEhfQ1lDTEUgPSAxMDAxOwotCSAKKwogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYW4gaW5jbHVzaW9uIG9yIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuIGdvdCBzcGVjaWZpZWQKLQkgKiBvbiBhIGNsYXNzcGF0aCBzb3VyY2UgZW50cnksIHRob3VnaCBpdCB3YXMgZXhwbGljaXRlbHkgZGlzYWJsZWQgCisJICogb24gYSBjbGFzc3BhdGggc291cmNlIGVudHJ5LCB0aG91Z2ggaXQgd2FzIGV4cGxpY2l0ZWx5IGRpc2FibGVkCiAJICogYWNjb3JkaW5nIHRvIGl0cyBwcm9qZWN0IHByZWZlcmVuY2Ugc2V0dGluZ3MuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QjZ2V0T3B0aW9ucyhib29sZWFuKQogCSAqIEBzaW5jZSAyLjEKQEAgLTI4MywyNSArMjg4LDI1IEBACiAJICogQHNpbmNlIDIuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEX0NQX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMgPSAxMDAzOwotCQorCiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHByb2plY3QgaXMgcHJlcmVxdWlzaXRpbmcgc29tZSBsaWJyYXJ5IGZvciB3aGljaCB0aGUKLQkgKiBjbGFzc2ZpbGUgSkRLIHZlcnNpb24gbGV2ZWwgaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgcHJvamVjdCBKREsgdGFyZ2V0IGxldmVsIHNldHRpbmcuIAorCSAqIGNsYXNzZmlsZSBKREsgdmVyc2lvbiBsZXZlbCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBwcm9qZWN0IEpESyB0YXJnZXQgbGV2ZWwgc2V0dGluZy4KIAkgKiBUaGlzIGNhbiBpbmRpY2F0ZSBzb21lIGJpbmFyeSBpbmNvbXBhdGliaWxpdHkgaXNzdWVzIGxhdGVyIG9uLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNPTVBBVElCTEVfSkRLX0xFVkVMCT0gMTAwNDsKLQkKKwogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBjb21waWxlciBmYWlsdXJlIG9jY3VycmVkLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QSUxFUl9GQUlMVVJFCT0gMTAwNTsJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUElMRVJfRkFJTFVSRQk9IDEwMDU7CiAJLyoqCiAJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhbiBlbGVtZW50IGlzIG5vdCBvbiBpdHMgcHJvamVjdCdzIGNsYXNwYXRoLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX05PVF9PTl9DTEFTU1BBVEgJPSAxMDA2OwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX05PVF9PTl9DTEFTU1BBVEgJPSAxMDA2OwogCS8qKgogCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBjb21waWxlciBvcHRpb24gaXMgaW52YWxpZC4KIAkgKiBAc2luY2UgMy4xCkBAIC0zMDksMjEgKzMxNCw0MiBAQAogLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DT01QSUxFUl9PUFRJT04gPSAxMDA3OwogCS8qKgogCSAqIDxwPlN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIGF0dGFjaGVkIGphdmFkb2MgY29udGVudCBjYW5ub3QgYmUgcmV0cmlldmVkIGR1ZSB0byBtdWx0aXBsZSByZWFzb25zOgotCSAqIGludmFsaWQgdXJsLCB0aW1lZC1vdXQsLi4uPC9wPgotCSAqIAorCSAqIGludmFsaWQgdXJsLCBpbmNvcnJlY3QgcHJveHksIHdyb25nIGF1dGhlbnRpY2F0aW9uLC4uLjwvcD4KKwkgKgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfUkVUUklFVkVfQVRUQUNIRURfSkFWQURPQyA9IDEwMDg7CiAJLyoqCiAJICogPHA+U3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgYXR0YWNoZWQgamF2YWRvYyBjb250ZW50IGZvcm1hdCBpcyB1bnJlY29nbml6ZWQuPC9wPgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fSkFWQURPQ19GT1JNQVQgPSAxMDA5OwogCS8qKgogCSAqIDxwPlN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQuPC9wPgotCSAqIAorCSAqCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFUFJFQ0FURURfVkFSSUFCTEUgPSAxMDEwOworCisJLyoqCisJICogPHA+U3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHRleHQgZWRpdCBjYW4gbm90IGJlIGFwcGxpZWQgYXMgdGhlcmUKKwkgKiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgdGV4dCBlZGl0IGxvY2F0aW9uLjwvcD4KKwkgKgorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfVEVYVF9FRElUX0xPQ0FUSU9OID0gMTAxMTsKKwkKKwkvKioKKwkgKiA8cD5TdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBhdHRhY2hlZCBqYXZhZG9jIGNvbnRlbnQgY2Fubm90IGJlIHJldHJpZXZlZCBkdWUgdG8gdGltZW91dAorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfUkVUUklFVkVfQVRUQUNIRURfSkFWQURPQ19USU1FT1VUID0gMTAxMjsKKwkKKwkvKioKKwkgKiA8cD5TdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWZhdWx0IG9yIHNwZWNpZmljIG91dHB1dCBmb2xkZXIgaXMgb3ZlcmxhcHBpbmcKKwkgKiB3aXRoIGFub3RoZXIgc291cmNlIGxvY2F0aW9uLiA8L3A+CisJICogQHNpbmNlIDMuNi40CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFID0gMTAxMzsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFQcm9qZWN0LmphdmEKaW5kZXggMTI5OWZkYS4uNjQ5MzVhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFQcm9qZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFQcm9qZWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOCw3ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBnZXRPcHRpb24oU3RyaW5nLCBib29sZWFuKSwgZ2V0T3B0aW9ucyhib29sZWFuKSBhbmQgc2V0T3B0aW9ucyhNYXApCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gZGVwcmVjYXRlZCBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkpIGFuZCAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBkZXByZWNhdGVkIGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKElDbGFzc3BhdGhFbnRyeSkgYW5kCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5KQogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIGlzT25DbGFzc3BhdGgoSVJlc291cmNlKQogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHNldE9wdGlvbihTdHJpbmcsIFN0cmluZykKQEAgLTIzLDEyICsyMywxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQW5ub3RhdGlvbkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dDsKIAogLyoqCi0gKiBBIEphdmEgcHJvamVjdCByZXByZXNlbnRzIGEgdmlldyBvZiBhIHByb2plY3QgcmVzb3VyY2UgaW4gdGVybXMgb2YgSmF2YSAKKyAqIEEgSmF2YSBwcm9qZWN0IHJlcHJlc2VudHMgYSB2aWV3IG9mIGEgcHJvamVjdCByZXNvdXJjZSBpbiB0ZXJtcyBvZiBKYXZhCiAgKiBlbGVtZW50cyBzdWNoIGFzIHBhY2thZ2UgZnJhZ21lbnRzLCB0eXBlcywgbWV0aG9kcyBhbmQgZmllbGRzLgotICogQSBwcm9qZWN0IG1heSBjb250YWluIHNldmVyYWwgcGFja2FnZSByb290cywgd2hpY2ggY29udGFpbiBwYWNrYWdlIGZyYWdtZW50cy4gCisgKiBBIHByb2plY3QgbWF5IGNvbnRhaW4gc2V2ZXJhbCBwYWNrYWdlIHJvb3RzLCB3aGljaCBjb250YWluIHBhY2thZ2UgZnJhZ21lbnRzLgogICogQSBwYWNrYWdlIHJvb3QgY29ycmVzcG9uZHMgdG8gYW4gdW5kZXJseWluZyBmb2xkZXIgb3IgSkFSLgogICogPHA+CiAgKiBFYWNoIEphdmEgcHJvamVjdCBoYXMgYSBjbGFzc3BhdGgsIGRlZmluaW5nIHdoaWNoIGZvbGRlcnMgY29udGFpbiBzb3VyY2UgY29kZSBhbmQKQEAgLTQyLDQ3ICs0Nyw2NSBAQAogICogZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gYW5kIGNvbnRlbnRzIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCiAgKiA8L3A+CiAgKiBKYXZhIHByb2plY3QgZWxlbWVudHMgbmVlZCB0byBiZSBvcGVuZWQgYmVmb3JlIHRoZXkgY2FuIGJlIG5hdmlnYXRlZCBvciBtYW5pcHVsYXRlZC4KLSAqIFRoZSBjaGlsZHJlbiBvZiBhIEphdmEgcHJvamVjdCBhcmUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgdGhhdCBhcmUgCisgKiBUaGUgY2hpbGRyZW4gb2YgYSBKYXZhIHByb2plY3QgYXJlIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIHRoYXQgYXJlCiAgKiBkZWZpbmVkIGJ5IHRoZSBjbGFzc3BhdGggYW5kIGNvbnRhaW5lZCBpbiB0aGlzIHByb2plY3QgKGluIG90aGVyIHdvcmRzLCBpdAotICogZG9lcyBub3QgaW5jbHVkZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGZvciBvdGhlciBwcm9qZWN0cykuCisgKiBkb2VzIG5vdCBpbmNsdWRlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgZm9yIG90aGVyIHByb2plY3RzKS4gVGhlIGNoaWxkcmVuCisgKiAoaS5lLiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cykgYXBwZWFyIGluIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGJ5IAorICogdGhlIGNsYXNzcGF0aC4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIEFuIGluc3RhbmNlCi0gKiBvZiBvbmUgb2YgdGhlc2UgaGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB2aWEgCisgKiBBbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlc2UgaGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB2aWEKICAqIDxjb2RlPkphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTwvY29kZT4uCiAgKiA8L3A+CiAgKgogICogQHNlZSBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCiAgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvamVjdCBleHRlbmRzIElQYXJlbnQsIElKYXZhRWxlbWVudCwgSU9wZW5hYmxlIHsKIAogCS8qKgorCSAqIFBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIHJvb3QuCisJICogCisJICogPHA+VGhlIGZpbGUgaXMgYSBjaGlsZCBvZiB0aGUgcHJvamVjdCBmb2xkZXIuPC9wPgorCSAqIDxwPlRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIHVuc3BlY2lmaWVkIGFuZCBpdCBpcyBub3QgbWVhbnQgdG8gYmUgbW9kaWZpZWQuCisJICogSXRzIGNvbnRlbnRzIGlzIG1vZGlmaWVkIGJ5IHVzaW5nIHRoZSA8Y29kZT5JSmF2YVByb2plY3Qjc2V0UmF3Q2xhc3NwYXRoKC4uKTwvY29kZT4gbWV0aG9kcy48L3A+CisJICogCisJICogQHNlZSAjc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqIEBzZWUgI3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKwkgKiBAc2VlICNzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqIEBzZWUgI3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSwgSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqIEBzZWUgI3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSwgSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisJICogQHNpbmNlIDMuNworCSAqLworCVN0cmluZyBDTEFTU1BBVEhfRklMRV9OQU1FID0gIi5jbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBEZWNvZGVzIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBoYXMgYmVlbiBlbmNvZGVkIGluIHRoZSBnaXZlbiBzdHJpbmcKIAkgKiBpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb2plY3QuCiAJICogUmV0dXJucyBudWxsIGlmIHRoZSBlbmNvZGVkIGVudHJ5IGlzIG1hbGZvcm1lZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbmNvZGVkRW50cnkgdGhlIGVuY29kZWQgY2xhc3NwYXRoIGVudHJ5CiAJICogQHJldHVybiB0aGUgZGVjb2RlZCBjbGFzc3BhdGggZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBkZWNvZGUgaXQKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJSUNsYXNzcGF0aEVudHJ5IGRlY29kZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBlbmNvZGVkRW50cnkpOwotCQorCiAJLyoqCiAJICogRW5jb2RlcyB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGVudHJ5IGludG8gYSBzdHJpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm9qZWN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IHRoZSBjbGFzc3BhdGggZW50cnkgdG8gZW5jb2RlCiAJICogQHJldHVybiB0aGUgZW5jb2RlZCBjbGFzc3BhdGggZW50cnkKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJU3RyaW5nIGVuY29kZUNsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY2xhc3NwYXRoLXJlbGF0aXZlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggCisJICogY2xhc3NwYXRoLXJlbGF0aXZlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2gKIAkgKiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGlzIGZvdW5kLiBUaGUgcmVzdWx0IGlzIG9uZSBvZiBhbgogCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LCA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPi4gCisJICogPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT4uCiAJICogPHA+CiAJICogV2hlbiBsb29raW5nIGZvciBhIHBhY2thZ2UgZnJhZ21lbnQsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgcG90ZW50aWFsCiAJICogbWF0Y2hlczsgb25seSBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KQEAgLTk1LDE0ICsxMTgsMTQgQEAKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPgogCSAqICBvciBhYnNvbHV0ZQogCSAqIEByZXR1cm4gdGhlIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGgtcmVsYXRpdmUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCAKKwkgKiBjbGFzc3BhdGgtcmVsYXRpdmUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAogCSAqIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gaXMgZm91bmQKIAkgKi8KIAlJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGgtcmVsYXRpdmUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCAKKwkgKiBjbGFzc3BhdGgtcmVsYXRpdmUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAogCSAqIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gaXMgZm91bmQuIFRoZSByZXN1bHQgaXMgb25lIG9mIGFuCiAJICogPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4sIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+LCBvcgogCSAqIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+LiBJZiBpdCBpcyBhbiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiwKQEAgLTEyMSwxMyArMTQ0LDUxIEBACiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiAgb3IgYWJzb2x1dGUKIAkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY2xhc3NwYXRoLXJlbGF0aXZlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggCisJICogY2xhc3NwYXRoLXJlbGF0aXZlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2gKIAkgKiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGlzIGZvdW5kCiAJICogQHNpbmNlIDMuMAogCSAqLwogCUlKYXZhRWxlbWVudCBmaW5kRWxlbWVudChJUGF0aCBwYXRoLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAJLyoqCisJICogRmluZHMgdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBiaW5kaW5nIGtleSBpZiBhbnksCisJICogZWxzZSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBFbGVtZW50cyBhcmUgbG9va2VkIHVwIHVzaW5nIHRoaXMKKwkgKiBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGUgZmlyc3QgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvCisJICogdGhlIGdpdmVuIGtleSBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggaXMgcmV0dXJuZWQuCisJICogPHA+UG9zc2libGUgZWxlbWVudHMgYXJlOgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGZvciBhIGJpbmRpbmcga2V5IGZyb20gYW4KKwkgKiAJCXtAbGluayBJUGFja2FnZUJpbmRpbmd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElUeXBlfSBmb3IgYSBiaW5kaW5nIGtleSBmcm9tIGFuIHtAbGluayBJVHlwZUJpbmRpbmd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElNZXRob2R9IGZvciBhIGJpbmRpbmcga2V5IGZyb20gYW4ge0BsaW5rIElNZXRob2RCaW5kaW5nfTwvbGk+CisJICogPGxpPntAbGluayBJRmllbGR9IGZvciBhIGJpbmRpbmcga2V5IGZyb20gYW4ge0BsaW5rIElWYXJpYWJsZUJpbmRpbmd9CisJICogCQlyZXByZXNlbnRpbmcgYSB7QGxpbmsgSVZhcmlhYmxlQmluZGluZyNpc0ZpZWxkKCkgZmllbGR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElUeXBlUGFyYW1ldGVyfSBmb3IgYSBiaW5kaW5nIGtleSBmcm9tIGFuIHtAbGluayBJVHlwZUJpbmRpbmd9CisJICogCQlyZXByZXNlbnRpbmcgYSB7QGxpbmsgSVR5cGVCaW5kaW5nI2lzVHlwZVZhcmlhYmxlKCkgdHlwZQorCSAqIAkJdmFyaWFibGV9PC9saT4KKwkgKiA8bGk+e0BsaW5rIElBbm5vdGF0aW9ufSBmb3IgYSBiaW5kaW5nIGtleSBmcm9tIGFuCisJICogCQl7QGxpbmsgSUFubm90YXRpb25CaW5kaW5nfTwvbGk+CisJICogPC91bD48L3A+CisJICogPHA+Tm90ZTogaWYgdHdvIG1ldGhvZHMgY29ycmVzcG9uZCB0byB0aGUgYmluZGluZyBrZXkgYmVjYXVzZSB0aGVpcgorCSAqIHBhcmFtZXRlciB0eXBlcycgc2ltcGxlIG5hbWVzIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGUgZmlyc3Qgb25lIGlzIHJldHVybmVkLgorCSAqIEZvciBleGFtcGxlLCBpZiBhIGNsYXNzIGRlZmluZXMgdHdvIG1ldGhvZHMgPGNvZGU+Zm9vKHAxLlksIFN0cmluZyk8L2NvZGU+CisJICogYW5kIDxjb2RlPmZvbyhwMi5ZLCBTdHJpbmcpPC9jb2RlPiwgaW4gYm90aCBjYXNlcyB0aGUgcGFyYW1ldGVyIHR5cGUncworCSAqIHNpbXBsZSBuYW1lcyAgYXJlIDxjb2RlPnsiWSIsICJTdHJpbmcifTwvY29kZT4uIFRodXMKKwkgKiA8Y29kZT5mb28ocDEuWSwgU3RyaW5nKTwvY29kZT4gaXMgcmV0dXJuZWQuPC9wPgorCSAqCisJICogQHBhcmFtIGJpbmRpbmdLZXkgdGhlIGdpdmVuIGJpbmRpbmcga2V5CisJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB0aGUgcmV0dXJuZWQgZWxlbWVudCdzIGNvbXBpbGF0aW9uIHVuaXQsCisJICogCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCB3b3JraW5nIGNvcHkgb3duZXIgbXVzdCBiZQorCSAqIAkJdXNlZAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorCSAqIEByZXR1cm4gdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXksCisJICogCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIEphdmEgZWxlbWVudCBpcyBmb3VuZAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIGJpbmRpbmdLZXksIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBmaXJzdCBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IG9uIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aAogCSAqIHdob3NlIHBhdGggbWF0Y2hlcyB0aGUgZ2l2ZW4gKGFic29sdXRlKSBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogZXhpc3QuCkBAIC0xNjEsMTYgKzIyMiwxNiBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCS8qKgogCSAqIFJldHVybnMgdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gZW50cnkuCi0JICogTm90ZSB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IHRoYXQgcmVmZXJzIHRvIGFub3RoZXIgcHJvamVjdCBtYXkKLQkgKiBoYXZlIG1vcmUgdGhhbiBvbmUgcm9vdCAoaWYgdGhhdCBwcm9qZWN0IGhhcyBtb3JlIHRoYW4gb24gcm9vdAotCSAqIGNvbnRhaW5pbmcgc291cmNlKSwgYW5kIGNsYXNzcGF0aCBlbnRyaWVzIHdpdGhpbiB0aGUgY3VycmVudAotCSAqIHByb2plY3QgaWRlbnRpZnkgYSBzaW5nbGUgcm9vdC4KKwkgKiBBIGNsYXNzcGF0aCBlbnRyeSB3aXRoaW4gdGhlIGN1cnJlbnQgcHJvamVjdCBpZGVudGlmaWVzIGEgc2luZ2xlIHJvb3QuCiAJICogPHA+CiAJICogSWYgdGhlIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgdmFyaWFibGUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHJldHVybgogCSAqIHRoZSByb290cyBvZiB0aGUgdGFyZ2V0IGVudHJ5IChlbXB0eSBpZiBub3QgcmVzb2x2YWJsZSkuCiAJICogPHA+CiAJICogSWYgdGhlIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgY29udGFpbmVyLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFuZCByZXR1cm4KIAkgKiB0aGUgcm9vdHMgY29ycmVzcG9uZGluZyB0byB0aGUgc2V0IG9mIGNvbnRhaW5lciBlbnRyaWVzIChlbXB0eSBpZiBub3QgcmVzb2x2YWJsZSkuCisJICogPHA+CisJICogVGhlIHJlc3VsdCBkb2VzIG5vdCBpbmNsdWRlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaW4gb3RoZXIgcHJvamVjdHMKKwkgKiByZWZlcmVuY2VkIG9uIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aC4KIAkgKiAKIAkgKiBAcGFyYW0gZW50cnkgdGhlIGdpdmVuIGVudHJ5CiAJICogQHJldHVybiB0aGUgZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBlbnRyeQpAQCAtMTc5LDIxICsyNDAsMjEgQEAKIAkgKi8KIAlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgZW50cnkpOwogCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKIAkgKiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kLgogCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gRm9yIGV4YW1wbGUsCi0JICogYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgdHlwZSBvZiBhIGNsYXNzIEEgaW4gcGFja2FnZSB4Lnkgc2hvdWxkIGhhdmUgYSAKKwkgKiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciB0eXBlIG9mIGEgY2xhc3MgQSBpbiBwYWNrYWdlIHgueSBzaG91bGQgaGF2ZSBhCiAJICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lICJ4LnkuQS5CIi4KLQkgKiAKKwkgKgogCSAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byBiZSBmb3VuZCwgYSB0eXBlIG5hbWUgKG9yIGl0cyB0b3BsZXZlbCBlbmNsb3NpbmcKLQkgKiB0eXBlIG5hbWUpIG11c3QgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdCBuYW1lLiBBcyBhIAorCSAqIHR5cGUgbmFtZSkgbXVzdCBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0IG5hbWUuIEFzIGEKIAkgKiBjb25zZXF1ZW5jZSwgc2Vjb25kYXJ5IHR5cGVzIGNhbm5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCiAJICogVG8gZmluZCBzZWNvbmRhcnkgdHlwZXMgdXNlIHtAbGluayAjZmluZFR5cGUoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKX0gaW5zdGVhZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmdWxseVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aAogCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKIAkgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQogCSAqIEBzaW5jZSAyLjAKQEAgLTIwMiwzOCArMjYzLDM4IEBACiAJLyoqCiAJICogU2FtZSBmdW5jdGlvbmFsaXR5IGFzIHtAbGluayAjZmluZFR5cGUoU3RyaW5nKX0gYnV0IGFsc28gbG9vayBmb3Igc2Vjb25kYXJ5CiAJICogdHlwZXMgaWYgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBtYXRjaCBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmdWxseVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAJICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MgdG8sCiAJICogCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIG1vbml0b3IgaXMgcHJvdmlkZWQKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCisJICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoCiAJICogd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZAogCSAqIEBzZWUgSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCiAJICogQHNpbmNlIDMuMgogCSAqLwogCUlUeXBlIGZpbmRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKIAkgKiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kLgogCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gRm9yIGV4YW1wbGUsCi0JICogYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgdHlwZSBvZiBhIGNsYXNzIEEgaW4gcGFja2FnZSB4Lnkgc2hvdWxkIGhhdmUgYSAKKwkgKiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciB0eXBlIG9mIGEgY2xhc3MgQSBpbiBwYWNrYWdlIHgueSBzaG91bGQgaGF2ZSBhCiAJICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lICJ4LnkuQS5CIi4KIAkgKiBJZiB0aGUgcmV0dXJuZWQgdHlwZSBpcyBwYXJ0IG9mIGEgY29tcGlsYXRpb24gdW5pdCwgaXRzIG93bmVyIGlzIHRoZSBnaXZlbgogCSAqIG93bmVyLgotCSAqIAorCSAqCiAJICogTm90ZSB0aGF0IGluIG9yZGVyIHRvIGJlIGZvdW5kLCBhIHR5cGUgbmFtZSAob3IgaXRzIHRvcGxldmVsIGVuY2xvc2luZwotCSAqIHR5cGUgbmFtZSkgbXVzdCBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0IG5hbWUuIEFzIGEgCisJICogdHlwZSBuYW1lKSBtdXN0IG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4gQXMgYQogCSAqIGNvbnNlcXVlbmNlLCBzZWNvbmRhcnkgdHlwZXMgY2Fubm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eS4KIAkgKiBUbyBmaW5kIHNlY29uZGFyeSB0eXBlcyB1c2Uge0BsaW5rICNmaW5kVHlwZShTdHJpbmcsIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpfQogCSAqIGluc3RlYWQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZQogCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2YgdGhlIHJldHVybmVkIHR5cGUncyBjb21waWxhdGlvbiB1bml0CiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aAogCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKIAkgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQogCSAqIEBzaW5jZSAzLjAKQEAgLTI0MywzOSArMzA0LDM5IEBACiAJICogU2FtZSBmdW5jdGlvbmFsaXR5IGFzIHtAbGluayAjZmluZFR5cGUoU3RyaW5nLCBXb3JraW5nQ29weU93bmVyKX0KIAkgKiBidXQgYWxzbyBsb29rIGZvciBzZWNvbmRhcnkgdHlwZXMgaWYgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBtYXRjaAogCSAqIGEgY29tcGlsYXRpb24gdW5pdCBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUKIAkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHRoZSByZXR1cm5lZCB0eXBlJ3MgY29tcGlsYXRpb24gdW5pdAogCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvLAogCSAqIAlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBtb25pdG9yIGlzIHByb3ZpZGVkCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aAogCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKIAkgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lLCBXb3JraW5nQ29weU93bmVyIG93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCisJICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoCiAJICogd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGFuZCB0eXBlIHF1YWxpZmllZCBuYW1lCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZC4KIAkgKiBUaGUgcGFja2FnZSBuYW1lIGlzIGEgZG90LXNlcGFyYXRlZCBuYW1lLgogCSAqIFRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIGlzIGFsc28gYSBkb3Qtc2VwYXJhdGVkIG5hbWUuIEZvciBleGFtcGxlLAotCSAqIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIHR5cGUgb2YgYSBjbGFzcyBBIHNob3VsZCBoYXZlIHRoZSAKKwkgKiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciB0eXBlIG9mIGEgY2xhc3MgQSBzaG91bGQgaGF2ZSB0aGUKIAkgKiB0eXBlIHF1YWxpZmllZCBuYW1lICJBLkIiLgotCSAqIAorCSAqCiAJICogTm90ZSB0aGF0IGluIG9yZGVyIHRvIGJlIGZvdW5kLCBhIHR5cGUgbmFtZSAob3IgaXRzIHRvcGxldmVsIGVuY2xvc2luZwotCSAqIHR5cGUgbmFtZSkgbXVzdCBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0IG5hbWUuIEFzIGEgCisJICogdHlwZSBuYW1lKSBtdXN0IG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4gQXMgYQogCSAqIGNvbnNlcXVlbmNlLCBzZWNvbmRhcnkgdHlwZXMgY2Fubm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eS4KIAkgKiBUbyBmaW5kIHNlY29uZGFyeSB0eXBlcyB1c2Uge0BsaW5rICNmaW5kVHlwZShTdHJpbmcsIFN0cmluZywgSVByb2dyZXNzTW9uaXRvcil9CiAJICogaW5zdGVhZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCiAJICogQHBhcmFtIHR5cGVRdWFsaWZpZWROYW1lIHRoZSBnaXZlbiB0eXBlIHF1YWxpZmllZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aAogCSAqIHdpdGggdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBxdWFsaWZpZWQgbmFtZQogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKIAkgKiBAc2VlIElUeXBlI2dldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIpCkBAIC0yODUsNDIgKzM0Niw0MiBAQAogCS8qKgogCSAqIFNhbWUgZnVuY3Rpb25hbGl0eSBhcyB7QGxpbmsgI2ZpbmRUeXBlKFN0cmluZywgU3RyaW5nKX0gYnV0IGFsc28gbG9vayBmb3IKIAkgKiBzZWNvbmRhcnkgdHlwZXMgaWYgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBtYXRjaCBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCiAJICogQHBhcmFtIHR5cGVRdWFsaWZpZWROYW1lIHRoZSBnaXZlbiB0eXBlIHF1YWxpZmllZCBuYW1lCiAJICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MgdG8sCiAJICogCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIG1vbml0b3IgaXMgcHJvdmlkZWQKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCisJICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoCiAJICogd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZAogCSAqIEBzZWUgSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCiAJICogQHNpbmNlIDMuMgogCSAqLwogCUlUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCisJICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoCiAJICogd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGFuZCB0eXBlIHF1YWxpZmllZCBuYW1lCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZC4KIAkgKiBUaGUgcGFja2FnZSBuYW1lIGlzIGEgZG90LXNlcGFyYXRlZCBuYW1lLgogCSAqIFRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIGlzIGFsc28gYSBkb3Qtc2VwYXJhdGVkIG5hbWUuIEZvciBleGFtcGxlLAotCSAqIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIHR5cGUgb2YgYSBjbGFzcyBBIHNob3VsZCBoYXZlIHRoZSAKKwkgKiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciB0eXBlIG9mIGEgY2xhc3MgQSBzaG91bGQgaGF2ZSB0aGUKIAkgKiB0eXBlIHF1YWxpZmllZCBuYW1lICJBLkIiLgogCSAqIElmIHRoZSByZXR1cm5lZCB0eXBlIGlzIHBhcnQgb2YgYSBjb21waWxhdGlvbiB1bml0LCBpdHMgb3duZXIgaXMgdGhlIGdpdmVuCiAJICogb3duZXIuCi0JICogCisJICoKIAkgKiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYmUgZm91bmQsIGEgdHlwZSBuYW1lIChvciBpdHMgdG9wbGV2ZWwgZW5jbG9zaW5nCi0JICogdHlwZSBuYW1lKSBtdXN0IG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4gQXMgYSAKKwkgKiB0eXBlIG5hbWUpIG11c3QgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdCBuYW1lLiBBcyBhCiAJICogY29uc2VxdWVuY2UsIHNlY29uZGFyeSB0eXBlcyBjYW5ub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBmdW5jdGlvbmFsaXR5LgogCSAqIFRvIGZpbmQgc2Vjb25kYXJ5IHR5cGVzIHVzZSB7QGxpbmsgI2ZpbmRUeXBlKFN0cmluZywgU3RyaW5nLCBXb3JraW5nQ29weU93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yKX0KIAkgKiBpbnN0ZWFkLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKIAkgKiBAcGFyYW0gdHlwZVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIHR5cGUgcXVhbGlmaWVkIG5hbWUKIAkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHRoZSByZXR1cm5lZCB0eXBlJ3MgY29tcGlsYXRpb24gdW5pdAogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKIAkgKiB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgcXVhbGlmaWVkIG5hbWUKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kCiAJICogQHNlZSBJVHlwZSNnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyKQpAQCAtMzMwLDcgKzM5MSw3IEBACiAJLyoqCiAJICogU2FtZSBmdW5jdGlvbmFsaXR5IGFzIHtAbGluayAjZmluZFR5cGUoU3RyaW5nLCBTdHJpbmcsIFdvcmtpbmdDb3B5T3duZXIpfQogCSAqIGJ1dCBhbHNvIGxvb2sgZm9yIHNlY29uZGFyeSB0eXBlcyBpZiBnaXZlbiBuYW1lIGRvZXMgbm90IG1hdGNoIGEgY29tcGlsYXRpb24gdW5pdCBuYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKIAkgKiBAcGFyYW0gdHlwZVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIHR5cGUgcXVhbGlmaWVkIG5hbWUKIAkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHRoZSByZXR1cm5lZCB0eXBlJ3MgY29tcGlsYXRpb24gdW5pdApAQCAtMzM4LDEzICszOTksMTMgQEAKIAkgKiAJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvciBpcyBwcm92aWRlZAogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKIAkgKiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kCiAJICogQHNlZSBJVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUmV0dXJucyBhbGwgb2YgdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgdGhhdCBleGlzdAogCSAqIG9uIHRoZSBjbGFzc3BhdGgsIGluIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGJ5IHRoZSBjbGFzc3BhdGguCkBAIC0zNjgsOCArNDI5LDggQEAKIAkgKiBhcmUgY29uc2lkZXJlZCBub24tSmF2YSByZXNvdXJjZXMgYW5kIHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHQKIAkgKiAocG9zc2libHkgaW4gYSBmb2xkZXIpCiAJICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzICg8Y29kZT5JRmlsZTwvY29kZT5zIGFuZC9vciAKKwkgKgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzICg8Y29kZT5JRmlsZTwvY29kZT5zIGFuZC9vcgogCSAqICAgICAgICAgICAgICA8Y29kZT5JRm9sZGVyPC9jb2RlPnMpIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiB0aGlzIHByb2plY3QKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKQEAgLTM4Miw3ICs0NDMsNyBAQAogCSAqIDxwPgogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gb3B0aW9uTmFtZSB0aGUgbmFtZSBvZiBhbiBvcHRpb24KIAkgKiBAcGFyYW0gaW5oZXJpdEphdmFDb3JlT3B0aW9ucyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIEphdmFDb3JlIG9wdGlvbnMgc2hvdWxkIGJlIGluaGVyaXRlZCBhcyB3ZWxsCiAJICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIGEgZ2l2ZW4gb3B0aW9uCkBAIC0zOTAsNyArNDUxLDcgQEAKIAkgKiBAc2luY2UgMi4xCiAJICovCiAJU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHRhYmxlIG9mIHRoZSBjdXJyZW50IGN1c3RvbSBvcHRpb25zIGZvciB0aGlzIHByb2plY3QuIFByb2plY3RzIHJlbWVtYmVyIHRoZWlyIGN1c3RvbSBvcHRpb25zLAogCSAqIGluIG90aGVyIHdvcmRzLCBvbmx5IHRoZSBvcHRpb25zIGRpZmZlcmVudCBmcm9tIHRoZSB0aGUgSmF2YUNvcmUgZ2xvYmFsIG9wdGlvbnMgZm9yIHRoZSB3b3Jrc3BhY2UuCkBAIC0zOTgsOSArNDU5LDkgQEAKIAkgKiA8cD4KIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBKYXZhQ29yZSBvcHRpb25zIHNob3VsZCBiZSBpbmhlcml0ZWQgYXMgd2VsbAotCSAqIEByZXR1cm4gdGFibGUgb2YgY3VycmVudCBzZXR0aW5ncyBvZiBhbGwgb3B0aW9ucyAKKwkgKiBAcmV0dXJuIHRhYmxlIG9mIGN1cnJlbnQgc2V0dGluZ3Mgb2YgYWxsIG9wdGlvbnMKIAkgKiAgIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikKIAkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKIAkgKiBAc2luY2UgMi4xCkBAIC00MjEsNyArNDgyLDcgQEAKIAkgKiBjbGFzcyBmaWxlcyBmb3IgdGhlIHByb2plY3QgbWF5IGVuZCB1cCBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZm9sZGVycywKIAkgKiByYXRoZXIgdGhhbiBhbGwgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciAod2hpY2ggaXMgbW9yZSBzdGFuZGFyZCkuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlcgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdAogCSAqIEBzZWUgI3NldE91dHB1dExvY2F0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKQEAgLTQzMCwyNiArNDkxLDI4IEBACiAJSVBhdGggZ2V0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAJLyoqCi0JICogUmV0dXJucyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIEpBUiBhdCB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIHBhdGguCisJICogUmV0dXJucyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgYW4gZXh0ZXJuYWwgbGlicmFyeQorCSAqIChhIFpJUCBhcmNoaXZlIC0gZS5nLiBhIDxjb2RlPi5qYXI8L2NvZGU+LCBhIDxjb2RlPi56aXA8L2NvZGU+IGZpbGUsIGV0Yy4gLQorCSAqIG9yIC0gc2luY2UgMy40IC0gYSBjbGFzcyBmb2xkZXIpIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gcGF0aC4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIHVuZGVybHlpbmcgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPgotCSAqIG1heSBvciBtYXkgbm90IGV4aXN0LiBObyByZXNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2NhbCBKQVIKKwkgKiBtYXkgb3IgbWF5IG5vdCBleGlzdC4gTm8gcmVzb3VyY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jYWwgbGlicmFyeQogCSAqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLQkgKiAKLQkgKiBAcGFyYW0gamFyUGF0aCB0aGUgamFycydzIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIGEgcGFja2FnZSBmcmFnbWVudCByb290IGZvciB0aGUgSkFSIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gcGF0aAorCSAqCisJICogQHBhcmFtIGV4dGVybmFsTGlicmFyeVBhdGggdGhlIGxpYnJhcnkncyBmaWxlIHN5c3RlbSBwYXRoCisJICogQHJldHVybiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIGV4dGVybmFsIGxpYnJhcnkgYXQgdGhlIHNwZWNpZmllZCBmaWxlIHN5c3RlbSBwYXRoCiAJICovCi0JSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgamFyUGF0aCk7CisJSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgZXh0ZXJuYWxMaWJyYXJ5UGF0aCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIGEgcGFja2FnZSBmcmFnbWVudCByb290IGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UsIHdoaWNoCiAJICogbXVzdCBlaXRoZXIgYmUgYSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSB0b3Agb2YgYSBwYWNrYWdlIGhpZXJhcmNoeSwKLQkgKiBvciBhIDxjb2RlPi5qYXI8L2NvZGU+IG9yIDxjb2RlPi56aXA8L2NvZGU+IGZpbGUuCi0JICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG1heSBvciBtYXkgbm90IGV4aXN0LiAKLQkgKiAKKwkgKiBvciBhIFpJUCBhcmNoaXZlIChlLmcuIGEgPGNvZGU+LmphcjwvY29kZT4sIGEgPGNvZGU+LnppcDwvY29kZT4gZmlsZSwgZXRjLikKKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgbWF5IG9yIG1heSBub3QgZXhpc3QuCisJICoKIAkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIGdpdmVuIHJlc291cmNlCiAJICogQHJldHVybiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLCB3aGljaAogCSAqIG11c3QgZWl0aGVyIGJlIGEgZm9sZGVyIHJlcHJlc2VudGluZyB0aGUgdG9wIG9mIGEgcGFja2FnZSBoaWVyYXJjaHksCi0JICogb3IgYSA8Y29kZT4uamFyPC9jb2RlPiBvciA8Y29kZT4uemlwPC9jb2RlPiBmaWxlCisJICogb3IgYSBaSVAgYXJjaGl2ZSAoZS5nLiBhIDxjb2RlPi5qYXI8L2NvZGU+LCBhIDxjb2RlPi56aXA8L2NvZGU+IGZpbGUsIGV0Yy4pCiAJICovCiAJSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UpOwogCkBAIC00NTcsNyArNTIwLDggQEAKIAkgKiBSZXR1cm5zIGFsbCBvZiB0aGUgIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgY29udGFpbmVkIGluIHRoaXMKIAkgKiBwcm9qZWN0LCBpZGVudGlmaWVkIG9uIHRoaXMgcHJvamVjdCdzIHJlc29sdmVkIGNsYXNzcGF0aC4gVGhlIHJlc3VsdAogCSAqIGRvZXMgbm90IGluY2x1ZGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpbiBvdGhlciBwcm9qZWN0cyByZWZlcmVuY2VkCi0JICogb24gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoLgorCSAqIG9uIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aC4gVGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYXBwZWFyIGluIHRoZSAKKwkgKiBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGJ5IHRoZSBjbGFzc3BhdGguCiAJICoKIAkgKiA8cD5OT1RFOiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+Z2V0Q2hpbGRyZW4oKTwvY29kZT4uCiAJICoKQEAgLTQ3MCwxNiArNTM0LDE2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5LgotCSAqIE5vdGUgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSB0aGF0IHJlZmVycyB0byBhbm90aGVyIHByb2plY3QgbWF5Ci0JICogaGF2ZSBtb3JlIHRoYW4gb25lIHJvb3QgKGlmIHRoYXQgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uIHJvb3QKLQkgKiBjb250YWluaW5nIHNvdXJjZSksIGFuZCBjbGFzc3BhdGggZW50cmllcyB3aXRoaW4gdGhlIGN1cnJlbnQKLQkgKiBwcm9qZWN0IGlkZW50aWZ5IGEgc2luZ2xlIHJvb3QuCisJICogQSBjbGFzc3BhdGggZW50cnkgd2l0aGluIHRoZSBjdXJyZW50IHByb2plY3QgaWRlbnRpZmllcyBhIHNpbmdsZSByb290LgogCSAqIDxwPgogCSAqIElmIHRoZSBjbGFzc3BhdGggZW50cnkgZGVub3RlcyBhIHZhcmlhYmxlLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFuZCByZXR1cm4KIAkgKiB0aGUgcm9vdHMgb2YgdGhlIHRhcmdldCBlbnRyeSAoZW1wdHkgaWYgbm90IHJlc29sdmFibGUpLgogCSAqIDxwPgogCSAqIElmIHRoZSBjbGFzc3BhdGggZW50cnkgZGVub3RlcyBhIGNvbnRhaW5lciwgaXQgd2lsbCBiZSByZXNvbHZlZCBhbmQgcmV0dXJuCiAJICogdGhlIHJvb3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNldCBvZiBjb250YWluZXIgZW50cmllcyAoZW1wdHkgaWYgbm90IHJlc29sdmFibGUpLgorCSAqIDxwPgorCSAqIFRoZSByZXN1bHQgZG9lcyBub3QgaW5jbHVkZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGluIG90aGVyIHByb2plY3RzCisJICogcmVmZXJlbmNlZCBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGguCiAJICogCiAJICogQHBhcmFtIGVudHJ5IHRoZSBnaXZlbiBlbnRyeQogCSAqIEByZXR1cm4gdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gZW50cnkKQEAgLTUwNSw3ICs1NjksNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBvbiB3aGljaCB0aGlzIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KIAkgKiB3YXMgY3JlYXRlZC4gVGhpcyBpcyBoYW5kbGUtb25seSBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JUHJvamVjdDwvY29kZT4gb24gd2hpY2ggdGhpcyA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+CiAJICogd2FzIGNyZWF0ZWQKIAkgKi8KQEAgLTUxOCw4ICs1ODIsOCBAQAogCSAqIGNvbnRhaW4gY2xhc3NwYXRoIHZhcmlhYmxlIGFuZCBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMuIENsYXNzcGF0aAogCSAqIHZhcmlhYmxlIGFuZCBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMgY2FuIGJlIHJlc29sdmVkIHVzaW5nIHRoZQogCSAqIGhlbHBlciBtZXRob2QgPGNvZGU+Z2V0UmVzb2x2ZWRDbGFzc3BhdGg8L2NvZGU+OyBjbGFzc3BhdGggdmFyaWFibGUKLQkgKiBlbnRyaWVzIGFsc28gY2FuIGJlIHJlc29sdmVkIGluZGl2aWR1YWxseSB1c2luZyAKLQkgKiA8Y29kZT5KYXZhQ29yZSNnZXRDbGFzc3BhdGhWYXJpYWJsZTwvY29kZT4pLiAKKwkgKiBlbnRyaWVzIGFsc28gY2FuIGJlIHJlc29sdmVkIGluZGl2aWR1YWxseSB1c2luZworCSAqIDxjb2RlPkphdmFDb3JlI2dldENsYXNzcGF0aFZhcmlhYmxlPC9jb2RlPikuCiAJICogPHA+CiAJICogQm90aCBjbGFzc3BhdGggY29udGFpbmVycyBhbmQgY2xhc3NwYXRoIHZhcmlhYmxlcyBwcm92aWRlcyBhIGxldmVsIG9mCiAJICogaW5kaXJlY3Rpb24gdGhhdCBjYW4gbWFrZSB0aGUgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZSBzdGFibGUgYWNyb3NzCkBAIC01MzUsNyArNTk5LDcgQEAKIAkgKiBOb3RlIHRoYXQgaW4gY2FzZSB0aGUgcHJvamVjdCBpc24ndCB5ZXQgb3BlbmVkLCB0aGUgY2xhc3NwYXRoIHdpbGwKIAkgKiBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGFzc29jaWF0ZWQgPHR0Pi5jbGFzc3BhdGg8L3R0PiBmaWxlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJhdyBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKQEAgLTU2OCw3ICs2MzIsMTIgQEAKIAkgKiB2YXJpYWJsZXMgYXJlIGNoYW5nZWQsIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggY2FuIGJlY29tZSBvdXQgb2YgZGF0ZS4KIAkgKiBCZWNhdXNlIG9mIHRoaXMsIGhhbmdpbmcgb24gcmVzb2x2ZWQgY2xhc3NwYXRoIGlzIG5vdCByZWNvbW1lbmRlZC4KIAkgKiA8L3A+Ci0JICogCisJICogPHA+CisJICogTm90ZSB0aGF0IGlmIHRoZSByZXNvbHV0aW9uIGNyZWF0ZXMgZHVwbGljYXRlIGVudHJpZXMgCisJICogKGkuZS4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeSBlbnRyaWVzfSB3aGljaCBhcmUge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0pLCAKKwkgKiBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgYWRkZWQgdG8gdGhlIHJlc29sdmVkIGNsYXNzcGF0aC4KKwkgKiA8L3A+CisJICoKIAkgKiBAcGFyYW0gaWdub3JlVW5yZXNvbHZlZEVudHJ5IGluZGljYXRlcyBob3cgdG8gaGFuZGxlIHVucmVzb2x2YWJsZQogCSAqIHZhcmlhYmxlcyBhbmQgY29udGFpbmVyczsgPGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGVzIHRoYXQgbWlzc2luZwogCSAqIHZhcmlhYmxlcyBhbmQgdW5yZXNvbHZhYmxlIGNsYXNzcGF0aCBjb250YWluZXJzIHNob3VsZCBiZSBzaWxlbnRseQpAQCAtNTc2LDcgKzY0NSw3IEBACiAJICogZW50cmllcyB0aGF0IGNvdWxkIGJlIHN1Y2Nlc3NmdWxseSByZXNvbHZlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcwogCSAqIHRoYXQgYSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IHNob3VsZCBiZSB0aHJvd24gZm9yIHRoZSBmaXJzdAogCSAqIHVucmVzb2x2ZWQgdmFyaWFibGUgb3IgY29udGFpbmVyCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdCBhcyBhIGxpc3Qgb2Ygc2ltcGxlIAorCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QgYXMgYSBsaXN0IG9mIHNpbXBsZQogCSAqIGNsYXNzcGF0aCBlbnRyaWVzLCB3aGVyZSBhbGwgY2xhc3NwYXRoIHZhcmlhYmxlIGFuZCBjb250YWluZXIgZW50cmllcwogCSAqIGhhdmUgYmVlbiByZXNvbHZlZCBhbmQgc3Vic3RpdHV0ZWQgd2l0aCB0aGVpciBmaW5hbCB0YXJnZXQgZW50cmllcwogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGluIG9uZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzaXR1YXRpb246CkBAIC02MDMsMTYgKzY3MiwxNiBAQAogCSAqCiAJICogSWYgdGhlIHNldCBvZiBlbnRyaWVzIGNvbnRhaW5zIHNvbWUgdmFyaWFibGVzLCB0aG9zZSBhcmUgcmVzb2x2ZWQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCiAJICogY3ljbGVzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVudHJpZXMgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyaWVzCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzc3BhdGggZW50cmllcyB3b3VsZCByZXN1bHQgaW4gYSBjeWNsZSwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBoYXNDbGFzc3BhdGhDeWNsZShJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKTsKIAkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsIAorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdCwKIAkgKiB0aGF0IGlzLCByZWZlcmVuY2VkIGZyb20gYSBjbGFzc3BhdGggZW50cnkgYW5kIG5vdCBleHBsaWNpdGx5IGV4Y2x1ZGVkCi0JICogdXNpbmcgYW4gZXhjbHVzaW9uIHBhdHRlcm4uIAotCSAqIAorCSAqIHVzaW5nIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuLgorCSAqCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIG9uIHRoZSBjbGFzc3BhdGggb2YKIAkgKiB0aGlzIHByb2plY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTYyNSw3ICs2OTQsNyBAQAogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsCiAJICogdGhhdCBpcywgcmVmZXJlbmNlZCBmcm9tIGEgY2xhc3NwYXRoIGVudHJ5IGFuZCBub3QgZXhwbGljaXRseSBleGNsdWRlZAogCSAqIHVzaW5nIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHJlc291cmNlIHRoZSBnaXZlbiByZXNvdXJjZQogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIG9uIHRoZSBjbGFzc3BhdGggb2YKIAkgKiB0aGlzIHByb2plY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTY1OCw5ICs3MjcsOSBAQAogCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHR5cGUgaGllcmFyY2h5IGZvciBhbGwgdHlwZXMgaW4gdGhlIGdpdmVuCi0JICogcmVnaW9uLCBjb25zaWRlcmluZyBzdWJ0eXBlcyB3aXRoaW4gdGhhdCByZWdpb24gYW5kIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSAKLQkgKiB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lci4gCi0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSAKKwkgKiByZWdpb24sIGNvbnNpZGVyaW5nIHN1YnR5cGVzIHdpdGhpbiB0aGF0IHJlZ2lvbiBhbmQgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlCisJICogd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIuCisJICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZQogCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KQEAgLTY4MywxMSArNzUyLDExIEBACiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHR5cGUgaGllcmFyY2h5IGZvciB0aGUgZ2l2ZW4gdHlwZSBjb25zaWRlcmluZwogCSAqIHN1YnR5cGVzIGluIHRoZSBzcGVjaWZpZWQgcmVnaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKIAkgKiBAcGFyYW0gcmVnaW9uIHRoZSBnaXZlbiByZWdpb24KIAkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gbW9uaXRvcgotCSAqIAorCSAqCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCiAJICoKQEAgLTcwMywyMCArNzcyLDIwIEBACiAKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSBnaXZlbiB0eXBlIGNvbnNpZGVyaW5nCi0JICogc3VidHlwZXMgaW4gdGhlIHNwZWNpZmllZCByZWdpb24gYW5kIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSAKLQkgKiB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lci4gCi0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSAKKwkgKiBzdWJ0eXBlcyBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBhbmQgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlCisJICogd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIuCisJICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZQogCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KIAkgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuCiAJICogPHA+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQogCSAqIEBwYXJhbSByZWdpb24gdGhlIGdpdmVuIHJlZ2lvbgogCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBtb25pdG9yCiAJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCi0JICogCisJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKIAkgKgpAQCAtNzM0LDEzICs4MDMsMTMgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIGZvciB0aGUgcHJvamVjdCBhcyBkZWZpbmVkIGJ5IGl0cyA8Y29kZT4uY2xhc3NwYXRoPC9jb2RlPiBmaWxlIGZyb20gZGlzaywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB1bmFibGUgdG8gcmVhZCB0aGUgZmlsZS4gCisJICogaWYgdW5hYmxlIHRvIHJlYWQgdGhlIGZpbGUuCiAJICogPHA+Ci0JICogVGhpcyBvdXRwdXQgbG9jYXRpb24gbWF5IGRpZmZlciBmcm9tIHRoZSBpbi1tZW1vcnkgb25lIHJldHVybmVkIGJ5IDxjb2RlPmdldE91dHB1dExvY2F0aW9uPC9jb2RlPiwgaW4gY2FzZSB0aGUgCi0JICogYXV0b21hdGljIHJlY29uY2lsaWF0aW9uIG1lY2hhbmlzbSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkIHlldC4gVXN1YWxseSwgYW55IGNoYW5nZSB0byB0aGUgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZSAKLQkgKiBpcyBhdXRvbWF0aWNhbGx5IG5vdGljZWQgYW5kIHJlY29uY2lsZWQgYXQgdGhlIG5leHQgcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudC4gCi0JICogSG93ZXZlciwgaWYgdGhlIGZpbGUgaXMgbW9kaWZpZWQgd2l0aGluIGFuIG9wZXJhdGlvbiwgd2hlcmUgdGhpcyBjaGFuZ2UgbmVlZHMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGJlZm9yZSB0aGUgCi0JICogb3BlcmF0aW9uIGVuZHMsIHRoZW4gdGhlIG91dHB1dCBsb2NhdGlvbiBmcm9tIGRpc2sgY2FuIGJlIHJlYWQgdXNpbmcgdGhpcyBtZXRob2QsIGFuZCBmdXJ0aGVyIGFzc2lnbmVkIHRvIHRoZSBwcm9qZWN0IAorCSAqIFRoaXMgb3V0cHV0IGxvY2F0aW9uIG1heSBkaWZmZXIgZnJvbSB0aGUgaW4tbWVtb3J5IG9uZSByZXR1cm5lZCBieSA8Y29kZT5nZXRPdXRwdXRMb2NhdGlvbjwvY29kZT4sIGluIGNhc2UgdGhlCisJICogYXV0b21hdGljIHJlY29uY2lsaWF0aW9uIG1lY2hhbmlzbSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkIHlldC4gVXN1YWxseSwgYW55IGNoYW5nZSB0byB0aGUgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZQorCSAqIGlzIGF1dG9tYXRpY2FsbHkgbm90aWNlZCBhbmQgcmVjb25jaWxlZCBhdCB0aGUgbmV4dCByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV2ZW50LgorCSAqIEhvd2V2ZXIsIGlmIHRoZSBmaWxlIGlzIG1vZGlmaWVkIHdpdGhpbiBhbiBvcGVyYXRpb24sIHdoZXJlIHRoaXMgY2hhbmdlIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBiZWZvcmUgdGhlCisJICogb3BlcmF0aW9uIGVuZHMsIHRoZW4gdGhlIG91dHB1dCBsb2NhdGlvbiBmcm9tIGRpc2sgY2FuIGJlIHJlYWQgdXNpbmcgdGhpcyBtZXRob2QsIGFuZCBmdXJ0aGVyIGFzc2lnbmVkIHRvIHRoZSBwcm9qZWN0CiAJICogdXNpbmcgPGNvZGU+c2V0UmF3Q2xhc3NwYXRoKC4uLik8L2NvZGU+LgogCSAqIDxwPgogCSAqIFRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBpcyB3aGVyZSBjbGFzcyBmaWxlcyBhcmUgb3JkaW5hcmlseSBnZW5lcmF0ZWQKQEAgLTc1Myw3ICs4MjIsNyBAQAogCSAqIGNsYXNzIGZpbGVzIGZvciB0aGUgcHJvamVjdCBtYXkgZW5kIHVwIHNjYXR0ZXJlZCBhY3Jvc3Mgc2V2ZXJhbCBmb2xkZXJzLAogCSAqIHJhdGhlciB0aGFuIGFsbCBpbiB0aGUgZGVmYXVsdCBvdXRwdXQgZm9sZGVyICh3aGljaCBpcyBtb3JlIHN0YW5kYXJkKS4KIAkgKiA8cD4KLQkgKiBJbiBvcmRlciB0byBtYW51YWxseSBmb3JjZSBhIHByb2plY3QgY2xhc3NwYXRoIHJlZnJlc2gsIG9uZSBjYW4gc2ltcGx5IGFzc2lnbiB0aGUgcHJvamVjdCBjbGFzc3BhdGggdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGlzIAorCSAqIEluIG9yZGVyIHRvIG1hbnVhbGx5IGZvcmNlIGEgcHJvamVjdCBjbGFzc3BhdGggcmVmcmVzaCwgb25lIGNhbiBzaW1wbHkgYXNzaWduIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMKIAkgKiBtZXRob2QsIGFzIGZvbGxvd3M6CiAJICogPGNvZGU+cHJvai5zZXRSYXdDbGFzc3BhdGgocHJvai5yZWFkUmF3Q2xhc3NwYXRoKCksIHByb2oucmVhZE91dHB1dExvY2F0aW9uKCksIG1vbml0b3IpPC9jb2RlPgogCSAqIChub3RlIHRoYXQgdGhlIDxjb2RlPnJlYWRSYXdDbGFzc3BhdGgvcmVhZE91dHB1dExvY2F0aW9uPC9jb2RlPiBtZXRob2RzIGNvdWxkIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPikuCkBAIC03NjcsNyArODM2LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSByYXcgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdCBhcyBkZWZpbmVkIGJ5IGl0cwogCSAqIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgZnJvbSBkaXNrLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHVuYWJsZSB0byByZWFkIHRoZSBmaWxlLiAKKwkgKiBpZiB1bmFibGUgdG8gcmVhZCB0aGUgZmlsZS4KIAkgKiA8cD4KIAkgKiBUaGlzIGNsYXNzcGF0aCBtYXkgZGlmZmVyIGZyb20gdGhlIGluLW1lbW9yeSBjbGFzc3BhdGggcmV0dXJuZWQgYnkKIAkgKiA8Y29kZT5nZXRSYXdDbGFzc3BhdGg8L2NvZGU+LCBpbiBjYXNlIHRoZSBhdXRvbWF0aWMgcmVjb25jaWxpYXRpb24KQEAgLTc3NywxOSArODQ2LDE5IEBACiAJICogbW9kaWZpZWQgd2l0aGluIGFuIG9wZXJhdGlvbiwgd2hlcmUgdGhpcyBjaGFuZ2UgbmVlZHMgdG8gYmUgdGFrZW4gaW50bwogCSAqIGFjY291bnQgYmVmb3JlIHRoZSBvcGVyYXRpb24gZW5kcywgdGhlbiB0aGUgY2xhc3NwYXRoIGZyb20gZGlzayBjYW4gYmUKIAkgKiByZWFkIHVzaW5nIHRoaXMgbWV0aG9kLCBhbmQgZnVydGhlciBhc3NpZ25lZCB0byB0aGUgcHJvamVjdCB1c2luZwotCSAqIDxjb2RlPnNldFJhd0NsYXNzcGF0aCguLi4pPC9jb2RlPi4gCisJICogPGNvZGU+c2V0UmF3Q2xhc3NwYXRoKC4uLik8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBDbGFzc3BhdGggdmFyaWFibGUgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcyBjYW4gYmUgcmVzb2x2ZWQgdXNpbmcKIAkgKiB0aGUgaGVscGVyIG1ldGhvZCA8Y29kZT5nZXRSZXNvbHZlZENsYXNzcGF0aDwvY29kZT47IGNsYXNzcGF0aCB2YXJpYWJsZQotCSAqIGVudHJpZXMgYWxzbyBjYW4gYmUgcmVzb2x2ZWQgaW5kaXZpZHVhbGx5IHVzaW5nIAorCSAqIGVudHJpZXMgYWxzbyBjYW4gYmUgcmVzb2x2ZWQgaW5kaXZpZHVhbGx5IHVzaW5nCiAJICogPGNvZGU+SmF2YUNvcmUjZ2V0Q2xhc3NwYXRoVmFyaWFibGU8L2NvZGU+KS4KIAkgKiA8L3A+CiAJICogPHA+CiAJICogTm90ZSB0aGF0IG5vIGNoZWNrIGlzIHBlcmZvcm1lZCB3aGV0aGVyIHRoZSBwcm9qZWN0IGhhcyB0aGUgSmF2YSBuYXR1cmUKIAkgKiBzZXQsIGFsbG93aW5nIGFuIGV4aXN0aW5nIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgdG8gYmUgY29uc2lkZXJlZAogCSAqIGluZGVwZW5kYW50bHkgKHVubGlrZSA8Y29kZT5nZXRSYXdDbGFzc3BhdGg8L2NvZGU+IHdoaWNoIHJlcXVpcmVzIHRoZQotCSAqIEphdmEgbmF0dXJlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdCkuIAorCSAqIEphdmEgbmF0dXJlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdCkuCiAJICogPC9wPgogCSAqIDxwPgogCSAqIEluIG9yZGVyIHRvIG1hbnVhbGx5IGZvcmNlIGEgcHJvamVjdCBjbGFzc3BhdGggcmVmcmVzaCwgb25lIGNhbiBzaW1wbHkKQEAgLTc5OCw3ICs4NjcsNyBAQAogCSAqIChub3RlIHRoYXQgdGhlIDxjb2RlPnJlYWRSYXdDbGFzc3BhdGgvcmVhZE91dHB1dExvY2F0aW9uPC9jb2RlPiBtZXRob2RzCiAJICogY291bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+KS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSByYXcgY2xhc3NwYXRoIGZyb20gZGlzayBmb3IgdGhlIHByb2plY3QsIGFzIGEgbGlzdCBvZgogCSAqIGNsYXNzcGF0aCBlbnRyaWVzCiAJICogQHNlZSAjZ2V0UmF3Q2xhc3NwYXRoKCkKQEAgLTgwOCwyNiArODc3LDM2IEBACiAJSUNsYXNzcGF0aEVudHJ5W10gcmVhZFJhd0NsYXNzcGF0aCgpOwogCiAJLyoqCi0JICogSGVscGVyIG1ldGhvZCBmb3Igc2V0dGluZyBvbmUgb3B0aW9uIHZhbHVlIG9ubHkuIEVxdWl2YWxlbnQgdG8gPGNvZGU+TWFwIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoZmFsc2UpOyBtYXAucHV0KG9wdGlvbk5hbWUsIG9wdGlvblZhbHVlKTsgdGhpcy5zZXRPcHRpb25zKG1hcCk8L2NvZGU+CisJICogSGVscGVyIG1ldGhvZCBmb3Igc2V0dGluZyBvbmUgb3B0aW9uIHZhbHVlIG9ubHkuCisJICo8cD4KKwkgKiBFcXVpdmFsZW50IHRvOgorCSAqIDxwcmU+CisJICogCU1hcCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKGZhbHNlKTsKKwkgKiAJbWFwLnB1dChvcHRpb25OYW1lLCBvcHRpb25WYWx1ZSk7CisJICogCXRoaXMuc2V0T3B0aW9ucyhtYXApCisJICogIDwvcHJlPgogCSAqIDxwPgogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gb3B0aW9uTmFtZSB0aGUgbmFtZSBvZiBhbiBvcHRpb24KLQkgKiBAcGFyYW0gb3B0aW9uVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gdG8gc2V0CisJICogQHBhcmFtIG9wdGlvblZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIHRvIHNldC4gSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIG9wdGlvbgorCSAqIAlpcyByZW1vdmVkIGZyb20gcHJvamVjdCBwcmVmZXJlbmNlcy4KKwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPm9wdGlvbk5hbWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogCShzZWUge0BsaW5rIG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXMjcHV0KFN0cmluZywgU3RyaW5nKX0pLgogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAl2b2lkIHNldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgU3RyaW5nIG9wdGlvblZhbHVlKTsKIAogCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QgY3VzdG9tIG9wdGlvbnMuIEFsbCBhbmQgb25seSB0aGUgb3B0aW9ucyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBnaXZlbiB0YWJsZSAKKwkgKiBTZXRzIHRoZSBwcm9qZWN0IGN1c3RvbSBvcHRpb25zLiBBbGwgYW5kIG9ubHkgdGhlIG9wdGlvbnMgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gdGFibGUKIAkgKiBhcmUgcmVtZW1iZXJlZDsgYWxsIHByZXZpb3VzIG9wdGlvbiBzZXR0aW5ncyBhcmUgZm9yZ290dGVuLCBpbmNsdWRpbmcgb25lcyBub3QgZXhwbGljaXRseQogCSAqIG1lbnRpb25lZC4KIAkgKiA8cD4KIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5ld09wdGlvbnMgdGhlIG5ldyBvcHRpb25zIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPiksCiAJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBmbHVzaCBhbGwgY3VzdG9tIG9wdGlvbnMgKGNsaWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZ2xvYmFsIEphdmFDb3JlIG9wdGlvbnMpLgogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQpAQCAtODQ5LDE4ICs5MjgsMTggQEAKIAkgKiBjbGFzcyBmaWxlcyBmb3IgdGhlIHByb2plY3QgbWF5IGVuZCB1cCBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZm9sZGVycywKIAkgKiByYXRoZXIgdGhhbiBhbGwgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciAod2hpY2ggaXMgbW9yZSBzdGFuZGFyZCkuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhdGggdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZWZhdWx0IG91dHB1dAogCSAqIGZvbGRlcgogCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogCisJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuIFJlYXNvbnMgaW5jbHVkZToKIAkgKiA8dWw+CiAJICogIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KIAkgKiAgPGxpPiBUaGUgcGF0aCByZWZlcnMgdG8gYSBsb2NhdGlvbiBub3QgY29udGFpbmVkIGluIHRoaXMgcHJvamVjdCAoPGNvZGU+UEFUSF9PVVRTSURFX1BST0pFQ1Q8L2NvZGU+KQogCSAqICA8bGk+IFRoZSBwYXRoIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoICg8Y29kZT5SRUxBVElWRV9QQVRIPC9jb2RlPikKIAkgKiAgPGxpPiBUaGUgcGF0aCBpcyBuZXN0ZWQgaW5zaWRlIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoaXMgcHJvamVjdCAoPGNvZGU+SU5WQUxJRF9QQVRIPC9jb2RlPikKLQkgKiAgPGxpPiBUaGUgb3V0cHV0IGxvY2F0aW9uIGlzIGJlaW5nIG1vZGlmaWVkIGR1cmluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uIChDT1JFX0VYQ0VQVElPTikJIAorCSAqICA8bGk+IFRoZSBvdXRwdXQgbG9jYXRpb24gaXMgYmVpbmcgbW9kaWZpZWQgZHVyaW5nIHJlc291cmNlIGNoYW5nZSBldmVudCBub3RpZmljYXRpb24gKENPUkVfRVhDRVBUSU9OKQogCSAqIDwvdWw+CiAJICogQHNlZSAjZ2V0T3V0cHV0TG9jYXRpb24oKQogICAgICAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldE91dHB1dExvY2F0aW9uKCkKQEAgLTg3MSw3ICs5NTAsNyBAQAogCS8qKgogCSAqIFNldHMgYm90aCB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdCBhbmQgaXRzIGRlZmF1bHQgb3V0cHV0CiAJICogbG9jYXRpb24gYXQgb25jZS4gVGhlIGNsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIGEgbGlzdCBvZiBjbGFzc3BhdGgKLQkgKiBlbnRyaWVzLiBJbiBwYXJ0aWN1bGFyIHN1Y2ggYSBjbGFzc3BhdGggbWF5IGNvbnRhaW4gY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMuIAorCSAqIGVudHJpZXMuIEluIHBhcnRpY3VsYXIgc3VjaCBhIGNsYXNzcGF0aCBtYXkgY29udGFpbiBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcy4KIAkgKiBDbGFzc3BhdGggdmFyaWFibGUgZW50cmllcyBjYW4gYmUgcmVzb2x2ZWQgaW5kaXZpZHVhbGx5ICh7QGxpbmsgSmF2YUNvcmUjZ2V0Q2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nKX0pLAogCSAqIG9yIHRoZSBmdWxsIGNsYXNzcGF0aCBjYW4gYmUgcmVzb2x2ZWQgYXQgb25jZSB1c2luZyB0aGUgaGVscGVyIG1ldGhvZCB7QGxpbmsgI2dldFJlc29sdmVkQ2xhc3NwYXRoKGJvb2xlYW4pfS4KIAkgKiA8cD4KQEAgLTkwOCw3ICs5ODcsNyBAQAogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAl2b2lkIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJUGF0aCBvdXRwdXRMb2NhdGlvbiwgYm9vbGVhbiBjYW5Nb2RpZnlSZXNvdXJjZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QgdXNpbmcgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzLiBJbiBwYXJ0aWN1bGFyIHN1Y2ggYSBjbGFzc3BhdGggbWF5IGNvbnRhaW4KIAkgKiBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcy4gQ2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgY2FuIGJlIHJlc29sdmVkIGluZGl2aWR1YWxseSAoe0BsaW5rIEphdmFDb3JlI2dldENsYXNzcGF0aFZhcmlhYmxlKFN0cmluZyl9KSwKQEAgLTk0Niw2ICsxMDI1LDU2IEBACiAJICogQHNpbmNlIDMuMgogCSAqLwogCXZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIGJvb2xlYW4gY2FuTW9kaWZ5UmVzb3VyY2VzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBXb3JrcyBzaW1pbGFyIHRvIHtAbGluayAjc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdLCBJUGF0aCwgSVByb2dyZXNzTW9uaXRvcil9IGFuZCAKKwkgKiBhZGRpdGlvbmFsbHkgYWxsb3dzIHBlcnNpc3RpbmcgdGhlIGdpdmVuIGFycmF5IG9mIHJlZmVyZW5jZWQgZW50cmllcyBmb3IgdGhpcyBwcm9qZWN0LgorCSAqIFRoZSByZWZlcmVuY2VkIGVudHJpZXMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiB0aGUgLmNsYXNzcGF0aCBmaWxlIG9mIHRoaXMgCisJICogcHJvamVjdC4gRm9yIGRldGFpbHMgb24gcmVmZXJlbmNlZCBlbnRyaWVzLCBzZWUgCisJICoge0BsaW5rIEphdmFDb3JlI2dldFJlZmVyZW5jZWRDbGFzc3BhdGhFbnRyaWVzKElDbGFzc3BhdGhFbnRyeSwgSUphdmFQcm9qZWN0KX0KKwkgKiBhbmQge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNnZXRSZWZlcmVuY2luZ0VudHJ5KCl9LgorCSAqIDxwPgorCSAqIFNpbmNlIHRoZSByZWZlcmVuY2VkIGVudHJpZXMgYXJlIHN0b3JlZCBpbiB0aGUgLmNsYXNzcGF0aCBmaWxlLCBjbGllbnRzIGNhbiBzdG9yZSBhZGRpdGlvbmFsIAorCSAqIGluZm9ybWF0aW9uIHRoYXQgYmVsb25nIHRvIHRoZXNlIGVudHJpZXMgYW5kIHJldHJpZXZlIHRoZW0gYWNyb3NzIHNlc3Npb25zLCB0aG91Z2ggdGhlIHJlZmVyZW5jZWQKKwkgKiBlbnRyaWVzIHRoZW1zZWx2ZXMgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSByYXcgY2xhc3NwYXRoLiBCeSBwYXNzaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiByZWZlcmVuY2VkRW50cmllcywgY2xpZW50cyBjYW4gY2hvb3NlIG5vdCB0byBtb2RpZnkgdGhlIGFscmVhZHkgcGVyc2lzdGVkIHJlZmVyZW5jZWQgZW50cmllcywKKwkgKiB3aGljaCBpcyBmdWxseSBlcXVpdmFsZW50IHRvIHtAbGluayAjc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdLCBJUGF0aCwgSVByb2dyZXNzTW9uaXRvcil9LgorCSAqIElmIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCBhcyByZWZlcmVuY2VkRW50cmllcywgdGhlIGFscmVhZHkgcGVyc2lzdGVkIHJlZmVyZW5jZWQgZW50cmllcywgCisJICogaWYgYW55LCB3aWxsIGJlIGNsZWFyZWQuIAorCSAqIDwvcD4gPHA+CisJICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgb2YgYSByZWZlcmVuY2VkIGVudHJ5IG9yIGlmIGFueSBvZiB0aGUgPGNvZGU+cmVmZXJlbmNlZEVudHJpZXM8L2NvZGU+IAorCSAqIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcmF3IGNsYXNzcGF0aCg8Y29kZT5lbnRyaWVzPC9jb2RlPikgdGhvc2UgcmVmZXJlbmNlZCBlbnRyaWVzIHdpbGwgCisJICogYmUgZXhjbHVkZWQgYW5kIG5vdCBiZSBwZXJzaXN0ZWQuCisJICo8L3A+CisJICogQHBhcmFtIGVudHJpZXMgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzCisJICogQHBhcmFtIHJlZmVyZW5jZWRFbnRyaWVzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgY2xhc3NwYXRoIGVudHJpZXMgdG8gYmUgcGVyc2lzdGVkCisJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbgorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNsYXNzcGF0aCBjb3VsZCBub3QgYmUgc2V0LiBSZWFzb25zIGluY2x1ZGU6CisJICogPHVsPgorCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8bGk+IFRoZSBjbGFzc3BhdGggaXMgYmVpbmcgbW9kaWZpZWQgZHVyaW5nIHJlc291cmNlIGNoYW5nZSBldmVudCBub3RpZmljYXRpb24gKENPUkVfRVhDRVBUSU9OKQorCSAqIDxsaT4gVGhlIGNsYXNzcGF0aCBmYWlsZWQgdGhlIHZhbGlkYXRpb24gY2hlY2sgYXMgZGVmaW5lZCBieSB7QGxpbmsgSmF2YUNvbnZlbnRpb25zI3ZhbGlkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoKX0KKwkgKiA8L3VsPgorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CisJICogQHNlZSAjZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoKQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwl2b2lkIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcywgSVBhdGggb3V0cHV0TG9jYXRpb24sCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgY2xhc3NwYXRoIGVudHJpZXMgc3RvcmVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUgb2YgPGNvZGU+dGhpczwvY29kZT4gCisJICogamF2YSBwcm9qZWN0LiBDbGllbnRzIGNhbiBzdG9yZSB0aGUgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcyB1c2luZyAKKwkgKiB7QGxpbmsgI3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSwgSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKX0KKwkgKiBJZiB0aGUgY2xpZW50IGhhcyBub3Qgc3RvcmVkIGFueSByZWZlcmVuY2VkIGVudHJpZXMgZm9yIHRoaXMgcHJvamVjdCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCisJICoKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcyBzdG9yZWQgZm9yIHRoaXMgamF2YSBwcm9qZWN0IG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKwkgKiAJCQlzdG9yZWQgZWFybGllci4KKwkgKiBAc2luY2UgMy42CisJICovCisJSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCQogCS8qKgogCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QgdXNpbmcgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzLiBJbiBwYXJ0aWN1bGFyIHN1Y2ggYSBjbGFzc3BhdGggbWF5IGNvbnRhaW4KQEAgLTk3OSw3ICsxMTA4LDcgQEAKIAkgKi8KIAl2b2lkIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCQorCiAJLyoqCiAJICogU2V0cyB0aGUgYm90aCB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdCBhbmQgaXRzIGRlZmF1bHQgb3V0cHV0CiAJICogbG9jYXRpb24gYXQgb25jZS4gVGhlIGNsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIGEgbGlzdCBvZiBjbGFzc3BhdGgKQEAgLTEwMDksNyArMTEzOCw3IEBACiAJICogPHA+CiAJICogVGhpcyBvcGVyYXRpb24gYWNxdWlyZXMgYSBsb2NrIG9uIHRoZSB3b3Jrc3BhY2UncyByb290LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbnRyaWVzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcwogCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCiAJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUxvY2FsVmFyaWFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lMb2NhbFZhcmlhYmxlLmphdmEKaW5kZXggN2MwYjZlMS4uZWI0NzM1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUxvY2FsVmFyaWFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTG9jYWxWYXJpYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDMzICsxMywzMyBAQAogLyoqCiAgKiBSZXByZXNlbnRzIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyZWQgaW4gYSBtZXRob2Qgb3IgYW4gaW5pdGlhbGl6ZXIuCiAgKiA8Y29kZT5JTG9jYWxWYXJpYWJsZTwvY29kZT4gYXJlIHBzZXVkby1lbGVtZW50cyBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgYSA8Y29kZT5JQ29kZUFzc2lzdC5jb2RlU2VsZWN0KC4uLik8L2NvZGU+Ci0gKiBvcGVyYXRpb24uIFRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBKYXZhIG1vZGVsICg8Y29kZT5leGlzdHMoKTwvY29kZT4gcmV0dXJucyB3aGV0aGVyIHRoZSBwYXJlbnQgZXhpc3RzIHJhdGhlciB0aGFuIAotICogd2hldGhlciB0aGUgbG9jYWwgdmFyaWFibGUgZXhpc3RzIGluIHRoZSBwYXJlbnQpIGFuZCB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNoaWxkcmVuIG9mIGFuIDxjb2RlPklNZXRob2Q8L2NvZGU+IAorICogb3BlcmF0aW9uLiBUaGV5IGFyZSBub3QgcGFydCBvZiB0aGUgSmF2YSBtb2RlbCAoPGNvZGU+ZXhpc3RzKCk8L2NvZGU+IHJldHVybnMgd2hldGhlciB0aGUgcGFyZW50IGV4aXN0cyByYXRoZXIgdGhhbgorICogd2hldGhlciB0aGUgbG9jYWwgdmFyaWFibGUgZXhpc3RzIGluIHRoZSBwYXJlbnQpIGFuZCB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNoaWxkcmVuIG9mIGFuIDxjb2RlPklNZXRob2Q8L2NvZGU+CiAgKiBvciBhbiA8Y29kZT5JSW5pdGlhbGl6ZXI8L2NvZGU+LgogICogPHA+CiAgKiBJbiBwYXJ0aWN1bGFyIHN1Y2ggYSBwc2V1ZG8tZWxlbWVudCBzaG91bGQgbm90IGJlIHVzZWQgYXMgYSBoYW5kbGUuIEZvciBleGFtcGxlIGl0cyBuYW1lIHJhbmdlIHdvbid0IGJlIHVwZGF0ZWQKICAqIGlmIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBjaGFuZ2VzLgotICogPC9wPjxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKiA8L3A+CisgKgogICogQHNpbmNlIDMuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhbFZhcmlhYmxlIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJU291cmNlUmVmZXJlbmNlIHsKK3B1YmxpYyBpbnRlcmZhY2UgSUxvY2FsVmFyaWFibGUgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElTb3VyY2VSZWZlcmVuY2UsIElBbm5vdGF0YWJsZSB7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCiAJICovCiAJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBsb2NhbCB2YXJpYWJsZSdzIG5hbWUuCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBsb2NhbCB2YXJpYWJsZSdzIG5hbWUKIAkgKi8KIAlJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlLgogCSAqIDxwPgpAQCAtNTIsNCArNTIsNDYgQEAKIAkgKiBAc2VlIFNpZ25hdHVyZQogCSAqLwogCVN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCk7CisJCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGxvY2FsIHZhcmlhYmxlIGlzIGEgbWV0aG9kIHBhcmFtZXRlciwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbG9jYWwgdmFyaWFibGUgaXMgYSBtZXRob2QgcGFyYW1ldGVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHNpbmNlIDMuNworCSAqLworCWJvb2xlYW4gaXNQYXJhbWV0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIGxvY2FsIHZhcmlhYmxlLiBUaGUgZmxhZ3MgY2FuIGJlIGV4YW1pbmVkIHVzaW5nIGNsYXNzCisJICoge0BsaW5rIEZsYWdzfS4KKwkgKiAKKwkgKiA8cD5Ob3RlIHRoYXQgb25seSBmbGFncyBhcyBpbmRpY2F0ZWQgaW4gdGhlIHNvdXJjZSBhcmUgcmV0dXJuZWQuPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgbW9kaWZpZXIgZmxhZ3MgZm9yIHRoaXMgbG9jYWwgdmFyaWFibGUKKwkgKiBAc2VlIEZsYWdzCisJICogQHNpbmNlIDMuNworCSAqLworCWludCBnZXRGbGFncygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVjbGFyaW5nIG1lbWJlciBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgZGVjbGFyaW5nIG1lbWJlciBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlCisJICogQHNpbmNlIDMuNworCSAqLworCUlNZW1iZXIgZ2V0RGVjbGFyaW5nTWVtYmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgcm9vdCBpbiB3aGljaCB0aGlzIGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgSmF2YSB0eXBlIHJvb3QgaW4gd2hpY2ggdGhpcyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZAorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlJVHlwZVJvb3QgZ2V0VHlwZVJvb3QoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lNZW1iZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lNZW1iZXIuamF2YQppbmRleCA1OWNlYWQ0Li42OWM5NDNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDE4ICsxMiwyMCBAQAogCiAvKioKICAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IGNhbiBiZSBtZW1iZXJzIG9mIHR5cGVzLgotICogVGhpcyBzZXQgY29uc2lzdHMgb2YgPGNvZGU+SVR5cGU8L2NvZGU+LCA8Y29kZT5JTWV0aG9kPC9jb2RlPiwgCisgKiBUaGlzIHNldCBjb25zaXN0cyBvZiA8Y29kZT5JVHlwZTwvY29kZT4sIDxjb2RlPklNZXRob2Q8L2NvZGU+LAogICogPGNvZGU+SUZpZWxkPC9jb2RlPiwgYW5kIDxjb2RlPklJbml0aWFsaXplcjwvY29kZT4uCiAgKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogVGhlIGNoaWxkcmVuIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2Ugb3IgY2xhc3MgZmlsZS4KICAqIDwvcD4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU1lbWJlciBleHRlbmRzIElKYXZhRWxlbWVudCwgSVNvdXJjZVJlZmVyZW5jZSwgSVNvdXJjZU1hbmlwdWxhdGlvbiwgSVBhcmVudCB7CiAvKioKICAqIFJldHVybnMgdGhlIGNhdGVnb3JpZXMgZGVmaW5lZCBieSB0aGlzIG1lbWJlcidzIEphdmFkb2MuIEEgY2F0ZWdvcnkgaXMgdGhlIGlkZW50aWZpZXIKICAqIGZvbGxvd2luZyB0aGUgdGFnIDxjb2RlPkBjYXRlZ29yeTwvY29kZT4gaW4gdGhlIG1lbWJlcidzIEphdmFkb2MuCiAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIG5vIGNhdGVnb3J5IGlzIGRlZmluZWQgaW4gdGhpcyBtZW1iZXIncyBKYXZhZG9jLgotICogCisgKgogICogQHJldHVybiB0aGUgY2F0ZWdvcmllcyBkZWZpbmVkIGJ5IHRoaXMgbWVtYmVyJ3MgZG9jCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KICAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCkBAIC0zNCw3ICszNiw3IEBACiAgKiBSZXR1cm5zIHRoZSBjbGFzcyBmaWxlIGluIHdoaWNoIHRoaXMgbWVtYmVyIGlzIGRlY2xhcmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgogICogaWYgdGhpcyBtZW1iZXIgaXMgbm90IGRlY2xhcmVkIGluIGEgY2xhc3MgZmlsZSAoZm9yIGV4YW1wbGUsIGEgc291cmNlIHR5cGUpLgogICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIGNsYXNzIGZpbGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAgKiBpZiB0aGlzIG1lbWJlciBpcyBub3QgZGVjbGFyZWQgaW4gYSBjbGFzcyBmaWxlIChmb3IgZXhhbXBsZSwgYSBzb3VyY2UgdHlwZSkKICAqLwpAQCAtNDMsNyArNDUsNyBAQAogICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KICAqIGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KICAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IGluIHdoaWNoIHRoaXMgbWVtYmVyIGlzIGRlY2xhcmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgogICogaWYgdGhpcyBtZW1iZXIgaXMgbm90IGRlY2xhcmVkIGluIGEgY29tcGlsYXRpb24gdW5pdCAoZm9yIGV4YW1wbGUsIGEgYmluYXJ5IHR5cGUpCiAgKi8KQEAgLTUyLDcgKzU0LDcgQEAKICAqIFJldHVybnMgdGhlIHR5cGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAgKiBpZiB0aGlzIG1lbWJlciBpcyBub3QgZGVjbGFyZWQgaW4gYSB0eXBlIChmb3IgZXhhbXBsZSwgYSB0b3AtbGV2ZWwgdHlwZSkuCiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCisgKgogICogQHJldHVybiB0aGUgdHlwZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KICAqIGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiBhIHR5cGUgKGZvciBleGFtcGxlLCBhIHRvcC1sZXZlbCB0eXBlKQogICovCkBAIC03NCw4ICs3Niw4IEBACiAvKioKICAqIFJldHVybnMgdGhlIEphdmFkb2MgcmFuZ2UgaWYgdGhpcyBlbGVtZW50IGlzIGZyb20gc291cmNlIG9yIGlmIHRoaXMgZWxlbWVudAogICogaXMgYSBiaW5hcnkgZWxlbWVudCB3aXRoIGFuIGF0dGFjaGVkIHNvdXJjZSwgbnVsbCBvdGhlcndpc2UuCi0gKiAKLSAqIDxwPklmIHRoaXMgZWxlbWVudCBpcyBmcm9tIHNvdXJjZSwgdGhlIGphdmFkb2MgcmFuZ2UgaXMgCisgKgorICogPHA+SWYgdGhpcyBlbGVtZW50IGlzIGZyb20gc291cmNlLCB0aGUgamF2YWRvYyByYW5nZSBpcwogICogZXh0cmFjdGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlLjwvcD4KICAqIDxwPklmIHRoaXMgZWxlbWVudCBpcyBmcm9tIGEgYmluYXJ5LCB0aGUgamF2YWRvYyBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKICAqIGF0dGFjaGVkIHNvdXJjZSBpZiBwcmVzZW50LjwvcD4KQEAgLTkxLDI2ICs5MywxMiBAQAogICovCiBJU291cmNlUmFuZ2UgZ2V0SmF2YWRvY1JhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIC8qKgotICogUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIG9mIHRoaXMgbWVtYmVyJ3Mgc2ltcGxlIG5hbWUsCi0gKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1lbWJlciBkb2VzIG5vdCBoYXZlIGEgbmFtZQotICogKGZvciBleGFtcGxlLCBhbiBpbml0aWFsaXplciksIG9yIGlmIHRoaXMgbWVtYmVyIGRvZXMgbm90IGhhdmUKLSAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KLSAqCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KLSAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBtZW1iZXIncyBzaW1wbGUgbmFtZSwKLSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbWVtYmVyIGRvZXMgbm90IGhhdmUgYSBuYW1lCi0gKiAoZm9yIGV4YW1wbGUsIGFuIGluaXRpYWxpemVyKSwgb3IgaWYgdGhpcyBtZW1iZXIgZG9lcyBub3QgaGF2ZQotICogYXNzb2NpYXRlZCBzb3VyY2UgY29kZSAoZm9yIGV4YW1wbGUsIGEgYmluYXJ5IHR5cGUpCi0gKi8KLUlTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCiAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgb3JkZXIgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZCBpbiB0aGUgc291cmNlLgogICogTnVtYmVyaW5nIHN0YXJ0cyBhdCAxICh0aHVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlzIG9jY3VycmVuY2UgMSwgbm90IG9jY3VycmVuY2UgMCkuCiAgKiA8cD4KLSAqIFR3byBtZW1iZXJzIG0xIGFuZCBtMiB0aGF0IGFyZSBlcXVhbCAoZS5nLiAyIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gCi0gKiB0aGUgc2FtZSB0eXBlKSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCB1c2luZyB0aGVpciBvY2N1cnJlbmNlIGNvdW50cy4gSWYgbWVtYmVyIAotICogbTEgYXBwZWFycyBmaXJzdCBpbiB0aGUgc291cmNlLCBpdCB3aWxsIGhhdmUgYW4gb2NjdXJyZW5jZSBjb3VudCBvZiAxLiBJZiBtZW1iZXIgCisgKiBUd28gbWVtYmVycyBtMSBhbmQgbTIgdGhhdCBhcmUgZXF1YWwgKGUuZy4gMiBmaWVsZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGluCisgKiB0aGUgc2FtZSB0eXBlKSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCB1c2luZyB0aGVpciBvY2N1cnJlbmNlIGNvdW50cy4gSWYgbWVtYmVyCisgKiBtMSBhcHBlYXJzIGZpcnN0IGluIHRoZSBzb3VyY2UsIGl0IHdpbGwgaGF2ZSBhbiBvY2N1cnJlbmNlIGNvdW50IG9mIDEuIElmIG1lbWJlcgogICogbTIgYXBwZWFycyByaWdodCBhZnRlciBtZW1iZXIgbTEsIGl0IHdpbGwgaGF2ZSBhbiBvY2N1cnJlbmNlIGNvdW50IG9mIDIuCiAgKiA8L3A+PHA+CiAgKiBUaGUgb2NjdXJyZW5jZSBjb3VudCBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBpbml0aWFsaXplcnMgaW5zaWRlIGEgdHlwZQpAQCAtMTE4LDcgKzEwNiw3IEBACiAgKiA8L3A+PHA+CiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIG1lbWJlciBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LgogICogPC9wPgotICogCisgKgogICogQHJldHVybiB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yZGVyIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQgaW4gdGhlIHNvdXJjZQogICogQHNpbmNlIDMuMgogICovCkBAIC0xMjYsNyArMTE0LDcgQEAKIC8qKgogICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIHJvb3QgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQuCiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCisgKgogICogQHJldHVybiB0aGUgSmF2YSB0eXBlIHJvb3QgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQuCiAgKiBAc2luY2UgMy4zCiAgKi8KQEAgLTEzOCw3ICsxMjYsNyBAQAogICogTnVtYmVyaW5nIHN0YXJ0cyBhdCAxICh0aHVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlzIG9jY3VycmVuY2UgMSwgbm90IG9jY3VycmVuY2UgMCkuCiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiBUaGUgdHlwZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4KICAqIFRocm93cyBhIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBhIHNvdXJjZSBtZW1iZXIuCi0gKiAKKyAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKICAqIEBwYXJhbSBvY2N1cnJlbmNlQ291bnQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgogICogQHJldHVybiB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZC9vciB3aXRoIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yZGVyIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIHNvdXJjZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlclZhbHVlUGFpci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlclZhbHVlUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTY3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWVtYmVyVmFsdWVQYWlyLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbWVtYmVyLXZhbHVlIHBhaXIgb2YgYW4gYW5ub3RhdGlvbi4KKyAqIFRoZSB7QGxpbmsgI2dldFZhbHVlKCkgdmFsdWV9IGlzIHJlcHJlc2VudGVkIGJ5IGFuIHtAbGluayBPYmplY3R9LiBUbyBnZXQgdGhlIGV4YWN0CisgKiB0eXBlIG9mIHRoaXMgb2JqZWN0LCB1c2UgaXRzIHtAbGluayAjZ2V0VmFsdWVLaW5kKCkgdmFsdWUga2luZH0uIElmIHRoaXMgdmFsdWUgaXMgYW4gYXJyYXksCisgKiB7QGxpbmsgI2dldFZhbHVlKCl9IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE9iamVjdH1bXSBhbmQgdGhlIHZhbHVlIGtpbmQgcmV0dXJucworICogdGhlIGtpbmQgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgYXJyYXkuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIGludGVyZmFjZSBJTWVtYmVyVmFsdWVQYWlyIHsKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgYW4gPGNvZGU+aW50PC9jb2RlPiByZXByZXNlbnRlZCBieQorCSAqIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnRlZ2VyfS4KKwkgKi8KKwlpbnQgS19JTlQgPSAxOworCisJLyoqCisJICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBraW5kIGlzIGEgPGNvZGU+Ynl0ZTwvY29kZT4gcmVwcmVzZW50ZWQgYnkKKwkgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQnl0ZX0uCisJICovCisJaW50IEtfQllURSA9IDI7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgYSA8Y29kZT5zaG9ydDwvY29kZT4gcmVwcmVzZW50ZWQgYnkKKwkgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2hvcnR9LgorCSAqLworCWludCBLX1NIT1JUID0gMzsKKworCS8qKgorCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUga2luZCBpcyBhIDxjb2RlPmNoYXI8L2NvZGU+IHJlcHJlc2VudGVkIGJ5CisJICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENoYXJhY3Rlcn0uCisJICovCisJaW50IEtfQ0hBUiA9IDQ7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgYSA8Y29kZT5mbG9hdDwvY29kZT4gcmVwcmVzZW50ZWQgYnkKKwkgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRmxvYXR9LgorCSAqLworCWludCBLX0ZMT0FUID0gNTsKKworCS8qKgorCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUga2luZCBpcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gcmVwcmVzZW50ZWQgYnkKKwkgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRG91YmxlfS4KKwkgKi8KKwlpbnQgS19ET1VCTEUgPSA2OworCisJLyoqCisJICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBraW5kIGlzIGEgPGNvZGU+bG9uZzwvY29kZT4gcmVwcmVzZW50ZWQgYnkKKwkgKiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTG9uZ30uCisJICovCisJaW50IEtfTE9ORyA9IDc7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiByZXByZXNlbnRlZCBieQorCSAqIGFuIGluc3RhbmNlIG9mIHtAbGluayBCb29sZWFufS4KKwkgKi8KKwlpbnQgS19CT09MRUFOID0gODsKKworCS8qKgorCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUga2luZCBpcyBhIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGVkIGJ5CisJICogdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFN0cmluZ30uCisJICovCisJaW50IEtfU1RSSU5HID0gOTsKKworCS8qKgorCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUga2luZCBpcyBhbiBhbm5vdGF0aW9uIHJlcHJlc2VudGVkIGJ5CisJICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElBbm5vdGF0aW9ufS4KKwkgKi8KKwlpbnQgS19BTk5PVEFUSU9OID0gMTA7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgYSB7QGxpbmsgQ2xhc3N9IHJlcHJlc2VudGVkIGJ5CisJICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzIChpLmUuIGEge0BsaW5rIFN0cmluZ30uIElmIHRoZSBtZW1iZXItdmFsdWUgcGFpciBpcyBjb21pbmcgZnJvbQorCSAqIGEgY29tcGlsYXRpb24gdW5pdCwgdGhpcyBpcyBlaXRoZXIgYSBzaW1wbGUgbmFtZSAoZS5nLiBmb3IgPGNvZGU+TXlUeXBlLmNsYXNzPC9jb2RlPiwKKwkgKiB0aGUgbmFtZSBpcyAiTXlUeXBlIiksIG9yIGEgcXVhbGlmaWVkIG5hbWUgIChlLmcuIGZvciA8Y29kZT54LnkuTXlUeXBlLk15TmVzdGVkVHlwZS5jbGFzczwvY29kZT4sCisJICogdGhlIG5hbWUgaXMgIngueS5NeVR5cGUuTXlOZXN0ZWRUeXBlIikuIElmIHRoZSBtZW1iZXItdmFsdWUgcGFpciBpcyBjb21pbmcgZnJvbSBhIGNsYXNzIGZpbGUsIHRoaXMgaXMKKwkgKiBhbHdheXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgb25lIGNhbiB1c2Uge0BsaW5rIElUeXBlI3Jlc29sdmVUeXBlKFN0cmluZyl9IGFuZCBlLmcuCisJICoge0BsaW5rIElKYXZhUHJvamVjdCNmaW5kVHlwZShTdHJpbmcsIFN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfQorCSAqIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIElUeXBlfS4KKwkgKiA8L3A+CisJICovCisJaW50IEtfQ0xBU1MgPSAxMTsKKworCS8qKgorCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgaXMgYSBxdWFsaWZpZWQgbmFtZSByZXByZXNlbnRlZCBieSBhCisJICoge0BsaW5rIFN0cmluZ30uIFRoZSBxdWFsaWZpZWQgbmFtZSByZWZlcnMgdG8gYW4gZW51bSBjb25zdGFudCBvciBhbm90aGVyCisJICogY29tcGlsZS10aW1lIGNvbnN0YW50IGlmIHRoZSBjb2RlIGlzIGNvcnJlY3QgKGUuZy4gIk15RW51bS5GSVJTVCIpLgorCSAqLworCWludCBLX1FVQUxJRklFRF9OQU1FID0gMTI7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIG5hbWUgcmVwcmVzZW50ZWQgYnkgYQorCSAqIHtAbGluayBTdHJpbmd9LiBUaGUgc2ltcGxlIG5hbWUgcmVmZXJzIHRvIGFuIGVudW0gY29uc3RhbnQgb3IgYW5vdGhlcgorCSAqIGNvbXBpbGUtdGltZSBjb25zdGFudCBpZiB0aGUgY29kZSBpcyBjb3JyZWN0IChlLmcuICJGSVJTVCIgd2hlbiB0aGVyZSBpcworCSAqIGEgc3RhdGljIGltcG9ydCBmb3IgIk15RW51bS5GSVJTVCIpLgorCSAqLworCWludCBLX1NJTVBMRV9OQU1FID0gMTM7CisKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGtpbmQgaXMgdW5rbm93biBhdCB0aGlzIHN0YWdlLiBUaGUgdmFsdWUgaXMgdW5rbm93biBpbiB0aGUKKwkgKiBmb2xsb3dpbmcgY2FzZXM6CisJICogPHVsPgorCSAqIDxsaT50aGUgdmFsdWUgaXMgYW4gZXhwcmVzc2lvbiB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZnVydGhlciBhbmFseXplZCB0byBkZXRlcm1pbmUgaXRzIGtpbmQuIEZvcgorCSAqIGV4YW1wbGUsIGluIDxjb2RlPkBNeUFubm90KDEgKyAyLjMpPC9jb2RlPiB0aGUga2luZCBvZiB0aGUgZXhwcmVzc2lvbiAiMSArIDIuMyIgaXMKKwkgKiB1bmtub3duPC9saT4KKwkgKiA8bGk+dGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIHNpemUgMCwgZS5nLiA8Y29kZT5ATXlBbm5vdCh7fSk8L2NvZGU+PC9saT4KKwkgKiA8bGk+dGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGV4cHJlc3Npb24gdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGZ1cnRoZXIKKwkgKiAgICAgIGFuYWx5emVkIHRvIGRldGVybWluZSBpdHMga2luZC4gRm9yIGV4YW1wbGUsIGluIDxjb2RlPkBNeUFubm90KHszLjQsIDEgKyAyLjN9KTwvY29kZT4sCisJICogICAgICB0aGUga2luZCBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgIjEgKyAyLjMiIGlzIHVua25vd24uPC9saT4KKwkgKiA8bGk+dGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoYXQgY29udGFpbnMgaGV0ZXJvZ2VuZW91cyB2YWx1ZXMsIGUuZy4KKwkgKiAgICAgIDxjb2RlPkBNeUFubm90KHsxLCAyLjMsICJhYmMifSk8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqIElmIHRoZSB2YWx1ZSBraW5kIGlzIHVua25vd24sIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHdheXMgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+LCBvciBhbgorCSAqIGFycmF5IGNvbnRhaW5pbmcge0BsaW5rIE9iamVjdH1zIGFuZC9vciA8Y29kZT5udWxsPC9jb2RlPnMgZm9yIHVua25vd24gZWxlbWVudHMuCisJICovCisJaW50IEtfVU5LTk9XTiA9IDE0OworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWVtYmVyJ3MgbmFtZSBvZiB0aGlzIG1lbWJlci12YWx1ZSBwYWlyLgorCSAqCisJICogQHJldHVybiB0aGUgbWVtYmVyJ3MgbmFtZSBvZiB0aGlzIG1lbWJlci12YWx1ZSBwYWlyLgorCSAqLworCVN0cmluZyBnZXRNZW1iZXJOYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIG1lbWJlci12YWx1ZSBwYWlyLiBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlCisJICogaXMgZnVuY3Rpb24gb2YgdGhpcyBtZW1iZXItdmFsdWUgcGFpcidzIHtAbGluayAjZ2V0VmFsdWVLaW5kKCkgdmFsdWUga2luZH0uIEl0IGlzIGFuCisJICogaW5zdGFuY2Ugb2Yge0BsaW5rIE9iamVjdH1bXSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkuCisJICogPHA+CisJICogSWYgdGhlIHZhbHVlIGtpbmQgaXMge0BsaW5rICNLX1VOS05PV059IGFuZCB0aGUgdmFsdWUgaXMgbm90IGFuIGFycmF5LCB0aGVuIHRoZQorCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIElmIHRoZSB2YWx1ZSBraW5kIGlzIHtAbGluayAjS19VTktOT1dOfSBhbmQgdGhlIHZhbHVlIGlzIGFuIGFycmF5LCB0aGVuIHRoZQorCSAqIHZhbHVlIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcge0BsaW5rIE9iamVjdH1zIGFuZC9vciA8Y29kZT5udWxsPC9jb2RlPnMgZm9yCisJICogdW5rbm93biBlbGVtZW50cy4KKwkgKiBTZWUge0BsaW5rICNLX1VOS05PV059IGZvciBtb3JlIGRldGFpbHMuCisJICogPC9wPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyLXZhbHVlIHBhaXIuCisJICovCisJT2JqZWN0IGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBraW5kIG9mIHRoaXMgbWVtYmVyLXZhbHVlIHBhaXIuIFRoaXMgaW5kaWNhdGVzIHRoZSBpbnN0YW5jZSBvZgorCSAqIHRoZSByZXR1cm5lZCB7QGxpbmsgI2dldFZhbHVlKCkgdmFsdWV9LCBvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIGVsZW1lbnRzIGlmIHRoZSB2YWx1ZQorCSAqIGlzIGFuIGFycmF5LiBUaGUgdmFsdWUga2luZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisJICoge0BsaW5rICNLX0FOTk9UQVRJT059LCB7QGxpbmsgI0tfQk9PTEVBTn0sIHtAbGluayAjS19CWVRFfSwge0BsaW5rICNLX0NIQVJ9LAorCSAqIHtAbGluayAjS19DTEFTU30sIHtAbGluayAjS19ET1VCTEV9LCB7QGxpbmsgI0tfRkxPQVR9LCB7QGxpbmsgI0tfSU5UfSwge0BsaW5rICNLX0xPTkd9LAorCSAqIHtAbGluayAjS19RVUFMSUZJRURfTkFNRX0sIHtAbGluayAjS19TSU1QTEVfTkFNRX0sIHtAbGluayAjS19TSE9SVH0sIHtAbGluayAjS19TVFJJTkd9LAorCSAqIHtAbGluayAjS19VTktOT1dOfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGtpbmQgb2YgdGhpcyBtZW1iZXItdmFsdWUgcGFpcgorCSAqLworCWludCBnZXRWYWx1ZUtpbmQoKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1ldGhvZC5qYXZhCmluZGV4IDg1ZTgyYzIuLmZiNDY5NzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTEgKzEzLDI1IEBACiAKIC8qKgogICogUmVwcmVzZW50cyBhIG1ldGhvZCAob3IgY29uc3RydWN0b3IpIGRlY2xhcmVkIGluIGEgdHlwZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2QgZXh0ZW5kcyBJTWVtYmVyIHsKK3B1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZCBleHRlbmRzIElNZW1iZXIsIElBbm5vdGF0YWJsZSB7CisvKioKKyAqIFJldHVybnMgYSB7QGxpbmsgSU1lbWJlclZhbHVlUGFpciBtZW1iZXIgdmFsdWUgcGFpcn0gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0CisgKiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpZiBhbnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbWV0aG9kJ3MgcGFyZW50IGlzCisgKiBub3QgYW4gYW5ub3RhdGlvbiB0eXBlLCBvciBlbHNlIGlmIHRoaXMgbWV0aG9kIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICogPHA+CisgKiBOb3RlIHRoYXQge0BsaW5rIElNZW1iZXJWYWx1ZVBhaXIjZ2V0VmFsdWUoKX0gbWlnaHQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICogUGxlYXNlIHNlZSB0aGlzIG1ldGhvZCBmb3IgbW9yZSBkZXRhaWxzLgorICogPC9wPgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKyAqIEByZXR1cm4gYSBtZW1iZXIgcGFpciB2YWx1ZSBpZiBhbnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqIEBzaW5jZSAzLjQKKyAqLworSU1lbWJlclZhbHVlUGFpciBnZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogLyoqCiAgKiBSZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGlzIG1ldGhvZC4KICAqIEZvciBhIGNvbnN0cnVjdG9yLCB0aGlzIHJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBkZWNsYXJpbmcgdHlwZS4KQEAgLTgyLDE4ICs5Niw0MCBAQAogLyoqCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZC4KICAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZAogICovCiBpbnQgZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCk7CisKIC8qKgotICogUmV0dXJucyB0aGUgYmluZGluZyBrZXkgZm9yIHRoaXMgbWV0aG9kLiBBIGJpbmRpbmcga2V5IGlzIGEga2V5IHRoYXQgdW5pcXVlbHkKLSAqIGlkZW50aWZpZXMgdGhpcyBtZXRob2QuIEl0IGFsbG93cyBhY2Nlc3MgdG8gZ2VuZXJpYyBpbmZvIGZvciBwYXJhbWV0ZXJpemVkCi0gKiBtZXRob2RzLgorICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZC4KKyAqIDxwPkFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLCBpZiB0aGUgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzLjwvcD4KKyAqIDxwPkZvciBiaW5hcnkgdHlwZXMsIGFzc29jaWF0ZWQgc291cmNlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHtAbGluayBJTG9jYWxWYXJpYWJsZSNnZXROYW1lUmFuZ2UoKSBuYW1lIHJhbmdlfSwKKyAqIHtAbGluayBJTG9jYWxWYXJpYWJsZSNnZXRTb3VyY2VSYW5nZSgpIHNvdXJjZSByYW5nZX0gYW5kIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGUjZ2V0RmxhZ3MoKSBmbGFnc30uPC9wPgorICogPHA+VGhlc2UgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGUjZ2V0QW5ub3RhdGlvbnMoKSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnN9LjwvcD4KICAqIAorICogQHJldHVybiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZAorICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHNpbmNlIDMuNworICovCitJTG9jYWxWYXJpYWJsZVtdIGdldFBhcmFtZXRlcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIFJldHVybnMgdGhlIGJpbmRpbmcga2V5IGZvciB0aGlzIG1ldGhvZCBvbmx5IGlmIHRoZSBnaXZlbiBtZXRob2QgaXMge0BsaW5rICNpc1Jlc29sdmVkKCkgcmVzb2x2ZWR9LgorICogQSBiaW5kaW5nIGtleSBpcyBhIGtleSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBtZXRob2QuIEl0IGFsbG93cyBhY2Nlc3MgdG86CisgKiA8dWw+CisgKiA8bGk+Z2VuZXJpYyBpbmZvIGZvciBwYXJhbWV0ZXJpemVkIG1ldGhvZHM8L2xpPgorICogPGxpPnRoZSBhY3R1YWwgcmV0dXJuIHR5cGUgZm9yIHJlZmVyZW5jZXMgdG8ge0BsaW5rIE9iamVjdCNnZXRDbGFzcygpIE9iamVjdC5nZXRDbGFzcygpfTwvbGk+CisgKiA8bGk+dGhlIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZXMgYW5kIHJldHVybiB0eXBlIGZvciByZWZlcmVuY2VzIHRvIHNpZ25hdHVyZSBwb2x5bW9ycGhpYyBtZXRob2RzIGZyb20gY2xhc3MgTWV0aG9kSGFuZGxlPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+SWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBub3QgcmVzb2x2ZWQsIHRoZSByZXR1cm5lZCBrZXkgaXMgc2ltcGx5IHRoZSBqYXZhIGVsZW1lbnQncyBrZXkuCisgKiA8L3A+CiAgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGtleSBmb3IgdGhpcyBtZXRob2QKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nI2dldEtleSgpCiAgKiBAc2VlIEJpbmRpbmdLZXkKKyAqIEBzZWUgI2lzUmVzb2x2ZWQoKQogICogQHNpbmNlIDMuMQogICovCiBTdHJpbmcgZ2V0S2V5KCk7CkBAIC0xMjUsMTQgKzE2MSwxNCBAQAogICogb3IgcmVzb2x2ZWQgKGZvciBiaW5hcnkgdHlwZXMpLCBhbmQgZWl0aGVyIGJhc2ljIChmb3IgYmFzaWMgdHlwZXMpCiAgKiBvciByaWNoIChmb3IgcGFyYW1ldGVyaXplZCB0eXBlcykuIFNlZSB7QGxpbmsgU2lnbmF0dXJlfSBmb3IgZGV0YWlscy4KICAqIDwvcD4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlcyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QsIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzCiAgKiBAc2VlIFNpZ25hdHVyZQogICovCiBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwogLyoqCiAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBwYXJhbWV0ZXJzIGluIHRoaXMgbWV0aG9kLgotICogRm9yIGJpbmFyeSB0eXBlcywgdGhlc2UgbmFtZXMgYXJlIGludmVudGVkIGFzICJhcmciK2ksIHdoZXJlIGkgc3RhcnRzIGF0IDAgCisgKiBGb3IgYmluYXJ5IHR5cGVzLCB0aGVzZSBuYW1lcyBhcmUgaW52ZW50ZWQgYXMgImFyZyIraSwgd2hlcmUgaSBzdGFydHMgYXQgMAogICogKGV2ZW4gaWYgc291cmNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluYXJ5IG9yIGlmIEphdmRvYyBpcyBhdHRhY2hlZCB0byB0aGUgYmluYXJ5KS4KICAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBtZXRob2QgaGFzIG5vIHBhcmFtZXRlcnMuCiAgKgpAQCAtMTkwLDcgKzIyNiw3IEBACiAvKioKICAqIFJldHVybnMgdGhlIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmVkIGluIHRoaXMgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiBUaGUgdHlwZSBwYXJhbWV0ZXIgbWF5IG9yIG1heSBub3QgZXhpc3QuCi0gKiAKKyAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKICAqIEByZXR1cm4gdGhlIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmVkIGluIHRoaXMgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUKICAqIEBzaW5jZSAzLjEKQEAgLTIwMSw3ICsyMzcsNyBAQAogICoKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqIAorICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yLCBmYWxzZSBvdGhlcndpc2UKICAqLwogYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKQEAgLTIxNSw3ICsyNTEsNyBAQAogICogPGxpPml0IGlzIDxjb2RlPnN0YXRpYzwvY29kZT4gYW5kIDxjb2RlPnB1YmxpYzwvY29kZT48L2xpPgogICogPGxpPml0IGRlZmluZXMgb25lIHBhcmFtZXRlciB3aG9zZSB0eXBlJ3Mgc2ltcGxlIG5hbWUgaXMgPGNvZGU+U3RyaW5nW108L2NvZGU+PC9saT4KICAqIDwvdWw+Ci0gKiAKKyAqCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KICAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAgKiBAc2luY2UgMi4wCkBAIC0yMjQsOCArMjYwLDggQEAKIGJvb2xlYW4gaXNNYWluTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kIHJlcHJlc2VudHMgYSByZXNvbHZlZCBtZXRob2QuCi0gKiBJZiBhIG1ldGhvZCBpcyByZXNvdmVkLCBpdHMga2V5IGNvbnRhaW5zIHJlc29sdmVkIGluZm9ybWF0aW9uLgotICogCisgKiBJZiBhIG1ldGhvZCBpcyByZXNvbHZlZCwgaXRzIGtleSBjb250YWlucyByZXNvbHZlZCBpbmZvcm1hdGlvbi4KKyAqCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBtZXRob2QgcmVwcmVzZW50cyBhIHJlc29sdmVkIG1ldGhvZC4KICAqIEBzaW5jZSAzLjEKICAqLwpAQCAtMjM5LDcgKzI3NSw3IEBACiAgKiA8bGk+dGhlIHNpbXBsZSBuYW1lcyBvZiB0aGVpciBwYXJhbWV0ZXIgdHlwZXMgYXJlIGVxdWFsPC9saT4KICAqIDwvdWw+CiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCisgKgogICogQHBhcmFtIG1ldGhvZCB0aGUgZ2l2ZW4gbWV0aG9kCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB0aGUgZ2l2ZW4gbWV0aG9kLgogICogQHNlZSBTaWduYXR1cmUjZ2V0U2ltcGxlTmFtZShjaGFyW10pCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JT3BlbmFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhCmluZGV4IDJkMWNmYWIuLjA3MDIwNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDEwICsxMywxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogCiAvKioKLSAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IG11c3QgYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSAKKyAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IG11c3QgYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZQogICogbmF2aWdhdGVkIG9yIG1vZGlmaWVkLiBPcGVuaW5nIGEgdGV4dHVhbCBlbGVtZW50IChzdWNoIGFzIGEgY29tcGlsYXRpb24gdW5pdCkKICAqIGludm9sdmVzIG9wZW5pbmcgYSBidWZmZXIgb24gaXRzIGNvbnRlbnRzLiAgV2hpbGUgb3BlbiwgYW55IGNoYW5nZXMgdG8gdGhlIGJ1ZmZlcgotICogY2FuIGJlIHJlZmxlY3RlZCBpbiB0aGUgZWxlbWVudCdzIHN0cnVjdHVyZTsgCisgKiBjYW4gYmUgcmVmbGVjdGVkIGluIHRoZSBlbGVtZW50J3Mgc3RydWN0dXJlOwogICogc2VlIHtAbGluayAjaXNDb25zaXN0ZW50fSBhbmQge0BsaW5rICNtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yKX0uCiAgKiA8cD4KICAqIFRvIHJlZHVjZSBjb21wbGV4aXR5IGluIGNsaWVudHMsIGVsZW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IG9wZW5lZApAQCAtMzcsOSArMzcsOCBAQAogICogRm9yIGV4YW1wbGUsIG9wZW5pbmcgYSBjb21waWxhdGlvbiB1bml0IHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRzLAogICogYnV0IG9wZW5pbmcgYSBwYWNrYWdlIGZyYWdtZW50IGRvZXMgbm90IG9wZW4gYWxsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSBwYWNrYWdlIGZyYWdtZW50LgogICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU9wZW5hYmxlIHsKIApAQCAtNTcsMTAgKzU2LDEwIEBACiAvKioKICAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSByZWNvbW1lbmRlZCBsaW5lIHNlcGFyYXRvciBmb3IgdGhpcyBlbGVtZW50LgogICogVGhlIGVsZW1lbnQncyBidWZmZXIgaXMgZmlyc3Qgc2VhcmNoZWQgYW5kIHRoZSBmaXJzdCBsaW5lIHNlcGFyYXRvciBpbiB0aGlzIGJ1ZmZlciBpcyByZXR1cm5lZCBpZiBhbnkuCi0gKiBPdGhlcndpc2UgdGhlIHByZWZlcmVuY2Uge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNQUkVGX0xJTkVfU0VQQVJBVE9SfSAKKyAqIE90aGVyd2lzZSB0aGUgcHJlZmVyZW5jZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtI1BSRUZfTElORV9TRVBBUkFUT1J9CiAgKiBvbiB0aGlzIGVsZW1lbnQncyBwcm9qZWN0IG9yIHdvcmtzcGFjZSBpcyByZXR1cm5lZC4KICAqIEZpbmFsbHkgaWYgbm8gc3VjaCBwcmVmZXJlbmNlIGlzIHNldCwgdGhlIHN5c3RlbSBsaW5lIHNlcGFyYXRvciBpcyByZXR1cm5lZC4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIHJlY29tbWVuZGVkIGxpbmUgc2VwYXJhdG9yIGZvciB0aGlzIGVsZW1lbnQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgpAQCAtMTE5LDcgKzExOCw3IEBACiAgKi8KIGJvb2xlYW4gaXNPcGVuKCk7CiAvKioKLSAqIE1ha2VzIHRoaXMgZWxlbWVudCBjb25zaXN0ZW50IHdpdGggaXRzIHVuZGVybHlpbmcgcmVzb3VyY2Ugb3IgYnVmZmVyIAorICogTWFrZXMgdGhpcyBlbGVtZW50IGNvbnNpc3RlbnQgd2l0aCBpdHMgdW5kZXJseWluZyByZXNvdXJjZSBvciBidWZmZXIKICAqIGJ5IHVwZGF0aW5nIHRoZSBlbGVtZW50J3Mgc3RydWN0dXJlIGFuZCBwcm9wZXJ0aWVzIGFzIG5lY2Vzc2FyeS4KICAqPHA+CiAgKiBOb3RlOiBVc2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkgb24gYSB3b3JraW5nIGNvcHkgd2lsbCBpbnRlcmZlcmUgd2l0aCBhbnkKQEAgLTE2NCwxNiArMTYzLDE2IEBACiAgKiBjYXNlcyB3aGVyZSB0aGUgd29ya2JlbmNoIGlzIG5vdCBjb21wbGV0ZWx5IGluIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCiAgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYXR0ZW1wdAogICogdG8gb3ZlcndyaXRlIGEgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBwcm92aWRlZAotICogaXQgaXMgaW4gc3luYyB3aXRoIHRoZSB3b3JrYmVuY2guIFRoaXMgb3B0aW9uIGVuc3VyZXMgdGhlcmUgaXMgbm8gCisgKiBpdCBpcyBpbiBzeW5jIHdpdGggdGhlIHdvcmtiZW5jaC4gVGhpcyBvcHRpb24gZW5zdXJlcyB0aGVyZSBpcyBubwogICogdW5pbnRlbmRlZCBkYXRhIGxvc3M7IGl0IGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLgogICogSG93ZXZlciwgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZQotICogdG8gd3JpdGUgYSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCAKKyAqIHRvIHdyaXRlIGEgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwKICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBvbmUgaWYgbmVlZCBiZS4KLSAqIEluIGVpdGhlciBjYXNlLCBpZiB0aGlzIG1ldGhvZCBzdWNjZWVkcywgdGhlIHJlc291cmNlIHdpbGwgYmUgbWFya2VkIAorICogSW4gZWl0aGVyIGNhc2UsIGlmIHRoaXMgbWV0aG9kIHN1Y2NlZWRzLCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBtYXJrZWQKICAqIGFzIGJlaW5nIGxvY2FsIChldmVuIGlmIGl0IHdhc24ndCBiZWZvcmUpLgogICogPHA+Ci0gKiBBcyBhIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiwgdGhlIGVsZW1lbnQgaXMgY29uc2lzdGVudCB3aXRoIGl0cyB1bmRlcmx5aW5nIAotICogcmVzb3VyY2Ugb3IgYnVmZmVyLiAKKyAqIEFzIGEgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLCB0aGUgZWxlbWVudCBpcyBjb25zaXN0ZW50IHdpdGggaXRzIHVuZGVybHlpbmcKKyAqIHJlc291cmNlIG9yIGJ1ZmZlci4KICAqCiAgKiBAcGFyYW0gcHJvZ3Jlc3MgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKICAqIEBwYXJhbSBmb3JjZSBpdCBjb250cm9scyBob3cgdGhpcyBtZXRob2QgZGVhbHMgd2l0aApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCmluZGV4IGNjN2YzMTguLjJmMzk0ZDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTUgKzEzLDE0IEBACiAKIC8qKgogICogUmVwcmVzZW50cyBhIHBhY2thZ2UgZGVjbGFyYXRpb24gaW4gSmF2YSBjb21waWxhdGlvbiB1bml0LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2VEZWNsYXJhdGlvbiBleHRlbmRzIElKYXZhRWxlbWVudCwgSVNvdXJjZVJlZmVyZW5jZSB7CitwdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlRGVjbGFyYXRpb24gZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElTb3VyY2VSZWZlcmVuY2UsIElBbm5vdGF0YWJsZSB7CiAvKioKICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhlIHN0YXRlbWVudCByZWZlcnMgdG8uCiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCisgKgogICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGUgc3RhdGVtZW50CiAgKi8KIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudC5qYXZhCmluZGV4IDI1Yjc0MTQuLmNlYTllMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMTkgKzE5LDE4IEBACiAgKiB3aGljaCBoYXZlIHRoZSBzYW1lIG5hbWUuCiAgKiA8cD4KICAqIFBhY2thZ2UgZnJhZ21lbnRzIGVsZW1lbnRzIG5lZWQgdG8gYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSBuYXZpZ2F0ZWQgb3IgbWFuaXB1bGF0ZWQuCi0gKiBUaGUgY2hpbGRyZW4gYXJlIG9mIHR5cGUgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gKHJlcHJlc2VudGluZyBhIHNvdXJjZSBmaWxlKSBvciAKKyAqIFRoZSBjaGlsZHJlbiBhcmUgb2YgdHlwZSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiAocmVwcmVzZW50aW5nIGEgc291cmNlIGZpbGUpIG9yCiAgKiA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiAocmVwcmVzZW50aW5nIGEgYmluYXJ5IGNsYXNzIGZpbGUpLgogICogVGhlIGNoaWxkcmVuIGFyZSBsaXN0ZWQgaW4gbm8gcGFydGljdWxhciBvcmRlci4KICAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlRnJhZ21lbnQgZXh0ZW5kcyBJUGFyZW50LCBJSmF2YUVsZW1lbnQsIElPcGVuYWJsZSwgSVNvdXJjZU1hbmlwdWxhdGlvbiB7CiAKLQkvKioJCisJLyoqCiAJICogPHA+Ci0JICogVGhlIG5hbWUgb2YgcGFja2FnZSBmcmFnbWVudCBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZSAodmFsdWU6IHRoZSBlbXB0eSAKKwkgKiBUaGUgbmFtZSBvZiBwYWNrYWdlIGZyYWdtZW50IGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlICh2YWx1ZTogdGhlIGVtcHR5CiAJICogc3RyaW5nLCA8Y29kZT4iIjwvY29kZT4pLgogCSAqIDwvcD4KICAJKi8KQEAgLTQ0LDEzICs0MywxMyBAQAogCSAqLwogCWJvb2xlYW4gY29udGFpbnNKYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29tcGlsYXRpb24gdW5pdCBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvbXBpbGF0aW9uIHVuaXQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50CiAJICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGNvbnRlbnRzLiBObyB2ZXJpZmljYXRpb24gaXMgcGVyZm9ybWVkCiAJICogb24gdGhlIGNvbnRlbnRzLgogCSAqCi0JICogPHA+SXQgaXMgcG9zc2libGUgdGhhdCBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgCisJICogPHA+SXQgaXMgcG9zc2libGUgdGhhdCBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMKIAkgKiBwYWNrYWdlIGZyYWdtZW50LgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGFmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKIAkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgogCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIGNvbXBpbGF0aW9uIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3IGNvbnRlbnRzPC9saT4KIAkgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KQEAgLTY3LDcgKzY2LDcgQEAKIAkgKiA8bGk+IFRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSAoSU5WQUxJRF9OQU1FKQogCSAqIDxsaT4gVGhlIGNvbnRlbnRzIGFyZSA8Y29kZT5udWxsPC9jb2RlPiAoSU5WQUxJRF9DT05URU5UUykKIAkgKiA8L3VsPgotCSAqIEByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0IGluIHRoaXMgcGFja2FnZSBmcmFnbWVudCAKKwkgKiBAcmV0dXJuIGEgY29tcGlsYXRpb24gdW5pdCBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQKIAkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudHMKIAkgKi8KIAlJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CkBAIC05Nyw3ICs5Niw3IEBACiAJICogaW4gdGhpcyBwYWNrYWdlIChmb3IgZXhhbXBsZSwgPGNvZGU+Ik9iamVjdC5qYXZhIjwvY29kZT4pLgogCSAqIFRoZSBuYW1lIGhhcyB0byBiZSBhIHZhbGlkIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIGNvbXBpbGF0aW9uIHVuaXQgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCiAJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHBhY2thZ2UKIAkgKiBAc2VlIEphdmFDb252ZW50aW9ucyN2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCkKQEAgLTExNywxMCArMTE2LDEwIEBACiAJICovCiAJSUNvbXBpbGF0aW9uVW5pdFtdIGdldENvbXBpbGF0aW9uVW5pdHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCS8qKgotCSAqIFJldHVybnMgYWxsIG9mIHRoZSBjb21waWxhdGlvbiB1bml0cyBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgdGhhdCBhcmUgCisJICogUmV0dXJucyBhbGwgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudCB0aGF0IGFyZQogCSAqIGluIHdvcmtpbmcgY29weSBtb2RlIGFuZCB0aGF0IGhhdmUgdGhlIGdpdmVuIG93bmVyLgogCSAqIDxwPgotCSAqIE9ubHkgZXhpc3Rpbmcgd29ya2luZyBjb3BpZXMgYXJlIHJldHVybmVkLiBTbyBhIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlIHRoYXQgaGFzIG5vIAorCSAqIE9ubHkgZXhpc3Rpbmcgd29ya2luZyBjb3BpZXMgYXJlIHJldHVybmVkLiBTbyBhIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlIHRoYXQgaGFzIG5vCiAJICogY29ycmVzcG9uZGluZyByZXNvdXJjZSBvbiBkaXNrIHdpbGwgYmUgaW5jbHVkZWQgaWYgYW5kIG9ubHkgaWYgaXMgaW4gd29ya2luZyBjb3B5IG1vZGUuCiAJICogPC9wPgogCSAqIDxwPk5vdGU6IGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IGNvbnRhaW5zIG9ubHkKQEAgLTEzOSwxMyArMTM4LDEzIEBACiAJICogUmV0dXJucyB0aGUgZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgb2YgdGhpcyBmcmFnbWVudCwgZm9yIGV4YW1wbGUKIAkgKiA8Y29kZT4iamF2YS5sYW5nIjwvY29kZT4sIG9yIDxjb2RlPiIiPC9jb2RlPiAodGhlIGVtcHR5IHN0cmluZyksCiAJICogZm9yIHRoZSBkZWZhdWx0IHBhY2thZ2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkb3Qtc2VwYXJhdGVkIHBhY2thZ2UgbmFtZSBvZiB0aGlzIGZyYWdtZW50CiAJICovCiAJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CiAJLyoqCiAJICogUmV0dXJucyB0aGlzIHBhY2thZ2UgZnJhZ21lbnQncyByb290IGtpbmQgZW5jb2RlZCBhcyBhbiBpbnRlZ2VyLgotCSAqIEEgcGFja2FnZSBmcmFnbWVudCBjYW4gY29udGFpbiBzb3VyY2UgZmlsZXMgKGkuZS4gZmlsZXMgd2l0aCBvbmUgb2YgCisJICogQSBwYWNrYWdlIGZyYWdtZW50IGNhbiBjb250YWluIHNvdXJjZSBmaWxlcyAoaS5lLiBmaWxlcyB3aXRoIG9uZSBvZgogCSAqIHRoZSB7QGxpbmsgSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgSmF2YS1saWtlIGV4dGVuc2lvbnN9KSwKIAkgKiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLgogCSAqCkBAIC0xNjAsMjMgKzE1OSwyMyBAQAogCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuCiAJICogPHA+CiAJICogTm9uLUphdmEgcmVzb3VyY2VzIGluY2x1ZGVzIG90aGVyIGZpbGVzIGFuZCBmb2xkZXJzIGxvY2F0ZWQgaW4gdGhlIHNhbWUKLQkgKiBkaXJlY3RvcnkgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIG9yIGNsYXNzIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UgCi0JICogZnJhZ21lbnQuIFNvdXJjZSBmaWxlcyBleGNsdWRlZCBmcm9tIHRoaXMgcGFja2FnZSBieSB2aXJ0dWUgb2YgCisJICogZGlyZWN0b3J5IGFzIHRoZSBjb21waWxhdGlvbiB1bml0cyBvciBjbGFzcyBmaWxlcyBmb3IgdGhpcyBwYWNrYWdlCisJICogZnJhZ21lbnQuIFNvdXJjZSBmaWxlcyBleGNsdWRlZCBmcm9tIHRoaXMgcGFja2FnZSBieSB2aXJ0dWUgb2YKIAkgKiBpbmNsdXNpb24vZXhjbHVzaW9uIHBhdHRlcm5zIG9uIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjbGFzc3BhdGggZW50cnkKIAkgKiBhcmUgY29uc2lkZXJlZCBub24tSmF2YSByZXNvdXJjZXMgYW5kIHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHQKIAkgKiAocG9zc2libHkgaW4gYSBmb2xkZXIpLgogCSAqIDwvcD48cD4KIAkgKiBTaW5jZSAzLjMsIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCBpcyBpbnNpZGUgYW4gYXJjaGl2ZSwgdGhlIG5vbi1KYXZhIHJlc291cmNlcwogCSAqIGFyZSBhIHRyZWUgb2Yge0BsaW5rIElKYXJFbnRyeVJlc291cmNlfXMuIE9uZSBjYW4gbmF2aWdhdGUgdGhpcyB0cmVlIHVzaW5nCi0JICogdGhlIHtAbGluayBJSmFyRW50cnlSZXNvdXJjZSNnZXRDaGlsZHJlbigpfSBhbmQgCisJICogdGhlIHtAbGluayBJSmFyRW50cnlSZXNvdXJjZSNnZXRDaGlsZHJlbigpfSBhbmQKIAkgKiB7QGxpbmsgSUphckVudHJ5UmVzb3VyY2UjZ2V0UGFyZW50KCl9IG1ldGhvZHMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzICg8Y29kZT5JRmlsZTwvY29kZT5zLCAKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyAoPGNvZGU+SUZpbGU8L2NvZGU+cywKIAkgKiAgICAgICAgICAgICAgPGNvZGU+SUZvbGRlcjwvY29kZT5zLCBvciA8Y29kZT5JU3RvcmFnZTwvY29kZT5zIGlmIHRoZQotCSAqICAgICAgICAgICAgICBwYWNrYWdlIGZyYWdtZW50IGlzIGluIGFuIGFyY2hpdmUpIGNvbnRhaW5lZCBpbiB0aGlzIHBhY2thZ2UgCisJICogICAgICAgICAgICAgIHBhY2thZ2UgZnJhZ21lbnQgaXMgaW4gYW4gYXJjaGl2ZSkgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZQogCSAqICAgICAgICAgICAgICBmcmFnbWVudAogCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEluY2x1c2lvblBhdHRlcm5zKCkKIAkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNnZXRFeGNsdXNpb25QYXR0ZXJucygpCkBAIC0xOTUsNyArMTk0LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGZyYWdtZW50IGlzIGEgZGVmYXVsdCBwYWNrYWdlLgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IGlzIGEgZGVmYXVsdCBwYWNrYWdlCiAJICovCiAJYm9vbGVhbiBpc0RlZmF1bHRQYWNrYWdlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQppbmRleCBlOGQzNmRjLi5jMWVkNTg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMjIgKzE5LDIxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIAogLyoqCiAgKiBBIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb250YWlucyBhIHNldCBvZiBwYWNrYWdlIGZyYWdtZW50cy4KICAqIEl0IGNvcnJlc3BvbmRzIHRvIGFuIHVuZGVybHlpbmcgcmVzb3VyY2Ugd2hpY2ggaXMgZWl0aGVyIGEgZm9sZGVyLAogICogSkFSLCBvciB6aXAuICBJbiB0aGUgY2FzZSBvZiBhIGZvbGRlciwgYWxsIGRlc2NlbmRhbnQgZm9sZGVycyByZXByZXNlbnQKLSAqIHBhY2thZ2UgZnJhZ21lbnRzLiAgRm9yIGEgZ2l2ZW4gY2hpbGQgZm9sZGVyIHJlcHJlc2VudGluZyBhIHBhY2thZ2UgZnJhZ21lbnQsIAotICogdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBuYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBmb2xkZXIgbmFtZXMgYmV0d2VlbiB0aGUgZm9sZGVyIAorICogcGFja2FnZSBmcmFnbWVudHMuICBGb3IgYSBnaXZlbiBjaGlsZCBmb2xkZXIgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBmcmFnbWVudCwKKyAqIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UgbmFtZSBpcyBjb21wb3NlZCBvZiB0aGUgZm9sZGVyIG5hbWVzIGJldHdlZW4gdGhlIGZvbGRlcgogICogZm9yIHRoaXMgcm9vdCBhbmQgdGhlIGNoaWxkIGZvbGRlciByZXByZXNlbnRpbmcgdGhlIHBhY2thZ2UsIHNlcGFyYXRlZCBieSAnLicuCi0gKiBJbiB0aGUgY2FzZSBvZiBhIEpBUiBvciB6aXAsIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBkaWN0YXRlcyAKKyAqIEluIHRoZSBjYXNlIG9mIGEgSkFSIG9yIHppcCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIGRpY3RhdGVzCiAgKiB0aGUgc2V0IG9mIHBhY2thZ2UgZnJhZ21lbnRzIGluIGFuIGFuYWxvZ291cyBtYW5uZXIuCiAgKiBQYWNrYWdlIGZyYWdtZW50IHJvb3RzIG5lZWQgdG8gYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSBuYXZpZ2F0ZWQgb3IgbWFuaXB1bGF0ZWQuCiAgKiBUaGUgY2hpbGRyZW4gYXJlIG9mIHR5cGUgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT4sIGFuZCBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlRnJhZ21lbnRSb290CiAJZXh0ZW5kcyBJUGFyZW50LCBJSmF2YUVsZW1lbnQsIElPcGVuYWJsZSB7CkBAIC03NSwyNyArNzQsMjcgQEAKIAkgKiBpcyB0byB1cGRhdGUgdGhlIGNsYXNzcGF0aCBvZiB0aGUgZGVzdGluYXRpb24gcHJvamVjdC4KIAkgKiBAc2luY2UgMi4xCiAJICovCi0JaW50IERFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIID0gODsJCisJaW50IERFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIID0gODsKIAkvKioKIAkgKiBVcGRhdGUgbW9kZWwgZmxhZyBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMTYpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCiAJICogaXMgdG8gcmVwbGFjZSB0aGUgcmVzb3VyY2UgYW5kIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgY2xhc3NwYXRoIGVudHJ5LgogCSAqIEBzaW5jZSAyLjEKIAkgKi8KLQlpbnQgUkVQTEFDRSA9IDE2OwkKKwlpbnQgUkVQTEFDRSA9IDE2OwogCS8qKgogCSAqIEF0dGFjaGVzIHRoZSBzb3VyY2UgYXJjaGl2ZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIHRvIHRoaXMKLQkgKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudCByb290LiA8Y29kZT5yb290UGF0aDwvY29kZT4gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiAKLQkgKiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIGFyY2hpdmUgb3IgZm9sZGVyIChlbXB0eSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdCAKKwkgKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudCByb290LiA8Y29kZT5yb290UGF0aDwvY29kZT4gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbgorCSAqIG9mIHRoZSByb290IHdpdGhpbiB0aGUgYXJjaGl2ZSBvciBmb2xkZXIgKGVtcHR5IHNwZWNpZmllcyB0aGUgZGVmYXVsdCByb290CiAJICogYW5kIDxjb2RlPm51bGw8L2NvZGU+IHNwZWNpZmllcyB0aGUgcm9vdCBwYXRoIHNob3VsZCBiZSBkZXRlY3RlZCkuCiAJICogT25jZSBhIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlciBpcyBhdHRhY2hlZCB0byB0aGUgcGFja2FnZSBmcmFnbWVudCByb290LAogCSAqIHRoZSA8Y29kZT5nZXRTb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5nZXRTb3VyY2VSYW5nZTwvY29kZT4KIAkgKiBtZXRob2RzIGJlY29tZSBvcGVyYXRpb25hbCBmb3IgYmluYXJ5IHR5cGVzL21lbWJlcnMuCi0JICogVG8gZGV0YWNoIGEgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyIGZyb20gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIHNwZWNpZnkgCisJICogVG8gZGV0YWNoIGEgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyIGZyb20gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIHNwZWNpZnkKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUgc291cmNlIHBhdGguCiAJICoKIAkgKiBAcGFyYW0gc291cmNlUGF0aCB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCi0JICogQHBhcmFtIHJvb3RQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlIAotCSAqICAgICAgICAgICAgICAoZW1wdHkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJvb3QgYW5kIDxjb2RlPm51bGw8L2NvZGU+IHNwZWNpZmllcyAKKwkgKiBAcGFyYW0gcm9vdFBhdGggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIGFyY2hpdmUKKwkgKiAgICAgICAgICAgICAgKGVtcHR5IHNwZWNpZmllcyB0aGUgZGVmYXVsdCByb290IGFuZCA8Y29kZT5udWxsPC9jb2RlPiBzcGVjaWZpZXMKIAkgKiAgICAgICAgICAgICAgIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgdGhlIHJvb3QgcGF0aCkKIAkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzLiBSZWFzb25zIGluY2x1ZGU6CkBAIC0xMTQsNDEgKzExMyw0MSBAQAogCSAqIGFzIHNwZWNpZmllZCBieSA8Y29kZT5JUmVzb3VyY2UuY29weShJUGF0aCwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4KIAkgKiBidXQgZXhjbHVkaW5nIG5lc3RlZCBzb3VyY2UgZm9sZGVycy4KIAkgKiA8cD4KLQkgKiBJZiA8Y29kZT5OT19SRVNPVVJDRV9NT0RJRklDQVRJT048L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKLQkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiBvciBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBleHRlcm5hbCwgCi0JICogdGhpcyBvcGVyYXRpb24gZG9lc24ndCBjb3B5IHRoZSByZXNvdXJjZS4gPGNvZGU+dXBkYXRlUmVzb3VyY2VGbGFnczwvY29kZT4gCisJICogSWYgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4KKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiBvciBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBleHRlcm5hbCwKKwkgKiB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IGNvcHkgdGhlIHJlc291cmNlLiA8Y29kZT51cGRhdGVSZXNvdXJjZUZsYWdzPC9jb2RlPgogCSAqIGlzIHRoZW4gaWdub3JlZC4KIAkgKiA8L3A+PHA+Ci0JICogSWYgPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKLQkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlcyB0aGUgY2xhc3NwYXRoIG9mIHRoZSAKLQkgKiBkZXN0aW5hdGlvbidzIHByb2plY3QgKGlmIGl0IGlzIGEgSmF2YSBwcm9qZWN0KS4gSWYgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gCi0JICogc2libGluZyBpcyBzcGVjaWZpZWQsIGEgY29weSBvZiB0aGlzIHJvb3QncyBjbGFzc3BhdGggZW50cnkgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSAKLQkgKiBzaWJsaW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgcmF3IGNsYXNzcGF0aC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgCisJICogSWYgPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbgorCSAqIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+LCB1cGRhdGVzIHRoZSBjbGFzc3BhdGggb2YgdGhlCisJICogZGVzdGluYXRpb24ncyBwcm9qZWN0IChpZiBpdCBpcyBhIEphdmEgcHJvamVjdCkuIElmIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+CisJICogc2libGluZyBpcyBzcGVjaWZpZWQsIGEgY29weSBvZiB0aGlzIHJvb3QncyBjbGFzc3BhdGggZW50cnkgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZQorCSAqIHNpYmxpbmcgb24gdGhlIGRlc3RpbmF0aW9uIHByb2plY3QncyByYXcgY2xhc3NwYXRoLiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcwogCSAqIHNwZWNpZmllZCwgdGhlIGNsYXNzcGF0aCBlbnRyeSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSByYXcgY2xhc3NwYXRoLgogCSAqIDwvcD48cD4KIAkgKiBJZiA8Y29kZT5SRVBMQUNFPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4gPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4sCiAJICogb3ZlcndyaXRlcyB0aGUgcmVzb3VyY2UgYXQgdGhlIGRlc3RpbmF0aW9uIHBhdGggaWYgYW55LgogCSAqIElmIHRoZSBzYW1lIGNsYXNzcGF0aCBlbnRyeSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzIHJhdwotCSAqIGNsYXNzcGF0aCwgdGhlbiB0aGUgc2libGluZyBpcyBpZ25vcmVkIGFuZCB0aGUgbmV3IGNsYXNzcGF0aCBlbnRyeSByZXBsYWNlcyB0aGUgCisJICogY2xhc3NwYXRoLCB0aGVuIHRoZSBzaWJsaW5nIGlzIGlnbm9yZWQgYW5kIHRoZSBuZXcgY2xhc3NwYXRoIGVudHJ5IHJlcGxhY2VzIHRoZQogCSAqIGV4aXN0aW5nIG9uZS4KIAkgKiA8L3A+PHA+Ci0JICogSWYgbm8gZmxhZ3MgaXMgc3BlY2lmaWVkIGluIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+ICh1c2luZyAKKwkgKiBJZiBubyBmbGFncyBpcyBzcGVjaWZpZWQgaW4gPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gKHVzaW5nCiAJICogPGNvZGU+SVJlc291cmNlLk5PTkU8L2NvZGU+KSwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYXBwbGllczogdGhlCiAJICogcmVzb3VyY2UgaXMgY29waWVkIChpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBub3QgZXh0ZXJuYWwpIGFuZCB0aGUKIAkgKiBjbGFzc3BhdGggaXMgbm90IHVwZGF0ZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiBwYXRoCiAJICogQHBhcmFtIHVwZGF0ZVJlc291cmNlRmxhZ3MgYml0LXdpc2Ugb3Igb2YgdXBkYXRlIHJlc291cmNlIGZsYWcgY29uc3RhbnRzCiAJICogICAoPGNvZGU+SVJlc291cmNlLkZPUkNFPC9jb2RlPiBhbmQgPGNvZGU+SVJlc291cmNlLlNIQUxMT1c8L2NvZGU+KQogCSAqIEBwYXJhbSB1cGRhdGVNb2RlbEZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cwotCSAqICAgKDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiBhbmQgCisJICogICAoPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGFuZAogCSAqICAgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPikKIAkgKiBAcGFyYW0gc2libGluZyB0aGUgY2xhc3NwYXRoIGVudHJ5IGJlZm9yZSB3aGljaCBhIGNvcHkgb2YgdGhlIGNsYXNzcGF0aAogCSAqIGVudHJ5IHNob3VsZCBiZSBpbnNlcnRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIGVudHJ5IHNob3VsZAogCSAqIGJlIGluc2VydGVkIGF0IHRoZSBlbmQKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiAKKwkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcm9vdCBjb3VsZCBub3QgYmUgY29waWVkLiBSZWFzb25zCiAJICogaW5jbHVkZToKIAkgKiA8dWw+CkBAIC0xNTcsNyArMTU2LDcgQEAKIAkgKiByZXNvdXJjZSBvciB1cGRhdGluZyBhIGNsYXNzcGF0aDwvbGk+CiAJICogPGxpPgogCSAqIFRoZSBkZXN0aW5hdGlvbiBpcyBub3QgaW5zaWRlIGFuIGV4aXN0aW5nIHByb2plY3QgYW5kIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+Ci0JICogaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiAKKwkgKiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+CiAJICogKElOVkFMSURfREVTVElOQVRJT04pPC9saT4KIAkgKiA8bGk+IFRoZSBzaWJsaW5nIGlzIG5vdCBhIGNsYXNzcGF0aCBlbnRyeSBvbiB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzCiAJICogcmF3IGNsYXNzcGF0aCAoSU5WQUxJRF9TSUJMSU5HKTwvbGk+CkBAIC0xNzAsOCArMTY5LDggQEAKIAkgKi8KIAl2b2lkIGNvcHkoSVBhdGggZGVzdGluYXRpb24sIGludCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBpbnQgdXBkYXRlTW9kZWxGbGFncywgSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcGFja2FnZSBmcmFnbWVudCBpbiB0aGlzIHJvb3Qgd2l0aCB0aGUgCi0JICogZ2l2ZW4gZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUuICBBbiBlbXB0eSBzdHJpbmcgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHBhY2thZ2UuIAorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBwYWNrYWdlIGZyYWdtZW50IGluIHRoaXMgcm9vdCB3aXRoIHRoZQorCSAqIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lLiAgQW4gZW1wdHkgc3RyaW5nIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBwYWNrYWdlLgogCSAqIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhbGwgcGFja2FnZQogCSAqIGZyYWdtZW50cyB0aGF0IGFyZSBhIHByZWZpeCBvZiB0aGUgbmV3IHBhY2thZ2UgZnJhZ21lbnQgd2hpY2gKIAkgKiBkbyBub3QgZXhpc3QgeWV0LiBJZiB0aGUgcGFja2FnZSBmcmFnbWVudCBhbHJlYWR5IGV4aXN0cywgdGhpcwpAQCAtMjAzLDM5ICsyMDIsMzkgQEAKIAkgKiA8Y29kZT5JUmVzb3VyY2UuZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+IGJ1dCBleGNsdWRpbmcgbmVzdGVkCiAJICogc291cmNlIGZvbGRlcnMuCiAJICogPHA+Ci0JICogSWYgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4gCi0JICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gb3IgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwsIAotCSAqIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3QgZGVsZXRlIHRoZSByZXNvdXJjZS4gPGNvZGU+dXBkYXRlUmVzb3VyY2VGbGFnczwvY29kZT4gCisJICogSWYgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4KKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiBvciBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBleHRlcm5hbCwKKwkgKiB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IGRlbGV0ZSB0aGUgcmVzb3VyY2UuIDxjb2RlPnVwZGF0ZVJlc291cmNlRmxhZ3M8L2NvZGU+CiAJICogaXMgdGhlbiBpZ25vcmVkLgogCSAqIDwvcD48cD4KLQkgKiBJZiA8Y29kZT5PUklHSU5BVElOR19QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4gaXMgc3BlY2lmaWVkIGluIAotCSAqIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+LCB1cGRhdGUgdGhlIHJhdyBjbGFzc3BhdGggb2YgdGhpcyBwYWNrYWdlIAorCSAqIElmIDxjb2RlPk9SSUdJTkFUSU5HX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4KKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRoIG9mIHRoaXMgcGFja2FnZQogCSAqIGZyYWdtZW50IHJvb3QncyBwcm9qZWN0IGJ5IHJlbW92aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzcGF0aCBlbnRyeS4KIAkgKiA8L3A+PHA+Ci0JICogSWYgPGNvZGU+T1RIRVJfUkVGRVJSSU5HX1BST0pFQ1RTX0NMQVNTUEFUSDwvY29kZT4gaXMgc3BlY2lmaWVkIGluIAorCSAqIElmIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbgogCSAqIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+LCB1cGRhdGUgdGhlIHJhdyBjbGFzc3BhdGhzIG9mIGFsbCBvdGhlciBKYXZhCi0JICogcHJvamVjdHMgcmVmZXJyaW5nIHRvIHRoaXMgcm9vdCdzIHJlc291cmNlIGJ5IHJlbW92aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzcGF0aCAKKwkgKiBwcm9qZWN0cyByZWZlcnJpbmcgdG8gdGhpcyByb290J3MgcmVzb3VyY2UgYnkgcmVtb3ZpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoCiAJICogZW50cmllcy4KIAkgKiA8L3A+PHA+Ci0JICogSWYgbm8gZmxhZ3MgaXMgc3BlY2lmaWVkIGluIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+ICh1c2luZyAKKwkgKiBJZiBubyBmbGFncyBpcyBzcGVjaWZpZWQgaW4gPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gKHVzaW5nCiAJICogPGNvZGU+SVJlc291cmNlLk5PTkU8L2NvZGU+KSwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYXBwbGllczogdGhlCiAJICogcmVzb3VyY2UgaXMgZGVsZXRlZCAoaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgbm90IGV4dGVybmFsKSBhbmQgbm8KIAkgKiBjbGFzc3BhdGhzIGFyZSB1cGRhdGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB1cGRhdGVSZXNvdXJjZUZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cwogCSAqICAgKDxjb2RlPklSZXNvdXJjZS5GT1JDRTwvY29kZT4gYW5kIDxjb2RlPklSZXNvdXJjZS5LRUVQX0hJU1RPUlk8L2NvZGU+KQogCSAqIEBwYXJhbSB1cGRhdGVNb2RlbEZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cwogCSAqICAgKDxjb2RlPk9SSUdJTkFUSU5HX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiwKLQkgKiAgIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGFuZCAKKwkgKiAgIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGFuZAogCSAqICAgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPikKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiAKKwkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcm9vdCBjb3VsZCBub3QgYmUgZGVsZXRlZC4gUmVhc29ucwogCSAqIGluY2x1ZGU6CiAJICogPHVsPgogCSAqIDxsaT4gVGhpcyByb290IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+Ci0JICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIGRlbGV0aW5nIHRoZSByZXNvdXJjZSAKKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgZGVsZXRpbmcgdGhlIHJlc291cmNlCiAJICogb3IgdXBkYXRpbmcgYSBjbGFzc3BhdGgKIAkgKiA8L2xpPgogCSAqIDwvdWw+CkBAIC0yNDUsNyArMjQ0LDcgQEAKIAl2b2lkIGRlbGV0ZShpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywgaW50IHVwZGF0ZU1vZGVsRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKIAkgKiBSZXR1cm5zIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3Mga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIuCi0JICogQSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY2FuIGNvbnRhaW4gc291cmNlIGZpbGVzIChpLmUuIGZpbGVzIHdpdGggb25lIAorCSAqIEEgcGFja2FnZSBmcmFnbWVudCByb290IGNhbiBjb250YWluIHNvdXJjZSBmaWxlcyAoaS5lLiBmaWxlcyB3aXRoIG9uZQogCSAqIG9mIHRoZSB7QGxpbmsgSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgSmF2YS1saWtlIGV4dGVuc2lvbnN9LAogCSAqIG9yIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMsIGJ1dCBub3QgYm90aC4KIAkgKiBJZiB0aGUgdW5kZXJseWluZyBmb2xkZXIgb3IgYXJjaGl2ZSBjb250YWlucyBvdGhlciBraW5kcyBvZiBmaWxlcywgdGhleSBhcmUgaWdub3JlZC4KQEAgLTI1OSw3ICsyNTgsNyBAQAogCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjS19CSU5BUlkKIAkgKi8KIAlpbnQgZ2V0S2luZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCiAJICogPHA+CkBAIC0yNzMsMTMgKzI3MiwxMyBAQAogCSAqIDwvcD48cD4KIAkgKiBTaW5jZSAzLjMsIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIGFuIGFyY2hpdmUsIHRoZSBub24tSmF2YSByZXNvdXJjZXMKIAkgKiBhcmUgYSB0cmVlIG9mIHtAbGluayBJSmFyRW50cnlSZXNvdXJjZX1zLiBPbmUgY2FuIG5hdmlnYXRlIHRoaXMgdHJlZSB1c2luZwotCSAqIHRoZSB7QGxpbmsgSUphckVudHJ5UmVzb3VyY2UjZ2V0Q2hpbGRyZW4oKX0gYW5kIAorCSAqIHRoZSB7QGxpbmsgSUphckVudHJ5UmVzb3VyY2UjZ2V0Q2hpbGRyZW4oKX0gYW5kCiAJICoge0BsaW5rIElKYXJFbnRyeVJlc291cmNlI2dldFBhcmVudCgpfSBtZXRob2RzLgogCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyAoPGNvZGU+SUZpbGU8L2NvZGU+cywgCisJICoKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyAoPGNvZGU+SUZpbGU8L2NvZGU+cywKIAkgKiAgICAgICAgICAgICAgPGNvZGU+SUZvbGRlcjwvY29kZT5zLCBvciA8Y29kZT5JU3RvcmFnZTwvY29kZT5zIGlmIHRoZQotCSAqICAgICAgICAgICAgICBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgaW4gYXJjaGl2ZSkgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZSAKKwkgKiAgICAgICAgICAgICAgcGFja2FnZSBmcmFnbWVudCByb290IGlzIGluIGFyY2hpdmUpIGNvbnRhaW5lZCBpbiB0aGlzIHBhY2thZ2UKIAkgKiAgICAgICAgICAgICAgZnJhZ21lbnQgcm9vdAogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KQEAgLTI4NywyNSArMjg2LDI1IEBACiAJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkjZ2V0RXhjbHVzaW9uUGF0dGVybnMoKQogCSAqLwogCU9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCiAJICogQW4gZW1wdHkgc3RyaW5nIGluZGljYXRlcyB0aGUgZGVmYXVsdCBwYWNrYWdlLgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBvcGVyYXRpb24uICBUaGUgcGFja2FnZSBmcmFnbWVudAogCSAqIG1heSBvciBtYXkgbm90IGV4aXN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKIAkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIHBhY2thZ2UgbmFtZQogCSAqLwogCUlQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0JCisKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGZpcnN0IHJhdyBjbGFzc3BhdGggZW50cnkgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHBhY2thZ2UKIAkgKiBmcmFnbWVudCByb290LgogCSAqIEEgcmF3IGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kcyB0byBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpZiBvbmNlIHJlc29sdmVkCi0JICogdGhpcyBlbnRyeSdzIHBhdGggaXMgZXF1YWwgdG8gdGhlIHJvb3QncyBwYXRoLiAKLQkgKiAKKwkgKiB0aGlzIGVudHJ5J3MgcGF0aCBpcyBlcXVhbCB0byB0aGUgcm9vdCdzIHBhdGguCisJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAJICogQHJldHVybiB0aGUgZmlyc3QgcmF3IGNsYXNzcGF0aCBlbnRyeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CkBAIC0zMTQsNDEgKzMxMyw1MyBAQAogCUlDbGFzc3BhdGhFbnRyeSBnZXRSYXdDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAJCiAJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisJICogQSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgaXMgc2FpZCB0byBjb3JyZXNwb25kIHRvIGEgcm9vdCBpZiB0aGUgcGF0aCBvZiB0aGUgcmVzb2x2ZWQKKwkgKiBlbnRyeSBpcyBlcXVhbCB0byB0aGUgcm9vdCdzIHBhdGguCisJICogCisJICogQHJldHVybiB0aGUgZmlyc3QgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuIAorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSBhdHRhY2hlZCB0bwogCSAqIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3MgYmluYXJ5IGFyY2hpdmUuCiAJICoKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCAKKwkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLAogCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBiaW5hcnkgYXJjaGl2ZQogCSAqICAgaGFzIG5vIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIG9yIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CiAJICogICBpcyBub3QgYSBiaW5hcnkgYXJjaGl2ZQogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzCiAJICovCiAJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBzb3VyY2UgYXJjaGl2ZS4gCisJICogUmV0dXJucyB0aGUgcGF0aCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBzb3VyY2UgYXJjaGl2ZS4KIAkgKiBBbiBlbXB0eSBwYXRoIGluZGljYXRlcyB0aGF0IHBhY2thZ2VzIGFyZSBsb2NhdGVkIGF0IHRoZSByb290IG9mIHRoZQogCSAqIHNvdXJjZSBhcmNoaXZlLgogCSAqCi0JICogQHJldHVybiB0aGUgcGF0aCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIAorCSAqIEByZXR1cm4gdGhlIHBhdGggd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLAogCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBiaW5hcnkgYXJjaGl2ZQogCSAqICAgaGFzIG5vIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIG9yIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CiAJICogICBpcyBub3QgYSBiaW5hcnkgYXJjaGl2ZQogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzCiAJICovCiAJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHVuZGVybHlpbmcKIAkgKiByZXNvdXJjZSBpcyBhIGJpbmFyeSBhcmNoaXZlIChhIEpBUiBvciB6aXAgZmlsZSkuCiAJICogPHA+CiAJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyB1bmRlcmx5aW5nIHJlc291cmNlIGlzIGEgYmluYXJ5IGFyY2hpdmUsIGZhbHNlIG90aGVyd2lzZQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIGV4dGVybmFsCiAJICogdG8gdGhlIHdvcmtiZW5jaCAodGhhdCBpcywgYSBsb2NhbCBmaWxlKSwgYW5kIGhhcyBubwpAQCAtMzU2LDY1ICszNjcsNjUgQEAKIAkgKiA8cD4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBleHRlcm5hbAogCSAqIHRvIHRoZSB3b3JrYmVuY2ggKHRoYXQgaXMsIGEgbG9jYWwgZmlsZSksIGFuZCBoYXMgbm8KIAkgKiB1bmRlcmx5aW5nIHJlc291cmNlLCBmYWxzZSBvdGhlcndpc2UKIAkgKi8KIAlib29sZWFuIGlzRXh0ZXJuYWwoKTsKLQkKKwogCS8qKgogCSAqIE1vdmVzIHRoZSByZXNvdXJjZSBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB0byB0aGUgZGVzdGluYXRpb24gcGF0aAogCSAqIGFzIHNwZWNpZmllZCBieSA8Y29kZT5JUmVzb3VyY2UubW92ZShJUGF0aCxpbnQsSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+CiAJICogYnV0IGV4Y2x1ZGluZyBuZXN0ZWQgc291cmNlIGZvbGRlcnMuCiAJICogPHA+Ci0JICogSWYgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4gCi0JICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gb3IgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwsIAotCSAqIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3QgbW92ZSB0aGUgcmVzb3VyY2UuIDxjb2RlPnVwZGF0ZVJlc291cmNlRmxhZ3M8L2NvZGU+IAorCSAqIElmIDxjb2RlPk5PX1JFU09VUkNFX01PRElGSUNBVElPTjwvY29kZT4gaXMgc3BlY2lmaWVkIGluCisJICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gb3IgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwsCisJICogdGhpcyBvcGVyYXRpb24gZG9lc24ndCBtb3ZlIHRoZSByZXNvdXJjZS4gPGNvZGU+dXBkYXRlUmVzb3VyY2VGbGFnczwvY29kZT4KIAkgKiBpcyB0aGVuIGlnbm9yZWQuCiAJICogPC9wPjxwPgotCSAqIElmIDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4gCi0JICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4sIHVwZGF0ZXMgdGhlIGNsYXNzcGF0aCBvZiB0aGUgCi0JICogZGVzdGluYXRpb24ncyBwcm9qZWN0IChpZiBpdCBpcyBhIEphdmEgcHJvamVjdCkuIElmIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IAotCSAqIHNpYmxpbmcgaXMgc3BlY2lmaWVkLCBhIGNvcHkgb2YgdGhpcyByb290J3MgY2xhc3NwYXRoIGVudHJ5IGlzIGluc2VydGVkIGJlZm9yZSB0aGUgCi0JICogc2libGluZyBvbiB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzIHJhdyBjbGFzc3BhdGguIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIAorCSAqIElmIDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4KKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlcyB0aGUgY2xhc3NwYXRoIG9mIHRoZQorCSAqIGRlc3RpbmF0aW9uJ3MgcHJvamVjdCAoaWYgaXQgaXMgYSBKYXZhIHByb2plY3QpLiBJZiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPgorCSAqIHNpYmxpbmcgaXMgc3BlY2lmaWVkLCBhIGNvcHkgb2YgdGhpcyByb290J3MgY2xhc3NwYXRoIGVudHJ5IGlzIGluc2VydGVkIGJlZm9yZSB0aGUKKwkgKiBzaWJsaW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgcmF3IGNsYXNzcGF0aC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMKIAkgKiBzcGVjaWZpZWQsIHRoZSBjbGFzc3BhdGggZW50cnkgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmF3IGNsYXNzcGF0aC4KIAkgKiA8L3A+PHA+Ci0JICogSWYgPGNvZGU+T1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKLQkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRoIG9mIHRoaXMgcGFja2FnZSAKKwkgKiBJZiA8Y29kZT5PUklHSU5BVElOR19QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4gaXMgc3BlY2lmaWVkIGluCisJICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4sIHVwZGF0ZSB0aGUgcmF3IGNsYXNzcGF0aCBvZiB0aGlzIHBhY2thZ2UKIAkgKiBmcmFnbWVudCByb290J3MgcHJvamVjdCBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggZW50cnkuCiAJICogPC9wPjxwPgotCSAqIElmIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiBJZiA8Y29kZT5PVEhFUl9SRUZFUlJJTkdfUFJPSkVDVFNfQ0xBU1NQQVRIPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4KIAkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRocyBvZiBhbGwgb3RoZXIgSmF2YQotCSAqIHByb2plY3RzIHJlZmVycmluZyB0byB0aGlzIHJvb3QncyByZXNvdXJjZSBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggCisJICogcHJvamVjdHMgcmVmZXJyaW5nIHRvIHRoaXMgcm9vdCdzIHJlc291cmNlIGJ5IHJlbW92aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzcGF0aAogCSAqIGVudHJpZXMuCiAJICogPC9wPjxwPgogCSAqIElmIDxjb2RlPlJFUExBQ0U8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwKIAkgKiBvdmVyd3JpdGVzIHRoZSByZXNvdXJjZSBhdCB0aGUgZGVzdGluYXRpb24gcGF0aCBpZiBhbnkuCiAJICogSWYgdGhlIHNhbWUgY2xhc3NwYXRoIGVudHJ5IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgcmF3Ci0JICogY2xhc3NwYXRoLCB0aGVuIHRoZSBzaWJsaW5nIGlzIGlnbm9yZWQgYW5kIHRoZSBuZXcgY2xhc3NwYXRoIGVudHJ5IHJlcGxhY2VzIHRoZSAKKwkgKiBjbGFzc3BhdGgsIHRoZW4gdGhlIHNpYmxpbmcgaXMgaWdub3JlZCBhbmQgdGhlIG5ldyBjbGFzc3BhdGggZW50cnkgcmVwbGFjZXMgdGhlCiAJICogZXhpc3Rpbmcgb25lLgogCSAqIDwvcD48cD4KLQkgKiBJZiBubyBmbGFncyBpcyBzcGVjaWZpZWQgaW4gPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gKHVzaW5nIAorCSAqIElmIG5vIGZsYWdzIGlzIHNwZWNpZmllZCBpbiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiAodXNpbmcKIAkgKiA8Y29kZT5JUmVzb3VyY2UuTk9ORTwvY29kZT4pLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBhcHBsaWVzOiB0aGUKIAkgKiByZXNvdXJjZSBpcyBtb3ZlZCAoaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgbm90IGV4dGVybmFsKSBhbmQgbm8KIAkgKiBjbGFzc3BhdGhzIGFyZSB1cGRhdGVkLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gcGF0aAogCSAqIEBwYXJhbSB1cGRhdGVSZXNvdXJjZUZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSBmbGFnIGNvbnN0YW50cwotCSAqICg8Y29kZT5JUmVzb3VyY2UuRk9SQ0U8L2NvZGU+LCA8Y29kZT5JUmVzb3VyY2UuS0VFUF9ISVNUT1JZPC9jb2RlPiAKKwkgKiAoPGNvZGU+SVJlc291cmNlLkZPUkNFPC9jb2RlPiwgPGNvZGU+SVJlc291cmNlLktFRVBfSElTVE9SWTwvY29kZT4KIAkgKiBhbmQgPGNvZGU+SVJlc291cmNlLlNIQUxMT1c8L2NvZGU+KQogCSAqIEBwYXJhbSB1cGRhdGVNb2RlbEZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cwogCSAqICAgKDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiwKIAkgKiAgIDxjb2RlPk9SSUdJTkFUSU5HX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiwKLQkgKiAgIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGFuZCAKKwkgKiAgIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGFuZAogCSAqICAgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPikKIAkgKiBAcGFyYW0gc2libGluZyB0aGUgY2xhc3NwYXRoIGVudHJ5IGJlZm9yZSB3aGljaCBhIGNvcHkgb2YgdGhlIGNsYXNzcGF0aAogCSAqIGVudHJ5IHNob3VsZCBiZSBpbnNlcnRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIGVudHJ5IHNob3VsZAogCSAqIGJlIGluc2VydGVkIGF0IHRoZSBlbmQKIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiAKKwkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgcm9vdCBjb3VsZCBub3QgYmUgbW92ZWQuIFJlYXNvbnMKIAkgKiBpbmNsdWRlOgogCSAqIDx1bD4KQEAgLTQyMyw3ICs0MzQsNyBAQAogCSAqIHJlc291cmNlIG9yIHVwZGF0aW5nIGEgY2xhc3NwYXRoPC9saT4KIAkgKiA8bGk+CiAJICogVGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBpbnNpZGUgYW4gZXhpc3RpbmcgcHJvamVjdCBhbmQgPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4KLQkgKiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IAorCSAqIGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4KIAkgKiAoSU5WQUxJRF9ERVNUSU5BVElPTik8L2xpPgogCSAqIDxsaT4gVGhlIHNpYmxpbmcgaXMgbm90IGEgY2xhc3NwYXRoIGVudHJ5IG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MKIAkgKiByYXcgY2xhc3NwYXRoIChJTlZBTElEX1NJQkxJTkcpPC9saT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYXJlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYXJlbnQuamF2YQppbmRleCA4Zjg1NTc1Li5iNDgzZDY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFyZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhcmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDkgKzEyLDggQEAKIAogLyoqCiAgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBjb250YWluIG90aGVyIEphdmEgZWxlbWVudHMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJUGFyZW50IHsKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEKaW5kZXggNzc4MWZkYy4uZTE0YmZhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUHJvYmxlbVJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDE3ICsxNSwxNyBAQAogLyoqCiAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGphdmEgcHJvYmxlbSBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkCiAgKiBieSBzb21lIEphdmEgb3BlcmF0aW9uLgotICogCisgKgogICogQHNlZSBJUHJvYmxlbQogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtUmVxdWVzdG9yIHsKLQkKKwogCS8qKgogCSAqIE5vdGlmaWNhdGlvbiBvZiBhIEphdmEgcHJvYmxlbS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9ibGVtIElQcm9ibGVtIC0gVGhlIGRpc2NvdmVyZWQgSmF2YSBwcm9ibGVtLgotCSAqLwkKKwkgKi8KIAl2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSk7CiAKIAkvKioKQEAgLTQ1LDkgKzQ1LDkgQEAKIAkgKiBQcmVkaWNhdGUgYWxsb3dpbmcgdGhlIHByb2JsZW0gcmVxdWVzdG9yIHRvIHNpZ25hbCB3aGV0aGVyIG9yIG5vdCBpdCBpcyBjdXJyZW50bHkKIAkgKiBpbnRlcmVzdGVkIGJ5IHByb2JsZW0gcmVwb3J0cy4gV2hlbiBhbnN3ZXJpbmcgPGNvZGU+ZmFsc2U8L2NvZGU+LCBwcm9ibGVtIHdpbGwKIAkgKiBub3QgYmUgZGlzY292ZXJlZCBhbnkgbW9yZSB1bnRpbCB0aGUgbmV4dCBpdGVyYXRpb24uCi0JICogCisJICoKIAkgKiBUaGlzICBwcmVkaWNhdGUgd2lsbCBiZSBpbnZva2VkIG9uY2UgcHJpb3IgdG8gZWFjaCBwcm9ibGVtIGRldGVjdGlvbiBpdGVyYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGJvb2xlYW4gLSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdG9yIGlzIGN1cnJlbnRseSBpbnRlcmVzdGVkIGJ5IHByb2JsZW1zLgogCSAqLwogCWJvb2xlYW4gaXNBY3RpdmUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YQppbmRleCA2NDc0MTc3Li4yNjg1MDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUmVnaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVJlZ2lvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDE1ICsxOCwxNSBAQAogICogcHJvamVjdHMuCiAgKiA8cD4KICAqIFdoZW4gYW4gZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhIHJlZ2lvbiwgYWxsIG9mIGl0cyBjaGlsZHJlbgotICogYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5jbHVkZWQuIENoaWxkcmVuIG9mIGFuIGluY2x1ZGVkIGVsZW1lbnQgCisgKiBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmNsdWRlZC4gQ2hpbGRyZW4gb2YgYW4gaW5jbHVkZWQgZWxlbWVudAogICogPGI+Y2Fubm90PC9iPiBiZSBzZWxlY3RpdmVseSBleGNsdWRlZC4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKiBJbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQgdmlhIHRoZSA8Y29kZT5KYXZhQ29yZS5uZXdSZWdpb248L2NvZGU+LgogICogPC9wPgogICoKICAqIEBzZWUgSmF2YUNvcmUjbmV3UmVnaW9uKCkKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJUmVnaW9uIHsKIAkvKioKQEAgLTM1LDEzICszNSwxMyBAQAogCSAqIGFuY2VzdG9ycyBpcyBhbHJlYWR5IGluY2x1ZGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuIElmIHRoZSBlbGVtZW50CiAJICogYmVpbmcgYWRkZWQgaXMgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGlzCiAJICogcmVnaW9uLCB0aGUgYW5jZXN0b3Igc3Vic3VtZXMgdGhlIGRlc2NlbmRlbnQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZ2l2ZW4gZWxlbWVudAogCSAqLwogCXZvaWQgYWRkKElKYXZhRWxlbWVudCBlbGVtZW50KTsKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIHRoaXMgcmVnaW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIHRoaXMgcmVnaW9uLCBmYWxzZSBvdGhlcndpc2UKIAkgKi8KQEAgLTQ5LDcgKzQ5LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0b3AgbGV2ZWwgZWxlbWVudHMgaW4gdGhpcyByZWdpb24uCiAJICogQWxsIGRlc2NlbmRlbnRzIG9mIHRoZXNlIGVsZW1lbnRzIGFyZSBhbHNvIGluY2x1ZGVkIGluIHRoaXMgcmVnaW9uLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdG9wIGxldmVsIGVsZW1lbnRzIGluIHRoaXMgcmVnaW9uCiAJICovCiAJSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKTsKQEAgLTU5LDcgKzU5LDcgQEAKIAkgKiBmYWlscy4gSWYgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgaW5jbHVkZWQsIHRoZQogCSAqIHJlbW92ZSBmYWlscyAoaW4gb3RoZXIgd29yZHMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBzZWxlY3RpdmVseQogCSAqIGV4Y2x1ZGUgZGVzY2VuZGFudHMgb2YgaW5jbHVkZWQgYW5jZXN0b3JzKS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBnaXZlbiBlbGVtZW50CiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHJlbW92ZSBmYWlscwogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZU1hbmlwdWxhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZU1hbmlwdWxhdGlvbi5qYXZhCmluZGV4IDc1OGU4MTguLmM5MTVjN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VNYW5pcHVsYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlTWFuaXB1bGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsOSArMTUsOCBAQAogLyoqCiAgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHNvdXJjZSBjb2RlIG1hbmlwdWxhdGlvbnMgc3VjaAogICogYXMgY29weSwgbW92ZSwgcmVuYW1lLCBhbmQgZGVsZXRlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZU1hbmlwdWxhdGlvbiB7CiAvKioKQEAgLTQyLDEwICs0MSwxMSBAQAogICogPGxpPiBUaGUgbmV3IG5hbWUgaXMgaW52YWxpZCAoSU5WQUxJRF9OQU1FKQogICogPGxpPiBBIGNoaWxkIGluIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIChOQU1FX0NPTExJU0lPTikKICAqCQlhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPgotICogPGxpPiBUaGUgY29udGFpbmVyIG9yIHRoaXMgZWxlbWVudCBpcyByZWFkLW9ubHkgKFJFQURfT05MWSkgCisgKiA8bGk+IFRoZSBjb250YWluZXIgb3IgdGhpcyBlbGVtZW50IGlzIHJlYWQtb25seSAoUkVBRF9PTkxZKQogICogPC91bD4KICAqCiAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBjb250YWluZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cyNJTlZBTElEX0RFU1RJTkFUSU9OCiAgKi8KIHZvaWQgY29weShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiByZXBsYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAvKioKQEAgLTg1LDEwICs4NSwxMSBAQAogICogPGxpPiBUaGUgbmV3IG5hbWUgaXMgaW52YWxpZCAoSU5WQUxJRF9OQU1FKQogICogPGxpPiBBIGNoaWxkIGluIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIChOQU1FX0NPTExJU0lPTikKICAqCQlhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPgotICogPGxpPiBUaGUgY29udGFpbmVyIG9yIHRoaXMgZWxlbWVudCBpcyByZWFkLW9ubHkgKFJFQURfT05MWSkgCisgKiA8bGk+IFRoZSBjb250YWluZXIgb3IgdGhpcyBlbGVtZW50IGlzIHJlYWQtb25seSAoUkVBRF9PTkxZKQogICogPC91bD4KICAqCiAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBjb250YWluZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cyNJTlZBTElEX0RFU1RJTkFUSU9OCiAgKi8KIHZvaWQgbW92ZShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiByZXBsYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAvKioKQEAgLTEwNiw3ICsxMDcsNyBAQAogICogPGxpPiBUaGUgbmV3IG5hbWUgaXMgaW52YWxpZCAoSU5WQUxJRF9OQU1FKQogICogPGxpPiBBIGNoaWxkIGluIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIChOQU1FX0NPTExJU0lPTikKICAqCQlhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPgotICogPGxpPiBUaGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5IChSRUFEX09OTFkpIAorICogPGxpPiBUaGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5IChSRUFEX09OTFkpCiAgKiA8L3VsPgogICovCiB2b2lkIHJlbmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXBsYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmFuZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSYW5nZS5qYXZhCmluZGV4IGEzYmM5YTEuLjhiYzllMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSYW5nZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSYW5nZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDI2ICsxMywzNCBAQAogLyoqCiAgKiBBIHNvdXJjZSByYW5nZSBkZWZpbmVzIGFuIGVsZW1lbnQncyBzb3VyY2UgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8KICAqIGl0cyBzb3VyY2UgYnVmZmVyLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCisgKiA8cD5DbGllbnRzIG1heSB1c2UgdGhlIG1ldGhvZCB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuU291cmNlUmFuZ2UjaXNBdmFpbGFibGUoSVNvdXJjZVJhbmdlKX0KKyAqIGluIG9yZGVyIHRvIGZpbmQgb3V0IGlmIGEgc291cmNlIHJhbmdlIGlzIGF2YWlsYWJsZS4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIHdoZW4gdGhlIHNvdXJjZSByYW5nZSBvZmZzZXQgaXMgZXF1YWxzIHRvIDxjb2RlPi0xPC9jb2RlPi48L3A+CisgKiAKKyAqIDxwPkNsaWVudHMgbWF5IHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB7QGxpbmsgU291cmNlUmFuZ2V9LjwvcD4KKyAqCisgKiBAc2VlIFNvdXJjZVJhbmdlCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZVJhbmdlIHsKIAogLyoqCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgZWxlbWVudCwKICAqIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgZWxlbWVudCwKICAqIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQKICAqLwogaW50IGdldExlbmd0aCgpOwogLyoqCiAgKiBSZXR1cm5zIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIGVsZW1lbnQsCi0gKiByZWxhdGl2ZSB0byB0aGUgc291cmNlIGJ1ZmZlciBpbiB3aGljaCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkLgotICogCisgKiByZWxhdGl2ZSB0byB0aGUgc291cmNlIGJ1ZmZlciBpbiB3aGljaCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkLiBIb3dldmVyLCBpZiB0aGUgZWxlbWVudAorICogaGFzIG5vIGFzc29jaWF0ZWQgc291cmNlIGNvZGUsIGFuIGltcGxlbWVudGF0aW9uIG1heSByZXR1cm4gLTEuIAorICoKICAqIEByZXR1cm4gdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgZWxlbWVudCwKLSAqIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQKKyAqIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQuIEhvd2V2ZXIsIGlmIHRoZSBlbGVtZW50CisgKiBoYXMgbm8gYXNzb2NpYXRlZCBzb3VyY2UgY29kZSwgYW4gaW1wbGVtZW50YXRpb24gbWF5IHJldHVybiAtMS4gCiAgKi8KIGludCBnZXRPZmZzZXQoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YQppbmRleCBmMDA1MzI3Li5mOWYwNDVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiwxMSBAQAogCiAvKioKICAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBzb3VyY2UgY29kZS4KLSAqIFRoaXMgc2V0IGNvbnNpc3RzIG9mIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+LCA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiwKLSAqIDxjb2RlPklQYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+LCA8Y29kZT5JSW1wb3J0RGVjbGFyYXRpb248L2NvZGU+LAotICogPGNvZGU+SUltcG9ydENvbnRhaW5lcjwvY29kZT4sIDxjb2RlPklUeXBlPC9jb2RlPiwgPGNvZGU+SUZpZWxkPC9jb2RlPiwKLSAqIDxjb2RlPklNZXRob2Q8L2NvZGU+LCBhbmQgPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPi4KKyAqIFRoaXMgc2V0IGNvbnNpc3RzIG9mIHtAbGluayBJQ2xhc3NGaWxlfSwge0BsaW5rIElDb21waWxhdGlvblVuaXR9LAorICoge0BsaW5rIElQYWNrYWdlRGVjbGFyYXRpb259LCB7QGxpbmsgSUltcG9ydERlY2xhcmF0aW9ufSwKKyAqIHtAbGluayBJSW1wb3J0Q29udGFpbmVyfSwge0BsaW5rIElUeXBlfSwge0BsaW5rIElGaWVsZH0sCisgKiB7QGxpbmsgSU1ldGhvZH0sIHtAbGluayBJSW5pdGlhbGl6ZXJ9LCB7QGxpbmsgSVR5cGVQYXJhbWV0ZXJ9LAorICoge0BsaW5rIElMb2NhbFZhcmlhYmxlfSwgYW5kIHtAbGluayBJQW5ub3RhdGlvbn0uCiAgKiA8cD4KICAqIE5vdGU6IEZvciA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiwgPGNvZGU+SVR5cGU8L2NvZGU+IGFuZCBvdGhlciBtZW1iZXJzCiAgKiBkZXJpdmVkIGZyb20gYSBiaW5hcnkgdHlwZSwgdGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgc291cmNlIGlmZiB0aGUKQEAgLTI1LDExICsyNiw5IEBACiAgKiBTb3VyY2UgcmVmZXJlbmNlIGVsZW1lbnRzIG1heSBiZSB3b3JraW5nIGNvcGllcyBpZiB0aGV5IHdlcmUgY3JlYXRlZCBmcm9tCiAgKiBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBhIHdvcmtpbmcgY29weS4KICAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CiAgKgogICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNhdHRhY2hTb3VyY2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VSZWZlcmVuY2UgewogLyoqCkBAIC0zOSwxOCArMzgsMTggQEAKICAqIEBzaW5jZSAyLjAKICAqLwogYm9vbGVhbiBleGlzdHMoKTsKLQkKKwogLyoqCiAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50LgogICogVGhpcyBleHRyYWN0cyB0aGUgc3Vic3RyaW5nIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgY29udGFpbmluZyB0aGlzIHNvdXJjZQogICogZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIHJhbmdlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKICAqIDxjb2RlPmdldFNvdXJjZVJhbmdlPC9jb2RlPi4KICAqIDxwPgotICogRm9yIGNsYXNzIGZpbGVzLCB0aGlzIHJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQgCisgKiBGb3IgY2xhc3MgZmlsZXMsIHRoaXMgcmV0dXJucyB0aGUgc291cmNlIG9mIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdAogICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLgogICogPC9wPgogICoKLSAqIEByZXR1cm4gdGhlIHNvdXJjZSBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIAorICogQHJldHVybiB0aGUgc291cmNlIGNvZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBoYXMgbm8KICAqICAgYXNzb2NpYXRlZCBzb3VyY2UgY29kZQogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKICAqLwpAQCAtNTgsMTMgKzU3LDU3IEBACiAvKioKICAqIFJldHVybnMgdGhlIHNvdXJjZSByYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50LgogICogPHA+Ci0gKiBGb3IgY2xhc3MgZmlsZXMsIHRoaXMgcmV0dXJucyB0aGUgcmFuZ2Ugb2YgdGhlIGVudGlyZSBjb21waWxhdGlvbiB1bml0IAorICogRm9yIGNsYXNzIGZpbGVzLCB0aGlzIHJldHVybnMgdGhlIHJhbmdlIG9mIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdAogICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcyBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLgogICogPC9wPgorICogPHA+CisgKiBJZiB0aGlzIGVsZW1lbnQgaGFzIG5vIGFzc29jaWF0ZWQgc291cmNlIGNvZGUsIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCwKKyAqIG9yIGEgc291cmNlIHJhbmdlIHdpdGggYSAtMSBvZmZzZXQgYW5kIGEgMCBsZW5ndGguIHtAbGluayBTb3VyY2VSYW5nZSNpc0F2YWlsYWJsZShJU291cmNlUmFuZ2UpfQorICogY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoYXQgY2FzZS4KKyAqIDwvcD4KICAqCi0gKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gCisgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2UsIG9yIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBvciBbLTEsIDBdIGlmIHRoaXMgZWxlbWVudCBoYXMgbm8KICAqICAgYXNzb2NpYXRlZCBzb3VyY2UgY29kZQogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqIEBzZWUgU291cmNlUmFuZ2UjaXNBdmFpbGFibGUoSVNvdXJjZVJhbmdlKQogICovCiBJU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIFJldHVybnMgdGhlIG5hbWUgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4KKyAqIAorICogPHA+SWYgdGhlIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElNZW1iZXJ9LCBpdCByZXR1cm5zCisgKiB0aGUgc291cmNlIHJhbmdlIG9mIHRoaXMgbWVtYmVyJ3Mgc2ltcGxlIG5hbWUsCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1lbWJlciBkb2VzIG5vdCBoYXZlIGEgbmFtZQorICogKGZvciBleGFtcGxlLCBhbiBpbml0aWFsaXplciksIG9yIGlmIHRoaXMgbWVtYmVyIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS48L3A+CisgKiAKKyAqIDxwPklmIHRoaXMgZWxlbWVudCBpcyBhbiB7QGxpbmsgSUltcG9ydERlY2xhcmF0aW9ufSwgdGhlIHNvdXJjZSByYW5nZQorICogb2YgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24ncyBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGltcG9ydAorICogZGVjbGFyYXRpb24gZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkuCisgKiA8YnI+VGhlIHNvdXJjZSByYW5nZSBmb3IgdGhlIG5hbWUgaW5jbHVkZXMgdGhlIHRyYWlsaW5nICcqJyBpZiB0aGUgY2FsbCB0bworICoge0BsaW5rIElJbXBvcnREZWNsYXJhdGlvbiNpc09uRGVtYW5kKCl9IHJldHVybnMgdHJ1ZS4KKyAqIDwvcD4KKyAqCisgKiA8cD5JZiB0aGlzIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRGVjbGFyYXRpb259LCB0aGUgc291cmNlIHJhbmdlIG9mCisgKiB0aGlzIHBhY2thZ2UgZGVjbGFyYXRpb24ncyBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHBhY2thZ2UgCisgKiBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS48L3A+CisgKgorICogPHA+SWYgdGhpcyBlbGVtZW50IGlzIGFuIHtAbGluayBJQW5ub3RhdGlvbn0sIHRoZSBzb3VyY2UgcmFuZ2Ugb2YKKyAqIHRoaXMgYW5ub3RhdGlvbidzIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgYW5ub3RhdGlvbiBkb2VzIG5vdCBoYXZlCisgKiBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgaW4gYSBiaW5hcnkgdHlwZSkuPC9wPgorICogCisgKiA8cD5JZiB0aGlzIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElUeXBlUGFyYW1ldGVyfSwgdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIAorICogdHlwZSBwYXJhbWV0ZXIncyBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBpbiBhIGJpbmFyeSB0eXBlKS48L3A+CisgKiAKKyAqIDxwPklmIHRoaXMgZWxlbWVudCBpcyBhbiB7QGxpbmsgSVR5cGVSb290fSBvciB7QGxpbmsgSUltcG9ydENvbnRhaW5lcn0sIGl0CisgKiByZXR1cm5zIG51bGwuPC9wPgorICoKKyAqIEByZXR1cm4gdGhlIG5hbWUgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAqIG5vdCBhdmFpbGFibGUKKyAqCisgKiBAc2luY2UgMy43CisgKi8KK0lTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlLmphdmEKaW5kZXggNDI4NmY4NS4uN2YxMjQzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDcgKzE3LDcgQEAKIAogLyoqCiAgKiBSZXByZXNlbnRzIGVpdGhlciBhIHNvdXJjZSB0eXBlIGluIGEgY29tcGlsYXRpb24gdW5pdCAoZWl0aGVyIGEgdG9wLWxldmVsCi0gKiB0eXBlLCBhIG1lbWJlciB0eXBlLCBhIGxvY2FsIHR5cGUgb3IgYW4gYW5vbnltb3VzIHR5cGUpIAorICogdHlwZSwgYSBtZW1iZXIgdHlwZSwgYSBsb2NhbCB0eXBlIG9yIGFuIGFub255bW91cyB0eXBlKQogICogb3IgYSBiaW5hcnkgdHlwZSBpbiBhIGNsYXNzIGZpbGUuIEVudW1lcmF0aW9uIGNsYXNzZXMgYW5kIGFubm90YXRpb24KICAqIHR5cGVzIGFyZSBzdWJraW5kcyBvZiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCByZXNwZWN0aXZlbHkuCiAgKiA8cD4KQEAgLTMyLDI5ICszMiwyOCBAQAogICogPGNvZGU+SU1ldGhvZDwvY29kZT4sIDxjb2RlPklJbml0aWFsaXplcjwvY29kZT4gYW5kIDxjb2RlPklUeXBlPC9jb2RlPi4KICAqIFRoZSBjaGlsZHJlbiBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIG9yIGNsYXNzIGZpbGUuCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGludGVyZmFjZSBJVHlwZSBleHRlbmRzIElNZW1iZXIgeworcHVibGljIGludGVyZmFjZSBJVHlwZSBleHRlbmRzIElNZW1iZXIsIElBbm5vdGF0YWJsZSB7CiAJLyoqCiAJICogRG8gY29kZSBjb21wbGV0aW9uIGluc2lkZSBhIGNvZGUgc25pcHBldCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB0eXBlLgotCSAqIAotCSAqIElmIHRoZSB0eXBlIGNhbiBhY2Nlc3MgdG8gaGlzIHNvdXJjZSBjb2RlIGFuZCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIHZhbGlkLAotCSAqIHRoZW4gY29tcGxldGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBzb3VyY2UuIE90aGVyd2lzZSB0aGUgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKLQkgKiBhZ2FpbnN0IHR5cGUgc3RydWN0dXJlIGFuZCBnaXZlbiBsb2NhbHMgdmFyaWFibGVzLgotCSAqIAorCSAqCisJICogSWYgdGhlIHR5cGUgaGFzIGFjY2VzcyB0byBpdHMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCisJICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSBzb3VyY2UuIE90aGVyd2lzZSB0aGUgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKKwkgKiBhZ2FpbnN0IHRoZSB0eXBlIHN0cnVjdHVyZSBhbmQgdGhlIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCisJICoKIAkgKiBAcGFyYW0gc25pcHBldCB0aGUgY29kZSBzbmlwcGV0CiAJICogQHBhcmFtIGluc2VydGlvbiB0aGUgcG9zaXRpb24gd2l0aCBpbiBzb3VyY2Ugd2hlcmUgdGhlIHNuaXBwZXQKIAkgKiBpcyBpbnNlcnRlZC4gVGhpcyBwb3NpdGlvbiBtdXN0IG5vdCBiZSBpbiBjb21tZW50cy4KIAkgKiBBIHBvc3NpYmxlIHZhbHVlIGlzIC0xLCBpZiB0aGUgcG9zaXRpb24gaXMgbm90IGtub3duLgotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gd2l0aGluIHNuaXBwZXQgd2hlcmUgdGhlIHVzZXIgCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aXRoaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlcgogCSAqIGlzIHBlcmZvcm1pbmcgY29kZSBhc3Npc3QuCi0JICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQKIAkgKiB0eXBlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCi0JICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIAorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBsb2NhbCB2YXJpYWJsZSBuYW1lcwogCSAqIHRoYXQgYXJlIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVNb2RpZmllcnMgYW4gYXJyYXkgKHBvc3NpYmxlIGVtcHR5KSBvZiBtb2RpZmllcnMgZm9yCiAJICogbG9jYWwgdmFyaWFibGVzCiAJICogQHBhcmFtIGlzU3RhdGljIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2NvcGUgaXMgaW4gYSBzdGF0aWMgY29udGV4dAogCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdG9yCkBAIC03NiwyOSArNzUsMjkgQEAKIAogCS8qKgogCSAqIERvIGNvZGUgY29tcGxldGlvbiBpbnNpZGUgYSBjb2RlIHNuaXBwZXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdHlwZS4KLQkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywgCisJICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsCiAJICogdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cwogCSAqIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IGlmIGEgd29ya2luZyBjb3B5IGlzIGVtcHR5LCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgogCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC4KIAkgKiA8L3A+PHA+Ci0JICogSWYgdGhlIHR5cGUgY2FuIGFjY2VzcyB0byBoaXMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCi0JICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAotCSAqIGFnYWluc3QgdHlwZSBzdHJ1Y3R1cmUgYW5kIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCisJICogSWYgdGhlIHR5cGUgaGFzIGFjY2VzcyB0byBpdHMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCisJICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSBzb3VyY2UuIE90aGVyd2lzZSB0aGUgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKKwkgKiBhZ2FpbnN0IHRoZSB0eXBlIHN0cnVjdHVyZSBhbmQgdGhlIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAogCSAqIEBwYXJhbSBpbnNlcnRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc291cmNlIHdoZXJlIHRoZSBzbmlwcGV0CiAJICogaXMgaW5zZXJ0ZWQuIFRoaXMgcG9zaXRpb24gbXVzdCBub3QgYmUgaW4gY29tbWVudHMuCiAJICogQSBwb3NzaWJsZSB2YWx1ZSBpcyAtMSwgaWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBrbm93bi4KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlciAKKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlcgogCSAqIGlzIHBlcmZvcm1pbmcgY29kZSBhc3Npc3QuCi0JICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQKIAkgKiB0eXBlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCi0JICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIAorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBsb2NhbCB2YXJpYWJsZSBuYW1lcwogCSAqIHRoYXQgYXJlIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVNb2RpZmllcnMgYW4gYXJyYXkgKHBvc3NpYmxlIGVtcHR5KSBvZiBtb2RpZmllcnMgZm9yCiAJICogbG9jYWwgdmFyaWFibGVzCiAJICogQHBhcmFtIGlzU3RhdGljIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2NvcGUgaXMgaW4gYSBzdGF0aWMgY29udGV4dAogCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdG9yCkBAIC0xMTksMjUgKzExOCwyNSBAQAogCQlJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCiAJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBEbyBjb2RlIGNvbXBsZXRpb24gaW5zaWRlIGEgY29kZSBzbmlwcGV0IGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHR5cGUuCi0JICogCi0JICogSWYgdGhlIHR5cGUgY2FuIGFjY2VzcyB0byBoaXMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCi0JICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAotCSAqIGFnYWluc3QgdHlwZSBzdHJ1Y3R1cmUgYW5kIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCi0JICogCisJICoKKwkgKiBJZiB0aGUgdHlwZSBoYXMgYWNjZXNzIHRvIGl0cyBzb3VyY2UgY29kZSBhbmQgdGhlIGluc2VydGlvbiBwb3NpdGlvbiBpcyB2YWxpZCwKKwkgKiB0aGVuIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlIHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAorCSAqIGFnYWluc3QgdGhlIHR5cGUgc3RydWN0dXJlIGFuZCB0aGUgZ2l2ZW4gbG9jYWxzIHZhcmlhYmxlcy4KKwkgKgogCSAqIEBwYXJhbSBzbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQKIAkgKiBAcGFyYW0gaW5zZXJ0aW9uIHRoZSBwb3NpdGlvbiB3aXRoIGluIHNvdXJjZSB3aGVyZSB0aGUgc25pcHBldAogCSAqIGlzIGluc2VydGVkLiBUaGlzIHBvc2l0aW9uIG11c3Qgbm90IGJlIGluIGNvbW1lbnRzLgogCSAqIEEgcG9zc2libGUgdmFsdWUgaXMgLTEsIGlmIHRoZSBwb3NpdGlvbiBpcyBub3Qga25vd24uCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aXRoaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlciAKKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGhpbiBzbmlwcGV0IHdoZXJlIHRoZSB1c2VyCiAJICogaXMgcGVyZm9ybWluZyBjb2RlIGFzc2lzdC4KLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZCAKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZAogCSAqIHR5cGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU5hbWVzIGFuIGFycmF5IChwb3NzaWJseSBlbXB0eSkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzCiAJICogdGhhdCBhcmUgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzY29wZQotCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzIGFuIGFycmF5IChwb3NzaWJsZSBlbXB0eSkgb2YgbW9kaWZpZXJzIGZvciAKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IKIAkgKiBsb2NhbCB2YXJpYWJsZXMKIAkgKiBAcGFyYW0gaXNTdGF0aWMgd2hldGhlciB0aGUgY3VycmVudCBzY29wZSBpcyBpbiBhIHN0YXRpYyBjb250ZXh0CiAJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29tcGxldGlvbiByZXF1ZXN0b3IKQEAgLTE1NSwzMiArMTU0LDkwIEBACiAJCWJvb2xlYW4gaXNTdGF0aWMsCiAJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIERvIGNvZGUgY29tcGxldGlvbiBpbnNpZGUgYSBjb2RlIHNuaXBwZXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdHlwZS4KKwkgKgorCSAqIElmIHRoZSB0eXBlIGhhcyBhY2Nlc3MgdG8gaXRzIHNvdXJjZSBjb2RlIGFuZCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIHZhbGlkLAorCSAqIHRoZW4gY29tcGxldGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgc291cmNlLiBPdGhlcndpc2UgdGhlIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkCisJICogYWdhaW5zdCB0aGUgdHlwZSBzdHJ1Y3R1cmUgYW5kIHRoZSBnaXZlbiBsb2NhbHMgdmFyaWFibGVzLgorCSAqIDxwPgorCSAqIElmIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBzb21lIHByb3Bvc2FscyB3aGljaAorCSAqIGNhbiBiZSB2ZXJ5IGxvbmcgdG8gY29tcHV0ZSBhcmUgcHJvcG9zZWQuIFRvIGF2b2lkIHRoYXQgdGhlIGNvZGUgYXNzaXN0IG9wZXJhdGlvbgorCSAqIHRha2UgdG9vIG11Y2ggdGltZSBhIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB3aGljaCBhdXRvbWF0aWNhbGx5IGNhbmNlbCB0aGUgY29kZQorCSAqIGFzc2lzdCBvcGVyYXRpb24gd2hlbiBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBpcyByZWFjaGVkIGNvdWxkIGJlIHVzZWQuCisJICogCisJICogPHByZT4KKwkgKiBuZXcgSVByb2dyZXNzTW9uaXRvcigpIHsKKwkgKiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVPVVQgPSA1MDA7IC8vbXMKKwkgKiAgICAgcHJpdmF0ZSBsb25nIGVuZFRpbWU7CisJICogICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgeworCSAqICAgICAgICAgZkVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKKwkgKiAgICAgfQorCSAqICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCSAqICAgICAgICAgcmV0dXJuIGVuZFRpbWUgPD0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJICogICAgIH0KKwkgKiAgICAgLi4uCisJICogfTsKKwkgKiA8L3ByZT4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBzbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQKKwkgKiBAcGFyYW0gaW5zZXJ0aW9uIHRoZSBwb3NpdGlvbiB3aXRoIGluIHNvdXJjZSB3aGVyZSB0aGUgc25pcHBldAorCSAqIGlzIGluc2VydGVkLiBUaGlzIHBvc2l0aW9uIG11c3Qgbm90IGJlIGluIGNvbW1lbnRzLgorCSAqIEEgcG9zc2libGUgdmFsdWUgaXMgLTEsIGlmIHRoZSBwb3NpdGlvbiBpcyBub3Qga25vd24uCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aXRoaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlcgorCSAqIGlzIHBlcmZvcm1pbmcgY29kZSBhc3Npc3QuCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQKKwkgKiB0eXBlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzCisJICogdGhhdCBhcmUgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzY29wZQorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzIGFuIGFycmF5IChwb3NzaWJsZSBlbXB0eSkgb2YgbW9kaWZpZXJzIGZvcgorCSAqIGxvY2FsIHZhcmlhYmxlcworCSAqIEBwYXJhbSBpc1N0YXRpYyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjb3BlIGlzIGluIGEgc3RhdGljIGNvbnRleHQKKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3RvcgorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwl2b2lkIGNvZGVDb21wbGV0ZSgKKwkJY2hhcltdIHNuaXBwZXQsCisJCWludCBpbnNlcnRpb24sCisJCWludCBwb3NpdGlvbiwKKwkJY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywKKwkJY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLAorCQlpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAorCQlib29sZWFuIGlzU3RhdGljLAorCQlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAJLyoqCiAJICogRG8gY29kZSBjb21wbGV0aW9uIGluc2lkZSBhIGNvZGUgc25pcHBldCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB0eXBlLgotCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLCAKKwkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywKIAkgKiB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCiAJICogaW4gdGhlIHdvcmtzcGFjZS4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgaWYgYSB3b3JraW5nIGNvcHkgaXMgZW1wdHksIGl0IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCiAJICogdW5pdCBoYWQgYmVlbiBkZWxldGVkLgogCSAqIDwvcD48cD4KLQkgKiBJZiB0aGUgdHlwZSBjYW4gYWNjZXNzIHRvIGhpcyBzb3VyY2UgY29kZSBhbmQgdGhlIGluc2VydGlvbiBwb3NpdGlvbiBpcyB2YWxpZCwKLQkgKiB0aGVuIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3Qgc291cmNlLiBPdGhlcndpc2UgdGhlIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkCi0JICogYWdhaW5zdCB0eXBlIHN0cnVjdHVyZSBhbmQgZ2l2ZW4gbG9jYWxzIHZhcmlhYmxlcy4KKwkgKiBJZiB0aGUgdHlwZSBoYXMgYWNjZXNzIHRvIGl0cyBzb3VyY2UgY29kZSBhbmQgdGhlIGluc2VydGlvbiBwb3NpdGlvbiBpcyB2YWxpZCwKKwkgKiB0aGVuIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlIHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAorCSAqIGFnYWluc3QgdGhlIHR5cGUgc3RydWN0dXJlIGFuZCB0aGUgZ2l2ZW4gbG9jYWxzIHZhcmlhYmxlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gc25pcHBldCB0aGUgY29kZSBzbmlwcGV0CiAJICogQHBhcmFtIGluc2VydGlvbiB0aGUgcG9zaXRpb24gd2l0aCBpbiBzb3VyY2Ugd2hlcmUgdGhlIHNuaXBwZXQKIAkgKiBpcyBpbnNlcnRlZC4gVGhpcyBwb3NpdGlvbiBtdXN0IG5vdCBiZSBpbiBjb21tZW50cy4KIAkgKiBBIHBvc3NpYmxlIHZhbHVlIGlzIC0xLCBpZiB0aGUgcG9zaXRpb24gaXMgbm90IGtub3duLgotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gd2l0aCBpbiBzbmlwcGV0IHdoZXJlIHRoZSB1c2VyIAorCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gd2l0aCBpbiBzbmlwcGV0IHdoZXJlIHRoZSB1c2VyCiAJICogaXMgcGVyZm9ybWluZyBjb2RlIGFzc2lzdC4KLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZCAKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZAogCSAqIHR5cGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKLQkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU5hbWVzIGFuIGFycmF5IChwb3NzaWJseSBlbXB0eSkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzCiAJICogdGhhdCBhcmUgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzY29wZQotCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzIGFuIGFycmF5IChwb3NzaWJsZSBlbXB0eSkgb2YgbW9kaWZpZXJzIGZvciAKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IKIAkgKiBsb2NhbCB2YXJpYWJsZXMKIAkgKiBAcGFyYW0gaXNTdGF0aWMgd2hldGhlciB0aGUgY3VycmVudCBzY29wZSBpcyBpbiBhIHN0YXRpYyBjb250ZXh0CiAJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29tcGxldGlvbiByZXF1ZXN0b3IKQEAgLTIwMCw2ICsyNTcsNzMgQEAKIAkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCiAJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogRG8gY29kZSBjb21wbGV0aW9uIGluc2lkZSBhIGNvZGUgc25pcHBldCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB0eXBlLgorCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLAorCSAqIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKKwkgKiBpbiB0aGUgd29ya3NwYWNlLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KKwkgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuCisJICogPC9wPjxwPgorCSAqIElmIHRoZSB0eXBlIGhhcyBhY2Nlc3MgdG8gaXRzIHNvdXJjZSBjb2RlIGFuZCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIHZhbGlkLAorCSAqIHRoZW4gY29tcGxldGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgc291cmNlLiBPdGhlcndpc2UgdGhlIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkCisJICogYWdhaW5zdCB0aGUgdHlwZSBzdHJ1Y3R1cmUgYW5kIHRoZSBnaXZlbiBsb2NhbHMgdmFyaWFibGVzLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBJZiB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gc29tZSBwcm9wb3NhbHMgd2hpY2gKKwkgKiBjYW4gYmUgdmVyeSBsb25nIHRvIGNvbXB1dGUgYXJlIHByb3Bvc2VkLiBUbyBhdm9pZCB0aGF0IHRoZSBjb2RlIGFzc2lzdCBvcGVyYXRpb24KKwkgKiB0YWtlIHRvbyBtdWNoIHRpbWUgYSB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gd2hpY2ggYXV0b21hdGljYWxseSBjYW5jZWwgdGhlIGNvZGUKKwkgKiBhc3Npc3Qgb3BlcmF0aW9uIHdoZW4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaXMgcmVhY2hlZCBjb3VsZCBiZSB1c2VkLgorCSAqIAorCSAqIDxwcmU+CisJICogbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisJICogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBUSU1FT1VUID0gNTAwOyAvL21zCisJICogICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lOworCSAqICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKwkgKiAgICAgICAgIGVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKKwkgKiAgICAgfQorCSAqICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCSAqICAgICAgICAgcmV0dXJuIGVuZFRpbWUgPD0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJICogICAgIH0KKwkgKiAgICAgLi4uCisJICogfTsKKwkgKiA8L3ByZT4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBzbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQKKwkgKiBAcGFyYW0gaW5zZXJ0aW9uIHRoZSBwb3NpdGlvbiB3aXRoIGluIHNvdXJjZSB3aGVyZSB0aGUgc25pcHBldAorCSAqIGlzIGluc2VydGVkLiBUaGlzIHBvc2l0aW9uIG11c3Qgbm90IGJlIGluIGNvbW1lbnRzLgorCSAqIEEgcG9zc2libGUgdmFsdWUgaXMgLTEsIGlmIHRoZSBwb3NpdGlvbiBpcyBub3Qga25vd24uCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB3aXRoIGluIHNuaXBwZXQgd2hlcmUgdGhlIHVzZXIKKwkgKiBpcyBwZXJmb3JtaW5nIGNvZGUgYXNzaXN0LgorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzIGFuIGFycmF5IChwb3NzaWJseSBlbXB0eSkgb2YgZnVsbHkgcXVhbGlmaWVkCisJICogdHlwZSBuYW1lcyBvZiBsb2NhbCB2YXJpYWJsZXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzY29wZQorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBsb2NhbCB2YXJpYWJsZSBuYW1lcworCSAqIHRoYXQgYXJlIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IKKwkgKiBsb2NhbCB2YXJpYWJsZXMKKwkgKiBAcGFyYW0gaXNTdGF0aWMgd2hldGhlciB0aGUgY3VycmVudCBzY29wZSBpcyBpbiBhIHN0YXRpYyBjb250ZXh0CisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29tcGxldGlvbiByZXF1ZXN0b3IKKwkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcworCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAc2luY2UgMy41CisJICovCisJdm9pZCBjb2RlQ29tcGxldGUoCisJCWNoYXJbXSBzbmlwcGV0LAorCQlpbnQgaW5zZXJ0aW9uLAorCQlpbnQgcG9zaXRpb24sCisJCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsCisJCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lcywKKwkJaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycywKKwkJYm9vbGVhbiBpc1N0YXRpYywKKwkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCisJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAogCiAJLyoqCkBAIC0yMTEsNyArMzM1LDcgQEAKIAkgKiBhcyB0aGUgbGFzdCBmaWVsZCBkZWNsYXJhdGlvbiBpbiB0aGlzIHR5cGUuPC9wPgogCSAqCiAJICogPHA+SXQgaXMgcG9zc2libGUgdGhhdCBhIGZpZWxkIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHR5cGUuCi0JICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKwkgKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgYWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgogCSAqIHN1Y2ggYSBjb25mbGljdDo8dWw+CiAJICogPGxpPiA8Y29kZT50cnVlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSB0aGUgZmllbGQgaXMgY3JlYXRlZCB3aXRoIHRoZSBuZXcgY29udGVudHM8L2xpPgogCSAqIDxsaT4gPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd248L2xpPgpAQCAtMjM0LDcgKzM1OCw3IEBACiAJICovCiAJSUZpZWxkIGNyZWF0ZUZpZWxkKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RhdGljIGluaXRpYWxpemVyIGluIHRoaXMgdHlwZSB3aXRoIHRoZQogCSAqIGdpdmVuIGNvbnRlbnRzLgpAQCAtMjU5LDcgKzM4Myw3IEBACiAJICovCiAJSUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGluIHRoaXMgdHlwZSB3aXRoIHRoZQogCSAqIGdpdmVuIGNvbnRlbnRzLgpAQCAtMjY5LDcgKzM5Myw3IEBACiAJICogdG8gdGhpcyB0eXBlLgogCSAqCiAJICogPHA+SXQgaXMgcG9zc2libGUgdGhhdCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHR5cGUuCi0JICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKwkgKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgYWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgogCSAqIHN1Y2ggYSBjb25mbGljdDo8dWw+CiAJICogPGxpPiA8Y29kZT50cnVlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSB0aGUgbWV0aG9kIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3IGNvbnRlbnRzPC9saT4KIAkgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KQEAgLTI5Myw3ICs0MTcsNyBAQAogCSAqLwogCUlNZXRob2QgY3JlYXRlTWV0aG9kKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBpbiB0aGlzIHR5cGUgd2l0aCB0aGUKIAkgKiBnaXZlbiBjb250ZW50cy4KQEAgLTMwMyw3ICs0MjcsNyBAQAogCSAqIHRvIHRoaXMgdHlwZS48L3A+CiAJICoKIAkgKiA8cD5JdCBpcyBwb3NzaWJsZSB0aGF0IGEgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyB0eXBlLgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGFmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKIAkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgogCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIHR5cGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBuZXcgY29udGVudHM8L2xpPgogCSAqIDxsaT4gPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd248L2xpPgpAQCAtMzI2LDggKzQ1MCw4IEBACiAJICovCiAJSVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCQotCS8qKiAKKworCS8qKgogCSAqIEZpbmRzIHRoZSBtZXRob2RzIGluIHRoaXMgdHlwZSB0aGF0IGNvcnJlc3BvbmQgdG8KIAkgKiB0aGUgZ2l2ZW4gbWV0aG9kLgogCSAqIEEgbWV0aG9kIG0xIGNvcnJlc3BvbmRzIHRvIGFub3RoZXIgbWV0aG9kIG0yIGlmOgpAQCAtMzM5LDE0ICs0NjMsMTggQEAKIAkgKiA8L3VsPgogCSAqIEBwYXJhbSBtZXRob2QgdGhlIGdpdmVuIG1ldGhvZAogCSAqIEByZXR1cm4gdGhlIGZvdW5kIG1ldGhvZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIG1ldGhvZHMgY2FuIGJlIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAyLjAgCisJICoKKwkgKiBAc2luY2UgMi4wCiAJICovCiAJSU1ldGhvZFtdIGZpbmRNZXRob2RzKElNZXRob2QgbWV0aG9kKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdHlwZSB0aGF0IGhhdmUgdGhlIGdpdmVuIGNhdGVnb3J5IGFzIGEgPGNvZGU+QGNhdGVnb3J5PC9jb2RlPiB0YWcuCiAJICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBubyBjaGlsZHJlbiB3aXRoIHRoaXMgY2F0ZWdvcnkgZXhpc3QuCisJICoKKwkgKiA8cD4KKwkgKiBUaGUgcmVzdWx0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIG9yIGNsYXNzIGZpbGUuCisJICogPC9wPgogCSAqIAogCSAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCkBAIC0zNTgsNjUgKzQ4Niw2OSBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgdHlwZSwgdW5xdWFsaWZpZWQgYnkgcGFja2FnZSBvciBlbmNsb3NpbmcgdHlwZS4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyB0eXBlCiAJICovCiAJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQogCSAqIGluIHRoaXMgdHlwZSAoZm9yIGV4YW1wbGUsIDxjb2RlPiJiYXIiPC9jb2RlPikuCiAJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSBmaWVsZCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCiAJICogQHJldHVybiB0aGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyB0eXBlCiAJICovCiAJSUZpZWxkIGdldEZpZWxkKFN0cmluZyBuYW1lKTsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGZpZWxkcyBkZWNsYXJlZCBieSB0aGlzIHR5cGUuCi0JICogSWYgdGhpcyBpcyBhIHNvdXJjZSB0eXBlLCB0aGUgcmVzdWx0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlcgotCSAqIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UsIG90aGVyd2lzZSwgdGhlIHJlc3VsdHMgYXJlCi0JICogaW4gbm8gcGFydGljdWxhciBvcmRlci4gIEZvciBiaW5hcnkgdHlwZXMsIHRoaXMgaW5jbHVkZXMgc3ludGhldGljIGZpZWxkcy4KKwkgKiBSZXR1cm5zIHRoZSBmaWVsZHMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciAKKwkgKiBpbiB0aGUgc291cmNlIG9yIGNsYXNzIGZpbGUuIEZvciBiaW5hcnkgdHlwZXMsIHRoaXMgaW5jbHVkZXMgc3ludGhldGljIGZpZWxkcy4KIAkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KIAkgKiBAcmV0dXJuIHRoZSBmaWVsZHMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlCiAJICovCiAJSUZpZWxkW10gZ2V0RmllbGRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSwgCisJICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLAogCSAqIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgY29udGFpbmluZyB0eXBlcyBhbmQgcGFja2FnZXMuCiAJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgZm9sbG93ZWQgYnkgPGNvZGU+Jy4nPC9jb2RlPiwKIAkgKiBmb2xsb3dlZCBieSB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZS4KKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlPC9iPjogVGhlIGVuY2xvc2luZyB0eXBlIHNlcGFyYXRvciB1c2VkIGluIHRoZSB0eXBlLXF1YWxpZmllZAorCSAqIG5hbWUgaXMgPGNvZGU+JyQnPC9jb2RlPiwgbm90IDxjb2RlPicuJzwvY29kZT4uCisJICogPC9wPgorCSAqIFRoaXMgbWV0aG9kIGlzIGZ1bGx5IGVxdWl2YWxlbnQgdG8gPGNvZGU+Z2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk8L2NvZGU+LgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAJICoKIAkgKiBAc2VlIElUeXBlI2dldFR5cGVRdWFsaWZpZWROYW1lKCkKKwkgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQogCSAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZQogCSAqLwogCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSwgCisJICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLAogCSAqIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgY29udGFpbmluZyB0eXBlcyBhbmQgcGFja2FnZXMuCiAJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgZm9sbG93ZWQgYnkgPGNvZGU+Jy4nPC9jb2RlPiwKIAkgKiBmb2xsb3dlZCBieSB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSB1c2luZyB0aGUgPGNvZGU+ZW5jbG9zaW5nVHlwZVNlcGFyYXRvcjwvY29kZT4uCi0JICogCisJICoKIAkgKiBGb3IgZXhhbXBsZToKIAkgKiA8dWw+Ci0JICogPGxpPnRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciBvZiBhIGNsYXNzIEEgaW4gYSBjb21waWxhdGlvbiB1bml0IEEuamF2YSAKKwkgKiA8bGk+dGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIG9mIGEgY2xhc3MgQSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgQS5qYXZhCiAJICogICAgIGluIGEgcGFja2FnZSB4LnkgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIngueS5BLkIiPC9saT4KLQkgKiA8bGk+dGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIG9mIGEgY2xhc3MgQSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgQS5qYXZhIAorCSAqIDxsaT50aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgb2YgYSBjbGFzcyBBIGluIGEgY29tcGlsYXRpb24gdW5pdCBBLmphdmEKIAkgKiAgICAgaW4gYSBwYWNrYWdlIHgueSB1c2luZyB0aGUgJyQnIHNlcGFyYXRvciBpcyAieC55LkEkQiI8L2xpPgogCSAqIDxsaT50aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBiaW5hcnkgdHlwZSB3aG9zZSBjbGFzcyBmaWxlIGlzIHgveS9BJEIuY2xhc3MKIAkgKiAgICAgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIngueS5BLkIiPC9saT4KIAkgKiA8bGk+dGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyB4L3kvQSRCLmNsYXNzCiAJICogICAgIHVzaW5nIHRoZSAnJCcgc2VwYXJhdG9yIGlzICJ4LnkuQSRCIjwvbGk+CiAJICogPGxpPnRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBhbm9ueW1vdXMgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyB4L3kvQSQxLmNsYXNzCi0JICogICAgIHVzaW5nIHRoZSAnLicgc2VwYXJhdG9yIGlzICJ4LnkuQSQxIjwvbGk+CisJICogICAgIHVzaW5nIHRoZSAnLicgc2VwYXJhdG9yIGlzICJ4LnkuQS4xIjwvbGk+CiAJICogPC91bD4KLQkgKiAKKwkgKgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAJICoKIAkgKiBAcGFyYW0gZW5jbG9zaW5nVHlwZVNlcGFyYXRvciB0aGUgZ2l2ZW4gZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCkBAIC00MjUsMTEgKzU1NywxMiBAQAogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdHlwZSdzIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvbGxvd2VkIGJ5IGl0cyB0eXBlIHBhcmFtZXRlcnMgYmV0d2VlbiBhbmdsZSBicmFrZXRzIGlmIGl0IGlzIGEgZ2VuZXJpYyB0eXBlLgorCSAqIFJldHVybnMgdGhpcyB0eXBlJ3MgZnVsbHkgcXVhbGlmaWVkIG5hbWUgdXNpbmcgYSAnLicgZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCisJICogZm9sbG93ZWQgYnkgaXRzIHR5cGUgcGFyYW1ldGVycyBiZXR3ZWVuIGFuZ2xlIGJyYWNrZXRzIGlmIGl0IGlzIGEgZ2VuZXJpYyB0eXBlLgogCSAqIEZvciBleGFtcGxlLCAicC5YJmx0O1QmZ3Q7IiwgImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgcC5YJmd0OyIKLQkgKiAKKwkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhcmFtZXRlcml6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0eXBlCkBAIC00NDIsMzYgKzU3NSwzOCBAQAogCSAqIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBzb3VyY2UuCiAJICogTnVtYmVyaW5nIHN0YXJ0cyBhdCAxICh0aHVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlzIG9jY3VycmVuY2UgMSwgbm90IG9jY3VycmVuY2UgMCkuCiAJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSBpbml0aWFsaXplciBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9jY3VycmVuY2VDb3VudCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCiAJICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBzb3VyY2UKIAkgKi8KIAlJSW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXIoaW50IG9jY3VycmVuY2VDb3VudCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlLgotCSAqIEZvciBiaW5hcnkgdHlwZXMgdGhpcyBpcyBhbiBlbXB0eSBjb2xsZWN0aW9uLgotCSAqIElmIHRoaXMgaXMgYSBzb3VyY2UgdHlwZSwgdGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIKLQkgKiBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlLgorCSAqIFJldHVybnMgdGhlIGluaXRpYWxpemVycyBkZWNsYXJlZCBieSB0aGlzIHR5cGUuIEZvciBiaW5hcnkgdHlwZXMgdGhpcyBpcyBhbiAKKwkgKiBlbXB0eSBjb2xsZWN0aW9uLiBGb3Igc291cmNlIHR5cGVzLCB0aGUgcmVzdWx0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciBpbiAKKwkgKiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlLiAKIAkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KIAkgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlCiAJICovCiAJSUluaXRpYWxpemVyW10gZ2V0SW5pdGlhbGl6ZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIGJpbmRpbmcga2V5IGZvciB0aGlzIHR5cGUuIEEgYmluZGluZyBrZXkgaXMgYSBrZXkgdGhhdCB1bmlxdWVseQotCSAqIGlkZW50aWZpZXMgdGhpcyB0eXBlLiBJdCBhbGxvd3MgYWNjZXNzIHRvIGdlbmVyaWMgaW5mbyBmb3IgcGFyYW1ldGVyaXplZAotCSAqIHR5cGVzLgotCSAqIAorCSAqIFJldHVybnMgdGhlIGJpbmRpbmcga2V5IGZvciB0aGlzIHR5cGUgb25seSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB7QGxpbmsgI2lzUmVzb2x2ZWQoKSByZXNvbHZlZH0uCisJICogQSBiaW5kaW5nIGtleSBpcyBhIGtleSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlLiBJdCBhbGxvd3MgYWNjZXNzCisJICogdG8gZ2VuZXJpYyBpbmZvIGZvciBwYXJhbWV0ZXJpemVkIHR5cGVzLgorCSAqCisJICogPHA+SWYgdGhlIGdpdmVuIHR5cGUgaXMgbm90IHJlc29sdmVkLCB0aGUgcmV0dXJuZWQga2V5IGlzIHNpbXBseSB0aGUgamF2YSBlbGVtZW50J3Mga2V5LgorCSAqIDwvcD4KIAkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGtleSBmb3IgdGhpcyB0eXBlCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmcjZ2V0S2V5KCkKIAkgKiBAc2VlIEJpbmRpbmdLZXkKIAkgKiBAc2luY2UgMy4xCisJICogQHNlZSAjaXNSZXNvbHZlZCgpCiAJICovCiAJU3RyaW5nIGdldEtleSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMKIAkgKiBpbiB0aGlzIHR5cGUgKGZvciBleGFtcGxlLCA8Y29kZT4iZm9vIiwgeyJJIiwgIlFTdHJpbmc7In08L2NvZGU+KS4KQEAgLTQ4MywzNSArNjE4LDM1IEBACiAJICogb3IgcmVzb2x2ZWQgKGZvciBiaW5hcnkgdHlwZXMpLCBhbmQgZWl0aGVyIGJhc2ljIChmb3IgYmFzaWMgdHlwZXMpCiAJICogb3IgcmljaCAoZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMpLiBTZWUge0BsaW5rIFNpZ25hdHVyZX0gZm9yIGRldGFpbHMuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKIAkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMgdGhlIGdpdmVuIHBhcmFtZXRlciB0eXBlcwogCSAqIEByZXR1cm4gdGhlIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyIHR5cGVzIGluIHRoaXMgdHlwZQogCSAqLwogCUlNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlLgotCSAqIEZvciBiaW5hcnkgdHlwZXMsIHRoaXMgbWF5IGluY2x1ZGUgdGhlIHNwZWNpYWwgPGNvZGU+Jmx0O2NsaW5pdCZndDs8L2NvZGU+OyBtZXRob2QgCisJICogRm9yIGJpbmFyeSB0eXBlcywgdGhpcyBtYXkgaW5jbHVkZSB0aGUgc3BlY2lhbCA8Y29kZT4mbHQ7Y2xpbml0Jmd0OzwvY29kZT4gbWV0aG9kCiAJICogYW5kIHN5bnRoZXRpYyBtZXRob2RzLgotCSAqIElmIHRoaXMgaXMgYSBzb3VyY2UgdHlwZSwgdGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIKLQkgKiBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlLCBvdGhlcndpc2UsIHRoZSByZXN1bHRzIGFyZQotCSAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisJICogPHA+CisJICogVGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBvciBjbGFzcyBmaWxlLiAKKwkgKiA8L3A+CiAJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAJICogQHJldHVybiB0aGUgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIGRlY2xhcmVkIGJ5IHRoaXMgdHlwZQogCSAqLwogCUlNZXRob2RbXSBnZXRNZXRob2RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaW4gd2hpY2ggdGhpcyBlbGVtZW50IGlzIGRlZmluZWQuCiAJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQgaW4gd2hpY2ggdGhpcyBlbGVtZW50IGlzIGRlZmluZWQKIAkgKi8KIAlJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHR5cGUncyBzdXBlcmNsYXNzLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGZvciBzb3VyY2UgdHlwZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIHN1cGVyY2xhc3MuCkBAIC01MzIsOSArNjY3LDkgQEAKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBzb3VyY2UgdHlwZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIHN1cGVyY2xhc3MKIAkgKi8KIAlTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhpcyB0eXBlJ3Mgc3VwZXJjbGFzcywgb3IgCisJICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhpcyB0eXBlJ3Mgc3VwZXJjbGFzcywgb3IKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCSAqIDxwPgogCSAqIFRoZSB0eXBlIHNpZ25hdHVyZSBtYXkgYmUgZWl0aGVyIHVucmVzb2x2ZWQgKGZvciBzb3VyY2UgdHlwZXMpCkBAIC01NDksNyArNjg0LDcgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJU3RyaW5nIGdldFN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZQogCSAqIGltcGxlbWVudHMgb3IgZXh0ZW5kcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUKQEAgLTU3MSwxMiArNzA2LDEyIEBACiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgogCSAqIEByZXR1cm4gIHRoZSB0eXBlIHNpZ25hdHVyZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzCi0JICogb3IgZXh0ZW5kcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgc291cmNlLCAKKwkgKiBvciBleHRlbmRzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgbGlzdGVkIGluIHRoZSBzb3VyY2UsCiAJICogYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCiAJICogQHNpbmNlIDMuMAogCSAqLwogCVN0cmluZ1tdIGdldFN1cGVySW50ZXJmYWNlVHlwZVNpZ25hdHVyZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsCiAJICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgc291cmNlLgpAQCAtNTk2LDExICs3MzEsMTEgQEAKIAkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLQkgKiBAcmV0dXJuICB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIHNvdXJjZSwgCisJICogQHJldHVybiAgdGhlIG5hbWVzIG9mIGludGVyZmFjZXMgdGhhdCB0aGlzIHR5cGUgaW1wbGVtZW50cyBvciBleHRlbmRzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgbGlzdGVkIGluIHRoZSBzb3VyY2UsCiAJICogYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCiAJICovCiAJU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlcyBmb3IgdGhpcyB0eXBlLgogCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyB0eXBlIGhhcyBubyBmb3JtYWwgdHlwZSBwYXJhbWV0ZXJzLgpAQCAtNjE3LDcgKzc1Miw3IEBACiAJICogQHNpbmNlIDMuMAogCSAqLwogCVN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoaXMgdHlwZS4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgdHlwZSBoYXMgbm8gZm9ybWFsIHR5cGUgcGFyYW1ldGVycy4KQEAgLTYzMyw0NSArNzY4LDQ5IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWVtYmVyIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB0eXBlIHdpdGggdGhlIGdpdmVuIHNpbXBsZSBuYW1lLgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuIFRoZSB0eXBlIG1heSBvciBtYXkgbm90IGV4aXN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIHNpbXBsZSBuYW1lCiAJICogQHJldHVybiB0aGUgbWVtYmVyIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB0eXBlIHdpdGggdGhlIGdpdmVuIHNpbXBsZSBuYW1lCiAJICovCiAJSVR5cGUgZ2V0VHlwZShTdHJpbmcgbmFtZSk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0eXBlIHBhcmFtZXRlciBkZWNsYXJlZCBpbiB0aGlzIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiBUaGUgdHlwZSBwYXJhbWV0ZXIgbWF5IG9yIG1heSBub3QgZXhpc3QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIHBhcmFtZXRlciBkZWNsYXJlZCBpbiB0aGlzIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlJVHlwZVBhcmFtZXRlciBnZXRUeXBlUGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLQkKKwogCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUtcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLCAKKwkgKiBSZXR1cm5zIHRoZSB0eXBlLXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSwKIAkgKiBpbmNsdWRpbmcgcXVhbGlmaWNhdGlvbiBmb3IgYW55IGVuY2xvc2luZyB0eXBlcywKIAkgKiBidXQgbm90IGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmljYXRpb24uCi0JICogRm9yIHNvdXJjZSB0eXBlcywgdGhpcyBjb25zaXN0cyBvZiB0aGUgc2ltcGxlIG5hbWVzIG9mIGFueSBlbmNsb3NpbmcgdHlwZXMsIAorCSAqIEZvciBzb3VyY2UgdHlwZXMsIHRoaXMgY29uc2lzdHMgb2YgdGhlIHNpbXBsZSBuYW1lcyBvZiBhbnkgZW5jbG9zaW5nIHR5cGVzLAogCSAqIHNlcGFyYXRlZCBieSA8Y29kZT4nJCc8L2NvZGU+LCBmb2xsb3dlZCBieSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyB0eXBlCi0JICogb3IgdGhlIG9jY3VyZW5jZSBjb3VudCBvZiB0aGlzIHR5cGUgaWYgaXQgaXMgYW5vbnltb3VzLgorCSAqIG9yIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoaXMgdHlwZSBpZiBpdCBpcyBhbm9ueW1vdXMuCiAJICogRm9yIGJpbmFyeSB0eXBlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZSB3aXRob3V0IHRoZSAiLmNsYXNzIiBzdWZmaXguCisJICogVGhpcyBtZXRob2QgaXMgZnVsbHkgZXF1aXZhbGVudCB0byA8Y29kZT5nZXRUeXBlUXVhbGlmaWVkTmFtZSgnJCcpPC9jb2RlPi4KIAkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotCSAqIAorCSAqCisJICogQHNlZSAjZ2V0VHlwZVF1YWxpZmllZE5hbWUoY2hhcikKIAkgKiBAcmV0dXJuIHRoZSB0eXBlLXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZQogCSAqLwogCVN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQorCiAJLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUsIAorCSAqIFJldHVybnMgdGhlIHR5cGUtcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLAogCSAqIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgZW5jbG9zaW5nIHR5cGVzLAogCSAqIGJ1dCBub3QgaW5jbHVkaW5nIHBhY2thZ2UgcXVhbGlmaWNhdGlvbi4KLQkgKiBGb3Igc291cmNlIHR5cGVzLCB0aGlzIGNvbnNpc3RzIG9mIHRoZSBzaW1wbGUgbmFtZXMgb2YgYW55IGVuY2xvc2luZyB0eXBlcywgCi0JICogc2VwYXJhdGVkIGJ5IDxjb2RlPmVuY2xvc2luZ1R5cGVTZXBhcmF0b3I8L2NvZGU+LCBmb2xsb3dlZCBieSB0aGUgCi0JICogc2ltcGxlIG5hbWUgb2YgdGhpcyB0eXBlICBvciB0aGUgb2NjdXJlbmNlIGNvdW50IG9mIHRoaXMgdHlwZSBpZiBpdCBpcyBhbm9ueW1vdXMuCi0JICogRm9yIGJpbmFyeSB0eXBlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZSB3aXRob3V0IHRoZSAiLmNsYXNzIiBzdWZmaXguCi0JICogCisJICogRm9yIHNvdXJjZSB0eXBlcywgdGhpcyBjb25zaXN0cyBvZiB0aGUgc2ltcGxlIG5hbWVzIG9mIGFueSBlbmNsb3NpbmcgdHlwZXMsCisJICogc2VwYXJhdGVkIGJ5IDxjb2RlPmVuY2xvc2luZ1R5cGVTZXBhcmF0b3I8L2NvZGU+LCBmb2xsb3dlZCBieSB0aGUKKwkgKiBzaW1wbGUgbmFtZSBvZiB0aGlzIHR5cGUgIG9yIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoaXMgdHlwZSBpZiBpdCBpcyBhbm9ueW1vdXMuCisJICogRm9yIGJpbmFyeSB0eXBlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZSB3aXRob3V0IHRoZSAiLmNsYXNzIiBzdWZmaXgsCisJICogYW5kIC0gc2luY2UgMy40IC0gdGhlICckJyBjaGFyYWN0ZXJzIGluIHRoZSBjbGFzcyBmaWxlIG5hbWUgYXJlIHJlcGxhY2VkIHdpdGggdGhlCisJICogPGNvZGU+ZW5jbG9zaW5nVHlwZVNlcGFyYXRvcjwvY29kZT4gY2hhcmFjdGVyLgorCSAqCiAJICogRm9yIGV4YW1wbGU6CiAJICogPHVsPgogCSAqIDxsaT50aGUgdHlwZSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIEIgZGVmaW5lZCBhcyBhIG1lbWJlciBvZiBhIGNsYXNzIEEKQEAgLTY3OSwyMSArODE4LDIxIEBACiAJICogPGxpPnRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIG9mIGEgY2xhc3MgQQogCSAqICAgICB1c2luZyB0aGUgJyQnIHNlcGFyYXRvciBpcyAiQSRCIjwvbGk+CiAJICogPGxpPnRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIG9mIGEgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyBBJEIuY2xhc3MKLQkgKiAgICAgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIkEkQiI8L2xpPgorCSAqICAgICB1c2luZyB0aGUgJy4nIHNlcGFyYXRvciBpcyAiQS5CIjwvbGk+CiAJICogPGxpPnRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIG9mIGEgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyBBJEIuY2xhc3MKIAkgKiAgICAgdXNpbmcgdGhlICckJyBzZXBhcmF0b3IgaXMgIkEkQiI8L2xpPgogCSAqIDxsaT50aGUgdHlwZSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBhbm9ueW1vdXMgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyBBJDEuY2xhc3MKLQkgKiAgICAgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIkEkMSI8L2xpPgorCSAqICAgICB1c2luZyB0aGUgJy4nIHNlcGFyYXRvciBpcyAiQS4xIjwvbGk+CiAJICogPC91bD4KIAkgKgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZW5jbG9zaW5nVHlwZVNlcGFyYXRvciB0aGUgc3BlY2lmaWVkIGVuY2xvc2luZyB0eXBlIHNlcGFyYXRvcgogCSAqIEByZXR1cm4gdGhlIHR5cGUtcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlCiAJICogQHNpbmNlIDIuMAogCSAqLwogCVN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyIGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgaW1tZWRpYXRlIG1lbWJlciB0eXBlcyBkZWNsYXJlZCBieSB0aGlzIHR5cGUuCiAJICogVGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBvciBjbGFzcyBmaWxlLgpAQCAtNzAzLDcgKzg0Miw3IEBACiAJICogQHJldHVybiB0aGUgaW1tZWRpYXRlIG1lbWJlciB0eXBlcyBkZWNsYXJlZCBieSB0aGlzIHR5cGUKIAkgKi8KIAlJVHlwZVtdIGdldFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgcmVwcmVzZW50cyBhbiBhbm9ueW1vdXMgdHlwZS4KIAkgKgpAQCAtNzI1LDEzICs4NjQsMTMgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSBjbGFzcywgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBpc0NsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgcmVwcmVzZW50cyBhbiBlbnVtZXJhdGlvbiBjbGFzcy4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgYW4gZW51bWVyYXRpb24gY2xhc3MgY2FuIG5laXRoZXIgYmUgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBub3IgYW4gYW5ub3RhdGlvbiB0eXBlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gZW51bWVyYXRpb24gY2xhc3MsCkBAIC03NTEsMTEgKzg5MCwxMSBAQAogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UsIGZhbHNlIG90aGVyd2lzZQogCSAqLwogCWJvb2xlYW4gaXNJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGFubm90YXRpb24gdHlwZS4KIAkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgYW4gYW5ub3RhdGlvbiB0eXBlIGlzIGFsc28gYW4gaW50ZXJmYWNlLCBidXQgaXQgY2FuIG5laXRoZXIgYmUgYSBjbGFzcyBub3IgYW4gZW51bWVyYXRpb24gY2xhc3MuIAorCSAqIE5vdGUgdGhhdCBhbiBhbm5vdGF0aW9uIHR5cGUgaXMgYWxzbyBhbiBpbnRlcmZhY2UsIGJ1dCBpdCBjYW4gbmVpdGhlciBiZSBhIGNsYXNzIG5vciBhbiBlbnVtZXJhdGlvbiBjbGFzcy4KIAkgKiA8L3A+CiAJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KQEAgLTc2NywxMSArOTA2LDE3IEBACiAJYm9vbGVhbiBpc0Fubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAJLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgbG9jYWwgdHlwZS4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSBsb2NhbCB0eXBlLiBGb3IgYW4gYW5vbnltb3VzIHR5cGUsIAorCSAqIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZS4KKwkgKiA8cD4KKwkgKiBOb3RlOiBUaGlzIGRldmlhdGVzIGZyb20gSkxTMyAxNC4zLCB3aGljaCBzdGF0ZXMgdGhhdCBhbm9ueW1vdXMgdHlwZXMgYXJlIAorCSAqIG5vdCBsb2NhbCB0eXBlcyBzaW5jZSB0aGV5IGRvIG5vdCBoYXZlIGEgbmFtZS4KKwkgKiA8L3A+CiAJICoKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgbG9jYWwgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nI2lzTG9jYWwoKQogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlib29sZWFuIGlzTG9jYWwoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwpAQCAtNzg4LDcgKzkzMyw3IEBACiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgcmVzb2x2ZWQgdHlwZS4KIAkgKiBJZiBhIHR5cGUgaXMgcmVzb2x2ZWQsIGl0cyBrZXkgY29udGFpbnMgcmVzb2x2ZWQgaW5mb3JtYXRpb24uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZXNvbHZlZCB0eXBlLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTc5NiwxOSArOTQxLDE5IEBACiAJLyoqCiAJICogTG9hZHMgYSBwcmV2aW91c2x5IHNhdmVkIElUeXBlSGllcmFyY2h5IGZyb20gYW4gaW5wdXQgc3RyZWFtLiBBIHR5cGUgaGllcmFyY2h5IGNhbgogCSAqIGJlIHN0b3JlZCB1c2luZyBJVHlwZUhpZXJhY2h5I3N0b3JlKE91dHB1dFN0cmVhbSkuCi0JICogCisJICoKIAkgKiBPbmx5IGhpZXJhcmNoaWVzIG9yaWdpbmFsbHkgY3JlYXRlZCBieSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGxvYWRlZDoKIAkgKiA8dWw+CiAJICogPGxpPklUeXBlI25ld1N1cGVydHlwZUhpZXJhcmNoeShJUHJvZ3Jlc3NNb25pdG9yKTwvbGk+CiAJICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSUphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKTwvbGk+CiAJICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvcik8L2xpPgogCSAqIDwvdWw+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gaW5wdXQgc3RyZWFtIHdoZXJlIGhpZXJhcmNoeSB3aWxsIGJlIHJlYWQKIAkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgogCSAqIEByZXR1cm4gdGhlIHN0b3JlZCBoaWVyYXJjaHkKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgaGllcmFyY2h5IGNvdWxkIG5vdCBiZSByZXN0b3JlZCwgcmVhc29ucyBpbmNsdWRlOgotCSAqICAgICAgLSB0eXBlIGlzIG5vdCB0aGUgZm9jdXMgb2YgdGhlIGhpZXJhcmNoeSBvciAKKwkgKiAgICAgIC0gdHlwZSBpcyBub3QgdGhlIGZvY3VzIG9mIHRoZSBoaWVyYXJjaHkgb3IKIAkgKgkJLSB1bmFibGUgdG8gcmVhZCB0aGUgaW5wdXQgc3RyZWFtICh3cm9uZyBmb3JtYXQsIElPRXhjZXB0aW9uIGR1cmluZyByZWFkaW5nLCAuLi4pCiAJICogQHNlZSBJVHlwZUhpZXJhcmNoeSNzdG9yZShqYXZhLmlvLk91dHB1dFN0cmVhbSwgSVByb2dyZXNzTW9uaXRvcikKIAkgKiBAc2luY2UgMi4xCkBAIC04MjQsMTEgKzk2OSwxMSBAQAogCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcgdGhpcyB0eXBlIGFuZCBhbGwgb2YgaXRzIHN1cGVydHlwZXMKIAkgKi8KIAlJVHlwZUhpZXJhcmNoeSBuZXdTdXBlcnR5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHR5cGUgaGllcmFyY2h5IGZvciB0aGlzIHR5cGUgY29udGFpbmluZwotCSAqIHRoaXMgdHlwZSBhbmQgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUgZ2l2ZW4gCi0JICogd29ya2luZyBjb3BpZXMuIEluIG90aGVyIHdvcmRzLCB0aGUgbGlzdCBvZiB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgCisJICogdGhpcyB0eXBlIGFuZCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSBnaXZlbgorCSAqIHdvcmtpbmcgY29waWVzLiBJbiBvdGhlciB3b3JkcywgdGhlIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlCiAJICogcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHBhc3NpbmcgYW4gZW1wdHkgd29ya2luZyBjb3B5IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCkBAIC04NDQsMTEgKzk4OSwxMSBAQAogCSAqLwogCUlUeXBlSGllcmFyY2h5IG5ld1N1cGVydHlwZUhpZXJhcmNoeShJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKLQkgKiB0aGlzIHR5cGUgYW5kIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlIGdpdmVuIAotCSAqIHdvcmtpbmcgY29waWVzLiBJbiBvdGhlciB3b3JkcywgdGhlIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIAorCSAqIHRoaXMgdHlwZSBhbmQgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUgZ2l2ZW4KKwkgKiB3b3JraW5nIGNvcGllcy4gSW4gb3RoZXIgd29yZHMsIHRoZSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZQogCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGVtcHR5IHdvcmtpbmcgY29weSB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgpAQCAtODY1LDEyICsxMDEwLDEyIEBACiAJICovCiAJSVR5cGVIaWVyYXJjaHkgbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCi0JICogdGhpcyB0eXBlIGFuZCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSAKLQkgKiB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lci4gCi0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSAKKwkgKiB0aGlzIHR5cGUgYW5kIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlCisJICogd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIuCisJICogSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZQogCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KQEAgLTg4OSw3ICsxMDM0LDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKLQkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzCiAJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QuCiAJICoKIAkgKiBAcGFyYW0gcHJvamVjdCB0aGUgZ2l2ZW4gcHJvamVjdApAQCAtODk3LDE3ICsxMDQyLDE3IEBACiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgogCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKLQkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzCiAJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QKIAkgKi8KIAlJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCi0JICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzIAotCSAqIGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiBwcm9qZWN0LCBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUgCi0JICogd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIuIAotCSAqIEluIG90aGVyIHdvcmRzLCB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzCisJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QsIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZQorCSAqIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyLgorCSAqIEluIG90aGVyIHdvcmRzLCB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UKIAkgKiBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMgaW4gdGhlIHdvcmtzcGFjZS4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgaWYgYSB3b3JraW5nIGNvcHkgaXMgZW1wdHksIGl0IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCkBAIC05MjAsNyArMTA2NSw3IEBACiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgogCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKLQkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzCiAJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC05MzcsMTEgKzEwODIsMTEgQEAKIAkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgaW4gdGhlIHdvcmtzcGFjZQogCSAqLwogCUlUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHR5cGUgaGllcmFyY2h5IGZvciB0aGlzIHR5cGUgY29udGFpbmluZwotCSAqIHRoaXMgdHlwZSwgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBhbmQgYWxsIGl0cyBzdWJ0eXBlcyBpbiB0aGUgd29ya3NwYWNlLCAKLQkgKiBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUgZ2l2ZW4gd29ya2luZyBjb3BpZXMuIEluIG90aGVyIHdvcmRzLCB0aGUgbGlzdCBvZiB3b3JraW5nIAorCSAqIHRoaXMgdHlwZSwgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBhbmQgYWxsIGl0cyBzdWJ0eXBlcyBpbiB0aGUgd29ya3NwYWNlLAorCSAqIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSBnaXZlbiB3b3JraW5nIGNvcGllcy4gSW4gb3RoZXIgd29yZHMsIHRoZSBsaXN0IG9mIHdvcmtpbmcKIAkgKiBjb3BpZXMgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHBhc3NpbmcgYW4gZW1wdHkgd29ya2luZyBjb3B5IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCkBAIC05NTYsMTEgKzExMDEsMTEgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHR5cGUgaGllcmFyY2h5IGZvciB0aGlzIHR5cGUgY29udGFpbmluZwotCSAqIHRoaXMgdHlwZSwgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBhbmQgYWxsIGl0cyBzdWJ0eXBlcyBpbiB0aGUgd29ya3NwYWNlLCAKLQkgKiBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUgZ2l2ZW4gd29ya2luZyBjb3BpZXMuIEluIG90aGVyIHdvcmRzLCB0aGUgbGlzdCBvZiB3b3JraW5nIAorCSAqIHRoaXMgdHlwZSwgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBhbmQgYWxsIGl0cyBzdWJ0eXBlcyBpbiB0aGUgd29ya3NwYWNlLAorCSAqIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSBnaXZlbiB3b3JraW5nIGNvcGllcy4gSW4gb3RoZXIgd29yZHMsIHRoZSBsaXN0IG9mIHdvcmtpbmcKIAkgKiBjb3BpZXMgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHBhc3NpbmcgYW4gZW1wdHkgd29ya2luZyBjb3B5IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCkBAIC05NzYsMTIgKzExMjEsMTIgQEAKIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNuZXdUeXBlSGllcmFyY2h5KElDb21waWxhdGlvblVuaXRbXSwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQKIAkgKi8KIAlJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKLQkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgaW4gdGhlIHdvcmtzcGFjZSwgCi0JICogY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyLiAKLQkgKiBJbiBvdGhlciB3b3JkcywgdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIAorCSAqIHRoaXMgdHlwZSwgYWxsIG9mIGl0cyBzdXBlcnR5cGVzLCBhbmQgYWxsIGl0cyBzdWJ0eXBlcyBpbiB0aGUgd29ya3NwYWNlLAorCSAqIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lci4KKwkgKiBJbiBvdGhlciB3b3JkcywgdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlCiAJICogcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IGlmIGEgd29ya2luZyBjb3B5IGlzIGVtcHR5LCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgpAQCAtOTk3LDEwICsxMTQyLDEwIEBACiAJICogQHNpbmNlIDMuMAogCSAqLwogCUlUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoV29ya2luZ0NvcHlPd25lciBvd25lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIHR5cGUgbmFtZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB0eXBlIChkZXBlbmRpbmcgb24gdGhlIHR5cGUgaGllcmFyY2h5IAotCSAqIGFuZCBpdHMgaW1wb3J0cykuIAorCSAqIFJlc29sdmVzIHRoZSBnaXZlbiB0eXBlIG5hbWUgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgdHlwZSAoZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGhpZXJhcmNoeQorCSAqIGFuZCBpdHMgaW1wb3J0cykuCiAJICogPHA+CiAJICogTXVsdGlwbGUgYW5zd2VycyBtaWdodCBiZSBmb3VuZCBpbiBjYXNlIHRoZXJlIGFyZSBhbWJpZ3VvdXMgbWF0Y2hlcy4KIAkgKiA8L3A+CkBAIC0xMDE1LDIxICsxMTYwLDIxIEBACiAJICo8cD4KIAkgKiBGb3IgZXhhbXBsZSwgcmVzb2x1dGlvbiBvZiA8Y29kZT4iT2JqZWN0IjwvY29kZT4gd291bGQgdHlwaWNhbGx5IHJldHVybgogCSAqIDxjb2RlPnt7ImphdmEubGFuZyIsICJPYmplY3QifX08L2NvZGU+LiBBbm90aGVyIHJlc29sdXRpb24gdGhhdCByZXR1cm5zCi0JICogPGNvZGU+e3siIiwgIlguSW5uZXIifX08L2NvZGU+IHJlcHJlc2VudHMgdGhlIGlubmVyIHR5cGUgSW5uZXIgZGVmaW5lZCBpbiB0eXBlIFggaW4gdGhlIAorCSAqIDxjb2RlPnt7IiIsICJYLklubmVyIn19PC9jb2RlPiByZXByZXNlbnRzIHRoZSBpbm5lciB0eXBlIElubmVyIGRlZmluZWQgaW4gdHlwZSBYIGluIHRoZQogCSAqIGRlZmF1bHQgcGFja2FnZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIGdpdmVuIHR5cGUgbmFtZQotCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgcmVzb2x2ZSBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBjb2RlIHJlc29sdmUgY291bGQgbm90IGJlIHBlcmZvcm1lZC4KIAkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB0eXBlIG5hbWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBmaW5kIGFueSBtYXRjaGluZyB0eXBlCiAJICogQHNlZSAjZ2V0VHlwZVF1YWxpZmllZE5hbWUoY2hhcikKIAkgKi8KIAlTdHJpbmdbXVtdIHJlc29sdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAogCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiB0eXBlIG5hbWUgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgdHlwZSAoZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGhpZXJhcmNoeSAKLQkgKiBhbmQgaXRzIGltcG9ydHMpIGFuZCB1c2luZyB0aGUgZ2l2ZW4gb3duZXIncyB3b3JraW5nIGNvcGllcywgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlIAotCSAqIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyLiBJbiBvdGhlciB3b3JkcywgdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIAorCSAqIFJlc29sdmVzIHRoZSBnaXZlbiB0eXBlIG5hbWUgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgdHlwZSAoZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGhpZXJhcmNoeQorCSAqIGFuZCBpdHMgaW1wb3J0cykgYW5kIHVzaW5nIHRoZSBnaXZlbiBvd25lcidzIHdvcmtpbmcgY29waWVzLCBjb25zaWRlcmluZyB0eXBlcyBpbiB0aGUKKwkgKiB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lci4gSW4gb3RoZXIgd29yZHMsIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZQogCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KQEAgLTEwNDgsMTMgKzExOTMsMTMgQEAKIAkgKjxwPgogCSAqIEZvciBleGFtcGxlLCByZXNvbHV0aW9uIG9mIDxjb2RlPiJPYmplY3QiPC9jb2RlPiB3b3VsZCB0eXBpY2FsbHkgcmV0dXJuCiAJICogPGNvZGU+e3siamF2YS5sYW5nIiwgIk9iamVjdCJ9fTwvY29kZT4uIEFub3RoZXIgcmVzb2x1dGlvbiB0aGF0IHJldHVybnMKLQkgKiA8Y29kZT57eyIiLCAiWC5Jbm5lciJ9fTwvY29kZT4gcmVwcmVzZW50cyB0aGUgaW5uZXIgdHlwZSBJbm5lciBkZWZpbmVkIGluIHR5cGUgWCBpbiB0aGUgCisJICogPGNvZGU+e3siIiwgIlguSW5uZXIifX08L2NvZGU+IHJlcHJlc2VudHMgdGhlIGlubmVyIHR5cGUgSW5uZXIgZGVmaW5lZCBpbiB0eXBlIFggaW4gdGhlCiAJICogZGVmYXVsdCBwYWNrYWdlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgZ2l2ZW4gdHlwZSBuYW1lCiAJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCi0JICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSByZXNvbHZlIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgcmVzb2x2ZSBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLgogCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHR5cGUgbmFtZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGZpbmQgYW55IG1hdGNoaW5nIHR5cGUKIAkgKiBAc2VlICNnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyKQogCSAqIEBzaW5jZSAzLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeS5qYXZhCmluZGV4IDUxYzk3MzIuLjUxZjA3NTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVIaWVyYXJjaHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwyNCArMjEsMjUgQEAKICAqIGNyZWF0ZWQgc3VjaCB0aGF0IHRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgaXMgYWx3YXlzIGluY2x1ZGVkLiBGb3IgZXhhbXBsZSwgaWYgYSB0eXBlCiAgKiBoaWVyYXJjaHkgaXMgY3JlYXRlZCBmb3IgYSA8Y29kZT5qYXZhLmlvLkZpbGU8L2NvZGU+LCBhbmQgdGhlIHJlZ2lvbiB0aGUgaGllcmFyY2h5IHdhcwogICogY3JlYXRlZCBpbiBpcyB0aGUgcGFja2FnZSBmcmFnbWVudCA8Y29kZT5qYXZhLmlvPC9jb2RlPiwgdGhlIHN1cGVydHlwZQotICogPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gd2lsbCBzdGlsbCBiZSBpbmNsdWRlZC4KKyAqIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQuIEFzIGEgaGlzdG9yaWNhbCBxdWlyaywKKyAqIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IGhhcyBhbHdheXMgYmVlbiBpbmNsdWRlZCBpbiB0eXBlIGhpZXJhcmNoaWVzCisgKiBjcmVhdGVkIG9uIGludGVyZmFjZSB0eXBlcy4KICAqIDxwPgotICogQSB0eXBlIGhpZXJhcmNoeSBpcyBzdGF0aWMgYW5kIGNhbiBiZWNvbWUgc3RhbGUuIEFsdGhvdWdoIGNvbnNpc3RlbnQgd2hlbiAKKyAqIEEgdHlwZSBoaWVyYXJjaHkgaXMgc3RhdGljIGFuZCBjYW4gYmVjb21lIHN0YWxlLiBBbHRob3VnaCBjb25zaXN0ZW50IHdoZW4KICAqIGNyZWF0ZWQsIGl0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdHJhY2sgY2hhbmdlcyBpbiB0aGUgbW9kZWwuCiAgKiBBcyBjaGFuZ2VzIGluIHRoZSBtb2RlbCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlIHRoZSBoaWVyYXJjaHksIGNoYW5nZSBub3RpZmljYXRpb25zCiAgKiBhcmUgc2VudCB0byByZWdpc3RlcmVkIDxjb2RlPklUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyPC9jb2RlPnMuIExpc3RlbmVycyBzaG91bGQKICAqIHVzZSB0aGUgPGNvZGU+ZXhpc3RzPC9jb2RlPiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBoaWVyYXJjaHkgaGFzIGJlY29tZSBjb21wbGV0ZWx5CiAgKiBpbnZhbGlkIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdHlwZSBvciBwcm9qZWN0IHRoZSBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgb24KLSAqIGhhcyBiZWVuIHJlbW92ZWQpLiBUbyByZWZyZXNoIGEgaGllcmFyY2h5LCB1c2UgdGhlIDxjb2RlPnJlZnJlc2g8L2NvZGU+IG1ldGhvZC4gCisgKiBoYXMgYmVlbiByZW1vdmVkKS4gVG8gcmVmcmVzaCBhIGhpZXJhcmNoeSwgdXNlIHRoZSA8Y29kZT5yZWZyZXNoPC9jb2RlPiBtZXRob2QuCiAgKiA8L3A+CiAgKiA8cD4KICAqIFRoZSB0eXBlIGhpZXJhcmNoeSBtYXkgY29udGFpbiBjeWNsZXMgZHVlIHRvIG1hbGZvcm1lZCBzdXBlcnR5cGUgZGVjbGFyYXRpb25zLgogICogTW9zdCB0eXBlIGhpZXJhcmNoeSBxdWVyaWVzIGFyZSBvYmxpdmlvdXMgdG8gY3ljbGVzOyB0aGUgPGNvZGU+Z2V0QWxsKiA8L2NvZGU+CiAgKiBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBzdWNoIHRoYXQgdGhleSBhcmUgdW5hZmZlY3RlZCBieSBjeWNsZXMuCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJVHlwZUhpZXJhcmNoeSB7CiAvKioKQEAgLTUxLDcgKzUyLDcgQEAKIHZvaWQgYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcihJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBwYXJ0IG9mIHRoaXMgaGllcmFyY2h5LgotICogCisgKgogICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBwYXJ0IG9mIHRoaXMgaGllcmFyY2h5LCBmYWxzZSBvdGhlcndpc2UKICAqLwpAQCAtNjUsNyArNjYsNyBAQAogICogUmV0dXJucyBhbGwgY2xhc3NlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgsIGluIG5vIHBhcnRpY3VsYXIKICAqIG9yZGVyLiBBbnkgY2xhc3NlcyBpbiB0aGUgY3JlYXRpb24gcmVnaW9uIHdoaWNoIHdlcmUgbm90IHJlc29sdmVkIHRvCiAgKiBoYXZlIGFueSBzdWJ0eXBlcyBvciBzdXBlcnR5cGVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KLSAqIAorICoKICAqIEByZXR1cm4gYWxsIGNsYXNzZXMgaW4gdGhpcyB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoCiAgKi8KIElUeXBlW10gZ2V0QWxsQ2xhc3NlcygpOwpAQCAtNzMsNyArNzQsNyBAQAogICogUmV0dXJucyBhbGwgaW50ZXJmYWNlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgsIGluIG5vIHBhcnRpY3VsYXIKICAqIG9yZGVyLiBBbnkgaW50ZXJmYWNlcyBpbiB0aGUgY3JlYXRpb24gcmVnaW9uIHdoaWNoIHdlcmUgbm90IHJlc29sdmVkIHRvCiAgKiBoYXZlIGFueSBzdWJ0eXBlcyBvciBzdXBlcnR5cGVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KLSAqIAorICoKICAqIEByZXR1cm4gYWxsIGludGVyZmFjZXMgaW4gdGhpcyB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoCiAgKi8KIElUeXBlW10gZ2V0QWxsSW50ZXJmYWNlcygpOwpAQCAtODMsNyArODQsNyBAQAogICogdHlwZXMgaW4gdGhpcyB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLiBBbiBlbXB0eSBhcnJheQogICogaXMgcmV0dXJuZWQgaWYgdGhlcmUgYXJlIG5vIHJlc29sdmVkIHN1YnR5cGVzIGZvciB0aGUKICAqIGdpdmVuIHR5cGUuCi0gKiAKKyAqCiAgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQogICogQHJldHVybiBhbGwgcmVzb2x2ZWQgc3VidHlwZXMgKGRpcmVjdCBhbmQgaW5kaXJlY3QpIG9mIHRoZSBnaXZlbiB0eXBlCiAgKi8KQEAgLTk4LDcgKzk5LDcgQEAKICAqIHF1ZXJ5IHRoZSBoaWVyYXJjaHkgZm9yIHN1cGVyY2xhc3NlcyB0aGFuIHRvIHF1ZXJ5IGEgY2xhc3MgcmVjdXJzaXZlbHkgdXAKICAqIHRoZSBzdXBlcmNsYXNzIGNoYWluLiBRdWVyeWluZyBhbiBlbGVtZW50IHBlcmZvcm1zIGEgZHluYW1pYyByZXNvbHV0aW9uLAogICogd2hlcmVhcyB0aGUgaGllcmFyY2h5IHJldHVybnMgYSBwcmUtY29tcHV0ZWQgcmVzdWx0LgotICogCisgKgogICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKICAqIEByZXR1cm4gYWxsIHJlc29sdmVkIHN1cGVyY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gY2xhc3MsIGluIGJvdHRvbS11cCBvcmRlciwgYW4gZW1wdHkKICAqIGFycmF5IGlmIG5vbmUuCkBAIC0xMTQsNyArMTE1LDcgQEAKICAqIHF1ZXJ5IHRoZSBoaWVyYXJjaHkgZm9yIHN1cGVyaW50ZXJmYWNlcyB0aGFuIHRvIHF1ZXJ5IGEgdHlwZSByZWN1cnNpdmVseS4KICAqIFF1ZXJ5aW5nIGFuIGVsZW1lbnQgcGVyZm9ybXMgYSBkeW5hbWljIHJlc29sdXRpb24sCiAgKiB3aGVyZWFzIHRoZSBoaWVyYXJjaHkgcmV0dXJucyBhIHByZS1jb21wdXRlZCByZXN1bHQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQogICogQHJldHVybiBhbGwgcmVzb2x2ZWQgc3VwZXJpbnRlcmZhY2VzIChkaXJlY3QgYW5kIGluZGlyZWN0KSBvZiB0aGUgZ2l2ZW4gdHlwZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQogICovCkBAIC0xMjUsMTMgKzEyNiwxMyBAQAogICogaXMgcmV0dXJuZWQgaWYgdGhlcmUgYXJlIG5vIHJlc29sdmVkIHN1cGVydHlwZXMgZm9yIHRoZQogICogZ2l2ZW4gdHlwZS4KICAqIDxwPgotICogTm90ZSB0aGF0IDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IGlzIE5PVCBjb25zaWRlcmVkIHRvIGJlIGEgc3VwZXJ0eXBlIAorICogTm90ZSB0aGF0IDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IGlzIE5PVCBjb25zaWRlcmVkIHRvIGJlIGEgc3VwZXJ0eXBlCiAgKiBvZiBhbnkgaW50ZXJmYWNlIHR5cGUuCiAgKiA8L3A+PHA+Tk9URTogb25jZSBhIHR5cGUgaGllcmFyY2h5IGhhcyBiZWVuIGNyZWF0ZWQsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvCiAgKiBxdWVyeSB0aGUgaGllcmFyY2h5IGZvciBzdXBlcnR5cGVzIHRoYW4gdG8gcXVlcnkgYSB0eXBlIHJlY3Vyc2l2ZWx5IHVwCiAgKiB0aGUgc3VwZXJ0eXBlIGNoYWluLiBRdWVyeWluZyBhbiBlbGVtZW50IHBlcmZvcm1zIGEgZHluYW1pYyByZXNvbHV0aW9uLAogICogd2hlcmVhcyB0aGUgaGllcmFyY2h5IHJldHVybnMgYSBwcmUtY29tcHV0ZWQgcmVzdWx0LgotICogCisgKgogICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKICAqIEByZXR1cm4gYWxsIHJlc29sdmVkIHN1cGVydHlwZXMgb2YgdGhlIGdpdmVuIGNsYXNzLCBpbiBib3R0b20tdXAgb3JkZXIsIGFuIGVtcHR5IGFycmF5CiAgKiBpZiBub25lCkBAIC0xNDEsMTUgKzE0MiwxNSBAQAogICogUmV0dXJucyBhbGwgdHlwZXMgaW4gdGhpcyB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLCBpbiBubyBwYXJ0aWN1bGFyCiAgKiBvcmRlci4gQW55IHR5cGVzIGluIHRoZSBjcmVhdGlvbiByZWdpb24gd2hpY2ggd2VyZSBub3QgcmVzb2x2ZWQgdG8KICAqIGhhdmUgYW55IHN1YnR5cGVzIG9yIHN1cGVydHlwZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgotICogCi0gKiBAcmV0dXJuIGFsbCB0eXBlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcAorICoKKyAqIEByZXR1cm4gYWxsIHR5cGVzIGluIHRoaXMgdHlwZSBoaWVyYXJjaHkncyBncmFwaAogICovCiBJVHlwZVtdIGdldEFsbFR5cGVzKCk7CiAKIC8qKgogICogUmV0dXJuIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHR5cGUgKHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gPGNvZGU+SU1lbWJlci5nZXRGbGFncygpPC9jb2RlPiksCiAgKiBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhpcyBpbmZvcm1hdGlvbiB3YXNuJ3QgY2FjaGVkIG9uIHRoZSBoaWVyYXJjaHkgZHVyaW5nIGl0cyBjb21wdXRhdGlvbi4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCiAgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBmbGFncyBmb3IgdGhpcyBtZW1iZXIKICAqIEBzZWUgRmxhZ3MKQEAgLTE2Myw4ICsxNjQsOCBAQAogICogaGllcmFyY2h5J3MgZ3JhcGguCiAgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgdGhlIGdpdmVuIHR5cGUgaXMgYSBjbGFzcywgb3IKICAqIGlmIG5vIGludGVyZmFjZXMgd2VyZSByZXNvbHZlZCB0byBleHRlbmQgdGhlIGdpdmVuIGludGVyZmFjZS4KLSAqIAotICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUgCisgKgorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKICAqIEByZXR1cm4gYWxsIGludGVyZmFjZXMgcmVzb2x2ZWQgdG8gZXh0ZW5kIHRoZSBnaXZlbiBpbnRlcmZhY2UgbGltaXRlZCB0byB0aGUgaW50ZXJmYWNlcyBpbiB0aGlzCiAgKiBoaWVyYXJjaHkncyBncmFwaCwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KICAqLwpAQCAtMTc1LDggKzE3Niw4IEBACiAgKiBoaWVyYXJjaHkncyAgZ3JhcGguIFJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhCiAgKiBjbGFzcywgb3IgaWYgbm8gY2xhc3NlcyB3ZXJlIHJlc29sdmVkIHRvIGltcGxlbWVudCB0aGUgZ2l2ZW4KICAqIGludGVyZmFjZS4KLSAqIAotICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUgCisgKgorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKICAqIEByZXR1cm4gYWxsIGNsYXNzZXMgcmVzb2x2ZWQgdG8gaW1wbGVtZW50IHRoZSBnaXZlbiBpbnRlcmZhY2UgbGltaXRlZCB0byB0aGUgY2xhc3NlcyBpbiB0aGlzIHR5cGUKICAqIGhpZXJhcmNoeSdzICBncmFwaCwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQogICovCkBAIC0xODQsMTQgKzE4NSwxNCBAQAogLyoqCiAgKiBSZXR1cm5zIGFsbCBjbGFzc2VzIGluIHRoZSBncmFwaCB3aGljaCBoYXZlIG5vIHJlc29sdmVkIHN1cGVyY2xhc3MsCiAgKiBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotICogCisgKgogICogQHJldHVybiBhbGwgY2xhc3NlcyBpbiB0aGUgZ3JhcGggd2hpY2ggaGF2ZSBubyByZXNvbHZlZCBzdXBlcmNsYXNzCiAgKi8KIElUeXBlW10gZ2V0Um9vdENsYXNzZXMoKTsKIC8qKgogICogUmV0dXJucyBhbGwgaW50ZXJmYWNlcyBpbiB0aGUgZ3JhcGggd2hpY2ggaGF2ZSBubyByZXNvbHZlZCBzdXBlcmludGVyZmFjZXMsCiAgKiBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotICogCisgKgogICogQHJldHVybiBhbGwgaW50ZXJmYWNlcyBpbiB0aGUgZ3JhcGggd2hpY2ggaGF2ZSBubyByZXNvbHZlZCBzdXBlcmludGVyZmFjZXMKICAqLwogSVR5cGVbXSBnZXRSb290SW50ZXJmYWNlcygpOwpAQCAtMjAyLDcgKzIwMyw3IEBACiAgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgdGhlIGdpdmVuIHR5cGUgaXMgYW4gaW50ZXJmYWNlLAogICogb3IgaWYgbm8gY2xhc3NlcyB3ZXJlIHJlc29sdmVkIHRvIGJlIHN1YmNsYXNzZXMgb2YgdGhlIGdpdmVuCiAgKiBjbGFzcy4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCiAgKiBAcmV0dXJuIHRoZSBkaXJlY3QgcmVzb2x2ZWQgc3ViY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gY2xhc3MgbGltaXRlZCB0byB0aGUgY2xhc3NlcyBpbiB0aGlzCiAgKiB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLCBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUuCkBAIC0yMTMsMjIgKzIxNCwyMiBAQAogICogaW4gbm8gcGFydGljdWxhciBvcmRlciwgbGltaXRlZCB0byB0aGUgdHlwZXMgaW4gdGhpcwogICogdHlwZSBoaWVyYXJjaHkncyBncmFwaC4KICAqIElmIHRoZSB0eXBlIGlzIGEgY2xhc3MsIHRoaXMgcmV0dXJucyB0aGUgcmVzb2x2ZWQgc3ViY2xhc3Nlcy4KLSAqIElmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZSwgdGhpcyByZXR1cm5zIGJvdGggdGhlIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IAorICogSWYgdGhlIHR5cGUgaXMgYW4gaW50ZXJmYWNlLCB0aGlzIHJldHVybnMgYm90aCB0aGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQKICAqIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBpbnRlcmZhY2VzIHdoaWNoIGV4dGVuZCBpdC4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCiAgKiBAcmV0dXJuIHRoZSBkaXJlY3QgcmVzb2x2ZWQgc3VidHlwZXMgb2YgdGhlIGdpdmVuIHR5cGUgbGltaXRlZCB0byB0aGUgdHlwZXMgaW4gdGhpcwogICogdHlwZSBoaWVyYXJjaHkncyBncmFwaAogICovCiBJVHlwZVtdIGdldFN1YnR5cGVzKElUeXBlIHR5cGUpOwogLyoqCi0gKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBzdXBlcmNsYXNzIG9mIHRoZSBnaXZlbiBjbGFzcywgCisgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBzdXBlcmNsYXNzIG9mIHRoZSBnaXZlbiBjbGFzcywKICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiBjbGFzcyBoYXMgbm8gc3VwZXJjbGFzcywKICAqIHRoZSBzdXBlcmNsYXNzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCwgb3IgaWYgdGhlIGdpdmVuCiAgKiB0eXBlIGlzIGFuIGludGVyZmFjZS4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCi0gKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBzdXBlcmNsYXNzIG9mIHRoZSBnaXZlbiBjbGFzcywgCisgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBzdXBlcmNsYXNzIG9mIHRoZSBnaXZlbiBjbGFzcywKICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiBjbGFzcyBoYXMgbm8gc3VwZXJjbGFzcywKICAqIHRoZSBzdXBlcmNsYXNzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCwgb3IgaWYgdGhlIGdpdmVuCiAgKiB0eXBlIGlzIGFuIGludGVyZmFjZQpAQCAtMjQwLDcgKzI0MSw3IEBACiAgKiBoaWVyYXJjaHkncyBncmFwaC4KICAqIEZvciBjbGFzc2VzLCB0aGlzIGdpdmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhlIGNsYXNzIGltcGxlbWVudHMuCiAgKiBGb3IgaW50ZXJmYWNlcywgdGhpcyBnaXZlcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoZSBpbnRlcmZhY2UgZXh0ZW5kcy4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCiAgKiBAcmV0dXJuIHRoZSBkaXJlY3QgcmVzb2x2ZWQgaW50ZXJmYWNlcyB0aGF0IHRoZSBnaXZlbiB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcyBsaW1pdGVkIHRvIHRoZSBpbnRlcmZhY2VzIGluIHRoaXMgdHlwZQogICogaGllcmFyY2h5J3MgZ3JhcGgKQEAgLTI1MSwxMCArMjUyLDEwIEBACiAgKiBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLCBsaW1pdGVkIHRvIHRoZSB0eXBlcyBpbiB0aGlzCiAgKiB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLgogICogRm9yIGNsYXNzZXMsIHRoaXMgcmV0dXJucyBpdHMgc3VwZXJjbGFzcyBhbmQgdGhlIGludGVyZmFjZXMgdGhhdCB0aGUgY2xhc3MgaW1wbGVtZW50cy4KLSAqIEZvciBpbnRlcmZhY2VzLCB0aGlzIHJldHVybnMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGUgaW50ZXJmYWNlIGV4dGVuZHMuIEFzIGEgY29uc2VxdWVuY2UgCi0gKiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBpcyBOT1QgY29uc2lkZXJlZCB0byBiZSBhIHN1cGVydHlwZSBvZiBhbnkgaW50ZXJmYWNlIAorICogRm9yIGludGVyZmFjZXMsIHRoaXMgcmV0dXJucyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoZSBpbnRlcmZhY2UgZXh0ZW5kcy4gQXMgYSBjb25zZXF1ZW5jZQorICogPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gaXMgTk9UIGNvbnNpZGVyZWQgdG8gYmUgYSBzdXBlcnR5cGUgb2YgYW55IGludGVyZmFjZQogICogdHlwZS4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCiAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIG9mIHRoZSBnaXZlbiB0eXBlIGxpbWl0ZWQgdG8gdGhlIHR5cGVzIGluIHRoaXMKICAqIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgKQEAgLTI2Myw3ICsyNjQsNyBAQAogLyoqCiAgKiBSZXR1cm5zIHRoZSB0eXBlIHRoaXMgaGllcmFyY2h5IHdhcyBjb21wdXRlZCBmb3IuCiAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaGllcmFyY2h5IHdhcyBjb21wdXRlZCBmb3IgYSByZWdpb24uCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSB0eXBlIHRoaXMgaGllcmFyY2h5IHdhcyBjb21wdXRlZCBmb3IKICAqLwogSVR5cGUgZ2V0VHlwZSgpOwpAQCAtMjc2LDcgKzI3Nyw3IEBACiB2b2lkIHJlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogLyoqCiAgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgdHlwZSBoaWVyYXJjaHkuCi0gKiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KKyAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgogICoKICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKICAqLwpAQCAtMjg1LDE0ICsyODYsMTQgQEAKICAqIFN0b3JlcyB0aGUgdHlwZSBoaWVyYXJjaHkgaW4gYW4gb3V0cHV0IHN0cmVhbS4gVGhpcyBzdG9yZWQgaGllcmFyY2h5IGNhbiBiZSBsb2FkIGJ5CiAgKiBJVHlwZSNsb2FkVHlwZUhpZXJhY2h5KElKYXZhUHJvamVjdCwgSW5wdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpLgogICogTGlzdGVuZXJzIG9mIHRoaXMgaGllcmFyY2h5IGFyZSBub3Qgc3RvcmVkLgotICogCisgKgogICogT25seSBoaWVyYXJjaGllcyBjcmVhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgc3RvcmU6CiAgKiA8dWw+CiAgKiA8bGk+SVR5cGUjbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IpPC9saT4KICAqIDxsaT5JVHlwZSNuZXdUeXBlSGllcmFyY2h5KElKYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvcik8L2xpPgogICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvcik8L2xpPgogICogPC91bD4KLSAqIAorICoKICAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gb3V0cHV0IHN0cmVhbSB3aGVyZSB0aGUgaGllcmFyY2h5IHdpbGwgYmUgc3RvcmVkCiAgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdW5hYmxlIHRvIHN0b3JlIHRoZSBoaWVyYXJjaHkgaW4gdGhlIG91cHV0IHN0cmVhbQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyLmphdmEKaW5kZXggNWI0M2YxZC4uNWQ1MmY4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDcgKzIyLDcgQEAKIAkgKiBOb3RpZmllcyB0aGF0IHRoZSBnaXZlbiB0eXBlIGhpZXJhcmNoeSBoYXMgY2hhbmdlZCBpbiBzb21lIHdheSBhbmQgc2hvdWxkCiAJICogYmUgcmVmcmVzaGVkIGF0IHNvbWUgcG9pbnQgdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YKIAkgKiB0aGUgSmF2YSBtb2RlbC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlSGllcmFyY2h5IHRoZSBnaXZlbiB0eXBlIGhpZXJhcmNoeQogCSAqLwogCXZvaWQgdHlwZUhpZXJhcmNoeUNoYW5nZWQoSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZVBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVQYXJhbWV0ZXIuamF2YQppbmRleCAxMmI1MWVmLi4zZmU4ZDFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZVBhcmFtZXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlUGFyYW1ldGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsNyArMTIsNyBAQAogCiAKIC8qKgotICogUmVwcmVzZW50cyBhIHR5cGUgcGFyYW1ldGVyIGRlZmluZWQgYnkgYSB0eXBlIG9mIGEgbWV0aG9kCisgKiBSZXByZXNlbnRzIGEgdHlwZSBwYXJhbWV0ZXIgZGVmaW5lZCBieSBhIHR5cGUgb3IgYSBtZXRob2QKICAqIGluIGEgY29tcGlsYXRpb24gdW5pdCBvciBhIGNsYXNzIGZpbGUuCiAgKiA8cD4KICAqIFR5cGUgcGFyYW1ldGVycyBhcmUgb2J0YWluZWQgdXNpbmcge0BsaW5rIElUeXBlI2dldFR5cGVQYXJhbWV0ZXIoU3RyaW5nKX0gYW5kCkBAIC0yMiwxMSArMjIsOSBAQAogICogb2YgdGhlIHR5cGUgcGFyYW1ldGVycyB1c2Uge0BsaW5rIElUeXBlI2dldFR5cGVQYXJhbWV0ZXJzKCl9IGZvciBhIHR5cGUgYW5kIHVzZQogICoge0BsaW5rIElNZXRob2QjZ2V0VHlwZVBhcmFtZXRlcnMoKX0gZm9yIGEgbWV0aG9kLgogICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KICAqCiAgKiBAc2luY2UgMy4xCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElTb3VyY2VSZWZlcmVuY2UgewogCkBAIC0zNiwxMiArMzQsMjcgQEAKIAkgKiBzb3VyY2UgKHdpdGhvdXQgdGhlIDxjb2RlPmV4dGVuZHM8L2NvZGU+IGtleXdvcmQpIGlmIHRoZSB0eXBlIHBhcmFtZXRlciBjb21lcyBmcm9tIGEKIAkgKiBjb21waWxhdGlvbiB1bml0LiBJdCBpcyB0aGUgZG90LXNlcGFyYXRlZCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgaWYgdGhlIHR5cGUKIAkgKiBwYXJhbWV0ZXIgY29tZXMgZnJvbSBhIGNsYXNzIGZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYm91bmRzCiAJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCiAJICovCiAJU3RyaW5nW10gZ2V0Qm91bmRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpZ25hdHVyZXMgZm9yIHRoaXMgdHlwZSBwYXJhbWV0ZXIncyBib3VuZHMuIFRoZSB0eXBlIHBhcmFtZXRlciBtYXkgaGF2ZSAKKwkgKiBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgYSB0eXBlIG9yIGEgbWV0aG9kLiBUaGUgc2lnbmF0dXJlcyByZXByZXNlbnQgb25seSB0aGUgaW5kaXZpZHVhbCAKKwkgKiBib3VuZHMgYW5kIGRvIG5vdCBpbmNsdWRlIHRoZSB0eXBlIHZhcmlhYmxlIG5hbWUgb3IgdGhlIDxjb2RlPmV4dGVuZHM8L2NvZGU+IGtleXdvcmQuICAKKwkgKiBUaGUgc2lnbmF0dXJlcyBtYXkgYmUgZWl0aGVyIHVucmVzb2x2ZWQgKGZvciBzb3VyY2UgdHlwZXMpIG9yIHJlc29sdmVkIChmb3IgYmluYXJ5IHR5cGVzKS4gCisJICogU2VlIHtAbGluayBTaWduYXR1cmV9IGZvciBkZXRhaWxzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZXMgZm9yIHRoZSBib3VuZHMgb2YgdGhpcyBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAc2VlIFNpZ25hdHVyZQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlTdHJpbmdbXSBnZXRCb3VuZHNTaWduYXR1cmVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBkZWNsYXJpbmcgbWVtYmVyIG9mIHRoaXMgdHlwZSBwYXJhbWV0ZXIuIFRoaXMgY2FuIGJlIGVpdGhlciBhbiA8Y29kZT5JVHlwZTwvY29kZT4KQEAgLTQ5LDIxICs2MiwxOSBAQAogCSAqIDxwPgogCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGVjbGFyaW5nIG1lbWJlciBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyLgogCSAqLwogCUlNZW1iZXIgZ2V0RGVjbGFyaW5nTWVtYmVyKCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyB0eXBlIHBhcmFtZXRlcidzIG5hbWUsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0eXBlIHBhcmFtZXRlciBkb2VzIG5vdCBoYXZlCi0JICogYXNzb2NpYXRlZCBzb3VyY2UgY29kZSAoZm9yIGV4YW1wbGUsIGluIGEgYmluYXJ5IHR5cGUpLgorCSAqIFJldHVybnMgdGhlIEphdmEgdHlwZSByb290IGluIHdoaWNoIHRoaXMgdHlwZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQuCisJICogPHA+CisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKiA8L3A+CiAJICoKLQkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KLQkgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyJ3MgbmFtZSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUKLQkgKiBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlIChmb3IgZXhhbXBsZSwgaW4gYSBiaW5hcnkgdHlwZSkKKwkgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgcm9vdCBpbiB3aGljaCB0aGlzIHR5cGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkCisJICogQHNpbmNlIDMuNwogCSAqLwotCUlTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCUlUeXBlUm9vdCBnZXRUeXBlUm9vdCgpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVSb290LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZVJvb3QuamF2YQppbmRleCAxZTE0ZmU0Li45N2ViZmY2IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZVJvb3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZVJvb3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwyOSArMTYsMjYgQEAKIC8qKgogICogUmVwcmVzZW50cyBhbiBlbnRpcmUgSmF2YSB0eXBlIHJvb3QgKGVpdGhlciBhbiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPgogICogb3IgYW4gPGNvZGU+SUNsYXNzRmlsZTwvY29kZT4pLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgogICoKICAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCBOb3RlIHRoYXQgbWV0aG9kcyB7QGxpbmsgI2ZpbmRQcmltYXJ5VHlwZSgpfSBhbmQge0BsaW5rICNnZXRFbGVtZW50QXQoaW50KX0KICAqIAl3ZXJlIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gdGhpcyBpbnRlcmZhY2UgcmVzcGVjdGl2ZWx5IHNpbmNlIHZlcnNpb24gMy4wIGFuZCB2ZXJzaW9uIDEuMC4KICAqIEBzZWUgSUNsYXNzRmlsZSBOb3RlIHRoYXQgbWV0aG9kIHtAbGluayAjZ2V0V29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcil9CiAgKiAJd2FzIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gdGhpcyBpbnRlcmZhY2Ugc2luY2UgdmVyc2lvbiAzLjAuCiAgKiBAc2luY2UgMy4zCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVR5cGVSb290IGV4dGVuZHMgSUphdmFFbGVtZW50LCBJUGFyZW50LCBJT3BlbmFibGUsIElTb3VyY2VSZWZlcmVuY2UsIElDb2RlQXNzaXN0IHsKIAogLyoqCiAgKiBGaW5kcyB0aGUgcHJpbWFyeSB0eXBlIG9mIHRoaXMgSmF2YSB0eXBlIHJvb3QgKHRoYXQgaXMsIHRoZSB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUKICAqIGNvbXBpbGF0aW9uIHVuaXQsIG9yIHRoZSB0eXBlIG9mIGEgY2xhc3MgZmlsZSksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggYSB0eXBlIGV4aXN0cy4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIGZvdW5kIHByaW1hcnkgdHlwZSBvZiB0aGlzIEphdmEgdHlwZSByb290LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGEgdHlwZSBleGlzdHMKICAqLwogSVR5cGUgZmluZFByaW1hcnlUeXBlKCk7CiAKIC8qKgotICogUmV0dXJucyB0aGUgc21hbGxlc3QgZWxlbWVudCB3aXRoaW4gdGhpcyBKYXZhIHR5cGUgcm9vdCB0aGF0IAorICogUmV0dXJucyB0aGUgc21hbGxlc3QgZWxlbWVudCB3aXRoaW4gdGhpcyBKYXZhIHR5cGUgcm9vdCB0aGF0CiAgKiBpbmNsdWRlcyB0aGUgZ2l2ZW4gc291cmNlIHBvc2l0aW9uICh0aGF0IGlzLCBhIG1ldGhvZCwgZmllbGQsIGV0Yy4pLCBvcgogICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBvdGhlciB0aGFuIHRoZSBKYXZhIHR5cGUgcm9vdAogICogaXRzZWxmIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgb3IgaWYgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG5vdApAQCAtNTEsMTYgKzQ4LDE2IEBACiAgKglleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQogICovCiBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudEF0KGludCBwb3NpdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogLyoqCiAgKiBSZXR1cm5zIGEgc2hhcmVkIHdvcmtpbmcgY29weSBvbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IgY2xhc3MgZmlsZSB1c2luZyB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5IG93bmVyIHRvIGNyZWF0ZQogICogdGhlIGJ1ZmZlci4gSWYgdGhpcyBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5IG9mIHRoZSBnaXZlbiBvd25lciwgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIHJldHVybmVkLgogICogVGhpcyBBUEkgY2FuIG9ubHkgYW5zd2VyIGFuIGFscmVhZHkgZXhpc3Rpbmcgd29ya2luZyBjb3B5IGlmIGl0IGlzIGJhc2VkIG9uIHRoZSBzYW1lCi0gKiBvcmlnaW5hbCBKYXZhIHR5cGUgcm9vdCBBTkQgd2FzIHVzaW5nIHRoZSBzYW1lIHdvcmtpbmcgY29weSBvd25lciAodGhhdCBpcywgYXMgZGVmaW5lZCBieSB7QGxpbmsgT2JqZWN0I2VxdWFsc30pLgkgCisgKiBvcmlnaW5hbCBKYXZhIHR5cGUgcm9vdCBBTkQgd2FzIHVzaW5nIHRoZSBzYW1lIHdvcmtpbmcgY29weSBvd25lciAodGhhdCBpcywgYXMgZGVmaW5lZCBieSB7QGxpbmsgT2JqZWN0I2VxdWFsc30pLgogICogPHA+CiAgKiBUaGUgbGlmZSB0aW1lIG9mIGEgc2hhcmVkIHdvcmtpbmcgY29weSBpcyBhcyBmb2xsb3dzOgogICogPHVsPgotICogPGxpPlRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayAjZ2V0V29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcil9IAorICogPGxpPlRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayAjZ2V0V29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcil9CiAgKiAJY3JlYXRlcyBhIG5ldyB3b3JraW5nIGNvcHkgZm9yIHRoaXMgZWxlbWVudDwvbGk+CiAgKiA8bGk+U3Vic2VxdWVudCBjYWxscyBpbmNyZW1lbnQgYW4gaW50ZXJuYWwgY291bnRlci48L2xpPgogICogPGxpPkEgY2FsbCB0byB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNkaXNjYXJkV29ya2luZ0NvcHkoKX0gZGVjcmVtZW50cyB0aGUgaW50ZXJuYWwgY291bnRlci48L2xpPgpAQCAtNjgsNyArNjUsNyBAQAogICogPC91bD4KICAqIFNvIHVzZXJzIG9mIHRoaXMgbWV0aG9kIG11c3QgZGlzY2FyZCBleGFjdGx5IG9uY2UgdGhlIHdvcmtpbmcgY29weS4KICAqIDxwPgotICogTm90ZSB0aGF0IHRoZSB3b3JraW5nIGNvcHkgb3duZXIgd2lsbCBiZSB1c2VkIGZvciB0aGUgbGlmZSB0aW1lIG9mIHRoZSBzaGFyZWQgd29ya2luZyBjb3B5LCB0aGF0IGlzIGlmIHRoZSAKKyAqIE5vdGUgdGhhdCB0aGUgd29ya2luZyBjb3B5IG93bmVyIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGxpZmUgdGltZSBvZiB0aGUgc2hhcmVkIHdvcmtpbmcgY29weSwgdGhhdCBpcyBpZiB0aGUKICAqIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW5lZCwgdGhpcyBvd25lciB3aWxsIGJlIHVzZWQuCiAgKiBUaGUgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHRoZSBvcmlnaW5hbCdzIEphdmEgdHlwZSByb290IGNvbnRlbnQgdXBvbiBjcmVhdGlvbi4KICAqIDxwPgpAQCAtODMsMTMgKzgwLDEzIEBACiAgKiBpZiB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5IG93bmVyIHJldHVybnMgYSBwcm9ibGVtIHJlcXVlc3RvciBmb3IgdGhpcyB3b3JraW5nIGNvcHkKICAqIChzZWUge0BsaW5rIFdvcmtpbmdDb3B5T3duZXIjZ2V0UHJvYmxlbVJlcXVlc3RvcihJQ29tcGlsYXRpb25Vbml0KX0pLgogICogPC9wPgotICogCi0gKiBAcGFyYW0gb3duZXIgdGhlIHdvcmtpbmcgY29weSBvd25lciB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgdGhhdCBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudCAKKyAqCisgKiBAcGFyYW0gb3duZXIgdGhlIHdvcmtpbmcgY29weSBvd25lciB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgdGhhdCBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudAogICogCQkJCW9mIHRoZSB3b3JraW5nIGNvcHkKICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyB3aGlsZSBvcGVuaW5nIHRoaXMgY29tcGlsYXRpb24gdW5pdAotICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCAKKyAqICAgICAgICAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQKICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCi0gKiAgIAlub3QgYmUgZGV0ZXJtaW5lZC4gCisgKiAgIAlub3QgYmUgZGV0ZXJtaW5lZC4KICAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgSmF2YSB0eXBlIHJvb3QgdXNpbmcgdGhlIGdpdmVuIG93bmVyIHRvIGNyZWF0ZQogICoJCXRoZSBidWZmZXIsIG9yIHRoaXMgSmF2YSB0eXBlIHJvb3QgaWYgaXQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weQogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCmluZGV4IGMzYjgwZDEuLmU3NTM3ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDcgQEAKICAqIGV4Y2VwdCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYW4gdW5kZXJseWluZyByZXNvdXJjZS4gQSB3b3JraW5nIGNvcHkgaXMgbm90CiAgKiB2aXNpYmxlIHRvIHRoZSByZXN0IG9mIHRoZSBKYXZhIG1vZGVsLiBDaGFuZ2VzIGluIGEgd29ya2luZyBjb3B5J3MKICAqIGJ1ZmZlciBhcmUgbm90IHJlYWxpemVkIGluIGEgcmVzb3VyY2UuIFRvIGJyaW5nIHRoZSBKYXZhIG1vZGVsIHVwLXRvLWRhdGUgd2l0aCBhIHdvcmtpbmcKLSAqIGNvcHkncyBjb250ZW50cywgYW4gZXhwbGljaXQgY29tbWl0IG11c3QgYmUgcGVyZm9ybWVkIG9uIHRoZSB3b3JraW5nIGNvcHkuIAorICogY29weSdzIGNvbnRlbnRzLCBhbiBleHBsaWNpdCBjb21taXQgbXVzdCBiZSBwZXJmb3JtZWQgb24gdGhlIHdvcmtpbmcgY29weS4KICAqIE90aGVyIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIGEgd29ya2luZyBjb3B5IHVwZGF0ZSB0aGUKICAqIGNvbnRlbnRzIG9mIHRoZSB3b3JraW5nIGNvcHkncyBidWZmZXIgYnV0IGRvIG5vdCBjb21taXQgdGhlIGNvbnRlbnRzCiAgKiBvZiB0aGUgd29ya2luZyBjb3B5LgpAQCAtMzksMjAgKzM5LDE5IEBACiAgKiBkZXN0cm95IG9yIGNsb3NlIGEgd29ya2luZyBjb3B5LiAoTm90ZSB0aGF0IGRlc3Ryb3lpbmcgYSB3b3JraW5nIGNvcHkKICAqIGRvZXMgbm90IGNvbW1pdCBpdCB0byB0aGUgbW9kZWwsIGl0IG9ubHkgZnJlZXMgdXAgdGhlIG1lbW9yeSBvY2N1cGllZCBieQogICogdGhlIGVsZW1lbnQpLiBBZnRlciBhIHdvcmtpbmcgY29weSBpcyBkZXN0cm95ZWQsIHRoZSB3b3JraW5nIGNvcHkgY2Fubm90Ci0gKiBiZSBhY2Nlc3NlZCBhZ2Fpbi4gTm9uLWhhbmRsZSBtZXRob2RzIHdpbGwgdGhyb3cgYSAKKyAqIGJlIGFjY2Vzc2VkIGFnYWluLiBOb24taGFuZGxlIG1ldGhvZHMgd2lsbCB0aHJvdyBhCiAgKiA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IGluZGljYXRpbmcgdGhlIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KICAqIDwvcD4KICAqIDxwPgogICogQSB3b3JraW5nIGNvcHkgY2Fubm90IGJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIHdvcmtpbmcgY29weS4KICAqIENhbGxpbmcgPGNvZGU+Z2V0V29ya2luZ0NvcHk8L2NvZGU+IG9uIGEgd29ya2luZyBjb3B5IHJldHVybnMgdGhlIHJlY2VpdmVyLgogICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCiAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElDb21waWxhdGlvblVuaXR9IGluc3RlYWQKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJV29ya2luZ0NvcHkgewotCQorCiAJLyoqCiAJICogQ29tbWl0cyB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkgdG8gaXRzIG9yaWdpbmFsIGVsZW1lbnQKIAkgKiBhbmQgdW5kZXJseWluZyByZXNvdXJjZSwgYnJpbmdpbmcgdGhlIEphdmEgbW9kZWwgdXAtdG8tZGF0ZSB3aXRoCkBAIC02MCw3ICs1OSw3IEBACiAJICoKIAkgKiA8cD5JdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkCiAJICogc2luY2UgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQsIGluIHdoaWNoIGNhc2UgdGhlcmUgaXMgYW4gdXBkYXRlIGNvbmZsaWN0LgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGFmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKIAkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgogCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IGFyZSBhcHBsaWVkIHRvCiAJICogCXRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGV2ZW4gdGhvdWdoIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGJlZm9yZQpAQCAtODQsNyArODMsNyBAQAogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNjb21taXRXb3JraW5nQ29weShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKX0gaW5zdGVhZC4KIAkgKi8KIAl2b2lkIGNvbW1pdChib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBEZXN0cm95cyB0aGlzIHdvcmtpbmcgY29weSwgY2xvc2luZyBpdHMgYnVmZmVyIGFuZCBkaXNjYXJkaW5nCiAJICogaXRzIHN0cnVjdHVyZS4gU3Vic2VxdWVudCBhdHRlbXB0cyB0byBhY2Nlc3Mgbm9uLWhhbmRsZSBpbmZvcm1hdGlvbgpAQCAtOTMsMjcgKzkyLDI3IEBACiAJICogPHA+CiAJICogSWYgdGhpcyB3b3JraW5nIGNvcHkgaXMgc2hhcmVkLCBpdCBpcyBkZXN0cm95ZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KIAkgKiA8Y29kZT5kZXN0cm95KCk8L2NvZGU+IGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gPGNvZGU+Ci0JICogZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPi4gCisJICogZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPi4KIAkgKiA8L3A+PHA+Ci0JICogV2hlbiBpdCBpcyBkZXN0cm95ZWQsIGEgUkVNT1ZFRCBJSmF2YUVsZW1lbnREZWx0YSBpcyByZXBvcnRlZCBvbiB0aGlzIAorCSAqIFdoZW4gaXQgaXMgZGVzdHJveWVkLCBhIFJFTU9WRUQgSUphdmFFbGVtZW50RGVsdGEgaXMgcmVwb3J0ZWQgb24gdGhpcwogCSAqIHdvcmtpbmcgY29weS4KIAkgKiA8L3A+CiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0I2Rpc2NhcmRXb3JraW5nQ29weSgpfSBpbnN0ZWFkLgogCSAqLwogCXZvaWQgZGVzdHJveSgpOwotCQorCiAJLyoqCi0JICogRmluZHMgdGhlIHNoYXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgZWxlbWVudCwgZ2l2ZW4gYSA8Y29kZT5JQnVmZmVyPC9jb2RlPiBmYWN0b3J5LiAKKwkgKiBGaW5kcyB0aGUgc2hhcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBlbGVtZW50LCBnaXZlbiBhIDxjb2RlPklCdWZmZXI8L2NvZGU+IGZhY3RvcnkuCiAJICogSWYgbm8gd29ya2luZyBjb3B5IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcwogCSAqIGJ1ZmZlciBmYWN0b3J5LCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIDxwPgotCSAqIFVzZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgbm90IGRlc3Ryb3kgdGhlIHJlc3VsdGluZyB3b3JraW5nIGNvcHkuIAotCSAqIAorCSAqIFVzZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgbm90IGRlc3Ryb3kgdGhlIHJlc3VsdGluZyB3b3JraW5nIGNvcHkuCisJICoKIAkgKiBAcGFyYW0gYnVmZmVyRmFjdG9yeSB0aGUgZ2l2ZW4gPGNvZGU+SUJ1ZmZlcjwvY29kZT4gZmFjdG9yeQogCSAqIEByZXR1cm4gdGhlIGZvdW5kIHNoYXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgZWxlbWVudCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBzZWUgSUJ1ZmZlckZhY3RvcnkKIAkgKiBAc2luY2UgMi4wCi0JICogCisJICoKIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElDb21waWxhdGlvblVuaXQjZmluZFdvcmtpbmdDb3B5KFdvcmtpbmdDb3B5T3duZXIpfSBpbnN0ZWFkLgogCSAqLwogCUlKYXZhRWxlbWVudCBmaW5kU2hhcmVkV29ya2luZ0NvcHkoSUJ1ZmZlckZhY3RvcnkgYnVmZmVyRmFjdG9yeSk7CkBAIC0xMjIsMjcgKzEyMSwyNyBAQAogCSAqIFJldHVybnMgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhlIHNwZWNpZmllZCB3b3JraW5nIGNvcHkgZWxlbWVudCB3YXMgY3JlYXRlZCBmcm9tLAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMgbm90IGEgd29ya2luZyBjb3B5IGVsZW1lbnQuICBUaGlzIGlzIGEgaGFuZGxlCiAJICogb25seSBtZXRob2QsIHRoZSByZXR1cm5lZCBlbGVtZW50IG1heSBvciBtYXkgbm90IGV4aXN0LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHdvcmtpbmdDb3B5RWxlbWVudCB0aGUgc3BlY2lmaWVkIHdvcmtpbmcgY29weSBlbGVtZW50CiAJICogQHJldHVybiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0aGUgc3BlY2lmaWVkIHdvcmtpbmcgY29weSBlbGVtZW50IHdhcyBjcmVhdGVkIGZyb20sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkgZWxlbWVudAotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJSmF2YUVsZW1lbnQjZ2V0UHJpbWFyeUVsZW1lbnQoKX0gaW5zdGVhZC4KIAkgKi8KIAlJSmF2YUVsZW1lbnQgZ2V0T3JpZ2luYWwoSUphdmFFbGVtZW50IHdvcmtpbmdDb3B5RWxlbWVudCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGZyb20sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGZyb20sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElDb21waWxhdGlvblVuaXQjZmluZFByaW1hcnlUeXBlKCl9IGluc3RlYWQuCisJICoKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElDb21waWxhdGlvblVuaXQjZ2V0UHJpbWFyeUVsZW1lbnQoKX0gaW5zdGVhZC4KIAkgKi8KIAlJSmF2YUVsZW1lbnQgZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JCi0JLyoqIAorCisJLyoqCiAJICogRmluZHMgdGhlIGVsZW1lbnRzIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvcnJlc3BvbmQgdG8KIAkgKiB0aGUgZ2l2ZW4gZWxlbWVudC4KIAkgKiBBbiBlbGVtZW50IEEgY29ycmVzcG9uZHMgdG8gYW4gZWxlbWVudCBCIGlmOgpAQCAtMTU2LDMxICsxNTUsMzEgQEAKIAkgKiA8L3VsPgogCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBqYXZhIGVsZW1lbnRzIGNhbiBiZSBmb3VuZAogCSAqIG9yIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZ2l2ZW4gZWxlbWVudAogCSAqIEByZXR1cm4gdGhlIGZvdW5kIGVsZW1lbnRzIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAc2luY2UgMi4wIAotCSAqIAorCSAqIEBzaW5jZSAyLjAKKwkgKgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNmaW5kRWxlbWVudHMoSUphdmFFbGVtZW50KX0gaW5zdGVhZC4KIAkgKi8KIAlJSmF2YUVsZW1lbnRbXSBmaW5kRWxlbWVudHMoSUphdmFFbGVtZW50IGVsZW1lbnQpOwotCQorCiAJLyoqCiAJICogRmluZHMgdGhlIHByaW1hcnkgdHlwZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgKHRoYXQgaXMsIHRoZSB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUKIAkgKiBjb21waWxhdGlvbiB1bml0KSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhIHR5cGUgZXhpc3RzLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZm91bmQgcHJpbWFyeSB0eXBlIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhIHR5cGUgZXhpc3RzCiAJICogQHNpbmNlIDIuMAotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJVHlwZVJvb3QjZmluZFByaW1hcnlUeXBlKCl9IGluc3RlYWQuCiAJICovCiAJSVR5cGUgZmluZFByaW1hcnlUeXBlKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgc2hhcmVkIHdvcmtpbmcgY29weSBvbiB0aGlzIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGZhY3RvcnkgdG8gY3JlYXRlCiAJICogdGhlIGJ1ZmZlciwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LgogCSAqIFRoaXMgQVBJIGNhbiBvbmx5IGFuc3dlciBhbiBhbHJlYWR5IGV4aXN0aW5nIHdvcmtpbmcgY29weSBpZiBpdCBpcyBiYXNlZCBvbiB0aGUgc2FtZQotCSAqIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgQU5EIHdhcyB1c2luZyB0aGUgc2FtZSBidWZmZXIgZmFjdG9yeSAodGhhdCBpcywgYXMgZGVmaW5lZCBieSA8Y29kZT5PYmplY3QuZXF1YWxzPC9jb2RlPikuCSAKKwkgKiBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0IEFORCB3YXMgdXNpbmcgdGhlIHNhbWUgYnVmZmVyIGZhY3RvcnkgKHRoYXQgaXMsIGFzIGRlZmluZWQgYnkgPGNvZGU+T2JqZWN0LmVxdWFsczwvY29kZT4pLgogCSAqIDxwPgogCSAqIFRoZSBsaWZlIHRpbWUgb2YgYSBzaGFyZWQgd29ya2luZyBjb3B5IGlzIGFzIGZvbGxvd3M6CiAJICogPHVsPgpAQCAtMTkyLDcgKzE5MSw3IEBACiAJICogPC91bD4KIAkgKiBTbyB1c2VycyBvZiB0aGlzIG1ldGhvZCBtdXN0IGRlc3Ryb3kgZXhhY3RseSBvbmNlIHRoZSB3b3JraW5nIGNvcHkuCiAJICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZSBidWZmZXIgZmFjdG9yeSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBsaWZlIHRpbWUgb2YgdGhpcyB3b3JraW5nIGNvcHksIHRoYXQgaXMgaWYgdGhlIAorCSAqIE5vdGUgdGhhdCB0aGUgYnVmZmVyIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIGZvciB0aGUgbGlmZSB0aW1lIG9mIHRoaXMgd29ya2luZyBjb3B5LCB0aGF0IGlzIGlmIHRoZQogCSAqIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW5lZCwgdGhpcyBmYWN0b3J5IHdpbGwgYmUgdXNlZC4KIAkgKiBUaGUgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHRoZSBvcmlnaW5hbCdzIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudAogCSAqIHVwb24gY3JlYXRpb24uCkBAIC0yMDEsMjAgKzIwMCwyMCBAQAogCSAqIHdvcmtpbmcgY29weS4KIAkgKgogCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyB3aGlsZSBvcGVuaW5nIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqICAgICAgICAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQgCisJICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZAogCSAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIGJ1ZmZlciB0aGF0IGlzIHVzZWQgdG8gZ2V0IHRoZSBjb250ZW50IG9mIHRoZSB3b3JraW5nIGNvcHkKIAkgKiAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGludGVybmFsIGZhY3Rvcnkgc2hvdWxkIGJlIHVzZWQKIAkgKiBAcGFyYW0gcHJvYmxlbVJlcXVlc3RvciBhIHJlcXVlc3RvciB3aGljaCB3aWxsIGdldCBub3RpZmllZCBvZiBwcm9ibGVtcyBkZXRlY3RlZCBkdXJpbmcKIAkgKiAJcmVjb25jaWxpbmcgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4gVGhlIHJlcXVlc3RvciBjYW4gYmUgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcKIAkgKiAJdGhhdCB0aGUgY2xpZW50IGlzIG5vdCBpbnRlcmVzdGVkIGluIHByb2JsZW1zLgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCi0JICogICBub3QgYmUgZGV0ZXJtaW5lZC4gCisJICogICBub3QgYmUgZGV0ZXJtaW5lZC4KIAkgKiBAcmV0dXJuIGEgc2hhcmVkIHdvcmtpbmcgY29weSBvbiB0aGlzIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGZhY3RvcnkgdG8gY3JlYXRlCiAJICogdGhlIGJ1ZmZlciwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5CiAJICogQHNlZSBJQnVmZmVyRmFjdG9yeQogCSAqIEBzZWUgSVByb2JsZW1SZXF1ZXN0b3IKIAkgKiBAc2luY2UgMi4wCi0JICogCisJICoKIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElDb21waWxhdGlvblVuaXQjZ2V0V29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2JsZW1SZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfSBpbnN0ZWFkLgogCSAqLwogCUlKYXZhRWxlbWVudCBnZXRTaGFyZWRXb3JraW5nQ29weSgKQEAgLTIyMiwxNSArMjIxLDE1IEBACiAJCUlCdWZmZXJGYWN0b3J5IGZhY3RvcnksCiAJCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCQorCiAJLyoqCiAJICogUmV0dXJucyBhIG5ldyB3b3JraW5nIGNvcHkgb2YgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBub3QKIAkgKiBhIHdvcmtpbmcgY29weSwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LgogCSAqIDxwPgotCSAqIE5vdGU6IGlmIGludGVuZGluZyB0byBzaGFyZSBhIHdvcmtpbmcgY29weSBhbW9uZ3N0IHNldmVyYWwgY2xpZW50cywgdGhlbiAKKwkgKiBOb3RlOiBpZiBpbnRlbmRpbmcgdG8gc2hhcmUgYSB3b3JraW5nIGNvcHkgYW1vbmdzdCBzZXZlcmFsIGNsaWVudHMsIHRoZW4KIAkgKiA8Y29kZT4jZ2V0U2hhcmVkV29ya2luZ0NvcHk8L2NvZGU+IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAJICogPC9wPjxwPgotCSAqIFdoZW4gdGhlIHdvcmtpbmcgY29weSBpbnN0YW5jZSBpcyBjcmVhdGVkLCBhbiBBRERFRCBJSmF2YUVsZW1lbnREZWx0YSBpcyAKKwkgKiBXaGVuIHRoZSB3b3JraW5nIGNvcHkgaW5zdGFuY2UgaXMgY3JlYXRlZCwgYW4gQURERUQgSUphdmFFbGVtZW50RGVsdGEgaXMKIAkgKiByZXBvcnRlZCBvbiB0aGlzIHdvcmtpbmcgY29weS4KIAkgKiA8L3A+PHA+CiAJICogU2luY2UgMi4xLCBhIHdvcmtpbmcgY29weSBjYW4gYmUgY3JlYXRlZCBvbiBhIG5vdC15ZXQgZXhpc3RpbmcgY29tcGlsYXRpb24KQEAgLTIzOCwyNiArMjM3LDI2IEBACiAJICogdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdC4KIAkgKiA8L3A+CiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWxlbWVudCBjYW4KLQkgKiAgIG5vdCBiZSBkZXRlcm1pbmVkLiAKKwkgKiAgIG5vdCBiZSBkZXRlcm1pbmVkLgogCSAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90CiAJICogYSB3b3JraW5nIGNvcHksIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weQotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0I2dldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IpfSBpbnN0ZWFkLgogCSAqLwogCUlKYXZhRWxlbWVudCBnZXRXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IHdvcmtpbmcgY29weSBvZiB0aGlzIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGZhY3RvcnkgdG8gY3JlYXRlCiAJICogdGhlIGJ1ZmZlciwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LgotCSAqIE5vdGUgdGhhdCB0aGlzIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIGZvciB0aGUgbGlmZSB0aW1lIG9mIHRoaXMgd29ya2luZyBjb3B5LCB0aGF0IGlzIGlmIHRoZSAKKwkgKiBOb3RlIHRoYXQgdGhpcyBmYWN0b3J5IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGxpZmUgdGltZSBvZiB0aGlzIHdvcmtpbmcgY29weSwgdGhhdCBpcyBpZiB0aGUKIAkgKiB3b3JraW5nIGNvcHkgaXMgY2xvc2VkIHRoZW4gcmVvcGVuZWQsIHRoaXMgZmFjdG9yeSB3aWxsIGJlIHJldXNlZC4KIAkgKiBUaGUgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHRoZSBvcmlnaW5hbCdzIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudAogCSAqIHVwb24gY3JlYXRpb24uCiAJICogPHA+Ci0JICogTm90ZTogaWYgaW50ZW5kaW5nIHRvIHNoYXJlIGEgd29ya2luZyBjb3B5IGFtb25nc3Qgc2V2ZXJhbCBjbGllbnRzLCB0aGVuIAorCSAqIE5vdGU6IGlmIGludGVuZGluZyB0byBzaGFyZSBhIHdvcmtpbmcgY29weSBhbW9uZ3N0IHNldmVyYWwgY2xpZW50cywgdGhlbgogCSAqIDxjb2RlPiNnZXRTaGFyZWRXb3JraW5nQ29weTwvY29kZT4gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KIAkgKiA8L3A+PHA+Ci0JICogV2hlbiB0aGUgd29ya2luZyBjb3B5IGluc3RhbmNlIGlzIGNyZWF0ZWQsIGFuIEFEREVEIElKYXZhRWxlbWVudERlbHRhIGlzIAorCSAqIFdoZW4gdGhlIHdvcmtpbmcgY29weSBpbnN0YW5jZSBpcyBjcmVhdGVkLCBhbiBBRERFRCBJSmF2YUVsZW1lbnREZWx0YSBpcwogCSAqIHJlcG9ydGVkIG9uIHRoaXMgd29ya2luZyBjb3B5LgogCSAqIDwvcD48cD4KIAkgKiBTaW5jZSAyLjEsIGEgd29ya2luZyBjb3B5IGNhbiBiZSBjcmVhdGVkIG9uIGEgbm90LXlldCBleGlzdGluZyBjb21waWxhdGlvbgpAQCAtMjY1LDE4ICsyNjQsMTggQEAKIAkgKiB0aGUgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0LgogCSAqIDwvcD4KIAkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3Mgd2hpbGUgb3BlbmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIAorCSAqICAgICAgICAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQKIAkgKiBAcGFyYW0gZmFjdG9yeSB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgdGhhdCBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudCBvZiB0aGUgd29ya2luZyBjb3B5CiAJICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnRlcm5hbCBmYWN0b3J5IHNob3VsZCBiZSB1c2VkCiAJICogQHBhcmFtIHByb2JsZW1SZXF1ZXN0b3IgYSByZXF1ZXN0b3Igd2hpY2ggd2lsbCBnZXQgbm90aWZpZWQgb2YgcHJvYmxlbXMgZGV0ZWN0ZWQgZHVyaW5nCiAJICogCXJlY29uY2lsaW5nIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuIFRoZSByZXF1ZXN0b3IgY2FuIGJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nCiAJICogCXRoYXQgdGhlIGNsaWVudCBpcyBub3QgaW50ZXJlc3RlZCBpbiBwcm9ibGVtcy4KIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBlbGVtZW50IGNhbgotCSAqICAgbm90IGJlIGRldGVybWluZWQuIAorCSAqICAgbm90IGJlIGRldGVybWluZWQuCiAJICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkgb2YgdGhpcyBlbGVtZW50IHVzaW5nIHRoZSBnaXZlbiBmYWN0b3J5IHRvIGNyZWF0ZQogCSAqIHRoZSBidWZmZXIsIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weQogCSAqIEBzaW5jZSAyLjAKLQkgKiAKKwkgKgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNnZXRXb3JraW5nQ29weShXb3JraW5nQ29weU93bmVyLCBJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQuCiAJICovCiAJSUphdmFFbGVtZW50IGdldFdvcmtpbmdDb3B5KApAQCAtMjg0LDMyICsyODMsMzIgQEAKIAkJSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSwKIAkJSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB3b3JraW5nIGNvcHkncyBvcmlnaW5hbCBlbGVtZW50J3MgY29udGVudAogCSAqIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgaW5jZXB0aW9uIG9mIHRoaXMgd29ya2luZyBjb3B5LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHJlc291cmNlIHRoaXMgd29ya2luZyBjb3B5J3MgcmVzb3VyY2UKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB3b3JraW5nIGNvcHkncyBvcmlnaW5hbCBlbGVtZW50J3MgY29udGVudAogCSAqIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgaW5jZXB0aW9uIG9mIHRoaXMgd29ya2luZyBjb3B5LCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKKwkgKgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdCNoYXNSZXNvdXJjZUNoYW5nZWQoKX0gaW5zdGVhZC4KIAkgKi8KIAlib29sZWFuIGlzQmFzZWRPbihJUmVzb3VyY2UgcmVzb3VyY2UpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSB3b3JraW5nIGNvcHksIGZhbHNlIG90aGVyd2lzZQotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0I2lzV29ya2luZ0NvcHkoKX0gaW5zdGVhZC4KIAkgKi8KIAlib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKLQkKKwogCS8qKgogCSAqIFJlY29uY2lsZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5LgotCSAqIEl0IHBlcmZvcm1zIHRoZSByZWNvbmNpbGlhdGlvbiBieSBsb2NhbGx5IGNhY2hpbmcgdGhlIGNvbnRlbnRzIG9mIAotCSAqIHRoZSB3b3JraW5nIGNvcHksIHVwZGF0aW5nIHRoZSBjb250ZW50cywgdGhlbiBjcmVhdGluZyBhIGRlbHRhIAorCSAqIEl0IHBlcmZvcm1zIHRoZSByZWNvbmNpbGlhdGlvbiBieSBsb2NhbGx5IGNhY2hpbmcgdGhlIGNvbnRlbnRzIG9mCisJICogdGhlIHdvcmtpbmcgY29weSwgdXBkYXRpbmcgdGhlIGNvbnRlbnRzLCB0aGVuIGNyZWF0aW5nIGEgZGVsdGEKIAkgKiBvdmVyIHRoZSBjYWNoZWQgY29udGVudHMgYW5kIHRoZSBuZXcgY29udGVudHMsIGFuZCBmaW5hbGx5IGZpcmluZwogCSAqIHRoaXMgZGVsdGEuCiAJICogPHA+CkBAIC0zMjksMTUgKzMyOCwxNSBAQAogCSAqIDxsaT4gVGhlIG9yaWdpbmFsIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgogCSAqIDwvdWw+CiAJICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0I3JlY29uY2lsZShpbnQsIGJvb2xlYW4sIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpfSBpbnN0ZWFkLgogCSAqLwogCUlNYXJrZXJbXSByZWNvbmNpbGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQorCiAJLyoqCiAJICogUmVjb25jaWxlcyB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkuCi0JICogSXQgcGVyZm9ybXMgdGhlIHJlY29uY2lsaWF0aW9uIGJ5IGxvY2FsbHkgY2FjaGluZyB0aGUgY29udGVudHMgb2YgCi0JICogdGhlIHdvcmtpbmcgY29weSwgdXBkYXRpbmcgdGhlIGNvbnRlbnRzLCB0aGVuIGNyZWF0aW5nIGEgZGVsdGEgCisJICogSXQgcGVyZm9ybXMgdGhlIHJlY29uY2lsaWF0aW9uIGJ5IGxvY2FsbHkgY2FjaGluZyB0aGUgY29udGVudHMgb2YKKwkgKiB0aGUgd29ya2luZyBjb3B5LCB1cGRhdGluZyB0aGUgY29udGVudHMsIHRoZW4gY3JlYXRpbmcgYSBkZWx0YQogCSAqIG92ZXIgdGhlIGNhY2hlZCBjb250ZW50cyBhbmQgdGhlIG5ldyBjb250ZW50cywgYW5kIGZpbmFsbHkgZmlyaW5nCiAJICogdGhpcyBkZWx0YS4KIAkgKiA8cD4KQEAgLTM2MCw3ICszNTksNyBAQAogCSAqIDxsaT4gVGhlIG9yaWdpbmFsIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgogCSAqIDwvdWw+CiAJICogQHNpbmNlIDIuMAotCSAqIAorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0I3JlY29uY2lsZShpbnQsIGJvb2xlYW4sIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpfSBpbnN0ZWFkLgogCSAqLwogCXZvaWQgcmVjb25jaWxlKGJvb2xlYW4gZm9yY2VQcm9ibGVtRGV0ZWN0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29udmVudGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCmluZGV4IGI2ZDllYmYuLjhhZTZmZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDIzICsyNSwyMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogCiAvKioKICAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGNoZWNraW5nIEphdmEtc3BlY2lmaWMgY29udmVudGlvbnMgc3VjaCBhcyBuYW1lIHN5bnRheC4KICAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgYW5kIGNvbnN0YW50cyBvbmx5LgogICogPC9wPgorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhQ29udmVudGlvbnMgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBET1Q9ICcuJzsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9JTkZPID0gbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2FubmVyIFNDQU5ORVIgPSBuZXcgU2Nhbm5lcihmYWxzZSAvKmNvbW1lbnQqLywgdHJ1ZSAvKndoaXRlc3BhY2UqLywgZmFsc2UgLypubHMqLywgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMyAvKnNvdXJjZUxldmVsKi8sIG51bGwvKnRhc2tUYWcqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZSAvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOwotCQorCiAJcHJpdmF0ZSBKYXZhQ29udmVudGlvbnMoKSB7CiAJCS8vIE5vdCBpbnN0YW50aWFibGUKIAl9CkBAIC02MiwxNCArNjEsNiBAQAogCQlpZiAocm9vdFBhdGgxID09IG51bGwgfHwgcm9vdFBhdGgyID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uMSA9IHJvb3RQYXRoMS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZyBleHRlbnNpb24yID0gcm9vdFBhdGgyLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYgKGV4dGVuc2lvbjEgIT0gbnVsbCAmJiAoZXh0ZW5zaW9uMS5lcXVhbHNJZ25vcmVDYXNlKFN1ZmZpeENvbnN0YW50cy5FWFRFTlNJT05fSkFSKSB8fCBleHRlbnNpb24xLmVxdWFsc0lnbm9yZUNhc2UoU3VmZml4Q29uc3RhbnRzLkVYVEVOU0lPTl9aSVApKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCQlpZiAoZXh0ZW5zaW9uMiAhPSBudWxsICYmIChleHRlbnNpb24yLmVxdWFsc0lnbm9yZUNhc2UoU3VmZml4Q29uc3RhbnRzLkVYVEVOU0lPTl9KQVIpIHx8IGV4dGVuc2lvbjIuZXF1YWxzSWdub3JlQ2FzZShTdWZmaXhDb25zdGFudHMuRVhURU5TSU9OX1pJUCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KIAkJcmV0dXJuIHJvb3RQYXRoMS5pc1ByZWZpeE9mKHJvb3RQYXRoMikgfHwgcm9vdFBhdGgyLmlzUHJlZml4T2Yocm9vdFBhdGgxKTsKIAl9CiAKQEAgLTg0LDEzICs3NSwxMyBAQAogCQl9CiAJCS8vIFNldCBzY2FubmVyIGZvciBnaXZlbiBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzCiAJCVNDQU5ORVIuc291cmNlTGV2ZWwgPSBzb3VyY2VMZXZlbCA9PSBudWxsID8gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMyA6IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChzb3VyY2VMZXZlbCk7Ci0JCVNDQU5ORVIuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZUxldmVsID09IG51bGwgPyBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zIDogQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2VMZXZlbCk7CQorCQlTQ0FOTkVSLmNvbXBsaWFuY2VMZXZlbCA9IGNvbXBsaWFuY2VMZXZlbCA9PSBudWxsID8gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMyA6IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjb21wbGlhbmNlTGV2ZWwpOwogCiAJCXRyeSB7CiAJCQlTQ0FOTkVSLnNldFNvdXJjZShpZC50b0NoYXJBcnJheSgpKTsKIAkJCWludCB0b2tlbiA9IFNDQU5ORVIuc2NhbklkZW50aWZpZXIoKTsKLQkJCWlmICh0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKSByZXR1cm4gbnVsbDsgCi0JCQlpZiAoU0NBTk5FUi5jdXJyZW50UG9zaXRpb24gPT0gU0NBTk5FUi5lb2ZQb3NpdGlvbikgeyAvLyB0byBoYW5kbGUgY2FzZSB3aGVyZSB3ZSBoYWQgYW4gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIAorCQkJaWYgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIpIHJldHVybiBudWxsOworCQkJaWYgKFNDQU5ORVIuY3VycmVudFBvc2l0aW9uID09IFNDQU5ORVIuZW9mUG9zaXRpb24pIHsgLy8gdG8gaGFuZGxlIGNhc2Ugd2hlcmUgd2UgaGFkIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCQkJCXRyeSB7CiAJCQkJCXJldHVybiBTQ0FOTkVSLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7CiAJCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKQEAgLTExMSwzMyArMTAyLDMzIEBACiAJICogQSBjb21waWxhdGlvbiB1bml0IG5hbWUgbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgcnVsZXM6CiAJICogPHVsPgogCSAqIDxsaT4gaXQgbXVzdCBub3QgYmUgbnVsbAotCSAqIDxsaT4gaXQgbXVzdCBiZSBzdWZmaXhlZCBieSBhIGRvdCAoJy4nKSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIAorCSAqIDxsaT4gaXQgbXVzdCBiZSBzdWZmaXhlZCBieSBhIGRvdCAoJy4nKSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCiAJICogICAgICAge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpIEphdmEtbGlrZSBleHRlbnNpb25zfQogCSAqIDxsaT4gaXRzIHByZWZpeCBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgotCSAqIDxsaT4gaXQgbXVzdCBub3QgY29udGFpbiBhbnkgY2hhcmFjdGVycyBvciBzdWJzdHJpbmdzIHRoYXQgYXJlIG5vdCB2YWxpZCAKKwkgKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQKIAkgKgkJICAgb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCiAJICogPC91bD4KIAkgKiA8L3A+CiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBjb21waWxhdGlvbiB1bml0CiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgY29tcGlsYXRpb24gdW5pdCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgY29tcGlsYXRpb24gdW5pdCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMKIAkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjdmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKFN0cmluZyBpZCwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKX0gaW5zdGVhZAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIHZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZShuYW1lLENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyxDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOwogCX0KLQkKKwogCS8qKgogCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IG5hbWUgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgogCSAqIDxwPgogCSAqIEEgY29tcGlsYXRpb24gdW5pdCBuYW1lIG11c3Qgb2JleSB0aGUgZm9sbG93aW5nIHJ1bGVzOgogCSAqIDx1bD4KIAkgKiA8bGk+IGl0IG11c3Qgbm90IGJlIG51bGwKLQkgKiA8bGk+IGl0IG11c3QgYmUgc3VmZml4ZWQgYnkgYSBkb3QgKCcuJykgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSAKKwkgKiA8bGk+IGl0IG11c3QgYmUgc3VmZml4ZWQgYnkgYSBkb3QgKCcuJykgZm9sbG93ZWQgYnkgb25lIG9mIHRoZQogCSAqICAgICAgIHtAbGluayBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKSBKYXZhLWxpa2UgZXh0ZW5zaW9uc30KIAkgKiA8bGk+IGl0cyBwcmVmaXggbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKLQkgKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisJICogPGxpPiBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkCiAJICoJCSAgIG9uIHRoZSBmaWxlIHN5c3RlbSBvbiB3aGljaCB3b3Jrc3BhY2Ugcm9vdCBpcyBsb2NhdGVkLgogCSAqIDwvdWw+CiAJICogPC9wPgpAQCAtMTQ1LDIyICsxMzYsMjIgQEAKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBjb21waWxhdGlvbiB1bml0IG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBjb21waWxhdGlvbiB1bml0IG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKSB7CiAJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fdW5pdF9udWxsTmFtZSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl91bml0X251bGxOYW1lLCBudWxsKTsKIAkJfQogCQlpZiAoIW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUobmFtZSkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fdW5pdF9ub3RKYXZhTmFtZSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl91bml0X25vdEphdmFOYW1lLCBudWxsKTsKIAkJfQogCQlTdHJpbmcgaWRlbnRpZmllcjsKIAkJaW50IGluZGV4OwogCQlpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKIAkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3VuaXRfbm90SmF2YU5hbWUsIG51bGwpOyAKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fdW5pdF9ub3RKYXZhTmFtZSwgbnVsbCk7CiAJCX0KIAkJaWRlbnRpZmllciA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKIAkJLy8gSlNSLTE3NSBtZXRhZGF0YSBzdHJvbmdseSByZWNvbW1lbmRzICJwYWNrYWdlLWluZm8uamF2YSIgYXMgdGhlCkBAIC0xODcsMTMgKzE3OCwxMyBAQAogCSAqIDxsaT4gaXQgbXVzdCBub3QgYmUgbnVsbAogCSAqIDxsaT4gaXQgbXVzdCBpbmNsdWRlIHRoZSA8Y29kZT4iLmNsYXNzIjwvY29kZT4gc3VmZml4CiAJICogPGxpPiBpdHMgcHJlZml4IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCi0JICogPGxpPiBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkIAorCSAqIDxsaT4gaXQgbXVzdCBub3QgY29udGFpbiBhbnkgY2hhcmFjdGVycyBvciBzdWJzdHJpbmdzIHRoYXQgYXJlIG5vdCB2YWxpZAogCSAqCQkgICBvbiB0aGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZC4KIAkgKiA8L3VsPgogCSAqIDwvcD4KIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIC5jbGFzcyBmaWxlCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgLmNsYXNzIGZpbGUgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIC5jbGFzcyBmaWxlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKIAkgKiBAc2luY2UgMi4wCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjdmFsaWRhdGVDbGFzc0ZpbGVOYW1lKFN0cmluZyBpZCwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKX0gaW5zdGVhZApAQCAtMjAxLDcgKzE5Miw3IEBACiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlQ2xhc3NGaWxlTmFtZShTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gdmFsaWRhdGVDbGFzc0ZpbGVOYW1lKG5hbWUsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMywgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gLmNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCiAJICogPHA+CkBAIC0yMTAsNyArMjAxLDcgQEAKIAkgKiA8bGk+IGl0IG11c3Qgbm90IGJlIG51bGwKIAkgKiA8bGk+IGl0IG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+Ii5jbGFzcyI8L2NvZGU+IHN1ZmZpeAogCSAqIDxsaT4gaXRzIHByZWZpeCBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgotCSAqIDxsaT4gaXQgbXVzdCBub3QgY29udGFpbiBhbnkgY2hhcmFjdGVycyBvciBzdWJzdHJpbmdzIHRoYXQgYXJlIG5vdCB2YWxpZCAKKwkgKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQKIAkgKgkJICAgb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCiAJICogPC91bD4KIAkgKiA8L3A+CkBAIC0yMTgsNyArMjA5LDcgQEAKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSAuY2xhc3MgZmlsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgLmNsYXNzIGZpbGUgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBzaW5jZSAzLjMKIAkgKi8KQEAgLTIyNiwxMyArMjE3LDEzIEBACiAJCWlmIChuYW1lID09IG51bGwpIHsKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fY2xhc3NGaWxlX251bGxOYW1lLCBudWxsKTsJCX0KIAkJaWYgKCFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShuYW1lKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9jbGFzc0ZpbGVfbm90Q2xhc3NGaWxlTmFtZSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9jbGFzc0ZpbGVfbm90Q2xhc3NGaWxlTmFtZSwgbnVsbCk7CiAJCX0KIAkJU3RyaW5nIGlkZW50aWZpZXI7CiAJCWludCBpbmRleDsKIAkJaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAJCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9jbGFzc0ZpbGVfbm90Q2xhc3NGaWxlTmFtZSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9jbGFzc0ZpbGVfbm90Q2xhc3NGaWxlTmFtZSwgbnVsbCk7CiAJCX0KIAkJaWRlbnRpZmllciA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKIAkJLy8gSlNSLTE3NSBtZXRhZGF0YSBzdHJvbmdseSByZWNvbW1lbmRzICJwYWNrYWdlLWluZm8uamF2YSIgYXMgdGhlCkBAIC0yNTksMTQgKzI1MCwxNCBAQAogCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBmaWVsZAogCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGZpZWxkIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBmaWVsZCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMKIAkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjdmFsaWRhdGVGaWVsZE5hbWUoU3RyaW5nIGlkLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpfSBpbnN0ZWFkCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRmllbGROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiB2YWxpZGF0ZUlkZW50aWZpZXIobmFtZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zLENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CiAJfQotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpZWxkIG5hbWUgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgogCSAqIDxwPgpAQCAtMjc3LDcgKzI2OCw3IEBACiAJICogQHBhcmFtIHNvdXJjZUxldmVsIHRoZSBzb3VyY2UgbGV2ZWwKIAkgKiBAcGFyYW0gY29tcGxpYW5jZUxldmVsIHRoZSBjb21wbGlhbmNlIGxldmVsCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgZmllbGQgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGZpZWxkIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKIAkgKiBAc2luY2UgMy4zCiAJICovCkBAIC0yOTQsMTQgKzI4NSwxNCBAQAogCSAqCiAJICogQHBhcmFtIGlkIHRoZSBKYXZhIGlkZW50aWZpZXIKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGlkZW50aWZpZXIKIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICN2YWxpZGF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpfSBpbnN0ZWFkCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlSWRlbnRpZmllcihpZCxDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMsQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gSmF2YSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscwogCSAqIFRoZSBpZGVudGlmaWVyIG11c3Qgbm90IGhhdmUgdGhlIHNhbWUgc3BlbGxpbmcgYXMgYSBKYXZhIGtleXdvcmQsCkBAIC0zMTMsNyArMzA0LDcgQEAKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGlkZW50aWZpZXIKIAkgKiBAc2luY2UgMy4zCiAJICovCkBAIC0zMjEsNyArMzEyLDcgQEAKIAkJaWYgKHNjYW5uZWRJZGVudGlmaWVyKGlkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb252ZW50aW9uX2lsbGVnYWxJZGVudGlmaWVyLCBpZCksIG51bGwpOyAKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29udmVudGlvbl9pbGxlZ2FsSWRlbnRpZmllciwgaWQpLCBudWxsKTsKIAkJfQogCX0KIApAQCAtMzM0LDE0ICszMjUsMTQgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24KIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGFuIGltcG9ydCBkZWNsYXJhdGlvbiwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3ZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpfSBpbnN0ZWFkCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIHZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24obmFtZSxDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMsQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIG5hbWUgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgogCSAqIDxwPgpAQCAtMzUzLDE5ICszNDQsMTkgQEAKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGFuIGltcG9ydCBkZWNsYXJhdGlvbiwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVJbXBvcnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKSB7CiAJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX2ltcG9ydF9udWxsSW1wb3J0LCBudWxsKTsgCi0JCX0gCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX2ltcG9ydF9udWxsSW1wb3J0LCBudWxsKTsKKwkJfQogCQlpZiAobmFtZS5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDEpID09ICcqJykgewogCQkJaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAyKSA9PSAnLicpIHsKIAkJCQlyZXR1cm4gdmFsaWRhdGVQYWNrYWdlTmFtZShuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMiksIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwogCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX2ltcG9ydF91bnF1YWxpZmllZEltcG9ydCwgbnVsbCk7IAorCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25faW1wb3J0X3VucXVhbGlmaWVkSW1wb3J0LCBudWxsKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gdmFsaWRhdGVQYWNrYWdlTmFtZShuYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKQEAgLTM3OCw0MCArMzY5LDUyIEBACiAJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHR5cGUKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBKYXZhIHR5cGUgbmFtZSwgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsCiAJICogICAgICBhIHN0YXR1cyB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5XQVJOSU5HPC9jb2RlPgotCSAqCQlpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgCi0JICogICAgICBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIAorCSAqCQlpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwKKwkgKiAgICAgIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGgKIAkgKiAgICAgIHRoZSBuYW1lCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIGlkLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpfSBpbnN0ZWFkCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB2YWxpZGF0ZUphdmFUeXBlTmFtZShuYW1lLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMsQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKKwkJcmV0dXJuIHZhbGlkYXRlSmF2YVR5cGVOYW1lKG5hbWUsIEphdmFDb3JlLlZFUlNJT05fMV8zLCBKYXZhQ29yZS5WRVJTSU9OXzFfMyk7CiAJfQotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotCSAqIEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS5sYW5nLk9iamVjdCI8L2NvZGU+LCBvciA8Y29kZT4iT2JqZWN0IjwvY29kZT4uCi0JICogPHA+CisJICogCisJICogPHA+Rm9yIGV4YW1wbGUsIDxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT4sIG9yIDxjb2RlPiJPYmplY3QiPC9jb2RlPi48L3A+CisJICogCisJICogPHA+VGhlIHNvdXJjZSBsZXZlbCBhbmQgY29tcGxpYW5jZSBsZXZlbCB2YWx1ZXMgc2hvdWxkIGJlIHRha2VuIGZyb20gdGhlIGNvbnN0YW50IGRlZmluZWQgaW5zaWRlCisJICoge0BsaW5rIEphdmFDb3JlfSBjbGFzcy4gVGhlIGNvbnN0YW50cyBhcmUgbmFtZWQgPGNvZGU+SmF2YUNvcmUjVkVSU0lPTl8xX3g8L2NvZGU+LCB4IGJlaW5nIHNldAorCSAqIGJldHdlZW4gJzEnIGFuZCAnNycuCisJICogPC9wPgogCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB0eXBlCiAJICogQHBhcmFtIHNvdXJjZUxldmVsIHRoZSBzb3VyY2UgbGV2ZWwKIAkgKiBAcGFyYW0gY29tcGxpYW5jZUxldmVsIHRoZSBjb21wbGlhbmNlIGxldmVsCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIAorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIEphdmEgdHlwZSBuYW1lLAogCSAqICAgICAgYSBzdGF0dXMgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuV0FSTklORzwvY29kZT4KLQkgKgkJaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsIAotCSAqICAgICAgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCAKKwkgKgkJaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsCisJICogICAgICBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoCiAJICogICAgICB0aGUgbmFtZQogCSAqIEBzaW5jZSAzLjMKKwkgKiBAc2VlIEphdmFDb3JlI1ZFUlNJT05fMV8xCisJICogQHNlZSBKYXZhQ29yZSNWRVJTSU9OXzFfMgorCSAqIEBzZWUgSmF2YUNvcmUjVkVSU0lPTl8xXzMKKwkgKiBAc2VlIEphdmFDb3JlI1ZFUlNJT05fMV80CisJICogQHNlZSBKYXZhQ29yZSNWRVJTSU9OXzFfNQorCSAqIEBzZWUgSmF2YUNvcmUjVkVSU0lPTl8xXzYKKwkgKiBAc2VlIEphdmFDb3JlI1ZFUlNJT05fMV83CiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpIHsKIAkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl90eXBlX251bGxOYW1lLCBudWxsKTsgCisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3R5cGVfbnVsbE5hbWUsIG51bGwpOwogCQl9CiAJCVN0cmluZyB0cmltbWVkID0gbmFtZS50cmltKCk7CiAJCWlmICghbmFtZS5lcXVhbHModHJpbW1lZCkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fdHlwZV9uYW1lV2l0aEJsYW5rcywgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl90eXBlX25hbWVXaXRoQmxhbmtzLCBudWxsKTsKIAkJfQogCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAJCWNoYXJbXSBzY2FubmVkSUQ7CkBAIC00MjgsMjEgKzQzMSwyMSBAQAogCQkJU3RyaW5nIHR5cGUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKTsKIAkJCXNjYW5uZWRJRCA9IHNjYW5uZWRJZGVudGlmaWVyKHR5cGUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwogCQl9Ci0JCisKIAkJaWYgKHNjYW5uZWRJRCAhPSBudWxsKSB7CiAJCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmV3IFN0cmluZyhzY2FubmVkSUQpLCBJUmVzb3VyY2UuRklMRSk7CiAJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKIAkJCQlyZXR1cm4gc3RhdHVzOwogCQkJfQogCQkJaWYgKENoYXJPcGVyYXRpb24uY29udGFpbnMoJyQnLCBzY2FubmVkSUQpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3R5cGVfZG9sbGFyTmFtZSwgbnVsbCk7IAorCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl90eXBlX2RvbGxhck5hbWUsIG51bGwpOwogCQkJfQogCQkJaWYgKChzY2FubmVkSUQubGVuZ3RoID4gMCAmJiBTY2FubmVySGVscGVyLmlzTG93ZXJDYXNlKHNjYW5uZWRJRFswXSkpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3R5cGVfbG93ZXJjYXNlTmFtZSwgbnVsbCk7IAorCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl90eXBlX2xvd2VyY2FzZU5hbWUsIG51bGwpOwogCQkJfQogCQkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29udmVudGlvbl90eXBlX2ludmFsaWROYW1lLCBuYW1lKSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jb252ZW50aW9uX3R5cGVfaW52YWxpZE5hbWUsIG5hbWUpLCBudWxsKTsKIAkJfQogCX0KIApAQCAtNDU1LDE0ICs0NTgsMTQgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgbWV0aG9kCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgbWV0aG9kIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBtZXRob2QgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3ZhbGlkYXRlTWV0aG9kTmFtZShTdHJpbmcgaWQsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCl9IGluc3RlYWQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVNZXRob2ROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiB2YWxpZGF0ZU1ldGhvZE5hbWUobmFtZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zLENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CiAJfQotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhlIGdpdmVuIG1ldGhvZCBuYW1lIGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KIAkgKiBUaGUgc3BlY2lhbCBuYW1lcyAiJmx0O2luaXQmZ3Q7IiBhbmQgIiZsdDtjbGluaXQmZ3Q7IiBhcmUgbm90IHZhbGlkLgpAQCAtNDc0LDcgKzQ3Nyw3IEBACiAJICogQHBhcmFtIHNvdXJjZUxldmVsIHRoZSBzb3VyY2UgbGV2ZWwKIAkgKiBAcGFyYW0gY29tcGxpYW5jZUxldmVsIHRoZSBjb21wbGlhbmNlIGxldmVsCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgbWV0aG9kIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBtZXRob2QgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBzaW5jZSAzLjMKIAkgKi8KQEAgLTQ5MCwxOSArNDkzLDE5IEBACiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoZSBnaXZlbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgcGFja2FnZSBuYW1lICh0aGF0IGlzLCBhdHRlbXB0aW5nIHRvCiAJICogdmFsaWRhdGUgdGhlIGRlZmF1bHQgcGFja2FnZSB3aWxsIHJldHVybiBhbiBlcnJvciBzdGF0dXMuKQotCSAqIEFsc28gaXQgbXVzdCBub3QgY29udGFpbiBhbnkgY2hhcmFjdGVycyBvciBzdWJzdHJpbmdzIHRoYXQgYXJlIG5vdCB2YWxpZCAKKwkgKiBBbHNvIGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQKIAkgKiBvbiB0aGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZC4KIAkgKgogCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgcGFja2FnZQogCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIHBhY2thZ2UgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIHBhY2thZ2UgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3ZhbGlkYXRlUGFja2FnZU5hbWUoU3RyaW5nIGlkLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpfSBpbnN0ZWFkCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGFja2FnZU5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIHZhbGlkYXRlUGFja2FnZU5hbWUobmFtZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zLENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CiAJfQotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCiAJICogPHA+CkBAIC01MTEsMzYgKzUxNCwzNiBAQAogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHBhY2thZ2UgbmFtZSAodGhhdCBpcywgYXR0ZW1wdGluZyB0bwogCSAqIHZhbGlkYXRlIHRoZSBkZWZhdWx0IHBhY2thZ2Ugd2lsbCByZXR1cm4gYW4gZXJyb3Igc3RhdHVzLikKLQkgKiBBbHNvIGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisJICogQWxzbyBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkCiAJICogb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCiAJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGFja2FnZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCkgewogCiAJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9udWxsTmFtZSwgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9wYWNrYWdlX251bGxOYW1lLCBudWxsKTsKIAkJfQogCQlpbnQgbGVuZ3RoOwogCQlpZiAoKGxlbmd0aCA9IG5hbWUubGVuZ3RoKCkpID09IDApIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9lbXB0eU5hbWUsIG51bGwpOyAKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9lbXB0eU5hbWUsIG51bGwpOwogCQl9CiAJCWlmIChuYW1lLmNoYXJBdCgwKSA9PSBET1QgfHwgbmFtZS5jaGFyQXQobGVuZ3RoLTEpID09IERPVCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9wYWNrYWdlX2RvdE5hbWUsIG51bGwpOyAKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9kb3ROYW1lLCBudWxsKTsKIAkJfQogCQlpZiAoQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UobmFtZS5jaGFyQXQoMCkpIHx8IENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9uYW1lV2l0aEJsYW5rcywgbnVsbCk7IAorCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuY29udmVudGlvbl9wYWNrYWdlX25hbWVXaXRoQmxhbmtzLCBudWxsKTsKIAkJfQogCQlpbnQgZG90ID0gMDsKIAkJd2hpbGUgKGRvdCAhPSAtMSAmJiBkb3QgPCBsZW5ndGgtMSkgewogCQkJaWYgKChkb3QgPSBuYW1lLmluZGV4T2YoRE9ULCBkb3QrMSkpICE9IC0xICYmIGRvdCA8IGxlbmd0aC0xICYmIG5hbWUuY2hhckF0KGRvdCsxKSA9PSBET1QpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3BhY2thZ2VfY29uc2VjdXRpdmVEb3RzTmFtZSwgbnVsbCk7IAorCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV9jb25zZWN1dGl2ZURvdHNOYW1lLCBudWxsKTsKIAkJCQl9CiAJCX0KIAkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CkBAIC01NTIsNyArNTU1LDcgQEAKIAkJCXR5cGVOYW1lID0gdHlwZU5hbWUudHJpbSgpOyAvLyBncmFtbWFyIGFsbG93cyBzcGFjZXMKIAkJCWNoYXJbXSBzY2FubmVkSUQgPSBzY2FubmVkSWRlbnRpZmllcih0eXBlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7CiAJCQlpZiAoc2Nhbm5lZElEID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNvbnZlbnRpb25faWxsZWdhbElkZW50aWZpZXIsIHR5cGVOYW1lKSwgbnVsbCk7IAorCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY29udmVudGlvbl9pbGxlZ2FsSWRlbnRpZmllciwgdHlwZU5hbWUpLCBudWxsKTsKIAkJCX0KIAkJCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShuZXcgU3RyaW5nKHNjYW5uZWRJRCksIElSZXNvdXJjZS5GT0xERVIpOwogCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CkBAIC01NjAsNyArNTYzLDcgQEAKIAkJCX0KIAkJCWlmIChmaXJzdFRva2VuICYmIHNjYW5uZWRJRC5sZW5ndGggPiAwICYmIFNjYW5uZXJIZWxwZXIuaXNVcHBlckNhc2Uoc2Nhbm5lZElEWzBdKSkgewogCQkJCWlmICh3YXJuaW5nU3RhdHVzID09IG51bGwpIHsKLQkJCQkJd2FybmluZ1N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5jb252ZW50aW9uX3BhY2thZ2VfdXBwZXJjYXNlTmFtZSwgbnVsbCk7IAorCQkJCQl3YXJuaW5nU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmNvbnZlbnRpb25fcGFja2FnZV91cHBlcmNhc2VOYW1lLCBudWxsKTsKIAkJCQl9CiAJCQl9CiAJCQlmaXJzdFRva2VuID0gZmFsc2U7CkBAIC01NzAsNyArNTczLDcgQEAKIAkJfQogCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCX0KLQkKKwogCS8qKgogCSAqIFZhbGlkYXRlIGEgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gZm9yIGEgcHJvamVjdCwgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKIAkgKiA8dWw+CkBAIC01NzgsMTYgKzU4MSwxOCBAQAogCSAqICAgPGxpPiBUaGUgcHJvamVjdCBvdXRwdXQgbG9jYXRpb24gcGF0aCBjYW5ub3QgYmUgbnVsbCwgbXVzdCBiZSBhYnNvbHV0ZSBhbmQgbG9jYXRlZCBpbnNpZGUgdGhlIHByb2plY3QuCiAJICogICA8bGk+IFNwZWNpZmljIG91dHB1dCBsb2NhdGlvbnMgKHNwZWNpZmllZCBvbiBzb3VyY2UgZW50cmllcykgY2FuIGJlIG51bGwsIGlmIG5vdCB0aGV5IG11c3QgYmUgbG9jYXRlZCBpbnNpZGUgdGhlIHByb2plY3QsCiAJICogICA8bGk+IEEgcHJvamVjdCBlbnRyeSBjYW5ub3QgcmVmZXIgdG8gaXRzZWxmIGRpcmVjdGx5ICh0aGF0IGlzLCBhIHByb2plY3QgY2Fubm90IHByZXJlcXVpc2l0ZSBpdHNlbGYpLgotICAgICAqICAgPGxpPiBDbGFzc3BhdGggZW50cmllcyBvciBvdXRwdXQgbG9jYXRpb25zIGNhbm5vdCBjb2luY2lkYXRlIG9yIGJlIG5lc3RlZCBpbiBlYWNoIG90aGVyLCBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgc2NlbmFyaWkgbGlzdGVkIGJlbG93OgotCSAqICAgICAgPHVsPjxsaT4gQSBzb3VyY2UgZm9sZGVyIGNhbiBjb2luY2lkYXRlIHdpdGggaXRzIG93biBvdXRwdXQgbG9jYXRpb24sIGluIHdoaWNoIGNhc2UgdGhpcyBvdXRwdXQgY2FuIHRoZW4gY29udGFpbiBsaWJyYXJ5IGFyY2hpdmVzLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uIGNhbm5vdCBjb2luY2lkYXRlIHdpdGggYW55IGxpYnJhcnkgb3IgYSBkaXN0aW5jdCBzb3VyY2UgZm9sZGVyIHRoYW4gdGhlIG9uZSByZWZlcnJpbmcgdG8gaXQuIDwvbGk+IAorICAgICAqICAgPGxpPiBDbGFzc3BhdGggZW50cmllcyBvciBvdXRwdXQgbG9jYXRpb25zIGNhbm5vdCBjb2luY2lkZSBvciBiZSBuZXN0ZWQgaW4gZWFjaCBvdGhlciwgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIHNjZW5hcmlvcyBsaXN0ZWQgYmVsb3c6CisJICogICAgICA8dWw+PGxpPiBBIHNvdXJjZSBmb2xkZXIgY2FuIGNvaW5jaWRlIHdpdGggaXRzIG93biBvdXRwdXQgbG9jYXRpb24sIGluIHdoaWNoIGNhc2UgdGhpcyBvdXRwdXQgY2FuIHRoZW4gY29udGFpbiBsaWJyYXJ5IGFyY2hpdmVzLgorCSAqICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgYSBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24gY2Fubm90IGNvaW5jaWRlIHdpdGggYW55IGxpYnJhcnkgb3IgYSBkaXN0aW5jdCBzb3VyY2UgZm9sZGVyIHRoYW4gdGhlIG9uZSByZWZlcnJpbmcgdG8gaXQuPGJyPgorCSAqICAgICAgICAgICAgICAgICAgICAgTm90ZTogU2luY2UgMy44LCB0aGlzIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbmZpZ3VyaW5nIHtAbGluayBKYXZhQ29yZSNDT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRX0KKwkgKiAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAJICogICAgICAgICAgICAgIDxsaT4gQSBzb3VyY2UvbGlicmFyeSBmb2xkZXIgY2FuIGJlIG5lc3RlZCBpbiBhbnkgc291cmNlIGZvbGRlciBhcyBsb25nIGFzIHRoZSBuZXN0ZWQgZm9sZGVyIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIGVuY2xvc2luZyBvbmUuIDwvbGk+Ci0JICogCQkJPGxpPiBBbiBvdXRwdXQgbG9jYXRpb24gY2FuIGJlIG5lc3RlZCBpbiBhIHNvdXJjZSBmb2xkZXIsIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGNvaW5jaWRhdGVzIHdpdGggdGhlIHByb2plY3QgaXRzZWxmLCBvciBpZiB0aGUgb3V0cHV0CisJICogCQkJPGxpPiBBbiBvdXRwdXQgbG9jYXRpb24gY2FuIGJlIG5lc3RlZCBpbiBhIHNvdXJjZSBmb2xkZXIsIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGNvaW5jaWRlcyB3aXRoIHRoZSBwcm9qZWN0IGl0c2VsZiwgb3IgaWYgdGhlIG91dHB1dAogCSAqIAkJCQkJbG9jYXRpb24gaXMgZXhjbHVkZWQgZnJvbSB0aGUgc291cmNlIGZvbGRlci4KIAkgKiAgICAgIDwvdWw+CiAJICogPC91bD4KLQkgKiAKLQkgKiAgTm90ZSB0aGF0IHRoZSBjbGFzc3BhdGggZW50cmllcyBhcmUgbm90IHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5LiBPbmx5IGJvdW5kIHZhcmlhYmxlcyBvciBjb250YWluZXJzIGFyZSBjb25zaWRlcmVkIAorCSAqCisJICogIE5vdGUgdGhhdCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgYXJlIG5vdCB2YWxpZGF0ZWQgYXV0b21hdGljYWxseS4gT25seSBib3VuZCB2YXJpYWJsZXMgb3IgY29udGFpbmVycyBhcmUgY29uc2lkZXJlZAogCSAqICBpbiB0aGUgY2hlY2tpbmcgcHJvY2VzcyAodGhpcyBhbGxvd3MgdG8gcGVyZm9ybSBhIGNvbnNpc3RlbmN5IGNoZWNrIG9uIGEgY2xhc3NwYXRoIHdoaWNoIGhhcyByZWZlcmVuY2VzIHRvCiAJICogIHlldCBub24gZXhpc3RpbmcgcHJvamVjdHMsIGZvbGRlcnMsIC4uLikuCiAJICogIDxwPgpAQCAtNTk4LDcgKzYwMyw3IEBACiAJICogQHBhcmFtIHJhd0NsYXNzcGF0aCB0aGUgZ2l2ZW4gY2xhc3NwYXRoCiAJICogQHBhcmFtIHByb2plY3RPdXRwdXRMb2NhdGlvbiB0aGUgZ2l2ZW4gb3V0cHV0IGxvY2F0aW9uCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiBhcmUgY29tcGF0aWJsZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQl0aGUgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gYXJlIGNvbXBhdGlibGUsIG90aGVyd2lzZSBhIHN0YXR1cwogCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGNsYXNzcGF0aCBvciBvdXRwdXQgbG9jYXRpb24KIAkgKiBAc2luY2UgMi4wCiAJICovCkBAIC02MDgsMjMgKzYxMywyMCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgYSBKYXZhIG1vZGVsIHN0YXR1cyBkZXNjcmliaW5nIHRoZSBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhpcyBjbGFzc3BhdGggZW50cnkgaWYgYW55LCAKKwkgKiBSZXR1cm5zIGEgSmF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwKIAkgKiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBmaW5lICh0aGF0IGlzLCBpZiB0aGUKIAkgKiBnaXZlbiBjbGFzc3BhdGggZW50cnkgZGVub3RlcyBhIHZhbGlkIGVsZW1lbnQgdG8gYmUgcmVmZXJlbmNlZCBvbnRvIGEgY2xhc3NwYXRoKS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBnaXZlbiBqYXZhIHByb2plY3QKIAkgKiBAcGFyYW0gZW50cnkgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyeQotCSAqIEBwYXJhbSBjaGVja1NvdXJjZUF0dGFjaG1lbnQgYSBmbGFnIHRvIGRldGVybWluZSBpZiBzb3VyY2UgYXR0YWNoZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQKKwkgKiBAcGFyYW0gY2hlY2tTb3VyY2VBdHRhY2htZW50IGEgZmxhZyB0byBkZXRlcm1pbmUgaWYgc291cmNlIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGNoZWNrZWQKIAkgKiBAcmV0dXJuIGEgamF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwgYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgZmluZQogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIGNoZWNrU291cmNlQXR0YWNobWVudCl7Ci0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gQ2xhc3NwYXRoRW50cnkudmFsaWRhdGVDbGFzc3BhdGhFbnRyeShwcm9qZWN0LCBlbnRyeSwgY2hlY2tTb3VyY2VBdHRhY2htZW50LCB0cnVlLypyZWN1cnNlIGluIGNvbnRhaW5lciovKTsKLQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCAmJiAoKENsYXNzcGF0aEVudHJ5KSBlbnRyeSkuaXNPcHRpb25hbCgpKQotCQkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKLQkJcmV0dXJuIHN0YXR1czsKKwkJcmV0dXJuIENsYXNzcGF0aEVudHJ5LnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkocHJvamVjdCwgZW50cnksIGNoZWNrU291cmNlQXR0YWNobWVudCwgZmFsc2UvKm5vdCByZWZlcnJlZCBieSBjb250YWluZXIqLyk7CiAJfQotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhlIGdpdmVuIHR5cGUgdmFyaWFibGUgbmFtZS4KIAkgKiA8cD4KQEAgLTYzMyw3ICs2MzUsNyBAQAogCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB0eXBlIHZhcmlhYmxlCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgdHlwZSB2YXJpYWJsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgdHlwZSB2YXJpYWJsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMKIAkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCiAJICogQHNpbmNlIDMuMQogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3ZhbGlkYXRlVHlwZVZhcmlhYmxlTmFtZShTdHJpbmcgaWQsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCl9IGluc3RlYWQKQEAgLTY0MSw3ICs2NDMsNyBAQAogCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVR5cGVWYXJpYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIHZhbGlkYXRlSWRlbnRpZmllcihuYW1lLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMsQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gdHlwZSB2YXJpYWJsZSBuYW1lIGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KIAkgKiA8cD4KQEAgLTY1MiwxOCArNjU0LDE4IEBACiAJICogQHBhcmFtIHNvdXJjZUxldmVsIHRoZSBzb3VyY2UgbGV2ZWwKIAkgKiBAcGFyYW0gY29tcGxpYW5jZUxldmVsIHRoZSBjb21wbGlhbmNlIGxldmVsCiAJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgdHlwZSB2YXJpYWJsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgdHlwZSB2YXJpYWJsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMKIAkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVR5cGVWYXJpYWJsZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCkgewogCQlyZXR1cm4gdmFsaWRhdGVJZGVudGlmaWVyKG5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwogCX0KLQkKKwogCS8qKgogCSAqIFZhbGlkYXRlIHRoYXQgYWxsIGNvbXBpbGVyIG9wdGlvbnMgb2YgdGhlIGdpdmVuIHByb2plY3QgbWF0Y2gga2V5cyBhbmQgdmFsdWVzCiAJICogZGVzY3JpYmVkIGluIHtAbGluayBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpfSBtZXRob2QuCi0JICogCisJICoKIAkgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIGphdmEgcHJvamVjdAogCSAqIEBwYXJhbSBpbmhlcml0SmF2YUNvcmVPcHRpb25zIGluaGVyaXQgcHJvamVjdCBvcHRpb25zIGZyb20gSmF2YUNvcmUgb3Igbm90LgogCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiBhbGwgcHJvamVjdApAQCAtNjc3LDEzICs2NzksMTMgQEAKIAkJcmV0dXJuIHZhbGlkYXRlQ29tcGlsZXJPcHRpb25zKGphdmFQcm9qZWN0LmdldE9wdGlvbnMoaW5oZXJpdEphdmFDb3JlT3B0aW9ucykpOwogCX0KIAkqLwotCQorCiAJLyoqCiAJICogVmFsaWRhdGUgdGhhdCBhbGwgY29tcGlsZXIgb3B0aW9ucyBvZiB0aGUgZ2l2ZW4gcHJvamVjdCBtYXRjaCBrZXlzIGFuZCB2YWx1ZXMKIAkgKiBkZXNjcmliZWQgaW4ge0BsaW5rIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCl9IG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgTWFwIG9mIG9wdGlvbnMKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgYWxsIAorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiBhbGwKIAkgKgkJY29tcGlsZXIgb3B0aW9ucyBhcmUgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nCiAJICoJCXdpdGggdGhlIGtleXMgYW5kIHRoZWlyIHZhbHVlLgogCSAqIEBzaW5jZSAzLjEKQEAgLTY5OCwxNSArNzAwLDE1IEBACiAJCWlmIChjb21wbGlhbmNlID09IG51bGwgJiYgc291cmNlID09IG51bGwgJiYgdGFyZ2V0ID09IG51bGwpIHsKIAkJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7IC8vIGRlZmF1bHQgaXMgT0sKIAkJfQotCQkKKwogCQkvLyBJbml0aWFsaXplIG11bHRpLXN0YXR1cwogCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCisKIAkJLy8gU2V0IGRlZmF1bHQgZm9yIGNvbXBsaWFuY2UgaWYgbmVjZXNzYXJ5IChub3Qgc2V0IG9uIHByb2plY3QgYW5kIG5vdCBpbmhlcml0ZWQuLi4pCiAJCWlmIChjb21wbGlhbmNlID09IG51bGwpIHsKIAkJCWNvbXBsaWFuY2UgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7CiAJCX0KLQkJCisKIAkJLy8gVmVyaWZ5IGNvbXBsaWFuY2UgbGV2ZWwgdmFsdWUgYW5kIHNldCBzb3VyY2UgYW5kIHRhcmdldCBkZWZhdWx0IGlmIG5lY2Vzc2FyeQogCQlsb25nIGNvbXBsaWFuY2VMZXZlbCA9IDA7CiAJCWxvbmcgc291cmNlTGV2ZWwgPSAwOwpAQCAtNzg3LDE1ICs3ODksMTUgQEAKIAkJCQkJZXJyb3JzLmFkZChuZXcgSmF2YU1vZGVsU3RhdHVzKElTdGF0dXMuRVJST1IsIFV0aWwuYmluZCgiY29udmVudGlvbi5jb21waWxlci5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UiLCB0YXJnZXQsIEphdmFDb3JlLlZFUlNJT05fMV80KSkpOyAvLyROT04tTkxTLTEkCiAJICAgCQl9CiAJCQkvLyB0YXJnZXQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBjb21wbGlhbmNlIGxldmVsCi0JCQlpZiAoY29tcGxpYW5jZUxldmVsIDwgdGFyZ2V0TGV2ZWwpeyAKKwkJCWlmIChjb21wbGlhbmNlTGV2ZWwgPCB0YXJnZXRMZXZlbCl7CiAJCQkJZXJyb3JzLmFkZChuZXcgSmF2YU1vZGVsU3RhdHVzKElTdGF0dXMuRVJST1IsIFV0aWwuYmluZCgiY29udmVudGlvbi5jb21waWxlci5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yVGFyZ2V0IiwgY29tcGxpYW5jZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzQpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCS8vIGNvbXBsaWFuY2UgbXVzdCBiZSAxLjUgaWYgc291cmNlIGlzIDEuNQogCQkJaWYgKHNvdXJjZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzUpICYmIGNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKIAkJCQllcnJvcnMuYWRkKG5ldyBKYXZhTW9kZWxTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmNvbXBpbGVyLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JTb3VyY2UiLCBjb21wbGlhbmNlLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIAorCQkJfSBlbHNlCiAJCQkJLy8gY29tcGxpYW5jZSBtdXN0IGJlIDEuNCBpZiBzb3VyY2UgaXMgMS40Ci0JCQkJaWYgKHNvdXJjZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzQpICYmIGNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsgCisJCQkJaWYgKHNvdXJjZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzQpICYmIGNvbXBsaWFuY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQpIHsKIAkJCQkJZXJyb3JzLmFkZChuZXcgSmF2YU1vZGVsU3RhdHVzKElTdGF0dXMuRVJST1IsIFV0aWwuYmluZCgiY29udmVudGlvbi5jb21waWxlci5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlIiwgY29tcGxpYW5jZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzQpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb3JlLmphdmEKaW5kZXggMjdhMzEwOC4uNDMwMzQ5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTY4LDE1ICs2OCw0NSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFUl9QQl9SRURVTkRBTlRfTlVMTF9DSEVDSwogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX0lOQ0xVREVfRE9DX0NPTU1FTlRfUkVGRVJFTkNFCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVSX1BCX1VOVVNFRF9ERUNMQVJFRF9USFJPV05fRVhDRVBUSU9OX0lOQ0xVREVfRE9DX0NPTU1FTlRfUkVGRVJFTkNFCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT04KKyAqCQkJCQkJCQkgICBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHX0RFU0NSSVBUSU9OX05PX1RBRworICoJCQkJCQkJCSAgIENPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT05fUkVUVVJOX1RBRworICoJCQkJCQkJCSAgIENPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT05fQUxMX1RBR1MKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUElMRVJfUEJfUkVEVU5EQU5UX1NVUEVSSU5URVJGQUNFCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fRVhFTVBUX0VYQ0VQVElPTl9BTkRfVEhST1dBQkxFCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgZ2V0T3B0aW9uRm9yQ29uZmlndXJhYmxlU2V2ZXJpdHkoaW50KQorICogICAgIEJlbmphbWluIE11c2thbGxhIC0gYWRkZWQgQ09NUElMRVJfUEJfTUlTU0lOR19TWU5DSFJPTklaRURfT05fSU5IRVJJVEVEX01FVEhPRAorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gIC0gYWRkZWQgQ09NUElMRVJfUEJfVU5VU0VEX09CSkVDVF9BTExPQ0FUSU9OCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAgLSBhZGRlZCBDT01QSUxFUl9QQl9TVVBQUkVTU19PUFRJT05BTF9FUlJPUlMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CkBAIC05MCwyOCArMTIwLDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5KYXZhQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLlN0YXRlOwpAQCAtMTM1LDYgKzE1NSw3IEBACiAgKiA8Y29kZT5KYXZhQ29yZS5nZXRKYXZhQ29yZSgpPC9jb2RlPi4gVGhlIEphdmEgbW9kZWwgcGx1Zy1pbiB3aWxsIGJlIGFjdGl2YXRlZAogICogYXV0b21hdGljYWxseSBpZiBub3QgYWxyZWFkeSBhY3RpdmUuCiAgKiA8L3A+CisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb3JlIGV4dGVuZHMgUGx1Z2luIHsKIApAQCAtMTgxLDk4MSArMjAyLDIxOTggQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0xJQlJBUllfQ09OVEFJTkVSX0lEPSAib3JnLmVjbGlwc2UuamR0LlVTRVJfTElCUkFSWSI7IC8vJE5PTi1OTFMtMSQKIAotCS8vICoqKioqKioqKioqKioqKiBQb3NzaWJsZSBJRHMgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zLiAqKioqKioqKioqKioqKioqKioqKgorCS8vIEJlZ2luIGNvbmZpZ3VyYWJsZSBvcHRpb24gSURzIHsKIAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IEdlbmVyYXRpbmcgTG9jYWwgVmFyaWFibGUgRGVidWcgQXR0cmlidXRlLgorCSAqIDxwPldoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSBsb2NhbCB2YXJpYWJsZSBuYW1lcworCSAqICAgIHRvIGJlIGRpc3BsYXllZCBpbiBkZWJ1Z2dlciwgb25seSBpbiBwbGFjZSB3aGVyZSB2YXJpYWJsZXMgYXJlCisJICogICAgZGVmaW5pdGVseSBhc3NpZ25lZCAoLmNsYXNzIGZpbGUgaXMgdGhlbiBiaWdnZXIpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZ2VuZXJhdGUiLCAiZG8gbm90IGdlbmVyYXRlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImdlbmVyYXRlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9MT0NBTF9WQVJJQUJMRV9BVFRSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IEdlbmVyYXRpbmcgTGluZSBOdW1iZXIgRGVidWcgQXR0cmlidXRlLgorCSAqIDxwPldoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSBzb3VyY2UgY29kZSBoaWdobGlnaHRpbmcgaW4gZGVidWdnZXIKKwkgKiAgICAoLmNsYXNzIGZpbGUgaXMgdGhlbiBiaWdnZXIpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZ2VuZXJhdGUiLCAiZG8gbm90IGdlbmVyYXRlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImdlbmVyYXRlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9MSU5FX05VTUJFUl9BVFRSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IEdlbmVyYXRpbmcgU291cmNlIERlYnVnIEF0dHJpYnV0ZS4KKwkgKiA8cD5XaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgdGhlIGRlYnVnZ2VyIHRvIHByZXNlbnQgdGhlCisJICogICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImdlbmVyYXRlIiwgImRvIG5vdCBnZW5lcmF0ZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJnZW5lcmF0ZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfU09VUkNFX0ZJTEVfQVRUUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBQcmVzZXJ2aW5nIFVudXNlZCBMb2NhbCBWYXJpYWJsZXMuCisJICogPHA+VW5sZXNzIHJlcXVlc3RlZCB0byBwcmVzZXJ2ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzICh0aGF0IGlzLCBuZXZlciByZWFkKSwgdGhlCisJICogICAgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIG91dCwgcG90ZW50aWFsbHkgYWx0ZXJpbmcgZGVidWdnaW5nLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAicHJlc2VydmUiLCAib3B0aW1pemUgb3V0IiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+InByZXNlcnZlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBEZWZpbmluZyBUYXJnZXQgSmF2YSBQbGF0Zm9ybS4KKwkgKiA8cD5Gb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgcmVhc29uLCAuY2xhc3MgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byB3aXRoIGNlcnRhaW4gVk0gdmVyc2lvbnMgYW5kIGxhdGVyLgorCSAqIDxwPk5vdGUgdGhhdCA8Y29kZT4iMS40IjwvY29kZT4gdGFyZ2V0IHJlcXVpcmVzIHRvIHRvZ2dsZSBjb21wbGlhbmNlIG1vZGUgdG8gPGNvZGU+IjEuNCI8L2NvZGU+LCA8Y29kZT4iMS41IjwvY29kZT4gdGFyZ2V0IHJlcXVpcmVzCisJICogICAgdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbW9kZSB0byA8Y29kZT4iMS41IjwvY29kZT4sIDxjb2RlPiIxLjYiPC9jb2RlPiB0YXJnZXQgcmVxdWlyZXMgdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbW9kZSB0byA8Y29kZT4iMS42IjwvY29kZT4gYW5kCisJICogICAgPGNvZGU+IjEuNyI8L2NvZGU+IHRhcmdldCByZXF1aXJlcyB0byB0b2dnbGUgY29tcGxpYW5jZSBtb2RlIHRvIDxjb2RlPiIxLjciPC9jb2RlPi4KKwkgKiAgICA8Y29kZT4iY2xkYzEuMSI8L2NvZGU+IHJlcXVpcmVzIHRoZSBzb3VyY2UgdmVyc2lvbiB0byBiZSA8Y29kZT4iMS4zIjwvY29kZT4gYW5kIHRoZSBjb21wbGlhbmNlIHZlcnNpb24gdG8gYmUgPGNvZGU+IjEuNCI8L2NvZGU+IG9yIGxvd2VyLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiMS4xIiwgIjEuMiIsICIxLjMiLCAiMS40IiwgIjEuNSIsICIxLjYiLCAiMS43IiwgImNsZGMxLjEiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iMS4yIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBJbmxpbmUgSlNSIEJ5dGVjb2RlIEluc3RydWN0aW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIEpTUiBpbnN0cnVjdGlvbnMsIGJ1dCByYXRoZXIgaW5saW5lIGNvcnJlc3BvbmRpbmcKKwkgKiAgICBzdWJyb3V0aW5lIGNvZGUgc2VxdWVuY2VzIChtb3N0bHkgY29ycmVzcG9uZGluZyB0byB0cnkgZmluYWxseSBibG9ja3MpLiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCB0aHVzCisJICogICAgZ2V0IGJpZ2dlciwgYnV0IHdpbGwgbG9hZCBmYXN0ZXIgb24gdmlydHVhbCBtYWNoaW5lcyBzaW5jZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgdGhlbiBtdWNoIHNpbXBsZXIuCisJICogPHA+VGhpcyBtb2RlIGlzIGFudGljaXBhdGluZyBzdXBwb3J0IGZvciB0aGUgSmF2YSBTcGVjaWZpY2F0aW9uIFJlcXVlc3QgMjAyLgorCSAqIDxwPk5vdGUgdGhhdCBKU1IgaW5saW5pbmcgaXMgb3B0aW9uYWwgb25seSBmb3IgdGFyZ2V0IHBsYXRmb3JtIGxlc3NlciB0aGFuIDEuNS4gRnJvbSAxLjUgb24sIHRoZSBKU1IKKwkgKiAgICBpbmxpbmluZyBpcyBtYW5kYXRvcnkgKGFsc28gc2VlIHJlbGF0ZWQgc2V0dGluZyB7QGxpbmsgI0NPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNfSkuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGUiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfQ09ERUdFTl9JTkxJTkVfSlNSX0JZVEVDT0RFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IEphdmFkb2MgQ29tbWVudCBTdXBwb3J0LgorCSAqIDxwPldoZW4gdGhpcyBzdXBwb3J0IGlzIGRpc2FibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpZ25vcmUgYWxsIGphdmFkb2MgcHJvYmxlbXMgb3B0aW9ucyBzZXR0aW5ncworCSAqICAgIGFuZCB3aWxsIG5vdCByZXBvcnQgYW55IGphdmFkb2MgcHJvYmxlbS4gSXQgd2lsbCBhbHNvIG5vdCBmaW5kIGFueSByZWZlcmVuY2UgaW4gamF2YWRvYyBjb21tZW50IGFuZAorCSAqICAgIERPTSBBU1QgSmF2YWRvYyBub2RlIHdpbGwgYmUgb25seSBhIGZsYXQgdGV4dCBpbnN0ZWFkIG9mIGhhdmluZyBzdHJ1Y3R1cmVkIHRhZyBlbGVtZW50cy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX0RPQ19DT01NRU5UX1NVUFBPUlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBkZXByZWNhdGVkIC0gZGlzY29udGludWVkIHNpbmNlIHR1cm5pbmcgb2ZmIHdvdWxkIHZpb2xhdGUgbGFuZ3VhZ2Ugc3BlY3MKKwkgKiBAZGVwcmVjYXRlZCBEaXNjb250aW51ZWQgc2luY2UgdHVybmluZyBvZmYgd291bGQgdmlvbGF0ZSBsYW5ndWFnZSBzcGVjcy4KKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBkZXByZWNhdGVkIC0gZGlzY29udGludWVkIHNpbmNlIHR1cm5pbmcgb2ZmIHdvdWxkIHZpb2xhdGUgbGFuZ3VhZ2Ugc3BlY3MKKwkgKiBAZGVwcmVjYXRlZCBEaXNjb250aW51ZWQgc2luY2UgdHVybmluZyBvZmYgd291bGQgdmlvbGF0ZSBsYW5ndWFnZSBzcGVjcy4KKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5WQUxJRF9JTVBPUlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEltcG9ydCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgQXR0ZW1wdCB0byBPdmVycmlkZSBQYWNrYWdlIFZpc2libGUgTWV0aG9kLgorCSAqIDxwPkEgcGFja2FnZSB2aXNpYmxlIG1ldGhvZCwgd2hpY2ggaXMgYW55IG1ldGhvZCB0aGF0IGlzIG5vdCBleHBsaWNpdGx5CisJICogICAgZGVjbGFyZWQgYXMgcHVibGljLCBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSwgaXMgbm90IHZpc2libGUgZnJvbSBvdGhlcgorCSAqICAgIHBhY2thZ2VzLCBhbmQgdGh1cyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBmcm9tIGFub3RoZXIgcGFja2FnZS4KKwkgKiAgICBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGEgcGFja2FnZSB2aXNpYmxlIG1ldGhvZCBmcm9tIGFub3RoZXIgcGFja2FnZQorCSAqICAgIGludHJvZHVjZXMgYSBuZXcgbWV0aG9kIHRoYXQgaXMgdW5yZWxhdGVkIHRvIHRoZSBvcmlnaW5hbCBvbmUuIFdoZW4KKwkgKiAgICBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHN1Y2ggc2l0dWF0aW9ucyBhcyBhbgorCSAqICAgIGVycm9yIG9yIGEgd2FybmluZy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9PVkVSUklESU5HX1BBQ0tBR0VfREVGQVVMVF9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBNZXRob2QgV2l0aCBDb25zdHJ1Y3RvciBOYW1lLgorCSAqIDxwPk5hbWluZyBhIG1ldGhvZCB3aXRoIGEgY29uc3RydWN0b3IgbmFtZSBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCBwb29yCisJICogICAgc3R5bGUgcHJvZ3JhbW1pbmcuIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCBzdWNoCisJICogICAgc2NlbmFyaWkgZWl0aGVyIGFzIGFuIGVycm9yIG9yIGEgd2FybmluZy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUVUSE9EX1dJVEhfQ09OU1RSVUNUT1JfTkFNRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBEZXByZWNhdGlvbi4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1c2Ugb2YgZGVwcmVjYXRlZCBBUEkgZWl0aGVyIGFzIGFuCisJICogICAgZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfREVQUkVDQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb24iOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIERlcHJlY2F0aW9uIEluc2lkZSBEZXByZWNhdGVkIENvZGUuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgdXNlIG9mIGRlcHJlY2F0ZWQgQVBJIGluc2lkZSBkZXByZWNhdGVkIGNvZGUuCisJICogPHA+VGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24ge0BsaW5rICNDT01QSUxFUl9QQl9ERVBSRUNBVElPTn0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGUiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIERlcHJlY2F0aW9uIFdoZW4gT3ZlcnJpZGluZyBEZXByZWNhdGVkIE1ldGhvZC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB0aGUgZGVjbGFyYXRpb24gb2YgYSBtZXRob2Qgb3ZlcnJpZGluZyBhIGRlcHJlY2F0ZWQgb25lLgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uIHtAbGluayAjQ09NUElMRVJfUEJfREVQUkVDQVRJT059LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX1dIRU5fT1ZFUlJJRElOR19ERVBSRUNBVEVEX01FVEhPRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBIaWRkZW4gQ2F0Y2ggQmxvY2suCisJICogPHA+TG9jYWxseSB0byBhIHRyeSBzdGF0ZW1lbnQsIHNvbWUgY2F0Y2ggYmxvY2tzIG1heSBoaWRlIG90aGVycy4gRm9yIGV4YW1wbGUsCisJICogICAgPHByZT4KKwkgKiAgICAgIHRyeSB7ICB0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigpOworCSAqICAgICAgfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7CisJICogICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHt9LgorCSAqICAgIDwvcHJlPgorCSAqICAgIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgaGlkZGVuCisJICogICAgY2F0Y2ggYmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gY2hlY2tlZCBleGNlcHRpb25zLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2siPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0sgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW51c2VkIExvY2FsLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgbG9jYWwKKwkgKiAgICB2YXJpYWJsZXMgKHRoYXQgaXMsIHZhcmlhYmxlcyBuZXZlciByZWFkIGZyb20pLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX0xPQ0FMID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbnVzZWQgUGFyYW1ldGVyLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgbWV0aG9kCisJICogICAgcGFyYW1ldGVycyAodGhhdCBpcywgcGFyYW1ldGVycyBuZXZlciByZWFkIGZyb20pLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVudXNlZCBQYXJhbWV0ZXIgaWYgSW1wbGVtZW50aW5nIEFic3RyYWN0IE1ldGhvZC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1bnVzZWQgcGFyYW1ldGVycyBpbiBhYnN0cmFjdCBtZXRob2QgaW1wbGVtZW50YXRpb25zLgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uIHtAbGluayAjQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUn0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0IjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9QQVJBTUVURVJfV0hFTl9JTVBMRU1FTlRJTkdfQUJTVFJBQ1QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0IjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbnVzZWQgUGFyYW1ldGVyIGlmIE92ZXJyaWRpbmcgQ29uY3JldGUgTWV0aG9kLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVudXNlZCBwYXJhbWV0ZXJzIGluIG1ldGhvZHMgb3ZlcnJpZGluZyBjb25jcmV0ZSBvbmVzLgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uIHtAbGluayAjQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUn0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZGlzYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX1dIRU5fT1ZFUlJJRElOR19DT05DUkVURSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IENvbnNpZGVyIFJlZmVyZW5jZSBpbiBEb2MgQ29tbWVudCBmb3IgVW51c2VkIFBhcmFtZXRlciBDaGVjay4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGRvYyBjb21tZW50IHJlZmVyZW5jZXMgdG8gcGFyYW1ldGVycyAoaS5lLiA8Y29kZT5AcGFyYW08L2NvZGU+IGNsYXVzZXMpIGZvciB0aGUgdW51c2VkCisJICogICAgcGFyYW1ldGVyIGNoZWNrLiBUaHVzLCBkb2N1bWVudGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBjb25zaWRlcmVkIGFzIG1hbmRhdGVkIGFzIHBlciBkb2MgY29udHJhY3QuCisJICogPHA+VGhlIHNldmVyaXR5IG9mIHRoZSB1bnVzZWQgcGFyYW1ldGVyIHByb2JsZW0gaXMgY29udHJvbGxlZCB3aXRoIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX1BCX1VOVVNFRF9QQVJBTUVURVJ9LgorCSAqIDxwPk5vdGU6IHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgdW50aWwgdGhlIGRvYyBjb21tZW50IHN1cHBvcnQgaXMgZW5hYmxlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogICAgb3B0aW9uIHtAbGluayAjQ09NUElMRVJfRE9DX0NPTU1FTlRfU1VQUE9SVH0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2UiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImVuYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4zCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX0lOQ0xVREVfRE9DX0NPTU1FTlRfUkVGRVJFTkNFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbnVzZWQgSW1wb3J0LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgaW1wb3J0CisJICogICAgcmVmZXJlbmNlLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfSU1QT1JUID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgUHJlc2VuY2Ugb2YgVHlwZSBBcmd1bWVudHMgZm9yIGEgTm9uLUdlbmVyaWMgTWV0aG9kIEludm9jYXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgdHlwZSBhcmd1bWVudHMgYXJlIGVuY291bnRlcmVkIGZvciBhCisJICogICAgbm9uLWdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24uIE5vdGUgdGhhdCBwcmlvciB0byBjb21wbGlhbmNlIGxldmVsIGlzIDxjb2RlPiIxLjciPC9jb2RlPiwgdGhpcyBzaXR1YXRpb24gd291bGQgYXV0b21hdGljYWxseSByZXN1bHQKKwkgKiAgICBpbiBhbiBlcnJvci4gRnJvbSBKYXZhNyBvbiwgdW51c2VkIHR5cGUgYXJndW1lbnRzIGFyZSBiZWluZyB0b2xlcmF0ZWQsIGFuZCBvcHRpb25hbGx5IHdhcm5lZCBhZ2FpbnN0LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9UWVBFX0FSR1VNRU5UU19GT1JfTUVUSE9EX0lOVk9DQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkVHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb24iOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgU3ludGhldGljIEFjY2VzcyBFbXVsYXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgaXQgZW11bGF0ZXMKKwkgKiAgICBhY2Nlc3MgdG8gYSBub24tYWNjZXNzaWJsZSBtZW1iZXIgb2YgYW4gZW5jbG9zaW5nIHR5cGUuIFN1Y2ggYWNjZXNzIGNhbiBoYXZlCisJICogICAgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfU1lOVEhFVElDX0FDQ0VTU19FTVVMQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBOb24tRXh0ZXJuYWxpemVkIFN0cmluZyBMaXRlcmFsLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciBub24gZXh0ZXJuYWxpemVkCisJICogICAgU3RyaW5nIGxpdGVyYWwgKHRoYXQgaXMsIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT4vLyROT04tTkxTLSZsdDtuJmd0OyQ8L2NvZGU+KS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTk9OX05MU19TVFJJTkdfTElURVJBTCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVc2FnZSBvZiA8Y29kZT4nYXNzZXJ0JzwvY29kZT4gSWRlbnRpZmllci4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciA8Y29kZT4nYXNzZXJ0JzwvY29kZT4gaXMKKwkgKiAgICB1c2VkIGFzIGFuIGlkZW50aWZpZXIgKHJlc2VydmVkIGtleXdvcmQgaW4gMS40KS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVzYWdlIG9mIDxjb2RlPidlbnVtJzwvY29kZT4gSWRlbnRpZmllci4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciA8Y29kZT4nZW51bSc8L2NvZGU+IGlzCisJICogICAgdXNlZCBhcyBhbiBpZGVudGlmaWVyIChyZXNlcnZlZCBrZXl3b3JkIGluIDEuNSkuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXIiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBOb24tU3RhdGljIFJlZmVyZW5jZSB0byBhIFN0YXRpYyBNZW1iZXIuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBzdGF0aWMgZmllbGQKKwkgKiAgICBvciBtZXRob2QgaXMgYWNjZXNzZWQgd2l0aCBhbiBleHByZXNzaW9uIHJlY2VpdmVyLiBBIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBtZW1iZXIgc2hvdWxkCisJICogICAgYmUgcXVhbGlmaWVkIHdpdGggYSB0eXBlIG5hbWUuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXIiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfU1RBVElDX0FDQ0VTU19SRUNFSVZFUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlciI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgSW5kaXJlY3QgUmVmZXJlbmNlIHRvIGEgU3RhdGljIE1lbWJlci4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhIHN0YXRpYyBmaWVsZAorCSAqICAgIG9yIG1ldGhvZCBpcyBhY2Nlc3NlZCBpbiBhbiBpbmRpcmVjdCB3YXkuIEEgcmVmZXJlbmNlIHRvIGEgc3RhdGljIG1lbWJlciBzaG91bGQKKwkgKiAgICBwcmVmZXJhYmx5IGJlIHF1YWxpZmllZCB3aXRoIGl0cyBkZWNsYXJpbmcgdHlwZSBuYW1lLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5ESVJFQ1RfU1RBVElDX0FDQ0VTUyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2VzcyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgQXNzaWdubWVudCB3aXRoIG5vIEVmZmVjdC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhbiBhc3NpZ25tZW50CisJICogICAgaGFzIG5vIGVmZmVjdCAoZS5nIDxjb2RlPid4ID0geCc8L2NvZGU+KS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTk9fRUZGRUNUX0FTU0lHTk1FTlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBJbnRlcmZhY2UgTWV0aG9kIG5vdCBDb21wYXRpYmxlIHdpdGggbm9uLUluaGVyaXRlZCBNZXRob2RzLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIGludGVyZmFjZQorCSAqICAgIGRlZmluZXMgYSBtZXRob2QgaW5jb21wYXRpYmxlIHdpdGggYSBub24taW5oZXJpdGVkIDxjb2RlPk9iamVjdDwvY29kZT4gbWV0aG9kLiBVbnRpbCB0aGlzIGNvbmZsaWN0CisJICogICAgaXMgcmVzb2x2ZWQsIHN1Y2ggYW4gaW50ZXJmYWNlIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCwgRm9yIGV4YW1wbGUsCisJICogICAgPHByZT4KKwkgKiAgICAgIGludGVyZmFjZSBJIHsKKwkgKiAgICAgICAgIGludCBjbG9uZSgpOworCSAqICAgICAgfQorCSAqICAgIDwvcHJlPgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9JTkNPTVBBVElCTEVfTk9OX0lOSEVSSVRFRF9JTlRFUkZBQ0VfTUVUSE9EID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW51c2VkIFByaXZhdGUgTWVtYmVycy4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhIHByaXZhdGUKKwkgKiAgICBtZXRob2Qgb3IgZmllbGQgaXMgZGVjbGFyZWQgYnV0IG5ldmVyIHVzZWQgd2l0aGluIHRoZSBzYW1lIHVuaXQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlciI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUFJJVkFURV9NRU1CRVIgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlciI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgTG9jYWwgVmFyaWFibGUgRGVjbGFyYXRpb24gSGlkaW5nIGFub3RoZXIgVmFyaWFibGUuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBsb2NhbCB2YXJpYWJsZQorCSAqICAgIGRlY2xhcmF0aW9uIGlzIGhpZGluZyBzb21lIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlIChlaXRoZXIgbG9jYWxseSwgaW5oZXJpdGVkIG9yIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGUpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmciPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9MT0NBTF9WQVJJQUJMRV9ISURJTkcgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgU3BlY2lhbCBQYXJhbWV0ZXIgSGlkaW5nIGFub3RoZXIgRmllbGQuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgY2FzZXMgd2hlcmUgYSBjb25zdHJ1Y3RvciBvciBzZXR0ZXIgbWV0aG9kIHBhcmFtZXRlciBkZWNsYXJhdGlvbgorCSAqICAgIGlzIGhpZGluZyBzb21lIGZpZWxkIChlaXRoZXIgbG9jYWxseSwgaW5oZXJpdGVkIG9yIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGUpLgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uIHtAbGluayAjQ09NUElMRVJfUEJfTE9DQUxfVkFSSUFCTEVfSElESU5HfS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfU1BFQ0lBTF9QQVJBTUVURVJfSElESU5HX0ZJRUxEID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgRmllbGQgRGVjbGFyYXRpb24gSGlkaW5nIGFub3RoZXIgVmFyaWFibGUuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBmaWVsZAorCSAqICAgIGRlY2xhcmF0aW9uIGlzIGhpZGluZyBzb21lIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlIChlaXRoZXIgbG9jYWxseSwgaW5oZXJpdGVkIG9yIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGUpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfRklFTERfSElESU5HID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBUeXBlIERlY2xhcmF0aW9uIEhpZGluZyBhbm90aGVyIFR5cGUuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaW4gc2l0dWF0aW9ucyB3aGVyZSBhIHR5cGUgcGFyYW1ldGVyCisJICogICAgZGVjbGFyYXRpb24gaXMgaGlkaW5nIHNvbWUgdHlwZSwgd2hlbiBhIG5lc3RlZCB0eXBlIGlzIGhpZGluZyBzb21lIHR5cGUgcGFyYW1ldGVyLCBvciB3aGVuCisJICogICAgYSBuZXN0ZWQgdHlwZSBpcyBoaWRpbmcgYW5vdGhlciBuZXN0ZWQgdHlwZSBkZWZpbmVkIGluIHNhbWUgdW5pdC4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1RZUEVfUEFSQU1FVEVSX0hJRElORyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBQb3NzaWJsZSBBY2NpZGVudGFsIEJvb2xlYW4gQXNzaWdubWVudC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIGJvb2xlYW4gYXNzaWdubWVudCBpcyBhY3RpbmcgYXMgdGhlIGNvbmRpdGlvbgorCSAqICAgIG9mIGEgY29udHJvbCBzdGF0ZW1lbnQgICh3aGVyZSBpdCBwcm9iYWJseSB3YXMgbWVhbnQgdG8gYmUgYSBib29sZWFuIGNvbXBhcmlzb24pLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50IjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfUE9TU0lCTEVfQUNDSURFTlRBTF9CT09MRUFOX0FTU0lHTk1FTlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFN3aXRjaCBGYWxsLVRocm91Z2ggQ2FzZS4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIGNhc2UgbWF5IGJlCisJICogICAgZW50ZXJlZCBieSBmYWxsaW5nIHRocm91Z2ggcHJldmlvdXMgY2FzZS4gRW1wdHkgY2FzZXMgYXJlIGFsbG93ZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfRkFMTFRIUk9VR0hfQ0FTRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2UiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEVtcHR5IFN0YXRlbWVudHMgYW5kIFVubmVjZXNzYXJ5IFNlbWljb2xvbnMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYW4gZW1wdHkgc3RhdGVtZW50IG9yIGEKKwkgKiAgICB1bm5lY2Vzc2FyeSBzZW1pY29sb24gaXMgZW5jb3VudGVyZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9FTVBUWV9TVEFURU1FTlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRC4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ib29sZWFuTWV0aG9kVGhyb3dpbmdFeGNlcHRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKiBAZGVwcmVjYXRlZCAtIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9CT09MRUFOX01FVEhPRF9USFJPV0lOR19FWENFUFRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uYm9vbGVhbk1ldGhvZFRocm93aW5nRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbm5lY2Vzc2FyeSBUeXBlIENoZWNrLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYSBjYXN0IG9yIGFuIDxjb2RlPmluc3RhbmNlb2Y8L2NvZGU+IG9wZXJhdGlvbgorCSAqICAgIGlzIHVubmVjZXNzYXJ5LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5ORUNFU1NBUllfVFlQRV9DSEVDSyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW5uZWNlc3NhcnkgRWxzZS4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGEgc3RhdGVtZW50IGlzIHVubmVjZXNzYXJpbHkKKwkgKiAgICBuZXN0ZWQgd2l0aGluIGFuIDxjb2RlPmVsc2U8L2NvZGU+IGNsYXVzZSAoaW4gc2l0dWF0aW9uIHdoZXJlIHRoZW4gY2xhdXNlIGlzIG5vdCBjb21wbGV0aW5nIG5vcm1hbGx5KS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2UiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTk5FQ0VTU0FSWV9FTFNFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW5kb2N1bWVudGVkIEVtcHR5IEJsb2NrLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYW4gZW1wdHkgYmxvY2sgaXMgZGV0ZWN0ZWQgYW5kIGl0IGlzIG5vdAorCSAqICAgIGRvY3VtZW50ZWQgd2l0aCBhbnkgY29tbWVudC4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5ET0NVTUVOVEVEX0VNUFRZX0JMT0NLID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2siOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEZpbmFsbHkgQmxvY2tzIE5vdCBDb21wbGV0aW5nIE5vcm1hbGx5LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYSBmaW5hbGx5IGJsb2NrIGRvZXMgbm90IGNvbXBsZXRlIG5vcm1hbGx5LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9GSU5BTExZX0JMT0NLX05PVF9DT01QTEVUSU5HID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW51c2VkIERlY2xhcmVkIFRocm93biBFeGNlcHRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBhCisJICogICAgbWV0aG9kIG9yIGEgY29uc3RydWN0b3IgaXMgZGVjbGFyaW5nIGEgY2hlY2tlZCBleGNlcHRpb24gYXMgdGhyb3duLAorCSAqICAgIGJ1dCBpdHMgYm9keSBhY3R1YWxseSByYWlzZXMgbmVpdGhlciB0aGF0IGV4Y2VwdGlvbiwgbm9yIGFueSBvdGhlcgorCSAqICAgIGV4Y2VwdGlvbiBleHRlbmRpbmcgaXQuCisJICogPHA+VGhpcyBkaWFnbm9zdGljIGlzIGZ1cnRoZXIgdHVuZWQgYnkgb3B0aW9ucworCSAqICAgIHtAbGluayAjQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fSU5DTFVERV9ET0NfQ09NTUVOVF9SRUZFUkVOQ0V9LAorCSAqICAgIHtAbGluayAjQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fRVhFTVBUX0VYQ0VQVElPTl9BTkRfVEhST1dBQkxFfSwKKwkgKiAgICBhbmQge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9XSEVOX09WRVJSSURJTkd9LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVudXNlZCBEZWNsYXJlZCBUaHJvd24gRXhjZXB0aW9uIGluIE92ZXJyaWRpbmcgTWV0aG9kLgorCSAqIDxwPldoZW4gZGlzYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHJlcG9ydCB1bnVzZWQgZGVjbGFyZWQgdGhyb3duCisJICogICAgZXhjZXB0aW9ucyBuZWl0aGVyIG9uIG92ZXJyaWRpbmcgbWV0aG9kcyBub3Igb24gaW1wbGVtZW50aW5nIG1ldGhvZHMuCisJICogPHA+VGhlIHNldmVyaXR5IG9mIHRoZSB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBwcm9ibGVtIGlzCisJICogICAgY29udHJvbGxlZCB3aXRoIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX1BCX1VOVVNFRF9ERUNMQVJFRF9USFJPV05fRVhDRVBUSU9OfS4KKwkgKiA8cD5UaGlzIGRpYWdub3N0aWMgaXMgZnVydGhlciB0dW5lZCBieSBvcHRpb25zCisJICogICAge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9JTkNMVURFX0RPQ19DT01NRU5UX1JFRkVSRU5DRX0gYW5kCisJICogICAge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9FWEVNUFRfRVhDRVBUSU9OX0FORF9USFJPV0FCTEV9LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmciPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fV0hFTl9PVkVSUklESU5HID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmciOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogQ29uc2lkZXIgUmVmZXJlbmNlIGluIERvYyBDb21tZW50IGZvciBVbnVzZWQgRGVjbGFyZWQgVGhyb3duIEV4Y2VwdGlvbiBDaGVjay4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGRvYyBjb21tZW50IHJlZmVyZW5jZXMgdG8KKwkgKiAgICBleGNlcHRpb25zIChpLmUuIDxjb2RlPkB0aHJvd3M8L2NvZGU+IGNsYXVzZXMpIGZvciB0aGUgdW51c2VkCisJICogICAgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBjaGVjay4gVGh1cywgZG9jdW1lbnRlZCBleGNlcHRpb25zIHdpbGwgYmUKKwkgKiAgICBjb25zaWRlcmVkIGFzIG1hbmRhdGVkIGFzIHBlciBkb2MgY29udHJhY3QuCisJICogPHA+VGhlIHNldmVyaXR5IG9mIHRoZSB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24ge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTn0uCisJICogPHA+Tm90ZTogdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCB1bnRpbCB0aGUgZG9jIGNvbW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkIGFjY29yZGluZyB0byB0aGUKKwkgKiAgICBvcHRpb24ge0BsaW5rICNDT01QSUxFUl9ET0NfQ09NTUVOVF9TVVBQT1JUfS4KKwkgKiA8cD5UaGlzIGRpYWdub3N0aWMgaXMgZnVydGhlciB0dW5lZCBieSBvcHRpb25zCisJICogICAge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9FWEVNUFRfRVhDRVBUSU9OX0FORF9USFJPV0FCTEV9CisJICogICAgYW5kIHtAbGluayAjQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fV0hFTl9PVkVSUklESU5HfS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlbmFibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fSU5DTFVERV9ET0NfQ09NTUVOVF9SRUZFUkVOQ0UgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbnVzZWQgRGVjbGFyZWQgVGhyb3duIEV4Y2VwdGlvbiBFeGVtcHRzIEV4Y2VwdGlvbiBBbmQgVGhyb3dhYmxlLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYQorCSAqICAgIG1ldGhvZCBvciBhIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmluZyBhIGNoZWNrZWQgZXhjZXB0aW9uIGVsc2UgdGhhbgorCSAqICAgIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlfSBvciB7QGxpbmsgamF2YS5sYW5nLkV4Y2VwdGlvbn0gYXMgdGhyb3duLAorCSAqICAgIGJ1dCBpdHMgYm9keSBhY3R1YWxseSByYWlzZXMgbmVpdGhlciB0aGF0IGV4Y2VwdGlvbiwgbm9yIGFueSBvdGhlcgorCSAqICAgIGV4Y2VwdGlvbiBleHRlbmRpbmcgaXQuIFdoZW4gZGlzYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuCisJICogICAgZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYSBtZXRob2Qgb3IgYSBjb25zdHJ1Y3RvciBpcyBkZWNsYXJpbmcgYQorCSAqICAgIGNoZWNrZWQgZXhjZXB0aW9uIChpbmNsdWRpbmcge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGV9IGFuZAorCSAqICAgIHtAbGluayBqYXZhLmxhbmcuRXhjZXB0aW9ufSkgYXMgdGhyb3duLCBidXQgaXRzIGJvZHkgYWN0dWFsbHkgcmFpc2VzCisJICogICAgbmVpdGhlciB0aGF0IGV4Y2VwdGlvbiwgbm9yIGFueSBvdGhlciBleGNlcHRpb24gZXh0ZW5kaW5nIGl0LgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgdW51c2VkIGRlY2xhcmVkIHRocm93biBleGNlcHRpb24gcHJvYmxlbSBpcworCSAqICAgIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24KKwkgKiAgICB7QGxpbmsgI0NPTVBJTEVSX1BCX1VOVVNFRF9ERUNMQVJFRF9USFJPV05fRVhDRVBUSU9OfS4KKwkgKiA8cD5UaGlzIGRpYWdub3N0aWMgaXMgZnVydGhlciB0dW5lZCBieSBvcHRpb25zCisJICogICAge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9JTkNMVURFX0RPQ19DT01NRU5UX1JFRkVSRU5DRX0KKwkgKiAgICBhbmQge0BsaW5rICNDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTl9XSEVOX09WRVJSSURJTkd9LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlbmFibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fRVhFTVBUX0VYQ0VQVElPTl9BTkRfVEhST1dBQkxFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVucXVhbGlmaWVkIEFjY2VzcyB0byBGaWVsZC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGEgZmllbGQgaXMgYWNjZXNzIHdpdGhvdXQgYW55IHF1YWxpZmljYXRpb24uCisJICogICAgSW4gb3JkZXIgdG8gaW1wcm92ZSBjb2RlIHJlYWRhYmlsaXR5LCBpdCBzaG91bGQgYmUgcXVhbGlmaWVkLCBlLmcuIDxjb2RlPid4JzwvY29kZT4gc2hvdWxkIHJhdGhlciBiZSB3cml0dGVuIDxjb2RlPid0aGlzLngnPC9jb2RlPi4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5RVUFMSUZJRURfRklFTERfQUNDRVNTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3MiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBkZXByZWNhdGVkIC0gZ290IHJlbmFtZWQgaW50byB7QGxpbmsgI0NPTVBJTEVSX1BCX1VOQ0hFQ0tFRF9UWVBFX09QRVJBVElPTn0KKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNDT01QSUxFUl9QQl9VTkNIRUNLRURfVFlQRV9PUEVSQVRJT059IGluc3RlYWQuCiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlNBRkVfVFlQRV9PUEVSQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW5jaGVja2VkIFR5cGUgT3BlcmF0aW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIG9wZXJhdGlvbiBpbnZvbHZlcyBnZW5lcmljIHR5cGVzLCBhbmQgcG90ZW50aWFsbHkKKwkgKiAgICBpbnZhbGlkYXRlcyB0eXBlIHNhZmV0eSBzaW5jZSBpbnZvbHZpbmcgcmF3IHR5cGVzIChlLmcuIGludm9raW5nIDxjb2RlPiNmb28oWCZsdDtTdHJpbmcmZ3Q7KTwvY29kZT4gd2l0aCBhcmd1bWVudHMgPGNvZGU+KFgpPC9jb2RlPikuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbiI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTkNIRUNLRURfVFlQRV9PUEVSQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgUmF3IFR5cGUgUmVmZXJlbmNlLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gZGV0ZWN0aW5nIHJlZmVyZW5jZXMgdG8gcmF3IHR5cGVzLiBSYXcgdHlwZXMgYXJlCisJICogICAgZGlzY291cmFnZWQsIGFuZCBhcmUgaW50ZW5kZWQgdG8gaGVscCBpbnRlcmZhY2luZyB3aXRoIGxlZ2FjeSBjb2RlLiBJbiB0aGUgZnV0dXJlLCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBtYXkKKwkgKiAgICByZWplY3QgcmF3IHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjIKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1JBV19UWVBFX1JFRkVSRU5DRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBvZiBVbmF2b2lkYWJsZSBHZW5lcmljIFR5cGUgUHJvYmxlbXMuCisJICogPHA+IFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3Igd2FybmluZyBldmVuIHdoZW4gaXQgZGV0ZWN0cyBhIGdlbmVyaWMgdHlwZSBwcm9ibGVtCisJICogICAgIHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiBhdm9pZGVkIGJ5IHRoZSBwcm9ncmFtbWVyLiBBcyBhbiBleGFtcGxlLCBhIHR5cGUgbWF5IGJlIGZvcmNlZCB0byB1c2UgcmF3IHR5cGVzCisJICogICAgIGluIGl0cyBtZXRob2Qgc2lnbmF0dXJlcyBhbmQgcmV0dXJuIHR5cGVzIGJlY2F1c2UgdGhlIG1ldGhvZHMgaXQgb3ZlcnJpZGVzIGZyb20gYSBzdXBlciB0eXBlIGFyZSBkZWNsYXJlZCB0bworCSAqICAgICB1c2UgcmF3IHR5cGVzIGluIHRoZSBmaXJzdCBwbGFjZS4gIAorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuYXZvaWRhYmxlR2VuZXJpY1R5cGVQcm9ibGVtcyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjcKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOQVZPSURBQkxFX0dFTkVSSUNfVFlQRV9QUk9CTEVNUyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bmF2b2lkYWJsZUdlbmVyaWNUeXBlUHJvYmxlbXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBmaW5hbCBCb3VuZCBmb3IgVHlwZSBQYXJhbWV0ZXIuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhCisJICogICAgYm91bmQgY29ycmVzcG9uZGluZyB0byBhIGZpbmFsIHR5cGU7IHNpbmNlIGZpbmFsIHR5cGVzIGNhbm5vdCBiZSBmdXJ0aGVyIGV4dGVuZGVkLCB0aGUgcGFyYW1ldGVyIGlzIHByZXR0eSB1c2VsZXNzLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfRklOQUxfUEFSQU1FVEVSX0JPVU5EID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgRGVjbGFyYXRpb24gb2Ygc2VyaWFsVmVyc2lvblVJRCBGaWVsZCBvbiBTZXJpYWxpemFibGUgQ2xhc3MuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBzZXJpYWxpemFibGUgY2xhc3MgaXMgbWlzc2luZyBhIGxvY2FsIGRlY2xhcmF0aW9uCisJICogICAgb2YgYSA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPiBmaWVsZC4gVGhpcyBmaWVsZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHN0YXRpYyBmaW5hbCBhbmQgYmUgb2YgdHlwZSA8Y29kZT5sb25nPC9jb2RlPi4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbiI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX1NFUklBTF9WRVJTSU9OID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBWYXJhcmdzIEFyZ3VtZW50IE5lZWRpbmcgYSBDYXN0IGluIE1ldGhvZC9Db25zdHJ1Y3RvciBJbnZvY2F0aW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgdmFyYXJncyBhcmd1bWVudHMgc2hvdWxkIGJlIGNhc3QKKwkgKiAgICB3aGVuIHBhc3NlZCB0byBhIG1ldGhvZC9jb25zdHJ1Y3RvciBpbnZvY2F0aW9uLiAoZS5nLiA8Y29kZT5DbGFzcy5nZXRNZXRob2QoU3RyaW5nIG5hbWUsIENsYXNzIC4uLiBhcmdzICk8L2NvZGU+CisJICogICAgaW52b2tlZCB3aXRoIGFyZ3VtZW50cyA8Y29kZT4oImZvbyIsIG51bGwpPC9jb2RlPikuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3QiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJ3YXJuaW5nIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVkFSQVJHU19BUkdVTUVOVF9ORUVEX0NBU1QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3QiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEJveGluZy9VbmJveGluZyBDb252ZXJzaW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgYm94aW5nIG9yIGFuIHVuYm94aW5nCisJICogICAgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0FVVE9CT1hJTkcgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVXNlIG9mIEFubm90YXRpb24gVHlwZSBhcyBTdXBlciBJbnRlcmZhY2UuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYW4gYW5ub3RhdGlvbiB0eXBlIGlzIHVzZWQKKwkgKiAgICBhcyBhIHN1cGVyLWludGVyZmFjZS4gVGhvdWdoIGxlZ2FsLCB0aGlzIGlzIGRpc2NvdXJhZ2VkLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9BTk5PVEFUSU9OX1NVUEVSX0lOVEVSRkFDRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgPGNvZGU+QE92ZXJyaWRlPC9jb2RlPiBBbm5vdGF0aW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGVuY291bnRlcmluZyBhIG1ldGhvZAorCSAqICAgIGRlY2xhcmF0aW9uIHdoaWNoIG92ZXJyaWRlcyBhIHN1cGVyY2xhc3MgbWV0aG9kIGJ1dCBoYXMgbm8gPGNvZGU+QE92ZXJyaWRlPC9jb2RlPiBhbm5vdGF0aW9uLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX09WRVJSSURFX0FOTk9UQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgTWlzc2luZyA8Y29kZT5AT3ZlcnJpZGU8L2NvZGU+IEFubm90YXRpb24gZm9yIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgZW5jb3VudGVyaW5nIGEgbWV0aG9kCisJICogICAgZGVjbGFyYXRpb24gd2hpY2ggb3ZlcnJpZGVzIG9yIGltcGxlbWVudHMgYSBzdXBlcmludGVyZmFjZSBtZXRob2QgYnV0IGhhcyBubyA8Y29kZT5AT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgorCSAqIDxwPlRoaXMgb3B0aW9uIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSBpcyAxLjYgb3IgZ3JlYXRlci48L3A+CisJICogPHA+VGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24ge0BsaW5rICNDT01QSUxFUl9QQl9NSVNTSU5HX09WRVJSSURFX0FOTk9UQVRJT059LjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImVuYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy42CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX09WRVJSSURFX0FOTk9UQVRJT05fRk9SX0lOVEVSRkFDRV9NRVRIT0RfSU1QTEVNRU5UQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbkZvckludGVyZmFjZU1ldGhvZEltcGxlbWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgPGNvZGU+QERlcHJlY2F0ZWQ8L2NvZGU+IEFubm90YXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgZW5jb3VudGVyaW5nIGEgZGVjbGFyYXRpb24KKwkgKiAgICBjYXJyeWluZyBhIDxjb2RlPkBkZXByZWNhdGVkPC9jb2RlPiBkb2MgdGFnIGJ1dCBoYXZpbmcgbm8gY29ycmVzcG9uZGluZyA8Y29kZT5ARGVwcmVjYXRlZDwvY29kZT4gYW5ub3RhdGlvbi4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0RFUFJFQ0FURURfQU5OT1RBVElPTiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgSGFzaENvZGUgTWV0aG9kLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgdHlwZQorCSAqIG92ZXJyaWRlcyBPYmplY3QuZXF1YWxzKE9iamVjdCkgYnV0IGRvZXMgbm90IG92ZXJyaWRlIGhhc2hDb2RlKCkuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIERlYWQgQ29kZS4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBzb21lIG5vbiBmYXRhbCBkZWFkIGNvZGUgaXMgZGV0ZWN0ZWQuIEZvciBpbnN0YW5jZSwgPGNvZGU+aWYgKGZhbHNlKSBmb28oKTs8L2NvZGU+CisJICogaXMgbm90IHJlcG9ydGVkIGFzIHRydWx5IHVucmVhY2hhYmxlIGNvZGUgYnkgdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbi4gSWYgdGhpcyBkaWFnbm9zdGljIGlzIGVuYWJsZWQsIHRoZW4gdGhlIGludm9jYXRpb24gb2YgPGNvZGU+Zm9vKCk8L2NvZGU+IGlzCisJICogZ29pbmcgdG8gYmUgc2lnbmFsZWQgYXMgYmVpbmcgZGVhZCBjb2RlLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjUKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFQURfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBEZWFkIENvZGUgSW5zaWRlIFRyaXZpYWwgSWYgU3RhdGVtZW50LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHByZXNlbmNlIG9mIGRlYWQgY29kZSBpbnNpZGUgdHJpdmlhbCBJRiBzdGF0ZW1lbnQsIGUuZy4gPGNvZGU+aWYgKERFQlVHKS4uLjwvY29kZT4uLgorCSAqIDxwPlRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uIHtAbGluayAjQ09NUElMRVJfUEJfREVBRF9DT0RFfS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZUluVHJpdmlhbElmU3RhdGVtZW50IjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjUKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9ERUFEX0NPREVfSU5fVFJJVklBTF9JRl9TVEFURU1FTlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBJbmNvbXBsZXRlIEVudW0gU3dpdGNoLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyCisJICogICAgYW4gZW51bSBjb25zdGFudCBoYXMgbm8gY29ycmVzcG9uZGluZyBjYXNlIGxhYmVsIGluIGFuIGVudW0gc3dpdGNoCisJICogICAgc3RhdGVtZW50LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5DT01QTEVURV9FTlVNX1NXSVRDSCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KIAkgKiBAc2luY2UgMy4xCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjQ09NUElMRVJfUEJfTlVMTF9SRUZFUkVOQ0V9IGluc3RlYWQKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNDT01QSUxFUl9QQl9OVUxMX1JFRkVSRU5DRX0gaW5zdGVhZC4KKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5DT05TSVNURU5UX05VTExfQ0hFQ0sgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW5jb25zaXN0ZW50TnVsbENoZWNrIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBVbnJlZmVyZW5jZWQgTGFiZWwuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBlbmNvdW50ZXJpbmcgYSBsYWJlbGVkIHN0YXRlbWVudCB3aGljaCBsYWJlbAorCSAqICAgIGlzIG5ldmVyIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gQSBsYWJlbCBpcyBjb25zaWRlcmVkIHRvIGJlIHJlZmVyZW5jZWQgaWYgaXRzIG5hbWUgZXhwbGljaXRseSBhcHBlYXJzIGJlaGluZCBhIGJyZWFrCisJICogICAgb3IgY29udGludWUgc3RhdGVtZW50OyBmb3IgaW5zdGFuY2UgdGhlIGZvbGxvd2luZyBsYWJlbCB3b3VsZCBiZSBjb25zaWRlcmVkIHVucmVmZXJlbmNlZDoKKwkgKiAgICA8Y29kZT5MQUJFTDogeyBicmVhazsgfTwvY29kZT4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4yCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfTEFCRUwgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWwiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEludmFsaWQgSmF2YWRvYyBDb21tZW50LgorCSAqIDxwPlRoaXMgaXMgdGhlIGdlbmVyaWMgY29udHJvbCBmb3IgdGhlIHNldmVyaXR5IG9mIEphdmFkb2MgcHJvYmxlbXMuCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIGEgcHJvYmxlbSBpbiBKYXZhZG9jLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSU5WQUxJRF9KQVZBRE9DID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBJbnZhbGlkIEphdmFkb2MgVGFncy4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1bmJvdW5kIG9yIHVuZXhwZWN0ZWQgcmVmZXJlbmNlIHRhZ3MgaW4gSmF2YWRvYy4KKwkgKiAgICBBIDxjb2RlPkB0aHJvd3M8L2NvZGU+IHRhZyByZWZlcmVuY2luZyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiB3b3VsZCBiZSBjb25zaWRlcmVkIGFzIHVuZXhwZWN0ZWQuCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOworCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nIHtAbGluayAjQ09NUElMRVJfUEJfSU5WQUxJRF9KQVZBRE9DX1RBR1NfVklTSUJJTElUWX0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgSW52YWxpZCBKYXZhZG9jIFRhZ3Mgd2l0aCBEZXByZWNhdGVkIFJlZmVyZW5jZXMuCisJICogPHA+U3BlY2lmeSB3aGV0aGVyIHRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBkZXByZWNhdGVkIHJlZmVyZW5jZXMgdXNlZCBpbiBKYXZhZG9jIHRhZ3MuCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOworCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nIHtAbGluayAjQ09NUElMRVJfUEJfSU5WQUxJRF9KQVZBRE9DX1RBR1NfVklTSUJJTElUWX0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZiI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZGlzYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0NfVEFHU19fREVQUkVDQVRFRF9SRUYgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgSW52YWxpZCBKYXZhZG9jIFRhZ3Mgd2l0aCBOb3QgVmlzaWJsZSBSZWZlcmVuY2VzLgorCSAqIDxwPlNwZWNpZnkgd2hldGhlciB0aGUgY29tcGlsZXIgd2lsbCByZXBvcnQgbm9uLXZpc2libGUgcmVmZXJlbmNlcyB1c2VkIGluIEphdmFkb2MgdGFncy4KKwkgKiA8cD5Ob3RlIHRoYXQgdGhpcyBkaWFnbm9zaXMgY2FuIGJlIGVuYWJsZWQgYmFzZWQgb24gdGhlIHZpc2liaWxpdHkgb2YgdGhlIGNvbnN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIEphdmFkb2M7CisJICogICAgYWxzbyBzZWUgdGhlIHNldHRpbmcge0BsaW5rICNDT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0NfVEFHU19WSVNJQklMSVRZfS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTX19OT1RfVklTSUJMRV9SRUYgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBWaXNpYmlsaXR5IExldmVsIEZvciBJbnZhbGlkIEphdmFkb2MgVGFncy4KKwkgKiA8cD5TZXQgdGhlIG1pbmltdW0gdmlzaWJpbGl0eSBsZXZlbCBmb3IgSmF2YWRvYyB0YWcgcHJvYmxlbXMuIEJlbG93IHRoaXMgbGV2ZWwgcHJvYmxlbXMgd2lsbCBiZSBpZ25vcmVkLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHkiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgImRlZmF1bHQiLCAicHJpdmF0ZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJwdWJsaWMiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0NfVEFHU19WSVNJQklMSVRZID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHkiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIG1pc3NpbmcgdGFnIGRlc2NyaXB0aW9uLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgd2FybmluZyBvciBhbiBlcnJvciBmb3IgYW55IEphdmFkb2MgdGFnIG1pc3NpbmcgYSByZXF1aXJlZCBkZXNjcmlwdGlvbi4KKwkgKiA8cD5UaGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gaXMgY29udHJvbGxlZCB3aXRoIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ30uCisJICogPHA+SXQgZG9lcyBub3QgZGVwZW5kIG9uIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX1BCX0lOVkFMSURfSkFWQURPQ19UQUdTfS4KKwkgKiA8cD5XaGVuIHRoaXMgb3B0aW9uIGlzIHZhbHVlZCB0byB7QGxpbmsgI0NPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT05fQUxMX1NUQU5EQVJEX1RBR1N9LAorCSAqICAgICAgIGEgc3Vic2V0IG9mIHRoZSBzdGFuZGFyZCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL3Rvb2xzL3dpbmRvd3MvamF2YWRvYy5odG1sI2phdmFkb2N0YWdzIj5KYXZhZG9jIHRhZ3M8L2E+CisJICogICAgICAgdGhhdCBoYXZlIGEgZGVzY3JpcHRpb24sIHRleHQgb3IgbGFiZWwgYXJlIGNoZWNrZWQuIFdoaWxlIHRoaXMgc2V0IG1heSBncm93IGluIHRoZSBmdXR1cmUsIG5vdGUgdGhhdCB1c2VyLWRlZmluZWQgdGFncyBhcmUgbm90IGFuZCB3aWxsIG5vdCBiZSBjaGVja2VkLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJyZXR1cm5fdGFnIiwgImFsbF9zdGFuZGFyZF90YWdzIiwgIm5vX3RhZyIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJyZXR1cm5fdGFnIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR19ERVNDUklQVElPTiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBUYWdzLgorCSAqIDxwPlRoaXMgaXMgdGhlIGdlbmVyaWMgY29udHJvbCBmb3IgdGhlIHNldmVyaXR5IG9mIEphdmFkb2MgbWlzc2luZyB0YWcgcHJvYmxlbXMuCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiB0YWdzIGFyZSBtaXNzaW5nIGluIEphdmFkb2MgY29tbWVudHMuCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOworCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nIHtAbGluayAjQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR1NfVklTSUJJTElUWX0uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR1MgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFZpc2liaWxpdHkgTGV2ZWwgRm9yIE1pc3NpbmcgSmF2YWRvYyBUYWdzLgorCSAqIDxwPlNldCB0aGUgbWluaW11bSB2aXNpYmlsaXR5IGxldmVsIGZvciBKYXZhZG9jIG1pc3NpbmcgdGFnIHByb2JsZW1zLiBCZWxvdyB0aGlzIGxldmVsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZC4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5IjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAicHVibGljIiwgInByb3RlY3RlZCIsICJkZWZhdWx0IiwgInByaXZhdGUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4icHVibGljIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR1NfVklTSUJJTElUWSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBNaXNzaW5nIEphdmFkb2MgVGFncyBvbiBPdmVycmlkaW5nIE1ldGhvZHMuCisJICogPHA+U3BlY2lmeSB3aGV0aGVyIHRoZSBjb21waWxlciB3aWxsIHZlcmlmeSBvdmVycmlkaW5nIG1ldGhvZHMgaW4gb3JkZXIgdG8gcmVwb3J0IEphdmFkb2MgbWlzc2luZyB0YWcgcHJvYmxlbXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZGlzYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHU19PVkVSUklESU5HID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmciOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBUYWdzIGZvciBNZXRob2QgVHlwZSBQYXJhbWV0ZXJzLgorCSAqIDxwPlNwZWNpZnkgd2hldGhlciBhIG1pc3NpbmcgPGNvZGU+QHBhcmFtPC9jb2RlPiBmb3IgYSB0eXBlIHBhcmFtZXRlciBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQuCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhIG1pc3NpbmcgSmF2YWRvYyB0YWcgZXJyb3Igb3Igd2FybmluZyBmb3IgYSB0eXBlIHBhcmFtZXRlciB3aXRob3V0IGEgCisJICogICAgY29ycmVzcG9uZGluZyA8Y29kZT5AcGFyYW08L2NvZGU+IHRhZy48L3A+CisJICogPHA+VGhpcyBvcHRpb24gb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSBjb21waWxlciBjb21wbGlhbmNlIGlzIDEuNSBvciBncmVhdGVyLjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NNZXRob2RUeXBlUGFyYW1ldGVycyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZGlzYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy43CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHU19NRVRIT0RfVFlQRV9QQVJBTUVURVJTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc01ldGhvZFR5cGVQYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBDb21tZW50cy4KKwkgKiA8cD5UaGlzIGlzIHRoZSBnZW5lcmljIGNvbnRyb2wgZm9yIHRoZSBzZXZlcml0eSBvZiBtaXNzaW5nIEphdmFkb2MgY29tbWVudCBwcm9ibGVtcy4KKwkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIEphdmFkb2MgY29tbWVudHMgYXJlIG1pc3NpbmcuCisJICogPHA+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBlY3RlZCBKYXZhZG9jOworCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nIHtAbGluayAjQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX0NPTU1FTlRTX1ZJU0lCSUxJVFl9LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfQ09NTUVOVFMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBWaXNpYmlsaXR5IExldmVsIEZvciBNaXNzaW5nIEphdmFkb2MgQ29tbWVudHMuCisJICogPHA+U2V0IHRoZSBtaW5pbXVtIHZpc2liaWxpdHkgbGV2ZWwgZm9yIG1pc3NpbmcgSmF2YWRvYyBwcm9ibGVtcy4gQmVsb3cgdGhpcyBsZXZlbCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHkiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgImRlZmF1bHQiLCAicHJpdmF0ZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJwdWJsaWMiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfQ09NTUVOVFNfVklTSUJJTElUWSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgTWlzc2luZyBKYXZhZG9jIENvbW1lbnRzIG9uIE92ZXJyaWRpbmcgTWV0aG9kcy4KKwkgKiA8cD5TcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHdpbGwgdmVyaWZ5IG92ZXJyaWRpbmcgbWV0aG9kcyBpbiBvcmRlciB0byByZXBvcnQgbWlzc2luZyBKYXZhZG9jIGNvbW1lbnQgcHJvYmxlbXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmciPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX0NPTU1FTlRTX09WRVJSSURJTkcgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmciOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVzYWdlIG9mIDxjb2RlPmNoYXJbXTwvY29kZT4gRXhwcmVzc2lvbnMgaW4gU3RyaW5nIENvbmNhdGVuYXRpb25zLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgPGNvZGU+Y2hhcltdPC9jb2RlPiBleHByZXNzaW9uCisJICogICAgaXMgdXNlZCBpbiBTdHJpbmcgY29uY2F0ZW5hdGlvbnMgKGZvciBleGFtcGxlLCA8Y29kZT4iaGVsbG8iICsgbmV3IGNoYXJbXXsndycsJ28nLCdyJywnbCcsJ2QnfTwvY29kZT4pLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0NIQVJfQVJSQVlfSU5fU1RSSU5HX0NPTkNBVEVOQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24iOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogTWF4aW11bSBOdW1iZXIgb2YgUHJvYmxlbXMgUmVwb3J0ZWQgcGVyIENvbXBpbGF0aW9uIFVuaXQuCisJICogPHA+U3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgb24gZWFjaCBjb21waWxhdGlvbiB1bml0LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPiImbHQ7biZndDsiPC9jb2RlPiB3aGVyZSA8Y29kZT4mbHQ7biZndDs8L2NvZGU+IGlzIHplcm8gb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIChpZiB6ZXJvIHRoZW4gYWxsIHByb2JsZW1zIGFyZSByZXBvcnRlZCkuPC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iMTAwIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUFYX1BFUl9VTklUID0gUExVR0lOX0lEICsgIi5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBUcmVhdGluZyBPcHRpb25hbCBFcnJvciBhcyBGYXRhbC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIG9wdGlvbmFsIGVycm9ycyAoaS5lLiBvcHRpb25hbCBwcm9ibGVtcyB3aGljaCBzZXZlcml0eSBpcyBzZXQgdG8gPGNvZGU+ImVycm9yIjwvY29kZT4pIHdpbGwgYmUgdHJlYXRlZCBhcyBzdGFuZGFyZAorCSAqICAgIGNvbXBpbGVyIGVycm9ycywgeWllbGRpbmcgcHJvYmxlbSBtZXRob2RzL3R5cGVzIHByZXZlbnRpbmcgZnJvbSBydW5uaW5nIG9mZmVuZGluZyBjb2RlIHVudGlsIHRoZSBpc3N1ZSBnb3QgcmVzb2x2ZWQuPC9wPgorCSAqIDxwPldoZW4gZGlzYWJsZWQsIG9wdGlvbmFsIGVycm9ycyBhcmUgb25seSBjb25zaWRlcmVkIGFzIHdhcm5pbmdzLCBzdGlsbCBjYXJyeWluZyBhbiBlcnJvciBpbmRpY2F0aW9uIHRvIG1ha2UgdGhlbSBtb3JlCisJICogICAgc2V2ZXJlLiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgb3B0aW9uYWwgZXJyb3JzIGFyZSBub3QgZmF0YWwuIE5vbi1vcHRpb25hbCBlcnJvcnMgYXJlCisJICogICAgYWx3YXlzIGZhdGFsLjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3IiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMgorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfRkFUQUxfT1BUSU9OQUxfRVJST1IgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFBhcmFtZXRlciBBc3NpZ25tZW50LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgcGFyYW1ldGVyIGlzCisJICogICAgYXNzaWduZWQgdG8uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjIKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1BBUkFNRVRFUl9BU1NJR05NRU5UID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIGEgbWV0aG9kIHRoYXQgcXVhbGlmaWVzIGFzIHN0YXRpYywgYnV0IG5vdCBkZWNsYXJlZCBzdGF0aWMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYSBtZXRob2QgaGFzCisJICogICAgbm90IGJlZW4gZGVjbGFyZWQgYXMgPGNvZGU+c3RhdGljPC9jb2RlPiwgZXZlbiB0aG91Z2ggaXQgcXVhbGlmaWVzIGFzIG9uZS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjcKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX01JU1NJTkdfU1RBVElDX09OX01FVEhPRCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBhIG1ldGhvZCB0aGF0IG1heSBxdWFsaWZ5IGFzIHN0YXRpYywgYnV0IG5vdCBkZWNsYXJlZCBzdGF0aWMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYSBtZXRob2QgaGFzCisJICogICAgbm90IGJlZW4gZGVjbGFyZWQgYXMgPGNvZGU+c3RhdGljPC9jb2RlPiwgZXZlbiB0aG91Z2ggaXQgbWF5IHF1YWxpZnkgYXMgb25lLAorCSAqICAgIHdoZW4gYW5vdGhlciBtZXRob2QgZG9lc24ndCBvdmVycmlkZSBpdC4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZXBvcnRNZXRob2RDYW5CZVBvdGVudGlhbGx5U3RhdGljIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNworCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfUE9URU5USUFMTFlfTUlTU0lOR19TVEFUSUNfT05fTUVUSE9EID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnJlcG9ydE1ldGhvZENhbkJlUG90ZW50aWFsbHlTdGF0aWMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBTZXR0aW5nIFNvdXJjZSBDb21wYXRpYmlsaXR5IE1vZGUuCisJICogPHA+U3BlY2lmeSB3aGV0aGVyIHdoaWNoIHNvdXJjZSBsZXZlbCBjb21wYXRpYmlsaXR5IGlzIHVzZWQuIEZyb20gMS40IG9uLCA8Y29kZT4nYXNzZXJ0JzwvY29kZT4gaXMgYSBrZXl3b3JkCisJICogICAgcmVzZXJ2ZWQgZm9yIGFzc2VydGlvbiBzdXBwb3J0LiBBbHNvIG5vdGUsIHRoYW4gd2hlbiB0b2dnbGluZyB0byAxLjQgbW9kZSwgdGhlIHRhcmdldCBWTQorCSAqICAgIGxldmVsIHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+IjEuNCI8L2NvZGU+IGFuZCB0aGUgY29tcGxpYW5jZSBtb2RlIHNob3VsZCBiZSA8Y29kZT4iMS40IjwvY29kZT4uCisJICogPHA+U291cmNlIGxldmVsIDEuNSBpcyBuZWNlc3NhcnkgdG8gZW5hYmxlIGdlbmVyaWNzLCBhdXRvYm94aW5nLCBjb3ZhcmlhbmNlLCBhbm5vdGF0aW9ucywgZW51bWVyYXRpb25zCisJICogICAgZW5oYW5jZWQgZm9yIGxvb3AsIHN0YXRpYyBpbXBvcnRzIGFuZCB2YXJhcmdzLiBPbmNlIHRvZ2dsZWQsIHRoZSB0YXJnZXQgVk0gbGV2ZWwgc2hvdWxkIGJlIHNldCB0byA8Y29kZT4iMS41IjwvY29kZT4KKwkgKiAgICBhbmQgdGhlIGNvbXBsaWFuY2UgbW9kZSBzaG91bGQgYmUgPGNvZGU+IjEuNSI8L2NvZGU+LgorCSAqIDxwPlNvdXJjZSBsZXZlbCAxLjYgaXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSB0aGUgY29tcHV0YXRpb24gb2Ygc3RhY2sgbWFwIHRhYmxlcy4gT25jZSB0b2dnbGVkLCB0aGUgdGFyZ2V0CisJICogICAgVk0gbGV2ZWwgc2hvdWxkIGJlIHNldCB0byA8Y29kZT4iMS42IjwvY29kZT4gYW5kIHRoZSBjb21wbGlhbmNlIG1vZGUgc2hvdWxkIGJlIDxjb2RlPiIxLjYiPC9jb2RlPi4KKwkgKiA8cD5PbmNlIHRoZSBzb3VyY2UgbGV2ZWwgMS43IGlzIHRvZ2dsZWQsIHRoZSB0YXJnZXQgVk0gbGV2ZWwgc2hvdWxkIGJlIHNldCB0byA8Y29kZT4iMS43IjwvY29kZT4gYW5kIHRoZSBjb21wbGlhbmNlIG1vZGUKKwkgKiAgICBzaG91bGQgYmUgPGNvZGU+IjEuNyI8L2NvZGU+LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2UiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICIxLjMiLCAiMS40IiwgIjEuNSIsICIxLjYiLCAiMS43IiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IjEuMyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1NPVVJDRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFNldHRpbmcgQ29tcGxpYW5jZSBMZXZlbC4KKwkgKiA8cD5TZWxlY3QgdGhlIGNvbXBsaWFuY2UgbGV2ZWwgZm9yIHRoZSBjb21waWxlci4gSW4gPGNvZGU+IjEuMyI8L2NvZGU+IG1vZGUsIHNvdXJjZSBhbmQgdGFyZ2V0IHNldHRpbmdzCisJICogICAgc2hvdWxkIG5vdCBnbyBiZXlvbmQgPGNvZGU+IjEuMyI8L2NvZGU+IGxldmVsLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiMS4zIiwgIjEuNCIsICIxLjUiLCAiMS42IiwgIjEuNyIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiIxLjQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT01QTElBTkNFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5jb21wbGlhbmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IERlZmluaW5nIHRoZSBBdXRvbWF0aWMgVGFzayBQcmlvcml0aWVzLgorCSAqIDxwPkluIHBhcmFsbGVsIHdpdGggdGhlIEF1dG9tYXRpYyBUYXNrIFRhZ3MsIHRoaXMgbGlzdCBkZWZpbmVzIHRoZSBwcmlvcml0aWVzIChoaWdoLCBub3JtYWwgb3IgbG93KQorCSAqICAgIG9mIHRoZSB0YXNrIG1hcmtlcnMgaXNzdWVkIGJ5IHRoZSBjb21waWxlci4KKwkgKiAgICBJZiB0aGUgZGVmYXVsdCBpcyBzcGVjaWZpZWQsIHRoZSBwcmlvcml0eSBvZiBlYWNoIHRhc2sgbWFya2VyIGlzIDxjb2RlPiJOT1JNQUwiPC9jb2RlPi48L3A+CisJICogPHA+VGFzayBQcmlvcml0aWVzIGFuZCB0YXNrIHRhZ3MgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gSWYgdGFzayBwcmlvcml0aWVzIGFyZSBzZXQsIHRoZW4gdGFzayB0YWdzIHNob3VsZCBhbHNvCisJICogYmUgc2V0LjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1ByaW9yaXRpZXMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICImbHQ7cHJpb3JpdHkmZ3Q7WywmbHQ7cHJpb3JpdHkmZ3Q7XSoiIH08L2NvZGU+IHdoZXJlIDxjb2RlPiZsdDtwcmlvcml0eSZndDs8L2NvZGU+IGlzIG9uZSBvZiA8Y29kZT4iSElHSCI8L2NvZGU+LCA8Y29kZT4iTk9STUFMIjwvY29kZT4gb3IgPGNvZGU+IkxPVyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iTk9STUFMLEhJR0gsTk9STUFMIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisJICogQHNlZSAjQ09NUElMRVJfVEFTS19UQUdTCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19QUklPUklUSUVTID0gUExVR0lOX0lEICsgIi5jb21waWxlci50YXNrUHJpb3JpdGllcyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZSBmb3IgQ09NUElMRVJfVEFTS19QUklPUklUSUVTLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IERlZmluaW5nIHRoZSBBdXRvbWF0aWMgVGFzayBUYWdzLgorCSAqIDxwPldoZW4gdGhlIHRhZyBsaXN0IGlzIG5vdCBlbXB0eSwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB0YXNrIG1hcmtlciB3aGVuZXZlciBpdCBlbmNvdW50ZXJzCisJICogICAgb25lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRhZ3MgaW5zaWRlIGFueSBjb21tZW50IGluIEphdmEgc291cmNlIGNvZGUuCisJICogPHA+R2VuZXJhdGVkIHRhc2sgbWVzc2FnZXMgd2lsbCBzdGFydCB3aXRoIHRoZSB0YWcsIGFuZCByYW5nZSB1bnRpbCB0aGUgbmV4dCBsaW5lIHNlcGFyYXRvciwKKwkgKiAgICBjb21tZW50IGVuZGluZywgb3IgdGFnLjwvcD4KKwkgKiA8cD5XaGVuIGEgZ2l2ZW4gbGluZSBvZiBjb2RlIGJlYXJzIG11bHRpcGxlIHRhZ3MsIGVhY2ggdGFnIHdpbGwgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseS4KKwkgKiAgICBNb3Jlb3ZlciwgYSB0YWcgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciB0YWcgd2lsbCBiZSByZXBvcnRlZCB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlCisJICogICAgbmV4dCBub24tZW1wdHkgdGFnIG9mIHRoZSBsaW5lLCBpZiBhbnkuPC9wPgorCSAqIDxwPk5vdGUgdGhhdCB0YXNrcyBtZXNzYWdlcyBhcmUgdHJpbW1lZC4gSWYgYSB0YWcgaXMgc3RhcnRpbmcgd2l0aCBhIGxldHRlciBvciBkaWdpdCwgdGhlbiBpdCBjYW5ub3QgYmUgbGVhZGVkIGJ5CisJICogICAgYW5vdGhlciBsZXR0ZXIgb3IgZGlnaXQgdG8gYmUgcmVjb2duaXplZCAoPGNvZGU+ImZvb1RvRG8iPC9jb2RlPiB3aWxsIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgdGFzayBmb3IgdGFnIDxjb2RlPiJUb0RvIjwvY29kZT4sIGJ1dCA8Y29kZT4iZm9vI1RvRG8iPC9jb2RlPgorCSAqICAgIHdpbGwgYmUgZGV0ZWN0ZWQgZm9yIGVpdGhlciB0YWcgPGNvZGU+IlRvRG8iPC9jb2RlPiBvciA8Y29kZT4iI1RvRG8iPC9jb2RlPikuIFJlc3BlY3RpdmVseSwgYSB0YWcgZW5kaW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgY2Fubm90IGJlIGZvbGxvd2VkCisJICogICAgYnkgYSBsZXR0ZXIgb3IgZGlnaXQgdG8gYmUgcmVjb2duaXplZCAoPGNvZGU+IlRvRG9mb28iPC9jb2RlPiB3aWxsIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgdGFzayBmb3IgdGFnIDxjb2RlPiJUb0RvIjwvY29kZT4sIGJ1dCA8Y29kZT4iVG9Ebzpmb28iPC9jb2RlPiB3aWxsCisJICogICAgYmUgZGV0ZWN0ZWQgZWl0aGVyIGZvciB0YWcgPGNvZGU+IlRvRG8iPC9jb2RlPiBvciA8Y29kZT4iVG9EbzoiPC9jb2RlPikuPC9wPgorCSAqIDxwPlRhc2sgUHJpb3JpdGllcyBhbmQgdGFzayB0YWdzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIElmIHRhc2sgdGFncyBhcmUgc2V0LCB0aGVuIHRhc2sgcHJpb3JpdGllcyBzaG91bGQgYWxzbworCSAqIGJlIHNldC48L3A+CisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnRhc2tUYWdzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O3RhZyZndDtbLCZsdDt0YWcmZ3Q7XSoiIH08L2NvZGU+IHdoZXJlIDxjb2RlPiZsdDt0YWcmZ3Q7PC9jb2RlPiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQgb3IgbGVhZGluZy90cmFpbGluZyBzcGFjZXM8L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJUT0RPLEZJWE1FLFhYWCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9UQVNLX1BSSU9SSVRZX0hJR0ggPSAiSElHSCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZSBmb3IgQ09NUElMRVJfVEFTS19QUklPUklUSUVTLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19QUklPUklUWV9MT1cgPSAiTE9XIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlIGZvciBDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVMuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9UQVNLX1BSSU9SSVRZX05PUk1BTCA9ICJOT1JNQUwiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqIEBzZWUgI0NPTVBJTEVSX1RBU0tfUFJJT1JJVElFUwogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1RBU0tfVEFHUyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIudGFza1RhZ3MiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogRGV0ZXJtaW5pbmcgd2hldGhlciB0YXNrIHRhZ3MgYXJlIGNhc2Utc2Vuc2l0aXZlLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGFzayB0YWdzIGFyZSBjb25zaWRlcmVkIGluIGEgY2FzZS1zZW5zaXRpdmUgd2F5LgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrQ2FzZVNlbnNpdGl2ZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1RBU0tfQ0FTRV9TRU5TSVRJVkUgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnRhc2tDYXNlU2Vuc2l0aXZlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBGb3JiaWRkZW4gUmVmZXJlbmNlIHRvIFR5cGUgd2l0aCBSZXN0cmljdGVkIEFjY2Vzcy4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIHJlZmVycmluZyB0byBhIHR5cGUgdGhhdCBpcyBub24gYWNjZXNzaWJsZSwgYXMgZGVmaW5lZCBhY2NvcmRpbmcKKwkgKiAgICB0byB0aGUgYWNjZXNzIHJ1bGUgc3BlY2lmaWNhdGlvbnMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZXJyb3IiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9GT1JCSURERU5fUkVGRVJFTkNFID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgRGlzY291cmFnZWQgUmVmZXJlbmNlIHRvIFR5cGUgd2l0aCBSZXN0cmljdGVkIEFjY2Vzcy4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIHJlZmVycmluZyB0byBhIHR5cGUgd2l0aCBkaXNjb3VyYWdlZCBhY2Nlc3MsIGFzIGRlZmluZWQgYWNjb3JkaW5nCisJICogICAgdG8gdGhlIGFjY2VzcyBydWxlIHNwZWNpZmljYXRpb25zLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RJU0NPVVJBR0VEX1JFRkVSRU5DRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBEZXRlcm1pbmluZyBFZmZlY3Qgb2YgPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MuCisJICogPHA+V2hlbiBkaXNhYmxlZCwgYWxsIDxjb2RlPkBTdXByZXNzV2FybmluZ3M8L2NvZGU+IGFubm90YXRpb25zIGFyZSBpZ25vcmVkOyBpLmUuLCB3YXJuaW5ncyBhcmUgcmVwb3J0ZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1NVUFBSRVNTX1dBUk5JTkdTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3MiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmFpc2UgbnVsbCByZWxhdGVkIGVycm9ycyBvciB3YXJuaW5ncyBhcmlzaW5nIGJlY2F1c2Ugb2YgYXNzZXJ0IHN0YXRlbWVudHMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBmbGFnIGFsbCBudWxsIHJlbGF0ZWQgZXJyb3JzIG9yIHdhcm5pbmdzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgdGhlIHVzZXIsCisJICogICAgaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgYSB2YXJpYWJsZSBvY2N1cnJlZCBpbiBhbiBhc3NlcnQgc3RhdGVtZW50LjwvcD4KKwkgKiA8cD5XaGVuIGRpc2FibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBub3QgZmxhZyBudWxsIHJlbGF0ZWQgZXJyb3JzIG9yIHdhcm5pbmdzIG9uIHZhcmlhYmxlcyB0aGF0IGdvdCBtYXJrZWQgYXMgbWF5YmUgb3IgZGVmaW5pdGVseQorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGFuIGFzc2VydCBzdGF0ZW1lbnQgdXBzdHJlYW0uPC9wPgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjcKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0lOQ0xVREVfQVNTRVJUU19JTl9OVUxMX0FOQUxZU0lTID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmluY2x1ZGVOdWxsSW5mb0Zyb21Bc3NlcnRzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogRnVydGhlciBEZXRlcm1pbmluZyB0aGUgRWZmZWN0IG9mIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBpZiBhbHNvCisJICoge0BsaW5rICNDT01QSUxFUl9QQl9TVVBQUkVTU19XQVJOSU5HU30gaXMgZW5hYmxlZC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gYW5ub3RhdGlvbiBjYW4gYWRkaXRpb25hbGx5IGJlIHVzZWQgdG8gc3VwcHJlc3MgCisJICogb3B0aW9uYWwgY29tcGlsZXIgZGlhZ25vc3RpY3MgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCBhcyB7QGxpbmsgI0VSUk9SfS4KKwkgKiA8cD5XaGVuIGRpc2FibGVkLCBhbGwgPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGFubm90YXRpb25zIG9ubHkgYWZmZWN0cyB3YXJuaW5ncy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc09wdGlvbmFsRXJyb3JzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjYKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1NVUFBSRVNTX09QVElPTkFMX0VSUk9SUyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc09wdGlvbmFsRXJyb3JzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIFVuaGFuZGxlZCBXYXJuaW5nIFRva2VuIGZvciA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4uCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBlbmNvdW50ZXJpbmcgYSB0b2tlbgorCSAqICAgIGl0IGNhbm5vdCBoYW5kbGUgaW5zaWRlIGEgPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+IGFubm90YXRpb24uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOSEFORExFRF9XQVJOSU5HX1RPS0VOID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW5uZWNlc3NhcnkgPGNvZGU+QFN1cHByZXNzV2FybmluZ3M8L2NvZGU+LgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gZW5jb3VudGVyaW5nIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiBhbm5vdGF0aW9uCisJICogICAgZm9yIHdoaWNoIG5vIGNvcnJlc3BvbmRpbmcgd2FybmluZyBnb3QgZGV0ZWN0ZWQgaW4gdGhlIGNvZGUuIFRoaXMgZGlhZ25vc3RpYyBpcyBwcm92aWRlZCB0byBoZWxwIGRldmVsb3BlcnMgdG8gZ2V0CisJICogICAgcmlkIG9mIHRyYW5zaWVudCA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gbm8gbG9uZ2VyIG5lZWRlZC4gTm90ZSB0aGF0IDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKTwvY29kZT4gaXMgc3RpbGwKKwkgKiAgICBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgZm9yIHVubmVjZXNzYXJ5IDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiwgYXMgaXQgaXMgdGhlIG1hc3RlciBzd2l0Y2ggdG8gc2lsZW5jZSBBTEwgd2FybmluZ3MuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9XQVJOSU5HX1RPS0VOID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBOdWxsIERlcmVmZXJlbmNlLgorCSAqIDxwPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEKKwkgKiAgICB2YXJpYWJsZSB0aGF0IGlzIHN0YXRpY2FsbHkga25vd24gdG8gaG9sZCBhIG51bGwgdmFsdWUgaXMgdXNlZCB0bworCSAqICAgIGFjY2VzcyBhIGZpZWxkIG9yIG1ldGhvZC48L3A+CisJICogPHA+QXNzZXJ0IHN0YXRlbWVudHMgYXJlIGlnbm9yZWQgdW5sZXNzIHtAbGluayAjQ09NUElMRVJfUEJfSU5DTFVERV9BU1NFUlRTX0lOX05VTExfQU5BTFlTSVN9CisJICogICAgaXMgZW5hYmxlZC48L3A+CisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4yCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9OVUxMX1JFRkVSRU5DRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBQb3RlbnRpYWwgTnVsbCBEZXJlZmVyZW5jZS4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhCisJICogICAgdmFyaWFibGUgdGhhdCBoYXMgZm9ybWVybHkgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBudWxsIGJ1dCBpcyBub3QgKG5vIG1vcmUpCisJICogICAgc3RhdGljYWxseSBrbm93biB0byBob2xkIGEgbm9uLW51bGwgdmFsdWUgaXMgdXNlZCB0byBhY2Nlc3MgYSBmaWVsZCBvcgorCSAqICAgIG1ldGhvZC48L3A+CisJICogPHA+QXNzZXJ0IHN0YXRlbWVudHMgYXJlIGlnbm9yZWQgdW5sZXNzIHtAbGluayAjQ09NUElMRVJfUEJfSU5DTFVERV9BU1NFUlRTX0lOX05VTExfQU5BTFlTSVN9CisJICogICAgaXMgZW5hYmxlZC48L3A+CisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjMKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1BPVEVOVElBTF9OVUxMX1JFRkVSRU5DRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBSZWR1bmRhbnQgTnVsbCBDaGVjay4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhCisJICogICAgdmFyaWFibGUgdGhhdCBpcyBzdGF0aWNhbGx5IGtub3duIHRvIGhvbGQgYSBudWxsIG9yIGEgbm9uLW51bGwgdmFsdWUKKwkgKiAgICBpcyB0ZXN0ZWQgYWdhaW5zdCBudWxsLjwvcD4KKwkgKiA8cD5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgaWdub3JlZCB1bmxlc3Mge0BsaW5rICNDT01QSUxFUl9QQl9JTkNMVURFX0FTU0VSVFNfSU5fTlVMTF9BTkFMWVNJU30KKwkgKiAgICBpcyBlbmFibGVkLjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2siPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMy4zCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9SRURVTkRBTlRfTlVMTF9DSEVDSyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2siOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE92ZXJyaWRpbmcgbWV0aG9kIHRoYXQgZG9lc24ndCBjYWxsIHRoZSBzdXBlciBtZXRob2QgaW52b2NhdGlvbi4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIG1ldGhvZCBpcyBvdmVycmlkaW5nIGEgbWV0aG9kIHdpdGhvdXQgY2FsbGluZworCSAqICAgIHRoZSBzdXBlciBpbnZvY2F0aW9uLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMworCSAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfT1ZFUlJJRElOR19NRVRIT0RfV0lUSE9VVF9TVVBFUl9JTlZPQ0FUSU9OID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBSZWR1bmRhbnQgU3VwZXJpbnRlcmZhY2UuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYSB0eXBlCisJICogICAgZXhwbGljaXRseSBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0aGF0IGlzIGFscmVhZHkgaW1wbGVtZW50ZWQgYnkgYW55CisJICogICAgb2YgaXRzIHN1cGVydHlwZXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2UiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9SRURVTkRBTlRfU1VQRVJJTlRFUkZBQ0UgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgQ29tcGFyaXNvbiBvZiBJZGVudGljYWwgRXhwcmVzc2lvbnMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYSBjb21wYXJpc29uCisJICogaXMgaW52b2x2aW5nIGlkZW50aWNhbCBvcGVyYW5kcyAoZS5nIDxjb2RlPid4ID09IHgnPC9jb2RlPikuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjUKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0NPTVBBUklOR19JREVOVElDQUwgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgU3luY2hyb25pemVkIE1vZGlmaWVyIE9uIEluaGVyaXRlZCBNZXRob2QuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgYSBtZXRob2QKKwkgKiBvdmVycmlkZXMgYSBzeW5jaHJvbml6ZWQgbWV0aG9kIHdpdGhvdXQgaGF2aW5nIGEgc3luY2hyb25pemVkIG1vZGlmaWVyLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjUKKwkgKiBAY2F0ZWdvcnkgQ29tcGlsZXJPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX01JU1NJTkdfU1lOQ0hST05JWkVEX09OX0lOSEVSSVRFRF9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEFsbG9jYXRpb24gb2YgYW4gVW51c2VkIE9iamVjdC4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhbiBvYmplY3QgaXMgYWxsb2NhdGVkIGJ1dCBuZXZlciB1c2VkLAorCSAqIG5laXRoZXIgYnkgaG9sZGluZyBhIHJlZmVyZW5jZSBub3IgYnkgaW52b2tpbmcgb25lIG9mIHRoZSBvYmplY3QncyBtZXRob2RzLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZE9iamVjdEFsbG9jYXRpb24iPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy42CisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfT0JKRUNUX0FMTE9DQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkT2JqZWN0QWxsb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgcmVkdW5kYW50IHNwZWNpZmljYXRpb24gb2YgdHlwZSBhcmd1bWVudHMgaW4gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbnMuCisJICogPHA+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaWYgdHlwZSBhcmd1bWVudHMgYXJlIHVzZWQgaW4gYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiwKKwkgKiB3aGVuIHRoZSAnPD4nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGluc3RlYWQuCisJICogPHA+VGhpcyBvcHRpb24gb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSBjb21waWxlciBjb21wbGlhbmNlIGlzIDEuNyBvciBncmVhdGVyLjwvcD4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTcGVjaWZpY2F0aW9uT2ZUeXBlQXJndW1lbnRzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CisJICogQHNpbmNlIDMuNy4xCisJICogQGNhdGVnb3J5IENvbXBpbGVyT3B0aW9uSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9SRURVTkRBTlRfVFlQRV9BUkdVTUVOVFMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3BlY2lmaWNhdGlvbk9mVHlwZUFyZ3VtZW50cyI7ICAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29yZSBvcHRpb24gSUQ6IENvbXB1dGluZyBQcm9qZWN0IEJ1aWxkIE9yZGVyLgorCSAqIDxwPkluZGljYXRlIHdoZXRoZXIgSmF2YUNvcmUgc2hvdWxkIGVuZm9yY2UgdGhlIHByb2plY3QgYnVpbGQgb3JkZXIgdG8gYmUgYmFzZWQgb24KKwkgKiAgICB0aGUgY2xhc3NwYXRoIHByZXJlcXVpc2l0ZSBjaGFpbi4gV2hlbiByZXF1ZXN0aW5nIHRvIGNvbXB1dGUsIHRoaXMgdGFrZXMgb3ZlcgorCSAqICAgIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IG9yZGVyIChiYXNlZCBvbiBwcm9qZWN0IHJlZmVyZW5jZXMpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21wdXRlSmF2YUJ1aWxkT3JkZXIiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJjb21wdXRlIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJpZ25vcmUiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9KQVZBX0JVSUxEX09SREVSID0gUExVR0lOX0lEICsgIi5jb21wdXRlSmF2YUJ1aWxkT3JkZXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBTcGVjaWZ5aW5nIEZpbHRlcnMgZm9yIFJlc291cmNlIENvcHlpbmcgQ29udHJvbC4KKwkgKiA8cD5BbGxvdyB0byBzcGVjaWZ5IHNvbWUgZmlsdGVycyB0byBjb250cm9sIHRoZSByZXNvdXJjZSBjb3B5IHByb2Nlc3MuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O25hbWUmZ3Q7WywmbHQ7bmFtZSZndDtdKiB9PC9jb2RlPiB3aGVyZSA8Y29kZT4mbHQ7bmFtZSZndDs8L2NvZGU+IGlzIGEgZmlsZSBuYW1lIHBhdHRlcm4gKCogYW5kID8gd2lsZC1jYXJkcyBhbGxvd2VkKQorCSAqCSAgIG9yIHRoZSBuYW1lIG9mIGEgZm9sZGVyIHdoaWNoIGVuZHMgd2l0aCA8Y29kZT4nLyc8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBDb3JlT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0pBVkFfQlVJTERfUkVTT1VSQ0VfQ09QWV9GSUxURVIgPSBQTFVHSU5fSUQgKyAiLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb3JlIG9wdGlvbiBJRDogUmVwb3J0aW5nIER1cGxpY2F0ZSBSZXNvdXJjZXMuCisJICogPHA+SW5kaWNhdGUgdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIHJlcG9ydGVkIHdoZW4gbW9yZSB0aGFuIG9uZSBvY2N1cnJlbmNlCisJICogICAgb2YgYSByZXNvdXJjZSBpcyB0byBiZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGxvY2F0aW9uLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzayI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4id2FybmluZyI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9KQVZBX0JVSUxEX0RVUExJQ0FURV9SRVNPVVJDRSA9IFBMVUdJTl9JRCArICIuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2siOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBDbGVhbmluZyBPdXRwdXQgRm9sZGVyKHMpLgorCSAqIDxwPkluZGljYXRlIHdoZXRoZXIgdGhlIEphdmFCdWlsZGVyIGlzIGFsbG93ZWQgdG8gY2xlYW4gdGhlIG91dHB1dCBmb2xkZXJzCisJICogICAgd2hlbiBwZXJmb3JtaW5nIGZ1bGwgYnVpbGQgb3BlcmF0aW9ucy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlciI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImNsZWFuIiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJjbGVhbiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9KQVZBX0JVSUxEX0NMRUFOX09VVFBVVF9GT0xERVIgPSBQTFVHSU5fSUQgKyAiLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBSZWNyZWF0ZSBNb2RpZmllZCBjbGFzcyBmaWxlcyBpbiBPdXRwdXQgRm9sZGVyLgorCSAqIDxwPkluZGljYXRlIHdoZXRoZXIgdGhlIEphdmFCdWlsZGVyIHNob3VsZCBjaGVjayBmb3IgYW55IGNoYW5nZXMgdG8gLmNsYXNzIGZpbGVzCisJICogICAgaW4gdGhlIG91dHB1dCBmb2xkZXJzIHdoaWxlIHBlcmZvcm1pbmcgaW5jcmVtZW50YWwgYnVpbGQgb3BlcmF0aW9ucy4gSWYgY2hhbmdlcworCSAqICAgIGFyZSBkZXRlY3RlZCB0byBtYW5hZ2VkIC5jbGFzcyBmaWxlcywgdGhlbiBhIGZ1bGwgYnVpbGQgaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UKKwkgKiAgICB0aGUgY2hhbmdlcyBhcmUgbGVmdCBhcyBpcy4gVG9vbHMgZnVydGhlciBhbHRlcmluZyBnZW5lcmF0ZWQgLmNsYXNzIGZpbGVzLCBsaWtlIG9wdGltaXplcnMsCisJICogICAgc2hvdWxkIGVuc3VyZSB0aGlzIG9wdGlvbiByZW1haW5zIHNldCBpbiBpdHMgZGVmYXVsdCBzdGF0ZSBvZiBpZ25vcmUuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJpZ25vcmUiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iaWdub3JlIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMgorCSAqIEBjYXRlZ29yeSBDb3JlT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0pBVkFfQlVJTERfUkVDUkVBVEVfTU9ESUZJRURfQ0xBU1NfRklMRVNfSU5fT1VUUFVUX0ZPTERFUiA9IFBMVUdJTl9JRCArICIuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBSZXBvcnRpbmcgSW5jb21wbGV0ZSBDbGFzc3BhdGguCisJICogPHA+SW5kaWNhdGUgdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIHJlcG9ydGVkIHdoZW4gYW4gZW50cnkgb24gdGhlIGNsYXNzcGF0aCBkb2VzIG5vdCBleGlzdCwKKwkgKiAgICBpcyBub3QgbGVnaXRlIG9yIGlzIG5vdCB2aXNpYmxlIChmb3IgZXhhbXBsZSwgYSByZWZlcmVuY2VkIHByb2plY3QgaXMgY2xvc2VkKS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmcifTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlcnJvciI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9JTkNPTVBMRVRFX0NMQVNTUEFUSCA9IFBMVUdJTl9JRCArICIuaW5jb21wbGV0ZUNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29yZSBvcHRpb24gSUQ6IFJlcG9ydGluZyBDbGFzc3BhdGggQ3ljbGUuCisJICogPHA+SW5kaWNhdGUgdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIHJlcG9ydGVkIHdoZW4gYSBwcm9qZWN0IGlzIGludm9sdmVkIGluIGEgY3ljbGUuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlcnJvciI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEggPSBQTFVHSU5fSUQgKyAiLmNpcmN1bGFyQ2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb3JlIG9wdGlvbiBJRDogUmVwb3J0aW5nIEluY29tcGF0aWJsZSBKREsgTGV2ZWwgZm9yIFJlcXVpcmVkIEJpbmFyaWVzLgorCSAqIDxwPkluZGljYXRlIHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSByZXBvcnRlZCB3aGVuIGEgcHJvamVjdCBwcmVyZXF1aXNpdGVzIGFub3RoZXIgcHJvamVjdAorCSAqICAgIG9yIGxpYnJhcnkgd2l0aCBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IEpESyBsZXZlbCAoZS5nLiBwcm9qZWN0IHRhcmdldGluZyAxLjEgdm0sIGJ1dCBjb21waWxlZCBhZ2FpbnN0IDEuNCBsaWJyYXJpZXMpLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Imlnbm9yZSI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMID0gUExVR0lOX0lEICsgIi5pbmNvbXBhdGlibGVKREtMZXZlbCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29yZSBvcHRpb24gSUQ6IEFib3J0IGlmIEludmFsaWQgQ2xhc3NwYXRoLgorCSAqIDxwPkFsbG93IHRvIHRvZ2dsZSB0aGUgYnVpbGRlciB0byBhYm9ydCBpZiB0aGUgY2xhc3NwYXRoIGlzIGludmFsaWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImFib3J0IiwgImlnbm9yZSIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJhYm9ydCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRIID0gUExVR0lOX0lEICsgIi5idWlsZGVyLmludmFsaWRDbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBEZWZhdWx0IFNvdXJjZSBFbmNvZGluZyBGb3JtYXQuCisJICogPHA+R2V0IHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBvZiBzb3VyY2UgZmlsZXMuIFRoaXMgdmFsdWUgaXMKKwkgKiAgICBpbW11dGFibGUgYW5kIHByZXNldCB0byB0aGUgcmVzdWx0IG9mIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpPC9jb2RlPi4KKwkgKiA8cD5JdCBpcyBvZmZlcmVkIGFzIGEgY29udmVuaWVuY2Ugc2hvcnRjdXQgb25seS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuZW5jb2RpbmciPC9jb2RlPjwvZGQ+CisJICogPGR0PnZhbHVlOjwvZHQ+PGRkPjxjb2RlPiZsdDtpbW11dGFibGUsIHBsYXRmb3JtIGRlZmF1bHQgdmFsdWUmZ3Q7PC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IENvcmVPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfRU5DT0RJTkcgPSBQTFVHSU5fSUQgKyAiLmVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb3JlIG9wdGlvbiBJRDogRW5hYmxpbmcgVXNhZ2Ugb2YgQ2xhc3NwYXRoIEV4Y2x1c2lvbiBQYXR0ZXJucy4KKwkgKiA8cD5XaGVuIGRpc2FibGVkLCBubyBlbnRyeSBvbiBhIHByb2plY3QgY2xhc3NwYXRoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICBhbiBleGNsdXNpb24gcGF0dGVybi4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlbmFibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb3JlT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TID0gUExVR0lOX0lEICsgIi5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvcmUgb3B0aW9uIElEOiBFbmFibGluZyBVc2FnZSBvZiBDbGFzc3BhdGggTXVsdGlwbGUgT3V0cHV0IExvY2F0aW9ucy4KKwkgKiA8cD5XaGVuIGRpc2FibGVkLCBubyBlbnRyeSBvbiBhIHByb2plY3QgY2xhc3NwYXRoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICBhIHNwZWNpZmljIG91dHB1dCBsb2NhdGlvbiwgcHJldmVudGluZyB0aHVzIHVzYWdlIG9mIG11bHRpcGxlIG91dHB1dCBsb2NhdGlvbnMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMgPSBQTFVHSU5fSUQgKyAiLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBEZWZhdWx0IHRhc2sgdGFnCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjREVGQVVMVF9UQVNLX1RBR1N9IGluc3RlYWQKLQkgKiBAc2luY2UgMi4xCisJICogQ29yZSBvcHRpb24gSUQ6IFJlcG9ydGluZyBhbiBvdXRwdXQgbG9jYXRpb24gb3ZlcmxhcHBpbmcgYW5vdGhlciBzb3VyY2UgbG9jYXRpb24uCisJICogPHA+IEluZGljYXRlIHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSByZXBvcnRlZCB3aGVuIGEgc291cmNlIGVudHJ5J3Mgb3V0cHV0IGxvY2F0aW9uIG92ZXJsYXBzIGFub3RoZXIKKwkgKiBzb3VyY2UgZW50cnkuIDwvcD4KKwkgKiAKKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm91dHB1dE92ZXJsYXBwaW5nQW5vdGhlclNvdXJjZSI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+Indhcm5pbmciPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy42LjQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBU0tfVEFHID0gIlRPRE8iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9PVVRQVVRfTE9DQVRJT05fT1ZFUkxBUFBJTkdfQU5PVEhFUl9TT1VSQ0UgPSBQTFVHSU5fSUQgKyAiLmNsYXNzcGF0aC5vdXRwdXRPdmVybGFwcGluZ0Fub3RoZXJTb3VyY2UiOyAgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIERlZmF1bHQgdGFzayBwcmlvcml0eQotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI0RFRkFVTFRfVEFTS19QUklPUklUSUVTfSBpbnN0ZWFkCi0JICogQHNpbmNlIDIuMQorCSAqIENvcmUgb3B0aW9uIElEOiBTZXQgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBuYW1lcyBmcm9tIGphdmFkb2MuCisJICogPHA+VGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gcmV0cmlldmUgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBuYW1lcyBmcm9tIGphdmFkb2MuCisJICogPHA+SWYgdGhlIHZhbHVlIGlzIDxjb2RlPjA8L2NvZGU+LCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBub3QgZmV0Y2hlZCBhbmQgdGhlIHJhdyBuYW1lcyBhcmUgcmV0dXJuZWQuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRpbWVvdXRGb3JQYXJhbWV0ZXJOYW1lRnJvbUF0dGFjaGVkSmF2YWRvYyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPiImbHQ7biZndDsiPC9jb2RlPiwgd2hlcmUgPGNvZGU+bjwvY29kZT4gaXMgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+MDwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiI1MCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjIKKwkgKiBAY2F0ZWdvcnkgQ29yZU9wdGlvbklECiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVNLX1BSSU9SSVRZID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX0ZPUl9QQVJBTUVURVJfTkFNRV9GUk9NX0FUVEFDSEVEX0pBVkFET0MgPSBQTFVHSU5fSUQgKyAiLnRpbWVvdXRGb3JQYXJhbWV0ZXJOYW1lRnJvbUF0dGFjaGVkSmF2YWRvYyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIERlZmF1bHQgdGFzayB0YWcKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVNLX1RBR1MgPSAiVE9ETyxGSVhNRSxYWFgiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRGVmYXVsdCB0YXNrIHByaW9yaXR5Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFTS19QUklPUklUSUVTID0gIk5PUk1BTCxISUdILE5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCiAJICogQHNpbmNlIDIuMAogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9CUkFDRV9QT1NJVElPTl9GT1JfQU5PTllNT1VTX1RZUEVfREVDTEFSQVRJT059LAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0JSQUNFX1BPU0lUSU9OX0ZPUl9CTE9DS30gLAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0JSQUNFX1BPU0lUSU9OX0ZPUl9DT05TVFJVQ1RPUl9ERUNMQVJBVElPTn0sCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQlJBQ0VfUE9TSVRJT05fRk9SX01FVEhPRF9ERUNMQVJBVElPTn0sCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQlJBQ0VfUE9TSVRJT05fRk9SX1NXSVRDSH0sCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQlJBQ0VfUE9TSVRJT05fRk9SX1RZUEVfREVDTEFSQVRJT059IGluc3RlYWQKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9CUkFDRV9QT1NJVElPTl9GT1JfVFlQRV9ERUNMQVJBVElPTn0gaW5zdGVhZC4KKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX05FV0xJTkVfT1BFTklOR19CUkFDRSA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLm5ld2xpbmUub3BlbmluZ0JyYWNlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKIAkgKiBAc2luY2UgMi4wCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9CRUZPUkVfQ0FUQ0hfSU5fVFJZX1NUQVRFTUVOVH0sCiAJICogIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9CRUZPUkVfRUxTRV9JTl9JRl9TVEFURU1FTlR9LAogCSAqICB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQkVGT1JFX0ZJTkFMTFlfSU5fVFJZX1NUQVRFTUVOVH0sCiAJICogIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9CRUZPUkVfV0hJTEVfSU5fRE9fU1RBVEVNRU5UfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVXTElORV9DT05UUk9MID0gUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubmV3bGluZS5jb250cm9sU3RhdGVtZW50IjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKIAkgKiBAc2luY2UgMi4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0NPTVBBQ1RfRUxTRV9JRn0gaW5zdGVhZAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9DT01QQUNUX0VMU0VfSUZ9IGluc3RlYWQuCisJICogQGNhdGVnb3J5IERlcHJlY2F0ZWRPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVdMSU5FX0VMU0VfSUYgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXdsaW5lLmVsc2VJZiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCiAJICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfSU5fRU1QVFlfQkxPQ0t9IGluc3RlYWQKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0lOX0VNUFRZX0JMT0NLfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVXTElORV9FTVBUWV9CTE9DSyA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLm5ld2xpbmUuZW1wdHlCbG9jayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCiAJICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9OVU1CRVJfT0ZfRU1QVFlfTElORVNfVE9fUFJFU0VSVkV9IGluc3RlYWQKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfTlVNQkVSX09GX0VNUFRZX0xJTkVTX1RPX1BSRVNFUlZFfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQ0xFQVJfQkxBTktfTElORVMgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXdsaW5lLmNsZWFyQWxsIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKIAkgKiBAc2luY2UgMi4wCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0xJTkVfU1BMSVR9IGluc3RlYWQKKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0xJTkVfU1BMSVQgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5saW5lU3BsaXQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQogCSAqIEBzaW5jZSAyLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9BU1NJR05NRU5UX09QRVJBVE9SfSBpbnN0ZWFkCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQVNTSUdOTUVOVF9PUEVSQVRPUn0gaW5zdGVhZC4KKwkgKiBAY2F0ZWdvcnkgRGVwcmVjYXRlZE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0NPTVBBQ1RfQVNTSUdOTUVOVCA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLnN0eWxlLmFzc2lnbm1lbnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQogCSAqIEBzaW5jZSAyLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfVEFCX0NIQVJ9fSBpbnN0ZWFkCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMjRk9STUFUVEVSX1RBQl9DSEFSfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfVEFCX0NIQVIgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQogCSAqIEBzaW5jZSAyLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfVEFCX1NJWkV9IGluc3RlYWQKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfVEFCX1NJWkV9IGluc3RlYWQuCisJICogQGNhdGVnb3J5IERlcHJlY2F0ZWRPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9UQUJfU0laRSA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSBjb25maWd1cmFibGUgb3B0aW9uIElECi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQogCSAqIEBzaW5jZSAyLjEKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX0NMT1NJTkdfUEFSRU5fSU5fQ0FTVH0gaW5zdGVhZAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfQ0xPU0lOR19QQVJFTl9JTl9DQVNUfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfU1BBQ0VfQ0FTVEVYUFJFU1NJT04gPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5zcGFjZS5jYXN0ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29kZSBhc3Npc3Qgb3B0aW9uIElEOiBBY3RpdmF0ZSBWaXNpYmlsaXR5IFNlbnNpdGl2ZSBDb21wbGV0aW9uLgorCSAqIDxwPldoZW4gYWN0aXZlLCBjb21wbGV0aW9uIGRvZXNuJ3Qgc2hvdyB0aGF0IHlvdSBjYW4gbm90IHNlZQorCSAqICAgIChmb3IgZXhhbXBsZSwgeW91IGNhbiBub3Qgc2VlIHByaXZhdGUgbWV0aG9kcyBvZiBhIHN1cGVyIGNsYXNzKS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZGlzYWJsZWQiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IENvZGVBc3Npc3RPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfVklTSUJJTElUWV9DSEVDSyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29kZSBhc3Npc3Qgb3B0aW9uIElEOiBBY3RpdmF0ZSBEZXByZWNhdGlvbiBTZW5zaXRpdmUgQ29tcGxldGlvbi4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIGNvbXBsZXRpb24gZG9lc24ndCBwcm9wb3NlIGRlcHJlY2F0ZWQgbWVtYmVycyBhbmQgdHlwZXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5kZXByZWNhdGlvbkNoZWNrIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjIKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9ERVBSRUNBVElPTl9DSEVDSyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmRlcHJlY2F0aW9uQ2hlY2siOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogQWN0aXZhdGUgQ2FtZWwgQ2FzZSBTZW5zaXRpdmUgQ29tcGxldGlvbi4KKwkgKiA8cD5XaGVuIGVuYWJsZWQsIGNvbXBsZXRpb24gc2hvd3MgcHJvcG9zYWxzIHdob3NlIG5hbWUgbWF0Y2ggdGhlIENhbWVsQ2FzZQorCSAqICAgIHBhdHRlcm4uCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5jYW1lbENhc2VNYXRjaCI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjIKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9DQU1FTF9DQVNFX01BVENIID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuY2FtZWxDYXNlTWF0Y2giOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogQXV0b21hdGljIFF1YWxpZmljYXRpb24gb2YgSW1wbGljaXQgTWVtYmVycy4KKwkgKiA8cD5XaGVuIGFjdGl2ZSwgY29tcGxldGlvbiBhdXRvbWF0aWNhbGx5IHF1YWxpZmllcyBjb21wbGV0aW9uIG9uIGltcGxpY2l0CisJICogICAgZmllbGQgcmVmZXJlbmNlcyBhbmQgbWVzc2FnZSBleHByZXNzaW9ucy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZvcmNlSW1wbGljaXRRdWFsaWZpY2F0aW9uIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJkaXNhYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9JTVBMSUNJVF9RVUFMSUZJQ0FUSU9OID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgRmllbGQgTmFtZS4KKwkgKiA8cD5XaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGZpZWxkIG5hbWUgd2lsbCBiZWdpbiB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfTwvY29kZT4gd2hlcmUgPGNvZGU+Jmx0O3ByZWZpeCZndDs8L2NvZGU+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgU3RhdGljIEZpZWxkIE5hbWUuCisJICogPHA+V2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBzdGF0aWMgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgIiZsdDtwcmVmaXgmZ3Q7WywmbHQ7cHJlZml4Jmd0O10qIiB9PC9jb2RlPiB3aGVyZSA8Y29kZT4mbHQ7cHJlZml4Jmd0OzwvY29kZT4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkPC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb2RlQXNzaXN0T3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9QUkVGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgU3RhdGljIEZpbmFsIEZpZWxkIE5hbWUuCisJICogPHA+V2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBzdGF0aWMgZmluYWwgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLgorCSAqIDxkbD4KKwkgKiA8ZHQ+T3B0aW9uIGlkOjwvZHQ+PGRkPjxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O3ByZWZpeCZndDtbLCZsdDtwcmVmaXgmZ3Q7XSoiIH08L2NvZGU+IHdoZXJlIDxjb2RlPiZsdDtwcmVmaXgmZ3Q7PC9jb2RlPiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQ8L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiIiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KKwkgKiBAc2luY2UgMy41CisJICogQGNhdGVnb3J5IENvZGVBc3Npc3RPcHRpb25JRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfU1RBVElDX0ZJTkFMX0ZJRUxEX1BSRUZJWEVTID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgTG9jYWwgVmFyaWFibGUgTmFtZS4KKwkgKiA8cD5XaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIG5hbWUgd2lsbCBiZWdpbiB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfTwvY29kZT4gd2hlcmUgPGNvZGU+Jmx0O3ByZWZpeCZndDs8L2NvZGU+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgQXJndW1lbnQgTmFtZS4KKwkgKiA8cD5XaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGFyZ3VtZW50IG5hbWUgd2lsbCBiZWdpbiB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfTwvY29kZT4gd2hlcmUgPGNvZGU+Jmx0O3ByZWZpeCZndDs8L2NvZGU+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9BUkdVTUVOVF9QUkVGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgRmllbGQgTmFtZS4KKwkgKiA8cD5XaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGZpZWxkIG5hbWUgd2lsbCBlbmQgd2l0aAorCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH08L2NvZGU+IHdoZXJlIDxjb2RlPiZsdDtzdWZmaXgmZ3Q7PC9jb2RlPiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQ8L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiIiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IENvZGVBc3Npc3RPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfRklFTERfU1VGRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb2RlIGFzc2lzdCBvcHRpb24gSUQ6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIFN0YXRpYyBGaWVsZCBOYW1lLgorCSAqIDxwPldoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3Igc3RhdGljIGZpZWxkIG5hbWUgd2lsbCBlbmQgd2l0aAorCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH08L2NvZGU+PCB3aGVyZSA8Y29kZT4mbHQ7c3VmZml4Jmd0OzwvY29kZT4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkPC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBDb2RlQXNzaXN0T3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgU3RhdGljIEZpbmFsIEZpZWxkIE5hbWUuCisJICogPHA+V2hlbiB0aGUgc3VmZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBzdGF0aWMgZmluYWwgZmllbGQgbmFtZSB3aWxsIGVuZCB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBzdWZmaXhlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcyI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgIiZsdDtzdWZmaXgmZ3Q7WywmbHQ7c3VmZml4Jmd0O10qIiB9PC9jb2RlPjwgd2hlcmUgPGNvZGU+Jmx0O3N1ZmZpeCZndDs8L2NvZGU+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgorCSAqIEBzaW5jZSAzLjUKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfU1VGRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29kZSBhc3Npc3Qgb3B0aW9uIElEOiBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBMb2NhbCBWYXJpYWJsZSBOYW1lLgorCSAqIDxwPldoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgbG9jYWwgdmFyaWFibGUgbmFtZSB3aWxsIGVuZCB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBzdWZmaXhlcy4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXMiPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICImbHQ7c3VmZml4Jmd0O1ssJmx0O3N1ZmZpeCZndDtdKiIgfTwvY29kZT4gd2hlcmUgPGNvZGU+Jmx0O3N1ZmZpeCZndDs8L2NvZGU+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+IiI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAyLjEKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXMiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvZGUgYXNzaXN0IG9wdGlvbiBJRDogRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgQXJndW1lbnQgTmFtZS4KKwkgKiA8cD5XaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGFyZ3VtZW50IG5hbWUgd2lsbCBlbmQgd2l0aAorCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH08L2NvZGU+IHdoZXJlIDxjb2RlPiZsdDtzdWZmaXgmZ3Q7PC9jb2RlPiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQ8L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiIiPC9jb2RlPjwvZGQ+CisJICogPC9kbD4KIAkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IENvZGVBc3Npc3RPcHRpb25JRAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb2RlIGFzc2lzdCBvcHRpb24gSUQ6IEFjdGl2YXRlIEZvcmJpZGRlbiBSZWZlcmVuY2UgU2Vuc2l0aXZlIENvbXBsZXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIGRvZXNuJ3QgcHJvcG9zZSBlbGVtZW50cyB3aGljaCBtYXRjaCBhCisgIAkgKiAgICBmb3JiaWRkZW4gcmVmZXJlbmNlIHJ1bGUuCisJICogPGRsPgorCSAqIDxkdD5PcHRpb24gaWQ6PC9kdD48ZGQ+PGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5mb3JiaWRkZW5SZWZlcmVuY2VDaGVjayI8L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+UG9zc2libGUgdmFsdWVzOjwvZHQ+PGRkPjxjb2RlPnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH08L2NvZGU+PC9kZD4KKwkgKiA8ZHQ+RGVmYXVsdDo8L2R0PjxkZD48Y29kZT4iZW5hYmxlZCI8L2NvZGU+PC9kZD4KKwkgKiA8L2RsPgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgQ29kZUFzc2lzdE9wdGlvbklECiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9GT1JCSURERU5fUkVGRVJFTkNFX0NIRUNLPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5mb3JiaWRkZW5SZWZlcmVuY2VDaGVjayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29kZSBhc3Npc3Qgb3B0aW9uIElEOiBBY3RpdmF0ZSBEaXNjb3VyYWdlZCBSZWZlcmVuY2UgU2Vuc2l0aXZlIENvbXBsZXRpb24uCisJICogPHA+V2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIGRvZXNuJ3QgcHJvcG9zZSBlbGVtZW50cyB3aGljaCBtYXRjaCBhCisgIAkgKiAgICBkaXNjb3VyYWdlZCByZWZlcmVuY2UgcnVsZS4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmRpc2NvdXJhZ2VkUmVmZXJlbmNlQ2hlY2siPC9jb2RlPjwvZGQ+CisJICogPGR0PlBvc3NpYmxlIHZhbHVlczo8L2R0PjxkZD48Y29kZT57ICJlbmFibGVkIiwgImRpc2FibGVkIiB9PC9jb2RlPjwvZGQ+CisJICogPGR0PkRlZmF1bHQ6PC9kdD48ZGQ+PGNvZGU+ImRpc2FibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMQorCSAqIEBjYXRlZ29yeSBDb2RlQXNzaXN0T3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX0RJU0NPVVJBR0VEX1JFRkVSRU5DRV9DSEVDSz0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuZGlzY291cmFnZWRSZWZlcmVuY2VDaGVjayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29kZSBhc3Npc3Qgb3B0aW9uIElEOiBBY3RpdmF0ZSBTdWdnZXN0aW9uIG9mIFN0YXRpYyBJbXBvcnQuCisJICogPHA+V2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIHByb3Bvc2FscyBjYW4gY29udGFpbiBzdGF0aWMgaW1wb3J0CisJICogICAgcGF0dGVybi4KKwkgKiA8ZGw+CisJICogPGR0Pk9wdGlvbiBpZDo8L2R0PjxkZD48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN1Z2dlc3RTdGF0aWNJbXBvcnRzIjwvY29kZT48L2RkPgorCSAqIDxkdD5Qb3NzaWJsZSB2YWx1ZXM6PC9kdD48ZGQ+PGNvZGU+eyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfTwvY29kZT48L2RkPgorCSAqIDxkdD5EZWZhdWx0OjwvZHQ+PGRkPjxjb2RlPiJlbmFibGVkIjwvY29kZT48L2RkPgorCSAqIDwvZGw+CiAJICogQHNpbmNlIDMuMworCSAqIEBjYXRlZ29yeSBDb2RlQXNzaXN0T3B0aW9uSUQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX1NVR0dFU1RfU1RBVElDX0lNUE9SVFM9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLnN1Z2dlc3RTdGF0aWNJbXBvcnRzIjsgLy8kTk9OLU5MUy0xJAorCS8vIGVuZCBjb25maWd1cmFibGUgb3B0aW9uIElEcyB9CisJLy8gQmVnaW4gY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZXMgewogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKLQkgKiBAc2luY2UgMy4yCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjREVGQVVMVF9UQVNLX1RBR1N9IGluc3RlYWQuCisJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uVmFsdWUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX0ZPUl9QQVJBTUVURVJfTkFNRV9GUk9NX0FUVEFDSEVEX0pBVkFET0MgPSBQTFVHSU5fSUQgKyAiLnRpbWVvdXRGb3JQYXJhbWV0ZXJOYW1lRnJvbUF0dGFjaGVkSmF2YWRvYyI7IC8vJE5PTi1OTFMtMSQKLQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFTS19UQUcgPSAiVE9ETyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjREVGQVVMVF9UQVNLX1BSSU9SSVRJRVN9IGluc3RlYWQuCisJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBEZXByZWNhdGVkT3B0aW9uVmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBU0tfUFJJT1JJVFkgPSAiTk9STUFMIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBU0tfVEFHUyA9ICJUT0RPLEZJWE1FLFhYWCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVNLX1BSSU9SSVRJRVMgPSAiTk9STUFMLEhJR0gsTk9STUFMIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFID0gImdlbmVyYXRlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19OT1RfR0VORVJBVEUgPSAiZG8gbm90IGdlbmVyYXRlIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkVfT1VUID0gIm9wdGltaXplIG91dCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZSBmb3Ige0BsaW5rICNDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVN9OiB7QHZhbHVlfS4KKwkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19QUklPUklUWV9ISUdIID0gIkhJR0giOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZSBmb3Ige0BsaW5rICNDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVN9OiB7QHZhbHVlfS4KKwkgKiBAc2luY2UgMi4xCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19QUklPUklUWV9MT1cgPSAiTE9XIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUgZm9yIHtAbGluayAjQ09NUElMRVJfVEFTS19QUklPUklUSUVTfToge0B2YWx1ZX0uCisJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1RBU0tfUFJJT1JJVFlfTk9STUFMID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfMSA9ICIxLjEiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV8yID0gIjEuMiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV8zID0gIjEuMyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV80ID0gIjEuNCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV81ID0gIjEuNSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDMuMgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV82ID0gIjEuNiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDMuMworCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV83ID0gIjEuNyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQ0xEQ18xXzEgPSAiY2xkYzEuMSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPUlQgPSAiYWJvcnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SID0gImVycm9yIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRSA9ICJpZ25vcmUiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBVVEUgPSAiY29tcHV0ZSI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVCA9ICJpbnNlcnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19OT1RfSU5TRVJUID0gImRvIG5vdCBpbnNlcnQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9PTkUgPSAicHJlc2VydmUgb25lIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMID0gImNsZWFyIGFsbCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQUNUID0gImNvbXBhY3QiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KIAkgKiBAc2luY2UgMi4wCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRCA9ICJkaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDIuMQorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOID0gImNsZWFuIjsgLy8kTk9OLU5MUy0xJAogCS8qKgotCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KIAkgKiBAc2luY2UgMy4wCisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICogQ29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZToge0B2YWx1ZX0uCiAJICogQHNpbmNlIDMuMAorCSAqIEBjYXRlZ29yeSBPcHRpb25WYWx1ZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRCA9ICJwcm90ZWN0ZWQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAzLjAKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFID0gInByaXZhdGUiOyAvLyROT04tTkxTLTEkCiAJLyoqCi0JICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUiA9ICJuZXZlciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR19ERVNDUklQVElPTl9OT19UQUcgPSBDb21waWxlck9wdGlvbnMuTk9fVEFHOworCS8qKgorCSAqIENvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWU6IHtAdmFsdWV9LgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgT3B0aW9uVmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHX0RFU0NSSVBUSU9OX1JFVFVSTl9UQUcgPSBDb21waWxlck9wdGlvbnMuUkVUVVJOX1RBRzsKKwkvKioKKwkgKiBDb25maWd1cmFibGUgb3B0aW9uIHZhbHVlOiB7QHZhbHVlfS4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IE9wdGlvblZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR19ERVNDUklQVElPTl9BTExfU1RBTkRBUkRfVEFHUyA9IENvbXBpbGVyT3B0aW9ucy5BTExfU1RBTkRBUkRfVEFHUzsKKwkvLyBlbmQgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZXMgfQogCiAJLyoqCiAJICogVmFsdWUgb2YgdGhlIGNvbnRlbnQtdHlwZSBmb3IgSmF2YSBzb3VyY2UgZmlsZXMuIFVzZSB0aGlzIHZhbHVlIHRvIHJldHJpZXZlIHRoZSBKYXZhIGNvbnRlbnQgdHlwZQpAQCAtMTIyNCw3ICsyNDYyLDcgQEAKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIGFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spIHsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFTdGF0ZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldERlbHRhU3RhdGUoKS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOwogCX0KIAogCS8qKgpAQCAtMTMxNyw3ICsyNTU1LDcgQEAKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIGFkZFByZVByb2Nlc3NpbmdSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVN0YXRlLmFkZFByZVJlc291cmNlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldERlbHRhU3RhdGUoKS5hZGRQcmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lciwgZXZlbnRNYXNrKTsKIAl9CiAKIAkvKioKQEAgLTEzNTIsMTMgKzI1OTAsMTMgQEAKIAkgKiBSZXR1cm5zIHRoZSBKYXZhIG1vZGVsIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaGFuZGxlIGlkZW50aWZpZXIKIAkgKiBnZW5lcmF0ZWQgYnkgPGNvZGU+SUphdmFFbGVtZW50LmdldEhhbmRsZUlkZW50aWZpZXIoKTwvY29kZT4sIG9yCiAJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBlbGVtZW50LgotCSAqIElmIHRoZSByZXR1cm5lZCBKYXZhIGVsZW1lbnQgaXMgYW4gPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4sIGl0cyBvd25lcgotCSAqIGlzIHRoZSBnaXZlbiBvd25lciBpZiBzdWNoIGEgd29ya2luZyBjb3B5IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogaXMgYSBwcmltYXJ5IGNvbXBpbGF0aW9uIHVuaXQuCisJICogSWYgdGhlIHJldHVybmVkIEphdmEgZWxlbWVudCBpcyBhbiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBvciBhbiBlbGVtZW50CisJICogaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdCwgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBvd25lciBpcyB0aGUgZ2l2ZW4gb3duZXIgaWYgc3VjaCBhCisJICogd29ya2luZyBjb3B5IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGEgcHJpbWFyeSBjb21waWxhdGlvbiB1bml0LgogCSAqCiAJICogQHBhcmFtIGhhbmRsZUlkZW50aWZpZXIgdGhlIGdpdmVuIGhhbmRsZSBpZGVudGlmaWVyCiAJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB0aGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCwgaWdub3JlZCBpZiB0aGUgcmV0dXJuZWQKLQkgKiAgIGVsZW1lbnQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdAorCSAqICAgZWxlbWVudCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0LCBvciBhbiBlbGVtZW50IGluc2lkZSBhIGNvbXBpbGF0aW9uIHVuaXQKIAkgKiBAcmV0dXJuIHRoZSBKYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaGFuZGxlIGlkZW50aWZpZXIKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMzY2LDYgKzI2MDQsOCBAQAogCQlpZiAoaGFuZGxlSWRlbnRpZmllciA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQorCQlpZiAob3duZXIgPT0gbnVsbCkKKwkJCW93bmVyID0gRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWTsKIAkJTWVtZW50b1Rva2VuaXplciBtZW1lbnRvID0gbmV3IE1lbWVudG9Ub2tlbml6ZXIoaGFuZGxlSWRlbnRpZmllcik7CiAJCUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwogCQlyZXR1cm4gbW9kZWwuZ2V0SGFuZGxlRnJvbU1lbWVudG8obWVtZW50bywgb3duZXIpOwpAQCAtMTM4MCw3ICsyNjIwLDcgQEAKIAkgKgk8bGk+YSBmaWxlIHdpdGggb25lIG9mIHRoZSB7QGxpbmsgSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkKIAkgKiAgICAgIEphdmEtbGlrZSBleHRlbnNpb25zfSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4KIAkgKgk8bGk+YSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPjwvbGk+Ci0JICoJPGxpPmEgPGNvZGU+LmphcjwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CisJICoJPGxpPmEgWklQIGFyY2hpdmUgKGUuZy4gYSA8Y29kZT4uamFyPC9jb2RlPiwgYSA8Y29kZT4uemlwPC9jb2RlPiBmaWxlLCBldGMuKSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CiAJICoJPC91bD4KIAkgKiA8cD4KIAkgKiBDcmVhdGluZyBhIEphdmEgZWxlbWVudCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGFsbCBvZiB0aGUKQEAgLTE0MzgsNyArMjY3OCw3IEBACiAJICoJPGxpPmEgZmlsZSB3aXRoIG9uZSBvZiB0aGUge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpCiAJICogICAgICBKYXZhLWxpa2UgZXh0ZW5zaW9uc30gLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPjwvbGk+CiAJICoJPGxpPmEgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT48L2xpPgotCSAqCTxsaT5hIDxjb2RlPi5qYXI8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT48L2xpPgorCSAqCTxsaT5hIFpJUCBhcmNoaXZlIChlLmcuIGEgPGNvZGU+LmphcjwvY29kZT4sIGEgPGNvZGU+LnppcDwvY29kZT4gZmlsZSwgZXRjLikgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT48L2xpPgogCSAqICA8bGk+YSBmb2xkZXIgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4KIAkgKiAgICAJb3IgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT48L2xpPgogCSAqICA8bGk+dGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+PC9saT4KQEAgLTE0NjUsNyArMjcwNSw3IEBACiAJICoJPGxpPmEgZmlsZSB3aXRoIG9uZSBvZiB0aGUge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpCiAJICogICAgICBKYXZhLWxpa2UgZXh0ZW5zaW9uc30gLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPjwvbGk+CiAJICoJPGxpPmEgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT48L2xpPgotCSAqCTxsaT5hIDxjb2RlPi5qYXI8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT48L2xpPgorCSAqCTxsaT5hIFpJUCBhcmNoaXZlIChlLmcuIGEgPGNvZGU+LmphcjwvY29kZT4sIGEgPGNvZGU+LnppcDwvY29kZT4gZmlsZSwgZXRjLikgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT48L2xpPgogCSAqICA8bGk+YSBmb2xkZXIgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4KIAkgKiAgICAJb3IgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT48L2xpPgogCSAqICA8bGk+dGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+PC9saT4KQEAgLTE1ODgsNyArMjgyOCw3IEBACiAJICogQHNpbmNlIDIuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoU3RyaW5nIGNvbnRhaW5lcklEKSB7Ci0JCUhhc2hNYXAgY29udGFpbmVySW5pdGlhbGl6ZXJzQ2FjaGUgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jb250YWluZXJJbml0aWFsaXplcnNDYWNoZTsKKwkJSGFzaHRhYmxlIGNvbnRhaW5lckluaXRpYWxpemVyc0NhY2hlID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY29udGFpbmVySW5pdGlhbGl6ZXJzQ2FjaGU7CiAJCUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKSBjb250YWluZXJJbml0aWFsaXplcnNDYWNoZS5nZXQoY29udGFpbmVySUQpOwogCQlpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogCQkJaW5pdGlhbGl6ZXIgPSBjb21wdXRlQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoY29udGFpbmVySUQpOwpAQCAtMTYyMSw3ICsyODYxLDcgQEAKIAkJCQkJCQl9CiAJCQkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgewogCQkJCQkJCS8vIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiBpZ25vcmUgdGhpcyBpbml0aWFsaXplcgotCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgeworCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSB8fCBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKSB7CiAJCQkJCQkJCXZlcmJvc2VfZmFpbGVkX3RvX2luc3RhbmNpYXRlX2NvbnRhaW5lcl9pbml0aWFsaXplcihjb250YWluZXJJRCwgY29uZmlndXJhdGlvbkVsZW1lbnQpOwogCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJCQkJCX0KQEAgLTE3MDAsMTggKzI5NDAsMTggQEAKIAkJCQltYW5hZ2VyLnZhcmlhYmxlc1dpdGhJbml0aWFsaXplci5hZGQodmFyaWFibGVOYW1lKTsKIAkJCQlvayA9IHRydWU7CiAJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpCisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpCiAJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJdGhyb3cgZTsKIAkJCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpCisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpCiAJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJdGhyb3cgZTsKIAkJCX0gZmluYWxseSB7CiAJCQkJaWYgKCFvaykgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkudmFyaWFibGVQdXQodmFyaWFibGVOYW1lLCBudWxsKTsgLy8gZmx1c2ggY2FjaGUKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCkKKwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCB8fCBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCXZlcmJvc2Vfbm9fdmFyaWFibGVfaW5pdGlhbGl6ZXJfZm91bmQodmFyaWFibGVOYW1lKTsKIAkJfQogCQlyZXR1cm4gdmFyaWFibGVQYXRoOwpAQCAtMTc1Miw3ICsyOTkyLDQyIEBACiAJICogQHNpbmNlIDMuMwogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzcGF0aFZhcmlhYmxlRGVwcmVjYXRpb25NZXNzYWdlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKLQkgICAgcmV0dXJuIChTdHJpbmcpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlcHJlY2F0ZWRWYXJpYWJsZXMuZ2V0KHZhcmlhYmxlTmFtZSk7CisJICAgIEphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCisJCS8vIFJldHVybnMgdGhlIHN0b3JlZCBkZXByZWNhdGlvbiBtZXNzYWdlCisJCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgbWFuYWdlci5kZXByZWNhdGVkVmFyaWFibGVzLmdldCh2YXJpYWJsZU5hbWUpOworCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7CisJCSAgICByZXR1cm4gbWVzc2FnZTsKKwkJfQorCisJICAgIC8vIElmIHRoZSB2YXJpYWJsZSBoYXMgYmVlbiBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIHRoZXJlJ3Mgbm8gZGVwcmVjYXRpb24gbWVzc2FnZQorCQlJUGF0aCB2YXJpYWJsZVBhdGggPSBtYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7CisJCWlmICh2YXJpYWJsZVBhdGggIT0gbnVsbCAmJiB2YXJpYWJsZVBhdGggIT0gSmF2YU1vZGVsTWFuYWdlci5WQVJJQUJMRV9JTklUSUFMSVpBVElPTl9JTl9QUk9HUkVTUykgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBTZWFyY2ggZm9yIGV4dGVuc2lvbiBwb2ludCB0byBnZXQgdGhlIHBvc3NpYmxlIGRlcHJlY2F0aW9uIG1lc3NhZ2UKKwkJUGx1Z2luIGpkdENvcmVQbHVnaW4gPSBKYXZhQ29yZS5nZXRQbHVnaW4oKTsKKwkJaWYgKGpkdENvcmVQbHVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvbiA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSmF2YUNvcmUuUExVR0lOX0lELCBKYXZhTW9kZWxNYW5hZ2VyLkNQVkFSSUFCTEVfSU5JVElBTElaRVJfRVhUUE9JTlRfSUQpOworCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKKwkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCk7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyl7CisJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uc1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKKwkJCQlmb3IoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspeworCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOworCQkJCQlTdHJpbmcgdmFyQXR0cmlidXRlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInZhcmlhYmxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHZhcmlhYmxlTmFtZS5lcXVhbHModmFyQXR0cmlidXRlKSkgeworCQkJCQkJU3RyaW5nIGRlcHJlY2F0ZWRBdHRyaWJ1dGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVwcmVjYXRlZCIpOyAvLyROT04tTkxTLTEkCisJCQkJCQlpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCQkJcmV0dXJuIGRlcHJlY2F0ZWRBdHRyaWJ1dGU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCkBAIC0xNzk4LDcgKzMwNzMsNyBAQAogCQkJCQkJfQogCQkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CiAJCQkJCQkvLyBleGVjdXRhYmxlIGV4dGVuc2lvbiBjb3VsZCBub3QgYmUgY3JlYXRlZDogaWdub3JlIHRoaXMgaW5pdGlhbGl6ZXIKLQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgeworCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpIHsKIAkJCQkJCQl2ZXJib3NlX2ZhaWxlZF90b19pbnN0YW5jaWF0ZV92YXJpYWJsZV9pbml0aWFsaXplcih2YXJpYWJsZSwgY29uZmlnRWxlbWVudCk7CiAJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCQkJCX0KQEAgLTE4NDMsOTEzICszMTE4LDE4IEBACiAJICogVGhlc2Ugb3B0aW9ucyBhbGxvdyB0byBjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgdW5kZXJseWluZyBjb21wb25lbnRzLgogCSAqIFRoZSBjbGllbnQgbWF5IHNhZmVseSB1c2UgdGhlIHJlc3VsdCBhcyBhIHRlbXBsYXRlIHRoYXQgdGhleSBjYW4gbW9kaWZ5IGFuZAogCSAqIHRoZW4gcGFzcyB0byA8Y29kZT5zZXRPcHRpb25zPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBIZWxwZXIgY29uc3RhbnRzIGhhdmUgYmVlbiBkZWZpbmVkIG9uIEphdmFDb3JlIGZvciBlYWNoIG9mIHRoZSBvcHRpb24gSURzCisJICogKGNhdGVnb3JpemVkIGluIENvZGUgYXNzaXN0IG9wdGlvbiBJRCwgQ29tcGlsZXIgb3B0aW9uIElEIGFuZCBDb3JlIG9wdGlvbiBJRCkKKwkgKiBhbmQgc29tZSBvZiB0aGVpciBhY2NlcHRhYmxlIHZhbHVlcyAoY2F0ZWdvcml6ZWQgaW4gT3B0aW9uIHZhbHVlKS4gU29tZQorCSAqIG9wdGlvbnMgYWNjZXB0IG9wZW4gdmFsdWUgc2V0cyBiZXlvbmQgdGhlIGRvY3VtZW50ZWQgY29uc3RhbnQgdmFsdWVzLgorCSAqIDxwPgorCSAqIE5vdGU6IGVhY2ggcmVsZWFzZSBtYXkgYWRkIG5ldyBvcHRpb25zLgogCSAqCi0JICogSGVscGVyIGNvbnN0YW50cyBoYXZlIGJlZW4gZGVmaW5lZCBvbiBKYXZhQ29yZSBmb3IgZWFjaCBvZiB0aGUgb3B0aW9uIElEIGFuZAotCSAqIHRoZWlyIHBvc3NpYmxlIGNvbnN0YW50IHZhbHVlcy4KLQkgKgotCSAqIE5vdGU6IG1vcmUgb3B0aW9ucyBtaWdodCBiZSBhZGRlZCBpbiBmdXJ0aGVyIHJlbGVhc2VzLgotCSAqIDxwcmU+Ci0JICogUkVDT0dOSVpFRCBPUFRJT05TOgotCSAqCi0JICogQ09NUElMRVIgLyBTZXR0aW5nIENvbXBsaWFuY2UgTGV2ZWwKLQkgKiAgICBTZWxlY3QgdGhlIGNvbXBsaWFuY2UgbGV2ZWwgZm9yIHRoZSBjb21waWxlci4gSW4gIjEuMyIgbW9kZSwgc291cmNlIGFuZCB0YXJnZXQgc2V0dGluZ3MKLQkgKiAgICBzaG91bGQgbm90IGdvIGJleW9uZCAiMS4zIiBsZXZlbC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjEuMyIsICIxLjQiLCAiMS41IiwgIjEuNiIsICIxLjciIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIjEuNCIKLQkgKgotCSAqIENPTVBJTEVSIC8gU2V0dGluZyBTb3VyY2UgQ29tcGF0aWJpbGl0eSBNb2RlCi0JICogICAgU3BlY2lmeSB3aGV0aGVyIHdoaWNoIHNvdXJjZSBsZXZlbCBjb21wYXRpYmlsaXR5IGlzIHVzZWQuIEZyb20gMS40IG9uLCAnYXNzZXJ0JyBpcyBhIGtleXdvcmQKLQkgKiAgICByZXNlcnZlZCBmb3IgYXNzZXJ0aW9uIHN1cHBvcnQuIEFsc28gbm90ZSwgdGhhbiB3aGVuIHRvZ2dsaW5nIHRvIDEuNCBtb2RlLCB0aGUgdGFyZ2V0IFZNCi0JICogICBsZXZlbCBzaG91bGQgYmUgc2V0IHRvICIxLjQiIGFuZCB0aGUgY29tcGxpYW5jZSBtb2RlIHNob3VsZCBiZSAiMS40Ii4KLQkgKiAgIFNvdXJjZSBsZXZlbCAxLjUgaXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBnZW5lcmljcywgYXV0b2JveGluZywgY292YXJpYW5jZSwgYW5ub3RhdGlvbnMsIGVudW1lcmF0aW9ucwotCSAqICAgZW5oYW5jZWQgZm9yIGxvb3AsIHN0YXRpYyBpbXBvcnRzIGFuZCB2YXJhcmdzLiBPbmNlIHRvZ2dsZWQsIHRoZSB0YXJnZXQgVk0gbGV2ZWwgc2hvdWxkIGJlIHNldCB0byAiMS41IgotCSAqICAgYW5kIHRoZSBjb21wbGlhbmNlIG1vZGUgc2hvdWxkIGJlICIxLjUiLgotCSAqICAgU291cmNlIGxldmVsIDEuNiBpcyBuZWNlc3NhcnkgdG8gZW5hYmxlIHRoZSBjb21wdXRhdGlvbiBvZiBzdGFjayBtYXAgdGFibGVzLiBPbmNlIHRvZ2dsZWQsIHRoZSB0YXJnZXQKLQkgKiAgIFZNIGxldmVsIHNob3VsZCBiZSBzZXQgdG8gIjEuNiIgYW5kIHRoZSBjb21wbGlhbmNlIG1vZGUgc2hvdWxkIGJlICIxLjYiLgotCSAqICAgT25jZSB0aGUgc291cmNlIGxldmVsIDEuNyBpcyB0b2dnbGVkLCB0aGUgdGFyZ2V0IFZNIGxldmVsIHNob3VsZCBiZSBzZXQgdG8gIjEuNyIgYW5kIHRoZSBjb21wbGlhbmNlIG1vZGUKLQkgKiAgIHNob3VsZCBiZSAiMS43Ii4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiMS4zIiwgIjEuNCIsICIxLjUiLCAiMS42IiwgIjEuNyIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiMS4zIgotCSAqCi0JICogQ09NUElMRVIgLyBEZWZpbmluZyBUYXJnZXQgSmF2YSBQbGF0Zm9ybQotCSAqICAgIEZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSByZWFzb24sIC5jbGFzcyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIHdpdGggY2VydGFpbiBWTSB2ZXJzaW9ucyBhbmQgbGF0ZXIuCi0JICogICAgTm90ZSB0aGF0ICIxLjQiIHRhcmdldCByZXF1aXJlcyB0byB0b2dnbGUgY29tcGxpYW5jZSBtb2RlIHRvICIxLjQiLCAiMS41IiB0YXJnZXQgcmVxdWlyZXMKLQkgKiAgICB0byB0b2dnbGUgY29tcGxpYW5jZSBtb2RlIHRvICIxLjUiLCAiMS42IiB0YXJnZXQgcmVxdWlyZXMgdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbW9kZSB0byAiMS42IiBhbmQKLQkgKiAgICAiMS43IiB0YXJnZXQgcmVxdWlyZXMgdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbW9kZSB0byAiMS43Ii4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm0iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjEuMSIsICIxLjIiLCAiMS4zIiwgIjEuNCIsICIxLjUiLCAiMS42IiwgIjEuNyIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiMS4yIgotCSAqCi0JICogQ09NUElMRVIgLyBHZW5lcmF0aW5nIExvY2FsIFZhcmlhYmxlIERlYnVnIEF0dHJpYnV0ZQotIAkgKiAgICBXaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgbG9jYWwgdmFyaWFibGUgbmFtZXMKLQkgKiAgICB0byBiZSBkaXNwbGF5ZWQgaW4gZGVidWdnZXIsIG9ubHkgaW4gcGxhY2Ugd2hlcmUgdmFyaWFibGVzIGFyZQotCSAqICAgIGRlZmluaXRlbHkgYXNzaWduZWQgKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKQotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZ2VuZXJhdGUiLCAiZG8gbm90IGdlbmVyYXRlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJnZW5lcmF0ZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gR2VuZXJhdGluZyBMaW5lIE51bWJlciBEZWJ1ZyBBdHRyaWJ1dGUKLQkgKiAgICBXaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgc291cmNlIGNvZGUgaGlnaGxpZ2h0aW5nIGluIGRlYnVnZ2VyCi0JICogICAgKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXIiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImdlbmVyYXRlIiwgImRvIG5vdCBnZW5lcmF0ZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZ2VuZXJhdGUiCi0JICoKLQkgKiBDT01QSUxFUiAvIEdlbmVyYXRpbmcgU291cmNlIERlYnVnIEF0dHJpYnV0ZQotCSAqICAgIFdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSB0aGUgZGVidWdnZXIgdG8gcHJlc2VudCB0aGUKLQkgKiAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZ2VuZXJhdGUiLCAiZG8gbm90IGdlbmVyYXRlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJnZW5lcmF0ZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUHJlc2VydmluZyBVbnVzZWQgTG9jYWwgVmFyaWFibGVzCi0JICogICAgVW5sZXNzIHJlcXVlc3RlZCB0byBwcmVzZXJ2ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzICh0aGF0IGlzLCBuZXZlciByZWFkKSwgdGhlCi0JICogICAgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIG91dCwgcG90ZW50aWFsbHkgYWx0ZXJpbmcgZGVidWdnaW5nCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJwcmVzZXJ2ZSIsICJvcHRpbWl6ZSBvdXQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgInByZXNlcnZlIgotCSAqCi0JICogQ09NUElMRVIgLyBJbmxpbmUgSlNSIEJ5dGVjb2RlIEluc3RydWN0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBubyBsb25nZXIgZ2VuZXJhdGUgSlNSIGluc3RydWN0aW9ucywgYnV0IHJhdGhlciBpbmxpbmUgY29ycmVzcG9uZGluZwotCSAqICAgc3Vicm91dGluZSBjb2RlIHNlcXVlbmNlcyAobW9zdGx5IGNvcnJlc3BvbmRpbmcgdG8gdHJ5IGZpbmFsbHkgYmxvY2tzKS4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgdGh1cwotCSAqICAgZ2V0IGJpZ2dlciwgYnV0IHdpbGwgbG9hZCBmYXN0ZXIgb24gdmlydHVhbCBtYWNoaW5lcyBzaW5jZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgdGhlbiBtdWNoIHNpbXBsZXIuCi0JICogIFRoaXMgbW9kZSBpcyBhbnRpY2lwYXRpbmcgc3VwcG9ydCBmb3IgdGhlIEphdmEgU3BlY2lmaWNhdGlvbiBSZXF1ZXN0IDIwMi4KLQkgKiAgTm90ZSB0aGF0IEpTUiBpbmxpbmluZyBpcyBvcHRpb25hbCBvbmx5IGZvciB0YXJnZXQgcGxhdGZvcm0gbGVzc2VyIHRoYW4gMS41LiBGcm9tIDEuNSBvbiwgdGhlIEpTUgotCSAqICBpbmxpbmluZyBpcyBtYW5kYXRvcnkgKGFsc28gc2VlIHJlbGF0ZWQgc2V0dGluZyAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSIpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZGlzYWJsZWQiCi0JICoKLQkgKiBDT01QSUxFUiAvIEphdmFkb2MgQ29tbWVudCBTdXBwb3J0Ci0JICogICAgV2hlbiB0aGlzIHN1cHBvcnQgaXMgZGlzYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlnbm9yZSBhbGwgamF2YWRvYyBwcm9ibGVtcyBvcHRpb25zIHNldHRpbmdzCi0JICogICAgYW5kIHdpbGwgbm90IHJlcG9ydCBhbnkgamF2YWRvYyBwcm9ibGVtLiBJdCB3aWxsIGFsc28gbm90IGZpbmQgYW55IHJlZmVyZW5jZSBpbiBqYXZhZG9jIGNvbW1lbnQgYW5kCi0JICogICAgRE9NIEFTVCBKYXZhZG9jIG5vZGUgd2lsbCBiZSBvbmx5IGEgZmxhdCB0ZXh0IGluc3RlYWQgb2YgaGF2aW5nIHN0cnVjdHVyZWQgdGFnIGVsZW1lbnRzLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZW5hYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEF0dGVtcHQgdG8gT3ZlcnJpZGUgUGFja2FnZS1EZWZhdWx0IE1ldGhvZAotCSAqICAgIEEgcGFja2FnZSBkZWZhdWx0IG1ldGhvZCBpcyBub3QgdmlzaWJsZSBpbiBhIGRpZmZlcmVudCBwYWNrYWdlLCBhbmQgdGh1cwotCSAqICAgIGNhbm5vdCBiZSBvdmVycmlkZGVuLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwKLQkgKiAgICBzdWNoIHNjZW5hcmlpIGVpdGhlciBhcyBhbiBlcnJvciBvciBhIHdhcm5pbmcuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBNZXRob2QgV2l0aCBDb25zdHJ1Y3RvciBOYW1lCi0JICogICAgTmFtaW5nIGEgbWV0aG9kIHdpdGggYSBjb25zdHJ1Y3RvciBuYW1lIGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHBvb3IKLQkgKiAgICBzdHlsZSBwcm9ncmFtbWluZy4gV2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHN1Y2gKLQkgKiAgICBzY2VuYXJpaSBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIERlcHJlY2F0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgdXNlIG9mIGRlcHJlY2F0ZWQgQVBJIGVpdGhlciBhcyBhbgotCSAqICAgIGVycm9yIG9yIGEgd2FybmluZy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb24iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgRGVwcmVjYXRpb24gSW5zaWRlIERlcHJlY2F0ZWQgQ29kZQotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVzZSBvZiBkZXByZWNhdGVkIEFQSSBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlLgotCSAqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIi4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIERlcHJlY2F0aW9uIFdoZW4gT3ZlcnJpZGluZyBEZXByZWNhdGVkIE1ldGhvZAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHRoZSBkZWNsYXJhdGlvbiBvZiBhIG1ldGhvZCBvdmVycmlkaW5nIGEgZGVwcmVjYXRlZCBvbmUuCi0JICogICAgVGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb24iLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEhpZGRlbiBDYXRjaCBCbG9jawotCSAqICAgIExvY2FsbHkgdG8gYSB0cnkgc3RhdGVtZW50LCBzb21lIGNhdGNoIGJsb2NrcyBtYXkgaGlkZSBvdGhlcnMgLiBGb3IgZXhhbXBsZSwKLQkgKiAgICAgIHRyeSB7ICB0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigpOwotCSAqICAgICAgfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JICogICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHt9LgotCSAqICAgIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgaGlkZGVuCi0JICogICAgY2F0Y2ggYmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gY2hlY2tlZCBleGNlcHRpb25zCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2siCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIExvY2FsCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBsb2NhbAotCSAqICAgIHZhcmlhYmxlcyAodGhhdCBpcywgdmFyaWFibGVzIG5ldmVyIHJlYWQgZnJvbSkKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWwiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbnVzZWQgUGFyYW1ldGVyCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBtZXRob2QKLQkgKiAgICBwYXJhbWV0ZXJzICh0aGF0IGlzLCBwYXJhbWV0ZXJzIG5ldmVyIHJlYWQgZnJvbSkKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFBhcmFtZXRlciBpZiBJbXBsZW1lbnRpbmcgQWJzdHJhY3QgTWV0aG9kCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgdW51c2VkIHBhcmFtZXRlcnMgaW4gYWJzdHJhY3QgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4KLQkgKiAgICBUaGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gaXMgY29udHJvbGxlZCB3aXRoIG9wdGlvbiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXIiLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFBhcmFtZXRlciBpZiBPdmVycmlkaW5nIENvbmNyZXRlIE1ldGhvZAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVudXNlZCBwYXJhbWV0ZXJzIGluIG1ldGhvZHMgb3ZlcnJpZGluZyBjb25jcmV0ZSBvbmVzLgotCSAqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09NUElMRVIgLyBDb25zaWRlciBSZWZlcmVuY2UgaW4gRG9jIENvbW1lbnQgZm9yIFVudXNlZCBQYXJhbWV0ZXIgQ2hlY2sKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGRvYyBjb21tZW50IHJlZmVyZW5jZXMgdG8gcGFyYW1ldGVycyAoaS5lLiBAcGFyYW0gY2xhdXNlcykgZm9yIHRoZSB1bnVzZWQKLQkgKiAgICBwYXJhbWV0ZXIgY2hlY2suIFRodXMsIGRvY3VtZW50ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgbWFuZGF0ZWQgYXMgcGVyIGRvYyBjb250cmFjdC4KLQkgKiAgICBUaGUgc2V2ZXJpdHkgb2YgdGhlIHVudXNlZCBwYXJhbWV0ZXIgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIuCi0JICogICAgTm90ZTogdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCB1bnRpbCB0aGUgZG9jIGNvbW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkIGFjY29yZGluZyB0byB0aGUgCi0JICogICAgb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0Ii4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY1JlZmVyZW5jZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZW5hYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBJbXBvcnQKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgdW51c2VkIGltcG9ydAotCSAqICAgIHJlZmVyZW5jZQotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFByaXZhdGUgTWVtYmVycwotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgcHJpdmF0ZQotCSAqICAgIG1ldGhvZCBvciBmaWVsZCBpcyBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZCB3aXRoaW4gdGhlIHNhbWUgdW5pdC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEFzc2lnbm1lbnQgd2l0aCBubyBFZmZlY3QKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhbiBhc3NpZ25tZW50Ci0JICogICAgaGFzIG5vIGVmZmVjdCAoZS5nICd4ID0geCcpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgRW1wdHkgU3RhdGVtZW50cyBhbmQgVW5uZWNlc3NhcnkgU2VtaWNvbG9ucwotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGFuIGVtcHR5IHN0YXRlbWVudCBvciBhCi0JICogICAgdW5uZWNlc3Nhcnkgc2VtaWNvbG9uIGlzIGVuY291bnRlcmVkLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVubmVjZXNzYXJ5IFR5cGUgQ2hlY2sKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGEgY2FzdCBvciBhbiBpbnN0YW5jZW9mIG9wZXJhdGlvbgotCSAqICAgIGlzIHVubmVjZXNzYXJ5LgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjayIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVubmVjZXNzYXJ5IEVsc2UKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGEgc3RhdGVtZW50IGlzIHVubmVjZXNzYXJpbHkKLQkgKiAgICBuZXN0ZWQgd2l0aGluIGFuIGVsc2UgY2xhdXNlIChpbiBzaXR1YXRpb24gd2hlcmUgdGhlbiBjbGF1c2UgaXMgbm90IGNvbXBsZXRpbmcgbm9ybWFsbHkpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2UiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBTeW50aGV0aWMgQWNjZXNzIEVtdWxhdGlvbgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGl0IGVtdWxhdGVzCi0JICogICAgYWNjZXNzIHRvIGEgbm9uLWFjY2Vzc2libGUgbWVtYmVyIG9mIGFuIGVuY2xvc2luZyB0eXBlLiBTdWNoIGFjY2VzcyBjYW4gaGF2ZQotCSAqICAgIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgTm9uLUV4dGVybmFsaXplZCBTdHJpbmcgTGl0ZXJhbAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciBub24gZXh0ZXJuYWxpemVkCi0JICogICAgU3RyaW5nIGxpdGVyYWwgKHRoYXQgaXMsIG5vdCB0YWdnZWQgd2l0aCAvLyROT04tTkxTLSZsdDtuJmd0OyQpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVXNhZ2Ugb2YgJ2Fzc2VydCcgSWRlbnRpZmllcgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyICdhc3NlcnQnIGlzCi0JICogICAgdXNlZCBhcyBhbiBpZGVudGlmaWVyIChyZXNlcnZlZCBrZXl3b3JkIGluIDEuNCkKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVc2FnZSBvZiAnZW51bScgSWRlbnRpZmllcgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyICdlbnVtJyBpcwotCSAqICAgIHVzZWQgYXMgYW4gaWRlbnRpZmllciAocmVzZXJ2ZWQga2V5d29yZCBpbiAxLjUpCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE5vbi1TdGF0aWMgUmVmZXJlbmNlIHRvIGEgU3RhdGljIE1lbWJlcgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgc3RhdGljIGZpZWxkCi0JICogICAgb3IgbWV0aG9kIGlzIGFjY2Vzc2VkIHdpdGggYW4gZXhwcmVzc2lvbiByZWNlaXZlci4gQSByZWZlcmVuY2UgdG8gYSBzdGF0aWMgbWVtYmVyIHNob3VsZAotCSAqICAgIGJlIHF1YWxpZmllZCB3aXRoIGEgdHlwZSBuYW1lLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBJbmRpcmVjdCBSZWZlcmVuY2UgdG8gYSBTdGF0aWMgTWVtYmVyCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBzdGF0aWMgZmllbGQKLQkgKiAgICBvciBtZXRob2QgaXMgYWNjZXNzZWQgaW4gYW4gaW5kaXJlY3Qgd2F5LiBBIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBtZW1iZXIgc2hvdWxkCi0JICogICAgcHJlZmVyYWJseSBiZSBxdWFsaWZpZWQgd2l0aCBpdHMgZGVjbGFyaW5nIHR5cGUgbmFtZS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3MiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBJbnRlcmZhY2UgTWV0aG9kIG5vdCBDb21wYXRpYmxlIHdpdGggbm9uLUluaGVyaXRlZCBNZXRob2RzCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYW4gaW50ZXJmYWNlCi0JICogICAgZGVmaW5lcyBhIG1ldGhvZCBpbmNvbXBhdGlibGUgd2l0aCBhIG5vbi1pbmhlcml0ZWQgT2JqZWN0IG1ldGhvZC4gVW50aWwgdGhpcyBjb25mbGljdAotCSAqICAgIGlzIHJlc29sdmVkLCBzdWNoIGFuIGludGVyZmFjZSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQsIEZvciBleGFtcGxlLAotCSAqICAgICAgaW50ZXJmYWNlIEkgewotCSAqICAgICAgICAgaW50IGNsb25lKCk7Ci0JICogICAgICB9Ci0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVc2FnZSBvZiBjaGFyW10gRXhwcmVzc2lvbnMgaW4gU3RyaW5nIENvbmNhdGVuYXRpb25zCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBjaGFyW10gZXhwcmVzc2lvbgotCSAqICAgIGlzIHVzZWQgaW4gU3RyaW5nIGNvbmNhdGVuYXRpb25zIChmb3IgZXhhbXBsZSwgImhlbGxvIiArIG5ldyBjaGFyW117J3cnLCdvJywncicsJ2wnLCdkJ30pLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBMb2NhbCBWYXJpYWJsZSBEZWNsYXJhdGlvbiBIaWRpbmcgYW5vdGhlciBWYXJpYWJsZQotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgbG9jYWwgdmFyaWFibGUKLQkgKiAgICBkZWNsYXJhdGlvbiBpcyBoaWRpbmcgc29tZSBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZSAoZWl0aGVyIGxvY2FsbHksIGluaGVyaXRlZCBvciBkZWZpbmVkIGluIGVuY2xvc2luZyB0eXBlKS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEZpZWxkIERlY2xhcmF0aW9uIEhpZGluZyBhbm90aGVyIFZhcmlhYmxlCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBmaWVsZAotCSAqICAgIGRlY2xhcmF0aW9uIGlzIGhpZGluZyBzb21lIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlIChlaXRoZXIgbG9jYWxseSwgaW5oZXJpdGVkIG9yIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGUpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFNwZWNpYWwgUGFyYW1ldGVyIEhpZGluZyBhbm90aGVyIEZpZWxkCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgY2FzZXMgd2hlcmUgYSBjb25zdHJ1Y3RvciBvciBzZXR0ZXIgbWV0aG9kIHBhcmFtZXRlciBkZWNsYXJhdGlvbgotCSAqICAgIGlzIGhpZGluZyBzb21lIGZpZWxkIChlaXRoZXIgbG9jYWxseSwgaW5oZXJpdGVkIG9yIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGUpLgotCSAqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmciLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVHlwZSBEZWNsYXJhdGlvbiBIaWRpbmcgYW5vdGhlciBUeXBlCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgaW4gc2l0dWF0aW9ucyB3aGVyZSBhIHR5cGUgcGFyYW1ldGVyCi0JICogICAgZGVjbGFyYXRpb24gaXMgaGlkaW5nIHNvbWUgdHlwZSwgd2hlbiBhIG5lc3RlZCB0eXBlIGlzIGhpZGluZyBzb21lIHR5cGUgcGFyYW1ldGVyLCBvciB3aGVuCi0JICogICAgYSBuZXN0ZWQgdHlwZSBpcyBoaWRpbmcgYW5vdGhlciBuZXN0ZWQgdHlwZSBkZWZpbmVkIGluIHNhbWUgdW5pdC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBQb3NzaWJsZSBBY2NpZGVudGFsIEJvb2xlYW4gQXNzaWdubWVudAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgYm9vbGVhbiBhc3NpZ25tZW50IGlzIGFjdGluZyBhcyB0aGUgY29uZGl0aW9uCi0JICogICAgb2YgYSBjb250cm9sIHN0YXRlbWVudCAgKHdoZXJlIGl0IHByb2JhYmx5IHdhcyBtZWFudCB0byBiZSBhIGJvb2xlYW4gY29tcGFyaXNvbikuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW5kb2N1bWVudGVkIEVtcHR5IEJsb2NrCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBhbiBlbXB0eSBibG9jayBpcyBkZXRlY3RlZCBhbmQgaXQgaXMgbm90Ci0JICogICAgZG9jdW1lbnRlZCB3aXRoIGFueSBjb21tZW50LgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgRmluYWxseSBCbG9ja3MgTm90IENvbXBsZXRpbmcgTm9ybWFsbHkKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGEgZmluYWxseSBibG9jayBkb2VzIG5vdCBjb21wbGV0ZSBub3JtYWxseS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBEZWNsYXJlZCBUaHJvd24gRXhjZXB0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBhIG1ldGhvZCBvciBhIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmluZyBhCi0JICogICAgdGhyb3duIGNoZWNrZWQgZXhjZXB0aW9uLCBidXQgbmV2ZXIgYWN0dWFsbHkgcmFpc2VzIGl0IGluIGl0cyBib2R5LgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBEZWNsYXJlZCBUaHJvd24gRXhjZXB0aW9uIGluIE92ZXJyaWRpbmQgTWV0aG9kCi0JICogICAgV2hlbiBkaXNhYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGluY2x1ZGUgb3ZlcnJpZGluZyBtZXRob2RzIGluIGl0cyBkaWFnbm9zaXMgZm9yIHVudXNlZCBkZWNsYXJlZAotCSAqICAgIHRocm93biBleGNlcHRpb25zLgotCSAqICAgIDxicj4KLQkgKiAgICBUaGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gaXMgY29udHJvbGxlZCB3aXRoIG9wdGlvbiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbiIuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmciCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW5xdWFsaWZpZWQgQWNjZXNzIHRvIEZpZWxkCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBhIGZpZWxkIGlzIGFjY2VzcyB3aXRob3V0IGFueSBxdWFsaWZpY2F0aW9uLgotCSAqICAgIEluIG9yZGVyIHRvIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSwgaXQgc2hvdWxkIGJlIHF1YWxpZmllZCwgZS5nLiAneCcgc2hvdWxkIHJhdGhlciBiZSB3cml0dGVuICd0aGlzLngnLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW5jaGVja2VkIFR5cGUgT3BlcmF0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYW4gb3BlcmF0aW9uIGludm9sdmVzIGdlbmVyaWMgdHlwZXMsIGFuZCBwb3RlbnRpYWxseQotCSAqICAgIGludmFsaWRhdGVzIHR5cGUgc2FmZXR5IHNpbmNlIGludm9sdmluZyByYXcgdHlwZXMgKGUuZy4gaW52b2tpbmcgI2ZvbyhYJmx0O1N0cmluZyZndDspIHdpdGggYXJndW1lbnRzICAoWCkpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFJhdyBUeXBlIFJlZmVyZW5jZQotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gZGV0ZWN0aW5nIHJlZmVyZW5jZXMgdG8gcmF3IHR5cGVzLiBSYXcgdHlwZXMgYXJlCi0JICogICAgZGlzY291cmFnZWQsIGFuZCBhcmUgaW50ZW5kZWQgdG8gaGVscCBpbnRlcmZhY2luZyB3aXRoIGxlZ2FjeSBjb2RlLiBJbiB0aGUgZnV0dXJlLCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBtYXkKLQkgKiAgICByZWplY3QgcmF3IHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBmaW5hbCBCb3VuZCBmb3IgVHlwZSBQYXJhbWV0ZXIKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiAgICBib3VuZCBjb3JyZXNwb25kaW5nIHRvIGEgZmluYWwgdHlwZTsgc2luY2UgZmluYWwgdHlwZXMgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQsIHRoZSBwYXJhbWV0ZXIgaXMgcHJldHR5IHVzZWxlc3MuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgTWlzc2luZyBEZWNsYXJhdGlvbiBvZiBzZXJpYWxWZXJzaW9uVUlEIEZpZWxkIG9uIFNlcmlhbGl6YWJsZSBDbGFzcwotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgc2VyaWFsaXphYmxlIGNsYXNzIGlzIG1pc3NpbmcgYSBsb2NhbCBkZWNsYXJhdGlvbgotCSAqICAgIG9mIGEgc2VyaWFsVmVyc2lvblVJRCBmaWVsZC4gVGhpcyBmaWVsZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHN0YXRpYyBmaW5hbCBhbmQgYmUgb2YgdHlwZSBsb25nLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbiIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBWYXJhcmdzIEFyZ3VtZW50IE5lZWRpbmcgYSBDYXN0IGluIE1ldGhvZC9Db25zdHJ1Y3RvciBJbnZvY2F0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSB2YXJhcmdzIGFyZ3VtZW50cyBzaG91bGQgYmUgY2FzdAotCSAqICAgIHdoZW4gcGFzc2VkIHRvIGEgbWV0aG9kL2NvbnN0cnVjdG9yIGludm9jYXRpb24uIChlLmcuIENsYXNzLmdldE1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3MgLi4uIGFyZ3MgKQotCSAqICAgIGludm9rZWQgd2l0aCBhcmd1bWVudHMgKCJmb28iLCBudWxsKSkuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE51bGwgRGVyZWZlcmVuY2UKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhCi0JICogICAgdmFyaWFibGUgdGhhdCBpcyBzdGF0aWNhbGx5IGtub3duIHRvIGhvbGQgYSBudWxsIHZhbHVlIGlzIHVzZWQgdG8KLQkgKiAgICBhY2Nlc3MgYSBmaWVsZCBvciBtZXRob2QuCi0JICoKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFBvdGVudGlhbCBOdWxsIERlcmVmZXJlbmNlCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYQotCSAqICAgIHZhcmlhYmxlIHRoYXQgaGFzIGZvcm1lcmx5IGJlZW4gdGVzdGVkIGFnYWluc3QgbnVsbCBidXQgaXMgbm90IChubyBtb3JlKQotCSAqICAgIHN0YXRpY2FsbHkga25vd24gdG8gaG9sZCBhIG5vbi1udWxsIHZhbHVlIGlzIHVzZWQgdG8gYWNjZXNzIGEgZmllbGQgb3IKLQkgKiAgICBtZXRob2QuCi0JICoKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFJlZHVuZGFudCBOdWxsIENoZWNrCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYQotCSAqICAgIHZhcmlhYmxlIHRoYXQgaXMgc3RhdGljYWxseSBrbm93biB0byBob2xkIGEgbnVsbCBvciBhIG5vbi1udWxsIHZhbHVlCi0JICogICAgaXMgdGVzdGVkIGFnYWluc3QgbnVsbC4KLQkgKgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2siCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVc2Ugb2YgQW5ub3RhdGlvbiBUeXBlIGFzIFN1cGVyIEludGVyZmFjZQotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIGFubm90YXRpb24gdHlwZSBpcyB1c2VkCi0JICogICAgYXMgYSBzdXBlci1pbnRlcmZhY2UuIFRob3VnaCBsZWdhbCwgdGhpcyBpcyBkaXNjb3VyYWdlZC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE1pc3NpbmcgQE92ZXJyaWRlIEFubm90YXRpb24KLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBlbmNvdW50ZXJpbmcgYSBtZXRob2QKLQkgKiAgICBkZWNsYXJhdGlvbiB3aGljaCBvdmVycmlkZXMgYSBzdXBlcmNsYXNzIG1ldGhvZCBidXQgaGFzIG5vIEBPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb24iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBNaXNzaW5nIEBEZXByZWNhdGVkIEFubm90YXRpb24KLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBlbmNvdW50ZXJpbmcgYSBkZWNsYXJhdGlvbgotCSAqICAgIGNhcnJ5aW5nIGEgQGRlcHJlY2F0ZWQgZG9jIHRhZyBidXQgaGF2aW5nIG5vIGNvcnJlc3BvbmRpbmcgQERlcHJlY2F0ZWQgYW5ub3RhdGlvbi4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb24iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBJbmNvbXBsZXRlIEVudW0gU3dpdGNoCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIKLQkgKiAgICBhbiBlbnVtIGNvbnN0YW50IGhhcyBubyBjb3JyZXNwb25kaW5nIGNhc2UgbGFiZWwgaW4gYW4gZW51bSBzd2l0Y2gKLQkgKiAgICBzdGF0ZW1lbnQuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2giCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBCb3hpbmcvVW5ib3hpbmcgQ29udmVyc2lvbgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgYm94aW5nIG9yIGFuIHVuYm94aW5nCi0JICogICAgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmciCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBJbnZhbGlkIEphdmFkb2MgQ29tbWVudAotCSAqICAgIFRoaXMgaXMgdGhlIGdlbmVyaWMgY29udHJvbCBmb3IgdGhlIHNldmVyaXR5IG9mIEphdmFkb2MgcHJvYmxlbXMuCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIGEgcHJvYmxlbSBpbiBKYXZhZG9jLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gVmlzaWJpbGl0eSBMZXZlbCBGb3IgSW52YWxpZCBKYXZhZG9jIFRhZ3MKLQkgKiAgICBTZXQgdGhlIG1pbmltdW0gdmlzaWJpbGl0eSBsZXZlbCBmb3IgSmF2YWRvYyB0YWcgcHJvYmxlbXMuIEJlbG93IHRoaXMgbGV2ZWwgcHJvYmxlbXMgd2lsbCBiZSBpZ25vcmVkLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgImRlZmF1bHQiLCAicHJpdmF0ZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAicHVibGljIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgSW52YWxpZCBKYXZhZG9jIFRhZ3MKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1bmJvdW5kIG9yIHVuZXhwZWN0ZWQgcmVmZXJlbmNlIHRhZ3MgaW4gSmF2YWRvYy4KLQkgKiAgICBBICd0aHJvd3MnIHRhZyByZWZlcmVuY2luZyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiB3b3VsZCBiZSBjb25zaWRlcmVkIGFzIHVuZXhwZWN0ZWQuCi0JICogICAgPGJyPk5vdGUgdGhhdCB0aGlzIGRpYWdub3NpcyBjYW4gYmUgZW5hYmxlZCBiYXNlZCBvbiB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY29uc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSmF2YWRvYzsKLQkgKiAgICBhbHNvIHNlZSB0aGUgc2V0dGluZyAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5Ii4KLQkgKiAgICA8YnI+Ci0JICogICAgVGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2MiLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3MiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImRpc2FibGVkIiwgImVuYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgSW52YWxpZCBKYXZhZG9jIFRhZ3Mgd2l0aCBEZXByZWNhdGVkIFJlZmVyZW5jZXMKLQkgKiAgICBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGRlcHJlY2F0ZWQgcmVmZXJlbmNlcyB1c2VkIGluIEphdmFkb2MgdGFncy4KLQkgKiAgICA8YnI+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOwotCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHkiLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEludmFsaWQgSmF2YWRvYyBUYWdzIHdpdGggTm90IFZpc2libGUgUmVmZXJlbmNlcwotCSAqICAgIFNwZWNpZnkgd2hldGhlciB0aGUgY29tcGlsZXIgd2lsbCByZXBvcnQgbm9uLXZpc2libGUgcmVmZXJlbmNlcyB1c2VkIGluIEphdmFkb2MgdGFncy4KLQkgKiAgICA8YnI+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOwotCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHkiLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBUYWdzCi0JICogICAgVGhpcyBpcyB0aGUgZ2VuZXJpYyBjb250cm9sIGZvciB0aGUgc2V2ZXJpdHkgb2YgSmF2YWRvYyBtaXNzaW5nIHRhZyBwcm9ibGVtcy4KLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIHRhZ3MgYXJlIG1pc3NpbmcgaW4gSmF2YWRvYyBjb21tZW50cy4KLQkgKiAgICA8YnI+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKYXZhZG9jOwotCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHkiLgotCSAqICAgIDxicj4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQ09NUElMRVIgLyBWaXNpYmlsaXR5IExldmVsIEZvciBNaXNzaW5nIEphdmFkb2MgVGFncwotCSAqICAgIFNldCB0aGUgbWluaW11bSB2aXNpYmlsaXR5IGxldmVsIGZvciBKYXZhZG9jIG1pc3NpbmcgdGFnIHByb2JsZW1zLiBCZWxvdyB0aGlzIGxldmVsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAicHVibGljIiwgInByb3RlY3RlZCIsICJkZWZhdWx0IiwgInByaXZhdGUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgInB1YmxpYyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBUYWdzIG9uIE92ZXJyaWRpbmcgTWV0aG9kcwotCSAqICAgIFNwZWNpZnkgd2hldGhlciB0aGUgY29tcGlsZXIgd2lsbCB2ZXJpZnkgb3ZlcnJpZGluZyBtZXRob2RzIGluIG9yZGVyIHRvIHJlcG9ydCBKYXZhZG9jIG1pc3NpbmcgdGFnIHByb2JsZW1zLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBDb21tZW50cwotCSAqICAgIFRoaXMgaXMgdGhlIGdlbmVyaWMgY29udHJvbCBmb3IgdGhlIHNldmVyaXR5IG9mIG1pc3NpbmcgSmF2YWRvYyBjb21tZW50IHByb2JsZW1zLgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gSmF2YWRvYyBjb21tZW50cyBhcmUgbWlzc2luZy4KLQkgKiAgICA8YnI+Tm90ZSB0aGF0IHRoaXMgZGlhZ25vc2lzIGNhbiBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb25zdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBlY3RlZCBKYXZhZG9jOwotCSAqICAgIGFsc28gc2VlIHRoZSBzZXR0aW5nICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5Ii4KLQkgKiAgICA8YnI+Ci0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHMiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFZpc2liaWxpdHkgTGV2ZWwgRm9yIE1pc3NpbmcgSmF2YWRvYyBDb21tZW50cwotCSAqICAgIFNldCB0aGUgbWluaW11bSB2aXNpYmlsaXR5IGxldmVsIGZvciBtaXNzaW5nIEphdmFkb2MgcHJvYmxlbXMuIEJlbG93IHRoaXMgbGV2ZWwgcHJvYmxlbXMgd2lsbCBiZSBpZ25vcmVkLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAicHVibGljIiwgInByb3RlY3RlZCIsICJkZWZhdWx0IiwgInByaXZhdGUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgInB1YmxpYyIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE1pc3NpbmcgSmF2YWRvYyBDb21tZW50cyBvbiBPdmVycmlkaW5nIE1ldGhvZHMKLQkgKiAgICBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHdpbGwgdmVyaWZ5IG92ZXJyaWRpbmcgbWV0aG9kcyBpbiBvcmRlciB0byByZXBvcnQgbWlzc2luZyBKYXZhZG9jIGNvbW1lbnQgcHJvYmxlbXMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gTWF4aW11bSBOdW1iZXIgb2YgUHJvYmxlbXMgUmVwb3J0ZWQgcGVyIENvbXBpbGF0aW9uIFVuaXQKLQkgKiAgICBTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBvbiBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CSImbHQ7biZndDsiIHdoZXJlICZsdDtuJmd0OyBpcyB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlciAoaWYgemVybyB0aGVuIGFsbCBwcm9ibGVtcyBhcmUgcmVwb3J0ZWQpLgotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiMTAwIgotCSAqCi0JICogQ09NUElMRVIgLyBUcmVhdGluZyBPcHRpb25hbCBFcnJvciBhcyBGYXRhbAotCSAqICAgIFdoZW4gZW5hYmxlZCwgb3B0aW9uYWwgZXJyb3JzIChpLmUuIG9wdGlvbmFsIHByb2JsZW1zIHdoaWNoIHNldmVyaXR5IGlzIHNldCB0byAiZXJyb3IiKSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RhbmRhcmQKLQkgKiAgICBjb21waWxlciBlcnJvcnMsIHlpZWxkaW5nIHByb2JsZW0gbWV0aG9kcy90eXBlcyBwcmV2ZW50aW5nIGZyb20gcnVubmluZyBvZmZlbmRpbmcgY29kZSB1bnRpbCB0aGUgaXNzdWUgZ290IHJlc29sdmVkLgotCSAqICAgIFdoZW4gZGlzYWJsZWQsIG9wdGlvbmFsIGVycm9ycyBhcmUgb25seSBjb25zaWRlcmVkIGFzIHdhcm5pbmdzLCBzdGlsbCBjYXJyeWluZyBhbiBlcnJvciBpbmRpY2F0aW9uIHRvIG1ha2UgdGhlbSBtb3JlCi0JICogICAgc2V2ZXJlLiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgZXJyb3JzIGFyZSBmYXRhbCwgd2hldGhlciB0aGV5IGFyZSBvcHRpb25hbCBvciBub3QuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZW5hYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gRGVmaW5pbmcgdGhlIEF1dG9tYXRpYyBUYXNrIFRhZ3MKLQkgKiAgICBXaGVuIHRoZSB0YWcgbGlzdCBpcyBub3QgZW1wdHksIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGEgdGFzayBtYXJrZXIgd2hlbmV2ZXIgaXQgZW5jb3VudGVycwotCSAqICAgIG9uZSBvZiB0aGUgY29ycmVzcG9uZGluZyB0YWdzIGluc2lkZSBhbnkgY29tbWVudCBpbiBKYXZhIHNvdXJjZSBjb2RlLgotCSAqICAgIEdlbmVyYXRlZCB0YXNrIG1lc3NhZ2VzIHdpbGwgc3RhcnQgd2l0aCB0aGUgdGFnLCBhbmQgcmFuZ2UgdW50aWwgdGhlIG5leHQgbGluZSBzZXBhcmF0b3IsCi0JICogICAgY29tbWVudCBlbmRpbmcsIG9yIHRhZy4KLQkgKiAgICBXaGVuIGEgZ2l2ZW4gbGluZSBvZiBjb2RlIGJlYXJzIG11bHRpcGxlIHRhZ3MsIGVhY2ggdGFnIHdpbGwgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseS4KLQkgKiAgICBNb3Jlb3ZlciwgYSB0YWcgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciB0YWcgd2lsbCBiZSByZXBvcnRlZCB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlCi0JICogICAgbmV4dCBub24tZW1wdHkgdGFnIG9mIHRoZSBsaW5lLCBpZiBhbnkuCi0JICogICAgTm90ZSB0aGF0IHRhc2tzIG1lc3NhZ2VzIGFyZSB0cmltbWVkLiBJZiBhIHRhZyBpcyBzdGFydGluZyB3aXRoIGEgbGV0dGVyIG9yIGRpZ2l0LCB0aGVuIGl0IGNhbm5vdCBiZSBsZWFkZWQgYnkKLQkgKiAgICBhbm90aGVyIGxldHRlciBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkICgiZm9vVG9EbyIgd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcyBhIHRhc2sgZm9yIHRhZyAiVG9EbyIsIGJ1dCAiZm9vI1RvRG8iCi0JICogICAgd2lsbCBiZSBkZXRlY3RlZCBmb3IgZWl0aGVyIHRhZyAiVG9EbyIgb3IgIiNUb0RvIikuIFJlc3BlY3RpdmVseSwgYSB0YWcgZW5kaW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgY2Fubm90IGJlIGZvbGxvd2VkCi0JICogICAgYnkgYSBsZXR0ZXIgb3IgZGlnaXQgdG8gYmUgcmVjb2duaXplZCAoIlRvRG9mb28iIHdpbGwgbm90IGJlIHJlY29nbml6ZWQgYXMgYSB0YXNrIGZvciB0YWcgIlRvRG8iLCBidXQgIlRvRG86Zm9vIiB3aWxsCi0JICogICAgYmUgZGV0ZWN0ZWQgZWl0aGVyIGZvciB0YWcgIlRvRG8iIG9yICJUb0RvOiIpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1RhZ3MiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIiZsdDt0YWcmZ3Q7WywmbHQ7dGFnJmd0O10qIiB9IHdoZXJlICZsdDt0YWcmZ3Q7IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZCBvciBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcwotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiVE9ETyxGSVhNRSxYWFgiCi0JICoKLQkgKiBDT01QSUxFUiAvIERlZmluaW5nIHRoZSBBdXRvbWF0aWMgVGFzayBQcmlvcml0aWVzCi0JICogICAgSW4gcGFyYWxsZWwgd2l0aCB0aGUgQXV0b21hdGljIFRhc2sgVGFncywgdGhpcyBsaXN0IGRlZmluZXMgdGhlIHByaW9yaXRpZXMgKGhpZ2gsIG5vcm1hbCBvciBsb3cpCi0JICogICAgb2YgdGhlIHRhc2sgbWFya2VycyBpc3N1ZWQgYnkgdGhlIGNvbXBpbGVyLgotCSAqICAgIElmIHRoZSBkZWZhdWx0IGlzIHNwZWNpZmllZCwgdGhlIHByaW9yaXR5IG9mIGVhY2ggdGFzayBtYXJrZXIgaXMgIk5PUk1BTCIuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrUHJpb3JpdGllcyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiJmx0O3ByaW9yaXR5Jmd0O1ssJmx0O3ByaW9yaXR5Jmd0O10qIiB9IHdoZXJlICZsdDtwcmlvcml0eSZndDsgaXMgb25lIG9mICJISUdIIiwgIk5PUk1BTCIgb3IgIkxPVyIKLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIk5PUk1BTCxISUdILE5PUk1BTCIKLQkgKgotCSAqIENPTVBJTEVSIC8gRGV0ZXJtaW5pbmcgd2hldGhlciB0YXNrIHRhZ3MgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogICAgV2hlbiBlbmFibGVkLCB0YXNrIHRhZ3MgYXJlIGNvbnNpZGVyZWQgaW4gYSBjYXNlLXNlbnNpdGl2ZSB3YXkuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrQ2FzZVNlbnNpdGl2ZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZW5hYmxlZCIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEZvcmJpZGRlbiBSZWZlcmVuY2UgdG8gVHlwZSB3aXRoIFJlc3RyaWN0ZWQgQWNjZXNzCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiByZWZlcnJpbmcgdG8gYSB0eXBlIHRoYXQgaXMgbm9uIGFjY2Vzc2libGUsIGFzIGRlZmluZWQgYWNjb3JkaW5nCi0JICogICAgdG8gdGhlIGFjY2VzcyBydWxlIHNwZWNpZmljYXRpb25zLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2UiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgRGlzY291cmFnZWQgUmVmZXJlbmNlIHRvIFR5cGUgd2l0aCBSZXN0cmljdGVkIEFjY2VzcwotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gcmVmZXJyaW5nIHRvIGEgdHlwZSB3aXRoIGRpc2NvdXJhZ2VkIGFjY2VzcywgYXMgZGVmaW5lZCBhY2NvcmRpbmcKLQkgKiAgICB0byB0aGUgYWNjZXNzIHJ1bGUgc3BlY2lmaWNhdGlvbnMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIENPTVBJTEVSIC8gRGV0ZXJtaW5pbmcgRWZmZWN0IG9mIEBTdXBwcmVzc1dhcm5pbmdzCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgQFN1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgotCSAqICAgIFdoZW4gZGlzYWJsZWQsIGFsbCBAU3VwcmVzc1dhcm5pbmdzIGFubm90YXRpb25zIGFyZSBpZ25vcmVkOyBpLmUuLCB3YXJuaW5ncyBhcmUgcmVwb3J0ZWQuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3MiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVuYWJsZWQiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbmhhbmRsZWQgV2FybmluZyBUb2tlbiBmb3IgQFN1cHByZXNzV2FybmluZ3MKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuIGVuY291bnRlcmluZyBhIHRva2VuCi0JICogICAgaXQgY2Fubm90IGhhbmRsZSBpbnNpZGUgYSBAU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW4iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgotCSAqCi0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW5yZWZlcmVuY2VkIExhYmVsCi0JICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbiBlbmNvdW50ZXJpbmcgYSBsYWJlbGVkIHN0YXRlbWVudCB3aGljaCBsYWJlbAotCSAqICAgIGlzIG5ldmVyIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gQSBsYWJlbCBpcyBjb25zaWRlcmVkIHRvIGJlIHJlZmVyZW5jZWQgaWYgaXRzIG5hbWUgZXhwbGljaXRseSBhcHBlYXJzIGJlaGluZCBhIGJyZWFrCi0JICogICAgb3IgY29udGludWUgc3RhdGVtZW50OyBmb3IgaW5zdGFuY2UgdGhlIGZvbGxvd2luZyBsYWJlbCB3b3VsZCBiZSBjb25zaWRlcmVkIHVucmVmZXJlbmNlZDsgICBMQUJFTDogeyBicmVhazsgfQotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBQYXJhbWV0ZXIgQXNzaWdubWVudAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgcGFyYW1ldGVyIGlzCi0JICogICAgYXNzaWduZWQgdG8uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBTd2l0Y2ggRmFsbC1UaHJvdWdoIENhc2UKLQkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIGNhc2UgbWF5IGJlCi0JICogICAgZW50ZXJlZCBieSBmYWxsaW5nIHRocm91Z2ggcHJldmlvdXMgY2FzZS4gRW1wdHkgY2FzZXMgYXJlIGFsbG93ZWQuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIE92ZXJyaWRpbmcgbWV0aG9kIHRoYXQgZG9lc24ndCBjYWxsIHRoZSBzdXBlciBtZXRob2QgaW52b2NhdGlvbgotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgbWV0aG9kIGlzIG92ZXJyaWRpbmcgYSBtZXRob2Qgd2l0aG91dCBjYWxsaW5nCi0JICogICAgdGhlIHN1cGVyIGludm9jYXRpb24uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdNZXRob2RXaXRob3V0U3VwZXJJbnZvY2F0aW9uIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogQlVJTERFUiAvIFNwZWNpZnlpbmcgRmlsdGVycyBmb3IgUmVzb3VyY2UgQ29weWluZyBDb250cm9sCi0JICogICAgQWxsb3cgdG8gc3BlY2lmeSBzb21lIGZpbHRlcnMgdG8gY29udHJvbCB0aGUgcmVzb3VyY2UgY29weSBwcm9jZXNzLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXIiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIiZsdDtuYW1lJmd0O1ssJmx0O25hbWUmZ3Q7XSogfSB3aGVyZSAmbHQ7bmFtZSZndDsgaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAoKiBhbmQgPyB3aWxkLWNhcmRzIGFsbG93ZWQpCi0JICogICAgICAgb3IgdGhlIG5hbWUgb2YgYSBmb2xkZXIgd2hpY2ggZW5kcyB3aXRoICcvJwotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgotCSAqCi0JICogQlVJTERFUiAvIEFib3J0IGlmIEludmFsaWQgQ2xhc3NwYXRoCi0JICogICAgQWxsb3cgdG8gdG9nZ2xlIHRoZSBidWlsZGVyIHRvIGFib3J0IGlmIHRoZSBjbGFzc3BhdGggaXMgaW52YWxpZAotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJhYm9ydCIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImFib3J0IgotCSAqCi0JICogQlVJTERFUiAvIENsZWFuaW5nIE91dHB1dCBGb2xkZXIocykKLQkgKiAgICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBKYXZhQnVpbGRlciBpcyBhbGxvd2VkIHRvIGNsZWFuIHRoZSBvdXRwdXQgZm9sZGVycwotCSAqICAgIHdoZW4gcGVyZm9ybWluZyBmdWxsIGJ1aWxkIG9wZXJhdGlvbnMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJjbGVhbiIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImNsZWFuIgotCSAqCi0JICogQlVJTERFUiAvIFJlY3JlYXRlIE1vZGlmaWVkIGNsYXNzIGZpbGVzIGluIE91dHB1dCBGb2xkZXIKLQkgKiAgICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBKYXZhQnVpbGRlciBzaG91bGQgY2hlY2sgZm9yIGFueSBjaGFuZ2VzIHRvIC5jbGFzcyBmaWxlcwotCSAqICAgIGluIHRoZSBvdXRwdXQgZm9sZGVycyB3aGlsZSBwZXJmb3JtaW5nIGluY3JlbWVudGFsIGJ1aWxkIG9wZXJhdGlvbnMuIElmIGNoYW5nZXMKLQkgKiAgICBhcmUgZGV0ZWN0ZWQgdG8gbWFuYWdlZCAuY2xhc3MgZmlsZXMsIHRoZW4gYSBmdWxsIGJ1aWxkIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlCi0JICogICAgdGhlIGNoYW5nZXMgYXJlIGxlZnQgYXMgaXMuIFRvb2xzIGZ1cnRoZXIgYWx0ZXJpbmcgZ2VuZXJhdGVkIC5jbGFzcyBmaWxlcywgbGlrZSBvcHRpbWl6ZXJzLAotCSAqICAgIHNob3VsZCBlbnN1cmUgdGhpcyBvcHRpb24gcmVtYWlucyBzZXQgaW4gaXRzIGRlZmF1bHQgc3RhdGUgb2YgaWdub3JlLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXIiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiaWdub3JlIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCi0JICoKLQkgKiBCVUlMREVSIC8gUmVwb3J0aW5nIER1cGxpY2F0ZSBSZXNvdXJjZXMKLQkgKiAgICBJbmRpY2F0ZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gcmVwb3J0ZWQgd2hlbiBtb3JlIHRoYW4gb25lIG9jY3VycmVuY2UKLQkgKiAgICBvZiBhIHJlc291cmNlIGlzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgbG9jYXRpb24uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzayIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKLQkgKgotCSAqIEpBVkFDT1JFIC8gQ29tcHV0aW5nIFByb2plY3QgQnVpbGQgT3JkZXIKLQkgKiAgICBJbmRpY2F0ZSB3aGV0aGVyIEphdmFDb3JlIHNob3VsZCBlbmZvcmNlIHRoZSBwcm9qZWN0IGJ1aWxkIG9yZGVyIHRvIGJlIGJhc2VkIG9uCi0JICogICAgdGhlIGNsYXNzcGF0aCBwcmVyZXF1aXNpdGUgY2hhaW4uIFdoZW4gcmVxdWVzdGluZyB0byBjb21wdXRlLCB0aGlzIHRha2VzIG92ZXIKLQkgKiAgICB0aGUgcGxhdGZvcm0gZGVmYXVsdCBvcmRlciAoYmFzZWQgb24gcHJvamVjdCByZWZlcmVuY2VzKS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXB1dGVKYXZhQnVpbGRPcmRlciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiY29tcHV0ZSIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKLQkgKgotCSAqIEpBVkFDT1JFIC8gRGVmYXVsdCBTb3VyY2UgRW5jb2RpbmcgRm9ybWF0Ci0JICogICAgR2V0IHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBvZiBzb3VyY2UgZmlsZXMuIFRoaXMgdmFsdWUgaXMKLQkgKiAgICBpbW11dGFibGUgYW5kIHByZXNldCB0byB0aGUgcmVzdWx0IG9mIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpLgotCSAqICAgIEl0IGlzIG9mZmVyZWQgYXMgYSBjb252ZW5pZW5jZSBzaG9ydGN1dCBvbmx5LgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZW5jb2RpbmciCi0JICogICAgIC0gdmFsdWU6ICAgICAgICAgICAmbHQ7aW1tdXRhYmxlLCBwbGF0Zm9ybSBkZWZhdWx0IHZhbHVlJmd0OwotCSAqCi0JICogSkFWQUNPUkUgLyBSZXBvcnRpbmcgSW5jb21wbGV0ZSBDbGFzc3BhdGgKLQkgKiAgICBJbmRpY2F0ZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gcmVwb3J0ZWQgd2hlbiBhbiBlbnRyeSBvbiB0aGUgY2xhc3NwYXRoIGRvZXMgbm90IGV4aXN0LAotCSAqICAgIGlzIG5vdCBsZWdpdGUgb3IgaXMgbm90IHZpc2libGUgKGZvciBleGFtcGxlLCBhIHJlZmVyZW5jZWQgcHJvamVjdCBpcyBjbG9zZWQpLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyJ9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlcnJvciIKLQkgKgotCSAqIEpBVkFDT1JFIC8gUmVwb3J0aW5nIENsYXNzcGF0aCBDeWNsZQotCSAqICAgIEluZGljYXRlIHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSByZXBvcnRlZCB3aGVuIGEgcHJvamVjdCBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xlLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGgiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVycm9yIgotCSAqCi0JICogSkFWQUNPUkUgLyBSZXBvcnRpbmcgSW5jb21wYXRpYmxlIEpESyBMZXZlbCBmb3IgUmVxdWlyZWQgQmluYXJpZXMKLQkgKiAgICBJbmRpY2F0ZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gcmVwb3J0ZWQgd2hlbiBhIHByb2plY3QgcHJlcmVxdWlzaXRlcyBhbm90aGVyIHByb2plY3QKLQkgKiAgICBvciBsaWJyYXJ5IHdpdGggYW4gaW5jb21wYXRpYmxlIHRhcmdldCBKREsgbGV2ZWwgKGUuZy4gcHJvamVjdCB0YXJnZXRpbmcgMS4xIHZtLCBidXQgY29tcGlsZWQgYWdhaW5zdCAxLjQgbGlicmFyaWVzKS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgotCSAqCi0JICogSkFWQUNPUkUgLyBFbmFibGluZyBVc2FnZSBvZiBDbGFzc3BhdGggRXhjbHVzaW9uIFBhdHRlcm5zCi0JICogICAgV2hlbiBkaXNhYmxlZCwgbm8gZW50cnkgb24gYSBwcm9qZWN0IGNsYXNzcGF0aCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCi0JICogICAgYW4gZXhjbHVzaW9uIHBhdHRlcm4uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnMiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVuYWJsZWQiCi0JICoKLQkgKiBKQVZBQ09SRSAvIEVuYWJsaW5nIFVzYWdlIG9mIENsYXNzcGF0aCBNdWx0aXBsZSBPdXRwdXQgTG9jYXRpb25zCi0JICogICAgV2hlbiBkaXNhYmxlZCwgbm8gZW50cnkgb24gYSBwcm9qZWN0IGNsYXNzcGF0aCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCi0JICogICAgYSBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24sIHByZXZlbnRpbmcgdGh1cyB1c2FnZSBvZiBtdWx0aXBsZSBvdXRwdXQgbG9jYXRpb25zLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgotCSAqCi0JICogSkFWQUNPUkUgLyBTZXQgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBuYW1lcyBmcm9tIGphdmFkb2MKLQkgKiAgICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byByZXRyaWV2ZSB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyIG5hbWVzIGZyb20gamF2YWRvYy4KLQkgKiAgICBJZiB0aGUgdmFsdWUgaXMgMCwgdGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm90IGZldGNoZWQgYW5kIHRoZSByYXcgbmFtZXMgYXJlIHJldHVybmVkLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUudGltZW91dEZvclBhcmFtZXRlck5hbWVGcm9tQXR0YWNoZWRKYXZhZG9jIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJIiZsdDtuJmd0OyIsIHdoZXJlIG4gaXMgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMAotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiNTAiCi0JICoKLQkgKiBERVBSRUNBVEVEIFNFRSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnM6IEZPUk1BVFRFUiAvIEluc2VydGluZyBOZXcgTGluZSBCZWZvcmUgT3BlbmluZyBCcmFjZQotCSAqICAgIFdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJlZm9yZSBhbiBvcGVuaW5nIGJyYWNlLCBvdGhlcndpc2Ugbm90aGluZwotCSAqICAgIGlzIGluc2VydGVkCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5vcGVuaW5nQnJhY2UiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkbyBub3QgaW5zZXJ0IgotCSAqCi0JICogREVQUkVDQVRFRCBTRUUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zOiBGT1JNQVRURVIgLyBJbnNlcnRpbmcgTmV3IExpbmUgSW5zaWRlIENvbnRyb2wgU3RhdGVtZW50Ci0JICogICAgV2hlbiBJbnNlcnQsIGEgbmV3IGxpbmUgaXMgaW5zZXJ0ZWQgYmV0d2VlbiB9IGFuZCBmb2xsb3dpbmcgZWxzZSwgY2F0Y2gsIGZpbmFsbHkKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmNvbnRyb2xTdGF0ZW1lbnQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkbyBub3QgaW5zZXJ0IgotCSAqCi0JICogREVQUkVDQVRFRCBTRUUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zOiBDbGVhcmluZyBCbGFuayBMaW5lcwotCSAqICAgIFdoZW4gQ2xlYXIgYWxsLCBhbGwgYmxhbmsgbGluZXMgYXJlIHJlbW92ZWQuIFdoZW4gUHJlc2VydmUgb25lLCBvbmx5IG9uZSBpcyBrZXB0Ci0JICogICAgYW5kIGFsbCBvdGhlcnMgcmVtb3ZlZC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmNsZWFyQWxsIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJjbGVhciBhbGwiLCAicHJlc2VydmUgb25lIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJwcmVzZXJ2ZSBvbmUiCi0JICoKLQkgKiBERVBSRUNBVEVEIFNFRSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnM6IEluc2VydGluZyBOZXcgTGluZSBCZXR3ZWVuIEVsc2UvSWYKLQkgKiAgICBXaGVuIEluc2VydCwgYSBibGFuayBsaW5lIGlzIGluc2VydGVkIGJldHdlZW4gYW4gZWxzZSBhbmQgYW4gaWYgd2hlbiB0aGV5IGFyZQotCSAqICAgIGNvbnRpZ3VvdXMuIFdoZW4gY2hvb3NpbmcgdG8gbm90IGluc2VydCwgZWxzZS1pZiB3aWxsIGJlIGtlcHQgb24gdGhlIHNhbWUKLQkgKiAgICBsaW5lIHdoZW4gcG9zc2libGUuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5lbHNlSWYiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkbyBub3QgaW5zZXJ0IgotCSAqCi0JICogREVQUkVDQVRFRCBTRUUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zOiBJbnNlcnRpbmcgTmV3IExpbmUgSW4gRW1wdHkgQmxvY2sKLQkgKiAgICBXaGVuIGluc2VydCwgYSBsaW5lIGJyZWFrIGlzIGluc2VydGVkIGJldHdlZW4gY29udGlndW91cyB7IGFuZCB9LCBpZiB9IGlzIG5vdCBmb2xsb3dlZAotCSAqICAgIGJ5IGEga2V5d29yZC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmVtcHR5QmxvY2siCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpbnNlcnQiCi0JICoKLQkgKiBERVBSRUNBVEVEIFNFRSBEZWZhdWx0Q29kZUZvcm1hdHRlck9wdGlvbnM6IFNwbGl0dGluZyBMaW5lcyBFeGNlZWRpbmcgTGVuZ3RoCi0JICogICAgRW5hYmxlIHNwbGl0dGluZyBvZiBsb25nIGxpbmVzIChleGNlZWRpbmcgdGhlIGNvbmZpZ3VyYWJsZSBsZW5ndGgpLiBMZW5ndGggb2YgMCB3aWxsCi0JICogICAgZGlzYWJsZSBsaW5lIHNwbGl0dGluZwotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CSImbHQ7biZndDsiLCB3aGVyZSBuIGlzIHplcm8gb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyCi0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICI4MCIKLQkgKgotCSAqIERFUFJFQ0FURUQgU0VFIERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9uczogQ29tcGFjdGluZyBBc3NpZ25tZW50Ci0JICogICAgQXNzaWdubWVudHMgY2FuIGJlIGZvcm1hdHRlZCBhc3ltbWV0cmljYWxseSwgZm9yIGV4YW1wbGUgJ2ludCB4PSAyOycsIHdoZW4gTm9ybWFsLCBhIHNwYWNlCi0JICogICAgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuc3R5bGUuYXNzaWdubWVudCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiY29tcGFjdCIsICJub3JtYWwiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIm5vcm1hbCIKLQkgKgotCSAqIERFUFJFQ0FURUQgU0VFIERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9uczogRGVmaW5pbmcgSW5kZW50YXRpb24gQ2hhcmFjdGVyCi0JICogICAgRWl0aGVyIGNob29zZSB0byBpbmRlbnQgd2l0aCB0YWIgY2hhcmFjdGVycyBvciBzcGFjZXMKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgInRhYiIsICJzcGFjZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAidGFiIgotCSAqCi0JICogREVQUkVDQVRFRCBTRUUgRGVmYXVsdENvZGVGb3JtYXR0ZXJPcHRpb25zOiBEZWZpbmluZyBTcGFjZSBJbmRlbnRhdGlvbiBMZW5ndGgKLQkgKiAgICBXaGVuIHVzaW5nIHNwYWNlcywgc2V0IHRoZSBhbW91bnQgb2Ygc3BhY2UgY2hhcmFjdGVycyB0byB1c2UgZm9yIGVhY2gKLQkgKiAgICBpbmRlbnRhdGlvbiBtYXJrLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CSImbHQ7biZndDsiLCB3aGVyZSBuIGlzIGEgcG9zaXRpdmUgaW50ZWdlcgotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiNCIKLQkgKgotCSAqIERFUFJFQ0FURUQgU0VFIERlZmF1bHRDb2RlRm9ybWF0dGVyT3B0aW9uczogSW5zZXJ0aW5nIHNwYWNlIGluIGNhc3QgZXhwcmVzc2lvbgotCSAqICAgIFdoZW4gSW5zZXJ0LCBhIHNwYWNlIGlzIGFkZGVkIGJldHdlZW4gdGhlIHR5cGUgYW5kIHRoZSBleHByZXNzaW9uIGluIGEgY2FzdCBleHByZXNzaW9uLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnNwYWNlLmNhc3RleHByZXNzaW9uIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJpbnNlcnQiLCAiZG8gbm90IGluc2VydCIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaW5zZXJ0IgotCSAqCi0JICogQ09ERUFTU0lTVCAvIEFjdGl2YXRlIFZpc2liaWxpdHkgU2Vuc2l0aXZlIENvbXBsZXRpb24KLQkgKiAgICBXaGVuIGFjdGl2ZSwgY29tcGxldGlvbiBkb2Vzbid0IHNob3cgdGhhdCB5b3UgY2FuIG5vdCBzZWUKLQkgKiAgICAoZm9yIGV4YW1wbGUsIHlvdSBjYW4gbm90IHNlZSBwcml2YXRlIG1ldGhvZHMgb2YgYSBzdXBlciBjbGFzcykuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBBY3RpdmF0ZSBEZXByZWNhdGlvbiBTZW5zaXRpdmUgQ29tcGxldGlvbgotCSAqICAgIFdoZW4gZW5hYmxlZCwgY29tcGxldGlvbiBkb2Vzbid0IHByb3Bvc2UgZGVwcmVjYXRlZCBtZW1iZXJzIGFuZCB0eXBlcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5kZXByZWNhdGlvbkNoZWNrIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBBdXRvbWF0aWMgUXVhbGlmaWNhdGlvbiBvZiBJbXBsaWNpdCBNZW1iZXJzCi0JICogICAgV2hlbiBhY3RpdmUsIGNvbXBsZXRpb24gYXV0b21hdGljYWxseSBxdWFsaWZpZXMgY29tcGxldGlvbiBvbiBpbXBsaWNpdAotCSAqICAgIGZpZWxkIHJlZmVyZW5jZXMgYW5kIG1lc3NhZ2UgZXhwcmVzc2lvbnMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgotCSAqCi0JICogQ09ERUFTU0lTVCAvIERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIEZpZWxkIE5hbWUKLQkgKiAgICBXaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGZpZWxkIG5hbWUgd2lsbCBiZWdpbiB3aXRoCi0JICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfSB3aGVyZSAmbHQ7cHJlZml4Jmd0OyBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQKLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBTdGF0aWMgRmllbGQgTmFtZQotCSAqICAgIFdoZW4gdGhlIHByZWZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3Igc3RhdGljIGZpZWxkIG5hbWUgd2lsbCBiZWdpbiB3aXRoCi0JICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfSB3aGVyZSAmbHQ7cHJlZml4Jmd0OyBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQKLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBMb2NhbCBWYXJpYWJsZSBOYW1lCi0JICogICAgV2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBsb2NhbCB2YXJpYWJsZSBuYW1lIHdpbGwgYmVnaW4gd2l0aAotCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgcHJlZml4ZXMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiJmx0O3ByZWZpeCZndDtbLCZsdDtwcmVmaXgmZ3Q7XSoiIH0gd2hlcmUgJmx0O3ByZWZpeCZndDsgaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkCi0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCi0JICoKLQkgKiBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgQXJndW1lbnQgTmFtZQotCSAqICAgIFdoZW4gdGhlIHByZWZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgYXJndW1lbnQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKLQkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXMiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIiZsdDtwcmVmaXgmZ3Q7WywmbHQ7cHJlZml4Jmd0O10qIiB9IHdoZXJlICZsdDtwcmVmaXgmZ3Q7IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZAotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgotCSAqCi0JICogQ09ERUFTU0lTVCAvIERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIEZpZWxkIE5hbWUKLQkgKiAgICBXaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGZpZWxkIG5hbWUgd2lsbCBlbmQgd2l0aAotCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH0gd2hlcmUgJmx0O3N1ZmZpeCZndDsgaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkCi0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCi0JICoKLQkgKiBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgU3RhdGljIEZpZWxkIE5hbWUKLQkgKiAgICBXaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIHN0YXRpYyBmaWVsZCBuYW1lIHdpbGwgZW5kIHdpdGgKLQkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHN1ZmZpeGVzLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXMiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIiZsdDtzdWZmaXgmZ3Q7WywmbHQ7c3VmZml4Jmd0O10qIiB9IHdoZXJlICZsdDtzdWZmaXgmZ3Q7IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZAotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgotCSAqCi0JICogQ09ERUFTU0lTVCAvIERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIExvY2FsIFZhcmlhYmxlIE5hbWUKLQkgKiAgICBXaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIG5hbWUgd2lsbCBlbmQgd2l0aAotCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH0gd2hlcmUgJmx0O3N1ZmZpeCZndDsgaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkCi0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCi0JICoKLQkgKiBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgQXJndW1lbnQgTmFtZQotCSAqICAgIFdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgYXJndW1lbnQgbmFtZSB3aWxsIGVuZCB3aXRoCi0JICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBzdWZmaXhlcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICImbHQ7c3VmZml4Jmd0O1ssJmx0O3N1ZmZpeCZndDtdKiIgfSB3aGVyZSAmbHQ7c3VmZml4Jmd0OyBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQKLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBBY3RpdmF0ZSBGb3JiaWRkZW4gUmVmZXJlbmNlIFNlbnNpdGl2ZSBDb21wbGV0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIGRvZXNuJ3QgcHJvcG9zZSBlbGVtZW50cyB3aGljaCBtYXRjaCBhCi0gIAkgKiAgICBmb3JiaWRkZW4gcmVmZXJlbmNlIHJ1bGUuCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yYmlkZGVuUmVmZXJlbmNlQ2hlY2siCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVuYWJsZWQiCi0JICoKLQkgKiBDT0RFQVNTSVNUIC8gQWN0aXZhdGUgRGlzY291cmFnZWQgUmVmZXJlbmNlIFNlbnNpdGl2ZSBDb21wbGV0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIGRvZXNuJ3QgcHJvcG9zZSBlbGVtZW50cyB3aGljaCBtYXRjaCBhCi0gIAkgKiAgICBkaXNjb3VyYWdlZCByZWZlcmVuY2UgcnVsZS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5kaXNjb3VyYWdlZFJlZmVyZW5jZUNoZWNrIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKLQkgKgotCSAqIENPREVBU1NJU1QgLyBBY3RpdmF0ZSBDYW1lbCBDYXNlIFNlbnNpdGl2ZSBDb21wbGV0aW9uCi0JICogICAgV2hlbiBlbmFibGVkLCBjb21wbGV0aW9uIHNob3dzIHByb3Bvc2FscyB3aG9zZSBuYW1lIG1hdGNoIHRoZSBDYW1lbENhc2UKLQkgKiAgICBwYXR0ZXJuLgotCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmNhbWVsQ2FzZU1hdGNoIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgotCSAqCi0JICogQ09ERUFTU0lTVCAvIEFjdGl2YXRlIFN1Z2dlc3Rpb24gb2YgU3RhdGljIEltcG9ydAotCSAqICAgIFdoZW4gZW5hYmxlZCwgY29tcGxldGlvbiBwcm9wb3NhbHMgY2FuIGNvbnRhaW4gc3RhdGljIGltcG9ydAotCSAqICAgIHBhdHRlcm4uCi0JICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3VnZ2VzdFN0YXRpY0ltcG9ydHMiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVuYWJsZWQiCi0JICogPC9wcmU+CisJICogQHJldHVybiBhIHRhYmxlIG9mIGFsbCBrbm93biBjb25maWd1cmFibGUgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCiAJICovCi0gCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldERlZmF1bHRPcHRpb25zKCl7Ci0gCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RGVmYXVsdE9wdGlvbnMoKTsKKwlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXREZWZhdWx0T3B0aW9ucygpeworCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RGVmYXVsdE9wdGlvbnMoKTsKIAl9CiAKIAkvKioKQEAgLTI3NjEsMTQgKzMxNDEsMTYgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCS8vIFZlcmlmeSB0aGF0IHdvcmtzcGFjZSBpcyBub3Qgc2h1dHRpbmcgZG93biAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA2ODcpCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAod29ya3NwYWNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGZhaWxzIHNpbGVudGx5IGFuZCByZXR1cm4gcGx1Z2luIGdsb2JhbCBlbmNvZGluZyBpZiBjb3JlIGV4Y2VwdGlvbiBvY2N1cnMKLQkJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldERlZmF1bHRDaGFyc2V0KCk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKwkJCS8vIGhhcHBlbiB3aGVuIHRoZXJlJ3Mgbm8gd29ya3NwYWNlIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY4MTcpCisJCQkvLyBvciB3aGVuIGl0IGlzIHNodXR0aW5nIGRvd24gKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNjg3KQorCQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCS8vIGZhaWxzIHNpbGVudGx5IGFuZCByZXR1cm4gcGx1Z2luIGdsb2JhbCBlbmNvZGluZyBpZiBjb3JlIGV4Y2VwdGlvbiBvY2N1cnMKIAkJfQogCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7CiAJfQpAQCAtMjk5MSw4ICszMzczLDEyIEBACiAJICogSGVscGVyIG1ldGhvZCBmb3IgcmV0dXJuaW5nIG9uZSBvcHRpb24gdmFsdWUgb25seS4gRXF1aXZhbGVudCB0byA8Y29kZT4oU3RyaW5nKUphdmFDb3JlLmdldE9wdGlvbnMoKS5nZXQob3B0aW9uTmFtZSk8L2NvZGU+CiAJICogTm90ZSB0aGF0IGl0IG1heSBhbnN3ZXIgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcHRpb24gZG9lcyBub3QgZXhpc3QuCiAJICogPHA+Ci0JICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgotCSAqIDwvcD4KKwkgKiBIZWxwZXIgY29uc3RhbnRzIGhhdmUgYmVlbiBkZWZpbmVkIG9uIEphdmFDb3JlIGZvciBlYWNoIG9mIHRoZSBvcHRpb24gSURzCisJICogKGNhdGVnb3JpemVkIGluIENvZGUgYXNzaXN0IG9wdGlvbiBJRCwgQ29tcGlsZXIgb3B0aW9uIElEIGFuZCBDb3JlIG9wdGlvbiBJRCkKKwkgKiBhbmQgc29tZSBvZiB0aGVpciBhY2NlcHRhYmxlIHZhbHVlcyAoY2F0ZWdvcml6ZWQgaW4gT3B0aW9uIHZhbHVlKS4gU29tZQorCSAqIG9wdGlvbnMgYWNjZXB0IG9wZW4gdmFsdWUgc2V0cyBiZXlvbmQgdGhlIGRvY3VtZW50ZWQgY29uc3RhbnQgdmFsdWVzLgorCSAqIDxwPgorCSAqIE5vdGU6IGVhY2ggcmVsZWFzZSBtYXkgYWRkIG5ldyBvcHRpb25zLgogCSAqCiAJICogQHBhcmFtIG9wdGlvbk5hbWUgdGhlIG5hbWUgb2YgYW4gb3B0aW9uCiAJICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIGEgZ2l2ZW4gb3B0aW9uCkBAIC0zMDA1LDkgKzMzOTEsMzQgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHNldmVyaXR5IG9mIHRoZQorCSAqIGNvbXBpbGVyIHByb2JsZW0gaWRlbnRpZmllZCBieSA8Y29kZT5wcm9ibGVtSUQ8L2NvZGU+IGlmIGFueSwKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuIE5vbi1udWxsIHJldHVybiB2YWx1ZXMgYXJlIHRha2VuIGZyb20gdGhlCisJICogY29uc3RhbnRzIGRlZmluZWQgYnkgdGhpcyBjbGFzcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoCisJICogPGNvZGU+Q09NUElMRVJfUEI8L2NvZGU+IGFuZCBmb3Igd2hpY2ggdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUKKwkgKiBvcHRpb24gYXJlIGRlZmluZWQgYnkgPGNvZGU+eyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH08L2NvZGU+LiBBCisJICogbnVsbCByZXR1cm4gdmFsdWUgbWVhbnMgdGhhdCB0aGUgcHJvdmlkZWQgcHJvYmxlbSBJRCBpcyB1bmtub3duIG9yIHRoYXQKKwkgKiBpdCBtYXRjaGVzIGEgcHJvYmxlbSB3aG9zZSBzZXZlcml0eSBjYW5ub3QgYmUgY29uZmlndXJlZC4KKwkgKiBAcGFyYW0gcHJvYmxlbUlEIG9uZSBvZiB0aGUgcHJvYmxlbSBJRHMgZGVmaW5lZCBieSB7QGxpbmsgSVByb2JsZW19CisJICogQHJldHVybiB0aGUgb3B0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBzZXZlcml0eSBvZiB0aGUKKwkgKiAgICAgICAgIGNvbXBpbGVyIHByb2JsZW0gaWRlbnRpZmllZCBieSA8Y29kZT5wcm9ibGVtSUQ8L2NvZGU+IGlmIGFueSwKKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcHRpb25Gb3JDb25maWd1cmFibGVTZXZlcml0eShpbnQgcHJvYmxlbUlEKSB7CisJCXJldHVybiBDb21waWxlck9wdGlvbnMub3B0aW9uS2V5RnJvbUlycml0YW50KFByb2JsZW1SZXBvcnRlci5nZXRJcnJpdGFudChwcm9ibGVtSUQpKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB0YWJsZSBvZiB0aGUgY3VycmVudCBvcHRpb25zLiBJbml0aWFsbHksIGFsbCBvcHRpb25zIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsCiAJICogYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYSB0YWJsZSB0aGF0IGluY2x1ZGVzIGFsbCBrbm93biBvcHRpb25zLgotCSAqIDxwPkZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi48L3A+CisJICogPHA+CisJICogSGVscGVyIGNvbnN0YW50cyBoYXZlIGJlZW4gZGVmaW5lZCBvbiBKYXZhQ29yZSBmb3IgZWFjaCBvZiB0aGUgb3B0aW9uIElEcworCSAqIChjYXRlZ29yaXplZCBpbiBDb2RlIGFzc2lzdCBvcHRpb24gSUQsIENvbXBpbGVyIG9wdGlvbiBJRCBhbmQgQ29yZSBvcHRpb24gSUQpCisJICogYW5kIHNvbWUgb2YgdGhlaXIgYWNjZXB0YWJsZSB2YWx1ZXMgKGNhdGVnb3JpemVkIGluIE9wdGlvbiB2YWx1ZSkuIFNvbWUKKwkgKiBvcHRpb25zIGFjY2VwdCBvcGVuIHZhbHVlIHNldHMgYmV5b25kIHRoZSBkb2N1bWVudGVkIGNvbnN0YW50IHZhbHVlcy4KKwkgKiA8cD4KKwkgKiBOb3RlOiBlYWNoIHJlbGVhc2UgbWF5IGFkZCBuZXcgb3B0aW9ucy4KIAkgKiA8cD5SZXR1cm5zIGEgZGVmYXVsdCBzZXQgb2Ygb3B0aW9ucyBldmVuIGlmIHRoZSBwbGF0Zm9ybSBpcyBub3QgcnVubmluZy48L3A+CiAJICoKIAkgKiBAcmV0dXJuIHRhYmxlIG9mIGN1cnJlbnQgc2V0dGluZ3Mgb2YgYWxsIG9wdGlvbnMKQEAgLTMwNTEsODQgKzM0NjIsNyBAQAogCSAqICAgaWYgdGhlIGdpdmVuIHZhcmlhYmxlIGVudHJ5IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhIHZhbGlkIGNsYXNzcGF0aCBlbnRyeQogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IGdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0KLQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpCi0JCQlyZXR1cm4gZW50cnk7Ci0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFBhdGgoKSk7Ci0JCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHJlc29sdmVkUGF0aCwgZmFsc2UpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbnNpZGUgdGhlIHdvcmtzcGFjZQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKLQkJCXN3aXRjaCAocmVzb2x2ZWRSZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQkvLyBpbnRlcm5hbCBwcm9qZWN0Ci0JCQkJCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoCi0JCQkJCQkJcmVzb2x2ZWRQYXRoLAotCQkJCQkJCWVudHJ5LmdldEFjY2Vzc1J1bGVzKCksCi0JCQkJCQkJZW50cnkuY29tYmluZUFjY2Vzc1J1bGVzKCksCi0JCQkJCQkJZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksCi0JCQkJCQkJZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocmVzb2x2ZWRSZXNvdXJjZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkvLyBpbnRlcm5hbCBiaW5hcnkgYXJjaGl2ZQotCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKLQkJCQkJCQkJcmVzb2x2ZWRQYXRoLAotCQkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSwKLQkJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpLAotCQkJCQkJCQllbnRyeS5nZXRBY2Nlc3NSdWxlcygpLAotCQkJCQkJCQllbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwKLQkJCQkJCQkJZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCS8vIGludGVybmFsIGJpbmFyeSBmb2xkZXIKLQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKLQkJCQkJCQlyZXNvbHZlZFBhdGgsCi0JCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksCi0JCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpLAotCQkJCQkJCWVudHJ5LmdldEFjY2Vzc1J1bGVzKCksCi0JCQkJCQkJZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksCi0JCQkJCQkJZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCX0KLQkJfQotCQkvLyBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKLQkJCUZpbGUgZXh0ZXJuYWxGaWxlID0gSmF2YU1vZGVsLmdldEZpbGUodGFyZ2V0KTsKLQkJCWlmIChleHRlcm5hbEZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGV4dGVybmFsRmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfamFyKSB8fCBmaWxlTmFtZS5lbmRzV2l0aChTdWZmaXhDb25zdGFudHMuU1VGRklYX1NUUklOR196aXApKSB7Ci0JCQkJCS8vIGV4dGVybmFsIGJpbmFyeSBhcmNoaXZlCi0JCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCi0JCQkJCQkJcmVzb2x2ZWRQYXRoLAotCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpLAotCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSwKLQkJCQkJCQllbnRyeS5nZXRBY2Nlc3NSdWxlcygpLAotCQkJCQkJCWVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpLAotCQkJCQkJCWVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcgotCQkJCWlmIChyZXNvbHZlZFBhdGguaXNBYnNvbHV0ZSgpKXsKLQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKLQkJCQkJCQlyZXNvbHZlZFBhdGgsCi0JCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksCi0JCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpLAotCQkJCQkJCWVudHJ5LmdldEFjY2Vzc1J1bGVzKCksCi0JCQkJCQkJZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksCi0JCQkJCQkJZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZXNvbHZlVmFyaWFibGVFbnRyeShlbnRyeSwgZmFsc2UvKmRvbid0IHVzZSBwcmV2aW91cyBzZXNzaW9uIHZhbHVlKi8pOwogCX0KIAogCkBAIC0zMTM5LDI0ICszNDczLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB2YXJpYWJsZSBwYXRoIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJlc29sdmVkVmFyaWFibGVQYXRoKElQYXRoIHZhcmlhYmxlUGF0aCkgewotCi0JCWlmICh2YXJpYWJsZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgY291bnQgPSB2YXJpYWJsZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gbG9va3VwIHZhcmlhYmxlCi0JCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZVBhdGguc2VnbWVudCgwKTsKLQkJSVBhdGggcmVzb2x2ZWRQYXRoID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lKTsKLQkJaWYgKHJlc29sdmVkUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gYXBwZW5kIHBhdGggc3VmZml4Ci0JCWlmIChjb3VudCA+IDEpIHsKLQkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkUGF0aC5hcHBlbmQodmFyaWFibGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQl9Ci0JCXJldHVybiByZXNvbHZlZFBhdGg7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aCh2YXJpYWJsZVBhdGgsIGZhbHNlLypkb24ndCB1c2UgcHJldmlvdXMgc2Vzc2lvbiB2YWx1ZSovKTsKIAl9CiAKIAkvKioKQEAgLTMyMzMsNTIgKzM1NTAsOTggQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUFmdGVyTG9hZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIAltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfaW5pdGlhbGl6YXRpb24sIDEwMCk7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuamF2YW1vZGVsX2luaXRpYWxpemF0aW9uLCAxMDApOworCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfY29uZmlndXJpbmdfY2xhc3NwYXRoX2NvbnRhaW5lcnMpOworCQkJfQogCiAJCQkvLyBpbml0aWFsaXplIGFsbCBjb250YWluZXJzIGFuZCB2YXJpYWJsZXMKIAkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBudWxsOwogCQkJdHJ5IHsKIAkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfY29uZmlndXJpbmdfY2xhc3NwYXRoX2NvbnRhaW5lcnMpOwotCQkJCQltYW5hZ2VyLmJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zUHJvZ3Jlc3Muc2V0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsgLy8gNTAlIG9mIHRoZSB0aW1lIGlzIHNwZW50IGluIGluaXRpYWxpemluZyBjb250YWluZXJzIGFuZCB2YXJpYWJsZXMKKwkJCQkJc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApOyAvLyA1MCUgb2YgdGhlIHRpbWUgaXMgc3BlbnQgaW4gaW5pdGlhbGl6aW5nIGNvbnRhaW5lcnMgYW5kIHZhcmlhYmxlcworCQkJCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdWJNb25pdG9yLndvcmtlZCg1KTsgLy8gZ2l2ZSBmZWVkYmFjayB0byB0aGUgdXNlciB0aGF0IHNvbWV0aGluZyBpcyBoYXBwZW5pbmcKKwkJCQkJbWFuYWdlci5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzLmluaXRpYWxpemVBZnRlckxvYWRNb25pdG9yLnNldChzdWJNb25pdG9yKTsKIAkJCQl9Ci0JCQkJCi0JCQkJLy8gYWxsIGNsYXNzcGF0aHMgaW4gdGhlIHdvcmtzcGFjZSBhcmUgZ29pbmcgdG8gYmUgcmVzb2x2ZWQsIGVuc3VyZSB0aGF0IGNvbnRhaW5lcnMgYXJlIGluaXRpYWxpemVkIGluIG9uZSBiYXRjaAotCQkJCW1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSB0cnVlOyAKLQkJCQkKLQkJCQkvLyBhdm9pZCBsZWFraW5nIHNvdXJjZSBhdHRhY2htZW50IHByb3BlcnRpZXMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzNDEzKQotCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbWFuYWdlci5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoOwotCQkJCQl0cnkgewotCQkJCQkJY2xhc3NwYXRoID0gKChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV0pLmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBwcm9qZWN0IG5vIGxvbmdlciBleGlzdDogaWdub3JlCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgewotCQkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKLQkJCQkJCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsKQotCQkJCQkJCQlVdGlsLnNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShlbnRyeS5nZXRQYXRoKCksIG51bGwpOwotCQkJCQkJCS8vIGVsc2Ugc291cmNlIG1pZ2h0IGhhdmUgYmVlbiBhdHRhY2hlZCBieSBJUGFja2FnZUZyYWdtZW50Um9vdCNhdHRhY2hTb3VyY2UoLi4uKSwgd2Uga2VlcCBpdAorCQkJCWlmIChtYW5hZ2VyLmZvcmNlQmF0Y2hJbml0aWFsaXphdGlvbnModHJ1ZS8qaW5pdEFmdGVyTG9hZCovKSkgeyAvLyBpZiBubyBvdGhlciB0aHJlYWQgaGFzIHN0YXJ0ZWQgdGhlIGJhdGNoIGNvbnRhaW5lciBpbml0aWFsaXphdGlvbnMKKwkJCQkJbWFuYWdlci5nZXRDbGFzc3BhdGhDb250YWluZXIoUGF0aC5FTVBUWSwgbnVsbCk7IC8vIGZvcmNlIHRoZSBiYXRjaCBpbml0aWFsaXphdGlvbgorCQkJCX0gZWxzZSB7IC8vIGVsc2Ugd2FpdCBmb3IgdGhlIGJhdGNoIGluaXRpYWxpemF0aW9uIHRvIGZpbmlzaAorCQkJCQl3aGlsZSAobWFuYWdlci5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucyA9PSBKYXZhTW9kZWxNYW5hZ2VyLkJBVENIX0lOSVRJQUxJWkFUSU9OX0lOX1BST0dSRVNTKSB7CisJCQkJCQlpZiAoc3ViTW9uaXRvciAhPSBudWxsKSB7CisJCQkJCQkJc3ViTW9uaXRvci5zdWJUYXNrKG1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnNQcm9ncmVzcy5zdWJUYXNrTmFtZSk7CisJCQkJCQkJc3ViTW9uaXRvci53b3JrZWQobWFuYWdlci5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzLmdldFdvcmtlZCgpKTsKKwkJCQkJCX0KKwkJCQkJCXN5bmNocm9uaXplZChtYW5hZ2VyKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbWFuYWdlci53YWl0KDEwMCk7CisJCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkJCQkvLyBjb250aW51ZQorCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQkJCQkKLQkJCQkvLyBpbml0aWFsaXplIGRlbHRhIHN0YXRlCi0JCQkJbWFuYWdlci5kZWx0YVN0YXRlLnJvb3RzQXJlU3RhbGUgPSB0cnVlOyAvLyBpbiBjYXNlIGl0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIGJlZm9yZSB3ZSBjbGVhbmVkIHVwIHRoZSBzb3VyY2UgYXR0YWNobWVudCBwcm9wcnRpZXMKLQkJCQltYW5hZ2VyLmRlbHRhU3RhdGUuaW5pdGlhbGl6ZVJvb3RzKCk7CiAJCQl9IGZpbmFsbHkgewotCQkJCW1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnNQcm9ncmVzcy5zZXQobnVsbCk7CisJCQkJaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKKwkJCQkJc3ViTW9uaXRvci5kb25lKCk7CisJCQkJbWFuYWdlci5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzLmluaXRpYWxpemVBZnRlckxvYWRNb25pdG9yLnNldChudWxsKTsKIAkJCX0KIAorCQkJLy8gYXZvaWQgbGVha2luZyBzb3VyY2UgYXR0YWNobWVudCBwcm9wZXJ0aWVzIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzQxMyApCisJCQkvLyBhbmQgcmVjcmVhdGUgbGlua3MgZm9yIGV4dGVybmFsIGZvbGRlcnMgaWYgbmVlZGVkCisJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfcmVzZXR0aW5nX3NvdXJjZV9hdHRhY2htZW50X3Byb3BlcnRpZXMpOworCQkJZmluYWwgSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtYW5hZ2VyLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOworCQkJSGFzaFNldCB2aXNpdGVkUGF0aHMgPSBuZXcgSGFzaFNldCgpOworCQkJRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRFeHRlcm5hbE1hbmFnZXIoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0c1tpXTsKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkvLyBwcm9qZWN0IG5vIGxvbmdlciBleGlzdDogaWdub3JlCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBjbGFzc3BhdGgubGVuZ3RoOyBqIDwgbGVuZ3RoMjsgaisrKSB7CisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbal07CisJCQkJCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsKSB7CisJCQkJCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCQkJCWlmICh2aXNpdGVkUGF0aHMuYWRkKGVudHJ5UGF0aCkpIHsKKwkJCQkJCQkJVXRpbC5zZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoZW50cnlQYXRoLCBudWxsKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBlbHNlIHNvdXJjZSBtaWdodCBoYXZlIGJlZW4gYXR0YWNoZWQgYnkgSVBhY2thZ2VGcmFnbWVudFJvb3QjYXR0YWNoU291cmNlKC4uLiksIHdlIGtlZXAgaXQKKwkJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJCQkJaWYgKEV4dGVybmFsRm9sZGVyc01hbmFnZXIuaXNFeHRlcm5hbEZvbGRlclBhdGgoZW50cnlQYXRoKSAmJiBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmdldEZvbGRlcihlbnRyeVBhdGgpID09IG51bGwpIHsKKwkJCQkJCQkJZXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5hZGRGb2xkZXIoZW50cnlQYXRoLCB0cnVlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl0cnkgeworCQkJCWV4dGVybmFsRm9sZGVyc01hbmFnZXIuY3JlYXRlUGVuZGluZ0ZvbGRlcnMobW9uaXRvcik7CisJCQl9CisJCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJCQkJLy8gQ3JlYXRpb24gb2YgZXh0ZXJuYWwgZm9sZGVyIHByb2plY3QgZmFpbGVkLiBMb2cgaXQgYW5kIGNvbnRpbnVlOworCQkJCVV0aWwubG9nKGptZSwgIkVycm9yIHdoaWxlIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZm9sZGVycyIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQkvLyBpbml0aWFsaXplIGRlbHRhIHN0YXRlCisJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfaW5pdGlhbGl6aW5nX2RlbHRhX3N0YXRlKTsKKwkJCW1hbmFnZXIuZGVsdGFTdGF0ZS5yb290c0FyZVN0YWxlID0gdHJ1ZTsgLy8gaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2xlYW5lZCB1cCB0aGUgc291cmNlIGF0dGFjaG1lbnQgcHJvcHJ0aWVzCisJCQltYW5hZ2VyLmRlbHRhU3RhdGUuaW5pdGlhbGl6ZVJvb3RzKHRydWUvKmluaXRBZnRlTG9hZCovKTsKKwogCQkJLy8gZHVtbXkgcXVlcnkgZm9yIHdhaXRpbmcgdW50aWwgdGhlIGluZGV4ZXMgYXJlIHJlYWR5CisJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfY29uZmlndXJpbmdfc2VhcmNoZW5naW5lKTsKIAkJCVNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7CiAJCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCk7CiAJCQl0cnkgewotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5qYXZhbW9kZWxfY29uZmlndXJpbmdfc2VhcmNoZW5naW5lKTsKIAkJCQllbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzKAogCQkJCQludWxsLAogCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsCkBAIC0zMzI5LDIyICszNjkyLDE1IEBACiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGQgc3RhdGUgdmVyc2lvbiBudW1iZXIgaGFzIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CiAJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gY291bGQgbm90IGdldCBKYXZhIHByb2plY3RzOiBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3VjaGluZyAiICsgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJcHJvamVjdC5nZXRQcm9qZWN0KCkudG91Y2gocHJvZ3Jlc3NNb25pdG9yMik7Ci0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gY291bGQgbm90IHRvdWNoIHRoaXMgcHJvamVjdDogaWdub3JlCi0JCQkJCQkJCX0KKwkJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3VjaGluZyAiICsgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQluZXcgQ2xhc3NwYXRoVmFsaWRhdGlvbigoSmF2YVByb2plY3QpIHByb2plY3QpLnZhbGlkYXRlKCk7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODcxNjQKKwkJCQkJCQkJcHJvamVjdC5nZXRQcm9qZWN0KCkudG91Y2gocHJvZ3Jlc3NNb25pdG9yMik7CisJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCS8vIGNvdWxkIG5vdCB0b3VjaCB0aGlzIHByb2plY3Q6IGlnbm9yZQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtMzM3NCw3ICszNzMwLDcgQEAKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gcmVmcmVzaGluZyBmYWlsZWQ6IGlnbm9yZQogCQkJfQotCQkJCisKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOwogCQl9CkBAIC0zNjQxLDExICszOTk3LDE1IEBACiAJCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKIAogCQlpZiAoY29udGFpbmVyUGF0aCA9PSBudWxsKSB7Ci0JCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiQ29udGFpbmVyIHBhdGggY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiQ29udGFpbmVyIHBhdGggY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkgPCAxKSB7Ci0JCQlBc3NlcnQuaXNUcnVlKAotCQkJCWZhbHNlLAotCQkJCSJJbGxlZ2FsIGNsYXNzcGF0aCBjb250YWluZXIgcGF0aDogXCciICsgY29udGFpbmVyUGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpICsgIlwnLCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQgKGNvbnRhaW5lcklEK2hpbnRzKSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiSWxsZWdhbCBjbGFzc3BhdGggY29udGFpbmVyIHBhdGg6IFwnIiArIGNvbnRhaW5lclBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSArICJcJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50IChjb250YWluZXJJRCtoaW50cykiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCQlpZiAoYWNjZXNzUnVsZXMgPT0gbnVsbCkgeworCQkJYWNjZXNzUnVsZXMgPSBDbGFzc3BhdGhFbnRyeS5OT19BQ0NFU1NfUlVMRVM7CisJCX0KKwkJaWYgKGV4dHJhQXR0cmlidXRlcyA9PSBudWxsKSB7CisJCQlleHRyYUF0dHJpYnV0ZXMgPSBDbGFzc3BhdGhFbnRyeS5OT19FWFRSQV9BVFRSSUJVVEVTOwogCQl9CiAJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCiAJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKQEAgLTM3MDMsOSArNDA2MywxMCBAQAogCSAqIHtAbGluayAjbmV3TGlicmFyeUVudHJ5KElQYXRoLCBJUGF0aCwgSVBhdGgsIElBY2Nlc3NSdWxlW10sIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSwgYm9vbGVhbikKIAkgKiBuZXdMaWJyYXJ5RW50cnkocGF0aCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgbmV3IElBY2Nlc3NSdWxlWzBdLCBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVswXSwgZmFsc2UpfS4KIAkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBiaW5hcnkgYXJjaGl2ZQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBsaWJyYXJ5CiAJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlciwKIAkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiBOb3RlLCBzaW5jZSAzLjAsIGFuIGVtcHR5IHBhdGggaXMgYWxsb3dlZCB0byBkZW5vdGUgbm8gc291cmNlIGF0dGFjaG1lbnQuCisJICogICAgU2luY2UgMy40LCB0aGlzIHBhdGggY2FuIGFsc28gZGVub3RlIGEgcGF0aCBleHRlcm5hbCB0byB0aGUgd29ya3NwYWNlLgogCSAqICAgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCiAJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSBmaWxlcyB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlcgogCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbG9jYXRpb24gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuCkBAIC0zNzMzLDEwICs0MDk0LDExIEBACiAJICoge0BsaW5rICNuZXdMaWJyYXJ5RW50cnkoSVBhdGgsIElQYXRoLCBJUGF0aCwgSUFjY2Vzc1J1bGVbXSwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdLCBib29sZWFuKQogCSAqIG5ld0xpYnJhcnlFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlWzBdLCBpc0V4cG9ydGVkKX0uCiAJICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgYmluYXJ5IGFyY2hpdmUKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgbGlicmFyeQogCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIsCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gTm90ZSwgc2luY2UgMy4wLCBhbiBlbXB0eSBwYXRoIGlzIGFsbG93ZWQgdG8gZGVub3RlIG5vIHNvdXJjZSBhdHRhY2htZW50LgotCSAqICAgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCisJICogICBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byA8Y29kZT5udWxsPC9jb2RlPi4gU2luY2UgMy40LCB0aGlzIHBhdGggY2FuIGFsc28gZGVub3RlIGEgcGF0aCBleHRlcm5hbAorCSAqICAgdG8gdGhlIHdvcmtzcGFjZS4KIAkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIGZpbGVzIHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBsb2NhdGlvbiBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4KIAkgKiBAcGFyYW0gaXNFeHBvcnRlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudApAQCAtMzc2NiwxNSArNDEyOCwxNyBAQAogCSAqIDxwPgogCSAqIEEgbGlicmFyeSBlbnRyeSBpcyB1c2VkIHRvIGRlbm90ZSBhIHByZXJlcXVpc2l0ZSBKQVIgb3Igcm9vdCBmb2xkZXIgY29udGFpbmluZyBiaW5hcmllcy4KIAkgKiBUaGUgdGFyZ2V0IEpBUiBjYW4gZWl0aGVyIGJlIGRlZmluZWQgaW50ZXJuYWxseSB0byB0aGUgd29ya3NwYWNlIChhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlCi0JICogdG8gdGhlIHdvcmtzcGFjZSByb290KSBvciBleHRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtKS4KLQkgKiBUaGUgdGFyZ2V0IHJvb3QgZm9sZGVyIGNhbiBvbmx5IGJlIGRlZmluZWQgaW50ZXJuYWxseSB0byB0aGUgd29ya3NwYWNlIChhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlCi0JICogdG8gdGhlIHdvcmtzcGFjZSByb290KS4gVG8gdXNlIGEgYmluYXJ5IGZvbGRlciBleHRlcm5hbCB0byB0aGUgd29ya3NwYWNlLCBpdCBtdXN0IGZpcnN0IGJlCi0JICogbGlua2VkIChzZWUgSUZvbGRlciNjcmVhdGVMaW5rKC4uLikpLgorCSAqIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCksIG9yIGV4dGVybmFsbHkgdG8gdGhlIHdvcmtzcGFjZSAoYWJzb2x1dGUgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0pLgorCSAqIFRoZSB0YXJnZXQgcm9vdCBmb2xkZXIgY2FuIGFsc28gYmUgZGVmaW5lZCBpbnRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggcmVsYXRpdmUKKwkgKiB0byB0aGUgd29ya3NwYWNlIHJvb3QpLCBvciAtIHNpbmNlIDMuNCAtIGV4dGVybmFsbHkgdG8gdGhlIHdvcmtzcGFjZSAoYWJzb2x1dGUgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0pLgorCSAqIFNpbmNlIDMuNSwgdGhlIHBhdGggdG8gdGhlIGxpYnJhcnkgY2FuIGFsc28gYmUgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgdXNpbmcgIi4uIiBhcyB0aGUgZmlyc3Qgc2VnbWVudC4gCiAJICogPHA+CiAJICogZS5nLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGJpbmFyeSBwYXRoIHVzYWdlPHVsPgogCSAqCTxsaT48Y29kZT4gImM6XGpkazEuMi4yXGpyZVxsaWJccnQuamFyIiA8L2NvZGU+IC0gcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIEpBUiBvbiBXaW5kb3dzPC9saT4KIAkgKgk8bGk+PGNvZGU+ICIvUHJvamVjdC9zb21lTGliLmphciIgPC9jb2RlPiAtIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBKQVIgb24gV2luZG93cyBvciBMaW51eDwvbGk+CiAJICoJPGxpPjxjb2RlPiAiL1Byb2plY3QvY2xhc3Nlcy8iIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwgYmluYXJ5IGZvbGRlciBvbiBXaW5kb3dzIG9yIExpbnV4PC9saT4KKwkgKgk8bGk+PGNvZGU+ICIvaG9tZS91c3IvY2xhc3NlcyIgPC9jb2RlPiAtIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBiaW5hcnkgZm9sZGVyIG9uIExpbnV4PC9saT4KKwkgKgk8bGk+PGNvZGU+ICIuLi8uLi9saWIvc29tZUxpYi5qYXIiIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgSkFSIHRoYXQgaXMgYSBzaWJibGluZyBvZiB0aGUgd29ya3NwYWNlIG9uIGVpdGhlciBwbGF0Zm9ybTwvbGk+CiAJICogPC91bD4KIAkgKiBOb3RlIHRoYXQgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm0sIGEgcGF0aCA8Y29kZT4iL3NvbWUvbGliLmphciI8L2NvZGU+IGlzIGFtYmlndW91cy4KIAkgKiBJdCBjYW4gYmUgYSBwYXRoIHRvIGFuIGV4dGVybmFsIEpBUiAoaXRzIGZpbGUgc3lzdGVtIHBhdGggYmVpbmcgPGNvZGU+Ii9zb21lL2xpYi5qYXIiPC9jb2RlPikKQEAgLTM4MDMsMTEgKzQxNjcsMTYgQEAKIAkgKiBhY2Nlc3NpYmxlIGZpbGVzIHBhdHRlcm5zIG9mIHRoZSBwcm9qZWN0cywgYW5kIHRoZXkgd2lsbCBjb25jYXRlbmF0ZSB0aGUgbm9uIGFjY2Vzc2libGUgZmlsZXMgcGF0dGVybnMgb2YgdGhpcyBlbnRyeQogCSAqIHdpdGggdGhlIG5vbiBhY2Nlc3NpYmxlIGZpbGVzIHBhdHRlcm5zIG9mIHRoZSBwcm9qZWN0LgogCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBTaW5jZSAzLjUsIGlmIHRoZSBsaWJyYXkgaXMgYSBaSVAgYXJjaGl2ZSwgdGhlICJDbGFzcy1QYXRoIiBjbGF1c2UgKGlmIGFueSkgaW4gdGhlICJNRVRBLUlORi9NQU5JRkVTVC5NRiIgaXMgcmVhZAorCSAqIGFuZCByZWZlcmVuY2VkIFpJUCBhcmNoaXZlcyBhcmUgYWRkZWQgdG8gdGhlIHtAbGluayBJSmF2YVByb2plY3QjZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoYm9vbGVhbikgcmVzb2x2ZWQgY2xhc3NwYXRofS4KKwkgKiA8L3A+CiAJICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgYmluYXJ5IGFyY2hpdmUKKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgbGlicmFyeQogCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIsCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gTm90ZSwgc2luY2UgMy4wLCBhbiBlbXB0eSBwYXRoIGlzIGFsbG93ZWQgdG8gZGVub3RlIG5vIHNvdXJjZSBhdHRhY2htZW50LgotCSAqICAgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCisJICogICBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byA8Y29kZT5udWxsPC9jb2RlPi4gU2luY2UgMy40LCB0aGlzIHBhdGggY2FuIGFsc28gZGVub3RlIGEgcGF0aCBleHRlcm5hbAorCSAqICAgdG8gdGhlIHdvcmtzcGFjZS4KIAkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIGZpbGVzIHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBsb2NhdGlvbiBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4KIAkgKiBAcGFyYW0gYWNjZXNzUnVsZXMgdGhlIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgYWNjZXNzIHJ1bGVzIGZvciB0aGlzIGVudHJ5CkBAIC0zODI1LDEzICs0MTk0LDIwIEBACiAJCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzLAogCQkJYm9vbGVhbiBpc0V4cG9ydGVkKSB7CiAKLQkJaWYgKHBhdGggPT0gbnVsbCkgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkxpYnJhcnkgcGF0aCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIEFzc2VydC5pc1RydWUoZmFsc2UsICJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChwYXRoID09IG51bGwpIHRocm93IG5ldyBDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkxpYnJhcnkgcGF0aCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCWlmIChhY2Nlc3NSdWxlcyA9PSBudWxsKSB7CisJCQlhY2Nlc3NSdWxlcyA9IENsYXNzcGF0aEVudHJ5Lk5PX0FDQ0VTU19SVUxFUzsKKwkJfQorCQlpZiAoZXh0cmFBdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCWV4dHJhQXR0cmlidXRlcyA9IENsYXNzcGF0aEVudHJ5Lk5PX0VYVFJBX0FUVFJJQlVURVM7CisJCX0KKwkJYm9vbGVhbiBoYXNEb3REb3QgPSBDbGFzc3BhdGhFbnRyeS5oYXNEb3REb3QocGF0aCk7CisJCWlmICghaGFzRG90RG90ICYmICFwYXRoLmlzQWJzb2x1dGUoKSkgdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiUGF0aCBmb3IgSUNsYXNzcGF0aEVudHJ5IG11c3QgYmUgYWJzb2x1dGU6ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAoc291cmNlQXR0YWNobWVudFBhdGggIT0gbnVsbCkgewogCQkJaWYgKHNvdXJjZUF0dGFjaG1lbnRQYXRoLmlzRW1wdHkoKSkgewogCQkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoID0gbnVsbDsgLy8gdHJlYXQgZW1wdHkgcGF0aCBhcyBub25lCiAJCQl9IGVsc2UgaWYgKCFzb3VyY2VBdHRhY2htZW50UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiU291cmNlIGF0dGFjaG1lbnQgcGF0aCAnIiAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiU291cmNlIGF0dGFjaG1lbnQgcGF0aCAnIiAvLyROT04tTkxTLTEkCiAJCQkJCQkrIHNvdXJjZUF0dGFjaG1lbnRQYXRoCiAJCQkJCQkrICInIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CkBAIC0zODM5LDcgKzQyMTUsNyBAQAogCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KAogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlksCiAJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksCi0JCQlKYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aChwYXRoKSwKKwkJCWhhc0RvdERvdCA/IHBhdGggOiBKYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aChwYXRoKSwKIAkJCUNsYXNzcGF0aEVudHJ5LklOQ0xVREVfQUxMLCAvLyBpbmNsdXNpb24gcGF0dGVybnMKIAkJCUNsYXNzcGF0aEVudHJ5LkVYQ0xVREVfTk9ORSwgLy8gZXhjbHVzaW9uIHBhdHRlcm5zCiAJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKQEAgLTM4ODAsNyArNDI1Niw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3UHJvamVjdEVudHJ5KElQYXRoIHBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewogCi0JCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIEFzc2VydC5pc1RydWUoZmFsc2UsICJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCisJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHRocm93IG5ldyBDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIlBhdGggZm9yIElDbGFzc3BhdGhFbnRyeSBtdXN0IGJlIGFic29sdXRlIik7IC8vJE5PTi1OTFMtMSQKIAogCQlyZXR1cm4gbmV3UHJvamVjdEVudHJ5KAogCQkJcGF0aCwKQEAgLTM5NDUsOCArNDMyMSwxMyBAQAogCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcywKIAkJCWJvb2xlYW4gaXNFeHBvcnRlZCkgewogCi0JCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIEFzc2VydC5pc1RydWUoZmFsc2UsICJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCi0KKwkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiUGF0aCBmb3IgSUNsYXNzcGF0aEVudHJ5IG11c3QgYmUgYWJzb2x1dGUiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYWNjZXNzUnVsZXMgPT0gbnVsbCkgeworCQkJYWNjZXNzUnVsZXMgPSBDbGFzc3BhdGhFbnRyeS5OT19BQ0NFU1NfUlVMRVM7CisJCX0KKwkJaWYgKGV4dHJhQXR0cmlidXRlcyA9PSBudWxsKSB7CisJCQlleHRyYUF0dHJpYnV0ZXMgPSBDbGFzc3BhdGhFbnRyeS5OT19FWFRSQV9BVFRSSUJVVEVTOworCQl9CiAJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCiAJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKIAkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwKQEAgLTQxNDcsMTEgKzQ1MjgsMTcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdTb3VyY2VFbnRyeShJUGF0aCBwYXRoLCBJUGF0aFtdIGluY2x1c2lvblBhdHRlcm5zLCBJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zLCBJUGF0aCBzcGVjaWZpY091dHB1dExvY2F0aW9uLCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzKSB7CiAKLQkJaWYgKHBhdGggPT0gbnVsbCkgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlNvdXJjZSBwYXRoIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlBhdGggZm9yIElDbGFzc3BhdGhFbnRyeSBtdXN0IGJlIGFic29sdXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4Y2x1c2lvblBhdHRlcm5zID09IG51bGwpIEFzc2VydC5pc1RydWUoZmFsc2UsICJFeGNsdXNpb24gcGF0dGVybiBzZXQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkluY2x1c2lvbiBwYXR0ZXJuIHNldCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KKwkJaWYgKHBhdGggPT0gbnVsbCkgdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiU291cmNlIHBhdGggY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB0aHJvdyBuZXcgQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CisJCQlleGNsdXNpb25QYXR0ZXJucyA9IENsYXNzcGF0aEVudHJ5LkVYQ0xVREVfTk9ORTsKKwkJfQorCQlpZiAoaW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgeworCQkJaW5jbHVzaW9uUGF0dGVybnMgPSBDbGFzc3BhdGhFbnRyeS5JTkNMVURFX0FMTDsKKwkJfQorCQlpZiAoZXh0cmFBdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCWV4dHJhQXR0cmlidXRlcyA9IENsYXNzcGF0aEVudHJ5Lk5PX0VYVFJBX0FUVFJJQlVURVM7CisJCX0KIAkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeSgKIAkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAogCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UsCkBAIC00MjkxLDExICs0Njc4LDE1IEBACiAJCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzLAogCQkJYm9vbGVhbiBpc0V4cG9ydGVkKSB7CiAKLQkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKSBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVmFyaWFibGUgcGF0aCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCWlmICh2YXJpYWJsZVBhdGggPT0gbnVsbCkgdGhyb3cgbmV3IENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiVmFyaWFibGUgcGF0aCBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCWlmICh2YXJpYWJsZVBhdGguc2VnbWVudENvdW50KCkgPCAxKSB7Ci0JCQlBc3NlcnQuaXNUcnVlKAotCQkJCWZhbHNlLAotCQkJCSJJbGxlZ2FsIGNsYXNzcGF0aCB2YXJpYWJsZSBwYXRoOiBcJyIgKyB2YXJpYWJsZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSArICJcJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl0aHJvdyBuZXcgQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJJbGxlZ2FsIGNsYXNzcGF0aCB2YXJpYWJsZSBwYXRoOiBcJyIgKyB2YXJpYWJsZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSArICJcJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKwkJaWYgKGFjY2Vzc1J1bGVzID09IG51bGwpIHsKKwkJCWFjY2Vzc1J1bGVzID0gQ2xhc3NwYXRoRW50cnkuTk9fQUNDRVNTX1JVTEVTOworCQl9CisJCWlmIChleHRyYUF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJZXh0cmFBdHRyaWJ1dGVzID0gQ2xhc3NwYXRoRW50cnkuTk9fRVhUUkFfQVRUUklCVVRFUzsKIAkJfQogCiAJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCkBAIC00MzEyLDYgKzQ3MDMsMzYgQEAKIAkJCWZhbHNlLCAvLyBubyBhY2Nlc3MgcnVsZXMgdG8gY29tYmluZQogCQkJZXh0cmFBdHRyaWJ1dGVzKTsKIAl9CisJCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgCisJICogYnkgYSBnaXZlbiBjbGFzc3BhdGggZW50cnkuIEZvciB0aGUgZW50cnkga2luZCB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9MSUJSQVJZfSwgCisJICogdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBsaWJyYXJpZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIENsYXNzLVBhdGggc2VjdGlvbiBvZiAKKwkgKiB0aGUgTUFOSUZFU1QuTUYgZmlsZS4gSWYgYSByZWZlcmVuY2VkIEpBUiBmaWxlIGhhcyBmdXJ0aGVyIHJlZmVyZW5jZXMgdG8gb3RoZXIgbGlicmFyeSAKKwkgKiBlbnRyaWVzLCB0aGV5IGFyZSBwcm9jZXNzZWQgcmVjdXJzaXZlbHkgYW5kIGFkZGVkIHRvIHRoZSBsaXN0LiBGb3IgZW50cnkga2luZHMgb3RoZXIgCisJICogdGhhbiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9MSUJSQVJZfSwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KKwkgKiA8cD4gCisJICogV2hlbiBhIG5vbi1udWxsIHByb2plY3QgaXMgcGFzc2VkLCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzdG9yZWQgCisJICogcHJldmlvdXNseSBpbiB0aGUgcHJvamVjdCdzIC5jbGFzc3BhdGggZmlsZSBhcmUgcmV0cmlldmVkIGFuZCBwb3B1bGF0ZWQgaW4gdGhlIAorCSAqIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBlbnRyeS4gSWYgdGhlIHByb2plY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSByYXcgcmVmZXJlbmNlZAorCSAqIGVudHJpZXMgYXJlIHJldHVybmVkIHdpdGhvdXQgYW55IHBlcnNpc3RlZCBhdHRyaWJ1dGVzLiAKKwkgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHN0b3JpbmcgcmVmZXJlbmNlZCBlbnRyaWVzLCBzZWUgCisJICoge0BsaW5rIElKYXZhUHJvamVjdCNzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10sIElDbGFzc3BhdGhFbnRyeVtdLCBJUGF0aCwgCisJICogSVByb2dyZXNzTW9uaXRvcil9LiAKKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGxpYnJhcnlFbnRyeSB0aGUgbGlicmFyeSBlbnRyeSB3aG9zZSByZWZlcmVuY2VkIGVudHJpZXMgYXJlIHNvdWdodCAKKwkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHdoZXJlIHRoZSBwZXJzaXN0ZWQgcmVmZXJlbmNlZCBlbnRyaWVzIHRvIGJlIHJldHJpZXZlZCBmcm9tLiBJZiA8Y29kZT5udWxsPC9jb2RlPgorCSAqIAkJCXBlcnNpc3RlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYXR0ZW1wdGVkIHRvIGJlIHJldHJpdmVkLgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5IHRoZSBnaXZlbiBlbnRyeS4gCisJICogCQkJSWYgbm90IGFwcGxpY2FibGUsIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5IGxpYnJhcnlFbnRyeSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCXJldHVybiBtYW5hZ2VyLmdldFJlZmVyZW5jZWRDbGFzc3BhdGhFbnRyaWVzKGxpYnJhcnlFbnRyeSwgcHJvamVjdCk7CisJfQorCQogCS8qKgogCSAqIFJlbW92ZWQgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4gRG9lcyBub3RoaW5nIGlmIG5vIHZhbHVlIHdhcwogCSAqIHNldCBmb3IgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUuCkBAIC00MzU2LDEyICs0Nzc3LDEyIEBACiAKIAkvKioKIAkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGNoYW5nZWQgbGlzdGVuZXIuCi0JICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCisJICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCiAJICoKIAkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFTdGF0ZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXREZWx0YVN0YXRlKCkucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CiAJfQogCiAJLyoqCkBAIC00MzgwLDEzICs0ODAxLDEzIEBACiAJLyoqCiAJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJlLXByb2Nlc3NpbmcgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lci4KIAkgKiA8cD4KLQkgKiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KIAkgKgogCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByZVByb2Nlc3NpbmdSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVN0YXRlLnJlbW92ZVByZVJlc291cmNlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXREZWx0YVN0YXRlKCkucmVtb3ZlUHJlUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwogCX0KIAogCkBAIC00NTE0LDcgKzQ5MzUsMTkgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdFtdIGFmZmVjdGVkUHJvamVjdHMsIElDbGFzc3BhdGhDb250YWluZXJbXSByZXNwZWN0aXZlQ29udGFpbmVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKGFmZmVjdGVkUHJvamVjdHMubGVuZ3RoICE9IHJlc3BlY3RpdmVDb250YWluZXJzLmxlbmd0aCkKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJQcm9qZWN0cyBhbmQgY29udGFpbmVycyBjb2xsZWN0aW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzaXplIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIlByb2plY3RzIGFuZCBjb250YWluZXJzIGNvbGxlY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpemUiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYWZmZWN0ZWRQcm9qZWN0cy5sZW5ndGggPT0gMSkgeworCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSByZXNwZWN0aXZlQ29udGFpbmVyc1swXTsKKwkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgeworCQkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gYWZmZWN0ZWRQcm9qZWN0c1swXTsKKwkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGV4aXN0aW5nQ29pbnRhaW5lciA9IG1hbmFnZXIuY29udGFpbmVyR2V0KHByb2plY3QsIGNvbnRhaW5lclBhdGgpOworCQkJCWlmIChleGlzdGluZ0NvaW50YWluZXIgPT0gSmF2YU1vZGVsTWFuYWdlci5DT05UQUlORVJfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1MpIHsKKwkJCQkJbWFuYWdlci5jb250YWluZXJCZWluZ0luaXRpYWxpemVkUHV0KHByb2plY3QsIGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lcik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KIAkJU2V0Q29udGFpbmVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBTZXRDb250YWluZXJPcGVyYXRpb24oY29udGFpbmVyUGF0aCwgYWZmZWN0ZWRQcm9qZWN0cywgcmVzcGVjdGl2ZUNvbnRhaW5lcnMpOwogCQlvcGVyYXRpb24ucnVuT3BlcmF0aW9uKG1vbml0b3IpOwogCX0KQEAgLTQ1NDUsNiArNDk3OCw3IEBACiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4KIAkgKiBUaGUgcGF0aCBtdXN0IG5vdCBiZSBudWxsLgorCSAqIFNpbmNlIDMuNSwgdGhlIHBhdGggdG8gYSBsaWJyYXJ5IGNhbiBhbHNvIGJlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHVzaW5nICIuLiIgYXMgdGhlIGZpcnN0IHNlZ21lbnQuIAogCSAqIDxwPgogCSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW5ub3QgYmUgdXNlZCB3aGlsZSB0aGUgcmVzb3VyY2UgdHJlZSBpcyBsb2NrZWQuCiAJICogPHA+CkBAIC00NTY1LDEzICs0OTk5LDE0IEBACiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJaWYgKHBhdGggPT0gbnVsbCkgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlZhcmlhYmxlIHBhdGggY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAocGF0aCA9PSBudWxsKSB0aHJvdyBuZXcgQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJWYXJpYWJsZSBwYXRoIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAkJc2V0Q2xhc3NwYXRoVmFyaWFibGVzKG5ldyBTdHJpbmdbXXt2YXJpYWJsZU5hbWV9LCBuZXcgSVBhdGhbXXsgcGF0aCB9LCBtb25pdG9yKTsKIAl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGVzIGF0IG9uY2UuCiAJICogTnVsbCBwYXRocyBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgcmVtb3ZhbC4KKwkgKiBTaW5jZSAzLjUsIHRoZSBwYXRoIHRvIGEgbGlicmFyeSBjYW4gYWxzbyBiZSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCB1c2luZyAiLi4iIGFzIHRoZSBmaXJzdCBzZWdtZW50LgogCSAqIDxwPgogCSAqIEEgY29tYmluZWQgSmF2YSBlbGVtZW50IGRlbHRhIHdpbGwgYmUgbm90aWZpZWQgdG8gZGVzY3JpYmUgdGhlIGNvcnJlc3BvbmRpbmcKIAkgKiBjbGFzc3BhdGggY2hhbmdlcyByZXN1bHRpbmcgZnJvbSB0aGUgdmFyaWFibGVzIHVwZGF0ZS4gVGhpcyBvcGVyYXRpb24gaXMgYmF0Y2hlZCwKQEAgLTQ2MDAsMjUgKzUwMzUsMjYgQEAKIAkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAotCQlpZiAodmFyaWFibGVOYW1lcy5sZW5ndGggIT0gcGF0aHMubGVuZ3RoKQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVmFyaWFibGUgbmFtZXMgYW5kIHBhdGhzIGNvbGxlY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpemUiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodmFyaWFibGVOYW1lcy5sZW5ndGggIT0gcGF0aHMubGVuZ3RoKQl0aHJvdyBuZXcgQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJWYXJpYWJsZSBuYW1lcyBhbmQgcGF0aHMgY29sbGVjdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2l6ZSIpOyAvLyROT04tTkxTLTEkCiAJCVNldFZhcmlhYmxlc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU2V0VmFyaWFibGVzT3BlcmF0aW9uKHZhcmlhYmxlTmFtZXMsIHBhdGhzLCB0cnVlLyp1cGRhdGUgcHJlZmVyZW5jZXMqLyk7CiAJCW9wZXJhdGlvbi5ydW5PcGVyYXRpb24obW9uaXRvcik7CiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCdzIGNvbXBpbGVyIG9wdGlvbnMgaW5zaWRlIHRoZSBnaXZlbiBvcHRpb25zIG1hcCBhY2NvcmRpbmcKKwkgKiBTZXRzIHRoZSBkZWZhdWx0IGNvbXBpbGVyIG9wdGlvbnMgaW5zaWRlIHRoZSBnaXZlbiBvcHRpb25zIG1hcCBhY2NvcmRpbmcKIAkgKiB0byB0aGUgZ2l2ZW4gY29tcGxpYW5jZS4KIAkgKgotCSAqIDxwPlRoZSBnaXZlbiBjb21wbGlhbmNlIG11c3QgYmUgb25lIG9mIHRoZSBjb21wbGlhbmNlIHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIuCi0JICogU2VlIHtAbGluayAjZ2V0RGVmYXVsdE9wdGlvbnMoKX0gZm9yIGEgbGlzdCBvZiBjb21wbGlhbmNlIHZhbHVlcy48L3A+CisJICogPHA+VGhlIGdpdmVuIGNvbXBsaWFuY2UgbXVzdCBiZSBvbmUgb2YgdGhvc2Ugc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlciwKKwkgKiB0aGF0IGlzIG9uZSBvZiB0aGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX0NPTVBMSUFOQ0V9LgogCSAqCi0JICogPHA+VGhlIGxpc3Qgb2YgbW9kaWZpZWQgb3B0aW9ucyBpczo8L3A+CisJICogPHA+VGhlIGxpc3Qgb2YgbW9kaWZpZWQgb3B0aW9ucyBpcyBjdXJyZW50bHk6PC9wPgogCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNDT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STX08L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBJTEVSX1NPVVJDRX08L2xpPgogCSAqIDxsaT57QGxpbmsgI0NPTVBJTEVSX0NPTVBMSUFOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNDT01QSUxFUl9TT1VSQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNDT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STX08L2xpPgogCSAqIDxsaT57QGxpbmsgI0NPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSfTwvbGk+CiAJICogPGxpPntAbGluayAjQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSfTwvbGk+CisJICogPGxpPntAbGluayAjQ09NUElMRVJfQ09ERUdFTl9JTkxJTkVfSlNSX0JZVEVDT0RFfSBmb3IgY29tcGxpYW5jZSBsZXZlbHMgMS41IGFuZCBncmVhdGVyPC9saT4KIAkgKiA8L3VsPgogCSAqCiAJICogPHA+SWYgdGhlIGdpdmVuIGNvbXBsaWFuY2UgaXMgdW5rbm93biwgdGhlIGdpdmVuIG1hcCBpcyB1bm1vZGlmaWVkLjwvcD4KQEAgLTQ2NzQsOSArNTExMCwxMiBAQAogCSAqIGluY2x1ZGVkIGluIHRoZSBnaXZlbiB0YWJsZSBhcmUgcmVtZW1iZXJlZDsgYWxsIHByZXZpb3VzIG9wdGlvbiBzZXR0aW5ncwogCSAqIGFyZSBmb3Jnb3R0ZW4sIGluY2x1ZGluZyBvbmVzIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZC4KIAkgKiA8cD4KLQkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZQotCSAqIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLQkgKiA8L3A+CisJICogSGVscGVyIGNvbnN0YW50cyBoYXZlIGJlZW4gZGVmaW5lZCBvbiBKYXZhQ29yZSBmb3IgZWFjaCBvZiB0aGUgb3B0aW9uIElEcworCSAqIChjYXRlZ29yaXplZCBpbiBDb2RlIGFzc2lzdCBvcHRpb24gSUQsIENvbXBpbGVyIG9wdGlvbiBJRCBhbmQgQ29yZSBvcHRpb24gSUQpCisJICogYW5kIHNvbWUgb2YgdGhlaXIgYWNjZXB0YWJsZSB2YWx1ZXMgKGNhdGVnb3JpemVkIGluIE9wdGlvbiB2YWx1ZSkuIFNvbWUKKwkgKiBvcHRpb25zIGFjY2VwdCBvcGVuIHZhbHVlIHNldHMgYmV5b25kIHRoZSBkb2N1bWVudGVkIGNvbnN0YW50IHZhbHVlcy4KKwkgKiA8cD4KKwkgKiBOb3RlOiBlYWNoIHJlbGVhc2UgbWF5IGFkZCBuZXcgb3B0aW9ucy4KIAkgKgogCSAqIEBwYXJhbSBuZXdPcHRpb25zCiAJICogICAgICAgICAgICB0aGUgbmV3IG9wdGlvbnMgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OyB2YWx1ZSB0eXBlOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YU1vZGVsRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhTW9kZWxFeGNlcHRpb24uamF2YQppbmRleCBlZDc4NDJjLi5hZWQ3ZmUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhTW9kZWxFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhTW9kZWxFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywxOCArMjMsMjAgQEAKICAqIEphdmEgbW9kZWwgZXhjZXB0aW9ucyBjb250YWluIGEgSmF2YS1zcGVjaWZpYyBzdGF0dXMgb2JqZWN0IGRlc2NyaWJpbmcgdGhlCiAgKiBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgogICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBKYXZhIG1vZGVsIHdoZW4gcHJvYmxlbXMgYXJpc2UsIHNvCi0gKiB0aGVyZSBpcyBnZW5lcmFsbHkgbm8gbmVlZCBmb3IgY2xpZW50cyB0byBjcmVhdGUgaW5zdGFuY2VzLgorICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgSmF2YSBtb2RlbAorICogd2hlbiBwcm9ibGVtcyBhcmlzZSwgc28gdGhlcmUgaXMgZ2VuZXJhbGx5IG5vIG5lZWQgZm9yIGNsaWVudHMgdG8gY3JlYXRlCisgKiBpbnN0YW5jZXMuCiAgKiA8L3A+CiAgKgogICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzCiAgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMKKyAqCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSmF2YU1vZGVsRXhjZXB0aW9uIGV4dGVuZHMgQ29yZUV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzYwMzk4NjU2NTA1ODcxMjg3TDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQotCQorCiAJQ29yZUV4Y2VwdGlvbiBuZXN0ZWRDb3JlRXhjZXB0aW9uOwogLyoqCiAgKiBDcmVhdGVzIGEgSmF2YSBtb2RlbCBleGNlcHRpb24gdGhhdCB3cmFwcGVycyB0aGUgZ2l2ZW4gPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KQEAgLTQ4LDExICs1MCwxMSBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUgogICovCiBwdWJsaWMgSmF2YU1vZGVsRXhjZXB0aW9uKFRocm93YWJsZSBlLCBpbnQgY29kZSkgewotCXRoaXMobmV3IEphdmFNb2RlbFN0YXR1cyhjb2RlLCBlKSk7IAorCXRoaXMobmV3IEphdmFNb2RlbFN0YXR1cyhjb2RlLCBlKSk7CiB9CiAvKioKICAqIENyZWF0ZXMgYSBKYXZhIG1vZGVsIGV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotICogRXF1aXZhbGVudCB0byAKKyAqIEVxdWl2YWxlbnQgdG8KICAqIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbihleGNlcHRpb24sSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DT1JFX0VYQ0VQVElPTjwvY29kZT4uCiAgKgogICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4KQEAgLTg5LDEyICs5MSwxMiBAQAogICogQHJldHVybiBhIHN0YXR1cyBvYmplY3QKICAqLwogcHVibGljIElKYXZhTW9kZWxTdGF0dXMgZ2V0SmF2YU1vZGVsU3RhdHVzKCkgewotCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoKTsKKwlJU3RhdHVzIHN0YXR1cyA9IGdldFN0YXR1cygpOwogCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBJSmF2YU1vZGVsU3RhdHVzKSB7CiAJCXJldHVybiAoSUphdmFNb2RlbFN0YXR1cylzdGF0dXM7CiAJfSBlbHNlIHsKIAkJLy8gQSByZWd1bGFyIElTdGF0dXMgaXMgY3JlYXRlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgQ29yZUV4Y2VwdGlvbi4KLQkJLy8gU2VlIGJ1ZyAxMzQ5MiBTaG91bGQgaGFuZGxlIEphdmFNb2RlbEV4Y2VwdGlvbnMgdGhhdCBjb250YWlucyBDb3JlRXhjZXB0aW9uIG1vcmUgZ3JhY2VmdWxseSAgCisJCS8vIFNlZSBidWcgMTM0OTIgU2hvdWxkIGhhbmRsZSBKYXZhTW9kZWxFeGNlcHRpb25zIHRoYXQgY29udGFpbnMgQ29yZUV4Y2VwdGlvbiBtb3JlIGdyYWNlZnVsbHkKIAkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXModGhpcy5uZXN0ZWRDb3JlRXhjZXB0aW9uKTsKIAl9CiB9CkBAIC0xMTgsNyArMTIwLDcgQEAKIAogLyoqCiAgKiBQcmludHMgdGhpcyBleGNlcHRpb24ncyBzdGFjayB0cmFjZSB0byB0aGUgZ2l2ZW4gcHJpbnQgc3RyZWFtLgotICogCisgKgogICogQHBhcmFtIG91dHB1dCB0aGUgcHJpbnQgc3RyZWFtCiAgKiBAc2luY2UgMy4wCiAgKi8KQEAgLTEzNSw3ICsxMzcsNyBAQAogCiAvKioKICAqIFByaW50cyB0aGlzIGV4Y2VwdGlvbidzIHN0YWNrIHRyYWNlIHRvIHRoZSBnaXZlbiBwcmludCB3cml0ZXIuCi0gKiAKKyAqCiAgKiBAcGFyYW0gb3V0cHV0IHRoZSBwcmludCB3cml0ZXIKICAqIEBzaW5jZSAzLjAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvTmFtaW5nQ29udmVudGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL05hbWluZ0NvbnZlbnRpb25zLmphdmEKaW5kZXggYzRkNDJhOS4uZjJiZTIzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvTmFtaW5nQ29udmVudGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9OYW1pbmdDb252ZW50aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuQXNzaXN0T3B0aW9uczsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JTmFtaW5nUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkludGVybmFsTmFtaW5nQ29udmVudGlvbnM7CkBAIC0yNSwzNiArMjUsMzggQEAKICAqIFRoZSBwb3NzaWJsZSBvcHRpb25zIGFyZSA6CiAgKiA8dWw+CiAgKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSA6IERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIEZpZWxkIE5hbWUuPC9saT4KLSAqIDxsaT4ge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTfSA6IERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIFN0YXRpYyBGaWVsZCBOYW1lLjwvbGk+Ci0gKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTfSA6IERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIExvY2FsIFZhcmlhYmxlIE5hbWUuPC9saT4KLSAqIDxsaT4ge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVN9IDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgQXJndW1lbnQgTmFtZS48L2xpPgogICogPGxpPiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFU30gOiBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBGaWVsZCBOYW1lLjwvbGk+CisgKiAKKyAqIDxsaT4ge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTfSA6IERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIFN0YXRpYyBGaWVsZCBOYW1lLjwvbGk+CiAgKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFU30gOiBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBTdGF0aWMgRmllbGQgTmFtZS48L2xpPgorICogCisgKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSU5BTF9GSUVMRF9QUkVGSVhFU30gOiBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBTdGF0aWMgRmluYWwgRmllbGQgTmFtZS48L2xpPgorICogPGxpPiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfU1VGRklYRVN9IDogRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgU3RhdGljIEZpbmFsIEZpZWxkIE5hbWUuPC9saT4KKyAqIAorICogPGxpPiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFU30gOiBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBMb2NhbCBWYXJpYWJsZSBOYW1lLjwvbGk+CiAgKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTfSA6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIExvY2FsIFZhcmlhYmxlIE5hbWUuPC9saT4KKyAqIAorICogPGxpPiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9BUkdVTUVOVF9QUkVGSVhFU30gOiBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBBcmd1bWVudCBOYW1lLjwvbGk+CiAgKiA8bGk+IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTfSA6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIEFyZ3VtZW50IE5hbWUuPC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CiAgKiA8cD4KLSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUge0BsaW5rIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCl9LgorICogVG8gcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIHtAbGluayBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpfS4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgYW5kIGNvbnN0YW50cyBvbmx5LgogICogPC9wPgotICogCisgKgogICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCiAgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKICAqIEBzaW5jZSAyLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTmFtaW5nQ29udmVudGlvbnMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBHRVRURVJfQk9PTF9OQU1FID0gImlzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEdFVFRFUl9OQU1FID0gImdldCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTRVRURVJfTkFNRSA9ICJzZXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkKIAlzdGF0aWMgY2xhc3MgTmFtaW5nUmVxdWVzdG9yIGltcGxlbWVudHMgSU5hbWluZ1JlcXVlc3RvciB7CiAJCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpFID0gMTA7Ci0JCQorCiAJCS8vIGZvciBhY2NlcHROYW1lV2l0aFByZWZpeEFuZFN1ZmZpeAogCQlwcml2YXRlIGNoYXJbXVtdIGZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKIAkJcHJpdmF0ZSBpbnQgZmlyc3RQcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNDb3VudCA9IDA7CkBAIC02NCwyMiArNjYsNjEgQEAKIAkJcHJpdmF0ZSBpbnQgcHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQgPSAwOwogCQlwcml2YXRlIGNoYXJbXVtdIHByZWZpeEFuZFN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOwogCQlwcml2YXRlIGludCBwcmVmaXhBbmRTdWZmaXhSZXN1bHRzQ291bnQgPSAwOwotCQkKKwogCQkvLyBmb3IgYWNjZXB0TmFtZVdpdGhQcmVmaXgKIAkJcHJpdmF0ZSBjaGFyW11bXSBmaXJzdFByZWZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOwogCQlwcml2YXRlIGludCBmaXJzdFByZWZpeFJlc3VsdHNDb3VudCA9IDA7CiAJCXByaXZhdGUgY2hhcltdW10gcHJlZml4UmVzdWx0cyA9IG5ldyBjaGFyW1NJWkVdW107CiAJCXByaXZhdGUgaW50IHByZWZpeFJlc3VsdHNDb3VudCA9IDA7Ci0JCQorCiAJCS8vIGZvciBhY2NlcHROYW1lV2l0aFN1ZmZpeAogCQlwcml2YXRlIGNoYXJbXVtdIGZpcnN0U3VmZml4UmVzdWx0cyA9IG5ldyBjaGFyW1NJWkVdW107CiAJCXByaXZhdGUgaW50IGZpcnN0U3VmZml4UmVzdWx0c0NvdW50ID0gMDsKIAkJcHJpdmF0ZSBjaGFyW11bXSBzdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKIAkJcHJpdmF0ZSBpbnQgc3VmZml4UmVzdWx0c0NvdW50ID0gMDsKLQkJCisKIAkJLy8gZm9yIGFjY2VwdE5hbWVXaXRob3V0UHJlZml4QW5kU3VmZml4CiAJCXByaXZhdGUgY2hhcltdW10gb3RoZXJSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKIAkJcHJpdmF0ZSBpbnQgb3RoZXJSZXN1bHRzQ291bnQgPSAwOworCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aG91dFByZWZpeEFuZFN1ZmZpeChjaGFyW10gbmFtZSwgaW50IHJldXNlZENoYXJhY3RlcnMpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLm90aGVyUmVzdWx0cy5sZW5ndGg7CisJCQlpZihsZW5ndGggPT0gdGhpcy5vdGhlclJlc3VsdHNDb3VudCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXRoaXMub3RoZXJSZXN1bHRzLAorCQkJCQkwLAorCQkJCQl0aGlzLm90aGVyUmVzdWx0cyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdW10sCisJCQkJCTAsCisJCQkJCWxlbmd0aCk7CisJCQl9CisJCQl0aGlzLm90aGVyUmVzdWx0c1t0aGlzLm90aGVyUmVzdWx0c0NvdW50KytdID0gbmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGludCByZXVzZWRDaGFyYWN0ZXJzKSB7CisJCQlpZihpc0ZpcnN0UHJlZml4KSB7CisJCQkJaW50IGxlbmd0aCA9IHRoaXMuZmlyc3RQcmVmaXhSZXN1bHRzLmxlbmd0aDsKKwkJCQlpZihsZW5ndGggPT0gdGhpcy5maXJzdFByZWZpeFJlc3VsdHNDb3VudCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJdGhpcy5maXJzdFByZWZpeFJlc3VsdHMsCisJCQkJCQkwLAorCQkJCQkJdGhpcy5maXJzdFByZWZpeFJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxlbmd0aCk7CisJCQkJfQorCQkJCXRoaXMuZmlyc3RQcmVmaXhSZXN1bHRzW3RoaXMuZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOworCQkJfSBlbHNleworCQkJCWludCBsZW5ndGggPSB0aGlzLnByZWZpeFJlc3VsdHMubGVuZ3RoOworCQkJCWlmKGxlbmd0aCA9PSB0aGlzLnByZWZpeFJlc3VsdHNDb3VudCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJdGhpcy5wcmVmaXhSZXN1bHRzLAorCQkJCQkJMCwKKwkJCQkJCXRoaXMucHJlZml4UmVzdWx0cyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdW10sCisJCQkJCQkwLAorCQkJCQkJbGVuZ3RoKTsKKwkJCQl9CisJCQkJdGhpcy5wcmVmaXhSZXN1bHRzW3RoaXMucHJlZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKKwkJCX0KKwkJfQorCiAJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGJvb2xlYW4gaXNGaXJzdFN1ZmZpeCwgaW50IHJldXNlZENoYXJhY3RlcnMpIHsKIAkJCWlmKGlzRmlyc3RQcmVmaXggJiYgaXNGaXJzdFN1ZmZpeCkgewogCQkJCWludCBsZW5ndGggPSB0aGlzLmZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzLmxlbmd0aDsKQEAgLTkxLDcgKzEzMiw3IEBACiAJCQkJCQkwLAogCQkJCQkJbGVuZ3RoKTsKIAkJCQl9Ci0JCQkJdGhpcy5maXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c1t0aGlzLmZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOwkJCQorCQkJCXRoaXMuZmlyc3RQcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNbdGhpcy5maXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKIAkJCX0gZWxzZSBpZiAoaXNGaXJzdFByZWZpeCkgewogCQkJCWludCBsZW5ndGggPSB0aGlzLmZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0cy5sZW5ndGg7CiAJCQkJaWYobGVuZ3RoID09IHRoaXMuZmlyc3RQcmVmaXhBbmRTdWZmaXhSZXN1bHRzQ291bnQpIHsKQEAgLTEyOCwzMiArMTY5LDYgQEAKIAkJCX0KIAkJfQogCi0JCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGludCByZXVzZWRDaGFyYWN0ZXJzKSB7Ci0JCQlpZihpc0ZpcnN0UHJlZml4KSB7Ci0JCQkJaW50IGxlbmd0aCA9IHRoaXMuZmlyc3RQcmVmaXhSZXN1bHRzLmxlbmd0aDsKLQkJCQlpZihsZW5ndGggPT0gdGhpcy5maXJzdFByZWZpeFJlc3VsdHNDb3VudCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQkJdGhpcy5maXJzdFByZWZpeFJlc3VsdHMsCi0JCQkJCQkwLAotCQkJCQkJdGhpcy5maXJzdFByZWZpeFJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAotCQkJCQkJMCwKLQkJCQkJCWxlbmd0aCk7Ci0JCQkJfQotCQkJCXRoaXMuZmlyc3RQcmVmaXhSZXN1bHRzW3RoaXMuZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOwotCQkJfSBlbHNlewotCQkJCWludCBsZW5ndGggPSB0aGlzLnByZWZpeFJlc3VsdHMubGVuZ3RoOwotCQkJCWlmKGxlbmd0aCA9PSB0aGlzLnByZWZpeFJlc3VsdHNDb3VudCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQkJdGhpcy5wcmVmaXhSZXN1bHRzLAotCQkJCQkJMCwKLQkJCQkJCXRoaXMucHJlZml4UmVzdWx0cyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdW10sCi0JCQkJCQkwLAotCQkJCQkJbGVuZ3RoKTsKLQkJCQl9Ci0JCQkJdGhpcy5wcmVmaXhSZXN1bHRzW3RoaXMucHJlZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKLQkJCX0KLQkJfQotCiAJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RTdWZmaXgsIGludCByZXVzZWRDaGFyYWN0ZXJzKSB7CiAJCQlpZihpc0ZpcnN0U3VmZml4KSB7CiAJCQkJaW50IGxlbmd0aCA9IHRoaXMuZmlyc3RTdWZmaXhSZXN1bHRzLmxlbmd0aDsKQEAgLTE3OSwyMSArMTk0LDggQEAKIAkJCQl0aGlzLnN1ZmZpeFJlc3VsdHNbdGhpcy5zdWZmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOwogCQkJfQogCQl9Ci0KLQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZVdpdGhvdXRQcmVmaXhBbmRTdWZmaXgoY2hhcltdIG5hbWUsIGludCByZXVzZWRDaGFyYWN0ZXJzKSB7Ci0JCQlpbnQgbGVuZ3RoID0gdGhpcy5vdGhlclJlc3VsdHMubGVuZ3RoOwotCQkJaWYobGVuZ3RoID09IHRoaXMub3RoZXJSZXN1bHRzQ291bnQpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQl0aGlzLm90aGVyUmVzdWx0cywKLQkJCQkJMCwKLQkJCQkJdGhpcy5vdGhlclJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAotCQkJCQkwLAotCQkJCQlsZW5ndGgpOwotCQkJfQotCQkJdGhpcy5vdGhlclJlc3VsdHNbdGhpcy5vdGhlclJlc3VsdHNDb3VudCsrXSA9IG5hbWU7Ci0JCX0KIAkJcHVibGljIGNoYXJbXVtdIGdldFJlc3VsdHMoKXsKLQkJCWludCBjb3VudCA9IAorCQkJaW50IGNvdW50ID0KIAkJCQl0aGlzLmZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQKIAkJCQkrIHRoaXMuZmlyc3RQcmVmaXhBbmRTdWZmaXhSZXN1bHRzQ291bnQKIAkJCQkrIHRoaXMucHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQKQEAgLTIwMywxNiArMjA1LDE2IEBACiAJCQkJKyB0aGlzLmZpcnN0U3VmZml4UmVzdWx0c0NvdW50CiAJCQkJKyB0aGlzLnN1ZmZpeFJlc3VsdHNDb3VudAogCQkJCSsgdGhpcy5vdGhlclJlc3VsdHNDb3VudDsKLQkJCQkKKwogCQkJY2hhcltdW10gcmVzdWx0cyA9IG5ldyBjaGFyW2NvdW50XVtdOwotCQkJCisKIAkJCWludCBpbmRleCA9IDA7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZmlyc3RQcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCB0aGlzLmZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQpOwogCQkJaW5kZXggKz0gdGhpcy5maXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50OwogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIHRoaXMuZmlyc3RQcmVmaXhBbmRTdWZmaXhSZXN1bHRzQ291bnQpOwogCQkJaW5kZXggKz0gdGhpcy5maXJzdFByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudDsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCB0aGlzLnByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50KTsKLQkJCWluZGV4ICs9IHRoaXMucHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQ7CQkKKwkJCWluZGV4ICs9IHRoaXMucHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQ7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucHJlZml4QW5kU3VmZml4UmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIHRoaXMucHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50KTsKIAkJCWluZGV4ICs9IHRoaXMucHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50OwogCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZpcnN0UHJlZml4UmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIHRoaXMuZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQpOwpAQCAtMjI0LDU0ICsyMjYsODYgQEAKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdWZmaXhSZXN1bHRzLCAwLCByZXN1bHRzLCBpbmRleCwgdGhpcy5zdWZmaXhSZXN1bHRzQ291bnQpOwogCQkJaW5kZXggKz0gdGhpcy5zdWZmaXhSZXN1bHRzQ291bnQ7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMub3RoZXJSZXN1bHRzLCAwLCByZXN1bHRzLCBpbmRleCwgdGhpcy5vdGhlclJlc3VsdHNDb3VudCk7Ci0JCQkKKwogCQkJcmV0dXJuIHJlc3VsdHM7CiAJCX0KIAl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEdFVFRFUl9CT09MX05BTUUgPSAiaXMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gR0VUVEVSX05BTUUgPSAiZ2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VUVEVSX05BTUUgPSAic2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisKKworCS8qKgorCSAqIFZhcmlhYmxlIGtpbmQgd2hpY2ggcmVwcmVzZW50cyBhIHN0YXRpYyBmaWVsZC4KKwkgKiAKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVktfU1RBVElDX0ZJRUxEID0gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5WS19TVEFUSUNfRklFTEQ7CisJLyoqCisJICogVmFyaWFibGUga2luZCB3aGljaCByZXByZXNlbnRzIGFuIGluc3RhbmNlIGZpZWxkLgorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWS19JTlNUQU5DRV9GSUVMRCA9IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuVktfSU5TVEFOQ0VfRklFTEQ7CisJLyoqCisJICogVmFyaWFibGUga2luZCB3aGljaCByZXByZXNlbnRzIGEgc3RhdGljIGZpbmFsIGZpZWxkLgorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWS19TVEFUSUNfRklOQUxfRklFTEQgPSBJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLlZLX1NUQVRJQ19GSU5BTF9GSUVMRDsKKwkvKioKKwkgKiBWYXJpYWJsZSBraW5kIHdoaWNoIHJlcHJlc2VudHMgYW4gYXJndW1lbnQuCisJICogCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZLX1BBUkFNRVRFUiA9IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuVktfUEFSQU1FVEVSOworCS8qKgorCSAqIFZhcmlhYmxlIGtpbmQgd2hpY2ggcmVwcmVzZW50cyBhIGxvY2FsIHZhcmlhYmxlLgorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWS19MT0NBTCA9IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuVktfTE9DQUw7CiAJCi0JcHJpdmF0ZSBOYW1pbmdDb252ZW50aW9ucygpIHsKLQkJLy8gTm90IGluc3RhbnRpYWJsZQotCX0KKwkvKioKKwkgKiBUaGUgYmFzZSBuYW1lIGFzc29jaWF0ZWQgdG8gdGhpcyBiYXNlIG5hbWUga2luZCBpcyBhIHNpbXBsZSBuYW1lLgorCSAqIFdoZW4gdGhpcyBiYXNlIG5hbWUgaXMgdXNlZCB0aGUgd2hvbGUgbmFtZSBpcyBjb25zaWRlcmVkLgorCSAqIAorCSAqIEBzZWUgI3N1Z2dlc3RWYXJpYWJsZU5hbWVzKGludCwgaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCwgaW50LCBTdHJpbmdbXSwgYm9vbGVhbikKKwkgKiAKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQktfTkFNRSA9IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuQktfU0lNUExFX05BTUU7CisJCisJLyoqCisJICogVGhlIGJhc2UgbmFtZSBhc3NvY2lhdGVkIHRvIHRoaXMgYmFzZSBuYW1lIGtpbmQgaXMgYSBzaW1wbGUgdHlwZSBuYW1lLgorCSAqIFdoZW4gdGhpcyBiYXNlIG5hbWUgaXMgdXNlZCBhbGwgdGhlIHdvcmRzIG9mIHRoZSBuYW1lIGFyZSBjb25zaWRlcmVkLgorCSAqIAorCSAqIEBzZWUgI3N1Z2dlc3RWYXJpYWJsZU5hbWVzKGludCwgaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCwgaW50LCBTdHJpbmdbXSwgYm9vbGVhbikKKwkgKiAKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQktfVFlQRV9OQU1FID0gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5CS19TSU1QTEVfVFlQRV9OQU1FOwogCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJlbW92ZVByZWZpeEFuZFN1ZmZpeChjaGFyW10gbmFtZSwgY2hhcltdW10gcHJlZml4ZXMsIGNoYXJbXVtdIHN1ZmZpeGVzKSB7Ci0JCS8vIHJlbW92ZSBsb25nZXIgcHJlZml4Ci0JCWNoYXJbXSB3aXRob3V0UHJlZml4TmFtZSA9IG5hbWU7Ci0JCWlmIChwcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQlpbnQgYmVzdExlbmd0aCA9IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljaGFyW10gcHJlZml4ID0gcHJlZml4ZXNbaV07Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHByZWZpeCwgbmFtZSkpIHsKLQkJCQkJaW50IGN1cnJMZW4gPSBwcmVmaXgubGVuZ3RoOwotCQkJCQlib29sZWFuIGxhc3RDaGFySXNMZXR0ZXIgPSBTY2FubmVySGVscGVyLmlzTGV0dGVyKHByZWZpeFtjdXJyTGVuIC0gMV0pOwotCQkJCQlpZighbGFzdENoYXJJc0xldHRlciB8fCAobGFzdENoYXJJc0xldHRlciAmJiBuYW1lLmxlbmd0aCA+IGN1cnJMZW4gJiYgU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShuYW1lW2N1cnJMZW5dKSkpIHsKLQkJCQkJCWlmIChiZXN0TGVuZ3RoIDwgY3VyckxlbiAmJiBuYW1lLmxlbmd0aCAhPSBjdXJyTGVuKSB7Ci0JCQkJCQkJd2l0aG91dFByZWZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIGN1cnJMZW4sIG5hbWUubGVuZ3RoKTsKLQkJCQkJCQliZXN0TGVuZ3RoID0gY3VyckxlbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0Q2hhcnNUb1N0cmluZyhjaGFyW11bXSBjKSB7CisJCWludCBsZW5ndGggPSBjID09IG51bGwgPyAwIDogYy5sZW5ndGg7CisJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXNbaV0gPSBTdHJpbmcudmFsdWVPZihjW2ldKTsKKwkJfQorCQlyZXR1cm4gczsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gY29udmVydFN0cmluZ1RvQ2hhcnMoU3RyaW5nW10gcykgeworCQlpbnQgbGVuZ3RoID0gcyA9PSBudWxsID8gMCA6IHMubGVuZ3RoOworCQljaGFyW11bXSBjID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZihzW2ldID09IG51bGwpIHsKKwkJCQljW2ldID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQkJfSBlbHNlIHsKKwkJCQljW2ldID0gc1tpXS50b0NoYXJBcnJheSgpOwogCQkJfQogCQl9Ci0JCQotCQkvLyByZW1vdmUgbG9uZ2VyIHN1ZmZpeAotCQljaGFyW10gd2l0aG91dFN1ZmZpeE5hbWUgPSB3aXRob3V0UHJlZml4TmFtZTsKLQkJaWYoc3VmZml4ZXMgIT0gbnVsbCkgewotCQkJaW50IGJlc3RMZW5ndGggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCWNoYXJbXSBzdWZmaXggPSBzdWZmaXhlc1tpXTsKLQkJCQlpZihDaGFyT3BlcmF0aW9uLmVuZHNXaXRoKHdpdGhvdXRQcmVmaXhOYW1lLCBzdWZmaXgpKSB7Ci0JCQkJCWludCBjdXJyTGVuID0gc3VmZml4Lmxlbmd0aDsKLQkJCQkJaWYoYmVzdExlbmd0aCA8IGN1cnJMZW4gJiYgd2l0aG91dFByZWZpeE5hbWUubGVuZ3RoICE9IGN1cnJMZW4pIHsKLQkJCQkJCXdpdGhvdXRTdWZmaXhOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3aXRob3V0UHJlZml4TmFtZSwgMCwgd2l0aG91dFByZWZpeE5hbWUubGVuZ3RoIC0gY3Vyckxlbik7Ci0JCQkJCQliZXN0TGVuZ3RoID0gY3VyckxlbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJd2l0aG91dFN1ZmZpeE5hbWVbMF0gPSBTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKHdpdGhvdXRTdWZmaXhOYW1lWzBdKTsKLQkJcmV0dXJuIHdpdGhvdXRTdWZmaXhOYW1lOworCQlyZXR1cm4gYzsKIAl9CiAKIAkvKioKQEAgLTI5MCwyMSArMzI0LDE5IEBACiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCiAJICogPC9wPgotIAkgKiAKKyAJICoKIAkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCiAJICogQHBhcmFtIGFyZ3VtZW50TmFtZSBhcmd1bWVudCdzIG5hbWUuCiAJICogQHJldHVybiBjaGFyW10gdGhlIG5hbWUgd2l0aG91dCBwcmVmaXggYW5kIHN1ZmZpeC4KIAkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKIAkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRCYXNlTmFtZShpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0KX0gaW5zdGVhZCB3aXRoIHtAbGluayAjVktfUEFSQU1FVEVSfSBhcyB2YXJpYWJsZSBraW5kLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckFyZ3VtZW50TmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBhcmd1bWVudE5hbWUpIHsKLQkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMoamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCXJldHVybglyZW1vdmVQcmVmaXhBbmRTdWZmaXgoCi0JCQlhcmd1bWVudE5hbWUsCi0JCQlhc3Npc3RPcHRpb25zLmFyZ3VtZW50UHJlZml4ZXMsCi0JCQlhc3Npc3RPcHRpb25zLmFyZ3VtZW50U3VmZml4ZXMpOworCQlyZXR1cm4gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5yZW1vdmVWYXJpYWJsZVByZWZpeEFuZFN1ZmZpeChWS19QQVJBTUVURVIsIGphdmFQcm9qZWN0LCBhcmd1bWVudE5hbWUpOwogCX0KLQkKKwogCS8qKgogCSAqIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBmcm9tIGFuIGFyZ3VtZW50IG5hbWUuCiAJICogPHA+CkBAIC0zMjEsMTcgKzM1MywxOCBAQAogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgogCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgogCSAqIDwvcD4KLSAJICogCisgCSAqCiAJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGFyZ3VtZW50LgogCSAqIEBwYXJhbSBhcmd1bWVudE5hbWUgYXJndW1lbnQncyBuYW1lLgogCSAqIEByZXR1cm4gY2hhcltdIHRoZSBuYW1lIHdpdGhvdXQgcHJlZml4IGFuZCBzdWZmaXguCiAJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCiAJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0QmFzZU5hbWUoaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCl9IGluc3RlYWQgd2l0aCB7QGxpbmsgI1ZLX1BBUkFNRVRFUn0gYXMgdmFyaWFibGUga2luZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JBcmd1bWVudE5hbWUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgYXJndW1lbnROYW1lKSB7CiAJCXJldHVybiBTdHJpbmcudmFsdWVPZihyZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JBcmd1bWVudE5hbWUoamF2YVByb2plY3QsIGFyZ3VtZW50TmFtZS50b0NoYXJBcnJheSgpKSk7CiAJfQotCiAJLyoqCiAJICogUmVtb3ZlIHByZWZpeCBhbmQgc3VmZml4IGZyb20gYSBmaWVsZCBuYW1lLgogCSAqIDxwPgpAQCAtMzQxLDcgKzM3NCw3IEBACiAJICogbmFtZSA8Y29kZT5wcmVGaWVsZHN1ZjwvY29kZT4uCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSB9ICwgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDoge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9IH0gLAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFU30gZm9yIGluc3RhbmNlIGZpZWxkIGFuZCAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTfSBmb3Igc3RhdGljIGZpZWxkLgogCSAqIDwvcD4KQEAgLTM0OSw3ICszODIsNyBAQAogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgogCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZC4KIAkgKiBAcGFyYW0gZmllbGROYW1lIGZpZWxkJ3MgbmFtZS4KIAkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCkBAIC0zNTgsMTQgKzM5MSwxNSBAQAogCSAqIEBzZWUgRmxhZ3MKIAkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKIAkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRCYXNlTmFtZShpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0KX0gaW5zdGVhZAorCSAqIHdpdGgge0BsaW5rICNWS19JTlNUQU5DRV9GSUVMRH0gb3Ige0BsaW5rICNWS19TVEFUSUNfRklFTER9IGFzIHZhcmlhYmxlIGtpbmQuCiAJICovCiAJcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycykgewotCQlib29sZWFuIGlzU3RhdGljID0gRmxhZ3MuaXNTdGF0aWMobW9kaWZpZXJzKTsKLQkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMoamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCXJldHVybglyZW1vdmVQcmVmaXhBbmRTdWZmaXgoCi0JCQlmaWVsZE5hbWUsCi0JCQlpc1N0YXRpYyA/IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRQcmVmaXhlcyA6IGFzc2lzdE9wdGlvbnMuZmllbGRQcmVmaXhlcywKLQkJCWlzU3RhdGljID8gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaWVsZFN1ZmZpeGVzIDogYXNzaXN0T3B0aW9ucy5maWVsZFN1ZmZpeGVzKTsKKwkJcmV0dXJuIEludGVybmFsTmFtaW5nQ29udmVudGlvbnMucmVtb3ZlVmFyaWFibGVQcmVmaXhBbmRTdWZmaXgoCisJCQkJRmxhZ3MuaXNTdGF0aWMobW9kaWZpZXJzKSA/IFZLX1NUQVRJQ19GSUVMRCA6IFZLX0lOU1RBTkNFX0ZJRUxELAorCQkJCWphdmFQcm9qZWN0LAorCQkJCWZpZWxkTmFtZSk7CiAJfQogCiAJLyoqCkBAIC0zNzcsNyArNDExLDcgQEAKIAkgKiBuYW1lIDxjb2RlPnByZUZpZWxkc3VmPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfU1VGRklYRVN9IGZvciBpbnN0YW5jZSBmaWVsZCBhbmQgIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9QUkVGSVhFU30sCiAJICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFU30gZm9yIHN0YXRpYyBmaWVsZC4KIAkgKiA8L3A+CkBAIC0zODUsNyArNDE5LDcgQEAKIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgZmllbGQuCiAJICogQHBhcmFtIGZpZWxkTmFtZSBmaWVsZCdzIG5hbWUuCiAJICogQHBhcmFtIG1vZGlmaWVycyBmaWVsZCdzIG1vZGlmaWVycyBhcyBkZWZpbmVkIGJ5IHRoZSBjbGFzcwpAQCAtMzk0LDEwICs0MjgsMTQgQEAKIAkgKiBAc2VlIEZsYWdzCiAJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCiAJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0QmFzZU5hbWUoaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCl9IGluc3RlYWQKKwkgKiB3aXRoIHtAbGluayAjVktfSU5TVEFOQ0VfRklFTER9IG9yIHtAbGluayAjVktfU1RBVElDX0ZJRUxEfSBhcyB2YXJpYWJsZSBraW5kLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMpIHsKIAkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShqYXZhUHJvamVjdCwgZmllbGROYW1lLnRvQ2hhckFycmF5KCksIG1vZGlmaWVycykpOwogCX0KKwogCS8qKgogCSAqIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBmcm9tIGEgbG9jYWwgdmFyaWFibGUgbmFtZS4KIAkgKiA8cD4KQEAgLTQwNywyOCArNDQ1LDI2IEBACiAJICogbmFtZSA8Y29kZT5wcmVMb2NhbHN1ZjwvY29kZT4uCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFU30gYW5kIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFU30gYW5kCiAJICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTfS4KIAkgKiA8L3A+CiAJICogPHA+CiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlLgogCSAqIEBwYXJhbSBsb2NhbE5hbWUgdmFyaWFibGUncyBuYW1lLgogCSAqIEByZXR1cm4gY2hhcltdIHRoZSBuYW1lIHdpdGhvdXQgcHJlZml4IGFuZCBzdWZmaXguCiAJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCiAJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0QmFzZU5hbWUoaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCl9IGluc3RlYWQgd2l0aCB7QGxpbmsgI1ZLX0xPQ0FMfSBhcyB2YXJpYWJsZSBraW5kLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckxvY2FsVmFyaWFibGVOYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGxvY2FsTmFtZSkgewotCQlBc3Npc3RPcHRpb25zIGFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKLQkJcmV0dXJuCXJlbW92ZVByZWZpeEFuZFN1ZmZpeCgKLQkJCWxvY2FsTmFtZSwKLQkJCWFzc2lzdE9wdGlvbnMubG9jYWxQcmVmaXhlcywKLQkJCWFzc2lzdE9wdGlvbnMubG9jYWxTdWZmaXhlcyk7CisJCXJldHVybiBJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnJlbW92ZVZhcmlhYmxlUHJlZml4QW5kU3VmZml4KFZLX0xPQ0FMLCBqYXZhUHJvamVjdCwgbG9jYWxOYW1lKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgcHJlZml4IGFuZCBzdWZmaXggZnJvbSBhIGxvY2FsIHZhcmlhYmxlIG5hbWUuCiAJICogPHA+CkBAIC00MzgsNjcgKzQ3NCw4NiBAQAogCSAqIG5hbWUgPGNvZGU+cHJlTG9jYWxzdWY8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfUFJFRklYRVN9IGFuZCAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfUFJFRklYRVN9IGFuZAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFU30uCiAJICogPC9wPgogCSAqIDxwPgogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgogCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB2YXJpYWJsZS4KIAkgKiBAcGFyYW0gbG9jYWxOYW1lIHZhcmlhYmxlJ3MgbmFtZS4KIAkgKiBAcmV0dXJuIGNoYXJbXSB0aGUgbmFtZSB3aXRob3V0IHByZWZpeCBhbmQgc3VmZml4LgogCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKQogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEJhc2VOYW1lKGludCwgU3RyaW5nLCBJSmF2YVByb2plY3QpfSBpbnN0ZWFkIHdpdGgge0BsaW5rICNWS19MT0NBTH0gYXMgdmFyaWFibGUga2luZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JMb2NhbFZhcmlhYmxlTmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBsb2NhbE5hbWUpIHsKIAkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckxvY2FsVmFyaWFibGVOYW1lKGphdmFQcm9qZWN0LCBsb2NhbE5hbWUudG9DaGFyQXJyYXkoKSkpOwogCX0KLQotCS8qKgotCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGFuIGFyZ3VtZW50LiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGFyZ3VtZW50J3MgdHlwZQotCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgYWRkZWQuCi0JICogPHA+Ci0JICogSWYgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiwgdGhlIHByZWZpeCBmb3IgYXJndW1lbnQgaXMgPGNvZGU+cHJlPC9jb2RlPgotCSAqIGFuZCB0aGUgc3VmZml4IGZvciBhcmd1bWVudCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Bvc2VkIG5hbWVzIGFyZSA8Y29kZT5wcmVUeXBlTmFtZXN1ZjwvY29kZT4KLQkgKiBhbmQgPGNvZGU+cHJlTmFtZXN1ZjwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHByZWZpeCBvciBzdWZmaXggdGhlIHByb3Bvc2FscyBhcmUgPGNvZGU+dHlwZU5hbWU8L2NvZGU+Ci0JICogYW5kIDxjb2RlPm5hbWU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVN9IGFuZCAKLQkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVN9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLQkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGFyZ3VtZW50LgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSBhcmd1bWVudCdzIHR5cGUuCi0JICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIGFyZ3VtZW50J3MgdHlwZS4KLQkgKiBAcGFyYW0gZGltIGFyZ3VtZW50J3MgZGltZW5zaW9uICgwIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYW4gYXJyYXkpLgotCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgotCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgotCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCi0JICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCi0JICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW11bXSBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7Ci0JCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7Ci0JCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEFyZ3VtZW50TmFtZXMoCi0JCQlqYXZhUHJvamVjdCwKLQkJCXBhY2thZ2VOYW1lLAotCQkJcXVhbGlmaWVkVHlwZU5hbWUsCi0JCQlkaW0sCi0JCQludWxsLAotCQkJZXhjbHVkZWROYW1lcywKLQkJCXJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7Ci0JfQogCQogCS8qKgorCSAqIFJldHVybnMgYSBiYXNlIG5hbWUgd2hpY2ggY291bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2l2ZW4gdmFyaWFibGUgbmFtZSB3aXRoIHtAbGluayAjc3VnZ2VzdFZhcmlhYmxlTmFtZXMoaW50LCBpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0LCBpbnQsIFN0cmluZ1tdLCBib29sZWFuKX0uCisJICogPHA+CisJICogZS5nLjxicj4KKwkgKiBJZiB0aGUgdmFyaWFibGUgaXMgYSB7QGxpbmsgI1ZLX0xPQ0FMfSBhbmQgdGhlIHZhcmlhYmxlIG5hbWUgaXMgPGNvZGU+dmFyaWFibGVOYW1lPC9jb2RlPiB0aGVuIHRoZSBiYXNlIG5hbWUgd2lsbCBiZSA8Y29kZT52YXJpYWJsZU5hbWU8L2NvZGU+Ljxicj4KKwkgKiBJZiB0aGUgdmFyaWFibGUgaXMgYSB7QGxpbmsgI1ZLX1NUQVRJQ19GSU5BTF9GSUVMRH0gYW5kIHRoZSB2YXJpYWJsZSBuYW1lIGlzIDxjb2RlPlZBUklBQkxFX05BTUU8L2NvZGU+IHRoZW4gdGhlIGJhc2UgbmFtZSB3aWxsIGJlIDxjb2RlPnZhcmlhYmxlTmFtZTwvY29kZT4uPGJyPgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBQcmVmaXhlcyBhbmQgc3VmZml4ZXMgZGVmaW5lZCBpbiBKYXZhQ29yZSBvcHRpb25zIHdpbGwgYmUgYWxzbyByZW1vdmVkIGZyb20gdGhlIHZhcmlhYmxlIG5hbWUuPGJyPgorCSAqIEVhY2ggdmFyaWFibGUga2luZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnM6CisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1ZLX1BBUkFNRVRFUn06IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTfSBhbmQge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVN9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNWS19MT0NBTH06IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTfSBhbmQge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfU1VGRklYRVN9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNWS19JTlNUQU5DRV9GSUVMRH06IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSBhbmQge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfU1VGRklYRVN9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNWS19TVEFUSUNfRklFTER9OiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVN9IGFuZCB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVN9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNWS19TVEFUSUNfRklOQUxfRklFTER9OiB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfUFJFRklYRVN9IGFuZCB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfU1VGRklYRVN9PC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBlLmcuPGJyPgorCSAqIElmIHRoZSB2YXJpYWJsZSBpcyBhIHtAbGluayAjVktfTE9DQUx9LCB0aGUgdmFyaWFibGUgbmFtZSBpcyA8Y29kZT5wcmVWYXJpYWJsZU5hbWVzdWY8L2NvZGU+LCBhIHBvc3NpYmxlIHByZWZpeCBpcyA8Y29kZT5wcmU8L2NvZGU+IGFuZCBhIHBvc3NpYmxlIHN1ZmZpeCBpcyA8Y29kZT5zdWY8L2NvZGU+CisJICogdGhlbiB0aGUgYmFzZSBuYW1lIHdpbGwgYmUgPGNvZGU+dmFyaWFibGVOYW1lPC9jb2RlPi48YnI+CisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB2YXJpYWJsZUtpbmQgc3BlY2lmaWVzIHdoYXQgdHlwZSB0aGUgdmFyaWFibGUgaXM6IHtAbGluayAjVktfTE9DQUx9LCB7QGxpbmsgI1ZLX1BBUkFNRVRFUn0sIHtAbGluayAjVktfU1RBVElDX0ZJRUxEfSwKKwkgKiB7QGxpbmsgI1ZLX0lOU1RBTkNFX0ZJRUxEfSBvciB7QGxpbmsgI1ZLX1NUQVRJQ19GSU5BTF9GSUVMRH0uCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZSBhIHZhcmlhYmxlIG5hbWUKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgdmFyaWFibGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdGFrZSBpbnRvIGFjY291bnQgb25seSB3b3Jrc3BhY2Ugc2V0dGluZ3MuCisJICogCisJICogQHNlZSAjc3VnZ2VzdFZhcmlhYmxlTmFtZXMoaW50LCBpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0LCBpbnQsIFN0cmluZ1tdLCBib29sZWFuKQorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZSgKKwkJCWludCB2YXJpYWJsZUtpbmQsCisJCQlTdHJpbmcgdmFyaWFibGVOYW1lLAorCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLmdldEJhc2VOYW1lKHZhcmlhYmxlS2luZCwgamF2YVByb2plY3QsIHZhcmlhYmxlTmFtZS50b0NoYXJBcnJheSgpLCB0cnVlKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGludCBnZXRGaWVsZFZhcmlhYmxlS2luZChpbnQgbW9kaWZpZXJzKSB7CisJCWlmIChGbGFncy5pc1N0YXRpYyhtb2RpZmllcnMpKSB7CisJCQlpZiAoRmxhZ3MuaXNGaW5hbChtb2RpZmllcnMpKSB7CisJCQkJcmV0dXJuIFZLX1NUQVRJQ19GSU5BTF9GSUVMRDsKKwkJCX0KKwkJCXJldHVybiBWS19TVEFUSUNfRklFTEQ7CisJCX0KKwkJcmV0dXJuIFZLX0lOU1RBTkNFX0ZJRUxEOworCX0KKworCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzdWdnZXN0QWNjZXNzb3JOYW1lKElKYXZhUHJvamVjdCBwcm9qZWN0LCBjaGFyW10gZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzKSB7CisJCWNoYXJbXSBuYW1lID0gSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5nZXRCYXNlTmFtZShnZXRGaWVsZFZhcmlhYmxlS2luZChtb2RpZmllcnMpLCBwcm9qZWN0LCBmaWVsZE5hbWUsIGZhbHNlKTsKKwkJaWYgKG5hbWUubGVuZ3RoID4gMCAmJiBTY2FubmVySGVscGVyLmlzTG93ZXJDYXNlKG5hbWVbMF0pKSB7CisJCQlpZiAobmFtZS5sZW5ndGggPT0gMSB8fCAhU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShuYW1lWzFdKSkgeworCQkJCW5hbWVbMF0gPSBTY2FubmVySGVscGVyLnRvVXBwZXJDYXNlKG5hbWVbMF0pOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgogCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGFuIGFyZ3VtZW50LiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGFyZ3VtZW50J3MgdHlwZQogCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgYWRkZWQuCiAJICogPHA+CkBAIC01MDgsMTQgKzU2MywxNCBAQAogCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTfSBhbmQgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTfSBhbmQKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVN9LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2Ugb2YgdGhlIGFyZ3VtZW50J3MgdHlwZS4KIAkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUgYXJndW1lbnQncyB0eXBlLgpAQCAtNTI1LDYgKzU4MCw1OSBAQAogCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCiAJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCiAJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc3VnZ2VzdFZhcmlhYmxlTmFtZXMoaW50LCBpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0LCBpbnQsIFN0cmluZ1tdLCBib29sZWFuKX0gaW5zdGVhZCB3aXRoIHtAbGluayAjVktfUEFSQU1FVEVSfSBhcyB2YXJpYWJsZSBraW5kLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdEFyZ3VtZW50TmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgY2hhcltdW10gZXhjbHVkZWROYW1lcykgeworCQlpZihxdWFsaWZpZWRUeXBlTmFtZSA9PSBudWxsIHx8IHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCQkKKwkJY2hhcltdIHR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5sYXN0U2VnbWVudChxdWFsaWZpZWRUeXBlTmFtZSwgJy4nKTsKKwkJCisgCQlOYW1pbmdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IE5hbWluZ1JlcXVlc3RvcigpOworCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RWYXJpYWJsZU5hbWVzKAorCQkJCVZLX1BBUkFNRVRFUiwKKwkJCQlCS19UWVBFX05BTUUsCisJCQkJdHlwZU5hbWUsCisJCQkJamF2YVByb2plY3QsCisJCQkJZGltLAorCQkJCW51bGwsCisJCQkJZXhjbHVkZWROYW1lcywKKwkJCQl0cnVlLAorCQkJCXJlcXVlc3Rvcik7CisgCisgCQlyZXR1cm4gcmVxdWVzdG9yLmdldFJlc3VsdHMoKTsKKwl9CisKKwkvKioKKwkgKiBTdWdnZXN0IG5hbWVzIGZvciBhbiBhcmd1bWVudC4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBhcmd1bWVudCdzIHR5cGUKKwkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIGFkZGVkLgorCSAqIDxwPgorCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCBpcyA8Y29kZT5UeXBlTmFtZTwvY29kZT4sIHRoZSBwcmVmaXggZm9yIGFyZ3VtZW50IGlzIDxjb2RlPnByZTwvY29kZT4KKwkgKiBhbmQgdGhlIHN1ZmZpeCBmb3IgYXJndW1lbnQgaXMgPGNvZGU+c3VmPC9jb2RlPiB0aGVuIHRoZSBwcm9wb3NlZCBuYW1lcyBhcmUgPGNvZGU+cHJlVHlwZU5hbWVzdWY8L2NvZGU+CisJICogYW5kIDxjb2RlPnByZU5hbWVzdWY8L2NvZGU+LiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IHRoZSBwcm9wb3NhbHMgYXJlIDxjb2RlPnR5cGVOYW1lPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTfSBhbmQKKwkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVN9LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2Ugb2YgdGhlIGFyZ3VtZW50J3MgdHlwZS4KKwkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUgYXJndW1lbnQncyB0eXBlLgorCSAqIEBwYXJhbSBkaW0gYXJndW1lbnQncyBkaW1lbnNpb24gKDAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSkuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW11bXSBhbiBhcnJheSBvZiBuYW1lcy4KKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzdWdnZXN0VmFyaWFibGVOYW1lcyhpbnQsIGludCwgU3RyaW5nLCBJSmF2YVByb2plY3QsIGludCwgU3RyaW5nW10sIGJvb2xlYW4pfSBpbnN0ZWFkIHdpdGgge0BsaW5rICNWS19QQVJBTUVURVJ9IGFzIHZhcmlhYmxlIGtpbmQuCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBTdHJpbmdbXSBleGNsdWRlZE5hbWVzKSB7CiAJCXJldHVybiBjb252ZXJ0Q2hhcnNUb1N0cmluZygKQEAgLTUzNSw2ICs2NDMsNyBAQAogCQkJCWRpbSwKIAkJCQljb252ZXJ0U3RyaW5nVG9DaGFycyhleGNsdWRlZE5hbWVzKSkpOwogCX0KKwogCS8qKgogCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGEgZmllbGQuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gZmllbGQncyB0eXBlCiAJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC4KQEAgLTU0NSw3ICs2NTQsNyBAQAogCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfU1VGRklYRVN9IGFuZCBmb3IgaW5zdGFuY2UgZmllbGQgYW5kICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVN9LAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVN9IGZvciBzdGF0aWMgZmllbGQuCiAJICogPC9wPgpAQCAtNTUzLDcgKzY2Miw3IEBACiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSBmaWVsZCdzIHR5cGUuCiAJICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIGZpZWxkJ3MgdHlwZS4KQEAgLTU2NiwyMiArNjc1LDMxIEBACiAJICogQHNlZSBGbGFncwogCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKQogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3N1Z2dlc3RWYXJpYWJsZU5hbWVzKGludCwgaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCwgaW50LCBTdHJpbmdbXSwgYm9vbGVhbil9IGluc3RlYWQgCisJICogd2l0aCB7QGxpbmsgI1ZLX0lOU1RBTkNFX0ZJRUxEfSBvciAge0BsaW5rICNWS19TVEFUSUNfRklFTER9IGFzIHZhcmlhYmxlIGtpbmQuCiAJICovCiAJcHVibGljIHN0YXRpYyBjaGFyW11bXSBzdWdnZXN0RmllbGROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBpbnQgbW9kaWZpZXJzLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7Ci0JCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7Ci0JCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCQlqYXZhUHJvamVjdCwKLQkJCXBhY2thZ2VOYW1lLAotCQkJcXVhbGlmaWVkVHlwZU5hbWUsCi0JCQlkaW0sCi0JCQltb2RpZmllcnMsCi0JCQludWxsLAotCQkJZXhjbHVkZWROYW1lcywKLQkJCXJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7CisJCWlmKHF1YWxpZmllZFR5cGVOYW1lID09IG51bGwgfHwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCQorCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHF1YWxpZmllZFR5cGVOYW1lLCAnLicpOworCQkKKyAJCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7CisJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQkJRmxhZ3MuaXNTdGF0aWMobW9kaWZpZXJzKSA/IFZLX1NUQVRJQ19GSUVMRCA6IFZLX0lOU1RBTkNFX0ZJRUxELAorCQkJCUJLX1RZUEVfTkFNRSwKKwkJCQl0eXBlTmFtZSwKKwkJCQlqYXZhUHJvamVjdCwKKwkJCQlkaW0sCisJCQkJbnVsbCwKKwkJCQlleGNsdWRlZE5hbWVzLAorCQkJCXRydWUsCisJCQkJcmVxdWVzdG9yKTsKKyAKKyAJCXJldHVybiByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOwogCX0KLQkKKwogCS8qKgogCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGEgZmllbGQuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gZmllbGQncyB0eXBlCiAJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC4KQEAgLTU5Miw3ICs3MTAsNyBAQAogCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfU1VGRklYRVN9IGFuZCBmb3IgaW5zdGFuY2UgZmllbGQgYW5kICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVN9LAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVN9IGZvciBzdGF0aWMgZmllbGQuCiAJICogPC9wPgpAQCAtNjAwLDcgKzcxOCw3IEBACiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSBmaWVsZCdzIHR5cGUuCiAJICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIGZpZWxkJ3MgdHlwZS4KQEAgLTYxMyw2ICs3MzEsOSBAQAogCSAqIEBzZWUgRmxhZ3MKIAkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKIAkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCkKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzdWdnZXN0VmFyaWFibGVOYW1lcyhpbnQsIGludCwgU3RyaW5nLCBJSmF2YVByb2plY3QsIGludCwgU3RyaW5nW10sIGJvb2xlYW4pfSBpbnN0ZWFkIAorCSAqIHdpdGgge0BsaW5rICNWS19JTlNUQU5DRV9GSUVMRH0gb3IgIHtAbGluayAjVktfU1RBVElDX0ZJRUxEfSBhcyB2YXJpYWJsZSBraW5kLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3VnZ2VzdEZpZWxkTmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgaW50IG1vZGlmaWVycywgU3RyaW5nW10gZXhjbHVkZWROYW1lcykgewogCQlyZXR1cm4gY29udmVydENoYXJzVG9TdHJpbmcoCkBAIC02MjYsODYgKzc0Nyw2IEBACiAJfQogCQogCS8qKgotCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGEgbG9jYWwgdmFyaWFibGUuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gdmFyaWFibGUncyB0eXBlCi0JICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+VHlwZU5hbWU8L2NvZGU+LCB0aGUgcHJlZml4IGZvciBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5wcmU8L2NvZGU+Ci0JICogYW5kIHRoZSBzdWZmaXggZm9yIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPnN1ZjwvY29kZT4gdGhlbiB0aGUgcHJvcG9zZWQgbmFtZXMgYXJlIDxjb2RlPnByZVR5cGVOYW1lc3VmPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5wcmVOYW1lc3VmPC9jb2RlPi4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCB0aGUgcHJvcG9zYWxzIGFyZSA8Y29kZT50eXBlTmFtZTwvY29kZT4KLQkgKiBhbmQgPGNvZGU+bmFtZTwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFU30gYW5kCi0JICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCi0JICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB2YXJpYWJsZS4KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBvZiB0aGUgdmFyaWFibGUncyB0eXBlLgotCSAqIEBwYXJhbSBxdWFsaWZpZWRUeXBlTmFtZSB2YXJpYWJsZSdzIHR5cGUuCi0JICogQHBhcmFtIGRpbSB2YXJpYWJsZSdzIGRpbWVuc2lvbiAoMCBpZiB0aGUgdmFyaWFibGUgaXMgbm90IGFuIGFycmF5KS4KLQkgKiBAcGFyYW0gZXhjbHVkZWROYW1lcyBhIGxpc3Qgb2YgbmFtZXMgd2hpY2ggY2Fubm90IGJlIHN1Z2dlc3RlZCAoYWxyZWFkeSB1c2VkIG5hbWVzKS4KLQkgKiAgICAgICAgIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleGNsdWRlZCBuYW1lcy4KLQkgKiBAcmV0dXJuIGNoYXJbXVtdIGFuIGFycmF5IG9mIG5hbWVzLgotCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKQotCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7Ci0JCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7Ci0JCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcygKLQkJCWphdmFQcm9qZWN0LAotCQkJcGFja2FnZU5hbWUsCi0JCQlxdWFsaWZpZWRUeXBlTmFtZSwKLQkJCWRpbSwKLQkJCW51bGwsCi0JCQlleGNsdWRlZE5hbWVzLAotCQkJcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldFJlc3VsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU3VnZ2VzdCBuYW1lcyBmb3IgYSBsb2NhbCB2YXJpYWJsZS4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSB2YXJpYWJsZSdzIHR5cGUKLQkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIGFkZGVkLgotCSAqIDxwPgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5UeXBlTmFtZTwvY29kZT4sIHRoZSBwcmVmaXggZm9yIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPnByZTwvY29kZT4KLQkgKiBhbmQgdGhlIHN1ZmZpeCBmb3IgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+c3VmPC9jb2RlPiB0aGVuIHRoZSBwcm9wb3NlZCBuYW1lcyBhcmUgPGNvZGU+cHJlVHlwZU5hbWVzdWY8L2NvZGU+Ci0JICogYW5kIDxjb2RlPnByZU5hbWVzdWY8L2NvZGU+LiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IHRoZSBwcm9wb3NhbHMgYXJlIDxjb2RlPnR5cGVOYW1lPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTfSBhbmQKLQkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfU1VGRklYRVN9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLQkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlLgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSB2YXJpYWJsZSdzIHR5cGUuCi0JICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIHZhcmlhYmxlJ3MgdHlwZS4KLQkgKiBAcGFyYW0gZGltIHZhcmlhYmxlJ3MgZGltZW5zaW9uICgwIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgYW4gYXJyYXkpLgotCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgotCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgotCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCi0JICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCi0JICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0TG9jYWxWYXJpYWJsZU5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRDaGFyc1RvU3RyaW5nKAotCQkJc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcygKLQkJCQlqYXZhUHJvamVjdCwKLQkJCQlwYWNrYWdlTmFtZS50b0NoYXJBcnJheSgpLAotCQkJCXF1YWxpZmllZFR5cGVOYW1lLnRvQ2hhckFycmF5KCksCi0JCQkJZGltLAotCQkJCWNvbnZlcnRTdHJpbmdUb0NoYXJzKGV4Y2x1ZGVkTmFtZXMpKSk7Ci0JfQotCQotCS8qKgogCSAqIFN1Z2dlc3QgbmFtZSBmb3IgYSBnZXR0ZXIgbWV0aG9kLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGZpZWxkJ3MgbmFtZQogCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4KIAkgKiA8cD4KQEAgLTcxNSw3ICs3NTYsNyBAQAogCSAqIGZvciBib29sZWFuIGZpZWxkIG9yIDxjb2RlPmdldFByZUZpZWxkTmFtZXN1ZjwvY29kZT4gZm9yIG90aGVycy4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwgCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfU1VGRklYRVN9IGZvciBpbnN0YW5jZSBmaWVsZCBhbmQgIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9QUkVGSVhFU30sCiAJICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFU30gZm9yIHN0YXRpYyBmaWVsZC4KIAkgKiA8L3A+CkBAIC03MjMsNyArNzY0LDcgQEAKIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZC4KIAkgKiBAcGFyYW0gZmllbGROYW1lIGZpZWxkJ3MgbmFtZSdzLgogCSAqIEBwYXJhbSBtb2RpZmllcnMgZmllbGQncyBtb2RpZmllcnMgYXMgZGVmaW5lZCBieSB0aGUgY2xhc3MKQEAgLTczOCw5ICs3NzksOSBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1Z2dlc3RHZXR0ZXJOYW1lKElKYXZhUHJvamVjdCBwcm9qZWN0LCBjaGFyW10gZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQm9vbGVhbiwgY2hhcltdW10gZXhjbHVkZWROYW1lcykgewogCQlpZiAoaXNCb29sZWFuKSB7Ci0JCQljaGFyW10gbmFtZSA9IHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShwcm9qZWN0LCBmaWVsZE5hbWUsIG1vZGlmaWVycyk7CisJCQljaGFyW10gbmFtZSA9IEludGVybmFsTmFtaW5nQ29udmVudGlvbnMuZ2V0QmFzZU5hbWUoZ2V0RmllbGRWYXJpYWJsZUtpbmQobW9kaWZpZXJzKSwgcHJvamVjdCwgZmllbGROYW1lLCBmYWxzZSk7CiAJCQlpbnQgcHJlZml4TGVuID0gIEdFVFRFUl9CT09MX05BTUUubGVuZ3RoOwotCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKEdFVFRFUl9CT09MX05BTUUsIG5hbWUpIAorCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKEdFVFRFUl9CT09MX05BTUUsIG5hbWUpCiAJCQkJJiYgbmFtZS5sZW5ndGggPiBwcmVmaXhMZW4gJiYgU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShuYW1lW3ByZWZpeExlbl0pKSB7CiAJCQkJcmV0dXJuIHN1Z2dlc3ROZXdOYW1lKG5hbWUsIGV4Y2x1ZGVkTmFtZXMpOwogCQkJfSBlbHNlIHsKQEAgLTc1Niw3ICs3OTcsNiBAQAogCQkJKTsKIAkJfQogCX0KLQkKIAkvKioKIAkgKiBTdWdnZXN0IG5hbWUgZm9yIGEgZ2V0dGVyIG1ldGhvZC4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBmaWVsZCdzIG5hbWUKIAkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIHJlbW92ZWQuCkBAIC03NjcsNyArODA3LDcgQEAKIAkgKiBmb3IgYm9vbGVhbiBmaWVsZCBvciA8Y29kZT5nZXRQcmVGaWVsZE5hbWVzdWY8L2NvZGU+IGZvciBvdGhlcnMuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFU30sIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFU30sCiAJICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTfSBmb3IgaW5zdGFuY2UgZmllbGQgYW5kICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVN9LAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVN9IGZvciBzdGF0aWMgZmllbGQuCiAJICogPC9wPgpAQCAtNzc1LDcgKzgxNSw3IEBACiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCiAJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgZmllbGQuCiAJICogQHBhcmFtIGZpZWxkTmFtZSBmaWVsZCdzIG5hbWUncy4KIAkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCkBAIC03OTcsNyArODM3LDExNSBAQAogCQkJCWlzQm9vbGVhbiwKIAkJCQljb252ZXJ0U3RyaW5nVG9DaGFycyhleGNsdWRlZE5hbWVzKSkpOwogCX0KKwkvKioKKwkgKiBTdWdnZXN0IG5hbWVzIGZvciBhIGxvY2FsIHZhcmlhYmxlLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHZhcmlhYmxlJ3MgdHlwZQorCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgYWRkZWQuCisJICogPHA+CisJICogSWYgdGhlIHR5cGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiwgdGhlIHByZWZpeCBmb3IgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+cHJlPC9jb2RlPgorCSAqIGFuZCB0aGUgc3VmZml4IGZvciBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Bvc2VkIG5hbWVzIGFyZSA8Y29kZT5wcmVUeXBlTmFtZXN1ZjwvY29kZT4KKwkgKiBhbmQgPGNvZGU+cHJlTmFtZXN1ZjwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHByZWZpeCBvciBzdWZmaXggdGhlIHByb3Bvc2FscyBhcmUgPGNvZGU+dHlwZU5hbWU8L2NvZGU+CisJICogYW5kIDxjb2RlPm5hbWU8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfUFJFRklYRVN9IGFuZAorCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFU30uCisJICogPC9wPgorCSAqIDxwPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB2YXJpYWJsZS4KKwkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBvZiB0aGUgdmFyaWFibGUncyB0eXBlLgorCSAqIEBwYXJhbSBxdWFsaWZpZWRUeXBlTmFtZSB2YXJpYWJsZSdzIHR5cGUuCisJICogQHBhcmFtIGRpbSB2YXJpYWJsZSdzIGRpbWVuc2lvbiAoMCBpZiB0aGUgdmFyaWFibGUgaXMgbm90IGFuIGFycmF5KS4KKwkgKiBAcGFyYW0gZXhjbHVkZWROYW1lcyBhIGxpc3Qgb2YgbmFtZXMgd2hpY2ggY2Fubm90IGJlIHN1Z2dlc3RlZCAoYWxyZWFkeSB1c2VkIG5hbWVzKS4KKwkgKiAgICAgICAgIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBleGNsdWRlZCBuYW1lcy4KKwkgKiBAcmV0dXJuIGNoYXJbXVtdIGFuIGFycmF5IG9mIG5hbWVzLgorCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKQorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKQorCSAqIAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3N1Z2dlc3RWYXJpYWJsZU5hbWVzKGludCwgaW50LCBTdHJpbmcsIElKYXZhUHJvamVjdCwgaW50LCBTdHJpbmdbXSwgYm9vbGVhbil9IGluc3RlYWQgd2l0aCB7QGxpbmsgI1ZLX0xPQ0FMfSBhcyB2YXJpYWJsZSBraW5kLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7CisJCWlmKHF1YWxpZmllZFR5cGVOYW1lID09IG51bGwgfHwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCQorCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHF1YWxpZmllZFR5cGVOYW1lLCAnLicpOworCQkKKwkJTmFtaW5nUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBOYW1pbmdSZXF1ZXN0b3IoKTsKKwkJSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0VmFyaWFibGVOYW1lcygKKwkJCQlWS19MT0NBTCwKKwkJCQlCS19UWVBFX05BTUUsCisJCQkJdHlwZU5hbWUsCisJCQkJamF2YVByb2plY3QsCisJCQkJZGltLAorCQkJCW51bGwsCisJCQkJZXhjbHVkZWROYW1lcywKKwkJCQl0cnVlLAorCQkJCXJlcXVlc3Rvcik7CisgCisJCXJldHVybiByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOwogCisJfQorCS8qKgorCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGEgbG9jYWwgdmFyaWFibGUuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gdmFyaWFibGUncyB0eXBlCisJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+VHlwZU5hbWU8L2NvZGU+LCB0aGUgcHJlZml4IGZvciBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5wcmU8L2NvZGU+CisJICogYW5kIHRoZSBzdWZmaXggZm9yIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPnN1ZjwvY29kZT4gdGhlbiB0aGUgcHJvcG9zZWQgbmFtZXMgYXJlIDxjb2RlPnByZVR5cGVOYW1lc3VmPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5wcmVOYW1lc3VmPC9jb2RlPi4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCB0aGUgcHJvcG9zYWxzIGFyZSA8Y29kZT50eXBlTmFtZTwvY29kZT4KKwkgKiBhbmQgPGNvZGU+bmFtZTwvY29kZT4uCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6ICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFU30gYW5kCisJICogIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTfS4KKwkgKiA8L3A+CisJICogPHA+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSB2YXJpYWJsZSdzIHR5cGUuCisJICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIHZhcmlhYmxlJ3MgdHlwZS4KKwkgKiBAcGFyYW0gZGltIHZhcmlhYmxlJ3MgZGltZW5zaW9uICgwIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgYW4gYXJyYXkpLgorCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgorCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc3VnZ2VzdFZhcmlhYmxlTmFtZXMoaW50LCBpbnQsIFN0cmluZywgSUphdmFQcm9qZWN0LCBpbnQsIFN0cmluZ1tdLCBib29sZWFuKX0gaW5zdGVhZCB3aXRoIHtAbGluayAjVktfTE9DQUx9IGFzIHZhcmlhYmxlIGtpbmQuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0TG9jYWxWYXJpYWJsZU5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsKKwkJcmV0dXJuIGNvbnZlcnRDaGFyc1RvU3RyaW5nKAorCQkJc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcygKKwkJCQlqYXZhUHJvamVjdCwKKwkJCQlwYWNrYWdlTmFtZS50b0NoYXJBcnJheSgpLAorCQkJCXF1YWxpZmllZFR5cGVOYW1lLnRvQ2hhckFycmF5KCksCisJCQkJZGltLAorCQkJCWNvbnZlcnRTdHJpbmdUb0NoYXJzKGV4Y2x1ZGVkTmFtZXMpKSk7CisJfQorCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzdWdnZXN0TmV3TmFtZShjaGFyW10gbmFtZSwgY2hhcltdW10gZXhjbHVkZWROYW1lcyl7CisJCWlmKGV4Y2x1ZGVkTmFtZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQljaGFyW10gbmV3TmFtZSA9IG5hbWU7CisJCWludCBjb3VudCA9IDI7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKGkgPCBleGNsdWRlZE5hbWVzLmxlbmd0aCkgeworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmV3TmFtZSwgZXhjbHVkZWROYW1lc1tpXSwgZmFsc2UpKSB7CisJCQkJbmV3TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIFN0cmluZy52YWx1ZU9mKGNvdW50KyspLnRvQ2hhckFycmF5KCkpOworCQkJCWkgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5ld05hbWU7CisJfQorCQogCS8qKgogCSAqIFN1Z2dlc3QgbmFtZSBmb3IgYSBzZXR0ZXIgbWV0aG9kLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGZpZWxkJ3MgbmFtZQogCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgcmVtb3ZlZC4KQEAgLTgwNyw3ICs5NTUsNyBAQAogCSAqIElmIHRoZXJlIGlzIG5vIHByZWZpeCBhbmQgc3VmZml4IHRoZSBwcm9wb3NhbCBpcyA8Y29kZT5zZXRQcmVGaWVsZE5hbWVzdWY8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9LCAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9LAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFU30gZm9yIGluc3RhbmNlIGZpZWxkIGFuZCAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTfSBmb3Igc3RhdGljIGZpZWxkLgogCSAqIDwvcD4KQEAgLTgxNSw3ICs5NjMsNyBAQAogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgogCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgogCSAqIEBwYXJhbSBmaWVsZE5hbWUgZmllbGQncyBuYW1lJ3MuCiAJICogQHBhcmFtIG1vZGlmaWVycyBmaWVsZCdzIG1vZGlmaWVycyBhcyBkZWZpbmVkIGJ5IHRoZSBjbGFzcwpAQCAtODMxLDkgKzk3OSw5IEBACiAJcHVibGljIHN0YXRpYyBjaGFyW10gc3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0IHByb2plY3QsIGNoYXJbXSBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNCb29sZWFuLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7CiAKIAkJaWYgKGlzQm9vbGVhbikgewotCQkJY2hhcltdIG5hbWUgPSByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JGaWVsZE5hbWUocHJvamVjdCwgZmllbGROYW1lLCBtb2RpZmllcnMpOworCQkJY2hhcltdIG5hbWUgPSBJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLmdldEJhc2VOYW1lKGdldEZpZWxkVmFyaWFibGVLaW5kKG1vZGlmaWVycyksIHByb2plY3QsIGZpZWxkTmFtZSwgZmFsc2UpOwogCQkJaW50IHByZWZpeExlbiA9ICBHRVRURVJfQk9PTF9OQU1FLmxlbmd0aDsKLQkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhHRVRURVJfQk9PTF9OQU1FLCBuYW1lKSAKKwkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhHRVRURVJfQk9PTF9OQU1FLCBuYW1lKQogCQkJCSYmIG5hbWUubGVuZ3RoID4gcHJlZml4TGVuICYmIFNjYW5uZXJIZWxwZXIuaXNVcHBlckNhc2UobmFtZVtwcmVmaXhMZW5dKSkgewogCQkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIHByZWZpeExlbiwgbmFtZS5sZW5ndGgpOwogCQkJCXJldHVybiBzdWdnZXN0TmV3TmFtZSgKQEAgLTg1Myw3ICsxMDAxLDYgQEAKIAkJCSk7CiAJCX0KIAl9Ci0JCiAJLyoqCiAJICogU3VnZ2VzdCBuYW1lIGZvciBhIHNldHRlciBtZXRob2QuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gZmllbGQncyBuYW1lCiAJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSByZW1vdmVkLgpAQCAtODYzLDcgKzEwMTAsNyBAQAogCSAqIElmIHRoZXJlIGlzIG5vIHByZWZpeCBhbmQgc3VmZml4IHRoZSBwcm9wb3NhbCBpcyA8Y29kZT5zZXRQcmVGaWVsZE5hbWVzdWY8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9LCAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9LAogCSAqICB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFU30gZm9yIGluc3RhbmNlIGZpZWxkIGFuZCAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTfSwKIAkgKiAge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTfSBmb3Igc3RhdGljIGZpZWxkLgogCSAqIDwvcD4KQEAgLTg3MSw3ICsxMDE4LDcgQEAKIAkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KIAkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZC4KIAkgKiBAcGFyYW0gZmllbGROYW1lIGZpZWxkJ3MgbmFtZSdzLgogCSAqIEBwYXJhbSBtb2RpZmllcnMgZmllbGQncyBtb2RpZmllcnMgYXMgZGVmaW5lZCBieSB0aGUgY2xhc3MKQEAgLTg5NCw1MiArMTA0MSwxMDcgQEAKIAkJCQljb252ZXJ0U3RyaW5nVG9DaGFycyhleGNsdWRlZE5hbWVzKSkpOwogCX0KIAkKLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gc3VnZ2VzdEFjY2Vzc29yTmFtZShJSmF2YVByb2plY3QgcHJvamVjdCwgY2hhcltdIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycykgewotCQljaGFyW10gbmFtZSA9IHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShwcm9qZWN0LCBmaWVsZE5hbWUsIG1vZGlmaWVycyk7Ci0JCWlmIChuYW1lLmxlbmd0aCA+IDAgJiYgU2Nhbm5lckhlbHBlci5pc0xvd2VyQ2FzZShuYW1lWzBdKSkgewotCQkJbmFtZVswXSA9IFNjYW5uZXJIZWxwZXIudG9VcHBlckNhc2UobmFtZVswXSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzdWdnZXN0TmV3TmFtZShjaGFyW10gbmFtZSwgY2hhcltdW10gZXhjbHVkZWROYW1lcyl7Ci0JCWlmKGV4Y2x1ZGVkTmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KKwkvKioKKwkgKiBTdWdnZXN0cyBuYW1lcyBmb3IgYSB2YXJpYWJsZS4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBhIGJhc2UgbmFtZSBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIGFkZGVkLgorCSAqCisJICogPHA+CisJICogVGhlIGJhc2UgbmFtZSBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHZhcmlhYmxlIG5hbWUuCisJICogU29tZSBkaWZmZXJlbnQga2luZHMgb2YgYmFzZSBuYW1lcyBhcmUgcG9zc2libGUgYW5kIGVhY2gga2luZCBpcyBhc3NvY2lhdGVkIHRvIGEgZGlmZmVyZW50IGhldXJpc3RpYyB0byBjb21wdXRlIHZhcmlhYmxlIG5hbWVzLjxicj4KKwkgKiBUaGUgaGV1cmlzdGljIGRlcGVuZHMgYWxzbyBvbiB0aGUga2luZCBvZiB0aGUgdmFyaWFibGUuIEVhY2gga2luZCBvZiB2YXJpYWJsZSBpcyBpZGVudGlmaWVkIGJ5IGEgY29uc3RhbnQgc3RhcnRpbmcgd2l0aCA8Y29kZT5WS188L2NvZGU+Ljxicj4KKwkgKiBXaGVuIGEgcHJlZml4IGFuZCBhIHN1ZmZpeCBjYW4gYmUgYWRkZWQgdGhlbiBhbGwgY29tYmluYXRpb25zIG9mIHByZWZpeCBhbmQgc3VmZml4IGFyZSBzdWdnZXN0ZWQuCisJICogSWYgdGhlIG5hbWUgaXMgPGNvZGU+bmFtZTwvY29kZT4sIHRoZSBwcmVmaXggaXMgPGNvZGU+cHJlPC9jb2RlPiBhbmQgdGhlIHN1ZmZpeCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHN1Z2dlc3RlZCBuYW1lcyB3aWxsIGJlCisJICogPGNvZGU+cHJlbmFtZXN1ZjwvY29kZT4sIDxjb2RlPnByZW5hbWU8L2NvZGU+LCA8Y29kZT5uYW1lc3VmPC9jb2RlPiBhbmQgPGNvZGU+bmFtZTwvY29kZT4uPGJyPgorCSAqIDxicj4KKwkgKiBUaGUgZGlmZmVyZW50IGtpbmRzIG9mIGJhc2UgbmFtZXMgYXJlOgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCS19OQU1FfTogdGhlIGJhc2UgbmFtZSBpcyBhIEphdmEgbmFtZSBhbmQgdGhlIHdob2xlIGJhc2UgbmFtZSBpcyBjb25zaWRlcmVkIHRvIGNvbXB1dGUgdGhlIHZhcmlhYmxlIG5hbWVzLiBBIHByZWZpeCBhbmQgYSBzdWZmaXggY2FuIGJlIGFkZGVkLjxicj4KKwkgKiBUaGVyZSBpcyBhIGhldXJpc3RpYyBieSB2YXJpYWJsZSBraW5kLgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNWS19QQVJBTUVURVJ9LCB7QGxpbmsgI1ZLX0xPQ0FMfSwge0BsaW5rICNWS19JTlNUQU5DRV9GSUVMRH0gYW5kIHtAbGluayAjVktfU1RBVElDX0ZJRUxEfTo8YnI+CisJICogSW4gdGhpcyBjYXNlIHRoZSBmaXJzdCB3b3JkIHdpbGwgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UgYW5kIHRoZSBvdGhlciBjaGFyYWN0ZXJzIHdvbid0IGJlIGNoYW5nZWQuPGJyPgorCSAqIElmIHRoZSBiYXNlIG5hbWUgaXMgPGNvZGU+U2ltcGxlTmFtZTwvY29kZT4gdGhlbiB0aGUgc3VnZ2VzdGVkIG5hbWUgd2lsbCBiZSA8Y29kZT5zaW1wbGVOYW1lPC9jb2RlPi48YnI+PC9saT4KKwkgKiA8bGk+e0BsaW5rICNWS19TVEFUSUNfRklOQUxfRklFTER9IDo8YnI+CisJICogSW4gdGhpcyBjYXNlIGFsbCBsZXR0ZXJzIG9mIHRoZSBuYW1lIHdpbGwgYmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2UgYW5kIHdvcmRzIHdpbGwgYmUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUgKDxjb2RlPiJfIjwvY29kZT4pLjxicj4KKwkgKiBJZiB0aGUgYmFzZSBuYW1lIGlzIDxjb2RlPlNpbXBsZU5hbWU8L2NvZGU+IHRoZW4gdGhlIHN1Z2dlc3RlZCBuYW1lIHdpbGwgYmUgPGNvZGU+U0lNUExFX05BTUU8L2NvZGU+LjwvbGk+CisJICogPC91bD48L2xpPgorCSAqIDxsaT57QGxpbmsgI0JLX1RZUEVfTkFNRX06IHRoZSBiYXNlIG5hbWUgaXMgYSBKYXZhIHNpbXBsZSB0eXBlIG5hbWUgKGUuZy4gPGNvZGU+SGFzaE1hcDwvY29kZT4pIGFuZCBhbGwgdGhlIHdvcmRzIG9mIHRoZSBiYXNlIG5hbWUgYXJlIGNvbnNpZGVyZWQgdG8gY29tcHV0ZSB0aGUgdmFyaWFibGUgbmFtZXMuIEEgcHJlZml4IGFuZCBhIHN1ZmZpeCBjYW4gYmUgYWRkZWQgdG8gdGhlc2UgbmFtZXMuPGJyPgorCSAqIFRoZXJlIGlzIGEgaGV1cmlzdGljIGJ5IHZhcmlhYmxlIGtpbmQuCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1ZLX1BBUkFNRVRFUn0sIHtAbGluayAjVktfTE9DQUx9LCB7QGxpbmsgI1ZLX0lOU1RBTkNFX0ZJRUxEfSBhbmQge0BsaW5rICNWS19TVEFUSUNfRklFTER9Ojxicj4KKwkgKiBJbiB0aGlzIGNhc2UgYSB2YXJpYWJsZSBuYW1lIHdpbGwgY29udGFpbiBzb21lIHdvcmRzIG9mIHRoZSBiYXNlIG5hbWUgYW5kIHRoZSBmaXJzdCB3b3JkIHdpbGwgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuPGJyPgorCSAqIElmIHRoZSB0eXBlIGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiB0aGVuIHRoZSBzdWdnZXN0ZWQgbmFtZXMgd2lsbCBiZSA8Y29kZT50eXBlTmFtZTwvY29kZT4gYW5kIDxjb2RlPm5hbWU8L2NvZGU+LjwvbGk+CisJICogPGxpPntAbGluayAjVktfU1RBVElDX0ZJTkFMX0ZJRUxEfSA6PGJyPgorCSAqIEluIHRoaXMgY2FzZSBhIHZhcmlhYmxlIG5hbWUgd2lsbCBjb250YWluIHNvbWUgd29yZHMgb2YgdGhlIGJhc2UgbmFtZSwgYWxsIGxldHRlcnMgb2YgdGhlIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBhbmQgc2VnbWVudHMgd2lsbCBiZSBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlICg8Y29kZT4iXyI8L2NvZGU+KS48YnI+CisJICogSWYgdGhlIGJhc2UgbmFtZSBpcyA8Y29kZT5UeXBlTmFtZTwvY29kZT4gdGhlbiB0aGUgc3VnZ2VzdGVkIG5hbWUgd2lsbCBiZSA8Y29kZT5UWVBFX05BTUU8L2NvZGU+IGFuZCA8Y29kZT5OQU1FPC9jb2RlPi48L2xpPgorCSAqIDwvdWw+PC9saT4KKwkgKiA8L3VsPgorCSAqIFNvbWUgb3RoZXIga2luZHMgY291bGQgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KKwkgKiA8L3A+CisJICogPHA+CisJICogRWFjaCB2YXJpYWJsZSBraW5kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9uczoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjVktfUEFSQU1FVEVSfToge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVN9IGFuZCB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9BUkdVTUVOVF9TVUZGSVhFU308L2xpPgorCSAqIDxsaT57QGxpbmsgI1ZLX0xPQ0FMfToge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfTE9DQUxfUFJFRklYRVN9IGFuZCB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFU308L2xpPgorCSAqIDxsaT57QGxpbmsgI1ZLX0lOU1RBTkNFX0ZJRUxEfToge0BsaW5rIEphdmFDb3JlI0NPREVBU1NJU1RfRklFTERfUFJFRklYRVN9IGFuZCB7QGxpbmsgSmF2YUNvcmUjQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFU308L2xpPgorCSAqIDxsaT57QGxpbmsgI1ZLX1NUQVRJQ19GSUVMRH06IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9QUkVGSVhFU30gYW5kIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFU308L2xpPgorCSAqIDxsaT57QGxpbmsgI1ZLX1NUQVRJQ19GSU5BTF9GSUVMRH06IHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSU5BTF9GSUVMRF9QUkVGSVhFU30gYW5kIHtAbGluayBKYXZhQ29yZSNDT0RFQVNTSVNUX1NUQVRJQ19GSU5BTF9GSUVMRF9TVUZGSVhFU308L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIDxwPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUge0BsaW5rIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCl9LgorCSAqIFRvIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSB7QGxpbmsgSmF2YUNvcmUjc2V0T3B0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKX0gYW5kIHtAbGluayBJSmF2YVByb2plY3Qjc2V0T3B0aW9ucyhqYXZhLnV0aWwuTWFwKX0KKwkgKiA8L3A+CisJICogPHA+CisJICogUHJvcG9zZWQgbmFtZXMgYXJlIHNvcnRlZCBieSByZWxldmFuY2UgKGJlc3QgcHJvcG9zYWwgZmlyc3QpLjxicj4KKwkgKiBUaGUgbmFtZXMgYXJlIHByb3Bvc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJICogPG9sPgorCSAqIDxsaT5OYW1lcyB3aXRoIHByZWZpeCBhbmQgc3VmZml4LiBMb25nZXIgbmFtZXMgYXJlIHByb3Bvc2VkIGZpcnN0PC9saT4KKwkgKiA8bGk+TmFtZXMgd2l0aCBwcmVmaXguIExvbmdlciBuYW1lcyBhcmUgcHJvcG9zZWQgZmlyc3Q8L2xpPgorCSAqIDxsaT5OYW1lcyB3aXRoIHN1ZmZpeC4gTG9uZ2VyIG5hbWVzIGFyZSBwcm9wb3NlZCBmaXJzdDwvbGk+CisJICogPGxpPk5hbWVzIHdpdGhvdXQgcHJlZml4IGFuZCBzdWZmaXguIExvbmdlciBuYW1lcyBhcmUgcHJvcG9zZWQgZmlyc3Q8L2xpPgorCSAqIDwvb2w+CisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHZhcmlhYmxlS2luZCBzcGVjaWZpZXMgd2hhdCB0eXBlIHRoZSB2YXJpYWJsZSBpczoge0BsaW5rICNWS19MT0NBTH0sIHtAbGluayAjVktfUEFSQU1FVEVSfSwge0BsaW5rICNWS19TVEFUSUNfRklFTER9LAorCSAqIHtAbGluayAjVktfSU5TVEFOQ0VfRklFTER9IG9yIHtAbGluayAjVktfU1RBVElDX0ZJTkFMX0ZJRUxEfS4KKwkgKiBAcGFyYW0gYmFzZU5hbWVLaW5kIHNwZWNpZmllcyB3aGF0IHR5cGUgdGhlIGJhc2UgbmFtZSBpczoge0BsaW5rICNCS19OQU1FfSBvciB7QGxpbmsgI0JLX1RZUEVfTkFNRX0KKwkgKiBAcGFyYW0gYmFzZU5hbWUgbmFtZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHN1Z2dlc3RlZCBuYW1lcy4KKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgdmFyaWFibGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdGFrZSBpbnRvIGFjY291bnQgb25seSB3b3Jrc3BhY2Ugc2V0dGluZ3MuCisJICogQHBhcmFtIGRpbSB2YXJpYWJsZSBkaW1lbnNpb24gKDAgaWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBhcnJheSkuCisJICogQHBhcmFtIGV4Y2x1ZGVkIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBleGNsdWRlZCBuYW1lcy4KKwkgKiBAcGFyYW0gZXZhbHVhdGVEZWZhdWx0IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gY29udGFpbiBhdCBsZWFzdCBvbmUgcmVzdWx0LiBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSByZXN1bHQgY2FuIGJlIGFuIGVtcHR5IGFycmF5LgorCSAqIEByZXR1cm4gU3RyaW5nW10gYW4gYXJyYXkgb2YgbmFtZXMuCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpCisJICogCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQlpbnQgdmFyaWFibGVLaW5kLAorCQkJaW50IGJhc2VOYW1lS2luZCwKKwkJCVN0cmluZyBiYXNlTmFtZSwKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCWludCBkaW0sCisJCQlTdHJpbmdbXSBleGNsdWRlZCwKKwkJCWJvb2xlYW4gZXZhbHVhdGVEZWZhdWx0KSB7CiAJCQotCQljaGFyW10gbmV3TmFtZSA9IG5hbWU7Ci0JCWludCBjb3VudCA9IDI7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBleGNsdWRlZE5hbWVzLmxlbmd0aCkgewotCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmV3TmFtZSwgZXhjbHVkZWROYW1lc1tpXSwgZmFsc2UpKSB7Ci0JCQkJbmV3TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIFN0cmluZy52YWx1ZU9mKGNvdW50KyspLnRvQ2hhckFycmF5KCkpOwotCQkJCWkgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld05hbWU7CisJCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7CisJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQl2YXJpYWJsZUtpbmQsCisJCQliYXNlTmFtZUtpbmQsCisJCQliYXNlTmFtZS50b0NoYXJBcnJheSgpLAorCQkJamF2YVByb2plY3QsCisJCQlkaW0sCisJCQludWxsLAorCQkJY29udmVydFN0cmluZ1RvQ2hhcnMoZXhjbHVkZWQpLAorCQkJZXZhbHVhdGVEZWZhdWx0LAorCQkJcmVxdWVzdG9yKTsKKworCQlyZXR1cm4gY29udmVydENoYXJzVG9TdHJpbmcocmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7CiAJfQogCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRDaGFyc1RvU3RyaW5nKGNoYXJbXVtdIGMpIHsKLQkJaW50IGxlbmd0aCA9IGMgPT0gbnVsbCA/IDAgOiBjLmxlbmd0aDsKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJc1tpXSA9IFN0cmluZy52YWx1ZU9mKGNbaV0pOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBjb252ZXJ0U3RyaW5nVG9DaGFycyhTdHJpbmdbXSBzKSB7Ci0JCWludCBsZW5ndGggPSBzID09IG51bGwgPyAwIDogcy5sZW5ndGg7Ci0JCWNoYXJbXVtdIGMgPSBuZXcgY2hhcltsZW5ndGhdW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmKHNbaV0gPT0gbnVsbCkgewotCQkJCWNbaV0gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCQl9IGVsc2UgewotCQkJCWNbaV0gPSBzW2ldLnRvQ2hhckFycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGM7CisJcHJpdmF0ZSBOYW1pbmdDb252ZW50aW9ucygpIHsKKwkJLy8gTm90IGluc3RhbnRpYWJsZQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1NpZ25hdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKaW5kZXggNjgwZWFiNy4uMWFhOWRhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsMTQgKzE1LDEzIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7Ci0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiAvKioKICAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0eXBlIGFuZCBtZXRob2Qgc2lnbmF0dXJlIHN0cmluZ3MuCiAgKiA8cD4KLSAqIFNpZ25hdHVyZXMgb2J0YWluZWQgZnJvbSBwYXJzaW5nIHNvdXJjZSBmaWxlcyAoaS5lLiBmaWxlcyB3aXRoIG9uZSBvZiB0aGUgCi0gKiB7QGxpbmsgSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgSmF2YS1saWtlIGV4dGVuc2lvbnN9KSBkaWZmZXIgc3VidGx5IAorICogU2lnbmF0dXJlcyBvYnRhaW5lZCBmcm9tIHBhcnNpbmcgc291cmNlIGZpbGVzIChpLmUuIGZpbGVzIHdpdGggb25lIG9mIHRoZQorICoge0BsaW5rIEphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpIEphdmEtbGlrZSBleHRlbnNpb25zfSkgZGlmZmVyIHN1YnRseQogICogZnJvbSBvbmVzIG9idGFpbmVkIGZyb20gcHJlLWNvbXBpbGVkIGJpbmFyeSAoIi5jbGFzcyIpIGZpbGVzIGluIGNsYXNzIG5hbWVzIGFyZQogICogdXN1YWxseSBsZWZ0IHVucmVzb2x2ZWQgaW4gdGhlIGZvcm1lci4gRm9yIGV4YW1wbGUsIHRoZSBub3JtYWwgcmVzb2x2ZWQgZm9ybQogICogb2YgdGhlIHR5cGUgIlN0cmluZyIgZW1iZWRzIHRoZSBjbGFzcydzIHBhY2thZ2UgbmFtZSAoIkxqYXZhLmxhbmcuU3RyaW5nOyIKQEAgLTM4LDcgKzM3LDcgQEAKICAqIHdpdGggSjJTRSAxLjQgb3IgZWFybGllciwgaW52b2x2ZWQgb25seSA8aT5zaW1wbGU8L2k+IHNpZ25hdHVyZXMuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgIlEiIGFuZCAiISIgZm9ybWF0cyBhcmUgc3BlY2lmaWMgdG8gRWNsaXBzZTsgdGhlIHJlbWFpbmRlcgorICogTm90ZSB0aGF0IHRoZSAiUSIsICIhIiBhbmQgInwiIGZvcm1hdHMgYXJlIHNwZWNpZmljIHRvIEVjbGlwc2U7IHRoZSByZW1haW5kZXIKICAqIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjLgogICogPC9wPgogICogPHA+CkBAIC01NywzMyArNTYsMzQgQEAKICAqICAgfCAiVCIgKyBJZGVudGlmaWVyICsgIjsiIC8vIHR5cGUgdmFyaWFibGUKICAqICAgfCAiWyIgKyBUeXBlU2lnbmF0dXJlICAvLyBhcnJheSBYW10KICAqICAgfCAiISIgKyBUeXBlU2lnbmF0dXJlICAvLyBjYXB0dXJlLW9mID8KKyAqICAgfCAifCIgKyBUeXBlU2lnbmF0dXJlICsgKCI6IiArIFR5cGVTaWduYXR1cmUpKyAvLyBpbnRlcnNlY3Rpb24gdHlwZQogICogICB8IFJlc29sdmVkQ2xhc3NUeXBlU2lnbmF0dXJlCiAgKiAgIHwgVW5yZXNvbHZlZENsYXNzVHlwZVNpZ25hdHVyZQotICogCisgKgogICogUmVzb2x2ZWRDbGFzc1R5cGVTaWduYXR1cmUgOjo9IC8vIHJlc29sdmVkIG5hbWVkIHR5cGUgKGluIGNvbXBpbGVkIGNvZGUpCiAgKiAgICAgIkwiICsgSWRlbnRpZmllciArIE9wdGlvbmFsVHlwZUFyZ3VtZW50cwogICogICAgICAgICAgICggKCAiLiIgfCAiLyIgKSArIElkZW50aWZpZXIgKyBPcHRpb25hbFR5cGVBcmd1bWVudHMgKSogKyAiOyIKICAqICAgICB8IE9wdGlvbmFsVHlwZVBhcmFtZXRlcnMgKyAiTCIgKyBJZGVudGlmaWVyICsKICAqICAgICAgICAgICAoICggIi4iIHwgIi8iICkgKyBJZGVudGlmaWVyICkqICsgIjsiCi0gKiAKKyAqCiAgKiBVbnJlc29sdmVkQ2xhc3NUeXBlU2lnbmF0dXJlIDo6PSAvLyB1bnJlc29sdmVkIG5hbWVkIHR5cGUgKGluIHNvdXJjZSBjb2RlKQogICogICAgICJRIiArIElkZW50aWZpZXIgKyBPcHRpb25hbFR5cGVBcmd1bWVudHMKICAqICAgICAgICAgICAoICggIi4iIHwgIi8iICkgKyBJZGVudGlmaWVyICsgT3B0aW9uYWxUeXBlQXJndW1lbnRzICkqICsgIjsiCiAgKiAgICAgfCBPcHRpb25hbFR5cGVQYXJhbWV0ZXJzICJRIiArIElkZW50aWZpZXIgKwogICogICAgICAgICAgICggKCAiLiIgfCAiLyIgKSArIElkZW50aWZpZXIgKSogKyAiOyIKLSAqIAorICoKICAqIE9wdGlvbmFsVHlwZUFyZ3VtZW50cyA6Oj0KLSAqICAgICAiJmx0OyIgKyBUeXBlQXJndW1lbnQrICsgIiZndDsiIAorICogICAgICImbHQ7IiArIFR5cGVBcmd1bWVudCsgKyAiJmd0OyIKICAqICAgfAotICogCisgKgogICogVHlwZUFyZ3VtZW50IDo6PQogICogICB8IFR5cGVTaWduYXR1cmUKICAqICAgfCAiKiIgLy8gd2lsZGNhcmQgPwogICogICB8ICIrIiBUeXBlU2lnbmF0dXJlIC8vIHdpbGRjYXJkID8gZXh0ZW5kcyBYCiAgKiAgIHwgIi0iIFR5cGVTaWduYXR1cmUgLy8gd2lsZGNhcmQgPyBzdXBlciBYCi0gKiAgIAorICoKICAqIE9wdGlvbmFsVHlwZVBhcmFtZXRlcnMgOjo9Ci0gKiAgICAgIiZsdDsiICsgRm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSsgKyAiJmd0OyIgCisgKiAgICAgIiZsdDsiICsgRm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSsgKyAiJmd0OyIKICAqICAgfAogICogPC9wcmU+CiAgKiA8L3A+CkBAIC0xMDEsNyArMTAxLDcgQEAKICAqIDwvdWw+CiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBzeW50YXggZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSBpczogCisgKiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZCBzaWduYXR1cmUgaXM6CiAgKiA8cHJlPgogICogTWV0aG9kU2lnbmF0dXJlIDo6PSBPcHRpb25hbFR5cGVQYXJhbWV0ZXJzICsgIigiICsgUGFyYW1UeXBlU2lnbmF0dXJlKiArICIpIiArIFJldHVyblR5cGVTaWduYXR1cmUKICAqIFBhcmFtVHlwZVNpZ25hdHVyZSA6Oj0gVHlwZVNpZ25hdHVyZQpAQCAtMTI0LDcgKzEyNCw3IEBACiAgKiBPcHRpb25hbENsYXNzQm91bmQgOjo9CiAgKiAgICAgIjoiCiAgKiAgIHwgIjoiICsgVHlwZVNpZ25hdHVyZQotICogSW50ZXJmYWNlQm91bmQgOjo9IAorICogSW50ZXJmYWNlQm91bmQgOjo9CiAgKiAgICAgIjoiICsgVHlwZVNpZ25hdHVyZQogICogPC9wcmU+CiAgKiA8cD4KQEAgLTEzNiwyNDYgKzEzNiwyMSBAQAogICogPC91bD4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgYW5kIGNvbnN0YW50cyBvbmx5LgogICogPC9wPgorICogPHA+Tm90ZTogQW4gZW1wdHkgc2lnbmF0dXJlIGlzIGNvbnNpZGVyZWQgdG8gYmUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QuIFNvIG1vc3QgbWV0aG9kcyB3aWxsIHRocm93CisgKiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gZW1wdHkgc2lnbmF0dXJlIGlzIHByb3ZpZGVkLjwvcD4KKyAqIAorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTaWduYXR1cmUgewogCiAJLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGJvb2xlYW4gaW4gYSBzaWduYXR1cmUuCi0JICogVmFsdWUgaXMgPGNvZGU+J1onPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19CT09MRUFOIAkJPSAnWic7Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgYnl0ZSBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nQic8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0JZVEUgCQk9ICdCJzsKLQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBjaGFyIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPidDJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ0hBUiAJCT0gJ0MnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGRvdWJsZSBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nRCc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RPVUJMRSAJCT0gJ0QnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGZsb2F0IGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPidGJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRkxPQVQgCQk9ICdGJzsKLQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBpbnQgaW4gYSBzaWduYXR1cmUuCi0JICogVmFsdWUgaXMgPGNvZGU+J0knPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19JTlQgCQkJPSAnSSc7Ci0JCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHNlbWljb2xvbiBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nOyc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NFTUlDT0xPTiAJCQk9ICc7JzsKLQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBjb2xvbiBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nOic8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DT0xPTiAJCQk9ICc6JzsKLQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBsb25nIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPidKJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTE9ORwkJCT0gJ0onOwotCQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBzaG9ydCBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nUyc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NIT1JUCQk9ICdTJzsKLQkKLQkvKioKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyByZXN1bHQgdHlwZSB2b2lkIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPidWJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfVk9JRAkJCT0gJ1YnOwotCQotCS8qKgotCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIHJlc29sdmVkIHR5cGUgdmFyaWFibGUgaW4gYSAKLQkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidUJzwvY29kZT4uCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1RZUEVfVkFSSUFCTEUJPSAnVCc7Ci0JCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gdW5ib3VuZCB3aWxkY2FyZCB0eXBlIGFyZ3VtZW50IAotCSAqIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPicqJzwvY29kZT4uCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NUQVIJPSAnKic7Ci0JCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gZXhjZXB0aW9uIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPideJzwvY29kZT4uCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0VYQ0VQVElPTl9TVEFSVAk9ICdeJzsKLQkKLQkvKioKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyBhIGJvdW5kIHdpbGRjYXJkIHR5cGUgYXJndW1lbnQgCi0JICogaW4gYSBzaWduYXR1cmUgd2l0aCBleHRlbmRzIGNsYXVzZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nKyc8L2NvZGU+LgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19FWFRFTkRTCT0gJysnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYSBib3VuZCB3aWxkY2FyZCB0eXBlIGFyZ3VtZW50IAotCSAqIGluIGEgc2lnbmF0dXJlIHdpdGggc3VwZXIgY2xhdXNlLgotCSAqIFZhbHVlIGlzIDxjb2RlPictJzwvY29kZT4uCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NVUEVSCT0gJy0nOwotCQotCS8qKiAKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZG90IGluIGEgc2lnbmF0dXJlLiAKLQkgKiBWYWx1ZSBpcyA8Y29kZT4nLic8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RPVAkJCT0gJy4nOwotCQotCS8qKiAKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZG9sbGFyIGluIGEgc2lnbmF0dXJlLgotCSAqIFZhbHVlIGlzIDxjb2RlPickJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRE9MTEFSCQkJPSAnJCc7Ci0KLQkvKiogCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gYXJyYXkgdHlwZSBpbiBhIHNpZ25hdHVyZS4KLQkgKiBWYWx1ZSBpcyA8Y29kZT4nWyc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0FSUkFZCQk9ICdbJzsKLQotCS8qKiAKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSByZXNvbHZlZCwgbmFtZWQgdHlwZSBpbiBhIAotCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+J0wnPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19SRVNPTFZFRAkJPSAnTCc7Ci0KLQkvKiogCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGFuIHVucmVzb2x2ZWQsIG5hbWVkIHR5cGUgaW4gYQotCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+J1EnPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19VTlJFU09MVkVECT0gJ1EnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGVuZCBvZiBhIG5hbWVkIHR5cGUgaW4gYSBzaWduYXR1cmUuIAotCSAqIFZhbHVlIGlzIDxjb2RlPic7JzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTkFNRV9FTkQJCT0gJzsnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGEgcGFyYW1ldGVyIHR5cGUgbGlzdCBpbiBhCi0JICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nKCc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1BBUkFNX1NUQVJUCT0gJygnOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGVuZCBvZiBhIHBhcmFtZXRlciB0eXBlIGxpc3QgaW4gYSAKLQkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicpJzwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSQU1fRU5ECT0gJyknOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGEgZm9ybWFsIHR5cGUgcGFyYW1ldGVyCi0JICogKG9yIHR5cGUgYXJndW1lbnQpIGxpc3QgaW4gYSBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicmbHQ7JzwvY29kZT4uCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0dFTkVSSUNfU1RBUlQJPSAnPCc7Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEgZ2VuZXJpYyB0eXBlIGxpc3QgaW4gYSAKLQkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicmZ3Q7JzwvY29kZT4uCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0dFTkVSSUNfRU5ECT0gJz4nOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYSBjYXB0dXJlIG9mIGEgd2lsZGNhcmQgdHlwZSBpbiBhIAotCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+JyEnPC9jb2RlPi4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ0FQVFVSRQk9ICchJzsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGJvb2xlYW4uCi0JICogVmFsdWUgaXMgPGNvZGU+IloiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQk9PTEVBTiAJCT0gIloiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGJ5dGUuIAotCSAqIFZhbHVlIGlzIDxjb2RlPiJCIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0JZVEUgCQk9ICJCIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjaGFyLgotCSAqIFZhbHVlIGlzIDxjb2RlPiJDIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0NIQVIgCQk9ICJDIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBkb3VibGUuCi0JICogVmFsdWUgaXMgPGNvZGU+IkQiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRE9VQkxFIAkJPSAiRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgZmxvYXQuCi0JICogVmFsdWUgaXMgPGNvZGU+IkYiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRkxPQVQgCQk9ICJGIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBpbnQuCi0JICogVmFsdWUgaXMgPGNvZGU+IkkiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfSU5UIAkJCT0gIkkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGxvbmcuCi0JICogVmFsdWUgaXMgPGNvZGU+IkoiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfTE9ORwkJCT0gIkoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIHNob3J0LgotCSAqIFZhbHVlIGlzIDxjb2RlPiJTIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX1NIT1JUCQk9ICJTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiByZXN1bHQgdHlwZSB2b2lkLgotCSAqIFZhbHVlIGlzIDxjb2RlPiJWIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX1ZPSUQJCQk9ICJWIjsgLy8kTk9OLU5MUy0xJAotCQotCi0JLyoqCi0JICogS2luZCBjb25zdGFudCBmb3IgYSBjbGFzcyB0eXBlIHNpZ25hdHVyZS4KKwkgKiBLaW5kIGNvbnN0YW50IGZvciBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZS4KIAkgKiBAc2VlICNnZXRUeXBlU2lnbmF0dXJlS2luZChTdHJpbmcpCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX1RZUEVfU0lHTkFUVVJFID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9UWVBFX1NJR05BVFVSRSA9IDQ7CiAKIAkvKioKIAkgKiBLaW5kIGNvbnN0YW50IGZvciBhIGJhc2UgKHByaW1pdGl2ZSBvciB2b2lkKSB0eXBlIHNpZ25hdHVyZS4KQEAgLTM4NCwyNiArMTU5LDE5MiBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0VfVFlQRV9TSUdOQVRVUkUgPSAyOwogCi0JLyoqCi0JICogS2luZCBjb25zdGFudCBmb3IgYSB0eXBlIHZhcmlhYmxlIHNpZ25hdHVyZS4KLQkgKiBAc2VlICNnZXRUeXBlU2lnbmF0dXJlS2luZChTdHJpbmcpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVkFSSUFCTEVfU0lHTkFUVVJFID0gMzsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQk9PTEVBTiA9ICJib29sZWFuIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQllURSA9ICJieXRlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBLaW5kIGNvbnN0YW50IGZvciBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZS4KLQkgKiBAc2VlICNnZXRUeXBlU2lnbmF0dXJlS2luZChTdHJpbmcpCi0JICogQHNpbmNlIDMuMAorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIGFuIGFycmF5IHR5cGUgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J1snPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9UWVBFX1NJR05BVFVSRSA9IDQ7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQVJSQVkgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfQVJSQVk7CisKIAkvKioKLQkgKiBLaW5kIGNvbnN0YW50IGZvciBhIHdpbGRjYXJkIHR5cGUgc2lnbmF0dXJlLgotCSAqIEBzZWUgI2dldFR5cGVTaWduYXR1cmVLaW5kKFN0cmluZykKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgYm9vbGVhbiBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nWic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0JPT0xFQU4gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfQk9PTEVBTjsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBieXRlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidCJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQllURSA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19CWVRFOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYSBjYXB0dXJlIG9mIGEgd2lsZGNhcmQgdHlwZSBpbiBhCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nISc8L2NvZGU+LgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUxEQ0FSRF9UWVBFX1NJR05BVFVSRSA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ0FQVFVSRSA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19DQVBUVVJFOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGNoYXIgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0MnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DSEFSID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX0NIQVI7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgY29sb24gaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JzonPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ09MT04gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfQ09MT047CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZG9sbGFyIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPickJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRE9MTEFSID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX0RPTExBUjsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBkb3QgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+Jy4nPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19ET1QgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfRE9UOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGRvdWJsZSBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nRCc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RPVUJMRSA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19ET1VCTEU7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyBhbiBleGNlcHRpb24gaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J14nPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRVhDRVBUSU9OX1NUQVJUID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX0VYQ0VQVElPTl9TVEFSVDsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIGEgYm91bmQgd2lsZGNhcmQgdHlwZSBhcmd1bWVudAorCSAqIGluIGEgc2lnbmF0dXJlIHdpdGggZXh0ZW5kcyBjbGF1c2UuCisJICogVmFsdWUgaXMgPGNvZGU+JysnPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRVhURU5EUyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19FWFRFTkRTOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGZsb2F0IGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidGJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRkxPQVQgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfRkxPQVQ7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEgZ2VuZXJpYyB0eXBlIGxpc3QgaW4gYQorCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+JyZndDsnPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfR0VORVJJQ19FTkQgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfR0VORVJJQ19FTkQ7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIKKwkgKiAob3IgdHlwZSBhcmd1bWVudCkgbGlzdCBpbiBhIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+JyZsdDsnPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfR0VORVJJQ19TVEFSVCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19HRU5FUklDX1NUQVJUOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGludCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nSSc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0lOVCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19JTlQ7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyBhbiBpbnRlcnNlY3Rpb24gdHlwZSBpbiBhCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nfCc8L2NvZGU+LgorCSAqIEBzaW5jZSAzLjcuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0lOVEVSU0VDVElPTiA9ICd8JzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBsb25nIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidKJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTE9ORyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19MT05HOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGVuZCBvZiBhIG5hbWVkIHR5cGUgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JzsnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19OQU1FX0VORCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19OQU1FX0VORDsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgYSBwYXJhbWV0ZXIgdHlwZSBsaXN0IGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicpJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSQU1fRU5EID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX1BBUkFNX0VORDsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIHBhcmFtZXRlciB0eXBlIGxpc3QgaW4gYQorCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+JygnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19QQVJBTV9TVEFSVCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19QQVJBTV9TVEFSVDsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIHJlc29sdmVkLCBuYW1lZCB0eXBlIGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidMJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUkVTT0xWRUQgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfUkVTT0xWRUQ7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc2VtaWNvbG9uIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPic7JzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfU0VNSUNPTE9OID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX1NFTUlDT0xPTjsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBzaG9ydCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nUyc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1NIT1JUID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5DX1NIT1JUOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYW4gdW5ib3VuZCB3aWxkY2FyZCB0eXBlIGFyZ3VtZW50CisJICogaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JyonPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfU1RBUiA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19TVEFSOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgYSBib3VuZCB3aWxkY2FyZCB0eXBlIGFyZ3VtZW50CisJICogaW4gYSBzaWduYXR1cmUgd2l0aCBzdXBlciBjbGF1c2UuCisJICogVmFsdWUgaXMgPGNvZGU+Jy0nPC9jb2RlPi4KKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfU1VQRVIgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfU1VQRVI7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSByZXNvbHZlZCB0eXBlIHZhcmlhYmxlIGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidUJzwvY29kZT4uCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1RZUEVfVkFSSUFCTEUgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfVFlQRV9WQVJJQUJMRTsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhbiB1bnJlc29sdmVkLCBuYW1lZCB0eXBlIGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPidRJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfVU5SRVNPTFZFRCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuQ19VTlJFU09MVkVEOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgcmVzdWx0IHR5cGUgdm9pZCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nVic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1ZPSUQgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkNfVk9JRDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDQVBUVVJFID0gImNhcHR1cmUtb2YiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIEtpbmQgY29uc3RhbnQgZm9yIHRoZSBjYXB0dXJlIG9mIGEgd2lsZGNhcmQgdHlwZSBzaWduYXR1cmUuCkBAIC00MTIsMTU0NiArMzUzLDk1IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQVFVSRV9UWVBFX1NJR05BVFVSRSA9IDY7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQk9PTEVBTiA9ICJib29sZWFuIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJZVEUgPSAiYnl0ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSID0gImNoYXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEtpbmQgY29uc3RhbnQgZm9yIGEgY2xhc3MgdHlwZSBzaWduYXR1cmUuCisJICogQHNlZSAjZ2V0VHlwZVNpZ25hdHVyZUtpbmQoU3RyaW5nKQorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19UWVBFX1NJR05BVFVSRSA9IDE7CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFID0gImRvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGTE9BVCA9ICJmbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlQgPSAiaW50Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIExPTkcgPSAibG9uZyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSE9SVCA9ICJzaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBWT0lEID0gInZvaWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVORFMgPSAiZXh0ZW5kcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEZMT0FUID0gImZsb2F0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5UID0gImludCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogS2luZCBjb25zdGFudCBmb3IgdGhlIGludGVyc2VjdGlvbiB0eXBlIHNpZ25hdHVyZS4KKwkgKiBAc2VlICNnZXRUeXBlU2lnbmF0dXJlS2luZChTdHJpbmcpCisJICogQHNpbmNlIDMuNy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJTRUNUSU9OX1RZUEVfU0lHTkFUVVJFID0gNzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBMT05HID0gImxvbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSE9SVCA9ICJzaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBib29sZWFuLgorCSAqIFZhbHVlIGlzIDxjb2RlPiJaIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0JPT0xFQU4gCQk9ICJaIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgYnl0ZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4iQiI8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19CWVRFIAkJPSAiQiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGNoYXIuCisJICogVmFsdWUgaXMgPGNvZGU+IkMiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQ0hBUiAJCT0gIkMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBkb3VibGUuCisJICogVmFsdWUgaXMgPGNvZGU+IkQiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRE9VQkxFIAkJPSAiRCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGZsb2F0LgorCSAqIFZhbHVlIGlzIDxjb2RlPiJGIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0ZMT0FUIAkJPSAiRiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGludC4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4iSSI8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19JTlQgCQkJPSAiSSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGxvbmcuCisJICogVmFsdWUgaXMgPGNvZGU+IkoiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfTE9ORwkJCT0gIkoiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBzaG9ydC4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4iUyI8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19TSE9SVAkJPSAiUyI7IC8vJE5PTi1OTFMtMSQKKwkvKiogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHJlc3VsdCB0eXBlIHZvaWQuCisJICogVmFsdWUgaXMgPGNvZGU+IlYiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfVk9JRAkJCT0gIlYiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNVUEVSID0gInN1cGVyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENBUFRVUkUgPSAiY2FwdHVyZS1vZiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQkKLXByaXZhdGUgU2lnbmF0dXJlKCkgewotCS8vIE5vdCBpbnN0YW50aWFibGUKLX0KKwkvKioKKwkgKiBLaW5kIGNvbnN0YW50IGZvciBhIHR5cGUgdmFyaWFibGUgc2lnbmF0dXJlLgorCSAqIEBzZWUgI2dldFR5cGVTaWduYXR1cmVLaW5kKFN0cmluZykKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkUgPSAzOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBWT0lEID0gInZvaWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBLaW5kIGNvbnN0YW50IGZvciBhIHdpbGRjYXJkIHR5cGUgc2lnbmF0dXJlLgorCSAqIEBzZWUgI2dldFR5cGVTaWduYXR1cmVLaW5kKFN0cmluZykKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lMRENBUkRfVFlQRV9TSUdOQVRVUkUgPSA1OwogCi1wcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tOYW1lKGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgpIHsKLSAgICBpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhuYW1lLCB0eXBlTmFtZSwgcG9zLCB0cnVlKSkgewotICAgICAgICBwb3MgKz0gbmFtZS5sZW5ndGg7Ci0gICAgICAgIGlmIChwb3MgPT0gbGVuZ3RoKSByZXR1cm4gcG9zOwotICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gdHlwZU5hbWVbcG9zXTsKLSAgICAgICAgc3dpdGNoIChjdXJyZW50Q2hhcikgewotICAgICAgICAgICAgY2FzZSAnICcgOgotICAgICAgICAgICAgY2FzZSAnLicgOgotICAgICAgICAgICAgY2FzZSAnPCcgOgotICAgICAgICAgICAgY2FzZSAnPicgOgotICAgICAgICAgICAgY2FzZSAnWycgOgotICAgICAgICAgICAgY2FzZSAnLCcgOgotICAgICAgICAgICAgICAgIHJldHVybiBwb3M7Ci0JCQlkZWZhdWx0OgotCQkJICAgIGlmIChTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcikpCi0JCQkgICAgCXJldHVybiBwb3M7Ci0JCQkgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGFycmF5IG5lc3RpbmcgYWRkZWQgCi0gKiB0byB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCi0gKgotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCi0gKiBAcGFyYW0gYXJyYXlDb3VudCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbGV2ZWxzIG9mIGFycmF5IG5lc3RpbmcKLSAqIEByZXR1cm4gdGhlIGVuY29kZWQgYXJyYXkgdHlwZSBzaWduYXR1cmUKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVBcnJheVNpZ25hdHVyZShjaGFyW10gdHlwZVNpZ25hdHVyZSwgaW50IGFycmF5Q291bnQpIHsKLQlpZiAoYXJyYXlDb3VudCA9PSAwKSByZXR1cm4gdHlwZVNpZ25hdHVyZTsKLQlpbnQgc2lnTGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5Q291bnQgKyBzaWdMZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlDb3VudDsgaSsrKSB7Ci0JCXJlc3VsdFtpXSA9IENfQVJSQVk7Ci0JfQotCVN5c3RlbS5hcnJheWNvcHkodHlwZVNpZ25hdHVyZSwgMCwgcmVzdWx0LCBhcnJheUNvdW50LCBzaWdMZW5ndGgpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGFycmF5IG5lc3RpbmcgYWRkZWQgCi0gKiB0byB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCi0gKgotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCi0gKiBAcGFyYW0gYXJyYXlDb3VudCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbGV2ZWxzIG9mIGFycmF5IG5lc3RpbmcKLSAqIEByZXR1cm4gdGhlIGVuY29kZWQgYXJyYXkgdHlwZSBzaWduYXR1cmUKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQXJyYXlTaWduYXR1cmUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBhcnJheUNvdW50KSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlQXJyYXlTaWduYXR1cmUodHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpLCBhcnJheUNvdW50KSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG1ldGhvZCBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZSAKLSAqIHNpZ25hdHVyZXMuIFRoZSBlbmNvZGVkIG1ldGhvZCBzaWduYXR1cmUgaXMgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyB0aGUgbGlzdCBvZiBwYXJhbWV0ZXIgdHlwZSBzaWduYXR1cmVzCi0gKiBAcGFyYW0gcmV0dXJuVHlwZSB0aGUgcmV0dXJuIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBlbmNvZGVkIG1ldGhvZCBzaWduYXR1cmUKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXSByZXR1cm5UeXBlKSB7Ci0JaW50IHBhcmFtZXRlclR5cGVzTGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCWludCBwYXJhbWV0ZXJMZW5ndGggPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXNMZW5ndGg7IGkrKykgewotCQlwYXJhbWV0ZXJMZW5ndGggKz0gcGFyYW1ldGVyVHlwZXNbaV0ubGVuZ3RoOwotCQkKLQl9Ci0JaW50IHJldHVyblR5cGVMZW5ndGggPSByZXR1cm5UeXBlLmxlbmd0aDsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbMSArIHBhcmFtZXRlckxlbmd0aCArIDEgKyByZXR1cm5UeXBlTGVuZ3RoXTsKLQlyZXN1bHRbMF0gPSBDX1BBUkFNX1NUQVJUOwotCWludCBpbmRleCA9IDE7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlc0xlbmd0aDsgaSsrKSB7Ci0JCWNoYXJbXSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbaV07Ci0JCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJUeXBlLCAwLCByZXN1bHQsIGluZGV4LCBsZW5ndGgpOwotCQlpbmRleCArPSBsZW5ndGg7Ci0JfQotCXJlc3VsdFtpbmRleF0gPSBDX1BBUkFNX0VORDsKLQlTeXN0ZW0uYXJyYXljb3B5KHJldHVyblR5cGUsIDAsIHJlc3VsdCwgaW5kZXgrMSwgcmV0dXJuVHlwZUxlbmd0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbWV0aG9kIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlIAotICogc2lnbmF0dXJlcy4gVGhlIGVuY29kZWQgbWV0aG9kIHNpZ25hdHVyZSBpcyBkb3QtYmFzZWQuIFRoaXMgbWV0aG9kCi0gKiBpcyBlcXVpdmFsZW50IHRvCi0gKiA8Y29kZT5jcmVhdGVNZXRob2RTaWduYXR1cmUocGFyYW1ldGVyVHlwZXMsIHJldHVyblR5cGUpPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcwotICogQHBhcmFtIHJldHVyblR5cGUgdGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlCi0gKiBAc2VlIFNpZ25hdHVyZSNjcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10sIGNoYXJbXSkKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWV0aG9kU2lnbmF0dXJlKFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzLCBTdHJpbmcgcmV0dXJuVHlwZSkgewotCWludCBwYXJhbWV0ZXJUeXBlc0xlbnRoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCWNoYXJbXVtdIHBhcmFtZXRlcnMgPSBuZXcgY2hhcltwYXJhbWV0ZXJUeXBlc0xlbnRoXVtdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXNMZW50aDsgaSsrKSB7Ci0JCXBhcmFtZXRlcnNbaV0gPSBwYXJhbWV0ZXJUeXBlc1tpXS50b0NoYXJBcnJheSgpOwotCX0KLQlyZXR1cm4gbmV3IFN0cmluZyhjcmVhdGVNZXRob2RTaWduYXR1cmUocGFyYW1ldGVycywgcmV0dXJuVHlwZS50b0NoYXJBcnJheSgpKSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYm91bmRzLgotICoKLSAqIEBwYXJhbSB0eXBlUGFyYW1ldGVyTmFtZSB0aGUgdHlwZSBwYXJhbWV0ZXIgbmFtZQotICogQHBhcmFtIGJvdW5kU2lnbmF0dXJlcyB0aGUgc2lnbmF0dXJlcyBvZiBhc3NvY2lhdGVkIGJvdW5kcyBvciBlbXB0eSBhcnJheSBpZiBub25lCi0gKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZVR5cGVQYXJhbWV0ZXJTaWduYXR1cmUoY2hhcltdIHR5cGVQYXJhbWV0ZXJOYW1lLCBjaGFyW11bXSBib3VuZFNpZ25hdHVyZXMpIHsKLQlpbnQgbGVuZ3RoID0gYm91bmRTaWduYXR1cmVzLmxlbmd0aDsKLQlpZiAobGVuZ3RoID09IDApIHsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uYXBwZW5kKHR5cGVQYXJhbWV0ZXJOYW1lLCBDX0NPTE9OKTsgLy8gcGFyYW0gc2lnbmF0dXJlIHdpdGggbm8gYm91bmRzIHN0aWxsIGdldHMgdHJhaWxpbmcgY29sb24KLQl9Ci0JaW50IGJvdW5kc1NpemUgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJYm91bmRzU2l6ZSArPSBib3VuZFNpZ25hdHVyZXNbaV0ubGVuZ3RoICsgMTsKLQl9Ci0JaW50IG5hbWVMZW5ndGggPSB0eXBlUGFyYW1ldGVyTmFtZS5sZW5ndGg7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW25hbWVMZW5ndGggKyBib3VuZHNTaXplXTsKLQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVQYXJhbWV0ZXJOYW1lLCAwLCByZXN1bHQsIDAsIG5hbWVMZW5ndGgpOwotCWludCBpbmRleCA9IG5hbWVMZW5ndGg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlyZXN1bHRbaW5kZXgrK10gPSBDX0NPTE9OOwotCQlpbnQgYm91bmRMZW5ndGggPSBib3VuZFNpZ25hdHVyZXNbaV0ubGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJvdW5kU2lnbmF0dXJlc1tpXSwgMCwgcmVzdWx0LCBpbmRleCwgYm91bmRMZW5ndGgpOwotCQlpbmRleCArPSBib3VuZExlbmd0aDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBib3VuZHMuCi0gKgotICogQHBhcmFtIHR5cGVQYXJhbWV0ZXJOYW1lIHRoZSB0eXBlIHBhcmFtZXRlciBuYW1lCi0gKiBAcGFyYW0gYm91bmRTaWduYXR1cmVzIHRoZSBzaWduYXR1cmVzIG9mIGFzc29jaWF0ZWQgYm91bmRzIG9yIGVtcHR5IGFycmF5IGlmIG5vbmUKLSAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVHlwZVBhcmFtZXRlclNpZ25hdHVyZShTdHJpbmcgdHlwZVBhcmFtZXRlck5hbWUsIFN0cmluZ1tdIGJvdW5kU2lnbmF0dXJlcykgewotCWludCBsZW5ndGggPSBib3VuZFNpZ25hdHVyZXMubGVuZ3RoOwotCWNoYXJbXVtdIGJvdW5kU2lnbmF0dXJlQ2hhcnMgPSBuZXcgY2hhcltsZW5ndGhdW107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlib3VuZFNpZ25hdHVyZUNoYXJzW2ldID0gYm91bmRTaWduYXR1cmVzW2ldLnRvQ2hhckFycmF5KCk7Ci0JfQotCXJldHVybiBuZXcgU3RyaW5nKGNyZWF0ZVR5cGVQYXJhbWV0ZXJTaWduYXR1cmUodHlwZVBhcmFtZXRlck5hbWUudG9DaGFyQXJyYXkoKSwgYm91bmRTaWduYXR1cmVDaGFycykpOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBuYW1lIGVuY29kZWQgYXMgYSBjaGFyYWN0ZXIKLSAqIGFycmF5LiBUaGUgdHlwZSBuYW1lIG1heSBjb250YWluIHByaW1pdGl2ZSB0eXBlcywgYXJyYXkgdHlwZXMgb3IgcGFyYW1ldGVyaXplZCB0eXBlcy4KLSAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KLSAqIDxjb2RlPmNyZWF0ZVR5cGVTaWduYXR1cmUobmV3IFN0cmluZyh0eXBlTmFtZSksaXNSZXNvbHZlZCk8L2NvZGU+LCBhbHRob3VnaAotICogbW9yZSBlZmZpY2llbnQgZm9yIGNhbGxlcnMgd2l0aCBjaGFyYWN0ZXIgYXJyYXlzIHJhdGhlciB0aGFuIHN0cmluZ3MuIElmIHRoZSAKLSAqIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsIHRoZW4gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgcG9zc2libHkgcXVhbGlmaWVkIHR5cGUgbmFtZQotICogQHBhcmFtIGlzUmVzb2x2ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkCi0gKiAgIHJlc29sdmVkIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZnJvbSBhIGJpbmFyeSBjbGFzcyBmaWxlKSwgYW5kIAotICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkIHVucmVzb2x2ZWQKLSAqICAgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmb3VuZCBpbiBzb3VyY2UgY29kZSkKLSAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKLSAqIEBzZWUgI2NyZWF0ZVR5cGVTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZyxib29sZWFuKQotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVUeXBlU2lnbmF0dXJlKGNoYXJbXSB0eXBlTmFtZSwgYm9vbGVhbiBpc1Jlc29sdmVkKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgaXNSZXNvbHZlZCkpOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBuYW1lIGVuY29kZWQgYXMgYSBjaGFyYWN0ZXIKLSAqIGFycmF5LiBUaGUgdHlwZSBuYW1lIG1heSBjb250YWluIHByaW1pdGl2ZSB0eXBlcyBvciBhcnJheSB0eXBlcyBvciBwYXJhbWV0ZXJpemVkIHR5cGVzLgotICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bwotICogPGNvZGU+Y3JlYXRlVHlwZVNpZ25hdHVyZShuZXcgU3RyaW5nKHR5cGVOYW1lKSxpc1Jlc29sdmVkKS50b0NoYXJBcnJheSgpPC9jb2RlPiwKLSAqIGFsdGhvdWdoIG1vcmUgZWZmaWNpZW50IGZvciBjYWxsZXJzIHdpdGggY2hhcmFjdGVyIGFycmF5cyByYXRoZXIgdGhhbiBzdHJpbmdzLgotICogSWYgdGhlIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsIHRoZW4gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgcG9zc2libHkgcXVhbGlmaWVkIHR5cGUgbmFtZQotICogQHBhcmFtIGlzUmVzb2x2ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkCi0gKiAgIHJlc29sdmVkIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZnJvbSBhIGJpbmFyeSBjbGFzcyBmaWxlKSwgYW5kIAotICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkIHVucmVzb2x2ZWQKLSAqICAgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmb3VuZCBpbiBzb3VyY2UgY29kZSkKLSAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKLSAqIEBzZWUgI2NyZWF0ZVR5cGVTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZyxib29sZWFuKQotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKLQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKLQlpZiAobGVuZ3RoID09IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmV3IFN0cmluZyh0eXBlTmFtZSkpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDUpOwotCWludCBwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCAwLCBpc1Jlc29sdmVkLCBsZW5ndGgsIGJ1ZmZlcik7Ci0JcG9zID0gY29uc3VtZVdoaXRlc3BhY2UodHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQlpZiAocG9zIDwgbGVuZ3RoKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5ldyBTdHJpbmcodHlwZU5hbWUpKTsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpXTsKLQlidWZmZXIuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCByZXN1bHQsIDApOwotCXJldHVybiByZXN1bHQ7CQotfQotcHJpdmF0ZSBzdGF0aWMgaW50IGNvbnN1bWVXaGl0ZXNwYWNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHBvcywgaW50IGxlbmd0aCkgewotICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKLSAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107Ci0gICAgICAgIGlmIChjdXJyZW50Q2hhciAhPSAnICcgJiYgIUNoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zKys7Ci0gICAgfQotICAgIHJldHVybiBwb3M7Ci19Ci1wcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlUXVhbGlmaWVkTmFtZShjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGNoYXIgbGFzdEFwcGVuZGVkQ2hhciA9IDA7Ci0gICAgbmFtZUxvb3A6IHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKLQkgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107Ci0JCXN3aXRjaCAoY3VycmVudENoYXIpIHsKLQkJICAgIGNhc2UgJzwnIDoKLQkJICAgIGNhc2UgJz4nIDoKLQkJICAgIGNhc2UgJ1snIDoKLQkJICAgIGNhc2UgJywnIDoKLQkJICAgICAgICBicmVhayBuYW1lTG9vcDsKLQkJCWNhc2UgJy4nIDoKLQkJCSAgICBidWZmZXIuYXBwZW5kKENfRE9UKTsKLQkJCQlsYXN0QXBwZW5kZWRDaGFyID0gQ19ET1Q7Ci0JCQkgICAgY291bnQrKzsKLQkJCSAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgaWYgKGN1cnJlbnRDaGFyID09ICcgJyB8fCBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcikpIHsKLQkJCSAgICAgICAgaWYgKGxhc3RBcHBlbmRlZENoYXIgPT0gQ19ET1QpIHsgLy8gYWxsb3cgc3BhY2VzIGFmdGVyIGEgZG90Ci0JCQkgICAgICAgICAgICBwb3MgPSBjb25zdW1lV2hpdGVzcGFjZSh0eXBlTmFtZSwgcG9zLCBsZW5ndGgpIC0gMTsgLy8gd2lsbCBiZSBpbmNyZW1lbnRlZAotCQkJICAgICAgICAgICAgYnJlYWs7IAotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIC8vIGFsbG93IHNwYWNlcyBiZWZvcmUgYSBkb3QKLQkJCQkgICAgaW50IGNoZWNrUG9zID0gY2hlY2tOZXh0Q2hhcih0eXBlTmFtZSwgJy4nLCBwb3MsIGxlbmd0aCwgdHJ1ZSk7Ci0JCQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJCQkgICAgICAgIGJ1ZmZlci5hcHBlbmQoQ19ET1QpOwkJCS8vIHByb2Nlc3MgZG90IGltbWVkaWF0ZWx5IHRvIGF2b2lkIG9uZSBpdGVyYXRpb24KLQkJCQkgICAgICAgIGxhc3RBcHBlbmRlZENoYXIgPSBDX0RPVDsKLQkJCQkgICAgICAgIGNvdW50Kys7Ci0JCQkJICAgICAgICBwb3MgPSBjaGVja1BvczsKLQkJCQkgICAgICAgIGJyZWFrOwotCQkJCSAgICB9Ci0JCQkJICAgIGJyZWFrIG5hbWVMb29wOwotCQkJICAgIH0KLQkJCSAgICBidWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkJCSAgICBsYXN0QXBwZW5kZWRDaGFyID0gY3VycmVudENoYXI7Ci0JCQkJY291bnQrKzsKLQkJCSAgICBicmVhazsKLQkJfQotCSAgICBwb3MrKzsKLSAgICB9Ci0gICAgaWYgKGNvdW50ID09IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmV3IFN0cmluZyh0eXBlTmFtZSkpOwotCXJldHVybiBwb3M7Ci19Ci0KLXByaXZhdGUgc3RhdGljIGludCBlbmNvZGVBcnJheURpbWVuc2lvbihjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLSAgICBpbnQgY2hlY2tQb3M7Ci0gICAgd2hpbGUgKHBvcyA8IGxlbmd0aCAmJiAoY2hlY2tQb3MgPSBjaGVja05leHRDaGFyKHR5cGVOYW1lLCAnWycsIHBvcywgbGVuZ3RoLCB0cnVlKSkgPiAwKSB7Ci0gICAgICAgIHBvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICddJywgY2hlY2tQb3MsIGxlbmd0aCwgZmFsc2UpOwotICAgICAgICBidWZmZXIuYXBwZW5kKENfQVJSQVkpOwotICAgIH0KLSAgICByZXR1cm4gcG9zOwotfQotcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrQXJyYXlEaW1lbnNpb24oY2hhcltdIHR5cGVOYW1lLCBpbnQgcG9zLCBpbnQgbGVuZ3RoKSB7Ci0gICAgaW50IGdlbmVyaWNCYWxhbmNlID0gMDsKLSAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7Ci0JCXN3aXRjaCh0eXBlTmFtZVtwb3NdKSB7Ci0JCSAgICBjYXNlICc8JyA6Ci0JCSAgICAgICAgZ2VuZXJpY0JhbGFuY2UrKzsKLQkJICAgICAgICBicmVhazsKLQkJICAgIGNhc2UgJywnIDoKLQkJCSAgICBpZiAoZ2VuZXJpY0JhbGFuY2UgPT0gMCkgcmV0dXJuIC0xOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkgICAgaWYgKGdlbmVyaWNCYWxhbmNlID09IDApIHJldHVybiAtMTsKLQkJCSAgICBnZW5lcmljQmFsYW5jZS0tOwotCQkgICAgICAgIGJyZWFrOwotCQkJY2FzZSAnWyc6Ci0JCQkgICAgaWYgKGdlbmVyaWNCYWxhbmNlID09IDApIHsKLQkJCSAgICAgICAgcmV0dXJuIHBvczsKLQkJCSAgICB9Ci0JCX0KLQkJcG9zKys7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLXByaXZhdGUgc3RhdGljIGludCBjaGVja05leHRDaGFyKGNoYXJbXSB0eXBlTmFtZSwgY2hhciBleHBlY3RlZENoYXIsIGludCBwb3MsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNPcHRpb25hbCkgewotICAgIHBvcyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0gICAgaWYgKHBvcyA8IGxlbmd0aCAmJiB0eXBlTmFtZVtwb3NdID09IGV4cGVjdGVkQ2hhcikgCi0gICAgICAgIHJldHVybiBwb3MgKyAxOwotICAgIGlmICghaXNPcHRpb25hbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuZXcgU3RyaW5nKHR5cGVOYW1lKSk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlVHlwZVNpZ25hdHVyZShjaGFyW10gdHlwZU5hbWUsIGludCBzdGFydCwgYm9vbGVhbiBpc1Jlc29sdmVkLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0gICAgaW50IHBvcyA9IHN0YXJ0OwotICAgIHBvcyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0gICAgaWYgKHBvcyA+PSBsZW5ndGgpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmV3IFN0cmluZyh0eXBlTmFtZSkpOwotICAgIGludCBjaGVja1BvczsKLSAgICBjaGFyIGN1cnJlbnRDaGFyID0gdHlwZU5hbWVbcG9zXTsKLSAgICBzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7Ci0JCS8vIHByaW1pdGl2ZSB0eXBlPwotCQljYXNlICdiJyA6Ci0JCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShCT09MRUFOLCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOwotCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgewotCQkgICAgICAgIHBvcyA9IGVuY29kZUFycmF5RGltZW5zaW9uKHR5cGVOYW1lLCBjaGVja1BvcywgbGVuZ3RoLCBidWZmZXIpOwotCQkJICAgIGJ1ZmZlci5hcHBlbmQoQ19CT09MRUFOKTsKLQkJCSAgICByZXR1cm4gcG9zOwotCQkJfSAKLQkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKEJZVEUsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0JCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7Ci0JCQkgICAgYnVmZmVyLmFwcGVuZChDX0JZVEUpOwotCQkJICAgIHJldHVybiBwb3M7Ci0JCQl9Ci0JCSAgICBicmVhazsKLQkJY2FzZSAnZCc6Ci0JCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShET1VCTEUsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0JCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7Ci0JCQkgICAgYnVmZmVyLmFwcGVuZChDX0RPVUJMRSk7Ci0JCQkgICAgcmV0dXJuIHBvczsKLQkJCX0gCi0JCSAgICBicmVhazsKLQkJY2FzZSAnZic6Ci0JCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShGTE9BVCwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKLQkJCSAgICBidWZmZXIuYXBwZW5kKENfRkxPQVQpOwotCQkJICAgIHJldHVybiBwb3M7Ci0JCQl9IAotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJ2knOgotCQkgICAgY2hlY2tQb3MgPSBjaGVja05hbWUoSU5ULCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOwotCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgewotCQkgICAgICAgIHBvcyA9IGVuY29kZUFycmF5RGltZW5zaW9uKHR5cGVOYW1lLCBjaGVja1BvcywgbGVuZ3RoLCBidWZmZXIpOwotCQkJICAgIGJ1ZmZlci5hcHBlbmQoQ19JTlQpOwotCQkJICAgIHJldHVybiBwb3M7Ci0JCQl9IAotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkgICAgY2hlY2tQb3MgPSBjaGVja05hbWUoTE9ORywgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKLQkJCSAgICBidWZmZXIuYXBwZW5kKENfTE9ORyk7Ci0JCQkgICAgcmV0dXJuIHBvczsKLQkJCX0gCi0JCSAgICBicmVhazsKLQkJY2FzZSAncyc6Ci0JCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShTSE9SVCwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKLQkJCSAgICBidWZmZXIuYXBwZW5kKENfU0hPUlQpOwotCQkJICAgIHJldHVybiBwb3M7Ci0JCQl9IAotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkgICAgY2hlY2tQb3MgPSBjaGVja05hbWUoVk9JRCwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKLQkJCSAgICBidWZmZXIuYXBwZW5kKENfVk9JRCk7Ci0JCQkgICAgcmV0dXJuIHBvczsKLQkJCX0KLQkJICAgIGJyZWFrOwotCQljYXNlICdjJzoKLQkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKENIQVIsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0JCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7Ci0JCQkgICAgYnVmZmVyLmFwcGVuZChDX0NIQVIpOwotCQkJICAgIHJldHVybiBwb3M7Ci0JCQl9IGVsc2UgewotCQkJCWNoZWNrUG9zID0gY2hlY2tOYW1lKENBUFRVUkUsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0JCQkJaWYgKGNoZWNrUG9zID4gMCkgewotCQkJCQlwb3MgPSBjb25zdW1lV2hpdGVzcGFjZSh0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCk7Ci0JCQkJCWlmICh0eXBlTmFtZVtwb3NdICE9ICc/JykgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKENfQ0FQVFVSRSk7Ci0JCQkvLyBmYWxsLXRocnUgZm9yIHdpbGRjYXJkIHBhcnQgb2YgY2FwdHVyZSB0eXBlY2hlY2tQb3MKLQkJY2FzZSAnPyc6Ci0JCQkvLyB3aWxkY2FyZAotCQkJcG9zID0gY29uc3VtZVdoaXRlc3BhY2UodHlwZU5hbWUsIHBvcysxLCBsZW5ndGgpOwotCQkJY2hlY2tQb3MgPSBjaGVja05hbWUoRVhURU5EUywgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQkJCWlmIChjaGVja1BvcyA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKENfRVhURU5EUyk7Ci0JCQkJcG9zID0gZW5jb2RlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgY2hlY2tQb3MsIGlzUmVzb2x2ZWQsIGxlbmd0aCwgYnVmZmVyKTsKLQkJCQlyZXR1cm4gcG9zOwotCQkJfQotCQkJY2hlY2tQb3MgPSBjaGVja05hbWUoU1VQRVIsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7Ci0JCQlpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChDX1NVUEVSKTsKLQkJCQlwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBjaGVja1BvcywgaXNSZXNvbHZlZCwgbGVuZ3RoLCBidWZmZXIpOwotCQkJCXJldHVybiBwb3M7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKENfU1RBUik7Ci0JCQlyZXR1cm4gcG9zOwotICAgIH0JCSAgICAKLSAgICAvLyBub24gcHJpbWl0aXZlIHR5cGUKLSAgICBjaGVja1BvcyA9IGNoZWNrQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKLQlpbnQgZW5kOwotCWlmIChjaGVja1BvcyA+IDApIHsKLQkgICAgZW5kID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7Ci0JfSBlbHNlIHsKLQkgICAgZW5kID0gLTE7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoaXNSZXNvbHZlZCA/IENfUkVTT0xWRUQgOiBDX1VOUkVTT0xWRUQpOwotCXdoaWxlICh0cnVlKSB7IC8vIGxvb3Agb24gcXVhbGlmaWVkTmFtZVs8YXJncz5dWy5xdWFsaWZpZWROYW1lWzxhcmdzPl0qCi0JICAgIHBvcyA9IGVuY29kZVF1YWxpZmllZE5hbWUodHlwZU5hbWUsIHBvcywgbGVuZ3RoLCBidWZmZXIpOwotCQljaGVja1BvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICc8JywgcG9zLCBsZW5ndGgsIHRydWUpOwotCQlpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKENfR0VORVJJQ19TVEFSVCk7Ci0JCSAgICBwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBjaGVja1BvcywgaXNSZXNvbHZlZCwgbGVuZ3RoLCBidWZmZXIpOwotCQkgICAgd2hpbGUgKChjaGVja1BvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICcsJywgcG9zLCBsZW5ndGgsIHRydWUpKSA+IDApIHsKLQkJCSAgICBwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBjaGVja1BvcywgaXNSZXNvbHZlZCwgbGVuZ3RoLCBidWZmZXIpOwotCQkgICAgfQotCQkgICAgcG9zID0gY2hlY2tOZXh0Q2hhcih0eXBlTmFtZSwgJz4nLCBwb3MsIGxlbmd0aCwgZmFsc2UpOwotCQkJYnVmZmVyLmFwcGVuZChDX0dFTkVSSUNfRU5EKTsKLQkJfQotCQljaGVja1BvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICcuJywgcG9zLCBsZW5ndGgsIHRydWUpOwotCQlpZiAoY2hlY2tQb3MgPiAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKENfRE9UKTsKLQkJCXBvcyA9IGNoZWNrUG9zOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JYnVmZmVyLmFwcGVuZChDX05BTUVfRU5EKTsKLQlpZiAoZW5kID4gMCkgcG9zID0gZW5kOyAvLyBza2lwIGFycmF5IGRpbWVuc2lvbiB3aGljaCB3ZXJlIHByZXByb2Nlc3NlZAotICAgIHJldHVybiBwb3M7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyB0eXBlIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiB0eXBlIG5hbWUuIElmIHRoZSB0eXBlIG5hbWUgaXMgcXVhbGlmaWVkLAotICogdGhlbiBpdCBpcyBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuIFRoZSB0eXBlIG5hbWUgbWF5IGNvbnRhaW4gcHJpbWl0aXZlCi0gKiB0eXBlcyBvciBhcnJheSB0eXBlcy4gSG93ZXZlciwgcGFyYW1ldGVyaXplZCB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBjcmVhdGVUeXBlU2lnbmF0dXJlKCJpbnQiLCBodWNhaXJ6KSAtPiAiSSIKLSAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCB0cnVlKSAtPiAiTGphdmEubGFuZy5TdHJpbmc7IgotICogY3JlYXRlVHlwZVNpZ25hdHVyZSgiU3RyaW5nIiwgZmFsc2UpIC0+ICJRU3RyaW5nOyIKLSAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCBmYWxzZSkgLT4gIlFqYXZhLmxhbmcuU3RyaW5nOyIKLSAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImludCBbXSIsIGZhbHNlKSAtPiAiW0kiCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gdHlwZU5hbWUgdGhlIHBvc3NpYmx5IHF1YWxpZmllZCB0eXBlIG5hbWUKLSAqIEBwYXJhbSBpc1Jlc29sdmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZAotICogICByZXNvbHZlZCAoZm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lIGZyb20gYSBiaW5hcnkgY2xhc3MgZmlsZSksIGFuZCAKLSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZCB1bnJlc29sdmVkCi0gKiAgIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZm91bmQgaW4gc291cmNlIGNvZGUpCi0gKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgc2lnbmF0dXJlCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVR5cGVTaWduYXR1cmUoU3RyaW5nIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKLQlyZXR1cm4gY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSA9PSBudWxsID8gbnVsbCA6IHR5cGVOYW1lLnRvQ2hhckFycmF5KCksIGlzUmVzb2x2ZWQpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGFycmF5IGNvdW50IChhcnJheSBuZXN0aW5nIGRlcHRoKSBvZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCi0gKgotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBhcnJheSBuZXN0aW5nIGRlcHRoLCBvciAwIGlmIG5vdCBhbiBhcnJheQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQotICogICBjb3JyZWN0Ci0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJyYXlDb3VudChjaGFyW10gdHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CQotCXRyeSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlICh0eXBlU2lnbmF0dXJlW2NvdW50XSA9PSBDX0FSUkFZKSB7Ci0JCQkrK2NvdW50OwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeyAvLyBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgaWYgbGFzdCBjaGFyYWN0ZXIgaXMgQ19BUlJBWQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBhcnJheSBjb3VudCAoYXJyYXkgbmVzdGluZyBkZXB0aCkgb2YgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlLgotICoKLSAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgYXJyYXkgbmVzdGluZyBkZXB0aCwgb3IgMCBpZiBub3QgYW4gYXJyYXkKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKLSAqICAgY29ycmVjdAotICovCi1wdWJsaWMgc3RhdGljIGludCBnZXRBcnJheUNvdW50KFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlyZXR1cm4gZ2V0QXJyYXlDb3VudCh0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSB3aXRob3V0IGFueSBhcnJheSBuZXN0aW5nLgotICogPHA+Ci0gKiBGb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiA8Y29kZT4KLSAqIGdldEVsZW1lbnRUeXBlKHsnWycsICdbJywgJ0knfSkgLS0+IHsnSSd9LgotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgd2l0aG91dCBhcnJheXMKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKLSAqICAgY29ycmVjdAotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldEVsZW1lbnRUeXBlKGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlpbnQgY291bnQgPSBnZXRBcnJheUNvdW50KHR5cGVTaWduYXR1cmUpOwotCWlmIChjb3VudCA9PSAwKSByZXR1cm4gdHlwZVNpZ25hdHVyZTsKLQlpbnQgbGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aC1jb3VudF07Ci0JU3lzdGVtLmFycmF5Y29weSh0eXBlU2lnbmF0dXJlLCBjb3VudCwgcmVzdWx0LCAwLCBsZW5ndGgtY291bnQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIHdpdGhvdXQgYW55IGFycmF5IG5lc3RpbmcuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogZ2V0RWxlbWVudFR5cGUoIltbSSIpIC0tPiAiSSIuCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIAotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSB0eXBlIHNpZ25hdHVyZSB3aXRob3V0IGFycmF5cwotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQotICogICBjb3JyZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlyZXR1cm4gbmV3IFN0cmluZyhnZXRFbGVtZW50VHlwZSh0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4KLSAqCi0gKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQotICogICBjb3JyZWN0Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlckNvdW50KGNoYXJbXSBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCXRyeSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWludCBpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfUEFSQU1fU1RBUlQsIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCWlmIChpIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9IGVsc2UgewotCQkJaSsrOwotCQl9Ci0JCWZvciAoOzspIHsKLQkJCWlmIChtZXRob2RTaWduYXR1cmVbaV0gPT0gQ19QQVJBTV9FTkQpIHsKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQl9Ci0JCQlpbnQgZT0gVXRpbC5zY2FuVHlwZVNpZ25hdHVyZShtZXRob2RTaWduYXR1cmUsIGkpOwotCQkJaWYgKGUgPCAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQlpID0gZSArIDE7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQl9Ci0JfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBraW5kIG9mIHR5cGUgc2lnbmF0dXJlIGVuY29kZWQgYnkgdGhlIGdpdmVuIHN0cmluZy4KLSAqIAotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlIHN0cmluZwotICogQHJldHVybiB0aGUga2luZCBvZiB0eXBlIHNpZ25hdHVyZTsgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50czoKLSAqIHtAbGluayAjQVJSQVlfVFlQRV9TSUdOQVRVUkV9LCB7QGxpbmsgI0NMQVNTX1RZUEVfU0lHTkFUVVJFfSwKLSAqIHtAbGluayAjQkFTRV9UWVBFX1NJR05BVFVSRX0sIG9yIHtAbGluayAjVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkV9LAotICogb3IgKHNpbmNlIDMuMSkge0BsaW5rICNXSUxEQ0FSRF9UWVBFX1NJR05BVFVSRX0gb3Ige0BsaW5rICNDQVBUVVJFX1RZUEVfU0lHTkFUVVJFfQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgc3RhdGljIGludCBnZXRUeXBlU2lnbmF0dXJlS2luZChjaGFyW10gdHlwZVNpZ25hdHVyZSkgewotCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhcgotCWlmICh0eXBlU2lnbmF0dXJlLmxlbmd0aCA8IDEpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQljaGFyIGMgPSB0eXBlU2lnbmF0dXJlWzBdOwotCWlmIChjID09IENfR0VORVJJQ19TVEFSVCkgewotCQlpbnQgY291bnQgPSAxOwotCQlmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJc3dpdGNoICh0eXBlU2lnbmF0dXJlW2ldKSB7Ci0JCQkJY2FzZSAJQ19HRU5FUklDX1NUQVJUOgotCQkJCQljb3VudCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENfR0VORVJJQ19FTkQ6Ci0JCQkJCWNvdW50LS07Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQlpZiAoaSsxIDwgbGVuZ3RoKQotCQkJCQljID0gdHlwZVNpZ25hdHVyZVtpKzFdOyAKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSBDX0FSUkFZIDoKLQkJCXJldHVybiBBUlJBWV9UWVBFX1NJR05BVFVSRTsKLQkJY2FzZSBDX1JFU09MVkVEIDoKLQkJY2FzZSBDX1VOUkVTT0xWRUQgOgotCQkJcmV0dXJuIENMQVNTX1RZUEVfU0lHTkFUVVJFOwotCQljYXNlIENfVFlQRV9WQVJJQUJMRSA6Ci0JCQlyZXR1cm4gVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkU7Ci0JCWNhc2UgQ19CT09MRUFOIDoKLQkJY2FzZSBDX0JZVEUgOgotCQljYXNlIENfQ0hBUiA6Ci0JCWNhc2UgQ19ET1VCTEUgOgotCQljYXNlIENfRkxPQVQgOgotCQljYXNlIENfSU5UIDoKLQkJY2FzZSBDX0xPTkcgOgotCQljYXNlIENfU0hPUlQgOgotCQljYXNlIENfVk9JRCA6Ci0JCQlyZXR1cm4gQkFTRV9UWVBFX1NJR05BVFVSRTsKLQkJY2FzZSBDX1NUQVIgOgotCQljYXNlIENfU1VQRVIgOgotCQljYXNlIENfRVhURU5EUyA6Ci0JCQlyZXR1cm4gV0lMRENBUkRfVFlQRV9TSUdOQVRVUkU7Ci0JCWNhc2UgQ19DQVBUVVJFIDoKLQkJCXJldHVybiBDQVBUVVJFX1RZUEVfU0lHTkFUVVJFOwotCQlkZWZhdWx0IDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUga2luZCBvZiB0eXBlIHNpZ25hdHVyZSBlbmNvZGVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuCi0gKiAKLSAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBzdHJpbmcKLSAqIEByZXR1cm4gdGhlIGtpbmQgb2YgdHlwZSBzaWduYXR1cmU7IG9uZSBvZiB0aGUga2luZCBjb25zdGFudHM6Ci0gKiB7QGxpbmsgI0FSUkFZX1RZUEVfU0lHTkFUVVJFfSwge0BsaW5rICNDTEFTU19UWVBFX1NJR05BVFVSRX0sCi0gKiB7QGxpbmsgI0JBU0VfVFlQRV9TSUdOQVRVUkV9LCBvciB7QGxpbmsgI1RZUEVfVkFSSUFCTEVfU0lHTkFUVVJFfSwKLSAqIG9yIChzaW5jZSAzLjEpIHtAbGluayAjV0lMRENBUkRfVFlQRV9TSUdOQVRVUkV9IG9yIHtAbGluayAjQ0FQVFVSRV9UWVBFX1NJR05BVFVSRX0KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSBzaWduYXR1cmUKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZVNpZ25hdHVyZUtpbmQoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkvLyBuZWVkIGEgbWluaW11bSAxIGNoYXIKLQlpZiAodHlwZVNpZ25hdHVyZS5sZW5ndGgoKSA8IDEpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQljaGFyIGMgPSB0eXBlU2lnbmF0dXJlLmNoYXJBdCgwKTsKLQlpZiAoYyA9PSBDX0dFTkVSSUNfU1RBUlQpIHsKLQkJaW50IGNvdW50ID0gMTsKLQkJZm9yIChpbnQgaSA9IDEsIGxlbmd0aCA9IHR5cGVTaWduYXR1cmUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJc3dpdGNoICh0eXBlU2lnbmF0dXJlLmNoYXJBdChpKSkgewotCQkJCWNhc2UgCUNfR0VORVJJQ19TVEFSVDoKLQkJCQkJY291bnQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDX0dFTkVSSUNfRU5EOgotCQkJCQljb3VudC0tOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJaWYgKGkrMSA8IGxlbmd0aCkKLQkJCQkJYyA9IHR5cGVTaWduYXR1cmUuY2hhckF0KGkrMSk7IAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXN3aXRjaCAoYykgewotCQljYXNlIENfQVJSQVkgOgotCQkJcmV0dXJuIEFSUkFZX1RZUEVfU0lHTkFUVVJFOwotCQljYXNlIENfUkVTT0xWRUQgOgotCQljYXNlIENfVU5SRVNPTFZFRCA6Ci0JCQlyZXR1cm4gQ0xBU1NfVFlQRV9TSUdOQVRVUkU7Ci0JCWNhc2UgQ19UWVBFX1ZBUklBQkxFIDoKLQkJCXJldHVybiBUWVBFX1ZBUklBQkxFX1NJR05BVFVSRTsKLQkJY2FzZSBDX0JPT0xFQU4gOgotCQljYXNlIENfQllURSA6Ci0JCWNhc2UgQ19DSEFSIDoKLQkJY2FzZSBDX0RPVUJMRSA6Ci0JCWNhc2UgQ19GTE9BVCA6Ci0JCWNhc2UgQ19JTlQgOgotCQljYXNlIENfTE9ORyA6Ci0JCWNhc2UgQ19TSE9SVCA6Ci0JCWNhc2UgQ19WT0lEIDoKLQkJCXJldHVybiBCQVNFX1RZUEVfU0lHTkFUVVJFOwotCQljYXNlIENfU1RBUiA6Ci0JCWNhc2UgQ19TVVBFUiA6Ci0JCWNhc2UgQ19FWFRFTkRTIDoKLQkJCXJldHVybiBXSUxEQ0FSRF9UWVBFX1NJR05BVFVSRTsKLQkJY2FzZSBDX0NBUFRVUkUgOgotCQkJcmV0dXJuIENBUFRVUkVfVFlQRV9TSUdOQVRVUkU7Ci0JCWRlZmF1bHQgOgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIHR5cGVzIGluIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlLgotICoKLSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5Ci0gKiAgIGNvcnJlY3QKLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoU3RyaW5nIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGdldFBhcmFtZXRlckNvdW50KG1ldGhvZFNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKLX0KLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlLiAKLSAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KLSAqCi0gKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQotICogICBpbmNvcnJlY3QKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXVtdIGdldFBhcmFtZXRlclR5cGVzKGNoYXJbXSBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCXRyeSB7Ci0JCWludCBjb3VudCA9IGdldFBhcmFtZXRlckNvdW50KG1ldGhvZFNpZ25hdHVyZSk7Ci0JCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2NvdW50XVtdOwotCQlpZiAoY291bnQgPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpbnQgaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihDX1BBUkFNX1NUQVJULCBtZXRob2RTaWduYXR1cmUpOwotCQlpZiAoaSA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCWkrKzsKLQkJfQotCQlpbnQgdCA9IDA7Ci0JCWZvciAoOzspIHsKLQkJCWlmIChtZXRob2RTaWduYXR1cmVbaV0gPT0gQ19QQVJBTV9FTkQpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJaW50IGUgPSBVdGlsLnNjYW5UeXBlU2lnbmF0dXJlKG1ldGhvZFNpZ25hdHVyZSwgaSk7Ci0JCQlpZiAoZSA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXN1bHRbdF0gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG1ldGhvZFNpZ25hdHVyZSwgaSwgZSArIDEpOwotCQkJdCsrOwotCQkJaSA9IGUgKyAxOwotCQl9Ci0JfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlLiAKLSAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KLSAqCi0gKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQotICogICBpbmNvcnJlY3QKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJUeXBlcyhTdHJpbmcgbWV0aG9kU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcyA9IGdldFBhcmFtZXRlclR5cGVzKG1ldGhvZFNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MocGFyYW1ldGVyVHlwZXMpOwotfQotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGUgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIGlmIGFueQotICogVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbiB0eXBlIHNpZ25hdHVyZXMKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQotICogICBpbmNvcnJlY3QKLSAqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VGhyb3duRXhjZXB0aW9uVHlwZXMoU3RyaW5nIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBnZXRUaHJvd25FeGNlcHRpb25UeXBlcyhtZXRob2RTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24udG9TdHJpbmdzKHBhcmFtZXRlclR5cGVzKTsKLX0KLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlIHNpZ25hdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSBpZiBhbnkKLSAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KLSAqCi0gKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRocm93biBleGNlcHRpb24gdHlwZSBzaWduYXR1cmVzCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXVtdIGdldFRocm93bkV4Y2VwdGlvblR5cGVzKGNoYXJbXSBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCS8vIHNraXAgdHlwZSBwYXJhbWV0ZXJzCi0JaW50IGV4Y2VwdGlvblN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfRVhDRVBUSU9OX1NUQVJULCBtZXRob2RTaWduYXR1cmUpOwotCWlmIChleGNlcHRpb25TdGFydCA9PSAtMSkgewotCQlpbnQgcGFyZW4gPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfUEFSQU1fRU5ELCBtZXRob2RTaWduYXR1cmUpOwotCQlpZiAocGFyZW4gPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQkvLyBpZ25vcmUgcmV0dXJuIHR5cGUKLQkJZXhjZXB0aW9uU3RhcnQgPSBVdGlsLnNjYW5UeXBlU2lnbmF0dXJlKG1ldGhvZFNpZ25hdHVyZSwgcGFyZW4rMSkgKyAxOwotCQlpbnQgbGVuZ3RoID0gbWV0aG9kU2lnbmF0dXJlLmxlbmd0aDsKLQkJaWYgKGV4Y2VwdGlvblN0YXJ0ID09IGxlbmd0aCkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCWludCBsZW5ndGggPSBtZXRob2RTaWduYXR1cmUubGVuZ3RoOwotCWludCBpID0gZXhjZXB0aW9uU3RhcnQ7Ci0JQXJyYXlMaXN0IGV4Y2VwdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0JCWlmIChtZXRob2RTaWduYXR1cmVbaV0gPT0gQ19FWENFUFRJT05fU1RBUlQpIHsKLQkJCWV4Y2VwdGlvblN0YXJ0Kys7Ci0JCQlpKys7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CQkJCi0JCX0KLQkJaSA9IFV0aWwuc2NhblR5cGVTaWduYXR1cmUobWV0aG9kU2lnbmF0dXJlLCBpKSArIDE7Ci0JCWV4Y2VwdGlvbkxpc3QuYWRkKENoYXJPcGVyYXRpb24uc3ViYXJyYXkobWV0aG9kU2lnbmF0dXJlLCBleGNlcHRpb25TdGFydCxpKSk7CQotCQlleGNlcHRpb25TdGFydCA9IGk7Ci0JfQotCWNoYXJbXVtdIHJlc3VsdDsKLQlleGNlcHRpb25MaXN0LnRvQXJyYXkocmVzdWx0ID0gbmV3IGNoYXJbZXhjZXB0aW9uTGlzdC5zaXplKCldW10pOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZS4KLSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIHR5cGUgc2lnbmF0dXJlIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSBzaWduYXR1cmUuCi0gKgotICogQHBhcmFtIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBzaWduYXR1cmVzIG9mIHRoZSB0eXBlIGFyZ3VtZW50cwotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdAotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0VHlwZUFyZ3VtZW50cyhjaGFyW10gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCWludCBsZW5ndGggPSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZS5sZW5ndGg7Ci0JaWYgKGxlbmd0aCA8IDIgfHwgcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmVbbGVuZ3RoLTJdICE9IENfR0VORVJJQ19FTkQpCi0JCS8vIGNhbm5vdCBoYXZlIHR5cGUgYXJndW1lbnRzIG90aGVyd2lzZSBzaWduYXR1cmUgd291bGQgZW5kIGJ5ICI+OyIKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwotCWludCBjb3VudCA9IDE7IC8vIHN0YXJ0IHRvIGNvdW50IGdlbmVyaWMgZW5kL3N0YXJ0IHBlZXJzCi0JaW50IHN0YXJ0ID0gbGVuZ3RoIC0gMjsKLQl3aGlsZSAoc3RhcnQgPj0gMCAmJiBjb3VudCA+IDApIHsKLQkJc3dpdGNoIChwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZVstLXN0YXJ0XSkgewotCQkJY2FzZSBDX0dFTkVSSUNfU1RBUlQ6Ci0JCQkJY291bnQtLTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ19HRU5FUklDX0VORDoKLQkJCQljb3VudCsrOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChzdGFydCA8IDApIC8vIGludmFsaWQgbnVtYmVyIG9mIGdlbmVyaWMgc3RhcnQvZW5kCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQlBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLQlpbnQgcCA9IHN0YXJ0ICsgMTsKLQl3aGlsZSAodHJ1ZSkgewotCQlpZiAocCA+PSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZS5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZVtwXTsKLQkJaWYgKGMgPT0gQ19HRU5FUklDX0VORCkgewotCQkJaW50IHNpemUgPSBhcmdzLnNpemUoKTsKLQkJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW3NpemVdW107Ci0JCQlhcmdzLnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaW50IGUgPSBVdGlsLnNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmUocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUsIHApOwotCQlhcmdzLmFkZChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlLCBwLCBlKzEpKTsKLQkJcCA9IGUgKyAxOwotCX0KLX0KLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgdHlwZSBhcmd1bWVudCBzaWduYXR1cmVzIGZyb20gdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlLgotICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgdHlwZSBzaWduYXR1cmUgaXMgbm90IGEgcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZS4KLSAqCi0gKiBAcGFyYW0gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIHR5cGUgYXJndW1lbnRzCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUeXBlQXJndW1lbnRzKFN0cmluZyBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JY2hhcltdW10gYXJncyA9IGdldFR5cGVBcmd1bWVudHMocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24udG9TdHJpbmdzKGFyZ3MpOwotfQotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0eXBlIGVyYXN1cmUgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcml6ZWQgdHlwZSBzaWduYXR1cmUuCi0gKiBSZXR1cm5zIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZSBpZiBpdCBpcyBub3QgcGFyYW1ldGVyaXplZC4KLSAqIAotICogQHBhcmFtIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgZXJhc3VyZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5Ci0gKiAgIGluY29ycmVjdAotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFR5cGVFcmFzdXJlKGNoYXJbXSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JaW50IGVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihDX0dFTkVSSUNfU1RBUlQsIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlKTsKLQlpZiAoZW5kID09IC0xKSByZXR1cm4gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmU7Ci0JaW50IGxlbmd0aCA9IHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlLmxlbmd0aDsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQlpbnQgcG9zID0gMDsKLQlpbnQgc3RhcnQgPSAwOwotCWludCBkZWVwPSAwOwotCWZvciAoaW50IGlkeD1lbmQ7IGlkeDxsZW5ndGg7IGlkeCsrKSB7Ci0JCXN3aXRjaCAocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmVbaWR4XSkgewotCQkJY2FzZSBDX0dFTkVSSUNfU1RBUlQ6Ci0JCQkJaWYgKGRlZXAgPT0gMCkgewotCQkJCQlpbnQgc2l6ZSA9IGlkeC1zdGFydDsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSwgc3RhcnQsIHJlc3VsdCwgcG9zLCBzaXplKTsKLQkJCQkJZW5kID0gaWR4OwotCQkJCQlwb3MgKz0gc2l6ZTsKLQkJCQl9Ci0JCQkJZGVlcCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDX0dFTkVSSUNfRU5EOgotCQkJCWRlZXAtLTsKLQkJCQlpZiAoZGVlcCA8IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQlpZiAoZGVlcCA9PSAwKSBzdGFydCA9IGlkeCsxOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChkZWVwID4gMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCWludCBzaXplID0gcG9zK2xlbmd0aC1zdGFydDsKLQljaGFyW10gcmVzaXplZCA9IG5ldyBjaGFyW3NpemVdOwotCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByZXNpemVkLCAwLCBwb3MpOwotCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUsIHN0YXJ0LCByZXNpemVkLCBwb3MsIGxlbmd0aC1zdGFydCk7Ci0JcmV0dXJuIHJlc2l6ZWQ7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIHR5cGUgZXJhc3VyZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZS4KLSAqIFJldHVybnMgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIGlmIGl0IGlzIG5vdCBwYXJhbWV0ZXJpemVkLgotICogCi0gKiBAcGFyYW0gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSBlcmFzdXJlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZUVyYXN1cmUoU3RyaW5nIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlyZXR1cm4gbmV3IFN0cmluZyhnZXRUeXBlRXJhc3VyZShwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpKSk7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIG9yIHR5cGUgc2lnbmF0dXJlLiAKLSAqIFRoZSBtZXRob2Qgb3IgdHlwZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBtZXRob2RPclR5cGVTaWduYXR1cmUgdGhlIG1ldGhvZCBvciB0eXBlIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmVzCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW11bXSBnZXRUeXBlUGFyYW1ldGVycyhjaGFyW10gbWV0aG9kT3JUeXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQl0cnkgewotCQlpbnQgbGVuZ3RoID0gbWV0aG9kT3JUeXBlU2lnbmF0dXJlLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCWlmIChtZXRob2RPclR5cGVTaWduYXR1cmVbMF0gIT0gQ19HRU5FUklDX1NUQVJUKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCQotCQlBcnJheUxpc3QgcGFyYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJaW50IHBhcmFtU3RhcnQgPSAxLCBpID0gMTsgIC8vIHN0YXJ0IGFmdGVyIGxlYWRpbmcgJzwnCi0JCXdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0JCQlpZiAobWV0aG9kT3JUeXBlU2lnbmF0dXJlW2ldID09IENfR0VORVJJQ19FTkQpIHsKLQkJCQlpbnQgc2l6ZSA9IHBhcmFtTGlzdC5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPT0gMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAKLQkJCQljaGFyW11bXSByZXN1bHQ7Ci0JCQkJcGFyYW1MaXN0LnRvQXJyYXkocmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV1bXSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19DT0xPTiwgbWV0aG9kT3JUeXBlU2lnbmF0dXJlLCBpKTsKLQkJCWlmIChpIDwgMCB8fCBpID49IGxlbmd0aCkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJLy8gaXRlcmF0ZSBvdmVyIGJvdW5kcwotCQkJd2hpbGUgKG1ldGhvZE9yVHlwZVNpZ25hdHVyZVtpXSA9PSAnOicpIHsKLQkJCQlpKys7IC8vIHNraXAgY29sb24KLQkJCQlzd2l0Y2ggKG1ldGhvZE9yVHlwZVNpZ25hdHVyZVtpXSkgewotCQkJCQljYXNlICc6JzoKLQkJCQkJCS8vIG5vIGNsYXNzIGJvdW5kCi0JCQkJCQlicmVhazsgCi0JCQkJCWNhc2UgQ19HRU5FUklDX0VORDoKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIENfUkVTT0xWRUQ6Ci0JCQkJCQl0cnkgewotCQkJCQkJCWkgPSBVdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUobWV0aG9kT3JUeXBlU2lnbmF0dXJlLCBpKTsKLQkJCQkJCQlpKys7IC8vIHBvc2l0aW9uIGF0IHN0YXJ0IG9mIG5leHQgcGFyYW0gaWYgYW55Ci0JCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5vdCBhIGNsYXNzIHR5cGUgc2lnbmF0dXJlIC0+IGl0IGlzIGEgbmV3IHR5cGUgcGFyYW1ldGVyCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBDX0FSUkFZOgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpID0gVXRpbC5zY2FuQXJyYXlUeXBlU2lnbmF0dXJlKG1ldGhvZE9yVHlwZVNpZ25hdHVyZSwgaSk7Ci0JCQkJCQkJaSsrOyAvLyBwb3NpdGlvbiBhdCBzdGFydCBvZiBuZXh0IHBhcmFtIGlmIGFueQotCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBub3QgYW4gYXJyYXkgdHlwZSBzaWduYXR1cmUgLT4gaXQgaXMgYSBuZXcgdHlwZSBwYXJhbWV0ZXIKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIENfVFlQRV9WQVJJQUJMRToKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaSA9IFV0aWwuc2NhblR5cGVWYXJpYWJsZVNpZ25hdHVyZShtZXRob2RPclR5cGVTaWduYXR1cmUsIGkpOwotCQkJCQkJCWkrKzsgLy8gcG9zaXRpb24gYXQgc3RhcnQgb2YgbmV4dCBwYXJhbSBpZiBhbnkKLQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbm90IGEgdHlwZSB2YXJpYWJsZSBzaWduYXR1cmUgLT4gaXQgaXMgYSBuZXcgdHlwZSBwYXJhbWV0ZXIKLQkJCQkJCX0JCQkJCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJLy8gZGVmYXVsdDogYW5vdGhlciB0eXBlIHBhcmFtZXRlciBpcyBzdGFydGluZwotCQkJCX0KLQkJCX0KLQkJCXBhcmFtTGlzdC5hZGQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShtZXRob2RPclR5cGVTaWduYXR1cmUsIHBhcmFtU3RhcnQsIGkpKTsKLQkJCXBhcmFtU3RhcnQgPSBpOyAvLyBuZXh0IHBhcmFtIHN0YXJ0IGZyb20gaGVyZQotCQl9Ci0JfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJLy8gaW52YWxpZCBzaWduYXR1cmUsIGZhbGwgdGhyb3VnaAotCX0KLQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci19Ci0vKioKLSAqIEV4dHJhY3RzIHRoZSB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmVzIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBvciB0eXBlIHNpZ25hdHVyZS4gCi0gKiBUaGUgbWV0aG9kIG9yIHR5cGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KLSAqCi0gKiBAcGFyYW0gbWV0aG9kT3JUeXBlU2lnbmF0dXJlIHRoZSBtZXRob2Qgb3IgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlcwotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5Ci0gKiAgIGluY29ycmVjdAotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VHlwZVBhcmFtZXRlcnMoU3RyaW5nIG1ldGhvZE9yVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JY2hhcltdW10gcGFyYW1zID0gZ2V0VHlwZVBhcmFtZXRlcnMobWV0aG9kT3JUeXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOwotCXJldHVybiBDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhwYXJhbXMpOwotfQotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0eXBlIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZm9ybWFsIHR5cGUgcGFyYW1ldGVyCi0gKiBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHZhcmlhYmxlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVWYXJpYWJsZShTdHJpbmcgZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoZ2V0VHlwZVZhcmlhYmxlKGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOwotfQotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0eXBlIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZm9ybWFsIHR5cGUgcGFyYW1ldGVyCi0gKiBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHZhcmlhYmxlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFR5cGVWYXJpYWJsZShjaGFyW10gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JaW50IHAgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19DT0xPTiwgZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSk7Ci0JaWYgKHAgPCAwKSB7Ci0JCS8vIG5vICI6IiBtZWFucyBjYW4ndCBiZSBhIGZvcm1hbCB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmUKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCAwLCBwKTsKLX0KLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgY2xhc3MgYW5kIGludGVyZmFjZSBib3VuZHMgZnJvbSB0aGUgZ2l2ZW4gZm9ybWFsIHR5cGUKLSAqIHBhcmFtZXRlciBzaWduYXR1cmUuIFRoZSBjbGFzcyBib3VuZCwgaWYgcHJlc2VudCwgaXMgbGlzdGVkIGJlZm9yZQotICogdGhlIGludGVyZmFjZSBib3VuZHMuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgdHlwZSBzaWduYXR1cmVzIGZvciB0aGUgYm91bmRzCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKLSAqICAgaW5jb3JyZWN0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0VHlwZVBhcmFtZXRlckJvdW5kcyhjaGFyW10gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JaW50IHAxID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfQ09MT04sIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpOwotCWlmIChwMSA8IDApIHsKLQkJLy8gbm8gIjoiIG1lYW5zIGNhbid0IGJlIGEgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCWlmIChwMSA9PSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLmxlbmd0aCAtIDEpIHsKLQkJLy8gbm8gY2xhc3Mgb3IgaW50ZXJmYWNlIGJvdW5kcwotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JfQotCWludCBwMiA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihDX0NPTE9OLCBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEpOwotCWNoYXJbXSBjbGFzc0JvdW5kOwotCWlmIChwMiA8IDApIHsKLQkJLy8gbm8gaW50ZXJmYWNlIGJvdW5kcwotCQljbGFzc0JvdW5kID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEsIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUubGVuZ3RoKTsKLQkJcmV0dXJuIG5ldyBjaGFyW11bXSB7Y2xhc3NCb3VuZH07Ci0JfQotCWlmIChwMiA9PSBwMSArIDEpIHsKLQkJLy8gbm8gY2xhc3MgYm91bmQsIGJ1dCAxIG9yIG1vcmUgaW50ZXJmYWNlIGJvdW5kcwotCQljbGFzc0JvdW5kID0gbnVsbDsKLQl9IGVsc2UgewotCQljbGFzc0JvdW5kID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEsIHAyKTsKLQl9Ci0JY2hhcltdW10gaW50ZXJmYWNlQm91bmRzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKENfQ09MT04sIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUsIHAyICsgMSwgZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZS5sZW5ndGgpOwotCWlmIChjbGFzc0JvdW5kID09IG51bGwpIHsKLQkJcmV0dXJuIGludGVyZmFjZUJvdW5kczsKLQl9Ci0JaW50IHJlc3VsdExlbmd0aCA9IGludGVyZmFjZUJvdW5kcy5sZW5ndGggKyAxOwotCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbmd0aF1bXTsKLQlyZXN1bHRbMF0gPSBjbGFzc0JvdW5kOwotCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlQm91bmRzLCAwLCByZXN1bHQsIDEsIGludGVyZmFjZUJvdW5kcy5sZW5ndGgpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgYm91bmRzIGZyb20gdGhlIGdpdmVuIGZvcm1hbCB0eXBlCi0gKiBwYXJhbWV0ZXIgc2lnbmF0dXJlLiBUaGUgY2xhc3MgYm91bmQsIGlmIHByZXNlbnQsIGlzIGxpc3RlZCBiZWZvcmUKLSAqIHRoZSBpbnRlcmZhY2UgYm91bmRzLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KLSAqCi0gKiBAcGFyYW0gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIHR5cGUgc2lnbmF0dXJlcyBmb3IgdGhlIGJvdW5kcwotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5Ci0gKiAgIGluY29ycmVjdAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoU3RyaW5nIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCWNoYXJbXVtdIGJvdW5kcyA9IGdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoYm91bmRzKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgY2hhciBhcnJheSBjb250YWluaW5nIGFsbCBidXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZ2l2ZW4gCi0gKiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLiBSZXR1cm5zIHRoZSBlbXB0eSBjaGFyIGFycmF5IGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogZ2V0UXVhbGlmaWVyKHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9KSAtPiB7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJ30KLSAqIGdldFF1YWxpZmllcih7J08nLCAndScsICd0JywgJ2UnLCAncicsICcuJywgJ0knLCAnbicsICduJywgJ2UnLCAncid9KSAtPiB7J08nLCAndScsICd0JywgJ2UnLCAncid9Ci0gKiBnZXRRdWFsaWZpZXIoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCcsICcuJywgJ0wnLCAnaScsICdzJywgJ3QnLCAnPCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJz4nfSkgLT4geydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCd9Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICogQHJldHVybiB0aGUgcXVhbGlmaWVyIHByZWZpeCwgb3IgdGhlIGVtcHR5IGNoYXIgYXJyYXkgaWYgdGhlIG5hbWUgY29udGFpbnMgbm8KLSAqICAgZG90cwotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UXVhbGlmaWVyKGNoYXJbXSBuYW1lKSB7Ci0JaW50IGZpcnN0R2VuZXJpY1N0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfR0VORVJJQ19TVEFSVCwgbmFtZSk7Ci0JaW50IGxhc3REb3QgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfRE9ULCBuYW1lLCAwLCBmaXJzdEdlbmVyaWNTdGFydCA9PSAtMSA/IG5hbWUubGVuZ3RoLTEgOiBmaXJzdEdlbmVyaWNTdGFydCk7Ci0JaWYgKGxhc3REb3QgPT0gLTEpIHsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQl9Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgMCwgbGFzdERvdCk7Ci19Ci0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhbGwgYnV0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGdpdmVuIAotICogZG90LXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZS4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogZ2V0UXVhbGlmaWVyKCJqYXZhLmxhbmcuT2JqZWN0IikgLSZndDsgImphdmEubGFuZyIKLSAqIGdldFF1YWxpZmllcigiT3V0ZXIuSW5uZXIiKSAtJmd0OyAiT3V0ZXIiCi0gKiBnZXRRdWFsaWZpZXIoImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IikgLSZndDsgImphdmEudXRpbCIKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogPC9wPgotICoKLSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gKiBAcmV0dXJuIHRoZSBxdWFsaWZpZXIgcHJlZml4LCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSBuYW1lIGNvbnRhaW5zIG5vCi0gKiAgIGRvdHMKLSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YWxpZmllcihTdHJpbmcgbmFtZSkgewotCWNoYXJbXSBxdWFsaWZpZXIgPSBnZXRRdWFsaWZpZXIobmFtZS50b0NoYXJBcnJheSgpKTsKLQlpZiAocXVhbGlmaWVyLmxlbmd0aCA9PSAwKSByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5FTVBUWV9TVFJJTkc7Ci0JcmV0dXJuIG5ldyBTdHJpbmcocXVhbGlmaWVyKTsKLX0KLS8qKgotICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIAotICogZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZXR1cm4gdHlwZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5Ci0gKiAgIGluY29ycmVjdAotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFJldHVyblR5cGUoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JLy8gc2tpcCB0eXBlIHBhcmFtZXRlcnMKLQlpbnQgcGFyZW4gPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfUEFSQU1fRU5ELCBtZXRob2RTaWduYXR1cmUpOwotCWlmIChwYXJlbiA9PSAtMSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCS8vIHRoZXJlIGNvdWxkIGJlIHRocm93biBleGNlcHRpb25zIGJlaGluZCwgdGh1cyBzY2FuIG9uZSB0eXBlIGV4YWN0bHkKLQlpbnQgbGFzdCA9IFV0aWwuc2NhblR5cGVTaWduYXR1cmUobWV0aG9kU2lnbmF0dXJlLCBwYXJlbisxKTsKLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShtZXRob2RTaWduYXR1cmUsIHBhcmVuICsgMSwgbGFzdCsxKTsKLX0KLS8qKgotICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIAotICogZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgotICoKLSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZXR1cm4gdHlwZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5Ci0gKiAgIGluY29ycmVjdAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCXJldHVybiBuZXcgU3RyaW5nKGdldFJldHVyblR5cGUobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKLX0KLS8qKgotICogUmV0dXJucyBwYWNrYWdlIGZyYWdtZW50IG9mIGEgdHlwZSBzaWduYXR1cmUuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICcuJwotICogYW5kIHRoZSB0eXBlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICckJy4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBnZXRTaWduYXR1cmVRdWFsaWZpZXIoeydMJywgJ2onLCAnYScsICd2JywgJ2EnLCAnLicsICd1JywgJ3QnLCAnaScsICdsJywgJy4nLCAnTScsICdhJywgJ3AnLCAnJCcsICdFJywgJ24nLCAndCcsICdyJywgJ3knLCAnOyd9KSAtPiB7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICd1JywgJ3QnLCAnaScsICdsJ30KLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogPC9wPgotICogCi0gKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQgKHNlcGFyYXRvcnMgYXJlICcuJykKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB7Ci0JaWYodHlwZVNpZ25hdHVyZSA9PSBudWxsKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCQotCWNoYXJbXSBxdWFsaWZpZWRUeXBlID0gU2lnbmF0dXJlLnRvQ2hhckFycmF5KHR5cGVTaWduYXR1cmUpOwotCQotCWludCBkb3RDb3VudCA9IDA7Ci0JaW5kZXhGb3VuZDogZm9yKGludCBpID0gMDsgaSA8IHR5cGVTaWduYXR1cmUubGVuZ3RoOyBpKyspIHsKLQkJc3dpdGNoKHR5cGVTaWduYXR1cmVbaV0pIHsKLQkJCWNhc2UgQ19ET1Q6Ci0JCQkJZG90Q291bnQrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ19HRU5FUklDX1NUQVJUOgotCQkJCWJyZWFrIGluZGV4Rm91bmQ7Ci0JCQljYXNlIENfRE9MTEFSOgotCQkJCWJyZWFrIGluZGV4Rm91bmQ7Ci0JCX0KLQl9Ci0JCi0JaWYoZG90Q291bnQgPiAwKSB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBxdWFsaWZpZWRUeXBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihxdWFsaWZpZWRUeXBlW2ldID09ICcuJykgewotCQkJCWRvdENvdW50LS07Ci0JCQl9Ci0JCQlpZihkb3RDb3VudCA8PSAwKSB7Ci0JCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkVHlwZSwgMCwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLX0KLS8qKgotICogUmV0dXJucyBwYWNrYWdlIGZyYWdtZW50IG9mIGEgdHlwZSBzaWduYXR1cmUuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICcuJwotICogYW5kIHRoZSB0eXBlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICckJy4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBnZXRTaWduYXR1cmVRdWFsaWZpZXIoIkxqYXZhLnV0aWwuTWFwJEVudHJ5IikgLT4gImphdmEudXRpbCIKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogPC9wPgotICogCi0gKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQgKHNlcGFyYXRvcnMgYXJlICcuJykKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHR5cGVTaWduYXR1cmUgPT0gbnVsbCA/IG51bGwgOiB0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKLX0KLS8qKgotICogUmV0dXJucyB0eXBlIGZyYWdtZW50IG9mIGEgdHlwZSBzaWduYXR1cmUuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICcuJwotICogYW5kIHRoZSB0eXBlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICckJy4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBnZXRTaWduYXR1cmVTaW1wbGVOYW1lKHsnTCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCcsICcuJywgJ00nLCAnYScsICdwJywgJyQnLCAnRScsICduJywgJ3QnLCAncicsICd5JywgJzsnfSkgLT4geydNJywgJ2EnLCAncCcsICcuJywgJ0UnLCAnbicsICd0JywgJ3InLCAneSd9Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIAotICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCi0gKiBAcmV0dXJuIHRoZSB0eXBlIGZyYWdtZW50IChzZXBhcmF0b3JzIGFyZSAnLicpCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFNpZ25hdHVyZVNpbXBsZU5hbWUoY2hhcltdIHR5cGVTaWduYXR1cmUpIHsKLQlpZih0eXBlU2lnbmF0dXJlID09IG51bGwpIHJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCi0JY2hhcltdIHF1YWxpZmllZFR5cGUgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZVNpZ25hdHVyZSk7Ci0JCi0JaW50IGRvdENvdW50ID0gMDsKLQlpbmRleEZvdW5kOiBmb3IoaW50IGkgPSAwOyBpIDwgdHlwZVNpZ25hdHVyZS5sZW5ndGg7IGkrKykgewotCQlzd2l0Y2godHlwZVNpZ25hdHVyZVtpXSkgewotCQkJY2FzZSBDX0RPVDoKLQkJCQlkb3RDb3VudCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDX0dFTkVSSUNfU1RBUlQ6Ci0JCQkJYnJlYWsgaW5kZXhGb3VuZDsKLQkJCWNhc2UgQ19ET0xMQVI6Ci0JCQkJYnJlYWsgaW5kZXhGb3VuZDsKLQkJfQotCX0KLQkKLQlpZihkb3RDb3VudCA+IDApIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IHF1YWxpZmllZFR5cGUubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHF1YWxpZmllZFR5cGVbaV0gPT0gJy4nKSB7Ci0JCQkJZG90Q291bnQtLTsKLQkJCX0KLQkJCWlmKGRvdENvdW50IDw9IDApIHsKLQkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWRUeXBlLCBpICsgMSwgcXVhbGlmaWVkVHlwZS5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBxdWFsaWZpZWRUeXBlOwotfQotLyoqCi0gKiBSZXR1cm5zIHR5cGUgZnJhZ21lbnQgb2YgYSB0eXBlIHNpZ25hdHVyZS4gVGhlIHBhY2thZ2UgZnJhZ21lbnQgc2VwYXJhdG9yIG11c3QgYmUgJy4nCi0gKiBhbmQgdGhlIHR5cGUgZnJhZ21lbnQgc2VwYXJhdG9yIG11c3QgYmUgJyQnLgotICogPHA+Ci0gKiBGb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiA8Y29kZT4KLSAqIGdldFNpZ25hdHVyZVNpbXBsZU5hbWUoIkxqYXZhLnV0aWwuTWFwJEVudHJ5IikgLT4gIk1hcC5FbnRyeSIKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogPC9wPgotICogCi0gKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKLSAqIEByZXR1cm4gdGhlIHR5cGUgZnJhZ21lbnQgKHNlcGFyYXRvcnMgYXJlICcuJykKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewotCXJldHVybiBuZXcgU3RyaW5nKGdldFNpZ25hdHVyZVNpbXBsZU5hbWUodHlwZVNpZ25hdHVyZSA9PSBudWxsID8gbnVsbCA6IHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOwotfQotCQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCi0gKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogZ2V0U2ltcGxlTmFtZSh7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfSkgLT4geydPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICogQHJldHVybiB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZQotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0U2ltcGxlTmFtZShjaGFyW10gbmFtZSkgewotCi0JaW50IGxhc3REb3QgPSAtMSwgbGFzdEdlbmVyaWNTdGFydCA9IC0xLCBsYXN0R2VuZXJpY0VuZCA9IC0xOwotCWludCBkZXB0aCA9IDA7Ci0JaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOwotCWxhc3REb3RMb29rdXA6IGZvciAoaW50IGkgPSBsZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCXN3aXRjaCAobmFtZVtpXSkgewotCQkJY2FzZSAnLic6Ci0JCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQkJbGFzdERvdCA9IGk7Ci0JCQkJCWJyZWFrIGxhc3REb3RMb29rdXA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnPCc6Ci0JCQkJZGVwdGgtLTsKLQkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNTdGFydCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNFbmQgPSBpOwotCQkJCWRlcHRoKys7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGxhc3RHZW5lcmljU3RhcnQgPCAwKSB7Ci0JCWlmIChsYXN0RG90IDwgMCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuICBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIGxhc3REb3QgKyAxLCBsZW5ndGgpOwotCX0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JaW50IG5hbWVTdGFydCA9IGxhc3REb3QgPCAwID8gMCA6IGxhc3REb3QrMTsKLQlidWZmZXIuYXBwZW5kKG5hbWUsIG5hbWVTdGFydCwgbGFzdEdlbmVyaWNTdGFydCAtIG5hbWVTdGFydCk7Ci0JYXBwZW5kQXJndW1lbnRTaW1wbGVOYW1lcyhuYW1lLCBsYXN0R2VuZXJpY1N0YXJ0LCBsYXN0R2VuZXJpY0VuZCwgYnVmZmVyKTsKLQlidWZmZXIuYXBwZW5kKG5hbWUsIGxhc3RHZW5lcmljRW5kKzEsIGxlbmd0aC1sYXN0R2VuZXJpY0VuZC0xKTsgLy8gY29weSB0cmFpbGluZyBwb3J0aW9uLCBtYXkgY29udGFpbiBkaW1lbnNpb25zCQotCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggPSBidWZmZXIubGVuZ3RoKCldOwotCWJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIHJlc3VsdCwgMCk7Ci0JcmV0dXJuIHJlc3VsdDsJCi19Ci0vKioKLSAqIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZ2l2ZW4gZG90LXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZS4KLSAqIFJldHVybnMgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBnZXRTaW1wbGVOYW1lKCJqYXZhLmxhbmcuT2JqZWN0IikgLSZndDsgIk9iamVjdCIKLSAqIDwvY29kZT4KLSAqIDxjb2RlPgotICogZ2V0U2ltcGxlTmFtZSgiamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Jmd0OyIpIC0mZ3Q7ICJNYXAmbHQ7U3RyaW5nLE9iamVjdCZndDsiCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICogQHJldHVybiB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZQotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgbmFtZSkgewotCWludCBsYXN0RG90ID0gLTEsIGxhc3RHZW5lcmljU3RhcnQgPSAtMSwgbGFzdEdlbmVyaWNFbmQgPSAtMTsKLQlpbnQgZGVwdGggPSAwOwotCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCWxhc3REb3RMb29rdXA6IGZvciAoaW50IGkgPSBsZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCXN3aXRjaCAobmFtZS5jaGFyQXQoaSkpIHsKLQkJCWNhc2UgJy4nOgotCQkJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkJCWxhc3REb3QgPSBpOwotCQkJCQlicmVhayBsYXN0RG90TG9va3VwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJzwnOgotCQkJCWRlcHRoLS07Ci0JCQkJaWYgKGRlcHRoID09IDApIGxhc3RHZW5lcmljU3RhcnQgPSBpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJaWYgKGRlcHRoID09IDApIGxhc3RHZW5lcmljRW5kID0gaTsKLQkJCQlkZXB0aCsrOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChsYXN0R2VuZXJpY1N0YXJ0IDwgMCkgewotCQlpZiAobGFzdERvdCA8IDApIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSwgbGVuZ3RoKTsKLQl9Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwotCWNoYXJbXSBuYW1lQ2hhcnMgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0JaW50IG5hbWVTdGFydCA9IGxhc3REb3QgPCAwID8gMCA6IGxhc3REb3QrMTsKLQlidWZmZXIuYXBwZW5kKG5hbWVDaGFycywgbmFtZVN0YXJ0LCBsYXN0R2VuZXJpY1N0YXJ0IC0gbmFtZVN0YXJ0KTsKLQlhcHBlbmRBcmd1bWVudFNpbXBsZU5hbWVzKG5hbWVDaGFycywgbGFzdEdlbmVyaWNTdGFydCwgbGFzdEdlbmVyaWNFbmQsIGJ1ZmZlcik7Ci0JYnVmZmVyLmFwcGVuZChuYW1lQ2hhcnMsIGxhc3RHZW5lcmljRW5kKzEsIGxlbmd0aC1sYXN0R2VuZXJpY0VuZC0xKTsgLy8gY29weSB0cmFpbGluZyBwb3J0aW9uLCBtYXkgY29udGFpbiBkaW1lbnNpb25zCQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRTaW1wbGVOYW1lKGNoYXJbXSBuYW1lLCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQlpbnQgbGFzdERvdCA9IC0xLCBsYXN0R2VuZXJpY1N0YXJ0ID0gLTEsIGxhc3RHZW5lcmljRW5kID0gLTE7Ci0JaW50IGRlcHRoID0gMDsKLQlpZiAobmFtZVtzdGFydF0gPT0gJz8nKSB7IC8vIHdpbGRjYXJkCi0JCWJ1ZmZlci5hcHBlbmQoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSBjb25zdW1lV2hpdGVzcGFjZShuYW1lLCBzdGFydCsxLCBlbmQrMSk7Ci0JCXN3aXRjaCAobmFtZVtpbmRleF0pIHsKLQkJCWNhc2UgJ2UnIDoKLQkJCQlpbnQgY2hlY2tQb3MgPSBjaGVja05hbWUoRVhURU5EUywgbmFtZSwgaW5kZXgsIGVuZCk7Ci0JCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgewotCQkJICAgICAgICBidWZmZXIuYXBwZW5kKCcgJykuYXBwZW5kKEVYVEVORFMpLmFwcGVuZCgnICcpOwotCQkJICAgICAgICBpbmRleCA9IGNvbnN1bWVXaGl0ZXNwYWNlKG5hbWUsIGNoZWNrUG9zLCBlbmQrMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAncycgOgotCQkJCWNoZWNrUG9zID0gY2hlY2tOYW1lKFNVUEVSLCBuYW1lLCBpbmRleCwgZW5kKzEpOwotCQkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKLQkJCSAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChTVVBFUikuYXBwZW5kKCcgJyk7Ci0JCQkgICAgICAgIGluZGV4ID0gY29uc3VtZVdoaXRlc3BhY2UobmFtZSwgY2hlY2tQb3MsIGVuZCsxKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJc3RhcnQgPSBpbmRleDsgLy8gbGVhZGluZyBzZWdtZW50IGdvdCBwcm9jZXNzZWQKLQl9Ci0JbGFzdERvdExvb2t1cDogZm9yIChpbnQgaSA9IGVuZDsgaSA+PSBzdGFydDsgaS0tKSB7Ci0JCXN3aXRjaCAobmFtZVtpXSkgewotCQkJY2FzZSAnLic6Ci0JCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQkJbGFzdERvdCA9IGk7Ci0JCQkJCWNoYXIgYyA9IG5hbWVbc3RhcnRdOwotCQkJCQlpZiAoYyA9PSBDX0VYVEVORFMgfHwgYyA9PSBDX1NVUEVSKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrIGxhc3REb3RMb29rdXA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnPCc6Ci0JCQkJZGVwdGgtLTsKLQkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNTdGFydCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNFbmQgPSBpOwotCQkJCWRlcHRoKys7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaW50IG5hbWVTdGFydCA9IGxhc3REb3QgPCAwID8gc3RhcnQgOiBsYXN0RG90KzE7Ci0JaW50IG5hbWVFbmQgPSBsYXN0R2VuZXJpY1N0YXJ0IDwgMCA/IGVuZCsxIDogbGFzdEdlbmVyaWNTdGFydDsKLQlidWZmZXIuYXBwZW5kKG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCk7Ci0JaWYgKGxhc3RHZW5lcmljU3RhcnQgPj0gMCkgewotCQlhcHBlbmRBcmd1bWVudFNpbXBsZU5hbWVzKG5hbWUsIGxhc3RHZW5lcmljU3RhcnQsIGxhc3RHZW5lcmljRW5kLCBidWZmZXIpOwotCQlidWZmZXIuYXBwZW5kKG5hbWUsIGxhc3RHZW5lcmljRW5kKzEsIGVuZCAtIGxhc3RHZW5lcmljRW5kKTsgLy8gY29weSB0cmFpbGluZyBwb3J0aW9uLCBtYXkgY29udGFpbiBkaW1lbnNpb25zCi0JfQotfQogLy8gPHgueS56LCBhLmI8Yz4uZDxlLmY+PiAtLT4gPHosZDxmPj4KIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQXJndW1lbnRTaW1wbGVOYW1lcyhjaGFyW10gbmFtZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAJYnVmZmVyLmFwcGVuZCgnPCcpOwpAQCAtMTk2Niw3ICs0NTYsNyBAQAogCQkJCQlhcmd1bWVudFN0YXJ0ID0gaSsxOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWNhc2UgJz4nIDogCisJCQljYXNlICc+JyA6CiAJCQkJaWYgKGRlcHRoID09IDEpIHsKIAkJCQkJaWYgKGFyZ3VtZW50Q291bnQgPiAwKSBidWZmZXIuYXBwZW5kKCcsJyk7CiAJCQkJCWFwcGVuZFNpbXBsZU5hbWUobmFtZSwgYXJndW1lbnRTdGFydCwgaS0xLCBidWZmZXIpOwpAQCAtMTk3OSw0MDQgKzQ2OSwxOSBAQAogCQkJCQlpZiAoYXJndW1lbnRDb3VudCA+IDApIGJ1ZmZlci5hcHBlbmQoJywnKTsKIAkJCQkJYXBwZW5kU2ltcGxlTmFtZShuYW1lLCBhcmd1bWVudFN0YXJ0LCBpLTEsIGJ1ZmZlcik7CiAJCQkJCWFyZ3VtZW50Q291bnQrKzsKLQkJCQkJYXJndW1lbnRTdGFydCA9IGkrMTsJCQkJCQorCQkJCQlhcmd1bWVudFN0YXJ0ID0gaSsxOwogCQkJCX0KIAkJCQlicmVhazsKIAkJfQogCX0KIAlidWZmZXIuYXBwZW5kKCc+Jyk7CiB9Ci0vKioKLSAqIFJldHVybnMgYWxsIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgotICogUmV0dXJucyBhbiBhcnJheSB3aXRoIG9ubHkgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KLSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIG5hbWUgaXMgZW1wdHkuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogZ2V0U2ltcGxlTmFtZXMoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ08nLCAnYicsICdqJywgJ2UnLCAnYycsICd0J30pIC0+IHt7J2onLCAnYScsICd2JywgJ2EnfSwgeydsJywgJ2EnLCAnbicsICdnJ30sIHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0KLSAqIGdldFNpbXBsZU5hbWVzKHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfSkgLT4ge3snTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0KLSAqIGdldFNpbXBsZU5hbWVzKHt9KSAtPiB7fQotICogZ2V0U2ltcGxlTmFtZXMoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCcsICcuJywgJ0wnLCAnaScsICdzJywgJ3QnLCAnPCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJz4nfSkgLT4ge3snaicsICdhJywgJ3YnLCAnYSd9LCB7J2wnLCAnYScsICduJywgJ2cnfSwgeydMJywgJ2knLCAncycsICd0JywgJzwnLCAnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZyd9fQotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKgotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2ltcGxlIG5hbWVzLCBwb3NzaWJseSBlbXB0eQotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW11bXSBnZXRTaW1wbGVOYW1lcyhjaGFyW10gbmFtZSkgewotCWludCBsZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGg7Ci0JaWYgKGxlbmd0aCA9PSAwKQotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCi0JaW50IHdvcmRDb3VudCA9IDE7Ci0JY291bnRpbmdXb3JkczogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJc3dpdGNoKG5hbWVbaV0pIHsKLQkJCWNhc2UgQ19ET1Q6Ci0JCQkJd29yZENvdW50Kys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENfR0VORVJJQ19TVEFSVDoKLQkJCQlicmVhayBjb3VudGluZ1dvcmRzOwotCQl9Ci0JY2hhcltdW10gc3BsaXQgPSBuZXcgY2hhclt3b3JkQ291bnRdW107Ci0JaW50IGxhc3QgPSAwLCBjdXJyZW50V29yZCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlpZiAobmFtZVtpXSA9PSBDX0dFTkVSSUNfU1RBUlQpIGJyZWFrOwotCQlpZiAobmFtZVtpXSA9PSBDX0RPVCkgewotCQkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbaSAtIGxhc3RdOwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQluYW1lLAotCQkJCWxhc3QsCi0JCQkJc3BsaXRbY3VycmVudFdvcmQrK10sCi0JCQkJMCwKLQkJCQlpIC0gbGFzdCk7Ci0JCQlsYXN0ID0gaSArIDE7Ci0JCX0KLQl9Ci0Jc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbbGVuZ3RoIC0gbGFzdF07Ci0JU3lzdGVtLmFycmF5Y29weShuYW1lLCBsYXN0LCBzcGxpdFtjdXJyZW50V29yZF0sIDAsIGxlbmd0aCAtIGxhc3QpOwotCXJldHVybiBzcGxpdDsKLX0KLS8qKgotICogUmV0dXJucyBhbGwgc2VnbWVudHMgb2YgdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCi0gKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggb25seSB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgotICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgbmFtZSBpcyBlbXB0eS4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBnZXRTaW1wbGVOYW1lcygiamF2YS5sYW5nLk9iamVjdCIpIC0mZ3Q7IHsiamF2YSIsICJsYW5nIiwgIk9iamVjdCJ9Ci0gKiBnZXRTaW1wbGVOYW1lcygiT2JqZWN0IikgLSZndDsgeyJPYmplY3QifQotICogZ2V0U2ltcGxlTmFtZXMoIiIpIC0mZ3Q7IHt9Ci0gKiBnZXRTaW1wbGVOYW1lcygiamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiKSAtJmd0OyAKLSAqICAgeyJqYXZhIiwgInV0aWwiLCAiTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyJ9Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW1wbGUgbmFtZXMsIHBvc3NpYmx5IGVtcHR5Ci0gKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNpbXBsZU5hbWVzKFN0cmluZyBuYW1lKSB7Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24udG9TdHJpbmdzKGdldFNpbXBsZU5hbWVzKG5hbWUudG9DaGFyQXJyYXkoKSkpOwotfQogCiAvKioKLSAqIFJlbW92ZXMgYW55IGNhcHR1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gdHlwZSBvciBtZXRob2Qgc2lnbmF0dXJlCi0gKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHNpZ25hdHVyZS4KLSAqIFJldHVybnMgdGhlIHR5cGUgb3IgbWV0aG9kIHNpZ25hdHVyZSBpdHNlbGYgaWYgbm8gY2FwdHVyZSBpbmZvcm1hdGlvbiBpcwotICogcHJlc2VudC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUgKHVzaW5nIGVxdWl2YWxlbnQgc3RyaW5nLWJhc2VkIG1ldGhvZCk6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiByZW1vdmVDYXB0dXJlKCJMVGVzdCZsdDshK0xqYXZhLmxhbmcuVGhyb3dhYmxlOyZndDs7IikKLSAqIHdpbGwgcmV0dXJuOiAiTFRlc3QmbHQ7K0xqYXZhLmxhbmcuVGhyb3dhYmxlOyZndDs7IgotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKgotICogQHBhcmFtIG1ldGhvZE9yVHlwZVNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHdoaWNoIG1heSBoYXZlIGJlZW4gY2FwdHVyZWQKLSAqIEByZXR1cm4gYSBuZXcgc2lnbmF0dXJlIHdpdGhvdXQgY2FwdHVyZSBpbmZvcm1hdGlvbiBvciB0aGUgc2lnbmF0dXJlIGl0c2VsZgotICogCWlmIG5vIHNwZWNpZmljIGNhcHR1cmUgaW5mb3JtYXRpb24gaXMgcHJlc2VudAotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5tZXRob2RPclR5cGVTaWduYXR1cmU8L2NvZGU+IGlzIG51bGwKLSAqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUNhcHR1cmUoY2hhcltdIG1ldGhvZE9yVHlwZVNpZ25hdHVyZSkgewotCXJldHVybiBDaGFyT3BlcmF0aW9uLnJlbW92ZShtZXRob2RPclR5cGVTaWduYXR1cmUsIENfQ0FQVFVSRSk7Ci19Ci0JCi0vKioKLSAqIFJlbW92ZXMgYW55IGNhcHR1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gdHlwZSBvciBtZXRob2Qgc2lnbmF0dXJlCi0gKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHNpZ25hdHVyZS4KLSAqIFJldHVybnMgdGhlIHR5cGUgb3IgbWV0aG9kIHNpZ25hdHVyZSBpdHNlbGYgaWYgbm8gY2FwdHVyZSBpbmZvcm1hdGlvbiBpcwotICogcHJlc2VudC4KLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiByZW1vdmVDYXB0dXJlKCJMVGVzdCZsdDshK0xqYXZhLmxhbmcuVGhyb3dhYmxlOyZndDs7IikKLSAqIHdpbGwgcmV0dXJuOiAiTFRlc3QmbHQ7K0xqYXZhLmxhbmcuVGhyb3dhYmxlOyZndDs7IgotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKgotICogQHBhcmFtIG1ldGhvZE9yVHlwZVNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHdoaWNoIG1heSBoYXZlIGJlZW4gY2FwdHVyZWQKLSAqIEByZXR1cm4gYSBuZXcgc2lnbmF0dXJlIHdpdGhvdXQgY2FwdHVyZSBpbmZvcm1hdGlvbiBvciB0aGUgc2lnbmF0dXJlIGl0c2VsZgotICogCWlmIG5vIHNwZWNpZmljIGNhcHR1cmUgaW5mb3JtYXRpb24gaXMgcHJlc2VudAotICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5tZXRob2RPclR5cGVTaWduYXR1cmU8L2NvZGU+IGlzIG51bGwKLSAqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUNhcHR1cmUoU3RyaW5nIG1ldGhvZE9yVHlwZVNpZ25hdHVyZSkgewotCWNoYXJbXSBhcnJheSA9IG1ldGhvZE9yVHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpOwotCWNoYXJbXSByZXN1bHQgPSByZW1vdmVDYXB0dXJlKGFycmF5KTsKLQlpZiAoYXJyYXkgPT0gcmVzdWx0KSByZXR1cm4gbWV0aG9kT3JUeXBlU2lnbmF0dXJlOwotCXJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBmb3JtLiBUaGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBleHBlY3RlZCB0bwotICogYmUgZG90LWJhc2VkLgotICogPHA+Ci0gKiBGb3IgZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiA8Y29kZT4KLSAqIHRvU3RyaW5nKCIoW0xqYXZhLmxhbmcuU3RyaW5nOylWIiwgIm1haW4iLCBuZXcgU3RyaW5nW10geyJhcmdzIn0sIGZhbHNlLCB0cnVlKSAtPiAidm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIgotICogPC9jb2RlPgotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUgdG8gY29udmVydAotICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnNlcnQgaW4gdGhlIHJlc3VsdCwgb3IgCi0gKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG1ldGhvZCBuYW1lIGlzIHRvIGJlIGluY2x1ZGVkCi0gKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgdGhlIHBhcmFtZXRlciBuYW1lcyB0byBpbnNlcnQgaW4gdGhlIHJlc3VsdCwgb3IgCi0gKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBuYW1lcyBhcmUgdG8gYmUgaW5jbHVkZWQ7IGlmIHN1cHBsaWVkLAotICogICB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBuYW1lcyBtdXN0IG1hdGNoIHRoYXQgb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKLSAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcwotICogQHBhcmFtIGluY2x1ZGVSZXR1cm5UeXBlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXR1cm4gdHlwZSBpcyB0byBiZQotICogICBpbmNsdWRlZAotICogQHJldHVybiB0aGUgY2hhciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIHRvQ2hhckFycmF5KGNoYXJbXSBtZXRob2RTaWduYXR1cmUsIGNoYXJbXSBtZXRob2ROYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgYm9vbGVhbiBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJvb2xlYW4gaW5jbHVkZVJldHVyblR5cGUpIHsKLQlyZXR1cm4gdG9DaGFyQXJyYXkobWV0aG9kU2lnbmF0dXJlLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJOYW1lcywgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBpbmNsdWRlUmV0dXJuVHlwZSwgZmFsc2UpOwotfQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSB0byBhIHJlYWRhYmxlIGZvcm0uIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvCi0gKiBiZSBkb3QtYmFzZWQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlOgotICogPHByZT4KLSAqIDxjb2RlPgotICogdG9TdHJpbmcoIihbTGphdmEubGFuZy5TdHJpbmc7KVYiLCAibWFpbiIsIG5ldyBTdHJpbmdbXSB7ImFyZ3MifSwgZmFsc2UsIHRydWUpIC0+ICJ2b2lkIG1haW4oU3RyaW5nW10gYXJncykiCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIAotICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvciAKLSAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWV0aG9kIG5hbWUgaXMgdG8gYmUgaW5jbHVkZWQKLSAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lcyB0aGUgcGFyYW1ldGVyIG5hbWVzIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvciAKLSAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVyIG5hbWVzIGFyZSB0byBiZSBpbmNsdWRlZDsgaWYgc3VwcGxpZWQsCi0gKiAgIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIG5hbWVzIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQotICogICBxdWFsaWZpZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIG9ubHkgc2ltcGxlIG5hbWVzCi0gKiBAcGFyYW0gaW5jbHVkZVJldHVyblR5cGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJldHVybiB0eXBlIGlzIHRvIGJlCi0gKiAgIGluY2x1ZGVkCi0gKiBAcGFyYW0gaXNWYXJnQXJncyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFzdCBhcmd1bWVudCBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGEgCi0gKiB2YXJpYWJsZSBhcmd1bWVudCwgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gKiBAcmV0dXJuIHRoZSBjaGFyIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFyQXJyYXkoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSwgY2hhcltdIG1ldGhvZE5hbWUsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYm9vbGVhbiBpbmNsdWRlUmV0dXJuVHlwZSwgYm9vbGVhbiBpc1ZhcmdBcmdzKSB7Ci0JaW50IGZpcnN0UGFyZW4gPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKTsKLQlpZiAoZmlyc3RQYXJlbiA9PSAtMSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG1ldGhvZFNpZ25hdHVyZS5sZW5ndGggKyAxMCk7Ci0JCi0JLy8gcmV0dXJuIHR5cGUKLQlpZiAoaW5jbHVkZVJldHVyblR5cGUpIHsKLQkJY2hhcltdIHJ0cyA9IGdldFJldHVyblR5cGUobWV0aG9kU2lnbmF0dXJlKTsKLQkJYXBwZW5kVHlwZVNpZ25hdHVyZShydHMsIDAgLCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQl9Ci0JCi0JLy8gc2VsZWN0b3IKLQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JfQotCQotCS8vIHBhcmFtZXRlcnMKLQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JY2hhcltdW10gcHRzID0gZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kU2lnbmF0dXJlKTsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gcHRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCWlmIChpID09IG1heCAtIDEpIHsKLQkJCWFwcGVuZFR5cGVTaWduYXR1cmUocHRzW2ldLCAwICwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIsIGlzVmFyZ0FyZ3MpOwotCQl9IGVsc2UgewotCQkJYXBwZW5kVHlwZVNpZ25hdHVyZShwdHNbaV0sIDAgLCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7Ci0JCX0KLQkJaWYgKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyTmFtZXNbaV0pOwotCQl9Ci0JCWlmIChpICE9IHB0cy5sZW5ndGggLSAxKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCX0KLQl9Ci0JYnVmZmVyLmFwcGVuZCgnKScpOwotCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltidWZmZXIubGVuZ3RoKCldOwotCWJ1ZmZlci5nZXRDaGFycygwLCBidWZmZXIubGVuZ3RoKCksIHJlc3VsdCwgMCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogQ29udmVydHMgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgc3RyaW5nLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvCi0gKiBiZSBkb3QtYmFzZWQuCi0gKiAKLSAqIDxwPgotICogRm9yIGV4YW1wbGU6Ci0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiB0b1N0cmluZyh7J1snLCAnTCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJzsnfSkgLT4geydqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJ1snLCAnXSd9Ci0gKiB0b1N0cmluZyh7J0knfSkgLT4geydpJywgJ24nLCAndCd9Ci0gKiB0b1N0cmluZyh7JysnLCAnTCcsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCcsICc7J30pIC0+IHsnPycsICcgJywgJ2UnLCAneCcsICd0JywgJ2UnLCAnbicsICdkJywgJ3MnLCAnICcsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIDxwPgotICogTm90ZTogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IGEgdHlwZSBzaWduYXR1cmUgY29udGFpbmluZyBhIDxjb2RlPickJzwvY29kZT4KLSAqIGlzIGFuIGlubmVyIHR5cGUgc2lnbmF0dXJlLiBXaGlsZSB0aGlzIGlzIGNvcnJlY3QgaW4gbW9zdCBjYXNlcywgc29tZW9uZSBjb3VsZCAKLSAqIGRlZmluZSBhIG5vbi1pbm5lciB0eXBlIG5hbWUgY29udGFpbmluZyBhIDxjb2RlPickJzwvY29kZT4uIEhhbmRsaW5nIHRoaXMgCi0gKiBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzIHdvdWxkIGhhdmUgcmVxdWlyZWQgcmVzb2x2aW5nIHRoZSBzaWduYXR1cmUsIHdoaWNoIAotICogZ2VuZXJhbGx5IG5vdCBmZWFzaWJsZS4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQotICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5Ci0gKiAgIGNvcnJlY3QKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJBcnJheShjaGFyW10gc2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaW50IHNpZ0xlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7Ci0JCWlmIChzaWdMZW5ndGggPT0gMCB8fCBzaWduYXR1cmVbMF0gPT0gQ19QQVJBTV9TVEFSVCB8fCBzaWduYXR1cmVbMF0gPT0gQ19HRU5FUklDX1NUQVJUKSB7Ci0JCQlyZXR1cm4gdG9DaGFyQXJyYXkoc2lnbmF0dXJlLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIG51bGwsIHRydWUsIHRydWUpOwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzaWduYXR1cmUubGVuZ3RoICsgMTApOwotCQlhcHBlbmRUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgMCwgdHJ1ZSwgYnVmZmVyKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2J1ZmZlci5sZW5ndGgoKV07Ci0JCWJ1ZmZlci5nZXRDaGFycygwLCBidWZmZXIubGVuZ3RoKCksIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KLSAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAotICogY2hhcmFjdGVyLgotICogCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0gKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKLSAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcwotICogQHBhcmFtIGJ1ZmZlciB0aGUgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdG8KLSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQotICogQHNlZSBVdGlsI3NjYW5UeXBlU2lnbmF0dXJlKGNoYXJbXSwgaW50KQotICovCi1wcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kVHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JcmV0dXJuIGFwcGVuZFR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIsIGZhbHNlKTsKLX0KLS8qKgotICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KLSAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAotICogY2hhcmFjdGVyLgotICogCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0gKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKLSAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcwotICogQHBhcmFtIGJ1ZmZlciB0aGUgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdG8KLSAqIEBwYXJhbSBpc1ZhckFyZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbXVzdCBiZSBkaXNwbGF5ZWQgYXMgYQotICogdmFyaWFibGUgYXJndW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbXVzdCBiZSBhbiBhcnJheSB0eXBlCi0gKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSBzaWduYXR1cmUsIG9yIGlmIGlzVmFyQXJncyBpcyA8Y29kZT50cnVlPC9jb2RlPiwKLSAqIGFuZCB0aGUgdHlwZSBpcyBub3QgYW4gYXJyYXkgdHlwZSBzaWduYXR1cmUuCi0gKiBAc2VlIFV0aWwjc2NhblR5cGVTaWduYXR1cmUoY2hhcltdLCBpbnQpCi0gKi8KLXByaXZhdGUgc3RhdGljIGludCBhcHBlbmRUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCwgYm9vbGVhbiBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNWYXJBcmdzKSB7Ci0JLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCi0JaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCWlmIChpc1ZhckFyZ3MpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlIENfQVJSQVkgOgotCQkJCXJldHVybiBhcHBlbmRBcnJheVR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIsIHRydWUpOwotCQkJY2FzZSBDX1JFU09MVkVEIDoKLQkJCWNhc2UgQ19VTlJFU09MVkVEIDoKLQkJCWNhc2UgQ19UWVBFX1ZBUklBQkxFIDoKLQkJCWNhc2UgQ19CT09MRUFOIDoKLQkJCWNhc2UgQ19CWVRFIDoKLQkJCWNhc2UgQ19DSEFSIDoKLQkJCWNhc2UgQ19ET1VCTEUgOgotCQkJY2FzZSBDX0ZMT0FUIDoKLQkJCWNhc2UgQ19JTlQgOgotCQkJY2FzZSBDX0xPTkcgOgotCQkJY2FzZSBDX1NIT1JUIDoKLQkJCWNhc2UgQ19WT0lEIDoKLQkJCWNhc2UgQ19TVEFSOgotCQkJY2FzZSBDX0VYVEVORFM6Ci0JCQljYXNlIENfU1VQRVI6Ci0JCQljYXNlIENfQ0FQVFVSRToKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBhIHZhciBhcmdzIGlzIGFuIGFycmF5IHR5cGUKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSBDX0FSUkFZIDoKLQkJCQlyZXR1cm4gYXBwZW5kQXJyYXlUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKLQkJCWNhc2UgQ19SRVNPTFZFRCA6Ci0JCQljYXNlIENfVU5SRVNPTFZFRCA6Ci0JCQkJcmV0dXJuIGFwcGVuZENsYXNzVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7Ci0JCQljYXNlIENfVFlQRV9WQVJJQUJMRSA6Ci0JCQkJaW50IGUgPSBVdGlsLnNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzdHJpbmcsIHN0YXJ0ICsgMSwgZSAtIHN0YXJ0IC0gMSk7Ci0JCQkJcmV0dXJuIGU7Ci0JCQljYXNlIENfQk9PTEVBTiA6Ci0JCQkJYnVmZmVyLmFwcGVuZChCT09MRUFOKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfQllURSA6Ci0JCQkJYnVmZmVyLmFwcGVuZChCWVRFKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfQ0hBUiA6Ci0JCQkJYnVmZmVyLmFwcGVuZChDSEFSKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfRE9VQkxFIDoKLQkJCQlidWZmZXIuYXBwZW5kKERPVUJMRSk7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJY2FzZSBDX0ZMT0FUIDoKLQkJCQlidWZmZXIuYXBwZW5kKEZMT0FUKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfSU5UIDoKLQkJCQlidWZmZXIuYXBwZW5kKElOVCk7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJY2FzZSBDX0xPTkcgOgotCQkJCWJ1ZmZlci5hcHBlbmQoTE9ORyk7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJY2FzZSBDX1NIT1JUIDoKLQkJCQlidWZmZXIuYXBwZW5kKFNIT1JUKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfVk9JRCA6Ci0JCQkJYnVmZmVyLmFwcGVuZChWT0lEKTsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQljYXNlIENfQ0FQVFVSRSA6Ci0JCQkJcmV0dXJuIGFwcGVuZENhcHR1cmVUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKLQkJCWNhc2UgQ19TVEFSOgotCQkJY2FzZSBDX0VYVEVORFM6Ci0JCQljYXNlIENfU1VQRVI6Ci0JCQkJcmV0dXJuIGFwcGVuZFR5cGVBcmd1bWVudFNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci19Ci0vKioKICAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGFuIGFycmF5IHR5cGUgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgogICogaW5kZXggYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGdpdmVuIGJ1ZmZlciwgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0CiAgKiBjaGFyYWN0ZXIuCi0gKiAKKyAqCiAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCiAgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKQEAgLTIzODgsMzcgKzQ5MywxMiBAQAogcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZEFycmF5VHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAJcmV0dXJuIGFwcGVuZEFycmF5VHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlciwgZmFsc2UpOwogfQotLyoqCi0gKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KLSAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAotICogY2hhcmFjdGVyLgotICogCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0gKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKLSAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcwotICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZQotICogQHNlZSBVdGlsI3NjYW5BcnJheVR5cGVTaWduYXR1cmUoY2hhcltdLCBpbnQpCi0gKi8KLXByaXZhdGUgc3RhdGljIGludCBhcHBlbmRDYXB0dXJlVHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JLy8gbmVlZCBhIG1pbmltdW0gMiBjaGFyCi0JaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAxKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKLQlpZiAoYyAhPSBDX0NBUFRVUkUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQlidWZmZXIuYXBwZW5kKENBUFRVUkUpLmFwcGVuZCgnICcpOwotCXJldHVybiBhcHBlbmRUeXBlQXJndW1lbnRTaWduYXR1cmUoc3RyaW5nLCBzdGFydCArIDEsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKLX0KIAogLyoqCiAgKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KICAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAogICogY2hhcmFjdGVyLgotICogCisgKgogICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwogICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiBAcGFyYW0gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHR5cGUgbmFtZXMgc2hvdWxkIGJlIGZ1bGx5CkBAIC0yNDM5LDcgKzUxOSw3IEBACiAJaWYgKGMgIT0gQ19BUlJBWSkgewogCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJfQotCQorCiAJaW50IGluZGV4ID0gc3RhcnQ7CiAJYyA9IHN0cmluZ1srK2luZGV4XTsKIAl3aGlsZShjID09IENfQVJSQVkpIHsKQEAgLTI0NDksMTMgKzUyOSwxMyBAQAogCQl9CiAJCWMgPSBzdHJpbmdbKytpbmRleF07CiAJfQotCQorCiAJaW50IGUgPSBhcHBlbmRUeXBlU2lnbmF0dXJlKHN0cmluZywgaW5kZXgsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKLQkKKwogCWZvcihpbnQgaSA9IDEsIGRpbXMgPSBpbmRleCAtIHN0YXJ0OyBpIDwgZGltczsgaSsrKSB7CiAJCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQoJ10nKTsKIAl9Ci0JCisKIAlpZiAoaXNWYXJBcmdzKSB7CiAJCWJ1ZmZlci5hcHBlbmQoJy4nKS5hcHBlbmQoJy4nKS5hcHBlbmQoJy4nKTsKIAl9IGVsc2UgewpAQCAtMjQ2NCwxMCArNTQ0LDM1IEBACiAJcmV0dXJuIGU7CiB9CiAvKioKKyAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGFuIGNhcHR1cmUgdHlwZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisgKiBpbmRleCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QKKyAqIGNoYXJhY3Rlci4KKyAqCisgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKKyAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcworICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZQorICogQHNlZSBVdGlsI3NjYW5BcnJheVR5cGVTaWduYXR1cmUoY2hhcltdLCBpbnQpCisgKi8KK3ByaXZhdGUgc3RhdGljIGludCBhcHBlbmRDYXB0dXJlVHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJLy8gbmVlZCBhIG1pbmltdW0gMiBjaGFyCisJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAxKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9CisJY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKKwlpZiAoYyAhPSBDX0NBUFRVUkUpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwlidWZmZXIuYXBwZW5kKENBUFRVUkUpLmFwcGVuZCgnICcpOworCXJldHVybiBhcHBlbmRUeXBlQXJndW1lbnRTaWduYXR1cmUoc3RyaW5nLCBzdGFydCArIDEsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKK30KKy8qKgogICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSBjbGFzcyB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KICAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAogICogY2hhcmFjdGVyLgotICogCisgKgogICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwogICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiBAcGFyYW0gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHR5cGUgbmFtZXMgc2hvdWxkIGJlIGZ1bGx5CkBAIC0yNDc5LDcgKzU4NCw3IEBACiAgKi8KIHByaXZhdGUgc3RhdGljIGludCBhcHBlbmRDbGFzc1R5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0LCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogCS8vIG5lZWQgYSBtaW5pbXVtIDMgY2hhcnMgIkx4OyIKLQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDIpIHsgCisJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAyKSB7CiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAl9CiAJLy8gbXVzdCBzdGFydCBpbiAiTCIgb3IgIlEiCkBAIC0yNTU3LDEyICs2NjIsMTQyIEBACiAJCXArKzsKIAl9CiB9CisvKioKKyAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGFuIGludGVyc2VjdGlvbiB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KKyAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAorICogY2hhcmFjdGVyLgorICoKKyAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQorICogICBxdWFsaWZpZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIG9ubHkgc2ltcGxlIG5hbWVzCisgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGFuIGFycmF5IHR5cGUgc2lnbmF0dXJlCisgKiBAc2VlIFV0aWwjc2NhbkFycmF5VHlwZVNpZ25hdHVyZShjaGFyW10sIGludCkKKyAqLworcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZEludGVyc2VjdGlvblR5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0LCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCS8vIG5lZWQgYSBtaW5pbXVtIDIgY2hhcgorCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoIC0gMSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07CisJaWYgKGMgIT0gQ19JTlRFUlNFQ1RJT04pIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwlzdGFydCA9IGFwcGVuZENsYXNzVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0ICsgMSwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCWlmIChzdGFydCA8IHN0cmluZy5sZW5ndGggLSAxKSB7CisJCXN0YXJ0Kys7CisJCWlmIChzdHJpbmdbc3RhcnRdICE9IENfQ09MT04pIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNob3VsZCBiZSBhIGNvbG9uIGF0IHRoaXMgbG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXdoaWxlIChzdHJpbmdbc3RhcnRdID09IENfQ09MT04pIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCQlzdGFydCA9IGFwcGVuZENsYXNzVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0ICsgMSwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCQkJaWYgKHN0YXJ0ID09IHN0cmluZy5sZW5ndGggLSAxKSB7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJfSBlbHNlIGlmIChzdGFydCA+IHN0cmluZy5sZW5ndGggLSAxKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2hvdWxkIGJlIGF0IHRoZSBlbmQiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJc3RhcnQrKzsKKwkJfQorCX0KKwlyZXR1cm4gc3RhcnQ7Cit9Citwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFNpbXBsZU5hbWUoY2hhcltdIG5hbWUsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCWludCBsYXN0RG90ID0gLTEsIGxhc3RHZW5lcmljU3RhcnQgPSAtMSwgbGFzdEdlbmVyaWNFbmQgPSAtMTsKKwlpbnQgZGVwdGggPSAwOworCWlmIChuYW1lW3N0YXJ0XSA9PSAnPycpIHsgLy8gd2lsZGNhcmQKKwkJYnVmZmVyLmFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkCisJCWludCBpbmRleCA9IGNvbnN1bWVXaGl0ZXNwYWNlKG5hbWUsIHN0YXJ0KzEsIGVuZCsxKTsKKwkJc3dpdGNoIChuYW1lW2luZGV4XSkgeworCQkJY2FzZSAnZScgOgorCQkJCWludCBjaGVja1BvcyA9IGNoZWNrTmFtZShFWFRFTkRTLCBuYW1lLCBpbmRleCwgZW5kKTsKKwkJCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7CisJCQkgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoRVhURU5EUykuYXBwZW5kKCcgJyk7CisJCQkgICAgICAgIGluZGV4ID0gY29uc3VtZVdoaXRlc3BhY2UobmFtZSwgY2hlY2tQb3MsIGVuZCsxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdzJyA6CisJCQkJY2hlY2tQb3MgPSBjaGVja05hbWUoU1VQRVIsIG5hbWUsIGluZGV4LCBlbmQrMSk7CisJCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgeworCQkJICAgICAgICBidWZmZXIuYXBwZW5kKCcgJykuYXBwZW5kKFNVUEVSKS5hcHBlbmQoJyAnKTsKKwkJCSAgICAgICAgaW5kZXggPSBjb25zdW1lV2hpdGVzcGFjZShuYW1lLCBjaGVja1BvcywgZW5kKzEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlzdGFydCA9IGluZGV4OyAvLyBsZWFkaW5nIHNlZ21lbnQgZ290IHByb2Nlc3NlZAorCX0KKwlsYXN0RG90TG9va3VwOiBmb3IgKGludCBpID0gZW5kOyBpID49IHN0YXJ0OyBpLS0pIHsKKwkJc3dpdGNoIChuYW1lW2ldKSB7CisJCQljYXNlICcuJzoKKwkJCQlpZiAoZGVwdGggPT0gMCkgeworCQkJCQlsYXN0RG90ID0gaTsKKwkJCQkJY2hhciBjID0gbmFtZVtzdGFydF07CisJCQkJCWlmIChjID09IENfRVhURU5EUyB8fCBjID09IENfU1VQRVIpIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoYyk7CisJCQkJCX0KKwkJCQkJYnJlYWsgbGFzdERvdExvb2t1cDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICc8JzoKKwkJCQlkZXB0aC0tOworCQkJCWlmIChkZXB0aCA9PSAwKSBsYXN0R2VuZXJpY1N0YXJ0ID0gaTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJz4nOgorCQkJCWlmIChkZXB0aCA9PSAwKSBsYXN0R2VuZXJpY0VuZCA9IGk7CisJCQkJZGVwdGgrKzsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpbnQgbmFtZVN0YXJ0ID0gbGFzdERvdCA8IDAgPyBzdGFydCA6IGxhc3REb3QrMTsKKwlpbnQgbmFtZUVuZCA9IGxhc3RHZW5lcmljU3RhcnQgPCAwID8gZW5kKzEgOiBsYXN0R2VuZXJpY1N0YXJ0OworCWJ1ZmZlci5hcHBlbmQobmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kIC0gbmFtZVN0YXJ0KTsKKwlpZiAobGFzdEdlbmVyaWNTdGFydCA+PSAwKSB7CisJCWFwcGVuZEFyZ3VtZW50U2ltcGxlTmFtZXMobmFtZSwgbGFzdEdlbmVyaWNTdGFydCwgbGFzdEdlbmVyaWNFbmQsIGJ1ZmZlcik7CisJCWJ1ZmZlci5hcHBlbmQobmFtZSwgbGFzdEdlbmVyaWNFbmQrMSwgZW5kIC0gbGFzdEdlbmVyaWNFbmQpOyAvLyBjb3B5IHRyYWlsaW5nIHBvcnRpb24sIG1heSBjb250YWluIGRpbWVuc2lvbnMKKwl9Cit9CisKKy8qKgorICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KKyAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAorICogY2hhcmFjdGVyLgorICoKKyAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQorICogICBxdWFsaWZpZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIG9ubHkgc2ltcGxlIG5hbWVzCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bworICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlCisgKiBAc2VlIFV0aWwjc2NhblR5cGVBcmd1bWVudFNpZ25hdHVyZShjaGFyW10sIGludCkKKyAqLworcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZFR5cGVBcmd1bWVudFNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCisJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOworCXN3aXRjaChjKSB7CisJCWNhc2UgQ19TVEFSIDoKKwkJCWJ1ZmZlci5hcHBlbmQoJz8nKTsKKwkJCXJldHVybiBzdGFydDsKKwkJY2FzZSBDX0VYVEVORFMgOgorCQkJYnVmZmVyLmFwcGVuZCgiPyBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gYXBwZW5kVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0ICsgMSwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCQljYXNlIENfU1VQRVIgOgorCQkJYnVmZmVyLmFwcGVuZCgiPyBzdXBlciAiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGFwcGVuZFR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCArIDEsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gYXBwZW5kVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJfQorfQogCiAvKioKICAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgbGlzdCBvZiB0eXBlIGFyZ3VtZW50cyBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlCiAgKiBnaXZlbiBpbmRleCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlCiAgKiBsYXN0IGNoYXJhY3Rlci4KLSAqIAorICoKICAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKICAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgogICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQpAQCAtMjYwMiw0MiArODM3LDE5MjAgQEAKIAkJcCA9IGUgKyAxOwogCX0KIH0KLQogLyoqCi0gKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgorICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KICAqIGluZGV4IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdAogICogY2hhcmFjdGVyLgotICogCisgKgogICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwogICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiBAcGFyYW0gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHR5cGUgbmFtZXMgc2hvdWxkIGJlIGZ1bGx5CiAgKiAgIHF1YWxpZmllZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2Ugb25seSBzaW1wbGUgbmFtZXMKICAqIEBwYXJhbSBidWZmZXIgdGhlIHN0cmluZyBidWZmZXIgdG8gYXBwZW5kIHRvCiAgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSBhcmd1bWVudCBzaWduYXR1cmUKLSAqIEBzZWUgVXRpbCNzY2FuVHlwZUFyZ3VtZW50U2lnbmF0dXJlKGNoYXJbXSwgaW50KQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQorICogQHNlZSBVdGlsI3NjYW5UeXBlU2lnbmF0dXJlKGNoYXJbXSwgaW50KQogICovCi1wcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kVHlwZUFyZ3VtZW50U2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCwgYm9vbGVhbiBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKK3ByaXZhdGUgc3RhdGljIGludCBhcHBlbmRUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCwgYm9vbGVhbiBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwlyZXR1cm4gYXBwZW5kVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlciwgZmFsc2UpOworfQorCisvKioKKyAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisgKiBpbmRleCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QKKyAqIGNoYXJhY3Rlci4KKyAqCisgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKKyAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcworICogQHBhcmFtIGJ1ZmZlciB0aGUgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBpc1ZhckFyZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbXVzdCBiZSBkaXNwbGF5ZWQgYXMgYQorICogdmFyaWFibGUgYXJndW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbXVzdCBiZSBhbiBhcnJheSB0eXBlCisgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSBzaWduYXR1cmUsIG9yIGlmIGlzVmFyQXJncyBpcyA8Y29kZT50cnVlPC9jb2RlPiwKKyAqIGFuZCB0aGUgdHlwZSBpcyBub3QgYW4gYXJyYXkgdHlwZSBzaWduYXR1cmUuCisgKiBAc2VlIFV0aWwjc2NhblR5cGVTaWduYXR1cmUoY2hhcltdLCBpbnQpCisgKi8KK3ByaXZhdGUgc3RhdGljIGludCBhcHBlbmRUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCwgYm9vbGVhbiBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNWYXJBcmdzKSB7CiAJLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCiAJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKIAkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCX0KIAljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCXN3aXRjaChjKSB7Ci0JCWNhc2UgQ19TVEFSIDoKLQkJCWJ1ZmZlci5hcHBlbmQoJz8nKTsKLQkJCXJldHVybiBzdGFydDsKLQkJY2FzZSBDX0VYVEVORFMgOgotCQkJYnVmZmVyLmFwcGVuZCgiPyBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYXBwZW5kVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0ICsgMSwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOwotCQljYXNlIENfU1VQRVIgOgotCQkJYnVmZmVyLmFwcGVuZCgiPyBzdXBlciAiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGFwcGVuZFR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCArIDEsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYnVmZmVyKTsKLQkJZGVmYXVsdCA6Ci0JCQlyZXR1cm4gYXBwZW5kVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJaWYgKGlzVmFyQXJncykgeworCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgQ19BUlJBWSA6CisJCQkJcmV0dXJuIGFwcGVuZEFycmF5VHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlciwgdHJ1ZSk7CisJCQljYXNlIENfUkVTT0xWRUQgOgorCQkJY2FzZSBDX1VOUkVTT0xWRUQgOgorCQkJY2FzZSBDX1RZUEVfVkFSSUFCTEUgOgorCQkJY2FzZSBDX0JPT0xFQU4gOgorCQkJY2FzZSBDX0JZVEUgOgorCQkJY2FzZSBDX0NIQVIgOgorCQkJY2FzZSBDX0RPVUJMRSA6CisJCQljYXNlIENfRkxPQVQgOgorCQkJY2FzZSBDX0lOVCA6CisJCQljYXNlIENfTE9ORyA6CisJCQljYXNlIENfU0hPUlQgOgorCQkJY2FzZSBDX1ZPSUQgOgorCQkJY2FzZSBDX1NUQVI6CisJCQljYXNlIENfRVhURU5EUzoKKwkJCWNhc2UgQ19TVVBFUjoKKwkJCWNhc2UgQ19DQVBUVVJFOgorCQkJY2FzZSBDX0lOVEVSU0VDVElPTiA6CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gYSB2YXIgYXJncyBpcyBhbiBhcnJheSB0eXBlCisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgQ19BUlJBWSA6CisJCQkJcmV0dXJuIGFwcGVuZEFycmF5VHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJCQljYXNlIENfUkVTT0xWRUQgOgorCQkJY2FzZSBDX1VOUkVTT0xWRUQgOgorCQkJCXJldHVybiBhcHBlbmRDbGFzc1R5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCQkJY2FzZSBDX1RZUEVfVkFSSUFCTEUgOgorCQkJCWludCBlID0gVXRpbC5zY2FuVHlwZVZhcmlhYmxlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOworCQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nLCBzdGFydCArIDEsIGUgLSBzdGFydCAtIDEpOworCQkJCXJldHVybiBlOworCQkJY2FzZSBDX0JPT0xFQU4gOgorCQkJCWJ1ZmZlci5hcHBlbmQoQk9PTEVBTik7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX0JZVEUgOgorCQkJCWJ1ZmZlci5hcHBlbmQoQllURSk7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX0NIQVIgOgorCQkJCWJ1ZmZlci5hcHBlbmQoQ0hBUik7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX0RPVUJMRSA6CisJCQkJYnVmZmVyLmFwcGVuZChET1VCTEUpOworCQkJCXJldHVybiBzdGFydDsKKwkJCWNhc2UgQ19GTE9BVCA6CisJCQkJYnVmZmVyLmFwcGVuZChGTE9BVCk7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX0lOVCA6CisJCQkJYnVmZmVyLmFwcGVuZChJTlQpOworCQkJCXJldHVybiBzdGFydDsKKwkJCWNhc2UgQ19MT05HIDoKKwkJCQlidWZmZXIuYXBwZW5kKExPTkcpOworCQkJCXJldHVybiBzdGFydDsKKwkJCWNhc2UgQ19TSE9SVCA6CisJCQkJYnVmZmVyLmFwcGVuZChTSE9SVCk7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX1ZPSUQgOgorCQkJCWJ1ZmZlci5hcHBlbmQoVk9JRCk7CisJCQkJcmV0dXJuIHN0YXJ0OworCQkJY2FzZSBDX0NBUFRVUkUgOgorCQkJCXJldHVybiBhcHBlbmRDYXB0dXJlVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJCQljYXNlIENfSU5URVJTRUNUSU9OIDoKKwkJCQlyZXR1cm4gYXBwZW5kSW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJCQljYXNlIENfU1RBUjoKKwkJCWNhc2UgQ19FWFRFTkRTOgorCQkJY2FzZSBDX1NVUEVSOgorCQkJCXJldHVybiBhcHBlbmRUeXBlQXJndW1lbnRTaWduYXR1cmUoc3RyaW5nLCBzdGFydCwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCQkJZGVmYXVsdCA6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CiAJfQogfQogCitwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tBcnJheURpbWVuc2lvbihjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgZ2VuZXJpY0JhbGFuY2UgPSAwOworICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKKwkJc3dpdGNoKHR5cGVOYW1lW3Bvc10pIHsKKwkJICAgIGNhc2UgJzwnIDoKKwkJICAgICAgICBnZW5lcmljQmFsYW5jZSsrOworCQkgICAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnLCcgOgorCQkJICAgIGlmIChnZW5lcmljQmFsYW5jZSA9PSAwKSByZXR1cm4gLTE7CisJCQkgICAgYnJlYWs7CisJCQljYXNlICc+JzoKKwkJCSAgICBpZiAoZ2VuZXJpY0JhbGFuY2UgPT0gMCkgcmV0dXJuIC0xOworCQkJICAgIGdlbmVyaWNCYWxhbmNlLS07CisJCSAgICAgICAgYnJlYWs7CisJCQljYXNlICdbJzoKKwkJCSAgICBpZiAoZ2VuZXJpY0JhbGFuY2UgPT0gMCkgeworCQkJICAgICAgICByZXR1cm4gcG9zOworCQkJICAgIH0KKwkJfQorCQlwb3MrKzsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrTmFtZShjaGFyW10gbmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgcG9zLCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHMobmFtZSwgdHlwZU5hbWUsIHBvcywgdHJ1ZSkpIHsKKyAgICAgICAgcG9zICs9IG5hbWUubGVuZ3RoOworICAgICAgICBpZiAocG9zID09IGxlbmd0aCkgcmV0dXJuIHBvczsKKyAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107CisgICAgICAgIHN3aXRjaCAoY3VycmVudENoYXIpIHsKKyAgICAgICAgICAgIGNhc2UgJyAnIDoKKyAgICAgICAgICAgIGNhc2UgJy4nIDoKKyAgICAgICAgICAgIGNhc2UgJzwnIDoKKyAgICAgICAgICAgIGNhc2UgJz4nIDoKKyAgICAgICAgICAgIGNhc2UgJ1snIDoKKyAgICAgICAgICAgIGNhc2UgJywnIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zOworCQkJZGVmYXVsdDoKKwkJCSAgICBpZiAoU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXIpKQorCQkJICAgIAlyZXR1cm4gcG9zOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrTmV4dENoYXIoY2hhcltdIHR5cGVOYW1lLCBjaGFyIGV4cGVjdGVkQ2hhciwgaW50IHBvcywgaW50IGxlbmd0aCwgYm9vbGVhbiBpc09wdGlvbmFsKSB7CisgICAgcG9zID0gY29uc3VtZVdoaXRlc3BhY2UodHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKyAgICBpZiAocG9zIDwgbGVuZ3RoICYmIHR5cGVOYW1lW3Bvc10gPT0gZXhwZWN0ZWRDaGFyKQorICAgICAgICByZXR1cm4gcG9zICsgMTsKKyAgICBpZiAoIWlzT3B0aW9uYWwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmV3IFN0cmluZyh0eXBlTmFtZSkpOworICAgIHJldHVybiAtMTsKK30KKworcHJpdmF0ZSBzdGF0aWMgaW50IGNvbnN1bWVXaGl0ZXNwYWNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHBvcywgaW50IGxlbmd0aCkgeworICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKKyAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107CisgICAgICAgIGlmIChjdXJyZW50Q2hhciAhPSAnICcgJiYgIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG9zKys7CisgICAgfQorICAgIHJldHVybiBwb3M7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGFycmF5IG5lc3RpbmcgYWRkZWQKKyAqIHRvIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBhcnJheUNvdW50IHRoZSBkZXNpcmVkIG51bWJlciBvZiBsZXZlbHMgb2YgYXJyYXkgbmVzdGluZworICogQHJldHVybiB0aGUgZW5jb2RlZCBhcnJheSB0eXBlIHNpZ25hdHVyZQorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gY3JlYXRlQXJyYXlTaWduYXR1cmUoY2hhcltdIHR5cGVTaWduYXR1cmUsIGludCBhcnJheUNvdW50KSB7CisJaWYgKGFycmF5Q291bnQgPT0gMCkgcmV0dXJuIHR5cGVTaWduYXR1cmU7CisJaW50IHNpZ0xlbmd0aCA9IHR5cGVTaWduYXR1cmUubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheUNvdW50ICsgc2lnTGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykgeworCQlyZXN1bHRbaV0gPSBDX0FSUkFZOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KHR5cGVTaWduYXR1cmUsIDAsIHJlc3VsdCwgYXJyYXlDb3VudCwgc2lnTGVuZ3RoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHR5cGUgc2lnbmF0dXJlIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvZiBhcnJheSBuZXN0aW5nIGFkZGVkCisgKiB0byB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gYXJyYXlDb3VudCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbGV2ZWxzIG9mIGFycmF5IG5lc3RpbmcKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgYXJyYXkgdHlwZSBzaWduYXR1cmUKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQXJyYXlTaWduYXR1cmUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBhcnJheUNvdW50KSB7CisJcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlQXJyYXlTaWduYXR1cmUodHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpLCBhcnJheUNvdW50KSk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0eXBlIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiB0eXBlIG5hbWUgZW5jb2RlZCBhcyBhIGNoYXJhY3RlcgorICogYXJyYXkuIFRoZSB0eXBlIG5hbWUgbWF5IGNvbnRhaW4gcHJpbWl0aXZlIHR5cGVzIG9yIGFycmF5IHR5cGVzIG9yIHBhcmFtZXRlcml6ZWQgdHlwZXMuCisgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisgKiA8Y29kZT5jcmVhdGVUeXBlU2lnbmF0dXJlKG5ldyBTdHJpbmcodHlwZU5hbWUpLGlzUmVzb2x2ZWQpLnRvQ2hhckFycmF5KCk8L2NvZGU+LAorICogYWx0aG91Z2ggbW9yZSBlZmZpY2llbnQgZm9yIGNhbGxlcnMgd2l0aCBjaGFyYWN0ZXIgYXJyYXlzIHJhdGhlciB0aGFuIHN0cmluZ3MuCisgKiBJZiB0aGUgdHlwZSBuYW1lIGlzIHF1YWxpZmllZCwgdGhlbiBpdCBpcyBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCisgKgorICogQHBhcmFtIHR5cGVOYW1lIHRoZSBwb3NzaWJseSBxdWFsaWZpZWQgdHlwZSBuYW1lCisgKiBAcGFyYW0gaXNSZXNvbHZlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZSBuYW1lIGlzIHRvIGJlIGNvbnNpZGVyZWQKKyAqICAgcmVzb2x2ZWQgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmcm9tIGEgYmluYXJ5IGNsYXNzIGZpbGUpLCBhbmQKKyAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZCB1bnJlc29sdmVkCisgKiAgIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZm91bmQgaW4gc291cmNlIGNvZGUpCisgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgc2lnbmF0dXJlCisgKiBAc2VlICNjcmVhdGVUeXBlU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcsYm9vbGVhbikKKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKKwlpZiAodHlwZU5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOyAvLyROT04tTkxTLTEkCisJaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmV3IFN0cmluZyh0eXBlTmFtZSkpOworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDUpOworCWludCBwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCAwLCBpc1Jlc29sdmVkLCBsZW5ndGgsIGJ1ZmZlcik7CisJcG9zID0gY29uc3VtZVdoaXRlc3BhY2UodHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKwlpZiAocG9zIDwgbGVuZ3RoKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5ldyBTdHJpbmcodHlwZU5hbWUpKTsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpXTsKKwlidWZmZXIuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCByZXN1bHQsIDApOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBpbnRlcnNlY3Rpb24gdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmVzLgorICogCisgKiA8cD5UaGUgZW5jb2RlZCB0eXBlIHNpZ25hdHVyZSBpcyBkb3QtYmFzZWQuPC9wPgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlcyB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmVzCisgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgc2lnbmF0dXJlCisgKiBAc2luY2UgMy43LjEKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZShjaGFyW11bXSB0eXBlU2lnbmF0dXJlcykgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUuQ19JTlRFUlNFQ1RJT04pOworCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlU2lnbmF0dXJlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlpZiAoaSA+IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLkNfQ09MT04pOworCQl9CisJCWJ1ZmZlci5hcHBlbmQodHlwZVNpZ25hdHVyZXNbaV0pOworCX0KKwlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGludGVyc2VjdGlvbiB0eXBlIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZXMuCisgKiAKKyAqIDxwPlRoZSBlbmNvZGVkIHR5cGUgc2lnbmF0dXJlIGlzIGRvdC1iYXNlZC48L3A+CisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmVzIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZXMKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKKyAqIEBzaW5jZSAzLjcuMQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVJbnRlcnNlY3Rpb25UeXBlU2lnbmF0dXJlKFN0cmluZ1tdIHR5cGVTaWduYXR1cmVzKSB7CisJaW50IHR5cGVTaWduYXR1cmVzTGVudGggPSB0eXBlU2lnbmF0dXJlcy5sZW5ndGg7CisJY2hhcltdW10gc2lnbmF0dXJlcyA9IG5ldyBjaGFyW3R5cGVTaWduYXR1cmVzTGVudGhdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU2lnbmF0dXJlc0xlbnRoOyBpKyspIHsKKwkJc2lnbmF0dXJlc1tpXSA9IHR5cGVTaWduYXR1cmVzW2ldLnRvQ2hhckFycmF5KCk7CisJfQorCXJldHVybiBjcmVhdGVJbnRlcnNlY3Rpb25UeXBlU2lnbmF0dXJlKHNpZ25hdHVyZXMpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbWV0aG9kIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlCisgKiBzaWduYXR1cmVzLiBUaGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlIGlzIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQHBhcmFtIHJldHVyblR5cGUgdGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXSByZXR1cm5UeXBlKSB7CisJaW50IHBhcmFtZXRlclR5cGVzTGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOworCWludCBwYXJhbWV0ZXJMZW5ndGggPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXNMZW5ndGg7IGkrKykgeworCQlwYXJhbWV0ZXJMZW5ndGggKz0gcGFyYW1ldGVyVHlwZXNbaV0ubGVuZ3RoOworCisJfQorCWludCByZXR1cm5UeXBlTGVuZ3RoID0gcmV0dXJuVHlwZS5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyWzEgKyBwYXJhbWV0ZXJMZW5ndGggKyAxICsgcmV0dXJuVHlwZUxlbmd0aF07CisJcmVzdWx0WzBdID0gQ19QQVJBTV9TVEFSVDsKKwlpbnQgaW5kZXggPSAxOworCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXNMZW5ndGg7IGkrKykgeworCQljaGFyW10gcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzW2ldOworCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyVHlwZS5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZSwgMCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoKTsKKwkJaW5kZXggKz0gbGVuZ3RoOworCX0KKwlyZXN1bHRbaW5kZXhdID0gQ19QQVJBTV9FTkQ7CisJU3lzdGVtLmFycmF5Y29weShyZXR1cm5UeXBlLCAwLCByZXN1bHQsIGluZGV4KzEsIHJldHVyblR5cGVMZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBtZXRob2Qgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGUKKyAqIHNpZ25hdHVyZXMuIFRoZSBlbmNvZGVkIG1ldGhvZCBzaWduYXR1cmUgaXMgZG90LWJhc2VkLiBUaGlzIG1ldGhvZAorICogaXMgZXF1aXZhbGVudCB0bworICogPGNvZGU+Y3JlYXRlTWV0aG9kU2lnbmF0dXJlKHBhcmFtZXRlclR5cGVzLCByZXR1cm5UeXBlKTwvY29kZT4uCisgKgorICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMKKyAqIEBwYXJhbSByZXR1cm5UeXBlIHRoZSByZXR1cm4gdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgbWV0aG9kIHNpZ25hdHVyZQorICogQHNlZSBTaWduYXR1cmUjY3JlYXRlTWV0aG9kU2lnbmF0dXJlKGNoYXJbXVtdLCBjaGFyW10pCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU1ldGhvZFNpZ25hdHVyZShTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcywgU3RyaW5nIHJldHVyblR5cGUpIHsKKwlpbnQgcGFyYW1ldGVyVHlwZXNMZW50aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwljaGFyW11bXSBwYXJhbWV0ZXJzID0gbmV3IGNoYXJbcGFyYW1ldGVyVHlwZXNMZW50aF1bXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzTGVudGg7IGkrKykgeworCQlwYXJhbWV0ZXJzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0udG9DaGFyQXJyYXkoKTsKKwl9CisJcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlTWV0aG9kU2lnbmF0dXJlKHBhcmFtZXRlcnMsIHJldHVyblR5cGUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBib3VuZHMuCisgKgorICogQHBhcmFtIHR5cGVQYXJhbWV0ZXJOYW1lIHRoZSB0eXBlIHBhcmFtZXRlciBuYW1lCisgKiBAcGFyYW0gYm91bmRTaWduYXR1cmVzIHRoZSBzaWduYXR1cmVzIG9mIGFzc29jaWF0ZWQgYm91bmRzIG9yIGVtcHR5IGFycmF5IGlmIG5vbmUKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVUeXBlUGFyYW1ldGVyU2lnbmF0dXJlKGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgY2hhcltdW10gYm91bmRTaWduYXR1cmVzKSB7CisJaW50IGxlbmd0aCA9IGJvdW5kU2lnbmF0dXJlcy5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmFwcGVuZCh0eXBlUGFyYW1ldGVyTmFtZSwgQ19DT0xPTik7IC8vIHBhcmFtIHNpZ25hdHVyZSB3aXRoIG5vIGJvdW5kcyBzdGlsbCBnZXRzIHRyYWlsaW5nIGNvbG9uCisJfQorCWludCBib3VuZHNTaXplID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWJvdW5kc1NpemUgKz0gYm91bmRTaWduYXR1cmVzW2ldLmxlbmd0aCArIDE7CisJfQorCWludCBuYW1lTGVuZ3RoID0gdHlwZVBhcmFtZXRlck5hbWUubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltuYW1lTGVuZ3RoICsgYm91bmRzU2l6ZV07CisJU3lzdGVtLmFycmF5Y29weSh0eXBlUGFyYW1ldGVyTmFtZSwgMCwgcmVzdWx0LCAwLCBuYW1lTGVuZ3RoKTsKKwlpbnQgaW5kZXggPSBuYW1lTGVuZ3RoOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0W2luZGV4KytdID0gQ19DT0xPTjsKKwkJaW50IGJvdW5kTGVuZ3RoID0gYm91bmRTaWduYXR1cmVzW2ldLmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShib3VuZFNpZ25hdHVyZXNbaV0sIDAsIHJlc3VsdCwgaW5kZXgsIGJvdW5kTGVuZ3RoKTsKKwkJaW5kZXggKz0gYm91bmRMZW5ndGg7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGJvdW5kcy4KKyAqCisgKiBAcGFyYW0gdHlwZVBhcmFtZXRlck5hbWUgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUKKyAqIEBwYXJhbSBib3VuZFNpZ25hdHVyZXMgdGhlIHNpZ25hdHVyZXMgb2YgYXNzb2NpYXRlZCBib3VuZHMgb3IgZW1wdHkgYXJyYXkgaWYgbm9uZQorICogQHJldHVybiB0aGUgZW5jb2RlZCB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmUKKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVR5cGVQYXJhbWV0ZXJTaWduYXR1cmUoU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lLCBTdHJpbmdbXSBib3VuZFNpZ25hdHVyZXMpIHsKKwlpbnQgbGVuZ3RoID0gYm91bmRTaWduYXR1cmVzLmxlbmd0aDsKKwljaGFyW11bXSBib3VuZFNpZ25hdHVyZUNoYXJzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJYm91bmRTaWduYXR1cmVDaGFyc1tpXSA9IGJvdW5kU2lnbmF0dXJlc1tpXS50b0NoYXJBcnJheSgpOworCX0KKwlyZXR1cm4gbmV3IFN0cmluZyhjcmVhdGVUeXBlUGFyYW1ldGVyU2lnbmF0dXJlKHR5cGVQYXJhbWV0ZXJOYW1lLnRvQ2hhckFycmF5KCksIGJvdW5kU2lnbmF0dXJlQ2hhcnMpKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHR5cGUgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHR5cGUgbmFtZSBlbmNvZGVkIGFzIGEgY2hhcmFjdGVyCisgKiBhcnJheS4gVGhlIHR5cGUgbmFtZSBtYXkgY29udGFpbiBwcmltaXRpdmUgdHlwZXMsIGFycmF5IHR5cGVzIG9yIHBhcmFtZXRlcml6ZWQgdHlwZXMuCisgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisgKiA8Y29kZT5jcmVhdGVUeXBlU2lnbmF0dXJlKG5ldyBTdHJpbmcodHlwZU5hbWUpLGlzUmVzb2x2ZWQpPC9jb2RlPiwgYWx0aG91Z2gKKyAqIG1vcmUgZWZmaWNpZW50IGZvciBjYWxsZXJzIHdpdGggY2hhcmFjdGVyIGFycmF5cyByYXRoZXIgdGhhbiBzdHJpbmdzLiBJZiB0aGUKKyAqIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsIHRoZW4gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgcG9zc2libHkgcXVhbGlmaWVkIHR5cGUgbmFtZQorICogQHBhcmFtIGlzUmVzb2x2ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkCisgKiAgIHJlc29sdmVkIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZnJvbSBhIGJpbmFyeSBjbGFzcyBmaWxlKSwgYW5kCisgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdHlwZSBuYW1lIGlzIHRvIGJlIGNvbnNpZGVyZWQgdW5yZXNvbHZlZAorICogICAoZm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lIGZvdW5kIGluIHNvdXJjZSBjb2RlKQorICogQHJldHVybiB0aGUgZW5jb2RlZCB0eXBlIHNpZ25hdHVyZQorICogQHNlZSAjY3JlYXRlVHlwZVNpZ25hdHVyZShqYXZhLmxhbmcuU3RyaW5nLGJvb2xlYW4pCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKKwlyZXR1cm4gbmV3IFN0cmluZyhjcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBpc1Jlc29sdmVkKSk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0eXBlIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiB0eXBlIG5hbWUuIElmIHRoZSB0eXBlIG5hbWUgaXMgcXVhbGlmaWVkLAorICogdGhlbiBpdCBpcyBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuIFRoZSB0eXBlIG5hbWUgbWF5IGNvbnRhaW4gcHJpbWl0aXZlCisgKiB0eXBlcyBvciBhcnJheSB0eXBlcy4gSG93ZXZlciwgcGFyYW1ldGVyaXplZCB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBjcmVhdGVUeXBlU2lnbmF0dXJlKCJpbnQiLCBodWNhaXJ6KSAtPiAiSSIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCB0cnVlKSAtPiAiTGphdmEubGFuZy5TdHJpbmc7IgorICogY3JlYXRlVHlwZVNpZ25hdHVyZSgiU3RyaW5nIiwgZmFsc2UpIC0+ICJRU3RyaW5nOyIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCBmYWxzZSkgLT4gIlFqYXZhLmxhbmcuU3RyaW5nOyIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImludCBbXSIsIGZhbHNlKSAtPiAiW0kiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIHBvc3NpYmx5IHF1YWxpZmllZCB0eXBlIG5hbWUKKyAqIEBwYXJhbSBpc1Jlc29sdmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZAorICogICByZXNvbHZlZCAoZm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lIGZyb20gYSBiaW5hcnkgY2xhc3MgZmlsZSksIGFuZAorICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkIHVucmVzb2x2ZWQKKyAqICAgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmb3VuZCBpbiBzb3VyY2UgY29kZSkKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVHlwZVNpZ25hdHVyZShTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNSZXNvbHZlZCkgeworCXJldHVybiBjcmVhdGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lID09IG51bGwgPyBudWxsIDogdHlwZU5hbWUudG9DaGFyQXJyYXkoKSwgaXNSZXNvbHZlZCk7Cit9CisKK3ByaXZhdGUgc3RhdGljIGludCBlbmNvZGVBcnJheURpbWVuc2lvbihjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICBpbnQgY2hlY2tQb3M7CisgICAgd2hpbGUgKHBvcyA8IGxlbmd0aCAmJiAoY2hlY2tQb3MgPSBjaGVja05leHRDaGFyKHR5cGVOYW1lLCAnWycsIHBvcywgbGVuZ3RoLCB0cnVlKSkgPiAwKSB7CisgICAgICAgIHBvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICddJywgY2hlY2tQb3MsIGxlbmd0aCwgZmFsc2UpOworICAgICAgICBidWZmZXIuYXBwZW5kKENfQVJSQVkpOworICAgIH0KKyAgICByZXR1cm4gcG9zOworfQorCitwcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlUXVhbGlmaWVkTmFtZShjaGFyW10gdHlwZU5hbWUsIGludCBwb3MsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGNoYXIgbGFzdEFwcGVuZGVkQ2hhciA9IDA7CisgICAgbmFtZUxvb3A6IHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKKwkgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107CisJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJICAgIGNhc2UgJzwnIDoKKwkJICAgIGNhc2UgJz4nIDoKKwkJICAgIGNhc2UgJ1snIDoKKwkJICAgIGNhc2UgJywnIDoKKwkJICAgICAgICBicmVhayBuYW1lTG9vcDsKKwkJCWNhc2UgJy4nIDoKKwkJCSAgICBidWZmZXIuYXBwZW5kKENfRE9UKTsKKwkJCQlsYXN0QXBwZW5kZWRDaGFyID0gQ19ET1Q7CisJCQkgICAgY291bnQrKzsKKwkJCSAgICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkgICAgaWYgKGN1cnJlbnRDaGFyID09ICcgJyB8fCBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcikpIHsKKwkJCSAgICAgICAgaWYgKGxhc3RBcHBlbmRlZENoYXIgPT0gQ19ET1QpIHsgLy8gYWxsb3cgc3BhY2VzIGFmdGVyIGEgZG90CisJCQkgICAgICAgICAgICBwb3MgPSBjb25zdW1lV2hpdGVzcGFjZSh0eXBlTmFtZSwgcG9zLCBsZW5ndGgpIC0gMTsgLy8gd2lsbCBiZSBpbmNyZW1lbnRlZAorCQkJICAgICAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gYWxsb3cgc3BhY2VzIGJlZm9yZSBhIGRvdAorCQkJCSAgICBpbnQgY2hlY2tQb3MgPSBjaGVja05leHRDaGFyKHR5cGVOYW1lLCAnLicsIHBvcywgbGVuZ3RoLCB0cnVlKTsKKwkJCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgeworCQkJCSAgICAgICAgYnVmZmVyLmFwcGVuZChDX0RPVCk7CQkJLy8gcHJvY2VzcyBkb3QgaW1tZWRpYXRlbHkgdG8gYXZvaWQgb25lIGl0ZXJhdGlvbgorCQkJCSAgICAgICAgbGFzdEFwcGVuZGVkQ2hhciA9IENfRE9UOworCQkJCSAgICAgICAgY291bnQrKzsKKwkJCQkgICAgICAgIHBvcyA9IGNoZWNrUG9zOworCQkJCSAgICAgICAgYnJlYWs7CisJCQkJICAgIH0KKwkJCQkgICAgYnJlYWsgbmFtZUxvb3A7CisJCQkgICAgfQorCQkJICAgIGJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXIpOworCQkJICAgIGxhc3RBcHBlbmRlZENoYXIgPSBjdXJyZW50Q2hhcjsKKwkJCQljb3VudCsrOworCQkJICAgIGJyZWFrOworCQl9CisJICAgIHBvcysrOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuZXcgU3RyaW5nKHR5cGVOYW1lKSk7CisJcmV0dXJuIHBvczsKK30KKworcHJpdmF0ZSBzdGF0aWMgaW50IGVuY29kZVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBpbnQgc3RhcnQsIGJvb2xlYW4gaXNSZXNvbHZlZCwgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgIGludCBwb3MgPSBzdGFydDsKKyAgICBwb3MgPSBjb25zdW1lV2hpdGVzcGFjZSh0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworICAgIGlmIChwb3MgPj0gbGVuZ3RoKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5ldyBTdHJpbmcodHlwZU5hbWUpKTsKKyAgICBpbnQgY2hlY2tQb3M7CisgICAgY2hhciBjdXJyZW50Q2hhciA9IHR5cGVOYW1lW3Bvc107CisgICAgc3dpdGNoIChjdXJyZW50Q2hhcikgeworCQkvLyBwcmltaXRpdmUgdHlwZT8KKwkJY2FzZSAnYicgOgorCQkgICAgY2hlY2tQb3MgPSBjaGVja05hbWUoQk9PTEVBTiwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKwkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKKwkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKKwkJCSAgICBidWZmZXIuYXBwZW5kKENfQk9PTEVBTik7CisJCQkgICAgcmV0dXJuIHBvczsKKwkJCX0KKwkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKEJZVEUsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7CisJCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7CisJCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkgICAgYnVmZmVyLmFwcGVuZChDX0JZVEUpOworCQkJICAgIHJldHVybiBwb3M7CisJCQl9CisJCSAgICBicmVhazsKKwkJY2FzZSAnZCc6CisJCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShET1VCTEUsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7CisJCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7CisJCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkgICAgYnVmZmVyLmFwcGVuZChDX0RPVUJMRSk7CisJCQkgICAgcmV0dXJuIHBvczsKKwkJCX0KKwkJICAgIGJyZWFrOworCQljYXNlICdmJzoKKwkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKEZMT0FULCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgeworCQkgICAgICAgIHBvcyA9IGVuY29kZUFycmF5RGltZW5zaW9uKHR5cGVOYW1lLCBjaGVja1BvcywgbGVuZ3RoLCBidWZmZXIpOworCQkJICAgIGJ1ZmZlci5hcHBlbmQoQ19GTE9BVCk7CisJCQkgICAgcmV0dXJuIHBvczsKKwkJCX0KKwkJICAgIGJyZWFrOworCQljYXNlICdpJzoKKwkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKElOVCwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKwkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKKwkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKKwkJCSAgICBidWZmZXIuYXBwZW5kKENfSU5UKTsKKwkJCSAgICByZXR1cm4gcG9zOworCQkJfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkgICAgY2hlY2tQb3MgPSBjaGVja05hbWUoTE9ORywgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKwkJICAgIGlmIChjaGVja1BvcyA+IDApIHsKKwkJICAgICAgICBwb3MgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKKwkJCSAgICBidWZmZXIuYXBwZW5kKENfTE9ORyk7CisJCQkgICAgcmV0dXJuIHBvczsKKwkJCX0KKwkJICAgIGJyZWFrOworCQljYXNlICdzJzoKKwkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKFNIT1JULCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgeworCQkgICAgICAgIHBvcyA9IGVuY29kZUFycmF5RGltZW5zaW9uKHR5cGVOYW1lLCBjaGVja1BvcywgbGVuZ3RoLCBidWZmZXIpOworCQkJICAgIGJ1ZmZlci5hcHBlbmQoQ19TSE9SVCk7CisJCQkgICAgcmV0dXJuIHBvczsKKwkJCX0KKwkJICAgIGJyZWFrOworCQljYXNlICd2JzoKKwkJICAgIGNoZWNrUG9zID0gY2hlY2tOYW1lKFZPSUQsIHR5cGVOYW1lLCBwb3MsIGxlbmd0aCk7CisJCSAgICBpZiAoY2hlY2tQb3MgPiAwKSB7CisJCSAgICAgICAgcG9zID0gZW5jb2RlQXJyYXlEaW1lbnNpb24odHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkgICAgYnVmZmVyLmFwcGVuZChDX1ZPSUQpOworCQkJICAgIHJldHVybiBwb3M7CisJCQl9CisJCSAgICBicmVhazsKKwkJY2FzZSAnYyc6CisJCSAgICBjaGVja1BvcyA9IGNoZWNrTmFtZShDSEFSLCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCQkgICAgaWYgKGNoZWNrUG9zID4gMCkgeworCQkgICAgICAgIHBvcyA9IGVuY29kZUFycmF5RGltZW5zaW9uKHR5cGVOYW1lLCBjaGVja1BvcywgbGVuZ3RoLCBidWZmZXIpOworCQkJICAgIGJ1ZmZlci5hcHBlbmQoQ19DSEFSKTsKKwkJCSAgICByZXR1cm4gcG9zOworCQkJfSBlbHNlIHsKKwkJCQljaGVja1BvcyA9IGNoZWNrTmFtZShDQVBUVVJFLCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCQkJCWlmIChjaGVja1BvcyA+IDApIHsKKwkJCQkJcG9zID0gY29uc3VtZVdoaXRlc3BhY2UodHlwZU5hbWUsIGNoZWNrUG9zLCBsZW5ndGgpOworCQkJCQlpZiAodHlwZU5hbWVbcG9zXSAhPSAnPycpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZChDX0NBUFRVUkUpOworCQkJLy8kRkFMTC1USFJPVUdIJCBmb3Igd2lsZGNhcmQgcGFydCBvZiBjYXB0dXJlIHR5cGVjaGVja1BvcworCQljYXNlICc/JzoKKwkJCS8vIHdpbGRjYXJkCisJCQlwb3MgPSBjb25zdW1lV2hpdGVzcGFjZSh0eXBlTmFtZSwgcG9zKzEsIGxlbmd0aCk7CisJCQljaGVja1BvcyA9IGNoZWNrTmFtZShFWFRFTkRTLCB0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCQkJaWYgKGNoZWNrUG9zID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoQ19FWFRFTkRTKTsKKwkJCQlwb3MgPSBlbmNvZGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBjaGVja1BvcywgaXNSZXNvbHZlZCwgbGVuZ3RoLCBidWZmZXIpOworCQkJCXJldHVybiBwb3M7CisJCQl9CisJCQljaGVja1BvcyA9IGNoZWNrTmFtZShTVVBFUiwgdHlwZU5hbWUsIHBvcywgbGVuZ3RoKTsKKwkJCWlmIChjaGVja1BvcyA+IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKENfU1VQRVIpOworCQkJCXBvcyA9IGVuY29kZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGNoZWNrUG9zLCBpc1Jlc29sdmVkLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkJcmV0dXJuIHBvczsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoQ19TVEFSKTsKKwkJCXJldHVybiBwb3M7CisgICAgfQorICAgIC8vIG5vbiBwcmltaXRpdmUgdHlwZQorICAgIGNoZWNrUG9zID0gY2hlY2tBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgcG9zLCBsZW5ndGgpOworCWludCBlbmQ7CisJaWYgKGNoZWNrUG9zID4gMCkgeworCSAgICBlbmQgPSBlbmNvZGVBcnJheURpbWVuc2lvbih0eXBlTmFtZSwgY2hlY2tQb3MsIGxlbmd0aCwgYnVmZmVyKTsKKwl9IGVsc2UgeworCSAgICBlbmQgPSAtMTsKKwl9CisJYnVmZmVyLmFwcGVuZChpc1Jlc29sdmVkID8gQ19SRVNPTFZFRCA6IENfVU5SRVNPTFZFRCk7CisJd2hpbGUgKHRydWUpIHsgLy8gbG9vcCBvbiBxdWFsaWZpZWROYW1lWzxhcmdzPl1bLnF1YWxpZmllZE5hbWVbPGFyZ3M+XSoKKwkgICAgcG9zID0gZW5jb2RlUXVhbGlmaWVkTmFtZSh0eXBlTmFtZSwgcG9zLCBsZW5ndGgsIGJ1ZmZlcik7CisJCWNoZWNrUG9zID0gY2hlY2tOZXh0Q2hhcih0eXBlTmFtZSwgJzwnLCBwb3MsIGxlbmd0aCwgdHJ1ZSk7CisJCWlmIChjaGVja1BvcyA+IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoQ19HRU5FUklDX1NUQVJUKTsKKwkJCS8vIFN0b3AgZ2FwIGZpeCBmb3IgPD4uCisJCQlpZiAoKHBvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICc+JywgY2hlY2tQb3MsIGxlbmd0aCwgdHJ1ZSkpID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoQ19HRU5FUklDX0VORCk7CisJCQl9IGVsc2UgeworCQkJCXBvcyA9IGVuY29kZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGNoZWNrUG9zLCBpc1Jlc29sdmVkLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkJd2hpbGUgKChjaGVja1BvcyA9IGNoZWNrTmV4dENoYXIodHlwZU5hbWUsICcsJywgcG9zLCBsZW5ndGgsIHRydWUpKSA+IDApIHsKKwkJCQkJcG9zID0gZW5jb2RlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgY2hlY2tQb3MsIGlzUmVzb2x2ZWQsIGxlbmd0aCwgYnVmZmVyKTsKKwkJCQl9CisJCQkJcG9zID0gY2hlY2tOZXh0Q2hhcih0eXBlTmFtZSwgJz4nLCBwb3MsIGxlbmd0aCwgZmFsc2UpOworCQkJCWJ1ZmZlci5hcHBlbmQoQ19HRU5FUklDX0VORCk7CisJCQl9CisJCX0KKwkJY2hlY2tQb3MgPSBjaGVja05leHRDaGFyKHR5cGVOYW1lLCAnLicsIHBvcywgbGVuZ3RoLCB0cnVlKTsKKwkJaWYgKGNoZWNrUG9zID4gMCkgeworCQkJYnVmZmVyLmFwcGVuZChDX0RPVCk7CisJCQlwb3MgPSBjaGVja1BvczsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWJ1ZmZlci5hcHBlbmQoQ19OQU1FX0VORCk7CisJaWYgKGVuZCA+IDApIHBvcyA9IGVuZDsgLy8gc2tpcCBhcnJheSBkaW1lbnNpb24gd2hpY2ggd2VyZSBwcmVwcm9jZXNzZWQKKyAgICByZXR1cm4gcG9zOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGFycmF5IGNvdW50IChhcnJheSBuZXN0aW5nIGRlcHRoKSBvZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBhcnJheSBuZXN0aW5nIGRlcHRoLCBvciAwIGlmIG5vdCBhbiBhcnJheQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQorICogICBjb3JyZWN0CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheUNvdW50KGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwl0cnkgeworCQlpbnQgY291bnQgPSAwOworCQl3aGlsZSAodHlwZVNpZ25hdHVyZVtjb3VudF0gPT0gQ19BUlJBWSkgeworCQkJKytjb3VudDsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGlmIGxhc3QgY2hhcmFjdGVyIGlzIENfQVJSQVkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhcnJheSBjb3VudCAoYXJyYXkgbmVzdGluZyBkZXB0aCkgb2YgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgYXJyYXkgbmVzdGluZyBkZXB0aCwgb3IgMCBpZiBub3QgYW4gYXJyYXkKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKKyAqICAgY29ycmVjdAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheUNvdW50KFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0QXJyYXlDb3VudCh0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIHdpdGhvdXQgYW55IGFycmF5IG5lc3RpbmcuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0RWxlbWVudFR5cGUoeydbJywgJ1snLCAnSSd9KSAtLT4geydJJ30uCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIHdpdGhvdXQgYXJyYXlzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5CisgKiAgIGNvcnJlY3QKKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdIGdldEVsZW1lbnRUeXBlKGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpbnQgY291bnQgPSBnZXRBcnJheUNvdW50KHR5cGVTaWduYXR1cmUpOworCWlmIChjb3VudCA9PSAwKSByZXR1cm4gdHlwZVNpZ25hdHVyZTsKKwlpbnQgbGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aC1jb3VudF07CisJU3lzdGVtLmFycmF5Y29weSh0eXBlU2lnbmF0dXJlLCBjb3VudCwgcmVzdWx0LCAwLCBsZW5ndGgtY291bnQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgd2l0aG91dCBhbnkgYXJyYXkgbmVzdGluZy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRFbGVtZW50VHlwZSgiW1tJIikgLS0+ICJJIi4KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgd2l0aG91dCBhcnJheXMKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKKyAqICAgY29ycmVjdAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJY2hhcltdIHNpZ25hdHVyZSA9IHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKTsKKwljaGFyW10gZWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShzaWduYXR1cmUpOworCXJldHVybiBzaWduYXR1cmUgPT0gZWxlbWVudFR5cGUgPyB0eXBlU2lnbmF0dXJlIDogbmV3IFN0cmluZyhlbGVtZW50VHlwZSk7Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSB0eXBlIGJvdW5kcycgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBpbnRlcnNlY3Rpb24gdHlwZSBzaWduYXR1cmUuCisgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgYW4gaW50ZXJzZWN0aW9uIHR5cGUgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSBpbnRlcnNlY3Rpb25UeXBlU2lnbmF0dXJlIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIHR5cGUgYm91bmRzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0CisgKgorICogQHNpbmNlIDMuNy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0SW50ZXJzZWN0aW9uVHlwZUJvdW5kcyhjaGFyW10gaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKGdldFR5cGVTaWduYXR1cmVLaW5kKGludGVyc2VjdGlvblR5cGVTaWduYXR1cmUpICE9IElOVEVSU0VDVElPTl9UWVBFX1NJR05BVFVSRSkgeworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJfQorCUFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOworCWludCBpID0gMTsgLy8gc2tpcCB0aGUgJ3wnCisJaW50IGxlbmd0aCA9IGludGVyc2VjdGlvblR5cGVTaWduYXR1cmUubGVuZ3RoOworCWZvciAoOzspIHsKKwkJaW50IGUgPSBVdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZSwgaSk7CisJCWlmIChlIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWFyZ3MuYWRkKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZSwgaSwgZSArIDEpKTsKKwkJaWYgKGUgPT0gbGVuZ3RoIC0gMSkgeworCQkJaW50IHNpemUgPSBhcmdzLnNpemUoKTsKKwkJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW3NpemVdW107CisJCQlhcmdzLnRvQXJyYXkocmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSBpZiAoaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZVtlICsgMV0gIT0gQ19DT0xPTikgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmb3JtYXQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWkgPSBlICsgMjsgLy8gYWRkIG9uZSB0byBza2lwIENfQ09MT04KKwl9Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSB0eXBlIGJvdW5kcycgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBpbnRlcnNlY3Rpb24gdHlwZSBzaWduYXR1cmUuCisgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgYW4gaW50ZXJzZWN0aW9uIHR5cGUgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSBpbnRlcnNlY3Rpb25UeXBlU2lnbmF0dXJlIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIHR5cGUgYm91bmRzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0CisgKgorICogQHNpbmNlIDMuNy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SW50ZXJzZWN0aW9uVHlwZUJvdW5kcyhTdHJpbmcgaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJY2hhcltdW10gYXJncyA9IGdldEludGVyc2VjdGlvblR5cGVCb3VuZHMoaW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoYXJncyk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgdHlwZXMgaW4gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKKyAqICAgY29ycmVjdAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbWV0ZXJDb3VudChjaGFyW10gbWV0aG9kU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwl0cnkgeworCQlpbnQgY291bnQgPSAwOworCQlpbnQgaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihDX1BBUkFNX1NUQVJULCBtZXRob2RTaWduYXR1cmUpOworCQlpZiAoaSA8IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfSBlbHNlIHsKKwkJCWkrKzsKKwkJfQorCQlmb3IgKDs7KSB7CisJCQlpZiAobWV0aG9kU2lnbmF0dXJlW2ldID09IENfUEFSQU1fRU5EKSB7CisJCQkJcmV0dXJuIGNvdW50OworCQkJfQorCQkJaW50IGU9IFV0aWwuc2NhblR5cGVTaWduYXR1cmUobWV0aG9kU2lnbmF0dXJlLCBpKTsKKwkJCWlmIChlIDwgMCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0gZWxzZSB7CisJCQkJaSA9IGUgKyAxOworCQkJfQorCQkJY291bnQrKzsKKwkJfQorCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQorICogICBjb3JyZWN0CisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlckNvdW50KFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXJldHVybiBnZXRQYXJhbWV0ZXJDb3VudChtZXRob2RTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4KKyAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlIHNpZ25hdHVyZXMKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQorICogICBpbmNvcnJlY3QKKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0UGFyYW1ldGVyVHlwZXMoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJaW50IGNvdW50ID0gZ2V0UGFyYW1ldGVyQ291bnQobWV0aG9kU2lnbmF0dXJlKTsKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbY291bnRdW107CisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWludCBpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfUEFSQU1fU1RBUlQsIG1ldGhvZFNpZ25hdHVyZSk7CisJCWlmIChpIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9IGVsc2UgeworCQkJaSsrOworCQl9CisJCWludCB0ID0gMDsKKwkJZm9yICg7OykgeworCQkJaWYgKG1ldGhvZFNpZ25hdHVyZVtpXSA9PSBDX1BBUkFNX0VORCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlpbnQgZSA9IFV0aWwuc2NhblR5cGVTaWduYXR1cmUobWV0aG9kU2lnbmF0dXJlLCBpKTsKKwkJCWlmIChlIDwgMCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCXJlc3VsdFt0XSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobWV0aG9kU2lnbmF0dXJlLCBpLCBlICsgMSk7CisJCQl0Kys7CisJCQlpID0gZSArIDE7CisJCX0KKwl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorfQorLyoqCisgKiBFeHRyYWN0cyB0aGUgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlLgorICogVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhwYXJhbWV0ZXJUeXBlcyk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGNoYXIgYXJyYXkgY29udGFpbmluZyBhbGwgYnV0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGdpdmVuCisgKiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLiBSZXR1cm5zIHRoZSBlbXB0eSBjaGFyIGFycmF5IGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0UXVhbGlmaWVyKHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9KSAtPiB7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJ30KKyAqIGdldFF1YWxpZmllcih7J08nLCAndScsICd0JywgJ2UnLCAncicsICcuJywgJ0knLCAnbicsICduJywgJ2UnLCAncid9KSAtPiB7J08nLCAndScsICd0JywgJ2UnLCAncid9CisgKiBnZXRRdWFsaWZpZXIoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCcsICcuJywgJ0wnLCAnaScsICdzJywgJ3QnLCAnPCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJz4nfSkgLT4geydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCd9CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHJldHVybiB0aGUgcXVhbGlmaWVyIHByZWZpeCwgb3IgdGhlIGVtcHR5IGNoYXIgYXJyYXkgaWYgdGhlIG5hbWUgY29udGFpbnMgbm8KKyAqICAgZG90cworICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UXVhbGlmaWVyKGNoYXJbXSBuYW1lKSB7CisJaW50IGZpcnN0R2VuZXJpY1N0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfR0VORVJJQ19TVEFSVCwgbmFtZSk7CisJaW50IGxhc3REb3QgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfRE9ULCBuYW1lLCAwLCBmaXJzdEdlbmVyaWNTdGFydCA9PSAtMSA/IG5hbWUubGVuZ3RoLTEgOiBmaXJzdEdlbmVyaWNTdGFydCk7CisJaWYgKGxhc3REb3QgPT0gLTEpIHsKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgMCwgbGFzdERvdCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGFsbCBidXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZ2l2ZW4KKyAqIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIGdldFF1YWxpZmllcigiamF2YS5sYW5nLk9iamVjdCIpIC0mZ3Q7ICJqYXZhLmxhbmciCisgKiBnZXRRdWFsaWZpZXIoIk91dGVyLklubmVyIikgLSZndDsgIk91dGVyIgorICogZ2V0UXVhbGlmaWVyKCJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIpIC0mZ3Q7ICJqYXZhLnV0aWwiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHJldHVybiB0aGUgcXVhbGlmaWVyIHByZWZpeCwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUgbmFtZSBjb250YWlucyBubworICogICBkb3RzCisgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWFsaWZpZXIoU3RyaW5nIG5hbWUpIHsKKwljaGFyW10gcXVhbGlmaWVyID0gZ2V0UXVhbGlmaWVyKG5hbWUudG9DaGFyQXJyYXkoKSk7CisJaWYgKHF1YWxpZmllci5sZW5ndGggPT0gMCkgcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuRU1QVFlfU1RSSU5HOworCXJldHVybiBuZXcgU3RyaW5nKHF1YWxpZmllcik7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzCisgKiBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB0eXBlCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRSZXR1cm5UeXBlKGNoYXJbXSBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCS8vIHNraXAgdHlwZSBwYXJhbWV0ZXJzCisJaW50IHBhcmVuID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihDX1BBUkFNX0VORCwgbWV0aG9kU2lnbmF0dXJlKTsKKwlpZiAocGFyZW4gPT0gLTEpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwkvLyB0aGVyZSBjb3VsZCBiZSB0aHJvd24gZXhjZXB0aW9ucyBiZWhpbmQsIHRodXMgc2NhbiBvbmUgdHlwZSBleGFjdGx5CisJaW50IGxhc3QgPSBVdGlsLnNjYW5UeXBlU2lnbmF0dXJlKG1ldGhvZFNpZ25hdHVyZSwgcGFyZW4rMSk7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkobWV0aG9kU2lnbmF0dXJlLCBwYXJlbiArIDEsIGxhc3QrMSk7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzCisgKiBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB0eXBlCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJldHVyblR5cGUoU3RyaW5nIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0UmV0dXJuVHlwZShtZXRob2RTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOworfQorCisvKioKKyAqIFJldHVybnMgcGFja2FnZSBmcmFnbWVudCBvZiBhIHR5cGUgc2lnbmF0dXJlLiBUaGUgcGFja2FnZSBmcmFnbWVudCBzZXBhcmF0b3IgbXVzdCBiZSAnLicKKyAqIGFuZCB0aGUgdHlwZSBmcmFnbWVudCBzZXBhcmF0b3IgbXVzdCBiZSAnJCcuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKHsnTCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCcsICcuJywgJ00nLCAnYScsICdwJywgJyQnLCAnRScsICduJywgJ3QnLCAncicsICd5JywgJzsnfSkgLT4geydqJywgJ2EnLCAndicsICdhJywgJy4nLCAndScsICd0JywgJ2knLCAnbCd9CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQgKHNlcGFyYXRvcnMgYXJlICcuJykKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0U2lnbmF0dXJlUXVhbGlmaWVyKGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB7CisJaWYodHlwZVNpZ25hdHVyZSA9PSBudWxsKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCisJY2hhcltdIHF1YWxpZmllZFR5cGUgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZVNpZ25hdHVyZSk7CisKKwlpbnQgZG90Q291bnQgPSAwOworCWluZGV4Rm91bmQ6IGZvcihpbnQgaSA9IDA7IGkgPCB0eXBlU2lnbmF0dXJlLmxlbmd0aDsgaSsrKSB7CisJCXN3aXRjaCh0eXBlU2lnbmF0dXJlW2ldKSB7CisJCQljYXNlIENfRE9UOgorCQkJCWRvdENvdW50Kys7CisJCQkJYnJlYWs7CisJCQljYXNlIENfR0VORVJJQ19TVEFSVDoKKwkJCQlicmVhayBpbmRleEZvdW5kOworCQkJY2FzZSBDX0RPTExBUjoKKwkJCQlicmVhayBpbmRleEZvdW5kOworCQl9CisJfQorCisJaWYoZG90Q291bnQgPiAwKSB7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBxdWFsaWZpZWRUeXBlLmxlbmd0aDsgaSsrKSB7CisJCQlpZihxdWFsaWZpZWRUeXBlW2ldID09ICcuJykgeworCQkJCWRvdENvdW50LS07CisJCQl9CisJCQlpZihkb3RDb3VudCA8PSAwKSB7CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkVHlwZSwgMCwgaSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKK30KKy8qKgorICogUmV0dXJucyBwYWNrYWdlIGZyYWdtZW50IG9mIGEgdHlwZSBzaWduYXR1cmUuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICcuJworICogYW5kIHRoZSB0eXBlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICckJy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRTaWduYXR1cmVRdWFsaWZpZXIoIkxqYXZhLnV0aWwuTWFwJEVudHJ5IikgLT4gImphdmEudXRpbCIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCAoc2VwYXJhdG9ycyBhcmUgJy4nKQorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaWduYXR1cmVRdWFsaWZpZXIoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKKwlyZXR1cm4gbmV3IFN0cmluZyhnZXRTaWduYXR1cmVRdWFsaWZpZXIodHlwZVNpZ25hdHVyZSA9PSBudWxsID8gbnVsbCA6IHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBSZXR1cm5zIHR5cGUgZnJhZ21lbnQgb2YgYSB0eXBlIHNpZ25hdHVyZS4gVGhlIHBhY2thZ2UgZnJhZ21lbnQgc2VwYXJhdG9yIG11c3QgYmUgJy4nCisgKiBhbmQgdGhlIHR5cGUgZnJhZ21lbnQgc2VwYXJhdG9yIG11c3QgYmUgJyQnLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIGdldFNpZ25hdHVyZVNpbXBsZU5hbWUoeydMJywgJ2onLCAnYScsICd2JywgJ2EnLCAnLicsICd1JywgJ3QnLCAnaScsICdsJywgJy4nLCAnTScsICdhJywgJ3AnLCAnJCcsICdFJywgJ24nLCAndCcsICdyJywgJ3knLCAnOyd9KSAtPiB7J00nLCAnYScsICdwJywgJy4nLCAnRScsICduJywgJ3QnLCAncicsICd5J30KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgdHlwZSBmcmFnbWVudCAoc2VwYXJhdG9ycyBhcmUgJy4nKQorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRTaWduYXR1cmVTaW1wbGVOYW1lKGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB7CisJaWYodHlwZVNpZ25hdHVyZSA9PSBudWxsKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCisJY2hhcltdIHF1YWxpZmllZFR5cGUgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZVNpZ25hdHVyZSk7CisKKwlpbnQgZG90Q291bnQgPSAwOworCWluZGV4Rm91bmQ6IGZvcihpbnQgaSA9IDA7IGkgPCB0eXBlU2lnbmF0dXJlLmxlbmd0aDsgaSsrKSB7CisJCXN3aXRjaCh0eXBlU2lnbmF0dXJlW2ldKSB7CisJCQljYXNlIENfRE9UOgorCQkJCWRvdENvdW50Kys7CisJCQkJYnJlYWs7CisJCQljYXNlIENfR0VORVJJQ19TVEFSVDoKKwkJCQlicmVhayBpbmRleEZvdW5kOworCQkJY2FzZSBDX0RPTExBUjoKKwkJCQlicmVhayBpbmRleEZvdW5kOworCQl9CisJfQorCisJaWYoZG90Q291bnQgPiAwKSB7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBxdWFsaWZpZWRUeXBlLmxlbmd0aDsgaSsrKSB7CisJCQlpZihxdWFsaWZpZWRUeXBlW2ldID09ICcuJykgeworCQkJCWRvdENvdW50LS07CisJCQl9CisJCQlpZihkb3RDb3VudCA8PSAwKSB7CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkVHlwZSwgaSArIDEsIHF1YWxpZmllZFR5cGUubGVuZ3RoKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcXVhbGlmaWVkVHlwZTsKK30KKy8qKgorICogUmV0dXJucyB0eXBlIGZyYWdtZW50IG9mIGEgdHlwZSBzaWduYXR1cmUuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICcuJworICogYW5kIHRoZSB0eXBlIGZyYWdtZW50IHNlcGFyYXRvciBtdXN0IGJlICckJy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRTaWduYXR1cmVTaW1wbGVOYW1lKCJMamF2YS51dGlsLk1hcCRFbnRyeSIpIC0+ICJNYXAuRW50cnkiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHR5cGUgZnJhZ21lbnQgKHNlcGFyYXRvcnMgYXJlICcuJykKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgeworCXJldHVybiBuZXcgU3RyaW5nKGdldFNpZ25hdHVyZVNpbXBsZU5hbWUodHlwZVNpZ25hdHVyZSA9PSBudWxsID8gbnVsbCA6IHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCisgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2ltcGxlTmFtZSh7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfSkgLT4geydPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHJldHVybiB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZQorICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0U2ltcGxlTmFtZShjaGFyW10gbmFtZSkgeworCisJaW50IGxhc3REb3QgPSAtMSwgbGFzdEdlbmVyaWNTdGFydCA9IC0xLCBsYXN0R2VuZXJpY0VuZCA9IC0xOworCWludCBkZXB0aCA9IDA7CisJaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOworCWxhc3REb3RMb29rdXA6IGZvciAoaW50IGkgPSBsZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7CisJCXN3aXRjaCAobmFtZVtpXSkgeworCQkJY2FzZSAnLic6CisJCQkJaWYgKGRlcHRoID09IDApIHsKKwkJCQkJbGFzdERvdCA9IGk7CisJCQkJCWJyZWFrIGxhc3REb3RMb29rdXA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnPCc6CisJCQkJZGVwdGgtLTsKKwkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNTdGFydCA9IGk7CisJCQkJYnJlYWs7CisJCQljYXNlICc+JzoKKwkJCQlpZiAoZGVwdGggPT0gMCkgbGFzdEdlbmVyaWNFbmQgPSBpOworCQkJCWRlcHRoKys7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGxhc3RHZW5lcmljU3RhcnQgPCAwKSB7CisJCWlmIChsYXN0RG90IDwgMCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJcmV0dXJuICBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIGxhc3REb3QgKyAxLCBsZW5ndGgpOworCX0KKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJaW50IG5hbWVTdGFydCA9IGxhc3REb3QgPCAwID8gMCA6IGxhc3REb3QrMTsKKwlidWZmZXIuYXBwZW5kKG5hbWUsIG5hbWVTdGFydCwgbGFzdEdlbmVyaWNTdGFydCAtIG5hbWVTdGFydCk7CisJYXBwZW5kQXJndW1lbnRTaW1wbGVOYW1lcyhuYW1lLCBsYXN0R2VuZXJpY1N0YXJ0LCBsYXN0R2VuZXJpY0VuZCwgYnVmZmVyKTsKKwlidWZmZXIuYXBwZW5kKG5hbWUsIGxhc3RHZW5lcmljRW5kKzEsIGxlbmd0aC1sYXN0R2VuZXJpY0VuZC0xKTsgLy8gY29weSB0cmFpbGluZyBwb3J0aW9uLCBtYXkgY29udGFpbiBkaW1lbnNpb25zCisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKV07CisJYnVmZmVyLmdldENoYXJzKDAsIGxlbmd0aCwgcmVzdWx0LCAwKTsKKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCisgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2ltcGxlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpIC0mZ3Q7ICJPYmplY3QiCisgKiA8L2NvZGU+CisgKiA8Y29kZT4KKyAqIGdldFNpbXBsZU5hbWUoImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsiKSAtJmd0OyAiTWFwJmx0O1N0cmluZyxPYmplY3QmZ3Q7IgorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm4gdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKwlpbnQgbGFzdERvdCA9IC0xLCBsYXN0R2VuZXJpY1N0YXJ0ID0gLTEsIGxhc3RHZW5lcmljRW5kID0gLTE7CisJaW50IGRlcHRoID0gMDsKKwlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKKwlsYXN0RG90TG9va3VwOiBmb3IgKGludCBpID0gbGVuZ3RoIC0xOyBpID49IDA7IGktLSkgeworCQlzd2l0Y2ggKG5hbWUuY2hhckF0KGkpKSB7CisJCQljYXNlICcuJzoKKwkJCQlpZiAoZGVwdGggPT0gMCkgeworCQkJCQlsYXN0RG90ID0gaTsKKwkJCQkJYnJlYWsgbGFzdERvdExvb2t1cDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICc8JzoKKwkJCQlkZXB0aC0tOworCQkJCWlmIChkZXB0aCA9PSAwKSBsYXN0R2VuZXJpY1N0YXJ0ID0gaTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJz4nOgorCQkJCWlmIChkZXB0aCA9PSAwKSBsYXN0R2VuZXJpY0VuZCA9IGk7CisJCQkJZGVwdGgrKzsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGFzdEdlbmVyaWNTdGFydCA8IDApIHsKKwkJaWYgKGxhc3REb3QgPCAwKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEsIGxlbmd0aCk7CisJfQorCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwljaGFyW10gbmFtZUNoYXJzID0gbmFtZS50b0NoYXJBcnJheSgpOworCWludCBuYW1lU3RhcnQgPSBsYXN0RG90IDwgMCA/IDAgOiBsYXN0RG90KzE7CisJYnVmZmVyLmFwcGVuZChuYW1lQ2hhcnMsIG5hbWVTdGFydCwgbGFzdEdlbmVyaWNTdGFydCAtIG5hbWVTdGFydCk7CisJYXBwZW5kQXJndW1lbnRTaW1wbGVOYW1lcyhuYW1lQ2hhcnMsIGxhc3RHZW5lcmljU3RhcnQsIGxhc3RHZW5lcmljRW5kLCBidWZmZXIpOworCWJ1ZmZlci5hcHBlbmQobmFtZUNoYXJzLCBsYXN0R2VuZXJpY0VuZCsxLCBsZW5ndGgtbGFzdEdlbmVyaWNFbmQtMSk7IC8vIGNvcHkgdHJhaWxpbmcgcG9ydGlvbiwgbWF5IGNvbnRhaW4gZGltZW5zaW9ucworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKy8qKgorICogUmV0dXJucyBhbGwgc2VnbWVudHMgb2YgdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCisgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggb25seSB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgorICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgbmFtZSBpcyBlbXB0eS4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRTaW1wbGVOYW1lcyh7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfSkgLT4ge3snaicsICdhJywgJ3YnLCAnYSd9LCB7J2wnLCAnYScsICduJywgJ2cnfSwgeydPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9fQorICogZ2V0U2ltcGxlTmFtZXMoeydPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9KSAtPiB7eydPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9fQorICogZ2V0U2ltcGxlTmFtZXMoe30pIC0+IHt9CisgKiBnZXRTaW1wbGVOYW1lcyh7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICd1JywgJ3QnLCAnaScsICdsJywgJy4nLCAnTCcsICdpJywgJ3MnLCAndCcsICc8JywgJ2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnUycsICd0JywgJ3InLCAnaScsICduJywgJ2cnLCAnPid9KSAtPiB7eydqJywgJ2EnLCAndicsICdhJ30sIHsnbCcsICdhJywgJ24nLCAnZyd9LCB7J0wnLCAnaScsICdzJywgJ3QnLCAnPCcsICdqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJ319CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW1wbGUgbmFtZXMsIHBvc3NpYmx5IGVtcHR5CisgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXVtdIGdldFNpbXBsZU5hbWVzKGNoYXJbXSBuYW1lKSB7CisJaW50IGxlbmd0aCA9IG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKworCWludCB3b3JkQ291bnQgPSAxOworCWNvdW50aW5nV29yZHM6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXN3aXRjaChuYW1lW2ldKSB7CisJCQljYXNlIENfRE9UOgorCQkJCXdvcmRDb3VudCsrOworCQkJCWJyZWFrOworCQkJY2FzZSBDX0dFTkVSSUNfU1RBUlQ6CisJCQkJYnJlYWsgY291bnRpbmdXb3JkczsKKwkJfQorCWNoYXJbXVtdIHNwbGl0ID0gbmV3IGNoYXJbd29yZENvdW50XVtdOworCWludCBsYXN0ID0gMCwgY3VycmVudFdvcmQgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKG5hbWVbaV0gPT0gQ19HRU5FUklDX1NUQVJUKSBicmVhazsKKwkJaWYgKG5hbWVbaV0gPT0gQ19ET1QpIHsKKwkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2kgLSBsYXN0XTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJbmFtZSwKKwkJCQlsYXN0LAorCQkJCXNwbGl0W2N1cnJlbnRXb3JkKytdLAorCQkJCTAsCisJCQkJaSAtIGxhc3QpOworCQkJbGFzdCA9IGkgKyAxOworCQl9CisJfQorCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2xlbmd0aCAtIGxhc3RdOworCVN5c3RlbS5hcnJheWNvcHkobmFtZSwgbGFzdCwgc3BsaXRbY3VycmVudFdvcmRdLCAwLCBsZW5ndGggLSBsYXN0KTsKKwlyZXR1cm4gc3BsaXQ7Cit9CisvKioKKyAqIFJldHVybnMgYWxsIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgorICogUmV0dXJucyBhbiBhcnJheSB3aXRoIG9ubHkgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIG5hbWUgaXMgZW1wdHkuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2ltcGxlTmFtZXMoImphdmEubGFuZy5PYmplY3QiKSAtJmd0OyB7ImphdmEiLCAibGFuZyIsICJPYmplY3QifQorICogZ2V0U2ltcGxlTmFtZXMoIk9iamVjdCIpIC0mZ3Q7IHsiT2JqZWN0In0KKyAqIGdldFNpbXBsZU5hbWVzKCIiKSAtJmd0OyB7fQorICogZ2V0U2ltcGxlTmFtZXMoImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IikgLSZndDsKKyAqICAgeyJqYXZhIiwgInV0aWwiLCAiTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyJ9CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW1wbGUgbmFtZXMsIHBvc3NpYmx5IGVtcHR5CisgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNpbXBsZU5hbWVzKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIENoYXJPcGVyYXRpb24udG9TdHJpbmdzKGdldFNpbXBsZU5hbWVzKG5hbWUudG9DaGFyQXJyYXkoKSkpOworfQorCisvKioKKyAqIEV4dHJhY3RzIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGUgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIGlmIGFueQorICogVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbiB0eXBlIHNpZ25hdHVyZXMKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQorICogICBpbmNvcnJlY3QKKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0VGhyb3duRXhjZXB0aW9uVHlwZXMoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJLy8gc2tpcCB0eXBlIHBhcmFtZXRlcnMKKwlpbnQgZXhjZXB0aW9uU3RhcnQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19FWENFUFRJT05fU1RBUlQsIG1ldGhvZFNpZ25hdHVyZSk7CisJaWYgKGV4Y2VwdGlvblN0YXJ0ID09IC0xKSB7CisJCWludCBwYXJlbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoQ19QQVJBTV9FTkQsIG1ldGhvZFNpZ25hdHVyZSk7CisJCWlmIChwYXJlbiA9PSAtMSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGlnbm9yZSByZXR1cm4gdHlwZQorCQlleGNlcHRpb25TdGFydCA9IFV0aWwuc2NhblR5cGVTaWduYXR1cmUobWV0aG9kU2lnbmF0dXJlLCBwYXJlbisxKSArIDE7CisJCWludCBsZW5ndGggPSBtZXRob2RTaWduYXR1cmUubGVuZ3RoOworCQlpZiAoZXhjZXB0aW9uU3RhcnQgPT0gbGVuZ3RoKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9CisJaW50IGxlbmd0aCA9IG1ldGhvZFNpZ25hdHVyZS5sZW5ndGg7CisJaW50IGkgPSBleGNlcHRpb25TdGFydDsKKwlBcnJheUxpc3QgZXhjZXB0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7CisJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJaWYgKG1ldGhvZFNpZ25hdHVyZVtpXSA9PSBDX0VYQ0VQVElPTl9TVEFSVCkgeworCQkJZXhjZXB0aW9uU3RhcnQrKzsKKwkJCWkrKzsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpID0gVXRpbC5zY2FuVHlwZVNpZ25hdHVyZShtZXRob2RTaWduYXR1cmUsIGkpICsgMTsKKwkJZXhjZXB0aW9uTGlzdC5hZGQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShtZXRob2RTaWduYXR1cmUsIGV4Y2VwdGlvblN0YXJ0LGkpKTsKKwkJZXhjZXB0aW9uU3RhcnQgPSBpOworCX0KKwljaGFyW11bXSByZXN1bHQ7CisJZXhjZXB0aW9uTGlzdC50b0FycmF5KHJlc3VsdCA9IG5ldyBjaGFyW2V4Y2VwdGlvbkxpc3Quc2l6ZSgpXVtdKTsKKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBFeHRyYWN0cyB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlIHNpZ25hdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSBpZiBhbnkKKyAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRocm93biBleGNlcHRpb24gdHlwZSBzaWduYXR1cmVzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRocm93bkV4Y2VwdGlvblR5cGVzKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzID0gZ2V0VGhyb3duRXhjZXB0aW9uVHlwZXMobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhwYXJhbWV0ZXJUeXBlcyk7Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgc2lnbmF0dXJlcyBvZiB0aGUgdHlwZSBhcmd1bWVudHMKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QKKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0VHlwZUFyZ3VtZW50cyhjaGFyW10gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWludCBsZW5ndGggPSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZS5sZW5ndGg7CisJaWYgKGxlbmd0aCA8IDIgfHwgcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmVbbGVuZ3RoLTJdICE9IENfR0VORVJJQ19FTkQpCisJCS8vIGNhbm5vdCBoYXZlIHR5cGUgYXJndW1lbnRzIG90aGVyd2lzZSBzaWduYXR1cmUgd291bGQgZW5kIGJ5ICI+OyIKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCWludCBjb3VudCA9IDE7IC8vIHN0YXJ0IHRvIGNvdW50IGdlbmVyaWMgZW5kL3N0YXJ0IHBlZXJzCisJaW50IHN0YXJ0ID0gbGVuZ3RoIC0gMjsKKwl3aGlsZSAoc3RhcnQgPj0gMCAmJiBjb3VudCA+IDApIHsKKwkJc3dpdGNoIChwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZVstLXN0YXJ0XSkgeworCQkJY2FzZSBDX0dFTkVSSUNfU1RBUlQ6CisJCQkJY291bnQtLTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19HRU5FUklDX0VORDoKKwkJCQljb3VudCsrOworCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChzdGFydCA8IDApIC8vIGludmFsaWQgbnVtYmVyIG9mIGdlbmVyaWMgc3RhcnQvZW5kCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwlBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKKwlpbnQgcCA9IHN0YXJ0ICsgMTsKKwl3aGlsZSAodHJ1ZSkgeworCQlpZiAocCA+PSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZS5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQljaGFyIGMgPSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZVtwXTsKKwkJaWYgKGMgPT0gQ19HRU5FUklDX0VORCkgeworCQkJaW50IHNpemUgPSBhcmdzLnNpemUoKTsKKwkJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW3NpemVdW107CisJCQlhcmdzLnRvQXJyYXkocmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaW50IGUgPSBVdGlsLnNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmUocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUsIHApOworCQlhcmdzLmFkZChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlLCBwLCBlKzEpKTsKKwkJcCA9IGUgKyAxOworCX0KK30KKy8qKgorICogRXh0cmFjdHMgdGhlIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZS4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIHR5cGUgc2lnbmF0dXJlIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmVzIG9mIHRoZSB0eXBlIGFyZ3VtZW50cworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdAorICoKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUeXBlQXJndW1lbnRzKFN0cmluZyBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJY2hhcltdW10gYXJncyA9IGdldFR5cGVBcmd1bWVudHMocGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7CisJcmV0dXJuIENoYXJPcGVyYXRpb24udG9TdHJpbmdzKGFyZ3MpOworfQorLyoqCisgKiBFeHRyYWN0cyB0aGUgdHlwZSBlcmFzdXJlIHNpZ25hdHVyZSBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlLgorICogUmV0dXJucyB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUgaWYgaXQgaXMgbm90IHBhcmFtZXRlcml6ZWQuCisgKgorICogQHBhcmFtIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgZXJhc3VyZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICoKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0VHlwZUVyYXN1cmUoY2hhcltdIHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpbnQgZW5kID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfR0VORVJJQ19TVEFSVCwgcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUpOworCWlmIChlbmQgPT0gLTEpIHJldHVybiBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZTsKKwlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyaXplZFR5cGVTaWduYXR1cmUubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOworCWludCBwb3MgPSAwOworCWludCBzdGFydCA9IDA7CisJaW50IGRlZXA9IDA7CisJZm9yIChpbnQgaWR4PWVuZDsgaWR4PGxlbmd0aDsgaWR4KyspIHsKKwkJc3dpdGNoIChwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZVtpZHhdKSB7CisJCQljYXNlIENfR0VORVJJQ19TVEFSVDoKKwkJCQlpZiAoZGVlcCA9PSAwKSB7CisJCQkJCWludCBzaXplID0gaWR4LXN0YXJ0OworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlLCBzdGFydCwgcmVzdWx0LCBwb3MsIHNpemUpOworCQkJCQllbmQgPSBpZHg7CisJCQkJCXBvcyArPSBzaXplOworCQkJCX0KKwkJCQlkZWVwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIENfR0VORVJJQ19FTkQ6CisJCQkJZGVlcC0tOworCQkJCWlmIChkZWVwIDwgMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCWlmIChkZWVwID09IDApIHN0YXJ0ID0gaWR4KzE7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRlZXAgPiAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJaW50IHNpemUgPSBwb3MrbGVuZ3RoLXN0YXJ0OworCWNoYXJbXSByZXNpemVkID0gbmV3IGNoYXJbc2l6ZV07CisJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHJlc2l6ZWQsIDAsIHBvcyk7CisJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSwgc3RhcnQsIHJlc2l6ZWQsIHBvcywgbGVuZ3RoLXN0YXJ0KTsKKwlyZXR1cm4gcmVzaXplZDsKK30KKy8qKgorICogRXh0cmFjdHMgdGhlIHR5cGUgZXJhc3VyZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZS4KKyAqIFJldHVybnMgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIGlmIGl0IGlzIG5vdCBwYXJhbWV0ZXJpemVkLgorICoKKyAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgc2lnbmF0dXJlIG9mIHRoZSB0eXBlIGVyYXN1cmUKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseQorICogICBpbmNvcnJlY3QKKyAqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVFcmFzdXJlKFN0cmluZyBwYXJhbWV0ZXJpemVkVHlwZVNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJY2hhcltdIHNpZ25hdHVyZSA9IHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCk7CisJY2hhcltdIGVyYXN1cmUgPSBnZXRUeXBlRXJhc3VyZShzaWduYXR1cmUpOworCXJldHVybiBzaWduYXR1cmUgPT0gZXJhc3VyZSA/IHBhcmFtZXRlcml6ZWRUeXBlU2lnbmF0dXJlIDogbmV3IFN0cmluZyhlcmFzdXJlKTsKK30KKworLyoqCisgKiBFeHRyYWN0cyB0aGUgY2xhc3MgYW5kIGludGVyZmFjZSBib3VuZHMgZnJvbSB0aGUgZ2l2ZW4gZm9ybWFsIHR5cGUKKyAqIHBhcmFtZXRlciBzaWduYXR1cmUuIFRoZSBjbGFzcyBib3VuZCwgaWYgcHJlc2VudCwgaXMgbGlzdGVkIGJlZm9yZQorICogdGhlIGludGVyZmFjZSBib3VuZHMuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgdHlwZSBzaWduYXR1cmVzIGZvciB0aGUgYm91bmRzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0VHlwZVBhcmFtZXRlckJvdW5kcyhjaGFyW10gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaW50IHAxID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfQ09MT04sIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpOworCWlmIChwMSA8IDApIHsKKwkJLy8gbm8gIjoiIG1lYW5zIGNhbid0IGJlIGEgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorCWlmIChwMSA9PSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLmxlbmd0aCAtIDEpIHsKKwkJLy8gbm8gY2xhc3Mgb3IgaW50ZXJmYWNlIGJvdW5kcworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJfQorCWludCBwMiA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihDX0NPTE9OLCBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEpOworCWNoYXJbXSBjbGFzc0JvdW5kOworCWlmIChwMiA8IDApIHsKKwkJLy8gbm8gaW50ZXJmYWNlIGJvdW5kcworCQljbGFzc0JvdW5kID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEsIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUubGVuZ3RoKTsKKwkJcmV0dXJuIG5ldyBjaGFyW11bXSB7Y2xhc3NCb3VuZH07CisJfQorCWlmIChwMiA9PSBwMSArIDEpIHsKKwkJLy8gbm8gY2xhc3MgYm91bmQsIGJ1dCAxIG9yIG1vcmUgaW50ZXJmYWNlIGJvdW5kcworCQljbGFzc0JvdW5kID0gbnVsbDsKKwl9IGVsc2UgeworCQljbGFzc0JvdW5kID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlLCBwMSArIDEsIHAyKTsKKwl9CisJY2hhcltdW10gaW50ZXJmYWNlQm91bmRzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKENfQ09MT04sIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUsIHAyICsgMSwgZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZS5sZW5ndGgpOworCWlmIChjbGFzc0JvdW5kID09IG51bGwpIHsKKwkJcmV0dXJuIGludGVyZmFjZUJvdW5kczsKKwl9CisJaW50IHJlc3VsdExlbmd0aCA9IGludGVyZmFjZUJvdW5kcy5sZW5ndGggKyAxOworCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbmd0aF1bXTsKKwlyZXN1bHRbMF0gPSBjbGFzc0JvdW5kOworCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlQm91bmRzLCAwLCByZXN1bHQsIDEsIGludGVyZmFjZUJvdW5kcy5sZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgYm91bmRzIGZyb20gdGhlIGdpdmVuIGZvcm1hbCB0eXBlCisgKiBwYXJhbWV0ZXIgc2lnbmF0dXJlLiBUaGUgY2xhc3MgYm91bmQsIGlmIHByZXNlbnQsIGlzIGxpc3RlZCBiZWZvcmUKKyAqIHRoZSBpbnRlcmZhY2UgYm91bmRzLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIHR5cGUgc2lnbmF0dXJlcyBmb3IgdGhlIGJvdW5kcworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoU3RyaW5nIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWNoYXJbXVtdIGJvdW5kcyA9IGdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoYm91bmRzKTsKK30KKworLyoqCisgKiBFeHRyYWN0cyB0aGUgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlcyBmcm9tIHRoZSBnaXZlbiBtZXRob2Qgb3IgdHlwZSBzaWduYXR1cmUuCisgKiBUaGUgbWV0aG9kIG9yIHR5cGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gbWV0aG9kT3JUeXBlU2lnbmF0dXJlIHRoZSBtZXRob2Qgb3IgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlcworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICoKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW11bXSBnZXRUeXBlUGFyYW1ldGVycyhjaGFyW10gbWV0aG9kT3JUeXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwl0cnkgeworCQlpbnQgbGVuZ3RoID0gbWV0aG9kT3JUeXBlU2lnbmF0dXJlLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisJCWlmIChtZXRob2RPclR5cGVTaWduYXR1cmVbMF0gIT0gQ19HRU5FUklDX1NUQVJUKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CisKKwkJQXJyYXlMaXN0IHBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7CisJCWludCBwYXJhbVN0YXJ0ID0gMSwgaSA9IDE7ICAvLyBzdGFydCBhZnRlciBsZWFkaW5nICc8JworCQl3aGlsZSAoaSA8IGxlbmd0aCkgeworCQkJaWYgKG1ldGhvZE9yVHlwZVNpZ25hdHVyZVtpXSA9PSBDX0dFTkVSSUNfRU5EKSB7CisJCQkJaW50IHNpemUgPSBwYXJhbUxpc3Quc2l6ZSgpOworCQkJCWlmIChzaXplID09IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQljaGFyW11bXSByZXN1bHQ7CisJCQkJcGFyYW1MaXN0LnRvQXJyYXkocmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV1bXSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19DT0xPTiwgbWV0aG9kT3JUeXBlU2lnbmF0dXJlLCBpKTsKKwkJCWlmIChpIDwgMCB8fCBpID49IGxlbmd0aCkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkvLyBpdGVyYXRlIG92ZXIgYm91bmRzCisJCQl3aGlsZSAobWV0aG9kT3JUeXBlU2lnbmF0dXJlW2ldID09ICc6JykgeworCQkJCWkrKzsgLy8gc2tpcCBjb2xvbgorCQkJCXN3aXRjaCAobWV0aG9kT3JUeXBlU2lnbmF0dXJlW2ldKSB7CisJCQkJCWNhc2UgJzonOgorCQkJCQkJLy8gbm8gY2xhc3MgYm91bmQKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIENfR0VORVJJQ19FTkQ6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDX1JFU09MVkVEOgorCQkJCQkJdHJ5IHsKKwkJCQkJCQlpID0gVXRpbC5zY2FuQ2xhc3NUeXBlU2lnbmF0dXJlKG1ldGhvZE9yVHlwZVNpZ25hdHVyZSwgaSk7CisJCQkJCQkJaSsrOyAvLyBwb3NpdGlvbiBhdCBzdGFydCBvZiBuZXh0IHBhcmFtIGlmIGFueQorCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkvLyBub3QgYSBjbGFzcyB0eXBlIHNpZ25hdHVyZSAtPiBpdCBpcyBhIG5ldyB0eXBlIHBhcmFtZXRlcgorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQ19BUlJBWToKKwkJCQkJCXRyeSB7CisJCQkJCQkJaSA9IFV0aWwuc2NhbkFycmF5VHlwZVNpZ25hdHVyZShtZXRob2RPclR5cGVTaWduYXR1cmUsIGkpOworCQkJCQkJCWkrKzsgLy8gcG9zaXRpb24gYXQgc3RhcnQgb2YgbmV4dCBwYXJhbSBpZiBhbnkKKwkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJLy8gbm90IGFuIGFycmF5IHR5cGUgc2lnbmF0dXJlIC0+IGl0IGlzIGEgbmV3IHR5cGUgcGFyYW1ldGVyCisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDX1RZUEVfVkFSSUFCTEU6CisJCQkJCQl0cnkgeworCQkJCQkJCWkgPSBVdGlsLnNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUobWV0aG9kT3JUeXBlU2lnbmF0dXJlLCBpKTsKKwkJCQkJCQlpKys7IC8vIHBvc2l0aW9uIGF0IHN0YXJ0IG9mIG5leHQgcGFyYW0gaWYgYW55CisJCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkJCS8vIG5vdCBhIHR5cGUgdmFyaWFibGUgc2lnbmF0dXJlIC0+IGl0IGlzIGEgbmV3IHR5cGUgcGFyYW1ldGVyCisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJLy8gZGVmYXVsdDogYW5vdGhlciB0eXBlIHBhcmFtZXRlciBpcyBzdGFydGluZworCQkJCX0KKwkJCX0KKwkJCXBhcmFtTGlzdC5hZGQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShtZXRob2RPclR5cGVTaWduYXR1cmUsIHBhcmFtU3RhcnQsIGkpKTsKKwkJCXBhcmFtU3RhcnQgPSBpOyAvLyBuZXh0IHBhcmFtIHN0YXJ0IGZyb20gaGVyZQorCQl9CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJLy8gaW52YWxpZCBzaWduYXR1cmUsIGZhbGwgdGhyb3VnaAorCX0KKwl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmVzIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBvciB0eXBlIHNpZ25hdHVyZS4KKyAqIFRoZSBtZXRob2Qgb3IgdHlwZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RPclR5cGVTaWduYXR1cmUgdGhlIG1ldGhvZCBvciB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlciBzaWduYXR1cmVzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJzKFN0cmluZyBtZXRob2RPclR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWNoYXJbXVtdIHBhcmFtcyA9IGdldFR5cGVQYXJhbWV0ZXJzKG1ldGhvZE9yVHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MocGFyYW1zKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUga2luZCBvZiB0eXBlIHNpZ25hdHVyZSBlbmNvZGVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlIHN0cmluZworICogQHJldHVybiB0aGUga2luZCBvZiB0eXBlIHNpZ25hdHVyZTsgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50czoKKyAqIHtAbGluayAjQVJSQVlfVFlQRV9TSUdOQVRVUkV9LCB7QGxpbmsgI0NMQVNTX1RZUEVfU0lHTkFUVVJFfSwKKyAqIHtAbGluayAjQkFTRV9UWVBFX1NJR05BVFVSRX0sIG9yIHtAbGluayAjVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkV9LAorICogb3IgKHNpbmNlIDMuMSkge0BsaW5rICNXSUxEQ0FSRF9UWVBFX1NJR05BVFVSRX0gb3Ige0BsaW5rICNDQVBUVVJFX1RZUEVfU0lHTkFUVVJFfSwKKyAqIG9yIChzaW5jZSAzLjcpIHtAbGluayAjSU5URVJTRUNUSU9OX1RZUEVfU0lHTkFUVVJFfQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlU2lnbmF0dXJlS2luZChjaGFyW10gdHlwZVNpZ25hdHVyZSkgeworCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhcgorCWlmICh0eXBlU2lnbmF0dXJlLmxlbmd0aCA8IDEpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwljaGFyIGMgPSB0eXBlU2lnbmF0dXJlWzBdOworCWlmIChjID09IENfR0VORVJJQ19TVEFSVCkgeworCQlpbnQgY291bnQgPSAxOworCQlmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJc3dpdGNoICh0eXBlU2lnbmF0dXJlW2ldKSB7CisJCQkJY2FzZSAJQ19HRU5FUklDX1NUQVJUOgorCQkJCQljb3VudCsrOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfR0VORVJJQ19FTkQ6CisJCQkJCWNvdW50LS07CisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlpZiAoaSsxIDwgbGVuZ3RoKQorCQkJCQljID0gdHlwZVNpZ25hdHVyZVtpKzFdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXN3aXRjaCAoYykgeworCQljYXNlIENfQVJSQVkgOgorCQkJcmV0dXJuIEFSUkFZX1RZUEVfU0lHTkFUVVJFOworCQljYXNlIENfUkVTT0xWRUQgOgorCQljYXNlIENfVU5SRVNPTFZFRCA6CisJCQlyZXR1cm4gQ0xBU1NfVFlQRV9TSUdOQVRVUkU7CisJCWNhc2UgQ19UWVBFX1ZBUklBQkxFIDoKKwkJCXJldHVybiBUWVBFX1ZBUklBQkxFX1NJR05BVFVSRTsKKwkJY2FzZSBDX0JPT0xFQU4gOgorCQljYXNlIENfQllURSA6CisJCWNhc2UgQ19DSEFSIDoKKwkJY2FzZSBDX0RPVUJMRSA6CisJCWNhc2UgQ19GTE9BVCA6CisJCWNhc2UgQ19JTlQgOgorCQljYXNlIENfTE9ORyA6CisJCWNhc2UgQ19TSE9SVCA6CisJCWNhc2UgQ19WT0lEIDoKKwkJCXJldHVybiBCQVNFX1RZUEVfU0lHTkFUVVJFOworCQljYXNlIENfU1RBUiA6CisJCWNhc2UgQ19TVVBFUiA6CisJCWNhc2UgQ19FWFRFTkRTIDoKKwkJCXJldHVybiBXSUxEQ0FSRF9UWVBFX1NJR05BVFVSRTsKKwkJY2FzZSBDX0NBUFRVUkUgOgorCQkJcmV0dXJuIENBUFRVUkVfVFlQRV9TSUdOQVRVUkU7CisJCWNhc2UgQ19JTlRFUlNFQ1RJT04gOgorCQkJcmV0dXJuIElOVEVSU0VDVElPTl9UWVBFX1NJR05BVFVSRTsKKwkJZGVmYXVsdCA6CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGtpbmQgb2YgdHlwZSBzaWduYXR1cmUgZW5jb2RlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBzdHJpbmcKKyAqIEByZXR1cm4gdGhlIGtpbmQgb2YgdHlwZSBzaWduYXR1cmU7IG9uZSBvZiB0aGUga2luZCBjb25zdGFudHM6CisgKiB7QGxpbmsgI0FSUkFZX1RZUEVfU0lHTkFUVVJFfSwge0BsaW5rICNDTEFTU19UWVBFX1NJR05BVFVSRX0sCisgKiB7QGxpbmsgI0JBU0VfVFlQRV9TSUdOQVRVUkV9LCBvciB7QGxpbmsgI1RZUEVfVkFSSUFCTEVfU0lHTkFUVVJFfSwKKyAqIG9yIChzaW5jZSAzLjEpIHtAbGluayAjV0lMRENBUkRfVFlQRV9TSUdOQVRVUkV9IG9yIHtAbGluayAjQ0FQVFVSRV9UWVBFX1NJR05BVFVSRX0KKyAqIG9yIChzaW5jZSAzLjcpIHtAbGluayAjSU5URVJTRUNUSU9OX1RZUEVfU0lHTkFUVVJFfQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlU2lnbmF0dXJlS2luZChTdHJpbmcgdHlwZVNpZ25hdHVyZSkgeworCXJldHVybiBnZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOworfQorLyoqCisgKiBFeHRyYWN0cyB0aGUgdHlwZSB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIGdpdmVuIGZvcm1hbCB0eXBlIHBhcmFtZXRlcgorICogc2lnbmF0dXJlLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSB2YXJpYWJsZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRUeXBlVmFyaWFibGUoY2hhcltdIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWludCBwID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfQ09MT04sIGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUpOworCWlmIChwIDwgMCkgeworCQkvLyBubyAiOiIgbWVhbnMgY2FuJ3QgYmUgYSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSwgMCwgcCk7Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSB0eXBlIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZm9ybWFsIHR5cGUgcGFyYW1ldGVyCisgKiBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBmb3JtYWxUeXBlUGFyYW1ldGVyU2lnbmF0dXJlIHRoZSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHZhcmlhYmxlCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVWYXJpYWJsZShTdHJpbmcgZm9ybWFsVHlwZVBhcmFtZXRlclNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0VHlwZVZhcmlhYmxlKGZvcm1hbFR5cGVQYXJhbWV0ZXJTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBSZW1vdmVzIGFueSBjYXB0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIHR5cGUgb3IgbWV0aG9kIHNpZ25hdHVyZQorICogYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBzaWduYXR1cmUuCisgKiBSZXR1cm5zIHRoZSB0eXBlIG9yIG1ldGhvZCBzaWduYXR1cmUgaXRzZWxmIGlmIG5vIGNhcHR1cmUgaW5mb3JtYXRpb24gaXMKKyAqIHByZXNlbnQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlICh1c2luZyBlcXVpdmFsZW50IHN0cmluZy1iYXNlZCBtZXRob2QpOgorICogPHByZT4KKyAqIDxjb2RlPgorICogcmVtb3ZlQ2FwdHVyZSgiTFRlc3QmbHQ7IStMamF2YS5sYW5nLlRocm93YWJsZTsmZ3Q7OyIpCisgKiB3aWxsIHJldHVybjogIkxUZXN0Jmx0OytMamF2YS5sYW5nLlRocm93YWJsZTsmZ3Q7OyIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSBtZXRob2RPclR5cGVTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSB3aGljaCBtYXkgaGF2ZSBiZWVuIGNhcHR1cmVkCisgKiBAcmV0dXJuIGEgbmV3IHNpZ25hdHVyZSB3aXRob3V0IGNhcHR1cmUgaW5mb3JtYXRpb24gb3IgdGhlIHNpZ25hdHVyZSBpdHNlbGYKKyAqIAlpZiBubyBzcGVjaWZpYyBjYXB0dXJlIGluZm9ybWF0aW9uIGlzIHByZXNlbnQKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+bWV0aG9kT3JUeXBlU2lnbmF0dXJlPC9jb2RlPiBpcyBudWxsCisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVDYXB0dXJlKGNoYXJbXSBtZXRob2RPclR5cGVTaWduYXR1cmUpIHsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5yZW1vdmUobWV0aG9kT3JUeXBlU2lnbmF0dXJlLCBDX0NBUFRVUkUpOworfQorLyoqCisgKiBSZW1vdmVzIGFueSBjYXB0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIHR5cGUgb3IgbWV0aG9kIHNpZ25hdHVyZQorICogYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBzaWduYXR1cmUuCisgKiBSZXR1cm5zIHRoZSB0eXBlIG9yIG1ldGhvZCBzaWduYXR1cmUgaXRzZWxmIGlmIG5vIGNhcHR1cmUgaW5mb3JtYXRpb24gaXMKKyAqIHByZXNlbnQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogcmVtb3ZlQ2FwdHVyZSgiTFRlc3QmbHQ7IStMamF2YS5sYW5nLlRocm93YWJsZTsmZ3Q7OyIpCisgKiB3aWxsIHJldHVybjogIkxUZXN0Jmx0OytMamF2YS5sYW5nLlRocm93YWJsZTsmZ3Q7OyIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSBtZXRob2RPclR5cGVTaWduYXR1cmUgdGhlIHNpZ25hdHVyZSB3aGljaCBtYXkgaGF2ZSBiZWVuIGNhcHR1cmVkCisgKiBAcmV0dXJuIGEgbmV3IHNpZ25hdHVyZSB3aXRob3V0IGNhcHR1cmUgaW5mb3JtYXRpb24gb3IgdGhlIHNpZ25hdHVyZSBpdHNlbGYKKyAqIAlpZiBubyBzcGVjaWZpYyBjYXB0dXJlIGluZm9ybWF0aW9uIGlzIHByZXNlbnQKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+bWV0aG9kT3JUeXBlU2lnbmF0dXJlPC9jb2RlPiBpcyBudWxsCisgKgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVDYXB0dXJlKFN0cmluZyBtZXRob2RPclR5cGVTaWduYXR1cmUpIHsKKwljaGFyW10gYXJyYXkgPSBtZXRob2RPclR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKTsKKwljaGFyW10gcmVzdWx0ID0gcmVtb3ZlQ2FwdHVyZShhcnJheSk7CisJaWYgKGFycmF5ID09IHJlc3VsdCkgcmV0dXJuIG1ldGhvZE9yVHlwZVNpZ25hdHVyZTsKKwlyZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworfQorLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBzdHJpbmcuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8KKyAqIGJlIGRvdC1iYXNlZC4KKyAqCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogdG9TdHJpbmcoeydbJywgJ0wnLCAnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZycsICc7J30pIC0+IHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZycsICdbJywgJ10nfQorICogdG9TdHJpbmcoeydJJ30pIC0+IHsnaScsICduJywgJ3QnfQorICogdG9TdHJpbmcoeycrJywgJ0wnLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnLCAnOyd9KSAtPiB7Jz8nLCAnICcsICdlJywgJ3gnLCAndCcsICdlJywgJ24nLCAnZCcsICdzJywgJyAnLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfQorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBhIHR5cGUgc2lnbmF0dXJlIGNvbnRhaW5pbmcgYSA8Y29kZT4nJCc8L2NvZGU+CisgKiBpcyBhbiBpbm5lciB0eXBlIHNpZ25hdHVyZS4gV2hpbGUgdGhpcyBpcyBjb3JyZWN0IGluIG1vc3QgY2FzZXMsIHNvbWVvbmUgY291bGQKKyAqIGRlZmluZSBhIG5vbi1pbm5lciB0eXBlIG5hbWUgY29udGFpbmluZyBhIDxjb2RlPickJzwvY29kZT4uIEhhbmRsaW5nIHRoaXMKKyAqIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMgd291bGQgaGF2ZSByZXF1aXJlZCByZXNvbHZpbmcgdGhlIHNpZ25hdHVyZSwgd2hpY2gKKyAqIGdlbmVyYWxseSBub3QgZmVhc2libGUuCisgKiA8L3A+CisgKgorICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdAorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFyQXJyYXkoY2hhcltdIHNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJCWludCBzaWdMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOworCQlpZiAoc2lnTGVuZ3RoID09IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAoc2lnbmF0dXJlWzBdID09IENfUEFSQU1fU1RBUlQgfHwgc2lnbmF0dXJlWzBdID09IENfR0VORVJJQ19TVEFSVCkgeworCQkJcmV0dXJuIHRvQ2hhckFycmF5KHNpZ25hdHVyZSwgQ2hhck9wZXJhdGlvbi5OT19DSEFSLCBudWxsLCB0cnVlLCB0cnVlKTsKKwkJfQorCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNpZ25hdHVyZS5sZW5ndGggKyAxMCk7CisJCWFwcGVuZFR5cGVTaWduYXR1cmUoc2lnbmF0dXJlLCAwLCB0cnVlLCBidWZmZXIpOworCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbYnVmZmVyLmxlbmd0aCgpXTsKKwkJYnVmZmVyLmdldENoYXJzKDAsIGJ1ZmZlci5sZW5ndGgoKSwgcmVzdWx0LCAwKTsKKwkJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBmb3JtLiBUaGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBleHBlY3RlZCB0bworICogYmUgZG90LWJhc2VkLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIHRvU3RyaW5nKCIoW0xqYXZhLmxhbmcuU3RyaW5nOylWIiwgIm1haW4iLCBuZXcgU3RyaW5nW10geyJhcmdzIn0sIGZhbHNlLCB0cnVlKSAtPiAidm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIgorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBjb252ZXJ0CisgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvcgorICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtZXRob2QgbmFtZSBpcyB0byBiZSBpbmNsdWRlZAorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yCisgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBuYW1lcyBhcmUgdG8gYmUgaW5jbHVkZWQ7IGlmIHN1cHBsaWVkLAorICogICB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBuYW1lcyBtdXN0IG1hdGNoIHRoYXQgb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKKyAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcworICogQHBhcmFtIGluY2x1ZGVSZXR1cm5UeXBlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXR1cm4gdHlwZSBpcyB0byBiZQorICogICBpbmNsdWRlZAorICogQHJldHVybiB0aGUgY2hhciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFyQXJyYXkoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSwgY2hhcltdIG1ldGhvZE5hbWUsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYm9vbGVhbiBpbmNsdWRlUmV0dXJuVHlwZSkgeworCXJldHVybiB0b0NoYXJBcnJheShtZXRob2RTaWduYXR1cmUsIG1ldGhvZE5hbWUsIHBhcmFtZXRlck5hbWVzLCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGluY2x1ZGVSZXR1cm5UeXBlLCBmYWxzZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBmb3JtLiBUaGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBleHBlY3RlZCB0bworICogYmUgZG90LWJhc2VkLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIHRvU3RyaW5nKCIoW0xqYXZhLmxhbmcuU3RyaW5nOylWIiwgIm1haW4iLCBuZXcgU3RyaW5nW10geyJhcmdzIn0sIGZhbHNlLCB0cnVlKSAtPiAidm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIgorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBjb252ZXJ0CisgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvcgorICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtZXRob2QgbmFtZSBpcyB0byBiZSBpbmNsdWRlZAorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yCisgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBuYW1lcyBhcmUgdG8gYmUgaW5jbHVkZWQ7IGlmIHN1cHBsaWVkLAorICogICB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBuYW1lcyBtdXN0IG1hdGNoIHRoYXQgb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKKyAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcworICogQHBhcmFtIGluY2x1ZGVSZXR1cm5UeXBlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXR1cm4gdHlwZSBpcyB0byBiZQorICogICBpbmNsdWRlZAorICogQHBhcmFtIGlzVmFyZ0FyZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhc3QgYXJndW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhCisgKiB2YXJpYWJsZSBhcmd1bWVudCwgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKiBAcmV0dXJuIHRoZSBjaGFyIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdAorICoKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFyQXJyYXkoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSwgY2hhcltdIG1ldGhvZE5hbWUsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYm9vbGVhbiBpbmNsdWRlUmV0dXJuVHlwZSwgYm9vbGVhbiBpc1ZhcmdBcmdzKSB7CisJaW50IGZpcnN0UGFyZW4gPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKTsKKwlpZiAoZmlyc3RQYXJlbiA9PSAtMSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWV0aG9kU2lnbmF0dXJlLmxlbmd0aCArIDEwKTsKKworCS8vIHJldHVybiB0eXBlCisJaWYgKGluY2x1ZGVSZXR1cm5UeXBlKSB7CisJCWNoYXJbXSBydHMgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFNpZ25hdHVyZSk7CisJCWFwcGVuZFR5cGVTaWduYXR1cmUocnRzLCAwICwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIpOworCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJfQorCisJLy8gc2VsZWN0b3IKKwlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQobWV0aG9kTmFtZSk7CisJfQorCisJLy8gcGFyYW1ldGVycworCWJ1ZmZlci5hcHBlbmQoJygnKTsKKwljaGFyW11bXSBwdHMgPSBnZXRQYXJhbWV0ZXJUeXBlcyhtZXRob2RTaWduYXR1cmUpOworCS8vIHNlYXJjaCBmb3IgdGhlIGxhc3QgYXJyYXkgaW4gdGhlIHNpZ25hdHVyZQorCWludCBtYXggPSBwdHMubGVuZ3RoOworCWludCBpbmRleCA9IG1heCAtIDE7CisJbG9vcDogZm9yIChpbnQgaSA9IGluZGV4OyBpID49IDA7IGktLSkgeworCQlpZiAocHRzW2ldWzBdID09IFNpZ25hdHVyZS5DX0FSUkFZKSB7CisJCQlicmVhayBsb29wOworCQl9CisJCWluZGV4LS07CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJaWYgKGkgPT0gaW5kZXgpIHsKKwkJCWFwcGVuZFR5cGVTaWduYXR1cmUocHRzW2ldLCAwICwgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBidWZmZXIsIGlzVmFyZ0FyZ3MpOworCQl9IGVsc2UgeworCQkJYXBwZW5kVHlwZVNpZ25hdHVyZShwdHNbaV0sIDAgLCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGJ1ZmZlcik7CisJCX0KKwkJaWYgKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCWJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyTmFtZXNbaV0pOworCQl9CisJCWlmIChpICE9IHB0cy5sZW5ndGggLSAxKSB7CisJCQlidWZmZXIuYXBwZW5kKCcsJyk7CisJCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgnKScpOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltidWZmZXIubGVuZ3RoKCldOworCWJ1ZmZlci5nZXRDaGFycygwLCBidWZmZXIubGVuZ3RoKCksIHJlc3VsdCwgMCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgcXVhbGlmaWVkIG5hbWUgc2VnbWVudHMgdG8gYSBxdWFsaWZpZWQgbmFtZS4KICAqIDxwPgpAQCAtMjY1MywxNCArMjc2NiwxNCBAQAogICoKICAqIEBwYXJhbSBzZWdtZW50cyB0aGUgbGlzdCBvZiBuYW1lIHNlZ21lbnRzLCBwb3NzaWJseSBlbXB0eQogICogQHJldHVybiB0aGUgZG90LXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZSwgb3IgdGhlIGVtcHR5IHN0cmluZwotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgc3RhdGljIGNoYXJbXSB0b1F1YWxpZmllZE5hbWUoY2hhcltdW10gc2VnbWVudHMpIHsKIAlpbnQgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOwogCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlpZiAobGVuZ3RoID09IDEpIHJldHVybiBzZWdtZW50c1swXTsKLQkKKwogCWludCByZXN1bHRMZW5ndGggPSAwOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJcmVzdWx0TGVuZ3RoICs9IHNlZ21lbnRzW2ldLmxlbmd0aCsxOwpAQCAtMjY3OSw2ICsyNzkyLDcgQEAKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KKwogLyoqCiAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgcXVhbGlmaWVkIG5hbWUgc2VnbWVudHMgdG8gYSBxdWFsaWZpZWQgbmFtZS4KICAqIDxwPgpAQCAtMjcwNiw3ICsyODIwLDcgQEAKIC8qKgogICogQ29udmVydHMgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgc3RyaW5nLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvCiAgKiBiZSBkb3QtYmFzZWQuCi0gKiAKKyAqCiAgKiA8cD4KICAqIEZvciBleGFtcGxlOgogICogPHByZT4KQEAgLTI3MTksOSArMjgzMyw5IEBACiAgKiA8L3A+CiAgKiA8cD4KICAqIE5vdGU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBhIHR5cGUgc2lnbmF0dXJlIGNvbnRhaW5pbmcgYSA8Y29kZT4nJCc8L2NvZGU+Ci0gKiBpcyBhbiBpbm5lciB0eXBlIHNpZ25hdHVyZS4gV2hpbGUgdGhpcyBpcyBjb3JyZWN0IGluIG1vc3QgY2FzZXMsIHNvbWVvbmUgY291bGQgCi0gKiBkZWZpbmUgYSBub24taW5uZXIgdHlwZSBuYW1lIGNvbnRhaW5pbmcgYSA8Y29kZT4nJCc8L2NvZGU+LiBIYW5kbGluZyB0aGlzIAotICogY29ycmVjdGx5IGluIGFsbCBjYXNlcyB3b3VsZCBoYXZlIHJlcXVpcmVkIHJlc29sdmluZyB0aGUgc2lnbmF0dXJlLCB3aGljaCAKKyAqIGlzIGFuIGlubmVyIHR5cGUgc2lnbmF0dXJlLiBXaGlsZSB0aGlzIGlzIGNvcnJlY3QgaW4gbW9zdCBjYXNlcywgc29tZW9uZSBjb3VsZAorICogZGVmaW5lIGEgbm9uLWlubmVyIHR5cGUgbmFtZSBjb250YWluaW5nIGEgPGNvZGU+JyQnPC9jb2RlPi4gSGFuZGxpbmcgdGhpcworICogY29ycmVjdGx5IGluIGFsbCBjYXNlcyB3b3VsZCBoYXZlIHJlcXVpcmVkIHJlc29sdmluZyB0aGUgc2lnbmF0dXJlLCB3aGljaAogICogZ2VuZXJhbGx5IG5vdCBmZWFzaWJsZS4KICAqIDwvcD4KICAqCkBAIC0yNzM2LDExICsyODUwLDExIEBACiAvKioKICAqIENvbnZlcnRzIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgc3RyaW5nLiBUaGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBleHBlY3RlZCB0bwogICogYmUgZG90LWJhc2VkLgotICogCisgKgogICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvciAKKyAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yCiAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG1ldGhvZCBuYW1lIGlzIHRvIGJlIGluY2x1ZGVkCi0gKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgdGhlIHBhcmFtZXRlciBuYW1lcyB0byBpbnNlcnQgaW4gdGhlIHJlc3VsdCwgb3IgCisgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgdGhlIHBhcmFtZXRlciBuYW1lcyB0byBpbnNlcnQgaW4gdGhlIHJlc3VsdCwgb3IKICAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVyIG5hbWVzIGFyZSB0byBiZSBpbmNsdWRlZDsgaWYgc3VwcGxpZWQsCiAgKiAgIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIG5hbWVzIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQogICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQpAQCAtMjc1NiwxOCArMjg3MCwxOCBAQAogLyoqCiAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSB0byBhIHJlYWRhYmxlIHN0cmluZy4gVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8KICAqIGJlIGRvdC1iYXNlZC4KLSAqIAorICoKICAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUgdG8gY29udmVydAotICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnNlcnQgaW4gdGhlIHJlc3VsdCwgb3IgCisgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvcgogICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtZXRob2QgbmFtZSBpcyB0byBiZSBpbmNsdWRlZAotICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yIAorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yCiAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlciBuYW1lcyBhcmUgdG8gYmUgaW5jbHVkZWQ7IGlmIHN1cHBsaWVkLAogICogICB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBuYW1lcyBtdXN0IG1hdGNoIHRoYXQgb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKICAqIEBwYXJhbSBmdWxseVF1YWxpZnlUeXBlTmFtZXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHlwZSBuYW1lcyBzaG91bGQgYmUgZnVsbHkKICAqICAgcXVhbGlmaWVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSBvbmx5IHNpbXBsZSBuYW1lcwogICogQHBhcmFtIGluY2x1ZGVSZXR1cm5UeXBlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXR1cm4gdHlwZSBpcyB0byBiZQogICogICBpbmNsdWRlZAotICogQHBhcmFtIGlzVmFyQXJncyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFzdCBhcmd1bWVudCBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGEgCisgKiBAcGFyYW0gaXNWYXJBcmdzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYXN0IGFyZ3VtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgYQogICogdmFyaWFibGUgYXJndW1lbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKICAqIEBzZWUgI3RvQ2hhckFycmF5KGNoYXJbXSwgY2hhcltdLCBjaGFyW11bXSwgYm9vbGVhbiwgYm9vbGVhbikKICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQpAQCAtMjc4Nyw0ICsyOTAxLDcgQEAKIAl9CiAJcmV0dXJuIG5ldyBTdHJpbmcodG9DaGFyQXJyYXkobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCksIG1ldGhvZE5hbWUgPT0gbnVsbCA/IG51bGwgOiBtZXRob2ROYW1lLnRvQ2hhckFycmF5KCksIHBhcmFtcywgZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBpbmNsdWRlUmV0dXJuVHlwZSwgaXNWYXJBcmdzKSk7CiB9Citwcml2YXRlIFNpZ25hdHVyZSgpIHsKKwkvLyBOb3QgaW5zdGFudGlhYmxlCit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Tb3VyY2VSYW5nZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU291cmNlUmFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQ5MTZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU291cmNlUmFuZ2UuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKworLyoqCisgKiBBIHNvdXJjZSByYW5nZSBkZWZpbmVzIGFuIGVsZW1lbnQncyBzb3VyY2UgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8KKyAqIGl0cyBzb3VyY2UgYnVmZmVyLgorICoKKyAqIEBzZWUgSVNvdXJjZVJhbmdlCisgKiBAc2luY2UgMy42CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VSYW5nZSBpbXBsZW1lbnRzIElTb3VyY2VSYW5nZSB7CisKKwkvKioKKwkgKiBIZWxwZXIgbWV0aG9kIHRoYXQgYW5zd2VycyB3aGV0aGVyIGEgdmFsaWQgc291cmNlIHJhbmdlIGlzIGF2YWlsYWJsZQorCSAqIGluIHRoZSBnaXZlbiBJU291cmNlUmFuZ2UuIFdoZW4gYW4gZWxlbWVudCBoYXMgbm8gYXNzb2NpYXRlZCBzb3VyY2UKKwkgKiBjb2RlLCBKYXZhIE1vZGVsIEFQSXMgbWF5IHJldHVybiBlaXRoZXIgPGNvZGU+bnVsbDwvY29kZT4gb3IgYSByYW5nZSBvZgorCSAqIFstMSwgMF0gdG8gaW5kaWNhdGUgYW4gaW52YWxpZCByYW5nZS4gVGhpcyB1dGlsaXR5IG1ldGhvZCBjYW4gYmUgdXNlZAorCSAqIHRvIGRldGVjdCB0aGF0IGNhc2UuCisJICoKKwkgKiBAcGFyYW0gcmFuZ2UgYSBzb3VyY2UgcmFuZ2UsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJhbmdlIGlzIG5vdCBudWxsIGFuZCByYW5nZS5nZXRPZmZzZXQoKSBpcyBub3QgLTEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSVNvdXJjZVJhbmdlIHJhbmdlKSB7IC8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMTYxCisJCXJldHVybiByYW5nZSAhPSBudWxsICYmIHJhbmdlLmdldE9mZnNldCgpICE9IC0xOworCX0KKworCXByaXZhdGUgaW50IG9mZnNldDsKKwlwcml2YXRlIGludCBsZW5ndGg7CisKKwkvKioKKwkgKiBJbnN0YW50aWF0ZSBhIG5ldyBzb3VyY2UgcmFuZ2UgdXNpbmcgdGhlIGdpdmVuIG9mZnNldCBhbmQgdGhlIGdpdmVuIGxlbmd0aC4KKwkgKiAKKwkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBnaXZlbiBvZmZzZXQKKwkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBnaXZlbiBsZW5ndGgKKwkgKi8KKwlwdWJsaWMgU291cmNlUmFuZ2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJfQorCS8qCisJICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJU291cmNlUmFuZ2UpKQorCQkJcmV0dXJuIGZhbHNlOworCQlJU291cmNlUmFuZ2Ugc291cmNlUmFuZ2UgPSAoSVNvdXJjZVJhbmdlKSBvYmo7CisJCXJldHVybiBzb3VyY2VSYW5nZS5nZXRPZmZzZXQoKSA9PSB0aGlzLm9mZnNldCAmJiBzb3VyY2VSYW5nZS5nZXRMZW5ndGgoKSA9PSB0aGlzLmxlbmd0aDsKKwl9CisJLyoqCisJICogQHNlZSBJU291cmNlUmFuZ2UKKwkgKi8KKwlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwkJcmV0dXJuIHRoaXMubGVuZ3RoOworCX0KKwkvKioKKwkgKiBAc2VlIElTb3VyY2VSYW5nZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworCQlyZXR1cm4gdGhpcy5vZmZzZXQ7CisJfQorCisJLyoKKwkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCisJICovCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRoaXMubGVuZ3RoIF4gdGhpcy5vZmZzZXQ7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZCgiW29mZnNldD0iKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHRoaXMub2Zmc2V0KTsKKwkJYnVmZmVyLmFwcGVuZCgiLCBsZW5ndGg9Iik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmxlbmd0aCk7CisJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvVG9vbEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1Rvb2xGYWN0b3J5LmphdmEKaW5kZXggZDhkYjM3Yi4uZjAzZWMxYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvVG9vbEZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Ub29sRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyOwpAQCAtMzEsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlN1ZmZpeENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DbGFzc0ZpbGVSZWFkZXI7CkBAIC00MSwzMCArNDMsMzIgQEAKIC8qKgogICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdmFyaW91cyBjb21waWxlciB0b29scywgc3VjaCBhcyBzY2FubmVycywgcGFyc2VycyBhbmQgY29tcGlsZXJzLgogICogPHA+Ci0gKiAgVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIG9ubHkuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUb29sRmFjdG9yeSB7Ci0JCisKIAkvKioKLQkgKiBUaGlzIG1vZGUgaXMgdXNlZCBmb3IgZm9ybWF0dGluZyBuZXcgY29kZSB3aGVuIHNvbWUgZm9ybWF0dGVyIG9wdGlvbnMgc2hvdWxkIG5vdCBiZSB1c2VkLiAKLQkgKiBJbiBwYXJ0aWN1bGFyLCBvcHRpb25zIHRoYXQgcHJlc2VydmUgdGhlIGluZGVudGF0aW9uIG9mIGNvbW1lbnRzIGFyZSBub3QgdXNlZC4gCisJICogVGhpcyBtb2RlIGlzIHVzZWQgZm9yIGZvcm1hdHRpbmcgbmV3IGNvZGUgd2hlbiBzb21lIGZvcm1hdHRlciBvcHRpb25zIHNob3VsZCBub3QgYmUgdXNlZC4KKwkgKiBJbiBwYXJ0aWN1bGFyLCBvcHRpb25zIHRoYXQgcHJlc2VydmUgdGhlIGluZGVudGF0aW9uIG9mIGNvbW1lbnRzIGFyZSBub3QgdXNlZC4KIAkgKiBJbiB0aGUgZnV0dXJlLCAgbmV3bHkgYWRkZWQgb3B0aW9ucyBtYXkgYmUgaWdub3JlZCBhcyB3ZWxsLgogCSAqIDxwPkNsaWVudHMgdGhhdCBhcmUgZm9ybWF0dGluZyBuZXcgY29kZSBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgbW9kZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAc2VlIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9ORVZFUl9JTkRFTlRfQkxPQ0tfQ09NTUVOVFNfT05fRklSU1RfQ09MVU1OCiAJICogQHNlZSBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfTkVWRVJfSU5ERU5UX0xJTkVfQ09NTUVOVFNfT05fRklSU1RfQ09MVU1OCiAJICogQHNlZSAjY3JlYXRlQ29kZUZvcm1hdHRlcihNYXAsIGludCkKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9GT1JNQVRfTkVXID0gbmV3IEludGVnZXIoMCkuaW50VmFsdWUoKTsKLQkKKwogCS8qKgotCSAqIFRoaXMgbW9kZSBpcyB1c2VkIGZvciBmb3JtYXR0aW5nIGV4aXN0aW5nIGNvZGUgd2hlbiBhbGwgZm9ybWF0dGVyIG9wdGlvbnMgc2hvdWxkIGJlIHVzZWQuIAotCSAqIEluIHBhcnRpY3VsYXIsIG9wdGlvbnMgdGhhdCBwcmVzZXJ2ZSB0aGUgaW5kZW50YXRpb24gb2YgY29tbWVudHMgYXJlIHVzZWQuIAorCSAqIFRoaXMgbW9kZSBpcyB1c2VkIGZvciBmb3JtYXR0aW5nIGV4aXN0aW5nIGNvZGUgd2hlbiBhbGwgZm9ybWF0dGVyIG9wdGlvbnMgc2hvdWxkIGJlIHVzZWQuCisJICogSW4gcGFydGljdWxhciwgb3B0aW9ucyB0aGF0IHByZXNlcnZlIHRoZSBpbmRlbnRhdGlvbiBvZiBjb21tZW50cyBhcmUgdXNlZC4KIAkgKiA8cD5DbGllbnRzIHRoYXQgYXJlIGZvcm1hdHRpbmcgZXhpc3RpbmcgY29kZSBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgbW9kZS4KIAkgKiA8L3A+CiAJICoKQEAgLTc2LDIwICs4MCwyMCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fRk9STUFUX0VYSVNUSU5HID0gbmV3IEludGVnZXIoMSkuaW50VmFsdWUoKTsKIAogCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvZGUgZm9ybWF0dGVyLiBBIGNvZGUgZm9ybWF0dGVyIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb250cmlidXRlZCB2aWEgdGhlIAotCSAqIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciIuIElmIHVuYWJsZSB0byBmaW5kIGEgcmVnaXN0ZXJlZCBleHRlbnNpb24sIHRoZSBmYWN0b3J5IAorCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvZGUgZm9ybWF0dGVyLiBBIGNvZGUgZm9ybWF0dGVyIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb250cmlidXRlZCB2aWEgdGhlCisJICogZXh0ZW5zaW9uIHBvaW50ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlRm9ybWF0dGVyIi4gSWYgdW5hYmxlIHRvIGZpbmQgYSByZWdpc3RlcmVkIGV4dGVuc2lvbiwgdGhlIGZhY3RvcnkKIAkgKiB3aWxsIGRlZmF1bHQgdG8gdXNpbmcgdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIGEgY29kZSBmb3JtYXR0ZXIKIAkgKiBAc2VlIElDb2RlRm9ybWF0dGVyCiAJICogQHNlZSBUb29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcihNYXApCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlQ29kZUZvcm1hdHRlcihNYXApfSBpbnN0ZWFkLiBFeHRlbnNpb24gcG9pbnQgaXMgZGlzY29udGludWVkCisJICogQGRlcHJlY2F0ZWQgVGhlIGV4dGVuc2lvbiBwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2Uge0BsaW5rICNjcmVhdGVDb2RlRm9ybWF0dGVyKE1hcCl9IGluc3RlYWQuCiAJICovCiAJcHVibGljIHN0YXRpYyBJQ29kZUZvcm1hdHRlciBjcmVhdGVDb2RlRm9ybWF0dGVyKCl7Ci0JCQorCiAJCQlQbHVnaW4gamR0Q29yZVBsdWdpbiA9IEphdmFDb3JlLmdldFBsdWdpbigpOwogCQkJaWYgKGpkdENvcmVQbHVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQorCiAJCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uID0gamR0Q29yZVBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSmF2YU1vZGVsTWFuYWdlci5GT1JNQVRURVJfRVhUUE9JTlRfSUQpOwogCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7CiAJCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSAgZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKTsKQEAgLTEwNiw5ICsxMTAsOSBAQAogCQkJCQkJCS8vIHVuYWJsZSB0byBpbnN0YW50aWF0ZSBleHRlbnNpb24sIHdpbGwgYW5zd2VyIGRlZmF1bHQgZm9ybWF0dGVyIGluc3RlYWQKIAkJCQkJCX0KIAkJCQkJfQotCQkJCX0JCisJCQkJfQogCQkJfQotCQkvLyBubyBwcm9wZXIgY29udHJpYnV0aW9uIGZvdW5kLCB1c2UgZGVmYXVsdCBmb3JtYXR0ZXIJCQkKKwkJLy8gbm8gcHJvcGVyIGNvbnRyaWJ1dGlvbiBmb3VuZCwgdXNlIGRlZmF1bHQgZm9ybWF0dGVyCiAJCXJldHVybiBjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcihudWxsKTsKIAl9CiAKQEAgLTEyMyw3ICsxMjcsNyBAQAogCSAqIG1heSBiZSBpZ25vcmVkLiBTZWUgQHtsaW5rIHtAbGluayAjTV9GT1JNQVRfTkVXfSBmb3IgbW9yZSBkZXRhaWxzLgogCSAqIDwvcD4KIAkgKiBAcGFyYW0gb3B0aW9ucyAtIHRoZSBvcHRpb25zIG1hcCB0byB1c2UgZm9yIGZvcm1hdHRpbmcgd2l0aCB0aGUgZGVmYXVsdCBjb2RlIGZvcm1hdHRlci4gUmVjb2duaXplZCBvcHRpb25zCi0JICogCWFyZSBkb2N1bWVudGVkIG9uIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCk8L2NvZGU+LiBJZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdXNlIAorCSAqIAlhcmUgZG9jdW1lbnRlZCBvbiA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPi4gSWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHVzZQogCSAqIAl0aGUgY3VycmVudCBzZXR0aW5ncyBmcm9tIDxjb2RlPkphdmFDb3JlI2dldE9wdGlvbnM8L2NvZGU+LgogCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGJ1aWx0LWluIGNvZGUgZm9ybWF0dGVyCiAJICogQHNlZSBDb2RlRm9ybWF0dGVyCkBAIC0xNDQsOSArMTQ4LDkgQEAKIAkgKiA8cD5UaGUgZ2l2ZW4gbW9kZSBkZXRlcm1pbmVzIHdoYXQgb3B0aW9ucyBzaG91bGQgYmUgZW5hYmxlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIGNvZGUuIEl0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcKIAkgKiB2YWx1ZXM6IHtAbGluayAjTV9GT1JNQVRfTkVXfSwge0BsaW5rICNNX0ZPUk1BVF9FWElTVElOR30sIGJ1dCBvdGhlciB2YWx1ZXMgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgbWFwIHRvIHVzZSBmb3IgZm9ybWF0dGluZyB3aXRoIHRoZSBkZWZhdWx0IGNvZGUgZm9ybWF0dGVyLiBSZWNvZ25pemVkIG9wdGlvbnMKLQkgKiAJYXJlIGRvY3VtZW50ZWQgb24gPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKTwvY29kZT4uIElmIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB1c2UgCisJICogCWFyZSBkb2N1bWVudGVkIG9uIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCk8L2NvZGU+LiBJZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdXNlCiAJICogCXRoZSBjdXJyZW50IHNldHRpbmdzIGZyb20gPGNvZGU+SmF2YUNvcmUjZ2V0T3B0aW9uczwvY29kZT4uCiAJICogQHBhcmFtIG1vZGUgdGhlIGdpdmVuIG1vZGUgdG8gbW9kaWZ5IHRoZSBnaXZlbiBvcHRpb25zLgogCSAqCkBAIC0xNTksNiArMTYzLDggQEAKIAkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKIAkJTWFwIGN1cnJlbnRPcHRpb25zID0gbmV3IEhhc2hNYXAob3B0aW9ucyk7CiAJCWlmIChtb2RlID09IE1fRk9STUFUX05FVykgeworCQkJLy8gZGlzYWJsZSB0aGUgb3B0aW9uIGZvciBub3QgZm9ybWF0dGluZyBjb21tZW50cyBzdGFydGluZyBvbiBmaXJzdCBjb2x1bW4KKwkJCWN1cnJlbnRPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfTElORV9DT01NRU5UX1NUQVJUSU5HX09OX0ZJUlNUX0NPTFVNTiwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuVFJVRSk7CiAJCQkvLyBkaXNhYmxlIHRoZSBvcHRpb24gZm9yIG5vdCBpbmRlbnRpbmcgY29tbWVudHMgc3RhcnRpbmcgb24gZmlyc3QgY29sdW1uCiAJCQljdXJyZW50T3B0aW9ucy5wdXQoRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX05FVkVSX0lOREVOVF9CTE9DS19DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4sIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZBTFNFKTsKIAkJCWN1cnJlbnRPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfTkVWRVJfSU5ERU5UX0xJTkVfQ09NTUVOVFNfT05fRklSU1RfQ09MVU1OLCBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GQUxTRSk7CkBAIC0xNjgsNyArMTc0LDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZSBhIGNsYXNzZmlsZSBieXRlY29kZSBkaXNhc3NlbWJsZXIsIGFibGUgdG8gcHJvZHVjZSBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGdpdmVuIGNsYXNzZmlsZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYSBjbGFzc2ZpbGUgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyCiAJICogQHNlZSBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcgogCSAqIEBzaW5jZSAyLjEKQEAgLTE3NiwxMyArMTgyLDEzIEBACiAJcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIoKXsKIAkJcmV0dXJuIG5ldyBEaXNhc3NlbWJsZXIoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGUgYSBjbGFzc2ZpbGUgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyLCBhYmxlIHRvIHByb2R1Y2UgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgY2xhc3NmaWxlIGJ5dGVjb2RlIGRpc2Fzc2VtYmxlcgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlRGlzYXNzZW1ibGVyCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCl9IGluc3RlYWQgCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCl9IGluc3RlYWQKIAkgKi8KIAlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlciBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlRGlzYXNzZW1ibGVyKCl7CiAJCWNsYXNzIERlcHJlY2F0ZWREaXNhc3NlbWJsZXIgZXh0ZW5kcyBEaXNhc3NlbWJsZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVEaXNhc3NlbWJsZXIgewpAQCAtMTkwLDE5ICsxOTYsMTkgQEAKIAkJfQogCQlyZXR1cm4gbmV3IERlcHJlY2F0ZWREaXNhc3NlbWJsZXIoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGUgYSBjbGFzc2ZpbGUgcmVhZGVyIG9udG8gYSBjbGFzc2ZpbGUgSmF2YSBlbGVtZW50LgogCSAqIENyZWF0ZSBhIGRlZmF1bHQgY2xhc3NmaWxlIHJlYWRlciwgYWJsZSB0byBleHBvc2UgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2l2ZW4gY2xhc3NmaWxlCiAJICogYWNjb3JkaW5nIHRvIHRoZSBkZWNvZGluZyBmbGFnIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVhZGVyLgogCSAqIEFuc3dlciBudWxsIGlmIHRoZSBmaWxlIG5hbWVkIGZpbGVOYW1lIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgLmNsYXNzIGZpbGUuCi0JICogCisJICoKIAkgKiBUaGUgZGVjb2RpbmcgZmxhZ3MgYXJlIGRlc2NyaWJlZCBpbiBJQ2xhc3NGaWxlUmVhZGVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzZmlsZSB0aGUgY2xhc3NmaWxlIGVsZW1lbnQgdG8gaW50cm9zcGVjdAogCSAqIEBwYXJhbSBkZWNvZGluZ0ZsYWcgdGhlIGZsYWcgdXNlZCB0byBkZWNvZGUgdGhlIGNsYXNzIGZpbGUgcmVhZGVyLgogCSAqIEByZXR1cm4gYSBkZWZhdWx0IGNsYXNzZmlsZSByZWFkZXIKLQkgKiAKKwkgKgogCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlcgogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzRmlsZVJlYWRlciBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKElDbGFzc0ZpbGUgY2xhc3NmaWxlLCBpbnQgZGVjb2RpbmdGbGFnKXsKQEAgLTIyNiw3ICsyMzIsNyBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKIAkJCQkJdHJ5IHsKLQkJCQkJCWluID0gKChJRmlsZSkgY2xhc3NmaWxlLmdldFJlc291cmNlKCkpLmdldENvbnRlbnRzKCk7CisJCQkJCQlpbiA9ICgoSUZpbGUpICgoSmF2YUVsZW1lbnQpIGNsYXNzZmlsZSkucmVzb3VyY2UoKSkuZ2V0Q29udGVudHMoKTsKIAkJCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKGluLCBkZWNvZGluZ0ZsYWcpOwogCQkJCQl9IGZpbmFsbHkgewogCQkJCQkJaWYgKGluICE9IG51bGwpCkBAIC0yNDgsMTMgKzI1NCwxMyBAQAogCSAqIENyZWF0ZSBhIGRlZmF1bHQgY2xhc3NmaWxlIHJlYWRlciwgYWJsZSB0byBleHBvc2UgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2l2ZW4gY2xhc3NmaWxlCiAJICogYWNjb3JkaW5nIHRvIHRoZSBkZWNvZGluZyBmbGFnIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVhZGVyLgogCSAqIEFuc3dlciBudWxsIGlmIHRoZSBpbnB1dCBzdHJlYW0gY29udGVudHMgY2Fubm90IGJlIHJldHJpZXZlZAotCSAqIAorCSAqCiAJICogVGhlIGRlY29kaW5nIGZsYWdzIGFyZSBkZXNjcmliZWQgaW4gSUNsYXNzRmlsZVJlYWRlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdHJlYW0gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0byByZWFkCiAJICogQHBhcmFtIGRlY29kaW5nRmxhZyB0aGUgZmxhZyB1c2VkIHRvIGRlY29kZSB0aGUgY2xhc3MgZmlsZSByZWFkZXIuCiAJICogQHJldHVybiBhIGRlZmF1bHQgY2xhc3NmaWxlIHJlYWRlcgotCSAqIAorCSAqCiAJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyCiAJICogQHNpbmNlIDMuMgogCSAqLwpAQCAtMjY3LDE5ICsyNzMsMTkgQEAKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyLCBhYmxlIHRvIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUKIAkgKiBhY2NvcmRpbmcgdG8gdGhlIGRlY29kaW5nIGZsYWcgdXNlZCB0byBpbml0aWFsaXplIHRoZSByZWFkZXIuCiAJICogQW5zd2VyIG51bGwgaWYgdGhlIGZpbGUgbmFtZWQgZmlsZU5hbWUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAuY2xhc3MgZmlsZS4KIAkgKiBUaGUgZmlsZU5hbWUgaGFzIHRvIGJlIGFuIGFic29sdXRlIE9TIHBhdGggdG8gdGhlIGdpdmVuIC5jbGFzcyBmaWxlLgotCSAqIAorCSAqCiAJICogVGhlIGRlY29kaW5nIGZsYWdzIGFyZSBkZXNjcmliZWQgaW4gSUNsYXNzRmlsZVJlYWRlci4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSByZWFkCiAJICogQHBhcmFtIGRlY29kaW5nRmxhZyB0aGUgZmxhZyB1c2VkIHRvIGRlY29kZSB0aGUgY2xhc3MgZmlsZSByZWFkZXIuCiAJICogQHJldHVybiBhIGRlZmF1bHQgY2xhc3NmaWxlIHJlYWRlcgotCSAqIAorCSAqCiAJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyCiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlUmVhZGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoU3RyaW5nIGZpbGVOYW1lLCBpbnQgZGVjb2RpbmdGbGFnKXsKQEAgLTI5OCw5ICszMDQsOSBAQAogCSAqIEFuc3dlciBudWxsIGlmIHRoZSBmaWxlIG5hbWVkIHppcEZpbGVOYW1lIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgemlwIGZpbGUgb3IgaWYgdGhlIHppcEVudHJ5TmFtZQogCSAqIGlzIG5vdCBhIHZhbGlkIGVudHJ5IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgemlwIGZpbGUgb3IgaWYgdGhlIGJ5dGVzIGRvbid0IHJlcHJlc2VudCBhIHZhbGlkCiAJICogLmNsYXNzIGZpbGUgYWNjb3JkaW5nIHRvIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBUaGUgZGVjb2RpbmcgZmxhZ3MgYXJlIGRlc2NyaWJlZCBpbiBJQ2xhc3NGaWxlUmVhZGVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHppcEZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSB6aXAgZmlsZQogCSAqIEBwYXJhbSB6aXBFbnRyeU5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IGluIHRoZSB6aXAgZmlsZSB0byBiZSByZWFkCiAJICogQHBhcmFtIGRlY29kaW5nRmxhZyB0aGUgZmxhZyB1c2VkIHRvIGRlY29kZSB0aGUgY2xhc3MgZmlsZSByZWFkZXIuCkBAIC0zMzcsMzEgKzM0MywyOSBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdC1pbiBjb2RlIGZvcm1hdHRlci4gQSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29udHJpYnV0ZWQgdmlhIHRoZSAKLQkgKiBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVGb3JtYXR0ZXIiLiBJZiB1bmFibGUgdG8gZmluZCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uLCB0aGUgZmFjdG9yeSB3aWxsIAotCSAqIGRlZmF1bHQgdG8gdXNpbmcgdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuCi0JICogCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvZGUgZm9ybWF0dGVyLgorCSAqCiAJICogQHBhcmFtIG9wdGlvbnMgLSB0aGUgb3B0aW9ucyBtYXAgdG8gdXNlIGZvciBmb3JtYXR0aW5nIHdpdGggdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuIFJlY29nbml6ZWQgb3B0aW9ucwotCSAqIAlhcmUgZG9jdW1lbnRlZCBvbiA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPi4gSWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHVzZSAKKwkgKiAJYXJlIGRvY3VtZW50ZWQgb24gPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKTwvY29kZT4uIElmIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB1c2UKIAkgKiAJdGhlIGN1cnJlbnQgc2V0dGluZ3MgZnJvbSA8Y29kZT5KYXZhQ29yZSNnZXRPcHRpb25zPC9jb2RlPi4KIAkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdC1pbiBjb2RlIGZvcm1hdHRlcgogCSAqIEBzZWUgSUNvZGVGb3JtYXR0ZXIKIAkgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoKQogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0T3B0aW9ucygpCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlQ29kZUZvcm1hdHRlcihNYXApfSBpbnN0ZWFkCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlQ29kZUZvcm1hdHRlcihNYXApfSBpbnN0ZWFkIGJ1dCBub3RlIHRoZSBkaWZmZXJlbnQgb3B0aW9ucwogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNvZGVGb3JtYXR0ZXIgY3JlYXRlRGVmYXVsdENvZGVGb3JtYXR0ZXIoTWFwIG9wdGlvbnMpewogCQlpZiAob3B0aW9ucyA9PSBudWxsKSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwogCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIub2xkLkNvZGVGb3JtYXR0ZXIob3B0aW9ucyk7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlIGEgc2Nhbm5lciwgaW5kaWNhdGluZyB0aGUgbGV2ZWwgb2YgZGV0YWlsIHJlcXVlc3RlZCBmb3IgdG9rZW5pemluZy4gVGhlIHNjYW5uZXIgY2FuIHRoZW4gYmUKIAkgKiB1c2VkIHRvIHRva2VuaXplIHNvbWUgc291cmNlIGluIGEgSmF2YSBhd2FyZSB3YXkuCiAJICogSGVyZSBpcyBhIHR5cGljYWwgc2Nhbm5pbmcgbG9vcDoKLQkgKiAKKwkgKgogCSAqIDxjb2RlPgogCSAqIDxwcmU+CiAJICogICBJU2Nhbm5lciBzY2FubmVyID0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CkBAIC0zNzMsMzYgKzM3Nyw0OCBAQAogCSAqICAgfQogCSAqIDwvcHJlPgogCSAqIDwvY29kZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgc2Nhbm5lciB3aWxsIHRvbGVyYXRlIHVudGVybWluYXRlZCBsaW5lIGNvbW1lbnRzIChtaXNzaW5nIGxpbmUgc2VwYXJhdG9yKS4gSXQgY2FuIGJlIG1hZGUgc3RyaWN0ZXIKLQkgKiBieSB1c2luZyBBUEkgd2l0aCBleHRyYSBib29sZWFuIHBhcmFtZXRlciAoPGNvZGU+c3RyaWN0Q29tbWVudE1vZGU8L2NvZGU+KS4KLQkgKiA8cD4KKwkgKgorCSAqIDxwPkJ5IGRlZmF1bHQgdGhlIGNvbXBsaWFuY2UgdXNlZCB0byBjcmVhdGUgdGhlIHNjYW5uZXIgaXMgdGhlIHdvcmtzcGFjZSdzIGNvbXBsaWFuY2Ugd2hlbiBydW5uaW5nIGluc2lkZSB0aGUgSURFCisJICogb3IgMS40IGlmIHJ1bm5pbmcgZnJvbSBvdXRzaWRlIG9mIGEgaGVhZGxlc3MgZWNsaXBzZS4KKwkgKiA8L3A+CisJICoKIAkgKiBAcGFyYW0gdG9rZW5pemVDb21tZW50cyBpZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBjb21tZW50cyB3aWxsIGJlIHNpbGVudGx5IGNvbnN1bWVkCiAJICogQHBhcmFtIHRva2VuaXplV2hpdGVTcGFjZSBpZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB3aGl0ZSBzcGFjZXMgd2lsbCBiZSBzaWxlbnRseSBjb25zdW1lZCwKIAkgKiBAcGFyYW0gYXNzZXJ0TW9kZSBpZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBvY2N1cnJlbmNlcyBvZiAnYXNzZXJ0JyB3aWxsIGJlIHJlcG9ydGVkIGFzIGlkZW50aWZpZXJzCi0JICogKDxjb2RlPklUZXJtaW5hbFN5bWJvbHMjVG9rZW5OYW1lSWRlbnRpZmllcjwvY29kZT4pLCB3aGVyZWFzIGlmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgaXQKLQkgKiB3b3VsZCByZXBvcnQgYXNzZXJ0IGtleXdvcmRzICg8Y29kZT5JVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZWFzc2VydDwvY29kZT4pLiBKYXZhIDEuNCBoYXMgaW50cm9kdWNlZAorCSAqICh7QGxpbmsgSVRlcm1pbmFsU3ltYm9scyNUb2tlbk5hbWVJZGVudGlmaWVyfSksIHdoZXJlYXMgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBpdAorCSAqIHdvdWxkIHJlcG9ydCBhc3NlcnQga2V5d29yZHMgKHtAbGluayBJVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZWFzc2VydH0pLiBKYXZhIDEuNCBoYXMgaW50cm9kdWNlZAogCSAqIGEgbmV3ICdhc3NlcnQnIGtleXdvcmQuCi0JICogQHBhcmFtIHJlY29yZExpbmVTZXBhcmF0b3IgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgc2Nhbm5lciB3aWxsIHJlY29yZCBwb3NpdGlvbnMgb2YgZW5jb3VudGVyZWQgbGluZSAKKwkgKiBAcGFyYW0gcmVjb3JkTGluZVNlcGFyYXRvciBpZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBzY2FubmVyIHdpbGwgcmVjb3JkIHBvc2l0aW9ucyBvZiBlbmNvdW50ZXJlZCBsaW5lCiAJICogc2VwYXJhdG9yIGVuZHMuIEluIGNhc2Ugb2YgbXVsdGktY2hhcmFjdGVyIGxpbmUgc2VwYXJhdG9ycywgdGhlIGxhc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQuIFRoZXNlIHBvc2l0aW9ucwotCSAqIGNhbiB0aGVuIGJlIGV4dHJhY3RlZCB1c2luZyA8Y29kZT5JU2Nhbm5lciNnZXRMaW5lRW5kczwvY29kZT4uIE9ubHkgbm9uLXVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUgCisJICogY2FuIHRoZW4gYmUgZXh0cmFjdGVkIHVzaW5nIHtAbGluayBJU2Nhbm5lciNnZXRMaW5lRW5kcygpfS4gT25seSBub24tdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIGFyZQogCSAqIGNvbnNpZGVyZWQgYXMgdmFsaWQgbGluZSBzZXBhcmF0b3JzLgogICAJICogQHJldHVybiBhIHNjYW5uZXIKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklTY2FubmVyCisJICogQHNlZSAjY3JlYXRlU2Nhbm5lcihib29sZWFuLCBib29sZWFuLCBib29sZWFuLCBTdHJpbmcsIFN0cmluZykKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTY2FubmVyIGNyZWF0ZVNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgYm9vbGVhbiBhc3NlcnRNb2RlLCBib29sZWFuIHJlY29yZExpbmVTZXBhcmF0b3IpewotCi0JCVB1YmxpY1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBQdWJsaWNTY2FubmVyKHRva2VuaXplQ29tbWVudHMsIHRva2VuaXplV2hpdGVTcGFjZSwgZmFsc2UvKm5scyovLCBhc3NlcnRNb2RlID8gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNCA6IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMvKnNvdXJjZUxldmVsKi8sIG51bGwvKnRhc2tUYWdzKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8sIHRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQkvLyB1c2UgZGVmYXVsdCB3b3Jrc3BhY2UgY29tcGxpYW5jZQorCQlsb25nIGNvbXBsaWFuY2VMZXZlbFZhbHVlID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKSk7CisJCWlmIChjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9PSAwKSBjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7IC8vIGZhdWx0LXRvbGVyYW5jZQorCQlQdWJsaWNTY2FubmVyIHNjYW5uZXIgPQorCQkJbmV3IFB1YmxpY1NjYW5uZXIoCisJCQkJdG9rZW5pemVDb21tZW50cywKKwkJCQl0b2tlbml6ZVdoaXRlU3BhY2UsCisJCQkJZmFsc2UvKm5scyovLAorCQkJCWFzc2VydE1vZGUgPyBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80IDogQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMy8qc291cmNlTGV2ZWwqLywKKwkJCQljb21wbGlhbmNlTGV2ZWxWYWx1ZSwKKwkJCQludWxsLyp0YXNrVGFncyovLAorCQkJCW51bGwvKnRhc2tQcmlvcml0aWVzKi8sCisJCQkJdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiAJCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHJlY29yZExpbmVTZXBhcmF0b3I7CiAJCXJldHVybiBzY2FubmVyOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZSBhIHNjYW5uZXIsIGluZGljYXRpbmcgdGhlIGxldmVsIG9mIGRldGFpbCByZXF1ZXN0ZWQgZm9yIHRva2VuaXppbmcuIFRoZSBzY2FubmVyIGNhbiB0aGVuIGJlCiAJICogdXNlZCB0byB0b2tlbml6ZSBzb21lIHNvdXJjZSBpbiBhIEphdmEgYXdhcmUgd2F5LgogCSAqIEhlcmUgaXMgYSB0eXBpY2FsIHNjYW5uaW5nIGxvb3A6Ci0JICogCisJICoKIAkgKiA8Y29kZT4KIAkgKiA8cHJlPgogCSAqICAgSVNjYW5uZXIgc2Nhbm5lciA9IFRvb2xGYWN0b3J5LmNyZWF0ZVNjYW5uZXIoZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwpAQCAtNDE0LDMwICs0MzAsNDIgQEAKIAkgKiAgIH0KIAkgKiA8L3ByZT4KIAkgKiA8L2NvZGU+Ci0JICogCi0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIHNjYW5uZXIgd2lsbCB0b2xlcmF0ZSB1bnRlcm1pbmF0ZWQgbGluZSBjb21tZW50cyAobWlzc2luZyBsaW5lIHNlcGFyYXRvcikuIEl0IGNhbiBiZSBtYWRlIHN0cmljdGVyCi0JICogYnkgdXNpbmcgQVBJIHdpdGggZXh0cmEgYm9vbGVhbiBwYXJhbWV0ZXIgKDxjb2RlPnN0cmljdENvbW1lbnRNb2RlPC9jb2RlPikuCi0JICogPHA+CisJICoKKwkgKiA8cD5CeSBkZWZhdWx0IHRoZSBjb21wbGlhbmNlIHVzZWQgdG8gY3JlYXRlIHRoZSBzY2FubmVyIGlzIHRoZSB3b3Jrc3BhY2UncyBjb21wbGlhbmNlIHdoZW4gcnVubmluZyBpbnNpZGUgdGhlIElERQorCSAqIG9yIDEuNCBpZiBydW5uaW5nIGZyb20gb3V0c2lkZSBvZiBhIGhlYWRsZXNzIGVjbGlwc2UuCisJICogPC9wPgorCSAqCiAJICogQHBhcmFtIHRva2VuaXplQ29tbWVudHMgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgY29tbWVudHMgd2lsbCBiZSBzaWxlbnRseSBjb25zdW1lZAogCSAqIEBwYXJhbSB0b2tlbml6ZVdoaXRlU3BhY2UgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgd2hpdGUgc3BhY2VzIHdpbGwgYmUgc2lsZW50bHkgY29uc3VtZWQsCi0JICogQHBhcmFtIHJlY29yZExpbmVTZXBhcmF0b3IgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgc2Nhbm5lciB3aWxsIHJlY29yZCBwb3NpdGlvbnMgb2YgZW5jb3VudGVyZWQgbGluZSAKKwkgKiBAcGFyYW0gcmVjb3JkTGluZVNlcGFyYXRvciBpZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBzY2FubmVyIHdpbGwgcmVjb3JkIHBvc2l0aW9ucyBvZiBlbmNvdW50ZXJlZCBsaW5lCiAJICogc2VwYXJhdG9yIGVuZHMuIEluIGNhc2Ugb2YgbXVsdGktY2hhcmFjdGVyIGxpbmUgc2VwYXJhdG9ycywgdGhlIGxhc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQuIFRoZXNlIHBvc2l0aW9ucwotCSAqIGNhbiB0aGVuIGJlIGV4dHJhY3RlZCB1c2luZyA8Y29kZT5JU2Nhbm5lciNnZXRMaW5lRW5kczwvY29kZT4uIE9ubHkgbm9uLXVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUgCisJICogY2FuIHRoZW4gYmUgZXh0cmFjdGVkIHVzaW5nIHtAbGluayBJU2Nhbm5lciNnZXRMaW5lRW5kcygpfS4gT25seSBub24tdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIGFyZQogCSAqIGNvbnNpZGVyZWQgYXMgdmFsaWQgbGluZSBzZXBhcmF0b3JzLgogCSAqIEBwYXJhbSBzb3VyY2VMZXZlbCBpZiBzZXQgdG8gPGNvZGU+JnF1b3Q7MS4zJnF1b3Q7PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiwgb2NjdXJyZW5jZXMgb2YgJ2Fzc2VydCcgd2lsbCBiZSByZXBvcnRlZCBhcyBpZGVudGlmaWVycwotCSAqICg8Y29kZT5JVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZUlkZW50aWZpZXI8L2NvZGU+KSwgd2hlcmVhcyBpZiBzZXQgdG8gPGNvZGU+JnF1b3Q7MS40JnF1b3Q7PC9jb2RlPiwgaXQKLQkgKiB3b3VsZCByZXBvcnQgYXNzZXJ0IGtleXdvcmRzICg8Y29kZT5JVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZWFzc2VydDwvY29kZT4pLiBKYXZhIDEuNCBoYXMgaW50cm9kdWNlZAorCSAqICh7QGxpbmsgSVRlcm1pbmFsU3ltYm9scyNUb2tlbk5hbWVJZGVudGlmaWVyfSksIHdoZXJlYXMgaWYgc2V0IHRvIDxjb2RlPiZxdW90OzEuNCZxdW90OzwvY29kZT4sIGl0CisJICogd291bGQgcmVwb3J0IGFzc2VydCBrZXl3b3JkcyAoe0BsaW5rIElUZXJtaW5hbFN5bWJvbHMjVG9rZW5OYW1lYXNzZXJ0fSkuIEphdmEgMS40IGhhcyBpbnRyb2R1Y2VkCiAJICogYSBuZXcgJ2Fzc2VydCcga2V5d29yZC4KLSAgCSAqIEByZXR1cm4gYSBzY2FubmVyCisJICogQHJldHVybiBhIHNjYW5uZXIKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklTY2FubmVyCi0gICAgICogQHNpbmNlIDMuMAorCSAqIEBzZWUgI2NyZWF0ZVNjYW5uZXIoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbiwgU3RyaW5nLCBTdHJpbmcpCisJICogQHNpbmNlIDMuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVNjYW5uZXIgY3JlYXRlU2Nhbm5lcihib29sZWFuIHRva2VuaXplQ29tbWVudHMsIGJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlLCBib29sZWFuIHJlY29yZExpbmVTZXBhcmF0b3IsIFN0cmluZyBzb3VyY2VMZXZlbCkgewotCQlQdWJsaWNTY2FubmVyIHNjYW5uZXIgPSBudWxsOwotCQlsb25nIGxldmVsID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKHNvdXJjZUxldmVsKTsKLQkJaWYgKGxldmVsID09IDApIGxldmVsID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMzsgLy8gZmF1bHQtdG9sZXJhbmNlCi0JCXNjYW5uZXIgPSBuZXcgUHVibGljU2Nhbm5lcih0b2tlbml6ZUNvbW1lbnRzLCB0b2tlbml6ZVdoaXRlU3BhY2UsIGZhbHNlLypubHMqLyxsZXZlbCAvKnNvdXJjZUxldmVsKi8sIG51bGwvKnRhc2tUYWdzKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8sIHRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOworCQkvLyB1c2UgZGVmYXVsdCB3b3Jrc3BhY2UgY29tcGxpYW5jZQorCQlsb25nIGNvbXBsaWFuY2VMZXZlbFZhbHVlID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKSk7CisJCWlmIChjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9PSAwKSBjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzQ7IC8vIGZhdWx0LXRvbGVyYW5jZQorCQlsb25nIHNvdXJjZUxldmVsVmFsdWUgPSBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwoc291cmNlTGV2ZWwpOworCQlpZiAoc291cmNlTGV2ZWxWYWx1ZSA9PSAwKSBzb3VyY2VMZXZlbFZhbHVlID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMzsgLy8gZmF1bHQtdG9sZXJhbmNlCisJCVB1YmxpY1NjYW5uZXIgc2Nhbm5lciA9CisJCQluZXcgUHVibGljU2Nhbm5lcigKKwkJCQl0b2tlbml6ZUNvbW1lbnRzLAorCQkJCXRva2VuaXplV2hpdGVTcGFjZSwKKwkJCQlmYWxzZS8qbmxzKi8sCisJCQkJc291cmNlTGV2ZWxWYWx1ZSAvKnNvdXJjZUxldmVsKi8sCisJCQkJY29tcGxpYW5jZUxldmVsVmFsdWUsCisJCQkJbnVsbC8qdGFza1RhZ3MqLywKKwkJCQludWxsLyp0YXNrUHJpb3JpdGllcyovLAorCQkJCXRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOwogCQlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSByZWNvcmRMaW5lU2VwYXJhdG9yOwogCQlyZXR1cm4gc2Nhbm5lcjsKIAl9CkBAIC00NDYsNyArNDc0LDcgQEAKIAkgKiBDcmVhdGUgYSBzY2FubmVyLCBpbmRpY2F0aW5nIHRoZSBsZXZlbCBvZiBkZXRhaWwgcmVxdWVzdGVkIGZvciB0b2tlbml6aW5nLiBUaGUgc2Nhbm5lciBjYW4gdGhlbiBiZQogCSAqIHVzZWQgdG8gdG9rZW5pemUgc29tZSBzb3VyY2UgaW4gYSBKYXZhIGF3YXJlIHdheS4KIAkgKiBIZXJlIGlzIGEgdHlwaWNhbCBzY2FubmluZyBsb29wOgotCSAqIAorCSAqCiAJICogPGNvZGU+CiAJICogPHByZT4KIAkgKiAgIElTY2FubmVyIHNjYW5uZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVTY2FubmVyKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKQEAgLTQ1OCwzNCArNDg2LDMwIEBACiAJICogICB9CiAJICogPC9wcmU+CiAJICogPC9jb2RlPgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBzY2FubmVyIHdpbGwgdG9sZXJhdGUgdW50ZXJtaW5hdGVkIGxpbmUgY29tbWVudHMgKG1pc3NpbmcgbGluZSBzZXBhcmF0b3IpLiBJdCBjYW4gYmUgbWFkZSBzdHJpY3RlcgotCSAqIGJ5IHVzaW5nIEFQSSB3aXRoIGV4dHJhIGJvb2xlYW4gcGFyYW1ldGVyICg8Y29kZT5zdHJpY3RDb21tZW50TW9kZTwvY29kZT4pLgotCSAqIDxwPgorCSAqCiAJICogQHBhcmFtIHRva2VuaXplQ29tbWVudHMgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgY29tbWVudHMgd2lsbCBiZSBzaWxlbnRseSBjb25zdW1lZAogCSAqIEBwYXJhbSB0b2tlbml6ZVdoaXRlU3BhY2UgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgd2hpdGUgc3BhY2VzIHdpbGwgYmUgc2lsZW50bHkgY29uc3VtZWQsCi0JICogQHBhcmFtIHJlY29yZExpbmVTZXBhcmF0b3IgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgc2Nhbm5lciB3aWxsIHJlY29yZCBwb3NpdGlvbnMgb2YgZW5jb3VudGVyZWQgbGluZSAKKwkgKiBAcGFyYW0gcmVjb3JkTGluZVNlcGFyYXRvciBpZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBzY2FubmVyIHdpbGwgcmVjb3JkIHBvc2l0aW9ucyBvZiBlbmNvdW50ZXJlZCBsaW5lCiAJICogc2VwYXJhdG9yIGVuZHMuIEluIGNhc2Ugb2YgbXVsdGktY2hhcmFjdGVyIGxpbmUgc2VwYXJhdG9ycywgdGhlIGxhc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQuIFRoZXNlIHBvc2l0aW9ucwotCSAqIGNhbiB0aGVuIGJlIGV4dHJhY3RlZCB1c2luZyA8Y29kZT5JU2Nhbm5lciNnZXRMaW5lRW5kczwvY29kZT4uIE9ubHkgbm9uLXVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUgCisJICogY2FuIHRoZW4gYmUgZXh0cmFjdGVkIHVzaW5nIHtAbGluayBJU2Nhbm5lciNnZXRMaW5lRW5kcygpfS4gT25seSBub24tdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIGFyZQogCSAqIGNvbnNpZGVyZWQgYXMgdmFsaWQgbGluZSBzZXBhcmF0b3JzLgogCSAqIEBwYXJhbSBzb3VyY2VMZXZlbCBpZiBzZXQgdG8gPGNvZGU+JnF1b3Q7MS4zJnF1b3Q7PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiwgb2NjdXJyZW5jZXMgb2YgJ2Fzc2VydCcgd2lsbCBiZSByZXBvcnRlZCBhcyBpZGVudGlmaWVycwotCSAqICg8Y29kZT5JVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZUlkZW50aWZpZXI8L2NvZGU+KSwgd2hlcmVhcyBpZiBzZXQgdG8gPGNvZGU+JnF1b3Q7MS40JnF1b3Q7PC9jb2RlPiwgaXQKLQkgKiB3b3VsZCByZXBvcnQgYXNzZXJ0IGtleXdvcmRzICg8Y29kZT5JVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZWFzc2VydDwvY29kZT4pLiBKYXZhIDEuNCBoYXMgaW50cm9kdWNlZAorCSAqICh7QGxpbmsgSVRlcm1pbmFsU3ltYm9scyNUb2tlbk5hbWVJZGVudGlmaWVyfSksIHdoZXJlYXMgaWYgc2V0IHRvIDxjb2RlPiZxdW90OzEuNCZxdW90OzwvY29kZT4sIGl0CisJICogd291bGQgcmVwb3J0IGFzc2VydCBrZXl3b3JkcyAoe0BsaW5rIElUZXJtaW5hbFN5bWJvbHMjVG9rZW5OYW1lYXNzZXJ0fSkuIEphdmEgMS40IGhhcyBpbnRyb2R1Y2VkCiAJICogYSBuZXcgJ2Fzc2VydCcga2V5d29yZC4KIAkgKiBAcGFyYW0gY29tcGxpYW5jZUxldmVsIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBVbmljb2RlIDQuMCBjaGFyYWN0ZXIgc2V0cy4gaWYgc2V0IHRvIDEuNSBvciBhYm92ZSwKIAkgKiB0aGUgVW5pY29kZSA0LjAgaXMgc3VwcG9ydGUsIG90aGVyd2lzZSBVbmljb2RlIDMuMCBpcyBzdXBwb3J0ZWQuCi0gIAkgKiBAcmV0dXJuIGEgc2Nhbm5lcgorCSAqIEByZXR1cm4gYSBzY2FubmVyCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcgogCSAqCi0gICAgICogQHNpbmNlIDMuMQorCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElTY2FubmVyIGNyZWF0ZVNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yLCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwpIHsKIAkJUHVibGljU2Nhbm5lciBzY2FubmVyID0gbnVsbDsKIAkJbG9uZyBzb3VyY2VMZXZlbFZhbHVlID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKHNvdXJjZUxldmVsKTsKIAkJaWYgKHNvdXJjZUxldmVsVmFsdWUgPT0gMCkgc291cmNlTGV2ZWxWYWx1ZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzM7IC8vIGZhdWx0LXRvbGVyYW5jZQogCQlsb25nIGNvbXBsaWFuY2VMZXZlbFZhbHVlID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKGNvbXBsaWFuY2VMZXZlbCk7Ci0JCWlmIChjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9PSAwKSBjb21wbGlhbmNlTGV2ZWxWYWx1ZSA9IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzM7IC8vIGZhdWx0LXRvbGVyYW5jZQorCQlpZiAoY29tcGxpYW5jZUxldmVsVmFsdWUgPT0gMCkgY29tcGxpYW5jZUxldmVsVmFsdWUgPSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV80OyAvLyBmYXVsdC10b2xlcmFuY2UKIAkJc2Nhbm5lciA9IG5ldyBQdWJsaWNTY2FubmVyKHRva2VuaXplQ29tbWVudHMsIHRva2VuaXplV2hpdGVTcGFjZSwgZmFsc2UvKm5scyovLHNvdXJjZUxldmVsVmFsdWUgLypzb3VyY2VMZXZlbCovLCBjb21wbGlhbmNlTGV2ZWxWYWx1ZSwgbnVsbC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiAJCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHJlY29yZExpbmVTZXBhcmF0b3I7CiAJCXJldHVybiBzY2FubmVyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvV29ya2luZ0NvcHlPd25lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvV29ya2luZ0NvcHlPd25lci5qYXZhCmluZGV4IGU5YWMyNjIuLjQ2ZmQxYjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1dvcmtpbmdDb3B5T3duZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Xb3JraW5nQ29weU93bmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTIgKzExLDEzIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CdWZmZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWZhdWx0V29ya2luZ0NvcHlPd25lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5FeHRlcm5hbEphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnRSb290OwogCiAvKioKICAqIFRoZSBvd25lciBvZiBhbiB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gaGFuZGxlIGluIHdvcmtpbmcgY29weSBtb2RlLgpAQCAtODgsNiArODksODAgQEAKIAlwdWJsaWMgSVByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcihJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5KSB7CiAJCXJldHVybiBudWxsOwogCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBkZWZpbmVzIHRoZSBnaXZlbiB0eXBlIGluCisJICogdGhlIGdpdmVuIHBhY2thZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIHVua25vd24gdG8gdGhpcworCSAqIG93bmVyLgorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIG5vcm1hbCBsb29rdXAgKGkuZS4gYmVmb3JlIGxvb2tpbmcgCisJICogYXQgdGhlIHByb2plY3QncyBjbGFzc3BhdGggYW5kIGJlZm9yZSBsb29raW5nIGF0IHRoZSB3b3JraW5nIGNvcGllcyBvZiB0aGlzIAorCSAqIG93bmVyLik8L3A+CisJICogPHA+VGhpcyBhbGxvd3MgdG8gcHJvdmlkZSB0eXBlcyB0aGF0IGFyZSBub3Qgbm9ybWFsbHkgYXZhaWxhYmxlLCBvciB0byBoaWRlIAorCSAqIHR5cGVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgYXZhaWxhYmxlIGJ5IHJldHVybmluZyBhbiBlbXB0eSBzb3VyY2UgZm9yIAorCSAqIHRoZSBnaXZlbiB0eXBlIGFuZCBwYWNrYWdlLjwvcD4KKwkgKiA8cD5FeGFtcGxlIG9mIHVzZToKKwkgKiA8cHJlPgorCSAqIFdvcmtpbmdDb3B5T3duZXIgb3duZXIgPSBuZXcgV29ya2luZ0NvcHlPd25lcigpIHsKKwkgKiAgIHB1YmxpYyBTdHJpbmcgZmluZFNvdXJjZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSkgeworCSAqICAgICBpZiAoInRvLmJlIi5lcXVhbHMocGFja2FnZU5hbWUpICYmICJHZW5lcmF0ZWQiLmVxdWFscyh0eXBlTmFtZSkpIHsKKwkgKiAgICAgICByZXR1cm4KKwkgKiAgICAgICAgICJwYWNrYWdlIHRvLmJlO1xuIiArCisJICogICAgICAgICAicHVibGljIGNsYXNzIEdlbmVyYXRlZCB7XG4iICsKKwkgKiAgICAgICAgICJ9IjsKKwkgKiAgICAgfQorCSAqICAgICByZXR1cm4gc3VwZXIuZmluZFNvdXJjZSh0eXBlTmFtZSwgcGFja2FnZU5hbWUpOworCSAqICAgfQorCSAqICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZ1tdIHBrZykgeworCSAqICAgICBzd2l0Y2ggKHBrZy5sZW5ndGgpIHsKKwkgKiAgICAgY2FzZSAxOgorCSAqICAgICAgIHJldHVybiAidG8iLmVxdWFscyhwa2dbMF0pOworCSAqICAgICBjYXNlIDI6CisJICogICAgICAgcmV0dXJuICJ0byIuZXF1YWxzKHBrZ1swXSkgJiYgImJlIi5lcXVhbHMocGtnWzFdKTsKKwkgKiAgICAgfQorCSAqICAgICByZXR1cm4gZmFsc2U7CisJICogICB9CisJICogfTsKKwkgKiAvLyBXb3JraW5nIGNvcHkgb24gWC5qYXZhIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50czoKKwkgKiAvLyAgICBwdWJsaWMgY2xhc3MgWCBleHRlbmRzIHRvLmJlLkdlbmVyYXRlZCB7CisJICogLy8gICAgfQorCSAqIElDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSAuLi4gCisJICogQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCSAqIHBhcnNlci5zZXRTb3VyY2Uod29ya2luZ0NvcHkpOworCSAqIHBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7CisJICogcGFyc2VyLnNldFdvcmtpbmdDb3B5T3duZXIob3duZXIpOworCSAqIENvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7CisJICogYXNzZXJ0IGN1LmdldFByb2JsZW1zKCkubGVuZ3RoID09IDA7CisJICogPC9wcmU+CisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIHR5cGUgdG8gbG9va3VwCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdHlwZQorCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGF0IGRlZmluZXMgdGhlIGdpdmVuIHR5cGUgaW4KKwkgKiB0aGUgZ2l2ZW4gcGFja2FnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHR5cGUgaXMgdW5rbm93bgorCSAqIEBzZWUgI2lzUGFja2FnZShTdHJpbmdbXSkKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIFN0cmluZyBmaW5kU291cmNlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2Ugc2VnbWVudHMgcmVwcmVzZW50IGEgcGFja2FnZS4KKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBub3JtYWwgbG9va3VwIChpLmUuIGJlZm9yZSBsb29raW5nIAorCSAqIGF0IHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIGFuZCBiZWZvcmUgbG9va2luZyBhdCB0aGUgd29ya2luZyBjb3BpZXMgb2YgdGhpcyAKKwkgKiBvd25lci4pPC9wPgorCSAqIDxwPlRoaXMgYWxsb3dzIHRvIHByb3ZpZGUgcGFja2FnZXMgdGhhdCBhcmUgbm90IG5vcm1hbGx5IGF2YWlsYWJsZS48L3A+CisJICogPHA+SWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLCB0aGVuIG5vcm1hbCBsb29rdXAgaXMgdXNlZCBvbiAKKwkgKiB0aGlzIHBhY2thZ2UuPC9wPgorCSAqIAorCSAqIEBwYXJhbSBwa2cgdGhlIHNlZ21lbnRzIG9mIGEgcGFja2FnZSB0byBsb29rdXAKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2Ugc2VnbWVudHMgcmVwcmVzZW50IGEgcGFja2FnZS4KKwkgKiBAc2VlICNmaW5kU291cmNlKFN0cmluZywgU3RyaW5nKQorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nW10gcGtnKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IHdvcmtpbmcgY29weSB3aXRoIHRoZSBnaXZlbiBuYW1lIHVzaW5nIHRoaXMgd29ya2luZyBjb3B5IG93bmVyIHRvCkBAIC0xMzUsNyArMjEwLDcgQEAKIAkgKi8KIAlwdWJsaWMgZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBuZXdXb3JraW5nQ29weShTdHJpbmcgbmFtZSwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlFeHRlcm5hbEphdmFQcm9qZWN0IHByb2plY3QgPSBuZXcgRXh0ZXJuYWxKYXZhUHJvamVjdChjbGFzc3BhdGgpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhcmVudCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChQYXRoLkVNUFRZKS5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7CisJCUlQYWNrYWdlRnJhZ21lbnQgcGFyZW50ID0gKChQYWNrYWdlRnJhZ21lbnRSb290KSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdC5nZXRQcm9qZWN0KCkpKS5nZXRQYWNrYWdlRnJhZ21lbnQoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTKTsKIAkJQ29tcGlsYXRpb25Vbml0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblVuaXQoKFBhY2thZ2VGcmFnbWVudCkgcGFyZW50LCBuYW1lLCB0aGlzKTsKIAkJcmVzdWx0LmJlY29tZVdvcmtpbmdDb3B5KHByb2JsZW1SZXF1ZXN0b3IsIG1vbml0b3IpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTgyLDcgKzI1Nyw3IEBACiAJICovCiAJcHVibGljIGZpbmFsIElDb21waWxhdGlvblVuaXQgbmV3V29ya2luZ0NvcHkoU3RyaW5nIG5hbWUsIElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJRXh0ZXJuYWxKYXZhUHJvamVjdCBwcm9qZWN0ID0gbmV3IEV4dGVybmFsSmF2YVByb2plY3QoY2xhc3NwYXRoKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYXJlbnQgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoUGF0aC5FTVBUWSkuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOworCQlJUGFja2FnZUZyYWdtZW50IHBhcmVudCA9ICgoUGFja2FnZUZyYWdtZW50Um9vdCkgcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0UHJvamVjdCgpKSkuZ2V0UGFja2FnZUZyYWdtZW50KENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUyk7CiAJCUNvbXBpbGF0aW9uVW5pdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KChQYWNrYWdlRnJhZ21lbnQpIHBhcmVudCwgbmFtZSwgdGhpcyk7CiAJCXJlc3VsdC5iZWNvbWVXb3JraW5nQ29weShnZXRQcm9ibGVtUmVxdWVzdG9yKHJlc3VsdCksIG1vbml0b3IpOwogCQlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvQnVpbGRDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9CdWlsZENvbnRleHQuamF2YQppbmRleCAyNGZhMjIzLi5hYmQ3MTE3IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9CdWlsZENvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9CdWlsZENvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDEzNSArNyw4OSBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkNvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5Tb3VyY2VGaWxlOwogCiAvKioKLSAqIFRoZSBjb250ZXh0IG9mIGEgYnVpbGQgZXZlbnQgdGhhdCBpcyBub3RpZmllZCB0byBpbnRlcmVzdGVkIGNvbXBpbGF0aW9uIAorICogVGhlIGNvbnRleHQgb2YgYSBidWlsZCBldmVudCB0aGF0IGlzIG5vdGlmaWVkIHRvIGludGVyZXN0ZWQgY29tcGlsYXRpb24KICAqIHBhcnRpY2lwYW50cyB3aGVuIHtAbGluayBDb21waWxhdGlvblBhcnRpY2lwYW50I2J1aWxkU3RhcnRpbmcoQnVpbGRDb250ZXh0W10sIGJvb2xlYW4pIGEgYnVpbGQgaXMgc3RhcnRpbmd9LAogICogb3IgdG8gYW5ub3RhdGlvbnMgcHJvY2Vzc29ycyB3aGVuIHtAbGluayBDb21waWxhdGlvblBhcnRpY2lwYW50I3Byb2Nlc3NBbm5vdGF0aW9ucyhCdWlsZENvbnRleHRbXSkgYSBzb3VyY2UgZmlsZSBoYXMgYW5ub3RhdGlvbnN9LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW5jaWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKICAqIEBzaW5jZSAzLjIKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwotcHVibGljIGNsYXNzIEJ1aWxkQ29udGV4dCBleHRlbmRzIENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQgewotCi0vKioKLSAqIENyZWF0ZXMgYSBidWlsZCBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuCi0gKiA8cD4KLSAqIFRoaXMgY29uc3RydWN0b3IgaXMgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgc291cmNlIGZpbGUgYmVpbmcgYnVpbHQKLSAqLwotcHVibGljIEJ1aWxkQ29udGV4dChTb3VyY2VGaWxlIHNvdXJjZUZpbGUpIHsKLQlzdXBlcihzb3VyY2VGaWxlKTsKLX0KK3B1YmxpYyBjbGFzcyBCdWlsZENvbnRleHQgewogCiAvKioKICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgotICogCisgKgogICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKICAqLwogcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKLQlyZXR1cm4gdGhpcy5zb3VyY2VGaWxlLmdldENvbnRlbnRzKCk7CisJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogfQogCiAvKioKICAqIFJldHVybnMgdGhlIDxjb2RlPklGaWxlPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSA8Y29kZT5JRmlsZTwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBjb21waWxhdGlvbiB1bml0CiAgKi8KIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCXJldHVybiB0aGlzLnNvdXJjZUZpbGUucmVzb3VyY2U7CisJcmV0dXJuIG51bGw7IC8vIGRlZmF1bHQgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgogfQogCiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBjb250YWluZWQgYW55IGFubm90YXRpb25zIHdoZW4gaXQgd2FzIGNvbXBpbGVkLgotICogCisgKgogICogTk9URTogVGhpcyBpcyBvbmx5IHZhbGlkIGR1cmluZyB7QGxpbmsgQ29tcGlsYXRpb25QYXJ0aWNpcGFudCNwcm9jZXNzQW5ub3RhdGlvbnMoQnVpbGRDb250ZXh0W10pfS4KLSAqIAorICoKICAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBjb250YWluZWQgYW55IGFubm90YXRpb25zIHdoZW4gaXQgd2FzIGNvbXBpbGVkCiAgKi8KIHB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb25zKCkgewotCXJldHVybiB0aGlzLmhhc0Fubm90YXRpb25zOyAvLyBvbmx5IHNldCBkdXJpbmcgcHJvY2Vzc0Fubm90YXRpb25zCisJcmV0dXJuIGZhbHNlOyAvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIH0KIAogLyoqCiAgKiBSZWNvcmQgdGhlIGFkZGVkL2NoYW5nZWQgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZC4KLSAqIAorICoKICAqIEBwYXJhbSBhZGRlZEdlbmVyYXRlZEZpbGVzIHRoZSBhZGRlZC9jaGFuZ2VkIGZpbGVzCiAgKi8KIHB1YmxpYyB2b2lkIHJlY29yZEFkZGVkR2VuZXJhdGVkRmlsZXMoSUZpbGVbXSBhZGRlZEdlbmVyYXRlZEZpbGVzKSB7Ci0JaW50IGxlbmd0aDIgPSBhZGRlZEdlbmVyYXRlZEZpbGVzLmxlbmd0aDsKLQlpZiAobGVuZ3RoMiA9PSAwKSByZXR1cm47Ci0KLQlpbnQgbGVuZ3RoMSA9IHRoaXMuYWRkZWRGaWxlcyA9PSBudWxsID8gMCA6IHRoaXMuYWRkZWRGaWxlcy5sZW5ndGg7Ci0JSUZpbGVbXSBtZXJnZWQgPSBuZXcgSUZpbGVbbGVuZ3RoMSArIGxlbmd0aDJdOwotCWlmIChsZW5ndGgxID4gMCkgLy8gYWx3YXlzIG1ha2UgYSBjb3B5IGV2ZW4gaWYgY3VycmVudGx5IGVtcHR5Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hZGRlZEZpbGVzLCAwLCBtZXJnZWQsIDAsIGxlbmd0aDEpOwotCVN5c3RlbS5hcnJheWNvcHkoYWRkZWRHZW5lcmF0ZWRGaWxlcywgMCwgbWVyZ2VkLCBsZW5ndGgxLCBsZW5ndGgyKTsKLQl0aGlzLmFkZGVkRmlsZXMgPSBtZXJnZWQ7CisJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiB9CiAKIC8qKgogICogUmVjb3JkIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGRlbGV0ZWQuCi0gKiAKKyAqCiAgKiBAcGFyYW0gZGVsZXRlZEdlbmVyYXRlZEZpbGVzIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgZGVsZXRlZAogICovCiBwdWJsaWMgdm9pZCByZWNvcmREZWxldGVkR2VuZXJhdGVkRmlsZXMoSUZpbGVbXSBkZWxldGVkR2VuZXJhdGVkRmlsZXMpIHsKLQlpbnQgbGVuZ3RoMiA9IGRlbGV0ZWRHZW5lcmF0ZWRGaWxlcy5sZW5ndGg7Ci0JaWYgKGxlbmd0aDIgPT0gMCkgcmV0dXJuOwotCi0JaW50IGxlbmd0aDEgPSB0aGlzLmRlbGV0ZWRGaWxlcyA9PSBudWxsID8gMCA6IHRoaXMuZGVsZXRlZEZpbGVzLmxlbmd0aDsKLQlJRmlsZVtdIG1lcmdlZCA9IG5ldyBJRmlsZVtsZW5ndGgxICsgbGVuZ3RoMl07Ci0JaWYgKGxlbmd0aDEgPiAwKSAvLyBhbHdheXMgbWFrZSBhIGNvcHkgZXZlbiBpZiBjdXJyZW50bHkgZW1wdHkKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmRlbGV0ZWRGaWxlcywgMCwgbWVyZ2VkLCAwLCBsZW5ndGgxKTsKLQlTeXN0ZW0uYXJyYXljb3B5KGRlbGV0ZWRHZW5lcmF0ZWRGaWxlcywgMCwgbWVyZ2VkLCBsZW5ndGgxLCBsZW5ndGgyKTsKLQl0aGlzLmRlbGV0ZWRGaWxlcyA9IG1lcmdlZDsKKwkvLyBkZWZhdWx0IG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb24KIH0KIAogLyoqCiAgKiBSZWNvcmQgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWVzIG9mIGFueSBuZXcgZGVwZW5kZW5jaWVzLCBlYWNoIG5hbWUgaXMgb2YgdGhlIGZvcm0gInAxLnAyLkEuQiIuCi0gKiAKKyAqCiAgKiBAcGFyYW0gdHlwZU5hbWVEZXBlbmRlbmNpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWVzIG9mIG5ldyBkZXBlbmRlbmNpZXMKICAqLwogcHVibGljIHZvaWQgcmVjb3JkRGVwZW5kZW5jaWVzKFN0cmluZ1tdIHR5cGVOYW1lRGVwZW5kZW5jaWVzKSB7Ci0JaW50IGxlbmd0aDIgPSB0eXBlTmFtZURlcGVuZGVuY2llcy5sZW5ndGg7Ci0JaWYgKGxlbmd0aDIgPT0gMCkgcmV0dXJuOwotCi0JaW50IGxlbmd0aDEgPSB0aGlzLmRlcGVuZGVuY2llcyA9PSBudWxsID8gMCA6IHRoaXMuZGVwZW5kZW5jaWVzLmxlbmd0aDsKLQlTdHJpbmdbXSBtZXJnZWQgPSBuZXcgU3RyaW5nW2xlbmd0aDEgKyBsZW5ndGgyXTsKLQlpZiAobGVuZ3RoMSA+IDApIC8vIGFsd2F5cyBtYWtlIGEgY29weSBldmVuIGlmIGN1cnJlbnRseSBlbXB0eQotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZGVwZW5kZW5jaWVzLCAwLCBtZXJnZWQsIDAsIGxlbmd0aDEpOwotCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWVEZXBlbmRlbmNpZXMsIDAsIG1lcmdlZCwgbGVuZ3RoMSwgbGVuZ3RoMik7Ci0JdGhpcy5kZXBlbmRlbmNpZXMgPSBtZXJnZWQ7CisJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiB9CiAKIC8qKgogICogUmVjb3JkIG5ldyBwcm9ibGVtcyB0byByZXBvcnQgYWdhaW5zdCB0aGlzIGNvbXBpbGF0aW9uVW5pdC4KICAqIE1hcmtlcnMgYXJlIHBlcnNpc3RlZCBmb3IgdGhlc2UgcHJvYmxlbXMgb25seSBmb3IgdGhlIGRlY2xhcmVkIG1hbmFnZWQgbWFya2VyIHR5cGUKICAqIChzZWUgdGhlICdjb21waWxhdGlvblBhcnRpY2lwYW50JyBleHRlbnNpb24gcG9pbnQpLgotICogCisgKgogICogQHBhcmFtIG5ld1Byb2JsZW1zIHRoZSBwcm9ibGVtcyB0byByZXBvcnQKICAqLwogcHVibGljIHZvaWQgcmVjb3JkTmV3UHJvYmxlbXMoQ2F0ZWdvcml6ZWRQcm9ibGVtW10gbmV3UHJvYmxlbXMpIHsKLQlpbnQgbGVuZ3RoMiA9IG5ld1Byb2JsZW1zLmxlbmd0aDsKLQlpZiAobGVuZ3RoMiA9PSAwKSByZXR1cm47Ci0KLQlpbnQgbGVuZ3RoMSA9IHRoaXMucHJvYmxlbXMgPT0gbnVsbCA/IDAgOiB0aGlzLnByb2JsZW1zLmxlbmd0aDsKLQlDYXRlZ29yaXplZFByb2JsZW1bXSBtZXJnZWQgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9ibGVtW2xlbmd0aDEgKyBsZW5ndGgyXTsKLQlpZiAobGVuZ3RoMSA+IDApIC8vIGFsd2F5cyBtYWtlIGEgY29weSBldmVuIGlmIGN1cnJlbnRseSBlbXB0eQotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucHJvYmxlbXMsIDAsIG1lcmdlZCwgMCwgbGVuZ3RoMSk7CQotCVN5c3RlbS5hcnJheWNvcHkobmV3UHJvYmxlbXMsIDAsIG1lcmdlZCwgbGVuZ3RoMSwgbGVuZ3RoMik7CQotCXRoaXMucHJvYmxlbXMgPSBtZXJnZWQ7CisJLy8gZGVmYXVsdCBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCiB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NvbXBpbGF0aW9uUGFydGljaXBhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NvbXBpbGF0aW9uUGFydGljaXBhbnQuamF2YQppbmRleCBjMjdhYjE1Li5hMmFhODUxIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9Db21waWxhdGlvblBhcnRpY2lwYW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvQ29tcGlsYXRpb25QYXJ0aWNpcGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTgsOCArOCw4IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBta2F1Zm1hbkBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYXMgSUNvbXBpbGF0aW9uUGFydGljaXBhbnQKICAqICAgIElCTSAtIGNoYW5nZWQgZnJvbSBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uUGFydGljaXBhbnQgdG8gYWJzdHJhY3QgY2xhc3MgQ29tcGlsYXRpb25QYXJ0aWNpcGFudAotICogICAgSUJNIC0gcmV3cm90ZSBzcGVjCi0gKiAgICAKKyAqICAgIElCTSAtIHJld3JvdGUgc3BlY2lmaWNhdGlvbgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOwpAQCAtMTcsMTkgKzE3LDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogCiAvKioKLSAqIEEgY29tcGlsYXRpb24gcGFydGljaXBhbnQgaXMgbm90aWZpZWQgb2YgZXZlbnRzIG9jY3VyaW5nIGR1cmluZyB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KKyAqIEEgY29tcGlsYXRpb24gcGFydGljaXBhbnQgaXMgbm90aWZpZWQgb2YgZXZlbnRzIG9jY3VycmluZyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuCiAgKiBUaGUgY29tcGlsYXRpb24gcHJvY2VzcyBub3Qgb25seSBpbnZvbHZlcyBnZW5lcmF0aW5nIC5jbGFzcyBmaWxlcyAoaS5lLiBidWlsZGluZyksIGl0IGFsc28gaW52b2x2ZXMKICAqIGNsZWFuaW5nIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCByZWNvbmNpbGluZyBhIHdvcmtpbmcgY29weSwgZXRjLgotICogU28gdGhlIG5vdGlmaWVkIGV2ZW50cyBhcmUgdGhlIHJlc3VsdCBvZiBhIGJ1aWxkIGFjdGlvbiwgYSBjbGVhbiBhY3Rpb24sIGEgcmVjb25jaWxlIG9wZXJhdGlvbiAKKyAqIFNvIHRoZSBub3RpZmllZCBldmVudHMgYXJlIHRoZSByZXN1bHQgb2YgYSBidWlsZCBhY3Rpb24sIGEgY2xlYW4gYWN0aW9uLCBhIHJlY29uY2lsZSBvcGVyYXRpb24KICAqIChmb3IgYSB3b3JraW5nIGNvcHkpLCBldGMuCiAgKiA8cD4KICAqIENvZGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGJ1aWxkIHNob3VsZCBpbiBnZW5lcmFsIGJlIGltcGxlbWVudGVkIHdpdGggYSBzZXBhcmF0ZSBCdWlsZGVyLAotICogcmF0aGVyIHRoYW4gYSBDb21waWxhdGlvblBhcnRpY2lwYW50LiBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byB1c2UgYSBDb21waWxhdGlvblBhcnRpY2lwYW50IGlmIAotICogdGhlIGJ1aWxkIHN0ZXAgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgSmF2YSBidWlsZCwgZm9yIGluc3RhbmNlIGJ5IGNyZWF0aW5nIGFkZGl0aW9uYWwgCi0gKiBKYXZhIHNvdXJjZSBmaWxlcyB0aGF0IG11c3QgdGhlbXNlbHZlcyBpbiB0dXJuIGJlIGNvbXBpbGVkLiAKKyAqIHJhdGhlciB0aGFuIGEgQ29tcGlsYXRpb25QYXJ0aWNpcGFudC4gSXQgaXMgb25seSBuZWNlc3NhcnkgdG8gdXNlIGEgQ29tcGlsYXRpb25QYXJ0aWNpcGFudCBpZgorICogdGhlIGJ1aWxkIHN0ZXAgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgSmF2YSBidWlsZCwgZm9yIGluc3RhbmNlIGJ5IGNyZWF0aW5nIGFkZGl0aW9uYWwKKyAqIEphdmEgc291cmNlIGZpbGVzIHRoYXQgbXVzdCB0aGVtc2VsdmVzIGluIHR1cm4gYmUgY29tcGlsZWQuCiAgKiA8cD4KLSAqIENsaWVudHMgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyBtdXN0IHN1Y2xhc3MgdGhpcyBjbGFzcywgYW5kIGltcGxlbWVudAotICoge0BsaW5rICNpc0FjdGl2ZShJSmF2YVByb2plY3QpfSwge0BsaW5rICNhYm91dFRvQnVpbGQoSUphdmFQcm9qZWN0KX0sIAorICogQ2xpZW50cyB3aXNoaW5nIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcywgYW5kIGltcGxlbWVudAorICoge0BsaW5rICNpc0FjdGl2ZShJSmF2YVByb2plY3QpfSwge0BsaW5rICNhYm91dFRvQnVpbGQoSUphdmFQcm9qZWN0KX0sCiAgKiB7QGxpbmsgI3JlY29uY2lsZShSZWNvbmNpbGVDb250ZXh0KX0sIGV0Yy4KICogPC9wPjxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCkBAIC0zOCw4ICszOCw4IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxhdGlvblBhcnRpY2lwYW50IHsKIAotcHVibGljIHN0YXRpYyBpbnQgUkVBRFlfRk9SX0JVSUxEID0gMTsKLXB1YmxpYyBzdGF0aWMgaW50IE5FRURTX0ZVTExfQlVJTEQgPSAyOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURZX0ZPUl9CVUlMRCA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTkVFRFNfRlVMTF9CVUlMRCA9IDI7CiAKIC8qKgogICogTm90aWZpZXMgdGhpcyBwYXJ0aWNpcGFudCB0aGF0IGEgYnVpbGQgaXMgYWJvdXQgdG8gc3RhcnQgYW5kIHByb3ZpZGVzIGl0IHRoZSBvcHBvcnR1bml0eSB0bwpAQCAtNDksNiArNDksNyBAQAogICogPHA+CiAgKiBEZWZhdWx0IGlzIHRvIHJldHVybiA8Y29kZT5SRUFEWV9GT1JfQlVJTEQ8L2NvZGU+LgogICogPC9wPgorICogQHNlZSAjYnVpbGRGaW5pc2hlZChJSmF2YVByb2plY3QgcHJvamVjdCkKICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGFib3V0IHRvIGJ1aWxkCiAgKiBAcmV0dXJuIFJFQURZX0ZPUl9CVUlMRCBvciBORUVEU19GVUxMX0JVSUxECiAgKi8KQEAgLTU3LDYgKzU4LDE4IEBACiB9CiAKIC8qKgorICogTm90aWZpZXMgdGhpcyBwYXJ0aWNpcGFudCB0aGF0IGEgYnVpbGQgaGFzIGZpbmlzaGVkIGZvciB0aGUgcHJvamVjdC4KKyAqIFRoaXMgd2lsbCBiZSBzZW50LCBldmVuIGlmIGJ1aWxkU3RhcnRpbmcoKSB3YXMgbm90IHNlbnQgd2hlbiBubyBzb3VyY2UgZmlsZXMgbmVlZGVkIHRvIGJlIGNvbXBpbGVkCisgKiBvciB0aGUgYnVpbGQgZmFpbGVkLgorICogT25seSBzZW50IHRvIHBhcnRpY2lwYW50cyBpbnRlcmVzdGVkIGluIHRoZSBwcm9qZWN0LgorICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgYWJvdXQgdG8gYnVpbGQKKyAqIEBzaW5jZSAzLjQKKyAgKi8KK3B1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKK30KKworLyoqCiAgKiBOb3RpZmllcyB0aGlzIHBhcnRpY2lwYW50IHRoYXQgYSBjb21waWxlIG9wZXJhdGlvbiBpcyBhYm91dCB0byBzdGFydCBhbmQgcHJvdmlkZXMgaXQgdGhlIG9wcG9ydHVuaXR5IHRvCiAgKiBnZW5lcmF0ZSBzb3VyY2UgZmlsZXMgYmFzZWQgb24gdGhlIHNvdXJjZSBmaWxlcyBhYm91dCB0byBiZSBjb21waWxlZC4KICAqIFdoZW4gaXNCYXRjaEJ1aWxkIGlzIHRydWUsIHRoZW4gZmlsZXMgY29udGFpbnMgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgcHJvamVjdC4KQEAgLTg0LDcgKzk3LDcgQEAKICAqIDxwPgogICogRGVmYXVsdCBpcyB0byByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgogICogPC9wPjxwPgotICogRm9yIGVmZmljaWVuY3ksIHBhcnRpY2lwYW50cyB0aGF0IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgCisgKiBGb3IgZWZmaWNpZW5jeSwgcGFydGljaXBhbnRzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZQogICogZ2l2ZW4gcHJvamVjdCBzaG91bGQgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgdGhhdCBwcm9qZWN0LgogICogPC9wPgogICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcGFydGljaXBhdGUgaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JU2Nhbm5lci5qYXZhCmluZGV4IDBlMWQ1N2IuLmJiYzY1ODUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVNjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw3ICsxMiw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOwotIAorCiAgLyoqCiAgICogRGVmaW5pdGlvbiBvZiBhIEphdmEgc2Nhbm5lciwgYXMgcmV0dXJuZWQgYnkgdGhlIDxjb2RlPlRvb2xGYWN0b3J5PC9jb2RlPi4KICAgKiBUaGUgc2Nhbm5lciBpcyByZXNwb25zaWJsZSBmb3IgdG9rZW5pemluZyBhIGdpdmVuIHNvdXJjZSwgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0CkBAIC0yMiwxMyArMjIsMTIgQEAKICAgKiBJVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZUVPRjwvY29kZT4uCiAgICogPC9wPjxwPgogICAqIFdoZW4gZW5jb3VudGVyaW5nIGxleGljYWwgZXJyb3JzLCBhbiA8Y29kZT5JbnZhbGlkSW5wdXRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICogPC9wPgotICAqIAorICAqCiAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeQogICAqIEBzZWUgSVRlcm1pbmFsU3ltYm9scwogICAqIEBzaW5jZSAyLjAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNjYW5uZXIgewogCkBAIC0zNiwyOSArMzUsMjkgQEAKIAkgKiBBbnN3ZXJzIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgc291cmNlLCBhZnRlciB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZQogCSAqIGJlZW4gdHJhbnNsYXRlZCBpbnRvIHVuaWNvZGUgY2hhcmFjdGVycy4KIAkgKiBGb3IgZXhhbXBsZSwgaWYgb3JpZ2luYWwgc291cmNlIHdhcyA8Y29kZT5cXHUwMDYxYmM8L2NvZGU+IHRoZW4gaXQgd2lsbCBhbnN3ZXIgPGNvZGU+YWJjPC9jb2RlPi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaWRlbnRpZmllciBzb3VyY2UsIGFmdGVyIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBoYXZlCiAJICogYmVlbiB0cmFuc2xhdGVkIGludG8gdW5pY29kZSBjaGFyYWN0ZXJzCiAJICovCiAJY2hhcltdIGdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwotCQorCiAJLyoqCiAJICogQW5zd2VycyB0aGUgY3VycmVudCBpZGVudGlmaWVyIHNvdXJjZSwgYmVmb3JlIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBoYXZlCiAJICogYmVlbiB0cmFuc2xhdGVkIGludG8gdW5pY29kZSBjaGFyYWN0ZXJzLgogCSAqIEZvciBleGFtcGxlLCBpZiBvcmlnaW5hbCBzb3VyY2Ugd2FzIDxjb2RlPlxcdTAwNjFiYzwvY29kZT4gdGhlbiBpdCB3aWxsIGFuc3dlciA8Y29kZT5cXHUwMDYxYmM8L2NvZGU+LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY3VycmVudCBpZGVudGlmaWVyIHNvdXJjZSwgYmVmb3JlIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBoYXZlCiAJICogYmVlbiB0cmFuc2xhdGVkIGludG8gdW5pY29kZSBjaGFyYWN0ZXJzCiAJICogQHNpbmNlIDIuMQogCSAqLwotCWNoYXJbXSBnZXRSYXdUb2tlblNvdXJjZSgpOwkKKwljaGFyW10gZ2V0UmF3VG9rZW5Tb3VyY2UoKTsKIAogCS8qKgogCSAqIEFuc3dlcnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlLgotCSAqIFRoaXMgcG9zaXRpb24gaXMgemVyby1iYXNlZCBhbmQgaW5jbHVzaXZlLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAKLQkgKiB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgdG9rZW4uIElmIHRoaXMgY2hhcmFjdGVyIHdhcyBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCBpdCBwb2ludHMgYXQgdGhlIGZpcnN0IAorCSAqIFRoaXMgcG9zaXRpb24gaXMgemVyby1iYXNlZCBhbmQgaW5jbHVzaXZlLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorCSAqIHdoaWNoIGlzIHBhcnQgb2YgdGhpcyB0b2tlbi4gSWYgdGhpcyBjaGFyYWN0ZXIgd2FzIGEgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIGl0IHBvaW50cyBhdCB0aGUgZmlyc3QKIAkgKiBjaGFyYWN0ZXIgb2YgdGhpcyBzZXF1ZW5jZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlCiAJICovCiAJaW50IGdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKQEAgLTY2LDkgKzY1LDkgQEAKIAkvKioKIAkgKiBBbnN3ZXJzIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW5zaWRlIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAJICogVGhpcyBwb3NpdGlvbiBpcyB6ZXJvLWJhc2VkIGFuZCBpbmNsdXNpdmUuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLQkgKiB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgdG9rZW4uIElmIHRoaXMgY2hhcmFjdGVyIHdhcyBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCBpdCBwb2ludHMgYXQgdGhlIGxhc3QgCisJICogd2hpY2ggaXMgcGFydCBvZiB0aGlzIHRva2VuLiBJZiB0aGlzIGNoYXJhY3RlciB3YXMgYSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZSwgaXQgcG9pbnRzIGF0IHRoZSBsYXN0CiAJICogY2hhcmFjdGVyIG9mIHRoaXMgc2VxdWVuY2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW5zaWRlIHRoZSBvcmlnaW5hbCBzb3VyY2UKIAkgKi8KIAlpbnQgZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKQEAgLTc4LDcgKzc3LDcgQEAKIAkgKiBhbHJlYWR5IGluIHRoZSB0b2tlbml6YXRpb24gcHJvY2VzcyAoaW4gb3RoZXIgd29yZHMsIGl0IGNhbm5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgcG9zaXRpb25zIG9mIGxpbmVzIGJleW9uZAogCSAqIGN1cnJlbnQgdG9rZW4pLiBPbmNlIHRoZSBlbnRpcmUgc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZCwgaXQgY2FuIGJlIHVzZWQgd2l0aG91dCBhbnkgbGltaXQuCiAJICogTGluZSBzdGFydGluZyBwb3NpdGlvbnMgYXJlIHplcm8tYmFzZWQsIGFuZCBzdGFydCBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJldmlvdXMgbGluZSBzZXBhcmF0b3IgKGlmIGFueSkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbGluZU51bWJlciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIKIAkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBhIGdpdmVuIGxpbmUgbnVtYmVyCiAJICovCkBAIC04OCw5ICs4Nyw5IEBACiAJICogQW5zd2VycyB0aGUgZW5kaW5nIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIuIFRoaXMgbGluZSBoYXMgdG8gaGF2ZSBiZWVuIGVuY291bnRlcmVkCiAJICogYWxyZWFkeSBpbiB0aGUgdG9rZW5pemF0aW9uIHByb2Nlc3MgKGluIG90aGVyIHdvcmRzLCBpdCBjYW5ub3QgYmUgdXNlZCB0byBjb21wdXRlIHBvc2l0aW9ucyBvZiBsaW5lcyBiZXlvbmQKIAkgKiBjdXJyZW50IHRva2VuKS4gT25jZSB0aGUgZW50aXJlIHNvdXJjZSBoYXMgYmVlbiBwcm9jZXNzZWQsIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYW55IGxpbWl0LgotCSAqIExpbmUgZW5kaW5nIHBvc2l0aW9ucyBhcmUgemVyby1iYXNlZCwgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHNlcGFyYXRvciAKLQkgKiAoaW4gY2FzZSBtdWx0aS1jaGFyYWN0ZXIgbGluZSBzZXBhcmF0b3JzKS4JIAotCSAqIAorCSAqIExpbmUgZW5kaW5nIHBvc2l0aW9ucyBhcmUgemVyby1iYXNlZCwgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHNlcGFyYXRvcgorCSAqIChpbiBjYXNlIG11bHRpLWNoYXJhY3RlciBsaW5lIHNlcGFyYXRvcnMpLgorCSAqCiAJICogQHBhcmFtIGxpbmVOdW1iZXIgdGhlIGdpdmVuIGxpbmUgbnVtYmVyCiAJICogQHJldHVybiB0aGUgZW5kaW5nIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKIAkgKiovCkBAIC0xMDAsNyArOTksNyBAQAogCSAqIEFuc3dlcnMgYW4gYXJyYXkgb2YgdGhlIGVuZGluZyBwb3NpdGlvbnMgb2YgdGhlIGxpbmVzIGVuY291bnRlcmVkIHNvIGZhci4gTGluZSBlbmRpbmcgcG9zaXRpb25zCiAJICogYXJlIHplcm8tYmFzZWQsIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSBzZXBhcmF0b3IgKGluIGNhc2UgbXVsdGktY2hhcmFjdGVyCiAJICogbGluZSBzZXBhcmF0b3JzKS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGVuZGluZyBwb3NpdGlvbnMgb2YgdGhlIGxpbmVzIGVuY291bnRlcmVkIHNvIGZhcgogCSAqLwogCWludFtdIGdldExpbmVFbmRzKCk7CkBAIC0xMDgsNyArMTA3LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXJzIGEgMS1iYXNlZCBsaW5lIG51bWJlciB1c2luZyB0aGUgbGluZXMgd2hpY2ggaGF2ZSBiZWVuIGVuY291bnRlcmVkIHNvIGZhci4gSWYgdGhlIHBvc2l0aW9uCiAJICogaXMgbG9jYXRlZCBiZXlvbmQgdGhlIGN1cnJlbnQgc2Nhbm5lZCBsaW5lLCB0aGVuIHRoZSBsYXN0IGxpbmUgbnVtYmVyIHdpbGwgYmUgYW5zd2VyZWQuCi0JICogCisJICoKIAkgKiBAcGFyYW0gY2hhclBvc2l0aW9uIHRoZSBnaXZlbiBjaGFyYWN0ZXIgcG9zaXRpb24KIAkgKiBAcmV0dXJuIGEgMS1iYXNlZCBsaW5lIG51bWJlciB1c2luZyB0aGUgbGluZXMgd2hpY2ggaGF2ZSBiZWVuIGVuY291bnRlcmVkIHNvIGZhcgogCSAqLwpAQCAtMTE4LDE1ICsxMTcsMTUgQEAKIAkgKiBSZWFkIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzb3VyY2UsIGFuZCBhbnN3ZXJzIGl0cyBJRCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+SVRlcm1pbmFsU3ltYm9sczwvY29kZT4uCiAJICogTm90ZSB0aGF0IHRoZSBhY3R1YWwgdG9rZW4gSUQgdmFsdWVzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpZiBuZXcga2V5d29yZHMgd2VyZSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UKIAkgKiAoZm9yIGluc3RhbmNlLCAnYXNzZXJ0JyBpcyBhIGtleXdvcmQgaW4gMS40KS4KLQkgKiAKKwkgKgogCSAqIEB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIGluIGNhc2UgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSByZWFkaW5nIHRoZSBjdXJyZW50IHRva2VuCiAJICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgogCSAqLwogCWludCBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwogCiAJLyoqCi0JICogQW5zd2VycyB0aGUgb3JpZ2luYWwgc291cmNlIGJlaW5nIHByb2Nlc3NlZCAobm90IGEgY29weSBvZiBpdCkuIAotCSAqIAorCSAqIEFuc3dlcnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBiZWluZyBwcm9jZXNzZWQgKG5vdCBhIGNvcHkgb2YgaXQpLgorCSAqCiAJICogQHJldHVybiB0aGUgb3JpZ2luYWwgc291cmNlIGJlaW5nIHByb2Nlc3NlZAogCSAqLwogCWNoYXJbXSBnZXRTb3VyY2UoKTsKQEAgLTEzNCw3ICsxMzMsNyBAQAogCS8qKgogCSAqIFJlcG9zaXRpb24gdGhlIHNjYW5uZXIgb24gc29tZSBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuIFRoZSBnaXZlbiBlbmRQb3NpdGlvbiBpcyB0aGUgbGFzdCB2YWxpZCBwb3NpdGlvbi4KIAkgKiBCZXlvbmQgdGhpcyBwb3NpdGlvbiwgdGhlIHNjYW5uZXIgd2lsbCBhbnN3ZXIgRU9GIHRva2VucyAoPGNvZGU+SVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0Y8L2NvZGU+KS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbgogCSAqIEBwYXJhbSBlbmRQb3NpdGlvbiB0aGUgZ2l2ZW4gZW5kIHBvc2l0aW9uCiAJICovCkBAIC0xNDQsNyArMTQzLDcgQEAKIAkgKiBTZXQgdGhlIHNjYW5uZXIgc291cmNlIHRvIHByb2Nlc3MuIEJ5IGRlZmF1bHQsIHRoZSBzY2FubmVyIHdpbGwgY29uc2lkZXIgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKIAkgKiBzb3VyY2UgdW50aWwgaXQgcmVhY2hlcyBpdHMgZW5kLgogCSAqIElmIHRoZSBnaXZlbiBzb3VyY2UgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoaXMgY2xlYXJzIHRoZSBzb3VyY2UuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc291cmNlIHRoZSBnaXZlbiBzb3VyY2UKIAkgKi8KIAl2b2lkIHNldFNvdXJjZShjaGFyW10gc291cmNlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YQppbmRleCA3ZTUwMGJmLi5iZTdkMmU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JVGVybWluYWxTeW1ib2xzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVRlcm1pbmFsU3ltYm9scy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDE2ICsxMCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7Ci0gCisKIC8qKgotICogTWFwcyBlYWNoIHRlcm1pbmFsIHN5bWJvbCBpbiB0aGUgamF2YS1ncmFtbWFyIGludG8gYSB1bmlxdWUgaW50ZWdlci4gCi0gKiBUaGlzIGludGVnZXIgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRlcm1pbmFsIHdoZW4gY29tcHV0aW5nIGEgcGFyc2luZyBhY3Rpb24uIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAorICogTWFwcyBlYWNoIHRlcm1pbmFsIHN5bWJvbCBpbiB0aGUgamF2YS1ncmFtbWFyIGludG8gYSB1bmlxdWUgaW50ZWdlci4KKyAqIFRoaXMgaW50ZWdlciBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdGVybWluYWwgd2hlbiBjb21wdXRpbmcgYSBwYXJzaW5nIGFjdGlvbi4KKyAqCiAgKiBAc2VlIElTY2FubmVyCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVRlcm1pbmFsU3ltYm9scyB7CiAKQEAgLTI3LDEwICsyNSwxMCBAQAogCWludCBUb2tlbk5hbWVDT01NRU5UX0xJTkUgPSAxMDAxOwogCWludCBUb2tlbk5hbWVDT01NRU5UX0JMT0NLID0gMTAwMjsKIAlpbnQgVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DID0gMTAwMzsKLQkKKwogCWludCBUb2tlbk5hbWVJZGVudGlmaWVyID0gNTsKIAlpbnQgVG9rZW5OYW1lYWJzdHJhY3QgPSA5ODsKLQkKKwogICAgIC8qKgogICAgICAqICJhc3NlcnQiIHRva2VuIChhZGRlZCBpbiBKMlNFIDEuNCkuCiAgICAgICovCkBAIC0xMzcsMzAgKzEzNSwzMCBAQAogCWludCBUb2tlbk5hbWVFUVVBTCA9IDE2NzsKIAlpbnQgVG9rZW5OYW1lRU9GID0gMTU4OwogCWludCBUb2tlbk5hbWVFUlJPUiA9IDMwOTsKLSAgICAgCisKICAgICAvKioKICAgICAgKiAiZW51bSIga2V5d29yZCAoYWRkZWQgaW4gSjJTRSAxLjUpLgogICAgICAqIEBzaW5jZSAzLjAKICAgICAgKi8KIAlpbnQgVG9rZW5OYW1lZW51bSA9IDQwMDsKLSAgICAgCisKICAgICAvKioKICAgICAgKiAiQCIgdG9rZW4gKGFkZGVkIGluIEoyU0UgMS41KS4KICAgICAgKiBAc2luY2UgMy4wCiAgICAgICovCiAJaW50IFRva2VuTmFtZUFUID0gNDAxOwotICAgICAKKwogICAgIC8qKgogICAgICAqICIuLi4iIHRva2VuIChhZGRlZCBpbiBKMlNFIDEuNSkuCiAgICAgICogQHNpbmNlIDMuMAogICAgICAqLwogCWludCBUb2tlbk5hbWVFTExJUFNJUyA9IDQwMjsKLQkKKwogCS8qKgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlpbnQgVG9rZW5OYW1lY29uc3QgPSA0MDM7Ci0JCisKIAkvKioKIAkgKiBAc2luY2UgMy4xCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9SZWNvbmNpbGVDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9SZWNvbmNpbGVDb250ZXh0LmphdmEKaW5kZXggNDc0Y2QwMC4uOTg2Mjc2OCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvUmVjb25jaWxlQ29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL1JlY29uY2lsZUNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05LDcgKzksNyBAQAogICogICAgbWthdWZtYW5AYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgSUJNIC0gcmVuYW1lZCBmcm9tIFByZVJlY29uY2lsZUNvbXBpbGF0aW9uUmVzdWx0IHRvIFJlY29uY2lsZUNvbnRleHQKICAqICAgIElCTSAtIHJld3JvdGUgc3BlYwotICogICAgCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7CkBAIC0yNywzNyArMjcsMzUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5SZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbjsKIAogLyoqCi0gKiBUaGUgY29udGV4dCBvZiBhIHJlY29uY2lsZSBldmVudCB0aGF0IGlzIG5vdGlmaWVkIHRvIGludGVyZXN0ZWQgY29tcGlsYXRpb24gCisgKiBUaGUgY29udGV4dCBvZiBhIHJlY29uY2lsZSBldmVudCB0aGF0IGlzIG5vdGlmaWVkIHRvIGludGVyZXN0ZWQgY29tcGlsYXRpb24KICAqIHBhcnRpY2lwYW50cyB3aGlsZSBhIHJlY29uY2lsZSBvcGVyYXRpb24gaXMgcnVubmluZy4KICAqIDxwPgogICogQSByZWNvbmNpbGUgcGFydGljaXBhbnQgY2FuIGdldCB0aGUgQVNUIGZvciB0aGUgcmVjb25jaWxlLW9wZXJhdGlvbiB1c2luZwotICoge0BsaW5rICNnZXRBU1QzKCl9LiBJZiB0aGUgcGFydGljaXBhbnQgbW9kaWZpZXMgaW4gYW55IHdheSB0aGUgQVNUIAotICogKGVpdGhlciBieSBtb2RpZnlpbmcgdGhlIHNvdXJjZSBvZiB0aGUgd29ya2luZyBjb3B5LCBvciBtb2RpZnlpbmcgYW5vdGhlciBlbnRpdHkgCi0gKiB0aGF0IHdvdWxkIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmluZGluZ3MgZm9yIHRoZSBBU1QpLCBpdCBpcyBleHBlY3RlZCB0byByZXNldCB0aGUgCisgKiB7QGxpbmsgI2dldEFTVDMoKX0uIElmIHRoZSBwYXJ0aWNpcGFudCBtb2RpZmllcyBpbiBhbnkgd2F5IHRoZSBBU1QKKyAqIChlaXRoZXIgYnkgbW9kaWZ5aW5nIHRoZSBzb3VyY2Ugb2YgdGhlIHdvcmtpbmcgY29weSwgb3IgbW9kaWZ5aW5nIGFub3RoZXIgZW50aXR5CisgKiB0aGF0IHdvdWxkIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmluZGluZ3MgZm9yIHRoZSBBU1QpLCBpdCBpcyBleHBlY3RlZCB0byByZXNldCB0aGUKICAqIEFTVCBpbiB0aGUgY29udGV4dCB1c2luZyB7QGxpbmsgI3Jlc2V0QVNUKCl9LgogICogPC9wPjxwPgotICogQSByZWNvbmNpbGUgcGFydGljaXBhbnQgY2FuIGFsc28gY3JlYXRlIGFuZCByZXR1cm4gcHJvYmxlbXMgdXNpbmcgCi0gKiB7QGxpbmsgI3B1dFByb2JsZW1zKFN0cmluZywgQ2F0ZWdvcml6ZWRQcm9ibGVtW10pfS4gVGhlc2UgcHJvYmxlbXMgYXJlIHRoZW4gcmVwb3J0ZWQgCisgKiBBIHJlY29uY2lsZSBwYXJ0aWNpcGFudCBjYW4gYWxzbyBjcmVhdGUgYW5kIHJldHVybiBwcm9ibGVtcyB1c2luZworICoge0BsaW5rICNwdXRQcm9ibGVtcyhTdHJpbmcsIENhdGVnb3JpemVkUHJvYmxlbVtdKX0uIFRoZXNlIHByb2JsZW1zIGFyZSB0aGVuIHJlcG9ydGVkCiAgKiB0byB0aGUgcHJvYmxlbSByZXF1ZXN0b3Igb2YgdGhlIHJlY29uY2lsZSBvcGVyYXRpb24uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW5jaWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgotICogCisgKgogICogQHNlZSBDb21waWxhdGlvblBhcnRpY2lwYW50I3JlY29uY2lsZShSZWNvbmNpbGVDb250ZXh0KQogICogQHNpbmNlIDMuMgorICogQG5vaW5zdGFudGlhdGUgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgY2xhc3MgUmVjb25jaWxlQ29udGV4dCB7Ci0JCisKIAlwcml2YXRlIFJlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uIG9wZXJhdGlvbjsKIAlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weTsKIAogLyoqCiAgKiBDcmVhdGVzIGEgcmVjb25jaWxlIGNvbnRleHQgZm9yIHRoZSBnaXZlbiByZWNvbmNpbGUgb3BlcmF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAorICoKICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIHJlY29uY2lsZSBvcGVyYXRpb24KKyAqIEBub3JlZmVyZW5jZSBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIFJlY29uY2lsZUNvbnRleHQoUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24gb3BlcmF0aW9uLCBDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkpIHsKIAl0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKQEAgLTY5LDE1ICs2NywxNSBAQAogICogSXQgaXMgY3JlYXRlZCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JraW5nIGNvcHkuCiAgKiBDcmVhdGVzIG9uZSBpZiBub25lIGV4aXN0cyB5ZXQuCiAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JraW5nIGNvcHkKLSAqIGRvZXNuJ3QgYWxsb3cgdGhlIEFTVCB0byBiZSBjcmVhdGVkIChlLmcuIGlmIHRoZSB3b3JraW5nIGNvcHkncyBjb250ZW50IAorICogZG9lc24ndCBhbGxvdyB0aGUgQVNUIHRvIGJlIGNyZWF0ZWQgKGUuZy4gaWYgdGhlIHdvcmtpbmcgY29weSdzIGNvbnRlbnQKICAqIGNhbm5vdCBiZSBwYXJzZWQpLgogICogPHA+CiAgKiBJZiB0aGUgQVNUIGxldmVsIHJlcXVlc3RlZCBkdXJpbmcgcmVjb25jaWxpbmcgaXMgbm90IHtAbGluayBBU1QjSkxTM30KLSAqIG9yIGlmIGJpbmRpbmcgcmVzb2x1dGlvbnMgd2FzIG5vdCByZXF1ZXN0ZWQsIHRoZW4gYSBkaWZmZXJlbnQgQVNUIGlzIGNyZWF0ZWQuIAotICogTm90ZSB0aGF0IHRoaXMgQVNUIGRvZXMgbm90IGJlY29tZSB0aGUgY3VycmVudCBBU1QgYW5kIGl0IGlzIG9ubHkgdmFsaWQgZm9yIAorICogb3IgaWYgYmluZGluZyByZXNvbHV0aW9ucyB3YXMgbm90IHJlcXVlc3RlZCwgdGhlbiBhIGRpZmZlcmVudCBBU1QgaXMgY3JlYXRlZC4KKyAqIE5vdGUgdGhhdCB0aGlzIEFTVCBkb2VzIG5vdCBiZWNvbWUgdGhlIGN1cnJlbnQgQVNUIGFuZCBpdCBpcyBvbmx5IHZhbGlkIGZvcgogICogdGhlIHJlcXVlc3Rvci4KICAqIDwvcD4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIEFTVCBjcmVhdGVkIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdvcmtpbmcgY29weSwKICAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBjcmVhdGVkCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3JraW5nIGNvcHkKQEAgLTkwLDIxICs4OCw1OSBAQAogCWlmICh0aGlzLm9wZXJhdGlvbi5hc3RMZXZlbCAhPSBBU1QuSkxTMyB8fCAhdGhpcy5vcGVyYXRpb24ucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCS8vIGNyZWF0ZSBBU1QgKG9wdGlvbmFsbHkgcmVzb2x2aW5nIGJpbmRpbmdzKQogCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRDb21waWxlck9wdGlvbnMod29ya2luZ0NvcHkuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsKLQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUod29ya2luZ0NvcHkuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKQorCQlwYXJzZXIuc2V0Q29tcGlsZXJPcHRpb25zKHRoaXMud29ya2luZ0NvcHkuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsKKwkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUodGhpcy53b3JraW5nQ29weS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpCiAJCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwogCQlwYXJzZXIuc2V0U3RhdGVtZW50c1JlY292ZXJ5KCh0aGlzLm9wZXJhdGlvbi5yZWNvbmNpbGVGbGFncyAmIElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkpICE9IDApOwogCQlwYXJzZXIuc2V0QmluZGluZ3NSZWNvdmVyeSgodGhpcy5vcGVyYXRpb24ucmVjb25jaWxlRmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMCk7Ci0JCXBhcnNlci5zZXRTb3VyY2Uod29ya2luZ0NvcHkpOwotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QodGhpcy5vcGVyYXRpb24ucHJvZ3Jlc3NNb25pdG9yKTsJCQorCQlwYXJzZXIuc2V0U291cmNlKHRoaXMud29ya2luZ0NvcHkpOworCQlwYXJzZXIuc2V0SWdub3JlTWV0aG9kQm9kaWVzKCh0aGlzLm9wZXJhdGlvbi5yZWNvbmNpbGVGbGFncyAmIElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDApOworCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QodGhpcy5vcGVyYXRpb24ucHJvZ3Jlc3NNb25pdG9yKTsKIAl9CiAJcmV0dXJuIHRoaXMub3BlcmF0aW9uLm1ha2VDb25zaXN0ZW50KHRoaXMud29ya2luZ0NvcHkpOwogfQotCisvKioKKyAqIFJldHVybnMgYSByZXNvbHZlZCBBU1Qgd2l0aCB7QGxpbmsgQVNUI0pMUzQgSkxTNH0gbGV2ZWwuCisgKiBJdCBpcyBjcmVhdGVkIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdvcmtpbmcgY29weS4KKyAqIENyZWF0ZXMgb25lIGlmIG5vbmUgZXhpc3RzIHlldC4KKyAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdvcmtpbmcgY29weQorICogZG9lc24ndCBhbGxvdyB0aGUgQVNUIHRvIGJlIGNyZWF0ZWQgKGUuZy4gaWYgdGhlIHdvcmtpbmcgY29weSdzIGNvbnRlbnQKKyAqIGNhbm5vdCBiZSBwYXJzZWQpLgorICogPHA+CisgKiBJZiB0aGUgQVNUIGxldmVsIHJlcXVlc3RlZCBkdXJpbmcgcmVjb25jaWxpbmcgaXMgbm90IHtAbGluayBBU1QjSkxTNH0KKyAqIG9yIGlmIGJpbmRpbmcgcmVzb2x1dGlvbnMgd2FzIG5vdCByZXF1ZXN0ZWQsIHRoZW4gYSBkaWZmZXJlbnQgQVNUIGlzIGNyZWF0ZWQuCisgKiBOb3RlIHRoYXQgdGhpcyBBU1QgZG9lcyBub3QgYmVjb21lIHRoZSBjdXJyZW50IEFTVCBhbmQgaXQgaXMgb25seSB2YWxpZCBmb3IKKyAqIHRoZSByZXF1ZXN0b3IuCisgKiA8L3A+CisgKgorICogQHJldHVybiB0aGUgQVNUIGNyZWF0ZWQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgd29ya2luZyBjb3B5LAorICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGNyZWF0ZWQKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uICBpZiB0aGUgY29udGVudHMgb2YgdGhlIHdvcmtpbmcgY29weQorICoJCWNhbm5vdCBiZSBhY2Nlc3NlZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGUgd29ya2luZyBjb3B5IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8L3VsPgorICogQHNpbmNlIDMuNy4xCisgKi8KK3B1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0IGdldEFTVDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAodGhpcy5vcGVyYXRpb24uYXN0TGV2ZWwgIT0gQVNULkpMUzQgfHwgIXRoaXMub3BlcmF0aW9uLnJlc29sdmVCaW5kaW5ncykgeworCQkvLyBjcmVhdGUgQVNUIChvcHRpb25hbGx5IHJlc29sdmluZyBiaW5kaW5ncykKKwkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzQpOworCQlwYXJzZXIuc2V0Q29tcGlsZXJPcHRpb25zKHRoaXMud29ya2luZ0NvcHkuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsKKwkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUodGhpcy53b3JraW5nQ29weS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpCisJCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOworCQlwYXJzZXIuc2V0U3RhdGVtZW50c1JlY292ZXJ5KCh0aGlzLm9wZXJhdGlvbi5yZWNvbmNpbGVGbGFncyAmIElDb21waWxhdGlvblVuaXQuRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkpICE9IDApOworCQlwYXJzZXIuc2V0QmluZGluZ3NSZWNvdmVyeSgodGhpcy5vcGVyYXRpb24ucmVjb25jaWxlRmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9CSU5ESU5HU19SRUNPVkVSWSkgIT0gMCk7CisJCXBhcnNlci5zZXRTb3VyY2UodGhpcy53b3JraW5nQ29weSk7CisJCXBhcnNlci5zZXRJZ25vcmVNZXRob2RCb2RpZXMoKHRoaXMub3BlcmF0aW9uLnJlY29uY2lsZUZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5JR05PUkVfTUVUSE9EX0JPRElFUykgIT0gMCk7CisJCXJldHVybiAob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVCh0aGlzLm9wZXJhdGlvbi5wcm9ncmVzc01vbml0b3IpOworCX0KKwlyZXR1cm4gdGhpcy5vcGVyYXRpb24ubWFrZUNvbnNpc3RlbnQodGhpcy53b3JraW5nQ29weSk7Cit9CiAvKioKICAqIFJldHVybnMgdGhlIEFTVCBsZXZlbCByZXF1ZXN0ZWQgYnkgdGhlIHJlY29uY2lsZSBvcGVyYXRpb24uCiAgKiBJdCBpcyBlaXRoZXIge0BsaW5rIElDb21waWxhdGlvblVuaXQjTk9fQVNUfSwgb3Igb25lIG9mIHRoZSBKTFMgY29uc3RhbnRzIGRlZmluZWQgb24ge0BsaW5rIEFTVH0uCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBBU1QgbGV2ZWwgcmVxdWVzdGVkIGJ5IHRoZSByZWNvbmNpbGUgb3BlcmF0aW9uCiAgKi8KIHB1YmxpYyBpbnQgZ2V0QVNUTGV2ZWwoKSB7CkBAIC0xMTMsMTggKzE0OSwzMiBAQAogCiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb25jaWxlIG9wZXJhdGlvbiBpcyByZXNvbHZpbmcgYmluZGluZ3MuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29uY2lsZSBvcGVyYXRpb24gaXMgcmVzb2x2aW5nIGJpbmRpbmdzCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2aW5nQmluZGluZ3MoKSB7CiAJcmV0dXJuIHRoaXMub3BlcmF0aW9uLnJlc29sdmVCaW5kaW5nczsKIH0KLQorLyoqCisgKiBSZXR1cm5zIHRoZSByZWNvbmNpbGUgZmxhZyBvZiB0aGlzIGNvbnRleHQuIFRoaXMgZmxhZyBpcyBhIGJpdHdpc2UgdmFsdWUgb2YgdGhlIGNvbnN0YW50IGRlZmluZWQKKyAqIGluIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fS4KKyAqCisgKiBAcmV0dXJuIHRoZSByZWNvbmNpbGUgZmxhZyBvZiB0aGlzIGNvbnRleHQKKyAqIEBzaW5jZSAzLjYKKyAqCisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjRU5BQkxFX0JJTkRJTkdTX1JFQ09WRVJZCisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjRU5BQkxFX1NUQVRFTUVOVFNfUkVDT1ZFUlkKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNJR05PUkVfTUVUSE9EX0JPRElFUworICovCitwdWJsaWMgaW50IGdldFJlY29uY2lsZUZsYWdzKCkgeworCXJldHVybiB0aGlzLm9wZXJhdGlvbi5yZWNvbmNpbGVGbGFnczsKK30KIC8qKgogICogUmV0dXJucyB0aGUgZGVsdGEgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHRvIHRoZSB3b3JraW5nIGNvcHkgYmVpbmcgcmVjb25jaWxlZC4KICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY2hhbmdlLgotICogTm90ZSB0aGF0IHRoZSBkZWx0YSdzIEFTVCBpcyBub3QgeWV0IHBvc2l0aW9ubm5lZCBhdCB0aGlzIHN0YWdlLiBVc2Uge0BsaW5rICNnZXRBU1QzKCl9Ci0gKiB0byBnZXQgdGhlIGN1cnJlbnQgQVNULgorICogTm90ZSB0aGF0IHRoZSBkZWx0YSdzIEFTVCBpcyBub3QgeWV0IHBvc2l0aW9uZWQgYXQgdGhpcyBzdGFnZS4gVXNlIHtAbGluayAjZ2V0QVNUMygpfQorICogdG8gZ2V0IHRoZSBjdXJyZW50IEFTVCBvciAge0BsaW5rICNnZXRBU1Q0KCl9IHRvIGdldCB0aGUgY3VycmVudCBBU1QgaWYgeW91IGFyZSB1c2luZworICoge0BsaW5rIEFTVCNKTFM0fSBhc3QgbGV2ZWwuCiAgKgogICogQHJldHVybiB0aGUgZGVsdGEgZGVzY3JpYmluZyB0aGUgY2hhbmdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAgKi8KQEAgLTEzNiw5ICsxODYsOSBAQAogICogUmV0dXJucyB0aGUgcHJvYmxlbXMgdG8gYmUgcmVwb3J0ZWQgdG8gdGhlIHByb2JsZW0gcmVxdWVzdG9yIG9mIHRoZSByZWNvbmNpbGUgb3BlcmF0aW9uCiAgKiBmb3IgdGhlIGdpdmVuIG1hcmtlciB0eXBlLgogICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ibGVtcyBuZWVkIHRvIGJlIHJlcG9ydGVkIGZvciB0aGlzIG1hcmtlciB0eXBlLgotICogCisgKgogICogQHBhcmFtIG1hcmtlclR5cGUgdGhlIGdpdmVuIG1hcmtlciB0eXBlCi0gKiBAcmV0dXJuIHByb2JsZW1zIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSBwcm9ibGVtIHJlcXVlc3RvCisgKiBAcmV0dXJuIHByb2JsZW1zIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSBwcm9ibGVtIHJlcXVlc3RvcgogICovCiBwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9ibGVtW10gZ2V0UHJvYmxlbXMoU3RyaW5nIG1hcmtlclR5cGUpIHsKIAlpZiAodGhpcy5vcGVyYXRpb24ucHJvYmxlbXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CkBAIC0xNDcsNyArMTk3LDcgQEAKIAogLyoqCiAgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgdGhpcyBjb250ZXh0IHJlZmVycyB0by4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSB0aGlzIGNvbnRleHQgcmVmZXJzIHRvCiAgKi8KIHB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KCkgewpAQCAtMTU2LDEzICsyMDYsMTMgQEAKIAogLyoqCiAgKiBSZXNldHMgdGhlIEFTVCBjYXJyaWVkIGJ5IHRoaXMgY29udGV4dC4KLSAqIEEgY29tcGlsYXRpb24gcGFydGljaXBhbnQgdGhhdCBtb2RpZmllcyB0aGUgZW52aXJvbm1lbnQgdGhhdCB3b3VsZCByZXN1bHQgaW4gZGlmZmVyZW50IAotICogYmluZGluZ3MgZm9yIHRoZSBBU1QgaXMgZXhwZWN0ZWQgdG8gcmVzZXQgdGhlIEFTVCBvbiB0aGlzIGNvbnRleHQsIHNvIHRoYXQgb3RoZXIgCisgKiBBIGNvbXBpbGF0aW9uIHBhcnRpY2lwYW50IHRoYXQgbW9kaWZpZXMgdGhlIGVudmlyb25tZW50IHRoYXQgd291bGQgcmVzdWx0IGluIGRpZmZlcmVudAorICogYmluZGluZ3MgZm9yIHRoZSBBU1QgaXMgZXhwZWN0ZWQgdG8gcmVzZXQgdGhlIEFTVCBvbiB0aGlzIGNvbnRleHQsIHNvIHRoYXQgb3RoZXIKICAqIHBhcnRpY2lwYW50cyBkb24ndCBnZXQgYSBzdGFsZSBBU1QuCiAgKiA8cD4KLSAqIE5vdGUgdGhhdCByZXNldHRpbmcgdGhlIEFTVCB3aWxsIG5vdCByZXN0YXJ0IHRoZSByZWNvbmNpbGUgcHJvY2Vzcy4gT25seSBmdXJ0aGVyIAorICogTm90ZSB0aGF0IHJlc2V0dGluZyB0aGUgQVNUIHdpbGwgbm90IHJlc3RhcnQgdGhlIHJlY29uY2lsZSBwcm9jZXNzLiBPbmx5IGZ1cnRoZXIKICAqIHBhcnRpY2lwYW50cyB3aWxsIHNlZSB0aGUgbmV3IEFTVC4gVGh1cyBwYXJ0aWNpcGFudHMgcnVubmluZyBiZWZvcmUgdGhlIG9uZSB0aGF0Ci0gKiByZXNldHMgdGhlIEFTVCB3aWxsIGhhdmUgYSBzdGFsZSB2aWV3IG9mIHRoZSBBU1QgYW5kIGl0cyBwcm9ibGVtcy4gVXNlIAorICogcmVzZXRzIHRoZSBBU1Qgd2lsbCBoYXZlIGEgc3RhbGUgdmlldyBvZiB0aGUgQVNUIGFuZCBpdHMgcHJvYmxlbXMuIFVzZQogICogdGhlIGNvbXBpbGF0aW9uIHBhcnRpY2lwYW50IGV4dGVuc2lvbiBwb2ludCB0byBvcmRlciB0aGUgcGFydGljaXBhbnRzLgogICogPC9wPgogICovCkBAIC0xNzcsMTAgKzIyNywxMCBAQAogICogZm9yIHRoZSBnaXZlbiBtYXJrZXIgdHlwZS4KICAqIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IG5vIHByb2JsZW1zIG5lZWQgdG8gYmUgcmVwb3J0ZWQuCiAgKiA8cD4KLSAqIFVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSwgYSBwYXJ0aWNpcGFudCB0aGF0IHJlc29sdmVzIHByb2JsZW1zIGZvciBhIGdpdmVuIG1hcmtlciB0eXBlIAorICogVXNpbmcgdGhpcyBmdW5jdGlvbmFsaXR5LCBhIHBhcnRpY2lwYW50IHRoYXQgcmVzb2x2ZXMgcHJvYmxlbXMgZm9yIGEgZ2l2ZW4gbWFya2VyIHR5cGUKICAqIGNhbiBoaWRlIHRob3NlIHByb2JsZW1zIHNpbmNlIHRoZXkgZG9uJ3QgZXhpc3QgYW55IGxvbmdlci4KICAqIDwvcD4KLSAqIAorICoKICAqIEBwYXJhbSBtYXJrZXJUeXBlIHRoZSBtYXJrZXIgdHlwZSBvZiB0aGUgZ2l2ZW4gcHJvYmxlbXMKICAqIEBwYXJhbSBwcm9ibGVtcyAgdGhlIHByb2JsZW1zIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSBwcm9ibGVtIHJlcXVlc3RvciBvZiB0aGUgcmVjb25jaWxlIG9wZXJhdGlvbiwKICAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUNvZGVTbmlwcGV0UmVxdWVzdG9yLmphdmEKaW5kZXggZDliZTRiMS4uZTRhN2E4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lDb2RlU25pcHBldFJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDggKzE0LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5FdmFsdWF0aW9uQ29uc3RhbnRzOwogCiAvKioKLSAqIEEgY29kZSBzbmlwcGV0IHJlcXVlc3RvciBpbXBsZW1lbnRzIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBpbnN0YWxsaW5nIAotICogdGhlIGNsYXNzIGZpbGVzIGZvciBhIGNvZGUgc25pcHBldCBvbiB0aGUgdGFyZ2V0IGFuZCBydW5uaW5nIGl0LiAKKyAqIEEgY29kZSBzbmlwcGV0IHJlcXVlc3RvciBpbXBsZW1lbnRzIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBpbnN0YWxsaW5nCisgKiB0aGUgY2xhc3MgZmlsZXMgZm9yIGEgY29kZSBzbmlwcGV0IG9uIHRoZSB0YXJnZXQgYW5kIHJ1bm5pbmcgaXQuCiAgKiBJbiBhZGRpdGlvbiwgaXQgcmVjZWl2ZXMgY29tcGlsYXRpb24gcHJvYmxlbXMgZGV0ZWN0ZWQgZHVyaW5nIGNvZGUgc25pcHBldAogICogY29tcGlsYXRpb24uCiAgKiA8cD4KQEAgLTI2LDcgKzI2LDcgQEAKICAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I2V2YWx1YXRlQ29kZVNuaXBwZXQoU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nW10sIGludFtdLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSwgYm9vbGVhbiwgYm9vbGVhbiwgSUNvZGVTbmlwcGV0UmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKICAqLwogcHVibGljIGludGVyZmFjZSBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IgewotCQorCiAJLyoqCiAJICogVGhlIHByZWZpeCBvZiBmaWVsZHMgdGhhdCByZXByZXNlbnQgdGhlIGxvY2FsIHZhcmlhYmxlcyBpbiBhIHNuaXBwZXQKIAkgKiBjbGFzcy4KQEAgLTM5LDIxICszOSwyMSBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVHQVRFX1RISVMgPSBuZXcgU3RyaW5nKEV2YWx1YXRpb25Db25zdGFudHMuREVMRUdBVEVfVEhJUyk7CiAKLQkvKiogCi0JICogVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIG1ldGhvZCBpbiB0aGUgc25pcHBldCBjbGFzcyB0aGF0IHJ1bnMgdGhlIGNvZGUgCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIG1ldGhvZCBpbiB0aGUgc25pcHBldCBjbGFzcyB0aGF0IHJ1bnMgdGhlIGNvZGUKIAkgKiBzbmlwcGV0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9NRVRIT0QgPSBFdmFsdWF0aW9uQ29uc3RhbnRzLlJVTl9NRVRIT0Q7CiAKIAkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4pIG9uIHRoZSBjb2RlIAorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAob2YgdHlwZSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPikgb24gdGhlIGNvZGUKIAkgKiBzbmlwcGV0IGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHJldHVybmVkIHZhbHVlLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9WQUxVRV9GSUVMRCA9IEV2YWx1YXRpb25Db25zdGFudHMuUkVTVUxUX1ZBTFVFX0ZJRUxEOwogCiAJLyoqCiAJICogVGhlIGZpZWxkIG9mIHR5cGUgamF2YS5sYW5nLkNsYXNzIG9uIHRoZSBjb2RlIHNuaXBwZXQgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUuCi0JICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIChvZiB0eXBlIDxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4pIG9uIHRoZSBjb2RlIAorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAob2YgdHlwZSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+KSBvbiB0aGUgY29kZQogCSAqIHNuaXBwZXQgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfVFlQRV9GSUVMRCA9IEV2YWx1YXRpb25Db25zdGFudHMuUkVTVUxUX1RZUEVfRklFTEQ7CkBAIC02MSwxMyArNjEsMTMgQEAKIAkvKgogCSAqIFJFUE9SVElORyBBIFBST0JMRU0gT0YgQ09NUElMQVRJT04gSU4gVEhFIENPREUgU05JUFBFVAogCSAqLwotCSAKKwogCS8qKgogCSAqIEluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHByb2JsZW0gcmVsYXRlZCB0byBhIGdsb2JhbCB2YXJpYWJsZS4KIAkgKiA8cD4KIAkgKiBOb3RlOiBpZiB0aGUgcHJvYmxlbSBpcyBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUsIHRoZSBtYXJrZXIKIAkgKiBzb3VyY2UgbGluZSBudW1iZXIgaXMgLTE7IGlmIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSwgbGluZSBudW1iZXIgaXMgMDsKLQkgKiBvdGhlcndpc2UsIHRoZSBtYXJrZXIgc291cmNlIGxpbmUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBpbml0aWFsaXplciAKKwkgKiBvdGhlcndpc2UsIHRoZSBtYXJrZXIgc291cmNlIGxpbmUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBpbml0aWFsaXplcgogCSAqIGNvZGUuCiAJICogPC9wPgogCSAqCkBAIC0xMDEsMjkgKzEwMSwyOSBAQAogCSAqCiAJICogQHNlZSAjYWNjZXB0UHJvYmxlbShJTWFya2VyLCBTdHJpbmcsIGludCkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTCA9IDU7CQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTCA9IDU7CiAvKioKICAqIFNlbmRzIHRoZSBnaXZlbiBjbGFzcyBmaWxlcyB0byB0aGUgdGFyZ2V0IGFuZCBsb2FkcyB0aGVtLiBJZiB0aGUgZ2l2ZW4KICAqIGNsYXNzIG5hbWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBydW4gdGhlIGNvZGUgc25pcHBldCB3aXRoIHRoaXMgY2xhc3MKLSAqIG5hbWUuIFJldHVybnMgd2hldGhlciB0aGUgY29kZSBzbmlwcGV0IGNvdWxkIGJlIGRlcGxveWVkLiBOb3RlIGl0IG11c3QgCisgKiBuYW1lLiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvZGUgc25pcHBldCBjb3VsZCBiZSBkZXBsb3llZC4gTm90ZSBpdCBtdXN0CiAgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZXZlbiBpZiBydW5uaW5nIHRoZSBjb2RlIHNuaXBwZXQgdGhyZXcgYW4gZXhjZXB0aW9uLgogICogPHA+Ci0gKiBUaGUgZGV0YWlscyBvZiBzZW5kaW5nIGFuZCBsb2FkaW5nIHRoZSBjbGFzcyBmaWxlcyBhcmUgbGVmdCB1cCB0byAKKyAqIFRoZSBkZXRhaWxzIG9mIHNlbmRpbmcgYW5kIGxvYWRpbmcgdGhlIGNsYXNzIGZpbGVzIGFyZSBsZWZ0IHVwIHRvCiAgKiBpbXBsZW1lbnRhdGlvbnMuCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRvIHJ1biBhIGNvZGUgc25pcHBldCwgYW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiAKLSAqIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQgY2xhc3MgYW5kIGNhbGwgKGRpcmVjdGx5IG9yIHVzaW5nIGFub3RoZXIgbWVhbnMpIGl0cyAKKyAqIFRvIHJ1biBhIGNvZGUgc25pcHBldCwgYW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIGNvZGUgc25pcHBldCBjbGFzcyBhbmQgY2FsbCAoZGlyZWN0bHkgb3IgdXNpbmcgYW5vdGhlciBtZWFucykgaXRzCiAgKiA8Y29kZT5SVU5fTUVUSE9EPC9jb2RlPi4KICAqIDwvcD4KICAqIDxwPgotICogQWxzbyBiZWZvcmUgdGhlIGNhbGwsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY29weSB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCAKLSAqIHZhcmlhYmxlcyAoaWYgYW55KSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLiAKLSAqIEEgZmllbGQgbmFtZSBpcyBmb3JtZWQgb2YgPGNvZGU+TE9DQUxfVkFSX1BSRUZJWDwvY29kZT4gCi0gKiBwcmVjZWRlZCB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuIEZvciBleGFtcGxlLCB0aGUgZmllbGQgbmFtZSBmb3IgCi0gKiBsb2NhbCB2YXJpYWJsZSA8Y29kZT4ibXlMb2NhbCI8L2NvZGU+IGlzIDxjb2RlPiJ2YWwkbXlMb2NhbCI8L2NvZGU+IChhc3N1bWluZyB0aGUgCi0gKiB2YWx1ZSBvZiA8Y29kZT5MT0NBTF9WQVJfUFJFRklYPC9jb2RlPiBpcyAidmFsJCIpLiBJbiB0aGUgCi0gKiBzYW1lIHdheSwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBjb3B5IHRoZSB2YWx1ZSBvZiB0aGUgJ3RoaXMnIG9iamVjdCBpbnRvIHRoZSAKKyAqIEFsc28gYmVmb3JlIHRoZSBjYWxsLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGNvcHkgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwKKyAqIHZhcmlhYmxlcyAoaWYgYW55KSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLgorICogQSBmaWVsZCBuYW1lIGlzIGZvcm1lZCBvZiA8Y29kZT5MT0NBTF9WQVJfUFJFRklYPC9jb2RlPgorICogcHJlY2VkZWQgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgdGhlIGZpZWxkIG5hbWUgZm9yCisgKiBsb2NhbCB2YXJpYWJsZSA8Y29kZT4ibXlMb2NhbCI8L2NvZGU+IGlzIDxjb2RlPiJ2YWwkbXlMb2NhbCI8L2NvZGU+IChhc3N1bWluZyB0aGUKKyAqIHZhbHVlIG9mIDxjb2RlPkxPQ0FMX1ZBUl9QUkVGSVg8L2NvZGU+IGlzICJ2YWwkIikuIEluIHRoZQorICogc2FtZSB3YXksIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY29weSB0aGUgdmFsdWUgb2YgdGhlICd0aGlzJyBvYmplY3QgaW50byB0aGUKICAqIGZpZWxkIGNhbGxlZCA8Y29kZT5ERUxFR0FURV9USElTPC9jb2RlPi4KICAqIDwvcD4KICAqIDxwPgpAQCAtMTMyLDE1ICsxMzIsMTUgQEAKICAqIHZhbHVlcyBvZiB0aGUgZmllbGRzIGJhY2sgaW50byB0aGUgbG9jYWwgdmFyaWFibGVzLgogICogPC9wPgogICogPHA+Ci0gKiBGaW5hbGx5LCB0aGUgb3ZlcmFsbCB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZSBzbmlwcGV0IGNhbiBiZSByZXRyaWV2ZWQgCi0gKiBmcm9tIHRoZSBzcGVjaWFsIGZpZWxkIDxjb2RlPlJFU1VMVF9WQUxVRV9GSUVMRDwvY29kZT4gCi0gKiBvbiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLiAKKyAqIEZpbmFsbHksIHRoZSBvdmVyYWxsIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlIHNuaXBwZXQgY2FuIGJlIHJldHJpZXZlZAorICogZnJvbSB0aGUgc3BlY2lhbCBmaWVsZCA8Y29kZT5SRVNVTFRfVkFMVUVfRklFTEQ8L2NvZGU+CisgKiBvbiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLgogICogVGhlIDxjb2RlPkNsYXNzPC9jb2RlPiB0aGF0IGlzIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZQogICogcmV0cmlldmVkIGZyb20gdGhlIHNwZWNpYWwgZmllbGQgPGNvZGU+UkVTVUxUX1RZUEVfRklFTEQ8L2NvZGU+LgogICogPC9wPgogICoKICAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyB0aGUgbGlzdCBvZiBjbGFzcyBmaWxlIGJ5dGVzCi0gKiBAcGFyYW0gY2xhc3NGaWxlQ29tcG91bmROYW1lcyB0aGUgY29ycmVzcG9uZGluZyBsaXN0IG9mIGNsYXNzIGZpbGUgdHlwZSAKKyAqIEBwYXJhbSBjbGFzc0ZpbGVDb21wb3VuZE5hbWVzIHRoZSBjb3JyZXNwb25kaW5nIGxpc3Qgb2YgY2xhc3MgZmlsZSB0eXBlCiAgKiAgIGNvbXBvdW5kIG5hbWVzIChleGFtcGxlIG9mIGEgY29tcG91bmQgbmFtZTogeyJqYXZhIiwgImxhbmciLCAiT2JqZWN0In0pCiAgKiBAcGFyYW0gY29kZVNuaXBwZXRDbGFzc05hbWUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIHRvIGluc3RhbnRpYXRlIGFuZCBydW4sCiAgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKQEAgLTE1Niw3ICsxNTYsNyBAQAogICogICAgIHZhcmlhYmxlPC9saT4KICAqICAgPGxpPmNvZGUgc25pcHBldCAoPGNvZGU+Q09ERV9TTklQUEVUPC9jb2RlPikgLSBmcmFnbWVudCBzb3VyY2UgaXMgY29kZQogICogICAgIHNuaXBwZXQ8L2xpPgotICogICA8bGk+aW1wb3J0IGRlY2xhcmF0aW9uICg8Y29kZT5JTVBPUlQ8L2NvZGU+KSAtIGZyYWdtZW50IHNvdXJjZSBpcyAKKyAqICAgPGxpPmltcG9ydCBkZWNsYXJhdGlvbiAoPGNvZGU+SU1QT1JUPC9jb2RlPikgLSBmcmFnbWVudCBzb3VyY2UgaXMKICAqICAgICBpbXBvcnQ8L2xpPgogICogICA8bGk+cGFja2FnZSBkZWNsYXJhdGlvbiAoPGNvZGU+UEFDS0FHRTwvY29kZT4pIC0gZnJhZ21lbnQgc291cmNlIGlzCiAgKiAgICAgcGFja2FnZSBkZWNsYXJhdGlvbjwvbGk+CkBAIC0xNjUsNyArMTY1LDcgQEAKICAqIDwvcD4KICAqIEBwYXJhbSBwcm9ibGVtTWFya2VyIHRoZSBwcm9ibGVtIG1hcmtlciAoY2Fubm90IGJlIG51bGwpCiAgKiBAcGFyYW0gZnJhZ21lbnRTb3VyY2UgdGhlIGZyYWdtZW50IHNvdXJjZQotICogQHBhcmFtIGZyYWdtZW50S2luZCB0aGUga2luZCBvZiBzb3VyY2UgZnJhZ21lbnQ7IG9uZSBvZjogCisgKiBAcGFyYW0gZnJhZ21lbnRLaW5kIHRoZSBraW5kIG9mIHNvdXJjZSBmcmFnbWVudDsgb25lIG9mOgogICogICA8Y29kZT5WQVJJQUJMRTwvY29kZT4sIDxjb2RlPkNPREVfU05JUFBFVDwvY29kZT4sIDxjb2RlPklNUE9SVDwvY29kZT4sCiAgKiAgIDxjb2RlPlBBQ0tBR0U8L2NvZGU+LCBvciA8Y29kZT5JTlRFUk5BTDwvY29kZT4KICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JRXZhbHVhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUV2YWx1YXRpb25Db250ZXh0LmphdmEKaW5kZXggMWY0NDIzMC4uNDJmZjM0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JRXZhbHVhdGlvbkNvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lFdmFsdWF0aW9uQ29udGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDExICsyMSwxMSBAQAogICogQW4gZXZhbHVhdGlvbiBjb250ZXh0IHN1cHBvcnRzIGV2YWx1YXRpbmcgY29kZSBzbmlwcGV0cy4KICAqIDxwPgogICogQSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IG11Y2ggYW55IHZhbGlkIHBpZWNlIG9mIEphdmEgY29kZSB0aGF0IGNvdWxkIGJlCi0gKiBwYXN0ZWQgaW50byB0aGUgYm9keSBvZiBhIG1ldGhvZCBhbmQgY29tcGlsZWQuIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gCisgKiBwYXN0ZWQgaW50byB0aGUgYm9keSBvZiBhIG1ldGhvZCBhbmQgY29tcGlsZWQuIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28KICAqIGFyZWFzIHdoZXJlIHRoZSBydWxlcyBhcmUgc2xpZ2h0bHkgbW9yZSBsaWJlcmFsLgogICogPHA+CiAgKiBGaXJzdCwgYSBjb2RlIHNuaXBwZXQgY2FuIHJldHVybiBoZXRlcm9nZW5lb3VzIHR5cGVzLiBJbnNpZGUgdGhlIHNhbWUgY29kZQotICogc25pcHBldCBhbiA8Y29kZT5pbnQ8L2NvZGU+IGNvdWxkIGJlIHJldHVybmVkIG9uIG9uZSBsaW5lLCBhbmQgYSAKKyAqIHNuaXBwZXQgYW4gPGNvZGU+aW50PC9jb2RlPiBjb3VsZCBiZSByZXR1cm5lZCBvbiBvbmUgbGluZSwgYW5kIGEKICAqIDxjb2RlPlN0cmluZzwvY29kZT4gb24gdGhlIG5leHQsIGV0Yy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd291bGQgYmUKICAqIGNvbnNpZGVyZWQgYSB2YWxpZCBjb2RlIHNuaXBwZXQ6CiAgKiA8cHJlPgpAQCAtNDEsOCArNDEsOCBAQAogICogPC9wcmU+CiAgKiA8L3A+CiAgKiA8cD4KLSAqIFNlY29uZCwgaWYgdGhlIGxhc3Qgc3RhdGVtZW50IGlzIG9ubHkgYW4gZXhwcmVzc2lvbiwgdGhlIDxjb2RlPnJldHVybjwvY29kZT4gCi0gKiBrZXl3b3JkIGlzIGltcGxpZWQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+OiAKKyAqIFNlY29uZCwgaWYgdGhlIGxhc3Qgc3RhdGVtZW50IGlzIG9ubHkgYW4gZXhwcmVzc2lvbiwgdGhlIDxjb2RlPnJldHVybjwvY29kZT4KKyAqIGtleXdvcmQgaXMgaW1wbGllZC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT46CiAgKiA8cHJlPgogICogPGNvZGU+CiAgKiBpbnQgaSA9IDE7CkBAIC03OSwxMiArNzksMTIgQEAKICAqIDwvcHJlPgogICogPC9wPgogICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCiAgKiA8Y29kZT5JSmF2YVByb2plY3QubmV3RXZhbHVhdGlvbkNvbnRleHQ8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhbgogICogaW5zdGFuY2UuCiAgKiA8L3A+CiAgKgogICogQHNlZSBJSmF2YVByb2plY3QjbmV3RXZhbHVhdGlvbkNvbnRleHQoKQorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElFdmFsdWF0aW9uQ29udGV4dCB7CiAJLyoqCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkvKioKIAkgKiBQZXJmb3JtcyBhIGNvZGUgY29tcGxldGlvbiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIGNvZGUgc25pcHBldCwKIAkgKiByZXBvcnRpbmcgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IuCi0JICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsIAorCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLAogCSAqIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKIAkgKiBpbiB0aGUgd29ya3NwYWNlLgogCSAqIDxwPgpAQCAtMTc3LDEwICsxNzcsNTggQEAKIAkJaW50IHBvc2l0aW9uLAogCQlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKIAkvKioKIAkgKiBQZXJmb3JtcyBhIGNvZGUgY29tcGxldGlvbiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIGNvZGUgc25pcHBldCwKIAkgKiByZXBvcnRpbmcgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IuCi0JICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsIAorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBjb2RlIGNvbXBsZXRpb24gZG9lcyBub3QgaW52b2x2ZSBldmFsdWF0aW9uLgorCSAqIDxwPgorCSAqIDxwPgorCSAqIElmIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBzb21lIHByb3Bvc2FscyB3aGljaAorCSAqIGNhbiBiZSB2ZXJ5IGxvbmcgdG8gY29tcHV0ZSBhcmUgcHJvcG9zZWQuIFRvIGF2b2lkIHRoYXQgdGhlIGNvZGUgYXNzaXN0IG9wZXJhdGlvbgorCSAqIHRha2UgdG9vIG11Y2ggdGltZSBhIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB3aGljaCBhdXRvbWF0aWNhbGx5IGNhbmNlbCB0aGUgY29kZQorCSAqIGFzc2lzdCBvcGVyYXRpb24gd2hlbiBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBpcyByZWFjaGVkIGNvdWxkIGJlIHVzZWQuCisJICogCisJICogPHByZT4KKwkgKiBuZXcgSVByb2dyZXNzTW9uaXRvcigpIHsKKwkgKiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVPVVQgPSA1MDA7IC8vbXMKKwkgKiAgICAgcHJpdmF0ZSBsb25nIGVuZFRpbWU7CisJICogICAgIHB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgeworCSAqICAgICAgICAgZkVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKKwkgKiAgICAgfQorCSAqICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCSAqICAgICAgICAgcmV0dXJuIGVuZFRpbWUgPD0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJICogICAgIH0KKwkgKiAgICAgLi4uCisJICogfTsKKwkgKiA8L3ByZT4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBjb2RlU25pcHBldCB0aGUgY29kZSBzbmlwcGV0IHRvIGNvbXBsZXRlIGluCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGNvZGUgc25pcHBldCB0byBjb21wbGV0ZSBhdCwKKwkgKiAgIG9yIC0xIGluZGljYXRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgc25pcHBldAorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvZGUgY29tcGxldGlvbiByZXF1ZXN0b3IgY2FwYWJsZSBvZiBhY2NlcHRpbmcgYWxsCisJICogICAgcG9zc2libGUgdHlwZXMgb2YgY29tcGxldGlvbnMKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcworCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgY29tcGxldGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLiBSZWFzb25zIGluY2x1ZGU6CisJICogIDx1bD4KKwkgKgkgIDxsaT5UaGUgcG9zaXRpb24gc3BlY2lmaWVkIGlzIGxlc3MgdGhhbiAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhlIHNuaXBwZXQncworCSAqCSAgICBsZW5ndGggKElOREVYX09VVF9PRl9CT1VORFMpPC9saT4KKwkgKiAgPC91bD4KKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKAorCQlTdHJpbmcgY29kZVNuaXBwZXQsCisJCWludCBwb3NpdGlvbiwKKwkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBQZXJmb3JtcyBhIGNvZGUgY29tcGxldGlvbiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGdpdmVuIGNvZGUgc25pcHBldCwKKwkgKiByZXBvcnRpbmcgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IuCisJICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsCiAJICogdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cwogCSAqIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CkBAIC0yMTAsNiArMjU4LDYzIEBACiAJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAogCQlXb3JraW5nQ29weU93bmVyIG93bmVyKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIFBlcmZvcm1zIGEgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0LAorCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4KKwkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywKKwkgKiB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogaW4gdGhlIHdvcmtzcGFjZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgaWYgYSB3b3JraW5nIGNvcHkgaXMgZW1wdHksIGl0IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCisJICogdW5pdCBoYWQgYmVlbiBkZWxldGVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgY29kZSBjb21wbGV0aW9uIGRvZXMgbm90IGludm9sdmUgZXZhbHVhdGlvbi4KKwkgKiA8cD4KKwkgKiA8cD4KKwkgKiBJZiB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gc29tZSBwcm9wb3NhbHMgd2hpY2gKKwkgKiBjYW4gYmUgdmVyeSBsb25nIHRvIGNvbXB1dGUgYXJlIHByb3Bvc2VkLiBUbyBhdm9pZCB0aGF0IHRoZSBjb2RlIGFzc2lzdCBvcGVyYXRpb24KKwkgKiB0YWtlIHRvbyBtdWNoIHRpbWUgYSB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0gd2hpY2ggYXV0b21hdGljYWxseSBjYW5jZWwgdGhlIGNvZGUKKwkgKiBhc3Npc3Qgb3BlcmF0aW9uIHdoZW4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaXMgcmVhY2hlZCBjb3VsZCBiZSB1c2VkLgorCSAqIAorCSAqIDxwcmU+CisJICogbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisJICogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBUSU1FT1VUID0gNTAwOyAvL21zCisJICogICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lOworCSAqICAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKwkgKiAgICAgICAgIGZFbmRUaW1lPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7CisJICogICAgIH0KKwkgKiAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKwkgKiAgICAgICAgIHJldHVybiBlbmRUaW1lIDw9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCSAqICAgICB9CisJICogICAgIC4uLgorCSAqIH07CisJICogPC9wcmU+CisJICogPHA+CisJICoKKwkgKiBAcGFyYW0gY29kZVNuaXBwZXQgdGhlIGNvZGUgc25pcHBldCB0byBjb21wbGV0ZSBpbgorCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBjb2RlIHNuaXBwZXQgdG8gY29tcGxldGUgYXQsCisJICogICBvciAtMSBpbmRpY2F0aW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNuaXBwZXQKKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBjb2RlIGNvbXBsZXRpb24gcmVxdWVzdG9yIGNhcGFibGUgb2YgYWNjZXB0aW5nIGFsbAorCSAqICAgIHBvc3NpYmxlIHR5cGVzIG9mIGNvbXBsZXRpb25zCisJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBjb2RlIGNvbXBsZXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqICA8dWw+CisJICoJICA8bGk+VGhlIHBvc2l0aW9uIHNwZWNpZmllZCBpcyBsZXNzIHRoYW4gLTEgb3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBzbmlwcGV0J3MKKwkgKgkgICAgbGVuZ3RoIChJTkRFWF9PVVRfT0ZfQk9VTkRTKTwvbGk+CisJICogIDwvdWw+CisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZSgKKwkJU3RyaW5nIGNvZGVTbmlwcGV0LAorCQlpbnQgcG9zaXRpb24sCisJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlXb3JraW5nQ29weU93bmVyIG93bmVyLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCiAJLyoqCiAJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgYSBjb2xsZWN0aW9uIG9mIEphdmEgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgc291cmNlCiAJICogY29kZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb25zIGluIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQuCkBAIC0yMzUsNyArMzQwLDcgQEAKIAkvKioKIAkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgSmF2YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzb3VyY2UKIAkgKiBjb2RlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbnMgaW4gdGhlIGdpdmVuIGNvZGUgc25pcHBldC4KLQkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywgCisJICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsCiAJICogdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cwogCSAqIGluIHRoZSB3b3Jrc3BhY2UuCiAJICogPHA+CkBAIC0yNzMsMTQgKzM3OCwxNCBAQAogCS8qKgogCSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0IGluIHRoZSBjb250ZXh0IG9mIGEgc3VzcGVuZGVkIHRocmVhZC4KIAkgKiBUaGUgY29kZSBzbmlwcGV0IGlzIGNvbXBpbGVkIGFsb25nIHdpdGggdGhpcyBjb250ZXh0J3MgcGFja2FnZSBkZWNsYXJhdGlvbiwKLQkgKiBpbXBvcnRzLCBhbmQgZ2xvYmFsIHZhcmlhYmxlcy4gVGhlIGdpdmVuIHJlcXVlc3RvcidzIAorCSAqIGltcG9ydHMsIGFuZCBnbG9iYWwgdmFyaWFibGVzLiBUaGUgZ2l2ZW4gcmVxdWVzdG9yJ3MKIAkgKiA8Y29kZT5hY2NlcHRQcm9ibGVtPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIGNvbXBpbGF0aW9uIHByb2JsZW0gdGhhdAotCSAqIGlzIGRldGVjdGVkLiBUaGVuIHRoZSByZXN1bHRpbmcgY2xhc3MgZmlsZXMgYXJlIGhhbmRlZCB0byB0aGUgZ2l2ZW4gCisJICogaXMgZGV0ZWN0ZWQuIFRoZW4gdGhlIHJlc3VsdGluZyBjbGFzcyBmaWxlcyBhcmUgaGFuZGVkIHRvIHRoZSBnaXZlbgogCSAqIHJlcXVlc3RvcidzIDxjb2RlPmFjY2VwdENsYXNzRmlsZXM8L2NvZGU+IG1ldGhvZCB0byBkZXBsb3kgYW5kIHJ1bi4KIAkgKiA8cD4KIAkgKiBUaGUgcmVxdWVzdG9yIGlzIGV4cGVjdGVkIHRvOgogCSAqIDxvbD4KLQkgKiAgIDxsaT5zZW5kIHRoZSBjbGFzcyBmaWxlcyB0byB0aGUgdGFyZ2V0IFZNLCAKKwkgKiAgIDxsaT5zZW5kIHRoZSBjbGFzcyBmaWxlcyB0byB0aGUgdGFyZ2V0IFZNLAogCSAqICAgPGxpPmxvYWQgdGhlbSAoc3RhcnRpbmcgd2l0aCB0aGUgY29kZSBzbmlwcGV0IGNsYXNzKSwKIAkgKiAgIDxsaT5jcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvZGUgc25pcHBldCBjbGFzcywKIAkgKiAgIDxsaT5ydW4gdGhlIG1ldGhvZCA8Y29kZT5ydW4oKTwvY29kZT4gb2YgdGhlIGNvZGUgc25pcHBldCwKQEAgLTMyMyw3ICs0MjgsNyBAQAogCSAqIGlzIGNhbGxlZCBmb3IgZWFjaCBjb21waWxhdGlvbiBwcm9ibGVtIHRoYXQgaXMgZGV0ZWN0ZWQuIFRoZW4gdGhlIHJlc3VsdGluZwogCSAqIGNsYXNzIGZpbGVzIGFyZSBoYW5kZWQgdG8gdGhlIGdpdmVuIHJlcXVlc3RvcidzIDxjb2RlPmFjY2VwdENsYXNzRmlsZXM8L2NvZGU+CiAJICogbWV0aG9kIHRvIGRlcGxveSBhbmQgcnVuLiBUaGUgcmVxdWVzdG9yIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlCi0JICogcmVzdWx0IGJhY2suIAorCSAqIHJlc3VsdCBiYWNrLgogCSAqIDxwPgogCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKIAkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KQEAgLTM0MSw4ICs0NDYsOCBAQAogCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKLQkgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGdsb2JhbCB2YXJpYWJsZS4gRHVyaW5nIHRoaXMgb3BlcmF0aW9uLCAKLQkgKiB0aGlzIGNvbnRleHQncyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBpbXBvcnRzLCBhbmQgPGk+YWxsPC9pPiBpdHMgZGVjbGFyZWQgCisJICogRXZhbHVhdGVzIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGUuIER1cmluZyB0aGlzIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGNvbnRleHQncyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBpbXBvcnRzLCBhbmQgPGk+YWxsPC9pPiBpdHMgZGVjbGFyZWQKIAkgKiB2YXJpYWJsZXMgYXJlIHZlcmlmaWVkLiBUaGUgZ2l2ZW4gcmVxdWVzdG9yJ3MgPGNvZGU+YWNjZXB0UHJvYmxlbTwvY29kZT4KIAkgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcHJvYmxlbSB0aGF0IGlzIGRldGVjdGVkLgogCSAqIDxwPgpAQCAtMzg5LDcgKzQ5NCw3IEBACiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdHlwZSwgYW5kIGluaXRpYWxpemVyLgogCSAqIDxwPgotCSAqIFRoZSA8Y29kZT50eXBlTmFtZTwvY29kZT4gYW5kIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBhcmUgaW50ZXJwcmV0ZWQgaW4gCisJICogVGhlIDxjb2RlPnR5cGVOYW1lPC9jb2RlPiBhbmQgPGNvZGU+aW5pdGlhbGl6ZXI8L2NvZGU+IGFyZSBpbnRlcnByZXRlZCBpbgogCSAqIHRoZSBjb250ZXh0IG9mIHRoaXMgY29udGV4dCdzIHBhY2thZ2UgYW5kIGltcG9ydCBkZWNsYXJhdGlvbnMuCiAJICogPC9wPgogCSogPHA+CkBAIC00MDgsNyArNTEzLDcgQEAKIAkJU3RyaW5nIGluaXRpYWxpemVyKTsKIAkvKioKIAkgKiBTZXRzIHRoZSBpbXBvcnQgZGVjbGFyYXRpb25zIGZvciB0aGlzIGV2YWx1YXRpb24gY29udGV4dC4gQW4gZW1wdHkKLQkgKiBsaXN0IGluZGljYXRlcyB0aGVyZSBhcmUgbm8gaW1wb3J0cy4gVGhlIHN5bnRheCBmb3IgdGhlIGltcG9ydCBjb3JyZXNwb25kcyB0byBhIAorCSAqIGxpc3QgaW5kaWNhdGVzIHRoZXJlIGFyZSBubyBpbXBvcnRzLiBUaGUgc3ludGF4IGZvciB0aGUgaW1wb3J0IGNvcnJlc3BvbmRzIHRvIGEKIAkgKiBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lLCBvciB0byBhbiBvbi1kZW1hbmQgcGFja2FnZSBuYW1lIGFzIGRlZmluZWQgYnkKIAkgKiBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLiBGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEudXRpbC5IYXNodGFibGUiPC9jb2RlPgogCSAqIG9yIDxjb2RlPiJqYXZhLnV0aWwuKiI8L2NvZGU+LgpAQCAtNDE3LDEwICs1MjIsMTAgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRJbXBvcnRzKFN0cmluZ1tdIGltcG9ydHMpOwogCS8qKgotCSAqIFNldHMgdGhlIGRvdC1zZXBhcmF0ZWQgbmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCBjb2RlIHNuaXBwZXRzIGFyZSAKKwkgKiBTZXRzIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggY29kZSBzbmlwcGV0cyBhcmUKIAkgKiB0byBiZSBjb21waWxlZCBhbmQgcnVuLiBGb3IgZXhhbXBsZSwgPGNvZGU+ImNvbS5leGFtcGxlLm15YXBwIjwvY29kZT4uCiAJICoKLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIGRvdC1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lLCBvciB0aGUgZW1wdHkgc3RyaW5nIAorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcKIAkgKiAgIGluZGljYXRpbmcgdGhlIGRlZmF1bHQgcGFja2FnZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lHbG9iYWxWYXJpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JR2xvYmFsVmFyaWFibGUuamF2YQppbmRleCAwYTU3ZmE4Li5iZWZkM2M1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lHbG9iYWxWYXJpYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUdsb2JhbFZhcmlhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTYgKzEyLDE1IEBACiAKIC8qKgogICogQSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgaW4gYW4gZXZhbHVhdGlvbiBjb250ZXh0LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiA8Y29kZT5JRXZhbHVhdGlvbkNvbnRleHQubmV3VmFyaWFibGU8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhbiBpbnN0YW5jZS4KKyAqIDxwPjxjb2RlPklFdmFsdWF0aW9uQ29udGV4dC5uZXdWYXJpYWJsZTwvY29kZT4gY2FuIGJlIHVzZWQgdG8gb2J0YWluIGFuIGluc3RhbmNlLgogICogPC9wPgogICoKICAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I25ld1ZhcmlhYmxlKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUdsb2JhbFZhcmlhYmxlIHsKIC8qKgotICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhpcyBnbG9iYWwgdmFyaWFibGUuIAorICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhpcyBnbG9iYWwgdmFyaWFibGUuCiAgKiBUaGUgc3ludGF4IGZvciBhbiBpbml0aWFsaXplciBjb3JyZXNwb25kcyB0byBWYXJpYWJsZUluaXRpYWxpemVyIChKTFMyIDguMykuCiAgKgogICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBnbG9iYWwgZG9lcwpAQCAtMzYsNyArMzUsNyBAQAogcHVibGljIFN0cmluZyBnZXROYW1lKCk7CiAvKioKICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgZ2xvYmFsCi0gKiB2YXJpYWJsZSwgb3IgaXRzIHNpbXBsZSByZXByZXNlbnRhdGlvbiBpZiBpdCBpcyBhIHByaW1pdGl2ZSB0eXBlIAorICogdmFyaWFibGUsIG9yIGl0cyBzaW1wbGUgcmVwcmVzZW50YXRpb24gaWYgaXQgaXMgYSBwcmltaXRpdmUgdHlwZQogICogKDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmJvb2xlYW48L2NvZGU+LCBldGMuKS4KICAqIDxwPgogICogVGhlIHN5bnRheCBmb3IgYSB0eXBlIG5hbWUgY29ycmVzcG9uZHMgdG8gVHlwZSBpbiBGaWVsZCBEZWNsYXJhdGlvbiAoSkxTMiA4LjMpLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRXhjZXB0aW9uLmphdmEKaW5kZXggNWFkZDA3NS4uZGE4NDRmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01FeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE4ICsxMSwxOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOwogCiAvKioKLSAqIFVuY2hlY2tlZCBleGNlcHRpb24gdGhyb3duIHdoZW4gYW4gaWxsZWdhbCBtYW5pcHVsYXRpb24gb2YgdGhlIEpET00gaXMgCisgKiBVbmNoZWNrZWQgZXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGlsbGVnYWwgbWFuaXB1bGF0aW9uIG9mIHRoZSBKRE9NIGlzCiAgKiBwZXJmb3JtZWQsIG9yIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFjY2Vzcy9zZXQgYW4gYXR0cmlidXRlIG9mIGEKICAqIEpET00gbm9kZSB0aGF0IHNvdXJjZSBpbmRleGVzIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZvciAoaW4gY2FzZSB0aGUgc291cmNlCiAgKiB3YXMgc3ludGFjdGljYWxseSBpbmNvcnJlY3QpLgotICogCisgKgogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBET01FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTM2ODUzNTkwNzk1MDMyMDI4TDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQkKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1MzY4NTM1OTA3OTUwMzIwMjhMOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01GYWN0b3J5LmphdmEKaW5kZXggNzc1ZDJkZC4uNzI5Y2Q1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01GYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsMTEgKzE2LDEyIEBACiAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JRE9NRmFjdG9yeTwvY29kZT4sIGFuZCB0aGUgb25seSBtZWFucwogICogb2YgY3JlYXRpbmcgSkRPTXMgYW5kIGRvY3VtZW50IGZyYWdtZW50cy4KICAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KKyAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZC4KICAqIDwvcD4KICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIERPTUZhY3RvcnkgaW1wbGVtZW50cyBJRE9NRmFjdG9yeSB7CiAJU3RyaW5nIGxpbmVTZXBhcmF0b3I7CkBAIC00Myw3ICs0NCw3IEBACiBwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoY2hhcltdIHNvdXJjZUNvZGUsIFN0cmluZyBuYW1lKSAgewogCWlmKHNvdXJjZUNvZGUgPT0gbnVsbCkgewogCQlyZXR1cm4gbnVsbDsKLQl9CQkKKwl9CiAJcmV0dXJuIChuZXcgU2ltcGxlRE9NQnVpbGRlcigpKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlQ29kZSwgbmFtZS50b0NoYXJBcnJheSgpKTsKIH0KIC8qIChub24tSmF2YWRvYykKQEAgLTUyLDcgKzUzLDcgQEAKIHB1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgc291cmNlQ29kZSwgU3RyaW5nIG5hbWUpIHsKIAlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfQkKKwl9CiAJcmV0dXJuIChuZXcgU2ltcGxlRE9NQnVpbGRlcigpKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlQ29kZS50b0NoYXJBcnJheSgpLCBuYW1lLnRvQ2hhckFycmF5KCkpOwogfQogLyogKG5vbi1KYXZhZG9jKQpAQCAtNjcsNyArNjgsNyBAQAogcHVibGljIElET01GaWVsZCBjcmVhdGVGaWVsZChTdHJpbmcgc291cmNlQ29kZSkgewogCWlmKHNvdXJjZUNvZGUgPT0gbnVsbCkgewogCQlyZXR1cm4gbnVsbDsKLQl9CQkKKwl9CiAJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVGaWVsZChzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOwogfQogLyogKG5vbi1KYXZhZG9jKQpAQCAtODIsNyArODMsNyBAQAogcHVibGljIElET01JbXBvcnQgY3JlYXRlSW1wb3J0KFN0cmluZyBzb3VyY2VDb2RlKSB7CiAJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwotCX0JCQorCX0KIAlyZXR1cm4gKG5ldyBET01CdWlsZGVyKCkpLmNyZWF0ZUltcG9ydChzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOwogfQogLyogKG5vbi1KYXZhZG9jKQpAQCAtOTcsNyArOTgsNyBAQAogcHVibGljIElET01Jbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcihTdHJpbmcgc291cmNlQ29kZSkgewogCWlmKHNvdXJjZUNvZGUgPT0gbnVsbCkgewogCQlyZXR1cm4gbnVsbDsKLQl9CQkKKwl9CiAJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVJbml0aWFsaXplcihzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOwogfQogLyogKG5vbi1KYXZhZG9jKQpAQCAtMTEyLDcgKzExMyw3IEBACiBwdWJsaWMgSURPTU1ldGhvZCBjcmVhdGVNZXRob2QoU3RyaW5nIHNvdXJjZUNvZGUpIHsKIAlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfQkJCisJfQogCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlTWV0aG9kKHNvdXJjZUNvZGUudG9DaGFyQXJyYXkoKSk7CiB9CiAvKiAobm9uLUphdmFkb2MpCkBAIC0xMjcsNyArMTI4LDcgQEAKIHB1YmxpYyBJRE9NUGFja2FnZSBjcmVhdGVQYWNrYWdlKFN0cmluZyBzb3VyY2VDb2RlKSB7CiAJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwotCX0JCQorCX0KIAlyZXR1cm4gKG5ldyBET01CdWlsZGVyKCkpLmNyZWF0ZVBhY2thZ2Uoc291cmNlQ29kZS50b0NoYXJBcnJheSgpKTsKIH0KIC8qIChub24tSmF2YWRvYykKQEAgLTE1NCw3ICsxNTUsNyBAQAogcHVibGljIElET01UeXBlIGNyZWF0ZVR5cGUoU3RyaW5nIHNvdXJjZUNvZGUpIHsKIAlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfQkJCisJfQogCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlVHlwZShzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Db21waWxhdGlvblVuaXQuamF2YQppbmRleCBiYThkYTNlLi44MTAzZDgzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Db21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxOCArMTEsMTcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCi0gKiBSZXByZXNlbnRzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSB3aXRoIG9uZSBvZiB0aGUgCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgCi0gKiBKYXZhLWxpa2UgZXh0ZW5zaW9uc30pLiAKLSAqIFRoZSBjb3JyZXNwb25kaW5nIHN5bnRhY3RpYyB1bml0IGlzIENvbXBpbGF0aW9uVW5pdCAoSkxTMiA3LjMpLiAgCisgKiBSZXByZXNlbnRzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSB3aXRoIG9uZSBvZiB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKQorICogSmF2YS1saWtlIGV4dGVuc2lvbnN9KS4KKyAqIFRoZSBjb3JyZXNwb25kaW5nIHN5bnRhY3RpYyB1bml0IGlzIENvbXBpbGF0aW9uVW5pdCAoSkxTMiA3LjMpLgogICogQWxsb3dhYmxlIGNoaWxkIHR5cGVzIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgYXJlIDxjb2RlPklET01QYWNrYWdlPC9jb2RlPiwgPGNvZGU+SURPTUltcG9ydDwvY29kZT4sCiAgKiBhbmQgPGNvZGU+SURPTVR5cGU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJRE9NQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgSURPTU5vZGUgewogLyoqCkBAIC00MCw4ICszOSw4IEBACiAgKiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCiAgKgogICogPHA+VGhlIG5hbWUgb2YgYSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCB0b3AtbGV2ZWwgcHVibGljIHR5cGUKLSAqIGRlZmluZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQsIHN1ZmZpeGVkIHdpdGggb25lIG9mIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKSAKKyAqIGRlZmluZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQsIHN1ZmZpeGVkIHdpdGggb25lIG9mIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpCiAgKiBKYXZhLWxpa2UgZXh0ZW5zaW9uc30uIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QKICAqIHRvcC1sZXZlbCBwdWJsaWMgdHlwZSBkZWZpbmVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCBoYXMgdGhlIG5hbWUgIkhhbm9pIiwKICAqIHRoZW4gbmFtZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgIkhhbm9pLmphdmEiLjwvcD4KQEAgLTY2LDcgKzY1LDcgQEAKIC8qKgogICogVGhlIDxjb2RlPklET01Db21waWxhdGlvbk5vZGU8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KICAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0ICh0aGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHRoZSB0eXBlcyBkZWNsYXJlZCB3aXRoaW4gaXQpLgotICogCisgKgogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqLwogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GYWN0b3J5LmphdmEKaW5kZXggM2I4NDA2Mi4uYzRiMmQ1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxMCArMTEsMTAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCi0gKiBBIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgZG9jdW1lbnQgZnJhZ21lbnQgKERGKSBub2Rlcy4gQW4gCisgKiBBIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgZG9jdW1lbnQgZnJhZ21lbnQgKERGKSBub2Rlcy4gQW4KICAqIDxjb2RlPklET01Db21waWxhdGlvblVuaXQ8L2NvZGU+IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgYSBjb21wbGV0ZSBKRE9NICh0aGF0Ci0gKiBpcywgYSBzb3VyY2UgZmlsZSB3aXRoIG9uZSBvZiB0aGUgCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgCisgKiBpcywgYSBzb3VyY2UgZmlsZSB3aXRoIG9uZSBvZiB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKQogICogSmF2YS1saWtlIGV4dGVuc2lvbnN9KS4gT3RoZXIgbm9kZSB0eXBlcyByZXByZXNlbnQgZnJhZ21lbnRzIG9mIGEgY29tcGlsYXRpb24KICAqIHVuaXQuCiAgKiA8cD4KQEAgLTI5LDI5ICsyOSwyNyBAQAogICogPHA+CiAgKiBFdmVuIGlmIGEgREYgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgZnJvbSBzb3VyY2UgY29kZSwgaXQgZG9lcyBub3QgZ3VhcmFudGVlCiAgKiB0aGF0IHRoZSBzb3VyY2UgY29kZSB3aWxsIGNvbXBpbGUgZXJyb3IgZnJlZS4gU2ltaWxhcmx5LCB0aGUgY29udGVudHMgb2YgYSBERgotICogYXJlIG5vdCBndWFyYW50ZWVkIHRvIGNvbXBpbGUgZXJyb3IgZnJlZS4gSG93ZXZlciwgc3ludGFjdGljYWxseSBjb3JyZWN0IAorICogYXJlIG5vdCBndWFyYW50ZWVkIHRvIGNvbXBpbGUgZXJyb3IgZnJlZS4gSG93ZXZlciwgc3ludGFjdGljYWxseSBjb3JyZWN0CiAgKiBzb3VyY2UgY29kZSBpcyBndWFyYW50ZWVkIHRvIGJlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZSBhIERGLgogICogU2ltaWxhcmx5LCBpZiBhbGwgb2YgdGhlIGZyYWdtZW50cyBvZiBhIEpET00gYXJlIHN5bnRhY3RpY2FsbHkgY29ycmVjdCwgdGhlCiAgKiBjb250ZW50cyBvZiB0aGUgZW50aXJlIGRvY3VtZW50IHdpbGwgYmUgY29ycmVjdCB0b28uCiAgKiA8L3A+CiAgKiA8cD4KLSAqIFRoZSBmYWN0b3J5IGRvZXMgbm90IHBlcmZvcm0gb3IgcHJvdmlkZSBhbnkgY29kZSBmb3JtYXR0aW5nLiBEb2N1bWVudCAKKyAqIFRoZSBmYWN0b3J5IGRvZXMgbm90IHBlcmZvcm0gb3IgcHJvdmlkZSBhbnkgY29kZSBmb3JtYXR0aW5nLiBEb2N1bWVudAogICogZnJhZ21lbnRzIGNyZWF0ZWQgb24gc291cmNlIHN0cmluZ3MgbXVzdCBiZSBwcmUtZm9ybWF0dGVkLiBUaGUgSkRPTSBhdHRlbXB0cwogICogdG8gbWFpbnRhaW4gdGhlIGZvcm1hdHRpbmcgb2YgZG9jdW1lbnRzIGFzIGJlc3QgYXMgcG9zc2libGUuIEZvciB0aGlzIHJlYXNvbiwKLSAqIGRvY3VtZW50IGZyYWdtZW50cyBjcmVhdGVkIGZvciBub2RlcyB0aGF0IGFyZSB0byBiZSBzdHJ1bmcgdG9nZXRoZXIgc2hvdWxkIAorICogZG9jdW1lbnQgZnJhZ21lbnRzIGNyZWF0ZWQgZm9yIG5vZGVzIHRoYXQgYXJlIHRvIGJlIHN0cnVuZyB0b2dldGhlciBzaG91bGQKICAqIGVuZCB3aXRoIGEgbmV3LWxpbmUgY2hhcmFjdGVyLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGEgZG9jdW1lbnQKICAqIHRoYXQgaGFzIGVsZW1lbnRzIHN0cnVuZyB0b2dldGhlciBvbiB0aGUgc2FtZSBsaW5lLiBUaGlzIGlzIGVzcGVjaWFsbHkKICAqIGltcG9ydGFudCBpZiBhIHNvdXJjZSBzdHJpbmcgZW5kcyB3aXRoIGEgLy8gY29tbWVudC4gSW4gdGhpcyBjYXNlLCBpdCB3b3VsZAogICogYmUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgdG8gb21pdCB0aGUgbmV3IGxpbmUgY2hhcmFjdGVyLgogICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KICAqCiAgKiBAc2VlIElET01Ob2RlCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJRE9NRmFjdG9yeSB7CiAvKioKQEAgLTkwLDcgKzg4LDcgQEAKIHB1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoKTsKIC8qKgogICogQ3JlYXRlcyBhIGZpZWxkIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiBzb3VyY2UgY29kZS4gVGhlIGdpdmVuIHNvdXJjZQotICogc3RyaW5nIGNvcnJlc3BvbmRzIHRvIEZpZWxkRGVjbGFyYXRpb24gKEpMUzIgOC4zKSBhbmQgQ29uc3RhbnREZWNsYXJhdGlvbiAKKyAqIHN0cmluZyBjb3JyZXNwb25kcyB0byBGaWVsZERlY2xhcmF0aW9uIChKTFMyIDguMykgYW5kIENvbnN0YW50RGVjbGFyYXRpb24KICAqIChKTFMyIDkuMykgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBWYXJpYWJsZURlY2xhcmF0b3IgY2xhdXNlLgogICoKICAqIEBwYXJhbSBzb3VyY2VDb2RlIHRoZSBzb3VyY2UgY29kZQpAQCAtMTI0LDcgKzEyMiw3IEBACiBwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCk7CiAvKioKICAqIENyZWF0ZXMgYW4gaW5pdGlhbGl6ZXIgZG9jdW1lbnQgZnJhZ21lbnQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGNvZGUuIFRoZQotICogc3ludGF4IGZvciB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBJbnN0YW5jZUluaXRpYWxpemVyIAorICogc3ludGF4IGZvciB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBJbnN0YW5jZUluaXRpYWxpemVyCiAgKiAoSkxTMiA4LjYpIGFuZCBTdGF0aWNEZWNsYXJhdGlvbiAoSkxTMiA4LjcpLgogICoKICAqIEBwYXJhbSBzb3VyY2VDb2RlIHRoZSBzb3VyY2UgY29kZQpAQCAtMTM0LDcgKzEzMiw3IEBACiBwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKFN0cmluZyBzb3VyY2VDb2RlKTsKIC8qKgogICogQ3JlYXRlcyBhIGRlZmF1bHQgbWV0aG9kIGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIG1ldGhvZAotICogd2lsbCBoYXZlIHB1YmxpYyB2aXNpYmlsaXR5LCByZXR1cm4gdHlwZSA8Y29kZT4idm9pZCI8L2NvZGU+LCBiZSBuYW1lZCAKKyAqIHdpbGwgaGF2ZSBwdWJsaWMgdmlzaWJpbGl0eSwgcmV0dXJuIHR5cGUgPGNvZGU+InZvaWQiPC9jb2RlPiwgYmUgbmFtZWQKICAqIDxjb2RlPiJuZXdNZXRob2QiPC9jb2RlPiwgaGF2ZSBubyBwYXJhbWV0ZXJzLCBubyBjb21tZW50LCBhbmQgYW4gZW1wdHkgYm9keS4KICAqCiAgKiBAcmV0dXJuIHRoZSBuZXcgbWV0aG9kCkBAIC0xNDIsNyArMTQwLDcgQEAKIHB1YmxpYyBJRE9NTWV0aG9kIGNyZWF0ZU1ldGhvZCgpOwogLyoqCiAgKiBDcmVhdGVzIGEgbWV0aG9kIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiBzb3VyY2UgY29kZS4gVGhlIHN5bnRheCBmb3IKLSAqIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRzIHRvIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCksICAKKyAqIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRzIHRvIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCksCiAgKiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIChKTFMyIDguOCksIGFuZCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDkuNCkuCiAgKgogICogQHBhcmFtIHNvdXJjZUNvZGUgdGhlIHNvdXJjZSBjb2RlCkBAIC0xNTEsNyArMTQ5LDcgQEAKICAqLwogcHVibGljIElET01NZXRob2QgY3JlYXRlTWV0aG9kKFN0cmluZyBzb3VyY2VDb2RlKTsKIC8qKgotICogQ3JlYXRlcyBhbiBlbXB0eSBwYWNrYWdlIGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIHBhY2thZ2UgCisgKiBDcmVhdGVzIGFuIGVtcHR5IHBhY2thZ2UgZG9jdW1lbnQgZnJhZ21lbnQuIEluaXRpYWxseSB0aGUgcGFja2FnZQogICogZGVjbGFyYXRpb24gd2lsbCBoYXZlIG5vIG5hbWUuCiAgKgogICogQHJldHVybiB0aGUgbmV3IHBhY2thZ2UKQEAgLTE5MSw3ICsxODksNyBAQAogcHVibGljIElET01UeXBlIGNyZWF0ZUludGVyZmFjZSgpOwogLyoqCiAgKiBDcmVhdGVzIGEgdHlwZSBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gc291cmNlIGNvZGUuIFRoZSBzeW50YXggZm9yIHRoZQotICogZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSkgYW5kIAorICogZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSkgYW5kCiAgKiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAoSkxTMiA5LjEpLgogICoKICAqIEBwYXJhbSBzb3VyY2VDb2RlIHRoZSBzb3VyY2UgY29kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZpZWxkLmphdmEKaW5kZXggOWMzN2RkYS4uNzIyN2VkYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDE3ICsxNSwxNiBAQAogICogc3ludGFjdGljIHVuaXRzIGFyZSBGaWVsZERlY2xhcmF0aW9uIChKTFMyIDguMykgYW5kIENvbnN0YW50RGVjbGFyYXRpb24KICAqIChKTFMyIDkuMykgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBWYXJpYWJsZURlY2xhcmF0b3IgY2xhdXNlLgogICogQSBmaWVsZCBoYXMgbm8gY2hpbGRyZW4uIFRoZSBwYXJlbnQgb2YgYSBmaWVsZCBpcyBhIHR5cGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElET01GaWVsZCBleHRlbmRzIElET01NZW1iZXIgewogLyoqCiAgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIGZvciB0aGlzIGZpZWxkLgotICogVGhlIHN5bnRheCBmb3IgYW4gaW5pdGlhbGl6ZXIgY29ycmVzcG9uZHMgdG8gVmFyaWFibGVJbml0aWFsaXplciAoSkxTMiA4LjMpLiAKKyAqIFRoZSBzeW50YXggZm9yIGFuIGluaXRpYWxpemVyIGNvcnJlc3BvbmRzIHRvIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKEpMUzIgOC4zKS4KICAqIDxwPgogICogTm90ZTogVGhlIGV4cHJlc3Npb24gZG9lcyBub3QgaW5jbHVkZSBhICI8Y29kZT49PC9jb2RlPiIuCiAgKiA8L3A+CkBAIC0zOCw3ICszNyw3IEBACiAgKiBUaGUgPGNvZGU+SURPTUZpZWxkPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CiAgKiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkLiBUaGUgc3ludGF4IGZvciB0aGUgbmFtZSBvZiBhIGZpZWxkCiAgKiBjb3JyZXNwb25kcyB0byBWYXJpYWJsZURlY2xhcmF0b3JJZCAoSkxTMiA4LjMpLgotICogCisgKgogICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwpAQCAtNTEsNyArNTAsNyBAQAogcHVibGljIFN0cmluZyBnZXRUeXBlKCk7CiAvKioKICAqIFNldHMgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gZm9yIHRoaXMgZmllbGQuCi0gKiBUaGUgc3ludGF4IGZvciBhbiBpbml0aWFsaXplciBjb3JyZXNwb25kcyB0byBWYXJpYWJsZUluaXRpYWxpemVyIChKTFMyIDguMykuIAorICogVGhlIHN5bnRheCBmb3IgYW4gaW5pdGlhbGl6ZXIgY29ycmVzcG9uZHMgdG8gVmFyaWFibGVJbml0aWFsaXplciAoSkxTMiA4LjMpLgogICogPHA+CiAgKiBOb3RlOiBUaGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBpbmNsdWRlIGEgIjxjb2RlPj08L2NvZGU+Ii4KICAqIDwvcD4KQEAgLTcxLDggKzcwLDggQEAKIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CiAvKioKICAqIFNldHMgdGhlIHR5cGUgbmFtZSBvZiB0aGlzIGZpZWxkLiBUaGUgc3ludGF4IGZvciBhIHR5cGUgbmFtZSBvZiBhIGZpZWxkCi0gKiBjb3JyZXNwb25kcyB0byBUeXBlIGluIEZpZWxkIERlY2xhcmF0aW9uIChKTFMyIDguMykuIFR5cGUgbmFtZXMgbXVzdCBiZSAKLSAqIHNwZWNpZmllZCBhcyB0aGV5IHNob3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiAKKyAqIGNvcnJlc3BvbmRzIHRvIFR5cGUgaW4gRmllbGQgRGVjbGFyYXRpb24gKEpMUzIgOC4zKS4gVHlwZSBuYW1lcyBtdXN0IGJlCisgKiBzcGVjaWZpZWQgYXMgdGhleSBzaG91bGQgYXBwZWFyIGluIHNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZToKICAqIDxjb2RlPiJTdHJpbmciPC9jb2RlPiwgPGNvZGU+ImludFtdIjwvY29kZT4sIG9yIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPi4KICAqCiAgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIHR5cGUgbmFtZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NSW1wb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YQppbmRleCBmYmI2MmNhLi5mNGRkZTEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwyMCArMTQsMTkgQEAKICAqIFJlcHJlc2VudHMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLgogICogVGhlIGNvcnJlc3BvbmRpbmcgc3ludGFjdGljIHVuaXQgaXMgSW1wb3J0RGVjbGFyYXRpb24gKEpMUzIgNy41KS4KICAqIEFuIGltcG9ydCBoYXMgbm8gY2hpbGRyZW4gYW5kIGl0cyBwYXJlbnQgaXMgYSBjb21waWxhdGlvbiB1bml0LgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJRE9NSW1wb3J0IGV4dGVuZHMgSURPTU5vZGUgewogLyoqCiAgKiBUaGUgPGNvZGU+SURPTUltcG9ydDwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgotICogbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBpbXBvcnQuIFRoZSBzeW50YXggZm9yIGFuIGltcG9ydCBuYW1lIAorICogbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBpbXBvcnQuIFRoZSBzeW50YXggZm9yIGFuIGltcG9ydCBuYW1lCiAgKiBjb3JyZXNwb25kcyB0byBhIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUsIG9yIHRvIGFuIG9uLWRlbWFuZCBwYWNrYWdlIG5hbWUKICAqIGFzIGRlZmluZWQgYnkgSW1wb3J0RGVjbGFyYXRpb24gKEpMUzIgNy41KS4KLSAqIAorICoKICAqIEByZXR1cm4gIHRoZSBuYW1lIG9mIHRoaXMgaW1wb3J0CiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwpAQCAtNTksNyArNTgsNyBAQAogCiAvKioKICAqIFRoZSA8Y29kZT5JRE9NSW1wb3J0PC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+Ci0gKiBtZXRob2Qgc2V0cyB0aGUgbmFtZSBvZiB0aGlzIGltcG9ydC4gVGhlIHN5bnRheCBmb3IgYW4gaW1wb3J0IG5hbWUgCisgKiBtZXRob2Qgc2V0cyB0aGUgbmFtZSBvZiB0aGlzIGltcG9ydC4gVGhlIHN5bnRheCBmb3IgYW4gaW1wb3J0IG5hbWUKICAqIGNvcnJlc3BvbmRzIHRvIGEgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSwgb3IgdG8gYW4gb24tZGVtYW5kIHBhY2thZ2UgbmFtZQogICogYXMgZGVmaW5lZCBieSBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLgogICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Jbml0aWFsaXplci5qYXZhCmluZGV4IDdmZjk3NTIuLjAyN2Y1MGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NSW5pdGlhbGl6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxMiArMTQsMTEgQEAKICAqIFJlcHJlc2VudHMgYW4gaW5pdGlhbGl6ZXIuIFRoZSBjb3JyZXNwb25kaW5nIHN5bnRhY3RpYwogICogdW5pdHMgYXJlIEluc3RhbmNlSW5pdGlhbGl6ZXIgKEpMUzIgOC42KSBhbmQgU3RhdGljRGVjbGFyYXRpb24gKEpMUzIgOC43KS4KICAqIEFuIGluaXRpYWxpemVyIGhhcyBubyBjaGlsZHJlbiBhbmQgaXRzIHBhcmVudCBpcyBhIHR5cGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElET01Jbml0aWFsaXplciBleHRlbmRzIElET01NZW1iZXIgewogLyoqCkBAIC0zMyw3ICszMiw3IEBACiAvKioKICAqIFRoZSA8Y29kZT5JRE9NSW5pdGlhbGl6ZXI8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KICAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBBbiBpbml0aWFsaXplciBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KLSAqIAorICoKICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KICAqLwogcHVibGljIFN0cmluZyBnZXROYW1lKCk7CkBAIC00MiwxNCArNDEsMTQgQEAKICAqIEluc3RhbmNlSW5pdGlhbGl6ZXIgKEpMUzIgOC42KSBhbmQgU3RhdGljRGVjbGFyYXRpb24gKEpMUzIgOC43KS4gTm8gZm9ybWF0dGluZwogICogb3Igc3ludGF4IGNoZWNraW5nIGlzIHBlcmZvcm1lZCBvbiB0aGUgYm9keS4gQnJhY2VzIDxiPm11c3Q8L2I+IGJlIGluY2x1ZGVkLgogICoKLSAqIEBwYXJhbSBib2R5IGFuIGluaXRpYWxpemVyIGJvZHksIGluY2x1ZGluZyBicmFjZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorICogQHBhcmFtIGJvZHkgYW4gaW5pdGlhbGl6ZXIgYm9keSwgaW5jbHVkaW5nIGJyYWNlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KICAqICAgaW5kaWNhdGluZyBubyBib2R5CiAgKi8KIHB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpOwogLyoqCiAgKiBUaGUgPGNvZGU+SURPTUluaXRpYWxpemVyPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CiAgKiBtZXRob2QgZG9lcyBub3RoaW5nLgotICogCisgKgogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqLwogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01NZW1iZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhCmluZGV4IDFmNzE2NWQuLmI1ZTkyMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDE3ICsxMywxNSBAQAogLyoqCiAgKiBBbiA8Y29kZT5JRE9NTWVtYmVyPC9jb2RlPiBkZWZpbmVzIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIG5vZGVzLCB3aGljaAogICogY2FuIGJlIG1lbWJlcnMgb2YgdHlwZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgogICoKICAqIEBzZWUgSURPTVR5cGUKICAqIEBzZWUgSURPTU1ldGhvZAogICogQHNlZSBJRE9NRmllbGQKICAqIEBzZWUgSURPTUluaXRpYWxpemVyCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJRE9NTWVtYmVyIGV4dGVuZHMgSURPTU5vZGUgewogLyoqCkBAIC00OCw3ICs0Niw3IEBACiAgKiBkZXByZWNhdGVkIGZsYWcgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gcmVmbGVjdCB0aGUgZGVwcmVjYXRlZCB0YWcgaW4gdGhlCiAgKiBjb21tZW50LgogICoKLSAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50LCBpbmNsdWRpbmcgY29tbWVudCBkZWxpbWl0ZXJzLCBvciAKKyAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50LCBpbmNsdWRpbmcgY29tbWVudCBkZWxpbWl0ZXJzLCBvcgogICogICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoaXMgbWVtYmVyIHNob3VsZCBoYXZlIG5vIGFzc29jaWF0ZWQgY29tbWVudAogICogQHNlZSAjc2V0RmxhZ3MoaW50KQogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01NZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhCmluZGV4IDE4ZDliYzMuLjBkZjgyNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDE5ICsxNywxOCBAQAogICogQSBtZXRob2QgaGFzIG5vIGNoaWxkcmVuIGFuZCBpdHMgcGFyZW50IGlzIGEgdHlwZS4KICAqIExvY2FsIGNsYXNzZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUgYm9keSBvZiBhIG1ldGhvZCwgbm90IGEgY2hpbGQuCiAgKiBBbm5vdGF0aW9uIHR5cGUgbWVtYmVycywgYWRkZWQgaW4gSjJTRSAxLjUsIGFyZSByZXByZXNlbnRlZCBhcyBtZXRob2RzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KKyAqCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJRE9NTWV0aG9kIGV4dGVuZHMgSURPTU1lbWJlciB7CiAvKioKICAqIEFkZHMgdGhlIGdpdmVuIGV4Y2VwdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhpcyBtZXRob2QKICAqIGlzIGRlY2xhcmVkIHRvIHRocm93LgogICogVGhlIHN5bnRheCBmb3IgYW4gZXhjZXB0aW9uIHR5cGUgbmFtZSBpcyBkZWZpbmVkIGJ5IE1ldGhvZCBUaHJvd3MgKEpMUzIgOC40LjQpLgotICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yIAorICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yCiAgKiBleGFtcGxlOiA8Y29kZT4iSU9FeGNlcHRpb24iPC9jb2RlPiBvciA8Y29kZT4iamF2YS5pby5JT0V4Y2VwdGlvbiI8L2NvZGU+LgogICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgPGNvZGU+c2V0RXhjZXB0aW9uczwvY29kZT4uCiAgKgpAQCAtMzksMTQgKzM4LDE0IEBACiAgKi8KIHB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihTdHJpbmcgZXhjZXB0aW9uVHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIC8qKgotICogQWRkcyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciBsaXN0LiAKKyAqIEFkZHMgdGhlIGdpdmVuIHBhcmFtZXRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4KICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIDxjb2RlPnNldFBhcmFtZXRlcnM8L2NvZGU+LgogICogVGhlIHN5bnRheCBmb3IgcGFyYW1ldGVyIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLgotICogVGhlIHN5bnRheCBmb3IgdHlwZSBuYW1lcyBpcyBkZWZpbmVkIGJ5IEZvcm1hbCBQYXJhbWV0ZXJzIChKTFMyIDguNC4xKS4gCisgKiBUaGUgc3ludGF4IGZvciB0eXBlIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLgogICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yCi0gKiBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sIG9yIAorICogZXhhbXBsZTogPGNvZGU+IkZpbGUiPC9jb2RlPiwgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LCBvcgogICogPGNvZGU+ImludFtdIjwvY29kZT4uCi0gKiAKKyAqCiAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBuYW1lCiAgKiBAcGFyYW0gbmFtZSB0aGUgcGFyYW1ldGVyIG5hbWUKICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZCBmb3IKQEAgLTU2LDcgKzU1LDcgQEAKIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CiAvKioKICAqIFJldHVybnMgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QuIFRoZSBtZXRob2QgYm9keSBpbmNsdWRlcyBhbGwgY29kZSBmb2xsb3dpbmcKLSAqIHRoZSBtZXRob2QgZGVjbGFyYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jbG9zaW5nIGJyYWNlcy4gCisgKiB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLCBpbmNsdWRpbmcgdGhlIGVuY2xvc2luZyBicmFjZXMuCiAgKgogICogQHJldHVybiB0aGUgYm9keSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gYm9keSAoZm9yCiAgKiAgIGV4YW1wbGUsIGZvciBhbiBhYnN0cmFjdCBvciBuYXRpdmUgbWV0aG9kKQpAQCAtODYsNyArODUsNyBAQAogICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIHRoZSBzb3VyY2UsIG9yIGFuIGVtcHR5IGFycmF5CiAgKiBpZiB0aGlzIG1ldGhvZCBkZWNsYXJlcyBubyBleGNlcHRpb24gdHlwZXMuCiAgKiBUaGUgc3ludGF4IGZvciBhbiBleGNlcHRpb24gdHlwZSBuYW1lIGlzIGRlZmluZWQgYnkgTWV0aG9kIFRocm93cyAoSkxTMiA4LjQuNCkuCi0gKiBUeXBlIG5hbWVzIGFwcGVhciBhcyB0aGV5IHdvdWxkIGluIHNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZTogCisgKiBUeXBlIG5hbWVzIGFwcGVhciBhcyB0aGV5IHdvdWxkIGluIHNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZToKICAqIDxjb2RlPiJJT0V4Y2VwdGlvbiI8L2NvZGU+IG9yIDxjb2RlPiJqYXZhLmlvLklPRXhjZXB0aW9uIjwvY29kZT4uCiAgKgogICogQHJldHVybiB0aGUgbGlzdCBvZiBleGNlcHRpb24gdHlwZXMKQEAgLTk3LDcgKzk2LDcgQEAKICAqIFJldHVybnMgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoaXMgbWV0aG9kLgogICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIG1ldGhvZCBoYXMgbm8gZm9ybWFsIHR5cGUgcGFyYW1ldGVycy4KICAqIDxwPkZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgYXJlIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UKLSAqIGNvZGU7IGZvciBleGFtcGxlOiAKKyAqIGNvZGU7IGZvciBleGFtcGxlOgogICogPGNvZGU+IlggZXh0ZW5kcyBMaXN0Jmx0O1N0cmluZyZndDsgJiBTZXJpYWxpemFibGUiPC9jb2RlPi4KICAqIDwvcD4KICAqCkBAIC0xMTIsNyArMTExLDcgQEAKICAqIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvcgogICogY29uc3RydWN0b3JzLiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZCAgbmFtZSBpcyBkZWZpbmVkIGJ5IElkZW50aWZpZXIKICAqIG9mIE1ldGhvZERlY2xhcmF0b3IgKEpMUzIgOC40KS4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBtZXRob2Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGNvbnN0cnVjdG9ycwogICovCiBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKQEAgLTEyMCw3ICsxMTksNyBAQAogICogUmV0dXJucyB0aGUgbmFtZXMgb2YgcGFyYW1ldGVycyBpbiB0aGlzIG1ldGhvZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQsCiAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBkZWNsYXJlZC4KICAqIFRoZSBzeW50YXggZm9yIHBhcmFtZXRlciBuYW1lcyBpcyBkZWZpbmVkIGJ5IEZvcm1hbCBQYXJhbWV0ZXJzIChKTFMyIDguNC4xKS4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzCiAgKiAgYXJlIGRlY2xhcmVkCiAgKi8KQEAgLTEyOCwxOSArMTI3LDE5IEBACiAvKioKICAqIFJldHVybnMgdGhlIHR5cGUgbmFtZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kIGluIHRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZCwKICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkLgotICogVGhlIHN5bnRheCBmb3IgdHlwZSBuYW1lcyBpcyBkZWZpbmVkIGJ5IEZvcm1hbCBQYXJhbWV0ZXJzIChKTFMyIDguNC4xKS4gCisgKiBUaGUgc3ludGF4IGZvciB0eXBlIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLgogICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yCi0gKiBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sIG9yIAorICogZXhhbXBsZTogPGNvZGU+IkZpbGUiPC9jb2RlPiwgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LCBvcgogICogPGNvZGU+ImludFtdIjwvY29kZT4uCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycwogICogIGFyZSBkZWNsYXJlZAogICovCiBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKIC8qKgotICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uIAorICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCiAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvciBjb25zdHJ1Y3RvcnMuCi0gKiBUaGUgc3ludGF4IGZvciByZXR1cm4gdHlwZSBuYW1lIGNvcnJlc3BvbmRzIHRvIFJldHVyblR5cGUgaW4gCisgKiBUaGUgc3ludGF4IGZvciByZXR1cm4gdHlwZSBuYW1lIGNvcnJlc3BvbmRzIHRvIFJldHVyblR5cGUgaW4KICAqIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCkuIE5hbWVzIGFyZSByZXR1cm5lZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlCiAgKiBjb2RlOyBmb3IgZXhhbXBsZTogPGNvZGU+IkZpbGUiPC9jb2RlPiwgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LAogICogPGNvZGU+ImludFtdIjwvY29kZT4sIG9yIDxjb2RlPiJ2b2lkIjwvY29kZT4uCkBAIC0xNzYsNyArMTc1LDcgQEAKICAqIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZCBpbiB0aGUgc291cmNlLiBBbiBlbXB0eSBhcnJheQogICogaW5kaWNhdGVzIHRoaXMgbWV0aG9kIGRlY2xhcmVzIG5vIGV4Y2VwdGlvbiB0eXBlcy4KICAqIFRoZSBzeW50YXggZm9yIGFuIGV4Y2VwdGlvbiB0eXBlIG5hbWUgaXMgZGVmaW5lZCBieSBNZXRob2QgVGhyb3dzIChKTFMyIDguNC40KS4KLSAqIFR5cGUgbmFtZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciAKKyAqIFR5cGUgbmFtZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvcgogICogZXhhbXBsZTogPGNvZGU+IklPRXhjZXB0aW9uIjwvY29kZT4gb3IgPGNvZGU+ImphdmEuaW8uSU9FeGNlcHRpb24iPC9jb2RlPi4KICAqCiAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZXMgdGhlIGxpc3Qgb2YgZXhjZXB0aW9uIHR5cGVzCkBAIC0xODYsNyArMTg1LDcgQEAKIC8qKgogICogU2V0cyB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXRob2QuCiAgKiA8cD5Gb3JtYWwgdHlwZSBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBhcyB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlCi0gKiBjb2RlOyBmb3IgZXhhbXBsZTogCisgKiBjb2RlOyBmb3IgZXhhbXBsZToKICAqIDxjb2RlPiJYIGV4dGVuZHMgTGlzdCZsdDtTdHJpbmcmZ3Q7ICYgU2VyaWFsaXphYmxlIjwvY29kZT4uCiAgKiA8L3A+CiAgKgpAQCAtMTk4LDcgKzE5Nyw3IEBACiAKIC8qKgogICogVGhlIDxjb2RlPklET01NZXRob2Q8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KLSAqIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZCAKKyAqIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZAogICogbmFtZSBpcyBkZWZpbmVkIGJ5IElkZW50aWZlciBvZiBNZXRob2REZWNsYXJhdG9yIChKTFMyIDguNCkuCiAgKiA8cD4KICAqIFRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgaXMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aHVzIGl0CkBAIC0yMTEsMjUgKzIxMCwyNSBAQAogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKIC8qKgogICogU2V0cyB0aGUgdHlwZXMgYW5kIG5hbWVzIG9mIHBhcmFtZXRlcnMgaW4gdGhpcyBtZXRob2QgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCi0gKiB0byBiZSBkZWNsYXJlZC4gSWYgYm90aCA8Y29kZT50eXBlczwvY29kZT4gYW5kIDxjb2RlPm5hbWVzPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4gCisgKiB0byBiZSBkZWNsYXJlZC4gSWYgYm90aCA8Y29kZT50eXBlczwvY29kZT4gYW5kIDxjb2RlPm5hbWVzPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4KICAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBtZXRob2QgaGFzIG5vIHBhcmFtZXRlcnMuCiAgKiBUaGUgc3ludGF4IGZvciBwYXJhbWV0ZXIgbmFtZXMgaXMgZGVmaW5lZCBieSBGb3JtYWwgUGFyYW1ldGVycyAoSkxTMiA4LjQuMSkuCi0gKiBUaGUgc3ludGF4IGZvciB0eXBlIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLiAKKyAqIFRoZSBzeW50YXggZm9yIHR5cGUgbmFtZXMgaXMgZGVmaW5lZCBieSBGb3JtYWwgUGFyYW1ldGVycyAoSkxTMiA4LjQuMSkuCiAgKiBUeXBlIG5hbWVzIG11c3QgYmUgc3BlY2lmaWVkIGFzIHRoZXkgd291bGQgYXBwZWFyIGluIHNvdXJjZSBjb2RlLiBGb3IKLSAqIGV4YW1wbGU6IDxjb2RlPiJGaWxlIjwvY29kZT4sIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiwgb3IgCisgKiBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sIG9yCiAgKiA8Y29kZT4iaW50W10iPC9jb2RlPi4KLSAqIAorICoKICAqIEBwYXJhbSB0eXBlcyB0aGUgbGlzdCBvZiB0eXBlIG5hbWVzCiAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWUKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgdHlwZXMgYW5kIG5hbWVzIGRvIG5vdCAKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgdHlwZXMgYW5kIG5hbWVzIGRvIG5vdAogICogICBtYXRjaCwgb3IgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+CiAgKi8KIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gdHlwZXMsIFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogCiAvKioKICAqIFNldHMgdGhlIHJldHVybiB0eXBlIG5hbWUuIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiBjb25zdHJ1Y3RvcnMuCi0gKiBUaGUgc3ludGF4IGZvciByZXR1cm4gdHlwZSBuYW1lIGNvcnJlc3BvbmRzIHRvIFJldHVyblR5cGUgaW4gCi0gKiBNZXRob2REZWNsYXJhdGlvbiAoSkxTMiA4LjQpLiBUeXBlIG5hbWVzIGFyZSBzcGVjaWZpZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlIAorICogVGhlIHN5bnRheCBmb3IgcmV0dXJuIHR5cGUgbmFtZSBjb3JyZXNwb25kcyB0byBSZXR1cm5UeXBlIGluCisgKiBNZXRob2REZWNsYXJhdGlvbiAoSkxTMiA4LjQpLiBUeXBlIG5hbWVzIGFyZSBzcGVjaWZpZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCiAgKiBzb3VyY2UgY29kZTsgZm9yIGV4YW1wbGU6IDxjb2RlPiJGaWxlIjwvY29kZT4sIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiwKICAqIDxjb2RlPiJpbnRbXSI8L2NvZGU+LCBvciA8Y29kZT4idm9pZCI8L2NvZGU+LgogICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU5vZGUuamF2YQppbmRleCBjZTc0NjliLi5kMTkzMDk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Ob2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTUxLDEyICs1MSwxMSBAQAogICogaW4gc291cmNlIGNvZGUuIFRoZSBET00gZG9lcyBub3QgaGF2ZSBhIG5vdGlvbiBvZiB0eXBlIHNpZ25hdHVyZXMsIG9ubHkgcmF3IHRleHQuIEV4YW1wbGUgdHlwZQogICogbmFtZXMgYXJlIDxjb2RlPiJPYmplY3QiPC9jb2RlPiwgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LCBhbmQgPGNvZGU+ImludFtdIjwvY29kZT4uCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElET01Ob2RlIGV4dGVuZHMgQ2xvbmVhYmxlICB7CiAKQEAgLTY2LDQ5ICs2NSw0OSBAQAogCSAqIEBzZWUgI2dldE5vZGVUeXBlKCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGludCBDT01QSUxBVElPTl9VTklUPSAxOwotCQorCiAJLyoqCiAJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBwYWNrYWdlIGRlY2xhcmF0aW9uLgogCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NUGFja2FnZTwvY29kZT4uCiAJKiBAc2VlICNnZXROb2RlVHlwZSgpCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgUEFDS0FHRT0gMjsKLQkKKwogCS8qKgogCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGFuIGltcG9ydCBkZWNsYXJhdGlvbi4KIAkgKiBOb2RlcyBvZiB0aGlzIHR5cGUgbWF5YmUgYnkgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SURPTUltcG9ydDwvY29kZT4uCiAJICogQHNlZSAjZ2V0Tm9kZVR5cGUoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IElNUE9SVD0gMzsKLQkKKwogCS8qKgogCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgdHlwZSBkZWNsYXJhdGlvbi4KIAkgKiBOb2RlcyBvZiB0aGlzIHR5cGUgbWF5YmUgYnkgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SURPTVR5cGU8L2NvZGU+LgogCSAqIEBzZWUgI2dldE5vZGVUeXBlKCkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGludCBUWVBFPSA0OwotCQorCiAJLyoqCiAJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBmaWVsZCBkZWNsYXJhdGlvbi4KIAkgKiBOb2RlcyBvZiB0aGlzIHR5cGUgbWF5YmUgYnkgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SURPTUZpZWxkPC9jb2RlPi4KIAkgKiBAc2VlICNnZXROb2RlVHlwZSgpCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgRklFTEQ9IDU7Ci0JCisKIAkvKioKIAkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG1ldGhvZCAob3IgY29uc3RydWN0b3IpIGRlY2xhcmF0aW9uLgogCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NTWV0aG9kPC9jb2RlPi4KIAkgKiBAc2VlICNnZXROb2RlVHlwZSgpCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgTUVUSE9EPSA2OwotCQorCiAJLyoqCiAJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYW4gaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24uCiAJICogTm9kZXMgb2YgdGhpcyB0eXBlIG1heWJlIGJ5IHNhZmVseSBjYXN0IHRvIDxjb2RlPklET01Jbml0aWFsaXplcjwvY29kZT4uCiAJICogQHNlZSAjZ2V0Tm9kZVR5cGUoKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IElOSVRJQUxJWkVSPSA3OwotCQorCiAvKioKICAqIEFkZHMgdGhlIGdpdmVuIHVuLXBhcmVudGVkIG5vZGUgKGRvY3VtZW50IGZyYWdtZW50KSBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGlzIG5vZGUuCiAgKgpAQCAtMTYwLDcgKzE1OSw3IEBACiBwdWJsaWMgSURPTU5vZGUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpOwogLyoqCiAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4gUmV0dXJucyBhbiBlbXB0eSBlbnVtZXJhdGlvbgotICogaWYgdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbiAoaW5jbHVkaW5nIG5vZGVzIHRoYXQgY2Fubm90IGhhdmUgY2hpbGRyZW4pLiAKKyAqIGlmIHRoaXMgbm9kZSBoYXMgbm8gY2hpbGRyZW4gKGluY2x1ZGluZyBub2RlcyB0aGF0IGNhbm5vdCBoYXZlIGNoaWxkcmVuKS4KICAqIENoaWxkcmVuIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZSBjb2RlLgogICoKICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGNoaWxkcmVuCkBAIC0xODUsMTMgKzE4NCwxMyBAQAogICovCiBwdWJsaWMgSURPTU5vZGUgZ2V0Rmlyc3RDaGlsZCgpOwogLyoqCi0gKiBSZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgSmF2YSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIAorICogUmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIEphdmEgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogZG9jdW1lbnQgZnJhZ21lbnQsIGJhc2VkIG9uIHRoZSBwYXJlbnQgSmF2YSBlbGVtZW50LgogICoKICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBKYXZhIGVsZW1lbnQKICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgZWxlbWVudCBpcyBub3QKICAqICAgb2YgYSB2YWxpZCBwYXJlbnQgdHlwZSBmb3IgdGhpcyBub2RlCi0gKiBAcmV0dXJuIGEgaGFuZGxlIGZvciB0aGUgSmF2YSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIAorICogQHJldHVybiBhIGhhbmRsZSBmb3IgdGhlIEphdmEgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogICAgICAgICBkb2N1bWVudCBmcmFnbWVudCwgYmFzZWQgb24gdGhlIHBhcmVudCBKYXZhIGVsZW1lbnQKICAqLwogcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgcGFyZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwpAQCAtMjE3LDcgKzIxNiw3IEBACiAvKioKICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCiAgKgotICogQHJldHVybiB0aGUgcGFyZW50IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgCisgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYQogICogICBwYXJlbnQKICAqLwogcHVibGljIElET01Ob2RlIGdldFBhcmVudCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NUGFja2FnZS5qYXZhCmluZGV4IDQ0NWQ1YzYuLjAxMDdkYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVBhY2thZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01QYWNrYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTUgKzEwLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIC8qKgotICogUmVwcmVzZW50cyBhIHBhY2thZ2UgZGVjbGFyYXRpb24uIAotICogVGhlIGNvcnJlc3BvbmRpbmcgc3ludGFjdGljIHVuaXQgaXMgUGFja2FnZURlY2xhcmF0aW9uIChKTFMyIDcuNCkuIAorICogUmVwcmVzZW50cyBhIHBhY2thZ2UgZGVjbGFyYXRpb24uCisgKiBUaGUgY29ycmVzcG9uZGluZyBzeW50YWN0aWMgdW5pdCBpcyBQYWNrYWdlRGVjbGFyYXRpb24gKEpMUzIgNy40KS4KICAqIEEgUGFja2FnZSBoYXMgbm8gY2hpbGRyZW4sIGFuZCBpdHMgcGFyZW50IGlzIGEgY29tcGlsYXRpb24gdW5pdC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+CisgKgogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSURPTVBhY2thZ2UgZXh0ZW5kcyBJRE9NTm9kZSB7CiAvKioKQEAgLTI2LDcgKzI1LDcgQEAKICAqIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KICAqIGlmIGl0IGhhcyBub25lLiBUaGUgc3ludGF4IGZvciBhIHBhY2thZ2UgbmFtZSBjb3JyZXNwb25kcyB0byBQYWNrYWdlTmFtZQogICogYXMgZGVmaW5lZCBieSBQYWNrYWdlRGVjbGFyYXRpb24gKEpMUzIgNy40KS4KLSAqIAorICoKICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgogICogICAgICAgICBpZiBpdCBoYXMgbm9uZQogICovCkBAIC0zNyw3ICszNiw3IEBACiAgKiBuYW1lIGNvcnJlc3BvbmRzIHRvIFBhY2thZ2VOYW1lIGFzIGRlZmluZWQgYnkgUGFja2FnZURlY2xhcmF0aW9uIChKTFMyIDcuNCkuCiAgKiBBIDxjb2RlPm51bGw8L2NvZGU+IG5hbWUgaW5kaWNhdGVzIGFuIGVtcHR5IHBhY2thZ2UgZGVjbGFyYXRpb247IHRoYXQgaXMsCiAgKiA8Y29kZT5nZXRDb250ZW50czwvY29kZT4gcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLgotICogCisgKgogICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKICAqLwogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01UeXBlLmphdmEKaW5kZXggZWQ5N2U5MC4uM2JkMjE5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwxNyArMTYsMTYgQEAKICAqIEVudW1lcmF0aW9uIHR5cGVzIGFuZCBhbm5vdGF0aW9uIHR5cGVzLCBhZGRlZCBpbiBKMlNFIDEuNSwgYXJlIHJlcHJlc2VudGVkIGFzCiAgKiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCByZXNwZWN0aXZlbHkuCiAgKiA8cD4KLSAqIEFsbG93YWJsZSBjaGlsZCB0eXBlcyBmb3IgYSB0eXBlIGFyZSA8Y29kZT5JRE9NVHlwZTwvY29kZT4sIDxjb2RlPklET01GaWVsZDwvY29kZT4sIAorICogQWxsb3dhYmxlIGNoaWxkIHR5cGVzIGZvciBhIHR5cGUgYXJlIDxjb2RlPklET01UeXBlPC9jb2RlPiwgPGNvZGU+SURPTUZpZWxkPC9jb2RlPiwKICAqIDxjb2RlPklET01NZXRob2Q8L2NvZGU+LCBhbmQgPGNvZGU+SURPTUluaXRpYWxpemVyPC9jb2RlPi4KICAqIENoaWxkcmVuIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UuIFRoZSBwYXJlbnQgb2YgYSB0eXBlCiAgKiBpcyBhIHR5cGUgKGluIHRoZSBjYXNlIG9mIGEgbWVtYmVyIHR5cGUpIG9yIGEgY29tcGlsYXRpb24gdW5pdCAoaW4gdGhlIGNhc2Ugb2YgYSB0b3AtbGV2ZWwgdHlwZSkuCiAgKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgorICoKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElET01UeXBlIGV4dGVuZHMgSURPTU1lbWJlciB7CiAvKioKQEAgLTQ5LDcgKzQ4LDcgQEAKICAqIFJldHVybnMgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoaXMgdHlwZS4KICAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBtZXRob2QgaGFzIG5vIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMuCiAgKiA8cD5Gb3JtYWwgdHlwZSBwYXJhbWV0ZXJzIGFyZSBhcyB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlCi0gKiBjb2RlOyBmb3IgZXhhbXBsZTogCisgKiBjb2RlOyBmb3IgZXhhbXBsZToKICAqIDxjb2RlPiJYIGV4dGVuZHMgTGlzdCZsdDtTdHJpbmcmZ3Q7ICYgU2VyaWFsaXphYmxlIjwvY29kZT4uCiAgKiA8L3A+CiAgKgpAQCAtNjEsMTcgKzYwLDE3IEBACiAKIC8qKgogICogVGhlIDxjb2RlPklET01UeXBlPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+Ci0gKiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHR5cGUuIFRoZSBuYW1lIG9mIGEgY2xhc3MgaXMgZGVmaW5lZCBieSAKKyAqIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdHlwZS4gVGhlIG5hbWUgb2YgYSBjbGFzcyBpcyBkZWZpbmVkIGJ5CiAgKiBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSk7IHRoZSBuYW1lIG9mIGFuIGludGVyZmFjZSBpcyBkZWZpbmVkIGJ5CiAgKiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAoSkxTMiA5LjEpLgotICogCisgKgogICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHR5cGUKICAqLwogcHVibGljIFN0cmluZyBnZXROYW1lKCk7CiAvKioKICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB0eXBlJ3Mgc3VwZXJjbGFzcy4gVGhlIHN5bnRheCBmb3IgYSBzdXBlcmNsYXNzIG5hbWUKICAqIGlzIHNwZWNpZmllZCBieSBTdXBlciBpbiBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSkuIFR5cGUgbmFtZXMgbXVzdCBiZQotICogc3BlY2lmaWVkIGFzIHRoZXkgd291bGQgYXBwZWFyIGluIHNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZTogCisgKiBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOgogICogPGNvZGU+Ik9iamVjdCI8L2NvZGU+LCBvciA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4uCiAgKiBBcyBvZiBKMlNFIDEuNSwgdGhlIHN1cGVyY2xhc3MgbWF5IGFsc28gaW5jbHVkZSBwYXJhbWV0ZXJpemVkCiAgKiB0eXBlcyBsaWtlIDxjb2RlPiJBcnJheUxpc3QmbHQ7U3RyaW5nJmd0OyI8L2NvZGU+LgpAQCAtOTMsNyArOTIsNyBAQAogICogRm9yIGNsYXNzZXMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuCiAgKiBGb3IgaW50ZXJmYWNlcywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGV4dGVuZHMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGludGVyZmFjZSBuYW1lcwogICovCiBwdWJsaWMgU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VzKCk7CkBAIC0xMzYsNyArMTM1LDcgQEAKICAqIFNldHMgd2hldGhlciB0aGlzIHR5cGUgcmVwcmVzZW50cyBhbiBlbnVtZXJhdGlvbiBjbGFzcy4KICAqIElmIHRoaXMgdHlwZSBpcyBhIGNsYXNzIGFuZCBpcyBjaGFuZ2VkIHRvIGFuIGVudW0sCiAgKiB0aGlzIHR5cGUncyBzdXBlcmNsYXNzIGJlY29tZXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gKiBJZiB0aGlzIHR5cGUgaXMgYW4gaW50ZXJmYWNlIChpbmNsdWRpbmcgYW4gYW5ub3RhdGlvbiB0eXBlKSwgCisgKiBJZiB0aGlzIHR5cGUgaXMgYW4gaW50ZXJmYWNlIChpbmNsdWRpbmcgYW4gYW5ub3RhdGlvbiB0eXBlKSwKICAqIGFuZCBpcyBjaGFuZ2VkIHRvIGFuIGVudW0sIHRoaXMgdHlwZSBpcyBhbHNvIGNoYW5nZWQgdG8gYSBjbGFzcy4KICAqCiAgKiBAcGFyYW0gYiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZW51bSBjbGFzc2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtMTQ4LDcgKzE0Nyw3IEBACiAgKiBTZXRzIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbiB0eXBlICgiQGludGVyZmFjZSIgaW5zdGVhZCBvZiAiaW50ZXJmYWNlIikuCiAgKiBJZiB0aGlzIHR5cGUgaXMgYSBpbnRlcmZhY2UgYW5kIGlzIGNoYW5nZWQgdG8gYW4gZW51bSwKICAqIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MgYmVjb21lcyA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaXRzIHN1cGVyaW50ZXJmYWNlIGxpc3QKLSAqIGJlY29tZXMgZW1wdHkuIElmIHRoaXMgdHlwZSBpcyBhbiBjbGFzcyAoaW5jbHVkaW5nIGFuIGVudW0pLCAKKyAqIGJlY29tZXMgZW1wdHkuIElmIHRoaXMgdHlwZSBpcyBhbiBjbGFzcyAoaW5jbHVkaW5nIGFuIGVudW0pLAogICogYW5kIGlzIGNoYW5nZWQgdG8gYW4gYW5ub3RhdGlvbiB0eXBlLCB0aGlzIHR5cGUgaXMgYWxzbyBjaGFuZ2VkIHRvIGFuIGludGVyZmFjZS4KICAqCiAgKiBAcGFyYW0gYiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW4gYW5ub3RhdGlvbiB0eXBlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQpAQCAtMTU5LDcgKzE1OCw3IEBACiAvKioKICAqIFNldHMgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoaXMgdHlwZS4KICAqIDxwPkZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UKLSAqIGNvZGU7IGZvciBleGFtcGxlOiAKKyAqIGNvZGU7IGZvciBleGFtcGxlOgogICogPGNvZGU+IlggZXh0ZW5kcyBMaXN0Jmx0O1N0cmluZyZndDsgJiBTZXJpYWxpemFibGUiPC9jb2RlPi4KICAqIDwvcD4KICAqCkBAIC0xNzEsNyArMTcwLDcgQEAKIAogLyoqCiAgKiBUaGUgPGNvZGU+SURPTVR5cGU8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KLSAqIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoaXMgdHlwZS4gVGhlIG5hbWUgb2YgYSBjbGFzcyBpcyBkZWZpbmVkIGJ5IAorICogbWV0aG9kIHNldHMgdGhlIG5hbWUgb2YgdGhpcyB0eXBlLiBUaGUgbmFtZSBvZiBhIGNsYXNzIGlzIGRlZmluZWQgYnkKICAqIENsYXNzRGVjbGFyYXRpb24gKEpMUzIgOC4xKTsgdGhlIG5hbWUgb2YgYW4gaW50ZXJmYWNlIGlzIGRlZmluZWQgYnkKICAqIEludGVyZmFjZURlY2xhcmF0aW9uIChKTFMyIDkuMSkuCiAgKgpAQCAtMTgxLDcgKzE4MCw3IEBACiBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwogLyoqCiAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MuIEhhcyBubyBlZmZlY3QgaWYgdGhpcyB0eXBlCi0gKiByZXByZXNlbnRzIGFuIGludGVyZmFjZS4gQSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGluZGljYXRlcyB0aGF0IG5vIAorICogcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuIEEgPGNvZGU+bnVsbDwvY29kZT4gbmFtZSBpbmRpY2F0ZXMgdGhhdCBubwogICogc3VwZXJjbGFzcyBuYW1lIChleHRlbmRzIGNsYXVzZSkgc2hvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuCiAgKiBUaGUgc3ludGF4IGZvciBhIHN1cGVyY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQgYnkgU3VwZXIgaW4gQ2xhc3NEZWNsYXJhdGlvbgogICogKEpMUzIgOC4xKS4gVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4KQEAgLTE5OCw3ICsxOTcsNyBAQAogICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHRvIGJlIGxpc3RlZCBpbiB0aGUgc291cmNlLiBBbiBlbXB0eSBhcnJheQogICogcGFyYW1ldGVyIGluZGljYXRlcyB0aGF0IG5vIHN1cGVyaW50ZXJmYWNlcyBhcmUgcHJlc2VudC4gVGhlIHN5bnRheCBmb3IKICAqIGludGVyZmFjZSBuYW1lcyBpcyBkZWZpbmVkIGJ5IEludGVyZmFjZXMgaW4gQ2xhc3NEZWNsYXJhdGlvbiAoSkxTMiA4LjEpLgotICogVHlwZSBuYW1lcyBhcHBlYXIgYXMgdGhleSB3b3VsZCBpbiBzb3VyY2UgY29kZS4gRm9yIGV4YW1wbGU6IAorICogVHlwZSBuYW1lcyBhcHBlYXIgYXMgdGhleSB3b3VsZCBpbiBzb3VyY2UgY29kZS4gRm9yIGV4YW1wbGU6CiAgKiA8Y29kZT4iQ2xvbmVhYmxlIjwvY29kZT4sIG9yIDxjb2RlPiJqYXZhLmlvLlNlcmlhbGl6YWJsZSI8L2NvZGU+LgogICogQXMgb2YgSjJTRSAxLjUsIHN1cGVyaW50ZXJmYWNlcyBtYXkgYWxzbyBpbmNsdWRlIHBhcmFtZXRlcml6ZWQKICAqIHR5cGVzIGxpa2UgPGNvZGU+Ikxpc3QmbHQ7U3RyaW5nJmd0OyI8L2NvZGU+LgpAQCAtMjA2LDcgKzIwNSw3IEBACiAgKiBGb3IgY2xhc3NlcywgdGhpcyBtZXRob2Qgc2V0cyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4KICAqIEZvciBpbnRlcmZhY2VzLCB0aGlzIG1ldGhvZCBzZXRzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZXh0ZW5kcy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lcyB0aGUgbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMKICAqLwogcHVibGljIHZvaWQgc2V0U3VwZXJJbnRlcmZhY2VzKFN0cmluZ1tdIGludGVyZmFjZU5hbWVzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3BhY2thZ2UuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3BhY2thZ2UuaHRtbAppbmRleCA4OGYwMzFiLi5jZTk2YTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9wYWNrYWdlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvcGFja2FnZS5odG1sCkBAIC0xMyw3ICsxMywxNSBAQAogUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KIAogPHA+PGJyPlRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBtb2RlbCBjbGFzc2VzLCB3aGljaCBpbXBsZW1lbnQgSmF2YQotc3BlY2lmaWMgYmVoYXZpb3VyIGZvciByZXNvdXJjZXMgYW5kIGZ1cnRoZXIgZGVjb21wb3NlIGphdmEgcmVzb3VyY2VzIGludG8KK3NwZWNpZmljIGJlaGF2aW91ciBmb3IgcmVzb3VyY2VzIGFuZCBmdXJ0aGVyIGRlY29tcG9zZSBKYXZhIHJlc291cmNlcyBpbnRvCiBtb2RlbCBlbGVtZW50cy4KKzwvcD48cD4KK05vdGUgdGhhdCBhIGxvdCBvZiBKYXZhIG1vZGVsIG9wZXJhdGlvbnMgcmVxdWlyZSBhIEphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCByZXNvbHV0aW9uLgorRm9yIGV4YW1wbGUgSUphdmFQcm9qZWN0I2dldFJlc29sdmVkQ2xhc3NwYXRoKGJvb2xlYW4pIG9yIEphdmFDb3JlI3NldENsYXNzcGF0aENvbnRhaW5lcigpCit3aWxsIHJlcXVpcmUgdG8gcmVzb2x2ZSB0aGUgY2xhc3NwYXRoIG9mIG9uZSBvciBtb3JlIHByb2plY3RzLiBDbGllbnQgc2hvdWxkIGJlIGF3YXJlIHRoYXQKK3RoaXMgcmVzb2x1dGlvbiBtYXkgcmVxdWlyZSB0byB0YWtlIHByb2plY3QgbW9kaWZpY2F0aW9uIHJ1bGUgCisoc2VlIElSZXNvdXJjZVJ1bGVGYWN0b3J5I21vZGlmeVJ1bGUoSVJlc291cmNlKSkuCis8L3A+CisKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQnl0ZUNvZGVWaXNpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKaW5kZXggMzg2YzA0OS4uZGQ4OTRhZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNyArMTMsNyBAQAogLyoqCiAgKiBBZGFwdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgSUJ5dGVjb2RlVmlzaXRvci4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0bwogICogYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgQnl0ZUNvZGVWaXNpdG9yQWRhcHRlciBpbXBsZW1lbnRzIElCeXRlY29kZVZpc2l0b3IgewpAQCAtOTIyLDcgKzkyMiwxNyBAQAogCXB1YmxpYyB2b2lkIF9pbnN0YW5jZW9mKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgewogCQkvLyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0KKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZWludGVyZmFjZShpbnQsIGludCwgYnl0ZSwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW52b2tlZHluYW1pYygKKwkJCWludCBwYywKKwkJCWludCBpbmRleCwKKwkJCUlDb25zdGFudFBvb2xFbnRyeSBuYW1lRW50cnksCisJCQlJQ29uc3RhbnRQb29sRW50cnkgZGVzY3JpcHRvckVudHJ5KSB7CisJCS8vIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZworCX0KIAkvKioKIAkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZWludGVyZmFjZShpbnQsIGludCwgYnl0ZSwgSUNvbnN0YW50UG9vbEVudHJ5KQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5qYXZhCmluZGV4IDM3NDM2MWQuLjZmMWMzYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMjkgKzEzLDI5IEBACiAvKioKICAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCB0byBkaXNhc3NlbWJsZQogICogY2xhc3NmaWxlIGJ5dGVzIG9udG8gYSBTdHJpbmcgdXNpbmcgdGhlIHByb3BlciBsaW5lIHNlcGFyYXRvci4KLSAqIAorICoKICAqIEBzaW5jZSAyLjEKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIHsKLQkKKwogCS8qKgogCSAqIFRoZSBtb2RlIGlzIHRoZSBkZXRhaWxlZCBtb2RlIHRvIGRpc2Fzc2VtYmxlIElDbGFzc0ZpbGVSZWFkZXIuIEl0IHJldHVybnMgdGhlIG1hZ2ljCiAJICogbnVtYmVycywgdGhlIHZlcnNpb24gbnVtYmVycyBhbmQgZmllbGQgYW5kIG1ldGhvZCBkZXNjcmlwdG9ycy4KIAkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERVRBSUxFRCA9IDE7Ci0JCisKIAkvKioKIAkgKiBUaGUgbW9kZSBpcyB0aGUgZGVmYXVsdCBtb2RlIHRvIGRpc2Fzc2VtYmxlIElDbGFzc0ZpbGVSZWFkZXIuCiAJICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVCAgPSAyOwotCQorCiAJLyoqCiAJICogVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBkZXRhaWxlZCBtb2RlIHBsdXMgdGhlIGNvbnN0YW50IHBvb2wgY29udGVudHMgYW5kCiAJICogYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gdGhhdCB3b3VsZCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTWVNURU0gPSA0OwotCQorCiAJLyoqCiAJICogVGhpcyBtb2RlIGlzIHVzZWQgdG8gY29tcGFjdCB0aGUgY2xhc3MgbmFtZSB0byBhIHNpbXBsZSBuYW1lIGluc3RlYWQgb2YgYSBxdWFsaWZpZWQgbmFtZS4KIAkgKiBAc2luY2UgMy4xCkBAIC01MiwxMCArNTIsMTAgQEAKIAkgKiBBbnN3ZXJzIGJhY2sgdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIGNsYXNzZmlsZSBieXRlcyB1c2luZyB0aGUgZGVmYXVsdAogCSAqIG1vZGUuCiAJICogVGhpcyBpcyBhbiBvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgamF2YXAgdG9vbCwgdXNpbmcgREVGQVVMVCBtb2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIFRoZSBieXRlcyBvZiB0aGUgY2xhc3NmaWxlCiAJICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgdGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgdXNpbmcgdGhlIGRlZmF1bHQgbW9kZS4KIAkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgYXJlIGlsbC1mb3JtZWQKIAkgKi8KQEAgLTY1LDExICs2NSwxMSBAQAogCSAqIEFuc3dlcnMgYmFjayB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgY2xhc3NmaWxlIGJ5dGVzIGFjY29yZGluZyB0byB0aGUKIAkgKiBtb2RlLgogCSAqIFRoaXMgaXMgYW4gb3V0cHV0IHF1aXRlIHNpbWlsYXIgdG8gdGhlIGphdmFwIHRvb2wuCi0JICogCisJICoKIAkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgVGhlIGJ5dGVzIG9mIHRoZSBjbGFzc2ZpbGUKIAkgKiBAcGFyYW0gbGluZVNlcGFyYXRvciB0aGUgbGluZSBzZXBhcmF0b3IgdG8gdXNlLgogCSAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHVzZWQgdG8gZGlzYXNzZW1ibGUgdGhlIElDbGFzc0ZpbGVSZWFkZXIKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBtb2RlCiAJICogQGV4Y2VwdGlvbiBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NmaWxlIGJ5dGVzIGFyZSBpbGwtZm9ybWVkCiAJICovCkBAIC03Nyw4ICs3Nyw4IEBACiAKIAkvKioKIAkgKiBBbnN3ZXJzIGEgcmVhZGFibGUgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBkaXNhc3NlbWJsZXIKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gU3RyaW5nIC0gYSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGRpc2Fzc2VtYmxlcgotCSAqLwkKKwkgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKaW5kZXggYmI3YTNjMS4uZDI5ZDM2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGb3JtYXRFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywxMSArMTMsMTEgQEAKIC8qKgogICogRXhjZXB0aW9uIHRocm93biBieSBhIGNsYXNzIGZpbGUgcmVhZGVyIHdoZW4gZW5jb3VudGVyaW5nIGEgZXJyb3IgaW4gZGVjb2RpbmcKICAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhIC5jbGFzcyBmaWxlLgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTUFMRk9STUVEX1VURjggPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1RSVU5DQVRFRF9JTlBVVCA9IDI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZID0gMzsKQEAgLTM2LDcgKzM2LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX01BR0lDX05VTUJFUiA9IDg7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTgyOTAwNTU4MzIwNjEyOTg4TDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIENsYXNzRm9ybWF0RXhjZXB0aW9uLgogCSAqIEBwYXJhbSBlcnJvcklEIHRoZSBnaXZlbiBlcnJvciBJRApAQCAtNTIsNCArNTIsMTQgQEAKIAlwdWJsaWMgQ2xhc3NGb3JtYXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7CiAJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIENsYXNzRm9ybWF0RXhjZXB0aW9uLgorCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uCisJICogQHBhcmFtICBjYXVzZSAgdGhlIGNhdXNlIG9mIHRoZSBleGNlcHRpb24KKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIENsYXNzRm9ybWF0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ29tcGlsYXRpb25Vbml0U29ydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NvbXBpbGF0aW9uVW5pdFNvcnRlci5qYXZhCmluZGV4IDA5NDZkOWIuLmU3ZmQyZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ29tcGlsYXRpb25Vbml0U29ydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9Db21waWxhdGlvblVuaXRTb3J0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywyMSArMjcsMjEgQEAKIC8qKgogICogT3BlcmF0aW9uIGZvciBzb3J0aW5nIG1lbWJlcnMgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4KICAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB2aWEgc3RhdGljIG1lbWJlcnM7IGl0IGlzIG5vdAotICogaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBmdW5jdGlvbmFsaXR5IHZpYSBzdGF0aWMgbWVtYmVycy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAyLjEKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ29tcGlsYXRpb25Vbml0U29ydGVyIHsKLQkKKwogIAkvKioKICAJICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24uCiAgCSAqLwogCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0U29ydGVyKCkgewogCQkvLyBOb3QgaW5zdGFudGlhYmxlCi0JfSAKLQkKKwl9CisKICAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBtYXJraW5nIGRlcHJlY2F0ZWQgYXMgaXQgaXMgdXNpbmcgZGVwcmVjYXRlZCBjb2RlCiAgICAgICovCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKICAgICAgICAgY2FzZSBBU1QuSkxTMiA6CiAgICAgICAgIGNhc2UgQVNULkpMUzMgOgorICAgICAgICBjYXNlIEFTVC5KTFM0IDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0IDoKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTc3LDcgKzc4LDcgQEAKIAkgKiByZXR1cm4gaTEuaW50VmFsdWUoKSAtIGkyLmludFZhbHVlKCk7IC8vIHByZXNlcnZlIG9yaWdpbmFsIG9yZGVyCiAJICogPC9wcmU+CiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHNlZSAjc29ydChJQ29tcGlsYXRpb25Vbml0LCBpbnRbXSwgQ29tcGFyYXRvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbgogCSAqLwpAQCAtOTksNyArMTAwLDcgQEAKIAkgKiB3aXRoIGNhdXRpb24gYW5kIGR1ZSBjb25jZXJuIGZvciBwb3RlbnRpYWwgbmVnYXRpdmUgc2lkZSBlZmZlY3RzLgogCSAqIDwvcD4KIAkgKiA8cD4KLQkgKiBUaGUgb3B0aW9uYWwgPGNvZGU+cG9zaXRpb25zPC9jb2RlPiBhcnJheSBjb250YWlucyBhIG5vbi1kZWNyZWFzaW5nIAorCSAqIFRoZSBvcHRpb25hbCA8Y29kZT5wb3NpdGlvbnM8L2NvZGU+IGFycmF5IGNvbnRhaW5zIGEgbm9uLWRlY3JlYXNpbmcKIAkgKiBvcmRlcmVkIGxpc3Qgb2YgY2hhcmFjdGVyLWJhc2VkIHNvdXJjZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBjb21waWxhdGlvbgogCSAqIHVuaXQncyBzb3VyY2UgY29kZSBzdHJpbmcuIFVwb24gcmV0dXJuIGZyb20gdGhpcyBtZXRob2QsIHRoZSBwb3NpdGlvbnMgaW4KIAkgKiB0aGUgYXJyYXkgcmVmbGVjdCB0aGUgY29ycmVzcG9uZGluZyBuZXcgbG9jYXRpb25zIGluIHRoZSBtb2RpZmllZCBzb3VyY2UKQEAgLTEwNyw3ICsxMDgsNyBAQAogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBUaGUgPGNvZGU+Y29tcGFyZTwvY29kZT4gbWV0aG9kIG9mIHRoZSBnaXZlbiBjb21wYXJhdG9yIGlzIHBhc3NlZCBwYWlycwotCSAqIG9mIEpMUzIgQVNUIGJvZHkgZGVjbGFyYXRpb25zIChzdWJjbGFzc2VzIG9mIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT4pIAorCSAqIG9mIEpMUzIgQVNUIGJvZHkgZGVjbGFyYXRpb25zIChzdWJjbGFzc2VzIG9mIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT4pCiAJICogcmVwcmVzZW50aW5nIGJvZHkgZGVjbGFyYXRpb25zIGF0IHRoZSBzYW1lIGxldmVsLiBUaGUgY29tcGFyYXRvciBpcwogCSAqIGNhbGxlZCBvbiBib2R5IGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgY2xhc3NlcywgaW5jbHVkaW5nIGFub255bW91cyBhbmQKIAkgKiBsb2NhbCBjbGFzc2VzLCBidXQgYWx3YXlzIGF0IHRoZSBzYW1lIGxldmVsLiBDbGllbnRzIG5lZWQgdG8gcHJvdmlkZQpAQCAtMTUzLDE2ICsxNTQsMTYgQEAKIAkgKiBub24tcmVjdXJzaXZlIHNvcnRpbmcsIGV0Yy4pCiAJICogPC9wPgogCSAqCi0JICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdCB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbXVzdCBiZSBhIAorCSAqIEBwYXJhbSBjb21waWxhdGlvblVuaXQgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQsIHdoaWNoIG11c3QgYmUgYQogCSAqIHdvcmtpbmcgY29weQotCSAqIEBwYXJhbSBwb3NpdGlvbnMgYW4gYXJyYXkgb2Ygc291cmNlIHBvc2l0aW9ucyB0byBtYXAsIG9yIAotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIElmIHN1cHBsaWVkLCB0aGUgcG9zaXRpb25zIG11c3QgCisJICogQHBhcmFtIHBvc2l0aW9ucyBhbiBhcnJheSBvZiBzb3VyY2UgcG9zaXRpb25zIHRvIG1hcCwgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiBJZiBzdXBwbGllZCwgdGhlIHBvc2l0aW9ucyBtdXN0CiAJICogY2hhcmFjdGVyLWJhc2VkIHNvdXJjZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSBmb3IKIAkgKiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgYXJyYW5nZWQgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIuCiAJICogVGhlIGFycmF5IGlzIHVwZGF0ZWQgaW4gcGxhY2Ugd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRvIHJlZmxlY3QgdGhlCiAJICogY29ycmVzcG9uZGluZyBzb3VyY2UgcG9zaXRpb25zIGluIHRoZSBwZXJtdXRlZCBzb3VyY2UgY29kZSBzdHJpbmcKIAkgKiAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbnkgbG9uZ2VyIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyKS4KLQkgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBjYXBhYmxlIG9mIG9yZGVyaW5nIAorCSAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIGNhcGFibGUgb2Ygb3JkZXJpbmcKIAkgKiAgIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT5zOyB0aGlzIGNvbXBhcmF0b3IgaXMgcGFzc2VkIEFTVCBub2RlcwogICAgICAqICAgZnJvbSBhIEpMUzIgQVNUCiAJICogQHBhcmFtIG9wdGlvbnMgYml0d2lzZS1vciBvZiBvcHRpb24gZmxhZ3M7IDxjb2RlPjA8L2NvZGU+IGZvciBkZWZhdWx0CkBAIC0xOTMsNyArMTk0LDcgQEAKIAkgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXNvcnQoQVNULkpMUzIsIGNvbXBpbGF0aW9uVW5pdCwgcG9zaXRpb25zLCBjb21wYXJhdG9yLCBvcHRpb25zLCBtb25pdG9yKTsKIAl9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW9yZGVycyB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGFjY29yZGluZyB0bwogICAgICAqIHRoZSBzcGVjaWZpZWQgQVNUIGxldmVsLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhcnJhbmdpbmcgaW4KQEAgLTIxMCw3ICsyMTEsNyBAQAogICAgICAqIHdpdGggY2F1dGlvbiBhbmQgZHVlIGNvbmNlcm4gZm9yIHBvdGVudGlhbCBuZWdhdGl2ZSBzaWRlIGVmZmVjdHMuCiAgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIFRoZSBvcHRpb25hbCA8Y29kZT5wb3NpdGlvbnM8L2NvZGU+IGFycmF5IGNvbnRhaW5zIGEgbm9uLWRlY3JlYXNpbmcgCisgICAgICogVGhlIG9wdGlvbmFsIDxjb2RlPnBvc2l0aW9uczwvY29kZT4gYXJyYXkgY29udGFpbnMgYSBub24tZGVjcmVhc2luZwogICAgICAqIG9yZGVyZWQgbGlzdCBvZiBjaGFyYWN0ZXItYmFzZWQgc291cmNlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIGNvbXBpbGF0aW9uCiAgICAgICogdW5pdCdzIHNvdXJjZSBjb2RlIHN0cmluZy4gVXBvbiByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCwgdGhlIHBvc2l0aW9ucyBpbgogICAgICAqIHRoZSBhcnJheSByZWZsZWN0IHRoZSBjb3JyZXNwb25kaW5nIG5ldyBsb2NhdGlvbnMgaW4gdGhlIG1vZGlmaWVkIHNvdXJjZQpAQCAtMjE4LDEyICsyMTksMTIgQEAKICAgICAgKiA8L3A+CiAgICAgICogPHA+CiAgICAgICogVGhlIDxjb2RlPmNvbXBhcmU8L2NvZGU+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gY29tcGFyYXRvciBpcyBwYXNzZWQgcGFpcnMKLSAgICAgKiBvZiBib2R5IGRlY2xhcmF0aW9ucyAoc3ViY2xhc3NlcyBvZiA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KSAKKyAgICAgKiBvZiBib2R5IGRlY2xhcmF0aW9ucyAoc3ViY2xhc3NlcyBvZiA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KQogICAgICAqIHJlcHJlc2VudGluZyBib2R5IGRlY2xhcmF0aW9ucyBhdCB0aGUgc2FtZSBsZXZlbC4gVGhlIG5vZGVzIGFyZSBmcm9tIGFuCi0gICAgICogQVNUIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwgCisgICAgICogQVNUIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwKICAgICAgKiAoe0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXIjbmV3UGFyc2VyKGludCl9LiBDbGllbnRzCi0gICAgICogd2lsbCBnZW5lcmFsbHkgc3BlY2lmeSBBU1QuSkxTMyBzaW5jZSB0aGF0IHdpbGwgY292ZXIgYWxsIGNvbnN0cnVjdHMgZm91bmQKLSAgICAgKiBpbiBKYXZhIDEuMCwgMS4xLCAxLjIsIDEuMywgMS40LCBhbmQgMS41IHNvdXJjZSBjb2RlLgorICAgICAqIHdpbGwgZ2VuZXJhbGx5IHNwZWNpZnkgdGhlIGxhdGVzdCBhdmFpbGFibGUgPGNvZGU+e0BsaW5rIEFTVH0uSkxTKjwvY29kZT4gY29uc3RhbnQgc2luY2UgdGhhdCB3aWxsCisgICAgICogY292ZXIgYWxsIGNvbnN0cnVjdHMgZm91bmQgaW4gYWxsIHZlcnNpb24gb2YgSmF2YSBzb3VyY2UgY29kZS4KICAgICAgKiBUaGUgY29tcGFyYXRvciBpcyBjYWxsZWQgb24gYm9keSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIGNsYXNzZXMsIGluY2x1ZGluZwogICAgICAqIGFub255bW91cyBhbmQgbG9jYWwgY2xhc3NlcywgYnV0IGFsd2F5cyBhdCB0aGUgc2FtZSBsZXZlbC4gQ2xpZW50cyBuZWVkIHRvIHByb3ZpZGUKICAgICAgKiBhIGNvbXBhcmF0b3IgaW1wbGVtZW50YXRpb24gKHRoZXJlIGlzIG5vIHN0YW5kYXJkIGNvbXBhcmF0b3IpLiBUaGUKQEAgLTI4OCwxNyArMjg5LDE3IEBACiAgICAgICogbm9uLXJlY3Vyc2l2ZSBzb3J0aW5nLCBldGMuKQogICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgQVNUIGxldmVsOyBvbmUgb2YgdGhlIEFTVCBMRVZFTCBjb25zdGFudHMKLSAgICAgKiBAcGFyYW0gY29tcGlsYXRpb25Vbml0IHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LCB3aGljaCBtdXN0IGJlIGEgCisgICAgICogQHBhcmFtIGxldmVsIHRoZSBBU1QgbGV2ZWw7IG9uZSBvZiB0aGUgPGNvZGU+e0BsaW5rIEFTVH0uSkxTKjwvY29kZT4gY29uc3RhbnRzCisgICAgICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdCB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbXVzdCBiZSBhCiAgICAgICogd29ya2luZyBjb3B5Ci0gICAgICogQHBhcmFtIHBvc2l0aW9ucyBhbiBhcnJheSBvZiBzb3VyY2UgcG9zaXRpb25zIHRvIG1hcCwgb3IgCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gSWYgc3VwcGxpZWQsIHRoZSBwb3NpdGlvbnMgbXVzdCAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb25zIGFuIGFycmF5IG9mIHNvdXJjZSBwb3NpdGlvbnMgdG8gbWFwLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIElmIHN1cHBsaWVkLCB0aGUgcG9zaXRpb25zIG11c3QKICAgICAgKiBjaGFyYWN0ZXItYmFzZWQgc291cmNlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGZvcgogICAgICAqIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LCBhcnJhbmdlZCBpbiBub24tZGVjcmVhc2luZyBvcmRlci4KICAgICAgKiBUaGUgYXJyYXkgaXMgdXBkYXRlZCBpbiBwbGFjZSB3aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdG8gcmVmbGVjdCB0aGUKICAgICAgKiBjb3JyZXNwb25kaW5nIHNvdXJjZSBwb3NpdGlvbnMgaW4gdGhlIHBlcm11dGVkIHNvdXJjZSBjb2RlIHN0cmluZwogICAgICAqIChidXQgbm90IG5lY2Vzc2FyaWx5IGFueSBsb25nZXIgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIpLgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIGNhcGFibGUgb2Ygb3JkZXJpbmcgCisgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBvcmRlcmluZwogICAgICAqICAgPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPnM7IHRoaXMgY29tcGFyYXRvciBpcyBwYXNzZWQgQVNUIG5vZGVzCiAgICAgICogICBmcm9tIGFuIEFTVCBvZiB0aGUgc3BlY2lmaWVkIEFTVCBsZXZlbAogICAgICAqIEBwYXJhbSBvcHRpb25zIGJpdHdpc2Utb3Igb2Ygb3B0aW9uIGZsYWdzOyA8Y29kZT4wPC9jb2RlPiBmb3IgZGVmYXVsdApAQCAtMzMzLDcgKzMzNCw3IEBACiAgICAgICAgIFNvcnRFbGVtZW50c09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU29ydEVsZW1lbnRzT3BlcmF0aW9uKGxldmVsLCBjb21waWxhdGlvblVuaXRzLCBwb3NpdGlvbnMsIGNvbXBhcmF0b3IpOwogICAgICAgICBvcGVyYXRpb24ucnVuT3BlcmF0aW9uKG1vbml0b3IpOwogICAgIH0KLSAgICAKKwogCS8qKgogCSAqIFJlb3JkZXJzIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgYWNjb3JkaW5nIHRvIHRoZQogCSAqIHNwZWNpZmllZCBjb21wYXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhcnJhbmdpbmcgaW4gYWR2YW5jZQpAQCAtMzUyLDcgKzM1Myw3IEBACiAJICogPHA+CiAJICogVGhlIDxjb2RlPmNvbXBhcmU8L2NvZGU+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gY29tcGFyYXRvciBpcyBwYXNzZWQgcGFpcnMKIAkgKiBvZiBib2R5IGRlY2xhcmF0aW9ucyAoc3ViY2xhc3NlcyBvZiA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KQotCSAqIHJlcHJlc2VudGluZyBib2R5IGRlY2xhcmF0aW9ucyBhdCB0aGUgc2FtZSBsZXZlbC4gCisJICogcmVwcmVzZW50aW5nIGJvZHkgZGVjbGFyYXRpb25zIGF0IHRoZSBzYW1lIGxldmVsLgogCSAqIFRoZSBjb21wYXJhdG9yIGlzIGNhbGxlZCBvbiBib2R5IGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgY2xhc3NlcywKIAkgKiBpbmNsdWRpbmcgYW5vbnltb3VzIGFuZCBsb2NhbCBjbGFzc2VzLCBidXQgYWx3YXlzIGF0IHRoZSBzYW1lIGxldmVsLgogCSAqIENsaWVudHMgbmVlZCB0byBwcm92aWRlIGEgY29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbiAodGhlcmUgaXMgbm8gc3RhbmRhcmQKQEAgLTQxMiw3ICs0MTMsNyBAQAogCSAqIDwvdHI+CiAJICogPC90YWJsZT4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gdW5pdAogCSAqICAgICAgICAgICAgdGhlIENvbXBpbGF0aW9uVW5pdCB0byBzb3J0CiAJICogQHBhcmFtIGNvbXBhcmF0b3IKQEAgLTQyNiw3ICs0MjcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHRleHQgZWRpdCBncm91cCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRleHQgZWRpdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogQHBhcmFtIG1vbml0b3IKIAkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIG5vdGlmeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEByZXR1cm4gYSBUZXh0RWRpdCBkZXNjcmliaW5nIHRoZSByZXF1aXJlZCBlZGl0cyB0byBkbyB0aGUgc29ydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCisJICogQHJldHVybiBhIFRleHRFZGl0IGRlc2NyaWJpbmcgdGhlIHJlcXVpcmVkIGVkaXRzIHRvIGRvIHRoZSBzb3J0LCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqICAgICAgICAgICAgaWYgc29ydGluZyBpcyBub3QgcmVxdWlyZWQKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBjb21waWxhdGlvbiB1bml0IGNvdWxkIG5vdCBiZSBzb3J0ZWQuIFJlYXNvbnMKQEAgLTQ1MCw3ICs0NTEsNyBAQAogCQlpZiAodW5pdCA9PSBudWxsIHx8IGNvbXBhcmF0b3IgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCVNvcnRFbGVtZW50c09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU29ydEVsZW1lbnRzT3BlcmF0aW9uKEFTVC5KTFMzLCBuZXcgSUphdmFFbGVtZW50W10geyB1bml0LmdldEphdmFFbGVtZW50KCkgfSwgbnVsbCwgY29tcGFyYXRvcik7CisJCVNvcnRFbGVtZW50c09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU29ydEVsZW1lbnRzT3BlcmF0aW9uKEFTVC5KTFM0LCBuZXcgSUphdmFFbGVtZW50W10geyB1bml0LmdldEphdmFFbGVtZW50KCkgfSwgbnVsbCwgY29tcGFyYXRvcik7CiAJCXJldHVybiBvcGVyYXRpb24uY2FsY3VsYXRlRWRpdCh1bml0LCBncm91cCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQW5ub3RhdGlvbi5qYXZhCmluZGV4IDc2NTViNDcuLmQyMmNlMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMzAgKzEzLDMwIEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGEgYW5ub3RhdGlvbiBzdHJ1Y3R1cmUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKICAqIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb24gewogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSB0eXBlIGluZGV4IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdHlwZSBpbmRleAogCSAqLwogCWludCBnZXRUeXBlSW5kZXgoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSB0eXBlIG5hbWUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUKIAkgKiBAc2luY2UgMy4xCiAJICovCiAJY2hhcltdIGdldFR5cGVOYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIGluZGV4CiAJICovCiAJaW50IGdldENvbXBvbmVudHNOdW1iZXIoKTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgY29tcG9uZW50cyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIGFuCiAJICogZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29tcG9uZW50cwogCSAqLwogCUlBbm5vdGF0aW9uQ29tcG9uZW50W10gZ2V0Q29tcG9uZW50cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQW5ub3RhdGlvbkNvbXBvbmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQW5ub3RhdGlvbkNvbXBvbmVudC5qYXZhCmluZGV4IDNkZGIyZTUuLjMzOGY1ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25Db21wb25lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBbm5vdGF0aW9uQ29tcG9uZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMjkgKzEzLDI5IEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGFuIGFubm90YXRpb24gY29tcG9uZW50IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAgKiAoYWRkZWQgaW4gSjJTRSAxLjUpLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAgCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQ29tcG9uZW50IHsKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgY29tcG9uZW50IG5hbWUgaW5kZXggYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgbmFtZSBpbmRleAogCSAqLwogCWludCBnZXRDb21wb25lbnROYW1lSW5kZXgoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBjb21wb25lbnQgbmFtZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBuYW1lCiAJICovCiAJY2hhcltdIGdldENvbXBvbmVudE5hbWUoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBjb21wb25lbnQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgdmFsdWUKIAkgKi8KIAlJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlIGdldENvbXBvbmVudFZhbHVlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5qYXZhCmluZGV4IDYxZmM4NjEuLmQxNmZiZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDEzICsxMywxMyBAQAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhbiBhbm5vdGF0aW9uIGNvbXBvbmVudCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogICogKGFkZGVkIGluIEoyU0UgMS41KS4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlIHsKLQkKKwogCS8qKgogCSAqIFRhZyB2YWx1ZSBmb3IgYSBjb25zdGFudCBvZiB0eXBlIDxjb2RlPmJ5dGU8L2NvZGU+CiAJICogQHNpbmNlIDMuMQpAQCAtODUsMjEgKzg1LDIxIEBACiAJICogQHNpbmNlIDMuMQogCSAqLwogCWludCBBUlJBWV9UQUcgPSAnWyc7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIGNvbXBvbmVudCB2YWx1ZXMgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKiBpZiB0aGUgdGFnIGl0ZW0gaXMgJ1snLgogCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGNvbXBvbmVudCB2YWx1ZXMKIAkgKi8KIAlJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlW10gZ2V0QW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlcygpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqIGlmIHRoZSB0YWcgaXRlbSBpcyAnJiMwNjQ7Jy4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJICogUmV0dXJucyB0aGUgY2xhc3MgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqIGlmIHRoZSB0YWcgaXRlbSBpcyAnYycuCiAJICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNsYXNzIGluZm8KIAkgKi8KIAlJQ29uc3RhbnRQb29sRW50cnkgZ2V0Q2xhc3NJbmZvKCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkgKiBSZXR1cm5zIHRoZSBjbGFzcyBpbmZvIGluZGV4IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogaWYgdGhlIHRhZyBpdGVtIGlzICdjJy4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2xhc3MgaW5mbyBpbmRleAogCSAqLwogCWludCBnZXRDbGFzc0luZm9JbmRleCgpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJICogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKiBpZiB0aGUgdGFnIGl0ZW0gaXMgb25lIG9mICdCJywgJ0MnLCAnRCcsICdGJywgJ0knLCAnSicsICdTJywgJ1onLCBvciAncycuCiAJICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlCiAJICovCiAJSUNvbnN0YW50UG9vbEVudHJ5IGdldENvbnN0YW50VmFsdWUoKTsKQEAgLTE0NiwxNyArMTQ2LDE3IEBACiAJICogYnkgdGhpcyBhbm5vdGF0aW9uIGNvbXBvbmVudCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqIGlmIHRoZSB0YWcgaXRlbSBpcyAnZScuCiAJICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGVudW0gY29uc3RhbnQKIAkgKiBAc2luY2UgMy4xCiAJICovCi0JY2hhcltdIGdldEVudW1Db25zdGFudE5hbWUoKTsJCi0JCisJY2hhcltdIGdldEVudW1Db25zdGFudE5hbWUoKTsKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHV0ZjggY29uc3RhbnQgaW5kZXggYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKiBpZiB0aGUgdGFnIGl0ZW0gaXMgJ2UnLgogCSAqIFRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBlbnVtIGNvbnN0YW50IGluZGV4CiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTY3LDE3ICsxNjcsMTcgQEAKIAkgKiBieSB0aGlzIGFubm90YXRpb24gY29tcG9uZW50IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogaWYgdGhlIHRhZyBpdGVtIGlzICdlJy4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZW51bSBjb25zdGFudAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQljaGFyW10gZ2V0RW51bUNvbnN0YW50VHlwZU5hbWUoKTsJCi0JCisJY2hhcltdIGdldEVudW1Db25zdGFudFR5cGVOYW1lKCk7CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB1dGY4IGNvbnN0YW50IGluZGV4IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogaWYgdGhlIHRhZyBpdGVtIGlzICdlJy4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZW51bSBjb25zdGFudCBpbmRleAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KQEAgLTE4NSwxNiArMTg1LDE2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB0YWcgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB0YWcKIAkgKi8KIAlpbnQgZ2V0VGFnKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogaWYgdGhlIHRhZyBpdGVtIGlzICdbJy4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcwogCSAqLwogCWludCBnZXRWYWx1ZXNOdW1iZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZS5qYXZhCmluZGV4IDMzNWRkZjEuLmQxYTY0ZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxOCArMTEsMTggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCi0gKiBEZXNjcmlwdGlvbiBvZiBhIGFubm90YXRpb24gZGVmYXVsdCBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBEZXNjcmlwdGlvbiBvZiBhIGFubm90YXRpb24gZGVmYXVsdCBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0KICAqIHNwZWNpZmljYXRpb25zIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKKyAqCiAgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbWVtYmVyIHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlCiAJICovCiAJSUFubm90YXRpb25Db21wb25lbnRWYWx1ZSBnZXRNZW1iZXJWYWx1ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKaW5kZXggMzg2YmYwYy4uZTVkYWZhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiw5IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYXR0cmlidXRlIG5hbWVzIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMgewogCS8qKgpAQCAtNzUsMzEgKzc0LDMxIEBACiAJICogQHNpbmNlIDIuMAogCSAqLwogCWNoYXJbXSBERVBSRUNBVEVEID0gIkRlcHJlY2F0ZWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqICJTaWduYXR1cmUiIGF0dHJpYnV0ZSAoYWRkZWQgaW4gSjJTRSAxLjUpLgotCSAqIENsYXNzIGZpbGUgcmVhZGVycyB3aGljaCBzdXBwb3J0IEoyU0UgMS41IHJldHVybiAKKwkgKiBDbGFzcyBmaWxlIHJlYWRlcnMgd2hpY2ggc3VwcG9ydCBKMlNFIDEuNSByZXR1cm4KIAkgKiBhdHRyaWJ1dGVzIHdpdGggdGhpcyBuYW1lIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMKIAkgKiBpbXBsZW1lbnRpbmcge0BsaW5rIElTaWduYXR1cmVBdHRyaWJ1dGV9LgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAljaGFyW10gU0lHTkFUVVJFID0gIlNpZ25hdHVyZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogIkVuY2xvc2luZ01ldGhvZCIgYXR0cmlidXRlIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0JICogQ2xhc3MgZmlsZSByZWFkZXJzIHdoaWNoIHN1cHBvcnQgSjJTRSAxLjUgcmV0dXJuIAorCSAqIENsYXNzIGZpbGUgcmVhZGVycyB3aGljaCBzdXBwb3J0IEoyU0UgMS41IHJldHVybgogCSAqIGF0dHJpYnV0ZXMgd2l0aCB0aGlzIG5hbWUgcmVwcmVzZW50ZWQgYnkgb2JqZWN0cwogCSAqIGltcGxlbWVudGluZyB7QGxpbmsgSUVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZX0uCiAJICogQHNpbmNlIDMuMAogCSAqLwogCWNoYXJbXSBFTkNMT1NJTkdfTUVUSE9EID0gIkVuY2xvc2luZ01ldGhvZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogIkxvY2FsVmFyaWFibGVUeXBlVGFibGUiIGF0dHJpYnV0ZSAoYWRkZWQgaW4gSjJTRSAxLjUpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAljaGFyW10gTE9DQUxfVkFSSUFCTEVfVFlQRV9UQUJMRSA9ICJMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKIAkgKiAiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIgYXR0cmlidXRlIChhZGRlZCBpbiBKMlNFIDEuNSkuCiAJICogQHNpbmNlIDMuMApAQCAtMTI5LDEzICsxMjgsMTMgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJY2hhcltdIEFOTk9UQVRJT05fREVGQVVMVCA9ICJBbm5vdGF0aW9uRGVmYXVsdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogIlN0YWNrTWFwVGFibGUiIGF0dHJpYnV0ZSAoYWRkZWQgaW4gSjJTRSAxLjYpLgogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAljaGFyW10gU1RBQ0tfTUFQX1RBQkxFID0gIlN0YWNrTWFwVGFibGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqICJTdGFja01hcCIgYXR0cmlidXRlIChhZGRlZCBpbiBjbGRjMS4wKS4KIAkgKiBAc2luY2UgMy4yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lCeXRlY29kZVZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCmluZGV4IGIxZGJiZTMuLjUyY2NiMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDEwICsxMywxMiBAQAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhIEphdmEgb3Bjb2RlcyB2aXNpdG9yLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIHdhbGsgdGhlIG9wY29kZXMKICAqIG9mIGEgSUNvZGVBdHRyaWJ1dGUuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBDbGllbnRzIG11c3Qgc3ViY2xhc3Mge0BsaW5rIEJ5dGVDb2RlVmlzaXRvckFkYXB0ZXJ9IHRvIGRlZmluZSBhbiBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhpcyBpbnRlcmZhY2UuCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElCeXRlY29kZVZpc2l0b3IgewogCkBAIC0xNjQsNiArMTY2LDE0IEBACiAJCWludCBwYywKIAkJaW50IGluZGV4LAogCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcyk7CisJLyoqCisJICogQHNpbmNlIDMuNgorCSAqLworCXZvaWQgX2ludm9rZWR5bmFtaWMoCisJCQlpbnQgcGMsCisJCQlpbnQgaW5kZXgsCisJCQlJQ29uc3RhbnRQb29sRW50cnkgbmFtZUVudHJ5LAorCQkJSUNvbnN0YW50UG9vbEVudHJ5IGRlc2NyaXB0b3JFbnRyeSk7CiAJdm9pZCBfaW52b2tlaW50ZXJmYWNlKAogCQlpbnQgcGMsCiAJCWludCBpbmRleCwKQEAgLTI2NSw3ICsyNzUsNyBAQAogCXZvaWQgX3NpcHVzaChpbnQgcGMsIHNob3J0IHZhbHVlKTsKIAl2b2lkIF9zd2FwKGludCBwYyk7CiAJdm9pZCBfdGFibGVzd2l0Y2goCi0JCWludCBwYywgCisJCWludCBwYywKIAkJaW50IGRlZmF1bHRvZmZzZXQsCiAJCWludCBsb3csCiAJCWludCBoaWdoLApAQCAtMjgxLDUgKzI5MSw1IEBACiAJCWludCBfY29uc3QpOwogCXZvaWQgX2JyZWFrcG9pbnQoaW50IHBjKTsKIAl2b2lkIF9pbXBkZXAxKGludCBwYyk7Ci0Jdm9pZCBfaW1wZGVwMihpbnQgcGMpOwkKKwl2b2lkIF9pbXBkZXAyKGludCBwYyk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDViZWVlZDIuLmJhNmFmYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDE1ICsxMywxNSBAQAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBnZW5lcmljIGNsYXNzIGZpbGUgYXR0cmlidXRlLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZAogICogZm9yIGFueSBuZXcgYXR0cmlidXRlLgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBuYW1lIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sIGFzIHNwZWNpZmllZAogCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbAogCSAqLwogCWludCBnZXRBdHRyaWJ1dGVOYW1lSW5kZXgoKTsKQEAgLTI5LDcgKzI5LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXR0cmlidXRlIG5hbWUgYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lCiAJICovCiAJY2hhcltdIGdldEF0dHJpYnV0ZU5hbWUoKTsKQEAgLTM3LDcgKzM3LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXR0cmlidXRlIGxlbmd0aCBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYXR0cmlidXRlIGxlbmd0aAogCSAqLwogCWxvbmcgZ2V0QXR0cmlidXRlTGVuZ3RoKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5qYXZhCmluZGV4IGFmZDFiOTcuLjZlYWViMTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDE4ICsxMywxOCBAQAogLyoqCiAgKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCB0byBkaXNhc3NlbWJsZQogICogSUNsYXNzRmlsZVJlYWRlciBvbnRvIGEgU3RyaW5nIHVzaW5nIHRoZSBwcm9wZXIgbGluZSBzZXBhcmF0b3IuCi0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCiAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyfSBpbnN0ZWFkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzRmlsZURpc2Fzc2VtYmxlciB7Ci0JCisKIAkvKioKIAkgKiBUaGUgbW9kZSBpcyB0aGUgZGV0YWlsZWQgbW9kZSB0byBkaXNhc3NlbWJsZSBJQ2xhc3NGaWxlUmVhZGVyLiBJdCByZXR1cm5zIHRoZSBtYWdpYwogCSAqIG51bWJlcnMsIHRoZSB2ZXJzaW9uIG51bWJlcnMgYW5kIGZpZWxkIGFuZCBtZXRob2QgZGVzY3JpcHRvcnMuCiAJICovCiAJaW50IERFVEFJTEVEID0gMTsKLQkKKwogCS8qKgogCSAqIFRoZSBtb2RlIGlzIHRoZSBkZWZhdWx0IG1vZGUgdG8gZGlzYXNzZW1ibGUgSUNsYXNzRmlsZVJlYWRlci4KIAkgKi8KQEAgLTMzLDEwICszMywxMCBAQAogCSAqIEFuc3dlcnMgYmFjayB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgSUNsYXNzRmlsZVJlYWRlciB1c2luZyB0aGUgZGVmYXVsdAogCSAqIG1vZGUuCiAJICogVGhpcyBpcyBhbiBvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgamF2YXAgdG9vbCwgdXNpbmcgREVGQVVMVCBtb2RlLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZVJlYWRlciBUaGUgY2xhc3NGaWxlUmVhZGVyIHRvIGJlIGRpc2Fzc2VtYmxlZAogCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkaXNhc3NlbWJsZWQgc3RyaW5nIG9mIHRoZSBJQ2xhc3NGaWxlUmVhZGVyIHVzaW5nIHRoZSBkZWZhdWx0IG1vZGUuCiAJICovCiAJU3RyaW5nIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyLCBTdHJpbmcgbGluZVNlcGFyYXRvcik7CkBAIC00NSwxMSArNDUsMTEgQEAKIAkgKiBBbnN3ZXJzIGJhY2sgdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgYWNjb3JkaW5nIHRvIHRoZQogCSAqIG1vZGUuCiAJICogVGhpcyBpcyBhbiBvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgamF2YXAgdG9vbC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVSZWFkZXIgVGhlIGNsYXNzRmlsZVJlYWRlciB0byBiZSBkaXNhc3NlbWJsZWQKIAkgKiBAcGFyYW0gbGluZVNlcGFyYXRvciB0aGUgbGluZSBzZXBhcmF0b3IgdG8gdXNlLgogCSAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHVzZWQgdG8gZGlzYXNzZW1ibGUgdGhlIElDbGFzc0ZpbGVSZWFkZXIKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBtb2RlCiAJICovCiAJU3RyaW5nIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IG1vZGUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVSZWFkZXIuamF2YQppbmRleCAxZDczZWM0Li4zY2U5NWRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVSZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVSZWFkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw5ICsyMSw5IEBACiAgKiBmaWxlIHJlYWRlciBjbGllbnRzIGNhbiBzZWFyY2ggZm9yIHRoZXNlIG5ldyBhdHRyaWJ1dGVzCiAgKiBhbmQgZG93bmNhc3QgdG8gdGhlIG5ldyBpbnRlcmZhY2VzIGFzIGFwcHJvcHJpYXRlLgogICogPC9wPgotICogIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDbGFzc0ZpbGVSZWFkZXIgewpAQCAtMzEsMzIgKzMxLDMyIEBACiAJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIGNvbXBsZXRlbHkgZWFjaCBwYXJ0IG9mIGEgLmNsYXNzIGZpbGUuCiAJICovCiAJaW50IEFMTCAJCQkJCT0gMHhGRkZGOwotCQorCiAJLyoqCiAJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIG9ubHkgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcyBvZiBhIC5jbGFzcyBmaWxlLgogCSAqLwogCWludCBDT05TVEFOVF9QT09MIAkJCT0gMHgwMDAxOwogCiAJLyoqCi0JICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMgYW5kIAorCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZAogCSAqIHRoZSBtZXRob2QgaW5mb3Mgb2YgYSAuY2xhc3MgZmlsZS4KIAkgKi8KIAlpbnQgTUVUSE9EX0lORk9TIAkJCT0gMHgwMDAyICsgQ09OU1RBTlRfUE9PTDsKIAogCS8qKgotCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZCAKKwkgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIHJlYWQgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcyBhbmQKIAkgKiB0aGUgZmllbGQgaW5mb3Mgb2YgYSAuY2xhc3MgZmlsZS4KIAkgKi8KIAlpbnQgRklFTERfSU5GT1MgCQkJPSAweDAwMDQgKyBDT05TVEFOVF9QT09MOwogCiAJLyoqCi0JICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMgYW5kIAorCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZAogCSAqIHRoZSBzdXBlciBpbnRlcmZhY2UgbmFtZXMgb2YgYSAuY2xhc3MgZmlsZS4KIAkgKi8KIAlpbnQgU1VQRVJfSU5URVJGQUNFUyAJCT0gMHgwMDA4ICsgQ09OU1RBTlRfUE9PTDsKIAogCS8qKgotCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZCAKKwkgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIHJlYWQgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcyBhbmQKIAkgKiB0aGUgYXR0cmlidXRlcyBvZiBhIC5jbGFzcyBmaWxlLgogCSAqLwogCWludCBDTEFTU0ZJTEVfQVRUUklCVVRFUyAJPSAweDAwMTAgKyBDT05TVEFOVF9QT09MOwpAQCAtNzIsNDMgKzcyLDQzIEBACiAJICogbWV0aG9kIGJvZGllcy4KIAkgKi8KIAlpbnQgQUxMX0JVVF9NRVRIT0RfQk9ESUVTICAgPSBBTEwgJiB+TUVUSE9EX0JPRElFUzsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGUgLmNsYXNzIGZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGUgLmNsYXNzIGZpbGUKIAkgKi8KIAlpbnQgZ2V0QWNjZXNzRmxhZ3MoKTsKLQkKKwogCS8qKgotCSAqIEFuc3dlciBiYWNrIHRoZSBhcnJheSBvZiBmaWVsZCBpbmZvcyBvZiB0aGUgLmNsYXNzIGZpbGUsIAorCSAqIEFuc3dlciBiYWNrIHRoZSBhcnJheSBvZiBmaWVsZCBpbmZvcyBvZiB0aGUgLmNsYXNzIGZpbGUsCiAJICogYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZpZWxkIGluZm9zIG9mIHRoZSAuY2xhc3MgZmlsZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQogCSAqLwogCUlGaWVsZEluZm9bXSBnZXRGaWVsZEluZm9zKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIC5jbGFzcyBmaWxlLAotCSAqIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUuIFRoZSBuYW1lcyBhcmUgcmV0dXJuZWQgYXMgZGVzY3JpYmVkIGluIHRoZSAKKwkgKiBhbiBlbXB0eSBhcnJheSBpZiBub25lLiBUaGUgbmFtZXMgYXJlIHJldHVybmVkIGFzIGRlc2NyaWJlZCBpbiB0aGUKIAkgKiBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoaXMgLmNsYXNzIGZpbGUsIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKIAkgKi8KIAljaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpOwogCiAJLyoqCi0JICogQW5zd2VyIGJhY2sgdGhlIGluZGV4ZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCAKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXhlcyBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiBpbnRlcmZhY2VzIGltcGxlbWVudGVkCiAJICogYnkgdGhpcyAuY2xhc3MgZmlsZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbmRleGVzIGluIHRoZSBjb25zdGFudCBwb29sIG9mIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBpbmRleGVzIGluIHRoZSBjb25zdGFudCBwb29sIG9mIGludGVyZmFjZXMgaW1wbGVtZW50ZWQKIAkgKiBieSB0aGlzIC5jbGFzcyBmaWxlLCBhbiBlbXB0eSBhcnJheSBpZiBub25lCiAJICovCiAJaW50W10gZ2V0SW50ZXJmYWNlSW5kZXhlcygpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIG9mIHRoaXMgLmNsYXNzIGZpbGUsIG51bGwgaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIG9mIHRoaXMgLmNsYXNzIGZpbGUsIG51bGwgaWYgbm9uZQogCSAqLwogCUlJbm5lckNsYXNzZXNBdHRyaWJ1dGUgZ2V0SW5uZXJDbGFzc2VzQXR0cmlidXRlKCk7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXJyYXkgb2YgbWV0aG9kIGluZm9zIG9mIHRoaXMgLmNsYXNzIGZpbGUsCiAJICogYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG1ldGhvZCBpbmZvcyBvZiB0aGlzIC5jbGFzcyBmaWxlLAogCSAqIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKIAkgKi8KQEAgLTEyNSwxMTQgKzEyNSwxMTQgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIC5jbGFzcyBmaWxlLgogCSAqIFRoZSBuYW1lIGlzIHJldHVybmVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqICAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSAuY2xhc3MgZmlsZQogCSAqLwogCWNoYXJbXSBnZXRDbGFzc05hbWUoKTsKIAogCS8qKgotCSAqIEFuc3dlciBiYWNrIHRoZSBpbmRleCBvZiB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgY29uc3RhbnQgcG9vbCAKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXggb2YgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wKIAkgKiBvZiB0aGUgLmNsYXNzIGZpbGUuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjbGFzcyBuYW1lIGluIHRoZSBjb25zdGFudCBwb29sIAorCSAqCisJICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wKIAkgKi8KIAlpbnQgZ2V0Q2xhc3NJbmRleCgpOwotCQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIC5jbGFzcyBmaWxlLgotCSAqIFRoZSBuYW1lIGlzIHJldHVybmVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLiBBbnN3ZXIgbnVsbCBpZiAKKwkgKiBUaGUgbmFtZSBpcyByZXR1cm5lZCBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIG51bGwgaWYKIAkgKiBnZXRTdXBlcmNsYXNzSW5kZXgoKSBpcyB6ZXJvLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3Mgb2YgdGhpcyAuY2xhc3MgZmlsZSwgbnVsbCBpZiBnZXRTdXBlcmNsYXNzSW5kZXgoKSBpcyB6ZXJvCiAJICovCiAJY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCk7CiAKIAkvKioKLQkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXggb2YgdGhlIHN1cGVyY2xhc3MgbmFtZSBpbiB0aGUgY29uc3RhbnQgcG9vbCAKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXggb2YgdGhlIHN1cGVyY2xhc3MgbmFtZSBpbiB0aGUgY29uc3RhbnQgcG9vbAogCSAqIG9mIHRoZSAuY2xhc3MgZmlsZS4gQW5zd2VyIDAgaWYgdGhpcyAuY2xhc3MgZmlsZSByZXByZXNlbnRzIGphdmEubGFuZy5PYmplY3QuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzdXBlcmNsYXNzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3VwZXJjbGFzcyBuYW1lIGluIHRoZSBjb25zdGFudCBwb29sCiAJICogb2YgdGhlIC5jbGFzcyBmaWxlLCAwIGlmIHRoaXMgLmNsYXNzIGZpbGUgcmVwcmVzZW50cyBqYXZhLmxhbmcuT2JqZWN0LgogCSAqLwogCWludCBnZXRTdXBlcmNsYXNzSW5kZXgoKTsKIAogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgLmNsYXNzIGZpbGUgcmVwcmVzZW50cyBhbiBjbGFzcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgLmNsYXNzIGZpbGUgcmVwcmVzZW50cyBhbiBjbGFzcywgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBpc0NsYXNzKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIC5jbGFzcyBmaWxlIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyAuY2xhc3MgZmlsZSByZXByZXNlbnRzIGFuIGludGVyZmFjZSwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBpc0ludGVyZmFjZSgpOwogCiAJLyoqCiAJICogQW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKIAkgKi8KIAlJU291cmNlQXR0cmlidXRlIGdldFNvdXJjZUZpbGVBdHRyaWJ1dGUoKTsKIAogCS8qKgogCSAqIEFuc3dlciB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIC5jbGFzcyBmaWxlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIC5jbGFzcyBmaWxlCiAJICovCiAJSUNvbnN0YW50UG9vbCBnZXRDb25zdGFudFBvb2woKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIC5jbGFzcyBmaWxlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIC5jbGFzcyBmaWxlCiAJICovCiAJaW50IGdldE1pbm9yVmVyc2lvbigpOwogCiAJLyoqCiAJICogQW5zd2VyIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoaXMgLmNsYXNzIGZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoaXMgLmNsYXNzIGZpbGUKIAkgKi8KIAlpbnQgZ2V0TWFqb3JWZXJzaW9uKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXR0cmlidXRlIG51bWJlciBvZiB0aGUgLmNsYXNzIGZpbGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbnVtYmVyIG9mIHRoZSAuY2xhc3MgZmlsZQogCSAqLwogCWludCBnZXRBdHRyaWJ1dGVDb3VudCgpOwotCQorCiAJLyoqCi0JICogQW5zd2VyIGJhY2sgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGluZm8uIEl0IAorCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdAogCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZXMsIGV0Yy4gQW5zd2VycyBhbiBlbXB0eQogCSAqIGFycmF5IGlmIG5vbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQgaW5mby4gSXQgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdAogCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZXMsIGV0Yy4gQW5zd2VycyBhbiBlbXB0eQogCSAqIGFycmF5IGlmIG5vbmUKIAkgKi8KIAlJQ2xhc3NGaWxlQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG1hZ2ljIG51bWJlci4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG1hZ2ljIG51bWJlcgogCSAqLwogCWludCBnZXRNYWdpYygpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBmaWVsZCBpbmZvcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWVsZCBpbmZvcwogCSAqLwogCWludCBnZXRGaWVsZHNDb3VudCgpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBtZXRob2QgaW5mb3MuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWV0aG9kIGluZm9zCiAJICovCiAJaW50IGdldE1ldGhvZHNDb3VudCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29kZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29kZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDI4ZDViYjkuLmVlNzhkOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb2RlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMzYgKzEyLDM2IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBjb2RlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJQ29kZUF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBtYXggbG9jYWxzIHZhbHVlIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG1heCBsb2NhbHMgdmFsdWUgb2YgdGhlIGNvZGUgYXR0cmlidXRlCiAJICovCiAJaW50IGdldE1heExvY2FscygpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG1heCBzdGFjayB2YWx1ZSBvZiB0aGUgY29kZSBhdHRyaWJ1dGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtYXggc3RhY2sgdmFsdWUgb2YgdGhlIGNvZGUgYXR0cmlidXRlCiAJICovCiAJaW50IGdldE1heFN0YWNrKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlLCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlLCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCiAJICovCiAJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZSwgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZSwgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZQogCSAqLwogCUlMb2NhbFZhcmlhYmxlQXR0cmlidXRlIGdldExvY2FsVmFyaWFibGVBdHRyaWJ1dGUoKTsKQEAgLTQ5LDE2ICs0OSwxNiBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhcnJheSBvZiBleGNlcHRpb24gZW50cmllcywgaWYgdGhleSBhcmUgcHJlc2VudC4KIAkgKiBBbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBleGNlcHRpb24gZW50cmllcywgaWYgdGhleSBhcmUgcHJlc2VudC4KIAkgKiBBbiBlbXB0eSBhcnJheSBvdGhlcndpc2UKIAkgKi8KIAlJRXhjZXB0aW9uVGFibGVFbnRyeVtdIGdldEV4Y2VwdGlvblRhYmxlKCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXJyYXkgb2YgYnl0ZXMsIHdoaWNoIHJlcHJlc2VudHMgYWxsIHRoZSBvcGNvZGVzIGFzIGRlc2NyaWJlZAogCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBieXRlcywgd2hpY2ggcmVwcmVzZW50cyBhbGwgdGhlIG9wY29kZXMgYXMgZGVzY3JpYmVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNjYsMjQgKzY2LDI0IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlY29kZSBjb250ZW50cy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZWNvZGUgY29udGVudHMKIAkgKi8KIAlsb25nIGdldENvZGVMZW5ndGgoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhdHRyaWJ1dGUgbnVtYmVyIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIGNvZGUgYXR0cmlidXRlCiAJICovCiAJaW50IGdldEF0dHJpYnV0ZXNDb3VudCgpOwogCiAJLyoqCi0JICogQW5zd2VyIGJhY2sgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGluZm8uIEl0IAorCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdAogCSAqIGluY2x1ZGVzIHRoZSBMaW5lTnVtYmVyQXR0cmlidXRlIGFuZCB0aGUgTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlLgogCSAqIFJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGluZm8uIEl0IAorCSAqCisJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQgaW5mby4gSXQKIAkgKiBpbmNsdWRlcyB0aGUgTGluZU51bWJlckF0dHJpYnV0ZSBhbmQgdGhlIExvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZS4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQogCSAqLwpAQCAtOTEsMTUgKzkxLDE1IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZXhjZXB0aW9uIHRhYmxlIGxlbmd0aCBvZiB0aGUgY29kZSBhdHRyaWJ1dGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdGFibGUgbGVuZ3RoIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZQogCSAqLwogCWludCBnZXRFeGNlcHRpb25UYWJsZUxlbmd0aCgpOwotCQorCiAJLyoqCiAJICogRGVmaW5lIGEgSmF2YSBvcGNvZGVzIHdhbGtlci4gQWxsIGFjdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIHZpc2l0b3IuCiAJICogQHBhcmFtIHZpc2l0b3IgVGhlIHZpc2l0b3IgdG8gdXNlIHRvIHdhbGsgdGhlIG9wY29kZXMuCi0JICogCisJICoKIAkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIG9wY29kZXMgY29udGFpbiBpbnZhbGlkIGJ5dGVzCiAJICovCiAJdm9pZCB0cmF2ZXJzZShJQnl0ZWNvZGVWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sLmphdmEKaW5kZXggYjA2ZDMwYy4uNjk1MjYwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTYgKzEyLDE2IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCBwb29sIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAgCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDb25zdGFudFBvb2wgewogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wKIAkgKi8KIAlpbnQgZ2V0Q29uc3RhbnRQb29sQ291bnQoKTsKQEAgLTI5LDcgKzI5LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgdHlwZSBvZiB0aGUgZW50cnkgYXQgdGhlIGluZGV4IEBpbmRleAogCSAqIGluIHRoZSBjb25zdGFudCBwb29sLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wKIAkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBlbnRyeSBhdCB0aGUgaW5kZXggQGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sCiAJICovCkBAIC0zOCw3ICszOCw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGVudHJ5IGF0IHRoZSBpbmRleCBAaW5kZXgKIAkgKiBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBjb25zdGFudCBwb29sCiAJICogQHJldHVybiB0aGUgZW50cnkgYXQgdGhlIGluZGV4IEBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbAogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbENvbnN0YW50LmphdmEKaW5kZXggN2MxNTQzMS4uYmM3Y2I1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sQ29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xDb25zdGFudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiw5IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgY29uc3RhbnQgcG9vbCBjb25zdGFudHMgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50UG9vbENvbnN0YW50IHsKIApAQCAtMzAsNyArMjksNyBAQAogCWludCBDT05TVEFOVF9Eb3VibGUgPSA2OwogCWludCBDT05TVEFOVF9OYW1lQW5kVHlwZSA9IDEyOwogCWludCBDT05TVEFOVF9VdGY4ID0gMTsKLQkKKwogCWludCBDT05TVEFOVF9NZXRob2RyZWZfU0laRSA9IDU7CiAJaW50IENPTlNUQU5UX0NsYXNzX1NJWkUgPSAzOwogCWludCBDT05TVEFOVF9Eb3VibGVfU0laRSA9IDk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sRW50cnkuamF2YQppbmRleCBlYzQ4MmM4Li40ODdhZDgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbEVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTYgKzEzLDE2IEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KICAqIEl0cyBjb250ZW50cyBpcyBpbml0aWFsaXplZCBhY2NvcmRpbmcgdG8gaXRzIGtpbmQuCi0gKiAKKyAqCiAgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAKKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50UG9vbEVudHJ5IHsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBlbnRyeS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBlbnRyeQogCSAqLwogCWludCBnZXRLaW5kKCk7CkBAIC0zMCw3ICszMCw3IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgbmFtZSBpbmRleCBmb3IgYSBDT05TVEFOVF9DbGFzcyB0eXBlIGVudHJ5LgogCSAqIFRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIGluZGV4IGZvciBhIENPTlNUQU5UX0NsYXNzIHR5cGUgZW50cnkKIAkgKi8KIAlpbnQgZ2V0Q2xhc3NJbmZvTmFtZUluZGV4KCk7CkBAIC0zOSw3ICszOSw3IEBACiAJICogUmV0dXJucyB0aGUgY2xhc3MgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCiAJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2xhc3MgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCiAJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeQogCSAqLwpAQCAtNDksMTYgKzQ5LDE2IEBACiAJICogUmV0dXJucyB0aGUgbmFtZUFuZFR5cGUgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCiAJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZUFuZFR5cGUgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCiAJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeQogCSAqLwogCWludCBnZXROYW1lQW5kVHlwZUluZGV4KCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgaW5kZXggZm9yIGEgQ09OU1RBTlRfU3RyaW5nIHR5cGUgZW50cnkuCiAJICogVGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHN0cmluZyBpbmRleCBmb3IgYSBDT05TVEFOVF9TdHJpbmcgdHlwZSBlbnRyeQogCSAqLwogCWludCBnZXRTdHJpbmdJbmRleCgpOwpAQCAtNjYsMTUgKzY2LDE1IEBACiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIGZvciBhIENPTlNUQU5UX1N0cmluZyB0eXBlIGVudHJ5LgogCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGEgQ09OU1RBTlRfU3RyaW5nIHR5cGUgZW50cnkKIAkgKi8KIAlTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgZm9yIGEgQ09OU1RBTlRfSW50ZWdlciB0eXBlIGVudHJ5LgogCSAqIFRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIGZvciBhIENPTlNUQU5UX0ludGVnZXIgdHlwZSBlbnRyeQogCSAqLwogCWludCBnZXRJbnRlZ2VyVmFsdWUoKTsKQEAgLTgyLDcgKzgyLDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmbG9hdCB2YWx1ZSBmb3IgYSBDT05TVEFOVF9GbG9hdCB0eXBlIGVudHJ5LgogCSAqIFRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSBmb3IgYSBDT05TVEFOVF9GbG9hdCB0eXBlIGVudHJ5CiAJICovCiAJZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpOwpAQCAtOTAsNyArOTAsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGRvdWJsZSB2YWx1ZSBmb3IgYSBDT05TVEFOVF9Eb3VibGUgdHlwZSBlbnRyeS4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlIGZvciBhIENPTlNUQU5UX0RvdWJsZSB0eXBlIGVudHJ5CiAJICovCiAJZG91YmxlIGdldERvdWJsZVZhbHVlKCk7CkBAIC05OCwxNSArOTgsMTUgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsb25nIHZhbHVlIGZvciBhIENPTlNUQU5UX0xvbmcgdHlwZSBlbnRyeS4KIAkgKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbG9uZyB2YWx1ZSBmb3IgYSBDT05TVEFOVF9Mb25nIHR5cGUgZW50cnkKIAkgKi8KIAlsb25nIGdldExvbmdWYWx1ZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBpbmRleCBmb3IgYSBDT05TVEFOVF9OYW1lQW5kVHlwZSB0eXBlIGVudHJ5LgogCSAqIFRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGluZGV4IGZvciBhIENPTlNUQU5UX05hbWVBbmRUeXBlIHR5cGUgZW50cnkKIAkgKi8KIAlpbnQgZ2V0TmFtZUFuZFR5cGVJbmZvRGVzY3JpcHRvckluZGV4KCk7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBuYW1lIGluZGV4IGZvciBhIENPTlNUQU5UX05hbWVBbmRUeXBlIHR5cGUgZW50cnkuCiAJICogVGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggZm9yIGEgQ09OU1RBTlRfTmFtZUFuZFR5cGUgdHlwZSBlbnRyeQogCSAqLwogCWludCBnZXROYW1lQW5kVHlwZUluZm9OYW1lSW5kZXgoKTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZm9yIGEgQ09OU1RBTlRfQ2xhc3MgdHlwZSBlbnRyeS4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgYSBDT05TVEFOVF9DbGFzcyB0eXBlIGVudHJ5CiAJICovCiAJY2hhcltdIGdldENsYXNzSW5mb05hbWUoKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCiAJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgYSBDT05TVEFOVF9GaWVsZHJlZiwKIAkgKiBDT05TVEFOVF9NZXRob2RyZWYsIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiB0eXBlIGVudHJ5CiAJICovCkBAIC0xNDAsMTYgKzE0MCwxNiBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIGZpZWxkIG5hbWUgZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYgdHlwZSBlbnRyeS4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZmllbGQgbmFtZSBmb3IgYSBDT05TVEFOVF9GaWVsZHJlZiB0eXBlIGVudHJ5CiAJICovCiAJY2hhcltdIGdldEZpZWxkTmFtZSgpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZmllbGQgbmFtZSBmb3IgYSBDT05TVEFOVF9NZXRob2RyZWYgb3IgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVkCiAJICogdHlwZSBlbnRyeS4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZmllbGQgbmFtZSBmb3IgYSBDT05TVEFOVF9NZXRob2RyZWYgb3IgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVkCiAJICogdHlwZSBlbnRyeQogCSAqLwpAQCAtMTU3LDkgKzE1Nyw5IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBmaWVsZCBkZXNjcmlwdG9yIHZhbHVlIGZvciBhIENPTlNUQU5UX0ZpZWxkcmVmIHR5cGUgZW50cnkuIFRoaXMgdmFsdWUKLQkgKiBpcyBzZXQgb25seSB3aGVuIGRlY29kaW5nIHRoZSBDT05TVEFOVF9GaWVsZHJlZiBlbnRyeS4gCisJICogaXMgc2V0IG9ubHkgd2hlbiBkZWNvZGluZyB0aGUgQ09OU1RBTlRfRmllbGRyZWYgZW50cnkuCiAJICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGZpZWxkIGRlc2NyaXB0b3IgdmFsdWUgZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYgdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZQogCSAqIGlzIHNldCBvbmx5IHdoZW4gZGVjb2RpbmcgdGhlIENPTlNUQU5UX0ZpZWxkcmVmIGVudHJ5CiAJICovCkBAIC0xNjcsMzEgKzE2NywzMSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IgdmFsdWUgZm9yIGEgQ09OU1RBTlRfTWV0aG9kcmVmIG9yCi0JICogQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIHR5cGUgZW50cnkuIFRoaXMgdmFsdWUgaXMgc2V0IG9ubHkgd2hlbiBkZWNvZGluZyB0aGUgCi0JICogQ09OU1RBTlRfTWV0aG9kcmVmIG9yIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiBlbnRyeS4gCisJICogQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIHR5cGUgZW50cnkuIFRoaXMgdmFsdWUgaXMgc2V0IG9ubHkgd2hlbiBkZWNvZGluZyB0aGUKKwkgKiBDT05TVEFOVF9NZXRob2RyZWYgb3IgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIGVudHJ5LgogCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtZXRob2QgZGVzY3JpcHRvciB2YWx1ZSBmb3IgYSBDT05TVEFOVF9NZXRob2RyZWYgb3IKLQkgKiBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuIGRlY29kaW5nIHRoZSAKKwkgKiBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuIGRlY29kaW5nIHRoZQogCSAqIENPTlNUQU5UX01ldGhvZHJlZiBvciBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgZW50cnkKIAkgKi8KIAljaGFyW10gZ2V0TWV0aG9kRGVzY3JpcHRvcigpOwotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdXRmOCB2YWx1ZSBmb3IgYSBDT05TVEFOVF9VdGY4IHR5cGUgZW50cnkuIFRoaXMgdmFsdWUgaXMgc2V0IG9ubHkgd2hlbgogCSAqIGRlY29kaW5nIGEgVVRGOCBlbnRyeS4KIAkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdXRmOCB2YWx1ZSBmb3IgYSBDT05TVEFOVF9VdGY4IHR5cGUgZW50cnkuIFRoaXMgdmFsdWUgaXMgc2V0IG9ubHkgd2hlbgogCSAqIGRlY29kaW5nIGEgVVRGOCBlbnRyeQogCSAqLwogCWNoYXJbXSBnZXRVdGY4VmFsdWUoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHV0ZjggbGVuZ3RoIGZvciBhIENPTlNUQU5UX1V0ZjggdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuCiAJICogZGVjb2RpbmcgYSBVVEY4IGVudHJ5LgogCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSB1dGY4IGxlbmd0aCBmb3IgYSBDT05TVEFOVF9VdGY4IHR5cGUgZW50cnkuIFRoaXMgdmFsdWUgaXMgc2V0IG9ubHkgd2hlbgogCSAqIGRlY29kaW5nIGEgVVRGOCBlbnRyeQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDU5NGViMDUuLjBjOWM5MDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFZhbHVlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMjYgKzExLDI2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgotICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBEZXNjcmlwdGlvbiBvZiBhIGNvbnN0YW50IHZhbHVlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTQogICogc3BlY2lmaWNhdGlvbnMuCi0gKiAKKyAqCiAgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAKKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBjb25zdGFudCB2YWx1ZSBpbmRleC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlIGluZGV4CiAJICovCiAJaW50IGdldENvbnN0YW50VmFsdWVJbmRleCgpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdGhhdCByZXByZXNlbnRzIHRoZSBjb25zdGFudAogCSAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnN0YW50CiAJICogdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmphdmEKaW5kZXggYjdmZTUxOS4uOTBhMDNiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTcgKzEzLDE3IEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGFuIGVuY2xvc2luZyBtZXRob2QgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAgKiAoYWRkZWQgaW4gSjJTRSAxLjUpLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGVuY2xvc2luZyBjbGFzcyBuYW1lIGFzIHNwZWNpZmllZAogCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmcgY2xhc3MgbmFtZSBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC0zMSw3ICszMSw3IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZW5jbG9zaW5nIGNsYXNzIG5hbWUgaW5kZXguCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmcgY2xhc3MgbmFtZSBpbmRleAogCSAqLwogCWludCBnZXRFbmNsb3NpbmdDbGFzc0luZGV4KCk7CkBAIC0zOSw3ICszOSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG1ldGhvZCBkZXNjcmlwdG9yIG9mIHRoZSBlbmNsb3NpbmcgbWV0aG9kIGFzIHNwZWNpZmllZAogCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBtZXRob2QgZGVzY3JpcHRvciBvZiB0aGUgZW5jbG9zaW5nIG1ldGhvZCBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC00Nyw3ICs0Nyw3IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGUgZW5jbG9zaW5nIG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgaW5kZXggb2YgdGhlIGVuY2xvc2luZyBtZXRob2QKIAkgKi8KIAlpbnQgZ2V0TWV0aG9kRGVzY3JpcHRvckluZGV4KCk7CkBAIC01NSw3ICs1NSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBtZXRob2QgYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBtZXRob2QgYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNjMsMTQgKzYzLDE0IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBpbmRleCBvZiB0aGUgZW5jbG9zaW5nIG1ldGhvZC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggb2YgdGhlIGVuY2xvc2luZyBtZXRob2QKIAkgKi8KIAlpbnQgZ2V0TWV0aG9kTmFtZUluZGV4KCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBhbmQgdHlwZSBpbmRleCBvZiB0aGlzIGF0dHJpYnV0ZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgYW5kIHR5cGUgaW5kZXggb2YgdGhpcyBhdHRyaWJ1dGUKIAkgKi8KIAlpbnQgZ2V0TWV0aG9kTmFtZUFuZFR5cGVJbmRleCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25BdHRyaWJ1dGUuamF2YQppbmRleCAzYTYxMGJiLi45OGM0OTI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25BdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25BdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxOCArMTEsMTggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCi0gKiBEZXNjcmlwdGlvbiBvZiBhIGNvbnN0YW50IHZhbHVlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIERlc2NyaXB0aW9uIG9mIGEgY29uc3RhbnQgdmFsdWUgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNCiAgKiBzcGVjaWZpY2F0aW9ucy4KLSAqICAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJRXhjZXB0aW9uQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGV4Y2VwdGlvbnMgb2YgdGhlIGV4Y2VwdGlvbiBhdHRyaWJ1dGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9ucyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZQogCSAqLwogCWludCBnZXRFeGNlcHRpb25zTnVtYmVyKCk7CkBAIC0zMCw3ICszMCw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGV4Y2VwdGlvbiBuYW1lcyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZS4gQW5zd2VycyBhbgogCSAqIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiBuYW1lcyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZS4gQW5zd2VycyBhbgogCSAqIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQogCSAqLwpAQCAtMzksNyArMzksNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBleGNlcHRpb24gaW5kZXhlcyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZS4gQW5zd2VycyBhbgogCSAqIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiBpbmRleGVzIG9mIHRoZSBleGNlcHRpb24gYXR0cmlidXRlLiBBbnN3ZXJzIGFuCiAJICogZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25UYWJsZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKaW5kZXggN2NjZTE1Yy4uOGY5OTM4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvblRhYmxlRW50cnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwzOSArMTEsMzkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlIG9mIGEgSUNvZGVBdHRyaWJ1dGUgYXMgCisgKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlIG9mIGEgSUNvZGVBdHRyaWJ1dGUgYXMKICAqIHNwZWNpZmllZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VwdGlvblRhYmxlRW50cnkgewogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIHN0YXJ0IHBjIG9mIHRoaXMgZW50cnkuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzdGFydCBwYyBvZiB0aGlzIGVudHJ5CiAJICovCiAJaW50IGdldFN0YXJ0UEMoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBlbmQgcGMgb2YgdGhpcyBlbnRyeS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGVuZCBwYyBvZiB0aGlzIGVudHJ5CiAJICovCiAJaW50IGdldEVuZFBDKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgaGFuZGxlciBwYyBvZiB0aGlzIGVudHJ5LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaGFuZGxlciBwYyBvZiB0aGlzIGVudHJ5CiAJICovCiAJaW50IGdldEhhbmRsZXJQQygpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGNhdGNoIHR5cGUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjYXRjaCB0eXBlIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sCiAJICovCiAJaW50IGdldENhdGNoVHlwZUluZGV4KCk7CkBAIC01MSw3ICs1MSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGNhdGNoIHR5cGUgbmFtZSwgbnVsbCBpZiBnZXRDYXRjaFR5cGVJbmRleCgpIHJldHVybnMgMC4KIAkgKiBUaGlzIGlzIHRoZSBjYXNlIGZvciBhbnkgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjYXRjaCB0eXBlIG5hbWUsIG51bGwgaWYgZ2V0Q2F0Y2hUeXBlSW5kZXgoKSByZXR1cm5zIDAuCiAJICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgYW55IGV4Y2VwdGlvbiBoYW5kbGVyCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lGaWVsZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCmluZGV4IDcxYjhmYjIuLmNmY2E1NTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDM1ICsxMSwzNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKLSAqIERlc2NyaXB0aW9uIG9mIGEgZmllbGQgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIERlc2NyaXB0aW9uIG9mIGEgZmllbGQgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTQogICogc3BlY2lmaWNhdGlvbnMuCi0gKiAgCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkSW5mbyB7CiAKIAkvKioKLQkgKiBBbnN3ZXIgYmFjayB0aGUgY29uc3RhbnQgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgZmllbGQgaW5mbyBpZiBzcGVjaWZpZWQsIAorCSAqIEFuc3dlciBiYWNrIHRoZSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyBmaWVsZCBpbmZvIGlmIHNwZWNpZmllZCwKIAkgKiBudWxsIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyBmaWVsZCBpbmZvIGlmIHNwZWNpZmllZCwgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyBmaWVsZCBpbmZvIGlmIHNwZWNpZmllZCwKIAkgKiBudWxsIG90aGVyd2lzZQogCSAqLwogCUlDb25zdGFudFZhbHVlQXR0cmlidXRlIGdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGlzIGZpZWxkIGluZm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGlzIGZpZWxkIGluZm8KIAkgKi8KIAlpbnQgZ2V0QWNjZXNzRmxhZ3MoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQgaW5mby4gVGhlIG5hbWUgaXMgcmV0dXJuZWQgYXMKIAkgKiBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWVsZCBpbmZvLiBUaGUgbmFtZSBpcyByZXR1cm5lZCBhcwogCSAqIHNwZWNpZmllZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC00NywxNSArNDcsMTUgQEAKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIGluZGV4IG9mIHRoaXMgZmllbGQgaW5mby4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbmZvCiAJICovCiAJaW50IGdldE5hbWVJbmRleCgpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBmaWVsZCBpbmZvLiBUaGUgZGVzY3JpcHRvciBpcyByZXR1cm5lZCBhcwogCSAqIHNwZWNpZmllZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIGZpZWxkIGluZm8uIFRoZSBkZXNjcmlwdG9yIGlzIHJldHVybmVkIGFzCiAJICogc3BlY2lmaWVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTYzLDE0ICs2MywxNCBAQAogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGRlc2NyaXB0b3IgaW5kZXggb2YgdGhpcyBmaWVsZCBpbmZvLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIGZpZWxkIGluZm8KIAkgKi8KIAlpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCk7CiAKIAkvKioKIAkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaW5mbyBoYXMgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaW5mbyBoYXMgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZQogCSAqLwogCWJvb2xlYW4gaGFzQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSgpOwpAQCAtNzgsMzUgKzc4LDM1IEBACiAJLyoqCiAJICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGluZm8gaXMgc3ludGhldGljIGFjY29yZGluZyB0byB0aGUgSlZNIHNwZWNpZmljYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KIAkgKiA8cD5Ob3RlIHRoYXQgcHJpb3IgdG8gSkRLIDEuNSwgc3ludGhldGljIGZpZWxkcyB3ZXJlIGFsd2F5cyBtYXJrZWQgdXNpbmcKLQkgKiBhbiBhdHRyaWJ1dGU7IHdpdGggMS41LCBzeW50aGV0aWMgZmllbGRzIGNhbiBhbHNvIGJlIG1hcmtlZCB1c2luZyAKKwkgKiBhbiBhdHRyaWJ1dGU7IHdpdGggMS41LCBzeW50aGV0aWMgZmllbGRzIGNhbiBhbHNvIGJlIG1hcmtlZCB1c2luZwogCSAqIHRoZSB7QGxpbmsgSU1vZGlmaWVyQ29uc3RhbnRzI0FDQ19TWU5USEVUSUN9IGZsYWcuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpbmZvIGlzIHN5bnRoZXRpYyBhY2NvcmRpbmcgdG8gdGhlIEpWTSBzcGVjaWZpY2F0aW9uLCBmYWxzZSBvdGhlcndpc2UKIAkgKi8KIAlib29sZWFuIGlzU3ludGhldGljKCk7CiAKIAkvKioKIAkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaW5mbyBoYXMgYSBkZXByZWNhdGVkIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpbmZvIGhhcyBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlLCBmYWxzZSBvdGhlcndpc2UKIAkgKi8KIAlib29sZWFuIGlzRGVwcmVjYXRlZCgpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIGZpZWxkIGluZm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbnVtYmVyIG9mIHRoZSBmaWVsZCBpbmZvCiAJICovCiAJaW50IGdldEF0dHJpYnV0ZUNvdW50KCk7CiAKLQkKKwogCS8qKgotCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdCAKKwkgKiBBbnN3ZXIgYmFjayB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQgaW5mby4gSXQKIAkgKiBpbmNsdWRlcyBTeW50aGV0aWNBdHRyaWJ1dGUsIENvbnN0YW50VmFsdWVBdHRyaWJ1dGVzLCBldGMuCiAJICogUmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQgaW5mby4gSXQgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdAogCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZXMsIGV0Yy4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQppbmRleCBiMzcwMjE4Li5hZGE4NWEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxOSArMTEsMTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCi0gKiBEZXNjcmlwdGlvbiBvZiBhIGlubmVyIGNsYXNzIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIERlc2NyaXB0aW9uIG9mIGEgaW5uZXIgY2xhc3MgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNCiAgKiBzcGVjaWZpY2F0aW9ucy4KLSAqICAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSW5uZXJDbGFzc2VzQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGlubmVyIGNsYXNzZXMgaW5mb3MgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbm5lciBjbGFzc2VzIGluZm9zIGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTMyLDcgKzMyLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXJyYXkgb2YgaW5uZXIgYXR0cmlidXRlIGVudHJpZXMgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGlubmVyIGF0dHJpYnV0ZSBlbnRyaWVzIGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhCmluZGV4IGRhOGU5YjUuLjBkNzgyNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxOSArMTEsMTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCi0gKiBEZXNjcmlwdGlvbiBvZiBhIGlubmVyIGNsYXNzIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBEZXNjcmlwdGlvbiBvZiBhIGlubmVyIGNsYXNzIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0KICAqIHNwZWNpZmljYXRpb25zLgotICogIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYWNjZXNzIGZsYWcgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYWNjZXNzIGZsYWcgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC0zMiw3ICszMiw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGlubmVyIG5hbWUgaW5kZXggb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaW5uZXIgbmFtZSBpbmRleCBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTQxLDcgKzQxLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgb3V0ZXIgY2xhc3MgbmFtZSBpbmRleCBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBvdXRlciBjbGFzcyBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNTAsNyArNTAsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBpbm5lciBjbGFzcyBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGlubmVyIGNsYXNzIG5hbWUgaW5kZXggb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC01OSw3ICs1OSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGlubmVyIG5hbWUgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLCBudWxsIGlmIGlubmVyIG5hbWUgaW5kZXggaXMgZXF1YWxzIHRvIHplcm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBpbm5lciBuYW1lIG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgbnVsbCBpZiBpbm5lciBuYW1lIGluZGV4IGlzIGVxdWFscyB0byB6ZXJvCiAJICovCkBAIC02OCw3ICs2OCw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG91dGVyIGNsYXNzIG5hbWUgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLCBudWxsIGlmIG91dGVyIGNsYXNzIG5hbWUgaW5kZXggaXMgZXF1YWxzIHRvIHplcm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBvdXRlciBjbGFzcyBuYW1lIG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgbnVsbCBpZiBvdXRlciBjbGFzcyBuYW1lIGluZGV4IGlzIGVxdWFscyB0byB6ZXJvCiAJICovCkBAIC03Nyw3ICs3Nyw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGlubmVyIGNsYXNzIG5hbWUgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLCBudWxsIGlmIGlubmVyIGNsYXNzIG5hbWUgaW5kZXggaXMgZXF1YWxzIHRvIHplcm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBpbm5lciBjbGFzcyBuYW1lIG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgbnVsbCBpZiBpbm5lciBjbGFzcyBuYW1lIGluZGV4IGlzIGVxdWFscyB0byB6ZXJvCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMaW5lTnVtYmVyQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKaW5kZXggOGVjYzQ4ZC4uYmVkZmYxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxpbmVOdW1iZXJBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw5ICsxMiw5IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAgCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUxpbmVOdW1iZXJBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKQEAgLTIyLDE3ICsyMiwxNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBsaW5lIG51bWJlciB0YWJsZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCiAJaW50IGdldExpbmVOdW1iZXJUYWJsZUxlbmd0aCgpOwogCiAJLyoqCi0JICogQW5zd2VyIGJhY2sgdGhlIGFycmF5IG9mIHBhaXJzIChzdGFydCBwYywgbGluZSBudW1iZXIpIGFzIHNwZWNpZmllZCBpbiB0aGUgCisJICogQW5zd2VyIGJhY2sgdGhlIGFycmF5IG9mIHBhaXJzIChzdGFydCBwYywgbGluZSBudW1iZXIpIGFzIHNwZWNpZmllZCBpbiB0aGUKIAkgKiBKVk0gc3BlY2lmaWNhdGlvbnMuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiBub25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhaXJzIChzdGFydCBwYywgbGluZSBudW1iZXIpIGFzIHNwZWNpZmllZCBpbiB0aGUgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwYWlycyAoc3RhcnQgcGMsIGxpbmUgbnVtYmVyKSBhcyBzcGVjaWZpZWQgaW4gdGhlCiAJICogSlZNIHNwZWNpZmljYXRpb25zLiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQogCSAqLwogCWludFtdW10gZ2V0TGluZU51bWJlclRhYmxlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKaW5kZXggOWUzZWVjMi4uNjIzM2M2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiw5ICsxMiw5IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAgCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKQEAgLTIyLDcgKzIyLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbG9jYWwgdmFyaWFibGUgdGFibGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlIHRhYmxlIGxlbmd0aCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTMxLDEwICszMSwxMCBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBsb2NhbCB2YXJpYWJsZSB0YWJsZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgdGFibGUgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQogCSAqLwogCUlMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGdldExvY2FsVmFyaWFibGVUYWJsZSgpOwotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YQppbmRleCA1NWZkZWU0Li4wYTBjY2FhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTcgKzEyLDE3IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSB0YWJsZSBlbnRyeSBhcyBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgc3RhcnQgcGMgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc3RhcnQgcGMgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC0zMSw3ICszMSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGxlbmd0aCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC00MCw3ICs0MCw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTQ5LDcgKzQ5LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZGVzY3JpcHRvciBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNTgsMTYgKzU4LDE2IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGluZGV4IG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwogCWludCBnZXRJbmRleCgpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKIAkgKi8KQEAgLTc2LDcgKzc2LDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDBhMzI4MzkuLjAwOGE3MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUeXBlVGFibGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVHlwZVRhYmxlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsOSArMTMsOSBAQAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlIHR5cGUgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAgKiAoYWRkZWQgaW4gSjJTRSAxLjUpLgotICogIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElMb2NhbFZhcmlhYmxlVHlwZVRhYmxlQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7CkBAIC0yMyw3ICsyMyw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgdGFibGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtMzIsNyArMzIsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHRhYmxlIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUVudHJ5LmphdmEKaW5kZXggMTliZTM0My4uMjQ1NmM0NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTcgKzEzLDE3IEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUgdHlwZSB0YWJsZSBlbnRyeSBhcyBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogICogKGFkZGVkIGluIEoyU0UgMS41KS4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElMb2NhbFZhcmlhYmxlVHlwZVRhYmxlRW50cnkgewotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIHN0YXJ0IHBjIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHN0YXJ0IHBjIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtMzIsNyArMzIsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBsZW5ndGggb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNDEsNyArNDEsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC01MCw3ICs1MCw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIHNpZ25hdHVyZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBzaWduYXR1cmUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC01OSwxNiArNTksMTYgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXggb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCiAJaW50IGdldEluZGV4KCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgogCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNzcsNyArNzcsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KIAkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTWV0aG9kSW5mby5qYXZhCmluZGV4IDdlYWM5ZTEuLmU1MDE0MDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1ldGhvZEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNZXRob2RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTEgKzExLDExIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgotICogRGVzY3JpcHRpb24gb2YgYSBtZXRob2QgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIERlc2NyaXB0aW9uIG9mIGEgbWV0aG9kIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0KICAqIHNwZWNpZmljYXRpb25zLgotICogIAorICoKICAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCisgKgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNZXRob2RJbmZvIHsKQEAgLTIzLDcgKzIzLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbWV0aG9kIGRlc2NyaXB0b3Igb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbWV0aG9kIGRlc2NyaXB0b3Igb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC0zMSw3ICszMSw3IEBACiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIG1ldGhvZCBpbmZvLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIG1ldGhvZCBpbmZvCiAJICovCiAJaW50IGdldERlc2NyaXB0b3JJbmRleCgpOwpAQCAtMzksNyArMzksNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhY2Nlc3MgZmxhZ3Mgb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYWNjZXNzIGZsYWdzIG9mIHRoaXMgbWV0aG9kIGluZm8gYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtNDgsNyArNDgsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGluZm8gYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCkBAIC01NiwxNSArNTYsMTUgQEAKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIGluZGV4IG9mIHRoaXMgbWV0aG9kIGluZm8uCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBuYW1lIGluZGV4IG9mIHRoaXMgbWV0aG9kIGluZm8KIAkgKi8KIAlpbnQgZ2V0TmFtZUluZGV4KCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpbmZvIHJlcHJlc2VudHMgYSAmbHQ7Y2xpbml0Jmd0OyBtZXRob2QsCiAJICogZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gcmVwcmVzZW50cyBhICZsdDtjbGluaXQmZ3Q7IG1ldGhvZCwKIAkgKiBmYWxzZSBvdGhlcndpc2UKIAkgKi8KQEAgLTczLDcgKzczLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpbmZvIHJlcHJlc2VudHMgYSBjb25zdHJ1Y3RvciwKIAkgKiBmYWxzZSBvdGhlcndpc2UuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaW5mbyByZXByZXNlbnRzIGEgY29uc3RydWN0b3IsCiAJICogZmFsc2Ugb3RoZXJ3aXNlCiAJICovCkBAIC04MiwxMCArODIsMTAgQEAKIAkvKioKIAkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGluZm8gaXMgc3ludGhldGljIGFjY29yZGluZyB0byB0aGUgSlZNIHNwZWNpZmljYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KIAkgKiA8cD5Ob3RlIHRoYXQgcHJpb3IgdG8gSkRLIDEuNSwgc3ludGhldGljIGZpZWxkcyB3ZXJlIGFsd2F5cyBtYXJrZWQgdXNpbmcKLQkgKiBhbiBhdHRyaWJ1dGU7IHdpdGggMS41LCBzeW50aGV0aWMgZmllbGRzIGNhbiBhbHNvIGJlIG1hcmtlZCB1c2luZyAKKwkgKiBhbiBhdHRyaWJ1dGU7IHdpdGggMS41LCBzeW50aGV0aWMgZmllbGRzIGNhbiBhbHNvIGJlIG1hcmtlZCB1c2luZwogCSAqIHRoZSB7QGxpbmsgSU1vZGlmaWVyQ29uc3RhbnRzI0FDQ19TWU5USEVUSUN9IGZsYWcuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgaW5mbyBpcyBzeW50aGV0aWMgYWNjb3JkaW5nIHRvIHRoZSBKVk0gc3BlY2lmaWNhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBpc1N5bnRoZXRpYygpOwpAQCAtOTMsNyArOTMsNyBAQAogCS8qKgogCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gaGFzIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsCiAJICogZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gaGFzIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsCiAJICogZmFsc2Ugb3RoZXJ3aXNlCiAJICovCkBAIC0xMDIsMTUgKzEwMiwxNSBAQAogCS8qKgogCSAqIEFuc3dlciB0aGUgY29kZSBhdHRyaWJ1dGUgb2YgdGhpcyBtZXRob2QgaW5mbywgbnVsbCBpZiBub25lIG9yIGlmIHRoZSBkZWNvZGluZwogCSAqIGZsYWcgZG9lc24ndCBpbmNsdWRlIE1FVEhPRF9CT0RJRVMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjb2RlIGF0dHJpYnV0ZSBvZiB0aGlzIG1ldGhvZCBpbmZvLCBudWxsIGlmIG5vbmUgb3IgaWYgdGhlIGRlY29kaW5nCiAJICogZmxhZyBkb2Vzbid0IGluY2x1ZGUgTUVUSE9EX0JPRElFUwogCSAqLwogCUlDb2RlQXR0cmlidXRlIGdldENvZGVBdHRyaWJ1dGUoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZSBvZiB0aGlzIG1ldGhvZCBpbmZvLCBudWxsIGlzIG5vbmUuCi0JICogCisJICoKIAkgKiAJQHJldHVybiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZSBvZiB0aGlzIG1ldGhvZCBpbmZvLCBudWxsIGlzIG5vbmUKIAkgKi8KIAlJRXhjZXB0aW9uQXR0cmlidXRlIGdldEV4Y2VwdGlvbkF0dHJpYnV0ZSgpOwpAQCAtMTE4LDE5ICsxMTgsMTkgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYXR0cmlidXRlIG51bWJlciBvZiB0aGUgbWV0aG9kIGluZm8uIEl0IGluY2x1ZGVzIHRoZSBDb2RlQXR0cmlidXRlCiAJICogaWYgYW55IGV2ZW4gaWYgdGhlIGRlY29kaW5nIGZsYWdzIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYXR0cmlidXRlIG51bWJlciBvZiB0aGUgbWV0aG9kIGluZm8uIEl0IGluY2x1ZGVzIHRoZSBDb2RlQXR0cmlidXRlCiAJICogaWYgYW55IGV2ZW4gaWYgdGhlIGRlY29kaW5nIGZsYWdzIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTCiAJICovCiAJaW50IGdldEF0dHJpYnV0ZUNvdW50KCk7Ci0JCisKIAkvKioKLQkgKiBBbnN3ZXIgYmFjayB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgbWV0aG9kIGluZm8uIEl0IAorCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaW5mby4gSXQKIAkgKiBpbmNsdWRlcyBTeW50aGV0aWNBdHRyaWJ1dGUsIENvZGVBdHRyaWJ1dGVzLCBldGMuIEl0IGRvZXNuJ3QgaW5jbHVkZSB0aGUKIAkgKiBDb2RlQXR0cmlidXRlIGlmIHRoZSBkZWNvZGluZyBmbGFncyBkb2Vzbid0IGluY2x1ZGUgTUVUSE9EX0JPRElFUy4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaW5mby4gSXQgCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaW5mby4gSXQKIAkgKiBpbmNsdWRlcyBTeW50aGV0aWNBdHRyaWJ1dGUsIENvZGVBdHRyaWJ1dGVzLCBldGMuIEl0IGRvZXNuJ3QgaW5jbHVkZSB0aGUKIAkgKiBDb2RlQXR0cmlidXRlIGlmIHRoZSBkZWNvZGluZyBmbGFncyBkb2Vzbid0IGluY2x1ZGUgTUVUSE9EX0JPRElFUy4KIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTW9kaWZpZXJDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1vZGlmaWVyQ29uc3RhbnRzLmphdmEKaW5kZXggMzY1ODM3OS4uZGQ2NGMwYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTW9kaWZpZXJDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNb2RpZmllckNvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiw5IEBACiAKIC8qKgogICogRGVmaW5pdGlvbiBvZiB0aGUgbW9kaWZpZXIgY29uc3RhbnRzIGFzIHNwZWNpZmllZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotICogIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAotICogCisgKgogICogQHNpbmNlIDIuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElNb2RpZmllckNvbnN0YW50cyB7CiAKQEAgLTI3LDE0ICsyNiwxNCBAQAogCWludCBBQ0NfU1VQRVIgICAgICAgID0gMHgwMDIwOwogCWludCBBQ0NfU1lOQ0hST05JWkVEID0gMHgwMDIwOwogCWludCBBQ0NfVk9MQVRJTEUgICAgID0gMHgwMDQwOwotCQorCiAJLyoqCiAJICogSW5kaWNhdGVzIGEgYnJpZGdlIG1ldGhvZCAoYWRkZWQgaW4gSjJTRSAxLjUpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlpbnQgQUNDX0JSSURHRSAgICAgICA9IDB4MDA0MDsKIAlpbnQgQUNDX1RSQU5TSUVOVCAgICA9IDB4MDA4MDsKLQkKKwogCS8qKgogCSAqIEluZGljYXRlcyBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCAoYWRkZWQgaW4gSjJTRSAxLjUpLgogCSAqIEBzaW5jZSAzLjAKQEAgLTQzLDE5ICs0MiwxOSBAQAogCWludCBBQ0NfTkFUSVZFICAgICAgID0gMHgwMTAwOwogCWludCBBQ0NfSU5URVJGQUNFICAgID0gMHgwMjAwOwogCWludCBBQ0NfQUJTVFJBQ1QgICAgID0gMHgwNDAwOwotCWludCBBQ0NfU1RSSUNUICAgICAgID0gMHgwODAwOwkKKwlpbnQgQUNDX1NUUklDVCAgICAgICA9IDB4MDgwMDsKIAkvKioKIAkgKiBJbmRpY2F0ZXMgYSBzeW50aGV0aWMgbWVtYmVyLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlpbnQgQUNDX1NZTlRIRVRJQyAgICA9IDB4MTAwMDsKLQkKKwogCS8qKgogCSAqIEluZGljYXRlcyBhbiBhbm5vdGF0aW9uIChhZGRlZCBpbiBKMlNFIDEuNSkuCiAJICogQHNpbmNlIDMuMAogCSAqLwogCWludCBBQ0NfQU5OT1RBVElPTiAgID0gMHgyMDAwOwotCQorCiAJLyoqCiAJICogSW5kaWNhdGVzIGFuIGVudW0gKGFkZGVkIGluIEoyU0UgMS41KS4KIAkgKiBAc2luY2UgMy4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lPcGNvZGVNbmVtb25pY3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU9wY29kZU1uZW1vbmljcy5qYXZhCmluZGV4IGJiYmJlMmEuLjA2MTM0YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU9wY29kZU1uZW1vbmljcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU9wY29kZU1uZW1vbmljcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiw5IEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgZWFjaCBvcGNvZGUgbW5lbW9uaWMgYWNjb3JkaW5nIHRvIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAgCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAKKyAqCiAgKiBAc2luY2UgMi4wCisgKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSU9wY29kZU1uZW1vbmljcyB7CiAKQEAgLTIwNSw2ICsyMDQsMTAgQEAKIAlpbnQgSU5WT0tFU1BFQ0lBTCA9IDB4Qjc7CiAJaW50IElOVk9LRVNUQVRJQyA9IDB4Qjg7CiAJaW50IElOVk9LRUlOVEVSRkFDRSA9IDB4Qjk7CisJLyoqCisJICogQHNpbmNlIDMuNgorCSAqLworCWludCBJTlZPS0VEWU5BTUlDID0gMHhCQTsKIAlpbnQgTkVXID0gMHhCQjsKIAlpbnQgTkVXQVJSQVkgPSAweEJDOwogCWludCBBTkVXQVJSQVkgPSAweEJEOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUGFyYW1ldGVyQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUGFyYW1ldGVyQW5ub3RhdGlvbi5qYXZhCmluZGV4IDBiMzMwM2QuLmJiZTlmNzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVBhcmFtZXRlckFubm90YXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lQYXJhbWV0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTYgKzEzLDE2IEBACiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGEgcGFyYW1ldGVyIGFubm90YXRpb24gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKICAqIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVBhcmFtZXRlckFubm90YXRpb24gewogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucwogCSAqLwogCWludCBnZXRBbm5vdGF0aW9uc051bWJlcigpOwpAQCAtMzAsNyArMzAsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBhbm5vdGF0aW9ucyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KIAkgKiBBbnN3ZXJzIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb25zCiAJICovCiAJSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCAzZTc4Y2YyLi43YzI2ZTlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywyMyArMTMsMjMgQEAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBydW50aW1lIGludmlzaWJsZSBhbm5vdGF0aW9ucyBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKICAqIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucwogCSAqLwogCWludCBnZXRBbm5vdGF0aW9uc051bWJlcigpOwogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIGFubm90YXRpb25zLiBBbnN3ZXJzIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb25zCiAJICovCiAJSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCBmYWRiNGRkLi40NGQ3ZDM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywyMyArMTMsMjMgQEAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBydW50aW1lIGludmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAgKiAoYWRkZWQgaW4gSjJTRSAxLjUpLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAgCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAJICovCiAJaW50IGdldFBhcmFtZXRlcnNOdW1iZXIoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMuIEFuc3dlcnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFyYW1ldGVyIGFubm90YXRpb25zLiBBbnN3ZXJzIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KIAkgKi8KIAlJUGFyYW1ldGVyQW5ub3RhdGlvbltdIGdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEKaW5kZXggM2Y5YTBiMC4uZWY4MzVhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywyMyArMTMsMjMgQEAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAgKiAoYWRkZWQgaW4gSjJTRSAxLjUpLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0gKiAgCisgKgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zCiAJICovCiAJaW50IGdldEFubm90YXRpb25zTnVtYmVyKCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgYW5ub3RhdGlvbnMuIEFuc3dlcnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgYW5ub3RhdGlvbnMuIEFuc3dlcnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgogCSAqLwogCUlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCA5NzlhYzNiLi40YTY0ZjhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDIzICsxMywyMyBAQAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhIHJ1bnRpbWUgdmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb24KICAqIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAJICovCiAJaW50IGdldFBhcmFtZXRlcnNOdW1iZXIoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMuIEFuc3dlcnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFyYW1ldGVyIGFubm90YXRpb25zLiBBbnN3ZXJzIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KIAkgKi8KIAlJUGFyYW1ldGVyQW5ub3RhdGlvbltdIGdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTaWduYXR1cmVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNpZ25hdHVyZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGRkNDg3YzMuLmZiZDI1NTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNpZ25hdHVyZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNpZ25hdHVyZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDI1ICsxMywyNSBAQAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpZ25hdHVyZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKICAqIChhZGRlZCBpbiBKMlNFIDEuNSkuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJU2lnbmF0dXJlQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgc2lnbmF0dXJlIGluZGV4IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2lnbmF0dXJlIGluZGV4IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCiAJaW50IGdldFNpZ25hdHVyZUluZGV4KCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgc2lnbmF0dXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc2lnbmF0dXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICovCiAJY2hhcltdIGdldFNpZ25hdHVyZSgpOwotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTb3VyY2VBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNvdXJjZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDczYTVmN2EuLmNiNTUxZmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNvdXJjZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNvdXJjZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDI1ICsxMSwyNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKLSAqIERlc2NyaXB0aW9uIG9mIGEgc291cmNlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIERlc2NyaXB0aW9uIG9mIGEgc291cmNlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTQogICogc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqICAKKyAqCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewogCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIHNvdXJjZSBmaWxlIGluZGV4IG9mIHRoaXMgYXR0cmlidXRlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc291cmNlIGZpbGUgaW5kZXggb2YgdGhpcyBhdHRyaWJ1dGUKIAkgKi8KIAlpbnQgZ2V0U291cmNlRmlsZUluZGV4KCk7CiAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgc291cmNlIGZpbGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBmaWxlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUKIAkgKi8KIAljaGFyW10gZ2V0U291cmNlRmlsZU5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVN0YWNrTWFwQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTdGFja01hcEF0dHJpYnV0ZS5qYXZhCmluZGV4IGVjNTA2MGQuLjE2YjcwMzcgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVN0YWNrTWFwQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU3RhY2tNYXBBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMiwxNyArMTIsMTcgQEAKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzdGFjayBtYXAgYXR0cmlidXRlLgotICogCisgKgogICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAgCisgKgogICogQHNpbmNlIDMuMgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTdGFja01hcEF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYXRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYXRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtMzEsNyArMzEsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBzdGFjayBtYXAgZnJhbWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc3RhY2sgbWFwIGZyYW1lcyBmb3IgdGhpcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU3RhY2tNYXBGcmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU3RhY2tNYXBGcmFtZS5qYXZhCmluZGV4IDUyYzQzYTUuLjFkZDUzNGMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVN0YWNrTWFwRnJhbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTdGFja01hcEZyYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTMgKzEyLDEzIEBACiAKIC8qKgogICogRGVzY3JpcHRpb24gb2YgYSBzdGFjayBtYXAgZnJhbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAzLjIKICAqLwogcHVibGljIGludGVyZmFjZSBJU3RhY2tNYXBGcmFtZSB7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgZnJhbWUgdHlwZSBmb3IgdGhpcyBlbnRyeS4KIAkgKiA8dGFibGU+CkBAIC01NCwxNiArNTQsMTYgQEAKIAkgKiA8dGQ+RlVMTF9GUkFNRTwvdGQ+CiAJICogPHRkPjI1NTwvdGQ+CiAJICogPC90cj4KLQkgKiA8L3RhYmxlPiAKLQkgKiAKKwkgKiA8L3RhYmxlPgorCSAqCiAJICogQHJldHVybiB0aGUgZnJhbWUgdHlwZSBmb3IgdGhpcyBlbnRyeQogCSAqLwogCWludCBnZXRGcmFtZVR5cGUoKTsKIAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBvZmZzZXQgZGVsdGEuCi0JICogPHA+VGhpcyBpcyBub3QgZGVmaW5lZCBvbmx5IGZvciB0aGUgZnJhbWUgdHlwZXMgU0FNRSBhbmQgU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNLjwvcD4gIAotCSAqIAorCSAqIDxwPlRoaXMgaXMgbm90IGRlZmluZWQgb25seSBmb3IgdGhlIGZyYW1lIHR5cGVzIFNBTUUgYW5kIFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTS48L3A+CisJICoKIAkgKiBAcmV0dXJuIHRoZSBvZmZzZXQgZGVsdGEKIAkgKi8KIAlpbnQgZ2V0T2Zmc2V0RGVsdGEoKTsKQEAgLTcxLDcgKzcxLDcgQEAKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGxvY2Fscy4KIAkgKiA8cD5UaGlzIGlzIGRlZmluZWQgb25seSBmb3IgdGhlIGZyYW1lIHR5cGUgRlVMTF9GUkFNRS48L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbG9jYWxzCiAJICovCiAJaW50IGdldE51bWJlck9mTG9jYWxzKCk7CkBAIC03OSw3ICs3OSw3IEBACiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdmVyaWZpY2F0aW9uIGluZm9zIGZvciB0aGUgZGVmaW5lZCBsb2NhbHMuCiAJICogPHA+VGhpcyBpcyBkZWZpbmVkIG9ubHkgZm9yIGZyYW1lIHR5cGVzIEFQUEVORCBhbmQgRlVMTF9GUkFNRS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdmVyaWZpY2F0aW9uIGluZm9zIGZvciB0aGUgZGVmaW5lZCBsb2NhbHMKIAkgKi8KIAlJVmVyaWZpY2F0aW9uVHlwZUluZm9bXSBnZXRMb2NhbHMoKTsKQEAgLTg4LDE0ICs4OCwxNCBAQAogCSAqIEFuc3dlciBiYWNrIHRoZSBudW1iZXIgb2Ygc3RhY2sgaXRlbXMKIAkgKiA8cD5UaGlzIGlzIGRlZmluZWQgb25seSBmb3IgdGhlIGZyYW1lIHR5cGVzIFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTSwgU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0VYVEVOREVEIGFuZCBGVUxMX0ZSQU1FLgogCSAqIEZvciBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU0gYW5kIFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9FWFRFTkRFRCwgdGhlIGFuc3dlciBpcyBpbXBsaWNpdGVseSAxLjwvcD4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdGFjayBpdGVtcwogCSAqLwogCWludCBnZXROdW1iZXJPZlN0YWNrSXRlbXMoKTsKLQkKKwogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSB2ZXJpZmljYXRpb24gaW5mb3MgZm9yIHRoZSBzdGFjayBpdGVtcy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHZlcmlmaWNhdGlvbiBpbmZvcyBmb3IgdGhlIHN0YWNrIGl0ZW1zCiAJICovCiAJSVZlcmlmaWNhdGlvblR5cGVJbmZvW10gZ2V0U3RhY2tJdGVtcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDA2N2NkODYuLjQ4NDdiMWUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVN0YWNrTWFwVGFibGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTdGFja01hcFRhYmxlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTcgKzEyLDE3IEBACiAKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc3RhY2sgbWFwIHRhYmxlIGF0dHJpYnV0ZS4KLSAqIAorICoKICAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogIAorICoKICAqIEBzaW5jZSAzLjIKICAqLwogcHVibGljIGludGVyZmFjZSBJU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgewotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYXRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYXRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCiAJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpAQCAtMzEsNyArMzEsNyBAQAogCS8qKgogCSAqIEFuc3dlciBiYWNrIHRoZSBzdGFjayBtYXAgZnJhbWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQKIAkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgc3RhY2sgbWFwIGZyYW1lcyBmb3IgdGhpcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkCiAJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JVmVyaWZpY2F0aW9uVHlwZUluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVZlcmlmaWNhdGlvblR5cGVJbmZvLmphdmEKaW5kZXggODMwMGQ0Ny4uMDgzYTc5ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JVmVyaWZpY2F0aW9uVHlwZUluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lWZXJpZmljYXRpb25UeXBlSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDkgKzEyLDkgQEAKIAogLyoqCiAgKiBEZXNjcmlwdGlvbiBvZiBhIHZlcmlmaWNhdGlvbiB0eXBlIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKLSAqIAorICoKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJVmVyaWZpY2F0aW9uVHlwZUluZm8gewpAQCAtNjMsNyArNjMsNyBAQAogCSAqIEBzaW5jZSAzLjIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVNX1VOSU5JVElBTElaRUQgPSA4OwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIHRhZyBvZiB0aGlzIHZlcmlmaWNhdGlvbiB0eXBlIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCiAJICogPHVsPgpAQCAtNzcsMzUgKzc3LDM1IEBACiAJICogPGxpPjcgZm9yIHRoZSBvYmplY3QgdHlwZTwvbGk+CiAJICogPGxpPjggZm9yIHRoZSB1bmluaXRpYWxpemVkIG9mZnNldCB0eXBlPC9saT4KIAkgKiA8L3VsPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgdGFnIG9mIHRoaXMgdmVyaWZpY2F0aW9uIHR5cGUgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlpbnQgZ2V0VGFnKCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgb2Zmc2V0IG9mIHRoaXMgdmVyaWZpY2F0aW9uIHR5cGUgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KIAkgKiBUaGlzIG1ha2VzIHNlbnNlIG9ubHkgaWYgdGhlIHRhZyBpcyA4LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoaXMgdmVyaWZpY2F0aW9uIHR5cGUgaW5mbyBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucwogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlpbnQgZ2V0T2Zmc2V0KCk7Ci0JCisKIAkvKioKIAkgKiBBbnN3ZXIgYmFjayB0aGUgY29uc3RhbnQgcG9vbCBpbmRleCBvZiB0aGlzIHZlcmlmaWNhdGlvbiB0eXBlIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCiAJICogVGhpcyBtYWtlcyBzZW5zZSBvbmx5IGlmIHRoZSB0YWcgaXMgNy4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHBvb2wgaW5kZXggb2YgdGhpcyB2ZXJpZmljYXRpb24gdHlwZSBpbmZvIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogQHNpbmNlIDMuMAogCSAqLwogCWludCBnZXRDb25zdGFudFBvb2xJbmRleCgpOwotCQorCiAJLyoqCiAJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHR5cGUgcmVmZXJlbmNlZCBieSB0aGUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wKIAkgKiBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KIAkgKiBUaGlzIG1ha2VzIHNlbnNlIG9ubHkgaWYgdGhlIHRhZyBpcyA3LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdHlwZSByZWZlcmVuY2VkIGJ5IHRoZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbAogCSAqIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCiAJICogQHNpbmNlIDMuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9PcGNvZGVTdHJpbmdWYWx1ZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvT3Bjb2RlU3RyaW5nVmFsdWVzLmphdmEKaW5kZXggZGM2MDgwNy4uNWFjZDAyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9PcGNvZGVTdHJpbmdWYWx1ZXMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL09wY29kZVN0cmluZ1ZhbHVlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDExICsxMiwxMCBAQAogCiAvKioKICAqIERlc2NyaXB0aW9uIG9mIGVhY2ggb3Bjb2RlIG1uZW1vbmljIGFjY29yZGluZyB0byB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogIAorICoKICAqIEBzaW5jZSAyLjAKKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIE9wY29kZVN0cmluZ1ZhbHVlcyBpbXBsZW1lbnRzIElPcGNvZGVNbmVtb25pY3MgewogCkBAIC0yMDgsNiArMjA3LDcgQEAKIAkJQllURUNPREVfTkFNRVNbSU5WT0tFU1BFQ0lBTF0gPSAiaW52b2tlc3BlY2lhbCI7IC8vJE5PTi1OTFMtMSQKIAkJQllURUNPREVfTkFNRVNbSU5WT0tFU1RBVElDXSA9ICJpbnZva2VzdGF0aWMiOyAvLyROT04tTkxTLTEkCiAJCUJZVEVDT0RFX05BTUVTW0lOVk9LRUlOVEVSRkFDRV0gPSAiaW52b2tlaW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJTlZPS0VEWU5BTUlDXSA9ICJpbnZva2VkeW5hbWljIjsgLy8kTk9OLU5MUy0xJAogCQlCWVRFQ09ERV9OQU1FU1tORVddID0gIm5ldyI7IC8vJE5PTi1OTFMtMSQKIAkJQllURUNPREVfTkFNRVNbTkVXQVJSQVldID0gIm5ld2FycmF5IjsgLy8kTk9OLU5MUy0xJAogCQlCWVRFQ09ERV9OQU1FU1tBTkVXQVJSQVldID0gImFuZXdhcnJheSI7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Eb2N1bWVudEVsZW1lbnRQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Eb2N1bWVudEVsZW1lbnRQYXJzZXIuamF2YQppbmRleCBkNzMyMTMyLi5jZWE0NzYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCisgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMsNyArMjMsNyBAQAogCUlEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yOwogCXByaXZhdGUgaW50IGxvY2FsSW50UHRyOwogCXByaXZhdGUgaW50IGxhc3RGaWVsZEVuZFBvc2l0aW9uOwotCXByaXZhdGUgaW50IGxhc3RGaWVsZEJvZHlFbmRQb3NpdGlvbjsJCisJcHJpdmF0ZSBpbnQgbGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uOwogCXByaXZhdGUgaW50IHR5cGVTdGFydFBvc2l0aW9uOwogCXByaXZhdGUgbG9uZyBzZWxlY3RvclNvdXJjZVBvc2l0aW9uczsKIAlwcml2YXRlIGludCB0eXBlRGltczsKQEAgLTMzLDIzICszMywyMyBAQAogCS8qIGludFtdIHN0YWNrIGZvciBzdG9yaW5nIGphdmFkb2MgcG9zaXRpb25zICovCiAJaW50W11bXSBpbnRBcnJheVN0YWNrOwogCWludCBpbnRBcnJheVB0cjsKLQkKKwogcHVibGljIERvY3VtZW50RWxlbWVudFBhcnNlcigKLQlmaW5hbCBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvciwgCisJZmluYWwgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsCiAJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5LAogCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAJc3VwZXIobmV3IFByb2JsZW1SZXBvcnRlcigKLQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLCAKLQkJb3B0aW9ucywgCisJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKSwKKwkJb3B0aW9ucywKIAkJcHJvYmxlbUZhY3RvcnkpLAogCWZhbHNlKTsKIAl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQlpbnRBcnJheVN0YWNrID0gbmV3IGludFszMF1bXTsKKwl0aGlzLmludEFycmF5U3RhY2sgPSBuZXcgaW50WzMwXVtdOwogCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAJdGhpcy5qYXZhZG9jUGFyc2VyLmNoZWNrRG9jQ29tbWVudCA9IGZhbHNlOwotCQotCXRoaXMuc2V0TWV0aG9kc0Z1bGxSZWNvdmVyeShmYWxzZSk7Ci0JdGhpcy5zZXRTdGF0ZW1lbnRzUmVjb3ZlcnkoZmFsc2UpOworCisJc2V0TWV0aG9kc0Z1bGxSZWNvdmVyeShmYWxzZSk7CisJc2V0U3RhdGVtZW50c1JlY292ZXJ5KGZhbHNlKTsKIH0KIC8qCiAgKiBXaWxsIGNsZWFyIHRoZSBjb21tZW50IHN0YWNrIHdoZW4gbG9va2luZwpAQCAtNjEsMjQgKzYxLDIzIEBACiBwdWJsaWMgdm9pZCBjaGVja0NvbW1lbnQoKSB7CiAKIAkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCi0JcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CisJcHVzaE9uSW50QXJyYXlTdGFjayhnZXRKYXZhRG9jUG9zaXRpb25zKCkpOwogCWJvb2xlYW4gZGVwcmVjYXRlZCA9IGZhbHNlOwogCWludCBsYXN0Q29tbWVudEluZGV4ID0gLTE7Ci0JaW50IGNvbW1lbnRQdHIgPSBzY2FubmVyLmNvbW1lbnRQdHI7CisJaW50IGNvbW1lbnRQdHIgPSB0aGlzLnNjYW5uZXIuY29tbWVudFB0cjsKIAogCS8vc2luY2UgamRrMS4yIGxvb2sgb25seSBpbiB0aGUgbGFzdCBqYXZhIGRvYyBjb21tZW50Li4uCi0JbmV4dENvbW1lbnQgOiBmb3IgKGxhc3RDb21tZW50SW5kZXggPSBzY2FubmVyLmNvbW1lbnRQdHI7IGxhc3RDb21tZW50SW5kZXggPj0gMDsgbGFzdENvbW1lbnRJbmRleC0tKXsKLQkJLy9sb29rIGZvciBAZGVwcmVjYXRlZCBpbnRvIHRoZSBmaXJzdCBqYXZhZG9jIGNvbW1lbnQgcHJlY2VlZGluZyB0aGUgZGVjbGFyYXRpb24KLQkJaW50IGNvbW1lbnRTb3VyY2VTdGFydCA9IHNjYW5uZXIuY29tbWVudFN0YXJ0c1tsYXN0Q29tbWVudEluZGV4XTsKLQkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucy4pCi0JCWlmIChtb2RpZmllcnNTb3VyY2VTdGFydCAhPSAtMSAmJiBtb2RpZmllcnNTb3VyY2VTdGFydCA8IGNvbW1lbnRTb3VyY2VTdGFydCkgeworCW5leHRDb21tZW50IDogZm9yIChsYXN0Q29tbWVudEluZGV4ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7IGxhc3RDb21tZW50SW5kZXggPj0gMDsgbGFzdENvbW1lbnRJbmRleC0tKXsKKwkJLy8gc2tpcCBhbGwgbm9uLWphdmFkb2MgY29tbWVudHMgb3IgdGhvc2Ugd2hpY2ggYXJlIGFmdGVyIHRoZSBsYXN0IG1vZGlmaWVyCisJCWludCBjb21tZW50U291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tsYXN0Q29tbWVudEluZGV4XTsKKwkJaWYgKGNvbW1lbnRTb3VyY2VTdGFydCA8IDAgfHwgLy8gbGluZSBjb21tZW50CisJCQl0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzW2xhc3RDb21tZW50SW5kZXhdIDwgMCB8fCAvLyBibG9jayBjb21tZW50CisJCQkodGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCAhPSAtMSAmJiB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0IDwgY29tbWVudFNvdXJjZVN0YXJ0KSkgLy8gdGhlIGNvbW1lbnQgaXMgYWZ0ZXIgdGhlIG1vZGlmaWVyCisJCXsKIAkJCWNvbnRpbnVlIG5leHRDb21tZW50OwogCQl9Ci0JCWlmIChzY2FubmVyLmNvbW1lbnRTdG9wc1tsYXN0Q29tbWVudEluZGV4XSA8IDApIHsKLQkJCWNvbnRpbnVlIG5leHRDb21tZW50OwotCQl9Ci0JCWRlcHJlY2F0ZWQgPQotCQkJdGhpcy5qYXZhZG9jUGFyc2VyLmNoZWNrRGVwcmVjYXRpb24obGFzdENvbW1lbnRJbmRleCk7CisJCS8vIGNoZWNrIGNvbW1lbnQKKwkJZGVwcmVjYXRlZCA9IHRoaXMuamF2YWRvY1BhcnNlci5jaGVja0RlcHJlY2F0aW9uKGxhc3RDb21tZW50SW5kZXgpOwogCQlicmVhayBuZXh0Q29tbWVudDsKIAl9CiAJaWYgKGRlcHJlY2F0ZWQpIHsKQEAgLTg2LDI2ICs4NSw2NiBAQAogCX0KIAkvLyBtb2RpZnkgdGhlIG1vZGlmaWVyIHNvdXJjZSBzdGFydCB0byBwb2ludCBhdCB0aGUgZmlyc3QgY29tbWVudAogCWlmIChjb21tZW50UHRyID49IDApIHsKLQkJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHNjYW5uZXIuY29tbWVudFN0YXJ0c1swXTsKKwkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbMF07CisJCWlmICh0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPCAwKSB0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSAtdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwogCX0KIH0KIC8qCiAgKgogICogSU5URVJOQUwgVVNFLU9OTFkKICAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhdGNoRm9ybWFsUGFyYW1ldGVyKCkgeworCS8vIEZvcm1hbFBhcmFtZXRlciA6Oj0gVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCA9PT4gZmFsc2UKKwkvLyBGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVycyBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkID09PiB0cnVlCisJLyoKKwlhc3RTdGFjayA6CisJaWRlbnRpZmllclN0YWNrIDogdHlwZSBpZGVudGlmaWVyCisJaW50U3RhY2sgOiBkaW0gZGltCisJID09PgorCWFzdFN0YWNrIDogQXJndW1lbnQKKwlpZGVudGlmaWVyU3RhY2sgOgorCWludFN0YWNrIDoKKwkqLworCisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJY2hhcltdIHBhcmFtZXRlck5hbWUgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOworCWxvbmcgbmFtZVBvc2l0aW9ucyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCXRoaXMuaW50UHRyLS07IC8vIGRpbWVuc2lvbiBmcm9tIHRoZSB2YXJpYWJsZWRlY2xhcmF0b3JpZAorCVR5cGVSZWZlcmVuY2UgdHlwZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyLS1dOworCXRoaXMuaW50UHRyIC09IDM7CisJQXJndW1lbnQgYXJnID0KKwkJbmV3IEFyZ3VtZW50KAorCQkJcGFyYW1ldGVyTmFtZSwKKwkJCW5hbWVQb3NpdGlvbnMsCisJCQl0eXBlLAorCQkJdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ciArIDFdKTsvLyBtb2RpZmllcnMKKwlhcmcuYml0cyAmPSB+QVNUTm9kZS5Jc0FyZ3VtZW50OworCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLmV4cHJlc3Npb25TdGFjaywKKwkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsCisJCQlhcmcuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CisJfQorCXB1c2hPbkFzdFN0YWNrKGFyZyk7CisJdGhpcy5pbnRBcnJheVB0ci0tOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCkgewogCS8vIENsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IEJsb2NrCiAJLy9wdXNoIGFuIEluaXRpYWxpemVyCiAJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKIAogCXN1cGVyLmNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOwotCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBhc3RTdGFja1thc3RQdHJdOwotCXJlcXVlc3Rvci5hY2NlcHRJbml0aWFsaXplcigKKwlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0SW5pdGlhbGl6ZXIoCiAJCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCiAJCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kLAotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLCAKKwkJdGhpcy5pbnRBcnJheVN0YWNrW3RoaXMuaW50QXJyYXlQdHItLV0sCiAJCTAsCi0JCW1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKKwkJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCwKIAkJaW5pdGlhbGl6ZXIuYmxvY2suc291cmNlU3RhcnQsCiAJCWluaXRpYWxpemVyLmJsb2NrLnNvdXJjZUVuZCk7CiB9CkBAIC0xMjAsOCArMTU5LDggQEAKIAkJLy8gd2UgaWdub3JlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKIAkJcmV0dXJuOwogCX0KLQlyZXF1ZXN0b3IuZXhpdENsYXNzKGVuZFN0YXRlbWVudFBvc2l0aW9uLCAvLyAnfScgaXMgdGhlIGVuZCBvZiB0aGUgYm9keSAKLQkgKChUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl0pLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwl0aGlzLnJlcXVlc3Rvci5leGl0Q2xhc3ModGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbiwgLy8gJ30nIGlzIHRoZSBlbmQgb2YgdGhlIGJvZHkKKwkgKChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiB9CiAvKgogICoKQEAgLTEzMiwxMCArMTcxLDEwIEBACiAJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVyKCk7CiAJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CiAJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCi0JCWludEFycmF5UHRyLS07CisJCXRoaXMuaW50QXJyYXlQdHItLTsKIAkJcmV0dXJuOwogCX0KLQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbC5zdXBlckludGVyZmFjZXM7CiAJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBudWxsOwogCWludFtdIGludGVyZmFjZU5hbWVTdGFydHMgPSBudWxsOwpAQCAtMTQ3LDU2ICsxODYsNTYgQEAKIAkJaW50ZXJmYWNlTmFtZUVuZHMgPSBuZXcgaW50W3N1cGVySW50ZXJmYWNlc0xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VzTGVuZ3RoOyBpKyspIHsKIAkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV07Ci0JCQlpbnRlcmZhY2VOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlckludGVyZmFjZS5nZXRUeXBlTmFtZSgpLCAnLicpOyAKKwkJCWludGVyZmFjZU5hbWVzW2ldID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVySW50ZXJmYWNlLmdldFR5cGVOYW1lKCksICcuJyk7CiAJCQlpbnRlcmZhY2VOYW1lU3RhcnRzW2ldID0gc3VwZXJJbnRlcmZhY2Uuc291cmNlU3RhcnQ7CiAJCQlpbnRlcmZhY2VOYW1lRW5kc1tpXSA9IHN1cGVySW50ZXJmYWNlLnNvdXJjZUVuZDsKIAkJfQogCX0KIAkvLyBmbHVzaCB0aGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgY2xhc3MgaGVhZGVyCi0Jc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKIAlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSB0eXBlRGVjbC5zdXBlcmNsYXNzOwogCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJcmVxdWVzdG9yLmVudGVyQ2xhc3MoCi0JCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAotCQkJdHlwZURlY2wubW9kaWZpZXJzLCAKLQkJCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKLQkJCXR5cGVTdGFydFBvc2l0aW9uLCAKLQkJCXR5cGVEZWNsLm5hbWUsIAotCQkJdHlwZURlY2wuc291cmNlU3RhcnQsIAotCQkJdHlwZURlY2wuc291cmNlRW5kLCAKLQkJCW51bGwsIAotCQkJLTEsIAotCQkJLTEsIAotCQkJaW50ZXJmYWNlTmFtZXMsIAotCQkJaW50ZXJmYWNlTmFtZVN0YXJ0cywgCi0JCQlpbnRlcmZhY2VOYW1lRW5kcywgCi0JCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwkJdGhpcy5yZXF1ZXN0b3IuZW50ZXJDbGFzcygKKwkJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCisJCQl0aGlzLmludEFycmF5U3RhY2tbdGhpcy5pbnRBcnJheVB0ci0tXSwKKwkJCXR5cGVEZWNsLm1vZGlmaWVycywKKwkJCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LAorCQkJdGhpcy50eXBlU3RhcnRQb3NpdGlvbiwKKwkJCXR5cGVEZWNsLm5hbWUsCisJCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKKwkJCXR5cGVEZWNsLnNvdXJjZUVuZCwKKwkJCW51bGwsCisJCQktMSwKKwkJCS0xLAorCQkJaW50ZXJmYWNlTmFtZXMsCisJCQlpbnRlcmZhY2VOYW1lU3RhcnRzLAorCQkJaW50ZXJmYWNlTmFtZUVuZHMsCisJCQl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CiAJfSBlbHNlIHsKLQkJcmVxdWVzdG9yLmVudGVyQ2xhc3MoCi0JCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAotCQkJdHlwZURlY2wubW9kaWZpZXJzLCAKLQkJCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKLQkJCXR5cGVTdGFydFBvc2l0aW9uLCAKLQkJCXR5cGVEZWNsLm5hbWUsIAotCQkJdHlwZURlY2wuc291cmNlU3RhcnQsIAotCQkJdHlwZURlY2wuc291cmNlRW5kLCAKLQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlcmNsYXNzLmdldFR5cGVOYW1lKCksICcuJyksIAotCQkJc3VwZXJjbGFzcy5zb3VyY2VTdGFydCwgCi0JCQlzdXBlcmNsYXNzLnNvdXJjZUVuZCwgCi0JCQlpbnRlcmZhY2VOYW1lcywgCi0JCQlpbnRlcmZhY2VOYW1lU3RhcnRzLCAKLQkJCWludGVyZmFjZU5hbWVFbmRzLCAKLQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7IAorCQl0aGlzLnJlcXVlc3Rvci5lbnRlckNsYXNzKAorCQkJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAorCQkJdHlwZURlY2wubW9kaWZpZXJzLAorCQkJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQsCisJCQl0aGlzLnR5cGVTdGFydFBvc2l0aW9uLAorCQkJdHlwZURlY2wubmFtZSwKKwkJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAorCQkJdHlwZURlY2wuc291cmNlRW5kLAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVyY2xhc3MuZ2V0VHlwZU5hbWUoKSwgJy4nKSwKKwkJCXN1cGVyY2xhc3Muc291cmNlU3RhcnQsCisJCQlzdXBlcmNsYXNzLnNvdXJjZUVuZCwKKwkJCWludGVyZmFjZU5hbWVzLAorCQkJaW50ZXJmYWNlTmFtZVN0YXJ0cywKKwkJCWludGVyZmFjZU5hbWVFbmRzLAorCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwogCiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSGVhZGVyTmFtZTEoKSB7CiAJLy8gQ2xhc3NIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgJ2NsYXNzJyAnSWRlbnRpZmllcicKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQlpZiAobmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdID09IDApIHsKLQkJaWYgKG5lc3RlZFR5cGUgIT0gMCkgeworCWlmICh0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdID09IDApIHsKKwkJaWYgKHRoaXMubmVzdGVkVHlwZSAhPSAwKSB7CiAJCQl0eXBlRGVjbC5iaXRzIHw9IEFTVE5vZGUuSXNNZW1iZXJUeXBlOwogCQl9CiAJfSBlbHNlIHsKQEAgLTIwNywxOSArMjQ2LDE5IEBACiAJfQogCiAJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLQlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgcG9zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwogCXR5cGVEZWNsLnNvdXJjZUVuZCA9IChpbnQpIHBvczsKIAl0eXBlRGVjbC5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKLQl0eXBlRGVjbC5uYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXR5cGVEZWNsLm5hbWUgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAKIAkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KIAkvLyAnY2xhc3MnIGFuZCAnaW50ZXJmYWNlJyBwdXNoIGFuIGludCBwb3NpdGlvbgotCXR5cGVTdGFydFBvc2l0aW9uID0gdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQlpbnRQdHItLTsKLQlpbnQgZGVjbFNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOwotCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOwotCXR5cGVEZWNsLm1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwl0aGlzLnR5cGVTdGFydFBvc2l0aW9uID0gdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJdGhpcy5pbnRQdHItLTsKKwlpbnQgZGVjbFNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwl0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAlpZiAodHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGRlY2xTb3VyY2VTdGFydCkgewogCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gZGVjbFNvdXJjZVN0YXJ0OwogCX0KQEAgLTIyNywxMSArMjY2LDExIEBACiAJaW50IGxlbmd0aDsKIAlpZiAoKGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgewogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwgCi0JCQl0eXBlRGVjbC5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCXR5cGVEZWNsLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwKKwkJCTAsCisJCQlsZW5ndGgpOwogCX0KIAl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zb3VyY2VFbmQgKyAxOwogCXB1c2hPbkFzdFN0YWNrKHR5cGVEZWNsKTsKQEAgLTI0NSw3ICsyODQsNyBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29tcGlsYXRpb25Vbml0KCkgewogCS8vIENvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdAotCXJlcXVlc3Rvci5leGl0Q29tcGlsYXRpb25Vbml0KHNjYW5uZXIuc291cmNlLmxlbmd0aCAtIDEpOworCXRoaXMucmVxdWVzdG9yLmV4aXRDb21waWxhdGlvblVuaXQodGhpcy5zY2FubmVyLnNvdXJjZS5sZW5ndGggLSAxKTsKIH0KIC8qCiAgKgpAQCAtMjU4LDggKzI5Nyw4IEBACiAJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCiAJCXJldHVybjsKIAl9Ci0JQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOwotCXJlcXVlc3Rvci5leGl0Q29uc3RydWN0b3IoZW5kU3RhdGVtZW50UG9zaXRpb24sIGNkLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCXRoaXMucmVxdWVzdG9yLmV4aXRDb25zdHJ1Y3Rvcih0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uLCBjZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiB9CiAvKgogICoKQEAgLTI3MCwxMCArMzA5LDEwIEBACiAJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCk7CiAJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CiAJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCi0JCWludEFycmF5UHRyLS07CisJCXRoaXMuaW50QXJyYXlQdHItLTsKIAkJcmV0dXJuOwogCX0KLQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IGNkLmFyZ3VtZW50czsKIAljaGFyW11bXSBhcmd1bWVudFR5cGVzID0gbnVsbDsKIAljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gbnVsbDsKQEAgLTMxNiw2OSArMzU1LDY5IEBACiAJCQlleGNlcHRpb25UeXBlRW5kc1tpXSA9IGV4Y2VwdGlvbi5zb3VyY2VFbmQ7CiAJCX0KIAl9Ci0JcmVxdWVzdG9yCisJdGhpcy5yZXF1ZXN0b3IKIAkJLmVudGVyQ29uc3RydWN0b3IoCi0JCQljZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAorCQkJY2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAogCQkJY2QubW9kaWZpZXJzLAotCQkJY2QubW9kaWZpZXJzU291cmNlU3RhcnQsIAotCQkJY2Quc2VsZWN0b3IsIAotCQkJY2Quc291cmNlU3RhcnQsIAotCQkJKGludCkgKHNlbGVjdG9yU291cmNlUG9zaXRpb25zICYgMHhGRkZGRkZGRkwpLCAKKwkJCWNkLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LAorCQkJY2Quc2VsZWN0b3IsCisJCQljZC5zb3VyY2VTdGFydCwKKwkJCShpbnQpICh0aGlzLnNlbGVjdG9yU291cmNlUG9zaXRpb25zICYgMHhGRkZGRkZGRkwpLAogCQkJLy8gcmV0cmlldmUgdGhlIHNvdXJjZSBlbmQgb2YgdGhlIG5hbWUKLQkJCWFyZ3VtZW50VHlwZXMsIAotCQkJYXJndW1lbnRUeXBlU3RhcnRzLCAKLQkJCWFyZ3VtZW50VHlwZUVuZHMsIAotCQkJYXJndW1lbnROYW1lcywgCi0JCQlhcmd1bWVudE5hbWVTdGFydHMsIAotCQkJYXJndW1lbnROYW1lRW5kcywgCi0JCQlyUGFyZW5Qb3MsIAorCQkJYXJndW1lbnRUeXBlcywKKwkJCWFyZ3VtZW50VHlwZVN0YXJ0cywKKwkJCWFyZ3VtZW50VHlwZUVuZHMsCisJCQlhcmd1bWVudE5hbWVzLAorCQkJYXJndW1lbnROYW1lU3RhcnRzLAorCQkJYXJndW1lbnROYW1lRW5kcywKKwkJCXRoaXMuclBhcmVuUG9zLAogCQkJLy8gcmlnaHQgcGFyZW50aGVzaXMKLQkJCWV4Y2VwdGlvblR5cGVzLCAKLQkJCWV4Y2VwdGlvblR5cGVTdGFydHMsIAotCQkJZXhjZXB0aW9uVHlwZUVuZHMsIAotCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsgCisJCQlleGNlcHRpb25UeXBlcywKKwkJCWV4Y2VwdGlvblR5cGVTdGFydHMsCisJCQlleGNlcHRpb25UeXBlRW5kcywKKwkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKSB7CiAJLy8gQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKIAlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOwogCiAJLy9uYW1lIC0tIHRoaXMgaXMgbm90IHJlYWxseSByZXZlbGFudCBidXQgd2UgZG8gLi4uLi4KLQljZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQlzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOworCWNkLnNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwl0aGlzLnNlbGVjdG9yU291cmNlUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAKIAkvL21vZGlmaWVycwotCWNkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JY2QubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JY2QubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCWNkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCWNkLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwljZC5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCWNkLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJY2QuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCS8vIGphdmFkb2MKIAljZC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwogCXRoaXMuamF2YWRvYyA9IG51bGw7CiAKIAkvL2hpZ2hsaWdodCBzdGFydHMgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0cwotCWNkLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNlbGVjdG9yU291cmNlUG9zaXRpb25zID4+PiAzMik7CisJY2Quc291cmNlU3RhcnQgPSAoaW50KSAodGhpcy5zZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA+Pj4gMzIpOwogCXB1c2hPbkFzdFN0YWNrKGNkKTsKIAotCWNkLnNvdXJjZUVuZCA9IGxQYXJlblBvczsKLQljZC5ib2R5U3RhcnQgPSBsUGFyZW5Qb3MgKyAxOworCWNkLnNvdXJjZUVuZCA9IHRoaXMubFBhcmVuUG9zOworCWNkLmJvZHlTdGFydCA9IHRoaXMubFBhcmVuUG9zICsgMTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCkgewogCWNoZWNrQ29tbWVudCgpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAotCXB1c2hPbkludFN0YWNrKG1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzKTsgLy8gbW9kaWZpZXJzCiAJcHVzaE9uSW50U3RhY2soLTEpOwogCXB1c2hPbkludFN0YWNrKAotCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsgCisJCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCXJlc2V0TW9kaWZpZXJzKCk7CiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrTGVuZ3RoU3RhY2soMCk7CiB9CkBAIC0zODgsNyArNDI3LDcgQEAKIAkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zCiAJICogV2lsbCBiZSBjb25zdW1lIGluIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbgogCSAqLwotCXB1c2hPbkludEFycmF5U3RhY2sodGhpcy5nZXRKYXZhRG9jUG9zaXRpb25zKCkpOwkKKwlwdXNoT25JbnRBcnJheVN0YWNrKGdldEphdmFEb2NQb3NpdGlvbnMoKSk7CiB9CiAvKgogICoKQEAgLTM5Niw3ICs0MzUsNyBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJDb21waWxhdGlvblVuaXQoKSB7CiAJLy8gRW50ZXJDb21waWxhdGlvblVuaXQgOjo9ICRlbXB0eQotCXJlcXVlc3Rvci5lbnRlckNvbXBpbGF0aW9uVW5pdCgpOworCXRoaXMucmVxdWVzdG9yLmVudGVyQ29tcGlsYXRpb25Vbml0KCk7CiB9CiAvKgogICoKQEAgLTQwNSw1OSArNDQ0LDU5IEBACiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJWYXJpYWJsZSgpIHsKIAkvLyBFbnRlclZhcmlhYmxlIDo6PSAkZW1wdHkKIAlib29sZWFuIGlzTG9jYWxEZWNsYXJhdGlvbiA9IGlzTG9jYWxEZWNsYXJhdGlvbigpOwotCWlmICghaXNMb2NhbERlY2xhcmF0aW9uICYmICh2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdICE9IDApKSB7Ci0JCXJlcXVlc3Rvci5leGl0RmllbGQobGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uLCBsYXN0RmllbGRFbmRQb3NpdGlvbik7CisJaWYgKCFpc0xvY2FsRGVjbGFyYXRpb24gJiYgKHRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdICE9IDApKSB7CisJCXRoaXMucmVxdWVzdG9yLmV4aXRGaWVsZCh0aGlzLmxhc3RGaWVsZEJvZHlFbmRQb3NpdGlvbiwgdGhpcy5sYXN0RmllbGRFbmRQb3NpdGlvbik7CiAJfQotCWNoYXJbXSB2YXJOYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOwotCWxvbmcgbmFtZVBvc2l0aW9uID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKLQlpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uID0gaW50U3RhY2tbaW50UHRyLS1dOworCWNoYXJbXSB2YXJOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwlsb25nIG5hbWVQb3NpdGlvbiA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCWludCBleHRlbmRlZFR5cGVEaW1lbnNpb24gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCiAJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwotCWlmIChuZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gIT0gMCkgeworCWlmICh0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdICE9IDApIHsKIAkJLy8gY3JlYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKLQkJZGVjbGFyYXRpb24gPSAKLQkJCW5ldyBMb2NhbERlY2xhcmF0aW9uKHZhck5hbWUsIChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSwgKGludCkgbmFtZVBvc2l0aW9uKTsgCisJCWRlY2xhcmF0aW9uID0KKwkJCW5ldyBMb2NhbERlY2xhcmF0aW9uKHZhck5hbWUsIChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSwgKGludCkgbmFtZVBvc2l0aW9uKTsKIAl9IGVsc2UgewogCQkvLyBjcmVhdGUgdGhlIGZpZWxkIGRlY2xhcmF0aW9uCi0JCWRlY2xhcmF0aW9uID0gCi0JCQluZXcgRmllbGREZWNsYXJhdGlvbih2YXJOYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7IAorCQlkZWNsYXJhdGlvbiA9CisJCQluZXcgRmllbGREZWNsYXJhdGlvbih2YXJOYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7CiAJfQotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKIAlUeXBlUmVmZXJlbmNlIHR5cGU7Ci0JaW50IHZhcmlhYmxlSW5kZXggPSB2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdOworCWludCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV07CiAJaW50IHR5cGVEaW0gPSAwOwogCWlmICh2YXJpYWJsZUluZGV4ID09IDApIHsKIAkJLy8gZmlyc3QgdmFyaWFibGUgb2YgdGhlIGRlY2xhcmF0aW9uIChGaWVsZERlY2xhcmF0aW9uIG9yIExvY2FsRGVjbGFyYXRpb24pCi0JCWlmIChuZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gIT0gMCkgeworCQlpZiAodGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSAhPSAwKSB7CiAJCQkvLyBsb2NhbCBkZWNsYXJhdGlvbgotCQkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOwotCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOwotCQkJdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UodHlwZURpbSA9IGludFN0YWNrW2ludFB0ci0tXSk7IC8vIHR5cGUgZGltZW5zaW9uCisJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCQl0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0eXBlRGltID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSk7IC8vIHR5cGUgZGltZW5zaW9uCiAJCQlwdXNoT25Bc3RTdGFjayh0eXBlKTsKIAkJfSBlbHNlIHsKIAkJCS8vIGZpZWxkIGRlY2xhcmF0aW9uCi0JCQl0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0eXBlRGltID0gaW50U3RhY2tbaW50UHRyLS1dKTsgLy8gdHlwZSBkaW1lbnNpb24KKwkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHR5cGVEaW0gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsgLy8gdHlwZSBkaW1lbnNpb24KIAkJCXB1c2hPbkFzdFN0YWNrKHR5cGUpOwotCQkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOwotCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07CisJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCQl9CiAJCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAkJaW50IGxlbmd0aDsKIAkJaWYgKChsZW5ndGggPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssIAotCQkJCSh0aGlzLmV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoKSArIDEsIAotCQkJCWRlY2xhcmF0aW9uLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCisJCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCQlkZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkJMCwKKwkJCQlsZW5ndGgpOwogCQl9CiAJfSBlbHNlIHsKLQkJdHlwZSA9IChUeXBlUmVmZXJlbmNlKSBhc3RTdGFja1thc3RQdHIgLSB2YXJpYWJsZUluZGV4XTsKKwkJdHlwZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyIC0gdmFyaWFibGVJbmRleF07CiAJCXR5cGVEaW0gPSB0eXBlLmRpbWVuc2lvbnMoKTsKLQkJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHByZXZpb3VzVmFyaWFibGUgPSAKLQkJCShBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07IAorCQlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gcHJldmlvdXNWYXJpYWJsZSA9CisJCQkoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKIAkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHByZXZpb3VzVmFyaWFibGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKIAkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gcHJldmlvdXNWYXJpYWJsZS5tb2RpZmllcnM7CiAJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gcHJldmlvdXNWYXJpYWJsZS5tb2RpZmllcnNTb3VyY2VTdGFydDsKQEAgLTQ2OCwzNSArNTA3LDM1IEBACiAJCX0KIAl9CiAKLQlsb2NhbEludFB0ciA9IGludFB0cjsKKwl0aGlzLmxvY2FsSW50UHRyID0gdGhpcy5pbnRQdHI7CiAKIAlpZiAoZXh0ZW5kZWRUeXBlRGltZW5zaW9uID09IDApIHsKIAkJZGVjbGFyYXRpb24udHlwZSA9IHR5cGU7CiAJfSBlbHNlIHsKIAkJaW50IGRpbWVuc2lvbiA9IHR5cGVEaW0gKyBleHRlbmRlZFR5cGVEaW1lbnNpb247Ci0JCWRlY2xhcmF0aW9uLnR5cGUgPSB0aGlzLmNvcHlEaW1zKHR5cGUsIGRpbWVuc2lvbik7CisJCWRlY2xhcmF0aW9uLnR5cGUgPSBjb3B5RGltcyh0eXBlLCBkaW1lbnNpb24pOwogCX0KLQl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdKys7Ci0JbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdKys7CisJdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0rKzsKKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdKys7CiAJcHVzaE9uQXN0U3RhY2soZGVjbGFyYXRpb24pOwogCi0JaW50W10gamF2YWRvY1Bvc2l0aW9ucyA9IGludEFycmF5U3RhY2tbaW50QXJyYXlQdHJdOworCWludFtdIGphdmFkb2NQb3NpdGlvbnMgPSB0aGlzLmludEFycmF5U3RhY2tbdGhpcy5pbnRBcnJheVB0cl07CiAJaWYgKCFpc0xvY2FsRGVjbGFyYXRpb24pIHsKLQkJcmVxdWVzdG9yCisJCXRoaXMucmVxdWVzdG9yCiAJCQkuZW50ZXJGaWVsZCgKLQkJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCQlqYXZhZG9jUG9zaXRpb25zLCAKLQkJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMsIAotCQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKLQkJCQlyZXR1cm5UeXBlTmFtZShkZWNsYXJhdGlvbi50eXBlKSwgCi0JCQkJdHlwZS5zb3VyY2VTdGFydCwgCi0JCQkJdHlwZS5zb3VyY2VFbmQsIAotCQkJCXR5cGVEaW1zLCAKLQkJCQl2YXJOYW1lLCAKLQkJCQkoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIAotCQkJCShpbnQpIG5hbWVQb3NpdGlvbiwgCi0JCQkJZXh0ZW5kZWRUeXBlRGltZW5zaW9uLCAKLQkJCQlleHRlbmRlZFR5cGVEaW1lbnNpb24gPT0gMCA/IC0xIDogZW5kUG9zaXRpb24pOyAKKwkJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQkJCWphdmFkb2NQb3NpdGlvbnMsCisJCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzLAorCQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LAorCQkJCXJldHVyblR5cGVOYW1lKGRlY2xhcmF0aW9uLnR5cGUpLAorCQkJCXR5cGUuc291cmNlU3RhcnQsCisJCQkJdHlwZS5zb3VyY2VFbmQsCisJCQkJdGhpcy50eXBlRGltcywKKwkJCQl2YXJOYW1lLAorCQkJCShpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSwKKwkJCQkoaW50KSBuYW1lUG9zaXRpb24sCisJCQkJZXh0ZW5kZWRUeXBlRGltZW5zaW9uLAorCQkJCWV4dGVuZGVkVHlwZURpbWVuc2lvbiA9PSAwID8gLTEgOiB0aGlzLmVuZFBvc2l0aW9uKTsKIAl9CiB9CiAvKgpAQCAtNTA4LDE3ICs1NDcsMTcgQEAKIAkvLyB0aGUgc2Nhbm5lciBpcyBsb2NhdGVkIGFmdGVyIHRoZSBjb21tYSBvciB0aGUgc2VtaS1jb2xvbi4KIAkvLyB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIGNvbW1hIG9yIHRoZSBzZW1pLWNvbG9uCiAJc3VwZXIuY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOwotCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXS0tOwkKLQlsYXN0RmllbGRFbmRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKLQlsYXN0RmllbGRCb2R5RW5kUG9zaXRpb24gPSAJKChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl0pLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZDsKKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdLS07CisJdGhpcy5sYXN0RmllbGRFbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCXRoaXMubGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uID0gCSgoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSkuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpIHsKIAkvLyBFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24gOjo9ICRlbXB0eQogCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAogCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsKLQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0tLTsJCi0JbGFzdEZpZWxkRW5kUG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7Ci0JbGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdLS07CisJdGhpcy5sYXN0RmllbGRFbmRQb3NpdGlvbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCXRoaXMubGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uID0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxOwogfQogLyoKICAqCkBAIC01MjcsMzIgKzU2NiwzMiBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKSB7CiAJLy8gU2VlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25EZWZhdWx0TW9kaWZpZXIoKSBpbiBjYXNlIG9mIGNoYW5nZTogZHVwbGljYXRlZCBjb2RlCiAJLy8gRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKLQkvLyB0aGUgc3VwZXIuY29uc3VtZUZpZWxkRGVjbGFyYXRpb24gd2lsbCByZWluaXRpYWxpemUgdGhlIHZhcmlhYmxlQ291bnRlcltuZXN0ZWRUeXBlXQkKLQlpbnQgdmFyaWFibGVJbmRleCA9IHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV07CisJLy8gdGhlIHN1cGVyLmNvbnN1bWVGaWVsZERlY2xhcmF0aW9uIHdpbGwgcmVpbml0aWFsaXplIHRoZSB2YXJpYWJsZUNvdW50ZXJbbmVzdGVkVHlwZV0KKwlpbnQgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdOwogCXN1cGVyLmNvbnN1bWVGaWVsZERlY2xhcmF0aW9uKCk7Ci0JaW50QXJyYXlQdHItLTsKKwl0aGlzLmludEFycmF5UHRyLS07CiAJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKQogCQlyZXR1cm47CiAJaWYgKHZhcmlhYmxlSW5kZXggIT0gMCkgewotCQlyZXF1ZXN0b3IuZXhpdEZpZWxkKGxhc3RGaWVsZEJvZHlFbmRQb3NpdGlvbiwgbGFzdEZpZWxkRW5kUG9zaXRpb24pOworCQl0aGlzLnJlcXVlc3Rvci5leGl0RmllbGQodGhpcy5sYXN0RmllbGRCb2R5RW5kUG9zaXRpb24sIHRoaXMubGFzdEZpZWxkRW5kUG9zaXRpb24pOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoYm9vbGVhbiBpc1ZhckFyZ3MpIHsKIAkvLyBGb3JtYWxQYXJhbWV0ZXIgOjo9IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQgPT0+IGZhbHNlCiAJLy8gRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnMgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCA9PT4gdHJ1ZQogCS8qCi0JYXN0U3RhY2sgOiAKKwlhc3RTdGFjayA6CiAJaWRlbnRpZmllclN0YWNrIDogdHlwZSBpZGVudGlmaWVyCiAJaW50U3RhY2sgOiBkaW0gZGltCiAJID09PgogCWFzdFN0YWNrIDogQXJndW1lbnQKLQlpZGVudGlmaWVyU3RhY2sgOiAgCi0JaW50U3RhY2sgOiAgCisJaWRlbnRpZmllclN0YWNrIDoKKwlpbnRTdGFjayA6CiAJKi8KIAotCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKLQljaGFyW10gcGFyYW1ldGVyTmFtZSA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQlsb25nIG5hbWVQb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCWNoYXJbXSBwYXJhbWV0ZXJOYW1lID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwlsb25nIG5hbWVQb3NpdGlvbnMgPSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXTsKIAlpbnQgZXh0ZW5kZWREaW1lbnNpb25zID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAlpbnQgZW5kT2ZFbGxpcHNpcyA9IDA7CiAJaWYgKGlzVmFyQXJncykgewpAQCAtNTY4LDI1ICs2MDcsMjUgQEAKIAkJfQogCQl0eXBlLmJpdHMgfD0gQVNUTm9kZS5Jc1ZhckFyZ3M7IC8vIHNldCBpc1ZhckFyZ3MKIAl9Ci0JaW50UHRyIC09IDM7Ci0JQXJndW1lbnQgYXJnID0gCisJdGhpcy5pbnRQdHIgLT0gMzsKKwlBcmd1bWVudCBhcmcgPQogCQluZXcgQXJndW1lbnQoCi0JCQlwYXJhbWV0ZXJOYW1lLCAKLQkJCW5hbWVQb3NpdGlvbnMsIAotCQkJdHlwZSwgCi0JCQlpbnRTdGFja1tpbnRQdHIgKyAxXSk7Ly8gbW9kaWZpZXJzCisJCQlwYXJhbWV0ZXJOYW1lLAorCQkJbmFtZVBvc2l0aW9ucywKKwkJCXR5cGUsCisJCQl0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyICsgMV0pOy8vIG1vZGlmaWVycwogCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCWFyZy5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrLAorCQkJKHRoaXMuZXhwcmVzc2lvblB0ciAtPSBsZW5ndGgpICsgMSwKKwkJCWFyZy5hbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW2xlbmd0aF0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJcHVzaE9uQXN0U3RhY2soYXJnKTsKLQlpbnRBcnJheVB0ci0tOworCXRoaXMuaW50QXJyYXlQdHItLTsKIH0KIC8qCiAgKgpAQCAtNTk5LDggKzYzOCw4IEBACiAJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCiAJCXJldHVybjsKIAl9Ci0JcmVxdWVzdG9yLmV4aXRJbnRlcmZhY2UoZW5kU3RhdGVtZW50UG9zaXRpb24sIC8vIHRoZSAnfScgaXMgdGhlIGVuZCBvZiB0aGUgYm9keQotCSAoKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCXRoaXMucmVxdWVzdG9yLmV4aXRJbnRlcmZhY2UodGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbiwgLy8gdGhlICd9JyBpcyB0aGUgZW5kIG9mIHRoZSBib2R5CisJICgoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwogfQogLyoKICAqCkBAIC02MTEsMTAgKzY1MCwxMCBAQAogCXN1cGVyLmNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKTsKIAlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKCkpIHsKIAkJLy8gd2UgaWdub3JlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKLQkJaW50QXJyYXlQdHItLTsKKwkJdGhpcy5pbnRBcnJheVB0ci0tOwogCQlyZXR1cm47CiAJfQotCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CiAJVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsLnN1cGVySW50ZXJmYWNlczsKIAljaGFyW11bXSBpbnRlcmZhY2VOYW1lcyA9IG51bGw7CiAJaW50W10gaW50ZXJmYWNlTmFtZVN0YXJ0cyA9IG51bGw7CkBAIC02MjksMzIgKzY2OCwzMiBAQAogCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlc0xlbmd0aDsgaSsrKSB7CiAJCQlUeXBlUmVmZXJlbmNlIHN1cGVySW50ZXJmYWNlID0gc3VwZXJJbnRlcmZhY2VzW2ldOwotCQkJaW50ZXJmYWNlTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoc3VwZXJJbnRlcmZhY2UuZ2V0VHlwZU5hbWUoKSwgJy4nKTsgCisJCQlpbnRlcmZhY2VOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlckludGVyZmFjZS5nZXRUeXBlTmFtZSgpLCAnLicpOwogCQkJaW50ZXJmYWNlTmFtZVN0YXJ0c1tpXSA9IHN1cGVySW50ZXJmYWNlLnNvdXJjZVN0YXJ0OwogCQkJaW50ZXJmYWNlbmFtZUVuZHNbaV0gPSBzdXBlckludGVyZmFjZS5zb3VyY2VFbmQ7CiAJCX0KIAl9CiAJLy8gZmx1c2ggdGhlIGNvbW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGludGVyZmFjZSBoZWFkZXIKLQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKLQlyZXF1ZXN0b3IuZW50ZXJJbnRlcmZhY2UoCi0JCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLCAKLQkJdHlwZURlY2wubW9kaWZpZXJzLCAKLQkJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQsIAotCQl0eXBlU3RhcnRQb3NpdGlvbiwgCi0JCXR5cGVEZWNsLm5hbWUsIAotCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwgCi0JCXR5cGVEZWNsLnNvdXJjZUVuZCwgCi0JCWludGVyZmFjZU5hbWVzLCAKLQkJaW50ZXJmYWNlTmFtZVN0YXJ0cywgCi0JCWludGVyZmFjZW5hbWVFbmRzLCAKLQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsgCisJdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwl0aGlzLnJlcXVlc3Rvci5lbnRlckludGVyZmFjZSgKKwkJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJdGhpcy5pbnRBcnJheVN0YWNrW3RoaXMuaW50QXJyYXlQdHItLV0sCisJCXR5cGVEZWNsLm1vZGlmaWVycywKKwkJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQsCisJCXRoaXMudHlwZVN0YXJ0UG9zaXRpb24sCisJCXR5cGVEZWNsLm5hbWUsCisJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAorCQl0eXBlRGVjbC5zb3VyY2VFbmQsCisJCWludGVyZmFjZU5hbWVzLAorCQlpbnRlcmZhY2VOYW1lU3RhcnRzLAorCQlpbnRlcmZhY2VuYW1lRW5kcywKKwkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUxKCkgewogCS8vIEludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQlpZiAobmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdID09IDApIHsKLQkJaWYgKG5lc3RlZFR5cGUgIT0gMCkgeworCWlmICh0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGVdID09IDApIHsKKwkJaWYgKHRoaXMubmVzdGVkVHlwZSAhPSAwKSB7CiAJCQl0eXBlRGVjbC5iaXRzIHw9IEFTVE5vZGUuSXNNZW1iZXJUeXBlOwogCQl9CiAJfSBlbHNlIHsKQEAgLTY2NSwxOCArNzA0LDE4IEBACiAJfQogCiAJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLQlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgcG9zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdOwogCXR5cGVEZWNsLnNvdXJjZUVuZCA9IChpbnQpIHBvczsKIAl0eXBlRGVjbC5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKLQl0eXBlRGVjbC5uYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOworCXR5cGVEZWNsLm5hbWUgPSB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAKIAkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KIAkvLyAnY2xhc3MnIGFuZCAnaW50ZXJmYWNlJyBwdXNoIGFuIGludCBwb3NpdGlvbgotCXR5cGVTdGFydFBvc2l0aW9uID0gdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKLQlpbnRQdHItLTsKLQlpbnQgZGVjbFNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOwotCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXRoaXMudHlwZVN0YXJ0UG9zaXRpb24gPSB0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwl0aGlzLmludFB0ci0tOworCWludCBkZWNsU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAl0eXBlRGVjbC5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKIAlpZiAodHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGRlY2xTb3VyY2VTdGFydCkgewogCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gZGVjbFNvdXJjZVN0YXJ0OwpAQCAtNjg1LDExICs3MjQsMTEgQEAKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCXR5cGVEZWNsLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJdHlwZURlY2wuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCXR5cGVEZWNsLmJvZHlTdGFydCA9IHR5cGVEZWNsLnNvdXJjZUVuZCArIDE7CiAJcHVzaE9uQXN0U3RhY2sodHlwZURlY2wpOwpAQCAtNzI0LDcgKzc2Myw3IEBACiAJLy8gRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKIAogCXN1cGVyLmNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQlpbnRBcnJheVB0ci0tOworCXRoaXMuaW50QXJyYXlQdHItLTsKIH0KIC8qCiAgKgpAQCAtNzM4LDggKzc3Nyw4IEBACiAJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCiAJCXJldHVybjsKIAl9Ci0JTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07Ci0JcmVxdWVzdG9yLmV4aXRNZXRob2QoZW5kU3RhdGVtZW50UG9zaXRpb24sIG1kLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwlNZXRob2REZWNsYXJhdGlvbiBtZCA9IChNZXRob2REZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJdGhpcy5yZXF1ZXN0b3IuZXhpdE1ldGhvZCh0aGlzLmVuZFN0YXRlbWVudFBvc2l0aW9uLCBtZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiB9CiAvKgogICoKQEAgLTc1MCwxMCArNzg5LDEwIEBACiAJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlcigpOwogCWlmIChpc0xvY2FsRGVjbGFyYXRpb24oKSkgewogCQkvLyB3ZSBpZ25vcmUgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucwotCQlpbnRBcnJheVB0ci0tOworCQl0aGlzLmludEFycmF5UHRyLS07CiAJCXJldHVybjsKIAl9Ci0JTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOwogCiAJVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWQucmV0dXJuVHlwZTsKIAljaGFyW10gcmV0dXJuVHlwZU5hbWUgPSByZXR1cm5UeXBlTmFtZShyZXR1cm5UeXBlKTsKQEAgLTc5OSw0NiArODM4LDQ2IEBACiAJCQlleGNlcHRpb25UeXBlRW5kc1tpXSA9IGV4Y2VwdGlvbi5zb3VyY2VFbmQ7CiAJCX0KIAl9Ci0JcmVxdWVzdG9yCisJdGhpcy5yZXF1ZXN0b3IKIAkJLmVudGVyTWV0aG9kKAotCQkJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCi0JCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLCAKLQkJCW1kLm1vZGlmaWVycywgCi0JCQltZC5tb2RpZmllcnNTb3VyY2VTdGFydCwgCi0JCQlyZXR1cm5UeXBlTmFtZSwgCi0JCQlyZXR1cm5UeXBlLnNvdXJjZVN0YXJ0LCAKLQkJCXJldHVyblR5cGUuc291cmNlRW5kLCAKLQkJCXR5cGVEaW1zLCAKLQkJCW1kLnNlbGVjdG9yLCAKLQkJCW1kLnNvdXJjZVN0YXJ0LCAKLQkJCShpbnQpIChzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyAmIDB4RkZGRkZGRkZMKSwgCi0JCQlhcmd1bWVudFR5cGVzLCAKLQkJCWFyZ3VtZW50VHlwZVN0YXJ0cywgCi0JCQlhcmd1bWVudFR5cGVFbmRzLCAKLQkJCWFyZ3VtZW50TmFtZXMsIAotCQkJYXJndW1lbnROYW1lU3RhcnRzLCAKLQkJCWFyZ3VtZW50TmFtZUVuZHMsIAotCQkJclBhcmVuUG9zLCAKLQkJCWV4dGVuZHNEaW0sIAotCQkJZXh0ZW5kc0RpbSA9PSAwID8gLTEgOiBlbmRQb3NpdGlvbiwgCi0JCQlleGNlcHRpb25UeXBlcywgCi0JCQlleGNlcHRpb25UeXBlU3RhcnRzLCAKLQkJCWV4Y2VwdGlvblR5cGVFbmRzLCAKLQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7IAorCQkJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAorCQkJbWQubW9kaWZpZXJzLAorCQkJbWQubW9kaWZpZXJzU291cmNlU3RhcnQsCisJCQlyZXR1cm5UeXBlTmFtZSwKKwkJCXJldHVyblR5cGUuc291cmNlU3RhcnQsCisJCQlyZXR1cm5UeXBlLnNvdXJjZUVuZCwKKwkJCXRoaXMudHlwZURpbXMsCisJCQltZC5zZWxlY3RvciwKKwkJCW1kLnNvdXJjZVN0YXJ0LAorCQkJKGludCkgKHRoaXMuc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgJiAweEZGRkZGRkZGTCksCisJCQlhcmd1bWVudFR5cGVzLAorCQkJYXJndW1lbnRUeXBlU3RhcnRzLAorCQkJYXJndW1lbnRUeXBlRW5kcywKKwkJCWFyZ3VtZW50TmFtZXMsCisJCQlhcmd1bWVudE5hbWVTdGFydHMsCisJCQlhcmd1bWVudE5hbWVFbmRzLAorCQkJdGhpcy5yUGFyZW5Qb3MsCisJCQl0aGlzLmV4dGVuZHNEaW0sCisJCQl0aGlzLmV4dGVuZHNEaW0gPT0gMCA/IC0xIDogdGhpcy5lbmRQb3NpdGlvbiwKKwkJCWV4Y2VwdGlvblR5cGVzLAorCQkJZXhjZXB0aW9uVHlwZVN0YXJ0cywKKwkJCWV4Y2VwdGlvblR5cGVFbmRzLAorCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpIHsKIAkvLyBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgOjo9IERpbXNvcHQKIAkvLyBub3cgd2UgdXBkYXRlIHRoZSByZXR1cm5UeXBlIG9mIHRoZSBtZXRob2QKLQlNZXRob2REZWNsYXJhdGlvbiBtZCA9IChNZXRob2REZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKLQlpbnQgZXh0ZW5kZWREaW1zID0gaW50U3RhY2tbaW50UHRyLS1dOwotCWV4dGVuZHNEaW0gPSBleHRlbmRlZERpbXM7CisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCWludCBleHRlbmRlZERpbXMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCXRoaXMuZXh0ZW5kc0RpbSA9IGV4dGVuZGVkRGltczsKIAlpZiAoZXh0ZW5kZWREaW1zICE9IDApIHsKIAkJVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWQucmV0dXJuVHlwZTsKLQkJbWQuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCW1kLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CiAJCWludCBkaW1zID0gcmV0dXJuVHlwZS5kaW1lbnNpb25zKCkgKyBleHRlbmRlZERpbXM7Ci0JCW1kLnJldHVyblR5cGUgPSB0aGlzLmNvcHlEaW1zKHJldHVyblR5cGUsIGRpbXMpOwotCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgewotCQkJbWQuYm9keVN0YXJ0ID0gZW5kUG9zaXRpb24gKyAxOworCQltZC5yZXR1cm5UeXBlID0gY29weURpbXMocmV0dXJuVHlwZSwgZGltcyk7CisJCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpIHsKKwkJCW1kLmJvZHlTdGFydCA9IHRoaXMuZW5kUG9zaXRpb24gKyAxOwogCQl9CiAJfQogfQpAQCAtODUxLDQwICs4OTAsNDkgQEAKIAkJbWQgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOwogCX0KIAkvL25hbWUKLQltZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKLQlzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07Ci0JaWRlbnRpZmllckxlbmd0aFB0ci0tOworCW1kLnNlbGVjdG9yID0gdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXTsKKwl0aGlzLnNlbGVjdG9yU291cmNlUG9zaXRpb25zID0gdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1t0aGlzLmlkZW50aWZpZXJQdHItLV07CisJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAJLy90eXBlCi0JbWQucmV0dXJuVHlwZSA9IGdldFR5cGVSZWZlcmVuY2UodHlwZURpbXMgPSBpbnRTdGFja1tpbnRQdHItLV0pOworCW1kLnJldHVyblR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHRoaXMudHlwZURpbXMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dKTsKIAkvL21vZGlmaWVycwotCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JbWQubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07Ci0JbWQubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOworCW1kLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwltZC5tb2RpZmllcnMgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCS8vIGNvbnN1bWUgYW5ub3RhdGlvbnMKIAlpbnQgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gdGhpcy5leHByZXNzaW9uTGVuZ3RoU3RhY2tbdGhpcy5leHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFjaywgCi0JCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLCAKLQkJCW1kLmFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5leHByZXNzaW9uU3RhY2ssCisJCQkodGhpcy5leHByZXNzaW9uUHRyIC09IGxlbmd0aCkgKyAxLAorCQkJbWQuYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CiAJfQogCS8vIGphdmFkb2MKIAltZC5qYXZhZG9jID0gdGhpcy5qYXZhZG9jOwogCXRoaXMuamF2YWRvYyA9IG51bGw7CiAKIAkvL2hpZ2hsaWdodCBzdGFydHMgYXQgc2VsZWN0b3Igc3RhcnQKLQltZC5zb3VyY2VTdGFydCA9IChpbnQpIChzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA+Pj4gMzIpOworCW1kLnNvdXJjZVN0YXJ0ID0gKGludCkgKHRoaXMuc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgPj4+IDMyKTsKIAlwdXNoT25Bc3RTdGFjayhtZCk7Ci0JbWQuYm9keVN0YXJ0ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tMTsKKwltZC5ib2R5U3RhcnQgPSB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uLTE7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTW9kaWZpZXJzKCkgewogCWNoZWNrQ29tbWVudCgpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAotCXB1c2hPbkludFN0YWNrKG1vZGlmaWVycyk7IC8vIG1vZGlmaWVycwotCXB1c2hPbkludFN0YWNrKG1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsKKwlwdXNoT25JbnRTdGFjayh0aGlzLm1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOwogCXB1c2hPbkludFN0YWNrKAotCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogbW9kaWZpZXJzU291cmNlU3RhcnQpOyAKKwkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyB0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsKKwlyZXNldE1vZGlmaWVycygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVBhY2thZ2VDb21tZW50KCkgeworCS8vIGdldCBwb3NzaWJsZSBjb21tZW50IGZvciBzeW50YXggc2luY2UgMS41CisJaWYodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJY2hlY2tDb21tZW50KCk7CisJfSBlbHNlIHsKKwkJcHVzaE9uSW50QXJyYXlTdGFjayhnZXRKYXZhRG9jUG9zaXRpb25zKCkpOworCX0KIAlyZXNldE1vZGlmaWVycygpOwogfQogLyoKQEAgLTg5MiwxNiArOTQwLDE2IEBACiAgKiBJTlRFUk5BTCBVU0UtT05MWQogICovCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpIHsKLQkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCi0JcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7Ci0KKwkvKgorCSAqIEphdmFkb2MgcG9zaXRpb25zIGFyZSBwZXJzaXN0ZWQgaW4gY29uc3VtZVBhY2thZ2VDb21tZW50CisJICovCiAJc3VwZXIuY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWUoKTsKLQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlOworCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZTsKIAotCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKAotCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCi0JCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwgCi0JCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAorCXRoaXMucmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UoCisJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQsCisJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAogCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSwKIAkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0KTsKIH0KQEAgLTkxMCw0NSArOTU4LDQyIEBACiAqIElOVEVSTkFMIFVTRS1PTkxZCiAqLwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWVXaXRoTW9kaWZpZXJzKCkgewotCS8qIHBlcnNpc3RpbmcgamF2YWRvYyBwb3NpdGlvbnMgKi8KLQlwdXNoT25JbnRBcnJheVN0YWNrKHRoaXMuZ2V0SmF2YURvY1Bvc2l0aW9ucygpKTsKLQogCXN1cGVyLmNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lV2l0aE1vZGlmaWVycygpOwotCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSBjb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2U7CisJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHRoaXMuY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlOwogCi0JcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UoCi0JCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kLCAKLQkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwgCisJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKKwkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCisJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJdGhpcy5pbnRBcnJheVN0YWNrW3RoaXMuaW50QXJyYXlQdHItLV0sCiAJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpLAogCQlpbXBvcnRSZWZlcmVuY2Uuc291cmNlU3RhcnQpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVB1c2hNb2RpZmllcnMoKSB7CiAJY2hlY2tDb21tZW50KCk7IC8vIG1pZ2h0IHVwZGF0ZSBtb2RpZmllcnMgd2l0aCBBY2NEZXByZWNhdGVkCi0JcHVzaE9uSW50U3RhY2sobW9kaWZpZXJzKTsgLy8gbW9kaWZpZXJzCi0JaWYgKG1vZGlmaWVyc1NvdXJjZVN0YXJ0IDwgMCkgeworCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzKTsgLy8gbW9kaWZpZXJzCisJaWYgKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPCAwKSB7CiAJCXB1c2hPbkludFN0YWNrKC0xKTsKIAkJcHVzaE9uSW50U3RhY2soCi0JCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsgCisJCQl0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA6IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKIAl9IGVsc2UgewotCQlwdXNoT25JbnRTdGFjayhtb2RpZmllcnNTb3VyY2VTdGFydCk7CisJCXB1c2hPbkludFN0YWNrKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOwogCQlwdXNoT25JbnRTdGFjaygKLQkJCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiBtb2RpZmllcnNTb3VyY2VTdGFydCk7IAorCQkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyB0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsKIAl9CiAJcmVzZXRNb2RpZmllcnMoKTsKIAlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQdXNoUmVhbE1vZGlmaWVycygpIHsKIAljaGVja0NvbW1lbnQoKTsgLy8gbWlnaHQgdXBkYXRlIG1vZGlmaWVycyB3aXRoIEFjY0RlcHJlY2F0ZWQKLQlwdXNoT25JbnRTdGFjayhtb2RpZmllcnMpOyAvLyBtb2RpZmllcnMKLQlpZiAobW9kaWZpZXJzU291cmNlU3RhcnQgPCAwKSB7CisJcHVzaE9uSW50U3RhY2sodGhpcy5tb2RpZmllcnMpOyAvLyBtb2RpZmllcnMKKwlpZiAodGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA8IDApIHsKIAkJcHVzaE9uSW50U3RhY2soLTEpOwogCQlwdXNoT25JbnRTdGFjaygKLQkJCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiBzY2FubmVyLnN0YXJ0UG9zaXRpb24pOyAKKwkJCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24pOwogCX0gZWxzZSB7Ci0JCXB1c2hPbkludFN0YWNrKG1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsKKwkJcHVzaE9uSW50U3RhY2sodGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCk7CiAJCXB1c2hPbkludFN0YWNrKAotCQkJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA6IG1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsgCisJCQl0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA6IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpOwogCX0KIAlyZXNldE1vZGlmaWVycygpOwogfQpAQCAtOTU2LDE0ICsxMDAxLDE0IEBACiAJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgJ3N0YXRpYycgTmFtZQogCiAJLyogcGVyc2lzdGluZyBqYXZhZG9jIHBvc2l0aW9ucyAqLwotCXB1c2hPbkludEFycmF5U3RhY2sodGhpcy5nZXRKYXZhRG9jUG9zaXRpb25zKCkpOworCXB1c2hPbkludEFycmF5U3RhY2soZ2V0SmF2YURvY1Bvc2l0aW9ucygpKTsKIAogCXN1cGVyLmNvbnN1bWVTaW5nbGVTdGF0aWNJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsKLQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgYXN0U3RhY2tbYXN0UHRyXTsKLQlyZXF1ZXN0b3IuYWNjZXB0SW1wb3J0KAotCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCXRoaXMucmVxdWVzdG9yLmFjY2VwdEltcG9ydCgKKwkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCiAJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwKLQkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwKKwkJdGhpcy5pbnRBcnJheVN0YWNrW3RoaXMuaW50QXJyYXlQdHItLV0sCiAJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpLAogCQlpbXBvcnRSZWZlcmVuY2Uuc291cmNlU3RhcnQsCiAJCWZhbHNlLApAQCAtOTc3LDE0ICsxMDIyLDE0IEBACiAJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZQogCiAJLyogcGVyc2lzdGluZyBqYXZhZG9jIHBvc2l0aW9ucyAqLwotCXB1c2hPbkludEFycmF5U3RhY2sodGhpcy5nZXRKYXZhRG9jUG9zaXRpb25zKCkpOworCXB1c2hPbkludEFycmF5U3RhY2soZ2V0SmF2YURvY1Bvc2l0aW9ucygpKTsKIAogCXN1cGVyLmNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7Ci0JSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIGFzdFN0YWNrW2FzdFB0cl07Ci0JcmVxdWVzdG9yLmFjY2VwdEltcG9ydCgKLQkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSAoSW1wb3J0UmVmZXJlbmNlKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwl0aGlzLnJlcXVlc3Rvci5hY2NlcHRJbXBvcnQoCisJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAogCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQsCi0JCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sCisJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAogCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSwKIAkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAogCQlmYWxzZSwKQEAgLTk5NCwxNCArMTAzOSwxNCBAQAogCS8vIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnICdzdGF0aWMnIE5hbWUgJy4nICcqJwogCiAJLyogcGVyc2lzdGluZyBqYXZhZG9jIHBvc2l0aW9ucyAqLwotCXB1c2hPbkludEFycmF5U3RhY2sodGhpcy5nZXRKYXZhRG9jUG9zaXRpb25zKCkpOworCXB1c2hPbkludEFycmF5U3RhY2soZ2V0SmF2YURvY1Bvc2l0aW9ucygpKTsKIAogCXN1cGVyLmNvbnN1bWVTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOwotCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSAoSW1wb3J0UmVmZXJlbmNlKSBhc3RTdGFja1thc3RQdHJdOwotCXJlcXVlc3Rvci5hY2NlcHRJbXBvcnQoCi0JCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0SW1wb3J0KAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKIAkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kLAotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLAorCQl0aGlzLmludEFycmF5U3RhY2tbdGhpcy5pbnRBcnJheVB0ci0tXSwKIAkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZmVyZW5jZS5nZXRJbXBvcnROYW1lKCksICcuJyksCiAJCWltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCwKIAkJdHJ1ZSwKQEAgLTEwMTYsMjUgKzEwNjEsMjUgQEAKIAkvL3B1c2ggYW4gSW5pdGlhbGl6ZXIKIAkvL29wdGltaXplIHRoZSBwdXNoL3BvcAogCXN1cGVyLmNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOwotCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBhc3RTdGFja1thc3RQdHJdOwotCXJlcXVlc3Rvci5hY2NlcHRJbml0aWFsaXplcigKKwlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0SW5pdGlhbGl6ZXIoCiAJCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCiAJCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kLAotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLAotCQlDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljLCAKLQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJdGhpcy5pbnRBcnJheVN0YWNrW3RoaXMuaW50QXJyYXlQdHItLV0sCisJCUNsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMsCisJCXRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV0sCiAJCWluaXRpYWxpemVyLmJsb2NrLnNvdXJjZVN0YXJ0LAogCQlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGljT25seSgpIHsKIAkvLyBTdGF0aWNPbmx5IDo6PSAnc3RhdGljJwogCWNoZWNrQ29tbWVudCgpOyAvLyBtaWdodCB1cGRhdGUgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0Ci0JcHVzaE9uSW50U3RhY2sobW9kaWZpZXJzU291cmNlU3RhcnQpOwotCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKKwlwdXNoT25JbnRTdGFjayh0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsKKwlwdXNoT25JbnRTdGFjayh0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKIAlwdXNoT25JbnRTdGFjaygKLQkJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA6IG1vZGlmaWVyc1NvdXJjZVN0YXJ0KTsgCisJCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCk7CiAJanVtcE92ZXJNZXRob2RCb2R5KCk7Ci0JbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdKys7CisJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlXSsrOwogCXJlc2V0TW9kaWZpZXJzKCk7CiB9CiAvKgpAQCAtMTA0NSwxNSArMTA5MCwxNSBAQAogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCiAKIAkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCi0JcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CisJcHVzaE9uSW50QXJyYXlTdGFjayhnZXRKYXZhRG9jUG9zaXRpb25zKCkpOwogCiAJc3VwZXIuY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOwotCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSAoSW1wb3J0UmVmZXJlbmNlKSBhc3RTdGFja1thc3RQdHJdOwotCXJlcXVlc3Rvci5hY2NlcHRJbXBvcnQoCi0JCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0SW1wb3J0KAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKIAkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kLAotCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLAotCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSwgCisJCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyLS1dLAorCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSwKIAkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAogCQl0cnVlLAogCQlDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CkBAIC0xMDYzLDIxICsxMTA4LDIxIEBACiAgKgogICogTm90ZTogamF2YWRvY3MgYXJlIHN0YWNrZWQgaW4gc3ludGFjdGljYWwgb3JkZXIKICAqCi0gKiBFaXRoZXIgYW5zd2VyIGdpdmVuIDxwb3NpdGlvbj4sIG9yIHRoZSBlbmQgcG9zaXRpb24gb2YgYSBjb21tZW50IGxpbmUgCisgKiBFaXRoZXIgYW5zd2VyIGdpdmVuIDxwb3NpdGlvbj4sIG9yIHRoZSBlbmQgcG9zaXRpb24gb2YgYSBjb21tZW50IGxpbmUKICAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgPHBvc2l0aW9uPiAoc2FtZSBsaW5lKQogICoKICAqIGUuZy4KICAqIHZvaWQgZm9vKCl7CiAgKiB9IC8vIGVuZCBvZiBtZXRob2QgZm9vCiAgKi8KLSAKKwogcHVibGljIGludCBmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8oaW50IHBvc2l0aW9uKSB7CiAKLQlyZXR1cm4gbGFzdEZpZWxkRW5kUG9zaXRpb24gPSBzdXBlci5mbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8ocG9zaXRpb24pOworCXJldHVybiB0aGlzLmxhc3RGaWVsZEVuZFBvc2l0aW9uID0gc3VwZXIuZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHBvc2l0aW9uKTsKIH0KIHB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBlbmRQYXJzZShpbnQgYWN0KSB7Ci0JaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgewotCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCWlmICh0aGlzLnNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKHRoaXMuc2Nhbm5lci5nZXRMaW5lRW5kcygpKTsKIAl9CiAJcmV0dXJuIHN1cGVyLmVuZFBhcnNlKGFjdCk7CiB9CkBAIC0xMDg1LDIyICsxMTMwLDIyIEBACiAJLy9wb3NpdGlvbm5pbmcgdGhlIHBhcnNlciBmb3IgYSBuZXcgY29tcGlsYXRpb24gdW5pdAogCS8vYXZvaWRpbmcgc3RhY2sgcmVhbGxvY2F0aW9uIGFuZCBhbGwgdGhhdC4uLi4KIAlzdXBlci5pbml0aWFsaXplKGluaXRpYWxpemVOTFMpOwotCWludEFycmF5UHRyID0gLTE7CisJdGhpcy5pbnRBcnJheVB0ciA9IC0xOwogfQogcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAkvL3Bvc2l0aW9ubmluZyB0aGUgcGFyc2VyIGZvciBhIG5ldyBjb21waWxhdGlvbiB1bml0CiAJLy9hdm9pZGluZyBzdGFjayByZWFsbG9jYXRpb24gYW5kIGFsbCB0aGF0Li4uLgogCXN1cGVyLmluaXRpYWxpemUoKTsKLQlpbnRBcnJheVB0ciA9IC0xOworCXRoaXMuaW50QXJyYXlQdHIgPSAtMTsKIH0KIC8qCiAgKgogICogSU5URVJOQUwgVVNFLU9OTFkKICAqLwogcHJpdmF0ZSBib29sZWFuIGlzTG9jYWxEZWNsYXJhdGlvbigpIHsKLQlpbnQgbmVzdGVkRGVwdGggPSBuZXN0ZWRUeXBlOworCWludCBuZXN0ZWREZXB0aCA9IHRoaXMubmVzdGVkVHlwZTsKIAl3aGlsZSAobmVzdGVkRGVwdGggPj0gMCkgewotCQlpZiAobmVzdGVkTWV0aG9kW25lc3RlZERlcHRoXSAhPSAwKSB7CisJCWlmICh0aGlzLm5lc3RlZE1ldGhvZFtuZXN0ZWREZXB0aF0gIT0gMCkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJbmVzdGVkRGVwdGgtLTsKQEAgLTExMTksMTQgKzExNjQsMTQgQEAKIAl0cnkgewogCQlpbml0aWFsaXplKHRydWUpOwogCQlnb0ZvckNvbXBpbGF0aW9uVW5pdCgpOwotCQlyZWZlcmVuY2VDb250ZXh0ID0KLQkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPQorCQkJdGhpcy5jb21waWxhdGlvblVuaXQgPQogCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAotCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQodW5pdCwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksIAotCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsgCi0JCXNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCksCisJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdCh1bml0LCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwKKwkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KQEAgLTExMzksMTQgKzExODQsMTQgQEAKIAl0cnkgewogCQlpbml0aWFsaXplKCk7CiAJCWdvRm9yQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCk7Ci0JCXJlZmVyZW5jZUNvbnRleHQgPSAKLQkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPQorCQkJdGhpcy5jb21waWxhdGlvblVuaXQgPQogCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAotCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwgCi0JCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOyAKLQkJc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOwotCQlzY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwKKwkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksCisJCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJdGhpcy5zY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOwogCQlwYXJzZSgpOwogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKIAkJLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uCkBAIC0xMTU5LDE0ICsxMjA0LDE0IEBACiAJdHJ5IHsKIAkJaW5pdGlhbGl6ZSgpOwogCQlnb0ZvckZpZWxkRGVjbGFyYXRpb24oKTsKLQkJcmVmZXJlbmNlQ29udGV4dCA9IAotCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCi0JCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKLQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAotCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLAorCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwKKwkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KQEAgLTExODAsMTQgKzEyMjUsMTQgQEAKIAl0cnkgewogCQlpbml0aWFsaXplKCk7CiAJCWdvRm9ySW1wb3J0RGVjbGFyYXRpb24oKTsKLQkJcmVmZXJlbmNlQ29udGV4dCA9IAotCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCi0JCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKLQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAotCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLAorCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwKKwkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KQEAgLTEyMDQsMTQgKzEyNDksMTQgQEAKIAl0cnkgewogCQlpbml0aWFsaXplKCk7CiAJCWdvRm9ySW5pdGlhbGl6ZXIoKTsKLQkJcmVmZXJlbmNlQ29udGV4dCA9IAotCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCi0JCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKLQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAotCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLAorCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwKKwkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KQEAgLTEyMjUsMTQgKzEyNzAsMTQgQEAKIAl0cnkgewogCQlpbml0aWFsaXplKCk7CiAJCWdvRm9yR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCXJlZmVyZW5jZUNvbnRleHQgPSAKLQkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPQorCQkJdGhpcy5jb21waWxhdGlvblVuaXQgPQogCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKLQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAotCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwgCi0JCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOyAKLQkJc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOwotCQlzY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwKKwkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksCisJCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJdGhpcy5zY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOwogCQlwYXJzZSgpOwogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKIAkJLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uCkBAIC0xMjQ1LDE0ICsxMjkwLDE0IEBACiAJdHJ5IHsKIAkJaW5pdGlhbGl6ZSgpOwogCQlnb0ZvclBhY2thZ2VEZWNsYXJhdGlvbigpOwotCQlyZWZlcmVuY2VDb250ZXh0ID0gCi0JCQljb21waWxhdGlvblVuaXQgPSAKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0KKwkJCXRoaXMuY29tcGlsYXRpb25Vbml0ID0KIAkJCQluZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oCi0JCQkJCXByb2JsZW1SZXBvcnRlcigpLCAKLQkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksIAotCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsgCi0JCXNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCksCisJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLAorCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKIAkJcGFyc2UoKTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CiAJCS8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbgpAQCAtMTI2NiwxNCArMTMxMSwxNCBAQAogCXRyeSB7CiAJCWluaXRpYWxpemUoKTsKIAkJZ29Gb3JUeXBlRGVjbGFyYXRpb24oKTsKLQkJcmVmZXJlbmNlQ29udGV4dCA9IAotCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAotCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCi0JCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKLQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAotCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLAorCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwKKwkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXRoaXMuc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQl0aGlzLnNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CiAJCXBhcnNlKCk7CiAJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KQEAgLTEyODQsMTIgKzEzMjksMTIgQEAKICAqIFJldHVybnMgdGhpcyBwYXJzZXIncyBwcm9ibGVtIHJlcG9ydGVyIGluaXRpYWxpemVkIHdpdGggaXRzIHJlZmVyZW5jZSBjb250ZXh0LgogICogQWxzbyBpdCBpcyBhc3N1bWVkIHRoYXQgYSBwcm9ibGVtIGlzIGdvaW5nIHRvIGJlIHJlcG9ydGVkLCBzbyBpbml0aWFsaXplcwogICogdGhlIGNvbXBpbGF0aW9uIHJlc3VsdCdzIGxpbmUgcG9zaXRpb25zLgotICogCisgKgogICogQHJldHVybiBQcm9ibGVtUmVwb3J0ZXIKICAqLwogcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7Ci0JcHJvYmxlbVJlcG9ydGVyLnJlZmVyZW5jZUNvbnRleHQgPSByZWZlcmVuY2VDb250ZXh0OwotCXJldHVybiBwcm9ibGVtUmVwb3J0ZXI7CisJdGhpcy5wcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHRoaXMucmVmZXJlbmNlQ29udGV4dDsKKwlyZXR1cm4gdGhpcy5wcm9ibGVtUmVwb3J0ZXI7CiB9CiBwcm90ZWN0ZWQgdm9pZCBwdXNoT25JbnRBcnJheVN0YWNrKGludFtdIHBvc2l0aW9ucykgewogCkBAIC0xMzAwLDExICsxMzQ1LDExIEBACiAJCQl0aGlzLmludEFycmF5U3RhY2sgPSBuZXcgaW50W3N0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdW10sIDAsCiAJCQlzdGFja0xlbmd0aCk7CiAJfQotCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHJdID0gcG9zaXRpb25zOworCXRoaXMuaW50QXJyYXlTdGFja1t0aGlzLmludEFycmF5UHRyXSA9IHBvc2l0aW9uczsKIH0KIHByb3RlY3RlZCB2b2lkIHJlc2V0TW9kaWZpZXJzKCkgewogCXN1cGVyLnJlc2V0TW9kaWZpZXJzKCk7Ci0JZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IC0xOworCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IC0xOwogfQogLyoKICAqIFN5bnRheCBlcnJvciB3YXMgZGV0ZWN0ZWQuIFdpbGwgYXR0ZW1wdCB0byBwZXJmb3JtIHNvbWUgcmVjb3ZlcnkgYWN0aW9uIGluIG9yZGVyCkBAIC0xMzI5LDE0ICsxMzc0LDE0IEBACiAJCQlkaW1lbnNpb25zQXJyYXlbKGkqMikgKyAxXSA9ICddJzsKIAkJfQogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpLCAKLQkJCWRpbWVuc2lvbnNBcnJheSk7IAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGUuZ2V0VHlwZU5hbWUoKSwgJy4nKSwKKwkJCWRpbWVuc2lvbnNBcnJheSk7CiAJfQogCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoImludEFycmF5UHRyID0gIiArIGludEFycmF5UHRyICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCWJ1ZmZlci5hcHBlbmQoImludEFycmF5UHRyID0gIiArIHRoaXMuaW50QXJyYXlQdHIgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CkBAIC0xMzQ1LDcgKzEzOTAsNyBAQAogICovCiBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKAogCWludCBkaW0sCi0JaW50IGxvY2FsSWRlbnRpZmllclB0ciwgCisJaW50IGxvY2FsSWRlbnRpZmllclB0ciwKIAlpbnQgbG9jYWxJZGVudGlmaWVyTGVuZ3RoUHRyKSB7CiAJLyogYnVpbGQgYSBSZWZlcmVuY2Ugb24gYSB2YXJpYWJsZSB0aGF0IG1heSBiZSBxdWFsaWZpZWQgb3Igbm90CiAJICogVGhpcyB2YXJpYWJsZSBpcyBhIHR5cGUgcmVmZXJlbmNlIGFuZCBkaW0gd2lsbCBiZSBpdHMgZGltZW5zaW9ucy4KQEAgLTEzNTQsNDIgKzEzOTksNDIgQEAKIAogCWludCBsZW5ndGg7CiAJVHlwZVJlZmVyZW5jZSByZWY7Ci0JaWYgKChsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbbG9jYWxJZGVudGlmaWVyTGVuZ3RoUHRyXSkgPT0gMSkgeworCWlmICgobGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbbG9jYWxJZGVudGlmaWVyTGVuZ3RoUHRyXSkgPT0gMSkgewogCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCiAJCWlmIChkaW0gPT0gMCkgewotCQkJcmVmID0gCisJCQlyZWYgPQogCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAotCQkJCQlpZGVudGlmaWVyU3RhY2tbbG9jYWxJZGVudGlmaWVyUHRyXSwgCi0JCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2xvY2FsSWRlbnRpZmllclB0ci0tXSk7IAorCQkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1tsb2NhbElkZW50aWZpZXJQdHJdLAorCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2xvY2FsSWRlbnRpZmllclB0ci0tXSk7CiAJCX0gZWxzZSB7Ci0JCQlyZWYgPSAKKwkJCXJlZiA9CiAJCQkJbmV3IEFycmF5VHlwZVJlZmVyZW5jZSgKLQkJCQkJaWRlbnRpZmllclN0YWNrW2xvY2FsSWRlbnRpZmllclB0cl0sIAotCQkJCQlkaW0sIAotCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tsb2NhbElkZW50aWZpZXJQdHItLV0pOyAKLQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsJCQkJCisJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW2xvY2FsSWRlbnRpZmllclB0cl0sCisJCQkJCWRpbSwKKwkJCQkJdGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFja1tsb2NhbElkZW50aWZpZXJQdHItLV0pOworCQkJcmVmLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CiAJCX0KIAl9IGVsc2UgewogCQlpZiAobGVuZ3RoIDwgMCkgeyAvL2ZsYWcgZm9yIHByZWNvbXBpbGVkIHR5cGUgcmVmZXJlbmNlIG9uIGJhc2UgdHlwZXMKIAkJCXJlZiA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWxlbmd0aCwgZGltKTsKLQkJCXJlZi5zb3VyY2VTdGFydCA9IGludFN0YWNrW2xvY2FsSW50UHRyLS1dOworCQkJcmVmLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmxvY2FsSW50UHRyLS1dOwogCQkJaWYgKGRpbSA9PSAwKSB7Ci0JCQkJcmVmLnNvdXJjZUVuZCA9IGludFN0YWNrW2xvY2FsSW50UHRyLS1dOworCQkJCXJlZi5zb3VyY2VFbmQgPSB0aGlzLmludFN0YWNrW3RoaXMubG9jYWxJbnRQdHItLV07CiAJCQl9IGVsc2UgewotCQkJCWxvY2FsSW50UHRyLS07Ci0JCQkJcmVmLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOworCQkJCXRoaXMubG9jYWxJbnRQdHItLTsKKwkJCQlyZWYuc291cmNlRW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKIAkJCX0KIAkJfSBlbHNlIHsgLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCiAJCQljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdW107CiAJCQlsb2NhbElkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwogCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGlkZW50aWZpZXJTdGFjaywgbG9jYWxJZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgbG9jYWxJZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCi0JCQkJbG9jYWxJZGVudGlmaWVyUHRyICsgMSwgCi0JCQkJcG9zaXRpb25zLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLAorCQkJCWxvY2FsSWRlbnRpZmllclB0ciArIDEsCisJCQkJcG9zaXRpb25zLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKIAkJCWlmIChkaW0gPT0gMCkKIAkJCQlyZWYgPSBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIHBvc2l0aW9ucyk7CiAJCQllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRXh0cmFGbGFncy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0V4dHJhRmxhZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJmODgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0V4dHJhRmxhZ3MuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TmVzdGVkVHlwZTsKKworcHVibGljIGZpbmFsIGNsYXNzIEV4dHJhRmxhZ3MgeworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhhc05vblByaXZhdGVTdGF0aWNNZW1iZXJUeXBlcyA9IDB4MDAwMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJc01lbWJlclR5cGUgPSAweDAwMDI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSXNMb2NhbFR5cGUgPSAweDAwMDQ7CisJCisJLy9pbnRlcm5hbCBmbGFncworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBhcmFtZXRlclR5cGVzU3RvcmVkQXNTaWduYXR1cmUgPSAweDAwMTA7CisJCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0RXh0cmFGbGFncyhDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyKSB7CisJCWludCBleHRyYUZsYWdzID0gMDsKKwkJCisJCWlmIChyZWFkZXIuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5Jc01lbWJlclR5cGU7CisJCX0KKwkJCisJCWlmIChyZWFkZXIuaXNMb2NhbCgpKSB7CisJCQlleHRyYUZsYWdzIHw9IEV4dHJhRmxhZ3MuSXNMb2NhbFR5cGU7CisJCX0KKwkJCisJCUlCaW5hcnlOZXN0ZWRUeXBlW10gbWVtYmVyVHlwZXMgPSByZWFkZXIuZ2V0TWVtYmVyVHlwZXMoKTsKKwkJaW50IG1lbWJlclR5cGVDb3VudGVyID0gbWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBtZW1iZXJUeXBlcy5sZW5ndGg7CisJCWlmIChtZW1iZXJUeXBlQ291bnRlciA+IDApIHsKKwkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVDb3VudGVyOyBpKyspIHsKKwkJCQlpbnQgbW9kaWZpZXJzID0gbWVtYmVyVHlwZXNbaV0uZ2V0TW9kaWZpZXJzKCk7CisJCQkJLy8gaWYgdGhlIG1lbWJlciB0eXBlIGlzIHN0YXRpYyBhbmQgbm90IHByaXZhdGUKKwkJCQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDAgJiYgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSA9PSAwKSB7CisJCQkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5IYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXM7CisJCQkJCWJyZWFrIGRvbmU7CisJCQkJfQorCQkJfQorCQkJCisJCX0KKwkJCisJCXJldHVybiBleHRyYUZsYWdzOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGludCBnZXRFeHRyYUZsYWdzKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpbnQgZXh0cmFGbGFncyA9IDA7CisJCQorCQlpZiAodHlwZS5pc01lbWJlcigpKSB7CisJCQlleHRyYUZsYWdzIHw9IEV4dHJhRmxhZ3MuSXNNZW1iZXJUeXBlOworCQl9CisJCQorCQlpZiAodHlwZS5pc0xvY2FsKCkpIHsKKwkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5Jc0xvY2FsVHlwZTsKKwkJfQorCQkKKwkJSVR5cGVbXSBtZW1iZXJUeXBlcyA9IHR5cGUuZ2V0VHlwZXMoKTsKKwkJaW50IG1lbWJlclR5cGVDb3VudGVyID0gbWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBtZW1iZXJUeXBlcy5sZW5ndGg7CisJCWlmIChtZW1iZXJUeXBlQ291bnRlciA+IDApIHsKKwkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVDb3VudGVyOyBpKyspIHsKKwkJCQlpbnQgZmxhZ3MgPSBtZW1iZXJUeXBlc1tpXS5nZXRGbGFncygpOworCQkJCS8vIGlmIHRoZSBtZW1iZXIgdHlwZSBpcyBzdGF0aWMgYW5kIG5vdCBwcml2YXRlCisJCQkJaWYgKChmbGFncyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDAgJiYgKGZsYWdzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY1ByaXZhdGUpID09IDAgKSB7CisJCQkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5IYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXM7CisJCQkJCWJyZWFrIGRvbmU7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZXh0cmFGbGFnczsKKwl9CisJCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0RXh0cmFGbGFncyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCWludCBleHRyYUZsYWdzID0gMDsKKwkJCisJCWlmICh0eXBlRGVjbGFyYXRpb24uZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQlleHRyYUZsYWdzIHw9IEV4dHJhRmxhZ3MuSXNNZW1iZXJUeXBlOworCQl9CisJCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzOworCQlpbnQgbWVtYmVyVHlwZUNvdW50ZXIgPSBtZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsKKwkJaWYgKG1lbWJlclR5cGVDb3VudGVyID4gMCkgeworCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZUNvdW50ZXI7IGkrKykgeworCQkJCWludCBtb2RpZmllcnMgPSBtZW1iZXJUeXBlc1tpXS5tb2RpZmllcnM7CisJCQkJLy8gaWYgdGhlIG1lbWJlciB0eXBlIGlzIHN0YXRpYyBhbmQgbm90IHByaXZhdGUKKwkJCQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpICE9IDAgJiYgKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NQcml2YXRlKSA9PSAwKSB7CisJCQkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5IYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXM7CisJCQkJCWJyZWFrIGRvbmU7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZXh0cmFGbGFnczsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURvY3VtZW50RWxlbWVudFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IuamF2YQppbmRleCBjYjE2YTdkLi4yZWIzNGIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURvY3VtZW50RWxlbWVudFJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzgsNyArMzgsNyBAQAogICogb3RoZXIgc2ltcGxlciBlbGVtZW50cyAocGFja2FnZSwgaW1wb3J0KSBhcmUgcmVhZCBhbGwgYXQgb25jZToKICAqIC0gYWNjZXB0PEVsZW1lbnQ+CiAgKi8KLSAKKwogcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yIHsKIC8qKgogICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcGFja2FnZQpAQCAtNDYsNyArNDYsNyBAQAogICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYWNrYWdlCiAgKiAgZGVjbGFyYXRpb24KICAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCi0gKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQKICAqIHN0cnVjdHVyZTogMipuIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZXMgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMuCiAgKiBJZiBubyBKYXZhRG9jIGlzIGF2YWlsYWJsZSwgdGhlbiBudWxsIGlzIGFuc3dlcmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkuCiAgKiBlLmcuIHsgMTAsIDIwLCAyNSwgNDUgfSAgLS0+IGphdmFkb2MxIGZyb20gMTAgdG8gMjAsIGphdmFkb2MyIGZyb20gMjUgdG8gNDUKQEAgLTU3LDEwICs1NywxMCBAQAogICogQHBhcmFtIG9uRGVtYW5kIC0gYSBib29sZWFuIGVxdWFscyB0byB0cnVlIGlmIHRoZSBpbXBvcnQgaXMgYW4gaW1wb3J0IG9uIGRlbWFuZAogICovCiB2b2lkIGFjY2VwdEltcG9ydCgKLQlpbnQgZGVjbGFyYXRpb25TdGFydCwgCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCiAJaW50IGRlY2xhcmF0aW9uRW5kLAotCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQotCWNoYXJbXSBuYW1lLCAKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAorCWNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnRQb3NpdGlvbiwKIAlib29sZWFuIG9uRGVtYW5kLAogCWludCBtb2RpZmllcnMpOwpAQCAtNzAsNyArNzAsNyBAQAogICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYWNrYWdlCiAgKiAgZGVjbGFyYXRpb24KICAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCi0gKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQKICAqIHN0cnVjdHVyZTogMipuIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZXMgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMuCiAgKiBJZiBubyBKYXZhRG9jIGlzIGF2YWlsYWJsZSwgdGhlbiBudWxsIGlzIGFuc3dlcmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkuCiAgKiBlLmcuIHsgMTAsIDIwLCAyNSwgNDUgfSAgLS0+IGphdmFkb2MxIGZyb20gMTAgdG8gMjAsIGphdmFkb2MyIGZyb20gMjUgdG8gNDUKQEAgLTg0LDcgKzg0LDcgQEAKIHZvaWQgYWNjZXB0SW5pdGlhbGl6ZXIoCiAJaW50IGRlY2xhcmF0aW9uU3RhcnQsCiAJaW50IGRlY2xhcmF0aW9uRW5kLAotCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCiAJaW50IG1vZGlmaWVycywKIAlpbnQgbW9kaWZpZXJzU3RhcnQsCiAJaW50IGJvZHlTdGFydCwKQEAgLTk0LDcgKzk0LDcgQEAKICAqIG9mIHRoZSBwYXJzZSBhY3Rpb24sIHNvIGFzIHRvIGFsbG93IGNvbXB1dGF0aW9uIG9mIG5vcm1hbGl6ZWQgcmFuZ2VzLgogICoKICAqIEEgbGluZSBzZXBhcmF0b3IgbWlnaHQgY29ycmVzcG9uZHMgdG8gc2V2ZXJhbCBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2UsCi0gKiAKKyAqCiAgKi8KIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpOwogLyoqCkBAIC0xMDMsNyArMTAzLDcgQEAKICAqIEBwYXJhbSBkZWNsYXJhdGlvbkVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFja2FnZQogICogIGRlY2xhcmF0aW9uCiAgKiBAcGFyYW0gamF2YURvY1Bvc2l0aW9ucyAtIGFuc3dlciBiYWNrIGFuIGFycmF5IG9mIHNvdXJjZVN0YXJ0L3NvdXJjZUVuZAotICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkIAorICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkCiAgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgogICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgogICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CkBAIC0xMTMsMTAgKzExMywxMCBAQAogICogIG5hbWUKICAqLwogdm9pZCBhY2NlcHRQYWNrYWdlKAotCWludCBkZWNsYXJhdGlvblN0YXJ0LCAKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKIAlpbnQgZGVjbGFyYXRpb25FbmQsCi0JaW50W10gamF2YURvY1Bvc2l0aW9ucywJCi0JY2hhcltdIG5hbWUsIAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCisJY2hhcltdIG5hbWUsCiAJaW50IG5hbWVTdGFydFBvc2l0aW9uKTsKIC8qKgogICogQHBhcmFtIHByb2JsZW0gLSBVc2VkIHRvIHJlcG9ydCBhIHByb2JsZW0gd2hpbGUgcnVubmluZyB0aGUgSkRPTQpAQCAtMTI2LDcgKzEyNiw3IEBACiAgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0CiAgKiAgb2YgdGhpcyBjbGFzcy4KICAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCi0gKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQKICAqIHN0cnVjdHVyZTogMipuIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZXMgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMuCiAgKiBJZiBubyBKYXZhRG9jIGlzIGF2YWlsYWJsZSwgdGhlbiBudWxsIGlzIGFuc3dlcmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkuCiAgKiBlLmcuIHsgMTAsIDIwLCAyNSwgNDUgfSAgLS0+IGphdmFkb2MxIGZyb20gMTAgdG8gMjAsIGphdmFkb2MyIGZyb20gMjUgdG8gNDUKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCiAJaW50IG1vZGlmaWVycywKIAlpbnQgbW9kaWZpZXJzU3RhcnQsCi0JaW50IGNsYXNzU3RhcnQsIAorCWludCBjbGFzc1N0YXJ0LAogCWNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnQsCiAJaW50IG5hbWVFbmQsCkBAIC0xNzAsMTAgKzE3MCwxMCBAQAogCWludCBib2R5U3RhcnQpOwogdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpOwogLyoqCi0gKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciAKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiAgb2YgdGhpcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgogICogQHBhcmFtIGphdmFEb2NQb3NpdGlvbnMgLSBhbnN3ZXIgYmFjayBhbiBhcnJheSBvZiBzb3VyY2VTdGFydC9zb3VyY2VFbmQKLSAqIHBvc2l0aW9ucyBvZiB0aGUgYXZhaWxhYmxlIEphdmFEb2MgY29tbWVudHMuIFRoZSBhcnJheSBpcyBhIGZsYXR0ZW5lZCAKKyAqIHBvc2l0aW9ucyBvZiB0aGUgYXZhaWxhYmxlIEphdmFEb2MgY29tbWVudHMuIFRoZSBhcnJheSBpcyBhIGZsYXR0ZW5lZAogICogc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KICAqIElmIG5vIEphdmFEb2MgaXMgYXZhaWxhYmxlLCB0aGVuIG51bGwgaXMgYW5zd2VyZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBhcnJheS4KICAqIGUuZy4geyAxMCwgMjAsIDI1LCA0NSB9ICAtLT4gamF2YWRvYzEgZnJvbSAxMCB0byAyMCwgamF2YWRvYzIgZnJvbSAyNSB0byA0NQpAQCAtMTk3LDMzICsxOTcsMzMgQEAKICAqICBjaGFyYWN0ZXIgb2YgdGhlIHJlc3BlY3RpdmUgZXhjZXB0aW9uIHR5cGVzCiAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZUVuZHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0CiAgKiAgY2hhcmFjdGVyIG9mIHRoZSByZXNwZWN0aXZlIGV4Y2VwdGlvbiB0eXBlcwotICogQHBhcmFtIGJvZHlTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgCisgKiBAcGFyYW0gYm9keVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhpcwogICogIGNvbnN0cnVjdG9yJ3MgYm9keQogICovCiB2b2lkIGVudGVyQ29uc3RydWN0b3IoCiAJaW50IGRlY2xhcmF0aW9uU3RhcnQsCi0JaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywKIAlpbnQgbW9kaWZpZXJzLAotCWludCBtb2RpZmllcnNTdGFydCwgCisJaW50IG1vZGlmaWVyc1N0YXJ0LAogCWNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnQsCiAJaW50IG5hbWVFbmQsCiAJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCiAJaW50IFtdIHBhcmFtZXRlclR5cGVTdGFydHMsCi0JaW50IFtdIHBhcmFtZXRlclR5cGVFbmRzLAkJCQorCWludCBbXSBwYXJhbWV0ZXJUeXBlRW5kcywKIAljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZVN0YXJ0cywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZUVuZHMsCi0JaW50IHBhcmFtZXRlcnNFbmQsCQorCWludCBwYXJhbWV0ZXJzRW5kLAogCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLAogCWludCBbXSBleGNlcHRpb25UeXBlU3RhcnRzLAogCWludCBbXSBleGNlcHRpb25UeXBlRW5kcywKIAlpbnQgYm9keVN0YXJ0KTsKIC8qKgotICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgCisgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgogICogIG9mIHRoaXMgZmllbGQKICAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCi0gKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQKICAqIHN0cnVjdHVyZTogMipuIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZXMgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMuCiAgKiBJZiBubyBKYXZhRG9jIGlzIGF2YWlsYWJsZSwgdGhlbiBudWxsIGlzIGFuc3dlcmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkuCiAgKiBlLmcuIHsgMTAsIDIwLCAyNSwgNDUgfSAgLS0+IGphdmFkb2MxIGZyb20gMTAgdG8gMjAsIGphdmFkb2MyIGZyb20gMjUgdG8gNDUKQEAgLTI0Niw3ICsyNDYsNyBAQAogICovCiB2b2lkIGVudGVyRmllbGQoCiAJaW50IGRlY2xhcmF0aW9uU3RhcnQsCi0JaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywKIAlpbnQgbW9kaWZpZXJzLAogCWludCBtb2RpZmllcnNTdGFydCwKIAljaGFyW10gdHlwZSwKQEAgLTI2Miw3ICsyNjIsNyBAQAogICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydAogICogIG9mIHRoaXMgY2xhc3MuCiAgKiBAcGFyYW0gamF2YURvY1Bvc2l0aW9ucyAtIGFuc3dlciBiYWNrIGFuIGFycmF5IG9mIHNvdXJjZVN0YXJ0L3NvdXJjZUVuZAotICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkIAorICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkCiAgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgogICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgogICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CkBAIC0yODUsNyArMjg1LDcgQEAKICAqLwogdm9pZCBlbnRlckludGVyZmFjZSgKIAlpbnQgZGVjbGFyYXRpb25TdGFydCwKLQlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAogCWludCBtb2RpZmllcnMsCiAJaW50IG1vZGlmaWVyc1N0YXJ0LAogCWludCBpbnRlcmZhY2VTdGFydCwKQEAgLTI5NywxMCArMjk3LDEwIEBACiAJaW50W10gc3VwZXJpbnRlcmZhY2VFbmRzLAogCWludCBib2R5U3RhcnQpOwogLyoqCi0gKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciAKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiAgb2YgdGhpcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgogICogQHBhcmFtIGphdmFEb2NQb3NpdGlvbnMgLSBhbnN3ZXIgYmFjayBhbiBhcnJheSBvZiBzb3VyY2VTdGFydC9zb3VyY2VFbmQKLSAqIHBvc2l0aW9ucyBvZiB0aGUgYXZhaWxhYmxlIEphdmFEb2MgY29tbWVudHMuIFRoZSBhcnJheSBpcyBhIGZsYXR0ZW5lZCAKKyAqIHBvc2l0aW9ucyBvZiB0aGUgYXZhaWxhYmxlIEphdmFEb2MgY29tbWVudHMuIFRoZSBhcnJheSBpcyBhIGZsYXR0ZW5lZAogICogc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KICAqIElmIG5vIEphdmFEb2MgaXMgYXZhaWxhYmxlLCB0aGVuIG51bGwgaXMgYW5zd2VyZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBhcnJheS4KICAqIGUuZy4geyAxMCwgMjAsIDI1LCA0NSB9ICAtLT4gamF2YWRvYzEgZnJvbSAxMCB0byAyMCwgamF2YWRvYzIgZnJvbSAyNSB0byA0NQpAQCAtMzM2LDE0ICszMzYsMTQgQEAKICAqICBjaGFyYWN0ZXIgb2YgdGhlIHJlc3BlY3RpdmUgZXhjZXB0aW9uIHR5cGVzCiAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZUVuZHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0CiAgKiAgY2hhcmFjdGVyIG9mIHRoZSByZXNwZWN0aXZlIGV4Y2VwdGlvbiB0eXBlcwotICogQHBhcmFtIGJvZHlTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgCisgKiBAcGFyYW0gYm9keVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhpcwogICogIG1ldGhvZCdzIGJvZHkKICAqLwogdm9pZCBlbnRlck1ldGhvZCgKIAlpbnQgZGVjbGFyYXRpb25TdGFydCwKLQlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAogCWludCBtb2RpZmllcnMsCi0JaW50IG1vZGlmaWVyc1N0YXJ0LCAKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCiAJY2hhcltdIHJldHVyblR5cGUsCiAJaW50IHJldHVyblR5cGVTdGFydCwKIAlpbnQgcmV0dXJuVHlwZUVuZCwKQEAgLTM1MywxMyArMzUzLDEzIEBACiAJaW50IG5hbWVFbmQsCiAJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCiAJaW50IFtdIHBhcmFtZXRlclR5cGVTdGFydHMsCi0JaW50IFtdIHBhcmFtZXRlclR5cGVFbmRzLAkJCQorCWludCBbXSBwYXJhbWV0ZXJUeXBlRW5kcywKIAljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZVN0YXJ0cywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZUVuZHMsCiAJaW50IHBhcmFtZXRlcnNFbmQsCiAJaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50LAotCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsCQorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsCiAJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsCiAJaW50IFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsCiAJaW50IFtdIGV4Y2VwdGlvblR5cGVFbmRzLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQppbmRleCAyMWVjY2U2Li5iZTM3ODE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwzNCArMTAsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiAKIC8qCiAgKiBQYXJ0IG9mIHRoZSBzb3VyY2UgZWxlbWVudCBwYXJzZXIgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSBvdXRwdXQuIEl0CiAgKiBnZXRzIG5vdGlmaWVkIG9mIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYXMgdGhleSBhcmUgZGV0ZWN0ZWQsIHJlbHlpbmcgb24gdGhlCiAgKiByZXF1ZXN0b3IgdG8gYXNzZW1ibGUgdGhlbSB0b2dldGhlciwgYmFzZWQgb24gdGhlIG5vdGlmaWNhdGlvbnMgaXQgZ290LgotICogCisgKgogICogVGhlIHN0cnVjdHVyYWwgaW52ZXN0aWdhdGlvbiBpbmNsdWRlczogLSBwYWNrYWdlIHN0YXRlbWVudCAtIGltcG9ydAogICogc3RhdGVtZW50cyAtIHRvcC1sZXZlbCB0eXBlczogcGFja2FnZSBtZW1iZXIsIG1lbWJlciB0eXBlcyAobWVtYmVyIHR5cGVzIG9mCiAgKiBtZW1iZXIgdHlwZXMuLi4pIC0gZmllbGRzIC0gbWV0aG9kcwotICogCisgKgogICogSWYgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCwgdGhlbiBhbGwgc291cmNlIGNvbnN0cnVjdHMgYXJlCiAgKiBpbnZlc3RpZ2F0ZWQgYW5kIHR5cGUsIGZpZWxkICYgbWV0aG9kIHJlZmVyZW5jZXMgYXJlIHByb3ZpZGVkIGFzIHdlbGwuCi0gKiAKKyAqCiAgKiBBbnkgKHBhcnNpbmcpIHByb2JsZW0gZW5jb3VudGVyZWQgaXMgYWxzbyBwcm92aWRlZC4KLSAqIAorICoKICAqIEFsbCBwb3NpdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBleGFjdCBzb3VyY2UgZmVkIHRvIHRoZSBwYXJzZXIuCi0gKiAKKyAqCiAgKiBFbGVtZW50cyB3aGljaCBhcmUgY29tcGxleCBhcmUgbm90aWZpZWQgaW4gdHdvIHN0ZXBzOiAtIGVudGVyIDxFbGVtZW50PiA6CiAgKiBvbmNlIHRoZSBlbGVtZW50IGhlYWRlciBoYXMgYmVlbiBpZGVudGlmaWVkIC0gZXhpdCA8RWxlbWVudD4gOiBvbmNlIHRoZQogICogZWxlbWVudCBoYXMgYmVlbiBmdWxseSBjb25zdW1lZAotICogCisgKgogICogb3RoZXIgc2ltcGxlciBlbGVtZW50cyAocGFja2FnZSwgaW1wb3J0KSBhcmUgcmVhZCBhbGwgYXQgb25jZTogLSBhY2NlcHQKICAqIDxFbGVtZW50PgogICovCiAKIHB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgewotCQorCiAJcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlSW5mbyB7CiAJCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25TdGFydDsKIAkJcHVibGljIGludCBtb2RpZmllcnM7CkBAIC00NywxMiArNTUsMTUgQEAKIAkJcHVibGljIGNoYXJbXSBzdXBlcmNsYXNzOwogCQlwdWJsaWMgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzOwogCQlwdWJsaWMgVHlwZVBhcmFtZXRlckluZm9bXSB0eXBlUGFyYW1ldGVyczsKLQkJcHVibGljIGxvbmdbXSBhbm5vdGF0aW9uUG9zaXRpb25zOwogCQlwdWJsaWMgY2hhcltdW10gY2F0ZWdvcmllczsKIAkJcHVibGljIGJvb2xlYW4gc2Vjb25kYXJ5OwogCQlwdWJsaWMgYm9vbGVhbiBhbm9ueW1vdXNNZW1iZXI7CisJCXB1YmxpYyBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CisJCXB1YmxpYyBpbnQgZXh0cmFGbGFnczsKKwkJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBub2RlOworCQlwdWJsaWMgSGFzaE1hcCBjaGlsZHJlbkNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVBhcmFtZXRlckluZm8gewogCQlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU3RhcnQ7CiAJCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25FbmQ7CkBAIC02MCw5ICs3MSw4IEBACiAJCXB1YmxpYyBpbnQgbmFtZVNvdXJjZVN0YXJ0OwogCQlwdWJsaWMgaW50IG5hbWVTb3VyY2VFbmQ7CiAJCXB1YmxpYyBjaGFyW11bXSBib3VuZHM7Ci0JCXB1YmxpYyBsb25nW10gYW5ub3RhdGlvblBvc2l0aW9uczsKIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGhvZEluZm8gewogCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yOwogCQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb247CkBAIC03NiwyMyArODYsNDEgQEAKIAkJcHVibGljIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzOwogCQlwdWJsaWMgY2hhcltdW10gZXhjZXB0aW9uVHlwZXM7CiAJCXB1YmxpYyBUeXBlUGFyYW1ldGVySW5mb1tdIHR5cGVQYXJhbWV0ZXJzOwotCQlwdWJsaWMgbG9uZ1tdIGFubm90YXRpb25Qb3NpdGlvbnM7CiAJCXB1YmxpYyBjaGFyW11bXSBjYXRlZ29yaWVzOworCQlwdWJsaWMgQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworCQlwdWJsaWMgY2hhcltdIGRlY2xhcmluZ1BhY2thZ2VOYW1lOworCQlwdWJsaWMgaW50IGRlY2xhcmluZ1R5cGVNb2RpZmllcnM7CisJCXB1YmxpYyBpbnQgZXh0cmFGbGFnczsKKwkJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbm9kZTsKKwkJcHVibGljIFBhcmFtZXRlckluZm9bXSBwYXJhbWV0ZXJJbmZvczsKIAl9Ci0JCisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlckluZm8geworCQlwdWJsaWMgaW50IG1vZGlmaWVyczsKKwkJcHVibGljIGludCBkZWNsYXJhdGlvblN0YXJ0OworCQlwdWJsaWMgaW50IGRlY2xhcmF0aW9uRW5kOworCQlwdWJsaWMgaW50IG5hbWVTb3VyY2VTdGFydDsKKwkJcHVibGljIGludCBuYW1lU291cmNlRW5kOworCQlwdWJsaWMgY2hhcltdIG5hbWU7CisJfQogCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRJbmZvIHsKIAkJcHVibGljIGludCBkZWNsYXJhdGlvblN0YXJ0OwogCQlwdWJsaWMgaW50IG1vZGlmaWVyczsKIAkJcHVibGljIGNoYXJbXSB0eXBlOwogCQlwdWJsaWMgY2hhcltdIG5hbWU7Ci0JCXB1YmxpYyBpbnQgbmFtZVNvdXJjZVN0YXJ0OyAKKwkJcHVibGljIGludCBuYW1lU291cmNlU3RhcnQ7CiAJCXB1YmxpYyBpbnQgbmFtZVNvdXJjZUVuZDsKLQkJcHVibGljIGxvbmdbXSBhbm5vdGF0aW9uUG9zaXRpb25zOwogCQlwdWJsaWMgY2hhcltdW10gY2F0ZWdvcmllczsKKwkJcHVibGljIEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKwkJcHVibGljIEZpZWxkRGVjbGFyYXRpb24gbm9kZTsKIAl9Ci0JCisKKwl2b2lkIGFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXVtdIGFubm90YXRpb24sIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCk7CisKKwl2b2lkIGFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSBhbm5vdGF0aW9uLCBpbnQgc291cmNlUG9zaXRpb24pOworCiAJdm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKTsKLQkKKwogCXZvaWQgYWNjZXB0RmllbGRSZWZlcmVuY2UoY2hhcltdIGZpZWxkTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKTsKIAkvKioKIAkgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydApAQCAtMTAxLDYgKzEyOSwxMiBAQAogCSAqIEBwYXJhbSBkZWNsYXJhdGlvbkVuZAogCSAqICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnOycgZW5kaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IG9yCiAJICogICAgICAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgY29tbWVudCBmb2xsb3dpbmcgdGhlIGltcG9ydC4KKwkgKiBAcGFyYW0gbmFtZVN0YXJ0CisJICogICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uJ3MKKwkgKiAgICAgICAgICAgICAgICAgICBuYW1lLgorCSAqIEBwYXJhbSBuYW1lRW5kCisJICogICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24ncworCSAqICAgICAgICAgICAgICAgICAgIG5hbWUuCiAJICogQHBhcmFtIHRva2VucwogCSAqICAgICAgICAgICAgICAgICAgIFRoaXMgYXJlIHRoZSB0b2tlbnMgb2YgdGhlIGltcG9ydCBsaWtlIHNwZWNpZmllZCBpbiB0aGUgc291cmNlLgogCSAqIEBwYXJhbSBvbkRlbWFuZApAQCAtMTA5LDIwICsxNDMsMjAgQEAKIAkgKiBAcGFyYW0gbW9kaWZpZXJzCiAJICogICAgICAgICAgICAgICAgICAgY2FuIGJlIHNldCB0byBzdGF0aWMgZnJvbSAxLjUgb24uCiAJICovCi0Jdm9pZCBhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdW10gdG9rZW5zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKTsKKwl2b2lkIGFjY2VwdEltcG9ydChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gdG9rZW5zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKTsKIAogCS8qCiAJICogVGFibGUgb2YgbGluZSBzZXBhcmF0b3IgcG9zaXRpb24uIFRoaXMgdGFibGUgaXMgcGFzc2VkIG9uY2UgYXQgdGhlIGVuZCBvZgogCSAqIHRoZSBwYXJzZSBhY3Rpb24sIHNvIGFzIHRvIGFsbG93IGNvbXB1dGF0aW9uIG9mIG5vcm1hbGl6ZWQgcmFuZ2VzLgotCSAqIAorCSAqCiAJICogQSBsaW5lIHNlcGFyYXRvciBtaWdodCBjb3JyZXNwb25kcyB0byBzZXZlcmFsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSwKLQkgKiAgCisJICoKIAkgKi8KIAl2b2lkIGFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoaW50W10gcG9zaXRpb25zKTsKIAogCXZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbik7Ci0JCi0Jdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lKTsKKworCXZvaWQgYWNjZXB0UGFja2FnZShJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlKTsKIAogCXZvaWQgYWNjZXB0UHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSk7CiAKQEAgLTEzOSwxNSArMTczLDE1IEBACiAJdm9pZCBlbnRlckNvbnN0cnVjdG9yKE1ldGhvZEluZm8gbWV0aG9kSW5mbyk7CiAKIAl2b2lkIGVudGVyRmllbGQoRmllbGRJbmZvIGZpZWxkSW5mbyk7Ci0JCisKIAl2b2lkIGVudGVySW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMpOwotCQorCiAJdm9pZCBlbnRlck1ldGhvZChNZXRob2RJbmZvIG1ldGhvZEluZm8pOwotCQorCiAJdm9pZCBlbnRlclR5cGUoVHlwZUluZm8gdHlwZUluZm8pOwotCQorCiAJdm9pZCBleGl0Q29tcGlsYXRpb25Vbml0KGludCBkZWNsYXJhdGlvbkVuZCk7Ci0JCisKIAl2b2lkIGV4aXRDb25zdHJ1Y3RvcihpbnQgZGVjbGFyYXRpb25FbmQpOwogCiAJLyoKQEAgLTE1NSwxMCArMTg5LDEwIEBACiAJICogaW5pdGlhbGl6aW5nIHRoZSBmaWVsZCBpZiBhbnkgKC0xIGlmIG5vIGluaXRpYWxpemF0aW9uKS4KIAkgKi8KIAl2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotCQorCiAJdm9pZCBleGl0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uRW5kKTsKLQkKLQl2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVmYXVsdFZhbHVlU3RhcnQsIGludCBkZWZhdWx0VmFsdWVFbmQpOwotCQorCisJdm9pZCBleGl0TWV0aG9kKGludCBkZWNsYXJhdGlvbkVuZCwgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUpOworCiAJdm9pZCBleGl0VHlwZShpbnQgZGVjbGFyYXRpb25FbmQpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnROb3RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnROb3RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTk5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudE5vdGlmaWVyLmphdmEKQEAgLTAsMCArMSw3OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3Rvci5QYXJhbWV0ZXJJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3Rvci5UeXBlUGFyYW1ldGVySW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWxsb2NhdGlvbkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNsYXNzTGl0ZXJhbEFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRoaXNSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0VG9JbnQ7CisKK3B1YmxpYyBjbGFzcyBTb3VyY2VFbGVtZW50Tm90aWZpZXIgeworCS8qKgorCSAqIEFuIGFzdCB2aXNpdG9yIHRoYXQgdmlzaXRzIGxvY2FsIHR5cGUgZGVjbGFyYXRpb25zLgorCSAqLworCXB1YmxpYyBjbGFzcyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgeworCQlwdWJsaWMgSW1wb3J0UmVmZXJlbmNlIGN1cnJlbnRQYWNrYWdlOworCQlBcnJheUxpc3QgZGVjbGFyaW5nVHlwZXM7CisJCXB1YmxpYyB2b2lkIHB1c2hEZWNsYXJpbmdUeXBlKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKSB7CisJCQlpZiAodGhpcy5kZWNsYXJpbmdUeXBlcyA9PSBudWxsKSB7CisJCQkJdGhpcy5kZWNsYXJpbmdUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCX0KKwkJCXRoaXMuZGVjbGFyaW5nVHlwZXMuYWRkKGRlY2xhcmluZ1R5cGUpOworCQl9CisJCXB1YmxpYyB2b2lkIHBvcERlY2xhcmluZ1R5cGUoKSB7CisJCQl0aGlzLmRlY2xhcmluZ1R5cGVzLnJlbW92ZSh0aGlzLmRlY2xhcmluZ1R5cGVzLnNpemUoKS0xKTsKKwkJfQorCQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHBlZWtEZWNsYXJpbmdUeXBlKCkgeworCQkJaWYgKHRoaXMuZGVjbGFyaW5nVHlwZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQlpbnQgc2l6ZSA9IHRoaXMuZGVjbGFyaW5nVHlwZXMuc2l6ZSgpOworCQkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgdGhpcy5kZWNsYXJpbmdUeXBlcy5nZXQoc2l6ZS0xKTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKHR5cGVEZWNsYXJhdGlvbiwgdHJ1ZSwgcGVla0RlY2xhcmluZ1R5cGUoKSwgdGhpcy5jdXJyZW50UGFja2FnZSk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvciguLi4pCisJCX0KKwkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3Rvcih0eXBlRGVjbGFyYXRpb24sIHRydWUsIHBlZWtEZWNsYXJpbmdUeXBlKCksIHRoaXMuY3VycmVudFBhY2thZ2UpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCB2aXNpdCBtZW1iZXJzIGFzIHRoaXMgd2FzIGRvbmUgZHVyaW5nIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoLi4uKQorCQl9CisJfQorCisJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yOworCWJvb2xlYW4gcmVwb3J0UmVmZXJlbmNlSW5mbzsKKwljaGFyW11bXSB0eXBlTmFtZXM7CisJY2hhcltdW10gc3VwZXJUeXBlTmFtZXM7CisJaW50IG5lc3RlZFR5cGVJbmRleDsKKwlMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBsb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG51bGw7CisKKwlIYXNodGFibGVPZk9iamVjdFRvSW50IHNvdXJjZUVuZHM7CisJTWFwIG5vZGVzVG9DYXRlZ29yaWVzOworCisJaW50IGluaXRpYWxQb3NpdGlvbjsKKwlpbnQgZW9mUG9zaXRpb247CisKK3B1YmxpYyBTb3VyY2VFbGVtZW50Tm90aWZpZXIoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCBib29sZWFuIHJlcG9ydExvY2FsRGVjbGFyYXRpb25zKSB7CisJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJaWYgKHJlcG9ydExvY2FsRGVjbGFyYXRpb25zKSB7CisJCXRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IoKTsKKwl9CisJdGhpcy50eXBlTmFtZXMgPSBuZXcgY2hhcls0XVtdOworCXRoaXMuc3VwZXJUeXBlTmFtZXMgPSBuZXcgY2hhcls0XVtdOworCXRoaXMubmVzdGVkVHlwZUluZGV4ID0gMDsKK30KK3Byb3RlY3RlZCBPYmplY3RbXVtdIGdldEFyZ3VtZW50SW5mb3MoQXJndW1lbnRbXSBhcmd1bWVudHMpIHsKKwlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCWNoYXJbXVtdIGFyZ3VtZW50VHlwZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKKwljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gbmV3IGNoYXJbYXJndW1lbnRMZW5ndGhdW107CisJUGFyYW1ldGVySW5mb1tdIHBhcmFtZXRlckluZm9zID0gbmV3IFBhcmFtZXRlckluZm9bYXJndW1lbnRMZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRMZW5ndGg7IGkrKykgeworCQlBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKKwkJYXJndW1lbnRUeXBlc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChhcmd1bWVudC50eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQljaGFyW10gbmFtZSA9IGFyZ3VtZW50Lm5hbWU7CisJCWFyZ3VtZW50TmFtZXNbaV0gPSBuYW1lOworCQlQYXJhbWV0ZXJJbmZvIHBhcmFtZXRlckluZm8gPSBuZXcgUGFyYW1ldGVySW5mbygpOworCQlwYXJhbWV0ZXJJbmZvLmRlY2xhcmF0aW9uU3RhcnQgPSBhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQlwYXJhbWV0ZXJJbmZvLmRlY2xhcmF0aW9uRW5kID0gYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCXBhcmFtZXRlckluZm8ubmFtZVNvdXJjZVN0YXJ0ID0gYXJndW1lbnQuc291cmNlU3RhcnQ7CisJCXBhcmFtZXRlckluZm8ubmFtZVNvdXJjZUVuZCA9IGFyZ3VtZW50LnNvdXJjZUVuZDsKKwkJcGFyYW1ldGVySW5mby5tb2RpZmllcnMgPSBhcmd1bWVudC5tb2RpZmllcnM7CisJCXBhcmFtZXRlckluZm8ubmFtZSA9IG5hbWU7CisJCXBhcmFtZXRlckluZm9zW2ldID0gcGFyYW1ldGVySW5mbzsKKwl9CisKKwlyZXR1cm4gbmV3IE9iamVjdFtdW10geyBwYXJhbWV0ZXJJbmZvcywgbmV3IGNoYXJbXVtdW10geyBhcmd1bWVudFR5cGVzLCBhcmd1bWVudE5hbWVzIH0gfTsKK30KK3Byb3RlY3RlZCBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBudWxsOworCWludCBzdXBlckludGVyZmFjZXNMZW5ndGggPSAwOworCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzOworCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlzdXBlckludGVyZmFjZXNMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQlpbnRlcmZhY2VOYW1lcyA9IG5ldyBjaGFyW3N1cGVySW50ZXJmYWNlc0xlbmd0aF1bXTsKKwl9IGVsc2UgeworCQlpZiAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsKKwkJCS8vIHNlZSBQUiAzNDQyCisJCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uOworCQkJaWYgKGFsbG9jICE9IG51bGwgJiYgYWxsb2MudHlwZSAhPSBudWxsKSB7CisJCQkJc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbXSB7IGFsbG9jLnR5cGV9OworCQkJCXN1cGVySW50ZXJmYWNlc0xlbmd0aCA9IDE7CisJCQkJaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhclsxXVtdOworCQkJfQorCQl9CisJfQorCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlc0xlbmd0aDsgaSsrKSB7CisJCQlpbnRlcmZhY2VOYW1lc1tpXSA9CisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVySW50ZXJmYWNlc1tpXS5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKTsKKwkJfQorCX0KKwlyZXR1cm4gaW50ZXJmYWNlTmFtZXM7Cit9Citwcm90ZWN0ZWQgY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzczsKKwlyZXR1cm4gc3VwZXJjbGFzcyAhPSBudWxsID8gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVyY2xhc3MuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJykgOiBudWxsOworfQorcHJvdGVjdGVkIGNoYXJbXVtdIGdldFRocm93bkV4Y2VwdGlvbnMoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgeworCWNoYXJbXVtdIHRocm93bkV4Y2VwdGlvblR5cGVzID0gbnVsbDsKKwlUeXBlUmVmZXJlbmNlW10gdGhyb3duRXhjZXB0aW9ucyA9IG1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnM7CisJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgdGhyb3duRXhjZXB0aW9uTGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7CisJCXRocm93bkV4Y2VwdGlvblR5cGVzID0gbmV3IGNoYXJbdGhyb3duRXhjZXB0aW9uTGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbkxlbmd0aDsgaSsrKSB7CisJCQl0aHJvd25FeGNlcHRpb25UeXBlc1tpXSA9CisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRocm93bkV4Y2VwdGlvbnNbaV0uZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7CisJCX0KKwl9CisJcmV0dXJuIHRocm93bkV4Y2VwdGlvblR5cGVzOworfQorcHJvdGVjdGVkIGNoYXJbXVtdIGdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CisJVHlwZVJlZmVyZW5jZSBmaXJzdEJvdW5kID0gdHlwZVBhcmFtZXRlci50eXBlOworCVR5cGVSZWZlcmVuY2VbXSBvdGhlckJvdW5kcyA9IHR5cGVQYXJhbWV0ZXIuYm91bmRzOworCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBudWxsOworCWlmIChmaXJzdEJvdW5kICE9IG51bGwpIHsKKwkJaWYgKG90aGVyQm91bmRzICE9IG51bGwpIHsKKwkJCWludCBvdGhlckJvdW5kc0xlbmd0aCA9IG90aGVyQm91bmRzLmxlbmd0aDsKKwkJCWNoYXJbXVtdIGJvdW5kTmFtZXMgPSBuZXcgY2hhcltvdGhlckJvdW5kc0xlbmd0aCsxXVtdOworCQkJYm91bmROYW1lc1swXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChmaXJzdEJvdW5kLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvdGhlckJvdW5kc0xlbmd0aDsgaisrKSB7CisJCQkJYm91bmROYW1lc1tqKzFdID0KKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKG90aGVyQm91bmRzW2pdLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOworCQkJfQorCQkJdHlwZVBhcmFtZXRlckJvdW5kcyA9IGJvdW5kTmFtZXM7CisJCX0gZWxzZSB7CisJCQl0eXBlUGFyYW1ldGVyQm91bmRzID0gbmV3IGNoYXJbXVtdIHsgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGZpcnN0Qm91bmQuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyl9OworCQl9CisJfSBlbHNlIHsKKwkJdHlwZVBhcmFtZXRlckJvdW5kcyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCX0KKworCXJldHVybiB0eXBlUGFyYW1ldGVyQm91bmRzOworfQorcHJpdmF0ZSBUeXBlUGFyYW1ldGVySW5mb1tdIGdldFR5cGVQYXJhbWV0ZXJJbmZvcyhUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMpIHsKKwlpZiAodHlwZVBhcmFtZXRlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaW50IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoID0gdHlwZVBhcmFtZXRlcnMubGVuZ3RoOworCVR5cGVQYXJhbWV0ZXJJbmZvW10gcmVzdWx0ID0gbmV3IFR5cGVQYXJhbWV0ZXJJbmZvW3R5cGVQYXJhbWV0ZXJzTGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoOyBpKyspIHsKKwkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CisJCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBnZXRUeXBlUGFyYW1ldGVyQm91bmRzKHR5cGVQYXJhbWV0ZXIpOworCQlJU291cmNlRWxlbWVudFJlcXVlc3Rvci5UeXBlUGFyYW1ldGVySW5mbyB0eXBlUGFyYW1ldGVySW5mbyA9IG5ldyBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5UeXBlUGFyYW1ldGVySW5mbygpOworCQl0eXBlUGFyYW1ldGVySW5mby5kZWNsYXJhdGlvblN0YXJ0ID0gdHlwZVBhcmFtZXRlci5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQl0eXBlUGFyYW1ldGVySW5mby5kZWNsYXJhdGlvbkVuZCA9IHR5cGVQYXJhbWV0ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCXR5cGVQYXJhbWV0ZXJJbmZvLm5hbWUgPSB0eXBlUGFyYW1ldGVyLm5hbWU7CisJCXR5cGVQYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VTdGFydCA9IHR5cGVQYXJhbWV0ZXIuc291cmNlU3RhcnQ7CisJCXR5cGVQYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VFbmQgPSB0eXBlUGFyYW1ldGVyLnNvdXJjZUVuZDsKKwkJdHlwZVBhcmFtZXRlckluZm8uYm91bmRzID0gdHlwZVBhcmFtZXRlckJvdW5kczsKKwkJcmVzdWx0W2ldID0gdHlwZVBhcmFtZXRlckluZm87CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKgorICogQ2hlY2tzIHdoZXRoZXIgb25lIG9mIHRoZSBhbm5vdGF0aW9ucyBpcyB0aGUgQERlcHJlY2F0ZWQgYW5ub3RhdGlvbgorICogKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk4MDcpCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBoYXNEZXByZWNhdGVkQW5ub3RhdGlvbihBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKwlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW2ldOworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGFubm90YXRpb24udHlwZS5nZXRMYXN0VG9rZW4oKSwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfREVQUkVDQVRFRFsyXSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKgorICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwcm90ZWN0ZWQgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlLCBJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UpIHsKKworCS8vIHJhbmdlIGNoZWNrCisJYm9vbGVhbiBpc0luUmFuZ2UgPQorCQkJCXRoaXMuaW5pdGlhbFBvc2l0aW9uIDw9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQKKwkJCQkmJiB0aGlzLmVvZlBvc2l0aW9uID49IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCisJaWYgKG1ldGhvZERlY2xhcmF0aW9uLmlzQ2xpbml0KCkpIHsKKwkJdGhpcy52aXNpdElmTmVlZGVkKG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpKSB7CisJCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOworCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CisJCQkJc3dpdGNoKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlKSB7CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKKwkJCQkJCQl0aGlzLnR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleC0xXSwKKwkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyIDoKKwkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyIDoKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAorCQkJCQkJCXRoaXMuc3VwZXJUeXBlTmFtZXNbdGhpcy5uZXN0ZWRUeXBlSW5kZXgtMV0sCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMubGVuZ3RoLAorCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKwljaGFyW11bXSBhcmd1bWVudFR5cGVzID0gbnVsbDsKKwljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gbnVsbDsKKwlib29sZWFuIGlzVmFyQXJncyA9IGZhbHNlOworCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzOworCVBhcmFtZXRlckluZm9bXSBwYXJhbWV0ZXJJbmZvcyA9IG51bGw7IAorCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQlPYmplY3RbXVtdIGFyZ3VtZW50SW5mb3MgPSBnZXRBcmd1bWVudEluZm9zKGFyZ3VtZW50cyk7CisJCXBhcmFtZXRlckluZm9zID0gKFBhcmFtZXRlckluZm9bXSkgYXJndW1lbnRJbmZvc1swXTsKKwkJYXJndW1lbnRUeXBlcyA9IChjaGFyW11bXSkgYXJndW1lbnRJbmZvc1sxXVswXTsKKwkJYXJndW1lbnROYW1lcyA9IChjaGFyW11bXSkgYXJndW1lbnRJbmZvc1sxXVsxXTsKKworCQlpc1ZhckFyZ3MgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXS5pc1ZhckFyZ3MoKTsKKwl9CisJY2hhcltdW10gdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBnZXRUaHJvd25FeGNlcHRpb25zKG1ldGhvZERlY2xhcmF0aW9uKTsKKwkvLyBieSBkZWZhdWx0IG5vIHNlbGVjdG9yIGVuZCBwb3NpdGlvbgorCWludCBzZWxlY3RvclNvdXJjZUVuZCA9IC0xOworCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJc2VsZWN0b3JTb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZHMuZ2V0KG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJaWYgKGlzSW5SYW5nZSl7CisJCQlpbnQgY3VycmVudE1vZGlmaWVycyA9IG1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVyczsKKwkJCWlmIChpc1ZhckFyZ3MpCisJCQkJY3VycmVudE1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJnczsKKworCQkJLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKKwkJCWJvb2xlYW4gZGVwcmVjYXRlZCA9IChjdXJyZW50TW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDAgfHwgaGFzRGVwcmVjYXRlZEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOworCisJCQlJU291cmNlRWxlbWVudFJlcXVlc3Rvci5NZXRob2RJbmZvIG1ldGhvZEluZm8gPSBuZXcgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuTWV0aG9kSW5mbygpOworCQkJbWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yID0gdHJ1ZTsKKwkJCW1ldGhvZEluZm8uZGVjbGFyYXRpb25TdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCQltZXRob2RJbmZvLm1vZGlmaWVycyA9IGRlcHJlY2F0ZWQgPyAoY3VycmVudE1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcpIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgOiBjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwkJCW1ldGhvZEluZm8ubmFtZSA9IG1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yOworCQkJbWV0aG9kSW5mby5uYW1lU291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwkJCW1ldGhvZEluZm8ubmFtZVNvdXJjZUVuZCA9IHNlbGVjdG9yU291cmNlRW5kOworCQkJbWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyA9IGFyZ3VtZW50VHlwZXM7CisJCQltZXRob2RJbmZvLnBhcmFtZXRlck5hbWVzID0gYXJndW1lbnROYW1lczsKKwkJCW1ldGhvZEluZm8uZXhjZXB0aW9uVHlwZXMgPSB0aHJvd25FeGNlcHRpb25UeXBlczsKKwkJCW1ldGhvZEluZm8udHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVySW5mb3MobWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMoKSk7CisJCQltZXRob2RJbmZvLnBhcmFtZXRlckluZm9zID0gcGFyYW1ldGVySW5mb3M7CisJCQltZXRob2RJbmZvLmNhdGVnb3JpZXMgPSAoY2hhcltdW10pIHRoaXMubm9kZXNUb0NhdGVnb3JpZXMuZ2V0KG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJCW1ldGhvZEluZm8uYW5ub3RhdGlvbnMgPSBtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKKwkJCW1ldGhvZEluZm8uZGVjbGFyaW5nUGFja2FnZU5hbWUgPSBjdXJyZW50UGFja2FnZSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGN1cnJlbnRQYWNrYWdlLnRva2VucywgJy4nKTsKKwkJCW1ldGhvZEluZm8uZGVjbGFyaW5nVHlwZU1vZGlmaWVycyA9IGRlY2xhcmluZ1R5cGUubW9kaWZpZXJzOworCQkJbWV0aG9kSW5mby5leHRyYUZsYWdzID0gRXh0cmFGbGFncy5nZXRFeHRyYUZsYWdzKGRlY2xhcmluZ1R5cGUpOworCQkJbWV0aG9kSW5mby5ub2RlID0gbWV0aG9kRGVjbGFyYXRpb247CisJCQl0aGlzLnJlcXVlc3Rvci5lbnRlckNvbnN0cnVjdG9yKG1ldGhvZEluZm8pOworCQl9CisJCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOworCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CisJCQkJc3dpdGNoKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlKSB7CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6CisJCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKKwkJCQkJCQl0aGlzLnR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleC0xXSwKKwkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyIDoKKwkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyIDoKKwkJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAorCQkJCQkJCXRoaXMuc3VwZXJUeXBlTmFtZXNbdGhpcy5uZXN0ZWRUeXBlSW5kZXgtMV0sCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMubGVuZ3RoLAorCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy52aXNpdElmTmVlZGVkKG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJaWYgKGlzSW5SYW5nZSl7CisJCQl0aGlzLnJlcXVlc3Rvci5leGl0Q29uc3RydWN0b3IobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQl9CisJCXJldHVybjsKKwl9CisJc2VsZWN0b3JTb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZHMuZ2V0KG1ldGhvZERlY2xhcmF0aW9uKTsKKwlpZiAoaXNJblJhbmdlKSB7CisJCWludCBjdXJyZW50TW9kaWZpZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzOworCQlpZiAoaXNWYXJBcmdzKQorCQkJY3VycmVudE1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJnczsKKworCQkvLyByZW1lbWJlciBkZXByZWNhdGlvbiBzbyBhcyB0byBub3QgbG9zZSBpdCBiZWxvdworCQlib29sZWFuIGRlcHJlY2F0ZWQgPSAoY3VycmVudE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwIHx8IGhhc0RlcHJlY2F0ZWRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKworCQlUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUgPSBtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uCisJCQk/ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5yZXR1cm5UeXBlCisJCQk6IG51bGw7CisJCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yLk1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG5ldyBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5NZXRob2RJbmZvKCk7CisJCW1ldGhvZEluZm8uaXNBbm5vdGF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb247CisJCW1ldGhvZEluZm8uZGVjbGFyYXRpb25TdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCW1ldGhvZEluZm8ubW9kaWZpZXJzID0gZGVwcmVjYXRlZCA/IChjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCA6IGN1cnJlbnRNb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworCQltZXRob2RJbmZvLnJldHVyblR5cGUgPSByZXR1cm5UeXBlID09IG51bGwgPyBudWxsIDogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHJldHVyblR5cGUuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7CisJCW1ldGhvZEluZm8ubmFtZSA9IG1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yOworCQltZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OworCQltZXRob2RJbmZvLm5hbWVTb3VyY2VFbmQgPSBzZWxlY3RvclNvdXJjZUVuZDsKKwkJbWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyA9IGFyZ3VtZW50VHlwZXM7CisJCW1ldGhvZEluZm8ucGFyYW1ldGVyTmFtZXMgPSBhcmd1bWVudE5hbWVzOworCQltZXRob2RJbmZvLmV4Y2VwdGlvblR5cGVzID0gdGhyb3duRXhjZXB0aW9uVHlwZXM7CisJCW1ldGhvZEluZm8udHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVySW5mb3MobWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMoKSk7CisJCW1ldGhvZEluZm8ucGFyYW1ldGVySW5mb3MgPSBwYXJhbWV0ZXJJbmZvczsKKwkJbWV0aG9kSW5mby5jYXRlZ29yaWVzID0gKGNoYXJbXVtdKSB0aGlzLm5vZGVzVG9DYXRlZ29yaWVzLmdldChtZXRob2REZWNsYXJhdGlvbik7CisJCW1ldGhvZEluZm8uYW5ub3RhdGlvbnMgPSBtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKKwkJbWV0aG9kSW5mby5ub2RlID0gbWV0aG9kRGVjbGFyYXRpb247CisJCXRoaXMucmVxdWVzdG9yLmVudGVyTWV0aG9kKG1ldGhvZEluZm8pOworCX0KKworCXRoaXMudmlzaXRJZk5lZWRlZChtZXRob2REZWNsYXJhdGlvbik7CisKKwlpZiAoaXNJblJhbmdlKSB7CisJCWlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbikgeworCQkJQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIGFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uOworCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uLmRlZmF1bHRWYWx1ZTsKKwkJCWlmIChleHByZXNzaW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLnJlcXVlc3Rvci5leGl0TWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kLCBleHByZXNzaW9uKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJdGhpcy5yZXF1ZXN0b3IuZXhpdE1ldGhvZChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCwgbnVsbCk7CisJfQorfQorCisvKgorICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKAorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0LAorCQlpbnQgc291cmNlU3RhcnQsCisJCWludCBzb3VyY2VFbmQsCisJCWJvb2xlYW4gcmVwb3J0UmVmZXJlbmNlLAorCQlIYXNodGFibGVPZk9iamVjdFRvSW50IHNvdXJjZUVuZHNNYXAsCisJCU1hcCBub2Rlc1RvQ2F0ZWdvcmllc01hcCkgeworCisJdGhpcy5pbml0aWFsUG9zaXRpb24gPSBzb3VyY2VTdGFydDsKKwl0aGlzLmVvZlBvc2l0aW9uID0gc291cmNlRW5kOworCisJdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvID0gcmVwb3J0UmVmZXJlbmNlOworCXRoaXMuc291cmNlRW5kcyA9IHNvdXJjZUVuZHNNYXA7CisJdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcyA9IG5vZGVzVG9DYXRlZ29yaWVzTWFwOworCisJdHJ5IHsKKwkJLy8gcmFuZ2UgY2hlY2sKKwkJYm9vbGVhbiBpc0luUmFuZ2UgPQorCQkJCQl0aGlzLmluaXRpYWxQb3NpdGlvbiA8PSBwYXJzZWRVbml0LnNvdXJjZVN0YXJ0CisJCQkJCSYmIHRoaXMuZW9mUG9zaXRpb24gPj0gcGFyc2VkVW5pdC5zb3VyY2VFbmQ7CisKKwkJLy8gY29sbGVjdCB0aGUgdG9wIGxldmVsIGFzdCBub2RlcworCQlpbnQgbGVuZ3RoID0gMDsKKwkJQVNUTm9kZVtdIG5vZGVzID0gbnVsbDsKKwkJaWYgKGlzSW5SYW5nZSkgeworCQkJdGhpcy5yZXF1ZXN0b3IuZW50ZXJDb21waWxhdGlvblVuaXQoKTsKKwkJfQorCQlJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UgPSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlOworCQlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSAgbnVsbCkgeworCQkJdGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvci5jdXJyZW50UGFja2FnZSA9IGN1cnJlbnRQYWNrYWdlOworCQl9CisJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBwYXJzZWRVbml0LmltcG9ydHM7CisJCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gcGFyc2VkVW5pdC50eXBlczsKKwkJbGVuZ3RoID0KKwkJCShjdXJyZW50UGFja2FnZSA9PSBudWxsID8gMCA6IDEpCisJCQkrIChpbXBvcnRzID09IG51bGwgPyAwIDogaW1wb3J0cy5sZW5ndGgpCisJCQkrICh0eXBlcyA9PSBudWxsID8gMCA6IHR5cGVzLmxlbmd0aCk7CisJCW5vZGVzID0gbmV3IEFTVE5vZGVbbGVuZ3RoXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJaWYgKGN1cnJlbnRQYWNrYWdlICE9IG51bGwpIHsKKwkJCW5vZGVzW2luZGV4KytdID0gY3VycmVudFBhY2thZ2U7CisJCX0KKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGltcG9ydHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlub2Rlc1tpbmRleCsrXSA9IGltcG9ydHNbaV07CisJCQl9CisJCX0KKwkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCW5vZGVzW2luZGV4KytdID0gdHlwZXNbaV07CisJCQl9CisJCX0KKworCQkvLyBub3RpZnkgdGhlIG5vZGVzIGluIHRoZSBzeW50YWN0aWNhbCBvcmRlcgorCQlpZiAobGVuZ3RoID4gMCkgeworCQkJcXVpY2tTb3J0KG5vZGVzLCAwLCBsZW5ndGgtMSk7CisJCQlmb3IgKGludCBpPTA7aTxsZW5ndGg7aSsrKSB7CisJCQkJQVNUTm9kZSBub2RlID0gbm9kZXNbaV07CisJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsKKwkJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiA9IChJbXBvcnRSZWZlcmVuY2Upbm9kZTsKKwkJCQkJaWYgKG5vZGUgPT0gcGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSkgeworCQkJCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihpbXBvcnRSZWYsIHRydWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihpbXBvcnRSZWYsIGZhbHNlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7IC8vIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uCisJCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoKFR5cGVEZWNsYXJhdGlvbilub2RlLCB0cnVlLCBudWxsLCBjdXJyZW50UGFja2FnZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGlzSW5SYW5nZSkgeworCQkJdGhpcy5yZXF1ZXN0b3IuZXhpdENvbXBpbGF0aW9uVW5pdChwYXJzZWRVbml0LnNvdXJjZUVuZCk7CisJCX0KKwl9IGZpbmFsbHkgeworCQlyZXNldCgpOworCX0KK30KKworLyoKKyogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorKi8KK3Byb3RlY3RlZCB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSkgeworCisJLy8gcmFuZ2UgY2hlY2sKKwlib29sZWFuIGlzSW5SYW5nZSA9CisJCQkJdGhpcy5pbml0aWFsUG9zaXRpb24gPD0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0CisJCQkJJiYgdGhpcy5lb2ZQb3NpdGlvbiA+PSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCisJc3dpdGNoKGZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpKSB7CisJCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQ6CisJCQlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCQkJLy8gYWNjZXB0IGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgZW51bSBjb25zdGFudAorCQkJCWlmIChmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwkJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb247CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAorCQkJCQkJZGVjbGFyaW5nVHlwZS5uYW1lLAorCQkJCQkJYWxsb2MuYXJndW1lbnRzID09IG51bGwgPyAwIDogYWxsb2MuYXJndW1lbnRzLmxlbmd0aCwKKwkJCQkJCWFsbG9jLnNvdXJjZVN0YXJ0KTsKKwkJCQl9CisJCQl9CisJCQkvLyAkRkFMTC1USFJPVUdIJAorCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5GSUVMRDoKKwkJCWludCBmaWVsZEVuZFBvc2l0aW9uID0gdGhpcy5zb3VyY2VFbmRzLmdldChmaWVsZERlY2xhcmF0aW9uKTsKKwkJCWlmIChmaWVsZEVuZFBvc2l0aW9uID09IC0xKSB7CisJCQkJLy8gdXNlIHRoZSBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGJ5IGRlZmF1bHQKKwkJCQlmaWVsZEVuZFBvc2l0aW9uID0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCX0KKwkJCWlmIChpc0luUmFuZ2UpIHsKKwkJCQlpbnQgY3VycmVudE1vZGlmaWVycyA9IGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzOworCisJCQkJLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKKwkJCQlib29sZWFuIGRlcHJlY2F0ZWQgPSAoY3VycmVudE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwIHx8IGhhc0RlcHJlY2F0ZWRBbm5vdGF0aW9uKGZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOworCisJCQkJY2hhcltdIHR5cGVOYW1lID0gbnVsbDsKKwkJCQlpZiAoZmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpIHsKKwkJCQkJLy8gZW51bSBjb25zdGFudAorCQkJCQl0eXBlTmFtZSA9IGRlY2xhcmluZ1R5cGUubmFtZTsKKwkJCQkJY3VycmVudE1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyByZWd1bGFyIGZpZWxkCisJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGZpZWxkRGVjbGFyYXRpb24udHlwZS5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKTsKKwkJCQl9CisJCQkJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuRmllbGRJbmZvIGZpZWxkSW5mbyA9IG5ldyBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5GaWVsZEluZm8oKTsKKwkJCQlmaWVsZEluZm8uZGVjbGFyYXRpb25TdGFydCA9IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQlmaWVsZEluZm8ubmFtZSA9IGZpZWxkRGVjbGFyYXRpb24ubmFtZTsKKwkJCQlmaWVsZEluZm8ubW9kaWZpZXJzID0gZGVwcmVjYXRlZCA/IChjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCA6IGN1cnJlbnRNb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworCQkJCWZpZWxkSW5mby50eXBlID0gdHlwZU5hbWU7CisJCQkJZmllbGRJbmZvLm5hbWVTb3VyY2VTdGFydCA9IGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQ7CisJCQkJZmllbGRJbmZvLm5hbWVTb3VyY2VFbmQgPSBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZDsKKwkJCQlmaWVsZEluZm8uY2F0ZWdvcmllcyA9IChjaGFyW11bXSkgdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5nZXQoZmllbGREZWNsYXJhdGlvbik7CisJCQkJZmllbGRJbmZvLmFubm90YXRpb25zID0gZmllbGREZWNsYXJhdGlvbi5hbm5vdGF0aW9uczsKKwkJCQlmaWVsZEluZm8ubm9kZSA9IGZpZWxkRGVjbGFyYXRpb247CisJCQkJdGhpcy5yZXF1ZXN0b3IuZW50ZXJGaWVsZChmaWVsZEluZm8pOworCQkJfQorCQkJdGhpcy52aXNpdElmTmVlZGVkKGZpZWxkRGVjbGFyYXRpb24sIGRlY2xhcmluZ1R5cGUpOworCQkJaWYgKGlzSW5SYW5nZSl7CisJCQkJdGhpcy5yZXF1ZXN0b3IuZXhpdEZpZWxkKAorCQkJCQkvLyBmaWx0ZXIgb3V0IGluaXRpYWxpemF0aW9ucyB0aGF0IGFyZSBub3QgYSBjb25zdGFudCAoc2ltcGxlIGNoZWNrKQorCQkJCQkoZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiA9PSBudWxsCisJCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIKKwkJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24KKwkJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbgorCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBc3NpZ25tZW50CisJCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENsYXNzTGl0ZXJhbEFjY2VzcworCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBNZXNzYWdlU2VuZAorCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheVJlZmVyZW5jZQorCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBUaGlzUmVmZXJlbmNlKSA/CisJCQkJCQktMSA6CisJCQkJCQlmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZVN0YXJ0LAorCQkJCQlmaWVsZEVuZFBvc2l0aW9uLAorCQkJCQlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5JTklUSUFMSVpFUjoKKwkJCWlmIChpc0luUmFuZ2UpeworCQkJCXRoaXMucmVxdWVzdG9yLmVudGVySW5pdGlhbGl6ZXIoCisJCQkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMpOworCQkJfQorCQkJdGhpcy52aXNpdElmTmVlZGVkKChJbml0aWFsaXplcilmaWVsZERlY2xhcmF0aW9uKTsKKwkJCWlmIChpc0luUmFuZ2UpeworCQkJCXRoaXMucmVxdWVzdG9yLmV4aXRJbml0aWFsaXplcihmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoCisJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSwKKwlib29sZWFuIGlzUGFja2FnZSkgeworCWlmIChpc1BhY2thZ2UpIHsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShpbXBvcnRSZWZlcmVuY2UpOworCX0gZWxzZSB7CisJCWZpbmFsIGJvb2xlYW4gb25EZW1hbmQgPSAoaW1wb3J0UmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwOworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRJbXBvcnQoCisJCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJCWltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJCW9uRGVtYW5kID8gaW1wb3J0UmVmZXJlbmNlLnRyYWlsaW5nU3RhclBvc2l0aW9uIDogaW1wb3J0UmVmZXJlbmNlLnNvdXJjZUVuZCwKKwkJCWltcG9ydFJlZmVyZW5jZS50b2tlbnMsCisJCQlvbkRlbWFuZCwKKwkJCWltcG9ydFJlZmVyZW5jZS5tb2RpZmllcnMpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgYm9vbGVhbiBub3RpZnlUeXBlUHJlc2VuY2UsIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlLCBJbXBvcnRSZWZlcmVuY2UgY3VycmVudFBhY2thZ2UpIHsKKworCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FLCB0eXBlRGVjbGFyYXRpb24ubmFtZSkpIHJldHVybjsKKworCS8vIHJhbmdlIGNoZWNrCisJYm9vbGVhbiBpc0luUmFuZ2UgPQorCQl0aGlzLmluaXRpYWxQb3NpdGlvbiA8PSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAorCQkmJiB0aGlzLmVvZlBvc2l0aW9uID49IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKworCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbGFyYXRpb24uZmllbGRzOworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CisJVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZXMgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXM7CisJaW50IGZpZWxkQ291bnRlciA9IGZpZWxkcyA9PSBudWxsID8gMCA6IGZpZWxkcy5sZW5ndGg7CisJaW50IG1ldGhvZENvdW50ZXIgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisJaW50IG1lbWJlclR5cGVDb3VudGVyID0gbWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiBtZW1iZXJUeXBlcy5sZW5ndGg7CisJaW50IGZpZWxkSW5kZXggPSAwOworCWludCBtZXRob2RJbmRleCA9IDA7CisJaW50IG1lbWJlclR5cGVJbmRleCA9IDA7CisKKwlpZiAobm90aWZ5VHlwZVByZXNlbmNlKXsKKwkJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBnZXRJbnRlcmZhY2VOYW1lcyh0eXBlRGVjbGFyYXRpb24pOworCQlpbnQga2luZCA9IFR5cGVEZWNsYXJhdGlvbi5raW5kKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpOworCQljaGFyW10gaW1wbGljaXRTdXBlcmNsYXNzTmFtZSA9IFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfTEFOR19PQkpFQ1Q7CisJCWlmIChpc0luUmFuZ2UpIHsKKwkJCWludCBjdXJyZW50TW9kaWZpZXJzID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKKworCQkJLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKKwkJCWJvb2xlYW4gZGVwcmVjYXRlZCA9IChjdXJyZW50TW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDAgfHwgaGFzRGVwcmVjYXRlZEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKKworCQkJYm9vbGVhbiBpc0VudW1Jbml0ID0gdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gIT0gbnVsbCAmJiB0eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbi5lbnVtQ29uc3RhbnQgIT0gbnVsbDsKKwkJCWNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKKwkJCWlmIChpc0VudW1Jbml0KSB7CisJCQkJY3VycmVudE1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRW51bTsKKwkJCQlzdXBlcmNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUubmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJc3VwZXJjbGFzc05hbWUgPSBnZXRTdXBlcmNsYXNzTmFtZSh0eXBlRGVjbGFyYXRpb24pOworCQkJfQorCQkJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZUluZm8gdHlwZUluZm8gPSBuZXcgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZUluZm8oKTsKKwkJCWlmICh0eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbiA9PSBudWxsKSB7CisJCQkJdHlwZUluZm8uZGVjbGFyYXRpb25TdGFydCA9IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJfSBlbHNlIGlmIChpc0VudW1Jbml0KSB7CisJCQkJdHlwZUluZm8uZGVjbGFyYXRpb25TdGFydCA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLmVudW1Db25zdGFudC5zb3VyY2VTdGFydDsKKwkJCX0gZWxzZSB7CisJCQkJdHlwZUluZm8uZGVjbGFyYXRpb25TdGFydCA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLnNvdXJjZVN0YXJ0OworCQkJfQorCQkJdHlwZUluZm8ubW9kaWZpZXJzID0gZGVwcmVjYXRlZCA/IChjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCA6IGN1cnJlbnRNb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworCQkJdHlwZUluZm8ubmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5uYW1lOworCQkJdHlwZUluZm8ubmFtZVNvdXJjZVN0YXJ0ID0gaXNFbnVtSW5pdCA/IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uLmVudW1Db25zdGFudC5zb3VyY2VTdGFydCA6IHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwkJCXR5cGVJbmZvLm5hbWVTb3VyY2VFbmQgPSBzb3VyY2VFbmQodHlwZURlY2xhcmF0aW9uKTsKKwkJCXR5cGVJbmZvLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzTmFtZTsKKwkJCXR5cGVJbmZvLnN1cGVyaW50ZXJmYWNlcyA9IGludGVyZmFjZU5hbWVzOworCQkJdHlwZUluZm8udHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVySW5mb3ModHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzKTsKKwkJCXR5cGVJbmZvLmNhdGVnb3JpZXMgPSAoY2hhcltdW10pIHRoaXMubm9kZXNUb0NhdGVnb3JpZXMuZ2V0KHR5cGVEZWNsYXJhdGlvbik7CisJCQl0eXBlSW5mby5zZWNvbmRhcnkgPSB0eXBlRGVjbGFyYXRpb24uaXNTZWNvbmRhcnkoKTsKKwkJCXR5cGVJbmZvLmFub255bW91c01lbWJlciA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uICE9IG51bGwgJiYgdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24uZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbDsKKwkJCXR5cGVJbmZvLmFubm90YXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zOworCQkJdHlwZUluZm8uZXh0cmFGbGFncyA9IEV4dHJhRmxhZ3MuZ2V0RXh0cmFGbGFncyh0eXBlRGVjbGFyYXRpb24pOworCQkJdHlwZUluZm8ubm9kZSA9IHR5cGVEZWNsYXJhdGlvbjsKKwkJCXRoaXMucmVxdWVzdG9yLmVudGVyVHlwZSh0eXBlSW5mbyk7CisJCQlzd2l0Y2ggKGtpbmQpIHsKKwkJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5DTEFTU19ERUNMIDoKKwkJCQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpCisJCQkJCQlpbXBsaWNpdFN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMIDoKKwkJCQkJaW1wbGljaXRTdXBlcmNsYXNzTmFtZSA9IFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfTEFOR19PQkpFQ1Q7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6CisJCQkJCWltcGxpY2l0U3VwZXJjbGFzc05hbWUgPSBUeXBlQ29uc3RhbnRzLkNoYXJBcnJheV9KQVZBX0xBTkdfRU5VTTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wgOgorCQkJCQlpbXBsaWNpdFN1cGVyY2xhc3NOYW1lID0gVHlwZUNvbnN0YW50cy5DaGFyQXJyYXlfSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHRoaXMubmVzdGVkVHlwZUluZGV4ID09IHRoaXMudHlwZU5hbWVzLmxlbmd0aCkgeworCQkJLy8gbmVlZCBhIHJlc2l6ZQorCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVOYW1lcywgMCwgKHRoaXMudHlwZU5hbWVzID0gbmV3IGNoYXJbdGhpcy5uZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgdGhpcy5uZXN0ZWRUeXBlSW5kZXgpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1cGVyVHlwZU5hbWVzLCAwLCAodGhpcy5zdXBlclR5cGVOYW1lcyA9IG5ldyBjaGFyW3RoaXMubmVzdGVkVHlwZUluZGV4ICogMl1bXSksIDAsIHRoaXMubmVzdGVkVHlwZUluZGV4KTsKKwkJfQorCQl0aGlzLnR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleF0gPSB0eXBlRGVjbGFyYXRpb24ubmFtZTsKKwkJdGhpcy5zdXBlclR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleCsrXSA9IGltcGxpY2l0U3VwZXJjbGFzc05hbWU7CisJfQorCXdoaWxlICgoZmllbGRJbmRleCA8IGZpZWxkQ291bnRlcikKKwkJCXx8IChtZW1iZXJUeXBlSW5kZXggPCBtZW1iZXJUeXBlQ291bnRlcikKKwkJCXx8IChtZXRob2RJbmRleCA8IG1ldGhvZENvdW50ZXIpKSB7CisJCUZpZWxkRGVjbGFyYXRpb24gbmV4dEZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG5leHRNZXRob2REZWNsYXJhdGlvbiA9IG51bGw7CisJCVR5cGVEZWNsYXJhdGlvbiBuZXh0TWVtYmVyRGVjbGFyYXRpb24gPSBudWxsOworCisJCWludCBwb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCQlpbnQgbmV4dERlY2xhcmF0aW9uVHlwZSA9IC0xOworCQlpZiAoZmllbGRJbmRleCA8IGZpZWxkQ291bnRlcikgeworCQkJbmV4dEZpZWxkRGVjbGFyYXRpb24gPSBmaWVsZHNbZmllbGRJbmRleF07CisJCQlpZiAobmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJcG9zaXRpb24gPSBuZXh0RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJCW5leHREZWNsYXJhdGlvblR5cGUgPSAwOyAvLyBGSUVMRAorCQkJfQorCQl9CisJCWlmIChtZXRob2RJbmRleCA8IG1ldGhvZENvdW50ZXIpIHsKKwkJCW5leHRNZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZHNbbWV0aG9kSW5kZXhdOworCQkJaWYgKG5leHRNZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDwgcG9zaXRpb24pIHsKKwkJCQlwb3NpdGlvbiA9IG5leHRNZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJCW5leHREZWNsYXJhdGlvblR5cGUgPSAxOyAvLyBNRVRIT0QKKwkJCX0KKwkJfQorCQlpZiAobWVtYmVyVHlwZUluZGV4IDwgbWVtYmVyVHlwZUNvdW50ZXIpIHsKKwkJCW5leHRNZW1iZXJEZWNsYXJhdGlvbiA9IG1lbWJlclR5cGVzW21lbWJlclR5cGVJbmRleF07CisJCQlpZiAobmV4dE1lbWJlckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPCBwb3NpdGlvbikgeworCQkJCXBvc2l0aW9uID0gbmV4dE1lbWJlckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDI7IC8vIE1FTUJFUgorCQkJfQorCQl9CisJCXN3aXRjaCAobmV4dERlY2xhcmF0aW9uVHlwZSkgeworCQkJY2FzZSAwIDoKKwkJCQlmaWVsZEluZGV4Kys7CisJCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihuZXh0RmllbGREZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJbWV0aG9kSW5kZXgrKzsKKwkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKG5leHRNZXRob2REZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLCBjdXJyZW50UGFja2FnZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCW1lbWJlclR5cGVJbmRleCsrOworCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IobmV4dE1lbWJlckRlY2xhcmF0aW9uLCB0cnVlLCBudWxsLCBjdXJyZW50UGFja2FnZSk7CisJCX0KKwl9CisJaWYgKG5vdGlmeVR5cGVQcmVzZW5jZSl7CisJCWlmIChpc0luUmFuZ2UpeworCQkJdGhpcy5yZXF1ZXN0b3IuZXhpdFR5cGUodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJfQorCQl0aGlzLm5lc3RlZFR5cGVJbmRleC0tOworCX0KK30KKy8qCisgKiBTb3J0IHRoZSBnaXZlbiBhc3Qgbm9kZXMgYnkgdGhlaXIgcG9zaXRpb25zLgorICovCitwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChBU1ROb2RlW10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgeworCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKKwlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwlBU1ROb2RlIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdCArICAocmlnaHQgLSBsZWZ0KSAvIDJdOworCWRvIHsKKwkJd2hpbGUgKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0uc291cmNlU3RhcnQgPCBtaWQuc291cmNlU3RhcnQpIHsKKwkJCWxlZnQrKzsKKwkJfQorCQl3aGlsZSAobWlkLnNvdXJjZVN0YXJ0IDwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0uc291cmNlU3RhcnQpIHsKKwkJCXJpZ2h0LS07CisJCX0KKwkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCUFTVE5vZGUgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKKwkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKKwkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOworCQkJbGVmdCsrOworCQkJcmlnaHQtLTsKKwkJfQorCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKKwkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwl9CisJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCX0KK30KK3ByaXZhdGUgdm9pZCByZXNldCgpIHsKKwl0aGlzLnR5cGVOYW1lcyA9IG5ldyBjaGFyWzRdW107CisJdGhpcy5zdXBlclR5cGVOYW1lcyA9IG5ldyBjaGFyWzRdW107CisJdGhpcy5uZXN0ZWRUeXBlSW5kZXggPSAwOworCisJdGhpcy5zb3VyY2VFbmRzID0gbnVsbDsKK30KK3ByaXZhdGUgaW50IHNvdXJjZUVuZChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlKSAhPSAwKSB7CisJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbjsKKwkJaWYgKGFsbG9jYXRpb24uZW51bUNvbnN0YW50ICE9IG51bGwpIC8vIGNhc2Ugb2YgZW51bSBjb25zdGFudCBib2R5CisJCQlyZXR1cm4gYWxsb2NhdGlvbi5lbnVtQ29uc3RhbnQuc291cmNlRW5kOworCQlyZXR1cm4gYWxsb2NhdGlvbi50eXBlLnNvdXJjZUVuZDsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZDsKKwl9Cit9Citwcml2YXRlIHZvaWQgdmlzaXRJZk5lZWRlZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yICE9IG51bGwKKwkJJiYgKG1ldGhvZC5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDApIHsKKwkJCWlmIChtZXRob2QgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CisJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZDsKKwkJCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5jb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgeworCQkJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yQ2FsbC50cmF2ZXJzZSh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCBtZXRob2Quc2NvcGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtZXRob2Quc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBtZXRob2Quc3RhdGVtZW50cy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJCW1ldGhvZC5zdGF0ZW1lbnRzW2ldLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG1ldGhvZC5zY29wZSk7CisJCQl9CisJfQorfQorCitwcml2YXRlIHZvaWQgdmlzaXRJZk5lZWRlZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSkgeworCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yICE9IG51bGwKKwkJJiYgKGZpZWxkLmJpdHMgJiBBU1ROb2RlLkhhc0xvY2FsVHlwZSkgIT0gMCkgeworCQkJaWYgKGZpZWxkLmluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLnB1c2hEZWNsYXJpbmdUeXBlKGRlY2xhcmluZ1R5cGUpOworCQkJCQlmaWVsZC5pbml0aWFsaXphdGlvbi50cmF2ZXJzZSh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoTWV0aG9kU2NvcGUpIG51bGwpOworCQkJCX0gZmluYWxseSB7CisJCQkJCXRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IucG9wRGVjbGFyaW5nVHlwZSgpOworCQkJCX0KKwkJCX0KKwl9Cit9CisKK3ByaXZhdGUgdm9pZCB2aXNpdElmTmVlZGVkKEluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7CisJaWYgKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgIT0gbnVsbAorCQkmJiAoaW5pdGlhbGl6ZXIuYml0cyAmIEFTVE5vZGUuSGFzTG9jYWxUeXBlKSAhPSAwKSB7CisJCQlpZiAoaW5pdGlhbGl6ZXIuYmxvY2sgIT0gbnVsbCkgeworCQkJCWluaXRpYWxpemVyLmJsb2NrLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG51bGwpOworCQkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhCmluZGV4IGI4ZWU4NDUuLmUyNTY1NjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRQYXJzZXIuamF2YQpAQCAtMSwyOCArMSwyOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdFRvSW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ29tbWVudFJlY29yZGVyUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CiAKIC8qKgogICogQSBzb3VyY2UgZWxlbWVudCBwYXJzZXIgZXh0cmFjdHMgc3RydWN0dXJhbCBhbmQgcmVmZXJlbmNlIGluZm9ybWF0aW9uCkBAIC00Myw1MSArNDQsMTggQEAKICAqIEFueSAocGFyc2luZykgcHJvYmxlbSBlbmNvdW50ZXJlZCBpcyBhbHNvIHByb3ZpZGVkLgogICovCiBwdWJsaWMgY2xhc3MgU291cmNlRWxlbWVudFBhcnNlciBleHRlbmRzIENvbW1lbnRSZWNvcmRlclBhcnNlciB7Ci0JCi0JcHVibGljIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvcjsKLQlJU291cmNlVHlwZSBzb3VyY2VUeXBlOworCisJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yOwogCWJvb2xlYW4gcmVwb3J0UmVmZXJlbmNlSW5mbzsKLQljaGFyW11bXSB0eXBlTmFtZXM7Ci0JY2hhcltdW10gc3VwZXJUeXBlTmFtZXM7Ci0JaW50IG5lc3RlZFR5cGVJbmRleDsKLQlMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBsb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG51bGw7Ci0JQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CisJYm9vbGVhbiByZXBvcnRMb2NhbERlY2xhcmF0aW9uczsKIAlIYXNodGFibGVPZk9iamVjdFRvSW50IHNvdXJjZUVuZHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCgpOwogCUhhc2hNYXAgbm9kZXNUb0NhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOyAvLyBhIG1hcCBmcm9tIEFTVE5vZGUgdG8gY2hhcltdW10KIAlib29sZWFuIHVzZVNvdXJjZUphdmFkb2NQYXJzZXIgPSB0cnVlOwotCQotLyoqCi0gKiBBbiBhc3QgdmlzaXRvciB0aGF0IHZpc2l0cyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsRGVjbGFyYXRpb25WaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JQXJyYXlMaXN0IGRlY2xhcmluZ1R5cGVzOwotCXB1YmxpYyB2b2lkIHB1c2hEZWNsYXJpbmdUeXBlKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKSB7Ci0JCWlmICh0aGlzLmRlY2xhcmluZ1R5cGVzID09IG51bGwpIHsKLQkJCXRoaXMuZGVjbGFyaW5nVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJdGhpcy5kZWNsYXJpbmdUeXBlcy5hZGQoZGVjbGFyaW5nVHlwZSk7Ci0JfQotCXB1YmxpYyB2b2lkIHBvcERlY2xhcmluZ1R5cGUoKSB7Ci0JCXRoaXMuZGVjbGFyaW5nVHlwZXMucmVtb3ZlKHRoaXMuZGVjbGFyaW5nVHlwZXMuc2l6ZSgpLTEpOwotCX0KLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHBlZWtEZWNsYXJpbmdUeXBlKCkgewotCQlpZiAodGhpcy5kZWNsYXJpbmdUeXBlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJaW50IHNpemUgPSB0aGlzLmRlY2xhcmluZ1R5cGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmRlY2xhcmluZ1R5cGVzLmdldChzaXplLTEpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IodHlwZURlY2xhcmF0aW9uLCBzb3VyY2VUeXBlID09IG51bGwsIHBlZWtEZWNsYXJpbmdUeXBlKCkpOwotCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvciguLi4pCi0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKLQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3Rvcih0eXBlRGVjbGFyYXRpb24sIHNvdXJjZVR5cGUgPT0gbnVsbCwgcGVla0RlY2xhcmluZ1R5cGUoKSk7Ci0JCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgbWVtYmVycyBhcyB0aGlzIHdhcyBkb25lIGR1cmluZyBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKC4uLikKLQl9CQotfQorCisJU291cmNlRWxlbWVudE5vdGlmaWVyIG5vdGlmaWVyOwogCiBwdWJsaWMgU291cmNlRWxlbWVudFBhcnNlcigKLQkJZmluYWwgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCAKKwkJZmluYWwgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLAogCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksCiAJCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogCQlib29sZWFuIHJlcG9ydExvY2FsRGVjbGFyYXRpb25zLApAQCAtOTYsMjUgKzY0LDI3IEBACiB9CiAKIHB1YmxpYyBTb3VyY2VFbGVtZW50UGFyc2VyKAotCQlJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsIAorCQlJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsCiAJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKIAkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAJCWJvb2xlYW4gcmVwb3J0TG9jYWxEZWNsYXJhdGlvbnMsCiAJCWJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscywKIAkJYm9vbGVhbiB1c2VTb3VyY2VKYXZhZG9jUGFyc2VyKSB7Ci0JCisKIAlzdXBlcigKIAkJbmV3IFByb2JsZW1SZXBvcnRlcigKIAkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKSwKLQkJCW9wdGlvbnMsIAorCQkJb3B0aW9ucywKIAkJCXByb2JsZW1GYWN0b3J5KSwKIAkJb3B0aW1pemVTdHJpbmdMaXRlcmFscyk7Ci0JCisKKwl0aGlzLnJlcG9ydExvY2FsRGVjbGFyYXRpb25zID0gcmVwb3J0TG9jYWxEZWNsYXJhdGlvbnM7CisKIAkvLyB3ZSB3YW50IHRvIG5vdGlmeSBhbGwgc3ludGF4IGVycm9yIHdpdGggdGhlIGFjY2VwdFByb2JsZW0gQVBJCiAJLy8gVG8gZG8gc28sIHdlIGRlZmluZSB0aGUgcmVjb3JkIG1ldGhvZCBvZiB0aGUgUHJvYmxlbVJlcG9ydGVyCiAJdGhpcy5wcm9ibGVtUmVwb3J0ZXIgPSBuZXcgUHJvYmxlbVJlcG9ydGVyKAogCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksCi0JCW9wdGlvbnMsIAorCQlvcHRpb25zLAogCQlwcm9ibGVtRmFjdG9yeSkgewogCQlwdWJsaWMgdm9pZCByZWNvcmQoQ2F0ZWdvcml6ZWRQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQsIFJlZmVyZW5jZUNvbnRleHQgY29udGV4dCkgewogCQkJdW5pdFJlc3VsdC5yZWNvcmQocHJvYmxlbSwgY29udGV4dCk7IC8vIFRPRE8gKGplcm9tZSkgY2xpZW50cyBhcmUgdHJhcHBpbmcgcHJvYmxlbXMgZWl0aGVyIHRocm91Z2ggZmFjdG9yeSBvciByZXF1ZXN0b3IuLi4gaXMgcmVzdWx0IHN0b3JpbmcgbmVlZGVkPwpAQCAtMTIyLDEzICs5MiwxMCBAQAogCQl9CiAJfTsKIAl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQl0eXBlTmFtZXMgPSBuZXcgY2hhcls0XVtdOwotCXN1cGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbNF1bXTsKLQluZXN0ZWRUeXBlSW5kZXggPSAwOwogCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0JaWYgKHJlcG9ydExvY2FsRGVjbGFyYXRpb25zKSB7Ci0JCXRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IoKTsKLQl9CisKKwl0aGlzLm5vdGlmaWVyID0gbmV3IFNvdXJjZUVsZW1lbnROb3RpZmllcih0aGlzLnJlcXVlc3RvciwgcmVwb3J0TG9jYWxEZWNsYXJhdGlvbnMpOworCiAJLy8gc2V0IHNwZWNpZmljIGphdmFkb2MgcGFyc2VyCiAJdGhpcy51c2VTb3VyY2VKYXZhZG9jUGFyc2VyID0gdXNlU291cmNlSmF2YWRvY1BhcnNlcjsKIAlpZiAodXNlU291cmNlSmF2YWRvY1BhcnNlcikgewpAQCAtMTUyLDEwICsxMTksMTAgQEAKIAkvLyB0byByZXBvcnQgYSB0eXBlIHJlZmVyZW5jZSBpbiB0aGUgU291cmNlRWxlbWVudFBhcnNlci4KIAkvLyBUaGlzIGdhaW5lZCAzLjclIGluIHRoZSBpbmRleGluZyBwZXJmb3JtYW5jZSB0ZXN0LgogCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgewotCQlyZXF1ZXN0b3IuYWNjZXB0VW5rbm93blJlZmVyZW5jZSgoKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG5hbWVSZWYpLnRva2VuLCBuYW1lUmVmLnNvdXJjZVN0YXJ0KTsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VW5rbm93blJlZmVyZW5jZSgoKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG5hbWVSZWYpLnRva2VuLCBuYW1lUmVmLnNvdXJjZVN0YXJ0KTsKIAl9IGVsc2UgewogCQkvL1F1YWxpZmllZE5hbWVSZWZlcmVuY2UKLQkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBuYW1lUmVmKS50b2tlbnMsIG5hbWVSZWYuc291cmNlU3RhcnQsIG5hbWVSZWYuc291cmNlRW5kKTsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VW5rbm93blJlZmVyZW5jZSgoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIG5hbWVSZWYpLnRva2VucywgbmFtZVJlZi5zb3VyY2VTdGFydCwgbmFtZVJlZi5zb3VyY2VFbmQpOwogCX0KIH0KIHB1YmxpYyB2b2lkIGNoZWNrQ29tbWVudCgpIHsKQEAgLTE2MywyOCArMTMwLDM4IEBACiAJaWYgKCEodGhpcy5kaWV0ICYmIHRoaXMuZGlldEludD09MCkgJiYgdGhpcy5zY2FubmVyLmNvbW1lbnRQdHIgPj0gMCkgewogCQlmbHVzaENvbW1lbnRzRGVmaW5lZFByaW9yVG8odGhpcy5lbmRTdGF0ZW1lbnRQb3NpdGlvbik7CiAJfQotCQorCiAJaW50IGxhc3RDb21tZW50ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7Ci0JCisKIAlpZiAodGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwKSB7CiAJCS8vIGVsaW1pbmF0ZSBjb21tZW50cyBsb2NhdGVkIGFmdGVyIG1vZGlmaWVyU291cmNlU3RhcnQgaWYgcG9zaXRpb25uZWQKLQkJd2hpbGUgKGxhc3RDb21tZW50ID49IDAgJiYgTWF0aC5hYnModGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdENvbW1lbnRdKSA+IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpIGxhc3RDb21tZW50LS07CisJCXdoaWxlIChsYXN0Q29tbWVudCA+PSAwKSB7CisJCQlpbnQgY29tbWVudFNvdXJjZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdENvbW1lbnRdOworCQkJaWYgKGNvbW1lbnRTb3VyY2VTdGFydCA8IDApIGNvbW1lbnRTb3VyY2VTdGFydCA9IC1jb21tZW50U291cmNlU3RhcnQ7CisJCQlpZiAoY29tbWVudFNvdXJjZVN0YXJ0IDw9IHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQpIGJyZWFrOworCQkJbGFzdENvbW1lbnQtLTsKKwkJfQogCX0KIAlpZiAobGFzdENvbW1lbnQgPj0gMCkgewogCQkvLyBjb25zaWRlciBhbGwgcmVtYWluaW5nIGxlYWRpbmcgY29tbWVudHMgdG8gYmUgcGFydCBvZiBjdXJyZW50IGRlY2xhcmF0aW9uCi0JCXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPSBNYXRoLmFicyh0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1swXSk7IAotCQotCQkvLyBjaGVjayBkZXByZWNhdGlvbiBpbiBsYXN0IGNvbW1lbnQgaWYgamF2YWRvYyAoY2FuIGJlIGZvbGxvd2VkIGJ5IG5vbi1qYXZhZG9jIGNvbW1lbnRzIHdoaWNoIGFyZSBzaW1wbHkgaWdub3JlZCkJCisJCXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1swXTsKKwkJaWYgKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPCAwKSB0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gLXRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQ7CisKKwkJLy8gY2hlY2sgZGVwcmVjYXRpb24gaW4gbGFzdCBjb21tZW50IGlmIGphdmFkb2MgKGNhbiBiZSBmb2xsb3dlZCBieSBub24tamF2YWRvYyBjb21tZW50cyB3aGljaCBhcmUgc2ltcGx5IGlnbm9yZWQpCiAJCXdoaWxlIChsYXN0Q29tbWVudCA+PSAwICYmIHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdENvbW1lbnRdIDwgMCkgbGFzdENvbW1lbnQtLTsgLy8gbm9uIGphdmFkb2MgY29tbWVudCBoYXZlIG5lZ2F0aXZlIGVuZCBwb3NpdGlvbnMKIAkJaWYgKGxhc3RDb21tZW50ID49IDAgJiYgdGhpcy5qYXZhZG9jUGFyc2VyICE9IG51bGwpIHsKLQkJCWludCBjb21tZW50RW5kID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wc1tsYXN0Q29tbWVudF0gLSAxOyAvL3N0b3AgaXMgb25lIG92ZXIsCisJCQlpbnQgY29tbWVudEVuZCA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdENvbW1lbnRdIC0gMTsgLy9zdG9wIGlzIG9uZSBvdmVyCiAJCQkvLyBkbyBub3QgcmVwb3J0IHByb2JsZW0gYmVmb3JlIGxhc3QgcGFyc2VkIGNvbW1lbnQgd2hpbGUgcmVjb3ZlcmluZyBjb2RlLi4uCi0JCQl0aGlzLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSB0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwgfHwgY29tbWVudEVuZCA+IHRoaXMubGFzdEphdmFkb2NFbmQ7CisJCQlpZiAodGhpcy5qYXZhZG9jUGFyc2VyLnNob3VsZFJlcG9ydFByb2JsZW1zKSB7CisJCQkJdGhpcy5qYXZhZG9jUGFyc2VyLnJlcG9ydFByb2JsZW1zID0gdGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsIHx8IGNvbW1lbnRFbmQgPiB0aGlzLmxhc3RKYXZhZG9jRW5kOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSBmYWxzZTsKKwkJCX0KIAkJCWlmICh0aGlzLmphdmFkb2NQYXJzZXIuY2hlY2tEZXByZWNhdGlvbihsYXN0Q29tbWVudCkpIHsKIAkJCQljaGVja0FuZFNldE1vZGlmaWVycyhDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7CiAJCQl9CiAJCQl0aGlzLmphdmFkb2MgPSB0aGlzLmphdmFkb2NQYXJzZXIuZG9jQ29tbWVudDsJLy8gbnVsbCBpZiBjaGVjayBqYXZhZG9jIGlzIG5vdCBhY3RpdmF0ZWQKLQkJCWlmIChjdXJyZW50RWxlbWVudCA9PSBudWxsKSB0aGlzLmxhc3RKYXZhZG9jRW5kID0gY29tbWVudEVuZDsKKwkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwpIHRoaXMubGFzdEphdmFkb2NFbmQgPSBjb21tZW50RW5kOwogCQl9CiAJfQogCkBAIC0yNDEsNTEgKzIxOCw0MSBAQAogfQogcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7CiAKLQlib29sZWFuIHByZXZpb3VzRmxhZyA9IHJlcG9ydFJlZmVyZW5jZUluZm87Ci0JcmVwb3J0UmVmZXJlbmNlSW5mbyA9IGZhbHNlOyAvLyBub3QgdG8gc2VlIHRoZSB0eXBlIHJlZmVyZW5jZSByZXBvcnRlZCBpbiBzdXBlciBjYWxsIHRvIGdldFR5cGVSZWZlcmVuY2UoLi4uKQorCWJvb2xlYW4gcHJldmlvdXNGbGFnID0gdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvOworCXRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbyA9IGZhbHNlOyAvLyBub3QgdG8gc2VlIHRoZSB0eXBlIHJlZmVyZW5jZSByZXBvcnRlZCBpbiBzdXBlciBjYWxsIHRvIGdldFR5cGVSZWZlcmVuY2UoLi4uKQogCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihhbHdheXNRdWFsaWZpZWQpOwotCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBwcmV2aW91c0ZsYWc7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pewotCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvID0gcHJldmlvdXNGbGFnOworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8peworCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbil0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwogCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBhbGxvYy50eXBlOwotCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCi0JCQl0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSAKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCisJCQl0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZQogCQkJCT8gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlUmVmKS50b2tlbgogCQkJCTogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFsbG9jLnR5cGUuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyksCi0JCQlhbGxvYy5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBhbGxvYy5hcmd1bWVudHMubGVuZ3RoLCAKKwkJCWFsbG9jLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jLmFyZ3VtZW50cy5sZW5ndGgsCiAJCQlhbGxvYy5zb3VyY2VTdGFydCk7CiAJfQogfQotcHJpdmF0ZSBsb25nW10gY29sbGVjdEFubm90YXRpb25Qb3NpdGlvbnMoQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7Ci0JaWYgKGFubm90YXRpb25zID09IG51bGwpIHJldHVybiBudWxsOwotCWludCBsZW5ndGggPSBhbm5vdGF0aW9ucy5sZW5ndGg7Ci0JbG9uZ1tdIHJlc3VsdCA9IG5ldyBsb25nW2xlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKLQkJcmVzdWx0W2ldID0gKCgobG9uZykgYW5ub3RhdGlvbi5zb3VyY2VTdGFydCkgPDwgMzIpICsgYW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVBbm5vdGF0aW9uQXNNb2RpZmllcigpIHsKIAlzdXBlci5jb25zdW1lQW5ub3RhdGlvbkFzTW9kaWZpZXIoKTsKLQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsgLy8gYWNjZXB0IGFubm90YXRpb24gdHlwZSByZWZlcmVuY2UKLQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShhbm5vdGF0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKSwgYW5ub3RhdGlvbi5zb3VyY2VTdGFydCwgYW5ub3RhdGlvbi5zb3VyY2VFbmQpOworCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeyAvLyBhY2NlcHQgYW5ub3RhdGlvbiB0eXBlIHJlZmVyZW5jZQorCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShhbm5vdGF0aW9uLnR5cGUuZ2V0VHlwZU5hbWUoKSwgYW5ub3RhdGlvbi5zb3VyY2VTdGFydCwgYW5ub3RhdGlvbi5zb3VyY2VFbmQpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkV2l0aFR5cGVBcmd1bWVudHMoKSB7Ci0JYm9vbGVhbiBwcmV2aW91c0ZsYWcgPSByZXBvcnRSZWZlcmVuY2VJbmZvOwotCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBmYWxzZTsgLy8gbm90IHRvIHNlZSB0aGUgdHlwZSByZWZlcmVuY2UgcmVwb3J0ZWQgaW4gc3VwZXIgY2FsbCB0byBnZXRUeXBlUmVmZXJlbmNlKC4uLikKKwlib29sZWFuIHByZXZpb3VzRmxhZyA9IHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbzsKKwl0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8gPSBmYWxzZTsgLy8gbm90IHRvIHNlZSB0aGUgdHlwZSByZWZlcmVuY2UgcmVwb3J0ZWQgaW4gc3VwZXIgY2FsbCB0byBnZXRUeXBlUmVmZXJlbmNlKC4uLikKIAlzdXBlci5jb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZFdpdGhUeXBlQXJndW1lbnRzKCk7Ci0JcmVwb3J0UmVmZXJlbmNlSW5mbyA9IHByZXZpb3VzRmxhZzsKLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbyl7Ci0JCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEFsbG9jYXRpb25FeHByZXNzaW9uKWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwl0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8gPSBwcmV2aW91c0ZsYWc7CisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbyl7CisJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEFsbG9jYXRpb25FeHByZXNzaW9uKXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IGFsbG9jLnR5cGU7Ci0JCXJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKLQkJCXR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlIAorCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKKwkJCXR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlCiAJCQkJPyAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGVSZWYpLnRva2VuCiAJCQkJOiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoYWxsb2MudHlwZS5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKSwKLQkJCWFsbG9jLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jLmFyZ3VtZW50cy5sZW5ndGgsIAorCQkJYWxsb2MuYXJndW1lbnRzID09IG51bGwgPyAwIDogYWxsb2MuYXJndW1lbnRzLmxlbmd0aCwKIAkJCWFsbG9jLnNvdXJjZVN0YXJ0KTsKIAl9CiB9CkBAIC0yOTUsNiArMjYyLDIxIEBACiAJaWYgKHRoaXMuYXN0UHRyID4gY3VycmVudEFzdFB0cikgLy8gaWYgYXN0IG5vZGUgd2FzIHB1c2hlZCBvbiB0aGUgYXN0IHN0YWNrCiAJCXJlbWVtYmVyQ2F0ZWdvcmllcygpOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworCWludCBjdXJyZW50QXN0UHRyID0gdGhpcy5hc3RQdHI7CisJc3VwZXIuY29uc3VtZUFubm90YXRpb25UeXBlRGVjbGFyYXRpb25IZWFkZXJOYW1lV2l0aFR5cGVQYXJhbWV0ZXJzKCk7CisJaWYgKHRoaXMuYXN0UHRyID4gY3VycmVudEFzdFB0cikgLy8gaWYgYXN0IG5vZGUgd2FzIHB1c2hlZCBvbiB0aGUgYXN0IHN0YWNrCisJCXJlbWVtYmVyQ2F0ZWdvcmllcygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhdGNoRm9ybWFsUGFyYW1ldGVyKCkgeworCXN1cGVyLmNvbnN1bWVDYXRjaEZvcm1hbFBhcmFtZXRlcigpOworCisJLy8gRmx1c2ggY29tbWVudHMgcHJpb3IgdG8gdGhpcyBmb3JtYWwgcGFyYW1ldGVyIHNvIHRoZSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyCisJLy8gaXMgY29ycmVjdGx5IHNldCAoc2VlIGJ1ZyA4MDkwNCkKKwkvLyBOb3RlIHRoYXQgdGhpcyBjb3VsZCBiZSBkb25lIGluIHRoZSBQYXJzZXIgaXRzZWxmLCBidXQgdGhpcyB3b3VsZCBzbG93IGRvd24gYWxsIHBhcnNlcnMsIHdoZW4gdGhleSBkb24ndCBuZWVkCisJLy8gdGhlIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgdG8gYmUgc2V0CisJZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSGVhZGVyTmFtZTEoKSB7CiAJaW50IGN1cnJlbnRBc3RQdHIgPSB0aGlzLmFzdFB0cjsKIAlzdXBlci5jb25zdW1lQ2xhc3NIZWFkZXJOYW1lMSgpOwpAQCAtMzAyLDE4ICsyODQsMTggQEAKIAkJcmVtZW1iZXJDYXRlZ29yaWVzKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKCkgewotCWJvb2xlYW4gcHJldmlvdXNGbGFnID0gcmVwb3J0UmVmZXJlbmNlSW5mbzsKLQlyZXBvcnRSZWZlcmVuY2VJbmZvID0gZmFsc2U7IC8vIG5vdCB0byBzZWUgdGhlIHR5cGUgcmVmZXJlbmNlIHJlcG9ydGVkIGluIHN1cGVyIGNhbGwgdG8gZ2V0VHlwZVJlZmVyZW5jZSguLi4pCisJYm9vbGVhbiBwcmV2aW91c0ZsYWcgPSB0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm87CisJdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvID0gZmFsc2U7IC8vIG5vdCB0byBzZWUgdGhlIHR5cGUgcmVmZXJlbmNlIHJlcG9ydGVkIGluIHN1cGVyIGNhbGwgdG8gZ2V0VHlwZVJlZmVyZW5jZSguLi4pCiAJc3VwZXIuY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpOwotCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBwcmV2aW91c0ZsYWc7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pewotCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvID0gcHJldmlvdXNGbGFnOworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8peworCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbil0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwogCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBhbGxvYy50eXBlOwotCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCi0JCQl0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSAKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCisJCQl0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZQogCQkJCT8gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlUmVmKS50b2tlbgogCQkJCTogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFsbG9jLnR5cGUuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyksCi0JCQlhbGxvYy5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBhbGxvYy5hcmd1bWVudHMubGVuZ3RoLCAKKwkJCWFsbG9jLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jLmFyZ3VtZW50cy5sZW5ndGgsCiAJCQlhbGxvYy5zb3VyY2VTdGFydCk7CiAJfQogfQpAQCAtMzM5LDE1ICszMjEsMTUgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnVtQ29uc3RhbnRXaXRoQ2xhc3NCb2R5KCkgewogCXN1cGVyLmNvbnN1bWVFbnVtQ29uc3RhbnRXaXRoQ2xhc3NCb2R5KCk7Ci0JaWYgKChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikKLQkJCSYmIGFzdFN0YWNrW2FzdFB0cl0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJaWYgKCh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVDT01NQSB8fCB0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pCisJCQkmJiB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKIAkJdGhpcy5zb3VyY2VFbmRzLnB1dCh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwogCQlyZW1lbWJlckNhdGVnb3JpZXMoKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUNvbnN0YW50Tm9DbGFzc0JvZHkoKSB7CiAJc3VwZXIuY29uc3VtZUVudW1Db25zdGFudE5vQ2xhc3NCb2R5KCk7Ci0JaWYgKChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikKKwlpZiAoKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUNPTU1BIHx8IHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikKIAkJCSYmIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewogCQl0aGlzLnNvdXJjZUVuZHMucHV0KHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CiAJCXJlbWVtYmVyQ2F0ZWdvcmllcygpOwpAQCAtMzU5LDEyICszNDEsMTggQEAKIAlpZiAodGhpcy5hc3RQdHIgPiBjdXJyZW50QXN0UHRyKSAvLyBpZiBhc3Qgbm9kZSB3YXMgcHVzaGVkIG9uIHRoZSBhc3Qgc3RhY2sKIAkJcmVtZW1iZXJDYXRlZ29yaWVzKCk7CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisJaW50IGN1cnJlbnRBc3RQdHIgPSB0aGlzLmFzdFB0cjsKKwlzdXBlci5jb25zdW1lRW51bUhlYWRlck5hbWVXaXRoVHlwZVBhcmFtZXRlcnMoKTsKKwlpZiAodGhpcy5hc3RQdHIgPiBjdXJyZW50QXN0UHRyKSAvLyBpZiBhc3Qgbm9kZSB3YXMgcHVzaGVkIG9uIHRoZSBhc3Qgc3RhY2sKKwkJcmVtZW1iZXJDYXRlZ29yaWVzKCk7Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCkgewogCS8vIEV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CiAJLy8gdGhlIHNjYW5uZXIgaXMgbG9jYXRlZCBhZnRlciB0aGUgY29tbWEgb3IgdGhlIHNlbWktY29sb24uCiAJLy8gd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBjb21tYSBvciB0aGUgc2VtaS1jb2xvbgogCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsKLQlpZiAoKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVDT01NQSB8fCBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQorCWlmICgodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lQ09NTUEgfHwgdGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQogCQkJJiYgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CiAJCXRoaXMuc291cmNlRW5kcy5wdXQodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIAkJcmVtZW1iZXJDYXRlZ29yaWVzKCk7CkBAIC0zNzQsOCArMzYyLDggQEAKIAkvLyBFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24gOjo9ICRlbXB0eQogCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAogCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsKLQlpZiAoKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVDT01NQSB8fCBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQotCQkJJiYgYXN0U3RhY2tbYXN0UHRyXSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwlpZiAoKHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUNPTU1BIHx8IHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTikKKwkJCSYmIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewogCQl0aGlzLnNvdXJjZUVuZHMucHV0KHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CiAJCXJlbWVtYmVyQ2F0ZWdvcmllcygpOwogCX0KQEAgLTM4OCwxNyArMzc2LDE3IEBACiAJLy8gRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJwogCS8vIEZpZWxkQWNjZXNzIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicKIAlzdXBlci5jb25zdW1lRmllbGRBY2Nlc3MoaXNTdXBlckFjY2Vzcyk7Ci0JRmllbGRSZWZlcmVuY2UgZnIgPSAoRmllbGRSZWZlcmVuY2UpIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQlyZXF1ZXN0b3IuYWNjZXB0RmllbGRSZWZlcmVuY2UoZnIudG9rZW4sIGZyLnNvdXJjZVN0YXJ0KTsKKwlGaWVsZFJlZmVyZW5jZSBmciA9IChGaWVsZFJlZmVyZW5jZSkgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEZpZWxkUmVmZXJlbmNlKGZyLnRva2VuLCBmci5zb3VyY2VTdGFydCk7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcm1hbFBhcmFtZXRlcihib29sZWFuIGlzVmFyQXJncykgewogCXN1cGVyLmNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoaXNWYXJBcmdzKTsKLQkKKwogCS8vIEZsdXNoIGNvbW1lbnRzIHByaW9yIHRvIHRoaXMgZm9ybWFsIHBhcmFtZXRlciBzbyB0aGUgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcgogCS8vIGlzIGNvcnJlY3RseSBzZXQgKHNlZSBidWcgODA5MDQpCi0JLy8gTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgZG9uZSBpbiB0aGUgUGFyc2VyIGl0c2VsZiwgYnV0IHRoaXMgd291bGQgc2xvdyBkb3duIGFsbCBwYXJzZXJzLCB3aGVuIHRoZXkgZG9uJ3QgbmVlZCAKKwkvLyBOb3RlIHRoYXQgdGhpcyBjb3VsZCBiZSBkb25lIGluIHRoZSBQYXJzZXIgaXRzZWxmLCBidXQgdGhpcyB3b3VsZCBzbG93IGRvd24gYWxsIHBhcnNlcnMsIHdoZW4gdGhleSBkb24ndCBuZWVkCiAJLy8gdGhlIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgdG8gYmUgc2V0CiAJZmx1c2hDb21tZW50c0RlZmluZWRQcmlvclRvKHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pOwogfQpAQCAtNDExLDE1ICszOTksMTUgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZW1iZXJWYWx1ZVBhaXIoKSB7CiAJc3VwZXIuY29uc3VtZU1lbWJlclZhbHVlUGFpcigpOwogCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZXBhaXIgPSAoTWVtYmVyVmFsdWVQYWlyKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kUmVmZXJlbmNlKG1lbWJlclZhbHVlcGFpci5uYW1lLCAwLCBtZW1iZXJWYWx1ZXBhaXIuc291cmNlU3RhcnQpOworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TWV0aG9kUmVmZXJlbmNlKG1lbWJlclZhbHVlcGFpci5uYW1lLCAwLCBtZW1iZXJWYWx1ZXBhaXIuc291cmNlU3RhcnQpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCkgewogCXN1cGVyLmNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwotCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7IC8vIGFjY2VwdCBhbm5vdGF0aW9uIHR5cGUgcmVmZXJlbmNlCi0JCXRoaXMucmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UoYW5ub3RhdGlvbi50eXBlLmdldFR5cGVOYW1lKCksIGFubm90YXRpb24uc291cmNlU3RhcnQsIGFubm90YXRpb24uc291cmNlRW5kKTsKKwlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbil0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsgLy8gYWNjZXB0IGFubm90YXRpb24gdHlwZSByZWZlcmVuY2UKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0QW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoYW5ub3RhdGlvbi50eXBlLmdldFR5cGVOYW1lKCksIGFubm90YXRpb24uc291cmNlU3RhcnQsIGFubm90YXRpb24uc291cmNlRW5kKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZShib29sZWFuIGlzQW5ub3RhdGlvbk1ldGhvZCkgewpAQCAtNDUxLDEyICs0MzksMTIgQEAKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsKIAogCS8vIHdoZW4gdGhlIG5hbWUgaXMgb25seSBhbiBpZGVudGlmaWVyLi4ud2UgaGF2ZSBhIG1lc3NhZ2Ugc2VuZCB0byAidGhpcyIgKGltcGxpY2l0KQotCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJRXhwcmVzc2lvbltdIGFyZ3MgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKLQkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLCAKLQkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwgCisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKKwkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwKIAkJCShpbnQpKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpKTsKIAl9CiB9CkBAIC00NjUsMTIgKzQ1MywxMiBAQAogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZVdpdGhUeXBlQXJndW1lbnRzKCk7CiAKIAkvLyB3aGVuIHRoZSBuYW1lIGlzIG9ubHkgYW4gaWRlbnRpZmllci4uLndlIGhhdmUgYSBtZXNzYWdlIHNlbmQgdG8gInRoaXMiIChpbXBsaWNpdCkKLQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOwogCUV4cHJlc3Npb25bXSBhcmdzID0gbWVzc2FnZVNlbmQuYXJndW1lbnRzOwotCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7Ci0JCXJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCi0JCQltZXNzYWdlU2VuZC5zZWxlY3RvciwgCi0JCQlhcmdzID09IG51bGwgPyAwIDogYXJncy5sZW5ndGgsIAorCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0TWV0aG9kUmVmZXJlbmNlKAorCQkJbWVzc2FnZVNlbmQuc2VsZWN0b3IsCisJCQlhcmdzID09IG51bGwgPyAwIDogYXJncy5sZW5ndGgsCiAJCQkoaW50KShtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSk7CiAJfQogfQpAQCAtNDgwLDEyICs0NjgsMTIgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOwotCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJRXhwcmVzc2lvbltdIGFyZ3MgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKLQkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLCAKLQkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwgCisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKKwkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwKIAkJCShpbnQpKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpKTsKIAl9CiB9CkBAIC00OTUsMTIgKzQ4MywxMiBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnlXaXRoVHlwZUFyZ3VtZW50cygpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnlXaXRoVHlwZUFyZ3VtZW50cygpOwotCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJRXhwcmVzc2lvbltdIGFyZ3MgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKLQkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLCAKLQkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwgCisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKKwkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwKIAkJCShpbnQpKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpKTsKIAl9CiB9CkBAIC01MTEsMzkgKzQ5OSwzOSBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsKIAkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7Ci0JTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKIAlFeHByZXNzaW9uW10gYXJncyA9IG1lc3NhZ2VTZW5kLmFyZ3VtZW50czsKLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kUmVmZXJlbmNlKAotCQkJbWVzc2FnZVNlbmQuc2VsZWN0b3IsIAotCQkJYXJncyA9PSBudWxsID8gMCA6IGFyZ3MubGVuZ3RoLCAKKwlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKKwkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLAorCQkJYXJncyA9PSBudWxsID8gMCA6IGFyZ3MubGVuZ3RoLAogCQkJKGludCkobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMikpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXJXaXRoVHlwZUFyZ3VtZW50cygpIHsKIAkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcuJyBUeXBlQXJndW1lbnRzICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJwogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXJXaXRoVHlwZUFyZ3VtZW50cygpOwotCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CiAJRXhwcmVzc2lvbltdIGFyZ3MgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKLQkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLCAKLQkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwgCisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKKwkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwKIAkJCShpbnQpKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpIHsKIAlzdXBlci5jb25zdW1lTm9ybWFsQW5ub3RhdGlvbigpOwotCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgeyAvLyBhY2NlcHQgYW5ub3RhdGlvbiB0eXBlIHJlZmVyZW5jZQotCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKGFubm90YXRpb24udHlwZS5nZXRUeXBlTmFtZSgpLCBhbm5vdGF0aW9uLnNvdXJjZVN0YXJ0LCBhbm5vdGF0aW9uLnNvdXJjZUVuZCk7CisJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7IC8vIGFjY2VwdCBhbm5vdGF0aW9uIHR5cGUgcmVmZXJlbmNlCisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGFubm90YXRpb24udHlwZS5nZXRUeXBlTmFtZSgpLCBhbm5vdGF0aW9uLnNvdXJjZVN0YXJ0LCBhbm5vdGF0aW9uLnNvdXJjZUVuZCk7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSB7CiAJc3VwZXIuY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG1lbWJlciA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZShUeXBlQ29uc3RhbnRzLlZBTFVFLCAwLCBtZW1iZXIuc291cmNlU3RhcnQpOworCVNpbmdsZU1lbWJlckFubm90YXRpb24gbWVtYmVyID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoVHlwZUNvbnN0YW50cy5WQUxVRSwgMCwgbWVtYmVyLnNvdXJjZVN0YXJ0KTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb25OYW1lKCkgewpAQCAtNTU2LDEwICs1NDQsMTAgQEAKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCBwb3NpdGlvbnMsIDAsIGxlbmd0aCk7CiAJcHVzaE9uQXN0U3RhY2soaW1wdCA9IG5ld0ltcG9ydFJlZmVyZW5jZSh0b2tlbnMsIHBvc2l0aW9ucywgZmFsc2UsIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpKTsKLQkKKwogCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7CiAJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IC0xOyAvLyA8LS0gc2VlIGNvbW1lbnQgaW50byBtb2RpZmllcnNGbGFnKGludCkKLQkKKwogCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewogCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKQEAgLTU2OCwyMiArNTU2LDIyIEBACiAJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiAJLy90aGlzLmVuZFBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSA7CiAJaW1wdC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKLQkKKwogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCiAJCQl0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81ICYmCiAJCQl0aGlzLmxhc3RFcnJvckVuZFBvc2l0aW9uQmVmb3JlUmVjb3ZlcnkgPCB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7CiAJCWltcHQubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7IC8vIGNvbnZlcnQgdGhlIHN0YXRpYyBpbXBvcnQgcmVmZXJlbmNlIHRvIGEgbm9uLXN0YXRpYyBpbXBvcnRlIHJlZmVyZW5jZQotCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mU3RhdGljSW1wb3J0cyhpbXB0KTsKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFVzYWdlT2ZTdGF0aWNJbXBvcnRzKGltcHQpOwogCX0KLQkKKwogCS8vIHJlY292ZXJ5CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChpbXB0LCAwKTsKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgogCX0KLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgeworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKIAkJLy8gTmFtZSBmb3Igc3RhdGljIGltcG9ydCBpcyBUeXBlTmFtZSAnLicgSWRlbnRpZmllcgogCQkvLyA9PiBhY2NlcHQgdW5rbm93biByZWYgb24gaWRlbnRpZmllcgogCQlpbnQgdG9rZW5zTGVuZ3RoID0gaW1wdC50b2tlbnMubGVuZ3RoLTE7CkBAIC01OTEsMjIgKzU3OSwyMiBAQAogCQljaGFyW10gbGFzdCA9IGltcHQudG9rZW5zW3Rva2Vuc0xlbmd0aF07CiAJCS8vIGFjY2VwdCBhbGwgcG9zc2libGUga2luZCBmb3IgbGFzdCBuYW1lLCBpbmRleCB1c2VycyB3aWxsIGhhdmUgdG8gc2VsZWN0IHRoZSByaWdodCBvbmUuLi4KIAkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY5MDEKLQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkUmVmZXJlbmNlKGxhc3QsIHN0YXJ0KTsKLQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZShsYXN0LCAwLHN0YXJ0KTsKLQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UobGFzdCwgc3RhcnQpOworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRGaWVsZFJlZmVyZW5jZShsYXN0LCBzdGFydCk7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZShsYXN0LCAwLHN0YXJ0KTsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShsYXN0LCBzdGFydCk7CiAJCS8vIGFjY2VwdCB0eXBlIG5hbWUKIAkJaWYgKHRva2Vuc0xlbmd0aCA+IDApIHsKIAkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW3Rva2Vuc0xlbmd0aF1bXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoaW1wdC50b2tlbnMsIDAsIGNvbXBvdW5kTmFtZSwgMCwgdG9rZW5zTGVuZ3RoKTsKIAkJCWludCBlbmQgPSAoaW50KSBpbXB0LnNvdXJjZVBvc2l0aW9uc1t0b2tlbnNMZW5ndGgtMV07Ci0JCQlyZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShjb21wb3VuZE5hbWUsIGltcHQuc291cmNlU3RhcnQsIGVuZCk7CisJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZSwgaW1wdC5zb3VyY2VTdGFydCwgZW5kKTsKIAkJfQogCX0KIH0KIAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CiAJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZQotCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlJbXBvcnRSZWZlcmVuY2UgaW1wdDsKQEAgLTYxNyw3ICs2MDUsNyBAQAogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKIAlwdXNoT25Bc3RTdGFjayhpbXB0ID0gbmV3SW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zLCBmYWxzZSwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQpKTsKLQkKKwogCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewogCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKQEAgLTYyNiwyMSArNjE0LDIxIEBACiAJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiAJLy90aGlzLmVuZFBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSA7CiAJaW1wdC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKLQkKKwogCS8vIHJlY292ZXJ5CiAJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmFkZChpbXB0LCAwKTsKIAkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7Ci0JCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJCXRoaXMucmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgogCX0KLQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQlyZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShpbXB0LnRva2VucywgaW1wdC5zb3VyY2VTdGFydCwgaW1wdC5zb3VyY2VFbmQpOworCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShpbXB0LnRva2VucywgaW1wdC5zb3VyY2VTdGFydCwgaW1wdC5zb3VyY2VFbmQpOwogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKIAkvLyBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnICdzdGF0aWMnIE5hbWUgJy4nICcqJwotCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUKIAlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCiAKIAlJbXBvcnRSZWZlcmVuY2UgaW1wdDsKQEAgLTY1MSwxMCArNjM5LDEyIEBACiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBsZW5ndGgpOwogCXB1c2hPbkFzdFN0YWNrKGltcHQgPSBuZXcgSW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zLCB0cnVlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjU3RhdGljKSk7Ci0JCisKKwkvLyBzdGFyIGVuZCBwb3NpdGlvbgorCWltcHQudHJhaWxpbmdTdGFyUG9zaXRpb24gPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCXRoaXMubW9kaWZpZXJzID0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlZmF1bHQ7CiAJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IC0xOyAvLyA8LS0gc2VlIGNvbW1lbnQgaW50byBtb2RpZmllcnNGbGFnKGludCkKLQkKKwogCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pewogCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJfSBlbHNlIHsKQEAgLTY2MywyOCArNjUzLDI4IEBACiAJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CiAJLy90aGlzLmVuZFBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSA7CiAJaW1wdC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKLQkKKwogCWlmKCF0aGlzLnN0YXRlbWVudFJlY292ZXJ5QWN0aXZhdGVkICYmCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgorCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSAmJgogCQkJdGhpcy5sYXN0RXJyb3JFbmRQb3NpdGlvbkJlZm9yZVJlY292ZXJ5IDwgdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbikgewogCQlpbXB0Lm1vZGlmaWVycyA9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZWZhdWx0OyAvLyBjb252ZXJ0IHRoZSBzdGF0aWMgaW1wb3J0IHJlZmVyZW5jZSB0byBhIG5vbi1zdGF0aWMgaW1wb3J0ZSByZWZlcmVuY2UKLQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVXNhZ2VPZlN0YXRpY0ltcG9ydHMoaW1wdCk7CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVc2FnZU9mU3RhdGljSW1wb3J0cyhpbXB0KTsKIAl9Ci0JCisKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwogCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UoaW1wdC50b2tlbnMsIGltcHQuc291cmNlU3RhcnQsIGltcHQuc291cmNlRW5kKTsKKwlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UoaW1wdC50b2tlbnMsIGltcHQuc291cmNlU3RhcnQsIGltcHQuc291cmNlRW5kKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCi0JLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZQogCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KIAogCUltcG9ydFJlZmVyZW5jZSBpbXB0OwpAQCAtNjk1LDcgKzY4NSw5IEBACiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyUG9zaXRpb25TdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBsZW5ndGgpOwogCXB1c2hPbkFzdFN0YWNrKGltcHQgPSBuZXcgSW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zLCB0cnVlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCkpOwotCQorCisJLy8gc3RhciBlbmQgcG9zaXRpb24KKwlpbXB0LnRyYWlsaW5nU3RhclBvc2l0aW9uID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAlpZiAodGhpcy5jdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKIAkJaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCX0gZWxzZSB7CkBAIC03MDQsMTYgKzY5NiwxNiBAQAogCWltcHQuZGVjbGFyYXRpb25FbmQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kOwogCS8vdGhpcy5lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOwogCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHRoaXMuaW50U3RhY2tbdGhpcy5pbnRQdHItLV07Ci0JCisKIAkvLyByZWNvdmVyeQogCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwogCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CiAJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwotCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KIAl9Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoaW1wdC50b2tlbnMsIGltcHQuc291cmNlU3RhcnQsIGltcHQuc291cmNlRW5kKTsKKwlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoaW1wdC50b2tlbnMsIGltcHQuc291cmNlU3RhcnQsIGltcHQuc291cmNlRW5kKTsKIAl9CiB9CiBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gY29udmVydFRvTWV0aG9kRGVjbGFyYXRpb24oQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjLCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgewpAQCAtNzI0LDg1ICs3MTYsMzYgQEAKIAljaGFyW11bXSBjYXRlZ29yaWVzID0gIChjaGFyW11bXSkgdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5yZW1vdmUoYyk7CiAJaWYgKGNhdGVnb3JpZXMgIT0gbnVsbCkKIAkJdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5wdXQobWV0aG9kRGVjbGFyYXRpb24sIGNhdGVnb3JpZXMpOwotCQorCiAJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwogfQogcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGVuZFBhcnNlKGludCBhY3QpIHsKLQlpZiAoc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCXN3aXRjaCAoVHlwZURlY2xhcmF0aW9uLmtpbmQoc291cmNlVHlwZS5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0wgOgotCQkJCWNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTCA6Ci0JCQkJY29uc3VtZUludGVyZmFjZURlY2xhcmF0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5FTlVNX0RFQ0wgOgotCQkJCWNvbnN1bWVFbnVtRGVjbGFyYXRpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkFOTk9UQVRJT05fVFlQRV9ERUNMIDoKLQkJCQljb25zdW1lQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpOwotCQkJCWJyZWFrOwotCQl9CisJaWYgKHRoaXMuc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCXRoaXMucmVxdWVzdG9yLmFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnModGhpcy5zY2FubmVyLmdldExpbmVFbmRzKCkpOwogCX0KLQlpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKKwlpZiAodGhpcy5jb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5lbmRQYXJzZShhY3QpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0gZWxzZSB7CiAJCXJldHVybiBudWxsOwotCX0JCQotfQotcHJpdmF0ZSBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5UeXBlUGFyYW1ldGVySW5mb1tdIGdldFR5cGVQYXJhbWV0ZXJJbmZvcyhUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMpIHsKLQlpZiAodHlwZVBhcmFtZXRlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JaW50IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoID0gdHlwZVBhcmFtZXRlcnMubGVuZ3RoOwotCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yLlR5cGVQYXJhbWV0ZXJJbmZvW10gcmVzdWx0ID0gbmV3IElTb3VyY2VFbGVtZW50UmVxdWVzdG9yLlR5cGVQYXJhbWV0ZXJJbmZvW3R5cGVQYXJhbWV0ZXJzTGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzTGVuZ3RoOyBpKyspIHsKLQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07Ci0JCVR5cGVSZWZlcmVuY2UgZmlyc3RCb3VuZCA9IHR5cGVQYXJhbWV0ZXIudHlwZTsKLQkJVHlwZVJlZmVyZW5jZVtdIG90aGVyQm91bmRzID0gdHlwZVBhcmFtZXRlci5ib3VuZHM7Ci0JCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBudWxsOwotCQlpZiAoZmlyc3RCb3VuZCAhPSBudWxsKSB7Ci0JCQlpZiAob3RoZXJCb3VuZHMgIT0gbnVsbCkgewotCQkJCWludCBvdGhlckJvdW5kc0xlbmd0aCA9IG90aGVyQm91bmRzLmxlbmd0aDsKLQkJCQljaGFyW11bXSBib3VuZE5hbWVzID0gbmV3IGNoYXJbb3RoZXJCb3VuZHNMZW5ndGgrMV1bXTsKLQkJCQlib3VuZE5hbWVzWzBdID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGZpcnN0Qm91bmQuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvdGhlckJvdW5kc0xlbmd0aDsgaisrKSB7Ci0JCQkJCWJvdW5kTmFtZXNbaisxXSA9IAotCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKG90aGVyQm91bmRzW2pdLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOyAKLQkJCQl9Ci0JCQkJdHlwZVBhcmFtZXRlckJvdW5kcyA9IGJvdW5kTmFtZXM7Ci0JCQl9IGVsc2UgewotCQkJCXR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBuZXcgY2hhcltdW10geyBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoZmlyc3RCb3VuZC5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgJy4nKX07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlUGFyYW1ldGVyQm91bmRzID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7Ci0JCX0KLQkJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZVBhcmFtZXRlckluZm8gdHlwZVBhcmFtZXRlckluZm8gPSBuZXcgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZVBhcmFtZXRlckluZm8oKTsKLQkJdHlwZVBhcmFtZXRlckluZm8uZGVjbGFyYXRpb25TdGFydCA9IHR5cGVQYXJhbWV0ZXIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkJdHlwZVBhcmFtZXRlckluZm8uZGVjbGFyYXRpb25FbmQgPSB0eXBlUGFyYW1ldGVyLmRlY2xhcmF0aW9uU291cmNlRW5kOwotCQl0eXBlUGFyYW1ldGVySW5mby5uYW1lID0gdHlwZVBhcmFtZXRlci5uYW1lOwotCQl0eXBlUGFyYW1ldGVySW5mby5uYW1lU291cmNlU3RhcnQgPSB0eXBlUGFyYW1ldGVyLnNvdXJjZVN0YXJ0OwotCQl0eXBlUGFyYW1ldGVySW5mby5uYW1lU291cmNlRW5kID0gdHlwZVBhcmFtZXRlci5zb3VyY2VFbmQ7Ci0JCXR5cGVQYXJhbWV0ZXJJbmZvLmJvdW5kcyA9IHR5cGVQYXJhbWV0ZXJCb3VuZHM7Ci0JCXJlc3VsdFtpXSA9IHR5cGVQYXJhbWV0ZXJJbmZvOwogCX0KLQlyZXR1cm4gcmVzdWx0OwogfQogcHVibGljIFR5cGVSZWZlcmVuY2UgZ2V0VHlwZVJlZmVyZW5jZShpbnQgZGltKSB7CiAJLyogYnVpbGQgYSBSZWZlcmVuY2Ugb24gYSB2YXJpYWJsZSB0aGF0IG1heSBiZSBxdWFsaWZpZWQgb3Igbm90CiAJICogVGhpcyB2YXJpYWJsZSBpcyBhIHR5cGUgcmVmZXJlbmNlIGFuZCBkaW0gd2lsbCBiZSBpdHMgZGltZW5zaW9ucwogCSAqLwotCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0ci0tXTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS1dOwogCWlmIChsZW5ndGggPCAwKSB7IC8vZmxhZyBmb3IgcHJlY29tcGlsZWQgdHlwZSByZWZlcmVuY2Ugb24gYmFzZSB0eXBlcwogCQlUeXBlUmVmZXJlbmNlIHJlZiA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWxlbmd0aCwgZGltKTsKLQkJcmVmLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQlyZWYuc291cmNlU3RhcnQgPSB0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyLS1dOwogCQlpZiAoZGltID09IDApIHsKLQkJCXJlZi5zb3VyY2VFbmQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlyZWYuc291cmNlRW5kID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKIAkJfSBlbHNlIHsKLQkJCWludFB0ci0tOyAvLyBubyBuZWVkIHRvIHVzZSB0aGlzIHBvc2l0aW9uIGFzIGl0IGlzIGFuIGFycmF5Ci0JCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl0aGlzLmludFB0ci0tOyAvLyBubyBuZWVkIHRvIHVzZSB0aGlzIHBvc2l0aW9uIGFzIGl0IGlzIGFuIGFycmF5CisJCQlyZWYuc291cmNlRW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKIAkJfQotCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbyl7Ci0JCQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVmLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCByZWYuc291cmNlU3RhcnQsIHJlZi5zb3VyY2VFbmQpOworCQlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKXsKKwkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi5nZXRQYXJhbWV0ZXJpemVkVHlwZU5hbWUoKSwgcmVmLnNvdXJjZVN0YXJ0LCByZWYuc291cmNlRW5kKTsKIAkJfQogCQlyZXR1cm4gcmVmOwogCX0gZWxzZSB7CkBAIC04MTAsMTMgKzc1MywxMyBAQAogCQlpZiAobGVuZ3RoICE9IG51bWJlck9mSWRlbnRpZmllcnMgfHwgdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdICE9IDApIHsKIAkJCS8vIGdlbmVyaWMgdHlwZQogCQkJVHlwZVJlZmVyZW5jZSByZWYgPSBnZXRUeXBlUmVmZXJlbmNlRm9yR2VuZXJpY1R5cGUoZGltLCBsZW5ndGgsIG51bWJlck9mSWRlbnRpZmllcnMpOwotCQkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKIAkJCQlpZiAobGVuZ3RoID09IDEgJiYgbnVtYmVyT2ZJZGVudGlmaWVycyA9PSAxKSB7CiAJCQkJCVBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlID0gKFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSByZWY7Ci0JCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLnRva2VuLCBwYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCk7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UudG9rZW4sIHBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0KTsKIAkJCQl9IGVsc2UgewogCQkJCQlQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBwYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSA9IChQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgcmVmOwotCQkJCQlyZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZShwYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS50b2tlbnMsIHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCBwYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQpOworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VucywgcGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQsIHBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZUVuZCk7CiAJCQkJfQogCQkJfQogCQkJcmV0dXJuIHJlZjsKQEAgLTgyNCw1MCArNzY3LDUwIEBACiAJCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCiAJCQl0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyLS07IC8vIHBvcCB0aGUgMAogCQkJaWYgKGRpbSA9PSAwKSB7Ci0JCQkJU2luZ2xlVHlwZVJlZmVyZW5jZSByZWYgPSAKKwkJCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHJlZiA9CiAJCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAotCQkJCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLCAKLQkJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV0pOwotCQkJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7Ci0JCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbiwgcmVmLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCisJCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7CisJCQkJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbiwgcmVmLnNvdXJjZVN0YXJ0KTsKIAkJCQl9CiAJCQkJcmV0dXJuIHJlZjsKIAkJCX0gZWxzZSB7Ci0JCQkJQXJyYXlUeXBlUmVmZXJlbmNlIHJlZiA9IAorCQkJCUFycmF5VHlwZVJlZmVyZW5jZSByZWYgPQogCQkJCQluZXcgQXJyYXlUeXBlUmVmZXJlbmNlKAotCQkJCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLCAKLQkJCQkJCWRpbSwgCi0JCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCi0JCQkJcmVmLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOwotCQkJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7Ci0JCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbiwgcmVmLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCXRoaXMuaWRlbnRpZmllclN0YWNrW3RoaXMuaWRlbnRpZmllclB0cl0sCisJCQkJCQlkaW0sCisJCQkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7CisJCQkJcmVmLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CisJCQkJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbiwgcmVmLnNvdXJjZVN0YXJ0KTsKIAkJCQl9CiAJCQkJcmV0dXJuIHJlZjsKIAkJCX0KIAkJfSBlbHNlIHsvL1F1YWxpZmllZCB2YXJpYWJsZSByZWZlcmVuY2UKIAkJCXRoaXMuZ2VuZXJpY3NMZW5ndGhQdHItLTsKIAkJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCQkJdGhpcy5pZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKIAkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKLQkJCQlpZGVudGlmaWVyUHRyICsgMSwgCi0JCQkJcG9zaXRpb25zLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKKwkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrLAorCQkJCXRoaXMuaWRlbnRpZmllclB0ciArIDEsCisJCQkJcG9zaXRpb25zLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKIAkJCWlmIChkaW0gPT0gMCkgewogCQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOwotCQkJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7Ci0JCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbnMsIHJlZi5zb3VyY2VTdGFydCwgcmVmLnNvdXJjZUVuZCk7CisJCQkJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbnMsIHJlZi5zb3VyY2VTdGFydCwgcmVmLnNvdXJjZUVuZCk7CiAJCQkJfQogCQkJCXJldHVybiByZWY7CiAJCQl9IGVsc2UgewotCQkJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPSAKLQkJCQkJbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsgCi0JCQkJcmVmLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOwkJCQkJCi0JCQkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJCQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVmLnRva2VucywgcmVmLnNvdXJjZVN0YXJ0LCByZWYuc291cmNlRW5kKTsKKwkJCQlBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcmVmID0KKwkJCQkJbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCQlyZWYuc291cmNlRW5kID0gdGhpcy5lbmRQb3NpdGlvbjsKKwkJCQlpZiAodGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCQkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVmLnRva2VucywgcmVmLnNvdXJjZVN0YXJ0LCByZWYuc291cmNlRW5kKTsKIAkJCQl9CiAJCQkJcmV0dXJuIHJlZjsKIAkJCX0KQEAgLTg3OCwzMSArODIxLDMxIEBACiAJLyogYnVpbGQgYSAodW5zcGVjaWZpZWQpIE5hbWVSZWZlcmVuY2Ugd2hpY2ggbWF5IGJlIHF1YWxpZmllZCovCiAKIAlpbnQgbGVuZ3RoOwotCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKKwlpZiAoKGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkgewogCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCi0JCVNpbmdsZU5hbWVSZWZlcmVuY2UgcmVmID0gCisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgcmVmID0KIAkJCW5ld1NpbmdsZU5hbWVSZWZlcmVuY2UoCi0JCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLCAKLQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCi0JCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7Ci0JCQl0aGlzLmFkZFVua25vd25SZWYocmVmKTsKKwkJCQl0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLAorCQkJCXRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dKTsKKwkJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJYWRkVW5rbm93blJlZihyZWYpOwogCQl9CiAJCXJldHVybiByZWY7CiAJfSBlbHNlIHsKIAkJLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCiAJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCQl0aGlzLmlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CiAJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBsZW5ndGgpOwotCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9IAorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKKwkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPQogCQkJbmV3UXVhbGlmaWVkTmFtZVJlZmVyZW5jZSgKLQkJCQl0b2tlbnMsIAorCQkJCXRva2VucywKIAkJCQlwb3NpdGlvbnMsCi0JCQkJKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyAxXSA+PiAzMiksIC8vIHNvdXJjZVN0YXJ0Ci0JCQkJKGludCkgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ciArIGxlbmd0aF0pOyAvLyBzb3VyY2VFbmQKLQkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJCXRoaXMuYWRkVW5rbm93blJlZihyZWYpOworCQkJCShpbnQpICh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ciArIDFdID4+IDMyKSwgLy8gc291cmNlU3RhcnQKKwkJCQkoaW50KSB0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ciArIGxlbmd0aF0pOyAvLyBzb3VyY2VFbmQKKwkJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJYWRkVW5rbm93blJlZihyZWYpOwogCQl9CiAJCXJldHVybiByZWY7CiAJfQpAQCAtOTE2LDE2ICs4NTksMTYgQEAKIAlsb29rIGZvciB0aGF0IGl0IGlzIG5vdCBhIHR5cGUgcmVmZXJlbmNlICovCiAKIAlpbnQgbGVuZ3RoOwotCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKKwlpZiAoKGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkgewogCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCi0JCVNpbmdsZU5hbWVSZWZlcmVuY2UgcmVmID0gCisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgcmVmID0KIAkJCW5ld1NpbmdsZU5hbWVSZWZlcmVuY2UoCi0JCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLCAKLQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCQkJdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXSwKKwkJCQl0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3RoaXMuaWRlbnRpZmllclB0ci0tXSk7CiAJCXJlZi5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CiAJCXJlZi5iaXRzIHw9IEJpbmRpbmcuTE9DQUwgfCBCaW5kaW5nLkZJRUxEOwotCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQkJdGhpcy5hZGRVbmtub3duUmVmKHJlZik7CisJCWlmICh0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCWFkZFVua25vd25SZWYocmVmKTsKIAkJfQogCQlyZXR1cm4gcmVmOwogCX0KQEAgLTkzNyw0MSArODgwLDI0IEBACiAJLy9vciBlbHNlLi4uLi4uLi4uLlRoaXMgb3B0aW1pc2F0aW9uIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgc28ganVzdCBsZWF2ZSBhcyBpdCBpcwogCiAJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOwotCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCXRoaXMuaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLmlkZW50aWZpZXJTdGFjaywgdGhpcy5pZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOwogCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwotCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCBwb3NpdGlvbnMsIDAsIGxlbmd0aCk7Ci0JUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSByZWYgPSAKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciArIDEsIHBvc2l0aW9ucywgMCwgbGVuZ3RoKTsKKwlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9CiAJCW5ld1F1YWxpZmllZE5hbWVSZWZlcmVuY2UoCi0JCQl0b2tlbnMsIAorCQkJdG9rZW5zLAogCQkJcG9zaXRpb25zLAotCQkJKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyAxXSA+PiAzMiksIAorCQkJKGludCkgKHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLAogCS8vIHNvdXJjZVN0YXJ0Ci0JIChpbnQpIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyBsZW5ndGhdKTsgLy8gc291cmNlRW5kCisJIChpbnQpIHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyICsgbGVuZ3RoXSk7IC8vIHNvdXJjZUVuZAogCXJlZi5iaXRzICY9IH5BU1ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CiAJcmVmLmJpdHMgfD0gQmluZGluZy5MT0NBTCB8IEJpbmRpbmcuRklFTEQ7Ci0JaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJdGhpcy5hZGRVbmtub3duUmVmKHJlZik7CisJaWYgKHRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQlhZGRVbmtub3duUmVmKHJlZik7CiAJfQogCXJldHVybiByZWY7CiB9Ci0KLS8qCi0gKiBDaGVja3Mgd2hldGhlciBvbmUgb2YgdGhlIGFubm90YXRpb25zIGlzIHRoZSBARGVwcmVjYXRlZCBhbm5vdGF0aW9uCi0gKiAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgwNykKLSAqLwotcHJpdmF0ZSBib29sZWFuIGhhc0RlcHJlY2F0ZWRBbm5vdGF0aW9uKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgewotCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07Ci0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYW5ub3RhdGlvbi50eXBlLmdldExhc3RUb2tlbigpLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19ERVBSRUNBVEVEWzJdKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQogcHJvdGVjdGVkIEltcG9ydFJlZmVyZW5jZSBuZXdJbXBvcnRSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zLCBsb25nW10gcG9zaXRpb25zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kKSB7CiAJcmV0dXJuIG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIG9uRGVtYW5kLCBtb2QpOwogfQpAQCAtOTgxLDY3OSArOTA3LDQ1IEBACiBwcm90ZWN0ZWQgU2luZ2xlTmFtZVJlZmVyZW5jZSBuZXdTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zaXRpb25zKSB7CiAJcmV0dXJuIG5ldyBTaW5nbGVOYW1lUmVmZXJlbmNlKHNvdXJjZSwgcG9zaXRpb25zKTsKIH0KLS8qCi0gKiBVcGRhdGUgdGhlIGJvZHlTdGFydCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCi0gKi8KLXB1YmxpYyB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgewotCWlmIChwYXJzZWRVbml0ID09IG51bGwpIHsKLQkJLy8gd2hlbiB3ZSBwYXJzZSBhIHNpbmdsZSB0eXBlIG1lbWJlciBkZWNsYXJhdGlvbiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBudWxsLCBidXQgd2Ugc3RpbGwKLQkJLy8gd2FudCB0byBiZSBhYmxlIHRvIG5vdGlmeSB0aGUgcmVxdWVzdG9yIG9uIHRoZSBjcmVhdGVkIGFzdCBub2RlCi0JCWlmIChhc3RTdGFja1swXSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8vIHJhbmdlIGNoZWNrCi0JYm9vbGVhbiBpc0luUmFuZ2UgPSAKLQkJCQlzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBwYXJzZWRVbml0LnNvdXJjZVN0YXJ0Ci0JCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA+PSBwYXJzZWRVbml0LnNvdXJjZUVuZDsKLQkKLQkvLyBjb2xsZWN0IHRoZSB0b3AgbGV2ZWwgYXN0IG5vZGVzCi0JaW50IGxlbmd0aCA9IDA7Ci0JQVNUTm9kZVtdIG5vZGVzID0gbnVsbDsKLQlpZiAoc291cmNlVHlwZSA9PSBudWxsKXsKLQkJaWYgKGlzSW5SYW5nZSkgewotCQkJcmVxdWVzdG9yLmVudGVyQ29tcGlsYXRpb25Vbml0KCk7Ci0JCX0KLQkJSW1wb3J0UmVmZXJlbmNlIGN1cnJlbnRQYWNrYWdlID0gcGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZTsKLQkJSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0cyA9IHBhcnNlZFVuaXQuaW1wb3J0czsKLQkJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBwYXJzZWRVbml0LnR5cGVzOwotCQlsZW5ndGggPSAKLQkJCShjdXJyZW50UGFja2FnZSA9PSBudWxsID8gMCA6IDEpIAotCQkJKyAoaW1wb3J0cyA9PSBudWxsID8gMCA6IGltcG9ydHMubGVuZ3RoKQotCQkJKyAodHlwZXMgPT0gbnVsbCA/IDAgOiB0eXBlcy5sZW5ndGgpOwotCQlub2RlcyA9IG5ldyBBU1ROb2RlW2xlbmd0aF07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWlmIChjdXJyZW50UGFja2FnZSAhPSBudWxsKSB7Ci0JCQlub2Rlc1tpbmRleCsrXSA9IGN1cnJlbnRQYWNrYWdlOwotCQl9Ci0JCWlmIChpbXBvcnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBpbXBvcnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJbm9kZXNbaW5kZXgrK10gPSBpbXBvcnRzW2ldOwotCQkJfQotCQl9Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlub2Rlc1tpbmRleCsrXSA9IHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBwYXJzZWRVbml0LnR5cGVzOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJbGVuZ3RoID0gdHlwZXMubGVuZ3RoOwotCQkJbm9kZXMgPSBuZXcgQVNUTm9kZVtsZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJbm9kZXNbaV0gPSB0eXBlc1tpXTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBub3RpZnkgdGhlIG5vZGVzIGluIHRoZSBzeW50YWN0aWNhbCBvcmRlcgotCWlmIChub2RlcyAhPSBudWxsICYmIGxlbmd0aCA+IDApIHsKLQkJcXVpY2tTb3J0KG5vZGVzLCAwLCBsZW5ndGgtMSk7Ci0JCWZvciAoaW50IGk9MDtpPGxlbmd0aDtpKyspIHsKLQkJCUFTVE5vZGUgbm9kZSA9IG5vZGVzW2ldOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsKLQkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmID0gKEltcG9ydFJlZmVyZW5jZSlub2RlOwotCQkJCWlmIChub2RlID09IHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UpIHsKLQkJCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihpbXBvcnRSZWYsIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoaW1wb3J0UmVmLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24KLQkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKChUeXBlRGVjbGFyYXRpb24pbm9kZSwgc291cmNlVHlwZSA9PSBudWxsLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlpZiAoc291cmNlVHlwZSA9PSBudWxsKXsKLQkJaWYgKGlzSW5SYW5nZSkgewotCQkJcmVxdWVzdG9yLmV4aXRDb21waWxhdGlvblVuaXQocGFyc2VkVW5pdC5zb3VyY2VFbmQpOwotCQl9Ci0JfQotfQotCi0vKgotICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQotICovCi1wdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQotCS8vIHJhbmdlIGNoZWNrCi0JYm9vbGVhbiBpc0luUmFuZ2UgPSAKLQkJCQlzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0Ci0JCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA+PSBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKLQotCWlmIChtZXRob2REZWNsYXJhdGlvbi5pc0NsaW5pdCgpKSB7Ci0JCXRoaXMudmlzaXRJZk5lZWRlZChtZXRob2REZWNsYXJhdGlvbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobWV0aG9kRGVjbGFyYXRpb24uaXNEZWZhdWx0Q29uc3RydWN0b3IoKSkgewotCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgewotCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uOwotCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY29uc3RydWN0b3JDYWxsID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5jb25zdHJ1Y3RvckNhbGw7Ci0JCQlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKLQkJCQlzd2l0Y2goY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUpIHsKLQkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzIDoKLQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKLQkJCQkJCQl0eXBlTmFtZXNbbmVzdGVkVHlwZUluZGV4LTFdLAotCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzLmxlbmd0aCwgCi0JCQkJCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyIDoKLQkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyIDoJCQkJCQotCQkJCQkJcmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAotCQkJCQkJCXN1cGVyVHlwZU5hbWVzW25lc3RlZFR5cGVJbmRleC0xXSwKLQkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsIAotCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCXJldHVybjsJCi0JfQkKLQljaGFyW11bXSBhcmd1bWVudFR5cGVzID0gbnVsbDsKLQljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gbnVsbDsKLQlib29sZWFuIGlzVmFyQXJncyA9IGZhbHNlOwotCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzOwotCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwotCQlhcmd1bWVudFR5cGVzID0gbmV3IGNoYXJbYXJndW1lbnRMZW5ndGhdW107Ci0JCWFyZ3VtZW50TmFtZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7Ci0JCQlhcmd1bWVudFR5cGVzW2ldID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFyZ3VtZW50c1tpXS50eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOwotCQkJYXJndW1lbnROYW1lc1tpXSA9IGFyZ3VtZW50c1tpXS5uYW1lOwotCQl9Ci0JCWlzVmFyQXJncyA9IGFyZ3VtZW50c1thcmd1bWVudExlbmd0aC0xXS5pc1ZhckFyZ3MoKTsKLQl9Ci0JY2hhcltdW10gdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBudWxsOwotCVR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKLQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0JCWludCB0aHJvd25FeGNlcHRpb25MZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKLQkJdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBuZXcgY2hhclt0aHJvd25FeGNlcHRpb25MZW5ndGhdW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9uTGVuZ3RoOyBpKyspIHsKLQkJCXRocm93bkV4Y2VwdGlvblR5cGVzW2ldID0gCi0JCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRocm93bkV4Y2VwdGlvbnNbaV0uZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7IAotCQl9Ci0JfQotCS8vIGJ5IGRlZmF1bHQgbm8gc2VsZWN0b3IgZW5kIHBvc2l0aW9uCi0JaW50IHNlbGVjdG9yU291cmNlRW5kID0gLTE7Ci0JaWYgKG1ldGhvZERlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IoKSkgewotCQlzZWxlY3RvclNvdXJjZUVuZCA9IHRoaXMuc291cmNlRW5kcy5nZXQobWV0aG9kRGVjbGFyYXRpb24pOwotCQlpZiAoaXNJblJhbmdlKXsKLQkJCWludCBjdXJyZW50TW9kaWZpZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzOwotCQkJaWYgKGlzVmFyQXJncykKLQkJCQljdXJyZW50TW9kaWZpZXJzIHw9IENsYXNzRmlsZUNvbnN0YW50cy5BY2NWYXJhcmdzOwotCQkJCi0JCQkvLyByZW1lbWJlciBkZXByZWNhdGlvbiBzbyBhcyB0byBub3QgbG9zZSBpdCBiZWxvdwotCQkJYm9vbGVhbiBkZXByZWNhdGVkID0gKGN1cnJlbnRNb2RpZmllcnMgJiBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCkgIT0gMCB8fCBoYXNEZXByZWNhdGVkQW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyk7Ci0JCQkKLQkJCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yLk1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG5ldyBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5NZXRob2RJbmZvKCk7Ci0JCQltZXRob2RJbmZvLmlzQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJbWV0aG9kSW5mby5kZWNsYXJhdGlvblN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkJCW1ldGhvZEluZm8ubW9kaWZpZXJzID0gZGVwcmVjYXRlZCA/IChjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCA6IGN1cnJlbnRNb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOwotCQkJbWV0aG9kSW5mby5uYW1lID0gbWV0aG9kRGVjbGFyYXRpb24uc2VsZWN0b3I7Ci0JCQltZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OwotCQkJbWV0aG9kSW5mby5uYW1lU291cmNlRW5kID0gc2VsZWN0b3JTb3VyY2VFbmQ7Ci0JCQltZXRob2RJbmZvLnBhcmFtZXRlclR5cGVzID0gYXJndW1lbnRUeXBlczsKLQkJCW1ldGhvZEluZm8ucGFyYW1ldGVyTmFtZXMgPSBhcmd1bWVudE5hbWVzOwotCQkJbWV0aG9kSW5mby5leGNlcHRpb25UeXBlcyA9IHRocm93bkV4Y2VwdGlvblR5cGVzOwotCQkJbWV0aG9kSW5mby50eXBlUGFyYW1ldGVycyA9IGdldFR5cGVQYXJhbWV0ZXJJbmZvcyhtZXRob2REZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycygpKTsKLQkJCW1ldGhvZEluZm8uYW5ub3RhdGlvblBvc2l0aW9ucyA9IGNvbGxlY3RBbm5vdGF0aW9uUG9zaXRpb25zKG1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKLQkJCW1ldGhvZEluZm8uY2F0ZWdvcmllcyA9IChjaGFyW11bXSkgdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5nZXQobWV0aG9kRGVjbGFyYXRpb24pOwotCQkJcmVxdWVzdG9yLmVudGVyQ29uc3RydWN0b3IobWV0aG9kSW5mbyk7Ci0JCX0KLQkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKLQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKLQkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOwotCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7Ci0JCQkJc3dpdGNoKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlKSB7Ci0JCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCi0JCQkJCQkJdHlwZU5hbWVzW25lc3RlZFR5cGVJbmRleC0xXSwKLQkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsIAotCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlciA6Ci0JCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlciA6Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCi0JCQkJCQkJc3VwZXJUeXBlTmFtZXNbbmVzdGVkVHlwZUluZGV4LTFdLAotCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzLmxlbmd0aCwgCi0JCQkJCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0KTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLnZpc2l0SWZOZWVkZWQobWV0aG9kRGVjbGFyYXRpb24pOwotCQlpZiAoaXNJblJhbmdlKXsKLQkJCXJlcXVlc3Rvci5leGl0Q29uc3RydWN0b3IobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0Jc2VsZWN0b3JTb3VyY2VFbmQgPSB0aGlzLnNvdXJjZUVuZHMuZ2V0KG1ldGhvZERlY2xhcmF0aW9uKTsKLQlpZiAoaXNJblJhbmdlKSB7Ci0JCWludCBjdXJyZW50TW9kaWZpZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzOwotCQlpZiAoaXNWYXJBcmdzKQotCQkJY3VycmVudE1vZGlmaWVycyB8PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjVmFyYXJnczsKLQkJCi0JCS8vIHJlbWVtYmVyIGRlcHJlY2F0aW9uIHNvIGFzIHRvIG5vdCBsb3NlIGl0IGJlbG93Ci0JCWJvb2xlYW4gZGVwcmVjYXRlZCA9IChjdXJyZW50TW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDAgfHwgaGFzRGVwcmVjYXRlZEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOwkKLQkJCQotCQlUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUgPSBtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uCi0JCQk/ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5yZXR1cm5UeXBlCi0JCQk6IG51bGw7Ci0JCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yLk1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG5ldyBJU291cmNlRWxlbWVudFJlcXVlc3Rvci5NZXRob2RJbmZvKCk7Ci0JCW1ldGhvZEluZm8uaXNBbm5vdGF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb247Ci0JCW1ldGhvZEluZm8uZGVjbGFyYXRpb25TdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7Ci0JCW1ldGhvZEluZm8ubW9kaWZpZXJzID0gZGVwcmVjYXRlZCA/IChjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZykgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCA6IGN1cnJlbnRNb2RpZmllcnMgJiBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOwotCQltZXRob2RJbmZvLnJldHVyblR5cGUgPSByZXR1cm5UeXBlID09IG51bGwgPyBudWxsIDogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHJldHVyblR5cGUuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7Ci0JCW1ldGhvZEluZm8ubmFtZSA9IG1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yOwotCQltZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OwotCQltZXRob2RJbmZvLm5hbWVTb3VyY2VFbmQgPSBzZWxlY3RvclNvdXJjZUVuZDsKLQkJbWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyA9IGFyZ3VtZW50VHlwZXM7Ci0JCW1ldGhvZEluZm8ucGFyYW1ldGVyTmFtZXMgPSBhcmd1bWVudE5hbWVzOwotCQltZXRob2RJbmZvLmV4Y2VwdGlvblR5cGVzID0gdGhyb3duRXhjZXB0aW9uVHlwZXM7Ci0JCW1ldGhvZEluZm8udHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVySW5mb3MobWV0aG9kRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMoKSk7Ci0JCW1ldGhvZEluZm8uYW5ub3RhdGlvblBvc2l0aW9ucyA9IGNvbGxlY3RBbm5vdGF0aW9uUG9zaXRpb25zKG1ldGhvZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKLQkJbWV0aG9kSW5mby5jYXRlZ29yaWVzID0gKGNoYXJbXVtdKSB0aGlzLm5vZGVzVG9DYXRlZ29yaWVzLmdldChtZXRob2REZWNsYXJhdGlvbik7Ci0JCXJlcXVlc3Rvci5lbnRlck1ldGhvZChtZXRob2RJbmZvKTsKLQl9CQkKLQkJCi0JdGhpcy52aXNpdElmTmVlZGVkKG1ldGhvZERlY2xhcmF0aW9uKTsKLQotCWlmIChpc0luUmFuZ2UpIHsKLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCQlBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24gYW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uID0gKEFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb247Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24uZGVmYXVsdFZhbHVlOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewotCQkJCXJlcXVlc3Rvci5leGl0TWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IAotCQlyZXF1ZXN0b3IuZXhpdE1ldGhvZChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCwgLTEsIC0xKTsKLQl9Ci19Ci0KLS8qCi0qIFVwZGF0ZSB0aGUgYm9keVN0YXJ0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKLSovCi1wdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUpIHsKLQkKLQkvLyByYW5nZSBjaGVjawotCWJvb2xlYW4gaXNJblJhbmdlID0gCi0JCQkJc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0Ci0JCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA+PSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOwotCi0Jc3dpdGNoKGZpZWxkRGVjbGFyYXRpb24uZ2V0S2luZCgpKSB7Ci0JCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQ6Ci0JCQkvLyBhY2NlcHQgY29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciBlbnVtIGNvbnN0YW50Ci0JCQlpZiAoZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7Ci0JCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb247Ci0JCQkJcmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAotCQkJCQlkZWNsYXJpbmdUeXBlLm5hbWUsCi0JCQkJCWFsbG9jLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jLmFyZ3VtZW50cy5sZW5ndGgsIAotCQkJCQlhbGxvYy5zb3VyY2VTdGFydCk7Ci0JCQl9Ci0JCQkvLyBmYWxsIHRocm91Z2ggbmV4dCBjYXNlCi0JCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkZJRUxEOgotCQkJaW50IGZpZWxkRW5kUG9zaXRpb24gPSB0aGlzLnNvdXJjZUVuZHMuZ2V0KGZpZWxkRGVjbGFyYXRpb24pOwotCQkJaWYgKGZpZWxkRW5kUG9zaXRpb24gPT0gLTEpIHsKLQkJCQkvLyB1c2UgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgYnkgZGVmYXVsdAotCQkJCWZpZWxkRW5kUG9zaXRpb24gPSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOwotCQkJfQotCQkJaWYgKGlzSW5SYW5nZSkgewotCQkJCWludCBjdXJyZW50TW9kaWZpZXJzID0gZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnM7Ci0JCQkJCi0JCQkJLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKLQkJCQlib29sZWFuIGRlcHJlY2F0ZWQgPSAoY3VycmVudE1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkKSAhPSAwIHx8IGhhc0RlcHJlY2F0ZWRBbm5vdGF0aW9uKGZpZWxkRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOwkKLQkJCQotCQkJCWNoYXJbXSB0eXBlTmFtZSA9IG51bGw7Ci0JCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24udHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGVudW0gY29uc3RhbnQKLQkJCQkJdHlwZU5hbWUgPSBkZWNsYXJpbmdUeXBlLm5hbWU7Ci0JCQkJCWN1cnJlbnRNb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVndWxhciBmaWVsZAotCQkJCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChmaWVsZERlY2xhcmF0aW9uLnR5cGUuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJyk7Ci0JCQkJfQotCQkJCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yLkZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuRmllbGRJbmZvKCk7Ci0JCQkJZmllbGRJbmZvLmRlY2xhcmF0aW9uU3RhcnQgPSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7Ci0JCQkJZmllbGRJbmZvLm5hbWUgPSBmaWVsZERlY2xhcmF0aW9uLm5hbWU7Ci0JCQkJZmllbGRJbmZvLm1vZGlmaWVycyA9IGRlcHJlY2F0ZWQgPyAoY3VycmVudE1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcpIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgOiBjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKLQkJCQlmaWVsZEluZm8udHlwZSA9IHR5cGVOYW1lOwotCQkJCWZpZWxkSW5mby5uYW1lU291cmNlU3RhcnQgPSBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OwotCQkJCWZpZWxkSW5mby5uYW1lU291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7Ci0JCQkJZmllbGRJbmZvLmFubm90YXRpb25Qb3NpdGlvbnMgPSBjb2xsZWN0QW5ub3RhdGlvblBvc2l0aW9ucyhmaWVsZERlY2xhcmF0aW9uLmFubm90YXRpb25zKTsKLQkJCQlmaWVsZEluZm8uY2F0ZWdvcmllcyA9IChjaGFyW11bXSkgdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5nZXQoZmllbGREZWNsYXJhdGlvbik7Ci0JCQkJcmVxdWVzdG9yLmVudGVyRmllbGQoZmllbGRJbmZvKTsKLQkJCX0KLQkJCXRoaXMudmlzaXRJZk5lZWRlZChmaWVsZERlY2xhcmF0aW9uLCBkZWNsYXJpbmdUeXBlKTsKLQkJCWlmIChpc0luUmFuZ2UpewotCQkJCXJlcXVlc3Rvci5leGl0RmllbGQoCi0JCQkJCS8vIGZpbHRlciBvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgYXJlIG5vdCBhIGNvbnN0YW50IChzaW1wbGUgY2hlY2spCi0JCQkJCShmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwgCi0JCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIKLQkJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24KLQkJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbgotCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBc3NpZ25tZW50Ci0JCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENsYXNzTGl0ZXJhbEFjY2VzcwotCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBNZXNzYWdlU2VuZAotCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheVJlZmVyZW5jZQotCQkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBUaGlzUmVmZXJlbmNlKSA/IAotCQkJCQkJLTEgOiAgCi0JCQkJCQlmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZVN0YXJ0LCAKLQkJCQkJZmllbGRFbmRQb3NpdGlvbiwKLQkJCQkJZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uSU5JVElBTElaRVI6Ci0JCQlpZiAoaXNJblJhbmdlKXsKLQkJCQlyZXF1ZXN0b3IuZW50ZXJJbml0aWFsaXplcigKLQkJCQkJZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAotCQkJCQlmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycyk7IAotCQkJfQotCQkJdGhpcy52aXNpdElmTmVlZGVkKChJbml0aWFsaXplcilmaWVsZERlY2xhcmF0aW9uKTsKLQkJCWlmIChpc0luUmFuZ2UpewotCQkJCXJlcXVlc3Rvci5leGl0SW5pdGlhbGl6ZXIoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKAotCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIAotCWJvb2xlYW4gaXNQYWNrYWdlKSB7Ci0JaWYgKGlzUGFja2FnZSkgewotCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKLQkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwgCi0JCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSk7IAotCX0gZWxzZSB7Ci0JCXJlcXVlc3Rvci5hY2NlcHRJbXBvcnQoCi0JCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCi0JCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQsIAotCQkJaW1wb3J0UmVmZXJlbmNlLnRva2VucywgCi0JCQkoaW1wb3J0UmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwLAotCQkJaW1wb3J0UmVmZXJlbmNlLm1vZGlmaWVycyk7IAotCX0KLX0KLXB1YmxpYyB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgYm9vbGVhbiBub3RpZnlUeXBlUHJlc2VuY2UsIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKSB7Ci0JCi0JaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuUEFDS0FHRV9JTkZPX05BTUUsIHR5cGVEZWNsYXJhdGlvbi5uYW1lKSkgcmV0dXJuOwotCi0JLy8gcmFuZ2UgY2hlY2sKLQlib29sZWFuIGlzSW5SYW5nZSA9IAotCQlzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAotCQkmJiBzY2FubmVyLmVvZlBvc2l0aW9uID49IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKLQkKLQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKLQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwotCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzOwotCWludCBmaWVsZENvdW50ZXIgPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOwotCWludCBtZXRob2RDb3VudGVyID0gbWV0aG9kcyA9PSBudWxsID8gMCA6IG1ldGhvZHMubGVuZ3RoOwotCWludCBtZW1iZXJUeXBlQ291bnRlciA9IG1lbWJlclR5cGVzID09IG51bGwgPyAwIDogbWVtYmVyVHlwZXMubGVuZ3RoOwotCWludCBmaWVsZEluZGV4ID0gMDsKLQlpbnQgbWV0aG9kSW5kZXggPSAwOwotCWludCBtZW1iZXJUeXBlSW5kZXggPSAwOwotCQotCWlmIChub3RpZnlUeXBlUHJlc2VuY2UpewotCQljaGFyW11bXSBpbnRlcmZhY2VOYW1lcyA9IG51bGw7Ci0JCWludCBzdXBlckludGVyZmFjZXNMZW5ndGggPSAwOwotCQlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKLQkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQlzdXBlckludGVyZmFjZXNMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOwotCQkJaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhcltzdXBlckludGVyZmFjZXNMZW5ndGhdW107Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsKLQkJCQkvLyBzZWUgUFIgMzQ0MgotCQkJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb247Ci0JCQkJaWYgKGFsbG9jICE9IG51bGwgJiYgYWxsb2MudHlwZSAhPSBudWxsKSB7Ci0JCQkJCXN1cGVySW50ZXJmYWNlcyA9IG5ldyBUeXBlUmVmZXJlbmNlW10geyBhbGxvYy50eXBlfTsKLQkJCQkJc3VwZXJJbnRlcmZhY2VzTGVuZ3RoID0gMTsKLQkJCQkJaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhclsxXVtdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VzTGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcmZhY2VOYW1lc1tpXSA9IAotCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoc3VwZXJJbnRlcmZhY2VzW2ldLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpLCAnLicpOyAKLQkJCX0KLQkJfQotCQlpbnQga2luZCA9IFR5cGVEZWNsYXJhdGlvbi5raW5kKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpOwotCQljaGFyW10gaW1wbGljaXRTdXBlcmNsYXNzTmFtZSA9IFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfTEFOR19PQkpFQ1Q7Ci0JCWlmIChpc0luUmFuZ2UpIHsKLQkJCWludCBjdXJyZW50TW9kaWZpZXJzID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKLQkJCQotCQkJLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKLQkJCWJvb2xlYW4gZGVwcmVjYXRlZCA9IChjdXJyZW50TW9kaWZpZXJzICYgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpICE9IDAgfHwgaGFzRGVwcmVjYXRlZEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLmFubm90YXRpb25zKTsJCi0JCQkKLQkJCWJvb2xlYW4gaXNFbnVtSW5pdCA9IHR5cGVEZWNsYXJhdGlvbi5hbGxvY2F0aW9uICE9IG51bGwgJiYgdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24uZW51bUNvbnN0YW50ICE9IG51bGw7Ci0JCQljaGFyW10gc3VwZXJjbGFzc05hbWU7Ci0JCQlpZiAoaXNFbnVtSW5pdCkgewotCQkJCWN1cnJlbnRNb2RpZmllcnMgfD0gQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0VudW07Ci0JCQkJc3VwZXJjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzOwotCQkJCXN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzcyAhPSBudWxsID8gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVyY2xhc3MuZ2V0UGFyYW1ldGVyaXplZFR5cGVOYW1lKCksICcuJykgOiBudWxsOwotCQkJfQotCQkJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZUluZm8gdHlwZUluZm8gPSBuZXcgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZUluZm8oKTsKLQkJCXR5cGVJbmZvLmRlY2xhcmF0aW9uU3RhcnQgPSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkJCXR5cGVJbmZvLm1vZGlmaWVycyA9IGRlcHJlY2F0ZWQgPyAoY3VycmVudE1vZGlmaWVycyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWcpIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQgOiBjdXJyZW50TW9kaWZpZXJzICYgRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKLQkJCXR5cGVJbmZvLm5hbWUgPSB0eXBlRGVjbGFyYXRpb24ubmFtZTsKLQkJCXR5cGVJbmZvLm5hbWVTb3VyY2VTdGFydCA9IHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKLQkJCXR5cGVJbmZvLm5hbWVTb3VyY2VFbmQgPSBzb3VyY2VFbmQodHlwZURlY2xhcmF0aW9uKTsKLQkJCXR5cGVJbmZvLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzTmFtZTsKLQkJCXR5cGVJbmZvLnN1cGVyaW50ZXJmYWNlcyA9IGludGVyZmFjZU5hbWVzOwotCQkJdHlwZUluZm8udHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVySW5mb3ModHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzKTsKLQkJCXR5cGVJbmZvLmFubm90YXRpb25Qb3NpdGlvbnMgPSBjb2xsZWN0QW5ub3RhdGlvblBvc2l0aW9ucyh0eXBlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMpOwotCQkJdHlwZUluZm8uY2F0ZWdvcmllcyA9IChjaGFyW11bXSkgdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcy5nZXQodHlwZURlY2xhcmF0aW9uKTsKLQkJCXR5cGVJbmZvLnNlY29uZGFyeSA9IHR5cGVEZWNsYXJhdGlvbi5pc1NlY29uZGFyeSgpOwotCQkJdHlwZUluZm8uYW5vbnltb3VzTWVtYmVyID0gdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gIT0gbnVsbCAmJiB0eXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbi5lbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsOwotCQkJcmVxdWVzdG9yLmVudGVyVHlwZSh0eXBlSW5mbyk7Ci0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5DTEFTU19ERUNMIDoKLQkJCQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpCi0JCQkJCQlpbXBsaWNpdFN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMIDoKLQkJCQkJaW1wbGljaXRTdXBlcmNsYXNzTmFtZSA9IFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfTEFOR19PQkpFQ1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6Ci0JCQkJCWltcGxpY2l0U3VwZXJjbGFzc05hbWUgPSBUeXBlQ29uc3RhbnRzLkNoYXJBcnJheV9KQVZBX0xBTkdfRU5VTTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wgOgotCQkJCQlpbXBsaWNpdFN1cGVyY2xhc3NOYW1lID0gVHlwZUNvbnN0YW50cy5DaGFyQXJyYXlfSkFWQV9MQU5HX0FOTk9UQVRJT05fQU5OT1RBVElPTjsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMubmVzdGVkVHlwZUluZGV4ID09IHRoaXMudHlwZU5hbWVzLmxlbmd0aCkgewotCQkJLy8gbmVlZCBhIHJlc2l6ZQotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVOYW1lcywgMCwgKHRoaXMudHlwZU5hbWVzID0gbmV3IGNoYXJbdGhpcy5uZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgdGhpcy5uZXN0ZWRUeXBlSW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnN1cGVyVHlwZU5hbWVzLCAwLCAodGhpcy5zdXBlclR5cGVOYW1lcyA9IG5ldyBjaGFyW3RoaXMubmVzdGVkVHlwZUluZGV4ICogMl1bXSksIDAsIHRoaXMubmVzdGVkVHlwZUluZGV4KTsKLQkJfQotCQl0aGlzLnR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleF0gPSB0eXBlRGVjbGFyYXRpb24ubmFtZTsKLQkJdGhpcy5zdXBlclR5cGVOYW1lc1t0aGlzLm5lc3RlZFR5cGVJbmRleCsrXSA9IGltcGxpY2l0U3VwZXJjbGFzc05hbWU7Ci0JfQotCXdoaWxlICgoZmllbGRJbmRleCA8IGZpZWxkQ291bnRlcikKLQkJCXx8IChtZW1iZXJUeXBlSW5kZXggPCBtZW1iZXJUeXBlQ291bnRlcikKLQkJCXx8IChtZXRob2RJbmRleCA8IG1ldGhvZENvdW50ZXIpKSB7Ci0JCUZpZWxkRGVjbGFyYXRpb24gbmV4dEZpZWxkRGVjbGFyYXRpb24gPSBudWxsOwotCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG5leHRNZXRob2REZWNsYXJhdGlvbiA9IG51bGw7Ci0JCVR5cGVEZWNsYXJhdGlvbiBuZXh0TWVtYmVyRGVjbGFyYXRpb24gPSBudWxsOwotCQkKLQkJaW50IHBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCBuZXh0RGVjbGFyYXRpb25UeXBlID0gLTE7Ci0JCWlmIChmaWVsZEluZGV4IDwgZmllbGRDb3VudGVyKSB7Ci0JCQluZXh0RmllbGREZWNsYXJhdGlvbiA9IGZpZWxkc1tmaWVsZEluZGV4XTsKLQkJCWlmIChuZXh0RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDwgcG9zaXRpb24pIHsKLQkJCQlwb3NpdGlvbiA9IG5leHRGaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7Ci0JCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDA7IC8vIEZJRUxECi0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZEluZGV4IDwgbWV0aG9kQ291bnRlcikgewotCQkJbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbWV0aG9kc1ttZXRob2RJbmRleF07Ci0JCQlpZiAobmV4dE1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPCBwb3NpdGlvbikgewotCQkJCXBvc2l0aW9uID0gbmV4dE1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7Ci0JCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDE7IC8vIE1FVEhPRAotCQkJfQotCQl9Ci0JCWlmIChtZW1iZXJUeXBlSW5kZXggPCBtZW1iZXJUeXBlQ291bnRlcikgewotCQkJbmV4dE1lbWJlckRlY2xhcmF0aW9uID0gbWVtYmVyVHlwZXNbbWVtYmVyVHlwZUluZGV4XTsKLQkJCWlmIChuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7Ci0JCQkJcG9zaXRpb24gPSBuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQkJCQluZXh0RGVjbGFyYXRpb25UeXBlID0gMjsgLy8gTUVNQkVSCi0JCQl9Ci0JCX0KLQkJc3dpdGNoIChuZXh0RGVjbGFyYXRpb25UeXBlKSB7Ci0JCQljYXNlIDAgOgotCQkJCWZpZWxkSW5kZXgrKzsKLQkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKG5leHRGaWVsZERlY2xhcmF0aW9uLCB0eXBlRGVjbGFyYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxIDoKLQkJCQltZXRob2RJbmRleCsrOwotCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IobmV4dE1ldGhvZERlY2xhcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMiA6Ci0JCQkJbWVtYmVyVHlwZUluZGV4Kys7Ci0JCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihuZXh0TWVtYmVyRGVjbGFyYXRpb24sIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCWlmIChub3RpZnlUeXBlUHJlc2VuY2UpewotCQlpZiAoaXNJblJhbmdlKXsKLQkJCXJlcXVlc3Rvci5leGl0VHlwZSh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotCQl9Ci0JCW5lc3RlZFR5cGVJbmRleC0tOwotCX0KLX0KLXB1YmxpYyB2b2lkIHBhcnNlQ29tcGlsYXRpb25Vbml0KAotCUlDb21waWxhdGlvblVuaXQgdW5pdCwgCi0JaW50IHN0YXJ0LCAKLQlpbnQgZW5kLCAKLQlib29sZWFuIGZ1bGxQYXJzZSkgewotCi0JdGhpcy5yZXBvcnRSZWZlcmVuY2VJbmZvID0gZnVsbFBhcnNlOwotCWJvb2xlYW4gb2xkID0gZGlldDsKLQkKLQl0cnkgewotCQlkaWV0ID0gdHJ1ZTsKLQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Vbml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHVuaXQsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2UodW5pdCwgY29tcGlsYXRpb25Vbml0UmVzdWx0LCBzdGFydCwgZW5kKTsKLQkJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgewotCQkJcmVxdWVzdG9yLmFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoY29tcGlsYXRpb25Vbml0UmVzdWx0LmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSk7Ci0JCX0KLQkJaWYgKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgIT0gbnVsbCB8fCBmdWxsUGFyc2UpewotCQkJZGlldCA9IGZhbHNlOwotCQkJdGhpcy5nZXRNZXRob2RCb2RpZXMocGFyc2VkVW5pdCk7Ci0JCX0JCQotCQl0aGlzLnNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKLQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihwYXJzZWRVbml0KTsKLQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKLQkJLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uCi0JfSBmaW5hbGx5IHsKLQkJZGlldCA9IG9sZDsKLQkJcmVzZXQoKTsKLQl9Ci19CiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VDb21waWxhdGlvblVuaXQoCi0JSUNvbXBpbGF0aW9uVW5pdCB1bml0LCAKLQlib29sZWFuIGZ1bGxQYXJzZSkgewotCQkKLQlib29sZWFuIG9sZCA9IGRpZXQ7CisJSUNvbXBpbGF0aW9uVW5pdCB1bml0LAorCWJvb2xlYW4gZnVsbFBhcnNlLAorCUlQcm9ncmVzc01vbml0b3IgcG0pIHsKIAorCWJvb2xlYW4gb2xkID0gdGhpcy5kaWV0OworCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBudWxsOwogCXRyeSB7Ci0JCWRpZXQgPSB0cnVlOworCQl0aGlzLmRpZXQgPSB0cnVlOwogCQl0aGlzLnJlcG9ydFJlZmVyZW5jZUluZm8gPSBmdWxsUGFyc2U7CiAJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uVW5pdFJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh1bml0LCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHBhcnNlKHVuaXQsIGNvbXBpbGF0aW9uVW5pdFJlc3VsdCk7Ci0JCWlmIChzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKLQkJCXJlcXVlc3Rvci5hY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKGNvbXBpbGF0aW9uVW5pdFJlc3VsdC5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCkpOworCQlwYXJzZWRVbml0ID0gcGFyc2UodW5pdCwgY29tcGlsYXRpb25Vbml0UmVzdWx0KTsKKwkJaWYgKHBtICE9IG51bGwgJiYgcG0uaXNDYW5jZWxlZCgpKQorCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9jYW5jZWxsZWQpOworCQlpZiAodGhpcy5zY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKKwkJCXRoaXMucmVxdWVzdG9yLmFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoY29tcGlsYXRpb25Vbml0UmVzdWx0LmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSk7CiAJCX0KIAkJaW50IGluaXRpYWxTdGFydCA9IHRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb247CiAJCWludCBpbml0aWFsRW5kID0gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uOwotCQlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSBudWxsIHx8IGZ1bGxQYXJzZSl7Ci0JCQlkaWV0ID0gZmFsc2U7Ci0JCQl0aGlzLmdldE1ldGhvZEJvZGllcyhwYXJzZWRVbml0KTsKKwkJaWYgKHRoaXMucmVwb3J0TG9jYWxEZWNsYXJhdGlvbnMgfHwgZnVsbFBhcnNlKXsKKwkJCXRoaXMuZGlldCA9IGZhbHNlOworCQkJZ2V0TWV0aG9kQm9kaWVzKHBhcnNlZFVuaXQpOwogCQl9CiAJCXRoaXMuc2Nhbm5lci5yZXNldFRvKGluaXRpYWxTdGFydCwgaW5pdGlhbEVuZCk7Ci0JCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IocGFyc2VkVW5pdCk7CisJCXRoaXMubm90aWZpZXIubm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcigKKwkJCQlwYXJzZWRVbml0LAorCQkJCXRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb24sCisJCQkJdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uLAorCQkJCXRoaXMucmVwb3J0UmVmZXJlbmNlSW5mbywKKwkJCQl0aGlzLnNvdXJjZUVuZHMsCisJCQkJdGhpcy5ub2Rlc1RvQ2F0ZWdvcmllcyk7CiAJCXJldHVybiBwYXJzZWRVbml0OwogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewogCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KIAl9IGZpbmFsbHkgewotCQlkaWV0ID0gb2xkOworCQl0aGlzLmRpZXQgPSBvbGQ7CiAJCXJlc2V0KCk7CiAJfQotCXJldHVybiBudWxsOwotfQotcHVibGljIHZvaWQgcGFyc2VUeXBlTWVtYmVyRGVjbGFyYXRpb25zKAotCUlTb3VyY2VUeXBlIHR5cGUsIAotCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgCi0JaW50IHN0YXJ0LCAKLQlpbnQgZW5kLCAKLQlib29sZWFuIG5lZWRSZWZlcmVuY2VJbmZvKSB7Ci0JYm9vbGVhbiBvbGQgPSBkaWV0OwotCQotCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uVW5pdFJlc3VsdCA9IAotCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7IAotCXRyeSB7Ci0JCWRpZXQgPSAhbmVlZFJlZmVyZW5jZUluZm87Ci0JCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBuZWVkUmVmZXJlbmNlSW5mbzsKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IAotCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKLQkJCQluZXcgSVNvdXJjZVR5cGVbXXt0eXBlfSwgCi0JCQkJLy8gbm8gbmVlZCBmb3IgZmllbGQgYW5kIG1ldGhvZHMKLQkJCQkvLyBubyBuZWVkIGZvciBtZW1iZXIgdHlwZXMKLQkJCQkvLyBubyBuZWVkIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbgotCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuTk9ORSwKLQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCi0JCQkJY29tcGlsYXRpb25Vbml0UmVzdWx0KTsgCi0JCWlmICgodW5pdCA9PSBudWxsKSB8fCAodW5pdC50eXBlcyA9PSBudWxsKSB8fCAodW5pdC50eXBlcy5sZW5ndGggIT0gMSkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuc291cmNlVHlwZSA9IHR5cGU7Ci0JCXRyeSB7Ci0JCQkvKiBhdXRvbWF0b24gaW5pdGlhbGl6YXRpb24gKi8KLQkJCWluaXRpYWxpemUoKTsKLQkJCWdvRm9yQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCk7Ci0JCQkvKiBzY2FubmVyIGluaXRpYWxpemF0aW9uICovCi0JCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2VVbml0LmdldENvbnRlbnRzKCkpOwotCQkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwotCQkJLyogdW5pdCBjcmVhdGlvbiAqLwotCQkJcmVmZXJlbmNlQ29udGV4dCA9IGNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7Ci0JCQkvKiBpbml0aWFsaXplIHRoZSBhc3RTdGFjbCAqLwotCQkJLy8gdGhlIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHR5cGUKLQkJCXB1c2hPbkFzdFN0YWNrKHVuaXQudHlwZXNbMF0pOwotCQkJLyogcnVuIGF1dG9tYXRvbiAqLwotCQkJcGFyc2UoKTsKLQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IodW5pdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl1bml0ID0gY29tcGlsYXRpb25Vbml0OwotCQkJY29tcGlsYXRpb25Vbml0ID0gbnVsbDsgLy8gcmVzZXQgcGFyc2VyCi0JCX0KLQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKLQkJLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgewotCQkJcmVxdWVzdG9yLmFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoY29tcGlsYXRpb25Vbml0UmVzdWx0LmdldExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoKSk7Ci0JCX0KLQkJZGlldCA9IG9sZDsKLQkJcmVzZXQoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHBhcnNlVHlwZU1lbWJlckRlY2xhcmF0aW9ucygKLQljaGFyW10gY29udGVudHMsIAotCWludCBzdGFydCwgCi0JaW50IGVuZCkgewotCi0JYm9vbGVhbiBvbGQgPSBkaWV0OwotCQotCXRyeSB7Ci0JCWRpZXQgPSB0cnVlOwotCi0JCS8qIGF1dG9tYXRvbiBpbml0aWFsaXphdGlvbiAqLwotCQlpbml0aWFsaXplKCk7Ci0JCWdvRm9yQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCk7Ci0JCS8qIHNjYW5uZXIgaW5pdGlhbGl6YXRpb24gKi8KLQkJc2Nhbm5lci5zZXRTb3VyY2UoY29udGVudHMpOwotCQlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKLQkJc2Nhbm5lci50YXNrVGFncyA9IG51bGw7Ci0JCXNjYW5uZXIudGFza1ByaW9yaXRpZXMgPSBudWxsOwotCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7Ci0KLQkJLyogdW5pdCBjcmVhdGlvbiAqLwotCQlyZWZlcmVuY2VDb250ZXh0ID0gbnVsbDsKLQotCQkvKiBpbml0aWFsaXplIHRoZSBhc3RTdGFjbCAqLwotCQkvLyB0aGUgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgdHlwZQotCQkvKiBydW4gYXV0b21hdG9uICovCi0JCXBhcnNlKCk7Ci0JCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKW51bGwpOwotCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewotCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KLQl9IGZpbmFsbHkgewotCQlkaWV0ID0gb2xkOwotCQlyZXNldCgpOwotCX0KLX0KLS8qCi0gKiBTb3J0IHRoZSBnaXZlbiBhc3Qgbm9kZXMgYnkgdGhlaXIgcG9zaXRpb25zLgotICovCi1wcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChBU1ROb2RlW10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgewotCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKLQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKLQlBU1ROb2RlIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdCArICAocmlnaHQgLSBsZWZ0KSAvIDJdOwotCWRvIHsKLQkJd2hpbGUgKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0uc291cmNlU3RhcnQgPCBtaWQuc291cmNlU3RhcnQpIHsKLQkJCWxlZnQrKzsKLQkJfQotCQl3aGlsZSAobWlkLnNvdXJjZVN0YXJ0IDwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0uc291cmNlU3RhcnQpIHsKLQkJCXJpZ2h0LS07Ci0JCX0KLQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCUFTVE5vZGUgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOwotCQkJbGVmdCsrOwotCQkJcmlnaHQtLTsKLQkJfQotCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKLQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKLQl9Ci0JaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOwotCX0KKwlyZXR1cm4gcGFyc2VkVW5pdDsKIH0KIHByaXZhdGUgdm9pZCByZW1lbWJlckNhdGVnb3JpZXMoKSB7CiAJaWYgKHRoaXMudXNlU291cmNlSmF2YWRvY1BhcnNlcikgewpAQCAtMTY2OCw1NyArOTYwLDkgQEAKIHByaXZhdGUgdm9pZCByZXNldCgpIHsKIAl0aGlzLnNvdXJjZUVuZHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCgpOwogCXRoaXMubm9kZXNUb0NhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCXR5cGVOYW1lcyA9IG5ldyBjaGFyWzRdW107Ci0Jc3VwZXJUeXBlTmFtZXMgPSBuZXcgY2hhcls0XVtdOwotCW5lc3RlZFR5cGVJbmRleCA9IDA7CiB9Ci1wcml2YXRlIGludCBzb3VyY2VFbmQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCkgewotCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uID0gdHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb247Ci0JCWlmIChhbGxvY2F0aW9uLnR5cGUgPT0gbnVsbCkgLy8gY2FzZSBvZiBlbnVtIGNvbnN0YW50IGJvZHkKLQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kOwotCQlyZXR1cm4gYWxsb2NhdGlvbi50eXBlLnNvdXJjZUVuZDsKLQl9IGVsc2UgewotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZDsKLQl9Ci19Ci1wcml2YXRlIHZvaWQgdmlzaXRJZk5lZWRlZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgewotCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yICE9IG51bGwgCi0JCSYmIChtZXRob2QuYml0cyAmIEFTVE5vZGUuSGFzTG9jYWxUeXBlKSAhPSAwKSB7Ci0JCQlpZiAobWV0aG9kIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgewotCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2Q7Ci0JCQkJaWYgKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKLQkJCQkJY29uc3RydWN0b3JEZWNsYXJhdGlvbi5jb25zdHJ1Y3RvckNhbGwudHJhdmVyc2UodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciwgbWV0aG9kLnNjb3BlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWV0aG9kLnN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gbWV0aG9kLnN0YXRlbWVudHMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50c0xlbmd0aDsgaSsrKQotCQkJCQltZXRob2Quc3RhdGVtZW50c1tpXS50cmF2ZXJzZSh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCBtZXRob2Quc2NvcGUpOwotCQkJfQotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIHZpc2l0SWZOZWVkZWQoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUpIHsKLQlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSBudWxsIAotCQkmJiAoZmllbGQuYml0cyAmIEFTVE5vZGUuSGFzTG9jYWxUeXBlKSAhPSAwKSB7Ci0JCQlpZiAoZmllbGQuaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IucHVzaERlY2xhcmluZ1R5cGUoZGVjbGFyaW5nVHlwZSk7Ci0JCQkJCWZpZWxkLmluaXRpYWxpemF0aW9uLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChNZXRob2RTY29wZSkgbnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvci5wb3BEZWNsYXJpbmdUeXBlKCk7Ci0JCQkJfQotCQkJfQotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIHZpc2l0SWZOZWVkZWQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKLQlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSBudWxsIAotCQkmJiAoaW5pdGlhbGl6ZXIuYml0cyAmIEFTVE5vZGUuSGFzTG9jYWxUeXBlKSAhPSAwKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZXIuYmxvY2sgIT0gbnVsbCkgewotCQkJCWluaXRpYWxpemVyLmJsb2NrLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG51bGwpOwotCQkJfQotCX0KK3B1YmxpYyB2b2lkIHNldFJlcXVlc3RvcihJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKKwl0aGlzLm5vdGlmaWVyLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRSZXF1ZXN0b3JBZGFwdGVyLmphdmEKaW5kZXggN2YzMWU4Yi4uOWU4MWRhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRSZXF1ZXN0b3JBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRSZXF1ZXN0b3JBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTAgKzExLDI5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CiAKIHB1YmxpYyBjbGFzcyBTb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlciBpbXBsZW1lbnRzIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yIHsKIAogCS8qKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0QW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY2hhcltdW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKAorCQljaGFyW11bXSB0eXBlTmFtZSwKKwkJaW50IHNvdXJjZVN0YXJ0LAorCQlpbnQgc291cmNlRW5kKSB7CisJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKKwl9CisKKwkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKGNoYXJbXSwgaW50LCBpbnQpCiAJICovCiAJcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCkBAIC0zMiwxMSArNTEsMTMgQEAKIAl9CiAKIAkvKioKLQkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEltcG9ydChpbnQsIGludCwgY2hhcltdW10sIGJvb2xlYW4sIGludCkKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEltcG9ydChpbnQsIGludCwgaW50LCBpbnQsIGNoYXJbXVtdLCBib29sZWFuLCBpbnQpCiAJICovCiAJcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KAogCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKIAkJaW50IGRlY2xhcmF0aW9uRW5kLAorCQlpbnQgbmFtZVN0YXJ0LAorCQlpbnQgbmFtZUVuZCwKIAkJY2hhcltdW10gdG9rZW5zLAogCQlib29sZWFuIG9uRGVtYW5kLAogCQlpbnQgbW9kaWZpZXJzKSB7CkBAIC02MSwxMiArODIsOSBAQAogCX0KIAogCS8qKgotCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0UGFja2FnZShpbnQsIGludCwgY2hhcltdKQorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0UGFja2FnZShJbXBvcnRSZWZlcmVuY2UpCiAJICovCi0JcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZSgKLQkJaW50IGRlY2xhcmF0aW9uU3RhcnQsCi0JCWludCBkZWNsYXJhdGlvbkVuZCwKLQkJY2hhcltdIG5hbWUpIHsKKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UpIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KIApAQCAtMTIxLDE0ICsxMzksMTQgQEAKIAlwdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKE1ldGhvZEluZm8gbWV0aG9kSW5mbykgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCi0JICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckZpZWxkKEZpZWxkSW5mbykKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVyRmllbGQoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuRmllbGRJbmZvKQogCSAqLwogCXB1YmxpYyB2b2lkIGVudGVyRmllbGQoRmllbGRJbmZvIGZpZWxkSW5mbykgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckluaXRpYWxpemVyKGludCwgaW50KQogCSAqLwpAQCAtMTM5LDExICsxNTcsMTEgQEAKIAlwdWJsaWMgdm9pZCBlbnRlck1ldGhvZChNZXRob2RJbmZvIG1ldGhvZEluZm8pIHsKIAkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGVudGVyVHlwZShUeXBlSW5mbyB0eXBlSW5mbykgewogCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0Q29tcGlsYXRpb25Vbml0KGludCkKIAkgKi8KQEAgLTE3MywxMiArMTkxLDEyIEBACiAJfQogCiAJLyoqCi0JICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0TWV0aG9kKGludCwgaW50LCBpbnQpCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0TWV0aG9kKGludCwgRXhwcmVzc2lvbikKIAkgKi8KLQlwdWJsaWMgdm9pZCBleGl0TWV0aG9kKGludCBkZWNsYXJhdGlvbkVuZCwgaW50IGRlZmF1bHRWYWx1ZVN0YXJ0LCBpbnQgZGVmYXVsdFZhbHVlRW5kKSB7CisJcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CiAJCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2V4aXRUeXBlKGludCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VKYXZhZG9jUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlSmF2YWRvY1BhcnNlci5qYXZhCmluZGV4IGM5YmQyZDAuLjZmOTY0OTcgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VKYXZhZG9jUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUphdmFkb2NQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC04Myw3ICs4Myw3IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuSmF2YWRvY1BhcnNlciNwYXJzZVNpbXBsZVRhZygpCiAgKi8KIHByb3RlY3RlZCB2b2lkIHBhcnNlU2ltcGxlVGFnKCkgewotCQorCiAJLy8gUmVhZCBmaXJzdCBjaGFyCiAJLy8gcmVhZENoYXIoKSBjb2RlIGlzIGlubGluZWQgdG8gYmFsYW5jZSBhZGRpdGlvbmFsIG1ldGhvZCBjYWxsIGluIGNoZWNrRGVwcmVjdGF0aW9uKGludCkKIAljaGFyIGZpcnN0ID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKaW5kZXggODhiZGViMi4uYTVlNGFmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiA8c3RlcGhhbkBjcy50dS1iZXJsaW4uZGU+IC0gVHlwZUNvbnZlcnRlcnMgZG9uJ3Qgc2V0IGVuY2xvc2luZ1R5cGUgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwODQxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIApAQCAtMjMsMzAgKzI0LDMwIEBACiAgKgogICovCiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRXh0cmFDb21waWxlck1vZGlmaWVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKLXB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQ29udmVydGVyIHsKLQkKLQkvKiAKK3B1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQ29udmVydGVyIGV4dGVuZHMgVHlwZUNvbnZlcnRlciB7CisKKwkvKgogCSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgY29udmVydGluZyBhbiBhbm9ueW1vdXMgdHlwZSBvZiBhIG1lbWJlciB0eXBlCiAJICogaW4gdGhpcyBjYXNlLCB3ZSBtdXN0IHBhcnNlIHRoZSBzb3VyY2UgYXMgdGhlIGVuY2xvc2luZyBpbnN0YW5jZSBjYW5ub3QgYmUgcmVjcmVhdGVkCiAJICogZnJvbSB0aGUgbW9kZWwKQEAgLTYzLDI3ICs2NCwyMSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0FORF9NRVRIT0QgPSBGSUVMRCB8IENPTlNUUlVDVE9SIHwgTUVUSE9EOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1RZUEUgPSAweDIwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCQorCiAJcHJpdmF0ZSBpbnQgZmxhZ3M7CiAJcHJpdmF0ZSBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0OwogCXByaXZhdGUgUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7CiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGN1OwogCXByaXZhdGUgY2hhcltdIHNvdXJjZTsKLQlwcml2YXRlIEhhc2hNYXAgYW5ub3RhdGlvblBvc2l0aW9uczsKLQlwcml2YXRlIGJvb2xlYW4gaGFzMV81Q29tcGxpYW5jZTsKLQkKLQlpbnQgbmFtZVBvczsKLQkKKwogCXByaXZhdGUgU291cmNlVHlwZUNvbnZlcnRlcihpbnQgZmxhZ3MsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsKKwkJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBTaWduYXR1cmUuQ19ET1QpOwogCQl0aGlzLmZsYWdzID0gZmxhZ3M7Ci0JCXRoaXMucHJvYmxlbVJlcG9ydGVyID0gcHJvYmxlbVJlcG9ydGVyOwotCQl0aGlzLmhhczFfNUNvbXBsaWFuY2UgPSBwcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNTsKIAl9CiAKIAkvKgogCSAqIENvbnZlcnQgYSBzZXQgb2Ygc291cmNlIGVsZW1lbnQgdHlwZXMgaW50byBhIHBhcnNlZCBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uCi0JICogVGhlIGFyZ3VtZW50IHR5cGVzIGFyZSB0aGVuIGFsbCBncm91cGVkIGluIHRoZSBzYW1lIHVuaXQuIFRoZSBhcmd1bWVudCB0eXBlcyBtdXN0IAorCSAqIFRoZSBhcmd1bWVudCB0eXBlcyBhcmUgdGhlbiBhbGwgZ3JvdXBlZCBpbiB0aGUgc2FtZSB1bml0LiBUaGUgYXJndW1lbnQgdHlwZXMgbXVzdAogCSAqIGF0IGxlYXN0IGNvbnRhaW4gb25lIHR5cGUuCiAJICogQ2FuIG9wdGlvbmFsbHkgaWdub3JlIGZpZWxkcyAmIG1ldGhvZHMgb3IgbWVtYmVyIHR5cGVzIG9yIGZpZWxkIGluaXRpYWxpemF0aW9uCiAJICovCkBAIC05Miw3ICs4Nyw3IEBACiAJCWludCBmbGFncywKIAkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwKIAkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKLQkJCQorCiAvLwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCQlTb3VyY2VUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBTb3VyY2VUeXBlQ29udmVydGVyKGZsYWdzLCBwcm9ibGVtUmVwb3J0ZXIpOwogCQl0cnkgewpAQCAtMTA2LDcgKzEwMSw3IEBACiAKIAkvKgogCSAqIENvbnZlcnQgYSBzZXQgb2Ygc291cmNlIGVsZW1lbnQgdHlwZXMgaW50byBhIHBhcnNlZCBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uCi0JICogVGhlIGFyZ3VtZW50IHR5cGVzIGFyZSB0aGVuIGFsbCBncm91cGVkIGluIHRoZSBzYW1lIHVuaXQuIFRoZSBhcmd1bWVudCB0eXBlcyBtdXN0IAorCSAqIFRoZSBhcmd1bWVudCB0eXBlcyBhcmUgdGhlbiBhbGwgZ3JvdXBlZCBpbiB0aGUgc2FtZSB1bml0LiBUaGUgYXJndW1lbnQgdHlwZXMgbXVzdAogCSAqIGF0IGxlYXN0IGNvbnRhaW4gb25lIHR5cGUuCiAJICovCiAJcHJpdmF0ZSBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb252ZXJ0KElTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTExNywxMSArMTEyLDEzIEBACiAJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyB0b3BMZXZlbFR5cGVJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgc291cmNlVHlwZXNbMF07CiAJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3VIYW5kbGUgPSB0b3BMZXZlbFR5cGVJbmZvLmdldEhhbmRsZSgpLmdldENvbXBpbGF0aW9uVW5pdCgpOwogCQl0aGlzLmN1ID0gKElDb21waWxhdGlvblVuaXQpIGN1SGFuZGxlOwotCQl0aGlzLmFubm90YXRpb25Qb3NpdGlvbnMgPSAoKENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvKSAoKEphdmFFbGVtZW50KSB0aGlzLmN1KS5nZXRFbGVtZW50SW5mbygpKS5hbm5vdGF0aW9uUG9zaXRpb25zOwogCi0JCWlmICh0aGlzLmhhczFfNUNvbXBsaWFuY2UgJiYgdGhpcy5hbm5vdGF0aW9uUG9zaXRpb25zICE9IG51bGwgJiYgdGhpcy5hbm5vdGF0aW9uUG9zaXRpb25zLnNpemUoKSA+IDEwKSB7IC8vIGV4cGVyaW1lbnRhbCB2YWx1ZQotCQkJLy8gaWYgbW9yZSB0aGFuIDEwIGFubm90YXRpb25zLCBkaWV0IHBhcnNlIGFzIHRoaXMgaXMgZmFzdGVyCi0JCQlyZXR1cm4gbmV3IFBhcnNlcih0aGlzLnByb2JsZW1SZXBvcnRlciwgdHJ1ZSkuZGlldFBhcnNlKHRoaXMuY3UsIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJaWYgKHRoaXMuaGFzMV81Q29tcGxpYW5jZSAmJiAoKENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvKSAoKEphdmFFbGVtZW50KSB0aGlzLmN1KS5nZXRFbGVtZW50SW5mbygpKS5hbm5vdGF0aW9uTnVtYmVyID4gMTApIHsgLy8gZXhwZXJpbWVudGFsIHZhbHVlCisJCQkvLyBJZiBtb3JlIHRoYW4gMTAgYW5ub3RhdGlvbnMsIGRpZXQgcGFyc2UgYXMgdGhpcyBpcyBmYXN0ZXIsIGJ1dCBub3QgaWYKKwkJCS8vIHRoZSBjbGllbnQgd2FudHMgbG9jYWwgYW5kIGFub255bW91cyB0eXBlcyB0byBiZSBjb252ZXJ0ZWQgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTQ3MzgpIAorCQkJaWYgKCh0aGlzLmZsYWdzICYgTE9DQUxfVFlQRSkgPT0gMCkgeworCQkJCXJldHVybiBuZXcgUGFyc2VyKHRoaXMucHJvYmxlbVJlcG9ydGVyLCB0cnVlKS5kaWV0UGFyc2UodGhpcy5jdSwgY29tcGlsYXRpb25SZXN1bHQpOworCQkJfQogCQl9CiAKIAkJLyogb25seSBwb3NpdGlvbnMgYXZhaWxhYmxlICovCkBAIC0xNDIsNyArMTM5LDcgQEAKIAkJCUlTb3VyY2VJbXBvcnQgc291cmNlSW1wb3J0ID0gKElTb3VyY2VJbXBvcnQpIGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnRJbmZvKCk7CiAJCQlTdHJpbmcgbmFtZVdpdGhvdXRTdGFyID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZVdpdGhvdXRTdGFyKCk7CiAJCQl0aGlzLnVuaXQuaW1wb3J0c1tpXSA9IGNyZWF0ZUltcG9ydFJlZmVyZW5jZSgKLQkJCQlVdGlsLnNwbGl0T24oJy4nLCBuYW1lV2l0aG91dFN0YXIsIDAsIG5hbWVXaXRob3V0U3Rhci5sZW5ndGgoKSksIAorCQkJCVV0aWwuc3BsaXRPbignLicsIG5hbWVXaXRob3V0U3RhciwgMCwgbmFtZVdpdGhvdXRTdGFyLmxlbmd0aCgpKSwKIAkJCQlzb3VyY2VJbXBvcnQuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpLAogCQkJCXNvdXJjZUltcG9ydC5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpLAogCQkJCWltcG9ydERlY2xhcmF0aW9uLmlzT25EZW1hbmQoKSwKQEAgLTE2NywxNiArMTY0LDcgQEAKIAkJCXJldHVybiBuZXcgUGFyc2VyKHRoaXMucHJvYmxlbVJlcG9ydGVyLCB0cnVlKS5wYXJzZSh0aGlzLmN1LCBjb21waWxhdGlvblJlc3VsdCk7CiAJCX0KIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZElkZW50aWZpZXJzKFN0cmluZyB0eXBlU2lnbmF0dXJlLCBpbnQgc3RhcnQsIGludCBlbmRFeGNsdXNpdmUsIGludCBpZGVudENvdW50LCBBcnJheUxpc3QgZnJhZ21lbnRzKSB7Ci0JCWlmIChpZGVudENvdW50ID09IDEpIHsKLQkJCWNoYXJbXSBpZGVudGlmaWVyOwotCQkJdHlwZVNpZ25hdHVyZS5nZXRDaGFycyhzdGFydCwgZW5kRXhjbHVzaXZlLCBpZGVudGlmaWVyID0gbmV3IGNoYXJbZW5kRXhjbHVzaXZlLXN0YXJ0XSwgMCk7Ci0JCQlmcmFnbWVudHMuYWRkKGlkZW50aWZpZXIpOwotCQl9IGVsc2UKLQkJCWZyYWdtZW50cy5hZGQoZXh0cmFjdElkZW50aWZpZXJzKHR5cGVTaWduYXR1cmUsIHN0YXJ0LCBlbmRFeGNsdXNpdmUtMSwgaWRlbnRDb3VudCkpOwotCX0KLQkKKwogCS8qCiAJICogQ29udmVydCBhbiBpbml0aWFsaXplcmluZm8gaW50byBhIHBhcnNlZCBpbml0aWFsaXplciBkZWNsYXJhdGlvbgogCSAqLwpAQCAtMjEzLDcgKzIwMSw3IEBACiAJCQl9CiAJCQlibG9jay5zdGF0ZW1lbnRzID0gc3RhdGVtZW50czsKIAkJfQotCQkKKwogCQlyZXR1cm4gaW5pdGlhbGl6ZXI7CiAJfQogCkBAIC0yNTgsNyArMjQ2LDcgQEAKIAkJCQl0aGlzLnBhcnNlci5wYXJzZShmaWVsZCwgdHlwZSwgdGhpcy51bml0LCBpbml0aWFsaXphdGlvblNvdXJjZSk7CiAJCQl9CiAJCX0KLQkJCisKIAkJLyogY29udmVyc2lvbiBvZiBsb2NhbCBhbmQgYW5vbnltb3VzIHR5cGVzICovCiAJCWlmICgodGhpcy5mbGFncyAmIExPQ0FMX1RZUEUpICE9IDApIHsKIAkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZmllbGRJbmZvLmdldENoaWxkcmVuKCk7CkBAIC0yOTQsNyArMjgyLDcgQEAKIAl9CiAKIAkvKgotCSAqIENvbnZlcnQgYSBtZXRob2Qgc291cmNlIGVsZW1lbnQgaW50byBhIHBhcnNlZCBtZXRob2QvY29uc3RydWN0b3IgZGVjbGFyYXRpb24gCisJICogQ29udmVydCBhIG1ldGhvZCBzb3VyY2UgZWxlbWVudCBpbnRvIGEgcGFyc2VkIG1ldGhvZC9jb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgogCSAqLwogCXByaXZhdGUgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBjb252ZXJ0KFNvdXJjZU1ldGhvZCBtZXRob2RIYW5kbGUsIFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvIG1ldGhvZEluZm8sIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2Q7CkBAIC0zMDMsMjMgKzI5MSwyNiBAQAogCQlpbnQgc3RhcnQgPSBtZXRob2RJbmZvLmdldE5hbWVTb3VyY2VTdGFydCgpOwogCQlpbnQgZW5kID0gbWV0aG9kSW5mby5nZXROYW1lU291cmNlRW5kKCk7CiAKLQkJLy8gY29udmVydCAxLjUgc3BlY2lmaWMgY29uc3RydWN0cyBvbmx5IGlmIGNvbXBsaWFuY2UgaXMgMS41IG9yIGFib3ZlCisJCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4NTAsIEV2ZW4gd2hlbiB0aGlzIHR5cGUgaXMgYmVpbmcgY29uc3RydWN0ZWQKKwkJICAgb24gYmVoYWxmIG9mIGEgMS40IHByb2plY3Qgd2UgbXVzdCBpbnRlcm5hbGl6ZSB0eXBlIHZhcmlhYmxlcyBwcm9wZXJseSBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisJCSAgIHJlY29nbml6ZSB1c2FnZXMgb2YgdGhlbSBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSwgdG8gYXBwbHkgc3Vic3RpdHV0aW9ucyBhbmQgdGh1cyB0byBiZSBhYmxlIHRvCisJCSAgIGRldGVjdCBvdmVycmlkaW5nIGluIHRoZSBwcmVzZW5jZSBvZiBnZW5lcmljcy4gSWYgd2Ugc2ltcGx5IGRyb3AgdGhlbSwgd2hlbiB0aGUgbWV0aG9kIHNpZ25hdHVyZQorCQkgICByZWZlcnMgdG8gdGhlIHR5cGUgcGFyYW1ldGVyLCB3ZSB3b24ndCBrbm93IGl0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgYW5kIHBlcmZvcm0KKwkJICAgaW5jb3JyZWN0IGxvb2t1cCBhbmQgbWF5IG1pc3Rha2VubHkgZW5kIHVwIHdpdGggbWlzc2luZyB0eXBlcworCQkgKi8KIAkJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbXMgPSBudWxsOwotCQlpZiAodGhpcy5oYXMxXzVDb21wbGlhbmNlKSB7Ci0JCQkvKiBjb252ZXJ0IHR5cGUgcGFyYW1ldGVycyAqLwotCQkJY2hhcltdW10gdHlwZVBhcmFtZXRlck5hbWVzID0gbWV0aG9kSW5mby5nZXRUeXBlUGFyYW1ldGVyTmFtZXMoKTsKLQkJCWlmICh0eXBlUGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgewotCQkJCWludCBwYXJhbWV0ZXJDb3VudCA9IHR5cGVQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7Ci0JCQkJaWYgKHBhcmFtZXRlckNvdW50ID4gMCkgeyAvLyBtZXRob2QncyB0eXBlIHBhcmFtZXRlcnMgbXVzdCBiZSBudWxsIGlmIG5vIHR5cGUgcGFyYW1ldGVyCi0JCQkJCWNoYXJbXVtdW10gdHlwZVBhcmFtZXRlckJvdW5kcyA9IG1ldGhvZEluZm8uZ2V0VHlwZVBhcmFtZXRlckJvdW5kcygpOwotCQkJCQl0eXBlUGFyYW1zID0gbmV3IFR5cGVQYXJhbWV0ZXJbcGFyYW1ldGVyQ291bnRdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsKLQkJCQkJCXR5cGVQYXJhbXNbaV0gPSBjcmVhdGVUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJOYW1lc1tpXSwgdHlwZVBhcmFtZXRlckJvdW5kc1tpXSwgc3RhcnQsIGVuZCk7Ci0JCQkJCX0KKwkJY2hhcltdW10gdHlwZVBhcmFtZXRlck5hbWVzID0gbWV0aG9kSW5mby5nZXRUeXBlUGFyYW1ldGVyTmFtZXMoKTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7CisJCQlpbnQgcGFyYW1ldGVyQ291bnQgPSB0eXBlUGFyYW1ldGVyTmFtZXMubGVuZ3RoOworCQkJaWYgKHBhcmFtZXRlckNvdW50ID4gMCkgeyAvLyBtZXRob2QncyB0eXBlIHBhcmFtZXRlcnMgbXVzdCBiZSBudWxsIGlmIG5vIHR5cGUgcGFyYW1ldGVyCisJCQkJY2hhcltdW11bXSB0eXBlUGFyYW1ldGVyQm91bmRzID0gbWV0aG9kSW5mby5nZXRUeXBlUGFyYW1ldGVyQm91bmRzKCk7CisJCQkJdHlwZVBhcmFtcyA9IG5ldyBUeXBlUGFyYW1ldGVyW3BhcmFtZXRlckNvdW50XTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsKKwkJCQkJdHlwZVBhcmFtc1tpXSA9IGNyZWF0ZVR5cGVQYXJhbWV0ZXIodHlwZVBhcmFtZXRlck5hbWVzW2ldLCB0eXBlUGFyYW1ldGVyQm91bmRzW2ldLCBzdGFydCwgZW5kKTsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJCisKIAkJaW50IG1vZGlmaWVycyA9IG1ldGhvZEluZm8uZ2V0TW9kaWZpZXJzKCk7CiAJCWlmIChtZXRob2RJbmZvLmlzQ29uc3RydWN0b3IoKSkgewogCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBkZWNsID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOwpAQCAtMzU0LDEzICszNDUsMTMgQEAKIAkJCX0gZWxzZSB7CiAJCQkJZGVjbCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbihjb21waWxhdGlvblJlc3VsdCk7CiAJCQl9Ci0JCQkKKwogCQkJLy8gY29udmVydCByZXR1cm4gdHlwZQogCQkJZGVjbC5yZXR1cm5UeXBlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShtZXRob2RJbmZvLmdldFJldHVyblR5cGVOYW1lKCksIHN0YXJ0LCBlbmQpOwotCQkJCisKIAkJCS8vIHR5cGUgcGFyYW1ldGVycwogCQkJZGVjbC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbXM7Ci0JCQkKKwogCQkJbWV0aG9kID0gZGVjbDsKIAkJfQogCQltZXRob2Quc2VsZWN0b3IgPSBtZXRob2RIYW5kbGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOwpAQCAtNDA5LDcgKzQwMCw3IEBACiAJCQkJCWNyZWF0ZVR5cGVSZWZlcmVuY2UoZXhjZXB0aW9uVHlwZU5hbWVzW2ldLCBzdGFydCwgZW5kKTsKIAkJCX0KIAkJfQotCQkKKwogCQkvKiBjb252ZXJ0IGxvY2FsIGFuZCBhbm9ueW1vdXMgdHlwZXMgKi8KIAkJaWYgKCh0aGlzLmZsYWdzICYgTE9DQUxfVFlQRSkgIT0gMCkgewogCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBtZXRob2RJbmZvLmdldENoaWxkcmVuKCk7CkBAIC00MzMsNyArNDI0LDcgQEAKIAkJCQltZXRob2Quc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7CiAJCQl9CiAJCX0KLQkJCisKIAkJcmV0dXJuIG1ldGhvZDsKIAl9CiAKQEAgLTQ2OSwyNyArNDYwLDMwIEBACiAJCXR5cGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHR5cGVJbmZvLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKIAkJdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHR5cGVJbmZvLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7CiAJCXR5cGUuYm9keUVuZCA9IHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci0JCQorCiAJCS8vIGNvbnZlcnQgMS41IHNwZWNpZmljIGNvbnN0cnVjdHMgb25seSBpZiBjb21wbGlhbmNlIGlzIDEuNSBvciBhYm92ZQogCQlpZiAodGhpcy5oYXMxXzVDb21wbGlhbmNlKSB7CiAJCQkvKiBjb252ZXJ0IGFubm90YXRpb25zICovCiAJCQl0eXBlLmFubm90YXRpb25zID0gY29udmVydEFubm90YXRpb25zKHR5cGVIYW5kbGUpOwotCQotCQkJLyogY29udmVydCB0eXBlIHBhcmFtZXRlcnMgKi8KLQkJCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJOYW1lcyA9IHR5cGVJbmZvLmdldFR5cGVQYXJhbWV0ZXJOYW1lcygpOwotCQkJaWYgKHR5cGVQYXJhbWV0ZXJOYW1lcy5sZW5ndGggPiAwKSB7Ci0JCQkJaW50IHBhcmFtZXRlckNvdW50ID0gdHlwZVBhcmFtZXRlck5hbWVzLmxlbmd0aDsKLQkJCQljaGFyW11bXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMgPSB0eXBlSW5mby5nZXRUeXBlUGFyYW1ldGVyQm91bmRzKCk7Ci0JCQkJdHlwZS50eXBlUGFyYW1ldGVycyA9IG5ldyBUeXBlUGFyYW1ldGVyW3BhcmFtZXRlckNvdW50XTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsKLQkJCQkJdHlwZS50eXBlUGFyYW1ldGVyc1tpXSA9IGNyZWF0ZVR5cGVQYXJhbWV0ZXIodHlwZVBhcmFtZXRlck5hbWVzW2ldLCB0eXBlUGFyYW1ldGVyQm91bmRzW2ldLCBzdGFydCwgZW5kKTsKLQkJCQl9CisJCX0KKwkJLyogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg1MCwgZXZlbiBpbiBhIDEuNCBwcm9qZWN0LCB3ZQorCQkgICBtdXN0IGludGVybmFsaXplIHR5cGUgdmFyaWFibGVzIGFuZCBvYnNlcnZlIGFueSBwYXJhbWV0ZXJpemF0aW9uIG9mIHN1cGVyIGNsYXNzCisJCSAgIGFuZC9vciBzdXBlciBpbnRlcmZhY2VzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGV0ZWN0IG92ZXJyaWRpbmcgaW4gdGhlIHByZXNlbmNlCisJCSAgIG9mIGdlbmVyaWNzLgorCQkgKi8KKwkJY2hhcltdW10gdHlwZVBhcmFtZXRlck5hbWVzID0gdHlwZUluZm8uZ2V0VHlwZVBhcmFtZXRlck5hbWVzKCk7CisJCWlmICh0eXBlUGFyYW1ldGVyTmFtZXMubGVuZ3RoID4gMCkgeworCQkJaW50IHBhcmFtZXRlckNvdW50ID0gdHlwZVBhcmFtZXRlck5hbWVzLmxlbmd0aDsKKwkJCWNoYXJbXVtdW10gdHlwZVBhcmFtZXRlckJvdW5kcyA9IHR5cGVJbmZvLmdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoKTsKKwkJCXR5cGUudHlwZVBhcmFtZXRlcnMgPSBuZXcgVHlwZVBhcmFtZXRlcltwYXJhbWV0ZXJDb3VudF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsKKwkJCQl0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldID0gY3JlYXRlVHlwZVBhcmFtZXRlcih0eXBlUGFyYW1ldGVyTmFtZXNbaV0sIHR5cGVQYXJhbWV0ZXJCb3VuZHNbaV0sIHN0YXJ0LCBlbmQpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8qIHNldCBzdXBlcmNsYXNzIGFuZCBzdXBlcmludGVyZmFjZXMgKi8KIAkJaWYgKHR5cGVJbmZvLmdldFN1cGVyY2xhc3NOYW1lKCkgIT0gbnVsbCkgewotCQkJdHlwZS5zdXBlcmNsYXNzID0gY3JlYXRlVHlwZVJlZmVyZW5jZSh0eXBlSW5mby5nZXRTdXBlcmNsYXNzTmFtZSgpLCBzdGFydCwgZW5kKTsKKwkJCXR5cGUuc3VwZXJjbGFzcyA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UodHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSwgc3RhcnQsIGVuZCwgdHJ1ZSAvKiBpbmNsdWRlIGdlbmVyaWNzICovKTsKIAkJCXR5cGUuc3VwZXJjbGFzcy5iaXRzIHw9IEFTVE5vZGUuSXNTdXBlclR5cGU7CiAJCX0KIAkJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSB0eXBlSW5mby5nZXRJbnRlcmZhY2VOYW1lcygpOwpAQCAtNDk3LDcgKzQ5MSw3IEBACiAJCWlmIChpbnRlcmZhY2VDb3VudCA+IDApIHsKIAkJCXR5cGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbaW50ZXJmYWNlQ291bnRdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VDb3VudDsgaSsrKSB7Ci0JCQkJdHlwZS5zdXBlckludGVyZmFjZXNbaV0gPSBjcmVhdGVUeXBlUmVmZXJlbmNlKGludGVyZmFjZU5hbWVzW2ldLCBzdGFydCwgZW5kKTsKKwkJCQl0eXBlLnN1cGVySW50ZXJmYWNlc1tpXSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50ZXJmYWNlTmFtZXNbaV0sIHN0YXJ0LCBlbmQsIHRydWUgLyogaW5jbHVkZSBnZW5lcmljcyAqLyk7CiAJCQkJdHlwZS5zdXBlckludGVyZmFjZXNbaV0uYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwogCQkJfQogCQl9CkBAIC01MDgsNiArNTAyLDcgQEAKIAkJCXR5cGUubWVtYmVyVHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW3NvdXJjZU1lbWJlclR5cGVDb3VudF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU1lbWJlclR5cGVDb3VudDsgaSsrKSB7CiAJCQkJdHlwZS5tZW1iZXJUeXBlc1tpXSA9IGNvbnZlcnQoc291cmNlTWVtYmVyVHlwZXNbaV0sIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCQl0eXBlLm1lbWJlclR5cGVzW2ldLmVuY2xvc2luZ1R5cGUgPSB0eXBlOwogCQkJfQogCQl9CiAKQEAgLTU0MCwxMCArNTM1LDEwIEBACiAJCWJvb2xlYW4gbmVlZENvbnN0cnVjdG9yID0gKHRoaXMuZmxhZ3MgJiBDT05TVFJVQ1RPUikgIT0gMDsKIAkJYm9vbGVhbiBuZWVkTWV0aG9kID0gKHRoaXMuZmxhZ3MgJiBNRVRIT0QpICE9IDA7CiAJCWlmIChuZWVkQ29uc3RydWN0b3IgfHwgbmVlZE1ldGhvZCkgewotCQkJCisKIAkJCVNvdXJjZU1ldGhvZFtdIHNvdXJjZU1ldGhvZHMgPSB0eXBlSW5mby5nZXRNZXRob2RIYW5kbGVzKCk7CiAJCQlpbnQgc291cmNlTWV0aG9kQ291bnQgPSBzb3VyY2VNZXRob2RzLmxlbmd0aDsKLQkKKwogCQkJLyogc291cmNlIHR5cGUgaGFzIGEgY29uc3RydWN0b3IgPyAgICAgICAgICAgKi8KIAkJCS8qIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IG9uZSBpcyBuZWVkZWQuICovCiAJCQlpbnQgZXh0cmFDb25zdHJ1Y3RvciA9IDA7CkBAIC01ODAsNyArNTc1LDcgQEAKIAkJCQl9CiAJCQkJaWYgKChpc0NvbnN0cnVjdG9yICYmIG5lZWRDb25zdHJ1Y3RvcikgfHwgKCFpc0NvbnN0cnVjdG9yICYmIG5lZWRNZXRob2QpKSB7CiAJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gY29udmVydChzb3VyY2VNZXRob2QsIG1ldGhvZEluZm8sIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJCQkJaWYgKGlzQWJzdHJhY3QgfHwgbWV0aG9kLmlzQWJzdHJhY3QoKSkgeyAvLyBmaXgtdXAgZmxhZyAKKwkJCQkJaWYgKGlzQWJzdHJhY3QgfHwgbWV0aG9kLmlzQWJzdHJhY3QoKSkgeyAvLyBmaXgtdXAgZmxhZwogCQkJCQkJbWV0aG9kLm1vZGlmaWVycyB8PSBFeHRyYUNvbXBpbGVyTW9kaWZpZXJzLkFjY1NlbWljb2xvbkJvZHk7CiAJCQkJCX0KIAkJCQkJdHlwZS5tZXRob2RzW2V4dHJhQ29uc3RydWN0b3IgKyBpbmRleCsrXSA9IG1ldGhvZDsKQEAgLTU4OCw1NTIgKzU4Myw0OSBAQAogCQkJfQogCQkJaWYgKGhhc0Fic3RyYWN0TWV0aG9kcykgdHlwZS5iaXRzIHw9IEFTVE5vZGUuSGFzQWJzdHJhY3RNZXRob2RzOwogCQl9Ci0JCQorCiAJCXJldHVybiB0eXBlOwogCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25bXSBjb252ZXJ0QW5ub3RhdGlvbnMoSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAodGhpcy5hbm5vdGF0aW9uUG9zaXRpb25zID09IG51bGwpIHJldHVybiBudWxsOwotCQljaGFyW10gY3VTb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJbG9uZ1tdIHBvc2l0aW9ucyA9IChsb25nW10pIHRoaXMuYW5ub3RhdGlvblBvc2l0aW9ucy5nZXQoZWxlbWVudCk7Ci0JCWlmIChwb3NpdGlvbnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoOwotCQlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5ndGhdOwotCQlpbnQgcmVjb3JkZWRBbm5vdGF0aW9ucyA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWxvbmcgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQlpbnQgc3RhcnQgPSAoaW50KSAocG9zaXRpb24gPj4+IDMyKTsKLQkJCWludCBlbmQgPSAoaW50KSBwb3NpdGlvbjsKLQkJCWNoYXJbXSBhbm5vdGF0aW9uU291cmNlID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjdVNvdXJjZSwgc3RhcnQsIGVuZCsxKTsKLQkJCWlmIChhbm5vdGF0aW9uU291cmNlICE9IG51bGwpIHsKLSAgICAJCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZU1lbWJlclZhbHVlKGFubm90YXRpb25Tb3VyY2UpOwotICAgIAkJCS8qCi0gICAgCQkJICogZXhwcmVzc2lvbiBjYW4gYmUgbnVsbCBvciBub3QgYW4gYW5ub3RhdGlvbiBpZiB0aGUgc291cmNlIGhhcyBjaGFuZ2VkIGJldHdlZW4KLSAgICAJCQkgKiB0aGUgbW9tZW50IHdoZXJlIHRoZSBhbm5vdGF0aW9uIHNvdXJjZSBwb3NpdGlvbnMgaGF2ZSBiZWVuIHJldHJpZXZlZCBhbmQgdGhlIG1vbWVudCB3ZXJlCi0gICAgCQkJICogdGhpcyBwYXJzaW5nIG9jY3VyZWQuCi0gICAgCQkJICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDkxNgotICAgIAkJCSAqLwotICAgIAkJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgIAkJCQlhbm5vdGF0aW9uc1tyZWNvcmRlZEFubm90YXRpb25zKytdID0gKEFubm90YXRpb24pIGV4cHJlc3Npb247Ci0gICAgCQkJfQorCisJcHJpdmF0ZSBBbm5vdGF0aW9uW10gY29udmVydEFubm90YXRpb25zKElBbm5vdGF0YWJsZSBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaW50IGxlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aDsKKwkJQW5ub3RhdGlvbltdIGFzdEFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bbGVuZ3RoXTsKKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCWNoYXJbXSBjdVNvdXJjZSA9IGdldFNvdXJjZSgpOworCQkJaW50IHJlY29yZGVkQW5ub3RhdGlvbnMgPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlTb3VyY2VSYW5nZSBwb3NpdGlvbnMgPSBhbm5vdGF0aW9uc1tpXS5nZXRTb3VyY2VSYW5nZSgpOworCQkJCWludCBzdGFydCA9IHBvc2l0aW9ucy5nZXRPZmZzZXQoKTsKKwkJCQlpbnQgZW5kID0gc3RhcnQgKyBwb3NpdGlvbnMuZ2V0TGVuZ3RoKCk7CisJCQkJY2hhcltdIGFubm90YXRpb25Tb3VyY2UgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGN1U291cmNlLCBzdGFydCwgZW5kKTsKKwkJCQlpZiAoYW5ub3RhdGlvblNvdXJjZSAhPSBudWxsKSB7CisJICAgIAkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlTWVtYmVyVmFsdWUoYW5ub3RhdGlvblNvdXJjZSk7CisJICAgIAkJCS8qCisJICAgIAkJCSAqIGV4cHJlc3Npb24gY2FuIGJlIG51bGwgb3Igbm90IGFuIGFubm90YXRpb24gaWYgdGhlIHNvdXJjZSBoYXMgY2hhbmdlZCBiZXR3ZWVuCisJICAgIAkJCSAqIHRoZSBtb21lbnQgd2hlcmUgdGhlIGFubm90YXRpb24gc291cmNlIHBvc2l0aW9ucyBoYXZlIGJlZW4gcmV0cmlldmVkIGFuZCB0aGUgbW9tZW50IHdlcmUKKwkgICAgCQkJICogdGhpcyBwYXJzaW5nIG9jY3VycmVkLgorCSAgICAJCQkgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwOTE2CisJICAgIAkJCSAqLworCSAgICAJCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKKwkgICAgCQkJCWFzdEFubm90YXRpb25zW3JlY29yZGVkQW5ub3RhdGlvbnMrK10gPSAoQW5ub3RhdGlvbikgZXhwcmVzc2lvbjsKKwkgICAgCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChsZW5ndGggIT0gcmVjb3JkZWRBbm5vdGF0aW9ucykgeworCQkJCS8vIHJlc2l6ZSB0byByZW1vdmUgbnVsbCBhbm5vdGF0aW9ucworCQkJCVN5c3RlbS5hcnJheWNvcHkoYXN0QW5ub3RhdGlvbnMsIDAsIChhc3RBbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW3JlY29yZGVkQW5ub3RhdGlvbnNdKSwgMCwgcmVjb3JkZWRBbm5vdGF0aW9ucyk7CiAJCQl9CiAJCX0KLQkJaWYgKGxlbmd0aCAhPSByZWNvcmRlZEFubm90YXRpb25zKSB7Ci0JCQkvLyByZXNpemUgdG8gcmVtb3ZlIG51bGwgYW5ub3RhdGlvbnMKLQkJCVN5c3RlbS5hcnJheWNvcHkoYW5ub3RhdGlvbnMsIDAsIChhbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW3JlY29yZGVkQW5ub3RhdGlvbnNdKSwgMCwgcmVjb3JkZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb25zOworCQlyZXR1cm4gYXN0QW5ub3RhdGlvbnM7CiAJfQogCi0JLyoKLQkgKiBCdWlsZCBhbiBpbXBvcnQgcmVmZXJlbmNlIGZyb20gYW4gaW1wb3J0IG5hbWUsIGUuZy4gamF2YS5sYW5nLioKLQkgKi8KLQlwcml2YXRlIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVJbXBvcnRSZWZlcmVuY2UoCi0JCVN0cmluZ1tdIGltcG9ydE5hbWUsCi0JCWludCBzdGFydCwKLQkJaW50IGVuZCwgCi0JCWJvb2xlYW4gb25EZW1hbmQsCi0JCWludCBtb2RpZmllcnMpIHsKLQkKLQkJaW50IGxlbmd0aCA9IGltcG9ydE5hbWUubGVuZ3RoOwotCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKLQkJbG9uZyBwb3NpdGlvbiA9ICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kOwotCQljaGFyW11bXSBxSW1wb3J0TmFtZSA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcUltcG9ydE5hbWVbaV0gPSBpbXBvcnROYW1lW2ldLnRvQ2hhckFycmF5KCk7Ci0JCQlwb3NpdGlvbnNbaV0gPSBwb3NpdGlvbjsgLy8gZHVtbXkgcG9zaXRpb25zCi0JCX0KLQkJcmV0dXJuIG5ldyBJbXBvcnRSZWZlcmVuY2UoCi0JCQlxSW1wb3J0TmFtZSwKLQkJCXBvc2l0aW9ucywKLQkJCW9uRGVtYW5kLAotCQkJbW9kaWZpZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFR5cGVQYXJhbWV0ZXIgY3JlYXRlVHlwZVBhcmFtZXRlcihjaGFyW10gdHlwZVBhcmFtZXRlck5hbWUsIGNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMsIGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCVR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFR5cGVQYXJhbWV0ZXIoKTsKLQkJcGFyYW1ldGVyLm5hbWUgPSB0eXBlUGFyYW1ldGVyTmFtZTsKLQkJcGFyYW1ldGVyLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7Ci0JCXBhcmFtZXRlci5zb3VyY2VFbmQgPSBlbmQ7Ci0JCWlmICh0eXBlUGFyYW1ldGVyQm91bmRzICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSB0eXBlUGFyYW1ldGVyQm91bmRzLmxlbmd0aDsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJcGFyYW1ldGVyLnR5cGUgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXJCb3VuZHNbMF0sIHN0YXJ0LCBlbmQpOwotCQkJCWlmIChsZW5ndGggPiAxKSB7Ci0JCQkJCXBhcmFtZXRlci5ib3VuZHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGgtMV07Ci0JCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCVR5cGVSZWZlcmVuY2UgYm91bmQgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXJCb3VuZHNbaV0sIHN0YXJ0LCBlbmQpOwotCQkJCQkJYm91bmQuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOwotCQkJCQkJcGFyYW1ldGVyLmJvdW5kc1tpLTFdID0gYm91bmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlcjsKLQl9Ci0JCi0JLyoKLQkgKiBCdWlsZCBhIHR5cGUgcmVmZXJlbmNlIGZyb20gYSByZWFkYWJsZSBuYW1lLCBlLmcuIGphdmEubGFuZy5PYmplY3RbXVtdCi0JICovCi0JcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoCi0JCWNoYXJbXSB0eXBlTmFtZSwKLQkJaW50IHN0YXJ0LAotCQlpbnQgZW5kKSB7Ci0KLQkJaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKLQkJdGhpcy5uYW1lUG9zID0gMDsKLQkJcmV0dXJuIGRlY29kZVR5cGUodHlwZU5hbWUsIGxlbmd0aCwgc3RhcnQsIGVuZCk7Ci0JfQotCQotCS8qCi0JICogQnVpbGQgYSB0eXBlIHJlZmVyZW5jZSBmcm9tIGEgdHlwZSBzaWduYXR1cmUsIGUuZy4gTGphdmEubGFuZy5PYmplY3Q7Ci0JICovCi0JcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoCi0JCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSwKLQkJCWludCBzdGFydCwKLQkJCWludCBlbmQpIHsKLQkJCi0JCWludCBsZW5ndGggPSB0eXBlU2lnbmF0dXJlLmxlbmd0aCgpOwotCQl0aGlzLm5hbWVQb3MgPSAwOwotCQlyZXR1cm4gZGVjb2RlVHlwZSh0eXBlU2lnbmF0dXJlLCBsZW5ndGgsIHN0YXJ0LCBlbmQpOwotCX0KLQkKLQlwcml2YXRlIFR5cGVSZWZlcmVuY2UgZGVjb2RlVHlwZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgaW50IGxlbmd0aCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBpZGVudENvdW50ID0gMTsKLQkJaW50IGRpbSA9IDA7Ci0JCWludCBuYW1lRnJhZ21lbnRTdGFydCA9IHRoaXMubmFtZVBvcywgbmFtZUZyYWdtZW50RW5kID0gLTE7Ci0JCWJvb2xlYW4gbmFtZVN0YXJ0ZWQgPSBmYWxzZTsKLQkJQXJyYXlMaXN0IGZyYWdtZW50cyA9IG51bGw7Ci0JCXR5cGVMb29wOiB3aGlsZSAodGhpcy5uYW1lUG9zIDwgbGVuZ3RoKSB7Ci0JCQljaGFyIGN1cnJlbnRDaGFyID0gdHlwZVNpZ25hdHVyZS5jaGFyQXQodGhpcy5uYW1lUG9zKTsKLQkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKLQkJCQljYXNlIFNpZ25hdHVyZS5DX0JPT0xFQU4gOgotCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7Ci0JCQkJCQl0aGlzLm5hbWVQb3MrKzsKLQkJCQkJCWlmIChkaW0gPT0gMCkKLQkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQk9PTEVBTi5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQk9PTEVBTi5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJfSAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19CWVRFIDoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCQlpZiAoZGltID09IDApCi0JCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkJZVEUuc2ltcGxlTmFtZSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkJZVEUuc2ltcGxlTmFtZSwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CQkJCQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfQ0hBUiA6Ci0JCQkJCWlmICghbmFtZVN0YXJ0ZWQpIHsKLQkJCQkJCXRoaXMubmFtZVBvcysrOwotCQkJCQkJaWYgKGRpbSA9PSAwKQotCQkJCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5DSEFSLnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5DSEFSLnNpbXBsZU5hbWUsIGRpbSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfRE9VQkxFIDoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCQlpZiAoZGltID09IDApCi0JCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkRPVUJMRS5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuRE9VQkxFLnNpbXBsZU5hbWUsIGRpbSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwkJCQkKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNpZ25hdHVyZS5DX0ZMT0FUIDoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCQlpZiAoZGltID09IDApCi0JCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkZMT0FULnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5GTE9BVC5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsJCQkJCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19JTlQgOgotCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7Ci0JCQkJCQl0aGlzLm5hbWVQb3MrKzsKLQkJCQkJCWlmIChkaW0gPT0gMCkKLQkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuSU5ULnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5JTlQuc2ltcGxlTmFtZSwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CQkJCQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfTE9ORyA6Ci0JCQkJCWlmICghbmFtZVN0YXJ0ZWQpIHsKLQkJCQkJCXRoaXMubmFtZVBvcysrOwotCQkJCQkJaWYgKGRpbSA9PSAwKQotCQkJCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5MT05HLnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5MT05HLnNpbXBsZU5hbWUsIGRpbSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwkJCQkKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNpZ25hdHVyZS5DX1NIT1JUIDoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCQlpZiAoZGltID09IDApCi0JCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLlNIT1JULnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5TSE9SVC5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsJCQkJCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19WT0lEIDoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCQluZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5WT0lELnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNpZ25hdHVyZS5DX1JFU09MVkVEIDoKLQkJCQljYXNlIFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgOgotCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7Ci0JCQkJCQluYW1lRnJhZ21lbnRTdGFydCA9IHRoaXMubmFtZVBvcysxOwotCQkJCQkJbmFtZVN0YXJ0ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUjoKLQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCVdpbGRjYXJkIHJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5VTkJPVU5EKTsKLQkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19FWFRFTkRTOgotCQkJCQl0aGlzLm5hbWVQb3MrKzsKLQkJCQkJcmVzdWx0ID0gbmV3IFdpbGRjYXJkKFdpbGRjYXJkLkVYVEVORFMpOwotCQkJCQlyZXN1bHQuYm91bmQgPSBkZWNvZGVUeXBlKHR5cGVTaWduYXR1cmUsIGxlbmd0aCwgc3RhcnQsIGVuZCk7Ci0JCQkJCXJlc3VsdC5zb3VyY2VTdGFydCA9IHN0YXJ0OwotCQkJCQlyZXN1bHQuc291cmNlRW5kID0gZW5kOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfU1VQRVI6Ci0JCQkJCXRoaXMubmFtZVBvcysrOwotCQkJCQlyZXN1bHQgPSBuZXcgV2lsZGNhcmQoV2lsZGNhcmQuU1VQRVIpOwotCQkJCQlyZXN1bHQuYm91bmQgPSBkZWNvZGVUeXBlKHR5cGVTaWduYXR1cmUsIGxlbmd0aCwgc3RhcnQsIGVuZCk7Ci0JCQkJCXJlc3VsdC5zb3VyY2VTdGFydCA9IHN0YXJ0OwotCQkJCQlyZXN1bHQuc291cmNlRW5kID0gZW5kOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfQVJSQVkgOgotCQkJCQlkaW0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19HRU5FUklDX0VORCA6Ci0JCQkJY2FzZSBTaWduYXR1cmUuQ19TRU1JQ09MT04gOgotCQkJCQluYW1lRnJhZ21lbnRFbmQgPSB0aGlzLm5hbWVQb3MtMTsKLQkJCQkJdGhpcy5uYW1lUG9zKys7Ci0JCQkJCWJyZWFrIHR5cGVMb29wOwotCQkJCWNhc2UgU2lnbmF0dXJlLkNfRE9UIDoKLQkJCQljYXNlIFNpZ25hdHVyZS5DX0RPTExBUjoKLQkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgewotCQkJCQkJbmFtZUZyYWdtZW50U3RhcnQgPSB0aGlzLm5hbWVQb3MrMTsKLQkJCQkJCW5hbWVTdGFydGVkID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIGlmICh0aGlzLm5hbWVQb3MgPiBuYW1lRnJhZ21lbnRTdGFydCkgLy8gaGFuZGxlIG5hbWUgc3RhcnRpbmcgd2l0aCBhICQgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3MDkpCi0JCQkJCQlpZGVudENvdW50ICsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQgOgotCQkJCQluYW1lRnJhZ21lbnRFbmQgPSB0aGlzLm5hbWVQb3MtMTsKLQkJCQkJLy8gY29udmVydCAxLjUgc3BlY2lmaWMgY29uc3RydWN0cyBvbmx5IGlmIGNvbXBsaWFuY2UgaXMgMS41IG9yIGFib3ZlCi0JCQkJCWlmICghdGhpcy5oYXMxXzVDb21wbGlhbmNlKSAKLQkJCQkJCWJyZWFrIHR5cGVMb29wOwotCQkJCQlpZiAoZnJhZ21lbnRzID09IG51bGwpIGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCWFkZElkZW50aWZpZXJzKHR5cGVTaWduYXR1cmUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQgKyAxLCBpZGVudENvdW50LCBmcmFnbWVudHMpOwotCQkJCQl0aGlzLm5hbWVQb3MrKzsgLy8gc2tpcCAnPCcKLQkJCQkJVHlwZVJlZmVyZW5jZVtdIGFyZ3VtZW50cyA9IGRlY29kZVR5cGVBcmd1bWVudHModHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsgLy8gcG9zaXRpb25uZWQgb24gJz4nIGF0IGVuZAotCQkJCQlmcmFnbWVudHMuYWRkKGFyZ3VtZW50cyk7Ci0JCQkJCWlkZW50Q291bnQgPSAxOwotCQkJCQluYW1lU3RhcnRlZCA9IGZhbHNlOwotCQkJCQkvLyBuZXh0IGluY3JlbWVudCB3aWxsIHNraXAgJz4nCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJdGhpcy5uYW1lUG9zKys7Ci0JCX0KLQkJaWYgKGZyYWdtZW50cyA9PSBudWxsKSB7IC8vIG5vbiBwYXJhbWV0ZXJpemVkIAotCQkJLyogcmVidWlsZCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLwotCQkJaWYgKGlkZW50Q291bnQgPT0gMSkgeyAvLyBzaW1wbGUgdHlwZSByZWZlcmVuY2UKLQkJCQlpZiAoZGltID09IDApIHsKLQkJCQkJY2hhcltdIG5hbWVGcmFnbWVudCA9IG5ldyBjaGFyW25hbWVGcmFnbWVudEVuZCAtIG5hbWVGcmFnbWVudFN0YXJ0ICsgMV07Ci0JCQkJCXR5cGVTaWduYXR1cmUuZ2V0Q2hhcnMobmFtZUZyYWdtZW50U3RhcnQsIG5hbWVGcmFnbWVudEVuZCArMSwgbmFtZUZyYWdtZW50LCAwKTsKLQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoYXJbXSBuYW1lRnJhZ21lbnQgPSBuZXcgY2hhcltuYW1lRnJhZ21lbnRFbmQgLSBuYW1lRnJhZ21lbnRTdGFydCArIDFdOwotCQkJCQl0eXBlU2lnbmF0dXJlLmdldENoYXJzKG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQgKzEsIG5hbWVGcmFnbWVudCwgMCk7Ci0JCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlCi0JCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOwotCQkJCWxvbmcgcG9zID0gKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKLQkJCQkJcG9zaXRpb25zW2ldID0gcG9zOwotCQkJCX0KLQkJCQljaGFyW11bXSBpZGVudGlmaWVycyA9IGV4dHJhY3RJZGVudGlmaWVycyh0eXBlU2lnbmF0dXJlLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50RW5kLCBpZGVudENvdW50KTsKLQkJCQlpZiAoZGltID09IDApIHsKLQkJCQkJcmV0dXJuIG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBwb3NpdGlvbnMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBkaW0sIHBvc2l0aW9ucyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeyAvLyBwYXJhbWV0ZXJpemVkCi0JCQkvLyByZWJ1aWxkIHR5cGUgcmVmZXJlbmNlIGZyb20gYXZhaWxhYmxlIGZyYWdtZW50czogY2hhcltdW10sIGFyZ3VtZW50cywgY2hhcltdW10sIGFyZ3VtZW50cy4uLgotCQkJLy8gY2hlY2sgdHJhaWxpbmcgcXVhbGlmaWVkIG5hbWUKLQkJCWlmIChuYW1lU3RhcnRlZCkgewotCQkJCWFkZElkZW50aWZpZXJzKHR5cGVTaWduYXR1cmUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQgKyAxLCBpZGVudENvdW50LCBmcmFnbWVudHMpOwotCQkJfQotCQkJaW50IGZyYWdtZW50TGVuZ3RoID0gZnJhZ21lbnRzLnNpemUoKTsKLQkJCWlmIChmcmFnbWVudExlbmd0aCA9PSAyKSB7Ci0JCQkJT2JqZWN0IGZpcnN0RnJhZ21lbnQgPSBmcmFnbWVudHMuZ2V0KDApOwotCQkJCWlmIChmaXJzdEZyYWdtZW50IGluc3RhbmNlb2YgY2hhcltdKSB7Ci0JCQkJCS8vIHBhcmFtZXRlcml6ZWQgc2luZ2xlIHR5cGUKLQkJCQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSgoY2hhcltdKSBmaXJzdEZyYWdtZW50LCAoVHlwZVJlZmVyZW5jZVtdKSBmcmFnbWVudHMuZ2V0KDEpLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwYXJhbWV0ZXJpemVkIHF1YWxpZmllZCB0eXBlCi0JCQlpZGVudENvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRMZW5ndGg7IGkgKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGZyYWdtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBjaGFyW11bXSkgewotCQkJCQlpZGVudENvdW50ICs9ICgoY2hhcltdW10pZWxlbWVudCkubGVuZ3RoOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIGNoYXJbXSkKLQkJCQkJaWRlbnRDb3VudCsrOwotCQkJfQotCQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbaWRlbnRDb3VudF1bXTsKLQkJCVR5cGVSZWZlcmVuY2VbXVtdIGFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2lkZW50Q291bnRdW107Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudExlbmd0aDsgaSArKykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZnJhZ21lbnRzLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIGNoYXJbXVtdKSB7Ci0JCQkJCWNoYXJbXVtdIGZyYWdtZW50VG9rZW5zID0gKGNoYXJbXVtdKSBlbGVtZW50OwotCQkJCQlpbnQgZnJhZ21lbnRUb2tlbkxlbmd0aCA9IGZyYWdtZW50VG9rZW5zLmxlbmd0aDsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmcmFnbWVudFRva2VucywgMCwgdG9rZW5zLCBpbmRleCwgZnJhZ21lbnRUb2tlbkxlbmd0aCk7Ci0JCQkJCWluZGV4ICs9IGZyYWdtZW50VG9rZW5MZW5ndGg7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgY2hhcltdKSB7Ci0JCQkJCXRva2Vuc1tpbmRleCsrXSA9IChjaGFyW10pIGVsZW1lbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXJndW1lbnRzW2luZGV4LTFdID0gKFR5cGVSZWZlcmVuY2VbXSkgZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbaWRlbnRDb3VudF07Ci0JCQlsb25nIHBvcyA9ICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKLQkJCQlwb3NpdGlvbnNbaV0gPSBwb3M7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgYXJndW1lbnRzLCBkaW0sIHBvc2l0aW9ucyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGRlY29kZVR5cGUoY2hhcltdIHR5cGVOYW1lLCBpbnQgbGVuZ3RoLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaW50IGlkZW50Q291bnQgPSAxOwotCQlpbnQgZGltID0gMDsKLQkJaW50IG5hbWVGcmFnbWVudFN0YXJ0ID0gdGhpcy5uYW1lUG9zLCBuYW1lRnJhZ21lbnRFbmQgPSAtMTsKLQkJQXJyYXlMaXN0IGZyYWdtZW50cyA9IG51bGw7Ci0JCXR5cGVMb29wOiB3aGlsZSAodGhpcy5uYW1lUG9zIDwgbGVuZ3RoKSB7Ci0JCQljaGFyIGN1cnJlbnRDaGFyID0gdHlwZU5hbWVbdGhpcy5uYW1lUG9zXTsKLQkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKLQkJCQljYXNlICc/JyA6Ci0JCQkJCXRoaXMubmFtZVBvcysrOyAvLyBza2lwICc/JwotCQkJCQl3aGlsZSAodHlwZU5hbWVbdGhpcy5uYW1lUG9zXSA9PSAnICcpIHRoaXMubmFtZVBvcysrOwotCQkJCQlzd2l0Y2godHlwZU5hbWVbdGhpcy5uYW1lUG9zXSkgewotCQkJCQkJY2FzZSAncycgOgotCQkJCQkJCWNoZWNrU3VwZXI6IHsKLQkJCQkJCQkJaW50IG1heCA9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVIubGVuZ3RoLTE7Ci0JCQkJCQkJCWZvciAoaW50IGFoZWFkID0gMTsgYWhlYWQgPCBtYXg7IGFoZWFkKyspIHsKLQkJCQkJCQkJCWlmICh0eXBlTmFtZVt0aGlzLm5hbWVQb3MrYWhlYWRdICE9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVJbYWhlYWQrMV0pIHsKLQkJCQkJCQkJCQlicmVhayBjaGVja1N1cGVyOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXRoaXMubmFtZVBvcyArPSBtYXg7Ci0JCQkJCQkJCVdpbGRjYXJkIHJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5TVVBFUik7Ci0JCQkJCQkJCXJlc3VsdC5ib3VuZCA9IGRlY29kZVR5cGUodHlwZU5hbWUsIGxlbmd0aCwgc3RhcnQsIGVuZCk7Ci0JCQkJCQkJCXJlc3VsdC5zb3VyY2VTdGFydCA9IHN0YXJ0OwotCQkJCQkJCQlyZXN1bHQuc291cmNlRW5kID0gZW5kOwotCQkJCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ2UnIDoKLQkJCQkJCQljaGVja0V4dGVuZHM6IHsKLQkJCQkJCQkJaW50IG1heCA9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfRVhURU5EUy5sZW5ndGgtMTsKLQkJCQkJCQkJZm9yIChpbnQgYWhlYWQgPSAxOyBhaGVhZCA8IG1heDsgYWhlYWQrKykgewotCQkJCQkJCQkJaWYgKHR5cGVOYW1lW3RoaXMubmFtZVBvcythaGVhZF0gIT0gVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTW2FoZWFkKzFdKSB7Ci0JCQkJCQkJCQkJYnJlYWsgY2hlY2tFeHRlbmRzOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXRoaXMubmFtZVBvcyArPSBtYXg7Ci0JCQkJCQkJCVdpbGRjYXJkIHJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5FWFRFTkRTKTsKLQkJCQkJCQkJcmVzdWx0LmJvdW5kID0gZGVjb2RlVHlwZSh0eXBlTmFtZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKLQkJCQkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7Ci0JCQkJCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7Ci0JCQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCVdpbGRjYXJkIHJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5VTkJPVU5EKTsKLQkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJY2FzZSAnWycgOgotCQkJCQlpZiAoZGltID09IDApIG5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOwotCQkJCQlkaW0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXScgOgotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJY2FzZSAnLCcgOgotCQkJCQlicmVhayB0eXBlTG9vcDsKLQkJCQljYXNlICcuJyA6Ci0JCQkJCWlmIChuYW1lRnJhZ21lbnRTdGFydCA8IDApIG5hbWVGcmFnbWVudFN0YXJ0ID0gdGhpcy5uYW1lUG9zKzE7IC8vIG1lbWJlciB0eXBlIG5hbWUKLQkJCQkJaWRlbnRDb3VudCArKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQkvLyBjb252ZXJ0IDEuNSBzcGVjaWZpYyBjb25zdHJ1Y3RzIG9ubHkgaWYgY29tcGxpYW5jZSBpcyAxLjUgb3IgYWJvdmUKLQkJCQkJaWYgKCF0aGlzLmhhczFfNUNvbXBsaWFuY2UpIAotCQkJCQkJYnJlYWsgdHlwZUxvb3A7Ci0JCQkJCWlmIChmcmFnbWVudHMgPT0gbnVsbCkgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCQkJbmFtZUZyYWdtZW50RW5kID0gdGhpcy5uYW1lUG9zLTE7Ci0JCQkJCWNoYXJbXVtdIGlkZW50aWZpZXJzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZU5hbWUsIG5hbWVGcmFnbWVudFN0YXJ0LCB0aGlzLm5hbWVQb3MpOwotCQkJCQlmcmFnbWVudHMuYWRkKGlkZW50aWZpZXJzKTsKLQkJCQkJdGhpcy5uYW1lUG9zKys7IC8vIHNraXAgJzwnCi0JCQkJCVR5cGVSZWZlcmVuY2VbXSBhcmd1bWVudHMgPSBkZWNvZGVUeXBlQXJndW1lbnRzKHR5cGVOYW1lLCBsZW5ndGgsIHN0YXJ0LCBlbmQpOyAvLyBwb3NpdGlvbm5lZCBvbiAnPicgYXQgZW5kCi0JCQkJCWZyYWdtZW50cy5hZGQoYXJndW1lbnRzKTsKLQkJCQkJaWRlbnRDb3VudCA9IDA7Ci0JCQkJCW5hbWVGcmFnbWVudFN0YXJ0ID0gLTE7Ci0JCQkJCW5hbWVGcmFnbWVudEVuZCA9IC0xOwotCQkJCQkvLyBuZXh0IGluY3JlbWVudCB3aWxsIHNraXAgJz4nCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJdGhpcy5uYW1lUG9zKys7Ci0JCX0KLQkJaWYgKG5hbWVGcmFnbWVudEVuZCA8IDApIG5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOwotCQlpZiAoZnJhZ21lbnRzID09IG51bGwpIHsgLy8gbm9uIHBhcmFtZXRlcml6ZWQgCi0JCQkvKiByZWJ1aWxkIGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovCi0JCQlpZiAoaWRlbnRDb3VudCA9PSAxKSB7IC8vIHNpbXBsZSB0eXBlIHJlZmVyZW5jZQotCQkJCWlmIChkaW0gPT0gMCkgewotCQkJCQljaGFyW10gbmFtZUZyYWdtZW50OwotCQkJCQlpZiAobmFtZUZyYWdtZW50U3RhcnQgIT0gMCB8fCBuYW1lRnJhZ21lbnRFbmQgPj0gMCkgewotCQkJCQkJaW50IG5hbWVGcmFnbWVudExlbmd0aCA9IG5hbWVGcmFnbWVudEVuZCAtIG5hbWVGcmFnbWVudFN0YXJ0ICsgMTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnQgPSBuZXcgY2hhcltuYW1lRnJhZ21lbnRMZW5ndGhdLCAwLCBuYW1lRnJhZ21lbnRMZW5ndGgpOwkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJbmFtZUZyYWdtZW50ID0gdHlwZU5hbWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBuYW1lRnJhZ21lbnRMZW5ndGggPSBuYW1lRnJhZ21lbnRFbmQgLSBuYW1lRnJhZ21lbnRTdGFydCArIDE7Ci0JCQkJCWNoYXJbXSBuYW1lRnJhZ21lbnQgPSBuZXcgY2hhcltuYW1lRnJhZ21lbnRMZW5ndGhdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVOYW1lLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50LCAwLCBuYW1lRnJhZ21lbnRMZW5ndGgpOwotCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShuYW1lRnJhZ21lbnQsIGRpbSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOwotCQkJCX0KLQkJCX0gZWxzZSB7IC8vIHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZQotCQkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tpZGVudENvdW50XTsKLQkJCQlsb25nIHBvcyA9ICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRlbnRDb3VudDsgaSsrKSB7Ci0JCQkJCXBvc2l0aW9uc1tpXSA9IHBvczsKLQkJCQl9Ci0JCQkJY2hhcltdW10gaWRlbnRpZmllcnMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlTmFtZSwgbmFtZUZyYWdtZW50U3RhcnQsIG5hbWVGcmFnbWVudEVuZCsxKTsKLQkJCQlpZiAoZGltID09IDApIHsKLQkJCQkJcmV0dXJuIG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBwb3NpdGlvbnMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBkaW0sIHBvc2l0aW9ucyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeyAvLyBwYXJhbWV0ZXJpemVkCi0JCQkvLyByZWJ1aWxkIHR5cGUgcmVmZXJlbmNlIGZyb20gYXZhaWxhYmxlIGZyYWdtZW50czogY2hhcltdW10sIGFyZ3VtZW50cywgY2hhcltdW10sIGFyZ3VtZW50cy4uLgotCQkJLy8gY2hlY2sgdHJhaWxpbmcgcXVhbGlmaWVkIG5hbWUKLQkJCWlmIChuYW1lRnJhZ21lbnRTdGFydCA+IDAgJiYgbmFtZUZyYWdtZW50U3RhcnQgPCBsZW5ndGgpIHsKLQkJCQljaGFyW11bXSBpZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50RW5kKzEpOwotCQkJCWZyYWdtZW50cy5hZGQoaWRlbnRpZmllcnMpOwotCQkJfQotCQkJaW50IGZyYWdtZW50TGVuZ3RoID0gZnJhZ21lbnRzLnNpemUoKTsKLQkJCWlmIChmcmFnbWVudExlbmd0aCA9PSAyKSB7Ci0JCQkJY2hhcltdW10gZmlyc3RGcmFnbWVudCA9IChjaGFyW11bXSkgZnJhZ21lbnRzLmdldCgwKTsKLQkJCQlpZiAoZmlyc3RGcmFnbWVudC5sZW5ndGggPT0gMSkgewotCQkJCQkvLyBwYXJhbWV0ZXJpemVkIHNpbmdsZSB0eXBlCi0JCQkJCXJldHVybiBuZXcgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UoZmlyc3RGcmFnbWVudFswXSwgKFR5cGVSZWZlcmVuY2VbXSkgZnJhZ21lbnRzLmdldCgxKSwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gcGFyYW1ldGVyaXplZCBxdWFsaWZpZWQgdHlwZQotCQkJaWRlbnRDb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50TGVuZ3RoOyBpICsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBmcmFnbWVudHMuZ2V0KGkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgY2hhcltdW10pIHsKLQkJCQkJaWRlbnRDb3VudCArPSAoKGNoYXJbXVtdKWVsZW1lbnQpLmxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCQljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltpZGVudENvdW50XVtdOwotCQkJVHlwZVJlZmVyZW5jZVtdW10gYXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbaWRlbnRDb3VudF1bXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50TGVuZ3RoOyBpICsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBmcmFnbWVudHMuZ2V0KGkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgY2hhcltdW10pIHsKLQkJCQkJY2hhcltdW10gZnJhZ21lbnRUb2tlbnMgPSAoY2hhcltdW10pIGVsZW1lbnQ7Ci0JCQkJCWludCBmcmFnbWVudFRva2VuTGVuZ3RoID0gZnJhZ21lbnRUb2tlbnMubGVuZ3RoOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZyYWdtZW50VG9rZW5zLCAwLCB0b2tlbnMsIGluZGV4LCBmcmFnbWVudFRva2VuTGVuZ3RoKTsKLQkJCQkJaW5kZXggKz0gZnJhZ21lbnRUb2tlbkxlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlhcmd1bWVudHNbaW5kZXgtMV0gPSAoVHlwZVJlZmVyZW5jZVtdKSBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tpZGVudENvdW50XTsKLQkJCWxvbmcgcG9zID0gKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQ7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50Q291bnQ7IGkrKykgewotCQkJCXBvc2l0aW9uc1tpXSA9IHBvczsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBhcmd1bWVudHMsIGRpbSwgcG9zaXRpb25zKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFR5cGVSZWZlcmVuY2VbXSBkZWNvZGVUeXBlQXJndW1lbnRzKGNoYXJbXSB0eXBlTmFtZSwgaW50IGxlbmd0aCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCUFycmF5TGlzdCBhcmd1bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlpbnQgY291bnQgPSAwOwotCQlhcmd1bWVudHNMb29wOiB3aGlsZSAodGhpcy5uYW1lUG9zIDwgbGVuZ3RoKSB7Ci0JCQlUeXBlUmVmZXJlbmNlIGFyZ3VtZW50ID0gZGVjb2RlVHlwZSh0eXBlTmFtZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKLQkJCWNvdW50Kys7Ci0JCQlhcmd1bWVudExpc3QuYWRkKGFyZ3VtZW50KTsKLQkJCWlmICh0aGlzLm5hbWVQb3MgPj0gbGVuZ3RoKSBicmVhayBhcmd1bWVudHNMb29wOwotCQkJaWYgKHR5cGVOYW1lW3RoaXMubmFtZVBvc10gPT0gJz4nKSB7Ci0JCQkJYnJlYWsgYXJndW1lbnRzTG9vcDsKLQkJCX0KLQkJCXRoaXMubmFtZVBvcysrOyAvLyBza2lwICcsJwotCQl9Ci0JCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbY291bnRdOwotCQlhcmd1bWVudExpc3QudG9BcnJheSh0eXBlQXJndW1lbnRzKTsKLQkJcmV0dXJuIHR5cGVBcmd1bWVudHM7Ci0JfQotCQotCXByaXZhdGUgVHlwZVJlZmVyZW5jZVtdIGRlY29kZVR5cGVBcmd1bWVudHMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBsZW5ndGgsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlBcnJheUxpc3QgYXJndW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJYXJndW1lbnRzTG9vcDogd2hpbGUgKHRoaXMubmFtZVBvcyA8IGxlbmd0aCkgewotCQkJVHlwZVJlZmVyZW5jZSBhcmd1bWVudCA9IGRlY29kZVR5cGUodHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKLQkJCWNvdW50Kys7Ci0JCQlhcmd1bWVudExpc3QuYWRkKGFyZ3VtZW50KTsKLQkJCWlmICh0aGlzLm5hbWVQb3MgPj0gbGVuZ3RoKSBicmVhayBhcmd1bWVudHNMb29wOwotCQkJaWYgKHR5cGVTaWduYXR1cmUuY2hhckF0KHRoaXMubmFtZVBvcykgPT0gJz4nKSB7Ci0JCQkJYnJlYWsgYXJndW1lbnRzTG9vcDsKLQkJCX0KLQkJfQotCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2NvdW50XTsKLQkJYXJndW1lbnRMaXN0LnRvQXJyYXkodHlwZUFyZ3VtZW50cyk7Ci0JCXJldHVybiB0eXBlQXJndW1lbnRzOwotCX0KLQkKLQlwcml2YXRlIGNoYXJbXVtdIGV4dHJhY3RJZGVudGlmaWVycyhTdHJpbmcgdHlwZVNpZ25hdHVyZSwgaW50IHN0YXJ0LCBpbnQgZW5kSW5jbHVzaXZlLCBpbnQgaWRlbnRDb3VudCkgewotCQljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltpZGVudENvdW50XVtdOwotCQlpbnQgY2hhckluZGV4ID0gc3RhcnQ7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGNoYXJJbmRleCA8IGVuZEluY2x1c2l2ZSkgewotCQkJaWYgKHR5cGVTaWduYXR1cmUuY2hhckF0KGNoYXJJbmRleCkgPT0gJy4nKSB7Ci0JCQkJdHlwZVNpZ25hdHVyZS5nZXRDaGFycyhzdGFydCwgY2hhckluZGV4LCByZXN1bHRbaSsrXSA9IG5ldyBjaGFyW2NoYXJJbmRleCAtIHN0YXJ0XSwgMCk7IAotCQkJCXN0YXJ0ID0gKytjaGFySW5kZXg7Ci0JCQl9IGVsc2UKLQkJCQljaGFySW5kZXgrKzsKLQkJfQotCQl0eXBlU2lnbmF0dXJlLmdldENoYXJzKHN0YXJ0LCBjaGFySW5kZXggKyAxLCByZXN1bHRbaSsrXSA9IG5ldyBjaGFyW2NoYXJJbmRleCAtIHN0YXJ0ICsgMV0sIDApOyAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCiAJcHJpdmF0ZSBjaGFyW10gZ2V0U291cmNlKCkgewogCQlpZiAodGhpcy5zb3VyY2UgPT0gbnVsbCkKIAkJCXRoaXMuc291cmNlID0gdGhpcy5jdS5nZXRDb250ZW50cygpOwogCQlyZXR1cm4gdGhpcy5zb3VyY2U7CiAJfQotCQorCiAJcHJpdmF0ZSBFeHByZXNzaW9uIHBhcnNlTWVtYmVyVmFsdWUoY2hhcltdIG1lbWJlclZhbHVlKSB7CiAJCS8vIG1lbWJlclZhbHVlIG11c3Qgbm90IGJlIG51bGwKIAkJaWYgKHRoaXMucGFyc2VyID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVHlwZUNvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9UeXBlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjMTc2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVHlwZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldpbGRjYXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUNvbnZlcnRlciB7CisKKwlpbnQgbmFtZVBvczsKKworCXByb3RlY3RlZCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOworCXByb3RlY3RlZCBib29sZWFuIGhhczFfNUNvbXBsaWFuY2U7CisJcHJpdmF0ZSBjaGFyIG1lbWJlclR5cGVTZXBhcmF0b3I7CisKKwlwcm90ZWN0ZWQgVHlwZUNvbnZlcnRlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBjaGFyIG1lbWJlclR5cGVTZXBhcmF0b3IpIHsKKwkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIgPSBwcm9ibGVtUmVwb3J0ZXI7CisJCXRoaXMuaGFzMV81Q29tcGxpYW5jZSA9IHByb2JsZW1SZXBvcnRlci5vcHRpb25zLm9yaWdpbmFsQ29tcGxpYW5jZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzU7CisJCXRoaXMubWVtYmVyVHlwZVNlcGFyYXRvciA9IG1lbWJlclR5cGVTZXBhcmF0b3I7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZElkZW50aWZpZXJzKFN0cmluZyB0eXBlU2lnbmF0dXJlLCBpbnQgc3RhcnQsIGludCBlbmRFeGNsdXNpdmUsIGludCBpZGVudENvdW50LCBBcnJheUxpc3QgZnJhZ21lbnRzKSB7CisJCWlmIChpZGVudENvdW50ID09IDEpIHsKKwkJCWNoYXJbXSBpZGVudGlmaWVyOworCQkJdHlwZVNpZ25hdHVyZS5nZXRDaGFycyhzdGFydCwgZW5kRXhjbHVzaXZlLCBpZGVudGlmaWVyID0gbmV3IGNoYXJbZW5kRXhjbHVzaXZlLXN0YXJ0XSwgMCk7CisJCQlmcmFnbWVudHMuYWRkKGlkZW50aWZpZXIpOworCQl9IGVsc2UKKwkJCWZyYWdtZW50cy5hZGQoZXh0cmFjdElkZW50aWZpZXJzKHR5cGVTaWduYXR1cmUsIHN0YXJ0LCBlbmRFeGNsdXNpdmUtMSwgaWRlbnRDb3VudCkpOworCX0KKworCS8qCisJICogQnVpbGQgYW4gaW1wb3J0IHJlZmVyZW5jZSBmcm9tIGFuIGltcG9ydCBuYW1lLCBlLmcuIGphdmEubGFuZy4qCisJICovCisJcHJvdGVjdGVkIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVJbXBvcnRSZWZlcmVuY2UoCisJCVN0cmluZ1tdIGltcG9ydE5hbWUsCisJCWludCBzdGFydCwKKwkJaW50IGVuZCwKKwkJYm9vbGVhbiBvbkRlbWFuZCwKKwkJaW50IG1vZGlmaWVycykgeworCisJCWludCBsZW5ndGggPSBpbXBvcnROYW1lLmxlbmd0aDsKKwkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CisJCWxvbmcgcG9zaXRpb24gPSAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZDsKKwkJY2hhcltdW10gcUltcG9ydE5hbWUgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXFJbXBvcnROYW1lW2ldID0gaW1wb3J0TmFtZVtpXS50b0NoYXJBcnJheSgpOworCQkJcG9zaXRpb25zW2ldID0gcG9zaXRpb247IC8vIGR1bW15IHBvc2l0aW9ucworCQl9CisJCXJldHVybiBuZXcgSW1wb3J0UmVmZXJlbmNlKAorCQkJcUltcG9ydE5hbWUsCisJCQlwb3NpdGlvbnMsCisJCQlvbkRlbWFuZCwKKwkJCW1vZGlmaWVycyk7CisJfQorCisJcHJvdGVjdGVkIFR5cGVQYXJhbWV0ZXIgY3JlYXRlVHlwZVBhcmFtZXRlcihjaGFyW10gdHlwZVBhcmFtZXRlck5hbWUsIGNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMsIGludCBzdGFydCwgaW50IGVuZCkgeworCisJCVR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFR5cGVQYXJhbWV0ZXIoKTsKKwkJcGFyYW1ldGVyLm5hbWUgPSB0eXBlUGFyYW1ldGVyTmFtZTsKKwkJcGFyYW1ldGVyLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJCXBhcmFtZXRlci5zb3VyY2VFbmQgPSBlbmQ7CisJCWlmICh0eXBlUGFyYW1ldGVyQm91bmRzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSB0eXBlUGFyYW1ldGVyQm91bmRzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPiAwKSB7CisJCQkJcGFyYW1ldGVyLnR5cGUgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXJCb3VuZHNbMF0sIHN0YXJ0LCBlbmQpOworCQkJCWlmIChsZW5ndGggPiAxKSB7CisJCQkJCXBhcmFtZXRlci5ib3VuZHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGgtMV07CisJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCVR5cGVSZWZlcmVuY2UgYm91bmQgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXJCb3VuZHNbaV0sIHN0YXJ0LCBlbmQpOworCQkJCQkJYm91bmQuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOworCQkJCQkJcGFyYW1ldGVyLmJvdW5kc1tpLTFdID0gYm91bmQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHBhcmFtZXRlcjsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIGEgdHlwZSByZWZlcmVuY2UgZnJvbSBhIHJlYWRhYmxlIG5hbWUsIGUuZy4gamF2YS5sYW5nLk9iamVjdFtdW10KKwkgKi8KKwlwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBjcmVhdGVUeXBlUmVmZXJlbmNlKAorCQljaGFyW10gdHlwZU5hbWUsCisJCWludCBzdGFydCwKKwkJaW50IGVuZCwKKwkJYm9vbGVhbiBpbmNsdWRlR2VuZXJpY3NBbnl3YXkpIHsKKworCQlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQl0aGlzLm5hbWVQb3MgPSAwOworCQlyZXR1cm4gZGVjb2RlVHlwZSh0eXBlTmFtZSwgbGVuZ3RoLCBzdGFydCwgZW5kLCB0cnVlKTsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIGEgdHlwZSByZWZlcmVuY2UgZnJvbSBhIHJlYWRhYmxlIG5hbWUsIGUuZy4gamF2YS5sYW5nLk9iamVjdFtdW10KKwkgKi8KKwlwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBjcmVhdGVUeXBlUmVmZXJlbmNlKAorCQljaGFyW10gdHlwZU5hbWUsCisJCWludCBzdGFydCwKKwkJaW50IGVuZCkgeworCisJCWludCBsZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7CisJCXRoaXMubmFtZVBvcyA9IDA7CisJCXJldHVybiBkZWNvZGVUeXBlKHR5cGVOYW1lLCBsZW5ndGgsIHN0YXJ0LCBlbmQsIGZhbHNlKTsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIGEgdHlwZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgc2lnbmF0dXJlLCBlLmcuIExqYXZhLmxhbmcuT2JqZWN0OworCSAqLworCXByb3RlY3RlZCBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoCisJCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSwKKwkJCWludCBzdGFydCwKKwkJCWludCBlbmQpIHsKKworCQlpbnQgbGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGgoKTsKKwkJdGhpcy5uYW1lUG9zID0gMDsKKwkJcmV0dXJuIGRlY29kZVR5cGUodHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKKwl9CisKKwlwcml2YXRlIFR5cGVSZWZlcmVuY2UgZGVjb2RlVHlwZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgaW50IGxlbmd0aCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCWludCBpZGVudENvdW50ID0gMTsKKwkJaW50IGRpbSA9IDA7CisJCWludCBuYW1lRnJhZ21lbnRTdGFydCA9IHRoaXMubmFtZVBvcywgbmFtZUZyYWdtZW50RW5kID0gLTE7CisJCWJvb2xlYW4gbmFtZVN0YXJ0ZWQgPSBmYWxzZTsKKwkJQXJyYXlMaXN0IGZyYWdtZW50cyA9IG51bGw7CisJCXR5cGVMb29wOiB3aGlsZSAodGhpcy5uYW1lUG9zIDwgbGVuZ3RoKSB7CisJCQljaGFyIGN1cnJlbnRDaGFyID0gdHlwZVNpZ25hdHVyZS5jaGFyQXQodGhpcy5uYW1lUG9zKTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0JPT0xFQU4gOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJCWlmIChkaW0gPT0gMCkKKwkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQk9PTEVBTi5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQk9PTEVBTi5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0JZVEUgOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJCWlmIChkaW0gPT0gMCkKKwkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQllURS5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQllURS5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0NIQVIgOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJCWlmIChkaW0gPT0gMCkKKwkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQ0hBUi5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuQ0hBUi5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0RPVUJMRSA6CisJCQkJCWlmICghbmFtZVN0YXJ0ZWQpIHsKKwkJCQkJCXRoaXMubmFtZVBvcysrOworCQkJCQkJaWYgKGRpbSA9PSAwKQorCQkJCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5ET1VCTEUuc2ltcGxlTmFtZSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkRPVUJMRS5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0ZMT0FUIDoKKwkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgeworCQkJCQkJdGhpcy5uYW1lUG9zKys7CisJCQkJCQlpZiAoZGltID09IDApCisJCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLkZMT0FULnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5GTE9BVC5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0lOVCA6CisJCQkJCWlmICghbmFtZVN0YXJ0ZWQpIHsKKwkJCQkJCXRoaXMubmFtZVBvcysrOworCQkJCQkJaWYgKGRpbSA9PSAwKQorCQkJCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5JTlQuc2ltcGxlTmFtZSwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLklOVC5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0xPTkcgOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJCWlmIChkaW0gPT0gMCkKKwkJCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuTE9ORy5zaW1wbGVOYW1lLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVHlwZUJpbmRpbmcuTE9ORy5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX1NIT1JUIDoKKwkJCQkJaWYgKCFuYW1lU3RhcnRlZCkgeworCQkJCQkJdGhpcy5uYW1lUG9zKys7CisJCQkJCQlpZiAoZGltID09IDApCisJCQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFR5cGVCaW5kaW5nLlNIT1JULnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5TSE9SVC5zaW1wbGVOYW1lLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX1ZPSUQgOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZy5WT0lELnNpbXBsZU5hbWUsICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX1JFU09MVkVEIDoKKwkJCQljYXNlIFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgOgorCQkJCWNhc2UgU2lnbmF0dXJlLkNfVFlQRV9WQVJJQUJMRSA6CisJCQkJCWlmICghbmFtZVN0YXJ0ZWQpIHsKKwkJCQkJCW5hbWVGcmFnbWVudFN0YXJ0ID0gdGhpcy5uYW1lUG9zKzE7CisJCQkJCQluYW1lU3RhcnRlZCA9IHRydWU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTaWduYXR1cmUuQ19TVEFSOgorCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJV2lsZGNhcmQgcmVzdWx0ID0gbmV3IFdpbGRjYXJkKFdpbGRjYXJkLlVOQk9VTkQpOworCQkJCQlyZXN1bHQuc291cmNlU3RhcnQgPSBzdGFydDsKKwkJCQkJcmVzdWx0LnNvdXJjZUVuZCA9IGVuZDsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0VYVEVORFM6CisJCQkJCXRoaXMubmFtZVBvcysrOworCQkJCQlyZXN1bHQgPSBuZXcgV2lsZGNhcmQoV2lsZGNhcmQuRVhURU5EUyk7CisJCQkJCXJlc3VsdC5ib3VuZCA9IGRlY29kZVR5cGUodHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKKwkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSBTaWduYXR1cmUuQ19TVVBFUjoKKwkJCQkJdGhpcy5uYW1lUG9zKys7CisJCQkJCXJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5TVVBFUik7CisJCQkJCXJlc3VsdC5ib3VuZCA9IGRlY29kZVR5cGUodHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKKwkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSBTaWduYXR1cmUuQ19BUlJBWSA6CisJCQkJCWRpbSsrOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0dFTkVSSUNfRU5EIDoKKwkJCQljYXNlIFNpZ25hdHVyZS5DX1NFTUlDT0xPTiA6CisJCQkJCW5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOworCQkJCQl0aGlzLm5hbWVQb3MrKzsKKwkJCQkJYnJlYWsgdHlwZUxvb3A7CisJCQkJY2FzZSBTaWduYXR1cmUuQ19ET0xMQVI6CisJCQkJCWlmICh0aGlzLm1lbWJlclR5cGVTZXBhcmF0b3IgIT0gU2lnbmF0dXJlLkNfRE9MTEFSKQorCQkJCQkJYnJlYWs7CisJCQkJCS8vICRGQUxMLVRIUk9VR0gkCisJCQkJY2FzZSBTaWduYXR1cmUuQ19ET1QgOgorCQkJCQlpZiAoIW5hbWVTdGFydGVkKSB7CisJCQkJCQluYW1lRnJhZ21lbnRTdGFydCA9IHRoaXMubmFtZVBvcysxOworCQkJCQkJbmFtZVN0YXJ0ZWQgPSB0cnVlOworCQkJCQl9IGVsc2UgaWYgKHRoaXMubmFtZVBvcyA+IG5hbWVGcmFnbWVudFN0YXJ0KSAvLyBoYW5kbGUgbmFtZSBzdGFydGluZyB3aXRoIGEgJCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTcwOSkKKwkJCQkJCWlkZW50Q291bnQgKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2lnbmF0dXJlLkNfR0VORVJJQ19TVEFSVCA6CisJCQkJCW5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOworCQkJCQkvLyBjb252ZXJ0IDEuNSBzcGVjaWZpYyBjb25zdHJ1Y3RzIG9ubHkgaWYgY29tcGxpYW5jZSBpcyAxLjUgb3IgYWJvdmUKKwkJCQkJaWYgKCF0aGlzLmhhczFfNUNvbXBsaWFuY2UpCisJCQkJCQlicmVhayB0eXBlTG9vcDsKKwkJCQkJaWYgKGZyYWdtZW50cyA9PSBudWxsKSBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KDIpOworCQkJCQlhZGRJZGVudGlmaWVycyh0eXBlU2lnbmF0dXJlLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50RW5kICsgMSwgaWRlbnRDb3VudCwgZnJhZ21lbnRzKTsKKwkJCQkJdGhpcy5uYW1lUG9zKys7IC8vIHNraXAgJzwnCisJCQkJCVR5cGVSZWZlcmVuY2VbXSBhcmd1bWVudHMgPSBkZWNvZGVUeXBlQXJndW1lbnRzKHR5cGVTaWduYXR1cmUsIGxlbmd0aCwgc3RhcnQsIGVuZCk7IC8vIHBvc2l0aW9ubmVkIG9uICc+JyBhdCBlbmQKKwkJCQkJZnJhZ21lbnRzLmFkZChhcmd1bWVudHMpOworCQkJCQlpZGVudENvdW50ID0gMTsKKwkJCQkJbmFtZVN0YXJ0ZWQgPSBmYWxzZTsKKwkJCQkJLy8gbmV4dCBpbmNyZW1lbnQgd2lsbCBza2lwICc+JworCQkJCQlicmVhazsKKwkJCX0KKwkJCXRoaXMubmFtZVBvcysrOworCQl9CisJCWlmIChmcmFnbWVudHMgPT0gbnVsbCkgeyAvLyBub24gcGFyYW1ldGVyaXplZAorCQkJLyogcmVidWlsZCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLworCQkJaWYgKGlkZW50Q291bnQgPT0gMSkgeyAvLyBzaW1wbGUgdHlwZSByZWZlcmVuY2UKKwkJCQlpZiAoZGltID09IDApIHsKKwkJCQkJY2hhcltdIG5hbWVGcmFnbWVudCA9IG5ldyBjaGFyW25hbWVGcmFnbWVudEVuZCAtIG5hbWVGcmFnbWVudFN0YXJ0ICsgMV07CisJCQkJCXR5cGVTaWduYXR1cmUuZ2V0Q2hhcnMobmFtZUZyYWdtZW50U3RhcnQsIG5hbWVGcmFnbWVudEVuZCArMSwgbmFtZUZyYWdtZW50LCAwKTsKKwkJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQpOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXJbXSBuYW1lRnJhZ21lbnQgPSBuZXcgY2hhcltuYW1lRnJhZ21lbnRFbmQgLSBuYW1lRnJhZ21lbnRTdGFydCArIDFdOworCQkJCQl0eXBlU2lnbmF0dXJlLmdldENoYXJzKG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQgKzEsIG5hbWVGcmFnbWVudCwgMCk7CisJCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlCisJCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOworCQkJCWxvbmcgcG9zID0gKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQ7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKKwkJCQkJcG9zaXRpb25zW2ldID0gcG9zOworCQkJCX0KKwkJCQljaGFyW11bXSBpZGVudGlmaWVycyA9IGV4dHJhY3RJZGVudGlmaWVycyh0eXBlU2lnbmF0dXJlLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50RW5kLCBpZGVudENvdW50KTsKKwkJCQlpZiAoZGltID09IDApIHsKKwkJCQkJcmV0dXJuIG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBwb3NpdGlvbnMpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBkaW0sIHBvc2l0aW9ucyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeyAvLyBwYXJhbWV0ZXJpemVkCisJCQkvLyByZWJ1aWxkIHR5cGUgcmVmZXJlbmNlIGZyb20gYXZhaWxhYmxlIGZyYWdtZW50czogY2hhcltdW10sIGFyZ3VtZW50cywgY2hhcltdW10sIGFyZ3VtZW50cy4uLgorCQkJLy8gY2hlY2sgdHJhaWxpbmcgcXVhbGlmaWVkIG5hbWUKKwkJCWlmIChuYW1lU3RhcnRlZCkgeworCQkJCWFkZElkZW50aWZpZXJzKHR5cGVTaWduYXR1cmUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQgKyAxLCBpZGVudENvdW50LCBmcmFnbWVudHMpOworCQkJfQorCQkJaW50IGZyYWdtZW50TGVuZ3RoID0gZnJhZ21lbnRzLnNpemUoKTsKKwkJCWlmIChmcmFnbWVudExlbmd0aCA9PSAyKSB7CisJCQkJT2JqZWN0IGZpcnN0RnJhZ21lbnQgPSBmcmFnbWVudHMuZ2V0KDApOworCQkJCWlmIChmaXJzdEZyYWdtZW50IGluc3RhbmNlb2YgY2hhcltdKSB7CisJCQkJCS8vIHBhcmFtZXRlcml6ZWQgc2luZ2xlIHR5cGUKKwkJCQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSgoY2hhcltdKSBmaXJzdEZyYWdtZW50LCAoVHlwZVJlZmVyZW5jZVtdKSBmcmFnbWVudHMuZ2V0KDEpLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQl9CisJCQl9CisJCQkvLyBwYXJhbWV0ZXJpemVkIHF1YWxpZmllZCB0eXBlCisJCQlpZGVudENvdW50ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRMZW5ndGg7IGkgKyspIHsKKwkJCQlPYmplY3QgZWxlbWVudCA9IGZyYWdtZW50cy5nZXQoaSk7CisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBjaGFyW11bXSkgeworCQkJCQlpZGVudENvdW50ICs9ICgoY2hhcltdW10pZWxlbWVudCkubGVuZ3RoOworCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIGNoYXJbXSkKKwkJCQkJaWRlbnRDb3VudCsrOworCQkJfQorCQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbaWRlbnRDb3VudF1bXTsKKwkJCVR5cGVSZWZlcmVuY2VbXVtdIGFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2lkZW50Q291bnRdW107CisJCQlpbnQgaW5kZXggPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudExlbmd0aDsgaSArKykgeworCQkJCU9iamVjdCBlbGVtZW50ID0gZnJhZ21lbnRzLmdldChpKTsKKwkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIGNoYXJbXVtdKSB7CisJCQkJCWNoYXJbXVtdIGZyYWdtZW50VG9rZW5zID0gKGNoYXJbXVtdKSBlbGVtZW50OworCQkJCQlpbnQgZnJhZ21lbnRUb2tlbkxlbmd0aCA9IGZyYWdtZW50VG9rZW5zLmxlbmd0aDsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShmcmFnbWVudFRva2VucywgMCwgdG9rZW5zLCBpbmRleCwgZnJhZ21lbnRUb2tlbkxlbmd0aCk7CisJCQkJCWluZGV4ICs9IGZyYWdtZW50VG9rZW5MZW5ndGg7CisJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgY2hhcltdKSB7CisJCQkJCXRva2Vuc1tpbmRleCsrXSA9IChjaGFyW10pIGVsZW1lbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJndW1lbnRzW2luZGV4LTFdID0gKFR5cGVSZWZlcmVuY2VbXSkgZWxlbWVudDsKKwkJCQl9CisJCQl9CisJCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbaWRlbnRDb3VudF07CisJCQlsb25nIHBvcyA9ICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKKwkJCQlwb3NpdGlvbnNbaV0gPSBwb3M7CisJCQl9CisJCQlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgYXJndW1lbnRzLCBkaW0sIHBvc2l0aW9ucyk7CisJCX0KKwl9CisKKwlwcml2YXRlIFR5cGVSZWZlcmVuY2UgZGVjb2RlVHlwZShjaGFyW10gdHlwZU5hbWUsIGludCBsZW5ndGgsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbGVhbiBpbmNsdWRlR2VuZXJpY3NBbnl3YXkpIHsKKwkJaW50IGlkZW50Q291bnQgPSAxOworCQlpbnQgZGltID0gMDsKKwkJaW50IG5hbWVGcmFnbWVudFN0YXJ0ID0gdGhpcy5uYW1lUG9zLCBuYW1lRnJhZ21lbnRFbmQgPSAtMTsKKwkJQXJyYXlMaXN0IGZyYWdtZW50cyA9IG51bGw7CisJCXR5cGVMb29wOiB3aGlsZSAodGhpcy5uYW1lUG9zIDwgbGVuZ3RoKSB7CisJCQljaGFyIGN1cnJlbnRDaGFyID0gdHlwZU5hbWVbdGhpcy5uYW1lUG9zXTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQljYXNlICc/JyA6CisJCQkJCXRoaXMubmFtZVBvcysrOyAvLyBza2lwICc/JworCQkJCQl3aGlsZSAodHlwZU5hbWVbdGhpcy5uYW1lUG9zXSA9PSAnICcpIHRoaXMubmFtZVBvcysrOworCQkJCQlzd2l0Y2godHlwZU5hbWVbdGhpcy5uYW1lUG9zXSkgeworCQkJCQkJY2FzZSAncycgOgorCQkJCQkJCWNoZWNrU3VwZXI6IHsKKwkJCQkJCQkJaW50IG1heCA9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVIubGVuZ3RoLTE7CisJCQkJCQkJCWZvciAoaW50IGFoZWFkID0gMTsgYWhlYWQgPCBtYXg7IGFoZWFkKyspIHsKKwkJCQkJCQkJCWlmICh0eXBlTmFtZVt0aGlzLm5hbWVQb3MrYWhlYWRdICE9IFR5cGVDb25zdGFudHMuV0lMRENBUkRfU1VQRVJbYWhlYWQrMV0pIHsKKwkJCQkJCQkJCQlicmVhayBjaGVja1N1cGVyOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXRoaXMubmFtZVBvcyArPSBtYXg7CisJCQkJCQkJCVdpbGRjYXJkIHJlc3VsdCA9IG5ldyBXaWxkY2FyZChXaWxkY2FyZC5TVVBFUik7CisJCQkJCQkJCXJlc3VsdC5ib3VuZCA9IGRlY29kZVR5cGUodHlwZU5hbWUsIGxlbmd0aCwgc3RhcnQsIGVuZCwgaW5jbHVkZUdlbmVyaWNzQW55d2F5KTsKKwkJCQkJCQkJcmVzdWx0LnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJCQkJCQkJCXJlc3VsdC5zb3VyY2VFbmQgPSBlbmQ7CisJCQkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnZScgOgorCQkJCQkJCWNoZWNrRXh0ZW5kczogeworCQkJCQkJCQlpbnQgbWF4ID0gVHlwZUNvbnN0YW50cy5XSUxEQ0FSRF9FWFRFTkRTLmxlbmd0aC0xOworCQkJCQkJCQlmb3IgKGludCBhaGVhZCA9IDE7IGFoZWFkIDwgbWF4OyBhaGVhZCsrKSB7CisJCQkJCQkJCQlpZiAodHlwZU5hbWVbdGhpcy5uYW1lUG9zK2FoZWFkXSAhPSBUeXBlQ29uc3RhbnRzLldJTERDQVJEX0VYVEVORFNbYWhlYWQrMV0pIHsKKwkJCQkJCQkJCQlicmVhayBjaGVja0V4dGVuZHM7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJdGhpcy5uYW1lUG9zICs9IG1heDsKKwkJCQkJCQkJV2lsZGNhcmQgcmVzdWx0ID0gbmV3IFdpbGRjYXJkKFdpbGRjYXJkLkVYVEVORFMpOworCQkJCQkJCQlyZXN1bHQuYm91bmQgPSBkZWNvZGVUeXBlKHR5cGVOYW1lLCBsZW5ndGgsIHN0YXJ0LCBlbmQsIGluY2x1ZGVHZW5lcmljc0FueXdheSk7CisJCQkJCQkJCXJlc3VsdC5zb3VyY2VTdGFydCA9IHN0YXJ0OworCQkJCQkJCQlyZXN1bHQuc291cmNlRW5kID0gZW5kOworCQkJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlXaWxkY2FyZCByZXN1bHQgPSBuZXcgV2lsZGNhcmQoV2lsZGNhcmQuVU5CT1VORCk7CisJCQkJCXJlc3VsdC5zb3VyY2VTdGFydCA9IHN0YXJ0OworCQkJCQlyZXN1bHQuc291cmNlRW5kID0gZW5kOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCWNhc2UgJ1snIDoKKwkJCQkJaWYgKGRpbSA9PSAwICYmIG5hbWVGcmFnbWVudEVuZCA8IDApIG5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOworCQkJCQlkaW0rKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXScgOgorCQkJCQlicmVhazsKKwkJCQljYXNlICc+JyA6CisJCQkJY2FzZSAnLCcgOgorCQkJCQlicmVhayB0eXBlTG9vcDsKKwkJCQljYXNlICcuJyA6CisJCQkJCWlmIChuYW1lRnJhZ21lbnRTdGFydCA8IDApIG5hbWVGcmFnbWVudFN0YXJ0ID0gdGhpcy5uYW1lUG9zKzE7IC8vIG1lbWJlciB0eXBlIG5hbWUKKwkJCQkJaWRlbnRDb3VudCArKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPCcgOgorCQkJCQkvKiBXZSBuZWVkIHRvIGNvbnZlcnQgYW5kIHByZXNlcnZlIDEuNSBzcGVjaWZpYyBjb25zdHJ1Y3RzIGVpdGhlciBpZiBjb21wbGlhbmNlIGlzIDEuNSBvciBhYm92ZSwKKwkJCQkJICAgb3IgdGhlIGNhbGxlciBoYXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgZ2VuZXJpY3MgdG8gYmUgaW5jbHVkZWQuIFRoZSBwYXJhbWV0ZXIgaW5jbHVkZUdlbmVyaWNzQW55d2F5CisJCQkJCSAgIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjYWxsZXIgdG8gc2lnbmFsIHRoYXQgaW4gdGhlIGNhbGxpbmcgY29udGV4dCBnZW5lcmljcyBpbmZvcm1hdGlvbiBtdXN0IGJlIAorCQkJCQkgICBpbnRlcm5hbGl6ZWQgZXZlbiB3aGVuIHRoZSByZXF1ZXN0aW5nIHByb2plY3QgaXMgMS40LiBCdXQgaW4gYWxsIGNhc2VzLCB3ZSBtdXN0IHNraXAgb3ZlciB0aGVtIHRvCisJCQkJCSAgIHNlZSBpZiB0aGVyZSBhcmUgYW55IGFwcGxpY2FibGUgdHlwZSBmcmFnbWVudHMgYWZ0ZXIgdGhlIHR5cGUgcGFyYW1ldGVyczogaS5lIHdlIGp1c3QgYXJlbid0IGRvbmUKKwkJCQkJICAgaGF2aW5nIHNlZW4gYSAnPCcgaW4gMS40IG1vZGUuIAorCQkJCQkgICAKKwkJCQkJICAgQmVjYXVzZSBvZiB0aGUgd2F5IHR5cGUgc2lnbmF0dXJlcyBhcmUgZW5jb2RlZCwgVHlwZUNvbnZlcnRlci5kZWNvZGVUeXBlKFN0cmluZywgaW50LCBpbnQsIGludCkgaXMgaW1tdW5lCisJCQkJCSAgIHRvIHRoaXMgcHJvYmxlbS4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU2MzMKKwkJCQkJICovCisJCQkJCWlmICh0aGlzLmhhczFfNUNvbXBsaWFuY2UgfHwgaW5jbHVkZUdlbmVyaWNzQW55d2F5KSB7CisJCQkJCQlpZiAoZnJhZ21lbnRzID09IG51bGwpIGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoMik7CisJCQkJCX0KKwkJCQkJbmFtZUZyYWdtZW50RW5kID0gdGhpcy5uYW1lUG9zLTE7CisJCQkJCWlmICh0aGlzLmhhczFfNUNvbXBsaWFuY2UgfHwgaW5jbHVkZUdlbmVyaWNzQW55d2F5KSB7CisJCQkJCQljaGFyW11bXSBpZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCBuYW1lRnJhZ21lbnRTdGFydCwgdGhpcy5uYW1lUG9zKTsKKwkJCQkJCWZyYWdtZW50cy5hZGQoaWRlbnRpZmllcnMpOworCQkJCQl9CisJCQkJCXRoaXMubmFtZVBvcysrOyAvLyBza2lwICc8JworCQkJCQlUeXBlUmVmZXJlbmNlW10gYXJndW1lbnRzID0gZGVjb2RlVHlwZUFyZ3VtZW50cyh0eXBlTmFtZSwgbGVuZ3RoLCBzdGFydCwgZW5kLCBpbmNsdWRlR2VuZXJpY3NBbnl3YXkpOyAvLyBwb3NpdGlvbm5lZCBvbiAnPicgYXQgZW5kCisJCQkJCWlmICh0aGlzLmhhczFfNUNvbXBsaWFuY2UgfHwgaW5jbHVkZUdlbmVyaWNzQW55d2F5KSB7CisJCQkJCQlmcmFnbWVudHMuYWRkKGFyZ3VtZW50cyk7CisJCQkJCQlpZGVudENvdW50ID0gMDsKKwkJCQkJCW5hbWVGcmFnbWVudFN0YXJ0ID0gLTE7CisJCQkJCQluYW1lRnJhZ21lbnRFbmQgPSAtMTsKKwkJCQkJfQorCQkJCQkvLyBuZXh0IGluY3JlbWVudCB3aWxsIHNraXAgJz4nCisJCQkJCWJyZWFrOworCQkJfQorCQkJdGhpcy5uYW1lUG9zKys7CisJCX0KKwkJaWYgKG5hbWVGcmFnbWVudEVuZCA8IDApIG5hbWVGcmFnbWVudEVuZCA9IHRoaXMubmFtZVBvcy0xOworCQlpZiAoZnJhZ21lbnRzID09IG51bGwpIHsgLy8gbm9uIHBhcmFtZXRlcml6ZWQKKwkJCS8qIHJlYnVpbGQgaWRlbnRpZmllcnMgYW5kIGRpbWVuc2lvbnMgKi8KKwkJCWlmIChpZGVudENvdW50ID09IDEpIHsgLy8gc2ltcGxlIHR5cGUgcmVmZXJlbmNlCisJCQkJaWYgKGRpbSA9PSAwKSB7CisJCQkJCWNoYXJbXSBuYW1lRnJhZ21lbnQ7CisJCQkJCWlmIChuYW1lRnJhZ21lbnRTdGFydCAhPSAwIHx8IG5hbWVGcmFnbWVudEVuZCA+PSAwKSB7CisJCQkJCQlpbnQgbmFtZUZyYWdtZW50TGVuZ3RoID0gbmFtZUZyYWdtZW50RW5kIC0gbmFtZUZyYWdtZW50U3RhcnQgKyAxOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZSwgbmFtZUZyYWdtZW50U3RhcnQsIG5hbWVGcmFnbWVudCA9IG5ldyBjaGFyW25hbWVGcmFnbWVudExlbmd0aF0sIDAsIG5hbWVGcmFnbWVudExlbmd0aCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluYW1lRnJhZ21lbnQgPSB0eXBlTmFtZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UobmFtZUZyYWdtZW50LCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IG5hbWVGcmFnbWVudExlbmd0aCA9IG5hbWVGcmFnbWVudEVuZCAtIG5hbWVGcmFnbWVudFN0YXJ0ICsgMTsKKwkJCQkJY2hhcltdIG5hbWVGcmFnbWVudCA9IG5ldyBjaGFyW25hbWVGcmFnbWVudExlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnQsIDAsIG5hbWVGcmFnbWVudExlbmd0aCk7CisJCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKG5hbWVGcmFnbWVudCwgZGltLCAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZCk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlCisJCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOworCQkJCWxvbmcgcG9zID0gKChsb25nKSBzdGFydCA8PCAzMikgKyBlbmQ7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKKwkJCQkJcG9zaXRpb25zW2ldID0gcG9zOworCQkJCX0KKwkJCQljaGFyW11bXSBpZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCBuYW1lRnJhZ21lbnRTdGFydCwgbmFtZUZyYWdtZW50RW5kKzEpOworCQkJCWlmIChkaW0gPT0gMCkgeworCQkJCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIHBvc2l0aW9ucyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG5ldyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7IC8vIHBhcmFtZXRlcml6ZWQKKwkJCS8vIHJlYnVpbGQgdHlwZSByZWZlcmVuY2UgZnJvbSBhdmFpbGFibGUgZnJhZ21lbnRzOiBjaGFyW11bXSwgYXJndW1lbnRzLCBjaGFyW11bXSwgYXJndW1lbnRzLi4uCisJCQkvLyBjaGVjayB0cmFpbGluZyBxdWFsaWZpZWQgbmFtZQorCQkJaWYgKG5hbWVGcmFnbWVudFN0YXJ0ID4gMCAmJiBuYW1lRnJhZ21lbnRTdGFydCA8IGxlbmd0aCkgeworCQkJCWNoYXJbXVtdIGlkZW50aWZpZXJzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZU5hbWUsIG5hbWVGcmFnbWVudFN0YXJ0LCBuYW1lRnJhZ21lbnRFbmQrMSk7CisJCQkJZnJhZ21lbnRzLmFkZChpZGVudGlmaWVycyk7CisJCQl9CisJCQlpbnQgZnJhZ21lbnRMZW5ndGggPSBmcmFnbWVudHMuc2l6ZSgpOworCQkJaWYgKGZyYWdtZW50TGVuZ3RoID09IDIpIHsKKwkJCQljaGFyW11bXSBmaXJzdEZyYWdtZW50ID0gKGNoYXJbXVtdKSBmcmFnbWVudHMuZ2V0KDApOworCQkJCWlmIChmaXJzdEZyYWdtZW50Lmxlbmd0aCA9PSAxKSB7CisJCQkJCS8vIHBhcmFtZXRlcml6ZWQgc2luZ2xlIHR5cGUKKwkJCQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZShmaXJzdEZyYWdtZW50WzBdLCAoVHlwZVJlZmVyZW5jZVtdKSBmcmFnbWVudHMuZ2V0KDEpLCBkaW0sICgobG9uZykgc3RhcnQgPDwgMzIpICsgZW5kKTsKKwkJCQl9CisJCQl9CisJCQkvLyBwYXJhbWV0ZXJpemVkIHF1YWxpZmllZCB0eXBlCisJCQlpZGVudENvdW50ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRMZW5ndGg7IGkgKyspIHsKKwkJCQlPYmplY3QgZWxlbWVudCA9IGZyYWdtZW50cy5nZXQoaSk7CisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBjaGFyW11bXSkgeworCQkJCQlpZGVudENvdW50ICs9ICgoY2hhcltdW10pZWxlbWVudCkubGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2lkZW50Q291bnRdW107CisJCQlUeXBlUmVmZXJlbmNlW11bXSBhcmd1bWVudHMgPSBuZXcgVHlwZVJlZmVyZW5jZVtpZGVudENvdW50XVtdOworCQkJaW50IGluZGV4ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRMZW5ndGg7IGkgKyspIHsKKwkJCQlPYmplY3QgZWxlbWVudCA9IGZyYWdtZW50cy5nZXQoaSk7CisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBjaGFyW11bXSkgeworCQkJCQljaGFyW11bXSBmcmFnbWVudFRva2VucyA9IChjaGFyW11bXSkgZWxlbWVudDsKKwkJCQkJaW50IGZyYWdtZW50VG9rZW5MZW5ndGggPSBmcmFnbWVudFRva2Vucy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoZnJhZ21lbnRUb2tlbnMsIDAsIHRva2VucywgaW5kZXgsIGZyYWdtZW50VG9rZW5MZW5ndGgpOworCQkJCQlpbmRleCArPSBmcmFnbWVudFRva2VuTGVuZ3RoOworCQkJCX0gZWxzZSB7CisJCQkJCWFyZ3VtZW50c1tpbmRleC0xXSA9IChUeXBlUmVmZXJlbmNlW10pIGVsZW1lbnQ7CisJCQkJfQorCQkJfQorCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOworCQkJbG9uZyBwb3MgPSAoKGxvbmcpIHN0YXJ0IDw8IDMyKSArIGVuZDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRlbnRDb3VudDsgaSsrKSB7CisJCQkJcG9zaXRpb25zW2ldID0gcG9zOworCQkJfQorCQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGFyZ3VtZW50cywgZGltLCBwb3NpdGlvbnMpOworCQl9CisJfQorCisJcHJpdmF0ZSBUeXBlUmVmZXJlbmNlW10gZGVjb2RlVHlwZUFyZ3VtZW50cyhjaGFyW10gdHlwZU5hbWUsIGludCBsZW5ndGgsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbGVhbiBpbmNsdWRlR2VuZXJpY3NBbnl3YXkpIHsKKwkJQXJyYXlMaXN0IGFyZ3VtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7CisJCWludCBjb3VudCA9IDA7CisJCWFyZ3VtZW50c0xvb3A6IHdoaWxlICh0aGlzLm5hbWVQb3MgPCBsZW5ndGgpIHsKKwkJCVR5cGVSZWZlcmVuY2UgYXJndW1lbnQgPSBkZWNvZGVUeXBlKHR5cGVOYW1lLCBsZW5ndGgsIHN0YXJ0LCBlbmQsIGluY2x1ZGVHZW5lcmljc0FueXdheSk7CisJCQljb3VudCsrOworCQkJYXJndW1lbnRMaXN0LmFkZChhcmd1bWVudCk7CisJCQlpZiAodGhpcy5uYW1lUG9zID49IGxlbmd0aCkgYnJlYWsgYXJndW1lbnRzTG9vcDsKKwkJCWlmICh0eXBlTmFtZVt0aGlzLm5hbWVQb3NdID09ICc+JykgeworCQkJCWJyZWFrIGFyZ3VtZW50c0xvb3A7CisJCQl9CisJCQl0aGlzLm5hbWVQb3MrKzsgLy8gc2tpcCAnLCcKKwkJfQorCQlUeXBlUmVmZXJlbmNlW10gdHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlUmVmZXJlbmNlW2NvdW50XTsKKwkJYXJndW1lbnRMaXN0LnRvQXJyYXkodHlwZUFyZ3VtZW50cyk7CisJCXJldHVybiB0eXBlQXJndW1lbnRzOworCX0KKworCXByaXZhdGUgVHlwZVJlZmVyZW5jZVtdIGRlY29kZVR5cGVBcmd1bWVudHMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBsZW5ndGgsIGludCBzdGFydCwgaW50IGVuZCkgeworCQlBcnJheUxpc3QgYXJndW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJYXJndW1lbnRzTG9vcDogd2hpbGUgKHRoaXMubmFtZVBvcyA8IGxlbmd0aCkgeworCQkJVHlwZVJlZmVyZW5jZSBhcmd1bWVudCA9IGRlY29kZVR5cGUodHlwZVNpZ25hdHVyZSwgbGVuZ3RoLCBzdGFydCwgZW5kKTsKKwkJCWNvdW50Kys7CisJCQlhcmd1bWVudExpc3QuYWRkKGFyZ3VtZW50KTsKKwkJCWlmICh0aGlzLm5hbWVQb3MgPj0gbGVuZ3RoKSBicmVhayBhcmd1bWVudHNMb29wOworCQkJaWYgKHR5cGVTaWduYXR1cmUuY2hhckF0KHRoaXMubmFtZVBvcykgPT0gU2lnbmF0dXJlLkNfR0VORVJJQ19FTkQpIHsKKwkJCQlicmVhayBhcmd1bWVudHNMb29wOworCQkJfQorCQl9CisJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbmV3IFR5cGVSZWZlcmVuY2VbY291bnRdOworCQlhcmd1bWVudExpc3QudG9BcnJheSh0eXBlQXJndW1lbnRzKTsKKwkJcmV0dXJuIHR5cGVBcmd1bWVudHM7CisJfQorCisJcHJpdmF0ZSBjaGFyW11bXSBleHRyYWN0SWRlbnRpZmllcnMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBzdGFydCwgaW50IGVuZEluY2x1c2l2ZSwgaW50IGlkZW50Q291bnQpIHsKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbaWRlbnRDb3VudF1bXTsKKwkJaW50IGNoYXJJbmRleCA9IHN0YXJ0OworCQlpbnQgaSA9IDA7CisJCXdoaWxlIChjaGFySW5kZXggPCBlbmRJbmNsdXNpdmUpIHsKKwkJCWNoYXIgY3VycmVudENoYXI7CisJCQlpZiAoKGN1cnJlbnRDaGFyID0gdHlwZVNpZ25hdHVyZS5jaGFyQXQoY2hhckluZGV4KSkgPT0gdGhpcy5tZW1iZXJUeXBlU2VwYXJhdG9yIHx8IGN1cnJlbnRDaGFyID09IFNpZ25hdHVyZS5DX0RPVCkgeworCQkJCXR5cGVTaWduYXR1cmUuZ2V0Q2hhcnMoc3RhcnQsIGNoYXJJbmRleCwgcmVzdWx0W2krK10gPSBuZXcgY2hhcltjaGFySW5kZXggLSBzdGFydF0sIDApOworCQkJCXN0YXJ0ID0gKytjaGFySW5kZXg7CisJCQl9IGVsc2UKKwkJCQljaGFySW5kZXgrKzsKKwkJfQorCQl0eXBlU2lnbmF0dXJlLmdldENoYXJzKHN0YXJ0LCBjaGFySW5kZXggKyAxLCByZXN1bHRbaSsrXSA9IG5ldyBjaGFyW2NoYXJJbmRleCAtIHN0YXJ0ICsgMV0sIDApOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fubm90YXRhYmxlSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQW5ub3RhdGFibGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMWNlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fubm90YXRhYmxlSW5mby5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Tb3VyY2VSYW5nZTsKKworcHVibGljIGNsYXNzIEFubm90YXRhYmxlSW5mbyBleHRlbmRzIE1lbWJlckVsZW1lbnRJbmZvIHsKKworCS8qCisJICogVGhlIGFubm90YXRpb25zIG9mIHRoaXMgYW5ub3RhdGJsZS4gRW1wdHkgaWYgbm9uZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IEFubm90YXRpb24uTk9fQU5OT1RBVElPTlM7CisKKwkvKioKKwkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBtZW1iZXIncyBuYW1lIGluIHRoZSBpdHMKKwkgKiBvcGVuYWJsZSdzIGJ1ZmZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG5hbWVTdGFydD0gLTE7CisKKwkvKioKKwkgKiBUaGUgbGFzdCBwb3NpdGlvbiBvZiB0aGlzIG1lbWJlcidzIG5hbWUgaW4gdGhlIGl0cworCSAqIG9wZW5hYmxlJ3MgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCBpbnQgbmFtZUVuZD0gLTE7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGUjZ2V0TmFtZVNvdXJjZUVuZCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2QjZ2V0TmFtZVNvdXJjZUVuZCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZCNnZXROYW1lU291cmNlRW5kKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE5hbWVTb3VyY2VFbmQoKSB7CisJCXJldHVybiB0aGlzLm5hbWVFbmQ7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZSNnZXROYW1lU291cmNlU3RhcnQoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldE5hbWVTb3VyY2VTdGFydCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZCNnZXROYW1lU291cmNlU3RhcnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmFtZVNvdXJjZVN0YXJ0KCkgeworCQlyZXR1cm4gdGhpcy5uYW1lU3RhcnQ7CisJfQorCS8qKgorCSAqIFNldHMgdGhlIGxhc3QgcG9zaXRpb24gb2YgdGhpcyBtZW1iZXIncyBuYW1lLCByZWxhdGl2ZQorCSAqIHRvIGl0cyBvcGVuYWJsZSdzIHNvdXJjZSBidWZmZXIuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZVNvdXJjZUVuZChpbnQgZW5kKSB7CisJCXRoaXMubmFtZUVuZD0gZW5kOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGlzIG1lbWJlcidzIG5hbWUsIHJlbGF0aXZlCisJICogdG8gaXRzIG9wZW5hYmxlJ3Mgc291cmNlIGJ1ZmZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lU291cmNlU3RhcnQoaW50IHN0YXJ0KSB7CisJCXRoaXMubmFtZVN0YXJ0PSBzdGFydDsKKwl9CisJcHJvdGVjdGVkIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB7CisJCXJldHVybiBuZXcgU291cmNlUmFuZ2UodGhpcy5uYW1lU3RhcnQsIHRoaXMubmFtZUVuZCAtIHRoaXMubmFtZVN0YXJ0ICsgMSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQW5ub3RhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDE4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlFbGVtZW50VmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKKworcHVibGljIGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50IGltcGxlbWVudHMgSUFubm90YXRpb24geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBJQW5ub3RhdGlvbltdIE5PX0FOTk9UQVRJT05TID0gbmV3IElBbm5vdGF0aW9uWzBdOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSU1lbWJlclZhbHVlUGFpcltdIE5PX01FTUJFUl9WQUxVRV9QQUlSUyA9IG5ldyBJTWVtYmVyVmFsdWVQYWlyWzBdOworCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCS8vIHJlcXVpcmUgdG8gZGlzdGluZ3Vpc2ggc2FtZSBhbm5vdGF0aW9ucyBpbiBkaWZmZXJlbnQgbWVtYmVyIHZhbHVlIHBhaXJzCisJcHJvdGVjdGVkIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lOworCisJcHVibGljIEFubm90YXRpb24oSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCQl0aGlzKHBhcmVudCwgbmFtZSwgbnVsbCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24oSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5tZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyTmFtZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKCEobyBpbnN0YW5jZW9mIEFubm90YXRpb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQW5ub3RhdGlvbiBvdGhlciA9IChBbm5vdGF0aW9uKSBvOworCQlpZiAodGhpcy5tZW1iZXJWYWx1ZVBhaXJOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5tZW1iZXJWYWx1ZVBhaXJOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF0aGlzLm1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKG90aGVyLm1lbWJlclZhbHVlUGFpck5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJLy8gbmFtZSBlcXVhbGl0eSBpcyBjaGVja2VkIGFzIHBhcnQgb2YgdGhlIHN1cGVyLmVxdWFscyguLikKKwkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKKwl9CisKKwlwdWJsaWMgSU1lbWJlciBnZXREZWNsYXJpbmdNZW1iZXIoKSB7CisJCXJldHVybiAoSU1lbWJlcikgZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTjsKKwl9CisKKwlwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCQlyZXR1cm4gSmF2YUVsZW1lbnQuSkVNX0FOTk9UQVRJT047CisJfQorCisJcHVibGljIElNZW1iZXJWYWx1ZVBhaXJbXSBnZXRNZW1iZXJWYWx1ZVBhaXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCU9iamVjdCBpbmZvID0gZ2V0RWxlbWVudEluZm8oKTsKKwkJaWYgKGluZm8gaW5zdGFuY2VvZiBBbm5vdGF0aW9uSW5mbykKKwkJCXJldHVybiAoKEFubm90YXRpb25JbmZvKSBpbmZvKS5tZW1iZXJzOworCQlJQmluYXJ5RWxlbWVudFZhbHVlUGFpcltdIGJpbmFyeUFubm90YXRpb25zID0gKChJQmluYXJ5QW5ub3RhdGlvbikgaW5mbykuZ2V0RWxlbWVudFZhbHVlUGFpcnMoKTsKKwkJaW50IGxlbmd0aCA9IGJpbmFyeUFubm90YXRpb25zLmxlbmd0aDsKKwkJSU1lbWJlclZhbHVlUGFpcltdIHJlc3VsdCA9IG5ldyBJTWVtYmVyVmFsdWVQYWlyW2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlCaW5hcnlFbGVtZW50VmFsdWVQYWlyIGJpbmFyeUFubm90YXRpb24gPSBiaW5hcnlBbm5vdGF0aW9uc1tpXTsKKwkJCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKG5ldyBTdHJpbmcoYmluYXJ5QW5ub3RhdGlvbi5nZXROYW1lKCkpKTsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZSA9IFV0aWwuZ2V0QW5ub3RhdGlvbk1lbWJlclZhbHVlKHRoaXMsIG1lbWJlclZhbHVlUGFpciwgYmluYXJ5QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJCXJlc3VsdFtpXSA9IG1lbWJlclZhbHVlUGFpcjsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOworCQlpZiAobWFwcGVyICE9IG51bGwpIHsKKwkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoQ2xhc3NGaWxlKWdldENsYXNzRmlsZSgpOworCQkJaWYgKGNsYXNzRmlsZSAhPSBudWxsKSB7CisJCQkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAorCQkJCWNsYXNzRmlsZS5nZXRCdWZmZXIoKTsKKwkJCQlyZXR1cm4gbWFwcGVyLmdldE5hbWVSYW5nZSh0aGlzKTsKKwkJCX0KKwkJfQorCQlPYmplY3QgaW5mbyA9IGdldEVsZW1lbnRJbmZvKCk7CisJCWlmIChpbmZvIGluc3RhbmNlb2YgQW5ub3RhdGlvbkluZm8pIHsKKwkJCUFubm90YXRpb25JbmZvIGFubm90YXRpb25JbmZvID0gKEFubm90YXRpb25JbmZvKSBpbmZvOworCQkJcmV0dXJuIG5ldyBTb3VyY2VSYW5nZShhbm5vdGF0aW9uSW5mby5uYW1lU3RhcnQsIGFubm90YXRpb25JbmZvLm5hbWVFbmQgLSBhbm5vdGF0aW9uSW5mby5uYW1lU3RhcnQgKyAxKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZVJlZmVyZW5jZQorCSAqLworCXB1YmxpYyBJU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJU291cmNlTWFwcGVyIG1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7CisJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAorCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpZ2V0Q2xhc3NGaWxlKCk7CisJCQlpZiAoY2xhc3NGaWxlICE9IG51bGwpIHsKKwkJCQljbGFzc0ZpbGUuZ2V0QnVmZmVyKCk7CisJCQkJcmV0dXJuIG1hcHBlci5nZXRTb3VyY2VSYW5nZSh0aGlzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlUmFuZ2UoKTsKKwl9CisKKwlwdWJsaWMgSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoKSB7CisJCXJldHVybiAoKEphdmFFbGVtZW50KWdldFBhcmVudCgpKS5nZXRDbGFzc0ZpbGUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IHN1cGVyLmhhc2hDb2RlKCk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0aGlzLm1lbWJlclZhbHVlUGFpck5hbWUgPT0gbnVsbCkgPyAwIDogdGhpcy5tZW1iZXJWYWx1ZVBhaXJOYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHRoaXMubmFtZS5oYXNoQ29kZSgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nTmFtZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bbm5vdGF0aW9uSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQW5ub3RhdGlvbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTExNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQW5ub3RhdGlvbkluZm8uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOworCisvKgorICogRWxlbWVudCBpbmZvIGZvciBhbiBJQW5ub3RhdGlvbiBlbGVtZW50IHRoYXQgb3JpZ2luYXRlZCBmcm9tIHNvdXJjZS4KKyAqLworcHVibGljIGNsYXNzIEFubm90YXRpb25JbmZvIGV4dGVuZHMgU291cmNlUmVmRWxlbWVudEluZm8geworCisJLyoKKwkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uJ3MgbmFtZSBpbiB0aGUgaXRzCisJICogb3BlbmFibGUncyBidWZmZXIuCisJICovCisJcHVibGljIGludCBuYW1lU3RhcnQ9IC0xOworCisJLyoKKwkgKiBUaGUgbGFzdCBwb3NpdGlvbiBvZiB0aGlzIGFubm90YXRpb24gaW4gdGhlIGl0cworCSAqIG9wZW5hYmxlJ3MgYnVmZmVyLgorCSAqLworCXB1YmxpYyBpbnQgbmFtZUVuZD0gLTE7CisKKwkvKgorCSAqIFRoZSBtZW1iZXItdmFsdWUgcGFpcnMgb2YgdGhpcyBhbm5vdGF0aW9uLgorCSAqLworCXB1YmxpYyBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyczsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmFzaWNDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Jhc2ljQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggNjI4NDViMi4uM2I3ZTNhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmFzaWNDb21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDEzICsyOSwxMyBAQAogICovCiBwdWJsaWMgY2xhc3MgQmFzaWNDb21waWxhdGlvblVuaXQgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0IHsKIAlwcm90ZWN0ZWQgY2hhcltdIGNvbnRlbnRzOwotCQorCiAJLy8gTm90ZSB0aGF0IGlmIHRoaXMgY29tcGlsZXIgSUNvbXBpbGF0aW9uVW5pdCdzIGNvbnRlbnQgaXMga25vd24gaW4gYWR2YW5jZSwgdGhlIGZpbGVOYW1lIGlzIG5vdCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgY29udGVudC4KIAkvLyBJbnN0ZWFkIGl0IGlzIHVzZWQgdG8ga2VlcCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gcmVjcmVhdGUgdGhlIElKYXZhRWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29tcGlsZXIgSUNvbXBpbGF0aW9uVW5pdC4KIAkvLyBUaHVzIHRoZSBmaWxlTmFtZSBjYW4gYmUgYSBwYXRoIHRvIGEgLmNsYXNzIGZpbGUsIG9yIGV2ZW4gYSBwYXRoIGluIGEgLmphciB0byBhIC5jbGFzcyBmaWxlLgogCS8vIChlLmcuIC9QL2xpYi9teWxpYi5qYXJ8b3JnL2VjbGlwc2UvdGVzdC9YLmNsYXNzKQotCXByb3RlY3RlZCBjaGFyW10gZmlsZU5hbWU7IAotCQorCXByb3RlY3RlZCBjaGFyW10gZmlsZU5hbWU7CisKIAlwcm90ZWN0ZWQgY2hhcltdW10gcGFja2FnZU5hbWU7CiAJcHJvdGVjdGVkIGNoYXJbXSBtYWluVHlwZU5hbWU7CiAJcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZzsKQEAgLTc2LDYgKzc2LDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCS8vIGlmIG5vIGZpbGUsIHRoZW4gZ2V0IHByb2plY3QgZW5jb2RpbmcKKwkJCQkJLy8gJEZBTEwtVEhST1VHSCQKIAkJCQlkZWZhdWx0OgogCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBqYXZhUHJvamVjdC5nZXRSZXNvdXJjZSgpOwogCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7CkBAIC0xMTcsMTQgKzExOCwxNCBAQAogCQlpbnQgc2VwYXJhdG9yID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCd8JywgdGhpcy5maWxlTmFtZSkgKyAxOwogCQlpZiAoc2VwYXJhdG9yID4gc3RhcnQpIC8vIGNhc2Ugb2YgYSAuY2xhc3MgZmlsZSBpbiBhIGRlZmF1bHQgcGFja2FnZSBpbiBhIGphcgogCQkJc3RhcnQgPSBzZXBhcmF0b3I7Ci0JCisKIAkJaW50IGVuZCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyQnLCB0aGlzLmZpbGVOYW1lKTsKIAkJaWYgKGVuZCA9PSAtMSB8fCAhVXRpbC5pc0NsYXNzRmlsZU5hbWUodGhpcy5maWxlTmFtZSkpIHsKIAkJCWVuZCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCB0aGlzLmZpbGVOYW1lKTsKIAkJCWlmIChlbmQgPT0gLTEpCiAJCQkJZW5kID0gdGhpcy5maWxlTmFtZS5sZW5ndGg7CiAJCX0KLQkKKwogCQl0aGlzLm1haW5UeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodGhpcy5maWxlTmFtZSwgc3RhcnQsIGVuZCk7CiAJfQogCXJldHVybiB0aGlzLm1haW5UeXBlTmFtZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JhdGNoSW5pdGlhbGl6YXRpb25Nb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXRjaEluaXRpYWxpemF0aW9uTW9uaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWJlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXRjaEluaXRpYWxpemF0aW9uTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcHVibGljIGNsYXNzIEJhdGNoSW5pdGlhbGl6YXRpb25Nb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7CisKKwlwdWJsaWMgVGhyZWFkTG9jYWwgaW5pdGlhbGl6ZUFmdGVyTG9hZE1vbml0b3IgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworCXB1YmxpYyBTdHJpbmcgc3ViVGFza05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBpbnQgd29ya2VkID0gMDsKKworCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yKCkgeworCQlyZXR1cm4gKElQcm9ncmVzc01vbml0b3IpIHRoaXMuaW5pdGlhbGl6ZUFmdGVyTG9hZE1vbml0b3IuZ2V0KCk7CisJfQorCisJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7CisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldE1vbml0b3IoKTsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCW1vbml0b3IuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7CisJfQorCisJcHVibGljIHZvaWQgZG9uZSgpIHsKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZ2V0TW9uaXRvcigpOworCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJbW9uaXRvci5kb25lKCk7CisJCXRoaXMud29ya2VkID0gMDsKKwkJdGhpcy5zdWJUYXNrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZ2V0TW9uaXRvcigpOworCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJbW9uaXRvci5pbnRlcm5hbFdvcmtlZCh3b3JrKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBnZXRNb25pdG9yKCk7CisJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQlyZXR1cm4gbW9uaXRvci5pc0NhbmNlbGVkKCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7CisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldE1vbml0b3IoKTsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodmFsdWUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7CisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldE1vbml0b3IoKTsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCW1vbml0b3Iuc2V0VGFza05hbWUobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgeworCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBnZXRNb25pdG9yKCk7CisJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQltb25pdG9yLnN1YlRhc2sobmFtZSk7CisJCXRoaXMuc3ViVGFza05hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgeworCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBnZXRNb25pdG9yKCk7CisJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQltb25pdG9yLndvcmtlZCh3b3JrKTsKKwkJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJCXRoaXMud29ya2VkICs9IHdvcms7CisJCX0KKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRXb3JrZWQoKSB7CisJCWludCByZXN1bHQgPSB0aGlzLndvcmtlZDsKKwkJdGhpcy53b3JrZWQgPSAwOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JhdGNoT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXRjaE9wZXJhdGlvbi5qYXZhCmluZGV4IDE0MmMyZDUuLjMxOGU4ZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JhdGNoT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmF0Y2hPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMCw3ICszMCw3IEBACiAJCS8vIGFueXRoaW5nIGluIHRoZSB3b3Jrc3BhY2UgcnVubmFibGUgY2FuIG1vZGlmeSB0aGUgcm9vdHMKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsT3BlcmF0aW9uI2V4ZWN1dGVPcGVyYXRpb24oKQogCSAqLwpAQCAtNTEsNyArNTEsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsT3BlcmF0aW9uI3ZlcmlmeSgpCiAJICovCkBAIC02MCw1ICs2MCw1IEBACiAJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CiAJfQogCi0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JlY29tZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CZWNvbWVXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCmluZGV4IDdmYTUxNGIuLmExMzIxNTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JlY29tZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmVjb21lV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw5ICsxOSw5IEBACiAgKiBhbmQgc2lnbmFsIHRoZSB3b3JraW5nIGNvcHkgYWRkaXRpb24gdGhyb3VnaCBhIGRlbHRhLgogICovCiBwdWJsaWMgY2xhc3MgQmVjb21lV29ya2luZ0NvcHlPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24gewotCQorCiAJSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcjsKLQkKKwogCS8qCiAJICogQ3JlYXRlcyBhIEJlY29tZVdvcmtpbmdDb3B5T3BlcmF0aW9uIGZvciB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5LgogCSAqIHBlck93bmVyV29ya2luZ0NvcGllcyBtYXAgaXMgbm90IG51bGwgaWYgdGhlIHdvcmtpbmcgY29weSBpcyBhIHNoYXJlZCB3b3JraW5nIGNvcHkuCkBAIC01MCw3ICs1MCw3IEBACiAJCQkJYWRkRGVsdGEoZGVsdGEpOwogCQkJfSBlbHNlIHsKIAkJCQkvLyByZXBvcnQgYW4gQURERUQgZGVsdGEKLQkJCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEodGhpcy5nZXRKYXZhTW9kZWwoKSk7CisJCQkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGdldEphdmFNb2RlbCgpKTsKIAkJCQlkZWx0YS5hZGRlZCh3b3JraW5nQ29weSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSk7CiAJCQkJYWRkRGVsdGEoZGVsdGEpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5RmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeUZpZWxkLmphdmEKaW5kZXggOTkzNGE1NS4uOWQyMGU1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5RmllbGQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEwICsxMiwxMSBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIApAQCAtMjYsNyArMjcsNyBAQAogLyogcGFja2FnZSAqLyBjbGFzcyBCaW5hcnlGaWVsZCBleHRlbmRzIEJpbmFyeU1lbWJlciBpbXBsZW1lbnRzIElGaWVsZCB7CiAKIC8qCi0gKiBDb25zdHJ1Y3RzIGEgaGFuZGxlIHRvIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBzcGVjaWZpZWQgdHlwZS4gCisgKiBDb25zdHJ1Y3RzIGEgaGFuZGxlIHRvIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAqLwogcHJvdGVjdGVkIEJpbmFyeUZpZWxkKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKIAlzdXBlcihwYXJlbnQsIG5hbWUpOwpAQCAtMzUsNiArMzYsMTEgQEAKIAlpZiAoIShvIGluc3RhbmNlb2YgQmluYXJ5RmllbGQpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKIH0KK3B1YmxpYyBJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRFbGVtZW50SW5mbygpOworCUlCaW5hcnlBbm5vdGF0aW9uW10gYmluYXJ5QW5ub3RhdGlvbnMgPSBpbmZvLmdldEFubm90YXRpb25zKCk7CisJcmV0dXJuIGdldEFubm90YXRpb25zKGJpbmFyeUFubm90YXRpb25zLCBpbmZvLmdldFRhZ0JpdHMoKSk7Cit9CiAvKgogICogQHNlZSBJRmllbGQKICAqLwpAQCAtNjksNiArNzUsMTAgQEAKICAqLwogcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRFbGVtZW50SW5mbygpOworCWNoYXJbXSBnZW5lcmljU2lnbmF0dXJlID0gaW5mby5nZXRHZW5lcmljU2lnbmF0dXJlKCk7CisJaWYgKGdlbmVyaWNTaWduYXR1cmUgIT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IFN0cmluZyhDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWUoZ2VuZXJpY1NpZ25hdHVyZSkpOworCX0KIAlyZXR1cm4gbmV3IFN0cmluZyhDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWUoaW5mby5nZXRUeXBlTmFtZSgpKSk7CiB9CiAvKiAobm9uLUphdmFkb2MpCkBAIC05MSw3ICsxMDEsNyBAQAogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKIAlpZiAoaW5mbyA9PSBudWxsKSB7CiAJCXRvU3RyaW5nTmFtZShidWZmZXIpOwogCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCkBAIC05OSw3ICsxMDksNyBAQAogCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAl9IGVsc2UgewogCQl0cnkgewotCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcodGhpcy5nZXRUeXBlU2lnbmF0dXJlKCkpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKGdldFR5cGVTaWduYXR1cmUoKSkpOwogCQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCiAJCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKQEAgLTEwOCwyMyArMTE4LDggQEAKIAl9CiB9CiBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZyBjb250ZW50cyA9ICgoQmluYXJ5VHlwZSkgdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkpLmdldEphdmFkb2NDb250ZW50cyhtb25pdG9yKTsKLQlpZiAoY29udGVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JaW50IGluZGV4QW5jaG9yID0gY29udGVudHMuaW5kZXhPZigKLQkJCUphdmFkb2NDb25zdGFudHMuQU5DSE9SX1BSRUZJWF9TVEFSVCArIHRoaXMuZ2V0RWxlbWVudE5hbWUoKSArIEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1BSRUZJWF9FTkQpOwotCWlmIChpbmRleEFuY2hvciA9PSAtMSkgdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuVU5LTk9XTl9KQVZBRE9DX0ZPUk1BVCwgdGhpcykpOwotCWludCBpbmRleE9mRW5kTGluayA9IGNvbnRlbnRzLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5BTkNIT1JfU1VGRklYLCBpbmRleEFuY2hvcik7Ci0JaWYgKGluZGV4T2ZFbmRMaW5rID09IC0xKSB0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JaW50IGluZGV4T2ZOZXh0RmllbGQgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1BSRUZJWF9TVEFSVCwgaW5kZXhPZkVuZExpbmspOwotCWludCBpbmRleE9mQm90dG9tID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkNPTlNUUlVDVE9SX0RFVEFJTCwgaW5kZXhPZkVuZExpbmspOwotCWlmIChpbmRleE9mQm90dG9tID09IC0xKSB7Ci0JCWluZGV4T2ZCb3R0b20gPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuTUVUSE9EX0RFVEFJTCwgaW5kZXhPZkVuZExpbmspOwotCQlpZiAoaW5kZXhPZkJvdHRvbSA9PSAtMSkgewotCQkJaW5kZXhPZkJvdHRvbSA9IGNvbnRlbnRzLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5FTkRfT0ZfQ0xBU1NfREFUQSwgaW5kZXhPZkVuZExpbmspOwotCQl9Ci0JfQotCWluZGV4T2ZOZXh0RmllbGQ9IE1hdGgubWluKGluZGV4T2ZOZXh0RmllbGQsIGluZGV4T2ZCb3R0b20pOwotCWlmIChpbmRleE9mTmV4dEZpZWxkID09IC0xKSB0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JcmV0dXJuIGNvbnRlbnRzLnN1YnN0cmluZyhpbmRleE9mRW5kTGluayArIEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1NVRkZJWF9MRU5HVEgsIGluZGV4T2ZOZXh0RmllbGQpOworCUphdmFkb2NDb250ZW50cyBqYXZhZG9jQ29udGVudHMgPSAoKEJpbmFyeVR5cGUpIHRoaXMuZ2V0RGVjbGFyaW5nVHlwZSgpKS5nZXRKYXZhZG9jQ29udGVudHMobW9uaXRvcik7CisJaWYgKGphdmFkb2NDb250ZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlyZXR1cm4gamF2YWRvY0NvbnRlbnRzLmdldEZpZWxkRG9jKHRoaXMpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZW1iZXIuamF2YQppbmRleCA5ZWE2NzIzLi42MDMwMGNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZW1iZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZW1iZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxOSArMTAsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlRhZ0JpdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCiAgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgQmluYXJ5IG1lbWJlciBoYW5kbGVzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5TWVtYmVyIGV4dGVuZHMgTmFtZWRNZW1iZXIgeworCQkKIC8qCiAgKiBDb25zdHJ1Y3RzIGEgYmluYXJ5IG1lbWJlci4KICAqLwpAQCAtMzUsMjggKzQxLDY5IEBACiBwdWJsaWMgdm9pZCBjb3B5KElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgdGhpcykpOwogfQotLyoKLSAqIEBzZWUgSmF2YUVsZW1lbnQjZ2VuZXJhdGVJbmZvcwotICovCi1wcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUluZm9zKE9iamVjdCBpbmZvLCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlPcGVuYWJsZSBvcGVuYWJsZVBhcmVudCA9IChPcGVuYWJsZSkgZ2V0T3BlbmFibGVQYXJlbnQoKTsKLQlpZiAoSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyhvcGVuYWJsZVBhcmVudCkgPT0gbnVsbCkgewotCQlvcGVuYWJsZVBhcmVudC5nZW5lcmF0ZUluZm9zKG9wZW5hYmxlUGFyZW50LmNyZWF0ZUVsZW1lbnRJbmZvKCksIG5ld0VsZW1lbnRzLCBwbSk7Citwcm90ZWN0ZWQgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucyhJQmluYXJ5QW5ub3RhdGlvbltdIGJpbmFyeUFubm90YXRpb25zLCBsb25nIHRhZ0JpdHMpIHsKKwlJQW5ub3RhdGlvbltdIHN0YW5kYXJkQW5ub3RhdGlvbnMgPSBnZXRTdGFuZGFyZEFubm90YXRpb25zKHRhZ0JpdHMpOworCWlmIChiaW5hcnlBbm5vdGF0aW9ucyA9PSBudWxsKQorCQlyZXR1cm4gc3RhbmRhcmRBbm5vdGF0aW9uczsKKwlpbnQgbGVuZ3RoID0gYmluYXJ5QW5ub3RhdGlvbnMubGVuZ3RoOworCWludCBzdGFuZGFyZExlbmd0aCA9IHN0YW5kYXJkQW5ub3RhdGlvbnMubGVuZ3RoOworCWludCBmdWxsTGVuZ3RoID0gbGVuZ3RoICsgc3RhbmRhcmRMZW5ndGg7CisJaWYgKGZ1bGxMZW5ndGggPT0gMCkgeworCQlyZXR1cm4gQW5ub3RhdGlvbi5OT19BTk5PVEFUSU9OUzsKIAl9CisJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IG5ldyBJQW5ub3RhdGlvbltmdWxsTGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWFubm90YXRpb25zW2ldID0gVXRpbC5nZXRBbm5vdGF0aW9uKHRoaXMsIGJpbmFyeUFubm90YXRpb25zW2ldLCBudWxsKTsKKwl9CisJU3lzdGVtLmFycmF5Y29weShzdGFuZGFyZEFubm90YXRpb25zLCAwLCBhbm5vdGF0aW9ucywgbGVuZ3RoLCBzdGFuZGFyZExlbmd0aCk7CisJcmV0dXJuIGFubm90YXRpb25zOwogfQorcHJpdmF0ZSBJQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGNoYXJbXVtdIGFubm90YXRpb25OYW1lKSB7CisJcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHRoaXMsIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFubm90YXRpb25OYW1lLCAnLicpKSk7Cit9Citwcm90ZWN0ZWQgSUFubm90YXRpb25bXSBnZXRTdGFuZGFyZEFubm90YXRpb25zKGxvbmcgdGFnQml0cykgeworCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQWxsU3RhbmRhcmRBbm5vdGF0aW9uc01hc2spID09IDApCisJCXJldHVybiBBbm5vdGF0aW9uLk5PX0FOTk9UQVRJT05TOworCUFycmF5TGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKworCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblRhcmdldE1BU0spICE9IDApIHsKKwkJYW5ub3RhdGlvbnMuYWRkKGdldEFubm90YXRpb24oVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVQpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmV0ZW50aW9uTUFTSykgIT0gMCkgeworCQlhbm5vdGF0aW9ucy5hZGQoZ2V0QW5ub3RhdGlvbihUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTikpOworCX0KKwlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25EZXByZWNhdGVkKSAhPSAwKSB7CisJCWFubm90YXRpb25zLmFkZChnZXRBbm5vdGF0aW9uKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0RFUFJFQ0FURUQpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRG9jdW1lbnRlZCkgIT0gMCkgeworCQlhbm5vdGF0aW9ucy5hZGQoZ2V0QW5ub3RhdGlvbihUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX0RPQ1VNRU5URUQpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uSW5oZXJpdGVkKSAhPSAwKSB7CisJCWFubm90YXRpb25zLmFkZChnZXRBbm5vdGF0aW9uKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fSU5IRVJJVEVEKSk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblBvbHltb3JwaGljU2lnbmF0dXJlKSAhPSAwKSB7CisJCWFubm90YXRpb25zLmFkZChnZXRBbm5vdGF0aW9uKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVk9LRV9NRVRIT0RIQU5ETEVfJF9QT0xZTU9SUEhJQ1NJR05BVFVSRSkpOworCX0KKwlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25TYWZlVmFyYXJncykgIT0gMCkgeworCQlhbm5vdGF0aW9ucy5hZGQoZ2V0QW5ub3RhdGlvbihUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19TQUZFVkFSQVJHUykpOworCX0KKwkvLyBub3RlIHRoYXQgSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1MgYW5kIEpBVkFfTEFOR19PVkVSUklERSBjYW5ub3QgYXBwZWFyIGluIGJpbmFyaWVzCisJcmV0dXJuIChJQW5ub3RhdGlvbltdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldyBJQW5ub3RhdGlvblthbm5vdGF0aW9ucy5zaXplKCldKTsKK30KKwogcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3JpZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlTb3VyY2VNYXBwZXIgbWFwcGVyPSBnZXRTb3VyY2VNYXBwZXIoKTsKIAlpZiAobWFwcGVyICE9IG51bGwpIHsKIAkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBjYXRlZ29yaWVzIGFyZSBjb21wdXRlZAogCQkoKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKSkuZ2V0QnVmZmVyKCk7Ci0JCQorCiAJCWlmIChtYXBwZXIuY2F0ZWdvcmllcyAhPSBudWxsKSB7CiAJCQlTdHJpbmdbXSBjYXRlZ29yaWVzID0gKFN0cmluZ1tdKSBtYXBwZXIuY2F0ZWdvcmllcy5nZXQodGhpcyk7CiAJCQlpZiAoY2F0ZWdvcmllcyAhPSBudWxsKQogCQkJCXJldHVybiBjYXRlZ29yaWVzOwogCQl9CiAJfQotCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CQorCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CiB9CiBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKIAl0cnkgewpAQCAtNzgsNyArMTI1LDcgQEAKIAlpZiAobWFwcGVyICE9IG51bGwpIHsKIAkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAogCQkoKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKSkuZ2V0QnVmZmVyKCk7Ci0JCQorCiAJCXJldHVybiBtYXBwZXIuZ2V0TmFtZVJhbmdlKHRoaXMpOwogCX0gZWxzZSB7CiAJCXJldHVybiBTb3VyY2VNYXBwZXIuVU5LTk9XTl9SQU5HRTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKaW5kZXggMDlhNzUzMS4uYzhhMWZhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOSArMTEsMTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKQEAgLTI3LDEwICszNywxMiBAQAogLyogcGFja2FnZSAqLyBjbGFzcyBCaW5hcnlNZXRob2QgZXh0ZW5kcyBCaW5hcnlNZW1iZXIgaW1wbGVtZW50cyBJTWV0aG9kIHsKIAkvKioKIAkgKiBUaGUgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgbWV0aG9kIC0gc3RvcmVkIGxvY2FsbHkKLQkgKiB0byBwZXJmb3JtIGVxdWFsaXR5IHRlc3QuIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyBubworCSAqIHRvIHBlcmZvcm0gZXF1YWxpdHkgdGVzdC4gPGNvZGU+Q2hhck9wZXJhdGlvbi5OT19TVFJJTkdTPC9jb2RlPiBpbmRpY2F0ZXMgbm8KIAkgKiBwYXJhbWV0ZXJzLgogCSAqLwogCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlczsKKwlwcm90ZWN0ZWQgU3RyaW5nIFtdIGVyYXNlZFBhcmFtYXRlclR5cGVzOyAvLyBsYXppbHkgaW5pdGlhbGl6ZWQgdmlhIGNhbGwgdG8gZ2V0RXJhc2VkUGFyYW1ldGVyVHlwZXMKKwkKIAkvKioKIAkgKiBUaGUgcGFyYW1ldGVyIG5hbWVzIGZvciB0aGUgbWV0aG9kLgogCSAqLwpAQCAtNTEsNyArNjMsNjYgQEAKIH0KIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCWlmICghKG8gaW5zdGFuY2VvZiBCaW5hcnlNZXRob2QpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHN1cGVyLmVxdWFscyhvKSAmJiBVdGlsLmVxdWFsQXJyYXlzT3JOdWxsKHRoaXMucGFyYW1ldGVyVHlwZXMsICgoQmluYXJ5TWV0aG9kKW8pLnBhcmFtZXRlclR5cGVzKTsKKwlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pICYmIFV0aWwuZXF1YWxBcnJheXNPck51bGwoZ2V0RXJhc2VkUGFyYW1ldGVyVHlwZXMoKSwgKChCaW5hcnlNZXRob2QpbykuZ2V0RXJhc2VkUGFyYW1ldGVyVHlwZXMoKSk7Cit9CitwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRFbGVtZW50SW5mbygpOworCUlCaW5hcnlBbm5vdGF0aW9uW10gYmluYXJ5QW5ub3RhdGlvbnMgPSBpbmZvLmdldEFubm90YXRpb25zKCk7CisJcmV0dXJuIGdldEFubm90YXRpb25zKGJpbmFyeUFubm90YXRpb25zLCBpbmZvLmdldFRhZ0JpdHMoKSk7Cit9CitwdWJsaWMgSUxvY2FsVmFyaWFibGVbXSBnZXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CisJaW50IGxlbmd0aCA9IHRoaXMucGFyYW1ldGVyVHlwZXMubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkgeworCQlyZXR1cm4gTG9jYWxWYXJpYWJsZS5OT19MT0NBTF9WQVJJQUJMRVM7CisJfQorCUlMb2NhbFZhcmlhYmxlW10gbG9jYWxWYXJpYWJsZXMgPSBuZXcgSUxvY2FsVmFyaWFibGVbbGVuZ3RoXTsKKwljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gaW5mby5nZXRBcmd1bWVudE5hbWVzKCk7CisJaWYgKGFyZ3VtZW50TmFtZXMgPT0gbnVsbCB8fCBhcmd1bWVudE5hbWVzLmxlbmd0aCA8IGxlbmd0aCkgeworCQlhcmd1bWVudE5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQlhcmd1bWVudE5hbWVzW2pdID0gKCJhcmciICsgaikudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZSgKKwkJCQl0aGlzLAorCQkJCW5ldyBTdHJpbmcoYXJndW1lbnROYW1lc1tpXSksCisJCQkJMCwKKwkJCQktMSwKKwkJCQkwLAorCQkJCS0xLAorCQkJCXRoaXMucGFyYW1ldGVyVHlwZXNbaV0sCisJCQkJbnVsbCwKKwkJCQktMSwKKwkJCQl0cnVlKTsKKwkJbG9jYWxWYXJpYWJsZXNbaV0gPSBsb2NhbFZhcmlhYmxlOworCQlJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gZ2V0QW5ub3RhdGlvbnMobG9jYWxWYXJpYWJsZSwgaW5mby5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhpKSwgaW5mby5nZXRUYWdCaXRzKCkpOworCQlsb2NhbFZhcmlhYmxlLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJfQorCXJldHVybiBsb2NhbFZhcmlhYmxlczsKK30KK3ByaXZhdGUgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucyhKYXZhRWxlbWVudCBhbm5vdGF0aW9uUGFyZW50LCBJQmluYXJ5QW5ub3RhdGlvbltdIGJpbmFyeUFubm90YXRpb25zLCBsb25nIHRhZ0JpdHMpIHsKKwlJQW5ub3RhdGlvbltdIHN0YW5kYXJkQW5ub3RhdGlvbnMgPSBnZXRTdGFuZGFyZEFubm90YXRpb25zKHRhZ0JpdHMpOworCWlmIChiaW5hcnlBbm5vdGF0aW9ucyA9PSBudWxsKQorCQlyZXR1cm4gc3RhbmRhcmRBbm5vdGF0aW9uczsKKwlpbnQgbGVuZ3RoID0gYmluYXJ5QW5ub3RhdGlvbnMubGVuZ3RoOworCWludCBzdGFuZGFyZExlbmd0aCA9IHN0YW5kYXJkQW5ub3RhdGlvbnMubGVuZ3RoOworCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBuZXcgSUFubm90YXRpb25bbGVuZ3RoICsgc3RhbmRhcmRMZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJYW5ub3RhdGlvbnNbaV0gPSBVdGlsLmdldEFubm90YXRpb24oYW5ub3RhdGlvblBhcmVudCwgYmluYXJ5QW5ub3RhdGlvbnNbaV0sIG51bGwpOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KHN0YW5kYXJkQW5ub3RhdGlvbnMsIDAsIGFubm90YXRpb25zLCBsZW5ndGgsIHN0YW5kYXJkTGVuZ3RoKTsKKwlyZXR1cm4gYW5ub3RhdGlvbnM7Cit9CitwdWJsaWMgSU1lbWJlclZhbHVlUGFpciBnZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQmluYXJ5TWV0aG9kIGluZm8gPSAoSUJpbmFyeU1ldGhvZCkgZ2V0RWxlbWVudEluZm8oKTsKKwlPYmplY3QgZGVmYXVsdFZhbHVlID0gaW5mby5nZXREZWZhdWx0VmFsdWUoKTsKKwlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCisJCXJldHVybiBudWxsOworCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKGdldEVsZW1lbnROYW1lKCkpOworCW1lbWJlclZhbHVlUGFpci52YWx1ZSA9IFV0aWwuZ2V0QW5ub3RhdGlvbk1lbWJlclZhbHVlKHRoaXMsIG1lbWJlclZhbHVlUGFpciwgZGVmYXVsdFZhbHVlKTsKKwlyZXR1cm4gbWVtYmVyVmFsdWVQYWlyOwogfQogLyoKICAqIEBzZWUgSU1ldGhvZApAQCAtMTM1LDcgKzIwNiw3IEBACiAgKiBMb29rIGZvciBzb3VyY2UgYXR0YWNobWVudCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHBhcmFtZXRlciBuYW1lcyBhcyBzdGF0ZWQgaW4gc291cmNlLgogICovCiBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAodGhpcy5wYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSAKKwlpZiAodGhpcy5wYXJhbWV0ZXJOYW1lcyAhPSBudWxsKQogCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJOYW1lczsKIAogCS8vIGZvcmNlIHNvdXJjZSBtYXBwaW5nIGlmIG5vdCBhbHJlYWR5IGRvbmUKQEAgLTE0Myw3ICsyMTQsNyBAQAogCVNvdXJjZU1hcHBlciBtYXBwZXIgPSBnZXRTb3VyY2VNYXBwZXIoKTsKIAlpZiAobWFwcGVyICE9IG51bGwpIHsKIAkJY2hhcltdW10gcGFyYW1OYW1lcyA9IG1hcHBlci5nZXRNZXRob2RQYXJhbWV0ZXJOYW1lcyh0aGlzKTsKLQkJCisKIAkJLy8gbWFwIHNvdXJjZSBhbmQgdHJ5IHRvIGZpbmQgcGFyYW1ldGVyIG5hbWVzCiAJCWlmKHBhcmFtTmFtZXMgPT0gbnVsbCkgewogCQkJSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgKChCaW5hcnlUeXBlKSBnZXREZWNsYXJpbmdUeXBlKCkpLmdldEVsZW1lbnRJbmZvKCk7CkBAIC0xNTMsMzkgKzIyNCw1MSBAQAogCQkJfQogCQkJcGFyYW1OYW1lcyA9IG1hcHBlci5nZXRNZXRob2RQYXJhbWV0ZXJOYW1lcyh0aGlzKTsKIAkJfQotCQkKKwogCQkvLyBpZiBwYXJhbWV0ZXIgbmFtZXMgZXhpc3QsIGNvbnZlcnQgcGFyYW1ldGVyIG5hbWVzIHRvIFN0cmluZyBhcnJheQogCQlpZihwYXJhbU5hbWVzICE9IG51bGwpIHsKLQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtTmFtZXMubGVuZ3RoXTsKKwkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1twYXJhbU5hbWVzLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzW2ldID0gbmV3IFN0cmluZyhwYXJhbU5hbWVzW2ldKTsKKwkJCQluYW1lc1tpXSA9IG5ldyBTdHJpbmcocGFyYW1OYW1lc1tpXSk7CiAJCQl9Ci0JCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJOYW1lczsKKwkJCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gbmFtZXM7CiAJCX0KIAl9Ci0JCisKIAkvLyB0cnkgdG8gc2VlIGlmIHdlIGNhbiByZXRyaWV2ZSB0aGUgbmFtZXMgZnJvbSB0aGUgYXR0YWNoZWQgamF2YWRvYwogCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRFbGVtZW50SW5mbygpOwotCWZpbmFsIGludCBwYXJhbUNvdW50ID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlckNvdW50KG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2OTM3CisJLy8gVXNlIFNpZ25hdHVyZSNnZXRQYXJhbWV0ZXJDb3VudCgpIG9ubHkgaWYgdGhlIGFyZ3VtZW50IG5hbWVzIGFyZSBub3QgYWxyZWFkeSBhdmFpbGFibGUuCisJaW50IHBhcmFtQ291bnQgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyQ291bnQobmV3IFN0cmluZyhpbmZvLmdldE1ldGhvZERlc2NyaXB0b3IoKSkpOworCWlmICh0aGlzLmlzQ29uc3RydWN0b3IoKSkgeworCQlmaW5hbCBJVHlwZSBkZWNsYXJpbmdUeXBlID0gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCk7CisJCWlmIChkZWNsYXJpbmdUeXBlLmlzTWVtYmVyKCkKKwkJCQkmJiAhRmxhZ3MuaXNTdGF0aWMoZGVjbGFyaW5nVHlwZS5nZXRGbGFncygpKSkgeworCQkJcGFyYW1Db3VudC0tOyAvLyByZW1vdmUgc3ludGhldGljIGFyZ3VtZW50IGZyb20gY29uc3RydWN0b3IgcGFyYW0gY291bnQKKwkJfQorCX0KKwogCWlmIChwYXJhbUNvdW50ICE9IDApIHsKIAkJLy8gZG9uJ3QgdHJ5IHRvIGxvb2sgZm9yIGphdmFkb2MgZm9yIHN5bnRoZXRpYyBtZXRob2RzCi0JCWludCBtb2RpZmllcnMgPSB0aGlzLmdldEZsYWdzKCk7CisJCWludCBtb2RpZmllcnMgPSBnZXRGbGFncygpOwogCQlpZiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICE9IDApIHsKIAkJCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gZ2V0UmF3UGFyYW1ldGVyTmFtZXMocGFyYW1Db3VudCk7CiAJCX0KLQkJU3RyaW5nIGphdmFkb2NDb250ZW50cyA9IG51bGw7Ci0JCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJUGVyUHJvamVjdEluZm8gcHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mb0NoZWNrRXhpc3RlbmNlKHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOworCQlKYXZhZG9jQ29udGVudHMgamF2YWRvY0NvbnRlbnRzID0gbnVsbDsKKwkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGdldERlY2xhcmluZ1R5cGUoKTsKKwkJUGVyUHJvamVjdEluZm8gcHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mb0NoZWNrRXhpc3RlbmNlKGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKIAkJc3luY2hyb25pemVkIChwcm9qZWN0SW5mby5qYXZhZG9jQ2FjaGUpIHsKLQkJCWphdmFkb2NDb250ZW50cyA9IChTdHJpbmcpIHByb2plY3RJbmZvLmphdmFkb2NDYWNoZS5nZXQoZGVjbGFyaW5nVHlwZSk7CisJCQlqYXZhZG9jQ29udGVudHMgPSAoSmF2YWRvY0NvbnRlbnRzKSBwcm9qZWN0SW5mby5qYXZhZG9jQ2FjaGUuZ2V0KGRlY2xhcmluZ1R5cGUpOwogCQkJaWYgKGphdmFkb2NDb250ZW50cyA9PSBudWxsKSB7CiAJCQkJcHJvamVjdEluZm8uamF2YWRvY0NhY2hlLnB1dChkZWNsYXJpbmdUeXBlLCBCaW5hcnlUeXBlLkVNUFRZX0pBVkFET0MpOwogCQkJfQogCQl9CisJCQorCQlTdHJpbmcgbWV0aG9kRG9jID0gbnVsbDsKIAkJaWYgKGphdmFkb2NDb250ZW50cyA9PSBudWxsKSB7CiAJCQlsb25nIHRpbWVPdXQgPSA1MDsgLy8gZGVmYXVsdCB2YWx1ZQogCQkJdHJ5IHsKLQkJCQlTdHJpbmcgb3B0aW9uID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbihKYXZhQ29yZS5USU1FT1VUX0ZPUl9QQVJBTUVURVJfTkFNRV9GUk9NX0FUVEFDSEVEX0pBVkFET0MsIHRydWUpOworCQkJCVN0cmluZyBvcHRpb24gPSBnZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbihKYXZhQ29yZS5USU1FT1VUX0ZPUl9QQVJBTUVURVJfTkFNRV9GUk9NX0FUVEFDSEVEX0pBVkFET0MsIHRydWUpOwogCQkJCWlmIChvcHRpb24gIT0gbnVsbCkgewogCQkJCQl0aW1lT3V0ID0gTG9uZy5wYXJzZUxvbmcob3B0aW9uKTsKIAkJCQl9CkBAIC0xOTMsOCArMjc2LDggQEAKIAkJCQkvLyBpZ25vcmUKIAkJCX0KIAkJCWlmICh0aW1lT3V0ID09IDApIHsKLQkJCQkvLyBkb24ndCB0cnkgdG8gZmV0Y2ggdGhlIHZhbHVlcwotCQkJCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gZ2V0UmF3UGFyYW1ldGVyTmFtZXMocGFyYW1Db3VudCk7CisJCQkJLy8gZG9uJ3QgdHJ5IHRvIGZldGNoIHRoZSB2YWx1ZXMgYW5kIGRvbid0IGNhY2hlIGVpdGhlciAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTY3MSkKKwkJCQlyZXR1cm4gZ2V0UmF3UGFyYW1ldGVyTmFtZXMocGFyYW1Db3VudCk7CiAJCQl9CiAJCQlmaW5hbCBjbGFzcyBQYXJhbWV0ZXJzTmFtZUNvbGxlY3RvciB7CiAJCQkJU3RyaW5nIGphdmFkb2M7CkBAIC0yMzAsNDkgKzMxMywzOCBAQAogCQkJCQkvLyBpZ25vcmUKIAkJCQl9CiAJCQl9Ci0JCQlqYXZhZG9jQ29udGVudHMgPSBuYW1lQ29sbGVjdG9yLmdldEphdmFkb2MoKTsKKwkJCW1ldGhvZERvYyA9IG5hbWVDb2xsZWN0b3IuZ2V0SmF2YWRvYygpOwogCQl9IGVsc2UgaWYgKGphdmFkb2NDb250ZW50cyAhPSBCaW5hcnlUeXBlLkVNUFRZX0pBVkFET0MpewogCQkJLy8gbmVlZCB0byBleHRyYWN0IHRoZSBwYXJ0IHJlbGF0aXZlIHRvIHRoZSBiaW5hcnkgbWV0aG9kIHNpbmNlIGphdmFkb2MgY29udGFpbnMgdGhlIGphdmFkb2MgZm9yIHRoZSBkZWNsYXJpbmcgdHlwZQogCQkJdHJ5IHsKLQkJCQlqYXZhZG9jQ29udGVudHMgPSBleHRyYWN0SmF2YWRvYyhkZWNsYXJpbmdUeXBlLCBqYXZhZG9jQ29udGVudHMpOworCQkJCW1ldGhvZERvYyA9IGphdmFkb2NDb250ZW50cy5nZXRNZXRob2REb2ModGhpcyk7CiAJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCisJCQkJamF2YWRvY0NvbnRlbnRzID0gbnVsbDsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGxldCdzIHNlZSBpZiB3ZSBjYW4gcmV0cmlldmUgdGhlbSBmcm9tIHRoZSBkZWJ1ZyBpbmZvcwotCQkJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IGluZm8uZ2V0QXJndW1lbnROYW1lcygpOwotCQkJaWYgKGFyZ3VtZW50TmFtZXMgIT0gbnVsbCAmJiBhcmd1bWVudE5hbWVzLmxlbmd0aCA9PSBwYXJhbUNvdW50KSB7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtQ291bnRdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7Ci0JCQkJCW5hbWVzW2ldID0gbmV3IFN0cmluZyhhcmd1bWVudE5hbWVzW2ldKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyTmFtZXMgPSBuYW1lczsKLQkJCX0KLQkJCXJldHVybiBnZXRSYXdQYXJhbWV0ZXJOYW1lcyhwYXJhbUNvdW50KTsKIAkJfQotCQlpZiAoamF2YWRvY0NvbnRlbnRzICE9IG51bGwgJiYgamF2YWRvY0NvbnRlbnRzICE9IEJpbmFyeVR5cGUuRU1QVFlfSkFWQURPQykgewotCQkJZmluYWwgaW50IGluZGV4T2ZPcGVuUGFyZW4gPSBqYXZhZG9jQ29udGVudHMuaW5kZXhPZignKCcpOworCQlpZiAobWV0aG9kRG9jICE9IG51bGwpIHsKKwkJCWZpbmFsIGludCBpbmRleE9mT3BlblBhcmVuID0gbWV0aG9kRG9jLmluZGV4T2YoJygnKTsKIAkJCWlmIChpbmRleE9mT3BlblBhcmVuICE9IC0xKSB7Ci0JCQkJZmluYWwgaW50IGluZGV4T2ZDbG9zaW5nUGFyZW4gPSBqYXZhZG9jQ29udGVudHMuaW5kZXhPZignKScsIGluZGV4T2ZPcGVuUGFyZW4pOworCQkJCWZpbmFsIGludCBpbmRleE9mQ2xvc2luZ1BhcmVuID0gbWV0aG9kRG9jLmluZGV4T2YoJyknLCBpbmRleE9mT3BlblBhcmVuKTsKIAkJCQlpZiAoaW5kZXhPZkNsb3NpbmdQYXJlbiAhPSAtMSkgewogCQkJCQlmaW5hbCBjaGFyW10gcGFyYW1zU291cmNlID0KIAkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZSgKLQkJCQkJCQlqYXZhZG9jQ29udGVudHMuc3Vic3RyaW5nKGluZGV4T2ZPcGVuUGFyZW4gKyAxLCBpbmRleE9mQ2xvc2luZ1BhcmVuKS50b0NoYXJBcnJheSgpLAorCQkJCQkJCW1ldGhvZERvYy5zdWJzdHJpbmcoaW5kZXhPZk9wZW5QYXJlbiArIDEsIGluZGV4T2ZDbG9zaW5nUGFyZW4pLnRvQ2hhckFycmF5KCksCiAJCQkJCQkJIiZuYnNwOyIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAogCQkJCQkJCW5ldyBjaGFyW10geycgJ30pOwogCQkJCQlmaW5hbCBjaGFyW11bXSBwYXJhbXMgPSBzcGxpdFBhcmFtZXRlcnMocGFyYW1zU291cmNlLCBwYXJhbUNvdW50KTsKIAkJCQkJZmluYWwgaW50IHBhcmFtc0xlbmd0aCA9IHBhcmFtcy5sZW5ndGg7Ci0JCQkJCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtc0xlbmd0aF07CisJCQkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1twYXJhbXNMZW5ndGhdOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0xlbmd0aDsgaSsrKSB7CiAJCQkJCQlmaW5hbCBjaGFyW10gcGFyYW0gPSBwYXJhbXNbaV07CiAJCQkJCQlpbnQgaW5kZXhPZlNwYWNlID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignICcsIHBhcmFtKTsKIAkJCQkJCWlmIChpbmRleE9mU3BhY2UgIT0gLTEpIHsKLQkJCQkJCQl0aGlzLnBhcmFtZXRlck5hbWVzW2ldID0gU3RyaW5nLnZhbHVlT2YocGFyYW0sIGluZGV4T2ZTcGFjZSArIDEsIHBhcmFtLmxlbmd0aCAtIGluZGV4T2ZTcGFjZSAtMSk7CisJCQkJCQkJbmFtZXNbaV0gPSBTdHJpbmcudmFsdWVPZihwYXJhbSwgaW5kZXhPZlNwYWNlICsgMSwgcGFyYW0ubGVuZ3RoIC0gaW5kZXhPZlNwYWNlIC0xKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGhpcy5wYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW5hbWVzW2ldID0gImFyZyIgKyBpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyTmFtZXM7CisJCQkJCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gbmFtZXM7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yODYsOCArMzU4LDggQEAKIAkJCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gbmFtZXM7CiAJCX0KIAl9Ci0JLy8gaWYgc3RpbGwgbm8gcGFyYW1ldGVyIG5hbWVzLCBwcm9kdWNlIGZha2Ugb25lcwotCXJldHVybiB0aGlzLnBhcmFtZXRlck5hbWVzID0gZ2V0UmF3UGFyYW1ldGVyTmFtZXMocGFyYW1Db3VudCk7CisJLy8gSWYgc3RpbGwgbm8gcGFyYW1ldGVyIG5hbWVzLCBwcm9kdWNlIGZha2Ugb25lcywgYnV0IGRvbid0IGNhY2hlIHRoZW0gKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk2NzEpCisJcmV0dXJuIGdldFJhd1BhcmFtZXRlck5hbWVzKHBhcmFtQ291bnQpOwogfQogcHJpdmF0ZSBjaGFyW11bXSBzcGxpdFBhcmFtZXRlcnMoY2hhcltdIHBhcmFtZXRlcnNTb3VyY2UsIGludCBwYXJhbUNvdW50KSB7CiAJLy8gd2UgaGF2ZSBnZW5lcmljIHR5cGVzIGFzIG9uZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGVzCkBAIC0zNTYsNiArNDI4LDI1IEBACiAJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7CiB9CiAKKy8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTkzODQKK3ByaXZhdGUgU3RyaW5nIFtdIGdldEVyYXNlZFBhcmFtZXRlclR5cGVzKCkgeworCWlmICh0aGlzLmVyYXNlZFBhcmFtYXRlclR5cGVzID09IG51bGwpIHsKKwkJaW50IHBhcmFtQ291bnQgPSB0aGlzLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJU3RyaW5nIFtdIGVyYXNlZFR5cGVzID0gbmV3IFN0cmluZyBbcGFyYW1Db3VudF07CisJCWJvb2xlYW4gZXJhc3VyZU5lZWRlZCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgeworCQkJU3RyaW5nIHBhcmFtZXRlclR5cGUgPSB0aGlzLnBhcmFtZXRlclR5cGVzW2ldOworCQkJaWYgKChlcmFzZWRUeXBlc1tpXSA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZShwYXJhbWV0ZXJUeXBlKSkgIT0gcGFyYW1ldGVyVHlwZSkKKwkJCQllcmFzdXJlTmVlZGVkID0gdHJ1ZTsKKwkJfQorCQl0aGlzLmVyYXNlZFBhcmFtYXRlclR5cGVzID0gZXJhc3VyZU5lZWRlZCA/IGVyYXNlZFR5cGVzIDogdGhpcy5wYXJhbWV0ZXJUeXBlczsKKwl9CisJcmV0dXJuIHRoaXMuZXJhc2VkUGFyYW1hdGVyVHlwZXM7Cit9Citwcml2YXRlIFN0cmluZyBnZXRFcmFzZWRQYXJhbWV0ZXJUeXBlKGludCBpbmRleCkgeworCXJldHVybiBnZXRFcmFzZWRQYXJhbWV0ZXJUeXBlcygpW2luZGV4XTsKK30KKwogcHVibGljIElUeXBlUGFyYW1ldGVyIGdldFR5cGVQYXJhbWV0ZXIoU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lKSB7CiAJcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJOYW1lKTsKIH0KQEAgLTM4MCw3ICs0NzEsNyBAQAogcHVibGljIFN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSBpbmZvLmdldEdlbmVyaWNTaWduYXR1cmUoKTsKLQlpZiAoZ2VuZXJpY1NpZ25hdHVyZSA9PSBudWxsKSAKKwlpZiAoZ2VuZXJpY1NpZ25hdHVyZSA9PSBudWxsKQogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwogCWNoYXJbXSBkb3RCYXNlZFNpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShnZW5lcmljU2lnbmF0dXJlLCAnLycsICcuJyk7CiAJY2hhcltdW10gdHlwZVBhcmFtcyA9IFNpZ25hdHVyZS5nZXRUeXBlUGFyYW1ldGVycyhkb3RCYXNlZFNpZ25hdHVyZSk7CkBAIC00MjksOCArNTIwLDggQEAKICAqLwogcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgIGludCBoYXNoID0gc3VwZXIuaGFzaENvZGUoKTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkgICAgaGFzaCA9IFV0aWwuY29tYmluZUhhc2hDb2RlcyhoYXNoLCBwYXJhbWV0ZXJUeXBlc1tpXS5oYXNoQ29kZSgpKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCSAgICBoYXNoID0gVXRpbC5jb21iaW5lSGFzaENvZGVzKGhhc2gsIGdldEVyYXNlZFBhcmFtZXRlclR5cGUoaSkuaGFzaENvZGUoKSk7CiAJfQogCXJldHVybiBoYXNoOwogfQpAQCAtNDM4LDEwICs1MjksMTAgQEAKICAqIEBzZWUgSU1ldGhvZAogICovCiBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JaWYgKCF0aGlzLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRoaXMucGFyZW50LmdldEVsZW1lbnROYW1lKCkpKSB7CisJaWYgKCFnZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0aGlzLnBhcmVudC5nZXRFbGVtZW50TmFtZSgpKSkgewogCQkvLyBmYXN0ZXIgdGhhbiByZWFjaGluZyB0aGUgaW5mbwogCQlyZXR1cm4gZmFsc2U7Ci0JfQkKKwl9CiAJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uaXNDb25zdHJ1Y3RvcigpOwogfQpAQCAtNDYxLDkgKzU1Miw5IEBACiAgKiBAc2VlIElNZXRob2QjaXNTaW1pbGFyKElNZXRob2QpCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzU2ltaWxhcihJTWV0aG9kIG1ldGhvZCkgewotCXJldHVybiAKKwlyZXR1cm4KIAkJYXJlU2ltaWxhck1ldGhvZHMoCi0JCQl0aGlzLmdldEVsZW1lbnROYW1lKCksIHRoaXMuZ2V0UGFyYW1ldGVyVHlwZXMoKSwKKwkJCWdldEVsZW1lbnROYW1lKCksIGdldFBhcmFtZXRlclR5cGVzKCksCiAJCQltZXRob2QuZ2V0RWxlbWVudE5hbWUoKSwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCksCiAJCQludWxsKTsKIH0KQEAgLTU0OSw5NSArNjQwLDggQEAKIAl9CiB9CiBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmdldERlY2xhcmluZ1R5cGUoKTsKLQotCVN0cmluZyBjb250ZW50cyA9ICgoQmluYXJ5VHlwZSkgZGVjbGFyaW5nVHlwZSkuZ2V0SmF2YWRvY0NvbnRlbnRzKG1vbml0b3IpOwotCXJldHVybiBleHRyYWN0SmF2YWRvYyhkZWNsYXJpbmdUeXBlLCBjb250ZW50cyk7Ci19Ci1wcml2YXRlIFN0cmluZyBleHRyYWN0SmF2YWRvYyhJVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmIChjb250ZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotCVN0cmluZyB0eXBlUXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0JZmluYWwgYm9vbGVhbiBkZWNsYXJpbmdUeXBlSXNNZW1iZXIgPSBkZWNsYXJpbmdUeXBlLmlzTWVtYmVyKCk7Ci0JaWYgKGRlY2xhcmluZ1R5cGVJc01lbWJlcikgewotCQlJVHlwZSBjdXJyZW50VHlwZSA9IGRlY2xhcmluZ1R5cGU7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuaW5zZXJ0KDAsIGN1cnJlbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQlpZiAoY3VycmVudFR5cGUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5pbnNlcnQoMCwgJy4nKTsKLQkJCX0KLQkJfQotCQl0eXBlUXVhbGlmaWVkTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCXR5cGVRdWFsaWZpZWROYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQlTdHJpbmcgbWV0aG9kTmFtZSA9IHRoaXMuZ2V0RWxlbWVudE5hbWUoKTsKLQlpZiAodGhpcy5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJbWV0aG9kTmFtZSA9IHR5cGVRdWFsaWZpZWROYW1lOwotCX0KLQlJQmluYXJ5TWV0aG9kIGluZm8gPSAoSUJpbmFyeU1ldGhvZCkgZ2V0RWxlbWVudEluZm8oKTsKLQljaGFyW10gZ2VuZXJpY1NpZ25hdHVyZSA9IGluZm8uZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOwotCVN0cmluZyBhbmNob3IgPSBudWxsOwotCWlmIChnZW5lcmljU2lnbmF0dXJlICE9IG51bGwpIHsKLQkJZ2VuZXJpY1NpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShnZW5lcmljU2lnbmF0dXJlLCAnLycsICcuJyk7Ci0JCWFuY2hvciA9IFV0aWwudG9BbmNob3IoZ2VuZXJpY1NpZ25hdHVyZSwgbWV0aG9kTmFtZSwgRmxhZ3MuaXNWYXJhcmdzKHRoaXMuZ2V0RmxhZ3MoKSkpOwotCQlpZiAoYW5jaG9yID09IG51bGwpIHRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVOS05PV05fSkFWQURPQ19GT1JNQVQsIHRoaXMpKTsKLQl9IGVsc2UgewotCQlhbmNob3IgPSBTaWduYXR1cmUudG9TdHJpbmcodGhpcy5nZXRTaWduYXR1cmUoKS5yZXBsYWNlKCcvJywgJy4nKSwgbWV0aG9kTmFtZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIEZsYWdzLmlzVmFyYXJncyh0aGlzLmdldEZsYWdzKCkpKTsKLQl9Ci0JaWYgKGRlY2xhcmluZ1R5cGVJc01lbWJlcikgewotCQlpbnQgZGVwdGggPSAwOwotCQlmaW5hbCBTdHJpbmcgcGFja2FnZUZyYWdtZW50TmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJLy8gbWlnaHQgbmVlZCB0byByZW1vdmUgYSBwYXJ0IG9mIHRoZSBzaWduYXR1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgc3ludGhldGljIGFyZ3VtZW50Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGRlY2xhcmluZ1R5cGUuZ2V0SmF2YVByb2plY3QoKTsKLQkJY2hhcltdW10gdHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZVF1YWxpZmllZE5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCWlmICghRmxhZ3MuaXNTdGF0aWMoZGVjbGFyaW5nVHlwZS5nZXRGbGFncygpKSkgZGVwdGgrKzsKLQkJU3RyaW5nQnVmZmVyIHR5cGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZU5hbWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlpZiAodHlwZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXR5cGVOYW1lLmFwcGVuZCh0eXBlTmFtZXNbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQl0eXBlTmFtZS5hcHBlbmQoJy4nKS5hcHBlbmQodHlwZU5hbWVzW2ldKTsKLQkJCX0KLQkJCUlUeXBlIHJlc29sdmVkVHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHBhY2thZ2VGcmFnbWVudE5hbWUsIFN0cmluZy52YWx1ZU9mKHR5cGVOYW1lKSk7Ci0JCQlpZiAocmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgcmVzb2x2ZWRUeXBlLmlzTWVtYmVyKCkgJiYgIUZsYWdzLmlzU3RhdGljKHJlc29sdmVkVHlwZS5nZXRGbGFncygpKSkgZGVwdGgrKzsKLQkJfQotCQlpZiAoZGVwdGggIT0gMCkgewotCQkJaW50IGluZGV4T2ZPcGVuaW5nUGFyZW4gPSBhbmNob3IuaW5kZXhPZignKCcpOwotCQkJaWYgKGluZGV4T2ZPcGVuaW5nUGFyZW4gPT0gLTEpIHJldHVybiBudWxsOwotCQkJaW50IGluZGV4ID0gaW5kZXhPZk9wZW5pbmdQYXJlbjsKLQkJCWluZGV4T2ZPcGVuaW5nUGFyZW4rKzsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJCWludCBpbmRleE9mQ29tbWEgPSBhbmNob3IuaW5kZXhPZignLCcsIGluZGV4KTsKLQkJCQlpZiAoaW5kZXhPZkNvbW1hICE9IC0xKSB7Ci0JCQkJCWluZGV4ID0gaW5kZXhPZkNvbW1hICsgMjsKLQkJCQl9Ci0JCQl9Ci0JCQlhbmNob3IgPSBhbmNob3Iuc3Vic3RyaW5nKDAsIGluZGV4T2ZPcGVuaW5nUGFyZW4pICsgYW5jaG9yLnN1YnN0cmluZyhpbmRleCk7Ci0JCX0KLQl9Ci0JaW50IGluZGV4QW5jaG9yID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9QUkVGSVhfU1RBUlQgKyBhbmNob3IgKyBKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9QUkVGSVhfRU5EKTsKLQlpZiAoaW5kZXhBbmNob3IgPT0gLTEpIHsKLQkJcmV0dXJuIG51bGw7IC8vIG1ldGhvZCB3aXRob3V0IGphdmFkb2MKLQl9Ci0JaW50IGluZGV4T2ZFbmRMaW5rID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9TVUZGSVgsIGluZGV4QW5jaG9yKTsKLQlpZiAoaW5kZXhPZkVuZExpbmsgPT0gLTEpIHRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVOS05PV05fSkFWQURPQ19GT1JNQVQsIHRoaXMpKTsKLQlpbnQgaW5kZXhPZk5leHRNZXRob2QgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1BSRUZJWF9TVEFSVCwgaW5kZXhPZkVuZExpbmspOwotCS8vIGZpbmQgYm90dG9tCi0JaW50IGluZGV4T2ZCb3R0b20gPSAtMTsKLQlpZiAodGhpcy5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJaW5kZXhPZkJvdHRvbSA9IGNvbnRlbnRzLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5NRVRIT0RfREVUQUlMLCBpbmRleE9mRW5kTGluayk7Ci0JCWlmIChpbmRleE9mQm90dG9tID09IC0xKSB7Ci0JCQlpbmRleE9mQm90dG9tID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkVORF9PRl9DTEFTU19EQVRBLCBpbmRleE9mRW5kTGluayk7Ci0JCX0KLQl9IGVsc2UgewotCQlpbmRleE9mQm90dG9tID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkVORF9PRl9DTEFTU19EQVRBLCBpbmRleE9mRW5kTGluayk7Ci0JfQotCWlmIChpbmRleE9mQm90dG9tID09IC0xKSB0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JaW5kZXhPZk5leHRNZXRob2QgPSBNYXRoLm1pbihpbmRleE9mTmV4dE1ldGhvZCwgaW5kZXhPZkJvdHRvbSk7Ci0JaWYgKGluZGV4T2ZOZXh0TWV0aG9kID09IC0xKSB0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JcmV0dXJuIGNvbnRlbnRzLnN1YnN0cmluZyhpbmRleE9mRW5kTGluayArIEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1NVRkZJWF9MRU5HVEgsIGluZGV4T2ZOZXh0TWV0aG9kKTsKKwlKYXZhZG9jQ29udGVudHMgamF2YWRvY0NvbnRlbnRzID0gKChCaW5hcnlUeXBlKSB0aGlzLmdldERlY2xhcmluZ1R5cGUoKSkuZ2V0SmF2YWRvY0NvbnRlbnRzKG1vbml0b3IpOworCWlmIChqYXZhZG9jQ29udGVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJcmV0dXJuIGphdmFkb2NDb250ZW50cy5nZXRNZXRob2REb2ModGhpcyk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEKaW5kZXggMzI4N2NmYy4uNTIxOTc1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5Db21wbGV0aW9uRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CkBAIC0zOSwxMyArNDEsMTMgQEAKICAqLwogCiBwdWJsaWMgY2xhc3MgQmluYXJ5VHlwZSBleHRlbmRzIEJpbmFyeU1lbWJlciBpbXBsZW1lbnRzIElUeXBlLCBTdWZmaXhDb25zdGFudHMgewotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpZWxkW10gTk9fRklFTERTID0gbmV3IElGaWVsZFswXTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWV0aG9kW10gTk9fTUVUSE9EUyA9IG5ldyBJTWV0aG9kWzBdOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIElUeXBlW10gTk9fVFlQRVMgPSBuZXcgSVR5cGVbMF07CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUluaXRpYWxpemVyW10gTk9fSU5JVElBTElaRVJTID0gbmV3IElJbml0aWFsaXplclswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9KQVZBRE9DID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5FTVBUWV9TVFJJTkc7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhZG9jQ29udGVudHMgRU1QVFlfSkFWQURPQyA9IG5ldyBKYXZhZG9jQ29udGVudHMobnVsbCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5FTVBUWV9TVFJJTkcpOworCiBwcm90ZWN0ZWQgQmluYXJ5VHlwZShKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CiAJc3VwZXIocGFyZW50LCBuYW1lKTsKIH0KQEAgLTgxLDM0ICs4Myw1NSBAQAogcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGNoYXJbXSBzbmlwcGV0LGludCBpbnNlcnRpb24saW50IHBvc2l0aW9uLGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsYm9vbGVhbiBpc1N0YXRpYyxDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJY29kZUNvbXBsZXRlKHNuaXBwZXQsIGluc2VydGlvbiwgcG9zaXRpb24sIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIGxvY2FsVmFyaWFibGVOYW1lcywgbG9jYWxWYXJpYWJsZU1vZGlmaWVycywgaXNTdGF0aWMsIHJlcXVlc3RvciwgRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSk7CiB9Ci0KKy8qCisgKiBAc2VlIElUeXBlI2NvZGVDb21wbGV0ZShjaGFyW10sIGludCwgaW50LCBjaGFyW11bXSwgY2hhcltdW10sIGludFtdLCBib29sZWFuLCBJQ29tcGxldGlvblJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGNoYXJbXSBzbmlwcGV0LGludCBpbnNlcnRpb24saW50IHBvc2l0aW9uLGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsYm9vbGVhbiBpc1N0YXRpYyxDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUoc25pcHBldCwgaW5zZXJ0aW9uLCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYywgcmVxdWVzdG9yLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZLCBtb25pdG9yKTsKK30KIC8qCiAgKiBAc2VlIElUeXBlI2NvZGVDb21wbGV0ZShjaGFyW10sIGludCwgaW50LCBjaGFyW11bXSwgY2hhcltdW10sIGludFtdLCBib29sZWFuLCBJQ29tcGxldGlvblJlcXVlc3RvciwgV29ya2luZ0NvcHlPd25lcikKICAqLwogcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGNoYXJbXSBzbmlwcGV0LGludCBpbnNlcnRpb24saW50IHBvc2l0aW9uLGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsYm9vbGVhbiBpc1N0YXRpYyxDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJY29kZUNvbXBsZXRlKHNuaXBwZXQsIGluc2VydGlvbiwgcG9zaXRpb24sIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIGxvY2FsVmFyaWFibGVOYW1lcywgbG9jYWxWYXJpYWJsZU1vZGlmaWVycywgaXNTdGF0aWMsIHJlcXVlc3Rvciwgb3duZXIsIG51bGwpOworfQorLyoKKyAqIEBzZWUgSVR5cGUjY29kZUNvbXBsZXRlKGNoYXJbXSwgaW50LCBpbnQsIGNoYXJbXVtdLCBjaGFyW11bXSwgaW50W10sIGJvb2xlYW4sIElDb21wbGV0aW9uUmVxdWVzdG9yLCBXb3JraW5nQ29weU93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoCisJCWNoYXJbXSBzbmlwcGV0LAorCQlpbnQgaW5zZXJ0aW9uLAorCQlpbnQgcG9zaXRpb24sCisJCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsCisJCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lcywKKwkJaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycywKKwkJYm9vbGVhbiBpc1N0YXRpYywKKwkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCisJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7CiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbXBsZXRpb24gcmVxdWVzdG9yIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKIAlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBwcm9qZWN0Lm5ld1NlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQob3duZXIpOwotCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgcHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCBwcm9qZWN0KTsKKwlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgcHJvamVjdCwgb3duZXIsIG1vbml0b3IpOwogCiAJU3RyaW5nIHNvdXJjZSA9IGdldENsYXNzRmlsZSgpLmdldFNvdXJjZSgpOwogCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBpbnNlcnRpb24gPiAtMSAmJiBpbnNlcnRpb24gPCBzb3VyY2UubGVuZ3RoKCkpIHsKIAkJLy8gY29kZSBjb21wbGV0ZQotCQkKKwogCQljaGFyW10gcHJlZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc291cmNlLnN1YnN0cmluZygwLCBpbnNlcnRpb24pLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW117J3snfSk7CiAJCWNoYXJbXSBzdWZmaXggPSAgQ2hhck9wZXJhdGlvbi5jb25jYXQobmV3IGNoYXJbXXsnfSd9LCBzb3VyY2Uuc3Vic3RyaW5nKGluc2VydGlvbikudG9DaGFyQXJyYXkoKSk7CiAJCWNoYXJbXSBmYWtlU291cmNlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4LCBzbmlwcGV0LCBzdWZmaXgpOwotCQkKLQkJQmFzaWNDb21waWxhdGlvblVuaXQgY3UgPSAKKworCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9CiAJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCi0JCQkJZmFrZVNvdXJjZSwgCisJCQkJZmFrZVNvdXJjZSwKIAkJCQludWxsLAogCQkJCWdldEVsZW1lbnROYW1lKCksCiAJCQkJcHJvamVjdCk7IC8vIHVzZSBwcm9qZWN0IHRvIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgLmphdmEgSUZpbGUKIAotCQllbmdpbmUuY29tcGxldGUoY3UsIHByZWZpeC5sZW5ndGggKyBwb3NpdGlvbiwgcHJlZml4Lmxlbmd0aCk7CisJCWVuZ2luZS5jb21wbGV0ZShjdSwgcHJlZml4Lmxlbmd0aCArIHBvc2l0aW9uLCBwcmVmaXgubGVuZ3RoLCBudWxsLypleHRlbmRlZCBjb250ZXh0IGlzbid0IGNvbXB1dGVkKi8pOwogCX0gZWxzZSB7CiAJCWVuZ2luZS5jb21wbGV0ZSh0aGlzLCBzbmlwcGV0LCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYyk7CiAJfQpAQCAtMTU3LDYgKzE4MCwxMSBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiB9CitwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCk7CisJSUJpbmFyeUFubm90YXRpb25bXSBiaW5hcnlBbm5vdGF0aW9ucyA9IGluZm8uZ2V0QW5ub3RhdGlvbnMoKTsKKwlyZXR1cm4gZ2V0QW5ub3RhdGlvbnMoYmluYXJ5QW5ub3RhdGlvbnMsIGluZm8uZ2V0VGFnQml0cygpKTsKK30KIC8qCiAgKiBAc2VlIElQYXJlbnQjZ2V0Q2hpbGRyZW4oKQogICovCkBAIC0xNzIsNyArMjAwLDcgQEAKIAlpZiAobWFwcGVyICE9IG51bGwpIHsKIAkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBjYXRlZ29yaWVzIGFyZSBjb21wdXRlZAogCQkoKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKSkuZ2V0QnVmZmVyKCk7Ci0JCQorCiAJCUhhc2hNYXAgY2F0ZWdvcmllcyA9IG1hcHBlci5jYXRlZ29yaWVzOwogCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSBuZXcgSUphdmFFbGVtZW50W2xlbmd0aF07CiAJCWludCBpbmRleCA9IDA7CkBAIC0xOTQsNyArMjIyLDcgQEAKIAkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByZXN1bHQgPSBuZXcgSUphdmFFbGVtZW50W2luZGV4XSwgMCwgaW5kZXgpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQlyZXR1cm4gTk9fRUxFTUVOVFM7CQorCXJldHVybiBOT19FTEVNRU5UUzsKIH0KIHByb3RlY3RlZCBDbGFzc0ZpbGVJbmZvIGdldENsYXNzRmlsZUluZm8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlDbGFzc0ZpbGUgY2YgPSAoQ2xhc3NGaWxlKXRoaXMucGFyZW50OwpAQCAtMjA0LDcgKzIzMiw3IEBACiAgKiBAc2VlIElNZW1iZXIjZ2V0RGVjbGFyaW5nVHlwZSgpCiAgKi8KIHB1YmxpYyBJVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgewotCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdGhpcy5nZXRDbGFzc0ZpbGUoKTsKKwlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGdldENsYXNzRmlsZSgpOwogCWlmIChjbGFzc0ZpbGUuaXNPcGVuKCkpIHsKIAkJdHJ5IHsKIAkJCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9ICgoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCkpLmdldEVuY2xvc2luZ1R5cGVOYW1lKCk7CkBAIC0yMTIsMjAgKzI0MCwyMCBAQAogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQkgCWVuY2xvc2luZ1R5cGVOYW1lID0gQ2xhc3NGaWxlLnVucXVhbGlmaWVkTmFtZShlbmNsb3NpbmdUeXBlTmFtZSk7Ci0JCSAJCi0JCQkvLyB3b3JrYXJvdW5kIHByb2JsZW0gd2l0aCBjbGFzcyBmaWxlcyBjb21waWxlZCB3aXRoIGphdmFjIDEuMS4qIAorCisJCQkvLyB3b3JrYXJvdW5kIHByb2JsZW0gd2l0aCBjbGFzcyBmaWxlcyBjb21waWxlZCB3aXRoIGphdmFjIDEuMS4qCiAJCQkvLyB0aGF0IHJldHVybiBhIG5vbi1udWxsIGVuY2xvc2luZyB0eXBlIG5hbWUgZm9yIGxvY2FsIHR5cGVzIGRlZmluZWQgaW4gYW5vbnltb3VzIChlLmcuIEEkMSRCKQotCQkJaWYgKGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID4gZW5jbG9zaW5nVHlwZU5hbWUubGVuZ3RoKzEgCisJCQlpZiAoY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPiBlbmNsb3NpbmdUeXBlTmFtZS5sZW5ndGgrMQogCQkJCQkmJiBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKS5jaGFyQXQoZW5jbG9zaW5nVHlwZU5hbWUubGVuZ3RoKzEpKSkgewogCQkJCXJldHVybiBudWxsOwotCQkJfSAKLQkJCQorCQkJfQorCiAJCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0Q2xhc3NGaWxlKG5ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZU5hbWUpICsgU1VGRklYX1NUUklOR19jbGFzcykuZ2V0VHlwZSgpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0gZWxzZSB7Ci0JCS8vIGNhbm5vdCBhY2Nlc3MgLmNsYXNzIGZpbGUgd2l0aG91dCBvcGVuaW5nIGl0IAorCQkvLyBjYW5ub3QgYWNjZXNzIC5jbGFzcyBmaWxlIHdpdGhvdXQgb3BlbmluZyBpdAogCQkvLyBhbmQgZ2V0RGVjbGFyaW5nVHlwZSgpIGlzIHN1cHBvc2VkIHRvIGJlIGEgaGFuZGxlLW9ubHkgbWV0aG9kLAogCQkvLyBzbyBkZWZhdWx0IHRvIGFzc3VtaW5nICQgaXMgYW4gZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCiAJCVN0cmluZyBjbGFzc0ZpbGVOYW1lID0gY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCk7CkBAIC0yNDQsOSArMjcyLDkgQEAKIAkJfSBlbHNlIHsKIAkJCVN0cmluZyBlbmNsb3NpbmdOYW1lID0gY2xhc3NGaWxlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvbGxhcik7CiAJCQlTdHJpbmcgZW5jbG9zaW5nQ2xhc3NGaWxlTmFtZSA9IGVuY2xvc2luZ05hbWUgKyBTVUZGSVhfU1RSSU5HX2NsYXNzOwotCQkJcmV0dXJuIAorCQkJcmV0dXJuCiAJCQkJbmV3IEJpbmFyeVR5cGUoCi0JCQkJCShKYXZhRWxlbWVudCl0aGlzLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldENsYXNzRmlsZShlbmNsb3NpbmdDbGFzc0ZpbGVOYW1lKSwKKwkJCQkJKEphdmFFbGVtZW50KWdldFBhY2thZ2VGcmFnbWVudCgpLmdldENsYXNzRmlsZShlbmNsb3NpbmdDbGFzc0ZpbGVOYW1lKSwKIAkJCQkJVXRpbC5sb2NhbFR5cGVOYW1lKGVuY2xvc2luZ05hbWUsIGVuY2xvc2luZ05hbWUubGFzdEluZGV4T2YoJyQnKSwgZW5jbG9zaW5nTmFtZS5sZW5ndGgoKSkpOwogCQl9CiAJfQpAQCAtMjg4LDcgKzMxNiw3IEBACiAgKi8KIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRFbGVtZW50SW5mbygpOwotCXJldHVybiBpbmZvLmdldE1vZGlmaWVycygpOworCXJldHVybiBpbmZvLmdldE1vZGlmaWVycygpICYgfkNsYXNzRmlsZUNvbnN0YW50cy5BY2NTdXBlcjsKIH0KIC8qCiAgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZSgpCkBAIC0zNDEsNiArMzY5LDcgQEAKIAkJCQlzd2l0Y2ggKHRva2VuLmNoYXJBdCgwKSkgewogCQkJCQljYXNlIEpFTV9UWVBFOgogCQkJCQljYXNlIEpFTV9UWVBFX1BBUkFNRVRFUjoKKwkJCQkJY2FzZSBKRU1fQU5OT1RBVElPTjoKIAkJCQkJCWJyZWFrIG5leHRQYXJhbTsKIAkJCQkJY2FzZSBKRU1fTUVUSE9EOgogCQkJCQkJaWYgKCFtZW1lbnRvLmhhc01vcmVUb2tlbnMoKSkgcmV0dXJuIHRoaXM7CkBAIC0zNjQsNiArMzkzLDcgQEAKIAkJCQljYXNlIEpFTV9UWVBFOgogCQkJCWNhc2UgSkVNX1RZUEVfUEFSQU1FVEVSOgogCQkJCWNhc2UgSkVNX0xPQ0FMVkFSSUFCTEU6CisJCQkJY2FzZSBKRU1fQU5OT1RBVElPTjoKIAkJCQkJcmV0dXJuIG1ldGhvZC5nZXRIYW5kbGVGcm9tTWVtZW50byh0b2tlbiwgbWVtZW50bywgd29ya2luZ0NvcHlPd25lcik7CiAJCQkJZGVmYXVsdDoKIAkJCQkJcmV0dXJuIG1ldGhvZDsKQEAgLTM5NCw2ICs0MjQsMTEgQEAKIAkJCVN0cmluZyB0eXBlUGFyYW1ldGVyTmFtZSA9IG1lbWVudG8ubmV4dFRva2VuKCk7CiAJCQlKYXZhRWxlbWVudCB0eXBlUGFyYW1ldGVyID0gbmV3IFR5cGVQYXJhbWV0ZXIodGhpcywgdHlwZVBhcmFtZXRlck5hbWUpOwogCQkJcmV0dXJuIHR5cGVQYXJhbWV0ZXIuZ2V0SGFuZGxlRnJvbU1lbWVudG8obWVtZW50bywgd29ya2luZ0NvcHlPd25lcik7CisJCWNhc2UgSkVNX0FOTk9UQVRJT046CisJCQlpZiAoIW1lbWVudG8uaGFzTW9yZVRva2VucygpKSByZXR1cm4gdGhpczsKKwkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG1lbWVudG8ubmV4dFRva2VuKCk7CisJCQlKYXZhRWxlbWVudCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbk5hbWUpOworCQkJcmV0dXJuIGFubm90YXRpb24uZ2V0SGFuZGxlRnJvbU1lbWVudG8obWVtZW50bywgd29ya2luZ0NvcHlPd25lcik7CiAJfQogCXJldHVybiBudWxsOwogfQpAQCAtNDY0LDcgKzQ5OSw3IEBACiAJCQlpbnQgY291bnQgPSAxOwogCQkJd2hpbGUgKGNvdW50ID4gMCAmJiArK2luZGV4IDwgc2lnbmF0dXJlTGVuZ3RoKSB7CiAJCQkJc3dpdGNoIChnZW5lcmljU2lnbmF0dXJlW2luZGV4XSkgewotCQkJCQljYXNlICc8JzogCisJCQkJCWNhc2UgJzwnOgogCQkJCQkJY291bnQrKzsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlICc+JzoKQEAgLTQ3NSw3ICs1MTAsNyBAQAogCQkJaW5kZXgrKzsKIAkJfQogCQlpbnQgc3RhcnQgPSBpbmRleDsKLQkJaW5kZXggPSBVdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoZ2VuZXJpY1NpZ25hdHVyZSwgc3RhcnQpICsgMTsKKwkJaW5kZXggPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoZ2VuZXJpY1NpZ25hdHVyZSwgc3RhcnQpICsgMTsKIAkJY2hhcltdIHN1cGVyY2xhc3NTaWcgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGdlbmVyaWNTaWduYXR1cmUsIHN0YXJ0LCBpbmRleCk7CiAJCXJldHVybiBuZXcgU3RyaW5nKENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZShzdXBlcmNsYXNzU2lnKSk7CiAJfSBlbHNlIHsKQEAgLTU1MCw3ICs1ODUsNyBAQAogCQkJaW50IGNvdW50ID0gMTsKIAkJCXdoaWxlIChjb3VudCA+IDAgJiYgKytpbmRleCA8IHNpZ25hdHVyZUxlbmd0aCkgewogCQkJCXN3aXRjaCAoZ2VuZXJpY1NpZ25hdHVyZVtpbmRleF0pIHsKLQkJCQkJY2FzZSAnPCc6IAorCQkJCQljYXNlICc8JzoKIAkJCQkJCWNvdW50Kys7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSAnPic6CkBAIC01NjEsMTAgKzU5NiwxMCBAQAogCQkJaW5kZXgrKzsKIAkJfQogCQkvLyBza2lwIHN1cGVyY2xhc3MKLQkJaW5kZXggPSBVdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoZ2VuZXJpY1NpZ25hdHVyZSwgaW5kZXgpICsgMTsKKwkJaW5kZXggPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoZ2VuZXJpY1NpZ25hdHVyZSwgaW5kZXgpICsgMTsKIAkJd2hpbGUgKGluZGV4ICA8IHNpZ25hdHVyZUxlbmd0aCkgewogCQkJaW50IHN0YXJ0ID0gaW5kZXg7Ci0JCQlpbmRleCA9IFV0aWwuc2NhbkNsYXNzVHlwZVNpZ25hdHVyZShnZW5lcmljU2lnbmF0dXJlLCBzdGFydCkgKyAxOworCQkJaW5kZXggPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnNjYW5DbGFzc1R5cGVTaWduYXR1cmUoZ2VuZXJpY1NpZ25hdHVyZSwgc3RhcnQpICsgMTsKIAkJCWNoYXJbXSBpbnRlcmZhY2VTaWcgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGdlbmVyaWNTaWduYXR1cmUsIHN0YXJ0LCBpbmRleCk7CiAJCQlpbnRlcmZhY2VzLmFkZChuZXcgU3RyaW5nKENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZShpbnRlcmZhY2VTaWcpKSk7CiAJCX0KQEAgLTYwNiw5ICs2NDEsOSBAQAogcHVibGljIFN0cmluZ1tdIGdldFR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0RWxlbWVudEluZm8oKTsKIAljaGFyW10gZ2VuZXJpY1NpZ25hdHVyZSA9IGluZm8uZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOwotCWlmIChnZW5lcmljU2lnbmF0dXJlID09IG51bGwpIAorCWlmIChnZW5lcmljU2lnbmF0dXJlID09IG51bGwpCiAJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7Ci0JCisKIAljaGFyW10gZG90QmFzZVNpZ25hdHVyZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShnZW5lcmljU2lnbmF0dXJlLCAnLycsICcuJyk7CiAJY2hhcltdW10gdHlwZVBhcmFtcyA9IFNpZ25hdHVyZS5nZXRUeXBlUGFyYW1ldGVycyhkb3RCYXNlU2lnbmF0dXJlKTsKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3ModHlwZVBhcmFtcyk7CkBAIC03NDcsNyArNzgyLDcgQEAKIAlJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcywKIAlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCisKIAlDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uIG9wPSBuZXcgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbih0aGlzLCB3b3JraW5nQ29waWVzLCBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKSwgZmFsc2UpOwogCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKIAlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CkBAIC03NjYsNyArODAxLDcgQEAKIAlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLAogCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkKKwogCUlDb21waWxhdGlvblVuaXRbXSBjb3BpZXM7CiAJaWYgKHdvcmtpbmdDb3BpZXMgPT0gbnVsbCkgewogCQljb3BpZXMgPSBudWxsOwpAQCAtODAwLDcgKzgzNSw3IEBACiAgKi8KIHB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBXb3JraW5nQ29weU93bmVyIG93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5oaWVyYXJjaHlfbnVsbFByb2plY3QpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5oaWVyYXJjaHlfbnVsbFByb2plY3QpOwogCX0KIAlJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFdvcmtpbmdDb3BpZXMob3duZXIsIHRydWUvKmFkZCBwcmltYXJ5IHdvcmtpbmcgY29waWVzKi8pOwogCUlDb21waWxhdGlvblVuaXRbXSBwcm9qZWN0V0NzID0gbnVsbDsKQEAgLTgxOSw5ICs4NTQsOSBAQAogCQl9CiAJfQogCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKAotCQl0aGlzLCAKKwkJdGhpcywKIAkJcHJvamVjdFdDcywKLQkJcHJvamVjdCwgCisJCXByb2plY3QsCiAJCXRydWUpOwogCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKIAlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CkBAIC04MzEsMTIgKzg2NiwxNCBAQAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCiAgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCiAgKiBAcmV0dXJuIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCi0gKiAKKyAqCiAgKiBAc2VlIElUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogICogQGRlcHJlY2F0ZWQKICAqLwogcHVibGljIElUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlyZXR1cm4gbmV3VHlwZUhpZXJhcmNoeSgoSVdvcmtpbmdDb3B5W10pbnVsbCwgbW9uaXRvcik7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODg0NSwgY29uc2lkZXIgYW55CisJLy8gY2hhbmdlcyB0aGF0IG1heSBleGlzdCBvbiBwcmltYXJ5IHdvcmtpbmcgY29waWVzLgorCXJldHVybiBuZXdUeXBlSGllcmFyY2h5KERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlksIG1vbml0b3IpOwogfQogLyoKICAqIEBzZWUgSVR5cGUjbmV3VHlwZUhpZXJhcmNoeShJQ29tcGlsYXRpb25Vbml0W10sIElQcm9ncmVzc01vbml0b3IpCkBAIC04NzUsMTEgKzkxMiwxMSBAQAogCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCiAJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCUlDb21waWxhdGlvblVuaXRbXSB3b3JraW5nQ29waWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0V29ya2luZ0NvcGllcyhvd25lciwgdHJ1ZS8qYWRkIHByaW1hcnkgd29ya2luZyBjb3BpZXMqLyk7CiAJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24odGhpcywgd29ya2luZ0NvcGllcywgU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksIHRydWUpOwogCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKLQlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CQorCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKIH0KIHB1YmxpYyBKYXZhRWxlbWVudCByZXNvbHZlZChCaW5kaW5nIGJpbmRpbmcpIHsKIAlTb3VyY2VSZWZFbGVtZW50IHJlc29sdmVkSGFuZGxlID0gbmV3IFJlc29sdmVkQmluYXJ5VHlwZSh0aGlzLnBhcmVudCwgdGhpcy5uYW1lLCBuZXcgU3RyaW5nKGJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleSgpKSk7CkBAIC04ODcsMjAgKzkyNCw2IEBACiAJcmV0dXJuIHJlc29sdmVkSGFuZGxlOwogfQogLyoKLSAqIEBzZWUgSVR5cGUjcmVzb2x2ZVR5cGUoU3RyaW5nKQotICovCi1wdWJsaWMgU3RyaW5nW11bXSByZXNvbHZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkvLyBub3QgaW1wbGVtZW50ZWQgZm9yIGJpbmFyeSB0eXBlcwotCXJldHVybiBudWxsOwotfQotLyoKLSAqIEBzZWUgSVR5cGUjcmVzb2x2ZVR5cGUoU3RyaW5nLCBXb3JraW5nQ29weU93bmVyKQotICovCi1wdWJsaWMgU3RyaW5nW11bXSByZXNvbHZlVHlwZShTdHJpbmcgdHlwZU5hbWUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHsKLQkvLyBub3QgaW1wbGVtZW50ZWQgZm9yIGJpbmFyeSB0eXBlcwotCXJldHVybiBudWxsOwotfQotLyoKICAqIFJldHVybnMgdGhlIHNvdXJjZSBmaWxlIG5hbWUgYXMgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gaW5mby4KICAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmZvLCBpbmZlcnMgaXQgZnJvbSB0aGlzIHR5cGUuCiAgKi8KQEAgLTkzOSw3ICs5NjIsNyBAQAogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKIAlpZiAoaW5mbyA9PSBudWxsKSB7CiAJCXRvU3RyaW5nTmFtZShidWZmZXIpOwogCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCkBAIC05NDcsMTEgKzk3MCwxMSBAQAogCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAl9IGVsc2UgewogCQl0cnkgewotCQkJaWYgKHRoaXMuaXNBbm5vdGF0aW9uKCkpIHsKKwkJCWlmIChpc0Fubm90YXRpb24oKSkgewogCQkJCWJ1ZmZlci5hcHBlbmQoIkBpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAodGhpcy5pc0VudW0oKSkgeworCQkJfSBlbHNlIGlmIChpc0VudW0oKSkgewogCQkJCWJ1ZmZlci5hcHBlbmQoImVudW0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAodGhpcy5pc0ludGVyZmFjZSgpKSB7CisJCQl9IGVsc2UgaWYgKGlzSW50ZXJmYWNlKCkpIHsKIAkJCQlidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0gZWxzZSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKQEAgLTk2OSw2MiArOTkyLDE3IEBACiAJCWJ1ZmZlci5hcHBlbmQoIjxhbm9ueW1vdXM+Iik7IC8vJE5PTi1OTFMtMSQKIH0KIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNoZWRKYXZhZG9jKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JZmluYWwgU3RyaW5nIGNvbnRlbnRzID0gZ2V0SmF2YWRvY0NvbnRlbnRzKG1vbml0b3IpOwotCWlmIChjb250ZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlmaW5hbCBpbnQgaW5kZXhPZlN0YXJ0T2ZDbGFzc0RhdGEgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuU1RBUlRfT0ZfQ0xBU1NfREFUQSk7Ci0JaWYgKGluZGV4T2ZTdGFydE9mQ2xhc3NEYXRhID09IC0xKSB0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JaW50IGluZGV4T2ZOZXh0U3VtbWFyeSA9IGNvbnRlbnRzLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5ORVNURURfQ0xBU1NfU1VNTUFSWSk7Ci0JaWYgKHRoaXMuaXNFbnVtKCkgJiYgaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7Ci0JCS8vIHRyeSB0byBmaW5kIGVudW0gY29uc3RhbnQgc3VtbWFyeSBzdGFydAotCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuRU5VTV9DT05TVEFOVF9TVU1NQVJZKTsKLQl9Ci0JaWYgKHRoaXMuaXNBbm5vdGF0aW9uKCkgJiYgaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7Ci0JCS8vIHRyeSB0byBmaW5kIHJlcXVpcmVkIGVudW0gY29uc3RhbnQgc3VtbWFyeSBzdGFydAotCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFX1JFUVVJUkVEX01FTUJFUl9TVU1NQVJZKTsKLQkJaWYgKGluZGV4T2ZOZXh0U3VtbWFyeSA9PSAtMSkgewotCQkJLy8gdHJ5IHRvIGZpbmQgb3B0aW9uYWwgZW51bSBjb25zdGFudCBzdW1tYXJ5IHN0YXJ0Ci0JCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBjb250ZW50cy5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFX09QVElPTkFMX01FTUJFUl9TVU1NQVJZKTsKLQkJfQotCX0KLQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7Ci0JCS8vIHRyeSB0byBmaW5kIGZpZWxkIHN1bW1hcnkgc3RhcnQKLQkJaW5kZXhPZk5leHRTdW1tYXJ5ID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkZJRUxEX1NVTU1BUlkpOwotCX0KLQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7Ci0JCS8vIHRyeSB0byBmaW5kIGNvbnN0cnVjdG9yIHN1bW1hcnkgc3RhcnQKLQkJaW5kZXhPZk5leHRTdW1tYXJ5ID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkNPTlNUUlVDVE9SX1NVTU1BUlkpOwotCX0KLQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7Ci0JCS8vIHRyeSB0byBmaW5kIG1ldGhvZCBzdW1tYXJ5IHN0YXJ0Ci0JCWluZGV4T2ZOZXh0U3VtbWFyeSA9IGNvbnRlbnRzLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5NRVRIT0RfU1VNTUFSWSk7Ci0JfQotCWlmIChpbmRleE9mTmV4dFN1bW1hcnkgPT0gLTEpIHsKLQkJLy8gd2UgdGFrZSB0aGUgZW5kIG9mIGNsYXNzIGRhdGEKLQkJaW5kZXhPZk5leHRTdW1tYXJ5ID0gY29udGVudHMuaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkVORF9PRl9DTEFTU19EQVRBKTsKLQl9Ci0JaWYgKGluZGV4T2ZOZXh0U3VtbWFyeSA9PSAtMSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VTktOT1dOX0pBVkFET0NfRk9STUFULCB0aGlzKSk7Ci0JfQotCS8qCi0JICogQ2hlY2sgb3V0IHRvIGN1dCBvZmYgdGhlIGhpZXJhcmNoeSBzZWUgMTE5ODQ0Ci0JICogV2UgcmVtb3ZlIHdoYXQgdGhlIGNvbnRlbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNsYXNzIGRhdGEgYW5kIHRoZSBmaXJzdCA8UD4KLQkgKi8KLQlpbnQgc3RhcnQgPSBpbmRleE9mU3RhcnRPZkNsYXNzRGF0YSArIEphdmFkb2NDb25zdGFudHMuU1RBUlRfT0ZfQ0xBU1NfREFUQV9MRU5HVEg7Ci0JaW50IGluZGV4T2ZGaXJzdFBhcmFncmFwaCA9IGNvbnRlbnRzLmluZGV4T2YoIjxQPiIsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCWlmIChpbmRleE9mRmlyc3RQYXJhZ3JhcGggPT0gLTEpIHsKLQkJaW5kZXhPZkZpcnN0UGFyYWdyYXBoID0gY29udGVudHMuaW5kZXhPZigiPHA+Iiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JfQotCWlmIChpbmRleE9mRmlyc3RQYXJhZ3JhcGggIT0gLTEgJiYgaW5kZXhPZkZpcnN0UGFyYWdyYXBoIDwgaW5kZXhPZk5leHRTdW1tYXJ5KSB7Ci0JCXN0YXJ0ID0gaW5kZXhPZkZpcnN0UGFyYWdyYXBoOwotCX0JCi0JcmV0dXJuIGNvbnRlbnRzLnN1YnN0cmluZyhzdGFydCwgaW5kZXhPZk5leHRTdW1tYXJ5KTsKKwlKYXZhZG9jQ29udGVudHMgamF2YWRvY0NvbnRlbnRzID0gZ2V0SmF2YWRvY0NvbnRlbnRzKG1vbml0b3IpOworCWlmIChqYXZhZG9jQ29udGVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJcmV0dXJuIGphdmFkb2NDb250ZW50cy5nZXRUeXBlRG9jKCk7CiB9Ci1wdWJsaWMgU3RyaW5nIGdldEphdmFkb2NDb250ZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVBlclByb2plY3RJbmZvIHByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm9DaGVja0V4aXN0ZW5jZSh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQlTdHJpbmcgY2FjaGVkSmF2YWRvYyA9IG51bGw7CitwdWJsaWMgSmF2YWRvY0NvbnRlbnRzIGdldEphdmFkb2NDb250ZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVBlclByb2plY3RJbmZvIHByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm9DaGVja0V4aXN0ZW5jZShnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7CisJSmF2YWRvY0NvbnRlbnRzIGNhY2hlZEphdmFkb2MgPSBudWxsOwogCXN5bmNocm9uaXplZCAocHJvamVjdEluZm8uamF2YWRvY0NhY2hlKSB7Ci0JCWNhY2hlZEphdmFkb2MgPSAoU3RyaW5nKSBwcm9qZWN0SW5mby5qYXZhZG9jQ2FjaGUuZ2V0KHRoaXMpOworCQljYWNoZWRKYXZhZG9jID0gKEphdmFkb2NDb250ZW50cykgcHJvamVjdEluZm8uamF2YWRvY0NhY2hlLmdldCh0aGlzKTsKIAl9CisJCiAJaWYgKGNhY2hlZEphdmFkb2MgIT0gbnVsbCAmJiBjYWNoZWRKYXZhZG9jICE9IEVNUFRZX0pBVkFET0MpIHsKIAkJcmV0dXJuIGNhY2hlZEphdmFkb2M7CiAJfQpAQCAtMTAzNyw5ICsxMDE1LDkgQEAKIAlpZiAoIShwYXRoQnVmZmVyLmNoYXJBdChwYXRoQnVmZmVyLmxlbmd0aCgpIC0gMSkgPT0gJy8nKSkgewogCQlwYXRoQnVmZmVyLmFwcGVuZCgnLycpOwogCX0KLQlJUGFja2FnZUZyYWdtZW50IHBhY2s9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50KCk7CisJSVBhY2thZ2VGcmFnbWVudCBwYWNrPSBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKIAlTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUgPSBudWxsOwotCWlmICh0aGlzLmlzTWVtYmVyKCkpIHsKKwlpZiAoaXNNZW1iZXIoKSkgewogCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXM7CiAJCVN0cmluZ0J1ZmZlciB0eXBlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKQEAgLTEwNTEsMTYgKzEwMjksMTYgQEAKIAkJfQogCQl0eXBlUXVhbGlmaWVkTmFtZSA9IG5ldyBTdHJpbmcodHlwZU5hbWUudG9TdHJpbmcoKSk7CiAJfSBlbHNlIHsKLQkJdHlwZVF1YWxpZmllZE5hbWUgPSB0aGlzLmdldEVsZW1lbnROYW1lKCk7CisJCXR5cGVRdWFsaWZpZWROYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsKIAl9Ci0JCisKIAlwYXRoQnVmZmVyLmFwcGVuZChwYWNrLmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpLmFwcGVuZCgnLycpLmFwcGVuZCh0eXBlUXVhbGlmaWVkTmFtZSkuYXBwZW5kKEphdmFkb2NDb25zdGFudHMuSFRNTF9FWFRFTlNJT04pOwotCQogCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwogCWZpbmFsIFN0cmluZyBjb250ZW50cyA9IGdldFVSTENvbnRlbnRzKFN0cmluZy52YWx1ZU9mKHBhdGhCdWZmZXIpKTsKKwlKYXZhZG9jQ29udGVudHMgamF2YWRvY0NvbnRlbnRzID0gbmV3IEphdmFkb2NDb250ZW50cyh0aGlzLCBjb250ZW50cyk7CiAJc3luY2hyb25pemVkIChwcm9qZWN0SW5mby5qYXZhZG9jQ2FjaGUpIHsKLQkJcHJvamVjdEluZm8uamF2YWRvY0NhY2hlLnB1dCh0aGlzLCBjb250ZW50cyk7CisJCXByb2plY3RJbmZvLmphdmFkb2NDYWNoZS5wdXQodGhpcywgamF2YWRvY0NvbnRlbnRzKTsKIAl9Ci0JcmV0dXJuIGNvbnRlbnRzOworCXJldHVybiBqYXZhZG9jQ29udGVudHM7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlQ29udmVydGVyLmphdmEKaW5kZXggMGUzM2I4OC4uZTU2ZTRhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5VHlwZUNvbnZlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBUeXBlQ29udmVydGVycyBkb24ndCBzZXQgZW5jbG9zaW5nVHlwZSAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA4NDEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIApAQCAtMTQsNiArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKQEAgLTIyLDc5ICsyNCwxNTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5VHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5IYXNoU2V0T2ZDaGFyQXJyYXlBcnJheTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgogICogQ29udmVydGVyIGZyb20gYSBiaW5hcnkgdHlwZSB0byBhbiBBU1QgdHlwZSBkZWNsYXJhdGlvbi4KICAqLwotcHVibGljIGNsYXNzIEJpbmFyeVR5cGVDb252ZXJ0ZXIgewotCQorcHVibGljIGNsYXNzIEJpbmFyeVR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBUeXBlQ29udmVydGVyIHsKKworCXByaXZhdGUgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQ7CisJcHJpdmF0ZSBIYXNoU2V0T2ZDaGFyQXJyYXlBcnJheSB0eXBlTmFtZXM7CisKKwlwdWJsaWMgQmluYXJ5VHlwZUNvbnZlcnRlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCwgSGFzaFNldE9mQ2hhckFycmF5QXJyYXkgdHlwZU5hbWVzKSB7CisJCXN1cGVyKHByb2JsZW1SZXBvcnRlciwgU2lnbmF0dXJlLkNfRE9MTEFSKTsKKwkJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OworCQl0aGlzLnR5cGVOYW1lcyA9IHR5cGVOYW1lczsKKwl9CisKKwlwdWJsaWMgSW1wb3J0UmVmZXJlbmNlW10gYnVpbGRJbXBvcnRzKENsYXNzRmlsZVJlYWRlciByZWFkZXIpIHsKKwkJLy8gYWRkIHJlbWFpbmluZyByZWZlcmVuY2VzIHRvIHRoZSBsaXN0IG9mIHR5cGUgbmFtZXMKKwkJLy8gKGNvZGUgZXh0cmFjdGVkIGZyb20gQmluYXJ5SW5kZXhlciNleHRyYWN0UmVmZXJlbmNlRnJvbUNvbnN0YW50UG9vbCguLi4pKQorCQlpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzID0gcmVhZGVyLmdldENvbnN0YW50UG9vbE9mZnNldHMoKTsKKwkJaW50IGNvbnN0YW50UG9vbENvdW50ID0gY29uc3RhbnRQb29sT2Zmc2V0cy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RhbnRQb29sQ291bnQ7IGkrKykgeworCQkJaW50IHRhZyA9IHJlYWRlci51MUF0KGNvbnN0YW50UG9vbE9mZnNldHNbaV0pOworCQkJY2hhcltdIG5hbWUgPSBudWxsOworCQkJc3dpdGNoICh0YWcpIHsKKwkJCQljYXNlIENsYXNzRmlsZUNvbnN0YW50cy5NZXRob2RSZWZUYWcgOgorCQkJCWNhc2UgQ2xhc3NGaWxlQ29uc3RhbnRzLkludGVyZmFjZU1ldGhvZFJlZlRhZyA6CisJCQkJCWludCBjb25zdGFudFBvb2xJbmRleCA9IHJlYWRlci51MkF0KGNvbnN0YW50UG9vbE9mZnNldHNbaV0gKyAzKTsKKwkJCQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3JlYWRlci51MkF0KGNvbnN0YW50UG9vbE9mZnNldHNbY29uc3RhbnRQb29sSW5kZXhdICsgMyldOworCQkJCQluYW1lID0gcmVhZGVyLnV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgcmVhZGVyLnUyQXQodXRmOE9mZnNldCArIDEpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDbGFzc0ZpbGVDb25zdGFudHMuQ2xhc3NUYWcgOgorCQkJCQl1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1tyZWFkZXIudTJBdChjb25zdGFudFBvb2xPZmZzZXRzW2ldICsgMSldOworCQkJCQluYW1lID0gcmVhZGVyLnV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgcmVhZGVyLnUyQXQodXRmOE9mZnNldCArIDEpKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobmFtZSA9PSBudWxsIHx8IChuYW1lLmxlbmd0aCA+IDAgJiYgbmFtZVswXSA9PSAnWycpKQorCQkJCWJyZWFrOyAvLyBza2lwIG92ZXIgYXJyYXkgcmVmZXJlbmNlcworCQkJdGhpcy50eXBlTmFtZXMuYWRkKENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIG5hbWUpKTsKKwkJfQorCisJCS8vIGNvbnZlcnQgdHlwZSBuYW1lcyBpbnRvIGltcG9ydCByZWZlcmVuY2VzCisJCWludCB0eXBlTmFtZXNMZW5ndGggPSB0aGlzLnR5cGVOYW1lcy5zaXplKCk7CisJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBuZXcgSW1wb3J0UmVmZXJlbmNlW3R5cGVOYW1lc0xlbmd0aF07CisJCWNoYXJbXVtdW10gc2V0ID0gdGhpcy50eXBlTmFtZXMuc2V0OworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc2V0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQljaGFyW11bXSB0eXBlTmFtZSA9IHNldFtpXTsKKwkJCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7CisJCQkJaW1wb3J0c1tpbmRleCsrXSA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodHlwZU5hbWUsIG5ldyBsb25nW3R5cGVOYW1lLmxlbmd0aF0vKmR1bW15IHBvc2l0aW9ucyovLCBmYWxzZS8qbm90IG9uIGRlbWFuZCovLCAwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW1wb3J0czsKKwl9CisKIAkvKioKIAkgKiBDb252ZXJ0IGEgYmluYXJ5IHR5cGUgaW50byBhbiBBU1QgdHlwZSBkZWNsYXJhdGlvbiBhbmQgcHV0IGl0IGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKElUeXBlIHR5cGUsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKElUeXBlIHR5cGUsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCkgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKFBhY2thZ2VGcmFnbWVudCkgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKIAkJY2hhcltdW10gcGFja2FnZU5hbWUgPSBVdGlsLnRvQ2hhckFycmF5cyhwa2cubmFtZXMpOwotCQkKLQkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCA+IDApIHsgCisKKwkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCA+IDApIHsKIAkJCWNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZSA9IG5ldyBJbXBvcnRSZWZlcmVuY2UocGFja2FnZU5hbWUsIG5ldyBsb25nW117MH0sIGZhbHNlLCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVmYXVsdCk7CiAJCX0KLQkKKwogCQkvKiBjb252ZXJ0IHR5cGUgKi8KLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGNvbnZlcnQodHlwZSwgbnVsbCwgbnVsbCwgY29tcGlsYXRpb25SZXN1bHQpOwotCQkKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGNvbnZlcnQodHlwZSwgbnVsbCwgbnVsbCk7CisKIAkJSVR5cGUgYWxyZWFkeUNvbXB1dGVkTWVtYmVyID0gdHlwZTsKIAkJSVR5cGUgcGFyZW50ID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CiAJCVR5cGVEZWNsYXJhdGlvbiBwcmV2aW91c0RlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uOwogCQl3aGlsZShwYXJlbnQgIT0gbnVsbCkgewotCQkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gY29udmVydChwYXJlbnQsIGFscmVhZHlDb21wdXRlZE1lbWJlciwgcHJldmlvdXNEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25SZXN1bHQpOwotCQkJCisJCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjb252ZXJ0KHBhcmVudCwgYWxyZWFkeUNvbXB1dGVkTWVtYmVyLCBwcmV2aW91c0RlY2xhcmF0aW9uKTsKKwogCQkJYWxyZWFkeUNvbXB1dGVkTWVtYmVyID0gcGFyZW50OwogCQkJcHJldmlvdXNEZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwogCQkJcGFyZW50ID0gcGFyZW50LmdldERlY2xhcmluZ1R5cGUoKTsKIAkJfQotCQkKKwogCQljb21waWxhdGlvblVuaXQudHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW117cHJldmlvdXNEZWNsYXJhdGlvbn07CiAKIAkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKIAl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRmllbGREZWNsYXJhdGlvbiBjb252ZXJ0KElGaWVsZCBmaWVsZCwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwlwcml2YXRlIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJRmllbGQgZmllbGQsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKSk7CisJCWlmICh0eXBlUmVmZXJlbmNlID09IG51bGwpIHJldHVybiBudWxsOwogCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOwogCiAJCWZpZWxkRGVjbGFyYXRpb24ubmFtZSA9IGZpZWxkLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKLQkJZmllbGREZWNsYXJhdGlvbi50eXBlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShTaWduYXR1cmUudG9TdHJpbmcoZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpKS50b0NoYXJBcnJheSgpKTsKKwkJZmllbGREZWNsYXJhdGlvbi50eXBlID0gdHlwZVJlZmVyZW5jZTsKIAkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBmaWVsZC5nZXRGbGFncygpOwogCiAJCXJldHVybiBmaWVsZERlY2xhcmF0aW9uOwogCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGNvbnZlcnQoSU1ldGhvZCBtZXRob2QsIElUeXBlIHR5cGUsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBjb252ZXJ0KElNZXRob2QgbWV0aG9kLCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uOwogCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbXMgPSBudWxsOworCisJCS8vIGNvbnZlcnQgMS41IHNwZWNpZmljIGNvbnN0cnVjdHMgb25seSBpZiBjb21wbGlhbmNlIGlzIDEuNSBvciBhYm92ZQorCQlpZiAodGhpcy5oYXMxXzVDb21wbGlhbmNlKSB7CisJCQkvKiBjb252ZXJ0IHR5cGUgcGFyYW1ldGVycyAqLworCQkJSVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpOworCQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgeworCQkJCWludCBwYXJhbWV0ZXJDb3VudCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQl0eXBlUGFyYW1zID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcltwYXJhbWV0ZXJDb3VudF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKKwkJCQkJdHlwZVBhcmFtc1tpXSA9CisJCQkJCQljcmVhdGVUeXBlUGFyYW1ldGVyKAorCQkJCQkJCQl0eXBlUGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwKKwkJCQkJCQkJc3RyaW5nQXJyYXlUb0NoYXJBcnJheSh0eXBlUGFyYW1ldGVyLmdldEJvdW5kcygpKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJMCk7CisJCQkJfQorCQkJfQorCQl9CisKIAkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25SZXN1bHQpOwogCQkJZGVjbC5iaXRzICY9IH5BU1ROb2RlLklzRGVmYXVsdENvbnN0cnVjdG9yOworCQkJZGVjbC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbXM7CiAJCQltZXRob2REZWNsYXJhdGlvbiA9IGRlY2w7CiAJCX0gZWxzZSB7Ci0JCQlNZXRob2REZWNsYXJhdGlvbiBkZWNsID0gdHlwZS5pc0Fubm90YXRpb24oKSA/IG5ldyBBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpIDogbmV3IE1ldGhvZERlY2xhcmF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCU1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSB0eXBlLmlzQW5ub3RhdGlvbigpID8gbmV3IEFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uUmVzdWx0KSA6IG5ldyBNZXRob2REZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uUmVzdWx0KTsKIAkJCS8qIGNvbnZlcnQgcmV0dXJuIHR5cGUgKi8KLQkJCWRlY2wucmV0dXJuVHlwZSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoU2lnbmF0dXJlLnRvU3RyaW5nKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpLnRvQ2hhckFycmF5KCkpOworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKwkJCWlmICh0eXBlUmVmZXJlbmNlID09IG51bGwpIHJldHVybiBudWxsOworCQkJZGVjbC5yZXR1cm5UeXBlID0gdHlwZVJlZmVyZW5jZTsKKwkJCWRlY2wudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1zOwogCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBkZWNsOwogCQl9CiAJCW1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKQEAgLTEwNiwxMCArMTgzLDE0IEBACiAJCVN0cmluZ1tdIGFyZ3VtZW50VHlwZU5hbWVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CiAJCVN0cmluZ1tdIGFyZ3VtZW50TmFtZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKIAkJaW50IGFyZ3VtZW50Q291bnQgPSBhcmd1bWVudFR5cGVOYW1lcyA9PSBudWxsID8gMCA6IGFyZ3VtZW50VHlwZU5hbWVzLmxlbmd0aDsKKwkJLy8gSWdub3JlIHN5bnRoZXRpYyBhcmd1bWVudHMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMjI0KQorCQlpbnQgc3RhcnRJbmRleCA9IChtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmIHR5cGUuaXNNZW1iZXIoKSAmJiAhRmxhZ3MuaXNTdGF0aWModHlwZS5nZXRGbGFncygpKSkgPyAxIDogMDsKKwkJYXJndW1lbnRDb3VudCAtPSBzdGFydEluZGV4OwogCQltZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHMgPSBuZXcgQXJndW1lbnRbYXJndW1lbnRDb3VudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3VudDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJndW1lbnRUeXBlTmFtZSA9IGFyZ3VtZW50VHlwZU5hbWVzW2ldOwotCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShTaWduYXR1cmUudG9TdHJpbmcoYXJndW1lbnRUeXBlTmFtZSkudG9DaGFyQXJyYXkoKSk7CisJCQlTdHJpbmcgYXJndW1lbnRUeXBlTmFtZSA9IGFyZ3VtZW50VHlwZU5hbWVzW3N0YXJ0SW5kZXgraV07CisJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKGFyZ3VtZW50VHlwZU5hbWUpOworCQkJaWYgKHR5cGVSZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQlpZiAoaXNWYXJhcmdzICYmIGkgPT0gYXJndW1lbnRDb3VudC0xKSB7CiAJCQkJdHlwZVJlZmVyZW5jZS5iaXRzIHw9IEFTVE5vZGUuSXNWYXJBcmdzOwogCQkJfQpAQCAtMTI3LDE2ICsyMDgsMTcgQEAKIAkJaWYoZXhjZXB0aW9uQ291bnQgPiAwKSB7CiAJCQltZXRob2REZWNsYXJhdGlvbi50aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVSZWZlcmVuY2VbZXhjZXB0aW9uQ291bnRdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25Db3VudDsgaSsrKSB7Ci0JCQkJbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uc1tpXSA9Ci0JCQkJCWNyZWF0ZVR5cGVSZWZlcmVuY2UoU2lnbmF0dXJlLnRvU3RyaW5nKGV4Y2VwdGlvblR5cGVOYW1lc1tpXSkudG9DaGFyQXJyYXkoKSk7CisJCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShleGNlcHRpb25UeXBlTmFtZXNbaV0pOworCQkJCWlmICh0eXBlUmVmZXJlbmNlID09IG51bGwpIHJldHVybiBudWxsOworCQkJCW1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnNbaV0gPSB0eXBlUmVmZXJlbmNlOwogCQkJfQogCQl9CiAJCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKIAl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGNvbnZlcnQoSVR5cGUgdHlwZSwgSVR5cGUgYWxyZWFkeUNvbXB1dGVkTWVtYmVyLFR5cGVEZWNsYXJhdGlvbiBhbHJlYWR5Q29tcHV0ZWRNZW1iZXJEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJcHJpdmF0ZSBUeXBlRGVjbGFyYXRpb24gY29udmVydChJVHlwZSB0eXBlLCBJVHlwZSBhbHJlYWR5Q29tcHV0ZWRNZW1iZXIsVHlwZURlY2xhcmF0aW9uIGFscmVhZHlDb21wdXRlZE1lbWJlckRlY2xhcmF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJLyogY3JlYXRlIHR5cGUgZGVjbGFyYXRpb24gLSBjYW4gYmUgbWVtYmVyIHR5cGUgKi8KLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG5ldyBUeXBlRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gbmV3IFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uUmVzdWx0KTsKIAogCQlpZiAodHlwZS5nZXREZWNsYXJpbmdUeXBlKCkgIT0gbnVsbCkgewogCQkJdHlwZURlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5Jc01lbWJlclR5cGU7CkBAIC0xNDcsMTcgKzIyOSw1MCBAQAogCiAJCS8qIHNldCBzdXBlcmNsYXNzIGFuZCBzdXBlcmludGVyZmFjZXMgKi8KIAkJaWYgKHR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0JCQl0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcyA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UodHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpLnRvQ2hhckFycmF5KCkpOwotCQkJdHlwZURlY2xhcmF0aW9uLnN1cGVyY2xhc3MuYml0cyB8PSBBU1ROb2RlLklzU3VwZXJUeXBlOworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gY3JlYXRlVHlwZVJlZmVyZW5jZSh0eXBlLmdldFN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlKCkpOworCQkJaWYgKHR5cGVSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCXR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzID0gdHlwZVJlZmVyZW5jZTsKKwkJCQl0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcy5iaXRzIHw9IEFTVE5vZGUuSXNTdXBlclR5cGU7CisJCQl9CiAJCX0KLQkJU3RyaW5nW10gaW50ZXJmYWNlTmFtZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKLQkJaW50IGludGVyZmFjZUNvdW50ID0gaW50ZXJmYWNlTmFtZXMgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisKKwkJU3RyaW5nW10gaW50ZXJmYWNlVHlwZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlVHlwZVNpZ25hdHVyZXMoKTsKKwkJaW50IGludGVyZmFjZUNvdW50ID0gaW50ZXJmYWNlVHlwZXMgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2VUeXBlcy5sZW5ndGg7CiAJCXR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtpbnRlcmZhY2VDb3VudF07CisJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlQ291bnQ7IGkrKykgewotCQkJdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlc1tpXSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50ZXJmYWNlTmFtZXNbaV0udG9DaGFyQXJyYXkoKSk7Ci0JCQl0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzW2ldLmJpdHMgfD0gQVNUTm9kZS5Jc1N1cGVyVHlwZTsKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50ZXJmYWNlVHlwZXNbaV0pOworCQkJaWYgKHR5cGVSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCXR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXNbY291bnRdID0gdHlwZVJlZmVyZW5jZTsKKwkJCQl0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzW2NvdW50KytdLmJpdHMgfD0gQVNUTm9kZS5Jc1N1cGVyVHlwZTsKKwkJCX0KIAkJfQotCQkKKwkJaWYgKGNvdW50ICE9IGludGVyZmFjZUNvdW50KSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVEZWNsYXJhdGlvbi5maWVsZHMsIDAsIHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtpbnRlcmZhY2VDb3VudF0sIDAsIGludGVyZmFjZUNvdW50KTsKKwkJfQorCisJCS8vIGNvbnZlcnQgMS41IHNwZWNpZmljIGNvbnN0cnVjdHMgb25seSBpZiBjb21wbGlhbmNlIGlzIDEuNSBvciBhYm92ZQorCQlpZiAodGhpcy5oYXMxXzVDb21wbGlhbmNlKSB7CisKKwkJCS8qIGNvbnZlcnQgdHlwZSBwYXJhbWV0ZXJzICovCisJCQlJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gdHlwZS5nZXRUeXBlUGFyYW1ldGVycygpOworCQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgeworCQkJCWludCBwYXJhbWV0ZXJDb3VudCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1zID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVBhcmFtZXRlcltwYXJhbWV0ZXJDb3VudF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKKwkJCQkJdHlwZVBhcmFtc1tpXSA9CisJCQkJCQljcmVhdGVUeXBlUGFyYW1ldGVyKAorCQkJCQkJCQl0eXBlUGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwKKwkJCQkJCQkJc3RyaW5nQXJyYXlUb0NoYXJBcnJheSh0eXBlUGFyYW1ldGVyLmdldEJvdW5kcygpKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJMCk7CisJCQkJfQorCisJCQkJdHlwZURlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtczsKKwkJCX0KKwkJfQorCiAJCS8qIGNvbnZlcnQgbWVtYmVyIHR5cGVzICovCiAJCUlUeXBlW10gbWVtYmVyVHlwZXMgPSB0eXBlLmdldFR5cGVzKCk7CiAJCWludCBtZW1iZXJUeXBlQ291bnQgPQltZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsKQEAgLTE2NiwxNiArMjgxLDI0IEBACiAJCQlpZihhbHJlYWR5Q29tcHV0ZWRNZW1iZXIgIT0gbnVsbCAmJiBhbHJlYWR5Q29tcHV0ZWRNZW1iZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG1lbWJlclR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgewogCQkJCXR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlc1tpXSA9IGFscmVhZHlDb21wdXRlZE1lbWJlckRlY2xhcmF0aW9uOwogCQkJfSBlbHNlIHsKLQkJCQl0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV0gPSBjb252ZXJ0KG1lbWJlclR5cGVzW2ldLCBudWxsLCBudWxsLCBjb21waWxhdGlvblJlc3VsdCk7CisJCQkJdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzW2ldID0gY29udmVydChtZW1iZXJUeXBlc1tpXSwgbnVsbCwgbnVsbCk7CiAJCQl9CisJCQl0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV0uZW5jbG9zaW5nVHlwZSA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJfQogCiAJCS8qIGNvbnZlcnQgZmllbGRzICovCiAJCUlGaWVsZFtdIGZpZWxkcyA9IHR5cGUuZ2V0RmllbGRzKCk7CiAJCWludCBmaWVsZENvdW50ID0gZmllbGRzID09IG51bGwgPyAwIDogZmllbGRzLmxlbmd0aDsKIAkJdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW2ZpZWxkQ291bnRdOworCQljb3VudCA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRDb3VudDsgaSsrKSB7Ci0JCQl0eXBlRGVjbGFyYXRpb24uZmllbGRzW2ldID0gY29udmVydChmaWVsZHNbaV0sIHR5cGUpOworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gY29udmVydChmaWVsZHNbaV0sIHR5cGUpOworCQkJaWYgKGZpZWxkRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCXR5cGVEZWNsYXJhdGlvbi5maWVsZHNbY291bnQrK10gPSBmaWVsZERlY2xhcmF0aW9uOworCQkJfQorCQl9CisJCWlmIChjb3VudCAhPSBmaWVsZENvdW50KSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVEZWNsYXJhdGlvbi5maWVsZHMsIDAsIHR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltjb3VudF0sIDAsIGNvdW50KTsKIAkJfQogCiAJCS8qIGNvbnZlcnQgbWV0aG9kcyAtIG5lZWQgdG8gYWRkIGRlZmF1bHQgY29uc3RydWN0b3IgaWYgbmVjZXNzYXJ5ICovCkBAIC0xOTksNTcgKzMyMiw0OCBAQAogCQkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHNbMF0gPSB0eXBlRGVjbGFyYXRpb24uY3JlYXRlRGVmYXVsdENvbnN0cnVjdG9yKGZhbHNlLCBmYWxzZSk7CiAJCX0KIAkJYm9vbGVhbiBoYXNBYnN0cmFjdE1ldGhvZHMgPSBmYWxzZTsKKwkJY291bnQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZENvdW50OyBpKyspIHsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID1jb252ZXJ0KG1ldGhvZHNbaV0sIHR5cGUsIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJCWJvb2xlYW4gaXNBYnN0cmFjdDsKLQkJCWlmICgoaXNBYnN0cmFjdCA9IG1ldGhvZC5pc0Fic3RyYWN0KCkpIHx8IGlzSW50ZXJmYWNlKSB7IC8vIGZpeC11cCBmbGFnIAotCQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBjb252ZXJ0KG1ldGhvZHNbaV0sIHR5cGUpOworCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7CisJCQkJYm9vbGVhbiBpc0Fic3RyYWN0OworCQkJCWlmICgoaXNBYnN0cmFjdCA9IG1ldGhvZC5pc0Fic3RyYWN0KCkpIHx8IGlzSW50ZXJmYWNlKSB7IC8vIGZpeC11cCBmbGFnCisJCQkJCW1ldGhvZC5tb2RpZmllcnMgfD0gRXh0cmFDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OworCQkJCX0KKwkJCQlpZiAoaXNBYnN0cmFjdCkgeworCQkJCQloYXNBYnN0cmFjdE1ldGhvZHMgPSB0cnVlOworCQkJCX0KKwkJCQl0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tuZWVkZWRDb3VudCArIChjb3VudCsrKV0gPSBtZXRob2Q7CiAJCQl9Ci0JCQlpZiAoaXNBYnN0cmFjdCkgewotCQkJCWhhc0Fic3RyYWN0TWV0aG9kcyA9IHRydWU7Ci0JCQl9Ci0JCQl0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tuZWVkZWRDb3VudCArIGldID0gbWV0aG9kOworCQl9CisJCWlmIChjb3VudCAhPSBtZXRob2RDb3VudCkgeworCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlRGVjbGFyYXRpb24ubWV0aG9kcywgMCwgdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltjb3VudCArIG5lZWRlZENvdW50XSwgMCwgY291bnQgKyBuZWVkZWRDb3VudCk7CiAJCX0KIAkJaWYgKGhhc0Fic3RyYWN0TWV0aG9kcykgewogCQkJdHlwZURlY2xhcmF0aW9uLmJpdHMgfD0gQVNUTm9kZS5IYXNBYnN0cmFjdE1ldGhvZHM7CiAJCX0KIAkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKIAl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVUeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlKSB7Ci0JCS8qIGNvdW50IGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovCi0JCWludCBtYXggPSB0eXBlLmxlbmd0aDsKLQkJaW50IGRpbVN0YXJ0ID0gbWF4OwotCQlpbnQgZGltID0gMDsKLQkJaW50IGlkZW50Q291bnQgPSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHR5cGVbaV0pIHsKLQkJCQljYXNlICdbJyA6Ci0JCQkJCWlmIChkaW0gPT0gMCkKLQkJCQkJCWRpbVN0YXJ0ID0gaTsKLQkJCQkJZGltKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJy4nIDoKLQkJCQkJaWRlbnRDb3VudCsrOwotCQkJCQlicmVhazsKLQkJCX0KKworCXByaXZhdGUgc3RhdGljIGNoYXJbXVtdIHN0cmluZ0FycmF5VG9DaGFyQXJyYXkoU3RyaW5nW10gc3RyaW5ncykgeworCQlpZiAoc3RyaW5ncyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCQlpbnQgbGVuZ3RoID0gc3RyaW5ncy5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCisJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyIFtsZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXJlc3VsdFtpXSA9IHN0cmluZ3NbaV0udG9DaGFyQXJyYXkoKTsKIAkJfQotCQkvKiByZWJ1aWxkIGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovCi0JCWlmIChpZGVudENvdW50ID09IDEpIHsgLy8gc2ltcGxlIHR5cGUgcmVmZXJlbmNlCi0JCQlpZiAoZGltID09IDApIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UodHlwZSwgMCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoYXJbXSBpZGVudGlmaWVyID0gbmV3IGNoYXJbZGltU3RhcnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZSwgMCwgaWRlbnRpZmllciwgMCwgZGltU3RhcnQpOwotCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXIsIGRpbSwgMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZQotCQkJY2hhcltdW10gaWRlbnRpZmllcnMgPQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlLCAwLCBkaW1TdGFydCk7Ci0JCQlpZiAoZGltID09IDApIHsKLQkJCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIG5ldyBsb25nW2lkZW50aWZpZXJzLmxlbmd0aF0pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgZGltLCBuZXcgbG9uZ1tpZGVudGlmaWVycy5sZW5ndGhdKTsKLQkJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgVHlwZVJlZmVyZW5jZSBjcmVhdGVUeXBlUmVmZXJlbmNlKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CisJCVR5cGVSZWZlcmVuY2UgcmVzdWx0ID0gY3JlYXRlVHlwZVJlZmVyZW5jZSh0eXBlU2lnbmF0dXJlLCAwLCAwKTsKKwkJaWYgKHRoaXMudHlwZU5hbWVzICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQkJdGhpcy50eXBlTmFtZXMuYWRkKCgoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSlyZXN1bHQpLnRva2Vucyk7CiAJCX0KKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCmluZGV4IGRlMzMyZmEuLjQ3NDA2NjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDYgKzE3LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CkBAIC03NSw3ICs3Niw3IEBACiAJCX0KIAkJaW50IGxlbmd0aCA9IGdldExlbmd0aCgpOwogCQlzeW5jaHJvbml6ZWQodGhpcy5sb2NrKSB7Ci0JCSAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSByZXR1cm47CisJCQlpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSByZXR1cm47CiAJCQltb3ZlQW5kUmVzaXplR2FwKGxlbmd0aCwgdGV4dC5sZW5ndGgpOwogCQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCAwLCB0aGlzLmNvbnRlbnRzLCBsZW5ndGgsIHRleHQubGVuZ3RoKTsKIAkJCXRoaXMuZ2FwU3RhcnQgKz0gdGV4dC5sZW5ndGg7CkBAIC0xNDQsNyArMTQ1LDcgQEAKICAqIEBzZWUgSUJ1ZmZlcgogICovCiBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgewotCWNoYXJbXSBjaGFycyA9IHRoaXMuZ2V0Q2hhcmFjdGVycygpOworCWNoYXJbXSBjaGFycyA9IGdldENoYXJhY3RlcnMoKTsKIAlpZiAoY2hhcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwogfQpAQCAtMjA4LDcgKzIwOSw3IEBACiB9CiAvKioKICAqIE1vdmVzIHRoZSBnYXAgdG8gbG9jYXRpb24gYW5kIGFkanVzdCBpdHMgc2l6ZSB0byB0aGUKLSAqIGFudGljaXBhdGVkIGNoYW5nZSBzaXplLiBUaGUgc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCAKKyAqIGFudGljaXBhdGVkIGNoYW5nZSBzaXplLiBUaGUgc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZAogICogcmFuZ2Ugb2YgdGhlIGdhcCB0aGF0IHdpbGwgYmUgZmlsbGVkIGFmdGVyIHRoZSBnYXAgaGFzIGJlZW4gbW92ZWQuCiAgKiBUaHVzIHRoZSBnYXAgaXMgcmVzaXplZCB0byBhY3R1YWwgc2l6ZSArIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQKICAqIG1vdmVkIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi4KQEAgLTI2NSw3ICsyNjYsNyBAQAogCQkJCQlsaXN0ZW5lci5idWZmZXJDaGFuZ2VkKGV2ZW50KTsKIAkJCQl9CiAJCQl9KTsKLQkJCQorCiAJCX0KIAl9CiB9CkBAIC0yODIsMTUgKzI4MywxNSBAQAogfQogLyoqCiAgKiBSZXBsYWNlcyA8Y29kZT5sZW5ndGg8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgZnJvbSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gd2l0aCA8Y29kZT50ZXh0PGNvZGU+LgotICogQWZ0ZXIgdGhhdCBvcGVyYXRpb24sIHRoZSBnYXAgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIAorICogQWZ0ZXIgdGhhdCBvcGVyYXRpb24sIHRoZSBnYXAgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlCiAgKiBpbnNlcnRlZCA8Y29kZT50ZXh0PC9jb2RlPi4KICAqLwogcHVibGljIHZvaWQgcmVwbGFjZShpbnQgcG9zaXRpb24sIGludCBsZW5ndGgsIGNoYXJbXSB0ZXh0KSB7CiAJaWYgKCFpc1JlYWRPbmx5KCkpIHsKIAkJaW50IHRleHRMZW5ndGggPSB0ZXh0ID09IG51bGwgPyAwIDogdGV4dC5sZW5ndGg7CiAJCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCSAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSByZXR1cm47Ci0JCSAgICAKKwkJCWlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHJldHVybjsKKwogCQkJLy8gbW92ZSBnYXAKIAkJCW1vdmVBbmRSZXNpemVHYXAocG9zaXRpb24gKyBsZW5ndGgsIHRleHRMZW5ndGggLSBsZW5ndGgpOwogCkBAIC0zMTgsNyArMzE5LDcgQEAKIH0KIC8qKgogICogUmVwbGFjZXMgPGNvZGU+bGVuZ3RoPC9jb2RlPiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gPGNvZGU+cG9zaXRpb248L2NvZGU+IHdpdGggPGNvZGU+dGV4dDxjb2RlPi4KLSAqIEFmdGVyIHRoYXQgb3BlcmF0aW9uLCB0aGUgZ2FwIGlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSAKKyAqIEFmdGVyIHRoYXQgb3BlcmF0aW9uLCB0aGUgZ2FwIGlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZQogICogaW5zZXJ0ZWQgPGNvZGU+dGV4dDwvY29kZT4uCiAgKi8KIHB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvc2l0aW9uLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewpAQCAtMzI5LDE2ICszMzAsMTYgQEAKICAqLwogcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAotCS8vIGRldGVybWluZSBpZiBzYXZpbmcgaXMgcmVxdWlyZWQgCisJLy8gZGV0ZXJtaW5lIGlmIHNhdmluZyBpcyByZXF1aXJlZAogCWlmIChpc1JlYWRPbmx5KCkgfHwgdGhpcy5maWxlID09IG51bGwpIHsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIWhhc1Vuc2F2ZWRDaGFuZ2VzKCkpCiAJCXJldHVybjsKLQkJCisKIAkvLyB1c2UgYSBwbGF0Zm9ybSBvcGVyYXRpb24gdG8gdXBkYXRlIHRoZSByZXNvdXJjZSBjb250ZW50cwogCXRyeSB7Ci0JCVN0cmluZyBzdHJpbmdDb250ZW50cyA9IHRoaXMuZ2V0Q29udGVudHMoKTsKKwkJU3RyaW5nIHN0cmluZ0NvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKIAkJaWYgKHN0cmluZ0NvbnRlbnRzID09IG51bGwpIHJldHVybjsKIAogCQkvLyBHZXQgZW5jb2RpbmcKQEAgLTM0OSwxNiArMzUwLDI0IEBACiAJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CiAJCQkvLyB1c2Ugbm8gZW5jb2RpbmcKIAkJfQotCQkKKwogCQkvLyBDcmVhdGUgYnl0ZXMgYXJyYXkKLQkJYnl0ZVtdIGJ5dGVzID0gZW5jb2RpbmcgPT0gbnVsbCAKLQkJCT8gc3RyaW5nQ29udGVudHMuZ2V0Qnl0ZXMoKSAKKwkJYnl0ZVtdIGJ5dGVzID0gZW5jb2RpbmcgPT0gbnVsbAorCQkJPyBzdHJpbmdDb250ZW50cy5nZXRCeXRlcygpCiAJCQk6IHN0cmluZ0NvbnRlbnRzLmdldEJ5dGVzKGVuY29kaW5nKTsKIAogCQkvLyBTcGVjaWFsIGNhc2UgZm9yIFVURi04IEJPTSBmaWxlcwogCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTA1NzYKIAkJaWYgKGVuY29kaW5nICE9IG51bGwgJiYgZW5jb2RpbmcuZXF1YWxzKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuVVRGXzgpKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5maWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOworCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKwkJCXRyeSB7CisJCQkJZGVzY3JpcHRpb24gPSB0aGlzLmZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gSVJlc291cmNlU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCkKKwkJCQkJdGhyb3cgZTsKKwkJCQkvLyBmaWxlIG5vIGxvbmdlciBleGlzdCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQzMDcgKQorCQkJCWRlc2NyaXB0aW9uID0gbnVsbDsKKwkJCX0KIAkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSAhPSBudWxsKSB7CiAJCQkJaW50IGJvbUxlbmd0aD0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzgubGVuZ3RoOwogCQkJCWJ5dGVbXSBieXRlc1dpdGhCT009IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIGJvbUxlbmd0aF07CkBAIC0zNjcsMTcgKzM3NiwxNyBAQAogCQkJCWJ5dGVzPSBieXRlc1dpdGhCT007CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gU2V0IGZpbGUgY29udGVudHMKIAkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKIAkJaWYgKHRoaXMuZmlsZS5leGlzdHMoKSkgewogCQkJdGhpcy5maWxlLnNldENvbnRlbnRzKAotCQkJCXN0cmVhbSwgCi0JCQkJZm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCisJCQkJc3RyZWFtLAorCQkJCWZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksCiAJCQkJbnVsbCk7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmZpbGUuY3JlYXRlKHN0cmVhbSwgZm9yY2UsIG51bGwpOwotCQl9CQorCQl9CiAJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKQEAgLTM5MSw3ICs0MDAsNyBAQAogICogQHNlZSBJQnVmZmVyCiAgKi8KIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKGNoYXJbXSBuZXdDb250ZW50cykgewotCS8vIGFsbG93IHNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgaW5pdGlhbGl6YXRpb24gCisJLy8gYWxsb3cgc3BlY2lhbCBjYXNlIGZvciBmaXJzdCBpbml0aWFsaXphdGlvbgogCS8vIGFmdGVyIGNyZWF0aW9uIGJ5IGJ1ZmZlciBmYWN0b3J5CiAJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkgewogCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewpAQCAtNDAwLDIwICs0MDksMjAgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCQorCiAJaWYgKCFpc1JlYWRPbmx5KCkpIHsKIAkJU3RyaW5nIHN0cmluZyA9IG51bGw7CiAJCWlmIChuZXdDb250ZW50cyAhPSBudWxsKSB7CiAJCQlzdHJpbmcgPSBuZXcgU3RyaW5nKG5ld0NvbnRlbnRzKTsKIAkJfQogCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkgcmV0dXJuOyAvLyBpZ25vcmUgaWYgYnVmZmVyIGlzIGNsb3NlZCAoYXMgcGVyIHNwZWMpCisJCQlpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSByZXR1cm47IC8vIGlnbm9yZSBpZiBidWZmZXIgaXMgY2xvc2VkIChhcyBwZXIgc3BlYykKIAkJCXRoaXMuY29udGVudHMgPSBuZXdDb250ZW50czsKIAkJCXRoaXMuZmxhZ3MgfD0gRl9IQVNfVU5TQVZFRF9DSEFOR0VTOwogCQkJdGhpcy5nYXBTdGFydCA9IC0xOwogCQkJdGhpcy5nYXBFbmQgPSAtMTsKIAkJfQotCQlCdWZmZXJDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgQnVmZmVyQ2hhbmdlZEV2ZW50KHRoaXMsIDAsIHRoaXMuZ2V0TGVuZ3RoKCksIHN0cmluZyk7CisJCUJ1ZmZlckNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBCdWZmZXJDaGFuZ2VkRXZlbnQodGhpcywgMCwgZ2V0TGVuZ3RoKCksIHN0cmluZyk7CiAJCW5vdGlmeUNoYW5nZWQoZXZlbnQpOwogCX0KIH0KQEAgLTQzNiwxMSArNDQ1LDExIEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJYnVmZmVyLmFwcGVuZCgiT3duZXI6ICIgKyAoKEphdmFFbGVtZW50KXRoaXMub3duZXIpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQoIlxuSGFzIHVuc2F2ZWQgY2hhbmdlczogIiArIHRoaXMuaGFzVW5zYXZlZENoYW5nZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQlidWZmZXIuYXBwZW5kKCJcbklzIHJlYWRvbmx5OiAiICsgdGhpcy5pc1JlYWRPbmx5KCkpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZCgiXG5JcyBjbG9zZWQ6ICIgKyB0aGlzLmlzQ2xvc2VkKCkpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCgiXG5IYXMgdW5zYXZlZCBjaGFuZ2VzOiAiICsgaGFzVW5zYXZlZENoYW5nZXMoKSk7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCJcbklzIHJlYWRvbmx5OiAiICsgaXNSZWFkT25seSgpKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIlxuSXMgY2xvc2VkOiAiICsgaXNDbG9zZWQoKSk7IC8vJE5PTi1OTFMtMSQKIAlidWZmZXIuYXBwZW5kKCJcbkNvbnRlbnRzOlxuIik7IC8vJE5PTi1OTFMtMSQKLQljaGFyW10gY2hhckNvbnRlbnRzID0gdGhpcy5nZXRDaGFyYWN0ZXJzKCk7CisJY2hhcltdIGNoYXJDb250ZW50cyA9IGdldENoYXJhY3RlcnMoKTsKIAlpZiAoY2hhckNvbnRlbnRzID09IG51bGwpIHsKIAkJYnVmZmVyLmFwcGVuZCgiPG51bGw+Iik7IC8vJE5PTi1OTFMtMSQKIAl9IGVsc2UgewpAQCAtNDQ4LDcgKzQ1Nyw3IEBACiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWNoYXIgYyA9IGNoYXJDb250ZW50c1tpXTsKIAkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xuJzogCisJCQkJY2FzZSAnXG4nOgogCQkJCQlidWZmZXIuYXBwZW5kKCJcXG5cbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgJ1xyJzoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlckNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJDYWNoZS5qYXZhCmluZGV4IDNlMzUzMzkuLjBmMjIyMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlckNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyQ2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw3ICsxOSw3IEBACiAgKiBBbiBMUlUgY2FjaGUgb2YgPGNvZGU+SUJ1ZmZlcnM8L2NvZGU+LgogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyQ2FjaGUgZXh0ZW5kcyBPdmVyZmxvd2luZ0xSVUNhY2hlIHsKLQkKKwogCXByaXZhdGUgVGhyZWFkTG9jYWwgYnVmZmVyc1RvQ2xvc2UgPSBuZXcgVGhyZWFkTG9jYWwoKTsKIC8qKgogICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgY2FjaGUgb2YgdGhlIGdpdmVuIHNpemUuCkBAIC00MSw4ICs0MSw4IEBACiAgKiBieSBjbG9zaW5nIHRoZSBidWZmZXIuCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIGNsb3NlKExSVUNhY2hlRW50cnkgZW50cnkpIHsKLQlJQnVmZmVyIGJ1ZmZlcj0gKElCdWZmZXIpIGVudHJ5Ll9mVmFsdWU7Ci0JCisJSUJ1ZmZlciBidWZmZXI9IChJQnVmZmVyKSBlbnRyeS52YWx1ZTsKKwogCS8vIHByZXZlbnQgYnVmZmVyIHRoYXQgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgb3Igd29ya2luZyBjb3B5IGJ1ZmZlciB0byBiZSByZW1vdmVkCiAJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zOTMxMQogCWlmICghKChPcGVuYWJsZSlidWZmZXIuZ2V0T3duZXIoKSkuY2FuQnVmZmVyQmVSZW1vdmVkRnJvbUNhY2hlKGJ1ZmZlcikpIHsKQEAgLTcwLDcgKzcwLDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNpZXZlci4KIAkgKi8KLQlwcm90ZWN0ZWQgTFJVQ2FjaGUgbmV3SW5zdGFuY2UoaW50IHNpemUsIGludCBvdmVyZmxvdykgewotCQlyZXR1cm4gbmV3IEJ1ZmZlckNhY2hlKHNpemUsIG92ZXJmbG93KTsKKwlwcm90ZWN0ZWQgTFJVQ2FjaGUgbmV3SW5zdGFuY2UoaW50IHNpemUsIGludCBuZXdPdmVyZmxvdykgeworCQlyZXR1cm4gbmV3IEJ1ZmZlckNhY2hlKHNpemUsIG5ld092ZXJmbG93KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJGYWN0b3J5V3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyRmFjdG9yeVdyYXBwZXIuamF2YQppbmRleCAwMzY2NzdmLi4yNTY2OTZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJGYWN0b3J5V3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlckZhY3RvcnlXcmFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsMTEgKzIyLDExIEBACiBwdWJsaWMgY2xhc3MgQnVmZmVyRmFjdG9yeVdyYXBwZXIgZXh0ZW5kcyBXb3JraW5nQ29weU93bmVyIHsKIAogCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyRmFjdG9yeSBmYWN0b3J5OwotCQkKKwogCXByaXZhdGUgQnVmZmVyRmFjdG9yeVdyYXBwZXIob3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSkgewogCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgV29ya2luZ0NvcHlPd25lciBjcmVhdGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSkgewogCQlyZXR1cm4gbmV3IEJ1ZmZlckZhY3RvcnlXcmFwcGVyKGZhY3RvcnkpOwogCX0KQEAgLTM3LDggKzM3LDggQEAKIAlwdWJsaWMgSUJ1ZmZlciBjcmVhdGVCdWZmZXIoSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewogCQlpZiAodGhpcy5mYWN0b3J5ID09IG51bGwpIHJldHVybiBzdXBlci5jcmVhdGVCdWZmZXIod29ya2luZ0NvcHkpOwogCQlyZXR1cm4gdGhpcy5mYWN0b3J5LmNyZWF0ZUJ1ZmZlcih3b3JraW5nQ29weSk7Ci0JfQkKLQkKKwl9CisKIAlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBCdWZmZXJGYWN0b3J5V3JhcHBlcikpIHJldHVybiBmYWxzZTsKIAkJQnVmZmVyRmFjdG9yeVdyYXBwZXIgb3RoZXIgPSAoQnVmZmVyRmFjdG9yeVdyYXBwZXIpb2JqOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyTWFuYWdlci5qYXZhCmluZGV4IDNiYmU4NjguLmExNjU4YTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlck1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNyArMTYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7CiAKIC8qKgpAQCAtMzMsNyArMzIsNyBAQAogCSAqIGluIHRoZSB0YWJsZSBpcyB0aGUgaWRlbnRpY2FsIGJ1ZmZlci4KIAkgKi8KIAlwcml2YXRlIEJ1ZmZlckNhY2hlIG9wZW5CdWZmZXJzID0gbmV3IEJ1ZmZlckNhY2hlKDYwKTsKLQkKKwogCS8qKgogCSAqIEBkZXByZWNhdGVkCiAJICovCkBAIC01NSw3ICs1NCw3IEBACiAJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGJ1ZmZlciBmb3IgIiArIG93bmVyKTsgLy8kTk9OLU5MUy0xJAogCX0KIAlzeW5jaHJvbml6ZWQgKHRoaXMub3BlbkJ1ZmZlcnMpIHsKLQkJdGhpcy5vcGVuQnVmZmVycy5wdXQoYnVmZmVyLmdldE93bmVyKCksIGJ1ZmZlcik7CQorCQl0aGlzLm9wZW5CdWZmZXJzLnB1dChidWZmZXIuZ2V0T3duZXIoKSwgYnVmZmVyKTsKIAl9CiAJLy8gY2xvc2UgYnVmZmVycyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBpZiBzcGFjZSB3YXMgbmVlZGVkCiAJdGhpcy5vcGVuQnVmZmVycy5jbG9zZUJ1ZmZlcnMoKTsKQEAgLTY0LDIxICs2MywyMSBAQAogCX0KIH0KIHB1YmxpYyBzdGF0aWMgSUJ1ZmZlciBjcmVhdGVCdWZmZXIoSU9wZW5hYmxlIG93bmVyKSB7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSUphdmFFbGVtZW50KW93bmVyOwotCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKLQlyZXR1cm4gCisJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChKYXZhRWxlbWVudCkgb3duZXI7CisJSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5yZXNvdXJjZSgpOworCXJldHVybgogCQluZXcgQnVmZmVyKAotCQkJcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSA/IChJRmlsZSlyZXNvdXJjZSA6IG51bGwsIAotCQkJb3duZXIsIAorCQkJcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSA/IChJRmlsZSlyZXNvdXJjZSA6IG51bGwsCisJCQlvd25lciwKIAkJCWVsZW1lbnQuaXNSZWFkT25seSgpKTsKIH0KIHB1YmxpYyBzdGF0aWMgSUJ1ZmZlciBjcmVhdGVOdWxsQnVmZmVyKElPcGVuYWJsZSBvd25lcikgewotCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gKElKYXZhRWxlbWVudClvd25lcjsKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7Ci0JcmV0dXJuIAorCUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSmF2YUVsZW1lbnQpIG93bmVyOworCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQucmVzb3VyY2UoKTsKKwlyZXR1cm4KIAkJbmV3IE51bGxCdWZmZXIoCi0JCQlyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlID8gKElGaWxlKXJlc291cmNlIDogbnVsbCwgCi0JCQlvd25lciwgCisJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlID8gKElGaWxlKXJlc291cmNlIDogbnVsbCwKKwkJCW93bmVyLAogCQkJZWxlbWVudC5pc1JlYWRPbmx5KCkpOwogfQogLyoqCkBAIC0xMDksNyArMTA4LDcgQEAKIH0KIC8qKgogICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgb3BlbiBidWZmZXJzLgotICogPHA+IAorICogPHA+CiAgKiBUaGUgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGFuc3dlcmVkIGlzIHRocmVhZCBzYWZlLgogICoKICAqIEBzZWUgT3ZlcmZsb3dpbmdMUlVDYWNoZQpAQCAtMTM4LDcgKzEzNyw3IEBACiAJCXRoaXMub3BlbkJ1ZmZlcnMucmVtb3ZlKGJ1ZmZlci5nZXRPd25lcigpKTsKIAl9CiAJLy8gY2xvc2UgYnVmZmVycyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSAoc2hvdWxkIGJlIG9ubHkgb25lKQotCXRoaXMub3BlbkJ1ZmZlcnMuY2xvc2VCdWZmZXJzKCk7CQorCXRoaXMub3BlbkJ1ZmZlcnMuY2xvc2VCdWZmZXJzKCk7CiAJaWYgKFZFUkJPU0UpIHsKIAkJU3lzdGVtLm91dC5wcmludGxuKCItPiBCdWZmZXIgY2FjaGUgZmlsbGluZyByYXRpbyA9ICIgKyBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKS5mb3JtYXQodGhpcy5vcGVuQnVmZmVycy5maWxsaW5nUmF0aW8oKSkgKyAiJSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQuamF2YQppbmRleCBlZjBlYTcxLi5iMWFjNWUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DYW5jZWxhYmxlTmFtZUVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDEyICsxOSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CiAKIAotcHVibGljIGNsYXNzIENhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQgZXh0ZW5kcyBTZWFyY2hhYmxlRW52aXJvbm1lbnQgewotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CitwdWJsaWMgY2xhc3MgQ2FuY2VsYWJsZU5hbWVFbnZpcm9ubWVudCBleHRlbmRzIFNlYXJjaGFibGVFbnZpcm9ubWVudCBpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnRXaXRoUHJvZ3Jlc3MgeworCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwogCiAJcHVibGljIENhbmNlbGFibGVOYW1lRW52aXJvbm1lbnQoSmF2YVByb2plY3QgcHJvamVjdCwgV29ya2luZ0NvcHlPd25lciBvd25lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJc3VwZXIocHJvamVjdCwgb3duZXIpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCQlzZXRNb25pdG9yKG1vbml0b3IpOwogCX0KIAogCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKCkgewpAQCAtNTAsOCArNTAsMTIgQEAKIAkJcmV0dXJuIHN1cGVyLmZpbmRUeXBlKGNvbXBvdW5kVHlwZU5hbWUpOwogCX0KIAotCXB1YmxpYyB2b2lkIGZpbmRUeXBlcyhjaGFyW10gcHJlZml4LCBib29sZWFuIGZpbmRNZW1iZXJzLCBib29sZWFuIGNhbWVsQ2FzZU1hdGNoLCBpbnQgc2VhcmNoRm9yLCBJU2VhcmNoUmVxdWVzdG9yIHN0b3JhZ2UpIHsKKwlwdWJsaWMgdm9pZCBmaW5kVHlwZXMoY2hhcltdIHByZWZpeCwgYm9vbGVhbiBmaW5kTWVtYmVycywgYm9vbGVhbiBjYW1lbENhc2VNYXRjaCwgaW50IHNlYXJjaEZvciwgSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCQljaGVja0NhbmNlbGVkKCk7Ci0JCXN1cGVyLmZpbmRUeXBlcyhwcmVmaXgsIGZpbmRNZW1iZXJzLCBjYW1lbENhc2VNYXRjaCwgc2VhcmNoRm9yLCBzdG9yYWdlKTsKKwkJc3VwZXIuZmluZFR5cGVzKHByZWZpeCwgZmluZE1lbWJlcnMsIGNhbWVsQ2FzZU1hdGNoLCBzZWFyY2hGb3IsIHN0b3JhZ2UsIHByb2dyZXNzTW9uaXRvcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2FuY2VsYWJsZVByb2JsZW1GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkuamF2YQppbmRleCA4MzU5ZGUwLi41NDNmOWJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DYW5jZWxhYmxlUHJvYmxlbUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw4ICsyNiwxNCBAQAogCX0KIAogCXB1YmxpYyBDYXRlZ29yaXplZFByb2JsZW0gY3JlYXRlUHJvYmxlbShjaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwgaW50IHByb2JsZW1JZCwgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywgaW50IHNldmVyaXR5LCBpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikgewotCQlpZiAodGhpcy5tb25pdG9yICE9IG51bGwgJiYgdGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkgCisJCWlmICh0aGlzLm1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLm1vbml0b3IuaXNDYW5jZWxlZCgpKQogCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZS8qc2lsZW50Ki8sIG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpKTsKIAkJcmV0dXJuIHN1cGVyLmNyZWF0ZVByb2JsZW0ob3JpZ2luYXRpbmdGaWxlTmFtZSwgcHJvYmxlbUlkLCBwcm9ibGVtQXJndW1lbnRzLCBtZXNzYWdlQXJndW1lbnRzLCBzZXZlcml0eSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcik7CiAJfQorCisJcHVibGljIENhdGVnb3JpemVkUHJvYmxlbSBjcmVhdGVQcm9ibGVtKGNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLCBpbnQgcHJvYmxlbUlkLCBTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLCBpbnQgZWxhYm9yYXRpb25JZCwgU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywgaW50IHNldmVyaXR5LCBpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikgeworCQlpZiAodGhpcy5tb25pdG9yICE9IG51bGwgJiYgdGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHRydWUvKnNpbGVudCovLCBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKSk7CisJCXJldHVybiBzdXBlci5jcmVhdGVQcm9ibGVtKG9yaWdpbmF0aW5nRmlsZU5hbWUsIHByb2JsZW1JZCwgcHJvYmxlbUFyZ3VtZW50cywgZWxhYm9yYXRpb25JZCwgbWVzc2FnZUFyZ3VtZW50cywgc2V2ZXJpdHksIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NoYW5nZUNsYXNzcGF0aE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2hhbmdlQ2xhc3NwYXRoT3BlcmF0aW9uLmphdmEKaW5kZXggYmVmODdlNC4uOWU4YjMyOSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2hhbmdlQ2xhc3NwYXRoT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2hhbmdlQ2xhc3NwYXRoT3BlcmF0aW9uLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMSw3ICszMSw3IEBACiAJCS8vIGNoYW5naW5nIHRoZSBjbGFzc3BhdGggY2FuIG1vZGlmeSByb290cwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKgogCSAqIFRoZSByZXNvbHZlZCBjbGFzc3BhdGggb2YgdGhlIGdpdmVuIHByb2plY3QgbWF5IGhhdmUgY2hhbmdlZDoKIAkgKiAtIGdlbmVyYXRlIGEgZGVsdGEKQEAgLTM5LDMyICszOSw0MiBAQAogCSAqIC0gdXBkYXRlIHByb2plY3QgcmVmZXJlbmNlcwogCSAqIC0gY3JlYXRlIHJlc29sdmVkIGNsYXNzcGF0aCBtYXJrZXJzCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgY2xhc3NwYXRoQ2hhbmdlZChKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJRGVsdGFQcm9jZXNzaW5nU3RhdGUgc3RhdGUgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVN0YXRlOwotCQlEZWx0YVByb2Nlc3NvciBkZWx0YVByb2Nlc3NvciA9IHN0YXRlLmdldERlbHRhUHJvY2Vzc29yKCk7Ci0JCUNsYXNzcGF0aENoYW5nZSBjaGFuZ2UgPSAoQ2xhc3NwYXRoQ2hhbmdlKSBkZWx0YVByb2Nlc3Nvci5jbGFzc3BhdGhDaGFuZ2VzLmdldChwcm9qZWN0LmdldFByb2plY3QoKSk7CisJcHJvdGVjdGVkIHZvaWQgY2xhc3NwYXRoQ2hhbmdlZChDbGFzc3BhdGhDaGFuZ2UgY2hhbmdlLCBib29sZWFuIHJlZnJlc2hFeHRlcm5hbEZvbGRlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCS8vIHJlc2V0IHRoZSBwcm9qZWN0J3MgY2FjaGVzIGVhcmx5IHNpbmNlIHNvbWUgY2xpZW50cyByZWx5IG9uIHRoZSBwcm9qZWN0J3MgY2FjaGVzIGJlaW5nIHVwLXRvLWRhdGUgd2hlbiBydW4gaW5zaWRlIGFuIElXb3Jrc3BhY2VSdW5uYWJsZQorCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI3NjkjYzUgKQorCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gY2hhbmdlLnByb2plY3Q7CisJCXByb2plY3QucmVzZXRDYWNoZXMoKTsKKwogCQlpZiAodGhpcy5jYW5DaGFuZ2VSZXNvdXJjZXMpIHsKIAkJCS8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc5MjIKIAkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKCkgJiYgIVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkgewogCQkJCW5ldyBDbGFzc3BhdGhWYWxpZGF0aW9uKHByb2plY3QpLnZhbGlkYXRlKCk7CiAJCQl9Ci0JCQkJCi0JCQkvLyBkZWx0YSwgaW5kZXhpbmcgYW5kIGNsYXNzcGF0aCBtYXJrZXJzIGFyZSBnb2luZyB0byBiZSBjcmVhdGVkIGJ5IHRoZSBkZWx0YSBwcm9jZXNzb3IgCi0JCQkvLyB3aGlsZSBoYW5kbGluZyB0aGUgLmNsYXNzcGF0aCBmaWxlIGNoYW5nZQorCisJCQkvLyBkZWx0YSwgaW5kZXhpbmcgYW5kIGNsYXNzcGF0aCBtYXJrZXJzIGFyZSBnb2luZyB0byBiZSBjcmVhdGVkIGJ5IHRoZSBkZWx0YSBwcm9jZXNzb3IKKwkJCS8vIHdoaWxlIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBjaGFuZ2UgKGVpdGhlciAuY2xhc3NwYXRoIGNoYW5nZSwgb3IgcHJvamVjdCB0b3VjaGVkKQogCiAJCQkvLyBob3dldmVyIGVuc3VyZSBwcm9qZWN0IHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQKIAkJCS8vIHNpbmNlIHNvbWUgY2xpZW50cyByZWx5IG9uIHRoZSBwcm9qZWN0IHJlZmVyZW5jZXMgd2hlbiBydW4gaW5zaWRlIGFuIElXb3Jrc3BhY2VSdW5uYWJsZQogCQkJbmV3IFByb2plY3RSZWZlcmVuY2VDaGFuZ2UocHJvamVjdCwgY2hhbmdlLm9sZFJlc29sdmVkQ2xhc3NwYXRoKS51cGRhdGVQcm9qZWN0UmVmZXJlbmNlc0lmTmVjZXNzYXJ5KCk7CisKKwkJCS8vIGFuZCBlbnN1cmUgdGhhdCBleHRlcm5hbCBmb2xkZXJzIGFyZSB1cGRhdGVkIGFzIHdlbGwKKwkJCW5ldyBFeHRlcm5hbEZvbGRlckNoYW5nZShwcm9qZWN0LCBjaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGgpLnVwZGF0ZUV4dGVybmFsRm9sZGVyc0lmTmVjZXNzYXJ5KHJlZnJlc2hFeHRlcm5hbEZvbGRlciwgbnVsbCk7CisKIAkJfSBlbHNlIHsKKwkJCURlbHRhUHJvY2Vzc2luZ1N0YXRlIHN0YXRlID0gSmF2YU1vZGVsTWFuYWdlci5nZXREZWx0YVN0YXRlKCk7CiAJCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoZ2V0SmF2YU1vZGVsKCkpOwotCQkJaW50IHJlc3VsdCA9IGNoYW5nZS5nZW5lcmF0ZURlbHRhKGRlbHRhKTsKKwkJCWludCByZXN1bHQgPSBjaGFuZ2UuZ2VuZXJhdGVEZWx0YShkZWx0YSwgdHJ1ZS8qYWRkIGNsYXNzcGF0aCBjaGFuZ2UqLyk7CiAJCQlpZiAoKHJlc3VsdCAmIENsYXNzcGF0aENoYW5nZS5IQVNfREVMVEEpICE9IDApIHsKIAkJCQkvLyBjcmVhdGUgZGVsdGEKIAkJCQlhZGREZWx0YShkZWx0YSk7Ci0JCQkJCisKKwkJCQkvLyBuZWVkIHRvIHJlY29tcHV0ZSByb290IGluZm9zCisJCQkJc3RhdGUucm9vdHNBcmVTdGFsZSA9IHRydWU7CisKIAkJCQkvLyBlbnN1cmUgaW5kZXhlcyBhcmUgdXBkYXRlZAogCQkJCWNoYW5nZS5yZXF1ZXN0SW5kZXhpbmcoKTsKLQkJCQkKKwogCQkJCS8vIGVuc3VyZSBjbGFzc3BhdGggaXMgdmFsaWRhdGVkIG9uIG5leHQgYnVpbGQKIAkJCQlzdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKHByb2plY3QpOwogCQkJfQpAQCAtNzIsMTMgKzgyLDE3IEBACiAJCQkJLy8gZW5zdXJlIHByb2plY3QgcmVmZXJlbmNlcyBhcmUgdXBkYXRlZCBvbiBuZXh0IGJ1aWxkCiAJCQkJc3RhdGUuYWRkUHJvamVjdFJlZmVyZW5jZUNoYW5nZShwcm9qZWN0LCBjaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGgpOwogCQkJfQorCQkJaWYgKChyZXN1bHQgJiBDbGFzc3BhdGhDaGFuZ2UuSEFTX0xJQlJBUllfQ0hBTkdFKSAhPSAwKSB7CisJCQkJLy8gZW5zdXJlIGV4dGVybmFsIGZvbGRlcnMgYXJlIHVwZGF0ZWQgb24gbmV4dCBidWlsZAorCQkJCXN0YXRlLmFkZEV4dGVybmFsRm9sZGVyQ2hhbmdlKHByb2plY3QsIGNoYW5nZS5vbGRSZXNvbHZlZENsYXNzcGF0aCk7CisJCQl9CiAJCX0KIAl9CiAKIAlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewogCQlyZXR1cm4gbnVsbDsgLy8gbm8gbG9jayB0YWtlbiB3aGlsZSBjaGFuZ2luZyBjbGFzc3BhdGgKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewogCQlyZXR1cm4gIXRoaXMuY2FuQ2hhbmdlUmVzb3VyY2VzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEKaW5kZXggOTc2ZTdlZS4uMDgzMjQyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CkBAIC00Miw3ICs0Myw3IEBACiAKIAlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CiAJcHJvdGVjdGVkIEJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IG51bGw7Ci0JCisKIC8qCiAgKiBDcmVhdGVzIGEgaGFuZGxlIHRvIGEgY2xhc3MgZmlsZS4KICAqLwpAQCAtNjQsNyArNjUsNyBAQAogCiAJCUJlY29tZVdvcmtpbmdDb3B5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBCZWNvbWVXb3JraW5nQ29weU9wZXJhdGlvbih3b3JraW5nQ29weSwgcHJvYmxlbVJlcXVlc3Rvcik7CiAJCW9wZXJhdGlvbi5ydW5PcGVyYXRpb24obW9uaXRvcik7Ci0JCQorCiAJCXJldHVybiB3b3JraW5nQ29weTsKIAl9CiAJcmV0dXJuIHBlcldvcmtpbmdDb3B5SW5mby53b3JraW5nQ29weTsKQEAgLTc0LDE2ICs3NSwxMSBAQAogICogQ3JlYXRlcyB0aGUgY2hpbGRyZW4gZWxlbWVudHMgZm9yIHRoaXMgY2xhc3MgZmlsZSBhZGRpbmcgdGhlIHJlc3VsdGluZwogICogbmV3IGhhbmRsZXMgYW5kIGluZm8gb2JqZWN0cyB0byB0aGUgbmV3RWxlbWVudHMgdGFibGUuIFJldHVybnMgdHJ1ZQogICogaWYgc3VjY2Vzc2Z1bCwgb3IgZmFsc2UgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgcGFyc2luZyB0aGUgY2xhc3MgZmlsZS4KLSAqIAorICoKICAqIEBzZWUgT3BlbmFibGUKICAqIEBzZWUgU2lnbmF0dXJlCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3RydWN0dXJlKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSwgTWFwIG5ld0VsZW1lbnRzLCBJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvLyBjaGVjayB3aGV0aGVyIHRoZSBjbGFzcyBmaWxlIGNhbiBiZSBvcGVuZWQKLQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlQ2xhc3NGaWxlKCk7Ci0JaWYgKCFzdGF0dXMuaXNPSygpKSB0aHJvdyBuZXdKYXZhTW9kZWxFeGNlcHRpb24oc3RhdHVzKTsKLQlpZiAodW5kZXJseWluZ1Jlc291cmNlICE9IG51bGwgJiYgIXVuZGVybHlpbmdSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwotCiAJSUJpbmFyeVR5cGUgdHlwZUluZm8gPSBnZXRCaW5hcnlUeXBlSW5mbygoSUZpbGUpIHVuZGVybHlpbmdSZXNvdXJjZSk7CiAJaWYgKHR5cGVJbmZvID09IG51bGwpIHsKIAkJLy8gVGhlIHN0cnVjdHVyZSBvZiBhIGNsYXNzIGZpbGUgaXMgdW5rbm93biBpZiBhIGNsYXNzIGZpbGUgZm9ybWF0IGVycm9ycyBvY2N1cnJlZApAQCAtOTYsMTAgKzkyLDEwIEBACiAJSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKIAlpbmZvLnNldENoaWxkcmVuKG5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZX0pOwogCW5ld0VsZW1lbnRzLnB1dCh0eXBlLCB0eXBlSW5mbyk7Ci0JCisKIAkvLyBSZWFkIGNoaWxkcmVuCiAJKChDbGFzc0ZpbGVJbmZvKSBpbmZvKS5yZWFkQmluYXJ5Q2hpbGRyZW4odGhpcywgKEhhc2hNYXApIG5ld0VsZW1lbnRzLCB0eXBlSW5mbyk7Ci0JCisKIAlyZXR1cm4gdHJ1ZTsKIH0KIC8qKgpAQCAtMTI2LDIxICsxMjIsMzIgQEAKIHB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJY29kZUNvbXBsZXRlKG9mZnNldCwgcmVxdWVzdG9yLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZKTsKIH0KLQorLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIENvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWNvZGVDb21wbGV0ZShvZmZzZXQsIHJlcXVlc3RvciwgRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSwgbW9uaXRvcik7Cit9CiAvKiAobm9uLUphdmFkb2MpCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25SZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXIpCiAgKi8KIHB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJY29kZUNvbXBsZXRlKG9mZnNldCwgcmVxdWVzdG9yLCBvd25lciwgbnVsbCk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25SZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXIsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwogCWlmIChzb3VyY2UgIT0gbnVsbCkgewogCQlCaW5hcnlUeXBlIHR5cGUgPSAoQmluYXJ5VHlwZSkgZ2V0VHlwZSgpOwotCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9IAorCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9CiAJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCi0JCQkJZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwgCisJCQkJZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwKIAkJCQludWxsLAogCQkJCXR5cGUuc291cmNlRmlsZU5hbWUoKElCaW5hcnlUeXBlKSB0eXBlLmdldEVsZW1lbnRJbmZvKCkpLAogCQkJCWdldEphdmFQcm9qZWN0KCkpOyAvLyB1c2UgcHJvamVjdCB0byByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIC5qYXZhIElGaWxlCi0JCWNvZGVDb21wbGV0ZShjdSwgY3UsIG9mZnNldCwgcmVxdWVzdG9yLCBvd25lcik7CisJCWNvZGVDb21wbGV0ZShjdSwgY3UsIG9mZnNldCwgcmVxdWVzdG9yLCBvd25lciwgbnVsbC8qZXh0ZW5kZWQgY29udGV4dCBpc24ndCBjb21wdXRlZCovLCBtb25pdG9yKTsKIAl9CiB9CiAKQEAgLTE3Niw5ICsxODMsNiBAQAogCUNsYXNzRmlsZSBvdGhlciA9IChDbGFzc0ZpbGUpIG87CiAJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkgJiYgdGhpcy5wYXJlbnQuZXF1YWxzKG90aGVyLnBhcmVudCk7CiB9Ci1wdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JcmV0dXJuIHN1cGVyLmV4aXN0cygpICYmIHZhbGlkYXRlQ2xhc3NGaWxlKCkuaXNPSygpOwotfQogcHVibGljIGJvb2xlYW4gZXhpc3RzVXNpbmdKYXJUeXBlQ2FjaGUoKSB7CiAJaWYgKGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5pc0FyY2hpdmUoKSkgewogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKQEAgLTIwMCw3ICsyMDQsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXRyeSB7Ci0JCQlpbmZvID0gZ2V0SmFyQmluYXJ5VHlwZUluZm8oKFBhY2thZ2VGcmFnbWVudCkgZ2V0UGFyZW50KCkpOworCQkJaW5mbyA9IGdldEphckJpbmFyeVR5cGVJbmZvKChQYWNrYWdlRnJhZ21lbnQpIGdldFBhcmVudCgpLCB0cnVlLypmdWxseSBpbml0aWFsaXplIHNvIGFzIHRvIG5vdCBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBieXRlIGFycmF5Ki8pOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGxlYXZlIGluZm8gbnVsbAogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0yNTEsNyArMjU1LDcgQEAKIAlyZXR1cm4gbnVsbDsKIH0KIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNoZWRKYXZhZG9jKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIHRoaXMuZ2V0VHlwZSgpLmdldEF0dGFjaGVkSmF2YWRvYyhtb25pdG9yKTsKKwlyZXR1cm4gZ2V0VHlwZSgpLmdldEF0dGFjaGVkSmF2YWRvYyhtb25pdG9yKTsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgPGNvZGU+Q2xhc3NGaWxlUmVhZGVyPC9jb2RlPnNwZWNpZmljIGZvciB0aGlzIElDbGFzc0ZpbGUsIGJhc2VkCkBAIC0yNjYsMTAgKzI3MCwxMyBAQAogICogb3Igd2hlbiB0aGlzIGNsYXNzIGZpbGUgaXMgbm90IHByZXNlbnQgaW4gdGhlIEpBUgogICovCiBwdWJsaWMgSUJpbmFyeVR5cGUgZ2V0QmluYXJ5VHlwZUluZm8oSUZpbGUgZmlsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIGdldEJpbmFyeVR5cGVJbmZvKGZpbGUsIHRydWUvKmZ1bGx5IGluaXRpYWxpemUgc28gYXMgdG8gbm90IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGJ5dGUgYXJyYXkqLyk7Cit9CitwdWJsaWMgSUJpbmFyeVR5cGUgZ2V0QmluYXJ5VHlwZUluZm8oSUZpbGUgZmlsZSwgYm9vbGVhbiBmdWxseUluaXRpYWxpemUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCUphdmFFbGVtZW50IHBrZyA9IChKYXZhRWxlbWVudCkgZ2V0UGFyZW50KCk7CiAJaWYgKHBrZyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudCkgewogCQl0cnkgewotCQkJSUJpbmFyeVR5cGUgaW5mbyA9IGdldEphckJpbmFyeVR5cGVJbmZvKChQYWNrYWdlRnJhZ21lbnQpIHBrZyk7CisJCQlJQmluYXJ5VHlwZSBpbmZvID0gZ2V0SmFyQmluYXJ5VHlwZUluZm8oKFBhY2thZ2VGcmFnbWVudCkgcGtnLCBmdWxseUluaXRpYWxpemUpOwogCQkJaWYgKGluZm8gPT0gbnVsbCkgewogCQkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKIAkJCX0KQEAgLTI5Miw3ICsyOTksNyBAQAogCX0gZWxzZSB7CiAJCWJ5dGVbXSBjb250ZW50cyA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KGZpbGUpOwogCQl0cnkgewotCQkJcmV0dXJuIG5ldyBDbGFzc0ZpbGVSZWFkZXIoY29udGVudHMsIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIHRydWUvKmZ1bGx5IGluaXRpYWxpemUgc28gYXMgdG8gbm90IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGJ5dGUgYXJyYXkqLyk7CisJCQlyZXR1cm4gbmV3IENsYXNzRmlsZVJlYWRlcihjb250ZW50cywgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSwgZnVsbHlJbml0aWFsaXplKTsKIAkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gY2ZlKSB7CiAJCQkvL3RoZSBzdHJ1Y3R1cmUgcmVtYWlucyB1bmtub3duCiAJCQlyZXR1cm4gbnVsbDsKQEAgLTMyNSwxMSArMzMyLDExIEBACiAJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jbG9zZVppcEZpbGUoemlwKTsKIAkJfQogCX0gZWxzZSB7Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGdldFJlc291cmNlKCk7CisJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlKCk7CiAJCXJldHVybiBVdGlsLmdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShmaWxlKTsKIAl9CiB9Ci1wcml2YXRlIElCaW5hcnlUeXBlIGdldEphckJpbmFyeVR5cGVJbmZvKFBhY2thZ2VGcmFnbWVudCBwa2cpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworcHJpdmF0ZSBJQmluYXJ5VHlwZSBnZXRKYXJCaW5hcnlUeXBlSW5mbyhQYWNrYWdlRnJhZ21lbnQgcGtnLCBib29sZWFuIGZ1bGx5SW5pdGlhbGl6ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJSmFyUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHBrZy5nZXRQYXJlbnQoKTsKIAlaaXBGaWxlIHppcCA9IG51bGw7CiAJdHJ5IHsKQEAgLTMzOSw3ICszNDYsNyBAQAogCQlpZiAoemUgIT0gbnVsbCkgewogCQkJYnl0ZSBjb250ZW50c1tdID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRaaXBFbnRyeUJ5dGVDb250ZW50KHplLCB6aXApOwogCQkJU3RyaW5nIGZpbGVOYW1lID0gcm9vdC5nZXRIYW5kbGVJZGVudGlmaWVyKCkgKyBJRGVwZW5kZW50LkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiArIGVudHJ5TmFtZTsKLQkJCXJldHVybiBuZXcgQ2xhc3NGaWxlUmVhZGVyKGNvbnRlbnRzLCBmaWxlTmFtZS50b0NoYXJBcnJheSgpLCB0cnVlLypmdWxseSBpbml0aWFsaXplIHNvIGFzIHRvIG5vdCBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBieXRlIGFycmF5Ki8pOworCQkJcmV0dXJuIG5ldyBDbGFzc0ZpbGVSZWFkZXIoY29udGVudHMsIGZpbGVOYW1lLnRvQ2hhckFycmF5KCksIGZ1bGx5SW5pdGlhbGl6ZSk7CiAJCX0KIAl9IGZpbmFsbHkgewogCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jbG9zZVppcEZpbGUoemlwKTsKQEAgLTM1MiwxMyArMzU5LDE3IEBACiAJCXJldHVybiBzdXBlci5nZXRCdWZmZXIoKTsKIAl9IGVsc2UgewogCQkvLyAuY2xhc3MgZmlsZSBub3Qgb24gY2xhc3NwYXRoLCBjcmVhdGUgYSBuZXcgYnVmZmVyIHRvIGJlIG5pY2UgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDE0NDQpCi0JCU9iamVjdCBpbmZvID0gKChDbGFzc0ZpbGUpIGdldENsYXNzRmlsZSgpKS5nZXRCaW5hcnlUeXBlSW5mbygoSUZpbGUpIGdldFJlc291cmNlKCkpOworCQlPYmplY3QgaW5mbyA9ICgoQ2xhc3NGaWxlKSBnZXRDbGFzc0ZpbGUoKSkuZ2V0QmluYXJ5VHlwZUluZm8oKElGaWxlKSByZXNvdXJjZSgpKTsKIAkJSUJ1ZmZlciBidWZmZXIgPSBvcGVuQnVmZmVyKG51bGwsIGluZm8pOwogCQlpZiAoYnVmZmVyICE9IG51bGwgJiYgIShidWZmZXIgaW5zdGFuY2VvZiBOdWxsQnVmZmVyKSkKIAkJCXJldHVybiBidWZmZXI7Ci0JCWlmIChzdGF0dXMuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9OT1RfT05fQ0xBU1NQQVRIKQotCQkJcmV0dXJuIG51bGw7IC8vIGRvbid0IHRocm93IGEgSmF2YU1vZGVsRXhjZXB0aW9uIHRvIGJlIGFibGUgdG8gb3BlbiAuY2xhc3MgZmlsZSBvdXRzaWRlIHRoZSBjbGFzc3BhdGggKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTA3KQotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKChJSmF2YU1vZGVsU3RhdHVzKSBzdGF0dXMpOworCQlzd2l0Y2ggKHN0YXR1cy5nZXRDb2RlKCkpIHsKKwkJY2FzZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfTk9UX09OX0NMQVNTUEFUSDogLy8gZG9uJ3QgdGhyb3cgYSBKYXZhTW9kZWxFeGNlcHRpb24gdG8gYmUgYWJsZSB0byBvcGVuIC5jbGFzcyBmaWxlIG91dHNpZGUgdGhlIGNsYXNzcGF0aCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg1MDcgKQorCQljYXNlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTOiAvLyBkb24ndCB0aHJvdyBhIEphdmFNb2RlbEV4Y2VwdGlvbiB0byBiZSBhYmxlIHRvIG9wZW4gLmNsYXNzIGZpbGUgaW4gcHJvaj09c3JjIGNhc2Ugd2l0aG91dCBzb3VyY2UgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxOTA0ICkKKwkJCXJldHVybiBudWxsOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbigoSUphdmFNb2RlbFN0YXR1cykgc3RhdHVzKTsKKwkJfQogCX0KIH0KIC8qKgpAQCAtNDEzLDI5ICs0MjQsMjkgQEAKIAlTb3VyY2VNYXBwZXIgbWFwcGVyID0gcm9vdC5nZXRTb3VyY2VNYXBwZXIoKTsKIAlpZiAobWFwcGVyID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsJCQorCX0gZWxzZSB7CiAJCWludCBpbmRleCA9IHRoaXMubmFtZS5pbmRleE9mKCckJyk7CiAJCWludCBwcmVmaXhMZW5ndGggPSBpbmRleCA8IDAgPyB0aGlzLm5hbWUubGVuZ3RoKCkgOiBpbmRleDsKLQkJCisKIAkJSVR5cGUgdHlwZSA9IG51bGw7CiAJCWludCBzdGFydCA9IC0xOwogCQlpbnQgZW5kID0gSW50ZWdlci5NQVhfVkFMVUU7CiAJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZnJhZ21lbnQuZ2V0Q2hpbGRyZW4oKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogCQkJU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkcmVuW2ldLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkKKwogCQkJaW50IGNoaWxkSW5kZXggPSBjaGlsZE5hbWUuaW5kZXhPZignJCcpOwogCQkJaW50IGNoaWxkUHJlZml4TGVuZ3RoID0gY2hpbGRJbmRleCA8IDAgPyBjaGlsZE5hbWUuaW5kZXhPZignLicpIDogY2hpbGRJbmRleDsKIAkJCWlmIChwcmVmaXhMZW5ndGggPT0gY2hpbGRQcmVmaXhMZW5ndGggJiYgdGhpcy5uYW1lLnJlZ2lvbk1hdGNoZXMoMCwgY2hpbGROYW1lLCAwLCBwcmVmaXhMZW5ndGgpKSB7CiAJCQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoSUNsYXNzRmlsZSkgY2hpbGRyZW5baV07Ci0JCQkJCisKIAkJCQkvLyBlbnN1cmUgdGhpcyBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAogCQkJCWNsYXNzRmlsZS5nZXRCdWZmZXIoKTsKLQkJCQkKKwogCQkJCVNvdXJjZVJhbmdlIHJhbmdlID0gbWFwcGVyLmdldFNvdXJjZVJhbmdlKGNsYXNzRmlsZS5nZXRUeXBlKCkpOwotCQkJCWlmIChyYW5nZSA9PSBTb3VyY2VNYXBwZXIuVU5LTk9XTl9SQU5HRSkgY29udGludWU7IAotCQkJCWludCBuZXdTdGFydCA9IHJhbmdlLm9mZnNldDsKLQkJCQlpbnQgbmV3RW5kID0gbmV3U3RhcnQgKyByYW5nZS5sZW5ndGggLSAxOworCQkJCWlmIChyYW5nZSA9PSBTb3VyY2VNYXBwZXIuVU5LTk9XTl9SQU5HRSkgY29udGludWU7CisJCQkJaW50IG5ld1N0YXJ0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7CisJCQkJaW50IG5ld0VuZCA9IG5ld1N0YXJ0ICsgcmFuZ2UuZ2V0TGVuZ3RoKCkgLSAxOwogCQkJCWlmKG5ld1N0YXJ0ID4gc3RhcnQgJiYgbmV3RW5kIDwgZW5kCiAJCQkJCQkmJiBuZXdTdGFydCA8PSBwb3NpdGlvbiAmJiBuZXdFbmQgPj0gcG9zaXRpb24pIHsKIAkJCQkJdHlwZSA9IGNsYXNzRmlsZS5nZXRUeXBlKCk7CkBAIC00OTIsMTMgKzUwMyw4IEBACiAvKgogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwotcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewotCQlyZXR1cm4gcm9vdC5nZXRSZXNvdXJjZSgpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoKElDb250YWluZXIpdGhpcy5nZXRQYXJlbnQoKS5nZXRSZXNvdXJjZSgpKS5nZXRGaWxlKG5ldyBQYXRoKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSkpOwotCX0KK3B1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CisJcmV0dXJuICgoSUNvbnRhaW5lcikgKChPcGVuYWJsZSkgdGhpcy5wYXJlbnQpLnJlc291cmNlKHJvb3QpKS5nZXRGaWxlKG5ldyBQYXRoKGdldEVsZW1lbnROYW1lKCkpKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlUmVmZXJlbmNlCkBAIC01NTYsNyArNTYyLDcgQEAKIHB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5ID0gbmV3IENsYXNzRmlsZVdvcmtpbmdDb3B5KHRoaXMsIG93bmVyID09IG51bGwgPyBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZIDogb3duZXIpOwogCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCUphdmFNb2RlbE1hbmFnZXIuUGVyV29ya2luZ0NvcHlJbmZvIHBlcldvcmtpbmdDb3B5SW5mbyA9IAorCUphdmFNb2RlbE1hbmFnZXIuUGVyV29ya2luZ0NvcHlJbmZvIHBlcldvcmtpbmdDb3B5SW5mbyA9CiAJCW1hbmFnZXIuZ2V0UGVyV29ya2luZ0NvcHlJbmZvKHdvcmtpbmdDb3B5LCBmYWxzZS8qZG9uJ3QgY3JlYXRlKi8sIHRydWUvKnJlY29yZCB1c2FnZSovLCBudWxsLypub3QgdXNlZCBzaW5jZSBkb24ndCBjcmVhdGUqLyk7CiAJaWYgKHBlcldvcmtpbmdDb3B5SW5mbyAhPSBudWxsKSB7CiAJCXJldHVybiBwZXJXb3JraW5nQ29weUluZm8uZ2V0V29ya2luZ0NvcHkoKTsgLy8gcmV0dXJuIGV4aXN0aW5nIGhhbmRsZSBpbnN0ZWFkIG9mIHRoZSBvbmUgY3JlYXRlZCBhYm92ZQpAQCAtNjAyLDcgKzYwOCw3IEBACiBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVDbGFzc0ZpbGUoKSB7CiAJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAl0cnkgewotCQlpZiAocm9vdC5nZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpIAorCQlpZiAocm9vdC5nZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpCiAJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgcm9vdCk7CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJcmV0dXJuIGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CkBAIC02MTMsMjMgKzYxOSwzMCBAQAogLyoqCiAgKiBPcGVucyBhbmQgcmV0dXJucyBidWZmZXIgb24gdGhlIHNvdXJjZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzIGZpbGUuCiAgKiBNYXBzIHRoZSBzb3VyY2UgY29kZSB0byB0aGUgY2hpbGRyZW4gZWxlbWVudHMgb2YgdGhpcyBjbGFzcyBmaWxlLgotICogSWYgbm8gc291cmNlIGNvZGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZmlsZSwgCisgKiBJZiBubyBzb3VyY2UgY29kZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBmaWxlLAogICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0gKiAKKyAqCiAgKiBAc2VlIE9wZW5hYmxlCiAgKi8KIHByb3RlY3RlZCBJQnVmZmVyIG9wZW5CdWZmZXIoSVByb2dyZXNzTW9uaXRvciBwbSwgT2JqZWN0IGluZm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVNvdXJjZU1hcHBlciBtYXBwZXIgPSBnZXRTb3VyY2VNYXBwZXIoKTsKLQlpZiAobWFwcGVyICE9IG51bGwpIHsKLQkJcmV0dXJuIG1hcFNvdXJjZShtYXBwZXIsIGluZm8gaW5zdGFuY2VvZiBJQmluYXJ5VHlwZSA/IChJQmluYXJ5VHlwZSkgaW5mbyA6IG51bGwpOworCS8vIENoZWNrIHRoZSBjYWNoZSBmb3IgdGhlIHRvcC1sZXZlbCB0eXBlIGZpcnN0CisJSVR5cGUgb3V0ZXJNb3N0RW5jbG9zaW5nVHlwZSA9IGdldE91dGVyTW9zdEVuY2xvc2luZ1R5cGUoKTsKKwlJQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlck1hbmFnZXIoKS5nZXRCdWZmZXIob3V0ZXJNb3N0RW5jbG9zaW5nVHlwZS5nZXRDbGFzc0ZpbGUoKSk7CisJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisJCVNvdXJjZU1hcHBlciBtYXBwZXIgPSBnZXRTb3VyY2VNYXBwZXIoKTsKKwkJSUJpbmFyeVR5cGUgdHlwZUluZm8gPSBpbmZvIGluc3RhbmNlb2YgSUJpbmFyeVR5cGUgPyAoSUJpbmFyeVR5cGUpIGluZm8gOiBudWxsOworCQlpZiAobWFwcGVyICE9IG51bGwpIHsKKwkJCWJ1ZmZlciA9IG1hcFNvdXJjZShtYXBwZXIsIHR5cGVJbmZvLCBvdXRlck1vc3RFbmNsb3NpbmdUeXBlLmdldENsYXNzRmlsZSgpKTsKKwkJfQogCX0KLQlyZXR1cm4gbnVsbDsKKwlyZXR1cm4gYnVmZmVyOwogfQotcHJpdmF0ZSBJQnVmZmVyIG1hcFNvdXJjZShTb3VyY2VNYXBwZXIgbWFwcGVyLCBJQmluYXJ5VHlwZSBpbmZvKSB7CisvKiogTG9hZHMgdGhlIGJ1ZmZlciB2aWEgU291cmNlTWFwcGVyLCBhbmQgbWFwcyBpdCBpbiBTb3VyY2VNYXBwZXIgKi8KK3ByaXZhdGUgSUJ1ZmZlciBtYXBTb3VyY2UoU291cmNlTWFwcGVyIG1hcHBlciwgSUJpbmFyeVR5cGUgaW5mbywgSUNsYXNzRmlsZSBidWZmZXJPd25lcikgewogCWNoYXJbXSBjb250ZW50cyA9IG1hcHBlci5maW5kU291cmNlKGdldFR5cGUoKSwgaW5mbyk7CiAJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKIAkJLy8gY3JlYXRlIGJ1ZmZlcgotCQlJQnVmZmVyIGJ1ZmZlciA9IEJ1ZmZlck1hbmFnZXIuY3JlYXRlQnVmZmVyKHRoaXMpOworCQlJQnVmZmVyIGJ1ZmZlciA9IEJ1ZmZlck1hbmFnZXIuY3JlYXRlQnVmZmVyKGJ1ZmZlck93bmVyKTsKIAkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJQnVmZmVyTWFuYWdlciBidWZNYW5hZ2VyID0gZ2V0QnVmZmVyTWFuYWdlcigpOwogCQlidWZNYW5hZ2VyLmFkZEJ1ZmZlcihidWZmZXIpOwpAQCAtNjQzLDEyICs2NTYsMTIgQEAKIAkJYnVmZmVyLmFkZEJ1ZmZlckNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKIAogCQkvLyBkbyB0aGUgc291cmNlIG1hcHBpbmcKLQkJbWFwcGVyLm1hcFNvdXJjZShnZXRUeXBlKCksIGNvbnRlbnRzLCBpbmZvKTsKKwkJbWFwcGVyLm1hcFNvdXJjZShnZXRPdXRlck1vc3RFbmNsb3NpbmdUeXBlKCksIGNvbnRlbnRzLCBpbmZvKTsKIAogCQlyZXR1cm4gYnVmZmVyOwogCX0gZWxzZSB7CiAJCS8vIGNyZWF0ZSBidWZmZXIKLQkJSUJ1ZmZlciBidWZmZXIgPSBCdWZmZXJNYW5hZ2VyLmNyZWF0ZU51bGxCdWZmZXIodGhpcyk7CisJCUlCdWZmZXIgYnVmZmVyID0gQnVmZmVyTWFuYWdlci5jcmVhdGVOdWxsQnVmZmVyKGJ1ZmZlck93bmVyKTsKIAkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJQnVmZmVyTWFuYWdlciBidWZNYW5hZ2VyID0gZ2V0QnVmZmVyTWFuYWdlcigpOwogCQlidWZNYW5hZ2VyLmFkZEJ1ZmZlcihidWZmZXIpOwpAQCAtNjYzLDExICs2NzYsMjMgQEAKIAkJcmV0dXJuIG51bGw7CiAJU3RyaW5nIHNpbXBsZU5hbWUgPSBuZXcgU3RyaW5nKHVucXVhbGlmaWVkTmFtZShjbGFzc05hbWUpKTsKIAlpbnQgbGFzdERvbGxhciA9IHNpbXBsZU5hbWUubGFzdEluZGV4T2YoJyQnKTsKLQlpZiAobGFzdERvbGxhciAhPSAtMSkgCisJaWYgKGxhc3REb2xsYXIgIT0gLTEpCiAJCXJldHVybiBVdGlsLmxvY2FsVHlwZU5hbWUoc2ltcGxlTmFtZSwgbGFzdERvbGxhciwgc2ltcGxlTmFtZS5sZW5ndGgoKSk7CiAJZWxzZQogCQlyZXR1cm4gc2ltcGxlTmFtZTsKIH0KKworLyoqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHRvcC1sZXZlbCBkZWNsYXJpbmcgY2xhc3MgdXNlZCB0byBmaW5kIHRoZSBzb3VyY2UgY29kZSAqLworcHJpdmF0ZSBJVHlwZSBnZXRPdXRlck1vc3RFbmNsb3NpbmdUeXBlKCkgeworCUlUeXBlIHR5cGUgPSBnZXRUeXBlKCk7CisJSVR5cGUgZW5jbG9zaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCXdoaWxlIChlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKKwkJdHlwZSA9IGVuY2xvc2luZ1R5cGU7CisJCWVuY2xvc2luZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwl9CisJcmV0dXJuIHR5cGU7Cit9CisKIC8qKgogICogUmV0dXJucyB0aGUgSmF2YSBNb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbmFtZQogICogd2hpY2ggaXMgcHJvdmlkZWQgaW4gZGlldCBjbGFzcyBmaWxlIGZvcm1hdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KQEAgLTc0MCw3ICs3NjUsNyBAQAogICogQGRlcHJlY2F0ZWQgLSBzaG91bGQgdXNlIGNvZGVDb21wbGV0ZShpbnQsIElDb21wbGV0aW9uUmVxdWVzdG9yKSBpbnN0ZWFkCiAgKi8KIHB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBmaW5hbCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkKKwogCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCl7CiAJCWNvZGVDb21wbGV0ZShvZmZzZXQsIChJQ29tcGxldGlvblJlcXVlc3RvciludWxsKTsKIAkJcmV0dXJuOwpAQCAtNzkzLDQgKzgxOCwyMyBAQAogCQkJfQogCQl9KTsKIH0KKworcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFeGlzdGVuY2UoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGNsYXNzIGZpbGUgY2FuIGJlIG9wZW5lZAorCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVDbGFzc0ZpbGUoKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHVuZGVybHlpbmdSZXNvdXJjZSAhPSBudWxsKSB7CisJCWlmICghdW5kZXJseWluZ1Jlc291cmNlLmlzQWNjZXNzaWJsZSgpKQorCQkJcmV0dXJuIG5ld0RvZXNOb3RFeGlzdFN0YXR1cygpOworCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q7CisJCWlmICgodW5kZXJseWluZ1Jlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgJiYgKHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkpLmlzQXJjaGl2ZSgpKSB7IC8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0NjUyCisJCQlyZXR1cm4gcm9vdC5uZXdEb2VzTm90RXhpc3RTdGF0dXMoKTsKKwkJfQorCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB7CisJcmV0dXJuIG51bGw7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEKaW5kZXggMGE5ZjI1NS4uMTM2MTJhNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZUluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwyNiArMTQsMjMgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RWxlbWVudFZhbHVlUGFpcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlGaWVsZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TmVzdGVkVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOwogCiAvKioKICAqIEVsZW1lbnQgaW5mbyBmb3IgPGNvZGU+Q2xhc3NGaWxlPC9jb2RlPiBoYW5kbGVzLgogICovCi0gCisKIC8qIHBhY2thZ2UgKi8gY2xhc3MgQ2xhc3NGaWxlSW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8gaW1wbGVtZW50cyBTdWZmaXhDb25zdGFudHMgewotCS8qKiAKKwkvKioKIAkgKiBUaGUgY2hpbGRyZW4gb2YgdGhlIDxjb2RlPkJpbmFyeVR5cGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gb3VyCiAJICogPGNvZGU+Q2xhc3NGaWxlPC9jb2RlPi4gVGhlc2UgYXJlIGtlcHQgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUKIAkgKiBhY2Nlc3MgdG8gdGhlIDxjb2RlPkJpbmFyeVR5cGU8L2NvZGU+IGluZm8gKDxjb2RlPkNsYXNzRmlsZVJlYWRlcjwvY29kZT4pLgpAQCAtNDMsNyArNDAsMTY2IEBACiAJICogVGhlIHR5cGUgcGFyYW1ldGVycyBpbiB0aGlzIGNsYXNzIGZpbGUuCiAJICovCiAJcHJvdGVjdGVkIElUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnM7Ci0JCisKK3ByaXZhdGUgdm9pZCBnZW5lcmF0ZUFubm90YXRpb25zSW5mb3MoSmF2YUVsZW1lbnQgbWVtYmVyLCBJQmluYXJ5QW5ub3RhdGlvbltdIGJpbmFyeUFubm90YXRpb25zLCBsb25nIHRhZ0JpdHMsIEhhc2hNYXAgbmV3RWxlbWVudHMpIHsKKwlnZW5lcmF0ZUFubm90YXRpb25zSW5mb3MobWVtYmVyLCBudWxsLCBiaW5hcnlBbm5vdGF0aW9ucywgdGFnQml0cywgbmV3RWxlbWVudHMpOworfQorLyoqCisgKiBDcmVhdGVzIHRoZSBoYW5kbGVzIGFuZCBpbmZvcyBmb3IgdGhlIGFubm90YXRpb25zIG9mIHRoZSBnaXZlbiBiaW5hcnkgbWVtYmVyLgorICogQWRkcyBuZXcgaGFuZGxlcyB0byB0aGUgZ2l2ZW4gdmVjdG9yLgorICovCitwcml2YXRlIHZvaWQgZ2VuZXJhdGVBbm5vdGF0aW9uc0luZm9zKEphdmFFbGVtZW50IG1lbWJlciwgY2hhcltdIHBhcmFtZXRlck5hbWUsIElCaW5hcnlBbm5vdGF0aW9uW10gYmluYXJ5QW5ub3RhdGlvbnMsIGxvbmcgdGFnQml0cywgSGFzaE1hcCBuZXdFbGVtZW50cykgeworCWlmIChiaW5hcnlBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBiaW5hcnlBbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUJpbmFyeUFubm90YXRpb24gYW5ub3RhdGlvbkluZm8gPSBiaW5hcnlBbm5vdGF0aW9uc1tpXTsKKwkJCWdlbmVyYXRlQW5ub3RhdGlvbkluZm8obWVtYmVyLCBwYXJhbWV0ZXJOYW1lLCBuZXdFbGVtZW50cywgYW5ub3RhdGlvbkluZm8sIG51bGwpOworCQl9CisJfQorCWdlbmVyYXRlU3RhbmRhcmRBbm5vdGF0aW9uc0luZm9zKG1lbWJlciwgcGFyYW1ldGVyTmFtZSwgdGFnQml0cywgbmV3RWxlbWVudHMpOworfQorcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQW5ub3RhdGlvbkluZm8oSmF2YUVsZW1lbnQgcGFyZW50LCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBJQmluYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uSW5mbywgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUpIHsKKwlnZW5lcmF0ZUFubm90YXRpb25JbmZvKHBhcmVudCwgbnVsbCwgbmV3RWxlbWVudHMsIGFubm90YXRpb25JbmZvLCBtZW1iZXJWYWx1ZVBhaXJOYW1lKTsKK30KK3ByaXZhdGUgdm9pZCBnZW5lcmF0ZUFubm90YXRpb25JbmZvKEphdmFFbGVtZW50IHBhcmVudCwgY2hhcltdIHBhcmFtZXRlck5hbWUsIEhhc2hNYXAgbmV3RWxlbWVudHMsIElCaW5hcnlBbm5vdGF0aW9uIGFubm90YXRpb25JbmZvLCBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSkgeworCWNoYXJbXSB0eXBlTmFtZSA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZS50b0NoYXJBcnJheShDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkoYW5ub3RhdGlvbkluZm8uZ2V0VHlwZU5hbWUoKSwgJy8nLCAnLicpKTsKKwlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbihwYXJlbnQsIG5ldyBTdHJpbmcodHlwZU5hbWUpLCBtZW1iZXJWYWx1ZVBhaXJOYW1lKTsKKwl3aGlsZSAobmV3RWxlbWVudHMuY29udGFpbnNLZXkoYW5ub3RhdGlvbikpIHsKKwkJYW5ub3RhdGlvbi5vY2N1cnJlbmNlQ291bnQrKzsKKwl9CisJbmV3RWxlbWVudHMucHV0KGFubm90YXRpb24sIGFubm90YXRpb25JbmZvKTsKKwlJQmluYXJ5RWxlbWVudFZhbHVlUGFpcltdIHBhaXJzID0gYW5ub3RhdGlvbkluZm8uZ2V0RWxlbWVudFZhbHVlUGFpcnMoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJT2JqZWN0IHZhbHVlID0gcGFpcnNbaV0uZ2V0VmFsdWUoKTsKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUJpbmFyeUFubm90YXRpb24pIHsKKwkJCWdlbmVyYXRlQW5ub3RhdGlvbkluZm8oYW5ub3RhdGlvbiwgbmV3RWxlbWVudHMsIChJQmluYXJ5QW5ub3RhdGlvbikgdmFsdWUsIG5ldyBTdHJpbmcocGFpcnNbaV0uZ2V0TmFtZSgpKSk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworCQkJLy8gaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5LCBpdCBjYW4gaGF2ZSBubyBtb3JlIHRoYW4gMSBkaW1lbnNpb24gLSBubyBuZWVkIHRvIHJlY3Vyc2UKKwkJCU9iamVjdFtdIHZhbHVlQXJyYXkgPSAoT2JqZWN0W10pIHZhbHVlOworCQkJZm9yIChpbnQgaiA9IDAsIHZhbHVlQXJyYXlMZW5ndGggPSB2YWx1ZUFycmF5Lmxlbmd0aDsgaiA8IHZhbHVlQXJyYXlMZW5ndGg7IGorKykgeworCQkJCU9iamVjdCBuZXN0ZWRWYWx1ZSA9IHZhbHVlQXJyYXlbal07CisJCQkJaWYgKG5lc3RlZFZhbHVlIGluc3RhbmNlb2YgSUJpbmFyeUFubm90YXRpb24pIHsKKwkJCQkJZ2VuZXJhdGVBbm5vdGF0aW9uSW5mbyhhbm5vdGF0aW9uLCBuZXdFbGVtZW50cywgKElCaW5hcnlBbm5vdGF0aW9uKSBuZXN0ZWRWYWx1ZSwgbmV3IFN0cmluZyhwYWlyc1tpXS5nZXROYW1lKCkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9Citwcml2YXRlIHZvaWQgZ2VuZXJhdGVTdGFuZGFyZEFubm90YXRpb25zSW5mb3MoSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIGNoYXJbXSBwYXJhbWV0ZXJOYW1lLCBsb25nIHRhZ0JpdHMsIEhhc2hNYXAgbmV3RWxlbWVudHMpIHsKKwlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFsbFN0YW5kYXJkQW5ub3RhdGlvbnNNYXNrKSA9PSAwKQorCQlyZXR1cm47CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSykgIT0gMCkgeworCQlnZW5lcmF0ZVN0YW5kYXJkQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVQsIGdldFRhcmdldEVsZW1lbnRUeXBlcyh0YWdCaXRzKSwgbmV3RWxlbWVudHMpOworCX0KKwlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSAhPSAwKSB7CisJCWdlbmVyYXRlU3RhbmRhcmRBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTiwgZ2V0UmV0ZW50aW9uUG9saWN5KHRhZ0JpdHMpLCBuZXdFbGVtZW50cyk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkRlcHJlY2F0ZWQpICE9IDApIHsKKwkJZ2VuZXJhdGVTdGFuZGFyZEFubm90YXRpb24oamF2YUVsZW1lbnQsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0RFUFJFQ0FURUQsIEFubm90YXRpb24uTk9fTUVNQkVSX1ZBTFVFX1BBSVJTLCBuZXdFbGVtZW50cyk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkRvY3VtZW50ZWQpICE9IDApIHsKKwkJZ2VuZXJhdGVTdGFuZGFyZEFubm90YXRpb24oamF2YUVsZW1lbnQsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fRE9DVU1FTlRFRCwgQW5ub3RhdGlvbi5OT19NRU1CRVJfVkFMVUVfUEFJUlMsIG5ld0VsZW1lbnRzKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uSW5oZXJpdGVkKSAhPSAwKSB7CisJCWdlbmVyYXRlU3RhbmRhcmRBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX0lOSEVSSVRFRCwgQW5ub3RhdGlvbi5OT19NRU1CRVJfVkFMVUVfUEFJUlMsIG5ld0VsZW1lbnRzKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUG9seW1vcnBoaWNTaWduYXR1cmUpICE9IDApIHsKKwkJZ2VuZXJhdGVTdGFuZGFyZEFubm90YXRpb24oamF2YUVsZW1lbnQsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0lOVk9LRV9NRVRIT0RIQU5ETEVfJF9QT0xZTU9SUEhJQ1NJR05BVFVSRSwgQW5ub3RhdGlvbi5OT19NRU1CRVJfVkFMVUVfUEFJUlMsIG5ld0VsZW1lbnRzKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpICE9IDApIHsKKwkJZ2VuZXJhdGVTdGFuZGFyZEFubm90YXRpb24oamF2YUVsZW1lbnQsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NBRkVWQVJBUkdTLCBBbm5vdGF0aW9uLk5PX01FTUJFUl9WQUxVRV9QQUlSUywgbmV3RWxlbWVudHMpOworCX0KKwkvLyBub3RlIHRoYXQgSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1MgYW5kIEpBVkFfTEFOR19PVkVSUklERSBjYW5ub3QgYXBwZWFyIGluIGJpbmFyaWVzCit9CisKK3ByaXZhdGUgdm9pZCBnZW5lcmF0ZVN0YW5kYXJkQW5ub3RhdGlvbihKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgY2hhcltdW10gdHlwZU5hbWUsIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJzLCBIYXNoTWFwIG5ld0VsZW1lbnRzKSB7CisJSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlTmFtZSwgJy4nKSkpOworCUFubm90YXRpb25JbmZvIGFubm90YXRpb25JbmZvID0gbmV3IEFubm90YXRpb25JbmZvKCk7CisJYW5ub3RhdGlvbkluZm8ubWVtYmVycyA9IG1lbWJlcnM7CisJbmV3RWxlbWVudHMucHV0KGFubm90YXRpb24sIGFubm90YXRpb25JbmZvKTsKK30KKworcHJpdmF0ZSBJTWVtYmVyVmFsdWVQYWlyW10gZ2V0VGFyZ2V0RWxlbWVudFR5cGVzKGxvbmcgdGFnQml0cykgeworCUFycmF5TGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJU3RyaW5nIGVsZW1lbnRUeXBlID0gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9FTEVNRU5UVFlQRSwgJy4nKSkgKyAnLic7CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZSkgIT0gMCkgeworCQl2YWx1ZXMuYWRkKGVsZW1lbnRUeXBlICsgbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLlRZUEUpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yRmllbGQpICE9IDApIHsKKwkJdmFsdWVzLmFkZChlbGVtZW50VHlwZSArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9GSUVMRCkpOworCX0KKwlpZiAoKHRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Gb3JNZXRob2QpICE9IDApIHsKKwkJdmFsdWVzLmFkZChlbGVtZW50VHlwZSArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9NRVRIT0QpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yUGFyYW1ldGVyKSAhPSAwKSB7CisJCXZhbHVlcy5hZGQoZWxlbWVudFR5cGUgKyBuZXcgU3RyaW5nKFR5cGVDb25zdGFudHMuVVBQRVJfUEFSQU1FVEVSKSk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckNvbnN0cnVjdG9yKSAhPSAwKSB7CisJCXZhbHVlcy5hZGQoZWxlbWVudFR5cGUgKyBuZXcgU3RyaW5nKFR5cGVDb25zdGFudHMuVVBQRVJfQ09OU1RSVUNUT1IpKTsKKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRm9yTG9jYWxWYXJpYWJsZSkgIT0gMCkgeworCQl2YWx1ZXMuYWRkKGVsZW1lbnRUeXBlICsgbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLlVQUEVSX0xPQ0FMX1ZBUklBQkxFKSk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvckFubm90YXRpb25UeXBlKSAhPSAwKSB7CisJCXZhbHVlcy5hZGQoZWxlbWVudFR5cGUgKyBuZXcgU3RyaW5nKFR5cGVDb25zdGFudHMuVVBQRVJfQU5OT1RBVElPTl9UWVBFKSk7CisJfQorCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkZvclBhY2thZ2UpICE9IDApIHsKKwkJdmFsdWVzLmFkZChlbGVtZW50VHlwZSArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9QQUNLQUdFKSk7CisJfQorCWZpbmFsIE9iamVjdCB2YWx1ZTsKKwlpZiAodmFsdWVzLnNpemUoKSA9PSAwKSB7CisJCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblRhcmdldCkgIT0gMCkKKwkJCXZhbHVlID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOworCQllbHNlCisJCQlyZXR1cm4gQW5ub3RhdGlvbi5OT19NRU1CRVJfVkFMVUVfUEFJUlM7CisJfSBlbHNlIGlmICh2YWx1ZXMuc2l6ZSgpID09IDEpIHsKKwkJdmFsdWUgPSB2YWx1ZXMuZ2V0KDApOworCX0gZWxzZSB7CisJCXZhbHVlID0gdmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXSk7CisJfQorCXJldHVybiBuZXcgSU1lbWJlclZhbHVlUGFpcltdIHsKKwkJbmV3IElNZW1iZXJWYWx1ZVBhaXIoKSB7CisJCQlwdWJsaWMgaW50IGdldFZhbHVlS2luZCgpIHsKKwkJCQlyZXR1cm4gSU1lbWJlclZhbHVlUGFpci5LX1FVQUxJRklFRF9OQU1FOworCQkJfQorCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCQlwdWJsaWMgU3RyaW5nIGdldE1lbWJlck5hbWUoKSB7CisJCQkJcmV0dXJuIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5WQUxVRSk7CisJCQl9CisJCX0KKwl9OworfQorCitwcml2YXRlIElNZW1iZXJWYWx1ZVBhaXJbXSBnZXRSZXRlbnRpb25Qb2xpY3kobG9uZyB0YWdCaXRzKSB7CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUmV0ZW50aW9uTUFTSykgPT0gMCkKKwkJcmV0dXJuIEFubm90YXRpb24uTk9fTUVNQkVSX1ZBTFVFX1BBSVJTOworCVN0cmluZyByZXRlbnRpb24gPSBudWxsOworCWlmICgodGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb24pID09IFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb24pIHsKKwkJLy8gVGFnQml0cy5Bbm5vdGF0aW9uUnVudGltZVJldGVudGlvbiBjb21iaW5lcyBib3RoIFRhZ0JpdHMuQW5ub3RhdGlvbkNsYXNzUmV0ZW50aW9uICYgVGFnQml0cy5Bbm5vdGF0aW9uU291cmNlUmV0ZW50aW9uCisJCXJldGVudGlvbiA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OUE9MSUNZLCAnLicpKSArICcuJyArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9SVU5USU1FKTsKKwl9IGVsc2UgaWYgKCh0YWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU291cmNlUmV0ZW50aW9uKSAhPSAwKSB7CisJCXJldGVudGlvbiA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OUE9MSUNZLCAnLicpKSArICcuJyArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9TT1VSQ0UpOworCX0gZWxzZSB7CisJCXJldGVudGlvbiA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OUE9MSUNZLCAnLicpKSArICcuJyArIG5ldyBTdHJpbmcoVHlwZUNvbnN0YW50cy5VUFBFUl9DTEFTUyk7CisJfQorCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHJldGVudGlvbjsKKwlyZXR1cm4gCisJCW5ldyBJTWVtYmVyVmFsdWVQYWlyW10geworCQkJbmV3IElNZW1iZXJWYWx1ZVBhaXIoKSB7CisJCQkJcHVibGljIGludCBnZXRWYWx1ZUtpbmQoKSB7CisJCQkJCXJldHVybiBJTWVtYmVyVmFsdWVQYWlyLktfUVVBTElGSUVEX05BTUU7CisJCQkJfQorCQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9CisJCQkJcHVibGljIFN0cmluZyBnZXRNZW1iZXJOYW1lKCkgeworCQkJCQlyZXR1cm4gbmV3IFN0cmluZyhUeXBlQ29uc3RhbnRzLlZBTFVFKTsKKwkJCQl9CisJCQl9CisJCX07Cit9CisKIC8qKgogICogQ3JlYXRlcyB0aGUgaGFuZGxlcyBhbmQgaW5mb3MgZm9yIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGJpbmFyeSB0eXBlLgogICogQWRkcyBuZXcgaGFuZGxlcyB0byB0aGUgZ2l2ZW4gdmVjdG9yLgpAQCAtNTcsOSArMjEzLDEwIEBACiAJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJZm9yIChpbnQgaSA9IDAsIGZpZWxkQ291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgZmllbGRDb3VudDsgaSsrKSB7CiAJCUlCaW5hcnlGaWVsZCBmaWVsZEluZm8gPSBmaWVsZHNbaV07Ci0JCUlGaWVsZCBmaWVsZCA9IG5ldyBCaW5hcnlGaWVsZCgoSmF2YUVsZW1lbnQpdHlwZSwgbWFuYWdlci5pbnRlcm4obmV3IFN0cmluZyhmaWVsZEluZm8uZ2V0TmFtZSgpKSkpOworCQlCaW5hcnlGaWVsZCBmaWVsZCA9IG5ldyBCaW5hcnlGaWVsZCgoSmF2YUVsZW1lbnQpdHlwZSwgbWFuYWdlci5pbnRlcm4obmV3IFN0cmluZyhmaWVsZEluZm8uZ2V0TmFtZSgpKSkpOwogCQluZXdFbGVtZW50cy5wdXQoZmllbGQsIGZpZWxkSW5mbyk7CiAJCWNoaWxkcmVuSGFuZGxlcy5hZGQoZmllbGQpOworCQlnZW5lcmF0ZUFubm90YXRpb25zSW5mb3MoZmllbGQsIGZpZWxkSW5mby5nZXRBbm5vdGF0aW9ucygpLCBmaWVsZEluZm8uZ2V0VGFnQml0cygpLCBuZXdFbGVtZW50cyk7CiAJfQogfQogLyoqCkBAIC05NiwxNSArMjUzLDM4IEBACiAJCS8vIFRPRE8gKGplcm9tZSkgZmlsdGVyIG91dCBzeW50aGV0aWMgbWVtYmVycwogCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXIgc2hvdWxkIG5vdCBpbmRleCB0aGVtIGFzIHdlbGwKIAkJLy8gaWYgKChtZXRob2RJbmZvLmdldE1vZGlmaWVycygpICYgSUNvbnN0YW50cy5BY2NTeW50aGV0aWMpICE9IDApIGNvbnRpbnVlOyAvLyBza2lwIHN5bnRoZXRpYworCQlib29sZWFuIHVzZUdlbmVyaWNTaWduYXR1cmUgPSB0cnVlOwogCQljaGFyW10gc2lnbmF0dXJlID0gbWV0aG9kSW5mby5nZXRHZW5lcmljU2lnbmF0dXJlKCk7Ci0JCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgc2lnbmF0dXJlID0gbWV0aG9kSW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCk7CisJCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgeworCQkJdXNlR2VuZXJpY1NpZ25hdHVyZSA9IGZhbHNlOworCQkJc2lnbmF0dXJlID0gbWV0aG9kSW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCk7CisJCX0KKwkJU3RyaW5nIHNlbGVjdG9yID0gbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldFNlbGVjdG9yKCkpOworCQlmaW5hbCBib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2RJbmZvLmlzQ29uc3RydWN0b3IoKTsKKwkJaWYgKGlzQ29uc3RydWN0b3IpIHsKKwkJCXNlbGVjdG9yID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOworCQl9CiAJCVN0cmluZ1tdIHBOYW1lcyA9IG51bGw7CiAJCXRyeSB7CiAJCQlwTmFtZXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobmV3IFN0cmluZyhzaWduYXR1cmUpKTsKKwkJCWlmIChpc0NvbnN0cnVjdG9yCisJCQkJCSYmIHVzZUdlbmVyaWNTaWduYXR1cmUKKwkJCQkJJiYgdHlwZS5pc01lbWJlcigpCisJCQkJCSYmICFGbGFncy5pc1N0YXRpYyh0eXBlLmdldEZsYWdzKCkpKSB7CisJCQkJaW50IGxlbmd0aCA9IHBOYW1lcy5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShwTmFtZXMsIDAsIChwTmFtZXMgPSBuZXcgU3RyaW5nW2xlbmd0aCArIDFdKSwgMSwgbGVuZ3RoKTsKKwkJCQljaGFyW10gZGVzY3JpcHRvciA9IG1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQkJCWZpbmFsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG5ldyBTdHJpbmcoZGVzY3JpcHRvcikpOworCQkJCXBOYW1lc1swXSA9IHBhcmFtZXRlclR5cGVzWzBdOworCQkJfQogCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCQkJLy8gcHJvdGVjdCBhZ2FpbnN0IG1hbGZvcm1lZCAuY2xhc3MgZmlsZSAoZS5nLiBjb20vc3VuL2NyeXB0by9wcm92aWRlci9TdW5KQ0VfYi5jbGFzcyBoYXMgYSAnYScgZ2VuZXJpYyBzaWduYXR1cmUpCiAJCQlzaWduYXR1cmUgPSBtZXRob2RJbmZvLmdldE1ldGhvZERlc2NyaXB0b3IoKTsKIAkJCXBOYW1lcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKHNpZ25hdHVyZSkpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gcHJvdGVjdCBhZ2FpbnN0IG1hbGZvcm1lZCAuY2xhc3MgZmlsZSAoZS5nLiBjb20vc3VuL2NyeXB0by9wcm92aWRlci9TdW5KQ0VfYi5jbGFzcyBoYXMgYSAnYScgZ2VuZXJpYyBzaWduYXR1cmUpCisJCQlzaWduYXR1cmUgPSBtZXRob2RJbmZvLmdldE1ldGhvZERlc2NyaXB0b3IoKTsKKwkJCXBOYW1lcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKHNpZ25hdHVyZSkpOwogCQl9CiAJCWNoYXJbXVtdIHBhcmFtTmFtZXM9IG5ldyBjaGFyW3BOYW1lcy5sZW5ndGhdW107CiAJCWZvciAoaW50IGo9IDA7IGogPCBwTmFtZXMubGVuZ3RoOyBqKyspIHsKQEAgLTExMiwyNSArMjkyLDUxIEBACiAJCX0KIAkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWVzKHBhcmFtTmFtZXMpOwogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJU3RyaW5nIHNlbGVjdG9yID0gbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldFNlbGVjdG9yKCkpOwotCQlpZiAobWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXNlbGVjdG9yID10eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KIAkJc2VsZWN0b3IgPSAgbWFuYWdlci5pbnRlcm4oc2VsZWN0b3IpOwogCQlmb3IgKGludCBqPSAwOyBqIDwgcE5hbWVzLmxlbmd0aDsgaisrKSB7CiAJCQlwTmFtZXNbal09IG1hbmFnZXIuaW50ZXJuKG5ldyBTdHJpbmcocGFyYW1ldGVyVHlwZXNbal0pKTsKIAkJfQogCQlCaW5hcnlNZXRob2QgbWV0aG9kID0gbmV3IEJpbmFyeU1ldGhvZCgoSmF2YUVsZW1lbnQpdHlwZSwgc2VsZWN0b3IsIHBOYW1lcyk7CiAJCWNoaWxkcmVuSGFuZGxlcy5hZGQobWV0aG9kKTsKLQkJCi0JCS8vIGVuc3VyZSB0aGF0IDIgYmluYXJ5IG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYnV0IHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcyBoYXZlIGRpZmZlcmVudCBvY2N1cmVuY2UgY291bnRzLgorCisJCS8vIGVuc3VyZSB0aGF0IDIgYmluYXJ5IG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYnV0IHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcyBoYXZlIGRpZmZlcmVudCBvY2N1cnJlbmNlIGNvdW50cy4KIAkJLy8gKGNhc2Ugb2YgYnJpZGdlIG1ldGhvZHMgaW4gMS41KQogCQl3aGlsZSAobmV3RWxlbWVudHMuY29udGFpbnNLZXkobWV0aG9kKSkKIAkJCW1ldGhvZC5vY2N1cnJlbmNlQ291bnQrKzsKLQkJCisKIAkJbmV3RWxlbWVudHMucHV0KG1ldGhvZCwgbWV0aG9kSW5mbyk7Ci0JCQorCisJCWludCBtYXggPSBwTmFtZXMubGVuZ3RoOworCQljaGFyW11bXSBhcmd1bWVudE5hbWVzID0gbWV0aG9kSW5mby5nZXRBcmd1bWVudE5hbWVzKCk7CisJCWlmIChhcmd1bWVudE5hbWVzID09IG51bGwgfHwgYXJndW1lbnROYW1lcy5sZW5ndGggPCBtYXgpIHsKKwkJCWFyZ3VtZW50TmFtZXMgPSBuZXcgY2hhclttYXhdW107CisJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heDsgaisrKSB7CisJCQkJYXJndW1lbnROYW1lc1tqXSA9ICgiYXJnIiArIGopLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlmb3IgKGludCBqID0gMDsgaiA8IG1heDsgaisrKSB7CisJCQlJQmluYXJ5QW5ub3RhdGlvbltdIHBhcmFtZXRlckFubm90YXRpb25zID0gbWV0aG9kSW5mby5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhqKTsKKwkJCWlmIChwYXJhbWV0ZXJBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gbmV3IExvY2FsVmFyaWFibGUoCisJCQkJCQltZXRob2QsCisJCQkJCQluZXcgU3RyaW5nKGFyZ3VtZW50TmFtZXNbal0pLAorCQkJCQkJMCwKKwkJCQkJCS0xLAorCQkJCQkJMCwKKwkJCQkJCS0xLAorCQkJCQkJbWV0aG9kLnBhcmFtZXRlclR5cGVzW2pdLAorCQkJCQkJbnVsbCwKKwkJCQkJCS0xLAorCQkJCQkJdHJ1ZSk7CisJCQkJZ2VuZXJhdGVBbm5vdGF0aW9uc0luZm9zKGxvY2FsVmFyaWFibGUsIGFyZ3VtZW50TmFtZXNbal0sIHBhcmFtZXRlckFubm90YXRpb25zLCBtZXRob2RJbmZvLmdldFRhZ0JpdHMoKSwgbmV3RWxlbWVudHMpOworCQkJfQorCQl9CiAJCWdlbmVyYXRlVHlwZVBhcmFtZXRlckluZm9zKG1ldGhvZCwgc2lnbmF0dXJlLCBuZXdFbGVtZW50cywgdHlwZVBhcmFtZXRlckhhbmRsZXMpOworCQlnZW5lcmF0ZUFubm90YXRpb25zSW5mb3MobWV0aG9kLCBtZXRob2RJbmZvLmdldEFubm90YXRpb25zKCksIG1ldGhvZEluZm8uZ2V0VGFnQml0cygpLCBuZXdFbGVtZW50cyk7CisJCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBtZXRob2RJbmZvLmdldERlZmF1bHRWYWx1ZSgpOworCQlpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgSUJpbmFyeUFubm90YXRpb24pIHsKKwkJCWdlbmVyYXRlQW5ub3RhdGlvbkluZm8obWV0aG9kLCBuZXdFbGVtZW50cywgKElCaW5hcnlBbm5vdGF0aW9uKSBkZWZhdWx0VmFsdWUsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXRTZWxlY3RvcigpKSk7CisJCX0KIAl9CiB9CiAvKioKQEAgLTE0MywyNCArMzQ5LDI1IEBACiAJZm9yIChpbnQgaSA9IDAsIHR5cGVQYXJhbWV0ZXJDb3VudCA9IHR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzLmxlbmd0aDsgaSA8IHR5cGVQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAJCWNoYXJbXSB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlID0gdHlwZVBhcmFtZXRlclNpZ25hdHVyZXNbaV07CiAJCWNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSA9IFNpZ25hdHVyZS5nZXRUeXBlVmFyaWFibGUodHlwZVBhcmFtZXRlclNpZ25hdHVyZSk7CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZSh0eXBlUGFyYW1ldGVyU2lnbmF0dXJlLCAnLycsICcuJyk7CiAJCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZFNpZ25hdHVyZXMgPSBTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlckJvdW5kcyh0eXBlUGFyYW1ldGVyU2lnbmF0dXJlKTsKIAkJaW50IGJvdW5kTGVuZ3RoID0gdHlwZVBhcmFtZXRlckJvdW5kU2lnbmF0dXJlcy5sZW5ndGg7CiAJCWNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJCb3VuZHMgPSBuZXcgY2hhcltib3VuZExlbmd0aF1bXTsKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBib3VuZExlbmd0aDsgaisrKSB7CiAJCQl0eXBlUGFyYW1ldGVyQm91bmRzW2pdID0gU2lnbmF0dXJlLnRvQ2hhckFycmF5KHR5cGVQYXJhbWV0ZXJCb3VuZFNpZ25hdHVyZXNbal0pOwotCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHR5cGVQYXJhbWV0ZXJCb3VuZHNbal0sICcvJywgJy4nKTsKIAkJfQogCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBuZXcgVHlwZVBhcmFtZXRlcihwYXJlbnQsIG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlck5hbWUpKTsKIAkJVHlwZVBhcmFtZXRlckVsZW1lbnRJbmZvIGluZm8gPSBuZXcgVHlwZVBhcmFtZXRlckVsZW1lbnRJbmZvKCk7CiAJCWluZm8uYm91bmRzID0gdHlwZVBhcmFtZXRlckJvdW5kczsKKwkJaW5mby5ib3VuZHNTaWduYXR1cmVzID0gdHlwZVBhcmFtZXRlckJvdW5kU2lnbmF0dXJlczsKIAkJdHlwZVBhcmFtZXRlckhhbmRsZXMuYWRkKHR5cGVQYXJhbWV0ZXIpOwotCQkKKwogCQkvLyBlbnN1cmUgdGhhdCAyIGJpbmFyeSBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGJ1dCB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgaGF2ZSBkaWZmZXJlbnQgb2NjdXJlbmNlIGNvdW50cy4KIAkJLy8gKGNhc2Ugb2YgYnJpZGdlIG1ldGhvZHMgaW4gMS41KQogCQl3aGlsZSAobmV3RWxlbWVudHMuY29udGFpbnNLZXkodHlwZVBhcmFtZXRlcikpCiAJCQl0eXBlUGFyYW1ldGVyLm9jY3VycmVuY2VDb3VudCsrOwotCQkKLQkJbmV3RWxlbWVudHMucHV0KHR5cGVQYXJhbWV0ZXIsIGluZm8pOwkKKworCQluZXdFbGVtZW50cy5wdXQodHlwZVBhcmFtZXRlciwgaW5mbyk7CiAJfQogfQogLyoqCkBAIC0xODAsMTIgKzM4NywxMyBAQAogCUJpbmFyeVR5cGUgdHlwZSA9IChCaW5hcnlUeXBlKSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOwogCUFycmF5TGlzdCB0eXBlUGFyYW1ldGVySGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAlpZiAodHlwZUluZm8gIT0gbnVsbCkgeyAvL21heSBub3QgYmUgYSB2YWxpZCBjbGFzcyBmaWxlCisJCWdlbmVyYXRlQW5ub3RhdGlvbnNJbmZvcyh0eXBlLCB0eXBlSW5mby5nZXRBbm5vdGF0aW9ucygpLCB0eXBlSW5mby5nZXRUYWdCaXRzKCksIG5ld0VsZW1lbnRzKTsKIAkJZ2VuZXJhdGVUeXBlUGFyYW1ldGVySW5mb3ModHlwZSwgdHlwZUluZm8uZ2V0R2VuZXJpY1NpZ25hdHVyZSgpLCBuZXdFbGVtZW50cywgdHlwZVBhcmFtZXRlckhhbmRsZXMpOwogCQlnZW5lcmF0ZUZpZWxkSW5mb3ModHlwZSwgdHlwZUluZm8sIG5ld0VsZW1lbnRzLCBjaGlsZHJlbkhhbmRsZXMpOwogCQlnZW5lcmF0ZU1ldGhvZEluZm9zKHR5cGUsIHR5cGVJbmZvLCBuZXdFbGVtZW50cywgY2hpbGRyZW5IYW5kbGVzLCB0eXBlUGFyYW1ldGVySGFuZGxlcyk7CiAJCWdlbmVyYXRlSW5uZXJDbGFzc0hhbmRsZXModHlwZSwgdHlwZUluZm8sIGNoaWxkcmVuSGFuZGxlcyk7IC8vIE5vdGUgaW5uZXIgY2xhc3MgYXJlIHNlcGFyYXRlIG9wZW5hYmxlcyB0aGF0IGFyZSBub3Qgb3BlbmVkIGhlcmU6IG5vIG5lZWQgdG8gcGFzcyBpbiBuZXdFbGVtZW50cwogCX0KLQkKKwogCXRoaXMuYmluYXJ5Q2hpbGRyZW4gPSBuZXcgSmF2YUVsZW1lbnRbY2hpbGRyZW5IYW5kbGVzLnNpemUoKV07CiAJY2hpbGRyZW5IYW5kbGVzLnRvQXJyYXkodGhpcy5iaW5hcnlDaGlsZHJlbik7CiAJaW50IHR5cGVQYXJhbWV0ZXJIYW5kbGVTaXplID0gdHlwZVBhcmFtZXRlckhhbmRsZXMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZVdvcmtpbmdDb3B5LmphdmEKaW5kZXggZTg2N2ViNC4uZDEwMjdmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlV29ya2luZ0NvcHkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVXb3JraW5nQ29weS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDcgKzE0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKQEAgLTMwLDExICsyOSwxMSBAQAogICogQSB3b3JraW5nIGNvcHkgb24gYW4gPGNvZGU+SUNsYXNzRmlsZTwvY29kZT4uCiAgKi8KIHB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVXb3JraW5nQ29weSBleHRlbmRzIENvbXBpbGF0aW9uVW5pdCB7Ci0JCi0JcHVibGljIElDbGFzc0ZpbGUgY2xhc3NGaWxlOwotCQotcHVibGljIENsYXNzRmlsZVdvcmtpbmdDb3B5KElDbGFzc0ZpbGUgY2xhc3NGaWxlLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB7Ci0Jc3VwZXIoKFBhY2thZ2VGcmFnbWVudCkgY2xhc3NGaWxlLmdldFBhcmVudCgpLCAoKEJpbmFyeVR5cGUpICgoQ2xhc3NGaWxlKSBjbGFzc0ZpbGUpLmdldFR5cGUoKSkuZ2V0U291cmNlRmlsZU5hbWUobnVsbC8qbm8gaW5mbyBhdmFpbGFibGUqLyksIG93bmVyKTsKKworCXB1YmxpYyBDbGFzc0ZpbGUgY2xhc3NGaWxlOworCitwdWJsaWMgQ2xhc3NGaWxlV29ya2luZ0NvcHkoQ2xhc3NGaWxlIGNsYXNzRmlsZSwgV29ya2luZ0NvcHlPd25lciBvd25lcikgeworCXN1cGVyKChQYWNrYWdlRnJhZ21lbnQpIGNsYXNzRmlsZS5nZXRQYXJlbnQoKSwgKChCaW5hcnlUeXBlKSBjbGFzc0ZpbGUuZ2V0VHlwZSgpKS5nZXRTb3VyY2VGaWxlTmFtZShudWxsLypubyBpbmZvIGF2YWlsYWJsZSovKSwgb3duZXIpOwogCXRoaXMuY2xhc3NGaWxlID0gY2xhc3NGaWxlOwogfQogCkBAIC03MCw4ICs2OSwxMCBAQAogCXJldHVybiBuZXcgQ2xhc3NGaWxlV29ya2luZ0NvcHkodGhpcy5jbGFzc0ZpbGUsIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkpOwogfQogCi1wdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCXJldHVybiB0aGlzLmNsYXNzRmlsZS5nZXRSZXNvdXJjZSgpOworcHVibGljIElSZXNvdXJjZSByZXNvdXJjZShQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QpIHsKKwlpZiAocm9vdC5pc0FyY2hpdmUoKSkKKwkJcmV0dXJuIHJvb3QucmVzb3VyY2Uocm9vdCk7CisJcmV0dXJuIHRoaXMuY2xhc3NGaWxlLnJlc291cmNlKHJvb3QpOwogfQogCiAvKioKQEAgLTgyLDcgKzgzLDcgQEAKIAkvLyBjcmVhdGUgYnVmZmVyCiAJSUJ1ZmZlciBidWZmZXIgPSB0aGlzLm93bmVyLmNyZWF0ZUJ1ZmZlcih0aGlzKTsKIAlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCQorCiAJLy8gc2V0IHRoZSBidWZmZXIgc291cmNlCiAJaWYgKGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgPT0gbnVsbCkgewogCQlJQnVmZmVyIGNsYXNzRmlsZUJ1ZmZlciA9IHRoaXMuY2xhc3NGaWxlLmdldEJ1ZmZlcigpOwpAQCAtMTAwLDEwICsxMDEsMTAgQEAKIAkvLyBhZGQgYnVmZmVyIHRvIGJ1ZmZlciBjYWNoZQogCUJ1ZmZlck1hbmFnZXIgYnVmTWFuYWdlciA9IGdldEJ1ZmZlck1hbmFnZXIoKTsKIAlidWZNYW5hZ2VyLmFkZEJ1ZmZlcihidWZmZXIpOwotCQkJCisKIAkvLyBsaXN0ZW4gdG8gYnVmZmVyIGNoYW5nZXMKIAlidWZmZXIuYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQorCiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQWNjZXNzUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQWNjZXNzUnVsZS5qYXZhCmluZGV4IDhkZWUzYTYuLjE5OWZkZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEFjY2Vzc1J1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhBY2Nlc3NSdWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTUgKzE3LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlOwogCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQWNjZXNzUnVsZSBleHRlbmRzIEFjY2Vzc1J1bGUgaW1wbGVtZW50cyBJQWNjZXNzUnVsZSB7Ci0JCisKIAlwdWJsaWMgQ2xhc3NwYXRoQWNjZXNzUnVsZShJUGF0aCBwYXR0ZXJuLCBpbnQga2luZCkgewogCQl0aGlzKHBhdHRlcm4udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpLCB0b1Byb2JsZW1JZChraW5kKSk7CiAJfQotCQorCiAJcHVibGljIENsYXNzcGF0aEFjY2Vzc1J1bGUoY2hhcltdIHBhdHRlcm4sIGludCBwcm9ibGVtSWQpIHsKIAkJc3VwZXIocGF0dGVybiwgcHJvYmxlbUlkKTsKIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyBpbnQgdG9Qcm9ibGVtSWQoaW50IGtpbmQpIHsKIAkJYm9vbGVhbiBpZ25vcmVJZkJldHRlciA9IChraW5kICYgSUFjY2Vzc1J1bGUuSUdOT1JFX0lGX0JFVFRFUikgIT0gMDsKIAkJc3dpdGNoIChraW5kICYgfklBY2Nlc3NSdWxlLklHTk9SRV9JRl9CRVRURVIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQXR0cmlidXRlLmphdmEKaW5kZXggOWQ4ODNiNC4uYjFmMWIzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTUgKzE0LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQXR0cmlidXRlIGltcGxlbWVudHMgSUNsYXNzcGF0aEF0dHJpYnV0ZSB7Ci0JCisKIAlwcml2YXRlIFN0cmluZyBuYW1lOwogCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQorCiAJcHVibGljIENsYXNzcGF0aEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAJCXRoaXMubmFtZSA9IG5hbWU7CiAJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDbGFzc3BhdGhBdHRyaWJ1dGUpKSByZXR1cm4gZmFsc2U7CiAJCUNsYXNzcGF0aEF0dHJpYnV0ZSBvdGhlciA9IChDbGFzc3BhdGhBdHRyaWJ1dGUpIG9iajsKQEAgLTM2LDExICszNiwxMSBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CiAJCXJldHVybiB0aGlzLnZhbHVlOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgIAlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKHRoaXMubmFtZS5oYXNoQ29kZSgpLCB0aGlzLnZhbHVlLmhhc2hDb2RlKCkpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgCXJldHVybiB0aGlzLm5hbWUgKyAiPSIgKyB0aGlzLnZhbHVlOyAvLyROT04tTkxTLTEkCiAgICAgfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoQ2hhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhDaGFuZ2UuamF2YQppbmRleCA5MmY4ZjZlLi5iOTZjZDQ0IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhDaGFuZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhDaGFuZ2UuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI4LDMyICsyOCwzNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5PYmplY3RWZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuRGVsdGFQcm9jZXNzb3IuUm9vdEluZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIENsYXNzcGF0aENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBpbnQgTk9fREVMVEEgPSAweDAwOwotCXB1YmxpYyBzdGF0aWMgaW50IEhBU19ERUxUQSA9IDB4MDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgSEFTX1BST0pFQ1RfQ0hBTkdFID0gMHgxMDsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19ERUxUQSA9IDB4MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTX0RFTFRBID0gMHgwMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVNfUFJPSkVDVF9DSEFOR0UgPSAweDAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBU19MSUJSQVJZX0NIQU5HRSA9IDB4MDQ7CisKIAlKYXZhUHJvamVjdCBwcm9qZWN0OwogCUlDbGFzc3BhdGhFbnRyeVtdIG9sZFJhd0NsYXNzcGF0aDsKIAlJUGF0aCBvbGRPdXRwdXRMb2NhdGlvbjsKIAlJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aDsKLQkKKwogCXB1YmxpYyBDbGFzc3BhdGhDaGFuZ2UoSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gb2xkUmF3Q2xhc3NwYXRoLCBJUGF0aCBvbGRPdXRwdXRMb2NhdGlvbiwgSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRDbGFzc3BhdGgpIHsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAkJdGhpcy5vbGRSYXdDbGFzc3BhdGggPSBvbGRSYXdDbGFzc3BhdGg7CiAJCXRoaXMub2xkT3V0cHV0TG9jYXRpb24gPSBvbGRPdXRwdXRMb2NhdGlvbjsKIAkJdGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aCA9IG9sZFJlc29sdmVkQ2xhc3NwYXRoOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhEZWx0YXMoSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cywgaW50IGZsYWcpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHJvb3RzW2ldOwogCQkJZGVsdGEuY2hhbmdlZChyb290LCBmbGFnKTsKLQkJCWlmICgoZmxhZyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCAKKwkJCWlmICgoZmxhZyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMAogCQkJCQl8fCAoZmxhZyAmIElKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQpICE9IDAKIAkJCQkJfHwgKGZsYWcgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEKSAhPSAwKXsKIAkJCQl0cnkgewpAQCAtNzIsNyArNzQsOCBAQAogCXByaXZhdGUgaW50IGNsYXNzcGF0aENvbnRhaW5zKElDbGFzc3BhdGhFbnRyeVtdIGxpc3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewogCQlJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zID0gZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKTsKIAkJSVBhdGhbXSBpbmNsdXNpb25QYXR0ZXJucyA9IGVudHJ5LmdldEluY2x1c2lvblBhdHRlcm5zKCk7Ci0JCW5leHRFbnRyeTogZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisJCWludCBsaXN0TGVuID0gbGlzdCA9PSBudWxsID8gMCA6IGxpc3QubGVuZ3RoOworCQluZXh0RW50cnk6IGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbjsgaSsrKSB7CiAJCQlJQ2xhc3NwYXRoRW50cnkgb3RoZXIgPSBsaXN0W2ldOwogCQkJaWYgKG90aGVyLmdldENvbnRlbnRLaW5kKCkgPT0gZW50cnkuZ2V0Q29udGVudEtpbmQoKQogCQkJCSYmIG90aGVyLmdldEVudHJ5S2luZCgpID09IGVudHJ5LmdldEVudHJ5S2luZCgpCkBAIC04OCw3ICs5MSw3IEBACiAJCQkJCQlpZiAoIWVudHJ5T3V0cHV0LmVxdWFscyhvdGhlck91dHB1dCkpCiAJCQkJCQkJY29udGludWU7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJLy8gY2hlY2sgaW5jbHVzaW9uIHBhdHRlcm5zCiAJCQkJCUlQYXRoW10gb3RoZXJJbmNsdWRlcyA9IG90aGVyLmdldEluY2x1c2lvblBhdHRlcm5zKCk7CiAJCQkJCWlmIChpbmNsdXNpb25QYXR0ZXJucyAhPSBvdGhlckluY2x1ZGVzKSB7CkBAIC05Nyw3ICsxMDAsNyBAQAogCQkJCQkJaWYgKG90aGVySW5jbHVkZXMgPT0gbnVsbCB8fCBvdGhlckluY2x1ZGVzLmxlbmd0aCAhPSBpbmNsdWRlTGVuZ3RoKQogCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmNsdWRlTGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkvLyBjb21wYXJlIHRvU3RyaW5ncyBpbnN0ZWFkIG9mIElQYXRocyAKKwkJCQkJCQkvLyBjb21wYXJlIHRvU3RyaW5ncyBpbnN0ZWFkIG9mIElQYXRocwogCQkJCQkJCS8vIHNpbmNlIElQYXRoLmVxdWFscyBpcyBzcGVjaWZpZWQgdG8gaWdub3JlIHRyYWlsaW5nIHNlcGFyYXRvcnMKIAkJCQkJCQlpZiAoIWluY2x1c2lvblBhdHRlcm5zW2pdLnRvU3RyaW5nKCkuZXF1YWxzKG90aGVySW5jbHVkZXNbal0udG9TdHJpbmcoKSkpCiAJCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKQEAgLTExMSw3ICsxMTQsNyBAQAogCQkJCQkJaWYgKG90aGVyRXhjbHVkZXMgPT0gbnVsbCB8fCBvdGhlckV4Y2x1ZGVzLmxlbmd0aCAhPSBleGNsdWRlTGVuZ3RoKQogCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleGNsdWRlTGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkvLyBjb21wYXJlIHRvU3RyaW5ncyBpbnN0ZWFkIG9mIElQYXRocyAKKwkJCQkJCQkvLyBjb21wYXJlIHRvU3RyaW5ncyBpbnN0ZWFkIG9mIElQYXRocwogCQkJCQkJCS8vIHNpbmNlIElQYXRoLmVxdWFscyBpcyBzcGVjaWZpZWQgdG8gaWdub3JlIHRyYWlsaW5nIHNlcGFyYXRvcnMKIAkJCQkJCQlpZiAoIWV4Y2x1c2lvblBhdHRlcm5zW2pdLnRvU3RyaW5nKCkuZXF1YWxzKG90aGVyRXhjbHVkZXNbal0udG9TdHJpbmcoKSkpCiAJCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKQEAgLTEzNSw3ICsxMzgsNyBAQAogCQkJCQljb2xsZWN0aW9uLmFkZChyKTsKIAkJCQkJY29sbGVjdEFsbFN1YmZvbGRlcnMoKElGb2xkZXIpciwgY29sbGVjdGlvbik7CiAJCQkJfQotCQkJfQkKKwkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CkBAIC0xNDksNyArMTUyLDcgQEAKIAkgKi8KIAlwcml2YXRlIEFycmF5TGlzdCBkZXRlcm1pbmVBZmZlY3RlZFBhY2thZ2VGcmFnbWVudHMoSVBhdGggbG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlBcnJheUxpc3QgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQorCiAJCS8vIHNlZSBpZiB0aGlzIHdpbGwgY2F1c2UgYW55IHBhY2thZ2UgZnJhZ21lbnRzIHRvIGJlIGFmZmVjdGVkCiAJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwogCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwpAQCAtMTg1LDcgKzE4OCw3IEBACiAJCX0KIAkJcmV0dXJuIGZyYWdtZW50czsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDbGFzc3BhdGhDaGFuZ2UpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTk2LDcgKzE5OSw3IEBACiAJICogR2VuZXJhdGVzIGEgY2xhc3NwYXRoIGNoYW5nZSBkZWx0YSBmb3IgdGhpcyBjbGFzc3BhdGggY2hhbmdlLgogCSAqIFJldHVybnMgd2hldGhlciBhIGRlbHRhIHdhcyBnZW5lcmF0ZWQsIGFuZCB3aGV0aGVyIHByb2plY3QgcmVmZXJlbmNlIGhhdmUgY2hhbmdlZC4KIAkgKi8KLQlwdWJsaWMgaW50IGdlbmVyYXRlRGVsdGEoSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCXB1YmxpYyBpbnQgZ2VuZXJhdGVEZWx0YShKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBib29sZWFuIGFkZENsYXNzcGF0aENoYW5nZSkgewogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJRGVsdGFQcm9jZXNzaW5nU3RhdGUgc3RhdGUgPSBtYW5hZ2VyLmRlbHRhU3RhdGU7CiAJCWlmIChzdGF0ZS5maW5kSmF2YVByb2plY3QodGhpcy5wcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpID09IG51bGwpCkBAIC0yMTEsNDEgKzIxNCw2OCBAQAogCQlpbnQgcmVzdWx0ID0gTk9fREVMVEE7CiAJCXRyeSB7CiAJCQlQZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IHRoaXMucHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpOwotCQkJCisKIAkJCS8vIGdldCBuZXcgaW5mbwotCQkJdGhpcy5wcm9qZWN0LnJlc29sdmVDbGFzc3BhdGgocGVyUHJvamVjdEluZm8pOworCQkJdGhpcy5wcm9qZWN0LnJlc29sdmVDbGFzc3BhdGgocGVyUHJvamVjdEluZm8sIGZhbHNlLypkb24ndCB1c2UgcHJldmlvdXMgc2Vzc2lvbiB2YWx1ZXMqLywgYWRkQ2xhc3NwYXRoQ2hhbmdlKTsKIAkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aDsKLQkJCQorCiAJCQkvLyB1c2Ugc3luY2hyb25pemVkIGJsb2NrIHRvIGVuc3VyZSBjb25zaXN0ZW5jeQogCQkJc3luY2hyb25pemVkIChwZXJQcm9qZWN0SW5mbykgewogCQkJCW5ld1Jhd0NsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLnJhd0NsYXNzcGF0aDsKLQkJCQluZXdSZXNvbHZlZENsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLnJlc29sdmVkQ2xhc3NwYXRoOwotCQkJCW5ld091dHB1dExvY2F0aW9uID0gcGVyUHJvamVjdEluZm8ub3V0cHV0TG9jYXRpb247CQkJCQorCQkJCW5ld1Jlc29sdmVkQ2xhc3NwYXRoID0gcGVyUHJvamVjdEluZm8uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJCQluZXdPdXRwdXRMb2NhdGlvbiA9IHBlclByb2plY3RJbmZvLm91dHB1dExvY2F0aW9uOwogCQkJfQotCQkJCisKKwkJCWlmIChuZXdSZXNvbHZlZENsYXNzcGF0aCA9PSBudWxsKSB7CisJCQkJLy8gYW5vdGhlciB0aHJlYWQgcmVzZXQgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCwgdXNlIGEgdGVtcG9yYXJ5IFBlclByb2plY3RJbmZvCisJCQkJUGVyUHJvamVjdEluZm8gdGVtcG9yYXJ5SW5mbyA9IHRoaXMucHJvamVjdC5uZXdUZW1wb3JhcnlJbmZvKCk7CisJCQkJdGhpcy5wcm9qZWN0LnJlc29sdmVDbGFzc3BhdGgodGVtcG9yYXJ5SW5mbywgZmFsc2UvKmRvbid0IHVzZSBwcmV2aW91cyBzZXNzaW9uIHZhbHVlcyovLCBhZGRDbGFzc3BhdGhDaGFuZ2UpOworCQkJCW5ld1Jhd0NsYXNzcGF0aCA9IHRlbXBvcmFyeUluZm8ucmF3Q2xhc3NwYXRoOworCQkJCW5ld1Jlc29sdmVkQ2xhc3NwYXRoID0gdGVtcG9yYXJ5SW5mby5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJCW5ld091dHB1dExvY2F0aW9uID0gdGVtcG9yYXJ5SW5mby5vdXRwdXRMb2NhdGlvbjsKKwkJCX0KKwogCQkJLy8gY2hlY2sgaWYgcmF3IGNsYXNzcGF0aCBoYXMgY2hhbmdlZAogCQkJaWYgKHRoaXMub2xkUmF3Q2xhc3NwYXRoICE9IG51bGwgJiYgIUphdmFQcm9qZWN0LmFyZUNsYXNzcGF0aHNFcXVhbCh0aGlzLm9sZFJhd0NsYXNzcGF0aCwgbmV3UmF3Q2xhc3NwYXRoLCB0aGlzLm9sZE91dHB1dExvY2F0aW9uLCBuZXdPdXRwdXRMb2NhdGlvbikpIHsKIAkJCQlkZWx0YS5jaGFuZ2VkKHRoaXMucHJvamVjdCwgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCk7CiAJCQkJcmVzdWx0IHw9IEhBU19ERUxUQTsKKworCQkJCS8vIHJlc2V0IGNvbnRhaW5lcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9uIHRoZSBjbGFzc3BhdGgKKwkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk0NDYpCisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMub2xkUmF3Q2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHRoaXMub2xkUmF3Q2xhc3NwYXRoW2ldOworCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKKwkJCQkJCWlmIChjbGFzc3BhdGhDb250YWlucyhuZXdSYXdDbGFzc3BhdGgsIGVudHJ5KSA9PSAtMSkKKwkJCQkJCQltYW5hZ2VyLmNvbnRhaW5lclB1dCh0aGlzLnByb2plY3QsIGVudHJ5LmdldFBhdGgoKSwgbnVsbCk7CisJCQkJCX0KKwkJCQl9CiAJCQl9Ci0JCQkJCQorCiAJCQkvLyBpZiBubyBjaGFuZ2VzIHRvIHJlc29sdmVkIGNsYXNzcGF0aCwgbm90aGluZyBtb3JlIHRvIGRvCiAJCQlpZiAodGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aCAhPSBudWxsICYmIEphdmFQcm9qZWN0LmFyZUNsYXNzcGF0aHNFcXVhbCh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoLCBuZXdSZXNvbHZlZENsYXNzcGF0aCwgdGhpcy5vbGRPdXRwdXRMb2NhdGlvbiwgbmV3T3V0cHV0TG9jYXRpb24pKQotCQkJCXJldHVybiBOT19ERUxUQTsKLQkJCQorCQkJCXJldHVybiByZXN1bHQ7CisKIAkJCS8vIGNsb3NlIGNhY2hlZCBpbmZvCiAJCQl0aGlzLnByb2plY3QuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsJCisKKwkJCS8vIGVuc3VyZSBjYWNoZXMgb2YgZGVwZW5kZW50IHByb2plY3RzIGFyZSByZXNldCBhcyB3ZWxsIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzg5MCkKKwkJCWRlbHRhUHJvY2Vzc29yLnByb2plY3RDYWNoZXNUb1Jlc2V0LmFkZCh0aGlzLnByb2plY3QpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJaWYgKERlbHRhUHJvY2Vzc29yLlZFUkJPU0UpIHsKIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJfQogCQkJLy8gcHJvamVjdCBubyBsb25nZXIgZXhpc3QKLQkJCXJldHVybiBOT19ERUxUQTsKKwkJCXJldHVybiByZXN1bHQ7CiAJCX0KLQkJCisKIAkJaWYgKHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBOT19ERUxUQTsKLQkJCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWRlbHRhLmNoYW5nZWQodGhpcy5wcm9qZWN0LCBJSmF2YUVsZW1lbnREZWx0YS5GX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKTsKKwkJcmVzdWx0IHw9IEhBU19ERUxUQTsKKworCQlzdGF0ZS5hZGRGb3JSZWZyZXNoKHRoaXMucHJvamVjdCk7IC8vIGVuc3VyZSBleHRlcm5hbCBqYXJzIGFyZSByZWZyZXNoZWQgZm9yIHRoaXMgcHJvamVjdCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI3NjkgKQorCiAJCU1hcCByZW1vdmVkUm9vdHMgPSBudWxsOwogCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gbnVsbDsKIAkJTWFwIGFsbE9sZFJvb3RzIDsKQEAgLTI2MSwyMSArMjkxLDI1IEBACiAJCX0KIAogCQlpbnQgbmV3TGVuZ3RoID0gbmV3UmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOwotCQlpbnQgb2xkTGVuZ3RoID0gdGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aC5sZW5ndGg7CQkKKwkJaW50IG9sZExlbmd0aCA9IHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7CiAJCQlpbnQgaW5kZXggPSBjbGFzc3BhdGhDb250YWlucyhuZXdSZXNvbHZlZENsYXNzcGF0aCwgdGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aFtpXSk7CiAJCQlpZiAoaW5kZXggPT0gLTEpIHsKIAkJCQkvLyByZW1vdGUgcHJvamVjdCBjaGFuZ2VzCi0JCQkJaWYgKHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CisJCQkJaW50IGVudHJ5S2luZCA9IHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCk7CisJCQkJaWYgKGVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIHsKIAkJCQkJcmVzdWx0IHw9IEhBU19QUk9KRUNUX0NIQU5HRTsKLQkJCQkJY29udGludWU7IAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCQkJcmVzdWx0IHw9IEhBU19MSUJSQVJZX0NIQU5HRTsKIAkJCQl9CiAKIAkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBrZ0ZyYWdtZW50Um9vdHMgPSBudWxsOwogCQkJCWlmIChyZW1vdmVkUm9vdHMgIT0gbnVsbCkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBvbGRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSAgcmVtb3ZlZFJvb3RzLmdldCh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLmdldFBhdGgoKSk7CisJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgb2xkUm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSAgcmVtb3ZlZFJvb3RzLmdldCh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLmdldFBhdGgoKSk7CiAJCQkJCWlmIChvbGRSb290ICE9IG51bGwpIHsgLy8gdXNlIG9sZCByb290IGlmIGFueSAoY291bGQgYmUgbm9uZSBpZiBlbnRyeSB3YXNuJ3QgYm91bmQpCi0JCQkJCQlwa2dGcmFnbWVudFJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W10geyBvbGRSb290IH07CisJCQkJCQlwa2dGcmFnbWVudFJvb3RzID0gbmV3IFBhY2thZ2VGcmFnbWVudFJvb3RbXSB7IG9sZFJvb3QgfTsKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAocGtnRnJhZ21lbnRSb290cyA9PSBudWxsKSB7CkBAIC0yODQsMzIgKzMxOCw0OSBAQAogCQkJCQkJSGFzaFNldCByb290SURzID0gbmV3IEhhc2hTZXQoNSk7CiAJCQkJCQlyb290SURzLmFkZCh0aGlzLnByb2plY3Qucm9vdElEKCkpOwogCQkJCQkJdGhpcy5wcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJCQkJCQl0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLCAKLQkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLCAKKwkJCQkJCQl0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLAorCQkJCQkJCWFjY3VtdWxhdGVkUm9vdHMsCiAJCQkJCQkJcm9vdElEcywKIAkJCQkJCQludWxsLCAvLyBpbnNpZGUgb3JpZ2luYWwgcHJvamVjdAotCQkJCQkJCWZhbHNlLCAvLyBkb24ndCBjaGVjayBleGlzdGVuY3kKIAkJCQkJCQlmYWxzZSwgLy8gZG9uJ3QgcmV0cmlldmUgZXhwb3J0ZWQgcm9vdHMKIAkJCQkJCQludWxsKTsgLypubyByZXZlcnNlIG1hcCovCi0JCQkJCQlwa2dGcmFnbWVudFJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W2FjY3VtdWxhdGVkUm9vdHMuc2l6ZSgpXTsKKwkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU5ODYKKwkJCQkJCS8vIFdoZW4gYSBwYWNrYWdlIGZyYWdtZW50J3MgY29ycmVzcG9uZGluZyByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIHByb2plY3QsIAorCQkJCQkJLy8gSUphdmFQcm9qZWN0I2NvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygpIGRvZXNuJ3QgaW5jbHVkZSB0aGF0IGVudHJ5LiBIZW5jZSAKKwkJCQkJCS8vIHRoZSBjYWNoZSBiZWNvbWUgbmVjZXNzYXJ5IGluIHN1Y2ggY2FzZXMuIEFkZCB0aGUgY2FjaGUgdG8gdGhlIGFjY3VtdWxhdGVkUm9vdHMgCisJCQkJCQkvLyBvbmx5IHdoZW4gaXQncyBub3QgYWxyZWFkeSBwcmVzZW50LgorCQkJCQkJUm9vdEluZm8gcm9vdEluZm8gPSAoUm9vdEluZm8pIHN0YXRlLm9sZFJvb3RzLmdldCh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLmdldFBhdGgoKSk7CisJCQkJCQlpZiAocm9vdEluZm8gIT0gbnVsbCAmJiByb290SW5mby5jYWNoZSAhPSBudWxsKSB7CisJCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgb2xkUm9vdCA9IHJvb3RJbmZvLmNhY2hlOworCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjY3VtdWxhdGVkUm9vdHMuc2l6ZSgpOyBqKyspIHsKKwkJCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgYWNjdW11bGF0ZWRSb290cy5lbGVtZW50QXQoaik7CisJCQkJCQkJCWlmICghcm9vdC5nZXRQYXRoKCkuZXF1YWxzKG9sZFJvb3QuZ2V0UGF0aCgpKSkgeworCQkJCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaWYgKCFmb3VuZCkKKwkJCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQob2xkUm9vdCk7CisJCQkJCQl9CisKKwkJCQkJCXBrZ0ZyYWdtZW50Um9vdHMgPSBuZXcgUGFja2FnZUZyYWdtZW50Um9vdFthY2N1bXVsYXRlZFJvb3RzLnNpemUoKV07CiAJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLmNvcHlJbnRvKHBrZ0ZyYWdtZW50Um9vdHMpOwogCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJcGtnRnJhZ21lbnRSb290cyA9ICBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSB7fTsKKwkJCQkJCXBrZ0ZyYWdtZW50Um9vdHMgPSAgbmV3IFBhY2thZ2VGcmFnbWVudFJvb3RbXSB7fTsKIAkJCQkJfQogCQkJCX0KIAkJCQlhZGRDbGFzc3BhdGhEZWx0YXMoZGVsdGEsIHBrZ0ZyYWdtZW50Um9vdHMsIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCk7Ci0JCQkJcmVzdWx0IHw9IEhBU19ERUxUQTsKIAkJCX0gZWxzZSB7CiAJCQkJLy8gcmVtb3RlIHByb2plY3QgY2hhbmdlcwogCQkJCWlmICh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewogCQkJCQlyZXN1bHQgfD0gSEFTX1BST0pFQ1RfQ0hBTkdFOwotCQkJCQljb250aW51ZTsgCi0JCQkJfQkJCQkKKwkJCQkJY29udGludWU7CisJCQkJfQogCQkJCWlmIChpbmRleCAhPSBpKSB7IC8vcmVvcmRlcmluZyBvZiB0aGUgY2xhc3NwYXRoCiAJCQkJCWFkZENsYXNzcGF0aERlbHRhcyhkZWx0YSwgdGhpcy5wcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldKSwJSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKTsKLQkJCQkJcmVzdWx0IHw9IEhBU19ERUxUQTsKIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyBjaGVjayBzb3VyY2UgYXR0YWNobWVudAogCQkJCUlQYXRoIG5ld1NvdXJjZVBhdGggPSBuZXdSZXNvbHZlZENsYXNzcGF0aFtpbmRleF0uZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKIAkJCQlpbnQgc291cmNlQXR0YWNobWVudEZsYWdzID0gZ2V0U291cmNlQXR0YWNobWVudERlbHRhRmxhZyh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIG5ld1NvdXJjZVBhdGgpOwpAQCAtMzE5LDcgKzM3MCw2IEBACiAJCQkJaW50IGZsYWdzID0gc291cmNlQXR0YWNobWVudEZsYWdzIHwgc291cmNlQXR0YWNobWVudFJvb3RGbGFnczsKIAkJCQlpZiAoZmxhZ3MgIT0gMCkgewogCQkJCQlhZGRDbGFzc3BhdGhEZWx0YXMoZGVsdGEsIHRoaXMucHJvamVjdC5jb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHModGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aFtpXSksIGZsYWdzKTsKLQkJCQkJcmVzdWx0IHw9IEhBU19ERUxUQTsKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAob2xkUm9vdFBhdGggPT0gbnVsbCAmJiBuZXdSb290UGF0aCA9PSBudWxsKSB7CiAJCQkJCQkvLyBpZiBzb3VyY2UgcGF0aCBpcyBzcGVjaWZpZWQgYW5kIG5vIHJvb3QgcGF0aCwgaXQgbmVlZHMgdG8gYmUgcmVjb21wdXRlZCBkeW5hbWljYWxseQpAQCAtMzQzLDM2ICszOTMsMzcgQEAKIAkJCWludCBpbmRleCA9IGNsYXNzcGF0aENvbnRhaW5zKHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGgsIG5ld1Jlc29sdmVkQ2xhc3NwYXRoW2ldKTsKIAkJCWlmIChpbmRleCA9PSAtMSkgewogCQkJCS8vIHJlbW90ZSBwcm9qZWN0IGNoYW5nZXMKLQkJCQlpZiAobmV3UmVzb2x2ZWRDbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CisJCQkJaW50IGVudHJ5S2luZCA9IG5ld1Jlc29sdmVkQ2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpOworCQkJCWlmIChlbnRyeUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CiAJCQkJCXJlc3VsdCB8PSBIQVNfUFJPSkVDVF9DSEFOR0U7Ci0JCQkJCWNvbnRpbnVlOyAKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChlbnRyeUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7CisJCQkJCXJlc3VsdCB8PSBIQVNfTElCUkFSWV9DSEFOR0U7CiAJCQkJfQogCQkJCWFkZENsYXNzcGF0aERlbHRhcyhkZWx0YSwgdGhpcy5wcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhuZXdSZXNvbHZlZENsYXNzcGF0aFtpXSksIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKTsKLQkJCQlyZXN1bHQgfD0gSEFTX0RFTFRBOwogCQkJfSAvLyBjbGFzc3BhdGggcmVvcmRlcmluZyBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCBpbiBwcmV2aW91cyBsb29wCiAJCX0KIAogCQkvLyBzZWUgaWYgYSBjaGFuZ2UgaW4gb3V0cHV0IGxvY2F0aW9uIHdpbGwgY2F1c2UgYW55IHBhY2thZ2UgZnJhZ21lbnRzIHRvIGJlIGFkZGVkL3JlbW92ZWQKLQkJaWYgKChuZXdPdXRwdXRMb2NhdGlvbiA9PSBudWxsICYmIHRoaXMub2xkT3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgCisJCWlmICgobmV3T3V0cHV0TG9jYXRpb24gPT0gbnVsbCAmJiB0aGlzLm9sZE91dHB1dExvY2F0aW9uICE9IG51bGwpCiAJCQkJfHwgKG5ld091dHB1dExvY2F0aW9uICE9IG51bGwgJiYgIW5ld091dHB1dExvY2F0aW9uLmVxdWFscyh0aGlzLm9sZE91dHB1dExvY2F0aW9uKSkpIHsKIAkJCXRyeSB7Ci0JCQkJQXJyYXlMaXN0IGFkZGVkPSBkZXRlcm1pbmVBZmZlY3RlZFBhY2thZ2VGcmFnbWVudHModGhpcy5vbGRPdXRwdXRMb2NhdGlvbik7CisJCQkJQXJyYXlMaXN0IGFkZGVkID0gZGV0ZXJtaW5lQWZmZWN0ZWRQYWNrYWdlRnJhZ21lbnRzKHRoaXMub2xkT3V0cHV0TG9jYXRpb24pOwogCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhZGRlZC5pdGVyYXRvcigpOwogCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSl7CiAJCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZz0gKElQYWNrYWdlRnJhZ21lbnQpaXRlci5uZXh0KCk7CiAJCQkJCSgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZnJhZy5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKIAkJCQkJZGVsdGEuYWRkZWQoZnJhZyk7Ci0JCQkJCXJlc3VsdCB8PSBIQVNfREVMVEE7CiAJCQkJfQotCQkJCisKIAkJCQkvLyBzZWUgaWYgdGhpcyB3aWxsIGNhdXNlIGFueSBwYWNrYWdlIGZyYWdtZW50cyB0byBiZSByZW1vdmVkCi0JCQkJQXJyYXlMaXN0IHJlbW92ZWQ9IGRldGVybWluZUFmZmVjdGVkUGFja2FnZUZyYWdtZW50cyhuZXdPdXRwdXRMb2NhdGlvbik7CisJCQkJQXJyYXlMaXN0IHJlbW92ZWQgPSBkZXRlcm1pbmVBZmZlY3RlZFBhY2thZ2VGcmFnbWVudHMobmV3T3V0cHV0TG9jYXRpb24pOwogCQkJCWl0ZXIgPSByZW1vdmVkLml0ZXJhdG9yKCk7CiAJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CiAJCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZz0gKElQYWNrYWdlRnJhZ21lbnQpaXRlci5uZXh0KCk7Ci0JCQkJCSgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZnJhZy5nZXRQYXJlbnQoKSkuY2xvc2UoKTsgCisJCQkJCSgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZnJhZy5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKIAkJCQkJZGVsdGEucmVtb3ZlZChmcmFnKTsKLQkJCQkJcmVzdWx0IHw9IEhBU19ERUxUQTsKIAkJCQl9CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCWlmIChEZWx0YVByb2Nlc3Nvci5WRVJCT1NFKQpAQCAtMzgyLDcgKzQzMyw3IEBACiAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgdGhlIHNvdXJjZSBhdHRhY2htZW50IGZsYWcgZm9yIHRoZSBkZWx0YSBiZXR3ZWVuIHRoZSAyIGdpdmUgc291cmNlIHBhdGhzLgogCSAqIFJldHVybnMgZWl0aGVyIEZfU09VUkNFQVRUQUNIRUQsIEZfU09VUkNFREVUQUNIRUQsIEZfU09VUkNFQVRUQUNIRUQgfCBGX1NPVVJDRURFVEFDSEVECkBAIC00MDMsNyArNDU0LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCQorCiAJcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJcmV0dXJuIHRoaXMucHJvamVjdC5oYXNoQ29kZSgpOwogCX0KQEAgLTQxNSwxMSArNDY2LDExIEBACiAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkQ2xhc3NwYXRoID0gbnVsbDsKIAkJdHJ5IHsKIAkJCW5ld1Jlc29sdmVkQ2xhc3NwYXRoID0gdGhpcy5wcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJLy8gcHJvamVjdCBkb2Vzbid0IGV4aXN0CiAJCQlyZXR1cm47CiAJCX0KLQkJCisKIAkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBtYW5hZ2VyLmluZGV4TWFuYWdlcjsKIAkJaWYgKGluZGV4TWFuYWdlciA9PSBudWxsKQpAQCAtNDI3LDEzICs0NzgsMTMgQEAKIAkJRGVsdGFQcm9jZXNzaW5nU3RhdGUgc3RhdGUgPSBtYW5hZ2VyLmRlbHRhU3RhdGU7CiAKIAkJaW50IG5ld0xlbmd0aCA9IG5ld1Jlc29sdmVkQ2xhc3NwYXRoLmxlbmd0aDsKLQkJaW50IG9sZExlbmd0aCA9IHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOwkJCisJCWludCBvbGRMZW5ndGggPSB0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwgPyAwIDogdGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aC5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKIAkJCWludCBpbmRleCA9IGNsYXNzcGF0aENvbnRhaW5zKG5ld1Jlc29sdmVkQ2xhc3NwYXRoLCB0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoW2ldKTsKIAkJCWlmIChpbmRleCA9PSAtMSkgewogCQkJCS8vIHJlbW90ZSBwcm9qZWN0cyBhcmUgbm90IGluZGV4ZWQgaW4gdGhpcyBwcm9qZWN0CiAJCQkJaWYgKHRoaXMub2xkUmVzb2x2ZWRDbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKXsKLQkJCQkJY29udGludWU7IAorCQkJCQljb250aW51ZTsKIAkJCQl9CiAKIAkJCQkvLyBSZW1vdmUgdGhlIC5qYXZhIGZpbGVzIGZyb20gdGhlIGluZGV4IGZvciBhIHNvdXJjZSBmb2xkZXIKQEAgLTQ2Myw5ICs1MTQsOSBAQAogCQkJaWYgKGluZGV4ID09IC0xKSB7CiAJCQkJLy8gcmVtb3RlIHByb2plY3RzIGFyZSBub3QgaW5kZXhlZCBpbiB0aGlzIHByb2plY3QKIAkJCQlpZiAobmV3UmVzb2x2ZWRDbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKXsKLQkJCQkJY29udGludWU7IAorCQkJCQljb250aW51ZTsKIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyBSZXF1ZXN0IGluZGV4aW5nCiAJCQkJaW50IGVudHJ5S2luZCA9IG5ld1Jlc29sdmVkQ2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpOwogCQkJCXN3aXRjaCAoZW50cnlLaW5kKSB7CkBAIC00OTQsNyArNTQ1LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCXJldHVybiAiQ2xhc3NwYXRoQ2hhbmdlOiAiICsgdGhpcy5wcm9qZWN0LmdldEVsZW1lbnROYW1lKCk7IC8vJE5PTi1OTFMtMSQKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoRW50cnkuamF2YQppbmRleCA0Mjc4YWMyLi42Y2ZjOTg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTggKzEyLDI1IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwpAQCAtNDAsOSArNDcsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSZXN0cmljdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NYW5pZmVzdEFuYWx5emVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKQEAgLTU2LDkgKzY1LDE5IEBACiAgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQogICovCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRW50cnkgaW1wbGVtZW50cyBJQ2xhc3NwYXRoRW50cnkgeworCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJCQorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTcxNjk5MzgwNzIxMTg5NTcyTDsKKworCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCQlzdXBlcihtZXNzYWdlKTsKKwkJfQorCX0KIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTEFTU1BBVEhFTlRSWSA9ICJjbGFzc3BhdGhlbnRyeSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVGRVJFTkNFRF9FTlRSWSA9ICJyZWZlcmVuY2VkZW50cnkiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09VVFBVVCA9ICJvdXRwdXQiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0tJTkQgPSAia2luZCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJApAQCAtMTIzLDYgKzE0Miw5IEBACiAJcHJpdmF0ZSBJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zOwogCXByaXZhdGUgY2hhcltdW10gZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFyczsKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW11bXSBVTklOSVRfUEFUVEVSTlMgPSBuZXcgY2hhcltdW10geyAiTm9uLWluaXRpYWxpemVkIHlldCIudG9DaGFyQXJyYXkoKSB9OyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBDbGFzc3BhdGhFbnRyeVtdIE5PX0VOVFJJRVMgPSBuZXcgQ2xhc3NwYXRoRW50cnlbMF07CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSVBhdGhbXSBOT19QQVRIUyA9IG5ldyBJUGF0aFswXTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKIAogCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQWNjZXNzUnVsZXM7CiAKQEAgLTE3Niw2ICsxOTgsMTEgQEAKIAkgKiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KIAkgKi8KIAlwdWJsaWMgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOworCQorCS8qKgorCSAqIFNlZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I2dldFJlZmVyZW5jaW5nRW50cnkoKX0KKwkgKi8KKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IHJlZmVyZW5jaW5nRW50cnk7CiAKIAkvKioKIAkgKiBTcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24gKGZvciB0aGlzIHNvdXJjZSBlbnRyeSkKQEAgLTE4NiwxNyArMjEzLDQ4IEBACiAJICogQSBjb25zdGFudCBpbmRpY2F0aW5nIGFuIG91dHB1dCBsb2NhdGlvbi4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX09VVFBVVCA9IDEwOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9ET1QgPSAiLi4iOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBUaGUgZXhwb3J0IGZsYWcKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkOwogCi0JLyoKKwkvKioKIAkgKiBUaGUgZXh0cmEgYXR0cmlidXRlcwogCSAqLwotCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXM7CisJcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXM7CiAKKwlwdWJsaWMgQ2xhc3NwYXRoRW50cnkoCisJCQlpbnQgY29udGVudEtpbmQsCisJCQlpbnQgZW50cnlLaW5kLAorCQkJSVBhdGggcGF0aCwKKwkJCUlQYXRoW10gaW5jbHVzaW9uUGF0dGVybnMsCisJCQlJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zLAorCQkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsCisJCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCisJCQlJUGF0aCBzcGVjaWZpY091dHB1dExvY2F0aW9uLAorCQkJYm9vbGVhbiBpc0V4cG9ydGVkLAorCQkJSUFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywKKwkJCWJvb2xlYW4gY29tYmluZUFjY2Vzc1J1bGVzLAorCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcykgeworCisJCXRoaXMoCWNvbnRlbnRLaW5kLCAKKwkJCQllbnRyeUtpbmQsIAorCQkJCXBhdGgsIAorCQkJCWluY2x1c2lvblBhdHRlcm5zLCAKKwkJCQlleGNsdXNpb25QYXR0ZXJucywgCisJCQkJc291cmNlQXR0YWNobWVudFBhdGgsIAorCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgCisJCQkJc3BlY2lmaWNPdXRwdXRMb2NhdGlvbiwKKwkJCQludWxsLAorCQkJCWlzRXhwb3J0ZWQsCisJCQkJYWNjZXNzUnVsZXMsCisJCQkJY29tYmluZUFjY2Vzc1J1bGVzLAorCQkJCWV4dHJhQXR0cmlidXRlcyk7CisJfQorCQogCS8qKgogCSAqIENyZWF0ZXMgYSBjbGFzcyBwYXRoIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQga2luZCB3aXRoIHRoZSBnaXZlbiBwYXRoLgogCSAqLwpAQCAtMjA5LDYgKzI2Nyw3IEBACiAJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLAogCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCiAJCUlQYXRoIHNwZWNpZmljT3V0cHV0TG9jYXRpb24sCisJCUlDbGFzc3BhdGhFbnRyeSByZWZlcmVuY2luZ0VudHJ5LAogCQlib29sZWFuIGlzRXhwb3J0ZWQsCiAJCUlBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXMsCiAJCWJvb2xlYW4gY29tYmluZUFjY2Vzc1J1bGVzLApAQCAtMjE5LDEyICsyNzgsMjggQEAKIAkJdGhpcy5wYXRoID0gcGF0aDsKIAkJdGhpcy5pbmNsdXNpb25QYXR0ZXJucyA9IGluY2x1c2lvblBhdHRlcm5zOwogCQl0aGlzLmV4Y2x1c2lvblBhdHRlcm5zID0gZXhjbHVzaW9uUGF0dGVybnM7Ci0KKwkJdGhpcy5yZWZlcmVuY2luZ0VudHJ5ID0gcmVmZXJlbmNpbmdFbnRyeTsKKwkJCiAJCWludCBsZW5ndGg7CiAJCWlmIChhY2Nlc3NSdWxlcyAhPSBudWxsICYmIChsZW5ndGggPSBhY2Nlc3NSdWxlcy5sZW5ndGgpID4gMCkgewogCQkJQWNjZXNzUnVsZVtdIHJ1bGVzID0gbmV3IEFjY2Vzc1J1bGVbbGVuZ3RoXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYWNjZXNzUnVsZXMsIDAsIHJ1bGVzLCAwLCBsZW5ndGgpOwotCQkJdGhpcy5hY2Nlc3NSdWxlU2V0ID0gbmV3IEFjY2Vzc1J1bGVTZXQocnVsZXMsIGdldE1lc3NhZ2VUZW1wbGF0ZXMoKSk7CisJCQlieXRlIGNsYXNzcGF0aEVudHJ5VHlwZTsKKwkJCVN0cmluZyBjbGFzc3BhdGhFbnRyeU5hbWU7CisJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJCWlmICh0aGlzLmVudHJ5S2luZCA9PSBDUEVfUFJPSkVDVCB8fCB0aGlzLmVudHJ5S2luZCA9PSBDUEVfU09VUkNFKSB7IC8vIGNhbiBiZSByZW1vdGUgc291cmNlIGVudHJ5IHdoZW4gcmVjb25jaWxpbmcKKwkJCQljbGFzc3BhdGhFbnRyeVR5cGUgPSBBY2Nlc3NSZXN0cmljdGlvbi5QUk9KRUNUOworCQkJCWNsYXNzcGF0aEVudHJ5TmFtZSA9IG1hbmFnZXIuaW50ZXJuKGdldFBhdGgoKS5zZWdtZW50KDApKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xhc3NwYXRoRW50cnlUeXBlID0gQWNjZXNzUmVzdHJpY3Rpb24uTElCUkFSWTsKKwkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFdvcmtzcGFjZVRhcmdldChwYXRoKTsKKwkJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJCQkJY2xhc3NwYXRoRW50cnlOYW1lID0gbWFuYWdlci5pbnRlcm4ocGF0aC50b09TU3RyaW5nKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWNsYXNzcGF0aEVudHJ5TmFtZSA9IG1hbmFnZXIuaW50ZXJuKHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5hY2Nlc3NSdWxlU2V0ID0gbmV3IEFjY2Vzc1J1bGVTZXQocnVsZXMsIGNsYXNzcGF0aEVudHJ5VHlwZSwgY2xhc3NwYXRoRW50cnlOYW1lKTsKIAkJfQogLy8JCWVsc2UgeyAtLSBpbXBsaWNpdCEKIC8vCQkJdGhpcy5hY2Nlc3NSdWxlU2V0ID0gbnVsbDsKQEAgLTQ1MSw3ICs1MjYsNyBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIFhNTCBlbmNvZGluZyBvZiB0aGUgY2xhc3MgcGF0aC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50RW5jb2RlKFhNTFdyaXRlciB3cml0ZXIsIElQYXRoIHByb2plY3RQYXRoLCBib29sZWFuIGluZGVudCwgYm9vbGVhbiBuZXdMaW5lLCBNYXAgdW5rbm93bkVsZW1lbnRzKSB7CisJcHVibGljIHZvaWQgZWxlbWVudEVuY29kZShYTUxXcml0ZXIgd3JpdGVyLCBJUGF0aCBwcm9qZWN0UGF0aCwgYm9vbGVhbiBpbmRlbnQsIGJvb2xlYW4gbmV3TGluZSwgTWFwIHVua25vd25FbGVtZW50cywgYm9vbGVhbiBpc1JlZmVyZW5jZWRFbnRyeSkgewogCQlIYXNoTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOwogCiAJCXBhcmFtZXRlcnMucHV0KFRBR19LSU5ELCBDbGFzc3BhdGhFbnRyeS5raW5kVG9TdHJpbmcodGhpcy5lbnRyeUtpbmQpKTsKQEAgLTUxNSwxMiArNTkwLDE1IEBACiAJCWJvb2xlYW4gaGFzUmVzdHJpY3Rpb25zID0gZ2V0QWNjZXNzUnVsZVNldCgpICE9IG51bGw7IC8vIGFjY2VzcyBydWxlIHNldCBpcyBudWxsIGlmIG5vIGFjY2VzcyBydWxlcwogCQlBcnJheUxpc3QgdW5rbm93bkNoaWxkcmVuID0gdW5rbm93blhtbEVsZW1lbnRzICE9IG51bGwgPyB1bmtub3duWG1sRWxlbWVudHMuY2hpbGRyZW4gOiBudWxsOwogCQlib29sZWFuIGhhc1Vua25vd25DaGlsZHJlbiA9IHVua25vd25DaGlsZHJlbiAhPSBudWxsOworCQkKKwkJLyogY2xvc2UgdGFnIGlmIG5vIGV4dHJhIGF0dHJpYnV0ZXMsIG5vIHJlc3RyaWN0aW9uIGFuZCBubyB1bmtub3duIGNoaWxkcmVuICovCisJCVN0cmluZyB0YWdOYW1lID0gaXNSZWZlcmVuY2VkRW50cnkgPyBUQUdfUkVGRVJFTkNFRF9FTlRSWSA6IFRBR19DTEFTU1BBVEhFTlRSWTsgCiAJCXdyaXRlci5wcmludFRhZygKLQkJCVRBR19DTEFTU1BBVEhFTlRSWSwKKwkJCXRhZ05hbWUsCiAJCQlwYXJhbWV0ZXJzLAogCQkJaW5kZW50LAogCQkJbmV3TGluZSwKLQkJCSFoYXNFeHRyYUF0dHJpYnV0ZXMgJiYgIWhhc1Jlc3RyaWN0aW9ucyAmJiAhaGFzVW5rbm93bkNoaWxkcmVuLypjbG9zZSB0YWcgaWYgbm8gZXh0cmEgYXR0cmlidXRlcywgbm8gcmVzdHJpY3Rpb24gYW5kIG5vIHVua25vd24gY2hpbGRyZW4qLyk7CisJCQkhaGFzRXh0cmFBdHRyaWJ1dGVzICYmICFoYXNSZXN0cmljdGlvbnMgJiYgIWhhc1Vua25vd25DaGlsZHJlbik7CiAKIAkJaWYgKGhhc0V4dHJhQXR0cmlidXRlcykKIAkJCWVuY29kZUV4dHJhQXR0cmlidXRlcyh3cml0ZXIsIGluZGVudCwgbmV3TGluZSk7CkBAIC01MzIsNyArNjEwLDcgQEAKIAkJCWVuY29kZVVua25vd25DaGlsZHJlbih3cml0ZXIsIGluZGVudCwgbmV3TGluZSwgdW5rbm93bkNoaWxkcmVuKTsKIAogCQlpZiAoaGFzRXh0cmFBdHRyaWJ1dGVzIHx8IGhhc1Jlc3RyaWN0aW9ucyB8fCBoYXNVbmtub3duQ2hpbGRyZW4pCi0JCQl3cml0ZXIuZW5kVGFnKFRBR19DTEFTU1BBVEhFTlRSWSwgaW5kZW50LCB0cnVlLyppbnNlcnQgbmV3IGxpbmUqLyk7CisJCQl3cml0ZXIuZW5kVGFnKHRhZ05hbWUsIGluZGVudCwgdHJ1ZS8qaW5zZXJ0IG5ldyBsaW5lKi8pOwogCX0KIAogCXZvaWQgZW5jb2RlRXh0cmFBdHRyaWJ1dGVzKFhNTFdyaXRlciB3cml0ZXIsIGJvb2xlYW4gaW5kZW50LCBib29sZWFuIG5ld0xpbmUpIHsKQEAgLTYwMCw3ICs2NzgsOSBAQAogCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aEF0dHIpOwogCQlpbnQga2luZCA9IGtpbmRGcm9tU3RyaW5nKGtpbmRBdHRyKTsKIAkJaWYgKGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAmJiBraW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmICFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJcGF0aCA9IHByb2plY3RQYXRoLmFwcGVuZChwYXRoKTsKKwkJCWlmICghKHBhdGguc2VnbWVudENvdW50KCkgPiAwICYmIHBhdGguc2VnbWVudCgwKS5lcXVhbHMoQ2xhc3NwYXRoRW50cnkuRE9UX0RPVCkpKSB7CisJCQkJcGF0aCA9IHByb2plY3RQYXRoLmFwcGVuZChwYXRoKTsKKwkJCX0KIAkJfQogCQkvLyBzb3VyY2UgYXR0YWNobWVudCBpbmZvIChvcHRpb25hbCkKIAkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGggPQpAQCAtNjgwLDE4ICs3NjAsMTggQEAKIAogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgogCQkJCWVudHJ5ID0gbmV3IENsYXNzcGF0aEVudHJ5KAotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAotCQkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwKLQkJCQlwYXRoLAotCQkJCUNsYXNzcGF0aEVudHJ5LklOQ0xVREVfQUxMLCAvLyBpbmNsdXNpb24gcGF0dGVybnMKLQkJCQlDbGFzc3BhdGhFbnRyeS5FWENMVURFX05PTkUsIC8vIGV4Y2x1c2lvbiBwYXR0ZXJucwotCQkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50Ci0JCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAotCQkJCW51bGwsIC8vIHNwZWNpZmljIG91dHB1dCBmb2xkZXIKLQkJCQlpc0V4cG9ydGVkLAotCQkJCWFjY2Vzc1J1bGVzLAotCQkJCWNvbWJpbmVBY2Nlc3NSZXN0cmljdGlvbnMsCi0JCQkJZXh0cmFBdHRyaWJ1dGVzKTsKKwkJCQkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAorCQkJCQkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNULAorCQkJCQkJCQkJCQkJcGF0aCwKKwkJCQkJCQkJCQkJCUNsYXNzcGF0aEVudHJ5LklOQ0xVREVfQUxMLCAvLyBpbmNsdXNpb24gcGF0dGVybnMKKwkJCQkJCQkJCQkJCUNsYXNzcGF0aEVudHJ5LkVYQ0xVREVfTk9ORSwgLy8gZXhjbHVzaW9uIHBhdHRlcm5zCisJCQkJCQkJCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAorCQkJCQkJCQkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAorCQkJCQkJCQkJCQkJbnVsbCwgLy8gc3BlY2lmaWMgb3V0cHV0IGZvbGRlcgorCQkJCQkJCQkJCQkJaXNFeHBvcnRlZCwKKwkJCQkJCQkJCQkJCWFjY2Vzc1J1bGVzLAorCQkJCQkJCQkJCQkJY29tYmluZUFjY2Vzc1Jlc3RyaWN0aW9ucywKKwkJCQkJCQkJCQkJCWV4dHJhQXR0cmlidXRlcyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CiAJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCkBAIC03MDYsNyArNzg2LDEyIEBACiAJCQkJLy8gbXVzdCBiZSBhbiBlbnRyeSBpbiB0aGlzIHByb2plY3Qgb3Igc3BlY2lmeSBhbm90aGVyIHByb2plY3QKIAkJCQlTdHJpbmcgcHJvalNlZ21lbnQgPSBwYXRoLnNlZ21lbnQoMCk7CiAJCQkJaWYgKHByb2pTZWdtZW50ICE9IG51bGwgJiYgcHJvalNlZ21lbnQuZXF1YWxzKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpIHsgLy8gdGhpcyBwcm9qZWN0Ci0JCQkJCWVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocGF0aCwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zLCBvdXRwdXRMb2NhdGlvbiwgZXh0cmFBdHRyaWJ1dGVzKTsKKwkJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeSgKKwkJCQkJCQkJCQkJCXBhdGgsIAorCQkJCQkJCQkJCQkJaW5jbHVzaW9uUGF0dGVybnMsIAorCQkJCQkJCQkJCQkJZXhjbHVzaW9uUGF0dGVybnMsIAorCQkJCQkJCQkJCQkJb3V0cHV0TG9jYXRpb24sIAorCQkJCQkJCQkJCQkJZXh0cmFBdHRyaWJ1dGVzKTsKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CiAJCQkJCQkvLyBhbm90aGVyIHByb2plY3QKQEAgLTcxOCw0MSArODAzLDQ2IEBACiAJCQkJCQkJCQkJCQlpc0V4cG9ydGVkKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIGFuIGludmFsaWQgc291cmNlIGZvbGRlcgotCQkJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIG91dHB1dExvY2F0aW9uLCBleHRyYUF0dHJpYnV0ZXMpOworCQkJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeSgKKwkJCQkJCQkJCQkJCXBhdGgsIAorCQkJCQkJCQkJCQkJaW5jbHVzaW9uUGF0dGVybnMsIAorCQkJCQkJCQkJCQkJZXhjbHVzaW9uUGF0dGVybnMsIAorCQkJCQkJCQkJCQkJb3V0cHV0TG9jYXRpb24sIAorCQkJCQkJCQkJCQkJZXh0cmFBdHRyaWJ1dGVzKTsKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6CiAJCQkJZW50cnkgPSBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KAotCQkJCQkJcGF0aCwKLQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoLAotCQkJCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAotCQkJCQkJYWNjZXNzUnVsZXMsCi0JCQkJCQlleHRyYUF0dHJpYnV0ZXMsCi0JCQkJCQlpc0V4cG9ydGVkKTsKKwkJCQkJCQkJCQkJCXBhdGgsCisJCQkJCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJCQkJCQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwKKwkJCQkJCQkJCQkJCWFjY2Vzc1J1bGVzLAorCQkJCQkJCQkJCQkJZXh0cmFBdHRyaWJ1dGVzLAorCQkJCQkJCQkJCQkJaXNFeHBvcnRlZCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKIAkJCQllbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KAotCQkJCQkJcGF0aCwKLQkJCQkJCWFjY2Vzc1J1bGVzLAotCQkJCQkJZXh0cmFBdHRyaWJ1dGVzLAotCQkJCQkJaXNFeHBvcnRlZCk7CisJCQkJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJCQkJYWNjZXNzUnVsZXMsCisJCQkJCQkJCQkJCQlleHRyYUF0dHJpYnV0ZXMsCisJCQkJCQkJCQkJCQlpc0V4cG9ydGVkKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQgOgogCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOwogCQkJCWVudHJ5ID0gbmV3IENsYXNzcGF0aEVudHJ5KAotCQkJCQkJQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQsCi0JCQkJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksCi0JCQkJCQlwYXRoLAotCQkJCQkJSU5DTFVERV9BTEwsCi0JCQkJCQlFWENMVURFX05PTkUsCi0JCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAotCQkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAotCQkJCQkJbnVsbCwgLy8gY3VzdG9tIG91dHB1dCBsb2NhdGlvbgotCQkJCQkJZmFsc2UsCi0JCQkJCQludWxsLCAvLyBubyBhY2Nlc3MgcnVsZXMKLQkJCQkJCWZhbHNlLCAvLyBubyBhY2Nlc3NpYmxlIGZpbGVzIHRvIGNvbWJpbmUKLQkJCQkJCU5PX0VYVFJBX0FUVFJJQlVURVMpOworCQkJCQkJCQkJCQkJQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQsCisJCQkJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksCisJCQkJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJCQkJSU5DTFVERV9BTEwsCisJCQkJCQkJCQkJCQlFWENMVURFX05PTkUsCisJCQkJCQkJCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAorCQkJCQkJCQkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAorCQkJCQkJCQkJCQkJbnVsbCwgLy8gY3VzdG9tIG91dHB1dCBsb2NhdGlvbgorCQkJCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQkJCQludWxsLCAvLyBubyBhY2Nlc3MgcnVsZXMKKwkJCQkJCQkJCQkJCWZhbHNlLCAvLyBubyBhY2Nlc3NpYmxlIGZpbGVzIHRvIGNvbWJpbmUKKwkJCQkJCQkJCQkJCU5PX0VYVFJBX0FUVFJJQlVURVMpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6CiAJCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmtub3duS2luZCwga2luZEF0dHIpKTsKQEAgLTc2Nyw2ICs4NTcsMTcgQEAKIAogCQlyZXR1cm4gZW50cnk7CiAJfQorCQorCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGFzIGEgIi4uIiBzZWdtZW50CisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0RvdERvdChJUGF0aCBwYXRoKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXRoLnNlZ21lbnRDb3VudCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChET1RfRE9ULmVxdWFscyhwYXRoLnNlZ21lbnQoaSkpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlwdWJsaWMgc3RhdGljIE5vZGVMaXN0IGdldENoaWxkQXR0cmlidXRlcyhTdHJpbmcgY2hpbGROYW1lLCBOb2RlTGlzdCBjaGlsZHJlbiwgYm9vbGVhbltdIGZvdW5kQ2hpbGRyZW4pIHsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZvdW5kQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTc5Nyw2ICs4OTgsMTU5IEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIFJlYWQgdGhlIENsYXNzLVBhdGggY2xhdXNlIG9mIHRoZSBtYW5pZmVzdCBvZiB0aGUgamFyIHBvaW50ZWQgYnkgdGhpcyBwYXRoLCBhbmQgcmV0dXJuCisJICogdGhlIGNvcnJlc3BvbmRpbmcgcGF0aHMuCisJICovCisJcHVibGljIHN0YXRpYyBJUGF0aFtdIHJlc29sdmVkQ2hhaW5lZExpYnJhcmllcyhJUGF0aCBqYXJQYXRoKSB7CisJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJlc29sdmVkQ2hhaW5lZExpYnJhcmllcyhqYXJQYXRoLCBuZXcgSGFzaFNldCgpLCByZXN1bHQpOworCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKQorCQkJcmV0dXJuIE5PX1BBVEhTOworCQlyZXR1cm4gKElQYXRoW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUGF0aFtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKElQYXRoIGphclBhdGgsIEhhc2hTZXQgdmlzaXRlZCwgQXJyYXlMaXN0IHJlc3VsdCkgeworCQlpZiAodmlzaXRlZC5jb250YWlucyggamFyUGF0aCkpCisJCQlyZXR1cm47CisJCXZpc2l0ZWQuYWRkKGphclBhdGgpOworCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJaWYgKG1hbmFnZXIuaXNOb25DaGFpbmluZ0phcihqYXJQYXRoKSkKKwkJCXJldHVybjsKKwkJTGlzdCBjYWxsZWRGaWxlTmFtZXMgPSBnZXRDYWxsZWRGaWxlTmFtZXMoamFyUGF0aCk7CisJCWlmIChjYWxsZWRGaWxlTmFtZXMgPT0gbnVsbCkgeworCQkJbWFuYWdlci5hZGROb25DaGFpbmluZ0phcihqYXJQYXRoKTsKKwkJfSBlbHNlIHsKKwkJCUl0ZXJhdG9yIGNhbGxlZEZpbGVzSXRlcmF0b3IgPSBjYWxsZWRGaWxlTmFtZXMuaXRlcmF0b3IoKTsKKwkJCUlQYXRoIGRpcmVjdG9yeVBhdGggPSBqYXJQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJCXdoaWxlIChjYWxsZWRGaWxlc0l0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBjYWxsZWRGaWxlTmFtZSA9IChTdHJpbmcpIGNhbGxlZEZpbGVzSXRlcmF0b3IubmV4dCgpOworCQkJCWlmICghZGlyZWN0b3J5UGF0aC5pc1ZhbGlkUGF0aChjYWxsZWRGaWxlTmFtZSkpIHsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpIHsKKwkJCQkJCVV0aWwudmVyYm9zZSgiSW52YWxpZCBDbGFzcy1QYXRoIGVudHJ5ICIgKyBjYWxsZWRGaWxlTmFtZSArICIgaW4gbWFuaWZlc3Qgb2YgamFyIGZpbGU6ICIgKyBqYXJQYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJSVBhdGggY2FsbGVkSmFyID0gZGlyZWN0b3J5UGF0aC5hcHBlbmQobmV3IFBhdGgoY2FsbGVkRmlsZU5hbWUpKTsKKwkJCQkJLy8gSWdub3JlIGlmIHNlZ21lbnQgY291bnQgaXMgWmVybyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODE1MCkKKwkJCQkJaWYgKGNhbGxlZEphci5zZWdtZW50Q291bnQoKSA9PSAwKSB7CisJCQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkgeworCQkJCQkJCVV0aWwudmVyYm9zZSgiSW52YWxpZCBDbGFzcy1QYXRoIGVudHJ5ICIgKyBjYWxsZWRGaWxlTmFtZSArICIgaW4gbWFuaWZlc3Qgb2YgamFyIGZpbGU6ICIgKyBqYXJQYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJfQorCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJcmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKGNhbGxlZEphciwgdmlzaXRlZCwgcmVzdWx0KTsKKwkJCQkJcmVzdWx0LmFkZChjYWxsZWRKYXIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q2FsbGVkRmlsZU5hbWVzKElQYXRoIGphclBhdGgpIHsKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoamFyUGF0aCwgdHJ1ZS8qY2hlY2sgZXhpc3RlbmNlLCBvdGhlcndpc2UgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSByZWFkKi8pOworCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSkKKwkJCXJldHVybiBudWxsOworCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJWmlwRmlsZSB6aXAgPSBudWxsOworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisJCUxpc3QgY2FsbGVkRmlsZU5hbWVzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXppcCA9IG1hbmFnZXIuZ2V0WmlwRmlsZShqYXJQYXRoKTsKKwkJCVppcEVudHJ5IG1hbmlmZXN0ID0gemlwLmdldEVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgCisJCQkJcmV0dXJuIG51bGw7CisJCQkvLyBub24tbnVsbCBpbXBsaWVzIHJlZ3VsYXIgZmlsZQorCQkJTWFuaWZlc3RBbmFseXplciBhbmFseXplciA9IG5ldyBNYW5pZmVzdEFuYWx5emVyKCk7CisJCQlpbnB1dFN0cmVhbSA9IHppcC5nZXRJbnB1dFN0cmVhbShtYW5pZmVzdCk7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSBhbmFseXplci5hbmFseXplTWFuaWZlc3RDb250ZW50cyhpbnB1dFN0cmVhbSk7CisJCQljYWxsZWRGaWxlTmFtZXMgPSBhbmFseXplci5nZXRDYWxsZWRGaWxlTmFtZXMoKTsKKwkJCWlmICghc3VjY2VzcyB8fCBhbmFseXplci5nZXRDbGFzc3BhdGhTZWN0aW9uc0NvdW50KCkgPT0gMSAmJiBjYWxsZWRGaWxlTmFtZXMgPT0gbnVsbCkgeworCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKSB7CisJCQkJCVV0aWwudmVyYm9zZSgiSW52YWxpZCBDbGFzcy1QYXRoIGhlYWRlciBpbiBtYW5pZmVzdCBvZiBqYXIgZmlsZTogIiArIGphclBhdGgudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gZWxzZSBpZiAoYW5hbHl6ZXIuZ2V0Q2xhc3NwYXRoU2VjdGlvbnNDb3VudCgpID4gMSkgeworCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKSB7CisJCQkJCVV0aWwudmVyYm9zZSgiTXVsdGlwbGUgQ2xhc3MtUGF0aCBoZWFkZXJzIGluIG1hbmlmZXN0IG9mIGphciBmaWxlOiAiICsgamFyUGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIG5vdCBhIHppcCBmaWxlCisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkgeworCQkJCVV0aWwudmVyYm9zZSgiQ291bGQgbm90IHJlYWQgQ2xhc3MtUGF0aCBoZWFkZXIgaW4gbWFuaWZlc3Qgb2YgamFyIGZpbGU6ICIgKyBqYXJQYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBub3QgYSB6aXAgZmlsZQorCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpIHsKKwkJCQlVdGlsLnZlcmJvc2UoIkNvdWxkIG5vdCByZWFkIENsYXNzLVBhdGggaGVhZGVyIGluIG1hbmlmZXN0IG9mIGphciBmaWxlOiAiICsgamFyUGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGJlc3QgZWZmb3J0CisJCQkJfQorCQkJfQorCQkJbWFuYWdlci5jbG9zZVppcEZpbGUoemlwKTsKKwkJfQorCQlyZXR1cm4gY2FsbGVkRmlsZU5hbWVzOworCX0KKwkKKwkvKgorCSAqIFJlc29sdmVzIHRoZSAiLi4iIGluIHRoZSBnaXZlbiBwYXRoLiBSZXR1cm5zIHRoZSBnaXZlbiBwYXRoIGlmIGl0IGNvbnRhaW5zIG5vICIuLiIgc2VnbWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQYXRoIHJlc29sdmVEb3REb3QoSVBhdGggcmVmZXJlbmNlLCBJUGF0aCBwYXRoKSB7CisJCUlQYXRoIG5ld1BhdGggPSBudWxsOworCQlJUGF0aCB3b3Jrc3BhY2VMb2NhdGlvbiA9IHdvcmtzcGFjZVJvb3QuZ2V0TG9jYXRpb24oKTsKKwkJaWYgKHJlZmVyZW5jZSA9PSBudWxsIHx8IHdvcmtzcGFjZUxvY2F0aW9uLmlzUHJlZml4T2YocmVmZXJlbmNlKSkgeworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhdGguc2VnbWVudENvdW50KCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBzZWdtZW50ID0gcGF0aC5zZWdtZW50KGkpOworCQkJCWlmIChET1RfRE9ULmVxdWFscyhzZWdtZW50KSkgeworCQkJCQlpZiAobmV3UGF0aCA9PSBudWxsKSB7CisJCQkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCQkJbmV3UGF0aCA9IHdvcmtzcGFjZUxvY2F0aW9uOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQluZXdQYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKG5ld1BhdGguc2VnbWVudENvdW50KCkgPiAwKSB7CisJCQkJCQkJbmV3UGF0aCA9IG5ld1BhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQluZXdQYXRoID0gd29ya3NwYWNlTG9jYXRpb247CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKG5ld1BhdGggIT0gbnVsbCkgeworCQkJCQlpZiAobmV3UGF0aC5lcXVhbHMod29ya3NwYWNlTG9jYXRpb24pICYmIHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChzZWdtZW50KS5pc0FjY2Vzc2libGUoKSkgeworCQkJCQkJbmV3UGF0aCA9IG5ldyBQYXRoKHNlZ21lbnQpLm1ha2VBYnNvbHV0ZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbmV3UGF0aCA9IG5ld1BhdGguYXBwZW5kKHNlZ21lbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgeworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhdGguc2VnbWVudENvdW50KCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBzZWdtZW50ID0gcGF0aC5zZWdtZW50KGkpOworCQkJCWlmIChET1RfRE9ULmVxdWFscyhzZWdtZW50KSkgeworCQkJCQlpZiAobmV3UGF0aCA9PSBudWxsKXsKKwkJCQkJCW5ld1BhdGggPSByZWZlcmVuY2U7CisJCQkJCX0KKwkJCQkJaWYgKG5ld1BhdGguc2VnbWVudENvdW50KCkgPiAwKSB7CisJCQkJCQluZXdQYXRoID0gbmV3UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CisJIAkJCQl9CisJCQkJfSBlbHNlIGlmIChuZXdQYXRoICE9IG51bGwpIHsKKwkJCQkJbmV3UGF0aCA9IG5ld1BhdGguYXBwZW5kKHNlZ21lbnQpOworCSAJCQl9CisJCQl9CisJCX0KKwkJaWYgKG5ld1BhdGggPT0gbnVsbCkKKwkJCXJldHVybiBwYXRoOworCQlyZXR1cm4gbmV3UGF0aDsKKwl9CisKIAkvKioKIAkgKiBFbmNvZGUgc29tZSBwYXR0ZXJucyBpbnRvIFhNTCBwYXJhbWV0ZXIgdGFnCiAJICovCkBAIC05NTEsNDYgKzEyMDUsNiBAQAogCQlyZXR1cm4gdGhpcy5leHRyYUF0dHJpYnV0ZXM7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRNZXNzYWdlVGVtcGxhdGVzKCkgewotCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJU3RyaW5nIFtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbQWNjZXNzUnVsZVNldC5NRVNTQUdFX1RFTVBMQVRFU19MRU5HVEhdOwotCQlpZiAodGhpcy5lbnRyeUtpbmQgPT0gQ1BFX1BST0pFQ1QgfHwgdGhpcy5lbnRyeUtpbmQgPT0gQ1BFX1NPVVJDRSkgeyAvLyBjYW4gYmUgcmVtb3RlIHNvdXJjZSBlbnRyeSB3aGVuIHJlY29uY2lsaW5nCi0JCQlyZXN1bHRbMF0gPSBtYW5hZ2VyLmludGVybihNZXNzYWdlcy5iaW5kKAotCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXMucmVzdHJpY3RlZEFjY2Vzc19wcm9qZWN0LAotCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsIGdldFBhdGgoKS5zZWdtZW50KDApfSkpOyAgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0WzFdID0gbWFuYWdlci5pbnRlcm4oTWVzc2FnZXMuYmluZCgKLQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlcy5yZXN0cmljdGVkQWNjZXNzX2NvbnN0cnVjdG9yX3Byb2plY3QsCi0JCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsIGdldFBhdGgoKS5zZWdtZW50KDApfSkpOyAgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0WzJdID0gbWFuYWdlci5pbnRlcm4oTWVzc2FnZXMuYmluZCgKLQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlcy5yZXN0cmljdGVkQWNjZXNzX21ldGhvZF9wcm9qZWN0LAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCAiezF9IiwgZ2V0UGF0aCgpLnNlZ21lbnQoMCl9KSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdFszXSA9IG1hbmFnZXIuaW50ZXJuKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXMucmVzdHJpY3RlZEFjY2Vzc19maWVsZF9wcm9qZWN0LAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCAiezF9IiwgZ2V0UGF0aCgpLnNlZ21lbnQoMCl9KSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCUlQYXRoIGxpYlBhdGggPSBnZXRQYXRoKCk7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBsaWJQYXRoLCBmYWxzZSk7Ci0JCQlTdHJpbmcgcGF0aFN0cmluZzsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUpCi0JCQkJcGF0aFN0cmluZyA9IGxpYlBhdGgudG9PU1N0cmluZygpOwotCQkJZWxzZQotCQkJCXBhdGhTdHJpbmcgPSBsaWJQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQlyZXN1bHRbMF0gPSBtYW5hZ2VyLmludGVybihNZXNzYWdlcy5iaW5kKAotCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXMucmVzdHJpY3RlZEFjY2Vzc19saWJyYXJ5LAotCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsIHBhdGhTdHJpbmd9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdFsxXSA9IG1hbmFnZXIuaW50ZXJuKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXMucmVzdHJpY3RlZEFjY2Vzc19jb25zdHJ1Y3Rvcl9saWJyYXJ5LAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCBwYXRoU3RyaW5nfSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHRbMl0gPSBtYW5hZ2VyLmludGVybihNZXNzYWdlcy5iaW5kKAotCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzLnJlc3RyaWN0ZWRBY2Nlc3NfbWV0aG9kX2xpYnJhcnksCi0JCQkJCW5ldyBTdHJpbmdbXSB7InswfSIsICJ7MX0iLCBwYXRoU3RyaW5nfSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdFszXSA9IG1hbmFnZXIuaW50ZXJuKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXMucmVzdHJpY3RlZEFjY2Vzc19maWVsZF9saWJyYXJ5LAotCQkJCQluZXcgU3RyaW5nW10geyJ7MH0iLCAiezF9IiwgcGF0aFN0cmluZ30pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KIAkvKioKIAkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNnZXRFeGNsdXNpb25QYXR0ZXJucygpCiAJICovCkBAIC0xMDI2LDYgKzEyNDAsMTEgQEAKIAkJcmV0dXJuIHRoaXMuc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwogCX0KIAorCisJcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRSZWZlcmVuY2luZ0VudHJ5KCkgeworCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2luZ0VudHJ5OworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkKIAkgKi8KQEAgLTExMTUsNyArMTMzNCwxMSBAQAogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0UGF0aCgpKSk7CisJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGdldFBhdGgoKSwgdHJ1ZSk7CisJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKQorCQkJYnVmZmVyLmFwcGVuZChnZXRQYXRoKCkudG9PU1N0cmluZygpKTsKKwkJZWxzZQorCQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRQYXRoKCkpKTsKIAkJYnVmZmVyLmFwcGVuZCgnWycpOwogCQlzd2l0Y2ggKGdldEVudHJ5S2luZCgpKSB7CiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CkBAIC0xMjEwLDcgKzE0MzMsNTcgQEAKIAkJfQogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQotCisJCisJcHVibGljIENsYXNzcGF0aEVudHJ5IHJlc29sdmVkRG90RG90KElQYXRoIHJlZmVyZW5jZSkgeworCQlJUGF0aCByZXNvbHZlZFBhdGggPSByZXNvbHZlRG90RG90KHJlZmVyZW5jZSwgdGhpcy5wYXRoKTsKKwkJaWYgKHJlc29sdmVkUGF0aCA9PSB0aGlzLnBhdGgpCisJCQlyZXR1cm4gdGhpczsKKwkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeSgKKwkJCQkJCQlnZXRDb250ZW50S2luZCgpLAorCQkJCQkJCWdldEVudHJ5S2luZCgpLAorCQkJCQkJCXJlc29sdmVkUGF0aCwKKwkJCQkJCQl0aGlzLmluY2x1c2lvblBhdHRlcm5zLAorCQkJCQkJCXRoaXMuZXhjbHVzaW9uUGF0dGVybnMsCisJCQkJCQkJZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwKKwkJCQkJCQlnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwKKwkJCQkJCQlnZXRPdXRwdXRMb2NhdGlvbigpLAorCQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNpbmdFbnRyeSgpLAorCQkJCQkJCXRoaXMuaXNFeHBvcnRlZCwKKwkJCQkJCQlnZXRBY2Nlc3NSdWxlcygpLAorCQkJCQkJCXRoaXMuY29tYmluZUFjY2Vzc1J1bGVzLAorCQkJCQkJCXRoaXMuZXh0cmFBdHRyaWJ1dGVzKTsKKwl9CisJCisJLyoKKwkgKiBSZWFkIHRoZSBDbGFzcy1QYXRoIGNsYXVzZSBvZiB0aGUgbWFuaWZlc3Qgb2YgdGhlIGphciBwb2ludGVkIGJ5IHRoaXMgZW50cnksIGFuZCByZXR1cm4KKwkgKiB0aGUgY29ycmVzcG9uZGluZyBsaWJyYXJ5IGVudHJpZXMuCisJICovCisJcHVibGljIENsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKCkgeworCQlJUGF0aFtdIHBhdGhzID0gcmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKGdldFBhdGgoKSk7CisJCWludCBsZW5ndGggPSBwYXRocy5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQlDbGFzc3BhdGhFbnRyeVtdIHJlc3VsdCA9IG5ldyBDbGFzc3BhdGhFbnRyeVtsZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkvLyBDaGFpbmVkKHJlZmVyZW5jZWQpIGxpYnJhcmllcyBjYW4gaGF2ZSB0aGVpciBvd24gYXR0YWNobWVudCBwYXRoLiBIZW5jZSwgc2V0IHRoZW0gdG8gbnVsbAorCQkJcmVzdWx0W2ldID0gbmV3IENsYXNzcGF0aEVudHJ5KAorCQkJCQlnZXRDb250ZW50S2luZCgpLAorCQkJCQlnZXRFbnRyeUtpbmQoKSwKKwkJCQkJcGF0aHNbaV0sCisJCQkJCXRoaXMuaW5jbHVzaW9uUGF0dGVybnMsCisJCQkJCXRoaXMuZXhjbHVzaW9uUGF0dGVybnMsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWdldE91dHB1dExvY2F0aW9uKCksCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuaXNFeHBvcnRlZCwKKwkJCQkJZ2V0QWNjZXNzUnVsZXMoKSwKKwkJCQkJdGhpcy5jb21iaW5lQWNjZXNzUnVsZXMsCisJCQkJCU5PX0VYVFJBX0FUVFJJQlVURVMpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQogCS8qKgogCSAqIEFuc3dlcnMgYW4gSUQgd2hpY2ggaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBlbnRyaWVzIGR1cmluZyBwYWNrYWdlCiAJICogZnJhZ21lbnQgcm9vdCBjb21wdXRhdGlvbnMKQEAgLTEyNTgsNyArMTUzMSw3IEBACiAJICogICA8bGk+IFRoZSBwcm9qZWN0IG91dHB1dCBsb2NhdGlvbiBwYXRoIGNhbm5vdCBiZSBudWxsLCBtdXN0IGJlIGFic29sdXRlIGFuZCBsb2NhdGVkIGluc2lkZSB0aGUgcHJvamVjdC4KIAkgKiAgIDxsaT4gU3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9ucyAoc3BlY2lmaWVkIG9uIHNvdXJjZSBlbnRyaWVzKSBjYW4gYmUgbnVsbCwgaWYgbm90IHRoZXkgbXVzdCBiZSBsb2NhdGVkIGluc2lkZSB0aGUgcHJvamVjdCwKIAkgKiAgIDxsaT4gQSBwcm9qZWN0IGVudHJ5IGNhbm5vdCByZWZlciB0byBpdHNlbGYgZGlyZWN0bHkgKHRoYXQgaXMsIGEgcHJvamVjdCBjYW5ub3QgcHJlcmVxdWlzaXRlIGl0c2VsZikuCi0gICAgICogICA8bGk+IENsYXNzcGF0aCBlbnRyaWVzIG9yIG91dHB1dCBsb2NhdGlvbnMgY2Fubm90IGNvaW5jaWRhdGUgb3IgYmUgbmVzdGVkIGluIGVhY2ggb3RoZXIsIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBzY2VuYXJpaSBsaXN0ZWQgYmVsb3c6CisJICogICA8bGk+IENsYXNzcGF0aCBlbnRyaWVzIG9yIG91dHB1dCBsb2NhdGlvbnMgY2Fubm90IGNvaW5jaWRhdGUgb3IgYmUgbmVzdGVkIGluIGVhY2ggb3RoZXIsIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBzY2VuYXJpaSBsaXN0ZWQgYmVsb3c6CiAJICogICAgICA8dWw+PGxpPiBBIHNvdXJjZSBmb2xkZXIgY2FuIGNvaW5jaWRhdGUgd2l0aCBpdHMgb3duIG91dHB1dCBsb2NhdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGlzIG91dHB1dCBjYW4gdGhlbiBjb250YWluIGxpYnJhcnkgYXJjaGl2ZXMuCiAJICogICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCBhIHNwZWNpZmljIG91dHB1dCBsb2NhdGlvbiBjYW5ub3QgY29pbmNpZGF0ZSB3aXRoIGFueSBsaWJyYXJ5IG9yIGEgZGlzdGluY3Qgc291cmNlIGZvbGRlciB0aGFuIHRoZSBvbmUgcmVmZXJyaW5nIHRvIGl0LiA8L2xpPgogCSAqICAgICAgICAgICAgICA8bGk+IEEgc291cmNlL2xpYnJhcnkgZm9sZGVyIGNhbiBiZSBuZXN0ZWQgaW4gYW55IHNvdXJjZSBmb2xkZXIgYXMgbG9uZyBhcyB0aGUgbmVzdGVkIGZvbGRlciBpcyBleGNsdWRlZCBmcm9tIHRoZSBlbmNsb3Npbmcgb25lLiA8L2xpPgpAQCAtMTMwNywxMCArMTU4MCwyMiBAQAogCQlpZiAocmF3Q2xhc3NwYXRoID09IG51bGwpCiAJCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCisJCS8vIGNoZWNrIGR1cGxpY2F0ZSBlbnRyaWVzIG9uIHJhdyBjbGFzc3BhdGggb25seSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUyMjYgKQorCQlpbnQgcmF3TGVuZ3RoID0gcmF3Q2xhc3NwYXRoLmxlbmd0aDsKKwkJSGFzaFNldCBwYXRoZXMgPSBuZXcgSGFzaFNldChyYXdMZW5ndGgpOworCQlmb3IgKGludCBpID0gMCA7IGkgPCByYXdMZW5ndGg7IGkrKykgeworCQkJSVBhdGggZW50cnlQYXRoID0gcmF3Q2xhc3NwYXRoW2ldLmdldFBhdGgoKTsKKwkJCWlmICghcGF0aGVzLmFkZChlbnRyeVBhdGgpKXsKKwkJCQlTdHJpbmcgZW50cnlQYXRoTXNnID0gcHJvamVjdE5hbWUuZXF1YWxzKGVudHJ5UGF0aC5zZWdtZW50KDApKSA/IGVudHJ5UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkgOiBlbnRyeVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9kdXBsaWNhdGVFbnRyeVBhdGgsIG5ldyBTdHJpbmdbXSB7ZW50cnlQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKKwkJCX0KKwkJfQorCiAJCS8vIHJldHJpZXZlIHJlc29sdmVkIGNsYXNzcGF0aAogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7CiAJCXRyeSB7Ci0JCQljbGFzc3BhdGggPSAoKEphdmFQcm9qZWN0KWphdmFQcm9qZWN0KS5yZXNvbHZlQ2xhc3NwYXRoKHJhd0NsYXNzcGF0aCk7CisJCQkvLyBkb24ndCByZXNvbHZlIGNoYWluZWQgbGlicmFyaWVzOiBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTY4NQorCQkJY2xhc3NwYXRoID0gKChKYXZhUHJvamVjdClqYXZhUHJvamVjdCkucmVzb2x2ZUNsYXNzcGF0aChyYXdDbGFzc3BhdGgsIGZhbHNlLypkb24ndCB1c2UgcHJldmlvdXMgc2Vzc2lvbiovLCBmYWxzZS8qZG9uJ3QgcmVzb2x2ZSBjaGFpbmVkIGxpYnJhcmllcyovKS5yZXNvbHZlZENsYXNzcGF0aDsKIAkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CiAJCQlyZXR1cm4gZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKIAkJfQpAQCAtMTM2NSw4ICsxNjUwLDggQEAKIAkJfQogCQkvLyBjaGVjayBuZXN0aW5nIGFjcm9zcyBvdXRwdXQgbG9jYXRpb25zCiAJCWZvciAoaW50IGkgPSAxIC8qbm8gY2hlY2sgZm9yIGRlZmF1bHQgb3V0cHV0Ki8gOyBpIDwgb3V0cHV0Q291bnQ7IGkrKykgewotCQkgICAgSVBhdGggY3VzdG9tT3V0cHV0ID0gb3V0cHV0TG9jYXRpb25zW2ldOwotCQkgICAgaW50IGluZGV4OworCQkJSVBhdGggY3VzdG9tT3V0cHV0ID0gb3V0cHV0TG9jYXRpb25zW2ldOworCQkJaW50IGluZGV4OwogCQkJLy8gY2hlY2sgbmVzdGluZwogCQkJaWYgKChpbmRleCA9IFV0aWwuaW5kZXhPZkVuY2xvc2luZ1BhdGgoY3VzdG9tT3V0cHV0LCBvdXRwdXRMb2NhdGlvbnMsIG91dHB1dENvdW50KSkgIT0gLTEgJiYgaW5kZXggIT0gaSkgewogCQkJCWlmIChpbmRleCA9PSAwKSB7CkBAIC0xMzk5LDcgKzE2ODQsOCBAQAogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCQloYXNMaWJGb2xkZXIgfD0gIW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKTsKKwkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocGF0aCwgZmFsc2UvKmRvbid0IGNoZWNrIHJlc291cmNlIGV4aXN0ZW5jZSovKTsKKwkJCQkJaGFzTGliRm9sZGVyIHw9IHRhcmdldCBpbnN0YW5jZW9mIElDb250YWluZXI7CiAJCQkJCWlmICgoaW5kZXggPSBVdGlsLmluZGV4T2ZNYXRjaGluZ1BhdGgocGF0aCwgb3V0cHV0TG9jYXRpb25zLCBvdXRwdXRDb3VudCkpICE9IC0xKXsKIAkJCQkJCWFsbG93TmVzdGluZ0luT3V0cHV0TG9jYXRpb25zW2luZGV4XSA9IHRydWU7CiAJCQkJCX0KQEAgLTE0MTAsOCArMTY5Niw2IEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dENvdW50OyBpKyspIGFsbG93TmVzdGluZ0luT3V0cHV0TG9jYXRpb25zW2ldID0gdHJ1ZTsKIAkJfQogCi0JCUhhc2hTZXQgcGF0aGVzID0gbmV3IEhhc2hTZXQobGVuZ3RoKTsKLQogCQkvLyBjaGVjayBhbGwgZW50cmllcwogCQlmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwpAQCAtMTQxOSwxNCArMTcwMyw2IEBACiAJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CiAJCQlpbnQga2luZCA9IGVudHJ5LmdldEVudHJ5S2luZCgpOwogCi0JCQkvLyBCdWlsZCBzb21lIGNvbW1vbiBzdHJpbmdzIGZvciBzdGF0dXMgbWVzc2FnZQotCQkJYm9vbGVhbiBpc1Byb2plY3RSZWxhdGl2ZSA9IHByb2plY3ROYW1lLmVxdWFscyhlbnRyeVBhdGguc2VnbWVudCgwKSk7Ci0JCQlTdHJpbmcgZW50cnlQYXRoTXNnID0gaXNQcm9qZWN0UmVsYXRpdmUgPyBlbnRyeVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpIDogZW50cnlQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0KLQkJCS8vIGNvbXBsYWluIGlmIGR1cGxpY2F0ZSBwYXRoCi0JCQlpZiAoIXBhdGhlcy5hZGQoZW50cnlQYXRoKSl7Ci0JCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZHVwbGljYXRlRW50cnlQYXRoLCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgcHJvamVjdE5hbWV9KSk7Ci0JCQl9CiAJCQkvLyBubyBmdXJ0aGVyIGNoZWNrIGlmIGVudHJ5IGNvaW5jaWRhdGVzIHdpdGggcHJvamVjdCBvciBvdXRwdXQgbG9jYXRpb24KIAkJCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSl7CiAJCQkJLy8gY29tcGxhaW4gaWYgc2VsZi1yZWZlcnJpbmcgcHJvamVjdCBlbnRyeQpAQCAtMTQzOSw3ICsxNzE1LDcgQEAKIAogCQkJLy8gYWxsb3cgbmVzdGluZyBzb3VyY2UgZW50cmllcyBpbiBlYWNoIG90aGVyIGFzIGxvbmcgYXMgdGhlIG91dGVyIGVudHJ5IGV4Y2x1ZGVzIHRoZSBpbm5lciBvbmUKIAkJCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFCi0JCQkJCXx8IChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShlbnRyeVBhdGgubGFzdFNlZ21lbnQoKSkpKXsKKwkJCQkJfHwgKGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZICYmIChKYXZhTW9kZWwuZ2V0VGFyZ2V0KGVudHJ5UGF0aCwgZmFsc2UvKmRvbid0IGNoZWNrIGV4aXN0ZW5jZSovKSBpbnN0YW5jZW9mIElDb250YWluZXIpKSkgewogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NwYXRoLmxlbmd0aDsgaisrKXsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IG90aGVyRW50cnkgPSBjbGFzc3BhdGhbal07CiAJCQkJCWlmIChvdGhlckVudHJ5ID09IG51bGwpIGNvbnRpbnVlOwpAQCAtMTQ0OCw3ICsxNzI0LDcgQEAKIAkJCQkJaWYgKGVudHJ5ICE9IG90aGVyRW50cnkKIAkJCQkJCSYmIChvdGhlcktpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UKIAkJCQkJCQkJfHwgKG90aGVyS2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkKLQkJCQkJCQkJCQkmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShvdGhlclBhdGgubGFzdFNlZ21lbnQoKSkpKSl7CisJCQkJCQkJCQkJJiYgKEphdmFNb2RlbC5nZXRUYXJnZXQob3RoZXJQYXRoLCBmYWxzZS8qZG9uJ3QgY2hlY2sgZXhpc3RlbmNlKi8pIGluc3RhbmNlb2YgSUNvbnRhaW5lcikpKSkgewogCQkJCQkJY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zOwogCQkJCQkJaWYgKG90aGVyUGF0aC5pc1ByZWZpeE9mKGVudHJ5UGF0aCkKIAkJCQkJCQkJJiYgIW90aGVyUGF0aC5lcXVhbHMoZW50cnlQYXRoKQpAQCAtMTQ3NCwzMiArMTc1MCwzMyBAQAogCQkJfQogCiAJCQkvLyBwcmV2ZW50IG5lc3Rpbmcgb3V0cHV0IGxvY2F0aW9uIGluc2lkZSBlbnRyeSB1bmxlc3MgZW5jbG9zaW5nIGlzIGEgc291cmNlIGVudHJ5IHdoaWNoIGV4cGxpY2l0bHkgZXhjbHVkZSB0aGUgb3V0cHV0IGxvY2F0aW9uCi0JCSAgICBjaGFyW11bXSBpbmNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKLQkJICAgIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOwotCQkgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvdXRwdXRDb3VudDsgaisrKXsKLQkJICAgICAgICBJUGF0aCBjdXJyZW50T3V0cHV0ID0gb3V0cHV0TG9jYXRpb25zW2pdOwotICAgIAkJCWlmIChlbnRyeVBhdGguZXF1YWxzKGN1cnJlbnRPdXRwdXQpKSBjb250aW51ZTsKKwkJCWNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpOworCQkJY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IG91dHB1dENvdW50OyBqKyspeworCQkJCUlQYXRoIGN1cnJlbnRPdXRwdXQgPSBvdXRwdXRMb2NhdGlvbnNbal07CisJCQkJaWYgKGVudHJ5UGF0aC5lcXVhbHMoY3VycmVudE91dHB1dCkpIGNvbnRpbnVlOwogCQkJCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihjdXJyZW50T3V0cHV0KSkgewogCQkJCSAgICBpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSB8fCAhVXRpbC5pc0V4Y2x1ZGVkKGN1cnJlbnRPdXRwdXQsIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucywgdHJ1ZSkpIHsKIAkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2Nhbm5vdE5lc3RPdXRwdXRJbkVudHJ5LCBuZXcgU3RyaW5nW10ge2N1cnJlbnRPdXRwdXQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgZW50cnlQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCl9KSk7CiAJCQkJICAgIH0KIAkJCQl9Ci0JCSAgICB9CisJCQl9CiAKLQkJICAgIC8vIHByZXZlbnQgbmVzdGluZyBlbnRyeSBpbnNpZGUgb3V0cHV0IGxvY2F0aW9uIC0gd2hlbiBkaXN0aW5jdCBmcm9tIHByb2plY3Qgb3IgYSBzb3VyY2UgZm9sZGVyCi0JCSAgICBmb3IgKGludCBqID0gMDsgaiA8IG91dHB1dENvdW50OyBqKyspewotCQkgICAgICAgIGlmIChhbGxvd05lc3RpbmdJbk91dHB1dExvY2F0aW9uc1tqXSkgY29udGludWU7Ci0JCSAgICAgICAgSVBhdGggY3VycmVudE91dHB1dCA9IG91dHB1dExvY2F0aW9uc1tqXTsKKwkJCS8vIHByZXZlbnQgbmVzdGluZyBlbnRyeSBpbnNpZGUgb3V0cHV0IGxvY2F0aW9uIC0gd2hlbiBkaXN0aW5jdCBmcm9tIHByb2plY3Qgb3IgYSBzb3VyY2UgZm9sZGVyCisJCQlmb3IgKGludCBqID0gMDsgaiA8IG91dHB1dENvdW50OyBqKyspeworCQkJCWlmIChhbGxvd05lc3RpbmdJbk91dHB1dExvY2F0aW9uc1tqXSkgY29udGludWU7CisJCQkJSVBhdGggY3VycmVudE91dHB1dCA9IG91dHB1dExvY2F0aW9uc1tqXTsKIAkJCQlpZiAoY3VycmVudE91dHB1dC5pc1ByZWZpeE9mKGVudHJ5UGF0aCkpIHsKIAkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfY2Fubm90TmVzdEVudHJ5SW5PdXRwdXQsIG5ldyBTdHJpbmdbXSB7ZW50cnlQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIGN1cnJlbnRPdXRwdXQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKX0pKTsKIAkJCQl9Ci0JCSAgICB9CisJCQl9CiAJCX0KIAkJLy8gZW5zdXJlIHRoYXQgbm8gc3BlY2lmaWMgb3V0cHV0IGlzIGNvaW5jaWRhdGluZyB3aXRoIGFub3RoZXIgc291cmNlIGZvbGRlciAob25seSBhbGxvd2VkIGlmIG1hdGNoaW5nIGN1cnJlbnQgc291cmNlIGZvbGRlcikKIAkJLy8gMzY0NjUgLSBmb3IgMi4wIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG9ubHkgY2hlY2sgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9ucyAodGhlIGRlZmF1bHQgY2FuIHN0aWxsIGNvaW5jaWRhdGUpCiAJCS8vIHBlcmZvcm0gb25lIHNlcGFyYXRlIGl0ZXJhdGlvbiBzbyBhcyB0byBub3QgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcHJldmlvdXNseSBjaGVja2VkIHNjZW5hcmlpIChpbiBwYXJ0aWN1bGFyIHNob3VsZAogCQkvLyBkaWFnbm9zZSBuZXN0aW5nIHNvdXJjZSBmb2xkZXIgaXNzdWUgYmVmb3JlIHRoaXMgb25lLCBmb3IgZXhhbXBsZSwgW3NyY10iUHJvamVjdC8iLCBbc3JjXSJQcm9qZWN0L3NvdXJjZS8iIGFuZCBvdXRwdXQ9IlByb2plY3QvIiBzaG91bGQKIAkJLy8gZmlyc3QgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBleGNsdXNpb24gcGF0dGVybgorCQlJSmF2YU1vZGVsU3RhdHVzIGNhY2hlZFN0YXR1cyA9IG51bGw7CiAJCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CiAJCQlpZiAoZW50cnkgPT0gbnVsbCkgY29udGludWU7CkBAIC0xNTEyLDMwICsxNzg5LDUzIEBACiAKIAkJCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CiAJCQkJSVBhdGggb3V0cHV0ID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCQlpZiAob3V0cHV0ID09IG51bGwpIGNvbnRpbnVlOyAvLyAzNjQ2NSAtIGZvciAyLjAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgb25seSBjaGVjayBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb25zICh0aGUgZGVmYXVsdCBjYW4gc3RpbGwgY29pbmNpZGF0ZSkKLQkJCQkvLyBpZiAob3V0cHV0ID09IG51bGwpIG91dHB1dCA9IHByb2plY3RPdXRwdXRMb2NhdGlvbjsgLy8gaWYgbm8gc3BlY2lmaWMgb3V0cHV0LCBzdGlsbCBuZWVkIHRvIGNoZWNrIHVzaW5nIGRlZmF1bHQgb3V0cHV0ICh0aGlzIGxpbmUgd291bGQgY2hlY2sgZGVmYXVsdCBvdXRwdXQpCisJCQkJaWYgKG91dHB1dCA9PSBudWxsKSBvdXRwdXQgPSBwcm9qZWN0T3V0cHV0TG9jYXRpb247IC8vIGlmIG5vIHNwZWNpZmljIG91dHB1dCwgc3RpbGwgbmVlZCB0byBjaGVjayB1c2luZyBkZWZhdWx0IG91dHB1dCAodGhpcyBsaW5lIHdvdWxkIGNoZWNrIGRlZmF1bHQgb3V0cHV0KQogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IG90aGVyRW50cnkgPSBjbGFzc3BhdGhbal07CiAJCQkJCWlmIChvdGhlckVudHJ5ID09IGVudHJ5KSBjb250aW51ZTsKIAotCQkJCQkvLyBCdWlsZCBzb21lIGNvbW1vbiBzdHJpbmdzIGZvciBzdGF0dXMgbWVzc2FnZQotCQkJCQlib29sZWFuIG9wU3RhcnRzV2l0aFByb2plY3QgPSBwcm9qZWN0TmFtZS5lcXVhbHMob3RoZXJFbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCVN0cmluZyBvdGhlclBhdGhNc2cgPSBvcFN0YXJ0c1dpdGhQcm9qZWN0ID8gb3RoZXJFbnRyeS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpIDogb3RoZXJFbnRyeS5nZXRQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQogCQkJCQlzd2l0Y2ggKG90aGVyRW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKIAkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCQkJCWlmIChvdGhlckVudHJ5LmdldFBhdGgoKS5lcXVhbHMob3V0cHV0KSkgewotCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9jYW5ub3RVc2VEaXN0aW5jdFNvdXJjZUZvbGRlckFzT3V0cHV0LCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgb3RoZXJQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKKwkJCQkJCQkvLyBCdWcgMjg3MTY0IDogUmVwb3J0IGVycm9ycyBvZiBvdmVybGFwcGluZyBvdXRwdXQgbG9jYXRpb25zIG9ubHkgaWYgdGhlIHVzZXIgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBwcmVmZXJlbmNlLgorCQkJCQkJCS8vIFRoZSBjaGVjayBpcyByZXF1aXJlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGJ1Zy1maXggMzY0NjUuCisJCQkJCQkJU3RyaW5nIG9wdGlvbiA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSwgdHJ1ZSk7CisJCQkJCQkJaWYgKG90aGVyRW50cnkuZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXQpIAorCQkJCQkJCQkJJiYgIUphdmFDb3JlLklHTk9SRS5lcXVhbHMob3B0aW9uKSkgeworCQkJCQkJCQlib29sZWFuIG9wU3RhcnRzV2l0aFByb2plY3QgPSBwcm9qZWN0TmFtZS5lcXVhbHMob3RoZXJFbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7CisJCQkJCQkJCVN0cmluZyBvdGhlclBhdGhNc2cgPSBvcFN0YXJ0c1dpdGhQcm9qZWN0ID8gb3RoZXJFbnRyeS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpIDogb3RoZXJFbnRyeS5nZXRQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQkJCQkJaWYgKEphdmFDb3JlLkVSUk9SLmVxdWFscyhvcHRpb24pKSB7CisJCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSwgCisJCQkJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2Nhbm5vdFVzZURpc3RpbmN0U291cmNlRm9sZGVyQXNPdXRwdXQsIG5ldyBTdHJpbmdbXSB7CisJCQkJCQkJCQkJCWVudHJ5UGF0aE1zZywgb3RoZXJQYXRoTXNnLCBwcm9qZWN0TmFtZSB9KSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGNhY2hlZFN0YXR1cyA9PSBudWxsKSB7CisJCQkJCQkJCQkvLyBOb3RlIHRoYXQgdGhlIGlzT0soKSBpcyBiZWluZyBvdmVycmlkZGVuIHRvIHJldHVybiB0cnVlLiBUaGlzIGlzIGFuIGV4Y2VwdGlvbmFsIHNjZW5hcmlvCisJCQkJCQkJCQljYWNoZWRTdGF0dXMgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKElTdGF0dXMuT0ssIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFLCAKKwkJCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9jYW5ub3RVc2VEaXN0aW5jdFNvdXJjZUZvbGRlckFzT3V0cHV0LCBuZXcgU3RyaW5nW10geworCQkJCQkJCQkJCWVudHJ5UGF0aE1zZywgb3RoZXJQYXRoTXNnLCBwcm9qZWN0TmFtZSB9KSl7CisJCQkJCQkJCQkJcHVibGljIGJvb2xlYW4gaXNPSygpIHsKKwkJCQkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQkJCQlpZiAob3RoZXJFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG91dHB1dCkpIHsKKwkJCQkJCQlpZiAob3V0cHV0ICE9IHByb2plY3RPdXRwdXRMb2NhdGlvbiAmJiBvdGhlckVudHJ5LmdldFBhdGgoKS5lcXVhbHMob3V0cHV0KSkgeworCQkJCQkJCQlib29sZWFuIG9wU3RhcnRzV2l0aFByb2plY3QgPSBwcm9qZWN0TmFtZS5lcXVhbHMob3RoZXJFbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7CisJCQkJCQkJCVN0cmluZyBvdGhlclBhdGhNc2cgPSBvcFN0YXJ0c1dpdGhQcm9qZWN0ID8gb3RoZXJFbnRyeS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpIDogb3RoZXJFbnRyeS5nZXRQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKIAkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfY2Fubm90VXNlTGlicmFyeUFzT3V0cHV0LCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgb3RoZXJQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKIAkJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KKworCQkvLyBOT1RFOiBUaGUgYWJvdmUgY29kZSB0aGF0IGNoZWNrcyBmb3IgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1ZFUkxBUFBJTkdfQU5PVEhFUl9TT1VSQ0UsIGNhbiBiZSBjb25maWd1cmVkIHRvIHJldHVybgorCQkvLyBhIFdBUk5JTkcgc3RhdHVzIGFuZCBoZW5jZSBzaG91bGQgYmUgYXQgdGhlIGVuZCBvZiB0aGlzIHZhbGlkYXRpb24gbWV0aG9kLiBBbnkgb3RoZXIgY29kZSB0aGF0IG1pZ2h0IHJldHVybiBhIG1vcmUgc2V2ZXJlIEVSUk9SIHNob3VsZCBiZSAKKwkJLy8gaW5zZXJ0ZWQgYmVmb3JlIHRoZSBtZW50aW9uZWQgY29kZS4KKwkJaWYgKGNhY2hlZFN0YXR1cyAhPSBudWxsKSByZXR1cm4gY2FjaGVkU3RhdHVzOworCiAJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CiAJfQogCkBAIC0xNTQ2LDE5ICsxODQ2LDMxIEBACiAJICoKIAkgKiBAcGFyYW0gcHJvamVjdCB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0CiAJICogQHBhcmFtIGVudHJ5IHRoZSBnaXZlbiBjbGFzc3BhdGggZW50cnkKLQkgKiBAcGFyYW0gY2hlY2tTb3VyY2VBdHRhY2htZW50IGEgZmxhZyB0byBkZXRlcm1pbmUgaWYgc291cmNlIGF0dGFjaGVtZW50IHNob3VsZCBiZSBjaGVja2VkCi0JICogQHBhcmFtIHJlY3Vyc2VJbkNvbnRhaW5lcnMgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBjb250YWluZXIgZW50cmllcyByZWN1cnNpdmVseQorCSAqIEBwYXJhbSBjaGVja1NvdXJjZUF0dGFjaG1lbnQgYSBmbGFnIHRvIGRldGVybWluZSBpZiBzb3VyY2UgYXR0YWNobWVudCBzaG91bGQgYmUgY2hlY2tlZAorCSAqIEBwYXJhbSByZWZlcnJlZEJ5Q29udGFpbmVyIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRyeSBpcyByZWZlcnJlZCBieSBhIGNsYXNzcGF0aCBjb250YWluZXIKIAkgKiBAcmV0dXJuIGEgamF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwgYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgZmluZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGJvb2xlYW4gY2hlY2tTb3VyY2VBdHRhY2htZW50LCBib29sZWFuIHJlY3Vyc2VJbkNvbnRhaW5lcnMpeworCXB1YmxpYyBzdGF0aWMgSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGJvb2xlYW4gY2hlY2tTb3VyY2VBdHRhY2htZW50LCBib29sZWFuIHJlZmVycmVkQnlDb250YWluZXIpeworCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkocHJvamVjdCwgZW50cnksIG51bGwsIGNoZWNrU291cmNlQXR0YWNobWVudCwgcmVmZXJyZWRCeUNvbnRhaW5lcik7CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzExMzYgYW5kIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDAxMzYKKwkJLy8gSWdub3JlIGNsYXNzIHBhdGggZXJyb3JzIGZyb20gb3B0aW9uYWwgZW50cmllcy4KKwkJaW50IHN0YXR1c0NvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworCQlpZiAoIChzdGF0dXNDb2RlID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEggfHwgCisJCQkJc3RhdHVzQ29kZSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQgfHwKKwkJCQlzdGF0dXNDb2RlID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ1BfVkFSSUFCTEVfUEFUSF9VTkJPVU5EIHx8CisJCQkJc3RhdHVzQ29kZSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCkgJiYKKwkJCQkoKENsYXNzcGF0aEVudHJ5KSBlbnRyeSkuaXNPcHRpb25hbCgpKQorCQkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIElDbGFzc3BhdGhDb250YWluZXIgZW50cnlDb250YWluZXIsIGJvb2xlYW4gY2hlY2tTb3VyY2VBdHRhY2htZW50LCBib29sZWFuIHJlZmVycmVkQnlDb250YWluZXIpewogCi0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwogCiAJCS8vIEJ1aWxkIHNvbWUgY29tbW9uIHN0cmluZ3MgZm9yIHN0YXR1cyBtZXNzYWdlCiAJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJYm9vbGVhbiBwYXRoU3RhcnRzV2l0aFByb2plY3QgPSBwcm9qZWN0TmFtZS5lcXVhbHMocGF0aC5zZWdtZW50KDApKTsKLQkJU3RyaW5nIGVudHJ5UGF0aE1zZyA9IHBhdGhTdGFydHNXaXRoUHJvamVjdCA/IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpIDogcGF0aC50b1N0cmluZygpOworCQlTdHJpbmcgZW50cnlQYXRoTXNnID0gcHJvamVjdE5hbWUuZXF1YWxzKHBhdGguc2VnbWVudCgwKSkgPyBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSA6IHBhdGgudG9TdHJpbmcoKTsKIAogCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpewogCkBAIC0xNTY2LDIzICsxODc4LDI3IEBACiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKIAkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+PSAxKXsKIAkJCQkJdHJ5IHsKLQkJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHBhdGgsIHByb2plY3QpOwotCQkJCQkJLy8gY29udGFpbmVyIHJldHJpZXZhbCBpcyBwZXJmb3JtaW5nIHZhbGlkYXRpb24gY2hlY2sgb24gY29udGFpbmVyIGVudHJ5IGtpbmRzLgotCQkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKLQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQsIHByb2plY3QsIHBhdGgpOwotCQkJCQkJfSBlbHNlIGlmIChjb250YWluZXIgPT0gSmF2YU1vZGVsTWFuYWdlci5DT05UQUlORVJfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1MpIHsKLQkJCQkJCQkvLyBWYWxpZGF0ZSBleHRyYSBhdHRyaWJ1dGVzCi0JCQkJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcyA9IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOwotCQkJCQkJCWlmIChleHRyYUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgbGVuZ3RoID0gZXh0cmFBdHRyaWJ1dGVzLmxlbmd0aDsKLQkJCQkJCQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldChsZW5ndGgpOwotCQkJCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCVN0cmluZyBhdHROYW1lID0gZXh0cmFBdHRyaWJ1dGVzW2ldLmdldE5hbWUoKTsKLQkJCQkJCQkJCWlmICghc2V0LmFkZChhdHROYW1lKSkgewotCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2R1cGxpY2F0ZUVudHJ5RXh0cmFBdHRyaWJ1dGUsIG5ldyBTdHJpbmdbXSB7YXR0TmFtZSwgZW50cnlQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKLQkJCQkJCQkJCX0KKwkJCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gbnVsbDsKKwkJCQkJCS8vIFZhbGlkYXRlIGV4dHJhIGF0dHJpYnV0ZXMKKwkJCQkJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKKwkJCQkJCWlmIChleHRyYUF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCQkJCWludCBsZW5ndGggPSBleHRyYUF0dHJpYnV0ZXMubGVuZ3RoOworCQkJCQkJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQobGVuZ3RoKTsKKwkJCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJU3RyaW5nIGF0dE5hbWUgPSBleHRyYUF0dHJpYnV0ZXNbaV0uZ2V0TmFtZSgpOworCQkJCQkJCQlpZiAoIXNldC5hZGQoYXR0TmFtZSkpIHsKKwkJCQkJCQkJCXN0YXR1cyA9IG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZHVwbGljYXRlRW50cnlFeHRyYUF0dHJpYnV0ZSwgbmV3IFN0cmluZ1tdIHthdHROYW1lLCBlbnRyeVBhdGhNc2csIHByb2plY3ROYW1lfSkpOworCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldENsYXNzcGF0aENvbnRhaW5lcihwYXRoLCBwcm9qZWN0KTsKKwkJCQkJCS8vIGNvbnRhaW5lciByZXRyaWV2YWwgaXMgcGVyZm9ybWluZyB2YWxpZGF0aW9uIGNoZWNrIG9uIGNvbnRhaW5lciBlbnRyeSBraW5kcy4KKwkJCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKKwkJCQkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQsIHByb2plY3QsIHBhdGgpOworCQkJCQkJfSBlbHNlIGlmIChjb250YWluZXIgPT0gSmF2YU1vZGVsTWFuYWdlci5DT05UQUlORVJfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1MpIHsKIAkJCQkJCQkvLyBkb24ndCBjcmVhdGUgYSBtYXJrZXIgaWYgaW5pdGlhbGl6YXRpb24gaXMgaW4gcHJvZ3Jlc3MgKGNhc2Ugb2YgY3AgaW5pdGlhbGl6YXRpb24gYmF0Y2hpbmcpCiAJCQkJCQkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIAkJCQkJCX0KQEAgLTE1OTUsMTUgKzE5MTEsMTEgQEAKIAkJCQkJCQkJCXx8IGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UKIAkJCQkJCQkJCXx8IGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRQogCQkJCQkJCQkJfHwga2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUil7Ci0JCQkJCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29udGFpbmVyLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIGRlc2NyaXB0aW9uID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwogCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DUF9DT05UQUlORVJfRU5UUlksIHByb2plY3QsIHBhdGgpOwogCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChyZWN1cnNlSW5Db250YWluZXJzKSB7Ci0JCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzIGNvbnRhaW5lckVudHJ5U3RhdHVzID0gdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShwcm9qZWN0LCBjb250YWluZXJFbnRyeSwgY2hlY2tTb3VyY2VBdHRhY2htZW50LCByZWN1cnNlSW5Db250YWluZXJzKTsKLQkJCQkJCQkJCWlmICghY29udGFpbmVyRW50cnlTdGF0dXMuaXNPSygpKXsKLQkJCQkJCQkJCQlyZXR1cm4gY29udGFpbmVyRW50cnlTdGF0dXM7Ci0JCQkJCQkJCQl9CisJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXMgY29udGFpbmVyRW50cnlTdGF0dXMgPSB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHByb2plY3QsIGNvbnRhaW5lckVudHJ5LCBjb250YWluZXIsIGNoZWNrU291cmNlQXR0YWNobWVudCwgdHJ1ZS8qcmVmZXJyZWQgYnkgY29udGFpbmVyKi8pOworCQkJCQkJCQlpZiAoIWNvbnRhaW5lckVudHJ5U3RhdHVzLmlzT0soKSl7CisJCQkJCQkJCQlyZXR1cm4gY29udGFpbmVyRW50cnlTdGF0dXM7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC0xNjMwLDcgKzE5NDIsNyBAQAogCQkJCQl9CiAKIAkJCQkJLy8gZ2V0IHZhbGlkYXRpb24gc3RhdHVzCi0JCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShwcm9qZWN0LCBlbnRyeSwgY2hlY2tTb3VyY2VBdHRhY2htZW50LCByZWN1cnNlSW5Db250YWluZXJzKTsKKwkJCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHByb2plY3QsIGVudHJ5LCBudWxsLCBjaGVja1NvdXJjZUF0dGFjaG1lbnQsIGZhbHNlLypub3QgcmVmZXJyZWQgYnkgY29udGFpbmVyKi8pOwogCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHJldHVybiBzdGF0dXM7CiAKIAkJCQkJLy8gcmV0dXJuIGRlcHJlY2F0aW9uIHN0YXR1cyBpZiBhbnkKQEAgLTE2NDYsNjIgKzE5NTgsMjYgQEAKIAogCQkJLy8gbGlicmFyeSBlbnRyeSBjaGVjawogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsKLQkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIHRydWUpOwotCQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgIUphdmFDb3JlLklHTk9SRS5lcXVhbHMocHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMLCB0cnVlKSkpIHsKLQkJCQkJCWxvbmcgcHJvamVjdFRhcmdldEpESyA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgdHJ1ZSkpOwotCQkJCQkJbG9uZyBsaWJyYXJ5SkRLID0gVXRpbC5nZXRKZGtMZXZlbCh0YXJnZXQpOwotCQkJCQkJaWYgKGxpYnJhcnlKREsgIT0gMCAmJiBsaWJyYXJ5SkRLID4gcHJvamVjdFRhcmdldEpESykgewotCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5DT01QQVRJQkxFX0pES19MRVZFTCwgcHJvamVjdCwgcGF0aCwgQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Gcm9tSmRrTGV2ZWwobGlicmFyeUpESykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpewotCQkJCQkJSVJlc291cmNlIHJlc29sdmVkUmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7Ci0JCQkJCQlzd2l0Y2gocmVzb2x2ZWRSZXNvdXJjZS5nZXRUeXBlKCkpewotCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQkJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShyZXNvbHZlZFJlc291cmNlLmdldE5hbWUoKSkpIHsKLQkJCQkJCQkJCWlmIChjaGVja1NvdXJjZUF0dGFjaG1lbnQKLQkJCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwKLQkJCQkJCQkJCQkmJiAhc291cmNlQXR0YWNobWVudC5pc0VtcHR5KCkKLQkJCQkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpewotCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VBdHRhY2htZW50LCBuZXcgU3RyaW5nIFtdIHtzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSwgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeUFyY2hpdmUsIG5ldyBTdHJpbmdbXSB7ZW50cnlQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgkvLyBpbnRlcm5hbCBiaW5hcnkgZm9sZGVyCi0JCQkJCQkJCWlmIChjaGVja1NvdXJjZUF0dGFjaG1lbnQKLQkJCQkJCQkJCSYmIHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpCi0JCQkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpewotCQkJCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VBdHRhY2htZW50LCBuZXcgU3RyaW5nIFtdIHtzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSwgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKXsKLQkJCQkJCUZpbGUgZmlsZSA9IEphdmFNb2RlbC5nZXRGaWxlKHRhcmdldCk7Ci0JCQkJCSAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2lsbGVnYWxFeHRlcm5hbEZvbGRlciwgbmV3IFN0cmluZ1tdIHtwYXRoLnRvT1NTdHJpbmcoKSwgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCSAgICB9IGVsc2UgaWYgKCFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeUFyY2hpdmUsIChuZXcgU3RyaW5nW10ge3BhdGgudG9PU1N0cmluZygpLCBwcm9qZWN0TmFtZX0pKSk7Ci0JCQkJCSAgICB9IGVsc2UgaWYgKGNoZWNrU291cmNlQXR0YWNobWVudAotCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpCi0JCQkJCQkJCSYmIEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgc291cmNlQXR0YWNobWVudCwgdHJ1ZSkgPT0gbnVsbCl7Ci0JCQkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kU291cmNlQXR0YWNobWVudCwgbmV3IFN0cmluZyBbXSB7c291cmNlQXR0YWNobWVudC50b1N0cmluZygpLCBwYXRoLnRvT1NTdHJpbmcoKSwgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCSAgICB9CisJCQkJcGF0aCA9IENsYXNzcGF0aEVudHJ5LnJlc29sdmVEb3REb3QocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKSwgcGF0aCk7CisJCQkJCisJCQkJLy8gZG8gbm90IHZhbGlkYXRlIGVudHJpZXMgZnJvbSBDbGFzcy1QYXRoOiBpbiBtYW5pZmVzdAorCQkJCS8vICh0aGVzZSBlbnRyaWVzIGFyZSBjb25zaWRlcmVkIG9wdGlvbmFsIHNpbmNlIHRoZSB1c2VyIGNhbm5vdCBhY3Qgb24gdGhlbSkKKwkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjM5MgorCQkJCQorCQkJCVN0cmluZyBjb250YWluZXJJbmZvID0gbnVsbDsKKwkJCQlpZiAoZW50cnlDb250YWluZXIgIT0gbnVsbCkgeworCQkJCQlpZiAoZW50cnlDb250YWluZXIgaW5zdGFuY2VvZiBVc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lcikgeworCQkJCQkJY29udGFpbmVySW5mbyA9IE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VzZXJMaWJyYXJ5SW5mbywgbmV3IFN0cmluZ1tdIHtlbnRyeUNvbnRhaW5lci5nZXREZXNjcmlwdGlvbigpfSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlib29sZWFuIGlzRXh0ZXJuYWwgPSBwYXRoLmdldERldmljZSgpICE9IG51bGwgfHwgIXdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpLmV4aXN0cygpOwotCQkJCQkJaWYgKGlzRXh0ZXJuYWwpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kTGlicmFyeSwgbmV3IFN0cmluZ1tdIHtwYXRoLnRvT1NTdHJpbmcoKSwgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRMaWJyYXJ5LCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgcHJvamVjdE5hbWV9KSk7Ci0JCQkJCQl9CisJCQkJCQljb250YWluZXJJbmZvID0gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfY29udGFpbmVySW5mbywgbmV3IFN0cmluZ1tdIHtlbnRyeUNvbnRhaW5lci5nZXREZXNjcmlwdGlvbigpfSk7CiAJCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeVBhdGgsIG5ldyBTdHJpbmdbXSB7ZW50cnlQYXRoTXNnLCBwcm9qZWN0TmFtZX0pKTsKIAkJCQl9CisJCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUxpYnJhcnlFbnRyeShwYXRoLCBwcm9qZWN0LCBjb250YWluZXJJbmZvLCBjaGVja1NvdXJjZUF0dGFjaG1lbnQgPyBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpIDogbnVsbCwgZW50cnlQYXRoTXNnKTsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMTM2LCBpZ25vcmUgY2xhc3MgcGF0aCBlcnJvcnMgZnJvbSBvcHRpb25hbCBlbnRyaWVzCisJCQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCAmJiAoKENsYXNzcGF0aEVudHJ5KSBlbnRyeSkuaXNPcHRpb25hbCgpKQorCQkJCQlzdGF0dXMgPSBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQorCQkJCQlyZXR1cm4gc3RhdHVzOwogCQkJCWJyZWFrOwogCiAJCQkvLyBwcm9qZWN0IGVudHJ5IGNoZWNrCkBAIC0xNzIwLDcgKzE5OTYsMTQgQEAKIAkJCQkJCQlsb25nIHByb2plY3RUYXJnZXRKREsgPSBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwocHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIHRydWUpKTsKIAkJCQkJCQlsb25nIHByZXJlcVByb2plY3RUYXJnZXRKREsgPSBDb21waWxlck9wdGlvbnMudmVyc2lvblRvSmRrTGV2ZWwocHJlcmVxUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIHRydWUpKTsKIAkJCQkJCQlpZiAocHJlcmVxUHJvamVjdFRhcmdldEpESyA+IHByb2plY3RUYXJnZXRKREspIHsKLQkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkNPTVBBVElCTEVfSkRLX0xFVkVMLCBwcm9qZWN0LCBwYXRoLCBDb21waWxlck9wdGlvbnMudmVyc2lvbkZyb21KZGtMZXZlbChwcmVyZXFQcm9qZWN0VGFyZ2V0SkRLKSk7CisJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5DT01QQVRJQkxFX0pES19MRVZFTCwKKwkJCQkJCQkJCQlwcm9qZWN0LCBwYXRoLCAKKwkJCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbmNvbXBhdGlibGVMaWJyYXJ5SkRLTGV2ZWwsCisJCQkJCQkJCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJCQkJCQkJCXByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSwKKwkJCQkJCQkJCQkJCQlDb21waWxlck9wdGlvbnMudmVyc2lvbkZyb21KZGtMZXZlbChwcm9qZWN0VGFyZ2V0SkRLKSwgCisJCQkJCQkJCQkJCQkJcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLAorCQkJCQkJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy52ZXJzaW9uRnJvbUpka0xldmVsKHByZXJlcVByb2plY3RUYXJnZXRKREspfSkpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKQEAgLTE3MzQsNyArMjAxNyw3IEBACiAJCQkvLyBwcm9qZWN0IHNvdXJjZSBmb2xkZXIKIAkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgogCQkJCWlmICgoKGVudHJ5LmdldEluY2x1c2lvblBhdHRlcm5zKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRJbmNsdXNpb25QYXR0ZXJucygpLmxlbmd0aCA+IDApCi0JCQkJICAgICAgICAJfHwgKGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRFeGNsdXNpb25QYXR0ZXJucygpLmxlbmd0aCA+IDApKQorCQkJCQkJfHwgKGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRFeGNsdXNpb25QYXR0ZXJucygpLmxlbmd0aCA+IDApKQogCQkJCQkJJiYgSmF2YUNvcmUuRElTQUJMRUQuZXF1YWxzKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMsIHRydWUpKSkgewogCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkRJU0FCTEVEX0NQX0VYQ0xVU0lPTl9QQVRURVJOUywgcHJvamVjdCwgcGF0aCk7CiAJCQkJfQpAQCAtMTc0Myw3ICsyMDI2LDcgQEAKIAkJCQl9CiAJCQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpICYmICFwYXRoLmlzRW1wdHkoKSkgewogCQkJCQlJUGF0aCBwcm9qZWN0UGF0aD0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJaWYgKCFwcm9qZWN0UGF0aC5pc1ByZWZpeE9mKHBhdGgpIHx8IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgcGF0aCwgdHJ1ZSkgPT0gbnVsbCl7CisJCQkJCWlmICghcHJvamVjdFBhdGguaXNQcmVmaXhPZihwYXRoKSB8fCBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHBhdGgsIHRydWUpID09IG51bGwpewogCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUZvbGRlciwgbmV3IFN0cmluZ1tdIHtlbnRyeVBhdGhNc2csIHByb2plY3ROYW1lfSkpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKQEAgLTE3NjcsNCArMjA1MCwxNDIgQEAKIAogCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCX0KKworCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4MTYsIE5vdyB3ZSBoYXZlIHRoZSBmYWNpbGl0eSB0byBpbmNsdWRlIGEgY29udGFpbmVyCisJLy8gbmFtZSBpbiBkaWFnbm9zdGljcy4gSWYgdGhlIHBhcmFtZXRlciBgYGNvbnRhaW5lcicnIGlzIG5vdCBudWxsLCBpdCBpcyB1c2VkIHRvIHBvaW50IHRvIHRoZSBsaWJyYXJ5CisJLy8gbW9yZSBmdWxseS4KKwlwcml2YXRlIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlTGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGFpbmVyLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50LCBTdHJpbmcgZW50cnlQYXRoTXNnKSB7CisJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHBhdGgsIHRydWUpOworCQkJaWYgKHRhcmdldCA9PSBudWxsKSB7IC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDg2NjEKKwkJCQlJUGF0aCB3b3Jrc3BhY2VMb2NhdGlvbiA9IHdvcmtzcGFjZVJvb3QuZ2V0TG9jYXRpb24oKTsgCisJCQkJaWYgKHdvcmtzcGFjZUxvY2F0aW9uLmlzUHJlZml4T2YocGF0aCkpIHsKKwkJCQkJdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLm1ha2VSZWxhdGl2ZVRvKHdvcmtzcGFjZUxvY2F0aW9uKS5tYWtlQWJzb2x1dGUoKSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHRhcmdldCAhPSBudWxsICYmICFKYXZhQ29yZS5JR05PUkUuZXF1YWxzKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSU5DT01QQVRJQkxFX0pES19MRVZFTCwgdHJ1ZSkpKSB7CisJCQkJbG9uZyBwcm9qZWN0VGFyZ2V0SkRLID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCB0cnVlKSk7CisJCQkJbG9uZyBsaWJyYXJ5SkRLID0gVXRpbC5nZXRKZGtMZXZlbCh0YXJnZXQpOworCQkJCWlmIChsaWJyYXJ5SkRLICE9IDAgJiYgbGlicmFyeUpESyA+IHByb2plY3RUYXJnZXRKREspIHsKKwkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOQ09NUEFUSUJMRV9KREtfTEVWRUwsCisJCQkJCQkJCXByb2plY3QsIHBhdGgsCisJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2luY29tcGF0aWJsZUxpYnJhcnlKREtMZXZlbEluQ29udGFpbmVyLAorCQkJCQkJCQkJCW5ldyBTdHJpbmcgW10geworCQkJCQkJCQkJCQlwcm9qZWN0LmdldEVsZW1lbnROYW1lKCksCisJCQkJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy52ZXJzaW9uRnJvbUpka0xldmVsKHByb2plY3RUYXJnZXRKREspLAorCQkJCQkJCQkJCQlwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksCisJCQkJCQkJCQkJCWNvbnRhaW5lciwKKwkJCQkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Gcm9tSmRrTGV2ZWwobGlicmFyeUpESyl9KSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOQ09NUEFUSUJMRV9KREtfTEVWRUwsCisJCQkJCQkJCXByb2plY3QsIHBhdGgsIAorCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbmNvbXBhdGlibGVMaWJyYXJ5SkRLTGV2ZWwsCisJCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQkJCQkJcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLAorCQkJCQkJCQkJCQlDb21waWxlck9wdGlvbnMudmVyc2lvbkZyb21KZGtMZXZlbChwcm9qZWN0VGFyZ2V0SkRLKSwgCisJCQkJCQkJCQkJCXBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwKKwkJCQkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Gcm9tSmRrTGV2ZWwobGlicmFyeUpESyl9KSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKKwkJCQlJUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKKwkJCQlzd2l0Y2gocmVzb2x2ZWRSZXNvdXJjZS5nZXRUeXBlKCkpeworCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQkJCWlmIChzb3VyY2VBdHRhY2htZW50ICE9IG51bGwKKwkJCQkJCQkmJiAhc291cmNlQXR0YWNobWVudC5pc0VtcHR5KCkKKwkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpeworCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgeworCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kU291cmNlQXR0YWNobWVudEluQ29udGFpbmVkTGlicmFyeSwgbmV3IFN0cmluZyBbXSB7c291cmNlQXR0YWNobWVudC50b1N0cmluZygpLCBwYXRoLnRvU3RyaW5nKCksIGNvbnRhaW5lcn0pKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kU291cmNlQXR0YWNobWVudCwgbmV3IFN0cmluZyBbXSB7c291cmNlQXR0YWNobWVudC50b1N0cmluZygpLCBwYXRoLnRvU3RyaW5nKCksIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MDQyCisJCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUKKwkJCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVMaWJyYXJ5Q29udGVudHMocGF0aCwgcHJvamVjdCwgZW50cnlQYXRoTXNnKTsKKwkJCQkJCWlmIChzdGF0dXMgIT0gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LKSAKKwkJCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CS8vIGludGVybmFsIGJpbmFyeSBmb2xkZXIKKwkJCQkJCWlmIChzb3VyY2VBdHRhY2htZW50ICE9IG51bGwKKwkJCQkJCQkmJiAhc291cmNlQXR0YWNobWVudC5pc0VtcHR5KCkKKwkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpeworCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgeworCQkJCQkJCQlyZXR1cm4gIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUF0dGFjaG1lbnRJbkNvbnRhaW5lZExpYnJhcnksIG5ldyBTdHJpbmcgW10ge3NvdXJjZUF0dGFjaG1lbnQudG9TdHJpbmcoKSwgcGF0aC50b1N0cmluZygpLCBjb250YWluZXJ9KSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VBdHRhY2htZW50LCBuZXcgU3RyaW5nIFtdIHtzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpeworCQkJCUZpbGUgZmlsZSA9IEphdmFNb2RlbC5nZXRGaWxlKHRhcmdldCk7CisJCQkJaWYgKGZpbGUgPT0gbnVsbCkgeworCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbGxlZ2FsRXh0ZXJuYWxGb2xkZXJJbkNvbnRhaW5lciwgbmV3IFN0cmluZ1tdIHtwYXRoLnRvT1NTdHJpbmcoKSwgY29udGFpbmVyfSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2lsbGVnYWxFeHRlcm5hbEZvbGRlciwgbmV3IFN0cmluZ1tdIHtwYXRoLnRvT1NTdHJpbmcoKSwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbAorCQkJCQkJCSYmICFzb3VyY2VBdHRhY2htZW50LmlzRW1wdHkoKQorCQkJCQkJCSYmIEphdmFNb2RlbC5nZXRUYXJnZXQoc291cmNlQXR0YWNobWVudCwgdHJ1ZSkgPT0gbnVsbCl7CisJCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKwkJCQkJCQlyZXR1cm4gIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUF0dGFjaG1lbnRJbkNvbnRhaW5lZExpYnJhcnksIG5ldyBTdHJpbmcgW10ge3NvdXJjZUF0dGFjaG1lbnQudG9TdHJpbmcoKSwgcGF0aC50b09TU3RyaW5nKCksIGNvbnRhaW5lcn0pKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VBdHRhY2htZW50LCBuZXcgU3RyaW5nIFtdIHtzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9PU1N0cmluZygpLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTA0MgorCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUKKwkJCQkJaWYoZmlsZS5pc0ZpbGUoKSkgeworCQkJCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUxpYnJhcnlDb250ZW50cyhwYXRoLCBwcm9qZWN0LCBlbnRyeVBhdGhNc2cpOworCQkJCQkJaWYgKHN0YXR1cyAhPSBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0spIAorCQkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJvb2xlYW4gaXNFeHRlcm5hbCA9IHBhdGguZ2V0RGV2aWNlKCkgIT0gbnVsbCB8fCAhUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSkuZXhpc3RzKCk7CisJCQkJaWYgKGlzRXh0ZXJuYWwpIHsKKwkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kTGlicmFyeUluQ29udGFpbmVyLCBuZXcgU3RyaW5nW10ge3BhdGgudG9PU1N0cmluZygpLCBjb250YWluZXJ9KSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kTGlicmFyeSwgbmV3IFN0cmluZ1tdIHtwYXRoLnRvT1NTdHJpbmcoKSwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSkpOwkKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChlbnRyeVBhdGhNc2cgPT0gbnVsbCkgCisJCQkJCQllbnRyeVBhdGhNc2cgPSAJcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpID8gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkgOiBwYXRoLnRvU3RyaW5nKCk7CisJCQkJCWlmIChjb250YWluZXIhPSBudWxsKSB7CQorCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZExpYnJhcnlJbkNvbnRhaW5lciwgbmV3IFN0cmluZ1tdIHtlbnRyeVBhdGhNc2csIGNvbnRhaW5lcn0pKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3VuYm91bmRMaWJyYXJ5LCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGVudHJ5UGF0aE1zZyA9PSBudWxsKSAKKwkJCQllbnRyeVBhdGhNc2cgPSAJcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpID8gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkgOiBwYXRoLnRvU3RyaW5nKCk7CisJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2lsbGVnYWxMaWJyYXJ5UGF0aEluQ29udGFpbmVyLCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aE1zZywgY29udGFpbmVyfSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2lsbGVnYWxMaWJyYXJ5UGF0aCwgbmV3IFN0cmluZ1tdIHtlbnRyeVBhdGhNc2csIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pKTsKKwkJCQl9CisJCX0KKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlTGlicmFyeUNvbnRlbnRzKElQYXRoIHBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZW50cnlQYXRoTXNnKSB7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQl0cnkgeworCQkJbWFuYWdlci52ZXJpZnlBcmNoaXZlQ29udGVudChwYXRoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkgPT0gTWVzc2FnZXMuc3RhdHVzX0lPRXhjZXB0aW9uKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgTWVzc2FnZXMuYmluZCgKKwkJCQkJCU1lc3NhZ2VzLmNsYXNzcGF0aF9hcmNoaXZlUmVhZEVycm9yLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtlbnRyeVBhdGhNc2csIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aFZhbGlkYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aFZhbGlkYXRpb24uamF2YQppbmRleCAwM2NlOWU1Li4zNDU1MzVhIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhWYWxpZGF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoVmFsaWRhdGlvbi5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIsOSArMTIsOSBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuSmF2YUJ1aWxkZXI7CiAKQEAgLTIzLDEzICsyMywxMyBAQAogICogdXBkYXRpbmcgbWFya2VycyBpZiBuZWNlc3NhcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBDbGFzc3BhdGhWYWxpZGF0aW9uIHsKLQkKKwogCXByaXZhdGUgSmF2YVByb2plY3QgcHJvamVjdDsKLQkKKwogCXB1YmxpYyBDbGFzc3BhdGhWYWxpZGF0aW9uKEphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKIAkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbzsKIAkJdHJ5IHsKQEAgLTM4LDE0ICszOCwxNCBAQAogCQkJLy8gcHJvamVjdCBkb2Vzbid0IGV4aXN0CiAJCQlJUHJvamVjdCByZXNvdXJjZSA9IHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCk7CiAJCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQl0aGlzLnByb2plY3QuZmx1c2hDbGFzc3BhdGhQcm9ibGVtTWFya2Vycyh0cnVlLypmbHVzaCBjeWNsZSBtYXJrZXJzKi8sIHRydWUvKmZsdXNoIGNsYXNzcGF0aCBmb3JtYXQgbWFya2VycyovKTsKLQkJCQkJCisJCQkJdGhpcy5wcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnModHJ1ZS8qZmx1c2ggY3ljbGUgbWFya2VycyovLCB0cnVlLypmbHVzaCBjbGFzc3BhdGggZm9ybWF0IG1hcmtlcnMqLywgdHJ1ZSAvKmZsdXNoIG92ZXJsYXBwaW5nIG91dHB1dCBtYXJrZXJzKi8pOworCiAJCQkJLy8gcmVtb3ZlIHByb2JsZW1zIGFuZCB0YXNrcyBjcmVhdGVkICBieSB0aGUgYnVpbGRlcgogCQkJCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IocmVzb3VyY2UpOwogCQkJfQogCQkJcmV0dXJuOwogCQl9Ci0JCQorCiAJCS8vIHVzZSBzeW5jaHJvbml6ZWQgYmxvY2sgdG8gZW5zdXJlIGNvbnNpc3RlbmN5CiAJCUlDbGFzc3BhdGhFbnRyeVtdIHJhd0NsYXNzcGF0aDsKIAkJSVBhdGggb3V0cHV0TG9jYXRpb247CkBAIC01NSwyNiArNTUsMjcgQEAKIAkJCW91dHB1dExvY2F0aW9uID0gcGVyUHJvamVjdEluZm8ub3V0cHV0TG9jYXRpb247CiAJCQlzdGF0dXMgPSBwZXJQcm9qZWN0SW5mby5yYXdDbGFzc3BhdGhTdGF0dXM7IC8vIHN0YXR1cyBoYXMgYmVlbiBzZXQgZHVyaW5nIFBPU1RfQ0hBTkdFCiAJCX0KLQkJCisKIAkJLy8gdXBkYXRlIGNsYXNzcGF0aCBmb3JtYXQgcHJvYmxlbXMKLQkJdGhpcy5wcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoZmFsc2UvKmN5Y2xlKi8sIHRydWUvKmZvcm1hdCovKTsKKwkJdGhpcy5wcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoZmFsc2UvKmN5Y2xlKi8sIHRydWUvKmZvcm1hdCovLCBmYWxzZS8qb3ZlcmxhcHBpbmcqLyk7CiAJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXRoaXMucHJvamVjdC5jcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKHN0YXR1cyk7CQorCQkJdGhpcy5wcm9qZWN0LmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoc3RhdHVzKTsKKworCQkvLyB1cGRhdGUgb3ZlcmxhcHBpbmcgb3V0cHV0IHByb2JsZW0gbWFya2VycyAKKwkJdGhpcy5wcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoZmFsc2UvKmN5Y2xlKi8sIGZhbHNlLypmb3JtYXQqLywgdHJ1ZS8qb3ZlcmxhcHBpbmcqLyk7CiAJCQogCQkvLyB1cGRhdGUgcmVzb2x2ZWQgY2xhc3NwYXRoIHByb2JsZW1zCi0JCXRoaXMucHJvamVjdC5mbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKGZhbHNlLypjeWNsZSovLCBmYWxzZS8qZm9ybWF0Ki8pOwotCQkKKwkJdGhpcy5wcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoZmFsc2UvKmN5Y2xlKi8sIGZhbHNlLypmb3JtYXQqLywgZmFsc2UvKm92ZXJsYXBwaW5nKi8pOworCiAJCWlmIChyYXdDbGFzc3BhdGggIT0gSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEggJiYgb3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgewogCQkgCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3Q2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RhdHVzID0gQ2xhc3NwYXRoRW50cnkudmFsaWRhdGVDbGFzc3BhdGhFbnRyeSh0aGlzLnByb2plY3QsIHJhd0NsYXNzcGF0aFtpXSwgZmFsc2UvKnNyYyBhdHRhY2gqLywgdHJ1ZSAvKnJlY3Vyc2UgaW4gY29udGFpbmVyKi8pOworCQkJCXN0YXR1cyA9IENsYXNzcGF0aEVudHJ5LnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkodGhpcy5wcm9qZWN0LCByYXdDbGFzc3BhdGhbaV0sIGZhbHNlLypzcmMgYXR0YWNoKi8sIGZhbHNlIC8qbm90IHJlZmVycmVkIGJ5IGEgY29udGFpbmVyKi8pOwogCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRIICYmICgoQ2xhc3NwYXRoRW50cnkpIHJhd0NsYXNzcGF0aFtpXSkuaXNPcHRpb25hbCgpKQotCQkJCQkJY29udGludWU7IC8vIGlnbm9yZSB0aGlzIGVudHJ5Ci0JCQkJCXRoaXMucHJvamVjdC5jcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKHN0YXR1cyk7CQorCQkJCQl0aGlzLnByb2plY3QuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihzdGF0dXMpOwogCQkJCX0KIAkJCSB9CiAJCQlzdGF0dXMgPSBDbGFzc3BhdGhFbnRyeS52YWxpZGF0ZUNsYXNzcGF0aCh0aGlzLnByb2plY3QsIHJhd0NsYXNzcGF0aCwgb3V0cHV0TG9jYXRpb24pOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSAKKwkJCWlmIChzdGF0dXMuZ2V0Q29kZSgpICE9IElTdGF0dXMuT0spCiAJCQkJdGhpcy5wcm9qZWN0LmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoc3RhdHVzKTsKIAkJIH0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQppbmRleCA4NGE3ZWE1Li5iMWFjY2FiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNjgsMTUgKzY4LDE1IEBACiAJICovCiAJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0cnkgewotCQkJYmVnaW5UYXNrKE1lc3NhZ2VzLndvcmtpbmdDb3B5X2NvbW1pdCwgMik7IAorCQkJYmVnaW5UYXNrKE1lc3NhZ2VzLndvcmtpbmdDb3B5X2NvbW1pdCwgMik7CiAJCQlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQorCiAJCQlpZiAoRXh0ZXJuYWxKYXZhUHJvamVjdC5FWFRFUk5BTF9QUk9KRUNUX05BTUUuZXF1YWxzKHdvcmtpbmdDb3B5LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpIHsKIAkJCQkvLyBjYXNlIG9mIGEgd29ya2luZyBjb3B5IHdpdGhvdXQgYSByZXNvdXJjZQogCQkJCXdvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNhdmUodGhpcy5wcm9ncmVzc01vbml0b3IsIHRoaXMuZm9yY2UpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCQorCiAJCQlJQ29tcGlsYXRpb25Vbml0IHByaW1hcnkgPSB3b3JraW5nQ29weS5nZXRQcmltYXJ5KCk7CiAJCQlib29sZWFuIGlzUHJpbWFyeSA9IHdvcmtpbmdDb3B5LmlzUHJpbWFyeSgpOwogCkBAIC04Niw3ICs4Niw3IEBACiAJCQlJRmlsZSByZXNvdXJjZSA9IChJRmlsZSl3b3JraW5nQ29weS5nZXRSZXNvdXJjZSgpOwogCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSByb290LmdldEphdmFQcm9qZWN0KCk7CiAJCQlpZiAoaXNQcmltYXJ5IHx8IChyb290LnZhbGlkYXRlT25DbGFzc3BhdGgoKS5pc09LKCkgJiYgaXNJbmNsdWRlZCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiBVdGlsLmlzVmFsaWRDb21waWxhdGlvblVuaXROYW1lKHdvcmtpbmdDb3B5LmdldEVsZW1lbnROYW1lKCksIHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSksIHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpKSkpIHsKLQkJCQkKKwogCQkJCS8vIGZvcmNlIG9wZW5pbmcgc28gdGhhdCB0aGUgZGVsdGEgYnVpbGRlciBjYW4gZ2V0IHRoZSBvbGQgaW5mbwogCQkJCWlmICghaXNQcmltYXJ5ICYmICFwcmltYXJ5LmlzT3BlbigpKSB7CiAJCQkJCXByaW1hcnkub3BlbihudWxsKTsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCQlpZiAoaXNJbmNsdWRlZCAmJiAoIWlzUHJpbWFyeSB8fCAhd29ya2luZ0NvcHkuaXNDb25zaXN0ZW50KCkpKSB7CiAJCQkJCWRlbHRhQnVpbGRlciA9IG5ldyBKYXZhRWxlbWVudERlbHRhQnVpbGRlcihwcmltYXJ5KTsKIAkJCQl9Ci0JCQkKKwogCQkJCS8vIHNhdmUgdGhlIGN1CiAJCQkJSUJ1ZmZlciBwcmltYXJ5QnVmZmVyID0gcHJpbWFyeS5nZXRCdWZmZXIoKTsKIAkJCQlpZiAoIWlzUHJpbWFyeSkgewpAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIAkJCQlTdHJpbmcgY29udGVudHMgPSB3b3JraW5nQ29weS5nZXRTb3VyY2UoKTsKIAkJCQlpZiAoY29udGVudHMgPT0gbnVsbCkgcmV0dXJuOwogCQkJCXRyeSB7Ci0JCQkJCWJ5dGVbXSBieXRlcyA9IGVuY29kaW5nID09IG51bGwgCi0JCQkJCQk/IGNvbnRlbnRzLmdldEJ5dGVzKCkgCisJCQkJCWJ5dGVbXSBieXRlcyA9IGVuY29kaW5nID09IG51bGwKKwkJCQkJCT8gY29udGVudHMuZ2V0Qnl0ZXMoKQogCQkJCQkJOiBjb250ZW50cy5nZXRCeXRlcyhlbmNvZGluZyk7CiAJCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CiAJCQkJCWlmIChyZXNvdXJjZS5leGlzdHMoKSkgewogCQkJCQkJcmVzb3VyY2Uuc2V0Q29udGVudHMoCi0JCQkJCQkJc3RyZWFtLCAKLQkJCQkJCQl0aGlzLmZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCQkJCXN0cmVhbSwKKwkJCQkJCQl0aGlzLmZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksCiAJCQkJCQkJbnVsbCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlyZXNvdXJjZS5jcmVhdGUoCkBAIC0xNTUsMjcgKzE1NSwyNyBAQAogCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKIAkJCQl9Ci0JCQkJCisKIAkJCX0KIAotCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCi0JCQkKKwkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CisKIAkJCS8vIG1ha2Ugc3VyZSB3b3JraW5nIGNvcHkgaXMgaW4gc3luYwogCQkJd29ya2luZ0NvcHkudXBkYXRlVGltZVN0YW1wKChDb21waWxhdGlvblVuaXQpcHJpbWFyeSk7CiAJCQl3b3JraW5nQ29weS5tYWtlQ29uc2lzdGVudCh0aGlzKTsKIAkJCXdvcmtlZCgxKTsKLQkJCisKIAkJCS8vIGJ1aWxkIHRoZSBkZWx0YXMKIAkJCWlmIChkZWx0YUJ1aWxkZXIgIT0gbnVsbCkgewogCQkJCWRlbHRhQnVpbGRlci5idWlsZERlbHRhcygpOwotCQkJCisKIAkJCQkvLyBhZGQgdGhlIGRlbHRhcyB0byB0aGUgbGlzdCBvZiBkZWx0YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24KIAkJCQlpZiAoZGVsdGFCdWlsZGVyLmRlbHRhICE9IG51bGwpIHsKIAkJCQkJYWRkRGVsdGEoZGVsdGFCdWlsZGVyLmRlbHRhKTsKIAkJCQl9CiAJCQl9CiAJCQl3b3JrZWQoMSk7Ci0JCX0gZmluYWxseSB7CQorCQl9IGZpbmFsbHkgewogCQkJZG9uZSgpOwogCQl9CiAJfQpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVQREFURV9DT05GTElDVCk7CiAJCX0KIAkJLy8gbm8gcmVhZC1vbmx5IGNoZWNrLCBzaW5jZSBzb21lIHJlcG9zaXRvcnkgYWRhcHRlcnMgY2FuIGNoYW5nZSB0aGUgZmxhZyBvbiBzYXZlCi0JCS8vIG9wZXJhdGlvbi4JCisJCS8vIG9wZXJhdGlvbi4KIAkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhCmluZGV4IDYzNmNlNzMuLmFlNjQ4YWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsMTEgKzcsMTIgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQWxleCBTbWlybm9mZiAoYWxleHNtckBzeW1wYXRpY28uY2EpIC0gcGFydCBvZiB0aGUgY2hhbmdlcyB0byBzdXBwb3J0IEphdmEtbGlrZSBleHRlbnNpb24gCisgKiAgICAgQWxleCBTbWlybm9mZiAoYWxleHNtckBzeW1wYXRpY28uY2EpIC0gcGFydCBvZiB0aGUgY2hhbmdlcyB0byBzdXBwb3J0IEphdmEtbGlrZSBleHRlbnNpb24KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NjApCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKQEAgLTIzLDEyICsyNCwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZW1lbnRvVG9rZW5pemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVW5kb0VkaXQ7CisKIC8qKgogICogQHNlZSBJQ29tcGlsYXRpb25Vbml0CiAgKi8KQEAgLTM5LDkgKzQ4LDkgQEAKIAkgKiBAZGVwcmVjYXRlZAogCSAqLwogCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgSkxTMl9JTlRFUk5BTCA9IEFTVC5KTFMyOwotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUltcG9ydERlY2xhcmF0aW9uW10gTk9fSU1QT1JUUyA9IG5ldyBJSW1wb3J0RGVjbGFyYXRpb25bMF07Ci0JCisKIAlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CiAJcHVibGljIFdvcmtpbmdDb3B5T3duZXIgb3duZXI7CiAKQEAgLTU0LDYgKzYzLDI5IEBACiAJdGhpcy5uYW1lID0gbmFtZTsKIAl0aGlzLm93bmVyID0gb3duZXI7CiB9CisKKworLyoKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNhcHBseVRleHRFZGl0KFRleHRFZGl0LCBJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgVW5kb0VkaXQgYXBwbHlUZXh0RWRpdChUZXh0RWRpdCBlZGl0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElCdWZmZXIuSVRleHRFZGl0Q2FwYWJpbGl0eSkgeworCQlyZXR1cm4gKChJQnVmZmVyLklUZXh0RWRpdENhcGFiaWxpdHkpIGJ1ZmZlcikuYXBwbHlUZXh0RWRpdChlZGl0LCBtb25pdG9yKTsKKwl9IGVsc2UgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisJCUlEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlciBpbnN0YW5jZW9mIElEb2N1bWVudCA/IChJRG9jdW1lbnQpIGJ1ZmZlciA6IG5ldyBEb2N1bWVudEFkYXB0ZXIoYnVmZmVyKTsKKwkJdHJ5IHsKKwkJCVVuZG9FZGl0IHVuZG9FZGl0PSBlZGl0LmFwcGx5KGRvY3VtZW50KTsKKwkJCXJldHVybiB1bmRvRWRpdDsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQkFEX1RFWFRfRURJVF9MT0NBVElPTik7CisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5CQURfVEVYVF9FRElUX0xPQ0FUSU9OKTsKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsgLy8gY2FuIG5vdCBoYXBwZW4sIHRoZXJlIGFyZSBubyBjb21waWxhdGlvbiB1bml0cyB3aXRob3V0IGJ1ZmZlcgorfQorCiAvKgogICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5KElQcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKQogICovCkBAIC03NiwzMSArMTA4LDEyIEBACiAJYmVjb21lV29ya2luZ0NvcHkocmVxdWVzdG9yLCBtb25pdG9yKTsKIH0KIHByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3RydWN0dXJlKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSwgTWFwIG5ld0VsZW1lbnRzLCBJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCS8vIGNoZWNrIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgb3BlbmVkCi0JaWYgKCFpc1dvcmtpbmdDb3B5KCkpIHsgLy8gbm8gY2hlY2sgaXMgZG9uZSBvbiByb290IGtpbmQgb3IgZXhjbHVzaW9uIHBhdHRlcm4gZm9yIHdvcmtpbmcgY29waWVzCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVDb21waWxhdGlvblVuaXQodW5kZXJseWluZ1Jlc291cmNlKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB0aHJvdyBuZXdKYXZhTW9kZWxFeGNlcHRpb24oc3RhdHVzKTsKLQl9Ci0JCi0JLy8gcHJldmVudHMgcmVvcGVuaW5nIG9mIG5vbi1wcmltYXJ5IHdvcmtpbmcgY29waWVzICh0aGV5IGFyZSBjbG9zZWQgd2hlbiB0aGV5IGFyZSBkaXNjYXJkZWQgYW5kIHNob3VsZCBub3QgYmUgcmVvcGVuZWQpCi0JaWYgKCFpc1ByaW1hcnkoKSAmJiBnZXRQZXJXb3JraW5nQ29weUluZm8oKSA9PSBudWxsKSB7Ci0JCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKLQl9Ci0KIAlDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyB1bml0SW5mbyA9IChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgaW5mbzsKIAotCS8vIGdldCBidWZmZXIgY29udGVudHMKKwkvLyBlbnN1cmUgYnVmZmVyIGlzIG9wZW5lZAogCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyTWFuYWdlcigpLmdldEJ1ZmZlcihDb21waWxhdGlvblVuaXQudGhpcyk7CiAJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCWJ1ZmZlciA9IG9wZW5CdWZmZXIocG0sIHVuaXRJbmZvKTsgLy8gb3BlbiBidWZmZXIgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBpbmZvLCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgdGhlIGluZm8KLQl9Ci0JZmluYWwgY2hhcltdIGNvbnRlbnRzOwotCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQljb250ZW50cyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA7Ci0JfSBlbHNlIHsKLQkJY2hhcltdIGNoYXJhY3RlcnMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCQljb250ZW50cyA9IGNoYXJhY3RlcnMgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IGNoYXJhY3RlcnM7CisJCW9wZW5CdWZmZXIocG0sIHVuaXRJbmZvKTsgLy8gb3BlbiBidWZmZXIgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBpbmZvLCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgdGhlIGluZm8KIAl9CiAKIAkvLyBnZW5lcmF0ZSBzdHJ1Y3R1cmUgYW5kIGNvbXB1dGUgc3ludGF4IHByb2JsZW1zIGlmIG5lZWRlZApAQCAtMTI0LDcgKzEzNyw3IEBACiAJCXJlY29uY2lsZUZsYWdzID0gMDsKIAkJcHJvYmxlbXMgPSBudWxsOwogCX0KLQkKKwogCWJvb2xlYW4gY29tcHV0ZVByb2JsZW1zID0gcGVyV29ya2luZ0NvcHlJbmZvICE9IG51bGwgJiYgcGVyV29ya2luZ0NvcHlJbmZvLmlzQWN0aXZlKCkgJiYgcHJvamVjdCAhPSBudWxsICYmIEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdC5nZXRQcm9qZWN0KCkpOwogCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSA9IG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKTsKIAlNYXAgb3B0aW9ucyA9IHByb2plY3QgPT0gbnVsbCA/IEphdmFDb3JlLmdldE9wdGlvbnMoKSA6IHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKQEAgLTEzMiwzNiArMTQ1LDIyIEBACiAJCS8vIGRpc2FibGUgdGFzayB0YWdzIGNoZWNraW5nIHRvIHNwZWVkIHVwIHBhcnNpbmcKIAkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAl9CisJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMob3B0aW9ucyk7CisJY29tcGlsZXJPcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcyA9IChyZWNvbmNpbGVGbGFncyAmIElDb21waWxhdGlvblVuaXQuSUdOT1JFX01FVEhPRF9CT0RJRVMpICE9IDA7CiAJU291cmNlRWxlbWVudFBhcnNlciBwYXJzZXIgPSBuZXcgU291cmNlRWxlbWVudFBhcnNlcigKLQkJcmVxdWVzdG9yLCAKLQkJcHJvYmxlbUZhY3RvcnksIAotCQluZXcgQ29tcGlsZXJPcHRpb25zKG9wdGlvbnMpLAorCQlyZXF1ZXN0b3IsCisJCXByb2JsZW1GYWN0b3J5LAorCQljb21waWxlck9wdGlvbnMsCiAJCXRydWUvKnJlcG9ydCBsb2NhbCBkZWNsYXJhdGlvbnMqLywKIAkJIWNyZWF0ZUFTVCAvKm9wdGltaXplIHN0cmluZyBsaXRlcmFscyBvbmx5IGlmIG5vdCBjcmVhdGluZyBhIERPTSBBU1QqLyk7CiAJcGFyc2VyLnJlcG9ydE9ubHlPbmVTeW50YXhFcnJvciA9ICFjb21wdXRlUHJvYmxlbXM7CiAJcGFyc2VyLnNldE1ldGhvZHNGdWxsUmVjb3ZlcnkodHJ1ZSk7CiAJcGFyc2VyLnNldFN0YXRlbWVudHNSZWNvdmVyeSgocmVjb25jaWxlRmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkVOQUJMRV9TVEFURU1FTlRTX1JFQ09WRVJZKSAhPSAwKTsKLQkKKwogCWlmICghY29tcHV0ZVByb2JsZW1zICYmICFyZXNvbHZlQmluZGluZ3MgJiYgIWNyZWF0ZUFTVCkgLy8gZGlzYWJsZSBqYXZhZG9jIHBhcnNpbmcgaWYgbm90IGNvbXB1dGluZyBwcm9ibGVtcywgbm90IHJlc29sdmluZyBhbmQgbm90IGNyZWF0aW5nIGFzdAogCQlwYXJzZXIuamF2YWRvY1BhcnNlci5jaGVja0RvY0NvbW1lbnQgPSBmYWxzZTsKIAlyZXF1ZXN0b3IucGFyc2VyID0gcGFyc2VyOwotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoCi0JCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQoKSB7Ci0JCQlwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgewotCQkJCXJldHVybiBjb250ZW50czsKLQkJCX0KLQkJCXB1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgewotCQkJCXJldHVybiBDb21waWxhdGlvblVuaXQudGhpcy5nZXRNYWluVHlwZU5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJCQlyZXR1cm4gQ29tcGlsYXRpb25Vbml0LnRoaXMuZ2V0UGFja2FnZU5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdC50aGlzLmdldEZpbGVOYW1lKCk7Ci0JCQl9Ci0JCX0sIAotCQl0cnVlIC8qZnVsbCBwYXJzZSB0byBmaW5kIGxvY2FsIGVsZW1lbnRzKi8pOwotCQorCiAJLy8gdXBkYXRlIHRpbWVzdGFtcCAobWlnaHQgYmUgSVJlc291cmNlLk5VTExfU1RBTVAgaWYgb3JpZ2luYWwgZG9lcyBub3QgZXhpc3QpCiAJaWYgKHVuZGVybHlpbmdSZXNvdXJjZSA9PSBudWxsKSB7CiAJCXVuZGVybHlpbmdSZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CkBAIC0xNjksMTUgKzE2OCwxNiBAQAogCS8vIHVuZGVybHlpbmcgcmVzb3VyY2UgaXMgbnVsbCBpbiB0aGUgY2FzZSBvZiBhIHdvcmtpbmcgY29weSBvbiBhIGNsYXNzIGZpbGUgaW4gYSBqYXIKIAlpZiAodW5kZXJseWluZ1Jlc291cmNlICE9IG51bGwpCiAJCXVuaXRJbmZvLnRpbWVzdGFtcCA9ICgoSUZpbGUpdW5kZXJseWluZ1Jlc291cmNlKS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQorCiAJLy8gY29tcHV0ZSBvdGhlciBwcm9ibGVtcyBpZiBuZWVkZWQKIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IG51bGw7CisJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IGNsb25lQ2FjaGluZ0NvbnRlbnRzKCk7CiAJdHJ5IHsKIAkJaWYgKGNvbXB1dGVQcm9ibGVtcykgewogCQkJaWYgKHByb2JsZW1zID09IG51bGwpIHsKIAkJCQkvLyByZXBvcnQgcHJvYmxlbXMgdG8gdGhlIHByb2JsZW0gcmVxdWVzdG9yCiAJCQkJcHJvYmxlbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5wcm9jZXNzKHVuaXQsIHRoaXMsIGNvbnRlbnRzLCBwYXJzZXIsIHRoaXMub3duZXIsIHByb2JsZW1zLCBjcmVhdGVBU1QsIHJlY29uY2lsZUZsYWdzLCBwbSk7CisJCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSBDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3Moc291cmNlLCBwYXJzZXIsIHRoaXMub3duZXIsIHByb2JsZW1zLCBjcmVhdGVBU1QsIHJlY29uY2lsZUZsYWdzLCBwbSk7CiAJCQkJdHJ5IHsKIAkJCQkJcGVyV29ya2luZ0NvcHlJbmZvLmJlZ2luUmVwb3J0aW5nKCk7CiAJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmFyb3IgPSBwcm9ibGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXJvci5oYXNOZXh0KCk7KSB7CkBAIC0xOTIsMTMgKzE5MiwxNSBAQAogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLy8gY29sbGVjdCBwcm9ibGVtcwotCQkJCWNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5wcm9jZXNzKHVuaXQsIHRoaXMsIGNvbnRlbnRzLCBwYXJzZXIsIHRoaXMub3duZXIsIHByb2JsZW1zLCBjcmVhdGVBU1QsIHJlY29uY2lsZUZsYWdzLCBwbSk7CisJCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSBDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3Moc291cmNlLCBwYXJzZXIsIHRoaXMub3duZXIsIHByb2JsZW1zLCBjcmVhdGVBU1QsIHJlY29uY2lsZUZsYWdzLCBwbSk7CiAJCQl9CisJCX0gZWxzZSB7CisJCQljb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IHBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdChzb3VyY2UsIHRydWUgLypmdWxsIHBhcnNlIHRvIGZpbmQgbG9jYWwgZWxlbWVudHMqLywgcG0pOwogCQl9Ci0JCQorCiAJCWlmIChjcmVhdGVBU1QpIHsKIAkJCWludCBhc3RMZXZlbCA9ICgoQVNUSG9sZGVyQ1VJbmZvKSBpbmZvKS5hc3RMZXZlbDsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQgY3UgPSBBU1QuY29udmVydENvbXBpbGF0aW9uVW5pdChhc3RMZXZlbCwgdW5pdCwgY29udGVudHMsIG9wdGlvbnMsIGNvbXB1dGVQcm9ibGVtcywgdGhpcywgcmVjb25jaWxlRmxhZ3MsIHBtKTsKKwkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQgY3UgPSBBU1QuY29udmVydENvbXBpbGF0aW9uVW5pdChhc3RMZXZlbCwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24sIG9wdGlvbnMsIGNvbXB1dGVQcm9ibGVtcywgc291cmNlLCByZWNvbmNpbGVGbGFncywgcG0pOwogCQkJKChBU1RIb2xkZXJDVUluZm8pIGluZm8pLmFzdCA9IGN1OwogCQl9CiAJfSBmaW5hbGx5IHsKQEAgLTIwNiwxMCArMjA4LDI3IEBACiAJICAgICAgICBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jbGVhblVwKCk7CiAJICAgIH0KIAl9Ci0JCisKIAlyZXR1cm4gdW5pdEluZm8uaXNTdHJ1Y3R1cmVLbm93bigpOwogfQogLyoKKyAqIENsb25lIHRoaXMgaGFuZGxlIHNvIHRoYXQgaXQgY2FjaGVzIGl0cyBjb250ZW50cyBpbiBtZW1vcnkuCisgKiBETyBOT1QgUEFTUyBUTyBDTElFTlRTCisgKi8KK3B1YmxpYyBDb21waWxhdGlvblVuaXQgY2xvbmVDYWNoaW5nQ29udGVudHMoKSB7CisJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQoKFBhY2thZ2VGcmFnbWVudCkgdGhpcy5wYXJlbnQsIHRoaXMubmFtZSwgdGhpcy5vd25lcikgeworCQlwcml2YXRlIGNoYXJbXSBjYWNoZWRDb250ZW50czsKKwkJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkJCWlmICh0aGlzLmNhY2hlZENvbnRlbnRzID09IG51bGwpCisJCQkJdGhpcy5jYWNoZWRDb250ZW50cyA9IENvbXBpbGF0aW9uVW5pdC50aGlzLmdldENvbnRlbnRzKCk7CisJCQlyZXR1cm4gdGhpcy5jYWNoZWRDb250ZW50czsKKwkJfQorCQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsRnJvbUNsb25lKCkgeworCQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdC50aGlzOworCQl9CisJfTsKK30KKy8qCiAgKiBAc2VlIE9wZW5hYmxlI2NhbkJlUmVtb3ZlZEZyb21DYWNoZQogICovCiBwdWJsaWMgYm9vbGVhbiBjYW5CZVJlbW92ZWRGcm9tQ2FjaGUoKSB7CkBAIC0yNTksNyArMjc4LDcgQEAKICAqIEBkZXByZWNhdGVkIC0gdXNlIGNvZGVDb21wbGV0ZShpbnQsIElDb21wbGV0aW9uUmVxdWVzdG9yKQogICovCiBwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgZmluYWwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCisKIAlpZiAocmVxdWVzdG9yID09IG51bGwpewogCQljb2RlQ29tcGxldGUob2Zmc2V0LCAoSUNvbXBsZXRpb25SZXF1ZXN0b3IpbnVsbCk7CiAJCXJldHVybjsKQEAgLTMxOSwxMiArMzM4LDMwIEBACiBwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWNvZGVDb21wbGV0ZShvZmZzZXQsIHJlcXVlc3RvciwgRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSk7CiB9Ci0KKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUob2Zmc2V0LCByZXF1ZXN0b3IsIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlksIG1vbml0b3IpOworfQogLyogKG5vbi1KYXZhZG9jKQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyKQogICovCiBwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JY29kZUNvbXBsZXRlKHRoaXMsIGlzV29ya2luZ0NvcHkoKSA/IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQpIGdldE9yaWdpbmFsRWxlbWVudCgpIDogdGhpcywgb2Zmc2V0LCByZXF1ZXN0b3IsIHdvcmtpbmdDb3B5T3duZXIpOworCWNvZGVDb21wbGV0ZShvZmZzZXQsIHJlcXVlc3Rvciwgd29ya2luZ0NvcHlPd25lciwgbnVsbCk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25SZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXIsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUoCisJCQl0aGlzLAorCQkJaXNXb3JraW5nQ29weSgpID8gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCkgZ2V0T3JpZ2luYWxFbGVtZW50KCkgOiB0aGlzLAorCQkJb2Zmc2V0LAorCQkJcmVxdWVzdG9yLAorCQkJd29ya2luZ0NvcHlPd25lciwKKwkJCXRoaXMsCisJCQltb25pdG9yKTsKIH0KIAogLyoqCkBAIC0zNTgsNyArMzk1LDcgQEAKICAqLwogcHVibGljIHZvaWQgY29weShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5vcGVyYXRpb25fbnVsbENvbnRhaW5lcik7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsQ29udGFpbmVyKTsKIAl9CiAJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OwogCUlKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMgPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07CkBAIC0zOTgsNyArNDM1LDcgQEAKICAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKQogICovCiBwdWJsaWMgSVBhY2thZ2VEZWNsYXJhdGlvbiBjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nIHBrZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkKKwogCUNyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbihwa2csIHRoaXMpOwogCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKIAlyZXR1cm4gZ2V0UGFja2FnZURlY2xhcmF0aW9uKHBrZyk7CkBAIC00NjQsMTMgKzUwMSw2IEBACiAJQ29tcGlsYXRpb25Vbml0IG90aGVyID0gKENvbXBpbGF0aW9uVW5pdClvYmo7CiAJcmV0dXJuIHRoaXMub3duZXIuZXF1YWxzKG90aGVyLm93bmVyKSAmJiBzdXBlci5lcXVhbHMob2JqKTsKIH0KLXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkvLyB3b3JraW5nIGNvcHkgYWx3YXlzIGV4aXN0cyBpbiB0aGUgbW9kZWwgdW50aWwgaXQgaXMgZ290dGVuIHJpZCBvZiAoZXZlbiBpZiBub3Qgb24gY2xhc3NwYXRoKQotCWlmIChnZXRQZXJXb3JraW5nQ29weUluZm8oKSAhPSBudWxsKSByZXR1cm4gdHJ1ZTsJCi0JCi0JLy8gaWYgbm90IGEgd29ya2luZyBjb3B5LCBpdCBleGlzdHMgb25seSBpZiBpdCBpcyBhIHByaW1hcnkgY29tcGlsYXRpb24gdW5pdAotCXJldHVybiBpc1ByaW1hcnkoKSAmJiB2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdChnZXRSZXNvdXJjZSgpKS5pc09LKCk7Ci19CiAvKioKICAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNmaW5kRWxlbWVudHMoSUphdmFFbGVtZW50KQogICovCkBAIC01MTksNyArNTQ5LDcgQEAKIAkJCQljdXJyZW50RWxlbWVudCA9ICgoSVR5cGUpY3VycmVudEVsZW1lbnQpLmdldE1ldGhvZChjaGlsZC5nZXRFbGVtZW50TmFtZSgpLCAoKElNZXRob2QpY2hpbGQpLmdldFBhcmFtZXRlclR5cGVzKCkpOwogCQkJCWJyZWFrOwogCQl9Ci0JCQorCiAJfQogCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsICYmIGN1cnJlbnRFbGVtZW50LmV4aXN0cygpKSB7CiAJCXJldHVybiBuZXcgSUphdmFFbGVtZW50W10ge2N1cnJlbnRFbGVtZW50fTsKQEAgLTU0Niw4ICs1NzYsOCBAQAogcHVibGljIElKYXZhRWxlbWVudCBmaW5kU2hhcmVkV29ya2luZ0NvcHkoSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSkgewogCiAJLy8gaWYgZmFjdG9yeSBpcyBudWxsLCBkZWZhdWx0IGZhY3RvcnkgbXVzdCBiZSB1c2VkCi0JaWYgKGZhY3RvcnkgPT0gbnVsbCkgZmFjdG9yeSA9IHRoaXMuZ2V0QnVmZmVyTWFuYWdlcigpLmdldERlZmF1bHRCdWZmZXJGYWN0b3J5KCk7Ci0JCisJaWYgKGZhY3RvcnkgPT0gbnVsbCkgZmFjdG9yeSA9IGdldEJ1ZmZlck1hbmFnZXIoKS5nZXREZWZhdWx0QnVmZmVyRmFjdG9yeSgpOworCiAJcmV0dXJuIGZpbmRXb3JraW5nQ29weShCdWZmZXJGYWN0b3J5V3JhcHBlci5jcmVhdGUoZmFjdG9yeSkpOwogfQogCkBAIC01ODcsNyArNjE3LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAJCQl0eXBlc1RvVHJhdmVyc2UuYWRkKHR5cGVzW2ldKTsKIAkJfQotCX0gCisJfQogCUlUeXBlW10gYXJyYXlPZkFsbFR5cGVzID0gbmV3IElUeXBlW2FsbFR5cGVzLnNpemUoKV07CiAJYWxsVHlwZXMudG9BcnJheShhcnJheU9mQWxsVHlwZXMpOwogCXJldHVybiBhcnJheU9mQWxsVHlwZXM7CkBAIC02MDYsMTUgKzYzNiw0NyBAQAogCWlmIChidWZmZXIgPT0gbnVsbCkgewogCQkvLyBubyBuZWVkIHRvIGZvcmNlIG9wZW5pbmcgb2YgQ1UgdG8gZ2V0IHRoZSBjb250ZW50CiAJCS8vIGFsc28gdGhpcyBjYW5ub3QgYmUgYSB3b3JraW5nIGNvcHksIGFzIGl0cyBidWZmZXIgaXMgbmV2ZXIgY2xvc2VkIHdoaWxlIHRoZSB3b3JraW5nIGNvcHkgaXMgYWxpdmUKKwkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZ2V0UmVzb3VyY2UoKTsKKwkJLy8gR2V0IGVuY29kaW5nIGZyb20gZmlsZQorCQlTdHJpbmcgZW5jb2Rpbmc7CiAJCXRyeSB7Ci0JCQlyZXR1cm4gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoKElGaWxlKSBnZXRSZXNvdXJjZSgpKTsKKwkJCWVuY29kaW5nID0gZmlsZS5nZXRDaGFyc2V0KCk7CisJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJLy8gZG8gbm90IHVzZSBhbnkgZW5jb2RpbmcKKwkJCWVuY29kaW5nID0gbnVsbDsKKwkJfQorCQl0cnkgeworCQkJcmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KGZpbGUsIGVuY29kaW5nKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5hYm9ydE9uTWlzc2luZ1NvdXJjZS5nZXQoKSA9PSBCb29sZWFuLlRSVUUpIHsKKwkJCQlJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbiA9CisJCQkJCWUuZ2V0SmF2YU1vZGVsU3RhdHVzKCkuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OID8KKwkJCQkJCShJT0V4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpIDoKKwkJCQkJCW5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb25Vbml0KG51bGwsIGlvRXhjZXB0aW9uLCBlbmNvZGluZyk7CisJCQl9IGVsc2UgeworCQkJCVV0aWwubG9nKGUsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZmlsZV9ub3RGb3VuZCwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKKwkJCX0KIAkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCX0KIAl9CiAJY2hhcltdIGNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQlpZiAoY29udGVudHMgPT0gbnVsbCkgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk4MTQKKwlpZiAoY29udGVudHMgPT0gbnVsbCkgeyAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTgxNAorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuYWJvcnRPbk1pc3NpbmdTb3VyY2UuZ2V0KCkgPT0gQm9vbGVhbi5UUlVFKSB7CisJCQlJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbiA9IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5idWZmZXJfY2xvc2VkKTsKKwkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGdldFJlc291cmNlKCk7CisJCQkvLyBHZXQgZW5jb2RpbmcgZnJvbSBmaWxlCisJCQlTdHJpbmcgZW5jb2Rpbmc7CisJCQl0cnkgeworCQkJCWVuY29kaW5nID0gZmlsZS5nZXRDaGFyc2V0KCk7CisJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkvLyBkbyBub3QgdXNlIGFueSBlbmNvZGluZworCQkJCWVuY29kaW5nID0gbnVsbDsKKwkJCX0KKwkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uVW5pdChudWxsLCBpb0V4Y2VwdGlvbiwgZW5jb2RpbmcpOworCQl9CiAJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJfQogCXJldHVybiBjb250ZW50czsKIH0KIC8qKgpAQCAtNzE1LDEyICs3NzcsMTIgQEAKIAkJZWxzZSB7CiAJCQlvcGVuKG51bGwpOyAvLyBmb3JjZSBvcGVuaW5nIG9mIENVCiAJCQlpbmZvID0gbWFuYWdlci5nZXRJbmZvKGNvbnRhaW5lcik7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSAKKwkJCWlmIChpbmZvID09IG51bGwpCiAJCQkJLy8gYWZ0ZXIgb3BlbmluZywgaWYgbm8gaW1wb3J0IGNvbnRhaW5lciwgdGhlbiBubyBpbXBvcnRzCiAJCQkJcmV0dXJuIE5PX0lNUE9SVFM7Ci0JCX0JCisJCX0KIAl9Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoKEphdmFFbGVtZW50SW5mbykgaW5mbykuY2hpbGRyZW47CisJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoKEltcG9ydENvbnRhaW5lckluZm8pIGluZm8pLmNoaWxkcmVuOwogCWludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CiAJSUltcG9ydERlY2xhcmF0aW9uW10gaW1wb3J0cyA9IG5ldyBJSW1wb3J0RGVjbGFyYXRpb25bbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCBpbXBvcnRzLCAwLCBsZW5ndGgpOwpAQCAtNzQ5LDcgKzgxMSw3IEBACiAJaWYgKGN1ID09IG51bGwgfHwgIXRoaXMub3duZXIuZXF1YWxzKGN1Lm93bmVyKSkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlyZXR1cm4gd29ya2luZ0NvcHlFbGVtZW50LmdldFByaW1hcnlFbGVtZW50KCk7CiB9CiAvKioKQEAgLTc1OSw3ICs4MjEsNyBAQAogcHVibGljIElKYXZhRWxlbWVudCBnZXRPcmlnaW5hbEVsZW1lbnQoKSB7CiAJLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eQogCWlmICghaXNXb3JraW5nQ29weSgpKSByZXR1cm4gbnVsbDsKLQkKKwogCXJldHVybiBnZXRQcmltYXJ5RWxlbWVudCgpOwogfQogLyoKQEAgLTgyNCwxNyArODg2LDEyIEBACiAJaWYgKGNoZWNrT3duZXIgJiYgaXNQcmltYXJ5KCkpIHJldHVybiB0aGlzOwogCXJldHVybiBuZXcgQ29tcGlsYXRpb25Vbml0KChQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50KCksIGdldEVsZW1lbnROYW1lKCksIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkpOwogfQotLyoqCi0gKiBAc2VlIElKYXZhRWxlbWVudCNnZXRSZXNvdXJjZSgpCisvKgorICogQHNlZSBPcGVuYWJsZSNyZXNvdXJjZShQYWNrYWdlRnJhZ21lbnRSb290KQogICovCi1wdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKK3B1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CiAJaWYgKHJvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIHdvcmtpbmcgY29weSBub3QgaW4gd29ya3NwYWNlCi0JaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKLQkJcmV0dXJuIHJvb3QuZ2V0UmVzb3VyY2UoKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKChJQ29udGFpbmVyKSBnZXRQYXJlbnQoKS5nZXRSZXNvdXJjZSgpKS5nZXRGaWxlKG5ldyBQYXRoKGdldEVsZW1lbnROYW1lKCkpKTsKLQl9CisJcmV0dXJuICgoSUNvbnRhaW5lcikgKChPcGVuYWJsZSkgdGhpcy5wYXJlbnQpLnJlc291cmNlKHJvb3QpKS5nZXRGaWxlKG5ldyBQYXRoKGdldEVsZW1lbnROYW1lKCkpKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlUmVmZXJlbmNlI2dldFNvdXJjZSgpCkBAIC04NzcsMTAgKzkzNCwxMCBAQAogICogQGRlcHJlY2F0ZWQKICAqLwogcHVibGljIElKYXZhRWxlbWVudCBnZXRTaGFyZWRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkKKwogCS8vIGlmIGZhY3RvcnkgaXMgbnVsbCwgZGVmYXVsdCBmYWN0b3J5IG11c3QgYmUgdXNlZAotCWlmIChmYWN0b3J5ID09IG51bGwpIGZhY3RvcnkgPSB0aGlzLmdldEJ1ZmZlck1hbmFnZXIoKS5nZXREZWZhdWx0QnVmZmVyRmFjdG9yeSgpOwotCQorCWlmIChmYWN0b3J5ID09IG51bGwpIGZhY3RvcnkgPSBnZXRCdWZmZXJNYW5hZ2VyKCkuZ2V0RGVmYXVsdEJ1ZmZlckZhY3RvcnkoKTsKKwogCXJldHVybiBnZXRXb3JraW5nQ29weShCdWZmZXJGYWN0b3J5V3JhcHBlci5jcmVhdGUoZmFjdG9yeSksIHByb2JsZW1SZXF1ZXN0b3IsIHBtKTsKIH0KIC8qKgpAQCAtOTE1LDExICs5NzIsMTEgQEAKICAqLwogcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyLCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmICghaXNQcmltYXJ5KCkpIHJldHVybiB0aGlzOwotCQorCiAJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7Ci0JCisKIAlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBuZXcgQ29tcGlsYXRpb25Vbml0KChQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50KCksIGdldEVsZW1lbnROYW1lKCksIHdvcmtpbmdDb3B5T3duZXIpOwotCUphdmFNb2RlbE1hbmFnZXIuUGVyV29ya2luZ0NvcHlJbmZvIHBlcldvcmtpbmdDb3B5SW5mbyA9IAorCUphdmFNb2RlbE1hbmFnZXIuUGVyV29ya2luZ0NvcHlJbmZvIHBlcldvcmtpbmdDb3B5SW5mbyA9CiAJCW1hbmFnZXIuZ2V0UGVyV29ya2luZ0NvcHlJbmZvKHdvcmtpbmdDb3B5LCBmYWxzZS8qZG9uJ3QgY3JlYXRlKi8sIHRydWUvKnJlY29yZCB1c2FnZSovLCBudWxsLypub3QgdXNlZCBzaW5jZSBkb24ndCBjcmVhdGUqLyk7CiAJaWYgKHBlcldvcmtpbmdDb3B5SW5mbyAhPSBudWxsKSB7CiAJCXJldHVybiBwZXJXb3JraW5nQ29weUluZm8uZ2V0V29ya2luZ0NvcHkoKTsgLy8gcmV0dXJuIGV4aXN0aW5nIGhhbmRsZSBpbnN0ZWFkIG9mIHRoZSBvbmUgY3JlYXRlZCBhYm92ZQpAQCAtOTM5LDcgKzk5Niw3IEBACiAgKi8KIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlQ2hhbmdlZCgpIHsKIAlpZiAoIWlzV29ya2luZ0NvcHkoKSkgcmV0dXJuIGZhbHNlOwotCQorCiAJLy8gaWYgcmVzb3VyY2UgZ290IGRlbGV0ZWQsIHRoZW4gI2dldE1vZGlmaWNhdGlvblN0YW1wKCkgd2lsbCBhbnN3ZXIgSVJlc291cmNlLk5VTExfU1RBTVAsIHdoaWNoIGlzIGFsd2F5cyBkaWZmZXJlbnQgZnJvbSB0aGUgY2FjaGVkCiAJLy8gdGltZXN0YW1wCiAJT2JqZWN0IGluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKHRoaXMpOwpAQCAtOTc2LDcgKzEwMzMsNyBAQAogCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAJLy8gcm9vdCBuZXZlciBudWxsIGFzIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIHdvcmtpbmcgY29waWVzCiAJdHJ5IHsKLQkJaWYgKHJvb3QuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSAKKwkJaWYgKHJvb3QuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQogCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIHJvb3QpOwogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOwpAQCAtOTg0LDcgKzEwNDEsNyBAQAogCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CiAJCWNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zID0gKChQYWNrYWdlRnJhZ21lbnRSb290KXJvb3QpLmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKIAkJY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSAoKFBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdCkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOwotCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHJlc291cmNlLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMpKSAKKwkJaWYgKFV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSkKIAkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9OT1RfT05fQ0xBU1NQQVRILCB0aGlzKTsKIAkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKIAkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcyk7CkBAIC0xMDA4LDIyICsxMDY1LDI3IEBACiB9CiBwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCBtYWtlQ29uc2lzdGVudChpbnQgYXN0TGV2ZWwsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzLCBpbnQgcmVjb25jaWxlRmxhZ3MsIEhhc2hNYXAgcHJvYmxlbXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKGlzQ29uc2lzdGVudCgpKSByZXR1cm4gbnVsbDsKLQkJCi0JLy8gY3JlYXRlIGEgbmV3IGluZm8gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgaW5mbwotCS8vICh0aGlzIHdpbGwgcmVtb3ZlIHRoZSBpbmZvIGFuZCBpdHMgY2hpbGRyZW4ganVzdCBiZWZvcmUgc3RvcmluZyB0aGUgbmV3IGluZm9zKQotCWlmIChhc3RMZXZlbCAhPSBOT19BU1QgfHwgcHJvYmxlbXMgIT0gbnVsbCkgewotCQlBU1RIb2xkZXJDVUluZm8gaW5mbyA9IG5ldyBBU1RIb2xkZXJDVUluZm8oKTsKLQkJaW5mby5hc3RMZXZlbCA9IGFzdExldmVsOwotCQlpbmZvLnJlc29sdmVCaW5kaW5ncyA9IHJlc29sdmVCaW5kaW5nczsKLQkJaW5mby5yZWNvbmNpbGVGbGFncyA9IHJlY29uY2lsZUZsYWdzOwotCQlpbmZvLnByb2JsZW1zID0gcHJvYmxlbXM7Ci0JCW9wZW5XaGVuQ2xvc2VkKGluZm8sIG1vbml0b3IpOwotCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0IHJlc3VsdCA9IGluZm8uYXN0OwotCQlpbmZvLmFzdCA9IG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfSBlbHNlIHsKLQkJb3BlbldoZW5DbG9zZWQoY3JlYXRlRWxlbWVudEluZm8oKSwgbW9uaXRvcik7Ci0JCXJldHVybiBudWxsOworCisJdHJ5IHsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuYWJvcnRPbk1pc3NpbmdTb3VyY2Uuc2V0KEJvb2xlYW4uVFJVRSk7CisJCS8vIGNyZWF0ZSBhIG5ldyBpbmZvIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IGluZm8KKwkJLy8gKHRoaXMgd2lsbCByZW1vdmUgdGhlIGluZm8gYW5kIGl0cyBjaGlsZHJlbiBqdXN0IGJlZm9yZSBzdG9yaW5nIHRoZSBuZXcgaW5mb3MpCisJCWlmIChhc3RMZXZlbCAhPSBOT19BU1QgfHwgcHJvYmxlbXMgIT0gbnVsbCkgeworCQkJQVNUSG9sZGVyQ1VJbmZvIGluZm8gPSBuZXcgQVNUSG9sZGVyQ1VJbmZvKCk7CisJCQlpbmZvLmFzdExldmVsID0gYXN0TGV2ZWw7CisJCQlpbmZvLnJlc29sdmVCaW5kaW5ncyA9IHJlc29sdmVCaW5kaW5nczsKKwkJCWluZm8ucmVjb25jaWxlRmxhZ3MgPSByZWNvbmNpbGVGbGFnczsKKwkJCWluZm8ucHJvYmxlbXMgPSBwcm9ibGVtczsKKwkJCW9wZW5XaGVuQ2xvc2VkKGluZm8sIG1vbml0b3IpOworCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCByZXN1bHQgPSBpbmZvLmFzdDsKKwkJCWluZm8uYXN0ID0gbnVsbDsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlvcGVuV2hlbkNsb3NlZChjcmVhdGVFbGVtZW50SW5mbygpLCBtb25pdG9yKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfSBmaW5hbGx5IHsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuYWJvcnRPbk1pc3NpbmdTb3VyY2Uuc2V0KG51bGwpOwogCX0KIH0KIC8qKgpAQCAtMTAzMSwxMSArMTA5MywxMSBAQAogICovCiBwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsQ29udGFpbmVyKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMub3BlcmF0aW9uX251bGxDb250YWluZXIpOwogCX0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsKIAlJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07Ci0JCisKIAlTdHJpbmdbXSByZW5hbWluZ3M9IG51bGw7CiAJaWYgKHJlbmFtZSAhPSBudWxsKSB7CiAJCXJlbmFtaW5ncz0gbmV3IFN0cmluZ1tdIHtyZW5hbWV9OwpAQCAtMTA1MSwyNSArMTExMywzMSBAQAogCS8vIGNyZWF0ZSBidWZmZXIKIAlCdWZmZXJNYW5hZ2VyIGJ1Zk1hbmFnZXIgPSBnZXRCdWZmZXJNYW5hZ2VyKCk7CiAJYm9vbGVhbiBpc1dvcmtpbmdDb3B5ID0gaXNXb3JraW5nQ29weSgpOwotCUlCdWZmZXIgYnVmZmVyID0gCi0JCWlzV29ya2luZ0NvcHkgCi0JCQk/IHRoaXMub3duZXIuY3JlYXRlQnVmZmVyKHRoaXMpIAorCUlCdWZmZXIgYnVmZmVyID0KKwkJaXNXb3JraW5nQ29weQorCQkJPyB0aGlzLm93bmVyLmNyZWF0ZUJ1ZmZlcih0aGlzKQogCQkJOiBCdWZmZXJNYW5hZ2VyLmNyZWF0ZUJ1ZmZlcih0aGlzKTsKIAlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwogCQorCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSBudWxsOworCWJvb2xlYW4gbXVzdFNldFRvT3JpZ2luYWxDb250ZW50ID0gZmFsc2U7CisJaWYgKGlzV29ya2luZ0NvcHkpIHsKKwkJLy8gZW5zdXJlIHRoYXQgaXNPcGVuKCkgaXMgY2FsbGVkIG91dHNpZGUgdGhlIGJ1Zk1hbmFnZXIgc3luY2hyb25pemVkIGJsb2NrCisJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3NzcyCisJCW11c3RTZXRUb09yaWdpbmFsQ29udGVudCA9ICFpc1ByaW1hcnkoKSAmJiAob3JpZ2luYWwgPSBuZXcgQ29tcGlsYXRpb25Vbml0KChQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50KCksIGdldEVsZW1lbnROYW1lKCksIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkpKS5pc09wZW4oKSA7CisJfQorCiAJLy8gc3luY2hyb25pemUgdG8gZW5zdXJlIHRoYXQgMiB0aHJlYWRzIGFyZSBub3QgcHV0dGluZyAyIGRpZmZlcmVudCBidWZmZXJzIGF0IHRoZSBzYW1lIHRpbWUKIAkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjMzMQogCXN5bmNocm9uaXplZChidWZNYW5hZ2VyKSB7CiAJCUlCdWZmZXIgZXhpc3RpbmdCdWZmZXIgPSBidWZNYW5hZ2VyLmdldEJ1ZmZlcih0aGlzKTsKIAkJaWYgKGV4aXN0aW5nQnVmZmVyICE9IG51bGwpCiAJCQlyZXR1cm4gZXhpc3RpbmdCdWZmZXI7Ci0JCQorCiAJCS8vIHNldCB0aGUgYnVmZmVyIHNvdXJjZQogCQlpZiAoYnVmZmVyLmdldENoYXJhY3RlcnMoKSA9PSBudWxsKSB7CiAJCQlpZiAoaXNXb3JraW5nQ29weSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw7Ci0JCQkJaWYgKCFpc1ByaW1hcnkoKSAKLQkJCQkJCSYmIChvcmlnaW5hbCA9IG5ldyBDb21waWxhdGlvblVuaXQoKFBhY2thZ2VGcmFnbWVudClnZXRQYXJlbnQoKSwgZ2V0RWxlbWVudE5hbWUoKSwgRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSkpLmlzT3BlbigpKSB7CisJCQkJaWYgKG11c3RTZXRUb09yaWdpbmFsQ29udGVudCkgewogCQkJCQlidWZmZXIuc2V0Q29udGVudHMob3JpZ2luYWwuZ2V0U291cmNlKCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpZ2V0UmVzb3VyY2UoKTsKQEAgLTEwODEsMjggKzExNDksMzUgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSl0aGlzLmdldFJlc291cmNlKCk7CisJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlnZXRSZXNvdXJjZSgpOwogCQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKIAkJCQlidWZmZXIuc2V0Q29udGVudHMoVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoZmlsZSkpOwogCQkJfQogCQl9Ci0JCisKIAkJLy8gYWRkIGJ1ZmZlciB0byBidWZmZXIgY2FjaGUKIAkJLy8gbm90ZSB0aGlzIG1heSBjYXVzZSBleGlzdGluZyBidWZmZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGNhY2hlLCBidXQgb25seSBwcmltYXJ5IGNvbXBpbGF0aW9uIHVuaXQncyBidWZmZXIKIAkJLy8gY2FuIGJlIGNsb3NlZCwgdGh1cyBubyBjYWxsIHRvIGEgY2xpZW50J3MgSUJ1ZmZlciNjbG9zZSgpIGNhbiBiZSBkb25lIGluIHRoaXMgc3luY2hyb25pemVkIGJsb2NrLgogCQlidWZNYW5hZ2VyLmFkZEJ1ZmZlcihidWZmZXIpOwotCQkJCQorCiAJCS8vIGxpc3RlbiB0byBidWZmZXIgY2hhbmdlcwogCQlidWZmZXIuYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0JCisJfQogCXJldHVybiBidWZmZXI7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBvcGVuUGFyZW50KE9iamVjdCBjaGlsZEluZm8sIEhhc2hNYXAgbmV3RWxlbWVudHMsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmICghaXNXb3JraW5nQ29weSgpKQotCQlzdXBlci5vcGVuUGFyZW50KGNoaWxkSW5mbywgbmV3RWxlbWVudHMsIHBtKTsKLQkvLyBkb24ndCBvcGVuIHBhcmVudCBmb3IgYSB3b3JraW5nIGNvcHkgdG8gc3BlZWQgdXAgdGhlIGZpcnN0IGJlY29tZVdvcmtpbmdDb3B5Citwcm90ZWN0ZWQgdm9pZCBvcGVuQW5jZXN0b3JzKEhhc2hNYXAgbmV3RWxlbWVudHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFpc1dvcmtpbmdDb3B5KCkpIHsKKwkJc3VwZXIub3BlbkFuY2VzdG9ycyhuZXdFbGVtZW50cywgbW9uaXRvcik7CisJfQorCS8vIGVsc2UgZG9uJ3Qgb3BlbiBhbmNlc3RvcnMgZm9yIGEgd29ya2luZyBjb3B5IHRvIHNwZWVkIHVwIHRoZSBmaXJzdCBiZWNvbWVXb3JraW5nQ29weQogCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5NDExKQogfQorLyoKKyAqIEBzZWUgI2Nsb25lQ2FjaGluZ0NvbnRlbnRzKCkKKyAqLworcHVibGljIENvbXBpbGF0aW9uVW5pdCBvcmlnaW5hbEZyb21DbG9uZSgpIHsKKwlyZXR1cm4gdGhpczsKK30KIC8qKgogICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I3JlY29uY2lsZSgpCiAgKiBAZGVwcmVjYXRlZApAQCAtMTE1MiwyMyArMTIyNywyMyBAQAogCQlXb3JraW5nQ29weU93bmVyIHdvcmtpbmdDb3B5T3duZXIsCiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCisKIAlpZiAoIWlzV29ya2luZ0NvcHkoKSkgcmV0dXJuIG51bGw7IC8vIFJlY29uY2lsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gbm9uIHdvcmtpbmcgY29waWVzCiAJaWYgKHdvcmtpbmdDb3B5T3duZXIgPT0gbnVsbCkgd29ya2luZ0NvcHlPd25lciA9IERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlk7Ci0JCi0JCisKKwogCVBlcmZvcm1hbmNlU3RhdHMgc3RhdHMgPSBudWxsOwogCWlmKFJlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uLlBFUkYpIHsKIAkJc3RhdHMgPSBQZXJmb3JtYW5jZVN0YXRzLmdldFN0YXRzKEphdmFNb2RlbE1hbmFnZXIuUkVDT05DSUxFX1BFUkYsIHRoaXMpOwotCQlzdGF0cy5zdGFydFJ1bihuZXcgU3RyaW5nKHRoaXMuZ2V0RmlsZU5hbWUoKSkpOworCQlzdGF0cy5zdGFydFJ1bihuZXcgU3RyaW5nKGdldEZpbGVOYW1lKCkpKTsKIAl9CiAJUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24gb3AgPSBuZXcgUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24odGhpcywgYXN0TGV2ZWwsIHJlY29uY2lsZUZsYWdzLCB3b3JraW5nQ29weU93bmVyKTsKIAlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAl0cnkgewotCQltYW5hZ2VyLmNhY2hlWmlwRmlsZXMoKTsgLy8gY2FjaGUgemlwIGZpbGVzIGZvciBwZXJmb3JtYW5jZSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQxNzIpCisJCW1hbmFnZXIuY2FjaGVaaXBGaWxlcyh0aGlzKTsgLy8gY2FjaGUgemlwIGZpbGVzIGZvciBwZXJmb3JtYW5jZSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQxNzIpCiAJCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKIAl9IGZpbmFsbHkgewotCQltYW5hZ2VyLmZsdXNoWmlwRmlsZXMoKTsKKwkJbWFuYWdlci5mbHVzaFppcEZpbGVzKHRoaXMpOwogCX0KIAlpZihSZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbi5QRVJGKSB7CiAJCXN0YXRzLmVuZFJ1bigpOwpAQCAtMTE4MSwxMCArMTI1NiwxMCBAQAogICovCiBwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKG5ld05hbWUgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsTmFtZSk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsTmFtZSk7CiAJfQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OwotCUlKYXZhRWxlbWVudFtdIGRlc3RzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXMuZ2V0UGFyZW50KCl9OworCUlKYXZhRWxlbWVudFtdIGRlc3RzPSBuZXcgSUphdmFFbGVtZW50W10ge2dldFBhcmVudCgpfTsKIAlTdHJpbmdbXSByZW5hbWluZ3M9IG5ldyBTdHJpbmdbXSB7bmV3TmFtZX07CiAJZ2V0SmF2YU1vZGVsKCkucmVuYW1lKGVsZW1lbnRzLCBkZXN0cywgcmVuYW1pbmdzLCBmb3JjZSwgbW9uaXRvcik7CiB9CkBAIC0xMTk2LDcgKzEyNzEsNyBAQAogCWlmICghaXNXb3JraW5nQ29weSgpKSByZXR1cm47CiAKIAlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSAoQ29tcGlsYXRpb25Vbml0KSBnZXRPcmlnaW5hbEVsZW1lbnQoKTsKLQlJQnVmZmVyIGJ1ZmZlciA9IHRoaXMuZ2V0QnVmZmVyKCk7CisJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXIoKTsKIAlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybjsKIAlidWZmZXIuc2V0Q29udGVudHMob3JpZ2luYWwuZ2V0Q29udGVudHMoKSk7CiAJdXBkYXRlVGltZVN0YW1wKG9yaWdpbmFsKTsKQEAgLTEyMTEsNyArMTI4Niw3IEBACiAJCXJlY29uY2lsZSgpOyAgIC8vIG5vdCBzaW1wbHkgbWFrZUNvbnNpc3RlbnQsIGFsc28gY29tcHV0ZXMgZmluZS1ncmFpbiBkZWx0YXMKIAkJCQkJCQkJLy8gaW4gY2FzZSB0aGUgd29ya2luZyBjb3B5IGlzIGJlaW5nIHJlY29uY2lsZWQgYWxyZWFkeSAoaWYgbm90IGl0IHdvdWxkIG1pc3MKIAkJCQkJCQkJLy8gb25lIGl0ZXJhdGlvbiBvZiBkZWx0YXMpLgotCX0gZWxzZSB7CQkKKwl9IGVsc2UgewogCQlzdXBlci5zYXZlKHBtLCBmb3JjZSk7CiAJfQogfQpAQCAtMTIyMCwxMiArMTI5NSwxMiBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewogCWlmICghaXNQcmltYXJ5KCkpIHsKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwkJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJCWJ1ZmZlci5hcHBlbmQoIltXb3JraW5nIGNvcHldICIpOyAvLyROT04tTkxTLTEkCiAJCXRvU3RyaW5nTmFtZShidWZmZXIpOwogCX0gZWxzZSB7CiAJCWlmIChpc1dvcmtpbmdDb3B5KCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJCQlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKIAkJCWJ1ZmZlci5hcHBlbmQoIltXb3JraW5nIGNvcHldICIpOyAvLyROT04tTkxTLTEkCiAJCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAkJCWlmIChpbmZvID09IG51bGwpIHsKQEAgLTEyNDksNCArMTMyNCwyMyBAQAogCSgoQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLnRpbWVzdGFtcCA9IHRpbWVTdGFtcDsKIH0KIAorcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFeGlzdGVuY2UoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCS8vIGNoZWNrIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgb3BlbmVkCisJaWYgKCFpc1dvcmtpbmdDb3B5KCkpIHsgLy8gbm8gY2hlY2sgaXMgZG9uZSBvbiByb290IGtpbmQgb3IgZXhjbHVzaW9uIHBhdHRlcm4gZm9yIHdvcmtpbmcgY29waWVzCisJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVDb21waWxhdGlvblVuaXQodW5kZXJseWluZ1Jlc291cmNlKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvLyBwcmV2ZW50cyByZW9wZW5pbmcgb2Ygbm9uLXByaW1hcnkgd29ya2luZyBjb3BpZXMgKHRoZXkgYXJlIGNsb3NlZCB3aGVuIHRoZXkgYXJlIGRpc2NhcmRlZCBhbmQgc2hvdWxkIG5vdCBiZSByZW9wZW5lZCkKKwlpZiAoIWlzUHJpbWFyeSgpICYmIGdldFBlcldvcmtpbmdDb3B5SW5mbygpID09IG51bGwpIHsKKwkJcmV0dXJuIG5ld0RvZXNOb3RFeGlzdFN0YXR1cygpOworCX0KKworCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7Cit9CisKK3B1YmxpYyBJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgeworCXJldHVybiBudWxsOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvLmphdmEKaW5kZXggODAyMTE4YS4uNjIyOWQzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRFbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDEwICsxMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU291cmNlUmFuZ2U7CiAKIHB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8gewogCkBAIC0yMiwyNCArMjAsMTcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHNvdXJjZUxlbmd0aDsKIAotCS8qKiAKKwkvKioKIAkgKiBUaW1lc3RhbXAgb2Ygb3JpZ2luYWwgcmVzb3VyY2UgYXQgdGhlIHRpbWUgdGhpcyBlbGVtZW50CiAJICogd2FzIG9wZW5lZCBvciBsYXN0IHVwZGF0ZWQuCiAJICovCiAJcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wOwotCQorCiAJLyoKLQkgKiBUaGUgcG9zaXRpb25zIG9mIGFubm90YXRpb25zIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgotCSAqIEEgbWFwIGZyb20gSUphdmFFbGVtZW50IHRvIGxvbmdbXQorCSAqIE51bWJlciBvZiBhbm5vdGF0aW9ucyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKIAkgKi8KLQlwdWJsaWMgSGFzaE1hcCBhbm5vdGF0aW9uUG9zaXRpb25zOwotCQotcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblBvc2l0aW9ucyhJSmF2YUVsZW1lbnQgaGFuZGxlLCBsb25nW10gcG9zaXRpb25zKSB7Ci0JaWYgKHBvc2l0aW9ucyA9PSBudWxsKSByZXR1cm47Ci0JaWYgKHRoaXMuYW5ub3RhdGlvblBvc2l0aW9ucyA9PSBudWxsKQotCQl0aGlzLmFubm90YXRpb25Qb3NpdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXRoaXMuYW5ub3RhdGlvblBvc2l0aW9ucy5wdXQoaGFuZGxlLCBwb3NpdGlvbnMpOwotfQorCXB1YmxpYyBpbnQgYW5ub3RhdGlvbk51bWJlciA9IDA7CisKIC8qKgogICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLgogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLmphdmEKaW5kZXggZTY0MGRlNy4uYTQ4OTFjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw4ICsyNSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNvdXJjZVR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNvbW1lbnRSZWNvcmRlclBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKQEAgLTU1LDEyICs1NSwxMiBAQAogCSAqICAgICAgdGhlbSBhbGwpIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHBlcmZvcm0gc29tZSBhY3Rpb25zIHN1Y2ggYXMgb3BlbmluZyBhIGRpYWxvZwogCSAqICAgICAgaW4gVUkgd2hlbiBjb21waWxpbmcgaW50ZXJhY3RpdmVseS4KIAkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMKLQkgKiAKKwkgKgogCSAqCUBwYXJhbSBjb21waWxlck9wdGlvbnMgVGhlIGNvbXBpbGVyIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgcmVzb2x1dGlvbi4KLQkgKiAgICAgIAorCSAqCiAJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5JQ29tcGlsZXJSZXF1ZXN0b3IKIAkgKiAgICAgIENvbXBvbmVudCB3aGljaCB3aWxsIHJlY2VpdmUgYW5kIHBlcnNpc3QgYWxsIGNvbXBpbGF0aW9uIHJlc3VsdHMgYW5kIGlzIGludGVuZGVkCi0JICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMgCisJICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMKIAkgKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCiAJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdAogCSAqCkBAIC05MSwyNSArOTEsMzkgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcsIEFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2Vzc1Jlc3RyaWN0aW9uKSB7CiAJCS8vIGVuc3VyZSB0byBqdW1wIGJhY2sgdG8gdG9wbGV2ZWwgdHlwZSBmb3IgZmlyc3Qgb25lIChjb3VsZCBiZSBhIG1lbWJlcikKLS8vCQl3aGlsZSAoc291cmNlVHlwZXNbMF0uZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpCi0vLwkJCXNvdXJjZVR5cGVzWzBdID0gc291cmNlVHlwZXNbMF0uZ2V0RW5jbG9zaW5nVHlwZSgpOworCQl3aGlsZSAoc291cmNlVHlwZXNbMF0uZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpIHsKKwkJCXNvdXJjZVR5cGVzWzBdID0gc291cmNlVHlwZXNbMF0uZ2V0RW5jbG9zaW5nVHlwZSgpOworCQl9CiAKIAkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0KIAkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlc1swXS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUyNTksIGJ1aWxkIHRoZSBjb21waWxhdGlvbiB1bml0IGluIGl0cyBvd24gc2FuZCBib3guCisJCWZpbmFsIGxvbmcgc2F2ZWRDb21wbGlhbmNlTGV2ZWwgPSB0aGlzLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsOworCQlmaW5hbCBsb25nIHNhdmVkU291cmNlTGV2ZWwgPSB0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWw7CisJCQorCQl0cnkgeworCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAoKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgc291cmNlVHlwZXNbMF0pLmdldEhhbmRsZSgpLmdldEphdmFQcm9qZWN0KCk7CisJCQl0aGlzLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID0gQ29tcGlsZXJPcHRpb25zLnZlcnNpb25Ub0pka0xldmVsKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpKTsKKwkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpKTsKIAotCQkvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzCi0JCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQotCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKLQkJCQlzb3VyY2VUeXBlcywvL3NvdXJjZVR5cGVzWzBdIGlzIGFsd2F5cyB0b3BsZXZlbCBoZXJlCi0JCQkJU291cmNlVHlwZUNvbnZlcnRlci5GSUVMRF9BTkRfTUVUSE9EIC8vIG5lZWQgZmllbGQgYW5kIG1ldGhvZHMKLQkJCQl8IFNvdXJjZVR5cGVDb252ZXJ0ZXIuTUVNQkVSX1RZUEUgLy8gbmVlZCBtZW1iZXIgdHlwZXMKLQkJCQl8IFNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfSU5JVElBTElaQVRJT04sIC8vIG5lZWQgZmllbGQgaW5pdGlhbGl6YXRpb24KLQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwKLQkJCQlyZXN1bHQpOworCQkJLy8gbmVlZCB0byBob2xkIG9udG8gdGhpcworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKKwkJCQkJCXNvdXJjZVR5cGVzLC8vc291cmNlVHlwZXNbMF0gaXMgYWx3YXlzIHRvcGxldmVsIGhlcmUKKwkJCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuRklFTERfQU5EX01FVEhPRCAvLyBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCQl8IFNvdXJjZVR5cGVDb252ZXJ0ZXIuTUVNQkVSX1RZUEUgLy8gbmVlZCBtZW1iZXIgdHlwZXMKKwkJCQkJCXwgU291cmNlVHlwZUNvbnZlcnRlci5GSUVMRF9JTklUSUFMSVpBVElPTiwgLy8gbmVlZCBmaWVsZCBpbml0aWFsaXphdGlvbgorCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCisJCQkJCQlyZXN1bHQpOwogCi0JCWlmICh1bml0ICE9IG51bGwpIHsKLQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCwgYWNjZXNzUmVzdHJpY3Rpb24pOwotCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0KTsKKwkJCWlmICh1bml0ICE9IG51bGwpIHsKKwkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKKwkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJdGhpcy5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA9IHNhdmVkQ29tcGxpYW5jZUxldmVsOworCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID0gc2F2ZWRTb3VyY2VMZXZlbDsKIAkJfQogCX0KIApAQCAtMTIxLDcgKzEzNSw3IEBACiAJCWNvbXBpbGVyT3B0aW9ucy5zdG9yZUFubm90YXRpb25zID0gY3JlYXRpbmdBU1Q7IC8qc3RvcmUgYW5ub3RhdGlvbnMgaW4gdGhlIGJpbmRpbmdzIGlmIGNyZWF0aW5nIGEgRE9NIEFTVCovCiAJCXJldHVybiBjb21waWxlck9wdGlvbnM7CiAJfQotCQorCiAJLyoKIAkgKiAgTG93LWxldmVsIEFQSSBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgY29tcGlsYXRpb24KIAkgKi8KQEAgLTE0MCwxMTMgKzE1NCwxMTkgQEAKIAkJfTsKIAl9CiAKKwkvKgorCSAqIENhbiByZXR1cm4gbnVsbCBpZiB0aGUgcHJvY2VzcyB3YXMgYWJvcnRlZCBvciBjYW5jZWxlZCAKKwkgKi8KIAlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHByb2Nlc3MoCi0JCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQsCi0JCUlDb21waWxhdGlvblVuaXQgdW5pdEVsZW1lbnQsIAotCQljaGFyW10gY29udGVudHMsCi0JCVBhcnNlciBwYXJzZXIsCi0JCVdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwKLQkJSGFzaE1hcCBwcm9ibGVtcywKLQkJYm9vbGVhbiBjcmVhdGluZ0FTVCwKLQkJaW50IHJlY29uY2lsZUZsYWdzLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCQlDb21waWxhdGlvblVuaXQgdW5pdEVsZW1lbnQsCisJCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciwKKwkJCVdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwKKwkJCUhhc2hNYXAgcHJvYmxlbXMsCisJCQlib29sZWFuIGNyZWF0aW5nQVNULAorCQkJaW50IHJlY29uY2lsZUZsYWdzLAorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSB1bml0RWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwogCQlDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gbnVsbDsKIAkJQ2FuY2VsYWJsZVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gbnVsbDsKIAkJQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlciBwcm9ibGVtRmluZGVyID0gbnVsbDsKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7CiAJCXRyeSB7CiAJCQllbnZpcm9ubWVudCA9IG5ldyBDYW5jZWxhYmxlTmFtZUVudmlyb25tZW50KHByb2plY3QsIHdvcmtpbmdDb3B5T3duZXIsIG1vbml0b3IpOwogCQkJcHJvYmxlbUZhY3RvcnkgPSBuZXcgQ2FuY2VsYWJsZVByb2JsZW1GYWN0b3J5KG1vbml0b3IpOworCQkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucyhwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksIGNyZWF0aW5nQVNULCAoKHJlY29uY2lsZUZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWSkgIT0gMCkpOworCQkJYm9vbGVhbiBpZ25vcmVNZXRob2RCb2RpZXMgPSAocmVjb25jaWxlRmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LklHTk9SRV9NRVRIT0RfQk9ESUVTKSAhPSAwOworCQkJY29tcGlsZXJPcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcyA9IGlnbm9yZU1ldGhvZEJvZGllczsKIAkJCXByb2JsZW1GaW5kZXIgPSBuZXcgQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlcigKIAkJCQllbnZpcm9ubWVudCwKIAkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAotCQkJCWdldENvbXBpbGVyT3B0aW9ucyhwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksIGNyZWF0aW5nQVNULCAoKHJlY29uY2lsZUZsYWdzICYgSUNvbXBpbGF0aW9uVW5pdC5FTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWSkgIT0gMCkpLAorCQkJCWNvbXBpbGVyT3B0aW9ucywKIAkJCQlnZXRSZXF1ZXN0b3IoKSwKIAkJCQlwcm9ibGVtRmFjdG9yeSk7Ci0JCQlpZiAocGFyc2VyICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtRmluZGVyLnBhcnNlciA9IHBhcnNlcjsKKwkJCWJvb2xlYW4gYW5hbHl6ZUFuZEdlbmVyYXRlQ29kZSA9IHRydWU7CisJCQlpZiAoaWdub3JlTWV0aG9kQm9kaWVzKSB7CisJCQkJYW5hbHl6ZUFuZEdlbmVyYXRlQ29kZSA9IGZhbHNlOwogCQkJfQotCQkJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChQYWNrYWdlRnJhZ21lbnQpdW5pdEVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOwotCQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IG51bGw7Ci0JCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpewotCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUgPSBVdGlsLnRvQ2hhckFycmF5cyhwYWNrYWdlRnJhZ21lbnQubmFtZXMpOworCQkJdHJ5IHsKKwkJCQlpZiAocGFyc2VyICE9IG51bGwpIHsKKwkJCQkJcHJvYmxlbUZpbmRlci5wYXJzZXIgPSBwYXJzZXI7CisJCQkJCXVuaXQgPSBwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQodW5pdEVsZW1lbnQsIHRydWUvKmZ1bGwgcGFyc2UqLywgbW9uaXRvcik7CisJCQkJCXByb2JsZW1GaW5kZXIucmVzb2x2ZSgKKwkJCQkJCXVuaXQsCisJCQkJCQl1bml0RWxlbWVudCwKKwkJCQkJCXRydWUsIC8vIHZlcmlmeSBtZXRob2RzCisJCQkJCQlhbmFseXplQW5kR2VuZXJhdGVDb2RlLCAvLyBhbmFseXplIGNvZGUKKwkJCQkJCWFuYWx5emVBbmRHZW5lcmF0ZUNvZGUpOyAvLyBnZW5lcmF0ZSBjb2RlCisJCQkJfSBlbHNlIHsKKwkJCQkJdW5pdCA9CisJCQkJCQlwcm9ibGVtRmluZGVyLnJlc29sdmUoCisJCQkJCQkJdW5pdEVsZW1lbnQsCisJCQkJCQkJdHJ1ZSwgLy8gdmVyaWZ5IG1ldGhvZHMKKwkJCQkJCQlhbmFseXplQW5kR2VuZXJhdGVDb2RlLCAvLyBhbmFseXplIGNvZGUKKwkJCQkJCQlhbmFseXplQW5kR2VuZXJhdGVDb2RlKTsgLy8gZ2VuZXJhdGUgY29kZQorCQkJCX0KKwkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCXByb2JsZW1GaW5kZXIuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCk7CiAJCQl9Ci0JCQlpZiAodW5pdCA9PSBudWxsKSB7Ci0JCQkJdW5pdCA9IHByb2JsZW1GaW5kZXIucmVzb2x2ZSgKLQkJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJY29udGVudHMsCi0JCQkJCQlleHBlY3RlZFBhY2thZ2VOYW1lLAotCQkJCQkJdW5pdEVsZW1lbnQuZ2V0UGF0aCgpLnRvU3RyaW5nKCksCi0JCQkJCQl1bml0RWxlbWVudCksCi0JCQkJCXRydWUsIC8vIHZlcmlmeSBtZXRob2RzCi0JCQkJCXRydWUsIC8vIGFuYWx5emUgY29kZQotCQkJCQl0cnVlKTsgLy8gZ2VuZXJhdGUgY29kZQotCQkJfSBlbHNlIHsKLQkJCQlwcm9ibGVtRmluZGVyLnJlc29sdmUoCi0JCQkJCXVuaXQsCi0JCQkJCW51bGwsIC8vIG5vIG5lZWQgZm9yIHNvdXJjZQotCQkJCQl0cnVlLCAvLyB2ZXJpZnkgbWV0aG9kcwotCQkJCQl0cnVlLCAvLyBhbmFseXplIGNvZGUKLQkJCQkJdHJ1ZSk7IC8vIGdlbmVyYXRlIGNvZGUKKwkJCWlmICh1bml0ICE9IG51bGwpIHsKKwkJCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0gdW5pdC5jb21waWxhdGlvblJlc3VsdDsKKwkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSB1bml0UHJvYmxlbXMgPSB1bml0UmVzdWx0LmdldFByb2JsZW1zKCk7CisJCQkJaW50IGxlbmd0aCA9IHVuaXRQcm9ibGVtcyA9PSBudWxsID8gMCA6IHVuaXRQcm9ibGVtcy5sZW5ndGg7CisJCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gY2F0ZWdvcml6ZWRQcm9ibGVtcyA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bbGVuZ3RoXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh1bml0UHJvYmxlbXMsIDAsIGNhdGVnb3JpemVkUHJvYmxlbXMsIDAsIGxlbmd0aCk7CisJCQkJCXByb2JsZW1zLnB1dChJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIGNhdGVnb3JpemVkUHJvYmxlbXMpOworCQkJCX0KKwkJCQl1bml0UHJvYmxlbXMgPSB1bml0UmVzdWx0LmdldFRhc2tzKCk7CisJCQkJbGVuZ3RoID0gdW5pdFByb2JsZW1zID09IG51bGwgPyAwIDogdW5pdFByb2JsZW1zLmxlbmd0aDsKKwkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBjYXRlZ29yaXplZFByb2JsZW1zID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVtsZW5ndGhdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHVuaXRQcm9ibGVtcywgMCwgY2F0ZWdvcml6ZWRQcm9ibGVtcywgMCwgbGVuZ3RoKTsKKwkJCQkJcHJvYmxlbXMucHV0KElKYXZhTW9kZWxNYXJrZXIuVEFTS19NQVJLRVIsIGNhdGVnb3JpemVkUHJvYmxlbXMpOworCQkJCX0KKwkJCQlpZiAoTmFtZUxvb2t1cC5WRVJCT1NFKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBUSU1FIFNQRU5UIGluIE5hbWVMb29wa3VwI3NlZWtUeXBlc0luU291cmNlUGFja2FnZTogIiArIGVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgVElNRSBTUEVOVCBpbiBOYW1lTG9vcGt1cCNzZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2U6ICIgKyBlbnZpcm9ubWVudC5uYW1lTG9va3VwLnRpbWVTcGVudEluU2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlICsgIm1zIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CiAJCQl9Ci0JCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0gdW5pdC5jb21waWxhdGlvblJlc3VsdDsKLQkJCUNhdGVnb3JpemVkUHJvYmxlbVtdIHVuaXRQcm9ibGVtcyA9IHVuaXRSZXN1bHQuZ2V0UHJvYmxlbXMoKTsKLQkJCWludCBsZW5ndGggPSB1bml0UHJvYmxlbXMgPT0gbnVsbCA/IDAgOiB1bml0UHJvYmxlbXMubGVuZ3RoOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlDYXRlZ29yaXplZFByb2JsZW1bXSBjYXRlZ29yaXplZFByb2JsZW1zID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVtsZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodW5pdFByb2JsZW1zLCAwLCBjYXRlZ29yaXplZFByb2JsZW1zLCAwLCBsZW5ndGgpOwotCQkJCXByb2JsZW1zLnB1dChJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIGNhdGVnb3JpemVkUHJvYmxlbXMpOwotCQkJfQotCQkJdW5pdFByb2JsZW1zID0gdW5pdFJlc3VsdC5nZXRUYXNrcygpOwotCQkJbGVuZ3RoID0gdW5pdFByb2JsZW1zID09IG51bGwgPyAwIDogdW5pdFByb2JsZW1zLmxlbmd0aDsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gY2F0ZWdvcml6ZWRQcm9ibGVtcyA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bbGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHVuaXRQcm9ibGVtcywgMCwgY2F0ZWdvcml6ZWRQcm9ibGVtcywgMCwgbGVuZ3RoKTsKLQkJCQlwcm9ibGVtcy5wdXQoSUphdmFNb2RlbE1hcmtlci5UQVNLX01BUktFUiwgY2F0ZWdvcml6ZWRQcm9ibGVtcyk7Ci0JCQl9Ci0JCQlpZiAoTmFtZUxvb2t1cC5WRVJCT1NFKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlOiAiICsgZW52aXJvbm1lbnQubmFtZUxvb2t1cC50aW1lU3BlbnRJblNlZWtUeXBlc0luU291cmNlUGFja2FnZSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlOiAiICsgZW52aXJvbm1lbnQubmFtZUxvb2t1cC50aW1lU3BlbnRJblNlZWtUeXBlc0luQmluYXJ5UGFja2FnZSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gdW5pdDsKIAkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworCQkJLy8gY2F0Y2ggdGhpcyBleGNlcHRpb24gc28gYXMgdG8gbm90IGVudGVyIHRoZSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIGJlbG93CiAJCQl0aHJvdyBlOwotCQl9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgeyAKKwkJfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGF2b2lkIGJyZWFraW5nIG90aGVyIHRvb2xzIGR1ZSB0byBpbnRlcm5hbCBjb21waWxlciBmYWlsdXJlICg0MDMzNCkKIAkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gdW5pdEVsZW1lbnQuZmluZFJlY29tbWVuZGVkTGluZVNlcGFyYXRvcigpOwotCQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHByb2JsZW0gZGV0ZWN0aW9uOiIpOyAgLy8kTk9OLU5MUy0xJCAKKwkJCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBwcm9ibGVtIGRldGVjdGlvbjoiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCW1lc3NhZ2UuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwogCQkJbWVzc2FnZS5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNPVVJDRSBCRUdJTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKIAkJCW1lc3NhZ2UuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQkJbWVzc2FnZS5hcHBlbmQoY29udGVudHMpOworCQkJbWVzc2FnZS5hcHBlbmQodW5pdEVsZW1lbnQuZ2V0U291cmNlKCkpOwogCQkJbWVzc2FnZS5hcHBlbmQobGluZURlbGltaXRlcik7CiAJCQltZXNzYWdlLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU09VUkNFIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKIAkJCVV0aWwubG9nKGUsIG1lc3NhZ2UudG9TdHJpbmcoKSk7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ09NUElMRVJfRkFJTFVSRSk7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkKLQkJCQllbnZpcm9ubWVudC5tb25pdG9yID0gbnVsbDsgLy8gZG9uJ3QgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGlzIGV4dGVybmFsIG9iamVjdAorCQkJCWVudmlyb25tZW50LnNldE1vbml0b3IobnVsbCk7IC8vIGRvbid0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcyBleHRlcm5hbCBvYmplY3QKIAkJCWlmIChwcm9ibGVtRmFjdG9yeSAhPSBudWxsKQogCQkJCXByb2JsZW1GYWN0b3J5Lm1vbml0b3IgPSBudWxsOyAvLyBkb24ndCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoaXMgZXh0ZXJuYWwgb2JqZWN0CiAJCQkvLyBOQjogdW5pdC5jbGVhblVwKCkgaXMgZG9uZSBieSBjYWxsZXIKIAkJCWlmIChwcm9ibGVtRmluZGVyICE9IG51bGwgJiYgIWNyZWF0aW5nQVNUKQotCQkJCXByb2JsZW1GaW5kZXIubG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsJCQorCQkJCXByb2JsZW1GaW5kZXIubG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsKIAkJfQorCQlyZXR1cm4gdW5pdDsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHByb2Nlc3MoCi0JCUlDb21waWxhdGlvblVuaXQgdW5pdEVsZW1lbnQsIAotCQljaGFyW10gY29udGVudHMsCi0JCVdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwKLQkJSGFzaE1hcCBwcm9ibGVtcywKLQkJYm9vbGVhbiBjcmVhdGluZ0FTVCwKLQkJaW50IHJlY29uY2lsZUZsYWdzLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJCi0JCXJldHVybiBwcm9jZXNzKG51bGwvKm5vIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKi8sIHVuaXRFbGVtZW50LCBjb250ZW50cywgbnVsbC8qdXNlIGRlZmF1bHQgUGFyc2VyKi8sIHdvcmtpbmdDb3B5T3duZXIsIHByb2JsZW1zLCBjcmVhdGluZ0FTVCwgcmVjb25jaWxlRmxhZ3MsIG1vbml0b3IpOworCQkJQ29tcGlsYXRpb25Vbml0IHVuaXRFbGVtZW50LAorCQkJV29ya2luZ0NvcHlPd25lciB3b3JraW5nQ29weU93bmVyLAorCQkJSGFzaE1hcCBwcm9ibGVtcywKKwkJCWJvb2xlYW4gY3JlYXRpbmdBU1QsCisJCQlpbnQgcmVjb25jaWxlRmxhZ3MsCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gcHJvY2Vzcyh1bml0RWxlbWVudCwgbnVsbC8qdXNlIGRlZmF1bHQgUGFyc2VyKi8sIHdvcmtpbmdDb3B5T3duZXIsIHByb2JsZW1zLCBjcmVhdGluZ0FTVCwgcmVjb25jaWxlRmxhZ3MsIG1vbml0b3IpOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKQEAgLTI1Niw1ICsyNzYsNSBAQAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJzZXIoKSB7CiAJCXRoaXMucGFyc2VyID0gbmV3IENvbW1lbnRSZWNvcmRlclBhcnNlcih0aGlzLnByb2JsZW1SZXBvcnRlciwgdGhpcy5vcHRpb25zLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMpOwogCX0KLX0JCit9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yLmphdmEKaW5kZXggMTI0MTcwMy4uNTBhMGM5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMjQgKzEyLDQ2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DYXRlZ29yaXplZFByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2xhc3NMaXRlcmFsQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZW1iZXJWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OdWxsTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmFyeUV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyeVNjYW5uZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3RUb0ludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlJlZmVyZW5jZUluZm9BZGFwdGVyOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogLyoqCiAgKiBBIHJlcXVlc3RvciBmb3IgdGhlIGZ1enp5IHBhcnNlciwgdXNlZCB0byBjb21wdXRlIHRoZSBjaGlsZHJlbiBvZiBhbiBJQ29tcGlsYXRpb25Vbml0LgogICovCiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yIGV4dGVuZHMgUmVmZXJlbmNlSW5mb0FkYXB0ZXIgaW1wbGVtZW50cyBJU291cmNlRWxlbWVudFJlcXVlc3RvciB7Ci0KKwkKIAkvKioKIAkgKiBUaGUgaGFuZGxlIHRvIHRoZSBjb21waWxhdGlvbiB1bml0IGJlaW5nIHBhcnNlZAogCSAqLwpAQCAtNDMsNyArNjUsOCBAQAogCS8qKgogCSAqIFRoZSBpbXBvcnQgY29udGFpbmVyIGluZm8gLSBudWxsIHVudGlsIGNyZWF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgSmF2YUVsZW1lbnRJbmZvIGltcG9ydENvbnRhaW5lckluZm8gPSBudWxsOworCXByb3RlY3RlZCBJbXBvcnRDb250YWluZXJJbmZvIGltcG9ydENvbnRhaW5lckluZm8gPSBudWxsOworCXByb3RlY3RlZCBJbXBvcnRDb250YWluZXIgaW1wb3J0Q29udGFpbmVyOwogCiAJLyoqCiAJICogSGFzaHRhYmxlIG9mIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgpAQCAtNTMsNiArNzYsMTEgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgTWFwIG5ld0VsZW1lbnRzOwogCisJLyoKKwkgKiBBIHRhYmxlIGZyb20gYSBoYW5kbGUgKHdpdGggb2NjdXJlbmNlQ291bnQgPT0gMSkgdG8gdGhlIGN1cnJlbnQgb2NjdXJlbmNlIGNvdW50IGZvciB0aGlzIGhhbmRsZQorCSAqLworCXByaXZhdGUgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCBvY2N1cmVuY2VDb3VudHM7CisKIAkvKioKIAkgKiBTdGFjayBvZiBwYXJlbnQgc2NvcGUgaW5mbyBvYmplY3RzLiBUaGUgaW5mbyBvbiB0aGUKIAkgKiB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBwYXJlbnQgb2YgdGhlIG5leHQgZWxlbWVudCBmb3VuZC4KQEAgLTYwLDkgKzg4LDkgQEAKIAkgKiB3aWxsIGJlIHRoZSB0eXBlIHRoZSBtZXRob2QgaXMgY29udGFpbmVkIGluLgogCSAqLwogCXByb3RlY3RlZCBTdGFjayBpbmZvU3RhY2s7Ci0JCisKIAkvKgotCSAqIE1hcCBmcm9tIEphdmFFbGVtZW50SW5mbyB0byBvZiBBcnJheUxpc3Qgb2YgSUphdmFFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY2hpbGRyZW4gCisJICogTWFwIGZyb20gaW5mbyB0byBvZiBBcnJheUxpc3Qgb2YgSUphdmFFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY2hpbGRyZW4KIAkgKiBvZiB0aGUgZ2l2ZW4gaW5mby4KIAkgKi8KIAlwcm90ZWN0ZWQgSGFzaE1hcCBjaGlsZHJlbjsKQEAgLTg0LDE2ICsxMTIsMTEgQEAKIAkgKiBQcm9ibGVtIHJlcXVlc3RvciB3aGljaCB3aWxsIGdldCBub3RpZmllZCBvZiBkaXNjb3ZlcmVkIHByb2JsZW1zCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3ludGF4RXJyb3JzID0gZmFsc2U7Ci0JCisKIAkvKgogCSAqIFRoZSBwYXJzZXIgdGhpcyByZXF1ZXN0b3IgaXMgdXNpbmcuCiAJICovCiAJcHJvdGVjdGVkIFBhcnNlciBwYXJzZXI7Ci0JCi0JLyoqCi0JICogRW1wdHkgY29sbGVjdGlvbnMgdXNlZCBmb3IgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gTk9fQllURVM9IG5ldyBieXRlW117fTsKIAogCXByb3RlY3RlZCBIYXNodGFibGVPZk9iamVjdCBmaWVsZFJlZkNhY2hlOwogCXByb3RlY3RlZCBIYXNodGFibGVPZk9iamVjdCBtZXNzYWdlUmVmQ2FjaGU7CkBAIC0xMDQsMTEgKzEyNywxMiBAQAogCXRoaXMudW5pdCA9IHVuaXQ7CiAJdGhpcy51bml0SW5mbyA9IHVuaXRJbmZvOwogCXRoaXMubmV3RWxlbWVudHMgPSBuZXdFbGVtZW50czsKLX0gCisJdGhpcy5vY2N1cmVuY2VDb3VudHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RUb0ludCgpOworfQogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KLXB1YmxpYyB2b2lkIGFjY2VwdEltcG9ydChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBjaGFyW11bXSB0b2tlbnMsIGJvb2xlYW4gb25EZW1hbmQsIGludCBtb2RpZmllcnMpIHsKK3B1YmxpYyB2b2lkIGFjY2VwdEltcG9ydChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gdG9rZW5zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKSB7CiAJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOwogCWlmICghKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSkgewogCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgLy8gU2hvdWxkIG5vdCBoYXBwZW4KQEAgLTExNiwyMSArMTQwLDIzIEBACiAKIAlJQ29tcGlsYXRpb25Vbml0IHBhcmVudENVPSAoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnRIYW5kbGU7CiAJLy9jcmVhdGUgdGhlIGltcG9ydCBjb250YWluZXIgYW5kIGl0cyBpbmZvCi0JSW1wb3J0Q29udGFpbmVyIGltcG9ydENvbnRhaW5lcj0gKEltcG9ydENvbnRhaW5lcilwYXJlbnRDVS5nZXRJbXBvcnRDb250YWluZXIoKTsKLQlpZiAodGhpcy5pbXBvcnRDb250YWluZXJJbmZvID09IG51bGwpIHsKLQkJdGhpcy5pbXBvcnRDb250YWluZXJJbmZvID0gbmV3IEphdmFFbGVtZW50SW5mbygpOwotCQlKYXZhRWxlbWVudEluZm8gcGFyZW50SW5mbyA9IChKYXZhRWxlbWVudEluZm8pIHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKLQkJYWRkVG9DaGlsZHJlbihwYXJlbnRJbmZvLCBpbXBvcnRDb250YWluZXIpOwotCQl0aGlzLm5ld0VsZW1lbnRzLnB1dChpbXBvcnRDb250YWluZXIsIHRoaXMuaW1wb3J0Q29udGFpbmVySW5mbyk7CisJaWYgKHRoaXMuaW1wb3J0Q29udGFpbmVyID09IG51bGwpIHsKKwkJdGhpcy5pbXBvcnRDb250YWluZXIgPSBjcmVhdGVJbXBvcnRDb250YWluZXIocGFyZW50Q1UpOworCQl0aGlzLmltcG9ydENvbnRhaW5lckluZm8gPSBuZXcgSW1wb3J0Q29udGFpbmVySW5mbygpOworCQlPYmplY3QgcGFyZW50SW5mbyA9IHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKKwkJYWRkVG9DaGlsZHJlbihwYXJlbnRJbmZvLCB0aGlzLmltcG9ydENvbnRhaW5lcik7CisJCXRoaXMubmV3RWxlbWVudHMucHV0KHRoaXMuaW1wb3J0Q29udGFpbmVyLCB0aGlzLmltcG9ydENvbnRhaW5lckluZm8pOwogCX0KLQkKKwogCVN0cmluZyBlbGVtZW50TmFtZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmludGVybihuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJykpKTsKLQlJbXBvcnREZWNsYXJhdGlvbiBoYW5kbGUgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb24oaW1wb3J0Q29udGFpbmVyLCBlbGVtZW50TmFtZSwgb25EZW1hbmQpOworCUltcG9ydERlY2xhcmF0aW9uIGhhbmRsZSA9IGNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKHRoaXMuaW1wb3J0Q29udGFpbmVyLCBlbGVtZW50TmFtZSwgb25EZW1hbmQpOwogCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7Ci0JCisKIAlJbXBvcnREZWNsYXJhdGlvbkVsZW1lbnRJbmZvIGluZm8gPSBuZXcgSW1wb3J0RGVjbGFyYXRpb25FbGVtZW50SW5mbygpOwogCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydChkZWNsYXJhdGlvblN0YXJ0KTsKIAlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChuYW1lU291cmNlU3RhcnQpOworCWluZm8uc2V0TmFtZVNvdXJjZUVuZChuYW1lU291cmNlRW5kKTsKIAlpbmZvLnNldEZsYWdzKG1vZGlmaWVycyk7CiAKIAlhZGRUb0NoaWxkcmVuKHRoaXMuaW1wb3J0Q29udGFpbmVySW5mbywgaGFuZGxlKTsKQEAgLTE0MSw3ICsxNjcsNyBAQAogICogb2YgdGhlIHBhcnNlIGFjdGlvbiwgc28gYXMgdG8gYWxsb3cgY29tcHV0YXRpb24gb2Ygbm9ybWFsaXplZCByYW5nZXMuCiAgKgogICogQSBsaW5lIHNlcGFyYXRvciBtaWdodCBjb3JyZXNwb25kcyB0byBzZXZlcmFsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSwKLSAqIAorICoKICAqLwogcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHsKIAkvLyBpZ25vcmUgbGluZSBzZXBhcmF0b3IgcG9zaXRpb25zCkBAIC0xNDksNDQgKzE3NSw4NCBAQAogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KLXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdIG5hbWUpIHsKK3B1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSkgewogCi0JCUphdmFFbGVtZW50SW5mbyBwYXJlbnRJbmZvID0gKEphdmFFbGVtZW50SW5mbykgdGhpcy5pbmZvU3RhY2sucGVlaygpOworCQlPYmplY3QgcGFyZW50SW5mbyA9IHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKIAkJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOwogCQlQYWNrYWdlRGVjbGFyYXRpb24gaGFuZGxlID0gbnVsbDsKLQkJCisKIAkJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0JCQloYW5kbGUgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKChDb21waWxhdGlvblVuaXQpIHBhcmVudEhhbmRsZSwgbmV3IFN0cmluZyhuYW1lKSk7CisJCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpOworCQkJaGFuZGxlID0gY3JlYXRlUGFja2FnZURlY2xhcmF0aW9uKHBhcmVudEhhbmRsZSwgbmV3IFN0cmluZyhuYW1lKSk7CiAJCX0KIAkJZWxzZSB7CiAJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgLy8gU2hvdWxkIG5vdCBoYXBwZW4KIAkJfQogCQlyZXNvbHZlRHVwbGljYXRlcyhoYW5kbGUpOwotCQkKLQkJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IG5ldyBTb3VyY2VSZWZFbGVtZW50SW5mbygpOwotCQlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoZGVjbGFyYXRpb25TdGFydCk7Ci0JCWluZm8uc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25FbmQpOworCisJCUFubm90YXRhYmxlSW5mbyBpbmZvID0gbmV3IEFubm90YXRhYmxlSW5mbygpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCWluZm8uc2V0TmFtZVNvdXJjZVN0YXJ0KGltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCk7CisJCWluZm8uc2V0TmFtZVNvdXJjZUVuZChpbXBvcnRSZWZlcmVuY2Uuc291cmNlRW5kKTsKIAogCQlhZGRUb0NoaWxkcmVuKHBhcmVudEluZm8sIGhhbmRsZSk7CiAJCXRoaXMubmV3RWxlbWVudHMucHV0KGhhbmRsZSwgaW5mbyk7CiAKKwkJaWYgKGltcG9ydFJlZmVyZW5jZS5hbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0UmVmZXJlbmNlLmFubm90YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBpbXBvcnRSZWZlcmVuY2UuYW5ub3RhdGlvbnNbaV07CisJCQkJYWNjZXB0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBpbmZvLCBoYW5kbGUpOworCQkJfQorCQl9CiB9CiBwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKENhdGVnb3JpemVkUHJvYmxlbSBwcm9ibGVtKSB7CiAJaWYgKChwcm9ibGVtLmdldElEKCkgJiBJUHJvYmxlbS5TeW50YXgpICE9IDApewogCQl0aGlzLmhhc1N5bnRheEVycm9ycyA9IHRydWU7CiAJfQogfQotcHJpdmF0ZSB2b2lkIGFkZFRvQ2hpbGRyZW4oSmF2YUVsZW1lbnRJbmZvIHBhcmVudEluZm8sIEphdmFFbGVtZW50IGhhbmRsZSkgeworcHJpdmF0ZSB2b2lkIGFkZFRvQ2hpbGRyZW4oT2JqZWN0IHBhcmVudEluZm8sIEphdmFFbGVtZW50IGhhbmRsZSkgewogCUFycmF5TGlzdCBjaGlsZHJlbkxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLmNoaWxkcmVuLmdldChwYXJlbnRJbmZvKTsKIAlpZiAoY2hpbGRyZW5MaXN0ID09IG51bGwpCiAJCXRoaXMuY2hpbGRyZW4ucHV0KHBhcmVudEluZm8sIGNoaWxkcmVuTGlzdCA9IG5ldyBBcnJheUxpc3QoKSk7CiAJY2hpbGRyZW5MaXN0LmFkZChoYW5kbGUpOwogfQorcHJvdGVjdGVkIEFubm90YXRpb24gY3JlYXRlQW5ub3RhdGlvbihKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHBhcmVudCwgbmFtZSk7Cit9Citwcm90ZWN0ZWQgU291cmNlRmllbGQgY3JlYXRlRmllbGQoSmF2YUVsZW1lbnQgcGFyZW50LCBGaWVsZEluZm8gZmllbGRJbmZvKSB7CisJU3RyaW5nIGZpZWxkTmFtZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmludGVybihuZXcgU3RyaW5nKGZpZWxkSW5mby5uYW1lKSk7CisJcmV0dXJuIG5ldyBTb3VyY2VGaWVsZChwYXJlbnQsIGZpZWxkTmFtZSk7Cit9Citwcm90ZWN0ZWQgSW1wb3J0Q29udGFpbmVyIGNyZWF0ZUltcG9ydENvbnRhaW5lcihJQ29tcGlsYXRpb25Vbml0IHBhcmVudCkgeworCXJldHVybiAoSW1wb3J0Q29udGFpbmVyKXBhcmVudC5nZXRJbXBvcnRDb250YWluZXIoKTsKK30KK3Byb3RlY3RlZCBJbXBvcnREZWNsYXJhdGlvbiBjcmVhdGVJbXBvcnREZWNsYXJhdGlvbihJbXBvcnRDb250YWluZXIgcGFyZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBvbkRlbWFuZCkgeworCXJldHVybiBuZXcgSW1wb3J0RGVjbGFyYXRpb24ocGFyZW50LCBuYW1lLCBvbkRlbWFuZCk7Cit9Citwcm90ZWN0ZWQgSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoSmF2YUVsZW1lbnQgcGFyZW50KSB7CisJcmV0dXJuIG5ldyBJbml0aWFsaXplcihwYXJlbnQsIDEpOworfQorcHJvdGVjdGVkIFNvdXJjZU1ldGhvZCBjcmVhdGVNZXRob2RIYW5kbGUoSmF2YUVsZW1lbnQgcGFyZW50LCBNZXRob2RJbmZvIG1ldGhvZEluZm8pIHsKKwlTdHJpbmcgc2VsZWN0b3IgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5pbnRlcm4obmV3IFN0cmluZyhtZXRob2RJbmZvLm5hbWUpKTsKKwlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlU2lncyA9IGNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MobWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyk7CisJcmV0dXJuIG5ldyBTb3VyY2VNZXRob2QocGFyZW50LCBzZWxlY3RvciwgcGFyYW1ldGVyVHlwZVNpZ3MpOworfQorcHJvdGVjdGVkIFBhY2thZ2VEZWNsYXJhdGlvbiBjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgUGFja2FnZURlY2xhcmF0aW9uKChDb21waWxhdGlvblVuaXQpIHBhcmVudCwgbmFtZSk7Cit9Citwcm90ZWN0ZWQgU291cmNlVHlwZSBjcmVhdGVUeXBlSGFuZGxlKEphdmFFbGVtZW50IHBhcmVudCwgVHlwZUluZm8gdHlwZUluZm8pIHsKKwlTdHJpbmcgbmFtZVN0cmluZz0gbmV3IFN0cmluZyh0eXBlSW5mby5uYW1lKTsKKwlyZXR1cm4gbmV3IFNvdXJjZVR5cGUocGFyZW50LCBuYW1lU3RyaW5nKTsKK30KK3Byb3RlY3RlZCBUeXBlUGFyYW1ldGVyIGNyZWF0ZVR5cGVQYXJhbWV0ZXIoSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgVHlwZVBhcmFtZXRlcihwYXJlbnQsIG5hbWUpOworfQogLyoqCiAgKiBDb252ZXJ0IHRoZXNlIHR5cGUgbmFtZXMgdG8gc2lnbmF0dXJlcy4KICAqIEBzZWUgU2lnbmF0dXJlCiAgKi8KLS8qIGRlZmF1bHQgKi8gc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MoY2hhcltdW10gdHlwZU5hbWVzKSB7Citwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MoY2hhcltdW10gdHlwZU5hbWVzKSB7CiAJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwogCWludCBuID0gdHlwZU5hbWVzLmxlbmd0aDsKQEAgLTE5OSw2ICsyNjUsMzkgQEAKIAl9CiAJcmV0dXJuIHR5cGVTaWdzOwogfQorcHJvdGVjdGVkIElBbm5vdGF0aW9uIGFjY2VwdEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24sIEFubm90YXRhYmxlSW5mbyBwYXJlbnRJbmZvLCBKYXZhRWxlbWVudCBwYXJlbnRIYW5kbGUpIHsKKwlTdHJpbmcgbmFtZVN0cmluZyA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFubm90YXRpb24udHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpKTsKKwlBbm5vdGF0aW9uIGhhbmRsZSA9IGNyZWF0ZUFubm90YXRpb24ocGFyZW50SGFuZGxlLCBuYW1lU3RyaW5nKTsgLy9OQjogb2NjdXJlbmNlQ291bnQgaXMgY29tcHV0ZWQgaW4gcmVzb2x2ZUR1cGxpY2F0ZXMKKwlyZXNvbHZlRHVwbGljYXRlcyhoYW5kbGUpOworCisJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbygpOworCisJLy8gcG9wdWxhdGUgdGhlIG1hcHMgaGVyZSBhcyBnZXRWYWx1ZSguLi4pIGJlbG93IG1heSBuZWVkIHRoZW0KKwl0aGlzLm5ld0VsZW1lbnRzLnB1dChoYW5kbGUsIGluZm8pOworCXRoaXMuaGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOworCisJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGFubm90YXRpb24uc291cmNlU3RhcnQoKSk7CisJaW5mby5uYW1lU3RhcnQgPSBhbm5vdGF0aW9uLnR5cGUuc291cmNlU3RhcnQoKTsKKwlpbmZvLm5hbWVFbmQgPSBhbm5vdGF0aW9uLnR5cGUuc291cmNlRW5kKCk7CisJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycygpOworCWludCBtZW1iZXJzTGVuZ3RoID0gbWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7CisJaWYgKG1lbWJlcnNMZW5ndGggPT0gMCkgeworCQlpbmZvLm1lbWJlcnMgPSBBbm5vdGF0aW9uLk5PX01FTUJFUl9WQUxVRV9QQUlSUzsKKwl9IGVsc2UgeworCQlpbmZvLm1lbWJlcnMgPSBnZXRNZW1iZXJWYWx1ZVBhaXJzKG1lbWJlclZhbHVlUGFpcnMpOworCX0KKworCWlmIChwYXJlbnRJbmZvICE9IG51bGwpIHsKKwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHBhcmVudEluZm8uYW5ub3RhdGlvbnM7CisJCWludCBsZW5ndGggPSBhbm5vdGF0aW9ucy5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoYW5ub3RhdGlvbnMsIDAsIGFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uW2xlbmd0aCsxXSwgMCwgbGVuZ3RoKTsKKwkJYW5ub3RhdGlvbnNbbGVuZ3RoXSA9IGhhbmRsZTsKKwkJcGFyZW50SW5mby5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworCX0KKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGFubm90YXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCXRoaXMuaGFuZGxlU3RhY2sucG9wKCk7CisJcmV0dXJuIGhhbmRsZTsKK30KIC8qKgogICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogICovCkBAIC0yMjAsNjkgKzMxOSw1MSBAQAogICovCiBwdWJsaWMgdm9pZCBlbnRlckZpZWxkKEZpZWxkSW5mbyBmaWVsZEluZm8pIHsKIAotCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBwYXJlbnRJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgdGhpcy5pbmZvU3RhY2sucGVlaygpOworCVR5cGVJbmZvIHBhcmVudEluZm8gPSAoVHlwZUluZm8pIHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKIAlKYXZhRWxlbWVudCBwYXJlbnRIYW5kbGU9IChKYXZhRWxlbWVudCkgdGhpcy5oYW5kbGVTdGFjay5wZWVrKCk7CiAJU291cmNlRmllbGQgaGFuZGxlID0gbnVsbDsKIAlpZiAocGFyZW50SGFuZGxlLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmludGVybihuZXcgU3RyaW5nKGZpZWxkSW5mby5uYW1lKSk7Ci0JCWhhbmRsZSA9IG5ldyBTb3VyY2VGaWVsZChwYXJlbnRIYW5kbGUsIGZpZWxkTmFtZSk7CisJCWhhbmRsZSA9IGNyZWF0ZUZpZWxkKHBhcmVudEhhbmRsZSwgZmllbGRJbmZvKTsKKwl9CisJZWxzZSB7CisJCUFzc2VydC5pc1RydWUoZmFsc2UpOyAvLyBTaG91bGQgbm90IGhhcHBlbgorCX0KKwlyZXNvbHZlRHVwbGljYXRlcyhoYW5kbGUpOworCisJYWRkVG9DaGlsZHJlbihwYXJlbnRJbmZvLCBoYW5kbGUpOworCXBhcmVudEluZm8uY2hpbGRyZW5DYXRlZ29yaWVzLnB1dChoYW5kbGUsIGZpZWxkSW5mby5jYXRlZ29yaWVzKTsKKworCXRoaXMuaW5mb1N0YWNrLnB1c2goZmllbGRJbmZvKTsKKwl0aGlzLmhhbmRsZVN0YWNrLnB1c2goaGFuZGxlKTsKKworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGVudGVySW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGludCBtb2RpZmllcnMpIHsKKwlPYmplY3QgcGFyZW50SW5mbyA9IHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKKwlKYXZhRWxlbWVudCBwYXJlbnRIYW5kbGU9IChKYXZhRWxlbWVudCkgdGhpcy5oYW5kbGVTdGFjay5wZWVrKCk7CisJSW5pdGlhbGl6ZXIgaGFuZGxlID0gbnVsbDsKKworCWlmIChwYXJlbnRIYW5kbGUuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQloYW5kbGUgPSBjcmVhdGVJbml0aWFsaXplcihwYXJlbnRIYW5kbGUpOwogCX0KIAllbHNlIHsKIAkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCiAJfQogCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7CiAJCi0JU291cmNlRmllbGRFbGVtZW50SW5mbyBpbmZvID0gbmV3IFNvdXJjZUZpZWxkRWxlbWVudEluZm8oKTsKLQlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChmaWVsZEluZm8ubmFtZVNvdXJjZVN0YXJ0KTsKLQlpbmZvLnNldE5hbWVTb3VyY2VFbmQoZmllbGRJbmZvLm5hbWVTb3VyY2VFbmQpOwotCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydChmaWVsZEluZm8uZGVjbGFyYXRpb25TdGFydCk7Ci0JaW5mby5zZXRGbGFncyhmaWVsZEluZm8ubW9kaWZpZXJzKTsKLQljaGFyW10gdHlwZU5hbWUgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5pbnRlcm4oZmllbGRJbmZvLnR5cGUpOwotCWluZm8uc2V0VHlwZU5hbWUodHlwZU5hbWUpOwotCQotCXRoaXMudW5pdEluZm8uYWRkQW5ub3RhdGlvblBvc2l0aW9ucyhoYW5kbGUsIGZpZWxkSW5mby5hbm5vdGF0aW9uUG9zaXRpb25zKTsKLQogCWFkZFRvQ2hpbGRyZW4ocGFyZW50SW5mbywgaGFuZGxlKTsKLQlwYXJlbnRJbmZvLmFkZENhdGVnb3JpZXMoaGFuZGxlLCBmaWVsZEluZm8uY2F0ZWdvcmllcyk7Ci0JdGhpcy5uZXdFbGVtZW50cy5wdXQoaGFuZGxlLCBpbmZvKTsKIAotCXRoaXMuaW5mb1N0YWNrLnB1c2goaW5mbyk7CisJdGhpcy5pbmZvU3RhY2sucHVzaChuZXcgaW50W10ge2RlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1vZGlmaWVyc30pOwogCXRoaXMuaGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOwogfQogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KLXB1YmxpYyB2b2lkIGVudGVySW5pdGlhbGl6ZXIoCi0JaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsCi0JaW50IG1vZGlmaWVycykgewotCQlKYXZhRWxlbWVudEluZm8gcGFyZW50SW5mbyA9IChKYXZhRWxlbWVudEluZm8pIHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKLQkJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOwotCQlJbml0aWFsaXplciBoYW5kbGUgPSBudWxsOwotCQkKLQkJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCQloYW5kbGUgPSBuZXcgSW5pdGlhbGl6ZXIocGFyZW50SGFuZGxlLCAxKTsKLQkJfQotCQllbHNlIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOyAvLyBTaG91bGQgbm90IGhhcHBlbgotCQl9Ci0JCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7Ci0JCQotCQlJbml0aWFsaXplckVsZW1lbnRJbmZvIGluZm8gPSBuZXcgSW5pdGlhbGl6ZXJFbGVtZW50SW5mbygpOwotCQlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoZGVjbGFyYXRpb25Tb3VyY2VTdGFydCk7Ci0JCWluZm8uc2V0RmxhZ3MobW9kaWZpZXJzKTsKLQotCQlhZGRUb0NoaWxkcmVuKHBhcmVudEluZm8sIGhhbmRsZSk7Ci0JCXRoaXMubmV3RWxlbWVudHMucHV0KGhhbmRsZSwgaW5mbyk7Ci0KLQkJdGhpcy5pbmZvU3RhY2sucHVzaChpbmZvKTsKLQkJdGhpcy5oYW5kbGVTdGFjay5wdXNoKGhhbmRsZSk7Ci19Ci0vKioKLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKLSAqLwogcHVibGljIHZvaWQgZW50ZXJNZXRob2QoTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7CiAKLQlTb3VyY2VUeXBlRWxlbWVudEluZm8gcGFyZW50SW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pIHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKKwlUeXBlSW5mbyBwYXJlbnRJbmZvID0gKFR5cGVJbmZvKSB0aGlzLmluZm9TdGFjay5wZWVrKCk7CiAJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOwogCVNvdXJjZU1ldGhvZCBoYW5kbGUgPSBudWxsOwogCkBAIC0yOTYsMjQgKzM3NywzMSBAQAogCWlmIChtZXRob2RJbmZvLmV4Y2VwdGlvblR5cGVzID09IG51bGwpIHsKIAkJbWV0aG9kSW5mby5leGNlcHRpb25UeXBlcz0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJfQotCQotCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWdzID0gY29udmVydFR5cGVOYW1lc1RvU2lncyhtZXRob2RJbmZvLnBhcmFtZXRlclR5cGVzKTsKKwogCWlmIChwYXJlbnRIYW5kbGUuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotCQlTdHJpbmcgc2VsZWN0b3IgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5pbnRlcm4obmV3IFN0cmluZyhtZXRob2RJbmZvLm5hbWUpKTsKLQkJaGFuZGxlID0gbmV3IFNvdXJjZU1ldGhvZChwYXJlbnRIYW5kbGUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlU2lncyk7CisJCWhhbmRsZSA9IGNyZWF0ZU1ldGhvZEhhbmRsZShwYXJlbnRIYW5kbGUsIG1ldGhvZEluZm8pOwogCX0KIAllbHNlIHsKIAkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCiAJfQogCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7CisKKwl0aGlzLmluZm9TdGFjay5wdXNoKG1ldGhvZEluZm8pOworCXRoaXMuaGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOwogCQorCWFkZFRvQ2hpbGRyZW4ocGFyZW50SW5mbywgaGFuZGxlKTsKKwlwYXJlbnRJbmZvLmNoaWxkcmVuQ2F0ZWdvcmllcy5wdXQoaGFuZGxlLCBtZXRob2RJbmZvLmNhdGVnb3JpZXMpOworfQorcHJpdmF0ZSBTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBjcmVhdGVNZXRob2RJbmZvKE1ldGhvZEluZm8gbWV0aG9kSW5mbywgU291cmNlTWV0aG9kIGhhbmRsZSkgeworCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4obWV0aG9kSW5mbyk7CiAJU291cmNlTWV0aG9kRWxlbWVudEluZm8gaW5mbzsKLQlpZiAobWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yKQotCQlpbmZvID0gbmV3IFNvdXJjZUNvbnN0cnVjdG9ySW5mbygpOwotCWVsc2UgaWYgKG1ldGhvZEluZm8uaXNBbm5vdGF0aW9uKQorCWlmIChtZXRob2RJbmZvLmlzQ29uc3RydWN0b3IpIHsKKwkJaW5mbyA9IGVsZW1lbnRzLmxlbmd0aCA9PSAwID8gbmV3IFNvdXJjZUNvbnN0cnVjdG9ySW5mbygpIDogbmV3IFNvdXJjZUNvbnN0cnVjdG9yV2l0aENoaWxkcmVuSW5mbyhlbGVtZW50cyk7CisJfSBlbHNlIGlmIChtZXRob2RJbmZvLmlzQW5ub3RhdGlvbikgewogCQlpbmZvID0gbmV3IFNvdXJjZUFubm90YXRpb25NZXRob2RJbmZvKCk7Ci0JZWxzZQotCQlpbmZvID0gbmV3IFNvdXJjZU1ldGhvZEluZm8oKTsKKwl9IGVsc2UgeworCQlpbmZvID0gZWxlbWVudHMubGVuZ3RoID09IDAgPyBuZXcgU291cmNlTWV0aG9kSW5mbygpIDogbmV3IFNvdXJjZU1ldGhvZFdpdGhDaGlsZHJlbkluZm8oZWxlbWVudHMpOworCX0KIAlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQobWV0aG9kSW5mby5kZWNsYXJhdGlvblN0YXJ0KTsKIAlpbnQgZmxhZ3MgPSBtZXRob2RJbmZvLm1vZGlmaWVyczsKIAlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChtZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCk7CkBAIC0zMzAsMzkgKzQxOCw5NCBAQAogCWluZm8uc2V0RXhjZXB0aW9uVHlwZU5hbWVzKGV4Y2VwdGlvblR5cGVzKTsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZXhjZXB0aW9uVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCiAJCWV4Y2VwdGlvblR5cGVzW2ldID0gbWFuYWdlci5pbnRlcm4oZXhjZXB0aW9uVHlwZXNbaV0pOwotCXRoaXMudW5pdEluZm8uYWRkQW5ub3RhdGlvblBvc2l0aW9ucyhoYW5kbGUsIG1ldGhvZEluZm8uYW5ub3RhdGlvblBvc2l0aW9ucyk7Ci0JYWRkVG9DaGlsZHJlbihwYXJlbnRJbmZvLCBoYW5kbGUpOwotCXBhcmVudEluZm8uYWRkQ2F0ZWdvcmllcyhoYW5kbGUsIG1ldGhvZEluZm8uY2F0ZWdvcmllcyk7CiAJdGhpcy5uZXdFbGVtZW50cy5wdXQoaGFuZGxlLCBpbmZvKTsKLQl0aGlzLmluZm9TdGFjay5wdXNoKGluZm8pOwotCXRoaXMuaGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOwogCiAJaWYgKG1ldGhvZEluZm8udHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kSW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJVHlwZVBhcmFtZXRlckluZm8gdHlwZVBhcmFtZXRlckluZm8gPSBtZXRob2RJbmZvLnR5cGVQYXJhbWV0ZXJzW2ldOwotCQkJZW50ZXJUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJJbmZvKTsKLQkJCWV4aXRNZW1iZXIodHlwZVBhcmFtZXRlckluZm8uZGVjbGFyYXRpb25FbmQpOworCQkJYWNjZXB0VHlwZVBhcmFtZXRlcih0eXBlUGFyYW1ldGVySW5mbywgaW5mbyk7CiAJCX0KIAl9CisJaWYgKG1ldGhvZEluZm8uYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gbWV0aG9kSW5mby5hbm5vdGF0aW9ucy5sZW5ndGg7CisJCXRoaXMudW5pdEluZm8uYW5ub3RhdGlvbk51bWJlciArPSBsZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0aG9kSW5mby5hbm5vdGF0aW9uc1tpXTsKKwkJCWFjY2VwdEFubm90YXRpb24oYW5ub3RhdGlvbiwgaW5mbywgaGFuZGxlKTsKKwkJfQorCX0KKwkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NzgzCisJLy8gUHJvY2VzcyB0aGUgcGFyYW1ldGVyIGFubm90YXRpb25zIGZyb20gdGhlIGFyZ3VtZW50cworCWlmIChtZXRob2RJbmZvLm5vZGUgIT0gbnVsbCAmJiBtZXRob2RJbmZvLm5vZGUuYXJndW1lbnRzICE9IG51bGwpIHsKKwkJaW5mby5hcmd1bWVudHMgPSBhY2NlcHRNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZEluZm8ubm9kZS5hcmd1bWVudHMsIGhhbmRsZSwgbWV0aG9kSW5mbyk7CisJfQorCXJldHVybiBpbmZvOwogfQorcHJpdmF0ZSBMb2NhbFZhcmlhYmxlW10gYWNjZXB0TWV0aG9kUGFyYW1ldGVycyhBcmd1bWVudFtdIGFyZ3VtZW50cywgSmF2YUVsZW1lbnQgbWV0aG9kSGFuZGxlLCBNZXRob2RJbmZvIG1ldGhvZEluZm8pIHsKKwlpZiAoYXJndW1lbnRzID09IG51bGwpIHJldHVybiBudWxsOworCUxvY2FsVmFyaWFibGVbXSByZXN1bHQgPSBuZXcgTG9jYWxWYXJpYWJsZVthcmd1bWVudHMubGVuZ3RoXTsKKwlBbm5vdGF0aW9uW11bXSBwYXJhbUFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bYXJndW1lbnRzLmxlbmd0aF1bXTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCUFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOworCQlBbm5vdGF0YWJsZUluZm8gbG9jYWxWYXJJbmZvID0gbmV3IEFubm90YXRhYmxlSW5mbygpOworCQlsb2NhbFZhckluZm8uc2V0U291cmNlUmFuZ2VTdGFydChhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KTsKKwkJbG9jYWxWYXJJbmZvLnNldFNvdXJjZVJhbmdlRW5kKGFyZ3VtZW50LmRlY2xhcmF0aW9uU291cmNlU3RhcnQpOworCQlsb2NhbFZhckluZm8uc2V0TmFtZVNvdXJjZVN0YXJ0KGFyZ3VtZW50LnNvdXJjZVN0YXJ0KTsKKwkJbG9jYWxWYXJJbmZvLnNldE5hbWVTb3VyY2VFbmQoYXJndW1lbnQuc291cmNlRW5kKTsKKwkJCisJCVN0cmluZyBwYXJhbVR5cGVTaWcgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5pbnRlcm4oU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUobWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlc1tpXSwgZmFsc2UpKTsKKwkJcmVzdWx0W2ldID0gbmV3IExvY2FsVmFyaWFibGUoCisJCQkJbWV0aG9kSGFuZGxlLAorCQkJCW5ldyBTdHJpbmcoYXJndW1lbnQubmFtZSksCisJCQkJYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCQlhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJCQlhcmd1bWVudC5zb3VyY2VTdGFydCwKKwkJCQlhcmd1bWVudC5zb3VyY2VFbmQsCisJCQkJcGFyYW1UeXBlU2lnLAorCQkJCWFyZ3VtZW50LmFubm90YXRpb25zLAorCQkJCWFyZ3VtZW50Lm1vZGlmaWVycywgCisJCQkJdHJ1ZSk7CisJCXRoaXMubmV3RWxlbWVudHMucHV0KHJlc3VsdFtpXSwgbG9jYWxWYXJJbmZvKTsKKwkJdGhpcy5pbmZvU3RhY2sucHVzaChsb2NhbFZhckluZm8pOworCQl0aGlzLmhhbmRsZVN0YWNrLnB1c2gocmVzdWx0W2ldKTsKKwkJaWYgKGFyZ3VtZW50LmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCXBhcmFtQW5ub3RhdGlvbnNbaV0gPSBuZXcgQW5ub3RhdGlvblthcmd1bWVudC5hbm5vdGF0aW9ucy5sZW5ndGhdOworCQkJZm9yIChpbnQgIGogPSAwOyBqIDwgYXJndW1lbnQuYW5ub3RhdGlvbnMubGVuZ3RoOyBqKysgKSB7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBhcmd1bWVudC5hbm5vdGF0aW9uc1tqXTsKKwkJCQlhY2NlcHRBbm5vdGF0aW9uKGFubm90YXRpb24sIGxvY2FsVmFySW5mbywgcmVzdWx0W2ldKTsKKwkJCX0KKwkJfQorCQl0aGlzLmluZm9TdGFjay5wb3AoKTsKKwkJdGhpcy5oYW5kbGVTdGFjay5wb3AoKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIGVudGVyVHlwZShUeXBlSW5mbyB0eXBlSW5mbykgewogCi0JSmF2YUVsZW1lbnRJbmZvIHBhcmVudEluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSB0aGlzLmluZm9TdGFjay5wZWVrKCk7CisJT2JqZWN0IHBhcmVudEluZm8gPSB0aGlzLmluZm9TdGFjay5wZWVrKCk7CiAJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOwotCVN0cmluZyBuYW1lU3RyaW5nPSBuZXcgU3RyaW5nKHR5cGVJbmZvLm5hbWUpOwotCVNvdXJjZVR5cGUgaGFuZGxlID0gbmV3IFNvdXJjZVR5cGUocGFyZW50SGFuZGxlLCBuYW1lU3RyaW5nKTsgLy9OQjogb2NjdXJlbmNlQ291bnQgaXMgY29tcHV0ZWQgaW4gcmVzb2x2ZUR1cGxpY2F0ZXMKKwlTb3VyY2VUeXBlIGhhbmRsZSA9IGNyZWF0ZVR5cGVIYW5kbGUocGFyZW50SGFuZGxlLCB0eXBlSW5mbyk7IC8vTkI6IG9jY3VyZW5jZUNvdW50IGlzIGNvbXB1dGVkIGluIHJlc29sdmVEdXBsaWNhdGVzCiAJcmVzb2x2ZUR1cGxpY2F0ZXMoaGFuZGxlKTsKLQkKLQlTb3VyY2VUeXBlRWxlbWVudEluZm8gaW5mbyA9IAotCQl0eXBlSW5mby5hbm9ueW1vdXNNZW1iZXIgPyAKKworCXRoaXMuaW5mb1N0YWNrLnB1c2godHlwZUluZm8pOworCXRoaXMuaGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOworCisJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKQorCQkoKFR5cGVJbmZvKSBwYXJlbnRJbmZvKS5jaGlsZHJlbkNhdGVnb3JpZXMucHV0KGhhbmRsZSwgdHlwZUluZm8uY2F0ZWdvcmllcyk7CisJYWRkVG9DaGlsZHJlbihwYXJlbnRJbmZvLCBoYW5kbGUpOworfQorcHJpdmF0ZSBTb3VyY2VUeXBlRWxlbWVudEluZm8gY3JlYXRlVHlwZUluZm8oVHlwZUluZm8gdHlwZUluZm8sIFNvdXJjZVR5cGUgaGFuZGxlKSB7CisJU291cmNlVHlwZUVsZW1lbnRJbmZvIGluZm8gPQorCQl0eXBlSW5mby5hbm9ueW1vdXNNZW1iZXIgPwogCQkJbmV3IFNvdXJjZVR5cGVFbGVtZW50SW5mbygpIHsKIAkJCQlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91c01lbWJlcigpIHsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQotCQkJfSA6IAorCQkJfSA6CiAJCW5ldyBTb3VyY2VUeXBlRWxlbWVudEluZm8oKTsKIAlpbmZvLnNldEhhbmRsZShoYW5kbGUpOwogCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydCh0eXBlSW5mby5kZWNsYXJhdGlvblN0YXJ0KTsKQEAgLTM3NywyOSArNTIwLDM4IEBACiAJCXN1cGVyaW50ZXJmYWNlc1tpXSA9IG1hbmFnZXIuaW50ZXJuKHN1cGVyaW50ZXJmYWNlc1tpXSk7CiAJaW5mby5zZXRTdXBlckludGVyZmFjZU5hbWVzKHN1cGVyaW50ZXJmYWNlcyk7CiAJaW5mby5hZGRDYXRlZ29yaWVzKGhhbmRsZSwgdHlwZUluZm8uY2F0ZWdvcmllcyk7Ci0JaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKQotCQkoKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgcGFyZW50SW5mbykuYWRkQ2F0ZWdvcmllcyhoYW5kbGUsIHR5cGVJbmZvLmNhdGVnb3JpZXMpOwotCWFkZFRvQ2hpbGRyZW4ocGFyZW50SW5mbywgaGFuZGxlKTsKLQl0aGlzLnVuaXRJbmZvLmFkZEFubm90YXRpb25Qb3NpdGlvbnMoaGFuZGxlLCB0eXBlSW5mby5hbm5vdGF0aW9uUG9zaXRpb25zKTsKIAl0aGlzLm5ld0VsZW1lbnRzLnB1dChoYW5kbGUsIGluZm8pOwotCXRoaXMuaW5mb1N0YWNrLnB1c2goaW5mbyk7Ci0JdGhpcy5oYW5kbGVTdGFjay5wdXNoKGhhbmRsZSk7Ci0JCisKIAlpZiAodHlwZUluZm8udHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVR5cGVQYXJhbWV0ZXJJbmZvIHR5cGVQYXJhbWV0ZXJJbmZvID0gdHlwZUluZm8udHlwZVBhcmFtZXRlcnNbaV07Ci0JCQllbnRlclR5cGVQYXJhbWV0ZXIodHlwZVBhcmFtZXRlckluZm8pOwotCQkJZXhpdE1lbWJlcih0eXBlUGFyYW1ldGVySW5mby5kZWNsYXJhdGlvbkVuZCk7CisJCQlhY2NlcHRUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJJbmZvLCBpbmZvKTsKIAkJfQogCX0KKwlpZiAodHlwZUluZm8uYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gdHlwZUluZm8uYW5ub3RhdGlvbnMubGVuZ3RoOworCQl0aGlzLnVuaXRJbmZvLmFubm90YXRpb25OdW1iZXIgKz0gbGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHR5cGVJbmZvLmFubm90YXRpb25zW2ldOworCQkJYWNjZXB0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBpbmZvLCBoYW5kbGUpOworCQl9CisJfQorCWlmICh0eXBlSW5mby5jaGlsZHJlbkNhdGVnb3JpZXMgIT0gbnVsbCkgeworCQlJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVJbmZvLmNoaWxkcmVuQ2F0ZWdvcmllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWluZm8uYWRkQ2F0ZWdvcmllcygoSUphdmFFbGVtZW50KSBlbnRyeS5nZXRLZXkoKSwgKGNoYXJbXVtdKSBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCQkKKwl9CisJcmV0dXJuIGluZm87CiB9Ci1wcm90ZWN0ZWQgdm9pZCBlbnRlclR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlckluZm8gdHlwZVBhcmFtZXRlckluZm8pIHsKLQlKYXZhRWxlbWVudEluZm8gcGFyZW50SW5mbyA9IChKYXZhRWxlbWVudEluZm8pIHRoaXMuaW5mb1N0YWNrLnBlZWsoKTsKK3Byb3RlY3RlZCB2b2lkIGFjY2VwdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlckluZm8gdHlwZVBhcmFtZXRlckluZm8sIEphdmFFbGVtZW50SW5mbyBwYXJlbnRJbmZvKSB7CiAJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlID0gKEphdmFFbGVtZW50KSB0aGlzLmhhbmRsZVN0YWNrLnBlZWsoKTsKIAlTdHJpbmcgbmFtZVN0cmluZyA9IG5ldyBTdHJpbmcodHlwZVBhcmFtZXRlckluZm8ubmFtZSk7Ci0JVHlwZVBhcmFtZXRlciBoYW5kbGUgPSBuZXcgVHlwZVBhcmFtZXRlcihwYXJlbnRIYW5kbGUsIG5hbWVTdHJpbmcpOyAvL05COiBvY2N1cmVuY2VDb3VudCBpcyBjb21wdXRlZCBpbiByZXNvbHZlRHVwbGljYXRlcworCVR5cGVQYXJhbWV0ZXIgaGFuZGxlID0gY3JlYXRlVHlwZVBhcmFtZXRlcihwYXJlbnRIYW5kbGUsIG5hbWVTdHJpbmcpOyAvL05COiBvY2N1cmVuY2VDb3VudCBpcyBjb21wdXRlZCBpbiByZXNvbHZlRHVwbGljYXRlcwogCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7Ci0JCisKIAlUeXBlUGFyYW1ldGVyRWxlbWVudEluZm8gaW5mbyA9IG5ldyBUeXBlUGFyYW1ldGVyRWxlbWVudEluZm8oKTsKIAlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQodHlwZVBhcmFtZXRlckluZm8uZGVjbGFyYXRpb25TdGFydCk7CiAJaW5mby5uYW1lU3RhcnQgPSB0eXBlUGFyYW1ldGVySW5mby5uYW1lU291cmNlU3RhcnQ7CkBAIC00MjAsMTAgKzU3Miw4IEBACiAJCXR5cGVQYXJhbWV0ZXJzW2xlbmd0aF0gPSBoYW5kbGU7CiAJCWVsZW1lbnRJbmZvLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CiAJfQotCXRoaXMudW5pdEluZm8uYWRkQW5ub3RhdGlvblBvc2l0aW9ucyhoYW5kbGUsIHR5cGVQYXJhbWV0ZXJJbmZvLmFubm90YXRpb25Qb3NpdGlvbnMpOwogCXRoaXMubmV3RWxlbWVudHMucHV0KGhhbmRsZSwgaW5mbyk7Ci0JdGhpcy5pbmZvU3RhY2sucHVzaChpbmZvKTsKLQl0aGlzLmhhbmRsZVN0YWNrLnB1c2goaGFuZGxlKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKHR5cGVQYXJhbWV0ZXJJbmZvLmRlY2xhcmF0aW9uRW5kKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgpAQCAtNDMxLDEyICs1ODEsMTAgQEAKIHB1YmxpYyB2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKSB7CiAJLy8gc2V0IGltcG9ydCBjb250YWluZXIgY2hpbGRyZW4KIAlpZiAodGhpcy5pbXBvcnRDb250YWluZXJJbmZvICE9IG51bGwpIHsKLQkJc2V0Q2hpbGRyZW4odGhpcy5pbXBvcnRDb250YWluZXJJbmZvKTsKKwkJdGhpcy5pbXBvcnRDb250YWluZXJJbmZvLmNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4odGhpcy5pbXBvcnRDb250YWluZXJJbmZvKTsKIAl9Ci0JCi0JLy8gc2V0IGNoaWxkcmVuCi0Jc2V0Q2hpbGRyZW4odGhpcy51bml0SW5mbyk7Ci0JCisKKwl0aGlzLnVuaXRJbmZvLmNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4odGhpcy51bml0SW5mbyk7CiAJdGhpcy51bml0SW5mby5zZXRTb3VyY2VMZW5ndGgoZGVjbGFyYXRpb25FbmQgKyAxKTsKIAogCS8vIGRldGVybWluZSBpZiB0aGVyZSB3ZXJlIGFueSBwYXJzaW5nIGVycm9ycwpAQCAtNDQ2LDIzICs1OTQsNDMgQEAKICAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgewotCWV4aXRNZW1iZXIoZGVjbGFyYXRpb25FbmQpOworCWV4aXRNZXRob2QoZGVjbGFyYXRpb25FbmQsIG51bGwpOwogfQogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQlTb3VyY2VGaWVsZEVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlRmllbGRFbGVtZW50SW5mbykgdGhpcy5pbmZvU3RhY2sucG9wKCk7CisJSmF2YUVsZW1lbnQgaGFuZGxlID0gKEphdmFFbGVtZW50KSB0aGlzLmhhbmRsZVN0YWNrLnBlZWsoKTsKKwlGaWVsZEluZm8gZmllbGRJbmZvID0gKEZpZWxkSW5mbykgdGhpcy5pbmZvU3RhY2sucGVlaygpOworCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4oZmllbGRJbmZvKTsKKwlTb3VyY2VGaWVsZEVsZW1lbnRJbmZvIGluZm8gPSBlbGVtZW50cy5sZW5ndGggPT0gMCA/IG5ldyBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKCkgOiBuZXcgU291cmNlRmllbGRXaXRoQ2hpbGRyZW5JbmZvKGVsZW1lbnRzKTsKKwlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChmaWVsZEluZm8ubmFtZVNvdXJjZVN0YXJ0KTsKKwlpbmZvLnNldE5hbWVTb3VyY2VFbmQoZmllbGRJbmZvLm5hbWVTb3VyY2VFbmQpOworCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydChmaWVsZEluZm8uZGVjbGFyYXRpb25TdGFydCk7CisJaW5mby5zZXRGbGFncyhmaWVsZEluZm8ubW9kaWZpZXJzKTsKKwljaGFyW10gdHlwZU5hbWUgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5pbnRlcm4oZmllbGRJbmZvLnR5cGUpOworCWluZm8uc2V0VHlwZU5hbWUodHlwZU5hbWUpOworCXRoaXMubmV3RWxlbWVudHMucHV0KGhhbmRsZSwgaW5mbyk7CisKKwlpZiAoZmllbGRJbmZvLmFubm90YXRpb25zICE9IG51bGwpIHsKKwkJaW50IGxlbmd0aCA9IGZpZWxkSW5mby5hbm5vdGF0aW9ucy5sZW5ndGg7CisJCXRoaXMudW5pdEluZm8uYW5ub3RhdGlvbk51bWJlciArPSBsZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZmllbGRJbmZvLmFubm90YXRpb25zW2ldOworCQkJYWNjZXB0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBpbmZvLCBoYW5kbGUpOworCQl9CisJfQogCWluZm8uc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotCXNldENoaWxkcmVuKGluZm8pOworCXRoaXMuaGFuZGxlU3RhY2sucG9wKCk7CisJdGhpcy5pbmZvU3RhY2sucG9wKCk7CiAJCiAJLy8gcmVtZW1iZXIgaW5pdGlhbGl6ZXIgc291cmNlIGlmIGZpZWxkIGlzIGEgY29uc3RhbnQKIAlpZiAoaW5pdGlhbGl6YXRpb25TdGFydCAhPSAtMSkgewogCQlpbnQgZmxhZ3MgPSBpbmZvLmZsYWdzOwogCQlPYmplY3QgdHlwZUluZm87CiAJCWlmIChGbGFncy5pc1N0YXRpYyhmbGFncykgJiYgRmxhZ3MuaXNGaW5hbChmbGFncykKLQkJCQl8fCAoKHR5cGVJbmZvID0gdGhpcy5pbmZvU3RhY2sucGVlaygpKSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVFbGVtZW50SW5mbwotCQkJCQkgJiYgKEZsYWdzLmlzSW50ZXJmYWNlKCgoU291cmNlVHlwZUVsZW1lbnRJbmZvKXR5cGVJbmZvKS5mbGFncykpKSkgeworCQkJCXx8ICgodHlwZUluZm8gPSB0aGlzLmluZm9TdGFjay5wZWVrKCkpIGluc3RhbmNlb2YgVHlwZUluZm8KKwkJCQkJICYmIChGbGFncy5pc0ludGVyZmFjZSgoKFR5cGVJbmZvKXR5cGVJbmZvKS5tb2RpZmllcnMpKSkpIHsKIAkJCWludCBsZW5ndGggPSBkZWNsYXJhdGlvbkVuZCAtIGluaXRpYWxpemF0aW9uU3RhcnQ7CiAJCQlpZiAobGVuZ3RoID4gMCkgewogCQkJCWNoYXJbXSBpbml0aWFsaXplciA9IG5ldyBjaGFyW2xlbmd0aF07CkBAIC00NzEsNjIgKzYzOSwxNTggQEAKIAkJCX0KIAkJfQogCX0KLQl0aGlzLmhhbmRsZVN0YWNrLnBvcCgpOwogfQogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIGV4aXRJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKLX0KLS8qKgotICogY29tbW9uIHByb2Nlc3NpbmcgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKLSAqLwotcHJvdGVjdGVkIHZvaWQgZXhpdE1lbWJlcihpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQlTb3VyY2VSZWZFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZVJlZkVsZW1lbnRJbmZvKSB0aGlzLmluZm9TdGFjay5wb3AoKTsKKwlKYXZhRWxlbWVudCBoYW5kbGUgPSAoSmF2YUVsZW1lbnQpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOworCWludFtdIGluaXRpYWxpemVySW5mbyA9IChpbnRbXSkgdGhpcy5pbmZvU3RhY2sucGVlaygpOworCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4oaW5pdGlhbGl6ZXJJbmZvKTsKKwkKKwlJbml0aWFsaXplckVsZW1lbnRJbmZvIGluZm8gPSBlbGVtZW50cy5sZW5ndGggPT0gMCA/IG5ldyBJbml0aWFsaXplckVsZW1lbnRJbmZvKCkgOiBuZXcgSW5pdGlhbGl6ZXJXaXRoQ2hpbGRyZW5JbmZvKGVsZW1lbnRzKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoaW5pdGlhbGl6ZXJJbmZvWzBdKTsKKwlpbmZvLnNldEZsYWdzKGluaXRpYWxpemVySW5mb1sxXSk7CiAJaW5mby5zZXRTb3VyY2VSYW5nZUVuZChkZWNsYXJhdGlvbkVuZCk7Ci0Jc2V0Q2hpbGRyZW4oaW5mbyk7CisKKwl0aGlzLm5ld0VsZW1lbnRzLnB1dChoYW5kbGUsIGluZm8pOworCQogCXRoaXMuaGFuZGxlU3RhY2sucG9wKCk7CisJdGhpcy5pbmZvU3RhY2sucG9wKCk7CiB9CiAvKioKICAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKICAqLwotcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIGludCBkZWZhdWx0VmFsdWVTdGFydCwgaW50IGRlZmF1bHRWYWx1ZUVuZCkgewotCVNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlTWV0aG9kRWxlbWVudEluZm8pIHRoaXMuaW5mb1N0YWNrLnBvcCgpOworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisJU291cmNlTWV0aG9kIGhhbmRsZSA9IChTb3VyY2VNZXRob2QpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOworCU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IChNZXRob2RJbmZvKSB0aGlzLmluZm9TdGFjay5wZWVrKCk7CisJCisJU291cmNlTWV0aG9kRWxlbWVudEluZm8gaW5mbyA9IGNyZWF0ZU1ldGhvZEluZm8obWV0aG9kSW5mbywgaGFuZGxlKTsKIAlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKLQlzZXRDaGlsZHJlbihpbmZvKTsKIAkKIAkvLyByZW1lbWJlciBkZWZhdWx0IHZhbHVlIG9mIGFubm90YXRpb24gbWV0aG9kCi0JaWYgKGluZm8uaXNBbm5vdGF0aW9uTWV0aG9kKCkpIHsKKwlpZiAoaW5mby5pc0Fubm90YXRpb25NZXRob2QoKSAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogCQlTb3VyY2VBbm5vdGF0aW9uTWV0aG9kSW5mbyBhbm5vdGF0aW9uTWV0aG9kSW5mbyA9IChTb3VyY2VBbm5vdGF0aW9uTWV0aG9kSW5mbykgaW5mbzsKLQkJYW5ub3RhdGlvbk1ldGhvZEluZm8uZGVmYXVsdFZhbHVlU3RhcnQgPSBkZWZhdWx0VmFsdWVTdGFydDsKLQkJYW5ub3RhdGlvbk1ldGhvZEluZm8uZGVmYXVsdFZhbHVlRW5kID0gZGVmYXVsdFZhbHVlRW5kOworCQlhbm5vdGF0aW9uTWV0aG9kSW5mby5kZWZhdWx0VmFsdWVTdGFydCA9IGRlZmF1bHRWYWx1ZS5zb3VyY2VTdGFydDsKKwkJYW5ub3RhdGlvbk1ldGhvZEluZm8uZGVmYXVsdFZhbHVlRW5kID0gZGVmYXVsdFZhbHVlLnNvdXJjZUVuZDsKKwkJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChKYXZhRWxlbWVudCkgdGhpcy5oYW5kbGVTdGFjay5wZWVrKCk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk1lbWJlclZhbHVlUGFpciBkZWZhdWx0TWVtYmVyVmFsdWVQYWlyID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk1lbWJlclZhbHVlUGFpcihlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQlkZWZhdWx0TWVtYmVyVmFsdWVQYWlyLnZhbHVlID0gZ2V0TWVtYmVyVmFsdWUoZGVmYXVsdE1lbWJlclZhbHVlUGFpciwgZGVmYXVsdFZhbHVlKTsKKwkJYW5ub3RhdGlvbk1ldGhvZEluZm8uZGVmYXVsdFZhbHVlID0gZGVmYXVsdE1lbWJlclZhbHVlUGFpcjsKIAl9CisJCiAJdGhpcy5oYW5kbGVTdGFjay5wb3AoKTsKKwl0aGlzLmluZm9TdGFjay5wb3AoKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgdm9pZCBleGl0VHlwZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQotCWV4aXRNZW1iZXIoZGVjbGFyYXRpb25FbmQpOworCVNvdXJjZVR5cGUgaGFuZGxlID0gKFNvdXJjZVR5cGUpIHRoaXMuaGFuZGxlU3RhY2sucGVlaygpOworCVR5cGVJbmZvIHR5cGVJbmZvID0gKFR5cGVJbmZvKSB0aGlzLmluZm9TdGFjay5wZWVrKCk7CisJU291cmNlVHlwZUVsZW1lbnRJbmZvIGluZm8gPSBjcmVhdGVUeXBlSW5mbyh0eXBlSW5mbywgaGFuZGxlKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwlpbmZvLmNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4odHlwZUluZm8pOworCQorCXRoaXMuaGFuZGxlU3RhY2sucG9wKCk7CisJdGhpcy5pbmZvU3RhY2sucG9wKCk7CiB9CiAvKioKICAqIFJlc29sdmVzIGR1cGxpY2F0ZSBoYW5kbGVzIGJ5IGluY3JlbWVudGluZyB0aGUgb2NjdXJyZW5jZSBjb3VudAotICogb2YgdGhlIGhhbmRsZSBiZWluZyBjcmVhdGVkIHVudGlsIHRoZXJlIGlzIG5vIGNvbmZsaWN0LgorICogb2YgdGhlIGhhbmRsZSBiZWluZyBjcmVhdGVkLgogICovCiBwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRHVwbGljYXRlcyhTb3VyY2VSZWZFbGVtZW50IGhhbmRsZSkgewotCXdoaWxlICh0aGlzLm5ld0VsZW1lbnRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJaGFuZGxlLm9jY3VycmVuY2VDb3VudCsrOworCWludCBvY2N1cmVuY2VDb3VudCA9IHRoaXMub2NjdXJlbmNlQ291bnRzLmdldChoYW5kbGUpOworCWlmIChvY2N1cmVuY2VDb3VudCA9PSAtMSkKKwkJdGhpcy5vY2N1cmVuY2VDb3VudHMucHV0KGhhbmRsZSwgMSk7CisJZWxzZSB7CisJCXRoaXMub2NjdXJlbmNlQ291bnRzLnB1dChoYW5kbGUsICsrb2NjdXJlbmNlQ291bnQpOworCQloYW5kbGUub2NjdXJyZW5jZUNvdW50ID0gb2NjdXJlbmNlQ291bnQ7CiAJfQogfQotcHJpdmF0ZSB2b2lkIHNldENoaWxkcmVuKEphdmFFbGVtZW50SW5mbyBpbmZvKSB7Citwcm90ZWN0ZWQgSU1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgeworCVN0cmluZyBtZW1iZXJOYW1lID0gbmV3IFN0cmluZyhtZW1iZXJWYWx1ZVBhaXIubmFtZSk7CisJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTWVtYmVyVmFsdWVQYWlyIHJlc3VsdCA9IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5NZW1iZXJWYWx1ZVBhaXIobWVtYmVyTmFtZSk7CisJcmVzdWx0LnZhbHVlID0gZ2V0TWVtYmVyVmFsdWUocmVzdWx0LCBtZW1iZXJWYWx1ZVBhaXIudmFsdWUpOworCXJldHVybiByZXN1bHQ7Cit9Citwcm90ZWN0ZWQgSU1lbWJlclZhbHVlUGFpcltdIGdldE1lbWJlclZhbHVlUGFpcnMoTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycykgeworCWludCBtZW1iZXJzTGVuZ3RoID0gbWVtYmVyVmFsdWVQYWlycy5sZW5ndGg7CisJSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlcnMgPSBuZXcgSU1lbWJlclZhbHVlUGFpclttZW1iZXJzTGVuZ3RoXTsKKwlmb3IgKGludCBqID0gMDsgaiA8IG1lbWJlcnNMZW5ndGg7IGorKykgeworCQltZW1iZXJzW2pdID0gZ2V0TWVtYmVyVmFsdWVQYWlyKG1lbWJlclZhbHVlUGFpcnNbal0pOworCX0KKwlyZXR1cm4gbWVtYmVyczsKK30KK3ByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGluZm8pIHsKIAlBcnJheUxpc3QgY2hpbGRyZW5MaXN0ID0gKEFycmF5TGlzdCkgdGhpcy5jaGlsZHJlbi5nZXQoaW5mbyk7CiAJaWYgKGNoaWxkcmVuTGlzdCAhPSBudWxsKSB7Ci0JCWludCBsZW5ndGggPSBjaGlsZHJlbkxpc3Quc2l6ZSgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoXTsKLQkJY2hpbGRyZW5MaXN0LnRvQXJyYXkoZWxlbWVudHMpOwotCQlpbmZvLmNoaWxkcmVuID0gZWxlbWVudHM7CisJCXJldHVybiAoSUphdmFFbGVtZW50W10pIGNoaWxkcmVuTGlzdC50b0FycmF5KG5ldyBJSmF2YUVsZW1lbnRbY2hpbGRyZW5MaXN0LnNpemUoKV0pOworCX0KKwlyZXR1cm4gSmF2YUVsZW1lbnQuTk9fRUxFTUVOVFM7Cit9CisvKgorICogQ3JlYXRlcyB0aGUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiwgYW5kIHNldHMgdGhlIHZhbHVlS2luZCBvbiB0aGUgZ2l2ZW4gbWVtYmVyVmFsdWVQYWlyCisgKi8KK3Byb3RlY3RlZCBPYmplY3QgZ2V0TWVtYmVyVmFsdWUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMaXRlcmFsKSB7CisJCSgoTGl0ZXJhbCkgZXhwcmVzc2lvbikuY29tcHV0ZUNvbnN0YW50KCk7CisJCXJldHVybiBVdGlsLmdldEFubm90YXRpb25NZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZVBhaXIsIGV4cHJlc3Npb24uY29uc3RhbnQpOworCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbikgeworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb24gYW5ub3RhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb24pIGV4cHJlc3Npb247CisJCU9iamVjdCBoYW5kbGUgPSBhY2NlcHRBbm5vdGF0aW9uKGFubm90YXRpb24sIG51bGwsIChKYXZhRWxlbWVudCkgdGhpcy5oYW5kbGVTdGFjay5wZWVrKCkpOworCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0FOTk9UQVRJT047CisJCXJldHVybiBoYW5kbGU7CisJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NMaXRlcmFsQWNjZXNzKSB7CisJCUNsYXNzTGl0ZXJhbEFjY2VzcyBjbGFzc0xpdGVyYWwgPSAoQ2xhc3NMaXRlcmFsQWNjZXNzKSBleHByZXNzaW9uOworCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjbGFzc0xpdGVyYWwudHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpOworCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0NMQVNTOworCQlyZXR1cm4gbmV3IFN0cmluZyhuYW1lKTsKKwl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKCgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgZXhwcmVzc2lvbikudG9rZW5zLCAnLicpOworCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1FVQUxJRklFRF9OQU1FOworCQlyZXR1cm4gbmV3IFN0cmluZyhxdWFsaWZpZWROYW1lKTsKKwl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCWNoYXJbXSBzaW1wbGVOYW1lID0gKChTaW5nbGVOYW1lUmVmZXJlbmNlKSBleHByZXNzaW9uKS50b2tlbjsKKwkJaWYgKHNpbXBsZU5hbWUgPT0gUmVjb3ZlcnlTY2FubmVyLkZBS0VfSURFTlRJRklFUikgeworCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19VTktOT1dOOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19TSU1QTEVfTkFNRTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcoc2ltcGxlTmFtZSk7CisJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikgeworCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gLTE7IC8vIG1vZGlmaWVkIGJlbG93IGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdldE1lbWJlclZhbHVlKC4uLikKKwkJRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gKChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uKS5leHByZXNzaW9uczsKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb25zID09IG51bGwgPyAwIDogZXhwcmVzc2lvbnMubGVuZ3RoOworCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWludCBwcmV2aW91c1ZhbHVlS2luZCA9IG1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQ7CisJCQlPYmplY3QgdmFsdWUgPSBnZXRNZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZVBhaXIsIGV4cHJlc3Npb25zW2ldKTsKKwkJCWlmIChwcmV2aW91c1ZhbHVlS2luZCAhPSAtMSAmJiBtZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kICE9IHByZXZpb3VzVmFsdWVLaW5kKSB7CisJCQkJLy8gdmFsdWVzIGFyZSBoZXRlcm9nZW5lb3VzLCB2YWx1ZSBraW5kIGlzIHRodXMgdW5rbm93bgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfVU5LTk9XTjsKKwkJCX0KKwkJCXZhbHVlc1tpXSA9IHZhbHVlOworCQl9CisJCWlmIChtZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID09IC0xKQorCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19VTktOT1dOOworCQlyZXR1cm4gdmFsdWVzOworCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFVuYXJ5RXhwcmVzc2lvbikgewkJCS8vIHRvIGRlYWwgd2l0aCBuZWdhdGl2ZSBudW1lcmFscyAoc2VlIGJ1ZyAtIDI0ODMxMikKKwkJVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbiA9IChVbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisJCWlmICgodW5hcnlFeHByZXNzaW9uLmJpdHMgJiBBU1ROb2RlLk9wZXJhdG9yTUFTSykgPj4gQVNUTm9kZS5PcGVyYXRvclNISUZUID09IE9wZXJhdG9ySWRzLk1JTlVTKSB7CisJCQlpZiAodW5hcnlFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBMaXRlcmFsKSB7CisJCQkJTGl0ZXJhbCBzdWJFeHByZXNzaW9uID0gKExpdGVyYWwpIHVuYXJ5RXhwcmVzc2lvbi5leHByZXNzaW9uOworCQkJCXN1YkV4cHJlc3Npb24uY29tcHV0ZUNvbnN0YW50KCk7CisJCQkJcmV0dXJuIFV0aWwuZ2V0TmVnYXRpdmVBbm5vdGF0aW9uTWVtYmVyVmFsdWUobWVtYmVyVmFsdWVQYWlyLCBzdWJFeHByZXNzaW9uLmNvbnN0YW50KTsKKwkJCX0KKwkJfQorCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfVU5LTk9XTjsKKwkJcmV0dXJuIG51bGw7CiAJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBkMTUyNGViLi4yN2FhMzA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01MywxNSArNTMsMTUgQEAKICAqIAl0aGUgY3JlYXRpb24gb3BlcmF0aW9uIGZvciB0aGF0IGVsZW1lbnQgdHlwZS4KICAqCiAgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gY29weSBhbmQgcmVuYW1lIGVsZW1lbnRzIHdpdGhpbgotICogICAgdGhlIHNhbWUgY29udGFpbmVyLiAKKyAqICAgIHRoZSBzYW1lIGNvbnRhaW5lci4KICAqCi0gKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gb25seSBjb3BpZXMgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiBjb21waWxhdGlvbiB1bml0cy4gCisgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gb25seSBjb3BpZXMgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiBjb21waWxhdGlvbiB1bml0cy4KICAqIDwvdWw+CiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ29weUVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgTXVsdGlPcGVyYXRpb24gaW1wbGVtZW50cyBTdWZmaXhDb25zdGFudHMgewogCi0JCisKIAlwcml2YXRlIE1hcCBzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKIC8qKgogICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCBjb3B5IHRoZSBnaXZlbiBlbGVtZW50cyB0byB0aGUKQEAgLTg0LDcgKzg0LDcgQEAKICAqIGZvciBwcm9ncmVzcyBtb25pdG9yaW5nLgogICovCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKLQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NvcHlFbGVtZW50UHJvZ3Jlc3M7IAorCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY29weUVsZW1lbnRQcm9ncmVzczsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgbmVzdGVkIG9wZXJhdGlvbiB0byB1c2UgZm9yIHByb2Nlc3NpbmcgdGhpcyBlbGVtZW50CkBAIC0xODgsMTIgKzE4OCwxMiBAQAogCX0KIAogCWlmIChjcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiAmJiBpc01vdmUoKSAmJiAhaXNSZW5hbWluZ01haW5UeXBlKGVsZW1lbnQsIGRlc3RpbmF0aW9uKSkgewotCQlEZWxldGVFbGVtZW50c09wZXJhdGlvbiBkZWxldGVPcCA9IG5ldyBEZWxldGVFbGVtZW50c09wZXJhdGlvbihuZXcgSUphdmFFbGVtZW50W10geyBlbGVtZW50IH0sIHRoaXMuZm9yY2UpOworCQlKYXZhTW9kZWxPcGVyYXRpb24gZGVsZXRlT3AgPSBuZXcgRGVsZXRlRWxlbWVudHNPcGVyYXRpb24obmV3IElKYXZhRWxlbWVudFtdIHsgZWxlbWVudCB9LCB0aGlzLmZvcmNlKTsKIAkJZXhlY3V0ZU5lc3RlZE9wZXJhdGlvbihkZWxldGVPcCwgMSk7CiAJfQogfQogLyoqCi0gKiBSZXR1cm5zIHRoZSBhbmNob3IgdXNlZCBmb3IgcG9zaXRpb25pbmcgaW4gdGhlIGRlc3RpbmF0aW9uIGZvciAKKyAqIFJldHVybnMgdGhlIGFuY2hvciB1c2VkIGZvciBwb3NpdGlvbmluZyBpbiB0aGUgZGVzdGluYXRpb24gZm9yCiAgKiB0aGUgZWxlbWVudCBiZWluZyByZW5hbWVkLiBGb3IgcmVuYW1pbmcsIGlmIG5vIGFuY2hvciBoYXMKICAqIGV4cGxpY2l0bHkgYmVlbiBwcm92aWRlZCwgdGhlIGVsZW1lbnQgaXMgYW5jaG9yZWQgaW4gdGhlIHNhbWUgcG9zaXRpb24uCiAgKi8KQEAgLTI0Miw3ICsyNDIsNyBAQAogICoJPGxpPklOVkFMSURfREVTVElOQVRJT04gLSBUaGUgZGVzdGluYXRpb24gcGFyZW50IHNwZWNpZmllZCBmb3IgPGNvZGU+ZWxlbWVudDwvY29kZT4KICAqCQlpcyBvZiBhbiBpbmNvbXBhdGlibGUgdHlwZS4gVGhlIGRlc3RpbmF0aW9uIGZvciBhIHBhY2thZ2UgZGVjbGFyYXRpb24gb3IgaW1wb3J0IGRlY2xhcmF0aW9uIG11c3QKICAqCQliZSBhIGNvbXBpbGF0aW9uIHVuaXQ7IHRoZSBkZXN0aW5hdGlvbiBmb3IgYSB0eXBlIG11c3QgYmUgYSB0eXBlIG9yIGNvbXBpbGF0aW9uCi0gKgkJdW5pdDsgdGhlIGRlc3RpbmFpb24gZm9yIGFueSB0eXBlIG1lbWJlciAob3RoZXIgdGhhbiBhIHR5cGUpIG11c3QgYmUgYSB0eXBlLiBXaGVuCisgKgkJdW5pdDsgdGhlIGRlc3RpbmF0aW9uIGZvciBhbnkgdHlwZSBtZW1iZXIgKG90aGVyIHRoYW4gYSB0eXBlKSBtdXN0IGJlIGEgdHlwZS4gV2hlbgogICoJCXRoaXMgZXJyb3Igb2NjdXJzLCB0aGUgZWxlbWVudCBwcm92aWRlZCBpbiB0aGUgb3BlcmF0aW9uIHN0YXR1cyBpcyB0aGUgPGNvZGU+ZWxlbWVudDwvY29kZT4uCiAgKgk8bGk+SU5WQUxJRF9OQU1FIC0gdGhlIG5ldyBuYW1lIGZvciA8Y29kZT5lbGVtZW50PC9jb2RlPiBkb2VzIG5vdCBoYXZlIHZhbGlkIHN5bnRheC4KICAqICAgICAgSW4gdGhpcyBjYXNlIHRoZSBlbGVtZW50IGFuZCBuYW1lIGFyZSBwcm92aWRlZCBpbiB0aGUgc3RhdHVzLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEKaW5kZXggY2ZlYzliYS4uMTg1YTMwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CkBAIC0yOSw3ICsyOCw3IEBACiAJCWludCB1cGRhdGVSZXNvdXJjZUZsYWdzLAogCQlpbnQgdXBkYXRlTW9kZWxGbGFncywKIAkJSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcpIHsKLQkJCQorCiAJCXN1cGVyKHJvb3QpOwogCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAJCXRoaXMudXBkYXRlUmVzb3VyY2VGbGFncyA9IHVwZGF0ZVJlc291cmNlRmxhZ3M7CkBAIC0zNyw4ICszNiw4IEBACiAJCXRoaXMuc2libGluZyA9IHNpYmxpbmc7CiAJfQogCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpdGhpcy5nZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CiAJCUlDbGFzc3BhdGhFbnRyeSByb290RW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CiAJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCkBAIC00Niw3ICs0NSw3IEBACiAJCWlmICghcm9vdC5pc0V4dGVybmFsKCkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk5PX1JFU09VUkNFX01PRElGSUNBVElPTikgPT0gMCkgewogCQkJY29weVJlc291cmNlKHJvb3QsIHJvb3RFbnRyeSwgd29ya3NwYWNlUm9vdCk7CiAJCX0KLQkJCisKIAkJLy8gdXBkYXRlIGNsYXNzcGF0aCBpZiBuZWVkZWQKIAkJaWYgKCh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSCkgIT0gMCkgewogCQkJYWRkRW50cnlUb0NsYXNzcGF0aChyb290RW50cnksIHdvcmtzcGFjZVJvb3QpOwpAQCAtNTgsMTcgKzU3LDE3IEBACiAJCWZpbmFsIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpcm9vdEVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7Ci0JCUlSZXNvdXJjZSByb290UmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCUlSZXNvdXJjZSByb290UmVzb3VyY2UgPSAoKEphdmFFbGVtZW50KSByb290KS5yZXNvdXJjZSgpOwogCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkgfHwgZXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgewogCQkJdHJ5IHsKIAkJCQlJUmVzb3VyY2UgZGVzdFJlczsKIAkJCQlpZiAoKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDApIHsKIAkJCQkJaWYgKHJvb3RFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHRoaXMuZGVzdGluYXRpb24pKSByZXR1cm47CiAJCQkJCWlmICgoZGVzdFJlcyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcih0aGlzLmRlc3RpbmF0aW9uKSkgIT0gbnVsbCkgewotCQkJCQkJZGVzdFJlcy5kZWxldGUodGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJZGVzdFJlcy5kZWxldGUodGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJcm9vdFJlc291cmNlLmNvcHkodGhpcy5kZXN0aW5hdGlvbiwgdGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCXJvb3RSZXNvdXJjZS5jb3B5KHRoaXMuZGVzdGluYXRpb24sIHRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgdGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCX0KQEAgLTg3LDMzICs4NiwzMyBAQAogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCS8vIGZvbGRlciBjb250YWluaW5nIG5lc3RlZCBzb3VyY2UgZm9sZGVyCiAJCQkJCQkJCUlGb2xkZXIgZm9sZGVyID0gZGVzdEZvbGRlci5nZXRGb2xkZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVNlZ21lbnRDb3VudCkpOwotCQkJCQkJCQlpZiAoKHVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCisJCQkJCQkJCWlmICgoQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAogCQkJCQkJCQkJCSYmIGZvbGRlci5leGlzdHMoKSkgewogCQkJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQkJCX0KLQkJCQkJCQkJZm9sZGVyLmNyZWF0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCB0cnVlLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJCQlmb2xkZXIuY3JlYXRlKENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgdHJ1ZSwgQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCS8vIHN1YnRyZWUgZG9lc24ndCBjb250YWluIGFueSBuZXN0ZWQgc291cmNlIGZvbGRlcnMKLQkJCQkJCQlJUGF0aCBkZXN0UGF0aCA9IGRlc3RpbmF0aW9uLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlU2VnbWVudENvdW50KSk7CisJCQkJCQkJSVBhdGggZGVzdFBhdGggPSBDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLmRlc3RpbmF0aW9uLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlU2VnbWVudENvdW50KSk7CiAJCQkJCQkJSVJlc291cmNlIGRlc3RSZXM7Ci0JCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJCWlmICgoQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAogCQkJCQkJCQkJJiYgKGRlc3RSZXMgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZGVzdFBhdGgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWRlc3RSZXMuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQkJCWRlc3RSZXMuZGVsZXRlKENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCQkJCX0KLQkJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5jb3B5KGRlc3RQYXRoLCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmNvcHkoZGVzdFBhdGgsIENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKIAkJCQkJCUlQYXRoIHBhdGggPSBwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKTsKLQkJCQkJCUlQYXRoIGRlc3RQYXRoID0gZGVzdGluYXRpb24uYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKKwkJCQkJCUlQYXRoIGRlc3RQYXRoID0gQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5kZXN0aW5hdGlvbi5hcHBlbmQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVNlZ21lbnRDb3VudCkpOwogCQkJCQkJSVJlc291cmNlIGRlc3RSZXM7Ci0JCQkJCQlpZiAoKHVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCisJCQkJCQlpZiAoKENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDAKIAkJCQkJCQkJJiYgKGRlc3RSZXMgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZGVzdFBhdGgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJZGVzdFJlcy5kZWxldGUodXBkYXRlUmVzb3VyY2VGbGFncywgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQkJCQlkZXN0UmVzLmRlbGV0ZShDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJCX0KLQkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmNvcHkoZGVzdFBhdGgsIHVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5jb3B5KGRlc3RQYXRoLCBDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJfQogCQkJCX0KQEAgLTEyNCwxNiArMTIzLDE2IEBACiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCX0KIAkJfQotCQlzZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsKIAl9CiAJcHJvdGVjdGVkIHZvaWQgYWRkRW50cnlUb0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5LCBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJSVByb2plY3QgZGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QodGhpcy5kZXN0aW5hdGlvbi5zZWdtZW50KDApKTsKIAkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGRlc3RQcm9qZWN0KTsKIAkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0galByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CiAJCWludCBsZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOwogCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGg7Ci0JCQorCiAJCS8vIGNhc2Ugb2YgZXhpc3RpbmcgZW50cnkgYW5kIFJFUExBQ0Ugd2FzIHNwZWNpZmllZAogCQlpZiAoKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDApIHsKIAkJCS8vIGZpbmQgZXhpc3RpbmcgZW50cnkKQEAgLTE0MiwxMiArMTQxLDEyIEBACiAJCQkJCW5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGVuZ3RoXTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgbGVuZ3RoKTsKIAkJCQkJbmV3Q2xhc3NwYXRoW2ldID0gY29weShyb290RW50cnkpOwotCQkJCQlqUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQlqUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9Ci0JCX0gCi0JCQorCQl9CisKIAkJLy8gb3RoZXIgY2FzZXMKIAkJaW50IHBvc2l0aW9uOwogCQlpZiAodGhpcy5zaWJsaW5nID09IG51bGwpIHsKQEAgLTE3NSw3ICsxNzQsNyBAQAogCQl9CiAJCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IGNvcHkocm9vdEVudHJ5KTsKIAkJbmV3Q2xhc3NwYXRoW3Bvc2l0aW9uXSA9IG5ld0VudHJ5OwotCQlqUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBwcm9ncmVzc01vbml0b3IpOworCQlqUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJfQogCS8qCiAJICogQ29waWVzIHRoZSBnaXZlbiBjbGFzc3BhdGggZW50cnkgcmVwbGFjaW5nIGl0cyBwYXRoIHdpdGggdGhlIGRlc3RpbmF0aW9uIHBhdGgKQEAgLTE4OCw3ICsxODcsNyBAQAogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CiAJCQkJdHJ5IHsKIAkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSh0aGlzLmRlc3RpbmF0aW9uLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQl9IGNhdGNoIChDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgewogCQkJCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihzdGF0dXMpOwogCQkJCX0KQEAgLTE5OSwxMiArMTk4LDEyIEBACiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6CiAJCQkJdHJ5IHsKIAkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkoZW50cnkuZ2V0UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQl9IGNhdGNoIChDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgewogCQkJCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihzdGF0dXMpOwogCQkJCX0KIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcy5nZXRFbGVtZW50VG9Qcm9jZXNzKCkpKTsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCBnZXRFbGVtZW50VG9Qcm9jZXNzKCkpKTsKIAkJfQogCX0KIAlwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CkBAIC0yMTIsMTIgKzIxMSwxMiBAQAogCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KWdldEVsZW1lbnRUb1Byb2Nlc3MoKTsKIAkJaWYgKHJvb3QgPT0gbnVsbCB8fCAhcm9vdC5leGlzdHMoKSkgewogCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCByb290KTsKIAkJfQogCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZ2V0UmVzb3VyY2UoKTsKKwkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5yZXNvdXJjZSgpOwogCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CiAJCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgewogCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9SRVNPVVJDRSwgcm9vdCk7CkBAIC0yNDgsOCArMjQ3LDggQEAKIAkJCQkJfQogCQkJCQlpZiAoZm91bmRFeGlzdGluZ0VudHJ5ICYmICh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSA9PSAwKSB7CiAJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKLQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBuZXcgU3RyaW5nW10ge3RoaXMuZGVzdGluYXRpb24udG9TdHJpbmcoKX0pKTsgCisJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwKKwkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBuZXcgU3RyaW5nW10ge3RoaXMuZGVzdGluYXRpb24udG9TdHJpbmcoKX0pKTsKIAkJCQkJfQogCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggNmVjYTQ3NC4uMjkxMzc4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDExICsxNiwxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5KYXZhZG9jOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwpAQCAtMjksOCArMzMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlN1ZmZpeENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7CiAKIC8qKgpAQCAtNTAsNyArNTIsNyBAQAogICogICAgc2FtZSB0eXBlIG9mIGNvbnRhaW5lci4KICAqCiAgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gY29weSBhbmQgcmVuYW1lIGVsZW1lbnRzIHdpdGhpbgotICogICAgdGhlIHNhbWUgY29udGFpbmVyLiAKKyAqICAgIHRoZSBzYW1lIGNvbnRhaW5lci4KICAqCiAgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gb25seSBjb3BpZXMgY29tcGlsYXRpb24gdW5pdHMgYW5kIHBhY2thZ2UgZnJhZ21lbnRzLgogICogICAgSXQgZG9lcyBub3QgY29weSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIC0gYSBwbGF0Zm9ybSBvcGVyYXRpb24gbXVzdCBiZSB1c2VkIGZvciB0aGF0LgpAQCAtNjMsNyArNjUsNyBAQAogCSAqLwogCXByb3RlY3RlZCBBcnJheUxpc3QgY3JlYXRlZEVsZW1lbnRzOwogCS8qKgotCSAqIFRhYmxlIHNwZWNpZnlpbmcgZGVsdGFzIGZvciBlbGVtZW50cyBiZWluZyAKKwkgKiBUYWJsZSBzcGVjaWZ5aW5nIGRlbHRhcyBmb3IgZWxlbWVudHMgYmVpbmcKIAkgKiBjb3BpZWQvbW92ZWQvcmVuYW1lZC4gS2V5ZWQgYnkgZWxlbWVudHMnIHByb2plY3QocyksIGFuZAogCSAqIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgZGVsdGFzLgogCSAqLwpAQCAtNzUsMTMgKzc3LDYgQEAKIAlwcm90ZWN0ZWQgQVNUUGFyc2VyIHBhcnNlcjsKIAkvKioKIAkgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKLQkgKiBnaXZlbiBjb250YWluZXIuCi0JICovCi0JcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50IGRlc3RDb250YWluZXIsIGJvb2xlYW4gZm9yY2UpIHsKLQkJdGhpcyhyZXNvdXJjZXNUb0NvcHksIG5ldyBJSmF2YUVsZW1lbnRbXXtkZXN0Q29udGFpbmVyfSwgZm9yY2UpOwotCX0KLQkvKioKLQkgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKIAkgKiBnaXZlbiBjb250YWluZXJzLiAgVGhlIHJlc291cmNlcyBhbmQgZGVzdGluYXRpb24gY29udGFpbmVycyBtdXN0IGJlIGluCiAJICogdGhlIGNvcnJlY3Qgb3JkZXIuIElmIHRoZXJlIGlzID4gMSBkZXN0aW5hdGlvbiwgdGhlIG51bWJlciBvZiBkZXN0aW5hdGlvbnMKIAkgKiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGJlaW5nIGNvcGllZC9tb3ZlZC4KQEAgLTkxLDcgKzg2LDcgQEAKIAkJaW5pdGlhbGl6ZUFTVFBhcnNlcigpOwogCX0KIAlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFTVFBhcnNlcigpIHsKLQkJdGhpcy5wYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKKwkJdGhpcy5wYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFM0KTsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgPGNvZGU+c291cmNlPC9jb2RlPiB3aGljaCBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCkBAIC0xMDgsNyArMTAzLDcgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogCQkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07CiAJCQlpZiAoY2hpbGQuZ2V0RWxlbWVudFR5cGUoKSA9PSBjaGlsZE9mSW50ZXJlc3QpIHsKLQkJCQljb3JyZWN0S2luZENoaWxkcmVuLmFkZChjaGlsZC5nZXRSZXNvdXJjZSgpKTsKKwkJCQljb3JyZWN0S2luZENoaWxkcmVuLmFkZCgoKEphdmFFbGVtZW50KSBjaGlsZCkucmVzb3VyY2UoKSk7CiAJCQl9CiAJCX0KIAkJLy8gR2F0aGVyIG5vbi1qYXZhIHJlc291cmNlcwpAQCAtMTIxLDcgKzExNiw3IEBACiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBub25KYXZhUmVzb3VyY2VzLmxlbmd0aCwgaW5kZXggPSAwOyBpIDwgbWF4OyBpKyspewogCQkJaWYgKG5vbkphdmFSZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIGFjdHVhbE5vbkphdmFSZXNvdXJjZXNbaW5kZXgrK10gPSAoSVJlc291cmNlKW5vbkphdmFSZXNvdXJjZXNbaV07CiAJCX0KLQkJCisKIAkJaWYgKGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50ICE9IDApIHsKIAkJCWludCBjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSA9IGNvcnJlY3RLaW5kQ2hpbGRyZW4uc2l6ZSgpOwogCQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVtjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSArIGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50XTsKQEAgLTE0MCw3ICsxMzUsNyBAQAogCSAqLwogCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVOZWVkZWRQYWNrYWdlRnJhZ21lbnRzKElDb250YWluZXIgc291cmNlRm9sZGVyLCBQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZ1tdIG5ld0ZyYWdOYW1lLCBib29sZWFuIG1vdmVGb2xkZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHlQYWNrYWdlRnJhZ21lbnQgPSBmYWxzZTsKLQkJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRSZXNvdXJjZSgpOworCQlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LnJlc291cmNlKCk7CiAJCUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhID0gbnVsbDsKIAkJU3RyaW5nW10gc2lkZUVmZmVjdFBhY2thZ2VOYW1lID0gbnVsbDsKIAkJY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMgPSByb290LmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKQEAgLTE1Miw3ICsxNDcsNyBAQAogCQkJaWYgKHN1YkZvbGRlciA9PSBudWxsKSB7CiAJCQkJLy8gY3JlYXRlIGRlZXBlc3QgZm9sZGVyIG9ubHkgaWYgbm90IGEgbW92ZSAoZm9sZGVyIHdpbGwgYmUgbW92ZWQgaW4gcHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlKQogCQkJCWlmICghKG1vdmVGb2xkZXIgJiYgaSA9PSBuZXdGcmFnTmFtZS5sZW5ndGgtMSkpIHsKLQkJCQkJY3JlYXRlRm9sZGVyKHBhcmVudEZvbGRlciwgc3ViRm9sZGVyTmFtZSwgZm9yY2UpOworCQkJCQljcmVhdGVGb2xkZXIocGFyZW50Rm9sZGVyLCBzdWJGb2xkZXJOYW1lLCB0aGlzLmZvcmNlKTsKIAkJCQl9CiAJCQkJcGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChzdWJGb2xkZXJOYW1lKSk7CiAJCQkJc291cmNlRm9sZGVyID0gc291cmNlRm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChzdWJGb2xkZXJOYW1lKSk7CkBAIC0xNjEsMzAgKzE1NiwzMCBAQAogCQkJCX0KIAkJCQlJUGFja2FnZUZyYWdtZW50IHNpZGVFZmZlY3RQYWNrYWdlID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoc2lkZUVmZmVjdFBhY2thZ2VOYW1lKTsKIAkJCQlpZiAoaSA8IG5ld0ZyYWdOYW1lLmxlbmd0aCAtIDEgLy8gYWxsIGJ1dCB0aGUgbGFzdCBvbmUgYXJlIHNpZGUgZWZmZWN0IHBhY2thZ2VzCi0JCQkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKHBhcmVudEZvbGRlciwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSkgeyAKKwkJCQkJCSYmICFVdGlsLmlzRXhjbHVkZWQocGFyZW50Rm9sZGVyLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMpKSB7CiAJCQkJCWlmIChwcm9qZWN0RGVsdGEgPT0gbnVsbCkgewogCQkJCQkJcHJvamVjdERlbHRhID0gZ2V0RGVsdGFGb3Iocm9vdC5nZXRKYXZhUHJvamVjdCgpKTsKIAkJCQkJfQogCQkJCQlwcm9qZWN0RGVsdGEuYWRkZWQoc2lkZUVmZmVjdFBhY2thZ2UpOwogCQkJCX0KLQkJCQljcmVhdGVkRWxlbWVudHMuYWRkKHNpZGVFZmZlY3RQYWNrYWdlKTsKKwkJCQl0aGlzLmNyZWF0ZWRFbGVtZW50cy5hZGQoc2lkZUVmZmVjdFBhY2thZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQlwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgc3ViRm9sZGVyOwogCQkJfQogCQl9CiAJCXJldHVybiBjb250YWluc1JlYWRPbmx5UGFja2FnZUZyYWdtZW50OwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+IGZvciA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4sCiAJICogY3JlYXRpbmcgaXQgYW5kIHB1dHRpbmcgaXQgaW4gPGNvZGU+ZkRlbHRhc1BlclByb2plY3Q8L2NvZGU+IGlmCiAJICogaXQgZG9lcyBub3QgZXhpc3QgeWV0LgogCSAqLwogCXByaXZhdGUgSmF2YUVsZW1lbnREZWx0YSBnZXREZWx0YUZvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IChKYXZhRWxlbWVudERlbHRhKSBkZWx0YXNQZXJQcm9qZWN0LmdldChqYXZhUHJvamVjdCk7CisJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSAoSmF2YUVsZW1lbnREZWx0YSkgdGhpcy5kZWx0YXNQZXJQcm9qZWN0LmdldChqYXZhUHJvamVjdCk7CiAJCWlmIChkZWx0YSA9PSBudWxsKSB7CiAJCQlkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGphdmFQcm9qZWN0KTsKLQkJCWRlbHRhc1BlclByb2plY3QucHV0KGphdmFQcm9qZWN0LCBkZWx0YSk7CisJCQl0aGlzLmRlbHRhc1BlclByb2plY3QucHV0KGphdmFQcm9qZWN0LCBkZWx0YSk7CiAJCX0KIAkJcmV0dXJuIGRlbHRhOwogCX0KQEAgLTE5Miw3ICsxODcsNzcgQEAKIAkgKiBAc2VlIE11bHRpT3BlcmF0aW9uCiAJICovCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY29weVJlc291cmNlUHJvZ3Jlc3M7IAorCQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NvcHlSZXNvdXJjZVByb2dyZXNzOworCX0KKwlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgeworCQlpZiAodGhpcy5lbGVtZW50c1RvUHJvY2VzcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWludCBsZW5ndGggPSB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSAxKQorCQkJcmV0dXJuIGdldFNjaGVkdWxpbmdSdWxlKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3NbMF0pOworCQlJU2NoZWR1bGluZ1J1bGVbXSBydWxlcyA9IG5ldyBJU2NoZWR1bGluZ1J1bGVbbGVuZ3RoXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBnZXRTY2hlZHVsaW5nUnVsZSh0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzW2ldKTsKKwkJCWlmIChydWxlICE9IG51bGwpIHsKKwkJCQlydWxlc1tpbmRleCsrXSA9IHJ1bGU7CisJCQl9CisJCX0KKwkJaWYgKGluZGV4ICE9IGxlbmd0aCkKKwkJCVN5c3RlbS5hcnJheWNvcHkocnVsZXMsIDAsIHJ1bGVzID0gbmV3IElTY2hlZHVsaW5nUnVsZVtpbmRleF0sIDAsIGluZGV4KTsKKwkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUocnVsZXMpOworCX0KKwlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUlSZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSA9IGdldFJlc291cmNlKGVsZW1lbnQpOworCQlJUmVzb3VyY2UgZGVzdENvbnRhaW5lciA9IGdldFJlc291cmNlKGdldERlc3RpbmF0aW9uUGFyZW50KGVsZW1lbnQpKTsKKwkJaWYgKCEoZGVzdENvbnRhaW5lciBpbnN0YW5jZW9mIElDb250YWluZXIpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgbmV3TmFtZTsKKwkJdHJ5IHsKKwkJCW5ld05hbWUgPSBnZXROZXdOYW1lRm9yKGVsZW1lbnQpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKG5ld05hbWUgPT0gbnVsbCkKKwkJCW5ld05hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7CisJCUlSZXNvdXJjZSBkZXN0UmVzb3VyY2U7CisJCVN0cmluZyBzb3VyY2VFbmNvZGluZyA9IG51bGw7CisJCWlmIChzb3VyY2VSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCWRlc3RSZXNvdXJjZSA9ICgoSUNvbnRhaW5lcikgZGVzdENvbnRhaW5lcikuZ2V0RmlsZShuZXcgUGF0aChuZXdOYW1lKSk7CisJCQl0cnkgeworCQkJCXNvdXJjZUVuY29kaW5nID0gKChJRmlsZSkgc291cmNlUmVzb3VyY2UpLmdldENoYXJzZXQoZmFsc2UpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCS8vIHVzZSBkZWZhdWx0IGVuY29kaW5nCisJCQl9CisJCX0gZWxzZSB7CisJCQlkZXN0UmVzb3VyY2UgPSAoKElDb250YWluZXIpIGRlc3RDb250YWluZXIpLmdldEZvbGRlcihuZXcgUGF0aChuZXdOYW1lKSk7CisJCX0KKwkJSVJlc291cmNlUnVsZUZhY3RvcnkgZmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOworCQlJU2NoZWR1bGluZ1J1bGUgcnVsZTsKKwkJaWYgKGlzTW92ZSgpKSB7CisJCQlydWxlID0gZmFjdG9yeS5tb3ZlUnVsZShzb3VyY2VSZXNvdXJjZSwgZGVzdFJlc291cmNlKTsKKwkJfSBlbHNlIHsKKwkJCXJ1bGUgPSBmYWN0b3J5LmNvcHlSdWxlKHNvdXJjZVJlc291cmNlLCBkZXN0UmVzb3VyY2UpOworCQl9CisJCWlmIChzb3VyY2VFbmNvZGluZyAhPSBudWxsKSB7CisJCQlydWxlID0gbmV3IE11bHRpUnVsZShuZXcgSVNjaGVkdWxpbmdSdWxlW10ge3J1bGUsIGZhY3RvcnkuY2hhcnNldFJ1bGUoZGVzdFJlc291cmNlKX0pOworCQl9CisJCXJldHVybiBydWxlOworCX0KKwlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKKwkJCVN0cmluZyBwa2dOYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOworCQkJaW50IGZpcnN0RG90ID0gcGtnTmFtZS5pbmRleE9mKCcuJyk7CisJCQlpZiAoZmlyc3REb3QgIT0gLTEpIHsKKwkJCQllbGVtZW50ID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRQYXJlbnQoKSkuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUuc3Vic3RyaW5nKDAsIGZpcnN0RG90KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKIAl9CiAJLyoqCiAJICogU2V0cyB0aGUgZGVsdGFzIHRvIHJlZ2lzdGVyIHRoZSBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgb3BlcmF0aW9uCkBAIC0yMDMsNyArMjY4LDcgQEAKIAkgKiAJCQk8bGk+b25lIHJvb3RlZCBpbiB0aGUgc291cmNlIHByb2plY3QKIAkgKgkJCTxsaT5vbmUgcm9vdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0PC91bD48L3VsPgogCSAqIElmIHRoZSBvcGVyYXRpb24gaXMgcm9vdGVkIGluIGEgc2luZ2xlIHByb2plY3QsIHRoZSBkZWx0YSBpcyByb290ZWQgaW4gdGhhdCBwcm9qZWN0Ci0JICogCSAKKwkgKgogCSAqLwogCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEZWx0YXMoSUphdmFFbGVtZW50IHNvdXJjZUVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbkVsZW1lbnQsIGJvb2xlYW4gaXNNb3ZlKSB7CiAJCWlmIChVdGlsLmlzRXhjbHVkZWQoc291cmNlRWxlbWVudCkgfHwgVXRpbC5pc0V4Y2x1ZGVkKGRlc3RpbmF0aW9uRWxlbWVudCkpIHJldHVybjsKQEAgLTIyOCw4ICsyOTMsOCBAQAogCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIFBhY2thZ2VGcmFnbWVudCBkZXN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU3RyaW5nIG5ld0NVTmFtZSA9IGdldE5ld05hbWVGb3Ioc291cmNlKTsKIAkJU3RyaW5nIGRlc3ROYW1lID0gKG5ld0NVTmFtZSAhPSBudWxsKSA/IG5ld0NVTmFtZSA6IHNvdXJjZS5nZXRFbGVtZW50TmFtZSgpOwotCQlBU1RSZXdyaXRlIHJld3JpdGUgPSB1cGRhdGVDb250ZW50KHNvdXJjZSwgZGVzdCwgbmV3Q1VOYW1lKTsgLy8gbnVsbCBpZiB1bmNoYW5nZWQKLQkKKwkJVGV4dEVkaXQgZWRpdCA9IHVwZGF0ZUNvbnRlbnQoc291cmNlLCBkZXN0LCBuZXdDVU5hbWUpOyAvLyBudWxsIGlmIHVuY2hhbmdlZAorCiAJCS8vIFRPRE8gKGZyZWRlcmljKSByZW1vdmUgd2hlbiBidWcgNjc2MDYgd2lsbCBiZSBmaXhlZCAoYnVnIDY3ODIzKQogCQkvLyBzdG9yZSBlbmNvZGluZyAoZml4IGJ1ZyA2Njg5OCkKIAkJSUZpbGUgc291cmNlUmVzb3VyY2UgPSAoSUZpbGUpc291cmNlLmdldFJlc291cmNlKCk7CkBAIC0yNTYsMTkgKzMyMSwxOSBAQAogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkvLyBhYm9ydAogCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCi0JCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGRlc3RGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsgCisJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sCisJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGRlc3RGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQlpbnQgZmxhZ3MgPSB0aGlzLmZvcmNlID8gSVJlc291cmNlLkZPUkNFIDogSVJlc291cmNlLk5PTkU7Ci0JCQkJCWlmICh0aGlzLmlzTW92ZSgpKSB7CisJCQkJCWlmIChpc01vdmUoKSkgewogCQkJCQkJZmxhZ3MgfD0gSVJlc291cmNlLktFRVBfSElTVE9SWTsKIAkJCQkJCXNvdXJjZVJlc291cmNlLm1vdmUoZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKSwgZmxhZ3MsIGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocmV3cml0ZSAhPSBudWxsKSBmbGFncyB8PSBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZOworCQkJCQkJaWYgKGVkaXQgIT0gbnVsbCkgZmxhZ3MgfD0gSVJlc291cmNlLktFRVBfSElTVE9SWTsKIAkJCQkJCXNvdXJjZVJlc291cmNlLmNvcHkoZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKSwgZmxhZ3MsIGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CiAJCQkJCX0KLQkJCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGVzdENVLmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKHNvdXJjZS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpKTsKIAkJCQl9CkBAIC0yNzcsMTIgKzM0MiwxMiBAQAogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCX0KLQkKKwogCQkJLy8gdXBkYXRlIG5ldyByZXNvdXJjZSBjb250ZW50Ci0JCQlpZiAocmV3cml0ZSAhPSBudWxsKXsKKwkJCWlmIChlZGl0ICE9IG51bGwpewogCQkJCWJvb2xlYW4gd2FzUmVhZE9ubHkgPSBkZXN0RmlsZS5pc1JlYWRPbmx5KCk7CiAJCQkJdHJ5IHsKLQkJCQkJc2F2ZUNvbnRlbnQoZGVzdCwgZGVzdE5hbWUsIHJld3JpdGUsIHNvdXJjZUVuY29kaW5nLCBkZXN0RmlsZSk7CisJCQkJCXNhdmVDb250ZW50KGRlc3QsIGRlc3ROYW1lLCBlZGl0LCBzb3VyY2VFbmNvZGluZywgZGVzdEZpbGUpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgdGhyb3cgKEphdmFNb2RlbEV4Y2VwdGlvbikgZTsKIAkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKQEAgLTI5MCw3ICszNTUsNyBAQAogCQkJCQlVdGlsLnNldFJlYWRPbmx5KGRlc3RGaWxlLCB3YXNSZWFkT25seSk7CiAJCQkJfQogCQkJfQotCQkKKwogCQkJLy8gcmVnaXN0ZXIgdGhlIGNvcnJlY3QgY2hhbmdlIGRlbHRhcwogCQkJcHJlcGFyZURlbHRhcyhzb3VyY2UsIGRlc3RDVSwgaXNNb3ZlKCkpOwogCQkJaWYgKG5ld0NVTmFtZSAhPSBudWxsKSB7CkBAIC0zMDIsMTQgKzM2NywxNCBAQAogCQl9IGVsc2UgewogCQkJaWYgKCF0aGlzLmZvcmNlKSB7CiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKAotCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKLQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOyAKKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwKKwkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOwogCQkJfQogCQkJLy8gdXBkYXRlIG5ldyByZXNvdXJjZSBjb250ZW50CiAJCQkvLyBpbiBjYXNlIHdlIGRvIGEgc2F2ZWFzIG9uIHRoZSBzYW1lIHJlc291cmNlIHdlIGhhdmUgdG8gc2ltcGx5IHVwZGF0ZSB0aGUgY29udGVudHMKIAkJCS8vIHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNTEKLQkJCWlmIChyZXdyaXRlICE9IG51bGwpewotCQkJCXNhdmVDb250ZW50KGRlc3QsIGRlc3ROYW1lLCByZXdyaXRlLCBzb3VyY2VFbmNvZGluZywgZGVzdEZpbGUpOworCQkJaWYgKGVkaXQgIT0gbnVsbCl7CisJCQkJc2F2ZUNvbnRlbnQoZGVzdCwgZGVzdE5hbWUsIGVkaXQsIHNvdXJjZUVuY29kaW5nLCBkZXN0RmlsZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0zMzIsNyArMzk3LDcgQEAKIAkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKIAkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgogCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXRSZXNvdXJjZSgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCwgKFBhY2thZ2VGcmFnbWVudCkgZGVzdCk7Ci0JCQkJY3JlYXRlZEVsZW1lbnRzLmFkZCgoKElQYWNrYWdlRnJhZ21lbnQpIGRlc3QpLmdldENvbXBpbGF0aW9uVW5pdChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl0aGlzLmNyZWF0ZWRFbGVtZW50cy5hZGQoKChJUGFja2FnZUZyYWdtZW50KSBkZXN0KS5nZXRDb21waWxhdGlvblVuaXQoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKIAkJCQlwcm9jZXNzUGFja2FnZUZyYWdtZW50UmVzb3VyY2UoKFBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgKFBhY2thZ2VGcmFnbWVudFJvb3QpIGRlc3QsIGdldE5ld05hbWVGb3IoZWxlbWVudCkpOwpAQCAtMzQ3LDE0ICs0MTIsMTQgQEAKIAkgKiBhbmQgPGNvZGU+ZlJlc3VsdEVsZW1lbnRzPC9jb2RlPi4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY3JlYXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpOworCQl0aGlzLmNyZWF0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QodGhpcy5lbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpOwogCQl0cnkgewogCQkJc3VwZXIucHJvY2Vzc0VsZW1lbnRzKCk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKIAkJCXRocm93IGptZTsKIAkJfSBmaW5hbGx5IHsKLQkJCXJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtjcmVhdGVkRWxlbWVudHMuc2l6ZSgpXTsKLQkJCWNyZWF0ZWRFbGVtZW50cy50b0FycmF5KHJlc3VsdEVsZW1lbnRzKTsKKwkJCXRoaXMucmVzdWx0RWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W3RoaXMuY3JlYXRlZEVsZW1lbnRzLnNpemUoKV07CisJCQl0aGlzLmNyZWF0ZWRFbGVtZW50cy50b0FycmF5KHRoaXMucmVzdWx0RWxlbWVudHMpOwogCQkJcHJvY2Vzc0RlbHRhcygpOwogCQl9CiAJfQpAQCAtMzY4LDEyICs0MzMsMTIgQEAKIAlwcml2YXRlIHZvaWQgcHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlKFBhY2thZ2VGcmFnbWVudCBzb3VyY2UsIFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0cnkgewogCQkJU3RyaW5nW10gbmV3RnJhZ05hbWUgPSAobmV3TmFtZSA9PSBudWxsKSA/IHNvdXJjZS5uYW1lcyA6IFV0aWwuZ2V0VHJpbW1lZFNpbXBsZU5hbWVzKG5ld05hbWUpOwotCQkJSVBhY2thZ2VGcmFnbWVudCBuZXdGcmFnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQobmV3RnJhZ05hbWUpOworCQkJUGFja2FnZUZyYWdtZW50IG5ld0ZyYWcgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChuZXdGcmFnTmFtZSk7CiAJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb2xsZWN0UmVzb3VyY2VzT2ZJbnRlcmVzdChzb3VyY2UpOwotCQkJCisKIAkJCS8vIGlmIGlzTW92ZSgpIGNhbiB3ZSBtb3ZlIHRoZSBmb2xkZXIgaXRzZWxmID8gKHNlZSBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQ1OCkKLQkJCWJvb2xlYW4gc2hvdWxkTW92ZUZvbGRlciA9IGlzTW92ZSgpICYmICFuZXdGcmFnLmdldFJlc291cmNlKCkuZXhpc3RzKCk7IC8vIGlmIG5ldyBwa2cgZnJhZ21lbnQgZXhpc3RzLCBpdCBpcyBhbiBvdmVycmlkZQotCQkJSUZvbGRlciBzcmNGb2xkZXIgPSAoSUZvbGRlcilzb3VyY2UuZ2V0UmVzb3VyY2UoKTsKKwkJCWJvb2xlYW4gc2hvdWxkTW92ZUZvbGRlciA9IGlzTW92ZSgpICYmICFuZXdGcmFnLnJlc291cmNlKCkuZXhpc3RzKCk7IC8vIGlmIG5ldyBwa2cgZnJhZ21lbnQgZXhpc3RzLCBpdCBpcyBhbiBvdmVycmlkZQorCQkJSUZvbGRlciBzcmNGb2xkZXIgPSAoSUZvbGRlcilzb3VyY2UucmVzb3VyY2UoKTsKIAkJCUlQYXRoIGRlc3RQYXRoID0gbmV3RnJhZy5nZXRQYXRoKCk7CiAJCQlpZiAoc2hvdWxkTW92ZUZvbGRlcikgewogCQkJCS8vIGNoZWNrIGlmIGRlc3RpbmF0aW9uIGlzIG5vdCBpbmNsdWRlZCBpbiBzb3VyY2UKQEAgLTM4OCwxMSArNDUzLDExIEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9CQorCQkJCX0KIAkJCX0KLQkJCWJvb2xlYW4gY29udGFpbnNSZWFkT25seVN1YlBhY2thZ2VGcmFnbWVudHMgPSBjcmVhdGVOZWVkZWRQYWNrYWdlRnJhZ21lbnRzKChJQ29udGFpbmVyKSBzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKSwgcm9vdCwgbmV3RnJhZ05hbWUsIHNob3VsZE1vdmVGb2xkZXIpOworCQkJYm9vbGVhbiBjb250YWluc1JlYWRPbmx5U3ViUGFja2FnZUZyYWdtZW50cyA9IGNyZWF0ZU5lZWRlZFBhY2thZ2VGcmFnbWVudHMoKElDb250YWluZXIpIHNvdXJjZS5wYXJlbnQucmVzb3VyY2UoKSwgcm9vdCwgbmV3RnJhZ05hbWUsIHNob3VsZE1vdmVGb2xkZXIpOwogCQkJYm9vbGVhbiBzb3VyY2VJc1JlYWRPbmx5ID0gVXRpbC5pc1JlYWRPbmx5KHNyY0ZvbGRlcik7Ci0JCisKIAkJCS8vIFByb2Nlc3MgcmVzb3VyY2VzCiAJCQlpZiAoc2hvdWxkTW92ZUZvbGRlcikgewogCQkJCS8vIG1vdmUgdW5kZXJseWluZyByZXNvdXJjZQpAQCAtNDAwLDExICs0NjUsMTEgQEAKIAkJCQlpZiAoc291cmNlSXNSZWFkT25seSkgewogCQkJCQlVdGlsLnNldFJlYWRPbmx5KHNyY0ZvbGRlciwgZmFsc2UpOwogCQkJCX0KLQkJCQlzcmNGb2xkZXIubW92ZShkZXN0UGF0aCwgZm9yY2UsIHRydWUgLyoga2VlcCBoaXN0b3J5ICovLCBnZXRTdWJQcm9ncmVzc01vbml0b3IoMSkpOworCQkJCXNyY0ZvbGRlci5tb3ZlKGRlc3RQYXRoLCB0aGlzLmZvcmNlLCB0cnVlIC8qIGtlZXAgaGlzdG9yeSAqLywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKIAkJCQlpZiAoc291cmNlSXNSZWFkT25seSkgewogCQkJCQlVdGlsLnNldFJlYWRPbmx5KHNyY0ZvbGRlciwgdHJ1ZSk7CiAJCQkJfQotCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCQl9IGVsc2UgewogCQkJCS8vIHByb2Nlc3MgdGhlIGxlYWYgcmVzb3VyY2VzCiAJCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7CkBAIC00MTcsMTIgKzQ4MiwxMiBAQAogCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJCUlSZXNvdXJjZSBkZXN0aW5hdGlvblJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGRlc3RQYXRoLmFwcGVuZChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpKSk7CiAJCQkJCQkJaWYgKGRlc3RpbmF0aW9uUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoZm9yY2UpIHsKKwkJCQkJCQkJaWYgKHRoaXMuZm9yY2UpIHsKIAkJCQkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUmVzb3VyY2UsIElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOwogCQkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKAotCQkJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAotCQkJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGRlc3RpbmF0aW9uUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOyAKKwkJCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLAorCQkJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGRlc3RpbmF0aW9uUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOwogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQpAQCAtNDMyLDEzICs0OTcsMTMgQEAKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXNvdXJjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJCQlJUmVzb3VyY2UgZGVzdGluYXRpb25SZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihkZXN0UGF0aC5hcHBlbmQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSkpOwogCQkJCQkJCWlmIChkZXN0aW5hdGlvblJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKGZvcmNlKSB7CisJCQkJCQkJCWlmICh0aGlzLmZvcmNlKSB7CiAJCQkJCQkJCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlIGlmIHRoaXMgb3BlcmF0aW9uIHdhbnRzIHRvIG92ZXJyaWRlIGV4aXN0aW5nIHJlc291cmNlcwogCQkJCQkJCQkJZGVsZXRlUmVzb3VyY2UoZGVzdGluYXRpb25SZXNvdXJjZSwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCi0JCQkJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgZGVzdGluYXRpb25SZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKSk7IAorCQkJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sCisJCQkJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgZGVzdGluYXRpb25SZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC00NDYsNyArNTExLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkKKwogCQkJLy8gVXBkYXRlIHBhY2thZ2Ugc3RhdGVtZW50IGluIGNvbXBpbGF0aW9uIHVuaXQgaWYgbmVlZGVkCiAJCQlpZiAoIVV0aWwuZXF1YWxBcnJheXNPck51bGwobmV3RnJhZ05hbWUsIHNvdXJjZS5uYW1lcykpIHsgLy8gaWYgcGFja2FnZSBoYXMgYmVlbiByZW5hbWVkLCB1cGRhdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXRzCiAJCQkJY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMgPSByb290LmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKQEAgLTQ2MSwyNSArNTI2LDIwIEBACiAJCQkJCQlDb21waWxhdGlvblVuaXQgYXN0Q1UgPSAoQ29tcGlsYXRpb25Vbml0KSB0aGlzLnBhcnNlci5jcmVhdGVBU1QodGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCQkJQVNUIGFzdCA9IGFzdENVLmdldEFTVCgpOwogCQkJCQkJQVNUUmV3cml0ZSByZXdyaXRlID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQkJCQkJCXVwZGF0ZVBhY2thZ2VTdGF0ZW1lbnQoYXN0Q1UsIG5ld0ZyYWdOYW1lLCByZXdyaXRlKTsKLQkJCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KGN1KTsKLQkJCQkJCVRleHRFZGl0IGVkaXRzID0gcmV3cml0ZS5yZXdyaXRlQVNUKGRvY3VtZW50LCBudWxsKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZWRpdHMuYXBwbHkoZG9jdW1lbnQpOwotCQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKTsKLQkJCQkJCX0JCQkKKwkJCQkJCXVwZGF0ZVBhY2thZ2VTdGF0ZW1lbnQoYXN0Q1UsIG5ld0ZyYWdOYW1lLCByZXdyaXRlLCBjdSk7CisJCQkJCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGUucmV3cml0ZUFTVCgpOworCQkJCQkJYXBwbHlUZXh0RWRpdChjdSwgZWRpdHMpOwogCQkJCQkJY3Uuc2F2ZShudWxsLCBmYWxzZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJLy8gRGlzY2FyZCBlbXB0eSBvbGQgcGFja2FnZSAoaWYgc3RpbGwgZW1wdHkgYWZ0ZXIgdGhlIHJlbmFtZSkKIAkJCWJvb2xlYW4gaXNFbXB0eSA9IHRydWU7CiAJCQlpZiAoaXNNb3ZlKCkpIHsKIAkJCQkvLyBkZWxldGUgcmVtYWluaW5nIGZpbGVzIGluIHRoaXMgcGFja2FnZSAoLmNsYXNzIGZpbGUgaW4gdGhlIGNhc2Ugd2hlcmUgUHJvaj1zcmM9YmluKQogCQkJCS8vIGluIGNhc2Ugb2YgYSBjb3B5Ci0JCQkJdXBkYXRlUmVhZE9ubHlQYWNrYWdlRnJhZ21lbnRzRm9yTW92ZSgoSUNvbnRhaW5lcikgc291cmNlLmdldFBhcmVudCgpLmdldFJlc291cmNlKCksIHJvb3QsIG5ld0ZyYWdOYW1lLCBzb3VyY2VJc1JlYWRPbmx5KTsKKwkJCQl1cGRhdGVSZWFkT25seVBhY2thZ2VGcmFnbWVudHNGb3JNb3ZlKChJQ29udGFpbmVyKSBzb3VyY2UucGFyZW50LnJlc291cmNlKCksIHJvb3QsIG5ld0ZyYWdOYW1lLCBzb3VyY2VJc1JlYWRPbmx5KTsKIAkJCQlpZiAoc3JjRm9sZGVyLmV4aXN0cygpKSB7CiAJCQkJCUlSZXNvdXJjZVtdIHJlbWFpbmluZyA9IHNyY0ZvbGRlci5tZW1iZXJzKCk7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZW1haW5pbmcubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTQ4OCw3ICs1NDgsNyBAQAogCQkJCQkJCWlmIChVdGlsLmlzUmVhZE9ubHkoZmlsZSkpIHsKIAkJCQkJCQkJVXRpbC5zZXRSZWFkT25seShmaWxlLCBmYWxzZSk7CiAJCQkJCQkJfQotCQkJCQkJCXRoaXMuZGVsZXRlUmVzb3VyY2UoZmlsZSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CisJCQkJCQkJZGVsZXRlUmVzb3VyY2UoZmlsZSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlzRW1wdHkgPSBmYWxzZTsKIAkJCQkJCX0KQEAgLTQ5OCwxNyArNTU4LDE3IEBACiAJCQkJCUlSZXNvdXJjZSByb290UmVzb3VyY2U7CiAJCQkJCS8vIGNoZWNrIGlmIHNvdXJjZSBpcyBpbmNsdWRlZCBpbiBkZXN0aW5hdGlvbgogCQkJCQlpZiAoZGVzdFBhdGguaXNQcmVmaXhPZihzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCXJvb3RSZXNvdXJjZSA9IG5ld0ZyYWcuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJCXJvb3RSZXNvdXJjZSA9IG5ld0ZyYWcucmVzb3VyY2UoKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXJvb3RSZXNvdXJjZSA9ICBzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJCXJvb3RSZXNvdXJjZSA9ICBzb3VyY2UucGFyZW50LnJlc291cmNlKCk7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJLy8gZGVsZXRlIHJlY3Vyc2l2ZWx5IGVtcHR5IGZvbGRlcnMKIAkJCQkJZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoc291cmNlLCBmYWxzZSwgcm9vdFJlc291cmNlKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGNvbnRhaW5zUmVhZE9ubHlTdWJQYWNrYWdlRnJhZ21lbnRzKSB7CiAJCQkJLy8gaW4gY2FzZSBvZiBhIGNvcHkKLQkJCQl1cGRhdGVSZWFkT25seVBhY2thZ2VGcmFnbWVudHNGb3JDb3B5KChJQ29udGFpbmVyKSBzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKSwgcm9vdCwgbmV3RnJhZ05hbWUpOworCQkJCXVwZGF0ZVJlYWRPbmx5UGFja2FnZUZyYWdtZW50c0ZvckNvcHkoKElDb250YWluZXIpIHNvdXJjZS5wYXJlbnQucmVzb3VyY2UoKSwgcm9vdCwgbmV3RnJhZ05hbWUpOwogCQkJfQogCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwNQogCQkJaWYgKGlzRW1wdHkgJiYgaXNNb3ZlKCkgJiYgIShVdGlsLmlzRXhjbHVkZWQoc291cmNlKSB8fCBVdGlsLmlzRXhjbHVkZWQobmV3RnJhZykpKSB7CkBAIC01MjMsNyArNTgzLDcgQEAKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oY2UpOwogCQl9CiAJfQotCXByaXZhdGUgdm9pZCBzYXZlQ29udGVudChQYWNrYWdlRnJhZ21lbnQgZGVzdCwgU3RyaW5nIGRlc3ROYW1lLCBBU1RSZXdyaXRlIHJld3JpdGUsIFN0cmluZyBzb3VyY2VFbmNvZGluZywgSUZpbGUgZGVzdEZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBzYXZlQ29udGVudChQYWNrYWdlRnJhZ21lbnQgZGVzdCwgU3RyaW5nIGRlc3ROYW1lLCBUZXh0RWRpdCBlZGl0cywgU3RyaW5nIHNvdXJjZUVuY29kaW5nLCBJRmlsZSBkZXN0RmlsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQkvLyBUT0RPIChmcmVkZXJpYykgcmVtb3ZlIHdoZW4gYnVnIDY3NjA2IHdpbGwgYmUgZml4ZWQgKGJ1ZyA2NzgyMykKIAkJCS8vIGZpeCBidWcgNjY4OTgKQEAgLTUzNCwxNyArNTk0LDExIEBACiAJCQkvLyB1c2Ugbm8gZW5jb2RpbmcKIAkJfQogCQkvLyB3aGVuIHRoZSBmaWxlIHdhcyBjb3BpZWQsIGl0cyByZWFkLW9ubHkgZmxhZyB3YXMgcHJlc2VydmVkIC0+IHRlbXBvcmFyeSBzZXQgaXQgdG8gZmFsc2UKLQkJLy8gbm90ZSB0aGlzIGRvZXNuJ3QgaW50ZXJmZXIgd2l0aCByZXBvc2l0b3J5IHByb3ZpZGVycyBhcyB0aGlzIGlzIGEgbmV3IHJlc291cmNlIHRoYXQgY2Fubm90IGJlIHVuZGVyCisJCS8vIG5vdGUgdGhpcyBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHJlcG9zaXRvcnkgcHJvdmlkZXJzIGFzIHRoaXMgaXMgYSBuZXcgcmVzb3VyY2UgdGhhdCBjYW5ub3QgYmUgdW5kZXIKIAkJLy8gdmVyc2lvbiBjb250cm9sIHlldAogCQlVdGlsLnNldFJlYWRPbmx5KGRlc3RGaWxlLCBmYWxzZSk7CiAJCUlDb21waWxhdGlvblVuaXQgZGVzdENVID0gZGVzdC5nZXRDb21waWxhdGlvblVuaXQoZGVzdE5hbWUpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudChkZXN0Q1UpOwotCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGUucmV3cml0ZUFTVChkb2N1bWVudCwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQllZGl0cy5hcHBseShkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKTsKLQkJfQorCQlhcHBseVRleHRFZGl0KGRlc3RDVSwgZWRpdHMpOwogCQlkZXN0Q1Uuc2F2ZShnZXRTdWJQcm9ncmVzc01vbml0b3IoMSksIHRoaXMuZm9yY2UpOwogCX0KIAkvKioKQEAgLTU1Myw3ICs2MDcsNyBAQAogCSAqCiAJICogQHJldHVybiBhbiBBU1QgcmV3cml0ZSBvciBudWxsIGlmIG5vIHJld3JpdGUgbmVlZGVkCiAJICovCi0JcHJpdmF0ZSBBU1RSZXdyaXRlIHVwZGF0ZUNvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgUGFja2FnZUZyYWdtZW50IGRlc3QsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwcml2YXRlIFRleHRFZGl0IHVwZGF0ZUNvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgUGFja2FnZUZyYWdtZW50IGRlc3QsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU3RyaW5nW10gY3VyclBhY2thZ2VOYW1lID0gKChQYWNrYWdlRnJhZ21lbnQpIGN1LmdldFBhcmVudCgpKS5uYW1lczsKIAkJU3RyaW5nW10gZGVzdFBhY2thZ2VOYW1lID0gZGVzdC5uYW1lczsKIAkJaWYgKFV0aWwuZXF1YWxBcnJheXNPck51bGwoY3VyclBhY2thZ2VOYW1lLCBkZXN0UGFja2FnZU5hbWUpICYmIG5ld05hbWUgPT0gbnVsbCkgewpAQCAtNTY2LDE3ICs2MjAsMzUgQEAKIAkJCUFTVCBhc3QgPSBhc3RDVS5nZXRBU1QoKTsKIAkJCUFTVFJld3JpdGUgcmV3cml0ZSA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7CiAJCQl1cGRhdGVUeXBlTmFtZShjdSwgYXN0Q1UsIGN1LmdldEVsZW1lbnROYW1lKCksIG5ld05hbWUsIHJld3JpdGUpOwotCQkJdXBkYXRlUGFja2FnZVN0YXRlbWVudChhc3RDVSwgZGVzdFBhY2thZ2VOYW1lLCByZXdyaXRlKTsKLQkJCXJldHVybiByZXdyaXRlOworCQkJdXBkYXRlUGFja2FnZVN0YXRlbWVudChhc3RDVSwgZGVzdFBhY2thZ2VOYW1lLCByZXdyaXRlLCBjdSk7CisJCQlyZXR1cm4gcmV3cml0ZS5yZXdyaXRlQVNUKCk7CiAJCX0KIAl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhY2thZ2VTdGF0ZW1lbnQoQ29tcGlsYXRpb25Vbml0IGFzdENVLCBTdHJpbmdbXSBwa2dOYW1lLCBBU1RSZXdyaXRlIHJld3JpdGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZVN0YXRlbWVudChDb21waWxhdGlvblVuaXQgYXN0Q1UsIFN0cmluZ1tdIHBrZ05hbWUsIEFTVFJld3JpdGUgcmV3cml0ZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlib29sZWFuIGRlZmF1bHRQYWNrYWdlID0gcGtnTmFtZS5sZW5ndGggPT0gMDsKIAkJQVNUIGFzdCA9IGFzdENVLmdldEFTVCgpOwogCQlpZiAoZGVmYXVsdFBhY2thZ2UpIHsKIAkJCS8vIHJlbW92ZSBleGlzdGluZyBwYWNrYWdlIHN0YXRlbWVudAotCQkJaWYgKGFzdENVLmdldFBhY2thZ2UoKSAhPSBudWxsKQotCQkJCXJld3JpdGVyLnNldChhc3RDVSwgQ29tcGlsYXRpb25Vbml0LlBBQ0tBR0VfUFJPUEVSVFksIG51bGwsIG51bGwpOworCQkJUGFja2FnZURlY2xhcmF0aW9uIHBrZyA9IGFzdENVLmdldFBhY2thZ2UoKTsKKwkJCWlmIChwa2cgIT0gbnVsbCkgeworCQkJCWludCBwa2dTdGFydDsKKwkJCQlKYXZhZG9jIGphdmFkb2MgPSBwa2cuZ2V0SmF2YWRvYygpOworCQkJCWlmIChqYXZhZG9jICE9IG51bGwpIHsKKwkJCQkJcGtnU3RhcnQgPSBqYXZhZG9jLmdldFN0YXJ0UG9zaXRpb24oKSArIGphdmFkb2MuZ2V0TGVuZ3RoKCkgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXBrZ1N0YXJ0ID0gcGtnLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQl9CisJCQkJaW50IGV4dGVuZGVkU3RhcnQgPSBhc3RDVS5nZXRFeHRlbmRlZFN0YXJ0UG9zaXRpb24ocGtnKTsKKwkJCQlpZiAocGtnU3RhcnQgIT0gZXh0ZW5kZWRTdGFydCkgeworCQkJCQkvLyBrZWVwIHRoZSBjb21tZW50cyBhc3NvY2lhdGVkIHdpdGggcGFja2FnZSBkZWNsYXJhdGlvbgorCQkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Nzc1NworCQkJCQlTdHJpbmcgY29tbWVudFNvdXJjZSA9IGN1LmdldFNvdXJjZSgpLnN1YnN0cmluZyhleHRlbmRlZFN0YXJ0LCBwa2dTdGFydCk7CisJCQkJCUFTVE5vZGUgY29tbWVudCA9IHJld3JpdGVyLmNyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKGNvbW1lbnRTb3VyY2UsIEFTVE5vZGUuUEFDS0FHRV9ERUNMQVJBVElPTik7CisJCQkJCXJld3JpdGVyLnNldChhc3RDVSwgQ29tcGlsYXRpb25Vbml0LlBBQ0tBR0VfUFJPUEVSVFksIGNvbW1lbnQsIG51bGwpOworCQkJCX0gZWxzZSB7CisJCQkJCXJld3JpdGVyLnNldChhc3RDVSwgQ29tcGlsYXRpb25Vbml0LlBBQ0tBR0VfUFJPUEVSVFksIG51bGwsIG51bGwpOworCQkJCX0KKwkJCX0KIAkJfSBlbHNlIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb24gcGtnID0gYXN0Q1UuZ2V0UGFja2FnZSgpOwogCQkJaWYgKHBrZyAhPSBudWxsKSB7CkBAIC01OTEsOSArNjYzLDkgQEAKIAkJCX0KIAkJfQogCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlUmVhZE9ubHlQYWNrYWdlRnJhZ21lbnRzRm9yQ29weShJQ29udGFpbmVyIHNvdXJjZUZvbGRlciwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nW10gbmV3RnJhZ05hbWUpIHsKLQkJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRSZXNvdXJjZSgpOworCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlYWRPbmx5UGFja2FnZUZyYWdtZW50c0ZvckNvcHkoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIsIFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nW10gbmV3RnJhZ05hbWUpIHsKKwkJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5yZXNvdXJjZSgpOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbmV3RnJhZ05hbWUubGVuZ3RoOyBpIDxsZW5ndGg7IGkrKykgewogCQkJU3RyaW5nIHN1YkZvbGRlck5hbWUgPSBuZXdGcmFnTmFtZVtpXTsKIAkJCXBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOwpAQCAtNjA0LDggKzY3Niw4IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlUmVhZE9ubHlQYWNrYWdlRnJhZ21lbnRzRm9yTW92ZShJQ29udGFpbmVyIHNvdXJjZUZvbGRlciwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nW10gbmV3RnJhZ05hbWUsIGJvb2xlYW4gc291cmNlRm9sZGVySXNSZWFkT25seSkgewotCQlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LmdldFJlc291cmNlKCk7CisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlYWRPbmx5UGFja2FnZUZyYWdtZW50c0Zvck1vdmUoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIsIFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nW10gbmV3RnJhZ05hbWUsIGJvb2xlYW4gc291cmNlRm9sZGVySXNSZWFkT25seSkgeworCQlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LnJlc291cmNlKCk7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBuZXdGcmFnTmFtZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJU3RyaW5nIHN1YkZvbGRlck5hbWUgPSBuZXdGcmFnTmFtZVtpXTsKIAkJCXBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOwpAQCAtNjY2LDggKzczOCw4IEBACiAJCWlmICghc3RhdHVzLmlzT0soKSkgewogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQotCQotCQlpZiAodGhpcy5yZW5hbWluZ3NMaXN0ICE9IG51bGwgJiYgdGhpcy5yZW5hbWluZ3NMaXN0Lmxlbmd0aCAhPSBlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpIHsKKworCQlpZiAodGhpcy5yZW5hbWluZ3NMaXN0ICE9IG51bGwgJiYgdGhpcy5yZW5hbWluZ3NMaXN0Lmxlbmd0aCAhPSB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCkgewogCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKIAkJfQogCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwpAQCAtNjc4LDE5ICs3NTAsMTkgQEAKIAlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQogCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCBlbGVtZW50KTsKLQkJCQorCiAJCWlmIChlbGVtZW50LmlzUmVhZE9ubHkoKSAmJiAoaXNSZW5hbWUoKSB8fCBpc01vdmUoKSkpCiAJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgZWxlbWVudCk7CiAKLQkJSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRSZXNvdXJjZSgpOworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEphdmFFbGVtZW50KSBlbGVtZW50KS5yZXNvdXJjZSgpOwogCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CiAJCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgewogCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9SRVNPVVJDRSwgZWxlbWVudCk7CiAJCQl9CiAJCX0KLQkKKwogCQlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0JCisKIAkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKIAkJCWlmIChpc01vdmUoKSAmJiBjb21waWxhdGlvblVuaXQuaXNXb3JraW5nQ29weSgpICYmICFjb21waWxhdGlvblVuaXQuaXNQcmltYXJ5KCkpCkBAIC02OTgsNyArNzcwLDcgQEAKIAkJfSBlbHNlIGlmIChlbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewogCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOwogCQl9Ci0JCQorCiAJCUphdmFFbGVtZW50IGRlc3QgPSAoSmF2YUVsZW1lbnQpIGdldERlc3RpbmF0aW9uUGFyZW50KGVsZW1lbnQpOwogCQl2ZXJpZnlEZXN0aW5hdGlvbihlbGVtZW50LCBkZXN0KTsKIAkJaWYgKHRoaXMucmVuYW1pbmdzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEKaW5kZXggZjg0YTA0OC4uNDNjNjY0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDYsNyArNDYsNyBAQAogICoKICAqIDxwPlJlcXVpcmVkIEF0dHJpYnV0ZXM6PHVsPgogICogIDxsaT5UaGUgcGFja2FnZSBmcmFnbWVudCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiAgPGxpPlRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgCisgKiAgPGxpPlRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgogICogICAgICBEbyBub3QgaW5jbHVkZSB0aGUgPGNvZGU+Ii5qYXZhIjwvY29kZT4gc3VmZml4IChleC4gPGNvZGU+Ik9iamVjdCI8L2NvZGU+IC0KICAqIAkJdGhlIDxjb2RlPiIuamF2YSI8L2NvZGU+IHdpbGwgYmUgYWRkZWQgZm9yIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LikKICAqICA8bGk+CkBAIC01NywxOSArNTcsMTkgQEAKIAkvKioKIAkgKiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBiZWluZyBjcmVhdGVkLgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwogCS8qKgogCSAqIFRoZSBzb3VyY2UgY29kZSB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgZWxlbWVudC4KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZTb3VyY2U9IG51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBzb3VyY2U9IG51bGw7CiAvKioKICAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGEgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICogVGhlIG5hbWUgc2hvdWxkIGhhdmUgdGhlICIuamF2YSIgc3VmZml4LgogICovCiBwdWJsaWMgQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uKElQYWNrYWdlRnJhZ21lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZm9yY2UpIHsKIAlzdXBlcihudWxsLCBuZXcgSUphdmFFbGVtZW50W10ge3BhcmVudEVsZW1lbnR9LCBmb3JjZSk7Ci0JZk5hbWUgPSBuYW1lOwotCWZTb3VyY2UgPSBzb3VyY2U7CisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKIH0KIC8qKgogICogQ3JlYXRlcyBhIGNvbXBpbGF0aW9uIHVuaXQuCkBAIC03OCwzMiArNzgsMzIgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCXRyeSB7Ci0JCWJlZ2luVGFzayhNZXNzYWdlcy5vcGVyYXRpb25fY3JlYXRlVW5pdFByb2dyZXNzLCAyKTsgCisJCWJlZ2luVGFzayhNZXNzYWdlcy5vcGVyYXRpb25fY3JlYXRlVW5pdFByb2dyZXNzLCAyKTsKIAkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ld0phdmFFbGVtZW50RGVsdGEoKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGdldFBhcmVudEVsZW1lbnQoKTsKIAkJSUNvbnRhaW5lciBmb2xkZXIgPSAoSUNvbnRhaW5lcikgcGtnLmdldFJlc291cmNlKCk7CiAJCXdvcmtlZCgxKTsKLQkJSUZpbGUgY29tcGlsYXRpb25Vbml0RmlsZSA9IGZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGZOYW1lKSk7CisJCUlGaWxlIGNvbXBpbGF0aW9uVW5pdEZpbGUgPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCh0aGlzLm5hbWUpKTsKIAkJaWYgKGNvbXBpbGF0aW9uVW5pdEZpbGUuZXhpc3RzKCkpIHsKIAkJCS8vIHVwZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIHVuaXQgaWYgZkZvcmNlIGlzIHRydWUKLQkJCWlmIChmb3JjZSkgeworCQkJaWYgKHRoaXMuZm9yY2UpIHsKIAkJCQlJQnVmZmVyIGJ1ZmZlciA9IHVuaXQuZ2V0QnVmZmVyKCk7CiAJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJYnVmZmVyLnNldENvbnRlbnRzKGZTb3VyY2UpOworCQkJCWJ1ZmZlci5zZXRDb250ZW50cyh0aGlzLnNvdXJjZSk7CiAJCQkJdW5pdC5zYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGZhbHNlKTsKLQkJCQlyZXN1bHRFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dW5pdH07CisJCQkJdGhpcy5yZXN1bHRFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dW5pdH07CiAJCQkJaWYgKCFVdGlsLmlzRXhjbHVkZWQodW5pdCkKIAkJCQkJCSYmIHVuaXQuZ2V0UGFyZW50KCkuZXhpc3RzKCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJZGVsdGEuY2hhbmdlZChyZXN1bHRFbGVtZW50c1tpXSwgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnJlc3VsdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlkZWx0YS5jaGFuZ2VkKHRoaXMucmVzdWx0RWxlbWVudHNbaV0sIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7CiAJCQkJCX0KIAkJCQkJYWRkRGVsdGEoZGVsdGEpOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKAotCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKLQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgY29tcGlsYXRpb25Vbml0RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKSk7IAorCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLAorCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBjb21waWxhdGlvblVuaXRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXRyeSB7CkBAIC0xMTQsMjAgKzExNCwyMCBAQAogCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CiAJCQkJCS8vIHVzZSBubyBlbmNvZGluZwogCQkJCX0KLQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RpbmcgPT0gbnVsbCA/IGZTb3VyY2UuZ2V0Qnl0ZXMoKSA6IGZTb3VyY2UuZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKLQkJCQljcmVhdGVGaWxlKGZvbGRlciwgdW5pdC5nZXRFbGVtZW50TmFtZSgpLCBzdHJlYW0sIGZvcmNlKTsKLQkJCQlyZXN1bHRFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dW5pdH07CisJCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kaW5nID09IG51bGwgPyB0aGlzLnNvdXJjZS5nZXRCeXRlcygpIDogdGhpcy5zb3VyY2UuZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKKwkJCQljcmVhdGVGaWxlKGZvbGRlciwgdW5pdC5nZXRFbGVtZW50TmFtZSgpLCBzdHJlYW0sIHRoaXMuZm9yY2UpOworCQkJCXRoaXMucmVzdWx0RWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10ge3VuaXR9OwogCQkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKHVuaXQpCiAJCQkJCQkmJiB1bml0LmdldFBhcmVudCgpLmV4aXN0cygpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWRlbHRhLmFkZGVkKHJlc3VsdEVsZW1lbnRzW2ldKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnJlc3VsdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlkZWx0YS5hZGRlZCh0aGlzLnJlc3VsdEVsZW1lbnRzW2ldKTsKIAkJCQkJfQogCQkJCQlhZGREZWx0YShkZWx0YSk7CiAJCQkJfQogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOwogCQkJfQotCQl9IAorCQl9CiAJCXdvcmtlZCgxKTsKIAl9IGZpbmFsbHkgewogCQlkb25lKCk7CkBAIC0xMzcsNyArMTM3LDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0Q29tcGlsYXRpb25Vbml0KCkKICAqLwogcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXQoZk5hbWUpOworCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXQodGhpcy5uYW1lKTsKIH0KIHByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7CiAJSVJlc291cmNlIHJlc291cmNlICA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlKCk7CkBAIC0xNTIsNyArMTUyLDcgQEAKICAqIFBvc3NpYmxlIGZhaWx1cmVzOiA8dWw+CiAgKiAgPGxpPk5PX0VMRU1FTlRTX1RPX1BST0NFU1MgLSB0aGUgcGFja2FnZSBmcmFnbWVudCBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIGlzCiAgKiAJCTxjb2RlPm51bGw8L2NvZGU+LgotICoJPGxpPklOVkFMSURfTkFNRSAtIHRoZSBjb21waWxhdGlvbiB1bml0IG5hbWUgcHJvdmlkZWQgdG8gdGhlIG9wZXJhdGlvbiAKKyAqCTxsaT5JTlZBTElEX05BTUUgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBuYW1lIHByb3ZpZGVkIHRvIHRoZSBvcGVyYXRpb24KICAqIAkJaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgaGFzIGFuIGludmFsaWQgc3ludGF4CiAgKiAgPGxpPklOVkFMSURfQ09OVEVOVFMgLSB0aGUgc291cmNlIHNwZWNpZmllZCBmb3IgdGhlIGNvbXBpbGlhdGlvbiB1bml0IGlzIG51bGwKICAqIDwvdWw+CkBAIC0xNjIsMTAgKzE2MiwxMCBAQAogCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOwogCX0KIAlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldFBhcmVudEVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpOwotCWlmIChKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKGZOYW1lLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9OQU1FLCBmTmFtZSk7CisJaWYgKEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUodGhpcy5uYW1lLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9OQU1FLCB0aGlzLm5hbWUpOwogCX0KLQlpZiAoZlNvdXJjZSA9PSBudWxsKSB7CisJaWYgKHRoaXMuc291cmNlID09IG51bGwpIHsKIAkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKTsKIAl9CiAJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbi5qYXZhCmluZGV4IGFjZDRiNzIuLjhjNzJmYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw4ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwpAQCAtMjksOCArMjcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuTGlzdFJld3JpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKIAogLyoqCkBAIC00OCw3ICs0NCw3IEBACiAJLyoqCiAJICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgQVNUIHVzZWQgZm9yIHRoaXMgb3BlcmF0aW9uCiAJICovCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjdUFTVDsJCQorCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgY3VBU1Q7CiAJLyoqCiAJICogQSBjb25zdGFudCBtZWFuaW5nIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudAogCSAqIGFzIHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KQEAgLTkzLDE5ICs4OSwxMSBAQAogCQlzdXBlcihudWxsLCBuZXcgSUphdmFFbGVtZW50W117cGFyZW50RWxlbWVudH0pOwogCQlpbml0aWFsaXplRGVmYXVsdFBvc2l0aW9uKCk7CiAJfQotCXByb3RlY3RlZCB2b2lkIGFwcGx5KEFTVFJld3JpdGUgcmV3cml0ZXIsIElEb2N1bWVudCBkb2N1bWVudCwgTWFwIG9wdGlvbnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIG9wdGlvbnMpOwotIAkJdHJ5IHsKLQkgCQllZGl0cy5hcHBseShkb2N1bWVudCk7Ci0gCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ09OVEVOVFMpOwotIAkJfQotCX0KIAkvKioKIAkgKiBPbmx5IGFsbG93IGNhbmNlbGxpbmcgaWYgdGhpcyBvcGVyYXRpb24gaXMgbm90IG5lc3RlZC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCQlpZiAoIWlzTmVzdGVkKSB7CisJCWlmICghdGhpcy5pc05lc3RlZCkgewogCQkJc3VwZXIuY2hlY2tDYW5jZWxlZCgpOwogCQl9CiAJfQpAQCAtMTQ0LDEyICsxMzIsMTIgQEAKIAkJCQlpZiAoIWlzV29ya2luZ0NvcHkpCiAJCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCQkJd29ya2VkKDEpOwotCQkJCXJlc3VsdEVsZW1lbnRzID0gZ2VuZXJhdGVSZXN1bHRIYW5kbGVzKCk7CisJCQkJdGhpcy5yZXN1bHRFbGVtZW50cyA9IGdlbmVyYXRlUmVzdWx0SGFuZGxlcygpOwogCQkJCWlmICghaXNXb3JraW5nQ29weSAvLyBpZiB1bml0IGlzIHdvcmtpbmcgY29weSwgdGhlbiBzYXZlIHdpbGwgaGF2ZSBhbHJlYWR5IGZpcmVkIHRoZSBkZWx0YQogCQkJCQkJJiYgIVV0aWwuaXNFeGNsdWRlZCh1bml0KQogCQkJCQkJJiYgdW5pdC5nZXRQYXJlbnQoKS5leGlzdHMoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlkZWx0YS5hZGRlZChyZXN1bHRFbGVtZW50c1tpXSk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5yZXN1bHRFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJZGVsdGEuYWRkZWQodGhpcy5yZXN1bHRFbGVtZW50c1tpXSk7CiAJCQkJCX0KIAkJCQkJYWRkRGVsdGEoZGVsdGEpOwogCQkJCX0gLy8gZWxzZSB1bml0IGlzIGNyZWF0ZWQgb3V0c2lkZSBjbGFzc3BhdGgKQEAgLTE1OSwzMiArMTQ3LDMyIEBACiAJCQlkb25lKCk7CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBlbGVtZW50IGJlaW5nIGNyZWF0ZWQuCiAJICovCiAJcHJvdGVjdGVkIGFic3RyYWN0IFN0cnVjdHVyYWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0Q2hpbGRQcm9wZXJ0eURlc2NyaXB0b3IoQVNUTm9kZSBwYXJlbnQpOwotCQorCiAJLyoKIAkgKiBSZXR1cm5zIGFuIEFTVCBub2RlIGZvciB0aGUgZWxlbWVudCBiZWluZyBjcmVhdGVkLgogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJcHJvdGVjdGVkIGFic3RyYWN0IEFTVE5vZGUgZ2VuZXJhdGVFbGVtZW50QVNUKEFTVFJld3JpdGUgcmV3cml0ZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAJLyoKIAkgKiBHZW5lcmF0ZXMgYSBuZXcgQVNUIGZvciB0aGlzIG9wZXJhdGlvbiBhbmQgYXBwbGllcyBpdCB0byB0aGUgZ2l2ZW4gY3UKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5ld0NvbXBpbGF0aW9uVW5pdEFTVChJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5jdUFTVCA9IHBhcnNlKGN1KTsKLQkJCisKIAkJQVNUIGFzdCA9IHRoaXMuY3VBU1QuZ2V0QVNUKCk7CiAJCUFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudChjdSk7Ci0JCUFTVE5vZGUgY2hpbGQgPSBnZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGRvY3VtZW50LCBjdSk7CisJCUFTVE5vZGUgY2hpbGQgPSBnZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGN1KTsKIAkJaWYgKGNoaWxkICE9IG51bGwpIHsKIAkJCUFTVE5vZGUgcGFyZW50ID0gKChKYXZhRWxlbWVudCkgZ2V0UGFyZW50RWxlbWVudCgpKS5maW5kTm9kZSh0aGlzLmN1QVNUKTsKIAkJCWlmIChwYXJlbnQgPT0gbnVsbCkKIAkJCQlwYXJlbnQgPSB0aGlzLmN1QVNUOwogCQkJaW5zZXJ0QVNUTm9kZShyZXdyaXRlciwgcGFyZW50LCBjaGlsZCk7Ci0JCQlhcHBseShyZXdyaXRlciwgZG9jdW1lbnQsIGN1LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7CisJCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGVyLnJld3JpdGVBU1QoKTsKKwkJCWFwcGx5VGV4dEVkaXQoY3UsIGVkaXRzKTsKIAkJfQogCQl3b3JrZWQoMSk7CiAJfQpAQCAtMjI0LDcgKzIxMiw3IEBACiAJfQogCS8qKgogCSAqIFNldHMgdGhlIGRlZmF1bHQgcG9zaXRpb24gaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBuZXcgdHlwZQotCSAqIG1lbWJlci4gCisJICogbWVtYmVyLgogCSAqIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGEgZGlmZmVyZW50IGRlZmF1bHQgcG9zaXRpb24gbXVzdAogCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgogCSAqLwpAQCAtMjMzLDcgKzIyMSw3IEBACiAJCS8vIGxhc3QgY2hpbGQgb2YgdGhlIHBhcmVudCBlbGVtZW50IGluIHdoaWNoIGl0IGlzIGNyZWF0ZWQuCiAJfQogCS8qKgotCSAqIEluc2VydHMgdGhlIGdpdmVuIGNoaWxkIGludG8gdGhlIGdpdmVuIEFTVCwgCisJICogSW5zZXJ0cyB0aGUgZ2l2ZW4gY2hpbGQgaW50byB0aGUgZ2l2ZW4gQVNULAogCSAqIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBzZXR0aW5ncyBvZiB0aGlzIG9wZXJhdGlvbi4KIAkgKgogCSAqIEBzZWUgI2NyZWF0ZUFmdGVyKElKYXZhRWxlbWVudCkKQEAgLTI3Myw3ICsyNjEsNyBAQAogCQkvLyBlbnN1cmUgY3UgaXMgY29uc2lzdGVudCAobm9vcCBpZiBhbHJlYWR5IGNvbnNpc3RlbnQpCiAJCWN1Lm1ha2VDb25zaXN0ZW50KHRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJLy8gY3JlYXRlIGFuIEFTVCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTNCk7CiAJCXBhcnNlci5zZXRTb3VyY2UoY3UpOwogCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVCh0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRmllbGRPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUZpZWxkT3BlcmF0aW9uLmphdmEKaW5kZXggNWVhZWNjZS4uM2Y4NTRjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRmllbGRPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVGaWVsZE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKIAogLyoqCiAgKiA8cD5UaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgZmllbGQgZGVjbGFyYXRpb24gaW4gYSB0eXBlLgpAQCAtNDgsOCArNDcsOCBAQAogcHVibGljIENyZWF0ZUZpZWxkT3BlcmF0aW9uKElUeXBlIHBhcmVudEVsZW1lbnQsIFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZm9yY2UpIHsKIAlzdXBlcihwYXJlbnRFbGVtZW50LCBzb3VyY2UsIGZvcmNlKTsKIH0KLXByb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUFTVE5vZGUgbm9kZSA9IHN1cGVyLmdlbmVyYXRlRWxlbWVudEFTVChyZXdyaXRlciwgZG9jdW1lbnQsIGN1KTsKK3Byb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBU1ROb2RlIG5vZGUgPSBzdXBlci5nZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGN1KTsKIAlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04pCiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ09OVEVOVFMpKTsKIAlyZXR1cm4gbm9kZTsKQEAgLTY0LDcgKzYzLDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lKCkKICAqLwogcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsKLQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZUZpZWxkUHJvZ3Jlc3M7IAorCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY3JlYXRlRmllbGRQcm9ncmVzczsKIH0KIHByaXZhdGUgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGdldEZyYWdtZW50KEFTVE5vZGUgbm9kZSkgewogCUl0ZXJhdG9yIGZyYWdtZW50cyA9ICAoKEZpZWxkRGVjbGFyYXRpb24pIG5vZGUpLmZyYWdtZW50cygpLml0ZXJhdG9yKCk7CkBAIC0xMjAsOCArMTE5LDggQEAKIAkJU3RyaW5nIGZpZWxkTmFtZSA9IGdldEFTVE5vZGVOYW1lKCk7CiAJCWlmICh0eXBlLmdldEZpZWxkKGZpZWxkTmFtZSkuZXhpc3RzKCkpIHsKIAkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKAotCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAotCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGZpZWxkTmFtZSkpOyAKKwkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLAorCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIGZpZWxkTmFtZSkpOwogCQl9CiAJfQogCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUltcG9ydE9wZXJhdGlvbi5qYXZhCmluZGV4IDM2MmZiNTcuLmUyNDA3MTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUltcG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiAKIC8qKgogICogPHA+VGhpcyBvcGVyYXRpb24gYWRkcyBhbiBpbXBvcnQgZGVjbGFyYXRpb24gdG8gYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdC4KQEAgLTU5LDcgKzU4LDcgQEAKIAkgKiBUaGUgbmFtZSBvZiB0aGUgaW1wb3J0IHRvIGJlIGNyZWF0ZWQuCiAJICovCiAJcHJvdGVjdGVkIFN0cmluZyBpbXBvcnROYW1lOwotCQorCiAJLyoKIAkgKiBUaGUgZmxhZ3Mgb2YgdGhlIGltcG9ydCB0byBiZSBjcmVhdGVkIChlaXRoZXIgRmxhZ3MjQWNjRGVmYXVsdCBvciBGbGFncyNBY2NTdGF0aWMpCiAJICovCkBAIC03Niw3ICs3NSw3IEBACiBwcm90ZWN0ZWQgU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvciBnZXRDaGlsZFByb3BlcnR5RGVzY3JpcHRvcihBU1ROb2RlIHBhcmVudCkgewogCXJldHVybiBDb21waWxhdGlvblVuaXQuSU1QT1JUU19QUk9QRVJUWTsKIH0KLXByb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworcHJvdGVjdGVkIEFTVE5vZGUgZ2VuZXJhdGVFbGVtZW50QVNUKEFTVFJld3JpdGUgcmV3cml0ZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCS8vIGVuc3VyZSBubyBkdXBsaWNhdGUKIAlJdGVyYXRvciBpbXBvcnRzID0gdGhpcy5jdUFTVC5pbXBvcnRzKCkuaXRlcmF0b3IoKTsKIAlib29sZWFuIG9uRGVtYW5kID0gdGhpcy5pbXBvcnROYW1lLmVuZHNXaXRoKCIuKiIpOyAvLyROT04tTkxTLTEkCkBAIC05Myw3ICs5Miw3IEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KLQkKKwogCUFTVCBhc3QgPSB0aGlzLmN1QVNULmdldEFTVCgpOwogCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7CiAJaW1wb3J0RGVjbGFyYXRpb24uc2V0U3RhdGljKEZsYWdzLmlzU3RhdGljKHRoaXMuZmxhZ3MpKTsKQEAgLTExOSw3ICsxMTgsNyBAQAogICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZXRNYWluVGFza05hbWUoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpewotCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY3JlYXRlSW1wb3J0c1Byb2dyZXNzOyAKKwlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZUltcG9ydHNQcm9ncmVzczsKIH0KIC8qKgogICogU2V0cyB0aGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBpbXBvcnQ6PHVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUluaXRpYWxpemVyT3BlcmF0aW9uLmphdmEKaW5kZXggYTZhMDNhZS4uY2IyNjAwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiAKIC8qKgogICogPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIGluaXRpYWxpemVyIGluIGEgdHlwZS4KQEAgLTQ3LDggKzQ2LDggQEAKIHB1YmxpYyBDcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbihJVHlwZSBwYXJlbnRFbGVtZW50LCBTdHJpbmcgc291cmNlKSB7CiAJc3VwZXIocGFyZW50RWxlbWVudCwgc291cmNlLCBmYWxzZSk7CiB9Ci1wcm90ZWN0ZWQgQVNUTm9kZSBnZW5lcmF0ZUVsZW1lbnRBU1QoQVNUUmV3cml0ZSByZXdyaXRlciwgSURvY3VtZW50IGRvY3VtZW50LCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlBU1ROb2RlIG5vZGUgPSBzdXBlci5nZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGRvY3VtZW50LCBjdSk7Citwcm90ZWN0ZWQgQVNUTm9kZSBnZW5lcmF0ZUVsZW1lbnRBU1QoQVNUUmV3cml0ZSByZXdyaXRlciwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQVNUTm9kZSBub2RlID0gc3VwZXIuZ2VuZXJhdGVFbGVtZW50QVNUKHJld3JpdGVyLCBjdSk7CiAJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLklOSVRJQUxJWkVSKQogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKSk7CiAJcmV0dXJuIG5vZGU7CkBAIC04Nyw3ICs4Niw3IEBACiAgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZSgpCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7Ci0JcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9jcmVhdGVJbml0aWFsaXplclByb2dyZXNzOyAKKwlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZUluaXRpYWxpemVyUHJvZ3Jlc3M7CiB9CiBwcm90ZWN0ZWQgU2ltcGxlTmFtZSByZW5hbWUoQVNUTm9kZSBub2RlLCBTaW1wbGVOYW1lIG5ld05hbWUpIHsKIAlyZXR1cm4gbnVsbDsgLy8gaW50aWFsaXplciBjYW5ub3QgYmUgcmVuYW1lZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVNZXRob2RPcGVyYXRpb24uamF2YQppbmRleCA4ODA1NjViLi5iZmU3ZDU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVNZXRob2RPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVNZXRob2RPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywxMCArMjcsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiAKIC8qKgotICogPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhbiBpbnN0YW5jZSBtZXRob2QuIAorICogPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhbiBpbnN0YW5jZSBtZXRob2QuCiAgKgogICogPHA+UmVxdWlyZWQgQXR0cmlidXRlczo8dWw+CiAgKiAgPGxpPkNvbnRhaW5pbmcgdHlwZQpAQCAtMzksOSArMzgsOSBAQAogICogPC91bD4KICAqLwogcHVibGljIGNsYXNzIENyZWF0ZU1ldGhvZE9wZXJhdGlvbiBleHRlbmRzIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24gewotCQorCiAJcHJvdGVjdGVkIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzOwotCQorCiAvKioKICAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGEgbWV0aG9kCiAgKiBpbiB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlLgpAQCAtNzQsOCArNzMsOCBAQAogCX0KIAlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlczsKIH0KLXByb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUFTVE5vZGUgbm9kZSA9IHN1cGVyLmdlbmVyYXRlRWxlbWVudEFTVChyZXdyaXRlciwgZG9jdW1lbnQsIGN1KTsKK3Byb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBU1ROb2RlIG5vZGUgPSBzdXBlci5nZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGN1KTsKIAlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKQogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKSk7CiAJcmV0dXJuIG5vZGU7CkBAIC05NSw3ICs5NCw3IEBACiAgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZSgpCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7Ci0JcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9jcmVhdGVNZXRob2RQcm9ncmVzczsgCisJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9jcmVhdGVNZXRob2RQcm9ncmVzczsKIH0KIHByb3RlY3RlZCBTaW1wbGVOYW1lIHJlbmFtZShBU1ROb2RlIG5vZGUsIFNpbXBsZU5hbWUgbmV3TmFtZSkgewogCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKQEAgLTExNyw4ICsxMTYsOCBAQAogCQlTdHJpbmdbXSB0eXBlcyA9IGNvbnZlcnRBU1RNZXRob2RUeXBlc1RvU2lnbmF0dXJlcygpOwogCQlpZiAodHlwZS5nZXRNZXRob2QobmFtZSwgdHlwZXMpLmV4aXN0cygpKSB7CiAJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKLQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBuYW1lKSk7IAorCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sCisJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgbmFtZSkpOwogCQl9CiAJfQogCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25PcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCmluZGV4IGFmNGZkMjYuLjliM2Q3NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDcgKzI5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RydWN0dXJhbFByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiAKIC8qKgogICogPHA+VGhpcyBvcGVyYXRpb24gYWRkcy9yZXBsYWNlcyBhIHBhY2thZ2UgZGVjbGFyYXRpb24gaW4gYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdC4KQEAgLTU2LDcgKzU1LDcgQEAKIHByb3RlY3RlZCBTdHJ1Y3R1cmFsUHJvcGVydHlEZXNjcmlwdG9yIGdldENoaWxkUHJvcGVydHlEZXNjcmlwdG9yKEFTVE5vZGUgcGFyZW50KSB7CiAJcmV0dXJuIENvbXBpbGF0aW9uVW5pdC5QQUNLQUdFX1BST1BFUlRZOwogfQotcHJvdGVjdGVkIEFTVE5vZGUgZ2VuZXJhdGVFbGVtZW50QVNUKEFTVFJld3JpdGUgcmV3cml0ZXIsIElEb2N1bWVudCBkb2N1bWVudCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgQVNUTm9kZSBnZW5lcmF0ZUVsZW1lbnRBU1QoQVNUUmV3cml0ZSByZXdyaXRlciwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJLy9sb29rIGZvciBhbiBleGlzdGluZyBwYWNrYWdlIGRlY2xhcmF0aW9uCiAJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRDaGlsZHJlbigpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKQEAgLTgyLDE0ICs4MSwxNCBAQAogICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZXRNYWluVGFza05hbWUoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpewotCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY3JlYXRlUGFja2FnZVByb2dyZXNzOyAKKwlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZVBhY2thZ2VQcm9ncmVzczsKIH0KIC8qKgogICogU2V0cyB0aGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgbmV3IHBhY2thZ2UgZGVjbGFyYXRpb246PHVsPgogICogPGxpPiBiZWZvcmUgdGhlIGZpcnN0IGltcG9ydAogICogPGxpPiBpZiBubyBpbXBvcnRzLCBiZWZvcmUgdGhlIGZpcnN0IHR5cGUKICAqIDxsaT4gaWYgbm8gdHlwZSAtIGZpcnN0IHRoaW5nIGluIHRoZSBDVQotICogPGxpPiAKKyAqIDxsaT4KICAqLwogcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQb3NpdGlvbigpIHsKIAl0cnkgewpAQCAtMTEwLDcgKzEwOSw3IEBACiB9CiAvKioKICAqIFBvc3NpYmxlIGZhaWx1cmVzOiA8dWw+Ci0gKiAgPGxpPk5PX0VMRU1FTlRTX1RPX1BST0NFU1MgLSBubyBjb21waWxhdGlvbiB1bml0IHdhcyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIAorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gbm8gY29tcGlsYXRpb24gdW5pdCB3YXMgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgogICogIDxsaT5JTlZBTElEX05BTUUgLSBhIG5hbWUgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiB3YXMgbm90IGEgdmFsaWQKICAqIAkJcGFja2FnZSBkZWNsYXJhdGlvbiBuYW1lLgogICogPC91bD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKaW5kZXggZDE4NmE5MC4uNDc4NjUyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKQEAgLTMwLDcgKzMxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgotICogVGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBwYWNrYWdlIGZyYWdtZW50IHVuZGVyIGEgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCByb290LiAKKyAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgcGFja2FnZSBmcmFnbWVudCB1bmRlciBhIGdpdmVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KICAqIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzcGVjaWZpZWQ6IDx1bD4KICAqIDxsaT50aGUgcGFja2FnZSBmcmFnbWVudCByb290CiAgKiA8bGk+dGhlIHBhY2thZ2UgbmFtZQpAQCAtNzIsOSArNzMsOSBAQAogCXRyeSB7CiAJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBudWxsOwogCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0UGFyZW50RWxlbWVudCgpOwotCQliZWdpblRhc2soTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZVBhY2thZ2VGcmFnbWVudFByb2dyZXNzLCB0aGlzLnBrZ05hbWUubGVuZ3RoKTsgCi0JCUlDb250YWluZXIgcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0UmVzb3VyY2UoKTsKLQkJU3RyaW5nW10gc2lkZUVmZmVjdFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOyAKKwkJYmVnaW5UYXNrKE1lc3NhZ2VzLm9wZXJhdGlvbl9jcmVhdGVQYWNrYWdlRnJhZ21lbnRQcm9ncmVzcywgdGhpcy5wa2dOYW1lLmxlbmd0aCk7CisJCUlDb250YWluZXIgcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHJvb3QucmVzb3VyY2UoKTsKKwkJU3RyaW5nW10gc2lkZUVmZmVjdFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwogCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QodGhpcy5wa2dOYW1lLmxlbmd0aCk7CiAJCWNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zID0gcm9vdC5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCk7CiAJCWNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gcm9vdC5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CkBAIC04NCw3ICs4NSw3IEBACiAJCQlzaWRlRWZmZWN0UGFja2FnZU5hbWUgPSBVdGlsLmFycmF5Q29uY2F0KHNpZGVFZmZlY3RQYWNrYWdlTmFtZSwgc3ViRm9sZGVyTmFtZSk7CiAJCQlJUmVzb3VyY2Ugc3ViRm9sZGVyID0gcGFyZW50Rm9sZGVyLmZpbmRNZW1iZXIoc3ViRm9sZGVyTmFtZSk7CiAJCQlpZiAoc3ViRm9sZGVyID09IG51bGwpIHsKLQkJCQljcmVhdGVGb2xkZXIocGFyZW50Rm9sZGVyLCBzdWJGb2xkZXJOYW1lLCBmb3JjZSk7CisJCQkJY3JlYXRlRm9sZGVyKHBhcmVudEZvbGRlciwgc3ViRm9sZGVyTmFtZSwgdGhpcy5mb3JjZSk7CiAJCQkJcGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChzdWJGb2xkZXJOYW1lKSk7CiAJCQkJSVBhY2thZ2VGcmFnbWVudCBhZGRlZEZyYWcgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChzaWRlRWZmZWN0UGFja2FnZU5hbWUpOwogCQkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKHBhcmVudEZvbGRlciwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSkgewpAQCAtMTEwLDExICsxMTEsMTggQEAKIAkJZG9uZSgpOwogCX0KIH0KK3Byb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7CisJaWYgKHRoaXMucGtnTmFtZS5sZW5ndGggPT0gMCkKKwkJcmV0dXJuIG51bGw7IC8vIG5vIHJlc291cmNlIGlzIGdvaW5nIHRvIGJlIGNyZWF0ZWQKKwlJUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UgPSAoKEphdmFFbGVtZW50KSBnZXRQYXJlbnRFbGVtZW50KCkpLnJlc291cmNlKCk7CisJSVJlc291cmNlIHJlc291cmNlID0gKChJQ29udGFpbmVyKSBwYXJlbnRSZXNvdXJjZSkuZ2V0Rm9sZGVyKG5ldyBQYXRoKHRoaXMucGtnTmFtZVswXSkpOworCXJldHVybiByZXNvdXJjZS5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUocmVzb3VyY2UpOworfQogLyoqCiAgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgogICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gdGhlIHJvb3Qgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiBpcwogICogCQk8Y29kZT5udWxsPC9jb2RlPi4KLSAqCTxsaT5JTlZBTElEX05BTUUgLSB0aGUgbmFtZSBwcm92aWRlZCB0byB0aGUgb3BlcmF0aW9uIAorICoJPGxpPklOVkFMSURfTkFNRSAtIHRoZSBuYW1lIHByb3ZpZGVkIHRvIHRoZSBvcGVyYXRpb24KICAqIAkJaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBmcmFnbWVudCBuYW1lLgogICoJPGxpPlJFQURfT05MWSAtIHRoZSByb290IHByb3ZpZGVkIHRvIHRoaXMgb3BlcmF0aW9uIGlzIHJlYWQgb25seS4KICAqCTxsaT5OQU1FX0NPTExJU0lPTiAtIHRoZXJlIGlzIGEgcHJlLWV4aXN0aW5nIHJlc291cmNlIChmaWxlKQpAQCAtMTI5LDI1ICsxMzcsMjUgQEAKIAlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7CiAJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyk7CiAJfQotCQorCiAJU3RyaW5nIHBhY2thZ2VOYW1lID0gdGhpcy5wa2dOYW1lID09IG51bGwgPyBudWxsIDogVXRpbC5jb25jYXRXaXRoKHRoaXMucGtnTmFtZSwgJy4nKTsKIAlJSmF2YVByb2plY3QgcHJvamVjdCA9IHBhcmVudEVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKIAlpZiAodGhpcy5wa2dOYW1lID09IG51bGwgfHwgKHRoaXMucGtnTmFtZS5sZW5ndGggPiAwICYmIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpLCBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSkgewogCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSwgcGFja2FnZU5hbWUpOwogCX0KLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBnZXRQYXJlbnRFbGVtZW50KCk7CisJSUphdmFFbGVtZW50IHJvb3QgPSBnZXRQYXJlbnRFbGVtZW50KCk7CiAJaWYgKHJvb3QuaXNSZWFkT25seSgpKSB7CiAJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCByb290KTsKIAl9Ci0JSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRSZXNvdXJjZSgpOworCUlDb250YWluZXIgcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpICgoSmF2YUVsZW1lbnQpIHJvb3QpLnJlc291cmNlKCk7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IHRoaXMucGtnTmFtZS5sZW5ndGg7IGkrKykgewogCQlJUmVzb3VyY2Ugc3ViRm9sZGVyID0gcGFyZW50Rm9sZGVyLmZpbmRNZW1iZXIodGhpcy5wa2dOYW1lW2ldKTsKIAkJaWYgKHN1YkZvbGRlciAhPSBudWxsKSB7CiAJCQlpZiAoc3ViRm9sZGVyLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSKSB7CiAJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAotCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBzdWJGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7IAorCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLAorCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCBzdWJGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7CiAJCQl9CiAJCQlwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgc3ViRm9sZGVyOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uLmphdmEKaW5kZXggNDlhOTg3OS4uYTM1NWM2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00MCw3ICs0MCw3IEBACiAJICogVGhlIGdlbmVyYXRlZCB0eXBlIGhpZXJhcmNoeQogCSAqLwogCXByb3RlY3RlZCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHk7Ci0JCisKIC8qKgogICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZQogICogZ2l2ZW4gdHlwZSB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWdpb24sIGluIHRoZSBjb250ZXh0IG9mCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uLmphdmEKaW5kZXggZDVkYzdmZC4uZDJhMDU5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMiw4ICszMiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuSW5kZW50TWFuaXB1bGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7CiAKIC8qKgogICogSW1wbGVtZW50cyBmdW5jdGlvbmFsaXR5IGNvbW1vbiB0bwpAQCAtNzYsMTAgKzc0LDEwIEBACiAJCQlyZXR1cm4gVHlwZURlY2xhcmF0aW9uLkJPRFlfREVDTEFSQVRJT05TX1BST1BFUlRZOwogCX0KIH0KLXByb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworcHJvdGVjdGVkIEFTVE5vZGUgZ2VuZXJhdGVFbGVtZW50QVNUKEFTVFJld3JpdGUgcmV3cml0ZXIsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmICh0aGlzLmNyZWF0ZWROb2RlID09IG51bGwpIHsKLQkJdGhpcy5zb3VyY2UgPSByZW1vdmVJbmRlbnRBbmROZXdMaW5lcyh0aGlzLnNvdXJjZSwgZG9jdW1lbnQsIGN1KTsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCQl0aGlzLnNvdXJjZSA9IHJlbW92ZUluZGVudEFuZE5ld0xpbmVzKHRoaXMuc291cmNlLCBjdSk7CisJCUFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFM0KTsKIAkJcGFyc2VyLnNldFNvdXJjZSh0aGlzLnNvdXJjZS50b0NoYXJBcnJheSgpKTsKIAkJcGFyc2VyLnNldFByb2plY3QoZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0SmF2YVByb2plY3QoKSk7CiAJCXBhcnNlci5zZXRLaW5kKEFTVFBhcnNlci5LX0NMQVNTX0JPRFlfREVDTEFSQVRJT05TKTsKQEAgLTkxLDggKzg5LDE4IEBACiAJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DT05URU5UUykpOwogCQl9IGVsc2UgewogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQl0aGlzLmNyZWF0ZWROb2RlID0gKEFTVE5vZGUpIHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQljcmVhdGVkTm9kZVNvdXJjZSA9IHRoaXMuc291cmNlOworCQkJaWYgKCh0eXBlRGVjbGFyYXRpb24uZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuTUFMRk9STUVEKSAhPSAwKSB7CisJCQkJY3JlYXRlZE5vZGVTb3VyY2UgPSBnZW5lcmF0ZVN5bnRheEluY29ycmVjdEFTVCgpOworCQkJCWlmICh0aGlzLmNyZWF0ZWROb2RlID09IG51bGwpCisJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ09OVEVOVFMpKTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdCBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKKwkJCQlpZiAoYm9keURlY2xhcmF0aW9ucy5zaXplKCkgPT0gMCkgeworCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKSk7CisJCQkJfQorCQkJCXRoaXMuY3JlYXRlZE5vZGUgPSAoQVNUTm9kZSkgYm9keURlY2xhcmF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsKKwkJCQljcmVhdGVkTm9kZVNvdXJjZSA9IHRoaXMuc291cmNlOworCQkJfQogCQl9CiAJCWlmICh0aGlzLmFsdGVyZWROYW1lICE9IG51bGwpIHsKIAkJCVNpbXBsZU5hbWUgbmV3TmFtZSA9IHRoaXMuY3JlYXRlZE5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSh0aGlzLmFsdGVyZWROYW1lKTsKQEAgLTExMSw3ICsxMTksNyBAQAogCQkJCW5ld1NvdXJjZS5hcHBlbmQoY3JlYXRlZE5vZGVTb3VyY2Uuc3Vic3RyaW5nKGNyZWF0ZWROb2RlU3RhcnQsIG5hbWVTdGFydCkpOwogCQkJCW5ld1NvdXJjZS5hcHBlbmQodGhpcy5hbHRlcmVkTmFtZSk7CiAJCQkJbmV3U291cmNlLmFwcGVuZChjcmVhdGVkTm9kZVNvdXJjZS5zdWJzdHJpbmcobmFtZUVuZCwgY3JlYXRlZE5vZGVFbmQpKTsKLQkJCQkKKwogCQkJfQogCQkJdGhpcy5zb3VyY2UgPSBuZXdTb3VyY2UudG9TdHJpbmcoKTsKIAkJfQpAQCAtMTIwLDcgKzEyOCw3IEBACiAJLy8gcmV0dXJuIGEgc3RyaW5nIHBsYWNlIGhvbGRlciAoaW5zdGVhZCBvZiB0aGUgY3JlYXRlZCBub2RlKSBzbyBoYXMgdG8gbm90IGxvc2UgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcKIAlyZXR1cm4gcmV3cml0ZXIuY3JlYXRlU3RyaW5nUGxhY2Vob2xkZXIodGhpcy5zb3VyY2UsIHRoaXMuY3JlYXRlZE5vZGUuZ2V0Tm9kZVR5cGUoKSk7CiB9Ci1wcml2YXRlIFN0cmluZyByZW1vdmVJbmRlbnRBbmROZXdMaW5lcyhTdHJpbmcgY29kZSwgSURvY3VtZW50IGRvY3VtZW50LCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Citwcml2YXRlIFN0cmluZyByZW1vdmVJbmRlbnRBbmROZXdMaW5lcyhTdHJpbmcgY29kZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSUphdmFQcm9qZWN0IHByb2plY3QgPSBjdS5nZXRKYXZhUHJvamVjdCgpOwogCU1hcCBvcHRpb25zID0gcHJvamVjdC5nZXRPcHRpb25zKHRydWUvKmluaGVyaXQgSmF2YUNvcmUgb3B0aW9ucyovKTsKIAlpbnQgdGFiV2lkdGggPSBJbmRlbnRNYW5pcHVsYXRpb24uZ2V0VGFiV2lkdGgob3B0aW9ucyk7CkBAIC0xMzUsNyArMTQzLDcgQEAKIAl3aGlsZSAobGFzdE5vbldoaXRlU3BhY2UgPiAwKQogCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKGNvZGUuY2hhckF0KC0tbGFzdE5vbldoaXRlU3BhY2UpKSkKIAkJCWJyZWFrOwotCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCk7CisJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBjdS5maW5kUmVjb21tZW5kZWRMaW5lU2VwYXJhdG9yKCk7CiAJcmV0dXJuIEluZGVudE1hbmlwdWxhdGlvbi5jaGFuZ2VJbmRlbnQoY29kZS5zdWJzdHJpbmcoZmlyc3ROb25XaGl0ZVNwYWNlLCBsYXN0Tm9uV2hpdGVTcGFjZSsxKSwgaW5kZW50LCB0YWJXaWR0aCwgaW5kZW50V2lkdGgsICIiLCBsaW5lRGVsaW1pdGVyKTsgLy8kTk9OLU5MUy0xJAogfQogLyoKQEAgLTE1Niw3ICsxNjQsNyBAQAogCWJ1ZmYuYXBwZW5kKGxpbmVTZXBhcmF0b3IgKyAiIHB1YmxpYyBjbGFzcyBBIHsiICsgbGluZVNlcGFyYXRvcik7IC8vJE5PTi1OTFMtMSQKIAlidWZmLmFwcGVuZCh0aGlzLnNvdXJjZSk7CiAJYnVmZi5hcHBlbmQobGluZVNlcGFyYXRvcikuYXBwZW5kKCd9Jyk7Ci0JQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCUFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFM0KTsKIAlwYXJzZXIuc2V0U291cmNlKGJ1ZmYudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKTsKIAlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgY29tcGlsYXRpb25Vbml0LnR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CkBAIC0xOTUsMTcgKzIwMywxNyBAQAogCWlmICh0aGlzLnNvdXJjZSA9PSBudWxsKSB7CiAJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DT05URU5UUyk7CiAJfQotCWlmICghZm9yY2UpIHsKKwlpZiAoIXRoaXMuZm9yY2UpIHsKIAkJLy9jaGVjayBmb3IgbmFtZSBjb2xsaXNpb25zCiAJCXRyeSB7CiAJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQlnZW5lcmF0ZUVsZW1lbnRBU1QobnVsbCwgZ2V0RG9jdW1lbnQoY3UpLCBjdSk7CisJCQlnZW5lcmF0ZUVsZW1lbnRBU1QobnVsbCwgY3UpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CiAJCQlyZXR1cm4gam1lLmdldEphdmFNb2RlbFN0YXR1cygpOwogCQl9CiAJCXJldHVybiB2ZXJpZnlOYW1lQ29sbGlzaW9uKCk7CiAJfQotCQorCiAJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIH0KIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhCmluZGV4IDc5YTA4MzEuLmY5ZjZlYjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKIAogLyoqCiAgKiA8cD5UaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLgpAQCAtNDAsOCArMzksOCBAQAogcHVibGljIENyZWF0ZVR5cGVPcGVyYXRpb24oSUphdmFFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZm9yY2UpIHsKIAlzdXBlcihwYXJlbnRFbGVtZW50LCBzb3VyY2UsIGZvcmNlKTsKIH0KLXByb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUFTVE5vZGUgbm9kZSA9IHN1cGVyLmdlbmVyYXRlRWxlbWVudEFTVChyZXdyaXRlciwgZG9jdW1lbnQsIGN1KTsKK3Byb3RlY3RlZCBBU1ROb2RlIGdlbmVyYXRlRWxlbWVudEFTVChBU1RSZXdyaXRlIHJld3JpdGVyLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBU1ROb2RlIG5vZGUgPSBzdXBlci5nZW5lcmF0ZUVsZW1lbnRBU1QocmV3cml0ZXIsIGN1KTsKIAlpZiAoIShub2RlIGluc3RhbmNlb2YgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pKQogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKSk7CiAJcmV0dXJuIG5vZGU7CkBAIC01Nyw3ICs1Niw3IEBACiAJCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KXBhcmVudCkuZ2V0VHlwZShnZXRBU1ROb2RlTmFtZSgpKTsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKIAkJCXJldHVybiAoKElUeXBlKXBhcmVudCkuZ2V0VHlwZShnZXRBU1ROb2RlTmFtZSgpKTsKLQkJLy8gTm90ZTogY3JlYXRpbmcgbG9jYWwvYW5vbnltb3VzIHR5cGUgaXMgbm90IHN1cHBvcnRlZCAKKwkJLy8gTm90ZTogY3JlYXRpbmcgbG9jYWwvYW5vbnltb3VzIHR5cGUgaXMgbm90IHN1cHBvcnRlZAogCX0KIAlyZXR1cm4gbnVsbDsKIH0KQEAgLTY1LDcgKzY0LDcgQEAKICAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lKCkKICAqLwogcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsKLQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2NyZWF0ZVR5cGVQcm9ncmVzczsgCisJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9jcmVhdGVUeXBlUHJvZ3Jlc3M7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIDxjb2RlPklUeXBlPC9jb2RlPiB0aGUgbWVtYmVyIGlzIHRvIGJlIGNyZWF0ZWQgaW4uCkBAIC04NywxOSArODYsMzMgQEAKIAkJCVN0cmluZyB0eXBlTmFtZSA9IGdldEFTVE5vZGVOYW1lKCk7CiAJCQlpZiAoKChJQ29tcGlsYXRpb25Vbml0KSBwYXJlbnQpLmdldFR5cGUodHlwZU5hbWUpLmV4aXN0cygpKSB7CiAJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAotCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCB0eXBlTmFtZSkpOyAKKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwKKwkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfbmFtZUNvbGxpc2lvbiwgdHlwZU5hbWUpKTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgogCQkJdHlwZU5hbWUgPSBnZXRBU1ROb2RlTmFtZSgpOwogCQkJaWYgKCgoSVR5cGUpIHBhcmVudCkuZ2V0VHlwZSh0eXBlTmFtZSkuZXhpc3RzKCkpIHsKIAkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCi0JCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sIHR5cGVOYW1lKSk7IAorCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLAorCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19uYW1lQ29sbGlzaW9uLCB0eXBlTmFtZSkpOwogCQkJfQogCQkJYnJlYWs7Ci0JCS8vIE5vdGU6IGNyZWF0aW5nIGxvY2FsL2Fub255bW91cyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgCisJCS8vIE5vdGU6IGNyZWF0aW5nIGxvY2FsL2Fub255bW91cyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK3B1YmxpYyBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZlcmlmeSgpOworCWlmICghc3RhdHVzLmlzT0soKSkKKwkJcmV0dXJuIHN0YXR1czsKKwl0cnkgeworCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZ2V0UGFyZW50RWxlbWVudCgpOworCQlpZiAodGhpcy5hbmNob3JFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5hbmNob3JFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxECisJCQkJJiYgcGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUgJiYgKChJVHlwZSlwYXJlbnQpLmlzRW51bSgpKQorCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1NJQkxJTkcsIHRoaXMuYW5jaG9yRWxlbWVudCk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CiAJfQogCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWZhdWx0V29ya2luZ0NvcHlPd25lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuamF2YQppbmRleCBmZjE3NDQ1Li5lYzYwN2RmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWZhdWx0V29ya2luZ0NvcHlPd25lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlZmF1bHRXb3JraW5nQ29weU93bmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMTEgKzE5LDExIEBACiAgKiBJdCBhbHNvIGRlZmluZXMgdGhlIFBSSU1BUlkgd29ya2luZyBjb3B5IG93bmVyIHRoYXQgaXMgdXNlZCBieSBKRFQvQ29yZS4KICAqLwogcHVibGljIGNsYXNzIERlZmF1bHRXb3JraW5nQ29weU93bmVyIGV4dGVuZHMgV29ya2luZ0NvcHlPd25lciB7Ci0JCisKIAlwdWJsaWMgV29ya2luZ0NvcHlPd25lciBwcmltYXJ5QnVmZmVyUHJvdmlkZXI7Ci0JCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBEZWZhdWx0V29ya2luZ0NvcHlPd25lciBQUklNQVJZID0gIG5ldyBEZWZhdWx0V29ya2luZ0NvcHlPd25lcigpOwotCQorCiAJcHJpdmF0ZSBEZWZhdWx0V29ya2luZ0NvcHlPd25lcigpIHsKIAkJLy8gb25seSBvbmUgaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCAyYmNjMzQ5Li5jMTUxZTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjksOCArMjksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKIAogLyoqCkBAIC00OSw3ICs0Nyw3IEBACiAJICogQHNlZSAjcHJvY2Vzc0VsZW1lbnRzKCkgS2V5cyBhcmUgY29tcGlsYXRpb24gdW5pdHMsCiAJICogdmFsdWVzIGFyZSA8Y29kZT5JUmVnaW9uPC9jb2RlPnMgb2YgZWxlbWVudHMgdG8gYmUgcHJvY2Vzc2VkIGluIGVhY2gKIAkgKiBjb21waWxhdGlvbiB1bml0LgotCSAqLyAKKwkgKi8KIAlwcm90ZWN0ZWQgTWFwIGNoaWxkcmVuVG9SZW1vdmU7CiAJLyoqCiAJICogVGhlIDxjb2RlPkFTVFBhcnNlcjwvY29kZT4gdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzb3VyY2UgY29kZSBvZgpAQCAtNjUsMzYgKzYzLDMxIEBACiAJCXN1cGVyKGVsZW1lbnRzVG9EZWxldGUsIGZvcmNlKTsKIAkJaW5pdEFTVFBhcnNlcigpOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBkZWxldGVFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50VG9SZW1vdmUsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkvLyBlbnN1cmUgY3UgaXMgY29uc2lzdGVudCAobm9vcCBpZiBhbHJlYWR5IGNvbnNpc3RlbnQpCiAJCWN1Lm1ha2VDb25zaXN0ZW50KHRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJdGhpcy5wYXJzZXIuc2V0U291cmNlKGN1KTsKIAkJQ29tcGlsYXRpb25Vbml0IGFzdENVID0gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5wYXJzZXIuY3JlYXRlQVNUKHRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJQVNUTm9kZSBub2RlID0gKChKYXZhRWxlbWVudCkgZWxlbWVudFRvUmVtb3ZlKS5maW5kTm9kZShhc3RDVSk7Ci0JCWlmIChub2RlID09IG51bGwpIAorCQlpZiAobm9kZSA9PSBudWxsKQogCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkZhaWxlZCB0byBsb2NhdGUgIiArIGVsZW1lbnRUb1JlbW92ZS5nZXRFbGVtZW50TmFtZSgpICsgIiBpbiAiICsgY3UuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KGN1KTsKIAkJQVNUIGFzdCA9IGFzdENVLmdldEFTVCgpOwogCQlBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKIAkJcmV3cml0ZXIucmVtb3ZlKG5vZGUsIG51bGwpOwotIAkJVGV4dEVkaXQgZWRpdHMgPSByZXdyaXRlci5yZXdyaXRlQVNUKGRvY3VtZW50LCBudWxsKTsKLSAJCXRyeSB7Ci0JIAkJZWRpdHMuYXBwbHkoZG9jdW1lbnQpOwotIAkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKTsKLSAJCX0KKyAJCVRleHRFZGl0IGVkaXRzID0gcmV3cml0ZXIucmV3cml0ZUFTVCgpOworIAkJYXBwbHlUZXh0RWRpdChjdSwgZWRpdHMpOwogCX0KIAogCXByaXZhdGUgdm9pZCBpbml0QVNUUGFyc2VyKCkgewotCQl0aGlzLnBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworCQl0aGlzLnBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzQpOwogCX0KIAogCS8qKgogCSAqIEBzZWUgTXVsdGlPcGVyYXRpb24KIAkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9kZWxldGVFbGVtZW50UHJvZ3Jlc3M7IAorCQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2RlbGV0ZUVsZW1lbnRQcm9ncmVzczsKIAl9CiAJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpIHsKIAkJaWYgKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3MgIT0gbnVsbCAmJiB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAxKSB7CkBAIC0xMTEsMjggKzEwNCwyOCBAQAogCSAqIGR1cGxpY2F0ZXMgc3BlY2lmaWVkIGluIGVsZW1lbnRzIHRvIGJlIHByb2Nlc3NlZC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBncm91cEVsZW1lbnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWNoaWxkcmVuVG9SZW1vdmUgPSBuZXcgSGFzaE1hcCgxKTsKKwkJdGhpcy5jaGlsZHJlblRvUmVtb3ZlID0gbmV3IEhhc2hNYXAoMSk7CiAJCWludCB1bmlxdWVDVXMgPSAwOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBlID0gZWxlbWVudHNUb1Byb2Nlc3NbaV07CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgZSA9IHRoaXMuZWxlbWVudHNUb1Byb2Nlc3NbaV07CiAJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0Rm9yKGUpOwogCQkJaWYgKGN1ID09IG51bGwpIHsKIAkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIGUpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJSVJlZ2lvbiByZWdpb24gPSAoSVJlZ2lvbikgY2hpbGRyZW5Ub1JlbW92ZS5nZXQoY3UpOworCQkJCUlSZWdpb24gcmVnaW9uID0gKElSZWdpb24pIHRoaXMuY2hpbGRyZW5Ub1JlbW92ZS5nZXQoY3UpOwogCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewogCQkJCQlyZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQkJCWNoaWxkcmVuVG9SZW1vdmUucHV0KGN1LCByZWdpb24pOworCQkJCQl0aGlzLmNoaWxkcmVuVG9SZW1vdmUucHV0KGN1LCByZWdpb24pOwogCQkJCQl1bmlxdWVDVXMgKz0gMTsKIAkJCQl9CiAJCQkJcmVnaW9uLmFkZChlKTsKIAkJCX0KIAkJfQotCQllbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbdW5pcXVlQ1VzXTsKLQkJSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuVG9SZW1vdmUua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJdGhpcy5lbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbdW5pcXVlQ1VzXTsKKwkJSXRlcmF0b3IgaXRlciA9IHRoaXMuY2hpbGRyZW5Ub1JlbW92ZS5rZXlTZXQoKS5pdGVyYXRvcigpOwogCQlpbnQgaSA9IDA7CiAJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZWxlbWVudHNUb1Byb2Nlc3NbaSsrXSA9IChJSmF2YUVsZW1lbnQpIGl0ZXIubmV4dCgpOworCQkJdGhpcy5lbGVtZW50c1RvUHJvY2Vzc1tpKytdID0gKElKYXZhRWxlbWVudCkgaXRlci5uZXh0KCk7CiAJCX0KIAl9CiAJLyoqCkBAIC0xNDEsMTMgKzEzNCwxMyBAQAogCSAqLwogCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotCQorCiAJCS8vIGtlZXAgdHJhY2sgb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnRzIC0gaWYgYWxsIGFyZSByZW1vdmVkLCBkZWxldGUKIAkJLy8gdGhlIGltcG9ydCBjb250YWluZXIgKGFuZCByZXBvcnQgaXQgaW4gdGhlIGRlbHRhKQogCQlpbnQgbnVtYmVyT2ZJbXBvcnRzID0gY3UuZ2V0SW1wb3J0cygpLmxlbmd0aDsKLQkKKwogCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoY3UpOwotCQlJSmF2YUVsZW1lbnRbXSBjdUVsZW1lbnRzID0gKChJUmVnaW9uKSBjaGlsZHJlblRvUmVtb3ZlLmdldChjdSkpLmdldEVsZW1lbnRzKCk7CisJCUlKYXZhRWxlbWVudFtdIGN1RWxlbWVudHMgPSAoKElSZWdpb24pIHRoaXMuY2hpbGRyZW5Ub1JlbW92ZS5nZXQoY3UpKS5nZXRFbGVtZW50cygpOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY3VFbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSUphdmFFbGVtZW50IGUgPSBjdUVsZW1lbnRzW2ldOwogCQkJaWYgKGUuZXhpc3RzKCkpIHsKQEAgLTE2Miw3ICsxNTUsNyBAQAogCQkJfQogCQl9CiAJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJY3Uuc2F2ZShnZXRTdWJQcm9ncmVzc01vbml0b3IoMSksIGZvcmNlKTsKKwkJCWN1LnNhdmUoZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpLCB0aGlzLmZvcmNlKTsKIAkJCWlmICghY3UuaXNXb3JraW5nQ29weSgpKSB7IC8vIGlmIHVuaXQgaXMgd29ya2luZyBjb3B5LCB0aGVuIHNhdmUgd2lsbCBoYXZlIGFscmVhZHkgZmlyZWQgdGhlIGRlbHRhCiAJCQkJYWRkRGVsdGEoZGVsdGEpOwogCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CkBAIC0xODIsNyArMTc1LDcgQEAKIAkgKiBAc2VlIE11bHRpT3BlcmF0aW9uCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElSZWdpb24pIGNoaWxkcmVuVG9SZW1vdmUuZ2V0KGVsZW1lbnQpKS5nZXRFbGVtZW50cygpOworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSVJlZ2lvbikgdGhpcy5jaGlsZHJlblRvUmVtb3ZlLmdldChlbGVtZW50KSkuZ2V0RWxlbWVudHMoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogCQkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07CiAJCQlpZiAoY2hpbGQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24uamF2YQppbmRleCBjNmJlMjI2Li43ZTBlZmY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDMwICsyNywzMCBAQAogCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290LAogCQlpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywKIAkJaW50IHVwZGF0ZU1vZGVsRmxhZ3MpIHsKLQkJCQorCiAJCXN1cGVyKHJvb3QpOwogCQl0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MgPSB1cGRhdGVSZXNvdXJjZUZsYWdzOwogCQl0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgPSB1cGRhdGVNb2RlbEZsYWdzOwogCX0KIAogCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpdGhpcy5nZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CiAJCUlDbGFzc3BhdGhFbnRyeSByb290RW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQorCiAJCS8vIHJlbWVtYmVyIG9sZHMgcm9vdHMKIAkJRGVsdGFQcm9jZXNzb3IgZGVsdGFQcm9jZXNzb3IgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXREZWx0YVByb2Nlc3NvcigpOwogCQlpZiAoZGVsdGFQcm9jZXNzb3Iub2xkUm9vdHMgPT0gbnVsbCkKIAkJCWRlbHRhUHJvY2Vzc29yLm9sZFJvb3RzID0gbmV3IEhhc2hNYXAoKTsKLQkJCisKIAkJLy8gdXBkYXRlIGNsYXNzcGF0aCBpZiBuZWVkZWQKLQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgpICE9IDApIHsKKwkJaWYgKCh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5PUklHSU5BVElOR19QUk9KRUNUX0NMQVNTUEFUSCkgIT0gMCkgewogCQkJdXBkYXRlUHJvamVjdENsYXNzcGF0aChyb290RW50cnkuZ2V0UGF0aCgpLCByb290LmdldEphdmFQcm9qZWN0KCksIGRlbHRhUHJvY2Vzc29yLm9sZFJvb3RzKTsKIAkJfQotCQlpZiAoKHVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5PVEhFUl9SRUZFUlJJTkdfUFJPSkVDVFNfQ0xBU1NQQVRIKSAhPSAwKSB7CisJCWlmICgodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1RIRVJfUkVGRVJSSU5HX1BST0pFQ1RTX0NMQVNTUEFUSCkgIT0gMCkgewogCQkJdXBkYXRlUmVmZXJyaW5nUHJvamVjdENsYXNzcGF0aHMocm9vdEVudHJ5LmdldFBhdGgoKSwgcm9vdC5nZXRKYXZhUHJvamVjdCgpLCBkZWx0YVByb2Nlc3Nvci5vbGRSb290cyk7CiAJCX0KLQkJCisKIAkJLy8gZGVsZXRlIHJlc291cmNlCiAJCWlmICghcm9vdC5pc0V4dGVybmFsKCkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk5PX1JFU09VUkNFX01PRElGSUNBVElPTikgPT0gMCkgewogCQkJZGVsZXRlUmVzb3VyY2Uocm9vdCwgcm9vdEVudHJ5KTsKQEAgLTYyLDEwICs2MiwxMCBAQAogCQlJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5KQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSAoKENsYXNzcGF0aEVudHJ5KXJvb3RFbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOwotCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcm9vdC5nZXRSZXNvdXJjZSgpOworCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gKChKYXZhRWxlbWVudCkgcm9vdCkucmVzb3VyY2UoKTsKIAkJaWYgKHJvb3RFbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSB8fCBleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CiAJCQl0cnkgewotCQkJCXJvb3RSZXNvdXJjZS5kZWxldGUodGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCXJvb3RSZXNvdXJjZS5kZWxldGUodGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQkJfQpAQCAtODAsMTEgKzgwLDExIEBACiAJCQkJCQkJcmV0dXJuICFlcXVhbHNPbmVPZihwYXRoLCBuZXN0ZWRGb2xkZXJzKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJLy8gc3VidHJlZSBkb2Vzbid0IGNvbnRhaW4gYW55IG5lc3RlZCBzb3VyY2UgZm9sZGVycwotCQkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmRlbGV0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmRlbGV0ZShEZWxldGVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewotCQkJCQkJcHJveHkucmVxdWVzdFJlc291cmNlKCkuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5kZWxldGUoRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIERlbGV0ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQl9CiAJCQkJfQpAQCAtOTUsNyArOTUsNyBAQAogCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJCQl9CiAJCX0KLQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJfQogCiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSAqIERlbGV0ZXMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGVxdWFscyB0byB0aGUgZ2l2ZW4gcm9vdFBhdGggZnJvbSBhbGwgSmF2YSBwcm9qZWN0cy4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWZlcnJpbmdQcm9qZWN0Q2xhc3NwYXRocyhJUGF0aCByb290UGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QsIE1hcCBvbGRSb290cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSB0aGlzLmdldEphdmFNb2RlbCgpOworCQlJSmF2YU1vZGVsIG1vZGVsID0gZ2V0SmF2YU1vZGVsKCk7CiAJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RDbGFzc3BhdGgoSVBhdGggcm9vdFBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBNYXAgb2xkUm9vdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkvLyByZW1lbWJlciBvbGQgcm9vdHMKIAkJb2xkUm9vdHMucHV0KHByb2plY3QsIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7Ci0JCQorCiAJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CiAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG51bGw7CiAJCWludCBjcExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7CkBAIC0xMzksMjAgKzEzOSwyMCBAQAogCQkJaWYgKG5ld0NQSW5kZXggPCBuZXdDbGFzc3BhdGgubGVuZ3RoKSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weShuZXdDbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q1BJbmRleF0sIDAsIG5ld0NQSW5kZXgpOwogCQkJfQotCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBwcm9ncmVzc01vbml0b3IpOworCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCX0KLQl9CQorCX0KIAlwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CiAJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gc3VwZXIudmVyaWZ5KCk7CiAJCWlmICghc3RhdHVzLmlzT0soKSkgewogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSB0aGlzLmdldEVsZW1lbnRUb1Byb2Nlc3MoKTsKKwkJSUphdmFFbGVtZW50IHJvb3QgPSBnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CiAJCWlmIChyb290ID09IG51bGwgfHwgIXJvb3QuZXhpc3RzKCkpIHsKIAkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgcm9vdCk7CiAJCX0KIAotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9ICgoSmF2YUVsZW1lbnQpIHJvb3QpLnJlc291cmNlKCk7CiAJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKIAkJCWlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKSB7CiAJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1JFU09VUkNFLCByb290KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCA3ZDBjN2FlLi43NzA5YTRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDkgKzExLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwpAQCAtNDMsNyArNDAsNyBAQAogICovCiBwcml2YXRlIHZvaWQgZGVsZXRlUGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQgZnJhZykKIAl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUmVzb3VyY2UgcmVzID0gZnJhZy5nZXRSZXNvdXJjZSgpOworCUlSZXNvdXJjZSByZXMgPSAoKEphdmFFbGVtZW50KSBmcmFnKS5yZXNvdXJjZSgpOwogCWlmIChyZXMgIT0gbnVsbCkgewogCQkvLyBjb2xsZWN0IHRoZSBjaGlsZHJlbiB0byByZW1vdmUKIAkJSUphdmFFbGVtZW50W10gY2hpbGRyZW5PZkludGVyZXN0ID0gZnJhZy5nZXRDaGlsZHJlbigpOwpAQCAtNTEsOSArNDgsOSBAQAogCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtjaGlsZHJlbk9mSW50ZXJlc3QubGVuZ3RoXTsKIAkJCS8vIHJlbW92ZSB0aGUgY2hpbGRyZW4KIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5PZkludGVyZXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzb3VyY2VzW2ldID0gY2hpbGRyZW5PZkludGVyZXN0W2ldLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOworCQkJCXJlc291cmNlc1tpXSA9ICgoSmF2YUVsZW1lbnQpIGNoaWxkcmVuT2ZJbnRlcmVzdFtpXSkucmVzb3VyY2UoKTsKIAkJCX0KLQkJCWRlbGV0ZVJlc291cmNlcyhyZXNvdXJjZXMsIGZvcmNlKTsKKwkJCWRlbGV0ZVJlc291cmNlcyhyZXNvdXJjZXMsIHRoaXMuZm9yY2UpOwogCQl9CiAKIAkJLy8gRGlzY2FyZCBub24tamF2YSByZXNvdXJjZXMKQEAgLTY2LDggKzYzLDggQEAKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoLCBpbmRleCA9IDA7IGkgPCBtYXg7IGkrKyl7CiAJCQlpZiAobm9uSmF2YVJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgYWN0dWFsTm9uSmF2YVJlc291cmNlc1tpbmRleCsrXSA9IChJUmVzb3VyY2Upbm9uSmF2YVJlc291cmNlc1tpXTsKIAkJfQotCQlkZWxldGVSZXNvdXJjZXMoYWN0dWFsTm9uSmF2YVJlc291cmNlcywgZm9yY2UpOwotCQkKKwkJZGVsZXRlUmVzb3VyY2VzKGFjdHVhbE5vbkphdmFSZXNvdXJjZXMsIHRoaXMuZm9yY2UpOworCiAJCS8vIGRlbGV0ZSByZW1haW5pbmcgZmlsZXMgaW4gdGhpcyBwYWNrYWdlICguY2xhc3MgZmlsZSBpbiB0aGUgY2FzZSB3aGVyZSBQcm9qPXNyYz1iaW4pCiAJCUlSZXNvdXJjZVtdIHJlbWFpbmluZ0ZpbGVzOwogCQl0cnkgewpAQCAtNzksMTQgKzc2LDE0IEBACiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZW1haW5pbmdGaWxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSVJlc291cmNlIGZpbGUgPSByZW1haW5pbmdGaWxlc1tpXTsKIAkJCWlmIChmaWxlIGluc3RhbmNlb2YgSUZpbGUgJiYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJdGhpcy5kZWxldGVSZXNvdXJjZShmaWxlLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKKwkJCQlkZWxldGVSZXNvdXJjZShmaWxlLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKIAkJCX0gZWxzZSB7CiAJCQkJaXNFbXB0eSA9IGZhbHNlOwogCQkJfQogCQl9CiAJCWlmIChpc0VtcHR5ICYmICFmcmFnLmlzRGVmYXVsdFBhY2thZ2UoKS8qZG9uJ3QgZGVsZXRlIGRlZmF1bHQgcGFja2FnZSdzIGZvbGRlcjogc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODQ1MCovKSB7CiAJCQkvLyBkZWxldGUgcmVjdXJzaXZlbHkgZW1wdHkgZm9sZGVycwotCQkJSVJlc291cmNlIGZyYWdSZXNvdXJjZSA9ICBmcmFnLmdldFJlc291cmNlKCk7CisJCQlJUmVzb3VyY2UgZnJhZ1Jlc291cmNlID0gICgoSmF2YUVsZW1lbnQpIGZyYWcpLnJlc291cmNlKCk7CiAJCQlpZiAoZnJhZ1Jlc291cmNlICE9IG51bGwpIHsKIAkJCQlkZWxldGVFbXB0eVBhY2thZ2VGcmFnbWVudChmcmFnLCBmYWxzZSwgZnJhZ1Jlc291cmNlLmdldFBhcmVudCgpKTsKIAkJCX0KQEAgLTk3LDcgKzk0LDcgQEAKICAqIEBzZWUgTXVsdGlPcGVyYXRpb24KICAqLwogcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7Ci0JcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9kZWxldGVSZXNvdXJjZVByb2dyZXNzOyAKKwlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX2RlbGV0ZVJlc291cmNlUHJvZ3Jlc3M7CiB9CiAvKioKICAqIEBzZWUgTXVsdGlPcGVyYXRpb24gVGhpcyBtZXRob2QgZGVsZWdhdGUgdG8gPGNvZGU+ZGVsZXRlUmVzb3VyY2U8L2NvZGU+IG9yCkBAIC0xMDcsNyArMTA0LDcgQEAKIAlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewogCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKIAkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQlkZWxldGVSZXNvdXJjZShlbGVtZW50LmdldFJlc291cmNlKCksIGZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOworCQkJZGVsZXRlUmVzb3VyY2UoZWxlbWVudC5nZXRSZXNvdXJjZSgpLCB0aGlzLmZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgogCQkJZGVsZXRlUGFja2FnZUZyYWdtZW50KChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50KTsKQEAgLTEzMiw3ICsxMjksNyBAQAogCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CiAJZWxzZSBpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50KQogCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7Ci0JSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRSZXNvdXJjZSgpOworCUlSZXNvdXJjZSByZXNvdXJjZSA9ICgoSmF2YUVsZW1lbnQpIGVsZW1lbnQpLnJlc291cmNlKCk7CiAJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewogCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgewogCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1JFU09VUkNFLCBlbGVtZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc2luZ1N0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3NpbmdTdGF0ZS5qYXZhCmluZGV4IDE5ZjUwYzEuLjZmOTQzODYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc2luZ1N0YXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzaW5nU3RhdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywyMCArMjMsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgogICogS2VlcCB0aGUgZ2xvYmFsIHN0YXRlcyB1c2VkIGR1cmluZyBKYXZhIGVsZW1lbnQgZGVsdGEgcHJvY2Vzc2luZy4KICAqLwogcHVibGljIGNsYXNzIERlbHRhUHJvY2Vzc2luZ1N0YXRlIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQorCiAJLyoKIAkgKiBDb2xsZWN0aW9uIG9mIGxpc3RlbmVycyBmb3IgSmF2YSBlbGVtZW50IGRlbHRhcwogCSAqLwogCXB1YmxpYyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcltdIGVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IElFbGVtZW50Q2hhbmdlZExpc3RlbmVyWzVdOwogCXB1YmxpYyBpbnRbXSBlbGVtZW50Q2hhbmdlZExpc3RlbmVyTWFza3MgPSBuZXcgaW50WzVdOwogCXB1YmxpYyBpbnQgZWxlbWVudENoYW5nZWRMaXN0ZW5lckNvdW50ID0gMDsKLQkKKwogCS8qCiAJICogQ29sbGVjdGlvbiBvZiBwcmUgSmF2YSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXJzCiAJICovCkBAIC00OSw0OSArNTAsNzEgQEAKIAkgKi8KIAlwcml2YXRlIFRocmVhZExvY2FsIGRlbHRhUHJvY2Vzc29ycyA9IG5ldyBUaHJlYWRMb2NhbCgpOwogCQorCXB1YmxpYyB2b2lkIGRvTm90VXNlKCkgeworCQkvLyByZXNldCB0aGUgZGVsdGEgcHJvY2Vzc29yIG9mIHRoZSBjdXJyZW50IHRocmVhZCB0byBhdm9pZCB0byBrZWVwIGl0IGluIG1lbW9yeQorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY5NDc2CisJCXRoaXMuZGVsdGFQcm9jZXNzb3JzLnNldChudWxsKTsKKwl9CisKIAkvKiBBIHRhYmxlIGZyb20gSVBhdGggKGZyb20gYSBjbGFzc3BhdGggZW50cnkpIHRvIERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvICovCiAJcHVibGljIEhhc2hNYXAgcm9vdHMgPSBuZXcgSGFzaE1hcCgpOwotCQorCiAJLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBBcnJheUxpc3Qgb2YgRGVsdGFQcm9jZXNzb3IuUm9vdEluZm8KIAkgKiBVc2VkIHdoZW4gYW4gSVBhdGggY29ycmVzcG9uZHMgdG8gbW9yZSB0aGFuIG9uZSByb290ICovCiAJcHVibGljIEhhc2hNYXAgb3RoZXJSb290cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCisKIAkvKiBBIHRhYmxlIGZyb20gSVBhdGggKGZyb20gYSBjbGFzc3BhdGggZW50cnkpIHRvIERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvCiAJICogZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBkZWx0YSBwcm9jZXNzb3Igd2FzIGludm9rZWQuICovCiAJcHVibGljIEhhc2hNYXAgb2xkUm9vdHMgPSBuZXcgSGFzaE1hcCgpOwotCQorCiAJLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBBcnJheUxpc3Qgb2YgRGVsdGFQcm9jZXNzb3IuUm9vdEluZm8KIAkgKiBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGRlbHRhIHByb2Nlc3NvciB3YXMgaW52b2tlZC4KIAkgKiBVc2VkIHdoZW4gYW4gSVBhdGggY29ycmVzcG9uZHMgdG8gbW9yZSB0aGFuIG9uZSByb290ICovCiAJcHVibGljIEhhc2hNYXAgb2xkT3RoZXJSb290cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCisKIAkvKiBBIHRhYmxlIGZyb20gSVBhdGggKGEgc291cmNlIGF0dGFjaG1lbnQgcGF0aCBmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBJUGF0aCAoYSByb290IHBhdGgpICovCiAJcHVibGljIEhhc2hNYXAgc291cmNlQXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQorCiAJLyogQSB0YWJsZSBmcm9tIElKYXZhUHJvamVjdCB0byBJSmF2YVByb2plY3RbXSAodGhlIGxpc3Qgb2YgZGlyZWN0IGRlcGVuZGVudCBvZiB0aGUga2V5KSAqLwogCXB1YmxpYyBIYXNoTWFwIHByb2plY3REZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOwogCiAJLyogV2hldGhlciB0aGUgcm9vdHMgdGFibGVzIHNob3VsZCBiZSByZWNvbXB1dGVkICovCiAJcHVibGljIGJvb2xlYW4gcm9vdHNBcmVTdGFsZSA9IHRydWU7Ci0JCisKIAkvKiBUaHJlYWRzIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGluaXRpYWxpemVSb290cygpICovCi0JcHJpdmF0ZSBTZXQgaW5pdGlhbGl6aW5nVGhyZWFkcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldCgpKTsJCi0JCisJcHJpdmF0ZSBTZXQgaW5pdGlhbGl6aW5nVGhyZWFkcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldCgpKTsKKwogCS8qIEEgdGFibGUgZnJvbSBmaWxlIHN5c3RlbSBhYnNvdWx0ZSBwYXRoIChTdHJpbmcpIHRvIHRpbWVzdGFtcCAoTG9uZykgKi8KIAlwdWJsaWMgSGFzaHRhYmxlIGV4dGVybmFsVGltZVN0YW1wczsKLQkKKworCS8qCisJICogTWFwIGZyb20gSVByb2plY3QgdG8gQ2xhc3NwYXRoQ2hhbmdlCisJICogTm90ZSB0aGVzZSBjaGFuZ2VzIG5lZWQgdG8gYmUga2VwdCBvbiB0aGUgZGVsdGEgcHJvY2Vzc2luZyBzdGF0ZSB0byBlbnN1cmUgd2UgZG9uJ3QgbG9vc2UgdGhlbQorCSAqIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTEwMiBKYXZhIG1vZGVsIGNvcnJ1cHQgYWZ0ZXIgc3dpdGNoaW5nIHRhcmdldCBwbGF0Zm9ybSkKKwkgKi8KKwlwcml2YXRlIEhhc2hNYXAgY2xhc3NwYXRoQ2hhbmdlcyA9IG5ldyBIYXNoTWFwKCk7CisKIAkvKiBBIHRhYmxlIGZyb20gSmF2YVByb2plY3QgdG8gQ2xhc3NwYXRoVmFsaWRhdGlvbiAqLwogCXByaXZhdGUgSGFzaE1hcCBjbGFzc3BhdGhWYWxpZGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCisKIAkvKiBBIHRhYmxlIGZyb20gSmF2YVByb2plY3QgdG8gUHJvamVjdFJlZmVyZW5jZUNoYW5nZSAqLwotCXByaXZhdGUgSGFzaE1hcCBwcm9qZWN0UmVmZXJlbmNlQ2hhbmdlcz0gbmV3IEhhc2hNYXAoKTsKKwlwcml2YXRlIEhhc2hNYXAgcHJvamVjdFJlZmVyZW5jZUNoYW5nZXMgPSBuZXcgSGFzaE1hcCgpOworCisJLyogQSB0YWJsZSBmcm9tIEphdmFQcm9qZWN0IHRvIEV4dGVybmFsRm9sZGVyQ2hhbmdlICovCisJcHJpdmF0ZSBIYXNoTWFwIGV4dGVybmFsRm9sZGVyQ2hhbmdlcyA9IG5ldyBIYXNoTWFwKCk7CiAKIAkvKioKLQkgKiBXb3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAgCisJICogV29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQKIAkgKiBUaGlzIGlzIGEgY2FjaGUgb2YgdGhlIHByb2plY3RzIGJlZm9yZSBhbnkgcHJvamVjdCBhZGRpdGlvbi9kZWxldGlvbiBoYXMgc3RhcnRlZC4KIAkgKi8KIAlwcml2YXRlIEhhc2hTZXQgamF2YVByb2plY3ROYW1lc0NhY2hlOwotCQorCisJLyoKKwkgKiBBIGxpc3Qgb2YgSUphdmFFbGVtZW50IHVzZWQgYXMgYSBzY29wZSBmb3IgZXh0ZXJuYWwgYXJjaGl2ZXMgcmVmcmVzaCBkdXJpbmcgUE9TVF9DSEFOR0UuCisJICogVGhpcyBpcyBudWxsIGlmIG5vIHJlZnJlc2ggaXMgbmVlZGVkLgorCSAqLworCXByaXZhdGUgSGFzaFNldCBleHRlcm5hbEVsZW1lbnRzVG9SZWZyZXNoOworCiAJLyoKIAkgKiBOZWVkIHRvIGNsb25lIGRlZmVuc2l2ZWx5IHRoZSBsaXN0ZW5lciBpbmZvcm1hdGlvbiwgaW4gY2FzZSBzb21lIGxpc3RlbmVyIGlzIHJlYWN0aW5nIHRvIHNvbWUgbm90aWZpY2F0aW9uIGl0ZXJhdGlvbiBieSBhZGRpbmcvY2hhbmdpbmcvcmVtb3ZpbmcKIAkgKiBhbnkgb2YgdGhlIG90aGVyIChmb3IgZXhhbXBsZSwgaWYgaXQgZGVyZWdpc3RlcnMgaXRzZWxmKS4KQEAgLTk5LDcgKzEyMiw3IEBACiAJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJDb3VudDsgaSsrKXsKIAkJCWlmICh0aGlzLmVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKXsKLQkJCQkKKwogCQkJCS8vIG9ubHkgY2xvbmUgdGhlIG1hc2tzLCBzaW5jZSB3ZSBjb3VsZCBiZSBpbiB0aGUgbWlkZGxlIG9mIG5vdGlmaWNhdGlvbnMgYW5kIG9uZSBsaXN0ZW5lciBkZWNpZGUgdG8gY2hhbmdlCiAJCQkJLy8gYW55IGV2ZW50IG1hc2sgb2YgYW5vdGhlciBsaXN0ZW5lcnMgKHlldCBub3Qgbm90aWZpZWQpLgogCQkJCWludCBjbG9uZUxlbmd0aCA9IHRoaXMuZWxlbWVudENoYW5nZWRMaXN0ZW5lck1hc2tzLmxlbmd0aDsKQEAgLTExOSw2ICsxNDIsMTYgQEAKIAkJdGhpcy5lbGVtZW50Q2hhbmdlZExpc3RlbmVyQ291bnQrKzsKIAl9CiAKKwkvKgorCSAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdXNlZCBhcyBhIHNjb3BlIGZvciBleHRlcm5hbCBqYXJzIHJlZnJlc2guCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEZvclJlZnJlc2goSUphdmFFbGVtZW50IGV4dGVybmFsRWxlbWVudCkgeworCQlpZiAodGhpcy5leHRlcm5hbEVsZW1lbnRzVG9SZWZyZXNoID09IG51bGwpIHsKKwkJCXRoaXMuZXh0ZXJuYWxFbGVtZW50c1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7CisJCX0KKwkJdGhpcy5leHRlcm5hbEVsZW1lbnRzVG9SZWZyZXNoLmFkZChleHRlcm5hbEVsZW1lbnQpOworCX0KKwogCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lckNvdW50OyBpKyspewogCQkJaWYgKHRoaXMucHJlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsKQEAgLTE0NSw2ICsxNzgsMzIgQEAKIAkJcmV0dXJuIGRlbHRhUHJvY2Vzc29yOwogCX0KIAorCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3NwYXRoQ2hhbmdlIGFkZENsYXNzcGF0aENoYW5nZShJUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSYXdDbGFzc3BhdGgsIElQYXRoIG9sZE91dHB1dExvY2F0aW9uLCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aCkgeworCQlDbGFzc3BhdGhDaGFuZ2UgY2hhbmdlID0gKENsYXNzcGF0aENoYW5nZSkgdGhpcy5jbGFzc3BhdGhDaGFuZ2VzLmdldChwcm9qZWN0KTsKKwkJaWYgKGNoYW5nZSA9PSBudWxsKSB7CisJCQljaGFuZ2UgPSBuZXcgQ2xhc3NwYXRoQ2hhbmdlKChKYXZhUHJvamVjdCkgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG9sZFJhd0NsYXNzcGF0aCwgb2xkT3V0cHV0TG9jYXRpb24sIG9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKKwkJCXRoaXMuY2xhc3NwYXRoQ2hhbmdlcy5wdXQocHJvamVjdCwgY2hhbmdlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjaGFuZ2Uub2xkUmF3Q2xhc3NwYXRoID09IG51bGwpCisJCQkJY2hhbmdlLm9sZFJhd0NsYXNzcGF0aCA9IG9sZFJhd0NsYXNzcGF0aDsKKwkJCWlmIChjaGFuZ2Uub2xkT3V0cHV0TG9jYXRpb24gPT0gbnVsbCkKKwkJCQljaGFuZ2Uub2xkT3V0cHV0TG9jYXRpb24gPSBvbGRPdXRwdXRMb2NhdGlvbjsKKwkJCWlmIChjaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGggPT0gbnVsbCkKKwkJCQljaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGggPSBvbGRSZXNvbHZlZENsYXNzcGF0aDsKKwkJfQorCQlyZXR1cm4gY2hhbmdlOworCX0KKwkKKwlwdWJsaWMgc3luY2hyb25pemVkIENsYXNzcGF0aENoYW5nZSBnZXRDbGFzc3BhdGhDaGFuZ2UoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gKENsYXNzcGF0aENoYW5nZSkgdGhpcy5jbGFzc3BhdGhDaGFuZ2VzLmdldChwcm9qZWN0KTsKKwl9CisJCisJcHVibGljIHN5bmNocm9uaXplZCBIYXNoTWFwIHJlbW92ZUFsbENsYXNzcGF0aENoYW5nZXMoKSB7CisJCUhhc2hNYXAgcmVzdWx0ID0gdGhpcy5jbGFzc3BhdGhDaGFuZ2VzOworCQl0aGlzLmNsYXNzcGF0aENoYW5nZXMgPSBuZXcgSGFzaE1hcChyZXN1bHQuc2l6ZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKIAlwdWJsaWMgc3luY2hyb25pemVkIENsYXNzcGF0aFZhbGlkYXRpb24gYWRkQ2xhc3NwYXRoVmFsaWRhdGlvbihKYXZhUHJvamVjdCBwcm9qZWN0KSB7CiAJCUNsYXNzcGF0aFZhbGlkYXRpb24gdmFsaWRhdGlvbiA9IChDbGFzc3BhdGhWYWxpZGF0aW9uKSB0aGlzLmNsYXNzcGF0aFZhbGlkYXRpb25zLmdldChwcm9qZWN0KTsKIAkJaWYgKHZhbGlkYXRpb24gPT0gbnVsbCkgewpAQCAtMTUzLDcgKzIxMiwxNSBAQAogCSAgICB9CiAJCXJldHVybiB2YWxpZGF0aW9uOwogCX0KLQkKKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFeHRlcm5hbEZvbGRlckNoYW5nZShKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aCkgeworCQlFeHRlcm5hbEZvbGRlckNoYW5nZSBjaGFuZ2UgPSAoRXh0ZXJuYWxGb2xkZXJDaGFuZ2UpIHRoaXMuZXh0ZXJuYWxGb2xkZXJDaGFuZ2VzLmdldChwcm9qZWN0KTsKKwkJaWYgKGNoYW5nZSA9PSBudWxsKSB7CisJCQljaGFuZ2UgPSBuZXcgRXh0ZXJuYWxGb2xkZXJDaGFuZ2UocHJvamVjdCwgb2xkUmVzb2x2ZWRDbGFzc3BhdGgpOworCQkJdGhpcy5leHRlcm5hbEZvbGRlckNoYW5nZXMucHV0KHByb2plY3QsIGNoYW5nZSk7CisJICAgIH0KKwl9CisKIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvamVjdFJlZmVyZW5jZUNoYW5nZShKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aCkgewogCQlQcm9qZWN0UmVmZXJlbmNlQ2hhbmdlIGNoYW5nZSA9IChQcm9qZWN0UmVmZXJlbmNlQ2hhbmdlKSB0aGlzLnByb2plY3RSZWZlcmVuY2VDaGFuZ2VzLmdldChwcm9qZWN0KTsKIAkJaWYgKGNoYW5nZSA9PSBudWxsKSB7CkBAIC0xNjEsOTggKzIyOCwyNiBAQAogCQkJdGhpcy5wcm9qZWN0UmVmZXJlbmNlQ2hhbmdlcy5wdXQocHJvamVjdCwgY2hhbmdlKTsKIAkgICAgfQogCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUm9vdHMoKSB7Ci0JCQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJvb3RzKGJvb2xlYW4gaW5pdEFmdGVyTG9hZCkgeworCiAJCS8vIHJlY29tcHV0ZSByb290IGluZm9zIG9ubHkgaWYgbmVjZXNzYXJ5Ci0JCUhhc2hNYXAgbmV3Um9vdHMgPSBudWxsOwotCQlIYXNoTWFwIG5ld090aGVyUm9vdHMgPSBudWxsOwotCQlIYXNoTWFwIG5ld1NvdXJjZUF0dGFjaG1lbnRzID0gbnVsbDsKLQkJSGFzaE1hcCBuZXdQcm9qZWN0RGVwZW5kZW5jaWVzID0gbnVsbDsKKwkJSGFzaE1hcFtdIHJvb3RJbmZvcyA9IG51bGw7CiAJCWlmICh0aGlzLnJvb3RzQXJlU3RhbGUpIHsKIAkJCVRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJCWJvb2xlYW4gYWRkZWRDdXJyZW50VGhyZWFkID0gZmFsc2U7CQkJCisJCQlib29sZWFuIGFkZGVkQ3VycmVudFRocmVhZCA9IGZhbHNlOwogCQkJdHJ5IHsKIAkJCQkvLyBpZiByZWVudGVyaW5nIGluaXRpYWxpemF0aW9uICh0aHJvdWdoIGEgY29udGFpbmVyIGluaXRpYWxpemVyIGZvciBleGFtcGxlKSBubyBuZWVkIHRvIGNvbXB1dGUgcm9vdHMgYWdhaW4KIAkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ3MjEzCiAJCQkJaWYgKCF0aGlzLmluaXRpYWxpemluZ1RocmVhZHMuYWRkKGN1cnJlbnRUaHJlYWQpKSByZXR1cm47CiAJCQkJYWRkZWRDdXJyZW50VGhyZWFkID0gdHJ1ZTsKLQkJCQkKKwogCQkJCS8vIGFsbCBjbGFzc3BhdGhzIGluIHRoZSB3b3Jrc3BhY2UgYXJlIGdvaW5nIHRvIGJlIHJlc29sdmVkCiAJCQkJLy8gZW5zdXJlIHRoYXQgY29udGFpbmVycyBhcmUgaW5pdGlhbGl6ZWQgaW4gb25lIGJhdGNoCi0JCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSB0cnVlOworCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmZvcmNlQmF0Y2hJbml0aWFsaXphdGlvbnMoaW5pdEFmdGVyTG9hZCk7CiAKLQkJCQluZXdSb290cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbmV3T3RoZXJSb290cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbmV3U291cmNlQXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCW5ld1Byb2plY3REZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJCQlJSmF2YU1vZGVsIG1vZGVsID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7Ci0JCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHM7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIHByb2plY3RzW2ldOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBjb250aW51ZSB3aXRoIG5leHQgcHJvamVjdAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaj0gMCwgY2xhc3NwYXRoTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGNsYXNzcGF0aExlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbal07Ci0JCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7Ci0JCQkJCQkJSUphdmFQcm9qZWN0IGtleSA9IG1vZGVsLmdldEphdmFQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsgLy8gVE9ETyAoamVyb21lKSByZXVzZSBoYW5kbGUKLQkJCQkJCQlJSmF2YVByb2plY3RbXSBkZXBlbmRlbnRzID0gKElKYXZhUHJvamVjdFtdKSBuZXdQcm9qZWN0RGVwZW5kZW5jaWVzLmdldChrZXkpOwotCQkJCQkJCWlmIChkZXBlbmRlbnRzID09IG51bGwpIHsKLQkJCQkJCQkJZGVwZW5kZW50cyA9IG5ldyBJSmF2YVByb2plY3RbXSB7cHJvamVjdH07Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaW50IGRlcGVuZGVudHNMZW5ndGggPSBkZXBlbmRlbnRzLmxlbmd0aDsKLQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShkZXBlbmRlbnRzLCAwLCBkZXBlbmRlbnRzID0gbmV3IElKYXZhUHJvamVjdFtkZXBlbmRlbnRzTGVuZ3RoKzFdLCAwLCBkZXBlbmRlbnRzTGVuZ3RoKTsKLQkJCQkJCQkJZGVwZW5kZW50c1tkZXBlbmRlbnRzTGVuZ3RoXSA9IHByb2plY3Q7Ci0JCQkJCQkJfQotCQkJCQkJCW5ld1Byb2plY3REZXBlbmRlbmNpZXMucHV0KGtleSwgZGVwZW5kZW50cyk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHJvb3QgcGF0aAotCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCWlmIChuZXdSb290cy5nZXQocGF0aCkgPT0gbnVsbCkgewotCQkJCQkJCW5ld1Jvb3RzLnB1dChwYXRoLCBuZXcgRGVsdGFQcm9jZXNzb3IuUm9vdEluZm8ocHJvamVjdCwgcGF0aCwgKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCksIGVudHJ5LmdldEVudHJ5S2luZCgpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUFycmF5TGlzdCByb290TGlzdCA9IChBcnJheUxpc3QpbmV3T3RoZXJSb290cy5nZXQocGF0aCk7Ci0JCQkJCQkJaWYgKHJvb3RMaXN0ID09IG51bGwpIHsKLQkJCQkJCQkJcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCW5ld090aGVyUm9vdHMucHV0KHBhdGgsIHJvb3RMaXN0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJcm9vdExpc3QuYWRkKG5ldyBEZWx0YVByb2Nlc3Nvci5Sb290SW5mbyhwcm9qZWN0LCBwYXRoLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgZW50cnkuZ2V0RW50cnlLaW5kKCkpKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gc291cmNlIGF0dGFjaG1lbnQgcGF0aAotCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgY29udGludWU7Ci0JCQkJCQlTdHJpbmcgcHJvcGVydHlTdHJpbmcgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9wZXJ0eVN0cmluZyA9IFV0aWwuZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KHBhdGgpOwotCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGg7Ci0JCQkJCQlpZiAocHJvcGVydHlTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCWludCBpbmRleD0gcHJvcGVydHlTdHJpbmcubGFzdEluZGV4T2YoUGFja2FnZUZyYWdtZW50Um9vdC5BVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUik7Ci0JCQkJCQkJc291cmNlQXR0YWNobWVudFBhdGggPSAoaW5kZXggPCAwKSA/ICBuZXcgUGF0aChwcm9wZXJ0eVN0cmluZykgOiBuZXcgUGF0aChwcm9wZXJ0eVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc291cmNlQXR0YWNobWVudFBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNvdXJjZUF0dGFjaG1lbnRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQluZXdTb3VyY2VBdHRhY2htZW50cy5wdXQoc291cmNlQXR0YWNobWVudFBhdGgsIHBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQorCQkJCXJvb3RJbmZvcyA9IGdldFJvb3RJbmZvcyhmYWxzZS8qZG9uJ3QgdXNlIHByZXZpb3VzIHNlc3Npb24gdmFsdWVzKi8pOworCiAJCQl9IGZpbmFsbHkgewogCQkJCWlmIChhZGRlZEN1cnJlbnRUaHJlYWQpIHsKIAkJCQkJdGhpcy5pbml0aWFsaXppbmdUaHJlYWRzLnJlbW92ZShjdXJyZW50VGhyZWFkKTsKQEAgLTI2MSwxNyArMjU2LDEwOSBAQAogCQl9CiAJCXN5bmNocm9uaXplZCh0aGlzKSB7CiAJCQl0aGlzLm9sZFJvb3RzID0gdGhpcy5yb290czsKLQkJCXRoaXMub2xkT3RoZXJSb290cyA9IHRoaXMub3RoZXJSb290czsJCQkKLQkJCWlmICh0aGlzLnJvb3RzQXJlU3RhbGUgJiYgbmV3Um9vdHMgIT0gbnVsbCkgeyAvLyBkb3VibGUgY2hlY2sgYWdhaW4KLQkJCQl0aGlzLnJvb3RzID0gbmV3Um9vdHM7Ci0JCQkJdGhpcy5vdGhlclJvb3RzID0gbmV3T3RoZXJSb290czsKLQkJCQl0aGlzLnNvdXJjZUF0dGFjaG1lbnRzID0gbmV3U291cmNlQXR0YWNobWVudHM7Ci0JCQkJdGhpcy5wcm9qZWN0RGVwZW5kZW5jaWVzID0gbmV3UHJvamVjdERlcGVuZGVuY2llczsKKwkJCXRoaXMub2xkT3RoZXJSb290cyA9IHRoaXMub3RoZXJSb290czsKKwkJCWlmICh0aGlzLnJvb3RzQXJlU3RhbGUgJiYgcm9vdEluZm9zICE9IG51bGwpIHsgLy8gZG91YmxlIGNoZWNrIGFnYWluCisJCQkJdGhpcy5yb290cyA9IHJvb3RJbmZvc1swXTsKKwkJCQl0aGlzLm90aGVyUm9vdHMgPSByb290SW5mb3NbMV07CisJCQkJdGhpcy5zb3VyY2VBdHRhY2htZW50cyA9IHJvb3RJbmZvc1syXTsKKwkJCQl0aGlzLnByb2plY3REZXBlbmRlbmNpZXMgPSByb290SW5mb3NbM107CiAJCQkJdGhpcy5yb290c0FyZVN0YWxlID0gZmFsc2U7CiAJCQl9CiAJCX0KIAl9CiAKKwlzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplUm9vdHNXaXRoUHJldmlvdXNTZXNzaW9uKCkgeworCQlIYXNoTWFwW10gcm9vdEluZm9zID0gZ2V0Um9vdEluZm9zKHRydWUvKnVzZSBwcmV2aW91cyBzZXNzaW9uIHZhbHVlcyovKTsKKwkJaWYgKHJvb3RJbmZvcyAhPSBudWxsKSB7CisJCQl0aGlzLnJvb3RzID0gcm9vdEluZm9zWzBdOworCQkJdGhpcy5vdGhlclJvb3RzID0gcm9vdEluZm9zWzFdOworCQkJdGhpcy5zb3VyY2VBdHRhY2htZW50cyA9IHJvb3RJbmZvc1syXTsKKwkJCXRoaXMucHJvamVjdERlcGVuZGVuY2llcyA9IHJvb3RJbmZvc1szXTsKKwkJCXRoaXMucm9vdHNBcmVTdGFsZSA9IGZhbHNlOworCQl9CisJfQorCisJcHJpdmF0ZSBIYXNoTWFwW10gZ2V0Um9vdEluZm9zKGJvb2xlYW4gdXNlUHJldmlvdXNTZXNzaW9uKSB7CisJCUhhc2hNYXAgbmV3Um9vdHMgPSBuZXcgSGFzaE1hcCgpOworCQlIYXNoTWFwIG5ld090aGVyUm9vdHMgPSBuZXcgSGFzaE1hcCgpOworCQlIYXNoTWFwIG5ld1NvdXJjZUF0dGFjaG1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKwkJSGFzaE1hcCBuZXdQcm9qZWN0RGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKKworCQlJSmF2YU1vZGVsIG1vZGVsID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOworCQl0cnkgeworCQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCS8vIG5vdGhpbmcgY2FuIGJlIGRvbmUKKwkJCXJldHVybiBudWxsOworCQl9CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV07CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7CisJCQl0cnkgeworCQkJCWlmICh1c2VQcmV2aW91c1Nlc3Npb24pIHsKKwkJCQkJUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBwcm9qZWN0LmdldFBlclByb2plY3RJbmZvKCk7CisJCQkJCXByb2plY3QucmVzb2x2ZUNsYXNzcGF0aChwZXJQcm9qZWN0SW5mbywgdHJ1ZS8qdXNlIHByZXZpb3VzIHNlc3Npb24gdmFsdWVzKi8sIGZhbHNlLypkb24ndCBhZGQgY2xhc3NwYXRoIGNoYW5nZSovKTsKKwkJCQkJY2xhc3NwYXRoID0gcGVyUHJvamVjdEluZm8ucmVzb2x2ZWRDbGFzc3BhdGg7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gY29udGludWUgd2l0aCBuZXh0IHByb2plY3QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZvciAoaW50IGo9IDAsIGNsYXNzcGF0aExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjbGFzc3BhdGhMZW5ndGg7IGorKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CisJCQkJCUlKYXZhUHJvamVjdCBrZXkgPSBtb2RlbC5nZXRKYXZhUHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7IC8vIFRPRE8gKGplcm9tZSkgcmV1c2UgaGFuZGxlCisJCQkJCUlKYXZhUHJvamVjdFtdIGRlcGVuZGVudHMgPSAoSUphdmFQcm9qZWN0W10pIG5ld1Byb2plY3REZXBlbmRlbmNpZXMuZ2V0KGtleSk7CisJCQkJCWlmIChkZXBlbmRlbnRzID09IG51bGwpIHsKKwkJCQkJCWRlcGVuZGVudHMgPSBuZXcgSUphdmFQcm9qZWN0W10ge3Byb2plY3R9OworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IGRlcGVuZGVudHNMZW5ndGggPSBkZXBlbmRlbnRzLmxlbmd0aDsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVwZW5kZW50cywgMCwgZGVwZW5kZW50cyA9IG5ldyBJSmF2YVByb2plY3RbZGVwZW5kZW50c0xlbmd0aCsxXSwgMCwgZGVwZW5kZW50c0xlbmd0aCk7CisJCQkJCQlkZXBlbmRlbnRzW2RlcGVuZGVudHNMZW5ndGhdID0gcHJvamVjdDsKKwkJCQkJfQorCQkJCQluZXdQcm9qZWN0RGVwZW5kZW5jaWVzLnB1dChrZXksIGRlcGVuZGVudHMpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvLyByb290IHBhdGgKKwkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCWlmIChuZXdSb290cy5nZXQocGF0aCkgPT0gbnVsbCkgeworCQkJCQluZXdSb290cy5wdXQocGF0aCwgbmV3IERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKHByb2plY3QsIHBhdGgsICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpLCBlbnRyeS5nZXRFbnRyeUtpbmQoKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCUFycmF5TGlzdCByb290TGlzdCA9IChBcnJheUxpc3QpbmV3T3RoZXJSb290cy5nZXQocGF0aCk7CisJCQkJCWlmIChyb290TGlzdCA9PSBudWxsKSB7CisJCQkJCQlyb290TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJCW5ld090aGVyUm9vdHMucHV0KHBhdGgsIHJvb3RMaXN0KTsKKwkJCQkJfQorCQkJCQlyb290TGlzdC5hZGQobmV3IERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKHByb2plY3QsIHBhdGgsICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpLCBlbnRyeS5nZXRFbnRyeUtpbmQoKSkpOworCQkJCX0KKworCQkJCS8vIHNvdXJjZSBhdHRhY2htZW50IHBhdGgKKwkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSBjb250aW51ZTsKKwkJCQlTdHJpbmcgcHJvcGVydHlTdHJpbmcgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCXByb3BlcnR5U3RyaW5nID0gVXRpbC5nZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkocGF0aCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGg7CisJCQkJaWYgKHByb3BlcnR5U3RyaW5nICE9IG51bGwpIHsKKwkJCQkJaW50IGluZGV4PSBwcm9wZXJ0eVN0cmluZy5sYXN0SW5kZXhPZihQYWNrYWdlRnJhZ21lbnRSb290LkFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSKTsKKwkJCQkJc291cmNlQXR0YWNobWVudFBhdGggPSAoaW5kZXggPCAwKSA/ICBuZXcgUGF0aChwcm9wZXJ0eVN0cmluZykgOiBuZXcgUGF0aChwcm9wZXJ0eVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7CisJCQkJfQorCQkJCWlmIChzb3VyY2VBdHRhY2htZW50UGF0aCAhPSBudWxsKSB7CisJCQkJCW5ld1NvdXJjZUF0dGFjaG1lbnRzLnB1dChzb3VyY2VBdHRhY2htZW50UGF0aCwgcGF0aCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBuZXcgSGFzaE1hcFtdIHtuZXdSb290cywgbmV3T3RoZXJSb290cywgbmV3U291cmNlQXR0YWNobWVudHMsIG5ld1Byb2plY3REZXBlbmRlbmNpZXN9OworCX0KKwogCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3NwYXRoVmFsaWRhdGlvbltdIHJlbW92ZUNsYXNzcGF0aFZhbGlkYXRpb25zKCkgewogCSAgICBpbnQgbGVuZ3RoID0gdGhpcy5jbGFzc3BhdGhWYWxpZGF0aW9ucy5zaXplKCk7CiAJICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CkBAIC0yODAsNyArMzY3LDE2IEBACiAJICAgIHRoaXMuY2xhc3NwYXRoVmFsaWRhdGlvbnMuY2xlYXIoKTsKIAkgICAgcmV0dXJuIHZhbGlkYXRpb25zOwogCX0KLQkKKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgRXh0ZXJuYWxGb2xkZXJDaGFuZ2VbXSByZW1vdmVFeHRlcm5hbEZvbGRlckNoYW5nZXMoKSB7CisJICAgIGludCBsZW5ndGggPSB0aGlzLmV4dGVybmFsRm9sZGVyQ2hhbmdlcy5zaXplKCk7CisJICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisJICAgIEV4dGVybmFsRm9sZGVyQ2hhbmdlW10gIHVwZGF0ZXMgPSBuZXcgRXh0ZXJuYWxGb2xkZXJDaGFuZ2VbbGVuZ3RoXTsKKwkgICAgdGhpcy5leHRlcm5hbEZvbGRlckNoYW5nZXMudmFsdWVzKCkudG9BcnJheSh1cGRhdGVzKTsKKwkgICAgdGhpcy5leHRlcm5hbEZvbGRlckNoYW5nZXMuY2xlYXIoKTsKKwkgICAgcmV0dXJuIHVwZGF0ZXM7CisJfQorCiAJcHVibGljIHN5bmNocm9uaXplZCBQcm9qZWN0UmVmZXJlbmNlQ2hhbmdlW10gcmVtb3ZlUHJvamVjdFJlZmVyZW5jZUNoYW5nZXMoKSB7CiAJICAgIGludCBsZW5ndGggPSB0aGlzLnByb2plY3RSZWZlcmVuY2VDaGFuZ2VzLnNpemUoKTsKIAkgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKQEAgLTI4OSwyNyArMzg1LDMzIEBACiAJICAgIHRoaXMucHJvamVjdFJlZmVyZW5jZUNoYW5nZXMuY2xlYXIoKTsKIAkgICAgcmV0dXJuIHVwZGF0ZXM7CiAJfQotCQorCisJcHVibGljIHN5bmNocm9uaXplZCBIYXNoU2V0IHJlbW92ZUV4dGVybmFsRWxlbWVudHNUb1JlZnJlc2goKSB7CisJCUhhc2hTZXQgcmVzdWx0ID0gdGhpcy5leHRlcm5hbEVsZW1lbnRzVG9SZWZyZXNoOworCQl0aGlzLmV4dGVybmFsRWxlbWVudHNUb1JlZnJlc2ggPSBudWxsOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwogCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQorCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50Q2hhbmdlZExpc3RlbmVyQ291bnQ7IGkrKyl7Ci0JCQkKKwogCQkJaWYgKHRoaXMuZWxlbWVudENoYW5nZWRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpewotCQkJCQorCiAJCQkJLy8gbmVlZCB0byBjbG9uZSBkZWZlbnNpdmVseSBzaW5jZSB3ZSBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgKCNmaXJlKQogCQkJCWludCBsZW5ndGggPSB0aGlzLmVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJzLmxlbmd0aDsKIAkJCQlJRWxlbWVudENoYW5nZWRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcltsZW5ndGhdOwogCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50Q2hhbmdlZExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBpKTsKIAkJCQlpbnRbXSBuZXdNYXNrcyA9IG5ldyBpbnRbbGVuZ3RoXTsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudENoYW5nZWRMaXN0ZW5lck1hc2tzLCAwLCBuZXdNYXNrcywgMCwgaSk7Ci0JCQkJCisKIAkJCQkvLyBjb3B5IHRyYWlsaW5nIGxpc3RlbmVycwogCQkJCWludCB0cmFpbGluZ0xlbmd0aCA9IHRoaXMuZWxlbWVudENoYW5nZWRMaXN0ZW5lckNvdW50IC0gaSAtIDE7CiAJCQkJaWYgKHRyYWlsaW5nTGVuZ3RoID4gMCl7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50Q2hhbmdlZExpc3RlbmVycywgaSsxLCBuZXdMaXN0ZW5lcnMsIGksIHRyYWlsaW5nTGVuZ3RoKTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJNYXNrcywgaSsxLCBuZXdNYXNrcywgaSwgdHJhaWxpbmdMZW5ndGgpOwogCQkJCX0KLQkJCQkKKwogCQkJCS8vIHVwZGF0ZSBtYW5hZ2VyIGxpc3RlbmVyIHN0YXRlICgjZmlyZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBvcmlnaW5hbCBsaXN0ZW5lcnMgdGhyb3VnaCBhIGxvY2FsIHZhcmlhYmxlIHRvIGhvbGQgb250bwogCQkJCS8vIHRoZSBvcmlnaW5hbCBvbmVzKQogCQkJCXRoaXMuZWxlbWVudENoYW5nZWRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7CkBAIC0zMjEsMjUgKzQyMywyNSBAQAogCX0KIAogCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKKwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lckNvdW50OyBpKyspewotCQkJCisKIAkJCWlmICh0aGlzLnByZVJlc291cmNlQ2hhbmdlTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKXsKLQkJCQkKKwogCQkJCS8vIG5lZWQgdG8gY2xvbmUgZGVmZW5zaXZlbHkgc2luY2Ugd2UgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZiBsaXN0ZW5lciBub3RpZmljYXRpb25zICgjZmlyZSkKIAkJCQlpbnQgbGVuZ3RoID0gdGhpcy5wcmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5sZW5ndGg7CiAJCQkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXJbbGVuZ3RoXTsKIAkJCQlpbnRbXSBuZXdFdmVudE1hc2tzID0gbmV3IGludFtsZW5ndGhdOwogCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wcmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBpKTsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucHJlUmVzb3VyY2VDaGFuZ2VFdmVudE1hc2tzLCAwLCBuZXdFdmVudE1hc2tzLCAwLCBpKTsKLQkJCQkKKwogCQkJCS8vIGNvcHkgdHJhaWxpbmcgbGlzdGVuZXJzCiAJCQkJaW50IHRyYWlsaW5nTGVuZ3RoID0gdGhpcy5wcmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyQ291bnQgLSBpIC0gMTsKIAkJCQlpZiAodHJhaWxpbmdMZW5ndGggPiAwKSB7CiAJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5wcmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVycywgaSsxLCBuZXdMaXN0ZW5lcnMsIGksIHRyYWlsaW5nTGVuZ3RoKTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnByZVJlc291cmNlQ2hhbmdlRXZlbnRNYXNrcywgaSsxLCBuZXdFdmVudE1hc2tzLCBpLCB0cmFpbGluZ0xlbmd0aCk7CiAJCQkJfQotCQkJCQorCiAJCQkJLy8gdXBkYXRlIG1hbmFnZXIgbGlzdGVuZXIgc3RhdGUgKCNmaXJlIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIG9yaWdpbmFsIGxpc3RlbmVycyB0aHJvdWdoIGEgbG9jYWwgdmFyaWFibGUgdG8gaG9sZCBvbnRvCiAJCQkJLy8gdGhlIG9yaWdpbmFsIG9uZXMpCiAJCQkJdGhpcy5wcmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKQEAgLTM2NywxNCArNDY5LDE4IEBACiAJCXRyeSB7CiAJCQlnZXREZWx0YVByb2Nlc3NvcigpLnJlc291cmNlQ2hhbmdlZChldmVudCk7CiAJCX0gZmluYWxseSB7Ci0JCQkvLyBUT0RPIChqZXJvbWUpIHNlZSA0NzYzMSwgbWF5IHdhbnQgdG8gZ2V0IHJpZCBvZiBmb2xsb3dpbmcgc28gYXMgdG8gcmV1c2UgZGVsdGEgcHJvY2Vzc29yID8gCisJCQkvLyBUT0RPIChqZXJvbWUpIHNlZSA0NzYzMSwgbWF5IHdhbnQgdG8gZ2V0IHJpZCBvZiBmb2xsb3dpbmcgc28gYXMgdG8gcmV1c2UgZGVsdGEgcHJvY2Vzc29yID8KIAkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpIHsKIAkJCQl0aGlzLmRlbHRhUHJvY2Vzc29ycy5zZXQobnVsbCk7CisJCQl9IGVsc2UgeworCQkJCS8vIElmIHdlIGFyZSBnb2luZyB0byByZXVzZSB0aGUgZGVsdGEgcHJvY2Vzc29yIG9mIHRoaXMgdGhyZWFkLCBkb24ndCBoYW5nIG9uIHRvIHN0YXRlCisJCQkJLy8gdGhhdCBpc24ndCBtZWFudCB0byBiZSByZXVzZWQuIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzMzODUKKwkJCQlnZXREZWx0YVByb2Nlc3NvcigpLm92ZXJyaWRlbkV2ZW50VHlwZSA9IC0xOwogCQkJfQogCQl9CiAKIAl9Ci0JCisKIAlwdWJsaWMgSGFzaHRhYmxlIGdldEV4dGVybmFsTGliVGltZVN0YW1wcygpIHsKIAkJaWYgKHRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzID09IG51bGwpIHsKIAkJCUhhc2h0YWJsZSB0aW1lU3RhbXBzID0gbmV3IEhhc2h0YWJsZSgpOwpAQCAtNDA0LDE1ICs1MTAsMTUgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5leHRlcm5hbFRpbWVTdGFtcHM7CiAJfQotCQorCiAJcHVibGljIElKYXZhUHJvamVjdCBmaW5kSmF2YVByb2plY3QoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKGdldE9sZEphdmFQcm9qZWNOYW1lcygpLmNvbnRhaW5zKG5hbWUpKQogCQkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KG5hbWUpOwogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAkvKgotCSAqIFdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorCSAqIFdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkCiAJICogUmV0dXJucyB0aGUgbGlzdCBvZiBqYXZhIHByb2plY3RzIGJlZm9yZSByZXNvdXJjZSBkZWx0YSBwcm9jZXNzaW5nCiAJICogaGFzIHN0YXJ0ZWQuCiAJICovCkBAIC00MzMsMjkgKzUzOSw0NCBAQAogCQl9CiAJCXJldHVybiB0aGlzLmphdmFQcm9qZWN0TmFtZXNDYWNoZTsKIAl9Ci0JCisKIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXRPbGRKYXZhUHJvamVjdE5hbWVzKCkgewogCQl0aGlzLmphdmFQcm9qZWN0TmFtZXNDYWNoZSA9IG51bGw7CiAJfQotCQorCiAJcHJpdmF0ZSBGaWxlIGdldFRpbWVTdGFtcHNGaWxlKCkgewogCQlyZXR1cm4gSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgiZXh0ZXJuYWxMaWJzVGltZVN0YW1wcyIpLnRvRmlsZSgpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJcHVibGljIHZvaWQgc2F2ZUV4dGVybmFsTGliVGltZVN0YW1wcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJaWYgKHRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzID09IG51bGwpIHJldHVybjsKKwkJCisJCS8vIGNsZWFudXAgdG8gYXZvaWQgYW55IGxlYWsgKCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0ODQ5ICkKKwkJSGFzaFNldCB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7CisJCWlmICh0aGlzLnJvb3RzICE9IG51bGwpIHsKKwkJCUVudW1lcmF0aW9uIGtleXMgPSB0aGlzLmV4dGVybmFsVGltZVN0YW1wcy5rZXlzKCk7CisJCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7CisJCQkJaWYgKHRoaXMucm9vdHMuZ2V0KGtleSkgPT0gbnVsbCkgeworCQkJCQl0b1JlbW92ZS5hZGQoa2V5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCiAJCUZpbGUgdGltZXN0YW1wcyA9IGdldFRpbWVTdGFtcHNGaWxlKCk7CiAJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKIAkJdHJ5IHsKIAkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0aW1lc3RhbXBzKSkpOwotCQkJb3V0LndyaXRlSW50KHRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLnNpemUoKSk7CisJCQlvdXQud3JpdGVJbnQodGhpcy5leHRlcm5hbFRpbWVTdGFtcHMuc2l6ZSgpIC0gdG9SZW1vdmUuc2l6ZSgpKTsKIAkJCUl0ZXJhdG9yIGVudHJpZXMgPSB0aGlzLmV4dGVybmFsVGltZVN0YW1wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CiAJCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKIAkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzLm5leHQoKTsKIAkJCQlJUGF0aCBrZXkgPSAoSVBhdGgpIGVudHJ5LmdldEtleSgpOwotCQkJCW91dC53cml0ZVVURihrZXkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQlMb25nIHRpbWVzdGFtcCA9IChMb25nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCW91dC53cml0ZUxvbmcodGltZXN0YW1wLmxvbmdWYWx1ZSgpKTsKKwkJCQlpZiAoIXRvUmVtb3ZlLmNvbnRhaW5zKGtleSkpIHsKKwkJCQkJb3V0LndyaXRlVVRGKGtleS50b1BvcnRhYmxlU3RyaW5nKCkpOworCQkJCQlMb25nIHRpbWVzdGFtcCA9IChMb25nKSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlvdXQud3JpdGVMb25nKHRpbWVzdGFtcC5sb25nVmFsdWUoKSk7CisJCQkJfQogCQkJfQogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbXMgd2hpbGUgc2F2aW5nIHRpbWVzdGFtcHMiLCBlKTsgLy8kTk9OLU5MUy0xJApAQCAtNDk0LDE4ICs2MTUsMTggQEAKIAkJCQlJUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSBjb250YWluZXJEZWx0YS5maW5kTWVtYmVyKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb250YWluZXJTZWdtZW50Q291bnQpKTsKIAkJCQlpZiAocm9vdERlbHRhID09IG51bGwpIGNvbnRpbnVlOwogCQkJCURlbHRhUHJvY2Vzc29yLlJvb3RJbmZvIHJvb3RJbmZvID0gKERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQotCQkJCWlmICghY29udGFpbmVySXNQcm9qZWN0IAorCisJCQkJaWYgKCFjb250YWluZXJJc1Byb2plY3QKIAkJCQkJCXx8ICFyb290SW5mby5wcm9qZWN0LmdldFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpKSB7IC8vIG9ubHkgY29uc2lkZXIgZm9sZGVyIHJvb3RzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29udGFpbmVyCiAJCQkJCWRlbHRhUHJvY2Vzc29yLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdEluZm8pOwogCQkJCX0KLQkJCQkKKwogCQkJCUFycmF5TGlzdCByb290TGlzdCA9IChBcnJheUxpc3Qpb3RoZXJVcGRhdGVkUm9vdHMuZ2V0KHBhdGgpOwogCQkJCWlmIChyb290TGlzdCAhPSBudWxsKSB7CiAJCQkJCUl0ZXJhdG9yIG90aGVyUHJvamVjdHMgPSByb290TGlzdC5pdGVyYXRvcigpOwogCQkJCQl3aGlsZSAob3RoZXJQcm9qZWN0cy5oYXNOZXh0KCkpIHsKIAkJCQkJCXJvb3RJbmZvID0gKERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKW90aGVyUHJvamVjdHMubmV4dCgpOwotCQkJCQkJaWYgKCFjb250YWluZXJJc1Byb2plY3QgCisJCQkJCQlpZiAoIWNvbnRhaW5lcklzUHJvamVjdAogCQkJCQkJCQl8fCAhcm9vdEluZm8ucHJvamVjdC5nZXRQYXRoKCkuaXNQcmVmaXhPZihwYXRoKSkgeyAvLyBvbmx5IGNvbnNpZGVyIGZvbGRlciByb290cyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbnRhaW5lcgogCQkJCQkJCWRlbHRhUHJvY2Vzc29yLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdEluZm8pOwogCQkJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc29yLmphdmEKaW5kZXggOTk2NWVlNi4uYjE1ZDNjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLio7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0yMCwxOCArMjEsMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlNvdXJjZUVsZW1lbnRQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkphdmFCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeS5UeXBlSGllcmFyY2h5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5BYnN0cmFjdFNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5KYXZhV29ya3NwYWNlU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCkBAIC01MCwxMiArNTUsMTIgQEAKICAqIDxsaT50cmlnZ2VycyBpbmRleGluZyBvZiB0aGUgY2hhbmdlZCBlbGVtZW50czwvbGk+CiAgKiA8bGk+cmVmcmVzaCBleHRlcm5hbCBhcmNoaXZlcyAoZGVsdGEsIG1vZGVsIHVwZGF0ZSwgaW5kZXhpbmcpPC9saT4KICAqIDxsaT5pcyB0aHJlYWQgc2FmZSAob25lIGRlbHRhIHByb2Nlc3NvciBpbnN0YW5jZSBwZXIgdGhyZWFkLCBzZWUgRGVsdGFQcm9jZXNzaW5nU3RhdGUjcmVzb3VyY2VDaGFuZ2VkKC4uLikpPC9saT4KLSAqIDxsaT5oYW5kbGVzIC5jbGFzc3BhdGggY2hhbmdlcyAodXBkYXRlcyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLCB1cGRhdGUgcHJvamVjdCByZWZlcmVuY2VzLCB2YWxpZGF0ZSBjbGFzc3BhdGggKC5jbGFzc3BhdGggZm9ybWF0LCAKKyAqIDxsaT5oYW5kbGVzIC5jbGFzc3BhdGggY2hhbmdlcyAodXBkYXRlcyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLCB1cGRhdGUgcHJvamVjdCByZWZlcmVuY2VzLCB2YWxpZGF0ZSBjbGFzc3BhdGggKC5jbGFzc3BhdGggZm9ybWF0LAogICogCQlyZXNvbHZlZCBjbGFzc3BhdGgsIGN5Y2xlcykpPC9saT4KICAqIDwvdWw+CiAgKi8KIHB1YmxpYyBjbGFzcyBEZWx0YVByb2Nlc3NvciB7Ci0JCisKIAlzdGF0aWMgY2xhc3MgT3V0cHV0c0luZm8gewogCQlpbnQgb3V0cHV0Q291bnQ7CiAJCUlQYXRoW10gcGF0aHM7CkBAIC05MiwzNCArOTcsNDMgQEAKIAkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAkJfQogCX0KLQkKLQlzdGF0aWMgY2xhc3MgUm9vdEluZm8geworCisJcHVibGljIHN0YXRpYyBjbGFzcyBSb290SW5mbyB7CiAJCWNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zOwogCQljaGFyW11bXSBleGNsdXNpb25QYXR0ZXJuczsKLQkJSmF2YVByb2plY3QgcHJvamVjdDsKKwkJcHVibGljIEphdmFQcm9qZWN0IHByb2plY3Q7CiAJCUlQYXRoIHJvb3RQYXRoOwogCQlpbnQgZW50cnlLaW5kOwogCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290OworCQlJUGFja2FnZUZyYWdtZW50Um9vdCBjYWNoZTsKIAkJUm9vdEluZm8oSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggcm9vdFBhdGgsIGNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucywgaW50IGVudHJ5S2luZCkgewogCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAkJCXRoaXMucm9vdFBhdGggPSByb290UGF0aDsKIAkJCXRoaXMuaW5jbHVzaW9uUGF0dGVybnMgPSBpbmNsdXNpb25QYXR0ZXJuczsKIAkJCXRoaXMuZXhjbHVzaW9uUGF0dGVybnMgPSBleGNsdXNpb25QYXR0ZXJuczsKIAkJCXRoaXMuZW50cnlLaW5kID0gZW50cnlLaW5kOworCQkJdGhpcy5jYWNoZSA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAkJfQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHRSb290ID0gbnVsbDsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHRoaXMucm9vdFBhdGgsIGZhbHNlLypkb24ndCBjaGVjayBleGlzdGVuY2UqLyk7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJdFJvb3QgPSB0aGlzLnByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgoSVJlc291cmNlKXRhcmdldCk7CisJCQl9IGVsc2UgeworCQkJCXRSb290ID0gdGhpcy5wcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5yb290UGF0aC50b09TU3RyaW5nKCkpOworCQkJfQorCQkJcmV0dXJuIHRSb290OworCQl9CisJCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSkgewogCQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7CiAJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKIAkJCQkJdGhpcy5yb290ID0gdGhpcy5wcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHRoaXMucm9vdFBhdGgsIGZhbHNlLypkb24ndCBjaGVjayBleGlzdGVuY2UqLyk7Ci0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJCXRoaXMucm9vdCA9IHRoaXMucHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUmVzb3VyY2UpdGFyZ2V0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMucm9vdCA9IHRoaXMucHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMucm9vdFBhdGgudG9PU1N0cmluZygpKTsKLQkJCQkJfQorCQkJCQl0aGlzLnJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAJCQkJfQogCQkJfQorCQkJaWYgKHRoaXMucm9vdCAhPSBudWxsKSAKKwkJCQl0aGlzLmNhY2hlID0gdGhpcy5yb290OwogCQkJcmV0dXJuIHRoaXMucm9vdDsKIAkJfQogCQlib29sZWFuIGlzUm9vdE9mUHJvamVjdChJUGF0aCBwYXRoKSB7CkBAIC0xNjcsMTMgKzE4MSwxMyBAQAogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJR05PUkUgPSAwOwogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTT1VSQ0UgPSAxOwogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBCSU5BUlkgPSAyOwotCQorCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVSTkFMX0pBUl9BRERFRCA9ICJleHRlcm5hbCBqYXIgYWRkZWQiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVSTkFMX0pBUl9DSEFOR0VEID0gImV4dGVybmFsIGphciBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9KQVJfUkVNT1ZFRCA9ICJleHRlcm5hbCBqYXIgcmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURVJOQUxfSkFSX1VOQ0hBTkdFRCA9ICJleHRlcm5hbCBqYXIgdW5jaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUk5BTF9KQVJfSUdOT1JFID0gImludGVybmFsIGphciBpZ25vcmUiOyAvLyROT04tTkxTLTEkCi0JCisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTk9OX0pBVkFfUkVTT1VSQ0UgPSAtMTsKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwpAQCAtMTg4LDMzICsyMDIsMzMgQEAKIAlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VGltZVN0YW1wKEZpbGUgZmlsZSkgewogCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKSArIGZpbGUubGVuZ3RoKCk7CiAJfQotCQorCiAJLyoKIAkgKiBUaGUgZ2xvYmFsIHN0YXRlIG9mIGRlbHRhIHByb2Nlc3NpbmcuCiAJICovCiAJcHJpdmF0ZSBEZWx0YVByb2Nlc3NpbmdTdGF0ZSBzdGF0ZTsKLQkKKwogCS8qCiAJICogVGhlIEphdmEgbW9kZWwgbWFuYWdlcgogCSAqLwogCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlcjsKLQkKKwogCS8qCiAJICogVGhlIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPiBiZWluZyB0cmFuc2xhdGVkLgogCSAqLwogCXByaXZhdGUgSmF2YUVsZW1lbnREZWx0YSBjdXJyZW50RGVsdGE7CiAKLQkvKiBUaGUgamF2YSBlbGVtZW50IHRoYXQgd2FzIGxhc3QgY3JlYXRlZCAoc2VlIGNyZWF0ZUVsZW1lbnQoSVJlc291cmNlKSkuIAotCSAqIFRoaXMgaXMgdXNlZCBhcyBhIHN0YWNrIG9mIGphdmEgZWxlbWVudHMgKHVzaW5nIGdldFBhcmVudCgpIHRvIHBvcCBpdCwgYW5kIAorCS8qIFRoZSBqYXZhIGVsZW1lbnQgdGhhdCB3YXMgbGFzdCBjcmVhdGVkIChzZWUgY3JlYXRlRWxlbWVudChJUmVzb3VyY2UpKS4KKwkgKiBUaGlzIGlzIHVzZWQgYXMgYSBzdGFjayBvZiBqYXZhIGVsZW1lbnRzICh1c2luZyBnZXRQYXJlbnQoKSB0byBwb3AgaXQsIGFuZAogCSAqIHVzaW5nIHRoZSB2YXJpb3VzIGdldCooLi4uKSB0byBwdXNoIGl0LiAqLwogCXByaXZhdGUgT3BlbmFibGUgY3VycmVudEVsZW1lbnQ7Ci0JCQorCiAJLyoKIAkgKiBRdWV1ZSBvZiBkZWx0YXMgY3JlYXRlZCBleHBsaWNpbHkgYnkgdGhlIEphdmEgTW9kZWwgdGhhdAogCSAqIGhhdmUgeWV0IHRvIGJlIGZpcmVkLgogCSAqLwogCXB1YmxpYyBBcnJheUxpc3QgamF2YU1vZGVsRGVsdGFzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCisKIAkvKgogCSAqIFF1ZXVlIG9mIHJlY29uY2lsZSBkZWx0YXMgb24gd29ya2luZyBjb3BpZXMgdGhhdCBoYXZlIHlldCB0byBiZSBmaXJlZC4KIAkgKiBUaGlzIGlzIGEgdGFibGUgZm9ybSBJV29ya2luZ0NvcHkgdG8gSUphdmFFbGVtZW50RGVsdGEKQEAgLTIyNSw2NCArMjM5LDM0IEBACiAJICogVHVybnMgZGVsdGEgZmlyaW5nIG9uL29mZi4gQnkgZGVmYXVsdCBpdCBpcyBvbi4KIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gaXNGaXJpbmc9IHRydWU7Ci0JCisKIAkvKgogCSAqIFVzZWQgdG8gdXBkYXRlIHRoZSBKYXZhTW9kZWwgZm9yIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPnMuCiAJICovCiAJcHJpdmF0ZSBmaW5hbCBNb2RlbFVwZGF0ZXIgbW9kZWxVcGRhdGVyID0gbmV3IE1vZGVsVXBkYXRlcigpOwogCiAJLyogQSBzZXQgb2YgSUphdmFQcm9qZWN0IHdob3NlIGNhY2hlcyBuZWVkIHRvIGJlIHJlc2V0ICovCi0JcHVibGljIEhhc2hTZXQgcHJvamVjdENhY2hlc1RvUmVzZXQgPSBuZXcgSGFzaFNldCgpOyAgCisJcHVibGljIEhhc2hTZXQgcHJvamVjdENhY2hlc1RvUmVzZXQgPSBuZXcgSGFzaFNldCgpOwogCi0JLyoKLQkgKiBBIGxpc3Qgb2YgSUphdmFFbGVtZW50IHVzZWQgYXMgYSBzY29wZSBmb3IgZXh0ZXJuYWwgYXJjaGl2ZXMgcmVmcmVzaCBkdXJpbmcgUE9TVF9DSEFOR0UuCi0JICogVGhpcyBpcyBudWxsIGlmIG5vIHJlZnJlc2ggaXMgbmVlZGVkLgotCSAqLwotCXByaXZhdGUgSGFzaFNldCByZWZyZXNoZWRFbGVtZW50czsKLQkKIAkvKiBBIHRhYmxlIGZyb20gSUphdmFQcm9qZWN0IHRvIGFuIGFycmF5IG9mIElQYWNrYWdlRnJhZ21lbnRSb290LgogCSAqIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHBrZyBmcmFnbWVudCByb290cyBvZiB0aGUgcHJvamVjdCB0aGF0IGFyZSBiZWluZyBkZWxldGVkLgogCSAqLwogCXB1YmxpYyBNYXAgb2xkUm9vdHM7Ci0JCi0JLyogQSBzZXQgb2YgSUphdmFQcm9qZWN0IHdob3NlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgbmVlZCB0byBiZSByZWZyZXNoZWQgKi8KLQlwcml2YXRlIEhhc2hTZXQgcm9vdHNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQorCiAJLyoKIAkgKiBUeXBlIG9mIGV2ZW50IHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBubyBtYXR0ZXIgd2hhdCB0aGUgcmVhbCBldmVudCB0eXBlIGlzLgogCSAqLwogCXB1YmxpYyBpbnQgb3ZlcnJpZGVuRXZlbnRUeXBlID0gLTE7Ci0JCisKIAkvKgogCSAqIENhY2hlIFNvdXJjZUVsZW1lbnRQYXJzZXIgZm9yIHRoZSBwcm9qZWN0IGJlaW5nIHZpc2l0ZWQKIAkgKi8KIAlwcml2YXRlIFNvdXJjZUVsZW1lbnRQYXJzZXIgc291cmNlRWxlbWVudFBhcnNlckNhY2hlOwotCQotCS8qCi0JICogTWFwIGZyb20gSVByb2plY3QgdG8gQ2xhc3NwYXRoQ2hhbmdlCi0JICovCi0JcHVibGljIEhhc2hNYXAgY2xhc3NwYXRoQ2hhbmdlcyA9IG5ldyBIYXNoTWFwKCk7CiAKIAlwdWJsaWMgRGVsdGFQcm9jZXNzb3IoRGVsdGFQcm9jZXNzaW5nU3RhdGUgc3RhdGUsIEphdmFNb2RlbE1hbmFnZXIgbWFuYWdlcikgewogCQl0aGlzLnN0YXRlID0gc3RhdGU7CiAJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CiAJfQotCQotCXB1YmxpYyBDbGFzc3BhdGhDaGFuZ2UgYWRkQ2xhc3NwYXRoQ2hhbmdlKElQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdIG9sZFJhd0NsYXNzcGF0aCwgSVBhdGggb2xkT3V0cHV0TG9jYXRpb24sIElDbGFzc3BhdGhFbnRyeVtdIG9sZFJlc29sdmVkQ2xhc3NwYXRoKSB7Ci0JCUNsYXNzcGF0aENoYW5nZSBjaGFuZ2UgPSAoQ2xhc3NwYXRoQ2hhbmdlKSB0aGlzLmNsYXNzcGF0aENoYW5nZXMuZ2V0KHByb2plY3QpOwotCQlpZiAoY2hhbmdlID09IG51bGwpIHsKLQkJCWNoYW5nZSA9IG5ldyBDbGFzc3BhdGhDaGFuZ2UoKEphdmFQcm9qZWN0KSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QocHJvamVjdCksIG9sZFJhd0NsYXNzcGF0aCwgb2xkT3V0cHV0TG9jYXRpb24sIG9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKLQkJCXRoaXMuY2xhc3NwYXRoQ2hhbmdlcy5wdXQocHJvamVjdCwgY2hhbmdlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjaGFuZ2Uub2xkUmF3Q2xhc3NwYXRoID09IG51bGwpCi0JCQkJY2hhbmdlLm9sZFJhd0NsYXNzcGF0aCA9IG9sZFJhd0NsYXNzcGF0aDsKLQkJCWlmIChjaGFuZ2Uub2xkT3V0cHV0TG9jYXRpb24gPT0gbnVsbCkKLQkJCQljaGFuZ2Uub2xkT3V0cHV0TG9jYXRpb24gPSBvbGRPdXRwdXRMb2NhdGlvbjsKLQkJCWlmIChjaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGggPT0gbnVsbCkKLQkJCQljaGFuZ2Uub2xkUmVzb2x2ZWRDbGFzc3BhdGggPSBvbGRSZXNvbHZlZENsYXNzcGF0aDsKLQkJfQotCQlyZXR1cm4gY2hhbmdlOwotCX0KIAogCS8qCiAJICogQWRkcyB0aGUgZGVwZW5kZW50cyBvZiB0aGUgZ2l2ZW4gcHJvamVjdCB0byB0aGUgbGlzdCBvZiB0aGUgcHJvamVjdHMKQEAgLTMwMCw5NCArMjg0LDc3IEBACiAJCX0KIAl9CiAJLyoKLQkgKiBBZGRzIHRoZSBnaXZlbiBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHVzZWQgYXMgYSBzY29wZSBmb3IgZXh0ZXJuYWwgamFycyByZWZyZXNoLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZvclJlZnJlc2goSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHRoaXMucmVmcmVzaGVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZyZXNoZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJdGhpcy5yZWZyZXNoZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCS8qCi0JICogQWRkcyB0aGUgZ2l2ZW4gY2hpbGQgaGFuZGxlIHRvIGl0cyBwYXJlbnQncyBjYWNoZSBvZiBjaGlsZHJlbi4gCisJICogQWRkcyB0aGUgZ2l2ZW4gY2hpbGQgaGFuZGxlIHRvIGl0cyBwYXJlbnQncyBjYWNoZSBvZiBjaGlsZHJlbi4KIAkgKi8KIAlwcml2YXRlIHZvaWQgYWRkVG9QYXJlbnRJbmZvKE9wZW5hYmxlIGNoaWxkKSB7CiAJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKIAkJCXRyeSB7Ci0JCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKXBhcmVudC5nZXRFbGVtZW50SW5mbygpOwotCQkJCWluZm8uYWRkQ2hpbGQoY2hpbGQpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8gPSAoT3BlbmFibGVFbGVtZW50SW5mbykgcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODAwNgorCQkJCS8vIEluc2VydCB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgY2xhc3NwYXRoIG9yZGVyLgorCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KQorCQkJCQlhZGRQYWNrYWdlRnJhZ21lbnRSb290KGluZm8sIChJUGFja2FnZUZyYWdtZW50Um9vdCkgY2hpbGQpOworCQkJCWVsc2UKKwkJCQkJaW5mby5hZGRDaGlsZChjaGlsZCk7CisgCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBkbyBub3RoaW5nIC0gd2UgYWxyZWFkeSBjaGVja2VkIGlmIG9wZW4KIAkJCX0KIAkJfQogCX0KLQkvKgotCSAqIEFkZHMgdGhlIGdpdmVuIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbnRzIHRvIHRoZSBsaXN0IG9mIHRoZSByb290cyB0byByZWZyZXNoLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb1Jvb3RzVG9SZWZyZXNoV2l0aERlcGVuZGVudHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMucm9vdHNUb1JlZnJlc2guYWRkKGphdmFQcm9qZWN0KTsKLQkJdGhpcy5hZGREZXBlbmRlbnRQcm9qZWN0cyhqYXZhUHJvamVjdCwgdGhpcy5zdGF0ZS5wcm9qZWN0RGVwZW5kZW5jaWVzLCB0aGlzLnJvb3RzVG9SZWZyZXNoKTsKLQl9Ci0JLyoKLQkgKiBDaGVjayBhbGwgZXh0ZXJuYWwgYXJjaGl2ZSAocmVmZXJlbmNlZCBieSBnaXZlbiByb290cywgcHJvamVjdHMgb3IgbW9kZWwpIHN0YXR1cyBhbmQgaXNzdWUgYSBjb3JyZXNwb25kaW5nIHJvb3QgZGVsdGEuCi0JICogQWxzbyB0cmlnZ2VycyBpbmRleCB1cGRhdGVzCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9SZWZyZXNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSAKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOyAKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgdm9pZCBhZGRQYWNrYWdlRnJhZ21lbnRSb290KE9wZW5hYmxlRWxlbWVudEluZm8gcGFyZW50LCBJUGFja2FnZUZyYWdtZW50Um9vdCBjaGlsZCkKKwkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHNUb1JlZnJlc2gubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQl0aGlzLmFkZEZvclJlZnJlc2goZWxlbWVudHNUb1JlZnJlc2hbaV0pOworCQlJSmF2YUVsZW1lbnRbXSByb290cyA9IHBhcmVudC5nZXRDaGlsZHJlbigpOworCQlpZiAocm9vdHMubGVuZ3RoID4gMCkgeworCQkJSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWRDbGFzc3BhdGggPSAoKEphdmFQcm9qZWN0KSBjaGlsZC5nZXRKYXZhUHJvamVjdCgpKS5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJSVBhdGggY3VycmVudEVudHJ5UGF0aCA9IGNoaWxkLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKS5nZXRQYXRoKCk7CisJCQlpbnQgaW5kZXhUb0luc2VydCA9IC0xOworCQkJaW50IGxhc3RDb21wYXJlZEluZGV4ID0gLTE7CisJCQlpbnQgaSA9IDAsIGogPSAwOworCQkJZm9yICg7IGkgPCByb290cy5sZW5ndGggJiYgaiA8IHJlc29sdmVkQ2xhc3NwYXRoLmxlbmd0aDspIHsKKworCQkJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9IHJlc29sdmVkQ2xhc3NwYXRoW2pdOworCQkJCWlmIChsYXN0Q29tcGFyZWRJbmRleCAhPSBqICYmIGN1cnJlbnRFbnRyeVBhdGguZXF1YWxzKGNsYXNzcGF0aEVudHJ5LmdldFBhdGgoKSkpIHsKKwkJCQkJaW5kZXhUb0luc2VydCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsYXN0Q29tcGFyZWRJbmRleCA9IGo7CisKKwkJCQlJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5ID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdHNbaV0pLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKTsKKwkJCQlpZiAocm9vdEVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY2xhc3NwYXRoRW50cnkuZ2V0UGF0aCgpKSkKKwkJCQkJaSsrOworCQkJCWVsc2UKKwkJCQkJaisrOwogCQkJfQotCQkJYm9vbGVhbiBoYXNEZWx0YSA9IHRoaXMuY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEobW9uaXRvcik7Ci0JCQlpZiAoaGFzRGVsdGEpewotCQkJCS8vIGZvcmNlIGNsYXNzcGF0aCBtYXJrZXIgcmVmcmVzaCBvZiBhZmZlY3RlZCBwcm9qZWN0cwotCQkJCUphdmFNb2RlbC5mbHVzaEV4dGVybmFsRmlsZUNhY2hlKCk7Ci0JCQkJCi0JCQkJLy8gZmx1c2ggamFyIHR5cGUgY2FjaGUKLQkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZXNldEphclR5cGVDYWNoZSgpOwotCQkJCQotCQkJCUlKYXZhRWxlbWVudERlbHRhW10gcHJvamVjdERlbHRhcyA9IHRoaXMuY3VycmVudERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlmaW5hbCBpbnQgbGVuZ3RoID0gcHJvamVjdERlbHRhcy5sZW5ndGg7Ci0JCQkJZmluYWwgSVByb2plY3RbXSBwcm9qZWN0c1RvVG91Y2ggPSBuZXcgSVByb2plY3RbbGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gcHJvamVjdERlbHRhc1tpXTsKLQkJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCQlwcm9qZWN0c1RvVG91Y2hbaV0gPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7CisKKwkJCWZvciAoOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBJZiB0aGUgbmV3IHJvb3QgaXMgYWxyZWFkeSBhbW9uZyB0aGUgY2hpbGRyZW4sIG5vIG5lZWQgdG8gcHJvY2VlZCBmdXJ0aGVyLiBKdXN0IHJldHVybi4KKwkJCQlpZiAocm9vdHNbaV0uZXF1YWxzKGNoaWxkKSkgeworCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCQotCQkJCS8vIHRvdWNoIHRoZSBwcm9qZWN0cyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlY29tcGlsZWQgd2hpbGUgdGFraW5nIHRoZSB3b3Jrc3BhY2UgbG9jayAKLQkJCQkvLyBzbyB0aGF0IHRoZXJlIGlzIG5vIGNvbmN1cnJlbmN5IHdpdGggdGhlIEphdmEgYnVpbGRlcgotCQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY1NzUKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNUb1RvdWNoW2ldOwotCQkJCQkJCQotCQkJCQkJCS8vIHRvdWNoIHRvIGZvcmNlIGEgYnVpbGQgb2YgdGhpcyBwcm9qZWN0Ci0JCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdWNoaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBkdWUgdG8gZXh0ZXJuYWwgamFyIGZpbGUgY2hhbmdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXByb2plY3QudG91Y2gocHJvZ3Jlc3NNb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmICh0aGlzLmN1cnJlbnREZWx0YSAhPSBudWxsKSB7IC8vIGlmIGRlbHRhIGhhcyBub3QgYmVlbiBmaXJlZCB3aGlsZSBjcmVhdGluZyBtYXJrZXJzCi0JCQkJCXRoaXMuZmlyZSh0aGlzLmN1cnJlbnREZWx0YSwgREVGQVVMVF9DSEFOR0VfRVZFTlQpOwotCQkJCX0KKwkJCQkvLyBJZiB3ZSBzdGFydCBzZWVpbmcgcm9vdCdzIGNsYXNzcGF0aCBlbnRyeSBkaWZmZXJlbnQgZnJvbSB0aGUgY2hpbGQncyBlbnRyeSwgdGhlbiB0aGUgY2hpbGQgY2FuJ3QKKwkJCQkvLyBiZSBwcmVzZW50IGZ1cnRoZXIgZG93biB0aGUgcm9vdHMgYXJyYXkuCisJCQkJaWYgKCEoKElQYWNrYWdlRnJhZ21lbnRSb290KSByb290c1tpXSkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeSgpLmdldFBhdGgoKQorCQkJCQkJLmVxdWFscyhjdXJyZW50RW50cnlQYXRoKSkKKwkJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmN1cnJlbnREZWx0YSA9IG51bGw7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKKworCQkJaWYgKGluZGV4VG9JbnNlcnQgPj0gMCkgeworCQkJCWludCBuZXdTaXplID0gcm9vdHMubGVuZ3RoICsgMTsKKwkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG5ld0NoaWxkcmVuID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W25ld1NpemVdOworCisJCQkJaWYgKGluZGV4VG9JbnNlcnQgPiAwKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJvb3RzLCAwLCBuZXdDaGlsZHJlbiwgMCwgaW5kZXhUb0luc2VydCk7CisKKwkJCQluZXdDaGlsZHJlbltpbmRleFRvSW5zZXJ0XSA9IGNoaWxkOworCQkJCVN5c3RlbS5hcnJheWNvcHkocm9vdHMsIGluZGV4VG9JbnNlcnQsIG5ld0NoaWxkcmVuLCBpbmRleFRvSW5zZXJ0ICsgMSwgKG5ld1NpemUgLSBpbmRleFRvSW5zZXJ0IC0gMSkpOworCQkJCXBhcmVudC5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7CisJCQkJcmV0dXJuOworCQkJfQogCQl9CisJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7CiAJfQogCS8qCiAJICogUHJvY2VzcyB0aGUgZ2l2ZW4gZGVsdGEgYW5kIGxvb2sgZm9yIHByb2plY3RzIGJlaW5nIGFkZGVkLCBvcGVuZWQsIGNsb3NlZCBvcgpAQCAtMzk2LDEzICszNjMsMTMgQEAKIAkgKiBJbiBhbGwgY2FzZXMsIGFkZCB0aGUgcHJvamVjdCdzIGRlcGVuZGVudHMgdG8gdGhlIGxpc3Qgb2YgcHJvamVjdHMgdG8gdXBkYXRlCiAJICogc28gdGhhdCB0aGUgY2xhc3NwYXRoIHJlbGF0ZWQgbWFya2VycyBjYW4gYmUgdXBkYXRlZC4KIAkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tQcm9qZWN0c0JlaW5nQWRkZWRPclJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwlwcml2YXRlIHZvaWQgY2hlY2tQcm9qZWN0c0FuZENsYXNzcGF0aENoYW5nZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKIAkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKIAkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IG51bGw7Ci0JCisKIAkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKIAkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkCiAJCQkJdGhpcy5zdGF0ZS5nZXRPbGRKYXZhUHJvamVjTmFtZXMoKTsgLy8gZm9yY2UgbGlzdCB0byBiZSBjb21wdXRlZAogCQkJCWNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwogCQkJCWJyZWFrOwpAQCAtNDE0LDM2ICszODEsNDAgQEAKIAkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CiAJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKIAkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQl0aGlzLm1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSB0cnVlOwotCQkJCQkKLQkJCQkJCS8vIHJlbWVtYmVyIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbnRzCi0JCQkJCQlhZGRUb1Jvb3RzVG9SZWZyZXNoV2l0aERlcGVuZGVudHMoamF2YVByb2plY3QpOwotCQkJCQkJCi0JCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKKwkJCQkJCXRoaXMubWFuYWdlci5mb3JjZUJhdGNoSW5pdGlhbGl6YXRpb25zKGZhbHNlLypub3QgaW5pdEFmdGVyTG9hZCovKTsKKworCQkJCQkJLy8gcmVtZW1iZXIgdGhhdCB0aGUgcHJvamVjdCdzIGNhY2hlIG11c3QgYmUgcmVzZXQKKwkJCQkJCXRoaXMucHJvamVjdENhY2hlc1RvUmVzZXQuYWRkKGphdmFQcm9qZWN0KTsKKworCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQKIAkJCQkJCWlmIChKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSB7CiAJCQkJCQkJYWRkVG9QYXJlbnRJbmZvKGphdmFQcm9qZWN0KTsKIAkJCQkJCQlyZWFkUmF3Q2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKIAkJCQkJCQkvLyBlbnN1cmUgcHJvamVjdCByZWZlcmVuY2VzIGFyZSB1cGRhdGVkIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTU2OSkKIAkJCQkJCQljaGVja1Byb2plY3RSZWZlcmVuY2VDaGFuZ2UocHJvamVjdCwgamF2YVByb2plY3QpOworCQkJCQkJCS8vIGFuZCBleHRlcm5hbCBmb2xkZXJzIGFzIHdlbGwKKwkJCQkJCQljaGVja0V4dGVybmFsRm9sZGVyQ2hhbmdlKHByb2plY3QsIGphdmFQcm9qZWN0KTsKIAkJCQkJCX0KLQkJCQkJCQotCQkJCQkJdGhpcy5zdGF0ZS5yb290c0FyZVN0YWxlID0gdHJ1ZTsgCisKKwkJCQkJCXRoaXMuc3RhdGUucm9vdHNBcmVTdGFsZSA9IHRydWU7CiAJCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOiAKKworCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgogCQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKLQkJCQkJCQkJdGhpcy5tYW5hZ2VyLmJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zID0gdHJ1ZTsKLQkJCi0JCQkJCQkJCS8vIHByb2plY3Qgb3BlbmVkIG9yIGNsb3NlZDogcmVtZW1iZXIgIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbnRzCi0JCQkJCQkJCWFkZFRvUm9vdHNUb1JlZnJlc2hXaXRoRGVwZW5kZW50cyhqYXZhUHJvamVjdCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKKwkJCQkJCQkJdGhpcy5tYW5hZ2VyLmZvcmNlQmF0Y2hJbml0aWFsaXphdGlvbnMoZmFsc2UvKm5vdCBpbml0QWZ0ZXJMb2FkKi8pOworCisJCQkJCQkJCS8vIHJlbWVtYmVyIHRoYXQgdGhlIHByb2plY3QncyBjYWNoZSBtdXN0IGJlIHJlc2V0CisJCQkJCQkJCXRoaXMucHJvamVjdENhY2hlc1RvUmVzZXQuYWRkKGphdmFQcm9qZWN0KTsKKworCQkJCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZAogCQkJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewogCQkJCQkJCQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsKIAkJCQkJCQkJCQlhZGRUb1BhcmVudEluZm8oamF2YVByb2plY3QpOwogCQkJCQkJCQkJCXJlYWRSYXdDbGFzc3BhdGgoamF2YVByb2plY3QpOwogCQkJCQkJCQkJCS8vIGVuc3VyZSBwcm9qZWN0IHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQKIAkJCQkJCQkJCQljaGVja1Byb2plY3RSZWZlcmVuY2VDaGFuZ2UocHJvamVjdCwgamF2YVByb2plY3QpOworCQkJCQkJCQkJCS8vIGFuZCBleHRlcm5hbCBmb2xkZXJzIGFzIHdlbGwKKwkJCQkJCQkJCQljaGVja0V4dGVybmFsRm9sZGVyQ2hhbmdlKHByb2plY3QsIGphdmFQcm9qZWN0KTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCXRyeSB7CkBAIC00NTEsOCArNDIyLDggQEAKIAkJCQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJCQkJLy8gamF2YSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3Q6IGlnbm9yZQogCQkJCQkJCQkJfQotCQkJCQkJCQkJdGhpcy5yZW1vdmVGcm9tUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7Ci0JCQkJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlUGVyUHJvamVjdEluZm8oamF2YVByb2plY3QpOworCQkJCQkJCQkJcmVtb3ZlRnJvbVBhcmVudEluZm8oamF2YVByb2plY3QpOworCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKGphdmFQcm9qZWN0LCBmYWxzZSAvKiBkb24ndCByZW1vdmUgaW5kZXggZmlsZXMgYW5kIHRpbWVzdGFtcCBpbmZvIG9mIGV4dGVybmFsIGphciAqLyk7CiAJCQkJCQkJCQl0aGlzLm1hbmFnZXIuY29udGFpbmVyUmVtb3ZlKGphdmFQcm9qZWN0KTsKIAkJCQkJCQkJfQogCQkJCQkJCQl0aGlzLnN0YXRlLnJvb3RzQXJlU3RhbGUgPSB0cnVlOwpAQCAtNDYwLDIwICs0MzEsMjIgQEAKIAkJCQkJCQkJYm9vbGVhbiB3YXNKYXZhUHJvamVjdCA9IHRoaXMuc3RhdGUuZmluZEphdmFQcm9qZWN0KHByb2plY3QuZ2V0TmFtZSgpKSAhPSBudWxsOwogCQkJCQkJCQlib29sZWFuIGlzSmF2YVByb2plY3QgPSBKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpOwogCQkJCQkJCQlpZiAod2FzSmF2YVByb2plY3QgIT0gaXNKYXZhUHJvamVjdCkgewotCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLmJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zID0gdHJ1ZTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gamF2YSBuYXR1cmUgYWRkZWQgb3IgcmVtb3ZlZDogcmVtZW1iZXIgIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbnRzCi0JCQkJCQkJCQl0aGlzLmFkZFRvUm9vdHNUb1JlZnJlc2hXaXRoRGVwZW5kZW50cyhqYXZhUHJvamVjdCk7Ci0JCQotCQkJCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQgCisJCQkJCQkJCQl0aGlzLm1hbmFnZXIuZm9yY2VCYXRjaEluaXRpYWxpemF0aW9ucyhmYWxzZS8qbm90IGluaXRBZnRlckxvYWQqLyk7CisKKwkJCQkJCQkJCS8vIGphdmEgbmF0dXJlIGFkZGVkIG9yIHJlbW92ZWQ6IHJlbWVtYmVyIHRoYXQgdGhlIHByb2plY3QncyBjYWNoZSBtdXN0IGJlIHJlc2V0CisJCQkJCQkJCQl0aGlzLnByb2plY3RDYWNoZXNUb1Jlc2V0LmFkZChqYXZhUHJvamVjdCk7CisKKwkJCQkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkCiAJCQkJCQkJCQlpZiAoaXNKYXZhUHJvamVjdCkgewotCQkJCQkJCQkJCXRoaXMuYWRkVG9QYXJlbnRJbmZvKGphdmFQcm9qZWN0KTsKKwkJCQkJCQkJCQlhZGRUb1BhcmVudEluZm8oamF2YVByb2plY3QpOwogCQkJCQkJCQkJCXJlYWRSYXdDbGFzc3BhdGgoamF2YVByb2plY3QpOwogCQkJCQkJCQkJCS8vIGVuc3VyZSBwcm9qZWN0IHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyNjY2KQogCQkJCQkJCQkJCWNoZWNrUHJvamVjdFJlZmVyZW5jZUNoYW5nZShwcm9qZWN0LCBqYXZhUHJvamVjdCk7CisJCQkJCQkJCQkJLy8gYW5kIGV4dGVybmFsIGZvbGRlcnMgYXMgd2VsbAorCQkJCQkJCQkJCWNoZWNrRXh0ZXJuYWxGb2xkZXJDaGFuZ2UocHJvamVjdCwgamF2YVByb2plY3QpOwogCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQkvLyByZW1vdmUgY2xhc3NwYXRoIGNhY2hlIHNvIHRoYXQgaW5pdGlhbGl6ZVJvb3RzKCkgd2lsbCBub3QgY29uc2lkZXIgdGhlIHByb2plY3QgaGFzIGEgY2xhc3NwYXRoCi0JCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKGphdmFQcm9qZWN0KTsKKwkJCQkJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlUGVyUHJvamVjdEluZm8oamF2YVByb2plY3QsIHRydWUgLyogcmVtb3ZlIGV4dGVybmFsIGphciBmaWxlcyBpbmRleGVzIGFuZCB0aW1lc3RhbXBzICovKTsKIAkJCQkJCQkJCQkvLyByZW1vdmUgY29udGFpbmVyIGNhY2hlIGZvciB0aGlzIHByb2plY3QKIAkJCQkJCQkJCQl0aGlzLm1hbmFnZXIuY29udGFpbmVyUmVtb3ZlKGphdmFQcm9qZWN0KTsKIAkJCQkJCQkJCQkvLyBjbG9zZSBwcm9qZWN0CkBAIC00ODIsNDggKzQ1NSw1MiBAQAogCQkJCQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJCQkJCS8vIGphdmEgcHJvamVjdCBkb2Vzbid0IGV4aXN0OiBpZ25vcmUKIAkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdGhpcy5yZW1vdmVGcm9tUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7CisJCQkJCQkJCQkJcmVtb3ZlRnJvbVBhcmVudEluZm8oamF2YVByb2plY3QpOwogCQkJCQkJCQkJfQogCQkJCQkJCQkJdGhpcy5zdGF0ZS5yb290c0FyZVN0YWxlID0gdHJ1ZTsKIAkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCS8vIGluIGNhc2UgdGhlIHByb2plY3Qgd2FzIHJlbW92ZWQgdGhlbiBhZGRlZCB0aGVuIGNoYW5nZWQgKHNlZSBidWcgMTk3OTkpCiAJCQkJCQkJCQlpZiAoaXNKYXZhUHJvamVjdCkgeyAvLyBuZWVkIG5hdHVyZSBjaGVjayAtIDE4Njk4Ci0JCQkJCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oamF2YVByb2plY3QpOworCQkJCQkJCQkJCWFkZFRvUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7CiAJCQkJCQkJCQkJY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKKwkJCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQKIAkJCQkJCQkJLy8gaW4gY2FzZSB0aGUgcHJvamVjdCB3YXMgcmVtb3ZlZCB0aGVuIGFkZGVkIHRoZW4gY2hhbmdlZAogCQkJCQkJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeyAvLyBuZWVkIG5hdHVyZSBjaGVjayAtIDE4Njk4Ci0JCQkJCQkJCQl0aGlzLmFkZFRvUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7CisJCQkJCQkJCQlhZGRUb1BhcmVudEluZm8oamF2YVByb2plY3QpOwogCQkJCQkJCQkJY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCQkJCX0JCQkJCQkKLQkJCQkJCQl9CQkKKwkJCQkJCQkJfQorCQkJCQkJCX0KIAkJCQkJCQlicmVhazsKLQkKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDogCi0JCQkJCQl0aGlzLm1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSB0cnVlOwotCQorCisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCQl0aGlzLm1hbmFnZXIuZm9yY2VCYXRjaEluaXRpYWxpemF0aW9ucyhmYWxzZS8qbm90IGluaXRBZnRlckxvYWQqLyk7CisKIAkJCQkJCS8vIHJlbW92ZSBjbGFzc3BhdGggY2FjaGUgc28gdGhhdCBpbml0aWFsaXplUm9vdHMoKSB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvamVjdCBoYXMgYSBjbGFzc3BhdGgKLQkJCQkJCXRoaXMubWFuYWdlci5yZW1vdmVQZXJQcm9qZWN0SW5mbyhqYXZhUHJvamVjdCk7CisJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlUGVyUHJvamVjdEluZm8oamF2YVByb2plY3QsIHRydWUgLyogcmVtb3ZlIGV4dGVybmFsIGphciBmaWxlcyBpbmRleGVzIGFuZCB0aW1lc3RhbXBzKi8pOwogCQkJCQkJLy8gcmVtb3ZlIGNvbnRhaW5lciBjYWNoZSBmb3IgdGhpcyBwcm9qZWN0CiAJCQkJCQl0aGlzLm1hbmFnZXIuY29udGFpbmVyUmVtb3ZlKGphdmFQcm9qZWN0KTsKLQkJCQkJCQorCiAJCQkJCQl0aGlzLnN0YXRlLnJvb3RzQXJlU3RhbGUgPSB0cnVlOwogCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCQotCQkJCS8vIGluIGFsbCBjYXNlcywgcmVmcmVzaCB0aGUgZXh0ZXJuYWwgamFycyBmb3IgdGhpcyBwcm9qZWN0Ci0JCQkJYWRkRm9yUmVmcmVzaChqYXZhUHJvamVjdCk7Ci0JCQkJCisKKwkJCQlicmVhazsKKwkJCWNhc2UgSVJlc291cmNlLkZPTERFUjoKKwkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsgLy8gbG9vayBmb3IgLmphciBmaWxlIGNoYW5nZSB0byB1cGRhdGUgY2xhc3NwYXRoCisJCQkJCWNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgogCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCS8qIGNsYXNzcGF0aCBmaWxlIGNoYW5nZSAqLworCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOworCQkJCVJvb3RJbmZvIHJvb3RJbmZvOwogCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKSkgewotCQkJCQl0aGlzLm1hbmFnZXIuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSB0cnVlOwotCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQkJCQkvKiBjbGFzc3BhdGggZmlsZSBjaGFuZ2UgKi8KKwkJCQkJdGhpcy5tYW5hZ2VyLmZvcmNlQmF0Y2hJbml0aWFsaXphdGlvbnMoZmFsc2UvKm5vdCBpbml0QWZ0ZXJMb2FkKi8pOworCQkJCQlzd2l0Y2ggKGtpbmQpIHsKIAkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CiAJCQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKIAkJCQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCAgLy8gb25seSBjb25zaWRlciBjb250ZW50IGNoYW5nZQpAQCAtNTMxLDU1ICs1MDgsNjQgQEAKIAkJCQkJCQkJJiYgKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPT0gMCkgey8vIGFuZCBhbHNvIG1vdmUgYW5kIG92ZXJpZGUgc2NlbmFyaW8gKHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDIwKQogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9Ci0JCQkJCQkvLyBmYWxsIHRocm91Z2gKKwkJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgorCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKIAkJCQkJCQlqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQorCiAJCQkJCQkJLy8gZm9yY2UgdG8gKHJlKXJlYWQgdGhlIC5jbGFzc3BhdGggZmlsZQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWphdmFQcm9qZWN0LmdldFBlclByb2plY3RJbmZvKCkucmVhZEFuZENhY2hlQ2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKLQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KKwkJCQkJCQkvLyBpbiBjYXNlIG9mIHJlbW92YWwgKElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHRoaXMgd2lsbCByZXNldCB0aGUgY2xhc3NwYXRoIHRvIGl0cyBkZWZhdWx0IGFuZCBjcmVhdGUgdGhlIHJpZ2h0IGRlbHRhCisJCQkJCQkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExMjkwKQorCQkJCQkJCXJlYWRSYXdDbGFzc3BhdGgoamF2YVByb2plY3QpOwogCQkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCXRoaXMuc3RhdGUucm9vdHNBcmVTdGFsZSA9IHRydWU7CisJCQkJfSBlbHNlIGlmICgocm9vdEluZm8gPSByb290SW5mbyhmaWxlLmdldEZ1bGxQYXRoKCksIGtpbmQpKSAhPSBudWxsICYmIHJvb3RJbmZvLmVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCQkJamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsKKwkJCQkJamF2YVByb2plY3QucmVzZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJCQl0aGlzLnN0YXRlLnJvb3RzQXJlU3RhbGUgPSB0cnVlOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCQkKKwogCQl9CiAJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY2hlY2tQcm9qZWN0c0JlaW5nQWRkZWRPclJlbW92ZWQoY2hpbGRyZW5baV0pOworCQkJCWNoZWNrUHJvamVjdHNBbmRDbGFzc3BhdGhDaGFuZ2VzKGNoaWxkcmVuW2ldKTsKIAkJCX0KIAkJfQogCX0KIAorCXByaXZhdGUgdm9pZCBjaGVja0V4dGVybmFsRm9sZGVyQ2hhbmdlKElQcm9qZWN0IHByb2plY3QsIEphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisJCUNsYXNzcGF0aENoYW5nZSBjaGFuZ2UgPSB0aGlzLnN0YXRlLmdldENsYXNzcGF0aENoYW5nZShwcm9qZWN0KTsKKwkJdGhpcy5zdGF0ZS5hZGRFeHRlcm5hbEZvbGRlckNoYW5nZShqYXZhUHJvamVjdCwgY2hhbmdlID09IG51bGwgPyBudWxsIDogY2hhbmdlLm9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgY2hlY2tQcm9qZWN0UmVmZXJlbmNlQ2hhbmdlKElQcm9qZWN0IHByb2plY3QsIEphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCUNsYXNzcGF0aENoYW5nZSBjaGFuZ2UgPSAoQ2xhc3NwYXRoQ2hhbmdlKSB0aGlzLmNsYXNzcGF0aENoYW5nZXMuZ2V0KHByb2plY3QpOworCQlDbGFzc3BhdGhDaGFuZ2UgY2hhbmdlID0gdGhpcy5zdGF0ZS5nZXRDbGFzc3BhdGhDaGFuZ2UocHJvamVjdCk7CiAJCXRoaXMuc3RhdGUuYWRkUHJvamVjdFJlZmVyZW5jZUNoYW5nZShqYXZhUHJvamVjdCwgY2hhbmdlID09IG51bGwgPyBudWxsIDogY2hhbmdlLm9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgcmVhZFJhd0NsYXNzcGF0aChKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCQkvLyBmb3JjZSB0byAocmUpcmVhZCB0aGUgLmNsYXNzcGF0aCBmaWxlCiAJCXRyeSB7Ci0JCQkvLyBmb3JjZSB0byAocmUpcmVhZCB0aGUgLmNsYXNzcGF0aCBmaWxlCi0JCQlqYXZhUHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpLnJlYWRBbmRDYWNoZUNsYXNzcGF0aChqYXZhUHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CQorCQkJUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBqYXZhUHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpOworCQkJaWYgKCFwZXJQcm9qZWN0SW5mby53cml0dGluZ1Jhd0NsYXNzcGF0aCkgLy8gdG8gYXZvaWQgZGVhZGxvY2ssIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNjgwCisJCQkJcGVyUHJvamVjdEluZm8ucmVhZEFuZENhY2hlQ2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChWRVJCT1NFKSB7CiAJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCX0KIAkJfQogCX0KIAlwcml2YXRlIHZvaWQgY2hlY2tTb3VyY2VBdHRhY2htZW50Q2hhbmdlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2UgcmVzKSB7Ci0JCUlQYXRoIHJvb3RQYXRoID0gKElQYXRoKXRoaXMuc3RhdGUuc291cmNlQXR0YWNobWVudHMuZ2V0KHJlcy5nZXRGdWxsUGF0aCgpKTsKKwkJSVBhdGggcm9vdFBhdGggPSAoSVBhdGgpdGhpcy5zdGF0ZS5zb3VyY2VBdHRhY2htZW50cy5nZXQoZXh0ZXJuYWxQYXRoKHJlcykpOwogCQlpZiAocm9vdFBhdGggIT0gbnVsbCkgewotCQkJUm9vdEluZm8gcm9vdEluZm8gPSB0aGlzLnJvb3RJbmZvKHJvb3RQYXRoLCBkZWx0YS5nZXRLaW5kKCkpOworCQkJUm9vdEluZm8gcm9vdEluZm8gPSByb290SW5mbyhyb290UGF0aCwgZGVsdGEuZ2V0S2luZCgpKTsKIAkJCWlmIChyb290SW5mbyAhPSBudWxsKSB7CiAJCQkJSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QgPSByb290SW5mby5wcm9qZWN0OwogCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOwogCQkJCXRyeSB7Ci0JCQkJCS8vIGNsb3NlIHRoZSByb290IHNvIHRoYXQgc291cmNlIGF0dGFjaGVtZW50IGNhY2hlIGlzIGZsdXNoZWQKKwkJCQkJLy8gY2xvc2UgdGhlIHJvb3Qgc28gdGhhdCBzb3VyY2UgYXR0YWNobWVudCBjYWNoZSBpcyBmbHVzaGVkCiAJCQkJCXJvb3QgPSBwcm9qZWN0T2ZSb290LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3RQYXRoKTsKIAkJCQkJaWYgKHJvb3QgIT0gbnVsbCkgewogCQkJCQkJcm9vdC5jbG9zZSgpOwpAQCAtNjAwLDcgKzU4Niw3IEBACiAJCQkJCQljdXJyZW50RGVsdGEoKS5zb3VyY2VEZXRhY2hlZChyb290KTsKIAkJCQkJCWJyZWFrOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCX0KIAl9CiAJLyoKQEAgLTY1NSwyMCArNjQxLDIwIEBACiAJICovCiAJcHJpdmF0ZSBPcGVuYWJsZSBjcmVhdGVFbGVtZW50KElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGVsZW1lbnRUeXBlLCBSb290SW5mbyByb290SW5mbykgewogCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQorCiAJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwogCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7CiAJCXN3aXRjaCAoZWxlbWVudFR5cGUpIHsKLQkJCQorCiAJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkKKwogCQkJCS8vIG5vdGUgdGhhdCBub24tamF2YSByZXNvdXJjZXMgcm9vdGVkIGF0IHRoZSBwcm9qZWN0IGxldmVsIHdpbGwgYWxzbyBlbnRlciB0aGlzIGNvZGUgd2l0aAogCQkJCS8vIGFuIGVsZW1lbnRUeXBlIEpBVkFfUFJPSkVDVCAoc2VlICNlbGVtZW50VHlwZSguLi4pKS4KIAkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCl7CiAKLQkJCQkJdGhpcy5wb3BVbnRpbFByZWZpeE9mKHBhdGgpOwotCQkJCQkKLQkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAKKwkJCQkJcG9wVW50aWxQcmVmaXhPZihwYXRoKTsKKworCQkJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsCiAJCQkJCQkmJiB0aGlzLmN1cnJlbnRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVAogCQkJCQkJJiYgKChJSmF2YVByb2plY3QpdGhpcy5jdXJyZW50RWxlbWVudCkuZ2V0UHJvamVjdCgpLmVxdWFscyhyZXNvdXJjZSkpIHsKIAkJCQkJCXJldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50OwpAQCAtNjk1LDE0ICs2ODEsMTQgQEAKIAkJCQkJaWYgKHJvb3RJbmZvLnByb2plY3QuY29udGFpbnMocmVzb3VyY2UpKSB7CiAJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdEluZm8uZ2V0UGFja2FnZUZyYWdtZW50Um9vdChudWxsKTsKIAkJCQkJCS8vIGNyZWF0ZSBwYWNrYWdlIGhhbmRsZQotCQkJCQkJSVBhdGggcGtnUGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290SW5mby5yb290UGF0aC5zZWdtZW50Q291bnQoKSk7CisJCQkJCQlJUGF0aCBwa2dQYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3QucmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpKTsKIAkJCQkJCVN0cmluZ1tdIHBrZ05hbWUgPSBwa2dQYXRoLnNlZ21lbnRzKCk7CiAJCQkJCQllbGVtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQkvLyBmaW5kIHRoZSBlbGVtZW50IHRoYXQgZW5jbG9zZXMgdGhlIHJlc291cmNlCi0JCQkJCXRoaXMucG9wVW50aWxQcmVmaXhPZihwYXRoKTsKLQkJCQkKKwkJCQkJcG9wVW50aWxQcmVmaXhPZihwYXRoKTsKKwogCQkJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsKSB7CiAJCQkJCQllbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKTsKIAkJCQkJfSBlbHNlIHsKQEAgLTcyMiw4ICs3MDgsOCBAQAogCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKIAkJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CiAJCQkJLy8gZmluZCB0aGUgZWxlbWVudCB0aGF0IGVuY2xvc2VzIHRoZSByZXNvdXJjZQotCQkJCXRoaXMucG9wVW50aWxQcmVmaXhPZihwYXRoKTsKLQkJCQkKKwkJCQlwb3BVbnRpbFByZWZpeE9mKHBhdGgpOworCiAJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgewogCQkJCQllbGVtZW50ID0gIHJvb3RJbmZvID09IG51bGwgPyBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpIDogSmF2YU1vZGVsTWFuYWdlci5jcmVhdGUocmVzb3VyY2UsIHJvb3RJbmZvLnByb2plY3QpOwogCQkJCX0gZWxzZSB7CkBAIC03NTIsNyArNzM4LDcgQEAKIAkJCQkJCWVsZW1lbnQgPSAgcm9vdEluZm8gPT0gbnVsbCA/IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSkgOiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZShyZXNvdXJjZSwgcm9vdEluZm8ucHJvamVjdCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLQkJCQkJCQkvLyBjcmVhdGUgY29tcGlsYXRpb24gdW5pdCBoYW5kbGUgCisJCQkJCQkJLy8gY3JlYXRlIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlCiAJCQkJCQkJLy8gZmlsZU5hbWUgdmFsaWRhdGlvbiBoYXMgYmVlbiBkb25lIGluIGVsZW1lbnRUeXBlKElSZXNvdXJjZURlbHRhLCBpbnQsIGJvb2xlYW4pCiAJCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwogCQkJCQkJCWVsZW1lbnQgPSBwa2dGcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoZmlsZU5hbWUpOwpAQCAtNzcwLDIxICs3NTYsMTMyIEBACiAJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpZWxlbWVudDsKIAkJcmV0dXJuIHRoaXMuY3VycmVudEVsZW1lbnQ7CiAJfQorCQorCXB1YmxpYyB2b2lkIGNoZWNrRXh0ZXJuYWxBcmNoaXZlQ2hhbmdlcyhJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1Njb3BlLCAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKGVsZW1lbnRzU2NvcGUsIGZhbHNlLCBtb25pdG9yKTsKKwl9CiAJLyoKLQkgKiBDaGVjayBpZiBleHRlcm5hbCBhcmNoaXZlcyBoYXZlIGNoYW5nZWQgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBkZWx0YXMuCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uIGRlbHRhIHdhcyBjcmVhdGVkLgorCSAqIENoZWNrIGFsbCBleHRlcm5hbCBhcmNoaXZlIChyZWZlcmVuY2VkIGJ5IGdpdmVuIHJvb3RzLCBwcm9qZWN0cyBvciBtb2RlbCkgc3RhdHVzIGFuZCBpc3N1ZSBhIGNvcnJlc3BvbmRpbmcgcm9vdCBkZWx0YS4KKwkgKiBBbHNvIHRyaWdnZXJzIGluZGV4IHVwZGF0ZXMKIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAodGhpcy5yZWZyZXNoZWRFbGVtZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkKKwlwcml2YXRlIHZvaWQgY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzU2NvcGUsIGJvb2xlYW4gYXN5bmNocm9ub3VzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCXRyeSB7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKworCQkJYm9vbGVhbiBoYXNFeHRlcm5hbFdvcmtpbmdDb3B5UHJvamVjdCA9IGZhbHNlOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzU2NvcGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzU2NvcGVbaV07CisJCQkJdGhpcy5zdGF0ZS5hZGRGb3JSZWZyZXNoKGVsZW1lbnRzU2NvcGVbaV0pOworCQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKKwkJCQkJLy8gZW5zdXJlIGV4dGVybmFsIHdvcmtpbmcgY29waWVzJyBwcm9qZWN0cycgY2FjaGVzIGFyZSByZXNldAorCQkJCQlIYXNoU2V0IHByb2plY3RzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RXh0ZXJuYWxXb3JraW5nQ29weVByb2plY3RzKCk7CisJCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7CisJCQkJCQloYXNFeHRlcm5hbFdvcmtpbmdDb3B5UHJvamVjdCA9IHRydWU7CisJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3RzLml0ZXJhdG9yKCk7CisJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJCQkJCXByb2plY3QucmVzZXRDYWNoZXMoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUhhc2hTZXQgZWxlbWVudHNUb1JlZnJlc2ggPSB0aGlzLnN0YXRlLnJlbW92ZUV4dGVybmFsRWxlbWVudHNUb1JlZnJlc2goKTsKKwkJCWJvb2xlYW4gaGFzRGVsdGEgPSBlbGVtZW50c1RvUmVmcmVzaCAhPSBudWxsICYmIGNyZWF0ZUV4dGVybmFsQXJjaGl2ZURlbHRhKGVsZW1lbnRzVG9SZWZyZXNoLCBtb25pdG9yKTsKKwkJCWlmIChoYXNEZWx0YSl7CisJCQkJSUphdmFFbGVtZW50RGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gdGhpcy5jdXJyZW50RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCWZpbmFsIGludCBsZW5ndGggPSBwcm9qZWN0RGVsdGFzLmxlbmd0aDsKKwkJCQlmaW5hbCBJUHJvamVjdFtdIHByb2plY3RzVG9Ub3VjaCA9IG5ldyBJUHJvamVjdFtsZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBwcm9qZWN0RGVsdGFzW2ldOworCQkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdClkZWx0YS5nZXRFbGVtZW50KCk7CisJCQkJCXByb2plY3RzVG9Ub3VjaFtpXSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwkJCQl9CisJCQkJaWYgKHByb2plY3RzVG9Ub3VjaC5sZW5ndGggPiAwKSB7CisJCQkJCWlmIChhc3luY2hyb25vdXMpeworCQkJCQkJV29ya3NwYWNlSm9iIHRvdWNoSm9iID0gbmV3IFdvcmtzcGFjZUpvYihNZXNzYWdlcy51cGRhdGluZ19leHRlcm5hbF9hcmNoaXZlc19qb2JOYW1lKSB7CisJCQkJCQkJCisJCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKKwkJCQkJCQkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCBwcm9qZWN0c1RvVG91Y2gubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJdG91Y2hQcm9qZWN0cyhwcm9qZWN0c1RvVG91Y2gsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQkJCX0KKwkJCQkJCQkJZmluYWxseSB7CisJCQkJCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCisJCQkJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCQkJCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX1JFRlJFU0ggPT0gZmFtaWx5OworCQkJCQkJCX0KKwkJCQkJCX07CisJCQkJCQl0b3VjaEpvYi5zY2hlZHVsZSgpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLy8gdG91Y2ggdGhlIHByb2plY3RzIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVjb21waWxlZCB3aGlsZSB0YWtpbmcgdGhlIHdvcmtzcGFjZSBsb2NrCisJCQkJCQkvLwkgc28gdGhhdCB0aGVyZSBpcyBubyBjb25jdXJyZW5jeSB3aXRoIHRoZSBKYXZhIGJ1aWxkZXIKKwkJCQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY1NzUKKwkJCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHNUb1RvdWNoLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNUb1RvdWNoW2ldOworCisJCQkJCQkJCQkvLyB0b3VjaCB0byBmb3JjZSBhIGJ1aWxkIG9mIHRoaXMgcHJvamVjdAorCQkJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG91Y2hpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGR1ZSB0byBleHRlcm5hbCBqYXIgZmlsZSBjaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJCQlwcm9qZWN0LnRvdWNoKHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9OworCQkJCQkJdHJ5IHsKKwkJCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsKKwkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodGhpcy5jdXJyZW50RGVsdGEgIT0gbnVsbCkgeyAvLyBpZiBkZWx0YSBoYXMgbm90IGJlZW4gZmlyZWQgd2hpbGUgY3JlYXRpbmcgbWFya2VycworCQkJCQlmaXJlKHRoaXMuY3VycmVudERlbHRhLCBERUZBVUxUX0NIQU5HRV9FVkVOVCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChoYXNFeHRlcm5hbFdvcmtpbmdDb3B5UHJvamVjdCkgeworCQkJCS8vIGZsdXNoIGphciB0eXBlIGNhY2hlCisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVzZXRKYXJUeXBlQ2FjaGUoKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuY3VycmVudERlbHRhID0gbnVsbDsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG91Y2hQcm9qZWN0cyhmaW5hbCBJUHJvamVjdFtdIHByb2plY3RzVG9Ub3VjaCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCisJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHNUb1RvdWNoLmxlbmd0aDsgaSsrKSB7CisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBwcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IG51bGw6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKTsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1RvVG91Y2hbaV07CisJCQkvLyB0b3VjaCB0byBmb3JjZSBhIGJ1aWxkIG9mIHRoaXMgcHJvamVjdAorCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG91Y2hpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGR1ZSB0byBleHRlcm5hbCBqYXIgZmlsZSBjaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlwcm9qZWN0LnRvdWNoKG1vbml0b3IpOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBleHRlcm5hbCBhcmNoaXZlcyBoYXZlIGNoYW5nZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50cyBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlbHRhcy4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlbHRhIHdhcyBjcmVhdGVkLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVFeHRlcm5hbEFyY2hpdmVEZWx0YShIYXNoU2V0IHJlZnJlc2hlZEVsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwogCQlIYXNoTWFwIGV4dGVybmFsQXJjaGl2ZXNTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwogCQlib29sZWFuIGhhc0RlbHRhID0gZmFsc2U7Ci0JCQorCiAJCS8vIGZpbmQgSkFScyB0byByZWZyZXNoCiAJCUhhc2hTZXQgYXJjaGl2ZVBhdGhzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnJlZnJlc2hlZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXRoaXMucmVmcmVzaGVkRWxlbWVudHMgPSBudWxsOyAvLyBudWxsIG91dCBlYXJseSB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM1MzQpCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVmcmVzaGVkRWxlbWVudHMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSUphdmFFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKIAkJCXN3aXRjaChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpewpAQCAtODIxLDI3ICs5MTgsMjcgQEAKIAkJCQkJCWphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CiAJCQkJCQl0cnkgewogCQkJCQkJCWNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CisJCQkJCQkJZm9yIChpbnQgayA9IDAsIGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgayA8IGNwTGVuZ3RoOyBrKyspeworCQkJCQkJCQlpZiAoY2xhc3NwYXRoW2tdLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSl7CisJCQkJCQkJCQlhcmNoaXZlUGF0aHNUb1JlZnJlc2guYWRkKGNsYXNzcGF0aFtrXS5nZXRQYXRoKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQogCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUyKSB7CiAJCQkJCQkJLy8gcHJvamVjdCBkb2Vzbid0IGV4aXN0IC0+IGlnbm9yZQogCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgayA9IDAsIGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgayA8IGNwTGVuZ3RoOyBrKyspewotCQkJCQkJCWlmIChjbGFzc3BhdGhba10uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKXsKLQkJCQkJCQkJYXJjaGl2ZVBhdGhzVG9SZWZyZXNoLmFkZChjbGFzc3BhdGhba10uZ2V0UGF0aCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gcGVyZm9ybSByZWZyZXNoCiAJCUl0ZXJhdG9yIHByb2plY3ROYW1lcyA9IHRoaXMuc3RhdGUuZ2V0T2xkSmF2YVByb2plY05hbWVzKCkuaXRlcmF0b3IoKTsKIAkJSVdvcmtzcGFjZVJvb3Qgd2tzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAJCXdoaWxlIChwcm9qZWN0TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkKLQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIGJyZWFrOyAKLQkJCQorCisJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSBicmVhazsKKwogCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgcHJvamVjdE5hbWVzLm5leHQoKTsKIAkJCUlQcm9qZWN0IHByb2plY3QgPSB3a3NSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwogCQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSB7CkBAIC04NTgsMzkgKzk1NSwzOSBAQAogCQkJfQogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKXsKIAkJCQlpZiAoZW50cmllc1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQkJCiAJCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJpZXNbal0uZ2V0UGF0aCgpOwotCQkJCQkKKwogCQkJCQlpZiAoIWFyY2hpdmVQYXRoc1RvUmVmcmVzaC5jb250YWlucyhlbnRyeVBhdGgpKSBjb250aW51ZTsgLy8gbm90IHN1cHBvc2VkIHRvIGJlIHJlZnJlc2hlZAotCQkJCQkKLQkJCQkJU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsgCisKKwkJCQkJU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsKIAkJCQkJaWYgKHN0YXR1cyA9PSBudWxsKXsKLQkJCQkJCQorCiAJCQkJCQkvLyBjb21wdXRlIHNoYXJlZCBzdGF0dXMKLQkJCQkJCU9iamVjdCB0YXJnZXRMaWJyYXJ5ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3a3NSb290LCBlbnRyeVBhdGgsIHRydWUpOwotCQkKKwkJCQkJCU9iamVjdCB0YXJnZXRMaWJyYXJ5ID0gSmF2YU1vZGVsLmdldFRhcmdldChlbnRyeVBhdGgsIHRydWUpOworCiAJCQkJCQlpZiAodGFyZ2V0TGlicmFyeSA9PSBudWxsKXsgLy8gbWlzc2luZyBKQVIKLQkJCQkJCQlpZiAodGhpcy5zdGF0ZS5nZXRFeHRlcm5hbExpYlRpbWVTdGFtcHMoKS5yZW1vdmUoZW50cnlQYXRoKSAhPSBudWxsKXsKKwkJCQkJCQlpZiAodGhpcy5zdGF0ZS5nZXRFeHRlcm5hbExpYlRpbWVTdGFtcHMoKS5yZW1vdmUoZW50cnlQYXRoKSAhPSBudWxsIC8qIGZpbGUgd2FzIGtub3duKi8KKwkJCQkJCQkJCSYmIHRoaXMuc3RhdGUucm9vdHMuZ2V0KGVudHJ5UGF0aCkgIT0gbnVsbCAvKiBhbmQgaXQgd2FzIG9uIHRoZSBjbGFzc3BhdGgqLykgewogCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9SRU1PVkVEKTsKIAkJCQkJCQkJLy8gdGhlIGphciB3YXMgcGh5c2ljYWxseSByZW1vdmVkOiByZW1vdmUgdGhlIGluZGV4CiAJCQkJCQkJCXRoaXMubWFuYWdlci5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgoZW50cnlQYXRoKTsKIAkJCQkJCQl9Ci0JCQorCiAJCQkJCQl9IGVsc2UgaWYgKHRhcmdldExpYnJhcnkgaW5zdGFuY2VvZiBGaWxlKXsgLy8gZXh0ZXJuYWwgSkFSCi0JCQorCiAJCQkJCQkJRmlsZSBleHRlcm5hbEZpbGUgPSAoRmlsZSl0YXJnZXRMaWJyYXJ5OwotCQkJCQkJCQorCiAJCQkJCQkJLy8gY2hlY2sgdGltZXN0YW1wIHRvIGZpZ3VyZSBpZiBKQVIgaGFzIGNoYW5nZWQgaW4gc29tZSB3YXkKIAkJCQkJCQlMb25nIG9sZFRpbWVzdGFtcCA9KExvbmcpIHRoaXMuc3RhdGUuZ2V0RXh0ZXJuYWxMaWJUaW1lU3RhbXBzKCkuZ2V0KGVudHJ5UGF0aCk7CiAJCQkJCQkJbG9uZyBuZXdUaW1lU3RhbXAgPSBnZXRUaW1lU3RhbXAoZXh0ZXJuYWxGaWxlKTsKIAkJCQkJCQlpZiAob2xkVGltZXN0YW1wICE9IG51bGwpewotCQkKKwogCQkJCQkJCQlpZiAobmV3VGltZVN0YW1wID09IDApeyAvLyBmaWxlIGRvZXNuJ3QgZXhpc3QKIAkJCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgRVhURVJOQUxfSkFSX1JFTU9WRUQpOwogCQkJCQkJCQkJdGhpcy5zdGF0ZS5nZXRFeHRlcm5hbExpYlRpbWVTdGFtcHMoKS5yZW1vdmUoZW50cnlQYXRoKTsKIAkJCQkJCQkJCS8vIHJlbW92ZSB0aGUgaW5kZXgKIAkJCQkJCQkJCXRoaXMubWFuYWdlci5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgoZW50cnlQYXRoKTsKLQkJCisKIAkJCQkJCQkJfSBlbHNlIGlmIChvbGRUaW1lc3RhbXAubG9uZ1ZhbHVlKCkgIT0gbmV3VGltZVN0YW1wKXsKIAkJCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgRVhURVJOQUxfSkFSX0NIQU5HRUQpOwogCQkJCQkJCQkJdGhpcy5zdGF0ZS5nZXRFeHRlcm5hbExpYlRpbWVTdGFtcHMoKS5wdXQoZW50cnlQYXRoLCBuZXcgTG9uZyhuZXdUaW1lU3RhbXApKTsKQEAgLTkwOCw2ICsxMDA1LDcgQEAKIAkJCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgRVhURVJOQUxfSkFSX0FEREVEKTsKIAkJCQkJCQkJCXRoaXMuc3RhdGUuZ2V0RXh0ZXJuYWxMaWJUaW1lU3RhbXBzKCkucHV0KGVudHJ5UGF0aCwgbmV3IExvbmcobmV3VGltZVN0YW1wKSk7CiAJCQkJCQkJCQkvLyBpbmRleCB0aGUgbmV3IGphcgorCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLmluZGV4TWFuYWdlci5yZW1vdmVJbmRleChlbnRyeVBhdGgpOwogCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLmluZGV4TWFuYWdlci5pbmRleExpYnJhcnkoZW50cnlQYXRoLCBwcm9qZWN0LmdldFByb2plY3QoKSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CkBAIC05MTYsMTQgKzEwMTQsMTUgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQkvLyBhY2NvcmRpbmcgdG8gY29tcHV0ZWQgc3RhdHVzLCBnZW5lcmF0ZSBhIGRlbHRhCi0JCQkJCXN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsgCisJCQkJCXN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsKIAkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKXsKIAkJCQkJCWlmIChzdGF0dXMgPT0gRVhURVJOQUxfSkFSX0FEREVEKXsKIAkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgudG9TdHJpbmcoKSk7CiAJCQkJCQkJaWYgKFZFUkJPU0UpewogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gRXh0ZXJuYWwgSkFSIEFEREVELCBhZmZlY3Rpbmcgcm9vdDogIityb290LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfSAKKwkJCQkJCQl9CiAJCQkJCQkJZWxlbWVudEFkZGVkKHJvb3QsIG51bGwsIG51bGwpOworCQkJCQkJCWphdmFQcm9qZWN0LnJlc2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsgLy8gaW4gY2FzZSBpdCBjb250YWlucyBhIGNoYWluZWQgamFyCiAJCQkJCQkJdGhpcy5zdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKGphdmFQcm9qZWN0KTsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3MzMKIAkJCQkJCQloYXNEZWx0YSA9IHRydWU7CiAJCQkJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBFWFRFUk5BTF9KQVJfQ0hBTkdFRCkgewpAQCAtOTMyLDYgKzEwMzEsNyBAQAogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gRXh0ZXJuYWwgSkFSIENIQU5HRUQsIGFmZmVjdGluZyByb290OiAiK3Jvb3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQl9CiAJCQkJCQkJY29udGVudENoYW5nZWQocm9vdCk7CisJCQkJCQkJamF2YVByb2plY3QucmVzZXRSZXNvbHZlZENsYXNzcGF0aCgpOyAvLyBpbiBjYXNlIGl0IGNvbnRhaW5zIGEgY2hhaW5lZCBqYXIKIAkJCQkJCQloYXNEZWx0YSA9IHRydWU7CiAJCQkJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBFWFRFUk5BTF9KQVJfUkVNT1ZFRCkgewogCQkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGVudHJ5UGF0aC50b1N0cmluZygpKTsKQEAgLTkzOSw2ICsxMDM5LDcgQEAKIAkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEV4dGVybmFsIEpBUiBSRU1PVkVELCBhZmZlY3Rpbmcgcm9vdDogIityb290LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJfQogCQkJCQkJCWVsZW1lbnRSZW1vdmVkKHJvb3QsIG51bGwsIG51bGwpOworCQkJCQkJCWphdmFQcm9qZWN0LnJlc2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsgLy8gaW4gY2FzZSBpdCBjb250YWlucyBhIGNoYWluZWQgamFyCiAJCQkJCQkJdGhpcy5zdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKGphdmFQcm9qZWN0KTsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3MzMKIAkJCQkJCQloYXNEZWx0YSA9IHRydWU7CiAJCQkJCQl9CkBAIC05NDYsNiArMTA0NywxMyBAQAogCQkJCX0KIAkJCX0KIAkJfQorCQkvLyBlbnN1cmUgdGhlIGV4dGVybmFsIGZpbGUgY2FjaGUgaXMgcmVzZXQgc28gdGhhdCBpZiBhIC5qYXIgZmlsZSBpcyBkZWxldGVkIGJ1dCBubyBsb25nZXIgb24gdGhlIGNsYXNzcGF0aCwgaXQgd29uJ3QgYXBwZWFyIGFzIGNoYW5nZWQgbmV4dCB0aW1lIGl0IGlzIGFkZGVkCisJCUphdmFNb2RlbC5mbHVzaEV4dGVybmFsRmlsZUNhY2hlKCk7CisKKwkJaWYgKGhhc0RlbHRhKXsKKwkJCS8vIGZsdXNoIGphciB0eXBlIGNhY2hlCisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZXNldEphclR5cGVDYWNoZSgpOworCQl9CiAJCXJldHVybiBoYXNEZWx0YTsKIAl9CiAJcHJpdmF0ZSBKYXZhRWxlbWVudERlbHRhIGN1cnJlbnREZWx0YSgpIHsKQEAgLTk1OCwxNCArMTA2NiwxNCBAQAogCSAqIE5vdGUgdGhhdCB0aGUgcHJvamVjdCBpcyBhYm91dCB0byBiZSBkZWxldGVkLgogCSAqLwogCXByaXZhdGUgdm9pZCBkZWxldGluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQorCiAJCXRyeSB7Ci0JCQkvLyBkaXNjYXJkIGluZGV4aW5nIGpvYnMgdGhhdCBiZWxvbmcgdG8gdGhpcyBwcm9qZWN0IHNvIHRoYXQgdGhlIHByb2plY3QgY2FuIGJlIAorCQkJLy8gZGlzY2FyZCBpbmRleGluZyBqb2JzIHRoYXQgYmVsb25nIHRvIHRoaXMgcHJvamVjdCBzbyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBiZQogCQkJLy8gZGVsZXRlZCB3aXRob3V0IGludGVyZmVyZW5jZXMgZnJvbSB0aGUgaW5kZXggbWFuYWdlcgogCQkJdGhpcy5tYW5hZ2VyLmluZGV4TWFuYWdlci5kaXNjYXJkSm9icyhwcm9qZWN0LmdldE5hbWUoKSk7CiAKIAkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQorCiAJCQkvLyByZW1lbWJlciByb290cyBvZiB0aGlzIHByb2plY3QKIAkJCWlmICh0aGlzLm9sZFJvb3RzID09IG51bGwpIHsKIAkJCQl0aGlzLm9sZFJvb3RzID0gbmV3IEhhc2hNYXAoKTsKQEAgLTk3NSwyMiArMTA4MywyMiBAQAogCQkJfSBlbHNlIHsKIAkJCQkvLyBjb21wdXRlIHJvb3RzIHdpdGhvdXQgb3BlbmluZyBwcm9qZWN0CiAJCQkJdGhpcy5vbGRSb290cy5wdXQoCi0JCQkJCWphdmFQcm9qZWN0LCAKKwkJCQkJamF2YVByb2plY3QsCiAJCQkJCWphdmFQcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJCQkJCWphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCksIAorCQkJCQkJamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSwKIAkJCQkJCWZhbHNlLAogCQkJCQkJbnVsbCAvKm5vIHJldmVyc2UgbWFwKi8pKTsKIAkJCX0KLQkJCQorCiAJCQlqYXZhUHJvamVjdC5jbG9zZSgpOwogCiAJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZAogCQkJdGhpcy5zdGF0ZS5nZXRPbGRKYXZhUHJvamVjTmFtZXMoKTsgLy8gZm9jZSBsaXN0IHRvIGJlIGNvbXB1dGVkCi0JCQkKLQkJCXRoaXMucmVtb3ZlRnJvbVBhcmVudEluZm8oamF2YVByb2plY3QpOworCisJCQlyZW1vdmVGcm9tUGFyZW50SW5mbyhqYXZhUHJvamVjdCk7CiAKIAkJCS8vIHJlbW92ZSBwcmVmZXJlbmNlcyBmcm9tIHBlciBwcm9qZWN0IGluZm8KLQkJCXRoaXMubWFuYWdlci5yZXNldFByb2plY3RQcmVmZXJlbmNlcyhqYXZhUHJvamVjdCk7CQorCQkJdGhpcy5tYW5hZ2VyLnJlc2V0UHJvamVjdFByZWZlcmVuY2VzKGphdmFQcm9qZWN0KTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGphdmEgcHJvamVjdCBkb2Vzbid0IGV4aXN0OiBpZ25vcmUKIAkJfQpAQCAtMTAwNywyMyArMTExNSwyNSBAQAogCSAqLwogCXByaXZhdGUgdm9pZCBlbGVtZW50QWRkZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIFJvb3RJbmZvIHJvb3RJbmZvKSB7CiAJCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCisKIAkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKIAkJCS8vIHByb2plY3QgYWRkIGlzIGhhbmRsZWQgYnkgSmF2YVByb2plY3QuY29uZmlndXJlKCkgYmVjYXVzZQogCQkJLy8gd2hlbiBhIHByb2plY3QgaXMgY3JlYXRlZCwgaXQgZG9lcyBub3QgeWV0IGhhdmUgYSBqYXZhIG5hdHVyZQotCQkJaWYgKGRlbHRhICE9IG51bGwgJiYgSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZSgoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKKwkJCUlQcm9qZWN0IHByb2plY3Q7CisJCQlpZiAoZGVsdGEgIT0gbnVsbCAmJiBKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QgPSAoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKIAkJCQlhZGRUb1BhcmVudEluZm8oZWxlbWVudCk7CisJCQkJdGhpcy5tYW5hZ2VyLmdldFBlclByb2plY3RJbmZvKHByb2plY3QsIHRydWUgLypjcmVhdGUgaW5mbyBpZiBuZWVkZWQqLykucmVtZW1iZXJFeHRlcm5hbExpYlRpbWVzdGFtcHMoKTsKIAkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7CiAJCQkJCU9wZW5hYmxlIG1vdmVkRnJvbUVsZW1lbnQgPSAoT3BlbmFibGUpZWxlbWVudC5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCkubGFzdFNlZ21lbnQoKSk7CiAJCQkJCWN1cnJlbnREZWx0YSgpLm1vdmVkVG8oZWxlbWVudCwgbW92ZWRGcm9tRWxlbWVudCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJLy8gRm9yY2UgdGhlIHByb2plY3QgdG8gYmUgY2xvc2VkIGFzIGl0IG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQgCisJCQkJCS8vIEZvcmNlIHRoZSBwcm9qZWN0IHRvIGJlIGNsb3NlZCBhcyBpdCBtaWdodCBoYXZlIGJlZW4gb3BlbmVkCiAJCQkJCS8vIGJlZm9yZSB0aGUgcmVzb3VyY2UgbW9kaWZpY2F0aW9uIGNhbWUgaW4gYW5kIGl0IG1pZ2h0IGhhdmUgYSBuZXcgY2hpbGQKIAkJCQkJLy8gRm9yIGV4YW1wbGUsIGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZToKIAkJCQkJLy8gMS4gY3JlYXRlIGEgSmF2YSBwcm9qZWN0IFAgKHdoZXJlIFA9c3JjKQogCQkJCQkvLyAyLiBvcGVuIHByb2plY3QgUAogCQkJCQkvLyAzLiBhZGQgZm9sZGVyIGYgaW4gUCdzIHBrZyBmcmFnbWVudCByb290Ci0JCQkJCS8vIFdoZW4gdGhlIHJlc291cmNlIGRlbHRhIGNvbWVzIGluLCBvbmx5IHRoZSBhZGRpdGlvbiBvZiBQIGlzIG5vdGlmaWVkLCAKKwkJCQkJLy8gV2hlbiB0aGUgcmVzb3VyY2UgZGVsdGEgY29tZXMgaW4sIG9ubHkgdGhlIGFkZGl0aW9uIG9mIFAgaXMgbm90aWZpZWQsCiAJCQkJCS8vIGJ1dCB0aGUgcGtnIGZyYWdtZW50IHJvb3Qgb2YgcHJvamVjdCBQIGlzIGFscmVhZHkgb3BlbmVkLCB0aHVzIGl0cyBjaGlsZHJlbiBhcmUgbm90IHJlY29tcHV0ZWQKIAkJCQkJLy8gYW5kIGl0IGFwcGVhcnMgdG8gY29udGFpbiBvbmx5IHRoZSBkZWZhdWx0IHBhY2thZ2UuCiAJCQkJCWNsb3NlKGVsZW1lbnQpOwpAQCAtMTAzMSwxMiArMTE0MSwxMSBAQAogCQkJCQljdXJyZW50RGVsdGEoKS5hZGRlZChlbGVtZW50KTsKIAkJCQl9CiAJCQkJdGhpcy5zdGF0ZS51cGRhdGVSb290cyhlbGVtZW50LmdldFBhdGgoKSwgZGVsdGEsIHRoaXMpOwotCQkJCQotCQkJCS8vIHJlZnJlc2ggcGtnIGZyYWdtZW50IHJvb3RzIGFuZCBjYWNoZXMgb2YgdGhlIHByb2plY3QgKGFuZCBpdHMgZGVwZW5kZW50cykKLQkJCQl0aGlzLnJvb3RzVG9SZWZyZXNoLmFkZChlbGVtZW50KTsKKworCQkJCS8vIHJlbWVtYmVyIHRoYXQgdGhlIHByb2plY3QncyBjYWNoZSBtdXN0IGJlIHJlc2V0CiAJCQkJdGhpcy5wcm9qZWN0Q2FjaGVzVG9SZXNldC5hZGQoZWxlbWVudCk7CiAJCQl9Ci0JCX0gZWxzZSB7CQkJCisJCX0gZWxzZSB7CiAJCQlpZiAoZGVsdGEgPT0gbnVsbCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pID09IDApIHsKIAkJCQkvLyByZWd1bGFyIGVsZW1lbnQgYWRkaXRpb24KIAkJCQlpZiAoaXNQcmltYXJ5V29ya2luZ0NvcHkoZWxlbWVudCwgZWxlbWVudFR5cGUpICkgewpAQCAtMTA0NSwyNSArMTE1NCwyNSBAQAogCQkJCQljdXJyZW50RGVsdGEoKS5jaGFuZ2VkKGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJYWRkVG9QYXJlbnRJbmZvKGVsZW1lbnQpOwotCQkJCQkKLQkJCQkJLy8gRm9yY2UgdGhlIGVsZW1lbnQgdG8gYmUgY2xvc2VkIGFzIGl0IG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQgCisKKwkJCQkJLy8gRm9yY2UgdGhlIGVsZW1lbnQgdG8gYmUgY2xvc2VkIGFzIGl0IG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQKIAkJCQkJLy8gYmVmb3JlIHRoZSByZXNvdXJjZSBtb2RpZmljYXRpb24gY2FtZSBpbiBhbmQgaXQgbWlnaHQgaGF2ZSBhIG5ldyBjaGlsZAogCQkJCQkvLyBGb3IgZXhhbXBsZSwgaW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlOgogCQkJCQkvLyAxLiBjcmVhdGUgYSBwYWNrYWdlIGZyYWdtZW50IHAgdXNpbmcgYSBqYXZhIG1vZGVsIG9wZXJhdGlvbgogCQkJCQkvLyAyLiBvcGVuIHBhY2thZ2UgcAogCQkJCQkvLyAzLiBhZGQgZmlsZSBYLmphdmEgaW4gZm9sZGVyIHAKLQkJCQkJLy8gV2hlbiB0aGUgcmVzb3VyY2UgZGVsdGEgY29tZXMgaW4sIG9ubHkgdGhlIGFkZGl0aW9uIG9mIHAgaXMgbm90aWZpZWQsIAorCQkJCQkvLyBXaGVuIHRoZSByZXNvdXJjZSBkZWx0YSBjb21lcyBpbiwgb25seSB0aGUgYWRkaXRpb24gb2YgcCBpcyBub3RpZmllZCwKIAkJCQkJLy8gYnV0IHRoZSBwYWNrYWdlIHAgaXMgYWxyZWFkeSBvcGVuZWQsIHRodXMgaXRzIGNoaWxkcmVuIGFyZSBub3QgcmVjb21wdXRlZAogCQkJCQkvLyBhbmQgaXQgYXBwZWFycyBlbXB0eS4KIAkJCQkJY2xvc2UoZWxlbWVudCk7Ci0JCQkKKwogCQkJCQljdXJyZW50RGVsdGEoKS5hZGRlZChlbGVtZW50KTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCS8vIGVsZW1lbnQgaXMgbW92ZWQKIAkJCQlhZGRUb1BhcmVudEluZm8oZWxlbWVudCk7CiAJCQkJY2xvc2UoZWxlbWVudCk7Ci0JCQkKKwogCQkJCUlQYXRoIG1vdmVkRnJvbVBhdGggPSBkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCk7CiAJCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7CiAJCQkJSVJlc291cmNlIG1vdmVkRnJvbVJlczsKQEAgLTEwNzIsMjQgKzExODEsMjUgQEAKIAkJCQl9IGVsc2UgewogCQkJCQltb3ZlZEZyb21SZXMgPSByZXMuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihtb3ZlZEZyb21QYXRoKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyBmaW5kIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIG1vdmVkIGZyb20gZWxlbWVudAotCQkJCVJvb3RJbmZvIG1vdmVkRnJvbUluZm8gPSB0aGlzLmVuY2xvc2luZ1Jvb3RJbmZvKG1vdmVkRnJvbVBhdGgsIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpOwotCQkJCWludCBtb3ZlZEZyb21UeXBlID0gCi0JCQkJCXRoaXMuZWxlbWVudFR5cGUoCi0JCQkJCQltb3ZlZEZyb21SZXMsIAorCQkJCUlQYXRoIHJvb3RQYXRoID0gZXh0ZXJuYWxQYXRoKG1vdmVkRnJvbVJlcyk7CisJCQkJUm9vdEluZm8gbW92ZWRGcm9tSW5mbyA9IGVuY2xvc2luZ1Jvb3RJbmZvKHJvb3RQYXRoLCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKKwkJCQlpbnQgbW92ZWRGcm9tVHlwZSA9CisJCQkJCWVsZW1lbnRUeXBlKAorCQkJCQkJbW92ZWRGcm9tUmVzLAogCQkJCQkJSVJlc291cmNlRGVsdGEuUkVNT1ZFRCwKLQkJCQkJCWVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudFR5cGUoKSwgCisJCQkJCQllbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnRUeXBlKCksCiAJCQkJCQltb3ZlZEZyb21JbmZvKTsKLQkJCQkKKwogCQkJCS8vIHJlc2V0IGN1cnJlbnQgZWxlbWVudCBhcyBpdCBtaWdodCBiZSBpbnNpZGUgYSBuZXN0ZWQgcm9vdCAocG9wVW50aWxQcmVmaXhPZigpIG1heSB1c2UgdGhlIG91dGVyIHJvb3QpCiAJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7Ci0JCQkKKwogCQkJCS8vIGNyZWF0ZSB0aGUgbW92ZWQgZnJvbSBlbGVtZW50Ci0JCQkJT3BlbmFibGUgbW92ZWRGcm9tRWxlbWVudCA9IAotCQkJCQllbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUICYmIG1vdmVkRnJvbVR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA/IAorCQkJCU9wZW5hYmxlIG1vdmVkRnJvbUVsZW1lbnQgPQorCQkJCQllbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUICYmIG1vdmVkRnJvbVR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA/CiAJCQkJCQludWxsIDogLy8gb3V0c2lkZSBjbGFzc3BhdGgKLQkJCQkJCXRoaXMuY3JlYXRlRWxlbWVudChtb3ZlZEZyb21SZXMsIG1vdmVkRnJvbVR5cGUsIG1vdmVkRnJvbUluZm8pOworCQkJCQkJY3JlYXRlRWxlbWVudChtb3ZlZEZyb21SZXMsIG1vdmVkRnJvbVR5cGUsIG1vdmVkRnJvbUluZm8pOwogCQkJCWlmIChtb3ZlZEZyb21FbGVtZW50ID09IG51bGwpIHsKIAkJCQkJLy8gbW92ZWQgZnJvbSBvdXRzaWRlIGNsYXNzcGF0aAogCQkJCQljdXJyZW50RGVsdGEoKS5hZGRlZChlbGVtZW50KTsKQEAgLTEwOTcsMjEgKzEyMDcsMjAgQEAKIAkJCQkJY3VycmVudERlbHRhKCkubW92ZWRUbyhlbGVtZW50LCBtb3ZlZEZyb21FbGVtZW50KTsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJc3dpdGNoIChlbGVtZW50VHlwZSkgewogCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6CiAJCQkJCS8vIHdoZW4gYSByb290IGlzIGFkZGVkLCBhbmQgaXMgb24gdGhlIGNsYXNzcGF0aCwgdGhlIHByb2plY3QgbXVzdCBiZSB1cGRhdGVkCiAJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKIAotCQkJCQkvLyByZWZyZXNoIHBrZyBmcmFnbWVudCByb290cyBhbmQgY2FjaGVzIG9mIHRoZSBwcm9qZWN0IChhbmQgaXRzIGRlcGVuZGVudHMpCi0JCQkJCXRoaXMucm9vdHNUb1JlZnJlc2guYWRkKHByb2plY3QpOworCQkJCQkvLyByZW1lbWJlciB0aGF0IHRoZSBwcm9qZWN0J3MgY2FjaGUgbXVzdCBiZSByZXNldAogCQkJCQl0aGlzLnByb2plY3RDYWNoZXNUb1Jlc2V0LmFkZChwcm9qZWN0KTsKLQkJCQkJCisKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJCS8vIHJlc2V0IHByb2plY3QncyBwYWNrYWdlIGZyYWdtZW50IGNhY2hlIAorCQkJCQkvLyByZXNldCBwcm9qZWN0J3MgcGFja2FnZSBmcmFnbWVudCBjYWNoZQogCQkJCQlwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkJCXRoaXMucHJvamVjdENhY2hlc1RvUmVzZXQuYWRkKHByb2plY3QpOwkJCQkJCQorCQkJCQl0aGlzLnByb2plY3RDYWNoZXNUb1Jlc2V0LmFkZChwcm9qZWN0KTsKIAogCQkJCQlicmVhazsKIAkJCX0KQEAgLTExMjYsNyArMTIzNSw3IEBACiAJICogRGVsdGEgYXJndW1lbnQgY291bGQgYmUgbnVsbCBpZiBwcm9jZXNzaW5nIGFuIGV4dGVybmFsIEpBUiBjaGFuZ2UKIAkgKi8KIAlwcml2YXRlIHZvaWQgZWxlbWVudFJlbW92ZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIFJvb3RJbmZvIHJvb3RJbmZvKSB7Ci0JCQorCiAJCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKIAkJaWYgKGRlbHRhID09IG51bGwgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgPT0gMCkgewogCQkJLy8gcmVndWxhciBlbGVtZW50IHJlbW92YWwKQEAgLTExNjEsMjIgKzEyNzAsMjMgQEAKIAkJCX0KIAogCQkJLy8gZmluZCB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBtb3ZlZCBmcm9tIGVsZW1lbnQKLQkJCVJvb3RJbmZvIG1vdmVkVG9JbmZvID0gdGhpcy5lbmNsb3NpbmdSb290SW5mbyhtb3ZlZFRvUGF0aCwgSVJlc291cmNlRGVsdGEuQURERUQpOwotCQkJaW50IG1vdmVkVG9UeXBlID0gCi0JCQkJdGhpcy5lbGVtZW50VHlwZSgKLQkJCQkJbW92ZWRUb1JlcywgCisJCQlJUGF0aCByb290UGF0aCA9IGV4dGVybmFsUGF0aChtb3ZlZFRvUmVzKTsKKwkJCVJvb3RJbmZvIG1vdmVkVG9JbmZvID0gZW5jbG9zaW5nUm9vdEluZm8ocm9vdFBhdGgsIElSZXNvdXJjZURlbHRhLkFEREVEKTsKKwkJCWludCBtb3ZlZFRvVHlwZSA9CisJCQkJZWxlbWVudFR5cGUoCisJCQkJCW1vdmVkVG9SZXMsCiAJCQkJCUlSZXNvdXJjZURlbHRhLkFEREVELAotCQkJCQllbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnRUeXBlKCksIAorCQkJCQllbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnRUeXBlKCksCiAJCQkJCW1vdmVkVG9JbmZvKTsKIAogCQkJLy8gcmVzZXQgY3VycmVudCBlbGVtZW50IGFzIGl0IG1pZ2h0IGJlIGluc2lkZSBhIG5lc3RlZCByb290IChwb3BVbnRpbFByZWZpeE9mKCkgbWF5IHVzZSB0aGUgb3V0ZXIgcm9vdCkKIAkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSBudWxsOwotCQkJCisKIAkJCS8vIGNyZWF0ZSB0aGUgbW92ZWQgVG8gZWxlbWVudAotCQkJT3BlbmFibGUgbW92ZWRUb0VsZW1lbnQgPSAKLQkJCQllbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUICYmIG1vdmVkVG9UeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgPyAKKwkJCU9wZW5hYmxlIG1vdmVkVG9FbGVtZW50ID0KKwkJCQllbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUICYmIG1vdmVkVG9UeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgPwogCQkJCQludWxsIDogLy8gb3V0c2lkZSBjbGFzc3BhdGgKLQkJCQkJdGhpcy5jcmVhdGVFbGVtZW50KG1vdmVkVG9SZXMsIG1vdmVkVG9UeXBlLCBtb3ZlZFRvSW5mbyk7CisJCQkJCWNyZWF0ZUVsZW1lbnQobW92ZWRUb1JlcywgbW92ZWRUb1R5cGUsIG1vdmVkVG9JbmZvKTsKIAkJCWlmIChtb3ZlZFRvRWxlbWVudCA9PSBudWxsKSB7CiAJCQkJLy8gbW92ZWQgb3V0c2lkZSBjbGFzc3BhdGgKIAkJCQljdXJyZW50RGVsdGEoKS5yZW1vdmVkKGVsZW1lbnQpOwpAQCAtMTE5MiwxNyArMTMwMiwxNSBAQAogCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKIAkJCQl0aGlzLnN0YXRlLnVwZGF0ZVJvb3RzKGVsZW1lbnQuZ2V0UGF0aCgpLCBkZWx0YSwgdGhpcyk7CiAKLQkJCQkvLyByZWZyZXNoIHBrZyBmcmFnbWVudCByb290cyBhbmQgY2FjaGVzIG9mIHRoZSBwcm9qZWN0IChhbmQgaXRzIGRlcGVuZGVudHMpCi0JCQkJdGhpcy5yb290c1RvUmVmcmVzaC5hZGQoZWxlbWVudCk7CisJCQkJLy8gcmVtZW1iZXIgdGhhdCB0aGUgcHJvamVjdCdzIGNhY2hlIG11c3QgYmUgcmVzZXQKIAkJCQl0aGlzLnByb2plY3RDYWNoZXNUb1Jlc2V0LmFkZChlbGVtZW50KTsKIAogCQkJCWJyZWFrOwogCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKIAkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7CiAKLQkJCQkvLyByZWZyZXNoIHBrZyBmcmFnbWVudCByb290cyBhbmQgY2FjaGVzIG9mIHRoZSBwcm9qZWN0IChhbmQgaXRzIGRlcGVuZGVudHMpCi0JCQkJdGhpcy5yb290c1RvUmVmcmVzaC5hZGQocHJvamVjdCk7Ci0JCQkJdGhpcy5wcm9qZWN0Q2FjaGVzVG9SZXNldC5hZGQocHJvamVjdCk7CQkJCQorCQkJCS8vIHJlbWVtYmVyIHRoYXQgdGhlIHByb2plY3QncyBjYWNoZSBtdXN0IGJlIHJlc2V0CisJCQkJdGhpcy5wcm9qZWN0Q2FjaGVzVG9SZXNldC5hZGQocHJvamVjdCk7CiAKIAkJCQlicmVhazsKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgpAQCAtMTIyMiwyMyArMTMzMCwyNCBAQAogCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKIAkJCQkvLyBjYXNlIG9mIGEgbW92ZWRUbyBvciBtb3ZlZEZyb20gcHJvamVjdCAob3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgaW4gcHJvY2Vzc1Jlc291cmNlRGVsdGEoLi4uKQogCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOwotCQkJCisKIAkJCWNhc2UgTk9OX0pBVkFfUkVTT1VSQ0U6CiAJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CiAJCQkJaWYgKHJvb3RJbmZvID09IG51bGwpIHsKLQkJCQkJcm9vdEluZm8gPSB0aGlzLmVuY2xvc2luZ1Jvb3RJbmZvKHJlcy5nZXRGdWxsUGF0aCgpLCBraW5kKTsKKwkJCQkJcm9vdEluZm8gPSBlbmNsb3NpbmdSb290SW5mbyhyZXMuZ2V0RnVsbFBhdGgoKSwga2luZCk7CiAJCQkJfQogCQkJCWlmIChyb290SW5mbyAhPSBudWxsICYmIHJvb3RJbmZvLmlzUm9vdE9mUHJvamVjdChyZXMuZ2V0RnVsbFBhdGgoKSkpIHsKIAkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q7Ci0JCQkJfSAKKwkJCQl9CiAJCQkJLy8gbm90IHlldCBpbiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvciByb290IG9mIGFub3RoZXIgcHJvamVjdAogCQkJCS8vIG9yIHBhY2thZ2UgZnJhZ21lbnQgdG8gYmUgaW5jbHVkZWQgKHNlZSBiZWxvdykKLQkJCQkvLyAtPiBsZXQgaXQgZ28gdGhyb3VnaAorCQkJCS8vICRGQUxMLVRIUk9VR0gkCiAKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CiAJCQkJaWYgKHJvb3RJbmZvID09IG51bGwpIHsKLQkJCQkJcm9vdEluZm8gPSB0aGlzLmVuY2xvc2luZ1Jvb3RJbmZvKHJlcy5nZXRGdWxsUGF0aCgpLCBraW5kKTsKKwkJCQkJSVBhdGggcm9vdFBhdGggPSBleHRlcm5hbFBhdGgocmVzKTsKKwkJCQkJcm9vdEluZm8gPSBlbmNsb3NpbmdSb290SW5mbyhyb290UGF0aCwga2luZCk7CiAJCQkJfQogCQkJCWlmIChyb290SW5mbyA9PSBudWxsKSB7CiAJCQkJCXJldHVybiBOT05fSkFWQV9SRVNPVVJDRTsKQEAgLTEyNjUsMTQgKzEzNzQsMTcgQEAKIAkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOwogCQkJCX0gZWxzZSBpZiAoVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCkpIHsKIAkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOwotCQkJCX0gZWxzZSBpZiAoKHJvb3RJbmZvID0gdGhpcy5yb290SW5mbyhyZXMuZ2V0RnVsbFBhdGgoKSwga2luZCkpICE9IG51bGwgCi0JCQkJCQkmJiByb290SW5mby5wcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YocmVzLmdldEZ1bGxQYXRoKCkpIC8qZW5zdXJlIHJvb3QgaXMgYSByb290IG9mIGl0cyBwcm9qZWN0IChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTMxMCkgKi8pIHsKLQkJCQkJLy8gY2FzZSBvZiBwcm9qPXNyYz1iaW4gYW5kIHJlc291cmNlIGlzIGEgamFyIGZpbGUgb24gdGhlIGNsYXNzcGF0aAotCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDsKIAkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gTk9OX0pBVkFfUkVTT1VSQ0U7CisJCQkJCUlQYXRoIHJvb3RQYXRoID0gZXh0ZXJuYWxQYXRoKHJlcyk7CisJCQkJCWlmICgocm9vdEluZm8gPSByb290SW5mbyhyb290UGF0aCwga2luZCkpICE9IG51bGwKKwkJCQkJCQkmJiByb290SW5mby5wcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2Yocm9vdFBhdGgpIC8qZW5zdXJlIHJvb3QgaXMgYSByb290IG9mIGl0cyBwcm9qZWN0IChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTMxMCkgKi8pIHsKKwkJCQkJCS8vIGNhc2Ugb2YgcHJvaj1zcmM9YmluIGFuZCByZXNvdXJjZSBpcyBhIGphciBmaWxlIG9uIHRoZSBjbGFzc3BhdGgKKwkJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIE5PTl9KQVZBX1JFU09VUkNFOworCQkJCQl9CiAJCQkJfQotCQkJCQorCiAJCQlkZWZhdWx0OgogCQkJCXJldHVybiBOT05fSkFWQV9SRVNPVVJDRTsKIAkJfQpAQCAtMTI5NSw0NCArMTQwNyw1MiBAQAogCSAqLwogCXByaXZhdGUgUm9vdEluZm8gZW5jbG9zaW5nUm9vdEluZm8oSVBhdGggcGF0aCwgaW50IGtpbmQpIHsKIAkJd2hpbGUgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJUm9vdEluZm8gcm9vdEluZm8gPSAgdGhpcy5yb290SW5mbyhwYXRoLCBraW5kKTsKKwkJCVJvb3RJbmZvIHJvb3RJbmZvID0gIHJvb3RJbmZvKHBhdGgsIGtpbmQpOwogCQkJaWYgKHJvb3RJbmZvICE9IG51bGwpIHJldHVybiByb290SW5mbzsKIAkJCXBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CisKKwlwcml2YXRlIElQYXRoIGV4dGVybmFsUGF0aChJUmVzb3VyY2UgcmVzKSB7CisJCUlQYXRoIHJlc291cmNlUGF0aCA9IHJlcy5nZXRGdWxsUGF0aCgpOworCQlpZiAoRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5pc0ludGVybmFsUGF0aEZvckV4dGVybmFsRm9sZGVyKHJlc291cmNlUGF0aCkpCisJCQlyZXR1cm4gcmVzLmdldExvY2F0aW9uKCk7CisJCXJldHVybiByZXNvdXJjZVBhdGg7CisJfQorCiAJLyoKIAkgKiBGaXJlIEphdmEgTW9kZWwgZGVsdGEsIGZsdXNoaW5nIHRoZW0gYWZ0ZXIgdGhlIGZhY3QgYWZ0ZXIgcG9zdF9jaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIElmIHRoZSBmaXJpbmcgbW9kZSBoYXMgYmVlbiB0dXJuZWQgb2ZmLCB0aGlzIGhhcyBubyBlZmZlY3QuIAorCSAqIElmIHRoZSBmaXJpbmcgbW9kZSBoYXMgYmVlbiB0dXJuZWQgb2ZmLCB0aGlzIGhhcyBubyBlZmZlY3QuCiAJICovCiAJcHVibGljIHZvaWQgZmlyZShJSmF2YUVsZW1lbnREZWx0YSBjdXN0b21EZWx0YSwgaW50IGV2ZW50VHlwZSkgewogCQlpZiAoIXRoaXMuaXNGaXJpbmcpIHJldHVybjsKLQkJCisKIAkJaWYgKERFQlVHKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ly8kTk9OLU5MUy0xJAogCQl9CiAKIAkJSUphdmFFbGVtZW50RGVsdGEgZGVsdGFUb05vdGlmeTsKIAkJaWYgKGN1c3RvbURlbHRhID09IG51bGwpewotCQkJZGVsdGFUb05vdGlmeSA9IHRoaXMubWVyZ2VEZWx0YXModGhpcy5qYXZhTW9kZWxEZWx0YXMpOworCQkJZGVsdGFUb05vdGlmeSA9IG1lcmdlRGVsdGFzKHRoaXMuamF2YU1vZGVsRGVsdGFzKTsKIAkJfSBlbHNlIHsKIAkJCWRlbHRhVG9Ob3RpZnkgPSBjdXN0b21EZWx0YTsKIAkJfQotCQkJCisKIAkJLy8gUmVmcmVzaCBpbnRlcm5hbCBzY29wZXMKIAkJaWYgKGRlbHRhVG9Ob3RpZnkgIT0gbnVsbCkgewogCQkJSXRlcmF0b3Igc2NvcGVzID0gdGhpcy5tYW5hZ2VyLnNlYXJjaFNjb3Blcy5rZXlTZXQoKS5pdGVyYXRvcigpOwogCQkJd2hpbGUgKHNjb3Blcy5oYXNOZXh0KCkpIHsKIAkJCQlBYnN0cmFjdFNlYXJjaFNjb3BlIHNjb3BlID0gKEFic3RyYWN0U2VhcmNoU2NvcGUpc2NvcGVzLm5leHQoKTsKLQkJCQlzY29wZS5wcm9jZXNzRGVsdGEoZGVsdGFUb05vdGlmeSk7CisJCQkJc2NvcGUucHJvY2Vzc0RlbHRhKGRlbHRhVG9Ob3RpZnksIGV2ZW50VHlwZSk7CiAJCQl9CiAJCQlKYXZhV29ya3NwYWNlU2NvcGUgd29ya3NwYWNlU2NvcGUgPSB0aGlzLm1hbmFnZXIud29ya3NwYWNlU2NvcGU7CiAJCQlpZiAod29ya3NwYWNlU2NvcGUgIT0gbnVsbCkKLQkJCQl3b3Jrc3BhY2VTY29wZS5wcm9jZXNzRGVsdGEoZGVsdGFUb05vdGlmeSk7CisJCQkJd29ya3NwYWNlU2NvcGUucHJvY2Vzc0RlbHRhKGRlbHRhVG9Ob3RpZnksIGV2ZW50VHlwZSk7CiAJCX0KLQkJCQorCiAJCS8vIE5vdGlmaWNhdGlvbgotCQorCiAJCS8vIEltcG9ydGFudDogaWYgYW55IGxpc3RlbmVyIHJlYWN0cyB0byBub3RpZmljYXRpb24gYnkgdXBkYXRpbmcgdGhlIGxpc3RlbmVycyBsaXN0IG9yIG1hc2ssIHRoZXNlIGxpc3RzIHdpbGwKIAkJLy8gYmUgZHVwbGljYXRlZCwgc28gaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbWVtYmVyIG9yaWdpbmFsIGxpc3RzIGluIGEgdmFyaWFibGUgKHNpbmNlIGZpZWxkIHZhbHVlcyBtYXkgY2hhbmdlIHVuZGVyIHVzKQogCQlJRWxlbWVudENoYW5nZWRMaXN0ZW5lcltdIGxpc3RlbmVyczsKQEAgLTEzNDYsOSArMTQ2Niw2IEBACiAKIAkJc3dpdGNoIChldmVudFR5cGUpIHsKIAkJCWNhc2UgREVGQVVMVF9DSEFOR0VfRVZFTlQ6Ci0JCQkJZmlyZVBvc3RDaGFuZ2VEZWx0YShkZWx0YVRvTm90aWZ5LCBsaXN0ZW5lcnMsIGxpc3RlbmVyTWFzaywgbGlzdGVuZXJDb3VudCk7Ci0JCQkJZmlyZVJlY29uY2lsZURlbHRhKGxpc3RlbmVycywgbGlzdGVuZXJNYXNrLCBsaXN0ZW5lckNvdW50KTsKLQkJCQlicmVhazsKIAkJCWNhc2UgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRToKIAkJCQlmaXJlUG9zdENoYW5nZURlbHRhKGRlbHRhVG9Ob3RpZnksIGxpc3RlbmVycywgbGlzdGVuZXJNYXNrLCBsaXN0ZW5lckNvdW50KTsKIAkJCQlmaXJlUmVjb25jaWxlRGVsdGEobGlzdGVuZXJzLCBsaXN0ZW5lck1hc2ssIGxpc3RlbmVyQ291bnQpOwpAQCAtMTM2MSw3ICsxNDc4LDcgQEAKIAkJSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJbXSBsaXN0ZW5lcnMsCiAJCWludFtdIGxpc3RlbmVyTWFzaywKIAkJaW50IGxpc3RlbmVyQ291bnQpIHsKLQkJCQorCiAJCS8vIHBvc3QgY2hhbmdlIGRlbHRhcwogCQlpZiAoREVCVUcpewogCQkJU3lzdGVtLm91dC5wcmludGxuKCJGSVJJTkcgUE9TVF9DSEFOR0UgRGVsdGEgWyIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiXToiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKQEAgLTEzNjksMTQgKzE0ODYsMTQgQEAKIAkJfQogCQlpZiAoZGVsdGFUb05vdGlmeSAhPSBudWxsKSB7CiAJCQkvLyBmbHVzaCBub3cgc28gYXMgdG8ga2VlcCBsaXN0ZW5lciByZWFjdGlvbnMgdG8gcG9zdCB0aGVpciBvd24gZGVsdGFzIGZvciBzdWJzZXF1ZW50IGl0ZXJhdGlvbgotCQkJdGhpcy5mbHVzaCgpOwotCQkJCisJCQlmbHVzaCgpOworCiAJCQkvLyBtYXJrIHRoZSBvcGVyYXRpb24gc3RhY2sgaGFzIG5vdCBtb2RpZnlpbmcgcmVzb3VyY2VzIHNpbmNlIHJlc291cmNlIGRlbHRhcyBhcmUgYmVpbmcgZmlyZWQKIAkJCUphdmFNb2RlbE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoSmF2YU1vZGVsT3BlcmF0aW9uLkhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBudWxsKTsKLQkJCQorCiAJCQlub3RpZnlMaXN0ZW5lcnMoZGVsdGFUb05vdGlmeSwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSwgbGlzdGVuZXJzLCBsaXN0ZW5lck1hc2ssIGxpc3RlbmVyQ291bnQpOwotCQl9IAotCX0JCQorCQl9CisJfQogCXByaXZhdGUgdm9pZCBmaXJlUmVjb25jaWxlRGVsdGEoCiAJCUlFbGVtZW50Q2hhbmdlZExpc3RlbmVyW10gbGlzdGVuZXJzLAogCQlpbnRbXSBsaXN0ZW5lck1hc2ssCkBAIC0xMzkxLDkgKzE1MDgsOSBAQAogCQlpZiAoZGVsdGFUb05vdGlmeSAhPSBudWxsKSB7CiAJCQkvLyBmbHVzaCBub3cgc28gYXMgdG8ga2VlcCBsaXN0ZW5lciByZWFjdGlvbnMgdG8gcG9zdCB0aGVpciBvd24gZGVsdGFzIGZvciBzdWJzZXF1ZW50IGl0ZXJhdGlvbgogCQkJdGhpcy5yZWNvbmNpbGVEZWx0YXMgPSBuZXcgSGFzaE1hcCgpOwotCQkKKwogCQkJbm90aWZ5TGlzdGVuZXJzKGRlbHRhVG9Ob3RpZnksIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUsIGxpc3RlbmVycywgbGlzdGVuZXJNYXNrLCBsaXN0ZW5lckNvdW50KTsKLQkJfSAKKwkJfQogCX0KIAkvKgogCSAqIFJldHVybnMgd2hldGhlciBhIGdpdmVuIGRlbHRhIGNvbnRhaW5zIHNvbWUgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIEphdmFNb2RlbCwKQEAgLTE0MjQsNyArMTU0MSw4IEBACiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJfQotCQkJCX0pOworCQkJCX0sCisJCQkJSUNvbnRhaW5lci5JTkNMVURFX0hJRERFTik7CiAJCQl9IGNhdGNoKEZvdW5kUmVsZXZhbnREZWx0YUV4Y2VwdGlvbiBlKSB7CiAJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJFTEVWQU5UIERFTFRBIGRldGVjdGVkIGluOiAiKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkpOwogCQkJCXJldHVybiB0cnVlOwpAQCAtMTQ2Nyw3ICsxNTg1LDcgQEAKIAkJCQkJCQlpZiAoc291cmNlTGV2ZWwgPT0gbnVsbCkgewogCQkJCQkJCQkvLyBHZXQgamF2YSBwcm9qZWN0IHRvIHVzZSBpdHMgc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscwogCQkJCQkJCQlqYXZhUHJvamVjdCA9IHJvb3RJbmZvID09IG51bGwgPwotCQkJCQkJCQkJKEphdmFQcm9qZWN0KXRoaXMuY3JlYXRlRWxlbWVudChyZXMuZ2V0UHJvamVjdCgpLCBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNULCBudWxsKSA6CisJCQkJCQkJCQkoSmF2YVByb2plY3QpY3JlYXRlRWxlbWVudChyZXMuZ2V0UHJvamVjdCgpLCBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNULCBudWxsKSA6CiAJCQkJCQkJCQlyb290SW5mby5wcm9qZWN0OwogCQkJCQkJCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewogCQkJCQkJCQkJc291cmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKQEAgLTE0OTIsMTEgKzE2MTAsMTEgQEAKIAlwcml2YXRlIElKYXZhRWxlbWVudERlbHRhIG1lcmdlRGVsdGFzKENvbGxlY3Rpb24gZGVsdGFzKSB7CiAJCWlmIChkZWx0YXMuc2l6ZSgpID09IDApIHJldHVybiBudWxsOwogCQlpZiAoZGVsdGFzLnNpemUoKSA9PSAxKSByZXR1cm4gKElKYXZhRWxlbWVudERlbHRhKWRlbHRhcy5pdGVyYXRvcigpLm5leHQoKTsKLQkJCisKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiTUVSR0lORyAiICsgZGVsdGFzLnNpemUoKSArICIgREVMVEFTIFsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkrIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJfQotCQkKKwogCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlbHRhcy5pdGVyYXRvcigpOwogCQlKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHRoaXMubWFuYWdlci5qYXZhTW9kZWwpOwogCQlib29sZWFuIGluc2VydGVkVHJlZSA9IGZhbHNlOwpAQCAtMTUyNyw3ICsxNjQ1LDcgQEAKIAkJfQogCQlpZiAoaW5zZXJ0ZWRUcmVlKSByZXR1cm4gcm9vdERlbHRhOwogCQlyZXR1cm4gbnVsbDsKLQl9CQorCX0KIAlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElKYXZhRWxlbWVudERlbHRhIGRlbHRhVG9Ob3RpZnksIGludCBldmVudFR5cGUsIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyW10gbGlzdGVuZXJzLCBpbnRbXSBsaXN0ZW5lck1hc2ssIGludCBsaXN0ZW5lckNvdW50KSB7CiAJCWZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXh0cmFFdmVudCA9IG5ldyBFbGVtZW50Q2hhbmdlZEV2ZW50KGRlbHRhVG9Ob3RpZnksIGV2ZW50VHlwZSk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lckNvdW50OyBpKyspIHsKQEAgLTE1ODksMjcgKzE3MDcsMjUgQEAKIAkgKiA8bGk+QW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgZGVsdGEgcmVwb3J0aW5nIGEgY29udGVudCBjaGFuZ2UgKEtfQ0hBTkdFIHdpdGggRl9DT05URU5UIGZsYWcgc2V0KS4KIAkgKiA8L3VsPgogCSAqLwotCXByaXZhdGUgdm9pZCBub25KYXZhUmVzb3VyY2VzQ2hhbmdlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkKLQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KKwlwcml2YXRlIHZvaWQgbm9uSmF2YVJlc291cmNlc0NoYW5nZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIAl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJLy8gcmVzZXQgbm9uLWphdmEgcmVzb3VyY2VzIGlmIGVsZW1lbnQgd2FzIG9wZW4KIAkJaWYgKGVsZW1lbnQuaXNPcGVuKCkpIHsKIAkJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gKEphdmFFbGVtZW50SW5mbyllbGVtZW50LmdldEVsZW1lbnRJbmZvKCk7CiAJCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewogCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgogCQkJCQkoKEphdmFNb2RlbEluZm8pIGluZm8pLm5vbkphdmFSZXNvdXJjZXMgPSBudWxsOwotCQkJCQljdXJyZW50RGVsdGEoKS5hZGRSZXNvdXJjZURlbHRhKGRlbHRhKTsKKwkJCQkJaWYgKCFFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmlzSW50ZXJuYWxQYXRoRm9yRXh0ZXJuYWxGb2xkZXIoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpCisJCQkJCQljdXJyZW50RGVsdGEoKS5hZGRSZXNvdXJjZURlbHRhKGRlbHRhKTsKIAkJCQkJcmV0dXJuOwogCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6CiAJCQkJCSgoSmF2YVByb2plY3RFbGVtZW50SW5mbykgaW5mbykuc2V0Tm9uSmF2YVJlc291cmNlcyhudWxsKTsKLQkKKwogCQkJCQkvLyBpZiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyB0aGUgcHJvamVjdCwgY2xlYXIgaXQgdG9vCiAJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQ7CiAJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3QgcHJvamVjdFJvb3QgPQogCQkJCQkJKFBhY2thZ2VGcmFnbWVudFJvb3QpIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0LmdldFByb2plY3QoKSk7CiAJCQkJCWlmIChwcm9qZWN0Um9vdC5pc09wZW4oKSkgewotCQkJCQkJKChQYWNrYWdlRnJhZ21lbnRSb290SW5mbykgcHJvamVjdFJvb3QuZ2V0RWxlbWVudEluZm8oKSkuc2V0Tm9uSmF2YVJlc291cmNlcygKLQkJCQkJCQludWxsKTsKKwkJCQkJCSgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIHByb2plY3RSb290LmdldEVsZW1lbnRJbmZvKCkpLnNldE5vbkphdmFSZXNvdXJjZXMobnVsbCk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6CkBAIC0xNjI2LDcgKzE3NDIsMjcgQEAKIAkJCS8vIGRvbid0IHVzZSBmaW5kIGFmdGVyIGNyZWF0aW5nIHRoZSBkZWx0YSBhcyBpdCBjYW4gYmUgbnVsbCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzQzNCkKIAkJCWVsZW1lbnREZWx0YSA9IGN1cnJlbnQuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOwogCQl9Ci0JCWVsZW1lbnREZWx0YS5hZGRSZXNvdXJjZURlbHRhKGRlbHRhKTsKKwkJaWYgKCFFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmlzSW50ZXJuYWxQYXRoRm9yRXh0ZXJuYWxGb2xkZXIoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpCisJCQllbGVtZW50RGVsdGEuYWRkUmVzb3VyY2VEZWx0YShkZWx0YSk7CisJfQorCS8qCisJICogUmV0dXJucyB0aGUgb2xkIHJvb3QgaW5mbyBmb3IgdGhlIGdpdmVuIHBhdGggYW5kIHByb2plY3QuCisJICovCisJcHJpdmF0ZSBSb290SW5mbyBvbGRSb290SW5mbyhJUGF0aCBwYXRoLCBKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCVJvb3RJbmZvIG9sZEluZm8gPSAoUm9vdEluZm8pIHRoaXMuc3RhdGUub2xkUm9vdHMuZ2V0KHBhdGgpOworCQlpZiAob2xkSW5mbyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChvbGRJbmZvLnByb2plY3QuZXF1YWxzKHByb2plY3QpKQorCQkJcmV0dXJuIG9sZEluZm87CisJCUFycmF5TGlzdCBvbGRJbmZvcyA9IChBcnJheUxpc3QpIHRoaXMuc3RhdGUub2xkT3RoZXJSb290cy5nZXQocGF0aCk7CisJCWlmIChvbGRJbmZvcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvbGRJbmZvcy5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJb2xkSW5mbyA9IChSb290SW5mbykgb2xkSW5mb3MuZ2V0KGkpOworCQkJaWYgKG9sZEluZm8ucHJvamVjdC5lcXVhbHMocHJvamVjdCkpCisJCQkJcmV0dXJuIG9sZEluZm87CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCS8qCiAJICogUmV0dXJucyB0aGUgb3RoZXIgcm9vdCBpbmZvcyBmb3IgdGhlIGdpdmVuIHBhdGguIExvb2sgaW4gdGhlIG9sZCBvdGhlciByb290cyB0YWJsZSBpZiBraW5kIGlzIFJFTU9WRUQuCkBAIC0xNjM2LDIwICsxNzcyLDIwIEBACiAJCQlyZXR1cm4gKEFycmF5TGlzdCl0aGlzLnN0YXRlLm9sZE90aGVyUm9vdHMuZ2V0KHBhdGgpOwogCQl9CiAJCXJldHVybiAoQXJyYXlMaXN0KXRoaXMuc3RhdGUub3RoZXJSb290cy5nZXQocGF0aCk7Ci0JfQkKLQkKKwl9CisKIAlwcml2YXRlIE91dHB1dHNJbmZvIG91dHB1dHNJbmZvKFJvb3RJbmZvIHJvb3RJbmZvLCBJUmVzb3VyY2UgcmVzKSB7CiAJCXRyeSB7CiAJCQlKYXZhUHJvamVjdCBwcm9qID0KIAkJCQlyb290SW5mbyA9PSBudWxsID8KLQkJCQkJKEphdmFQcm9qZWN0KXRoaXMuY3JlYXRlRWxlbWVudChyZXMuZ2V0UHJvamVjdCgpLCBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNULCBudWxsKSA6CisJCQkJCShKYXZhUHJvamVjdCljcmVhdGVFbGVtZW50KHJlcy5nZXRQcm9qZWN0KCksIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QsIG51bGwpIDoKIAkJCQkJcm9vdEluZm8ucHJvamVjdDsKIAkJCWlmIChwcm9qICE9IG51bGwpIHsKIAkJCQlJUGF0aCBwcm9qZWN0T3V0cHV0ID0gcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpOwogCQkJCWludCB0cmF2ZXJzZU1vZGUgPSBJR05PUkU7CiAJCQkJaWYgKHByb2ouZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuZXF1YWxzKHByb2plY3RPdXRwdXQpKXsgLy8gY2FzZSBvZiBwcm9qPT1iaW49PXNyYwogCQkJCQlyZXR1cm4gbmV3IE91dHB1dHNJbmZvKG5ldyBJUGF0aFtdIHtwcm9qZWN0T3V0cHV0fSwgbmV3IGludFtdIHtTT1VSQ0V9LCAxKTsKLQkJCQl9IAorCQkJCX0KIAkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qLmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CiAJCQkJSVBhdGhbXSBvdXRwdXRzID0gbmV3IElQYXRoW2NsYXNzcGF0aC5sZW5ndGgrMV07CiAJCQkJaW50W10gdHJhdmVyc2VNb2RlcyA9IG5ldyBpbnRbY2xhc3NwYXRoLmxlbmd0aCsxXTsKQEAgLTE2NjksNyArMTgwNSw3IEBACiAJCQkJCQkJdHJhdmVyc2VNb2Rlc1tvdXRwdXRDb3VudCsrXSA9IElHTk9SRTsKIAkJCQkJCX0KIAkJCQkJfQotCQkJCQkKKwogCQkJCQkvLyBjaGVjayBjYXNlIG9mIHNyYz09YmluCiAJCQkJCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RPdXRwdXQpKSB7CiAJCQkJCQl0cmF2ZXJzZU1vZGVzWzBdID0gKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSA/IFNPVVJDRSA6IEJJTkFSWTsKQEAgLTE2ODgsMTMgKzE4MjQsMTMgQEAKIAkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKIAkJCQljdXJyZW50RWxlbWVudFBhdGggPSAoKElQYWNrYWdlRnJhZ21lbnRSb290KXRoaXMuY3VycmVudEVsZW1lbnQpLmdldFBhdGgoKTsKIAkJCX0gZWxzZSB7Ci0JCQkJSVJlc291cmNlIGN1cnJlbnRFbGVtZW50UmVzb3VyY2UgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmdldFJlc291cmNlKCk7CisJCQkJSVJlc291cmNlIGN1cnJlbnRFbGVtZW50UmVzb3VyY2UgPSB0aGlzLmN1cnJlbnRFbGVtZW50LnJlc291cmNlKCk7CiAJCQkJaWYgKGN1cnJlbnRFbGVtZW50UmVzb3VyY2UgIT0gbnVsbCkgewogCQkJCQljdXJyZW50RWxlbWVudFBhdGggPSBjdXJyZW50RWxlbWVudFJlc291cmNlLmdldEZ1bGxQYXRoKCk7CiAJCQkJfQogCQkJfQogCQkJaWYgKGN1cnJlbnRFbGVtZW50UGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50IAorCQkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudAogCQkJCQkmJiAoKElQYWNrYWdlRnJhZ21lbnQpIHRoaXMuY3VycmVudEVsZW1lbnQpLmlzRGVmYXVsdFBhY2thZ2UoKQogCQkJCQkmJiBjdXJyZW50RWxlbWVudFBhdGguc2VnbWVudENvdW50KCkgIT0gcGF0aC5zZWdtZW50Q291bnQoKS0xKSB7CiAJCQkJCQkvLyBkZWZhdWx0IHBhY2thZ2UgYW5kIHBhdGggaXMgbm90IGEgZGlyZWN0IGNoaWxkCkBAIC0xNzI3LDE1ICsxODYzLDE1IEBACiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCX0KLQkJCXRoaXMuc3RhdGUuaW5pdGlhbGl6ZVJvb3RzKCk7CisJCQl0aGlzLnN0YXRlLmluaXRpYWxpemVSb290cyhmYWxzZS8qbm90IGluaXRpQWZ0ZXJMb2FkKi8pOwogCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7Ci0JCQkKKwogCQkJLy8gZ2V0IHRoZSB3b3Jrc3BhY2UgZGVsdGEsIGFuZCBzdGFydCBwcm9jZXNzaW5nIHRoZXJlLgotCQkJSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBjaGFuZ2VzLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gY2hhbmdlcy5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQsIElDb250YWluZXIuSU5DTFVERV9ISURERU4pOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKIAkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGRlbHRhc1tpXTsKIAkJCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkKKwogCQkJCS8vIGZpbmQgb3V0IHRoZSBlbGVtZW50IHR5cGUKIAkJCQlSb290SW5mbyByb290SW5mbyA9IG51bGw7CiAJCQkJaW50IGVsZW1lbnRUeXBlOwpAQCAtMTc0NSwxNyArMTg4MSwxOCBAQAogCQkJCWlmICghd2FzSmF2YVByb2plY3QgJiYgIWlzSmF2YVByb2plY3QpIHsKIAkJCQkJZWxlbWVudFR5cGUgPSBOT05fSkFWQV9SRVNPVVJDRTsKIAkJCQl9IGVsc2UgewotCQkJCQlyb290SW5mbyA9IHRoaXMuZW5jbG9zaW5nUm9vdEluZm8ocmVzLmdldEZ1bGxQYXRoKCksIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCWlmIChyb290SW5mbyAhPSBudWxsICYmIHJvb3RJbmZvLmlzUm9vdE9mUHJvamVjdChyZXMuZ2V0RnVsbFBhdGgoKSkpIHsKKwkJCQkJSVBhdGggcm9vdFBhdGggPSBleHRlcm5hbFBhdGgocmVzKTsKKwkJCQkJcm9vdEluZm8gPSBlbmNsb3NpbmdSb290SW5mbyhyb290UGF0aCwgZGVsdGEuZ2V0S2luZCgpKTsKKwkJCQkJaWYgKHJvb3RJbmZvICE9IG51bGwgJiYgcm9vdEluZm8uaXNSb290T2ZQcm9qZWN0KHJvb3RQYXRoKSkgewogCQkJCQkJZWxlbWVudFR5cGUgPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOwogCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudFR5cGUgPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOyAKKwkJCQkJCWVsZW1lbnRUeXBlID0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDsKIAkJCQkJfQogCQkJCX0KLQkJCQkKKwogCQkJCS8vIHRyYXZlcnNlIGRlbHRhCi0JCQkJdGhpcy50cmF2ZXJzZURlbHRhKGRlbHRhLCBlbGVtZW50VHlwZSwgcm9vdEluZm8sIG51bGwpOwotCQkJCQorCQkJCXRyYXZlcnNlRGVsdGEoZGVsdGEsIGVsZW1lbnRUeXBlLCByb290SW5mbywgbnVsbCk7CisKIAkJCQlpZiAoZWxlbWVudFR5cGUgPT0gTk9OX0pBVkFfUkVTT1VSQ0UKIAkJCQkJCXx8ICh3YXNKYXZhUHJvamVjdCAhPSBpc0phdmFQcm9qZWN0ICYmIChkZWx0YS5nZXRLaW5kKCkpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSB7IC8vIHByb2plY3QgaGFzIGNoYW5nZWQgbmF0dXJlIChkZXNjcmlwdGlvbiBvciBvcGVuL2Nsb3NlZCkKIAkJCQkJdHJ5IHsKQEAgLTE3NjcsMjYgKzE5MDQsMjMgQEAKIAkJCQl9CiAKIAkJCX0KLQkJCXJlZnJlc2hQYWNrYWdlRnJhZ21lbnRSb290cygpOwogCQkJcmVzZXRQcm9qZWN0Q2FjaGVzKCk7CiAKIAkJCXJldHVybiB0aGlzLmN1cnJlbnREZWx0YTsKIAkJfSBmaW5hbGx5IHsKIAkJCXRoaXMuY3VycmVudERlbHRhID0gbnVsbDsKLQkJCXRoaXMucm9vdHNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCXRoaXMucHJvamVjdENhY2hlc1RvUmVzZXQuY2xlYXIoKTsKIAkJfQogCX0KIAkvKgotCSAqIFRyYXZlcnNlIHRoZSBzZXQgb2YgcHJvamVjdHMgd2hpY2ggaGF2ZSBjaGFuZ2VkIG5hbWVzcGFjZSwgYW5kIHJlc2V0IHRoZWlyIAorCSAqIFRyYXZlcnNlIHRoZSBzZXQgb2YgcHJvamVjdHMgd2hpY2ggaGF2ZSBjaGFuZ2VkIG5hbWVzcGFjZSwgYW5kIHJlc2V0IHRoZWlyCiAJICogY2FjaGVzIGFuZCB0aGVpciBkZXBlbmRlbnRzCiAJICovCiAJcHVibGljIHZvaWQgcmVzZXRQcm9qZWN0Q2FjaGVzKCkgewogCQlpZiAodGhpcy5wcm9qZWN0Q2FjaGVzVG9SZXNldC5zaXplKCkgPT0gMCkKIAkJCXJldHVybjsKLQkJCisKIAkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVzZXRKYXJUeXBlQ2FjaGUoKTsKLQkJCisKIAkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnByb2plY3RDYWNoZXNUb1Jlc2V0Lml0ZXJhdG9yKCk7CiAJCUhhc2hNYXAgcHJvamVjdERlcGVuY2llcyA9IHRoaXMuc3RhdGUucHJvamVjdERlcGVuZGVuY2llczsKIAkJSGFzaFNldCBhZmZlY3RlZERlcGVuZGVudHMgPSBuZXcgSGFzaFNldCgpOwpAQCAtMTgwMSwxNiArMTkzNSw4IEBACiAJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7CiAJCQlwcm9qZWN0LnJlc2V0Q2FjaGVzKCk7CiAJCX0KLQl9Ci0JLyogCi0JICogUmVmcmVzaCBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHByb2plY3RzIHRoYXQgd2VyZSBhZmZlY3RlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoUGFja2FnZUZyYWdtZW50Um9vdHMoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5yb290c1RvUmVmcmVzaC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXByb2plY3QudXBkYXRlUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJfQorCisJCXRoaXMucHJvamVjdENhY2hlc1RvUmVzZXQuY2xlYXIoKTsKIAl9CiAJLyoKIAkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGRlbHRhIHdpdGggdGhpcyBkZWx0YSBwcm9jZXNzb3IuCkBAIC0xODIxLDE0ICsxOTQ3LDE0IEBACiAJLyoKIAkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGZyb20gaXRzIHBhcmVudHMgY2FjaGUgb2YgY2hpbGRyZW4uIElmIHRoZQogCSAqIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudCwgb3IgdGhlIHBhcmVudCBpcyBub3QgY3VycmVudGx5IG9wZW4sCi0JICogdGhpcyBoYXMgbm8gZWZmZWN0LiAKKwkgKiB0aGlzIGhhcyBubyBlZmZlY3QuCiAJICovCiAJcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21QYXJlbnRJbmZvKE9wZW5hYmxlIGNoaWxkKSB7CiAKIAkJT3BlbmFibGUgcGFyZW50ID0gKE9wZW5hYmxlKSBjaGlsZC5nZXRQYXJlbnQoKTsKIAkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5pc09wZW4oKSkgewogCQkJdHJ5IHsKLQkJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IChKYXZhRWxlbWVudEluZm8pcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvID0gKE9wZW5hYmxlRWxlbWVudEluZm8pIHBhcmVudC5nZXRFbGVtZW50SW5mbygpOwogCQkJCWluZm8ucmVtb3ZlQ2hpbGQoY2hpbGQpOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBkbyBub3RoaW5nIC0gd2UgYWxyZWFkeSBjaGVja2VkIGlmIG9wZW4KQEAgLTE4NDIsNjQgKzE5NjgsMTA0IEBACiAJICogVHJhbnNsYXRlcyA8Y29kZT5JUmVzb3VyY2VEZWx0YXM8L2NvZGU+IGludG8gPGNvZGU+SUphdmFFbGVtZW50RGVsdGFzPC9jb2RlPi4KIAkgKgogCSAqIEBzZWUgSVJlc291cmNlRGVsdGEKLQkgKiBAc2VlIElSZXNvdXJjZSAKKwkgKiBAc2VlIElSZXNvdXJjZQogCSAqLwogCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewogCiAJCWludCBldmVudFR5cGUgPSB0aGlzLm92ZXJyaWRlbkV2ZW50VHlwZSA9PSAtMSA/IGV2ZW50LmdldFR5cGUoKSA6IHRoaXMub3ZlcnJpZGVuRXZlbnRUeXBlOwogCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwogCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQorCiAJCXN3aXRjaChldmVudFR5cGUpewogCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIDoKIAkJCQl0cnkgewotCQkJCQlpZihyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgCisJCQkJCWlmKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVAogCQkJCQkJJiYgKChJUHJvamVjdCkgcmVzb3VyY2UpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJCisKIAkJCQkJCWRlbGV0aW5nKChJUHJvamVjdClyZXNvdXJjZSk7CiAJCQkJCX0KIAkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CiAJCQkJCS8vIHByb2plY3QgZG9lc24ndCBleGlzdCBvciBpcyBub3Qgb3BlbjogaWdub3JlCiAJCQkJfQogCQkJCXJldHVybjsKKworCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfUkVGUkVTSDoKKwkJCQlJUHJvamVjdCBbXSBwcm9qZWN0cyA9IG51bGw7CisJCQkJT2JqZWN0IG8gPSBldmVudC5nZXRTb3VyY2UoKTsKKwkJCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W10geyAoSVByb2plY3QpIG8gfTsKKwkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7CisJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE1OTQuIFRoZSBzaW5nbGUgd29ya3NwYWNlIHJlZnJlc2gKKwkJCQkJLy8gbm90aWZpY2F0aW9uIHdlIHNlZSwgaW1wbGllcyB0aGF0IGFsbCBwcm9qZWN0cyBhcmUgYWJvdXQgdG8gYmUgcmVmcmVzaGVkLgorCQkJCQkgcHJvamVjdHMgPSAoKElXb3Jrc3BhY2UpIG8pLmdldFJvb3QoKS5nZXRQcm9qZWN0cyhJQ29udGFpbmVyLklOQ0xVREVfSElEREVOKTsKKwkJCQl9CisJCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMjk1CisJCQkJLy8gUmVmcmVzaCBhbGwgcHJvamVjdCByZWZlcmVuY2VzIHRvZ2V0aGVyIGluIGEgc2luZ2xlIGpvYgorCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0RXh0ZXJuYWxNYW5hZ2VyKCkucmVmcmVzaFJlZmVyZW5jZXMocHJvamVjdHMsIG51bGwpOwogCQkJCQorCQkJCUlKYXZhUHJvamVjdFtdIGphdmFFbGVtZW50cyA9IG5ldyBJSmF2YVByb2plY3RbcHJvamVjdHMubGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcHJvamVjdHMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJCWphdmFFbGVtZW50c1tpbmRleF0gPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdHNbaW5kZXhdKTsKKwkJCQl9CisJCQkJdHJ5IHsKKwkJCQkJY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKGphdmFFbGVtZW50cywgdHJ1ZSwgbnVsbCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJICAgICAgICAJaWYgKCFlLmlzRG9lc05vdEV4aXN0KCkpCisJCSAgICAgICAgCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHVwZGF0aW5nIGV4dGVybmFsIGFyY2hpdmVzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJcmV0dXJuOworCiAJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDoKLQkJCQlpZiAoaXNBZmZlY3RlZEJ5KGRlbHRhKSkgeyAvLyBhdm9pZCBwb3B1bGF0aW5nIGZvciBTWU5DIG9yIE1BUktFUiBkZWx0YXMKKwkJCQlIYXNoU2V0IGVsZW1lbnRzVG9SZWZyZXNoID0gdGhpcy5zdGF0ZS5yZW1vdmVFeHRlcm5hbEVsZW1lbnRzVG9SZWZyZXNoKCk7CisJCQkJaWYgKGlzQWZmZWN0ZWRCeShkZWx0YSkgLy8gYXZvaWQgcG9wdWxhdGluZyBmb3IgU1lOQyBvciBNQVJLRVIgZGVsdGFzCisJCQkJCQl8fCBlbGVtZW50c1RvUmVmcmVzaCAhPSBudWxsKSB7CiAJCQkJCXRyeSB7CiAJCQkJCQl0cnkgewogCQkJCQkJCXN0b3BEZWx0YXMoKTsKLQkJCQkJCQljaGVja1Byb2plY3RzQmVpbmdBZGRlZE9yUmVtb3ZlZChkZWx0YSk7Ci0JCQkJCQkJCisJCQkJCQkJY2hlY2tQcm9qZWN0c0FuZENsYXNzcGF0aENoYW5nZXMoZGVsdGEpOworCisJCQkJCQkJLy8gZ2VuZXJhdGUgZXh0ZXJuYWwgYXJjaGl2ZSBjaGFuZ2UgZGVsdGFzCisJCQkJCQkJaWYgKGVsZW1lbnRzVG9SZWZyZXNoICE9IG51bGwpIHsKKwkJCQkJCQkJY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEoZWxlbWVudHNUb1JlZnJlc2gsIG51bGwpOworCQkJCQkJCX0KKwogCQkJCQkJCS8vIGdlbmVyYXRlIGNsYXNzcGF0aCBjaGFuZ2UgZGVsdGFzCi0JCQkJCQkJaWYgKHRoaXMuY2xhc3NwYXRoQ2hhbmdlcy5zaXplKCkgPiAwKSB7CisJCQkJCQkJSGFzaE1hcCBjbGFzc3BhdGhDaGFuZ2VzID0gdGhpcy5zdGF0ZS5yZW1vdmVBbGxDbGFzc3BhdGhDaGFuZ2VzKCk7CisJCQkJCQkJaWYgKGNsYXNzcGF0aENoYW5nZXMuc2l6ZSgpID4gMCkgewogCQkJCQkJCQlib29sZWFuIGhhc0RlbHRhID0gdGhpcy5jdXJyZW50RGVsdGEgIT0gbnVsbDsKIAkJCQkJCQkJSmF2YUVsZW1lbnREZWx0YSBqYXZhRGVsdGEgPSBjdXJyZW50RGVsdGEoKTsKLQkJCQkJCQkJSXRlcmF0b3IgY2hhbmdlcyA9IHRoaXMuY2xhc3NwYXRoQ2hhbmdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJCQkJCQlJdGVyYXRvciBjaGFuZ2VzID0gY2xhc3NwYXRoQ2hhbmdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwogCQkJCQkJCQl3aGlsZSAoY2hhbmdlcy5oYXNOZXh0KCkpIHsKIAkJCQkJCQkJCUNsYXNzcGF0aENoYW5nZSBjaGFuZ2UgPSAoQ2xhc3NwYXRoQ2hhbmdlKSBjaGFuZ2VzLm5leHQoKTsKLQkJCQkJCQkJCWludCByZXN1bHQgPSBjaGFuZ2UuZ2VuZXJhdGVEZWx0YShqYXZhRGVsdGEpOworCQkJCQkJCQkJaW50IHJlc3VsdCA9IGNoYW5nZS5nZW5lcmF0ZURlbHRhKGphdmFEZWx0YSwgZmFsc2UvKmRvbid0IGFkZCBjbGFzc3BhdGggY2hhbmdlKi8pOwogCQkJCQkJCQkJaWYgKChyZXN1bHQgJiBDbGFzc3BhdGhDaGFuZ2UuSEFTX0RFTFRBKSAhPSAwKSB7CiAJCQkJCQkJCQkJaGFzRGVsdGEgPSB0cnVlOworCisJCQkJCQkJCQkJLy8gbmVlZCB0byByZWNvbXB1dGUgcm9vdCBpbmZvcworCQkJCQkJCQkJCXRoaXMuc3RhdGUucm9vdHNBcmVTdGFsZSA9IHRydWU7CisKIAkJCQkJCQkJCQljaGFuZ2UucmVxdWVzdEluZGV4aW5nKCk7CiAJCQkJCQkJCQkJdGhpcy5zdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKGNoYW5nZS5wcm9qZWN0KTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICgocmVzdWx0ICYgQ2xhc3NwYXRoQ2hhbmdlLkhBU19QUk9KRUNUX0NIQU5HRSkgIT0gMCkgewogCQkJCQkJCQkJCXRoaXMuc3RhdGUuYWRkUHJvamVjdFJlZmVyZW5jZUNoYW5nZShjaGFuZ2UucHJvamVjdCwgY2hhbmdlLm9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKIAkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgocmVzdWx0ICYgQ2xhc3NwYXRoQ2hhbmdlLkhBU19MSUJSQVJZX0NIQU5HRSkgIT0gMCkgeworCQkJCQkJCQkJCXRoaXMuc3RhdGUuYWRkRXh0ZXJuYWxGb2xkZXJDaGFuZ2UoY2hhbmdlLnByb2plY3QsIGNoYW5nZS5vbGRSZXNvbHZlZENsYXNzcGF0aCk7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KLQkJCQkJCQkJdGhpcy5jbGFzc3BhdGhDaGFuZ2VzLmNsZWFyKCk7CisJCQkJCQkJCS8vIHByb2Nlc3MgbGF0ZSBjb21pbmcgZXh0ZXJuYWwgZWxlbWVudHMgdG8gcmVmcmVzaCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI3NjkgKQorCQkJCQkJCQllbGVtZW50c1RvUmVmcmVzaCA9IHRoaXMuc3RhdGUucmVtb3ZlRXh0ZXJuYWxFbGVtZW50c1RvUmVmcmVzaCgpOworCQkJCQkJCQlpZiAoZWxlbWVudHNUb1JlZnJlc2ggIT0gbnVsbCkgeworCQkJCQkJCQkJaGFzRGVsdGEgfD0gY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEoZWxlbWVudHNUb1JlZnJlc2gsIG51bGwpOworCQkJCQkJCQl9CiAJCQkJCQkJCWlmICghaGFzRGVsdGEpCiAJCQkJCQkJCQl0aGlzLmN1cnJlbnREZWx0YSA9IG51bGw7CiAJCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCS8vIGdlbmVyYXRlIGV4dGVybmFsIGFyY2hpdmUgY2hhbmdlIGRlbHRhcwotCQkJCQkJCWlmICh0aGlzLnJlZnJlc2hlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEobnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCQorCiAJCQkJCQkJLy8gZ2VuZXJhdGUgSmF2YSBkZWx0YXMgZnJvbSByZXNvdXJjZSBjaGFuZ2VzCiAJCQkJCQkJSUphdmFFbGVtZW50RGVsdGEgdHJhbnNsYXRlZERlbHRhID0gcHJvY2Vzc1Jlc291cmNlRGVsdGEoZGVsdGEpOwotCQkJCQkJCWlmICh0cmFuc2xhdGVkRGVsdGEgIT0gbnVsbCkgeyAKKwkJCQkJCQlpZiAodHJhbnNsYXRlZERlbHRhICE9IG51bGwpIHsKIAkJCQkJCQkJcmVnaXN0ZXJKYXZhTW9kZWxEZWx0YSh0cmFuc2xhdGVkRGVsdGEpOwogCQkJCQkJCX0KIAkJCQkJCX0gZmluYWxseSB7CkBAIC0xOTE1LDE5ICsyMDgxLDM2IEBACiAJCQkJCQlub3RpZnlUeXBlSGllcmFyY2hpZXMobGlzdGVuZXJzLCBsaXN0ZW5lckNvdW50KTsKIAkJCQkJCWZpcmUobnVsbCwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7CiAJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKKwkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkCiAJCQkJCQl0aGlzLnN0YXRlLnJlc2V0T2xkSmF2YVByb2plY3ROYW1lcygpOwogCQkJCQkJdGhpcy5vbGRSb290cyA9IG51bGw7CiAJCQkJCX0KIAkJCQl9CiAJCQkJcmV0dXJuOwotCQkJCQorCiAJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCA6Ci0JCQkJaWYoIWlzQWZmZWN0ZWRCeShkZWx0YSkpCi0JCQkJCXJldHVybjsgLy8gYXZvaWQgcG9wdWxhdGluZyBmb3IgU1lOQyBvciBNQVJLRVIgZGVsdGFzCisJCQkJLy8gZm9yY2UgaW5pdGlhbGl6YXRpb24gb2Ygcm9vdHMgYmVmb3JlIGJ1aWxkZXJzIHJ1biB0byBhdm9pZCBkZWFkbG9jayBpbiBhbm90aGVyIHRocmVhZAorCQkJCS8vIChub3RlIHRoaXMgaXMgbm8tb3AgaWYgYWxyZWFkeSBpbml0aWFsaXplZCkKKwkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTc1MQorCQkJCXRoaXMuc3RhdGUuaW5pdGlhbGl6ZVJvb3RzKGZhbHNlLypub3QgaW5pdGlBZnRlckxvYWQqLyk7CisJCQkJCisJCQkJYm9vbGVhbiBpc0FmZmVjdGVkID0gaXNBZmZlY3RlZEJ5KGRlbHRhKTsKKwkJCQlib29sZWFuIG5lZWRDeWNsZVZhbGlkYXRpb24gPSBpc0FmZmVjdGVkICYmIHZhbGlkYXRlQ2xhc3NwYXRocyhkZWx0YSk7CisKKwkJCQkvLyB1cGRhdGUgZXh0ZXJuYWwgZm9sZGVycyBpZiBuZWNlc3NhcnkKKwkJCSAgICBFeHRlcm5hbEZvbGRlckNoYW5nZVtdIGZvbGRlckNoYW5nZXMgPSB0aGlzLnN0YXRlLnJlbW92ZUV4dGVybmFsRm9sZGVyQ2hhbmdlcygpOworCQkJCWlmIChmb2xkZXJDaGFuZ2VzICE9IG51bGwpIHsKKwkJCQkgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZvbGRlckNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkgICAgICAgIHRyeSB7CisJCQkJCSAgICAgICAgZm9sZGVyQ2hhbmdlc1tpXS51cGRhdGVFeHRlcm5hbEZvbGRlcnNJZk5lY2Vzc2FyeShmYWxzZS8qZG8gbm90IHJlZnJlc2ggc2luY2Ugd2UgYXJlIG5vdCBpbiB0aGUgdGhyZWFkIHRoYXQgYWRkZWQgdGhlIGV4dGVybmFsIGZvbGRlciB0byB0aGUgY2xhc3NwYXRoKi8sIG51bGwpOworCQkJCSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkgICAgICAgIAlpZiAoIWUuaXNEb2VzTm90RXhpc3QoKSkKKwkJCQkgICAgICAgIAkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSB1cGRhdGluZyBleHRlcm5hbCBmb2xkZXJzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkgICAgICAgIH0KKwkJCQkgICAgfQorCQkJCX0KIAogCQkJCS8vIGNyZWF0ZSBjbGFzc3BhdGggbWFya2VycyBpZiBuZWNlc3NhcnkKLQkJCQlib29sZWFuIG5lZWRDeWNsZVZhbGlkYXRpb24gPSB2YWxpZGF0ZUNsYXNzcGF0aHMoZGVsdGEpOwogCQkJCUNsYXNzcGF0aFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucyA9IHRoaXMuc3RhdGUucmVtb3ZlQ2xhc3NwYXRoVmFsaWRhdGlvbnMoKTsKIAkJCQlpZiAodmFsaWRhdGlvbnMgIT0gbnVsbCkgewogCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsaWRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTE5MzUsNyArMjExOCw3IEBACiAJCQkJCQl2YWxpZGF0aW9uLnZhbGlkYXRlKCk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyB1cGRhdGUgcHJvamVjdCByZWZlcmVuY2VzIGlmIG5lY2Vzc2FyeQogCQkJICAgIFByb2plY3RSZWZlcmVuY2VDaGFuZ2VbXSBwcm9qZWN0UmVmQ2hhbmdlcyA9IHRoaXMuc3RhdGUucmVtb3ZlUHJvamVjdFJlZmVyZW5jZUNoYW5nZXMoKTsKIAkJCQlpZiAocHJvamVjdFJlZkNoYW5nZXMgIT0gbnVsbCkgewpAQCAtMTk0NCwxMCArMjEyNywxMiBAQAogCQkJCQkgICAgICAgIHByb2plY3RSZWZDaGFuZ2VzW2ldLnVwZGF0ZVByb2plY3RSZWZlcmVuY2VzSWZOZWNlc3NhcnkoKTsKIAkJCQkgICAgICAgIH0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkgICAgICAgICAgICAvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlciwgY29udGludWUgd2l0aCBuZXh0IG9uZQorCQkJCSAgICAgICAgCWlmICghZS5pc0RvZXNOb3RFeGlzdCgpKQorCQkJCSAgICAgICAgCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHVwZGF0aW5nIHByb2plY3QgcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCiAJCQkJICAgICAgICB9CiAJCQkJICAgIH0KIAkJCQl9Ci0JCQkJCisKIAkJCQlpZiAobmVlZEN5Y2xlVmFsaWRhdGlvbiB8fCBwcm9qZWN0UmVmQ2hhbmdlcyAhPSBudWxsKSB7CiAJCQkJCS8vIHVwZGF0ZSBhbGwgY3ljbGUgbWFya2VycyBzaW5jZSB0aGUgcHJvamVjdCByZWZlcmVuY2VzIGNoYW5nZXMgbWF5IGhhdmUgYWZmZWN0ZWQgY3ljbGVzCiAJCQkJCXRyeSB7CkBAIC0xOTU2LDEwICsyMTQxLDEyIEBACiAJCQkJCQkvLyBhIHByb2plY3Qgbm8gbG9uZ2VyIGV4aXN0cwogCQkJCQl9CiAJCQkJfQotCQkJCQotCQkJCUphdmFNb2RlbC5mbHVzaEV4dGVybmFsRmlsZUNhY2hlKCk7Ci0JCQkJSmF2YUJ1aWxkZXIuYnVpbGRTdGFydGluZygpOwotCQkJCQorCisJCQkJaWYgKGlzQWZmZWN0ZWQpIHsKKwkJCQkJSmF2YU1vZGVsLmZsdXNoRXh0ZXJuYWxGaWxlQ2FjaGUoKTsKKwkJCQkJSmF2YUJ1aWxkZXIuYnVpbGRTdGFydGluZygpOworCQkJCX0KKwogCQkJCS8vIGRvZXMgbm90IGZpcmUgYW55IGRlbHRhcwogCQkJCXJldHVybjsKIApAQCAtMTk5Nyw0MSArMjE4NCw0MSBAQAogCSAqIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPnMuCiAJICovCiAJcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRGVsdGEoCi0JCUlSZXNvdXJjZURlbHRhIGRlbHRhLCAKLQkJaW50IGVsZW1lbnRUeXBlLCAKKwkJSVJlc291cmNlRGVsdGEgZGVsdGEsCisJCWludCBlbGVtZW50VHlwZSwKIAkJUm9vdEluZm8gcm9vdEluZm8sCiAJCU91dHB1dHNJbmZvIG91dHB1dHNJbmZvKSB7Ci0JCQkKKwogCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkKKwogCQkvLyBzZXQgc3RhY2sgb2YgZWxlbWVudHMKIAkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCAmJiByb290SW5mbyAhPSBudWxsKSB7CiAJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gcm9vdEluZm8ucHJvamVjdDsKIAkJfQotCQkKKwogCQkvLyBwcm9jZXNzIGN1cnJlbnQgZGVsdGEKIAkJYm9vbGVhbiBwcm9jZXNzQ2hpbGRyZW4gPSB0cnVlOwogCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpIHsKIAkJCS8vIHJlc2V0IHNvdXJjZSBlbGVtZW50IHBhcnNlciBjYWNoZQogCQkJdGhpcy5zb3VyY2VFbGVtZW50UGFyc2VyQ2FjaGUgPSBudWxsOwotCQkJCi0JCQlwcm9jZXNzQ2hpbGRyZW4gPSAKLQkJCQl0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KAotCQkJCQlkZWx0YSwgCi0JCQkJCWVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgPyAKKworCQkJcHJvY2Vzc0NoaWxkcmVuID0KKwkJCQl1cGRhdGVDdXJyZW50RGVsdGFBbmRJbmRleCgKKwkJCQkJZGVsdGEsCisJCQkJCWVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgPwogCQkJCQkJSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6IC8vIGNhc2Ugb2YgcHJqPXNyYwotCQkJCQkJZWxlbWVudFR5cGUsIAorCQkJCQkJZWxlbWVudFR5cGUsCiAJCQkJCXJvb3RJbmZvKTsKIAkJfSBlbHNlIGlmIChyb290SW5mbyAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzQ2hpbGRyZW4gPSB0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KGRlbHRhLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOworCQkJcHJvY2Vzc0NoaWxkcmVuID0gdXBkYXRlQ3VycmVudERlbHRhQW5kSW5kZXgoZGVsdGEsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CiAJCX0gZWxzZSB7CiAJCQkvLyBub3QgeWV0IGluc2lkZSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAogCQkJcHJvY2Vzc0NoaWxkcmVuID0gdHJ1ZTsKIAkJfQotCQkKKwogCQkvLyBnZXQgdGhlIHByb2plY3QncyBvdXRwdXQgbG9jYXRpb25zIGFuZCB0cmF2ZXJzZSBtb2RlCi0JCWlmIChvdXRwdXRzSW5mbyA9PSBudWxsKSBvdXRwdXRzSW5mbyA9IHRoaXMub3V0cHV0c0luZm8ocm9vdEluZm8sIHJlcyk7Ci0JCisJCWlmIChvdXRwdXRzSW5mbyA9PSBudWxsKSBvdXRwdXRzSW5mbyA9IG91dHB1dHNJbmZvKHJvb3RJbmZvLCByZXMpOworCiAJCS8vIHByb2Nlc3MgY2hpbGRyZW4gaWYgbmVlZGVkCiAJCWlmIChwcm9jZXNzQ2hpbGRyZW4pIHsKIAkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CkBAIC0yMDQzLDQwICsyMjMwLDQxIEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKIAkJCQlJUmVzb3VyY2UgY2hpbGRSZXMgPSBjaGlsZC5nZXRSZXNvdXJjZSgpOwotCQorCiAJCQkJLy8gY2hlY2sgc291cmNlIGF0dGFjaG1lbnQgY2hhbmdlCi0JCQkJdGhpcy5jaGVja1NvdXJjZUF0dGFjaG1lbnRDaGFuZ2UoY2hpbGQsIGNoaWxkUmVzKTsKLQkJCQkKKwkJCQljaGVja1NvdXJjZUF0dGFjaG1lbnRDaGFuZ2UoY2hpbGQsIGNoaWxkUmVzKTsKKwogCQkJCS8vIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGNoaWxkIGlzIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSBjdXJyZW50IHByb2plY3QKLQkJCQlJUGF0aCBjaGlsZFBhdGggPSBjaGlsZFJlcy5nZXRGdWxsUGF0aCgpOworCQkJCUlQYXRoIGNoaWxkUGF0aCA9IGV4dGVybmFsUGF0aChjaGlsZFJlcyk7CiAJCQkJaW50IGNoaWxkS2luZCA9IGNoaWxkLmdldEtpbmQoKTsKLQkJCQlSb290SW5mbyBjaGlsZFJvb3RJbmZvID0gdGhpcy5yb290SW5mbyhjaGlsZFBhdGgsIGNoaWxkS2luZCk7CisJCQkJUm9vdEluZm8gY2hpbGRSb290SW5mbyA9IHJvb3RJbmZvKGNoaWxkUGF0aCwgY2hpbGRLaW5kKTsKKwkJCQlSb290SW5mbyBvcmlnaW5hbENoaWxkUm9vdEluZm8gPSBjaGlsZFJvb3RJbmZvOwogCQkJCWlmIChjaGlsZFJvb3RJbmZvICE9IG51bGwgJiYgIWNoaWxkUm9vdEluZm8uaXNSb290T2ZQcm9qZWN0KGNoaWxkUGF0aCkpIHsKIAkJCQkJLy8gcGFja2FnZSBmcmFnbWVudCByb290IG9mIGFub3RoZXIgcHJvamVjdCAoZGVhbHQgd2l0aCBsYXRlcikKIAkJCQkJY2hpbGRSb290SW5mbyA9IG51bGw7CiAJCQkJfQotCQkJCQorCiAJCQkJLy8gY29tcHV0ZSBjaGlsZCB0eXBlCi0JCQkJaW50IGNoaWxkVHlwZSA9IAotCQkJCQl0aGlzLmVsZW1lbnRUeXBlKAotCQkJCQkJY2hpbGRSZXMsIAorCQkJCWludCBjaGlsZFR5cGUgPQorCQkJCQllbGVtZW50VHlwZSgKKwkJCQkJCWNoaWxkUmVzLAogCQkJCQkJY2hpbGRLaW5kLAotCQkJCQkJZWxlbWVudFR5cGUsIAorCQkJCQkJZWxlbWVudFR5cGUsCiAJCQkJCQlyb290SW5mbyA9PSBudWxsID8gY2hpbGRSb290SW5mbyA6IHJvb3RJbmZvCiAJCQkJCSk7Ci0JCQkJCQkKKwogCQkJCS8vIGlzIGNoaWxkUmVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFuZCBpcyBpdCBmaWx0ZXJlZCBvdXQgPwotCQkJCWJvb2xlYW4gaXNSZXNGaWx0ZXJlZEZyb21PdXRwdXQgPSB0aGlzLmlzUmVzRmlsdGVyZWRGcm9tT3V0cHV0KHJvb3RJbmZvLCBvdXRwdXRzSW5mbywgY2hpbGRSZXMsIGNoaWxkVHlwZSk7CisJCQkJYm9vbGVhbiBpc1Jlc0ZpbHRlcmVkRnJvbU91dHB1dCA9IGlzUmVzRmlsdGVyZWRGcm9tT3V0cHV0KHJvb3RJbmZvLCBvdXRwdXRzSW5mbywgY2hpbGRSZXMsIGNoaWxkVHlwZSk7CiAKIAkJCQlib29sZWFuIGlzTmVzdGVkUm9vdCA9IHJvb3RJbmZvICE9IG51bGwgJiYgY2hpbGRSb290SW5mbyAhPSBudWxsOwotCQkJCWlmICghaXNSZXNGaWx0ZXJlZEZyb21PdXRwdXQgCisJCQkJaWYgKCFpc1Jlc0ZpbHRlcmVkRnJvbU91dHB1dAogCQkJCQkJJiYgIWlzTmVzdGVkUm9vdCkgeyAvLyBkbyBub3QgdHJlYXQgYXMgbm9uLWphdmEgcnNjIGlmIG5lc3RlZCByb290CiAKLQkJCQkJdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBjaGlsZFR5cGUsIHJvb3RJbmZvID09IG51bGwgPyBjaGlsZFJvb3RJbmZvIDogcm9vdEluZm8sIG91dHB1dHNJbmZvKTsgLy8gdHJhdmVyc2UgZGVsdGEgZm9yIGNoaWxkIGluIHRoZSBzYW1lIHByb2plY3QKKwkJCQkJdHJhdmVyc2VEZWx0YShjaGlsZCwgY2hpbGRUeXBlLCByb290SW5mbyA9PSBudWxsID8gY2hpbGRSb290SW5mbyA6IHJvb3RJbmZvLCBvdXRwdXRzSW5mbyk7IC8vIHRyYXZlcnNlIGRlbHRhIGZvciBjaGlsZCBpbiB0aGUgc2FtZSBwcm9qZWN0CiAKIAkJCQkJaWYgKGNoaWxkVHlwZSA9PSBOT05fSkFWQV9SRVNPVVJDRSkgewogCQkJCQkJaWYgKHJvb3RJbmZvICE9IG51bGwpIHsgLy8gaWYgaW5zaWRlIGEgcGFja2FnZSBmcmFnbWVudCByb290Ci0JCQkJCQkJaWYgKCFpc1ZhbGlkUGFyZW50KSBjb250aW51ZTsgCisJCQkJCQkJaWYgKCFpc1ZhbGlkUGFyZW50KSBjb250aW51ZTsKIAkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKIAkJCQkJCQkJLy8gZmluZCB0aGUgcGFyZW50IG9mIHRoZSBub24tamF2YSByZXNvdXJjZSB0byBhdHRhY2ggdG8KIAkJCQkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbApAQCAtMjA4NSwxMiArMjI3MywxMiBAQAogCQkJCQkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IHJvb3RJbmZvLnByb2plY3Q7CiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QKLQkJCQkJCQkJCXx8IChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIAotCQkJCQkJCQkJCSYmIHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KSkgeyAKKwkJCQkJCQkJCXx8IChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UCisJCQkJCQkJCQkJJiYgcmVzIGluc3RhbmNlb2YgSVByb2plY3QpKSB7CiAJCQkJCQkJCQkvLyBOQjogYXR0YWNoIG5vbi1qYXZhIHJlc291cmNlIHRvIHByb2plY3QgKG5vdCB0byBpdHMgcGFja2FnZSBmcmFnbWVudCByb290KQogCQkJCQkJCQkJcGFyZW50ID0gcm9vdEluZm8ucHJvamVjdDsKIAkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXBhcmVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChyZXMsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJCQkJCQlwYXJlbnQgPSBjcmVhdGVFbGVtZW50KHJlcywgZWxlbWVudFR5cGUsIHJvb3RJbmZvKTsKIAkJCQkJCQkJfQogCQkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKIAkJCQkJCQkJCWlzVmFsaWRQYXJlbnQgPSBmYWxzZTsKQEAgLTIxMTgsMzMgKzIzMDYsMzQgQEAKIAkJCQl9IGVsc2UgewogCQkJCQlvbmVDaGlsZE9uQ2xhc3NwYXRoID0gdHJ1ZTsgLy8gdG8gYXZvaWQgcmVwb3J0aW5nIGNoaWxkIGRlbHRhIGFzIG5vbi1qYXZhIHJlc291cmNlIGRlbHRhCiAJCQkJfQotCQkJCQkJCQkKLQkJCQkvLyBpZiBjaGlsZCBpcyBhIG5lc3RlZCByb290IAorCisJCQkJLy8gaWYgY2hpbGQgaXMgYSBuZXN0ZWQgcm9vdAogCQkJCS8vIG9yIGlmIGl0IGlzIG5vdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGUgY3VycmVudCBwcm9qZWN0CiAJCQkJLy8gYnV0IGl0IGlzIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIGFub3RoZXIgcHJvamVjdCwgdHJhdmVyc2UgZGVsdGEgdG9vCi0JCQkJaWYgKGlzTmVzdGVkUm9vdCAKLQkJCQkJCXx8IChjaGlsZFJvb3RJbmZvID09IG51bGwgJiYgKGNoaWxkUm9vdEluZm8gPSB0aGlzLnJvb3RJbmZvKGNoaWxkUGF0aCwgY2hpbGRLaW5kKSkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09ULCBjaGlsZFJvb3RJbmZvLCBudWxsKTsgLy8gYmluYXJ5IG91dHB1dCBvZiBjaGlsZFJvb3RJbmZvLnByb2plY3QgY2Fubm90IGJlIHRoaXMgcm9vdAorCQkJCWlmIChpc05lc3RlZFJvb3QKKwkJCQkJCXx8IChjaGlsZFJvb3RJbmZvID09IG51bGwgJiYgb3JpZ2luYWxDaGlsZFJvb3RJbmZvICE9IG51bGwpKSB7CisJCQkJCXRyYXZlcnNlRGVsdGEoY2hpbGQsIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QsIG9yaWdpbmFsQ2hpbGRSb290SW5mbywgbnVsbCk7IC8vIGJpbmFyeSBvdXRwdXQgb2YgY2hpbGRSb290SW5mby5wcm9qZWN0IGNhbm5vdCBiZSB0aGlzIHJvb3QKIAkJCQl9Ci0JCisKIAkJCQkvLyBpZiB0aGUgY2hpbGQgaXMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2Ygb25lIG9yIHNldmVyYWwgb3RoZXIgcHJvamVjdHMKIAkJCQlBcnJheUxpc3Qgcm9vdExpc3Q7Ci0JCQkJaWYgKChyb290TGlzdCA9IHRoaXMub3RoZXJSb290c0luZm8oY2hpbGRQYXRoLCBjaGlsZEtpbmQpKSAhPSBudWxsKSB7CisJCQkJaWYgKChyb290TGlzdCA9IG90aGVyUm9vdHNJbmZvKGNoaWxkUGF0aCwgY2hpbGRLaW5kKSkgIT0gbnVsbCkgewogCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHJvb3RMaXN0Lml0ZXJhdG9yKCk7CiAJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCWNoaWxkUm9vdEluZm8gPSAoUm9vdEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXRoaXMudHJhdmVyc2VEZWx0YShjaGlsZCwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgY2hpbGRSb290SW5mbywgbnVsbCk7IC8vIGJpbmFyeSBvdXRwdXQgb2YgY2hpbGRSb290SW5mby5wcm9qZWN0IGNhbm5vdCBiZSB0aGlzIHJvb3QKKwkJCQkJCW9yaWdpbmFsQ2hpbGRSb290SW5mbyA9IChSb290SW5mbykgaXRlcmF0b3IubmV4dCgpOworCQkJCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7IC8vIGVuc3VyZSB0aGF0IDIgcm9vdHMgcmVmZXJpbmcgdG8gdGhlIHNhbWUgcmVzb3VyY2UgZG9uJ3Qgc2hhcmUgdGhlIGN1cnJlbnQgZWxlbWVudCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTA3NDYgKQorCQkJCQkJdHJhdmVyc2VEZWx0YShjaGlsZCwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgb3JpZ2luYWxDaGlsZFJvb3RJbmZvLCBudWxsKTsgLy8gYmluYXJ5IG91dHB1dCBvZiBjaGlsZFJvb3RJbmZvLnByb2plY3QgY2Fubm90IGJlIHRoaXMgcm9vdAogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYgKG9ycGhhbkNoaWxkcmVuICE9IG51bGwKIAkJCQkJJiYgKG9uZUNoaWxkT25DbGFzc3BhdGggLy8gb3JwaGFuIGNoaWxkcmVuIGFyZSBzaWJsaW5ncyBvZiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAogCQkJCQkJfHwgcmVzIGluc3RhbmNlb2YgSVByb2plY3QpKSB7IC8vIG5vbi1qYXZhIHJlc291cmNlIGRpcmVjdGx5IHVuZGVyIGEgcHJvamVjdAotCQkJCQkJCisKIAkJCQkvLyBhdHRhY2ggb3JwaGFuIGNoaWxkcmVuCiAJCQkJSVByb2plY3QgcnNjUHJvamVjdCA9IHJlcy5nZXRQcm9qZWN0KCk7CiAJCQkJSmF2YVByb2plY3QgYWRvcHRpdmVQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShyc2NQcm9qZWN0KTsKLQkJCQlpZiAoYWRvcHRpdmVQcm9qZWN0ICE9IG51bGwgCisJCQkJaWYgKGFkb3B0aXZlUHJvamVjdCAhPSBudWxsCiAJCQkJCQkmJiBKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHJzY1Byb2plY3QpKSB7IC8vIGRlbHRhIGlmZiBKYXZhIHByb2plY3QgKDE4Njk4KQogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAob3JwaGFuQ2hpbGRyZW5baV0gIT0gbnVsbCkgewpAQCAtMjIwNiw3ICsyMzk1LDExIEBACiAJCQkJLyogY2hlY2sgY2xhc3NwYXRoIG9yIHByZWZzIGZpbGVzIGNoYW5nZSAqLwogCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwogCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJCWlmIChmaWxlTmFtZS5lcXVhbHMoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKSkgeworCQkJCVJvb3RJbmZvIHJvb3RJbmZvID0gbnVsbDsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MDQyCisJCQkJLy8gTWFyayBhIHZhbGlkYXRpb24gaWYgYSBsaWJyYXJ5IHdpdGggcGFja2FnZSBmcmFnbWVudCByb290IGluIHRoZSBwcm9qZWN0IGhhcyBjaGFuZ2VkCisJCQkJaWYgKGZpbGVOYW1lLmVxdWFscyhKYXZhUHJvamVjdC5DTEFTU1BBVEhfRklMRU5BTUUpCisJCQkJCQl8fCAoKHJvb3RJbmZvID0gcm9vdEluZm8oZmlsZS5nZXRGdWxsUGF0aCgpLCBkZWx0YS5nZXRLaW5kKCkpKSAhPSBudWxsICYmIHJvb3RJbmZvLmVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpKSB7CiAJCQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7CiAJCQkJCXRoaXMuc3RhdGUuYWRkQ2xhc3NwYXRoVmFsaWRhdGlvbihqYXZhUHJvamVjdCk7CiAJCQkJCWFmZmVjdGVkUHJvamVjdHMuYWRkKGZpbGUuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOwpAQCAtMjIzMCw4ICsyNDIzLDggQEAKIAkJSGFzaFNldCBhZmZlY3RlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoNSk7CiAJCXZhbGlkYXRlQ2xhc3NwYXRocyhkZWx0YSwgYWZmZWN0ZWRQcm9qZWN0cyk7CiAJCWJvb2xlYW4gbmVlZEN5Y2xlVmFsaWRhdGlvbiA9IGZhbHNlOwotCQotCQkvLyB2YWxpZGF0ZSBjbGFzc3BhdGhzIG9mIGFmZmVjdGVkIHByb2plY3RzIChkZXBlbmRlbnQgcHJvamVjdHMgCisKKwkJLy8gdmFsaWRhdGUgY2xhc3NwYXRocyBvZiBhZmZlY3RlZCBwcm9qZWN0cyAoZGVwZW5kZW50IHByb2plY3RzCiAJCS8vIG9yIHByb2plY3RzIHRoYXQgcmVmZXJlbmNlIGEgbGlicmFyeSBpbiBvbmUgb2YgdGhlIHByb2plY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkKQogCQlpZiAoIWFmZmVjdGVkUHJvamVjdHMuaXNFbXB0eSgpKSB7CiAJCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKQEAgLTIyNjksOSArMjQ2Miw5IEBACiAJCX0KIAkJcmV0dXJuIG5lZWRDeWNsZVZhbGlkYXRpb247CiAJfQotCQorCiAJLyoKLQkgKiBVcGRhdGUgdGhlIGN1cnJlbnQgZGVsdGEgKGllLiBhZGQvcmVtb3ZlL2NoYW5nZSB0aGUgZ2l2ZW4gZWxlbWVudCkgYW5kIHVwZGF0ZSB0aGUgY29ycmVwb25kaW5nIGluZGV4LgorCSAqIFVwZGF0ZSB0aGUgY3VycmVudCBkZWx0YSAoaS5lLiBhZGQvcmVtb3ZlL2NoYW5nZSB0aGUgZ2l2ZW4gZWxlbWVudCkgYW5kIHVwZGF0ZSB0aGUgY29ycmVwb25kaW5nIGluZGV4LgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGRlbHRhIG11c3QgYmUgcHJvY2Vzc2VkLgogCSAqIEB0aHJvd3MgYSBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGRlbHRhIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIGphdmEgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS4KIAkgKi8KQEAgLTIzMDEsMjIgKzI0OTQsNDAgQEAKIAkJCQl9CiAJCQkJdXBkYXRlSW5kZXgoZWxlbWVudCwgZGVsdGEpOwogCQkJCWVsZW1lbnRSZW1vdmVkKGVsZW1lbnQsIGRlbHRhLCByb290SW5mbyk7Ci0JCQkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpIAorCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKQogCQkJCQl0aGlzLnN0YXRlLmFkZENsYXNzcGF0aFZhbGlkYXRpb24ocm9vdEluZm8ucHJvamVjdCk7Ci0JCi0JCQkJaWYgKGRlbHRhUmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCl7CQkJCisKKwkJCQlpZiAoZGVsdGFSZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsKIAkJCQkJLy8gcmVzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBidWlsdCBzdGF0ZSwgc2luY2UgY2Fubm90IHJldXNlIGlmIGFkZGVkIGJhY2sKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDbGVhcmluZyBsYXN0IHN0YXRlIGZvciByZW1vdmVkIHByb2plY3QgOiAiICsgZGVsdGFSZXMpOyAvLyROT04tTkxTLTEkCiAJCQkJCXRoaXMubWFuYWdlci5zZXRMYXN0QnVpbHRTdGF0ZSgoSVByb2plY3QpZGVsdGFSZXMsIG51bGwgLypubyBzdGF0ZSovKTsKLQkJCQkJCisKIAkJCQkJLy8gY2xlYW4gdXAgcHJldmlvdXMgc2Vzc2lvbiBjb250YWluZXJzIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODUwKQogCQkJCQl0aGlzLm1hbmFnZXIucHJldmlvdXNTZXNzaW9uQ29udGFpbmVycy5yZW1vdmUoZWxlbWVudCk7CiAJCQkJfQogCQkJCXJldHVybiBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDsKIAkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CiAJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCB8fCAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgIT0gMCkgeworCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmIChmbGFncyAmIElSZXNvdXJjZURlbHRhLkxPQ0FMX0NIQU5HRUQpICE9IDApIHsKKwkJCQkJLy8gZXh0ZXJuYWwgZm9sZGVyIGFkZGVkIG9yIHJlbW92ZWQKKwkJCQkJaWYgKG9sZFJvb3RJbmZvKHJvb3RJbmZvLnJvb3RQYXRoLCByb290SW5mby5wcm9qZWN0KSA9PSBudWxsKSB7CisJCQkJCQkvLyByb290IGp1c3QgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVsdGFSZXMgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOworCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldEV4dGVybmFsVGFyZ2V0KGRlbHRhUmVzLmdldExvY2F0aW9uKCksIHRydWUvKmNoZWNrIHJlc291cmNlIGV4aXN0ZW5jZSovKTsKKwkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoZGVsdGFSZXMsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJCXVwZGF0ZUluZGV4KGVsZW1lbnQsIGRlbHRhKTsKKwkJCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7CisJCQkJCQkvLyBleHRlcm5hbCBmb2xkZXIgYWRkZWQKKwkJCQkJCWVsZW1lbnRBZGRlZChlbGVtZW50LCBkZWx0YSwgcm9vdEluZm8pOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gZXh0ZXJuYWwgZm9sZGVyIHJlbW92ZWQKKwkJCQkJCWVsZW1lbnRSZW1vdmVkKGVsZW1lbnQsIGRlbHRhLCByb290SW5mbyk7CisJCQkJCX0KKwkJCQkJdGhpcy5zdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKHJvb3RJbmZvLnByb2plY3QpOworCQkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCB8fCAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgIT0gMCkgewogCQkJCQkvLyBjb250ZW50IG9yIGVuY29kaW5nIGhhcyBjaGFuZ2VkCiAJCQkJCWVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGRlbHRhLmdldFJlc291cmNlKCksIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CiAJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKQEAgLTIzMzcsMTEgKzI1NDgsMTAgQEAKIAkJCQkJCQkJYWRkVG9QYXJlbnRJbmZvKGVsZW1lbnQpOwogCQkJCQkJCQljdXJyZW50RGVsdGEoKS5vcGVuZWQoZWxlbWVudCk7CiAJCQkJCQkJCXRoaXMuc3RhdGUudXBkYXRlUm9vdHMoZWxlbWVudC5nZXRQYXRoKCksIGRlbHRhLCB0aGlzKTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIHJlZnJlc2ggcGtnIGZyYWdtZW50IHJvb3RzIGFuZCBjYWNoZXMgb2YgdGhlIHByb2plY3QgKGFuZCBpdHMgZGVwZW5kZW50cykKLQkJCQkJCQkJdGhpcy5yb290c1RvUmVmcmVzaC5hZGQoZWxlbWVudCk7CisKKwkJCQkJCQkJLy8gcmVtZW1iZXIgdGhhdCB0aGUgcHJvamVjdCdzIGNhY2hlIG11c3QgYmUgcmVzZXQKIAkJCQkJCQkJdGhpcy5wcm9qZWN0Q2FjaGVzVG9SZXNldC5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCQorCiAJCQkJCQkJCXRoaXMubWFuYWdlci5pbmRleE1hbmFnZXIuaW5kZXhBbGwocmVzKTsKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewpAQCAtMjM2Miw3ICsyNTcyLDcgQEAKIAkJCQkJCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocmVzKTsKIAkJCQkJCWlmICh3YXNKYXZhUHJvamVjdCAhPSBpc0phdmFQcm9qZWN0KSB7CiAJCQkJCQkJLy8gcHJvamVjdCdzIG5hdHVyZSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkCi0JCQkJCQkJZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChyZXMsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocmVzLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOwogCQkJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsgLy8gbm90ZSBpdHMgcmVzb3VyY2VzIGFyZSBzdGlsbCB2aXNpYmxlIGFzIHJvb3RzIHRvIG90aGVyIHByb2plY3RzCiAJCQkJCQkJaWYgKGlzSmF2YVByb2plY3QpIHsKIAkJCQkJCQkJZWxlbWVudEFkZGVkKGVsZW1lbnQsIGRlbHRhLCByb290SW5mbyk7CkBAIC0yMzg1LDExICsyNTk1LDExIEBACiAJCXJldHVybiB0cnVlOwogCX0KIAlwcml2YXRlIHZvaWQgdXBkYXRlSW5kZXgoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkKKwogCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gdGhpcy5tYW5hZ2VyLmluZGV4TWFuYWdlcjsKIAkJaWYgKGluZGV4TWFuYWdlciA9PSBudWxsKQogCQkJcmV0dXJuOwotCQorCiAJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgogCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CkBAIC0yNDI5LDE0ICsyNjM5LDE5IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkxPQ0FMX0NIQU5HRUQpICE9IDApKSB7CiAJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7Ci0JCQkJCXRoaXMudXBkYXRlUm9vdEluZGV4KHJvb3QsIENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUywgZGVsdGEpOworCQkJCQl1cGRhdGVSb290SW5kZXgocm9vdCwgQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTLCBkZWx0YSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQkvLyBkb24ndCBicmVhayBhcyBwYWNrYWdlcyBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IGNhbiBiZSBpbmRleGVkIGJlbG93CisJCQkJLy8gJEZBTEwtVEhST1VHSCQKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgogCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKKwkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkxPQ0FMX0NIQU5HRUQpID09IDApCisJCQkJCQkJYnJlYWs7CisJCQkJCQkvLyAkRkFMTC1USFJPVUdIJAogCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgogCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6CiAJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IG51bGw7CkBAIC0yNDQ3LDcgKzI2NjIsNyBAQAogCQkJCQkJCXBrZyA9IChJUGFja2FnZUZyYWdtZW50KWVsZW1lbnQ7CiAJCQkJCQl9CiAJCQkJCQlSb290SW5mbyByb290SW5mbyA9IHJvb3RJbmZvKHBrZy5nZXRQYXJlbnQoKS5nZXRQYXRoKCksIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCQlib29sZWFuIGlzU291cmNlID0gCisJCQkJCQlib29sZWFuIGlzU291cmNlID0KIAkJCQkJCQlyb290SW5mbyA9PSBudWxsIC8vIGlmIG51bGwsIGRlZmF1bHRzIHRvIHNvdXJjZQogCQkJCQkJCXx8IHJvb3RJbmZvLmVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRTsKIAkJCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CkBAIC0yNDYwLDExICsyNjc1LDExIEBACiAJCQkJCQkJCWlmIChpc1NvdXJjZSkgewogCQkJCQkJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUobmFtZSkpIHsKIAkJCQkJCQkJCQlPcGVuYWJsZSBjdSA9IChPcGVuYWJsZSlwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KG5hbWUpOwotCQkJCQkJCQkJCXRoaXMudXBkYXRlSW5kZXgoY3UsIGNoaWxkKTsKKwkJCQkJCQkJCQl1cGRhdGVJbmRleChjdSwgY2hpbGQpOwogCQkJCQkJCQkJfQogCQkJCQkJCQl9IGVsc2UgaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNDbGFzc0ZpbGVOYW1lKG5hbWUpKSB7CiAJCQkJCQkJCQlPcGVuYWJsZSBjbGFzc0ZpbGUgPSAoT3BlbmFibGUpcGtnLmdldENsYXNzRmlsZShuYW1lKTsKLQkJCQkJCQkJCXRoaXMudXBkYXRlSW5kZXgoY2xhc3NGaWxlLCBjaGlsZCk7CisJCQkJCQkJCQl1cGRhdGVJbmRleChjbGFzc0ZpbGUsIGNoaWxkKTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTI0NzQsNyArMjY4OSw4IEBACiAJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKIAkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpOwogCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwotCQkJCUlQYXRoIGJpbmFyeUZvbGRlclBhdGggPSBlbGVtZW50LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5nZXRQYXRoKCk7CisJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZWxlbWVudC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCQkJSVBhdGggYmluYXJ5Rm9sZGVyUGF0aCA9IHJvb3QuaXNFeHRlcm5hbCgpICYmICFyb290LmlzQXJjaGl2ZSgpID8gcm9vdC5yZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkgOiByb290LmdldFBhdGgoKTsKIAkJCQkvLyBpZiB0aGUgY2xhc3MgZmlsZSBpcyBwYXJ0IG9mIHRoZSBiaW5hcnkgb3V0cHV0LCBpdCBoYXMgYmVlbiBjcmVhdGVkIGJ5CiAJCQkJLy8gdGhlIGphdmEgYnVpbGRlciAtPiBpZ25vcmUKIAkJCQl0cnkgewpAQCAtMjQ5MCw2ICsyNzA2LDcgQEAKIAkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7CiAJCQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCAmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgPT0gMCkKIAkJCQkJCQlicmVhazsKKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkCiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgogCQkJCQkJaW5kZXhNYW5hZ2VyLmFkZEJpbmFyeShmaWxlLCBiaW5hcnlGb2xkZXJQYXRoKTsKIAkJCQkJCWJyZWFrOwpAQCAtMjUwNyw2ICsyNzI0LDcgQEAKIAkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7CiAJCQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCAmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5FTkNPRElORykgPT0gMCkKIAkJCQkJCQlicmVhazsKKwkJCQkJCS8vICRGQUxMLVRIUk9VR0gkCiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgogCQkJCQkJaW5kZXhNYW5hZ2VyLmFkZFNvdXJjZShmaWxlLCBmaWxlLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLCBnZXRTb3VyY2VFbGVtZW50UGFyc2VyKGVsZW1lbnQpKTsKIAkJCQkJCS8vIENsZWFuIGZpbGUgZnJvbSBzZWNvbmRhcnkgdHlwZXMgY2FjaGUgYnV0IGRvIG5vdCB1cGRhdGUgaW5kZXhpbmcgc2Vjb25kYXJ5IHR5cGUgY2FjaGUgYXMgaXQgd2lsbCBiZSB1cGRhdGVkIHRocm91Z2ggaW5kZXhpbmcgaXRzZWxmCkBAIC0yNTQwLDE0ICsyNzU4LDE0IEBACiAJICovCiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZVJvb3RJbmRleChQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZ1tdIHBrZ05hbWUsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CiAJCU9wZW5hYmxlIHBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOwotCQl0aGlzLnVwZGF0ZUluZGV4KHBrZywgZGVsdGEpOworCQl1cGRhdGVJbmRleChwa2csIGRlbHRhKTsKIAkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJUmVzb3VyY2VEZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogCQkJSVJlc291cmNlIHJlc291cmNlID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKIAkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKIAkJCQlTdHJpbmdbXSBzdWJwa2dOYW1lID0gVXRpbC5hcnJheUNvbmNhdChwa2dOYW1lLCByZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCXRoaXMudXBkYXRlUm9vdEluZGV4KHJvb3QsIHN1YnBrZ05hbWUsIGNoaWxkKTsKKwkJCQl1cGRhdGVSb290SW5kZXgocm9vdCwgc3VicGtnTmFtZSwgY2hpbGQpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGlzY2FyZFdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EaXNjYXJkV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQppbmRleCAwZGMyNjNmLi40ZTM0MDlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EaXNjYXJkV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EaXNjYXJkV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCwxOSArMjAsMTkgQEAKICAqIGFuZCBzaWduYWwgaXRzIHJlbW92YWwgdGhyb3VnaCBhIGRlbHRhLgogICovCiBwdWJsaWMgY2xhc3MgRGlzY2FyZFdvcmtpbmdDb3B5T3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKLQkKKwogCXB1YmxpYyBEaXNjYXJkV29ya2luZ0NvcHlPcGVyYXRpb24oSUphdmFFbGVtZW50IHdvcmtpbmdDb3B5KSB7CiAJCXN1cGVyKG5ldyBJSmF2YUVsZW1lbnRbXSB7d29ya2luZ0NvcHl9KTsKIAl9CiAJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBnZXRXb3JraW5nQ29weSgpOwotCQkKKwogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJaW50IHVzZUNvdW50ID0gbWFuYWdlci5kaXNjYXJkUGVyV29ya2luZ0NvcHlJbmZvKHdvcmtpbmdDb3B5KTsKIAkJaWYgKHVzZUNvdW50ID09IDApIHsKIAkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHdvcmtpbmdDb3B5LmdldEphdmFQcm9qZWN0KCk7CiAJCQlpZiAoRXh0ZXJuYWxKYXZhUHJvamVjdC5FWFRFUk5BTF9QUk9KRUNUX05BTUUuZXF1YWxzKGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVQZXJQcm9qZWN0SW5mbygoSmF2YVByb2plY3QpIGphdmFQcm9qZWN0KTsKKwkJCQltYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKChKYXZhUHJvamVjdCkgamF2YVByb2plY3QsIHRydWUgLyogcmVtb3ZlIGV4dGVybmFsIGphciBmaWxlcyBpbmRleGVzIGFuZCB0aW1lc3RhbXBzKi8pOwogCQkJCW1hbmFnZXIuY29udGFpbmVyUmVtb3ZlKGphdmFQcm9qZWN0KTsKIAkJCX0KIAkJCWlmICghd29ya2luZ0NvcHkuaXNQcmltYXJ5KCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RvY3VtZW50QWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRG9jdW1lbnRBZGFwdGVyLmphdmEKaW5kZXggZTk5ZThkNi4uYTc4NThiOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRG9jdW1lbnRBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsOSArMTgsOSBAQAogICogQWRhcHRzIGFuIElCdWZmZXIgdG8gSURvY3VtZW50CiAgKi8KIHB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgZXh0ZW5kcyBEb2N1bWVudCB7Ci0JCisKIAlwcml2YXRlIElCdWZmZXIgYnVmZmVyOwotCQorCiAJcHVibGljIERvY3VtZW50QWRhcHRlcihJQnVmZmVyIGJ1ZmZlcikgewogCQlzdXBlcihidWZmZXIuZ2V0Q29udGVudHMoKSk7CiAJCXRoaXMuYnVmZmVyID0gYnVmZmVyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRWxlbWVudENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FbGVtZW50Q2FjaGUuamF2YQppbmRleCA1OTk2MDJmLi5hYjllMzhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FbGVtZW50Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FbGVtZW50Q2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCw5ICsxOCw5IEBACiAgKiBBbiBMUlUgY2FjaGUgb2YgPGNvZGU+SmF2YUVsZW1lbnRzPC9jb2RlPi4KICAqLwogcHVibGljIGNsYXNzIEVsZW1lbnRDYWNoZSBleHRlbmRzIE92ZXJmbG93aW5nTFJVQ2FjaGUgewotCQorCiAJSUphdmFFbGVtZW50IHNwYWNlTGltaXRQYXJlbnQgPSBudWxsOwotCQorCiAvKioKICAqIENvbnN0cnVjdHMgYSBuZXcgZWxlbWVudCBjYWNoZSBvZiB0aGUgZ2l2ZW4gc2l6ZS4KICAqLwpAQCAtNDEsMTkgKzQxLDEyIEBACiAgKiBieSBjbG9zaW5nIHRoZSBlbGVtZW50LgogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZShMUlVDYWNoZUVudHJ5IGVudHJ5KSB7Ci0JT3BlbmFibGUgZWxlbWVudCA9IChPcGVuYWJsZSkgZW50cnkuX2ZLZXk7CisJT3BlbmFibGUgZWxlbWVudCA9IChPcGVuYWJsZSkgZW50cnkua2V5OwogCXRyeSB7CiAJCWlmICghZWxlbWVudC5jYW5CZVJlbW92ZWRGcm9tQ2FjaGUoKSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9IGVsc2UgewotCQkJLy8gV2UgbXVzdCBjbG9zZSBhbiBlbnRpcmUgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBhdCBvbmNlLgotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCQlKYXJQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50PSAoSmFyUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJCUphclBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCk7Ci0JCQkJcm9vdC5jbG9zZSgpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmNsb3NlKCk7Ci0JCQl9CisJCQllbGVtZW50LmNsb3NlKCk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKQEAgLTYyLDE2ICs1NSwxNyBAQAogfQogCiAvKgotICogRW5zdXJlcyB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBhZGRpbmcgdGhlIGdpdmVuIG51bWJlciBvZiBjaGlsZHJlbi4KKyAqIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBmb3IgYWRkaW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gaW5mby4KICAqIElmIHRoZSBzcGFjZSBsaW1pdCBtdXN0IGJlIGluY3JlYXNlZCwgcmVjb3JkIHRoZSBwYXJlbnQgdGhhdCBuZWVkZWQgdGhpcyBzcGFjZSBsaW1pdC4KICAqLwotcHJvdGVjdGVkIHZvaWQgZW5zdXJlU3BhY2VMaW1pdChpbnQgY2hpbGRyZW5TaXplLCBJSmF2YUVsZW1lbnQgcGFyZW50KSB7Citwcm90ZWN0ZWQgdm9pZCBlbnN1cmVTcGFjZUxpbWl0KE9iamVjdCBpbmZvLCBJSmF2YUVsZW1lbnQgcGFyZW50KSB7CiAJLy8gZW5zdXJlIHRoZSBjaGlsZHJlbiBjYW4gYmUgcHV0IHdpdGhvdXQgY2xvc2luZyBvdGhlciBlbGVtZW50cwotCWludCBzcGFjZU5lZWRlZCA9IDEgKyAoaW50KSgoMSArIGZMb2FkRmFjdG9yKSAqIChjaGlsZHJlblNpemUgKyBmT3ZlcmZsb3cpKTsKLQlpZiAoZlNwYWNlTGltaXQgPCBzcGFjZU5lZWRlZCkgeworCWludCBjaGlsZHJlblNpemUgPSAoKEphdmFFbGVtZW50SW5mbykgaW5mbykuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7CisJaW50IHNwYWNlTmVlZGVkID0gMSArIChpbnQpKCgxICsgdGhpcy5sb2FkRmFjdG9yKSAqIChjaGlsZHJlblNpemUgKyB0aGlzLm92ZXJmbG93KSk7CisJaWYgKHRoaXMuc3BhY2VMaW1pdCA8IHNwYWNlTmVlZGVkKSB7CiAJCS8vIHBhcmVudCBpcyBiZWluZyBvcGVuZWQgd2l0aCBtb3JlIGNoaWxkcmVuIHRoYW4gdGhlIHNwYWNlIGxpbWl0CiAJCXNocmluaygpOyAvLyByZW1vdmUgb3ZlcmZsb3cKLQkJc2V0U3BhY2VMaW1pdChzcGFjZU5lZWRlZCk7IAorCQlzZXRTcGFjZUxpbWl0KHNwYWNlTmVlZGVkKTsKIAkJdGhpcy5zcGFjZUxpbWl0UGFyZW50ID0gcGFyZW50OwogCX0KIH0KQEAgLTc5LDggKzczLDggQEAKIC8qCiAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KICAqLwotcHJvdGVjdGVkIExSVUNhY2hlIG5ld0luc3RhbmNlKGludCBzaXplLCBpbnQgb3ZlcmZsb3cpIHsKLQlyZXR1cm4gbmV3IEVsZW1lbnRDYWNoZShzaXplLCBvdmVyZmxvdyk7Citwcm90ZWN0ZWQgTFJVQ2FjaGUgbmV3SW5zdGFuY2UoaW50IHNpemUsIGludCBuZXdPdmVyZmxvdykgeworCXJldHVybiBuZXcgRWxlbWVudENhY2hlKHNpemUsIG5ld092ZXJmbG93KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0V4dGVybmFsRm9sZGVyQ2hhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbEZvbGRlckNoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTRjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbEZvbGRlckNoYW5nZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBpbmNvbnNpc3RlbnQgaW5pdGlhbGl6YXRpb24gb2YgY2xhc3NwYXRoIGNvbnRhaW5lciBiYWNrZWQgYnkgZXh0ZXJuYWwgY2xhc3MgZm9sZGVyLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDYxOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBFeHRlcm5hbEZvbGRlckNoYW5nZSB7CisKKwlwcml2YXRlIEphdmFQcm9qZWN0IHByb2plY3Q7CisJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aDsKKworCXB1YmxpYyBFeHRlcm5hbEZvbGRlckNoYW5nZShKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aCkgeworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCQl0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoID0gb2xkUmVzb2x2ZWRDbGFzc3BhdGg7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgZXh0ZXJuYWwgZm9sZGVycworCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsRm9sZGVyc0lmTmVjZXNzYXJ5KGJvb2xlYW4gcmVmcmVzaElmRXhpc3RBbHJlYWR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlIYXNoU2V0IG9sZEZvbGRlcnMgPSBFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmdldEV4dGVybmFsRm9sZGVycyh0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmVzb2x2ZWRDbGFzc3BhdGggPSB0aGlzLnByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJSGFzaFNldCBuZXdGb2xkZXJzID0gRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5nZXRFeHRlcm5hbEZvbGRlcnMobmV3UmVzb2x2ZWRDbGFzc3BhdGgpOworCQlpZiAobmV3Rm9sZGVycyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyIGZvbGRlcnNNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRFeHRlcm5hbE1hbmFnZXIoKTsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXdGb2xkZXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBmb2xkZXJQYXRoID0gaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKG9sZEZvbGRlcnMgPT0gbnVsbCB8fCAhb2xkRm9sZGVycy5yZW1vdmUoZm9sZGVyUGF0aCkgfHwgZm9sZGVyc01hbmFnZXIucmVtb3ZlUGVuZGluZ0ZvbGRlcihmb2xkZXJQYXRoKSkgeworCQkJCXRyeSB7CisJCQkJCWZvbGRlcnNNYW5hZ2VyLmNyZWF0ZUxpbmtGb2xkZXIoKElQYXRoKSBmb2xkZXJQYXRoLCByZWZyZXNoSWZFeGlzdEFscmVhZHksIG1vbml0b3IpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyByZW1vdmFsIG9mIGxpbmtlZCBmb2xkZXJzIGlzIGRvbmUgZHVyaW5nIHNhdmUKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJFeHRlcm5hbEZvbGRlckNoYW5nZTogIiArIHRoaXMucHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTU2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIDxzdGVwaGFuQGNzLnR1LWJlcmxpbi5kZT4gLSBpbmNvbnNpc3RlbnQgaW5pdGlhbGl6YXRpb24gb2YgY2xhc3NwYXRoIGNvbnRhaW5lciBiYWNrZWQgYnkgZXh0ZXJuYWwgY2xhc3MgZm9sZGVyLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDYxOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKKworcHVibGljIGNsYXNzIEV4dGVybmFsRm9sZGVyc01hbmFnZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9QUk9KRUNUX05BTUUgPSAiLm9yZy5lY2xpcHNlLmpkdC5jb3JlLmV4dGVybmFsLmZvbGRlcnMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktFRF9GT0xERVJfTkFNRSA9ICIubGluayI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIE1hcCBmb2xkZXJzOworCXByaXZhdGUgU2V0IHBlbmRpbmdGb2xkZXJzOyAvLyBzdWJzZXQgb2Yga2V5cyBvZiAnZm9sZGVycycsIGZvciB3aGljaCBsaW5rZWQgZm9sZGVycyBoYXZlbid0IGJlZW4gY3JlYXRlZCB5ZXQuCisJcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisJLyogU2luZ2xldG9uIGluc3RhbmNlICovCisJcHJpdmF0ZSBzdGF0aWMgRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBNQU5BR0VSID0gbmV3IEV4dGVybmFsRm9sZGVyc01hbmFnZXIoKTsKKworCXByaXZhdGUgRXh0ZXJuYWxGb2xkZXJzTWFuYWdlcigpIHsKKwkJLy8gUHJldmVudCBpbnN0YW50aWF0aW9uCisJfQorCQorCXB1YmxpYyBzdGF0aWMgRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBnZXRFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyKCkgeworCQlyZXR1cm4gTUFOQUdFUjsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm5zIGEgc2V0IG9mIGV4dGVybmFsIHBhdGggdG8gZXh0ZXJuYWwgZm9sZGVycyByZWZlcnJlZCB0byBvbiB0aGUgZ2l2ZW4gY2xhc3NwYXRoLgorCSAqIFJldHVybnMgbnVsbCBpZiBub25lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSGFzaFNldCBnZXRFeHRlcm5hbEZvbGRlcnMoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoKSB7CisJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlIYXNoU2V0IGZvbGRlcnMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQlpZiAoaXNFeHRlcm5hbEZvbGRlclBhdGgoZW50cnlQYXRoKSkgeworCQkJCQlpZiAoZm9sZGVycyA9PSBudWxsKQorCQkJCQkJZm9sZGVycyA9IG5ldyBIYXNoU2V0KCk7CisJCQkJCWZvbGRlcnMuYWRkKGVudHJ5UGF0aCk7CisJCQkJfQorCQkJCUlQYXRoIGF0dGFjaG1lbnRQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwkJCQlpZiAoaXNFeHRlcm5hbEZvbGRlclBhdGgoYXR0YWNobWVudFBhdGgpKSB7CisJCQkJCWlmIChmb2xkZXJzID09IG51bGwpCisJCQkJCQlmb2xkZXJzID0gbmV3IEhhc2hTZXQoKTsKKwkJCQkJZm9sZGVycy5hZGQoYXR0YWNobWVudFBhdGgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZm9sZGVyczsKKwl9CisKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsRm9sZGVyUGF0aChJUGF0aCBleHRlcm5hbFBhdGgpIHsKKwkJaWYgKGV4dGVybmFsUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlTdHJpbmcgZmlyc3RTZWdtZW50ID0gZXh0ZXJuYWxQYXRoLnNlZ21lbnQoMCk7CisJCWlmIChmaXJzdFNlZ21lbnQgIT0gbnVsbCAmJiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZmlyc3RTZWdtZW50KS5leGlzdHMoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJRmlsZSBleHRlcm5hbEZvbGRlciA9IGV4dGVybmFsUGF0aC50b0ZpbGUoKTsKKwkJaWYgKGV4dGVybmFsRm9sZGVyLmlzRmlsZSgpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZXh0ZXJuYWxQYXRoLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsLypsaWtlbHkgYSAuamFyLCAuemlwLCAucmFyIG9yIG90aGVyIGZpbGUqLyAmJiAhZXh0ZXJuYWxGb2xkZXIuZXhpc3RzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVybmFsUGF0aEZvckV4dGVybmFsRm9sZGVyKElQYXRoIHJlc291cmNlUGF0aCkgeworCQlyZXR1cm4gRVhURVJOQUxfUFJPSkVDVF9OQU1FLmVxdWFscyhyZXNvdXJjZVBhdGguc2VnbWVudCgwKSk7CisJfQorCisJcHVibGljIElGb2xkZXIgYWRkRm9sZGVyKElQYXRoIGV4dGVybmFsRm9sZGVyUGF0aCwgYm9vbGVhbiBzY2hlZHVsZUZvckNyZWF0aW9uKSB7CisJCXJldHVybiBhZGRGb2xkZXIoZXh0ZXJuYWxGb2xkZXJQYXRoLCBnZXRFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KCksIHNjaGVkdWxlRm9yQ3JlYXRpb24pOworCX0KKworCXByaXZhdGUgSUZvbGRlciBhZGRGb2xkZXIoSVBhdGggZXh0ZXJuYWxGb2xkZXJQYXRoLCBJUHJvamVjdCBleHRlcm5hbEZvbGRlcnNQcm9qZWN0LCBib29sZWFuIHNjaGVkdWxlRm9yQ3JlYXRpb24pIHsKKwkJTWFwIGtub3duRm9sZGVycyA9IGdldEZvbGRlcnMoKTsKKwkJT2JqZWN0IGV4aXN0aW5nID0ga25vd25Gb2xkZXJzLmdldChleHRlcm5hbEZvbGRlclBhdGgpOworCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJcmV0dXJuIChJRm9sZGVyKSBleGlzdGluZzsKKwkJfQorCQlJRm9sZGVyIHJlc3VsdDsKKwkJZG8geworCQkJcmVzdWx0ID0gZXh0ZXJuYWxGb2xkZXJzUHJvamVjdC5nZXRGb2xkZXIoTElOS0VEX0ZPTERFUl9OQU1FICsgdGhpcy5jb3VudGVyKyspOworCQl9IHdoaWxlIChyZXN1bHQuZXhpc3RzKCkpOworCQlpZiAoc2NoZWR1bGVGb3JDcmVhdGlvbikgeworCQkJaWYgKHRoaXMucGVuZGluZ0ZvbGRlcnMgPT0gbnVsbCkKKwkJCQl0aGlzLnBlbmRpbmdGb2xkZXJzID0gbmV3IEhhc2hTZXQoKTsKKwkJCXRoaXMucGVuZGluZ0ZvbGRlcnMuYWRkKGV4dGVybmFsRm9sZGVyUGF0aCk7CisJCX0KKwkJa25vd25Gb2xkZXJzLnB1dChleHRlcm5hbEZvbGRlclBhdGgsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKiAKKwkgKiBUcnkgdG8gcmVtb3ZlIHRoZSBhcmd1bWVudCBmcm9tIHRoZSBsaXN0IG9mIGZvbGRlcnMgcGVuZGluZyBmb3IgY3JlYXRpb24uCisJICogQHBhcmFtIGV4dGVybmFsUGF0aCB0byBsaW5rIHRvCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCB3YXMgZm91bmQgaW4gdGhlIGxpc3Qgb2YgcGVuZGluZyBmb2xkZXJzIGFuZCBjb3VsZCBiZSByZW1vdmVkIGZyb20gaXQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlUGVuZGluZ0ZvbGRlcihPYmplY3QgZXh0ZXJuYWxQYXRoKSB7CisJCWlmICh0aGlzLnBlbmRpbmdGb2xkZXJzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0aGlzLnBlbmRpbmdGb2xkZXJzLnJlbW92ZShleHRlcm5hbFBhdGgpOworCX0KKworCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUxpbmtGb2xkZXIoSVBhdGggZXh0ZXJuYWxGb2xkZXJQYXRoLCBib29sZWFuIHJlZnJlc2hJZkV4aXN0QWxyZWFkeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0IGV4dGVybmFsRm9sZGVyc1Byb2plY3QgPSBjcmVhdGVFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KG1vbml0b3IpOyAvLyBydW4gb3V0c2lkZSBzeW5jaHJvbml6ZWQgYXMgdGhpcyBjYW4gY3JlYXRlIGEgcmVzb3VyY2UKKwkJcmV0dXJuIGNyZWF0ZUxpbmtGb2xkZXIoZXh0ZXJuYWxGb2xkZXJQYXRoLCByZWZyZXNoSWZFeGlzdEFscmVhZHksIGV4dGVybmFsRm9sZGVyc1Byb2plY3QsIG1vbml0b3IpOworCX0KKworCXByaXZhdGUgSUZvbGRlciBjcmVhdGVMaW5rRm9sZGVyKElQYXRoIGV4dGVybmFsRm9sZGVyUGF0aCwgYm9vbGVhbiByZWZyZXNoSWZFeGlzdEFscmVhZHksCisJCQkJCQkJCQlJUHJvamVjdCBleHRlcm5hbEZvbGRlcnNQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCUlGb2xkZXIgcmVzdWx0ID0gYWRkRm9sZGVyKGV4dGVybmFsRm9sZGVyUGF0aCwgZXh0ZXJuYWxGb2xkZXJzUHJvamVjdCwgZmFsc2UpOworCQlpZiAoIXJlc3VsdC5leGlzdHMoKSkKKwkJCXJlc3VsdC5jcmVhdGVMaW5rKGV4dGVybmFsRm9sZGVyUGF0aCwgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG1vbml0b3IpOworCQllbHNlIGlmIChyZWZyZXNoSWZFeGlzdEFscmVhZHkpCisJCQlyZXN1bHQucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgIG1vbml0b3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZVBlbmRpbmdGb2xkZXJzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbnsKKwkJaWYgKHRoaXMucGVuZGluZ0ZvbGRlcnMgPT0gbnVsbCB8fCB0aGlzLnBlbmRpbmdGb2xkZXJzLmlzRW1wdHkoKSkgcmV0dXJuOworCQkKKwkJSVByb2plY3QgZXh0ZXJuYWxGb2xkZXJzUHJvamVjdCA9IG51bGw7CisJCXRyeSB7CisJCQlleHRlcm5hbEZvbGRlcnNQcm9qZWN0ID0gY3JlYXRlRXh0ZXJuYWxGb2xkZXJzUHJvamVjdChtb25pdG9yKTsKKwkJfQorCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCX0KKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnBlbmRpbmdGb2xkZXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBmb2xkZXJQYXRoID0gaXRlcmF0b3IubmV4dCgpOworCQkJdHJ5IHsKKwkJCQljcmVhdGVMaW5rRm9sZGVyKChJUGF0aCkgZm9sZGVyUGF0aCwgZmFsc2UsIGV4dGVybmFsRm9sZGVyc1Byb2plY3QsIG1vbml0b3IpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXRpbC5sb2coZSwgIkVycm9yIHdoaWxlIGNyZWF0aW5nIGEgbGluayBmb3IgZXh0ZXJuYWwgZm9sZGVyIDoiICsgZm9sZGVyUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQl0aGlzLnBlbmRpbmdGb2xkZXJzLmNsZWFyKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGNsZWFuVXAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdCB0b0RlbGV0ZSA9IGdldEZvbGRlcnNUb0NsZWFuVXAobW9uaXRvcik7CisJCWlmICh0b0RlbGV0ZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCWZvbGRlci5kZWxldGUodHJ1ZSwgbW9uaXRvcik7CisJCQlJUGF0aCBrZXkgPSAoSVBhdGgpIGVudHJ5LmdldEtleSgpOworCQkJdGhpcy5mb2xkZXJzLnJlbW92ZShrZXkpOworCQl9CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KCk7CisJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIHByb2plY3QubWVtYmVycygpLmxlbmd0aCA9PSAxLypyZW1haW5pbmcgbWVtYmVyIGlzIC5wcm9qZWN0Ki8pCisJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKKwl9CisKKwlwcml2YXRlIEFycmF5TGlzdCBnZXRGb2xkZXJzVG9DbGVhblVwKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlEZWx0YVByb2Nlc3NpbmdTdGF0ZSBzdGF0ZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0RGVsdGFTdGF0ZSgpOworCQlIYXNoTWFwIHJvb3RzID0gc3RhdGUucm9vdHM7CisJCUhhc2hNYXAgc291cmNlQXR0YWNobWVudHMgPSBzdGF0ZS5zb3VyY2VBdHRhY2htZW50czsKKwkJaWYgKHJvb3RzID09IG51bGwgJiYgc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlNYXAga25vd25Gb2xkZXJzID0gZ2V0Rm9sZGVycygpOworCQlBcnJheUxpc3QgcmVzdWx0ID0gbnVsbDsKKwkJc3luY2hyb25pemVkIChrbm93bkZvbGRlcnMpIHsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0ga25vd25Gb2xkZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKChyb290cyAhPSBudWxsICYmICFyb290cy5jb250YWluc0tleShwYXRoKSkKKwkJCQkJCSYmIChzb3VyY2VBdHRhY2htZW50cyAhPSBudWxsICYmICFzb3VyY2VBdHRhY2htZW50cy5jb250YWluc0tleShwYXRoKSkpIHsKKwkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJCXJlc3VsdC5hZGQoZW50cnkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIElQcm9qZWN0IGdldEV4dGVybmFsRm9sZGVyc1Byb2plY3QoKSB7CisJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoRVhURVJOQUxfUFJPSkVDVF9OQU1FKTsKKwl9CisJcHVibGljIElQcm9qZWN0IGNyZWF0ZUV4dGVybmFsRm9sZGVyc1Byb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KCk7CisJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgeworCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7CisJCQkJY3JlYXRlRXh0ZXJuYWxGb2xkZXJzUHJvamVjdChwcm9qZWN0LCBtb25pdG9yKTsKKwkJCX0KKwkJCW9wZW5FeHRlcm5hbEZvbGRlcnNQcm9qZWN0KHByb2plY3QsIG1vbml0b3IpOworCQl9CisJCXJldHVybiBwcm9qZWN0OworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBvcGVuIHRoZSBnaXZlbiBwcm9qZWN0IChhc3N1bWluZyBpdCBleGlzdHMpLgorCSAqIElmIGZhaWxpbmcgdG8gb3BlbiwgbWFrZSBhbGwgYXR0ZW1wdHMgdG8gcmVjcmVhdGUgdGhlIG1pc3NpbmcgcGllY2VzLgorCSAqLworCXByaXZhdGUgdm9pZCBvcGVuRXh0ZXJuYWxGb2xkZXJzUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgeworCQkJaWYgKGUxLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1JFQURfTUVUQURBVEEpIHsKKwkJCQkvLyB3b3Jrc3BhY2Ugd2FzIG1vdmVkIAorCQkJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTQwMCBhbmQgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjU3MSApCisJCQkJcHJvamVjdC5kZWxldGUoZmFsc2UvKmRvbid0IGRlbGV0ZSBjb250ZW50Ki8sIHRydWUvKmZvcmNlKi8sIG1vbml0b3IpOworCQkJCWNyZWF0ZUV4dGVybmFsRm9sZGVyc1Byb2plY3QocHJvamVjdCwgbW9uaXRvcik7CisJCQl9IGVsc2UgeworCQkJCS8vIC5wcm9qZWN0IG9yIGZvbGRlciBvbiBkaXNrIGhhdmUgYmVlbiBkZWxldGVkLCByZWNyZWF0ZSB0aGVtCisJCQkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IEphdmFDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKTsKKwkJCQlJUGF0aCBwcm9qZWN0UGF0aCA9IHN0YXRlTG9jYXRpb24uYXBwZW5kKEVYVEVSTkFMX1BST0pFQ1RfTkFNRSk7CisJCQkJcHJvamVjdFBhdGgudG9GaWxlKCkubWtkaXJzKCk7CisJCQkJdHJ5IHsKKwkJCQkgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9qZWN0UGF0aC5hcHBlbmQoIi5wcm9qZWN0IikudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCSAgICB0cnkgeworCQkJCSAgICAgICAgb3V0cHV0LndyaXRlKCgKKwkJCQkgICAgICAgIAkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkgICAgICAgIAkJIjxwcm9qZWN0RGVzY3JpcHRpb24+XG4iICsgLy8kTk9OLU5MUy0xJAorCQkJCSAgICAgICAgCQkiCTxuYW1lPiIgKyBFWFRFUk5BTF9QUk9KRUNUX05BTUUgKyAiPC9uYW1lPlxuIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSAgICAgICAgCQkiCTxjb21tZW50PjwvY29tbWVudD5cbiIgKyAvLyROT04tTkxTLTEkCisJCQkJICAgICAgICAJCSIJPHByb2plY3RzPlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkgICAgICAgIAkJIgk8L3Byb2plY3RzPlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkgICAgICAgIAkJIgk8YnVpbGRTcGVjPlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkgICAgICAgIAkJIgk8L2J1aWxkU3BlYz5cbiIgKyAvLyROT04tTkxTLTEkCisJCQkJICAgICAgICAJCSIJPG5hdHVyZXM+XG4iICsgLy8kTk9OLU5MUy0xJAorCQkJCSAgICAgICAgCQkiCTwvbmF0dXJlcz5cbiIgKyAvLyROT04tTkxTLTEkCisJCQkJICAgICAgICAJCSI8L3Byb2plY3REZXNjcmlwdGlvbj4iKS5nZXRCeXRlcygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCSAgICB9IGZpbmFsbHkgeworCQkJCSAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisJCQkJICAgIH0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGZhbGxiYWNrIHRvIHJlLWNyZWF0aW5nIHRoZSBwcm9qZWN0CisJCQkJCXByb2plY3QuZGVsZXRlKGZhbHNlLypkb24ndCBkZWxldGUgY29udGVudCovLCB0cnVlLypmb3JjZSovLCBtb25pdG9yKTsKKwkJCQkJY3JlYXRlRXh0ZXJuYWxGb2xkZXJzUHJvamVjdChwcm9qZWN0LCBtb25pdG9yKTsKKwkJCQl9CisJCQl9CisJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7CisJCX0KKwl9CisKKworCXByaXZhdGUgdm9pZCBjcmVhdGVFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0LmdldE5hbWUoKSk7CisJCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCk7CisJCWRlc2Muc2V0TG9jYXRpb24oc3RhdGVMb2NhdGlvbi5hcHBlbmQoRVhURVJOQUxfUFJPSkVDVF9OQU1FKSk7CisJCXByb2plY3QuY3JlYXRlKGRlc2MsIElSZXNvdXJjZS5ISURERU4sIG1vbml0b3IpOworCX0KKworCXB1YmxpYyBJRm9sZGVyIGdldEZvbGRlcihJUGF0aCBleHRlcm5hbEZvbGRlclBhdGgpIHsKKwkJcmV0dXJuIChJRm9sZGVyKSBnZXRGb2xkZXJzKCkuZ2V0KGV4dGVybmFsRm9sZGVyUGF0aCk7CisJfQorCisJcHJpdmF0ZSBNYXAgZ2V0Rm9sZGVycygpIHsKKwkJaWYgKHRoaXMuZm9sZGVycyA9PSBudWxsKSB7CisJCQlNYXAgdGVtcEZvbGRlcnMgPSBuZXcgSGFzaE1hcCgpOworCQkJSVByb2plY3QgcHJvamVjdCA9IGdldEV4dGVybmFsRm9sZGVyc1Byb2plY3QoKTsKKwkJCXRyeSB7CisJCQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7CisJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7CisJCQkJCQkvLyB3b3Jrc3BhY2Ugd2FzIG1vdmVkIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjU3MSApCisJCQkJCQlvcGVuRXh0ZXJuYWxGb2xkZXJzUHJvamVjdChwcm9qZWN0LCBudWxsLypubyBwcm9ncmVzcyovKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGlmIHByb2plY3QgZG9lc24ndCBleGlzdCwgZG8gbm90IG9wZW4gYW5kIHJlY3JlYXRlIGl0IGFzIGl0IG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vIGV4dGVybmFsIGZvbGRlcnMKKwkJCQkJCXJldHVybiB0aGlzLmZvbGRlcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAodGVtcEZvbGRlcnMpOworCQkJCQl9CisJCQkJfQorCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWVtYmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKKwkJCQkJaWYgKG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiAmJiBtZW1iZXIuaXNMaW5rZWQoKSAmJiBtZW1iZXIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoTElOS0VEX0ZPTERFUl9OQU1FKSkgeworCQkJCQkJSVBhdGggZXh0ZXJuYWxGb2xkZXJQYXRoID0gbWVtYmVyLmdldExvY2F0aW9uKCk7CisJCQkJCQl0ZW1wRm9sZGVycy5wdXQoZXh0ZXJuYWxGb2xkZXJQYXRoLCBtZW1iZXIpOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSBpbml0aWFsaXppbmcgZXh0ZXJuYWwgZm9sZGVycyIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQl0aGlzLmZvbGRlcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAodGVtcEZvbGRlcnMpOworCQl9CisJCXJldHVybiB0aGlzLmZvbGRlcnM7CisJfQorCQorCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTMxNTMKKwkvLyBVc2UgdGhlIHNhbWUgUmVmcmVzaEpvYiBpZiB0aGUgam9iIGlzIHN0aWxsIGF2YWlsYWJsZQorCXByaXZhdGUgdm9pZCBydW5SZWZyZXNoSm9iKENvbGxlY3Rpb24gcGF0aHMpIHsKKwkJSm9iW10gam9icyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuZmluZChSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9SRUZSRVNIKTsKKwkJUmVmcmVzaEpvYiByZWZyZXNoSm9iID0gbnVsbDsKKwkJaWYgKGpvYnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGpvYnMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJLy8gV2UgYXJlIG9ubHkgY29uY2VybmVkIGFib3V0IEV4dGVybmFsRm9sZGVyTWFuYWdlci5SZWZyZXNoSm9iCisJCQkJaWYoam9ic1tpbmRleF0gaW5zdGFuY2VvZiBSZWZyZXNoSm9iKSB7CisJCQkJCXJlZnJlc2hKb2IgPSAgKFJlZnJlc2hKb2IpIGpvYnNbaW5kZXhdOworCQkJCQlyZWZyZXNoSm9iLmFkZEZvbGRlcnNUb1JlZnJlc2gocGF0aHMpOworCQkJCQlpZiAocmVmcmVzaEpvYi5nZXRTdGF0ZSgpID09IEpvYi5OT05FKSB7CisJCQkJCQlyZWZyZXNoSm9iLnNjaGVkdWxlKCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChyZWZyZXNoSm9iID09IG51bGwpIHsKKwkJCXJlZnJlc2hKb2IgPSBuZXcgUmVmcmVzaEpvYihuZXcgVmVjdG9yKHBhdGhzKSk7CisJCQlyZWZyZXNoSm9iLnNjaGVkdWxlKCk7CisJCX0KKwl9CisJLyoKKwkgKiBSZWZyZXNoZXMgdGhlIGV4dGVybmFsIGZvbGRlcnMgcmVmZXJlbmNlZCBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBnaXZlbiBzb3VyY2UgcHJvamVjdAorCSAqLworCXB1YmxpYyB2b2lkIHJlZnJlc2hSZWZlcmVuY2VzKGZpbmFsIElQcm9qZWN0W10gc291cmNlUHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlJUHJvamVjdCBleHRlcm5hbFByb2plY3QgPSBnZXRFeHRlcm5hbEZvbGRlcnNQcm9qZWN0KCk7CisJCXRyeSB7CisJCQlIYXNoU2V0IGV4dGVybmFsRm9sZGVycyA9IG51bGw7CisJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlUHJvamVjdHMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJaWYgKHNvdXJjZVByb2plY3RzW2luZGV4XS5lcXVhbHMoZXh0ZXJuYWxQcm9qZWN0KSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHNvdXJjZVByb2plY3RzW2luZGV4XSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJSGFzaFNldCBmb2xkZXJzSW5Qcm9qZWN0ID0gZ2V0RXh0ZXJuYWxGb2xkZXJzKCgoSmF2YVByb2plY3QpIEphdmFDb3JlLmNyZWF0ZShzb3VyY2VQcm9qZWN0c1tpbmRleF0pKS5nZXRSZXNvbHZlZENsYXNzcGF0aCgpKTsKKwkJCQkKKwkJCQlpZiAoZm9sZGVyc0luUHJvamVjdCA9PSBudWxsIHx8IGZvbGRlcnNJblByb2plY3Quc2l6ZSgpID09IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleHRlcm5hbEZvbGRlcnMgPT0gbnVsbCkKKwkJCQkJZXh0ZXJuYWxGb2xkZXJzID0gbmV3IEhhc2hTZXQoKTsKKwkJCQkKKwkJCQlleHRlcm5hbEZvbGRlcnMuYWRkQWxsKGZvbGRlcnNJblByb2plY3QpOworCQkJfQorCQkJaWYgKGV4dGVybmFsRm9sZGVycyA9PSBudWxsKSAKKwkJCQlyZXR1cm47CisKKwkJCXJ1blJlZnJlc2hKb2IoZXh0ZXJuYWxGb2xkZXJzKTsKKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgcmVmcmVzaGluZyBleHRlcm5hbCBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm47CisJfQorCXB1YmxpYyB2b2lkIHJlZnJlc2hSZWZlcmVuY2VzKElQcm9qZWN0IHNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCUlQcm9qZWN0IGV4dGVybmFsUHJvamVjdCA9IGdldEV4dGVybmFsRm9sZGVyc1Byb2plY3QoKTsKKwkJaWYgKHNvdXJjZS5lcXVhbHMoZXh0ZXJuYWxQcm9qZWN0KSkKKwkJCXJldHVybjsKKwkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHNvdXJjZSkpCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlIYXNoU2V0IGV4dGVybmFsRm9sZGVycyA9IGdldEV4dGVybmFsRm9sZGVycygoKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUoc291cmNlKSkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSk7CisJCQlpZiAoZXh0ZXJuYWxGb2xkZXJzID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJCisJCQlydW5SZWZyZXNoSm9iKGV4dGVybmFsRm9sZGVycyk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSByZWZyZXNoaW5nIGV4dGVybmFsIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybjsKKwl9CisKKwlwdWJsaWMgSUZvbGRlciByZW1vdmVGb2xkZXIoSVBhdGggZXh0ZXJuYWxGb2xkZXJQYXRoKSB7CisJCXJldHVybiAoSUZvbGRlcikgZ2V0Rm9sZGVycygpLnJlbW92ZShleHRlcm5hbEZvbGRlclBhdGgpOworCX0KKworCWNsYXNzIFJlZnJlc2hKb2IgZXh0ZW5kcyBKb2IgeworCQlWZWN0b3IgZXh0ZXJuYWxGb2xkZXJzID0gbnVsbDsKKwkJUmVmcmVzaEpvYihWZWN0b3IgZXh0ZXJuYWxGb2xkZXJzKXsKKwkJCXN1cGVyKE1lc3NhZ2VzLnJlZnJlc2hpbmdfZXh0ZXJuYWxfZm9sZGVycyk7CisJCQl0aGlzLmV4dGVybmFsRm9sZGVycyA9IGV4dGVybmFsRm9sZGVyczsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCXJldHVybiBmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfUkVGUkVTSDsKKwkJfQorCQkKKwkJLyoKKwkJICogQWRkIHRoZSBjb2xsZWN0aW9uIG9mIHBhdGhzIHRvIGJlIHJlZnJlc2hlZCB0byB0aGUgYWxyZWFkeSAKKwkJICogZXhpc3RpbmcgbGlzdCBvZiBwYXRocy4gIAorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkRm9sZGVyc1RvUmVmcmVzaChDb2xsZWN0aW9uIHBhdGhzKSB7CisJCQlpZiAoIXBhdGhzLmlzRW1wdHkoKSAmJiB0aGlzLmV4dGVybmFsRm9sZGVycyA9PSBudWxsKSB7CisJCQkJdGhpcy5leHRlcm5hbEZvbGRlcnMgPSBuZXcgVmVjdG9yKCk7IAorCQkJfQorCQkJSXRlcmF0b3IgaXQgPSBwYXRocy5pdGVyYXRvcigpOworCQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7CisJCQkJT2JqZWN0IHBhdGggPSBpdC5uZXh0KCk7CisJCQkJaWYgKCF0aGlzLmV4dGVybmFsRm9sZGVycy5jb250YWlucyhwYXRoKSkgeworCQkJCQl0aGlzLmV4dGVybmFsRm9sZGVycy5hZGQocGF0aCk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgeworCQkJdHJ5IHsKKwkJCQlpZiAodGhpcy5leHRlcm5hbEZvbGRlcnMgPT0gbnVsbCkgCisJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCUlQYXRoIGV4dGVybmFsUGF0aCA9IG51bGw7CisJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZXh0ZXJuYWxGb2xkZXJzLnNpemUoKTsgaW5kZXgrKyApIHsKKwkJCQkJaWYgKChleHRlcm5hbFBhdGggPSAoSVBhdGgpdGhpcy5leHRlcm5hbEZvbGRlcnMuZ2V0KGluZGV4KSkgIT0gbnVsbCkgeworCQkJCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRGb2xkZXIoZXh0ZXJuYWxQYXRoKTsKKwkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEzNTgKKwkJCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkKKwkJCQkJCQlmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgcG0pOworCQkJCQl9CisJCQkJCS8vIFNldCB0aGUgcHJvY2Vzc2VkIG9uZXMgdG8gbnVsbCBpbnN0ZWFkIG9mIHJlbW92aW5nIHRoZSBlbGVtZW50IGFsdG9nZXRoZXIsCisJCQkJCS8vIHNvIHRoYXQgdGhleSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGR1cGxpY2F0ZXMuCisJCQkJCS8vIFRoaXMgd2lsbCBhbHNvIGF2b2lkIGVsZW1lbnRzIGJlaW5nIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgZXZlcnkgdGltZSBhbiBlbGVtZW50CisJCQkJCS8vIGlzIHJlbW92ZWQuIEhvd2V2ZXIsIHRoZXJlIGlzIGEgcmlzayBvZiBDb2xsZWN0aW9uIHNpemUgdG8gYmUgaW5jcmVhc2VkIG1vcmUgb2Z0ZW4uCisJCQkJCXRoaXMuZXh0ZXJuYWxGb2xkZXJzLnNldEVsZW1lbnRBdChudWxsLCBpbmRleCk7CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7CisJCQl9CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0V4dGVybmFsSmF2YVByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0V4dGVybmFsSmF2YVByb2plY3QuamF2YQppbmRleCAwM2Y0MmQwLi41ZTg0MmQ4IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbEphdmFQcm9qZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRXh0ZXJuYWxKYXZhUHJvamVjdC5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIsMTMgKzEyLDE0IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgRXh0ZXJuYWxKYXZhUHJvamVjdCBleHRlbmRzIEphdmFQcm9qZWN0IHsKLQkKKwogCS8qCiAJICogTm90ZSB0aGlzIG5hbWUgY2FuIGJlIHN1cmZhY2VkIGluIHRoZSBVSSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjgyNTgpCiAJICovCkBAIC0yNywxMiArMjgsMTIgQEAKIAlwdWJsaWMgRXh0ZXJuYWxKYXZhUHJvamVjdChJQ2xhc3NwYXRoRW50cnlbXSByYXdDbGFzc3BhdGgpIHsKIAkJc3VwZXIoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KEVYVEVSTkFMX1BST0pFQ1RfTkFNRSksIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpKTsKIAkJdHJ5IHsKLQkJCWdldFBlclByb2plY3RJbmZvKCkuc2V0Q2xhc3NwYXRoKHJhd0NsYXNzcGF0aCwgZGVmYXVsdE91dHB1dExvY2F0aW9uKCksIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSy8qbm8gLmNsYXNzcGF0aCBmb3JtYXQgcHJvYmxlbSovLCBudWxsLypubyByZXNvbHZlZCBjbGFzcGF0aCovLCBudWxsLypubyByZXZlcnNlIG1hcCovLCBudWxsLypubyByZXNvbHZlIGVudHJ5IG1hcCovLCBudWxsLypubyByZXNvbHZlZCBzdGF0dXMqLyk7CisJCQlnZXRQZXJQcm9qZWN0SW5mbygpLnNldFJhd0NsYXNzcGF0aChyYXdDbGFzc3BhdGgsIGRlZmF1bHRPdXRwdXRMb2NhdGlvbigpLCBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0svKm5vIC5jbGFzc3BhdGggZm9ybWF0IHByb2JsZW0qLyk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkvLyBnZXRQZXJQcm9qZWN0SW5mbygpIG5ldmVyIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gZm9yIGFuIEV4dGVybmFsSmF2YVByb2plY3QKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlyZXR1cm4gdGhpcyA9PSBvOwogCX0KQEAgLTQxLDE0ICs0MiwxNCBAQAogCQkvLyBleHRlcm5hbCBwcm9qZWN0IG5ldmVyIGV4aXN0cwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyBnZXRPcHRpb24oU3RyaW5nIG9wdGlvbk5hbWUsIGJvb2xlYW4gaW5oZXJpdEphdmFDb3JlT3B0aW9ucykgewogCQlpZiAoSmF2YUNvcmUuQ09NUElMRVJfUEJfRk9SQklEREVOX1JFRkVSRU5DRS5lcXVhbHMob3B0aW9uTmFtZSkKIAkJCQl8fCBKYXZhQ29yZS5DT01QSUxFUl9QQl9ESVNDT1VSQUdFRF9SRUZFUkVOQ0UuZXF1YWxzKG9wdGlvbk5hbWUpKQogCQkJcmV0dXJuIEphdmFDb3JlLklHTk9SRTsKIAkJcmV0dXJuIHN1cGVyLmdldE9wdGlvbihvcHRpb25OYW1lLCBpbmhlcml0SmF2YUNvcmVPcHRpb25zKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAJCS8vIHNpbmNlIHByb2plY3QgaXMgZXh0ZXJuYWwsIG5vIGVsZW1lbnQgaXMgb24gY2xhc3NwYXRoIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMDEzI2MxNikKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTksNCArNjAsOCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFeGlzdGVuY2UoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCQkvLyBhbGxvdyBvcGVuaW5nIG9mIGV4dGVybmFsIHByb2plY3QKKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0V4dGVybmFsUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzFmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIEEgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZXh0ZXJuYWwgY2xhc3MgZm9sZGVyLgorICoKKyAqIDxwPk5PVEU6IEFuIGV4dGVybmFsIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBuZXZlciBoYXMgYW4gYXNzb2NpYXRlZCByZXNvdXJjZS4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudFJvb3RJbmZvCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QgZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnRSb290IHsKKworCS8qKgorCSAqIFRoZSBwYXRoIHRvIHRoZSBleHRlcm5hbCBmb2xkZXIKKwkgKiAoYW4gT1MgcGF0aCkKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSVBhdGggZXh0ZXJuYWxQYXRoOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKwkgKiBiYXNlZCBvbiBhbiBleHRlcm5hbCBmb2xkZXIgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbmQKKwkgKiBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgRXh0ZXJuYWxQYWNrYWdlRnJhZ21lbnRSb290KElQYXRoIGV4dGVybmFsUGF0aCwgSmF2YVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihudWxsLCBwcm9qZWN0KTsKKwkJdGhpcy5leHRlcm5hbFBhdGggPSBleHRlcm5hbFBhdGg7CisJfQorCisJcHJvdGVjdGVkIEV4dGVybmFsUGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgbGlua2VkRm9sZGVyLCBJUGF0aCBleHRlcm5hbFBhdGgsIEphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIobGlua2VkRm9sZGVyLCBwcm9qZWN0KTsKKwkJdGhpcy5leHRlcm5hbFBhdGggPSBleHRlcm5hbFBhdGggPT0gbnVsbCA/IGxpbmtlZEZvbGRlci5nZXRMb2NhdGlvbigpIDogZXh0ZXJuYWxQYXRoOworCX0KKworCS8qKgorCSAqIEFuIGV4dGVybmFsIGNsYXNzIGZvbGRlciBpcyBhbHdheXMgS19CSU5BUlkuCisJICovCisJcHJvdGVjdGVkIGludCBkZXRlcm1pbmVLaW5kKElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKKwkJcmV0dXJuIElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYW5kbGUgcmVwcmVzZW50cyB0aGUgc2FtZSBleHRlcm5hbCBmb2xkZXIKKwkgKiBhcyB0aGUgZ2l2ZW4gaGFuZGxlLgorCSAqCisJICogQHNlZSBPYmplY3QjZXF1YWxzCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmICh0aGlzID09IG8pCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCUV4dGVybmFsUGFja2FnZUZyYWdtZW50Um9vdCBvdGhlcj0gKEV4dGVybmFsUGFja2FnZUZyYWdtZW50Um9vdCkgbzsKKwkJCXJldHVybiB0aGlzLmV4dGVybmFsUGF0aC5lcXVhbHMob3RoZXIuZXh0ZXJuYWxQYXRoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmV4dGVybmFsUGF0aC5sYXN0U2VnbWVudCgpOworCX0KKwkvKioKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisJICovCisJcHVibGljIGludCBnZXRLaW5kKCkgeworCQlyZXR1cm4gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlk7CisJfQorCWludCBpbnRlcm5hbEtpbmQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZOworCX0KKwkvKioKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisJICovCisJcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJCXJldHVybiB0aGlzLmV4dGVybmFsUGF0aDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy5leHRlcm5hbFBhdGguaGFzaENvZGUoKTsKKwl9CisJLyoqCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CisJCWlmICh0aGlzLnJlc291cmNlID09IG51bGwpCisJCQlyZXR1cm4gdGhpcy5yZXNvdXJjZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0RXh0ZXJuYWxNYW5hZ2VyKCkuZ2V0Rm9sZGVyKHRoaXMuZXh0ZXJuYWxQYXRoKTsKKwkJcmV0dXJuIHN1cGVyLnJlc291cmNlKHJvb3QpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlRXhpc3RzKElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKKwkJaWYgKHVuZGVybHlpbmdSZXNvdXJjZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlJUGF0aCBsb2NhdGlvbiA9IHVuZGVybHlpbmdSZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJRmlsZSBmaWxlID0gbG9jYXRpb24udG9GaWxlKCk7CisJCWlmIChmaWxlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBmaWxlLmV4aXN0cygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nQW5jZXN0b3JzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJLy8gZG9uJ3Qgc2hvdyBwcm9qZWN0IGFzIGl0IGlzIGlycmVsZXZhbnQgZm9yIGV4dGVybmFsIGZvbGRlcnMuCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSU5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSU5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTE3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JTmFtZUVudmlyb25tZW50V2l0aFByb2dyZXNzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworCisvKioKKyAqIFRoZSBuYW1lIGVudmlyb25tZW50IHByb3ZpZGVzIGEgY2FsbGJhY2sgQVBJIHRoYXQgdGhlIGNvbXBpbGVyCisgKiBjYW4gdXNlIHRvIGxvb2sgdXAgdHlwZXMsIGNvbXBpbGF0aW9uIHVuaXRzLCBhbmQgcGFja2FnZXMgaW4gdGhlCisgKiBjdXJyZW50IGVudmlyb25tZW50LiAgVGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorICogb24gY3JlYXRpb24uCisgKiAKKyAqIFRoaXMgbmFtZSBlbnZpcm9ubWVudCBjYW4gYmUgY2FuY2VsZWQgdXNpbmcgdGhlIG1vbml0b3IgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvCisgKiB7QGxpbmsgI3NldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvcil9LgorICogCisgKiBAc2luY2UgMy42CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU5hbWVFbnZpcm9ubWVudFdpdGhQcm9ncmVzcyBleHRlbmRzIElOYW1lRW52aXJvbm1lbnQgeworCQorCS8qKgorCSAqIFNldCB0aGUgbW9uaXRvciBmb3IgdGhlIGdpdmVuIG5hbWUgZW52aXJvbm1lbnQuIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2FuY2VsIHRoaXMgbmFtZSBlbnZpcm9ubWVudCBjYWxscywKKwkgKiBhIG5vbi1udWxsIG1vbml0b3Igc2hvdWxkIGJlIGdpdmVuLiAKKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gbW9uaXRvcgorCSAqLworCXZvaWQgc2V0TW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0Q29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQppbmRleCA0N2E5MGFhLi5jMWNmMDAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxMiArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lbWVudG9Ub2tlbml6ZXI7CiAKIC8qKgpAQCAtNjksNiArNjMsOSBAQAogCWlmIChpc09uRGVtYW5kKQogCQkvLyBtYWtlIHN1cmUgdG8gY29weSB0aGUgc3RyaW5nIChzbyB0aGF0IGl0IGRvZXNuJ3QgaG9sZCBvbiB0aGUgdW5kZXJseWluZyBjaGFyW10gdGhhdCBtaWdodCBiZSBtdWNoIGJpZ2dlciB0aGFuIG5lY2Vzc2FyeSkKIAkJaW1wb3J0TmFtZSA9IG5ldyBTdHJpbmcoaW1wb3J0TmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKwlyZXR1cm4gZ2V0SW1wb3J0KGltcG9ydE5hbWUsIGlzT25EZW1hbmQpOworfQorcHJvdGVjdGVkIElJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gaXNPbkRlbWFuZCkgewogCXJldHVybiBuZXcgSW1wb3J0RGVjbGFyYXRpb24odGhpcywgaW1wb3J0TmFtZSwgaXNPbkRlbWFuZCk7CiB9CiAvKgpAQCAtMTExLDEwICsxMDgsMTMgQEAKICAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKICAqLwogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvLCBib29sZWFuIHNob3dSZXNvbHZlZEluZm8pIHsKLQlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwogCWJ1ZmZlci5hcHBlbmQoIjxpbXBvcnQgY29udGFpbmVyPiIpOyAvLyROT04tTkxTLTEkCiAJaWYgKGluZm8gPT0gbnVsbCkgewogCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCiAJfQogfQorcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB7CisJcmV0dXJuIG51bGw7Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXJJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXJJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydENvbnRhaW5lckluZm8uamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworCitwdWJsaWMgY2xhc3MgSW1wb3J0Q29udGFpbmVySW5mbyBleHRlbmRzIEphdmFFbGVtZW50SW5mbyB7CisKKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKKworCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKKwkJcmV0dXJuIHRoaXMuY2hpbGRyZW47CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YQppbmRleCBlMmUwMDAzLi5jODViZjEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsNyArMjIsNyBAQAogCiAJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwogCXByb3RlY3RlZCBib29sZWFuIGlzT25EZW1hbmQ7Ci0JCisKIC8qKgogICogQ29uc3RydWN0cyBhbiBJbXBvcnREZWNsYXJhdGlvbiBpbiB0aGUgZ2l2ZW4gaW1wb3J0IGNvbnRhaW5lcgogICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KQEAgLTc3LDYgKzc3LDEwIEBACiAJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlNob3VsZCBub3QgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gMDsKIH0KK3B1YmxpYyBJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSW1wb3J0RGVjbGFyYXRpb25FbGVtZW50SW5mbyBpbmZvID0gKEltcG9ydERlY2xhcmF0aW9uRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJcmV0dXJuIGluZm8uZ2V0TmFtZVJhbmdlKCk7Cit9CiAvKgogICogQHNlZSBKYXZhRWxlbWVudCNnZXRQcmltYXJ5RWxlbWVudChib29sZWFuKQogICovCkBAIC0xMDEsNyArMTA1LDcgQEAKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewotCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJYnVmZmVyLmFwcGVuZCgiaW1wb3J0ICIpOyAvLyROT04tTkxTLTEkCiAJdG9TdHJpbmdOYW1lKGJ1ZmZlcik7CiAJaWYgKGluZm8gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb25FbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb25FbGVtZW50SW5mby5qYXZhCmluZGV4IDExZDE3ODEuLjRhZTY4ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydERlY2xhcmF0aW9uRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbkVsZW1lbnRJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNiArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNvdXJjZVJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZUltcG9ydDsKIAogLyoqCkBAIC0xNyw2ICsxOSwzNSBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb24KICAqLwogcHVibGljIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uRWxlbWVudEluZm8gZXh0ZW5kcyBNZW1iZXJFbGVtZW50SW5mbyBpbXBsZW1lbnRzIElTb3VyY2VJbXBvcnR7Ci0JCi0JLy8gZW1wdHkgZWxlbWVudCBpbmZvCisKKwkvKioKKwkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24ncyBuYW1lIGluIHRoZSBpdHMKKwkgKiBvcGVuYWJsZSdzIGJ1ZmZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG5hbWVTdGFydD0gLTE7CisKKwkvKioKKwkgKiBUaGUgbGFzdCBwb3NpdGlvbiBvZiB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbidzIG5hbWUgaW4gdGhlIGl0cworCSAqIG9wZW5hYmxlJ3MgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCBpbnQgbmFtZUVuZD0gLTE7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uJ3MgbmFtZSwgcmVsYXRpdmUKKwkgKiB0byBpdHMgb3BlbmFibGUncyBzb3VyY2UgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldE5hbWVTb3VyY2VFbmQoaW50IGVuZCkgeworCQl0aGlzLm5hbWVFbmQ9IGVuZDsKKwl9CisJLyoqCisJICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24ncyBuYW1lLCByZWxhdGl2ZQorCSAqIHRvIGl0cyBvcGVuYWJsZSdzIHNvdXJjZSBidWZmZXIuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZVNvdXJjZVN0YXJ0KGludCBzdGFydCkgeworCQl0aGlzLm5hbWVTdGFydD0gc3RhcnQ7CisJfQorCisJcHJvdGVjdGVkIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB7CisJCXJldHVybiBuZXcgU291cmNlUmFuZ2UodGhpcy5uYW1lU3RhcnQsIHRoaXMubmFtZUVuZCAtIHRoaXMubmFtZVN0YXJ0ICsgMSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyLmphdmEKaW5kZXggZWUxOTUzYS4uMzQ2YmIwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0LDcgKzI0LDcgQEAKICAqIEBzZWUgSUluaXRpYWxpemVyCiAgKi8KIAotLyogcGFja2FnZSAqLyBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIE1lbWJlciBpbXBsZW1lbnRzIElJbml0aWFsaXplciB7CitwdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBNZW1iZXIgaW1wbGVtZW50cyBJSW5pdGlhbGl6ZXIgewogCiBwcm90ZWN0ZWQgSW5pdGlhbGl6ZXIoSmF2YUVsZW1lbnQgcGFyZW50LCBpbnQgY291bnQpIHsKIAlzdXBlcihwYXJlbnQpOwpAQCAtOTMsNyArOTMsNyBAQAogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKIAlpZiAoaW5mbyA9PSBudWxsKSB7CiAJCWJ1ZmZlci5hcHBlbmQoIjxpbml0aWFsaXplciAjIik7IC8vJE5PTi1OTFMtMSQKIAkJYnVmZmVyLmFwcGVuZCh0aGlzLm9jY3VycmVuY2VDb3VudCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAl9IGVsc2UgewogCQl0cnkgewogCQkJYnVmZmVyLmFwcGVuZCgiPCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoRmxhZ3MuaXNTdGF0aWModGhpcy5nZXRGbGFncygpKSkgeworCQkJaWYgKEZsYWdzLmlzU3RhdGljKGdldEZsYWdzKCkpKSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCWJ1ZmZlci5hcHBlbmQoImluaXRpYWxpemVyICMiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXJFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXJFbGVtZW50SW5mby5qYXZhCmluZGV4IDk4MTgzNDguLjgwZTdmNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplckVsZW1lbnRJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsOCArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCi0vKiogCi0gKiBFbGVtZW50IGluZm8gZm9yIElJbml0aWFsaXplciBlbGVtZW50cy4gCisvKioKKyAqIEVsZW1lbnQgaW5mbyBmb3IgSUluaXRpYWxpemVyIGVsZW1lbnRzLgogICovCiBwdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXJFbGVtZW50SW5mbyBleHRlbmRzIE1lbWJlckVsZW1lbnRJbmZvIHsKIAkvLyB1c2VkIG9ubHkgYXMgYSBtYXJrZXIgY2xhc3M6IGNvbnRhaW5zIG5vIG1ldGhvZHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyV2l0aENoaWxkcmVuSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXJXaXRoQ2hpbGRyZW5JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMjI0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyV2l0aENoaWxkcmVuSW5mby5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBJbml0aWFsaXplcldpdGhDaGlsZHJlbkluZm8gZXh0ZW5kcyBJbml0aWFsaXplckVsZW1lbnRJbmZvIHsKKworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbjsKKwkKKwlwdWJsaWMgSW5pdGlhbGl6ZXJXaXRoQ2hpbGRyZW5JbmZvKElKYXZhRWxlbWVudFtdIGNoaWxkcmVuKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwl9CisKKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7CisJCXJldHVybiB0aGlzLmNoaWxkcmVuOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5qYXZhCmluZGV4IGVhNmU0YTcuLmU5Y2UxYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ludGVybmFsTmFtaW5nQ29udmVudGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsOCArMTIsOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdE9wdGlvbnM7CkBAIC0yMSwyMzQgKzIxLDIzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldE9mQ2hhckFycmF5OwogCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIERFRkFVTFRfTkFNRSA9ICJuYW1lIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCisKIAlwcml2YXRlIHN0YXRpYyBTY2FubmVyIGdldE5hbWVTY2FubmVyKENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMpIHsKIAkJcmV0dXJuCiAJCQluZXcgU2Nhbm5lcigKLQkJCQlmYWxzZSAvKmNvbW1lbnQqLywgCi0JCQkJZmFsc2UgLyp3aGl0ZXNwYWNlKi8sIAotCQkJCWZhbHNlIC8qbmxzKi8sIAotCQkJCWNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCAvKnNvdXJjZUxldmVsKi8sIAotCQkJCW51bGwgLyp0YXNrVGFncyovLCAKKwkJCQlmYWxzZSAvKmNvbW1lbnQqLywKKwkJCQlmYWxzZSAvKndoaXRlc3BhY2UqLywKKwkJCQlmYWxzZSAvKm5scyovLAorCQkJCWNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCAvKnNvdXJjZUxldmVsKi8sCisJCQkJbnVsbCAvKnRhc2tUYWdzKi8sCiAJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLywKIAkJCQl0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKIAl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHN1Z2dlc3RBcmd1bWVudE5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIGNoYXJbXSBpbnRlcm5hbFByZWZpeCwgY2hhcltdW10gZXhjbHVkZWROYW1lcywgSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJTWFwIG9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOwotCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKTsKLQkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMob3B0aW9ucyk7CiAKLQkJc3VnZ2VzdE5hbWVzKAotCQkJcGFja2FnZU5hbWUsCi0JCQlxdWFsaWZpZWRUeXBlTmFtZSwKLQkJCWRpbSwKLQkJCWludGVybmFsUHJlZml4LAotCQkJYXNzaXN0T3B0aW9ucy5hcmd1bWVudFByZWZpeGVzLAotCQkJYXNzaXN0T3B0aW9ucy5hcmd1bWVudFN1ZmZpeGVzLAotCQkJZXhjbHVkZWROYW1lcywKLQkJCWdldE5hbWVTY2FubmVyKGNvbXBpbGVyT3B0aW9ucyksCi0JCQlyZXF1ZXN0b3IpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3VnZ2VzdEZpZWxkTmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgaW50IG1vZGlmaWVycywgY2hhcltdIGludGVybmFsUHJlZml4LCBjaGFyW11bXSBleGNsdWRlZE5hbWVzLCBJTmFtaW5nUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCQlib29sZWFuIGlzU3RhdGljID0gRmxhZ3MuaXNTdGF0aWMobW9kaWZpZXJzKTsKLQkJCi0JCU1hcCBvcHRpb25zID0gamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKLQkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMob3B0aW9ucyk7Ci0JCUFzc2lzdE9wdGlvbnMgYXNzaXN0T3B0aW9ucyA9IG5ldyBBc3Npc3RPcHRpb25zKG9wdGlvbnMpOwotCi0JCXN1Z2dlc3ROYW1lcygKLQkJCXBhY2thZ2VOYW1lLAotCQkJcXVhbGlmaWVkVHlwZU5hbWUsCi0JCQlkaW0sCi0JCQlpbnRlcm5hbFByZWZpeCwKLQkJCWlzU3RhdGljID8gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaWVsZFByZWZpeGVzIDogYXNzaXN0T3B0aW9ucy5maWVsZFByZWZpeGVzLAotCQkJaXNTdGF0aWMgPyBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpZWxkU3VmZml4ZXMgOiBhc3Npc3RPcHRpb25zLmZpZWxkU3VmZml4ZXMsCi0JCQlleGNsdWRlZE5hbWVzLAotCQkJZ2V0TmFtZVNjYW5uZXIoY29tcGlsZXJPcHRpb25zKSwKLQkJCXJlcXVlc3Rvcik7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdWdnZXN0TG9jYWxWYXJpYWJsZU5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIGNoYXJbXSBpbnRlcm5hbFByZWZpeCwgY2hhcltdW10gZXhjbHVkZWROYW1lcywgSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJTWFwIG9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOwotCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKTsKLQkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMob3B0aW9ucyk7Ci0KLQkJc3VnZ2VzdE5hbWVzKAotCQkJcGFja2FnZU5hbWUsCi0JCQlxdWFsaWZpZWRUeXBlTmFtZSwKLQkJCWRpbSwKLQkJCWludGVybmFsUHJlZml4LAotCQkJYXNzaXN0T3B0aW9ucy5sb2NhbFByZWZpeGVzLAotCQkJYXNzaXN0T3B0aW9ucy5sb2NhbFN1ZmZpeGVzLAotCQkJZXhjbHVkZWROYW1lcywKLQkJCWdldE5hbWVTY2FubmVyKGNvbXBpbGVyT3B0aW9ucyksCi0JCQlyZXF1ZXN0b3IpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN1Z2dlc3ROYW1lcygKLQkJY2hhcltdIHBhY2thZ2VOYW1lLAotCQljaGFyW10gcXVhbGlmaWVkVHlwZU5hbWUsCi0JCWludCBkaW0sCi0JCWNoYXJbXSBpbnRlcm5hbFByZWZpeCwKLQkJY2hhcltdW10gcHJlZml4ZXMsCi0JCWNoYXJbXVtdIHN1ZmZpeGVzLAotCQljaGFyW11bXSBleGNsdWRlZE5hbWVzLAotCQlTY2FubmVyIG5hbWVTY2FubmVyLAotCQlJTmFtaW5nUmVxdWVzdG9yIHJlcXVlc3Rvcil7Ci0JCQotCQlpZihxdWFsaWZpZWRUeXBlTmFtZSA9PSBudWxsIHx8IHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYoaW50ZXJuYWxQcmVmaXggPT0gbnVsbCkgewotCQkJaW50ZXJuYWxQcmVmaXggPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCX0gZWxzZSB7Ci0JCQlpbnRlcm5hbFByZWZpeCA9IHJlbW92ZVByZWZpeChpbnRlcm5hbFByZWZpeCwgcHJlZml4ZXMpOwotCQl9Ci0JCQotCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHF1YWxpZmllZFR5cGVOYW1lLCAnLicpOwotCQotCQlpZihwcmVmaXhlcyA9PSBudWxsIHx8IHByZWZpeGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwcmVmaXhlcyA9IG5ldyBjaGFyWzFdWzBdOwotCQl9IGVsc2UgewotCQkJaW50IGxlbmd0aCA9IHByZWZpeGVzLmxlbmd0aDsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJlZml4ZXMsIDAsIHByZWZpeGVzID0gbmV3IGNoYXJbbGVuZ3RoKzFdW10sIDAsIGxlbmd0aCk7Ci0JCQlwcmVmaXhlc1tsZW5ndGhdID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCQl9Ci0JCi0JCWlmKHN1ZmZpeGVzID09IG51bGwgfHwgc3VmZml4ZXMubGVuZ3RoID09IDApIHsKLQkJCXN1ZmZpeGVzID0gbmV3IGNoYXJbMV1bMF07Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gc3VmZml4ZXMubGVuZ3RoOwotCQkJU3lzdGVtLmFycmF5Y29weShzdWZmaXhlcywgMCwgc3VmZml4ZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXSwgMCwgbGVuZ3RoKTsKLQkJCXN1ZmZpeGVzW2xlbmd0aF0gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7Ci0JCX0KLQkKLQkJY2hhcltdW10gdGVtcE5hbWVzID0gbnVsbDsKLQkKLQkJLy8gY29tcHV0ZSB2YXJpYWJsZSBuYW1lIGZvciBiYXNlIHR5cGUKLQkJdHJ5ewotCQkJbmFtZVNjYW5uZXIuc2V0U291cmNlKHR5cGVOYW1lKTsKLQkJCXN3aXRjaCAobmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludCA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVieXRlIDoKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXNob3J0IDoKLQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXIgOgotCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbG9uZyA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdCA6Ci0JCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVkb3VibGUgOgotCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYm9vbGVhbiA6Ci0JCQkJCQotCQkJCQlpZiAoaW50ZXJuYWxQcmVmaXggIT0gbnVsbCAmJiBpbnRlcm5hbFByZWZpeC5sZW5ndGggPiAwKSByZXR1cm47Ci0JCQkJCQotCQkJCQljaGFyW10gbmFtZSA9IGNvbXB1dGVCYXNlVHlwZU5hbWVzKHR5cGVOYW1lWzBdLCBleGNsdWRlZE5hbWVzKTsKLQkJCQkJaWYobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wTmFtZXMgPSAgbmV3IGNoYXJbXVtde25hbWV9OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQkKLQkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCS8vIGNvbXB1dGUgdmFyaWFibGUgbmFtZSBmb3Igbm9uIGJhc2UgdHlwZQotCQlpZih0ZW1wTmFtZXMgPT0gbnVsbCkgewotCQkJdGVtcE5hbWVzID0gY29tcHV0ZU5hbWVzKHR5cGVOYW1lKTsKLQkJfQotCQotCQlib29sZWFuIGFjY2VwdERlZmF1bHROYW1lID0gdHJ1ZTsKLQkJCi0JCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJY2hhcltdIHRlbXBOYW1lID0gdGVtcE5hbWVzW2ldOwotCQkJaWYoZGltID4gMCkgewotCQkJCWludCBsZW5ndGggPSB0ZW1wTmFtZS5sZW5ndGg7Ci0JCQkJaWYgKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAncycpewotCQkJCQlpZih0ZW1wTmFtZS5sZW5ndGggPiAxICYmIHRlbXBOYW1lW2xlbmd0aC0yXSA9PSAncycpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcE5hbWUsIDAsIHRlbXBOYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMl0sIDAsIGxlbmd0aCk7Ci0JCQkJCQl0ZW1wTmFtZVtsZW5ndGhdID0gJ2UnOwotCQkJCQkJdGVtcE5hbWVbbGVuZ3RoKzFdID0gJ3MnOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAneScpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAyXSwgMCwgbGVuZ3RoKTsKLQkJCQkJdGVtcE5hbWVbbGVuZ3RoLTFdID0gJ2knOwotCQkJCQl0ZW1wTmFtZVtsZW5ndGhdID0gJ2UnOwotCQkJCQl0ZW1wTmFtZVtsZW5ndGgrMV0gPSAncyc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKLQkJCQkJdGVtcE5hbWVbbGVuZ3RoXSA9ICdzJzsKLQkJCQl9Ci0JCQl9Ci0JCQotCQkJY2hhcltdIHVucHJlZml4ZWROYW1lID0gdGVtcE5hbWU7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8PSBpbnRlcm5hbFByZWZpeC5sZW5ndGg7IGorKykgewotCQkJCWlmKGogPT0gaW50ZXJuYWxQcmVmaXgubGVuZ3RoIHx8IENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW50ZXJuYWxQcmVmaXgsIGosIC0xKSwgdW5wcmVmaXhlZE5hbWUsIGZhbHNlKSkgewotCQkJCQl0ZW1wTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW50ZXJuYWxQcmVmaXgsIDAsIGopLCB1bnByZWZpeGVkTmFtZSk7Ci0JCQkJCWlmKGogIT0gMCkgdGVtcE5hbWVbal0gPSBTY2FubmVySGVscGVyLnRvVXBwZXJDYXNlKHRlbXBOYW1lW2pdKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwcmVmaXhlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJaWYocHJlZml4ZXNba10ubGVuZ3RoID4gMAotCQkJCQkJCSYmIFNjYW5uZXJIZWxwZXIuaXNMZXR0ZXJPckRpZ2l0KHByZWZpeGVzW2tdW3ByZWZpeGVzW2tdLmxlbmd0aCAtIDFdKSkgewotCQkJCQkJCXRlbXBOYW1lWzBdID0gU2Nhbm5lckhlbHBlci50b1VwcGVyQ2FzZSh0ZW1wTmFtZVswXSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRlbXBOYW1lWzBdID0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZSh0ZW1wTmFtZVswXSk7Ci0JCQkJCQl9Ci0JCQkJCQljaGFyW10gcHJlZml4TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeGVzW2tdLCB0ZW1wTmFtZSk7Ci0JCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHN1ZmZpeGVzLmxlbmd0aDsgbCsrKSB7Ci0JCQkJCQkJY2hhcltdIHN1ZmZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXhOYW1lLCBzdWZmaXhlc1tsXSk7Ci0JCQkJCQkJc3VmZml4TmFtZSA9Ci0JCQkJCQkJCWV4Y2x1ZGVOYW1lcygKLQkJCQkJCQkJCXN1ZmZpeE5hbWUsCi0JCQkJCQkJCQlwcmVmaXhOYW1lLAotCQkJCQkJCQkJc3VmZml4ZXNbbF0sCi0JCQkJCQkJCQlleGNsdWRlZE5hbWVzKTsKLQkJCQkJCQl0cnl7Ci0JCQkJCQkJCW5hbWVTY2FubmVyLnNldFNvdXJjZShzdWZmaXhOYW1lKTsKLQkJCQkJCQkJc3dpdGNoIChuYW1lU2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgewotCQkJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyIDoKLQkJCQkJCQkJCQlpbnQgdG9rZW4gPSBuYW1lU2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GICYmIG5hbWVTY2FubmVyLnN0YXJ0UG9zaXRpb24gPT0gc3VmZml4TmFtZS5sZW5ndGgpIHsKLQkJCQkJCQkJCQkJYWNjZXB0TmFtZShzdWZmaXhOYW1lLCBwcmVmaXhlc1trXSwgc3VmZml4ZXNbbF0sICBrID09IDAsIGwgPT0gMCwgaW50ZXJuYWxQcmVmaXgubGVuZ3RoIC0gaiwgcmVxdWVzdG9yKTsKLQkJCQkJCQkJCQkJYWNjZXB0RGVmYXVsdE5hbWUgPSBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJCXN1ZmZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKLQkJCQkJCQkJCQkJcHJlZml4TmFtZSwKLQkJCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoMSkudG9DaGFyQXJyYXkoKSwKLQkJCQkJCQkJCQkJc3VmZml4ZXNbbF0KLQkJCQkJCQkJCQkpOwotCQkJCQkJCQkJCXN1ZmZpeE5hbWUgPQotCQkJCQkJCQkJCQlleGNsdWRlTmFtZXMoCi0JCQkJCQkJCQkJCQlzdWZmaXhOYW1lLAotCQkJCQkJCQkJCQkJcHJlZml4TmFtZSwKLQkJCQkJCQkJCQkJCXN1ZmZpeGVzW2xdLAotCQkJCQkJCQkJCQkJZXhjbHVkZWROYW1lcyk7Ci0JCQkJCQkJCQkJbmFtZVNjYW5uZXIuc2V0U291cmNlKHN1ZmZpeE5hbWUpOwotCQkJCQkJCQkJCXN3aXRjaCAobmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKLQkJCQkJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyIDoKLQkJCQkJCQkJCQkJCXRva2VuID0gbmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQkJCQkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GICYmIG5hbWVTY2FubmVyLnN0YXJ0UG9zaXRpb24gPT0gc3VmZml4TmFtZS5sZW5ndGgpIHsKLQkJCQkJCQkJCQkJCQlhY2NlcHROYW1lKHN1ZmZpeE5hbWUsIHByZWZpeGVzW2tdLCBzdWZmaXhlc1tsXSwgayA9PSAwLCBsID09IDAsIGludGVybmFsUHJlZml4Lmxlbmd0aCAtIGosIHJlcXVlc3Rvcik7Ci0JCQkJCQkJCQkJCQkJYWNjZXB0RGVmYXVsdE5hbWUgPSBmYWxzZTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIG5vIG5hbWVzIHdlcmUgZm91bmQKLQkJaWYoYWNjZXB0RGVmYXVsdE5hbWUpIHsKLQkJCWNoYXJbXSBuYW1lID0gZXhjbHVkZU5hbWVzKERFRkFVTFRfTkFNRSwgREVGQVVMVF9OQU1FLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIGV4Y2x1ZGVkTmFtZXMpOwotCQkJcmVxdWVzdG9yLmFjY2VwdE5hbWVXaXRob3V0UHJlZml4QW5kU3VmZml4KG5hbWUsIDApOwotCQl9Ci0JfQotCQogCXByaXZhdGUgc3RhdGljIHZvaWQgYWNjZXB0TmFtZSgKIAkJY2hhcltdIG5hbWUsCiAJCWNoYXJbXSBwcmVmaXgsCkBAIC0yNjcsMTAgKzU2LDIzIEBACiAJCQlyZXF1ZXN0b3IuYWNjZXB0TmFtZVdpdGhvdXRQcmVmaXhBbmRTdWZmaXgobmFtZSwgcmV1c2VkQ2hhcmFjdGVycyk7CiAJCX0KIAl9Ci0JCisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBjb21wdXRlQmFzZVR5cGVOYW1lcyhjaGFyW10gdHlwZU5hbWUsIGJvb2xlYW4gaXNDb25zdGFudEZpZWxkLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKXsKKwkJaWYgKGlzQ29uc3RhbnRGaWVsZCkgeworCQkJcmV0dXJuIGNvbXB1dGVOb25CYXNlVHlwZU5hbWVzKHR5cGVOYW1lLCBpc0NvbnN0YW50RmllbGQsIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXSBuYW1lID0gY29tcHV0ZUJhc2VUeXBlTmFtZXModHlwZU5hbWVbMF0sIGV4Y2x1ZGVkTmFtZXMpOworCQkJaWYobmFtZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBjaGFyW11bXXtuYW1lfTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gY29tcHV0ZSB2YXJpYWJsZSBuYW1lIGxpa2UgZnJvbSBub24gYmFzZSB0eXBlCisJCQkJcmV0dXJuIGNvbXB1dGVOb25CYXNlVHlwZU5hbWVzKHR5cGVOYW1lLCBpc0NvbnN0YW50RmllbGQsIGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KIAlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29tcHV0ZUJhc2VUeXBlTmFtZXMoY2hhciBmaXJzdE5hbWUsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpewogCQljaGFyW10gbmFtZSA9IG5ldyBjaGFyW117Zmlyc3ROYW1lfTsKLQkJCisKIAkJZm9yKGludCBpID0gMCA7IGkgPCBleGNsdWRlZE5hbWVzLmxlbmd0aCA7IGkrKyl7CiAJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhuYW1lLCBleGNsdWRlZE5hbWVzW2ldLCBmYWxzZSkpIHsKIAkJCQluYW1lWzBdKys7CkBAIC0yNzksMzkgKzgxLDEyOCBAQAogCQkJCWlmKG5hbWVbMF0gPT0gZmlyc3ROYW1lKQogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQlpID0gMDsKLQkJCX0JCisJCQl9CiAJCX0KLQkJCisKIAkJcmV0dXJuIG5hbWU7CiAJfQotCQotCXByaXZhdGUgc3RhdGljIGNoYXJbXVtdIGNvbXB1dGVOYW1lcyhjaGFyW10gc291cmNlTmFtZSl7Ci0JCWNoYXJbXVtdIG5hbWVzID0gbmV3IGNoYXJbNV1bXTsKLQkJaW50IG5hbWVDb3VudCA9IDA7Ci0JCWJvb2xlYW4gcHJldmlvdXNJc1VwcGVyQ2FzZSA9IGZhbHNlOwotCQlib29sZWFuIHByZXZpb3VzSXNMZXR0ZXIgPSB0cnVlOwotCQlmb3IoaW50IGkgPSBzb3VyY2VOYW1lLmxlbmd0aCAtIDEgOyBpID49IDAgOyBpLS0pewotCQkJYm9vbGVhbiBpc1VwcGVyQ2FzZSA9IFNjYW5uZXJIZWxwZXIuaXNVcHBlckNhc2Uoc291cmNlTmFtZVtpXSk7Ci0JCQlib29sZWFuIGlzTGV0dGVyID0gU2Nhbm5lckhlbHBlci5pc0xldHRlcihzb3VyY2VOYW1lW2ldKTsKLQkJCWlmKGlzVXBwZXJDYXNlICYmICFwcmV2aW91c0lzVXBwZXJDYXNlICYmIHByZXZpb3VzSXNMZXR0ZXIpewotCQkJCWNoYXJbXSBuYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzb3VyY2VOYW1lLGksc291cmNlTmFtZS5sZW5ndGgpOwotCQkJCWlmKG5hbWUubGVuZ3RoID4gMSl7Ci0JCQkJCWlmKG5hbWVDb3VudCA9PSBuYW1lcy5sZW5ndGgpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIG5hbWVzID0gbmV3IGNoYXJbbmFtZUNvdW50ICogMl1bXSwgMCwgbmFtZUNvdW50KTsKLQkJCQkJfQotCQkJCQluYW1lWzBdID0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShuYW1lWzBdKTsKLQkJCQkJbmFtZXNbbmFtZUNvdW50KytdID0gbmFtZTsKLQkJCQl9CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBjb21wdXRlTm9uQmFzZVR5cGVOYW1lcyhjaGFyW10gc291cmNlTmFtZSwgYm9vbGVhbiBpc0NvbnN0YW50RmllbGQsIGJvb2xlYW4gb25seUxvbmdlc3QpeworCQlpbnQgbGVuZ3RoID0gc291cmNlTmFtZS5sZW5ndGg7CisJCQorCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKwkJfQorCQkKKwkJaWYgKGxlbmd0aCA9PSAxKSB7CisJCQlpZiAoaXNDb25zdGFudEZpZWxkKSB7CisJCQkJcmV0dXJuIGdlbmVyYXRlQ29uc3RhbnROYW1lKG5ldyBjaGFyW11bXXtDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNvdXJjZU5hbWUpfSwgMCwgb25seUxvbmdlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gZ2VuZXJhdGVOb25Db25zdGFudE5hbWUobmV3IGNoYXJbXVtde0NoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc291cmNlTmFtZSl9LCAwLCBvbmx5TG9uZ2VzdCk7CiAJCQl9Ci0JCQlwcmV2aW91c0lzVXBwZXJDYXNlID0gaXNVcHBlckNhc2U7Ci0JCQlwcmV2aW91c0lzTGV0dGVyID0gaXNMZXR0ZXI7CiAJCX0KLQkJaWYobmFtZUNvdW50ID09IDApewotCQkJbmFtZXNbbmFtZUNvdW50KytdID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzb3VyY2VOYW1lKTsJCQkJCisJCQorCQljaGFyW11bXSBuYW1lUGFydHMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCWludCBuYW1lUGFydHNQdHIgPSAtMTsKKwkJCisJCWludCBlbmRJbmRleCA9IGxlbmd0aDsKKwkJY2hhciBjID0gc291cmNlTmFtZVtsZW5ndGggLSAxXTsKKwkJCisJCWZpbmFsIGludCBJU19MT1dFUl9DQVNFID0gMTsKKwkJZmluYWwgaW50IElTX1VQUEVSX0NBU0UgPSAyOworCQlmaW5hbCBpbnQgSVNfVU5ERVJTQ09SRSA9IDM7CisJCWZpbmFsIGludCBJU19PVEhFUiA9IDQ7CisJCQorCQlpbnQgcHJldmlvdXNDaGFyS2luZCA9CisJCQlTY2FubmVySGVscGVyLmlzTG93ZXJDYXNlKGMpID8gSVNfTE9XRVJfQ0FTRSA6CisJCQkJU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShjKSA/IElTX1VQUEVSX0NBU0UgOgorCQkJCQljID09ICdfJyA/IElTX1VOREVSU0NPUkUgOiBJU19PVEhFUjsKKwkJCisJCWZvcihpbnQgaSA9IGxlbmd0aCAtIDEgOyBpID49IDAgOyBpLS0peworCQkJYyA9IHNvdXJjZU5hbWVbaV07CisJCQkKKwkJCWludCBjaGFyS2luZCA9CisJCQkJU2Nhbm5lckhlbHBlci5pc0xvd2VyQ2FzZShjKSA/IElTX0xPV0VSX0NBU0UgOgorCQkJCQlTY2FubmVySGVscGVyLmlzVXBwZXJDYXNlKGMpID8gSVNfVVBQRVJfQ0FTRSA6CisJCQkJCQljID09ICdfJyA/IElTX1VOREVSU0NPUkUgOiBJU19PVEhFUjsKKwkJCQorCQkJc3dpdGNoIChjaGFyS2luZCkgeworCQkJCWNhc2UgSVNfTE9XRVJfQ0FTRToKKwkJCQkJaWYgKHByZXZpb3VzQ2hhcktpbmQgPT0gSVNfVVBQRVJfQ0FTRSkgeworCQkJCQkJbmFtZVBhcnRzWysrbmFtZVBhcnRzUHRyXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSwgaSArIDEsIGVuZEluZGV4KTsKKwkJCQkJCWVuZEluZGV4ID0gaSArIDE7CisJCQkJCX0KKwkJCQkJcHJldmlvdXNDaGFyS2luZCA9IElTX0xPV0VSX0NBU0U7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVNfVVBQRVJfQ0FTRToKKwkJCQkJaWYgKHByZXZpb3VzQ2hhcktpbmQgPT0gSVNfTE9XRVJfQ0FTRSkgeworCQkJCQkJbmFtZVBhcnRzWysrbmFtZVBhcnRzUHRyXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSwgaSwgZW5kSW5kZXgpOworCQkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQkJY2hhciBwYyA9IHNvdXJjZU5hbWVbaSAtIDFdOworCQkJCQkJCXByZXZpb3VzQ2hhcktpbmQgPQorCQkJCQkJCQlTY2FubmVySGVscGVyLmlzTG93ZXJDYXNlKHBjKSA/IElTX0xPV0VSX0NBU0UgOgorCQkJCQkJCQkJU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShwYykgPyBJU19VUFBFUl9DQVNFIDoKKwkJCQkJCQkJCQlwYyA9PSAnXycgPyBJU19VTkRFUlNDT1JFIDogSVNfT1RIRVI7CisJCQkJCQl9CisJCQkJCQllbmRJbmRleCA9IGk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmV2aW91c0NoYXJLaW5kID0gSVNfVVBQRVJfQ0FTRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIElTX1VOREVSU0NPUkU6CisJCQkJCXN3aXRjaCAocHJldmlvdXNDaGFyS2luZCkgeworCQkJCQkJY2FzZSBJU19VTkRFUlNDT1JFOgorCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODM1MzkKKwkJCQkJCQkvLyBQcm9jZXNzIGNvbnNlY3V0aXZlIHVuZGVyc2NvcmVzIG9ubHkgZm9yIGNvbnN0YW50IHR5cGVzIAorCQkJCQkJCWlmIChpc0NvbnN0YW50RmllbGQpIHsKKwkJCQkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQkJCQljaGFyIHBjID0gc291cmNlTmFtZVtpIC0gMV07CisJCQkJCQkJCQlwcmV2aW91c0NoYXJLaW5kID0KKwkJCQkJCQkJCQlTY2FubmVySGVscGVyLmlzTG93ZXJDYXNlKHBjKSA/IElTX0xPV0VSX0NBU0UgOgorCQkJCQkJCQkJCQlTY2FubmVySGVscGVyLmlzVXBwZXJDYXNlKHBjKSA/IElTX1VQUEVSX0NBU0UgOgorCQkJCQkJCQkJCQkJcGMgPT0gJ18nID8gSVNfVU5ERVJTQ09SRSA6IElTX09USEVSOworCQkJCQkJCQl9CisJCQkJCQkJCWVuZEluZGV4ID0gaTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElTX0xPV0VSX0NBU0U6CisJCQkJCQljYXNlIElTX1VQUEVSX0NBU0U6CisJCQkJCQkJbmFtZVBhcnRzWysrbmFtZVBhcnRzUHRyXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSwgaSArIDEsIGVuZEluZGV4KTsKKwkJCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCQkJY2hhciBwYyA9IHNvdXJjZU5hbWVbaSAtIDFdOworCQkJCQkJCQlwcmV2aW91c0NoYXJLaW5kID0KKwkJCQkJCQkJCVNjYW5uZXJIZWxwZXIuaXNMb3dlckNhc2UocGMpID8gSVNfTE9XRVJfQ0FTRSA6CisJCQkJCQkJCQkJU2Nhbm5lckhlbHBlci5pc1VwcGVyQ2FzZShwYykgPyBJU19VUFBFUl9DQVNFIDoKKwkJCQkJCQkJCQkJcGMgPT0gJ18nID8gSVNfVU5ERVJTQ09SRSA6IElTX09USEVSOworCQkJCQkJCX0KKwkJCQkJCQkvLyBJbmNsdWRlIHRoZSAnXycgYWxzby4gRS5nLiBNeV93b3JkIC0+ICJNeV8iIGFuZCAid29yZCIuCisJCQkJCQkJZW5kSW5kZXggPSBpKzE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXByZXZpb3VzQ2hhcktpbmQgPSBJU19VTkRFUlNDT1JFOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXByZXZpb3VzQ2hhcktpbmQgPSBJU19PVEhFUjsKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQkJU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgbmFtZXMgPSBuZXcgY2hhcltuYW1lQ291bnRdW10sIDAsIG5hbWVDb3VudCk7Ci0JCXJldHVybiBuYW1lczsKKwkJaWYgKGVuZEluZGV4ID4gMCkgeworCQkJbmFtZVBhcnRzWysrbmFtZVBhcnRzUHRyXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSwgMCwgZW5kSW5kZXgpOworCQl9CisJCWlmIChuYW1lUGFydHNQdHIgPT0gLTEpIHsKKwkJCXJldHVybiBuZXcgY2hhcltdW10geyBzb3VyY2VOYW1lIH07CisJCX0KKwkJCisJCWlmIChpc0NvbnN0YW50RmllbGQpIHsKKwkJCXJldHVybiBnZW5lcmF0ZUNvbnN0YW50TmFtZShuYW1lUGFydHMsIG5hbWVQYXJ0c1B0ciwgb25seUxvbmdlc3QpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGdlbmVyYXRlTm9uQ29uc3RhbnROYW1lKG5hbWVQYXJ0cywgbmFtZVBhcnRzUHRyLCBvbmx5TG9uZ2VzdCk7CisJCX0KIAl9CisJCisJCiAKIAlwcml2YXRlIHN0YXRpYyBjaGFyW10gZXhjbHVkZU5hbWVzKAogCQljaGFyW10gc3VmZml4TmFtZSwKQEAgLTMzNSw2ICsyMjYsMjMyIEBACiAJCXJldHVybiBzdWZmaXhOYW1lOwogCX0KIAkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBnZW5lcmF0ZU5vbkNvbnN0YW50TmFtZShjaGFyW11bXSBuYW1lUGFydHMsIGludCBuYW1lUGFydHNQdHIsIGJvb2xlYW4gb25seUxvbmdlc3QpIHsKKwkJY2hhcltdW10gbmFtZXM7CisJCWlmIChvbmx5TG9uZ2VzdCkgeworCQkJbmFtZXMgPSBuZXcgY2hhclsxXVtdOworCQl9IGVsc2UgeworCQkJbmFtZXMgPSBuZXcgY2hhcltuYW1lUGFydHNQdHIgKyAxXVtdOworCQl9CisJCQorCQljaGFyW10gbmFtZVBhcnQgPSBuYW1lUGFydHNbMF07CisJCQorCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UobmFtZVBhcnQpOworCQkKKwkJaWYgKCFvbmx5TG9uZ2VzdCkgeworCQkJbmFtZXNbbmFtZVBhcnRzUHRyXSA9IG5hbWU7CisJCX0KKwkJCisJCWNoYXJbXSBuYW1lU3VmZml4ID0gbmFtZVBhcnQ7CisJCQorCQlmb3IgKGludCBpID0gMTsgaSA8PSBuYW1lUGFydHNQdHI7IGkrKykgeworCQkJbmFtZVBhcnQgPSBuYW1lUGFydHNbaV07CisJCQkKKwkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKG5hbWVQYXJ0KSwgbmFtZVN1ZmZpeCk7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzNTM5CisJCQkvLyBPbmx5IHRoZSBmaXJzdCB3b3JkIGlzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIGFuZCB0aGUgcmVzdCBvZiB0aGVtIGFyZSBub3QgY2hhbmdlZCBmb3Igbm9uLWNvbnN0YW50cworCQkJCisJCQlpZiAoIW9ubHlMb25nZXN0KSB7CisJCQkJbmFtZXNbbmFtZVBhcnRzUHRyIC0gaV0gPSBuYW1lOworCQkJfQorCQkJCisJCQluYW1lU3VmZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZVBhcnQsIG5hbWVTdWZmaXgpOworCQl9CisJCWlmIChvbmx5TG9uZ2VzdCkgeworCQkJbmFtZXNbMF0gPSBuYW1lOworCQl9CisJCXJldHVybiBuYW1lczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBnZW5lcmF0ZUNvbnN0YW50TmFtZShjaGFyW11bXSBuYW1lUGFydHMsIGludCBuYW1lUGFydHNQdHIsIGJvb2xlYW4gb25seUxvbmdlc3QpIHsKKwkJY2hhcltdW10gbmFtZXM7CisJCWlmIChvbmx5TG9uZ2VzdCkgeworCQkJbmFtZXMgPSBuZXcgY2hhclsxXVtdOworCQl9IGVsc2UgeworCQkJbmFtZXMgPSBuZXcgY2hhcltuYW1lUGFydHNQdHIgKyAxXVtdOworCQl9CisJCQorCQljaGFyW10gbmFtZVBhcnQgPSBDaGFyT3BlcmF0aW9uLnRvVXBwZXJDYXNlKG5hbWVQYXJ0c1swXSk7CisJCWludCBuYW1lUGFydExlbmd0aCA9IG5hbWVQYXJ0Lmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShuYW1lUGFydCwgMCwgbmFtZVBhcnQsIDAsIG5hbWVQYXJ0TGVuZ3RoKTsKKwkJCisJCWNoYXJbXSBuYW1lID0gbmFtZVBhcnQ7CisJCQorCQlpZiAoIW9ubHlMb25nZXN0KSB7CisJCQluYW1lc1tuYW1lUGFydHNQdHJdID0gbmFtZTsKKwkJfQorCQkKKwkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbmFtZVBhcnRzUHRyOyBpKyspIHsKKwkJCW5hbWVQYXJ0ID0gQ2hhck9wZXJhdGlvbi50b1VwcGVyQ2FzZShuYW1lUGFydHNbaV0pOworCQkJbmFtZVBhcnRMZW5ndGggPSBuYW1lUGFydC5sZW5ndGg7CisJCQlpZiAobmFtZVBhcnRbbmFtZVBhcnRMZW5ndGggLSAxXSAhPSAnXycpIHsKKwkJCQluYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZVBhcnQsIG5hbWUsICdfJyk7CisJCQl9IGVsc2UgeworCQkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lUGFydCwgbmFtZSk7CisJCQl9CisJCQkKKwkJCWlmICghb25seUxvbmdlc3QpIHsKKwkJCQluYW1lc1tuYW1lUGFydHNQdHIgLSBpXSA9IG5hbWU7CisJCQl9CisJCX0KKwkJaWYgKG9ubHlMb25nZXN0KSB7CisJCQluYW1lc1swXSA9IG5hbWU7CisJCX0KKwkJcmV0dXJuIG5hbWVzOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRCYXNlTmFtZSgKKwkJCWludCB2YXJpYWJsZUtpbmQsCisJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsCisJCQljaGFyW10gbmFtZSwKKwkJCWJvb2xlYW4gdXBkYXRlRmlyc3RDaGFyYWN0ZXIpIHsKKwkJCisJCUFzc2lzdE9wdGlvbnMgYXNzaXN0T3B0aW9uczsKKwkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCWFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpOworCQl9CisJCQorCQljaGFyW11bXSBwcmVmaXhlcyA9IG51bGw7CisJCWNoYXJbXVtdIHN1ZmZpeGVzID0gbnVsbDsKKwkJc3dpdGNoICh2YXJpYWJsZUtpbmQpIHsKKwkJCWNhc2UgVktfSU5TVEFOQ0VfRklFTEQ6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLmZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLmZpZWxkU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1NUQVRJQ19GSUVMRDoKKwkJCQlwcmVmaXhlcyA9IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRQcmVmaXhlczsKKwkJCQlzdWZmaXhlcyA9IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVktfU1RBVElDX0ZJTkFMX0ZJRUxEOgorCQkJCXByZWZpeGVzID0gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVktfTE9DQUw6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1BBUkFNRVRFUjoKKwkJCQlwcmVmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRQcmVmaXhlczsKKwkJCQlzdWZmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJfQorCQkKKwkJCisJCXJldHVybiBnZXRCYXNlTmFtZShuYW1lLCBwcmVmaXhlcywgc3VmZml4ZXMsIHZhcmlhYmxlS2luZCA9PSBWS19TVEFUSUNfRklOQUxfRklFTEQsIHVwZGF0ZUZpcnN0Q2hhcmFjdGVyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gZ2V0QmFzZU5hbWUoY2hhcltdIG5hbWUsIGNoYXJbXVtdIHByZWZpeGVzLCBjaGFyW11bXSBzdWZmaXhlcywgYm9vbGVhbiBpc0NvbnN0YW50LCBib29sZWFuIHVwZGF0ZUZpcnN0Q2hhcmFjdGVyKSB7CisJCWNoYXJbXSBuYW1lV2l0aG91dFByZWZpeEFuZFNpZmZpeCA9IHJlbW92ZVZhcmlhYmxlUHJlZml4QW5kU3VmZml4KG5hbWUsIHByZWZpeGVzLCBzdWZmaXhlcywgdXBkYXRlRmlyc3RDaGFyYWN0ZXIpOworCQkKKwkJY2hhcltdIGJhc2VOYW1lOworCQlpZiAoaXNDb25zdGFudCkgeworCQkJaW50IGxlbmd0aCA9IG5hbWVXaXRob3V0UHJlZml4QW5kU2lmZml4Lmxlbmd0aDsKKwkJCWJhc2VOYW1lID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkJCWludCBiYXNlTmFtZVB0ciA9IC0xOworCQkJCisJCQlib29sZWFuIHByZXZpb3VzSXNVbmRlcnNjb3JlID0gZmFsc2U7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJY2hhciBjID0gbmFtZVdpdGhvdXRQcmVmaXhBbmRTaWZmaXhbaV07CisJCQkJaWYgKGMgIT0gJ18nKSB7CisJCQkJCWlmIChwcmV2aW91c0lzVW5kZXJzY29yZSkgeworCQkJCQkJYmFzZU5hbWVbKytiYXNlTmFtZVB0cl0gPSBTY2FubmVySGVscGVyLnRvVXBwZXJDYXNlKGMpOworCQkJCQkJcHJldmlvdXNJc1VuZGVyc2NvcmUgPSBmYWxzZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJhc2VOYW1lWysrYmFzZU5hbWVQdHJdID0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShjKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXByZXZpb3VzSXNVbmRlcnNjb3JlID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlTeXN0ZW0uYXJyYXljb3B5KGJhc2VOYW1lLCAwLCBiYXNlTmFtZSA9IG5ldyBjaGFyW2Jhc2VOYW1lUHRyICsgMV0sIDAsIGJhc2VOYW1lUHRyICsgMSk7CisJCX0gZWxzZSB7CisJCQliYXNlTmFtZSA9IG5hbWVXaXRob3V0UHJlZml4QW5kU2lmZml4OworCQl9CisJCQorCQlyZXR1cm4gYmFzZU5hbWU7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZVZhcmlhYmxlUHJlZml4QW5kU3VmZml4KAorCQkJaW50IHZhcmlhYmxlS2luZCwKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCWNoYXJbXSBuYW1lKSB7CisJCUFzc2lzdE9wdGlvbnMgYXNzaXN0T3B0aW9uczsKKwkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCWFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpOworCQl9CisJCQorCQljaGFyW11bXSBwcmVmaXhlcyA9IG51bGw7CisJCWNoYXJbXVtdIHN1ZmZpeGVzID0gbnVsbDsKKwkJc3dpdGNoICh2YXJpYWJsZUtpbmQpIHsKKwkJCWNhc2UgVktfSU5TVEFOQ0VfRklFTEQ6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLmZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLmZpZWxkU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1NUQVRJQ19GSUVMRDoKKwkJCQlwcmVmaXhlcyA9IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRQcmVmaXhlczsKKwkJCQlzdWZmaXhlcyA9IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVktfU1RBVElDX0ZJTkFMX0ZJRUxEOgorCQkJCXByZWZpeGVzID0gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVktfTE9DQUw6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1BBUkFNRVRFUjoKKwkJCQlwcmVmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRQcmVmaXhlczsKKwkJCQlzdWZmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJfQorCQkKKwkJcmV0dXJuIEludGVybmFsTmFtaW5nQ29udmVudGlvbnMucmVtb3ZlVmFyaWFibGVQcmVmaXhBbmRTdWZmaXgobmFtZSwgcHJlZml4ZXMsIHN1ZmZpeGVzLCB0cnVlKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJlbW92ZVZhcmlhYmxlUHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwcmVmaXhlcywgY2hhcltdW10gc3VmZml4ZXMsIGJvb2xlYW4gdXBkYXRlRmlyc3RDaGFyYWN0ZXIpIHsKKwkJLy8gcmVtb3ZlIGxvbmdlciBwcmVmaXgKKwkJY2hhcltdIHdpdGhvdXRQcmVmaXhOYW1lID0gbmFtZTsKKwkJaWYgKHByZWZpeGVzICE9IG51bGwpIHsKKwkJCWludCBiZXN0TGVuZ3RoID0gMDsKKwkJCWZvciAoaW50IGk9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXSBwcmVmaXggPSBwcmVmaXhlc1tpXTsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBuYW1lKSkgeworCQkJCQlpbnQgY3VyckxlbiA9IHByZWZpeC5sZW5ndGg7CisJCQkJCWJvb2xlYW4gbGFzdENoYXJJc0xldHRlciA9IFNjYW5uZXJIZWxwZXIuaXNMZXR0ZXIocHJlZml4W2N1cnJMZW4gLSAxXSk7CisJCQkJCWlmKCFsYXN0Q2hhcklzTGV0dGVyIHx8IChsYXN0Q2hhcklzTGV0dGVyICYmIG5hbWUubGVuZ3RoID4gY3VyckxlbiAmJiBTY2FubmVySGVscGVyLmlzVXBwZXJDYXNlKG5hbWVbY3Vyckxlbl0pKSkgeworCQkJCQkJaWYgKGJlc3RMZW5ndGggPCBjdXJyTGVuICYmIG5hbWUubGVuZ3RoICE9IGN1cnJMZW4pIHsKKwkJCQkJCQl3aXRob3V0UHJlZml4TmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgY3VyckxlbiwgbmFtZS5sZW5ndGgpOworCQkJCQkJCWJlc3RMZW5ndGggPSBjdXJyTGVuOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gcmVtb3ZlIGxvbmdlciBzdWZmaXgKKwkJY2hhcltdIHdpdGhvdXRTdWZmaXhOYW1lID0gd2l0aG91dFByZWZpeE5hbWU7CisJCWlmKHN1ZmZpeGVzICE9IG51bGwpIHsKKwkJCWludCBiZXN0TGVuZ3RoID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VmZml4ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyW10gc3VmZml4ID0gc3VmZml4ZXNbaV07CisJCQkJaWYoQ2hhck9wZXJhdGlvbi5lbmRzV2l0aCh3aXRob3V0UHJlZml4TmFtZSwgc3VmZml4KSkgeworCQkJCQlpbnQgY3VyckxlbiA9IHN1ZmZpeC5sZW5ndGg7CisJCQkJCWlmKGJlc3RMZW5ndGggPCBjdXJyTGVuICYmIHdpdGhvdXRQcmVmaXhOYW1lLmxlbmd0aCAhPSBjdXJyTGVuKSB7CisJCQkJCQl3aXRob3V0U3VmZml4TmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod2l0aG91dFByZWZpeE5hbWUsIDAsIHdpdGhvdXRQcmVmaXhOYW1lLmxlbmd0aCAtIGN1cnJMZW4pOworCQkJCQkJYmVzdExlbmd0aCA9IGN1cnJMZW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAodXBkYXRlRmlyc3RDaGFyYWN0ZXIpIHdpdGhvdXRTdWZmaXhOYW1lWzBdID0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZSh3aXRob3V0U3VmZml4TmFtZVswXSk7CisJCXJldHVybiB3aXRob3V0U3VmZml4TmFtZTsKKwl9CisKIAlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4KGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwcmVmaXhlcykgewogCQkvLyByZW1vdmUgbG9uZ2VyIHByZWZpeAogCQljaGFyW10gd2l0aG91dFByZWZpeE5hbWUgPSBuYW1lOwpAQCAtMzQzLDcgKzQ2MCw3IEBACiAJCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUubGVuZ3RoOwogCQkJZm9yIChpbnQgaT0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7CiAJCQkJY2hhcltdIHByZWZpeCA9IHByZWZpeGVzW2ldOwotCQkJCQorCiAJCQkJaW50IHByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7CiAJCQkJaWYocHJlZml4TGVuZ3RoIDw9IG5hbWVMZW5ndGgpIHsKIAkJCQkJaWYoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBuYW1lLCBmYWxzZSkpIHsKQEAgLTM3NCw4ICs0OTEsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotLy8JCQotLy8JCQorLy8KKy8vCiAvLwkJLy8gcmVtb3ZlIGxvbmdlciBwcmVmaXgKIC8vCQljaGFyW10gd2l0aG91dFByZWZpeE5hbWUgPSBuYW1lOwogLy8JCWlmIChwcmVmaXhlcyAhPSBudWxsKSB7CkBAIC00MDQsMjAgKzUyMSwzMTQgQEAKIC8vCQkJCX0KIC8vCQkJfQogLy8JCX0KLQkJCisKIAkJcmV0dXJuIHdpdGhvdXRQcmVmaXhOYW1lOwogCX0KIAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcHJlZml4RXF1YWxzKGNoYXJbXSBwcmVmaXgsIGNoYXJbXSBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVktfU1RBVElDX0ZJRUxEID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWS19JTlNUQU5DRV9GSUVMRCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVktfU1RBVElDX0ZJTkFMX0ZJRUxEID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWS19QQVJBTUVURVIgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZLX0xPQ0FMID0gNTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCS19TSU1QTEVfTkFNRSA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQktfU0lNUExFX1RZUEVfTkFNRSA9IDI7CiAKLQkJaW50IG1heCA9IHByZWZpeC5sZW5ndGg7Ci0JCWlmIChuYW1lLmxlbmd0aCA8IG1heCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IG1heDsKLQkJCS0taSA+PSAwOwotCQkJKSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCi0JCQkJaWYgKHByZWZpeFtpXSAhPSBuYW1lW2ldKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQlpbnQgdmFyaWFibGVLaW5kLAorCQkJaW50IGJhc2VOYW1lS2luZCwKKwkJCWNoYXJbXSBiYXNlTmFtZSwKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCWludCBkaW0sCisJCQljaGFyW10gaW50ZXJuYWxQcmVmaXgsCisJCQljaGFyW11bXSBleGNsdWRlZCwKKwkJCWJvb2xlYW4gZXZhbHVhdGVEZWZhdWx0LAorCQkJSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJCisJCWlmKGJhc2VOYW1lID09IG51bGwgfHwgYmFzZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisJCQorCQlNYXAgb3B0aW9uczsKKwkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCW9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOworCQl9IGVsc2UgeworCQkJb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKKwkJfQorCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKTsKKwkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMob3B0aW9ucyk7CisJCQorCQlib29sZWFuIGlzQ29uc3RhbnRGaWVsZCA9IGZhbHNlOworCQkKKwkJY2hhcltdW10gcHJlZml4ZXMgPSBudWxsOworCQljaGFyW11bXSBzdWZmaXhlcyA9IG51bGw7CisJCXN3aXRjaCAodmFyaWFibGVLaW5kKSB7CisJCQljYXNlIFZLX0lOU1RBTkNFX0ZJRUxEOgorCQkJCXByZWZpeGVzID0gYXNzaXN0T3B0aW9ucy5maWVsZFByZWZpeGVzOworCQkJCXN1ZmZpeGVzID0gYXNzaXN0T3B0aW9ucy5maWVsZFN1ZmZpeGVzOworCQkJCWJyZWFrOworCQkJY2FzZSBWS19TVEFUSUNfRklFTEQ6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpZWxkU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1NUQVRJQ19GSU5BTF9GSUVMRDoKKwkJCQlpc0NvbnN0YW50RmllbGQgPSB0cnVlOworCQkJCXByZWZpeGVzID0gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJCWNhc2UgVktfTE9DQUw6CisJCQkJcHJlZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsUHJlZml4ZXM7CisJCQkJc3VmZml4ZXMgPSBhc3Npc3RPcHRpb25zLmxvY2FsU3VmZml4ZXM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZLX1BBUkFNRVRFUjoKKwkJCQlwcmVmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRQcmVmaXhlczsKKwkJCQlzdWZmaXhlcyA9IGFzc2lzdE9wdGlvbnMuYXJndW1lbnRTdWZmaXhlczsKKwkJCQlicmVhazsKKwkJfQorCQkKKwkJaWYocHJlZml4ZXMgPT0gbnVsbCB8fCBwcmVmaXhlcy5sZW5ndGggPT0gMCkgeworCQkJcHJlZml4ZXMgPSBuZXcgY2hhclsxXVswXTsKKwkJfSBlbHNlIHsKKwkJCWludCBsZW5ndGggPSBwcmVmaXhlcy5sZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHByZWZpeGVzLCAwLCBwcmVmaXhlcyA9IG5ldyBjaGFyW2xlbmd0aCsxXVtdLCAwLCBsZW5ndGgpOworCQkJcHJlZml4ZXNbbGVuZ3RoXSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJfQorCisJCWlmKHN1ZmZpeGVzID09IG51bGwgfHwgc3VmZml4ZXMubGVuZ3RoID09IDApIHsKKwkJCXN1ZmZpeGVzID0gbmV3IGNoYXJbMV1bMF07CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gc3VmZml4ZXMubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShzdWZmaXhlcywgMCwgc3VmZml4ZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXSwgMCwgbGVuZ3RoKTsKKwkJCXN1ZmZpeGVzW2xlbmd0aF0gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCX0KKwkJCisJCWlmKGludGVybmFsUHJlZml4ID09IG51bGwpIHsKKwkJCWludGVybmFsUHJlZml4ID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQl9IGVsc2UgeworCQkJaW50ZXJuYWxQcmVmaXggPSByZW1vdmVQcmVmaXgoaW50ZXJuYWxQcmVmaXgsIHByZWZpeGVzKTsKKwkJfQorCisJCWNoYXJbXVtdIHRlbXBOYW1lcyA9IG51bGw7CisJCQorCQlTY2FubmVyIG5hbWVTY2FubmVyID0gZ2V0TmFtZVNjYW5uZXIoY29tcGlsZXJPcHRpb25zKTsKKwkJaWYgKGJhc2VOYW1lS2luZCA9PSBCS19TSU1QTEVfVFlQRV9OQU1FKSB7CisJCQlib29sZWFuIGlzQmFzZVR5cGUgPSBmYWxzZTsKKwkJCQorCQkJdHJ5eworCQkJCW5hbWVTY2FubmVyLnNldFNvdXJjZShiYXNlTmFtZSk7CisJCQkJc3dpdGNoIChuYW1lU2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgeworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludCA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnl0ZSA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc2hvcnQgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXIgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWxvbmcgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZsb2F0IDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVkb3VibGUgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJvb2xlYW4gOgorCQkJCQkJaXNCYXNlVHlwZSA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCWlmIChpc0Jhc2VUeXBlKSB7CisJCQkJLy8gY29tcHV0ZSB2YXJpYWJsZSBuYW1lIGZyb20gYmFzZSB0eXBlCisJCQkJaWYgKGludGVybmFsUHJlZml4Lmxlbmd0aCA+IDApIHJldHVybjsKKwkKKwkJCQl0ZW1wTmFtZXMgPSBjb21wdXRlQmFzZVR5cGVOYW1lcyhiYXNlTmFtZSwgaXNDb25zdGFudEZpZWxkLCBleGNsdWRlZCk7CisJCQl9IGVsc2UgeworCQkJCS8vIGNvbXB1dGUgdmFyaWFibGUgbmFtZSBmb3Igbm9uIGJhc2UgdHlwZQorCQkJCXRlbXBOYW1lcyA9IGNvbXB1dGVOb25CYXNlVHlwZU5hbWVzKGJhc2VOYW1lLCBpc0NvbnN0YW50RmllbGQsIGZhbHNlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRlbXBOYW1lcyA9IGNvbXB1dGVOb25CYXNlVHlwZU5hbWVzKGJhc2VOYW1lLCBpc0NvbnN0YW50RmllbGQsIHRydWUpOworCQl9CisKKwkJYm9vbGVhbiBhY2NlcHREZWZhdWx0TmFtZSA9IHRydWU7CisJCVNpbXBsZVNldE9mQ2hhckFycmF5IGZvdW5kTmFtZXMgPSBuZXcgU2ltcGxlU2V0T2ZDaGFyQXJyYXkoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBOYW1lcy5sZW5ndGg7IGkrKykgeworCQkJY2hhcltdIHRlbXBOYW1lID0gdGVtcE5hbWVzW2ldOworCQkJCisJCQkvLyBhZGQgRW5nbGlzaCBwbHVyYWwgZm9ybSBpcyBuZWNlc3NhcnkKKwkJCWlmKGRpbSA+IDApIHsKKwkJCQlpbnQgbGVuZ3RoID0gdGVtcE5hbWUubGVuZ3RoOworCQkJCQorCQkJCWlmIChpc0NvbnN0YW50RmllbGQpIHsKKwkJCQkJaWYgKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAnUycpeworCQkJCQkJaWYodGVtcE5hbWUubGVuZ3RoID4gMSAmJiB0ZW1wTmFtZVtsZW5ndGgtMl0gPT0gJ1MnKSB7CisJCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAyXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCQl0ZW1wTmFtZVtsZW5ndGhdID0gJ0UnOworCQkJCQkJCXRlbXBOYW1lW2xlbmd0aCsxXSA9ICdTJzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAnWScpIHsKKwkJCQkJCWJvb2xlYW4gcHJlY2VkZWRCeUFWb3dlbCA9IGZhbHNlOworCQkJCQkJaWYodGVtcE5hbWUubGVuZ3RoID4gMSkgeworCQkJCQkJCXN3aXRjaCAodGVtcE5hbWVbbGVuZ3RoLTJdKSB7CisJCQkJCQkJCWNhc2UgJ0EnOgorCQkJCQkJCQljYXNlICdFJzoKKwkJCQkJCQkJY2FzZSAnSSc6CisJCQkJCQkJCWNhc2UgJ08nOgorCQkJCQkJCQljYXNlICdVJzoKKwkJCQkJCQkJCXByZWNlZGVkQnlBVm93ZWwgPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKHByZWNlZGVkQnlBVm93ZWwpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBOYW1lLCAwLCB0ZW1wTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOworCQkJCQkJCXRlbXBOYW1lW2xlbmd0aF0gPSAnUyc7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcE5hbWUsIDAsIHRlbXBOYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMl0sIDAsIGxlbmd0aCk7CisJCQkJCQkJdGVtcE5hbWVbbGVuZ3RoLTFdID0gJ0knOworCQkJCQkJCXRlbXBOYW1lW2xlbmd0aF0gPSAnRSc7CisJCQkJCQkJdGVtcE5hbWVbbGVuZ3RoKzFdID0gJ1MnOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCXRlbXBOYW1lW2xlbmd0aF0gPSAnUyc7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodGVtcE5hbWVbbGVuZ3RoLTFdID09ICdzJyl7CisJCQkJCQlpZih0ZW1wTmFtZS5sZW5ndGggPiAxICYmIHRlbXBOYW1lW2xlbmd0aC0yXSA9PSAncycpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBOYW1lLCAwLCB0ZW1wTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDJdLCAwLCBsZW5ndGgpOworCQkJCQkJCXRlbXBOYW1lW2xlbmd0aF0gPSAnZSc7CisJCQkJCQkJdGVtcE5hbWVbbGVuZ3RoKzFdID0gJ3MnOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYodGVtcE5hbWVbbGVuZ3RoLTFdID09ICd5JykgeworCQkJCQkJYm9vbGVhbiBwcmVjZWRlZEJ5QVZvd2VsID0gZmFsc2U7CisJCQkJCQlpZih0ZW1wTmFtZS5sZW5ndGggPiAxKSB7CisJCQkJCQkJc3dpdGNoICh0ZW1wTmFtZVtsZW5ndGgtMl0pIHsKKwkJCQkJCQkJY2FzZSAnYSc6CisJCQkJCQkJCWNhc2UgJ2UnOgorCQkJCQkJCQljYXNlICdpJzoKKwkJCQkJCQkJY2FzZSAnbyc6CisJCQkJCQkJCWNhc2UgJ3UnOgorCQkJCQkJCQkJcHJlY2VkZWRCeUFWb3dlbCA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAocHJlY2VkZWRCeUFWb3dlbCkgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcE5hbWUsIDAsIHRlbXBOYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CisJCQkJCQkJdGVtcE5hbWVbbGVuZ3RoXSA9ICdzJzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAyXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCQl0ZW1wTmFtZVtsZW5ndGgtMV0gPSAnaSc7CisJCQkJCQkJdGVtcE5hbWVbbGVuZ3RoXSA9ICdlJzsKKwkJCQkJCQl0ZW1wTmFtZVtsZW5ndGgrMV0gPSAncyc7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBOYW1lLCAwLCB0ZW1wTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOworCQkJCQkJdGVtcE5hbWVbbGVuZ3RoXSA9ICdzJzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJY2hhcltdIHVucHJlZml4ZWROYW1lID0gdGVtcE5hbWU7CisJCQkKKwkJCWludCBtYXRjaGluZ0luZGV4ID0gLTE7CisJCQlpZiAoIWlzQ29uc3RhbnRGaWVsZCkgeworCQkJCXVucHJlZml4ZWROYW1lWzBdID0gU2Nhbm5lckhlbHBlci50b1VwcGVyQ2FzZSh1bnByZWZpeGVkTmFtZVswXSk7CisJCQkJCisJCQkJZG9uZSA6IGZvciAoaW50IGogPSAwOyBqIDw9IGludGVybmFsUHJlZml4Lmxlbmd0aDsgaisrKSB7CisJCQkJCWlmKGogPT0gaW50ZXJuYWxQcmVmaXgubGVuZ3RoIHx8CisJCQkJCQkJQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShpbnRlcm5hbFByZWZpeCwgaiwgLTEpLCB1bnByZWZpeGVkTmFtZSwgaiAhPSAwIC8qZG8gbm90IGNoZWNrIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBwcmVmaXgqLykpIHsKKwkJCQkJCW1hdGNoaW5nSW5kZXggPSBqOworCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZG9uZSA6IGZvciAoaW50IGogPSAwOyBqIDw9IGludGVybmFsUHJlZml4Lmxlbmd0aDsgaisrKSB7CisJCQkJCWlmKGogPT0gaW50ZXJuYWxQcmVmaXgubGVuZ3RoKSB7CisJCQkJCQltYXRjaGluZ0luZGV4ID0gajsKKwkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGludGVybmFsUHJlZml4LCBqLCAtMSksIHVucHJlZml4ZWROYW1lLCBqICE9IDAgLypkbyBub3QgY2hlY2sgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIHByZWZpeCovKSkgeworCQkJCQkJaWYgKGogPT0gMCB8fCBpbnRlcm5hbFByZWZpeFtqIC0gMV0gPT0gJ18nKSB7CisJCQkJCQkJbWF0Y2hpbmdJbmRleCA9IGo7CisJCQkJCQkJYnJlYWsgZG9uZTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihtYXRjaGluZ0luZGV4ID4gLTEpIHsKKwkJCQlpZiAoIWlzQ29uc3RhbnRGaWVsZCkgeworCQkJCQl0ZW1wTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW50ZXJuYWxQcmVmaXgsIDAsIG1hdGNoaW5nSW5kZXgpLCB1bnByZWZpeGVkTmFtZSk7CisJCQkJCWlmKG1hdGNoaW5nSW5kZXggPT0gMCkgdGVtcE5hbWVbMF0gPSBTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKHRlbXBOYW1lWzBdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZihtYXRjaGluZ0luZGV4ICE9IDAgJiYgdGVtcE5hbWVbMF0gIT0gJ18nICYmIGludGVybmFsUHJlZml4W21hdGNoaW5nSW5kZXggLSAxXSAhPSAnXycpIHsKKwkJCQkJCXRlbXBOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShDaGFyT3BlcmF0aW9uLnRvVXBwZXJDYXNlKGludGVybmFsUHJlZml4KSwgMCwgbWF0Y2hpbmdJbmRleCksIHVucHJlZml4ZWROYW1lLCAnXycpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGVtcE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KENoYXJPcGVyYXRpb24udG9VcHBlckNhc2UoaW50ZXJuYWxQcmVmaXgpLCAwLCBtYXRjaGluZ0luZGV4KSwgdW5wcmVmaXhlZE5hbWUpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcHJlZml4ZXMubGVuZ3RoOyBrKyspIHsKKwkJCQkJaWYgKCFpc0NvbnN0YW50RmllbGQpIHsKKwkJCQkJCWlmKHByZWZpeGVzW2tdLmxlbmd0aCA+IDAKKwkJCQkJCQkmJiBTY2FubmVySGVscGVyLmlzTGV0dGVyT3JEaWdpdChwcmVmaXhlc1trXVtwcmVmaXhlc1trXS5sZW5ndGggLSAxXSkpIHsKKwkJCQkJCQl0ZW1wTmFtZVswXSA9IFNjYW5uZXJIZWxwZXIudG9VcHBlckNhc2UodGVtcE5hbWVbMF0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0ZW1wTmFtZVswXSA9IFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2UodGVtcE5hbWVbMF0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWNoYXJbXSBwcmVmaXhOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4ZXNba10sIHRlbXBOYW1lKTsKKwkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBzdWZmaXhlcy5sZW5ndGg7IGwrKykgeworCQkJCQkJY2hhcltdIHN1ZmZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXhOYW1lLCBzdWZmaXhlc1tsXSk7CisJCQkJCQlzdWZmaXhOYW1lID0KKwkJCQkJCQlleGNsdWRlTmFtZXMoCisJCQkJCQkJCXN1ZmZpeE5hbWUsCisJCQkJCQkJCXByZWZpeE5hbWUsCisJCQkJCQkJCXN1ZmZpeGVzW2xdLAorCQkJCQkJCQlleGNsdWRlZCk7CisJCQkJCQl0cnl7CisJCQkJCQkJbmFtZVNjYW5uZXIuc2V0U291cmNlKHN1ZmZpeE5hbWUpOworCQkJCQkJCXN3aXRjaCAobmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKKwkJCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyIDoKKwkJCQkJCQkJCWludCB0b2tlbiA9IG5hbWVTY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCQkJCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRiAmJiBuYW1lU2Nhbm5lci5zdGFydFBvc2l0aW9uID09IHN1ZmZpeE5hbWUubGVuZ3RoKSB7CisJCQkJCQkJCQkJaWYgKCFmb3VuZE5hbWVzLmluY2x1ZGVzKHN1ZmZpeE5hbWUpKSB7CisJCQkJCQkJCQkJCWFjY2VwdE5hbWUoc3VmZml4TmFtZSwgcHJlZml4ZXNba10sIHN1ZmZpeGVzW2xdLCAgayA9PSAwLCBsID09IDAsIGludGVybmFsUHJlZml4Lmxlbmd0aCAtIG1hdGNoaW5nSW5kZXgsIHJlcXVlc3Rvcik7CisJCQkJCQkJCQkJCWZvdW5kTmFtZXMuYWRkKHN1ZmZpeE5hbWUpOworCQkJCQkJCQkJCQlhY2NlcHREZWZhdWx0TmFtZSA9IGZhbHNlOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJc3VmZml4TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJCQkJCXByZWZpeE5hbWUsCisJCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoMSkudG9DaGFyQXJyYXkoKSwKKwkJCQkJCQkJCQlzdWZmaXhlc1tsXQorCQkJCQkJCQkJKTsKKwkJCQkJCQkJCXN1ZmZpeE5hbWUgPQorCQkJCQkJCQkJCWV4Y2x1ZGVOYW1lcygKKwkJCQkJCQkJCQkJc3VmZml4TmFtZSwKKwkJCQkJCQkJCQkJcHJlZml4TmFtZSwKKwkJCQkJCQkJCQkJc3VmZml4ZXNbbF0sCisJCQkJCQkJCQkJCWV4Y2x1ZGVkKTsKKwkJCQkJCQkJCW5hbWVTY2FubmVyLnNldFNvdXJjZShzdWZmaXhOYW1lKTsKKwkJCQkJCQkJCXN3aXRjaCAobmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKKwkJCQkJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgOgorCQkJCQkJCQkJCQl0b2tlbiA9IG5hbWVTY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCQkJCQkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GICYmIG5hbWVTY2FubmVyLnN0YXJ0UG9zaXRpb24gPT0gc3VmZml4TmFtZS5sZW5ndGgpIHsKKwkJCQkJCQkJCQkJCWlmICghZm91bmROYW1lcy5pbmNsdWRlcyhzdWZmaXhOYW1lKSkgeworCQkJCQkJCQkJCQkJCWFjY2VwdE5hbWUoc3VmZml4TmFtZSwgcHJlZml4ZXNba10sIHN1ZmZpeGVzW2xdLCBrID09IDAsIGwgPT0gMCwgaW50ZXJuYWxQcmVmaXgubGVuZ3RoIC0gbWF0Y2hpbmdJbmRleCwgcmVxdWVzdG9yKTsKKwkJCQkJCQkJCQkJCQlmb3VuZE5hbWVzLmFkZChzdWZmaXhOYW1lKTsKKwkJCQkJCQkJCQkJCQlhY2NlcHREZWZhdWx0TmFtZSA9IGZhbHNlOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CisJCQkJCQkJLy8gaWdub3JlCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gaWYgbm8gbmFtZXMgd2VyZSBmb3VuZAorCQlpZihldmFsdWF0ZURlZmF1bHQgJiYgYWNjZXB0RGVmYXVsdE5hbWUpIHsKKwkJCWNoYXJbXSBuYW1lID0gZXhjbHVkZU5hbWVzKERFRkFVTFRfTkFNRSwgREVGQVVMVF9OQU1FLCBDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIGV4Y2x1ZGVkKTsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aG91dFByZWZpeEFuZFN1ZmZpeChuYW1lLCAwKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeURpcmVjdG9yeS5qYXZhCmluZGV4IDMxN2RmMGUuLmNiMDQ4OTIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlEaXJlY3RvcnkuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE4LDExICsxOCwxMSBAQAogCiBwdWJsaWMgY2xhc3MgSmFyRW50cnlEaXJlY3RvcnkgZXh0ZW5kcyBKYXJFbnRyeVJlc291cmNlIHsKIAlwcml2YXRlIElKYXJFbnRyeVJlc291cmNlW10gY2hpbGRyZW47Ci0JCisKIAlwdWJsaWMgSmFyRW50cnlEaXJlY3RvcnkoU3RyaW5nIHNpbXBsZU5hbWUpIHsKIAkJc3VwZXIoc2ltcGxlTmFtZSk7CiAJfQotCQorCiAJcHVibGljIEphckVudHJ5UmVzb3VyY2UgY2xvbmUoT2JqZWN0IG5ld1BhcmVudCkgewogCQlKYXJFbnRyeURpcmVjdG9yeSBkaXIgPSBuZXcgSmFyRW50cnlEaXJlY3RvcnkodGhpcy5zaW1wbGVOYW1lKTsKIAkJZGlyLnNldFBhcmVudChuZXdQYXJlbnQpOwpAQCAtMzcsNyArMzcsNyBAQAogCQl9CiAJCXJldHVybiBkaXI7CiAJfQotCQorCiAJcHVibGljIElKYXJFbnRyeVJlc291cmNlW10gZ2V0Q2hpbGRyZW4oKSB7CiAJCXJldHVybiB0aGlzLmNoaWxkcmVuOwogCX0KQEAgLTU1LDYgKzU1LDYgQEAKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkphckVudHJ5RGlyZWN0b3J5WyIrZ2V0RW50cnlOYW1lKCkrIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCisJCXJldHVybiAiSmFyRW50cnlEaXJlY3RvcnlbIitnZXRFbnRyeU5hbWUoKSsiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlGaWxlLmphdmEKaW5kZXggMjg0OGUzMy4uMjFhZjFlYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlGaWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzAsMTcgKzMwLDE3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKYXJFbnRyeUZpbGUgIGV4dGVuZHMgSmFyRW50cnlSZXNvdXJjZSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUphckVudHJ5UmVzb3VyY2VbXSBOT19DSElMRFJFTiA9IG5ldyBJSmFyRW50cnlSZXNvdXJjZVswXTsKLQkKKwogCXB1YmxpYyBKYXJFbnRyeUZpbGUoU3RyaW5nIHNpbXBsZU5hbWUpIHsKIAkJc3VwZXIoc2ltcGxlTmFtZSk7CiAJfQotCQorCiAJcHVibGljIEphckVudHJ5UmVzb3VyY2UgY2xvbmUoT2JqZWN0IG5ld1BhcmVudCkgewotCQlKYXJFbnRyeUZpbGUgZmlsZSA9IG5ldyBKYXJFbnRyeUZpbGUoc2ltcGxlTmFtZSk7CisJCUphckVudHJ5RmlsZSBmaWxlID0gbmV3IEphckVudHJ5RmlsZSh0aGlzLnNpbXBsZU5hbWUpOwogCQlmaWxlLnNldFBhcmVudChuZXdQYXJlbnQpOwogCQlyZXR1cm4gZmlsZTsKIAl9Ci0JCisKIAlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7CiAJCXRyeSB7CkBAIC02MiwxNSArNjIsMTUgQEAKIAkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyBJSmFyRW50cnlSZXNvdXJjZVtdIGdldENoaWxkcmVuKCkgewogCQlyZXR1cm4gTk9fQ0hJTERSRU47CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNGaWxlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gIkphckVudHJ5RmlsZVsiK2dldEVudHJ5TmFtZSgpKyJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyRW50cnlSZXNvdXJjZS5qYXZhCmluZGV4IGNjOGM0ZGUuLjU3YTI3NzUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5UmVzb3VyY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeVJlc291cmNlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yOSw3ICsyOSw3IEBACiAJcHVibGljIEphckVudHJ5UmVzb3VyY2UoU3RyaW5nIHNpbXBsZU5hbWUpIHsKIAkJdGhpcy5zaW1wbGVOYW1lID0gc2ltcGxlTmFtZTsKIAl9Ci0JCisKIAlwdWJsaWMgYWJzdHJhY3QgSmFyRW50cnlSZXNvdXJjZSBjbG9uZShPYmplY3QgbmV3UGFyZW50KTsKIAogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC0zOCw3ICszOCw3IEBACiAJCUphckVudHJ5UmVzb3VyY2Ugb3RoZXIgPSAoSmFyRW50cnlSZXNvdXJjZSkgb2JqOwogCQlyZXR1cm4gdGhpcy5wYXJlbnQuZXF1YWxzKG90aGVyLnBhcmVudCkgJiYgdGhpcy5zaW1wbGVOYW1lLmVxdWFscyhvdGhlci5zaW1wbGVOYW1lKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudHJ5TmFtZSgpIHsKIAkJU3RyaW5nIHBhcmVudEVudHJ5TmFtZTsKIAkJaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewpAQCAtNTEsMTkgKzUxLDE5IEBACiAJCX0KIAkJcmV0dXJuIHBhcmVudEVudHJ5TmFtZSArIHRoaXMuc2ltcGxlTmFtZTsKIAl9Ci0JCisKIAlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7CiAJCXJldHVybiBuZXcgUGF0aChnZXRFbnRyeU5hbWUoKSkubWFrZUFic29sdXRlKCk7CiAJfQotCQorCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5zaW1wbGVOYW1lOwogCX0KLQkKKwogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewogCQlyZXR1cm4gdGhpcy5wYXJlbnQ7CiAJfQotCQorCiAJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7CiAJCWlmICh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKIAkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpICgoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5wYXJlbnQpLmdldFBhcmVudCgpOwpAQCAtNzMsNyArNzMsNyBAQAogCQkJcmV0dXJuICgoSmFyRW50cnlEaXJlY3RvcnkpIHRoaXMucGFyZW50KS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAJCX0KIAl9Ci0JCisKIAlwcm90ZWN0ZWQgWmlwRmlsZSBnZXRaaXBGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CiAJCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgKChJUGFja2FnZUZyYWdtZW50KSB0aGlzLnBhcmVudCkuZ2V0UGFyZW50KCk7CkBAIC04MywxMSArODMsMTEgQEAKIAkJfSBlbHNlCiAJCQlyZXR1cm4gKChKYXJFbnRyeURpcmVjdG9yeSkgdGhpcy5wYXJlbnQpLmdldFppcEZpbGUoKTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKHRoaXMuc2ltcGxlTmFtZS5oYXNoQ29kZSgpLCB0aGlzLnBhcmVudC5oYXNoQ29kZSgpKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudC5qYXZhCmluZGV4IDY2YTMzNTAuLmNhNDNiNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCkBAIC0zMyw3ICszMiw3IEBACiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50CiAgKi8KLWNsYXNzIEphclBhY2thZ2VGcmFnbWVudCBleHRlbmRzIFBhY2thZ2VGcmFnbWVudCBpbXBsZW1lbnRzIFN1ZmZpeENvbnN0YW50cyB7CitjbGFzcyBKYXJQYWNrYWdlRnJhZ21lbnQgZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnQgewogLyoqCiAgKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBqYXIgb3IgYSB6aXAuCiAgKi8KQEAgLTQxLDk1ICs0MCwxMDcgQEAKIAlzdXBlcihyb290LCBuYW1lcyk7CiB9CiAvKioKLSAqIENvbXB1dGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudC4gQ2hpbGRyZW4gb2YgamFyIHBhY2thZ2UgZnJhZ21lbnRzCi0gKiBjYW4gb25seSBiZSBJQ2xhc3NGaWxlIChyZXByZXNlbnRpbmcgLmNsYXNzIGZpbGVzKS4KKyAqIEBzZWUgT3BlbmFibGUKICAqLwotcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZUNoaWxkcmVuKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgQXJyYXlMaXN0IGVudHJ5TmFtZXMpIHsKLQlpZiAoZW50cnlOYW1lcyAhPSBudWxsICYmIGVudHJ5TmFtZXMuc2l6ZSgpID4gMCkgewotCQlBcnJheUxpc3QgdkNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbnRyeU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGNoaWxkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGdldENsYXNzRmlsZShjaGlsZCk7Ci0JCQl2Q2hpbGRyZW4uYWRkKGNsYXNzRmlsZSk7Ci0JCX0KLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW49IG5ldyBJSmF2YUVsZW1lbnRbdkNoaWxkcmVuLnNpemUoKV07Ci0JCXZDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTsKLQkJaW5mby5zZXRDaGlsZHJlbihjaGlsZHJlbik7Ci0JfSBlbHNlIHsKLQkJaW5mby5zZXRDaGlsZHJlbihOT19FTEVNRU5UUyk7Ci0JfQorcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTdHJ1Y3R1cmUoT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBNYXAgbmV3RWxlbWVudHMsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUphclBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBnZXRQYXJlbnQoKTsKKwlKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbyBwYXJlbnRJbmZvID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSByb290LmdldEVsZW1lbnRJbmZvKCk7CisJQXJyYXlMaXN0W10gZW50cmllcyA9IChBcnJheUxpc3RbXSkgcGFyZW50SW5mby5yYXdQYWNrYWdlSW5mby5nZXQodGhpcy5uYW1lcyk7CisJaWYgKGVudHJpZXMgPT0gbnVsbCkKKwkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCUphclBhY2thZ2VGcmFnbWVudEluZm8gZnJhZ0luZm8gPSAoSmFyUGFja2FnZUZyYWdtZW50SW5mbykgaW5mbzsKKworCS8vIGNvbXB1dGUgY2hpbGRyZW4KKwlmcmFnSW5mby5zZXRDaGlsZHJlbihjb21wdXRlQ2hpbGRyZW4oZW50cmllc1swLypjbGFzcyBmaWxlcyovXSkpOworCisJLy8gY29tcHV0ZSBub24tSmF2YSByZXNvdXJjZXMKKwlmcmFnSW5mby5zZXROb25KYXZhUmVzb3VyY2VzKGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKGVudHJpZXNbMS8qbm9uIEphdmEgcmVzb3VyY2VzKi9dKSk7CisKKwluZXdFbGVtZW50cy5wdXQodGhpcywgZnJhZ0luZm8pOwogCXJldHVybiB0cnVlOwogfQogLyoqCi0gKiBDb21wdXRlIGFsbCB0aGUgbm9uLWphdmEgcmVzb3VyY2VzIGFjY29yZGluZyB0byB0aGUgZW50cnkgbmFtZSBmb3VuZCBpbiB0aGUgamFyIGZpbGUuCisgKiBDb21wdXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuIENoaWxkcmVuIG9mIGphciBwYWNrYWdlIGZyYWdtZW50cworICogY2FuIG9ubHkgYmUgSUNsYXNzRmlsZSAocmVwcmVzZW50aW5nIC5jbGFzcyBmaWxlcykuCiAgKi8KLS8qIHBhY2thZ2UgKi8gdm9pZCBjb21wdXRlTm9uSmF2YVJlc291cmNlcyhTdHJpbmdbXSByZXNOYW1lcywgSmFyUGFja2FnZUZyYWdtZW50IHBrZywgSmFyUGFja2FnZUZyYWdtZW50SW5mbyBpbmZvLCBTdHJpbmcgemlwTmFtZSkgewotCWlmIChyZXNOYW1lcyA9PSBudWxsKSB7Ci0JCWluZm8uc2V0Tm9uSmF2YVJlc291cmNlcyhudWxsKTsKLQkJcmV0dXJuOworcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBjb21wdXRlQ2hpbGRyZW4oQXJyYXlMaXN0IG5hbWVzV2l0aG91dEV4dGVuc2lvbikgeworCWludCBzaXplID0gbmFtZXNXaXRob3V0RXh0ZW5zaW9uLnNpemUoKTsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTk9fRUxFTUVOVFM7CisJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBuZXcgSUphdmFFbGVtZW50W3NpemVdOworCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCVN0cmluZyBuYW1lV2l0aG91dEV4dGVuc2lvbiA9IChTdHJpbmcpIG5hbWVzV2l0aG91dEV4dGVuc2lvbi5nZXQoaSk7CisJCWNoaWxkcmVuW2ldID0gbmV3IENsYXNzRmlsZSh0aGlzLCBuYW1lV2l0aG91dEV4dGVuc2lvbik7CiAJfQotCWludCBtYXggPSByZXNOYW1lcy5sZW5ndGg7Ci0JaWYgKG1heCA9PSAwKSB7Ci0JICAgIGluZm8uc2V0Tm9uSmF2YVJlc291cmNlcyhKYXZhRWxlbWVudEluZm8uTk9fTk9OX0pBVkFfUkVTT1VSQ0VTKTsKLQl9IGVsc2UgewotCQlIYXNoTWFwIGphckVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOyAvLyBtYXAgZnJvbSBJUGF0aCB0byBJSmFyRW50cnlSZXNvdXJjZQotCQlIYXNoTWFwIGNoaWxkcmVuTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gbWFwIGZyb20gSVBhdGggdG8gQXJyYXlMaXN0PElKYXJFbnRyeVJlc291cmNlPgotCQlBcnJheUxpc3QgdG9wSmFyRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJU3RyaW5nIHJlc05hbWUgPSByZXNOYW1lc1tpXTsKLQkJCS8vIGNvbnNpZGVyIHRoYXQgYSAuamF2YSBmaWxlIGlzIG5vdCBhIG5vbi1qYXZhIHJlc291cmNlIChzZWUgYnVnIDEyMjQ2IFBhY2thZ2VzIHZpZXcgc2hvd3MgLmNsYXNzIGFuZCAuamF2YSBmaWxlcyB3aGVuIEpBUiBoYXMgc291cmNlKQotCQkJaWYgKCFVdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShyZXNOYW1lKSkgewotCQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgocmVzTmFtZSk7Ci0JCQkJSVBhdGggY2hpbGRQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh0aGlzLm5hbWVzLmxlbmd0aCk7Ci0JCQkJSmFyRW50cnlGaWxlIGZpbGUgPSBuZXcgSmFyRW50cnlGaWxlKGZpbGVQYXRoLmxhc3RTZWdtZW50KCkpOwotCQkJCWphckVudHJpZXMucHV0KGNoaWxkUGF0aCwgZmlsZSk7Ci0JCQkJaWYgKGNoaWxkUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJCWZpbGUuc2V0UGFyZW50KHBrZyk7Ci0JCQkJCXRvcEphckVudHJpZXMuYWRkKGZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlQYXRoIHBhcmVudFBhdGggPSBjaGlsZFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJCQl3aGlsZSAocGFyZW50UGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQkJCUFycmF5TGlzdCBwYXJlbnRDaGlsZHJlbiA9IChBcnJheUxpc3QpIGNoaWxkcmVuTWFwLmdldChwYXJlbnRQYXRoKTsKLQkJCQkJCWlmIChwYXJlbnRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJCQkJT2JqZWN0IGRpciA9IG5ldyBKYXJFbnRyeURpcmVjdG9yeShwYXJlbnRQYXRoLmxhc3RTZWdtZW50KCkpOwotCQkJCQkJCWphckVudHJpZXMucHV0KHBhcmVudFBhdGgsIGRpcik7Ci0JCQkJCQkJY2hpbGRyZW5NYXAucHV0KHBhcmVudFBhdGgsIHBhcmVudENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpKTsKLQkJCQkJCQlwYXJlbnRDaGlsZHJlbi5hZGQoY2hpbGRQYXRoKTsKLQkJCQkJCQlpZiAocGFyZW50UGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJCQkJCXRvcEphckVudHJpZXMuYWRkKGRpcik7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQljaGlsZFBhdGggPSBwYXJlbnRQYXRoOwotCQkJCQkJCXBhcmVudFBhdGggPSBjaGlsZFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwYXJlbnRDaGlsZHJlbi5hZGQoY2hpbGRQYXRoKTsKLQkJCQkJCQlicmVhazsgLy8gYWxsIHBhcmVudHMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZAorCXJldHVybiBjaGlsZHJlbjsKK30KKy8qKgorICogQ29tcHV0ZSBhbGwgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGVudHJ5IG5hbWVzLgorICovCitwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKEFycmF5TGlzdCBlbnRyeU5hbWVzKSB7CisJaW50IGxlbmd0aCA9IGVudHJ5TmFtZXMuc2l6ZSgpOworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIEphdmFFbGVtZW50SW5mby5OT19OT05fSkFWQV9SRVNPVVJDRVM7CisJSGFzaE1hcCBqYXJFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsgLy8gbWFwIGZyb20gSVBhdGggdG8gSUphckVudHJ5UmVzb3VyY2UKKwlIYXNoTWFwIGNoaWxkcmVuTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gbWFwIGZyb20gSVBhdGggdG8gQXJyYXlMaXN0PElKYXJFbnRyeVJlc291cmNlPgorCUFycmF5TGlzdCB0b3BKYXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJU3RyaW5nIHJlc05hbWUgPSAoU3RyaW5nKSBlbnRyeU5hbWVzLmdldChpKTsKKwkJLy8gY29uc2lkZXIgdGhhdCBhIC5qYXZhIGZpbGUgaXMgbm90IGEgbm9uLWphdmEgcmVzb3VyY2UgKHNlZSBidWcgMTIyNDYgUGFja2FnZXMgdmlldyBzaG93cyAuY2xhc3MgYW5kIC5qYXZhIGZpbGVzIHdoZW4gSkFSIGhhcyBzb3VyY2UpCisJCWlmICghVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUocmVzTmFtZSkpIHsKKwkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgocmVzTmFtZSk7CisJCQlJUGF0aCBjaGlsZFBhdGggPSBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHRoaXMubmFtZXMubGVuZ3RoKTsKKwkJCWlmIChqYXJFbnRyaWVzLmNvbnRhaW5zS2V5KGNoaWxkUGF0aCkpIHsKKwkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjY2NQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJSmFyRW50cnlGaWxlIGZpbGUgPSBuZXcgSmFyRW50cnlGaWxlKGZpbGVQYXRoLmxhc3RTZWdtZW50KCkpOworCQkJamFyRW50cmllcy5wdXQoY2hpbGRQYXRoLCBmaWxlKTsKKwkJCWlmIChjaGlsZFBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgeworCQkJCWZpbGUuc2V0UGFyZW50KHRoaXMpOworCQkJCXRvcEphckVudHJpZXMuYWRkKGZpbGUpOworCQkJfSBlbHNlIHsKKwkJCQlJUGF0aCBwYXJlbnRQYXRoID0gY2hpbGRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJCQl3aGlsZSAocGFyZW50UGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKKwkJCQkJQXJyYXlMaXN0IHBhcmVudENoaWxkcmVuID0gKEFycmF5TGlzdCkgY2hpbGRyZW5NYXAuZ2V0KHBhcmVudFBhdGgpOworCQkJCQlpZiAocGFyZW50Q2hpbGRyZW4gPT0gbnVsbCkgeworCQkJCQkJT2JqZWN0IGRpciA9IG5ldyBKYXJFbnRyeURpcmVjdG9yeShwYXJlbnRQYXRoLmxhc3RTZWdtZW50KCkpOworCQkJCQkJamFyRW50cmllcy5wdXQocGFyZW50UGF0aCwgZGlyKTsKKwkJCQkJCWNoaWxkcmVuTWFwLnB1dChwYXJlbnRQYXRoLCBwYXJlbnRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKSk7CisJCQkJCQlwYXJlbnRDaGlsZHJlbi5hZGQoY2hpbGRQYXRoKTsKKwkJCQkJCWlmIChwYXJlbnRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKKwkJCQkJCQl0b3BKYXJFbnRyaWVzLmFkZChkaXIpOworCQkJCQkJCWJyZWFrOwogCQkJCQkJfQorCQkJCQkJY2hpbGRQYXRoID0gcGFyZW50UGF0aDsKKwkJCQkJCXBhcmVudFBhdGggPSBjaGlsZFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkUGF0aCk7CisJCQkJCQlicmVhazsgLy8gYWxsIHBhcmVudHMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZAogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCUl0ZXJhdG9yIGVudHJpZXMgPSBjaGlsZHJlbk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllcy5uZXh0KCk7Ci0JCQlJUGF0aCBlbnRyeVBhdGggPSAoSVBhdGgpIGVudHJ5LmdldEtleSgpOwotCQkJQXJyYXlMaXN0IGVudHJ5VmFsdWUgPSAgKEFycmF5TGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUphckVudHJ5RGlyZWN0b3J5IGphckVudHJ5RGlyZWN0b3J5ID0gKEphckVudHJ5RGlyZWN0b3J5KSBqYXJFbnRyaWVzLmdldChlbnRyeVBhdGgpOwotCQkJaW50IHNpemUgPSBlbnRyeVZhbHVlLnNpemUoKTsKLQkJCUlKYXJFbnRyeVJlc291cmNlW10gY2hpbGRyZW4gPSBuZXcgSUphckVudHJ5UmVzb3VyY2Vbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUphckVudHJ5UmVzb3VyY2UgY2hpbGQgPSAoSmFyRW50cnlSZXNvdXJjZSkgamFyRW50cmllcy5nZXQoZW50cnlWYWx1ZS5nZXQoaSkpOwotCQkJCWNoaWxkLnNldFBhcmVudChqYXJFbnRyeURpcmVjdG9yeSk7Ci0JCQkJY2hpbGRyZW5baV0gPSBjaGlsZDsKLQkJCX0KLQkJCWphckVudHJ5RGlyZWN0b3J5LnNldENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCWlmIChlbnRyeVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCWphckVudHJ5RGlyZWN0b3J5LnNldFBhcmVudChwa2cpOwotCQkJfQotCQl9Ci0JCU9iamVjdFtdIHJlcyA9IHRvcEphckVudHJpZXMudG9BcnJheShuZXcgT2JqZWN0W3RvcEphckVudHJpZXMuc2l6ZSgpXSk7Ci0JCWluZm8uc2V0Tm9uSmF2YVJlc291cmNlcyhyZXMpOwogCX0KKwlJdGVyYXRvciBlbnRyaWVzID0gY2hpbGRyZW5NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzLm5leHQoKTsKKwkJSVBhdGggZW50cnlQYXRoID0gKElQYXRoKSBlbnRyeS5nZXRLZXkoKTsKKwkJQXJyYXlMaXN0IGVudHJ5VmFsdWUgPSAgKEFycmF5TGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKKwkJSmFyRW50cnlEaXJlY3RvcnkgamFyRW50cnlEaXJlY3RvcnkgPSAoSmFyRW50cnlEaXJlY3RvcnkpIGphckVudHJpZXMuZ2V0KGVudHJ5UGF0aCk7CisJCWludCBzaXplID0gZW50cnlWYWx1ZS5zaXplKCk7CisJCUlKYXJFbnRyeVJlc291cmNlW10gY2hpbGRyZW4gPSBuZXcgSUphckVudHJ5UmVzb3VyY2Vbc2l6ZV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlKYXJFbnRyeVJlc291cmNlIGNoaWxkID0gKEphckVudHJ5UmVzb3VyY2UpIGphckVudHJpZXMuZ2V0KGVudHJ5VmFsdWUuZ2V0KGkpKTsKKwkJCWNoaWxkLnNldFBhcmVudChqYXJFbnRyeURpcmVjdG9yeSk7CisJCQljaGlsZHJlbltpXSA9IGNoaWxkOworCQl9CisJCWphckVudHJ5RGlyZWN0b3J5LnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKwkJaWYgKGVudHJ5UGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CisJCQlqYXJFbnRyeURpcmVjdG9yeS5zZXRQYXJlbnQodGhpcyk7CisJCX0KKwl9CisJcmV0dXJuIHRvcEphckVudHJpZXMudG9BcnJheShuZXcgT2JqZWN0W3RvcEphckVudHJpZXMuc2l6ZSgpXSk7CiB9CiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBqYXZhIHJlc291cmNlLgpAQCAtMTQ4LDE3ICsxNTksNyBAQAogICogQHNlZSBKYXZhRWxlbWVudAogICovCiBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUVsZW1lbnRJbmZvKCkgewotCXJldHVybiBudWxsOyAvLyBub3QgdXNlZCBmb3IgSmFyUGFja2FnZUZyYWdtZW50czogaW5mbyBpcyBjcmVhdGVkIHdoZW4gamFyIGlzIG9wZW5lZAotfQotLyoKLSAqIEBzZWUgSmF2YUVsZW1lbnQjZ2VuZXJhdGVJbmZvcwotICovCi1wcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUluZm9zKE9iamVjdCBpbmZvLCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvLyBPcGVuIG15IGphcjogdGhpcyBjcmVhdGVzIGFsbCB0aGUgcGtnIGluZm9zCi0JT3BlbmFibGUgb3BlbmFibGVQYXJlbnQgPSAoT3BlbmFibGUpdGhpcy5wYXJlbnQ7Ci0JaWYgKCFvcGVuYWJsZVBhcmVudC5pc09wZW4oKSkgewotCQlvcGVuYWJsZVBhcmVudC5nZW5lcmF0ZUluZm9zKG9wZW5hYmxlUGFyZW50LmNyZWF0ZUVsZW1lbnRJbmZvKCksIG5ld0VsZW1lbnRzLCBwbSk7Ci0JfQorCXJldHVybiBuZXcgSmFyUGFja2FnZUZyYWdtZW50SW5mbygpOwogfQogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQKQEAgLTE4OCwxMSArMTg5LDExIEBACiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCiBwdWJsaWMgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmICh0aGlzLmlzRGVmYXVsdFBhY2thZ2UoKSkgeworCWlmIChpc0RlZmF1bHRQYWNrYWdlKCkpIHsKIAkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzaG93IG5vbiBqYXZhIHJlc291cmNlcyBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlIChzZWUgUFIgIzFHNThOQjgpCiAJCXJldHVybiBKYXZhRWxlbWVudEluZm8uTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwogCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLnN0b3JlZE5vbkphdmFSZXNvdXJjZXMoKTsKKwkJcmV0dXJuIHN0b3JlZE5vbkphdmFSZXNvdXJjZXMoKTsKIAl9CiB9CiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQppbmRleCBhNzI5YjQ3Li41YjE4YzE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDEyICsxMiwxMyBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5IYXNodGFibGVPZkFycmF5VG9PYmplY3Q7CkBAIC0zNCw5ICszNSw5IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXJQYWNrYWdlRnJhZ21lbnRSb290IGV4dGVuZHMgUGFja2FnZUZyYWdtZW50Um9vdCB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBBcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKKworCXByaXZhdGUgZmluYWwgc3RhdGljIEFycmF5TGlzdCBFTVBUWV9MSVNUID0gbmV3IEFycmF5TGlzdCgpOworCiAJLyoqCiAJICogVGhlIHBhdGggdG8gdGhlIGphciBmaWxlCiAJICogKGEgd29ya3NwYWNlIHJlbGF0aXZlIHBhdGggaWYgdGhlIGphciBpcyBpbnRlcm5hbCwKQEAgLTQ1LDE2ICs0NiwxNiBAQAogCXByb3RlY3RlZCBmaW5hbCBJUGF0aCBqYXJQYXRoOwogCiAJLyoqCi0JICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkgCisJICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkKIAkgKiBiYXNlZCBvbiBhIEpBUiBmaWxlIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYW5kCiAJICogZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCiAJICovCi0JcHJvdGVjdGVkIEphclBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggamFyUGF0aCwgSmF2YVByb2plY3QgcHJvamVjdCkgeworCXByb3RlY3RlZCBKYXJQYWNrYWdlRnJhZ21lbnRSb290KElQYXRoIGV4dGVybmFsSmFyUGF0aCwgSmF2YVByb2plY3QgcHJvamVjdCkgewogCQlzdXBlcihudWxsLCBwcm9qZWN0KTsKLQkJdGhpcy5qYXJQYXRoID0gamFyUGF0aDsKKwkJdGhpcy5qYXJQYXRoID0gZXh0ZXJuYWxKYXJQYXRoOwogCX0KIAkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCByb290IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBKYXZhIHBhY2thZ2UgZGlyZWN0b3J5IGhpZXJhcmNoeSAKKwkgKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCByb290IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBKYXZhIHBhY2thZ2UgZGlyZWN0b3J5IGhpZXJhcmNoeQogCSAqIGJhc2VkIG9uIGEgSkFSIGZpbGUuCiAJICovCiAJcHJvdGVjdGVkIEphclBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlLCBKYXZhUHJvamVjdCBwcm9qZWN0KSB7CkBAIC02Niw1OSArNjcsNTAgQEAKIAkgKiBDb21wdXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNoaWxkcmVuIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290LgogCSAqIFRoZXNlIGFyZSBhbGwgb2YgdGhlIGRpcmVjdG9yeSB6aXAgZW50cmllcywgYW5kIGFueSBkaXJlY3RvcmllcyBpbXBsaWVkCiAJICogYnkgdGhlIHBhdGggb2YgY2xhc3MgZmlsZXMgY29udGFpbmVkIGluIHRoZSBqYXIgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0JICogSGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBvcGVuaW5nIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNoaWxkcmVuLgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGVDaGlsZHJlbihPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIE1hcCBuZXdFbGVtZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlBcnJheUxpc3QgdkNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmFsIGludCBKQVZBID0gMDsKLQkJZmluYWwgaW50IE5PTl9KQVZBID0gMTsKLQkJWmlwRmlsZSBqYXI9IG51bGw7CisJcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZUNoaWxkcmVuKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUhhc2h0YWJsZU9mQXJyYXlUb09iamVjdCByYXdQYWNrYWdlSW5mbyA9IG5ldyBIYXNodGFibGVPZkFycmF5VG9PYmplY3QoKTsKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW47CisJCVppcEZpbGUgamFyID0gbnVsbDsKIAkJdHJ5IHsKLQkJCWphcj0gZ2V0SmFyKCk7Ci0JCi0JCQlIYXNodGFibGVPZkFycmF5VG9PYmplY3QgcGFja2FnZUZyYWdUb1R5cGVzPSBuZXcgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0KCk7Ci0JCisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7CisJCQlTdHJpbmcgc291cmNlTGV2ZWwgPSBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOworCQkJU3RyaW5nIGNvbXBsaWFuY2UgPSBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKTsKKwkJCWphciA9IGdldEphcigpOworCiAJCQkvLyBhbHdheXMgY3JlYXRlIHRoZSBkZWZhdWx0IHBhY2thZ2UKLQkJCXBhY2thZ2VGcmFnVG9UeXBlcy5wdXQoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTLCBuZXcgQXJyYXlMaXN0W10geyBFTVBUWV9MSVNULCBFTVBUWV9MSVNUIH0pOwotCQorCQkJcmF3UGFja2FnZUluZm8ucHV0KENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUywgbmV3IEFycmF5TGlzdFtdIHsgRU1QVFlfTElTVCwgRU1QVFlfTElTVCB9KTsKKwogCQkJZm9yIChFbnVtZXJhdGlvbiBlPSBqYXIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewogCQkJCVppcEVudHJ5IG1lbWJlcj0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaW5pdFBhY2thZ2VGcmFnVG9UeXBlcyhwYWNrYWdlRnJhZ1RvVHlwZXMsIG1lbWJlci5nZXROYW1lKCksIG1lbWJlci5pc0RpcmVjdG9yeSgpKTsKKwkJCQlpbml0UmF3UGFja2FnZUluZm8ocmF3UGFja2FnZUluZm8sIG1lbWJlci5nZXROYW1lKCksIG1lbWJlci5pc0RpcmVjdG9yeSgpLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZSk7CiAJCQl9Ci0JCQkKLQkJCS8vbG9vcCB0aHJvdWdoIGFsbCBvZiByZWZlcmVuY2VkIHBhY2thZ2VzLCBjcmVhdGluZyBwYWNrYWdlIGZyYWdtZW50cyBpZiBuZWNlc3NhcnkKLQkJCS8vIGFuZCBjYWNoZSB0aGUgZW50cnkgbmFtZXMgaW4gdGhlIGluZm9zIGNyZWF0ZWQgZm9yIHRob3NlIHBhY2thZ2UgZnJhZ21lbnRzCi0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFja2FnZUZyYWdUb1R5cGVzLmtleVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nW10gcGtnTmFtZSA9IChTdHJpbmdbXSkgcGFja2FnZUZyYWdUb1R5cGVzLmtleVRhYmxlW2ldOworCisJCQkvLyBsb29wIHRocm91Z2ggYWxsIG9mIHJlZmVyZW5jZWQgcGFja2FnZXMsIGNyZWF0aW5nIHBhY2thZ2UgZnJhZ21lbnRzIGlmIG5lY2Vzc2FyeQorCQkJLy8gYW5kIGNhY2hlIHRoZSBlbnRyeSBuYW1lcyBpbiB0aGUgcmF3UGFja2FnZUluZm8gdGFibGUKKwkJCWNoaWxkcmVuID0gbmV3IElKYXZhRWxlbWVudFtyYXdQYWNrYWdlSW5mby5zaXplKCldOworCQkJaW50IGluZGV4ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByYXdQYWNrYWdlSW5mby5rZXlUYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVN0cmluZ1tdIHBrZ05hbWUgPSAoU3RyaW5nW10pIHJhd1BhY2thZ2VJbmZvLmtleVRhYmxlW2ldOwogCQkJCWlmIChwa2dOYW1lID09IG51bGwpIGNvbnRpbnVlOwotCQkJCQotCQkJCUFycmF5TGlzdFtdIGVudHJpZXM9IChBcnJheUxpc3RbXSkgcGFja2FnZUZyYWdUb1R5cGVzLmdldChwa2dOYW1lKTsKLQkJCQlKYXJQYWNrYWdlRnJhZ21lbnQgcGFja0ZyYWc9IChKYXJQYWNrYWdlRnJhZ21lbnQpIGdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKTsKLQkJCQlKYXJQYWNrYWdlRnJhZ21lbnRJbmZvIGZyYWdJbmZvPSBuZXcgSmFyUGFja2FnZUZyYWdtZW50SW5mbygpOwotCQkJCWludCByZXNMZW5ndGg9IGVudHJpZXNbTk9OX0pBVkFdLnNpemUoKTsKLQkJCQlpZiAocmVzTGVuZ3RoID09IDApIHsKLQkJCQkJcGFja0ZyYWcuY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTLCBwYWNrRnJhZywgZnJhZ0luZm8sIGphci5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ1tdIHJlc05hbWVzPSBuZXcgU3RyaW5nW3Jlc0xlbmd0aF07Ci0JCQkJCWVudHJpZXNbTk9OX0pBVkFdLnRvQXJyYXkocmVzTmFtZXMpOwotCQkJCQlwYWNrRnJhZy5jb21wdXRlTm9uSmF2YVJlc291cmNlcyhyZXNOYW1lcywgcGFja0ZyYWcsIGZyYWdJbmZvLCBqYXIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcGFja0ZyYWcuY29tcHV0ZUNoaWxkcmVuKGZyYWdJbmZvLCBlbnRyaWVzW0pBVkFdKTsKLQkJCQluZXdFbGVtZW50cy5wdXQocGFja0ZyYWcsIGZyYWdJbmZvKTsKLQkJCQl2Q2hpbGRyZW4uYWRkKHBhY2tGcmFnKTsKKwkJCQljaGlsZHJlbltpbmRleCsrXSA9IGdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKTsKIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgdGhyb3cgKEphdmFNb2RlbEV4Y2VwdGlvbillOwotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCWlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBaaXBFeGNlcHRpb24pIHsKKwkJCQkvLyBub3QgYSBaSVAgYXJjaGl2ZSwgbGVhdmUgdGhlIGNoaWxkcmVuIGVtcHR5CisJCQkJVXRpbC5sb2coSVN0YXR1cy5FUlJPUiwgIkludmFsaWQgWklQIGFyY2hpdmU6ICIgKyB0b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljaGlsZHJlbiA9IE5PX0VMRU1FTlRTOworCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CisJCQkJdGhyb3cgKEphdmFNb2RlbEV4Y2VwdGlvbillOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJfQogCQl9IGZpbmFsbHkgewogCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2xvc2VaaXBGaWxlKGphcik7CiAJCX0KIAotCi0JCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuPSBuZXcgSUphdmFFbGVtZW50W3ZDaGlsZHJlbi5zaXplKCldOwotCQl2Q2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7CiAJCWluZm8uc2V0Q2hpbGRyZW4oY2hpbGRyZW4pOworCQkoKEphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBpbmZvKS5yYXdQYWNrYWdlSW5mbyA9IHJhd1BhY2thZ2VJbmZvOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJLyoqCkBAIC0xNjYsNiArMTU4LDkgQEAKIAlwdWJsaWMgaW50IGdldEtpbmQoKSB7CiAJCXJldHVybiBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWTsKIAl9CisJaW50IGludGVybmFsS2luZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlk7CisJfQogCS8qKgogCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCiAJICovCkBAIC0xODUsMjYgKzE4MCwxOSBAQAogCXB1YmxpYyBQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZ1tdIHBrZ05hbWUpIHsKIAkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnQodGhpcywgcGtnTmFtZSk7CiAJfQotCS8qKgotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKwlwdWJsaWMgSVBhdGggaW50ZXJuYWxQYXRoKCkgewogCQlpZiAoaXNFeHRlcm5hbCgpKSB7CiAJCQlyZXR1cm4gdGhpcy5qYXJQYXRoOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhdGgoKTsKKwkJCXJldHVybiBzdXBlci5pbnRlcm5hbFBhdGgoKTsKIAkJfQogCX0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCXB1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CiAJCWlmICh0aGlzLnJlc291cmNlID09IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2UgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHRoaXMuamFyUGF0aCwgZmFsc2UpOwotCQl9Ci0JCWlmICh0aGlzLnJlc291cmNlIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2UoKTsKLQkJfSBlbHNlIHsKIAkJCS8vIGV4dGVybmFsIGphcgogCQkJcmV0dXJuIG51bGw7CiAJCX0KKwkJcmV0dXJuIHN1cGVyLnJlc291cmNlKHJvb3QpOwogCX0KIAogCkBAIC0yMjIsMjggKzIxMCwyNyBAQAogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiB0aGlzLmphclBhdGguaGFzaENvZGUoKTsKIAl9Ci0JcHJpdmF0ZSB2b2lkIGluaXRQYWNrYWdlRnJhZ1RvVHlwZXMoSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHBhY2thZ2VGcmFnVG9UeXBlcywgU3RyaW5nIGVudHJ5TmFtZSwgYm9vbGVhbiBpc0RpcmVjdG9yeSkgeworCXByaXZhdGUgdm9pZCBpbml0UmF3UGFja2FnZUluZm8oSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHJhd1BhY2thZ2VJbmZvLCBTdHJpbmcgZW50cnlOYW1lLCBib29sZWFuIGlzRGlyZWN0b3J5LCBTdHJpbmcgc291cmNlTGV2ZWwsIFN0cmluZyBjb21wbGlhbmNlKSB7CiAJCWludCBsYXN0U2VwYXJhdG9yID0gaXNEaXJlY3RvcnkgPyBlbnRyeU5hbWUubGVuZ3RoKCktMSA6IGVudHJ5TmFtZS5sYXN0SW5kZXhPZignLycpOwogCQlTdHJpbmdbXSBwa2dOYW1lID0gVXRpbC5zcGxpdE9uKCcvJywgZW50cnlOYW1lLCAwLCBsYXN0U2VwYXJhdG9yKTsKIAkJU3RyaW5nW10gZXhpc3RpbmcgPSBudWxsOwogCQlpbnQgbGVuZ3RoID0gcGtnTmFtZS5sZW5ndGg7CiAJCWludCBleGlzdGluZ0xlbmd0aCA9IGxlbmd0aDsKIAkJd2hpbGUgKGV4aXN0aW5nTGVuZ3RoID49IDApIHsKLQkJCWV4aXN0aW5nID0gKFN0cmluZ1tdKSBwYWNrYWdlRnJhZ1RvVHlwZXMuZ2V0S2V5KHBrZ05hbWUsIGV4aXN0aW5nTGVuZ3RoKTsKKwkJCWV4aXN0aW5nID0gKFN0cmluZ1tdKSByYXdQYWNrYWdlSW5mby5nZXRLZXkocGtnTmFtZSwgZXhpc3RpbmdMZW5ndGgpOwogCQkJaWYgKGV4aXN0aW5nICE9IG51bGwpIGJyZWFrOwogCQkJZXhpc3RpbmdMZW5ndGgtLTsKIAkJfQogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwogCQlmb3IgKGludCBpID0gZXhpc3RpbmdMZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKHBrZ05hbWVbaV0sIHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSksIHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpKSkgeworCQkJaWYgKFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKHBrZ05hbWVbaV0sIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlKSkgewogCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmcsIDAsIGV4aXN0aW5nID0gbmV3IFN0cmluZ1tpKzFdLCAwLCBpKTsKIAkJCQlleGlzdGluZ1tpXSA9IG1hbmFnZXIuaW50ZXJuKHBrZ05hbWVbaV0pOwotCQkJCXBhY2thZ2VGcmFnVG9UeXBlcy5wdXQoZXhpc3RpbmcsIG5ldyBBcnJheUxpc3RbXSB7IEVNUFRZX0xJU1QsIEVNUFRZX0xJU1QgfSk7CisJCQkJcmF3UGFja2FnZUluZm8ucHV0KGV4aXN0aW5nLCBuZXcgQXJyYXlMaXN0W10geyBFTVBUWV9MSVNULCBFTVBUWV9MSVNUIH0pOwogCQkJfSBlbHNlIHsKIAkJCQkvLyBub24tSmF2YSByZXNvdXJjZSBmb2xkZXIKIAkJCQlpZiAoIWlzRGlyZWN0b3J5KSB7Ci0JCQkJCUFycmF5TGlzdFtdIGNoaWxkcmVuID0gKEFycmF5TGlzdFtdKSBwYWNrYWdlRnJhZ1RvVHlwZXMuZ2V0KGV4aXN0aW5nKTsKKwkJCQkJQXJyYXlMaXN0W10gY2hpbGRyZW4gPSAoQXJyYXlMaXN0W10pIHJhd1BhY2thZ2VJbmZvLmdldChleGlzdGluZyk7CiAJCQkJCWlmIChjaGlsZHJlblsxLypOT05fSkFWQSovXSA9PSBFTVBUWV9MSVNUKSBjaGlsZHJlblsxLypOT05fSkFWQSovXSA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCQkJY2hpbGRyZW5bMS8qTk9OX0pBVkEqL10uYWRkKGVudHJ5TmFtZSk7CiAJCQkJfQpAQCAtMjUyLDE4ICsyMzksMTggQEAKIAkJfQogCQlpZiAoaXNEaXJlY3RvcnkpCiAJCQlyZXR1cm47Ci0JCQorCiAJCS8vIGFkZCBjbGFzc2ZpbGUgaW5mbyBhbW9uZ3N0IGNoaWxkcmVuCi0JCUFycmF5TGlzdFtdIGNoaWxkcmVuID0gKEFycmF5TGlzdFtdKSBwYWNrYWdlRnJhZ1RvVHlwZXMuZ2V0KHBrZ05hbWUpOworCQlBcnJheUxpc3RbXSBjaGlsZHJlbiA9IChBcnJheUxpc3RbXSkgcmF3UGFja2FnZUluZm8uZ2V0KHBrZ05hbWUpOwogCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUoZW50cnlOYW1lKSkgewogCQkJaWYgKGNoaWxkcmVuWzAvKkpBVkEqL10gPT0gRU1QVFlfTElTVCkgY2hpbGRyZW5bMC8qSkFWQSovXSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcobGFzdFNlcGFyYXRvciArIDEpOwotCQkJY2hpbGRyZW5bMC8qSkFWQSovXS5hZGQoZmlsZU5hbWUpOworCQkJU3RyaW5nIG5hbWVXaXRob3V0RXh0ZW5zaW9uID0gZW50cnlOYW1lLnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yICsgMSwgZW50cnlOYW1lLmxlbmd0aCgpIC0gNik7CisJCQljaGlsZHJlblswLypKQVZBKi9dLmFkZChuYW1lV2l0aG91dEV4dGVuc2lvbik7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY2hpbGRyZW5bMS8qTk9OX0pBVkEqL10gPT0gRU1QVFlfTElTVCkgY2hpbGRyZW5bMS8qTk9OX0pBVkEqL10gPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQljaGlsZHJlblsxLypOT05fSkFWQSovXS5hZGQoZW50cnlOYW1lKTsKIAkJfQotCQkKKwogCX0KIAkvKioKIAkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CkBAIC0yNzUsNyArMjYyLDcgQEAKIAkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCkgPT0gbnVsbDsKKwkJcmV0dXJuIHJlc291cmNlKCkgPT0gbnVsbDsKIAl9CiAJLyoqCiAJICogSmFycyBhbmQgamFyIGVudHJpZXMgYXJlIGFsbCByZWFkIG9ubHkKQEAgLTI4NSwyNCArMjcyLDI0IEBACiAJfQogCiAJLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb3IgYXNzb2NpYXRlZCBmaWxlIGV4aXN0cwotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZUV4aXN0cygpIHsKLQlpZiAodGhpcy5pc0V4dGVybmFsKCkpIHsKLQkJcmV0dXJuIAotCQkJSmF2YU1vZGVsLmdldFRhcmdldCgKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAKLQkJCQl0aGlzLmdldFBhdGgoKSwgLy8gZG9uJ3QgbWFrZSB0aGUgcGF0aCByZWxhdGl2ZSBhcyB0aGlzIGlzIGFuIGV4dGVybmFsIGFyY2hpdmUKLQkJCQl0cnVlKSAhPSBudWxsOwotCX0gZWxzZSB7Ci0JCXJldHVybiBzdXBlci5yZXNvdXJjZUV4aXN0cygpOworCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBvciBhc3NvY2lhdGVkIGZpbGUgZXhpc3RzCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VFeGlzdHMoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCQlpZiAodW5kZXJseWluZ1Jlc291cmNlID09IG51bGwpIHsKKwkJCXJldHVybgorCQkJCUphdmFNb2RlbC5nZXRFeHRlcm5hbFRhcmdldCgKKwkJCQkJZ2V0UGF0aCgpLypkb24ndCBtYWtlIHRoZSBwYXRoIHJlbGF0aXZlIGFzIHRoaXMgaXMgYW4gZXh0ZXJuYWwgYXJjaGl2ZSovLAorCQkJCQl0cnVlLypjaGVjayBleGlzdGVuY2UqLykgIT0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBzdXBlci5yZXNvdXJjZUV4aXN0cyh1bmRlcmx5aW5nUmVzb3VyY2UpOworCQl9CiAJfQotfQotcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdBbmNlc3RvcnMoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCWlmIChpc0V4dGVybmFsKCkpCi0JCS8vIGRvbid0IHNob3cgcHJvamVjdCBhcyBpdCBpcyBpcnJlbGV2YW50IGZvciBleHRlcm5hbCBqYXIgZmlsZXMuCi0JCS8vIGFsc28gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY2MTUKLQkJcmV0dXJuOwotCXN1cGVyLnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7Ci19CisKKwlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0FuY2VzdG9ycyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWlmIChpc0V4dGVybmFsKCkpCisJCQkvLyBkb24ndCBzaG93IHByb2plY3QgYXMgaXQgaXMgaXJyZWxldmFudCBmb3IgZXh0ZXJuYWwgamFyIGZpbGVzLgorCQkJLy8gYWxzbyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjYxNQorCQkJcmV0dXJuOworCQlzdXBlci50b1N0cmluZ0FuY2VzdG9ycyhidWZmZXIpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCmluZGV4IDI2ODA0ZGYuLjc5NTViMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxNSArMTAsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0OworCiAvKioKICAqIFRoZSBlbGVtZW50IGluZm8gZm9yIDxjb2RlPkphclBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+cy4KICAqLwogY2xhc3MgSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8gZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnRSb290SW5mbyB7Ci0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgewotCWZOb25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwotCXJldHVybiBmTm9uSmF2YVJlc291cmNlczsKLX0KKwkvLyBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSAoU3RyaW5nW10pIHRvIGEgc2l6ZS0yIGFycmF5IG9mIEFycmF5PFN0cmluZz4sIHRoZSBmaXJzdCBlbGVtZW50IGJlaW5nIHRoZSAuY2xhc3MgZmlsZSBuYW1lcywgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBiZWluZyB0aGUgbm9uLUphdmEgcmVzb3VyY2UgbmFtZXMKKwlIYXNodGFibGVPZkFycmF5VG9PYmplY3QgcmF3UGFja2FnZUluZm87CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUNvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQppbmRleCBiYTg2OWNlLi44MzVkMWQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMTcgKzI0LDE3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKIAotCS8qIChub24tSmF2YWRvYykKKwkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewogCQkvLyBJZiBtb2RpZmllZCwgYWxzbyBtb2RpZnkgdGhlIG1ldGhvZCBKYXZhTW9kZWxNYW5hZ2VyI2dldERlZmF1bHRPcHRpb25zTm9Jbml0aWFsaXphdGlvbigpCiAJCS8vIEdldCBvcHRpb25zIG5hbWVzIHNldAogCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkub3B0aW9uTmFtZXM7Ci0JCQorCiAJCS8vIENvbXBpbGVyIHNldHRpbmdzCiAJCU1hcCBkZWZhdWx0T3B0aW9uc01hcCA9IG5ldyBDb21waWxlck9wdGlvbnMoKS5nZXRNYXAoKTsgLy8gY29tcGlsZXIgZGVmYXVsdHMKLQkJCisKIAkJLy8gT3ZlcnJpZGUgc29tZSBjb21waWxlciBkZWZhdWx0cwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUiwgSmF2YUNvcmUuR0VORVJBVEUpOwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9VTlVTRURfTE9DQUwsIEphdmFDb3JlLlBSRVNFUlZFKTsKQEAgLTQzLDIxICs0MywyMiBAQAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19DQVNFX1NFTlNJVElWRSwgSmF2YUNvcmUuRU5BQkxFRCk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9ET0NfQ09NTUVOVF9TVVBQT1JULCBKYXZhQ29yZS5FTkFCTEVEKTsKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0ZPUkJJRERFTl9SRUZFUkVOQ0UsIEphdmFDb3JlLkVSUk9SKTsKLQkJCisKIAkJLy8gQnVpbGRlciBzZXR0aW5ncwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCwgSmF2YUNvcmUuQUJPUlQpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIEphdmFDb3JlLldBUk5JTkcpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCBKYXZhQ29yZS5DTEVBTik7IAotCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFQ1JFQVRFX01PRElGSUVEX0NMQVNTX0ZJTEVTX0lOX09VVFBVVF9GT0xERVIsIEphdmFDb3JlLklHTk9SRSk7IAorCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRILCBKYXZhQ29yZS5BQk9SVCk7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfRFVQTElDQVRFX1JFU09VUkNFLCBKYXZhQ29yZS5XQVJOSU5HKTsKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCBKYXZhQ29yZS5DTEVBTik7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfUkVDUkVBVEVfTU9ESUZJRURfQ0xBU1NfRklMRVNfSU5fT1VUUFVUX0ZPTERFUiwgSmF2YUNvcmUuSUdOT1JFKTsKIAogCQkvLyBKYXZhQ29yZSBzZXR0aW5ncwotCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX09SREVSLCBKYXZhQ29yZS5JR05PUkUpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSU5DT01QTEVURV9DTEFTU1BBVEgsIEphdmFDb3JlLkVSUk9SKTsgCi0JCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCwgSmF2YUNvcmUuRVJST1IpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSU5DT01QQVRJQkxFX0pES19MRVZFTCwgSmF2YUNvcmUuSUdOT1JFKTsgCi0JCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TLCBKYXZhQ29yZS5FTkFCTEVEKTsgCi0JCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfTVVMVElQTEVfT1VUUFVUX0xPQ0FUSU9OUywgSmF2YUNvcmUuRU5BQkxFRCk7IAorCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX09SREVSLCBKYXZhQ29yZS5JR05PUkUpOworCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9JTkNPTVBMRVRFX0NMQVNTUEFUSCwgSmF2YUNvcmUuRVJST1IpOworCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIEphdmFDb3JlLkVSUk9SKTsKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSU5DT01QQVRJQkxFX0pES19MRVZFTCwgSmF2YUNvcmUuSUdOT1JFKTsKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMsIEphdmFDb3JlLkVOQUJMRUQpOworCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMsIEphdmFDb3JlLkVOQUJMRUQpOworCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9PVVRQVVRfTE9DQVRJT05fT1ZFUkxBUFBJTkdfQU5PVEhFUl9TT1VSQ0UsIEphdmFDb3JlLldBUk5JTkcpOwogCiAJCS8vIGVuY29kaW5nIHNldHRpbmcgY29tZXMgZnJvbSByZXNvdXJjZSBwbHVnLWluCiAJCW9wdGlvbk5hbWVzLmFkZChKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKQEAgLTc3LDI3ICs3OCw1NSBAQAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9JTVBMSUNJVF9RVUFMSUZJQ0FUSU9OLCBKYXZhQ29yZS5ESVNBQkxFRCk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfU1RBVElDX0ZJTkFMX0ZJRUxEX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9BUkdVTUVOVF9QUkVGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfU1RBVElDX0ZJTkFMX0ZJRUxEX1NVRkZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfTE9DQUxfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9BUkdVTUVOVF9TVUZGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZPUkJJRERFTl9SRUZFUkVOQ0VfQ0hFQ0ssIEphdmFDb3JlLkVOQUJMRUQpOwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9ESVNDT1VSQUdFRF9SRUZFUkVOQ0VfQ0hFQ0ssIEphdmFDb3JlLkRJU0FCTEVEKTsKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfQ0FNRUxfQ0FTRV9NQVRDSCwgSmF2YUNvcmUuRU5BQkxFRCk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX1NVR0dFU1RfU1RBVElDX0lNUE9SVFMsIEphdmFDb3JlLkVOQUJMRUQpOwotCQkKKwogCQkvLyBUaW1lIG91dCBmb3IgcGFyYW1ldGVyIG5hbWVzCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5USU1FT1VUX0ZPUl9QQVJBTUVURVJfTkFNRV9GUk9NX0FUVEFDSEVEX0pBVkFET0MsICI1MCIpOyAvLyROT04tTkxTLTEkCiAKIAkJLy8gU3RvcmUgZGVmYXVsdCB2YWx1ZXMgdG8gZGVmYXVsdCBwcmVmZXJlbmNlcwotCSAJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSAoKElTY29wZUNvbnRleHQpIG5ldyBEZWZhdWx0U2NvcGUoKSkuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOworCSAJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBEZWZhdWx0U2NvcGUuSU5TVEFOQ0UuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOwogCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZhdWx0T3B0aW9uc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CiAJCQlTdHJpbmcgb3B0aW9uTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwogCQkJZGVmYXVsdFByZWZlcmVuY2VzLnB1dChvcHRpb25OYW1lLCAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCkpOwogCQkJb3B0aW9uTmFtZXMuYWRkKG9wdGlvbk5hbWUpOwogCQl9CisKKwkJLy8gSW5pdGlhbGl6ZSBkZXByZWNhdGVkIG9wdGlvbnMKKwkJaW5pdGlhbGl6ZURlcHJlY2F0ZWRPcHRpb25zKCk7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgQXMgdXNpbmcgZGVwcmVjYXRlZCBvcHRpb25zCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZXByZWNhdGVkT3B0aW9ucygpIHsKKwkJTWFwIGRlcHJlY2F0ZWRPcHRpb25zID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVwcmVjYXRlZE9wdGlvbnM7CisJCWRlcHJlY2F0ZWRPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTUVNQkVSLAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fRklFTEQsCisJCQkJRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9BTk5PVEFUSU9OX09OX01FVEhPRCwKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fUEFDS0FHRSwKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fVFlQRQorCQkJfSk7CisJCWRlcHJlY2F0ZWRPcHRpb25zLnB1dChEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT04sCisJCQluZXcgU3RyaW5nW10geworCQkJCURlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9GSUVMRCwKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTUVUSE9ELAorCQkJCURlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9QQUNLQUdFLAorCQkJCURlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9UWVBFLAorCQkJCURlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9MT0NBTF9WQVJJQUJMRSwKKwkJCQlEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fUEFSQU1FVEVSCisJCQl9KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhQ29yZVByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUNvcmVQcmVmZXJlbmNlTW9kaWZ5TGlzdGVuZXIuamF2YQppbmRleCAzZTBiMmFhLi41ZmIxMDEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhQ29yZVByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFDb3JlUHJlZmVyZW5jZU1vZGlmeUxpc3RlbmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7CiAKIHB1YmxpYyBjbGFzcyBKYXZhQ29yZVByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lciBleHRlbmRzIFByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lciB7Ci0JCisKIAlzdGF0aWMgaW50IFBSRUZJWF9MRU5HVEggPSBKYXZhTW9kZWxNYW5hZ2VyLkNQX0NPTlRBSU5FUl9QUkVGRVJFTkNFU19QUkVGSVgubGVuZ3RoKCk7CiAJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwogCkBAIC0zMCw3ICszMCw3IEBACiAJCWNsZWFuSmF2YUNvcmUoaW5zdGFuY2Uubm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpKTsKIAkJcmV0dXJuIHN1cGVyLnByZUFwcGx5KG5vZGUpOwogCX0KLQkKKwogCS8qKgogCSAqIENsZWFuIGltcG9ydGVkIHByZWZlcmVuY2VzIGZyb20gb2Jzb2xldGUga2V5cy4KIAkgKgpAQCAtNTMsNyArNTMsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciBhIGphdmEgcHJvamVjdCByZWZlcmVuY2VkIGluIHByb3BlcnR5IGtleQogCSAqIGlzIHN0aWxsIGxvbmdlciBhY2Nlc3NpYmxlIG9yIG5vdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKIAkgKiBAcmV0dXJuIHRydWUgaWYgYSBwcm9qZWN0IGlzIHJlZmVyZW5jZWQgaW4gZ2l2ZW4ga2V5IGFuZCB0aGlzIHByb2plY3QKIAkgKiAJaXMgc3RpbGwgYWNjZXNzaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgpAQCAtNjIsNyArNjIsNyBAQAogCQlpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZignfCcsIFBSRUZJWF9MRU5HVEgpOwogCQlpZiAoaW5kZXggPiAwKSB7CiAJCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKFBSRUZJWF9MRU5HVEgsIGluZGV4KS50cmltKCk7Ci0JCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOworCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgdGhpcy5qYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwogCQkJaWYgKHByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnQuamF2YQppbmRleCAxNDkyNTQwLi5kZTlhOWQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTIgKzE0LDE2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIApAQCAtNjAsNiArNjQsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBKRU1fQ09VTlQgPSAnISc7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9MT0NBTFZBUklBQkxFID0gJ0AnOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBKRU1fVFlQRV9QQVJBTUVURVIgPSAnXSc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9BTk5PVEFUSU9OID0gJ30nOwogCiAJLyoqCiAJICogVGhpcyBlbGVtZW50J3MgcGFyZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCkBAIC02OSw3ICs3NCw3IEBACiAKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFFbGVtZW50W10gTk9fRUxFTUVOVFMgPSBuZXcgSmF2YUVsZW1lbnRbMF07CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fSU5GTyA9IG5ldyBPYmplY3QoKTsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdHMgYSBoYW5kbGUgZm9yIGEgamF2YSBlbGVtZW50IHdpdGgKIAkgKiB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCkBAIC0xMDksMTQgKzExNCwxNCBAQAogCSAqIEBzZWUgT2JqZWN0I2VxdWFscwogCSAqLwogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkKKwogCQlpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLQkKKwogCQkvLyBKYXZhIG1vZGVsIHBhcmVudCBpcyBudWxsCiAJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCQorCiAJCS8vIGFzc3VtZSBpbnN0YW5jZW9mIGNoZWNrIGlzIGRvbmUgaW4gc3ViY2xhc3MKLQkJSmF2YUVsZW1lbnQgb3RoZXIgPSAoSmF2YUVsZW1lbnQpIG87CQkKKwkJSmF2YUVsZW1lbnQgb3RoZXIgPSAoSmF2YUVsZW1lbnQpIG87CiAJCXJldHVybiBnZXRFbGVtZW50TmFtZSgpLmVxdWFscyhvdGhlci5nZXRFbGVtZW50TmFtZSgpKSAmJgogCQkJCXRoaXMucGFyZW50LmVxdWFscyhvdGhlci5wYXJlbnQpOwogCX0KQEAgLTEzOSw2ICsxNDQsNyBAQAogCQkJCWNhc2UgSkVNX0lNUE9SVERFQ0xBUkFUSU9OOgogCQkJCWNhc2UgSkVNX0xPQ0FMVkFSSUFCTEU6CiAJCQkJY2FzZSBKRU1fVFlQRV9QQVJBTUVURVI6CisJCQkJY2FzZSBKRU1fQU5OT1RBVElPTjoKIAkJCQkJYnVmZmVyLmFwcGVuZChKRU1fRVNDQVBFKTsKIAkJCX0KIAkJCWJ1ZmZlci5hcHBlbmQoY2hhcmFjdGVyKTsKQEAgLTE0OCw3ICsxNTQsNyBAQAogCSAqIEBzZWUgSUphdmFFbGVtZW50CiAJICovCiAJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkKKwogCQl0cnkgewogCQkJZ2V0RWxlbWVudEluZm8oKTsKIAkJCXJldHVybiB0cnVlOwpAQCAtMTU3LDcgKzE2Myw3IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIDxjb2RlPkFTVE5vZGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5KYXZhRWxlbWVudDwvY29kZT4KIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIG5vZGUuCkBAIC0xNzAsMjEgKzE3NiwyMSBAQAogCSAqIFB1dHMgdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudCBpbmZvIGluIHRoZSBnaXZlbiBtYXAuCiAJICovCiAJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVJbmZvcyhPYmplY3QgaW5mbywgSGFzaE1hcCBuZXdFbGVtZW50cywgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkKKwogCS8qKgogCSAqIEBzZWUgSUphdmFFbGVtZW50CiAJICovCiAJcHVibGljIElKYXZhRWxlbWVudCBnZXRBbmNlc3RvcihpbnQgYW5jZXN0b3JUeXBlKSB7Ci0JCQorCiAJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gdGhpczsKIAkJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkgewogCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBhbmNlc3RvclR5cGUpICByZXR1cm4gZWxlbWVudDsKIAkJCWVsZW1lbnQ9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CiAJCX0KLQkJcmV0dXJuIG51bGw7CQkJCQorCQlyZXR1cm4gbnVsbDsKIAl9CiAJLyoqCi0JICogQHNlZSBJUGFyZW50IAorCSAqIEBzZWUgSVBhcmVudAogCSAqLwogCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlPYmplY3QgZWxlbWVudEluZm8gPSBnZXRFbGVtZW50SW5mbygpOwpAQCAtMjI1LDcgKzIzMSw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvIGZvciB0aGlzIGhhbmRsZS4gIAorCSAqIFJldHVybnMgdGhlIGluZm8gZm9yIHRoaXMgaGFuZGxlLgogCSAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBvcGVuLCBpdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIGFyZSBvcGVuZWQuCiAJICogRG9lcyBub3QgcmV0dXJuIG51bGwuCiAJICogTk9URTogQmluYXJ5VHlwZSBpbmZvcyBhcmUgTk9UIHJvb3RlZCB1bmRlciBKYXZhRWxlbWVudEluZm8uCkBAIC0yMzUsNyArMjQxLDcgQEAKIAkJcmV0dXJuIGdldEVsZW1lbnRJbmZvKG51bGwpOwogCX0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvIGZvciB0aGlzIGhhbmRsZS4gIAorCSAqIFJldHVybnMgdGhlIGluZm8gZm9yIHRoaXMgaGFuZGxlLgogCSAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBvcGVuLCBpdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIGFyZSBvcGVuZWQuCiAJICogRG9lcyBub3QgcmV0dXJuIG51bGwuCiAJICogTk9URTogQmluYXJ5VHlwZSBpbmZvcyBhcmUgTk9UIHJvb3RlZCB1bmRlciBKYXZhRWxlbWVudEluZm8uCkBAIC0zMTgsNyArMzI0LDcgQEAKIAkgKiBAc2VlIElKYXZhRWxlbWVudAogCSAqLwogCXB1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE9wZW5hYmxlUGFyZW50KCk7CQorCQlyZXR1cm4gZ2V0T3BlbmFibGVQYXJlbnQoKTsKIAl9CiAJLyoqCiAJICogUmV0dXJuIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBJT3BlbmFibGUgaW4gdGhlIHBhcmVudApAQCAtMzQ4LDYgKzM1NCwxMCBAQAogCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0UHJpbWFyeUVsZW1lbnQoYm9vbGVhbiBjaGVja093bmVyKSB7CiAJCXJldHVybiB0aGlzOwogCX0KKwlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCQlyZXR1cm4gcmVzb3VyY2UoKTsKKwl9CisJcHVibGljIGFic3RyYWN0IElSZXNvdXJjZSByZXNvdXJjZSgpOwogCS8qKgogCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24KIAkgKiBpbiB0aGlzIGVsZW1lbnQuICBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNnZXRFbGVtZW50QXQ8L2NvZGU+LApAQCAtNDA4LDcgKzQxOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQjZ2V0U2NoZWR1bGluZ1J1bGUoKQogCSAqLwogCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlKCk7CiAJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CiAJCQljbGFzcyBOb1Jlc291cmNlU2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewogCQkJCXB1YmxpYyBJUGF0aCBwYXRoOwpAQCAtNDM3LDcgKzQ0Nyw3IEBACiAJCX0KIAl9CiAJLyoqCi0JICogQHNlZSBJUGFyZW50IAorCSAqIEBzZWUgSVBhcmVudAogCSAqLwogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCS8vIGlmIEkgYW0gbm90IG9wZW4sIHJldHVybiB0cnVlIHRvIGF2b2lkIG9wZW5pbmcgKGNhc2Ugb2YgYSBKYXZhIHByb2plY3QsIGEgY29tcGlsYXRpb24gdW5pdCBvciBhIGNsYXNzIGZpbGUpLgpAQCAtNDcxLDcgKzQ4MSw3IEBACiAJCX0KIAkJcmV0dXJuIHBhcmVudEVsZW1lbnQgIT0gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElKYXZhRWxlbWVudAogCSAqLwpAQCAtNDgyLDcgKzQ5MiwxMCBAQAogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgbm90IHByZXNlbnQgZXhjZXB0aW9uIGZvciB0aGlzIGVsZW1lbnQuCiAJICovCiAJcHVibGljIEphdmFNb2RlbEV4Y2VwdGlvbiBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCQlyZXR1cm4gbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXdEb2VzTm90RXhpc3RTdGF0dXMoKSk7CisJfQorCXByb3RlY3RlZCBKYXZhTW9kZWxTdGF0dXMgbmV3RG9lc05vdEV4aXN0U3RhdHVzKCkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpOwogCX0KIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IEphdmEgbW9kZWwgZXhjZXB0aW9uIGZvciB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzLgpAQCAtNTI4LDcgKzU0MSw3IEBACiAJLyoqCiAJICovCiAJcHVibGljIFN0cmluZyByZWFkYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnROYW1lKCk7CisJCXJldHVybiBnZXRFbGVtZW50TmFtZSgpOwogCX0KIAlwdWJsaWMgSmF2YUVsZW1lbnQgcmVzb2x2ZWQoQmluZGluZyBiaW5kaW5nKSB7CiAJCXJldHVybiB0aGlzOwpAQCAtNTY0LDkgKzU3Nyw5IEBACiAJcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogCQlPYmplY3QgaW5mbyA9IHRoaXMudG9TdHJpbmdJbmZvKHRhYiwgYnVmZmVyKTsKIAkJaWYgKHRhYiA9PSAwKSB7Ci0JCQl0aGlzLnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7CisJCQl0b1N0cmluZ0FuY2VzdG9ycyhidWZmZXIpOwogCQl9Ci0JCXRoaXMudG9TdHJpbmdDaGlsZHJlbih0YWIsIGJ1ZmZlciwgaW5mbyk7CisJCXRvU3RyaW5nQ2hpbGRyZW4odGFiLCBidWZmZXIsIGluZm8pOwogCX0KIAkvKioKIAkgKiAgRGVidWdnaW5nIHB1cnBvc2VzCkBAIC01ODAsMTQgKzU5MywxNCBAQAogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdXaXRoQW5jZXN0b3JzKGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQl0aGlzLnRvU3RyaW5nSW5mbygwLCBidWZmZXIsIE5PX0lORk8sIHNob3dSZXNvbHZlZEluZm8pOwotCQl0aGlzLnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7CisJCXRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9CiAJLyoqCiAJICogIERlYnVnZ2luZyBwdXJwb3NlcwogCSAqLwogCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nQW5jZXN0b3JzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJSmF2YUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChKYXZhRWxlbWVudCl0aGlzLmdldFBhcmVudCgpOworCQlKYXZhRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEphdmFFbGVtZW50KWdldFBhcmVudCgpOwogCQlpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewogCQkJYnVmZmVyLmFwcGVuZCgiIFtpbiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJcGFyZW50RWxlbWVudC50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBOT19JTkZPLCBmYWxzZS8qZG9uJ3Qgc2hvdyByZXNvbHZlZCBpbmZvKi8pOwpAQCAtNjE5LDcgKzYzMiw3IEBACiAJICogQHBhcmFtIHNob3dSZXNvbHZlZEluZm8gVE9ETwogCSAqLwogCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwogCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAkJaWYgKGluZm8gPT0gbnVsbCkgewogCQkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJApAQCAtNjMxLDUwICs2NDQsMzggQEAKIAlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ05hbWUoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogCQlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOwogCX0KLQkKKwogCXByb3RlY3RlZCBVUkwgZ2V0SmF2YWRvY0Jhc2VMb2NhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CiAJCWlmIChyb290ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAKIAkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk9IHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLQkJCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQllbnRyeT0gZ2V0UmVhbENsYXNzcGF0aEVudHJ5KHJvb3QuZ2V0SmF2YVByb2plY3QoKSwgZW50cnkuZ2V0UGF0aCgpLCByb290LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk9IG51bGw7CisJCQl0cnkgeworCQkJCWVudHJ5PSByb290LmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKTsKKwkJCQlVUkwgdXJsID0gZ2V0TGlicmFyeUphdmFkb2NMb2NhdGlvbihlbnRyeSk7CisJCQkJaWYgKHVybCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB1cmw7CiAJCQkJfQogCQkJfQotCQkJcmV0dXJuIGdldExpYnJhcnlKYXZhZG9jTG9jYXRpb24oZW50cnkpOworCQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQkJCS8vIFByb2NlZWQgd2l0aCByYXcgY2xhc3NwYXRoCisJCQl9CisJCQkKKwkJCWVudHJ5PSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CisJCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7CisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgorCQkJCQlyZXR1cm4gZ2V0TGlicmFyeUphdmFkb2NMb2NhdGlvbihlbnRyeSk7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIG51bGw7CisJCQl9CQkJCiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQotCXByaXZhdGUgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRSZWFsQ2xhc3NwYXRoRW50cnkoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBJUGF0aCBjb250YWluZXJQYXRoLCBJUGF0aCBsaWJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXI9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqcHJvamVjdCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGN1cnIgPSBlbnRyaWVzW2ldOwotCQkJCWlmIChjdXJyID09IG51bGwpIHsKLQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKSB7Ci0JCQkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS52ZXJib3NlX21pc3NiZWhhdmluZ19jb250YWluZXIoanByb2plY3QsIGNvbnRhaW5lclBhdGgsIGVudHJpZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWQ9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoY3Vycik7Ci0JCQkJaWYgKHJlc29sdmVkICE9IG51bGwgJiYgbGliUGF0aC5lcXVhbHMocmVzb2x2ZWQuZ2V0UGF0aCgpKSkgewotCQkJCQlyZXR1cm4gY3VycjsgLy8gcmV0dXJuIHRoZSByZWFsIGVudHJ5Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0JCisKIAlwcm90ZWN0ZWQgc3RhdGljIFVSTCBnZXRMaWJyYXJ5SmF2YWRvY0xvY2F0aW9uKElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXN3aXRjaChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgpAQCAtNjgzLDcgKzY4NCw3IEBACiAJCQlkZWZhdWx0IDoKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRyeSBtdXN0IGJlIG9mIGtpbmQgQ1BFX0xJQlJBUlkgb3IgQ1BFX1ZBUklBQkxFIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQkKKwogCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IGV4dHJhQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewogCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWI9IGV4dHJhQXR0cmlidXRlc1tpXTsKQEAgLTY5OCwxNCArNjk5LDE0IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRBdHRhY2hlZEphdmFkb2MoSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAlpbnQgZ2V0SW5kZXhPZihieXRlW10gYXJyYXksIGJ5dGVbXSB0b0JlRm91bmQsIGludCBzdGFydCkgewogCQlpZiAoYXJyYXkgPT0gbnVsbCB8fCB0b0JlRm91bmQgPT0gbnVsbCkKIAkJCXJldHVybiAtMTsKQEAgLTcyMywxMCArNzI0LDEwIEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIC0xOwotCX0JCisJfQogCS8qCiAJICogV2UgZG9uJ3QgdXNlIGdldENvbnRlbnRFbmNvZGluZygpIG9uIHRoZSBVUkwgY29ubmVjdGlvbiwgYmVjYXVzZSBpdCBtaWdodCBsZWF2ZSBvcGVuIHN0cmVhbXMgYmVoaW5kLgotCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3ODkwIAorCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3ODkwCiAJICovCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRVUkxDb250ZW50cyhTdHJpbmcgZG9jVXJsVmFsdWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwpAQCAtNzM0LDEyICs3MzUsNDEgQEAKIAkJdHJ5IHsKIAkJCVVSTCBkb2NVcmwgPSBuZXcgVVJMKGRvY1VybFZhbHVlKTsKIAkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGRvY1VybC5vcGVuQ29ubmVjdGlvbigpOworCQkJQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBDbGFzc1tde2ludC5jbGFzc307CisJCQlJbnRlZ2VyIHRpbWVvdXRWYWwgPSBuZXcgSW50ZWdlcigxMDAwMCk7CisJCQkvLyBzZXQgdGhlIGNvbm5lY3QgYW5kIHJlYWQgdGltZW91dHMgdXNpbmcgcmVmbGVjdGlvbiBzaW5jZSB0aGVzZSBtZXRob2RzIGFyZSBub3QgYXZhaWxhYmxlIGluIGphdmEgMS40CisJCQlDbGFzcyBVUkxDbGFzcyA9IGNvbm5lY3Rpb24uZ2V0Q2xhc3MoKTsKKwkJCXRyeSB7CisJCQkJTWV0aG9kIGNvbm5lY3RUaW1lb3V0TWV0aG9kID0gVVJMQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNldENvbm5lY3RUaW1lb3V0IiwgcGFyYW1ldGVyVHlwZXMpOyAvLyROT04tTkxTLTEkCisJCQkJTWV0aG9kIHJlYWRUaW1lb3V0TWV0aG9kID0gVVJMQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNldFJlYWRUaW1lb3V0IiwgcGFyYW1ldGVyVHlwZXMpOyAvLyROT04tTkxTLTEkCisJCQkJY29ubmVjdFRpbWVvdXRNZXRob2QuaW52b2tlKGNvbm5lY3Rpb24sIG5ldyBPYmplY3RbXXt0aW1lb3V0VmFsfSk7CisJCQkJcmVhZFRpbWVvdXRNZXRob2QuaW52b2tlKGNvbm5lY3Rpb24sIG5ldyBPYmplY3RbXXt0aW1lb3V0VmFsfSk7CisJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQkKIAkJCWlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgSmFyVVJMQ29ubmVjdGlvbikgewogCQkJCWNvbm5lY3Rpb24yID0gKEphclVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb247CiAJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjMwNwogCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKIAkJCX0KLQkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7CisJCQl0cnkgeworCQkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7CisJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQzMTYKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0MzE2CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCQlTdHJpbmcgZW5jb2RpbmcgPSBjb25uZWN0aW9uLmdldENvbnRlbnRFbmNvZGluZygpOwogCQkJYnl0ZVtdIGNvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgY29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCkpOwogCQkJaWYgKGVuY29kaW5nID09IG51bGwpIHsKQEAgLTc1Myw3ICs3ODMsNyBAQAogCQkJCQkJCWZpbmFsIGludCBjaGFyc2V0SW5kZXggPSBnZXRJbmRleE9mKGNvbnRlbnRzLCBDSEFSU0VULCBvZmZzZXQpOwogCQkJCQkJCWlmIChjaGFyc2V0SW5kZXggIT0gLTEpIHsKIAkJCQkJCQkJaW50IHN0YXJ0ID0gY2hhcnNldEluZGV4ICsgQ0hBUlNFVC5sZW5ndGg7Ci0JCQkJCQkJCWVuY29kaW5nID0gbmV3IFN0cmluZyhjb250ZW50cywgc3RhcnQsIGluZGV4MiAtIHN0YXJ0LCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQllbmNvZGluZyA9IG5ldyBTdHJpbmcoY29udGVudHMsIHN0YXJ0LCBpbmRleDIgLSBzdGFydCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5VVEZfOCk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CkBAIC03NjEsNyArNzkxLDcgQEAKIAkJCX0KIAkJCXRyeSB7CiAJCQkJaWYgKGVuY29kaW5nID09IG51bGwpIHsKLQkJCQkJZW5jb2RpbmcgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldERlZmF1bHRDaGFyc2V0KCk7CisJCQkJCWVuY29kaW5nID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBpZ25vcmUKQEAgLTc3MywxOCArODAzLDIxIEBACiAJCQkJCS8vIHBsYXRmb3JtIGVuY29kaW5nIGlzIHVzZWQKIAkJCQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udGVudHMpOwogCQkJCX0KLQkJCX0JCQkKLSAJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ0FOTk9UX1JFVFJJRVZFX0FUVEFDSEVEX0pBVkFET0MsIHRoaXMpKTsKKwkJCX0KKwkJfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DQU5OT1RfUkVUUklFVkVfQVRUQUNIRURfSkFWQURPQ19USU1FT1VULCB0aGlzKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DQU5OT1RfUkVUUklFVkVfQVRUQUNIRURfSkFWQURPQywgdGhpcykpOwogCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlLiBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA1NTkKKwkJfSBjYXRjaChTb2NrZXRFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlLiBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDc4NDUKKwkJfSBjYXRjaChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBpZ25vcmUuIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Nzg0NQorCQl9IGNhdGNoKFByb3RvY29sRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZS4gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3ODQ1CiAJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotCQkJZS5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DQU5OT1RfUkVUUklFVkVfQVRUQUNIRURfSkFWQURPQywgdGhpcywgU3RyaW5nLnZhbHVlT2Yoc3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpKSkpOworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKIAkJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhCmluZGV4IDA3MGIzMDMuLmVlMGQ3MTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsOCArMjQsOCBAQAogCS8qKgogCSAqIEBzZWUgI2dldEFmZmVjdGVkQ2hpbGRyZW4oKQogCSAqLwotCXByb3RlY3RlZCBJSmF2YUVsZW1lbnREZWx0YVtdIGFmZmVjdGVkQ2hpbGRyZW4gPSBFTVBUWV9ERUxUQTsKLQkKKwlJSmF2YUVsZW1lbnREZWx0YVtdIGFmZmVjdGVkQ2hpbGRyZW4gPSBFTVBUWV9ERUxUQTsKKwogCS8qCiAJICogVGhlIEFTVCBjcmVhdGVkIGR1cmluZyB0aGUgbGFzdCByZWNvbmNpbGUgb3BlcmF0aW9uLgogCSAqIE5vbi1udWxsIG9ubHkgaWZmOgpAQCAtMzMsMzQgKzMzLDM5IEBACiAJICogLSBhbiBBU1Qgd2FzIHJlcXVlc3RlZCBkdXJpbmcgdGhlIGxhc3QgcmVjb25jaWxlIG9wZXJhdGlvbgogCSAqIC0gdGhlIGNoYW5nZWQgZWxlbWVudCBpcyBhbiBJQ29tcGlsYXRpb25Vbml0IGluIHdvcmtpbmcgY29weSBtb2RlCiAJICovCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBhc3QgPSBudWxsOworCUNvbXBpbGF0aW9uVW5pdCBhc3QgPSBudWxsOwogCiAJLyoKIAkgKiBUaGUgZWxlbWVudCB0aGF0IHRoaXMgZGVsdGEgZGVzY3JpYmVzIHRoZSBjaGFuZ2UgdG8uCiAJICovCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBjaGFuZ2VkRWxlbWVudDsKLQkKKwlJSmF2YUVsZW1lbnQgY2hhbmdlZEVsZW1lbnQ7CisKIAkvKioKIAkgKiBDb2xsZWN0aW9uIG9mIHJlc291cmNlIGRlbHRhcyB0aGF0IGNvcnJlc3BvbmQgdG8gbm9uIGphdmEgcmVzb3VyY2VzIGRlbHRhcy4KIAkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlRGVsdGFbXSByZXNvdXJjZURlbHRhcyA9IG51bGw7CisJSVJlc291cmNlRGVsdGFbXSByZXNvdXJjZURlbHRhcyA9IG51bGw7CiAKIAkvKioKIAkgKiBDb3VudGVyIG9mIHJlc291cmNlIGRlbHRhcwogCSAqLwotCXByb3RlY3RlZCBpbnQgcmVzb3VyY2VEZWx0YXNDb3VudGVyOworCWludCByZXNvdXJjZURlbHRhc0NvdW50ZXI7CisKIAkvKioKIAkgKiBAc2VlICNnZXRNb3ZlZEZyb21FbGVtZW50KCkKIAkgKi8KLQlwcm90ZWN0ZWQgSUphdmFFbGVtZW50IG1vdmVkRnJvbUhhbmRsZSA9IG51bGw7CisJSUphdmFFbGVtZW50IG1vdmVkRnJvbUhhbmRsZSA9IG51bGw7CisKIAkvKioKIAkgKiBAc2VlICNnZXRNb3ZlZFRvRWxlbWVudCgpCiAJICovCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBtb3ZlZFRvSGFuZGxlID0gbnVsbDsKKwlJSmF2YUVsZW1lbnQgbW92ZWRUb0hhbmRsZSA9IG51bGw7CisKKwlJSmF2YUVsZW1lbnREZWx0YVtdIGFubm90YXRpb25EZWx0YXMgPSBFTVBUWV9ERUxUQTsKKwogCS8qKgogCSAqIEVtcHR5IGFycmF5IG9mIElKYXZhRWxlbWVudERlbHRhCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyAgSUphdmFFbGVtZW50RGVsdGFbXSBFTVBUWV9ERUxUQT0gbmV3IElKYXZhRWxlbWVudERlbHRhW10ge307CisJc3RhdGljICBJSmF2YUVsZW1lbnREZWx0YVtdIEVNUFRZX0RFTFRBPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7fTsKIC8qKgogICogQ3JlYXRlcyB0aGUgcm9vdCBkZWx0YS4gVG8gY3JlYXRlIHRoZSBuZXN0ZWQgZGVsdGEKICAqIGhpZXJhcmNoaWVzIHVzZSB0aGUgZm9sbG93aW5nIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZSByb290CkBAIC05NSwyNSArMTAwLDIzIEBACiAJCQl0aGlzLmNoYW5nZUZsYWdzIHw9IEZfQ0hJTERSRU47CiAJfQogCi0JLy8gaWYgYSBjaGlsZCBkZWx0YSBpcyBhZGRlZCB0byBhIGNvbXBpbGF0aW9uIHVuaXQgZGVsdGEgb3IgYmVsb3csIAorCS8vIGlmIGEgY2hpbGQgZGVsdGEgaXMgYWRkZWQgdG8gYSBjb21waWxhdGlvbiB1bml0IGRlbHRhIG9yIGJlbG93LAogCS8vIGl0J3MgYSBmaW5lIGdyYWluZWQgZGVsdGEKIAlpZiAodGhpcy5jaGFuZ2VkRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID49IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0JCXRoaXMuZmluZUdyYWluZWQoKTsKKwkJZmluZUdyYWluZWQoKTsKIAl9Ci0JCi0JaWYgKHRoaXMuYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGggPT0gMCkgeworCisJaWYgKHRoaXMuYWZmZWN0ZWRDaGlsZHJlbiA9PSBudWxsIHx8IHRoaXMuYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGggPT0gMCkgewogCQl0aGlzLmFmZmVjdGVkQ2hpbGRyZW4gPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7Y2hpbGR9OwogCQlyZXR1cm47CiAJfQogCUphdmFFbGVtZW50RGVsdGEgZXhpc3RpbmdDaGlsZCA9IG51bGw7CiAJaW50IGV4aXN0aW5nQ2hpbGRJbmRleCA9IC0xOwotCWlmICh0aGlzLmFmZmVjdGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZXF1YWxzQW5kU2FtZVBhcmVudCh0aGlzLmFmZmVjdGVkQ2hpbGRyZW5baV0uZ2V0RWxlbWVudCgpLCBjaGlsZC5nZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKLQkJCQlleGlzdGluZ0NoaWxkID0gKEphdmFFbGVtZW50RGVsdGEpdGhpcy5hZmZlY3RlZENoaWxkcmVuW2ldOwotCQkJCWV4aXN0aW5nQ2hpbGRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGVxdWFsc0FuZFNhbWVQYXJlbnQodGhpcy5hZmZlY3RlZENoaWxkcmVuW2ldLmdldEVsZW1lbnQoKSwgY2hpbGQuZ2V0RWxlbWVudCgpKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQlleGlzdGluZ0NoaWxkID0gKEphdmFFbGVtZW50RGVsdGEpdGhpcy5hZmZlY3RlZENoaWxkcmVuW2ldOworCQkJZXhpc3RpbmdDaGlsZEluZGV4ID0gaTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChleGlzdGluZ0NoaWxkID09IG51bGwpIHsgLy9uZXcgYWZmZWN0ZWQgY2hpbGQKQEAgLTEyNiw3ICsxMjksNyBAQAogCQkJCQljYXNlIENIQU5HRUQ6IC8vIGNoaWxkIHdhcyBhZGRlZCB0aGVuIGNoYW5nZWQgLT4gaXQgaXMgYWRkZWQKIAkJCQkJCXJldHVybjsKIAkJCQkJY2FzZSBSRU1PVkVEOiAvLyBjaGlsZCB3YXMgYWRkZWQgdGhlbiByZW1vdmVkIC0+IG5vb3AKLQkJCQkJCXRoaXMuYWZmZWN0ZWRDaGlsZHJlbiA9IHRoaXMucmVtb3ZlQW5kU2hyaW5rQXJyYXkodGhpcy5hZmZlY3RlZENoaWxkcmVuLCBleGlzdGluZ0NoaWxkSW5kZXgpOworCQkJCQkJdGhpcy5hZmZlY3RlZENoaWxkcmVuID0gcmVtb3ZlQW5kU2hyaW5rQXJyYXkodGhpcy5hZmZlY3RlZENoaWxkcmVuLCBleGlzdGluZ0NoaWxkSW5kZXgpOwogCQkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTE1MywxOSArMTU2LDE5IEBACiAJCQkJCQkJSmF2YUVsZW1lbnREZWx0YSBjaGlsZHNDaGlsZCA9IChKYXZhRWxlbWVudERlbHRhKSBjaGlsZHJlbltpXTsKIAkJCQkJCQlleGlzdGluZ0NoaWxkLmFkZEFmZmVjdGVkQ2hpbGQoY2hpbGRzQ2hpbGQpOwogCQkJCQkJfQotCQkJCQkJCisKIAkJCQkJCS8vIHVwZGF0ZSBmbGFncwogCQkJCQkJYm9vbGVhbiBjaGlsZEhhZENvbnRlbnRGbGFnID0gKGNoaWxkLmNoYW5nZUZsYWdzICYgRl9DT05URU5UKSAhPSAwOwogCQkJCQkJYm9vbGVhbiBleGlzdGluZ0NoaWxkSGFkQ2hpbGRyZW5GbGFnID0gKGV4aXN0aW5nQ2hpbGQuY2hhbmdlRmxhZ3MgJiBGX0NISUxEUkVOKSAhPSAwOwogCQkJCQkJZXhpc3RpbmdDaGlsZC5jaGFuZ2VGbGFncyB8PSBjaGlsZC5jaGFuZ2VGbGFnczsKLQkJCQkJCQotCQkJCQkJLy8gcmVtb3ZlIEZfQ09OVEVOVCBmbGFnIGlmIGV4aXN0aW5nIGNoaWxkIGhhZCBGX0NISUxEUkVOIGZsYWcgc2V0IAotCQkJCQkJLy8gKGNhc2Ugb2YgZmluZSBncmFpbmVkIGRlbHRhIChleGlzdGluZyBjaGlsZCkgYW5kIGRlbHRhIGNvbWluZyBmcm9tIAorCisJCQkJCQkvLyByZW1vdmUgRl9DT05URU5UIGZsYWcgaWYgZXhpc3RpbmcgY2hpbGQgaGFkIEZfQ0hJTERSRU4gZmxhZyBzZXQKKwkJCQkJCS8vIChjYXNlIG9mIGZpbmUgZ3JhaW5lZCBkZWx0YSAoZXhpc3RpbmcgY2hpbGQpIGFuZCBkZWx0YSBjb21pbmcgZnJvbQogCQkJCQkJLy8gRGVsdGFQcm9jZXNzb3IgKGNoaWxkKSkKIAkJCQkJCWlmIChjaGlsZEhhZENvbnRlbnRGbGFnICYmIGV4aXN0aW5nQ2hpbGRIYWRDaGlsZHJlbkZsYWcpIHsKIAkJCQkJCQlleGlzdGluZ0NoaWxkLmNoYW5nZUZsYWdzICY9IH5GX0NPTlRFTlQ7CiAJCQkJCQl9Ci0JCQkJCQkKKwogCQkJCQkJLy8gYWRkIHRoZSBub24tamF2YSByZXNvdXJjZSBkZWx0YXMgaWYgbmVlZGVkCiAJCQkJCQkvLyBub3RlIHRoYXQgdGhlIGNoaWxkIGRlbHRhIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBleGlzdGluZyBjaGlsZCBkZWx0YQogCQkJCQkJLy8gYXMgbm9uLWphdmEgcmVzb3VyY2UgZGVsdGFzIGFyZSBhbHdheXMgY3JlYXRlZCBsYXN0IChieSB0aGUgRGVsdGFQcm9jZXNzb3IpCkBAIC0xNzQsMTEgKzE3NywxMSBAQAogCQkJCQkJCWV4aXN0aW5nQ2hpbGQucmVzb3VyY2VEZWx0YXMgPSByZXNEZWx0YXM7CiAJCQkJCQkJZXhpc3RpbmdDaGlsZC5yZXNvdXJjZURlbHRhc0NvdW50ZXIgPSBjaGlsZC5yZXNvdXJjZURlbHRhc0NvdW50ZXI7CiAJCQkJCQl9Ci0JCQkJCQkKKwogCQkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCWRlZmF1bHQ6IAorCQkJZGVmYXVsdDoKIAkJCQkvLyB1bmtub3duIC0+IGV4aXN0aW5nIGNoaWxkIGJlY29tZXMgdGhlIGNoaWxkIHdpdGggdGhlIGV4aXN0aW5nIGNoaWxkJ3MgZmxhZ3MKIAkJCQlpbnQgZmxhZ3MgPSBleGlzdGluZ0NoaWxkLmdldEZsYWdzKCk7CiAJCQkJdGhpcy5hZmZlY3RlZENoaWxkcmVuW2V4aXN0aW5nQ2hpbGRJbmRleF0gPSBjaGlsZDsKQEAgLTE4OSw3ICsxOTIsNyBAQAogLyoqCiAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgZGVsdGFzIHJlc3VsdGluZyBmcm9tIGFuIGFkZCBvcGVyYXRpb24uCiAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFkZCBkZWx0YXMuCi0gKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YQogICogYW5kIHRoZW4gYW4gYWRkIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KICAqLwogcHVibGljIHZvaWQgYWRkZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKQEAgLTIxOCwyMSArMjIxLDIxIEBACiAJCQl0aGlzLmtpbmQgPSBDSEFOR0VEOwogCQkJdGhpcy5jaGFuZ2VGbGFncyB8PSBGX0NPTlRFTlQ7CiAJfQotCWlmIChyZXNvdXJjZURlbHRhcyA9PSBudWxsKSB7Ci0JCXJlc291cmNlRGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhWzVdOwotCQlyZXNvdXJjZURlbHRhc1tyZXNvdXJjZURlbHRhc0NvdW50ZXIrK10gPSBjaGlsZDsKKwlpZiAodGhpcy5yZXNvdXJjZURlbHRhcyA9PSBudWxsKSB7CisJCXRoaXMucmVzb3VyY2VEZWx0YXMgPSBuZXcgSVJlc291cmNlRGVsdGFbNV07CisJCXRoaXMucmVzb3VyY2VEZWx0YXNbdGhpcy5yZXNvdXJjZURlbHRhc0NvdW50ZXIrK10gPSBjaGlsZDsKIAkJcmV0dXJuOwogCX0KLQlpZiAocmVzb3VyY2VEZWx0YXMubGVuZ3RoID09IHJlc291cmNlRGVsdGFzQ291bnRlcikgeworCWlmICh0aGlzLnJlc291cmNlRGVsdGFzLmxlbmd0aCA9PSB0aGlzLnJlc291cmNlRGVsdGFzQ291bnRlcikgewogCQkvLyBuZWVkIGEgcmVzaXplCi0JCVN5c3RlbS5hcnJheWNvcHkocmVzb3VyY2VEZWx0YXMsIDAsIChyZXNvdXJjZURlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtyZXNvdXJjZURlbHRhc0NvdW50ZXIgKiAyXSksIDAsIHJlc291cmNlRGVsdGFzQ291bnRlcik7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5yZXNvdXJjZURlbHRhcywgMCwgKHRoaXMucmVzb3VyY2VEZWx0YXMgPSBuZXcgSVJlc291cmNlRGVsdGFbdGhpcy5yZXNvdXJjZURlbHRhc0NvdW50ZXIgKiAyXSksIDAsIHRoaXMucmVzb3VyY2VEZWx0YXNDb3VudGVyKTsKIAl9Ci0JcmVzb3VyY2VEZWx0YXNbcmVzb3VyY2VEZWx0YXNDb3VudGVyKytdID0gY2hpbGQ7CisJdGhpcy5yZXNvdXJjZURlbHRhc1t0aGlzLnJlc291cmNlRGVsdGFzQ291bnRlcisrXSA9IGNoaWxkOwogfQogLyoqCiAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgZGVsdGFzIHJlc3VsdGluZyBmcm9tIGEgY2hhbmdlIG9wZXJhdGlvbi4KICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgY2hhbmdlIGRlbHRhcy4KLSAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3QgZGVsdGEgCisgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhCiAgKiBhbmQgdGhlbiBhIGNoYW5nZSBvcGVyYXRpb24gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QuCiAgKi8KIHB1YmxpYyBKYXZhRWxlbWVudERlbHRhIGNoYW5nZWQoSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBjaGFuZ2VGbGFnKSB7CkBAIC0yNzEsNyArMjc0LDcgQEAKIAlKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgPSBkZWx0YTsKIAlBcnJheUxpc3QgYW5jZXN0b3JzPSBnZXRBbmNlc3RvcnMoZWxlbWVudCk7CiAJaWYgKGFuY2VzdG9ycyA9PSBudWxsKSB7Ci0JCWlmICh0aGlzLmVxdWFsc0FuZFNhbWVQYXJlbnQoZGVsdGEuZ2V0RWxlbWVudCgpLCBnZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwkJaWYgKGVxdWFsc0FuZFNhbWVQYXJlbnQoZGVsdGEuZ2V0RWxlbWVudCgpLCBnZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKIAkJCS8vIHRoZSBlbGVtZW50IGJlaW5nIGNoYW5nZWQgaXMgdGhlIHJvb3QgZWxlbWVudAogCQkJdGhpcy5raW5kPSBkZWx0YS5raW5kOwogCQkJdGhpcy5jaGFuZ2VGbGFncyA9IGRlbHRhLmNoYW5nZUZsYWdzOwpAQCAtMzAwLDcgKzMwMyw3IEBACiAgKiBpbiB0aGUgZGVsdGEgdHJlZSwgb3IgbnVsbCwgaWYgbm8gZGVsdGEgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZvdW5kLgogICovCiBwcm90ZWN0ZWQgSmF2YUVsZW1lbnREZWx0YSBmaW5kKElKYXZhRWxlbWVudCBlKSB7Ci0JaWYgKHRoaXMuZXF1YWxzQW5kU2FtZVBhcmVudCh0aGlzLmNoYW5nZWRFbGVtZW50LCBlKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJaWYgKGVxdWFsc0FuZFNhbWVQYXJlbnQodGhpcy5jaGFuZ2VkRWxlbWVudCwgZSkpIHsgLy8gaGFuZGxlIGNhc2Ugb2YgdHdvIGphcnMgdGhhdCBjYW4gYmUgZXF1YWxzIGJ1dCBub3QgaW4gdGhlIHNhbWUgcHJvamVjdAogCQlyZXR1cm4gdGhpczsKIAl9IGVsc2UgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewpAQCAtMzU1LDYgKzM1OCw5IEBACiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdEFTVCgpIHsKIAlyZXR1cm4gdGhpcy5hc3Q7CiB9CitwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRBbm5vdGF0aW9uRGVsdGFzKCkgeworCXJldHVybiB0aGlzLmFubm90YXRpb25EZWx0YXM7Cit9CiAvKioKICAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKICAqLwpAQCAtMzc4LDcgKzM4NCw3IEBACiAKIAlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuT2ZUeXBlID0gbmV3IElKYXZhRWxlbWVudERlbHRhW2NoaWxkcmVuLnNpemUoKV07CiAJY2hpbGRyZW4udG9BcnJheShjaGlsZHJlbk9mVHlwZSk7Ci0JCisKIAlyZXR1cm4gY2hpbGRyZW5PZlR5cGU7CiB9CiAvKioKQEAgLTM4NiwxNCArMzkyLDE0IEBACiAgKiBkZWx0YS4KICAqLwogcHJvdGVjdGVkIEphdmFFbGVtZW50RGVsdGEgZ2V0RGVsdGFGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGdldEVsZW1lbnQoKSwgZWxlbWVudCkpIC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwlpZiAoZXF1YWxzQW5kU2FtZVBhcmVudChnZXRFbGVtZW50KCksIGVsZW1lbnQpKSAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CiAJCXJldHVybiB0aGlzOwogCWlmICh0aGlzLmFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoID09IDApCiAJCXJldHVybiBudWxsOwogCWludCBjaGlsZHJlbkNvdW50ID0gdGhpcy5hZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsKIAlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuQ291bnQ7IGkrKykgewogCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKEphdmFFbGVtZW50RGVsdGEpdGhpcy5hZmZlY3RlZENoaWxkcmVuW2ldOwotCQlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGRlbHRhLmdldEVsZW1lbnQoKSwgZWxlbWVudCkpIHsgLy8gaGFuZGxlIGNhc2Ugb2YgdHdvIGphcnMgdGhhdCBjYW4gYmUgZXF1YWxzIGJ1dCBub3QgaW4gdGhlIHNhbWUgcHJvamVjdAorCQlpZiAoZXF1YWxzQW5kU2FtZVBhcmVudChkZWx0YS5nZXRFbGVtZW50KCksIGVsZW1lbnQpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKIAkJCXJldHVybiBkZWx0YTsKIAkJfSBlbHNlIHsKIAkJCWRlbHRhID0gZGVsdGEuZ2V0RGVsdGFGb3IoZWxlbWVudCk7CkBAIC00MTksNyArNDI1LDcgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKICAqLwogcHVibGljIElKYXZhRWxlbWVudCBnZXRNb3ZlZFRvRWxlbWVudCgpIHsKLQlyZXR1cm4gbW92ZWRUb0hhbmRsZTsKKwlyZXR1cm4gdGhpcy5tb3ZlZFRvSGFuZGxlOwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCkBAIC00MzEsMTEgKzQzNywxMSBAQAogICogUmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlIGRlbHRhcy4gUmV0dXJuIG51bGwgaWYgbm9uZS4KICAqLwogcHVibGljIElSZXNvdXJjZURlbHRhW10gZ2V0UmVzb3VyY2VEZWx0YXMoKSB7Ci0JaWYgKHJlc291cmNlRGVsdGFzID09IG51bGwpIHJldHVybiBudWxsOwotCWlmIChyZXNvdXJjZURlbHRhcy5sZW5ndGggIT0gcmVzb3VyY2VEZWx0YXNDb3VudGVyKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzb3VyY2VEZWx0YXMsIDAsIHJlc291cmNlRGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW3Jlc291cmNlRGVsdGFzQ291bnRlcl0sIDAsIHJlc291cmNlRGVsdGFzQ291bnRlcik7CisJaWYgKHRoaXMucmVzb3VyY2VEZWx0YXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaWYgKHRoaXMucmVzb3VyY2VEZWx0YXMubGVuZ3RoICE9IHRoaXMucmVzb3VyY2VEZWx0YXNDb3VudGVyKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5yZXNvdXJjZURlbHRhcywgMCwgdGhpcy5yZXNvdXJjZURlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVt0aGlzLnJlc291cmNlRGVsdGFzQ291bnRlcl0sIDAsIHRoaXMucmVzb3VyY2VEZWx0YXNDb3VudGVyKTsKIAl9Ci0JcmV0dXJuIHJlc291cmNlRGVsdGFzOworCXJldHVybiB0aGlzLnJlc291cmNlRGVsdGFzOwogfQogLyoqCiAgKiBBZGRzIHRoZSBuZXcgZWxlbWVudCB0byBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBhcnJheS4KQEAgLTQ1NCwxNCArNDYwLDE0IEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIGluc2VydERlbHRhVHJlZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewogCUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YT0gY3JlYXRlRGVsdGFUcmVlKGVsZW1lbnQsIGRlbHRhKTsKLQlpZiAoIXRoaXMuZXF1YWxzQW5kU2FtZVBhcmVudChlbGVtZW50LCBnZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwlpZiAoIWVxdWFsc0FuZFNhbWVQYXJlbnQoZWxlbWVudCwgZ2V0RWxlbWVudCgpKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CiAJCWFkZEFmZmVjdGVkQ2hpbGQoY2hpbGREZWx0YSk7CiAJfQogfQogLyoqCiAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgZGVsdGFzIHJlc3VsdGluZyBmcm9tIGFuIG1vdmUgb3BlcmF0aW9uLgogICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgIm1vdmUgZnJvbSIgZGVsdGEuCi0gKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YQogICogYW5kIHRoZW4gdGhlIG1vdmUgb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgogICovCiBwdWJsaWMgdm9pZCBtb3ZlZEZyb20oSUphdmFFbGVtZW50IG1vdmVkRnJvbUVsZW1lbnQsIElKYXZhRWxlbWVudCBtb3ZlZFRvRWxlbWVudCkgewpAQCAtNDc0LDcgKzQ4MCw3IEBACiAvKioKICAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgcmVzdWx0aW5nIGZyb20gYW4gbW92ZSBvcGVyYXRpb24uCiAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIHRoZSAibW92ZSB0byIgZGVsdGEuCi0gKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YQogICogYW5kIHRoZW4gdGhlIG1vdmUgb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgogICovCiBwdWJsaWMgdm9pZCBtb3ZlZFRvKElKYXZhRWxlbWVudCBtb3ZlZFRvRWxlbWVudCwgSUphdmFFbGVtZW50IG1vdmVkRnJvbUVsZW1lbnQpIHsKQEAgLTQ5OSw3ICs1MDUsNyBAQAogCWludCBpbmRleCA9IC0xOwogCWlmICh0aGlzLmFmZmVjdGVkQ2hpbGRyZW4gIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZXF1YWxzQW5kU2FtZVBhcmVudCh0aGlzLmFmZmVjdGVkQ2hpbGRyZW5baV0uZ2V0RWxlbWVudCgpLCBjaGlsZC5nZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwkJCWlmIChlcXVhbHNBbmRTYW1lUGFyZW50KHRoaXMuYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRFbGVtZW50KCksIGNoaWxkLmdldEVsZW1lbnQoKSkpIHsgLy8gaGFuZGxlIGNhc2Ugb2YgdHdvIGphcnMgdGhhdCBjYW4gYmUgZXF1YWxzIGJ1dCBub3QgaW4gdGhlIHNhbWUgcHJvamVjdAogCQkJCWluZGV4ID0gaTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTUyNSw3ICs1MzEsNyBAQAogLyoqCiAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgZGVsdGFzIHJlc3VsdGluZyBmcm9tIGFuIGRlbGV0ZSBvcGVyYXRpb24uCiAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIHJlbW92ZWQgZGVsdGFzLgotICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKKyAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3QgZGVsdGEKICAqIGFuZCB0aGVuIHRoZSBkZWxldGUgb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgogICovCiBwdWJsaWMgdm9pZCByZW1vdmVkKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CkBAIC01NDQsNyArNTUwLDcgQEAKIC8qKgogICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhcyByZXN1bHRpbmcgZnJvbSBhIGNoYW5nZSBvcGVyYXRpb24uCiAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGNoYW5nZSBkZWx0YXMuCi0gKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YQogICogYW5kIHRoZW4gYSBjaGFuZ2Ugb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgogICovCiBwdWJsaWMgdm9pZCBzb3VyY2VBdHRhY2hlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewpAQCAtNTU1LDcgKzU2MSw3IEBACiAvKioKICAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgcmVzdWx0aW5nIGZyb20gYSBjaGFuZ2Ugb3BlcmF0aW9uLgogICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBjaGFuZ2UgZGVsdGFzLgotICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKKyAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3QgZGVsdGEKICAqIGFuZCB0aGVuIGEgY2hhbmdlIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KICAqLwogcHVibGljIHZvaWQgc291cmNlRGV0YWNoZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKQEAgLTU2Myw3ICs1NjksNyBAQAogCWRldGFjaGVkRGVsdGEuY2hhbmdlZChGX1NPVVJDRURFVEFDSEVEKTsKIAlpbnNlcnREZWx0YVRyZWUoZWxlbWVudCwgZGV0YWNoZWREZWx0YSk7CiB9Ci0vKiogCisvKioKICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkZWx0YSdzCiAgKiBzdHJ1Y3R1cmUgc3VpdGFibGUgZm9yIGRlYnVnIHB1cnBvc2VzLgogICoKQEAgLTU4MywxMiArNTg5LDEyIEBACiAJCQlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnREZWx0YSkgY2hpbGRyZW5baV0pLnRvRGVidWdTdHJpbmcoZGVwdGggKyAxKSk7CiAJCX0KIAl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZURlbHRhc0NvdW50ZXI7IGkrKykgeworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5yZXNvdXJjZURlbHRhc0NvdW50ZXI7IGkrKykgewogCQlidWZmZXIuYXBwZW5kKCJcbiIpOy8vJE5PTi1OTFMtMSQKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXB0aCsxOyBqKyspIHsKIAkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CiAJCX0KLQkJSVJlc291cmNlRGVsdGEgcmVzb3VyY2VEZWx0YSA9IHJlc291cmNlRGVsdGFzW2ldOworCQlJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gdGhpcy5yZXNvdXJjZURlbHRhc1tpXTsKIAkJYnVmZmVyLmFwcGVuZChyZXNvdXJjZURlbHRhLnRvU3RyaW5nKCkpOwogCQlidWZmZXIuYXBwZW5kKCJbIik7IC8vJE5PTi1OTFMtMSQKIAkJc3dpdGNoIChyZXNvdXJjZURlbHRhLmdldEtpbmQoKSkgewpAQCAtNjA3LDYgKzYxMywxMyBAQAogCQl9CiAJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAogCX0KKwlJSmF2YUVsZW1lbnREZWx0YVtdIGFubm90YXRpb25zID0gZ2V0QW5ub3RhdGlvbkRlbHRhcygpOworCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyArK2kpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoKChKYXZhRWxlbWVudERlbHRhKSBhbm5vdGF0aW9uc1tpXSkudG9EZWJ1Z1N0cmluZyhkZXB0aCArIDEpKTsKKwkJfQorCX0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiBwcm90ZWN0ZWQgYm9vbGVhbiB0b0RlYnVnU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBmbGFncykgewpAQCAtNjg3LDcgKzcwMCwxMyBAQAogCWlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7CiAJCWlmIChwcmV2KQogCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiQ0xBU1NQQVRIIENIQU5HRUQiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJSQVcgQ0xBU1NQQVRIIENIQU5HRUQiKTsgLy8kTk9OLU5MUy0xJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKKwkJaWYgKHByZXYpCisJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJSRVNPTFZFRCBDTEFTU1BBVEggQ0hBTkdFRCIpOyAvLyROT04tTkxTLTEkCiAJCXByZXYgPSB0cnVlOwogCX0KIAlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7CkBAIC03MjAsOSArNzM5LDE1IEBACiAJCWJ1ZmZlci5hcHBlbmQoIkNBVEVHT1JJRVMiKTsgLy8kTk9OLU5MUy0xJAogCQlwcmV2ID0gdHJ1ZTsKIAl9CisJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQU5OT1RBVElPTlMpICE9IDApIHsKKwkJaWYgKHByZXYpCisJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJBTk5PVEFUSU9OUyIpOyAvLyROT04tTkxTLTEkCisJCXByZXYgPSB0cnVlOworCX0KIAlyZXR1cm4gcHJldjsKIH0KLS8qKiAKKy8qKgogICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRlbHRhJ3MKICAqIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgZGVidWcgcHVycG9zZXMuCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGFCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhCmluZGV4IDViZTA4OTAuLjVmODM0MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGFCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYXJlbnQ7CkBAIC0yNSwxNCArMjYsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgotICogQSBqYXZhIGVsZW1lbnQgZGVsdGEgYml1bGRlciBjcmVhdGVzIGEgamF2YSBlbGVtZW50IGRlbHRhIG9uCisgKiBBIGphdmEgZWxlbWVudCBkZWx0YSBidWlsZGVyIGNyZWF0ZXMgYSBqYXZhIGVsZW1lbnQgZGVsdGEgb24KICAqIGEgamF2YSBlbGVtZW50IGJldHdlZW4gdGhlIHZlcnNpb24gb2YgdGhlIGphdmEgZWxlbWVudAotICogYXQgdGhlIHRpbWUgdGhlIGNvbXBhcmF0b3Igd2FzIGNyZWF0ZWQgYW5kIHRoZSBjdXJyZW50IHZlcnNpb24gCisgKiBhdCB0aGUgdGltZSB0aGUgY29tcGFyYXRvciB3YXMgY3JlYXRlZCBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbgogICogb2YgdGhlIGphdmEgZWxlbWVudC4KICAqCi0gKiBJdCBwZXJmb3JtcyB0aGlzIG9wZXJhdGlvbiBieSBsb2NhbGx5IGNhY2hpbmcgdGhlIGNvbnRlbnRzIG9mIAorICogSXQgcGVyZm9ybXMgdGhpcyBvcGVyYXRpb24gYnkgbG9jYWxseSBjYWNoaW5nIHRoZSBjb250ZW50cyBvZgogICogdGhlIGphdmEgZWxlbWVudCB3aGVuIGl0IGlzIGNyZWF0ZWQuIFdoZW4gdGhlIG1ldGhvZAotICogY3JlYXRlRGVsdGFzKCkgaXMgY2FsbGVkLCBpdCBjcmVhdGVzIGEgZGVsdGEgb3ZlciB0aGUgY2FjaGVkIAorICogY3JlYXRlRGVsdGFzKCkgaXMgY2FsbGVkLCBpdCBjcmVhdGVzIGEgZGVsdGEgb3ZlciB0aGUgY2FjaGVkCiAgKiBjb250ZW50cyBhbmQgdGhlIG5ldyBjb250ZW50cy4KICAqLwogcHVibGljIGNsYXNzIEphdmFFbGVtZW50RGVsdGFCdWlsZGVyIHsKQEAgLTUwLDYgKzUxLDcgQEAKIAkgKiBUaGUgb2xkIGhhbmRsZSB0byBpbmZvIHJlbGF0aW9uc2hpcHMKIAkgKi8KIAlNYXAgaW5mb3M7CisJTWFwIGFubm90YXRpb25JbmZvczsKIAogCS8qKgogCSAqIFRoZSBvbGQgcG9zaXRpb24gaW5mbwpAQCAtNjksMTMgKzcxLDEzIEBACiAJLyoqCiAJICogTGlzdCBvZiBhZGRlZCBlbGVtZW50cwogCSAqLwotCUFycmF5TGlzdCBhZGRlZDsKKwlIYXNoU2V0IGFkZGVkOwogCiAJLyoqCiAJICogTGlzdCBvZiByZW1vdmVkIGVsZW1lbnRzCiAJICovCi0JQXJyYXlMaXN0IHJlbW92ZWQ7Ci0JCisJSGFzaFNldCByZW1vdmVkOworCiAJLyoqCiAJICogRG91Ymx5IGxpbmtlZCBsaXN0IGl0ZW0KIAkgKi8KQEAgLTk0LDkgKzk2LDkgQEAKICAqLwogcHVibGljIEphdmFFbGVtZW50RGVsdGFCdWlsZGVyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewogCXRoaXMuamF2YUVsZW1lbnQgPSBqYXZhRWxlbWVudDsKLQl0aGlzLmluaXRpYWxpemUoKTsKLQl0aGlzLnJlY29yZEVsZW1lbnRJbmZvKAotCQlqYXZhRWxlbWVudCwgCisJaW5pdGlhbGl6ZSgpOworCXJlY29yZEVsZW1lbnRJbmZvKAorCQlqYXZhRWxlbWVudCwKIAkJKEphdmFNb2RlbCl0aGlzLmphdmFFbGVtZW50LmdldEphdmFNb2RlbCgpLAogCQkwKTsKIH0KQEAgLTEwNyw5ICsxMDksOSBAQAogcHVibGljIEphdmFFbGVtZW50RGVsdGFCdWlsZGVyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgaW50IG1heERlcHRoKSB7CiAJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50OwogCXRoaXMubWF4RGVwdGggPSBtYXhEZXB0aDsKLQl0aGlzLmluaXRpYWxpemUoKTsKLQl0aGlzLnJlY29yZEVsZW1lbnRJbmZvKAotCQlqYXZhRWxlbWVudCwgCisJaW5pdGlhbGl6ZSgpOworCXJlY29yZEVsZW1lbnRJbmZvKAorCQlqYXZhRWxlbWVudCwKIAkJKEphdmFNb2RlbCl0aGlzLmphdmFFbGVtZW50LmdldEphdmFNb2RlbCgpLAogCQkwKTsKIH0KQEAgLTExOSwxMiArMTIxLDEyIEBACiAgKi8KIHByaXZhdGUgdm9pZCBhZGRlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCXRoaXMuYWRkZWQuYWRkKGVsZW1lbnQpOwotCUxpc3RJdGVtIGN1cnJlbnQgPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGVsZW1lbnQpOworCUxpc3RJdGVtIGN1cnJlbnQgPSBnZXROZXdQb3NpdGlvbihlbGVtZW50KTsKIAlMaXN0SXRlbSBwcmV2aW91cyA9IG51bGwsIG5leHQgPSBudWxsOwogCWlmIChjdXJyZW50LnByZXZpb3VzICE9IG51bGwpCi0JCXByZXZpb3VzID0gdGhpcy5nZXROZXdQb3NpdGlvbihjdXJyZW50LnByZXZpb3VzKTsKKwkJcHJldmlvdXMgPSBnZXROZXdQb3NpdGlvbihjdXJyZW50LnByZXZpb3VzKTsKIAlpZiAoY3VycmVudC5uZXh0ICE9IG51bGwpCi0JCW5leHQgPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGN1cnJlbnQubmV4dCk7CisJCW5leHQgPSBnZXROZXdQb3NpdGlvbihjdXJyZW50Lm5leHQpOwogCWlmIChwcmV2aW91cyAhPSBudWxsKQogCQlwcmV2aW91cy5uZXh0ID0gY3VycmVudC5uZXh0OwogCWlmIChuZXh0ICE9IG51bGwpCkBAIC0xMzYsMTYgKzEzOCwxNiBAQAogICovCiBwdWJsaWMgdm9pZCBidWlsZERlbHRhcygpIHsKIAl0aGlzLmRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEodGhpcy5qYXZhRWxlbWVudCk7Ci0JLy8gaWYgYnVpbGRpbmcgYSBkZWx0YSBvbiBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYmVsb3csIAorCS8vIGlmIGJ1aWxkaW5nIGEgZGVsdGEgb24gYSBjb21waWxhdGlvbiB1bml0IG9yIGJlbG93LAogCS8vIGl0J3MgYSBmaW5lIGdyYWluZWQgZGVsdGEKIAlpZiAodGhpcy5qYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID49IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CiAJCXRoaXMuZGVsdGEuZmluZUdyYWluZWQoKTsKIAl9Ci0JdGhpcy5yZWNvcmROZXdQb3NpdGlvbnModGhpcy5qYXZhRWxlbWVudCwgMCk7Ci0JdGhpcy5maW5kQWRkaXRpb25zKHRoaXMuamF2YUVsZW1lbnQsIDApOwotCXRoaXMuZmluZERlbGV0aW9ucygpOwotCXRoaXMuZmluZENoYW5nZXNJblBvc2l0aW9uaW5nKHRoaXMuamF2YUVsZW1lbnQsIDApOwotCXRoaXMudHJpbURlbHRhKHRoaXMuZGVsdGEpOworCXJlY29yZE5ld1Bvc2l0aW9ucyh0aGlzLmphdmFFbGVtZW50LCAwKTsKKwlmaW5kQWRkaXRpb25zKHRoaXMuamF2YUVsZW1lbnQsIDApOworCWZpbmREZWxldGlvbnMoKTsKKwlmaW5kQ2hhbmdlc0luUG9zaXRpb25pbmcodGhpcy5qYXZhRWxlbWVudCwgMCk7CisJdHJpbURlbHRhKHRoaXMuZGVsdGEpOwogCWlmICh0aGlzLmRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewogCQkvLyB0aGlzIGlzIGEgZmluZSBncmFpbmVkIGJ1dCBub3QgY2hpbGRyZW4gYWZmZWN0ZWQgLT4gbWFyayBhcyBjb250ZW50IGNoYW5nZWQKIAkJdGhpcy5kZWx0YS5jb250ZW50Q2hhbmdlZCgpOwpAQCAtMTY4LDE0ICsxNzAsMTQgQEAKICAqIEZpbmRzIGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCBvciBjaGFuZ2VkLgogICovCiBwcml2YXRlIHZvaWQgZmluZEFkZGl0aW9ucyhJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCwgaW50IGRlcHRoKSB7Ci0JSmF2YUVsZW1lbnRJbmZvIG9sZEluZm8gPSB0aGlzLmdldEVsZW1lbnRJbmZvKG5ld0VsZW1lbnQpOworCUphdmFFbGVtZW50SW5mbyBvbGRJbmZvID0gZ2V0RWxlbWVudEluZm8obmV3RWxlbWVudCk7CiAJaWYgKG9sZEluZm8gPT0gbnVsbCAmJiBkZXB0aCA8IHRoaXMubWF4RGVwdGgpIHsKIAkJdGhpcy5kZWx0YS5hZGRlZChuZXdFbGVtZW50KTsKIAkJYWRkZWQobmV3RWxlbWVudCk7CiAJfSBlbHNlIHsKLQkJdGhpcy5yZW1vdmVFbGVtZW50SW5mbyhuZXdFbGVtZW50KTsKKwkJcmVtb3ZlRWxlbWVudEluZm8obmV3RWxlbWVudCk7CiAJfQotCQorCiAJaWYgKGRlcHRoID49IHRoaXMubWF4RGVwdGgpIHsKIAkJLy8gbWFyayBlbGVtZW50IGFzIGNoYW5nZWQKIAkJdGhpcy5kZWx0YS5jaGFuZ2VkKG5ld0VsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7CkBAIC0xODMsMjMgKzE4NSwyMyBAQAogCX0KIAogCUphdmFFbGVtZW50SW5mbyBuZXdJbmZvID0gbnVsbDsKLQl0cnkgeyAKKwl0cnkgewogCQluZXdJbmZvID0gKEphdmFFbGVtZW50SW5mbykoKEphdmFFbGVtZW50KW5ld0VsZW1lbnQpLmdldEVsZW1lbnRJbmZvKCk7CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewogCQlyZXR1cm47CiAJfQotCQotCXRoaXMuZmluZENvbnRlbnRDaGFuZ2Uob2xkSW5mbywgbmV3SW5mbywgbmV3RWxlbWVudCk7Ci0JCQorCisJZmluZENvbnRlbnRDaGFuZ2Uob2xkSW5mbywgbmV3SW5mbywgbmV3RWxlbWVudCk7CisKIAlpZiAob2xkSW5mbyAhPSBudWxsICYmIG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50KSB7CiAKIAkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBuZXdJbmZvLmdldENoaWxkcmVuKCk7CiAJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAJCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwogCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy5maW5kQWRkaXRpb25zKGNoaWxkcmVuW2ldLCBkZXB0aCArIDEpOworCQkJCWZpbmRBZGRpdGlvbnMoY2hpbGRyZW5baV0sIGRlcHRoICsgMSk7CiAJCQl9Ci0JCX0JCQorCQl9CiAJfQogfQogLyoqCkBAIC0yMDgsMTQgKzIxMCwxNCBAQAogcHJpdmF0ZSB2b2lkIGZpbmRDaGFuZ2VzSW5Qb3NpdGlvbmluZyhJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGRlcHRoKSB7CiAJaWYgKGRlcHRoID49IHRoaXMubWF4RGVwdGggfHwgdGhpcy5hZGRlZC5jb250YWlucyhlbGVtZW50KSB8fCB0aGlzLnJlbW92ZWQuY29udGFpbnMoZWxlbWVudCkpCiAJCXJldHVybjsKLQkJCisKIAlpZiAoIWlzUG9zaXRpb25lZENvcnJlY3RseShlbGVtZW50KSkgewogCQl0aGlzLmRlbHRhLmNoYW5nZWQoZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKTsKLQl9IAotCQorCX0KKwogCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewogCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IG51bGw7Ci0JCXRyeSB7IAorCQl0cnkgewogCQkJaW5mbyA9IChKYXZhRWxlbWVudEluZm8pKChKYXZhRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CiAJCQlyZXR1cm47CkBAIC0yMjUsOSArMjI3LDUxIEBACiAJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAJCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwogCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy5maW5kQ2hhbmdlc0luUG9zaXRpb25pbmcoY2hpbGRyZW5baV0sIGRlcHRoICsgMSk7CisJCQkJZmluZENoYW5nZXNJblBvc2l0aW9uaW5nKGNoaWxkcmVuW2ldLCBkZXB0aCArIDEpOwogCQkJfQotCQl9CQkKKwkJfQorCX0KK30KK3ByaXZhdGUgdm9pZCBmaW5kQW5ub3RhdGlvbkNoYW5nZXMoSUFubm90YXRpb25bXSBvbGRBbm5vdGF0aW9ucywgSUFubm90YXRpb25bXSBuZXdBbm5vdGF0aW9ucywgSUphdmFFbGVtZW50IHBhcmVudCkgeworCUFycmF5TGlzdCBhbm5vdGF0aW9uRGVsdGFzID0gbnVsbDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbmV3QW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ld0Fubm90YXRpb25zW2ldOworCQlPYmplY3Qgb2xkSW5mbyA9IHRoaXMuYW5ub3RhdGlvbkluZm9zLnJlbW92ZShuZXdBbm5vdGF0aW9uKTsKKwkJaWYgKG9sZEluZm8gPT0gbnVsbCkgeworCQkJSmF2YUVsZW1lbnREZWx0YSBhbm5vdGF0aW9uRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShuZXdBbm5vdGF0aW9uKTsKKwkJCWFubm90YXRpb25EZWx0YS5hZGRlZCgpOworCQkJaWYgKGFubm90YXRpb25EZWx0YXMgPT0gbnVsbCkgYW5ub3RhdGlvbkRlbHRhcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWFubm90YXRpb25EZWx0YXMuYWRkKGFubm90YXRpb25EZWx0YSk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCUFubm90YXRpb25JbmZvIG5ld0luZm8gPSBudWxsOworCQkJdHJ5IHsKKwkJCQluZXdJbmZvID0gKEFubm90YXRpb25JbmZvKSAoKEphdmFFbGVtZW50KSBuZXdBbm5vdGF0aW9uKS5nZXRFbGVtZW50SW5mbygpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICghVXRpbC5lcXVhbEFycmF5c09yTnVsbCgoKEFubm90YXRpb25JbmZvKSBvbGRJbmZvKS5tZW1iZXJzLCBuZXdJbmZvLm1lbWJlcnMpKSB7CisJCQkJSmF2YUVsZW1lbnREZWx0YSBhbm5vdGF0aW9uRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShuZXdBbm5vdGF0aW9uKTsKKwkJCQlhbm5vdGF0aW9uRGVsdGEuY2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQkJCWlmIChhbm5vdGF0aW9uRGVsdGFzID09IG51bGwpIGFubm90YXRpb25EZWx0YXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJYW5ub3RhdGlvbkRlbHRhcy5hZGQoYW5ub3RhdGlvbkRlbHRhKTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb2xkQW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUFubm90YXRpb24gb2xkQW5ub3RhdGlvbiA9IG9sZEFubm90YXRpb25zW2ldOworCQlpZiAodGhpcy5hbm5vdGF0aW9uSW5mb3MucmVtb3ZlKG9sZEFubm90YXRpb24pICE9IG51bGwpIHsKKwkJCUphdmFFbGVtZW50RGVsdGEgYW5ub3RhdGlvbkRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEob2xkQW5ub3RhdGlvbik7CisJCQlhbm5vdGF0aW9uRGVsdGEucmVtb3ZlZCgpOworCQkJaWYgKGFubm90YXRpb25EZWx0YXMgPT0gbnVsbCkgYW5ub3RhdGlvbkRlbHRhcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWFubm90YXRpb25EZWx0YXMuYWRkKGFubm90YXRpb25EZWx0YSk7CQl9CisJfQorCWlmIChhbm5vdGF0aW9uRGVsdGFzID09IG51bGwpCisJCXJldHVybjsKKwlpbnQgc2l6ZSA9IGFubm90YXRpb25EZWx0YXMuc2l6ZSgpOworCWlmIChzaXplID4gMCkgeworCQlKYXZhRWxlbWVudERlbHRhIHBhcmVudERlbHRhID0gdGhpcy5kZWx0YS5jaGFuZ2VkKHBhcmVudCwgSUphdmFFbGVtZW50RGVsdGEuRl9BTk5PVEFUSU9OUyk7CisJCXBhcmVudERlbHRhLmFubm90YXRpb25EZWx0YXMgPSAoSUphdmFFbGVtZW50RGVsdGFbXSkgYW5ub3RhdGlvbkRlbHRhcy50b0FycmF5KG5ldyBJSmF2YUVsZW1lbnREZWx0YVtzaXplXSk7CiAJfQogfQogLyoqCkBAIC0yMzcsNyArMjgxLDExIEBACiAJaWYgKG9sZEluZm8gaW5zdGFuY2VvZiBNZW1iZXJFbGVtZW50SW5mbyAmJiBuZXdJbmZvIGluc3RhbmNlb2YgTWVtYmVyRWxlbWVudEluZm8pIHsKIAkJaWYgKCgoTWVtYmVyRWxlbWVudEluZm8pb2xkSW5mbykuZ2V0TW9kaWZpZXJzKCkgIT0gKChNZW1iZXJFbGVtZW50SW5mbyluZXdJbmZvKS5nZXRNb2RpZmllcnMoKSkgewogCQkJdGhpcy5kZWx0YS5jaGFuZ2VkKG5ld0VsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfTU9ESUZJRVJTKTsKLQkJfSBlbHNlIGlmIChvbGRJbmZvIGluc3RhbmNlb2YgU291cmNlTWV0aG9kRWxlbWVudEluZm8gJiYgbmV3SW5mbyBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSB7CisJCX0KKwkJaWYgKG9sZEluZm8gaW5zdGFuY2VvZiBBbm5vdGF0YWJsZUluZm8gJiYgbmV3SW5mbyBpbnN0YW5jZW9mIEFubm90YXRhYmxlSW5mbykgeworCQkJZmluZEFubm90YXRpb25DaGFuZ2VzKCgoQW5ub3RhdGFibGVJbmZvKSBvbGRJbmZvKS5hbm5vdGF0aW9ucywgKChBbm5vdGF0YWJsZUluZm8pIG5ld0luZm8pLmFubm90YXRpb25zLCBuZXdFbGVtZW50KTsKKwkJfQorCQlpZiAob2xkSW5mbyBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VNZXRob2RFbGVtZW50SW5mbykgewogCQkJU291cmNlTWV0aG9kRWxlbWVudEluZm8gb2xkU291cmNlTWV0aG9kSW5mbyA9IChTb3VyY2VNZXRob2RFbGVtZW50SW5mbylvbGRJbmZvOwogCQkJU291cmNlTWV0aG9kRWxlbWVudEluZm8gbmV3U291cmNlTWV0aG9kSW5mbyA9IChTb3VyY2VNZXRob2RFbGVtZW50SW5mbyluZXdJbmZvOwogCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhvbGRTb3VyY2VNZXRob2RJbmZvLmdldFJldHVyblR5cGVOYW1lKCksIG5ld1NvdXJjZU1ldGhvZEluZm8uZ2V0UmV0dXJuVHlwZU5hbWUoKSkKQEAgLTI0Nyw0NyArMjk1LDQ2IEBACiAJCQl9CiAJCX0gZWxzZSBpZiAob2xkSW5mbyBpbnN0YW5jZW9mIFNvdXJjZUZpZWxkRWxlbWVudEluZm8gJiYgbmV3SW5mbyBpbnN0YW5jZW9mIFNvdXJjZUZpZWxkRWxlbWVudEluZm8pIHsKIAkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoCi0JCQkJCSgoU291cmNlRmllbGRFbGVtZW50SW5mbylvbGRJbmZvKS5nZXRUeXBlTmFtZSgpLCAKKwkJCQkJKChTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKW9sZEluZm8pLmdldFR5cGVOYW1lKCksCiAJCQkJCSgoU291cmNlRmllbGRFbGVtZW50SW5mbyluZXdJbmZvKS5nZXRUeXBlTmFtZSgpKSkgewogCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOwogCQkJfQotCQl9Ci0JfQotCWlmIChvbGRJbmZvIGluc3RhbmNlb2YgU291cmNlVHlwZUVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8pIHsKLQkJU291cmNlVHlwZUVsZW1lbnRJbmZvIG9sZFNvdXJjZVR5cGVJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbylvbGRJbmZvOwotCQlTb3VyY2VUeXBlRWxlbWVudEluZm8gbmV3U291cmNlVHlwZUluZm8gPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKW5ld0luZm87Ci0JCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMob2xkU291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSkgCi0JCQkJfHwgIUNoYXJPcGVyYXRpb24uZXF1YWxzKG9sZFNvdXJjZVR5cGVJbmZvLmdldEludGVyZmFjZU5hbWVzKCksIG5ld1NvdXJjZVR5cGVJbmZvLmdldEludGVyZmFjZU5hbWVzKCkpKSB7Ci0JCQl0aGlzLmRlbHRhLmNoYW5nZWQobmV3RWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEuRl9TVVBFUl9UWVBFUyk7Ci0JCX0KLQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhvbGRTb3VyY2VUeXBlSW5mby5nZXRUeXBlUGFyYW1ldGVyTmFtZXMoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0VHlwZVBhcmFtZXRlck5hbWVzKCkpCi0JCQkJfHwgIWVxdWFscyhvbGRTb3VyY2VUeXBlSW5mby5nZXRUeXBlUGFyYW1ldGVyQm91bmRzKCksIG5ld1NvdXJjZVR5cGVJbmZvLmdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoKSkpIHsKLQkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOwotCQl9Ci0JCUhhc2hNYXAgb2xkVHlwZUNhdGVnb3JpZXMgPSBvbGRTb3VyY2VUeXBlSW5mby5jYXRlZ29yaWVzOwotCQlIYXNoTWFwIG5ld1R5cGVDYXRlZ29yaWVzID0gbmV3U291cmNlVHlwZUluZm8uY2F0ZWdvcmllczsKLQkJaWYgKG9sZFR5cGVDYXRlZ29yaWVzICE9IG51bGwpIHsKLQkJCS8vIHRha2UgdGhlIHVuaW9uIG9mIG9sZCBhbmQgbmV3IGNhdGVnb3JpZXMgZWxlbWVudHMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1Njc1KQotCQkJU2V0IGVsZW1lbnRzOwotCQkJaWYgKG5ld1R5cGVDYXRlZ29yaWVzICE9IG51bGwpIHsKLQkJCQllbGVtZW50cyA9IG5ldyBIYXNoU2V0KG9sZFR5cGVDYXRlZ29yaWVzLmtleVNldCgpKTsKLQkJCQllbGVtZW50cy5hZGRBbGwobmV3VHlwZUNhdGVnb3JpZXMua2V5U2V0KCkpOwotCQkJfSBlbHNlCi0JCQkJZWxlbWVudHMgPSBvbGRUeXBlQ2F0ZWdvcmllcy5rZXlTZXQoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBvbGRDYXRlZ29yaWVzID0gKFN0cmluZ1tdKSBvbGRUeXBlQ2F0ZWdvcmllcy5nZXQoZWxlbWVudCk7Ci0JCQkJU3RyaW5nW10gbmV3Q2F0ZWdvcmllcyA9IG5ld1R5cGVDYXRlZ29yaWVzID09IG51bGwgPyBudWxsIDogKFN0cmluZ1tdKSBuZXdUeXBlQ2F0ZWdvcmllcy5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKCFVdGlsLmVxdWFsQXJyYXlzT3JOdWxsKG9sZENhdGVnb3JpZXMsIG5ld0NhdGVnb3JpZXMpKSB7Ci0JCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NBVEVHT1JJRVMpOwotCQkJCX0KKwkJfSBlbHNlIGlmIChvbGRJbmZvIGluc3RhbmNlb2YgU291cmNlVHlwZUVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8pIHsKKwkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBvbGRTb3VyY2VUeXBlSW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pb2xkSW5mbzsKKwkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBuZXdTb3VyY2VUeXBlSW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pbmV3SW5mbzsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMob2xkU291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSkKKwkJCQkJfHwgIUNoYXJPcGVyYXRpb24uZXF1YWxzKG9sZFNvdXJjZVR5cGVJbmZvLmdldEludGVyZmFjZU5hbWVzKCksIG5ld1NvdXJjZVR5cGVJbmZvLmdldEludGVyZmFjZU5hbWVzKCkpKSB7CisJCQkJdGhpcy5kZWx0YS5jaGFuZ2VkKG5ld0VsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfU1VQRVJfVFlQRVMpOwogCQkJfQotCQl9IGVsc2UgaWYgKG5ld1R5cGVDYXRlZ29yaWVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gbmV3VHlwZUNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIGVsZW1lbnRzLm5leHQoKTsKLQkJCQl0aGlzLmRlbHRhLmNoYW5nZWQoZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEuRl9DQVRFR09SSUVTKTsgLy8gYWxsIGNhdGVnb3JpZXMgZm9yIHRoaXMgZWxlbWVudCB3ZXJlIHJlbW92ZWQKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMob2xkU291cmNlVHlwZUluZm8uZ2V0VHlwZVBhcmFtZXRlck5hbWVzKCksIG5ld1NvdXJjZVR5cGVJbmZvLmdldFR5cGVQYXJhbWV0ZXJOYW1lcygpKQorCQkJCQl8fCAhZXF1YWxzKG9sZFNvdXJjZVR5cGVJbmZvLmdldFR5cGVQYXJhbWV0ZXJCb3VuZHMoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0VHlwZVBhcmFtZXRlckJvdW5kcygpKSkgeworCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQkJfQorCQkJSGFzaE1hcCBvbGRUeXBlQ2F0ZWdvcmllcyA9IG9sZFNvdXJjZVR5cGVJbmZvLmNhdGVnb3JpZXM7CisJCQlIYXNoTWFwIG5ld1R5cGVDYXRlZ29yaWVzID0gbmV3U291cmNlVHlwZUluZm8uY2F0ZWdvcmllczsKKwkJCWlmIChvbGRUeXBlQ2F0ZWdvcmllcyAhPSBudWxsKSB7CisJCQkJLy8gdGFrZSB0aGUgdW5pb24gb2Ygb2xkIGFuZCBuZXcgY2F0ZWdvcmllcyBlbGVtZW50cyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjU2NzUpCisJCQkJU2V0IGVsZW1lbnRzOworCQkJCWlmIChuZXdUeXBlQ2F0ZWdvcmllcyAhPSBudWxsKSB7CisJCQkJCWVsZW1lbnRzID0gbmV3IEhhc2hTZXQob2xkVHlwZUNhdGVnb3JpZXMua2V5U2V0KCkpOworCQkJCQllbGVtZW50cy5hZGRBbGwobmV3VHlwZUNhdGVnb3JpZXMua2V5U2V0KCkpOworCQkJCX0gZWxzZQorCQkJCQllbGVtZW50cyA9IG9sZFR5cGVDYXRlZ29yaWVzLmtleVNldCgpOworCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gKElKYXZhRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOworCQkJCQlTdHJpbmdbXSBvbGRDYXRlZ29yaWVzID0gKFN0cmluZ1tdKSBvbGRUeXBlQ2F0ZWdvcmllcy5nZXQoZWxlbWVudCk7CisJCQkJCVN0cmluZ1tdIG5ld0NhdGVnb3JpZXMgPSBuZXdUeXBlQ2F0ZWdvcmllcyA9PSBudWxsID8gbnVsbCA6IChTdHJpbmdbXSkgbmV3VHlwZUNhdGVnb3JpZXMuZ2V0KGVsZW1lbnQpOworCQkJCQlpZiAoIVV0aWwuZXF1YWxBcnJheXNPck51bGwob2xkQ2F0ZWdvcmllcywgbmV3Q2F0ZWdvcmllcykpIHsKKwkJCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NBVEVHT1JJRVMpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChuZXdUeXBlQ2F0ZWdvcmllcyAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3IgZWxlbWVudHMgPSBuZXdUeXBlQ2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBlbGVtZW50cy5uZXh0KCk7CisJCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NBVEVHT1JJRVMpOyAvLyBhbGwgY2F0ZWdvcmllcyBmb3IgdGhpcyBlbGVtZW50IHdlcmUgcmVtb3ZlZAorCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTMwMCw3ICszNDcsNyBAQAogCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CiAJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gKElKYXZhRWxlbWVudClpdGVyLm5leHQoKTsKIAkJdGhpcy5kZWx0YS5yZW1vdmVkKGVsZW1lbnQpOwotCQl0aGlzLnJlbW92ZWQoZWxlbWVudCk7CisJCXJlbW92ZWQoZWxlbWVudCk7CiAJfQogfQogcHJpdmF0ZSBKYXZhRWxlbWVudEluZm8gZ2V0RWxlbWVudEluZm8oSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKQEAgLTMxNiwxMCArMzYzLDEwIEBACiAJdGhpcy5pbmZvcyA9IG5ldyBIYXNoTWFwKDIwKTsKIAl0aGlzLm9sZFBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKDIwKTsKIAl0aGlzLm5ld1Bvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKDIwKTsKLQl0aGlzLnB1dE9sZFBvc2l0aW9uKHRoaXMuamF2YUVsZW1lbnQsIG5ldyBMaXN0SXRlbShudWxsLCBudWxsKSk7Ci0JdGhpcy5wdXROZXdQb3NpdGlvbih0aGlzLmphdmFFbGVtZW50LCBuZXcgTGlzdEl0ZW0obnVsbCwgbnVsbCkpOwkKLQl0aGlzLmFkZGVkID0gbmV3IEFycmF5TGlzdCg1KTsKLQl0aGlzLnJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KDUpOworCXRoaXMub2xkUG9zaXRpb25zLnB1dCh0aGlzLmphdmFFbGVtZW50LCBuZXcgTGlzdEl0ZW0obnVsbCwgbnVsbCkpOworCXRoaXMubmV3UG9zaXRpb25zLnB1dCh0aGlzLmphdmFFbGVtZW50LCBuZXcgTGlzdEl0ZW0obnVsbCwgbnVsbCkpOworCXRoaXMuYWRkZWQgPSBuZXcgSGFzaFNldCg1KTsKKwl0aGlzLnJlbW92ZWQgPSBuZXcgSGFzaFNldCg1KTsKIH0KIC8qKgogICogSW5zZXJ0cyBwb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVsZW1lbnRzIGludG8gdGhlIG5ldyBvciBvbGQgcG9zaXRpb25zIHRhYmxlCkBAIC0zMzIsOSArMzc5LDkgQEAKIAkJY3VycmVudCA9IG5leHQ7CiAJCW5leHQgPSAoaSArIDEgPCBsZW5ndGgpID8gZWxlbWVudHNbaSArIDFdIDogbnVsbDsKIAkJaWYgKGlzTmV3KSB7Ci0JCQl0aGlzLnB1dE5ld1Bvc2l0aW9uKGN1cnJlbnQsIG5ldyBMaXN0SXRlbShwcmV2aW91cywgbmV4dCkpOworCQkJdGhpcy5uZXdQb3NpdGlvbnMucHV0KGN1cnJlbnQsIG5ldyBMaXN0SXRlbShwcmV2aW91cywgbmV4dCkpOwogCQl9IGVsc2UgewotCQkJdGhpcy5wdXRPbGRQb3NpdGlvbihjdXJyZW50LCBuZXcgTGlzdEl0ZW0ocHJldmlvdXMsIG5leHQpKTsKKwkJCXRoaXMub2xkUG9zaXRpb25zLnB1dChjdXJyZW50LCBuZXcgTGlzdEl0ZW0ocHJldmlvdXMsIG5leHQpKTsKIAkJfQogCX0KIH0KQEAgLTM0MiwxMiArMzg5LDEyIEBACiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZC4KICAqLwogcHJpdmF0ZSBib29sZWFuIGlzUG9zaXRpb25lZENvcnJlY3RseShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCUxpc3RJdGVtIG9sZExpc3RJdGVtID0gdGhpcy5nZXRPbGRQb3NpdGlvbihlbGVtZW50KTsKKwlMaXN0SXRlbSBvbGRMaXN0SXRlbSA9IGdldE9sZFBvc2l0aW9uKGVsZW1lbnQpOwogCWlmIChvbGRMaXN0SXRlbSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCi0JTGlzdEl0ZW0gbmV3TGlzdEl0ZW0gPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGVsZW1lbnQpOworCisJTGlzdEl0ZW0gbmV3TGlzdEl0ZW0gPSBnZXROZXdQb3NpdGlvbihlbGVtZW50KTsKIAlpZiAobmV3TGlzdEl0ZW0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQorCiAJSUphdmFFbGVtZW50IG9sZFByZXZpb3VzID0gb2xkTGlzdEl0ZW0ucHJldmlvdXM7CiAJSUphdmFFbGVtZW50IG5ld1ByZXZpb3VzID0gbmV3TGlzdEl0ZW0ucHJldmlvdXM7CiAJaWYgKG9sZFByZXZpb3VzID09IG51bGwpIHsKQEAgLTM1NiwxNSArNDAzLDYgQEAKIAkJcmV0dXJuIG9sZFByZXZpb3VzLmVxdWFscyhuZXdQcmV2aW91cyk7CiAJfQogfQotcHJpdmF0ZSB2b2lkIHB1dEVsZW1lbnRJbmZvKElKYXZhRWxlbWVudCBlbGVtZW50LCBKYXZhRWxlbWVudEluZm8gaW5mbykgewotCXRoaXMuaW5mb3MucHV0KGVsZW1lbnQsIGluZm8pOwotfQotcHJpdmF0ZSB2b2lkIHB1dE5ld1Bvc2l0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50LCBMaXN0SXRlbSBwb3NpdGlvbikgewotCXRoaXMubmV3UG9zaXRpb25zLnB1dChlbGVtZW50LCBwb3NpdGlvbik7Ci19Ci1wcml2YXRlIHZvaWQgcHV0T2xkUG9zaXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIExpc3RJdGVtIHBvc2l0aW9uKSB7Ci0JdGhpcy5vbGRQb3NpdGlvbnMucHV0KGVsZW1lbnQsIHBvc2l0aW9uKTsKLX0KIC8qKgogICogUmVjb3JkcyB0aGlzIGVsZW1lbnRzIGluZm8sIGFuZCBhdHRlbXB0cwogICogdG8gcmVjb3JkIHRoZSBpbmZvIGZvciB0aGUgY2hpbGRyZW4uCkBAIC0zNzYsOCArNDE0LDggQEAKIAlKYXZhRWxlbWVudEluZm8gaW5mbyA9IChKYXZhRWxlbWVudEluZm8pSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyhlbGVtZW50KTsKIAlpZiAoaW5mbyA9PSBudWxsKSAvLyBubyBsb25nZXIgaW4gdGhlIGphdmEgbW9kZWwuCiAJCXJldHVybjsKLQl0aGlzLnB1dEVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCQkKKwl0aGlzLmluZm9zLnB1dChlbGVtZW50LCBpbmZvKTsKKwogCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewogCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGluZm8uZ2V0Q2hpbGRyZW4oKTsKIAkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKQEAgLTM4Niw2ICs0MjQsMTcgQEAKIAkJCQlyZWNvcmRFbGVtZW50SW5mbyhjaGlsZHJlbltpXSwgbW9kZWwsIGRlcHRoICsgMSk7CiAJCX0KIAl9CisJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IG51bGw7CisJaWYgKGluZm8gaW5zdGFuY2VvZiBBbm5vdGF0YWJsZUluZm8pCisJCWFubm90YXRpb25zID0gKChBbm5vdGF0YWJsZUluZm8pIGluZm8pLmFubm90YXRpb25zOworCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCWlmICh0aGlzLmFubm90YXRpb25JbmZvcyA9PSBudWxsKQorCQkJdGhpcy5hbm5vdGF0aW9uSW5mb3MgPSBuZXcgSGFzaE1hcCgpOworCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLmFubm90YXRpb25JbmZvcy5wdXQoYW5ub3RhdGlvbnNbaV0sIG1hbmFnZXIuZ2V0SW5mbyhhbm5vdGF0aW9uc1tpXSkpOworCQl9CisJfQogfQogLyoqCiAgKiBGaWxscyB0aGUgbmV3UG9zaXRpb25zIGhhc2h0YWJsZSB3aXRoIHRoZSBuZXcgcG9zaXRpb24gaW5mb3JtYXRpb24KQEAgLTM5Myw3ICs0NDIsNyBAQAogcHJpdmF0ZSB2b2lkIHJlY29yZE5ld1Bvc2l0aW9ucyhJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCwgaW50IGRlcHRoKSB7CiAJaWYgKGRlcHRoIDwgdGhpcy5tYXhEZXB0aCAmJiBuZXdFbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewogCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IG51bGw7Ci0JCXRyeSB7IAorCQl0cnkgewogCQkJaW5mbyA9IChKYXZhRWxlbWVudEluZm8pKChKYXZhRWxlbWVudCluZXdFbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CiAJCQlyZXR1cm47CkBAIC00MTQsMTcgKzQ2MywxNyBAQAogICovCiBwcml2YXRlIHZvaWQgcmVtb3ZlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCXRoaXMucmVtb3ZlZC5hZGQoZWxlbWVudCk7Ci0JTGlzdEl0ZW0gY3VycmVudCA9IHRoaXMuZ2V0T2xkUG9zaXRpb24oZWxlbWVudCk7CisJTGlzdEl0ZW0gY3VycmVudCA9IGdldE9sZFBvc2l0aW9uKGVsZW1lbnQpOwogCUxpc3RJdGVtIHByZXZpb3VzID0gbnVsbCwgbmV4dCA9IG51bGw7CiAJaWYgKGN1cnJlbnQucHJldmlvdXMgIT0gbnVsbCkKLQkJcHJldmlvdXMgPSB0aGlzLmdldE9sZFBvc2l0aW9uKGN1cnJlbnQucHJldmlvdXMpOworCQlwcmV2aW91cyA9IGdldE9sZFBvc2l0aW9uKGN1cnJlbnQucHJldmlvdXMpOwogCWlmIChjdXJyZW50Lm5leHQgIT0gbnVsbCkKLQkJbmV4dCA9IHRoaXMuZ2V0T2xkUG9zaXRpb24oY3VycmVudC5uZXh0KTsKKwkJbmV4dCA9IGdldE9sZFBvc2l0aW9uKGN1cnJlbnQubmV4dCk7CiAJaWYgKHByZXZpb3VzICE9IG51bGwpCiAJCXByZXZpb3VzLm5leHQgPSBjdXJyZW50Lm5leHQ7CiAJaWYgKG5leHQgIT0gbnVsbCkKIAkJbmV4dC5wcmV2aW91cyA9IGN1cnJlbnQucHJldmlvdXM7Ci0JCisKIH0KIHByaXZhdGUgdm9pZCByZW1vdmVFbGVtZW50SW5mbyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCXRoaXMuaW5mb3MucmVtb3ZlKGVsZW1lbnQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudEluZm8uamF2YQppbmRleCBlYTFlNjkwLi4wMjUwZDVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwzNiArMTYsMTMgQEAKICAqIEhvbGRzIGNhY2hlZCBzdHJ1Y3R1cmUgYW5kIHByb3BlcnRpZXMgZm9yIGEgSmF2YSBlbGVtZW50LgogICogU3ViY2xhc3NlZCB0byBjYXJyeSBwcm9wZXJ0aWVzIGZvciBzcGVjaWZpYyBraW5kcyBvZiBlbGVtZW50cy4KICAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBKYXZhRWxlbWVudEluZm8gewotCi0JLyoqCi0JICogQ29sbGVjdGlvbiBvZiBoYW5kbGVzIG9mIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGlzCi0JICogb2JqZWN0LiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgZWxlbWVudCBoYXMKLQkgKiBubyBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW47CitwdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnRJbmZvIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIAogCS8qKgogCSAqIFNoYXJlZCBlbXB0eSBjb2xsZWN0aW9uIHVzZWQgZm9yIGVmZmljaWVuY3kuCiAJICovCi0Jc3RhdGljIE9iamVjdFtdIE5PX05PTl9KQVZBX1JFU09VUkNFUyA9IG5ldyBPYmplY3RbXSB7fTsJCi0JCi0JcHJvdGVjdGVkIEphdmFFbGVtZW50SW5mbygpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEphdmFFbGVtZW50Lk5PX0VMRU1FTlRTOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChJSmF2YUVsZW1lbnQgY2hpbGQpIHsKLQkJaW50IGxlbmd0aCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwkJCi0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y2hpbGR9OwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbltpXS5lcXVhbHMoY2hpbGQpKQotCQkJCQlyZXR1cm47IC8vIGFscmVhZHkgaW5jbHVkZWQKLQkJCX0KLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jaGlsZHJlbiwgMCwgdGhpcy5jaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoKzFdLCAwLCBsZW5ndGgpOwotCQkJdGhpcy5jaGlsZHJlbltsZW5ndGhdID0gY2hpbGQ7Ci0JCX0KLQl9CisJc3RhdGljIE9iamVjdFtdIE5PX05PTl9KQVZBX1JFU09VUkNFUyA9IG5ldyBPYmplY3RbXSB7fTsKKwogCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKQEAgLTU1LDI2ICszMiw2IEBACiAJCX0KIAl9CiAJcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoSUphdmFFbGVtZW50IGNoaWxkKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHRoaXMuY2hpbGRyZW5baV07Ci0JCQlpZiAoZWxlbWVudC5lcXVhbHMoY2hpbGQpKSB7Ci0JCQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQkJCXRoaXMuY2hpbGRyZW4gPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKLQkJCQl9IGVsc2UgewotCQkJCQlJSmF2YUVsZW1lbnRbXSBuZXdDaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoLTFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hpbGRyZW4sIDAsIG5ld0NoaWxkcmVuICwgMCwgaSk7Ci0JCQkJCWlmIChpIDwgbGVuZ3RoLTEpCi0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hpbGRyZW4sIGkrMSwgbmV3Q2hpbGRyZW4sIGksIGxlbmd0aC0xLWkpOwotCQkJCQl0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKElKYXZhRWxlbWVudFtdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwkJcmV0dXJuIEphdmFFbGVtZW50Lk5PX0VMRU1FTlRTOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudFJlcXVlc3Rvci5qYXZhCmluZGV4IDk3NzUxZDUuLmExYmYwMGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywyMDAgKzI3LDIwMCBAQAogCSAqIFRydWUgaWYgdGhpcyByZXF1ZXN0b3Igbm8gbG9uZ2VyIHdhbnRzIHRvIHJlY2VpdmUKIAkgKiByZXN1bHRzIGZyb20gaXRzIDxjb2RlPklSZXF1ZXN0b3JOYW1lTG9va3VwPC9jb2RlPi4KIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQ2FuY2VsZWQ9IGZhbHNlOwotCQorCXByb3RlY3RlZCBib29sZWFuIGNhbmNlbGVkPSBmYWxzZTsKKwogCS8qKgogCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgcmVzdWx0aW5nIGZpZWxkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBubyBmaWVsZCByZXN1bHRzIGhhdmUgYmVlbiByZWNlaXZlZC4KIAkgKi8KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZGaWVsZHM9IG51bGw7CisJcHJvdGVjdGVkIEFycmF5TGlzdCBmaWVsZHM9IG51bGw7CiAKIAkvKioKIAkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyBpbml0aWFsaXplcnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICogaWYgbm8gaW5pdGlhbGl6ZXIgcmVzdWx0cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCiAJICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBmSW5pdGlhbGl6ZXJzPSBudWxsOworCXByb3RlY3RlZCBBcnJheUxpc3QgaW5pdGlhbGl6ZXJzPSBudWxsOwogCiAJLyoqCiAJICogQSBjb2xsZWN0aW9uIG9mIHRoZSByZXN1bHRpbmcgbWVtYmVyIHR5cGVzLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIG5vIG1lbWJlciB0eXBlIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgogCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgZk1lbWJlclR5cGVzPSBudWxsOworCXByb3RlY3RlZCBBcnJheUxpc3QgbWVtYmVyVHlwZXM9IG51bGw7CiAKIAkvKioKIAkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyBtZXRob2RzLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIG5vIG1ldGhvZCByZXN1bHRzIGhhdmUgYmVlbiByZWNlaXZlZC4KIAkgKi8KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZNZXRob2RzPSBudWxsOworCXByb3RlY3RlZCBBcnJheUxpc3QgbWV0aG9kcz0gbnVsbDsKIAogCS8qKgogCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgcmVzdWx0aW5nIHBhY2thZ2UgZnJhZ21lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIG5vIHBhY2thZ2UgZnJhZ21lbnQgcmVzdWx0cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCiAJICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBmUGFja2FnZUZyYWdtZW50cz0gbnVsbDsKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IHBhY2thZ2VGcmFnbWVudHM9IG51bGw7CiAKIAkvKioKIAkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyB0eXBlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KIAkgKiBpZiBubyB0eXBlIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgogCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgZlR5cGVzPSBudWxsOworCXByb3RlY3RlZCBBcnJheUxpc3QgdHlwZXM9IG51bGw7CiAKIAkvKioKIAkgKiBFbXB0eSBhcnJheXMgdXNlZCBmb3IgZWZmaWNpZW5jeQogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSUZpZWxkW10gZmdFbXB0eUZpZWxkQXJyYXk9IG5ldyBJRmllbGRbMF07Ci0JcHJvdGVjdGVkIHN0YXRpYyBJSW5pdGlhbGl6ZXJbXSBmZ0VtcHR5SW5pdGlhbGl6ZXJBcnJheT0gbmV3IElJbml0aWFsaXplclswXTsKLQlwcm90ZWN0ZWQgc3RhdGljIElUeXBlW10gZmdFbXB0eVR5cGVBcnJheT0gbmV3IElUeXBlWzBdOwotCXByb3RlY3RlZCBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFtdIGZnRW1wdHlQYWNrYWdlRnJhZ21lbnRBcnJheT0gbmV3IElQYWNrYWdlRnJhZ21lbnRbMF07Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTWV0aG9kW10gZmdFbXB0eU1ldGhvZEFycmF5PSBuZXcgSU1ldGhvZFswXTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElGaWVsZFtdIEVNUFRZX0ZJRUxEX0FSUkFZPSBuZXcgSUZpZWxkWzBdOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSUluaXRpYWxpemVyW10gRU1QVFlfSU5JVElBTElaRVJfQVJSQVk9IG5ldyBJSW5pdGlhbGl6ZXJbMF07CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJVHlwZVtdIEVNUFRZX1RZUEVfQVJSQVk9IG5ldyBJVHlwZVswXTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRbXSBFTVBUWV9QQUNLQUdFX0ZSQUdNRU5UX0FSUkFZPSBuZXcgSVBhY2thZ2VGcmFnbWVudFswXTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElNZXRob2RbXSBFTVBUWV9NRVRIT0RfQVJSQVk9IG5ldyBJTWV0aG9kWzBdOwogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZChJRmllbGQgZmllbGQpIHsKLQlpZiAoZkZpZWxkcyA9PSBudWxsKSB7Ci0JCWZGaWVsZHM9IG5ldyBBcnJheUxpc3QoKTsKKwlpZiAodGhpcy5maWVsZHMgPT0gbnVsbCkgeworCQl0aGlzLmZpZWxkcz0gbmV3IEFycmF5TGlzdCgpOwogCX0KLQlmRmllbGRzLmFkZChmaWVsZCk7CisJdGhpcy5maWVsZHMuYWRkKGZpZWxkKTsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIHZvaWQgYWNjZXB0SW5pdGlhbGl6ZXIoSUluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7Ci0JaWYgKGZJbml0aWFsaXplcnMgPT0gbnVsbCkgewotCQlmSW5pdGlhbGl6ZXJzPSBuZXcgQXJyYXlMaXN0KCk7CisJaWYgKHRoaXMuaW5pdGlhbGl6ZXJzID09IG51bGwpIHsKKwkJdGhpcy5pbml0aWFsaXplcnM9IG5ldyBBcnJheUxpc3QoKTsKIAl9Ci0JZkluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIpOworCXRoaXMuaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7CiB9CiAvKioKICAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIGFjY2VwdE1lbWJlclR5cGUoSVR5cGUgdHlwZSkgewotCWlmIChmTWVtYmVyVHlwZXMgPT0gbnVsbCkgewotCQlmTWVtYmVyVHlwZXM9IG5ldyBBcnJheUxpc3QoKTsKKwlpZiAodGhpcy5tZW1iZXJUeXBlcyA9PSBudWxsKSB7CisJCXRoaXMubWVtYmVyVHlwZXM9IG5ldyBBcnJheUxpc3QoKTsKIAl9Ci0JZk1lbWJlclR5cGVzLmFkZCh0eXBlKTsKKwl0aGlzLm1lbWJlclR5cGVzLmFkZCh0eXBlKTsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7Ci0JaWYgKGZNZXRob2RzID09IG51bGwpIHsKLQkJZk1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJaWYgKHRoaXMubWV0aG9kcyA9PSBudWxsKSB7CisJCXRoaXMubWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKIAl9Ci0JZk1ldGhvZHMuYWRkKG1ldGhvZCk7CisJdGhpcy5tZXRob2RzLmFkZChtZXRob2QpOwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQlpZiAoZlBhY2thZ2VGcmFnbWVudHM9PSBudWxsKSB7Ci0JCWZQYWNrYWdlRnJhZ21lbnRzPSBuZXcgQXJyYXlMaXN0KCk7CisJaWYgKHRoaXMucGFja2FnZUZyYWdtZW50cz09IG51bGwpIHsKKwkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzPSBuZXcgQXJyYXlMaXN0KCk7CiAJfQotCWZQYWNrYWdlRnJhZ21lbnRzLmFkZChwYWNrYWdlRnJhZ21lbnQpOworCXRoaXMucGFja2FnZUZyYWdtZW50cy5hZGQocGFja2FnZUZyYWdtZW50KTsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIHZvaWQgYWNjZXB0VHlwZShJVHlwZSB0eXBlKSB7Ci0JaWYgKGZUeXBlcyA9PSBudWxsKSB7Ci0JCWZUeXBlcz0gbmV3IEFycmF5TGlzdCgpOworCWlmICh0aGlzLnR5cGVzID09IG51bGwpIHsKKwkJdGhpcy50eXBlcz0gbmV3IEFycmF5TGlzdCgpOwogCX0KLQlmVHlwZXMuYWRkKHR5cGUpOworCXRoaXMudHlwZXMuYWRkKHR5cGUpOwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgSUZpZWxkW10gZ2V0RmllbGRzKCkgewotCWlmIChmRmllbGRzID09IG51bGwpIHsKLQkJcmV0dXJuIGZnRW1wdHlGaWVsZEFycmF5OworCWlmICh0aGlzLmZpZWxkcyA9PSBudWxsKSB7CisJCXJldHVybiBFTVBUWV9GSUVMRF9BUlJBWTsKIAl9Ci0JaW50IHNpemUgPSBmRmllbGRzLnNpemUoKTsKKwlpbnQgc2l6ZSA9IHRoaXMuZmllbGRzLnNpemUoKTsKIAlJRmllbGRbXSByZXN1bHRzID0gbmV3IElGaWVsZFtzaXplXTsKLQlmRmllbGRzLnRvQXJyYXkocmVzdWx0cyk7CisJdGhpcy5maWVsZHMudG9BcnJheShyZXN1bHRzKTsKIAlyZXR1cm4gcmVzdWx0czsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIElJbml0aWFsaXplcltdIGdldEluaXRpYWxpemVycygpIHsKLQlpZiAoZkluaXRpYWxpemVycyA9PSBudWxsKSB7Ci0JCXJldHVybiBmZ0VtcHR5SW5pdGlhbGl6ZXJBcnJheTsKKwlpZiAodGhpcy5pbml0aWFsaXplcnMgPT0gbnVsbCkgeworCQlyZXR1cm4gRU1QVFlfSU5JVElBTElaRVJfQVJSQVk7CiAJfQotCWludCBzaXplID0gZkluaXRpYWxpemVycy5zaXplKCk7CisJaW50IHNpemUgPSB0aGlzLmluaXRpYWxpemVycy5zaXplKCk7CiAJSUluaXRpYWxpemVyW10gcmVzdWx0cyA9IG5ldyBJSW5pdGlhbGl6ZXJbc2l6ZV07Ci0JZkluaXRpYWxpemVycy50b0FycmF5KHJlc3VsdHMpOworCXRoaXMuaW5pdGlhbGl6ZXJzLnRvQXJyYXkocmVzdWx0cyk7CiAJcmV0dXJuIHJlc3VsdHM7CiB9CiAvKioKICAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyBJVHlwZVtdIGdldE1lbWJlclR5cGVzKCkgewotCWlmIChmTWVtYmVyVHlwZXMgPT0gbnVsbCkgewotCQlyZXR1cm4gZmdFbXB0eVR5cGVBcnJheTsKKwlpZiAodGhpcy5tZW1iZXJUeXBlcyA9PSBudWxsKSB7CisJCXJldHVybiBFTVBUWV9UWVBFX0FSUkFZOwogCX0KLQlpbnQgc2l6ZSA9IGZNZW1iZXJUeXBlcy5zaXplKCk7CisJaW50IHNpemUgPSB0aGlzLm1lbWJlclR5cGVzLnNpemUoKTsKIAlJVHlwZVtdIHJlc3VsdHMgPSBuZXcgSVR5cGVbc2l6ZV07Ci0JZk1lbWJlclR5cGVzLnRvQXJyYXkocmVzdWx0cyk7CisJdGhpcy5tZW1iZXJUeXBlcy50b0FycmF5KHJlc3VsdHMpOwogCXJldHVybiByZXN1bHRzOwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgSU1ldGhvZFtdIGdldE1ldGhvZHMoKSB7Ci0JaWYgKGZNZXRob2RzID09IG51bGwpIHsKLQkJcmV0dXJuIGZnRW1wdHlNZXRob2RBcnJheTsKKwlpZiAodGhpcy5tZXRob2RzID09IG51bGwpIHsKKwkJcmV0dXJuIEVNUFRZX01FVEhPRF9BUlJBWTsKIAl9Ci0JaW50IHNpemUgPSBmTWV0aG9kcy5zaXplKCk7CisJaW50IHNpemUgPSB0aGlzLm1ldGhvZHMuc2l6ZSgpOwogCUlNZXRob2RbXSByZXN1bHRzID0gbmV3IElNZXRob2Rbc2l6ZV07Ci0JZk1ldGhvZHMudG9BcnJheShyZXN1bHRzKTsKKwl0aGlzLm1ldGhvZHMudG9BcnJheShyZXN1bHRzKTsKIAlyZXR1cm4gcmVzdWx0czsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIElQYWNrYWdlRnJhZ21lbnRbXSBnZXRQYWNrYWdlRnJhZ21lbnRzKCkgewotCWlmIChmUGFja2FnZUZyYWdtZW50cz09IG51bGwpIHsKLQkJcmV0dXJuIGZnRW1wdHlQYWNrYWdlRnJhZ21lbnRBcnJheTsKKwlpZiAodGhpcy5wYWNrYWdlRnJhZ21lbnRzPT0gbnVsbCkgeworCQlyZXR1cm4gRU1QVFlfUEFDS0FHRV9GUkFHTUVOVF9BUlJBWTsKIAl9Ci0JaW50IHNpemUgPSBmUGFja2FnZUZyYWdtZW50cy5zaXplKCk7CisJaW50IHNpemUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMuc2l6ZSgpOwogCUlQYWNrYWdlRnJhZ21lbnRbXSByZXN1bHRzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbc2l6ZV07Ci0JZlBhY2thZ2VGcmFnbWVudHMudG9BcnJheShyZXN1bHRzKTsKKwl0aGlzLnBhY2thZ2VGcmFnbWVudHMudG9BcnJheShyZXN1bHRzKTsKIAlyZXR1cm4gcmVzdWx0czsKIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIElUeXBlW10gZ2V0VHlwZXMoKSB7Ci0JaWYgKGZUeXBlcz09IG51bGwpIHsKLQkJcmV0dXJuIGZnRW1wdHlUeXBlQXJyYXk7CisJaWYgKHRoaXMudHlwZXM9PSBudWxsKSB7CisJCXJldHVybiBFTVBUWV9UWVBFX0FSUkFZOwogCX0KLQlpbnQgc2l6ZSA9IGZUeXBlcy5zaXplKCk7CisJaW50IHNpemUgPSB0aGlzLnR5cGVzLnNpemUoKTsKIAlJVHlwZVtdIHJlc3VsdHMgPSBuZXcgSVR5cGVbc2l6ZV07Ci0JZlR5cGVzLnRvQXJyYXkocmVzdWx0cyk7CisJdGhpcy50eXBlcy50b0FycmF5KHJlc3VsdHMpOwogCXJldHVybiByZXN1bHRzOwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCXJldHVybiBmQ2FuY2VsZWQ7CisJcmV0dXJuIHRoaXMuY2FuY2VsZWQ7CiB9CiAvKioKICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGlzIHJlcXVlc3Rvci4KICAqLwogcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JZkNhbmNlbGVkID0gZmFsc2U7Ci0JZkZpZWxkcyA9IG51bGw7Ci0JZkluaXRpYWxpemVycyA9IG51bGw7Ci0JZk1lbWJlclR5cGVzID0gbnVsbDsKLQlmTWV0aG9kcyA9IG51bGw7Ci0JZlBhY2thZ2VGcmFnbWVudHMgPSBudWxsOwotCWZUeXBlcyA9IG51bGw7CisJdGhpcy5jYW5jZWxlZCA9IGZhbHNlOworCXRoaXMuZmllbGRzID0gbnVsbDsKKwl0aGlzLmluaXRpYWxpemVycyA9IG51bGw7CisJdGhpcy5tZW1iZXJUeXBlcyA9IG51bGw7CisJdGhpcy5tZXRob2RzID0gbnVsbDsKKwl0aGlzLnBhY2thZ2VGcmFnbWVudHMgPSBudWxsOworCXRoaXMudHlwZXMgPSBudWxsOwogfQogLyoqCiAgKiBTZXRzIHRoZSAjaXNDYW5jZWxlZCBzdGF0ZSBvZiB0aGlzIHJlcXVlc3RvciB0byB0cnVlIG9yIGZhbHNlLgogICovCiBwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGIpIHsKLQlmQ2FuY2VsZWQ9IGI7CisJdGhpcy5jYW5jZWxlZD0gYjsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKaW5kZXggNTE5YmY3YS4uZDJlNmFiYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNyArMTUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0yNSwzMyArMjQsMzQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVtZW50b1Rva2VuaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogCiAvKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklKYXZhTW9kZWw8Y29kZT4uIFRoZSBKYXZhIE1vZGVsIG1haW50YWlucyBhIGNhY2hlIG9mCi0gKiBhY3RpdmUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPnMgaW4gYSB3b3Jrc3BhY2UuIEEgSmF2YSBNb2RlbCBpcyBzcGVjaWZpYyB0byBhCi0gKiB3b3Jrc3BhY2UuIFRvIHJldHJpZXZlIGEgd29ya3NwYWNlJ3MgbW9kZWwsIHVzZSB0aGUKLSAqIDxjb2RlPiNnZXRKYXZhTW9kZWwoSVdvcmtzcGFjZSk8L2NvZGU+IG1ldGhvZC4KKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJSmF2YU1vZGVsfS4gVGhlIEphdmEgTW9kZWwgbWFpbnRhaW5zIGEgY2FjaGUgb2YgYWN0aXZlCisgKiB7QGxpbmsgSUphdmFQcm9qZWN0fXMgaW4gYSB3b3Jrc3BhY2UuIEEgSmF2YSBNb2RlbCBpcyBzcGVjaWZpYyB0byBhIHdvcmtzcGFjZS4KKyAqIFRvIHJldHJpZXZlIGEgd29ya3NwYWNlJ3MgbW9kZWwsIHVzZSB0aGUKKyAqIHtAbGluayBJSmF2YUVsZW1lbnQjZ2V0SmF2YU1vZGVsKCkgI2dldEphdmFNb2RlbCgpfSBtZXRob2QuCiAgKgogICogQHNlZSBJSmF2YU1vZGVsCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhTW9kZWwgZXh0ZW5kcyBPcGVuYWJsZSBpbXBsZW1lbnRzIElKYXZhTW9kZWwgewogCiAJLyoqCi0JICogQSBzZXQgb2YgamF2YS5pby5GaWxlcyB1c2VkIGFzIGEgY2FjaGUgb2YgZXh0ZXJuYWwgamFycyB0aGF0IAorCSAqIEEgc2V0IG9mIGphdmEuaW8uRmlsZXMgdXNlZCBhcyBhIGNhY2hlIG9mIGV4dGVybmFsIGphcnMgdGhhdAogCSAqIGFyZSBrbm93biB0byBiZSBleGlzdGluZy4KIAkgKiBOb3RlIHRoaXMgY2FjaGUgaXMga2VwdCBmb3IgdGhlIHdob2xlIHNlc3Npb24uCi0JICovIAorCSAqLwogCXB1YmxpYyBzdGF0aWMgSGFzaFNldCBleGlzdGluZ0V4dGVybmFsRmlsZXMgPSBuZXcgSGFzaFNldCgpOwogCiAJLyoqCiAJICogQSBzZXQgb2YgZXh0ZXJuYWwgZmlsZXMgKHtAbGluayAjZXhpc3RpbmdFeHRlcm5hbEZpbGVzfSkgd2hpY2ggaGF2ZQotCSAqIGJlZW4gY29uZmlybWVkIGFzIGZpbGUgKGllLiB3aGljaCByZXR1cm5zIHRydWUgdG8ge0BsaW5rIGphdmEuaW8uRmlsZSNpc0ZpbGUoKX0uCisJICogYmVlbiBjb25maXJtZWQgYXMgZmlsZSAoaS5lLiB3aGljaCByZXR1cm5zIHRydWUgdG8ge0BsaW5rIGphdmEuaW8uRmlsZSNpc0ZpbGUoKX0uCiAJICogTm90ZSB0aGlzIGNhY2hlIGlzIGtlcHQgZm9yIHRoZSB3aG9sZSBzZXNzaW9uLgotCSAqLyAKKwkgKi8KIAlwdWJsaWMgc3RhdGljIEhhc2hTZXQgZXhpc3RpbmdFeHRlcm5hbENvbmZpcm1lZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKIAogLyoqCkBAIC01OSw3ICs1OSw3IEBACiAgKiBOb3RlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgSmF2YU1vZGVsIGhhbmRsZSBzaG91bGQgZXZlciBiZSBjcmVhdGVkLgogICogT25lIHNob3VsZCBvbmx5IGluZGlyZWN0IHRocm91Z2ggSmF2YU1vZGVsTWFuYWdlciNnZXRKYXZhTW9kZWwoKSB0byBnZXQKICAqIGFjY2VzcyB0byBpdC4KLSAqIAorICoKICAqIEBleGNlcHRpb24gRXJyb3IgaWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCiAgKi8KIHByb3RlY3RlZCBKYXZhTW9kZWwoKSB0aHJvd3MgRXJyb3IgewpAQCAtODMsNyArODMsNyBAQAogCWluZm8uc2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwogCiAJbmV3RWxlbWVudHMucHV0KHRoaXMsIGluZm8pOwotCQorCiAJcmV0dXJuIHRydWU7CiB9CiAvKgpAQCAtOTgsNyArOTgsNyBAQAogCS8vIGZpbGUgb3IgZm9sZGVyCiAJSUphdmFQcm9qZWN0W10gcHJvamVjdHM7CiAJdHJ5IHsKLQkJcHJvamVjdHMgPSB0aGlzLmdldEphdmFQcm9qZWN0cygpOworCQlwcm9qZWN0cyA9IGdldEphdmFQcm9qZWN0cygpOwogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKIAkJCXJldHVybiBuZXcgSmF2YVByb2plY3QoKElQcm9qZWN0KXJlc291cmNlLCB0aGlzKTsKIAkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9pbnZhbGlkUmVzb3VyY2VGb3JQcm9qZWN0KTsgCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaW52YWxpZFJlc291cmNlRm9yUHJvamVjdCk7CiAJfQogfQogLyoqCkBAIC0yMzQsNyArMjM0LDcgQEAKIC8qCiAgKiBAc2VlIElKYXZhRWxlbWVudAogICovCi1wdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworcHVibGljIElSZXNvdXJjZSByZXNvdXJjZShQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QpIHsKIAlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKIH0KIC8qKgpAQCAtMjgxLDcgKzI4MSw3IEBACiAJfSBlbHNlIHsKIAkJb3AgPSBuZXcgUmVuYW1lRWxlbWVudHNPcGVyYXRpb24oZWxlbWVudHMsIGRlc3RpbmF0aW9ucywgcmVuYW1pbmdzLCBmb3JjZSk7CiAJfQotCQorCiAJb3AucnVuT3BlcmF0aW9uKG1vbml0b3IpOwogfQogLyoqCkBAIC0zMDAsNyArMzAwLDcgQEAKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewotCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCIpOyAvLyROT04tTkxTLTEkCiAJaWYgKGluZm8gPT0gbnVsbCkgewogCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCkBAIC0zMDgsNjAgKzMwOCw3MiBAQAogfQogCiAvKioKLSAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHRoZSB0YXJnZXRlZCBpdGVtIChJUmVzb3VyY2UgaWYgaW50ZXJuYWwgb3IgamF2YS5pby5GaWxlIGlmIGV4dGVybmFsKSwgCisgKiBIZWxwZXIgbWV0aG9kIC0gcmV0dXJucyB0aGUgdGFyZ2V0ZWQgaXRlbSAoSVJlc291cmNlIGlmIGludGVybmFsIG9yIGphdmEuaW8uRmlsZSBpZiBleHRlcm5hbCksCiAgKiBvciBudWxsIGlmIHVuYm91bmQKICAqIEludGVybmFsIGl0ZW1zIG11c3QgYmUgcmVmZXJyZWQgdG8gdXNpbmcgY29udGFpbmVyIHJlbGF0aXZlIHBhdGhzLgogICovCi1wdWJsaWMgc3RhdGljIE9iamVjdCBnZXRUYXJnZXQoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIHBhdGgsIGJvb2xlYW4gY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSkgewotCi0JaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JLy8gbG9va3VwIC0gaW5zaWRlIHRoZSBjb250YWluZXIKLQlpZiAocGF0aC5nZXREZXZpY2UoKSA9PSBudWxsKSB7IC8vIGNvbnRhaW5lciByZWxhdGl2ZSBwYXRocyBzaG91bGQgbm90IGNvbnRhaW4gYSBkZXZpY2UgCi0JCQkJCQkJCQkJCQkvLyAoc2VlIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2ODQpCi0JCQkJCQkJCQkJCQkvLyAoY2FzZSBvZiBhIHdvcmtzcGFjZSByb290ZWQgYXQgZDpcICkKLQkJSVJlc291cmNlIHJlc291cmNlID0gY29udGFpbmVyLmZpbmRNZW1iZXIocGF0aCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKXsKLQkJCWlmICghY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSB8fHJlc291cmNlLmV4aXN0cygpKSByZXR1cm4gcmVzb3VyY2U7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvLyBpZiBwYXRoIGlzIHJlbGF0aXZlLCBpdCBjYW5ub3QgYmUgYW4gZXh0ZXJuYWwgcGF0aAotCS8vIChzZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjUxNykKLQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSByZXR1cm4gbnVsbDsgCi0KLQkvLyBsb29rdXAgLSBvdXRzaWRlIHRoZSBjb250YWluZXIKLQlyZXR1cm4gZ2V0VGFyZ2V0QXNFeHRlcm5hbEZpbGUocGF0aCwgY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSk7CQorcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFyZ2V0KElQYXRoIHBhdGgsIGJvb2xlYW4gY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSkgeworCU9iamVjdCB0YXJnZXQgPSBnZXRXb3Jrc3BhY2VUYXJnZXQocGF0aCk7IC8vIEltcGxpY2l0bHkgY2hlY2tzIHJlc291cmNlIGV4aXN0ZW5jZQorCWlmICh0YXJnZXQgIT0gbnVsbCkKKwkJcmV0dXJuIHRhcmdldDsKKwlyZXR1cm4gZ2V0RXh0ZXJuYWxUYXJnZXQocGF0aCwgY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSk7CiB9Ci1wcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgT2JqZWN0IGdldFRhcmdldEFzRXh0ZXJuYWxGaWxlKElQYXRoIHBhdGgsIGJvb2xlYW4gY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSkgeworcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlVGFyZ2V0KElQYXRoIHBhdGgpIHsKKwlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZ2V0RGV2aWNlKCkgIT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJaWYgKHdvcmtzcGFjZSA9PSBudWxsKQorCQlyZXR1cm4gbnVsbDsKKwlyZXR1cm4gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOworfQorcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RXh0ZXJuYWxUYXJnZXQoSVBhdGggcGF0aCwgYm9vbGVhbiBjaGVja1Jlc291cmNlRXhpc3RlbmNlKSB7CisJaWYgKHBhdGggPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRFeHRlcm5hbE1hbmFnZXIoKTsKKwlPYmplY3QgbGlua2VkRm9sZGVyID0gZXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5nZXRGb2xkZXIocGF0aCk7CisJaWYgKGxpbmtlZEZvbGRlciAhPSBudWxsKSB7CisJCWlmIChjaGVja1Jlc291cmNlRXhpc3RlbmNlKSB7CisJCQkvLyBjaGVjayBpZiBleHRlcm5hbCBmb2xkZXIgaXMgcHJlc2VudAorCQkJRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7CisJCQlpZiAoIWV4dGVybmFsRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpbmtlZEZvbGRlcjsKKwl9CiAJRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7CiAJaWYgKCFjaGVja1Jlc291cmNlRXhpc3RlbmNlKSB7CiAJCXJldHVybiBleHRlcm5hbEZpbGU7Ci0JfSBlbHNlIGlmIChleGlzdGluZ0V4dGVybmFsRmlsZXMuY29udGFpbnMoZXh0ZXJuYWxGaWxlKSkgeworCX0gZWxzZSBpZiAoZXhpc3RpbmdFeHRlcm5hbEZpbGVzQ29udGFpbnMoZXh0ZXJuYWxGaWxlKSkgewogCQlyZXR1cm4gZXh0ZXJuYWxGaWxlOwotCX0gZWxzZSB7IAorCX0gZWxzZSB7CiAJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgewogCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmF2YU1vZGVsLmdldFRhcmdldCguLi4pXSBDaGVja2luZyBleGlzdGVuY2Ugb2YgIiArIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9Ci0JCWlmIChleHRlcm5hbEZpbGUuZXhpc3RzKCkpIHsKKwkJaWYgKGV4dGVybmFsRmlsZS5pc0ZpbGUoKSkgeyAvLyBpc0ZpbGUoKSBjaGVja3MgZm9yIGV4aXN0ZW5jZSAoaXQgcmV0dXJucyBmYWxzZSBpZiBhIGRpcmVjdG9yeSkKIAkJCS8vIGNhY2hlIGV4dGVybmFsIGZpbGUKLQkJCWV4aXN0aW5nRXh0ZXJuYWxGaWxlcy5hZGQoZXh0ZXJuYWxGaWxlKTsKKwkJCWV4aXN0aW5nRXh0ZXJuYWxGaWxlc0FkZChleHRlcm5hbEZpbGUpOwogCQkJcmV0dXJuIGV4dGVybmFsRmlsZTsKIAkJfQogCX0KIAlyZXR1cm4gbnVsbDsKIH0KK3ByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGV4aXN0aW5nRXh0ZXJuYWxGaWxlc0FkZChGaWxlIGV4dGVybmFsRmlsZSkgeworCWV4aXN0aW5nRXh0ZXJuYWxGaWxlcy5hZGQoZXh0ZXJuYWxGaWxlKTsKK30KK3ByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGV4aXN0aW5nRXh0ZXJuYWxGaWxlc0NvbnRhaW5zKEZpbGUgZXh0ZXJuYWxGaWxlKSB7CisJcmV0dXJuIGV4aXN0aW5nRXh0ZXJuYWxGaWxlcy5jb250YWlucyhleHRlcm5hbEZpbGUpOworfQogCiAvKioKLSAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGFmaWxlIChpZS4gd2hpY2ggcmV0dXJucyB0cnVlIHRvIHtAbGluayBqYXZhLmlvLkZpbGUjaXNGaWxlKCl9LgorICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgd2hldGhlciBhbiBvYmplY3QgaXMgYWZpbGUgKGkuZS4gd2hpY2ggcmV0dXJucyB0cnVlIHRvIHtAbGluayBqYXZhLmlvLkZpbGUjaXNGaWxlKCl9LgogICovCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlKE9iamVjdCB0YXJnZXQpIHsKIAlyZXR1cm4gZ2V0RmlsZSh0YXJnZXQpICE9IG51bGw7CiB9CiAKIC8qKgotICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgdGhlIGZpbGUgaXRlbSAoaWUuIHdoaWNoIHJldHVybnMgdHJ1ZSB0byB7QGxpbmsgamF2YS5pby5GaWxlI2lzRmlsZSgpfSwKKyAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHRoZSBmaWxlIGl0ZW0gKGkuZS4gd2hpY2ggcmV0dXJucyB0cnVlIHRvIHtAbGluayBqYXZhLmlvLkZpbGUjaXNGaWxlKCl9LAogICogb3IgbnVsbCBpZiB1bmJvdW5kCiAgKi8KIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGUgZ2V0RmlsZShPYmplY3QgdGFyZ2V0KSB7CkBAIC0zNzQsNyArMzg2LDEyIEBACiAJCQlyZXR1cm4gZjsKIAkJfQogCX0KLQkKKwogCXJldHVybiBudWxsOwogfQorCitwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0ZW5jZShJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB7CisJLy8gSmF2YSBtb2RlbCBhbHdheXMgZXhpc3RzCisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxDYWNoZS5qYXZhCmluZGV4IGVlMmQ4MGIuLjZhMDQ5YTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbENhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsQ2FjaGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw2ICsxNCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5MUlVDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgogICogVGhlIGNhY2hlIG9mIGphdmEgZWxlbWVudHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpbmZvLgpAQCAtMjQsOCArMjUsOSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPSkVDVF9TSVpFID0gNTsgIC8vIGF2ZXJhZ2UgMjU1NTIgYnl0ZXMgcGVyIHByb2plY3QuCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST09UX1NJWkUgPSA1MDsgLy8gYXZlcmFnZSAyNTkwIGJ5dGVzIHBlciByb290IC0+IG1heGltdW0gc2l6ZSA6IDI1OTAwKkJBU0VfVkFMVUUgYnl0ZXMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BLR19TSVpFID0gNTAwOyAvLyBhdmVyYWdlIDE3ODIgYnl0ZXMgcGVyIHBrZyAtPiBtYXhpbXVtIHNpemUgOiAxNzgyMDAqQkFTRV9WQUxVRSBieXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfT1BFTkFCTEVfU0laRSA9IDUwMDsgLy8gYXZlcmFnZSA2NjI5IGJ5dGVzIHBlciBvcGVuYWJsZSAoaW5jbHVkZXMgY2hpbGRyZW4pIC0+IG1heGltdW0gc2l6ZSA6IDY2MjkwMCpCQVNFX1ZBTFVFIGJ5dGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSElMRFJFTl9TSVpFID0gNTAwKjIwOyAvLyBhdmVyYWdlIDIwIGNoaWxkcmVuIHBlciBvcGVuYWJsZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfT1BFTkFCTEVfU0laRSA9IDI1MDsgLy8gYXZlcmFnZSA2NjI5IGJ5dGVzIHBlciBvcGVuYWJsZSAoaW5jbHVkZXMgY2hpbGRyZW4pIC0+IG1heGltdW0gc2l6ZSA6IDY2MjkwMCpCQVNFX1ZBTFVFIGJ5dGVzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSElMRFJFTl9TSVpFID0gMjUwKjIwOyAvLyBhdmVyYWdlIDIwIGNoaWxkcmVuIHBlciBvcGVuYWJsZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBVElPX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFtb2RlbGNhY2hlLnJhdGlvIjsgLy8kTk9OLU5MUy0xJAogCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5PTl9FWElTVElOR19KQVJfVFlQRV9JTkZPID0gbmV3IE9iamVjdCgpOwogCkBAIC0zMywyMiArMzUsMjIgQEAKIAkgKiBUaGUgbWVtb3J5IHJhdGlvIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGFib3ZlIGNvbnN0YW50cy4KIAkgKi8KIAlwcm90ZWN0ZWQgZG91YmxlIG1lbW9yeVJhdGlvID0gLTE7Ci0JCisKIAkvKioKIAkgKiBBY3RpdmUgSmF2YSBNb2RlbCBJbmZvCiAJICovCi0JcHJvdGVjdGVkIEphdmFNb2RlbEluZm8gbW9kZWxJbmZvOwotCQorCXByb3RlY3RlZCBPYmplY3QgbW9kZWxJbmZvOworCiAJLyoqCiAJICogQ2FjaGUgb2Ygb3BlbiBwcm9qZWN0cy4KIAkgKi8KIAlwcm90ZWN0ZWQgSGFzaE1hcCBwcm9qZWN0Q2FjaGU7Ci0JCisKIAkvKioKIAkgKiBDYWNoZSBvZiBvcGVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCiAJICovCiAJcHJvdGVjdGVkIEVsZW1lbnRDYWNoZSByb290Q2FjaGU7Ci0JCisKIAkvKioKIAkgKiBDYWNoZSBvZiBvcGVuIHBhY2thZ2UgZnJhZ21lbnRzCiAJICovCkBAIC02MywyOSArNjUsNDQgQEAKIAkgKiBDYWNoZSBvZiBvcGVuIGNoaWxkcmVuIG9mIG9wZW5hYmxlIEphdmEgTW9kZWwgSmF2YSBlbGVtZW50cwogCSAqLwogCXByb3RlY3RlZCBNYXAgY2hpbGRyZW5DYWNoZTsKLQkKKwogCS8qCiAJICogQ2FjaGUgb2Ygb3BlbiBiaW5hcnkgdHlwZSAoaW5zaWRlIGEgamFyKSB0aGF0IGhhdmUgYSBub24tb3BlbiBwYXJlbnQKIAkgKi8KIAlwcm90ZWN0ZWQgTFJVQ2FjaGUgamFyVHlwZUNhY2hlOwotCQorCiBwdWJsaWMgSmF2YU1vZGVsQ2FjaGUoKSB7CiAJLy8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZXMgaW4gZnVuY3Rpb24gb2YgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUKIAlkb3VibGUgcmF0aW8gPSBnZXRNZW1vcnlSYXRpbygpOworCS8vIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgb3BlbmFibGUgY2FjaGUgaW4gZnVuY3Rpb24gb2YgdGhlIFJBVElPX1BST1BFUlRZIHByb3BlcnR5CisJZG91YmxlIG9wZW5hYmxlUmF0aW8gPSBnZXRPcGVuYWJsZVJhdGlvKCk7CiAJdGhpcy5wcm9qZWN0Q2FjaGUgPSBuZXcgSGFzaE1hcChERUZBVUxUX1BST0pFQ1RfU0laRSk7IC8vIE5COiBEb24ndCB1c2UgYSBMUlVDYWNoZSBmb3IgcHJvamVjdHMgYXMgdGhleSBhcmUgY29uc3RhbnRseSByZW9wZW5lZCAoZS5nLiBkdXJpbmcgZGVsdGEgcHJvY2Vzc2luZykKIAlpZiAoVkVSQk9TRSkgewogCQl0aGlzLnJvb3RDYWNoZSA9IG5ldyBWZXJib3NlRWxlbWVudENhY2hlKChpbnQpIChERUZBVUxUX1JPT1RfU0laRSAqIHJhdGlvKSwgIlJvb3QgY2FjaGUiKTsgLy8kTk9OLU5MUy0xJAogCQl0aGlzLnBrZ0NhY2hlID0gbmV3IFZlcmJvc2VFbGVtZW50Q2FjaGUoKGludCkgKERFRkFVTFRfUEtHX1NJWkUgKiByYXRpbyksICJQYWNrYWdlIGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5vcGVuYWJsZUNhY2hlID0gbmV3IFZlcmJvc2VFbGVtZW50Q2FjaGUoKGludCkgKERFRkFVTFRfT1BFTkFCTEVfU0laRSAqIHJhdGlvKSwgIk9wZW5hYmxlIGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5vcGVuYWJsZUNhY2hlID0gbmV3IFZlcmJvc2VFbGVtZW50Q2FjaGUoKGludCkgKERFRkFVTFRfT1BFTkFCTEVfU0laRSAqIHJhdGlvICogb3BlbmFibGVSYXRpbyksICJPcGVuYWJsZSBjYWNoZSIpOyAvLyROT04tTkxTLTEkCiAJfSBlbHNlIHsKIAkJdGhpcy5yb290Q2FjaGUgPSBuZXcgRWxlbWVudENhY2hlKChpbnQpIChERUZBVUxUX1JPT1RfU0laRSAqIHJhdGlvKSk7CiAJCXRoaXMucGtnQ2FjaGUgPSBuZXcgRWxlbWVudENhY2hlKChpbnQpIChERUZBVUxUX1BLR19TSVpFICogcmF0aW8pKTsKLQkJdGhpcy5vcGVuYWJsZUNhY2hlID0gbmV3IEVsZW1lbnRDYWNoZSgoaW50KSAoREVGQVVMVF9PUEVOQUJMRV9TSVpFICogcmF0aW8pKTsKKwkJdGhpcy5vcGVuYWJsZUNhY2hlID0gbmV3IEVsZW1lbnRDYWNoZSgoaW50KSAoREVGQVVMVF9PUEVOQUJMRV9TSVpFICogcmF0aW8gKiBvcGVuYWJsZVJhdGlvKSk7CiAJfQotCXRoaXMuY2hpbGRyZW5DYWNoZSA9IG5ldyBIYXNoTWFwKChpbnQpIChERUZBVUxUX0NISUxEUkVOX1NJWkUgKiByYXRpbykpOworCXRoaXMuY2hpbGRyZW5DYWNoZSA9IG5ldyBIYXNoTWFwKChpbnQpIChERUZBVUxUX0NISUxEUkVOX1NJWkUgKiByYXRpbyAqIG9wZW5hYmxlUmF0aW8pKTsKIAlyZXNldEphclR5cGVDYWNoZSgpOwogfQogCitwcml2YXRlIGRvdWJsZSBnZXRPcGVuYWJsZVJhdGlvKCkgeworCVN0cmluZyBwcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShSQVRJT19QUk9QRVJUWSk7CisJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUocHJvcGVydHkpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHBhcnNlIHZhbHVlIGZvciAiICsgUkFUSU9fUFJPUEVSVFkgKyAiOiAiICsgcHJvcGVydHkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKwlyZXR1cm4gMS4wOworfQorCiAvKioKICAqICBSZXR1cm5zIHRoZSBpbmZvIGZvciB0aGUgZWxlbWVudC4KICAqLwpAQCAtMTEzLDEyICsxMzAsMzYgQEAKIAl9CiB9CiAKKy8qCisgKiAgUmV0dXJucyB0aGUgZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBlbGVtZW50IGlmIHByZXNlbnQgaW4gdGhlIGNhY2hlLgorICogIFJldHVybnMgdGhlIGdpdmVuIGVsZW1lbnQgb3RoZXJ3aXNlLgorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldEV4aXN0aW5nRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CisJCQlyZXR1cm4gZWxlbWVudDsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgorCQkJcmV0dXJuIGVsZW1lbnQ7IC8vIHByb2plY3RDYWNoZSBpcyBhIEhhc2h0YWJsZSBhbmQgSGFzaHRhYmxlcyBkb24ndCBzdXBwb3J0IGdldEtleSguLi4pCisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKKwkJCXJldHVybiAoSUphdmFFbGVtZW50KSB0aGlzLnJvb3RDYWNoZS5nZXRLZXkoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CisJCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgdGhpcy5wa2dDYWNoZS5nZXRLZXkoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgdGhpcy5vcGVuYWJsZUNhY2hlLmdldEtleShlbGVtZW50KTsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKKwkJCXJldHVybiBlbGVtZW50OyAvLyBqYXJUeXBlQ2FjaGUgb3IgY2hpbGRyZW5DYWNoZSBhcmUgSGFzaHRhYmxlcyBhbmQgSGFzaHRhYmxlcyBkb24ndCBzdXBwb3J0IGdldEtleSguLi4pCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZWxlbWVudDsgLy8gY2hpbGRyZW5DYWNoZSBpcyBhIEhhc2h0YWJsZSBhbmQgSGFzaHRhYmxlcyBkb24ndCBzdXBwb3J0IGdldEtleSguLi4pCisJfQorfQorCiBwcm90ZWN0ZWQgZG91YmxlIGdldE1lbW9yeVJhdGlvKCkgewotCWlmICh0aGlzLm1lbW9yeVJhdGlvID09IC0xKSB7Ci0JCWxvbmcgbWF4TWVtb3J5ID0gUnVudGltZS5nZXRSdW50aW1lKCkubWF4TWVtb3J5KCk7CQkKKwlpZiAoKGludCkgdGhpcy5tZW1vcnlSYXRpbyA9PSAtMSkgeworCQlsb25nIG1heE1lbW9yeSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpOwogCQkvLyBpZiBtYXggbWVtb3J5IGlzIGluZmluaXRlLCBzZXQgdGhlIHJhdGlvIHRvIDRkIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSAyNTZNQiB0aGF0IEVjbGlwc2UgZGVmYXVsdHMgdG8KIAkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMjk5KQotCQl0aGlzLm1lbW9yeVJhdGlvID0gbWF4TWVtb3J5ID09IExvbmcuTUFYX1ZBTFVFID8gNGQgOiAoKGRvdWJsZSkgbWF4TWVtb3J5KSAvICg2NCAqIDB4MTAwMDAwKTsgLy8gNjRNQiBpcyB0aGUgYmFzZSBtZW1vcnkgZm9yIG1vc3QgSlZNCQorCQl0aGlzLm1lbW9yeVJhdGlvID0gbWF4TWVtb3J5ID09IExvbmcuTUFYX1ZBTFVFID8gNGQgOiAoKGRvdWJsZSkgbWF4TWVtb3J5KSAvICg2NCAqIDB4MTAwMDAwKTsgLy8gNjRNQiBpcyB0aGUgYmFzZSBtZW1vcnkgZm9yIG1vc3QgSlZNCiAJfQogCXJldHVybiB0aGlzLm1lbW9yeVJhdGlvOwogfQpAQCAtMTU3LDE5ICsxOTgsMTkgQEAKIHByb3RlY3RlZCB2b2lkIHB1dEluZm8oSUphdmFFbGVtZW50IGVsZW1lbnQsIE9iamVjdCBpbmZvKSB7CiAJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKLQkJCXRoaXMubW9kZWxJbmZvID0gKEphdmFNb2RlbEluZm8pIGluZm87CisJCQl0aGlzLm1vZGVsSW5mbyA9IGluZm87CiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgogCQkJdGhpcy5wcm9qZWN0Q2FjaGUucHV0KGVsZW1lbnQsIGluZm8pOwotCQkJdGhpcy5yb290Q2FjaGUuZW5zdXJlU3BhY2VMaW1pdCgoKEphdmFFbGVtZW50SW5mbykgaW5mbykuY2hpbGRyZW4ubGVuZ3RoLCBlbGVtZW50KTsKKwkJCXRoaXMucm9vdENhY2hlLmVuc3VyZVNwYWNlTGltaXQoaW5mbywgZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgogCQkJdGhpcy5yb290Q2FjaGUucHV0KGVsZW1lbnQsIGluZm8pOwotCQkJdGhpcy5wa2dDYWNoZS5lbnN1cmVTcGFjZUxpbWl0KCgoSmF2YUVsZW1lbnRJbmZvKSBpbmZvKS5jaGlsZHJlbi5sZW5ndGgsIGVsZW1lbnQpOworCQkJdGhpcy5wa2dDYWNoZS5lbnN1cmVTcGFjZUxpbWl0KGluZm8sIGVsZW1lbnQpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CiAJCQl0aGlzLnBrZ0NhY2hlLnB1dChlbGVtZW50LCBpbmZvKTsKLQkJCXRoaXMub3BlbmFibGVDYWNoZS5lbnN1cmVTcGFjZUxpbWl0KCgoSmF2YUVsZW1lbnRJbmZvKSBpbmZvKS5jaGlsZHJlbi5sZW5ndGgsIGVsZW1lbnQpOworCQkJdGhpcy5vcGVuYWJsZUNhY2hlLmVuc3VyZVNwYWNlTGltaXQoaW5mbywgZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKIAkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRToKQEAgLTE5Nyw3ICsyMzgsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CiAJCQl0aGlzLnBrZ0NhY2hlLnJlbW92ZShlbGVtZW50KTsKLQkJCXRoaXMub3BlbmFibGVDYWNoZS5yZXNldFNwYWNlTGltaXQoKGludCkgKERFRkFVTFRfT1BFTkFCTEVfU0laRSAqIGdldE1lbW9yeVJhdGlvKCkpLCBlbGVtZW50KTsKKwkJCXRoaXMub3BlbmFibGVDYWNoZS5yZXNldFNwYWNlTGltaXQoKGludCkgKERFRkFVTFRfT1BFTkFCTEVfU0laRSAqIGdldE1lbW9yeVJhdGlvKCkgKiBnZXRPcGVuYWJsZVJhdGlvKCkpLCBlbGVtZW50KTsKIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgogCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhCmluZGV4IDRjNTI2M2YuLjFmMzljNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOSw3ICs5LDcgQEAKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqICAgICBUaGVvZG9yYSBZZXVuZyAodHlldW5nQGJlYS5jb20pIC0gZW5zdXJlIHRoYXQgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBtYWtlIGl0IGludG8gY2FjaGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgaXRzIGNvbnRlbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDIyKSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDI0MjIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKQEAgLTMyLDggKzMzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ29tcGlsYXRpb25QYXJ0aWNpcGFudDsKQEAgLTYyLDYgKzYzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5XZWFrSGFzaFNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLldlYWtIYXNoU2V0T2ZDaGFyQXJyYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5MUlVDYWNoZS5TdGF0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyOwogaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKQEAgLTc3LDEzICs4MCw1MiBAQAogICogVGhlIHNpbmdsZSBpbnN0YW5jZSBvZiA8Y29kZT5KYXZhTW9kZWxNYW5hZ2VyPC9jb2RlPiBpcyBhdmFpbGFibGUgZnJvbQogICogdGhlIHN0YXRpYyBtZXRob2QgPGNvZGU+SmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk8L2NvZGU+LgogICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZGVsTWFuYWdlciBpbXBsZW1lbnRzIElTYXZlUGFydGljaXBhbnQsIElDb250ZW50VHlwZUNoYW5nZUxpc3RlbmVyIHsgCQotIAorcHVibGljIGNsYXNzIEphdmFNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBJU2F2ZVBhcnRpY2lwYW50LCBJQ29udGVudFR5cGVDaGFuZ2VMaXN0ZW5lciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0NIQUlOSU5HX0pBUlNfQ0FDSEUgPSAibm9uQ2hhaW5pbmdKYXJzQ2FjaGUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfQVJDSElWRVNfQ0FDSEUgPSAiaW52YWxpZEFyY2hpdmVzQ2FjaGUiOyAgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogRGVmaW5lIGEgemlwIGNhY2hlIG9iamVjdC4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgWmlwQ2FjaGUgeworCQlwcml2YXRlIE1hcCBtYXA7CisJCU9iamVjdCBvd25lcjsKKworCQlaaXBDYWNoZShPYmplY3Qgb3duZXIpIHsKKwkJCXRoaXMubWFwID0gbmV3IEhhc2hNYXAoKTsKKwkJCXRoaXMub3duZXIgPSBvd25lcjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCQkJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLm1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCXRyeSB7CisJCQkJCVppcEZpbGUgemlwRmlsZSA9IChaaXBGaWxlKWl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigiICsgY3VycmVudFRocmVhZCArICIpIFtKYXZhTW9kZWxNYW5hZ2VyLmZsdXNoWmlwRmlsZXMoKV0gQ2xvc2luZyBaaXBGaWxlIG9uICIgK3ppcEZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJfQorCQkJCQl6aXBGaWxlLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBwcm9ibGVtIG9jY3VyZWQgY2xvc2luZyB6aXAgZmlsZTogY2Fubm90IGRvIG11Y2ggbW9yZQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXB1YmxpYyBaaXBGaWxlIGdldENhY2hlKElQYXRoIHBhdGgpIHsKKwkJCXJldHVybiAoWmlwRmlsZSkgdGhpcy5tYXAuZ2V0KHBhdGgpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q2FjaGUoSVBhdGggcGF0aCwgWmlwRmlsZSB6aXBGaWxlKSB7CisJCQl0aGlzLm1hcC5wdXQocGF0aCwgemlwRmlsZSk7CisJCX0KKwl9CiAJLyoqCiAJICogVW5pcXVlIGhhbmRsZSBvbnRvIHRoZSBKYXZhTW9kZWwKIAkgKi8KIAlmaW5hbCBKYXZhTW9kZWwgamF2YU1vZGVsID0gbmV3IEphdmFNb2RlbCgpOwotCQorCiAJLyoqCiAJICogQ2xhc3NwYXRoIHZhcmlhYmxlcyBwb29sCiAJICovCkBAIC0xMDAsNDMgKzE0Miw1MSBAQAogCXB1YmxpYyBIYXNoTWFwIGNvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCg1KTsKIAlwdWJsaWMgSGFzaE1hcCBwcmV2aW91c1Nlc3Npb25Db250YWluZXJzID0gbmV3IEhhc2hNYXAoNSk7CiAJcHJpdmF0ZSBUaHJlYWRMb2NhbCBjb250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQlwdWJsaWMgYm9vbGVhbiBiYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucyA9IGZhbHNlOwotCXB1YmxpYyBUaHJlYWRMb2NhbCBiYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzID0gbmV3IFRocmVhZExvY2FsKCk7Ci0JcHVibGljIEhhc2hNYXAgY29udGFpbmVySW5pdGlhbGl6ZXJzQ2FjaGUgPSBuZXcgSGFzaE1hcCg1KTsKKwlUaHJlYWRMb2NhbCBjb250YWluZXJzQmVpbmdJbml0aWFsaXplZCA9IG5ldyBUaHJlYWRMb2NhbCgpOwogCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0JBVENIX0lOSVRJQUxJWkFUSU9OID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORUVEX0JBVENIX0lOSVRJQUxJWkFUSU9OID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRDSF9JTklUSUFMSVpBVElPTl9JTl9QUk9HUkVTUyA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUQ0hfSU5JVElBTElaQVRJT05fRklOSVNIRUQgPSAzOworCXB1YmxpYyBpbnQgYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSBOT19CQVRDSF9JTklUSUFMSVpBVElPTjsKKworCXB1YmxpYyBCYXRjaEluaXRpYWxpemF0aW9uTW9uaXRvciBiYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzID0gbmV3IEJhdGNoSW5pdGlhbGl6YXRpb25Nb25pdG9yKCk7CisJcHVibGljIEhhc2h0YWJsZSBjb250YWluZXJJbml0aWFsaXplcnNDYWNoZSA9IG5ldyBIYXNodGFibGUoNSk7CisKIAkvKgogCSAqIEEgSGFzaFNldCB0aGF0IGNvbnRhaW5zIHRoZSBJSmF2YVByb2plY3Qgd2hvc2UgY2xhc3NwYXRoIGlzIGJlaW5nIHJlc29sdmVkLgogCSAqLwogCXByaXZhdGUgVGhyZWFkTG9jYWwgY2xhc3NwYXRoc0JlaW5nUmVzb2x2ZWQgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQkKKwogCS8qCiAJICogVGhlIHVuaXF1ZSB3b3Jrc3BhY2Ugc2NvcGUKIAkgKi8KIAlwdWJsaWMgSmF2YVdvcmtzcGFjZVNjb3BlIHdvcmtzcGFjZVNjb3BlOwotCQorCiAJLyoKIAkgKiBQb29scyBvZiBzeW1ib2xzIHVzZWQgaW4gdGhlIEphdmEgbW9kZWwuCiAJICogVXNlZCBhcyBhIHJlcGxhY2VtZW50IGZvciBTdHJpbmcjaW50ZXJuKCkgdGhhdCBjb3VsZCBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzdHJpbmdzIG9uIHNvbWUgVk1zLgogCSAqLwogCXByaXZhdGUgV2Vha0hhc2hTZXQgc3RyaW5nU3ltYm9scyA9IG5ldyBXZWFrSGFzaFNldCg1KTsKIAlwcml2YXRlIFdlYWtIYXNoU2V0T2ZDaGFyQXJyYXkgY2hhckFycmF5U3ltYm9scyA9IG5ldyBXZWFrSGFzaFNldE9mQ2hhckFycmF5KDUpOwotCQorCiAJLyoKIAkgKiBFeHRlbnNpb24gdXNlZCB0byBjb25zdHJ1Y3QgSmF2YSA2IGFubm90YXRpb24gcHJvY2Vzc29yIG1hbmFnZXJzCiAJICovCiAJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgYW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXJGYWN0b3J5ID0gbnVsbDsKLQkKLQkvKiAKKworCS8qCiAJICogTWFwIGZyb20gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBwYXRoIHRvIGEgc291cmNlIGF0dGFjaG1lbnQgcHJvcGVydHkgKHNvdXJjZSBwYXRoICsgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIgKyBzb3VyY2Ugcm9vdCBwYXRoKQogCSAqLwotCXB1YmxpYyBNYXAgcm9vdFBhdGhUb0F0dGFjaG1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKwlwdWJsaWMgTWFwIHJvb3RQYXRoVG9BdHRhY2htZW50cyA9IG5ldyBIYXNodGFibGUoKTsKIAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENQX1ZBUklBQkxFX1BSRUZFUkVOQ0VTX1BSRUZJWCA9IEphdmFDb3JlLlBMVUdJTl9JRCsiLmNsYXNzcGF0aFZhcmlhYmxlLiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDUF9DT05UQUlORVJfUFJFRkVSRU5DRVNfUFJFRklYID0gSmF2YUNvcmUuUExVR0lOX0lEKyIuY2xhc3NwYXRoQ29udGFpbmVyLiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDUF9VU0VSTElCUkFSWV9QUkVGRVJFTkNFU19QUkVGSVggPSBKYXZhQ29yZS5QTFVHSU5fSUQrIi51c2VyTGlicmFyeS4iOyAvLyROT04tTkxTLTEkCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1BfRU5UUllfSUdOT1JFID0gIiMjPGNwIGVudHJ5IGlnbm9yZT4jIyI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIElQYXRoIENQX0VOVFJZX0lHTk9SRV9QQVRIID0gbmV3IFBhdGgoQ1BfRU5UUllfSUdOT1JFKTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JCisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVkFSSUFCTEVTX0FORF9DT05UQUlORVJTX0ZJTEVfVkVSU0lPTiA9IDI7CiAKIAkvKioKQEAgLTE1MywxNiArMjAzLDIxIEBACiAJICogTmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcgYSBzb3VyY2UgY29kZSBmb3JtYXR0ZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfRVhUUE9JTlRfSUQgPSAiY29kZUZvcm1hdHRlciIgOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKIAkgKiBOYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIGNvbnRyaWJ1dGluZyBhIGNvbXBpbGF0aW9uIHBhcnRpY2lwYW50CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMQVRJT05fUEFSVElDSVBBTlRfRVhUUE9JTlRfSUQgPSAiY29tcGlsYXRpb25QYXJ0aWNpcGFudCIgOyAvLyROT04tTkxTLTEkCi0JCisKIAkvKioKIAkgKiBOYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIGNvbnRyaWJ1dGluZyB0aGUgSmF2YSA2IGFubm90YXRpb24gcHJvY2Vzc29yIG1hbmFnZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1BST0NFU1NPUl9NQU5BR0VSX0VYVFBPSU5UX0lEID0gImFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyIiA7ICAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBOYW1lIG9mIHRoZSBKVk0gcGFyYW1ldGVyIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgcmVmZXJlbmNlZCBKQVIgc2hvdWxkIGJlIHJlc29sdmVkIGZvciBjb250YWluZXIgbGlicmFyaWVzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFX1JFRkVSRU5DRURfTElCUkFSSUVTX0ZPUl9DT05UQUlORVJTID0gInJlc29sdmVSZWZlcmVuY2VkTGlicmFyaWVzRm9yQ29udGFpbmVycyI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBTcGVjaWFsIHZhbHVlIHVzZWQgZm9yIHJlY29nbml6aW5nIG9uZ29pbmcgaW5pdGlhbGl6YXRpb24gYW5kIGJyZWFraW5nIGluaXRpYWxpemF0aW9uIGN5Y2xlcwpAQCAtMTc1LDI1ICsyMzAsMjkgQEAKIAkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7IHJldHVybiBudWxsOyB9CiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBnZXREZXNjcmlwdGlvbigpOyB9CiAJfTsKLQkKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJfTUFOQUdFUl9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvYnVmZmVybWFuYWdlciIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX01BTkFHRVJfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2luZGV4bWFuYWdlciIgOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX01BTkFHRVJfQURWQU5DRURfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2luZGV4bWFuYWdlci9hZHZhbmNlZCIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX0RFQlVHID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy9jb21waWxlciIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFNT0RFTF9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvamF2YW1vZGVsIiA7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQU1PREVMQ0FDSEVfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2phdmFtb2RlbC9jYWNoZSIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENQX1JFU09MVkVfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2NwcmVzb2x1dGlvbiIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENQX1JFU09MVkVfQURWQU5DRURfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2NwcmVzb2x1dGlvbi9hZHZhbmNlZCIgOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENQX1JFU09MVkVfRkFJTFVSRV9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvY3ByZXNvbHV0aW9uL2ZhaWx1cmUiIDsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaSVBfQUNDRVNTX0RFQlVHID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy96aXBhY2Nlc3MiIDsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9ERUJVRyA9SmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy9qYXZhZGVsdGEiIDsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9ERUJVR19WRVJCT1NFID1KYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlIiA7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUkFSQ0hZX0RFQlVHID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy9oaWVyYXJjaHkiIDsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUX0FDVElPTl9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvcG9zdGFjdGlvbiIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2J1aWxkZXIiIDsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX1NUQVRTX0RFQlVHID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy9idWlsZGVyL3N0YXRzIiA7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUExFVElPTl9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvY29tcGxldGlvbiIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVVRJT05fREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL3Jlc29sdXRpb24iIDsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL3NlbGVjdGlvbiIgOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9ERUJVRyA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvZGVidWcvc2VhcmNoIiA7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX01BUFBFUl9ERUJVR19WRVJCT1NFID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi9kZWJ1Zy9zb3VyY2VtYXBwZXIiIDsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfREVCVUcgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL2RlYnVnL2Zvcm1hdHRlciIgOyAvLyROT04tTkxTLTEkCiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QTEVUSU9OX1BFUkYgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL3BlcmYvY29tcGxldGlvbiIgOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX1BFUkYgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL3BlcmYvc2VsZWN0aW9uIiA7IC8vJE5PTi1OTFMtMSQKQEAgLTIwMSwyOCArMjYwLDM1IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCTEVfSU5JVElBTElaRVJfUEVSRiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvcGVyZi92YXJpYWJsZWluaXRpYWxpemVyIiA7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfSU5JVElBTElaRVJfUEVSRiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIvcGVyZi9jb250YWluZXJpbml0aWFsaXplciIgOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT05DSUxFX1BFUkYgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiL3BlcmYvcmVjb25jaWxlIiA7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFWEVEX1NFQ09OREFSWV9UWVBFUyA9ICIjQCpfaW5kZXhpbmcgc2Vjb25kYXJ5IGNhY2hlXypAIyI7IC8vJE5PTi1OTFMtMSQKIAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBQRVJGX1ZBUklBQkxFX0lOSVRJQUxJWkVSID0gZmFsc2U7CiAJcHVibGljIHN0YXRpYyBib29sZWFuIFBFUkZfQ09OVEFJTkVSX0lOSVRJQUxJWkVSID0gZmFsc2U7Ci0JCisJLy8gTm9uLXN0YXRpYywgd2hpY2ggd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJldGFpbiB0aGUgZGVmYXVsdCB3aGVuIGFuZCBpZiBKYXZhTW9kZWxNYW5hZ2VyIGlzIHJlc3RhcnRlZC4KKwlib29sZWFuIHJlc29sdmVSZWZlcmVuY2VkTGlicmFyaWVzRm9yQ29udGFpbmVycyA9IGZhbHNlOworCiAJcHVibGljIGZpbmFsIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0W10gTk9fV09SS0lOR19DT1BZID0gbmV3IElDb21waWxhdGlvblVuaXRbMF07Ci0JCi0JLy8gUHJlZmVyZW5jZXMKKworCS8vIE9wdGlvbnMKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVU5LTk9XTl9PUFRJT04gPSAwOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBERVBSRUNBVEVEX09QVElPTiA9IDE7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFZBTElEX09QVElPTiA9IDI7CiAJSGFzaFNldCBvcHRpb25OYW1lcyA9IG5ldyBIYXNoU2V0KDIwKTsKKwlNYXAgZGVwcmVjYXRlZE9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwogCUhhc2h0YWJsZSBvcHRpb25zQ2FjaGU7CiAKKwkvLyBQcmVmZXJlbmNlcwogCXB1YmxpYyBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzW10gcHJlZmVyZW5jZXNMb29rdXAgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1syXTsKIAlzdGF0aWMgZmluYWwgaW50IFBSRUZfSU5TVEFOQ0UgPSAwOwogCXN0YXRpYyBmaW5hbCBpbnQgUFJFRl9ERUZBVUxUID0gMTsKIAogCXN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIE5PX1BBUlRJQ0lQQU5UUyA9IG5ldyBPYmplY3RbMF1bXTsKLQkKKwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGlsYXRpb25QYXJ0aWNpcGFudHMgewotCQkKKwogCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1NPVVJDRV9MRVZFTCA9IDc7IC8vIDEuMSB0byAxLjcKLQkKKwogCQkvKgogCQkgKiBUaGUgcmVnaXN0ZXJlZCBjb21waWxhdGlvbiBwYXJ0aWNpcGFudHMgKGEgdGFibGUgZnJvbSBpbnQgKHNvdXJjZSBsZXZlbCkgdG8gT2JqZWN0W10pCiAJCSAqIFRoZSBPYmplY3QgYXJyYXkgY29udGFpbnMgZmlyc3QgSUNvbmZpZ3VyYXRpb25FbGVtZW50cyB3aGVuIG5vdCByZXNvbHZlZCB5ZXQsIHRoZW4KQEAgLTIzMCw3ICsyOTYsNyBAQAogCQkgKi8KIAkJcHJpdmF0ZSBPYmplY3RbXVtdIHJlZ2lzdGVyZWRQYXJ0aWNpcGFudHMgPSBudWxsOwogCQlwcml2YXRlIEhhc2hTZXQgbWFuYWdlZE1hcmtlclR5cGVzOwotCQkJCQorCiAJCXB1YmxpYyBDb21waWxhdGlvblBhcnRpY2lwYW50W10gZ2V0Q29tcGlsYXRpb25QYXJ0aWNpcGFudHMoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkJCWZpbmFsIE9iamVjdFtdW10gcGFydGljaXBhbnRzUGVyU291cmNlID0gZ2V0UmVnaXN0ZXJlZFBhcnRpY2lwYW50cygpOwogCQkJaWYgKHBhcnRpY2lwYW50c1BlclNvdXJjZSA9PSBOT19QQVJUSUNJUEFOVFMpCkBAIC0yNTAsMTQgKzMxNiwxNCBAQAogCQkJCQkJCVV0aWwubG9nKGV4Y2VwdGlvbiwgIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBjb21waWxhdGlvbiBwYXJ0aWNpcGFudCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQlPYmplY3QgZXhlY3V0YWJsZUV4dGVuc2lvbiA9IGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCQkJCQlPYmplY3QgZXhlY3V0YWJsZUV4dGVuc2lvbiA9IGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCWZvciAoaW50IGogPSBzb3VyY2VMZXZlbEluZGV4OyBqIDwgTUFYX1NPVVJDRV9MRVZFTDsgaisrKQogCQkJCQkJCQlwYXJ0aWNpcGFudHNQZXJTb3VyY2Vbal1bcGFydGljaXBhbnRJbmRleF0gPSBleGVjdXRhYmxlRXh0ZW5zaW9uOwogCQkJCQkJfQogCQkJCQl9KTsKLQkJCQl9IAotCQkJCUNvbXBpbGF0aW9uUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSAoQ29tcGlsYXRpb25QYXJ0aWNpcGFudCkgcGFydGljaXBhbnRzW2ldOwotCQkJCWlmIChwYXJ0aWNpcGFudCAhPSBudWxsICYmIHBhcnRpY2lwYW50LmlzQWN0aXZlKHByb2plY3QpKQorCQkJCX0KKwkJCQlDb21waWxhdGlvblBhcnRpY2lwYW50IHBhcnRpY2lwYW50OworCQkJCWlmICgocGFydGljaXBhbnRzW2ldIGluc3RhbmNlb2YgQ29tcGlsYXRpb25QYXJ0aWNpcGFudCkgJiYgKHBhcnRpY2lwYW50ID0gKENvbXBpbGF0aW9uUGFydGljaXBhbnQpIHBhcnRpY2lwYW50c1tpXSkuaXNBY3RpdmUocHJvamVjdCkpCiAJCQkJCXJlc3VsdFtpbmRleCsrXSA9IHBhcnRpY2lwYW50OwogCQkJfQogCQkJaWYgKGluZGV4ID09IDApCkBAIC0yNjYsNyArMzMyLDcgQEAKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUGFydGljaXBhbnRbaW5kZXhdLCAwLCBpbmRleCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9Ci0JCQorCiAJCXB1YmxpYyBIYXNoU2V0IG1hbmFnZWRNYXJrZXJUeXBlcygpIHsKIAkJCWlmICh0aGlzLm1hbmFnZWRNYXJrZXJUeXBlcyA9PSBudWxsKSB7CiAJCQkJLy8gZm9yY2UgZXh0ZW5zaW9uIHBvaW50cyB0byBiZSByZWFkCkBAIC0yNzQsNyArMzQwLDcgQEAKIAkJCX0KIAkJCXJldHVybiB0aGlzLm1hbmFnZWRNYXJrZXJUeXBlczsKIAkJfQotCQkKKwogCQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXVtdIGdldFJlZ2lzdGVyZWRQYXJ0aWNpcGFudHMoKSB7CiAJCQlpZiAodGhpcy5yZWdpc3RlcmVkUGFydGljaXBhbnRzICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhpcy5yZWdpc3RlcmVkUGFydGljaXBhbnRzOwpAQCAtMzE3LDE0ICszODMsMTQgQEAKIAkJCWludCBzaXplID0gbW9kaWZ5aW5nRW52LnNpemUoKSArIGNyZWF0aW5nUHJvYmxlbXMuc2l6ZSgpICsgb3RoZXJzLnNpemUoKTsKIAkJCWlmIChzaXplID09IDApCiAJCQkJcmV0dXJuIHRoaXMucmVnaXN0ZXJlZFBhcnRpY2lwYW50cyA9IE5PX1BBUlRJQ0lQQU5UUzsKLQkJCQorCiAJCQkvLyBzb3J0IGNvbmZpZyBlbGVtZW50cyBpbiBlYWNoIGdyb3VwCiAJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbc2l6ZV07CiAJCQlpbnQgaW5kZXggPSAwOwogCQkJaW5kZXggPSBzb3J0UGFydGljaXBhbnRzKG1vZGlmeWluZ0VudiwgY29uZmlnRWxlbWVudHMsIGluZGV4KTsKIAkJCWluZGV4ID0gc29ydFBhcnRpY2lwYW50cyhjcmVhdGluZ1Byb2JsZW1zLCBjb25maWdFbGVtZW50cywgaW5kZXgpOwogCQkJaW5kZXggPSBzb3J0UGFydGljaXBhbnRzKG90aGVycywgY29uZmlnRWxlbWVudHMsIGluZGV4KTsKLQkJCQorCiAJCQkvLyBjcmVhdGUgcmVzdWx0IHRhYmxlCiAJCQlPYmplY3RbXVtdIHJlc3VsdCA9IG5ldyBPYmplY3RbTUFYX1NPVVJDRV9MRVZFTF1bXTsKIAkJCWludCBsZW5ndGggPSBjb25maWdFbGVtZW50cy5sZW5ndGg7CkBAIC0zNDAsNyArNDA2LDcgQEAKIAkJCX0KIAkJCXJldHVybiB0aGlzLnJlZ2lzdGVyZWRQYXJ0aWNpcGFudHMgPSByZXN1bHQ7CiAJCX0KLQkJCisKIAkJLyoKIAkJICogMS4xIC0+IDAKIAkJICogMS4yIC0+IDEKQEAgLTM3MCw3ICs0MzYsNyBAQAogCQkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQotCQkKKwogCQlwcml2YXRlIGludCBzb3J0UGFydGljaXBhbnRzKEFycmF5TGlzdCBncm91cCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMsIGludCBpbmRleCkgewogCQkJaW50IHNpemUgPSBncm91cC5zaXplKCk7CiAJCQlpZiAoc2l6ZSA9PSAwKSByZXR1cm4gaW5kZXg7CkBAIC0zOTQsOSArNDYwLDE0IEBACiAJCQlyZXR1cm4gaW5kZXggKyBzaXplOwogCQl9CiAJfQotCQkJCisKIAlwdWJsaWMgZmluYWwgQ29tcGlsYXRpb25QYXJ0aWNpcGFudHMgY29tcGlsYXRpb25QYXJ0aWNpcGFudHMgPSBuZXcgQ29tcGlsYXRpb25QYXJ0aWNpcGFudHMoKTsKLQkKKworCS8qIHdoZXRoZXIgYW4gQWJvcnRDb21waWxhdGlvblVuaXQgc2hvdWxkIGJlIHRocm93biB3aGVuIHRoZSBzb3VyY2Ugb2YgYSBjb21waWxhdGlvbiB1bml0IGNhbm5vdCBiZSByZXRyaWV2ZWQgKi8KKwlwdWJsaWMgVGhyZWFkTG9jYWwgYWJvcnRPbk1pc3NpbmdTb3VyY2UgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworCXByaXZhdGUgRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyID0gRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5nZXRFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyKCk7CisKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZ1bGwgcGF0aCAoZm9yIGEgcGFja2FnZSkgY29uZmxpY3RzIHdpdGggdGhlIG91dHB1dCBsb2NhdGlvbgogCSAqIG9mIHRoZSBnaXZlbiBwcm9qZWN0LgpAQCAtNDMzLDEyICs1MDQsMTIgQEAKIAkJfQogCX0KIAotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJHZXQoSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgpIHsJCisJcHVibGljIHN5bmNocm9uaXplZCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lckdldChJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgewogCQkvLyBjaGVjayBpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcyBmaXJzdAogCQlpZiAoY29udGFpbmVySXNJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MocHJvamVjdCwgY29udGFpbmVyUGF0aCkpIHsKIAkJCXJldHVybiBDT05UQUlORVJfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1M7CiAJCX0KLQkJCisKIAkJTWFwIHByb2plY3RDb250YWluZXJzID0gKE1hcCl0aGlzLmNvbnRhaW5lcnMuZ2V0KHByb2plY3QpOwogCQlpZiAocHJvamVjdENvbnRhaW5lcnMgPT0gbnVsbCl7CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTQ0Niw4ICs1MTcsOCBAQAogCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKXByb2plY3RDb250YWluZXJzLmdldChjb250YWluZXJQYXRoKTsKIAkJcmV0dXJuIGNvbnRhaW5lcjsKIAl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lckdldERlZmF1bHRUb1ByZXZpb3VzU2Vzc2lvbihJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgewkKKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJHZXREZWZhdWx0VG9QcmV2aW91c1Nlc3Npb24oSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgpIHsKIAkJTWFwIHByb2plY3RDb250YWluZXJzID0gKE1hcCl0aGlzLmNvbnRhaW5lcnMuZ2V0KHByb2plY3QpOwogCQlpZiAocHJvamVjdENvbnRhaW5lcnMgPT0gbnVsbCkKIAkJCXJldHVybiBnZXRQcmV2aW91c1Nlc3Npb25Db250YWluZXIoY29udGFpbmVyUGF0aCwgcHJvamVjdCk7CkBAIC00NTYsMTUgKzUyNyw3IEBACiAJCQlyZXR1cm4gZ2V0UHJldmlvdXNTZXNzaW9uQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIHByb2plY3QpOwogCQlyZXR1cm4gY29udGFpbmVyOwogCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBNYXAgY29udGFpbmVyQ2xvbmUoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJTWFwIG9yaWdpbmFsUHJvamVjdENvbnRhaW5lcnMgPSAoTWFwKXRoaXMuY29udGFpbmVycy5nZXQocHJvamVjdCk7Ci0JCWlmIChvcmlnaW5hbFByb2plY3RDb250YWluZXJzID09IG51bGwpIHJldHVybiBudWxsOwotCQlNYXAgcHJvamVjdENvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcChvcmlnaW5hbFByb2plY3RDb250YWluZXJzLnNpemUoKSk7Ci0JCXByb2plY3RDb250YWluZXJzLnB1dEFsbChvcmlnaW5hbFByb2plY3RDb250YWluZXJzKTsKLQkJcmV0dXJuIHByb2plY3RDb250YWluZXJzOwotCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBjb250YWluZXJJc0luaXRpYWxpemF0aW9uSW5Qcm9ncmVzcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgewogCQlNYXAgaW5pdGlhbGl6YXRpb25zID0gKE1hcCl0aGlzLmNvbnRhaW5lckluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcy5nZXQoKTsKIAkJaWYgKGluaXRpYWxpemF0aW9ucyA9PSBudWxsKQpAQCAtNDg1LDIzICs1NDgsNTggQEAKIAkJcHJvamVjdEluaXRpYWxpemF0aW9ucy5hZGQoY29udGFpbmVyUGF0aCk7CiAJfQogCQorCXB1YmxpYyB2b2lkIGNvbnRhaW5lckJlaW5nSW5pdGlhbGl6ZWRQdXQoSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyKSB7CisJCU1hcCBwZXJQcm9qZWN0Q29udGFpbmVycyA9IChNYXApdGhpcy5jb250YWluZXJzQmVpbmdJbml0aWFsaXplZC5nZXQoKTsKKwkJaWYgKHBlclByb2plY3RDb250YWluZXJzID09IG51bGwpCisJCQl0aGlzLmNvbnRhaW5lcnNCZWluZ0luaXRpYWxpemVkLnNldChwZXJQcm9qZWN0Q29udGFpbmVycyA9IG5ldyBIYXNoTWFwKCkpOworCQlIYXNoTWFwIHBlclBhdGhDb250YWluZXJzID0gKEhhc2hNYXApIHBlclByb2plY3RDb250YWluZXJzLmdldChwcm9qZWN0KTsKKwkJaWYgKHBlclBhdGhDb250YWluZXJzID09IG51bGwpCisJCQlwZXJQcm9qZWN0Q29udGFpbmVycy5wdXQocHJvamVjdCwgcGVyUGF0aENvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCgpKTsKKwkJcGVyUGF0aENvbnRhaW5lcnMucHV0KGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lcik7CisJfQorCisJcHVibGljIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyQmVpbmdJbml0aWFsaXplZEdldChJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgeworCQlNYXAgcGVyUHJvamVjdENvbnRhaW5lcnMgPSAoTWFwKXRoaXMuY29udGFpbmVyc0JlaW5nSW5pdGlhbGl6ZWQuZ2V0KCk7CisJCWlmIChwZXJQcm9qZWN0Q29udGFpbmVycyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUhhc2hNYXAgcGVyUGF0aENvbnRhaW5lcnMgPSAoSGFzaE1hcCkgcGVyUHJvamVjdENvbnRhaW5lcnMuZ2V0KHByb2plY3QpOworCQlpZiAocGVyUGF0aENvbnRhaW5lcnMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKElDbGFzc3BhdGhDb250YWluZXIpIHBlclBhdGhDb250YWluZXJzLmdldChjb250YWluZXJQYXRoKTsKKwl9CisKKwlwdWJsaWMgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJCZWluZ0luaXRpYWxpemVkUmVtb3ZlKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBjb250YWluZXJQYXRoKSB7CisJCU1hcCBwZXJQcm9qZWN0Q29udGFpbmVycyA9IChNYXApdGhpcy5jb250YWluZXJzQmVpbmdJbml0aWFsaXplZC5nZXQoKTsKKwkJaWYgKHBlclByb2plY3RDb250YWluZXJzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJSGFzaE1hcCBwZXJQYXRoQ29udGFpbmVycyA9IChIYXNoTWFwKSBwZXJQcm9qZWN0Q29udGFpbmVycy5nZXQocHJvamVjdCk7CisJCWlmIChwZXJQYXRoQ29udGFpbmVycyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpIHBlclBhdGhDb250YWluZXJzLnJlbW92ZShjb250YWluZXJQYXRoKTsKKwkJaWYgKHBlclBhdGhDb250YWluZXJzLnNpemUoKSA9PSAwKQorCQkJcGVyUGF0aENvbnRhaW5lcnMucmVtb3ZlKHByb2plY3QpOworCQlpZiAocGVyUHJvamVjdENvbnRhaW5lcnMuc2l6ZSgpID09IDApCisJCQl0aGlzLmNvbnRhaW5lcnNCZWluZ0luaXRpYWxpemVkLnNldChudWxsKTsKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29udGFpbmVyUHV0KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBjb250YWluZXJQYXRoLCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcil7CiAKIAkJLy8gc2V0L3Vuc2V0IHRoZSBpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcwogCQlpZiAoY29udGFpbmVyID09IENPTlRBSU5FUl9JTklUSUFMSVpBVElPTl9JTl9QUk9HUkVTUykgewogCQkJY29udGFpbmVyQWRkSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKHByb2plY3QsIGNvbnRhaW5lclBhdGgpOwotCQkJCisKIAkJCS8vIGRvIG5vdCB3cml0ZSBvdXQgaW50ZXJtZWRpYXRlIGluaXRpYWxpemF0aW9uIHZhbHVlCiAJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQljb250YWluZXJSZW1vdmVJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MocHJvamVjdCwgY29udGFpbmVyUGF0aCk7CiAKLQkJCU1hcCBwcm9qZWN0Q29udGFpbmVycyA9IChNYXApdGhpcy5jb250YWluZXJzLmdldChwcm9qZWN0KTsJCisJCQlNYXAgcHJvamVjdENvbnRhaW5lcnMgPSAoTWFwKXRoaXMuY29udGFpbmVycy5nZXQocHJvamVjdCk7CiAgCQkJaWYgKHByb2plY3RDb250YWluZXJzID09IG51bGwpewogCQkJCXByb2plY3RDb250YWluZXJzID0gbmV3IEhhc2hNYXAoMSk7CiAJCQkJdGhpcy5jb250YWluZXJzLnB1dChwcm9qZWN0LCBwcm9qZWN0Q29udGFpbmVycyk7CiAJCQl9Ci0JCisKIAkJCWlmIChjb250YWluZXIgPT0gbnVsbCkgewogCQkJCXByb2plY3RDb250YWluZXJzLnJlbW92ZShjb250YWluZXJQYXRoKTsKIAkJCX0gZWxzZSB7CkBAIC01MTUsNyArNjEzLDcgQEAKIAkJfQogCQkvLyBjb250YWluZXIgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgaW4gcHJlZmVyZW5jZXMgZHVyaW5nIHNhdmUgb3BlcmF0aW9ucywgc2VlICNzYXZpbmcoSVNhdmVDb250ZXh0KQogCX0KLQkKKwogCS8qCiAJICogVGhlIGdpdmVuIHByb2plY3QgaXMgYmVpbmcgcmVtb3ZlZC4gUmVtb3ZlIGFsbCBjb250YWluZXJzIGZvciB0aGlzIHByb2plY3QgZnJvbSB0aGUgY2FjaGUuCiAJICovCkBAIC01MjYsMTUgKzYyNCwxNSBAQAogCQl9CiAJCXRoaXMuY29udGFpbmVycy5yZW1vdmUocHJvamVjdCk7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gY29udGFpbmVyUHV0SWZJbml0aWFsaXppbmdXaXRoU2FtZUVudHJpZXMoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0W10gcHJvamVjdHMsIElDbGFzc3BhdGhDb250YWluZXJbXSByZXNwZWN0aXZlQ29udGFpbmVycykgewogCQlpbnQgcHJvamVjdExlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsKLQkJaWYgKHByb2plY3RMZW5ndGggIT0gMSkgCisJCWlmIChwcm9qZWN0TGVuZ3RoICE9IDEpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gcmVzcGVjdGl2ZUNvbnRhaW5lcnNbMF07CiAJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbMF07CiAJCS8vIG9wdGltaXplIG9ubHkgaWYgaW5pdGlhbGl6aW5nLCBvdGhlcndpc2Ugd2UgYXJlIGluIGEgcmVndWxhciBzZXRDb250YWluZXIoLi4uKSBjYWxsCi0JCWlmICghY29udGFpbmVySXNJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MocHJvamVjdCwgY29udGFpbmVyUGF0aCkpIAorCQlpZiAoIWNvbnRhaW5lcklzSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKHByb2plY3QsIGNvbnRhaW5lclBhdGgpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlJQ2xhc3NwYXRoQ29udGFpbmVyIHByZXZpb3VzQ29udGFpbmVyID0gY29udGFpbmVyR2V0RGVmYXVsdFRvUHJldmlvdXNTZXNzaW9uKHByb2plY3QsIGNvbnRhaW5lclBhdGgpOwogCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKQEAgLTU0NSwyOSArNjQzLDI5IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCWlmIChwcmV2aW91c0NvbnRhaW5lciA9PSBudWxsKSAKKwkJaWYgKHByZXZpb3VzQ29udGFpbmVyID09IG51bGwpCiAJCQlpZiAobmV3RW50cmllcy5sZW5ndGggPT0gMCkgewogCQkJCWNvbnRhaW5lclB1dChwcm9qZWN0LCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOwogCQkJCXJldHVybiB0cnVlOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFKQorCQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0UgfHwgQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpCiAJCQkJCXZlcmJvc2VfbWlzc2JlaGF2aW5nX2NvbnRhaW5lcihjb250YWluZXJQYXRoLCBwcm9qZWN0cywgcmVzcGVjdGl2ZUNvbnRhaW5lcnMsIGNvbnRhaW5lciwgbmV3RW50cmllcywgbnVsbC8qbm8gb2xkIGVudHJpZXMqLyk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gcHJldmlvdXNDb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwogCQlpZiAob2xkRW50cmllcy5sZW5ndGggIT0gbmV3RW50cmllcy5sZW5ndGgpIHsKLQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0UpCisJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IENQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCXZlcmJvc2VfbWlzc2JlaGF2aW5nX2NvbnRhaW5lcihjb250YWluZXJQYXRoLCBwcm9qZWN0cywgcmVzcGVjdGl2ZUNvbnRhaW5lcnMsIGNvbnRhaW5lciwgbmV3RW50cmllcywgb2xkRW50cmllcyk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG5ld0VudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWlmIChuZXdFbnRyaWVzW2ldID09IG51bGwpIHsKLQkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFKQorCQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0UgfHwgQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpCiAJCQkJCXZlcmJvc2VfbWlzc2JlaGF2aW5nX2NvbnRhaW5lcihwcm9qZWN0LCBjb250YWluZXJQYXRoLCBuZXdFbnRyaWVzKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCQlpZiAoIW5ld0VudHJpZXNbaV0uZXF1YWxzKG9sZEVudHJpZXNbaV0pKSB7Ci0JCQkJaWYgKENQX1JFU09MVkVfVkVSQk9TRSkKKwkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IENQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCQl2ZXJib3NlX21pc3NiZWhhdmluZ19jb250YWluZXIoY29udGFpbmVyUGF0aCwgcHJvamVjdHMsIHJlc3BlY3RpdmVDb250YWluZXJzLCBjb250YWluZXIsIG5ld0VudHJpZXMsIG9sZEVudHJpZXMpOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KQEAgLTU4OCwxNSArNjg2LDE1IEBACiAJCQkiCWNvbnRhaW5lciBwYXRoOiAiICsgY29udGFpbmVyUGF0aCArICdcbicgKyAvLyROT04tTkxTLTEkCiAJCQkiCXByb2plY3RzOiB7IiArLy8kTk9OLU5MUy0xJAogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC50b1N0cmluZygKLQkJCQlwcm9qZWN0cywgCi0JCQkJbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuRGlzcGxheWFibGUoKXsgCisJCQkJcHJvamVjdHMsCisJCQkJbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuRGlzcGxheWFibGUoKXsKIAkJCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IHJldHVybiAoKElKYXZhUHJvamVjdCkgbykuZ2V0RWxlbWVudE5hbWUoKTsgfQogCQkJCX0pICsKIAkJCSJ9XG4JdmFsdWVzIG9uIHByZXZpb3VzIHNlc3Npb246IHtcbiIgICsvLyROT04tTkxTLTEkCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnRvU3RyaW5nKAotCQkJCXJlc3BlY3RpdmVDb250YWluZXJzLCAKLQkJCQluZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5EaXNwbGF5YWJsZSgpeyAKLQkJCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IAorCQkJCXJlc3BlY3RpdmVDb250YWluZXJzLAorCQkJCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkRpc3BsYXlhYmxlKCl7CisJCQkJCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZyhPYmplY3QgbykgewogCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIgkJIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWlmIChvID09IG51bGwpIHsKIAkJCQkJCQlidWZmZXIuYXBwZW5kKCI8bnVsbD4iKTsgLy8kTk9OLU5MUy0xJApAQCAtNjEwLDggKzcwOCw4IEBACiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkRW50cmllcy5sZW5ndGg7IGorKyl7CiAJCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiAJCQkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG9sZEVudHJpZXNbal0pOyAKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsgCisJCQkJCQkJCWJ1ZmZlci5hcHBlbmQob2xkRW50cmllc1tqXSk7CisJCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJYnVmZmVyLmFwcGVuZCgiIAkJfSIpOyAvLyROT04tTkxTLTEkCkBAIC02MjAsOSArNzE4LDkgQEAKIAkJCQl9KSArCiAJCQkifVxuCW5ldyB2YWx1ZXM6IHtcbiIgICsvLyROT04tTkxTLTEkCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnRvU3RyaW5nKAotCQkJCXJlc3BlY3RpdmVDb250YWluZXJzLCAKLQkJCQluZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5EaXNwbGF5YWJsZSgpeyAKLQkJCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IAorCQkJCXJlc3BlY3RpdmVDb250YWluZXJzLAorCQkJCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkRpc3BsYXlhYmxlKCl7CisJCQkJCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZyhPYmplY3QgbykgewogCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIgkJIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWlmIChvID09IG51bGwpIHsKIAkJCQkJCQlidWZmZXIuYXBwZW5kKCI8bnVsbD4iKTsgLy8kTk9OLU5MUy0xJApAQCAtNjMyLDggKzczMCw4IEBACiAJCQkJCQlidWZmZXIuYXBwZW5kKCIge1xuIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3RW50cmllcy5sZW5ndGg7IGorKyl7CiAJCQkJCQkJYnVmZmVyLmFwcGVuZCgiIAkJCSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnVmZmVyLmFwcGVuZChuZXdFbnRyaWVzW2pdKTsgCi0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsgCisJCQkJCQkJYnVmZmVyLmFwcGVuZChuZXdFbnRyaWVzW2pdKTsKKwkJCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOwogCQkJCQkJfQogCQkJCQkJYnVmZmVyLmFwcGVuZCgiIAkJfSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CkBAIC02NDEsNyArNzM5LDcgQEAKIAkJCQl9KSArCiAJCQkiXG4JfSIpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJdm9pZCB2ZXJib3NlX21pc3NiZWhhdmluZ19jb250YWluZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgsIElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMpIHsKIAkJVXRpbC52ZXJib3NlKAogCQkJIkNQQ29udGFpbmVyIEdFVCAtIG1pc3NiZWhhdmluZyBjb250YWluZXIgKHJldHVybmluZyBudWxsIGNsYXNzcGF0aCBlbnRyeSlcbiIgKyAvLyROT04tTkxTLTEkCkBAIC02NDksOSArNzQ3LDkgQEAKIAkJCSIJY29udGFpbmVyIHBhdGg6ICIgKyBjb250YWluZXJQYXRoICsgJ1xuJyArIC8vJE5PTi1OTFMtMSQKIAkJCSIJY2xhc3NwYXRoIGVudHJpZXM6IHtcbiIgKyAvLyROT04tTkxTLTEkCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnRvU3RyaW5nKAotCQkJCWNsYXNzcGF0aEVudHJpZXMsIAotCQkJCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkRpc3BsYXlhYmxlKCl7IAotCQkJCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pIHsgCisJCQkJY2xhc3NwYXRoRW50cmllcywKKwkJCQluZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5EaXNwbGF5YWJsZSgpeworCQkJCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pIHsKIAkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCIJCSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAobyA9PSBudWxsKSB7CiAJCQkJCQkJYnVmZmVyLmFwcGVuZCgiPG51bGw+Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTY2NSw2ICs3NjMsMTUgQEAKIAkJKTsKIAl9CiAKKwl2b2lkIHZlcmJvc2VfbWlzc2JlaGF2aW5nX2NvbnRhaW5lcl9udWxsX2VudHJpZXMoSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGNvbnRhaW5lclBhdGgpIHsKKwkJVXRpbC52ZXJib3NlKAorCQkJIkNQQ29udGFpbmVyIEdFVCAtIG1pc3NiZWhhdmluZyBjb250YWluZXIgKHJldHVybmluZyBudWxsIGFzIGNsYXNzcGF0aCBlbnRyaWVzKVxuIiArIC8vJE5PTi1OTFMtMSQKKwkJCSIJcHJvamVjdDogIiArIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSArICdcbicgKyAvLyROT04tTkxTLTEkCisJCQkiCWNvbnRhaW5lciBwYXRoOiAiICsgY29udGFpbmVyUGF0aCArICdcbicgKyAvLyROT04tTkxTLTEkCisJCQkiCWNsYXNzcGF0aCBlbnRyaWVzOiA8bnVsbD4iIC8vJE5PTi1OTFMtMSQKKwkJKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgY29udGFpbmVyUmVtb3ZlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBjb250YWluZXJQYXRoKSB7CiAJCU1hcCBpbml0aWFsaXphdGlvbnMgPSAoTWFwKXRoaXMuY29udGFpbmVySW5pdGlhbGl6YXRpb25JblByb2dyZXNzLmdldCgpOwogCQlpZiAoaW5pdGlhbGl6YXRpb25zID09IG51bGwpCkBAIC02NzgsNyArNzg1LDcgQEAKIAkJaWYgKGluaXRpYWxpemF0aW9ucy5zaXplKCkgPT0gMCkKIAkJCXRoaXMuY29udGFpbmVySW5pdGlhbGl6YXRpb25JblByb2dyZXNzLnNldChudWxsKTsKIAl9Ci0JCisKIAlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNvbnRhaW5lcnNSZXNldChTdHJpbmdbXSBjb250YWluZXJJRHMpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJJRHMubGVuZ3RoOyBpKyspIHsKIAkJCVN0cmluZyBjb250YWluZXJJRCA9IGNvbnRhaW5lcklEc1tpXTsKQEAgLTY4OSw3ICs3OTYsNyBAQAogCQkJCQlJdGVyYXRvciBjb250YWluZXJJdGVyYXRvciA9IHByb2plY3RDb250YWluZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCQkJCXdoaWxlIChjb250YWluZXJJdGVyYXRvci5oYXNOZXh0KCkpewogCQkJCQkJSVBhdGggY29udGFpbmVyUGF0aCA9IChJUGF0aCljb250YWluZXJJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50KDApLmVxdWFscyhjb250YWluZXJJRCkpIHsgLy8gcmVnaXN0ZXJlZCBjb250YWluZXIKKwkJCQkJCWlmIChjb250YWluZXJJRC5lcXVhbHMoY29udGFpbmVyUGF0aC5zZWdtZW50KDApKSkgeyAvLyByZWdpc3RlcmVkIGNvbnRhaW5lcgogCQkJCQkJCXByb2plY3RDb250YWluZXJzLnB1dChjb250YWluZXJQYXRoLCBudWxsKTsgLy8gcmVzZXQgY29udGFpbmVyIHZhbHVlLCBidXQgbGVhdmUgZW50cnkgaW4gTWFwCiAJCQkJCQl9CiAJCQkJCX0KQEAgLTcwNyw3ICs4MTQsNyBAQAogCSAqCTxsaT5hIHByb2plY3QgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+PC9saT4KIAkgKgk8bGk+YSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4KIAkgKgk8bGk+YSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPjwvbGk+Ci0JICoJPGxpPmEgPGNvZGU+LmphcjwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CisJICoJPGxpPmEgWklQIGFyY2hpdmUgKGUuZy4gYSA8Y29kZT4uamFyPC9jb2RlPiwgYSA8Y29kZT4uemlwPC9jb2RlPiBmaWxlLCBldGMuKSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CiAJICogIDxsaT5hIGZvbGRlciAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPgogCSAqCQkJb3IgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT48L2xpPgogCSAqICA8bGk+dGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+PC9saT4KQEAgLTc0NCw3ICs4NTEsNyBAQAogCSAqIDxwPlRoZSBmaWxlIG11c3QgYmUgb25lIG9mOjx1bD4KIAkgKgk8bGk+YSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4KIAkgKgk8bGk+YSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPjwvbGk+Ci0JICoJPGxpPmEgPGNvZGU+LmphcjwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CisJICoJPGxpPmEgWklQIGFyY2hpdmUgKGUuZy4gYSA8Y29kZT4uamFyPC9jb2RlPiwgYSA8Y29kZT4uemlwPC9jb2RlPiBmaWxlLCBldGMuKSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CiAJICoJPC91bD4KIAkgKiA8cD4KIAkgKiBDcmVhdGluZyBhIEphdmEgZWxlbWVudCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGFsbCBvZiB0aGUKQEAgLTc1NywyMiArODY0LDIxIEBACiAJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKIAkJCXByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOwogCQl9Ci0JCisKIAkJaWYgKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKIAkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CiAJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShuYW1lKSkKIAkJCQlyZXR1cm4gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlLCBwcm9qZWN0KTsKIAkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShuYW1lKSkKIAkJCQlyZXR1cm4gY3JlYXRlQ2xhc3NGaWxlRnJvbShmaWxlLCBwcm9qZWN0KTsKLQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKG5hbWUpKQotCQkJCXJldHVybiBjcmVhdGVKYXJQYWNrYWdlRnJhZ21lbnRSb290RnJvbShmaWxlLCBwcm9qZWN0KTsKKwkJCXJldHVybiBjcmVhdGVKYXJQYWNrYWdlRnJhZ21lbnRSb290RnJvbShmaWxlLCBwcm9qZWN0KTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IG9yIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmb2xkZXIsCi0JICogaXRzIHBhcmVudCBvciBncmVhdCBwYXJlbnQgYmVpbmcgdGhlIGdpdmVuIHByb2plY3QuIAorCSAqIGl0cyBwYXJlbnQgb3IgZ3JlYXQgcGFyZW50IGJlaW5nIHRoZSBnaXZlbiBwcm9qZWN0LgogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZvbGRlciB3aXRoIGEgSmF2YSBlbGVtZW50LgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiBhIGRlZmF1bHQgcGFja2FnZS4KQEAgLTgzMCw5ICs5MzYsOSBAQAogCQl9CiAJCXJldHVybiBwa2cuZ2V0Q2xhc3NGaWxlKGZpbGUuZ2V0TmFtZSgpKTsKIAl9Ci0JCisKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29tcGlsYXRpb24gdW5pdCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gPGNvZGU+LmphdmE8L2NvZGU+IAorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjb21waWxhdGlvbiB1bml0IGVsZW1lbnQgZm9yIHRoZSBnaXZlbiA8Y29kZT4uamF2YTwvY29kZT4KIAkgKiBmaWxlLCBpdHMgcHJvamVjdCBiZWluZyB0aGUgZ2l2ZW4gcHJvamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUKIAkgKiB0byByZWNvZ25pemUgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAJICovCkBAIC04NDYsMjAgKzk1MiwyMCBAQAogCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBkZXRlcm1pbmVJZk9uQ2xhc3NwYXRoKGZpbGUsIHByb2plY3QpOwogCQlpZiAocGtnID09IG51bGwpIHsKIAkJCS8vIG5vdCBvbiBjbGFzc3BhdGggLSBtYWtlIHRoZSByb290IGl0cyBmb2xkZXIsIGFuZCBhIGRlZmF1bHQgcGFja2FnZQotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmaWxlLmdldFBhcmVudCgpKTsKLQkJCXBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOwotCQkJCisJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZpbGUuZ2V0UGFyZW50KCkpOworCQkJcGtnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTKTsKKwogCQkJaWYgKFZFUkJPU0UpewogCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV0FSTklORyA6IGNyZWF0aW5nIHVuaXQgZWxlbWVudCBvdXRzaWRlIGNsYXNzcGF0aCAoIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiKTogIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQl9CiAJCX0KIAkJcmV0dXJuIHBrZy5nZXRDb21waWxhdGlvblVuaXQoZmlsZS5nZXROYW1lKCkpOwogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBKQVIgZmlsZSwgaXRzIHByb2plY3QgYmVpbmcgdGhlIGdpdmVuIHByb2plY3QuCiAJICogVGhlIEphdmEgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVIncyBwcm9qZWN0IG1heSBiZQotCSAqIGNyZWF0ZWQgYXMgYSBzaWRlIGVmZmVjdC4gCisJICogY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0LgogCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEpBUiBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCiAJICogKGZvciBleGFtcGxlLCBpZiB0aGUgSkFSIGZpbGUgcmVwcmVzZW50cyBhIG5vbi1KYXZhIHJlc291cmNlKQogCSAqLwpAQCAtODcwLDcgKzk3Niw3IEBACiAJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKIAkJCXByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOwogCQl9Ci0JCisKIAkJLy8gQ3JlYXRlIGEgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvbmx5IGlmIG9uIHRoZSBjbGFzc3BhdGgKIAkJSVBhdGggcmVzb3VyY2VQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwogCQl0cnkgewpAQCAtODgzLDI2ICs5ODksMjYgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcmVwcmVzZW50ZWQgYnkgdGhlIHJlc291cmNlLCBvcgogCSAqIHRoZSBwYWNrYWdlIGZyYWdtZW50IHRoZSBnaXZlbiByZXNvdXJjZSBpcyBsb2NhdGVkIGluLCBvciA8Y29kZT5udWxsPC9jb2RlPgogCSAqIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBkZXRlcm1pbmVJZk9uQ2xhc3NwYXRoKAotCQlJUmVzb3VyY2UgcmVzb3VyY2UsCi0JCUlKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkKKwlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBkZXRlcm1pbmVJZk9uQ2xhc3NwYXRoKElSZXNvdXJjZSByZXNvdXJjZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJYm9vbGVhbiBpc0V4dGVybmFsID0gRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5pc0ludGVybmFsUGF0aEZvckV4dGVybmFsRm9sZGVyKHJlc291cmNlUGF0aCk7CisJCWlmIChpc0V4dGVybmFsKQorCQkJcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKKwogCQl0cnkgewogCQkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBwcm9qZWN0SW5mbyA9IChKYXZhUHJvamVjdEVsZW1lbnRJbmZvKSBnZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyhwcm9qZWN0KTsKIAkJCVByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUgPSBwcm9qZWN0SW5mbyA9PSBudWxsID8gbnVsbCA6IHByb2plY3RJbmZvLnByb2plY3RDYWNoZTsKIAkJCUhhc2h0YWJsZU9mQXJyYXlUb09iamVjdCBhbGxQa2dGcmFnbWVudHNDYWNoZSA9IHByb2plY3RDYWNoZSA9PSBudWxsID8gbnVsbCA6IHByb2plY3RDYWNoZS5hbGxQa2dGcmFnbWVudHNDYWNoZTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAKLQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwuaXNKYXZhTGlrZUZpbGVOYW1lKHJlc291cmNlUGF0aC5sYXN0U2VnbWVudCgpKQotCQkJCQk/IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkgLy8gSkFWQSBmaWxlIGNhbiBvbmx5IGxpdmUgaW5zaWRlIFNSQyBmb2xkZXIgKG9uIHRoZSByYXcgcGF0aCkKKwkJCWJvb2xlYW4gaXNKYXZhTGlrZSA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUocmVzb3VyY2VQYXRoLmxhc3RTZWdtZW50KCkpOworCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGlzSmF2YUxpa2UgPyBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpIC8vIEpBVkEgZmlsZSBjYW4gb25seSBsaXZlIGluc2lkZSBTUkMgZm9sZGVyIChvbiB0aGUgcmF3IHBhdGgpCiAJCQkJCTogKChKYXZhUHJvamVjdClwcm9qZWN0KS5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOwotCQkJCisKIAkJCWludCBsZW5ndGgJPSBlbnRyaWVzLmxlbmd0aDsKIAkJCWlmIChsZW5ndGggPiAwKSB7CiAJCQkJU3RyaW5nIHNvdXJjZUxldmVsID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKQEAgLTkxMiwyNyArMTAxOCwzMiBAQAogCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSBjb250aW51ZTsKIAkJCQkJSVBhdGggcm9vdFBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CiAJCQkJCWlmIChyb290UGF0aC5lcXVhbHMocmVzb3VyY2VQYXRoKSkgeworCQkJCQkJaWYgKGlzSmF2YUxpa2UpIAorCQkJCQkJCXJldHVybiBudWxsOwogCQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSk7CiAJCQkJCX0gZWxzZSBpZiAocm9vdFBhdGguaXNQcmVmaXhPZihyZXNvdXJjZVBhdGgpKSB7CiAJCQkJCQkvLyBhbGxvdyBjcmVhdGlvbiBvZiBwYWNrYWdlIGZyYWdtZW50IGlmIGl0IGNvbnRhaW5zIGEgLmphdmEgZmlsZSB0aGF0IGlzIGluY2x1ZGVkCiAJCQkJCQlpZiAoIVV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCkpKSB7CiAJCQkJCQkJLy8gZ2l2ZW4gd2UgaGF2ZSBhIHJlc291cmNlIGNoaWxkIG9mIHRoZSByb290LCBpdCBjYW5ub3QgYmUgYSBKQVIgcGtnIHJvb3QKLQkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPShQYWNrYWdlRnJhZ21lbnRSb290KSAoKEphdmFQcm9qZWN0KSBwcm9qZWN0KS5nZXRGb2xkZXJQYWNrYWdlRnJhZ21lbnRSb290KHJvb3RQYXRoKTsKKwkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPQorCQkJCQkJCQlpc0V4dGVybmFsID8KKwkJCQkJCQkJCW5ldyBFeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdFBhdGgsIChKYXZhUHJvamVjdCkgcHJvamVjdCkgOgorCQkJCQkJCQkJKFBhY2thZ2VGcmFnbWVudFJvb3QpICgoSmF2YVByb2plY3QpIHByb2plY3QpLmdldEZvbGRlclBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdFBhdGgpOwogCQkJCQkJCWlmIChyb290ID09IG51bGwpIHJldHVybiBudWxsOwogCQkJCQkJCUlQYXRoIHBrZ1BhdGggPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCisKIAkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CiAJCQkJCQkJCS8vIGlmIHRoZSByZXNvdXJjZSBpcyBhIGZpbGUsIHRoZW4gcmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgd2hpY2gKIAkJCQkJCQkJLy8gaXMgdGhlIGZpbGUgbmFtZSBpbiB0aGUgcGFja2FnZQogCQkJCQkJCQlwa2dQYXRoID0gcGtnUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CiAJCQkJCQkJfQogCQkJCQkJCVN0cmluZ1tdIHBrZ05hbWUgPSBwa2dQYXRoLnNlZ21lbnRzKCk7Ci0JCQkJCQkJCisKIAkJCQkJCQkvLyBpZiBwYWNrYWdlIG5hbWUgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkCiAJCQkJCQkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMTQxKQogCQkJCQkJCWlmIChhbGxQa2dGcmFnbWVudHNDYWNoZSAhPSBudWxsICYmIGFsbFBrZ0ZyYWdtZW50c0NhY2hlLmNvbnRhaW5zS2V5KHBrZ05hbWUpKQogCQkJCQkJCQlyZXR1cm4gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7Ci0JCQkJCQkJCisKIAkJCQkJCQlpZiAocGtnTmFtZS5sZW5ndGggIT0gMCAmJiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShVdGlsLnBhY2thZ2VOYW1lKHBrZ1BhdGgsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKIAkJCQkJCQkJcmV0dXJuIG51bGw7CiAJCQkJCQkJfQpAQCAtOTQ2LDcgKzEwNTcsNyBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIFRoZSBzaW5nbGV0b24gbWFuYWdlcgogCSAqLwpAQCAtOTU2LDcgKzEwNjcsNyBAQAogCSAqIEluZm9zIGNhY2hlLgogCSAqLwogCXByaXZhdGUgSmF2YU1vZGVsQ2FjaGUgY2FjaGU7Ci0JCisKIAkvKgogCSAqIFRlbXBvcmFyeSBjYWNoZSBvZiBuZXdseSBvcGVuZWQgZWxlbWVudHMKIAkgKi8KQEAgLTk2NiwyNiArMTA3NywyNiBAQAogCSAqIFNldCBvZiBlbGVtZW50cyB3aGljaCBhcmUgb3V0IG9mIHN5bmMgd2l0aCB0aGVpciBidWZmZXJzLgogCSAqLwogCXByb3RlY3RlZCBIYXNoU2V0IGVsZW1lbnRzT3V0T2ZTeW5jaFdpdGhCdWZmZXJzID0gbmV3IEhhc2hTZXQoMTEpOwotCQorCiAJLyoqCiAJICogSG9sZHMgdGhlIHN0YXRlIHVzZWQgZm9yIGRlbHRhIHByb2Nlc3NpbmcuCiAJICovCiAJcHVibGljIERlbHRhUHJvY2Vzc2luZ1N0YXRlIGRlbHRhU3RhdGUgPSBuZXcgRGVsdGFQcm9jZXNzaW5nU3RhdGUoKTsKIAogCXB1YmxpYyBJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gbnVsbDsKLQkKKwogCS8qKgogCSAqIFRhYmxlIGZyb20gSVByb2plY3QgdG8gUGVyUHJvamVjdEluZm8uCiAJICogTk9URTogdGhpcyBvYmplY3QgaXRzZWxmIGlzIHVzZWQgYXMgYSBsb2NrIHRvIHN5bmNocm9uaXplIGNyZWF0aW9uL3JlbW92YWwgb2YgcGVyIHByb2plY3QgaW5mb3MKIAkgKi8KIAlwcm90ZWN0ZWQgTWFwIHBlclByb2plY3RJbmZvcyA9IG5ldyBIYXNoTWFwKDUpOwotCQorCiAJLyoqCiAJICogVGFibGUgZnJvbSBXb3JraW5nQ29weU93bmVyIHRvIGEgdGFibGUgb2YgSUNvbXBpbGF0aW9uVW5pdCAod29ya2luZyBjb3B5IGhhbmRsZSkgdG8gUGVyV29ya2luZ0NvcHlJbmZvLgogCSAqIE5PVEU6IHRoaXMgb2JqZWN0IGl0c2VsZiBpcyB1c2VkIGFzIGEgbG9jayB0byBzeW5jaHJvbml6ZSBjcmVhdGlvbi9yZW1vdmFsIG9mIHBlciB3b3JraW5nIGNvcHkgaW5mb3MKIAkgKi8KIAlwcm90ZWN0ZWQgTWFwIHBlcldvcmtpbmdDb3B5SW5mb3MgPSBuZXcgSGFzaE1hcCg1KTsKLQkKKwogCS8qKgogCSAqIEEgd2VhayBzZXQgb2YgdGhlIGtub3duIHNlYXJjaCBzY29wZXMuCiAJICovCkBAIC05OTMsMjMgKzExMDQsMjggQEAKIAogCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUHJvamVjdEluZm8gewogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQURPQ19DQUNIRV9JTklUSUFMX1NJWkUgPSAxMDsKLQkJCisKKwkJc3RhdGljIGZpbmFsIElKYXZhTW9kZWxTdGF0dXMgTkVFRF9SRVNPTFVUSU9OID0gbmV3IEphdmFNb2RlbFN0YXR1cygpOworCiAJCXB1YmxpYyBJUHJvamVjdCBwcm9qZWN0OwogCQlwdWJsaWMgT2JqZWN0IHNhdmVkU3RhdGU7CiAJCXB1YmxpYyBib29sZWFuIHRyaWVkUmVhZDsKIAkJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJhd0NsYXNzcGF0aDsKKwkJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlZmVyZW5jZWRFbnRyaWVzOwogCQlwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyByYXdDbGFzc3BhdGhTdGF0dXM7CisJCXB1YmxpYyBpbnQgcmF3VGltZVN0YW1wID0gMDsKKwkJcHVibGljIGJvb2xlYW4gd3JpdHRpbmdSYXdDbGFzc3BhdGggPSBmYWxzZTsKIAkJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoOwogCQlwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB1bnJlc29sdmVkRW50cnlTdGF0dXM7CiAJCXB1YmxpYyBNYXAgcm9vdFBhdGhUb1Jhd0VudHJpZXM7IC8vIHJldmVyc2UgbWFwIGZyb20gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBwYXRoIHRvIHRoZSByYXcgZW50cnkKIAkJcHVibGljIE1hcCByb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzOyAvLyBtYXAgZnJvbSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHBhdGggdG8gdGhlIHJlc29sdmVkIGVudHJ5CiAJCXB1YmxpYyBJUGF0aCBvdXRwdXRMb2NhdGlvbjsKLQkJCisKIAkJcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7CiAJCXB1YmxpYyBIYXNodGFibGUgb3B0aW9uczsKIAkJcHVibGljIEhhc2h0YWJsZSBzZWNvbmRhcnlUeXBlczsKIAkJcHVibGljIExSVUNhY2hlIGphdmFkb2NDYWNoZTsKLQkJCisKIAkJcHVibGljIFBlclByb2plY3RJbmZvKElQcm9qZWN0IHByb2plY3QpIHsKIAogCQkJdGhpcy50cmllZFJlYWQgPSBmYWxzZTsKQEAgLTEwMTcsMzggKzExMzMsNjQgQEAKIAkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAJCQl0aGlzLmphdmFkb2NDYWNoZSA9IG5ldyBMUlVDYWNoZShKQVZBRE9DX0NBQ0hFX0lOSVRJQUxfU0laRSk7CiAJCX0KKworCQlwdWJsaWMgc3luY2hyb25pemVkIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKCkgeworCQkJaWYgKHRoaXMudW5yZXNvbHZlZEVudHJ5U3RhdHVzID09IE5FRURfUkVTT0xVVElPTikKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVkQ2xhc3NwYXRoOworCQl9CiAJCQorCQlwdWJsaWMgdm9pZCBmb3JnZXRFeHRlcm5hbFRpbWVzdGFtcHNBbmRJbmRleGVzKCkgeworCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gdGhpcy5yZXNvbHZlZENsYXNzcGF0aDsKKwkJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgcmV0dXJuOworCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gbWFuYWdlci5pbmRleE1hbmFnZXI7CisJCQlNYXAgZXh0ZXJuYWxUaW1lU3RhbXBzID0gbWFuYWdlci5kZWx0YVN0YXRlLmdldEV4dGVybmFsTGliVGltZVN0YW1wcygpOworCQkJSGFzaE1hcCByb290SW5mb3MgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldERlbHRhU3RhdGUoKS5vdGhlclJvb3RzOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7CisJCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJCWlmIChyb290SW5mb3MuZ2V0KHBhdGgpID09IG51bGwpIHsKKwkJCQkJCWV4dGVybmFsVGltZVN0YW1wcy5yZW1vdmUocGF0aCk7CisJCQkJCQlpbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgocGF0aCk7IC8vIGZvcmNlIHJlaW5kZXhpbmcgb24gbmV4dCByZWZlcmVuY2UgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMDgzICkKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCiAJCXB1YmxpYyB2b2lkIHJlbWVtYmVyRXh0ZXJuYWxMaWJUaW1lc3RhbXBzKCkgewogCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gdGhpcy5yZXNvbHZlZENsYXNzcGF0aDsKIAkJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgcmV0dXJuOwotCQkJSVdvcmtzcGFjZVJvb3Qgd1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQkJTWFwIGV4dGVybmFsVGltZVN0YW1wcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhU3RhdGUuZ2V0RXh0ZXJuYWxMaWJUaW1lU3RhbXBzKCk7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwogCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKIAkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKIAkJCQkJaWYgKGV4dGVybmFsVGltZVN0YW1wcy5nZXQocGF0aCkgPT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod1Jvb3QsIHBhdGgsIHRydWUpOwotCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSkgeworCQkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRFeHRlcm5hbFRhcmdldChwYXRoLCB0cnVlKTsKKwkJCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7CiAJCQkJCQkJbG9uZyB0aW1lc3RhbXAgPSBEZWx0YVByb2Nlc3Nvci5nZXRUaW1lU3RhbXAoKGphdmEuaW8uRmlsZSl0YXJnZXQpOwotCQkJCQkJCWV4dGVybmFsVGltZVN0YW1wcy5wdXQocGF0aCwgbmV3IExvbmcodGltZXN0YW1wKSk7CQkJCQkJCQorCQkJCQkJCWV4dGVybmFsVGltZVN0YW1wcy5wdXQocGF0aCwgbmV3IExvbmcodGltZXN0YW1wKSk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFJlc29sdmVkQ2xhc3NwYXRoKCkgewotCQkJLy8gbnVsbCBvdXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24KLQkJCXNldENsYXNzcGF0aCh0aGlzLnJhd0NsYXNzcGF0aCwgdGhpcy5vdXRwdXRMb2NhdGlvbiwgdGhpcy5yYXdDbGFzc3BhdGhTdGF0dXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aCwgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24sIElKYXZhTW9kZWxTdGF0dXMgbmV3UmF3Q2xhc3NwYXRoU3RhdHVzLCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdSZXNvbHZlZENsYXNzcGF0aCwgTWFwIG5ld1Jvb3RQYXRoVG9SYXdFbnRyaWVzLCBNYXAgbmV3Um9vdFBhdGhUb1Jlc29sdmVkRW50cmllcywgSUphdmFNb2RlbFN0YXR1cyBuZXdVbnJlc29sdmVkRW50cnlTdGF0dXMpIHsKLQkJCS8vIHJlbWVtYmVyIG9sZCBpbmZvCi0JCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJCURlbHRhUHJvY2Vzc29yIGRlbHRhUHJvY2Vzc29yID0gbWFuYWdlci5kZWx0YVN0YXRlLmdldERlbHRhUHJvY2Vzc29yKCk7Ci0JCQlkZWx0YVByb2Nlc3Nvci5hZGRDbGFzc3BhdGhDaGFuZ2UodGhpcy5wcm9qZWN0LCB0aGlzLnJhd0NsYXNzcGF0aCwgdGhpcy5vdXRwdXRMb2NhdGlvbiwgdGhpcy5yZXNvbHZlZENsYXNzcGF0aCk7CisKKwkJcHVibGljIHN5bmNocm9uaXplZCBDbGFzc3BhdGhDaGFuZ2UgcmVzZXRSZXNvbHZlZENsYXNzcGF0aCgpIHsKKwkJCS8vIGNsZWFyIG5vbi1jaGFpbmluZyBqYXJzIGNhY2hlIGFuZCBpbnZhbGlkIGphcnMgY2FjaGUKKwkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlc2V0Q2xhc3NwYXRoTGlzdENhY2hlKCk7CiAJCQkKKwkJCS8vIG51bGwgb3V0IHJlc29sdmVkIGluZm9ybWF0aW9uCisJCQlyZXR1cm4gc2V0UmVzb2x2ZWRDbGFzc3BhdGgobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdGhpcy5yYXdUaW1lU3RhbXAsIHRydWUvKmFkZCBjbGFzc3BhdGggY2hhbmdlKi8pOworCQl9CisKKwkJcHJpdmF0ZSBDbGFzc3BhdGhDaGFuZ2Ugc2V0Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aCwgSUNsYXNzcGF0aEVudHJ5W10gcmVmZXJlbmNlZEVudHJpZXMsIElQYXRoIG5ld091dHB1dExvY2F0aW9uLCBJSmF2YU1vZGVsU3RhdHVzIG5ld1Jhd0NsYXNzcGF0aFN0YXR1cywgSUNsYXNzcGF0aEVudHJ5W10gbmV3UmVzb2x2ZWRDbGFzc3BhdGgsIE1hcCBuZXdSb290UGF0aFRvUmF3RW50cmllcywgTWFwIG5ld1Jvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMsIElKYXZhTW9kZWxTdGF0dXMgbmV3VW5yZXNvbHZlZEVudHJ5U3RhdHVzLCBib29sZWFuIGFkZENsYXNzcGF0aENoYW5nZSkgeworCQkJQ2xhc3NwYXRoQ2hhbmdlIGNsYXNzcGF0aENoYW5nZSA9IGFkZENsYXNzcGF0aENoYW5nZSA/IGFkZENsYXNzcGF0aENoYW5nZSgpIDogbnVsbDsKKworCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzICE9IG51bGwpCXRoaXMucmVmZXJlbmNlZEVudHJpZXMgPSByZWZlcmVuY2VkRW50cmllczsKKwkJCWlmICh0aGlzLnJlZmVyZW5jZWRFbnRyaWVzID09IG51bGwpIHRoaXMucmVmZXJlbmNlZEVudHJpZXMgPSBDbGFzc3BhdGhFbnRyeS5OT19FTlRSSUVTOwogCQkJdGhpcy5yYXdDbGFzc3BhdGggPSBuZXdSYXdDbGFzc3BhdGg7CiAJCQl0aGlzLm91dHB1dExvY2F0aW9uID0gbmV3T3V0cHV0TG9jYXRpb247CiAJCQl0aGlzLnJhd0NsYXNzcGF0aFN0YXR1cyA9IG5ld1Jhd0NsYXNzcGF0aFN0YXR1czsKQEAgLTEwNTcsNjMgKzExOTksOTQgQEAKIAkJCXRoaXMucm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcyA9IG5ld1Jvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXM7CiAJCQl0aGlzLnVucmVzb2x2ZWRFbnRyeVN0YXR1cyA9IG5ld1VucmVzb2x2ZWRFbnRyeVN0YXR1czsKIAkJCXRoaXMuamF2YWRvY0NhY2hlID0gbmV3IExSVUNhY2hlKEpBVkFET0NfQ0FDSEVfSU5JVElBTF9TSVpFKTsKKworCQkJcmV0dXJuIGNsYXNzcGF0aENoYW5nZTsKKwkJfQorCisJCXByb3RlY3RlZCBDbGFzc3BhdGhDaGFuZ2UgYWRkQ2xhc3NwYXRoQ2hhbmdlKCkgeworCQkJLy8gcmVtZW1iZXIgb2xkIGluZm8KKwkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJQ2xhc3NwYXRoQ2hhbmdlIGNsYXNzcGF0aENoYW5nZSA9IG1hbmFnZXIuZGVsdGFTdGF0ZS5hZGRDbGFzc3BhdGhDaGFuZ2UodGhpcy5wcm9qZWN0LCB0aGlzLnJhd0NsYXNzcGF0aCwgdGhpcy5vdXRwdXRMb2NhdGlvbiwgdGhpcy5yZXNvbHZlZENsYXNzcGF0aCk7CisJCQlyZXR1cm4gY2xhc3NwYXRoQ2hhbmdlOworCQl9CisKKwkJcHVibGljIENsYXNzcGF0aENoYW5nZSBzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3Q2xhc3NwYXRoLCBJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwgSUphdmFNb2RlbFN0YXR1cyBuZXdSYXdDbGFzc3BhdGhTdGF0dXMpIHsKKwkJCXJldHVybiBzZXRSYXdDbGFzc3BhdGgobmV3UmF3Q2xhc3NwYXRoLCBudWxsLCBuZXdPdXRwdXRMb2NhdGlvbiwgbmV3UmF3Q2xhc3NwYXRoU3RhdHVzKTsKKwkJfQorCisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3NwYXRoQ2hhbmdlIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBuZXdSYXdDbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHJlZmVyZW5jZWRFbnRyaWVzLCBJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwgSUphdmFNb2RlbFN0YXR1cyBuZXdSYXdDbGFzc3BhdGhTdGF0dXMpIHsKKwkJCXRoaXMucmF3VGltZVN0YW1wKys7CisJCQlyZXR1cm4gc2V0Q2xhc3NwYXRoKG5ld1Jhd0NsYXNzcGF0aCwgcmVmZXJlbmNlZEVudHJpZXMsIG5ld091dHB1dExvY2F0aW9uLCBuZXdSYXdDbGFzc3BhdGhTdGF0dXMsIG51bGwvKnJlc29sdmVkIGNsYXNzcGF0aCovLCBudWxsLypyb290IHRvIHJhdyBtYXAqLywgbnVsbC8qcm9vdCB0byByZXNvbHZlZCBtYXAqLywgbnVsbC8qdW5yZXNvbHZlZCBzdGF0dXMqLywgdHJ1ZS8qYWRkIGNsYXNzcGF0aCBjaGFuZ2UqLyk7CisJCX0KKworCQlwdWJsaWMgQ2xhc3NwYXRoQ2hhbmdlIHNldFJlc29sdmVkQ2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkQ2xhc3NwYXRoLCBNYXAgbmV3Um9vdFBhdGhUb1Jhd0VudHJpZXMsIE1hcCBuZXdSb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzLCBJSmF2YU1vZGVsU3RhdHVzIG5ld1VucmVzb2x2ZWRFbnRyeVN0YXR1cywgaW50IHRpbWVTdGFtcCwgYm9vbGVhbiBhZGRDbGFzc3BhdGhDaGFuZ2UpIHsKKwkJCXJldHVybiBzZXRSZXNvbHZlZENsYXNzcGF0aChuZXdSZXNvbHZlZENsYXNzcGF0aCwgbnVsbCwgbmV3Um9vdFBhdGhUb1Jhd0VudHJpZXMsIG5ld1Jvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMsIG5ld1VucmVzb2x2ZWRFbnRyeVN0YXR1cywgdGltZVN0YW1wLCBhZGRDbGFzc3BhdGhDaGFuZ2UpOwogCQl9CiAJCQotCQkvKgotCQkgKiBSZWFkcyB0aGUgcmF3IGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIGZyb20gZGlzaywgYW5kIHJlbWVtYmVyIHRoZW0uCi0JCSAqIFJldHVybiB0aGUgcmF3IGNsYXNzcGF0aCwgb3IgSmF2YVByb2plY3QjSU5WQUxJRF9DTEFTU1BBVEggaWYgdW5hYmxlIHRvIHJlYWQgaXQuCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIElDbGFzc3BhdGhFbnRyeVtdIHJlYWRBbmRDYWNoZUNsYXNzcGF0aChKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCQlwdWJsaWMgc3luY2hyb25pemVkIENsYXNzcGF0aENoYW5nZSBzZXRSZXNvbHZlZENsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBuZXdSZXNvbHZlZENsYXNzcGF0aCwgSUNsYXNzcGF0aEVudHJ5W10gcmVmZXJlbmNlZEVudHJpZXMsIE1hcCBuZXdSb290UGF0aFRvUmF3RW50cmllcywgTWFwIG5ld1Jvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMsIElKYXZhTW9kZWxTdGF0dXMgbmV3VW5yZXNvbHZlZEVudHJ5U3RhdHVzLCBpbnQgdGltZVN0YW1wLCBib29sZWFuIGFkZENsYXNzcGF0aENoYW5nZSkgeworCQkJaWYgKHRoaXMucmF3VGltZVN0YW1wICE9IHRpbWVTdGFtcCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBzZXRDbGFzc3BhdGgodGhpcy5yYXdDbGFzc3BhdGgsIHJlZmVyZW5jZWRFbnRyaWVzLCB0aGlzLm91dHB1dExvY2F0aW9uLCB0aGlzLnJhd0NsYXNzcGF0aFN0YXR1cywgbmV3UmVzb2x2ZWRDbGFzc3BhdGgsIG5ld1Jvb3RQYXRoVG9SYXdFbnRyaWVzLCBuZXdSb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzLCBuZXdVbnJlc29sdmVkRW50cnlTdGF0dXMsIGFkZENsYXNzcGF0aENoYW5nZSk7CisJCX0KKworCQkvKioKKwkJICogUmVhZHMgdGhlIGNsYXNzcGF0aCBhbmQgY2FjaGVzIHRoZSBlbnRyaWVzLiBSZXR1cm5zIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5LCB3aGVyZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByb3cgaXMgZml4ZWQgdG8gMi4KKwkJICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgcmF3IGNsYXNzcGF0aCBlbnRyaWVzIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlZCBlbnRyaWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzdG9yZWQKKwkJICogYnkgdGhlIGNsaWVudCBlYXJsaWVyLiBTZWUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcygpfSBmb3IgbW9yZSBkZXRhaWxzLiAKKwkJICogCisJCSAqLwkJCisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNsYXNzcGF0aEVudHJ5W11bXSByZWFkQW5kQ2FjaGVDbGFzc3BhdGgoSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKIAkJCS8vIHJlYWQgZmlsZSBlbnRyaWVzIGFuZCB1cGRhdGUgc3RhdHVzCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7CisJCQlJQ2xhc3NwYXRoRW50cnlbXVtdIGNsYXNzcGF0aDsKIAkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzOwogCQkJdHJ5IHsKIAkJCQljbGFzc3BhdGggPSBqYXZhUHJvamVjdC5yZWFkRmlsZUVudHJpZXNXaXRoRXhjZXB0aW9uKG51bGwvKm5vdCBpbnRlcmVzdGVkIGluIHVua25vd24gZWxlbWVudHMqLyk7CiAJCQkJc3RhdHVzID0gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY2xhc3NwYXRoID0gSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEg7Ci0JCQkJc3RhdHVzID0gCisJCQkJY2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtdW117SmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEgsIENsYXNzcGF0aEVudHJ5Lk5PX0VOVFJJRVN9OworCQkJCXN0YXR1cyA9CiAJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCiAJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRIX0ZJTEVfRk9STUFULAogCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfY2Fubm90UmVhZENsYXNzcGF0aEZpbGUsIGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljbGFzc3BhdGggPSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSDsKKwkJCQljbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXtKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCwgQ2xhc3NwYXRoRW50cnkuTk9fRU5UUklFU307CiAJCQkJaWYgKE1lc3NhZ2VzLmZpbGVfYmFkRm9ybWF0LmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpCi0JCQkJCXN0YXR1cyA9IAorCQkJCQlzdGF0dXMgPQogCQkJCQkJbmV3IEphdmFNb2RlbFN0YXR1cygKIAkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRIX0ZJTEVfRk9STUFULAogCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX3htbEZvcm1hdEVycm9yLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLCBNZXNzYWdlcy5maWxlX2JhZEZvcm1hdCkpOwotCQkJCWVsc2UJCQkJCi0JCQkJCXN0YXR1cyA9IAorCQkJCWVsc2UKKwkJCQkJc3RhdHVzID0KIAkJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCiAJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKIAkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9jYW5ub3RSZWFkQ2xhc3NwYXRoRmlsZSwgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQljbGFzc3BhdGggPSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSDsKLQkJCQlzdGF0dXMgPSAgCisJCQl9IGNhdGNoIChDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgeworCQkJCWNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXVtde0phdmFQcm9qZWN0LklOVkFMSURfQ0xBU1NQQVRILCBDbGFzc3BhdGhFbnRyeS5OT19FTlRSSUVTfTsKKwkJCQlzdGF0dXMgPQogCQkJCQluZXcgSmF2YU1vZGVsU3RhdHVzKAogCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKIAkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2lsbGVnYWxFbnRyeUluQ2xhc3NwYXRoRmlsZSwgbmV3IFN0cmluZ1tdIHtqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLCBlLmdldE1lc3NhZ2UoKX0pKTsKIAkJCX0KLQkJCisKIAkJCS8vIGV4dHJhY3Qgb3V0IHRoZSBvdXRwdXQgbG9jYXRpb24KKwkJCWludCByYXdDbGFzc3BhdGhMZW5ndGggPSBjbGFzc3BhdGhbMF0ubGVuZ3RoOwogCQkJSVBhdGggb3V0cHV0ID0gbnVsbDsKLQkJCWlmIChjbGFzc3BhdGgubGVuZ3RoID4gMCkgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtjbGFzc3BhdGgubGVuZ3RoIC0gMV07CisJCQlpZiAocmF3Q2xhc3NwYXRoTGVuZ3RoID4gMCkgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFswXVtyYXdDbGFzc3BhdGhMZW5ndGggLSAxXTsKIAkJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgewogCQkJCQlvdXRwdXQgPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvcHkgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIGNvcHksIDAsIGNvcHkubGVuZ3RoKTsKLQkJCQkJY2xhc3NwYXRoID0gY29weTsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmF3Q2xhc3NwYXRoTGVuZ3RoIC0gMV07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoWzBdLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7CisJCQkJCWNsYXNzcGF0aFswXSA9IGNvcHk7CiAJCQkJfQogCQkJfQotCQkJCisKIAkJCS8vIHN0b3JlIG5ldyByYXcgY2xhc3NwYXRoLCBuZXcgb3V0cHV0IGFuZCBuZXcgc3RhdHVzLCBhbmQgbnVsbCBvdXQgcmVzb2x2ZWQgaW5mbwotCQkJc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCwgb3V0cHV0LCBzdGF0dXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCQkJCisJCQlzZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoWzBdLCBjbGFzc3BhdGhbMV0sIG91dHB1dCwgc3RhdHVzKTsKKwogCQkJcmV0dXJuIGNsYXNzcGF0aDsKIAkJfQotCQkKKwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJCWJ1ZmZlci5hcHBlbmQoIkluZm8gZm9yICIpOyAvLyROT04tTkxTLTEkCkBAIC0xMTM5LDYgKzEzMTIsMTEgQEAKIAkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKIAkJCQl9CiAJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJSZXNvbHZlZCBjbGFzc3BhdGggc3RhdHVzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHRoaXMudW5yZXNvbHZlZEVudHJ5U3RhdHVzID09IE5FRURfUkVTT0xVVElPTikKKwkJCQlidWZmZXIuYXBwZW5kKCJORUVEIFJFU09MVVRJT04iKTsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZQorCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy51bnJlc29sdmVkRW50cnlTdGF0dXMgPT0gbnVsbCA/ICI8bnVsbD5cbiIgOiB0aGlzLnVucmVzb2x2ZWRFbnRyeVN0YXR1cy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJYnVmZmVyLmFwcGVuZCgiT3V0cHV0IGxvY2F0aW9uOlxuICAiKTsgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoaXMub3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoIjxudWxsPiIpOyAvLyROT04tTkxTLTEkCkBAIC0xMTQ3LDggKzEzMjUsMzQgQEAKIAkJCX0KIAkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAkJfQorCisJCXB1YmxpYyBib29sZWFuIHdyaXRlQW5kQ2FjaGVDbGFzc3BhdGgoCisJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAorCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aCwgCisJCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmVmZXJlbmNlZEVudHJpZXMsCisJCQkJZmluYWwgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQl0aGlzLndyaXR0aW5nUmF3Q2xhc3NwYXRoID0gdHJ1ZTsKKwkJCQlpZiAobmV3UmVmZXJlbmNlZEVudHJpZXMgPT0gbnVsbCkgbmV3UmVmZXJlbmNlZEVudHJpZXMgPSB0aGlzLnJlZmVyZW5jZWRFbnRyaWVzOworCQkJCQorCQkJCS8vIHdyaXRlIC5jbGFzc3BhdGgKKwkJCQlpZiAoIWphdmFQcm9qZWN0LndyaXRlRmlsZUVudHJpZXMobmV3UmF3Q2xhc3NwYXRoLCBuZXdSZWZlcmVuY2VkRW50cmllcywgIG5ld091dHB1dExvY2F0aW9uKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCS8vIHN0b3JlIG5ldyByYXcgY2xhc3NwYXRoLCBuZXcgb3V0cHV0IGFuZCBuZXcgc3RhdHVzLCBhbmQgbnVsbCBvdXQgcmVzb2x2ZWQgaW5mbworCQkJCXNldFJhd0NsYXNzcGF0aChuZXdSYXdDbGFzc3BhdGgsIG5ld1JlZmVyZW5jZWRFbnRyaWVzLCBuZXdPdXRwdXRMb2NhdGlvbiwgSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LKTsKKwkJCX0gZmluYWxseSB7CisJCQkJdGhpcy53cml0dGluZ1Jhd0NsYXNzcGF0aCA9IGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCXB1YmxpYyBib29sZWFuIHdyaXRlQW5kQ2FjaGVDbGFzc3BhdGgoSmF2YVByb2plY3QgamF2YVByb2plY3QsIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aCwgZmluYWwgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJcmV0dXJuIHdyaXRlQW5kQ2FjaGVDbGFzc3BhdGgoamF2YVByb2plY3QsIG5ld1Jhd0NsYXNzcGF0aCwgbnVsbCwgbmV3T3V0cHV0TG9jYXRpb24pOworCQl9CisKIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcldvcmtpbmdDb3B5SW5mbyBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKIAkJaW50IHVzZUNvdW50ID0gMDsKIAkJSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcjsKQEAgLTEyMDEsMTE0ICsxNDA1LDIwNyBAQAogCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCQl9CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ1BfUkVTT0xWRV9WRVJCT1NFID0gZmFsc2U7CiAJcHVibGljIHN0YXRpYyBib29sZWFuIENQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBDUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSA9IGZhbHNlOwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBaSVBfQUNDRVNTX1ZFUkJPU0UgPSBmYWxzZTsKLQkKKwkvLyB0ZW1wb3JhcnkgZGVidWcgZmxhZyB0byB0cmFjayBmYWlsdXJlcyBvZiBidWcgMzAyODUwCisJcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHXzMwMjg1MCA9IGZhbHNlOworCiAJLyoqCiAJICogQSBjYWNoZSBvZiBvcGVuZWQgemlwIGZpbGVzIHBlciB0aHJlYWQuCiAJICogKGZvciBhIGdpdmVuIHRocmVhZCwgdGhlIG9iamVjdCB2YWx1ZSBpcyBhIEhhc2hNYXAgZnJvbSBJUGF0aCB0byBqYXZhLmlvLlppcEZpbGUpCiAJICovCiAJcHJpdmF0ZSBUaHJlYWRMb2NhbCB6aXBGaWxlcyA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCQorCiAJcHJpdmF0ZSBVc2VyTGlicmFyeU1hbmFnZXIgdXNlckxpYnJhcnlNYW5hZ2VyOwogCQorCS8qCisJICogTGlzdCBvZiBJUGF0aCBvZiBqYXJzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBjb250YWluIGEgY2hhaW5pbmcgKHRocm91Z2ggTUFOSUZFU1QuTUYpIHRvIGFub3RoZXIgbGlicmFyeQorCSAqLworCXByaXZhdGUgU2V0IG5vbkNoYWluaW5nSmFyczsKKwkKKwkvKgorCSAqIExpc3Qgb2YgSVBhdGggb2YgamFycyB0aGF0IGFyZSBrbm93biB0byBiZSBpbnZhbGlkIC0gc3VjaCBhcyBub3QgYmVpbmcgYSB2YWxpZC9rbm93biBmb3JtYXQKKwkgKi8KKwlwcml2YXRlIFNldCBpbnZhbGlkQXJjaGl2ZXM7CisKIAkvKioKIAkgKiBVcGRhdGUgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZSBjYWNoZQogCSAqLwotCXB1YmxpYyBjbGFzcyBFY2xpcHNlUHJlZmVyZW5jZXNMaXN0ZW5lciBpbXBsZW1lbnRzIElFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBFY2xpcHNlUHJlZmVyZW5jZXNMaXN0ZW5lciBpbXBsZW1lbnRzIElFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7CiAJCS8qKgogICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIjcHJlZmVyZW5jZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKElFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIAlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0S2V5KCk7Ci0gICAgICAgIAlpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoQ1BfVkFSSUFCTEVfUFJFRkVSRU5DRVNfUFJFRklYKSkgewotICAgICAgICAJCVN0cmluZyB2YXJOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhDUF9WQVJJQUJMRV9QUkVGRVJFTkNFU19QUkVGSVgubGVuZ3RoKCkpOwotICAgICAgICAJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldEphdmFNb2RlbE1hbmFnZXIoKTsKLSAgICAgICAgCQlpZiAobWFuYWdlci52YXJpYWJsZXNXaXRoSW5pdGlhbGl6ZXIuY29udGFpbnModmFyTmFtZSkpIHsKLSAgICAgICAgCQkJLy8gcmV2ZXJ0IHByZWZlcmVuY2UgdmFsdWUgYXMgd2Ugd2lsbCBub3QgYXBwbHkgaXQgdG8gSmF2YUNvcmUgY2xhc3NwYXRoIHZhcmlhYmxlCi0gICAgICAgIAkJCVN0cmluZyBvbGRWYWx1ZSA9IChTdHJpbmcpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0gICAgICAgIAkJCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIAkJCQkvLyB1bmV4cGVjdGVkIG9sZCB2YWx1ZSA9PiByZW1vdmUgdmFyaWFibGUgZnJvbSBzZXQKLSAgICAgICAgCQkJCW1hbmFnZXIudmFyaWFibGVzV2l0aEluaXRpYWxpemVyLnJlbW92ZSh2YXJOYW1lKTsKLSAgICAgICAgCQkJfSBlbHNlIHsKLSAgICAgICAgCQkJCW1hbmFnZXIuZ2V0SW5zdGFuY2VQcmVmZXJlbmNlcygpLnB1dCh2YXJOYW1lLCBvbGRWYWx1ZSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9IGVsc2UgewotICAgICAgICAJCQlTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKWV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIAkJCUlQYXRoIG5ld1BhdGg7Ci0gICAgICAgIAkJCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmICEobmV3VmFsdWUgPSBuZXdWYWx1ZS50cmltKCkpLmVxdWFscyhDUF9FTlRSWV9JR05PUkUpKSB7Ci0gICAgICAgIAkJCQluZXdQYXRoID0gbmV3IFBhdGgobmV3VmFsdWUpOwotICAgICAgICAJCQl9IGVsc2UgewotICAgICAgICAJCQkJbmV3UGF0aCA9IG51bGw7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQkJdHJ5IHsKLSAgICAgICAgCQkJCVNldFZhcmlhYmxlc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU2V0VmFyaWFibGVzT3BlcmF0aW9uKG5ldyBTdHJpbmdbXSB7dmFyTmFtZX0sIG5ldyBJUGF0aFtdIHtuZXdQYXRofSwgZmFsc2UvKmRvbid0IHVwZGF0ZSBwcmVmZXJlbmNlcyovKTsKLSAgICAgICAgCQkJCW9wZXJhdGlvbi5ydW5PcGVyYXRpb24obnVsbC8qbm8gcHJvZ3Jlc3MgYXZhaWxhYmxlKi8pOwotICAgICAgICAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAJCQkJVXRpbC5sb2coZSwgIkNvdWxkIG5vdCBzZXQgY2xhc3NwYXRoIHZhcmlhYmxlICIgKyB2YXJOYW1lICsgIiB0byAiICsgbmV3UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChDUF9DT05UQUlORVJfUFJFRkVSRU5DRVNfUFJFRklYKSkgewotICAgICAgICAJCXJlY3JlYXRlUGVyc2lzdGVkQ29udGFpbmVyKHByb3BlcnR5TmFtZSwgKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpLCBmYWxzZSk7Ci0gICAgICAgIAl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0NMRUFOX09VVFBVVF9GT0xERVIpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfUkVTT1VSQ0VfQ09QWV9GSUxURVIpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfRFVQTElDQVRFX1JFU09VUkNFKSB8fAotCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFQ1JFQVRFX01PRElGSUVEX0NMQVNTX0ZJTEVTX0lOX09VVFBVVF9GT0xERVIpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TKSB8fAotCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRIKSB8fAotCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgpIHx8Ci0JCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0lOQ09NUEFUSUJMRV9KREtfTEVWRUwpKSB7Ci0JCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7Ci0JCQkJSUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7Ci0JCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHM7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIHBsID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgcGw7IGkrKykgewotCQkJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIHByb2plY3RzW2ldOwotCQkJCQkJbWFuYWdlci5kZWx0YVN0YXRlLmFkZENsYXNzcGF0aFZhbGlkYXRpb24oamF2YVByb2plY3QpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBuZWVkIHRvIHRvdWNoIHRoZSBwcm9qZWN0IHRvIGZvcmNlIHZhbGlkYXRpb24gYnkgRGVsdGFQcm9jZXNzb3IKLQkJCQkgICAgICAgICAgICBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkudG91Y2gobnVsbCk7Ci0JCQkJICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkgICAgICAgICAgICAvLyBza2lwCi0JCQkJICAgICAgICB9CisgICAgICAgIAlpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoSmF2YUNvcmUuUExVR0lOX0lEKSkgeworCSAgICAgICAgCWlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChDUF9WQVJJQUJMRV9QUkVGRVJFTkNFU19QUkVGSVgpKSB7CisJICAgICAgICAJCVN0cmluZyB2YXJOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhDUF9WQVJJQUJMRV9QUkVGRVJFTkNFU19QUkVGSVgubGVuZ3RoKCkpOworCSAgICAgICAgCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJICAgICAgICAJCWlmIChtYW5hZ2VyLnZhcmlhYmxlc1dpdGhJbml0aWFsaXplci5jb250YWlucyh2YXJOYW1lKSkgeworCSAgICAgICAgCQkJLy8gcmV2ZXJ0IHByZWZlcmVuY2UgdmFsdWUgYXMgd2Ugd2lsbCBub3QgYXBwbHkgaXQgdG8gSmF2YUNvcmUgY2xhc3NwYXRoIHZhcmlhYmxlCisJICAgICAgICAJCQlTdHJpbmcgb2xkVmFsdWUgPSAoU3RyaW5nKSBldmVudC5nZXRPbGRWYWx1ZSgpOworCSAgICAgICAgCQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKKwkgICAgICAgIAkJCQkvLyB1bmV4cGVjdGVkIG9sZCB2YWx1ZSA9PiByZW1vdmUgdmFyaWFibGUgZnJvbSBzZXQKKwkgICAgICAgIAkJCQltYW5hZ2VyLnZhcmlhYmxlc1dpdGhJbml0aWFsaXplci5yZW1vdmUodmFyTmFtZSk7CisJICAgICAgICAJCQl9IGVsc2UgeworCSAgICAgICAgCQkJCW1hbmFnZXIuZ2V0SW5zdGFuY2VQcmVmZXJlbmNlcygpLnB1dCh2YXJOYW1lLCBvbGRWYWx1ZSk7CisJICAgICAgICAJCQl9CisJICAgICAgICAJCX0gZWxzZSB7CisJICAgICAgICAJCQlTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKWV2ZW50LmdldE5ld1ZhbHVlKCk7CisJICAgICAgICAJCQlJUGF0aCBuZXdQYXRoOworCSAgICAgICAgCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgIShuZXdWYWx1ZSA9IG5ld1ZhbHVlLnRyaW0oKSkuZXF1YWxzKENQX0VOVFJZX0lHTk9SRSkpIHsKKwkgICAgICAgIAkJCQluZXdQYXRoID0gbmV3IFBhdGgobmV3VmFsdWUpOworCSAgICAgICAgCQkJfSBlbHNlIHsKKwkgICAgICAgIAkJCQluZXdQYXRoID0gbnVsbDsKKwkgICAgICAgIAkJCX0KKwkgICAgICAgIAkJCXRyeSB7CisJICAgICAgICAJCQkJU2V0VmFyaWFibGVzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBTZXRWYXJpYWJsZXNPcGVyYXRpb24obmV3IFN0cmluZ1tdIHt2YXJOYW1lfSwgbmV3IElQYXRoW10ge25ld1BhdGh9LCBmYWxzZS8qZG9uJ3QgdXBkYXRlIHByZWZlcmVuY2VzKi8pOworCSAgICAgICAgCQkJCW9wZXJhdGlvbi5ydW5PcGVyYXRpb24obnVsbC8qbm8gcHJvZ3Jlc3MgYXZhaWxhYmxlKi8pOworCSAgICAgICAgCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgIAkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggdmFyaWFibGUgIiArIHZhck5hbWUgKyAiIHRvICIgKyBuZXdQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJICAgICAgICAJCQl9CisJICAgICAgICAJCX0KKwkgICAgICAgIAl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKENQX0NPTlRBSU5FUl9QUkVGRVJFTkNFU19QUkVGSVgpKSB7CisJICAgICAgICAJCXJlY3JlYXRlUGVyc2lzdGVkQ29udGFpbmVyKHByb3BlcnR5TmFtZSwgKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpLCBmYWxzZSk7CisJICAgICAgICAJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9SRVNPVVJDRV9DT1BZX0ZJTFRFUikgfHwKKwkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfRFVQTElDQVRFX1JFU09VUkNFKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9SRUNSRUFURV9NT0RJRklFRF9DTEFTU19GSUxFU19JTl9PVVRQVVRfRk9MREVSKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCkgfHwKKwkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSU5DT01QTEVURV9DTEFTU1BBVEgpIHx8CisJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgpIHx8CisJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMKSB8fAorCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfT1VUUFVUX0xPQ0FUSU9OX09WRVJMQVBQSU5HX0FOT1RIRVJfU09VUkNFKSkgeworCQkJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJCQkJSUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7CisJCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOworCQkJCQl0cnkgeworCQkJCQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBwbCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IHBsOyBpKyspIHsKKwkJCQkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV07CisJCQkJCQkJbWFuYWdlci5kZWx0YVN0YXRlLmFkZENsYXNzcGF0aFZhbGlkYXRpb24oamF2YVByb2plY3QpOworCQkJCQkJCXRyeSB7CisJCQkJCQkJCS8vIG5lZWQgdG8gdG91Y2ggdGhlIHByb2plY3QgdG8gZm9yY2UgdmFsaWRhdGlvbiBieSBEZWx0YVByb2Nlc3NvcgorCQkJCQkgICAgICAgICAgICBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkudG91Y2gobnVsbCk7CisJCQkJCSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCSAgICAgICAgICAgIC8vIHNraXAKKwkJCQkJICAgICAgICB9CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBza2lwCiAJCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBza2lwCisJICAgICAgICAJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChDUF9VU0VSTElCUkFSWV9QUkVGRVJFTkNFU19QUkVGSVgpKSB7CisJCQkJCVN0cmluZyBsaWJOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhDUF9VU0VSTElCUkFSWV9QUkVGRVJFTkNFU19QUkVGSVgubGVuZ3RoKCkpOworCQkJCQlVc2VyTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0VXNlckxpYnJhcnlNYW5hZ2VyKCk7CisJICAgICAgICAJCW1hbmFnZXIudXBkYXRlVXNlckxpYnJhcnkobGliTmFtZSwgKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpKTsKKwkgICAgICAgIAl9CisJICAgICAgICB9CisgICAgICAgIAkvLyBSZXNldCBhbGwgcHJvamVjdCBjYWNoZXMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzNTY4ICkKKyAgICAgICAgCXRyeSB7CisgICAgICAgIAkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkgICAgICAgIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJKChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV0pLnJlc2V0Q2FjaGVzKCk7CiAJCQkJfQorICAgICAgICAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCQkvLyBjYW5ub3QgcmV0cmlldmUgSmF2YSBwcm9qZWN0cwogICAgICAgICAJfQogICAgICAgICB9CiAJfQorCS8qKgorCSAqIExpc3RlbmVyIG9uIGVjbGlwc2UgcHJlZmVyZW5jZXMgY2hhbmdlcy4KKwkgKi8KKwlFY2xpcHNlUHJlZmVyZW5jZXNMaXN0ZW5lciBpbnN0YW5jZVByZWZlcmVuY2VzTGlzdGVuZXIgPSBuZXcgRWNsaXBzZVByZWZlcmVuY2VzTGlzdGVuZXIoKTsKKwkvKioKKwkgKiBMaXN0ZW5lciBvbiBlY2xpcHNlIHByZWZlcmVuY2VzIGRlZmF1bHQvaW5zdGFuY2Ugbm9kZSBjaGFuZ2VzLgorCSAqLworCUlFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lciBpbnN0YW5jZU5vZGVMaXN0ZW5lciA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXB1YmxpYyB2b2lkIGFkZGVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJcHVibGljIHZvaWQgcmVtb3ZlZChJRWNsaXBzZVByZWZlcmVuY2VzLk5vZGVDaGFuZ2VFdmVudCBldmVudCkgeworCQkJaWYgKGV2ZW50LmdldENoaWxkKCkgPT0gSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdKSB7CisJCQkJSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdID0gSW5zdGFuY2VTY29wZS5JTlNUQU5DRS5nZXROb2RlKEphdmFDb3JlLlBMVUdJTl9JRCk7CisJCQkJSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihuZXcgRWNsaXBzZVByZWZlcmVuY2VzTGlzdGVuZXIoKSk7CisJCQl9CisJCX0KKwl9OworCUlFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lciBkZWZhdWx0Tm9kZUxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcHVibGljIHZvaWQgYWRkZWQoSUVjbGlwc2VQcmVmZXJlbmNlcy5Ob2RlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCQlwdWJsaWMgdm9pZCByZW1vdmVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlpZiAoZXZlbnQuZ2V0Q2hpbGQoKSA9PSBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMucHJlZmVyZW5jZXNMb29rdXBbUFJFRl9ERUZBVUxUXSkgeworCQkJCUphdmFNb2RlbE1hbmFnZXIudGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0RFRkFVTFRdID0gRGVmYXVsdFNjb3BlLklOU1RBTkNFLmdldE5vZGUoSmF2YUNvcmUuUExVR0lOX0lEKTsKKwkJCX0KKwkJfQorCX07CisJLyoqCisJICogTGlzdGVuZXIgb24gcHJvcGVydGllcyBjaGFuZ2VzLgorCSAqLworCUlFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUxpc3RlbmVyOworCUlFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZXNQcm9wZXJ0eUxpc3RlbmVyOwogCiAJLyoqCiAJICogQ29uc3RydWN0cyBhIG5ldyBKYXZhTW9kZWxNYW5hZ2VyCiAJICovCiAJcHJpdmF0ZSBKYXZhTW9kZWxNYW5hZ2VyKCkgewogCQkvLyBzaW5nbGV0b246IHByZXZlbnQgb3RoZXJzIGZyb20gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UKLQkJaWYgKFBsYXRmb3JtLmlzUnVubmluZygpKSB0aGlzLmluZGV4TWFuYWdlciA9IG5ldyBJbmRleE1hbmFnZXIoKTsKKwkJLyoKKwkJICogSXQgaXMgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRoYXQgZGVwZW5kcyBvbiBhIGhlYWRsZXNzIGVudmlyb25tZW50CisJCSAqIG9ubHkgaWYgdGhlIHBsYXRmb3JtIGlzIHJ1bm5pbmcuIE90aGVyd2lzZSB0aGlzIGJyZWFrcyB0aGUgYWJpbGl0eSB0byB1c2UKKwkJICogQVNUUGFyc2VyIGluIGEgbm9uLWhlYWRsZXNzIGVudmlyb25tZW50LgorCQkgKi8KKwkJaWYgKFBsYXRmb3JtLmlzUnVubmluZygpKSB7CisJCQl0aGlzLmluZGV4TWFuYWdlciA9IG5ldyBJbmRleE1hbmFnZXIoKTsKKwkJCXRoaXMubm9uQ2hhaW5pbmdKYXJzID0gbG9hZENsYXNzcGF0aExpc3RDYWNoZShOT05fQ0hBSU5JTkdfSkFSU19DQUNIRSk7CisJCQl0aGlzLmludmFsaWRBcmNoaXZlcyA9IGxvYWRDbGFzc3BhdGhMaXN0Q2FjaGUoSU5WQUxJRF9BUkNISVZFU19DQUNIRSk7CisJCQlTdHJpbmcgaW5jbHVkZUNvbnRhaW5lclJlZmVyZW5jZWRMaWIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUkVTT0xWRV9SRUZFUkVOQ0VEX0xJQlJBUklFU19GT1JfQ09OVEFJTkVSUyk7CisJCQl0aGlzLnJlc29sdmVSZWZlcmVuY2VkTGlicmFyaWVzRm9yQ29udGFpbmVycyA9IFRSVUUuZXF1YWxzSWdub3JlQ2FzZShpbmNsdWRlQ29udGFpbmVyUmVmZXJlbmNlZExpYik7CisJCX0KIAl9CiAKIAkvKioKIAkgKiBAZGVwcmVjYXRlZAogCSAqLwogCXByaXZhdGUgdm9pZCBhZGREZXByZWNhdGVkT3B0aW9ucyhIYXNodGFibGUgb3B0aW9ucykgewotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9QQl9JTlZBTElEX0lNUE9SVCwgSmF2YUNvcmUuRVJST1IpOwkJCisJCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0lOVkFMSURfSU1QT1JULCBKYXZhQ29yZS5FUlJPUik7CiAJCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX1VOUkVBQ0hBQkxFX0NPREUsIEphdmFDb3JlLkVSUk9SKTsKIAl9CisJCisJcHVibGljIHZvaWQgYWRkTm9uQ2hhaW5pbmdKYXIoSVBhdGggcGF0aCkgeworCQlpZiAodGhpcy5ub25DaGFpbmluZ0phcnMgIT0gbnVsbCkKKwkJCXRoaXMubm9uQ2hhaW5pbmdKYXJzLmFkZChwYXRoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkSW52YWxpZEFyY2hpdmUoSVBhdGggcGF0aCkgeworCQkvLyB1bmxpa2VseSB0byBiZSBudWxsCisJCWlmICh0aGlzLmludmFsaWRBcmNoaXZlcyA9PSBudWxsKSB7CisJCQl0aGlzLmludmFsaWRBcmNoaXZlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldCgpKTsKKwkJfQorCQlpZih0aGlzLmludmFsaWRBcmNoaXZlcyAhPSBudWxsKSB7CisJCQl0aGlzLmludmFsaWRBcmNoaXZlcy5hZGQocGF0aCk7CisJCX0KKwl9CiAKIAkvKioKIAkgKiBTdGFydHMgY2FjaGluZyBaaXBGaWxlcy4KIAkgKiBJZ25vcmVzIGlmIHRoZXJlIGFyZSBhbHJlYWR5IGNsaWVudHMuCiAJICovCi0JcHVibGljIHZvaWQgY2FjaGVaaXBGaWxlcygpIHsKLQkJaWYgKHRoaXMuemlwRmlsZXMuZ2V0KCkgIT0gbnVsbCkgcmV0dXJuOwotCQl0aGlzLnppcEZpbGVzLnNldChuZXcgSGFzaE1hcCgpKTsKKwlwdWJsaWMgdm9pZCBjYWNoZVppcEZpbGVzKE9iamVjdCBvd25lcikgeworCQlaaXBDYWNoZSB6aXBDYWNoZSA9IChaaXBDYWNoZSkgdGhpcy56aXBGaWxlcy5nZXQoKTsKKwkJaWYgKHppcENhY2hlICE9IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkvLyB0aGUgb3duZXIgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZmx1c2hpbmcgdGhlIGNhY2hlCisJCXRoaXMuemlwRmlsZXMuc2V0KG5ldyBaaXBDYWNoZShvd25lcikpOwogCX0KKwogCXB1YmxpYyB2b2lkIGNsb3NlWmlwRmlsZShaaXBGaWxlIHppcEZpbGUpIHsKIAkJaWYgKHppcEZpbGUgPT0gbnVsbCkgcmV0dXJuOwogCQlpZiAodGhpcy56aXBGaWxlcy5nZXQoKSAhPSBudWxsKSB7CkBAIC0xMzMxLDIyICsxNjI4LDI4IEBACiAJCWlmKEphdmFDb3JlLmdldFBsdWdpbigpLmlzRGVidWdnaW5nKCkpewogCQkJU3RyaW5nIG9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEJVRkZFUl9NQU5BR0VSX0RFQlVHKTsKIAkJCWlmKG9wdGlvbiAhPSBudWxsKSBCdWZmZXJNYW5hZ2VyLlZFUkJPU0UgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZShUUlVFKSA7Ci0JCQkKKwogCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oQlVJTERFUl9ERUJVRyk7CiAJCQlpZihvcHRpb24gIT0gbnVsbCkgSmF2YUJ1aWxkZXIuREVCVUcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZShUUlVFKSA7Ci0JCQkKKwogCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oQ09NUElMRVJfREVCVUcpOwogCQkJaWYob3B0aW9uICE9IG51bGwpIENvbXBpbGVyLkRFQlVHID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOwogCisJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihCVUlMREVSX1NUQVRTX0RFQlVHKTsKKwkJCWlmKG9wdGlvbiAhPSBudWxsKSBKYXZhQnVpbGRlci5TSE9XX1NUQVRTID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOworCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihDT01QTEVUSU9OX0RFQlVHKTsKIAkJCWlmKG9wdGlvbiAhPSBudWxsKSBDb21wbGV0aW9uRW5naW5lLkRFQlVHID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOwotCQkJCisKIAkJCW9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKENQX1JFU09MVkVfREVCVUcpOwogCQkJaWYob3B0aW9uICE9IG51bGwpIEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOwogCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihDUF9SRVNPTFZFX0FEVkFOQ0VEX0RFQlVHKTsKIAkJCWlmKG9wdGlvbiAhPSBudWxsKSBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKFRSVUUpIDsKIAorCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oQ1BfUkVTT0xWRV9GQUlMVVJFX0RFQlVHKTsKKwkJCWlmKG9wdGlvbiAhPSBudWxsKSBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOworCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUxUQV9ERUJVRyk7CiAJCQlpZihvcHRpb24gIT0gbnVsbCkgRGVsdGFQcm9jZXNzb3IuREVCVUcgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZShUUlVFKSA7CiAKQEAgLTEzNTgsNyArMTY2MSwxMCBAQAogCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihJTkRFWF9NQU5BR0VSX0RFQlVHKTsKIAkJCWlmKG9wdGlvbiAhPSBudWxsKSBKb2JNYW5hZ2VyLlZFUkJPU0UgPSBvcHRpb24uZXF1YWxzSWdub3JlQ2FzZShUUlVFKSA7Ci0JCQkKKworCQkJb3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSU5ERVhfTUFOQUdFUl9BRFZBTkNFRF9ERUJVRyk7CisJCQlpZihvcHRpb24gIT0gbnVsbCkgSW5kZXhNYW5hZ2VyLkRFQlVHID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOworCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKQVZBTU9ERUxfREVCVUcpOwogCQkJaWYob3B0aW9uICE9IG51bGwpIEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKFRSVUUpIDsKIApAQCAtMTM3OSwxMSArMTY4NSwxNCBAQAogCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihaSVBfQUNDRVNTX0RFQlVHKTsKIAkJCWlmKG9wdGlvbiAhPSBudWxsKSBKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSA9IG9wdGlvbi5lcXVhbHNJZ25vcmVDYXNlKFRSVUUpIDsKLQkJCQorCiAJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihTT1VSQ0VfTUFQUEVSX0RFQlVHX1ZFUkJPU0UpOwogCQkJaWYob3B0aW9uICE9IG51bGwpIFNvdXJjZU1hcHBlci5WRVJCT1NFID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOworCisJCQlvcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihGT1JNQVRURVJfREVCVUcpOworCQkJaWYob3B0aW9uICE9IG51bGwpIERlZmF1bHRDb2RlRm9ybWF0dGVyLkRFQlVHID0gb3B0aW9uLmVxdWFsc0lnbm9yZUNhc2UoVFJVRSkgOwogCQl9Ci0JCQorCiAJCS8vIGNvbmZpZ3VyZSBwZXJmb3JtYW5jZSBvcHRpb25zCiAJCWlmKFBlcmZvcm1hbmNlU3RhdHMuRU5BQkxFRCkgewogCQkJQ29tcGxldGlvbkVuZ2luZS5QRVJGID0gUGVyZm9ybWFuY2VTdGF0cy5pc0VuYWJsZWQoQ09NUExFVElPTl9QRVJGKTsKQEAgLTEzOTQsMTEgKzE3MDMsMTEgQEAKIAkJCVJlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uLlBFUkYgPSBQZXJmb3JtYW5jZVN0YXRzLmlzRW5hYmxlZChSRUNPTkNJTEVfUEVSRik7CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybiBhIG5ldyBKYXZhIDYgYW5ub3RhdGlvbiBwcm9jZXNzb3IgbWFuYWdlci4gIFRoZSBtYW5hZ2VyIHdpbGwgbmVlZCB0bwogCSAqIGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkLiAgUmV0dXJucyBudWxsIGlmIGEgbWFuYWdlciBjYW5ub3QgYmUKLQkgKiBjcmVhdGVkLCBpZSBpZiB0aGUgY3VycmVudCBWTSBkb2VzIG5vdCBzdXBwb3J0IEphdmEgNiBhbm5vdGF0aW9uIHByb2Nlc3NpbmcuCisJICogY3JlYXRlZCwgaS5lLiBpZiB0aGUgY3VycmVudCBWTSBkb2VzIG5vdCBzdXBwb3J0IEphdmEgNiBhbm5vdGF0aW9uIHByb2Nlc3NpbmcuCiAJICovCiAJcHVibGljIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIgY3JlYXRlQW5ub3RhdGlvblByb2Nlc3Nvck1hbmFnZXIoKSB7CiAJCXN5bmNocm9uaXplZCh0aGlzKSB7CkBAIC0xNDIzLDcgKzE3MzIsNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQkKKwogCQlpZiAodGhpcy5hbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlckZhY3RvcnkgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KQEAgLTE0MzUsNyArMTc0NCw3IEBACiAJCQkJVXRpbC5sb2coZXhjZXB0aW9uLCAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgYW5ub3RhdGlvbiBwcm9jZXNzb3IgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlPYmplY3QgZXhlY3V0YWJsZUV4dGVuc2lvbiA9IGZhY3RvcnkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCQlPYmplY3QgZXhlY3V0YWJsZUV4dGVuc2lvbiA9IGZhY3RvcnkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWlmIChleGVjdXRhYmxlRXh0ZW5zaW9uIGluc3RhbmNlb2YgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlcikgewogCQkJCQlhcG1bMF0gPSAoQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlcikgZXhlY3V0YWJsZUV4dGVuc2lvbjsKIAkJCQl9CkBAIC0xNDQzLDcgKzE3NTIsNyBAQAogCQl9KTsKIAkJcmV0dXJuIGFwbVswXTsKIAl9Ci0JCisKIAkvKgogCSAqIERpc2NhcmRzIHRoZSBwZXIgd29ya2luZyBjb3B5IGluZm8gZm9yIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkgKG1ha2luZyBpdCBhIGNvbXBpbGF0aW9uIHVuaXQpCiAJICogaWYgaXRzIHVzZSBjb3VudCB3YXMgMS4gT3RoZXJ3aXNlLCBqdXN0IGRlY3JlbWVudCB0aGUgdXNlIGNvdW50LgpAQCAtMTQ1NSw3ICsxNzY0LDcgQEAKIAkgKiBSZXR1cm5zIHRoZSBuZXcgdXNlIGNvdW50IChvciAtMSBpZiBpdCBkaWRuJ3QgZXhpc3QpLgogCSAqLwogCXB1YmxpYyBpbnQgZGlzY2FyZFBlcldvcmtpbmdDb3B5SW5mbyhDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCQkvLyBjcmVhdGUgdGhlIGRlbHRhIGJ1aWxkZXIgKHRoaXMgcmVtZW1iZXJzIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIHdvcmtpbmcgY29weSkKIAkJLy8gb3V0c2lkZSB0aGUgcGVyV29ya2luZ0NvcHlJbmZvcyBsb2NrIChzZWUgYnVnIDUwNjY3KQogCQlKYXZhRWxlbWVudERlbHRhQnVpbGRlciBkZWx0YUJ1aWxkZXIgPSBudWxsOwpAQCAtMTQ2NywxMCArMTc3NiwxMCBAQAogCQkJV29ya2luZ0NvcHlPd25lciBvd25lciA9IHdvcmtpbmdDb3B5Lm93bmVyOwogCQkJTWFwIHdvcmtpbmdDb3B5VG9JbmZvcyA9IChNYXApdGhpcy5wZXJXb3JraW5nQ29weUluZm9zLmdldChvd25lcik7CiAJCQlpZiAod29ya2luZ0NvcHlUb0luZm9zID09IG51bGwpIHJldHVybiAtMTsKLQkJCQorCiAJCQlpbmZvID0gKFBlcldvcmtpbmdDb3B5SW5mbyl3b3JraW5nQ29weVRvSW5mb3MuZ2V0KHdvcmtpbmdDb3B5KTsKIAkJCWlmIChpbmZvID09IG51bGwpIHJldHVybiAtMTsKLQkJCQorCiAJCQlpZiAoLS1pbmZvLnVzZUNvdW50ID09IDApIHsKIAkJCQkvLyByZW1vdmUgcGVyIHdvcmtpbmcgY29weSBpbmZvCiAJCQkJd29ya2luZ0NvcHlUb0luZm9zLnJlbW92ZSh3b3JraW5nQ29weSk7CkBAIC0xNDk1LDcgKzE4MDQsNyBAQAogCQl9CiAJCXJldHVybiBpbmZvLnVzZUNvdW50OwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNhdmVQYXJ0aWNpcGFudAogCSAqLwpAQCAtMTUwNiw2MiArMTgxNSwxMjMgQEAKIAkvKioKIAkgKiBGbHVzaGVzIFppcEZpbGVzIGNhY2hlIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNsaWVudHMuCiAJICovCi0JcHVibGljIHZvaWQgZmx1c2haaXBGaWxlcygpIHsKLQkJVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlIYXNoTWFwIG1hcCA9IChIYXNoTWFwKXRoaXMuemlwRmlsZXMuZ2V0KCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkgcmV0dXJuOwotCQl0aGlzLnppcEZpbGVzLnNldChudWxsKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlaaXBGaWxlIHppcEZpbGUgPSAoWmlwRmlsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCIgKyBjdXJyZW50VGhyZWFkICsgIikgW0phdmFNb2RlbE1hbmFnZXIuZmx1c2haaXBGaWxlcygpXSBDbG9zaW5nIFppcEZpbGUgb24gIiAremlwRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbSBvY2N1cmVkIGNsb3NpbmcgemlwIGZpbGU6IGNhbm5vdCBkbyBtdWNoIG1vcmUKLQkJCX0KKwlwdWJsaWMgdm9pZCBmbHVzaFppcEZpbGVzKE9iamVjdCBvd25lcikgeworCQlaaXBDYWNoZSB6aXBDYWNoZSA9IChaaXBDYWNoZSl0aGlzLnppcEZpbGVzLmdldCgpOworCQlpZiAoemlwQ2FjaGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIHRoZSBvd25lciB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmbHVzaGluZyB0aGUgY2FjaGUKKwkJLy8gd2Ugd2FudCB0byBjaGVjayBvYmplY3QgaWRlbnRpdHkgdG8gbWFrZSBzdXJlIHRoaXMgaXMgdGhlIG93bmVyIHRoYXQgY3JlYXRlZCB0aGUgY2FjaGUKKwkJaWYgKHppcENhY2hlLm93bmVyID09IG93bmVyKSB7CisJCQl0aGlzLnppcEZpbGVzLnNldChudWxsKTsKKwkJCXppcENhY2hlLmZsdXNoKCk7CiAJCX0KIAl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBiYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucygpIHsKLQkJaWYgKHRoaXMuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMpIHsKLQkJCXRoaXMuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSBmYWxzZTsKKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIGZvcmNpbmcgYmF0Y2ggaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisJICogUmV0dXJucyBmYWxzZSBpZiBiYXRjaCBpbml0aWFsaXphdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGZvcmNlQmF0Y2hJbml0aWFsaXphdGlvbnMoYm9vbGVhbiBpbml0QWZ0ZXJMb2FkKSB7CisJCXN3aXRjaCAodGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucykgeworCQljYXNlIE5PX0JBVENIX0lOSVRJQUxJWkFUSU9OOgorCQkJdGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucyA9IE5FRURfQkFUQ0hfSU5JVElBTElaQVRJT047CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBCQVRDSF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRDoKKwkJCWlmIChpbml0QWZ0ZXJMb2FkKQorCQkJCXJldHVybiBmYWxzZTsgLy8gbm8gbmVlZCB0byBpbml0aWFsaXplIGFnYWluCisJCQl0aGlzLmJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zID0gTkVFRF9CQVRDSF9JTklUSUFMSVpBVElPTjsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKKwlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zKCkgeworCQlzd2l0Y2ggKHRoaXMuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMpIHsKKwkJY2FzZSBORUVEX0JBVENIX0lOSVRJQUxJWkFUSU9OOgorCQkJdGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9ucyA9IEJBVENIX0lOSVRJQUxJWkFUSU9OX0lOX1BST0dSRVNTOworCQkJcmV0dXJuIHRydWU7CisJCWNhc2UgQkFUQ0hfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1M6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBiYXRjaEluaXRpYWxpemF0aW9uRmluaXNoZWQoKSB7CisJCXRoaXMuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnMgPSBCQVRDSF9JTklUSUFMSVpBVElPTl9GSU5JU0hFRDsKKwl9CisKIAlwdWJsaWMgSUNsYXNzcGF0aENvbnRhaW5lciBnZXRDbGFzc3BhdGhDb250YWluZXIoZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCiAJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gY29udGFpbmVyR2V0KHByb2plY3QsIGNvbnRhaW5lclBhdGgpOwogCiAJCWlmIChjb250YWluZXIgPT0gbnVsbCkgewogCQkJaWYgKGJhdGNoQ29udGFpbmVySW5pdGlhbGl6YXRpb25zKCkpIHsKLQkJCQkvLyBhdm9pZCBkZWVwIHJlY3Vyc2lvbiB3aGlsZSBpbml0aWFsaXphaW5nIGNvbnRhaW5lciBvbiB3b3Jrc3BhY2UgcmVzdGFydAorCQkJCS8vIGF2b2lkIGRlZXAgcmVjdXJzaW9uIHdoaWxlIGluaXRpYWxpemluZyBjb250YWluZXIgb24gd29ya3NwYWNlIHJlc3RhcnQKIAkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDQzNykKLQkJCQljb250YWluZXIgPSBpbml0aWFsaXplQWxsQ29udGFpbmVycyhwcm9qZWN0LCBjb250YWluZXJQYXRoKTsKKwkJCQl0cnkgeworCQkJCQljb250YWluZXIgPSBpbml0aWFsaXplQWxsQ29udGFpbmVycyhwcm9qZWN0LCBjb250YWluZXJQYXRoKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQliYXRjaEluaXRpYWxpemF0aW9uRmluaXNoZWQoKTsKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWNvbnRhaW5lciA9IGluaXRpYWxpemVDb250YWluZXIocHJvamVjdCwgY29udGFpbmVyUGF0aCk7CisJCQkJY29udGFpbmVyQmVpbmdJbml0aWFsaXplZFJlbW92ZShwcm9qZWN0LCBjb250YWluZXJQYXRoKTsKKwkJCQlTZXRDb250YWluZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFNldENvbnRhaW5lck9wZXJhdGlvbihjb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10ge3Byb2plY3R9LCBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHtjb250YWluZXJ9KTsKKwkJCQlvcGVyYXRpb24ucnVuT3BlcmF0aW9uKG51bGwpOwogCQkJfQogCQl9Ci0JCXJldHVybiBjb250YWluZXI7CQkJCisJCXJldHVybiBjb250YWluZXI7CiAJfQogCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlZmVyZW5jZWRDbGFzc3BhdGhFbnRyaWVzKElDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5RW50cnksIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCQorCQlJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcyA9ICgoQ2xhc3NwYXRoRW50cnkpbGlicmFyeUVudHJ5KS5yZXNvbHZlZENoYWluZWRMaWJyYXJpZXMoKTsKKwkJCisJCWlmIChwcm9qZWN0ID09IG51bGwpCisJCQlyZXR1cm4gcmVmZXJlbmNlZEVudHJpZXM7CisJCQorCQlQZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IGdldFBlclByb2plY3RJbmZvKHByb2plY3QuZ2V0UHJvamVjdCgpLCBmYWxzZSk7CisJCWlmKHBlclByb2plY3RJbmZvID09IG51bGwpIAorCQkJcmV0dXJuIHJlZmVyZW5jZWRFbnRyaWVzOworCQkKKwkJTGlzdCBwYXRoVG9SZWZlcmVuY2VkRW50cmllcyA9IG5ldyBBcnJheUxpc3QocmVmZXJlbmNlZEVudHJpZXMubGVuZ3RoKTsKKwkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHJlZmVyZW5jZWRFbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgeworCisJCQlpZiAocGF0aFRvUmVmZXJlbmNlZEVudHJpZXMuY29udGFpbnMocmVmZXJlbmNlZEVudHJpZXNbaW5kZXhdLmdldFBhdGgoKSkpCisJCQkJY29udGludWU7CisKKwkJCUlDbGFzc3BhdGhFbnRyeSBwZXJzaXN0ZWRFbnRyeSA9IG51bGw7CisJCQlpZiAoKHBlcnNpc3RlZEVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSlwZXJQcm9qZWN0SW5mby5yb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzLmdldChyZWZlcmVuY2VkRW50cmllc1tpbmRleF0uZ2V0UGF0aCgpKSkgIT0gbnVsbCkgeworCQkJCS8vIFRPRE86IHJlY29uc2lkZXIgdGhpcyAtIG1heSB3YW50IHRvIGNvcHkgdGhlIHZhbHVlcyBpbnN0ZWFkIG9mIHJlZmVyZW5jZSBhc3NpZ25tZW50PworCQkJCXJlZmVyZW5jZWRFbnRyaWVzW2luZGV4XSA9IHBlcnNpc3RlZEVudHJ5OworCQkJfQorCQkJcGF0aFRvUmVmZXJlbmNlZEVudHJpZXMuYWRkKHJlZmVyZW5jZWRFbnRyaWVzW2luZGV4XS5nZXRQYXRoKCkpOworCQl9CisJCXJldHVybiByZWZlcmVuY2VkRW50cmllczsKKwl9CisJCiAJcHVibGljIERlbHRhUHJvY2Vzc29yIGdldERlbHRhUHJvY2Vzc29yKCkgewogCQlyZXR1cm4gdGhpcy5kZWx0YVN0YXRlLmdldERlbHRhUHJvY2Vzc29yKCk7CiAJfQotCQotCS8qKiAKKworCXB1YmxpYyBzdGF0aWMgRGVsdGFQcm9jZXNzaW5nU3RhdGUgZ2V0RGVsdGFTdGF0ZSgpIHsKKwkJcmV0dXJuIE1BTkFHRVIuZGVsdGFTdGF0ZTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZWxlbWVudHMgd2hpY2ggYXJlIG91dCBvZiBzeW5jaCB3aXRoIHRoZWlyIGJ1ZmZlcnMuCiAJICovCiAJcHJvdGVjdGVkIEhhc2hTZXQgZ2V0RWxlbWVudHNPdXRPZlN5bmNoV2l0aEJ1ZmZlcnMoKSB7CiAJCXJldHVybiB0aGlzLmVsZW1lbnRzT3V0T2ZTeW5jaFdpdGhCdWZmZXJzOwogCX0KIAotCXB1YmxpYyBJbmRleE1hbmFnZXIgZ2V0SW5kZXhNYW5hZ2VyKCkgewotCQlyZXR1cm4gdGhpcy5pbmRleE1hbmFnZXI7CisJcHVibGljIHN0YXRpYyBFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyIGdldEV4dGVybmFsTWFuYWdlcigpIHsKKwkJcmV0dXJuIE1BTkFHRVIuZXh0ZXJuYWxGb2xkZXJzTWFuYWdlcjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEluZGV4TWFuYWdlciBnZXRJbmRleE1hbmFnZXIoKSB7CisJCXJldHVybiBNQU5BR0VSLmluZGV4TWFuYWdlcjsKIAl9CiAKIAkvKioKQEAgLTE1NzksMTIgKzE5NDksNDAgQEAKIAl9CiAKIAkvKioKLQkgKiBHZXQgd29ya3BzYWNlIGVjbGlwc2UgcHJlZmVyZW5jZSBmb3IgSmF2YUNvcmUgcGx1Z2luLgorCSAqICBSZXR1cm5zIHRoZSBleGlzdGluZyBlbGVtZW50IGluIHRoZSBjYWNoZSB0aGF0IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUphdmFFbGVtZW50IGdldEV4aXN0aW5nRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZS5nZXRFeGlzdGluZ0VsZW1lbnQoZWxlbWVudCk7CisJfQorCisJcHVibGljIEhhc2hTZXQgZ2V0RXh0ZXJuYWxXb3JraW5nQ29weVByb2plY3RzKCkgeworCQlzeW5jaHJvbml6ZWQgKHRoaXMucGVyV29ya2luZ0NvcHlJbmZvcykgeworCQkJSGFzaFNldCByZXN1bHQgPSBudWxsOworCQkJSXRlcmF0b3IgdmFsdWVzID0gdGhpcy5wZXJXb3JraW5nQ29weUluZm9zLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgeworCQkJCU1hcCBvd25lckNvcGllcyA9IChNYXApIHZhbHVlcy5uZXh0KCk7CisJCQkJSXRlcmF0b3Igd29ya2luZ0NvcGllcyA9IG93bmVyQ29waWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKHdvcmtpbmdDb3BpZXMuaGFzTmV4dCgpKSB7CisJCQkJCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCkgd29ya2luZ0NvcGllcy5uZXh0KCk7CisJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gd29ya2luZ0NvcHkuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQkJaWYgKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoRXh0ZXJuYWxKYXZhUHJvamVjdC5FWFRFUk5BTF9QUk9KRUNUX05BTUUpKSB7CisJCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCQkJcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKKwkJCQkJCXJlc3VsdC5hZGQocHJvamVjdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJLyoqCisJICogR2V0IHdvcmtzcGFjZSBlY2xpcHNlIHByZWZlcmVuY2UgZm9yIEphdmFDb3JlIHBsdWctaW4uCiAJICovCiAJcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0SW5zdGFuY2VQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdOworCQlyZXR1cm4gdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0lOU1RBTkNFXTsKIAl9Ci0gCisKIAkvLyBJZiBtb2RpZmllZCwgYWxzbyBtb2RpZnkgdGhlIG1ldGhvZCBnZXREZWZhdWx0T3B0aW9uc05vSW5pdGlhbGl6YXRpb24oKQogCXB1YmxpYyBIYXNodGFibGUgZ2V0RGVmYXVsdE9wdGlvbnMoKXsKIApAQCAtMTU5Myw3ICsxOTkxLDcgQEAKIAkJLy8gc2VlIEphdmFDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSBmb3IgY2hhbmdpbmcgZGVmYXVsdCBzZXR0aW5ncwogCQkvLyBJZiBtb2RpZmllZCwgYWxzbyBtb2RpZnkgdGhlIG1ldGhvZCBnZXREZWZhdWx0T3B0aW9uc05vSW5pdGlhbGl6YXRpb24oKQogCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRQcmVmZXJlbmNlcyA9IGdldERlZmF1bHRQcmVmZXJlbmNlcygpOwotCQkKKwogCQkvLyBpbml0aWFsaXplIHByZWZlcmVuY2VzIHRvIHRoZWlyIGRlZmF1bHQKIAkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLm9wdGlvbk5hbWVzLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKQEAgLTE2MDUsMTUgKzIwMDMsMTUgQEAKIAkJZGVmYXVsdE9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIEphdmFDb3JlLmdldEVuY29kaW5nKCkpOwogCQkvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAJCWFkZERlcHJlY2F0ZWRPcHRpb25zKGRlZmF1bHRPcHRpb25zKTsKLQkJCisKIAkJcmV0dXJuIGRlZmF1bHRPcHRpb25zOwogCX0KLQkKKwogCS8qKgogCSAqIEdldCBkZWZhdWx0IGVjbGlwc2UgcHJlZmVyZW5jZSBmb3IgSmF2YUNvcmUgcGx1Z2luLgogCSAqLwogCXB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzTG9va3VwW1BSRUZfREVGQVVMVF07CisJCXJldHVybiB0aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfREVGQVVMVF07CiAJfQogCiAJLyoqCkBAIC0xNjQ3LDcgKzIwNDUsNyBAQAogCQkJaW5mby50cmllZFJlYWQgPSB0cnVlOwogCQkJdHJ5IHsKIAkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9yZWFkU3RhdGVQcm9ncmVzcywgcHJvamVjdC5nZXROYW1lKCkpKTsgCisJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX3JlYWRTdGF0ZVByb2dyZXNzLCBwcm9qZWN0LmdldE5hbWUoKSkpOwogCQkJCWluZm8uc2F2ZWRTdGF0ZSA9IHJlYWRTdGF0ZShwcm9qZWN0KTsKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CkBAIC0xNjU3LDcgKzIwNTUsNyBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uKFN0cmluZyBvcHRpb25OYW1lKSB7Ci0JCQorCiAJCWlmIChKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLmVxdWFscyhvcHRpb25OYW1lKSl7CiAJCQlyZXR1cm4gSmF2YUNvcmUuZ2V0RW5jb2RpbmcoKTsKIAkJfQpAQCAtMTY2NSw1NCArMjA2MywxNzIgQEAKIAkJaWYgKGlzRGVwcmVjYXRlZE9wdGlvbihvcHRpb25OYW1lKSkgewogCQkJcmV0dXJuIEphdmFDb3JlLkVSUk9SOwogCQl9Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBvcHRpb25OYW1lOwotCQlpZiAodGhpcy5vcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKXsKKwkJaW50IG9wdGlvbkxldmVsID0gZ2V0T3B0aW9uTGV2ZWwob3B0aW9uTmFtZSk7CisJCWlmIChvcHRpb25MZXZlbCAhPSBVTktOT1dOX09QVElPTil7CiAJCQlJUHJlZmVyZW5jZXNTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJCVN0cmluZyB2YWx1ZSA9ICBzZXJ2aWNlLmdldChvcHRpb25OYW1lLCBudWxsLCB0aGlzLnByZWZlcmVuY2VzTG9va3VwKTsKKwkJCVN0cmluZyB2YWx1ZSA9IHNlcnZpY2UuZ2V0KG9wdGlvbk5hbWUsIG51bGwsIHRoaXMucHJlZmVyZW5jZXNMb29rdXApOworCQkJaWYgKHZhbHVlID09IG51bGwgJiYgb3B0aW9uTGV2ZWwgPT0gREVQUkVDQVRFRF9PUFRJT04pIHsKKwkJCQkvLyBNYXkgYmUgYSBkZXByZWNhdGVkIG9wdGlvbiwgcmV0cmlldmUgdGhlIG5ldyB2YWx1ZSBpbiBjb21wYXRpYmxlIG9wdGlvbnMKKwkJCQlTdHJpbmdbXSBjb21wYXRpYmxlT3B0aW9ucyA9IChTdHJpbmdbXSkgdGhpcy5kZXByZWNhdGVkT3B0aW9ucy5nZXQob3B0aW9uTmFtZSk7CisJCQkJdmFsdWUgPSBzZXJ2aWNlLmdldChjb21wYXRpYmxlT3B0aW9uc1swXSwgbnVsbCwgdGhpcy5wcmVmZXJlbmNlc0xvb2t1cCk7CisJCQl9CiAJCQlyZXR1cm4gdmFsdWU9PW51bGwgPyBudWxsIDogdmFsdWUudHJpbSgpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBvcHRpb24gZm9yIHRoZSBnaXZlbiBFY2xpcHNlIHByZWZlcmVuY2VzLgorCSAqIElmIG5vIHZhbHVlIHdhcyBhbHJlYWR5IHNldCwgdGhlbiBpbmhlcml0cyBmcm9tIHRoZSBnbG9iYWwgb3B0aW9ucyBpZiBzcGVjaWZpZWQuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uCisJICogQHBhcmFtIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgVGVsbHMgd2hldGhlciB0aGUgdmFsdWUgY2FuIGJlIGluaGVyaXRlZCBmcm9tIGdsb2JhbCBKYXZhQ29yZSBvcHRpb25zCisJICogQHBhcmFtIHByb2plY3RQcmVmZXJlbmNlcyBUaGUgZWNsaXBzZSBwcmVmZXJlbmNlcyBmcm9tIHdoaWNoIHRvIGdldCB0aGUgdmFsdWUKKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zLCBJRWNsaXBzZVByZWZlcmVuY2VzIHByb2plY3RQcmVmZXJlbmNlcykgeworCQkvLyBSZXR1cm4gdGhlIG9wdGlvbiB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIGxldmVsCisJCXN3aXRjaCAoZ2V0T3B0aW9uTGV2ZWwob3B0aW9uTmFtZSkpIHsKKwkJCWNhc2UgVkFMSURfT1BUSU9OOgorCQkJCS8vIFZhbGlkIG9wdGlvbiwgcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCisJCQkJU3RyaW5nIGphdmFDb3JlRGVmYXVsdCA9IGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgPyBKYXZhQ29yZS5nZXRPcHRpb24ob3B0aW9uTmFtZSkgOiBudWxsOworCQkJCWlmIChwcm9qZWN0UHJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuIGphdmFDb3JlRGVmYXVsdDsKKwkJCQlTdHJpbmcgdmFsdWUgPSBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0KG9wdGlvbk5hbWUsIGphdmFDb3JlRGVmYXVsdCk7CisJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUudHJpbSgpOworCQkJY2FzZSBERVBSRUNBVEVEX09QVElPTjoKKwkJCQkvLyBSZXR1cm4gdGhlIGRlcHJlY2F0ZWQgb3B0aW9uIHZhbHVlIGlmIGl0IHdhcyBhbHJlYWR5IHNldAorCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHByb2plY3RQcmVmZXJlbmNlcy5nZXQob3B0aW9uTmFtZSwgbnVsbCk7CisJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG9sZFZhbHVlLnRyaW0oKTsKKwkJCQl9CisJCQkJLy8gR2V0IHRoZSBuZXcgY29tcGF0aWJsZSB2YWx1ZQorCQkJCVN0cmluZ1tdIGNvbXBhdGlibGVPcHRpb25zID0gKFN0cmluZ1tdKSB0aGlzLmRlcHJlY2F0ZWRPcHRpb25zLmdldChvcHRpb25OYW1lKTsKKwkJCQlTdHJpbmcgbmV3RGVmYXVsdCA9IGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgPyBKYXZhQ29yZS5nZXRPcHRpb24oY29tcGF0aWJsZU9wdGlvbnNbMF0pIDogbnVsbDsKKwkJCQlTdHJpbmcgbmV3VmFsdWUgPSBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0KGNvbXBhdGlibGVPcHRpb25zWzBdLCBuZXdEZWZhdWx0KTsKKwkJCQlyZXR1cm4gbmV3VmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXdWYWx1ZS50cmltKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIGFuIG9wdGlvbiBuYW1lIGlzIGtub3duIG9yIG5vdC4KKwkgKiAKKwkgKiBAcGFyYW0gb3B0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBvcHRpb24gbmFtZSBpcyBlaXRoZXIKKwkgKiB7QGxpbmsgI1ZBTElEX09QVElPTiB2YWxpZH0gb3Ige0BsaW5rICNERVBSRUNBVEVEX09QVElPTiBkZXByZWNhdGVkfSwKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGtub3dzT3B0aW9uKFN0cmluZyBvcHRpb25OYW1lKSB7CisJCWJvb2xlYW4ga25vd25PcHRpb24gPSB0aGlzLm9wdGlvbk5hbWVzLmNvbnRhaW5zKG9wdGlvbk5hbWUpOworCQlpZiAoIWtub3duT3B0aW9uKSB7CisJCQlrbm93bk9wdGlvbiA9IHRoaXMuZGVwcmVjYXRlZE9wdGlvbnMuZ2V0KG9wdGlvbk5hbWUpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIGtub3duT3B0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxldmVsIG9mIHRoZSBnaXZlbiBvcHRpb24uCisJICogCisJICogQHBhcmFtIG9wdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIG9wdGlvbgorCSAqIEByZXR1cm4gVGhlIGxldmVsIG9mIHRoZSBvcHRpb24gYXMgYW4gaW50IHdoaWNoIG1heSBoYXZlIHRoZSBmb2xsb3dpbmcKKwkgKiB2YWx1ZXM6CisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1VOS05PV05fT1BUSU9OfTogdGhlIGdpdmVuIG9wdGlvbiBpcyB1bmtub3duPC9saT4KKwkgKiA8bGk+e0BsaW5rICNERVBSRUNBVEVEX09QVElPTn06IHRoZSBnaXZlbiBvcHRpb24gaXMgZGVwcmVjYXRlZDwvbGk+CisJICogPGxpPntAbGluayAjVkFMSURfT1BUSU9OfTogdGhlIGdpdmVuIG9wdGlvbiBpcyB2YWxpZDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE9wdGlvbkxldmVsKFN0cmluZyBvcHRpb25OYW1lKSB7CisJCWlmICh0aGlzLm9wdGlvbk5hbWVzLmNvbnRhaW5zKG9wdGlvbk5hbWUpKSB7CisJCQlyZXR1cm4gVkFMSURfT1BUSU9OOworCQl9CisJCWlmICh0aGlzLmRlcHJlY2F0ZWRPcHRpb25zLmdldChvcHRpb25OYW1lKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gREVQUkVDQVRFRF9PUFRJT047CisJCX0KKwkJcmV0dXJuIFVOS05PV05fT1BUSU9OOworCX0KKwogCXB1YmxpYyBIYXNodGFibGUgZ2V0T3B0aW9ucygpIHsKIAogCQkvLyByZXR1cm4gY2FjaGVkIG9wdGlvbnMgaWYgYWxyZWFkeSBjb21wdXRlZAotCQlpZiAodGhpcy5vcHRpb25zQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIG5ldyBIYXNodGFibGUodGhpcy5vcHRpb25zQ2FjaGUpOwotCisJCUhhc2h0YWJsZSBjYWNoZWRPcHRpb25zOyAvLyB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTYzMjkgKQorCQlpZiAoKGNhY2hlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDYWNoZSkgIT0gbnVsbCkgeworCQkJaWYgKERFQlVHXzMwMjg1MCkgY2hlY2tUYXNrVGFncygiUmV0cmlldmluZyBvcHRpb25zIGZyb20gb3B0aW9uc0NhY2hlIiwgdGhpcy5vcHRpb25zQ2FjaGUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbmV3IEhhc2h0YWJsZShjYWNoZWRPcHRpb25zKTsKKwkJfQorCQlpZiAoREVCVUdfMzAyODUwKSBTeXN0ZW0ub3V0LnByaW50bG4oIm9wdGlvbnNDYWNoZSB3YXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCWlmICghUGxhdGZvcm0uaXNSdW5uaW5nKCkpIHsKLQkJCXJldHVybiB0aGlzLm9wdGlvbnNDYWNoZSA9IGdldERlZmF1bHRPcHRpb25zTm9Jbml0aWFsaXphdGlvbigpOworCQkJdGhpcy5vcHRpb25zQ2FjaGUgPSBnZXREZWZhdWx0T3B0aW9uc05vSW5pdGlhbGl6YXRpb24oKTsKKwkJCWlmIChERUJVR18zMDI4NTApIGNoZWNrVGFza1RhZ3MoIlBsYXRmb3JtIGlzIG5vdCBydW5uaW5nIiwgdGhpcy5vcHRpb25zQ2FjaGUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gbmV3IEhhc2h0YWJsZSh0aGlzLm9wdGlvbnNDYWNoZSk7CiAJCX0KIAkJLy8gaW5pdAogCQlIYXNodGFibGUgb3B0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOwogCQlJUHJlZmVyZW5jZXNTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKIAogCQkvLyBzZXQgb3B0aW9ucyB1c2luZyBwcmVmZXJlbmNlcyBzZXJ2aWNlIGxvb2t1cAotCQlJdGVyYXRvciBpdGVyYXRvciA9IG9wdGlvbk5hbWVzLml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5vcHRpb25OYW1lcy5pdGVyYXRvcigpOwogCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCSAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBzZXJ2aWNlLmdldChwcm9wZXJ0eU5hbWUsIG51bGwsIHRoaXMucHJlZmVyZW5jZXNMb29rdXApOwotCQkgICAgaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotCQkJICAgIG9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCSAgICB9CisJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBzZXJ2aWNlLmdldChwcm9wZXJ0eU5hbWUsIG51bGwsIHRoaXMucHJlZmVyZW5jZXNMb29rdXApOworCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgeworCQkJCW9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CisJCQl9CisJCX0KKwkJaWYgKERFQlVHXzMwMjg1MCkgY2hlY2tUYXNrVGFncygiT3B0aW9ucyBpbml0aWFsaXplZCBmcm9tIHByZWZlcmVuY2VzIiwgb3B0aW9ucyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBzZXQgZGVwcmVjYXRlZCBvcHRpb25zIHVzaW5nIHByZWZlcmVuY2VzIHNlcnZpY2UgbG9va3VwCisJCUl0ZXJhdG9yIGRlcHJlY2F0ZWRFbnRyaWVzID0gdGhpcy5kZXByZWNhdGVkT3B0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChkZXByZWNhdGVkRW50cmllcy5oYXNOZXh0KCkpIHsKKwkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBkZXByZWNhdGVkRW50cmllcy5uZXh0KCk7CisJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHNlcnZpY2UuZ2V0KHByb3BlcnR5TmFtZSwgbnVsbCwgdGhpcy5wcmVmZXJlbmNlc0xvb2t1cCk7CisJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7CisJCQkJb3B0aW9ucy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKwkJCQlTdHJpbmdbXSBjb21wYXRpYmxlT3B0aW9ucyA9IChTdHJpbmdbXSkgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlmb3IgKGludCBjbz0wLCBsZW5ndGg9Y29tcGF0aWJsZU9wdGlvbnMubGVuZ3RoOyBjbyA8IGxlbmd0aDsgY28rKykgeworCQkJCQlTdHJpbmcgY29tcGF0aWJsZU9wdGlvbiA9IGNvbXBhdGlibGVPcHRpb25zW2NvXTsKKwkJCQkJaWYgKCFvcHRpb25zLmNvbnRhaW5zS2V5KGNvbXBhdGlibGVPcHRpb24pKQorCQkJCQkJb3B0aW9ucy5wdXQoY29tcGF0aWJsZU9wdGlvbiwgcHJvcGVydHlWYWx1ZSk7CisJCQkJfQorCQkJfQogCQl9CiAKIAkJLy8gZ2V0IGVuY29kaW5nIHRocm91Z2ggcmVzb3VyY2UgcGx1Z2luCi0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIEphdmFDb3JlLmdldEVuY29kaW5nKCkpOyAKKwkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09SRV9FTkNPRElORywgSmF2YUNvcmUuZ2V0RW5jb2RpbmcoKSk7CiAKIAkJLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eQogCQlhZGREZXByZWNhdGVkT3B0aW9ucyhvcHRpb25zKTsKIAorCQlVdGlsLmZpeFRhc2tUYWdzKG9wdGlvbnMpOworCQlpZiAoREVCVUdfMzAyODUwKSBjaGVja1Rhc2tUYWdzKCJSZXRyaWV2ZWQgb3B0aW9ucyBmcm9tIHByZWZlcmVuY2VzIiwgb3B0aW9ucyk7IC8vJE5PTi1OTFMtMSQKIAkJLy8gc3RvcmUgYnVpbHQgbWFwIGluIGNhY2hlCiAJCXRoaXMub3B0aW9uc0NhY2hlID0gbmV3IEhhc2h0YWJsZShvcHRpb25zKTsKKwkJaWYgKERFQlVHXzMwMjg1MCkgY2hlY2tUYXNrVGFncygiU3RvcmVkIG9wdGlvbnNDYWNoZSIsIHRoaXMub3B0aW9uc0NhY2hlKTsgLy8kTk9OLU5MUy0xJAogCiAJCS8vIHJldHVybiBidWlsdCBtYXAKIAkJcmV0dXJuIG9wdGlvbnM7CiAJfQogCisJLy8gZGVidWdnaW5nIGJ1ZyAzMDI4NTA6CisJcHJpdmF0ZSB2b2lkIGNoZWNrVGFza1RhZ3MoU3RyaW5nIG1zZywgSGFzaHRhYmxlIHNvbWVPcHRpb25zKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQlPYmplY3QgdGFza1RhZ3MgPSBzb21lT3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCIJKyBUYXNrIHRhZ3M6ICAgICAgICAgICAiICsgdGFza1RhZ3MpOyAvLyROT04tTkxTLTEkCisJCWlmICh0YXNrVGFncyA9PSBudWxsIHx8ICIiLmVxdWFscyh0YXNrVGFncykpIHsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCIJLSBvcHRpb24gbmFtZXM6ICIrdGhpcy5vcHRpb25OYW1lcyk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiCS0gQ2FsbCBzdGFjazoiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7CisJCQlmb3IgKGludCBpPTAsbj1lbGVtZW50cy5sZW5ndGg7IGk8bjsgaSsrKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIJCSsgIitlbGVtZW50c1tpXSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKwogCS8vIERvIG5vdCBtb2RpZnkgd2l0aG91dCBtb2RpZnlpbmcgZ2V0RGVmYXVsdE9wdGlvbnMoKQogCXByaXZhdGUgSGFzaHRhYmxlIGdldERlZmF1bHRPcHRpb25zTm9Jbml0aWFsaXphdGlvbigpIHsKIAkJTWFwIGRlZmF1bHRPcHRpb25zTWFwID0gbmV3IENvbXBpbGVyT3B0aW9ucygpLmdldE1hcCgpOyAvLyBjb21waWxlciBkZWZhdWx0cwotCQkKKwogCQkvLyBPdmVycmlkZSBzb21lIGNvbXBpbGVyIGRlZmF1bHRzCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9MT0NBTF9WQVJJQUJMRV9BVFRSLCBKYXZhQ29yZS5HRU5FUkFURSk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCwgSmF2YUNvcmUuUFJFU0VSVkUpOwpAQCAtMTcyMSwyMCArMjIzNywyMSBAQAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19DQVNFX1NFTlNJVElWRSwgSmF2YUNvcmUuRU5BQkxFRCk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9ET0NfQ09NTUVOVF9TVVBQT1JULCBKYXZhQ29yZS5FTkFCTEVEKTsKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0ZPUkJJRERFTl9SRUZFUkVOQ0UsIEphdmFDb3JlLkVSUk9SKTsKLQkJCisKIAkJLy8gQnVpbGRlciBzZXR0aW5ncwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCwgSmF2YUNvcmUuQUJPUlQpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIEphdmFDb3JlLldBUk5JTkcpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCBKYXZhQ29yZS5DTEVBTik7IAorCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRILCBKYXZhQ29yZS5BQk9SVCk7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfRFVQTElDQVRFX1JFU09VUkNFLCBKYXZhQ29yZS5XQVJOSU5HKTsKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCBKYXZhQ29yZS5DTEVBTik7CiAKIAkJLy8gSmF2YUNvcmUgc2V0dGluZ3MKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9PUkRFUiwgSmF2YUNvcmUuSUdOT1JFKTsgCi0JCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCBKYXZhQ29yZS5FUlJPUik7IAotCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIEphdmFDb3JlLkVSUk9SKTsgCisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfT1JERVIsIEphdmFDb3JlLklHTk9SRSk7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCBKYXZhQ29yZS5FUlJPUik7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCwgSmF2YUNvcmUuRVJST1IpOwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMLCBKYXZhQ29yZS5JR05PUkUpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMsIEphdmFDb3JlLkVOQUJMRUQpOyAKLQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TLCBKYXZhQ29yZS5FTkFCTEVEKTsgCisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSwgSmF2YUNvcmUuV0FSTklORyk7CisJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TLCBKYXZhQ29yZS5FTkFCTEVEKTsKKwkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TLCBKYXZhQ29yZS5FTkFCTEVEKTsKIAogCQkvLyBGb3JtYXR0ZXIgc2V0dGluZ3MKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0QWxsKERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLmdldEVjbGlwc2VEZWZhdWx0U2V0dGluZ3MoKSk7CkBAIC0xNzQ1LDIzICsyMjYyLDI1IEBACiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0lNUExJQ0lUX1FVQUxJRklDQVRJT04sIEphdmFDb3JlLkRJU0FCTEVEKTsKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfUFJFRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklOQUxfRklFTERfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRk9SQklEREVOX1JFRkVSRU5DRV9DSEVDSywgSmF2YUNvcmUuRU5BQkxFRCk7CiAJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0RJU0NPVVJBR0VEX1JFRkVSRU5DRV9DSEVDSywgSmF2YUNvcmUuRElTQUJMRUQpOwogCQlkZWZhdWx0T3B0aW9uc01hcC5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9DQU1FTF9DQVNFX01BVENILCBKYXZhQ29yZS5FTkFCTEVEKTsKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfU1VHR0VTVF9TVEFUSUNfSU1QT1JUUywgSmF2YUNvcmUuRU5BQkxFRCk7Ci0JCQorCiAJCS8vIFRpbWUgb3V0IGZvciBwYXJhbWV0ZXIgbmFtZXMKIAkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLlRJTUVPVVRfRk9SX1BBUkFNRVRFUl9OQU1FX0ZST01fQVRUQUNIRURfSkFWQURPQywgIjUwIik7IC8vJE5PTi1OTFMtMSQKLQkJCisKIAkJcmV0dXJuIG5ldyBIYXNodGFibGUoZGVmYXVsdE9wdGlvbnNNYXApOwogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB0aGUgcGVyLXByb2plY3QgaW5mbyBmb3IgdGhlIGdpdmVuIHByb2plY3QuIElmIHNwZWNpZmllZCwgY3JlYXRlIHRoZSBpbmZvIGlmIHRoZSBpbmZvIGRvZXNuJ3QgZXhpc3QuCiAJICovCkBAIC0xNzc0LDggKzIyOTMsOCBAQAogCQkJfQogCQkJcmV0dXJuIGluZm87CiAJCX0KLQl9CQotCQorCX0KKwogCS8qCiAJICogUmV0dXJucyAgdGhlIHBlci1wcm9qZWN0IGluZm8gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgogCSAqIElmIHRoZSBpbmZvIGRvZXNuJ3QgZXhpc3QsIGNoZWNrIGZvciB0aGUgcHJvamVjdCBleGlzdGVuY2UgYW5kIGNyZWF0ZSB0aGUgaW5mby4KQEAgLTE3OTEsNyArMjMxMCw3IEBACiAJCX0KIAkJcmV0dXJuIGluZm87CiAJfQotCQorCiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBwZXItd29ya2luZyBjb3B5IGluZm8gZm9yIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkgYXQgdGhlIGdpdmVuIHBhdGguCiAJICogSWYgaXQgZG9lc24ndCBleGlzdCBhbmQgaWYgY3JlYXRlLCBhZGQgYSBuZXcgcGVyLXdvcmtpbmcgY29weSBpbmZvIHdpdGggdGhlIGdpdmVuIHByb2JsZW0gcmVxdWVzdG9yLgpAQCAtMTgxNSw3ICsyMzM0LDcgQEAKIAkJCWlmIChpbmZvICE9IG51bGwgJiYgcmVjb3JkVXNhZ2UpIGluZm8udXNlQ291bnQrKzsKIAkJCXJldHVybiBpbmZvOwogCQl9Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGEgcGVyc2lzdGVkIGNvbnRhaW5lciBmcm9tIHByZXZpb3VzIHNlc3Npb24gaWYgYW55LiBOb3RlIHRoYXQgaXQgaXMgbm90IHRoZSBvcmlnaW5hbCBjb250YWluZXIgZnJvbSBwcmV2aW91cwpAQCAtMTgzNyw3ICsyMzU2LDcgQEAKIAogCXByaXZhdGUgdm9pZCB2ZXJib3NlX3JlZW50ZXJpbmdfcHJvamVjdF9jb250YWluZXJfYWNjZXNzKAlJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBwcmV2aW91c0NvbnRhaW5lcikgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJDUENvbnRhaW5lciBJTklUIC0gcmVlbnRlcmluZyBhY2Nlc3MgdG8gcHJvamVjdCBjb250YWluZXIgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiwgd2lsbCBzZWUgcHJldmlvdXMgdmFsdWVcbiIpOyAvLyROT04tTkxTLTEkIAorCQlidWZmZXIuYXBwZW5kKCJDUENvbnRhaW5lciBJTklUIC0gcmVlbnRlcmluZyBhY2Nlc3MgdG8gcHJvamVjdCBjb250YWluZXIgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiwgd2lsbCBzZWUgcHJldmlvdXMgdmFsdWVcbiIpOyAvLyROT04tTkxTLTEkCiAJCWJ1ZmZlci5hcHBlbmQoIglwcm9qZWN0OiAiICsgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKIAkJYnVmZmVyLmFwcGVuZCgiCWNvbnRhaW5lciBwYXRoOiAiICsgY29udGFpbmVyUGF0aCArICdcbicpOyAvLyROT04tTkxTLTEkCiAJCWJ1ZmZlci5hcHBlbmQoIglwcmV2aW91cyB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKQEAgLTE4NDcsMTUgKzIzNjYsMTUgQEAKIAkJaWYgKGVudHJpZXMgIT0gbnVsbCl7CiAJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspewogCQkJCWJ1ZmZlci5hcHBlbmQoIiAJCSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChlbnRyaWVzW2pdKTsgCi0JCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsgCisJCQkJYnVmZmVyLmFwcGVuZChlbnRyaWVzW2pdKTsKKwkJCQlidWZmZXIuYXBwZW5kKCdcbicpOwogCQkJfQogCQl9CiAJCWJ1ZmZlci5hcHBlbmQoIiAJfSIpOyAvLyROT04tTkxTLTEkCiAJCVV0aWwudmVyYm9zZShidWZmZXIudG9TdHJpbmcoKSk7CiAJCW5ldyBFeGNlcHRpb24oIjxGYWtlIGV4Y2VwdGlvbj4iKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgcGVyc2lzdGVkIGNvbnRhaW5lciBmcm9tIHByZXZpb3VzIHNlc3Npb24gaWYgYW55CiAJICovCkBAIC0xODg5LDcgKzI0MDgsNyBAQAogCQl9CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJcHJpdmF0ZSBGaWxlIGdldFZhcmlhYmxlQW5kQ29udGFpbmVyc0ZpbGUoKSB7CiAJCXJldHVybiBKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJ2YXJpYWJsZXNBbmRDb250YWluZXJzLmRhdCIpLnRvRmlsZSgpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTg5OCw3ICsyNDE3LDcgQEAKICAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGVzIGZvciB3aGljaCBhbiBDUCB2YXJpYWJsZSBpbml0aWFsaXplciBpcyByZWdpc3RlcmVkIHRocm91Z2ggYW4gZXh0ZW5zaW9uIHBvaW50CiAgCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UmVnaXN0ZXJlZFZhcmlhYmxlTmFtZXMoKXsKLQkJCisKIAkJUGx1Z2luIGpkdENvcmVQbHVnaW4gPSBKYXZhQ29yZS5nZXRQbHVnaW4oKTsKIAkJaWYgKGpkdENvcmVQbHVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKQEAgLTE5MTIsMTggKzI0MzEsMTggQEAKIAkJCQkJU3RyaW5nIHZhckF0dHJpYnV0ZSA9IGNvbmZpZ0VsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZSgidmFyaWFibGUiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlpZiAodmFyQXR0cmlidXRlICE9IG51bGwpIHZhcmlhYmxlTGlzdC5hZGQodmFyQXR0cmlidXRlKTsKIAkJCQl9Ci0JCQl9CQorCQkJfQogCQl9CiAJCVN0cmluZ1tdIHZhcmlhYmxlTmFtZXMgPSBuZXcgU3RyaW5nW3ZhcmlhYmxlTGlzdC5zaXplKCldOwogCQl2YXJpYWJsZUxpc3QudG9BcnJheSh2YXJpYWJsZU5hbWVzKTsKIAkJcmV0dXJuIHZhcmlhYmxlTmFtZXM7Ci0JfQkKKwl9CiAKIAkvKioKICAJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIElEcyBmb3Igd2hpY2ggYW4gQ1AgY29udGFpbmVyIGluaXRpYWxpemVyIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaCBhbiBleHRlbnNpb24gcG9pbnQKICAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRSZWdpc3RlcmVkQ29udGFpbmVySURzKCl7Ci0JCQorCiAJCVBsdWdpbiBqZHRDb3JlUGx1Z2luID0gSmF2YUNvcmUuZ2V0UGx1Z2luKCk7CiAJCWlmIChqZHRDb3JlUGx1Z2luID09IG51bGwpIHJldHVybiBudWxsOwogCkBAIC0xOTM3LDEyICsyNDU2LDEwOCBAQAogCQkJCQlTdHJpbmcgaWRBdHRyaWJ1dGUgPSBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaWYgKGlkQXR0cmlidXRlICE9IG51bGwpIGNvbnRhaW5lcklETGlzdC5hZGQoaWRBdHRyaWJ1dGUpOwogCQkJCX0KLQkJCX0JCisJCQl9CiAJCX0KIAkJU3RyaW5nW10gY29udGFpbmVySURzID0gbmV3IFN0cmluZ1tjb250YWluZXJJRExpc3Quc2l6ZSgpXTsKIAkJY29udGFpbmVySURMaXN0LnRvQXJyYXkoY29udGFpbmVySURzKTsKIAkJcmV0dXJuIGNvbnRhaW5lcklEczsKLQl9CQorCX0KKworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZVZhcmlhYmxlRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIHVzZVByZXZpb3VzU2Vzc2lvbikgeworCisJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKQorCQkJcmV0dXJuIGVudHJ5OworCisJCUlQYXRoIHJlc29sdmVkUGF0aCA9IGdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFBhdGgoKSwgdXNlUHJldmlvdXNTZXNzaW9uKTsKKwkJaWYgKHJlc29sdmVkUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCS8vIEJ5IHBhc3NpbmcgYSBudWxsIHJlZmVyZW5jZSBwYXRoLCB3ZSBrZWVwIGl0IHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290LgorCQlyZXNvbHZlZFBhdGggPSBDbGFzc3BhdGhFbnRyeS5yZXNvbHZlRG90RG90KG51bGwsIHJlc29sdmVkUGF0aCk7CisKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocmVzb2x2ZWRQYXRoLCBmYWxzZSk7CisJCWlmICh0YXJnZXQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCS8vIGluc2lkZSB0aGUgd29ya3NwYWNlCisJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCUlSZXNvdXJjZSByZXNvbHZlZFJlc291cmNlID0gKElSZXNvdXJjZSkgdGFyZ2V0OworCQkJc3dpdGNoIChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSkgeworCisJCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6CisJCQkJCS8vIGludGVybmFsIHByb2plY3QKKwkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeSgKKwkJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQkJZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwKKwkJCQkJCQllbnRyeS5jb21iaW5lQWNjZXNzUnVsZXMoKSwKKwkJCQkJCQllbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwKKwkJCQkJCQllbnRyeS5pc0V4cG9ydGVkKCkpOworCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkvLyBpbnRlcm5hbCBiaW5hcnkgYXJjaGl2ZQorCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KAorCQkJCQkJCXJlc29sdmVkUGF0aCwKKwkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB1c2VQcmV2aW91c1Nlc3Npb24pLAorCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLCB1c2VQcmV2aW91c1Nlc3Npb24pLAorCQkJCQkJCWVudHJ5LmdldEFjY2Vzc1J1bGVzKCksCisJCQkJCQkJZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksCisJCQkJCQkJZW50cnkuaXNFeHBvcnRlZCgpKTsKKwkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQkvLyBpbnRlcm5hbCBiaW5hcnkgZm9sZGVyCisJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCisJCQkJCQkJcmVzb2x2ZWRQYXRoLAorCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIHVzZVByZXZpb3VzU2Vzc2lvbiksCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIHVzZVByZXZpb3VzU2Vzc2lvbiksCisJCQkJCQkJZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwKKwkJCQkJCQllbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwKKwkJCQkJCQllbnRyeS5pc0V4cG9ydGVkKCkpOworCQkJfQorCQl9CisJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7CisJCQlGaWxlIGV4dGVybmFsRmlsZSA9IEphdmFNb2RlbC5nZXRGaWxlKHRhcmdldCk7CisJCQlpZiAoZXh0ZXJuYWxGaWxlICE9IG51bGwpIHsKKwkJCQkvLyBleHRlcm5hbCBiaW5hcnkgYXJjaGl2ZQorCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCisJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB1c2VQcmV2aW91c1Nlc3Npb24pLAorCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIHVzZVByZXZpb3VzU2Vzc2lvbiksCisJCQkJCQllbnRyeS5nZXRBY2Nlc3NSdWxlcygpLAorCQkJCQkJZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCksCisJCQkJCQllbnRyeS5pc0V4cG9ydGVkKCkpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBub24tZXhpc3RpbmcgZmlsZQorCQkJCWlmIChyZXNvbHZlZFBhdGguaXNBYnNvbHV0ZSgpKXsKKwkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKKwkJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgdXNlUHJldmlvdXNTZXNzaW9uKSwKKwkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwgdXNlUHJldmlvdXNTZXNzaW9uKSwKKwkJCQkJCQllbnRyeS5nZXRBY2Nlc3NSdWxlcygpLAorCQkJCQkJCWVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpLAorCQkJCQkJCWVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJUGF0aCBnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChJUGF0aCB2YXJpYWJsZVBhdGgsIGJvb2xlYW4gdXNlUHJldmlvdXNTZXNzaW9uKSB7CisKKwkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWludCBjb3VudCA9IHZhcmlhYmxlUGF0aC5zZWdtZW50Q291bnQoKTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBsb29rdXAgdmFyaWFibGUKKwkJU3RyaW5nIHZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlUGF0aC5zZWdtZW50KDApOworCQlJUGF0aCByZXNvbHZlZFBhdGggPSB1c2VQcmV2aW91c1Nlc3Npb24gPyBnZXRQcmV2aW91c1Nlc3Npb25WYXJpYWJsZSh2YXJpYWJsZU5hbWUpIDogSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lKTsKKwkJaWYgKHJlc29sdmVkUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gYXBwZW5kIHBhdGggc3VmZml4CisJCWlmIChjb3VudCA+IDEpIHsKKwkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkUGF0aC5hcHBlbmQodmFyaWFibGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOworCQl9CisJCXJldHVybiByZXNvbHZlZFBhdGg7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgRmlsZSB0byB1c2UgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBsYXN0IGJ1aWx0IHN0YXRlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KQEAgLTE5NTIsMjEgKzI1NjcsMTkgQEAKIAkJSVBhdGggd29ya2luZ0xvY2F0aW9uID0gcHJvamVjdC5nZXRXb3JraW5nTG9jYXRpb24oSmF2YUNvcmUuUExVR0lOX0lEKTsKIAkJcmV0dXJuIHdvcmtpbmdMb2NhdGlvbi5hcHBlbmQoInN0YXRlLmRhdCIpLnRvRmlsZSgpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBVc2VyTGlicmFyeU1hbmFnZXIgZ2V0VXNlckxpYnJhcnlNYW5hZ2VyKCkgewotCQlKYXZhTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1vZGVsTWFuYWdlci51c2VyTGlicmFyeU1hbmFnZXIgPT0gbnVsbCkgeworCQlpZiAoTUFOQUdFUi51c2VyTGlicmFyeU1hbmFnZXIgPT0gbnVsbCkgewogCQkJVXNlckxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyID0gbmV3IFVzZXJMaWJyYXJ5TWFuYWdlcigpOwotCQkJc3luY2hyb25pemVkKG1vZGVsTWFuYWdlcikgewotCQkJCWlmIChtb2RlbE1hbmFnZXIudXNlckxpYnJhcnlNYW5hZ2VyID09IG51bGwpIHsgLy8gZW5zdXJlIGFub3RoZXIgbGlicmFyeSBtYW5hZ2VyIHdhcyBub3Qgc2V0IHdoaWxlIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBhYm92ZQotCQkJCQltb2RlbE1hbmFnZXIudXNlckxpYnJhcnlNYW5hZ2VyID0gbGlicmFyeU1hbmFnZXI7Ci0JCQkJCW1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZVByZWZlcmVuY2VzKCkuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKGxpYnJhcnlNYW5hZ2VyKTsKKwkJCXN5bmNocm9uaXplZChNQU5BR0VSKSB7CisJCQkJaWYgKE1BTkFHRVIudXNlckxpYnJhcnlNYW5hZ2VyID09IG51bGwpIHsgLy8gZW5zdXJlIGFub3RoZXIgbGlicmFyeSBtYW5hZ2VyIHdhcyBub3Qgc2V0IHdoaWxlIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBhYm92ZQorCQkJCQlNQU5BR0VSLnVzZXJMaWJyYXJ5TWFuYWdlciA9IGxpYnJhcnlNYW5hZ2VyOwogCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyLnVzZXJMaWJyYXJ5TWFuYWdlcjsKKwkJcmV0dXJuIE1BTkFHRVIudXNlckxpYnJhcnlNYW5hZ2VyOwogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyBhbGwgdGhlIHdvcmtpbmcgY29waWVzIHdoaWNoIGhhdmUgdGhlIGdpdmVuIG93bmVyLgogCSAqIEFkZHMgdGhlIHdvcmtpbmcgY29waWVzIG9mIHRoZSBwcmltYXJ5IG93bmVyIGlmIHNwZWNpZmllZC4KQEAgLTE5NzQsOCArMjU4Nyw4IEBACiAJICovCiAJcHVibGljIElDb21waWxhdGlvblVuaXRbXSBnZXRXb3JraW5nQ29waWVzKFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIGJvb2xlYW4gYWRkUHJpbWFyeSkgewogCQlzeW5jaHJvbml6ZWQodGhpcy5wZXJXb3JraW5nQ29weUluZm9zKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0W10gcHJpbWFyeVdDcyA9IGFkZFByaW1hcnkgJiYgb3duZXIgIT0gRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSAKLQkJCQk/IGdldFdvcmtpbmdDb3BpZXMoRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSwgZmFsc2UpIAorCQkJSUNvbXBpbGF0aW9uVW5pdFtdIHByaW1hcnlXQ3MgPSBhZGRQcmltYXJ5ICYmIG93bmVyICE9IERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkKKwkJCQk/IGdldFdvcmtpbmdDb3BpZXMoRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSwgZmFsc2UpCiAJCQkJOiBudWxsOwogCQkJTWFwIHdvcmtpbmdDb3B5VG9JbmZvcyA9IChNYXApdGhpcy5wZXJXb3JraW5nQ29weUluZm9zLmdldChvd25lcik7CiAJCQlpZiAod29ya2luZ0NvcHlUb0luZm9zID09IG51bGwpIHJldHVybiBwcmltYXJ5V0NzOwpAQCAtMTk5OCwzNCArMjYxMSw0NCBAQAogCQkJCXJlc3VsdFtpbmRleCsrXSA9ICgoSmF2YU1vZGVsTWFuYWdlci5QZXJXb3JraW5nQ29weUluZm8paXRlcmF0b3IubmV4dCgpKS5nZXRXb3JraW5nQ29weSgpOwogCQkJfQogCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQkJCisJCX0KIAl9Ci0JCisKIAlwdWJsaWMgSmF2YVdvcmtzcGFjZVNjb3BlIGdldFdvcmtzcGFjZVNjb3BlKCkgewogCQlpZiAodGhpcy53b3Jrc3BhY2VTY29wZSA9PSBudWxsKSB7CiAJCQl0aGlzLndvcmtzcGFjZVNjb3BlID0gbmV3IEphdmFXb3Jrc3BhY2VTY29wZSgpOwogCQl9CiAJCXJldHVybiB0aGlzLndvcmtzcGFjZVNjb3BlOwogCX0KKworCXB1YmxpYyB2b2lkIHZlcmlmeUFyY2hpdmVDb250ZW50KElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGlzSW52YWxpZEFyY2hpdmUocGF0aCkpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuc3RhdHVzX0lPRXhjZXB0aW9uLCBuZXcgWmlwRXhjZXB0aW9uKCkpKTsJCQkKKwkJfQorCQlaaXBGaWxlIGZpbGUgPSBnZXRaaXBGaWxlKHBhdGgpOworCQljbG9zZVppcEZpbGUoZmlsZSk7CisJfQogCQogCS8qKgogCSAqIFJldHVybnMgdGhlIG9wZW4gWmlwRmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aC4gSWYgdGhlIFppcEZpbGUKIAkgKiBkb2VzIG5vdCB5ZXQgZXhpc3QsIGl0IGlzIGNyZWF0ZWQsIG9wZW5lZCwgYW5kIGFkZGVkIHRvIHRoZSBjYWNoZQotCSAqIG9mIG9wZW4gWmlwRmlsZXMuIAotCSAqIAotCSAqIFRoZSBwYXRoIG11c3QgYmUgYSBmaWxlIHN5c3RlbSBwYXRoIGlmIHJlcHJlc2VudGluZyBhbiBleHRlcm5hbCAKLQkgKiB6aXAvamFyLCBvciBpdCBtdXN0IGJlIGFuIGFic29sdXRlIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIGlmIAorCSAqIG9mIG9wZW4gWmlwRmlsZXMuCisJICoKKwkgKiBUaGUgcGF0aCBtdXN0IGJlIGEgZmlsZSBzeXN0ZW0gcGF0aCBpZiByZXByZXNlbnRpbmcgYW4gZXh0ZXJuYWwKKwkgKiB6aXAvamFyLCBvciBpdCBtdXN0IGJlIGFuIGFic29sdXRlIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIGlmCiAJICogcmVwcmVzZW50aW5nIGEgemlwL2phciBpbnNpZGUgdGhlIHdvcmtzcGFjZS4KIAkgKgogCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBJZiB1bmFibGUgdG8gY3JlYXRlL29wZW4gdGhlIFppcEZpbGUKIAkgKi8KIAlwdWJsaWMgWmlwRmlsZSBnZXRaaXBGaWxlKElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQlIYXNoTWFwIG1hcDsKKworCQlpZiAoaXNJbnZhbGlkQXJjaGl2ZShwYXRoKSkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgTWVzc2FnZXMuc3RhdHVzX0lPRXhjZXB0aW9uLCBuZXcgWmlwRXhjZXB0aW9uKCkpKTsKKwkJCisJCVppcENhY2hlIHppcENhY2hlOwogCQlaaXBGaWxlIHppcEZpbGU7Ci0JCWlmICgobWFwID0gKEhhc2hNYXApdGhpcy56aXBGaWxlcy5nZXQoKSkgIT0gbnVsbCAKLQkJCQkmJiAoemlwRmlsZSA9IChaaXBGaWxlKW1hcC5nZXQocGF0aCkpICE9IG51bGwpIHsKLQkJCQkKKwkJaWYgKCh6aXBDYWNoZSA9IChaaXBDYWNoZSl0aGlzLnppcEZpbGVzLmdldCgpKSAhPSBudWxsCisJCQkJJiYgKHppcEZpbGUgPSB6aXBDYWNoZS5nZXRDYWNoZShwYXRoKSkgIT0gbnVsbCkgewogCQkJcmV0dXJuIHppcEZpbGU7CiAJCX0KIAkJRmlsZSBsb2NhbEZpbGUgPSBudWxsOwpAQCAtMjAzNSwxMSArMjY1OCwxMSBAQAogCQkJLy8gaW50ZXJuYWwgcmVzb3VyY2UKIAkJCVVSSSBsb2NhdGlvbjsKIAkJCWlmIChmaWxlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSB8fCAobG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uVVJJKCkpID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZmlsZV9ub3RGb3VuZCwgcGF0aC50b1N0cmluZygpKSwgbnVsbCkpOyAKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZmlsZV9ub3RGb3VuZCwgcGF0aC50b1N0cmluZygpKSwgbnVsbCkpOwogCQkJfQogCQkJbG9jYWxGaWxlID0gVXRpbC50b0xvY2FsRmlsZShsb2NhdGlvbiwgbnVsbC8qbm8gcHJvZ3Jlc3MgYXZhaWxhaWJsZSovKTsKIAkJCWlmIChsb2NhbEZpbGUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZmlsZV9ub3RGb3VuZCwgcGF0aC50b1N0cmluZygpKSwgbnVsbCkpOyAKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZmlsZV9ub3RGb3VuZCwgcGF0aC50b1N0cmluZygpKSwgbnVsbCkpOwogCQl9IGVsc2UgewogCQkJLy8gZXh0ZXJuYWwgcmVzb3VyY2UgLT4gaXQgaXMgb2sgdG8gdXNlIHRvRmlsZSgpCiAJCQlsb2NhbEZpbGU9IHBhdGgudG9GaWxlKCk7CkBAIC0yMDUwLDIyICsyNjczLDIzIEBACiAJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmF2YU1vZGVsTWFuYWdlci5nZXRaaXBGaWxlKElQYXRoKV0gQ3JlYXRpbmcgWmlwRmlsZSBvbiAiICsgbG9jYWxGaWxlICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJfQogCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKGxvY2FsRmlsZSk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQltYXAucHV0KHBhdGgsIHppcEZpbGUpOworCQkJaWYgKHppcENhY2hlICE9IG51bGwpIHsKKwkJCQl6aXBDYWNoZS5zZXRDYWNoZShwYXRoLCB6aXBGaWxlKTsKIAkJCX0KIAkJCXJldHVybiB6aXBGaWxlOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIE1lc3NhZ2VzLnN0YXR1c19JT0V4Y2VwdGlvbiwgZSkpOyAKKwkJCWFkZEludmFsaWRBcmNoaXZlKHBhdGgpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBNZXNzYWdlcy5zdGF0dXNfSU9FeGNlcHRpb24sIGUpKTsKIAkJfQogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcG9yYXJ5IGNhY2hlIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCiAJICovCiAJcHVibGljIGJvb2xlYW4gaGFzVGVtcG9yYXJ5Q2FjaGUoKSB7CiAJCXJldHVybiB0aGlzLnRlbXBvcmFyeUNhY2hlLmdldCgpICE9IG51bGw7CiAJfQotCQorCiAJLyoKIAkgKiBJbml0aWFsaXplIGFsbCBjb250YWluZXIgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgZ2l2ZW4gY29udGFpbmVyLgogCSAqIFJldHVybiB0aGUgY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBhbmQgcHJvamVjdC4KQEAgLTIwOTMsOCArMjcxNyw2IEBACiAJCQkJCQlhbGxDb250YWluZXJQYXRocy5wdXQoamF2YVByb2plY3QsIHBhdGhzKTsKIAkJCQkJfQogCQkJCQlwYXRocy5hZGQocGF0aCk7Ci0JCQkJCS8vIG1hcmsgY29udGFpbmVyIGFzIGJlaW5nIGluaXRpYWxpemVkCi0JCQkJCWNvbnRhaW5lckFkZEluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcyhqYXZhUHJvamVjdCwgcGF0aCk7CiAJCQkJfQogCQkJfQogCQkJLyogVE9ETyAoZnJlZGVyaWMpIHB1dCBiYWNrIHdoZW4gSkRUL1VJIGR1bW15IHByb2plY3Qgd2lsbCBiZSB0aHJvd24gYXdheS4uLgpAQCAtMjExMCwyNSArMjczMiwyNiBAQAogCQkJKi8KIAkJfQogCQkvLyBUT0RPIChmcmVkZXJpYykgcmVtb3ZlIGZvbGxvd2luZyBibG9jayB3aGVuIEpEVC9VSSBkdW1teSBwcm9qZWN0IHdpbGwgYmUgdGhyb3duIGF3YXkuLi4KLQkJSGFzaFNldCBjb250YWluZXJQYXRocyA9IChIYXNoU2V0KSBhbGxDb250YWluZXJQYXRocy5nZXQoamF2YVByb2plY3RUb0luaXQpOwotCQlpZiAoY29udGFpbmVyUGF0aHMgPT0gbnVsbCkgewotCQkJY29udGFpbmVyUGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJYWxsQ29udGFpbmVyUGF0aHMucHV0KGphdmFQcm9qZWN0VG9Jbml0LCBjb250YWluZXJQYXRocyk7CisJCWlmIChqYXZhUHJvamVjdFRvSW5pdCAhPSBudWxsKSB7CisJCQlIYXNoU2V0IGNvbnRhaW5lclBhdGhzID0gKEhhc2hTZXQpIGFsbENvbnRhaW5lclBhdGhzLmdldChqYXZhUHJvamVjdFRvSW5pdCk7CisJCQlpZiAoY29udGFpbmVyUGF0aHMgPT0gbnVsbCkgeworCQkJCWNvbnRhaW5lclBhdGhzID0gbmV3IEhhc2hTZXQoKTsKKwkJCQlhbGxDb250YWluZXJQYXRocy5wdXQoamF2YVByb2plY3RUb0luaXQsIGNvbnRhaW5lclBhdGhzKTsKKwkJCX0KKwkJCWNvbnRhaW5lclBhdGhzLmFkZChjb250YWluZXJUb0luaXQpOwogCQl9Ci0JCWNvbnRhaW5lclBhdGhzLmFkZChjb250YWluZXJUb0luaXQpOwotCQkvLyBtYXJrIGNvbnRhaW5lciBhcyBiZWluZyBpbml0aWFsaXplZAotCQljb250YWluZXJBZGRJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MoamF2YVByb2plY3RUb0luaXQsIGNvbnRhaW5lclRvSW5pdCk7CiAJCS8vIGVuZCBibG9jawotCQkKKwogCQkvLyBpbml0aWFsaXplIGFsbCBjb250YWluZXJzCiAJCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAkJdHJ5IHsKIAkJCS8vIGlmIHBvc3NpYmxlIHJ1biBpbnNpZGUgYW4gSVdva3NwYWNlUnVubmFibGUgd2l0aCBBVk9JRF9VUEFURSB0byBhdm9pZCB1bndhbnRlZCBidWlsZHMKIAkJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODUwNykKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IAkJCQkKKwkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9CiAJCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKIAkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBDb2xsZWN0IGFsbCBjb250YWluZXJzCiAJCQkJCQkJU2V0IGVudHJ5U2V0ID0gYWxsQ29udGFpbmVyUGF0aHMuZW50cnlTZXQoKTsKIAkJCQkJCQlpbnQgbGVuZ3RoID0gZW50cnlTZXQuc2l6ZSgpOwogCQkJCQkJCWlmIChtb25pdG9yICE9IG51bGwpCkBAIC0yMTQ2LDE3ICsyNzY5LDQxIEBACiAJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoMjsgaisrKSB7CiAJCQkJCQkJCQlJUGF0aCBwYXRoID0gcGF0aHNbal07CiAJCQkJCQkJCQlpbml0aWFsaXplQ29udGFpbmVyKGphdmFQcm9qZWN0LCBwYXRoKTsKKwkJCQkJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gY29udGFpbmVyQmVpbmdJbml0aWFsaXplZEdldChqYXZhUHJvamVjdCwgcGF0aCk7CisJCQkJCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKwkJCQkJCQkJCQljb250YWluZXJQdXQoamF2YVByb2plY3QsIHBhdGgsIGNvbnRhaW5lcik7CisJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKIAkJCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwogCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQkvLyBTZXQgYWxsIGNvbnRhaW5lcnMKKwkJCQkJCQlNYXAgcGVyUHJvamVjdENvbnRhaW5lcnMgPSAoTWFwKSBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMuY29udGFpbmVyc0JlaW5nSW5pdGlhbGl6ZWQuZ2V0KCk7CisJCQkJCQkJaWYgKHBlclByb2plY3RDb250YWluZXJzICE9IG51bGwpIHsKKwkJCQkJCQkJSXRlcmF0b3IgZW50cmllc0l0ZXJhdG9yID0gcGVyUHJvamVjdENvbnRhaW5lcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQkJCQkJCQl3aGlsZSAoZW50cmllc0l0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllc0l0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZW50cnkuZ2V0S2V5KCk7CisJCQkJCQkJCQlIYXNoTWFwIHBlclBhdGhDb250YWluZXJzID0gKEhhc2hNYXApIGVudHJ5LmdldFZhbHVlKCk7CisJCQkJCQkJCQlJdGVyYXRvciBjb250YWluZXJzSXRlcmF0b3IgPSBwZXJQYXRoQ29udGFpbmVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQkJCQkJCQl3aGlsZSAoY29udGFpbmVyc0l0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCQkJCU1hcC5FbnRyeSBjb250YWluZXJFbnRyeSA9IChNYXAuRW50cnkpIGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7CisJCQkJCQkJCQkJSVBhdGggY29udGFpbmVyUGF0aCA9IChJUGF0aCkgY29udGFpbmVyRW50cnkuZ2V0S2V5KCk7CisJCQkJCQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcikgY29udGFpbmVyRW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJCQkJCQlTZXRDb250YWluZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFNldENvbnRhaW5lck9wZXJhdGlvbihjb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10ge3Byb2plY3R9LCBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHtjb250YWluZXJ9KTsKKwkJCQkJCQkJCQlvcGVyYXRpb24ucnVuT3BlcmF0aW9uKG1vbml0b3IpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCUphdmFNb2RlbE1hbmFnZXIudGhpcy5jb250YWluZXJzQmVpbmdJbml0aWFsaXplZC5zZXQobnVsbCk7CisJCQkJCQkJfQogCQkJCQkJfSBmaW5hbGx5IHsKIAkJCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQogCQkJCQkJCQltb25pdG9yLmRvbmUoKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX07Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSAoSVByb2dyZXNzTW9uaXRvcikgdGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzLmdldCgpOworCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gdGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzOwogCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAJCQlpZiAod29ya3NwYWNlLmlzVHJlZUxvY2tlZCgpKQogCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKQEAgLTIxNzEsMzAgKzI4MTgsMzAgQEAKIAkJCS8vIGlnbm9yZQogCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSBpbml0aWFsaXppbmcgYWxsIGNvbnRhaW5lcnMiKTsgLy8kTk9OLU5MUy0xJAogCQl9IGZpbmFsbHkgewotCQkJaWYgKCFvaykgeyAKLQkJCQkvLyBpZiB3ZSdyZSBiZWluZyB0cmF2ZXJzZWQgYnkgYW4gZXhjZXB0aW9uLCBlbnN1cmUgdGhhdCB0aGF0IGNvbnRhaW5lcnMgYXJlIAorCQkJaWYgKCFvaykgeworCQkJCS8vIGlmIHdlJ3JlIGJlaW5nIHRyYXZlcnNlZCBieSBhbiBleGNlcHRpb24sIGVuc3VyZSB0aGF0IHRoYXQgY29udGFpbmVycyBhcmUKIAkJCQkvLyBubyBsb25nZXIgbWFya2VkIGFzIGluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzCiAJCQkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY0MzcpCiAJCQkJdGhpcy5jb250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3Muc2V0KG51bGwpOwogCQkJfQogCQl9Ci0JCQorCiAJCXJldHVybiBjb250YWluZXJHZXQoamF2YVByb2plY3RUb0luaXQsIGNvbnRhaW5lclRvSW5pdCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHZlcmJvc2VfYmF0Y2hpbmdfY29udGFpbmVyc19pbml0aWFsaXphdGlvbihJSmF2YVByb2plY3QgamF2YVByb2plY3RUb0luaXQsIElQYXRoIGNvbnRhaW5lclRvSW5pdCkgewogCQlVdGlsLnZlcmJvc2UoCiAJCQkiQ1BDb250YWluZXIgSU5JVCAtIGJhdGNoaW5nIGNvbnRhaW5lcnMgaW5pdGlhbGl6YXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXByb2plY3QgdG8gaW5pdDogIiArIGphdmFQcm9qZWN0VG9Jbml0LmdldEVsZW1lbnROYW1lKCkgKyAnXG4nICsgLy8kTk9OLU5MUy0xJAorCQkJIglwcm9qZWN0IHRvIGluaXQ6ICIgKyAoamF2YVByb2plY3RUb0luaXQgPT0gbnVsbCA/ICJudWxsIiA6IGphdmFQcm9qZWN0VG9Jbml0LmdldEVsZW1lbnROYW1lKCkpICsgJ1xuJyArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJIgljb250YWluZXIgcGF0aCB0byBpbml0OiAiICsgY29udGFpbmVyVG9Jbml0KTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCUlDbGFzc3BhdGhDb250YWluZXIgaW5pdGlhbGl6ZUNvbnRhaW5lcihJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gKElQcm9ncmVzc01vbml0b3IpIHRoaXMuYmF0Y2hDb250YWluZXJJbml0aWFsaXphdGlvbnNQcm9ncmVzcy5nZXQoKTsKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gdGhpcy5iYXRjaENvbnRhaW5lckluaXRpYWxpemF0aW9uc1Byb2dyZXNzOwogCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQogCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQorCiAJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKIAkJZmluYWwgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcihjb250YWluZXJQYXRoLnNlZ21lbnQoMCkpOwogCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCl7CkBAIC0yMjEyLDI1ICsyODU5LDI1IEBACiAJCQl0cnkgewogCQkJCWlmIChtb25pdG9yICE9IG51bGwpCiAJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmphdmFtb2RlbF9jb25maWd1cmluZywgaW5pdGlhbGl6ZXIuZ2V0RGVzY3JpcHRpb24oY29udGFpbmVyUGF0aCwgcHJvamVjdCkpKTsKLQkJCQkKKwogCQkJCS8vIGxldCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBnbyB0aHJvdWdoCiAJCQkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkzNjMpCiAJCQkJaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKLQkJCQkKKwogCQkJCWlmIChtb25pdG9yICE9IG51bGwpCiAJCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKKwogCQkJCS8vIHJldHJpZXZlIHZhbHVlIChpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCkKLQkJCQljb250YWluZXIgPSBjb250YWluZXJHZXQocHJvamVjdCwgY29udGFpbmVyUGF0aCk7Ci0JCQkJaWYgKGNvbnRhaW5lciA9PSBDT05UQUlORVJfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1MpIHsKKwkJCQljb250YWluZXIgPSBjb250YWluZXJCZWluZ0luaXRpYWxpemVkR2V0KHByb2plY3QsIGNvbnRhaW5lclBhdGgpOworCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCAmJiBjb250YWluZXJHZXQocHJvamVjdCwgY29udGFpbmVyUGF0aCkgPT0gQ09OVEFJTkVSX0lOSVRJQUxJWkFUSU9OX0lOX1BST0dSRVNTKSB7CiAJCQkJCS8vIGluaXRpYWxpemVyIGZhaWxlZCB0byBkbyBpdHMgam9iOiByZWRpcmVjdCB0byB0aGUgZmFpbHVyZSBjb250YWluZXIKIAkJCQkJY29udGFpbmVyID0gaW5pdGlhbGl6ZXIuZ2V0RmFpbHVyZUNvbnRhaW5lcihjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKIAkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFKQorCQkJCQkJaWYgKENQX1JFU09MVkVfVkVSQk9TRSB8fCBDUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkKIAkJCQkJCQl2ZXJib3NlX2NvbnRhaW5lcl9udWxsX2ZhaWx1cmVfY29udGFpbmVyKHByb2plY3QsIGNvbnRhaW5lclBhdGgsIGluaXRpYWxpemVyKTsKIAkJCQkJCXJldHVybiBudWxsOyAvLyBicmVhayBjeWNsZQogCQkJCQl9Ci0JCQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0UpCisJCQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0UgfHwgQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpCiAJCQkJCQl2ZXJib3NlX2NvbnRhaW5lcl91c2luZ19mYWlsdXJlX2NvbnRhaW5lcihwcm9qZWN0LCBjb250YWluZXJQYXRoLCBpbml0aWFsaXplcik7CiAJCQkJCWNvbnRhaW5lclB1dChwcm9qZWN0LCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOwogCQkJCX0KQEAgLTIyNDIsMTEgKzI4ODksMTEgQEAKIAkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpCisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IENQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJCXRocm93IGU7CiAJCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKQorCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSB8fCBDUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkKIAkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCQl0aHJvdyBlOwogCQkJfSBmaW5hbGx5IHsKQEAgLTIyNTYsOCArMjkwMyw4IEBACiAJCQkJaWYgKCFvaykgewogCQkJCQkvLyBqdXN0IHJlbW92ZSBpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcyBhbmQga2VlcCBwcmV2aW91cyBzZXNzaW9uIGNvbnRhaW5lciBzbyBhcyB0byBhdm9pZCBhIGZ1bGwgYnVpbGQKIAkJCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjU4OAotCQkJCQljb250YWluZXJSZW1vdmVJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MocHJvamVjdCwgY29udGFpbmVyUGF0aCk7IAotCQkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFKSAKKwkJCQkJY29udGFpbmVyUmVtb3ZlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKHByb2plY3QsIGNvbnRhaW5lclBhdGgpOworCQkJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IENQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCQkJdmVyYm9zZV9jb250YWluZXJfaW5pdGlhbGl6YXRpb25fZmFpbGVkKHByb2plY3QsIGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lciwgaW5pdGlhbGl6ZXIpOwogCQkJCX0KIAkJCX0KQEAgLTIyNzAsNyArMjkxNyw3IEBACiAJCQkJCS8vIG5vdCB1c2VkCiAJCQkJfQogCQkJfSkuZ2V0RmFpbHVyZUNvbnRhaW5lcihjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKLQkJCWlmIChDUF9SRVNPTFZFX1ZFUkJPU0VfQURWQU5DRUQpCisJCQlpZiAoQ1BfUkVTT0xWRV9WRVJCT1NFX0FEVkFOQ0VEIHx8IENQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKQogCQkJCXZlcmJvc2Vfbm9fY29udGFpbmVyX2luaXRpYWxpemVyX2ZvdW5kKHByb2plY3QsIGNvbnRhaW5lclBhdGgpOwogCQl9CiAJCXJldHVybiBjb250YWluZXI7CkBAIC0yMzEwLDcgKzI5NTcsNyBAQAogCQkJCSIJcHJvamVjdDogIiArIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSArICdcbicgKyAvLyROT04tTkxTLTEkCiAJCQkJIgljb250YWluZXIgcGF0aDogIiArIGNvbnRhaW5lclBhdGggKyAnXG4nICsgLy8kTk9OLU5MUy0xJAogCQkJCSIJaW5pdGlhbGl6ZXI6ICIgKyBpbml0aWFsaXplcik7IC8vJE5PTi1OTFMtMSQKLQkJCQorCiAJCX0gZWxzZSB7CiAJCQlVdGlsLnZlcmJvc2UoCiAJCQkJIkNQQ29udGFpbmVyIElOSVQgLSBGQUlMRUQgKHNlZSBleGNlcHRpb24gYWJvdmUpXG4iICsgLy8kTk9OLU5MUy0xJApAQCAtMjM0Myw3ICsyOTkwLDcgQEAKIAkJCSIJY29udGFpbmVyIHBhdGg6ICIgKyBjb250YWluZXJQYXRoICsgJ1xuJyArIC8vJE5PTi1OTFMtMSQKIAkJCSIJaW5pdGlhbGl6ZXI6ICIgKyBpbml0aWFsaXplcik7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgdmVyYm9zZV90cmlnZ2VyaW5nX2NvbnRhaW5lcl9pbml0aWFsaXphdGlvbl9pbnZvY2F0aW9uX3RyYWNlKCkgewogCQlVdGlsLnZlcmJvc2UoCiAJCQkiQ1BDb250YWluZXIgSU5JVCAtIHRyaWdnZXJpbmcgaW5pdGlhbGl6YXRpb25cbiIgKyAvLyROT04tTkxTLTEkCkBAIC0yMzUyLDU1ICsyOTk5LDU1IEBACiAJfQogCiAJLyoqCi0JICogSW5pdGlhbGl6ZSBwcmVmZXJlbmNlcyBsb29rdXBzIGZvciBKYXZhQ29yZSBwbHVnaW4uCisJICogSW5pdGlhbGl6ZSBwcmVmZXJlbmNlcyBsb29rdXBzIGZvciBKYXZhQ29yZSBwbHVnLWluLgogCSAqLwogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJCisKIAkJLy8gQ3JlYXRlIGxvb2t1cHMKLQkJcHJlZmVyZW5jZXNMb29rdXBbUFJFRl9JTlNUQU5DRV0gPSAoKElTY29wZUNvbnRleHQpIG5ldyBJbnN0YW5jZVNjb3BlKCkpLmdldE5vZGUoSmF2YUNvcmUuUExVR0lOX0lEKTsKLQkJcHJlZmVyZW5jZXNMb29rdXBbUFJFRl9ERUZBVUxUXSA9ICgoSVNjb3BlQ29udGV4dCkgbmV3IERlZmF1bHRTY29wZSgpKS5nZXROb2RlKEphdmFDb3JlLlBMVUdJTl9JRCk7CisJCXRoaXMucHJlZmVyZW5jZXNMb29rdXBbUFJFRl9JTlNUQU5DRV0gPSBJbnN0YW5jZVNjb3BlLklOU1RBTkNFLmdldE5vZGUoSmF2YUNvcmUuUExVR0lOX0lEKTsKKwkJdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0RFRkFVTFRdID0gRGVmYXVsdFNjb3BlLklOU1RBTkNFLmdldE5vZGUoSmF2YUNvcmUuUExVR0lOX0lEKTsKIAogCQkvLyBMaXN0ZW4gdG8gaW5zdGFuY2UgcHJlZmVyZW5jZXMgbm9kZSByZW1vdmFsIGZyb20gcGFyZW50IGluIG9yZGVyIHRvIHJlZnJlc2ggc3RvcmVkIG9uZQotCQlJRWNsaXBzZVByZWZlcmVuY2VzLklOb2RlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlcy5JTm9kZUNoYW5nZUxpc3RlbmVyKCkgeworCQl0aGlzLmluc3RhbmNlTm9kZUxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFkZGVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCQkJLy8gZG8gbm90aGluZwogCQkJfQogCQkJcHVibGljIHZvaWQgcmVtb3ZlZChJRWNsaXBzZVByZWZlcmVuY2VzLk5vZGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRDaGlsZCgpID09IHByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdKSB7Ci0JCQkJCXByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdID0gKChJU2NvcGVDb250ZXh0KSBuZXcgSW5zdGFuY2VTY29wZSgpKS5nZXROb2RlKEphdmFDb3JlLlBMVUdJTl9JRCk7Ci0JCQkJCXByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihuZXcgRWNsaXBzZVByZWZlcmVuY2VzTGlzdGVuZXIoKSk7CisJCQkJaWYgKGV2ZW50LmdldENoaWxkKCkgPT0gSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdKSB7CisJCQkJCUphdmFNb2RlbE1hbmFnZXIudGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0lOU1RBTkNFXSA9IEluc3RhbmNlU2NvcGUuSU5TVEFOQ0UuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOworCQkJCQlKYXZhTW9kZWxNYW5hZ2VyLnRoaXMucHJlZmVyZW5jZXNMb29rdXBbUFJFRl9JTlNUQU5DRV0uYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKG5ldyBFY2xpcHNlUHJlZmVyZW5jZXNMaXN0ZW5lcigpKTsKIAkJCQl9CiAJCQl9CiAJCX07Ci0JCSgoSUVjbGlwc2VQcmVmZXJlbmNlcykgcHJlZmVyZW5jZXNMb29rdXBbUFJFRl9JTlNUQU5DRV0ucGFyZW50KCkpLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihuZXcgRWNsaXBzZVByZWZlcmVuY2VzTGlzdGVuZXIoKSk7CisJCSgoSUVjbGlwc2VQcmVmZXJlbmNlcykgdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0lOU1RBTkNFXS5wYXJlbnQoKSkuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuaW5zdGFuY2VOb2RlTGlzdGVuZXIpOworCQl0aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLmluc3RhbmNlUHJlZmVyZW5jZXNMaXN0ZW5lciA9IG5ldyBFY2xpcHNlUHJlZmVyZW5jZXNMaXN0ZW5lcigpKTsKIAogCQkvLyBMaXN0ZW4gdG8gZGVmYXVsdCBwcmVmZXJlbmNlcyBub2RlIHJlbW92YWwgZnJvbSBwYXJlbnQgaW4gb3JkZXIgdG8gcmVmcmVzaCBzdG9yZWQgb25lCi0JCWxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJdGhpcy5kZWZhdWx0Tm9kZUxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFkZGVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCQkJLy8gZG8gbm90aGluZwogCQkJfQogCQkJcHVibGljIHZvaWQgcmVtb3ZlZChJRWNsaXBzZVByZWZlcmVuY2VzLk5vZGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRDaGlsZCgpID09IHByZWZlcmVuY2VzTG9va3VwW1BSRUZfREVGQVVMVF0pIHsKLQkJCQkJcHJlZmVyZW5jZXNMb29rdXBbUFJFRl9ERUZBVUxUXSA9ICgoSVNjb3BlQ29udGV4dCkgbmV3IERlZmF1bHRTY29wZSgpKS5nZXROb2RlKEphdmFDb3JlLlBMVUdJTl9JRCk7CisJCQkJaWYgKGV2ZW50LmdldENoaWxkKCkgPT0gSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfREVGQVVMVF0pIHsKKwkJCQkJSmF2YU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfREVGQVVMVF0gPSBEZWZhdWx0U2NvcGUuSU5TVEFOQ0UuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOwogCQkJCX0KIAkJCX0KIAkJfTsKLQkJKChJRWNsaXBzZVByZWZlcmVuY2VzKSBwcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0RFRkFVTFRdLnBhcmVudCgpKS5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCQkoKElFY2xpcHNlUHJlZmVyZW5jZXMpIHRoaXMucHJlZmVyZW5jZXNMb29rdXBbUFJFRl9ERUZBVUxUXS5wYXJlbnQoKSkuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuZGVmYXVsdE5vZGVMaXN0ZW5lcik7CiAJfQogCiAJcHVibGljIHN5bmNocm9uaXplZCBjaGFyW10gaW50ZXJuKGNoYXJbXSBhcnJheSkgewogCQlyZXR1cm4gdGhpcy5jaGFyQXJyYXlTeW1ib2xzLmFkZChhcnJheSk7CiAJfQotCQorCiAJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgaW50ZXJuKFN0cmluZyBzKSB7CiAJCS8vIG1ha2Ugc3VyZSB0byBjb3B5IHRoZSBzdHJpbmcgKHNvIHRoYXQgaXQgZG9lc24ndCBob2xkIG9uIHRoZSB1bmRlcmx5aW5nIGNoYXJbXSB0aGF0IG1pZ2h0IGJlIG11Y2ggYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5KQogCQlyZXR1cm4gKFN0cmluZykgdGhpcy5zdHJpbmdTeW1ib2xzLmFkZChuZXcgU3RyaW5nKHMpKTsKLQkJCisKIAkJLy8gTm90ZTE6IFN0cmluZyNpbnRlcm4oKSBjYW5ub3QgYmUgdXNlZCBhcyBvbiBzb21lIFZNcyB0aGlzIHByZXZlbnRzIHRoZSBzdHJpbmcgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZAogCQkvLyBOb3RlIDI6IEluc3RlYWQgb2YgdXNpbmcgYSBXZWFrSGFzaHNldCwgb25lIGNvdWxkIHVzZSBhIFdlYWtIYXNoTWFwIHdpdGggdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbgogCQkvLyAJCQkgICBUaGlzIHdvdWxkIGNvc3RzIG1vcmUgcGVyIGVudHJ5IChvbmUgRW50cnkgb2JqZWN0IGFuZCBvbmUgV2Vha1JlZmVyZW5jZSBtb3JlKSkKLQkJCisKIAkJLyoKIAkJV2Vha1JlZmVyZW5jZSByZWZlcmVuY2UgPSAoV2Vha1JlZmVyZW5jZSkgdGhpcy5zeW1ib2xzLmdldChzKTsKIAkJU3RyaW5nIGV4aXN0aW5nOwpAQCAtMjQwOCw5ICszMDU1LDkgQEAKIAkJCXJldHVybiBleGlzdGluZzsKIAkJdGhpcy5zeW1ib2xzLnB1dChzLCBuZXcgV2Vha1JlZmVyZW5jZShzKSk7CiAJCXJldHVybiBzOwotCQkqLwkKKwkJKi8KIAl9Ci0JCisKIAlwcml2YXRlIEhhc2hTZXQgZ2V0Q2xhc3NwYXRoQmVpbmdSZXNvbHZlZCgpIHsKIAkgICAgSGFzaFNldCByZXN1bHQgPSAoSGFzaFNldCkgdGhpcy5jbGFzc3BhdGhzQmVpbmdSZXNvbHZlZC5nZXQoKTsKIAkgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CkBAIC0yNDE5LDExICszMDY2LDExIEBACiAJICAgIH0KIAkgICAgcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzcGF0aEJlaW5nUmVzb2x2ZWQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkgICAgcmV0dXJuIGdldENsYXNzcGF0aEJlaW5nUmVzb2x2ZWQoKS5jb250YWlucyhwcm9qZWN0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAZGVwcmVjYXRlZAogCSAqLwpAQCAtMjQzMiw2ICszMDc5LDE0IEBACiAJCQkJfHwgSmF2YUNvcmUuQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERS5lcXVhbHMob3B0aW9uTmFtZSk7CiAJfQogCQorCXB1YmxpYyBib29sZWFuIGlzTm9uQ2hhaW5pbmdKYXIoSVBhdGggcGF0aCkgeworCQlyZXR1cm4gdGhpcy5ub25DaGFpbmluZ0phcnMgIT0gbnVsbCAmJiB0aGlzLm5vbkNoYWluaW5nSmFycy5jb250YWlucyhwYXRoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkQXJjaGl2ZShJUGF0aCBwYXRoKSB7CisJCXJldHVybiB0aGlzLmludmFsaWRBcmNoaXZlcyAhPSBudWxsICYmIHRoaXMuaW52YWxpZEFyY2hpdmVzLmNvbnRhaW5zKHBhdGgpOworCX0KKwogCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aEJlaW5nUmVzb2x2ZWQoSUphdmFQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gY2xhc3NwYXRoSXNSZXNvbHZlZCkgewogCSAgICBpZiAoY2xhc3NwYXRoSXNSZXNvbHZlZCkgewogCSAgICAgICAgZ2V0Q2xhc3NwYXRoQmVpbmdSZXNvbHZlZCgpLmFkZChwcm9qZWN0KTsKQEAgLTI0MzksMTIgKzMwOTQsNzYgQEAKIAkgICAgICAgIGdldENsYXNzcGF0aEJlaW5nUmVzb2x2ZWQoKS5yZW1vdmUocHJvamVjdCk7CiAJICAgIH0KIAl9Ci0KKwkKKwlwcml2YXRlIFNldCBsb2FkQ2xhc3NwYXRoTGlzdENhY2hlKFN0cmluZyBjYWNoZU5hbWUpIHsKKwkJU2V0IHBhdGhDYWNoZSA9IG5ldyBIYXNoU2V0KCk7CisJCUZpbGUgY2FjaGVGaWxlID0gZ2V0Q2xhc3NwYXRoTGlzdEZpbGUoY2FjaGVOYW1lKTsKKwkJRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGNhY2hlRmlsZSkpKTsKKwkJCWludCBzaXplID0gaW4ucmVhZEludCgpOworCQkJd2hpbGUgKHNpemUtLSA+IDApIHsKKwkJCQlTdHJpbmcgcGF0aCA9IGluLnJlYWRVVEYoKTsKKwkJCQlwYXRoQ2FjaGUuYWRkKFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKHBhdGgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJaWYgKGNhY2hlRmlsZS5leGlzdHMoKSkKKwkJCQlVdGlsLmxvZyhlLCAiVW5hYmxlIHRvIHJlYWQgbm9uLWNoYWluaW5nIGphciBjYWNoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIG5vdGhpbmcgd2UgY2FuIGRvOiBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChwYXRoQ2FjaGUpOworCX0KKwkKKwlwcml2YXRlIEZpbGUgZ2V0Q2xhc3NwYXRoTGlzdEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisJCXJldHVybiBKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKS50b0ZpbGUoKTsgCisJfQorCQorCXByaXZhdGUgU2V0IGdldE5vbkNoYWluaW5nSmFyc0NhY2hlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBFdmVuIGlmIHRoZXJlIGlzIG9uZSBlbnRyeSBpbiB0aGUgY2FjaGUsIGp1c3QgcmV0dXJuIGl0LiBJdCBtYXkgbm90IGJlIAorCQkvLyB0aGUgY29tcGxldGUgY2FjaGUsIGJ1dCBhdm9pZCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgcHJvamVjdHMgdG8gcG9wdWxhdGUgdGhlIGNhY2hlLgorCQlpZiAodGhpcy5ub25DaGFpbmluZ0phcnMgIT0gbnVsbCAmJiB0aGlzLm5vbkNoYWluaW5nSmFycy5zaXplKCkgPiAwKSB7CisJCQlyZXR1cm4gdGhpcy5ub25DaGFpbmluZ0phcnM7CisJCX0KKwkJU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSAoKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQlJUGF0aCBwYXRoOworCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgCisJCQkJCSYmICFyZXN1bHQuY29udGFpbnMocGF0aCA9IGVudHJ5LmdldFBhdGgoKSkKKwkJCQkJJiYgQ2xhc3NwYXRoRW50cnkucmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKHBhdGgpLmxlbmd0aCA9PSAwKSB7CisJCQkJCQlyZXN1bHQuYWRkKHBhdGgpOworCQkJCX0KKwkJCX0KKwkJfQorCQl0aGlzLm5vbkNoYWluaW5nSmFycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChyZXN1bHQpOworCQlyZXR1cm4gdGhpcy5ub25DaGFpbmluZ0phcnM7CisJfQorCQorCXByaXZhdGUgU2V0IGdldENsYXNzcGF0aExpc3RDYWNoZShTdHJpbmcgY2FjaGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChjYWNoZU5hbWUgPT0gTk9OX0NIQUlOSU5HX0pBUlNfQ0FDSEUpIAorCQkJcmV0dXJuIGdldE5vbkNoYWluaW5nSmFyc0NhY2hlKCk7CisJCWVsc2UgaWYgKGNhY2hlTmFtZSA9PSBJTlZBTElEX0FSQ0hJVkVTX0NBQ0hFKQorCQkJcmV0dXJuIHRoaXMuaW52YWxpZEFyY2hpdmVzOworCQllbHNlIAorCQkJcmV0dXJuIG51bGw7CisJfQorCQogCXB1YmxpYyB2b2lkIGxvYWRWYXJpYWJsZXNBbmRDb250YWluZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBjb25zaWRlciBwZXJzaXN0ZW50IHByb3BlcnR5CQorCQkvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBjb25zaWRlciBwZXJzaXN0ZW50IHByb3BlcnR5CiAJCVF1YWxpZmllZE5hbWUgcU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJ2YXJpYWJsZXMiKTsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgeG1sU3RyaW5nID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW50UHJvcGVydHkocU5hbWUpOwotCQkKKwogCQl0cnkgewogCQkJaWYgKHhtbFN0cmluZyAhPSBudWxsKXsKIAkJCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih4bWxTdHJpbmcpOwpAQCAtMjQ2Myw3ICszMTgyLDcgQEAKIAkJCQlpZiAoIWNwRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInZhcmlhYmxlcyIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuOwogCQkJCX0KLQkJCQkKKwogCQkJCU5vZGVMaXN0IGxpc3Q9IGNwRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CiAJCQkJaW50IGxlbmd0aD0gbGlzdC5nZXRMZW5ndGgoKTsKIAkJCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKQEAgLTI0NzIsNyArMzE5MSw3IEBACiAJCQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAJCQkJCQlFbGVtZW50IGVsZW1lbnQ9IChFbGVtZW50KSBub2RlOwogCQkJCQkJaWYgKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ2YXJpYWJsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl2YXJpYWJsZVB1dCggCisJCQkJCQkJdmFyaWFibGVQdXQoCiAJCQkJCQkJCWVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIiksIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJbmV3IFBhdGgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CkBAIC0yNTEyLDcgKzMyMzEsNyBAQAogCQkJCQkJdGhpcy52YXJpYWJsZXMucHV0KHZhck5hbWUsIHZhclBhdGgpOwogCQkJCQkJdGhpcy5wcmV2aW91c1Nlc3Npb25WYXJpYWJsZXMucHV0KHZhck5hbWUsIHZhclBhdGgpOwogCQkJCQl9Ci0JCQkJCQorCiAJCQkJCS8vIGNvbnRhaW5lcnMKIAkJCQkJSUphdmFNb2RlbCBtb2RlbCA9IGdldEphdmFNb2RlbCgpOwogCQkJCQlpbnQgcHJvamVjdFNpemUgPSBpbi5yZWFkSW50KCk7CkBAIC0yNTY4LDI0ICszMjg3LDI0IEBACiAJCQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KHByb3BlcnR5TmFtZSwgbnVsbCk7CiAJCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKIAkJCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gcHJvcGVydHlWYWx1ZS50cmltKCk7Ci0JCQkJCQkKKwogCQkJCQkJaWYgKENQX0VOVFJZX0lHTk9SRS5lcXVhbHMocGF0aFN0cmluZykpIHsKIAkJCQkJCQkvLyBjbGVhbnVwIG9sZCBwcmVmZXJlbmNlcwotCQkJCQkJCXByZWZlcmVuY2VzLnJlbW92ZShwcm9wZXJ0eU5hbWUpOyAKKwkJCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUocHJvcGVydHlOYW1lKTsKIAkJCQkJCQljb250aW51ZTsKIAkJCQkJCX0KLQkJCQkJCQorCiAJCQkJCQkvLyBhZGQgdmFyaWFibGUgdG8gdGFibGUKIAkJCQkJCUlQYXRoIHZhclBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nKTsKLQkJCQkJCXRoaXMudmFyaWFibGVzLnB1dCh2YXJOYW1lLCB2YXJQYXRoKTsgCisJCQkJCQl0aGlzLnZhcmlhYmxlcy5wdXQodmFyTmFtZSwgdmFyUGF0aCk7CiAJCQkJCQl0aGlzLnByZXZpb3VzU2Vzc2lvblZhcmlhYmxlcy5wdXQodmFyTmFtZSwgdmFyUGF0aCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKENQX0NPTlRBSU5FUl9QUkVGRVJFTkNFU19QUkVGSVgpKXsKIAkJCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQocHJvcGVydHlOYW1lLCBudWxsKTsKIAkJCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewogCQkJCQkJLy8gY2xlYW51cCBvbGQgcHJlZmVyZW5jZXMKLQkJCQkJCXByZWZlcmVuY2VzLnJlbW92ZShwcm9wZXJ0eU5hbWUpOyAKLQkJCQkJCQorCQkJCQkJcHJlZmVyZW5jZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7CisKIAkJCQkJCS8vIHJlY3JlYXRlIGNvbnRhaW5lcgogCQkJCQkJcmVjcmVhdGVQZXJzaXN0ZWRDb250YWluZXIocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlLCB0cnVlLyphZGQgdG8gY29udGFpbmVyIHZhbHVlcyovKTsKIAkJCQkJfQpAQCAtMjYxNCwxMyArMzMzMywxMyBAQAogCQl9CiAKIAkJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gZW50cmllczsKKwkJCXJldHVybiB0aGlzLmVudHJpZXM7CiAJCX0KIAogCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuICJQZXJzaXN0ZWQgY29udGFpbmVyIFsiICsgY29udGFpbmVyUGF0aCAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiBmb3IgcHJvamVjdCBbIiArIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIl1dIjsgLy8kTk9OLU5MUy0xJCAgCisJCQlyZXR1cm4gIlBlcnNpc3RlZCBjb250YWluZXIgWyIgKyB0aGlzLmNvbnRhaW5lclBhdGggLy8kTk9OLU5MUy0xJAorCQkJCQkrICIgZm9yIHByb2plY3QgWyIgKyB0aGlzLnByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSAvLyROT04tTkxTLTEkCisJCQkJCSsgIl1dIjsgLy8kTk9OLU5MUy0xJAogCQl9CiAKIAkJcHVibGljIGludCBnZXRLaW5kKCkgewpAQCAtMjYyOCw3ICszMzQ3LDcgQEAKIAkJfQogCiAJCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lclBhdGg7CisJCQlyZXR1cm4gdGhpcy5jb250YWluZXJQYXRoOwogCQl9CiAKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTI2NjEsNyArMzM4MCw3IEBACiAJCX0KIAogCQl2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJbG9hZFByb2plY3RzKEphdmFNb2RlbE1hbmFnZXIudGhpcy5nZXRKYXZhTW9kZWwoKSk7CisJCQlsb2FkUHJvamVjdHMoZ2V0SmF2YU1vZGVsKCkpOwogCQkJbG9hZFZhcmlhYmxlcygpOwogCQl9CiAKQEAgLTI3NzEsMTUgKzM0OTAsMTUgQEAKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJCUlQYXRoIHBhdGggPSBsb2FkUGF0aCgpOwogCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBsb2FkQ2xhc3NwYXRoRW50cmllcygpOwotCQkJCQotCQkJCWlmICghcHJvamVjdElzQWNjZXNzaWJsZSkgCisKKwkJCQlpZiAoIXByb2plY3RJc0FjY2Vzc2libGUpCiAJCQkJCS8vIGF2b2lkIGxlYWtpbmcgZGVsZXRlZCBwcm9qZWN0J3MgcGVyc2lzdGVkIGNvbnRhaW5lciwKIAkJCQkJLy8gYnV0IHN0aWxsIHJlYWQgdGhlIGNvbnRhaW5lciBhcyBpdCBpcyBpcyBwYXJ0IG9mIHRoZSBmaWxlIGZvcm1hdAotCQkJCQljb250aW51ZTsgCisJCQkJCWNvbnRpbnVlOwogCiAJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgUGVyc2lzdGVkQ2xhc3NwYXRoQ29udGFpbmVyKHByb2plY3QsIHBhdGgsIGVudHJpZXMpOwogCi0JCQkJSmF2YU1vZGVsTWFuYWdlci50aGlzLmNvbnRhaW5lclB1dChwcm9qZWN0LCBwYXRoLCBjb250YWluZXIpOworCQkJCWNvbnRhaW5lclB1dChwcm9qZWN0LCBwYXRoLCBjb250YWluZXIpOwogCiAJCQkJTWFwIG9sZENvbnRhaW5lcnMgPSAoTWFwKSBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMucHJldmlvdXNTZXNzaW9uQ29udGFpbmVycy5nZXQocHJvamVjdCk7CiAKQEAgLTI4OTksMTUgKzM2MTgsNDQgQEAKIAkvKgogCSAqIFB1dHMgdGhlIGluZm9zIGluIHRoZSBnaXZlbiBtYXAgKGtleXMgYXJlIElKYXZhRWxlbWVudHMgYW5kIHZhbHVlcyBhcmUgSmF2YUVsZW1lbnRJbmZvcykKIAkgKiBpbiB0aGUgSmF2YSBtb2RlbCBjYWNoZSBpbiBhbiBhdG9taWMgd2F5LgotCSAqIEZpcnN0IGNoZWNrcyB0aGF0IHRoZSBpbmZvIGZvciB0aGUgb3BlbmVkIGVsZW1lbnQgKG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKSBoYXMgbm90IGJlZW4gCi0JICogYWRkZWQgdG8gdGhlIGNhY2hlLiBJZiBpdCBpcyB0aGUgY2FzZSwgYW5vdGhlciB0aHJlYWQgaGFzIG9wZW5lZCB0aGUgZWxlbWVudCAob3Igb25lIG9mCi0JICogaXRzIGFuY2VzdG9ycykuIFNvIHJldHVybnMgd2l0aG91dCB1cGRhdGluZyB0aGUgY2FjaGUuCiAJICovCiAJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHB1dEluZm9zKElKYXZhRWxlbWVudCBvcGVuZWRFbGVtZW50LCBNYXAgbmV3RWxlbWVudHMpIHsKLQkJLy8gcmVtb3ZlIGNoaWxkcmVuCisJCS8vIHJlbW92ZSBleGlzdGluZyBjaGlsZHJlbiBhcyB0aGUgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBjaGlsZHJlbiBjb250YWluZWQgaW4gbmV3RWxlbWVudHMKIAkJT2JqZWN0IGV4aXN0aW5nSW5mbyA9IHRoaXMuY2FjaGUucGVla0F0SW5mbyhvcGVuZWRFbGVtZW50KTsKLQkJaWYgKG9wZW5lZEVsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50ICYmIGV4aXN0aW5nSW5mbyBpbnN0YW5jZW9mIEphdmFFbGVtZW50SW5mbykgewotCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylleGlzdGluZ0luZm8pLmdldENoaWxkcmVuKCk7CisJCWlmIChvcGVuZWRFbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgeworCQkJY2xvc2VDaGlsZHJlbihleGlzdGluZ0luZm8pOworCQl9CisKKwkJLy8gTmVlZCB0byBwdXQgYW55IEphclBhY2thZ2VGcmFnbWVudFJvb3QgaW4gZmlyc3QuCisJCS8vIFRoaXMgaXMgZHVlIHRvIHRoZSB3YXkgdGhlIExSVSBjYWNoZSBmbHVzaGVzIGVudHJpZXMuCisJCS8vIFdoZW4gYSBKYXJQYWNrYWdlRnJhZ21lbnQgaXMgZmx1c2hlZCBmcm9tIHRoZSBMUlUgY2FjaGUsIHRoZSBlbnRpcmUKKwkJLy8gamFyIGlzIGZsdXNoZWQgYnkgcmVtb3ZpbmcgdGhlIEphclBhY2thZ2VGcmFnbWVudFJvb3QgYW5kIGFsbCBvZiBpdHMKKwkJLy8gY2hpbGRyZW4gKHNlZSBFbGVtZW50Q2FjaGUuY2xvc2UoKSkuIElmIHdlIGZsdXNoIHRoZSBKYXJQYWNrYWdlRnJhZ21lbnQKKwkJLy8gd2hlbiBpdHMgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBpcyBub3QgaW4gdGhlIGNhY2hlIGFuZCB0aGUgcm9vdCBpcyBhYm91dCB0byBiZQorCQkvLyBhZGRlZCAoZHVyaW5nIHRoZSAnd2hpbGUnIGxvb3ApLCB3ZSB3aWxsIGVuZCB1cCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCisJCS8vIFN1YnNlcXVlbnQgcmVzb2x1dGlvbiBhZ2FpbnN0IHBhY2thZ2UgaW4gdGhlIGphciB3b3VsZCBmYWlsIGFzIGEgcmVzdWx0LgorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDIyCisJCS8vICh0aGVvZG9yYSkKKwkJZm9yKEl0ZXJhdG9yIGl0ID0gbmV3RWxlbWVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7CisJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpZW50cnkuZ2V0S2V5KCk7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCQlPYmplY3QgaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJaXQucmVtb3ZlKCk7CisJCQkJdGhpcy5jYWNoZS5wdXRJbmZvKGVsZW1lbnQsIGluZm8pOworCQkJfQorCQl9CisKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXdFbGVtZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCXRoaXMuY2FjaGUucHV0SW5mbygoSUphdmFFbGVtZW50KSBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2xvc2VDaGlsZHJlbihPYmplY3QgaW5mbykgeworCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEphdmFFbGVtZW50SW5mbykgeworCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylpbmZvKS5nZXRDaGlsZHJlbigpOwogCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKIAkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CiAJCQkJdHJ5IHsKQEAgLTI5MTcsMzQgKzM2NjUsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQkKLQkJLy8gTmVlZCB0byBwdXQgYW55IEphclBhY2thZ2VGcmFnbWVudFJvb3QgaW4gZmlyc3QuCi0JCS8vIFRoaXMgaXMgZHVlIHRvIHRoZSB3YXkgdGhlIExSVSBjYWNoZSBmbHVzaGVzIGVudHJpZXMuCi0JCS8vIFdoZW4gYSBKYXJQYWNrYWdlRnJhZ21lbnQgaXMgZmx1c2VkIGZyb20gdGhlIExSVSBjYWNoZSwgdGhlIGVudGlyZQotCQkvLyBqYXIgaXMgZmx1c2hlZCBieSByZW1vdmluZyB0aGUgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBhbmQgYWxsIG9mIGl0cwotCQkvLyBjaGlsZHJlbiAoc2VlIEVsZW1lbnRDYWNoZS5jbG9zZSgpKS4gSWYgd2UgZmx1c2ggdGhlIEphclBhY2thZ2VGcmFnbWVudCAKLQkJLy8gd2hlbiBpdHMgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBpcyBub3QgaW4gdGhlIGNhY2hlIGFuZCB0aGUgcm9vdCBpcyBhYm91dCB0byBiZSAKLQkJLy8gYWRkZWQgKGR1cmluZyB0aGUgJ3doaWxlJyBsb29wKSwgd2Ugd2lsbCBlbmQgdXAgaW4gYW4gaW5jb25zaXN0IHN0YXRlLiAKLQkJLy8gU3Vic2VxdWVudCByZXNvbHV0aW9uIGFnYWluc3QgcGFja2FnZSBpbiB0aGUgamFyIHdvdWxkIGZhaWwgYXMgYSByZXN1bHQuCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDI0MjIKLQkJLy8gKHRoZW9kb3JhKQotCQlmb3IoSXRlcmF0b3IgaXQgPSBuZXdFbGVtZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gKElKYXZhRWxlbWVudCllbnRyeS5nZXRLZXkoKTsKLQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCApewotCQkJCU9iamVjdCBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpdC5yZW1vdmUoKTsKLQkJCQl0aGlzLmNhY2hlLnB1dEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JCQl9Ci0JCX0JCi0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3RWxlbWVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwkKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdGhpcy5jYWNoZS5wdXRJbmZvKChJSmF2YUVsZW1lbnQpIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQogCX0KLQkKKwogCS8qCiAJICogUmVtZW1iZXIgdGhlIGluZm8gZm9yIHRoZSBqYXIgYmluYXJ5IHR5cGUKIAkgKi8KQEAgLTI5NjMsMTAgKzM2ODUsMTAgQEAKIAkJCQl0cnkgewogCQkJCQlTdHJpbmcgcGx1Z2luSUQ9IGluLnJlYWRVVEYoKTsKIAkJCQkJaWYgKCFwbHVnaW5JRC5lcXVhbHMoSmF2YUNvcmUuUExVR0lOX0lEKSkKLQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5idWlsZF93cm9uZ0ZpbGVGb3JtYXQpOyAKKwkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5idWlsZF93cm9uZ0ZpbGVGb3JtYXQpOwogCQkJCQlTdHJpbmcga2luZD0gaW4ucmVhZFVURigpOwogCQkJCQlpZiAoIWtpbmQuZXF1YWxzKCJTVEFURSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuYnVpbGRfd3JvbmdGaWxlRm9ybWF0KTsgCisJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuYnVpbGRfd3JvbmdGaWxlRm9ybWF0KTsKIAkJCQkJaWYgKGluLnJlYWRCb29sZWFuKCkpCiAJCQkJCQlyZXR1cm4gSmF2YUJ1aWxkZXIucmVhZFN0YXRlKHByb2plY3QsIGluKTsKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQpAQCAtMjk5OCwxNSArMzcyMCwxNSBAQAogCQkJcmVjcmVhdGVQZXJzaXN0ZWRDb250YWluZXIocHJvamVjdCwgY29udGFpbmVyUGF0aCwgY29udGFpbmVyU3RyaW5nLCBhZGRUb0NvbnRhaW5lclZhbHVlcyk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHJlY3JlYXRlUGVyc2lzdGVkQ29udGFpbmVyKGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCBTdHJpbmcgY29udGFpbmVyU3RyaW5nLCBib29sZWFuIGFkZFRvQ29udGFpbmVyVmFsdWVzKSB7Ci0JCWlmICghcHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHJldHVybjsgLy8gYXZvaWQgbGVha2luZyBkZWxldGVkIHByb2plY3QncyBwZXJzaXN0ZWQgY29udGFpbmVyCQorCQlpZiAoIXByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSByZXR1cm47IC8vIGF2b2lkIGxlYWtpbmcgZGVsZXRlZCBwcm9qZWN0J3MgcGVyc2lzdGVkIGNvbnRhaW5lcgogCQlpZiAoY29udGFpbmVyU3RyaW5nID09IG51bGwpIHsKIAkJCWdldEphdmFNb2RlbE1hbmFnZXIoKS5jb250YWluZXJQdXQocHJvamVjdCwgY29udGFpbmVyUGF0aCwgbnVsbCk7CiAJCX0gZWxzZSB7CiAJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzOwogCQkJdHJ5IHsKLQkJCQllbnRyaWVzID0gKChKYXZhUHJvamVjdCkgcHJvamVjdCkuZGVjb2RlQ2xhc3NwYXRoKGNvbnRhaW5lclN0cmluZywgbnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKTsKKwkJCQllbnRyaWVzID0gKChKYXZhUHJvamVjdCkgcHJvamVjdCkuZGVjb2RlQ2xhc3NwYXRoKGNvbnRhaW5lclN0cmluZywgbnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKVswXTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHJlY3JlYXRlIHBlcnNpc3RlZCBjb250YWluZXI6IFxuIiArIGNvbnRhaW5lclN0cmluZyk7IC8vJE5PTi1OTFMtMSQKIAkJCQllbnRyaWVzID0gSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEg7CkBAIC0zMDIxLDcgKzM3NDMsNyBAQAogCQkJCQkJcmV0dXJuICJQZXJzaXN0ZWQgY29udGFpbmVyIFsiK2NvbnRhaW5lclBhdGgrIiBmb3IgcHJvamVjdCBbIisgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKyJdIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCiAJCQkJCX0KIAkJCQkJcHVibGljIGludCBnZXRLaW5kKCkgewotCQkJCQkJcmV0dXJuIDA7IAorCQkJCQkJcmV0dXJuIDA7CiAJCQkJCX0KIAkJCQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7CiAJCQkJCQlyZXR1cm4gY29udGFpbmVyUGF0aDsKQEAgLTMwNDMsMTYgKzM3NjUsMTYgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJlbWVtYmVycyB0aGUgZ2l2ZW4gc2NvcGUgaW4gYSB3ZWFrIHNldAogCSAqIChzbyBubyBuZWVkIHRvIHJlbW92ZSBpdDogaXQgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3RvcikKIAkgKi8KIAlwdWJsaWMgdm9pZCByZW1lbWJlclNjb3BlKEFic3RyYWN0U2VhcmNoU2NvcGUgc2NvcGUpIHsKIAkJLy8gTkI6IFRoZSB2YWx1ZSBoYXMgdG8gYmUgbnVsbCBzbyBhcyB0byBub3QgY3JlYXRlIGEgc3Ryb25nIHJlZmVyZW5jZSBvbiB0aGUgc2NvcGUKLQkJdGhpcy5zZWFyY2hTY29wZXMucHV0KHNjb3BlLCBudWxsKTsgCisJCXRoaXMuc2VhcmNoU2NvcGVzLnB1dChzY29wZSwgbnVsbCk7CiAJfQotCQorCiAJLyoKIAkgKiBSZW1vdmVzIGFsbCBjYWNoZWQgaW5mbyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKGluY2x1ZGluZyBhbGwgY2hpbGRyZW4pCiAJICogZnJvbSB0aGUgY2FjaGUuCkBAIC0zMDg5LDEyICszODExLDggQEAKIAkJCQkJSmF2YU1vZGVsQ2FjaGUuVkVSQk9TRSA9IGZhbHNlOwogCQkJCX0KIAkJCQllbGVtZW50LmNsb3NpbmcoaW5mbyk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50ICYmIGluZm8gaW5zdGFuY2VvZiBKYXZhRWxlbWVudEluZm8pIHsKLQkJCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylpbmZvKS5nZXRDaGlsZHJlbigpOwotCQkJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IHNpemU7ICsraSkgewotCQkJCQkJSmF2YUVsZW1lbnQgY2hpbGQgPSAoSmF2YUVsZW1lbnQpIGNoaWxkcmVuW2ldOwotCQkJCQkJY2hpbGQuY2xvc2UoKTsKLQkJCQkJfQorCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgeworCQkJCQljbG9zZUNoaWxkcmVuKGluZm8pOwogCQkJCX0KIAkJCQl0aGlzLmNhY2hlLnJlbW92ZUluZm8oZWxlbWVudCk7CiAJCQkJaWYgKHdhc1ZlcmJvc2UpIHsKQEAgLTMxMDYsMTYgKzM4MjQsMjAgQEAKIAkJCXJldHVybiBpbmZvOwogCQl9CiAJCXJldHVybiBudWxsOwotCX0JCisJfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyUHJvamVjdEluZm8oSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKwlwdWJsaWMgdm9pZCByZW1vdmVQZXJQcm9qZWN0SW5mbyhKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiByZW1vdmVFeHRKYXJJbmZvKSB7CiAJCXN5bmNocm9uaXplZCh0aGlzLnBlclByb2plY3RJbmZvcykgeyAvLyB1c2UgdGhlIHBlclByb2plY3RJbmZvIGNvbGxlY3Rpb24gYXMgaXRzIG93biBsb2NrCiAJCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwogCQkJUGVyUHJvamVjdEluZm8gaW5mbz0gKFBlclByb2plY3RJbmZvKSB0aGlzLnBlclByb2plY3RJbmZvcy5nZXQocHJvamVjdCk7CiAJCQlpZiAoaW5mbyAhPSBudWxsKSB7CiAJCQkJdGhpcy5wZXJQcm9qZWN0SW5mb3MucmVtb3ZlKHByb2plY3QpOworCQkJCWlmIChyZW1vdmVFeHRKYXJJbmZvKSB7CisJCQkJCWluZm8uZm9yZ2V0RXh0ZXJuYWxUaW1lc3RhbXBzQW5kSW5kZXhlcygpOworCQkJCX0KIAkJCX0KIAkJfQorCQlyZXNldENsYXNzcGF0aExpc3RDYWNoZSgpOwogCX0KIAogCS8qCkBAIC0zMTQzLDE4ICszODY1LDI2IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZG9Ob3RVc2UoKSB7CiAJCS8vIHVzZWQgYnkgdGVzdHMgdG8gc2ltdWxhdGUgYSBzdGFydHVwCisJCU1BTkFHRVIuZGVsdGFTdGF0ZS5kb05vdFVzZSgpOwogCQlNQU5BR0VSID0gbmV3IEphdmFNb2RlbE1hbmFnZXIoKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJlc2V0cyB0aGUgY2FjaGUgdGhhdCBob2xkcyBvbiBiaW5hcnkgdHlwZSBpbiBqYXIgZmlsZXMKIAkgKi8KIAlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVzZXRKYXJUeXBlQ2FjaGUoKSB7CiAJCXRoaXMuY2FjaGUucmVzZXRKYXJUeXBlQ2FjaGUoKTsKIAl9CisJCisJcHVibGljIHZvaWQgcmVzZXRDbGFzc3BhdGhMaXN0Q2FjaGUoKSB7CisJCWlmICh0aGlzLm5vbkNoYWluaW5nSmFycyAhPSBudWxsKSAKKwkJCXRoaXMubm9uQ2hhaW5pbmdKYXJzLmNsZWFyKCk7CisJCWlmICh0aGlzLmludmFsaWRBcmNoaXZlcyAhPSBudWxsKSAKKwkJCXRoaXMuaW52YWxpZEFyY2hpdmVzLmNsZWFyKCk7CisJfQogCiAJLyoKIAkgKiBSZXNldHMgdGhlIHRlbXBvcmFyeSBjYWNoZSBmb3IgbmV3bHkgY3JlYXRlZCBlbGVtZW50cyB0byBudWxsLgpAQCAtMzE3NCwxNyArMzkwNCwxNyBAQAogCiAJCS8vIHBhc3NlZCB0aGlzIHBvaW50LCBzYXZlIGFjdGlvbnMgYXJlIG5vbiB0cml2aWFsCiAJCWlmIChjb250ZXh0LmdldEtpbmQoKSA9PSBJU2F2ZUNvbnRleHQuU05BUFNIT1QpIHJldHVybjsKLQkJCisKIAkJLy8gc2F2ZSBidWlsdCBzdGF0ZQogCQlpZiAoaW5mby50cmllZFJlYWQpIHNhdmVCdWlsdFN0YXRlKGluZm8pOwogCX0KLQkKKwogCS8qKgogCSAqIFNhdmVzIHRoZSBidWlsdCBzdGF0ZSBmb3IgdGhlIHByb2plY3QuCiAJICovCiAJcHJpdmF0ZSB2b2lkIHNhdmVCdWlsdFN0YXRlKFBlclByb2plY3RJbmZvIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfc2F2ZVN0YXRlUHJvZ3Jlc3MsIGluZm8ucHJvamVjdC5nZXROYW1lKCkpKTsgCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9zYXZlU3RhdGVQcm9ncmVzcywgaW5mby5wcm9qZWN0LmdldE5hbWUoKSkpOwogCQlGaWxlIGZpbGUgPSBnZXRTZXJpYWxpemF0aW9uRmlsZShpbmZvLnByb2plY3QpOwogCQlpZiAoZmlsZSA9PSBudWxsKSByZXR1cm47CiAJCWxvbmcgdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMzIxMCw3ICszOTQwLDcgQEAKIAkJCX0KIAkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAogCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsCi0JCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY2Fubm90U2F2ZVN0YXRlLCBpbmZvLnByb2plY3QuZ2V0TmFtZSgpKSwgZSkpOyAKKwkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jYW5ub3RTYXZlU3RhdGUsIGluZm8ucHJvamVjdC5nZXROYW1lKCkpLCBlKSk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRyeSB7CiAJCQkJZmlsZS5kZWxldGUoKTsKQEAgLTMyMTksMTEgKzM5NDksMzkgQEAKIAkJCX0KIAkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAogCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBQbGF0Zm9ybS5QTFVHSU5fRVJST1IsCi0JCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY2Fubm90U2F2ZVN0YXRlLCBpbmZvLnByb2plY3QuZ2V0TmFtZSgpKSwgZSkpOyAKKwkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jYW5ub3RTYXZlU3RhdGUsIGluZm8ucHJvamVjdC5nZXROYW1lKCkpLCBlKSk7CiAJCX0KIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKSB7CiAJCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OwotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfc2F2ZVN0YXRlQ29tcGxldGUsIFN0cmluZy52YWx1ZU9mKHQpKSk7IAorCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfc2F2ZVN0YXRlQ29tcGxldGUsIFN0cmluZy52YWx1ZU9mKHQpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2F2ZUNsYXNzcGF0aExpc3RDYWNoZShTdHJpbmcgY2FjaGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUZpbGUgZmlsZSA9IGdldENsYXNzcGF0aExpc3RGaWxlKGNhY2hlTmFtZSk7CisJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkpOworCQkJU2V0IHBhdGhDYWNoZSA9IGdldENsYXNzcGF0aExpc3RDYWNoZShjYWNoZU5hbWUpOworCQkJc3luY2hyb25pemVkIChwYXRoQ2FjaGUpIHsKKwkJCQlvdXQud3JpdGVJbnQocGF0aENhY2hlLnNpemUoKSk7CisJCQkJSXRlcmF0b3IgZW50cmllcyA9IHBhdGhDYWNoZS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBlbnRyaWVzLm5leHQoKTsKKwkJCQkJb3V0LndyaXRlVVRGKHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJQcm9ibGVtcyB3aGlsZSBzYXZpbmcgbm9uLWNoYWluaW5nIGphciBjYWNoZSIsIGUpOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKG91dCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBub3RoaW5nIHdlIGNhbiBkbzogaWdub3JlCisJCQkJfQorCQkJfQogCQl9CiAJfQogCQpAQCAtMzIzMyw3NCArMzk5MSw3IEBACiAJCXRyeSB7CiAJCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpKTsKIAkJCW91dC53cml0ZUludChWQVJJQUJMRVNfQU5EX0NPTlRBSU5FUlNfRklMRV9WRVJTSU9OKTsKLQkJCWlmIChWQVJJQUJMRVNfQU5EX0NPTlRBSU5FUlNfRklMRV9WRVJTSU9OICE9IDEpCi0JCQkJbmV3IFZhcmlhYmxlc0FuZENvbnRhaW5lcnNTYXZlSGVscGVyKG91dCkuc2F2ZShjb250ZXh0KTsKLQkJCWVsc2UgewotCQkJCS8vIG9sZCBjb2RlIHJldGFpbmVkIGZvciBwZXJmb3JtYW5jZSBjb21wYXJpc29ucwotICAgIAkJCQotICAgIAkJCS8vIHZhcmlhYmxlcwotICAgIAkJCW91dC53cml0ZUludCh0aGlzLnZhcmlhYmxlcy5zaXplKCkpOwotICAgIAkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy52YXJpYWJsZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIAkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgIAkJCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgCQkJCW91dC53cml0ZVVURih2YXJpYWJsZU5hbWUpOwotICAgIAkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgIAkJCQlvdXQud3JpdGVVVEYocGF0aCA9PSBudWxsID8gQ1BfRU5UUllfSUdOT1JFIDogcGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotICAgIAkJCX0KLSAgICAJCQkKLSAgICAJCQkvLyBjb250YWluZXJzCi0gICAgCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKLSAgICAJCQlpbnQgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOwotICAgIAkJCW91dC53cml0ZUludChsZW5ndGgpOwotICAgIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAJCQkgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLSAgICAJCQkJLy8gY2xvbmUgd2hpbGUgaXRlcmF0aW5nIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NjM4KQotICAgIAkJCQlNYXAgcHJvamVjdENvbnRhaW5lcnMgPSBjb250YWluZXJDbG9uZShwcm9qZWN0KTsKLSAgICAJCQkJb3V0LndyaXRlVVRGKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgCQkJCWlmIChwcm9qZWN0Q29udGFpbmVycyA9PSBudWxsKSB7Ci0gICAgCQkJCQlvdXQud3JpdGVJbnQoMCk7Ci0gICAgCQkJCQljb250aW51ZTsKLSAgICAJCQkJfQotICAgIAkJCQlIYXNoTWFwIGNvbnRhaW5lcnNUb1NhdmUgPSBuZXcgSGFzaE1hcCgpOwotICAgIAkJCQlmb3IgKGl0ZXJhdG9yID0gcHJvamVjdENvbnRhaW5lcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQkJCSAgICBJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAJCQkJICAgIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgCQkJCQlTdHJpbmcgY29udGFpbmVyU3RyaW5nID0gbnVsbDsKLSAgICAJCQkJCXRyeSB7Ci0gICAgCQkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0gICAgCQkJCQkJCS8vIGNvbnRhaW5lciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCB1c2UgcHJldmlvdXMgc2Vzc2lvbiB2YWx1ZQotICAgIAkJCQkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03Mzk2OSkKLSAgICAJCQkJCQkJY29udGFpbmVyID0gZ2V0UHJldmlvdXNTZXNzaW9uQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIHByb2plY3QpOwotICAgIAkJCQkJCX0KLSAgICAJCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAJCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0gICAgCQkJCQkJCWNvbnRhaW5lclN0cmluZyA9ICgoSmF2YVByb2plY3QpcHJvamVjdCkuZW5jb2RlQ2xhc3NwYXRoKAotICAgIAkJCQkJCQkJCWVudHJpZXMsIAotICAgIAkJCQkJCQkJCW51bGwsIAotICAgIAkJCQkJCQkJCWZhbHNlLAotICAgIAkJCQkJCQkJCW51bGwvKm5vdCBpbnRlcmVzdGVkIGluIHVua25vd24gZWxlbWVudHMqLyk7Ci0gICAgCQkJCQkJfQotICAgIAkJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7Ci0gICAgCQkJCQkJLy8gY291bGQgbm90IGVuY29kZSBlbnRyeTogd2lsbCBub3QgcGVyc2lzdAotICAgIAkJCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3QgcGVyc2lzdCBjb250YWluZXIgIiArIGNvbnRhaW5lclBhdGggKyAiIGZvciBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJCQkJCX0KLSAgICAJCQkJCWlmIChjb250YWluZXJTdHJpbmcgIT0gbnVsbCkKLSAgICAJCQkJCQljb250YWluZXJzVG9TYXZlLnB1dChjb250YWluZXJQYXRoLCBjb250YWluZXJTdHJpbmcpOwotICAgIAkJCQl9Ci0gICAgCQkJCW91dC53cml0ZUludChjb250YWluZXJzVG9TYXZlLnNpemUoKSk7Ci0gICAgCQkJCWl0ZXJhdG9yID0gY29udGFpbmVyc1RvU2F2ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSAoSVBhdGgpIGVudHJ5LmdldEtleSgpOwotICAgIAkJCQkJb3V0LndyaXRlVVRGKGNvbnRhaW5lclBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLSAgICAJCQkJCVN0cmluZyBjb250YWluZXJTdHJpbmcgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgIAkJCQkJb3V0LndyaXRlSW50KGNvbnRhaW5lclN0cmluZy5sZW5ndGgoKSk7Ci0gICAgCQkJCQlvdXQud3JpdGVCeXRlcyhjb250YWluZXJTdHJpbmcpOwotICAgIAkJCQl9Ci0gICAgCQkJfQotCQkJfQorCQkJbmV3IFZhcmlhYmxlc0FuZENvbnRhaW5lcnNTYXZlSGVscGVyKG91dCkuc2F2ZShjb250ZXh0KTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIlByb2JsZW1zIHdoaWxlIHNhdmluZyB2YXJpYWJsZXMgYW5kIGNvbnRhaW5lcnMiLCBlKTsgLy8kTk9OLU5MUy0xJAogCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKQEAgLTMzMTQsNyArNDAwNSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGZpbmFsIGNsYXNzIFZhcmlhYmxlc0FuZENvbnRhaW5lcnNTYXZlSGVscGVyIHsKIAogCQlwcml2YXRlIGZpbmFsIEhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgY2xhc3NwYXRoRW50cnlJZHM7IC8vIElDbGFzc3BhdGhFbnRyeSAtPiBpbnQKQEAgLTMzMjksMzggKzQwMjAsMjMgQEAKIAkJfQogCiAJCXZvaWQgc2F2ZShJU2F2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgeyAvLyBzYXZlIGFsbCBwcm9qZWN0cyBpZiBub25lIHNwZWNpZmllZCAoc25hcHNob3Qgb3IgZnVsbCBzYXZlKQotCQkJCXNhdmVQcm9qZWN0cyhKYXZhTW9kZWxNYW5hZ2VyLnRoaXMuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCkpOworCQkJc2F2ZVByb2plY3RzKGdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpKTsKKwkJCS8vIHJlbW92ZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbm90IGJlIHNhdmVkCisJCQlIYXNoTWFwIHZhcnNUb1NhdmUgPSBudWxsOworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMudmFyaWFibGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworCQkJCVN0cmluZyB2YXJOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGRlZmF1bHRQcmVmZXJlbmNlcy5nZXQoQ1BfVkFSSUFCTEVfUFJFRkVSRU5DRVNfUFJFRklYICsgdmFyTmFtZSwgbnVsbCkgIT0gbnVsbCAvLyBkb24ndCBzYXZlIGNsYXNzcGF0aCB2YXJpYWJsZXMgZnJvbSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBhcyB0aGVyZSBpcyBubyBkZWx0YSBpZiB0aGV5IGFyZSByZW1vdmVkCisJCQkJCQl8fCBDUF9FTlRSWV9JR05PUkVfUEFUSC5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpIHsKKworCQkJCQlpZiAodmFyc1RvU2F2ZSA9PSBudWxsKQorCQkJCQkJdmFyc1RvU2F2ZSA9IG5ldyBIYXNoTWFwKEphdmFNb2RlbE1hbmFnZXIudGhpcy52YXJpYWJsZXMpOworCQkJCQl2YXJzVG9TYXZlLnJlbW92ZSh2YXJOYW1lKTsKKwkJCQl9CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQlzYXZlUHJvamVjdHMobmV3IElKYXZhUHJvamVjdFtdIHtKYXZhQ29yZS5jcmVhdGUocHJvamVjdCl9KTsKLQkJCX0KLQkJCQotCQkJc3dpdGNoIChjb250ZXh0LmdldEtpbmQoKSkgewotCQkJCWNhc2UgSVNhdmVDb250ZXh0LkZVTExfU0FWRSA6Ci0JCQkJCS8vIFRPRE8gKGVyaWMpIC0gaW52ZXN0aWdhdGUgYWZ0ZXIgMy4zIGlmIHZhcmlhYmxlcyBzaG91bGQgYmUgc2F2ZWQgZm9yIGEgU05BUFNIT1QKLQkJCQljYXNlIElTYXZlQ29udGV4dC5TTkFQU0hPVCA6Ci0JCQkJCS8vIHJlbW92ZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbm90IGJlIHNhdmVkCi0JCQkJCUhhc2hNYXAgdmFyc1RvU2F2ZSA9IG51bGw7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gSmF2YU1vZGVsTWFuYWdlci50aGlzLnZhcmlhYmxlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCVN0cmluZyB2YXJOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQlpZiAoZGVmYXVsdFByZWZlcmVuY2VzLmdldChDUF9WQVJJQUJMRV9QUkVGRVJFTkNFU19QUkVGSVggKyB2YXJOYW1lLCBudWxsKSAhPSBudWxsIC8vIGRvbid0IHNhdmUgY2xhc3NwYXRoIHZhcmlhYmxlcyBmcm9tIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGFzIHRoZXJlIGlzIG5vIGRlbHRhIGlmIHRoZXkgYXJlIHJlbW92ZWQKLQkJCQkJCQkJfHwgQ1BfRU5UUllfSUdOT1JFX1BBVEguZXF1YWxzKGVudHJ5LmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkKLQkJCQkJCQlpZiAodmFyc1RvU2F2ZSA9PSBudWxsKQotCQkJCQkJCQl2YXJzVG9TYXZlID0gbmV3IEhhc2hNYXAoSmF2YU1vZGVsTWFuYWdlci50aGlzLnZhcmlhYmxlcyk7Ci0JCQkJCQkJdmFyc1RvU2F2ZS5yZW1vdmUodmFyTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCi0JCQkJCXNhdmVWYXJpYWJsZXModmFyc1RvU2F2ZSAhPSBudWxsID8gdmFyc1RvU2F2ZSA6IEphdmFNb2RlbE1hbmFnZXIudGhpcy52YXJpYWJsZXMpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJfQorCQkJc2F2ZVZhcmlhYmxlcyh2YXJzVG9TYXZlICE9IG51bGwgPyB2YXJzVG9TYXZlIDogSmF2YU1vZGVsTWFuYWdlci50aGlzLnZhcmlhYmxlcyk7CiAJCX0KIAogCQlwcml2YXRlIHZvaWQgc2F2ZUFjY2Vzc1J1bGUoQ2xhc3NwYXRoQWNjZXNzUnVsZSBydWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzQzMiw3ICs0MTA4LDcgQEAKIAkJCQkJLy8gY29udGFpbmVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIHVzZSBwcmV2aW91cwogCQkJCQkvLyBzZXNzaW9uIHZhbHVlCiAJCQkJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczOTY5KQotCQkJCQljb250YWluZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMuZ2V0UHJldmlvdXNTZXNzaW9uQ29udGFpbmVyKHBhdGgsIHByb2plY3QpOworCQkJCQljb250YWluZXIgPSBnZXRQcmV2aW91c1Nlc3Npb25Db250YWluZXIocGF0aCwgcHJvamVjdCk7CiAJCQkJfQogCiAJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQpAQCAtMzU0MCw0MSArNDIxNiw1MSBAQAogCSAqIEBzZWUgSVNhdmVQYXJ0aWNpcGFudAogCSAqLwogCXB1YmxpYyB2b2lkIHNhdmluZyhJU2F2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKKwogCSAgICBsb25nIHN0YXJ0ID0gLTE7CiAJCWlmIChWRVJCT1NFKQogCQkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAogCQkvLyBzYXZlIHZhcmlhYmxlIGFuZCBjb250YWluZXIgdmFsdWVzIG9uIHNuYXBzaG90L2Z1bGwgc2F2ZQogCQlzYXZlVmFyaWFibGVzQW5kQ29udGFpbmVycyhjb250ZXh0KTsKLQorCQkKIAkJaWYgKFZFUkJPU0UpCiAJCQl0cmFjZVZhcmlhYmxlQW5kQ29udGFpbmVycygiU2F2ZWQiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChjb250ZXh0LmdldEtpbmQoKSA9PSBJU2F2ZUNvbnRleHQuRlVMTF9TQVZFKSB7Ci0JCQkvLyB3aWxsIG5lZWQgZGVsdGEgc2luY2UgdGhpcyBzYXZlIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NjU4KQotCQkJY29udGV4dC5uZWVkRGVsdGEoKTsKLQkJCQotCQkJLy8gY2xlYW4gdXAgaW5kZXhlcyBvbiB3b3Jrc3BhY2UgZnVsbCBzYXZlCi0JCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjM0NykKLQkJCUluZGV4TWFuYWdlciBtYW5hZ2VyID0gdGhpcy5pbmRleE1hbmFnZXI7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsIAotCQkJCQkvLyBkb24ndCBmb3JjZSBpbml0aWFsaXphdGlvbiBvZiB3b3Jrc3BhY2Ugc2NvcGUgYXMgd2UgY291bGQgYmUgc2h1dHRpbmcgZG93bgotCQkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mzk0MSkKLQkJCQkJJiYgdGhpcy53b3Jrc3BhY2VTY29wZSAhPSBudWxsKSB7IAotCQkJCW1hbmFnZXIuY2xlYW5VcEluZGV4ZXMoKTsKKworCQlzd2l0Y2goY29udGV4dC5nZXRLaW5kKCkpIHsKKwkJCWNhc2UgSVNhdmVDb250ZXh0LkZVTExfU0FWRSA6IHsKKwkJCQkvLyBzYXZlIG5vbi1jaGFpbmluZyBqYXIgYW5kIGludmFsaWQgamFyIGNhY2hlcyBvbiBmdWxsIHNhdmUKKwkJCQlzYXZlQ2xhc3NwYXRoTGlzdENhY2hlKE5PTl9DSEFJTklOR19KQVJTX0NBQ0hFKTsKKwkJCQlzYXZlQ2xhc3NwYXRoTGlzdENhY2hlKElOVkFMSURfQVJDSElWRVNfQ0FDSEUpOworCQorCQkJCS8vIHdpbGwgbmVlZCBkZWx0YSBzaW5jZSB0aGlzIHNhdmUgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg2NTgpCisJCQkJY29udGV4dC5uZWVkRGVsdGEoKTsKKwkKKwkJCQkvLyBjbGVhbiB1cCBpbmRleGVzIG9uIHdvcmtzcGFjZSBmdWxsIHNhdmUKKwkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjM0NykKKwkJCQlJbmRleE1hbmFnZXIgbWFuYWdlciA9IHRoaXMuaW5kZXhNYW5hZ2VyOworCQkJCWlmIChtYW5hZ2VyICE9IG51bGwKKwkJCQkJCS8vIGRvbid0IGZvcmNlIGluaXRpYWxpemF0aW9uIG9mIHdvcmtzcGFjZSBzY29wZSBhcyB3ZSBjb3VsZCBiZSBzaHV0dGluZyBkb3duCisJCQkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mzk0MSkKKwkJCQkJCSYmIHRoaXMud29ya3NwYWNlU2NvcGUgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmNsZWFuVXBJbmRleGVzKCk7CisJCQkJfQorCQkJfQorCQkJLy8kRkFMTC1USFJPVUdIJAorCQkJY2FzZSBJU2F2ZUNvbnRleHQuU05BUFNIT1QgOiB7CisJCQkJLy8gY2xlYW4gdXAgZXh0ZXJuYWwgZm9sZGVycyBvbiBmdWxsIHNhdmUgb3Igc25hcHNob3QKKwkJCQl0aGlzLmV4dGVybmFsRm9sZGVyc01hbmFnZXIuY2xlYW5VcChudWxsKTsKIAkJCX0KIAkJfQotCQorCiAJCUlQcm9qZWN0IHNhdmVkUHJvamVjdCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOwogCQlpZiAoc2F2ZWRQcm9qZWN0ICE9IG51bGwpIHsKIAkJCWlmICghSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShzYXZlZFByb2plY3QpKSByZXR1cm47IC8vIGlnbm9yZQogCQkJUGVyUHJvamVjdEluZm8gaW5mbyA9IGdldFBlclByb2plY3RJbmZvKHNhdmVkUHJvamVjdCwgdHJ1ZSAvKiBjcmVhdGUgaW5mbyAqLyk7CiAJCQlzYXZlU3RhdGUoaW5mbywgY29udGV4dCk7Ci0JCQlpbmZvLnJlbWVtYmVyRXh0ZXJuYWxMaWJUaW1lc3RhbXBzKCk7CiAJCQlyZXR1cm47CiAJCX0KLQkKKwogCQlBcnJheUxpc3QgdlN0YXRzPSBudWxsOyAvLyBsYXp5IGluaXRpYWxpemVkCiAJCUFycmF5TGlzdCB2YWx1ZXMgPSBudWxsOwogCQlzeW5jaHJvbml6ZWQodGhpcy5wZXJQcm9qZWN0SW5mb3MpIHsKQEAgLTM1ODUsNyArNDI3MSw2IEBACiAJCQl0cnkgewogCQkJCVBlclByb2plY3RJbmZvIGluZm8gPSAoUGVyUHJvamVjdEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKIAkJCQlzYXZlU3RhdGUoaW5mbywgY29udGV4dCk7Ci0JCQkJaW5mby5yZW1lbWJlckV4dGVybmFsTGliVGltZXN0YW1wcygpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQkJaWYgKHZTdGF0cyA9PSBudWxsKQogCQkJCQl2U3RhdHM9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTM1OTUsMjMgKzQyODAsMjQgQEAKIAkJaWYgKHZTdGF0cyAhPSBudWxsKSB7CiAJCQlJU3RhdHVzW10gc3RhdHM9IG5ldyBJU3RhdHVzW3ZTdGF0cy5zaXplKCldOwogCQkJdlN0YXRzLnRvQXJyYXkoc3RhdHMpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IE11bHRpU3RhdHVzKEphdmFDb3JlLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgc3RhdHMsIE1lc3NhZ2VzLmJ1aWxkX2Nhbm5vdFNhdmVTdGF0ZXMsIG51bGwpKTsgCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgTXVsdGlTdGF0dXMoSmF2YUNvcmUuUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBzdGF0cywgTWVzc2FnZXMuYnVpbGRfY2Fubm90U2F2ZVN0YXRlcywgbnVsbCkpOwogCQl9Ci0JCQorCiAJCS8vIHNhdmUgZXh0ZXJuYWwgbGlicyB0aW1lc3RhbXBzCiAJCXRoaXMuZGVsdGFTdGF0ZS5zYXZlRXh0ZXJuYWxMaWJUaW1lU3RhbXBzKCk7CisKIAl9CiAKIAkvKioKIAkgKiBBZGQgYSBzZWNvbmRhcnkgdHlwZSBpbiB0ZW1wb3JhcnkgaW5kZXhpbmcgY2FjaGUgZm9yIGEgcHJvamVjdCBnb3QgZnJvbSBnaXZlbiBwYXRoLgotCSAqIAorCSAqCiAJICogQ3VycmVudCBzZWNvbmRhcnkgdHlwZXMgY2FjaGUgaXMgbm90IG1vZGlmaWVkIGFzIHdlIHdhbnQgdG8gd2FpdCB0aGF0IGluZGV4aW5nCiAJICogd2FzIGZpbmlzaGVkIGJlZm9yZSB0YWtpbmcgbmV3IHNlY29uZGFyeSB0eXBlcyBpbnRvIGFjY291bnQuCi0JICogCisJICoKIAkgKiBJbmRleGluZyBjYWNoZSBpcyBhIHNwZWNpZmljIGVudHJ5IGluIHNlY29uZGFyeSB0eXBlcyBjYWNoZSB3aGljaCBrZXkgaXMKIAkgKiB7QGxpbmsgI0lOREVYRURfU0VDT05EQVJZX1RZUEVTIH0gYW5kIHZhbHVlIGEgbWFwIHdpdGggc2FtZSBzdHJ1Y3R1cmUgdGhhbgogCSAqIHNlY29uZGFyeSB0eXBlcyBjYWNoZSBpdHNlbGYuCi0JICogCisJICoKIAkgKiBAc2VlICNzZWNvbmRhcnlUeXBlcyhJSmF2YVByb2plY3QsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCiAJICovCiAJcHVibGljIHZvaWQgc2Vjb25kYXJ5VHlwZUFkZGluZyhTdHJpbmcgcGF0aCwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKQEAgLTM2NTYsMTMgKzQzNDIsMTcgQEAKIAkJCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gSmF2YU1vZGVsTWFuYWdlci5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlyZXNvdXJjZSwgbnVsbCk7CiAJCQkJCWlmICh1bml0ICE9IG51bGwpIHsKIAkJCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gbmV3IFN0cmluZyh0eXBlTmFtZSk7Ci0JCQkJCQlTdHJpbmcgcGFja2FnZVN0cmluZyA9IG5ldyBTdHJpbmcocGFja2FnZU5hbWUpOworCQkJCQkJSVR5cGUgdHlwZSA9IHVuaXQuZ2V0VHlwZSh0eXBlU3RyaW5nKTsKKwkJCQkJCS8vIFN0cmluZyBwYWNrYWdlU3RyaW5nID0gbmV3IFN0cmluZyhwYWNrYWdlTmFtZSk7CisJCQkJCQkvLyB1c2UgcGFja2FnZSBmcmFnbWVudCBuYW1lIGluc3RlYWQgb2YgcGFyYW1ldGVyIGFzIGl0IG1heSBiZSBpbnZhbGlkLi4uCisJCQkJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY3ODEKKwkJCQkJCVN0cmluZyBwYWNrYWdlU3RyaW5nID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwogCQkJCQkJSGFzaE1hcCBwYWNrYWdlVHlwZXMgPSAoSGFzaE1hcCkgYWxsVHlwZXMuZ2V0KHBhY2thZ2VTdHJpbmcpOwogCQkJCQkJaWYgKHBhY2thZ2VUeXBlcyA9PSBudWxsKSB7CiAJCQkJCQkJcGFja2FnZVR5cGVzID0gbmV3IEhhc2hNYXAoMyk7CiAJCQkJCQkJYWxsVHlwZXMucHV0KHBhY2thZ2VTdHJpbmcsIHBhY2thZ2VUeXBlcyk7CiAJCQkJCQl9Ci0JCQkJCQlwYWNrYWdlVHlwZXMucHV0KHR5cGVTdHJpbmcsIHVuaXQuZ2V0VHlwZSh0eXBlU3RyaW5nKSk7CisJCQkJCQlwYWNrYWdlVHlwZXMucHV0KHR5cGVTdHJpbmcsIHR5cGUpOwogCQkJCQl9CiAJCQkJCWlmIChWRVJCT1NFKSB7CiAJCQkJCQlVdGlsLnZlcmJvc2UoIgktIGluZGV4aW5nIGNhY2hlOiIpOyAvLyROT04tTkxTLTEkCkBAIC0zNjgzLDIxICs0MzczLDIxIEBACiAKIAkvKioKIAkgKiBHZXQgYWxsIHNlY29uZGFyeSB0eXBlcyBmb3IgYSBwcm9qZWN0IGFuZCBzdG9yZSByZXN1bHQgaW4gcGVyIHByb2plY3QgaW5mbyBjYWNoZS4KLQkgKiAKKwkgKgogCSAqIFRoaXMgY2FjaGUgaXMgYW4gSGFzaHRhYmxlPFN0cmluZywgSGFzaE1hcDxTdHJpbmcsIElUeXBlPj46CiAJICogCS0ga2V5OiBwYWNrYWdlIG5hbWUKIAkgKiAJLSB2YWx1ZToKIAkgKiAJCSsga2V5OiB0eXBlIG5hbWUKIAkgKiAJCSsgdmFsdWU6IGphdmEgbW9kZWwgaGFuZGxlIGZvciB0aGUgc2Vjb25kYXJ5IHR5cGUKIAkgKiBIYXNodGFibGUgd2FzIHVzZWQgdG8gcHJvdGVjdCBjYWxsZXJzIGZyb20gcG9zc2libGUgY29uY3VycmVudCBhY2Nlc3MuCi0JICogCisJICoKIAkgKiBOb3RlIHRoYXQgdGhpcyBtYXAgbWF5IGhhdmUgYSBzcGVjaWZpYyBlbnRyeSB3aGljaCBrZXkgaXMge0BsaW5rICNJTkRFWEVEX1NFQ09OREFSWV9UWVBFUyB9CiAJICogYW5kIHZhbHVlIGlzIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHNlY29uZGFyeSB0eXBlcyBjcmVhdGVkIGR1cmluZyBpbmRleGluZy4KIAkgKiBXaGVuIHRoaXMga2V5IGlzIGluIGNhY2hlIGFuZCBpbmRleGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuZWQgbWFwIGlzIG1lcmdlZAogCSAqIHdpdGggdGhlIHZhbHVlIG9mIHRoaXMgc3BlY2lhbCBrZXkuIElmIGluZGV4aW5nIGlzIG5vdCBmaW5pc2hlZCBhbmQgY2FsbGVyIGRvZXMKIAkgKiBub3Qgd2FpdCBmb3IgdGhlIGVuZCBvZiBpbmRleGluZywgcmV0dXJuZWQgbWFwIGlzIHRoZSBjdXJyZW50IHNlY29uZGFyeQogCSAqIHR5cGVzIGNhY2hlIGNvbnRlbnQgd2hpY2ggbWF5IGJlIGludmFsaWQuLi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwcm9qZWN0IFByb2plY3Qgd2Ugd2FudCBnZXQgc2Vjb25kYXJ5IHR5cGVzIGZyb20KIAkgKiBAcmV0dXJuIEhhc2hNYXAgVGFibGUgb2Ygc2Vjb25kYXJ5IHR5cGUgbmFtZXMtPnBhdGggZm9yIGdpdmVuIHByb2plY3QKIAkgKi8KQEAgLTM3NDgsNyArNDQzOCw3IEBACiAJCS8vIEluZGV4aW5nIGlzIGZpbmlzaGVkID0+IG1lcmdlIGNhY2hlcyBhbmQgcmV0dXJuIHJlc3VsdAogCQlyZXR1cm4gc2Vjb25kYXJ5VHlwZXNNZXJnaW5nKHByb2plY3RJbmZvLnNlY29uZGFyeVR5cGVzKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybiBzZWNvbmRhcnkgdHlwZXMgY2FjaGUgbWVyZ2VkIHdpdGggbmV3IHNlY29uZGFyeSB0eXBlcyBjcmVhdGVkIHdoaWxlIGluZGV4aW5nCiAJICogTm90ZSB0aGF0IG1lcmdlIHJlc3VsdCBpcyBkaXJlY3RseSBzdG9yZWQgaW4gZ2l2ZW4gcGFyYW1ldGVyIG1hcC4KQEAgLTM3NzYsMTAgKzQ0NjYsMTAgQEAKIAkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7CiAJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzLm5leHQoKTsKIAkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVudHJ5LmdldEtleSgpOwotCQorCiAJCQkvLyBSZW1vdmUgYWxsIHNlY29uZGFyeSB0eXBlcyBvZiBpbmRleGVkIGZpbGUgZnJvbSBjYWNoZQogCQkJc2Vjb25kYXJ5VHlwZXNSZW1vdmluZyhzZWNvbmRhcnlUeXBlcywgZmlsZSk7Ci0JCQkKKwogCQkJLy8gQWRkIGFsbCBpbmRleGluZyBmaWxlIHNlY29uZGFyeSB0eXBlcyBpbiBnaXZlbiBzZWNvbmRhcnkgdHlwZXMgY2FjaGUKIAkJCUhhc2hNYXAgZmlsZVNlY29uZGFyeVR5cGVzID0gKEhhc2hNYXApIGVudHJ5LmdldFZhbHVlKCk7CiAJCQlJdGVyYXRvciBlbnRyaWVzMiA9IGZpbGVTZWNvbmRhcnlUeXBlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CkBAIC0zODY3LDYgKzQ1NTcsOCBAQAogCQkJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSwgbnVsbCk7CiAJCQkJCUlUeXBlIHR5cGUgPSB1bml0LmdldFR5cGUodHlwZU5hbWUpOwogCQkJCQl0eXBlcy5wdXQodHlwZU5hbWUsIHR5cGUpOyAvLyByZXBsYWNlIHN0b3JlZCBwYXRoIHdpdGggdHlwZSBpdHNlbGYKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lcy5yZW1vdmUoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4OTEsOSArNDU4Myw5IEBACiAJLyoqCiAJICogUmVtb3ZlIGZyb20gc2Vjb25kYXJ5IHR5cGVzIGNhY2hlIGFsbCB0eXBlcyBiZWxvbmdpbmcgdG8gYSBnaXZlbiBmaWxlLgogCSAqIENsZWFuIHNlY29uZGFyeSB0eXBlcyBjYWNoZSBidWlsdCB3aGlsZSBpbmRleGluZyBpZiByZXF1ZXN0ZWQuCi0JICogCisJICoKIAkgKiBQcm9qZWN0J3Mgc2Vjb25kYXJ5IHR5cGVzIGNhY2hlIGlzIGZvdW5kIHVzaW5nIGZpbGUgbG9jYXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIHJlbW92ZQogCSAqLwogCXB1YmxpYyB2b2lkIHNlY29uZGFyeVR5cGVzUmVtb3ZpbmcoSUZpbGUgZmlsZSwgYm9vbGVhbiBjbGVhbkluZGV4Q2FjaGUpIHsKQEAgLTM5MTIsMTAgKzQ2MDQsMTcgQEAKIAogCQkJCS8vIENsZWFuIGN1cnJlbnQgY2FjaGUKIAkJCQlzZWNvbmRhcnlUeXBlc1JlbW92aW5nKHByb2plY3RJbmZvLnNlY29uZGFyeVR5cGVzLCBmaWxlKTsKLQkJCQkKKwogCQkJCS8vIENsZWFuIGluZGV4aW5nIGNhY2hlIGlmIG5lY2Vzc2FyeQotCQkJCWlmICghY2xlYW5JbmRleENhY2hlKSByZXR1cm47CiAJCQkJSGFzaE1hcCBpbmRleGluZ0NhY2hlID0gKEhhc2hNYXApIHByb2plY3RJbmZvLnNlY29uZGFyeVR5cGVzLmdldChJTkRFWEVEX1NFQ09OREFSWV9UWVBFUyk7CisJCQkJaWYgKCFjbGVhbkluZGV4Q2FjaGUpIHsKKwkJCQkJaWYgKGluZGV4aW5nQ2FjaGUgPT0gbnVsbCkgeworCQkJCQkJLy8gTmVlZCB0byBzaWduaWZ5IHRoYXQgc2Vjb25kYXJ5IHR5cGVzIGluZGV4aW5nIHdpbGwgaGFwcGVuIGJlZm9yZSBhbnkgcmVxdWVzdCBoYXBwZW5zCisJCQkJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI4NDEKKwkJCQkJCXByb2plY3RJbmZvLnNlY29uZGFyeVR5cGVzLnB1dChJTkRFWEVEX1NFQ09OREFSWV9UWVBFUywgbmV3IEhhc2hNYXAoKSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KIAkJCQlpZiAoaW5kZXhpbmdDYWNoZSAhPSBudWxsKSB7CiAJCQkJCVNldCBrZXlzID0gaW5kZXhpbmdDYWNoZS5rZXlTZXQoKTsKIAkJCQkJaW50IGZpbGVzU2l6ZSA9IGtleXMuc2l6ZSgpLCBmaWxlc0NvdW50ID0gMDsKQEAgLTM5NzMsOCArNDY3Miw4IEBACiAJCQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewogCQkJCQlNYXAuRW50cnkgZW50cnkyID0gKE1hcC5FbnRyeSkgbmFtZXMubmV4dCgpOwogCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSBlbnRyeTIuZ2V0S2V5KCk7Ci0JCQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoZmlsZS5lcXVhbHModHlwZS5nZXRSZXNvdXJjZSgpKSkgeworCQkJCQlKYXZhRWxlbWVudCB0eXBlID0gKEphdmFFbGVtZW50KSBlbnRyeTIuZ2V0VmFsdWUoKTsKKwkJCQkJaWYgKGZpbGUuZXF1YWxzKHR5cGUucmVzb3VyY2UoKSkpIHsKIAkJCQkJCWlmIChyZW1vdmVkTmFtZXMgPT0gbnVsbCkgcmVtb3ZlZE5hbWVzID0gbmV3IFN0cmluZ1tuYW1lc1NpemVdOwogCQkJCQkJbmFtZXNTaXplLS07CiAJCQkJCQlyZW1vdmVkTmFtZXNbcmVtb3ZlZE5hbWVzQ291bnQrK10gPSB0eXBlTmFtZTsKQEAgLTQwMTcsOSArNDcxNiw5IEBACiAJCS8vIG9wdGlvbmFsIGJlaGF2aW91cgogCQkvLyBwb3NzaWJsZSB2YWx1ZSBvZiBpbmRleCAwIGlzIENvbXB1dGUKIAkJaWYgKCFKYXZhQ29yZS5DT01QVVRFLmVxdWFscyhKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX09SREVSKSkpIHJldHVybjsgLy8gY2Fubm90IGJlIGN1c3RvbWl6ZWQgYXQgcHJvamVjdCBsZXZlbAotCQkKKwogCQlpZiAoamF2YUJ1aWxkT3JkZXIgPT0gbnVsbCB8fCBqYXZhQnVpbGRPcmRlci5sZW5ndGggPD0gMSkgcmV0dXJuOwotCQkKKwogCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKIAkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7CiAJCVN0cmluZ1tdIHdrc0J1aWxkT3JkZXIgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZE9yZGVyKCk7CkBAIC00MDgzLDQ1ICs0NzgyLDEwNiBAQAogCQkJfQogCQl9CiAJfQotCQorCisJLyoqCisJICogU3RvcmUgdGhlIHByZWZlcmVuY2VzIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb3B0aW9uIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uCisJICogQHBhcmFtIG9wdGlvblZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgorCSAqIAl0aGUgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBwcmVmZXJlbmNlcyBpbnN0ZWFkLgorCSAqIEBwYXJhbSBlY2xpcHNlUHJlZmVyZW5jZXMgVGhlIGVjbGlwc2UgcHJlZmVyZW5jZXMgdG8gYmUgdXBkYXRlZAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2VzIGhhdmUgYmVlbiBjaGFuZ2VkLAorCSAqIAk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN0b3JlUHJlZmVyZW5jZShTdHJpbmcgb3B0aW9uTmFtZSwgU3RyaW5nIG9wdGlvblZhbHVlLCBJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcykgeworCQlpbnQgb3B0aW9uTGV2ZWwgPSB0aGlzLmdldE9wdGlvbkxldmVsKG9wdGlvbk5hbWUpOworCQlpZiAob3B0aW9uTGV2ZWwgPT0gVU5LTk9XTl9PUFRJT04pIHJldHVybiBmYWxzZTsgLy8gdW5yZWNvZ25pemVkIG9wdGlvbgorCQkKKwkJLy8gU3RvcmUgb3B0aW9uIHZhbHVlCisJCXN3aXRjaCAob3B0aW9uTGV2ZWwpIHsKKwkJCWNhc2UgSmF2YU1vZGVsTWFuYWdlci5WQUxJRF9PUFRJT046CisJCQkJaWYgKG9wdGlvblZhbHVlID09IG51bGwpIHsKKwkJCQkJZWNsaXBzZVByZWZlcmVuY2VzLnJlbW92ZShvcHRpb25OYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQllY2xpcHNlUHJlZmVyZW5jZXMucHV0KG9wdGlvbk5hbWUsIG9wdGlvblZhbHVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEphdmFNb2RlbE1hbmFnZXIuREVQUkVDQVRFRF9PUFRJT046CisJCQkJLy8gVHJ5IHRvIG1pZ3JhdGUgZGVwcmVjYXRlZCBvcHRpb24KKwkJCQllY2xpcHNlUHJlZmVyZW5jZXMucmVtb3ZlKG9wdGlvbk5hbWUpOyAvLyBnZXQgcmlkIG9mZiBvbGQgcHJlZmVyZW5jZQorCQkJCVN0cmluZ1tdIGNvbXBhdGlibGVPcHRpb25zID0gKFN0cmluZ1tdKSB0aGlzLmRlcHJlY2F0ZWRPcHRpb25zLmdldChvcHRpb25OYW1lKTsKKwkJCQlmb3IgKGludCBjbz0wLCBsZW5ndGg9Y29tcGF0aWJsZU9wdGlvbnMubGVuZ3RoOyBjbyA8IGxlbmd0aDsgY28rKykgeworCQkJCQlpZiAob3B0aW9uVmFsdWUgPT0gbnVsbCkgeworCQkJCQkJZWNsaXBzZVByZWZlcmVuY2VzLnJlbW92ZShjb21wYXRpYmxlT3B0aW9uc1tjb10pOworCQkJCQl9IGVsc2UgeworCQkJCQkJZWNsaXBzZVByZWZlcmVuY2VzLnB1dChjb21wYXRpYmxlT3B0aW9uc1tjb10sIG9wdGlvblZhbHVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwogCXB1YmxpYyB2b2lkIHNldE9wdGlvbnMoSGFzaHRhYmxlIG5ld09wdGlvbnMpIHsKIAkJCi0JCXRyeSB7CisJCWlmIChERUJVR18zMDI4NTApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJpbmcgaW4gSmF2YU1vZGVsTWFuYWdlci5zZXRPcHRpb25zKCk6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ29tcGlsZXJPcHRpb25zKG5ld09wdGlvbnMpLnRvU3RyaW5nKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCIJLSBDYWxsIHN0YWNrOiIpOyAvLyROT04tTkxTLTEkCisJCQlTdGFja1RyYWNlRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKTsKKwkJCWZvciAoaW50IGk9MCxuPWVsZW1lbnRzLmxlbmd0aDsgaTxuOyBpKyspIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgkJKyAiK2VsZW1lbnRzW2ldKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJCUhhc2h0YWJsZSBjYWNoZWRWYWx1ZSA9IG5ld09wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBuZXcgSGFzaHRhYmxlKG5ld09wdGlvbnMpOwogCQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBnZXREZWZhdWx0UHJlZmVyZW5jZXMoKTsKIAkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgaW5zdGFuY2VQcmVmZXJlbmNlcyA9IGdldEluc3RhbmNlUHJlZmVyZW5jZXMoKTsKIAogCQkJaWYgKG5ld09wdGlvbnMgPT0gbnVsbCl7Ci0JCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5jbGVhcigpOworCQkJCXRyeSB7CisJCQkJCWluc3RhbmNlUHJlZmVyZW5jZXMuY2xlYXIoKTsKKwkJCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIGlnbm9yZQorCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJRW51bWVyYXRpb24ga2V5cyA9IG5ld09wdGlvbnMua2V5cygpOwogCQkJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKXsKIAkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoIXRoaXMub3B0aW9uTmFtZXMuY29udGFpbnMoa2V5KSkgY29udGludWU7IC8vIHVucmVjb2duaXplZCBvcHRpb24KLQkJCQkJaWYgKGtleS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9FTkNPRElORykpIGNvbnRpbnVlOyAvLyBza2lwcGVkLCBjb250cmlidXRlZCBieSByZXNvdXJjZSBwcmVmcwotCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKW5ld09wdGlvbnMuZ2V0KGtleSk7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0KGtleSwgbnVsbCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5yZW1vdmUoa2V5KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluc3RhbmNlUHJlZmVyZW5jZXMucHV0KGtleSwgdmFsdWUpOworCQkJCQlpbnQgb3B0aW9uTGV2ZWwgPSBnZXRPcHRpb25MZXZlbChrZXkpOworCQkJCQlpZiAob3B0aW9uTGV2ZWwgPT0gVU5LTk9XTl9PUFRJT04pIGNvbnRpbnVlOyAvLyB1bnJlY29nbml6ZWQgb3B0aW9uCisJCQkJCWlmIChrZXkuZXF1YWxzKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpKSB7CisJCQkJCQlpZiAoY2FjaGVkVmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCWNhY2hlZFZhbHVlLnB1dChrZXksIEphdmFDb3JlLmdldEVuY29kaW5nKCkpOworCQkJCQkJfQorCQkJCQkJY29udGludWU7IC8vIHNraXBwZWQsIGNvbnRyaWJ1dGVkIGJ5IHJlc291cmNlIHByZWZzCiAJCQkJCX0KKwkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbmV3T3B0aW9ucy5nZXQoa2V5KTsKKwkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRQcmVmZXJlbmNlcy5nZXQoa2V5LCBudWxsKTsKKwkJCQkJLy8gU3RvcmUgdmFsdWUgaW4gcHJlZmVyZW5jZXMKKwkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGRlZmF1bHRWYWx1ZS5lcXVhbHModmFsdWUpKSB7CisJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCX0KKwkJCQkJc3RvcmVQcmVmZXJlbmNlKGtleSwgdmFsdWUsIGluc3RhbmNlUHJlZmVyZW5jZXMpOworCQkJCX0KKwkJCQl0cnkgeworCQkJCQkvLyBwZXJzaXN0IG9wdGlvbnMKKwkJCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5mbHVzaCgpOworCQkJCX0gY2F0Y2goQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCiAJCQkJfQogCQkJfQotCi0JCQkvLyBwZXJzaXN0IG9wdGlvbnMKLQkJCWluc3RhbmNlUHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQogCQkJLy8gdXBkYXRlIGNhY2hlCi0JCQl0aGlzLm9wdGlvbnNDYWNoZSA9IG5ld09wdGlvbnM9PW51bGwgPyBudWxsIDogbmV3IEhhc2h0YWJsZShuZXdPcHRpb25zKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9CisJCQlVdGlsLmZpeFRhc2tUYWdzKGNhY2hlZFZhbHVlKTsKKwkJCXRoaXMub3B0aW9uc0NhY2hlID0gY2FjaGVkVmFsdWU7CiAJfQotCQkKKwogCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQljb25maWd1cmVQbHVnaW5EZWJ1Z09wdGlvbnMoKTsKLQkJCQorCiAJCQkvLyBpbml0aWFsaXplIEphdmEgbW9kZWwgY2FjaGUKIAkJCXRoaXMuY2FjaGUgPSBuZXcgSmF2YU1vZGVsQ2FjaGUoKTsKIApAQCAtNDEzMiwxMyArNDg5MiwyNCBAQAogCQkJaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7CiAKIAkJCS8vIExpc3RlbiB0byBwcmVmZXJlbmNlIGNoYW5nZXMKLQkJCVByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5TGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJdGhpcy5wcm9wZXJ0eUxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgewogCQkJCQlKYXZhTW9kZWxNYW5hZ2VyLnRoaXMub3B0aW9uc0NhY2hlID0gbnVsbDsKIAkJCQl9CiAJCQl9OwotCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOworCQkJSW5zdGFuY2VTY29wZS5JTlNUQU5DRS5nZXROb2RlKEphdmFDb3JlLlBMVUdJTl9JRCkuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJvcGVydHlMaXN0ZW5lcik7CiAJCQkKKwkJCS8vIGxpc3RlbiBmb3IgZW5jb2RpbmcgY2hhbmdlcyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU1MDEgKQorCQkJdGhpcy5yZXNvdXJjZXNQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCQlpZiAoUmVzb3VyY2VzUGx1Z2luLlBSRUZfRU5DT0RJTkcuZXF1YWxzKGV2ZW50LmdldEtleSgpKSkgeworCQkJCQkJSmF2YU1vZGVsTWFuYWdlci50aGlzLm9wdGlvbnNDYWNoZSA9IG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQkJU3RyaW5nIHJlc291cmNlc1BsdWdpbklkID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQkJSW5zdGFuY2VTY29wZS5JTlNUQU5DRS5nZXROb2RlKHJlc291cmNlc1BsdWdpbklkKS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZXNQcm9wZXJ0eUxpc3RlbmVyKTsKKwogCQkJLy8gTGlzdGVuIHRvIGNvbnRlbnQtdHlwZSBjaGFuZ2VzCiAJCQkgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuYWRkQ29udGVudFR5cGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKIApAQCAtNDE0NiwxMCArNDkxNywxMiBAQAogCQkJbG9uZyBzdGFydCA9IC0xOwogCQkJaWYgKFZFUkJPU0UpCiAJCQkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAJCQlsb2FkVmFyaWFibGVzQW5kQ29udGFpbmVycygpOwotIAkJCWlmIChWRVJCT1NFKQorCQkJbG9hZFZhcmlhYmxlc0FuZENvbnRhaW5lcnMoKTsKKwkJCWlmIChWRVJCT1NFKQogCQkJCXRyYWNlVmFyaWFibGVBbmRDb250YWluZXJzKCJMb2FkZWQiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKIAorCQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzCisJCQl0aGlzLmRlbHRhU3RhdGUuaW5pdGlhbGl6ZVJvb3RzV2l0aFByZXZpb3VzU2Vzc2lvbigpOwogCQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAJCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKIAkJCQl0aGlzLmRlbHRhU3RhdGUsCkBAIC00MTU4LDEzICs0OTMxLDE0IEBACiAJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRAogCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFCiAJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURQotCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSk7CisJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFCisJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX1JFRlJFU0gpOwogCiAJCQlzdGFydEluZGV4aW5nKCk7Ci0JCQkKKwogCQkJLy8gcHJvY2VzcyBkZWx0YXMgc2luY2UgbGFzdCBhY3RpdmF0ZWQgaW4gaW5kZXhlciB0aHJlYWQgc28gdGhhdCBpbmRleGVzIGFyZSB1cC10by1kYXRlLgogCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODY1OAotCQkJSm9iIHByb2Nlc3NTYXZlZFN0YXRlID0gbmV3IEpvYihNZXNzYWdlcy5zYXZlZFN0YXRlX2pvYk5hbWUpIHsgCisJCQlKb2IgcHJvY2Vzc1NhdmVkU3RhdGUgPSBuZXcgSm9iKE1lc3NhZ2VzLnNhdmVkU3RhdGVfam9iTmFtZSkgewogCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJCQkJdHJ5IHsKIAkJCQkJCS8vIGFkZCBzYXZlIHBhcnRpY2lwYW50IGFuZCBwcm9jZXNzIGRlbHRhIGF0b21pY2FsbHkKQEAgLTQxNzIsNyArNDk0Niw3IEBACiAJCQkJCQl3b3Jrc3BhY2UucnVuKAogCQkJCQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CiAJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQlJU2F2ZWRTdGF0ZSBzYXZlZFN0YXRlID0gd29ya3NwYWNlLmFkZFNhdmVQYXJ0aWNpcGFudChKYXZhQ29yZS5nZXRKYXZhQ29yZSgpLCBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMpOworCQkJCQkJCQkJSVNhdmVkU3RhdGUgc2F2ZWRTdGF0ZSA9IHdvcmtzcGFjZS5hZGRTYXZlUGFydGljaXBhbnQoSmF2YUNvcmUuUExVR0lOX0lELCBKYXZhTW9kZWxNYW5hZ2VyLnRoaXMpOwogCQkJCQkJCQkJaWYgKHNhdmVkU3RhdGUgIT0gbnVsbCkgewogCQkJCQkJCQkJCS8vIHRoZSBldmVudCB0eXBlIGNvbWluZyBmcm9tIHRoZSBzYXZlZCBzdGF0ZSBpcyBhbHdheXMgUE9TVF9BVVRPX0JVSUxECiAJCQkJCQkJCQkJLy8gZm9yY2UgaXQgdG8gYmUgUE9TVF9DSEFOR0Ugc28gdGhhdCB0aGUgZGVsdGEgcHJvY2Vzc29yIGNhbiBoYW5kbGUgaXQKQEAgLTQxOTksMzcgKzQ5NzMsNDggQEAKIAogCS8qKgogCSAqIEluaXRpYXRlIHRoZSBiYWNrZ3JvdW5kIGluZGV4aW5nIHByb2Nlc3MuCi0JICogVGhpcyBzaG91bGQgYmUgZGVmZXJyZWQgYWZ0ZXIgdGhlIHBsdWdpbiBhY3RpdmF0aW9uLgorCSAqIFRoaXMgc2hvdWxkIGJlIGRlZmVycmVkIGFmdGVyIHRoZSBwbHVnLWluIGFjdGl2YXRpb24uCiAJICovCiAJcHJpdmF0ZSB2b2lkIHN0YXJ0SW5kZXhpbmcoKSB7Ci0JCWdldEluZGV4TWFuYWdlcigpLnJlc2V0KCk7CisJCWlmICh0aGlzLmluZGV4TWFuYWdlciAhPSBudWxsKSB0aGlzLmluZGV4TWFuYWdlci5yZXNldCgpOwogCX0KIAogCXB1YmxpYyB2b2lkIHNodXRkb3duICgpIHsKLQkJSmF2YUNvcmUgamF2YUNvcmUgPSBKYXZhQ29yZS5nZXRKYXZhQ29yZSgpOwotCQlqYXZhQ29yZS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEluc3RhbmNlU2NvcGUuSU5TVEFOQ0UuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOworCQl0cnkgeworCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKKwkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWwubG9nKGUsICJDb3VsZCBub3Qgc2F2ZSBKYXZhQ29yZSBwcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCisJCX0KIAkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMuZGVsdGFTdGF0ZSk7Ci0JCXdvcmtzcGFjZS5yZW1vdmVTYXZlUGFydGljaXBhbnQoamF2YUNvcmUpOwotCQkKKwkJd29ya3NwYWNlLnJlbW92ZVNhdmVQYXJ0aWNpcGFudChKYXZhQ29yZS5QTFVHSU5fSUQpOworCiAJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIGNvbnRlbnQtdHlwZSBjaGFuZ2VzCiAJCVBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLnJlbW92ZUNvbnRlbnRUeXBlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQotCQkvLyBTdG9wIGxpc3RlbmluZyB0byB1c2VyIGxpYnJhcnkgY2hhbmdlcwotCQlpZiAodGhpcy51c2VyTGlicmFyeU1hbmFnZXIgIT0gbnVsbCkKLQkJCWdldEluc3RhbmNlUHJlZmVyZW5jZXMoKS5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy51c2VyTGlicmFyeU1hbmFnZXIpOwotCQotCQlpZiAodGhpcy5pbmRleE1hbmFnZXIgIT0gbnVsbCl7IC8vIG5vIG1vcmUgaW5kZXhpbmcKKworCQkvLyBTdG9wIGluZGV4aW5nCisJCWlmICh0aGlzLmluZGV4TWFuYWdlciAhPSBudWxsKSB7CiAJCQl0aGlzLmluZGV4TWFuYWdlci5zaHV0ZG93bigpOwogCQl9Ci0JCQorCisJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHByZWZlcmVuY2VzIGNoYW5nZXMKKwkJcHJlZmVyZW5jZXMucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJvcGVydHlMaXN0ZW5lcik7CisJCSgoSUVjbGlwc2VQcmVmZXJlbmNlcykgdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0RFRkFVTFRdLnBhcmVudCgpKS5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5kZWZhdWx0Tm9kZUxpc3RlbmVyKTsKKwkJdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0RFRkFVTFRdID0gbnVsbDsKKwkJKChJRWNsaXBzZVByZWZlcmVuY2VzKSB0aGlzLnByZWZlcmVuY2VzTG9va3VwW1BSRUZfSU5TVEFOQ0VdLnBhcmVudCgpKS5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5pbnN0YW5jZU5vZGVMaXN0ZW5lcik7CisJCXRoaXMucHJlZmVyZW5jZXNMb29rdXBbUFJFRl9JTlNUQU5DRV0ucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuaW5zdGFuY2VQcmVmZXJlbmNlc0xpc3RlbmVyKTsKKwkJdGhpcy5wcmVmZXJlbmNlc0xvb2t1cFtQUkVGX0lOU1RBTkNFXSA9IG51bGw7CisJCVN0cmluZyByZXNvdXJjZXNQbHVnaW5JZCA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKKwkJSW5zdGFuY2VTY29wZS5JTlNUQU5DRS5nZXROb2RlKHJlc291cmNlc1BsdWdpbklkKS5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZXNQcm9wZXJ0eUxpc3RlbmVyKTsKKwogCQkvLyB3YWl0IGZvciB0aGUgaW5pdGlhbGl6YXRpb24gam9iIHRvIGZpbmlzaAogCQl0cnkgewogCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKEphdmFDb3JlLlBMVUdJTl9JRCwgbnVsbCk7CiAJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlnbm9yZQogCQl9Ci0JCQorCiAJCS8vIE5vdGU6IG5vIG5lZWQgdG8gY2xvc2UgdGhlIEphdmEgbW9kZWwgYXMgdGhpcyBqdXN0IHJlbW92ZXMgSmF2YSBlbGVtZW50IGluZm9zIGZyb20gdGhlIEphdmEgbW9kZWwgY2FjaGUKIAl9CiAKQEAgLTQyNzIsMjMgKzUwNTcsMjYgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdmFyaWFibGVQdXQoU3RyaW5nIHZhcmlhYmxlTmFtZSwgSVBhdGggdmFyaWFibGVQYXRoKXsJCQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB2YXJpYWJsZVB1dChTdHJpbmcgdmFyaWFibGVOYW1lLCBJUGF0aCB2YXJpYWJsZVBhdGgpewogCiAJCS8vIHNldC91bnNldCB0aGUgaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MKIAkJSGFzaFNldCBpbml0aWFsaXphdGlvbnMgPSB2YXJpYWJsZUluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcygpOwogCQlpZiAodmFyaWFibGVQYXRoID09IFZBUklBQkxFX0lOSVRJQUxJWkFUSU9OX0lOX1BST0dSRVNTKSB7CiAJCQlpbml0aWFsaXphdGlvbnMuYWRkKHZhcmlhYmxlTmFtZSk7Ci0JCQkKKwogCQkJLy8gZG8gbm90IHdyaXRlIG91dCBpbnRlcm1lZGlhdGUgaW5pdGlhbGl6YXRpb24gdmFsdWUKIAkJCXJldHVybjsKIAkJfSBlbHNlIHsKIAkJCWluaXRpYWxpemF0aW9ucy5yZW1vdmUodmFyaWFibGVOYW1lKTsKIAotCQkJLy8gdXBkYXRlIGNhY2hlIC0gZG8gbm90IG9ubHkgcmVseSBvbiBsaXN0ZW5lciByZWZyZXNoCQkKKwkJCS8vIHVwZGF0ZSBjYWNoZSAtIGRvIG5vdCBvbmx5IHJlbHkgb24gbGlzdGVuZXIgcmVmcmVzaAogCQkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKSB7CiAJCQkJLy8gaWYgcGF0aCBpcyBudWxsLCByZWNvcmQgdGhhdCB0aGUgdmFyaWFibGUgd2FzIHJlbW92ZWQgdG8gYXZvaWQgYXNraW5nIHRoZSBpbml0aWFsaXplciB0byBpbml0aWFsaXplIGl0IGFnYWluCiAJCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTI2MDkKIAkJCQl0aGlzLnZhcmlhYmxlcy5wdXQodmFyaWFibGVOYW1lLCBDUF9FTlRSWV9JR05PUkVfUEFUSCk7CisJCQkJLy8gY2xlYW4gb3RoZXIgdmFyaWFibGVzIGNhY2hlcworCQkJCXRoaXMudmFyaWFibGVzV2l0aEluaXRpYWxpemVyLnJlbW92ZSh2YXJpYWJsZU5hbWUpOworCQkJCXRoaXMuZGVwcmVjYXRlZFZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGVOYW1lKTsKIAkJCX0gZWxzZSB7CiAJCQkJdGhpcy52YXJpYWJsZXMucHV0KHZhcmlhYmxlTmFtZSwgdmFyaWFibGVQYXRoKTsKIAkJCX0KQEAgLTQzMDAsNyArNTA4OCw2IEBACiAJcHVibGljIHZvaWQgdmFyaWFibGVQcmVmZXJlbmNlc1B1dChTdHJpbmcgdmFyaWFibGVOYW1lLCBJUGF0aCB2YXJpYWJsZVBhdGgpIHsKIAkJU3RyaW5nIHZhcmlhYmxlS2V5ID0gQ1BfVkFSSUFCTEVfUFJFRkVSRU5DRVNfUFJFRklYK3ZhcmlhYmxlTmFtZTsKIAkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKSB7Ci0JCQl0aGlzLnZhcmlhYmxlc1dpdGhJbml0aWFsaXplci5yZW1vdmUodmFyaWFibGVOYW1lKTsKIAkJCWdldEluc3RhbmNlUHJlZmVyZW5jZXMoKS5yZW1vdmUodmFyaWFibGVLZXkpOwogCQl9IGVsc2UgewogCQkJZ2V0SW5zdGFuY2VQcmVmZXJlbmNlcygpLnB1dCh2YXJpYWJsZUtleSwgdmFyaWFibGVQYXRoLnRvU3RyaW5nKCkpOwpAQCAtNDMzMSwxMCArNTExOCwzMiBAQAogCiAJcHVibGljIHZvaWQgY29udGVudFR5cGVDaGFuZ2VkKENvbnRlbnRUeXBlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKIAkJVXRpbC5yZXNldEphdmFMaWtlRXh0ZW5zaW9ucygpOwotCQkKKworCQkvLyBXYWxrIHRocm91Z2ggcHJvamVjdHMgdG8gcmVzZXQgdGhlaXIgc2Vjb25kYXJ5IHR5cGVzIGNhY2hlCisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOworCQl0cnkgeworCQkJcHJvamVjdHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQlmaW5hbCBQZXJQcm9qZWN0SW5mbyBwcm9qZWN0SW5mbyA9IGdldFBlclByb2plY3RJbmZvKHByb2plY3QuZ2V0UHJvamVjdCgpLCBmYWxzZSAvKiBkb24ndCBjcmVhdGUgaW5mbyAqLyk7CisJCQlpZiAocHJvamVjdEluZm8gIT0gbnVsbCkgeworCQkJCXByb2plY3RJbmZvLnNlY29uZGFyeVR5cGVzID0gbnVsbDsKKwkJCX0KKwkJfQogCX0KIAogCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGNhY2hlVG9TdHJpbmcoU3RyaW5nIHByZWZpeCkgewogCQlyZXR1cm4gdGhpcy5jYWNoZS50b1N0cmluZ0ZpbGxpbmdSYXRpb24ocHJlZml4KTsKIAl9CisJCisJcHVibGljIFN0YXRzIGRlYnVnTmV3T3BlbmFibGVDYWNoZVN0YXRzKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZS5vcGVuYWJsZUNhY2hlLm5ldyBTdGF0cygpOworCX0KKwkKKwlwdWJsaWMgaW50IGdldE9wZW5hYmxlQ2FjaGVTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZS5vcGVuYWJsZUNhY2hlLmdldFNwYWNlTGltaXQoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCmluZGV4IGIwMjllNGMuLjA4YzRiNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKIAogLyoqCiAgKiBEZWZpbmVzIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zCkBAIC00Myw3ICs0NSw3IEBACiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVBQRU5EID0gMTsgLy8gaW5zZXJ0IGF0IHRoZSBlbmQKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRU1PVkVBTExfQVBQRU5EID0gMjsgLy8gcmVtb3ZlIGFsbCBleGlzdGluZyBvbmVzIHdpdGggc2FtZSBJRCwgYW5kIGFkZCBuZXcgb25lIGF0IHRoZSBlbmQKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLRUVQX0VYSVNUSU5HID0gMzsgLy8gZG8gbm90IGluc2VydCBpZiBhbHJlYWR5IGV4aXN0aW5nIHdpdGggc2FtZSBJRAotCQorCiAJLyoKIAkgKiBXaGV0aGVyIHRyYWNpbmcgcG9zdCBhY3Rpb25zIGlzIGVuYWJsZWQuCiAJICovCkBAIC02Myw3ICs2NSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIgPSAiaGFzTW9kaWZpZWRSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gSmF2YU1vZGVsTWFuYWdlci5UUlVFOwogCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOwotCQkKKwogCS8qKgogCSAqIFRoZSBlbGVtZW50cyB0aGlzIG9wZXJhdGlvbiBvcGVyYXRlcyBvbiwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbgpAQCAtODEsNyArODMsNyBAQAogCSAqIGVtcHR5IHJlc3VsdCBpZiBubyBlbGVtZW50cyBhcmUgY3JlYXRlZCwgb3IgaWYgdGhpcwogCSAqIG9wZXJhdGlvbiBpcyBub3QgYWN0dWFsbHkgZXhlY3V0ZWQuCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJSmF2YUVsZW1lbnRbXSBOT19FTEVNRU5UUz0gbmV3IElKYXZhRWxlbWVudFtdIHt9OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSUphdmFFbGVtZW50W10gTk9fRUxFTUVOVFM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7fTsKIAogCiAJLyoqCkBAIC0xMDYsNyArMTA4LDcgQEAKIAkvKgogCSAqIEEgcGVyIHRocmVhZCBzdGFjayBvZiBqYXZhIG1vZGVsIG9wZXJhdGlvbnMgKFBlclRocmVhZE9iamVjdCBvZiBBcnJheUxpc3QpLgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGhyZWFkTG9jYWwgb3BlcmF0aW9uU3RhY2tzID0gbmV3IFRocmVhZExvY2FsKCk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbCBPUEVSQVRJT05fU1RBQ0tTID0gbmV3IFRocmVhZExvY2FsKCk7CiAJcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbigpIHsKIAkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGluIHN1YmNsYXNzZXMKIAl9CkBAIC0xMzgsMjEgKzE0MCwxNCBAQAogCQl0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzID0gZWxlbWVudHM7CiAJCXRoaXMuZm9yY2U9IGZvcmNlOwogCX0KLQkKKwogCS8qKgogCSAqIENvbW1vbiBjb25zdHJ1Y3RvciBmb3IgYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4KIAkgKi8KIAlwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAJCXRoaXMuZWxlbWVudHNUb1Byb2Nlc3MgPSBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudH07CiAJfQotCS8qKgotCSAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gZm9yY2UpIHsKLQkJdGhpcy5lbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbXXtlbGVtZW50fTsKLQkJdGhpcy5mb3JjZT0gZm9yY2U7Ci0JfQotCQorCiAJLyoKIAkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGFjdGlvbnMgdG8gcnVuLgogCSAqLwpAQCAtMTg2LDcgKzE4MSw3IEBACiAJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FTVF9BRkZFQ1RFRCkgIT0gMCkgewogCQkJCXByZXZpb3VzRGVsdGEuY2hhbmdlZEFTVChkZWx0YS5nZXRDb21waWxhdGlvblVuaXRBU1QoKSk7CiAJCQl9Ci0JCQkJCQkKKwogCQl9IGVsc2UgewogCQkJcmVjb25jaWxlRGVsdGFzLnB1dCh3b3JraW5nQ29weSwgZGVsdGEpOwogCQl9CkBAIC0xOTUsMTQgKzE5MCwyMiBAQAogCSAqIERlcmVnaXN0ZXIgdGhlIHJlY29uY2lsZSBkZWx0YSBmb3IgdGhlIGdpdmVuIHdvcmtpbmcgY29weQogCSAqLwogCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlY29uY2lsZURlbHRhKElDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkpIHsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RGVsdGFQcm9jZXNzb3IoKS5yZWNvbmNpbGVEZWx0YXMucmVtb3ZlKHdvcmtpbmdDb3B5KTsJCQorCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXREZWx0YVByb2Nlc3NvcigpLnJlY29uY2lsZURlbHRhcy5yZW1vdmUod29ya2luZ0NvcHkpOworCX0KKwlwcm90ZWN0ZWQgdm9pZCBhcHBseVRleHRFZGl0KElDb21waWxhdGlvblVuaXQgY3UsIFRleHRFZGl0IGVkaXRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWVkaXRzLmFwcGx5KGdldERvY3VtZW50KGN1KSk7CisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGNvbnRlbnQgY2hhbmdlZCB1bmRlciB1cworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ09OVEVOVFMpOworCQl9CiAJfQogCS8qKgogCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgogCSAqLwogCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKKwkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwogCQl9CiAJfQogCS8qCkBAIC0yMjEsNyArMjI0LDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgewogCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oTWVzc2FnZXMub3BlcmF0aW9uX2NhbmNlbGxlZCk7IAorCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9jYW5jZWxsZWQpOwogCQl9CiAJfQogCS8qKgpAQCAtMjI5LDExICsyMzIsMTEgQEAKIAkgKiBAc2VlIEphdmFNb2RlbE9wZXJhdGlvbiN2ZXJpZnkoKQogCSAqLwogCXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIGNvbW1vblZlcmlmeSgpIHsKLQkJaWYgKGVsZW1lbnRzVG9Qcm9jZXNzID09IG51bGwgfHwgZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IDApIHsKKwkJaWYgKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3MgPT0gbnVsbCB8fCB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAwKSB7CiAJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOwogCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1RvUHJvY2Vzc1tpXSA9PSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3NbaV0gPT0gbnVsbCkgewogCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyk7CiAJCQl9CiAJCX0KQEAgLTI0MiwxMiArMjQ1LDE4IEBACiAJLyoqCiAJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgcmVzb3VyY2VzCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGNvbnRhaW5lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKHJlc291cmNlcy5sZW5ndGgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJlc291cmNlc1swXS5nZXRXb3Jrc3BhY2UoKTsKKwkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9ICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQl0cnkgewotCQkJd29ya3NwYWNlLmNvcHkocmVzb3VyY2VzLCBkZXN0aW5hdGlvblBhdGgsIGZhbHNlLCBzdWJQcm9ncmVzc01vbml0b3IpOwotCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworCQkJCUlQYXRoIGRlc3RpbmF0aW9uID0gY29udGFpbmVyLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCWlmIChyb290LmZpbmRNZW1iZXIoZGVzdGluYXRpb24pID09IG51bGwpIHsKKwkJCQkJcmVzb3VyY2UuY29weShkZXN0aW5hdGlvbiwgZmFsc2UsIHN1YlByb2dyZXNzTW9uaXRvcik7CisJCQkJfQorCQkJfQorCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CkBAIC0yNTksMTAgKzI2OCwxMCBAQAogCQlJRmlsZSBmaWxlPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChuYW1lKSk7CiAJCXRyeSB7CiAJCQlmaWxlLmNyZWF0ZSgKLQkJCQljb250ZW50cywgCi0JCQkJZm9yY2VGbGFnID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCWNvbnRlbnRzLAorCQkJCWZvcmNlRmxhZyA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAogCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CkBAIC0yNzgsNyArMjg3LDcgQEAKIAkJCQlmb3JjZUZsYWcgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwKIAkJCQl0cnVlLCAvLyBsb2NhbAogCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCQlzZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQpAQCAtMjkxLDIzICszMDAsMjMgQEAKIAkJYm9vbGVhbiBmb3JjZUZsYWcsCiAJCUlSZXNvdXJjZSByb290UmVzb3VyY2UpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQotCQlJQ29udGFpbmVyIHJlc291cmNlID0gKElDb250YWluZXIpIGZyYWdtZW50LmdldFJlc291cmNlKCk7Ci0JCisKKwkJSUNvbnRhaW5lciByZXNvdXJjZSA9IChJQ29udGFpbmVyKSAoKEphdmFFbGVtZW50KWZyYWdtZW50KS5yZXNvdXJjZSgpOworCiAJCXRyeSB7CiAJCQlyZXNvdXJjZS5kZWxldGUoCi0JCQkJZm9yY2VGbGFnID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCWZvcmNlRmxhZyA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAogCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCQlzZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCQl3aGlsZSAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJLy8gZGVsZXRpbmcgYSBwYWNrYWdlOiBkZWxldGUgdGhlIHBhcmVudCBpZiBpdCBpcyBlbXB0eSAoZWcuIGRlbGV0aW5nIHgueSB3aGVyZSBmb2xkZXIgeCBkb2Vzbid0IGhhdmUgcmVzb3VyY2VzIGJ1dCB5KQorCQkJCS8vIGRlbGV0aW5nIGEgcGFja2FnZTogZGVsZXRlIHRoZSBwYXJlbnQgaWYgaXQgaXMgZW1wdHkgKGUuZy4gZGVsZXRpbmcgeC55IHdoZXJlIGZvbGRlciB4IGRvZXNuJ3QgaGF2ZSByZXNvdXJjZXMgYnV0IHkpCiAJCQkJLy8gd2l0aG91dCBkZWxldGluZyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290CiAJCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKIAkJCQlpZiAoIXJlc291cmNlLmVxdWFscyhyb290UmVzb3VyY2UpICYmIHJlc291cmNlLm1lbWJlcnMoKS5sZW5ndGggPT0gMCkgewogCQkJCQlyZXNvdXJjZS5kZWxldGUoCi0JCQkJCQlmb3JjZUZsYWcgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCisJCQkJCQlmb3JjZUZsYWcgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwKIAkJCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJCQlzZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOwogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CkBAIC0zMjAsNyArMzI5LDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsaW50IGZsYWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJlc291cmNlLmRlbGV0ZShmbGFncywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKLQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CkBAIC0zMzUsOSArMzQ0LDkgQEAKIAkJdHJ5IHsKIAkJCXdvcmtzcGFjZS5kZWxldGUoCiAJCQkJcmVzb3VyY2VzLAotCQkJCWZvcmNlRmxhZyA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCQlmb3JjZUZsYWcgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwKIAkJCQlzdWJQcm9ncmVzc01vbml0b3IpOwotCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQpAQCAtMzQ2LDggKzM1NSw4IEBACiAJICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCiAJICovCiAJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOworCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJdGhpcy5wcm9ncmVzc01vbml0b3IuZG9uZSgpOwogCQl9CiAJfQogCS8qCkBAIC00MTMsMTggKzQyMiwxOCBAQAogCSAqIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KIAkgKi8KIAlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXRGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkKKwogCQlyZXR1cm4gKChKYXZhRWxlbWVudCllbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKIAl9CiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBzdGFjayBvZiBvcGVyYXRpb25zIHJ1bm5pbmcgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgotCSAqIFJldHVybnMgYW4gZW1wdHkgc3RhY2sgaWYgbm8gb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW4gdGhpcyB0aHJlYWQuIAorCSAqIFJldHVybnMgYW4gZW1wdHkgc3RhY2sgaWYgbm8gb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW4gdGhpcyB0aHJlYWQuCiAJICovCiAJcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3QgZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCkgewotCQlBcnJheUxpc3Qgc3RhY2sgPSAoQXJyYXlMaXN0KW9wZXJhdGlvblN0YWNrcy5nZXQoKTsKKwkJQXJyYXlMaXN0IHN0YWNrID0gKEFycmF5TGlzdClPUEVSQVRJT05fU1RBQ0tTLmdldCgpOwogCQlpZiAoc3RhY2sgPT0gbnVsbCkgewogCQkJc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvcGVyYXRpb25TdGFja3Muc2V0KHN0YWNrKTsKKwkJCU9QRVJBVElPTl9TVEFDS1Muc2V0KHN0YWNrKTsKIAkJfQogCQlyZXR1cm4gc3RhY2s7CiAJfQpAQCAtNDM4LDIxICs0NDcsMTQgQEAKIAkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIoYnVmZmVyKTsKIAl9CiAJLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gd2hpY2ggdGhpcyBvcGVyYXRpb24gYXBwbGllcywKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXBwbGljYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNUb1Byb2Nlc3MoKSB7Ci0JCXJldHVybiBlbGVtZW50c1RvUHJvY2VzczsKLQl9Ci0JLyoqCiAJICogUmV0dXJucyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGlzIG9wZXJhdGlvbiBhcHBsaWVzLAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlLgogCSAqLwogCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudFRvUHJvY2VzcygpIHsKLQkJaWYgKGVsZW1lbnRzVG9Qcm9jZXNzID09IG51bGwgfHwgZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IDApIHsKKwkJaWYgKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3MgPT0gbnVsbCB8fCB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAwKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gZWxlbWVudHNUb1Byb2Nlc3NbMF07CisJCXJldHVybiB0aGlzLmVsZW1lbnRzVG9Qcm9jZXNzWzBdOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBKYXZhIE1vZGVsIHRoaXMgb3BlcmF0aW9uIGlzIG9wZXJhdGluZyBpbi4KQEAgLTQ4MiwyNiArNDg0LDI2IEBACiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCiAJICovCiAJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KCkgewotCQlpZiAocGFyZW50RWxlbWVudHMgPT0gbnVsbCB8fCBwYXJlbnRFbGVtZW50cy5sZW5ndGggPT0gMCkgeworCQlpZiAodGhpcy5wYXJlbnRFbGVtZW50cyA9PSBudWxsIHx8IHRoaXMucGFyZW50RWxlbWVudHMubGVuZ3RoID09IDApIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBwYXJlbnRFbGVtZW50c1swXTsKKwkJcmV0dXJuIHRoaXMucGFyZW50RWxlbWVudHNbMF07CiAJfQogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhcmVudCBlbGVtZW50cyB0byB3aGljaCB0aGlzIG9wZXJhdGlvbiBhcHBsaWVzLAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlLgogCSAqLwogCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBnZXRQYXJlbnRFbGVtZW50cygpIHsKLQkJcmV0dXJuIHBhcmVudEVsZW1lbnRzOworCQlyZXR1cm4gdGhpcy5wYXJlbnRFbGVtZW50czsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgZWxlbWVudHMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KIAkgKi8KIAlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0UmVzdWx0RWxlbWVudHMoKSB7Ci0JCXJldHVybiByZXN1bHRFbGVtZW50czsKKwkJcmV0dXJuIHRoaXMucmVzdWx0RWxlbWVudHM7CiAJfQogCS8qCi0JICogUmV0dXJucyB0aGUgc2NoZWR1bGluZyBydWxlIGZvciB0aGlzIG9wZXJhdGlvbiAoaS5lLiB0aGUgcmVzb3VyY2UgdGhhdCBuZWVkcyB0byBiZSBsb2NrZWQgCisJICogUmV0dXJucyB0aGUgc2NoZWR1bGluZyBydWxlIGZvciB0aGlzIG9wZXJhdGlvbiAoaS5lLiB0aGUgcmVzb3VyY2UgdGhhdCBuZWVkcyB0byBiZSBsb2NrZWQKIAkgKiB3aGlsZSB0aGlzIG9wZXJhdGlvbiBpcyBydW5uaW5nLgogCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlLgogCSAqLwpAQCAtNTEzLDggKzUxNSw4IEBACiAJICovCiAJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKGludCB3b3JrQW1vdW50KSB7CiAJCUlQcm9ncmVzc01vbml0b3Igc3ViID0gbnVsbDsKLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlzdWIgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgd29ya0Ftb3VudCwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKKwkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXN1YiA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IodGhpcy5wcm9ncmVzc01vbml0b3IsIHdvcmtBbW91bnQsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7CiAJCX0KIAkJcmV0dXJuIHN1YjsKIAl9CkBAIC01MjQsMTkgKzUyNiwxOSBAQAogCSAqIFJldHVybnMgZmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldC4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBoYXNNb2RpZmllZFJlc291cmNlKCkgewotCQlyZXR1cm4gIXRoaXMuaXNSZWFkT25seSgpICYmIGdldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUikgPT0gVFJVRTsgCisJCXJldHVybiAhaXNSZWFkT25seSgpICYmIGdldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUikgPT0gVFJVRTsKIAl9CiAJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IuaW50ZXJuYWxXb3JrZWQod29yayk7CisJCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQl0aGlzLnByb2dyZXNzTW9uaXRvci5pbnRlcm5hbFdvcmtlZCh3b3JrKTsKIAkJfQogCX0KIAkvKioKIAkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOworCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMucHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNTUyLDcgKzU1NCw3IEBACiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNUb3BMZXZlbE9wZXJhdGlvbigpIHsKIAkJQXJyYXlMaXN0IHN0YWNrOwotCQlyZXR1cm4gCisJCXJldHVybgogCQkJKHN0YWNrID0gZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCkpLnNpemUoKSA+IDAKIAkJCSYmIHN0YWNrLmdldCgwKSA9PSB0aGlzOwogCX0KQEAgLTU2OCwxOSArNTcwLDI1IEBACiAJCX0KIAkJcmV0dXJuIC0xOwogCX0KLQkKKwogCS8qKgogCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtb3ZlIHJlc291cmNlcwogCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVSZXNvdXJjZXMoSVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIG1vdmVSZXNvdXJjZXMoSVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBjb250YWluZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJc3ViUHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIHJlc291cmNlcy5sZW5ndGgsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7CisJCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQlzdWJQcm9ncmVzc01vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMucHJvZ3Jlc3NNb25pdG9yLCByZXNvdXJjZXMubGVuZ3RoLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwogCQl9Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gcmVzb3VyY2VzWzBdLmdldFdvcmtzcGFjZSgpOworCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKIAkJdHJ5IHsKLQkJCXdvcmtzcGFjZS5tb3ZlKHJlc291cmNlcywgZGVzdGluYXRpb25QYXRoLCBmYWxzZSwgc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKKwkJCQlJUGF0aCBkZXN0aW5hdGlvbiA9IGNvbnRhaW5lci5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQlpZiAocm9vdC5maW5kTWVtYmVyKGRlc3RpbmF0aW9uKSA9PSBudWxsKSB7CisJCQkJCXJlc291cmNlLm1vdmUoZGVzdGluYXRpb24sIGZhbHNlLCBzdWJQcm9ncmVzc01vbml0b3IpOworCQkJCX0KKwkJCX0KKwkJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQpAQCAtNjAwLDggKzYwOCw4IEBACiAJCUFycmF5TGlzdCBzdGFjayA9IGdldEN1cnJlbnRPcGVyYXRpb25TdGFjaygpOwogCQlpbnQgc2l6ZSA9IHN0YWNrLnNpemUoKTsKIAkJaWYgKHNpemUgPiAwKSB7Ci0JCQlpZiAoc2l6ZSA9PSAxKSB7IC8vIHRvcCBsZXZlbCBvcGVyYXRpb24gCi0JCQkJb3BlcmF0aW9uU3RhY2tzLnNldChudWxsKTsgLy8gcmVsZWFzZSByZWZlcmVuY2UgKHNlZSBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyNykKKwkJCWlmIChzaXplID09IDEpIHsgLy8gdG9wIGxldmVsIG9wZXJhdGlvbgorCQkJCU9QRVJBVElPTl9TVEFDS1Muc2V0KG51bGwpOyAvLyByZWxlYXNlIHJlZmVyZW5jZSAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTI3KQogCQkJfQogCQkJcmV0dXJuIChKYXZhTW9kZWxPcGVyYXRpb24pc3RhY2sucmVtb3ZlKHNpemUtMSk7CiAJCX0gZWxzZSB7CkBAIC02MzAsNyArNjM4LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJCisKIAkJSmF2YU1vZGVsT3BlcmF0aW9uIHRvcExldmVsT3AgPSAoSmF2YU1vZGVsT3BlcmF0aW9uKWdldEN1cnJlbnRPcGVyYXRpb25TdGFjaygpLmdldCgwKTsKIAkJSVBvc3RBY3Rpb25bXSBwb3N0QWN0aW9ucyA9IHRvcExldmVsT3AuYWN0aW9uczsKIAkJaWYgKHBvc3RBY3Rpb25zID09IG51bGwpIHsKQEAgLTY3MCw3ICs2NzgsNyBAQAogCQkJfQogCQl9CiAJCXJldHVybiBmYWxzZTsKLQl9CQorCX0KIAkvKgogCSAqIFB1c2hlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIG9uIHRoZSBzdGFjayBvZiBvcGVyYXRpb25zIGN1cnJlbnRseSBydW5uaW5nIGluIHRoaXMgdGhyZWFkLgogCSAqLwpAQCAtNjg1LDcgKzY5Myw3IEBACiAJCWlmIChQT1NUX0FDVElPTl9WRVJCT1NFKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIpIFtKYXZhTW9kZWxPcGVyYXRpb24ucmVtb3ZlQWxsUG9zdEFjdGlvbihTdHJpbmcpXSBSZW1vdmluZyBhY3Rpb25zICIgKyBhY3Rpb25JRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9Ci0JCQorCiAJCUphdmFNb2RlbE9wZXJhdGlvbiB0b3BMZXZlbE9wID0gKEphdmFNb2RlbE9wZXJhdGlvbilnZXRDdXJyZW50T3BlcmF0aW9uU3RhY2soKS5nZXQoMCk7CiAJCUlQb3N0QWN0aW9uW10gcG9zdEFjdGlvbnMgPSB0b3BMZXZlbE9wLmFjdGlvbnM7CiAJCWlmIChwb3N0QWN0aW9ucyA9PSBudWxsKSByZXR1cm47CkBAIC02OTYsNyArNzA0LDcgQEAKIAkJCXBvc3RBY3Rpb25zW3RvcExldmVsT3AuYWN0aW9uc0VuZC0tXSA9IG51bGw7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSdW5zIHRoaXMgb3BlcmF0aW9uIGFuZCByZWdpc3RlcnMgYW55IGRlbHRhcyBjcmVhdGVkLgogCSAqCkBAIC03MDgsMzIgKzcxNiwzMiBAQAogCQlEZWx0YVByb2Nlc3NvciBkZWx0YVByb2Nlc3NvciA9IG1hbmFnZXIuZ2V0RGVsdGFQcm9jZXNzb3IoKTsKIAkJaW50IHByZXZpb3VzRGVsdGFDb3VudCA9IGRlbHRhUHJvY2Vzc29yLmphdmFNb2RlbERlbHRhcy5zaXplKCk7CiAJCXRyeSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOworCQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwogCQkJcHVzaE9wZXJhdGlvbih0aGlzKTsKIAkJCXRyeSB7CiAJCQkJaWYgKGNhbk1vZGlmeVJvb3RzKCkpIHsKIAkJCQkJLy8gY29tcHV0ZXMgdGhlIHJvb3QgaW5mb3MgYmVmb3JlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCiAJCQkJCS8vIG5vb3AgaWYgYXJlYWR5IGluaXRpYWxpemVkCi0JCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhU3RhdGUuaW5pdGlhbGl6ZVJvb3RzKCk7CisJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0RGVsdGFTdGF0ZSgpLmluaXRpYWxpemVSb290cyhmYWxzZS8qbm90IGluaXRpQWZ0ZXJMb2FkKi8pOwogCQkJCX0KLQkJCQkKKwogCQkJCWV4ZWN1dGVPcGVyYXRpb24oKTsKIAkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRoaXMuaXNUb3BMZXZlbE9wZXJhdGlvbigpKSB7Ci0JCQkJCXRoaXMucnVuUG9zdEFjdGlvbnMoKTsKKwkJCQlpZiAoaXNUb3BMZXZlbE9wZXJhdGlvbigpKSB7CisJCQkJCXJ1blBvc3RBY3Rpb25zKCk7CiAJCQkJfQogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKIAkJCQkvLyByZWFjcXVpcmUgZGVsdGEgcHJvY2Vzc29yIGFzIGl0IGNhbiBoYXZlIGJlZW4gcmVzZXQgZHVyaW5nIGV4ZWN1dGVPcGVyYXRpb24oKQogCQkJCWRlbHRhUHJvY2Vzc29yID0gbWFuYWdlci5nZXREZWx0YVByb2Nlc3NvcigpOwotCQkJCQorCiAJCQkJLy8gdXBkYXRlIEphdmFNb2RlbCB1c2luZyBkZWx0YXMgdGhhdCB3ZXJlIHJlY29yZGVkIGR1cmluZyB0aGlzIG9wZXJhdGlvbgogCQkJCWZvciAoaW50IGkgPSBwcmV2aW91c0RlbHRhQ291bnQsIHNpemUgPSBkZWx0YVByb2Nlc3Nvci5qYXZhTW9kZWxEZWx0YXMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCQkJCWRlbHRhUHJvY2Vzc29yLnVwZGF0ZUphdmFNb2RlbCgoSUphdmFFbGVtZW50RGVsdGEpZGVsdGFQcm9jZXNzb3IuamF2YU1vZGVsRGVsdGFzLmdldChpKSk7CiAJCQkJfQotCQkJCQotCQkJCS8vIGNsb3NlIHRoZSBwYXJlbnRzIG9mIHRoZSBjcmVhdGVkIGVsZW1lbnRzIGFuZCByZXNldCB0aGVpciBwcm9qZWN0J3MgY2FjaGUgKGluIGNhc2Ugd2UgYXJlIGluIGFuIAorCisJCQkJLy8gY2xvc2UgdGhlIHBhcmVudHMgb2YgdGhlIGNyZWF0ZWQgZWxlbWVudHMgYW5kIHJlc2V0IHRoZWlyIHByb2plY3QncyBjYWNoZSAoaW4gY2FzZSB3ZSBhcmUgaW4gYW4KIAkJCQkvLyBJV29ya3NwYWNlUnVubmFibGUgYW5kIHRoZSBjbGllbnRzIHdhbnRzIHRvIHVzZSB0aGUgY3JlYXRlZCBlbGVtZW50J3MgcGFyZW50KQogCQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM2NDYKIAkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5yZXN1bHRFbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtNzUwLDE0ICs3NTgsMTQgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlkZWx0YVByb2Nlc3Nvci5yZXNldFByb2plY3RDYWNoZXMoKTsKLQkJCQkKKwogCQkJCS8vIGZpcmUgb25seSBpZmY6CiAJCQkJLy8gLSB0aGUgb3BlcmF0aW9uIGlzIGEgdG9wIGxldmVsIG9wZXJhdGlvbgogCQkJCS8vIC0gdGhlIG9wZXJhdGlvbiBkaWQgcHJvZHVjZSBzb21lIGRlbHRhKHMpCiAJCQkJLy8gLSBidXQgdGhlIG9wZXJhdGlvbiBoYXMgbm90IG1vZGlmaWVkIGFueSByZXNvdXJjZQotCQkJCWlmICh0aGlzLmlzVG9wTGV2ZWxPcGVyYXRpb24oKSkgewotCQkJCQlpZiAoKGRlbHRhUHJvY2Vzc29yLmphdmFNb2RlbERlbHRhcy5zaXplKCkgPiBwcmV2aW91c0RlbHRhQ291bnQgfHwgIWRlbHRhUHJvY2Vzc29yLnJlY29uY2lsZURlbHRhcy5pc0VtcHR5KCkpIAotCQkJCQkJCSYmICF0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UoKSkgeworCQkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKCkpIHsKKwkJCQkJaWYgKChkZWx0YVByb2Nlc3Nvci5qYXZhTW9kZWxEZWx0YXMuc2l6ZSgpID4gcHJldmlvdXNEZWx0YUNvdW50IHx8ICFkZWx0YVByb2Nlc3Nvci5yZWNvbmNpbGVEZWx0YXMuaXNFbXB0eSgpKQorCQkJCQkJCSYmICFoYXNNb2RpZmllZFJlc291cmNlKCkpIHsKIAkJCQkJCWRlbHRhUHJvY2Vzc29yLmZpcmUobnVsbCwgRGVsdGFQcm9jZXNzb3IuREVGQVVMVF9DSEFOR0VfRVZFTlQpOwogCQkJCQl9IC8vIGVsc2UgZGVsdGFzIGFyZSBmaXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXNvdXJjZSBkZWx0YQogCQkJCX0KQEAgLTc3OSw3ICs3ODcsNyBAQAogCQkJaWYgKGlzUmVhZE9ubHkoKSkgewogCQkJCXJ1bihtb25pdG9yKTsKIAkJCX0gZWxzZSB7Ci0JCQkJLy8gVXNlIElXb3Jrc3BhY2UucnVuKC4uLikgdG8gZW5zdXJlIHRoYXQgYSBidWlsZCB3aWxsIGJlIGRvbmUgaW4gYXV0b2J1aWxkIG1vZGUuCisJCQkJLy8gVXNlIElXb3Jrc3BhY2UucnVuKC4uLikgdG8gZW5zdXJlIHRoYXQgcmVzb3VyY2UgY2hhbmdlcyBhcmUgYmF0Y2hlZAogCQkJCS8vIE5vdGUgdGhhdCBpZiB0aGUgdHJlZSBpcyBsb2NrZWQsIHRoaXMgd2lsbCB0aHJvdyBhIENvcmVFeGNlcHRpb24sIGJ1dCB0aGlzIGlzIG9rCiAJCQkJLy8gYXMgdGhpcyBvcGVyYXRpb24gaXMgbW9kaWZ5aW5nIHRoZSB0cmVlIChub3QgcmVhZC1vbmx5KSBhbmQgYSBDb3JlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGFueXdheS4KIAkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHRoaXMsIGdldFNjaGVkdWxpbmdSdWxlKCksIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBtb25pdG9yKTsKQEAgLTgyNCw4ICs4MzIsOCBAQAogCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgogCSAqLwogCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgewotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZChiKTsKKwkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKGIpOwogCQl9CiAJfQogCS8qKgpAQCAtODMzLDIyICs4NDEsMjIgQEAKIAkgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2NoZWNrQ2FuY2VsZWQKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBzZXROZXN0ZWQoYm9vbGVhbiBuZXN0ZWQpIHsKLQkJaXNOZXN0ZWQgPSBuZXN0ZWQ7CisJCXRoaXMuaXNOZXN0ZWQgPSBuZXN0ZWQ7CiAJfQogCS8qKgogCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgogCSAqLwogCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLnNldFRhc2tOYW1lKG5hbWUpOworCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJdGhpcy5wcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUobmFtZSk7CiAJCX0KIAl9CiAJLyoqCiAJICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCiAJICovCiAJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKG5hbWUpOworCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJdGhpcy5wcm9ncmVzc01vbml0b3Iuc3ViVGFzayhuYW1lKTsKIAkJfQogCX0KIAkvKioKQEAgLTg2NCwxMyArODcyLDEzIEBACiAJcHJvdGVjdGVkIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgewogCQlyZXR1cm4gY29tbW9uVmVyaWZ5KCk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCiAJICovCiAJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCh3b3JrKTsKKwkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCh3b3JrKTsKIAkJCWNoZWNrQ2FuY2VsZWQoKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKaW5kZXggZTg0ZDQ4Ni4uMWEwMDM1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsU3RhdHVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsNyArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKQEAgLTMwLDcgKzI5LDcgQEAKICAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cwogICovCiAKLXB1YmxpYyBjbGFzcyBKYXZhTW9kZWxTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgaW1wbGVtZW50cyBJSmF2YU1vZGVsU3RhdHVzLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLCBJUmVzb3VyY2VTdGF0dXMgeworcHVibGljIGNsYXNzIEphdmFNb2RlbFN0YXR1cyBleHRlbmRzIFN0YXR1cyBpbXBsZW1lbnRzIElKYXZhTW9kZWxTdGF0dXMsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMgewogCiAJLyoqCiAJICogVGhlIGVsZW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGZhaWx1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CkBAIC01Niw3ICs1NSw3IEBACiAJLyoqCiAJICogU2luZ2xldG9uIE9LIG9iamVjdAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUphdmFNb2RlbFN0YXR1cyBWRVJJRklFRF9PSyA9IG5ldyBKYXZhTW9kZWxTdGF0dXMoT0ssIE9LLCBNZXNzYWdlcy5zdGF0dXNfT0spOyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhTW9kZWxTdGF0dXMgVkVSSUZJRURfT0sgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKE9LLCBPSywgTWVzc2FnZXMuc3RhdHVzX09LKTsKIAogCS8qKgogCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgpAQCAtOTUsNyArOTQsNyBAQAogCQl0aGlzLmVsZW1lbnRzPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKIAkJdGhpcy5wYXRoPSBudWxsOwogCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQl9CQorCX0KIAkvKioKIAkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggbm8gY29ycmVzcG9uZGluZyBlbGVtZW50cy4KIAkgKi8KQEAgLTE0NCw3ICsxNDMsNyBAQAogCQl0aGlzKGNvZGUsIG5ldyBJSmF2YUVsZW1lbnRbXXtlbGVtZW50fSk7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCX0JCisJfQogCiAJLyoqCiAgICAgICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIHRoZSBnaXZlbiBjb3JyZXNwb25kaW5nCkBAIC0xNjIsNyArMTYxLDcgQEAKIAkgKi8KIAlwdWJsaWMgSmF2YU1vZGVsU3RhdHVzKENvcmVFeGNlcHRpb24gY29yZUV4Y2VwdGlvbikgewogCQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBDT1JFX0VYQ0VQVElPTiwgIkphdmFNb2RlbFN0YXR1cyIsIGNvcmVFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnRzPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKKwkJdGhpcy5lbGVtZW50cz0gSmF2YUVsZW1lbnQuTk9fRUxFTUVOVFM7CiAJfQogCXByb3RlY3RlZCBpbnQgZ2V0Qml0cygpIHsKIAkJaW50IHNldmVyaXR5ID0gMSA8PCAoZ2V0Q29kZSgpICUgMTAwIC8gMzMpOwpAQCAtMTczLDEzICsxNzIsMTMgQEAKIAkgKiBAc2VlIElTdGF0dXMKIAkgKi8KIAlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47CisJCXJldHVybiB0aGlzLmNoaWxkcmVuOwogCX0KIAkvKioKIAkgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKIAkgKi8KIAlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudHM7CiAJfQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBpcyByZWxldmFudCB0byB0aGUgY29kZSBvZiB0aGlzIHN0YXR1cy4KQEAgLTE4OSwyMTIgKzE4OCwyMTUgQEAKIAkJaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSB7CiAJCQlzd2l0Y2ggKGdldENvZGUoKSkgewogCQkJCWNhc2UgQ09SRV9FWENFUFRJT04gOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhdHVzX2NvcmVFeGNlcHRpb247IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhdHVzX2NvcmVFeGNlcHRpb247CiAKIAkJCQljYXNlIEJVSUxERVJfSU5JVElBTElaQVRJT05fRVJST1I6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5idWlsZF9pbml0aWFsaXphdGlvbkVycm9yOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJ1aWxkX2luaXRpYWxpemF0aW9uRXJyb3I7CiAKIAkJCQljYXNlIEJVSUxERVJfU0VSSUFMSVpBVElPTl9FUlJPUjoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJ1aWxkX3NlcmlhbGl6YXRpb25FcnJvcjsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5idWlsZF9zZXJpYWxpemF0aW9uRXJyb3I7CiAKIAkJCQljYXNlIERFVklDRV9QQVRIOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfY2Fubm90VXNlRGV2aWNlT25QYXRoLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfY2Fubm90VXNlRGV2aWNlT25QYXRoLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7CiAKIAkJCQljYXNlIERPTV9FWENFUFRJT046Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfSkRPTUVycm9yOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c19KRE9NRXJyb3I7CiAKIAkJCQljYXNlIEVMRU1FTlRfRE9FU19OT1RfRVhJU1Q6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmVsZW1lbnRfZG9lc05vdEV4aXN0LCAoKEphdmFFbGVtZW50KWVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5lbGVtZW50X2RvZXNOb3RFeGlzdCwgKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7CiAKIAkJCQljYXNlIEVMRU1FTlRfTk9UX09OX0NMQVNTUEFUSDoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZWxlbWVudF9ub3RPbkNsYXNzcGF0aCwgKChKYXZhRWxlbWVudCllbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZWxlbWVudF9ub3RPbkNsYXNzcGF0aCwgKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7CiAKIAkJCQljYXNlIEVWQUxVQVRJT05fRVJST1I6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19ldmFsdWF0aW9uRXJyb3IsIHN0cmluZyk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfZXZhbHVhdGlvbkVycm9yLCB0aGlzLnN0cmluZyk7CiAKIAkJCQljYXNlIElOREVYX09VVF9PRl9CT1VORFM6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfaW5kZXhPdXRPZkJvdW5kczsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfaW5kZXhPdXRPZkJvdW5kczsKIAogCQkJCWNhc2UgSU5WQUxJRF9DT05URU5UUzoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c19pbnZhbGlkQ29udGVudHM7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhdHVzX2ludmFsaWRDb250ZW50czsKIAogCQkJCWNhc2UgSU5WQUxJRF9ERVNUSU5BVElPTjoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX2ludmFsaWREZXN0aW5hdGlvbiwgKChKYXZhRWxlbWVudCllbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX2ludmFsaWREZXN0aW5hdGlvbiwgKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7CiAKIAkJCQljYXNlIElOVkFMSURfRUxFTUVOVF9UWVBFUzoKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoTWVzc2FnZXMub3BlcmF0aW9uX25vdFN1cHBvcnRlZCk7IAotCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoTWVzc2FnZXMub3BlcmF0aW9uX25vdFN1cHBvcnRlZCk7CisJCQkJCWZvciAoaW50IGk9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAoaSA+IDApIHsKIAkJCQkJCQlidWZmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQotCQkJCQkJYnVmZi5hcHBlbmQoKChKYXZhRWxlbWVudCllbGVtZW50c1tpXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOworCQkJCQkJYnVmZi5hcHBlbmQoKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzW2ldKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7CiAJCQkJCX0KIAkJCQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKIAogCQkJCWNhc2UgSU5WQUxJRF9OQU1FOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZE5hbWUsIHN0cmluZyk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZE5hbWUsIHRoaXMuc3RyaW5nKTsKIAogCQkJCWNhc2UgSU5WQUxJRF9QQUNLQUdFOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFBhY2thZ2UsIHN0cmluZyk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFBhY2thZ2UsIHRoaXMuc3RyaW5nKTsKIAogCQkJCWNhc2UgSU5WQUxJRF9QQVRIOgotCQkJCQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBzdHJpbmc7CisJCQkJCWlmICh0aGlzLnN0cmluZyAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdHJpbmc7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZCgKIAkJCQkJCQlNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFBhdGgsCiAJCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRQYXRoKCkgPT0gbnVsbCA/ICJudWxsIiA6IGdldFBhdGgoKS50b1N0cmluZygpfSAvLyROT04tTkxTLTEkCi0JCQkJCQkpOyAKKwkJCQkJCSk7CiAJCQkJCX0KIAogCQkJCWNhc2UgSU5WQUxJRF9QUk9KRUNUOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFByb2plY3QsIHN0cmluZyk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFByb2plY3QsIHRoaXMuc3RyaW5nKTsKIAogCQkJCWNhc2UgSU5WQUxJRF9SRVNPVVJDRToKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX2ludmFsaWRSZXNvdXJjZSwgc3RyaW5nKTsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19pbnZhbGlkUmVzb3VyY2UsIHRoaXMuc3RyaW5nKTsKIAogCQkJCWNhc2UgSU5WQUxJRF9SRVNPVVJDRV9UWVBFOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFJlc291cmNlVHlwZSwgc3RyaW5nKTsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19pbnZhbGlkUmVzb3VyY2VUeXBlLCB0aGlzLnN0cmluZyk7CiAKIAkJCQljYXNlIElOVkFMSURfU0lCTElORzoKLQkJCQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFNpYmxpbmcsIHN0cmluZyk7IAorCQkJCQlpZiAodGhpcy5zdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX2ludmFsaWRTaWJsaW5nLCB0aGlzLnN0cmluZyk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFNpYmxpbmcsICgoSmF2YUVsZW1lbnQpZWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgCisJCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfaW52YWxpZFNpYmxpbmcsICgoSmF2YUVsZW1lbnQpdGhpcy5lbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOwogCQkJCQl9CiAKIAkJCQljYXNlIElPX0VYQ0VQVElPTjoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c19JT0V4Y2VwdGlvbjsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfSU9FeGNlcHRpb247CiAKIAkJCQljYXNlIE5BTUVfQ09MTElTSU9OOgotCQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzWzBdOworCQkJCQlpZiAodGhpcy5lbGVtZW50cyAhPSBudWxsICYmIHRoaXMuZWxlbWVudHMubGVuZ3RoID4gMCkgeworCQkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzWzBdOwogCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnQgJiYgKChQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQpLmlzRGVmYXVsdFBhY2thZ2UoKSkgewotCQkJCQkJCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY2Fubm90UmVuYW1lRGVmYXVsdFBhY2thZ2U7IAorCQkJCQkJCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fY2Fubm90UmVuYW1lRGVmYXVsdFBhY2thZ2U7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gc3RyaW5nOworCQkJCQlpZiAodGhpcy5zdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3RyaW5nOwogCQkJCQl9IGVsc2UgewogCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25hbWVDb2xsaXNpb24sICIiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCWNhc2UgTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUzoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9uZWVkRWxlbWVudHM7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX25lZWRFbGVtZW50czsKIAogCQkJCWNhc2UgTlVMTF9OQU1FOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX25lZWROYW1lOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9uZWVkTmFtZTsKIAogCQkJCWNhc2UgTlVMTF9QQVRIOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX25lZWRQYXRoOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9uZWVkUGF0aDsKIAogCQkJCWNhc2UgTlVMTF9TVFJJTkc6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fbmVlZFN0cmluZzsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fbmVlZFN0cmluZzsKIAogCQkJCWNhc2UgUEFUSF9PVVRTSURFX1BST0pFQ1Q6Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLm9wZXJhdGlvbl9wYXRoT3V0c2lkZVByb2plY3QsIG5ldyBTdHJpbmdbXSB7c3RyaW5nLCAoKEphdmFFbGVtZW50KWVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKX0pOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMub3BlcmF0aW9uX3BhdGhPdXRzaWRlUHJvamVjdCwgbmV3IFN0cmluZ1tdIHt0aGlzLnN0cmluZywgKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKX0pOwogCiAJCQkJY2FzZSBSRUFEX09OTFk6Ci0JCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbMF07CisJCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gdGhpcy5lbGVtZW50c1swXTsKIAkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7CiAJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCAmJiBuYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgewotCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c19kZWZhdWx0UGFja2FnZVJlYWRPbmx5OyAKKwkJCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfZGVmYXVsdFBhY2thZ2VSZWFkT25seTsKIAkJCQkJfQotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfcmVhZE9ubHksIG5hbWUpOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX3JlYWRPbmx5LCBuYW1lKTsKIAogCQkJCWNhc2UgUkVMQVRJVkVfUEFUSDoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMub3BlcmF0aW9uX25lZWRBYnNvbHV0ZVBhdGgsIGdldFBhdGgoKS50b1N0cmluZygpKTsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLm9wZXJhdGlvbl9uZWVkQWJzb2x1dGVQYXRoLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7CiAKIAkJCQljYXNlIFRBUkdFVF9FWENFUFRJT046Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfdGFyZ2V0RXhjZXB0aW9uOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c190YXJnZXRFeGNlcHRpb247CiAKIAkJCQljYXNlIFVQREFURV9DT05GTElDVDoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXR1c191cGRhdGVDb25mbGljdDsgCisJCQkJCXJldHVybiBNZXNzYWdlcy5zdGF0dXNfdXBkYXRlQ29uZmxpY3Q7CiAKIAkJCQljYXNlIE5PX0xPQ0FMX0NPTlRFTlRTIDoKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25vTG9jYWxDb250ZW50cywgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX25vTG9jYWxDb250ZW50cywgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwogCiAJCQkJY2FzZSBDUF9DT05UQUlORVJfUEFUSF9VTkJPVU5EOgotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KWVsZW1lbnRzWzBdOworCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMuZWxlbWVudHNbMF07CiAJCQkJCUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIodGhpcy5wYXRoLnNlZ21lbnQoMCkpOwogCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwogCQkJCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgZGVzY3JpcHRpb24gPSBpbml0aWFsaXplci5nZXREZXNjcmlwdGlvbih0aGlzLnBhdGgsIGphdmFQcm9qZWN0KTsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIGRlc2NyaXB0aW9uID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZENvbnRhaW5lclBhdGgsIG5ldyBTdHJpbmdbXSB7ZGVzY3JpcHRpb24sIGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KTsgCisJCQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSBkZXNjcmlwdGlvbiA9IHRoaXMucGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfdW5ib3VuZENvbnRhaW5lclBhdGgsIG5ldyBTdHJpbmdbXSB7ZGVzY3JpcHRpb24sIGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KTsKIAogCQkJCWNhc2UgSU5WQUxJRF9DUF9DT05UQUlORVJfRU5UUlk6Ci0JCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCllbGVtZW50c1swXTsKKwkJCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMuZWxlbWVudHNbMF07CiAJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKIAkJCQkJZGVzY3JpcHRpb24gPSBudWxsOwogCQkJCQl0cnkgewotCQkJCQkJY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHBhdGgsIGphdmFQcm9qZWN0KTsKKwkJCQkJCWNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcih0aGlzLnBhdGgsIGphdmFQcm9qZWN0KTsKIAkJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CiAJCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3Q6IGlnbm9yZQogCQkJCQl9CiAJCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJCQkJIGluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIocGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKSBkZXNjcmlwdGlvbiA9IGluaXRpYWxpemVyLmdldERlc2NyaXB0aW9uKHBhdGgsIGphdmFQcm9qZWN0KTsKKwkJCQkJCSBpbml0aWFsaXplciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKHRoaXMucGF0aC5zZWdtZW50KDApKTsKKwkJCQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKSBkZXNjcmlwdGlvbiA9IGluaXRpYWxpemVyLmdldERlc2NyaXB0aW9uKHRoaXMucGF0aCwgamF2YVByb2plY3QpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJZGVzY3JpcHRpb24gPSBjb250YWluZXIuZ2V0RGVzY3JpcHRpb24oKTsKIAkJCQkJfQotCQkJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgZGVzY3JpcHRpb24gPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbnZhbGlkQ29udGFpbmVyLCBuZXcgU3RyaW5nW10ge2Rlc2NyaXB0aW9uLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSk7IAorCQkJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgZGVzY3JpcHRpb24gPSB0aGlzLnBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2ludmFsaWRDb250YWluZXIsIG5ldyBTdHJpbmdbXSB7ZGVzY3JpcHRpb24sIGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KTsKIAogCQkJCWNhc2UgQ1BfVkFSSUFCTEVfUEFUSF9VTkJPVU5EOgotCQkJCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpZWxlbWVudHNbMF07Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kVmFyaWFibGVQYXRoLCBuZXcgU3RyaW5nW10ge3BhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKX0pOyAKKwkJCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMuZWxlbWVudHNbMF07CisJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF91bmJvdW5kVmFyaWFibGVQYXRoLCBuZXcgU3RyaW5nW10ge3RoaXMucGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpfSk7CiAKLQkJCQljYXNlIENMQVNTUEFUSF9DWUNMRTogCi0JCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCllbGVtZW50c1swXTsKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2N5Y2xlLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKTsgCisJCQkJY2FzZSBDTEFTU1BBVEhfQ1lDTEU6CisJCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCl0aGlzLmVsZW1lbnRzWzBdOworCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfY3ljbGUsIG5ldyBTdHJpbmdbXSB7amF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5zdHJpbmd9KTsKIAogCQkJCWNhc2UgRElTQUJMRURfQ1BfRVhDTFVTSU9OX1BBVFRFUk5TOgotCQkJCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpZWxlbWVudHNbMF07CisJCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCl0aGlzLmVsZW1lbnRzWzBdOwogCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQlJUGF0aCBuZXdQYXRoID0gcGF0aDsKLQkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKLQkJCQkJCW5ld1BhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CisJCQkJCUlQYXRoIG5ld1BhdGggPSB0aGlzLnBhdGg7CisJCQkJCWlmICh0aGlzLnBhdGguc2VnbWVudCgwKS50b1N0cmluZygpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKKwkJCQkJCW5ld1BhdGggPSB0aGlzLnBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKIAkJCQkJfQotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZGlzYWJsZWRJbmNsdXNpb25FeGNsdXNpb25QYXR0ZXJucywgbmV3IFN0cmluZ1tdIHtuZXdQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIHByb2plY3ROYW1lfSk7IAorCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZGlzYWJsZWRJbmNsdXNpb25FeGNsdXNpb25QYXR0ZXJucywgbmV3IFN0cmluZ1tdIHtuZXdQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIHByb2plY3ROYW1lfSk7CiAKIAkJCQljYXNlIERJU0FCTEVEX0NQX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlM6Ci0JCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCllbGVtZW50c1swXTsKKwkJCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMuZWxlbWVudHNbMF07CiAJCQkJCXByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJbmV3UGF0aCA9IHBhdGg7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0JCQkJCQluZXdQYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCQkJCQluZXdQYXRoID0gdGhpcy5wYXRoOworCQkJCQlpZiAodGhpcy5wYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7CisJCQkJCQluZXdQYXRoID0gdGhpcy5wYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CiAJCQkJCX0KLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoX2Rpc2FibGVkTXVsdGlwbGVPdXRwdXRMb2NhdGlvbnMsIG5ldyBTdHJpbmdbXSB7bmV3UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLCBwcm9qZWN0TmFtZX0pOyAKLQotCQkJCWNhc2UgSU5DT01QQVRJQkxFX0pES19MRVZFTDoKLQkJCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCllbGVtZW50c1swXTsKLQkJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzcGF0aF9pbmNvbXBhdGlibGVMaWJyYXJ5SkRLTGV2ZWwsIG5ldyBTdHJpbmdbXXsJCi0JCQkJCQkJamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSwgCi0JCQkJCQkJamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCB0cnVlKSwgCi0JCQkJCQkJcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLAotCQkJCQkJCXN0cmluZywKLQkJCQkJCX0pOworCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZGlzYWJsZWRNdWx0aXBsZU91dHB1dExvY2F0aW9ucywgbmV3IFN0cmluZ1tdIHtuZXdQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIHByb2plY3ROYW1lfSk7CiAKIAkJCQljYXNlIENBTk5PVF9SRVRSSUVWRV9BVFRBQ0hFRF9KQVZBRE9DIDoKLQkJCQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID09IDEpIHsKKwkJCQkJaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCAmJiB0aGlzLmVsZW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAJCQkJCQlpZiAodGhpcy5zdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19jYW5ub3RfcmV0cmlldmVfYXR0YWNoZWRfamF2YWRvYywgKChKYXZhRWxlbWVudCllbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCksIHRoaXMuc3RyaW5nKTsgCisJCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX2Nhbm5vdF9yZXRyaWV2ZV9hdHRhY2hlZF9qYXZhZG9jLCAoKEphdmFFbGVtZW50KXRoaXMuZWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpLCB0aGlzLnN0cmluZyk7CiAJCQkJCQl9Ci0JCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfY2Fubm90X3JldHJpZXZlX2F0dGFjaGVkX2phdmFkb2MsICgoSmF2YUVsZW1lbnQpZWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19jYW5ub3RfcmV0cmlldmVfYXR0YWNoZWRfamF2YWRvYywgKChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSwgIiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJaWYgKHRoaXMuc3RyaW5nICE9IG51bGwpIHsKIAkJCQkJCXJldHVybiBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLnN0YXR1c19jYW5ub3RfcmV0cmlldmVfYXR0YWNoZWRfamF2YWRvYywgdGhpcy5zdHJpbmcsICIiKTsvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgQ0FOTk9UX1JFVFJJRVZFX0FUVEFDSEVEX0pBVkFET0NfVElNRU9VVCA6CisJCQkJCWlmICh0aGlzLmVsZW1lbnRzICE9IG51bGwgJiYgdGhpcy5lbGVtZW50cy5sZW5ndGggPT0gMSkgeworCQkJCQkJaWYgKHRoaXMuc3RyaW5nICE9IG51bGwpIHsKKwkJCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfdGltZW91dF9qYXZhZG9jLCAoKEphdmFFbGVtZW50KXRoaXMuZWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpLCB0aGlzLnN0cmluZyk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfdGltZW91dF9qYXZhZG9jLCAoKEphdmFFbGVtZW50KXRoaXMuZWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5zdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX3RpbWVvdXRfamF2YWRvYywgdGhpcy5zdHJpbmcsICIiKTsvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFVOS05PV05fSkFWQURPQ19GT1JNQVQgOgotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5zdGF0dXNfdW5rbm93bl9qYXZhZG9jX2Zvcm1hdCwgKChKYXZhRWxlbWVudCllbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAKKwkJCQkJcmV0dXJuIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuc3RhdHVzX3Vua25vd25famF2YWRvY19mb3JtYXQsICgoSmF2YUVsZW1lbnQpdGhpcy5lbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOwogCiAJCQkJY2FzZSBERVBSRUNBVEVEX1ZBUklBQkxFIDoKLQkJCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KWVsZW1lbnRzWzBdOwotCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZGVwcmVjYXRlZF92YXJpYWJsZSwgbmV3IFN0cmluZ1tdIHtwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKSwgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5zdHJpbmd9KTsgCisJCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCl0aGlzLmVsZW1lbnRzWzBdOworCQkJCQlyZXR1cm4gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc3BhdGhfZGVwcmVjYXRlZF92YXJpYWJsZSwgbmV3IFN0cmluZ1tdIHt0aGlzLnBhdGguc2VnbWVudCgwKS50b1N0cmluZygpLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLCB0aGlzLnN0cmluZ30pOwogCQkJfQotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN0cmluZzsKKwkJCWlmICh0aGlzLnN0cmluZyAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoaXMuc3RyaW5nOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KQEAgLTQxMSwxNiArNDEzLDE2IEBACiAJICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzI2dldFBhdGgoKQogCSAqLwogCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKKwkJcmV0dXJuIHRoaXMucGF0aDsKIAl9CiAJLyoqCiAJICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlpZiAoY2hpbGRyZW4gPT0gTk9fQ0hJTERSRU4pIHJldHVybiBzdXBlci5nZXRTZXZlcml0eSgpOworCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBOT19DSElMRFJFTikgcmV0dXJuIHN1cGVyLmdldFNldmVyaXR5KCk7CiAJCWludCBzZXZlcml0eSA9IC0xOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWludCBjaGlsZHJlblNldmVyaXR5ID0gY2hpbGRyZW5baV0uZ2V0U2V2ZXJpdHkoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWludCBjaGlsZHJlblNldmVyaXR5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRTZXZlcml0eSgpOwogCQkJaWYgKGNoaWxkcmVuU2V2ZXJpdHkgPiBzZXZlcml0eSkgewogCQkJCXNldmVyaXR5ID0gY2hpbGRyZW5TZXZlcml0eTsKIAkJCX0KQEAgLTQzMiw3ICs0MzQsNyBAQAogCSAqIEBkZXByZWNhdGVkCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBzdHJpbmc7CisJCXJldHVybiB0aGlzLnN0cmluZzsKIAl9CiAJLyoqCiAJICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzI2lzRG9lc05vdEV4aXN0KCkKQEAgLTQ0NSw3ICs0NDcsNyBAQAogCSAqIEBzZWUgSVN0YXR1cyNpc011bHRpU3RhdHVzKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQlyZXR1cm4gY2hpbGRyZW4gIT0gTk9fQ0hJTERSRU47CisJCXJldHVybiB0aGlzLmNoaWxkcmVuICE9IE5PX0NISUxEUkVOOwogCX0KIAkvKioKIAkgKiBAc2VlIElTdGF0dXMjaXNPSygpCkBAIC00NjAsOCArNDYyLDggQEAKIAkJaWYgKCEgaXNNdWx0aVN0YXR1cygpKSB7CiAJCQlyZXR1cm4gbWF0Y2hlcyh0aGlzLCBtYXNrKTsKIAkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCWlmIChtYXRjaGVzKChKYXZhTW9kZWxTdGF0dXMpIGNoaWxkcmVuW2ldLCBtYXNrKSkKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKG1hdGNoZXMoKEphdmFNb2RlbFN0YXR1cykgdGhpcy5jaGlsZHJlbltpXSwgbWFzaykpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0LmphdmEKaW5kZXggYTBjN2RmYy4uMTgwNTdhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gPHN0ZXBoYW5AY3MudHUtYmVybGluLmRlPiAtIGluY29uc2lzdGVudCBpbml0aWFsaXphdGlvbiBvZiBjbGFzc3BhdGggY29udGFpbmVyIGJhY2tlZCBieSBleHRlcm5hbCBjbGFzcyBmb2xkZXIsIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwNjE4CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKQEAgLTE3LDYgKzE4LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwpAQCAtMzQsMTYgKzM3LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwpAQCAtNjksNiArNzMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0RWxlbWVudEluZm8uUHJvamVjdENhY2hlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuSmF2YUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZXZhbC5FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5KYXZhRWxlbWVudEZpbmRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lbWVudG9Ub2tlbml6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CkBAIC0xMDEsMTIgKzEwNiwxMiBAQAogcHVibGljIGNsYXNzIEphdmFQcm9qZWN0CiAJZXh0ZW5kcyBPcGVuYWJsZQogCWltcGxlbWVudHMgSUphdmFQcm9qZWN0LCBJUHJvamVjdE5hdHVyZSwgU3VmZml4Q29uc3RhbnRzIHsKLQkKKwogCS8qKgogCSAqIE5hbWUgb2YgZmlsZSBjb250YWluaW5nIHByb2plY3QgY2xhc3NwYXRoCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0ZJTEVOQU1FID0gIi5jbGFzc3BhdGgiOyAgLy8kTk9OLU5MUy0xJAotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9GSUxFTkFNRSA9IElKYXZhUHJvamVjdC5DTEFTU1BBVEhfRklMRV9OQU1FOworCiAJLyoqCiAJICogVmFsdWUgb2YgdGhlIHByb2plY3QncyByYXcgY2xhc3NwYXRoIGlmIHRoZSAuY2xhc3NwYXRoIGZpbGUgY29udGFpbnMgaW52YWxpZCBlbnRyaWVzLgogCSAqLwpAQCAtMTI3LDI3ICsxMzIsNDMgQEAKIAkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTI1OCI+YnVnIDU5MjU4PC9hPgogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0ZJTEVOQU1FID0gIi5qcHJlZnMiOyAgLy8kTk9OLU5MUy0xJAotCQorCiAJLyoqCiAJICogTmFtZSBvZiBkaXJlY3RvcnkgY29udGFpbmluZyBwcmVmZXJlbmNlcyBmaWxlCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUkVGRVJFTkNFU19ESVJOQU1FID0gIi5zZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qKgogCSAqIEV4dGVuc2lvbiBmb3IgZmlsZSBjb250YWluaW5nIGN1c3RvbSBwcm9qZWN0IHByZWZlcmVuY2VzCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9DT1JFX1BSRUZTX0ZJTEUgPSBKYXZhQ29yZS5QTFVHSU5fSUQrIi5wcmVmcyI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCS8qCiAJICogVmFsdWUgb2YgcHJvamVjdCdzIHJlc29sdmVkIGNsYXNzcGF0aCB3aGlsZSBpdCBpcyBiZWluZyByZXNvbHZlZAogCSAqLwogCXByaXZhdGUgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIFJFU09MVVRJT05fSU5fUFJPR1JFU1MgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwogCisJLyoKKwkgKiBGb3IgdGVzdGluZyBwdXJwb3NlIG9ubHkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgQ1BfUkVTT0xVVElPTl9CUF9MSVNURU5FUlM7CisJcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc3BhdGhSZXNvbHV0aW9uQnJlYWtwb2ludExpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgYnJlYWtwb2ludChpbnQgYnApIHsKKwkJCS8vIG92ZXJyaWRlIGluIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisJCX0KKwl9CisKIAkvKioKIAkgKiBUaGUgcGxhdGZvcm0gcHJvamVjdCB0aGlzIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gaXMgYmFzZWQgb24KIAkgKi8KIAlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQkKKworCS8qKgorCSAqIFByZWZlcmVuY2VzIGxpc3RlbmVycworCSAqLworCXByaXZhdGUgSUVjbGlwc2VQcmVmZXJlbmNlcy5JTm9kZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VzTm9kZUxpc3RlbmVyOworCXByaXZhdGUgSUVjbGlwc2VQcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXI7CisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBuZWVkZWQgZm9yIDxjb2RlPklQcm9qZWN0LmdldE5hdHVyZSgpPC9jb2RlPiBhbmQgPGNvZGU+SVByb2plY3QuYWRkTmF0dXJlKCk8L2NvZGU+LgogCSAqCkBAIC0xNTYsMTQgKzE3Nyw0OSBAQAogCXB1YmxpYyBKYXZhUHJvamVjdCgpIHsKIAkJc3VwZXIobnVsbCk7CiAJfQotCQorCiAJcHVibGljIEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIEphdmFFbGVtZW50IHBhcmVudCkgewogCQlzdXBlcihwYXJlbnQpOwogCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogCX0KIAorCS8qCisJICogRm9yIHRlc3RpbmcgcHVycG9zZSBvbmx5CisJICovCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDUFJlc29sdXRpb25CUExpc3RlbmVyKENsYXNzcGF0aFJlc29sdXRpb25CcmVha3BvaW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKENQX1JFU09MVVRJT05fQlBfTElTVEVORVJTID09IG51bGwpCisJCQlDUF9SRVNPTFVUSU9OX0JQX0xJU1RFTkVSUyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJQ1BfUkVTT0xVVElPTl9CUF9MSVNURU5FUlMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKgorCSAqIEZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seQorCSAqLworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ1BSZXNvbHV0aW9uQlBMaXN0ZW5lcihDbGFzc3BhdGhSZXNvbHV0aW9uQnJlYWtwb2ludExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmIChDUF9SRVNPTFVUSU9OX0JQX0xJU1RFTkVSUyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlDUF9SRVNPTFVUSU9OX0JQX0xJU1RFTkVSUy5yZW1vdmUobGlzdGVuZXIpOworCQlpZiAoQ1BfUkVTT0xVVElPTl9CUF9MSVNURU5FUlMuc2l6ZSgpID09IDApCisJCQlDUF9SRVNPTFVUSU9OX0JQX0xJU1RFTkVSUyA9IG51bGw7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIENsYXNzcGF0aFJlc29sdXRpb25CcmVha3BvaW50TGlzdGVuZXJbXSBnZXRCUExpc3RlbmVycygpIHsKKwkJaWYgKENQX1JFU09MVVRJT05fQlBfTElTVEVORVJTID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChDbGFzc3BhdGhSZXNvbHV0aW9uQnJlYWtwb2ludExpc3RlbmVyW10pIENQX1JFU09MVVRJT05fQlBfTElTVEVORVJTLnRvQXJyYXkobmV3IENsYXNzcGF0aFJlc29sdXRpb25CcmVha3BvaW50TGlzdGVuZXJbQ1BfUkVTT0xVVElPTl9CUF9MSVNURU5FUlMuc2l6ZSgpXSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBicmVha3BvaW50KGludCBicCwgSmF2YVByb2plY3QgcHJvamVjdCkgeworCQlDbGFzc3BhdGhSZXNvbHV0aW9uQnJlYWtwb2ludExpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2V0QlBMaXN0ZW5lcnMoKTsKKwkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQlsaXN0ZW5lcnNbal0uYnJlYWtwb2ludChicCk7CisJCX0KKwl9CisKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQ2xhc3NwYXRoc0VxdWFsKAotCQkJSUNsYXNzcGF0aEVudHJ5W10gZmlyc3RDbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHNlY29uZENsYXNzcGF0aCwgCisJCQlJQ2xhc3NwYXRoRW50cnlbXSBmaXJzdENsYXNzcGF0aCwgSUNsYXNzcGF0aEVudHJ5W10gc2Vjb25kQ2xhc3NwYXRoLAogCQkJSVBhdGggZmlyc3RPdXRwdXRMb2NhdGlvbiwgSVBhdGggc2Vjb25kT3V0cHV0TG9jYXRpb24pIHsKIAkJaW50IGxlbmd0aCA9IGZpcnN0Q2xhc3NwYXRoLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCAhPSBzZWNvbmRDbGFzc3BhdGgubGVuZ3RoKSByZXR1cm4gZmFsc2U7CkBAIC0xOTAsMTEgKzI0NiwxMSBAQAogCQkJcmV0dXJuIGZhbHNlOwogCiAJCWludCBsZW5ndGggPSBvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXQubGVuZ3RoOwotCQlpZiAobGVuZ3RoICE9IG5ld0NsYXNzcGF0aC5sZW5ndGggKyAxKSAKKwkJaWYgKGxlbmd0aCAhPSBuZXdDbGFzc3BhdGgubGVuZ3RoICsgMSkKIAkJCQkvLyBvdXRwdXQgaXMgYW1vbmdzdCBmaWxlIGVudHJpZXMgKGxhc3Qgb25lKQogCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCQorCisKIAkJLy8gY29tcGFyZSBjbGFzc3BhdGggZW50cmllcwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgewogCQkJaWYgKCFvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXRbaV0uZXF1YWxzKG5ld0NsYXNzcGF0aFtpXSkpCkBAIC0yMDcsNiArMjYzLDIwIEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiB0cnVlOwogCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZUNsYXNzcGF0aHNFcXVhbChJQ2xhc3NwYXRoRW50cnlbXSBmaXJzdCwgSUNsYXNzcGF0aEVudHJ5W10gc2Vjb25kKSB7CisJCWlmIChmaXJzdCAhPSBzZWNvbmQpeworCQkgICAgaWYgKGZpcnN0ID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCWludCBsZW5ndGggPSBmaXJzdC5sZW5ndGg7CisJCQlpZiAoc2Vjb25kID09IG51bGwgfHwgc2Vjb25kLmxlbmd0aCAhPSBsZW5ndGgpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICghZmlyc3RbaV0uZXF1YWxzKHNlY29uZFtpXSkpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGEgY2Fub25pY2FsaXplZCBwYXRoIGZyb20gdGhlIGdpdmVuIGV4dGVybmFsIHBhdGguCkBAIC0yMTcsMjggKzI4NywxOCBAQAogCSAqIEByZXR1cm4gSVBhdGgKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElQYXRoIGNhbm9uaWNhbGl6ZWRQYXRoKElQYXRoIGV4dGVybmFsUGF0aCkgewotCQkKKwogCQlpZiAoZXh0ZXJuYWxQYXRoID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIAotLy8JCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsaXppbmcgIiArIGV4dGVybmFsUGF0aC50b1N0cmluZygpKTsKLS8vCQl9Ci0KIAkJaWYgKElTX0NBU0VfU0VOU0lUSVZFKSB7Ci0vLwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKGZpbGUgc3lzdGVtIGlzIGNhc2Ugc2Vuc2l0aXZlKSIpOwotLy8JCQl9CiAJCQlyZXR1cm4gZXh0ZXJuYWxQYXRoOwogCQl9Ci0KKwkJCiAJCS8vIGlmIG5vdCBleHRlcm5hbCBwYXRoLCByZXR1cm4gb3JpZ2luYWwgcGF0aAogCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKIAkJaWYgKHdvcmtzcGFjZSA9PSBudWxsKSByZXR1cm4gZXh0ZXJuYWxQYXRoOyAvLyBwcm90ZWN0aW9uIGR1cmluZyBzaHV0ZG93biAoMzA0ODcpCiAJCWlmICh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZXh0ZXJuYWxQYXRoKSAhPSBudWxsKSB7Ci0vLwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKG1lbWJlciBvZiB3b3Jrc3BhY2UpIik7Ci0vLwkJCX0KIAkJCXJldHVybiBleHRlcm5hbFBhdGg7CiAJCX0KIApAQCAtMjQ4LDE5ICszMDgsMTMgQEAKIAkJCQluZXcgUGF0aChuZXcgRmlsZShleHRlcm5hbFBhdGgudG9PU1N0cmluZygpKS5nZXRDYW5vbmljYWxQYXRoKCkpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBkZWZhdWx0IHRvIG9yaWdpbmFsIHBhdGgKLS8vCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgb3JpZ2luYWwgcGF0aCAoSU9FeGNlcHRpb24pIik7Ci0vLwkJCX0KIAkJCXJldHVybiBleHRlcm5hbFBhdGg7CiAJCX0KLQkJCisKIAkJSVBhdGggcmVzdWx0OwogCQlpbnQgY2Fub25pY2FsTGVuZ3RoID0gY2Fub25pY2FsUGF0aC5zZWdtZW50Q291bnQoKTsKIAkJaWYgKGNhbm9uaWNhbExlbmd0aCA9PSAwKSB7CiAJCQkvLyB0aGUgamF2YS5pby5GaWxlIGNhbm9uaWNhbGl6YXRpb24gZmFpbGVkCi0vLwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKGNhbm9uaWNhbCBwYXRoIGlzIGVtcHR5KSIpOwotLy8JCQl9CiAJCQlyZXR1cm4gZXh0ZXJuYWxQYXRoOwogCQl9IGVsc2UgaWYgKGV4dGVybmFsUGF0aC5pc0Fic29sdXRlKCkpIHsKIAkJCXJlc3VsdCA9IGNhbm9uaWNhbFBhdGg7CkBAIC0yNzEsMjAgKzMyNSwxOCBAQAogCQkJaWYgKGNhbm9uaWNhbExlbmd0aCA+PSBleHRlcm5hbExlbmd0aCkgewogCQkJCXJlc3VsdCA9IGNhbm9uaWNhbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjYW5vbmljYWxMZW5ndGggLSBleHRlcm5hbExlbmd0aCk7CiAJCQl9IGVsc2UgewotLy8JCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgewotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKGNhbm9uaWNhbCBwYXRoIGlzICIgKyBjYW5vbmljYWxQYXRoLnRvU3RyaW5nKCkgKyAiKSIpOwotLy8JCQkJfQogCQkJCXJldHVybiBleHRlcm5hbFBhdGg7CiAJCQl9CiAJCX0KLQkJCi0JCS8vIGtlZXAgZGV2aWNlIG9ubHkgaWYgaXQgd2FzIHNwZWNpZmllZCAodGhpcyBpcyBiZWNhdXNlIEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpIGNvbnZlcnRzICcvbGliL2NsYXNzZWQuemlwJyB0byAnZDovbGliL2NsYXNzZXMvemlwJykKKworCQkvLyBrZWVwIGRldmljZSBvbmx5IGlmIGl0IHdhcyBzcGVjaWZpZWQgKHRoaXMgaXMgYmVjYXVzZSBGaWxlLmdldENhbm9uaWNhbFBhdGgoKSBjb252ZXJ0cyAnL2xpYi9jbGFzc2VzLnppcCcgdG8gJ2Q6L2xpYi9jbGFzc2VzL3ppcCcpCiAJCWlmIChleHRlcm5hbFBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCkgewogCQkJcmVzdWx0ID0gcmVzdWx0LnNldERldmljZShudWxsKTsKLQkJfSAKLS8vCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzICIgKyByZXN1bHQudG9TdHJpbmcoKSk7Ci0vLwkJfQorCQl9CisJCS8vIGtlZXAgdHJhaWxpbmcgc2VwYXJhdG9yIG9ubHkgaWYgaXQgd2FzIHNwZWNpZmllZCAodGhpcyBpcyBiZWNhdXNlIEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpIGNvbnZlcnRzICdkOi9saWIvY2xhc3Nlcy8nIHRvICdkOi9saWIvY2xhc3NlcycpCisJCWlmIChleHRlcm5hbFBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgeworCQkJcmVzdWx0ID0gcmVzdWx0LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7CisJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTI5NCw3ICszNDYsNyBAQAogCSAqIEBwYXJhbSBwcm9qZWN0IElQcm9qZWN0CiAJICogQHJldHVybiBib29sZWFuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0phdmFOYXR1cmUoSVByb2plY3QgcHJvamVjdCkgeyAKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSmF2YU5hdHVyZShJUHJvamVjdCBwcm9qZWN0KSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CkBAIC0zMTksMTAgKzM3MSwxMCBAQAogCQlJUHJvamVjdFtdIHJzY1Byb2plY3RzID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwogCQlpbnQgbGVuZ3RoID0gcnNjUHJvamVjdHMubGVuZ3RoOwogCQlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbmV3IEphdmFQcm9qZWN0W2xlbmd0aF07Ci0JCQkJCi0JCUhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgSGFzaFNldCgpOworCisJCUxpbmtlZEhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwogCQlIYXNoU2V0IHRyYXZlcnNlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQorCiAJCS8vIGNvbXB1dGUgY3ljbGUgcGFydGljaXBhbnRzCiAJCUFycmF5TGlzdCBwcmVyZXFDaGFpbiA9IG5ldyBBcnJheUxpc3QoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CkBAIC0zNTQsMTMgKzQwNiwzMyBAQAogCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CisJCQkJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0c0luQ3ljbGU7CisJCQkJCQlTdHJpbmcgY3ljbGVTdHJpbmcgPSAiIjsJIC8vJE5PTi1OTFMtMSQKKwkJCQkJCWlmIChjeWNsZVBhcnRpY2lwYW50cy5pc0VtcHR5KCkpIHsKKwkJCQkJCQlwcm9qZWN0c0luQ3ljbGUgPSBudWxsOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwcm9qZWN0c0luQ3ljbGUgPSBuZXcgSUphdmFQcm9qZWN0W2N5Y2xlUGFydGljaXBhbnRzLnNpemUoKV07CisJCQkJCQkJSXRlcmF0b3IgaXQgPSBjeWNsZVBhcnRpY2lwYW50cy5pdGVyYXRvcigpOworCQkJCQkJCWludCBrID0gMDsKKwkJCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJCQkJCS8vcHJvamVjdHNJbkN5Y2xlW2krK10gPSAoSVBhdGgpIGl0Lm5leHQoKTsKKwkJCQkJCQkJSVJlc291cmNlIG1lbWJlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcigoSVBhdGgpIGl0Lm5leHQoKSk7CisJCQkJCQkJCWlmIChtZW1iZXIgIT0gbnVsbCAmJiBtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsKKwkJCQkJCQkJCXByb2plY3RzSW5DeWNsZVtrXSA9IEphdmFDb3JlLmNyZWF0ZSgoSVByb2plY3QpbWVtYmVyKTsKKwkJCQkJCQkJCWlmIChwcm9qZWN0c0luQ3ljbGVba10gIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChrICE9IDApIGN5Y2xlU3RyaW5nICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQljeWNsZVN0cmluZyArPSBwcm9qZWN0c0luQ3ljbGVbaysrXS5nZXRFbGVtZW50TmFtZSgpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQogCQkJCQkJLy8gY3JlYXRlIG5ldyBtYXJrZXIKIAkJCQkJCXByb2plY3QuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcigKLQkJCQkJCQluZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ0xBU1NQQVRIX0NZQ0xFLCBwcm9qZWN0KSk7IAorCQkJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DTEFTU1BBVEhfQ1lDTEUsIHByb2plY3QsIGN5Y2xlU3RyaW5nKSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlwcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnModHJ1ZSwgZmFsc2UpOwotCQkJCX0JCQkKKwkJCQkJcHJvamVjdC5mbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKHRydWUsIGZhbHNlLCBmYWxzZSk7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMzg1LDY5ICs0NTcsNTQgQEAKIAkgKiBAc2VlIE9wZW5hYmxlCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTdHJ1Y3R1cmUoT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBNYXAgbmV3RWxlbWVudHMsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBqYXZhIHByb2plY3QgY2FuIGJlIG9wZW5lZAotCQlpZiAoIWhhc0phdmFOYXR1cmUoKElQcm9qZWN0KSB1bmRlcmx5aW5nUmVzb3VyY2UpKSB7Ci0JCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJCiAJCS8vIGNhbm5vdCByZWZyZXNoIGNwIG1hcmtlcnMgb24gb3BlbmluZyAoZW11bGF0ZSBjcCBjaGVjayBvbiBzdGFydHVwKSBzaW5jZSBjYW4gY3JlYXRlIGRlYWRsb2NrcyAoc2VlIGJ1ZyAzNzI3NCkKIAkJSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWRDbGFzc3BhdGggPSBnZXRSZXNvbHZlZENsYXNzcGF0aCgpOwogCiAJCS8vIGNvbXB1dGUgdGhlIHBrZyBmcmFnbWVudCByb290cwotCQlpbmZvLnNldENoaWxkcmVuKGNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhyZXNvbHZlZENsYXNzcGF0aCwgZmFsc2UsIG51bGwgLypubyByZXZlcnNlIG1hcCovKSk7CQotCQkKLQkJLy8gcmVtZW1iZXIgdGhlIHRpbWVzdGFtcHMgb2YgZXh0ZXJuYWwgbGlicmFyaWVzIHRoZSBmaXJzdCB0aW1lIHRoZXkgYXJlIGxvb2tlZCB1cAotCQlnZXRQZXJQcm9qZWN0SW5mbygpLnJlbWVtYmVyRXh0ZXJuYWxMaWJUaW1lc3RhbXBzKCk7CQkJCisJCWluZm8uc2V0Q2hpbGRyZW4oY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKHJlc29sdmVkQ2xhc3NwYXRoLCBmYWxzZSwgbnVsbCAvKm5vIHJldmVyc2UgbWFwKi8pKTsKIAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgY29sbGVjdGlvbiBvZiBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIChsb2NhbCBvbmVzKSBhbmQgc2V0IGl0IG9uIHRoZSBnaXZlbiBpbmZvLgotCSAqIE5lZWQgdG8gY2hlY2sgKmFsbCogcGFja2FnZSBmcmFnbWVudCByb290cyBpbiBvcmRlciB0byByZXNldCBOYW1lTG9va3VwCi0JICogQHBhcmFtIGluZm8gSmF2YVByb2plY3RFbGVtZW50SW5mbwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQjY2xvc2UoKQogCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVDaGlsZHJlbihKYXZhUHJvamVjdEVsZW1lbnRJbmZvIGluZm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBnZXRSZXNvbHZlZENsYXNzcGF0aCgpOwotCQlKYXZhUHJvamVjdEVsZW1lbnRJbmZvLlByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUgPSBpbmZvLnByb2plY3RDYWNoZTsKLQkJaWYgKHByb2plY3RDYWNoZSAhPSBudWxsKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG5ld1Jvb3RzID0gY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aCwgdHJ1ZSwgbnVsbCAvKm5vIHJldmVyc2UgbWFwKi8pOwotCQkJY2hlY2tJZGVudGljYWw6IHsgLy8gY29tcGFyZSBhbGwgcGtnIGZyYWdtZW50IHJvb3QgbGlzdHMKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG9sZFJvb3RzID0gcHJvamVjdENhY2hlLmFsbFBrZ0ZyYWdtZW50Um9vdHNDYWNoZTsKLQkJCQlpZiAob2xkUm9vdHMubGVuZ3RoID09IG5ld1Jvb3RzLmxlbmd0aCl7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvbGRSb290cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7Ci0JCQkJCQlpZiAoIW9sZFJvb3RzW2ldLmVxdWFscyhuZXdSb290c1tpXSkpewotCQkJCQkJCWJyZWFrIGNoZWNrSWRlbnRpY2FsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byB1cGRhdGUKLQkJCQl9CQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHRoaXMucHJvamVjdCkpIHsKKwkJCS8vIEdldCBjYWNoZWQgcHJlZmVyZW5jZXMgaWYgZXhpc3QKKwkJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mbyh0aGlzLnByb2plY3QsIGZhbHNlKTsKKwkJCWlmIChwZXJQcm9qZWN0SW5mbyAhPSBudWxsICYmIHBlclByb2plY3RJbmZvLnByZWZlcmVuY2VzICE9IG51bGwpIHsKKwkJCQlJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQYXJlbnRQcmVmZXJlbmNlcyA9IChJRWNsaXBzZVByZWZlcmVuY2VzKSBwZXJQcm9qZWN0SW5mby5wcmVmZXJlbmNlcy5wYXJlbnQoKTsKKwkJCQlpZiAodGhpcy5wcmVmZXJlbmNlc05vZGVMaXN0ZW5lciAhPSBudWxsKSB7CisJCQkJCWVjbGlwc2VQYXJlbnRQcmVmZXJlbmNlcy5yZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlc05vZGVMaXN0ZW5lcik7CisJCQkJCXRoaXMucHJlZmVyZW5jZXNOb2RlTGlzdGVuZXIgPSBudWxsOworCQkJCX0KKwkJCQlpZiAodGhpcy5wcmVmZXJlbmNlc0NoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKKwkJCQkJcGVyUHJvamVjdEluZm8ucHJlZmVyZW5jZXMucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lcik7CisJCQkJCXRoaXMucHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lciA9IG51bGw7CisJCQkJfQogCQkJfQogCQl9Ci0JCWluZm8uc2V0Tm9uSmF2YVJlc291cmNlcyhudWxsKTsKLQkJaW5mby5zZXRDaGlsZHJlbigKLQkJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGgsIGZhbHNlLCBudWxsIC8qbm8gcmV2ZXJzZSBtYXAqLykpOwkJCisJCXN1cGVyLmNsb3NlKCk7CiAJfQotCQorCiAJLyoqCiAJICogSW50ZXJuYWwgY29tcHV0YXRpb24gb2YgYW4gZXhwYW5kZWQgY2xhc3NwYXRoLiBJdCB3aWxsIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLCBhbmQgcHJvZHVjZSBjb3BpZXMKIAkgKiBvZiBleHBvcnRlZCBvciByZXN0cmljdGVkIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGF2b2lkIHBvc3NpYmxlIHNpZGUtZWZmZWN0cyBldmVyIGFmdGVyLgotCSAqLwkJCQorCSAqLwogCXByaXZhdGUgdm9pZCBjb21wdXRlRXhwYW5kZWRDbGFzc3BhdGgoCiAJCUNsYXNzcGF0aEVudHJ5IHJlZmVycmluZ0VudHJ5LAogCQlIYXNoU2V0IHJvb3RJRHMsCiAJCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZEVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIHByb2plY3RSb290SWQgPSB0aGlzLnJvb3RJRCgpOworCisJCVN0cmluZyBwcm9qZWN0Um9vdElkID0gcm9vdElEKCk7CiAJCWlmIChyb290SURzLmNvbnRhaW5zKHByb2plY3RSb290SWQpKXsKIAkJCXJldHVybjsgLy8gYnJlYWsgY3ljbGVzIGlmIGFueQogCQl9CiAJCXJvb3RJRHMuYWRkKHByb2plY3RSb290SWQpOwogCiAJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoID0gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKLQkJCQorCiAJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQlib29sZWFuIGlzSW5pdGlhbFByb2plY3QgPSByZWZlcnJpbmdFbnRyeSA9PSBudWxsOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewpAQCAtNDYwLDI3ICs1MTcsMjcgQEAKIAkJCQkvLyBjb21iaW5lIHJlc3RyaWN0aW9ucyBhbG9uZyB0aGUgcHJvamVjdCBjaGFpbgogCQkJCUNsYXNzcGF0aEVudHJ5IGNvbWJpbmVkRW50cnkgPSBlbnRyeS5jb21iaW5lV2l0aChyZWZlcnJpbmdFbnRyeSk7CiAJCQkJYWNjdW11bGF0ZWRFbnRyaWVzLmFkZChjb21iaW5lZEVudHJ5KTsKLQkJCQkKLQkJCQkvLyByZWN1cnNlIGluIHByb2plY3QgdG8gZ2V0IGFsbCBpdHMgaW5kaXJlY3QgZXhwb3J0cyAob25seSBjb25zaWRlciBleHBvcnRlZCBlbnRyaWVzIGZyb20gdGhlcmUgb24pCQkJCQorCisJCQkJLy8gcmVjdXJzZSBpbiBwcm9qZWN0IHRvIGdldCBhbGwgaXRzIGluZGlyZWN0IGV4cG9ydHMgKG9ubHkgY29uc2lkZXIgZXhwb3J0ZWQgZW50cmllcyBmcm9tIHRoZXJlIG9uKQogCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIHsKLQkJCQkJSVJlc291cmNlIG1lbWJlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRQYXRoKCkpOyAKKwkJCQkJSVJlc291cmNlIG1lbWJlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRQYXRoKCkpOwogCQkJCQlpZiAobWVtYmVyICE9IG51bGwgJiYgbWVtYmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCl7IC8vIGRvdWJsZSBjaGVjayBpZiBib3VuZCB0byBwcm9qZWN0ICgyMzk3NykKIAkJCQkJCUlQcm9qZWN0IHByb2pSc2MgPSAoSVByb2plY3QpIG1lbWJlcjsKIAkJCQkJCWlmIChKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2pSc2MpKSB7CiAJCQkJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIEphdmFDb3JlLmNyZWF0ZShwcm9qUnNjKTsKIAkJCQkJCQlqYXZhUHJvamVjdC5jb21wdXRlRXhwYW5kZWRDbGFzc3BhdGgoCi0JCQkJCQkJCWNvbWJpbmVkRW50cnksIAotCQkJCQkJCQlyb290SURzLCAKKwkJCQkJCQkJY29tYmluZWRFbnRyeSwKKwkJCQkJCQkJcm9vdElEcywKIAkJCQkJCQkJYWNjdW11bGF0ZWRFbnRyaWVzKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCXJvb3RJRHMuYWRkKHJvb3RJRCk7CiAJCQkJfQotCQkJfQkJCQorCQkJfQogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQ29tcHV0ZXMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gZW50cnkuCiAJICogT25seSB3b3JrcyB3aXRoIHJlc29sdmVkIGVudHJ5CkBAIC00ODksOSArNTQ2LDkgQEAKIAkgKi8KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkpIHsKIAkJdHJ5IHsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdeyByZXNvbHZlZEVudHJ5IH0sIAorCQkJCQluZXcgSUNsYXNzcGF0aEVudHJ5W117IHJlc29sdmVkRW50cnkgfSwKIAkJCQkJZmFsc2UsIC8vIGRvbid0IHJldHJpZXZlIGV4cG9ydGVkIHJvb3RzCiAJCQkJCW51bGwgLyogbm8gcmV2ZXJzZSBtYXAgKi8KIAkJCQkpOwpAQCAtNTA4LDE5ICs1NjUsMTcgQEAKIAkgKiBAcGFyYW0gYWNjdW11bGF0ZWRSb290cyBPYmplY3RWZWN0b3IKIAkgKiBAcGFyYW0gcm9vdElEcyBIYXNoU2V0CiAJICogQHBhcmFtIHJlZmVycmluZ0VudHJ5IHRoZSBDUCBlbnRyeSAocHJvamVjdCkgcmVmZXJyaW5nIHRvIHRoaXMgZW50cnksIG9yIG51bGwgaWYgaW5pdGlhbCBwcm9qZWN0Ci0JICogQHBhcmFtIGNoZWNrRXhpc3RlbmN5IGJvb2xlYW4KIAkgKiBAcGFyYW0gcmV0cmlldmVFeHBvcnRlZFJvb3RzIGJvb2xlYW4KIAkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKIAkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnksCi0JCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZFJvb3RzLCAKLQkJSGFzaFNldCByb290SURzLCAKKwkJT2JqZWN0VmVjdG9yIGFjY3VtdWxhdGVkUm9vdHMsCisJCUhhc2hTZXQgcm9vdElEcywKIAkJSUNsYXNzcGF0aEVudHJ5IHJlZmVycmluZ0VudHJ5LAotCQlib29sZWFuIGNoZWNrRXhpc3RlbmN5LAogCQlib29sZWFuIHJldHJpZXZlRXhwb3J0ZWRSb290cywKIAkJTWFwIHJvb3RUb1Jlc29sdmVkRW50cmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKKwogCQlTdHJpbmcgcm9vdElEID0gKChDbGFzc3BhdGhFbnRyeSlyZXNvbHZlZEVudHJ5KS5yb290SUQoKTsKIAkJaWYgKHJvb3RJRHMuY29udGFpbnMocm9vdElEKSkgcmV0dXJuOwogCkBAIC01MjgsNDYgKzU4Myw0MCBAQAogCQlJUGF0aCBlbnRyeVBhdGggPSByZXNvbHZlZEVudHJ5LmdldFBhdGgoKTsKIAkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOwotCQkKKwogCQlzd2l0Y2gocmVzb2x2ZWRFbnRyeS5nZXRFbnRyeUtpbmQoKSl7Ci0JCQkKKwogCQkJLy8gc291cmNlIGZvbGRlcgogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CiAKIAkJCQlpZiAocHJvamVjdFBhdGguaXNQcmVmaXhPZihlbnRyeVBhdGgpKXsKLQkJCQkJaWYgKGNoZWNrRXhpc3RlbmN5KSB7Ci0JCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeVBhdGgsIGNoZWNrRXhpc3RlbmN5KTsKLQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJCQkJCXJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUmVzb3VyY2UpdGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJvb3QgPSBnZXRGb2xkZXJQYWNrYWdlRnJhZ21lbnRSb290KGVudHJ5UGF0aCk7CisJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGVudHJ5UGF0aCwgdHJ1ZS8qY2hlY2sgZXhpc3RlbmN5Ki8pOworCQkJCQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjsKKworCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCl7CisJCQkJCQlyb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgoSVJlc291cmNlKXRhcmdldCk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CiAKIAkJCS8vIGludGVybmFsL2V4dGVybmFsIEpBUiBvciBmb2xkZXIKIAkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQotCQkJCWlmIChyZWZlcnJpbmdFbnRyeSAhPSBudWxsICAmJiAhcmVzb2x2ZWRFbnRyeS5pc0V4cG9ydGVkKCkpIHJldHVybjsKLQkJCQkKLQkJCQlpZiAoY2hlY2tFeGlzdGVuY3kpIHsKLQkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnlQYXRoLCBjaGVja0V4aXN0ZW5jeSk7Ci0JCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKLQkJCQkJCS8vIGludGVybmFsIHRhcmdldAotCQkJCQkJcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElSZXNvdXJjZSkgdGFyZ2V0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGV4dGVybmFsIHRhcmdldCAtIG9ubHkgSkFScyBhbGxvd2VkCi0JCQkJCQlpZiAoSmF2YU1vZGVsLmlzRmlsZSh0YXJnZXQpICYmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGVudHJ5UGF0aC5sYXN0U2VnbWVudCgpKSkpIHsKLQkJCQkJCQlyb290ID0gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLCB0aGlzKTsKLQkJCQkJCX0KKwkJCQlpZiAocmVmZXJyaW5nRW50cnkgIT0gbnVsbCAgJiYgIXJlc29sdmVkRW50cnkuaXNFeHBvcnRlZCgpKQorCQkJCQlyZXR1cm47CisJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoZW50cnlQYXRoLCB0cnVlLypjaGVjayBleGlzdGVuY3kqLyk7CisJCQkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJCQlyZXR1cm47CisKKwkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKKwkJCQkJLy8gaW50ZXJuYWwgdGFyZ2V0CisJCQkJCXJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUmVzb3VyY2UpIHRhcmdldCwgZW50cnlQYXRoKTsKKwkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKKwkJCQkJLy8gZXh0ZXJuYWwgdGFyZ2V0CisJCQkJCWlmIChKYXZhTW9kZWwuaXNGaWxlKHRhcmdldCkpIHsKKwkJCQkJCXJvb3QgPSBuZXcgSmFyUGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgsIHRoaXMpOworCQkJCQl9IGVsc2UgaWYgKCgoRmlsZSkgdGFyZ2V0KS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQlyb290ID0gbmV3IEV4dGVybmFsUGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgsIHRoaXMpOwogCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAKQEAgLTU4NCwxMSArNjMzLDEwIEBACiAJCQkJCQlyb290SURzLmFkZChyb290SUQpOwogCQkJCQkJSmF2YVByb2plY3QgcmVxdWlyZWRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShyZXF1aXJlZFByb2plY3RSc2MpOwogCQkJCQkJcmVxdWlyZWRQcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJCQkJCQlyZXF1aXJlZFByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSwgCi0JCQkJCQkJYWNjdW11bGF0ZWRSb290cywgCi0JCQkJCQkJcm9vdElEcywgCi0JCQkJCQkJcm9vdFRvUmVzb2x2ZWRFbnRyaWVzID09IG51bGwgPyByZXNvbHZlZEVudHJ5IDogKChDbGFzc3BhdGhFbnRyeSlyZXNvbHZlZEVudHJ5KS5jb21iaW5lV2l0aCgoQ2xhc3NwYXRoRW50cnkpIHJlZmVycmluZ0VudHJ5KSwgLy8gb25seSBjb21iaW5lIGlmIG5lZWQgdG8gYnVpbGQgdGhlIHJldmVyc2UgbWFwIAotCQkJCQkJCWNoZWNrRXhpc3RlbmN5LCAKKwkJCQkJCQlyZXF1aXJlZFByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSwKKwkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLAorCQkJCQkJCXJvb3RJRHMsCisJCQkJCQkJcm9vdFRvUmVzb2x2ZWRFbnRyaWVzID09IG51bGwgPyByZXNvbHZlZEVudHJ5IDogKChDbGFzc3BhdGhFbnRyeSlyZXNvbHZlZEVudHJ5KS5jb21iaW5lV2l0aCgoQ2xhc3NwYXRoRW50cnkpIHJlZmVycmluZ0VudHJ5KSwgLy8gb25seSBjb21iaW5lIGlmIG5lZWQgdG8gYnVpbGQgdGhlIHJldmVyc2UgbWFwCiAJCQkJCQkJcmV0cmlldmVFeHBvcnRlZFJvb3RzLAogCQkJCQkJCXJvb3RUb1Jlc29sdmVkRW50cmllcyk7CiAJCQkJCX0KQEAgLTYxMywyNCArNjYxLDIzIEBACiAJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoLCAKKwkJCQkJSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWRDbGFzc3BhdGgsCiAJCQkJCWJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzLAogCQkJCQlNYXAgcm9vdFRvUmVzb2x2ZWRFbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRSb290cyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKIAkJY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAotCQkJcmVzb2x2ZWRDbGFzc3BhdGgsIAotCQkJYWNjdW11bGF0ZWRSb290cywgCisJCQlyZXNvbHZlZENsYXNzcGF0aCwKKwkJCWFjY3VtdWxhdGVkUm9vdHMsCiAJCQluZXcgSGFzaFNldCg1KSwgLy8gcm9vdElEcwogCQkJbnVsbCwgLy8gaW5zaWRlIG9yaWdpbmFsIHByb2plY3QKLQkJCXRydWUsIC8vIGNoZWNrIGV4aXN0ZW5jeQogCQkJcmV0cmlldmVFeHBvcnRlZFJvb3RzLAogCQkJcm9vdFRvUmVzb2x2ZWRFbnRyaWVzKTsKIAkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290QXJyYXkgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbYWNjdW11bGF0ZWRSb290cy5zaXplKCldOwogCQlhY2N1bXVsYXRlZFJvb3RzLmNvcHlJbnRvKHJvb3RBcnJheSk7CiAJCXJldHVybiByb290QXJyYXk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyAobG9jYWwvYWxsKSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0J3MgY2xhc3NwYXRoLgogCSAqIE5vdGU6IHRoaXMgZm9sbG93cyBwcm9qZWN0IGNsYXNzcGF0aCByZWZlcmVuY2VzIHRvIGZpbmQgcmVxdWlyZWQgcHJvamVjdCBjb250cmlidXRpb25zLApAQCAtNjQwLDI5ICs2ODcsMjYgQEAKIAkgKiBAcGFyYW0gYWNjdW11bGF0ZWRSb290cyBPYmplY3RWZWN0b3IKIAkgKiBAcGFyYW0gcm9vdElEcyBIYXNoU2V0CiAJICogQHBhcmFtIHJlZmVycmluZ0VudHJ5IHByb2plY3QgZW50cnkgcmVmZXJyaW5nIHRvIHRoaXMgQ1Agb3IgbnVsbCBpZiBpbml0aWFsIHByb2plY3QKLQkgKiBAcGFyYW0gY2hlY2tFeGlzdGVuY3kgYm9vbGVhbgogCSAqIEBwYXJhbSByZXRyaWV2ZUV4cG9ydGVkUm9vdHMgYm9vbGVhbgogCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCiAJICovCiAJcHVibGljIHZvaWQgY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAogCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCwKLQkJT2JqZWN0VmVjdG9yIGFjY3VtdWxhdGVkUm9vdHMsIAotCQlIYXNoU2V0IHJvb3RJRHMsIAorCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRSb290cywKKwkJSGFzaFNldCByb290SURzLAogCQlJQ2xhc3NwYXRoRW50cnkgcmVmZXJyaW5nRW50cnksCi0JCWJvb2xlYW4gY2hlY2tFeGlzdGVuY3ksCiAJCWJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzLAogCQlNYXAgcm9vdFRvUmVzb2x2ZWRFbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlpZiAocmVmZXJyaW5nRW50cnkgPT0gbnVsbCl7CiAJCQlyb290SURzLmFkZChyb290SUQoKSk7Ci0JCX0JCisJCX0KIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlc29sdmVkQ2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKIAkJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKIAkJCQlyZXNvbHZlZENsYXNzcGF0aFtpXSwKIAkJCQlhY2N1bXVsYXRlZFJvb3RzLAogCQkJCXJvb3RJRHMsCiAJCQkJcmVmZXJyaW5nRW50cnksCi0JCQkJY2hlY2tFeGlzdGVuY3ksCiAJCQkJcmV0cmlldmVFeHBvcnRlZFJvb3RzLAogCQkJCXJvb3RUb1Jlc29sdmVkRW50cmllcyk7CiAJCX0KQEAgLTY4NSwxNCArNzI5LDE0IEBACiAJCS8vIHJlZ2lzdGVyIEphdmEgYnVpbGRlcgogCQlhZGRUb0J1aWxkU3BlYyhKYXZhQ29yZS5CVUlMREVSX0lEKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvciB0aGUgbm9uLUphdmEgcmVzb3VyY2VzIG9mIHRoaXMgcHJvamVjdC4KIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBpbiB0aGUgcHJvamVjdC4KIAkgKiBBc3N1bWVzIHRoYXQgdGhlIHJlc291cmNlIGlzIGEgZm9sZGVyIG9yIGEgZmlsZS4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQorCiAJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKIAkJSVBhdGggb3V0cHV0OwogCQl0cnkgewpAQCAtNzAxLDE0ICs3NDUsMjAgQEAKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQkKKwogCQlJUGF0aCBmdWxsUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CiAJCUlQYXRoIGlubmVyTW9zdE91dHB1dCA9IG91dHB1dC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSA/IG91dHB1dCA6IG51bGw7CiAJCUlDbGFzc3BhdGhFbnRyeSBpbm5lck1vc3RFbnRyeSA9IG51bGw7CisJCUV4dGVybmFsRm9sZGVyc01hbmFnZXIgZm9sZGVyc01hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEV4dGVybmFsTWFuYWdlcigpOwogCQlmb3IgKGludCBqID0gMCwgY3BMZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOyBqIDwgY3BMZW5ndGg7IGorKykgewogCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOwotCQkKKwogCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCUlSZXNvdXJjZSBsaW5rZWRGb2xkZXIgPSBmb2xkZXJzTWFuYWdlci5nZXRGb2xkZXIoZW50cnlQYXRoKTsKKwkJCQlpZiAobGlua2VkRm9sZGVyICE9IG51bGwpCisJCQkJCWVudHJ5UGF0aCA9IGxpbmtlZEZvbGRlci5nZXRGdWxsUGF0aCgpOworCQkJfQogCQkJaWYgKChpbm5lck1vc3RFbnRyeSA9PSBudWxsIHx8IGlubmVyTW9zdEVudHJ5LmdldFBhdGgoKS5pc1ByZWZpeE9mKGVudHJ5UGF0aCkpCiAJCQkJCSYmIGVudHJ5UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewogCQkJCWlubmVyTW9zdEVudHJ5ID0gZW50cnk7CkBAIC03MzAsNyArNzgwLDcgQEAKIAkJCX0KIAkJCXN3aXRjaCAoaW5uZXJNb3N0RW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKIAkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOgotCQkJCQkvLyAuY2xhc3MgZmlsZXMgYXJlIG5vdCB2aXNpYmxlIGluIHNvdXJjZSBmb2xkZXJzIAorCQkJCQkvLyAuY2xhc3MgZmlsZXMgYXJlIG5vdCB2aXNpYmxlIGluIHNvdXJjZSBmb2xkZXJzCiAJCQkJCXJldHVybiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUoZnVsbFBhdGgubGFzdFNlZ21lbnQoKSk7CiAJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CiAJCQkJCS8vIC5qYXZhIGZpbGVzIGFyZSBub3QgdmlzaWJsZSBpbiBsaWJyYXJ5IGZvbGRlcnMKQEAgLTc0NywxMyArNzk3LDEzIEBACiAJICogUmVjb3JkIGEgbmV3IG1hcmtlciBkZW5vdGluZyBhIGNsYXNzcGF0aCBwcm9ibGVtCiAJICovCiAJcHVibGljIHZvaWQgY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cykgewotCQkJCisKIAkJSU1hcmtlciBtYXJrZXIgPSBudWxsOwogCQlpbnQgc2V2ZXJpdHk7CiAJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKLQkJYm9vbGVhbiBpc0N5Y2xlUHJvYmxlbSA9IGZhbHNlLCBpc0NsYXNzcGF0aEZpbGVGb3JtYXRQcm9ibGVtID0gZmFsc2U7CisJCWJvb2xlYW4gaXNDeWNsZVByb2JsZW0gPSBmYWxzZSwgaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA9IGZhbHNlLCBpc091dHB1dE92ZXJsYXBwaW5nID0gZmFsc2U7CiAJCXN3aXRjaCAoc3RhdHVzLmdldENvZGUoKSkgewotCQorCiAJCQljYXNlICBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNMQVNTUEFUSF9DWUNMRSA6CiAJCQkJaXNDeWNsZVByb2JsZW0gPSB0cnVlOwogCQkJCWlmIChKYXZhQ29yZS5FUlJPUi5lcXVhbHMoZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCB0cnVlKSkpIHsKQEAgLTc2MiwxMiArODEyLDEyIEBACiAJCQkJCXNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwogCQkJCX0KIAkJCQlicmVhazsKLQkKKwogCQkJY2FzZSAgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCA6CiAJCQkJaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA9IHRydWU7CiAJCQkJc2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwogCQkJCWJyZWFrOwotCQorCiAJCQljYXNlICBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOQ09NUEFUSUJMRV9KREtfTEVWRUwgOgogCQkJCVN0cmluZyBzZXR0aW5nID0gZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSU5DT01QQVRJQkxFX0pES19MRVZFTCwgdHJ1ZSk7CiAJCQkJaWYgKEphdmFDb3JlLkVSUk9SLmVxdWFscyhzZXR0aW5nKSkgewpAQCAtNzc4LDcgKzgyOCwxNyBAQAogCQkJCQlyZXR1cm47IC8vIHNldHRpbmcgPT0gSUdOT1JFCiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCQorCQkJY2FzZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSA6CisJCQkJaXNPdXRwdXRPdmVybGFwcGluZyA9IHRydWU7CisJCQkJc2V0dGluZyA9IGdldE9wdGlvbihKYXZhQ29yZS5DT1JFX09VVFBVVF9MT0NBVElPTl9PVkVSTEFQUElOR19BTk9USEVSX1NPVVJDRSwgdHJ1ZSk7CisJCQkJaWYgKEphdmFDb3JlLkVSUk9SLmVxdWFscyhzZXR0aW5nKSkgeworCQkJCQlzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7CisJCQkJfSBlbHNlIGlmIChKYXZhQ29yZS5XQVJOSU5HLmVxdWFscyhzZXR0aW5nKSkgeworCQkJCQlzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm47IC8vIHNldHRpbmcgPT0gSUdOT1JFCisJCQkJfQorCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlJUGF0aCBwYXRoID0gc3RhdHVzLmdldFBhdGgoKTsKIAkJCQlpZiAocGF0aCAhPSBudWxsKSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyBwYXRoLnRvU3RyaW5nKCkgfTsKQEAgLTc5MCwxNiArODUwLDE3IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQl9Ci0JCQorCiAJCXRyeSB7CiAJCQltYXJrZXIgPSB0aGlzLnByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSKTsKIAkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAotCQkJCW5ldyBTdHJpbmdbXSB7IAotCQkJCQlJTWFya2VyLk1FU1NBR0UsIAotCQkJCQlJTWFya2VyLlNFVkVSSVRZLCAKLQkJCQkJSU1hcmtlci5MT0NBVElPTiwgCisJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJSU1hcmtlci5NRVNTQUdFLAorCQkJCQlJTWFya2VyLlNFVkVSSVRZLAorCQkJCQlJTWFya2VyLkxPQ0FUSU9OLAogCQkJCQlJSmF2YU1vZGVsTWFya2VyLkNZQ0xFX0RFVEVDVEVELAogCQkJCQlJSmF2YU1vZGVsTWFya2VyLkNMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKKwkJCQkJSUphdmFNb2RlbE1hcmtlci5PVVRQVVRfT1ZFUkxBUFBJTkdfU09VUkNFLAogCQkJCQlJSmF2YU1vZGVsTWFya2VyLklELAogCQkJCQlJSmF2YU1vZGVsTWFya2VyLkFSR1VNRU5UUyAsCiAJCQkJCUlKYXZhTW9kZWxNYXJrZXIuQ0FURUdPUllfSUQsCkBAIC04MDcsMTAgKzg2OCwxMSBAQAogCQkJCX0sCiAJCQkJbmV3IE9iamVjdFtdIHsKIAkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSwKLQkJCQkJbmV3IEludGVnZXIoc2V2ZXJpdHkpLCAKKwkJCQkJbmV3IEludGVnZXIoc2V2ZXJpdHkpLAogCQkJCQlNZXNzYWdlcy5jbGFzc3BhdGhfYnVpbGRQYXRoLAogCQkJCQlpc0N5Y2xlUHJvYmxlbSA/ICJ0cnVlIiA6ICJmYWxzZSIsLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWlzQ2xhc3NwYXRoRmlsZUZvcm1hdFByb2JsZW0gPyAidHJ1ZSIgOiAiZmFsc2UiLC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlpc091dHB1dE92ZXJsYXBwaW5nID8gInRydWUiIDogImZhbHNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCW5ldyBJbnRlZ2VyKHN0YXR1cy5nZXRDb2RlKCkpLAogCQkJCQlVdGlsLmdldFByb2JsZW1Bcmd1bWVudHNGb3JNYXJrZXIoYXJndW1lbnRzKSAsCiAJCQkJCW5ldyBJbnRlZ2VyKENhdGVnb3JpemVkUHJvYmxlbS5DQVRfQlVJTERQQVRIKSwKQEAgLTgzMiwxMSArODk0LDE0IEBACiAJCXJldHVybiBuZXcgSmF2YVByb2plY3RFbGVtZW50SW5mbygpOwogCX0KIAotCS8qCi0JICogUmVhZHMgYW5kIGRlY29kZSBhbiBYTUwgY2xhc3NwYXRoIHN0cmluZworCS8qKgorCSAqIFJlYWRzIGFuZCBkZWNvZGUgYW4gWE1MIGNsYXNzcGF0aCBzdHJpbmcuIFJldHVybnMgYSB0d28tZGltZW5zaW9uYWwgYXJyYXksIHdoZXJlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJvdyBpcyBmaXhlZCB0byAyLgorCSAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIHJhdyBjbGFzc3BhdGggZW50cmllcyBhbmQgdGhlIHNlY29uZCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIHJlZmVyZW5jZWQgZW50cmllcyB0aGF0IG1heSBoYXZlIGJlZW4gc3RvcmVkCisJICogYnkgdGhlIGNsaWVudCBlYXJsaWVyLiBTZWUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcygpfSBmb3IgbW9yZSBkZXRhaWxzLiAKKwkgKiAKIAkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZGVjb2RlQ2xhc3NwYXRoKFN0cmluZyB4bWxDbGFzc3BhdGgsIE1hcCB1bmtub3duRWxlbWVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIHsKLQkKKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W11bXSBkZWNvZGVDbGFzc3BhdGgoU3RyaW5nIHhtbENsYXNzcGF0aCwgTWFwIHVua25vd25FbGVtZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc3BhdGhFbnRyeS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24geworCiAJCUFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJSUNsYXNzcGF0aEVudHJ5IGRlZmF1bHRPdXRwdXQgPSBudWxsOwogCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih4bWxDbGFzc3BhdGgpOwpAQCAtODQ1LDQ3ICs5MTAsNjQgQEAKIAkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CiAJCQljcEVsZW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpLmdldERvY3VtZW50RWxlbWVudCgpOwogCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmZpbGVfYmFkRm9ybWF0KTsgCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZmlsZV9iYWRGb3JtYXQpOwogCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5maWxlX2JhZEZvcm1hdCk7IAorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmZpbGVfYmFkRm9ybWF0KTsKIAkJfSBmaW5hbGx5IHsKIAkJCXJlYWRlci5jbG9zZSgpOwogCQl9Ci0JCisKIAkJaWYgKCFjcEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzc3BhdGgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZmlsZV9iYWRGb3JtYXQpOyAKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5maWxlX2JhZEZvcm1hdCk7CiAJCX0KLQkJTm9kZUxpc3QgbGlzdCA9IGNwRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY2xhc3NwYXRoZW50cnkiKTsgLy8kTk9OLU5MUy0xJAorCQlOb2RlTGlzdCBsaXN0ID0gY3BFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKENsYXNzcGF0aEVudHJ5LlRBR19DTEFTU1BBVEhFTlRSWSk7CiAJCWludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotCQorCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKIAkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKIAkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBDbGFzc3BhdGhFbnRyeS5lbGVtZW50RGVjb2RlKChFbGVtZW50KW5vZGUsIHRoaXMsIHVua25vd25FbGVtZW50cyk7CiAJCQkJaWYgKGVudHJ5ICE9IG51bGwpewotCQkJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgeyAKKwkJCQkJaWYgKGVudHJ5LmdldENvbnRlbnRLaW5kKCkgPT0gQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQpIHsKIAkJCQkJCWRlZmF1bHRPdXRwdXQgPSBlbnRyeTsgLy8gc2VwYXJhdGUgb3V0cHV0CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlwYXRocy5hZGQoZW50cnkpOworCQkJCQl9CisJCQkJfQogCQkJfQogCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmV0dXJuIGEgbmV3IGVtcHR5IGNsYXNzcGF0aCBpcyBpdCBzaXplIGlzIDAsIHRvIGRpZmZlcmVuY2lhdGUgZnJvbSBhbiBJTlZBTElEX0NMQVNTUEFUSAogCQlpbnQgcGF0aFNpemUgPSBwYXRocy5zaXplKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3BhdGhTaXplICsgKGRlZmF1bHRPdXRwdXQgPT0gbnVsbCA/IDAgOiAxKV07Ci0JCXBhdGhzLnRvQXJyYXkoZW50cmllcyk7Ci0JCWlmIChkZWZhdWx0T3V0cHV0ICE9IG51bGwpIGVudHJpZXNbcGF0aFNpemVdID0gZGVmYXVsdE91dHB1dDsgLy8gZW5zdXJlIG91dHB1dCBpcyBsYXN0IGl0ZW0KKwkJSUNsYXNzcGF0aEVudHJ5W11bXSBlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVsyXVtdOworCQllbnRyaWVzWzBdID0gbmV3IElDbGFzc3BhdGhFbnRyeVtwYXRoU2l6ZSArIChkZWZhdWx0T3V0cHV0ID09IG51bGwgPyAwIDogMSldOworCQlwYXRocy50b0FycmF5KGVudHJpZXNbMF0pOworCQlpZiAoZGVmYXVsdE91dHB1dCAhPSBudWxsKSBlbnRyaWVzWzBdW3BhdGhTaXplXSA9IGRlZmF1bHRPdXRwdXQ7IC8vIGVuc3VyZSBvdXRwdXQgaXMgbGFzdCBpdGVtCisJCQorCQlwYXRocy5jbGVhcigpOworCQlsaXN0ID0gY3BFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKENsYXNzcGF0aEVudHJ5LlRBR19SRUZFUkVOQ0VEX0VOVFJZKTsKKwkJbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7CisJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoRW50cnkuZWxlbWVudERlY29kZSgoRWxlbWVudClub2RlLCB0aGlzLCB1bmtub3duRWxlbWVudHMpOworCQkJCWlmIChlbnRyeSAhPSBudWxsKXsKKwkJCQkJcGF0aHMuYWRkKGVudHJ5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZW50cmllc1sxXSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcGF0aHMuc2l6ZSgpXTsKKwkJcGF0aHMudG9BcnJheShlbnRyaWVzWzFdKTsKKwogCQlyZXR1cm4gZW50cmllczsKIAl9Ci0JCisKIAlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGRlY29kZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBlbmNvZGVkRW50cnkpIHsKIAogCQl0cnkgewogCQkJaWYgKGVuY29kZWRFbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGVuY29kZWRFbnRyeSk7CiAJCQlFbGVtZW50IG5vZGU7Ci0JCisKIAkJCXRyeSB7CiAJCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9CiAJCQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKQEAgLTg5NywxMCArOTc5LDEwIEBACiAJCQl9IGZpbmFsbHkgewogCQkJCXJlYWRlci5jbG9zZSgpOwogCQkJfQotCQotCQkJaWYgKCFub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NwYXRoZW50cnkiKSAvLyROT04tTkxTLTEkCisKKwkJCWlmICghbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ2xhc3NwYXRoRW50cnkuVEFHX0NMQVNTUEFUSEVOVFJZKQogCQkJCQl8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gbnVsbDsgCisJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCQlyZXR1cm4gQ2xhc3NwYXRoRW50cnkuZWxlbWVudERlY29kZShub2RlLCB0aGlzLCBudWxsLypub3QgaW50ZXJlc3RlZCBpbiB1bmtub3duIGVsZW1lbnRzKi8pOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC05MDgsNyArOTkwLDcgQEAKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQotCQorCiAJLyoqCiAJLyoqCiAJICogUmVtb3ZlcyB0aGUgSmF2YSBuYXR1cmUgZnJvbSB0aGUgcHJvamVjdC4KQEAgLTkxNyw3ICs5OTksNyBAQAogCiAJCS8vIGRlcmVnaXN0ZXIgSmF2YSBidWlsZGVyCiAJCXJlbW92ZUZyb21CdWlsZFNwZWMoSmF2YUNvcmUuQlVJTERFUl9JRCk7Ci0JCQorCiAJCS8vIHJlbW92ZSAuY2xhc3NwYXRoIGZpbGUKIC8vCQlnZXRQcm9qZWN0KCkuZ2V0RmlsZShDbGFzc3BhdGhIZWxwZXIuQ0xBU1NQQVRIX0ZJTEVOQU1FKS5kZWxldGUoZmFsc2UsIG51bGwpOwogCX0KQEAgLTkzMSw3ICsxMDEzLDcgQEAKIAkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7CiAJCQkgSmF2YUNvcmUubmV3U291cmNlRW50cnkodGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCkpfTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24uCiAJICogVGhpcyBpcyB0aGUgcHJvamVjdCBiaW4gZm9sZGVyCkBAIC05NDMsMTcgKzEwMjUsMTcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBYTUwgU3RyaW5nIGVuY29kaW5nIG9mIHRoZSBjbGFzcyBwYXRoLgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW5jb2RlQ2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSVBhdGggb3V0cHV0TG9jYXRpb24sIGJvb2xlYW4gaW5kZW50LCBNYXAgdW5rbm93bkVsZW1lbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGVuY29kZUNsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHJlZmVyZW5jZWRFbnRyaWVzLCBJUGF0aCBvdXRwdXRMb2NhdGlvbiwgYm9vbGVhbiBpbmRlbnQsIE1hcCB1bmtub3duRWxlbWVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0cnkgewogCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzLCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCiAJCQlYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcih3cml0ZXIsIHRoaXMsIHRydWUvKnByaW50IFhNTCB2ZXJzaW9uKi8pOwotCQkJCisKIAkJCXhtbFdyaXRlci5zdGFydFRhZyhDbGFzc3BhdGhFbnRyeS5UQUdfQ0xBU1NQQVRILCBpbmRlbnQpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyArK2kpIHsKLQkJCQkoKENsYXNzcGF0aEVudHJ5KWNsYXNzcGF0aFtpXSkuZWxlbWVudEVuY29kZSh4bWxXcml0ZXIsIHRoaXMucHJvamVjdC5nZXRGdWxsUGF0aCgpLCBpbmRlbnQsIHRydWUsIHVua25vd25FbGVtZW50cyk7CisJCQkJKChDbGFzc3BhdGhFbnRyeSljbGFzc3BhdGhbaV0pLmVsZW1lbnRFbmNvZGUoeG1sV3JpdGVyLCB0aGlzLnByb2plY3QuZ2V0RnVsbFBhdGgoKSwgaW5kZW50LCB0cnVlLCB1bmtub3duRWxlbWVudHMsIGZhbHNlKTsKIAkJCX0KLQkKKwogCQkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKIAkJCQlvdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CiAJCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5tYWtlUmVsYXRpdmUoKTsKQEAgLTk2Miw3ICsxMDQ0LDEzIEBACiAJCQkJcGFyYW1ldGVycy5wdXQoQ2xhc3NwYXRoRW50cnkuVEFHX1BBVEgsIFN0cmluZy52YWx1ZU9mKG91dHB1dExvY2F0aW9uKSk7CiAJCQkJeG1sV3JpdGVyLnByaW50VGFnKENsYXNzcGF0aEVudHJ5LlRBR19DTEFTU1BBVEhFTlRSWSwgcGFyYW1ldGVycywgaW5kZW50LCB0cnVlLCB0cnVlKTsKIAkJCX0KLQkKKworCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRFbnRyaWVzLmxlbmd0aDsgKytpKSB7CisJCQkJCSgoQ2xhc3NwYXRoRW50cnkpIHJlZmVyZW5jZWRFbnRyaWVzW2ldKS5lbGVtZW50RW5jb2RlKHhtbFdyaXRlciwgdGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCksIGluZGVudCwgdHJ1ZSwgdW5rbm93bkVsZW1lbnRzLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCQkKIAkJCXhtbFdyaXRlci5lbmRUYWcoQ2xhc3NwYXRoRW50cnkuVEFHX0NMQVNTUEFUSCwgaW5kZW50LCB0cnVlLyppbnNlcnQgbmV3IGxpbmUqLyk7CiAJCQl3cml0ZXIuZmx1c2goKTsKIAkJCXdyaXRlci5jbG9zZSgpOwpAQCAtOTcwLDE2ICsxMDU4LDE2IEBACiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOwogCQl9Ci0JfQkKKwl9CiAKIAlwdWJsaWMgU3RyaW5nIGVuY29kZUNsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewogCQl0cnkgewogCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzLCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCiAJCQlYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcih3cml0ZXIsIHRoaXMsIGZhbHNlLypkb24ndCBwcmludCBYTUwgdmVyc2lvbiovKTsKLQkJCQotCQkJKChDbGFzc3BhdGhFbnRyeSljbGFzc3BhdGhFbnRyeSkuZWxlbWVudEVuY29kZSh4bWxXcml0ZXIsIHRoaXMucHJvamVjdC5nZXRGdWxsUGF0aCgpLCB0cnVlLyppbmRlbnQqLywgdHJ1ZS8qaW5zZXJ0IG5ldyBsaW5lKi8sIG51bGwvKm5vdCBpbnRlcmVzdGVkIGluIHVua25vd24gZWxlbWVudHMqLyk7Ci0JCisKKwkJCSgoQ2xhc3NwYXRoRW50cnkpY2xhc3NwYXRoRW50cnkpLmVsZW1lbnRFbmNvZGUoeG1sV3JpdGVyLCB0aGlzLnByb2plY3QuZ2V0RnVsbFBhdGgoKSwgdHJ1ZS8qaW5kZW50Ki8sIHRydWUvKmluc2VydCBuZXcgbGluZSovLCBudWxsLypub3QgaW50ZXJlc3RlZCBpbiB1bmtub3duIGVsZW1lbnRzKi8sIChjbGFzc3BhdGhFbnRyeS5nZXRSZWZlcmVuY2luZ0VudHJ5KCkgIT0gbnVsbCkpOworCiAJCQl3cml0ZXIuZmx1c2goKTsKIAkJCXdyaXRlci5jbG9zZSgpOwogCQkJcmV0dXJuIHMudG9TdHJpbmcoIlVURjgiKTsvLyROT04tTkxTLTEkCkBAIC05OTEsMzIgKzEwNzksMjMgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYW5kbGUgcmVwcmVzZW50cyB0aGUgc2FtZSBKYXZhIHByb2plY3QKIAkgKiBhcyB0aGUgZ2l2ZW4gaGFuZGxlLiBUd28gaGFuZGxlcyByZXByZXNlbnQgdGhlIHNhbWUKLQkgKiBwcm9qZWN0IGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHJlcHJlc2VudCBhIHByb2plY3Qgd2l0aCAKKwkgKiBwcm9qZWN0IGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHJlcHJlc2VudCBhIHByb2plY3Qgd2l0aAogCSAqIHRoZSBzYW1lIHVuZGVybHlpbmcgcmVzb3VyY2UgYW5kIG9jY3VycmVuY2UgY291bnRzLgogCSAqCiAJICogQHNlZSBKYXZhRWxlbWVudCNlcXVhbHMoT2JqZWN0KQogCSAqLwogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQorCiAJCWlmICh0aGlzID09IG8pCiAJCQlyZXR1cm4gdHJ1ZTsKLQkKKwogCQlpZiAoIShvIGluc3RhbmNlb2YgSmF2YVByb2plY3QpKQogCQkJcmV0dXJuIGZhbHNlOwotCQorCiAJCUphdmFQcm9qZWN0IG90aGVyID0gKEphdmFQcm9qZWN0KSBvOwogCQlyZXR1cm4gdGhpcy5wcm9qZWN0LmVxdWFscyhvdGhlci5nZXRQcm9qZWN0KCkpOwogCX0KIAotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLnByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgb3BlbgotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdCNmaW5kRWxlbWVudChJUGF0aCkKIAkgKi8KQEAgLTEwMjgsNyArMTEwNyw3IEBACiAJICogQHNlZSBJSmF2YVByb2plY3QjZmluZEVsZW1lbnQoSVBhdGgsIFdvcmtpbmdDb3B5T3duZXIpCiAJICovCiAJcHVibGljIElKYXZhRWxlbWVudCBmaW5kRWxlbWVudChJUGF0aCBwYXRoLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzQWJzb2x1dGUoKSkgewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbigKIAkJCQluZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBwYXRoKSk7CkBAIC0xMDM4LDI0ICsxMTE3LDcgQEAKIAkJCVN0cmluZyBleHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKIAkJCWlmIChleHRlbnNpb24gPT0gbnVsbCkgewogCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQotCQkJCU5hbWVMb29rdXAgbG9va3VwID0gbmV3TmFtZUxvb2t1cCgoV29ya2luZ0NvcHlPd25lciludWxsLypubyBuZWVkIHRvIGxvb2sgYXQgd29ya2luZyBjb3BpZXMgZm9yIHBrZ3MqLyk7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFtdIHBrZ0ZyYWdtZW50cyA9IGxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhwYWNrYWdlTmFtZSwgZmFsc2UpOwotCQkJCWlmIChwa2dGcmFnbWVudHMgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRyeSB0byByZXR1cm4gb25lIHRoYXQgaXMgYSBjaGlsZCBvZiB0aGlzIHByb2plY3QKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBrZ0ZyYWdtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCi0JCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZ0ZyYWdtZW50ID0gcGtnRnJhZ21lbnRzW2ldOwotCQkJCQkJaWYgKHRoaXMuZXF1YWxzKHBrZ0ZyYWdtZW50LmdldFBhcmVudCgpLmdldFBhcmVudCgpKSkgewotCQkJCQkJCXJldHVybiBwa2dGcmFnbWVudDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBkZWZhdWx0IHRvIHRoZSBmaXJzdCBvbmUKLQkJCQkJcmV0dXJuIHBrZ0ZyYWdtZW50c1swXTsKLQkJCQl9CisJCQkJcmV0dXJuIGZpbmRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwogCQkJfSBlbHNlIGlmIChVdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShwYXRoLmxhc3RTZWdtZW50KCkpCiAJCQkJCXx8IGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKEVYVEVOU0lPTl9jbGFzcykpIHsKIAkJCQlJUGF0aCBwYWNrYWdlUGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwpAQCAtMTA5OSw2ICsxMTYxLDM1IEBACiAJCX0KIAl9CiAKKwlwdWJsaWMgSUphdmFFbGVtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKQorCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCU5hbWVMb29rdXAgbG9va3VwID0gbmV3TmFtZUxvb2t1cCgoV29ya2luZ0NvcHlPd25lciludWxsLypubyBuZWVkIHRvIGxvb2sgYXQgd29ya2luZyBjb3BpZXMgZm9yIHBrZ3MqLyk7CisJCUlQYWNrYWdlRnJhZ21lbnRbXSBwa2dGcmFnbWVudHMgPSBsb29rdXAuZmluZFBhY2thZ2VGcmFnbWVudHMocGFja2FnZU5hbWUsIGZhbHNlKTsKKwkJaWYgKHBrZ0ZyYWdtZW50cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKworCQl9IGVsc2UgeworCQkJLy8gdHJ5IHRvIHJldHVybiBvbmUgdGhhdCBpcyBhIGNoaWxkIG9mIHRoaXMgcHJvamVjdAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBrZ0ZyYWdtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCisJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnbWVudCA9IHBrZ0ZyYWdtZW50c1tpXTsKKwkJCQlpZiAoZXF1YWxzKHBrZ0ZyYWdtZW50LmdldFBhcmVudCgpLmdldFBhcmVudCgpKSkgeworCQkJCQlyZXR1cm4gcGtnRnJhZ21lbnQ7CisJCQkJfQorCQkJfQorCQkJLy8gZGVmYXVsdCB0byB0aGUgZmlyc3Qgb25lCisJCQlyZXR1cm4gcGtnRnJhZ21lbnRzWzBdOworCQl9CisJfQorCisJcHVibGljIElKYXZhRWxlbWVudCBmaW5kRWxlbWVudChTdHJpbmcgYmluZGluZ0tleSwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUphdmFFbGVtZW50RmluZGVyIGVsZW1lbnRGaW5kZXIgPSBuZXcgSmF2YUVsZW1lbnRGaW5kZXIoYmluZGluZ0tleSwgdGhpcywgb3duZXIpOworCQllbGVtZW50RmluZGVyLnBhcnNlKCk7CisJCWlmIChlbGVtZW50RmluZGVyLmV4Y2VwdGlvbiAhPSBudWxsKQorCQkJdGhyb3cgZWxlbWVudEZpbmRlci5leGNlcHRpb247CisJCXJldHVybiBlbGVtZW50RmluZGVyLmVsZW1lbnQ7CisJfQorCiAJLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KQEAgLTExMTAsNyArMTIwMSw3IEBACiAJLyoKIAkgKiBub24gcGF0aCBjYW5vbmljYWxpemluZyB2ZXJzaW9uCiAJICovCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQwKElQYXRoIHBhdGgpIAorCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50MChJUGF0aCBwYXRoKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlOYW1lTG9va3VwIGxvb2t1cCA9IG5ld05hbWVMb29rdXAoKFdvcmtpbmdDb3B5T3duZXIpbnVsbC8qbm8gbmVlZCB0byBsb29rIGF0IHdvcmtpbmcgY29waWVzIGZvciBwa2dzKi8pOwpAQCAtMTEyNiwxNCArMTIxNywxNCBAQAogCQlyZXR1cm4gZmluZFBhY2thZ2VGcmFnbWVudFJvb3QwKEphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpKTsKIAl9CiAJLyoKLQkgKiBubyBwYXRoIGNhbm9uaWNhbGl6YXRpb24gCisJICogbm8gcGF0aCBjYW5vbmljYWxpemF0aW9uCiAJICovCiAJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChJUGF0aCBwYXRoKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGFsbFJvb3RzID0gdGhpcy5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwogCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLnBhdGhfbXVzdEJlQWJzb2x1dGUpOyAKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMucGF0aF9tdXN0QmVBYnNvbHV0ZSk7CiAJCX0KIAkJZm9yIChpbnQgaT0gMDsgaSA8IGFsbFJvb3RzLmxlbmd0aDsgaSsrKSB7CiAJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBjbGFzc3BhdGhSb290PSBhbGxSb290c1tpXTsKQEAgLTExNDgsMTIgKzEyMzksMTIgQEAKIAkgKi8KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CiAJCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSB0aGlzLmdldFJhd0NsYXNzcGF0aCgpOworCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gZ2V0UmF3Q2xhc3NwYXRoKCk7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKGNsYXNzcGF0aFtpXS5lcXVhbHMoZW50cnkpKSB7IC8vIGVudHJ5IG1heSBuZWVkIHRvIGJlIHJlc29sdmVkCi0JCQkJCXJldHVybiAKKwkJCQkJcmV0dXJuCiAJCQkJCQljb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoCi0JCQkJCQkJcmVzb2x2ZUNsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W10ge2VudHJ5fSksIAorCQkJCQkJCXJlc29sdmVDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHtlbnRyeX0pLAogCQkJCQkJCWZhbHNlLCAvLyBkb24ndCByZXRyaWV2ZSBleHBvcnRlZCByb290cwogCQkJCQkJCW51bGwpOyAvKm5vIHJldmVyc2UgbWFwKi8KIAkJCQl9CkBAIC0xMjE0LDEzICsxMzA1LDEzIEBACiAJICovCiAJcHVibGljIElUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXJldHVybiBmaW5kVHlwZShwYWNrYWdlTmFtZSwgdHlwZVF1YWxpZmllZE5hbWUsIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlksIHByb2dyZXNzTW9uaXRvcik7Ci0JfQkKKwl9CiAJLyoKIAkgKiBJbnRlcm5hbCBmaW5kVHlwZSB3aXRoIGluc3RhbmNpYXRlZCBuYW1lIGxvb2t1cAogCSAqLwogCUlUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLCBOYW1lTG9va3VwIGxvb2t1cCwgYm9vbGVhbiBjb25zaWRlclNlY29uZGFyeVR5cGVzLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCU5hbWVMb29rdXAuQW5zd2VyIGFuc3dlciA9IGxvb2t1cC5maW5kVHlwZSgKLQkJCXR5cGVRdWFsaWZpZWROYW1lLCAKKwkJCXR5cGVRdWFsaWZpZWROYW1lLAogCQkJcGFja2FnZU5hbWUsCiAJCQlmYWxzZSwKIAkJCU5hbWVMb29rdXAuQUNDRVBUX0FMTCwKQEAgLTEyMjksNyArMTMyMCw3IEBACiAJCQlmYWxzZS8qZG9uJ3QgY2hlY2sgcmVzdHJpY3Rpb25zKi8sCiAJCQlwcm9ncmVzc01vbml0b3IpOwogCQlyZXR1cm4gYW5zd2VyID09IG51bGwgPyBudWxsIDogYW5zd2VyLnR5cGU7Ci0JfQkKKwl9CiAJLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QjZmluZFR5cGUoU3RyaW5nLCBTdHJpbmcsIFdvcmtpbmdDb3B5T3duZXIpCiAJICovCkBAIC0xMjM3LDEyICsxMzI4LDEyIEBACiAJCU5hbWVMb29rdXAgbG9va3VwID0gbmV3TmFtZUxvb2t1cChvd25lcik7CiAJCXJldHVybiBmaW5kVHlwZSgKIAkJCXBhY2thZ2VOYW1lLAotCQkJdHlwZVF1YWxpZmllZE5hbWUsIAorCQkJdHlwZVF1YWxpZmllZE5hbWUsCiAJCQlsb29rdXAsCiAJCQlmYWxzZSwgLy8gZG8gbm90IGNvbnNpZGVyIHNlY29uZGFyeSB0eXBlcwogCQkJbnVsbCk7Ci0JfQkKLQkKKwl9CisKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdCNmaW5kVHlwZShTdHJpbmcsIFN0cmluZywgV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KQEAgLTEyNTAsNyArMTM0MSw3IEBACiAJCU5hbWVMb29rdXAgbG9va3VwID0gbmV3TmFtZUxvb2t1cChvd25lcik7CiAJCXJldHVybiBmaW5kVHlwZSgKIAkJCXBhY2thZ2VOYW1lLAotCQkJdHlwZVF1YWxpZmllZE5hbWUsIAorCQkJdHlwZVF1YWxpZmllZE5hbWUsCiAJCQlsb29rdXAsCiAJCQl0cnVlLCAvLyBjb25zaWRlciBzZWNvbmRhcnkgdHlwZXMKIAkJCXByb2dyZXNzTW9uaXRvcik7CkBAIC0xMjYyLDcgKzEzNTMsNyBAQAogCXB1YmxpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJTmFtZUxvb2t1cCBsb29rdXAgPSBuZXdOYW1lTG9va3VwKG93bmVyKTsKIAkJcmV0dXJuIGZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSwgbG9va3VwLCBmYWxzZSwgbnVsbCk7Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdCNmaW5kVHlwZShTdHJpbmcsIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpCkBAIC0xMjc1LDE4ICsxMzY2LDIwIEBACiAJLyoqCiAJICogUmVtb3ZlIGFsbCBtYXJrZXJzIGRlbm90aW5nIGNsYXNzcGF0aCBwcm9ibGVtcwogCSAqLyAvL1RPRE8gKHBoaWxpcHBlKSBzaG91bGQgaW1wcm92ZSB0byB1c2UgYSBiaXRtYXNrIGluc3RlYWQgb2YgYm9vbGVhbnMgKENZQ0xFLCBGT1JNQVQsIFZBTElEKQotCXByb3RlY3RlZCB2b2lkIGZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoYm9vbGVhbiBmbHVzaEN5Y2xlTWFya2VycywgYm9vbGVhbiBmbHVzaENsYXNzcGF0aEZvcm1hdE1hcmtlcnMpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKGJvb2xlYW4gZmx1c2hDeWNsZU1hcmtlcnMsIGJvb2xlYW4gZmx1c2hDbGFzc3BhdGhGb3JtYXRNYXJrZXJzLCBib29sZWFuIGZsdXNoT3ZlcmxhcHBpbmdPdXRwdXRNYXJrZXJzKSB7CiAJCXRyeSB7CiAJCQlpZiAodGhpcy5wcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7CiAJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSB0aGlzLnByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CiAJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlpZiAoZmx1c2hDeWNsZU1hcmtlcnMgJiYgZmx1c2hDbGFzc3BhdGhGb3JtYXRNYXJrZXJzKSB7CisJCQkJCWlmIChmbHVzaEN5Y2xlTWFya2VycyAmJiBmbHVzaENsYXNzcGF0aEZvcm1hdE1hcmtlcnMgJiYgZmx1c2hPdmVybGFwcGluZ091dHB1dE1hcmtlcnMpIHsKIAkJCQkJCW1hcmtlci5kZWxldGUoKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCVN0cmluZyBjeWNsZUF0dHIgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5DWUNMRV9ERVRFQ1RFRCk7CiAJCQkJCQlTdHJpbmcgY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIgPSAgKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ0xBU1NQQVRIX0ZJTEVfRk9STUFUKTsKKwkJCQkJCVN0cmluZyBvdmVybGFwcGluZ091dHB1dEF0dHIgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuT1VUUFVUX09WRVJMQVBQSU5HX1NPVVJDRSk7CiAJCQkJCQlpZiAoKGZsdXNoQ3ljbGVNYXJrZXJzID09IChjeWNsZUF0dHIgIT0gbnVsbCAmJiBjeWNsZUF0dHIuZXF1YWxzKCJ0cnVlIikpKSAvLyROT04tTkxTLTEkCisJCQkJCQkJJiYgKGZsdXNoT3ZlcmxhcHBpbmdPdXRwdXRNYXJrZXJzID09IChvdmVybGFwcGluZ091dHB1dEF0dHIgIT0gbnVsbCAmJiBvdmVybGFwcGluZ091dHB1dEF0dHIuZXF1YWxzKCJ0cnVlIikpKSAvLyROT04tTkxTLTEkCiAJCQkJCQkJJiYgKGZsdXNoQ2xhc3NwYXRoRm9ybWF0TWFya2VycyA9PSAoY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIgIT0gbnVsbCAmJiBjbGFzc3BhdGhGaWxlRm9ybWF0QXR0ci5lcXVhbHMoInRydWUiKSkpKXsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKIAkJCQkJCX0KQEAgLTEzMDAsOCArMTM5Myw4IEBACiAJCQl9CiAJCX0KIAl9Ci0JCi0JLyoqIAorCisJLyoqCiAJICogUmV0dXJucyB0aGUgc2V0IG9mIHBhdHRlcm5zIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwcm9qZWN0IHZpc2liaWxpdHkgZ2l2ZW4gcnVsZXMKIAkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIElQYXRoIG9yIG51bGwgaWYgbm9uZQogCSAqLwpAQCAtMTM0OSw5ICsxNDQyLDE0IEBACiAJCU1hcCByb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzID0gcGVyUHJvamVjdEluZm8ucm9vdFBhdGhUb1Jlc29sdmVkRW50cmllczsKIAkJaWYgKHJvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeSkgcm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcy5nZXQocGF0aCk7CisJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIHJvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMuZ2V0KHBhdGgpOworCQlpZiAoY2xhc3NwYXRoRW50cnkgPT0gbnVsbCkgeworCQkJcGF0aCA9IGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQocGF0aCk7CisJCQljbGFzc3BhdGhFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIHJvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMuZ2V0KHBhdGgpOworCQl9CisJCXJldHVybiBjbGFzc3BhdGhFbnRyeTsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgdGhlIGN5Y2xlIG1hcmtlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0IG9yIG51bGwgaWYgbm9uZS4KIAkgKi8KQEAgLTEzNzMsNjIgKzE0NzEsNzQgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JCS8qKgotICAgIAkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGN1c3RvbSBwcmVmZXJlbmNlIHBvb2wuCi0gICAgCSAqIFByb2plY3QgcHJlZmVyZW5jZXMgbWF5IGluY2x1ZGUgY3VzdG9tIGVuY29kaW5nLgotICAgIAkgKiBAcmV0dXJuIElFY2xpcHNlUHJlZmVyZW5jZXMKLSAgICAJICovCi0gICAgCXB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldEVjbGlwc2VQcmVmZXJlbmNlcygpewotICAgIAkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHRoaXMucHJvamVjdCkpIHJldHVybiBudWxsOwotICAgIAkJLy8gR2V0IGNhY2hlZCBwcmVmZXJlbmNlcyBpZiBleGlzdAotICAgIAkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvKHRoaXMucHJvamVjdCwgdHJ1ZSk7Ci0gICAgCQlpZiAocGVyUHJvamVjdEluZm8ucHJlZmVyZW5jZXMgIT0gbnVsbCkgcmV0dXJuIHBlclByb2plY3RJbmZvLnByZWZlcmVuY2VzOwotICAgIAkJLy8gSW5pdCBwcm9qZWN0IHByZWZlcmVuY2VzCi0gICAgCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKGdldFByb2plY3QoKSk7Ci0gICAgCQlmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOwotICAgIAkJdXBkYXRlUHJlZmVyZW5jZXMoZWNsaXBzZVByZWZlcmVuY2VzKTsKLSAgICAJCXBlclByb2plY3RJbmZvLnByZWZlcmVuY2VzID0gZWNsaXBzZVByZWZlcmVuY2VzOwotICAgIAotICAgIAkJLy8gTGlzdGVuIHRvIG5vZGUgcmVtb3ZhbCBmcm9tIHBhcmVudCBpbiBvcmRlciB0byByZXNldCBjYWNoZSAoc2VlIGJ1ZyA2ODk5MykKLSAgICAJCUlFY2xpcHNlUHJlZmVyZW5jZXMuSU5vZGVDaGFuZ2VMaXN0ZW5lciBub2RlTGlzdGVuZXIgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlcy5JTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotICAgIAkJCXB1YmxpYyB2b2lkIGFkZGVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgCQkJCS8vIGRvIG5vdGhpbmcKLSAgICAJCQl9Ci0gICAgCQkJcHVibGljIHZvaWQgcmVtb3ZlZChJRWNsaXBzZVByZWZlcmVuY2VzLk5vZGVDaGFuZ2VFdmVudCBldmVudCkgewotICAgIAkJCQlpZiAoZXZlbnQuZ2V0Q2hpbGQoKSA9PSBlY2xpcHNlUHJlZmVyZW5jZXMpIHsKLSAgICAJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlc2V0UHJvamVjdFByZWZlcmVuY2VzKEphdmFQcm9qZWN0LnRoaXMpOwotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfTsKLSAgICAJCSgoSUVjbGlwc2VQcmVmZXJlbmNlcykgZWNsaXBzZVByZWZlcmVuY2VzLnBhcmVudCgpKS5hZGROb2RlQ2hhbmdlTGlzdGVuZXIobm9kZUxpc3RlbmVyKTsKLSAgICAKLSAgICAJCS8vIExpc3RlbiB0byBwcmVmZXJlbmNlIGNoYW5nZXMKLSAgICAJCUlFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotICAgIAkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoSUVjbGlwc2VQcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldEtleSgpOwotCQkJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJCQkJaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEphdmFDb3JlLlBMVUdJTl9JRCkpIHsKLQkJCQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0RVUExJQ0FURV9SRVNPVVJDRSkgfHwKLQkJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9SRUNSRUFURV9NT0RJRklFRF9DTEFTU19GSUxFU19JTl9PVVRQVVRfRk9MREVSKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRIKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX0VYQ0xVU0lPTl9QQVRURVJOUykgfHwKLQkJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9JTkNPTVBMRVRFX0NMQVNTUEFUSCkgfHwKLQkJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRIKSB8fAotCQkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMKSkKLQkJCQkJCXsKLQkJCQkJCQltYW5hZ2VyLmRlbHRhU3RhdGUuYWRkQ2xhc3NwYXRoVmFsaWRhdGlvbihKYXZhUHJvamVjdC50aGlzKTsKLQkJCQkJCX0KLQkJCQkJCW1hbmFnZXIucmVzZXRQcm9qZWN0T3B0aW9ucyhKYXZhUHJvamVjdC50aGlzKTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX07Ci0gICAgCQllY2xpcHNlUHJlZmVyZW5jZXMuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VMaXN0ZW5lcik7Ci0gICAgCQlyZXR1cm4gZWNsaXBzZVByZWZlcmVuY2VzOwotICAgIAl9Ci0JCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHByb2plY3QgY3VzdG9tIHByZWZlcmVuY2UgcG9vbC4KKwkgKiBQcm9qZWN0IHByZWZlcmVuY2VzIG1heSBpbmNsdWRlIGN1c3RvbSBlbmNvZGluZy4KKwkgKiBAcmV0dXJuIElFY2xpcHNlUHJlZmVyZW5jZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3QKKwkgKiAJZG9lcyBub3QgaGF2ZSBhIGphdmEgbmF0dXJlLgorCSAqLworCXB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldEVjbGlwc2VQcmVmZXJlbmNlcygpIHsKKwkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHRoaXMucHJvamVjdCkpIHJldHVybiBudWxsOworCQkvLyBHZXQgY2FjaGVkIHByZWZlcmVuY2VzIGlmIGV4aXN0CisJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mbyh0aGlzLnByb2plY3QsIHRydWUpOworCQlpZiAocGVyUHJvamVjdEluZm8ucHJlZmVyZW5jZXMgIT0gbnVsbCkgcmV0dXJuIHBlclByb2plY3RJbmZvLnByZWZlcmVuY2VzOworCQkvLyBJbml0IHByb2plY3QgcHJlZmVyZW5jZXMKKwkJSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShnZXRQcm9qZWN0KCkpOworCQlmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0Tm9kZShKYXZhQ29yZS5QTFVHSU5fSUQpOworCQl1cGRhdGVQcmVmZXJlbmNlcyhlY2xpcHNlUHJlZmVyZW5jZXMpOworCQlwZXJQcm9qZWN0SW5mby5wcmVmZXJlbmNlcyA9IGVjbGlwc2VQcmVmZXJlbmNlczsKKworCQkvLyBMaXN0ZW4gdG8gbmV3IHByZWZlcmVuY2VzIG5vZGUKKwkJZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBlY2xpcHNlUGFyZW50UHJlZmVyZW5jZXMgPSAoSUVjbGlwc2VQcmVmZXJlbmNlcykgZWNsaXBzZVByZWZlcmVuY2VzLnBhcmVudCgpOworCQlpZiAoZWNsaXBzZVBhcmVudFByZWZlcmVuY2VzICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLnByZWZlcmVuY2VzTm9kZUxpc3RlbmVyICE9IG51bGwpIHsKKwkJCQllY2xpcHNlUGFyZW50UHJlZmVyZW5jZXMucmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZXNOb2RlTGlzdGVuZXIpOworCQkJfQorCQkJdGhpcy5wcmVmZXJlbmNlc05vZGVMaXN0ZW5lciA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWRkZWQoSUVjbGlwc2VQcmVmZXJlbmNlcy5Ob2RlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJLy8gZG8gbm90aGluZworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCByZW1vdmVkKElFY2xpcHNlUHJlZmVyZW5jZXMuTm9kZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCWlmIChldmVudC5nZXRDaGlsZCgpID09IGVjbGlwc2VQcmVmZXJlbmNlcykgeworCQkJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVzZXRQcm9qZWN0UHJlZmVyZW5jZXMoSmF2YVByb2plY3QudGhpcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQkJZWNsaXBzZVBhcmVudFByZWZlcmVuY2VzLmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VzTm9kZUxpc3RlbmVyKTsKKwkJfQorCisJCS8vIExpc3RlbiB0byBwcmVmZXJlbmNlcyBjaGFuZ2VzCisJCWlmICh0aGlzLnByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgeworCQkJZWNsaXBzZVByZWZlcmVuY2VzLnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIpOworCQl9CisJCXRoaXMucHJlZmVyZW5jZXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKElFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldEtleSgpOworCQkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJCWlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChKYXZhQ29yZS5QTFVHSU5fSUQpKSB7CisJCQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSKSB8fAorCQkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfUkVTT1VSQ0VfQ09QWV9GSUxURVIpIHx8CisJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UpIHx8CisJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9SRUNSRUFURV9NT0RJRklFRF9DTEFTU19GSUxFU19JTl9PVVRQVVRfRk9MREVSKSB8fAorCQkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgpIHx8CisJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMpIHx8CisJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TKSB8fAorCQkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRIKSB8fAorCQkJCQkJcHJvcGVydHlOYW1lLmVxdWFscyhKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCkgfHwKKwkJCQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoSmF2YUNvcmUuQ09SRV9PVVRQVVRfTE9DQVRJT05fT1ZFUkxBUFBJTkdfQU5PVEhFUl9TT1VSQ0UpIHx8CisJCQkJCQlwcm9wZXJ0eU5hbWUuZXF1YWxzKEphdmFDb3JlLkNPUkVfSU5DT01QQVRJQkxFX0pES19MRVZFTCkpCisJCQkJCXsKKwkJCQkJCW1hbmFnZXIuZGVsdGFTdGF0ZS5hZGRDbGFzc3BhdGhWYWxpZGF0aW9uKEphdmFQcm9qZWN0LnRoaXMpOworCQkJCQl9CisJCQkJCW1hbmFnZXIucmVzZXRQcm9qZWN0T3B0aW9ucyhKYXZhUHJvamVjdC50aGlzKTsKKwkJCQkJSmF2YVByb2plY3QudGhpcy5yZXNldENhY2hlcygpOyAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzU2OAorCQkJCX0KKwkJCX0KKwkJfTsKKwkJZWNsaXBzZVByZWZlcmVuY2VzLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VzQ2hhbmdlTGlzdGVuZXIpOworCQlyZXR1cm4gZWNsaXBzZVByZWZlcmVuY2VzOworCX0KKwogCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLnByb2plY3QuZ2V0TmFtZSgpOwogCX0KQEAgLTE0NDEsMjAgKzE1NTEsMjAgQEAKIAl9CiAKIAkvKioKLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCByZXR1cm5pbmcgdGhlIGV4cGFuZGVkIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QsIGFzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcywgCisJICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgcmV0dXJuaW5nIHRoZSBleHBhbmRlZCBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMsCiAJICogd2hlcmUgYWxsIGNsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGhhdmUgYmVlbiByZXNvbHZlZCBhbmQgc3Vic3RpdHV0ZWQgd2l0aCB0aGVpciBmaW5hbCB0YXJnZXQgZW50cmllcy4KIAkgKiBBbGwgcHJvamVjdCBleHBvcnRzIGhhdmUgYmVlbiBhcHBlbmRlZCB0byBwcm9qZWN0IGVudHJpZXMuCiAJICogQHJldHVybiBJQ2xhc3NwYXRoRW50cnlbXQogCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCiAJICovCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldEV4cGFuZGVkQ2xhc3NwYXRoKCkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZEVudHJpZXMgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CQkKKworCQkJT2JqZWN0VmVjdG9yIGFjY3VtdWxhdGVkRW50cmllcyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKIAkJCWNvbXB1dGVFeHBhbmRlZENsYXNzcGF0aChudWxsLCBuZXcgSGFzaFNldCg1KSwgYWNjdW11bGF0ZWRFbnRyaWVzKTsKLQkJCQorCiAJCQlJQ2xhc3NwYXRoRW50cnlbXSBleHBhbmRlZFBhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2FjY3VtdWxhdGVkRW50cmllcy5zaXplKCldOwogCQkJYWNjdW11bGF0ZWRFbnRyaWVzLmNvcHlJbnRvKGV4cGFuZGVkUGF0aCk7Ci0JCQkKKwogCQkJcmV0dXJuIGV4cGFuZGVkUGF0aDsKIAl9CiAKQEAgLTE0ODAsMTIgKzE1OTAsMTEgQEAKIAkJCQl0b2tlbiA9IG51bGw7CiAJCQkJd2hpbGUgKG1lbWVudG8uaGFzTW9yZVRva2VucygpKSB7CiAJCQkJCXRva2VuID0gbWVtZW50by5uZXh0VG9rZW4oKTsKLQkJCQkJY2hhciBmaXJzdENoYXIgPSB0b2tlbi5jaGFyQXQoMCk7Ci0JCQkJCWlmIChmaXJzdENoYXIgIT0gSkVNX1BBQ0tBR0VGUkFHTUVOVCAmJiBmaXJzdENoYXIgIT0gSkVNX0NPVU5UKSB7Ci0JCQkJCQlyb290UGF0aCArPSB0b2tlbjsKLQkJCQkJfSBlbHNlIHsKKwkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTgyMQorCQkJCQlpZiAodG9rZW4gPT0gTWVtZW50b1Rva2VuaXplci5QQUNLQUdFRlJBR01FTlQgfHwgdG9rZW4gPT0gTWVtZW50b1Rva2VuaXplci5DT1VOVCkgewogCQkJCQkJYnJlYWs7CiAJCQkJCX0KKwkJCQkJcm9vdFBhdGggKz0gdG9rZW47CiAJCQkJfQogCQkJCUphdmFFbGVtZW50IHJvb3QgPSAoSmF2YUVsZW1lbnQpZ2V0UGFja2FnZUZyYWdtZW50Um9vdChuZXcgUGF0aChyb290UGF0aCkpOwogCQkJCWlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuLmNoYXJBdCgwKSA9PSBKRU1fUEFDS0FHRUZSQUdNRU5UKSB7CkBAIC0xNTE5LDcgKzE2MjgsNyBAQAogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzcGVjaWZpYyB0eXBlIG9mIGluZm8gZm9yIGEgSmF2YSBwcm9qZWN0LgogCSAqLwpAQCAtMTUzNiwyMyArMTY0NSwxNCBAQAogCiAJCXJldHVybiAoKEphdmFQcm9qZWN0RWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXModGhpcyk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QjZ2V0T3B0aW9uKFN0cmluZywgYm9vbGVhbikKLQkgKi8JCisJICovCiAJcHVibGljIFN0cmluZyBnZXRPcHRpb24oU3RyaW5nIG9wdGlvbk5hbWUsIGJvb2xlYW4gaW5oZXJpdEphdmFDb3JlT3B0aW9ucykgewotCQkKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IG9wdGlvbk5hbWU7Ci0JCWlmIChKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5vcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKXsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzID0gZ2V0RWNsaXBzZVByZWZlcmVuY2VzKCk7Ci0JCQlTdHJpbmcgamF2YUNvcmVEZWZhdWx0ID0gaW5oZXJpdEphdmFDb3JlT3B0aW9ucyA/IEphdmFDb3JlLmdldE9wdGlvbihwcm9wZXJ0eU5hbWUpIDogbnVsbDsKLQkJCWlmIChwcm9qZWN0UHJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuIGphdmFDb3JlRGVmYXVsdDsKLQkJCVN0cmluZyB2YWx1ZSA9IHByb2plY3RQcmVmZXJlbmNlcy5nZXQocHJvcGVydHlOYW1lLCBqYXZhQ29yZURlZmF1bHQpOwotCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUudHJpbSgpOwotCQl9Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0T3B0aW9uKG9wdGlvbk5hbWUsIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMsIGdldEVjbGlwc2VQcmVmZXJlbmNlcygpKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCNnZXRPcHRpb25zKGJvb2xlYW4pCiAJICovCkBAIC0xNTY0LDcgKzE2NjQsOCBAQAogCQkvLyBHZXQgcHJvamVjdCBzcGVjaWZpYyBvcHRpb25zCiAJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBudWxsOwogCQlIYXNodGFibGUgcHJvamVjdE9wdGlvbnMgPSBudWxsOwotCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkub3B0aW9uTmFtZXM7CisJCUphdmFNb2RlbE1hbmFnZXIgamF2YU1vZGVsTWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gamF2YU1vZGVsTWFuYWdlci5vcHRpb25OYW1lczsKIAkJdHJ5IHsKIAkJCXBlclByb2plY3RJbmZvID0gZ2V0UGVyUHJvamVjdEluZm8oKTsKIAkJCXByb2plY3RPcHRpb25zID0gcGVyUHJvamVjdEluZm8ub3B0aW9uczsKQEAgLTE1NzgsMTAgKzE2NzksMjQgQEAKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspewogCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTsKIAkJCQkJU3RyaW5nIHZhbHVlID0gcHJvamVjdFByZWZlcmVuY2VzLmdldChwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBvcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKXsKLQkJCQkJCXByb2plY3RPcHRpb25zLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlLnRyaW0oKSk7CisJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKKwkJCQkJCS8vIEtlZXAgdGhlIG9wdGlvbiB2YWx1ZSwgZXZlbiBpZiBpdCdzIGRlcHJlY2F0ZWQKKwkJCQkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDk4NworCQkJCQkJcHJvamVjdE9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgdmFsdWUpOworCQkJCQkJaWYgKCFvcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7CisJCQkJCQkJLy8gdHJ5IHRvIG1pZ3JhdGUgZGVwcmVjYXRlZCBvcHRpb25zCisJCQkJCQkJU3RyaW5nW10gY29tcGF0aWJsZU9wdGlvbnMgPSAoU3RyaW5nW10pIGphdmFNb2RlbE1hbmFnZXIuZGVwcmVjYXRlZE9wdGlvbnMuZ2V0KHByb3BlcnR5TmFtZSk7CisJCQkJCQkJaWYgKGNvbXBhdGlibGVPcHRpb25zICE9IG51bGwpIHsKKwkJCQkJCQkJZm9yIChpbnQgY289MCwgbGVuZ3RoPWNvbXBhdGlibGVPcHRpb25zLmxlbmd0aDsgY28gPCBsZW5ndGg7IGNvKyspIHsKKwkJCQkJCQkJCVN0cmluZyBjb21wYXRpYmxlT3B0aW9uID0gY29tcGF0aWJsZU9wdGlvbnNbY29dOworCQkJCQkJCQkJaWYgKCFwcm9qZWN0T3B0aW9ucy5jb250YWluc0tleShjb21wYXRpYmxlT3B0aW9uKSkKKwkJCQkJCQkJCQlwcm9qZWN0T3B0aW9ucy5wdXQoY29tcGF0aWJsZU9wdGlvbiwgdmFsdWUpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQogCQkJCQl9Ci0JCQkJfQkJCisJCQkJfQogCQkJCS8vIGNhY2hlIHByb2plY3Qgb3B0aW9ucwogCQkJCXBlclByb2plY3RJbmZvLm9wdGlvbnMgPSBwcm9qZWN0T3B0aW9uczsKIAkJCX0KQEAgLTE1OTgsMTIgKzE3MTMsMTQgQEAKIAkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwcm9wZXJ0eU5hbWVzLm5leHQoKTsKIAkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CiAJCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwgJiYgb3B0aW9uTmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKSl7CisJCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBqYXZhTW9kZWxNYW5hZ2VyLmtub3dzT3B0aW9uKHByb3BlcnR5TmFtZSkpewogCQkJCQlvcHRpb25zLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUudHJpbSgpKTsKIAkJCQl9CiAJCQl9CisJCQlVdGlsLmZpeFRhc2tUYWdzKG9wdGlvbnMpOwogCQkJcmV0dXJuIG9wdGlvbnM7CiAJCX0KKwkJVXRpbC5maXhUYXNrVGFncyhwcm9qZWN0T3B0aW9ucyk7CiAJCXJldHVybiBwcm9qZWN0T3B0aW9uczsKIAl9CiAKQEAgLTE2MTIsMjAgKzE3MjksMjAgQEAKIAkgKi8KIAlwdWJsaWMgSVBhdGggZ2V0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJLy8gRG8gbm90IGNyZWF0ZSBtYXJrZXIgd2hpbGUgZ2V0dGluZyBvdXRwdXQgbG9jYXRpb24KLQkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IHRoaXMuZ2V0UGVyUHJvamVjdEluZm8oKTsKKwkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IGdldFBlclByb2plY3RJbmZvKCk7CiAJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gcGVyUHJvamVjdEluZm8ub3V0cHV0TG9jYXRpb247CiAJCWlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsKSByZXR1cm4gb3V0cHV0TG9jYXRpb247Ci0JCQorCiAJCS8vIGZvcmNlIHRvIHJlYWQgY2xhc3NwYXRoIC0gd2lsbCBwb3NpdGlvbiBvdXRwdXQgbG9jYXRpb24gYXMgd2VsbAogCQlnZXRSYXdDbGFzc3BhdGgoKTsKLQkJCisKIAkJb3V0cHV0TG9jYXRpb24gPSBwZXJQcm9qZWN0SW5mby5vdXRwdXRMb2NhdGlvbjsKIAkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmRlZmF1bHRPdXRwdXRMb2NhdGlvbigpOworCQkJcmV0dXJuIGRlZmF1bHRPdXRwdXRMb2NhdGlvbigpOwogCQl9CiAJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcGFyYW0gcGF0aCBJUGF0aAogCSAqIEByZXR1cm4gQSBoYW5kbGUgdG8gdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoLgpAQCAtMTYzOSw0NiArMTc1Niw1NyBAQAogCQkJcGF0aCA9IGdldFBhdGgoKS5hcHBlbmQocGF0aCk7CiAJCX0KIAkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCXN3aXRjaCAoc2VnbWVudENvdW50KSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIDE6Ci0JCQkJaWYgKHBhdGguZXF1YWxzKGdldFBhdGgoKSkpIHsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTgxNAotCQkJCQkvLyBkZWZhdWx0IHJvb3QKLQkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5wcm9qZWN0KTsKLQkJCQl9Ci0JCQlkZWZhdWx0OgotCQkJCS8vIGEgcGF0aCBlbmRpbmcgd2l0aCAuamFyLy56aXAgaXMgc3RpbGwgYW1iaWd1b3VzIGFuZCBjb3VsZCBzdGlsbCByZXNvbHZlIHRvIGEgc291cmNlL2xpYiBmb2xkZXIgCi0JCQkJLy8gdGh1cyB3aWxsIHRyeSB0byBndWVzcyBiYXNlZCBvbiBleGlzdGluZyByZXNvdXJjZQotCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSkpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5wcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOyAKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpewotCQkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290MChwYXRoKTsKLQkJCQl9IGVsc2UgaWYgKHNlZ21lbnRDb3VudCA9PSAxKSB7Ci0JCQkJCS8vIGxpYiBiZWluZyBhbm90aGVyIHByb2plY3QKLQkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5wcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGxpYiBiZWluZyBhIGZvbGRlcgotCQkJCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLnByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKSk7Ci0JCQkJfQorCQlpZiAoc2VnbWVudENvdW50ID09IDApIHsKKwkJCXJldHVybiBudWxsOwogCQl9CisJCWlmIChwYXRoLmdldERldmljZSgpICE9IG51bGwgfHwgSmF2YU1vZGVsLmdldEV4dGVybmFsVGFyZ2V0KHBhdGgsIHRydWUvKmNoZWNrIGV4aXN0ZW5jZSovKSAhPSBudWxsKSB7CisJCQkvLyBleHRlcm5hbCBwYXRoCisJCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAocGF0aCk7CisJCX0KKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IHRoaXMucHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihwYXRoKTsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCS8vIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlCisJCQlpZiAocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgeworCQkJCWlmICghd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSkuZXhpc3RzKCkpIHsKKwkJCQkJLy8gYXNzdW1lIGl0IGlzIGFuIGV4dGVybmFsIFpJUCBhcmNoaXZlCisJCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290MChwYXRoKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBhc3N1bWUgaXQgaXMgYW4gaW50ZXJuYWwgWklQIGFyY2hpdmUKKwkJCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUocGF0aCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzZWdtZW50Q291bnQgPT0gMSkgeworCQkJCS8vIGFzc3VtZSBpdCBpcyBhIHByb2plY3QKKwkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwYXRoLnNlZ21lbnQoMCk7CisJCQkJaWYgKGdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKSkgeyAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1ODE0CisJCQkJCS8vIGRlZmF1bHQgcm9vdAorCQkJCQlyZXNvdXJjZSA9IHRoaXMucHJvamVjdDsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBsaWIgYmVpbmcgYW5vdGhlciBwcm9qZWN0CisJCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIGFzc3VtZSBpdCBpcyBhbiBpbnRlcm5hbCBmb2xkZXIKKwkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKHBhdGgpOworCQkJfQorCQl9CisJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlKTsKIAl9CiAKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSwgbnVsbC8qbm8gZW50cnkgcGF0aCovKTsKKwl9CiAKKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlLCBJUGF0aCBlbnRyeVBhdGgpIHsKIAkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKIAkJCWNhc2UgSVJlc291cmNlLkZJTEU6Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KKwkJCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMpOwogCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgorCQkJCWlmIChFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmlzSW50ZXJuYWxQYXRoRm9yRXh0ZXJuYWxGb2xkZXIocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpCisJCQkJCXJldHVybiBuZXcgRXh0ZXJuYWxQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCBlbnRyeVBhdGgsIHRoaXMpOwogCQkJCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSwgdGhpcyk7CiAJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUOgogCQkJCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSwgdGhpcyk7CkBAIC0xNjkwLDE3ICsxODE4LDE4IEBACiAJLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgamFyUGF0aCkgewotCi0JCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290MChKYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aChuZXcgUGF0aChqYXJQYXRoKSkpOworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBleHRlcm5hbExpYnJhcnlQYXRoKSB7CisJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290MChKYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aChuZXcgUGF0aChleHRlcm5hbExpYnJhcnlQYXRoKSkpOwogCX0KIAogCS8qCiAJICogbm8gcGF0aCBjYW5vbmljYWxpemF0aW9uCiAJICovCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKElQYXRoIGphclBhdGgpIHsKLQotCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoamFyUGF0aCwgdGhpcyk7CisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKElQYXRoIGV4dGVybmFsTGlicmFyeVBhdGgpIHsKKwkJSUZvbGRlciBsaW5rZWRGb2xkZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEV4dGVybmFsTWFuYWdlcigpLmdldEZvbGRlcihleHRlcm5hbExpYnJhcnlQYXRoKTsKKwkJaWYgKGxpbmtlZEZvbGRlciAhPSBudWxsKQorCQkJcmV0dXJuIG5ldyBFeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QobGlua2VkRm9sZGVyLCBleHRlcm5hbExpYnJhcnlQYXRoLCB0aGlzKTsKKwkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KGV4dGVybmFsTGlicmFyeVBhdGgsIHRoaXMpOwogCX0KIAogCS8qKgpAQCAtMTcxNCwxMiArMTg0MywxMiBAQAogCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzOwogCiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQljaGlsZHJlbiA9IGdldENoaWxkcmVuKCksIAotCQkJMCwgCi0JCQlyb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhdLCAKLQkJCTAsIAorCQkJY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpLAorCQkJMCwKKwkJCXJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W2xlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aF0sCisJCQkwLAogCQkJbGVuZ3RoKTsKLQkJCQorCiAJCXJldHVybiByb290czsKIAl9CiAKQEAgLTE3MzAsNyArMTg1OSw3IEBACiAJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CiAJCXJldHVybiBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoZW50cnkpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0CiAJICovCkBAIC0xNzYzLDcgKzE4OTIsNyBAQAogCQlJUGFja2FnZUZyYWdtZW50W10gZnJhZ21lbnRzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbZnJhZ3Muc2l6ZSgpXTsKIAkJZnJhZ3MudG9BcnJheShmcmFnbWVudHMpOwogCQlyZXR1cm4gZnJhZ21lbnRzOwotCX0JCisJfQogCiAJLyoqCiAJICogQHNlZSBJSmF2YUVsZW1lbnQKQEAgLTE3ODEsMzYgKzE5MTAsMTIgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGN1c3RvbSBwcmVmZXJlbmNlIHBvb2wuCi0JICogUHJvamVjdCBwcmVmZXJlbmNlcyBtYXkgaW5jbHVkZSBjdXN0b20gZW5jb2RpbmcuCi0JICogQHJldHVybiBQcmVmZXJlbmNlcwotCSAqIEBkZXByZWNhdGVkIFdBUk5JTkc6ICB0aGlzIG1ldGhvZCBkbyBub3RoaW5nIGZyb20gbm93IGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbiEKLQkgKiAJSWYgeW91IHVzZSBpdCwgc3dpdGNoIGFzIHNvb24gYXMgcG9zc2libGUgdG8gbmV3IHByZWZlcmVuY2VzIEFQSSBieSB1c2luZyAKLQkgKiAJe0BsaW5rICNnZXRFY2xpcHNlUHJlZmVyZW5jZXMoKX0gdG8gYXZvaWQgZnV0dXJlIGNvbXBpbGF0aW9uIGVycm9yLi4uCi0JICogQHNlZSA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkyNTgiPmJ1ZyA1OTI1ODwvYT4KLQkgKiBUT0RPIChmcmVkZXJpYykgcmVtb3ZlIGZvciAzLjEuLi4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKXsKLQkJLyoKLQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHRoaXMucHJvamVjdCkpIHJldHVybiBudWxsOwotCQlKYXZhTW9kZWxNYW5hZ2VyLlBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm8odGhpcy5wcm9qZWN0LCB0cnVlKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSAgcGVyUHJvamVjdEluZm8ucHJlZmVyZW5jZXM7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSByZXR1cm4gcHJlZmVyZW5jZXM7Ci0JCXByZWZlcmVuY2VzID0gbG9hZFByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyA9PSBudWxsKSBwcmVmZXJlbmNlcyA9IG5ldyBQcmVmZXJlbmNlcygpOwotCQlwZXJQcm9qZWN0SW5mby5wcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VzOwotCQlyZXR1cm4gcHJlZmVyZW5jZXM7Ci0JCSovCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QjZ2V0UHJvamVjdCgpCiAJICovCiAJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CiAJCXJldHVybiB0aGlzLnByb2plY3Q7CiAJfQotCQorCiAJcHVibGljIFByb2plY3RDYWNoZSBnZXRQcm9qZWN0Q2FjaGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJcmV0dXJuICgoSmF2YVByb2plY3RFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZ2V0UHJvamVjdENhY2hlKHRoaXMpOwogCX0KQEAgLTE4MjIsMzEgKzE5MjcsNDQgQEAKIAkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IGdldFBlclByb2plY3RJbmZvKCk7CiAJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLnJhd0NsYXNzcGF0aDsKIAkJaWYgKGNsYXNzcGF0aCAhPSBudWxsKSByZXR1cm4gY2xhc3NwYXRoOwotCQkKLQkJY2xhc3NwYXRoID0gcGVyUHJvamVjdEluZm8ucmVhZEFuZENhY2hlQ2xhc3NwYXRoKHRoaXMpOworCisJCWNsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLnJlYWRBbmRDYWNoZUNsYXNzcGF0aCh0aGlzKVswXTsKIAogCQlpZiAoY2xhc3NwYXRoID09IEphdmFQcm9qZWN0LklOVkFMSURfQ0xBU1NQQVRIKQogCQkJcmV0dXJuIGRlZmF1bHRDbGFzc3BhdGgoKTsKLQkJCisKIAkJcmV0dXJuIGNsYXNzcGF0aDsKIAl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0UGVyUHJvamVjdEluZm8oKS5yZWZlcmVuY2VkRW50cmllczsKKwl9CiAJCiAJLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QjZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKQogCSAqLwogCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZFByb2plY3ROYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JCXJldHVybiB0aGlzLnByb2plY3RQcmVyZXF1aXNpdGVzKGdldFJlc29sdmVkQ2xhc3NwYXRoKCkpOworCQlyZXR1cm4gcHJvamVjdFByZXJlcXVpc2l0ZXMoZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSk7CiAJfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgY2FjaGVkIHJlc29sdmVkIGNsYXNzcGF0aCwgb3IgY29tcHV0ZSBpdCBpZ25vcmluZyB1bnJlc29sdmVkIGVudHJpZXMgYW5kIGNhY2hlIGl0LgotCSAqLworCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCVBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvID0gZ2V0UGVyUHJvamVjdEluZm8oKTsKLQkJaWYgKHBlclByb2plY3RJbmZvLnJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwpCi0JCQlyZXNvbHZlQ2xhc3NwYXRoKHBlclByb2plY3RJbmZvKTsKLQkJcmV0dXJuIHBlclByb2plY3RJbmZvLnJlc29sdmVkQ2xhc3NwYXRoOworCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CisJCWlmIChyZXNvbHZlZENsYXNzcGF0aCA9PSBudWxsKSB7CisJCQlyZXNvbHZlQ2xhc3NwYXRoKHBlclByb2plY3RJbmZvLCBmYWxzZS8qZG9uJ3QgdXNlIHByZXZpb3VzIHNlc3Npb24gdmFsdWVzKi8sIHRydWUvKmFkZCBjbGFzc3BhdGggY2hhbmdlKi8pOworCQkJcmVzb2x2ZWRDbGFzc3BhdGggPSBwZXJQcm9qZWN0SW5mby5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJaWYgKHJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwpIHsKKwkJCQkvLyBhbm90aGVyIHRocmVhZCByZXNldCB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoLCB1c2UgYSB0ZW1wb3JhcnkgUGVyUHJvamVjdEluZm8KKwkJCQlQZXJQcm9qZWN0SW5mbyB0ZW1wb3JhcnlJbmZvID0gbmV3VGVtcG9yYXJ5SW5mbygpOworCQkJCXJlc29sdmVDbGFzc3BhdGgodGVtcG9yYXJ5SW5mbywgZmFsc2UvKmRvbid0IHVzZSBwcmV2aW91cyBzZXNzaW9uIHZhbHVlcyovLCB0cnVlLyphZGQgY2xhc3NwYXRoIGNoYW5nZSovKTsKKwkJCQlyZXNvbHZlZENsYXNzcGF0aCA9IHRlbXBvcmFyeUluZm8uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzb2x2ZWRDbGFzc3BhdGg7CiAJfQogCiAJLyoqCkBAIC0xODY0LDE3ICsxOTgyLDI0IEBACiAJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoOwogCQlJSmF2YU1vZGVsU3RhdHVzIHVucmVzb2x2ZWRFbnRyeVN0YXR1czsKIAkJc3luY2hyb25pemVkIChwZXJQcm9qZWN0SW5mbykgewotCQkJcmVzb2x2ZWRDbGFzc3BhdGggPSBwZXJQcm9qZWN0SW5mby5yZXNvbHZlZENsYXNzcGF0aDsKKwkJCXJlc29sdmVkQ2xhc3NwYXRoID0gcGVyUHJvamVjdEluZm8uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKIAkJCXVucmVzb2x2ZWRFbnRyeVN0YXR1cyA9IHBlclByb2plY3RJbmZvLnVucmVzb2x2ZWRFbnRyeVN0YXR1czsKIAkJfQotCQkKLQkJaWYgKHJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwgCisKKwkJaWYgKHJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwKIAkJCQl8fCAodW5yZXNvbHZlZEVudHJ5U3RhdHVzICE9IG51bGwgJiYgIXVucmVzb2x2ZWRFbnRyeVN0YXR1cy5pc09LKCkpKSB7IC8vIGZvcmNlIHJlc29sdXRpb24gdG8gZW5zdXJlIGluaXRpYWxpemVycyBhcmUgcnVuIGFnYWluCi0JCQlyZXNvbHZlQ2xhc3NwYXRoKHBlclByb2plY3RJbmZvKTsKKwkJCXJlc29sdmVDbGFzc3BhdGgocGVyUHJvamVjdEluZm8sIGZhbHNlLypkb24ndCB1c2UgcHJldmlvdXMgc2Vzc2lvbiB2YWx1ZXMqLywgdHJ1ZS8qYWRkIGNsYXNzcGF0aCBjaGFuZ2UqLyk7CiAJCQlzeW5jaHJvbml6ZWQgKHBlclByb2plY3RJbmZvKSB7Ci0JCQkJcmVzb2x2ZWRDbGFzc3BhdGggPSBwZXJQcm9qZWN0SW5mby5yZXNvbHZlZENsYXNzcGF0aDsKKwkJCQlyZXNvbHZlZENsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CiAJCQkJdW5yZXNvbHZlZEVudHJ5U3RhdHVzID0gcGVyUHJvamVjdEluZm8udW5yZXNvbHZlZEVudHJ5U3RhdHVzOwogCQkJfQorCQkJaWYgKHJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwpIHsKKwkJCQkvLyBhbm90aGVyIHRocmVhZCByZXNldCB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoLCB1c2UgYSB0ZW1wb3JhcnkgUGVyUHJvamVjdEluZm8KKwkJCQlQZXJQcm9qZWN0SW5mbyB0ZW1wb3JhcnlJbmZvID0gbmV3VGVtcG9yYXJ5SW5mbygpOworCQkJCXJlc29sdmVDbGFzc3BhdGgodGVtcG9yYXJ5SW5mbywgZmFsc2UvKmRvbid0IHVzZSBwcmV2aW91cyBzZXNzaW9uIHZhbHVlcyovLCB0cnVlLyphZGQgY2xhc3NwYXRoIGNoYW5nZSovKTsKKwkJCQlyZXNvbHZlZENsYXNzcGF0aCA9IHRlbXBvcmFyeUluZm8uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJCQl1bnJlc29sdmVkRW50cnlTdGF0dXMgPSB0ZW1wb3JhcnlJbmZvLnVucmVzb2x2ZWRFbnRyeVN0YXR1czsKKwkJCX0KIAkJfQogCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSAmJiB1bnJlc29sdmVkRW50cnlTdGF0dXMgIT0gbnVsbCAmJiAhdW5yZXNvbHZlZEVudHJ5U3RhdHVzLmlzT0soKSkKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24odW5yZXNvbHZlZEVudHJ5U3RhdHVzKTsKQEAgLTE4OTIsNyArMjAxNyw3IEBACiAJLyoqCiAJICogQHNlZSBJSmF2YUVsZW1lbnQKIAkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCXB1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CiAJCXJldHVybiB0aGlzLnByb2plY3Q7CiAJfQogCkBAIC0xOTQ2LDcgKzIwNzEsNyBAQAogCQl9CiAJCXJldHVybiBwcm9wZXJ0eTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIEphdmFFbGVtZW50CiAJICovCkBAIC0xOTcwLDEyICsyMDk1LDEyIEBACiAKIAkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldExhc3RCdWlsdFN0YXRlKHRoaXMucHJvamVjdCwgbnVsbCkgIT0gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwogCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIHByZWZlcnJlZENsYXNzcGF0aCkgewotCQlIYXNoU2V0IGN5Y2xlUGFydGljaXBhbnRzID0gbmV3IEhhc2hTZXQoKTsKKwkJTGlua2VkSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CiAJCUhhc2hNYXAgcHJlZmVycmVkQ2xhc3NwYXRocyA9IG5ldyBIYXNoTWFwKDEpOwogCQlwcmVmZXJyZWRDbGFzc3BhdGhzLnB1dCh0aGlzLCBwcmVmZXJyZWRDbGFzc3BhdGgpOwogCQl1cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhuZXcgQXJyYXlMaXN0KDIpLCBjeWNsZVBhcnRpY2lwYW50cywgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgbmV3IEhhc2hTZXQoMiksIHByZWZlcnJlZENsYXNzcGF0aHMpOwpAQCAtMTk4MywxMiArMjEwOCwyMyBAQAogCX0KIAogCXB1YmxpYyBib29sZWFuIGhhc0N5Y2xlTWFya2VyKCl7Ci0JCXJldHVybiB0aGlzLmdldEN5Y2xlTWFya2VyKCkgIT0gbnVsbDsKKwkJcmV0dXJuIGdldEN5Y2xlTWFya2VyKCkgIT0gbnVsbDsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQlyZXR1cm4gdGhpcy5wcm9qZWN0Lmhhc2hDb2RlKCk7CiAJfQorCQorCXByaXZhdGUgYm9vbGVhbiBoYXNVVEY4Qk9NKGJ5dGVbXSBieXRlcykgeworCQlpZiAoYnl0ZXMubGVuZ3RoID4gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzgubGVuZ3RoKSB7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzhbaV0gIT0gYnl0ZXNbaV0pCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAkvKioKIAkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIHByb2plY3QgcG90ZW50aWFsbHkgY29udGFpbnMgYW55IHNvdXJjZS4gQSBwcm9qZWN0IHdoaWNoIGhhcyBubyBzb3VyY2UgaXMgaW1tdXRhYmxlLgpAQCAtMjAwMCw3ICsyMTM2LDcgQEAKIAkJLy8gbm8gbmVlZCBmb3IgcmVzb2x2ZWQgcGF0aCBnaXZlbiBzb3VyY2UgZm9sZGVyIGNhbm5vdCBiZSBhYnN0cmFjdGVkCiAJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM7CiAJCXRyeSB7Ci0JCQllbnRyaWVzID0gdGhpcy5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJCWVudHJpZXMgPSBnZXRSYXdDbGFzc3BhdGgoKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybiB0cnVlOyAvLyB1bnN1cmUKIAkJfQpAQCAtMjAxMSw5ICsyMTQ3LDkgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQogCi0JCisKKwogCS8qCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KQEAgLTIwNDcsNyArMjE4Myw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJSVBhdGggZWxlbWVudFBhdGggPSBlbGVtZW50LmdldFBhdGgoKTsKLQkJCisKIAkJLy8gZmlyc3QgbG9vayBhdCB1bnJlc29sdmVkIGVudHJpZXMKIAkJaW50IGxlbmd0aCA9IHJhd0NsYXNzcGF0aC5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTIwNjEsNjUgKzIxOTcsNDAgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gbm8gbmVlZCB0byBnbyBmdXJ0aGVyIGZvciBjb21waWxhdGlvbiB1bml0cyBhbmQgZWxlbWVudHMgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdAogCQkvLyBpdCBjYW4gb25seSBiZSBpbiBhIHNvdXJjZSBmb2xkZXIsIHRodXMgb24gdGhlIHJhdyBjbGFzc3BhdGgKIAkJaWYgKGlzU291cmNlKQogCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gdGhlbiBsb29rIGF0IHJlc29sdmVkIGVudHJpZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IHJhd0VudHJ5ID0gcmF3Q2xhc3NwYXRoW2ldOwotCQkJc3dpdGNoIChyYXdFbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyOwotCQkJCQl0cnkgewotCQkJCQkJY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHJhd0VudHJ5LmdldFBhdGgoKSwgdGhpcyk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQkJCQlicmVhazsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJCWlmIChjb250YWluZXJFbnRyaWVzID09IG51bGwpIAotCQkJCQkJYnJlYWs7Ci0JCQkJCS8vIGNvbnRhaW5lciB3YXMgYm91bmQKLQkJCQkJZm9yIChpbnQgaiA9IDAsIGNvbnRhaW5lckxlbmd0aCA9IGNvbnRhaW5lckVudHJpZXMubGVuZ3RoOyBqIDwgY29udGFpbmVyTGVuZ3RoOyBqKyspewotCQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBjb250YWluZXJFbnRyaWVzW2pdOwotCQkJCQkJaWYgKHJlc29sdmVkRW50cnkgPT0gbnVsbCkgewotCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgewotCQkJCQkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS52ZXJib3NlX21pc3NiZWhhdmluZ19jb250YWluZXIodGhpcywgcmF3RW50cnkuZ2V0UGF0aCgpLCBjb250YWluZXJFbnRyaWVzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJaWYgKGlzT25DbGFzc3BhdGhFbnRyeShlbGVtZW50UGF0aCwgaXNGb2xkZXJQYXRoLCBpc1BhY2thZ2VGcmFnbWVudFJvb3QsIHJlc29sdmVkRW50cnkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkocmF3RW50cnkpOwotCQkJCQlpZiAocmVzb2x2ZWRFbnRyeSA9PSBudWxsKSAKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoaXNPbkNsYXNzcGF0aEVudHJ5KGVsZW1lbnRQYXRoLCBpc0ZvbGRlclBhdGgsIGlzUGFja2FnZUZyYWdtZW50Um9vdCwgcmVzb2x2ZWRFbnRyeSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9CisKKwkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDA4MQorCQkvLyBBbGwgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyaWVzIG5lZWQgdG8gYmUgY29uc2lkZXJlZCwgaW5jbHVkaW5nIHRoZSByZWZlcmVuY2VkIGNsYXNzcGF0aCBlbnRyaWVzCisJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlc29sdmVkQ2xhc3NwYXRoID0gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gUGVyaGFwcywgbm90IGEgSmF2YSBwcm9qZWN0CisJCX0KKworCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOyBpbmRleCsrKSB7CisJCQlpZiAoaXNPbkNsYXNzcGF0aEVudHJ5KGVsZW1lbnRQYXRoLCBpc0ZvbGRlclBhdGgsIGlzUGFja2FnZUZyYWdtZW50Um9vdCwgcmVzb2x2ZWRDbGFzc3BhdGhbaW5kZXhdKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQkKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogCS8qCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElSZXNvdXJjZSByZXNvdXJjZSkgewogCQlJUGF0aCBleGFjdFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwogCQlJUGF0aCBwYXRoID0gZXhhY3RQYXRoOwotCQkKKwogCQkvLyBlbnN1cmUgdGhhdCBmb2xkZXJzIGFyZSBvbmx5IGV4Y2x1ZGVkIGlmIGFsbCBvZiB0aGVpciBjaGlsZHJlbiBhcmUgZXhjbHVkZWQKIAkJaW50IHJlc291cmNlVHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsKIAkJYm9vbGVhbiBpc0ZvbGRlclBhdGggPSByZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUiB8fCByZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLlBST0pFQ1Q7Ci0JCQorCiAJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKIAkJdHJ5IHsKIAkJCWNsYXNzcGF0aCA9IHRoaXMuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKQEAgLTIxMzIsNyArMjI0MywxNCBAQAogCQkJaWYgKGVudHJ5UGF0aC5lcXVhbHMoZXhhY3RQYXRoKSkgeyAvLyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG11c3QgbWF0Y2ggZXhhY3RseSBlbnRyeSBwYXRoZXMgKG5vIGV4Y2x1c2lvbiB0aGVyZSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KLQkJCWlmIChlbnRyeVBhdGguaXNQcmVmaXhPZihwYXRoKSAKKwkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzYzNzMKKwkJCS8vIFdoZW4gYSBjbGFzc3BhdGggZW50cnkgaXMgYWJzb2x1dGUsIGNvbnZlcnQgdGhlIHJlc291cmNlJ3MgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUgc3lzdGVtIHBhdGggYW5kIGNvbXBhcmUKKwkJCS8vIGUuZyAtIC9QL2xpYi92YXJpYWJsZUxpYi5qYXIgYW5kIC9ob21lL1AvbGliL3ZhcmlhYmxlTGliLmphciB3aGVuIGNvbXBhcmVkIHNob3VsZCByZXR1cm4gdHJ1ZQorCQkJaWYgKGVudHJ5UGF0aC5pc0Fic29sdXRlKCkKKwkJCQkJJiYgZW50cnlQYXRoLmVxdWFscyhSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGV4YWN0UGF0aCkpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlpZiAoZW50cnlQYXRoLmlzUHJlZml4T2YocGF0aCkKIAkJCQkJJiYgIVV0aWwuaXNFeGNsdWRlZChwYXRoLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgaXNGb2xkZXJQYXRoKSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQpAQCAtMjE0NywxOSArMjI2NSwyNCBAQAogCQkJaWYgKGVudHJ5UGF0aC5lcXVhbHMoZWxlbWVudFBhdGgpKQogCQkJCXJldHVybiB0cnVlOwogCQl9IGVsc2UgewotCQkJaWYgKGVudHJ5UGF0aC5pc1ByZWZpeE9mKGVsZW1lbnRQYXRoKSAKLQkJCQkJJiYgIVV0aWwuaXNFeGNsdWRlZChlbGVtZW50UGF0aCwgKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCksIGlzRm9sZGVyUGF0aCkpIAorCQkJaWYgKGVudHJ5UGF0aC5pc1ByZWZpeE9mKGVsZW1lbnRQYXRoKQorCQkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKGVsZW1lbnRQYXRoLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgaXNGb2xkZXJQYXRoKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQorCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2MzczCisJCWlmIChlbnRyeVBhdGguaXNBYnNvbHV0ZSgpCisJCQkJJiYgZW50cnlQYXRoLmVxdWFscyhSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGVsZW1lbnRQYXRoKSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKioKIAkgKiBsb2FkIHByZWZlcmVuY2VzIGZyb20gYSBzaGFyZWFibGUgZm9ybWF0IChWQ00td2lzZSkKIAkgKi8KLQkgcHJpdmF0ZSBQcmVmZXJlbmNlcyBsb2FkUHJlZmVyZW5jZXMoKSB7Ci0JIAkKLQkgCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbmV3IFByZWZlcmVuY2VzKCk7CisJIHByaXZhdGUgSUVjbGlwc2VQcmVmZXJlbmNlcyBsb2FkUHJlZmVyZW5jZXMoKSB7CisKKwkgCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwogCSAJSVBhdGggcHJvamVjdE1ldGFMb2NhdGlvbiA9IGdldFBsdWdpbldvcmtpbmdMb2NhdGlvbigpOwogCQlpZiAocHJvamVjdE1ldGFMb2NhdGlvbiAhPSBudWxsKSB7CiAJCQlGaWxlIHByZWZGaWxlID0gcHJvamVjdE1ldGFMb2NhdGlvbi5hcHBlbmQoUFJFRl9GSUxFTkFNRSkudG9GaWxlKCk7CkBAIC0yMTY3LDcgKzIyOTAsOCBAQAogCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKIAkJCQl0cnkgewogCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJlZkZpbGUpKTsKLQkJCQkJcHJlZmVyZW5jZXMubG9hZChpbik7CisJCQkJCXByZWZlcmVuY2VzID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkucmVhZFByZWZlcmVuY2VzKGluKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgLy8gcHJvYmxlbXMgbG9hZGluZyBwcmVmZXJlbmNlIHN0b3JlIC0gcXVpZXRseSBpZ25vcmUKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vIHByb2JsZW1zIGxvYWRpbmcgcHJlZmVyZW5jZSBzdG9yZSAtIHF1aWV0bHkgaWdub3JlCiAJCQkJfSBmaW5hbGx5IHsKIAkJCQkJaWYgKGluICE9IG51bGwpIHsKQEAgLTIyMDUsNyArMjMyOSw3IEBACiAJICogUmV0dXJucyBhIG5ldyBuYW1lIGxvb2t1cC4gVGhpcyBuYW1lIGxvb2t1cCBmaXJzdCBsb29rcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgb2YgdGhlIGdpdmVuIG93bmVyLgogCSAqLwogCXB1YmxpYyBOYW1lTG9va3VwIG5ld05hbWVMb29rdXAoV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQorCiAJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwogCQlJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcyA9IG93bmVyID09IG51bGwgPyBudWxsIDogbWFuYWdlci5nZXRXb3JraW5nQ29waWVzKG93bmVyLCB0cnVlLyphZGQgcHJpbWFyeSBXQ3MqLyk7CiAJCXJldHVybiBuZXdOYW1lTG9va3VwKHdvcmtpbmdDb3BpZXMpOwpAQCAtMjIyNiw2ICsyMzUwLDE5IEBACiAJCXJldHVybiBuZXcgU2VhcmNoYWJsZUVudmlyb25tZW50KHRoaXMsIG93bmVyKTsKIAl9CiAKKwkvKgorCSAqIFJldHVybnMgYSBQZXJQcm9qZWN0SW5mbyB0aGF0IGRvZXNuJ3QgcmVnaXN0ZXIgY2xhc3NwYXRoIGNoYW5nZQorCSAqIGFuZCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGluZm8uCisJICovCisJcHVibGljIFBlclByb2plY3RJbmZvIG5ld1RlbXBvcmFyeUluZm8oKSB7CisJCXJldHVybiAKKwkJCW5ldyBQZXJQcm9qZWN0SW5mbyh0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpKSB7CisJCQkJcHJvdGVjdGVkIENsYXNzcGF0aENoYW5nZSBhZGRDbGFzc3BhdGhDaGFuZ2UoKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJfTsKKwl9CisKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwpAQCAtMjIzMyw3ICsyMzcwLDcgQEAKIAkJSVJlZ2lvbiByZWdpb24sCiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKKwogCQlyZXR1cm4gbmV3VHlwZUhpZXJhcmNoeShyZWdpb24sIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlksIG1vbml0b3IpOwogCX0KIApAQCAtMjI2NCw3ICsyNDAxLDcgQEAKIAkJSVJlZ2lvbiByZWdpb24sCiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKKwogCQlyZXR1cm4gbmV3VHlwZUhpZXJhcmNoeSh0eXBlLCByZWdpb24sIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlksIG1vbml0b3IpOwogCX0KIApAQCAtMjI5MCwxNCArMjQyNywxMiBAQAogCQlvcC5ydW5PcGVyYXRpb24obW9uaXRvcik7CiAJCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKIAl9Ci0JcHVibGljIFN0cmluZ1tdIHByb2plY3RQcmVyZXF1aXNpdGVzKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpCisJcHVibGljIFN0cmluZ1tdIHByb2plY3RQcmVyZXF1aXNpdGVzKElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCQorCiAJCUFycmF5TGlzdCBwcmVyZXF1aXNpdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBuZWVkIHJlc29sdXRpb24KLQkJZW50cmllcyA9IHJlc29sdmVDbGFzc3BhdGgoZW50cmllcyk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJlc29sdmVkQ2xhc3NwYXRoW2ldOwogCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewogCQkJCXByZXJlcXVpc2l0ZXMuYWRkKGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKIAkJCX0KQEAgLTIzMTEsMjUgKzI0NDYsMjEgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KIAl9Ci0KLQkvKgorCS8qKgogCSAqIFJlYWRzIHRoZSBjbGFzc3BhdGggZmlsZSBlbnRyaWVzIG9mIHRoaXMgcHJvamVjdCdzIC5jbGFzc3BhdGggZmlsZS4KLQkgKiBUaGlzIGluY2x1ZGVzIHRoZSBvdXRwdXQgZW50cnkuCisJICogUmV0dXJucyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSwgd2hlcmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcm93IGlzIGZpeGVkIHRvIDIuCisJICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgcmF3IGNsYXNzcGF0aCBlbnRyaWVzLCB3aGljaCBpbmNsdWRlcyB0aGUgb3V0cHV0IGVudHJ5LAorCSAqIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlZCBlbnRyaWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzdG9yZWQgCisJICogYnkgdGhlIGNsaWVudCBlYXJsaWVyLiAKKwkgKiBTZWUge0BsaW5rIElKYXZhUHJvamVjdCNnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcygpfSBmb3IgbW9yZSBkZXRhaWxzLgogCSAqIEFzIGEgc2lkZSBlZmZlY3QsIHVua25vd24gZWxlbWVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gbWFwIChpZiBub3QgbnVsbCkKIAkgKiBUaHJvd3MgZXhjZXB0aW9ucyBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgYWNjZXNzZWQgb3IgaXMgbWFsZm9ybWVkLgogCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZWFkRmlsZUVudHJpZXNXaXRoRXhjZXB0aW9uKE1hcCB1bmtub3duRWxlbWVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHhtbENsYXNzcGF0aDsKKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W11bXSByZWFkRmlsZUVudHJpZXNXaXRoRXhjZXB0aW9uKE1hcCB1bmtub3duRWxlbWVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIHsKIAkJSUZpbGUgcnNjRmlsZSA9IHRoaXMucHJvamVjdC5nZXRGaWxlKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSk7CisJCWJ5dGVbXSBieXRlczsKIAkJaWYgKHJzY0ZpbGUuZXhpc3RzKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KHJzY0ZpbGUpOwotCQkJdHJ5IHsKLQkJCQl4bWxDbGFzc3BhdGggPSBuZXcgU3RyaW5nKGJ5dGVzLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLlVURl84KTsgLy8gLmNsYXNzcGF0aCBhbHdheXMgZW5jb2RlZCB3aXRoIFVURi04Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHJlYWQgLmNsYXNzcGF0aCB3aXRoIFVURi04IGVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBmYWxsYmFjayB0byBkZWZhdWx0Ci0JCQkJeG1sQ2xhc3NwYXRoID0gbmV3IFN0cmluZyhieXRlcyk7Ci0JCQl9CisJCQlieXRlcyA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KHJzY0ZpbGUpOwogCQl9IGVsc2UgewogCQkJLy8gd2hlbiBhIHByb2plY3QgaXMgaW1wb3J0ZWQsIHdlIGdldCBhIGZpcnN0IGRlbHRhIGZvciB0aGUgYWRkaXRpb24gb2YgdGhlIC5wcm9qZWN0LCBidXQgdGhlIC5jbGFzc3BhdGggaXMgbm90IGFjY2Vzc2libGUKIAkJCS8vIHNvIGRlZmF1bHQgdG8gdXNpbmcgamF2YS5pby5GaWxlCkBAIC0yMzQwLDIxICsyNDcxLDI1IEBACiAJCQlGaWxlIGZpbGUgPSBVdGlsLnRvTG9jYWxGaWxlKGxvY2F0aW9uLCBudWxsLypubyBwcm9ncmVzcyBtb25pdG9yIGF2YWlsYWJsZSovKTsKIAkJCWlmIChmaWxlID09IG51bGwpCiAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZmV0Y2ggZmlsZSBmcm9tICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBieXRlczsKIAkJCXRyeSB7CiAJCQkJYnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChmaWxlKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBkZWZhdWx0Q2xhc3NwYXRoKCk7CisJCQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXtkZWZhdWx0Q2xhc3NwYXRoKCksIENsYXNzcGF0aEVudHJ5Lk5PX0VOVFJJRVN9OwogCQkJCXRocm93IGU7CiAJCQl9Ci0JCQl0cnkgewotCQkJCXhtbENsYXNzcGF0aCA9IG5ldyBTdHJpbmcoYnl0ZXMsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuVVRGXzgpOyAvLyAuY2xhc3NwYXRoIGFsd2F5cyBlbmNvZGVkIHdpdGggVVRGLTgKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3QgcmVhZCAuY2xhc3NwYXRoIHdpdGggVVRGLTggZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGZhbGxiYWNrIHRvIGRlZmF1bHQKLQkJCQl4bWxDbGFzc3BhdGggPSBuZXcgU3RyaW5nKGJ5dGVzKTsKLQkJCX0KKwkJfQorCQlpZiAoaGFzVVRGOEJPTShieXRlcykpIHsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDAwMzQKKwkJCWludCBsZW5ndGggPSBieXRlcy5sZW5ndGgtSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzgubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShieXRlcywgSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzgubGVuZ3RoLCBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJCX0KKwkJU3RyaW5nIHhtbENsYXNzcGF0aDsKKwkJdHJ5IHsKKwkJCXhtbENsYXNzcGF0aCA9IG5ldyBTdHJpbmcoYnl0ZXMsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuVVRGXzgpOyAvLyAuY2xhc3NwYXRoIGFsd2F5cyBlbmNvZGVkIHdpdGggVVRGLTgKKwkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHJlYWQgLmNsYXNzcGF0aCB3aXRoIFVURi04IGVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIGZhbGxiYWNrIHRvIGRlZmF1bHQKKwkJCXhtbENsYXNzcGF0aCA9IG5ldyBTdHJpbmcoYnl0ZXMpOwogCQl9CiAJCXJldHVybiBkZWNvZGVDbGFzc3BhdGgoeG1sQ2xhc3NwYXRoLCB1bmtub3duRWxlbWVudHMpOwogCX0KQEAgLTIzNjQsMTggKzI0OTksMTggQEAKIAkgKiBUaGlzIGluY2x1ZGVzIHRoZSBvdXRwdXQgZW50cnkuCiAJICogQXMgYSBzaWRlIGVmZmVjdCwgdW5rbm93biBlbGVtZW50cyBhcmUgc3RvcmVkIGluIHRoZSBnaXZlbiBtYXAgKGlmIG5vdCBudWxsKQogCSAqLwotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gcmVhZEZpbGVFbnRyaWVzKE1hcCB1bmt3b3duRWxlbWVudHMpIHsKKwlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdW10gcmVhZEZpbGVFbnRyaWVzKE1hcCB1bmt3b3duRWxlbWVudHMpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiByZWFkRmlsZUVudHJpZXNXaXRoRXhjZXB0aW9uKHVua3dvd25FbGVtZW50cyk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nICIgKyBnZXRQYXRoKCkuYXBwZW5kKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEg7CisJCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtdW117SmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEgsIENsYXNzcGF0aEVudHJ5Lk5PX0VOVFJJRVN9OwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgIiArIGdldFBhdGgoKS5hcHBlbmQoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSDsKLQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXtKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCwgQ2xhc3NwYXRoRW50cnkuTk9fRU5UUklFU307CisJCX0gY2F0Y2ggKENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CiAJCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgIiArIGdldFBhdGgoKS5hcHBlbmQoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSDsKKwkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXtKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCwgQ2xhc3NwYXRoRW50cnkuTk9fRU5UUklFU307CiAJCX0KIAl9CiAKQEAgLTIzODQsNDAgKzI1MTksNDAgQEAKIAkgKi8KIAlwdWJsaWMgSVBhdGggcmVhZE91dHB1dExvY2F0aW9uKCkgewogCQkvLyBSZWFkIGNsYXNzcGF0aCBmaWxlIHdpdGhvdXQgY3JlYXRpbmcgbWFya2VycyBub3IgbG9nZ2luZyBwcm9ibGVtcwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSByZWFkRmlsZUVudHJpZXMobnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCkKKwkJSUNsYXNzcGF0aEVudHJ5W11bXSBjbGFzc3BhdGggPSByZWFkRmlsZUVudHJpZXMobnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKTsKKwkJaWYgKGNsYXNzcGF0aFswXSA9PSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCkKIAkJCXJldHVybiBkZWZhdWx0T3V0cHV0TG9jYXRpb24oKTsKLQkJCisKIAkJLy8gZXh0cmFjdCB0aGUgb3V0cHV0IGxvY2F0aW9uCiAJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKLQkJaWYgKGNsYXNzcGF0aC5sZW5ndGggPiAwKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbY2xhc3NwYXRoLmxlbmd0aCAtIDFdOworCQlpZiAoY2xhc3NwYXRoWzBdLmxlbmd0aCA+IDApIHsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFswXVtjbGFzc3BhdGhbMF0ubGVuZ3RoIC0gMV07CiAJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgewogCQkJCW91dHB1dExvY2F0aW9uID0gZW50cnkuZ2V0UGF0aCgpOwogCQkJfQogCQl9CiAJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwogCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZWFkUmF3Q2xhc3NwYXRoKCkgewogCQkvLyBSZWFkIGNsYXNzcGF0aCBmaWxlIHdpdGhvdXQgY3JlYXRpbmcgbWFya2VycyBub3IgbG9nZ2luZyBwcm9ibGVtcwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSByZWFkRmlsZUVudHJpZXMobnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCkKKwkJSUNsYXNzcGF0aEVudHJ5W11bXSBjbGFzc3BhdGggPSByZWFkRmlsZUVudHJpZXMobnVsbC8qbm90IGludGVyZXN0ZWQgaW4gdW5rbm93biBlbGVtZW50cyovKTsKKwkJaWYgKGNsYXNzcGF0aFswXSA9PSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCkKIAkJCXJldHVybiBkZWZhdWx0Q2xhc3NwYXRoKCk7Ci0JCQorCiAJCS8vIGRpc2NhcmQgdGhlIG91dHB1dCBsb2NhdGlvbgotCQlpZiAoY2xhc3NwYXRoLmxlbmd0aCA+IDApIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtjbGFzc3BhdGgubGVuZ3RoIC0gMV07CisJCWlmIChjbGFzc3BhdGhbMF0ubGVuZ3RoID4gMCkgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoWzBdW2NsYXNzcGF0aFswXS5sZW5ndGggLSAxXTsKIAkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7Ci0JCQkJY2xhc3NwYXRoID0gY29weTsKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb3B5ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGhbMF0ubGVuZ3RoIC0gMV07CisJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGhbMF0sIDAsIGNvcHksIDAsIGNvcHkubGVuZ3RoKTsKKwkJCQljbGFzc3BhdGhbMF0gPSBjb3B5OwogCQkJfQogCQl9Ci0JCXJldHVybiBjbGFzc3BhdGg7CisJCXJldHVybiBjbGFzc3BhdGhbMF07CiAJfQogCiAJLyoqCkBAIC0yNDM4LDcgKzI1NzMsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyoKIAkgKiBSZXNldHMgdGhpcyBwcm9qZWN0J3MgY2FjaGVzCiAJICovCkBAIC0yNDQ5LDE1OSArMjU4NCwyODggQEAKIAkJfQogCX0KIAorCXB1YmxpYyBDbGFzc3BhdGhDaGFuZ2UgcmVzZXRSZXNvbHZlZENsYXNzcGF0aCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBnZXRQZXJQcm9qZWN0SW5mbygpLnJlc2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHByb2plY3QgZG9lc24ndCBleGlzdAorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CQkKKwkKIAkvKgogCSAqIFJlc29sdmUgdGhlIGdpdmVuIHJhdyBjbGFzc3BhdGguCiAJICovCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHJlc29sdmVkRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJhd0NsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlyZXR1cm4gcmVzb2x2ZUNsYXNzcGF0aChyYXdDbGFzc3BhdGgsIGZhbHNlLypkb24ndCB1c2UgcHJldmlvdXMgc2Vzc2lvbiovLCB0cnVlLypyZXNvbHZlIGNoYWluZWQgbGlicmFyaWVzKi8pLnJlc29sdmVkQ2xhc3NwYXRoOworCX0KKwkKKwlzdGF0aWMgY2xhc3MgUmVzb2x2ZWRDbGFzc3BhdGggeworCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aDsKKwkJSUphdmFNb2RlbFN0YXR1cyB1bnJlc29sdmVkRW50cnlTdGF0dXMgPSBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJCUhhc2hNYXAgcmF3UmV2ZXJzZU1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCU1hcCByb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gcmVmZXJlbmNlZEVudHJpZXMgPSBudWxsOworCX0KKwkKKwlwdWJsaWMgUmVzb2x2ZWRDbGFzc3BhdGggcmVzb2x2ZUNsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSByYXdDbGFzc3BhdGgsIGJvb2xlYW4gdXNlUHJldmlvdXNTZXNzaW9uLCBib29sZWFuIHJlc29sdmVDaGFpbmVkTGlicmFyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHJlc29sdmVDbGFzc3BhdGgocmF3Q2xhc3NwYXRoLCBudWxsLCB1c2VQcmV2aW91c1Nlc3Npb24sIHJlc29sdmVDaGFpbmVkTGlicmFyaWVzKTsKKwl9CisKKwlwdWJsaWMgUmVzb2x2ZWRDbGFzc3BhdGggcmVzb2x2ZUNsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSByYXdDbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHJlZmVyZW5jZWRFbnRyaWVzLCBib29sZWFuIHVzZVByZXZpb3VzU2Vzc2lvbiwgYm9vbGVhbiByZXNvbHZlQ2hhaW5lZExpYnJhcmllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyIGV4dGVybmFsRm9sZGVyc01hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEV4dGVybmFsTWFuYWdlcigpOworCQlSZXNvbHZlZENsYXNzcGF0aCByZXN1bHQgPSBuZXcgUmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwkJTWFwIGtub3duRHJpdmVzID0gbmV3IEhhc2hNYXAoKTsKKworCQlNYXAgcmVmZXJlbmNlZEVudHJpZXNNYXAgPSBuZXcgSGFzaE1hcCgpOworCQlMaXN0IHJhd0xpYnJhcmllc1BhdGggPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpbmtlZEhhc2hTZXQgcmVzb2x2ZWRFbnRyaWVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKwkJCisJCWlmKHJlc29sdmVDaGFpbmVkTGlicmFyaWVzKSB7CisJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmF3Q2xhc3NwYXRoLmxlbmd0aDsgaW5kZXgrKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBjdXJyZW50RW50cnkgPSByYXdDbGFzc3BhdGhbaW5kZXhdOyAKKwkJCQlpZiAoY3VycmVudEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQlyYXdMaWJyYXJpZXNQYXRoLmFkZChDbGFzc3BhdGhFbnRyeS5yZXNvbHZlRG90RG90KGdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLCBjdXJyZW50RW50cnkuZ2V0UGF0aCgpKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzICE9IG51bGwpIHsKKwkJCQkvLyBUaGUgU2V0IGlzIHJlcXVpcmVkIHRvIGtlZXAgdGhlIG9yZGVyIGludGFjdCB3aGlsZSB0aGUgcmVmZXJlbmNlZEVudHJpZXNNYXAgKE1hcCkKKwkJCQkvLyBpcyB1c2VkIHRvIG1hcCB0aGUgcmVmZXJlbmNlZCBlbnRyaWVzIHdpdGggcGF0aAorCQkJCUxpbmtlZEhhc2hTZXQgcmVmZXJlbmNlZEVudHJpZXNTZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOworCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCByZWZlcmVuY2VkRW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKKwkJCQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZWRFbnRyaWVzW2luZGV4XS5nZXRQYXRoKCk7CisJCQkJCWlmICghcmF3TGlicmFyaWVzUGF0aC5jb250YWlucyhwYXRoKSAmJiByZWZlcmVuY2VkRW50cmllc01hcC5nZXQocGF0aCkgPT0gbnVsbCkgeworCQkJCQkJcmVmZXJlbmNlZEVudHJpZXNNYXAucHV0KHBhdGgsIHJlZmVyZW5jZWRFbnRyaWVzW2luZGV4XSk7CisJCQkJCQlyZWZlcmVuY2VkRW50cmllc1NldC5hZGQocmVmZXJlbmNlZEVudHJpZXNbaW5kZXhdKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocmVmZXJlbmNlZEVudHJpZXNTZXQuc2l6ZSgpID4gMCkgeworCQkJCQlyZXN1bHQucmVmZXJlbmNlZEVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3JlZmVyZW5jZWRFbnRyaWVzU2V0LnNpemUoKV07CisJCQkJCXJlZmVyZW5jZWRFbnRyaWVzU2V0LnRvQXJyYXkocmVzdWx0LnJlZmVyZW5jZWRFbnRyaWVzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWludCBsZW5ndGggPSByYXdDbGFzc3BhdGgubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisKIAkJCUlDbGFzc3BhdGhFbnRyeSByYXdFbnRyeSA9IHJhd0NsYXNzcGF0aFtpXTsKKwkJCUlDbGFzc3BhdGhFbnRyeSByZXNvbHZlZEVudHJ5ID0gcmF3RW50cnk7CisKIAkJCXN3aXRjaCAocmF3RW50cnkuZ2V0RW50cnlLaW5kKCkpewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBudWxsOworCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKIAkJCQkJdHJ5IHsKLQkJCQkJCXJlc29sdmVkRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KHJhd0VudHJ5KTsKLQkJCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIENhdGNoIHRoZSBhc3NlcnRpb24gZmFpbHVyZQorCQkJCQkJcmVzb2x2ZWRFbnRyeSA9IG1hbmFnZXIucmVzb2x2ZVZhcmlhYmxlRW50cnkocmF3RW50cnksIHVzZVByZXZpb3VzU2Vzc2lvbik7CisJCQkJCX0gY2F0Y2ggKENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBDYXRjaCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgYW5kIHNldCBzdGF0dXMgaW5zdGVhZAogCQkJCQkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU5OTIKKwkJCQkJCXJlc3VsdC51bnJlc29sdmVkRW50cnlTdGF0dXMgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBlLmdldE1lc3NhZ2UoKSk7CiAJCQkJCQlicmVhazsKIAkJCQkJfQotCQkJCQlpZiAocmVzb2x2ZWRFbnRyeSAhPSBudWxsKQotCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKKwkJCQkJaWYgKHJlc29sdmVkRW50cnkgPT0gbnVsbCkgeworCQkJCQkJcmVzdWx0LnVucmVzb2x2ZWRFbnRyeVN0YXR1cyA9IG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DUF9WQVJJQUJMRV9QQVRIX1VOQk9VTkQsIHRoaXMsIHJhd0VudHJ5LmdldFBhdGgoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBJZiB0aGUgZW50cnkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSByYXdSZXZlcnNldE1hcCwgaXQgbWVhbnMgdGhlIGVudHJ5IGFuZCB0aGUgY2hhaW5lZCBsaWJyYXJpZXMKKwkJCQkJCS8vIGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gU28sIHNraXAgaXQuCisJCQkJCQlpZiAocmVzb2x2ZUNoYWluZWRMaWJyYXJpZXMgJiYgcmVzb2x2ZWRFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkKKwkJCQkJCQkJCQkJCQkmJiByZXN1bHQucmF3UmV2ZXJzZU1hcC5nZXQocmVzb2x2ZWRFbnRyeS5nZXRQYXRoKCkpID09IG51bGwpIHsKKwkJCQkJCQkvLyByZXNvbHZlIENsYXNzLVBhdGg6IGluIG1hbmlmZXN0CisJCQkJCQkJQ2xhc3NwYXRoRW50cnlbXSBleHRyYUVudHJpZXMgPSAoKENsYXNzcGF0aEVudHJ5KSByZXNvbHZlZEVudHJ5KS5yZXNvbHZlZENoYWluZWRMaWJyYXJpZXMoKTsKKwkJCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGV4dHJhRW50cmllcy5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKKwkJCQkJCQkJaWYgKCFyYXdMaWJyYXJpZXNQYXRoLmNvbnRhaW5zKGV4dHJhRW50cmllc1tqXS5nZXRQYXRoKCkpKSB7CisJCQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MDM3CisJCQkJCQkJCQkvLyByZWZlcmVuY2VkIGVudHJpZXMgZm9yIHZhcmlhYmxlIGVudHJpZXMgY291bGQgYWxzbyBiZSBwZXJzaXN0ZWQgd2l0aCBleHRyYSBhdHRyaWJ1dGVzLCBzbyBhZGRBc0NoYWluZWRFbnRyeSA9IHRydWUKKwkJCQkJCQkJCWFkZFRvUmVzdWx0KHJhd0VudHJ5LCBleHRyYUVudHJpZXNbal0sIHJlc3VsdCwgcmVzb2x2ZWRFbnRyaWVzLCBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLCByZWZlcmVuY2VkRW50cmllc01hcCwgdHJ1ZSwga25vd25Ecml2ZXMpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYWRkVG9SZXN1bHQocmF3RW50cnksIHJlc29sdmVkRW50cnksIHJlc3VsdCwgcmVzb2x2ZWRFbnRyaWVzLCBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLCByZWZlcmVuY2VkRW50cmllc01hcCwgZmFsc2UsIGtub3duRHJpdmVzKTsKKwkJCQkJfQogCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihyYXdFbnRyeS5nZXRQYXRoKCksIHRoaXMpOwotCQkJCQlpZiAoY29udGFpbmVyID09IG51bGwpCisKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKKwkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSB1c2VQcmV2aW91c1Nlc3Npb24gPyBtYW5hZ2VyLmdldFByZXZpb3VzU2Vzc2lvbkNvbnRhaW5lcihyYXdFbnRyeS5nZXRQYXRoKCksIHRoaXMpIDogSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHJhd0VudHJ5LmdldFBhdGgoKSwgdGhpcyk7CisJCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCl7CisJCQkJCQlyZXN1bHQudW5yZXNvbHZlZEVudHJ5U3RhdHVzID0gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQsIHRoaXMsIHJhd0VudHJ5LmdldFBhdGgoKSk7CiAJCQkJCQlicmVhazsKKwkJCQkJfQorCiAJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCQlpZiAoY29udGFpbmVyRW50cmllcyA9PSBudWxsKSAKKwkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXMgPT0gbnVsbCkgeworCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpIHsKKwkJCQkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS52ZXJib3NlX21pc3NiZWhhdmluZ19jb250YWluZXJfbnVsbF9lbnRyaWVzKHRoaXMsIHJhd0VudHJ5LmdldFBhdGgoKSk7CisJCQkJCQl9CiAJCQkJCQlicmVhazsKKwkJCQkJfQogCiAJCQkJCS8vIGNvbnRhaW5lciB3YXMgYm91bmQKIAkJCQkJZm9yIChpbnQgaiA9IDAsIGNvbnRhaW5lckxlbmd0aCA9IGNvbnRhaW5lckVudHJpZXMubGVuZ3RoOyBqIDwgY29udGFpbmVyTGVuZ3RoOyBqKyspewogCQkJCQkJQ2xhc3NwYXRoRW50cnkgY0VudHJ5ID0gKENsYXNzcGF0aEVudHJ5KSBjb250YWluZXJFbnRyaWVzW2pdOwogCQkJCQkJaWYgKGNFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKSB7CisJCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFIHx8IEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0ZBSUxVUkUpIHsKIAkJCQkJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkudmVyYm9zZV9taXNzYmVoYXZpbmdfY29udGFpbmVyKHRoaXMsIHJhd0VudHJ5LmdldFBhdGgoKSwgY29udGFpbmVyRW50cmllcyk7CiAJCQkJCQkJfQogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJLy8gaWYgY29udGFpbmVyIGlzIGV4cG9ydGVkIG9yIHJlc3RyaWN0ZWQsIHRoZW4gaXRzIG5lc3RlZCBlbnRyaWVzIG11c3QgaW4gdHVybiBiZSBleHBvcnRlZCAgKDIxNzQ5KSBhbmQvb3IgcHJvcGFnYXRlIHJlc3RyaWN0aW9ucwogCQkJCQkJY0VudHJ5ID0gY0VudHJ5LmNvbWJpbmVXaXRoKChDbGFzc3BhdGhFbnRyeSkgcmF3RW50cnkpOwotCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChjRW50cnkpOworCQkJCQkJCisJCQkJCQlpZiAoY0VudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQkJCS8vIHJlc29sdmUgIi4uIiBpbiBsaWJyYXJ5IHBhdGgKKwkJCQkJCQljRW50cnkgPSBjRW50cnkucmVzb2x2ZWREb3REb3QoZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkpOworCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTM5NjUKKwkJCQkJCQkvLyBEbyBub3QgcmVzb2x2ZSBpZiB0aGUgc3lzdGVtIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UJCisJCQkJCQkJaWYgKHJlc29sdmVDaGFpbmVkTGlicmFyaWVzCisJCQkJCQkJCQkmJiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZXNvbHZlUmVmZXJlbmNlZExpYnJhcmllc0ZvckNvbnRhaW5lcnMKKwkJCQkJCQkJCSYmIHJlc3VsdC5yYXdSZXZlcnNlTWFwLmdldChjRW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSB7CisJCQkJCQkJCS8vIHJlc29sdmUgQ2xhc3MtUGF0aDogaW4gbWFuaWZlc3QKKwkJCQkJCQkJQ2xhc3NwYXRoRW50cnlbXSBleHRyYUVudHJpZXMgPSBjRW50cnkucmVzb2x2ZWRDaGFpbmVkTGlicmFyaWVzKCk7CisJCQkJCQkJCWZvciAoaW50IGsgPSAwLCBsZW5ndGgyID0gZXh0cmFFbnRyaWVzLmxlbmd0aDsgayA8IGxlbmd0aDI7IGsrKykgeworCQkJCQkJCQkJaWYgKCFyYXdMaWJyYXJpZXNQYXRoLmNvbnRhaW5zKGV4dHJhRW50cmllc1trXS5nZXRQYXRoKCkpKSB7CisJCQkJCQkJCQkJYWRkVG9SZXN1bHQocmF3RW50cnksIGV4dHJhRW50cmllc1trXSwgcmVzdWx0LCByZXNvbHZlZEVudHJpZXMsIGV4dGVybmFsRm9sZGVyc01hbmFnZXIsIHJlZmVyZW5jZWRFbnRyaWVzTWFwLCBmYWxzZSwga25vd25Ecml2ZXMpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYWRkVG9SZXN1bHQocmF3RW50cnksIGNFbnRyeSwgcmVzdWx0LCByZXNvbHZlZEVudHJpZXMsIGV4dGVybmFsRm9sZGVyc01hbmFnZXIsIHJlZmVyZW5jZWRFbnRyaWVzTWFwLCBmYWxzZSwga25vd25Ecml2ZXMpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlc29sdmVkRW50cmllcy5hZGQocmF3RW50cnkpOworCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CisJCQkJCS8vIHJlc29sdmUgIi4uIiBpbiBsaWJyYXJ5IHBhdGgKKwkJCQkJcmVzb2x2ZWRFbnRyeSA9ICgoQ2xhc3NwYXRoRW50cnkpIHJhd0VudHJ5KS5yZXNvbHZlZERvdERvdChnZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKSk7CisJCQkJCQorCQkJCQlpZiAocmVzb2x2ZUNoYWluZWRMaWJyYXJpZXMgJiYgcmVzdWx0LnJhd1JldmVyc2VNYXAuZ2V0KHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSB7CisJCQkJCQkvLyByZXNvbHZlIENsYXNzLVBhdGg6IGluIG1hbmlmZXN0CisJCQkJCQlDbGFzc3BhdGhFbnRyeVtdIGV4dHJhRW50cmllcyA9ICgoQ2xhc3NwYXRoRW50cnkpIHJlc29sdmVkRW50cnkpLnJlc29sdmVkQ2hhaW5lZExpYnJhcmllcygpOworCQkJCQkJZm9yIChpbnQgayA9IDAsIGxlbmd0aDIgPSBleHRyYUVudHJpZXMubGVuZ3RoOyBrIDwgbGVuZ3RoMjsgaysrKSB7CisJCQkJCQkJaWYgKCFyYXdMaWJyYXJpZXNQYXRoLmNvbnRhaW5zKGV4dHJhRW50cmllc1trXS5nZXRQYXRoKCkpKSB7CisJCQkJCQkJCWFkZFRvUmVzdWx0KHJhd0VudHJ5LCBleHRyYUVudHJpZXNba10sIHJlc3VsdCwgcmVzb2x2ZWRFbnRyaWVzLCBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLCByZWZlcmVuY2VkRW50cmllc01hcCwgdHJ1ZSwga25vd25Ecml2ZXMpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWFkZFRvUmVzdWx0KHJhd0VudHJ5LCByZXNvbHZlZEVudHJ5LCByZXN1bHQsIHJlc29sdmVkRW50cmllcywgZXh0ZXJuYWxGb2xkZXJzTWFuYWdlciwgcmVmZXJlbmNlZEVudHJpZXNNYXAsIGZhbHNlLCBrbm93bkRyaXZlcyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlhZGRUb1Jlc3VsdChyYXdFbnRyeSwgcmVzb2x2ZWRFbnRyeSwgcmVzdWx0LCByZXNvbHZlZEVudHJpZXMsIGV4dGVybmFsRm9sZGVyc01hbmFnZXIsIHJlZmVyZW5jZWRFbnRyaWVzTWFwLCBmYWxzZSwga25vd25Ecml2ZXMpOworCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlJQ2xhc3NwYXRoRW50cnlbXSByZXN1bHQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jlc29sdmVkRW50cmllcy5zaXplKCldOwotCQlyZXNvbHZlZEVudHJpZXMudG9BcnJheShyZXN1bHQpOworCQlyZXN1bHQucmVzb2x2ZWRDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jlc29sdmVkRW50cmllcy5zaXplKCldOworCQlyZXNvbHZlZEVudHJpZXMudG9BcnJheShyZXN1bHQucmVzb2x2ZWRDbGFzc3BhdGgpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCS8qCi0JICogUmVzb2x2ZSB0aGUgZ2l2ZW4gcGVyUHJvamVjdEluZm8ncyByYXcgY2xhc3NwYXRoIGFuZCBzdG9yZSB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGluIHRoZSBwZXJQcm9qZWN0SW5mby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlQ2xhc3NwYXRoKFBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLnNldENsYXNzcGF0aEJlaW5nUmVzb2x2ZWQodGhpcywgdHJ1ZSk7Ci0JCQkKLQkJCS8vIGdldCByYXcgaW5mbyBpbnNpZGUgYSBzeW5jaHJvbml6ZWQgYmxvY2sgdG8gZW5zdXJlIHRoYXQgaXQgaXMgY29uc2lzdGVudAotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoOwotCQkJSVBhdGggb3V0cHV0TG9jYXRpb247Ci0JCQlJSmF2YU1vZGVsU3RhdHVzIHJhd0NsYXNzcGF0aFN0YXR1czsKLQkJCXN5bmNocm9uaXplZCAocGVyUHJvamVjdEluZm8pIHsKLQkJCQlyYXdDbGFzc3BhdGg9IHBlclByb2plY3RJbmZvLnJhd0NsYXNzcGF0aDsKLQkJCQlpZiAocmF3Q2xhc3NwYXRoID09IG51bGwpCi0JCQkJCXJhd0NsYXNzcGF0aCA9IHBlclByb2plY3RJbmZvLnJlYWRBbmRDYWNoZUNsYXNzcGF0aCh0aGlzKTsKLQkJCQlvdXRwdXRMb2NhdGlvbiA9IHBlclByb2plY3RJbmZvLm91dHB1dExvY2F0aW9uOwotCQkJCXJhd0NsYXNzcGF0aFN0YXR1cyA9IHBlclByb2plY3RJbmZvLnJhd0NsYXNzcGF0aFN0YXR1czsKLQkJCX0KLQkJCSAJCQkKLQkJCUlKYXZhTW9kZWxTdGF0dXMgdW5yZXNvbHZlZEVudHJ5U3RhdHVzID0gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwotCQkJSGFzaE1hcCByYXdSZXZlcnNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCU1hcCByb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJQXJyYXlMaXN0IHJlc29sdmVkRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBsZW5ndGggPSByYXdDbGFzc3BhdGgubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQotCQkJCUlDbGFzc3BhdGhFbnRyeSByYXdFbnRyeSA9IHJhd0NsYXNzcGF0aFtpXTsKLQkJCQlJUGF0aCByZXNvbHZlZFBhdGg7Ci0JCQkJCi0JCQkJc3dpdGNoIChyYXdFbnRyeS5nZXRFbnRyeUtpbmQoKSl7Ci0JCQkJCQotCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXNvbHZlZEVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShyYXdFbnRyeSk7Ci0JCQkJCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIENhdGNoIHRoZSBhc3NlcnRpb24gZmFpbHVyZSBhbmQgc2V0IHN0c3R1cyBpbnN0ZWFkCi0JCQkJCQkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU5OTIKLQkJCQkJCQl1bnJlc29sdmVkRW50cnlTdGF0dXMgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzb2x2ZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQkJdW5yZXNvbHZlZEVudHJ5U3RhdHVzID0gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX1ZBUklBQkxFX1BBVEhfVU5CT1VORCwgdGhpcywgcmF3RW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKHJhd1JldmVyc2VNYXAuZ2V0KHJlc29sdmVkUGF0aCA9IHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJCXJhd1JldmVyc2VNYXAucHV0KHJlc29sdmVkUGF0aCAsIHJhd0VudHJ5KTsKLQkJCQkJCQkJcm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcy5wdXQocmVzb2x2ZWRQYXRoLCByZXNvbHZlZEVudHJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOyAKLQkKLQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6Ci0JCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihyYXdFbnRyeS5nZXRQYXRoKCksIHRoaXMpOwotCQkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKLQkJCQkJCQl1bnJlc29sdmVkRW50cnlTdGF0dXMgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ1BfQ09OVEFJTkVSX1BBVEhfVU5CT1VORCwgdGhpcywgcmF3RW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXMgPT0gbnVsbCkgYnJlYWs7Ci0JCi0JCQkJCQkvLyBjb250YWluZXIgd2FzIGJvdW5kCi0JCQkJCQlmb3IgKGludCBqID0gMCwgY29udGFpbmVyTGVuZ3RoID0gY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGogPCBjb250YWluZXJMZW5ndGg7IGorKyl7Ci0JCQkJCQkJQ2xhc3NwYXRoRW50cnkgY0VudHJ5ID0gKENsYXNzcGF0aEVudHJ5KSBjb250YWluZXJFbnRyaWVzW2pdOwotCQkJCQkJCWlmIChjRW50cnkgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpIHsKLQkJCQkJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnZlcmJvc2VfbWlzc2JlaGF2aW5nX2NvbnRhaW5lcih0aGlzLCByYXdFbnRyeS5nZXRQYXRoKCksIGNvbnRhaW5lckVudHJpZXMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBpZiBjb250YWluZXIgaXMgZXhwb3J0ZWQgb3IgcmVzdHJpY3RlZCwgdGhlbiBpdHMgbmVzdGVkIGVudHJpZXMgbXVzdCBpbiB0dXJuIGJlIGV4cG9ydGVkICAoMjE3NDkpIGFuZC9vciBwcm9wYWdhdGUgcmVzdHJpY3Rpb25zCi0JCQkJCQkJY0VudHJ5ID0gY0VudHJ5LmNvbWJpbmVXaXRoKChDbGFzc3BhdGhFbnRyeSkgcmF3RW50cnkpOwotCQkJCQkJCWlmIChyYXdSZXZlcnNlTWFwLmdldChyZXNvbHZlZFBhdGggPSBjRW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJCXJhd1JldmVyc2VNYXAucHV0KHJlc29sdmVkUGF0aCAsIHJhd0VudHJ5KTsKLQkJCQkJCQkJcm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcy5wdXQocmVzb2x2ZWRQYXRoLCBjRW50cnkpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXNvbHZlZEVudHJpZXMuYWRkKGNFbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCi0JCQkJCWRlZmF1bHQgOgotCQkJCQkJaWYgKHJhd1JldmVyc2VNYXAuZ2V0KHJlc29sdmVkUGF0aCA9IHJhd0VudHJ5LmdldFBhdGgoKSkgPT0gbnVsbCkgewotCQkJCQkJCXJhd1JldmVyc2VNYXAucHV0KHJlc29sdmVkUGF0aCAsIHJhd0VudHJ5KTsKLQkJCQkJCQlyb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzLnB1dChyZXNvbHZlZFBhdGgsIHJhd0VudHJ5KTsKLQkJCQkJCX0KLQkJCQkJCXJlc29sdmVkRW50cmllcy5hZGQocmF3RW50cnkpOworCXByaXZhdGUgdm9pZCBhZGRUb1Jlc3VsdChJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnksIElDbGFzc3BhdGhFbnRyeSByZXNvbHZlZEVudHJ5LCBSZXNvbHZlZENsYXNzcGF0aCByZXN1bHQsCisJCQlMaW5rZWRIYXNoU2V0IHJlc29sdmVkRW50cmllcywgRXh0ZXJuYWxGb2xkZXJzTWFuYWdlciBleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLAorCQkJTWFwIG9sZENoYWluZWRFbnRyaWVzTWFwLCBib29sZWFuIGFkZEFzQ2hhaW5lZEVudHJ5LCBNYXAga25vd25Ecml2ZXMpIHsKIAotCQkJCX0JCQkJCQorCQlJUGF0aCByZXNvbHZlZFBhdGg7CisJCS8vIElmIGl0J3MgYWxyZWFkeSBiZWVuIHJlc29sdmVkLCBkbyBub3QgYWRkIHRvIHJlc29sdmVkRW50cmllcworCQlpZiAocmVzdWx0LnJhd1JldmVyc2VNYXAuZ2V0KHJlc29sdmVkUGF0aCA9IHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSB7CisJCQlyZXN1bHQucmF3UmV2ZXJzZU1hcC5wdXQocmVzb2x2ZWRQYXRoLCByYXdFbnRyeSk7CisJCQlyZXN1bHQucm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcy5wdXQocmVzb2x2ZWRQYXRoLCByZXNvbHZlZEVudHJ5KTsKKwkJCXJlc29sdmVkRW50cmllcy5hZGQocmVzb2x2ZWRFbnRyeSk7CisJCQlpZiAoYWRkQXNDaGFpbmVkRW50cnkpIHsKKwkJCQlJQ2xhc3NwYXRoRW50cnkgY2hhaW5lZEVudHJ5ID0gbnVsbDsKKwkJCQljaGFpbmVkRW50cnkgPSAoQ2xhc3NwYXRoRW50cnkpIG9sZENoYWluZWRFbnRyaWVzTWFwLmdldChyZXNvbHZlZFBhdGgpOworCQkJCWlmIChjaGFpbmVkRW50cnkgIT0gbnVsbCkgeworCQkJCQkvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIGtlZXAgdGhlIGF0dHJpYnV0ZXMgaWYgYW55IGFkZGVkIGJ5IHRoZSB1c2VyIGluCisJCQkJCS8vIHRoZSBwcmV2aW91cyBzZXNzaW9uIHN1Y2ggYXMgc291cmNlIGF0dGFjaG1lbnQgcGF0aCBldGMuCisJCQkJCWNvcHlGcm9tT2xkQ2hhaW5lZEVudHJ5KChDbGFzc3BhdGhFbnRyeSkgcmVzb2x2ZWRFbnRyeSwgKENsYXNzcGF0aEVudHJ5KSBjaGFpbmVkRW50cnkpOworCQkJCX0KIAkJCX0KLQkKLQkJCS8vIHN0b3JlIHJlc29sdmVkIGluZm8gYWxvbmcgd2l0aCB0aGUgcmF3IGluZm8gdG8gZW5zdXJlIGNvbnNpc3RlbmN5Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVzb2x2ZWRFbnRyaWVzLnNpemUoKV07Ci0JCQlyZXNvbHZlZEVudHJpZXMudG9BcnJheShyZXNvbHZlZENsYXNzcGF0aCk7Ci0JCQlwZXJQcm9qZWN0SW5mby5zZXRDbGFzc3BhdGgocmF3Q2xhc3NwYXRoLCBvdXRwdXRMb2NhdGlvbiwgcmF3Q2xhc3NwYXRoU3RhdHVzLCByZXNvbHZlZENsYXNzcGF0aCwgcmF3UmV2ZXJzZU1hcCwgcm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcywgdW5yZXNvbHZlZEVudHJ5U3RhdHVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1hbmFnZXIuc2V0Q2xhc3NwYXRoQmVpbmdSZXNvbHZlZCh0aGlzLCBmYWxzZSk7CisJCX0KKwkJaWYgKHJlc29sdmVkRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZICYmIEV4dGVybmFsRm9sZGVyc01hbmFnZXIuaXNFeHRlcm5hbEZvbGRlclBhdGgocmVzb2x2ZWRQYXRoKSkgeworCQkJZXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5hZGRGb2xkZXIocmVzb2x2ZWRQYXRoLCB0cnVlLypzY2hlZHVsZUZvckNyZWF0aW9uKi8pOyAvLyBuby1vcCBpZiBub3QgYW4gZXh0ZXJuYWwgZm9sZGVyIG9yIGlmIGFscmVhZHkgcmVnaXN0ZXJlZAorCQl9CisJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzYwNDYKKwkJLy8gVGhlIHNvdXJjZSBhdHRhY2htZW50IHBhdGggY291bGQgYmUgZXh0ZXJuYWwgdG9vIGFuZCBpbiB3aGljaCBjYXNlLCBtdXN0IGJlIGFkZGVkLgorCQlJUGF0aCBzb3VyY2VQYXRoID0gcmVzb2x2ZWRFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworCQlpZiAoc291cmNlUGF0aCAhPSBudWxsICYmIGRyaXZlRXhpc3RzKHNvdXJjZVBhdGgsIGtub3duRHJpdmVzKSAmJiBFeHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmlzRXh0ZXJuYWxGb2xkZXJQYXRoKHNvdXJjZVBhdGgpKSB7CisJCQlleHRlcm5hbEZvbGRlcnNNYW5hZ2VyLmFkZEZvbGRlcihzb3VyY2VQYXRoLCB0cnVlKTsKIAkJfQogCX0KIAorCXByaXZhdGUgdm9pZCBjb3B5RnJvbU9sZENoYWluZWRFbnRyeShDbGFzc3BhdGhFbnRyeSByZXNvbHZlZEVudHJ5LCBDbGFzc3BhdGhFbnRyeSBjaGFpbmVkRW50cnkpIHsKKwkJSVBhdGggcGF0aCA9IGNoYWluZWRFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworCQlpZiAoIHBhdGggIT0gbnVsbCkgeworCQkJcmVzb2x2ZWRFbnRyeS5zb3VyY2VBdHRhY2htZW50UGF0aCA9IHBhdGg7CisJCX0KKwkJcGF0aCA9IGNoYWluZWRFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJcmVzb2x2ZWRFbnRyeS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBwYXRoOworCQl9CisJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzID0gY2hhaW5lZEVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOworCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQlyZXNvbHZlZEVudHJ5LmV4dHJhQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisJCX0KKwl9CisJCisJLyoKKwkgKiBGaWxlI2V4aXN0cygpIHRha2VzIGxvdCBvZiB0aW1lIGZvciBhbiB1bm1hcHBlZCBkcml2ZS4gSGVuY2UsIGNhY2hlIHRoZSBpbmZvLgorCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg2NDkKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZHJpdmVFeGlzdHMoSVBhdGggc291cmNlUGF0aCwgTWFwIGtub3duRHJpdmVzKSB7CQorCQlTdHJpbmcgZHJpdmUgPSBzb3VyY2VQYXRoLmdldERldmljZSgpOworCQlpZiAoZHJpdmUgPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCUJvb2xlYW4gZ29vZCA9IChCb29sZWFuKWtub3duRHJpdmVzLmdldChkcml2ZSk7CisJCWlmIChnb29kID09IG51bGwpIHsKKwkJCWlmIChuZXcgRmlsZShkcml2ZSkuZXhpc3RzKCkpIHsKKwkJCQlrbm93bkRyaXZlcy5wdXQoZHJpdmUsIEJvb2xlYW4uVFJVRSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCWtub3duRHJpdmVzLnB1dChkcml2ZSwgQm9vbGVhbi5GQUxTRSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiBnb29kLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwkvKgorCSAqIFJlc29sdmUgdGhlIGdpdmVuIHBlclByb2plY3RJbmZvJ3MgcmF3IGNsYXNzcGF0aCBhbmQgc3RvcmUgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBpbiB0aGUgcGVyUHJvamVjdEluZm8uCisJICovCisJcHVibGljIHZvaWQgcmVzb2x2ZUNsYXNzcGF0aChQZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbywgYm9vbGVhbiB1c2VQcmV2aW91c1Nlc3Npb24sIGJvb2xlYW4gYWRkQ2xhc3NwYXRoQ2hhbmdlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKENQX1JFU09MVVRJT05fQlBfTElTVEVORVJTICE9IG51bGwpCisJCQlicmVha3BvaW50KDEsIHRoaXMpOworCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJYm9vbGVhbiBpc0NsYXNzcGF0aEJlaW5nUmVzb2x2ZWQgPSBtYW5hZ2VyLmlzQ2xhc3NwYXRoQmVpbmdSZXNvbHZlZCh0aGlzKTsKKwkJdHJ5IHsKKwkJCWlmICghaXNDbGFzc3BhdGhCZWluZ1Jlc29sdmVkKSB7CisJCQkJbWFuYWdlci5zZXRDbGFzc3BhdGhCZWluZ1Jlc29sdmVkKHRoaXMsIHRydWUpOworCQkJfQorCisJCQkvLyBnZXQgcmF3IGluZm8gaW5zaWRlIGEgc3luY2hyb25pemVkIGJsb2NrIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGNvbnNpc3RlbnQKKwkJCUlDbGFzc3BhdGhFbnRyeVtdW10gY2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVsyXVtdOworCQkJaW50IHRpbWVTdGFtcDsKKwkJCXN5bmNocm9uaXplZCAocGVyUHJvamVjdEluZm8pIHsKKwkJCQljbGFzc3BhdGhbMF0gPSBwZXJQcm9qZWN0SW5mby5yYXdDbGFzc3BhdGg7CisJCQkJY2xhc3NwYXRoWzFdID0gcGVyUHJvamVjdEluZm8ucmVmZXJlbmNlZEVudHJpZXM7CisJCQkJLy8gQ2hlY2tpbmcgbnVsbCBvbmx5IGZvciByYXdDbGFzc3BhdGggZW5vdWdoCisJCQkJaWYgKGNsYXNzcGF0aFswXSA9PSBudWxsKQorCQkJCQljbGFzc3BhdGggPSBwZXJQcm9qZWN0SW5mby5yZWFkQW5kQ2FjaGVDbGFzc3BhdGgodGhpcyk7CisJCQkJdGltZVN0YW1wID0gcGVyUHJvamVjdEluZm8ucmF3VGltZVN0YW1wOworCQkJfQorCisJCQlSZXNvbHZlZENsYXNzcGF0aCByZXN1bHQgPSByZXNvbHZlQ2xhc3NwYXRoKGNsYXNzcGF0aFswXSwgY2xhc3NwYXRoWzFdLCB1c2VQcmV2aW91c1Nlc3Npb24sIHRydWUvKnJlc29sdmUgY2hhaW5lZCBsaWJyYXJpZXMqLyk7CisJCQkKKwkJCWlmIChDUF9SRVNPTFVUSU9OX0JQX0xJU1RFTkVSUyAhPSBudWxsKQorCQkJCWJyZWFrcG9pbnQoMiwgdGhpcyk7CisKKwkJCS8vIHN0b3JlIHJlc29sdmVkIGluZm8gYWxvbmcgd2l0aCB0aGUgcmF3IGluZm8gdG8gZW5zdXJlIGNvbnNpc3RlbmN5CisJCQlwZXJQcm9qZWN0SW5mby5zZXRSZXNvbHZlZENsYXNzcGF0aChyZXN1bHQucmVzb2x2ZWRDbGFzc3BhdGgsIHJlc3VsdC5yZWZlcmVuY2VkRW50cmllcywgcmVzdWx0LnJhd1JldmVyc2VNYXAsIHJlc3VsdC5yb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzLCB1c2VQcmV2aW91c1Nlc3Npb24gPyBQZXJQcm9qZWN0SW5mby5ORUVEX1JFU09MVVRJT04gOiByZXN1bHQudW5yZXNvbHZlZEVudHJ5U3RhdHVzLCB0aW1lU3RhbXAsIGFkZENsYXNzcGF0aENoYW5nZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIWlzQ2xhc3NwYXRoQmVpbmdSZXNvbHZlZCkgeworCQkJCW1hbmFnZXIuc2V0Q2xhc3NwYXRoQmVpbmdSZXNvbHZlZCh0aGlzLCBmYWxzZSk7CisJCQl9CisJCQlpZiAoQ1BfUkVTT0xVVElPTl9CUF9MSVNURU5FUlMgIT0gbnVsbCkKKwkJCQlicmVha3BvaW50KDMsIHRoaXMpOworCQl9CisJfQorCQogCS8qKgogCSAqIEFuc3dlcnMgYW4gSUQgd2hpY2ggaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBwcm9qZWN0L2VudHJpZXMgZHVyaW5nIHBhY2thZ2UKIAkgKiBmcmFnbWVudCByb290IGNvbXB1dGF0aW9ucwpAQCAtMjYxMiwzMyArMjg3NiwzOCBAQAogCX0KIAogCS8qKgotCSAqIFNhdmVzIHRoZSBjbGFzc3BhdGggaW4gYSBzaGFyZWFibGUgZm9ybWF0IChWQ00td2lzZSkgb25seSB3aGVuIG5lY2Vzc2FyeSwgdGhhdCBpcywgaWYgIGl0IGlzIHNlbWFudGljYWxseSBkaWZmZXJlbnQKKwkgKiBXcml0ZXMgdGhlIGNsYXNzcGF0aCBpbiBhIHNoYXJhYmxlIGZvcm1hdCAoVkNNLXdpc2UpIG9ubHkgd2hlbiBuZWNlc3NhcnksIHRoYXQgaXMsIGlmICBpdCBpcyBzZW1hbnRpY2FsbHkgZGlmZmVyZW50CiAJICogZnJvbSB0aGUgZXhpc3Rpbmcgb25lIGluIGZpbGUuIFdpbGwgbmV2ZXIgd3JpdGUgYW4gaWRlbnRpY2FsIG9uZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBuZXdDbGFzc3BhdGggSUNsYXNzcGF0aEVudHJ5W10KIAkgKiBAcGFyYW0gbmV3T3V0cHV0TG9jYXRpb24gSVBhdGgKIAkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIHdoZXRoZXIgdGhlIC5jbGFzc3BhdGggZmlsZSB3YXMgbW9kaWZpZWQuCiAJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlQ2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIHdyaXRlRmlsZUVudHJpZXMoSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoLCBJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcywgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCiAJCWlmICghdGhpcy5wcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSByZXR1cm4gZmFsc2U7CiAKIAkJTWFwIHVua25vd25FbGVtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGZpbGVFbnRyaWVzID0gcmVhZEZpbGVFbnRyaWVzKHVua25vd25FbGVtZW50cyk7Ci0JCWlmIChmaWxlRW50cmllcyAhPSBKYXZhUHJvamVjdC5JTlZBTElEX0NMQVNTUEFUSCAmJiBhcmVDbGFzc3BhdGhzRXF1YWwobmV3Q2xhc3NwYXRoLCBuZXdPdXRwdXRMb2NhdGlvbiwgZmlsZUVudHJpZXMpKSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdW10gZmlsZUVudHJpZXMgPSByZWFkRmlsZUVudHJpZXModW5rbm93bkVsZW1lbnRzKTsKKwkJaWYgKGZpbGVFbnRyaWVzWzBdICE9IEphdmFQcm9qZWN0LklOVkFMSURfQ0xBU1NQQVRIICYmIAorCQkJCWFyZUNsYXNzcGF0aHNFcXVhbChuZXdDbGFzc3BhdGgsIG5ld091dHB1dExvY2F0aW9uLCBmaWxlRW50cmllc1swXSkKKwkJCQkmJiAocmVmZXJlbmNlZEVudHJpZXMgPT0gbnVsbCB8fCBhcmVDbGFzc3BhdGhzRXF1YWwocmVmZXJlbmNlZEVudHJpZXMsIGZpbGVFbnRyaWVzWzFdKSkgKSB7CiAJCQkvLyBubyBuZWVkIHRvIHNhdmUgaXQsIGl0IGlzIHRoZSBzYW1lCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAogCQkvLyBhY3R1YWwgZmlsZSBzYXZpbmcKIAkJdHJ5IHsKLQkJCXNldFNoYXJlZFByb3BlcnR5KEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSwgZW5jb2RlQ2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24sIHRydWUsIHVua25vd25FbGVtZW50cykpOworCQkJc2V0U2hhcmVkUHJvcGVydHkoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FLCBlbmNvZGVDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCByZWZlcmVuY2VkRW50cmllcywgbmV3T3V0cHV0TG9jYXRpb24sIHRydWUsIHVua25vd25FbGVtZW50cykpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQogCX0KKwlwdWJsaWMgYm9vbGVhbiB3cml0ZUZpbGVFbnRyaWVzKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gd3JpdGVGaWxlRW50cmllcyhuZXdDbGFzc3BhdGgsIENsYXNzcGF0aEVudHJ5Lk5PX0VOVFJJRVMsIG5ld091dHB1dExvY2F0aW9uKTsKKwl9CiAKIAkvKioKIAkgKiBVcGRhdGUgdGhlIEphdmEgY29tbWFuZCBpbiB0aGUgYnVpbGQgc3BlYyAocmVwbGFjZSBleGlzdGluZyBvbmUgaWYgcHJlc2VudCwKQEAgLTI2NzIsMjIgKzI5NDEsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCNzZXRPcHRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRPcHRpb24oU3RyaW5nIG9wdGlvbk5hbWUsIFN0cmluZyBvcHRpb25WYWx1ZSkgewotCQlpZiAoIUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLm9wdGlvbk5hbWVzLmNvbnRhaW5zKG9wdGlvbk5hbWUpKSByZXR1cm47IC8vIHVucmVjb2duaXplZCBvcHRpb24KLQkJaWYgKG9wdGlvblZhbHVlID09IG51bGwpIHJldHVybjsgLy8gaW52YWxpZCB2YWx1ZQorCQkvLyBTdG9yZSBvcHRpb24gdmFsdWUKIAkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBnZXRFY2xpcHNlUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IEphdmFDb3JlLmdldE9wdGlvbihvcHRpb25OYW1lKTsKLQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7Ci0JCQkvLyBzZXQgZGVmYXVsdCB2YWx1ZSA9PiByZW1vdmUgcHJlZmVyZW5jZQotCQkJcHJvamVjdFByZWZlcmVuY2VzLnJlbW92ZShvcHRpb25OYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByb2plY3RQcmVmZXJlbmNlcy5wdXQob3B0aW9uTmFtZSwgb3B0aW9uVmFsdWUpOwotCQl9Ci0JCQotCQkvLyBEdW1wIGNoYW5nZXMKLQkJdHJ5IHsKLQkJCXByb2plY3RQcmVmZXJlbmNlcy5mbHVzaCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gcHJvYmxlbSB3aXRoIHByZWYgc3RvcmUgLSBxdWlldGx5IGlnbm9yZQorCQlib29sZWFuIG1vZGlmaWVkID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuc3RvcmVQcmVmZXJlbmNlKG9wdGlvbk5hbWUsIG9wdGlvblZhbHVlLCBwcm9qZWN0UHJlZmVyZW5jZXMpOworCisJCS8vIFdyaXRlIGNoYW5nZXMKKwkJaWYgKG1vZGlmaWVkKSB7CisJCQl0cnkgeworCQkJCXByb2plY3RQcmVmZXJlbmNlcy5mbHVzaCgpOworCQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBwcm9ibGVtIHdpdGggcHJlZiBzdG9yZSAtIHF1aWV0bHkgaWdub3JlCisJCQl9CiAJCX0KIAl9CiAKQEAgLTI2OTcsMTkgKzI5NjEsMjAgQEAKIAlwdWJsaWMgdm9pZCBzZXRPcHRpb25zKE1hcCBuZXdPcHRpb25zKSB7CiAKIAkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBnZXRFY2xpcHNlUHJlZmVyZW5jZXMoKTsKKwkJaWYgKHByb2plY3RQcmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm47CiAJCXRyeSB7CiAJCQlpZiAobmV3T3B0aW9ucyA9PSBudWxsKXsKIAkJCQlwcm9qZWN0UHJlZmVyZW5jZXMuY2xlYXIoKTsKIAkJCX0gZWxzZSB7CiAJCQkJSXRlcmF0b3IgZW50cmllcyA9IG5ld09wdGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQkJCUphdmFNb2RlbE1hbmFnZXIgamF2YU1vZGVsTWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwogCQkJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSl7CiAJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVudHJpZXMubmV4dCgpOwogCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWlmICghSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkub3B0aW9uTmFtZXMuY29udGFpbnMoa2V5KSkgY29udGludWU7IC8vIHVucmVjb2duaXplZCBvcHRpb24KLQkJCQkJLy8gbm8gZmlsdGVyaW5nIGZvciBlbmNvZGluZyAoY3VzdG9tIGVuY29kaW5nIGZvciBwcm9qZWN0IGlzIGFsbG93ZWQpCi0JCQkJCXByb2plY3RQcmVmZXJlbmNlcy5wdXQoa2V5LCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJamF2YU1vZGVsTWFuYWdlci5zdG9yZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSwgcHJvamVjdFByZWZlcmVuY2VzKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyByZXNldCB0byBkZWZhdWx0IGFsbCBvcHRpb25zIG5vdCBpbiBuZXcgbWFwCiAJCQkJLy8gQHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNTUKIAkJCQkvLyBAc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTY5MQpAQCAtMjcyNSw3ICsyOTkwLDcgQEAKIAogCQkJLy8gcGVyc2lzdCBvcHRpb25zCiAJCQlwcm9qZWN0UHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQorCiAJCQkvLyBmbHVzaCBjYWNoZSBpbW1lZGlhdGVseQogCQkJdHJ5IHsKIAkJCQlnZXRQZXJQcm9qZWN0SW5mbygpLm9wdGlvbnMgPSBudWxsOwpAQCAtMjc0MSw3ICszMDA2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLnBhdGhfbnVsbFBhdGgpOyAKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMucGF0aF9udWxsUGF0aCk7CiAJCX0KIAkJaWYgKHBhdGguZXF1YWxzKGdldE91dHB1dExvY2F0aW9uKCkpKSB7CiAJCQlyZXR1cm47CkBAIC0yNzcyLDkgKzMwMzcsOSBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlzZXRSYXdDbGFzc3BhdGgoCi0JCQllbnRyaWVzLCAKKwkJCWVudHJpZXMsCiAJCQlnZXRPdXRwdXRMb2NhdGlvbigpLypkb24ndCBjaGFuZ2Ugb3V0cHV0Ki8sCi0JCQljYW5Nb2RpZnlSZXNvdXJjZXMsIAorCQkJY2FuTW9kaWZ5UmVzb3VyY2VzLAogCQkJbW9uaXRvcik7CiAJfQogCkBAIC0yNzg3LDI0ICszMDUyLDkgQEAKIAkJCWJvb2xlYW4gY2FuTW9kaWZ5UmVzb3VyY2VzLAogCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQl0cnkgewotCQkJaWYgKG5ld1Jhd0NsYXNzcGF0aCA9PSBudWxsKSAvL2FyZSB3ZSBhbHJlYWR5IHdpdGggdGhlIGRlZmF1bHQgY2xhc3NwYXRoCi0JCQkJbmV3UmF3Q2xhc3NwYXRoID0gZGVmYXVsdENsYXNzcGF0aCgpOwotCi0JCQlTZXRDbGFzc3BhdGhPcGVyYXRpb24gb3AgPQotCQkJCW5ldyBTZXRDbGFzc3BhdGhPcGVyYXRpb24oCi0JCQkJCXRoaXMsIAotCQkJCQluZXdSYXdDbGFzc3BhdGgsIAotCQkJCQluZXdPdXRwdXRMb2NhdGlvbiwgCi0JCQkJCWNhbk1vZGlmeVJlc291cmNlcyk7Ci0JCQlvcC5ydW5PcGVyYXRpb24obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXREZWx0YVByb2Nlc3NvcigpLmZsdXNoKCk7Ci0JCQl0aHJvdyBlOwotCQl9CisJCXNldFJhd0NsYXNzcGF0aChuZXdSYXdDbGFzc3BhdGgsIG51bGwsIG5ld091dHB1dExvY2F0aW9uLCBjYW5Nb2RpZnlSZXNvdXJjZXMsIG1vbml0b3IpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0I3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSxJUGF0aCxJUHJvZ3Jlc3NNb25pdG9yKQogCSAqLwpAQCAtMjgxNSwxMiArMzA2NSwzOCBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlzZXRSYXdDbGFzc3BhdGgoCi0JCQllbnRyaWVzLCAKKwkJCWVudHJpZXMsCiAJCQlvdXRwdXRMb2NhdGlvbiwKIAkJCXRydWUvKmNhbiBjaGFuZ2UgcmVzb3VyY2UgKGFzIHBlciBBUEkgY29udHJhY3QpKi8sCiAJCQltb25pdG9yKTsKIAl9CiAJCisJcHVibGljIHZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElDbGFzc3BhdGhFbnRyeVtdIHJlZmVyZW5jZWRFbnRyaWVzLCBJUGF0aCBvdXRwdXRMb2NhdGlvbiwKKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXNldFJhd0NsYXNzcGF0aChlbnRyaWVzLCByZWZlcmVuY2VkRW50cmllcywgb3V0cHV0TG9jYXRpb24sIHRydWUsIG1vbml0b3IpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3Q2xhc3NwYXRoLCBJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcywgSVBhdGggbmV3T3V0cHV0TG9jYXRpb24sCisJCQlib29sZWFuIGNhbk1vZGlmeVJlc291cmNlcywJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJaWYgKG5ld1Jhd0NsYXNzcGF0aCA9PSBudWxsKSAvL2FyZSB3ZSBhbHJlYWR5IHdpdGggdGhlIGRlZmF1bHQgY2xhc3NwYXRoCisJCQkJbmV3UmF3Q2xhc3NwYXRoID0gZGVmYXVsdENsYXNzcGF0aCgpOworCisJCQlTZXRDbGFzc3BhdGhPcGVyYXRpb24gb3AgPQorCQkJCW5ldyBTZXRDbGFzc3BhdGhPcGVyYXRpb24oCisJCQkJCXRoaXMsCisJCQkJCW5ld1Jhd0NsYXNzcGF0aCwKKwkJCQkJcmVmZXJlbmNlZEVudHJpZXMsCisJCQkJCW5ld091dHB1dExvY2F0aW9uLAorCQkJCQljYW5Nb2RpZnlSZXNvdXJjZXMpOworCQkJb3AucnVuT3BlcmF0aW9uKG1vbml0b3IpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RGVsdGFQcm9jZXNzb3IoKS5mbHVzaCgpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKwogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0CiAJICovCkBAIC0yODMwLDcgKzMxMDYsNyBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlzZXRSYXdDbGFzc3BhdGgoCi0JCQllbnRyaWVzLCAKKwkJCWVudHJpZXMsCiAJCQlnZXRPdXRwdXRMb2NhdGlvbigpLypkb24ndCBjaGFuZ2Ugb3V0cHV0Ki8sCiAJCQl0cnVlLypjYW4gY2hhbmdlIHJlc291cmNlIChhcyBwZXIgQVBJIGNvbnRyYWN0KSovLAogCQkJbW9uaXRvcik7CkBAIC0yODQxLDEwICszMTE3LDEwIEBACiAJICogTm90ZSB0aGF0IGl0IGlzIG9ydGhvZ29uYWwgdG8gSVJlc291cmNlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGNsaWVudCBjb2RlIGhhcyB0byBkZWNpZGUKIAkgKiB3aGljaCBmb3JtIG9mIHN0b3JhZ2UgdG8gdXNlIGFwcHJvcHJpYXRlbHkuIFNoYXJlZCBwcm9wZXJ0aWVzIHByb2R1Y2UgcmVhbCByZXNvdXJjZSBmaWxlcyB3aGljaAogCSAqIGNhbiBiZSBzaGFyZWQgdGhyb3VnaCBhIFZDTSBvbnRvIGEgc2VydmVyLiBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIG5vdCBzaGFyZWFibGUuCi0JICogCisJICoKIAkgKiBzaGFyZWQgcHJvcGVydGllcyBlbmQgdXAgaW4gcmVzb3VyY2UgZmlsZXMsIGFuZCB0aHVzIGNhbm5vdCBiZSBtb2RpZmllZCBkdXJpbmcKIAkgKiBkZWx0YSBub3RpZmljYXRpb25zIChhIENvcmVFeGNlcHRpb24gd291bGQgdGhlbiBiZSB0aHJvd24pLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGtleSBTdHJpbmcKIAkgKiBAcGFyYW0gdmFsdWUgU3RyaW5nCiAJICogQHNlZSBKYXZhUHJvamVjdCNnZXRTaGFyZWRQcm9wZXJ0eShTdHJpbmcga2V5KQpAQCAtMjg4NCwxMyArMzE2MCwxMyBAQAogCSAqIEBwYXJhbSBwcmVmZXJyZWRDbGFzc3BhdGhzIE1hcAogCSAqLwogCXB1YmxpYyB2b2lkIHVwZGF0ZUN5Y2xlUGFydGljaXBhbnRzKAotCQkJQXJyYXlMaXN0IHByZXJlcUNoYWluLCAKLQkJCUhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMsIAorCQkJQXJyYXlMaXN0IHByZXJlcUNoYWluLAorCQkJTGlua2VkSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cywKIAkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QsCiAJCQlIYXNoU2V0IHRyYXZlcnNlZCwKIAkJCU1hcCBwcmVmZXJyZWRDbGFzc3BhdGhzKXsKIAotCQlJUGF0aCBwYXRoID0gdGhpcy5nZXRQYXRoKCk7CisJCUlQYXRoIHBhdGggPSBnZXRQYXRoKCk7CiAJCXByZXJlcUNoYWluLmFkZChwYXRoKTsKIAkJdHJhdmVyc2VkLmFkZChwYXRoKTsKIAkJdHJ5IHsKQEAgLTI4OTksMTMgKzMxNzUsMTMgQEAKIAkJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgY2xhc3NwYXRoID0gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkJCisKIAkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKXsKIAkJCQkJSVBhdGggcHJlcmVxUHJvamVjdFBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CiAJCQkJCWludCBpbmRleCA9IGN5Y2xlUGFydGljaXBhbnRzLmNvbnRhaW5zKHByZXJlcVByb2plY3RQYXRoKSA/IDAgOiBwcmVyZXFDaGFpbi5pbmRleE9mKHByZXJlcVByb2plY3RQYXRoKTsKIAkJCQkJaWYgKGluZGV4ID49IDApIHsgLy8gcmVmZXIgdG8gY3ljbGUsIG9yIGluIGN5Y2xlIGl0c2VsZgogCQkJCQkJZm9yIChpbnQgc2l6ZSA9IHByZXJlcUNoYWluLnNpemUoKTsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7Ci0JCQkJCQkJY3ljbGVQYXJ0aWNpcGFudHMuYWRkKHByZXJlcUNoYWluLmdldChpbmRleCkpOyAKKwkJCQkJCQljeWNsZVBhcnRpY2lwYW50cy5hZGQocHJlcmVxQ2hhaW4uZ2V0KGluZGV4KSk7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoIXRyYXZlcnNlZC5jb250YWlucyhwcmVyZXFQcm9qZWN0UGF0aCkpIHsKQEAgLTI5MjQsNDIgKzMyMDAsMjIgQEAKIAkJcHJlcmVxQ2hhaW4ucmVtb3ZlKHBhdGgpOwogCX0KIAotCS8qKgotCSAqIFJlc2V0IHRoZSBjb2xsZWN0aW9uIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgKGxvY2FsIG9uZXMpIC0gb25seSBpZiBvcGVuZWQuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUGFja2FnZUZyYWdtZW50Um9vdHMoKXsKLQkJCi0JCQlpZiAodGhpcy5pc09wZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCUphdmFQcm9qZWN0RWxlbWVudEluZm8gaW5mbyA9IGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKTsKLQkJCQkJY29tcHV0ZUNoaWxkcmVuKGluZm8pOwotCQkJCQlpbmZvLnJlc2V0Q2FjaGVzKCk7IC8vIGRpc2NhcmQgY2FjaGVzIChob2xkIG9udG8gcm9vdHMgYW5kIHBrZyBmcmFnbWVudHMpCi0JCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbG9zZSgpOyAvLyBjb3VsZCBub3QgZG8gYmV0dGVyCi0JCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4KXsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCX0KLQogCS8qCiAJICogVXBkYXRlIGVjbGlwc2UgcHJlZmVyZW5jZXMgZnJvbSBvbGQgcHJlZmVyZW5jZXMuCiAJICovCiAJIHByaXZhdGUgdm9pZCB1cGRhdGVQcmVmZXJlbmNlcyhJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JIAkKLQkgCVByZWZlcmVuY2VzIG9sZFByZWZlcmVuY2VzID0gbG9hZFByZWZlcmVuY2VzKCk7CisKKwkgCUlFY2xpcHNlUHJlZmVyZW5jZXMgb2xkUHJlZmVyZW5jZXMgPSBsb2FkUHJlZmVyZW5jZXMoKTsKIAkgCWlmIChvbGRQcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JIAkJU3RyaW5nW10gcHJvcGVydHlOYW1lcyA9IG9sZFByZWZlcmVuY2VzLnByb3BlcnR5TmFtZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07Ci0JCQkgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBvbGRQcmVmZXJlbmNlcy5nZXRTdHJpbmcocHJvcGVydHlOYW1lKTsKLQkJCSAgICBpZiAoISIiLmVxdWFscyhwcm9wZXJ0eVZhbHVlKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJICAgIHByZWZlcmVuY2VzLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkJICAgIH0KLQkJCX0KIAkJCXRyeSB7CisJCSAJCVN0cmluZ1tdIHByb3BlcnR5TmFtZXMgPSBvbGRQcmVmZXJlbmNlcy5jaGlsZHJlbk5hbWVzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07CisJCQkJICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gb2xkUHJlZmVyZW5jZXMuZ2V0KHByb3BlcnR5TmFtZSwgIiIpOyAvLyROT04tTkxTLTEkCisJCQkJICAgIGlmICghIiIuZXF1YWxzKHByb3BlcnR5VmFsdWUpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJICAgIHByZWZlcmVuY2VzLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworCQkJCSAgICB9CisJCQkJfQogCQkJCS8vIHNhdmUgaW1tZWRpYXRlbHkgbmV3IHByZWZlcmVuY2VzCiAJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKIAkJCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CkBAIC0yOTY3LDQgKzMyMjMsMTUgQEAKIAkJCX0KIAkJfQogCSB9CisKKwlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0ZW5jZShJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB7CisJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGphdmEgcHJvamVjdCBjYW4gYmUgb3BlbmVkCisJCXRyeSB7CisJCQlpZiAoISgoSVByb2plY3QpIHVuZGVybHlpbmdSZXNvdXJjZSkuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpCisJCQkJcmV0dXJuIG5ld0RvZXNOb3RFeGlzdFN0YXR1cygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBuZXdEb2VzTm90RXhpc3RTdGF0dXMoKTsKKwkJfQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0RWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0RWxlbWVudEluZm8uamF2YQppbmRleCA2OWIxYzgyLi5iMzJkZDQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdEVsZW1lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3RFbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDE5ICsyMiwxOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkhhc2h0YWJsZU9mQXJyYXlUb09iamVjdDsKIAotLyoqIAorLyoqCiAgKiBJbmZvIGZvciBJSmF2YVByb2plY3QuCiAgKiA8cD4KICAqIE5vdGU6IDxjb2RlPmdldENoaWxkcmVuKCk8L2NvZGU+IHJldHVybnMgYWxsIG9mIHRoZSA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdHM8L2NvZGU+CiAgKiBzcGVjaWZpZWQgb24gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QuICBUaGlzIGNhbiBpbmNsdWRlIHJvb3RzIGV4dGVybmFsIHRvIHRoZQotICogcHJvamVjdC4gU2VlIDxjb2RlPkphdmFQcm9qZWN0I2dldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk8L2NvZGU+IGFuZCAKKyAqIHByb2plY3QuIFNlZSA8Y29kZT5KYXZhUHJvamVjdCNnZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpPC9jb2RlPiBhbmQKICAqIDxjb2RlPkphdmFQcm9qZWN0I2dldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk8L2NvZGU+LiAgVG8gZ2V0IG9ubHkgdGhlIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290czwvY29kZT4KICAqIHRoYXQgYXJlIGludGVybmFsIHRvIHRoZSBwcm9qZWN0LCB1c2UgPGNvZGU+SmF2YVByb2plY3QjZ2V0Q2hpbGRyZW4oKTwvY29kZT4uCiAgKi8KIAogLyogcGFja2FnZSAqLwogY2xhc3MgSmF2YVByb2plY3RFbGVtZW50SW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8gewotCQorCiAJc3RhdGljIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290W10gTk9fUk9PVFMgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07CiAKIAlzdGF0aWMgY2xhc3MgUHJvamVjdENhY2hlIHsKQEAgLTQzLDM0ICs0MywzNCBAQAogCQkJdGhpcy5yb290VG9SZXNvbHZlZEVudHJpZXMgPSByb290VG9SZXNvbHZlZEVudHJpZXM7CiAJCQl0aGlzLnBrZ0ZyYWdtZW50c0NhY2hlcyA9IHBrZ0ZyYWdtZW50c0NhY2hlczsKIAkJfQotCQkKKwogCQkvKgogCQkgKiBBIGNhY2hlIG9mIGFsbCBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHRoaXMgcHJvamVjdC4KIAkJICovCiAJCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGFsbFBrZ0ZyYWdtZW50Um9vdHNDYWNoZTsKLQkJCisKIAkJLyoKIAkJICogQSBjYWNoZSBvZiBhbGwgcGFja2FnZSBmcmFnbWVudHMgaW4gdGhpcyBwcm9qZWN0LgogCQkgKiAoYSBtYXAgZnJvbSBTdHJpbmdbXSAodGhlIHBhY2thZ2UgbmFtZSkgdG8gSVBhY2thZ2VGcmFnbWVudFJvb3RbXSAodGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgdGhhdCBjb250YWluIGEgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoaXMgbmFtZSkpCiAJCSAqLwogCQlwdWJsaWMgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IGFsbFBrZ0ZyYWdtZW50c0NhY2hlOwotCQkKKwogCQkvKgogCQkgKiBBIGNhY2hlIG9mIHBhY2thZ2UgZnJhZ21lbnRzIGZvciBlYWNoIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGlzIHByb2plY3QKIAkJICogKGEgbWFwIGZyb20gSVBhY2thZ2VGcmFnbWVudFJvb3QgdG8gYSBzZXQgb2YgU3RyaW5nW10gKHRoZSBwYWNrYWdlIG5hbWUpKQogCQkgKi8KIAkJcHVibGljIE1hcCBwa2dGcmFnbWVudHNDYWNoZXM7Ci0JCQotCQlwdWJsaWMgTWFwIHJvb3RUb1Jlc29sdmVkRW50cmllczsJCQorCisJCXB1YmxpYyBNYXAgcm9vdFRvUmVzb2x2ZWRFbnRyaWVzOwogCX0KLQkKKwogCS8qKgogCSAqIEEgYXJyYXkgd2l0aCBhbGwgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgYnkgdGhpcyBQYWNrYWdlRnJhZ21lbnQKIAkgKi8KIAlwcml2YXRlIE9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXM7Ci0JCisKIAlQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOwotCQorCiAJLyoKIAkgKiBBZGRzIHRoZSBnaXZlbiBuYW1lIGFuZCBpdHMgc3VwZXIgbmFtZXMgdG8gdGhlIGdpdmVuIHNldAogCSAqIChlLmcuIGZvciB7ImEiLCAiYiIsICJjIn0sIGFkZHMgeyJhIiwgImIiLCAiYyJ9LCB7ImEiLCAiYiJ9LCBhbmQgeyJhIn0pCkBAIC04MywxOSArODMsMTkgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKIAkgKi8KIAlwdWJsaWMgSmF2YVByb2plY3RFbGVtZW50SW5mbygpIHsKIAkJdGhpcy5ub25KYXZhUmVzb3VyY2VzID0gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb21wdXRlIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgamF2YSBwcm9qZWN0LgogCSAqLwogCXByaXZhdGUgT2JqZWN0W10gY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCkgewotCQkKKwogCQkvLyBkZXRlcm1pbmUgaWYgc3JjID09IHByb2plY3QgYW5kL29yIGlmIGJpbiA9PSBwcm9qZWN0CiAJCUlQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKIAkJYm9vbGVhbiBzcmNJc1Byb2plY3QgPSBmYWxzZTsKQEAgLTEzMiwxMyArMTMyLDE0IEBACiAJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKIAkJCQkJCQlJUGF0aCByZXNGdWxsUGF0aCA9IHJlcy5nZXRGdWxsUGF0aCgpOwogCQkJCQkJCVN0cmluZyByZXNOYW1lID0gcmVzLmdldE5hbWUoKTsKLQkJCQkJCQorCiAJCQkJCQkJLy8gaWdub3JlIGEgamFyIGZpbGUgb24gdGhlIGNsYXNzcGF0aAotCQkJCQkJCWlmIChpc0NsYXNzcGF0aFJlc29sdmVkICYmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocmVzTmFtZSkgJiYgdGhpcy5pc0NsYXNzcGF0aEVudHJ5T3JPdXRwdXRMb2NhdGlvbihyZXNGdWxsUGF0aCwgY2xhc3NwYXRoLCBwcm9qZWN0T3V0cHV0KSkgeworCQkJCQkJCWlmIChpc0NsYXNzcGF0aFJlc29sdmVkICYmIAorCQkJCQkJCQkJaXNDbGFzc3BhdGhFbnRyeU9yT3V0cHV0TG9jYXRpb24ocmVzRnVsbFBhdGgsIHJlcy5nZXRMb2NhdGlvbigpLyogc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0MDYgKi8sIGNsYXNzcGF0aCwgcHJvamVjdE91dHB1dCkpIHsKIAkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJfQogCQkJCQkJCS8vIGlnbm9yZSAuamF2YSBmaWxlIGlmIHNyYyA9PSBwcm9qZWN0Ci0JCQkJCQkJaWYgKHNyY0lzUHJvamVjdCAKKwkJCQkJCQlpZiAoc3JjSXNQcm9qZWN0CiAJCQkJCQkJCQkmJiBVdGlsLmlzVmFsaWRDb21waWxhdGlvblVuaXROYW1lKHJlc05hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpCiAJCQkJCQkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKHJlcywgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSkgewogCQkJCQkJCQlicmVhazsKQEAgLTE2MSwxMCArMTYyLDEwIEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgogCQkJCQkJCXJlc0Z1bGxQYXRoID0gcmVzLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQkKKwogCQkJCQkJCS8vIGlnbm9yZSBub24tZXhjbHVkZWQgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoIG9yIHRoYXQgY29ycmVzcG9uZCB0byBhbiBvdXRwdXQgbG9jYXRpb24KIAkJCQkJCQlpZiAoKHNyY0lzUHJvamVjdCAmJiAhVXRpbC5pc0V4Y2x1ZGVkKHJlcywgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSAmJiBVdGlsLmlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShyZXMuZ2V0TmFtZSgpLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKSkKLQkJCQkJCQkJCXx8IChpc0NsYXNzcGF0aFJlc29sdmVkICYmIHRoaXMuaXNDbGFzc3BhdGhFbnRyeU9yT3V0cHV0TG9jYXRpb24ocmVzRnVsbFBhdGgsIGNsYXNzcGF0aCwgcHJvamVjdE91dHB1dCkpKSB7CisJCQkJCQkJCQl8fCAoaXNDbGFzc3BhdGhSZXNvbHZlZCAmJiBpc0NsYXNzcGF0aEVudHJ5T3JPdXRwdXRMb2NhdGlvbihyZXNGdWxsUGF0aCwgcmVzLmdldExvY2F0aW9uKCksIGNsYXNzcGF0aCwgcHJvamVjdE91dHB1dCkpKSB7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCX0KIAkJCQkJCQkvLyBlbHNlIGFkZCBub24gamF2YSByZXNvdXJjZQpAQCAtMTk1LDcgKzE5Niw3IEBACiAJCX0KIAkJcmV0dXJuIHJlc291cmNlczsKIAl9Ci0JCisKIAlQcm9qZWN0Q2FjaGUgZ2V0UHJvamVjdENhY2hlKEphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkJUHJvamVjdENhY2hlIGNhY2hlID0gdGhpcy5wcm9qZWN0Q2FjaGU7CiAJCWlmIChjYWNoZSA9PSBudWxsKSB7CkBAIC0yMDgsMjcgKzIwOSwzMCBAQAogCQkJCXJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdOwogCQkJCXJldmVyc2VNYXAuY2xlYXIoKTsKIAkJCX0KLQkJCQorCiAJCQlIYXNoTWFwIHJvb3RJbmZvcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhU3RhdGUucm9vdHM7CiAJCQlIYXNoTWFwIHBrZ0ZyYWdtZW50c0NhY2hlcyA9IG5ldyBIYXNoTWFwKCk7CiAJCQlpbnQgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOworCQkJSmF2YU1vZGVsTWFuYWdlciAgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKIAkJCQlEZWx0YVByb2Nlc3Nvci5Sb290SW5mbyByb290SW5mbyA9IChEZWx0YVByb2Nlc3Nvci5Sb290SW5mbykgcm9vdEluZm9zLmdldChyb290LmdldFBhdGgoKSk7CiAJCQkJaWYgKHJvb3RJbmZvID09IG51bGwgfHwgcm9vdEluZm8ucHJvamVjdC5lcXVhbHMocHJvamVjdCkpIHsKKwkJCQkJLy8gZW5zdXJlIHRoYXQgYW4gaWRlbnRpY2FsIHJvb3QgaXMgdXNlZCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTcwNTkgKQorCQkJCQlyb290c1tpXSA9IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIG1hbmFnZXIuZ2V0RXhpc3RpbmdFbGVtZW50KHJvb3QpOwogCQkJCQkvLyBjb21wdXRlIGZyYWdtZW50IGNhY2hlCiAJCQkJCUhhc2hTZXRPZkFycmF5IGZyYWdtZW50c0NhY2hlID0gbmV3IEhhc2hTZXRPZkFycmF5KCk7CiAJCQkJCWluaXRpYWxpemVQYWNrYWdlTmFtZXMocm9vdCwgZnJhZ21lbnRzQ2FjaGUpOwogCQkJCQlwa2dGcmFnbWVudHNDYWNoZXMucHV0KHJvb3QsIGZyYWdtZW50c0NhY2hlKTsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJY2FjaGUgPSBuZXcgUHJvamVjdENhY2hlKHJvb3RzLCByZXZlcnNlTWFwLCBwa2dGcmFnbWVudHNDYWNoZXMpOwogCQkJdGhpcy5wcm9qZWN0Q2FjaGUgPSBjYWNoZTsKIAkJfQogCQlyZXR1cm4gY2FjaGU7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KIAkgKi8KQEAgLTIzOSwyMSArMjQzLDIxIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMubm9uSmF2YVJlc291cmNlczsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VOYW1lcyhJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBIYXNoU2V0T2ZBcnJheSBmcmFnbWVudHNDYWNoZSkgewogCQlJSmF2YUVsZW1lbnRbXSBmcmFncyA9IG51bGw7CiAJCXRyeSB7CiAJCQlpZiAoIXJvb3QuaXNPcGVuKCkpIHsKIAkJCQlQYWNrYWdlRnJhZ21lbnRSb290SW5mbyBpbmZvID0gcm9vdC5pc0FyY2hpdmUoKSA/IG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbygpIDogbmV3IFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKCk7Ci0JCQkJKChQYWNrYWdlRnJhZ21lbnRSb290KSByb290KS5jb21wdXRlQ2hpbGRyZW4oaW5mbywgbmV3IEhhc2hNYXAoKSk7CisJCQkJKChQYWNrYWdlRnJhZ21lbnRSb290KSByb290KS5jb21wdXRlQ2hpbGRyZW4oaW5mbywgKChKYXZhRWxlbWVudCkgcm9vdCkucmVzb3VyY2UoKSk7CiAJCQkJZnJhZ3MgPSBpbmZvLmNoaWxkcmVuOwotCQkJfSBlbHNlIAorCQkJfSBlbHNlCiAJCQkJZnJhZ3MgPSByb290LmdldENoaWxkcmVuKCk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkvLyByb290IGRvZXNuJ3QgZXhpc3Q6IGlnbm9yZQogCQkJcmV0dXJuOwogCQl9Ci0JCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gZnJhZ3MubGVuZ3RoOyBqIDwgbGVuZ3RoMjsgaisrKSB7CisJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBmcmFncy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgewogCQkJZnJhZ21lbnRzQ2FjaGUuYWRkKCgoUGFja2FnZUZyYWdtZW50KSBmcmFnc1tqXSkubmFtZXMpOwogCQl9CiAJfQpAQCAtMjYxLDExICsyNjUsMTIgQEAKIAkvKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIGNsYXNzcGF0aCBlbnRyeSBvciBhbiBvdXRwdXQgbG9jYXRpb24uCiAJICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3NwYXRoRW50cnlPck91dHB1dExvY2F0aW9uKElQYXRoIHBhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoLCBJUGF0aCBwcm9qZWN0T3V0cHV0KSB7CisJcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3NwYXRoRW50cnlPck91dHB1dExvY2F0aW9uKElQYXRoIHBhdGgsIElQYXRoIGxvY2F0aW9uLCBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCwgSVBhdGggcHJvamVjdE91dHB1dCkgewogCQlpZiAocHJvamVjdE91dHB1dC5lcXVhbHMocGF0aCkpIHJldHVybiB0cnVlOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVzb2x2ZWRDbGFzc3BhdGgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJlc29sdmVkQ2xhc3NwYXRoW2ldOwotCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKKwkJCUlQYXRoIGVudHJ5UGF0aDsKKwkJCWlmICgoZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpKS5lcXVhbHMocGF0aCkgfHwgZW50cnlQYXRoLmVxdWFscyhsb2NhdGlvbikpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJCUlQYXRoIG91dHB1dDsKQEAgLTI3NSw5ICsyODAsOSBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgotCSAqIENyZWF0ZXMgYSBuZXcgbmFtZSBsb29rdXAgZm9yIHRoaXMgcHJvamVjdCBpbmZvLiAKKwkgKiBDcmVhdGVzIGEgbmV3IG5hbWUgbG9va3VwIGZvciB0aGlzIHByb2plY3QgaW5mby4KIAkgKiBUaGUgZ2l2ZW4gcHJvamVjdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBoYW5kbGUgb2YgdGhpcyBpbmZvLgogCSAqIFRoaXMgbmFtZSBsb29rdXAgZmlyc3QgbG9va3MgaW4gdGhlIGdpdmVuIHdvcmtpbmcgY29waWVzLgogCSAqLwpAQCAtMzQwLDE0ICszNDUsMTQgQEAKIAkJfQogCQlyZXR1cm4gbmV3IE5hbWVMb29rdXAoY2FjaGUuYWxsUGtnRnJhZ21lbnRSb290c0NhY2hlLCBjYWNoZS5hbGxQa2dGcmFnbWVudHNDYWNoZSwgd29ya2luZ0NvcGllcywgY2FjaGUucm9vdFRvUmVzb2x2ZWRFbnRyaWVzKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJlc2V0IHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGFuZCBwYWNrYWdlIGZyYWdtZW50IGNhY2hlcwogCSAqLwogCXZvaWQgcmVzZXRDYWNoZXMoKSB7CiAJCXRoaXMucHJvamVjdENhY2hlID0gbnVsbDsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZXQgdGhlIGZOb25KYXZhUmVzb3VyY2VzIHRvIHJlcyB2YWx1ZQogCSAqLwpAQCAtMzU1LDUgKzM2MCw1IEBACiAKIAkJdGhpcy5ub25KYXZhUmVzb3VyY2VzID0gcmVzb3VyY2VzOwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YWRvY0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YWRvY0NvbnN0YW50cy5qYXZhCmluZGV4IGJiOWY0YmEuLjIzOTY2NWIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFkb2NDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhZG9jQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMjIgKzEzLDI1IEBACiBwdWJsaWMgaW50ZXJmYWNlIEphdmFkb2NDb25zdGFudHMgewogCiAJU3RyaW5nIEFOQ0hPUl9QUkVGSVhfRU5EID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBTkNIT1JfUFJFRklYX1NUQVJUID0gIjxBIE5BTUU9XCIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFOQ0hPUl9TVUZGSVggPSAiPC9BPiI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgQU5DSE9SX1NVRkZJWF9MRU5HVEggPSBKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9TVUZGSVgubGVuZ3RoKCk7Ci0JU3RyaW5nIENPTlNUUlVDVE9SX0RFVEFJTCA9ICI8IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05TVFJVQ1RPUl9TVU1NQVJZID0gIjwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZJRUxEX1NVTU1BUlkgPSAiPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5VTV9DT05TVEFOVF9TVU1NQVJZID0gIjwhLS0gPT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBTVU1NQVJZID09PT09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQU5OT1RBVElPTl9UWVBFX1JFUVVJUkVEX01FTUJFUl9TVU1NQVJZID0gIjwhLS0gPT09PT09PT09PT0gQU5OT1RBVElPTiBUWVBFIFJFUVVJUkVEIE1FTUJFUiBTVU1NQVJZID09PT09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQU5OT1RBVElPTl9UWVBFX09QVElPTkFMX01FTUJFUl9TVU1NQVJZID0gIjwhLS0gPT09PT09PT09PT0gQU5OT1RBVElPTiBUWVBFIE9QVElPTkFMIE1FTUJFUiBTVU1NQVJZID09PT09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5EX09GX0NMQVNTX0RBVEEgPSAiPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQU5DSE9SX1BSRUZJWF9TVEFSVCA9ICI8QSBOQU1FPVwiIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJaW50IEFOQ0hPUl9QUkVGSVhfU1RBUlRfTEVOR0hUID0gQU5DSE9SX1BSRUZJWF9TVEFSVC5sZW5ndGg7CisJY2hhcltdIEFOQ0hPUl9TVUZGSVggPSAiPC9BPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWludCBBTkNIT1JfU1VGRklYX0xFTkdUSCA9IEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1NVRkZJWC5sZW5ndGg7CisJY2hhcltdIENPTlNUUlVDVE9SX0RFVEFJTCA9ICI8IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIENPTlNUUlVDVE9SX1NVTU1BUlkgPSAiPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBGSUVMRF9ERVRBSUw9ICI8IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEZJRUxEX1NVTU1BUlkgPSAiPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFTlVNX0NPTlNUQU5UX1NVTU1BUlkgPSAiPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFOTk9UQVRJT05fVFlQRV9SRVFVSVJFRF9NRU1CRVJfU1VNTUFSWSA9ICI8IS0tID09PT09PT09PT09IEFOTk9UQVRJT04gVFlQRSBSRVFVSVJFRCBNRU1CRVIgU1VNTUFSWSA9PT09PT09PT09PSAtLT4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQU5OT1RBVElPTl9UWVBFX09QVElPTkFMX01FTUJFUl9TVU1NQVJZID0gIjwhLS0gPT09PT09PT09PT0gQU5OT1RBVElPTiBUWVBFIE9QVElPTkFMIE1FTUJFUiBTVU1NQVJZID09PT09PT09PT09IC0tPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFTkRfT0ZfQ0xBU1NfREFUQSA9ICI8IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJU3RyaW5nIEhUTUxfRVhURU5TSU9OID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAogCVN0cmluZyBJTkRFWF9GSUxFX05BTUUgPSAiaW5kZXguaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX0RFVEFJTCA9ICI8IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfU1VNTUFSWSA9ICI8IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBORVNURURfQ0xBU1NfU1VNTUFSWSA9ICI8IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gTUVUSE9EX0RFVEFJTCA9ICI8IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIE1FVEhPRF9TVU1NQVJZID0gIjwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gTkVTVEVEX0NMQVNTX1NVTU1BUlkgPSAiPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlTdHJpbmcgUEFDS0FHRV9GSUxFX05BTUUgPSAicGFja2FnZS1zdW1tYXJ5Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUQVJUX09GX0NMQVNTX0RBVEEgPSAiPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgU1RBUlRfT0ZfQ0xBU1NfREFUQV9MRU5HVEggPSBKYXZhZG9jQ29uc3RhbnRzLlNUQVJUX09GX0NMQVNTX0RBVEEubGVuZ3RoKCk7CisJY2hhcltdIFNFUEFSQVRPUl9TVEFSVCA9ICI8IS0tID0iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU1RBUlRfT0ZfQ0xBU1NfREFUQSA9ICI8IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJaW50IFNUQVJUX09GX0NMQVNTX0RBVEFfTEVOR1RIID0gSmF2YWRvY0NvbnN0YW50cy5TVEFSVF9PRl9DTEFTU19EQVRBLmxlbmd0aDsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFkb2NDb250ZW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YWRvY0NvbnRlbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3Yjc0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFkb2NDb250ZW50cy5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3RUb0ludEFycmF5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKKworcHVibGljIGNsYXNzIEphdmFkb2NDb250ZW50cyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVU5LTk9XTl9GT1JNQVQgPSBuZXcgaW50WzBdOyAKKwkKKwlwcml2YXRlIEJpbmFyeVR5cGUgdHlwZTsKKwlwcml2YXRlIGNoYXJbXSBjb250ZW50OworCQorCXByaXZhdGUgaW50IGNoaWxkcmVuU3RhcnQ7CisJCisJcHJpdmF0ZSBib29sZWFuIGhhc0NvbXB1dGVkQ2hpbGRyZW5TZWN0aW9ucyA9IGZhbHNlOworCXByaXZhdGUgaW50IGluZGV4T2ZGaWVsZERldGFpbHM7CisJcHJpdmF0ZSBpbnQgaW5kZXhPZkNvbnN0cnVjdG9yRGV0YWlsczsKKwlwcml2YXRlIGludCBpbmRleE9mTWV0aG9kRGV0YWlsczsKKwlwcml2YXRlIGludCBpbmRleE9mRW5kT2ZDbGFzc0RhdGE7CisJCisJcHJpdmF0ZSBpbnQgaW5kZXhPZkZpZWxkc0JvdHRvbTsKKwlwcml2YXRlIGludCBpbmRleE9mQWxsTWV0aG9kc1RvcDsKKwlwcml2YXRlIGludCBpbmRleE9mQWxsTWV0aG9kc0JvdHRvbTsKKwkKKwlwcml2YXRlIGludFtdIHR5cGVEb2NSYW5nZTsKKwlwcml2YXRlIEhhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheSBmaWVsZERvY1JhbmdlczsKKwlwcml2YXRlIEhhc2h0YWJsZU9mT2JqZWN0VG9JbnRBcnJheSBtZXRob2REb2NSYW5nZXM7CisJCisJcHJpdmF0ZSBpbnRbXSBmaWVsZEFuY2hvckluZGV4ZXM7CisJcHJpdmF0ZSBpbnQgZmllbGRBbmNob3JJbmRleGVzQ291bnQ7CisJcHJpdmF0ZSBpbnQgZmllbGRMYXN0QW5jaG9yRm91bmRJbmRleDsKKwlwcml2YXRlIGludFtdIG1ldGhvZEFuY2hvckluZGV4ZXM7CisJcHJpdmF0ZSBpbnQgbWV0aG9kQW5jaG9ySW5kZXhlc0NvdW50OworCXByaXZhdGUgaW50IG1ldGhvZExhc3RBbmNob3JGb3VuZEluZGV4OworCXByaXZhdGUgaW50W10gdW5rbm93bkZvcm1hdEFuY2hvckluZGV4ZXM7CisJcHJpdmF0ZSBpbnQgdW5rbm93bkZvcm1hdEFuY2hvckluZGV4ZXNDb3VudDsKKwlwcml2YXRlIGludCB1bmtub3duRm9ybWF0TGFzdEFuY2hvckZvdW5kSW5kZXg7CisJcHJpdmF0ZSBpbnRbXSB0ZW1wQW5jaG9ySW5kZXhlczsKKwlwcml2YXRlIGludCB0ZW1wQW5jaG9ySW5kZXhlc0NvdW50OworCXByaXZhdGUgaW50IHRlbXBMYXN0QW5jaG9yRm91bmRJbmRleDsKKwkKKwlwdWJsaWMgSmF2YWRvY0NvbnRlbnRzKEJpbmFyeVR5cGUgdHlwZSwgU3RyaW5nIGNvbnRlbnQpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5jb250ZW50ID0gY29udGVudCAhPSBudWxsID8gY29udGVudC50b0NoYXJBcnJheSgpIDogbnVsbDsKKwl9CisJLyoKKwkgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBqYXZhZG9jIHRoYXQgZGVzY3JpYmUgdGhlIHR5cGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVEb2MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMuY29udGVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJaWYgKHRoaXMudHlwZURvY1JhbmdlID09IG51bGwpIHsKKwkJCQljb21wdXRlVHlwZVJhbmdlKCk7CisJCQl9CisJCX0KKwkJCisJCWlmICh0aGlzLnR5cGVEb2NSYW5nZSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy50eXBlRG9jUmFuZ2UgPT0gVU5LTk9XTl9GT1JNQVQpIHRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVOS05PV05fSkFWQURPQ19GT1JNQVQsIHRoaXMudHlwZSkpOworCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKENoYXJPcGVyYXRpb24uc3ViYXJyYXkodGhpcy5jb250ZW50LCB0aGlzLnR5cGVEb2NSYW5nZVswXSwgdGhpcy50eXBlRG9jUmFuZ2VbMV0pKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBqYXZhZG9jIHRoYXQgZGVzY3JpYmUgYSBmaWVsZCBvZiB0aGUgdHlwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGREb2MoSUZpZWxkIGNoaWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMuY29udGVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCisJCWludFtdIHJhbmdlID0gbnVsbDsKKwkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQlpZiAodGhpcy5maWVsZERvY1JhbmdlcyA9PSBudWxsKSB7CisJCQkJdGhpcy5maWVsZERvY1JhbmdlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmFuZ2UgPSB0aGlzLmZpZWxkRG9jUmFuZ2VzLmdldChjaGlsZCk7CisJCQl9CisJCQkKKwkJCWlmIChyYW5nZSA9PSBudWxsKSB7CisJCQkJcmFuZ2UgPSBjb21wdXRlRmllbGRSYW5nZShjaGlsZCk7CisJCQkJdGhpcy5maWVsZERvY1Jhbmdlcy5wdXQoY2hpbGQsIHJhbmdlKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJhbmdlICE9IG51bGwpIHsKKwkJCWlmIChyYW5nZSA9PSBVTktOT1dOX0ZPUk1BVCkgdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuVU5LTk9XTl9KQVZBRE9DX0ZPUk1BVCwgY2hpbGQpKTsKKwkJCXJldHVybiBTdHJpbmcudmFsdWVPZihDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuY29udGVudCwgcmFuZ2VbMF0sIHJhbmdlWzFdKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qCisJICogUmV0dXJucyB0aGUgcGFydCBvZiB0aGUgamF2YWRvYyB0aGF0IGRlc2NyaWJlIGEgbWV0aG9kIG9mIHRoZSB0eXBlCisJICovCisJcHVibGljIFN0cmluZyBnZXRNZXRob2REb2MoSU1ldGhvZCBjaGlsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmICh0aGlzLmNvbnRlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQorCQlpbnRbXSByYW5nZSA9IG51bGw7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJaWYgKHRoaXMubWV0aG9kRG9jUmFuZ2VzID09IG51bGwpIHsKKwkJCQl0aGlzLm1ldGhvZERvY1JhbmdlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50QXJyYXkoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmFuZ2UgPSB0aGlzLm1ldGhvZERvY1Jhbmdlcy5nZXQoY2hpbGQpOworCQkJfQorCQkJCisJCQlpZiAocmFuZ2UgPT0gbnVsbCkgeworCQkJCXJhbmdlID0gY29tcHV0ZU1ldGhvZFJhbmdlKGNoaWxkKTsKKwkJCQl0aGlzLm1ldGhvZERvY1Jhbmdlcy5wdXQoY2hpbGQsIHJhbmdlKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJhbmdlICE9IG51bGwpIHsKKwkJCWlmIChyYW5nZSA9PSBVTktOT1dOX0ZPUk1BVCkgdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuVU5LTk9XTl9KQVZBRE9DX0ZPUk1BVCwgY2hpbGQpKTsKKwkJCXJldHVybiBTdHJpbmcudmFsdWVPZihDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuY29udGVudCwgcmFuZ2VbMF0sIHJhbmdlWzFdKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qCisJICogQ29tcHV0ZSB0aGUgcmFuZ2VzIG9mIHRoZSBwYXJ0cyBvZiB0aGUgamF2YWRvYyB0aGF0IGRlc2NyaWJlIGVhY2ggbWV0aG9kIG9mIHRoZSB0eXBlCisJICovCisJcHJpdmF0ZSBpbnRbXSBjb21wdXRlQ2hpbGRSYW5nZShjaGFyW10gYW5jaG9yLCBpbnQgaW5kZXhPZlNlY3Rpb25Cb3R0b20pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwkJLy8gY2hlY2tzIGVhY2gga25vd24gYW5jaG9yIGxvY2F0aW9ucworCQlpZiAodGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ID4gMCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnRlbXBBbmNob3JJbmRleGVzQ291bnQ7IGkrKykgeworCQkJCWludCBhbmNob3JFbmRTdGFydCA9IHRoaXMudGVtcEFuY2hvckluZGV4ZXNbaV07CisJCQkJCisJCQkJaWYgKGFuY2hvckVuZFN0YXJ0ICE9IC0xICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGFuY2hvciwgdGhpcy5jb250ZW50LCBmYWxzZSwgYW5jaG9yRW5kU3RhcnQpKSB7CisJCQkJCQorCQkJCQl0aGlzLnRlbXBBbmNob3JJbmRleGVzW2ldID0gLTE7CisJCQkJCQorCQkJCQlyZXR1cm4gY29tcHV0ZUNoaWxkUmFuZ2UoYW5jaG9yRW5kU3RhcnQsIGFuY2hvciwgaW5kZXhPZlNlY3Rpb25Cb3R0b20pOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaW50IGZyb21JbmRleCA9IHRoaXMudGVtcExhc3RBbmNob3JGb3VuZEluZGV4OworCQlpbnQgaW5kZXg7CisJCQorCQkvLyBjaGVjayBlYWNoIG5leHQgdW5rbm93biBhbmNob3IgbG9jYXRpb25zCisJCXdoaWxlICgoaW5kZXggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5BTkNIT1JfUFJFRklYX1NUQVJULCB0aGlzLmNvbnRlbnQsIGZhbHNlLCBmcm9tSW5kZXgpKSAhPSAtMSAmJiAoaW5kZXggPCBpbmRleE9mU2VjdGlvbkJvdHRvbSB8fCBpbmRleE9mU2VjdGlvbkJvdHRvbSA9PSAtMSkpIHsKKwkJCWZyb21JbmRleCA9IGluZGV4ICsgMTsKKwkJCQorCQkJaW50IGFuY2hvckVuZFN0YXJ0ID0gaW5kZXggKyBKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9QUkVGSVhfU1RBUlRfTEVOR0hUOworCQkJCisJCQl0aGlzLnRlbXBMYXN0QW5jaG9yRm91bmRJbmRleCA9IGFuY2hvckVuZFN0YXJ0OworCQkJCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoYW5jaG9yLCB0aGlzLmNvbnRlbnQsIGZhbHNlLCBhbmNob3JFbmRTdGFydCkpIHsKKwkJCQlyZXR1cm4gY29tcHV0ZUNoaWxkUmFuZ2UoYW5jaG9yRW5kU3RhcnQsIGFuY2hvciwgaW5kZXhPZlNlY3Rpb25Cb3R0b20pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy50ZW1wQW5jaG9ySW5kZXhlcy5sZW5ndGggPT0gdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50ZW1wQW5jaG9ySW5kZXhlcywgMCwgdGhpcy50ZW1wQW5jaG9ySW5kZXhlcyA9IG5ldyBpbnRbdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ICsgMjBdLCAwLCB0aGlzLnRlbXBBbmNob3JJbmRleGVzQ291bnQpOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLnRlbXBBbmNob3JJbmRleGVzW3RoaXMudGVtcEFuY2hvckluZGV4ZXNDb3VudCsrXSA9IGFuY2hvckVuZFN0YXJ0OworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBpbnRbXSBjb21wdXRlQ2hpbGRSYW5nZShpbnQgYW5jaG9yRW5kU3RhcnQsIGNoYXJbXSBhbmNob3IsIGludCBpbmRleE9mQm90dG9tKSB7CisJCWludFtdIHJhbmdlID0gbnVsbDsKKwkJCQkKKwkJLy8gdHJ5IHRvIGZpbmQgdGhlIGJvdHRvbSBvZiB0aGUgc2VjdGlvbgorCQlpZiAoaW5kZXhPZkJvdHRvbSAhPSAtMSkgeworCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgYW5jaG9yCisJCQlpbnQgaW5kZXhPZkVuZExpbmsgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5BTkNIT1JfU1VGRklYLCB0aGlzLmNvbnRlbnQsIGZhbHNlLCBhbmNob3JFbmRTdGFydCArIGFuY2hvci5sZW5ndGgpOworCQkJaWYgKGluZGV4T2ZFbmRMaW5rICE9IC0xKSB7CisJCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIG5leHQgYW5jaG9yCisJCQkJaW50IGluZGV4T2ZOZXh0RWxlbWVudCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9QUkVGSVhfU1RBUlQsIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZFbmRMaW5rKTsKKwkJCQkKKwkJCQlpbnQgamF2YWRvY1N0YXJ0ID0gaW5kZXhPZkVuZExpbmsgKyBKYXZhZG9jQ29uc3RhbnRzLkFOQ0hPUl9TVUZGSVhfTEVOR1RIOworCQkJCWludCBqYXZhZG9jRW5kID0gaW5kZXhPZk5leHRFbGVtZW50ID09IC0xID8gaW5kZXhPZkJvdHRvbSA6IE1hdGgubWluKGluZGV4T2ZOZXh0RWxlbWVudCwgaW5kZXhPZkJvdHRvbSk7CisJCQkJcmFuZ2UgPSBuZXcgaW50W117amF2YWRvY1N0YXJ0LCBqYXZhZG9jRW5kfTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gdGhlIGFuY2hvciBoYXMgbm8gc3VmZml4CisJCQkJcmFuZ2UgPSBVTktOT1dOX0ZPUk1BVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHRoZSBkZXRhaWwgc2VjdGlvbiBoYXMgbm8gYm90dG9tCisJCQlyYW5nZSA9IFVOS05PV05fRk9STUFUOworCQl9CisJCQorCQlyZXR1cm4gcmFuZ2U7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVDaGlsZHJlblNlY3Rpb25zKCkgeworCQkvLyB0cnkgdG8gZmluZCB0aGUgbmV4dCBzZXBhcmF0b3IgcGFydAorCQlpbnQgbGFzdEluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuU0VQQVJBVE9SX1NUQVJULCB0aGlzLmNvbnRlbnQsIGZhbHNlLCB0aGlzLmNoaWxkcmVuU3RhcnQpOworCQlsYXN0SW5kZXggPSBsYXN0SW5kZXggPT0gLTEgPyB0aGlzLmNoaWxkcmVuU3RhcnQgOiBsYXN0SW5kZXg7CisKKwkJLy8gdHJ5IHRvIGZpbmQgZmllbGQgZGV0YWlsIHN0YXJ0CisJCXRoaXMuaW5kZXhPZkZpZWxkRGV0YWlscyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkZJRUxEX0RFVEFJTCwgdGhpcy5jb250ZW50LCBmYWxzZSwgbGFzdEluZGV4KTsKKwkJbGFzdEluZGV4ID0gdGhpcy5pbmRleE9mRmllbGREZXRhaWxzID09IC0xID8gbGFzdEluZGV4IDogdGhpcy5pbmRleE9mRmllbGREZXRhaWxzOworCQkKKwkJLy8gdHJ5IHRvIGZpbmQgY29uc3RydWN0b3IgZGV0YWlsIHN0YXJ0CisJCXRoaXMuaW5kZXhPZkNvbnN0cnVjdG9yRGV0YWlscyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkNPTlNUUlVDVE9SX0RFVEFJTCwgdGhpcy5jb250ZW50LCBmYWxzZSwgbGFzdEluZGV4KTsKKwkJbGFzdEluZGV4ID0gdGhpcy5pbmRleE9mQ29uc3RydWN0b3JEZXRhaWxzID09IC0xID8gbGFzdEluZGV4IDogdGhpcy5pbmRleE9mQ29uc3RydWN0b3JEZXRhaWxzOworCQkKKwkJLy8gdHJ5IHRvIGZpbmQgbWV0aG9kIGRldGFpbCBzdGFydAorCQl0aGlzLmluZGV4T2ZNZXRob2REZXRhaWxzID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuTUVUSE9EX0RFVEFJTCwgdGhpcy5jb250ZW50LCBmYWxzZSwgbGFzdEluZGV4KTsKKwkJbGFzdEluZGV4ID0gdGhpcy5pbmRleE9mTWV0aG9kRGV0YWlscyA9PSAtMSA/IGxhc3RJbmRleCA6IHRoaXMuaW5kZXhPZk1ldGhvZERldGFpbHM7CisJCQorCQkvLyB3ZSB0YWtlIHRoZSBlbmQgb2YgY2xhc3MgZGF0YQorCQl0aGlzLmluZGV4T2ZFbmRPZkNsYXNzRGF0YSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihKYXZhZG9jQ29uc3RhbnRzLkVORF9PRl9DTEFTU19EQVRBLCB0aGlzLmNvbnRlbnQsIGZhbHNlLCBsYXN0SW5kZXgpOworCQkKKwkJLy8gdHJ5IHRvIGZpbmQgdGhlIGZpZWxkIGRldGFpbCBlbmQKKwkJdGhpcy5pbmRleE9mRmllbGRzQm90dG9tID0KKwkJCXRoaXMuaW5kZXhPZkNvbnN0cnVjdG9yRGV0YWlscyAhPSAtMSA/IHRoaXMuaW5kZXhPZkNvbnN0cnVjdG9yRGV0YWlscyA6CisJCQkJdGhpcy5pbmRleE9mTWV0aG9kRGV0YWlscyAhPSAtMSA/IHRoaXMuaW5kZXhPZk1ldGhvZERldGFpbHM6CisJCQkJCXRoaXMuaW5kZXhPZkVuZE9mQ2xhc3NEYXRhOworCQkKKwkJdGhpcy5pbmRleE9mQWxsTWV0aG9kc1RvcCA9CisJCQl0aGlzLmluZGV4T2ZDb25zdHJ1Y3RvckRldGFpbHMgIT0gLTEgPworCQkJCQl0aGlzLmluZGV4T2ZDb25zdHJ1Y3RvckRldGFpbHMgOgorCQkJCQkJdGhpcy5pbmRleE9mTWV0aG9kRGV0YWlsczsKKwkJCisJCXRoaXMuaW5kZXhPZkFsbE1ldGhvZHNCb3R0b20gPSB0aGlzLmluZGV4T2ZFbmRPZkNsYXNzRGF0YTsKKwkKKwkJdGhpcy5oYXNDb21wdXRlZENoaWxkcmVuU2VjdGlvbnMgPSB0cnVlOworCX0KKworCS8qCisJICogQ29tcHV0ZSB0aGUgcmFuZ2VzIG9mIHRoZSBwYXJ0cyBvZiB0aGUgamF2YWRvYyB0aGF0IGRlc2NyaWJlIGVhY2ggY2hpbGQgb2YgdGhlIHR5cGUgKGZpZWxkcywgbWV0aG9kcykKKwkgKi8KKwlwcml2YXRlIGludFtdIGNvbXB1dGVGaWVsZFJhbmdlKElGaWVsZCBmaWVsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmICghdGhpcy5oYXNDb21wdXRlZENoaWxkcmVuU2VjdGlvbnMpIHsKKwkJCWNvbXB1dGVDaGlsZHJlblNlY3Rpb25zKCk7CisJCX0KKwkJCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZpZWxkLmdldEVsZW1lbnROYW1lKCkpOworCQlidWZmZXIuYXBwZW5kKEphdmFkb2NDb25zdGFudHMuQU5DSE9SX1BSRUZJWF9FTkQpOworCQljaGFyW10gYW5jaG9yID0gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKS50b0NoYXJBcnJheSgpOworCQkKKwkJaW50W10gcmFuZ2UgPSBudWxsOworCQkKKwkJaWYgKHRoaXMuaW5kZXhPZkZpZWxkRGV0YWlscyA9PSAtMSB8fCB0aGlzLmluZGV4T2ZGaWVsZHNCb3R0b20gPT0gLTEpIHsKKwkJCS8vIHRoZSBkZXRhaWwgc2VjdGlvbiBoYXMgbm8gdG9wIG9yIGJvdHRvbSwgc28gdGhlIGRvYyBoYXMgYW4gdW5rbm93biBmb3JtYXQKKwkJCWlmICh0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID09IG51bGwpIHsKKwkJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID0gbmV3IGludFt0aGlzLnR5cGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGhdOworCQkJCXRoaXMudW5rbm93bkZvcm1hdEFuY2hvckluZGV4ZXNDb3VudCA9IDA7CisJCQkJdGhpcy51bmtub3duRm9ybWF0TGFzdEFuY2hvckZvdW5kSW5kZXggPSB0aGlzLmNoaWxkcmVuU3RhcnQ7CisJCQl9CisJCQkKKwkJCXRoaXMudGVtcEFuY2hvckluZGV4ZXMgPSB0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzOworCQkJdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ID0gdGhpcy51bmtub3duRm9ybWF0QW5jaG9ySW5kZXhlc0NvdW50OworCQkJdGhpcy50ZW1wTGFzdEFuY2hvckZvdW5kSW5kZXggPSB0aGlzLnVua25vd25Gb3JtYXRMYXN0QW5jaG9yRm91bmRJbmRleDsKKwkJCQorCQkJcmFuZ2UgPSBjb21wdXRlQ2hpbGRSYW5nZShhbmNob3IsIHRoaXMuaW5kZXhPZkZpZWxkc0JvdHRvbSk7CisJCQkKKwkJCXRoaXMudW5rbm93bkZvcm1hdExhc3RBbmNob3JGb3VuZEluZGV4ID0gdGhpcy50ZW1wTGFzdEFuY2hvckZvdW5kSW5kZXg7CisJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzQ291bnQgPSB0aGlzLnRlbXBBbmNob3JJbmRleGVzQ291bnQ7CisJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID0gdGhpcy50ZW1wQW5jaG9ySW5kZXhlczsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLmZpZWxkQW5jaG9ySW5kZXhlcyA9PSBudWxsKSB7CisJCQkJdGhpcy5maWVsZEFuY2hvckluZGV4ZXMgPSBuZXcgaW50W3RoaXMudHlwZS5nZXRGaWVsZHMoKS5sZW5ndGhdOworCQkJCXRoaXMuZmllbGRBbmNob3JJbmRleGVzQ291bnQgPSAwOworCQkJCXRoaXMuZmllbGRMYXN0QW5jaG9yRm91bmRJbmRleCA9IHRoaXMuaW5kZXhPZkZpZWxkRGV0YWlsczsKKwkJCX0KKwkJCQorCQkJdGhpcy50ZW1wQW5jaG9ySW5kZXhlcyA9IHRoaXMuZmllbGRBbmNob3JJbmRleGVzOworCQkJdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ID0gdGhpcy5maWVsZEFuY2hvckluZGV4ZXNDb3VudDsKKwkJCXRoaXMudGVtcExhc3RBbmNob3JGb3VuZEluZGV4ID0gdGhpcy5maWVsZExhc3RBbmNob3JGb3VuZEluZGV4OworCQkJCisJCQlyYW5nZSA9IGNvbXB1dGVDaGlsZFJhbmdlKGFuY2hvciwgdGhpcy5pbmRleE9mRmllbGRzQm90dG9tKTsKKwkJCQorCQkJdGhpcy5maWVsZExhc3RBbmNob3JGb3VuZEluZGV4ID0gdGhpcy50ZW1wTGFzdEFuY2hvckZvdW5kSW5kZXg7CisJCQl0aGlzLmZpZWxkQW5jaG9ySW5kZXhlc0NvdW50ID0gdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50OworCQkJdGhpcy5maWVsZEFuY2hvckluZGV4ZXMgPSB0aGlzLnRlbXBBbmNob3JJbmRleGVzOworCQl9CisJCQorCQlyZXR1cm4gcmFuZ2U7CisJfQorCQorCS8qCisJICogQ29tcHV0ZSB0aGUgcmFuZ2VzIG9mIHRoZSBwYXJ0cyBvZiB0aGUgamF2YWRvYyB0aGF0IGRlc2NyaWJlIGVhY2ggbWV0aG9kIG9mIHRoZSB0eXBlCisJICovCisJcHJpdmF0ZSBpbnRbXSBjb21wdXRlTWV0aG9kUmFuZ2UoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpZiAoIXRoaXMuaGFzQ29tcHV0ZWRDaGlsZHJlblNlY3Rpb25zKSB7CisJCQljb21wdXRlQ2hpbGRyZW5TZWN0aW9ucygpOworCQl9CisJCQorCQljaGFyW10gYW5jaG9yID0gY29tcHV0ZU1ldGhvZEFuY2hvclByZWZpeEVuZCgoQmluYXJ5TWV0aG9kKW1ldGhvZCkudG9DaGFyQXJyYXkoKTsKKwkJCisJCWludFtdIHJhbmdlID0gbnVsbDsKKwkJCisJCWlmICh0aGlzLmluZGV4T2ZBbGxNZXRob2RzVG9wID09IC0xIHx8IHRoaXMuaW5kZXhPZkFsbE1ldGhvZHNCb3R0b20gPT0gLTEpIHsKKwkJCS8vIHRoZSBkZXRhaWwgc2VjdGlvbiBoYXMgbm8gdG9wIG9yIGJvdHRvbSwgc28gdGhlIGRvYyBoYXMgYW4gdW5rbm93biBmb3JtYXQKKwkJCWlmICh0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID09IG51bGwpIHsKKwkJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID0gbmV3IGludFt0aGlzLnR5cGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGhdOworCQkJCXRoaXMudW5rbm93bkZvcm1hdEFuY2hvckluZGV4ZXNDb3VudCA9IDA7CisJCQkJdGhpcy51bmtub3duRm9ybWF0TGFzdEFuY2hvckZvdW5kSW5kZXggPSB0aGlzLmNoaWxkcmVuU3RhcnQ7CisJCQl9CisJCQkKKwkJCXRoaXMudGVtcEFuY2hvckluZGV4ZXMgPSB0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzOworCQkJdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ID0gdGhpcy51bmtub3duRm9ybWF0QW5jaG9ySW5kZXhlc0NvdW50OworCQkJdGhpcy50ZW1wTGFzdEFuY2hvckZvdW5kSW5kZXggPSB0aGlzLnVua25vd25Gb3JtYXRMYXN0QW5jaG9yRm91bmRJbmRleDsKKwkJCQorCQkJcmFuZ2UgPSBjb21wdXRlQ2hpbGRSYW5nZShhbmNob3IsIHRoaXMuaW5kZXhPZkZpZWxkc0JvdHRvbSk7CisJCQkKKwkJCXRoaXMudW5rbm93bkZvcm1hdExhc3RBbmNob3JGb3VuZEluZGV4ID0gdGhpcy50ZW1wTGFzdEFuY2hvckZvdW5kSW5kZXg7CisJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzQ291bnQgPSB0aGlzLnRlbXBBbmNob3JJbmRleGVzQ291bnQ7CisJCQl0aGlzLnVua25vd25Gb3JtYXRBbmNob3JJbmRleGVzID0gdGhpcy50ZW1wQW5jaG9ySW5kZXhlczsKKwkJfSBlbHNlIHsJCQkKKwkJCWlmICh0aGlzLm1ldGhvZEFuY2hvckluZGV4ZXMgPT0gbnVsbCkgeworCQkJCXRoaXMubWV0aG9kQW5jaG9ySW5kZXhlcyA9IG5ldyBpbnRbdGhpcy50eXBlLmdldEZpZWxkcygpLmxlbmd0aF07CisJCQkJdGhpcy5tZXRob2RBbmNob3JJbmRleGVzQ291bnQgPSAwOworCQkJCXRoaXMubWV0aG9kTGFzdEFuY2hvckZvdW5kSW5kZXggPSB0aGlzLmluZGV4T2ZBbGxNZXRob2RzVG9wOworCQkJfQorCQkJCisJCQl0aGlzLnRlbXBBbmNob3JJbmRleGVzID0gdGhpcy5tZXRob2RBbmNob3JJbmRleGVzOworCQkJdGhpcy50ZW1wQW5jaG9ySW5kZXhlc0NvdW50ID0gdGhpcy5tZXRob2RBbmNob3JJbmRleGVzQ291bnQ7CisJCQl0aGlzLnRlbXBMYXN0QW5jaG9yRm91bmRJbmRleCA9IHRoaXMubWV0aG9kTGFzdEFuY2hvckZvdW5kSW5kZXg7CisJCQkKKwkJCXJhbmdlID0gY29tcHV0ZUNoaWxkUmFuZ2UoYW5jaG9yLCB0aGlzLmluZGV4T2ZBbGxNZXRob2RzQm90dG9tKTsKKwkJCQorCQkJdGhpcy5tZXRob2RMYXN0QW5jaG9yRm91bmRJbmRleCA9IHRoaXMudGVtcExhc3RBbmNob3JGb3VuZEluZGV4OworCQkJdGhpcy5tZXRob2RBbmNob3JJbmRleGVzQ291bnQgPSB0aGlzLnRlbXBBbmNob3JJbmRleGVzQ291bnQ7CisJCQl0aGlzLm1ldGhvZEFuY2hvckluZGV4ZXMgPSB0aGlzLnRlbXBBbmNob3JJbmRleGVzOworCQl9CisJCQorCQlyZXR1cm4gcmFuZ2U7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVNZXRob2RBbmNob3JQcmVmaXhFbmQoQmluYXJ5TWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0eXBlUXVhbGlmaWVkTmFtZSA9IG51bGw7CisJCWlmICh0aGlzLnR5cGUuaXNNZW1iZXIoKSkgeworCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGU7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKKwkJCQlidWZmZXIuaW5zZXJ0KDAsIGN1cnJlbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOworCQkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJCWlmIChjdXJyZW50VHlwZSAhPSBudWxsKSB7CisJCQkJCWJ1ZmZlci5pbnNlcnQoMCwgJy4nKTsKKwkJCQl9CisJCQl9CisJCQl0eXBlUXVhbGlmaWVkTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyLnRvU3RyaW5nKCkpOworCQl9IGVsc2UgeworCQkJdHlwZVF1YWxpZmllZE5hbWUgPSB0aGlzLnR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKKwkJfQorCQkKKwkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKKwkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCW1ldGhvZE5hbWUgPSB0eXBlUXVhbGlmaWVkTmFtZTsKKwkJfQorCQlJQmluYXJ5TWV0aG9kIGluZm8gPSAoSUJpbmFyeU1ldGhvZCkgbWV0aG9kLmdldEVsZW1lbnRJbmZvKCk7CisKKwkJY2hhcltdIGdlbmVyaWNTaWduYXR1cmUgPSBpbmZvLmdldEdlbmVyaWNTaWduYXR1cmUoKTsKKwkJU3RyaW5nIGFuY2hvciA9IG51bGw7CisJCWlmIChnZW5lcmljU2lnbmF0dXJlICE9IG51bGwpIHsKKwkJCWdlbmVyaWNTaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkoZ2VuZXJpY1NpZ25hdHVyZSwgJy8nLCAnLicpOworCQkJYW5jaG9yID0gVXRpbC50b0FuY2hvcigwLCBnZW5lcmljU2lnbmF0dXJlLCBtZXRob2ROYW1lLCBGbGFncy5pc1ZhcmFyZ3MobWV0aG9kLmdldEZsYWdzKCkpKTsKKwkJCWlmIChhbmNob3IgPT0gbnVsbCkgdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuVU5LTk9XTl9KQVZBRE9DX0ZPUk1BVCwgbWV0aG9kKSk7CisJCX0gZWxzZSB7CisJCQlhbmNob3IgPSBTaWduYXR1cmUudG9TdHJpbmcobWV0aG9kLmdldFNpZ25hdHVyZSgpLnJlcGxhY2UoJy8nLCAnLicpLCBtZXRob2ROYW1lLCBudWxsLCB0cnVlLCBmYWxzZSwgRmxhZ3MuaXNWYXJhcmdzKG1ldGhvZC5nZXRGbGFncygpKSk7CisJCX0KKwkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRoaXMudHlwZTsKKwkJaWYgKGRlY2xhcmluZ1R5cGUuaXNNZW1iZXIoKSkgeworCQkJLy8gbWlnaHQgbmVlZCB0byByZW1vdmUgYSBwYXJ0IG9mIHRoZSBzaWduYXR1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgc3ludGhldGljIGFyZ3VtZW50CisJCQlpZiAoIUZsYWdzLmlzU3RhdGljKGRlY2xhcmluZ1R5cGUuZ2V0RmxhZ3MoKSkpIHsKKwkJCQlpbnQgaW5kZXhPZk9wZW5pbmdQYXJlbiA9IGFuY2hvci5pbmRleE9mKCcoJyk7CisJCQkJaWYgKGluZGV4T2ZPcGVuaW5nUGFyZW4gPT0gLTEpIHJldHVybiBudWxsOworCQkJCWludCBpbmRleCA9IGluZGV4T2ZPcGVuaW5nUGFyZW47CisJCQkJaW5kZXhPZk9wZW5pbmdQYXJlbisrOworCQkJCWludCBpbmRleE9mQ29tbWEgPSBhbmNob3IuaW5kZXhPZignLCcsIGluZGV4KTsKKwkJCQlpZiAoaW5kZXhPZkNvbW1hICE9IC0xKSB7CisJCQkJCWluZGV4ID0gaW5kZXhPZkNvbW1hICsgMjsKKwkJCQkKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBubyBhcmd1bWVudCwgYnV0IGEgc3ludGhldGljIGFyZ3VtZW50CisJCQkJCWluZGV4ID0gYW5jaG9yLmluZGV4T2YoJyknLCBpbmRleCk7CisJCQkJfQorCQkJCWFuY2hvciA9IGFuY2hvci5zdWJzdHJpbmcoMCwgaW5kZXhPZk9wZW5pbmdQYXJlbikgKyBhbmNob3Iuc3Vic3RyaW5nKGluZGV4KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYW5jaG9yICsgSmF2YWRvY0NvbnN0YW50cy5BTkNIT1JfUFJFRklYX0VORDsKKwl9CisJCisJLyoKKwkgKiBDb21wdXRlIHRoZSByYW5nZSBvZiB0aGUgcGFydCBvZiB0aGUgamF2YWRvYyB0aGF0IGRlc2NyaWJlIHRoZSB0eXBlCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVUeXBlUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJZmluYWwgaW50IGluZGV4T2ZTdGFydE9mQ2xhc3NEYXRhID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuU1RBUlRfT0ZfQ0xBU1NfREFUQSwgdGhpcy5jb250ZW50LCBmYWxzZSk7CisJCWlmIChpbmRleE9mU3RhcnRPZkNsYXNzRGF0YSA9PSAtMSkgeworCQkJdGhpcy50eXBlRG9jUmFuZ2UgPSBVTktOT1dOX0ZPUk1BVDsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgaW5kZXhPZk5leHRTZXBhcmF0b3IgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5TRVBBUkFUT1JfU1RBUlQsIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZTdGFydE9mQ2xhc3NEYXRhKTsKKwkJaWYgKGluZGV4T2ZOZXh0U2VwYXJhdG9yID09IC0xKSB7CisJCQl0aGlzLnR5cGVEb2NSYW5nZSA9IFVOS05PV05fRk9STUFUOworCQkJcmV0dXJuOworCQl9CisJCWludCBpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5ORVNURURfQ0xBU1NfU1VNTUFSWSwgdGhpcy5jb250ZW50LCBmYWxzZSwgaW5kZXhPZk5leHRTZXBhcmF0b3IpOworCQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xICYmIHRoaXMudHlwZS5pc0VudW0oKSkgeworCQkJLy8gdHJ5IHRvIGZpbmQgZW51bSBjb25zdGFudCBzdW1tYXJ5IHN0YXJ0CisJCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5FTlVNX0NPTlNUQU5UX1NVTU1BUlksIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZOZXh0U2VwYXJhdG9yKTsKKwkJfQorCQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xICYmIHRoaXMudHlwZS5pc0Fubm90YXRpb24oKSkgeworCQkJLy8gdHJ5IHRvIGZpbmQgcmVxdWlyZWQgZW51bSBjb25zdGFudCBzdW1tYXJ5IHN0YXJ0CisJCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEVfUkVRVUlSRURfTUVNQkVSX1NVTU1BUlksIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZOZXh0U2VwYXJhdG9yKTsKKwkJCWlmIChpbmRleE9mTmV4dFN1bW1hcnkgPT0gLTEpIHsKKwkJCQkvLyB0cnkgdG8gZmluZCBvcHRpb25hbCBlbnVtIGNvbnN0YW50IHN1bW1hcnkgc3RhcnQKKwkJCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEVfT1BUSU9OQUxfTUVNQkVSX1NVTU1BUlksIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZOZXh0U2VwYXJhdG9yKTsKKwkJCX0KKwkJfQorCQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7CisJCQkvLyB0cnkgdG8gZmluZCBmaWVsZCBzdW1tYXJ5IHN0YXJ0CisJCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5GSUVMRF9TVU1NQVJZLCB0aGlzLmNvbnRlbnQsIGZhbHNlLCBpbmRleE9mTmV4dFNlcGFyYXRvcik7CisJCX0KKwkJaWYgKGluZGV4T2ZOZXh0U3VtbWFyeSA9PSAtMSkgeworCQkJLy8gdHJ5IHRvIGZpbmQgY29uc3RydWN0b3Igc3VtbWFyeSBzdGFydAorCQkJaW5kZXhPZk5leHRTdW1tYXJ5ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuQ09OU1RSVUNUT1JfU1VNTUFSWSwgdGhpcy5jb250ZW50LCBmYWxzZSwgaW5kZXhPZk5leHRTZXBhcmF0b3IpOworCQl9CisJCWlmIChpbmRleE9mTmV4dFN1bW1hcnkgPT0gLTEpIHsKKwkJCS8vIHRyeSB0byBmaW5kIG1ldGhvZCBzdW1tYXJ5IHN0YXJ0CisJCQlpbmRleE9mTmV4dFN1bW1hcnkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoSmF2YWRvY0NvbnN0YW50cy5NRVRIT0RfU1VNTUFSWSwgdGhpcy5jb250ZW50LCBmYWxzZSwgaW5kZXhPZk5leHRTZXBhcmF0b3IpOworCQl9CisJCQorCQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7CisJCQkvLyB3ZSB0YWtlIHRoZSBlbmQgb2YgY2xhc3MgZGF0YQorCQkJaW5kZXhPZk5leHRTdW1tYXJ5ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKEphdmFkb2NDb25zdGFudHMuRU5EX09GX0NMQVNTX0RBVEEsIHRoaXMuY29udGVudCwgZmFsc2UsIGluZGV4T2ZOZXh0U2VwYXJhdG9yKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgY29tcHV0YXRpb24gb2YgY2hpbGRyZW4gcmFuZ2VzCisJCQl0aGlzLmNoaWxkcmVuU3RhcnQgPSBpbmRleE9mTmV4dFN1bW1hcnkgKyAxOworCQl9CisJCQorCQlpZiAoaW5kZXhPZk5leHRTdW1tYXJ5ID09IC0xKSB7CisJCQl0aGlzLnR5cGVEb2NSYW5nZSA9IFVOS05PV05fRk9STUFUOworCQkJcmV0dXJuOworCQl9CisJCS8qCisJCSAqIENoZWNrIG91dCB0byBjdXQgb2ZmIHRoZSBoaWVyYXJjaHkgc2VlIDExOTg0NAorCQkgKiBXZSByZW1vdmUgd2hhdCB0aGUgY29udGVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY2xhc3MgZGF0YSBhbmQgdGhlIGZpcnN0IDxQPgorCQkgKi8KKwkJaW50IHN0YXJ0ID0gaW5kZXhPZlN0YXJ0T2ZDbGFzc0RhdGEgKyBKYXZhZG9jQ29uc3RhbnRzLlNUQVJUX09GX0NMQVNTX0RBVEFfTEVOR1RIOworCQlpbnQgaW5kZXhPZkZpcnN0UGFyYWdyYXBoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCI8UD4iLnRvQ2hhckFycmF5KCksIHRoaXMuY29udGVudCwgZmFsc2UsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaW5kZXhPZkZpcnN0UGFyYWdyYXBoICE9IC0xICYmIGluZGV4T2ZGaXJzdFBhcmFncmFwaCA8IGluZGV4T2ZOZXh0U3VtbWFyeSkgeworCQkJc3RhcnQgPSBpbmRleE9mRmlyc3RQYXJhZ3JhcGg7CisJCX0KKwkJCisJCXRoaXMudHlwZURvY1JhbmdlID0gbmV3IGludFtde3N0YXJ0LCBpbmRleE9mTmV4dFN1bW1hcnl9OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0xSVUNhY2hlRW51bWVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKaW5kZXggNjMxNjcwZS4uZDg4MDdhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNTcgKzEzLDU3IEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiAvKioKLSAqCVRoZSA8Y29kZT5MUlVDYWNoZUVudW1lcmF0b3I8L2NvZGU+IHJldHVybnMgaXRzIGVsZW1lbnRzIGluIAorICoJVGhlIDxjb2RlPkxSVUNhY2hlRW51bWVyYXRvcjwvY29kZT4gcmV0dXJucyBpdHMgZWxlbWVudHMgaW4KICAqCXRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgPGNvZGU+TFJVQ2FjaGU8L2NvZGU+LCB3aXRoIHRoZQogICoJbW9zdCByZWNlbnQgZWxlbWVudHMgZmlyc3QuCiAgKgotICoJT25jZSB0aGUgZW51bWVyYXRvciBpcyBjcmVhdGVkLCBlbGVtZW50cyB3aGljaCBhcmUgbGF0ZXIgYWRkZWQgCisgKglPbmNlIHRoZSBlbnVtZXJhdG9yIGlzIGNyZWF0ZWQsIGVsZW1lbnRzIHdoaWNoIGFyZSBsYXRlciBhZGRlZAogICoJdG8gdGhlIGNhY2hlIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIGVudW1lcmF0b3IuICBIb3dldmVyLAotICoJZWxlbWVudHMgcmV0dXJuZWQgZnJvbSB0aGUgZW51bWVyYXRvciBjb3VsZCBoYXZlIGJlZW4gY2xvc2VkIAorICoJZWxlbWVudHMgcmV0dXJuZWQgZnJvbSB0aGUgZW51bWVyYXRvciBjb3VsZCBoYXZlIGJlZW4gY2xvc2VkCiAgKglieSB0aGUgY2FjaGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBMUlVDYWNoZUVudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CiAJLyoqCiAJICoJQ3VycmVudCBlbGVtZW50OwogCSAqLwotCXByb3RlY3RlZCBMUlVFbnVtZXJhdG9yRWxlbWVudCBmRWxlbWVudFF1ZXVlOworCXByb3RlY3RlZCBMUlVFbnVtZXJhdG9yRWxlbWVudCBlbGVtZW50UXVldWU7CiAKIAlwdWJsaWMgc3RhdGljIGNsYXNzIExSVUVudW1lcmF0b3JFbGVtZW50IHsKIAkJLyoqCiAJCSAqCVZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPm5leHRFbGVtZW50KCk8L2NvZGU+OwogCQkgKi8KLQkJcHVibGljIE9iamVjdCBmVmFsdWU7Ci0JCQorCQlwdWJsaWMgT2JqZWN0IHZhbHVlOworCiAJCS8qKgogCQkgKglOZXh0IGVsZW1lbnQKIAkJICovCi0JCXB1YmxpYyBMUlVFbnVtZXJhdG9yRWxlbWVudCBmTmV4dDsKKwkJcHVibGljIExSVUVudW1lcmF0b3JFbGVtZW50IG5leHQ7CiAKIAkJLyoqCiAJCSAqIENvbnN0cnVjdG9yCiAJCSAqLwogCQlwdWJsaWMgTFJVRW51bWVyYXRvckVsZW1lbnQoT2JqZWN0IHZhbHVlKSB7Ci0JCQlmVmFsdWUgPSB2YWx1ZTsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKIAkJfQogCX0KIC8qKgogICoJQ3JlYXRlcyBhIENhY2hlRW51bWVyYXRvciBvbiB0aGUgbGlzdCBvZiA8Y29kZT5MUlVFbnVtZXJhdG9yRWxlbWVudHM8L2NvZGU+LgogICovCiBwdWJsaWMgTFJVQ2FjaGVFbnVtZXJhdG9yKExSVUVudW1lcmF0b3JFbGVtZW50IGZpcnN0RWxlbWVudCkgewotCWZFbGVtZW50UXVldWUgPSBmaXJzdEVsZW1lbnQ7CisJdGhpcy5lbGVtZW50UXVldWUgPSBmaXJzdEVsZW1lbnQ7CiB9CiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiBtb3JlIGVsZW1lbnRzIGV4aXN0LgogICovCiBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JcmV0dXJuIGZFbGVtZW50UXVldWUgIT0gbnVsbDsKKwlyZXR1cm4gdGhpcy5lbGVtZW50UXVldWUgIT0gbnVsbDsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50LgogICovCiBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCU9iamVjdCB0ZW1wID0gZkVsZW1lbnRRdWV1ZS5mVmFsdWU7Ci0JZkVsZW1lbnRRdWV1ZSA9IGZFbGVtZW50UXVldWUuZk5leHQ7CisJT2JqZWN0IHRlbXAgPSB0aGlzLmVsZW1lbnRRdWV1ZS52YWx1ZTsKKwl0aGlzLmVsZW1lbnRRdWV1ZSA9IHRoaXMuZWxlbWVudFF1ZXVlLm5leHQ7CiAJcmV0dXJuIHRlbXA7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Mb2NhbFZhcmlhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Mb2NhbFZhcmlhYmxlLmphdmEKaW5kZXggNmQ4OWY3Ni4uY2M4YmI1OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTG9jYWxWYXJpYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0xvY2FsVmFyaWFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiwyOSArMTYsNDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ2xhc3NMaXRlcmFsQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OdWxsTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk9wZXJhdG9ySWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmFyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5FeHRyYUNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcnlTY2FubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVtZW50b1Rva2VuaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIAogcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGUgZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50IGltcGxlbWVudHMgSUxvY2FsVmFyaWFibGUgewogCisJcHVibGljIHN0YXRpYyBmaW5hbCBJTG9jYWxWYXJpYWJsZVtdIE5PX0xPQ0FMX1ZBUklBQkxFUyA9IG5ldyBJTG9jYWxWYXJpYWJsZVswXTsKKwkKIAlTdHJpbmcgbmFtZTsKIAlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGRlY2xhcmF0aW9uU291cmNlRW5kOwogCXB1YmxpYyBpbnQgbmFtZVN0YXJ0LCBuYW1lRW5kOwogCVN0cmluZyB0eXBlU2lnbmF0dXJlOwotCQorCXB1YmxpYyBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworCXByaXZhdGUgaW50IGZsYWdzOworCXByaXZhdGUgYm9vbGVhbiBpc1BhcmFtZXRlcjsKKwogCXB1YmxpYyBMb2NhbFZhcmlhYmxlKAotCQkJSmF2YUVsZW1lbnQgcGFyZW50LCAKLQkJCVN0cmluZyBuYW1lLCAKLQkJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwkJCUphdmFFbGVtZW50IHBhcmVudCwKKwkJCVN0cmluZyBuYW1lLAorCQkJaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsCiAJCQlpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQsCi0JCQlpbnQgbmFtZVN0YXJ0LCAKKwkJCWludCBuYW1lU3RhcnQsCiAJCQlpbnQgbmFtZUVuZCwKLQkJCVN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCQorCQkJU3RyaW5nIHR5cGVTaWduYXR1cmUsCisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb25bXSBhc3RBbm5vdGF0aW9ucywKKwkJCWludCBmbGFncywKKwkJCWJvb2xlYW4gaXNQYXJhbWV0ZXIpIHsKKwogCQlzdXBlcihwYXJlbnQpOwogCQl0aGlzLm5hbWUgPSBuYW1lOwogCQl0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwpAQCAtNDYsNiArNjQsOSBAQAogCQl0aGlzLm5hbWVTdGFydCA9IG5hbWVTdGFydDsKIAkJdGhpcy5uYW1lRW5kID0gbmFtZUVuZDsKIAkJdGhpcy50eXBlU2lnbmF0dXJlID0gdHlwZVNpZ25hdHVyZTsKKwkJdGhpcy5hbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGFzdEFubm90YXRpb25zKTsKKwkJdGhpcy5mbGFncyA9IGZsYWdzOworCQl0aGlzLmlzUGFyYW1ldGVyID0gaXNQYXJhbWV0ZXI7CiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgY2xvc2luZyhPYmplY3QgaW5mbykgewpAQCAtNjAsMTQgKzgxLDE0IEBACiAJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmICghKG8gaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlKSkgcmV0dXJuIGZhbHNlOwogCQlMb2NhbFZhcmlhYmxlIG90aGVyID0gKExvY2FsVmFyaWFibGUpbzsKLQkJcmV0dXJuIAotCQkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IG90aGVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgCisJCXJldHVybgorCQkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IG90aGVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQKIAkJCSYmIHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gb3RoZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQKIAkJCSYmIHRoaXMubmFtZVN0YXJ0ID09IG90aGVyLm5hbWVTdGFydAogCQkJJiYgdGhpcy5uYW1lRW5kID09IG90aGVyLm5hbWVFbmQKIAkJCSYmIHN1cGVyLmVxdWFscyhvKTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CiAJCXJldHVybiB0aGlzLnBhcmVudC5leGlzdHMoKTsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NjE5MgogCX0KQEAgLTc2LDYgKzk3LDEzNiBAQAogCQkvLyBhIGxvY2FsIHZhcmlhYmxlIGhhcyBubyBpbmZvCiAJfQogCisJcHVibGljIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmFubm90YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9uc1tpXTsKKwkJCWlmIChhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkKKwkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJfQorCisJcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnM7CisJfQorCisJcHJpdmF0ZSBJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbltdIGFzdEFubm90YXRpb25zKSB7CisJCWludCBsZW5ndGg7CisJCWlmIChhc3RBbm5vdGF0aW9ucyA9PSBudWxsIHx8IChsZW5ndGggPSBhc3RBbm5vdGF0aW9ucy5sZW5ndGgpID09IDApCisJCQlyZXR1cm4gQW5ub3RhdGlvbi5OT19BTk5PVEFUSU9OUzsKKwkJSUFubm90YXRpb25bXSByZXN1bHQgPSBuZXcgSUFubm90YXRpb25bbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gZ2V0QW5ub3RhdGlvbihhc3RBbm5vdGF0aW9uc1tpXSwgdGhpcyk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uIGFubm90YXRpb24sIEphdmFFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKKwkJZmluYWwgaW50IHR5cGVTdGFydCA9IGFubm90YXRpb24udHlwZS5zb3VyY2VTdGFydCgpOworCQlmaW5hbCBpbnQgdHlwZUVuZCA9IGFubm90YXRpb24udHlwZS5zb3VyY2VFbmQoKTsKKwkJZmluYWwgaW50IHNvdXJjZVN0YXJ0ID0gYW5ub3RhdGlvbi5zb3VyY2VTdGFydCgpOworCQlmaW5hbCBpbnQgc291cmNlRW5kID0gYW5ub3RhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJY2xhc3MgTG9jYWxWYXJBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CisJCQlJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlyczsKKwkJCXB1YmxpYyBMb2NhbFZhckFubm90YXRpb24oSmF2YUVsZW1lbnQgbG9jYWxWYXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQkJCXN1cGVyKGxvY2FsVmFyLCBlbGVtZW50TmFtZSk7CisJCQl9CisJCQlwdWJsaWMgSU1lbWJlclZhbHVlUGFpcltdIGdldE1lbWJlclZhbHVlUGFpcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQlyZXR1cm4gdGhpcy5tZW1iZXJWYWx1ZVBhaXJzOworCQkJfQorCQkJcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQlyZXR1cm4gbmV3IFNvdXJjZVJhbmdlKHR5cGVTdGFydCwgdHlwZUVuZCAtIHR5cGVTdGFydCArIDEpOworCQkJfQorCQkJcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJCXJldHVybiBuZXcgU291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJCQkJcmV0dXJuIHRoaXMucGFyZW50LmV4aXN0cygpOworCQkJfQorCQl9CisJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFubm90YXRpb24udHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpKTsKKwkJTG9jYWxWYXJBbm5vdGF0aW9uIGxvY2FsVmFyQW5ub3RhdGlvbiA9IG5ldyBMb2NhbFZhckFubm90YXRpb24ocGFyZW50RWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclZhbHVlUGFpcltdIGFzdE1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLm1lbWJlclZhbHVlUGFpcnMoKTsKKwkJaW50IGxlbmd0aDsKKwkJSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnM7CisJCWlmIChhc3RNZW1iZXJWYWx1ZVBhaXJzID09IG51bGwgfHwgKGxlbmd0aCA9IGFzdE1lbWJlclZhbHVlUGFpcnMubGVuZ3RoKSA9PSAwKSB7CisJCQltZW1iZXJWYWx1ZVBhaXJzID0gQW5ub3RhdGlvbi5OT19NRU1CRVJfVkFMVUVfUEFJUlM7CisJCX0gZWxzZSB7CisJCQltZW1iZXJWYWx1ZVBhaXJzID0gbmV3IElNZW1iZXJWYWx1ZVBhaXJbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclZhbHVlUGFpciBhc3RNZW1iZXJWYWx1ZVBhaXIgPSBhc3RNZW1iZXJWYWx1ZVBhaXJzW2ldOworCQkJCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKG5ldyBTdHJpbmcoYXN0TWVtYmVyVmFsdWVQYWlyLm5hbWUpKTsKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWUgPSBnZXRBbm5vdGF0aW9uTWVtYmVyVmFsdWUobWVtYmVyVmFsdWVQYWlyLCBhc3RNZW1iZXJWYWx1ZVBhaXIudmFsdWUsIGxvY2FsVmFyQW5ub3RhdGlvbik7CisJCQkJbWVtYmVyVmFsdWVQYWlyc1tpXSA9IG1lbWJlclZhbHVlUGFpcjsKKwkJCX0KKwkJfQorCQlsb2NhbFZhckFubm90YXRpb24ubWVtYmVyVmFsdWVQYWlycyA9IG1lbWJlclZhbHVlUGFpcnM7CisJCXJldHVybiBsb2NhbFZhckFubm90YXRpb247CisJfQorCisJLyoKKwkgKiBDcmVhdGVzIHRoZSB2YWx1ZSB3cmFwcGVyIGZyb20gdGhlIGdpdmVuIGV4cHJlc3Npb24sIGFuZCBzZXRzIHRoZSB2YWx1ZUtpbmQgb24gdGhlIGdpdmVuIG1lbWJlclZhbHVlUGFpcgorCSAqLworCXByaXZhdGUgT2JqZWN0IGdldEFubm90YXRpb25NZW1iZXJWYWx1ZShNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIEphdmFFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIExpdGVyYWwpIHsKKwkJCSgoTGl0ZXJhbCkgZXhwcmVzc2lvbikuY29tcHV0ZUNvbnN0YW50KCk7CisJCQlyZXR1cm4gVXRpbC5nZXRBbm5vdGF0aW9uTWVtYmVyVmFsdWUobWVtYmVyVmFsdWVQYWlyLCBleHByZXNzaW9uLmNvbnN0YW50KTsKKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uKSB7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0FOTk9UQVRJT047CisJCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uKSBleHByZXNzaW9uLCBwYXJlbnRFbGVtZW50KTsKKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NMaXRlcmFsQWNjZXNzKSB7CisJCQlDbGFzc0xpdGVyYWxBY2Nlc3MgY2xhc3NMaXRlcmFsID0gKENsYXNzTGl0ZXJhbEFjY2VzcykgZXhwcmVzc2lvbjsKKwkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjbGFzc0xpdGVyYWwudHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpOworCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19DTEFTUzsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHR5cGVOYW1lKTsKKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQkJY2hhcltdIHF1YWxpZmllZE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBleHByZXNzaW9uKS50b2tlbnMsICcuJyk7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1FVQUxJRklFRF9OQU1FOworCQkJcmV0dXJuIG5ldyBTdHJpbmcocXVhbGlmaWVkTmFtZSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKKwkJCWNoYXJbXSBzaW1wbGVOYW1lID0gKChTaW5nbGVOYW1lUmVmZXJlbmNlKSBleHByZXNzaW9uKS50b2tlbjsKKwkJCWlmIChzaW1wbGVOYW1lID09IFJlY292ZXJ5U2Nhbm5lci5GQUtFX0lERU5USUZJRVIpIHsKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1NJTVBMRV9OQU1FOworCQkJcmV0dXJuIG5ldyBTdHJpbmcoc2ltcGxlTmFtZSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSAtMTsgLy8gbW9kaWZpZWQgYmVsb3cgYnkgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0TWVtYmVyVmFsdWUoLi4uKQorCQkJRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gKChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uKS5leHByZXNzaW9uczsKKwkJCWludCBsZW5ndGggPSBleHByZXNzaW9ucyA9PSBudWxsID8gMCA6IGV4cHJlc3Npb25zLmxlbmd0aDsKKwkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpbnQgcHJldmlvdXNWYWx1ZUtpbmQgPSBtZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kOworCQkJCU9iamVjdCB2YWx1ZSA9IGdldEFubm90YXRpb25NZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZVBhaXIsIGV4cHJlc3Npb25zW2ldLCBwYXJlbnRFbGVtZW50KTsKKwkJCQlpZiAocHJldmlvdXNWYWx1ZUtpbmQgIT0gLTEgJiYgbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCAhPSBwcmV2aW91c1ZhbHVlS2luZCkgeworCQkJCQkvLyB2YWx1ZXMgYXJlIGhldGVyb2dlbmVvdXMsIHZhbHVlIGtpbmQgaXMgdGh1cyB1bmtub3duCisJCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfVU5LTk9XTjsKKwkJCQl9CisJCQkJdmFsdWVzW2ldID0gdmFsdWU7CisJCQl9CisJCQlpZiAobWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9PSAtMSkKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQlyZXR1cm4gdmFsdWVzOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsJCQkvL3RvIGRlYWwgd2l0aCBuZWdhdGl2ZSBudW1lcmFscyAoc2VlIGJ1ZyAtIDI0ODMxMikKKwkJCVVuYXJ5RXhwcmVzc2lvbiB1bmFyeUV4cHJlc3Npb24gPSAoVW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uOworCQkJaWYgKCh1bmFyeUV4cHJlc3Npb24uYml0cyAmIEFTVE5vZGUuT3BlcmF0b3JNQVNLKSA+PiBBU1ROb2RlLk9wZXJhdG9yU0hJRlQgPT0gT3BlcmF0b3JJZHMuTUlOVVMpIHsKKwkJCQlpZiAodW5hcnlFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBMaXRlcmFsKSB7CisJCQkJCUxpdGVyYWwgc3ViRXhwcmVzc2lvbiA9IChMaXRlcmFsKSB1bmFyeUV4cHJlc3Npb24uZXhwcmVzc2lvbjsKKwkJCQkJc3ViRXhwcmVzc2lvbi5jb21wdXRlQ29uc3RhbnQoKTsKKwkJCQkJcmV0dXJuIFV0aWwuZ2V0TmVnYXRpdmVBbm5vdGF0aW9uTWVtYmVyVmFsdWUobWVtYmVyVmFsdWVQYWlyLCBzdWJFeHByZXNzaW9uLmNvbnN0YW50KTsKKwkJCQl9CisJCQl9CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfVU5LTk9XTjsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCiAJcHVibGljIElKYXZhRWxlbWVudCBnZXRIYW5kbGVGcm9tTWVtZW50byhTdHJpbmcgdG9rZW4sIE1lbWVudG9Ub2tlbml6ZXIgbWVtZW50bywgV29ya2luZ0NvcHlPd25lciBvd25lcikgewogCQlzd2l0Y2ggKHRva2VuLmNoYXJBdCgwKSkgewogCQkJY2FzZSBKRU1fQ09VTlQ6CkBAIC0xMDAsNyArMjUxLDExIEBACiAJCWJ1ZmYuYXBwZW5kKEpFTV9DT1VOVCk7CiAJCWJ1ZmYuYXBwZW5kKHRoaXMubmFtZUVuZCk7CiAJCWJ1ZmYuYXBwZW5kKEpFTV9DT1VOVCk7Ci0JCWJ1ZmYuYXBwZW5kKHRoaXMudHlwZVNpZ25hdHVyZSk7CisJCWVzY2FwZU1lbWVudG9OYW1lKGJ1ZmYsIHRoaXMudHlwZVNpZ25hdHVyZSk7CisJCWJ1ZmYuYXBwZW5kKEpFTV9DT1VOVCk7CisJCWJ1ZmYuYXBwZW5kKHRoaXMuZmxhZ3MpOworCQlidWZmLmFwcGVuZChKRU1fQ09VTlQpOworCQlidWZmLmFwcGVuZCh0aGlzLmlzUGFyYW1ldGVyKTsKIAkJaWYgKHRoaXMub2NjdXJyZW5jZUNvdW50ID4gMSkgewogCQkJYnVmZi5hcHBlbmQoSkVNX0NPVU5UKTsKIAkJCWJ1ZmYuYXBwZW5kKHRoaXMub2NjdXJyZW5jZUNvdW50KTsKQEAgLTExNSw2ICsyNzAsMTQgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIElNZW1iZXIgZ2V0RGVjbGFyaW5nTWVtYmVyKCkgeworCQlyZXR1cm4gKElNZW1iZXIpIHRoaXMucGFyZW50OworCX0KKwogCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLm5hbWU7CiAJfQpAQCAtMTIzLDE2ICsyODYsNzMgQEAKIAkJcmV0dXJuIExPQ0FMX1ZBUklBQkxFOwogCX0KIAorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIGludCBnZXRGbGFncygpIHsKKwkJaWYgKHRoaXMuZmxhZ3MgPT0gLTEpIHsKKwkJCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOworCQkJaWYgKG1hcHBlciAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAorCQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKTsKKwkJCQkJaWYgKGNsYXNzRmlsZSAhPSBudWxsKSB7CisJCQkJCQljbGFzc0ZpbGUuZ2V0QnVmZmVyKCk7CisJCQkJCQlyZXR1cm4gbWFwcGVyLmdldEZsYWdzKHRoaXMpOworCQkJCQl9CisJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gdGhpcy5mbGFncyAmIEV4dHJhQ29tcGlsZXJNb2RpZmllcnMuQWNjSnVzdEZsYWc7CisJfQorCisJLyoqCisJICogQHNlZSBJTWVtYmVyI2dldENsYXNzRmlsZSgpCisJICovCisJcHVibGljIElDbGFzc0ZpbGUgZ2V0Q2xhc3NGaWxlKCkgeworCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldFBhcmVudCgpOworCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKKwkJCWVsZW1lbnQ9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSB7CisJCQlyZXR1cm4gKElDbGFzc0ZpbGUpIGVsZW1lbnQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiBAc2luY2UgMy43CisJICovCiAJcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB7CisJCWlmICh0aGlzLm5hbWVFbmQgPT0gLTEpIHsKKwkJCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOworCQkJaWYgKG1hcHBlciAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAorCQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKTsKKwkJCQkJaWYgKGNsYXNzRmlsZSAhPSBudWxsKSB7CisJCQkJCQljbGFzc0ZpbGUuZ2V0QnVmZmVyKCk7CisJCQkJCQlyZXR1cm4gbWFwcGVyLmdldE5hbWVSYW5nZSh0aGlzKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQkJcmV0dXJuIFNvdXJjZU1hcHBlci5VTktOT1dOX1JBTkdFOworCQl9CiAJCXJldHVybiBuZXcgU291cmNlUmFuZ2UodGhpcy5uYW1lU3RhcnQsIHRoaXMubmFtZUVuZC10aGlzLm5hbWVTdGFydCsxKTsKIAl9Ci0JCisKIAlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKIAkJcmV0dXJuIHRoaXMucGFyZW50LmdldFBhdGgoKTsKIAl9CiAKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UmVzb3VyY2UoKTsKKwlwdWJsaWMgSVJlc291cmNlIHJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5wYXJlbnQucmVzb3VyY2UoKTsKIAl9CiAKIAkvKioKQEAgLTE1NiwxNCArMzc2LDM1IEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KLQkKKwogCS8qKgotCSAqIEBzZWUgSVNvdXJjZVJlZmVyZW5jZQorCSAqIHtAaW5oZXJpdERvY30KKwkgKiBAc2luY2UgMy43CiAJICovCi0JcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHsKKwlwdWJsaWMgSVNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmICh0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kID09IC0xKSB7CisJCQlTb3VyY2VNYXBwZXIgbWFwcGVyPSBnZXRTb3VyY2VNYXBwZXIoKTsKKwkJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJCS8vIGVuc3VyZSB0aGUgY2xhc3MgZmlsZSdzIGJ1ZmZlciBpcyBvcGVuIHNvIHRoYXQgc291cmNlIHJhbmdlcyBhcmUgY29tcHV0ZWQKKwkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKTsKKwkJCQlpZiAoY2xhc3NGaWxlICE9IG51bGwpIHsKKwkJCQkJY2xhc3NGaWxlLmdldEJ1ZmZlcigpOworCQkJCQlyZXR1cm4gbWFwcGVyLmdldFNvdXJjZVJhbmdlKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBTb3VyY2VNYXBwZXIuVU5LTk9XTl9SQU5HRTsKKwkJfQogCQlyZXR1cm4gbmV3IFNvdXJjZVJhbmdlKHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZC10aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQrMSk7CiAJfQotCQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwdWJsaWMgSVR5cGVSb290IGdldFR5cGVSb290KCkgeworCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRUeXBlUm9vdCgpOworCX0KKwogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZSgpIHsKIAkJcmV0dXJuIHRoaXMudHlwZVNpZ25hdHVyZTsKIAl9CkBAIC0xNzYsMTYgKzQxNywyNSBAQAogCQlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKHRoaXMucGFyZW50Lmhhc2hDb2RlKCksIHRoaXMubmFtZVN0YXJ0KTsKIAl9CiAJCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqIEBzaW5jZSAzLjcKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKwkJcmV0dXJuIHRoaXMuaXNQYXJhbWV0ZXI7CisJfQorCiAJcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3R1cmVLbm93bigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0JCisJCXJldHVybiB0cnVlOworCX0KKwogCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwogCQlpZiAoaW5mbyAhPSBOT19JTkZPKSB7Ci0JCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyh0aGlzLmdldFR5cGVTaWduYXR1cmUoKSkpOworCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcoZ2V0VHlwZVNpZ25hdHVyZSgpKSk7CiAJCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKaW5kZXggNGQ4MDU0ZS4uZDE3YmYxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsMjEgKzI3LDIxIEBACiAgKi8KIAogcHVibGljIGFic3RyYWN0IGNsYXNzIE1lbWJlciBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJTWVtYmVyIHsKLQkKKwogcHJvdGVjdGVkIE1lbWJlcihKYXZhRWxlbWVudCBwYXJlbnQpIHsKIAlzdXBlcihwYXJlbnQpOwogfQogcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGFyZVNpbWlsYXJNZXRob2RzKAotCVN0cmluZyBuYW1lMSwgU3RyaW5nW10gcGFyYW1zMSwgCisJU3RyaW5nIG5hbWUxLCBTdHJpbmdbXSBwYXJhbXMxLAogCVN0cmluZyBuYW1lMiwgU3RyaW5nW10gcGFyYW1zMiwKIAlTdHJpbmdbXSBzaW1wbGVOYW1lczEpIHsKLQkJCisKIAlpZiAobmFtZTEuZXF1YWxzKG5hbWUyKSkgewogCQlpbnQgcGFyYW1zMUxlbmd0aCA9IHBhcmFtczEubGVuZ3RoOwogCQlpZiAocGFyYW1zMUxlbmd0aCA9PSBwYXJhbXMyLmxlbmd0aCkgewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMxTGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgc2ltcGxlTmFtZTEgPSAKLQkJCQkJc2ltcGxlTmFtZXMxID09IG51bGwgPyAKKwkJCQlTdHJpbmcgc2ltcGxlTmFtZTEgPQorCQkJCQlzaW1wbGVOYW1lczEgPT0gbnVsbCA/CiAJCQkJCQlTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShTaWduYXR1cmUudG9TdHJpbmcoU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKHBhcmFtczFbaV0pKSkgOgogCQkJCQkJc2ltcGxlTmFtZXMxW2ldOwogCQkJCVN0cmluZyBzaW1wbGVOYW1lMiA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUocGFyYW1zMltpXSkpKTsKQEAgLTIxNSwxMiArMjE1LDIzIEBACiAJCQltZW1lbnRvLm5leHRUb2tlbigpOyAvLyBKRU1fQ09VTlQKIAkJCWlmICghbWVtZW50by5oYXNNb3JlVG9rZW5zKCkpIHJldHVybiB0aGlzOwogCQkJU3RyaW5nIHR5cGVTaWduYXR1cmUgPSBtZW1lbnRvLm5leHRUb2tlbigpOwotCQkJcmV0dXJuIG5ldyBMb2NhbFZhcmlhYmxlKHRoaXMsIHZhck5hbWUsIGRlY2xhcmF0aW9uU3RhcnQsIGRlY2xhcmF0aW9uRW5kLCBuYW1lU3RhcnQsIG5hbWVFbmQsIHR5cGVTaWduYXR1cmUpOworCQkJbWVtZW50by5uZXh0VG9rZW4oKTsgLy8gSkVNX0NPVU5UCisJCQlpZiAoIW1lbWVudG8uaGFzTW9yZVRva2VucygpKSByZXR1cm4gdGhpczsKKwkJCWludCBmbGFncyA9IEludGVnZXIucGFyc2VJbnQobWVtZW50by5uZXh0VG9rZW4oKSk7CisJCQltZW1lbnRvLm5leHRUb2tlbigpOyAvLyBKRU1fQ09VTlQKKwkJCWlmICghbWVtZW50by5oYXNNb3JlVG9rZW5zKCkpIHJldHVybiB0aGlzOworCQkJYm9vbGVhbiBpc1BhcmFtZXRlciA9IEJvb2xlYW4udmFsdWVPZihtZW1lbnRvLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKKwkJCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZSh0aGlzLCB2YXJOYW1lLCBkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZCwgbmFtZVN0YXJ0LCBuYW1lRW5kLCB0eXBlU2lnbmF0dXJlLCBudWxsLCBmbGFncywgaXNQYXJhbWV0ZXIpOwogCQljYXNlIEpFTV9UWVBFX1BBUkFNRVRFUjoKIAkJCWlmICghbWVtZW50by5oYXNNb3JlVG9rZW5zKCkpIHJldHVybiB0aGlzOwogCQkJU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lID0gbWVtZW50by5uZXh0VG9rZW4oKTsKIAkJCUphdmFFbGVtZW50IHR5cGVQYXJhbWV0ZXIgPSBuZXcgVHlwZVBhcmFtZXRlcih0aGlzLCB0eXBlUGFyYW1ldGVyTmFtZSk7CiAJCQlyZXR1cm4gdHlwZVBhcmFtZXRlci5nZXRIYW5kbGVGcm9tTWVtZW50byhtZW1lbnRvLCB3b3JraW5nQ29weU93bmVyKTsKKwkJY2FzZSBKRU1fQU5OT1RBVElPTjoKKwkJCWlmICghbWVtZW50by5oYXNNb3JlVG9rZW5zKCkpIHJldHVybiB0aGlzOworCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gbWVtZW50by5uZXh0VG9rZW4oKTsKKwkJCUphdmFFbGVtZW50IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbih0aGlzLCBhbm5vdGF0aW9uTmFtZSk7CisJCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRIYW5kbGVGcm9tTWVtZW50byhtZW1lbnRvLCB3b3JraW5nQ29weU93bmVyKTsKIAl9CiAJcmV0dXJuIG51bGw7CiB9CkBAIC0yNTIsMTkgKzI2MywxOSBAQAogCQkJCSAvLyB0aGVzZSBlbGVtZW50cyBjYW4gZGVmaW5lIGxvY2FsIG1lbWJlcnMKIAkJCQlsYXN0TG9jYWxDb250ZXh0ID0gKE1lbWJlcikgY3VycmVudDsKIAkJCQlicmVhazsKLQkJfQkJCisJCX0KIAkJY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7Ci0JfSAKKwl9CiAJcmV0dXJuIGxhc3RMb2NhbENvbnRleHQ7CiB9CiBwdWJsaWMgSVNvdXJjZVJhbmdlIGdldEphdmFkb2NSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlTb3VyY2VSYW5nZSByYW5nZT0gdGhpcy5nZXRTb3VyY2VSYW5nZSgpOworCUlTb3VyY2VSYW5nZSByYW5nZT0gZ2V0U291cmNlUmFuZ2UoKTsKIAlpZiAocmFuZ2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJSUJ1ZmZlciBidWY9IG51bGw7Ci0JaWYgKHRoaXMuaXNCaW5hcnkoKSkgewotCQlidWYgPSB0aGlzLmdldENsYXNzRmlsZSgpLmdldEJ1ZmZlcigpOworCWlmIChpc0JpbmFyeSgpKSB7CisJCWJ1ZiA9IGdldENsYXNzRmlsZSgpLmdldEJ1ZmZlcigpOwogCX0gZWxzZSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKIAkJaWYgKCFjb21waWxhdGlvblVuaXQuaXNDb25zaXN0ZW50KCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC0yNzQsMTEgKzI4NSwxMSBAQAogCWZpbmFsIGludCBsZW5ndGg9IHJhbmdlLmdldExlbmd0aCgpOwogCWlmIChsZW5ndGggPiAwICYmIGJ1Zi5nZXRDaGFyKHN0YXJ0KSA9PSAnLycpIHsKIAkJSVNjYW5uZXIgc2Nhbm5lcj0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcih0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2UoYnVmLmdldFRleHQoc3RhcnQsIGxlbmd0aCkudG9DaGFyQXJyYXkoKSk7CiAJCXRyeSB7CisJCQlzY2FubmVyLnNldFNvdXJjZShidWYuZ2V0VGV4dChzdGFydCwgbGVuZ3RoKS50b0NoYXJBcnJheSgpKTsKIAkJCWludCBkb2NPZmZzZXQ9IC0xOwogCQkJaW50IGRvY0VuZD0gLTE7Ci0JCQkKKwogCQkJaW50IHRlcm1pbmFsPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJbG9vcDogd2hpbGUgKHRydWUpIHsKIAkJCQlzd2l0Y2godGVybWluYWwpIHsKQEAgLTI5NiwxMCArMzA3LDEyIEBACiAJCQkJfQogCQkJfQogCQkJaWYgKGRvY09mZnNldCAhPSAtMSkgewotCQkJCXJldHVybiBuZXcgU291cmNlUmFuZ2UoZG9jT2Zmc2V0ICsgc3RhcnQsIGRvY0VuZCAtIGRvY09mZnNldCArIDEpOworCQkJCXJldHVybiBuZXcgU291cmNlUmFuZ2UoZG9jT2Zmc2V0ICsgc3RhcnQsIGRvY0VuZCAtIGRvY09mZnNldCk7CiAJCQl9CiAJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgewogCQkJLy8gdHJ5IGlmIHRoZXJlIGlzIGluaGVyaXRlZCBKYXZhZG9jCisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTAwMQogCQl9CiAJfQogCXJldHVybiBudWxsOwpAQCAtMzY3LDIyICszODAsMTAgQEAKIAkJU3RyaW5nIGRlY2xhcmluZ05hbWUgPSAoKEphdmFFbGVtZW50KSBnZXREZWNsYXJpbmdUeXBlKCkpLnJlYWRhYmxlTmFtZSgpOwogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihkZWNsYXJpbmdOYW1lKTsKIAkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gc3VwZXIucmVhZGFibGVOYW1lKCk7CiAJfQogfQotLyoqCi0gKiBVcGRhdGVzIHRoZSBuYW1lIHJhbmdlIGZvciB0aGlzIGVsZW1lbnQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVSYW5nZShpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgewotCXRyeSB7Ci0JCU1lbWJlckVsZW1lbnRJbmZvIGluZm8gPSAoTWVtYmVyRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7Ci0JCWluZm8uc2V0TmFtZVNvdXJjZVN0YXJ0KG5hbWVTdGFydCk7Ci0JCWluZm8uc2V0TmFtZVNvdXJjZUVuZChuYW1lRW5kKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCXJldHVybjsKLQl9Ci19CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyRWxlbWVudEluZm8uamF2YQppbmRleCAyNmVjMWEyLi4wOWZjNGNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01lbWJlckVsZW1lbnRJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsOCArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCi0vKiogCi0gKkVsZW1lbnQgaW5mbyBmb3IgSU1lbWJlciBlbGVtZW50cy4gCisvKioKKyAqRWxlbWVudCBpbmZvIGZvciBJTWVtYmVyIGVsZW1lbnRzLgogICovCiAvKiBwYWNrYWdlICovIGFic3RyYWN0IGNsYXNzIE1lbWJlckVsZW1lbnRJbmZvIGV4dGVuZHMgU291cmNlUmVmRWxlbWVudEluZm8gewogCS8qKgpAQCAtMjIsMTcgKzIyLDIyIEBACiAJcHJvdGVjdGVkIGludCBmbGFnczsKIAogCS8qKgotCSAqIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGlzIG1lbWJlcidzIG5hbWUgaW4gdGhlIGl0cwotCSAqIG9wZW5hYmxlJ3MgYnVmZmVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZSNnZXROYW1lU291cmNlRW5kKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZU1ldGhvZCNnZXROYW1lU291cmNlRW5kKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZUZpZWxkI2dldE5hbWVTb3VyY2VFbmQoKQogCSAqLwotCXByb3RlY3RlZCBpbnQgbmFtZVN0YXJ0PSAtMTsKLQorCXB1YmxpYyBpbnQgZ2V0TmFtZVNvdXJjZUVuZCgpIHsKKwkJcmV0dXJuIC0xOworCX0KIAkvKioKLQkgKiBUaGUgbGFzdCBwb3NpdGlvbiBvZiB0aGlzIG1lbWJlcidzIG5hbWUgaW4gdGhlIGl0cwotCSAqIG9wZW5hYmxlJ3MgYnVmZmVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZSNnZXROYW1lU291cmNlU3RhcnQoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldE5hbWVTb3VyY2VTdGFydCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZCNnZXROYW1lU291cmNlU3RhcnQoKQogCSAqLwotCXByb3RlY3RlZCBpbnQgbmFtZUVuZD0gLTE7Ci0KKwlwdWJsaWMgaW50IGdldE5hbWVTb3VyY2VTdGFydCgpIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNUeXBlI2dldE1vZGlmaWVycygpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklHZW5lcmljTWV0aG9kI2dldE1vZGlmaWVycygpCkBAIC00MSwzNyArNDYsNyBAQAogCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogCQlyZXR1cm4gdGhpcy5mbGFnczsKIAl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlI2dldE5hbWVTb3VyY2VFbmQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldE5hbWVTb3VyY2VFbmQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQjZ2V0TmFtZVNvdXJjZUVuZCgpCi0JICovCi0JcHVibGljIGludCBnZXROYW1lU291cmNlRW5kKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lRW5kOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGUjZ2V0TmFtZVNvdXJjZVN0YXJ0KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZU1ldGhvZCNnZXROYW1lU291cmNlU3RhcnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQjZ2V0TmFtZVNvdXJjZVN0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5hbWVTb3VyY2VTdGFydCgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVN0YXJ0OwotCX0KIAlwcm90ZWN0ZWQgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKIAkJdGhpcy5mbGFncyA9IGZsYWdzOwogCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoaXMgbWVtYmVyJ3MgbmFtZSwgcmVsYXRpdmUKLQkgKiB0byBpdHMgb3BlbmFibGUncyBzb3VyY2UgYnVmZmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVTb3VyY2VFbmQoaW50IGVuZCkgewotCQl0aGlzLm5hbWVFbmQ9IGVuZDsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBtZW1iZXIncyBuYW1lLCByZWxhdGl2ZQotCSAqIHRvIGl0cyBvcGVuYWJsZSdzIHNvdXJjZSBidWZmZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZVNvdXJjZVN0YXJ0KGludCBzdGFydCkgewotCQl0aGlzLm5hbWVTdGFydD0gc3RhcnQ7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyVmFsdWVQYWlyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJWYWx1ZVBhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZThmYzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyVmFsdWVQYWlyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CisKK3B1YmxpYyBjbGFzcyBNZW1iZXJWYWx1ZVBhaXIgaW1wbGVtZW50cyBJTWVtYmVyVmFsdWVQYWlyIHsKKworCVN0cmluZyBtZW1iZXJOYW1lOworCXB1YmxpYyBPYmplY3QgdmFsdWU7CisJcHVibGljIGludCB2YWx1ZUtpbmQgPSBLX1VOS05PV047CisKKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKFN0cmluZyBtZW1iZXJOYW1lKSB7CisJCXRoaXMubWVtYmVyTmFtZSA9IG1lbWJlck5hbWU7CisJfQorCisJcHVibGljIE1lbWJlclZhbHVlUGFpcihTdHJpbmcgbWVtYmVyTmFtZSwgT2JqZWN0IHZhbHVlLCBpbnQgdmFsdWVLaW5kKSB7CisJCXRoaXMobWVtYmVyTmFtZSk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy52YWx1ZUtpbmQgPSB2YWx1ZUtpbmQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKCEob2JqIGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCU1lbWJlclZhbHVlUGFpciBvdGhlciA9IChNZW1iZXJWYWx1ZVBhaXIpIG9iajsKKwkJcmV0dXJuCisJCQl0aGlzLnZhbHVlS2luZCA9PSBvdGhlci52YWx1ZUtpbmQKKwkJCSYmIHRoaXMubWVtYmVyTmFtZS5lcXVhbHMob3RoZXIubWVtYmVyTmFtZSkKKwkJCSYmICh0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlCisJCQkJfHwgKHRoaXMudmFsdWUgIT0gbnVsbCAmJiB0aGlzLnZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSkpCisJCQkJfHwgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSAmJiBvdGhlci52YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdICYmIFV0aWwuZXF1YWxBcnJheXNPck51bGwoKE9iamVjdFtdKXRoaXMudmFsdWUsIChPYmplY3RbXSkgb3RoZXIudmFsdWUpKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZW1iZXJOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5tZW1iZXJOYW1lOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyBpbnQgZ2V0VmFsdWVLaW5kKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUtpbmQ7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGhpcy5tZW1iZXJOYW1lID09IG51bGwpID8gMCA6IHRoaXMubWVtYmVyTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogdGhpcy52YWx1ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0aGlzLnZhbHVlS2luZDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb2RlbFVwZGF0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vZGVsVXBkYXRlci5qYXZhCmluZGV4IGQ5YzI4MzQuLjI5OTY1NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vZGVsVXBkYXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vZGVsVXBkYXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDE0ICsyNSwxNCBAQAogCUhhc2hTZXQgcHJvamVjdHNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0KCk7CiAKIAkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCBoYW5kbGUgdG8gaXRzIHBhcmVudCdzIGNhY2hlIG9mIGNoaWxkcmVuLiAKKwkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCBoYW5kbGUgdG8gaXRzIHBhcmVudCdzIGNhY2hlIG9mIGNoaWxkcmVuLgogCSAqLwogCXByb3RlY3RlZCB2b2lkIGFkZFRvUGFyZW50SW5mbyhPcGVuYWJsZSBjaGlsZCkgewogCiAJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKIAkJCXRyeSB7Ci0JCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKXBhcmVudC5nZXRFbGVtZW50SW5mbygpOworCQkJCU9wZW5hYmxlRWxlbWVudEluZm8gaW5mbyA9IChPcGVuYWJsZUVsZW1lbnRJbmZvKSBwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKIAkJCQlpbmZvLmFkZENoaWxkKGNoaWxkKTsKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gZG8gbm90aGluZyAtIHdlIGFscmVhZHkgY2hlY2tlZCBpZiBvcGVuCkBAIC03MiwxMyArNzIsMTMgQEAKIAkJfSBlbHNlIHsKIAkJCWFkZFRvUGFyZW50SW5mbyhlbGVtZW50KTsKIAotCQkJLy8gRm9yY2UgdGhlIGVsZW1lbnQgdG8gYmUgY2xvc2VkIGFzIGl0IG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQgCisJCQkvLyBGb3JjZSB0aGUgZWxlbWVudCB0byBiZSBjbG9zZWQgYXMgaXQgbWlnaHQgaGF2ZSBiZWVuIG9wZW5lZAogCQkJLy8gYmVmb3JlIHRoZSByZXNvdXJjZSBtb2RpZmljYXRpb24gY2FtZSBpbiBhbmQgaXQgbWlnaHQgaGF2ZSBhIG5ldyBjaGlsZAogCQkJLy8gRm9yIGV4YW1wbGUsIGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZToKIAkJCS8vIDEuIGNyZWF0ZSBhIHBhY2thZ2UgZnJhZ21lbnQgcCB1c2luZyBhIGphdmEgbW9kZWwgb3BlcmF0aW9uCiAJCQkvLyAyLiBvcGVuIHBhY2thZ2UgcAogCQkJLy8gMy4gYWRkIGZpbGUgWC5qYXZhIGluIGZvbGRlciBwCi0JCQkvLyBXaGVuIHRoZSByZXNvdXJjZSBkZWx0YSBjb21lcyBpbiwgb25seSB0aGUgYWRkaXRpb24gb2YgcCBpcyBub3RpZmllZCwgCisJCQkvLyBXaGVuIHRoZSByZXNvdXJjZSBkZWx0YSBjb21lcyBpbiwgb25seSB0aGUgYWRkaXRpb24gb2YgcCBpcyBub3RpZmllZCwKIAkJCS8vIGJ1dCB0aGUgcGFja2FnZSBwIGlzIGFscmVhZHkgb3BlbmVkLCB0aHVzIGl0cyBjaGlsZHJlbiBhcmUgbm90IHJlY29tcHV0ZWQKIAkJCS8vIGFuZCBpdCBhcHBlYXJzIGVtcHR5LgogCQkJY2xvc2UoZWxlbWVudCk7CkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogCiAJCXN3aXRjaCAoZWxlbWVudFR5cGUpIHsKIAkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLnJlc2V0KCk7CisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKS5yZXNldCgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKIAkJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQltYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKGphdmFQcm9qZWN0KTsKKwkJCQltYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKGphdmFQcm9qZWN0LCB0cnVlIC8qIHJlbW92ZSBleHRlcm5hbCBqYXIgZmlsZXMgaW5kZXhlcyBhbmQgdGltZXN0YW1wcyovKTsKIAkJCQltYW5hZ2VyLmNvbnRhaW5lclJlbW92ZShqYXZhUHJvamVjdCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgpAQCAtMTUwLDE5ICsxNTAsMTQgQEAKIAkgKiByZWxldmFudCA8Y29kZT5KYXZhTW9kZWw8L2NvZGU+cy4KIAkgKi8KIAlwdWJsaWMgdm9pZCBwcm9jZXNzSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0KLS8vCQlpZiAoRGVsdGFQcm9jZXNzb3IuVkVSQk9TRSl7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVVBEQVRJTkcgTW9kZWwgd2l0aCBEZWx0YTogWyIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiOiIgKyBkZWx0YSArICJdOiIpOwotLy8JCX0KLQogCQl0cnkgewotCQkJdGhpcy50cmF2ZXJzZURlbHRhKGRlbHRhLCBudWxsLCBudWxsKTsgLy8gdHJhdmVyc2UgZGVsdGEKKwkJCXRyYXZlcnNlRGVsdGEoZGVsdGEsIG51bGwsIG51bGwpOyAvLyB0cmF2ZXJzZSBkZWx0YQogCi0JCQkvLyB1cGRhdGUgcGFja2FnZSBmcmFnbWVudCByb290cyBvZiBwcm9qZWN0cyB0aGF0IHdlcmUgYWZmZWN0ZWQKKwkJCS8vIHJlc2V0IHByb2plY3QgY2FjaGVzIG9mIHByb2plY3RzIHRoYXQgd2VyZSBhZmZlY3RlZAogCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnByb2plY3RzVG9VcGRhdGUuaXRlcmF0b3IoKTsKIAkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKIAkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcHJvamVjdC51cGRhdGVQYWNrYWdlRnJhZ21lbnRSb290cygpOworCQkJCXByb2plY3QucmVzZXRDYWNoZXMoKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCXRoaXMucHJvamVjdHNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0KCk7CkBAIC0xNzIsMTQgKzE2NywxNCBAQAogCS8qKgogCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSBpdHMgcGFyZW50cyBjYWNoZSBvZiBjaGlsZHJlbi4gSWYgdGhlCiAJICogZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LCBvciB0aGUgcGFyZW50IGlzIG5vdCBjdXJyZW50bHkgb3BlbiwKLQkgKiB0aGlzIGhhcyBubyBlZmZlY3QuIAorCSAqIHRoaXMgaGFzIG5vIGVmZmVjdC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tUGFyZW50SW5mbyhPcGVuYWJsZSBjaGlsZCkgewogCiAJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKIAkJCXRyeSB7Ci0JCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKXBhcmVudC5nZXRFbGVtZW50SW5mbygpOworCQkJCU9wZW5hYmxlRWxlbWVudEluZm8gaW5mbyA9IChPcGVuYWJsZUVsZW1lbnRJbmZvKSBwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKIAkJCQlpbmZvLnJlbW92ZUNoaWxkKGNoaWxkKTsKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gZG8gbm90aGluZyAtIHdlIGFscmVhZHkgY2hlY2tlZCBpZiBvcGVuCkBAIC0yMTUsNiArMjEwLDcgQEAKIAkJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpICYmICFjdS5pc1ByaW1hcnkoKSkgewogCQkJCQlyZXR1cm47CiAJCQkJfQorCQkJCS8vICRGQUxMLVRIUk9VR0gkCiAJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKIAkJCQlwcm9jZXNzQ2hpbGRyZW4gPSBmYWxzZTsKIAkJCQlicmVhazsKQEAgLTIzNyw3ICsyMzMsNyBAQAogCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKIAkJCQlJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhID0gY2hpbGRyZW5baV07Ci0JCQkJdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkRGVsdGEsIHJvb3QsIHByb2plY3QpOworCQkJCXRyYXZlcnNlRGVsdGEoY2hpbGREZWx0YSwgcm9vdCwgcHJvamVjdCk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IGUxMjcxZDcuLjdhODkxMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM1LDcgKzM1LDcgQEAKICAqIGZvciBwcm9ncmVzcyBtb25pdG9yaW5nLgogICovCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKLQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX21vdmVFbGVtZW50UHJvZ3Jlc3M7IAorCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fbW92ZUVsZW1lbnRQcm9ncmVzczsKIH0KIC8qKgogICogQHNlZSBDb3B5RWxlbWVudHNPcGVyYXRpb24jaXNNb3ZlKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCmluZGV4IDVhYzcwYzAuLmZlMWM4ZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw3IEBACiAJICogSWYgYW4gZW50cnkgd2l0aCB0aGUgZGVzdGluYXRpb24gcGF0aCBhbHJlYWR5IGV4aXN0ZWQsIHJlbW92ZSBpdC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCByZW5hbWVFbnRyeUluQ2xhc3NwYXRoKElQYXRoIHJvb3RQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKKwogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwogCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBudWxsOwogCQlpbnQgY3BMZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOwpAQCAtNTYsMTIgKzU2LDEyIEBACiAJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoLCAwLCBpKTsKIAkJCQkJCW5ld0NQSW5kZXggPSBpOwogCQkJCQl9Ci0JCQkJCW5ld0NsYXNzcGF0aFtuZXdDUEluZGV4KytdID0gCisJCQkJCW5ld0NsYXNzcGF0aFtuZXdDUEluZGV4KytdID0KIAkJCQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KAotCQkJCQkJCWVudHJ5LmdldFBhdGgoKSwgCi0JCQkJCQkJbmV3SW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCA/IGVudHJ5LmdldEluY2x1c2lvblBhdHRlcm5zKCkgOiBuZXdJbmNsdXNpb25QYXR0ZXJucywgCi0JCQkJCQkJbmV3RXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCA/IGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkgOiBuZXdFeGNsdXNpb25QYXR0ZXJucywgCi0JCQkJCQkJZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSwgCisJCQkJCQkJZW50cnkuZ2V0UGF0aCgpLAorCQkJCQkJCW5ld0luY2x1c2lvblBhdHRlcm5zID09IG51bGwgPyBlbnRyeS5nZXRJbmNsdXNpb25QYXR0ZXJucygpIDogbmV3SW5jbHVzaW9uUGF0dGVybnMsCisJCQkJCQkJbmV3RXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCA/IGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkgOiBuZXdFeGNsdXNpb25QYXR0ZXJucywKKwkJCQkJCQllbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLAogCQkJCQkJCWVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpKTsKIAkJCQl9IGVsc2UgaWYgKG5ld0NsYXNzcGF0aCAhPSBudWxsKSB7CiAJCQkJCW5ld0NsYXNzcGF0aFtuZXdDUEluZGV4KytdID0gZW50cnk7CkBAIC03MCwxNCArNzAsMTQgQEAKIAkJCQluZXdDbGFzc3BhdGhbbmV3Q1BJbmRleCsrXSA9IGVudHJ5OwogCQkJfQogCQl9Ci0JCQorCiAJCWlmIChuZXdDbGFzc3BhdGggIT0gbnVsbCkgewogCQkJaWYgKG5ld0NQSW5kZXggPCBuZXdDbGFzc3BhdGgubGVuZ3RoKSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weShuZXdDbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q1BJbmRleF0sIDAsIG5ld0NQSW5kZXgpOwogCQkJfQogCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvamVjdCwgbmV3Q2xhc3NwYXRoLCBwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkpOwogCQkJaWYgKHN0YXR1cy5pc09LKCkpCi0JCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBwcm9ncmVzc01vbml0b3IpOworCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgdGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJLy8gZG9uJ3QgdXBkYXRlIGNsYXNzcGF0aCBpZiBzdGF0dXMgaXMgbm90IG9rIHRvIGF2b2lkIEphdmFNb2RlbEV4Y2VwdGlvbiAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk5OTEpCiAJCX0KIAl9CkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJaW50IHVwZGF0ZVJlc291cmNlRmxhZ3MsCiAJCWludCB1cGRhdGVNb2RlbEZsYWdzLAogCQlJQ2xhc3NwYXRoRW50cnkgc2libGluZykgewotCQkJCisKIAkJc3VwZXIoCiAJCQlyb290LAogCQkJZGVzdGluYXRpb24sCkBAIC0xMTcsMTYgKzExNywxNiBAQAogCQkJc2libGluZyk7CiAJfQogCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpdGhpcy5nZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0RWxlbWVudFRvUHJvY2VzcygpOwogCQlJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5ID0gcm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwogCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCisKIAkJLy8gbW92ZSByZXNvdXJjZQogCQlpZiAoIXJvb3QuaXNFeHRlcm5hbCgpICYmICh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5OT19SRVNPVVJDRV9NT0RJRklDQVRJT04pID09IDApIHsKIAkJCW1vdmVSZXNvdXJjZShyb290LCByb290RW50cnksIHdvcmtzcGFjZVJvb3QpOwogCQl9Ci0JCQorCiAJCS8vIHVwZGF0ZSByZWZlcmluZyBwcm9qZWN0cyBjbGFzc3BhdGggZXhjbHVkaW5nIG9yaWduYXRpbmcgcHJvamVjdAogCQlJSmF2YVByb2plY3Qgb3JpZ2luYXRpbmdQcm9qZWN0ID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpOwogCQlpZiAoKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEgpICE9IDApIHsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQkJCXJlbW92ZUVudHJ5RnJvbUNsYXNzcGF0aChyb290RW50cnkuZ2V0UGF0aCgpLCBvcmlnaW5hdGluZ1Byb2plY3QpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIHVwZGF0ZSBkZXN0aW5hdGlvbiBjbGFzc3BhdGgKIAkJaWYgKHVwZGF0ZURlc3RpbmF0aW9uKSB7CiAJCQlpZiAoIWlzUmVuYW1lIHx8ICF1cGRhdGVPcmlnaW5hdGluZykgewpAQCAtMTU4LDE3ICsxNTgsMTcgQEAKIAkJSUNsYXNzcGF0aEVudHJ5IHJvb3RFbnRyeSwKIAkJZmluYWwgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCkKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkKKwogCQlmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpcm9vdEVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7Ci0JCUlSZXNvdXJjZSByb290UmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCUlSZXNvdXJjZSByb290UmVzb3VyY2UgPSAoKEphdmFFbGVtZW50KSByb290KS5yZXNvdXJjZSgpOwogCQlpZiAocm9vdEVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIHx8IGV4Y2x1c2lvblBhdHRlcm5zID09IG51bGwpIHsKIAkJCXRyeSB7CiAJCQkJSVJlc291cmNlIGRlc3RSZXM7CiAJCQkJaWYgKCh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCiAJCQkJCQkmJiAoZGVzdFJlcyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcih0aGlzLmRlc3RpbmF0aW9uKSkgIT0gbnVsbCkgewotCQkJCQlkZXN0UmVzLmRlbGV0ZSh0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCWRlc3RSZXMuZGVsZXRlKHRoaXMudXBkYXRlUmVzb3VyY2VGbGFncywgdGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQkJCX0KLQkJCQlyb290UmVzb3VyY2UubW92ZSh0aGlzLmRlc3RpbmF0aW9uLCB0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJcm9vdFJlc291cmNlLm1vdmUodGhpcy5kZXN0aW5hdGlvbiwgdGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQkJfQpAQCAtMTg3LDMzICsxODcsMzMgQEAKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQkvLyBmb2xkZXIgY29udGFpbmluZyBuZXN0ZWQgc291cmNlIGZvbGRlcgogCQkJCQkJCQlJRm9sZGVyIGZvbGRlciA9IGRlc3RGb2xkZXIuZ2V0Rm9sZGVyKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKLQkJCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJCQlpZiAoKE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDAKIAkJCQkJCQkJCQkmJiBmb2xkZXIuZXhpc3RzKCkpIHsKIAkJCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJCQl9Ci0JCQkJCQkJCWZvbGRlci5jcmVhdGUodXBkYXRlUmVzb3VyY2VGbGFncywgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQkJCQkJZm9sZGVyLmNyZWF0ZShNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIHRydWUsIE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkvLyBzdWJ0cmVlIGRvZXNuJ3QgY29udGFpbiBhbnkgbmVzdGVkIHNvdXJjZSBmb2xkZXJzCi0JCQkJCQkJSVBhdGggZGVzdFBhdGggPSBkZXN0aW5hdGlvbi5hcHBlbmQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVNlZ21lbnRDb3VudCkpOworCQkJCQkJCUlQYXRoIGRlc3RQYXRoID0gTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy5kZXN0aW5hdGlvbi5hcHBlbmQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVNlZ21lbnRDb3VudCkpOwogCQkJCQkJCUlSZXNvdXJjZSBkZXN0UmVzOwotCQkJCQkJCWlmICgodXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDAKKwkJCQkJCQlpZiAoKE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDAKIAkJCQkJCQkJCSYmIChkZXN0UmVzID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGRlc3RQYXRoKSkgIT0gbnVsbCkgewotCQkJCQkJCQlkZXN0UmVzLmRlbGV0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJCQlkZXN0UmVzLmRlbGV0ZShNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJCQl9Ci0JCQkJCQkJcHJveHkucmVxdWVzdFJlc291cmNlKCkubW92ZShkZXN0UGF0aCwgdXBkYXRlUmVzb3VyY2VGbGFncywgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5tb3ZlKGRlc3RQYXRoLCBNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlJUGF0aCBwYXRoID0gcHJveHkucmVxdWVzdEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCBkZXN0UGF0aCA9IGRlc3RpbmF0aW9uLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlU2VnbWVudENvdW50KSk7CisJCQkJCQlJUGF0aCBkZXN0UGF0aCA9IE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLnRoaXMuZGVzdGluYXRpb24uYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKIAkJCQkJCUlSZXNvdXJjZSBkZXN0UmVzOwotCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJaWYgKChNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCiAJCQkJCQkJCSYmIChkZXN0UmVzID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGRlc3RQYXRoKSkgIT0gbnVsbCkgewotCQkJCQkJCWRlc3RSZXMuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQkJZGVzdFJlcy5kZWxldGUoTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJCQl9Ci0JCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5tb3ZlKGRlc3RQYXRoLCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJcHJveHkucmVxdWVzdFJlc291cmNlKCkubW92ZShkZXN0UGF0aCwgTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24udGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi50aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAkJCQl9CkBAIC0yMjQsMTMgKzIyNCwxMyBAQAogCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJCQl9CiAJCX0KLQkJc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCXNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7CiAJfQogCS8qCiAJICogUmVuYW1lcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZXF1YWwgdG8gdGhlIGdpdmVuIHBhdGggaW4gYWxsIEphdmEgcHJvamVjdHMuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVmZXJyaW5nUHJvamVjdENsYXNzcGF0aHMoSVBhdGggcm9vdFBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFNb2RlbCBtb2RlbCA9IHRoaXMuZ2V0SmF2YU1vZGVsKCk7CisJCUlKYXZhTW9kZWwgbW9kZWwgPSBnZXRKYXZhTW9kZWwoKTsKIAkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwpAQCAtMjQyLDEyICsyNDIsMTIgQEAKIAkgKiBSZW1vdmVzIHRoZSBjbGFzc3BhdGggZW50cnkgZXF1YWwgdG8gdGhlIGdpdmVuIHBhdGggZnJvbSB0aGUgZ2l2ZW4gcHJvamVjdCdzIGNsYXNzcGF0aC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbnRyeUZyb21DbGFzc3BhdGgoSVBhdGggcm9vdFBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKIAkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbnVsbDsKIAkJaW50IGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsKIAkJaW50IG5ld0NQSW5kZXggPSAtMTsKLQkJCisKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcExlbmd0aDsgaSsrKSB7CiAJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CiAJCQlpZiAocm9vdFBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKQEAgLTI2MCwxMiArMjYwLDEyIEBACiAJCQkJbmV3Q2xhc3NwYXRoW25ld0NQSW5kZXgrK10gPSBlbnRyeTsKIAkJCX0KIAkJfQotCQkKKwogCQlpZiAobmV3Q2xhc3NwYXRoICE9IG51bGwpIHsKIAkJCWlmIChuZXdDUEluZGV4IDwgbmV3Q2xhc3NwYXRoLmxlbmd0aCkgewogCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3Q2xhc3NwYXRoLCAwLCBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0NQSW5kZXhdLCAwLCBuZXdDUEluZGV4KTsKIAkJCX0KLQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgdGhpcy5wcm9ncmVzc01vbml0b3IpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggYmJjOTllNS4uYTU4ZDE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM0LDcgKzM0LDcgQEAKICAqIEBzZWUgTXVsdGlPcGVyYXRpb24KICAqLwogcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7Ci0JcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9tb3ZlUmVzb3VyY2VQcm9ncmVzczsgCisJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9tb3ZlUmVzb3VyY2VQcm9ncmVzczsKIH0KIC8qKgogICogQHNlZSBDb3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbiNpc01vdmUoKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTXVsdGlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL011bHRpT3BlcmF0aW9uLmphdmEKaW5kZXggNGVlZjgwNC4uMTg0ODAyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTXVsdGlPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NdWx0aU9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDE0ICsyNywxNCBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24gewogCS8qKgotCSAqIFRhYmxlIHNwZWNpZnlpbmcgaW5zZXJ0aW9uIHBvc2l0aW9ucyBmb3IgZWxlbWVudHMgYmVpbmcgCisJICogVGFibGUgc3BlY2lmeWluZyBpbnNlcnRpb24gcG9zaXRpb25zIGZvciBlbGVtZW50cyBiZWluZwogCSAqIGNvcGllZC9tb3ZlZC9yZW5hbWVkLiBLZXllZCBieSBlbGVtZW50cyBiZWluZyBwcm9jZXNzZWQsIGFuZAogCSAqIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgaW5zZXJ0aW9uIHBvaW50LgogCSAqIEBzZWUgI3Byb2Nlc3NFbGVtZW50cygpCiAJICovCiAJcHJvdGVjdGVkIE1hcCBpbnNlcnRCZWZvcmVFbGVtZW50cyA9IG5ldyBIYXNoTWFwKDEpOwogCS8qKgotCSAqIFRhYmxlIHNwZWNpZnlpbmcgdGhlIG5ldyBwYXJlbnQgZm9yIGVsZW1lbnRzIGJlaW5nIAorCSAqIFRhYmxlIHNwZWNpZnlpbmcgdGhlIG5ldyBwYXJlbnQgZm9yIGVsZW1lbnRzIGJlaW5nCiAJICogY29waWVkL21vdmVkL3JlbmFtZWQuCiAJICogS2V5ZWQgYnkgZWxlbWVudHMgYmVpbmcgcHJvY2Vzc2VkLCBhbmQKIAkgKiB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIGRlc3RpbmF0aW9uIHBhcmVudC4KQEAgLTcwLDcgKzcwLDcgQEAKIAkJCQl0aGlzLm5ld1BhcmVudHMucHV0KGVsZW1lbnRzVG9Qcm9jZXNzW2ldLCBwYXJlbnRFbGVtZW50c1swXSk7CiAJCQl9CiAJCX0KLQkKKwogCX0KIAkvKioKIAkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPgpAQCAtMTQwLDcgKzE0MCw3IEBACiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZW5hbWUoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb2Nlc3MgYSBnaXZlbiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+LgogCSAqLwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RGVzdGluYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsIHx8ICFkZXN0aW5hdGlvbi5leGlzdHMoKSkKIAkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgZGVzdGluYXRpb24pOwotCQkKKwogCQlpbnQgZGVzdFR5cGUgPSBkZXN0aW5hdGlvbi5nZXRFbGVtZW50VHlwZSgpOwogCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewogCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTiA6CkBAIC0yOTAsNyArMjkwLDcgQEAKIAkJCQlpc1ZhbGlkID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihuZXdOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CiAJCQkJYnJlYWs7CiAJCX0KLQkKKwogCQlpZiAoIWlzVmFsaWQpIHsKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSwgZWxlbWVudCwgbmV3TmFtZSkpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEKaW5kZXggNzNmMjMwOS4uZDA4ZGZmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZUxvb2t1cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gY29udHJpYnV0aW9uIGZvciBidWcgMzM3ODY4IC0gW2NvbXBpbGVyXVttb2RlbF0gaW5jb21wbGV0ZSBzdXBwb3J0IGZvciBwYWNrYWdlLWluZm8uamF2YSB3aGVuIHVzaW5nIFNlYXJjaGFibGVFbnZpcm9ubWVudAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCkBAIC0zMSw3ICszMiw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSZXN0cmljdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0VG9JbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZXM7CkBAIC0zOSw3ICs0Miw3IEBACiAKIC8qKgogICogQSA8Y29kZT5OYW1lTG9va3VwPC9jb2RlPiBwcm92aWRlcyBuYW1lIHJlc29sdXRpb24gd2l0aGluIGEgSmF2YSBwcm9qZWN0LgotICogVGhlIG5hbWUgbG9va3VwIGZhY2lsaXR5IHVzZXMgdGhlIHByb2plY3QncyBjbGFzc3BhdGggdG8gcHJpb3JpdGl6ZSB0aGUgCisgKiBUaGUgbmFtZSBsb29rdXAgZmFjaWxpdHkgdXNlcyB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aCB0byBwcmlvcml0aXplIHRoZQogICogb3JkZXIgaW4gd2hpY2ggcGFja2FnZSBmcmFnbWVudHMgYXJlIHNlYXJjaGVkIHdoZW4gcmVzb2x2aW5nIGEgbmFtZS4KICAqCiAgKiA8cD5OYW1lIGxvb2t1cCBvbmx5IHJldHVybnMgYSBoYW5kbGUgd2hlbiB0aGUgbmFtZWQgZWxlbWVudCBhY3R1YWxseQpAQCAtNzIsNyArNzUsNyBAQAogCQlwdWJsaWMgYm9vbGVhbiBpc0JldHRlcihBbnN3ZXIgb3RoZXJBbnN3ZXIpIHsKIAkJCWlmIChvdGhlckFuc3dlciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKIAkJCWlmICh0aGlzLnJlc3RyaWN0aW9uID09IG51bGwpIHJldHVybiB0cnVlOwotCQkJcmV0dXJuIG90aGVyQW5zd2VyLnJlc3RyaWN0aW9uICE9IG51bGwgCisJCQlyZXR1cm4gb3RoZXJBbnN3ZXIucmVzdHJpY3Rpb24gIT0gbnVsbAogCQkJCSYmIHRoaXMucmVzdHJpY3Rpb24uZ2V0UHJvYmxlbUlkKCkgPCBvdGhlckFuc3dlci5yZXN0cmljdGlvbi5nZXRQcm9ibGVtSWQoKTsKIAkJfQogCX0KQEAgLTg3LDcgKzkwLDcgQEAKIAkgKiBBY2NlcHQgZmxhZyBmb3Igc3BlY2lmeWluZyBpbnRlcmZhY2VzLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VQVF9JTlRFUkZBQ0VTID0gQVNUTm9kZS5CaXQzOwotCQorCiAJLyoqCiAJICogQWNjZXB0IGZsYWcgZm9yIHNwZWNpZnlpbmcgZW51bXMuCiAJICovCkBAIC05NywxNCArMTAwLDE0IEBACiAJICogQWNjZXB0IGZsYWcgZm9yIHNwZWNpZnlpbmcgYW5ub3RhdGlvbnMuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVBUX0FOTk9UQVRJT05TID0gQVNUTm9kZS5CaXQ1OwotCQorCiAJLyoKIAkgKiBBY2NlcHQgZmxhZyBmb3IgYWxsIGtpbmRzIG9mIHR5cGVzCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVBUX0FMTCA9IEFDQ0VQVF9DTEFTU0VTIHwgQUNDRVBUX0lOVEVSRkFDRVMgfCBBQ0NFUFRfRU5VTVMgfCBBQ0NFUFRfQU5OT1RBVElPTlM7CiAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwotCQorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVR5cGVbXSBOT19UWVBFUyA9IHt9OwogCiAJLyoqCkBAIC0xMTYsMjEgKzExOSwyMSBAQAogCiAJLyoqCiAJICogVGFibGUgdGhhdCBtYXBzIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgcGFja2FnZSBmcmFnbWVudCByb290cwotCSAqIHRoYXQgY29udGFpbiBzdWNoIGEgcGFja2FnZSBrbm93biBieSB0aGlzIG5hbWUgbG9va3VwIGZhY2lsaXR5LiAKLQkgKiBUbyBhbGxvdyA+IDEgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUsIHZhbHVlcyBhcmUgCi0JICogYXJyYXlzIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb3JkZXJlZCBhcyB0aGV5IGFwcGVhciBvbiB0aGUgCisJICogdGhhdCBjb250YWluIHN1Y2ggYSBwYWNrYWdlIGtub3duIGJ5IHRoaXMgbmFtZSBsb29rdXAgZmFjaWxpdHkuCisJICogVG8gYWxsb3cgPiAxIHBhY2thZ2UgZnJhZ21lbnQgd2l0aCB0aGUgc2FtZSBuYW1lLCB2YWx1ZXMgYXJlCisJICogYXJyYXlzIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb3JkZXJlZCBhcyB0aGV5IGFwcGVhciBvbiB0aGUKIAkgKiBjbGFzc3BhdGguCiAJICogTm90ZSBpZiB0aGUgbGlzdCBpcyBvZiBzaXplIDEsIHRoZW4gdGhlIElQYWNrYWdlRnJhZ21lbnRSb290IG9iamVjdAogCSAqIHJlcGxhY2VzIHRoZSBhcnJheS4KIAkgKi8KIAlwcm90ZWN0ZWQgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHBhY2thZ2VGcmFnbWVudHM7Ci0JCisKIAkvKioKIAkgKiBSZXZlcnNlIG1hcCBmcm9tIHJvb3QgcGF0aCB0byBjb3JyZXNwb25kaW5nIHJlc29sdmVkIENQIGVudHJ5CiAJICogKHNvIGFzIHRvIGJlIGFibGUgdG8gZmlndXJlIGluY2x1c2lvbi9leGNsdXNpb24gcnVsZXMpCiAJICovCiAJcHJvdGVjdGVkIE1hcCByb290VG9SZXNvbHZlZEVudHJpZXM7Ci0JCisKIAkvKioKIAkgKiBBIG1hcCBmcm9tIHBhY2thZ2UgaGFuZGxlcyB0byBhIG1hcCBmcm9tIHR5cGUgbmFtZSB0byBhbiBJVHlwZSBvciBhbiBJVHlwZVtdLgogCSAqIEFsbG93cyB3b3JraW5nIGNvcGllcyB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb21waWxhdGlvbiB1bml0cy4KQEAgLTE0MSw5ICsxNDQsOSBAQAogCXB1YmxpYyBsb25nIHRpbWVTcGVudEluU2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlID0gMDsKIAogCXB1YmxpYyBOYW1lTG9va3VwKAotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cywgCi0JCQlIYXNodGFibGVPZkFycmF5VG9PYmplY3QgcGFja2FnZUZyYWdtZW50cywgCi0JCQlJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcywgCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzLAorCQkJSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHBhY2thZ2VGcmFnbWVudHMsCisJCQlJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcywKIAkJCU1hcCByb290VG9SZXNvbHZlZEVudHJpZXMpIHsKIAkJbG9uZyBzdGFydCA9IC0xOwogCQlpZiAoVkVSQk9TRSkgewpAQCAtMTY0LDkgKzE2NywxNyBAQAogCQkJCS8vIGlnbm9yZSAoaW1wbGVtZW50YXRpb24gb2YgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHN1cHBvcnRzIGNsb25pbmcpCiAJCQl9CiAJCQl0aGlzLnR5cGVzSW5Xb3JraW5nQ29waWVzID0gbmV3IEhhc2hNYXAoKTsKKwkJCUhhc2h0YWJsZU9mT2JqZWN0VG9JbnQgcm9vdFBvc2l0aW9ucyA9IG5ldyBIYXNodGFibGVPZk9iamVjdFRvSW50KCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFja2FnZUZyYWdtZW50Um9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlyb290UG9zaXRpb25zLnB1dChwYWNrYWdlRnJhZ21lbnRSb290c1tpXSwgaSk7CisJCQl9CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gd29ya2luZ0NvcGllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSB3b3JraW5nQ29waWVzW2ldOwogCQkJCVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoUGFja2FnZUZyYWdtZW50KSB3b3JraW5nQ29weS5nZXRQYXJlbnQoKTsKKwkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBwa2cuZ2V0UGFyZW50KCk7CisJCQkJaW50IHJvb3RQb3NpdGlvbiA9IHJvb3RQb3NpdGlvbnMuZ2V0KHJvb3QpOworCQkJCWlmIChyb290UG9zaXRpb24gPT0gLTEpCisJCQkJCWNvbnRpbnVlOyAvLyB3b3JraW5nIGNvcHkgaXMgbm90IHZpc2libGUgZnJvbSB0aGlzIHByb2plY3QgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5OTcwKQogCQkJCUhhc2hNYXAgdHlwZU1hcCA9IChIYXNoTWFwKSB0aGlzLnR5cGVzSW5Xb3JraW5nQ29waWVzLmdldChwa2cpOwogCQkJCWlmICh0eXBlTWFwID09IG51bGwpIHsKIAkJCQkJdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7CkBAIC0xOTksOSArMjEwLDggQEAKIAkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCQkvLyB3b3JraW5nIGNvcHkgZG9lc24ndCBleGlzdCAtPiBpZ25vcmUKIAkJCQl9Ci0JCQkJCisKIAkJCQkvLyBhZGQgcm9vdCBvZiBwYWNrYWdlIGZyYWdtZW50IHRvIGNhY2hlCi0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGtnLmdldFBhcmVudCgpOwogCQkJCVN0cmluZ1tdIHBrZ05hbWUgPSBwa2cubmFtZXM7CiAJCQkJT2JqZWN0IGV4aXN0aW5nID0gdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmdldChwa2dOYW1lKTsKIAkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCB8fCBleGlzdGluZyA9PSBKYXZhUHJvamVjdEVsZW1lbnRJbmZvLk5PX1JPT1RTKSB7CkBAIC0yMTEsMjggKzIyMSw0NSBAQAogCQkJCQlKYXZhUHJvamVjdEVsZW1lbnRJbmZvLmFkZFN1cGVyUGFja2FnZU5hbWVzKHBrZ05hbWUsIHRoaXMucGFja2FnZUZyYWdtZW50cyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQkJaWYgKCFleGlzdGluZy5lcXVhbHMocm9vdCkpCi0JCQkJCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzLnB1dChwa2dOYW1lLCBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSB7KFBhY2thZ2VGcmFnbWVudFJvb3QpIGV4aXN0aW5nLCByb290fSk7CisJCQkJCQlpbnQgZXhpc2l0aW5nUG9zaXRpb24gPSByb290UG9zaXRpb25zLmdldChleGlzdGluZyk7CisJCQkJCQlpZiAocm9vdFBvc2l0aW9uICE9IGV4aXNpdGluZ1Bvc2l0aW9uKSB7IC8vIGlmIG5vdCBlcXVhbAorCQkJCQkJCXRoaXMucGFja2FnZUZyYWdtZW50cy5wdXQoCisJCQkJCQkJCXBrZ05hbWUsCisJCQkJCQkJCWV4aXNpdGluZ1Bvc2l0aW9uIDwgcm9vdFBvc2l0aW9uID8KKwkJCQkJCQkJCW5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHsoUGFja2FnZUZyYWdtZW50Um9vdCkgZXhpc3RpbmcsIHJvb3R9IDoKKwkJCQkJCQkJCW5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHtyb290LCAoUGFja2FnZUZyYWdtZW50Um9vdCkgZXhpc3Rpbmd9KTsKKwkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGluc2VydCByb290IGluIHRoZSBleGlzdGluZyBsaXN0CiAJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gKElQYWNrYWdlRnJhZ21lbnRSb290W10pIGV4aXN0aW5nOwogCQkJCQkJaW50IHJvb3RMZW5ndGggPSByb290cy5sZW5ndGg7Ci0JCQkJCQlib29sZWFuIGNvbnRhaW5zUm9vdCA9IGZhbHNlOworCQkJCQkJaW50IGluc2VydGlvbkluZGV4ID0gMDsKIAkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdExlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKHJvb3RzW2pdLmVxdWFscyhyb290KSkgewotCQkJCQkJCQljb250YWluc1Jvb3QgPSB0cnVlOworCQkJCQkJCWludCBleGlzdGluZ1Bvc2l0aW9uID0gcm9vdFBvc2l0aW9ucy5nZXQocm9vdHNbal0pOworCQkJCQkJCWlmIChyb290UG9zaXRpb24gPiBleGlzdGluZ1Bvc2l0aW9uKSB7CisJCQkJCQkJCS8vIHJvb3QgaXMgYWZ0ZXIgdGhpcyBpbmRleAorCQkJCQkJCQlpbnNlcnRpb25JbmRleCA9IGo7CisJCQkJCQkJfSBlbHNlIGlmIChyb290UG9zaXRpb24gPT0gZXhpc3RpbmdQb3NpdGlvbikgeworCQkJCQkJCQkgLy8gcm9vdCBhbHJlYWR5IGluIHRoZSBleGlzdGluZyBsaXN0CisJCQkJCQkJCWluc2VydGlvbkluZGV4ID0gLTE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSBpZiAocm9vdFBvc2l0aW9uIDwgZXhpc3RpbmdQb3NpdGlvbikgeworCQkJCQkJCQkvLyByb290IGlzIGJlZm9yZSB0aGlzIGluZGV4ICh0aHVzIGl0IGlzIGF0IHRoZSBpbnNlcnRpb24gaW5kZXgpCiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJCWlmIChjb250YWluc1Jvb3QpIHsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJvb3RzLCAwLCByb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtyb290TGVuZ3RoKzFdLCAwLCByb290TGVuZ3RoKTsKLQkJCQkJCQlyb290c1tyb290TGVuZ3RoXSA9IHJvb3Q7Ci0JCQkJCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzLnB1dChwa2dOYW1lLCByb290cyk7CisJCQkJCQlpZiAoaW5zZXJ0aW9uSW5kZXggIT0gLTEpIHsKKwkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG5ld1Jvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W3Jvb3RMZW5ndGgrMV07CisJCQkJCQkJU3lzdGVtLmFycmF5Y29weShyb290cywgMCwgbmV3Um9vdHMsIDAsIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCQluZXdSb290c1tpbnNlcnRpb25JbmRleF0gPSByb290OworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocm9vdHMsIGluc2VydGlvbkluZGV4LCBuZXdSb290cywgaW5zZXJ0aW9uSW5kZXgrMSwgcm9vdExlbmd0aC1pbnNlcnRpb25JbmRleCk7CisJCQkJCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzLnB1dChwa2dOYW1lLCBuZXdSb290cyk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJCisKIAkJdGhpcy5yb290VG9SZXNvbHZlZEVudHJpZXMgPSByb290VG9SZXNvbHZlZEVudHJpZXM7CiAgICAgICAgIGlmIChWRVJCT1NFKSB7CiAgICAgICAgICAgICBVdGlsLnZlcmJvc2UoIiAtPiBzcGVudDogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0yNDgsNyArMjc1LDcgQEAKIAkgKiAgPGxpPm5laXRoZXIgdGhlIDxjb2RlPkFDQ0VQVF9DTEFTU0VTPC9jb2RlPiBvciA8Y29kZT5BQ0NFUFRfSU5URVJGQUNFUzwvY29kZT4KIAkgKiAgICAgIGJpdCBpcyBvbgogCSAqICA8L3VsPgotCSAqIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQuIAorCSAqIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQuCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0VHlwZShJVHlwZSB0eXBlLCBpbnQgYWNjZXB0RmxhZ3MsIGJvb2xlYW4gaXNTb3VyY2VUeXBlKSB7CiAJCWlmIChhY2NlcHRGbGFncyA9PSAwIHx8IGFjY2VwdEZsYWdzID09IEFDQ0VQVF9BTEwpCkBAIC0zMjUsOCArMzUyLDExIEBACiAJCWlmIChpbmRleCAhPSAtMSkgewogCQkJY3VOYW1lPSBjdU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKIAkJfQotCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMuZ2V0KHBrZ05hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQlpbnQgcGtnSW5kZXggPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMuZ2V0SW5kZXgocGtnTmFtZSk7CisJCWlmIChwa2dJbmRleCAhPSAtMSkgeworCQkJT2JqZWN0IHZhbHVlID0gdGhpcy5wYWNrYWdlRnJhZ21lbnRzLnZhbHVlVGFibGVbcGtnSW5kZXhdOworCQkJLy8gcmV1c2UgZXhpc3RpbmcgU3RyaW5nW10KKwkJCXBrZ05hbWUgPSAoU3RyaW5nW10pIHRoaXMucGFja2FnZUZyYWdtZW50cy5rZXlUYWJsZVtwa2dJbmRleF07CiAJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnRSb290KSB7CiAJCQkJcmV0dXJuIGZpbmRDb21waWxhdGlvblVuaXQocGtnTmFtZSwgY3VOYW1lLCAoUGFja2FnZUZyYWdtZW50Um9vdCkgdmFsdWUpOwogCQkJfSBlbHNlIHsKQEAgLTM0MSw3ICszNzEsNyBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBmaW5kQ29tcGlsYXRpb25Vbml0KFN0cmluZ1tdIHBrZ05hbWUsIFN0cmluZyBjdU5hbWUsIFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgewogCQlpZiAoIXJvb3QuaXNBcmNoaXZlKCkpIHsKIAkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7CkBAIC0zNTksNyArMzg5LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIH0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgd2hvc2UgcGF0aCBtYXRjaGVzIHRoZSBnaXZlbgogCSAqIChhYnNvbHV0ZSkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdC4gVGhlIGRvbWFpbiBvZgpAQCAtMzcxLDEyICs0MDEsMTIgQEAKIAkgKi8KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50KElQYXRoIHBhdGgpIHsKIAkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5wYXRoX211c3RCZUFic29sdXRlKTsgCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLnBhdGhfbXVzdEJlQWJzb2x1dGUpOwogCQl9CiAvKgogICogVE9ETyAoamVyb21lKSB0aGlzIGNvZGUgc2hvdWxkIHJhdGhlciB1c2UgdGhlIHBhY2thZ2UgZnJhZ21lbnQgbWFwIHRvIGZpbmQgdGhlIGNhbmRpZGF0ZSBwYWNrYWdlLCB0aGVuCiAgKiBjaGVjayBpZiB0aGUgcmVzcGVjdGl2ZSBlbmNsb3Npbmcgcm9vdCBtYXBzIHRvIHRoZSBvbmUgb24gdGhpcyBnaXZlbiBJUGF0aC4KLSAqLwkJCisgKi8KIAkJSVJlc291cmNlIHBvc3NpYmxlRnJhZ21lbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7CiAJCWlmIChwb3NzaWJsZUZyYWdtZW50ID09IG51bGwpIHsKIAkJCS8vZXh0ZXJuYWwgamFyCkBAIC0zODYsOCArNDE2LDcgQEAKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCUlQYXRoIHJvb3RQYXRoID0gcm9vdC5nZXRQYXRoKCk7Ci0JCQkJaW50IG1hdGNoaW5nQ291bnQgPSByb290UGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocGF0aCk7Ci0JCQkJaWYgKG1hdGNoaW5nQ291bnQgIT0gMCkgeworCQkJCWlmIChyb290UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7CiAJCQkJCVN0cmluZyBuYW1lID0gcGF0aC50b09TU3RyaW5nKCk7CiAJCQkJCS8vICsgMSBpcyBmb3IgdGhlIEZpbGUuc2VwYXJhdG9yQ2hhcgogCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcocm9vdFBhdGgudG9PU1N0cmluZygpLmxlbmd0aCgpICsgMSwgbmFtZS5sZW5ndGgoKSk7CkBAIC00ODAsMTggKzUwOSwyMCBAQAogCSAqCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgogCSAqLwogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50W10gZmluZFBhY2thZ2VGcmFnbWVudHMoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcGFydGlhbE1hdGNoLCBib29sZWFuIHBhdHRlcm5NYXRjaCkgewotCQlib29sZWFuIGhhc1BhdHRlcm5DaGFycyA9IHBhdHRlcm5NYXRjaCAmJiAobmFtZS5pbmRleE9mKCcqJykgPj0gMCB8fCBuYW1lLmluZGV4T2YoJz8nKSA+PSAwKTsKKwkJYm9vbGVhbiBpc1N0YXJQYXR0ZXJuID0gbmFtZS5lcXVhbHMoIioiKTsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIGhhc1BhdHRlcm5DaGFycyA9IGlzU3RhclBhdHRlcm4gfHwgKHBhdHRlcm5NYXRjaCAmJiAobmFtZS5pbmRleE9mKCcqJykgPj0gMCB8fCBuYW1lLmluZGV4T2YoJz8nKSA+PSAwKSk7CiAJCWlmIChwYXJ0aWFsTWF0Y2ggfHwgaGFzUGF0dGVybkNoYXJzKSB7CiAJCQlTdHJpbmdbXSBzcGxpdHRlZE5hbWUgPSBVdGlsLnNwbGl0T24oJy4nLCBuYW1lLCAwLCBuYW1lLmxlbmd0aCgpKTsKIAkJCUlQYWNrYWdlRnJhZ21lbnRbXSBvbmVGcmFnbWVudCA9IG51bGw7CiAJCQlBcnJheUxpc3QgcGtncyA9IG51bGw7CisJCQljaGFyW10gbG93ZXJjYXNlTmFtZSA9IGhhc1BhdHRlcm5DaGFycyAmJiAhaXNTdGFyUGF0dGVybiA/IG5hbWUudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpIDogbnVsbDsKIAkJCU9iamVjdFtdW10ga2V5cyA9IHRoaXMucGFja2FnZUZyYWdtZW50cy5rZXlUYWJsZTsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJU3RyaW5nW10gcGtnTmFtZSA9IChTdHJpbmdbXSkga2V5c1tpXTsKIAkJCQlpZiAocGtnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gbWF0Y2ggPSBoYXNQYXR0ZXJuQ2hhcnMKLQkJCQkJCT8gVXRpbC5tYXRjaGVzV2l0aElnbm9yZUNhc2UocGtnTmFtZSwgbmFtZSkKLQkJCQkJCTogVXRpbC5zdGFydHNXaXRoSWdub3JlQ2FzZShwa2dOYW1lLCBzcGxpdHRlZE5hbWUsIHBhcnRpYWxNYXRjaCk7CisJCQkJCWJvb2xlYW4gbWF0Y2ggPSBpc1N0YXJQYXR0ZXJuIHx8IChoYXNQYXR0ZXJuQ2hhcnMKKwkJCQkJCT8gQ2hhck9wZXJhdGlvbi5tYXRjaChsb3dlcmNhc2VOYW1lLCBVdGlsLmNvbmNhdENvbXBvdW5kTmFtZVRvQ2hhckFycmF5KHBrZ05hbWUpLCBmYWxzZSkKKwkJCQkJCTogVXRpbC5zdGFydHNXaXRoSWdub3JlQ2FzZShwa2dOYW1lLCBzcGxpdHRlZE5hbWUsIHBhcnRpYWxNYXRjaCkpOwogCQkJCQlpZiAobWF0Y2gpIHsKIAkJCQkJCU9iamVjdCB2YWx1ZSA9IHRoaXMucGFja2FnZUZyYWdtZW50cy52YWx1ZVRhYmxlW2ldOwogCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFja2FnZUZyYWdtZW50Um9vdCkgewpAQCAtNTMxLDE2ICs1NjIsMTkgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0gZWxzZSB7CiAJCQlTdHJpbmdbXSBzcGxpdHRlZE5hbWUgPSBVdGlsLnNwbGl0T24oJy4nLCBuYW1lLCAwLCBuYW1lLmxlbmd0aCgpKTsKLQkJCU9iamVjdCB2YWx1ZSA9IHRoaXMucGFja2FnZUZyYWdtZW50cy5nZXQoc3BsaXR0ZWROYW1lKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJaW50IHBrZ0luZGV4ID0gdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmdldEluZGV4KHNwbGl0dGVkTmFtZSk7CisJCQlpZiAocGtnSW5kZXggPT0gLTEpCiAJCQkJcmV0dXJuIG51bGw7CisJCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMudmFsdWVUYWJsZVtwa2dJbmRleF07CisJCQkvLyByZXVzZSBleGlzdGluZyBTdHJpbmdbXQorCQkJU3RyaW5nW10gcGtnTmFtZSA9IChTdHJpbmdbXSkgdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmtleVRhYmxlW3BrZ0luZGV4XTsKIAkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlyZXR1cm4gbmV3IElQYWNrYWdlRnJhZ21lbnRbXSB7KChQYWNrYWdlRnJhZ21lbnRSb290KSB2YWx1ZSkuZ2V0UGFja2FnZUZyYWdtZW50KHNwbGl0dGVkTmFtZSl9OworCQkJCXJldHVybiBuZXcgSVBhY2thZ2VGcmFnbWVudFtdIHsoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHZhbHVlKS5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSl9OwogCQkJfSBlbHNlIHsKIAkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gKElQYWNrYWdlRnJhZ21lbnRSb290W10pIHZhbHVlOwogCQkJCUlQYWNrYWdlRnJhZ21lbnRbXSByZXN1bHQgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFtyb290cy5sZW5ndGhdOwogCQkJCWZvciAoaW50IGk9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJCQlyZXN1bHRbaV0gPSAoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHJvb3RzW2ldKS5nZXRQYWNrYWdlRnJhZ21lbnQoc3BsaXR0ZWROYW1lKTsKKwkJCQkJcmVzdWx0W2ldID0gKChQYWNrYWdlRnJhZ21lbnRSb290KSByb290c1tpXSkuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOwogCQkJCX0KIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtNTUxLDEyICs1ODUsNiBAQAogCSAqIEZpbmQgc2Vjb25kYXJ5IHR5cGUgZm9yIGEgcHJvamVjdC4KIAkgKi8KIAlwcml2YXRlIElUeXBlIGZpbmRTZWNvbmRhcnlUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lLCBJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiB3YWl0Rm9ySW5kZXhlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKLQkJCVV0aWwudmVyYm9zZSgiTmFtZUxvb2t1cCBGSU5EIFNFQ09OREFSWSBUWVBFUzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJVXRpbC52ZXJib3NlKCIgLT4gcGtnIG5hbWU6ICIgKyBwYWNrYWdlTmFtZSk7ICAvLyROT04tTkxTLTEkCi0JCQlVdGlsLnZlcmJvc2UoIiAtPiB0eXBlIG5hbWU6ICIgKyB0eXBlTmFtZSk7ICAvLyROT04tTkxTLTEkCi0JCQlVdGlsLnZlcmJvc2UoIiAtPiBwcm9qZWN0OiAiK3Byb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJdHJ5IHsKIAkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHByb2plY3Q7CkBAIC01NjcsNiArNTk1LDEwIEBACiAJCQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIHR5cGVzLmdldCh0eXBlTmFtZSk7CiAJCQkJCWlmICh0eXBlICE9IG51bGwpIHsKIAkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKKwkJCQkJCQlVdGlsLnZlcmJvc2UoIk5hbWVMb29rdXAgRklORCBTRUNPTkRBUlkgVFlQRVM6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlVdGlsLnZlcmJvc2UoIiAtPiBwa2cgbmFtZTogIiArIHBhY2thZ2VOYW1lKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlVdGlsLnZlcmJvc2UoIiAtPiB0eXBlIG5hbWU6ICIgKyB0eXBlTmFtZSk7ICAvLyROT04tTkxTLTEkCisJCQkJCQkJVXRpbC52ZXJib3NlKCIgLT4gcHJvamVjdDogIitwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJVXRpbC52ZXJib3NlKCIgLT4gdHlwZTogIiArIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7ICAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gdHlwZTsKQEAgLTYwMCwxMiArNjMyLDEyIEBACiAJICogRmluZCB0eXBlLiBDb25zaWRlcmluZyBzZWNvbmRhcnkgdHlwZXMgYW5kIHdhaXRpbmcgZm9yIGluZGV4ZXMgZGVwZW5kcyBvbiBnaXZlbiBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuCiAJICovCiAJcHVibGljIEFuc3dlciBmaW5kVHlwZSgKLQkJCVN0cmluZyB0eXBlTmFtZSwgCi0JCQlTdHJpbmcgcGFja2FnZU5hbWUsIAotCQkJYm9vbGVhbiBwYXJ0aWFsTWF0Y2gsIAotCQkJaW50IGFjY2VwdEZsYWdzLCAKLQkJCWJvb2xlYW4gY29uc2lkZXJTZWNvbmRhcnlUeXBlcywgCi0JCQlib29sZWFuIHdhaXRGb3JJbmRleGVzLCAKKwkJCVN0cmluZyB0eXBlTmFtZSwKKwkJCVN0cmluZyBwYWNrYWdlTmFtZSwKKwkJCWJvb2xlYW4gcGFydGlhbE1hdGNoLAorCQkJaW50IGFjY2VwdEZsYWdzLAorCQkJYm9vbGVhbiBjb25zaWRlclNlY29uZGFyeVR5cGVzLAorCQkJYm9vbGVhbiB3YWl0Rm9ySW5kZXhlcywKIAkJCWJvb2xlYW4gY2hlY2tSZXN0cmljdGlvbnMsCiAJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewpAQCAtNjkyLDcgKzcyNCw3IEBACiAJICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZSB3aG9zZSBuYW1lCiAJICogbWF0Y2hlcyB0aGUgZ2l2ZW4gKHVucXVhbGlmaWVkKSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogZXhpc3QuIFNwZWNpZnlpbmcgYSA8Y29kZT5udWxsPC9jb2RlPiBwYWNrYWdlIHdpbGwgcmVzdWx0IGluIG5vIG1hdGNoZXMuCi0JICogVGhlIGRvbWFpbiBvZiB0aGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIEphdmEgcHJvamVjdCBmcm9tIHdoaWNoIAorCSAqIFRoZSBkb21haW4gb2YgdGhlIHNlYXJjaCBpcyBib3VuZGVkIGJ5IHRoZSBKYXZhIHByb2plY3QgZnJvbSB3aGljaAogCSAqIHRoaXMgbmFtZSBsb29rdXAgd2FzIG9idGFpbmVkLgogCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gZmluZApAQCAtNzIxLDcgKzc1Myw3IEBACiAJICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZSB3aG9zZSBuYW1lCiAJICogbWF0Y2hlcyB0aGUgZ2l2ZW4gKHVucXVhbGlmaWVkKSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICogZXhpc3QuIFNwZWNpZnlpbmcgYSA8Y29kZT5udWxsPC9jb2RlPiBwYWNrYWdlIHdpbGwgcmVzdWx0IGluIG5vIG1hdGNoZXMuCi0JICogVGhlIGRvbWFpbiBvZiB0aGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIEphdmEgcHJvamVjdCBmcm9tIHdoaWNoIAorCSAqIFRoZSBkb21haW4gb2YgdGhlIHNlYXJjaCBpcyBib3VuZGVkIGJ5IHRoZSBKYXZhIHByb2plY3QgZnJvbSB3aGljaAogCSAqIHRoaXMgbmFtZSBsb29rdXAgd2FzIG9idGFpbmVkLgogCSAqIDxicj4KIAkgKglOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgZmluZCBzZWNvbmRhcnkgdHlwZXMuCkBAIC03NjcsNyArNzk5LDcgQEAKIAkJTmFtZUxvb2t1cC5BbnN3ZXIgYW5zd2VyID0gZmluZFR5cGUobmFtZSwgcGFydGlhbE1hdGNoLCBhY2NlcHRGbGFncywgZmFsc2UvKmRvbid0IGNoZWNrIHJlc3RyaWN0aW9ucyovKTsKIAkJcmV0dXJuIGFuc3dlciA9PSBudWxsID8gbnVsbCA6IGFuc3dlci50eXBlOwogCX0KLQkJCisKIAlwdWJsaWMgQW5zd2VyIGZpbmRUeXBlKFN0cmluZyBuYW1lLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgaW50IGFjY2VwdEZsYWdzLCBib29sZWFuIGNoZWNrUmVzdHJpY3Rpb25zKSB7CiAJCXJldHVybiBmaW5kVHlwZShuYW1lLCBwYXJ0aWFsTWF0Y2gsIGFjY2VwdEZsYWdzLCB0cnVlLypjb25zaWRlciBzZWNvbmRhcnkgdHlwZXMqLywgdHJ1ZS8qd2FpdCBmb3IgaW5kZXhlcyovLCBjaGVja1Jlc3RyaWN0aW9ucywgbnVsbCk7CiAJfQpAQCAtNzkzLDcgKzgyNSw3IEBACiAJCX0KIAkJcmV0dXJuIHR5cGU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZ1tdIHBrZ05hbWUpIHsKIAkJcmV0dXJuIHRoaXMucGFja2FnZUZyYWdtZW50cy5nZXQocGtnTmFtZSkgIT0gbnVsbDsKIAl9CkBAIC04NjEsMzEgKzg5MywzNiBAQAogCQkJCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMudmFsdWVUYWJsZVtpXTsKIAkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFja2FnZUZyYWdtZW50Um9vdCkgewogCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIHZhbHVlOwotCQkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2VGcmFnbWVudChyb290LmdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKSk7CQkJCQorCQkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2VGcmFnbWVudChyb290LmdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gKElQYWNrYWdlRnJhZ21lbnRSb290W10pIHZhbHVlOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSByb290cy5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKIAkJCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKIAkJCQkJCQkJcmV0dXJuOwogCQkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSByb290c1tqXTsKLQkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZUZyYWdtZW50KHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpKTsJCQkJCQorCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlRnJhZ21lbnQocm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSkpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJU3RyaW5nW10gc3BsaXR0ZWROYW1lID0gVXRpbC5zcGxpdE9uKCcuJywgbmFtZSwgMCwgbmFtZS5sZW5ndGgoKSk7Ci0JCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMuZ2V0KHNwbGl0dGVkTmFtZSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2VGcmFnbWVudCgoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHZhbHVlKS5nZXRQYWNrYWdlRnJhZ21lbnQoc3BsaXR0ZWROYW1lKSk7Ci0JCQl9IGVsc2UgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSkgdmFsdWU7Ci0JCQkJaWYgKHJvb3RzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJvb3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdHNbaV07Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZUZyYWdtZW50KHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHNwbGl0dGVkTmFtZSkpOworCQkJaW50IHBrZ0luZGV4ID0gdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmdldEluZGV4KHNwbGl0dGVkTmFtZSk7CisJCQlpZiAocGtnSW5kZXggIT0gLTEpIHsKKwkJCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBhY2thZ2VGcmFnbWVudHMudmFsdWVUYWJsZVtwa2dJbmRleF07CisJCQkJLy8gcmV1c2UgZXhpc3RpbmcgU3RyaW5nW10KKwkJCQlTdHJpbmdbXSBwa2dOYW1lID0gKFN0cmluZ1tdKSB0aGlzLnBhY2thZ2VGcmFnbWVudHMua2V5VGFibGVbcGtnSW5kZXhdOworCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2VGcmFnbWVudCgoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHZhbHVlKS5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSkgdmFsdWU7CisJCQkJCWlmIChyb290cyAhPSBudWxsKSB7CisJCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSByb290c1tpXTsKKwkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZUZyYWdtZW50KHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTkyNSwxMyArOTYyLDEzIEBACiAJCQlmaW5kQWxsVHlwZXMobWF0Y2hOYW1lLCBwYXJ0aWFsTWF0Y2gsIGFjY2VwdEZsYWdzLCByZXF1ZXN0b3IpOwogCQkJcmV0dXJuOwogCQl9Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGtnLmdldFBhcmVudCgpOworCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IChQYWNrYWdlRnJhZ21lbnRSb290KSBwa2cuZ2V0UGFyZW50KCk7CiAJCXRyeSB7CiAKIAkJCS8vIGxvb2sgaW4gd29ya2luZyBjb3BpZXMgZmlyc3QKIAkJCWludCBmaXJzdERvdCA9IC0xOwogCQkJU3RyaW5nIHRvcExldmVsVHlwZU5hbWUgPSBudWxsOwotCQkJaW50IHBhY2thZ2VGbGF2b3I9IHJvb3QuZ2V0S2luZCgpOworCQkJaW50IHBhY2thZ2VGbGF2b3I9IHJvb3QuaW50ZXJuYWxLaW5kKCk7CiAJCQlpZiAodGhpcy50eXBlc0luV29ya2luZ0NvcGllcyAhPSBudWxsIHx8IHBhY2thZ2VGbGF2b3IgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKIAkJCQlmaXJzdERvdCA9IG1hdGNoTmFtZS5pbmRleE9mKCcuJyk7CiAJCQkJaWYgKCFwYXJ0aWFsTWF0Y2gpCkBAIC05NDEsNyArOTc4LDcgQEAKIAkJCQlpZiAoc2Vla1R5cGVzSW5Xb3JraW5nQ29waWVzKG1hdGNoTmFtZSwgcGtnLCBmaXJzdERvdCwgcGFydGlhbE1hdGNoLCB0b3BMZXZlbFR5cGVOYW1lLCBhY2NlcHRGbGFncywgcmVxdWVzdG9yKSkKIAkJCQkJcmV0dXJuOwogCQkJfQotCQkJCisKIAkJCS8vIGxvb2sgaW4gbW9kZWwKIAkJCXN3aXRjaCAocGFja2FnZUZsYXZvcikgewogCQkJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkgOgpAQCAtOTUwLDYgKzk4NywxMyBAQAogCQkJCQlicmVhazsKIAkJCQljYXNlIElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFIDoKIAkJCQkJc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlKG1hdGNoTmFtZSwgcGtnLCBmaXJzdERvdCwgcGFydGlhbE1hdGNoLCB0b3BMZXZlbFR5cGVOYW1lLCBhY2NlcHRGbGFncywgcmVxdWVzdG9yKTsKKwkJCQkJaWYgKG1hdGNoTmFtZS5pbmRleE9mKCckJykgIT0gLTEpIHsKKwkJCQkJCW1hdGNoTmFtZT0gbWF0Y2hOYW1lLnJlcGxhY2UoJyQnLCAnLicpOworCQkJCQkJZmlyc3REb3QgPSBtYXRjaE5hbWUuaW5kZXhPZignLicpOworCQkJCQkJaWYgKCFwYXJ0aWFsTWF0Y2gpCisJCQkJCQkJdG9wTGV2ZWxUeXBlTmFtZSA9IGZpcnN0RG90ID09IC0xID8gbWF0Y2hOYW1lIDogbWF0Y2hOYW1lLnN1YnN0cmluZygwLCBmaXJzdERvdCk7CisJCQkJCQlzZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UobWF0Y2hOYW1lLCBwa2csIGZpcnN0RG90LCBwYXJ0aWFsTWF0Y2gsIHRvcExldmVsVHlwZU5hbWUsIGFjY2VwdEZsYWdzLCByZXF1ZXN0b3IpOworCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQgOgogCQkJCQlyZXR1cm47CkBAIC0xMDIwLDE0ICsxMDY0LDE0IEBACiAJICogUGVyZm9ybXMgdHlwZSBzZWFyY2ggaW4gYSBzb3VyY2UgcGFja2FnZS4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBzZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UoCi0JCQlTdHJpbmcgbmFtZSwgCi0JCQlJUGFja2FnZUZyYWdtZW50IHBrZywgCi0JCQlpbnQgZmlyc3REb3QsIAotCQkJYm9vbGVhbiBwYXJ0aWFsTWF0Y2gsIAotCQkJU3RyaW5nIHRvcExldmVsVHlwZU5hbWUsIAorCQkJU3RyaW5nIG5hbWUsCisJCQlJUGFja2FnZUZyYWdtZW50IHBrZywKKwkJCWludCBmaXJzdERvdCwKKwkJCWJvb2xlYW4gcGFydGlhbE1hdGNoLAorCQkJU3RyaW5nIHRvcExldmVsVHlwZU5hbWUsCiAJCQlpbnQgYWNjZXB0RmxhZ3MsCiAJCQlJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCQorCiAJCWxvbmcgc3RhcnQgPSAtMTsKIAkJaWYgKFZFUkJPU0UpCiAJCQlzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMTA0MSw3ICsxMDg1LDcgQEAKIAkJCQkJCUlKYXZhRWxlbWVudCBjdSA9IGNvbXBpbGF0aW9uVW5pdHNbaV07CiAJCQkJCQlTdHJpbmcgY3VOYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKIAkJCQkJCWludCBsYXN0RG90ID0gY3VOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJCQlpZiAobGFzdERvdCAhPSB0b3BMZXZlbFR5cGVOYW1lLmxlbmd0aCgpIHx8ICF0b3BMZXZlbFR5cGVOYW1lLnJlZ2lvbk1hdGNoZXMoMCwgY3VOYW1lLCAwLCBsYXN0RG90KSkgCisJCQkJCQlpZiAobGFzdERvdCAhPSB0b3BMZXZlbFR5cGVOYW1lLmxlbmd0aCgpIHx8ICF0b3BMZXZlbFR5cGVOYW1lLnJlZ2lvbk1hdGNoZXMoMCwgY3VOYW1lLCAwLCBsYXN0RG90KSkKIAkJCQkJCQljb250aW51ZTsKIAkJCQkJCUlUeXBlIHR5cGUgPSAoKElDb21waWxhdGlvblVuaXQpIGN1KS5nZXRUeXBlKHRvcExldmVsVHlwZU5hbWUpOwogCQkJCQkJdHlwZSA9IGdldE1lbWJlclR5cGUodHlwZSwgbmFtZSwgZmlyc3REb3QpOwpAQCAtMTA4MCw3ICsxMTI0LDcgQEAKIAkJCQl0aGlzLnRpbWVTcGVudEluU2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogTm90aWZpZXMgdGhlIGdpdmVuIHJlcXVlc3RvciBvZiBhbGwgdHlwZXMgKGNsYXNzZXMgYW5kIGludGVyZmFjZXMpIGluIHRoZQogCSAqIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gKHBvc3NpYmx5IHF1YWxpZmllZCkgbmFtZS4gQ2hlY2tzCkBAIC0xMDk1LDggKzExMzksOCBAQAogCQkJcmV0dXJuIGZhbHNlOyAvLyB0aGUgZW5jbG9zaW5nIHR5cGUgaXMgbm90IHByZXNlbnQKIAkJfQogCQlpbnQgbGVuZ3RoPSB0eXBlcy5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOyAKLQkJCisJCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOworCiAJCVN0cmluZyBtZW1iZXJQcmVmaXggPSBwcmVmaXg7CiAJCWJvb2xlYW4gaXNNZW1iZXJUeXBlUHJlZml4ID0gZmFsc2U7CiAJCWlmIChmaXJzdERvdCAhPSAtMSkgewpAQCAtMTEyMCw3ICsxMTY0LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2Vla1R5cGVzSW5Ub3BMZXZlbFR5cGUoU3RyaW5nIHByZWZpeCwgaW50IGZpcnN0RG90LCBJVHlwZSB0b3BMZXZlbFR5cGUsIElKYXZhRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBhY2NlcHRGbGFncykgewogCQlpZiAoIXRvcExldmVsVHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTEzNCwxNyArMTE3OCwxNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAkvKgogCSAqIFNlZWtzIHRoZSB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIG1hcCBvZiB0eXBlcyB3aXRoIHByZWNlZGVuY2UgKGNvbWluZyBmcm9tIHdvcmtpbmcgY29waWVzKQogCSAqIFJldHVybiB3aGV0aGVyIGEgdHlwZSBoYXMgYmVlbiBmb3VuZC4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBzZWVrVHlwZXNJbldvcmtpbmdDb3BpZXMoCi0JCQlTdHJpbmcgbmFtZSwgCi0JCQlJUGFja2FnZUZyYWdtZW50IHBrZywgCi0JCQlpbnQgZmlyc3REb3QsIAotCQkJYm9vbGVhbiBwYXJ0aWFsTWF0Y2gsIAotCQkJU3RyaW5nIHRvcExldmVsVHlwZU5hbWUsIAorCQkJU3RyaW5nIG5hbWUsCisJCQlJUGFja2FnZUZyYWdtZW50IHBrZywKKwkJCWludCBmaXJzdERvdCwKKwkJCWJvb2xlYW4gcGFydGlhbE1hdGNoLAorCQkJU3RyaW5nIHRvcExldmVsVHlwZU5hbWUsCiAJCQlpbnQgYWNjZXB0RmxhZ3MsCiAJCQlJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CiAKQEAgLTExNTksNyArMTIwMywxMyBAQAogCQkJCQkJcmV0dXJuIHRydWU7IC8vIGRvbid0IGNvbnRpbnVlIHdpdGggY29tcGlsYXRpb24gdW5pdAogCQkJCQl9CiAJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJVHlwZVtdKSB7Ci0JCQkJCWlmIChvYmplY3QgPT0gTk9fVFlQRVMpIHJldHVybiB0cnVlOyAvLyBhbGwgdHlwZXMgd2hlcmUgZGVsZXRlZCAtPiB0eXBlIGlzIGhpZGRlbgorCQkJCQlpZiAob2JqZWN0ID09IE5PX1RZUEVTKSB7CisJCQkJCQkvLyBhbGwgdHlwZXMgd2hlcmUgZGVsZXRlZCAtPiB0eXBlIGlzIGhpZGRlbiwgT1IgaXQgaXMgdGhlIGZha2UgdHlwZSBwYWNrYWdlLWluZm8KKwkJCQkJCVN0cmluZyBwYWNrYWdlSW5mb05hbWUgPSBTdHJpbmcudmFsdWVPZihUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKTsKKwkJCQkJCWlmIChwYWNrYWdlSW5mb05hbWUuZXF1YWxzKG5hbWUpKQorCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKHBrZy5nZXRDb21waWxhdGlvblVuaXQocGFja2FnZUluZm9OYW1lLmNvbmNhdChTVUZGSVhfU1RSSU5HX2phdmEpKS5nZXRUeXBlKG5hbWUpKTsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CiAJCQkJCUlUeXBlW10gdG9wTGV2ZWxUeXBlcyA9IChJVHlwZVtdKSBvYmplY3Q7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKQEAgLTExOTIsNSArMTI0Miw1IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZWRNZW1iZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVkTWVtYmVyLmphdmEKaW5kZXggYzMwNTUwMy4uMzE3YjllNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZWRNZW1iZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lZE1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRNZW1iZXIgZXh0ZW5kcyBNZW1iZXIgewogCkBAIC0zMCwxMiArMzQsMTIgQEAKIAkgKiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBuYW1lLgogCSAqLwogCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkKKwogCXB1YmxpYyBOYW1lZE1lbWJlcihKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKHBhcmVudCk7CiAJCXRoaXMubmFtZSA9IG5hbWU7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gZ2V0VHlwZVBhcmFtZXRlcnMoKTsKIAkJaW50IGxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKQEAgLTYzLDMzICs2NywzMyBAQAogCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLm5hbWU7CiAJfQotCQorCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSUZpZWxkIGZpZWxkLCBib29sZWFuIGZvcmNlT3BlbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCVN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQkvLyBkZWNsYXJpbmcgY2xhc3MgCisKKwkJLy8gZGVjbGFyaW5nIGNsYXNzCiAJCVN0cmluZyBkZWNsYXJpbmdLZXkgPSBnZXRLZXkoKElUeXBlKSBmaWVsZC5nZXRQYXJlbnQoKSwgZm9yY2VPcGVuKTsKIAkJa2V5LmFwcGVuZChkZWNsYXJpbmdLZXkpOwotCQkKKwogCQkvLyBmaWVsZCBuYW1lCiAJCWtleS5hcHBlbmQoJy4nKTsKIAkJa2V5LmFwcGVuZChmaWVsZC5nZXRFbGVtZW50TmFtZSgpKTsKIAogCQlyZXR1cm4ga2V5LnRvU3RyaW5nKCk7CiAJfQotCQorCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSU1ldGhvZCBtZXRob2QsIGJvb2xlYW4gZm9yY2VPcGVuKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCS8vIGRlY2xhcmluZyBjbGFzcyAKKworCQkvLyBkZWNsYXJpbmcgY2xhc3MKIAkJU3RyaW5nIGRlY2xhcmluZ0tleSA9IGdldEtleSgoSVR5cGUpIG1ldGhvZC5nZXRQYXJlbnQoKSwgZm9yY2VPcGVuKTsKIAkJa2V5LmFwcGVuZChkZWNsYXJpbmdLZXkpOwotCQkKKwogCQkvLyBzZWxlY3RvcgogCQlrZXkuYXBwZW5kKCcuJyk7CiAJCVN0cmluZyBzZWxlY3RvciA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwogCQlrZXkuYXBwZW5kKHNlbGVjdG9yKTsKLQkJCisKIAkJLy8gdHlwZSBwYXJhbWV0ZXJzCiAJCWlmIChmb3JjZU9wZW4pIHsKIAkJCUlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKQEAgLTExMSwyMyArMTE1LDIzIEBACiAJCQkJa2V5LmFwcGVuZCgnPicpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIHBhcmFtZXRlcnMKIAkJa2V5LmFwcGVuZCgnKCcpOwogCQlTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQogCQkJa2V5LmFwcGVuZChwYXJhbWV0ZXJzW2ldLnJlcGxhY2UoJy4nLCAnLycpKTsKIAkJa2V5LmFwcGVuZCgnKScpOwotCQkKKwogCQkvLyByZXR1cm4gdHlwZQogCQlpZiAoZm9yY2VPcGVuKQogCQkJa2V5LmFwcGVuZChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLnJlcGxhY2UoJy4nLCAnLycpKTsKIAkJZWxzZQogCQkJa2V5LmFwcGVuZCgnVicpOwotCQkKKwogCQlyZXR1cm4ga2V5LnRvU3RyaW5nKCk7CiAJfQotCQorCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSVR5cGUgdHlwZSwgYm9vbGVhbiBmb3JjZU9wZW4pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlTdHJpbmdCdWZmZXIga2V5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlrZXkuYXBwZW5kKCdMJyk7CkBAIC0xNzAsMTEgKzE3NCwxMSBAQAogCQlidWZmZXIuYXBwZW5kKCc+Jyk7CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvciwgYm9vbGVhbiBzaG93UGFyYW1ldGVycykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7CiAJCWlmIChwYWNrYWdlTmFtZS5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSkpIHsKQEAgLTIwMSw3ICsyMDUsNyBAQAogCQkJCQl0eXBlTmFtZSA9IHRoaXMubmFtZTsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyBhbm9ueW1vdXMgb3IgbG9jYWwgY2xhc3MgZmlsZQotCQkJCQl0eXBlTmFtZSA9IGNsYXNzRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGNsYXNzRmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7IC8vIHJlbW92ZSAuY2xhc3MKKwkJCQkJdHlwZU5hbWUgPSBjbGFzc0ZpbGVOYW1lLnN1YnN0cmluZygwLCBjbGFzc0ZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpLypyZW1vdmUgLmNsYXNzKi8ucmVwbGFjZSgnJCcsIGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpOwogCQkJCX0KIAkJCQlpZiAoc2hvd1BhcmFtZXRlcnMpIHsKIAkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodHlwZU5hbWUpOwpAQCAtMjI5LDggKzIzMyw2NyBAQAogCQl9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgSVR5cGVQYXJhbWV0ZXJbXSBnZXRUeXBlUGFyYW1ldGVycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlyZXR1cm4gbnVsbDsKIAl9CisKKwkvKioKKwkgKiBAc2VlIElUeXBlI3Jlc29sdmVUeXBlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW11bXSByZXNvbHZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gcmVzb2x2ZVR5cGUodHlwZU5hbWUsIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVR5cGUjcmVzb2x2ZVR5cGUoU3RyaW5nLCBXb3JraW5nQ29weU93bmVyKQorCSAqLworCXB1YmxpYyBTdHJpbmdbXVtdIHJlc29sdmVUeXBlKFN0cmluZyB0eXBlTmFtZSwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCk7CisJCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IHByb2plY3QubmV3U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudChvd25lcik7CisKKwkJY2xhc3MgVHlwZVJlc29sdmVSZXF1ZXN0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uUmVxdWVzdG9yIHsKKwkJCVN0cmluZ1tdW10gYW5zd2VycyA9IG51bGw7CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHROYW1lLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgeworCQkJCVN0cmluZ1tdIGFuc3dlciA9IG5ldyBTdHJpbmdbXSAge25ldyBTdHJpbmcocGFja2FnZU5hbWUpLCBuZXcgU3RyaW5nKHROYW1lKSB9OworCQkJCWlmICh0aGlzLmFuc3dlcnMgPT0gbnVsbCkgeworCQkJCQl0aGlzLmFuc3dlcnMgPSBuZXcgU3RyaW5nW11bXXsgYW5zd2VyIH07CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZ3JvdworCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy5hbnN3ZXJzLmxlbmd0aDsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmFuc3dlcnMsIDAsIHRoaXMuYW5zd2VycyA9IG5ldyBTdHJpbmdbbGVuZ3RoKzFdW10sIDAsIGxlbmd0aCk7CisJCQkJCXRoaXMuYW5zd2Vyc1tsZW5ndGhdID0gYW5zd2VyOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEVycm9yKENhdGVnb3JpemVkUHJvYmxlbSBlcnJvcikgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gZmllbGROYW1lLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgU3RyaW5nIGVuY2xvc2luZ0RlY2xhcmluZ1R5cGVTaWduYXR1cmUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIFN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMsIGNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJOYW1lcywgY2hhcltdW11bXSB0eXBlUGFyYW1ldGVyQm91bmROYW1lcywgYm9vbGVhbiBpc0NvbnN0cnVjdG9yLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZVBhcmFtZXRlcihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZFR5cGVQYXJhbWV0ZXIoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gc2VsZWN0b3IsIGludCBzZWxlY3RvclN0YXJ0LCBpbnQgc2VsY2V0b3JFbmQsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKworCQl9CisJCVR5cGVSZXNvbHZlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBUeXBlUmVzb2x2ZVJlcXVlc3RvcigpOworCQlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0KKwkJCW5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgcHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCBvd25lcik7CisKKwkJZW5naW5lLnNlbGVjdFR5cGUodHlwZU5hbWUudG9DaGFyQXJyYXkoKSwgKElUeXBlKSB0aGlzKTsKKwkJaWYgKE5hbWVMb29rdXAuVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlOiAiICsgZW52aXJvbm1lbnQubmFtZUxvb2t1cC50aW1lU3BlbnRJblNlZWtUeXBlc0luU291cmNlUGFja2FnZSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgVElNRSBTUEVOVCBpbiBOYW1lTG9vcGt1cCNzZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2U6ICIgKyBlbnZpcm9ubWVudC5uYW1lTG9va3VwLnRpbWVTcGVudEluU2Vla1R5cGVzSW5CaW5hcnlQYWNrYWdlICsgIm1zIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlyZXR1cm4gcmVxdWVzdG9yLmFuc3dlcnM7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTm9uSmF2YVJlc291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Ob25KYXZhUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlhM2IwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTm9uSmF2YVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXJFbnRyeVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOworCitwdWJsaWMgY2xhc3MgTm9uSmF2YVJlc291cmNlICBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSUphckVudHJ5UmVzb3VyY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUphckVudHJ5UmVzb3VyY2VbXSBOT19DSElMRFJFTiA9IG5ldyBJSmFyRW50cnlSZXNvdXJjZVswXTsKKwlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKKwlwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlOworCisJcHVibGljIE5vbkphdmFSZXNvdXJjZShPYmplY3QgcGFyZW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTm9uSmF2YVJlc291cmNlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJTm9uSmF2YVJlc291cmNlIG90aGVyID0gKE5vbkphdmFSZXNvdXJjZSkgb2JqOworCQlyZXR1cm4gdGhpcy5wYXJlbnQuZXF1YWxzKG90aGVyLnBhcmVudCkgJiYgdGhpcy5yZXNvdXJjZS5lcXVhbHMob3RoZXIucmVzb3VyY2UpOworCX0KKworCXB1YmxpYyBJSmFyRW50cnlSZXNvdXJjZVtdIGdldENoaWxkcmVuKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKKwkJCUlSZXNvdXJjZVtdIG1lbWJlcnM7CisJCQl0cnkgeworCQkJCW1lbWJlcnMgPSAoKElDb250YWluZXIpIHRoaXMucmVzb3VyY2UpLm1lbWJlcnMoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3QgcmV0cmlldmUgY2hpbGRyZW4gb2YgIiArIHRoaXMucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gTk9fQ0hJTERSRU47CisJCQl9CisJCQlpbnQgbGVuZ3RoID0gbWVtYmVycy5sZW5ndGg7CisJCQlpZiAobGVuZ3RoID09IDApCisJCQkJcmV0dXJuIE5PX0NISUxEUkVOOworCQkJSUphckVudHJ5UmVzb3VyY2VbXSBjaGlsZHJlbiA9IG5ldyBJSmFyRW50cnlSZXNvdXJjZVtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNoaWxkcmVuW2ldID0gbmV3IE5vbkphdmFSZXNvdXJjZSh0aGlzLCBtZW1iZXJzW2ldKTsKKwkJCX0KKwkJCXJldHVybiBjaGlsZHJlbjsKKwkJfQorCQlyZXR1cm4gTk9fQ0hJTERSRU47CisJfQorCisJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAodGhpcy5yZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQorCQkJcmV0dXJuICgoSUZpbGUpIHRoaXMucmVzb3VyY2UpLmdldENvbnRlbnRzKCk7CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50cnlOYW1lKCkgeworCQlTdHJpbmcgcGFyZW50RW50cnlOYW1lOworCQlpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CisJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoKElQYWNrYWdlRnJhZ21lbnQpIHRoaXMucGFyZW50KS5nZXRFbGVtZW50TmFtZSgpOworCQkJcGFyZW50RW50cnlOYW1lID0gZWxlbWVudE5hbWUubGVuZ3RoKCkgPT0gMCA/ICIiIDogZWxlbWVudE5hbWUgLnJlcGxhY2UoJy4nLCAnLycpICsgJy8nOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgeworCQkJcGFyZW50RW50cnlOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXBhcmVudEVudHJ5TmFtZSA9ICgoTm9uSmF2YVJlc291cmNlKSB0aGlzLnBhcmVudCkuZ2V0RW50cnlOYW1lKCkgKyAnLyc7CisJCX0KKwkJcmV0dXJuIHBhcmVudEVudHJ5TmFtZSArIGdldE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7CisJCXJldHVybiBuZXcgUGF0aChnZXRFbnRyeU5hbWUoKSkubWFrZUFic29sdXRlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXROYW1lKCk7CisJfQorCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7CisJCWlmICh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKKwkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpICgoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5wYXJlbnQpLmdldFBhcmVudCgpOworCQl9IGVsc2UgaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMucGFyZW50OworCQl9IGVsc2UgeworCQkJcmV0dXJuICgoTm9uSmF2YVJlc291cmNlKSB0aGlzLnBhcmVudCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCQl9CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7CisJCXJldHVybiB0aGlzLnBhcmVudDsKKwl9CisKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKHRoaXMucmVzb3VyY2UuaGFzaENvZGUoKSwgdGhpcy5wYXJlbnQuaGFzaENvZGUoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNGaWxlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiTm9uSmF2YVJlc291cmNlWyIrZ2V0RW50cnlOYW1lKCkrIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGUuamF2YQppbmRleCBlMjIxMjk0Li4xNDk3NTg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBlcmZvcm1hbmNlU3RhdHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKQEAgLTUwLDcgKzUxLDcgQEAKIAl9IGVsc2UgewogCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRFbGVtZW50c091dE9mU3luY2hXaXRoQnVmZmVycygpLmFkZCh0aGlzKTsKIAl9Ci19CQorfQogLyoqCiAgKiBCdWlsZHMgdGhpcyBlbGVtZW50J3Mgc3RydWN0dXJlIGFuZCBwcm9wZXJ0aWVzIGluIHRoZSBnaXZlbgogICogaW5mbyBvYmplY3QsIGJhc2VkIG9uIHRoaXMgZWxlbWVudCdzIGN1cnJlbnQgY29udGVudHMgKHJldXNlIGJ1ZmZlcgpAQCAtOTUsNyArOTYsMTMgQEAKIHByb3RlY3RlZCB2b2lkIGNsb3NpbmcoT2JqZWN0IGluZm8pIHsKIAljbG9zZUJ1ZmZlcigpOwogfQotcHJvdGVjdGVkIHZvaWQgY29kZUNvbXBsZXRlKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCBjdSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHVuaXRUb1NraXAsIGludCBwb3NpdGlvbiwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworcHJvdGVjdGVkIHZvaWQgY29kZUNvbXBsZXRlKAorCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgY3UsCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCB1bml0VG9Ta2lwLAorCQlpbnQgcG9zaXRpb24sIENvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlXb3JraW5nQ29weU93bmVyIG93bmVyLAorCQlJVHlwZVJvb3QgdHlwZVJvb3QsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7CiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbXBsZXRpb24gcmVxdWVzdG9yIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMTksOCArMTI2LDggQEAKIAllbnZpcm9ubWVudC51bml0VG9Ta2lwID0gdW5pdFRvU2tpcDsKIAogCS8vIGNvZGUgY29tcGxldGUKLQlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgcHJvamVjdCk7Ci0JZW5naW5lLmNvbXBsZXRlKGN1LCBwb3NpdGlvbiwgMCk7CisJQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgcmVxdWVzdG9yLCBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksIHByb2plY3QsIG93bmVyLCBtb25pdG9yKTsKKwllbmdpbmUuY29tcGxldGUoY3UsIHBvc2l0aW9uLCAwLCB0eXBlUm9vdCk7CiAJaWYocGVyZm9ybWFuY2VTdGF0cyAhPSBudWxsKSB7CiAJCXBlcmZvcm1hbmNlU3RhdHMuZW5kUnVuKCk7CiAJfQpAQCAtMTM2LDEwICsxNDMsMTAgQEAKIAlpZihwZXJmb3JtYW5jZVN0YXRzICE9IG51bGwpIHsKIAkJcGVyZm9ybWFuY2VTdGF0cy5zdGFydFJ1bihuZXcgU3RyaW5nKGN1LmdldEZpbGVOYW1lKCkpICsgIiBhdCBbIiArIG9mZnNldCArICIsIiArIGxlbmd0aCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJfQotCQorCiAJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClnZXRKYXZhUHJvamVjdCgpOwogCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IHByb2plY3QubmV3U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudChvd25lcik7Ci0JCisKIAlTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yPSBuZXcgU2VsZWN0aW9uUmVxdWVzdG9yKGVudmlyb25tZW50Lm5hbWVMb29rdXAsIHRoaXMpOwogCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7CiAJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CkBAIC0xNTEsOSArMTU4LDkgQEAKIAl9CiAKIAkvLyBmaXggZm9yIDFGVlhHREsKLQlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgcmVxdWVzdG9yLCBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSkpOworCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgb3duZXIpOwogCWVuZ2luZS5zZWxlY3QoY3UsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoIC0gMSk7Ci0JCisKIAlpZihwZXJmb3JtYW5jZVN0YXRzICE9IG51bGwpIHsKIAkJcGVyZm9ybWFuY2VTdGF0cy5lbmRSdW4oKTsKIAl9CkBAIC0xNzMsMTUgKzE4MCwzMCBAQAogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwogcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCWlmIChtYW5hZ2VyLmdldEluZm8odGhpcykgIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JaWYgKCFwYXJlbnRFeGlzdHMoKSkgcmV0dXJuIGZhbHNlOwotCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQlpZiAocm9vdCAhPSBudWxsCi0JCQkmJiAocm9vdCA9PSB0aGlzIHx8ICFyb290LmlzQXJjaGl2ZSgpKSkgewotCQlyZXR1cm4gcmVzb3VyY2VFeGlzdHMoKTsKKwlpZiAoSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyh0aGlzKSAhPSBudWxsKQorCQlyZXR1cm4gdHJ1ZTsKKwlzd2l0Y2ggKGdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKKwkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwkJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CisJCQkJLy8gcGtnIGluIGEgamFyIC0+IG5lZWQgdG8gb3BlbiByb290IHRvIGtub3cgaWYgdGhpcyBwa2cgZXhpc3RzCisJCQkJSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8gcm9vdEluZm87CisJCQkJdHJ5IHsKKwkJCQkJcm9vdEluZm8gPSAoSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIHJvb3QuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiByb290SW5mby5yYXdQYWNrYWdlSW5mby5jb250YWluc0tleSgoKFBhY2thZ2VGcmFnbWVudCkgdGhpcykubmFtZXMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQlpZiAoZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmlzQXJjaGl2ZSgpKSB7CisJCQkJLy8gY2xhc3MgZmlsZSBpbiBhIGphciAtPiBuZWVkIHRvIG9wZW4gdGhpcyBjbGFzcyBmaWxlIHRvIGtub3cgaWYgaXQgZXhpc3RzCisJCQkJcmV0dXJuIHN1cGVyLmV4aXN0cygpOworCQkJfQorCQkJYnJlYWs7CiAJfQotCXJldHVybiBzdXBlci5leGlzdHMoKTsKKwlyZXR1cm4gdmFsaWRhdGVFeGlzdGVuY2UocmVzb3VyY2UoKSkuaXNPSygpOwogfQogcHVibGljIFN0cmluZyBmaW5kUmVjb21tZW5kZWRMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXIoKTsKQEAgLTIxMywxMCArMjM1LDE3IEBACiAJCX0KIAkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyIgT1BFTklORyAiICsgZWxlbWVudCArICIgIiArIHRoaXMudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCX0KLQkKLQkvLyBvcGVuIHRoZSBwYXJlbnQgaWYgbmVjZXNzYXJ5Ci0Jb3BlblBhcmVudChpbmZvLCBuZXdFbGVtZW50cywgbW9uaXRvcik7Ci0JaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgCisKKwkvLyBvcGVuIGl0cyBhbmNlc3RvcnMgaWYgbmVlZGVkCisJb3BlbkFuY2VzdG9ycyhuZXdFbGVtZW50cywgbW9uaXRvcik7CisKKwkvLyB2YWxpZGF0ZSBleGlzdGVuY2UKKwlJUmVzb3VyY2UgdW5kZXJsUmVzb3VyY2UgPSByZXNvdXJjZSgpOworCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVFeGlzdGVuY2UodW5kZXJsUmVzb3VyY2UpOworCWlmICghc3RhdHVzLmlzT0soKSkKKwkJdGhyb3cgbmV3SmF2YU1vZGVsRXhjZXB0aW9uKHN0YXR1cyk7CisKKwlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQogCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKIAogCSAvLyBwdXRzIHRoZSBpbmZvIGJlZm9yZSBidWlsZGluZyB0aGUgc3RydWN0dXJlIHNvIHRoYXQgcXVlc3Rpb25zIHRvIHRoZSBoYW5kbGUgYmVoYXZlIGFzIGlmIHRoZSBlbGVtZW50IGV4aXN0ZWQKQEAgLTIyNiwxMyArMjU1LDEzIEBACiAJLy8gYnVpbGQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgb3BlbmFibGUgKHRoaXMgd2lsbCBvcGVuIHRoZSBidWZmZXIgaWYgbmVlZGVkKQogCXRyeSB7CiAJCU9wZW5hYmxlRWxlbWVudEluZm8gb3BlbmFibGVFbGVtZW50SW5mbyA9IChPcGVuYWJsZUVsZW1lbnRJbmZvKWluZm87Ci0JCWJvb2xlYW4gaXNTdHJ1Y3R1cmVLbm93biA9IGJ1aWxkU3RydWN0dXJlKG9wZW5hYmxlRWxlbWVudEluZm8sIG1vbml0b3IsIG5ld0VsZW1lbnRzLCBnZXRSZXNvdXJjZSgpKTsKKwkJYm9vbGVhbiBpc1N0cnVjdHVyZUtub3duID0gYnVpbGRTdHJ1Y3R1cmUob3BlbmFibGVFbGVtZW50SW5mbywgbW9uaXRvciwgbmV3RWxlbWVudHMsIHVuZGVybFJlc291cmNlKTsKIAkJb3BlbmFibGVFbGVtZW50SW5mby5zZXRJc1N0cnVjdHVyZUtub3duKGlzU3RydWN0dXJlS25vd24pOwogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCW5ld0VsZW1lbnRzLnJlbW92ZSh0aGlzKTsKIAkJdGhyb3cgZTsKIAl9Ci0JCisKIAkvLyByZW1vdmUgb3V0IG9mIHN5bmMgYnVmZmVyIGZvciB0aGlzIGVsZW1lbnQKIAlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRFbGVtZW50c091dE9mU3luY2hXaXRoQnVmZmVycygpLnJlbW92ZSh0aGlzKTsKIApAQCAtMjQ2LDcgKzI3NSw3IEBACiAgKiBpcyB0aGUgZmlyc3QgdGltZSBhIHJlcXVlc3QgaXMgYmVpbmcgbWFkZSBmb3IgdGhlIGJ1ZmZlciwgYW4gYXR0ZW1wdCBpcwogICogbWFkZSB0byBjcmVhdGUgYW5kIGZpbGwgdGhpcyBlbGVtZW50J3MgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuCiAgKiBjbG9zZWQgc2luY2UgaXQgd2FzIGZpcnN0IG9wZW5lZCwgdGhlIGJ1ZmZlciBpcyByZS1jcmVhdGVkLgotICogCisgKgogICogQHNlZSBJT3BlbmFibGUKICAqLwogcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CkBAIC0yOTMsNyArMzIyLDcgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KIHB1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoKSB7Ci0JcmV0dXJuIHRoaXM7CQorCXJldHVybiB0aGlzOwogfQogCiAKQEAgLTMzMSwxMSArMzYwLDExIEBACiAgKiBAc2VlIElPcGVuYWJsZQogICovCiBwdWJsaWMgYm9vbGVhbiBoYXNVbnNhdmVkQ2hhbmdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb257Ci0JCisKIAlpZiAoaXNSZWFkT25seSgpIHx8ICFpc09wZW4oKSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQotCUlCdWZmZXIgYnVmID0gdGhpcy5nZXRCdWZmZXIoKTsKKwlJQnVmZmVyIGJ1ZiA9IGdldEJ1ZmZlcigpOwogCWlmIChidWYgIT0gbnVsbCAmJiBidWYuaGFzVW5zYXZlZENoYW5nZXMoKSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0zNTcsNyArMzg2LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXJldHVybiBmYWxzZTsKIH0KIC8qKgpAQCAtMzY5LDcgKzM5OCw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAvKioKLSAqIAorICoKICAqIEBzZWUgSU9wZW5hYmxlCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKQEAgLTQxMywzOSArNDQyLDMxIEBACiAJcmV0dXJuIG51bGw7CiB9CiAKLS8qKgotICogT3BlbiB0aGUgcGFyZW50IGVsZW1lbnQgaWYgbmVjZXNzYXJ5LgotICovCi1wcm90ZWN0ZWQgdm9pZCBvcGVuUGFyZW50KE9iamVjdCBjaGlsZEluZm8sIEhhc2hNYXAgbmV3RWxlbWVudHMsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JT3BlbmFibGUgb3BlbmFibGVQYXJlbnQgPSAoT3BlbmFibGUpZ2V0T3BlbmFibGVQYXJlbnQoKTsKLQlpZiAob3BlbmFibGVQYXJlbnQgIT0gbnVsbCAmJiAhb3BlbmFibGVQYXJlbnQuaXNPcGVuKCkpewotCQlvcGVuYWJsZVBhcmVudC5nZW5lcmF0ZUluZm9zKG9wZW5hYmxlUGFyZW50LmNyZWF0ZUVsZW1lbnRJbmZvKCksIG5ld0VsZW1lbnRzLCBwbSk7CitwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwlpZiAocm9vdCAhPSBudWxsKSB7CisJCWlmIChyb290LmlzRXh0ZXJuYWwoKSkKKwkJCXJldHVybiBudWxsOworCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkKKwkJCXJldHVybiByb290LnJlc291cmNlKHJvb3QpOwogCX0KKwlyZXR1cm4gcmVzb3VyY2Uocm9vdCk7CiB9CiAKLS8qKgotICogIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgcGFyZW50IGV4aXN0cyAobnVsbCBwYXJlbnQgaXMgYW5zd2VyaW5nIHRydWUpCi0gKiAKLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gcGFyZW50RXhpc3RzKCl7Ci0JCi0JSUphdmFFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBnZXRQYXJlbnQoKTsKLQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gcGFyZW50RWxlbWVudC5leGlzdHMoKTsKK3B1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoKSB7CisJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5pc0FyY2hpdmUoKSkKKwkJcmV0dXJuIHJvb3QucmVzb3VyY2Uocm9vdCk7CisJcmV0dXJuIHJlc291cmNlKHJvb3QpOwogfQogCitwcm90ZWN0ZWQgYWJzdHJhY3QgSVJlc291cmNlIHJlc291cmNlKFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCk7CisKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG9yIGFzc29jaWF0ZWQgZmlsZSBleGlzdHMKICAqLwotcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VFeGlzdHMoKSB7Ci0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JaWYgKHdvcmtzcGFjZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDY5Ci0JcmV0dXJuIAotCQlKYXZhTW9kZWwuZ2V0VGFyZ2V0KAotCQkJd29ya3NwYWNlLmdldFJvb3QoKSwgCi0JCQl0aGlzLmdldFBhdGgoKS5tYWtlUmVsYXRpdmUoKSwgLy8gZW5zdXJlIHBhdGggaXMgcmVsYXRpdmUgKHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTE3KQotCQkJdHJ1ZSkgIT0gbnVsbDsKK3Byb3RlY3RlZCBib29sZWFuIHJlc291cmNlRXhpc3RzKElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKKwlyZXR1cm4gdW5kZXJseWluZ1Jlc291cmNlLmlzQWNjZXNzaWJsZSgpOwogfQogCiAvKioKQEAgLTQ1OCw3ICs0NzksNyBAQAogCUlCdWZmZXIgYnVmID0gZ2V0QnVmZmVyKCk7CiAJaWYgKGJ1ZiAhPSBudWxsKSB7IC8vIHNvbWUgT3BlbmFibGVzIChsaWtlIGEgSmF2YVByb2plY3QpIGRvbid0IGhhdmUgYSBidWZmZXIKIAkJYnVmLnNhdmUocG0sIGZvcmNlKTsKLQkJdGhpcy5tYWtlQ29uc2lzdGVudChwbSk7IC8vIHVwZGF0ZSB0aGUgZWxlbWVudCBpbmZvIG9mIHRoaXMgZWxlbWVudAorCQltYWtlQ29uc2lzdGVudChwbSk7IC8vIHVwZGF0ZSB0aGUgZWxlbWVudCBpbmZvIG9mIHRoaXMgZWxlbWVudAogCX0KIH0KIApAQCAtNDY5LDQgKzQ5MCwxOSBAQAogCXJldHVybiAoUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CiB9CiAKKy8qCisgKiBWYWxpZGF0ZXMgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIG9wZW5hYmxlLiBSZXR1cm5zIGEgbm9uIG9rIHN0YXR1cyBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICovCithYnN0cmFjdCBwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0ZW5jZShJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKTsKKworLyoKKyAqIE9wZW5zIHRoZSBhbmNlc3RvcnMgb2YgdGhpcyBvcGVuYWJsZSB0aGF0IGFyZSBub3QgeWV0IG9wZW5lZCwgdmFsaWRhdGluZyB0aGVpciBleGlzdGVuY2UuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG9wZW5BbmNlc3RvcnMoSGFzaE1hcCBuZXdFbGVtZW50cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlPcGVuYWJsZSBvcGVuYWJsZVBhcmVudCA9IChPcGVuYWJsZSlnZXRPcGVuYWJsZVBhcmVudCgpOworCWlmIChvcGVuYWJsZVBhcmVudCAhPSBudWxsICYmICFvcGVuYWJsZVBhcmVudC5pc09wZW4oKSkgeworCQlvcGVuYWJsZVBhcmVudC5nZW5lcmF0ZUluZm9zKG9wZW5hYmxlUGFyZW50LmNyZWF0ZUVsZW1lbnRJbmZvKCksIG5ld0VsZW1lbnRzLCBtb25pdG9yKTsKKwl9Cit9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlRWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlRWxlbWVudEluZm8uamF2YQppbmRleCAwYjM1ZjVjLi5kZTUzM2E5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZUVsZW1lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGVFbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDE4ICsxNiw2NSBAQAogcHVibGljIGNsYXNzIE9wZW5hYmxlRWxlbWVudEluZm8gZXh0ZW5kcyBKYXZhRWxlbWVudEluZm8gewogCiAJLyoqCisJICogQ29sbGVjdGlvbiBvZiBoYW5kbGVzIG9mIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGlzCisJICogb2JqZWN0LiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgZWxlbWVudCBoYXMKKwkgKiBubyBjaGlsZHJlbi4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKKwkKKwkvKioKIAkgKiBJcyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZWxlbWVudCBrbm93bgogCSAqIEBzZWUgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIGlzU3RydWN0dXJlS25vd24gPSBmYWxzZTsKIAorCXB1YmxpYyB2b2lkIGFkZENoaWxkKElKYXZhRWxlbWVudCBjaGlsZCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkgeworCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y2hpbGR9OworCQl9IGVsc2UgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICh0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhjaGlsZCkpCisJCQkJCXJldHVybjsgLy8gYWxyZWFkeSBpbmNsdWRlZAorCQkJfQorCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNoaWxkcmVuLCAwLCB0aGlzLmNoaWxkcmVuID0gbmV3IElKYXZhRWxlbWVudFtsZW5ndGgrMV0sIDAsIGxlbmd0aCk7CisJCQl0aGlzLmNoaWxkcmVuW2xlbmd0aF0gPSBjaGlsZDsKKwkJfQorCX0KKworCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKKwkJcmV0dXJuIHRoaXMuY2hpbGRyZW47CisJfQorCQogCS8qKgogCSAqIEBzZWUgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB7CiAJCXJldHVybiB0aGlzLmlzU3RydWN0dXJlS25vd247CiAJfQotCQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoSUphdmFFbGVtZW50IGNoaWxkKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHRoaXMuY2hpbGRyZW5baV07CisJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2hpbGQpKSB7CisJCQkJaWYgKGxlbmd0aCA9PSAxKSB7CisJCQkJCXRoaXMuY2hpbGRyZW4gPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKKwkJCQl9IGVsc2UgeworCQkJCQlJSmF2YUVsZW1lbnRbXSBuZXdDaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoLTFdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hpbGRyZW4sIDAsIG5ld0NoaWxkcmVuICwgMCwgaSk7CisJCQkJCWlmIChpIDwgbGVuZ3RoLTEpCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hpbGRyZW4sIGkrMSwgbmV3Q2hpbGRyZW4sIGksIGxlbmd0aC0xLWkpOworCQkJCQl0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oSUphdmFFbGVtZW50W10gY2hpbGRyZW4pIHsKKwkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworCX0KKwogCS8qKgogCSAqIFNldHMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZWxlbWVudCBrbm93bgogCSAqIEBzZWUgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhCmluZGV4IDgwYzIwZjguLmQwZWMxNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PdmVyZmxvd2luZ0xSVUNhY2hlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogICoJZWxlbWVudHMgd2hpY2ggYXJlIGV4cGxpY2l0bHkgcmVtb3ZlZC4KICAqCiAgKgk8cD5JZiB0aGUgY2FjaGUgY2Fubm90IHJlbW92ZSBlbm91Z2ggb2xkIGVsZW1lbnRzIHRvIGFkZCBuZXcgZWxlbWVudHMKLSAqCWl0IHdpbGwgZ3JvdyBiZXlvbmQgPGNvZGU+ZlNwYWNlTGltaXQ8L2NvZGU+LiBMYXRlciwgaXQgd2lsbCBhdHRlbXB0IHRvIAorICoJaXQgd2lsbCBncm93IGJleW9uZCA8Y29kZT5mU3BhY2VMaW1pdDwvY29kZT4uIExhdGVyLCBpdCB3aWxsIGF0dGVtcHQgdG8KICAqCXNoaW5rIGJhY2sgdG8gdGhlIG1heGltdW0gc3BhY2UgbGltaXQuCiAgKgogICoJVGhlIG1ldGhvZCA8Y29kZT5jbG9zZTwvY29kZT4gc2hvdWxkIGF0dGVtcHQgdG8gY2xvc2UgdGhlIGVsZW1lbnQuICBJZgpAQCAtMzYsNDcgKzM2LDQ3IEBACiAgKgk8Y29kZT5zZXRTcGFjZUxpbWl0PC9jb2RlPi4gIEV4cGxpY2l0bHkgY2FsbGluZyB0aGUgPGNvZGU+c2hyaW5rPC9jb2RlPiBtZXRob2QKICAqCXdpbGwgYWxzbyBjYXVzZSB0aGUgY2FjaGUgdG8gYXR0ZW1wdCB0byBzaHJpbmsuCiAgKgotICoJPHA+VGhlIGNhY2hlIGNhbGN1bGF0ZXMgdGhlIHVzZWQgc3BhY2Ugb2YgYWxsIGVsZW1lbnRzIHdoaWNoIGltcGxlbWVudCAKKyAqCTxwPlRoZSBjYWNoZSBjYWxjdWxhdGVzIHRoZSB1c2VkIHNwYWNlIG9mIGFsbCBlbGVtZW50cyB3aGljaCBpbXBsZW1lbnQKICAqCTxjb2RlPklMUlVDYWNoZWFibGU8L2NvZGU+LiAgQWxsIG90aGVyIGVsZW1lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIG9mIHNpemUgb25lLgogICoKICAqCTxwPlVzZSB0aGUgPGNvZGU+I3BlZWsoT2JqZWN0KTwvY29kZT4gYW5kIDxjb2RlPiNkaXNhYmxlVGltZXN0YW1wcygpPC9jb2RlPiBtZXRob2QgdG8KICAqCWNpcmN1bXZlbnQgdGhlIHRpbWVzdGFtcCBmZWF0dXJlIG9mIHRoZSBjYWNoZS4gIFRoaXMgZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCi0gKglvbmx5IHdoZW4gdGhlIDxjb2RlPiNjbG9zZShMUlVDYWNoZUVudHJ5KTwvY29kZT4gbWV0aG9kIGNhdXNlcyBjaGFuZ2VzIHRvIHRoZSBjYWNoZS4gIAotICoJRm9yIGV4YW1wbGUsIGlmIGEgcGFyZW50IGNsb3NlcyBpdHMgY2hpbGRyZW4gd2hlbiA8L2NvZGU+I2Nsb3NlKExSVUNhY2hlRW50cnkpPC9jb2RlPiBpcyBjYWxsZWQsIAotICoJaXQgc2hvdWxkIGJlIGNhcmVmdWwgbm90IHRvIGNoYW5nZSB0aGUgTFJVIGxpbmtlZCBsaXN0LiAgSXQgY2FuIGJlIHN1cmUgaXQgaXMgbm90IGNhdXNpbmcgCisgKglvbmx5IHdoZW4gdGhlIDxjb2RlPiNjbG9zZShMUlVDYWNoZUVudHJ5KTwvY29kZT4gbWV0aG9kIGNhdXNlcyBjaGFuZ2VzIHRvIHRoZSBjYWNoZS4KKyAqCUZvciBleGFtcGxlLCBpZiBhIHBhcmVudCBjbG9zZXMgaXRzIGNoaWxkcmVuIHdoZW4gPC9jb2RlPiNjbG9zZShMUlVDYWNoZUVudHJ5KTwvY29kZT4gaXMgY2FsbGVkLAorICoJaXQgc2hvdWxkIGJlIGNhcmVmdWwgbm90IHRvIGNoYW5nZSB0aGUgTFJVIGxpbmtlZCBsaXN0LiAgSXQgY2FuIGJlIHN1cmUgaXQgaXMgbm90IGNhdXNpbmcKICAqCXByb2JsZW1zIGJ5IGNhbGxpbmcgPGNvZGU+I3BlZWsoT2JqZWN0KTwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT4jZ2V0KE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KLSAqCQorICoKICAqCUBzZWUgTFJVQ2FjaGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE92ZXJmbG93aW5nTFJVQ2FjaGUgZXh0ZW5kcyBMUlVDYWNoZSB7CiAJLyoqCiAJICogSW5kaWNhdGVzIGlmIHRoZSBjYWNoZSBoYXMgYmVlbiBvdmVyIGZpbGxlZCBhbmQgYnkgaG93IG11Y2guCiAJICovCi0JcHJvdGVjdGVkIGludCBmT3ZlcmZsb3cgPSAwOworCXByb3RlY3RlZCBpbnQgb3ZlcmZsb3cgPSAwOwogCS8qKgogCSAqCUluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aW1lc3RhbXBzIHNob3VsZCBiZSB1cGRhdGVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZlRpbWVzdGFtcHNPbiA9IHRydWU7CisJcHJvdGVjdGVkIGJvb2xlYW4gdGltZXN0YW1wc09uID0gdHJ1ZTsKIAkvKioKIAkgKglJbmRpY2F0ZXMgaG93IG11Y2ggc3BhY2Ugc2hvdWxkIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBjYWNoZSBvdmVyZmxvd3MuCiAJICoJSW5pdGFsIGxvYWQgZmFjdG9yIG9mIG9uZSB0aGlyZC4KIAkgKi8KLQlwcm90ZWN0ZWQgZG91YmxlIGZMb2FkRmFjdG9yID0gMC4zMzM7CisJcHJvdGVjdGVkIGRvdWJsZSBsb2FkRmFjdG9yID0gMC4zMzM7CiAvKioKLSAqIENyZWF0ZXMgYSBPdmVyZmxvd2luZ0xSVUNhY2hlLiAKKyAqIENyZWF0ZXMgYSBPdmVyZmxvd2luZ0xSVUNhY2hlLgogICogQHBhcmFtIHNpemUgU2l6ZSBsaW1pdCBvZiBjYWNoZS4KICAqLwogcHVibGljIE92ZXJmbG93aW5nTFJVQ2FjaGUoaW50IHNpemUpIHsKIAl0aGlzKHNpemUsIDApOwogfQogLyoqCi0gKiBDcmVhdGVzIGEgT3ZlcmZsb3dpbmdMUlVDYWNoZS4gCisgKiBDcmVhdGVzIGEgT3ZlcmZsb3dpbmdMUlVDYWNoZS4KICAqIEBwYXJhbSBzaXplIFNpemUgbGltaXQgb2YgY2FjaGUuCiAgKiBAcGFyYW0gb3ZlcmZsb3cgU2l6ZSBvZiB0aGUgb3ZlcmZsb3cuCiAgKi8KIHB1YmxpYyBPdmVyZmxvd2luZ0xSVUNhY2hlKGludCBzaXplLCBpbnQgb3ZlcmZsb3cpIHsKIAlzdXBlcihzaXplKTsKLQlmT3ZlcmZsb3cgPSBvdmVyZmxvdzsKKwl0aGlzLm92ZXJmbG93ID0gb3ZlcmZsb3c7CiB9CiAJLyoqCiAJICogUmV0dXJucyBhIG5ldyBjYWNoZSBjb250YWluaW5nIHRoZSBzYW1lIGNvbnRlbnRzLgpAQCAtODQsMTUgKzg0LDE1IEBACiAJICogQHJldHVybiBOZXcgY29weSBvZiB0aGlzIG9iamVjdC4KIAkgKi8KIAlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQkKLQkJT3ZlcmZsb3dpbmdMUlVDYWNoZSBuZXdDYWNoZSA9IChPdmVyZmxvd2luZ0xSVUNhY2hlKW5ld0luc3RhbmNlKGZTcGFjZUxpbWl0LCBmT3ZlcmZsb3cpOworCisJCU92ZXJmbG93aW5nTFJVQ2FjaGUgbmV3Q2FjaGUgPSAoT3ZlcmZsb3dpbmdMUlVDYWNoZSluZXdJbnN0YW5jZSh0aGlzLnNwYWNlTGltaXQsIHRoaXMub3ZlcmZsb3cpOwogCQlMUlVDYWNoZUVudHJ5IHFFbnRyeTsKLQkJCisKIAkJLyogUHJlc2VydmUgb3JkZXIgb2YgZW50cmllcyBieSBjb3B5aW5nIGZyb20gb2xkZXN0IHRvIG5ld2VzdCAqLwotCQlxRW50cnkgPSB0aGlzLmZFbnRyeVF1ZXVlVGFpbDsKKwkJcUVudHJ5ID0gdGhpcy5lbnRyeVF1ZXVlVGFpbDsKIAkJd2hpbGUgKHFFbnRyeSAhPSBudWxsKSB7Ci0JCQluZXdDYWNoZS5wcml2YXRlQWRkIChxRW50cnkuX2ZLZXksIHFFbnRyeS5fZlZhbHVlLCBxRW50cnkuX2ZTcGFjZSk7Ci0JCQlxRW50cnkgPSBxRW50cnkuX2ZQcmV2aW91czsKKwkJCW5ld0NhY2hlLnByaXZhdGVBZGQgKHFFbnRyeS5rZXksIHFFbnRyeS52YWx1ZSwgcUVudHJ5LnNwYWNlKTsKKwkJCXFFbnRyeSA9IHFFbnRyeS5wcmV2aW91czsKIAkJfQogCQlyZXR1cm4gbmV3Q2FjaGU7CiAJfQpAQCAtMTEwLDIyICsxMTAsMjIgQEAKIAkgKglyZWNlbnRseSB1c2VkIGZpcnN0LgogCSAqLwogCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJaWYgKGZFbnRyeVF1ZXVlID09IG51bGwpCisJCWlmICh0aGlzLmVudHJ5UXVldWUgPT0gbnVsbCkKIAkJCXJldHVybiBuZXcgTFJVQ2FjaGVFbnVtZXJhdG9yKG51bGwpOwotCQlMUlVDYWNoZUVudW1lcmF0b3IuTFJVRW51bWVyYXRvckVsZW1lbnQgaGVhZCA9IAotCQkJbmV3IExSVUNhY2hlRW51bWVyYXRvci5MUlVFbnVtZXJhdG9yRWxlbWVudChmRW50cnlRdWV1ZS5fZlZhbHVlKTsKLQkJTFJVQ2FjaGVFbnRyeSBjdXJyZW50RW50cnkgPSBmRW50cnlRdWV1ZS5fZk5leHQ7CisJCUxSVUNhY2hlRW51bWVyYXRvci5MUlVFbnVtZXJhdG9yRWxlbWVudCBoZWFkID0KKwkJCW5ldyBMUlVDYWNoZUVudW1lcmF0b3IuTFJVRW51bWVyYXRvckVsZW1lbnQodGhpcy5lbnRyeVF1ZXVlLnZhbHVlKTsKKwkJTFJVQ2FjaGVFbnRyeSBjdXJyZW50RW50cnkgPSB0aGlzLmVudHJ5UXVldWUubmV4dDsKIAkJTFJVQ2FjaGVFbnVtZXJhdG9yLkxSVUVudW1lcmF0b3JFbGVtZW50IGN1cnJlbnRFbGVtZW50ID0gaGVhZDsKIAkJd2hpbGUoY3VycmVudEVudHJ5ICE9IG51bGwpIHsKLQkJCWN1cnJlbnRFbGVtZW50LmZOZXh0ID0gbmV3IExSVUNhY2hlRW51bWVyYXRvci5MUlVFbnVtZXJhdG9yRWxlbWVudChjdXJyZW50RW50cnkuX2ZWYWx1ZSk7Ci0JCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmZOZXh0OwotCQkJCi0JCQljdXJyZW50RW50cnkgPSBjdXJyZW50RW50cnkuX2ZOZXh0OworCQkJY3VycmVudEVsZW1lbnQubmV4dCA9IG5ldyBMUlVDYWNoZUVudW1lcmF0b3IuTFJVRW51bWVyYXRvckVsZW1lbnQoY3VycmVudEVudHJ5LnZhbHVlKTsKKwkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQubmV4dDsKKworCQkJY3VycmVudEVudHJ5ID0gY3VycmVudEVudHJ5Lm5leHQ7CiAJCX0KIAkJcmV0dXJuIG5ldyBMUlVDYWNoZUVudW1lcmF0b3IoaGVhZCk7CiAJfQogCXB1YmxpYyBkb3VibGUgZmlsbGluZ1JhdGlvKCkgewotCQlyZXR1cm4gKGZDdXJyZW50U3BhY2UgKyBmT3ZlcmZsb3cpICogMTAwLjAgLyBmU3BhY2VMaW1pdDsKKwkJcmV0dXJuICh0aGlzLmN1cnJlbnRTcGFjZSArIHRoaXMub3ZlcmZsb3cpICogMTAwLjAgLyB0aGlzLnNwYWNlTGltaXQ7CiAJfQogCS8qKgogCSAqIEZvciBpbnRlcm5hbCB0ZXN0aW5nIG9ubHkuCkBAIC0xMzQsMjEgKzEzNCwyMSBAQAogCSAqIEByZXR1cm4gSGFzaHRhYmxlIG9mIGVudHJpZXMKIAkgKi8KIAlwdWJsaWMgamF2YS51dGlsLkhhc2h0YWJsZSBnZXRFbnRyeVRhYmxlKCkgewotCQlyZXR1cm4gZkVudHJ5VGFibGU7CisJCXJldHVybiB0aGlzLmVudHJ5VGFibGU7CiAJfQogLyoqCi0gKiBSZXR1cm5zIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGNhY2hlLiAgVGhlIGxvYWQgZmFjdG9yIGRldGVybWluZXMgaG93IAorICogUmV0dXJucyB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBjYWNoZS4gIFRoZSBsb2FkIGZhY3RvciBkZXRlcm1pbmVzIGhvdwogICogbXVjaCBzcGFjZSBpcyByZWNsYWltZWQgd2hlbiB0aGUgY2FjaGUgZXhjZWVkcyBpdHMgc3BhY2UgbGltaXQuCiAgKiBAcmV0dXJuIGRvdWJsZQogICovCiBwdWJsaWMgZG91YmxlIGdldExvYWRGYWN0b3IoKSB7Ci0JcmV0dXJuIGZMb2FkRmFjdG9yOworCXJldHVybiB0aGlzLmxvYWRGYWN0b3I7CiB9CiAJLyoqCiAJICoJQHJldHVybiBUaGUgc3BhY2UgYnkgd2hpY2ggdGhlIGNhY2hlIGhhcyBvdmVyZmxvd24uCiAJICovCiAJcHVibGljIGludCBnZXRPdmVyZmxvdygpIHsKLQkJcmV0dXJuIGZPdmVyZmxvdzsKKwkJcmV0dXJuIHRoaXMub3ZlcmZsb3c7CiAJfQogCS8qKgogCSAqIEVuc3VyZXMgdGhlcmUgaXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZnJlZSBzcGFjZSBpbiB0aGUgcmVjZWl2ZXIsCkBAIC0xNTksODYgKzE1OSw4NiBAQAogCSAqIEBwYXJhbSBzcGFjZSBBbW91bnQgb2Ygc3BhY2UgdG8gZnJlZSB1cAogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIG1ha2VTcGFjZShpbnQgc3BhY2UpIHsKLQkKLQkJaW50IGxpbWl0ID0gZlNwYWNlTGltaXQ7Ci0JCWlmIChmT3ZlcmZsb3cgPT0gMCAmJiBmQ3VycmVudFNwYWNlICsgc3BhY2UgPD0gbGltaXQpIHsKKworCQlpbnQgbGltaXQgPSB0aGlzLnNwYWNlTGltaXQ7CisJCWlmICh0aGlzLm92ZXJmbG93ID09IDAgJiYgdGhpcy5jdXJyZW50U3BhY2UgKyBzcGFjZSA8PSBsaW1pdCkgewogCQkJLyogaWYgc3BhY2UgaXMgYWxyZWFkeSBhdmFpbGFibGUgKi8KIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCisKIAkJLyogRnJlZSB1cCBzcGFjZSBieSByZW1vdmluZyBvbGRlc3QgZW50cmllcyAqLwotCQlpbnQgc3BhY2VOZWVkZWQgPSAoaW50KSgoMSAtIGZMb2FkRmFjdG9yKSAqIGxpbWl0KTsKKwkJaW50IHNwYWNlTmVlZGVkID0gKGludCkoKDEgLSB0aGlzLmxvYWRGYWN0b3IpICogbGltaXQpOwogCQlzcGFjZU5lZWRlZCA9IChzcGFjZU5lZWRlZCA+IHNwYWNlKSA/IHNwYWNlTmVlZGVkIDogc3BhY2U7Ci0JCUxSVUNhY2hlRW50cnkgZW50cnkgPSBmRW50cnlRdWV1ZVRhaWw7Ci0JCisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSB0aGlzLmVudHJ5UXVldWVUYWlsOworCiAJCXRyeSB7CiAJCQkvLyBkaXNhYmxlIHRpbWVzdGFtcHMgdXBkYXRlIHdoaWxlIG1ha2luZyBzcGFjZSBzbyB0aGF0IHRoZSBwcmV2aW91cyBhbmQgbmV4dCBsaW5rcyBhcmUgbm90IGNoYW5nZWQKIAkJCS8vIChieSBhIGNhbGwgdG8gZ2V0KE9iamVjdCkgZm9yIGV4YW1wbGUpCi0JCQlmVGltZXN0YW1wc09uID0gZmFsc2U7Ci0JCQkKLQkJCXdoaWxlIChmQ3VycmVudFNwYWNlICsgc3BhY2VOZWVkZWQgPiBsaW1pdCAmJiBlbnRyeSAhPSBudWxsKSB7CisJCQl0aGlzLnRpbWVzdGFtcHNPbiA9IGZhbHNlOworCisJCQl3aGlsZSAodGhpcy5jdXJyZW50U3BhY2UgKyBzcGFjZU5lZWRlZCA+IGxpbWl0ICYmIGVudHJ5ICE9IG51bGwpIHsKIAkJCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeShlbnRyeSwgZmFsc2UsIGZhbHNlKTsKLQkJCQllbnRyeSA9IGVudHJ5Ll9mUHJldmlvdXM7CisJCQkJZW50cnkgPSBlbnRyeS5wcmV2aW91czsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCWZUaW1lc3RhbXBzT24gPSB0cnVlOworCQkJdGhpcy50aW1lc3RhbXBzT24gPSB0cnVlOwogCQl9Ci0JCisKIAkJLyogY2hlY2sgYWdhaW4sIHNpbmNlIHdlIG1heSBoYXZlIGFxdWlyZWQgZW5vdWdoIHNwYWNlICovCi0JCWlmIChmQ3VycmVudFNwYWNlICsgc3BhY2UgPD0gbGltaXQpIHsKLQkJCWZPdmVyZmxvdyA9IDA7CisJCWlmICh0aGlzLmN1cnJlbnRTcGFjZSArIHNwYWNlIDw9IGxpbWl0KSB7CisJCQl0aGlzLm92ZXJmbG93ID0gMDsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCisKIAkJLyogdXBkYXRlIGZPdmVyZmxvdyAqLwotCQlmT3ZlcmZsb3cgPSBmQ3VycmVudFNwYWNlICsgc3BhY2UgLSBsaW1pdDsKKwkJdGhpcy5vdmVyZmxvdyA9IHRoaXMuY3VycmVudFNwYWNlICsgc3BhY2UgLSBsaW1pdDsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNpZXZlci4KIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTFJVQ2FjaGUgbmV3SW5zdGFuY2UoaW50IHNpemUsIGludCBvdmVyZmxvdyk7CisJcHJvdGVjdGVkIGFic3RyYWN0IExSVUNhY2hlIG5ld0luc3RhbmNlKGludCBzaXplLCBpbnQgbmV3T3ZlcmZsb3cpOwogLyoqCiAgKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5CiAgKi8KIHB1YmxpYyB2b2lkIHByaW50U3RhdHMoKSB7CiAJaW50IGZvcndhcmRMaXN0TGVuZ3RoID0gMDsKLQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gZkVudHJ5UXVldWU7CisJTFJVQ2FjaGVFbnRyeSBlbnRyeSA9IHRoaXMuZW50cnlRdWV1ZTsKIAl3aGlsZShlbnRyeSAhPSBudWxsKSB7CiAJCWZvcndhcmRMaXN0TGVuZ3RoKys7Ci0JCWVudHJ5ID0gZW50cnkuX2ZOZXh0OworCQllbnRyeSA9IGVudHJ5Lm5leHQ7CiAJfQogCVN5c3RlbS5vdXQucHJpbnRsbigiRm9yd2FyZCBsZW5ndGg6ICIgKyBmb3J3YXJkTGlzdExlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkKKwogCWludCBiYWNrd2FyZExpc3RMZW5ndGggPSAwOwotCWVudHJ5ID0gZkVudHJ5UXVldWVUYWlsOworCWVudHJ5ID0gdGhpcy5lbnRyeVF1ZXVlVGFpbDsKIAl3aGlsZShlbnRyeSAhPSBudWxsKSB7CiAJCWJhY2t3YXJkTGlzdExlbmd0aCsrOwotCQllbnRyeSA9IGVudHJ5Ll9mUHJldmlvdXM7CisJCWVudHJ5ID0gZW50cnkucHJldmlvdXM7CiAJfQogCVN5c3RlbS5vdXQucHJpbnRsbigiQmFja3dhcmQgbGVuZ3RoOiAiICsgYmFja3dhcmRMaXN0TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAogCi0JRW51bWVyYXRpb24ga2V5cyA9IGZFbnRyeVRhYmxlLmtleXMoKTsKKwlFbnVtZXJhdGlvbiBrZXlzID0gdGhpcy5lbnRyeVRhYmxlLmtleXMoKTsKIAljbGFzcyBUZW1wIHsKLQkJcHVibGljIENsYXNzIGZDbGFzczsKLQkJcHVibGljIGludCBmQ291bnQ7CisJCXB1YmxpYyBDbGFzcyBjbGF6ejsKKwkJcHVibGljIGludCBjb3VudDsKIAkJcHVibGljIFRlbXAoQ2xhc3MgYUNsYXNzKSB7Ci0JCQlmQ2xhc3MgPSBhQ2xhc3M7Ci0JCQlmQ291bnQgPSAxOworCQkJdGhpcy5jbGF6eiA9IGFDbGFzczsKKwkJCXRoaXMuY291bnQgPSAxOwogCQl9CiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNsYXNzOiAiICsgZkNsYXNzICsgIiBoYXMgIiArIGZDb3VudCArICIgZW50cmllcy4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuICJDbGFzczogIiArIHRoaXMuY2xhenogKyAiIGhhcyAiICsgdGhpcy5jb3VudCArICIgZW50cmllcy4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCWphdmEudXRpbC5IYXNoTWFwIGggPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKIAl3aGlsZShrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCWVudHJ5ID0gKExSVUNhY2hlRW50cnkpZkVudHJ5VGFibGUuZ2V0KGtleXMubmV4dEVsZW1lbnQoKSk7Ci0JCUNsYXNzIGtleSA9IGVudHJ5Ll9mVmFsdWUuZ2V0Q2xhc3MoKTsKKwkJZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSl0aGlzLmVudHJ5VGFibGUuZ2V0KGtleXMubmV4dEVsZW1lbnQoKSk7CisJCUNsYXNzIGtleSA9IGVudHJ5LnZhbHVlLmdldENsYXNzKCk7CiAJCVRlbXAgdCA9IChUZW1wKWguZ2V0KGtleSk7CiAJCWlmICh0ID09IG51bGwpIHsKIAkJCWgucHV0KGtleSwgbmV3IFRlbXAoa2V5KSk7CiAJCX0gZWxzZSB7Ci0JCQl0LmZDb3VudCsrOworCQkJdC5jb3VudCsrOwogCQl9CiAJfQogCkBAIC0yNTAsNyArMjUwLDcgQEAKIAkgKglSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIHRoZSBlbnRyeSBxdWV1ZS4KIAkgKglDYWxscyA8Y29kZT5wcml2YXRlUmVtb3ZlRW50cnk8L2NvZGU+IHdpdGggdGhlIGV4dGVybmFsIGZ1bmN0aW9uYWxpdHkgZW5hYmxlZC4KIAkgKgotCSAqIEBwYXJhbSBzaHVmZmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBqdXN0IHNodWZmbGluZyB0aGUgcXVldWUgCisJICogQHBhcmFtIHNodWZmbGUgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZQogCSAqIChpbiB3aGljaCBjYXNlLCB0aGUgZW50cnkgdGFibGUgaXMgbm90IG1vZGlmaWVkKS4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlUmVtb3ZlRW50cnkgKExSVUNhY2hlRW50cnkgZW50cnksIGJvb2xlYW4gc2h1ZmZsZSkgewpAQCAtMjYxLDQ1ICsyNjEsNDUgQEAKICAqCXdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgY2FuIGJlIHJlbW92ZWQuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBjbG9zZWQKICAqCXRoZSBlbGVtZW50IGl0IGlzIHRyeWluZyB0byByZW1vdmUgKG9yIHdpbGwgY2xvc2UgaXQgcHJvbXB0bHkpLgogICoKLSAqCUlmIDxpPmV4dGVybmFsPC9pPiBpcyBmYWxzZSwgYW5kIHRoZSBlbnRyeSBjb3VsZCBub3QgYmUgY2xvc2VkLCBpdCBpcyBub3QgcmVtb3ZlZCBhbmQgdGhlIAorICoJSWYgPGk+ZXh0ZXJuYWw8L2k+IGlzIGZhbHNlLCBhbmQgdGhlIGVudHJ5IGNvdWxkIG5vdCBiZSBjbG9zZWQsIGl0IGlzIG5vdCByZW1vdmVkIGFuZCB0aGUKICAqCXBvaW50ZXJzIGFyZSBub3QgY2hhbmdlZC4KICAqCi0gKglAcGFyYW0gc2h1ZmZsZSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUganVzdCBzaHVmZmxpbmcgdGhlIHF1ZXVlIAorICoJQHBhcmFtIHNodWZmbGUgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZQogICoJKGluIHdoaWNoIGNhc2UsIHRoZSBlbnRyeSB0YWJsZSBpcyBub3QgbW9kaWZpZWQpLgogICovCiBwcm90ZWN0ZWQgdm9pZCBwcml2YXRlUmVtb3ZlRW50cnkoTFJVQ2FjaGVFbnRyeSBlbnRyeSwgYm9vbGVhbiBzaHVmZmxlLCBib29sZWFuIGV4dGVybmFsKSB7CiAKIAlpZiAoIXNodWZmbGUpIHsKIAkJaWYgKGV4dGVybmFsKSB7Ci0JCQlmRW50cnlUYWJsZS5yZW1vdmUoZW50cnkuX2ZLZXkpOwkJCQotCQkJZkN1cnJlbnRTcGFjZSAtPSBlbnRyeS5fZlNwYWNlOworCQkJdGhpcy5lbnRyeVRhYmxlLnJlbW92ZShlbnRyeS5rZXkpOworCQkJdGhpcy5jdXJyZW50U3BhY2UgLT0gZW50cnkuc3BhY2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIWNsb3NlKGVudHJ5KSkgcmV0dXJuOwogCQkJLy8gYnVmZmVyIGNsb3NlIHdpbGwgcmVjdXJzaXZlbHkgY2FsbCAjcHJpdmF0ZVJlbW92ZUVudHJ5IHdpdGggZXh0ZXJuYWw9PXRydWUKIAkJCS8vIHRodXMgZW50cnkgd2lsbCBhbHJlYWR5IGJlIHJlbW92ZWQgaWYgcmVhY2hpbmcgdGhpcyBwb2ludC4KLQkJCWlmIChmRW50cnlUYWJsZS5nZXQoZW50cnkuX2ZLZXkpID09IG51bGwpeworCQkJaWYgKHRoaXMuZW50cnlUYWJsZS5nZXQoZW50cnkua2V5KSA9PSBudWxsKXsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCS8vIGJhc2ljIHJlbW92YWwKLQkJCQlmRW50cnlUYWJsZS5yZW1vdmUoZW50cnkuX2ZLZXkpOwkJCQotCQkJCWZDdXJyZW50U3BhY2UgLT0gZW50cnkuX2ZTcGFjZTsKKwkJCQl0aGlzLmVudHJ5VGFibGUucmVtb3ZlKGVudHJ5LmtleSk7CisJCQkJdGhpcy5jdXJyZW50U3BhY2UgLT0gZW50cnkuc3BhY2U7CiAJCQl9CiAJCX0KIAl9Ci0JTFJVQ2FjaGVFbnRyeSBwcmV2aW91cyA9IGVudHJ5Ll9mUHJldmlvdXM7Ci0JTFJVQ2FjaGVFbnRyeSBuZXh0ID0gZW50cnkuX2ZOZXh0OwotCQkKKwlMUlVDYWNoZUVudHJ5IHByZXZpb3VzID0gZW50cnkucHJldmlvdXM7CisJTFJVQ2FjaGVFbnRyeSBuZXh0ID0gZW50cnkubmV4dDsKKwogCS8qIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCBlbnRyeSAqLwogCWlmIChwcmV2aW91cyA9PSBudWxsKSB7Ci0JCWZFbnRyeVF1ZXVlID0gbmV4dDsKKwkJdGhpcy5lbnRyeVF1ZXVlID0gbmV4dDsKIAl9IGVsc2UgewotCQlwcmV2aW91cy5fZk5leHQgPSBuZXh0OworCQlwcmV2aW91cy5uZXh0ID0gbmV4dDsKIAl9CiAJLyogaWYgdGhpcyB3YXMgdGhlIGxhc3QgZW50cnkgKi8KIAlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCWZFbnRyeVF1ZXVlVGFpbCA9IHByZXZpb3VzOworCQl0aGlzLmVudHJ5UXVldWVUYWlsID0gcHJldmlvdXM7CiAJfSBlbHNlIHsKLQkJbmV4dC5fZlByZXZpb3VzID0gcHJldmlvdXM7CisJCW5leHQucHJldmlvdXMgPSBwcmV2aW91czsKIAl9CiB9CiAJLyoqCkBAIC0zMTEsNDEgKzMxMSw0MSBAQAogCSAqLwogCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewogCQkvKiBhdHRlbXB0IHRvIHJpZCBvdXJzZWx2ZXMgb2YgdGhlIG92ZXJmbG93LCBpZiB0aGVyZSBpcyBhbnkgKi8KLQkJaWYgKGZPdmVyZmxvdyA+IDApCisJCWlmICh0aGlzLm92ZXJmbG93ID4gMCkKIAkJCXNocmluaygpOwotCQkJCisKIAkJLyogQ2hlY2sgd2hldGhlciB0aGVyZSdzIGFuIGVudHJ5IGluIHRoZSBjYWNoZSAqLwogCQlpbnQgbmV3U3BhY2UgPSBzcGFjZUZvcih2YWx1ZSk7Ci0JCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0IChrZXkpOwotCQkKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeSA9IChMUlVDYWNoZUVudHJ5KSB0aGlzLmVudHJ5VGFibGUuZ2V0IChrZXkpOworCiAJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkKKwogCQkJLyoqCiAJCQkgKiBSZXBsYWNlIHRoZSBlbnRyeSBpbiB0aGUgY2FjaGUgaWYgaXQgd291bGQgbm90IG92ZXJmbG93Ci0JCQkgKiB0aGUgY2FjaGUuICBPdGhlcndpc2UgZmx1c2ggdGhlIGVudHJ5IGFuZCByZS1hZGQgaXQgc28gYXMgCisJCQkgKiB0aGUgY2FjaGUuICBPdGhlcndpc2UgZmx1c2ggdGhlIGVudHJ5IGFuZCByZS1hZGQgaXQgc28gYXMKIAkJCSAqIHRvIGtlZXAgY2FjaGUgd2l0aGluIGJ1ZGdldAogCQkJICovCi0JCQlpbnQgb2xkU3BhY2UgPSBlbnRyeS5fZlNwYWNlOwotCQkJaW50IG5ld1RvdGFsID0gZkN1cnJlbnRTcGFjZSAtIG9sZFNwYWNlICsgbmV3U3BhY2U7Ci0JCQlpZiAobmV3VG90YWwgPD0gZlNwYWNlTGltaXQpIHsKKwkJCWludCBvbGRTcGFjZSA9IGVudHJ5LnNwYWNlOworCQkJaW50IG5ld1RvdGFsID0gdGhpcy5jdXJyZW50U3BhY2UgLSBvbGRTcGFjZSArIG5ld1NwYWNlOworCQkJaWYgKG5ld1RvdGFsIDw9IHRoaXMuc3BhY2VMaW1pdCkgewogCQkJCXVwZGF0ZVRpbWVzdGFtcCAoZW50cnkpOwotCQkJCWVudHJ5Ll9mVmFsdWUgPSB2YWx1ZTsKLQkJCQllbnRyeS5fZlNwYWNlID0gbmV3U3BhY2U7Ci0JCQkJZkN1cnJlbnRTcGFjZSA9IG5ld1RvdGFsOwotCQkJCWZPdmVyZmxvdyA9IDA7CisJCQkJZW50cnkudmFsdWUgPSB2YWx1ZTsKKwkJCQllbnRyeS5zcGFjZSA9IG5ld1NwYWNlOworCQkJCXRoaXMuY3VycmVudFNwYWNlID0gbmV3VG90YWw7CisJCQkJdGhpcy5vdmVyZmxvdyA9IDA7CiAJCQkJcmV0dXJuIHZhbHVlOwogCQkJfSBlbHNlIHsKIAkJCQlwcml2YXRlUmVtb3ZlRW50cnkgKGVudHJ5LCBmYWxzZSwgZmFsc2UpOwogCQkJfQogCQl9Ci0JCQorCiAJCS8vIGF0dGVtcHQgdG8gbWFrZSBuZXcgc3BhY2UKIAkJbWFrZVNwYWNlKG5ld1NwYWNlKTsKLQkJCisKIAkJLy8gYWRkIHdpdGhvdXQgd29ycmluZyBhYm91dCBzcGFjZSwgaXQgd2lsbAogCQkvLyBiZSBoYW5kbGVkIGxhdGVyIGluIGEgbWFrZVNwYWNlIGNhbGwKIAkJcHJpdmF0ZUFkZCAoa2V5LCB2YWx1ZSwgbmV3U3BhY2UpOwotCQkKKwogCQlyZXR1cm4gdmFsdWU7CiAJfQogCS8qKgpAQCAtMzU5LDE2ICszNTksMTYgQEAKIAkJcmV0dXJuIHJlbW92ZUtleShrZXkpOwogCX0KIC8qKgotICogU2V0cyB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBjYWNoZS4gIFRoZSBsb2FkIGZhY3RvciBkZXRlcm1pbmVzIGhvdyAKKyAqIFNldHMgdGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgY2FjaGUuICBUaGUgbG9hZCBmYWN0b3IgZGV0ZXJtaW5lcyBob3cKICAqIG11Y2ggc3BhY2UgaXMgcmVjbGFpbWVkIHdoZW4gdGhlIGNhY2hlIGV4Y2VlZHMgaXRzIHNwYWNlIGxpbWl0LgogICogQHBhcmFtIG5ld0xvYWRGYWN0b3IgZG91YmxlCiAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSBuZXcgbG9hZCBmYWN0b3IgaXMgbm90IGluICgwLjAsIDEuMF0KICAqLwogcHVibGljIHZvaWQgc2V0TG9hZEZhY3Rvcihkb3VibGUgbmV3TG9hZEZhY3RvcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAJaWYobmV3TG9hZEZhY3RvciA8PSAxLjAgJiYgbmV3TG9hZEZhY3RvciA+IDAuMCkKLQkJZkxvYWRGYWN0b3IgPSBuZXdMb2FkRmFjdG9yOworCQl0aGlzLmxvYWRGYWN0b3IgPSBuZXdMb2FkRmFjdG9yOwogCWVsc2UKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5jYWNoZV9pbnZhbGlkTG9hZEZhY3Rvcik7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmNhY2hlX2ludmFsaWRMb2FkRmFjdG9yKTsKIH0KIAkvKioKIAkgKiBTZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSB0aGF0IHRoZSBjYWNoZSBjYW4gc3RvcmUKQEAgLTM3NiwxNyArMzc2LDE3IEBACiAJICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiB1bml0cyBvZiBjYWNoZSBzcGFjZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFNwYWNlTGltaXQoaW50IGxpbWl0KSB7Ci0JCWlmIChsaW1pdCA8IGZTcGFjZUxpbWl0KSB7Ci0JCQltYWtlU3BhY2UoZlNwYWNlTGltaXQgLSBsaW1pdCk7CisJCWlmIChsaW1pdCA8IHRoaXMuc3BhY2VMaW1pdCkgeworCQkJbWFrZVNwYWNlKHRoaXMuc3BhY2VMaW1pdCAtIGxpbWl0KTsKIAkJfQotCQlmU3BhY2VMaW1pdCA9IGxpbWl0OworCQl0aGlzLnNwYWNlTGltaXQgPSBsaW1pdDsKIAl9CiAJLyoqCiAJICogQXR0ZW1wdHMgdG8gc2hyaW5rIHRoZSBjYWNoZSBpZiBpdCBoYXMgb3ZlcmZsb3duLgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FjaGUgc2hyaW5rcyB0byBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPGNvZGU+ZlNwYWNlTGltaXQ8L2NvZGU+LgogCSAqLwogCXB1YmxpYyBib29sZWFuIHNocmluaygpIHsKLQkJaWYgKGZPdmVyZmxvdyA+IDApCisJCWlmICh0aGlzLm92ZXJmbG93ID4gMCkKIAkJCXJldHVybiBtYWtlU3BhY2UoMCk7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTM5NSwyMiArMzk1LDIyIEBACiAgKiBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCiAgKi8KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuIAorCXJldHVybgogCQl0b1N0cmluZ0ZpbGxpbmdSYXRpb24oIk92ZXJmbG93aW5nTFJVQ2FjaGUgIikgKyAvLyROT04tTkxTLTEkCiAJCXRvU3RyaW5nQ29udGVudHMoKTsKIH0KIC8qKgotICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzIAorICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzCiAgKiBrZXB0IGluIGNvcnJlY3Qgb3JkZXIuICBUaGUgZW50cnkgbXVzdCBleGlzdC4KICAqCiAgKiA8cD5UaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGltZXN0YW1wcyBoYXZlIGJlZW4gZGlzYWJsZWQuCiAgKi8KIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVRpbWVzdGFtcChMUlVDYWNoZUVudHJ5IGVudHJ5KSB7Ci0JaWYgKGZUaW1lc3RhbXBzT24pIHsKLQkJZW50cnkuX2ZUaW1lc3RhbXAgPSBmVGltZXN0YW1wQ291bnRlcisrOwotCQlpZiAoZkVudHJ5UXVldWUgIT0gZW50cnkpIHsKKwlpZiAodGhpcy50aW1lc3RhbXBzT24pIHsKKwkJZW50cnkudGltZXN0YW1wID0gdGhpcy50aW1lc3RhbXBDb3VudGVyKys7CisJCWlmICh0aGlzLmVudHJ5UXVldWUgIT0gZW50cnkpIHsKIAkJCXRoaXMucHJpdmF0ZVJlbW92ZUVudHJ5KGVudHJ5LCB0cnVlKTsKLQkJCXRoaXMucHJpdmF0ZUFkZEVudHJ5KGVudHJ5LCB0cnVlKTsKKwkJCXByaXZhdGVBZGRFbnRyeShlbnRyeSwgdHJ1ZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDRkMzFjNjUuLmRmOGE3NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDE2ICsxMSwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKIAogLyoqCiAgKiBAc2VlIElQYWNrYWdlRGVjbGFyYXRpb24KICAqLwogCi0vKiBwYWNrYWdlICovIGNsYXNzIFBhY2thZ2VEZWNsYXJhdGlvbiBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJUGFja2FnZURlY2xhcmF0aW9uIHsKLQkKK3B1YmxpYyBjbGFzcyBQYWNrYWdlRGVjbGFyYXRpb24gZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50IGltcGxlbWVudHMgSVBhY2thZ2VEZWNsYXJhdGlvbiB7CisKIAlTdHJpbmcgbmFtZTsKLQkKKwogcHJvdGVjdGVkIFBhY2thZ2VEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgcGFyZW50LCBTdHJpbmcgbmFtZSkgewogCXN1cGVyKHBhcmVudCk7CiAJdGhpcy5uYW1lID0gbmFtZTsKQEAgLTQ0LDYgKzQzLDEzIEBACiBwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgewogCXJldHVybiBKYXZhRWxlbWVudC5KRU1fUEFDS0FHRURFQ0xBUkFUSU9OOwogfQorLyoqCisgKiBAc2VlIElQYWNrYWdlRGVjbGFyYXRpb24jZ2V0TmFtZVJhbmdlKCkKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBbm5vdGF0YWJsZUluZm8gaW5mbyA9IChBbm5vdGF0YWJsZUluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJcmV0dXJuIGluZm8uZ2V0TmFtZVJhbmdlKCk7Cit9CiAvKgogICogQHNlZSBKYXZhRWxlbWVudCNnZXRQcmltYXJ5RWxlbWVudChib29sZWFuKQogICovCkBAIC01Niw3ICs2Miw3IEBACiAgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKICAqLwogcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvLCBib29sZWFuIHNob3dSZXNvbHZlZEluZm8pIHsKLQlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwogCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIik7IC8vJE5PTi1OTFMtMSQKIAl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAlpZiAoaW5mbyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCmluZGV4IGYzNzRjNDMuLjM1ZmIzNGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CkBAIC01Myw3ICs1NCw3IEBACiAJICogQ29uc3RhbnQgZW1wdHkgbGlzdCBvZiBjb21waWxhdGlvbiB1bml0cwogCSAqLwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSUNvbXBpbGF0aW9uVW5pdFtdIE5PX0NPTVBJTEFUSU9OX1VOSVRTID0gbmV3IElDb21waWxhdGlvblVuaXRbXSB7fTsKLQkKKwogCXB1YmxpYyBTdHJpbmdbXSBuYW1lczsKIAogcHJvdGVjdGVkIFBhY2thZ2VGcmFnbWVudChQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZ1tdIG5hbWVzKSB7CkBAIC02NCwxOCArNjUsOSBAQAogICogQHNlZSBPcGVuYWJsZQogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFN0cnVjdHVyZShPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIElQcm9ncmVzc01vbml0b3IgcG0sIE1hcCBuZXdFbGVtZW50cywgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkvLyBjaGVjayB3aGV0aGVyIHRoaXMgcGtnIGNhbiBiZSBvcGVuZWQKLQlpZiAoIXVuZGVybHlpbmdSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwotCQotCS8vIGNoZWNrIHRoYXQgaXQgaXMgbm90IGV4Y2x1ZGVkIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTc3KQotCWludCBraW5kID0gZ2V0S2luZCgpOwotCWlmIChraW5kID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICYmIFV0aWwuaXNFeGNsdWRlZCh0aGlzKSkgCi0JCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKLQotCiAJLy8gYWRkIGNvbXBpbGF0aW9uIHVuaXRzL2NsYXNzIGZpbGVzIGZyb20gcmVzb3VyY2VzCiAJSGFzaFNldCB2Q2hpbGRyZW4gPSBuZXcgSGFzaFNldCgpOworCWludCBraW5kID0gZ2V0S2luZCgpOwogCXRyeSB7CiAJICAgIFBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAkJY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMgPSByb290LmZ1bGxJbmNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKQEAgLTEwNCw3ICs5Niw3IEBACiAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJfQotCQorCiAJaWYgKGtpbmQgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKIAkJLy8gYWRkIHByaW1hcnkgY29tcGlsYXRpb24gdW5pdHMKIAkJSUNvbXBpbGF0aW9uVW5pdFtdIHByaW1hcnlDb21waWxhdGlvblVuaXRzID0gZ2V0Q29tcGlsYXRpb25Vbml0cyhEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZKTsKQEAgLTExMyw3ICsxMDUsNyBAQAogCQkJdkNoaWxkcmVuLmFkZChwcmltYXJ5KTsKIAkJfQogCX0KLQkKKwogCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gbmV3IElKYXZhRWxlbWVudFt2Q2hpbGRyZW4uc2l6ZSgpXTsKIAl2Q2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7CiAJaW5mby5zZXRDaGlsZHJlbihjaGlsZHJlbik7CkBAIC0xMzEsNyArMTIzLDcgQEAKICAqLwogcHVibGljIHZvaWQgY29weShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5vcGVyYXRpb25fbnVsbENvbnRhaW5lcik7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsQ29udGFpbmVyKTsKIAl9CiAJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CiAJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9OwpAQCAtMTY5LDE1ICsxNjEsMTcgQEAKIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwogCWlmICghKG8gaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnQpKSByZXR1cm4gZmFsc2U7Ci0JCi0JUGFja2FnZUZyYWdtZW50IG90aGVyID0gKFBhY2thZ2VGcmFnbWVudCkgbzsJCQorCisJUGFja2FnZUZyYWdtZW50IG90aGVyID0gKFBhY2thZ2VGcmFnbWVudCkgbzsKIAlyZXR1cm4gVXRpbC5lcXVhbEFycmF5c09yTnVsbCh0aGlzLm5hbWVzLCBvdGhlci5uYW1lcykgJiYKIAkJCXRoaXMucGFyZW50LmVxdWFscyhvdGhlci5wYXJlbnQpOwogfQogcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewogCS8vIHN1cGVyLmV4aXN0KCkgb25seSBjaGVja3MgZm9yIHRoZSBwYXJlbnQgYW5kIHRoZSByZXNvdXJjZSBleGlzdGVuY2UKLQkvLyBzbyBhbHNvIGVuc3VyZSB0aGF0IHRoZSBwYWNrYWdlIGlzIG5vdCBleGNlbHVkZWQgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTc3KQotCXJldHVybiBzdXBlci5leGlzdHMoKSAmJiAhVXRpbC5pc0V4Y2x1ZGVkKHRoaXMpOyAKKwkvLyBzbyBhbHNvIGVuc3VyZSB0aGF0OgorCS8vICAtIHRoZSBwYWNrYWdlIGlzIG5vdCBleGNsdWRlZCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg1NzcpCisJLy8gIC0gaXRzIG5hbWUgaXMgdmFsaWRlIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQ1NikKKwlyZXR1cm4gc3VwZXIuZXhpc3RzKCkgJiYgIVV0aWwuaXNFeGNsdWRlZCh0aGlzKSAmJiBpc1ZhbGlkUGFja2FnZU5hbWUoKTsKIH0KIC8qKgogICogQHNlZSBJUGFja2FnZUZyYWdtZW50I2dldENsYXNzRmlsZShTdHJpbmcpCkBAIC0xODUsNyArMTc5LDcgQEAKICAqLwogcHVibGljIElDbGFzc0ZpbGUgZ2V0Q2xhc3NGaWxlKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7CiAJaWYgKCFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShjbGFzc0ZpbGVOYW1lKSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaW52YWxpZENsYXNzRmlsZU5hbWUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmVsZW1lbnRfaW52YWxpZENsYXNzRmlsZU5hbWUsIGNsYXNzRmlsZU5hbWUpKTsKIAl9CiAJLy8gZG9uJ3QgaG9sZCBvbiB0aGUgLmNsYXNzIGZpbGUgZXh0ZW5zaW9uIHRvIHNhdmUgbWVtb3J5CiAJLy8gYWxzbyBtYWtlIHN1cmUgdG8gbm90IHVzZSBzdWJzdHJpbmcgYXMgdGhlIHJlc3VsdGluZyBTdHJpbmcgbWF5IGhvbGQgb24gdGhlIHVuZGVybHlpbmcgY2hhcltdIHdoaWNoIG1pZ2h0IGJlIG11Y2ggYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5CkBAIC0yMDUsNyArMTk5LDcgQEAKIAlpZiAoZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7CiAJCXJldHVybiBOT19DTEFTU0ZJTEVTOwogCX0KLQkKKwogCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoQ0xBU1NfRklMRSk7CiAJSUNsYXNzRmlsZVtdIGFycmF5PSBuZXcgSUNsYXNzRmlsZVtsaXN0LnNpemUoKV07CiAJbGlzdC50b0FycmF5KGFycmF5KTsKQEAgLTIxNyw3ICsyMTEsNyBAQAogICovCiBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoU3RyaW5nIGN1TmFtZSkgewogCWlmICghb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShjdU5hbWUpKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuY29udmVudGlvbl91bml0X25vdEphdmFOYW1lKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuY29udmVudGlvbl91bml0X25vdEphdmFOYW1lKTsKIAl9CiAJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQodGhpcywgY3VOYW1lLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZKTsKIH0KQEAgLTIyOCw3ICsyMjIsNyBAQAogCWlmIChnZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpIHsKIAkJcmV0dXJuIE5PX0NPTVBJTEFUSU9OX1VOSVRTOwogCX0KLQkKKwogCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoQ09NUElMQVRJT05fVU5JVCk7CiAJSUNvbXBpbGF0aW9uVW5pdFtdIGFycmF5PSBuZXcgSUNvbXBpbGF0aW9uVW5pdFtsaXN0LnNpemUoKV07CiAJbGlzdC50b0FycmF5KGFycmF5KTsKQEAgLTI5OSwxOCArMjkzLDE4IEBACiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCiBwdWJsaWMgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmICh0aGlzLmlzRGVmYXVsdFBhY2thZ2UoKSkgeworCWlmIChpc0RlZmF1bHRQYWNrYWdlKCkpIHsKIAkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzaG93IG5vbiBqYXZhIHJlc291cmNlcyBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlIChzZWUgUFIgIzFHNThOQjgpCiAJCXJldHVybiBKYXZhRWxlbWVudEluZm8uTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwogCX0gZWxzZSB7Ci0JCXJldHVybiAoKFBhY2thZ2VGcmFnbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0UmVzb3VyY2UoKSwgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpKTsKKwkJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZ2V0Tm9uSmF2YVJlc291cmNlcyhyZXNvdXJjZSgpLCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkpOwogCX0KIH0KIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0UGF0aCgpCiAgKi8KIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewogCQlyZXR1cm4gcm9vdC5nZXRQYXRoKCk7CiAJfSBlbHNlIHsKQEAgLTMyMywyMiArMzE3LDE3IEBACiAJfQogfQogLyoqCi0gKiBAc2VlIElKYXZhRWxlbWVudCNnZXRSZXNvdXJjZSgpCisgKiBAc2VlIEphdmFFbGVtZW50I3Jlc291cmNlKCkKICAqLwotcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewotCQlyZXR1cm4gcm9vdC5nZXRSZXNvdXJjZSgpOworcHVibGljIElSZXNvdXJjZSByZXNvdXJjZShQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QpIHsKKwlpbnQgbGVuZ3RoID0gdGhpcy5uYW1lcy5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXJldHVybiByb290LnJlc291cmNlKHJvb3QpOwogCX0gZWxzZSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLm5hbWVzLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gcm9vdC5nZXRSZXNvdXJjZSgpOwotCQl9IGVsc2UgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHRoaXMubmFtZXNbMF0pOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQlwYXRoID0gcGF0aC5hcHBlbmQodGhpcy5uYW1lc1tpXSk7Ci0JCQlyZXR1cm4gKChJQ29udGFpbmVyKXJvb3QuZ2V0UmVzb3VyY2UoKSkuZ2V0Rm9sZGVyKHBhdGgpOwotCQl9CisJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh0aGlzLm5hbWVzWzBdKTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykKKwkJCXBhdGggPSBwYXRoLmFwcGVuZCh0aGlzLm5hbWVzW2ldKTsKKwkJcmV0dXJuICgoSUNvbnRhaW5lcilyb290LnJlc291cmNlKHJvb3QpKS5nZXRGb2xkZXIocGF0aCk7CiAJfQogfQogLyoqCkBAIC0zNzQsNyArMzYzLDcgQEAKIAlyZXR1cm4gaGFzaDsKIH0KIC8qKgotICogQHNlZSBJUGFyZW50IAorICogQHNlZSBJUGFyZW50CiAgKi8KIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKQEAgLTQwMSwxMiArMzkwLDIyIEBACiBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRQYWNrYWdlKCkgewogCXJldHVybiB0aGlzLm5hbWVzLmxlbmd0aCA9PSAwOwogfQorcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYWNrYWdlTmFtZSgpIHsKKwlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKKwlTdHJpbmcgc291cmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKKwlTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmICghVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UodGhpcy5uYW1lc1tpXSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQogLyoqCiAgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24jbW92ZShJSmF2YUVsZW1lbnQsIElKYXZhRWxlbWVudCwgU3RyaW5nLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQogICovCiBwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsQ29udGFpbmVyKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMub3BlcmF0aW9uX251bGxDb250YWluZXIpOwogCX0KIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsKIAlJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07CkBAIC00MjUsMTAgKzQyNCwxMCBAQAogICovCiBwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKG5ld05hbWUgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbE5hbWUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X251bGxOYW1lKTsKIAl9CiAJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307Ci0JSUphdmFFbGVtZW50W10gZGVzdHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpcy5nZXRQYXJlbnQoKX07CisJSUphdmFFbGVtZW50W10gZGVzdHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Z2V0UGFyZW50KCl9OwogCVN0cmluZ1tdIHJlbmFtaW5ncz0gbmV3IFN0cmluZ1tdIHtuZXdOYW1lfTsKIAlnZXRKYXZhTW9kZWwoKS5yZW5hbWUoZWxlbWVudHMsIGRlc3RzLCByZW5hbWluZ3MsIGZvcmNlLCBtb25pdG9yKTsKIH0KQEAgLTQ0NCw3ICs0NDMsNyBAQAogICogRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbywgYm9vbGVhbiBzaG93UmVzb2x2ZWRJbmZvKSB7Ci0JYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKIAlpZiAodGhpcy5uYW1lcy5sZW5ndGggPT0gMCkgewogCQlidWZmZXIuYXBwZW5kKCI8ZGVmYXVsdD4iKTsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSB7CkBAIC00NjIsNyArNDYxLDcgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50I2dldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yKQogICovCiBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaGVkSmF2YWRvYyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVBlclByb2plY3RJbmZvIHByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm9DaGVja0V4aXN0ZW5jZSh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKKwlQZXJQcm9qZWN0SW5mbyBwcm9qZWN0SW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvQ2hlY2tFeGlzdGVuY2UoZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwogCVN0cmluZyBjYWNoZWRKYXZhZG9jID0gbnVsbDsKIAlzeW5jaHJvbml6ZWQgKHByb2plY3RJbmZvLmphdmFkb2NDYWNoZSkgewogCQljYWNoZWRKYXZhZG9jID0gKFN0cmluZykgcHJvamVjdEluZm8uamF2YWRvY0NhY2hlLmdldCh0aGlzKTsKQEAgLTQ3OSw5ICs0NzgsOSBAQAogCWlmICghKHBhdGhCdWZmZXIuY2hhckF0KHBhdGhCdWZmZXIubGVuZ3RoKCkgLSAxKSA9PSAnLycpKSB7CiAJCXBhdGhCdWZmZXIuYXBwZW5kKCcvJyk7CiAJfQotCVN0cmluZyBwYWNrUGF0aD0gdGhpcy5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworCVN0cmluZyBwYWNrUGF0aD0gZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsKIAlwYXRoQnVmZmVyLmFwcGVuZChwYWNrUGF0aCkuYXBwZW5kKCcvJykuYXBwZW5kKEphdmFkb2NDb25zdGFudHMuUEFDS0FHRV9GSUxFX05BTUUpOwotCQorCiAJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJZmluYWwgU3RyaW5nIGNvbnRlbnRzID0gZ2V0VVJMQ29udGVudHMoU3RyaW5nLnZhbHVlT2YocGF0aEJ1ZmZlcikpOwogCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwpAQCAtNDkxLDQgKzQ5MCwyNiBAQAogCX0KIAlyZXR1cm4gY29udGVudHM7CiB9CisKK3Byb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRXhpc3RlbmNlKElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKKwkvLyBjaGVjayB0aGF0IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGlzIHZhbGlkIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQ1NikKKwlpZiAoIWlzVmFsaWRQYWNrYWdlTmFtZSgpKQorCQlyZXR1cm4gbmV3RG9lc05vdEV4aXN0U3RhdHVzKCk7CisKKwkvLyBjaGVjayB3aGV0aGVyIHRoaXMgcGtnIGNhbiBiZSBvcGVuZWQKKwlpZiAodW5kZXJseWluZ1Jlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlRXhpc3RzKHVuZGVybHlpbmdSZXNvdXJjZSkpCisJCXJldHVybiBuZXdEb2VzTm90RXhpc3RTdGF0dXMoKTsKKworCS8vIGNoZWNrIHRoYXQgaXQgaXMgbm90IGV4Y2x1ZGVkIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTc3KQorCWludCBraW5kOworCXRyeSB7CisJCWtpbmQgPSBnZXRLaW5kKCk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7CisJfQorCWlmIChraW5kID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICYmIFV0aWwuaXNFeGNsdWRlZCh0aGlzKSkKKwkJcmV0dXJuIG5ld0RvZXNOb3RFeGlzdFN0YXR1cygpOworCisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudEluZm8uamF2YQppbmRleCBmMjU2YmZmLi5lYzE1OWI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQxLDEwICs0MSwxMCBAQAogT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcyhJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlLCBQYWNrYWdlRnJhZ21lbnRSb290IHJvb3RIYW5kbGUpIHsKIAlpZiAodGhpcy5ub25KYXZhUmVzb3VyY2VzID09IG51bGwpIHsKIAkJdHJ5IHsKLQkJCXRoaXMubm9uSmF2YVJlc291cmNlcyA9IAorCQkJdGhpcy5ub25KYXZhUmVzb3VyY2VzID0KIAkJCQlQYWNrYWdlRnJhZ21lbnRSb290SW5mby5jb21wdXRlRm9sZGVyTm9uSmF2YVJlc291cmNlcygKLQkJCQkJKEphdmFQcm9qZWN0KXJvb3RIYW5kbGUuZ2V0SmF2YVByb2plY3QoKSwgCi0JCQkJCShJQ29udGFpbmVyKXVuZGVybHlpbmdSZXNvdXJjZSwgCisJCQkJCXJvb3RIYW5kbGUsCisJCQkJCShJQ29udGFpbmVyKXVuZGVybHlpbmdSZXNvdXJjZSwKIAkJCQkJcm9vdEhhbmRsZS5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksCiAJCQkJCXJvb3RIYW5kbGUuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3QuamF2YQppbmRleCBhYjI4MjVjLi45ZmI1OWM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDExICszOCwxMCBAQAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PX1NPVVJDRV9BVFRBQ0hNRU5UID0gIiI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290LgotCSAqIChhbiBJUmVzb3VyY2Ugb3IgYSBqYXZhLmlvLkZpbGUgKGZvciBleHRlcm5hbCBqYXIgb25seSkpCisJICogVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvb3QgKG51bGwgZm9yIGV4dGVybmFsIGphcikKIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc291cmNlOwotCQorCXByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2U7CisKIC8qKgogICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgamF2YSBwYWNrYWdlCiAgKiBkaXJlY3RvcnkgaGllcmFyY2h5LgpAQCAtNTksMTAgKzU4LDkgQEAKIAl0cnkgewogCQl2ZXJpZnlBdHRhY2hTb3VyY2Uoc291cmNlUGF0aCk7CiAJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmVsZW1lbnRfYXR0YWNoaW5nU291cmNlLCAyKTsgCisJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbGVtZW50X2F0dGFjaGluZ1NvdXJjZSwgMik7CiAJCX0KIAkJU291cmNlTWFwcGVyIG9sZE1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwogCQlib29sZWFuIHJvb3ROZWVkc1RvQmVDbG9zZWQ9IGZhbHNlOwogCiAJCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKQEAgLTgwLDcgKzc4LDcgQEAKIAkJKi8KIAkJfSBlbHNlIHsKIAkJLyoKLQkJCS8vIGZpcmUgYSBkZWx0YSB0byBub3RpZnkgdGhlIFVJIGFib3V0IHRoZSBzb3VyY2UgYXR0YWNoZW1lbnQuCisJCQkvLyBmaXJlIGEgZGVsdGEgdG8gbm90aWZ5IHRoZSBVSSBhYm91dCB0aGUgc291cmNlIGF0dGFjaG1lbnQuCiAJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSAoSmF2YU1vZGVsTWFuYWdlcikgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJCQlKYXZhTW9kZWwgbW9kZWwgPSAoSmF2YU1vZGVsKSBnZXRKYXZhTW9kZWwoKTsKIAkJCUphdmFFbGVtZW50RGVsdGEgYXR0YWNoZWRTb3VyY2VEZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKG1vZGVsKTsKQEAgLTEwMSw3ICs5OSw3IEBACiAJCQkJfQogCQkJfQogCQkJLy8gY2hlY2sgaWYgc291cmNlIHBhdGggaXMgdmFsaWQKLQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZS5nZXRSb290KCksIHNvdXJjZVBhdGgsIGZhbHNlKTsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHNvdXJjZVBhdGgsIGZhbHNlKTsKIAkJCWlmICh0YXJnZXQgPT0gbnVsbCkgewogCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwgc291cmNlUGF0aCkpOwogCQkJfQpAQCAtMTE4LDcgKzExNiw3IEBACiAJCQkvL3NldCB0aGUgcHJvcGVydHkgdG8gdGhlIHBhdGggb2YgdGhlIG1hcHBlZCBzb3VyY2UKIAkJCVV0aWwuc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KAogCQkJCWdldFBhdGgoKSwKLQkJCQlzb3VyY2VQYXRoLnRvU3RyaW5nKCkgCisJCQkJc291cmNlUGF0aC50b1N0cmluZygpCiAJCQkJKyAocm9vdFBhdGggPT0gbnVsbCA/ICIiIDogKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSICsgcm9vdFBhdGgudG9TdHJpbmcoKSkpKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCWlmIChyb290TmVlZHNUb0JlQ2xvc2VkKSB7CkBAIC0xNTIsMjAgKzE1MCwxNCBAQAogICogQHNlZSBPcGVuYWJsZQogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFN0cnVjdHVyZShPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIElQcm9ncmVzc01vbml0b3IgcG0sIE1hcCBuZXdFbGVtZW50cywgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCi0JLy8gY2hlY2sgd2hldGhlciB0aGlzIHBrZyBmcmFnbWVudCByb290IGNhbiBiZSBvcGVuZWQKLQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlT25DbGFzc3BhdGgoKTsKLQlpZiAoIXN0YXR1cy5pc09LKCkpIHRocm93IG5ld0phdmFNb2RlbEV4Y2VwdGlvbihzdGF0dXMpOwotCWlmICghcmVzb3VyY2VFeGlzdHMoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwotCiAJKChQYWNrYWdlRnJhZ21lbnRSb290SW5mbykgaW5mbykuc2V0Um9vdEtpbmQoZGV0ZXJtaW5lS2luZCh1bmRlcmx5aW5nUmVzb3VyY2UpKTsKLQlyZXR1cm4gY29tcHV0ZUNoaWxkcmVuKGluZm8sIG5ld0VsZW1lbnRzKTsKKwlyZXR1cm4gY29tcHV0ZUNoaWxkcmVuKGluZm8sIHVuZGVybHlpbmdSZXNvdXJjZSk7CiB9CiAKIFNvdXJjZU1hcHBlciBjcmVhdGVTb3VyY2VNYXBwZXIoSVBhdGggc291cmNlUGF0aCwgSVBhdGggcm9vdFBhdGgpIHsKIAlTb3VyY2VNYXBwZXIgbWFwcGVyID0gbmV3IFNvdXJjZU1hcHBlcigKLQkJc291cmNlUGF0aCwgCi0JCXJvb3RQYXRoID09IG51bGwgPyBudWxsIDogcm9vdFBhdGgudG9PU1N0cmluZygpLCAKKwkJc291cmNlUGF0aCwKKwkJcm9vdFBhdGggPT0gbnVsbCA/IG51bGwgOiByb290UGF0aC50b09TU3RyaW5nKCksCiAJCWdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7IC8vIGNhbm5vdCB1c2Ugd29ya3NwYWNlIG9wdGlvbnMgaWYgZXh0ZXJuYWwgamFyIGlzIDEuNSBqYXIgYW5kIHdvcmtzcGFjZSBvcHRpb25zIGFyZSAxLjQgb3B0aW9ucwogCXJldHVybiBtYXBwZXI7CiB9CkBAIC0xODQsMTYgKzE3NiwxNSBAQAogCiAvKioKICAqIENvbXB1dGUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgY2hpbGRyZW4gb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0gKiAKKyAqCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiAgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBkb2VzIG5vdCBleGlzdAogICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlQ2hpbGRyZW4oT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBNYXAgbmV3RWxlbWVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZUNoaWxkcmVuKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJLy8gTm90ZSB0aGUgY2hpbGRyZW4gYXJlIG5vdCBvcGVuZWQgKHNvIG5vdCBhZGRlZCB0byBuZXdFbGVtZW50cykgZm9yIGEgcmVndWxhciBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLQkvLyBIb3d2ZXIgdGhleSBhcmUgb3BlbmVkIGZvciBhIEphciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgKHNlZSBKYXJQYWNrYWdlRnJhZ21lbnRSb290I2NvbXB1dGVDaGlsZHJlbikKKwkvLyBIb3dldmVyIHRoZXkgYXJlIG9wZW5lZCBmb3IgYSBKYXIgcGFja2FnZSBmcmFnbWVudCByb290IChzZWUgSmFyUGFja2FnZUZyYWdtZW50Um9vdCNjb21wdXRlQ2hpbGRyZW4pCiAJdHJ5IHsKIAkJLy8gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgbWF5IGJlIGEgZm9sZGVyIG9yIGEgcHJvamVjdCAoaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJvamVjdCBmb2xkZXIKIAkJLy8gaXMgYWN0dWFsbHkgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCkKLQkJSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CiAJCWlmICh1bmRlcmx5aW5nUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgdW5kZXJseWluZ1Jlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewogCQkJQXJyYXlMaXN0IHZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoNSk7CiAJCQlJQ29udGFpbmVyIHJvb3RGb2xkZXIgPSAoSUNvbnRhaW5lcikgdW5kZXJseWluZ1Jlc291cmNlOwpAQCAtMjE1LDcgKzIwNiw3IEBACiAvKioKICAqIFN0YXJ0aW5nIGF0IHRoaXMgZm9sZGVyLCBjcmVhdGUgcGFja2FnZSBmcmFnbWVudHMgYW5kIGFkZCB0aGUgZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBleGNsdXNlZAogICogdG8gdGhlIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4uCi0gKiAKKyAqCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiAgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgZG9lcyBub3QgZXhpc3QKICAqLwogcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUZvbGRlckNoaWxkcmVuKElDb250YWluZXIgZm9sZGVyLCBib29sZWFuIGlzSW5jbHVkZWQsIFN0cmluZ1tdIHBrZ05hbWUsIEFycmF5TGlzdCB2Q2hpbGRyZW4sIGNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CkBAIC0yMzYsOSArMjI3LDkgQEAKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKIAkJCQlTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlci5nZXROYW1lKCk7Ci0JCQkKKwogCQkJCXN3aXRjaChtZW1iZXIuZ2V0VHlwZSgpKSB7Ci0JCQkgICAgCisKIAkJCSAgICAJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgogCQkJICAgIAkJLy8gcmVjdXJzZSBpbnRvIHN1YiBmb2xkZXJzIGV2ZW4gZXZlbiBwYXJlbnQgbm90IGluY2x1ZGVkIGFzIGEgc3ViIGZvbGRlciBjb3VsZCBiZSBpbmNsdWRlZAogCQkJICAgIAkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU2MzcpCkBAIC0yNTgsNyArMjQ5LDcgQEAKIAkJCQkJCQkJJiYgIVV0aWwuaXNFeGNsdWRlZChtZW1iZXIsIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucykpIHsKIAkJCSAgICAJCQloYXNJbmNsdWRlZCA9IHRydWU7CiAJCQkgICAgCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7Ci0JCQkgICAgCQkJdkNoaWxkcmVuLmFkZChwa2cpOyAKKwkJCSAgICAJCQl2Q2hpbGRyZW4uYWRkKHBrZyk7CiAJCQkgICAgCQl9CiAJCQkgICAgCQlicmVhazsKIAkJCQl9CkBAIC0yODEsOCArMjcyLDggQEAKIAlJQ2xhc3NwYXRoRW50cnkgc2libGluZywKIAlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCUNvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uIG9wID0gCisKKwlDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbiBvcCA9CiAJCW5ldyBDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbih0aGlzLCBkZXN0aW5hdGlvbiwgdXBkYXRlUmVzb3VyY2VGbGFncywgdXBkYXRlTW9kZWxGbGFncywgc2libGluZyk7CiAJb3AucnVuT3BlcmF0aW9uKG1vbml0b3IpOwogfQpAQCAtMzMwLDU0ICszMjEsMjkgQEAKIAlpZiAoIShvIGluc3RhbmNlb2YgUGFja2FnZUZyYWdtZW50Um9vdCkpCiAJCXJldHVybiBmYWxzZTsKIAlQYWNrYWdlRnJhZ21lbnRSb290IG90aGVyID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIG87Ci0JcmV0dXJuIGdldFJlc291cmNlKCkuZXF1YWxzKG90aGVyLmdldFJlc291cmNlKCkpICYmIAorCXJldHVybiByZXNvdXJjZSgpLmVxdWFscyhvdGhlci5yZXNvdXJjZSgpKSAmJgogCQkJdGhpcy5wYXJlbnQuZXF1YWxzKG90aGVyLnBhcmVudCk7CiB9CiAKLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCXJldHVybiBzdXBlci5leGlzdHMoKSAmJiB2YWxpZGF0ZU9uQ2xhc3NwYXRoKCkuaXNPSygpOwotfQotCiBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBmaW5kU291cmNlQXR0YWNobWVudFJlY29tbWVuZGF0aW9uKCkgewogCXRyeSB7Ci0JCUlQYXRoIHJvb3RQYXRoID0gdGhpcy5nZXRQYXRoKCk7CisJCUlQYXRoIHJvb3RQYXRoID0gZ2V0UGF0aCgpOwogCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkKKwogCQkvLyB0cnkgb24gZW5jbG9zaW5nIHByb2plY3QgZmlyc3QKIAkJSmF2YVByb2plY3QgcGFyZW50UHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKIAkJdHJ5IHsKIAkJCWVudHJ5ID0gcGFyZW50UHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihyb290UGF0aCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCl7Ci0JCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHRhcmdldDsKLQkJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGZpbGUuZ2V0TmFtZSgpKSl7Ci0JCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJCXJldHVybiBlbnRyeTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKXsKLQkJCQkJamF2YS5pby5GaWxlIGZpbGUgPSBKYXZhTW9kZWwuZ2V0RmlsZSh0YXJnZXQpOwotCQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShmaWxlLmdldE5hbWUoKSkpewotCQkJCQkJCXJldHVybiBlbnRyeTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGV4dGVybmFsIGRpcmVjdG9yeQotCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQl9CisJCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIHRydWUpOworCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gZW50cnk7CiAJCQkJfQogCQkJfQogCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKIAkJCS8vIGlnbm9yZQogCQl9Ci0JCQorCiAJCS8vIGl0ZXJhdGUgb3ZlciBhbGwgcHJvamVjdHMKIAkJSUphdmFNb2RlbCBtb2RlbCA9IGdldEphdmFNb2RlbCgpOwogCQlJSmF2YVByb2plY3RbXSBqUHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKQEAgLTM4NywyNiArMzUzLDkgQEAKIAkJCXRyeSB7CiAJCQkJZW50cnkgPSBqUHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihyb290UGF0aCk7CiAJCQkJaWYgKGVudHJ5ICE9IG51bGwpewotCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB0cnVlKTsKLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKXsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB0YXJnZXQ7Ci0JCQkJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZmlsZS5nZXROYW1lKCkpKXsKLQkJCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQkJCXJldHVybiBlbnRyeTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUpewotCQkJCQkJamF2YS5pby5GaWxlIGZpbGUgPSAoamF2YS5pby5GaWxlKSB0YXJnZXQ7Ci0JCQkJCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGZpbGUuZ2V0TmFtZSgpKSl7Ci0JCQkJCQkJCXJldHVybiBlbnRyeTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIGV4dGVybmFsIGRpcmVjdG9yeQotCQkJCQkJCXJldHVybiBlbnRyeTsKLQkJCQkJCX0KKwkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgdHJ1ZSk7CisJCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGVudHJ5OwogCQkJCQl9CiAJCQkJfQogCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CkBAIC00MjUsMzYgKzM3NCwzNiBAQAogICovCiBwdWJsaWMgY2hhcltdW10gZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpIHsKIAl0cnkgewotCQlpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgcmV0dXJuIG51bGw7Ci0JCUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKENsYXNzcGF0aEVudHJ5KWdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CisJCWlmIChpc09wZW4oKSAmJiBnZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHJldHVybiBudWxsOworCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKIAkJaWYgKGVudHJ5ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIGVudHJ5LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKIAkJfQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7IAorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBudWxsOwogCX0KLX0JCQorfQogCiAvKgogICogUmV0dXJucyB0aGUgaW5jbHVzaW9uIHBhdHRlcm5zIGZyb20gdGhlIGNsYXNzcGF0aCBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290LgogICovCiBwdWJsaWMgY2hhcltdW10gZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpIHsKIAl0cnkgewotCQlpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgcmV0dXJuIG51bGw7CisJCWlmIChpc09wZW4oKSAmJiBnZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHJldHVybiBudWxsOwogCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSlnZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwogCQlpZiAoZW50cnkgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gZW50cnkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpOwogCQl9Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsgCisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotfQkJCit9CiBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZSgpOworCUlSZXNvdXJjZSByZXMgPSByZXNvdXJjZSgpOwogCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKQogCQlyZXR1cm4gKChJRm9sZGVyKSByZXMpLmdldE5hbWUoKTsKIAlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKQEAgLTQ3NywyMSArNDI2LDIxIEBACiBwdWJsaWMgSUphdmFFbGVtZW50IGdldEhhbmRsZUZyb21NZW1lbnRvKFN0cmluZyB0b2tlbiwgTWVtZW50b1Rva2VuaXplciBtZW1lbnRvLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB7CiAJc3dpdGNoICh0b2tlbi5jaGFyQXQoMCkpIHsKIAkJY2FzZSBKRU1fUEFDS0FHRUZSQUdNRU5UOgotCQkJU3RyaW5nIHBrZ05hbWU7CisJCQlTdHJpbmdbXSBwa2dOYW1lOwogCQkJaWYgKG1lbWVudG8uaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJcGtnTmFtZSA9IG1lbWVudG8ubmV4dFRva2VuKCk7Ci0JCQkJY2hhciBmaXJzdENoYXIgPSBwa2dOYW1lLmNoYXJBdCgwKTsKKwkJCQl0b2tlbiA9IG1lbWVudG8ubmV4dFRva2VuKCk7CisJCQkJY2hhciBmaXJzdENoYXIgPSB0b2tlbi5jaGFyQXQoMCk7CiAJCQkJaWYgKGZpcnN0Q2hhciA9PSBKRU1fQ0xBU1NGSUxFIHx8IGZpcnN0Q2hhciA9PSBKRU1fQ09NUElMQVRJT05VTklUIHx8IGZpcnN0Q2hhciA9PSBKRU1fQ09VTlQpIHsKLQkJCQkJdG9rZW4gPSBwa2dOYW1lOwotCQkJCQlwa2dOYW1lID0gSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsKKwkJCQkJcGtnTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKIAkJCQl9IGVsc2UgeworCQkJCQlwa2dOYW1lID0gVXRpbC5zcGxpdE9uKCcuJywgdG9rZW4sIDAsIHRva2VuLmxlbmd0aCgpKTsKIAkJCQkJdG9rZW4gPSBudWxsOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJcGtnTmFtZSA9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCQkJcGtnTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKIAkJCQl0b2tlbiA9IG51bGw7CiAJCQl9Ci0JCQlKYXZhRWxlbWVudCBwa2cgPSAoSmF2YUVsZW1lbnQpZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOworCQkJSmF2YUVsZW1lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOwogCQkJaWYgKHRva2VuID09IG51bGwpIHsKIAkJCQlyZXR1cm4gcGtnLmdldEhhbmRsZUZyb21NZW1lbnRvKG1lbWVudG8sIG93bmVyKTsKIAkJCX0gZWxzZSB7CkBAIC01MDgsNyArNDU3LDcgQEAKIAlJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKIAlpZiAodW5kZXJseWluZ1Jlc291cmNlICE9IG51bGwpIHsKIAkJLy8gaW50ZXJuYWwgamFyIG9yIHJlZ3VsYXIgcm9vdAotCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgeworCQlpZiAocmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewogCQkJcGF0aCA9IHVuZGVybHlpbmdSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CiAJCX0gZWxzZSB7CiAJCQlwYXRoID0gdW5kZXJseWluZ1Jlc291cmNlLmdldEZ1bGxQYXRoKCk7CkBAIC01MTksNyArNDY4LDcgQEAKIAl9CiAJKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0SGFuZGxlTWVtZW50byhidWZmKTsKIAlidWZmLmFwcGVuZChnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkpOwotCWVzY2FwZU1lbWVudG9OYW1lKGJ1ZmYsIHBhdGgudG9TdHJpbmcoKSk7IAorCWVzY2FwZU1lbWVudG9OYW1lKGJ1ZmYsIHBhdGgudG9TdHJpbmcoKSk7CiB9CiAvKioKICAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKQEAgLTUyOCwxMSArNDc3LDI0IEBACiAJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pZ2V0RWxlbWVudEluZm8oKSkuZ2V0Um9vdEtpbmQoKTsKIH0KIAorLyoKKyAqIEEgdmVyc2lvbiBvZiBnZXRLaW5kKCkgdGhhdCBkb2Vzbid0IHVwZGF0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmZvIGluIHRoZSBKYXZhIG1vZGVsIGNhY2hlCisgKiB0byBzcGVlZCB0aGluZ3MgdXAKKyAqLworaW50IGludGVybmFsS2luZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCVBhY2thZ2VGcmFnbWVudFJvb3RJbmZvIGluZm8gPSAoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIG1hbmFnZXIucGVla0F0SW5mbyh0aGlzKTsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCWluZm8gPSAoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIG9wZW5XaGVuQ2xvc2VkKGNyZWF0ZUVsZW1lbnRJbmZvKCksIG51bGwpOworCX0KKwlyZXR1cm4gaW5mby5nZXRSb290S2luZCgpOworfQorCiAvKioKICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCiAgKi8KIHB1YmxpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuICgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0SmF2YVByb2plY3QoKSwgZ2V0UmVzb3VyY2UoKSwgdGhpcyk7CisJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0SmF2YVByb2plY3QoKSwgcmVzb3VyY2UoKSwgdGhpcyk7CiB9CiAKIC8qKgpAQCAtNTQwLDcgKzUwMiw3IEBACiAgKi8KIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmcgcGFja2FnZU5hbWUpIHsKIAkvLyB0b2xlcmF0ZSBwYWNrYWdlIG5hbWVzIHdpdGggc3BhY2VzIChlLmcuICd4IC4geScpIChodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTk1NykKLQlTdHJpbmdbXSBwa2dOYW1lID0gVXRpbC5nZXRUcmltbWVkU2ltcGxlTmFtZXMocGFja2FnZU5hbWUpOyAKKwlTdHJpbmdbXSBwa2dOYW1lID0gVXRpbC5nZXRUcmltbWVkU2ltcGxlTmFtZXMocGFja2FnZU5hbWUpOwogCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7CiB9CiBwdWJsaWMgUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmdbXSBwa2dOYW1lKSB7CkBAIC01NjksMzIgKzUzMSw1NyBAQAogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwogcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JcmV0dXJuIGdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKKwlyZXR1cm4gaW50ZXJuYWxQYXRoKCk7CiB9CiAKK3B1YmxpYyBJUGF0aCBpbnRlcm5hbFBhdGgoKSB7CisJcmV0dXJuIHJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKK30KIC8qCi0gKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290IAorICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAogICovCiBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFJhd0NsYXNzcGF0aEVudHJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKIAlJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSBudWxsOwotCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpdGhpcy5nZXRKYXZhUHJvamVjdCgpOworCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpZ2V0SmF2YVByb2plY3QoKTsKIAlwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7IC8vIGZvcmNlIHRoZSByZXZlcnNlIHJhd0VudHJ5IGNhY2hlIHRvIGJlIHBvcHVsYXRlZAogCU1hcCByb290UGF0aFRvUmF3RW50cmllcyA9IHByb2plY3QuZ2V0UGVyUHJvamVjdEluZm8oKS5yb290UGF0aFRvUmF3RW50cmllczsKIAlpZiAocm9vdFBhdGhUb1Jhd0VudHJpZXMgIT0gbnVsbCkgewotCQlyYXdFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIHJvb3RQYXRoVG9SYXdFbnRyaWVzLmdldCh0aGlzLmdldFBhdGgoKSk7CisJCXJhd0VudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgcm9vdFBhdGhUb1Jhd0VudHJpZXMuZ2V0KGdldFBhdGgoKSk7CiAJfQogCWlmIChyYXdFbnRyeSA9PSBudWxsKSB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfTk9UX09OX0NMQVNTUEFUSCwgdGhpcykpOwogCX0KIAlyZXR1cm4gcmF3RW50cnk7CiB9CisvKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorICovCitwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IG51bGw7CisJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClnZXRKYXZhUHJvamVjdCgpOworCXByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsgLy8gZm9yY2UgdGhlIHJlc29sdmVkIGVudHJ5IGNhY2hlIHRvIGJlIHBvcHVsYXRlZAorCU1hcCByb290UGF0aFRvUmVzb2x2ZWRFbnRyaWVzID0gcHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpLnJvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXM7CisJaWYgKHJvb3RQYXRoVG9SZXNvbHZlZEVudHJpZXMgIT0gbnVsbCkgeworCQlyZXNvbHZlZEVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgcm9vdFBhdGhUb1Jlc29sdmVkRW50cmllcy5nZXQoZ2V0UGF0aCgpKTsKKwl9CisJaWYgKHJlc29sdmVkRW50cnkgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX05PVF9PTl9DTEFTU1BBVEgsIHRoaXMpKTsKKwl9CisJcmV0dXJuIHJlc29sdmVkRW50cnk7Cit9CiAKKworcHVibGljIElSZXNvdXJjZSByZXNvdXJjZSgpIHsKKwlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSAvLyBwZXJmIGltcHJvdmVtZW50IHRvIGF2b2lkIG1lc3NhZ2Ugc2VuZCBpbiByZXNvdXJjZSgpCisJCXJldHVybiB0aGlzLnJlc291cmNlOworCXJldHVybiBzdXBlci5yZXNvdXJjZSgpOworfQogLyoKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KLXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JcmV0dXJuIChJUmVzb3VyY2UpdGhpcy5yZXNvdXJjZTsKK3B1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2UoUGFja2FnZUZyYWdtZW50Um9vdCByb290KSB7CisJcmV0dXJuIHRoaXMucmVzb3VyY2U7CiB9CiAKIC8qKgpAQCAtNjAyLDcgKzU4OSw3IEBACiAgKi8KIHB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChnZXRLaW5kKCkgIT0gS19CSU5BUlkpIHJldHVybiBudWxsOwotCQorCiAJLy8gMSkgbG9vayBzb3VyY2UgYXR0YWNobWVudCBwcm9wZXJ0eSAoc2V0IGlmZiBhdHRhY2hTb3VyY2UoLi4uKSB3YXMgY2FsbGVkCiAJSVBhdGggcGF0aCA9IGdldFBhdGgoKTsKIAlTdHJpbmcgc2VydmVyUGF0aFN0cmluZz0gVXRpbC5nZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkocGF0aCk7CkBAIC02MjIsMTQgKzYwOSwxNCBAQAogCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoOwogCWlmIChlbnRyeSAhPSBudWxsICYmIChzb3VyY2VBdHRhY2htZW50UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpICE9IG51bGwpCiAJCXJldHVybiBzb3VyY2VBdHRhY2htZW50UGF0aDsKLQkKKwogCS8vIDMpIGxvb2sgZm9yIGEgcmVjb21tZW5kYXRpb24KIAllbnRyeSA9IGZpbmRTb3VyY2VBdHRhY2htZW50UmVjb21tZW5kYXRpb24oKTsKIAlpZiAoZW50cnkgIT0gbnVsbCAmJiAoc291cmNlQXR0YWNobWVudFBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSAhPSBudWxsKSB7CiAJCXJldHVybiBzb3VyY2VBdHRhY2htZW50UGF0aDsKIAl9Ci0JCi0JcmV0dXJuIG51bGw7CQorCisJcmV0dXJuIG51bGw7CiB9CiAKIC8qKgpAQCAtNjQ3LDcgKzYzNCw3IEBACiAgKi8KIHB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoZ2V0S2luZCgpICE9IEtfQklOQVJZKSByZXR1cm4gbnVsbDsKLQkKKwogCS8vIDEpIGxvb2sgc291cmNlIGF0dGFjaG1lbnQgcHJvcGVydHkgKHNldCBpZmYgYXR0YWNoU291cmNlKC4uLikgd2FzIGNhbGxlZAogCUlQYXRoIHBhdGggPSBnZXRQYXRoKCk7CiAJU3RyaW5nIHNlcnZlclBhdGhTdHJpbmc9IFV0aWwuZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KHBhdGgpOwpAQCAtNjY2LDEzICs2NTMsMTMgQEAKIAlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7CiAJaWYgKGVudHJ5ICE9IG51bGwgJiYgKHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSAhPSBudWxsKQogCQlyZXR1cm4gc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotCQorCiAJLy8gMykgbG9vayBmb3IgYSByZWNvbWVuZGF0aW9uCiAJZW50cnkgPSBmaW5kU291cmNlQXR0YWNobWVudFJlY29tbWVuZGF0aW9uKCk7CiAJaWYgKGVudHJ5ICE9IG51bGwgJiYgKHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSAhPSBudWxsKQogCQlyZXR1cm4gc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotCQotCXJldHVybiBudWxsOwkKKworCXJldHVybiBudWxsOwogfQogCiAvKioKQEAgLTcwNSwxMSArNjkyLDExIEBACiAgKi8KIHB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKCFleGlzdHMoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwotCXJldHVybiBnZXRSZXNvdXJjZSgpOworCXJldHVybiByZXNvdXJjZSgpOwogfQogCiAvKioKLSAqIEBzZWUgSVBhcmVudCAKKyAqIEBzZWUgSVBhcmVudAogICovCiBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCS8vIGEgcGFja2FnZSBmcmFnbWVudCByb290IGFsd2F5cyBoYXMgdGhlIGRlZmF1bHQgcGFja2FnZSBhcyBhIGNoaWxkCkBAIC03MTcsNyArNzA0LDcgQEAKIH0KIAogcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5oYXNoQ29kZSgpOworCXJldHVybiByZXNvdXJjZSgpLmhhc2hDb2RlKCk7CiB9CiAKIC8qKgpAQCAtNzM4LDEyICs3MjUsMTIgQEAKICAqIFZhbGlkYXRlIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiBpdHMgcHJvamVjdC4KICAqLwogcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVPbkNsYXNzcGF0aCgpIHsKLQkKLQlJUGF0aCBwYXRoID0gdGhpcy5nZXRQYXRoKCk7CisKKwlJUGF0aCBwYXRoID0gZ2V0UGF0aCgpOwogCXRyeSB7CiAJCS8vIGNoZWNrIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvbiBjbGFzc3BhdGggb2YgaXRzIHByb2plY3QKIAkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihwYXRoKTsJCisJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHByb2plY3QuZ2V0Q2xhc3NwYXRoRW50cnlGb3IocGF0aCk7CiAJCWlmIChlbnRyeSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJfQpAQCAtNzY0LDcgKzc1MSw3IEBACiAJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24gb3AgPSAKKwlNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbiBvcCA9CiAJCW5ldyBNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbih0aGlzLCBkZXN0aW5hdGlvbiwgdXBkYXRlUmVzb3VyY2VGbGFncywgdXBkYXRlTW9kZWxGbGFncywgc2libGluZyk7CiAJb3AucnVuT3BlcmF0aW9uKG1vbml0b3IpOwogfQpAQCAtNzczLDI2ICs3NjAsMzQgQEAKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewotCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJSVBhdGggcGF0aCA9IGdldFBhdGgoKTsKLQlpZiAoZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpKSB7CisJaWYgKGlzRXh0ZXJuYWwoKSkgeworCQlidWZmZXIuYXBwZW5kKHBhdGgudG9PU1N0cmluZygpKTsKKwl9IGVsc2UgaWYgKGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGF0aC5zZWdtZW50KDApKSkgewogCSAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CiAJCQlidWZmZXIuYXBwZW5kKCI8cHJvamVjdCByb290PiIpOyAvLyROT04tTkxTLTEkCiAJICAgIH0gZWxzZSB7CiAJCQlidWZmZXIuYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKSk7CiAJICAgIH0KIAl9IGVsc2UgewotCSAgICBpZiAoaXNFeHRlcm5hbCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHBhdGgudG9PU1N0cmluZygpKTsKLQkgICAgfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQocGF0aCk7Ci0JICAgIH0KKwkJYnVmZmVyLmFwcGVuZChwYXRoKTsKIAl9CiAJaWYgKGluZm8gPT0gbnVsbCkgewogCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCiAJfQogfQogCitwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0ZW5jZShJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB7CisJLy8gY2hlY2sgd2hldGhlciB0aGlzIHBrZyBmcmFnbWVudCByb290IGNhbiBiZSBvcGVuZWQKKwlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlT25DbGFzc3BhdGgoKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKCFyZXNvdXJjZUV4aXN0cyh1bmRlcmx5aW5nUmVzb3VyY2UpKQorCQlyZXR1cm4gbmV3RG9lc05vdEV4aXN0U3RhdHVzKCk7CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KKwogLyoqCiAgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgogICogIDxsaT5FTEVNRU5UX05PVF9QUkVTRU5UIC0gdGhlIHJvb3Qgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgpAQCAtODA1LDcgKzgwMCw3IEBACiBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBdHRhY2hTb3VyY2UoSVBhdGggc291cmNlUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKCFleGlzdHMoKSkgewogCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JfSBlbHNlIGlmICh0aGlzLmdldEtpbmQoKSAhPSBLX0JJTkFSWSkgeworCX0gZWxzZSBpZiAoZ2V0S2luZCgpICE9IEtfQklOQVJZKSB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgdGhpcykpOwogCX0gZWxzZSBpZiAoc291cmNlUGF0aCAhPSBudWxsICYmICFzb3VyY2VQYXRoLmlzQWJzb2x1dGUoKSkgewogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUxBVElWRV9QQVRILCBzb3VyY2VQYXRoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YQppbmRleCAyMmNmNTI3Li4yMjMzM2E4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzUsMjcgKzM1LDI4IEBACiAJICogPGxpPjxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFPC9jb2RlPgogCSAqIDxsaT48Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWTwvY29kZT48L3VsPgogCSAqLwotCXByb3RlY3RlZCBpbnQgZlJvb3RLaW5kPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKKwlwcm90ZWN0ZWQgaW50IHJvb3RLaW5kPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKIAogCS8qKgogCSAqIEEgYXJyYXkgd2l0aCBhbGwgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgYnkgdGhpcyBQYWNrYWdlRnJhZ21lbnQKIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZk5vbkphdmFSZXNvdXJjZXM7CisJcHJvdGVjdGVkIE9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXM7CiAvKioKICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKICAqLwogcHVibGljIFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKCkgewotCXRoaXMuZk5vbkphdmFSZXNvdXJjZXMgPSBudWxsOworCXRoaXMubm9uSmF2YVJlc291cmNlcyA9IG51bGw7CiB9CiAvKioKLSAqIFN0YXJ0aW5nIGF0IHRoaXMgZm9sZGVyLCBjcmVhdGUgbm9uLWphdmEgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAKKyAqIFN0YXJ0aW5nIGF0IHRoaXMgZm9sZGVyLCBjcmVhdGUgbm9uLWphdmEgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAogICogYW5kIGFkZCB0aGVtIHRvIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29sbGVjdGlvbi4KLSAqIAorICoKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uICBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSBmcmFnbWVudCBkb2VzIG5vdCBleGlzdAogICovCi1zdGF0aWMgT2JqZWN0W10gY29tcHV0ZUZvbGRlck5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBmb2xkZXIsIGNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbNV07CitzdGF0aWMgT2JqZWN0W10gY29tcHV0ZUZvbGRlck5vbkphdmFSZXNvdXJjZXMoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgSUNvbnRhaW5lciBmb2xkZXIsIGNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVJlc291cmNlW10gbm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbNV07CiAJaW50IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyID0gMDsKKwlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSByb290LmdldEphdmFQcm9qZWN0KCk7CiAJdHJ5IHsKIAkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOwogCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gZm9sZGVyLm1lbWJlcnMoKTsKQEAgLTY4LDIyICs2OSwyMiBAQAogCQkJCXN3aXRjaCAobWVtYmVyLmdldFR5cGUoKSkgewogCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKIAkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG1lbWJlci5nZXROYW1lKCk7Ci0JCQkJCQorCiAJCQkJCQkvLyBpZ25vcmUgLmphdmEgZmlsZXMgdGhhdCBhcmUgbm90IGV4Y2x1ZGVkCi0JCQkJCQlpZiAoVXRpbC5pc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShmaWxlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCkgJiYgIVV0aWwuaXNFeGNsdWRlZChtZW1iZXIsIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucykpIAorCQkJCQkJaWYgKFV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoZmlsZU5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpICYmICFVdGlsLmlzRXhjbHVkZWQobWVtYmVyLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMpKQogCQkJCQkJCWNvbnRpbnVlIG5leHRSZXNvdXJjZTsKIAkJCQkJCS8vIGlnbm9yZSAuY2xhc3MgZmlsZXMKLQkJCQkJCWlmIChVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGZpbGVOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKSkgCisJCQkJCQlpZiAoVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCkpCiAJCQkJCQkJY29udGludWUgbmV4dFJlc291cmNlOwogCQkJCQkJLy8gaWdub3JlIC56aXAgb3IgLmphciBmaWxlIG9uIGNsYXNzcGF0aAotCQkJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZmlsZU5hbWUpICYmIGlzQ2xhc3NwYXRoRW50cnkobWVtYmVyLmdldEZ1bGxQYXRoKCksIGNsYXNzcGF0aCkpIAorCQkJCQkJaWYgKGlzQ2xhc3NwYXRoRW50cnkobWVtYmVyLmdldEZ1bGxQYXRoKCksIGNsYXNzcGF0aCkpCiAJCQkJCQkJY29udGludWUgbmV4dFJlc291cmNlOwogCQkJCQkJYnJlYWs7CiAKIAkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKIAkJCQkJCS8vIGlnbm9yZSB2YWxpZCBwYWNrYWdlcyBvciBleGNsdWRlZCBmb2xkZXJzIHRoYXQgY29ycmVzcG9uZCB0byBhIG5lc3RlZCBwa2cgZnJhZ21lbnQgcm9vdAogCQkJCQkJaWYgKFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKG1lbWJlci5nZXROYW1lKCksIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpCi0JCQkJCQkJCSYmICghVXRpbC5pc0V4Y2x1ZGVkKG1lbWJlciwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSAKKwkJCQkJCQkJJiYgKCFVdGlsLmlzRXhjbHVkZWQobWVtYmVyLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMpCiAJCQkJCQkJCQkJfHwgaXNDbGFzc3BhdGhFbnRyeShtZW1iZXIuZ2V0RnVsbFBhdGgoKSwgY2xhc3NwYXRoKSkpCiAJCQkJCQkJY29udGludWUgbmV4dFJlc291cmNlOwogCQkJCQkJYnJlYWs7CkBAIC05Myw5ICs5NCwxNSBAQAogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5vbkphdmFSZXNvdXJjZXMsIDAsIChub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwgMCwgbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpOwogCQkJCX0KIAkJCQlub25KYXZhUmVzb3VyY2VzW25vbkphdmFSZXNvdXJjZXNDb3VudGVyKytdID0gbWVtYmVyOwotCQkJfQkKKwkJCX0KIAkJfQotCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggIT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKKwkJaWYgKEV4dGVybmFsRm9sZGVyc01hbmFnZXIuaXNJbnRlcm5hbFBhdGhGb3JFeHRlcm5hbEZvbGRlcihmb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHsKKwkJCUlKYXJFbnRyeVJlc291cmNlW10gamFyRW50cnlSZXNvdXJjZXMgPSBuZXcgSUphckVudHJ5UmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXJdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25KYXZhUmVzb3VyY2VzQ291bnRlcjsgaSsrKSB7CisJCQkJamFyRW50cnlSZXNvdXJjZXNbaV0gPSBuZXcgTm9uSmF2YVJlc291cmNlKHJvb3QsIG5vbkphdmFSZXNvdXJjZXNbaV0pOworCQkJfQorCQkJcmV0dXJuIGphckVudHJ5UmVzb3VyY2VzOworCQl9IGVsc2UgaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoICE9IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KG5vbkphdmFSZXNvdXJjZXMsIDAsIChub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlcl0pLCAwLCBub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CiAJCX0KIAkJcmV0dXJuIG5vbkphdmFSZXNvdXJjZXM7CkBAIC0xMDYsNDAgKzExMyw0MCBAQAogLyoqCiAgKiBDb21wdXRlIHRoZSBub24tcGFja2FnZSByZXNvdXJjZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCiAgKi8KLXByaXZhdGUgT2JqZWN0W10gY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoSUphdmFQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UsIFBhY2thZ2VGcmFnbWVudFJvb3QgaGFuZGxlKSB7Ci0JT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IE5PX05PTl9KQVZBX1JFU09VUkNFUzsKK3ByaXZhdGUgT2JqZWN0W10gY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSwgUGFja2FnZUZyYWdtZW50Um9vdCBoYW5kbGUpIHsKKwlPYmplY3RbXSByZXNvdXJjZXMgPSBOT19OT05fSkFWQV9SRVNPVVJDRVM7CiAJdHJ5IHsKIAkJLy8gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgbWF5IGJlIGEgZm9sZGVyIG9yIGEgcHJvamVjdCAoaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJvamVjdCBmb2xkZXIKIAkJLy8gaXMgYWN0dWFsbHkgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCkKIAkJaWYgKHVuZGVybHlpbmdSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiB8fCB1bmRlcmx5aW5nUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlub25KYXZhUmVzb3VyY2VzID0gCisJCQlyZXNvdXJjZXMgPQogCQkJCWNvbXB1dGVGb2xkZXJOb25KYXZhUmVzb3VyY2VzKAotCQkJCQkoSmF2YVByb2plY3QpcHJvamVjdCwgCi0JCQkJCShJQ29udGFpbmVyKSB1bmRlcmx5aW5nUmVzb3VyY2UsICAKKwkJCQkJaGFuZGxlLAorCQkJCQkoSUNvbnRhaW5lcikgdW5kZXJseWluZ1Jlc291cmNlLAogCQkJCQloYW5kbGUuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLAogCQkJCQloYW5kbGUuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpKTsKIAkJfQogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCS8vIGlnbm9yZQogCX0KLQlyZXR1cm4gbm9uSmF2YVJlc291cmNlczsKKwlyZXR1cm4gcmVzb3VyY2VzOwogfQogLyoqCiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCiBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSwgUGFja2FnZUZyYWdtZW50Um9vdCBoYW5kbGUpIHsKLQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gdGhpcy5mTm9uSmF2YVJlc291cmNlczsKLQlpZiAobm9uSmF2YVJlc291cmNlcyA9PSBudWxsKSB7Ci0JCW5vbkphdmFSZXNvdXJjZXMgPSB0aGlzLmNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKHByb2plY3QsIHVuZGVybHlpbmdSZXNvdXJjZSwgaGFuZGxlKTsKLQkJdGhpcy5mTm9uSmF2YVJlc291cmNlcyA9IG5vbkphdmFSZXNvdXJjZXM7CisJT2JqZWN0W10gcmVzb3VyY2VzID0gdGhpcy5ub25KYXZhUmVzb3VyY2VzOworCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkgeworCQlyZXNvdXJjZXMgPSBjb21wdXRlTm9uSmF2YVJlc291cmNlcyh1bmRlcmx5aW5nUmVzb3VyY2UsIGhhbmRsZSk7CisJCXRoaXMubm9uSmF2YVJlc291cmNlcyA9IHJlc291cmNlczsKIAl9Ci0JcmV0dXJuIG5vbkphdmFSZXNvdXJjZXM7CisJcmV0dXJuIHJlc291cmNlczsKIH0KIC8qKgogICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHJvb3QuCiAgKi8KIHB1YmxpYyBpbnQgZ2V0Um9vdEtpbmQoKSB7Ci0JcmV0dXJuIHRoaXMuZlJvb3RLaW5kOworCXJldHVybiB0aGlzLnJvb3RLaW5kOwogfQogLyoqCiAgKiBSZXR1bnMgdGhlIFNvdXJjZU1hcHBlciBmb3IgdGhpcyByb290LCBvciA8Y29kZT5udWxsPC9jb2RlPgpAQCAtMTYxLDEzICsxNjgsMTMgQEAKICAqIFNldCB0aGUgZk5vbkphdmFSZXNvdXJjZXMgdG8gcmVzIHZhbHVlCiAgKi8KIHZvaWQgc2V0Tm9uSmF2YVJlc291cmNlcyhPYmplY3RbXSByZXNvdXJjZXMpIHsKLQl0aGlzLmZOb25KYXZhUmVzb3VyY2VzID0gcmVzb3VyY2VzOworCXRoaXMubm9uSmF2YVJlc291cmNlcyA9IHJlc291cmNlczsKIH0KIC8qKgogICogU2V0cyB0aGUga2luZCBvZiB0aGlzIHJvb3QuCiAgKi8KIHByb3RlY3RlZCB2b2lkIHNldFJvb3RLaW5kKGludCBuZXdSb290S2luZCkgewotCXRoaXMuZlJvb3RLaW5kID0gbmV3Um9vdEtpbmQ7CisJdGhpcy5yb290S2luZCA9IG5ld1Jvb3RLaW5kOwogfQogLyoqCiAgKiBTZXRzIHRoZSBTb3VyY2VNYXBwZXIgZm9yIHRoaXMgcm9vdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Byb2plY3RSZWZlcmVuY2VDaGFuZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Byb2plY3RSZWZlcmVuY2VDaGFuZ2UuamF2YQppbmRleCBlMGZmOWM0Li4yNjY0MTFiIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Qcm9qZWN0UmVmZXJlbmNlQ2hhbmdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUHJvamVjdFJlZmVyZW5jZUNoYW5nZS5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTUsMTggKzE1LDIzIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIFByb2plY3RSZWZlcmVuY2VDaGFuZ2UgewotCQorCiAJcHJpdmF0ZSBKYXZhUHJvamVjdCBwcm9qZWN0OwogCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRDbGFzc3BhdGg7Ci0JCisKIAlwdWJsaWMgUHJvamVjdFJlZmVyZW5jZUNoYW5nZShKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZENsYXNzcGF0aCkgewogCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogCQl0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoID0gb2xkUmVzb2x2ZWRDbGFzc3BhdGg7CkBAIC00MCwxMSArNDUsMTAgQEAKIAkJU3RyaW5nW10gb2xkUmVxdWlyZWQgPSB0aGlzLm9sZFJlc29sdmVkQ2xhc3NwYXRoID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1MgOiB0aGlzLnByb2plY3QucHJvamVjdFByZXJlcXVpc2l0ZXModGhpcy5vbGRSZXNvbHZlZENsYXNzcGF0aCk7CiAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkQ2xhc3NwYXRoID0gdGhpcy5wcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CiAJCVN0cmluZ1tdIG5ld1JlcXVpcmVkID0gdGhpcy5wcm9qZWN0LnByb2plY3RQcmVyZXF1aXNpdGVzKG5ld1Jlc29sdmVkQ2xhc3NwYXRoKTsKKwkJZmluYWwgSVByb2plY3QgcHJvamVjdFJlc291cmNlID0gdGhpcy5wcm9qZWN0LmdldFByb2plY3QoKTsKKwkJCiAJCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0UmVzb3VyY2UgPSB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3RSZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJIAotCQkJSVByb2plY3RbXSBwcm9qZWN0UmVmZXJlbmNlcyA9IGRlc2NyaXB0aW9uLmdldER5bmFtaWNSZWZlcmVuY2VzKCk7CisJCQlJUHJvamVjdFtdIHByb2plY3RSZWZlcmVuY2VzID0gcHJvamVjdFJlc291cmNlLmdldERlc2NyaXB0aW9uKCkuZ2V0RHluYW1pY1JlZmVyZW5jZXMoKTsKIAkJCQogCQkJSGFzaFNldCBvbGRSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQocHJvamVjdFJlZmVyZW5jZXMubGVuZ3RoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspewpAQCAtODQsMTQgKzg4LDI2IEBACiAJCQl9CiAJCQlVdGlsLnNvcnQocmVxdWlyZWRQcm9qZWN0TmFtZXMpOyAvLyBlbnN1cmUgdGhhdCBpZiBjaGFuZ2VkLCB0aGUgb3JkZXIgaXMgY29uc2lzdGVudAogCQkJCi0JCQlJUHJvamVjdFtdIHJlcXVpcmVkUHJvamVjdEFycmF5ID0gbmV3IElQcm9qZWN0W25ld1NpemVdOworCQkJZmluYWwgSVByb2plY3RbXSByZXF1aXJlZFByb2plY3RBcnJheSA9IG5ldyBJUHJvamVjdFtuZXdTaXplXTsKIAkJCUlXb3Jrc3BhY2VSb290IHdrc1Jvb3QgPSBwcm9qZWN0UmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXplOyBpKyspewogCQkJCXJlcXVpcmVkUHJvamVjdEFycmF5W2ldID0gd2tzUm9vdC5nZXRQcm9qZWN0KHJlcXVpcmVkUHJvamVjdE5hbWVzW2ldKTsKIAkJCX0KLQkJCWRlc2NyaXB0aW9uLnNldER5bmFtaWNSZWZlcmVuY2VzKHJlcXVpcmVkUHJvamVjdEFycmF5KTsKLQkJCXByb2plY3RSZXNvdXJjZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCisJCQkJCisJCQkvLyBlbnN1cmUgdGhhdCBhIHNjaGVkdWxpbmcgcnVsZSBpcyB1c2VkIHNvIHRoYXQgdGhlIHByb2plY3QgZGVzY3JpcHRpb24gaXMgbm90IG1vZGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHdlIHVwZGF0ZSBpdAorCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ5ODEKKwkJCS8vIGFsc28gZW5zdXJlIHRoYXQgaWYgbm8gY2hhbmdlIChjaGVja0lkZW50aWZ5IGJsb2NrIHJldHVybmVkIGFib3ZlKSB3ZSBkb24ndCByZWFjaCBoZXJlCisJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTc1MQorCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBwcm9qZWN0UmVzb3VyY2UuZ2V0V29ya3NwYWNlKCk7CisJCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IHdvcmtzcGFjZS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUocHJvamVjdFJlc291cmNlKTsgLy8gc2NoZWR1bGluZyBydWxlIGZvciBtb2RpZnlpbmcgdGhlIHByb2plY3QKKwkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdFJlc291cmNlLmdldERlc2NyaXB0aW9uKCk7CisJCQkJCWRlc2NyaXB0aW9uLnNldER5bmFtaWNSZWZlcmVuY2VzKHJlcXVpcmVkUHJvamVjdEFycmF5KTsKKwkJCQkJcHJvamVjdFJlc291cmNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRywgbnVsbCk7CisJCQkJfQorCQkJfTsKKwkJCXdvcmtzcGFjZS5ydW4ocnVubmFibGUsIHJ1bGUsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKIAkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewogCQkJaWYgKCFFeHRlcm5hbEphdmFQcm9qZWN0LkVYVEVSTkFMX1BST0pFQ1RfTkFNRS5lcXVhbHModGhpcy5wcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKQogCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQppbmRleCA4Mjc1NmFjLi44MDk1YTNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNzUsNyArNzUsNyBAQAogCiAJCQkvLyBjaGVjayBpcyBwcm9ibGVtIHJlcXVlc3RvciBpcyBhY3RpdmUKIAkJCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IgPSB3b3JraW5nQ29weS5nZXRQZXJXb3JraW5nQ29weUluZm8oKTsKLQkJCWlmIChwcm9ibGVtUmVxdWVzdG9yICE9IG51bGwpIAorCQkJaWYgKHByb2JsZW1SZXF1ZXN0b3IgIT0gbnVsbCkKIAkJCQlwcm9ibGVtUmVxdWVzdG9yID0gICgoSmF2YU1vZGVsTWFuYWdlci5QZXJXb3JraW5nQ29weUluZm8pcHJvYmxlbVJlcXVlc3RvcikuZ2V0UHJvYmxlbVJlcXVlc3RvcigpOwogCQkJYm9vbGVhbiBkZWZhdWx0UmVxdWVzdG9ySXNBY3RpdmUgPSBwcm9ibGVtUmVxdWVzdG9yICE9IG51bGwgJiYgcHJvYmxlbVJlcXVlc3Rvci5pc0FjdGl2ZSgpOwogCQkJSVByb2JsZW1SZXF1ZXN0b3Igb3duZXJQcm9ibGVtUmVxdWVzdG9yID0gdGhpcy53b3JraW5nQ29weU93bmVyLmdldFByb2JsZW1SZXF1ZXN0b3Iod29ya2luZ0NvcHkpOwpAQCAtMTY3LDM5ICsxNjcsMzggQEAKIAkJCS8vIG1ha2Ugd29ya2luZyBjb3B5IGNvbnNpc3RlbnQKIAkJCWlmICh0aGlzLnByb2JsZW1zID09IG51bGwpIHRoaXMucHJvYmxlbXMgPSBuZXcgSGFzaE1hcCgpOwogCQkJdGhpcy5yZXNvbHZlQmluZGluZ3MgPSB0aGlzLnJlcXVlc3RvcklzQWN0aXZlOwotCQkJdGhpcy5hc3QgPSB3b3JraW5nQ29weS5tYWtlQ29uc2lzdGVudCh0aGlzLmFzdExldmVsLCB0aGlzLnJlc29sdmVCaW5kaW5ncywgcmVjb25jaWxlRmxhZ3MsIHRoaXMucHJvYmxlbXMsIHRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKKwkJCXRoaXMuYXN0ID0gd29ya2luZ0NvcHkubWFrZUNvbnNpc3RlbnQodGhpcy5hc3RMZXZlbCwgdGhpcy5yZXNvbHZlQmluZGluZ3MsIHRoaXMucmVjb25jaWxlRmxhZ3MsIHRoaXMucHJvYmxlbXMsIHRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCXRoaXMuZGVsdGFCdWlsZGVyLmJ1aWxkRGVsdGFzKCk7CiAJCQlpZiAodGhpcy5hc3QgIT0gbnVsbCAmJiB0aGlzLmRlbHRhQnVpbGRlci5kZWx0YSAhPSBudWxsKQogCQkJCXRoaXMuZGVsdGFCdWlsZGVyLmRlbHRhLmNoYW5nZWRBU1QodGhpcy5hc3QpOwogCQkJcmV0dXJuIHRoaXMuYXN0OwogCQl9Ci0JCWlmICh0aGlzLmFzdCAhPSBudWxsKSAKKwkJaWYgKHRoaXMuYXN0ICE9IG51bGwpCiAJCQlyZXR1cm4gdGhpcy5hc3Q7IC8vIG5vIG5lZWQgdG8gcmVjb21wdXRlIEFTVCBpZiBrbm93biBhbHJlYWR5Ci0JCQorCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOwotCQljaGFyW10gY29udGVudHMgPSBudWxsOwogCQl0cnkgeworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuYWJvcnRPbk1pc3NpbmdTb3VyY2Uuc2V0KEJvb2xlYW4uVFJVRSk7CisJCQlDb21waWxhdGlvblVuaXQgc291cmNlID0gd29ya2luZ0NvcHkuY2xvbmVDYWNoaW5nQ29udGVudHMoKTsKIAkJCS8vIGZpbmQgcHJvYmxlbXMgaWYgbmVlZGVkCi0JCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZSh3b3JraW5nQ29weS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkgCisJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZSh3b3JraW5nQ29weS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkKIAkJCQkJJiYgKHRoaXMucmVjb25jaWxlRmxhZ3MgJiBJQ29tcGlsYXRpb25Vbml0LkZPUkNFX1BST0JMRU1fREVURUNUSU9OKSAhPSAwKSB7CiAJCQkJdGhpcy5yZXNvbHZlQmluZGluZ3MgPSB0aGlzLnJlcXVlc3RvcklzQWN0aXZlOwogCQkJCWlmICh0aGlzLnByb2JsZW1zID09IG51bGwpCiAJCQkJCXRoaXMucHJvYmxlbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWNvbnRlbnRzID0gd29ya2luZ0NvcHkuZ2V0Q29udGVudHMoKTsKIAkJCQl1bml0ID0KIAkJCQkJQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5wcm9jZXNzKAotCQkJCQkJd29ya2luZ0NvcHksCi0JCQkJCQljb250ZW50cywKKwkJCQkJCXNvdXJjZSwKIAkJCQkJCXRoaXMud29ya2luZ0NvcHlPd25lciwKIAkJCQkJCXRoaXMucHJvYmxlbXMsCiAJCQkJCQl0aGlzLmFzdExldmVsICE9IElDb21waWxhdGlvblVuaXQuTk9fQVNULypjcmVhdGluZyBBU1QgaWYgbGV2ZWwgaXMgbm90IE5PX0FTVCAqLywKLQkJCQkJCXJlY29uY2lsZUZsYWdzLAorCQkJCQkJdGhpcy5yZWNvbmNpbGVGbGFncywKIAkJCQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgdGhpcy5wcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwogCQkJfQotCQkJCisKIAkJCS8vIGNyZWF0ZSBBU1QgaWYgbmVlZGVkCi0JCQlpZiAodGhpcy5hc3RMZXZlbCAhPSBJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCAKKwkJCWlmICh0aGlzLmFzdExldmVsICE9IElDb21waWxhdGlvblVuaXQuTk9fQVNUCiAJCQkJCSYmIHVuaXQgIT1udWxsLyp1bml0IGlzIG51bGwgaWYgd29ya2luZyBjb3B5IGlzIGNvbnNpc3RlbnQgJiYgKHByb2JsZW0gZGV0ZWN0aW9uIG5vdCBmb3JjZWQgfHwgbm9uLUphdmEgcHJvamVjdCkgLT4gZG9uJ3QgY3JlYXRlIEFTVCBhcyBwZXIgQVBJKi8pIHsKIAkJCQlNYXAgb3B0aW9ucyA9IHdvcmtpbmdDb3B5LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKTsKIAkJCQkvLyBjb252ZXJ0IEFTVApAQCAtMjA3LDE0ICsyMDYsMTUgQEAKIAkJCQkJQVNULmNvbnZlcnRDb21waWxhdGlvblVuaXQoCiAJCQkJCQl0aGlzLmFzdExldmVsLAogCQkJCQkJdW5pdCwKLQkJCQkJCWNvbnRlbnRzLAogCQkJCQkJb3B0aW9ucywKIAkJCQkJCXRoaXMucmVzb2x2ZUJpbmRpbmdzLAotCQkJCQkJd29ya2luZ0NvcHksCi0JCQkJCQlyZWNvbmNpbGVGbGFncywKKwkJCQkJCXNvdXJjZSwKKwkJCQkJCXRoaXMucmVjb25jaWxlRmxhZ3MsCiAJCQkJCQl0aGlzLnByb2dyZXNzTW9uaXRvcik7CiAJCQkJaWYgKHRoaXMuYXN0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5kZWx0YUJ1aWxkZXIuZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YSh3b3JraW5nQ29weSk7CisJCQkJCWlmICh0aGlzLmRlbHRhQnVpbGRlci5kZWx0YSA9PSBudWxsKSB7CisJCQkJCQl0aGlzLmRlbHRhQnVpbGRlci5kZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHdvcmtpbmdDb3B5KTsKKwkJCQkJfQogCQkJCQl0aGlzLmRlbHRhQnVpbGRlci5kZWx0YS5jaGFuZ2VkQVNUKHRoaXMuYXN0KTsKIAkJCQl9CiAJCQkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKQEAgLTIyNSwxMyArMjI1LDE0IEBACiAJICAgIAkvLyBlbHNlIEphdmFQcm9qZWN0IGhhcyBsb3N0IGl0cyBuYXR1cmUgKG9yIG1vc3QgbGlrZWx5IHdhcyBjbG9zZWQvZGVsZXRlZCkgd2hpbGUgcmVjb25jaWxpbmcgLT4gaWdub3JlCiAJICAgIAkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA5MTkpCiAJICAgIH0gZmluYWxseSB7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5hYm9ydE9uTWlzc2luZ1NvdXJjZS5zZXQobnVsbCk7CiAJICAgICAgICBpZiAodW5pdCAhPSBudWxsKSB7CiAJICAgICAgICAgICAgdW5pdC5jbGVhblVwKCk7CiAJICAgICAgICB9CiAJICAgIH0KIAkJcmV0dXJuIHRoaXMuYXN0OwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBub3RpZnlQYXJ0aWNpcGFudHMoZmluYWwgQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5KSB7CiAJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldFdvcmtpbmdDb3B5KCkuZ2V0SmF2YVByb2plY3QoKTsKIAkJQ29tcGlsYXRpb25QYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNvbXBpbGF0aW9uUGFydGljaXBhbnRzLmdldENvbXBpbGF0aW9uUGFydGljaXBhbnRzKGphdmFQcm9qZWN0KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVnaW9uLmphdmEKaW5kZXggYjM1ZDc5Yi4uZTdkZTg0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVnaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVnaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMjEgKzE5LDIxIEBACiAvKioKICAqIEBzZWUgSVJlZ2lvbgogICovCi0gCisKIHB1YmxpYyBjbGFzcyBSZWdpb24gaW1wbGVtZW50cyBJUmVnaW9uIHsKIAogCS8qKgogCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnRzCiAJICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHJlZ2lvbgogCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgZlJvb3RFbGVtZW50czsKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IHJvb3RFbGVtZW50czsKIC8qKgogICogQ3JlYXRlcyBhbiBlbXB0eSByZWdpb24uCiAgKgogICogQHNlZSBJUmVnaW9uCiAgKi8KIHB1YmxpYyBSZWdpb24oKSB7Ci0JZlJvb3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7CisJdGhpcy5yb290RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwogfQogLyoqCiAgKiBAc2VlIElSZWdpb24jYWRkKElKYXZhRWxlbWVudCkKQEAgLTQyLDIwICs0MiwyMCBAQAogCWlmICghY29udGFpbnMoZWxlbWVudCkpIHsKIAkJLy8ibmV3IiBlbGVtZW50IGFkZGVkIHRvIHJlZ2lvbgogCQlyZW1vdmVBbGxDaGlsZHJlbihlbGVtZW50KTsKLQkJZlJvb3RFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCWZSb290RWxlbWVudHMudHJpbVRvU2l6ZSgpOworCQl0aGlzLnJvb3RFbGVtZW50cy5hZGQoZWxlbWVudCk7CisJCXRoaXMucm9vdEVsZW1lbnRzLnRyaW1Ub1NpemUoKTsKIAl9CiB9CiAvKioKICAqIEBzZWUgSVJlZ2lvbgogICovCiBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQotCWludCBzaXplID0gZlJvb3RFbGVtZW50cy5zaXplKCk7CisKKwlpbnQgc2l6ZSA9IHRoaXMucm9vdEVsZW1lbnRzLnNpemUoKTsKIAlBcnJheUxpc3QgcGFyZW50cyA9IGdldEFuY2VzdG9ycyhlbGVtZW50KTsKLQkKKwogCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCUlKYXZhRWxlbWVudCBhVG9wID0gKElKYXZhRWxlbWVudCkgZlJvb3RFbGVtZW50cy5nZXQoaSk7CisJCUlKYXZhRWxlbWVudCBhVG9wID0gKElKYXZhRWxlbWVudCkgdGhpcy5yb290RWxlbWVudHMuZ2V0KGkpOwogCQlpZiAoYVRvcC5lcXVhbHMoZWxlbWVudCkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CkBAIC04NywxMCArODcsMTAgQEAKICAqIEBzZWUgSVJlZ2lvbgogICovCiBwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKSB7Ci0JaW50IHNpemU9IGZSb290RWxlbWVudHMuc2l6ZSgpOworCWludCBzaXplPSB0aGlzLnJvb3RFbGVtZW50cy5zaXplKCk7CiAJSUphdmFFbGVtZW50W10gcm9vdHM9IG5ldyBJSmF2YUVsZW1lbnRbc2l6ZV07CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJcm9vdHNbaV09IChJSmF2YUVsZW1lbnQpIGZSb290RWxlbWVudHMuZ2V0KGkpOworCQlyb290c1tpXT0gKElKYXZhRWxlbWVudCkgdGhpcy5yb290RWxlbWVudHMuZ2V0KGkpOwogCX0KIAogCXJldHVybiByb290czsKQEAgLTEwMSw3ICsxMDEsNyBAQAogcHVibGljIGJvb2xlYW4gcmVtb3ZlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAKIAlyZW1vdmVBbGxDaGlsZHJlbihlbGVtZW50KTsKLQlyZXR1cm4gZlJvb3RFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7CisJcmV0dXJuIHRoaXMucm9vdEVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKIH0KIC8qKgogICogUmVtb3ZlcyBhbnkgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcwpAQCAtMTEyLDggKzExMiw4IEBACiBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDaGlsZHJlbihJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewogCQlBcnJheUxpc3QgbmV3Um9vdEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGZSb290RWxlbWVudHMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgY3VycmVudFJvb3QgPSAoSUphdmFFbGVtZW50KWZSb290RWxlbWVudHMuZ2V0KGkpOworCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IHRoaXMucm9vdEVsZW1lbnRzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgeworCQkJSUphdmFFbGVtZW50IGN1cnJlbnRSb290ID0gKElKYXZhRWxlbWVudCl0aGlzLnJvb3RFbGVtZW50cy5nZXQoaSk7CiAJCQkvL3dhbGsgdGhlIGN1cnJlbnQgcm9vdCBoaWVyYXJjaHkKIAkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBjdXJyZW50Um9vdC5nZXRQYXJlbnQoKTsKIAkJCWJvb2xlYW4gaXNDaGlsZD0gZmFsc2U7CkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCQluZXdSb290RWxlbWVudHMuYWRkKGN1cnJlbnRSb290KTsKIAkJCX0KIAkJfQotCQlmUm9vdEVsZW1lbnRzPSBuZXdSb290RWxlbWVudHM7CisJCXRoaXMucm9vdEVsZW1lbnRzPSBuZXdSb290RWxlbWVudHM7CiAJfQogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCA1YmY0MDc2Li5kYzZiNmNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDIsNyArNDIsNyBAQAogICogQHNlZSBNdWx0aU9wZXJhdGlvbgogICovCiBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKLQlyZXR1cm4gTWVzc2FnZXMub3BlcmF0aW9uX3JlbmFtZUVsZW1lbnRQcm9ncmVzczsgCisJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9yZW5hbWVFbGVtZW50UHJvZ3Jlc3M7CiB9CiAvKioKICAqIEBzZWUgQ29weUVsZW1lbnRzT3BlcmF0aW9uI2lzUmVuYW1lKCkKQEAgLTY3LDE3ICs2NywxNyBAQAogcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQogCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnQpOwotCQkKKwogCWlmIChlbGVtZW50LmlzUmVhZE9ubHkoKSkKIAkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIGVsZW1lbnQpOwotCQkKKwogCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSkKIAkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOwotCQkKKwogCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKIAlpZiAoZWxlbWVudFR5cGUgPCBJSmF2YUVsZW1lbnQuVFlQRSB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIpCiAJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKLQkJCisKIAl2ZXJpZnlSZW5hbWluZyhlbGVtZW50KTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBkNDhmZjFhLi5mOTU3OWUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDcgQEAKICAqIFRoaXMgb3BlcmF0aW9uIHJlbmFtZXMgcmVzb3VyY2VzIChQYWNrYWdlIGZyYWdtZW50cyBhbmQgY29tcGlsYXRpb24gdW5pdHMpLgogICoKICAqIDxwPk5vdGVzOjx1bD4KLSAqIDxsaT5XaGVuIGEgY29tcGlsYXRpb24gdW5pdCBpcyByZW5hbWVkLCBpdHMgbWFpbiB0eXBlIGFuZCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSAKKyAqIDxsaT5XaGVuIGEgY29tcGlsYXRpb24gdW5pdCBpcyByZW5hbWVkLCBpdHMgbWFpbiB0eXBlIGFuZCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZQogICogCQltYWluIHR5cGUgYXJlIHJlbmFtZWQuCiAgKiA8L3VsPgogICovCkBAIC0zOCw3ICszOCw3IEBACiAgKiBAc2VlIE11bHRpT3BlcmF0aW9uCiAgKi8KIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgewotCXJldHVybiBNZXNzYWdlcy5vcGVyYXRpb25fcmVuYW1lUmVzb3VyY2VQcm9ncmVzczsgCisJcmV0dXJuIE1lc3NhZ2VzLm9wZXJhdGlvbl9yZW5hbWVSZXNvdXJjZVByb2dyZXNzOwogfQogLyoqCiAgKiBAc2VlIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uI2lzUmVuYW1lKCkKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdXBlci52ZXJpZnkoZWxlbWVudCk7CiAKIAlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0JCisKIAlpZiAoIShlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkpIHsKIAkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5RmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5RmllbGQuamF2YQppbmRleCA4MWMwNzkzLi43OGY3OWFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZEJpbmFyeUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVzb2x2ZWRCaW5hcnlGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDkgKzE1LDkgQEAKICAqIFRoZSB1bmlxdWVLZXkgY29udGFpbnMgdGhlIGdlbmVyaWNTaWduYXR1cmUgb2YgdGhlIHJlc29sdmVkIGZpZWxkLiBVc2UgQmluZGluZ0tleSB0byBkZWNvZGUgaXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvbHZlZEJpbmFyeUZpZWxkIGV4dGVuZHMgQmluYXJ5RmllbGQgewotCQorCiAJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlS2V5OwotCQorCiAJLyoKIAkgKiBTZWUgY2xhc3MgY29tbWVudHMuCiAJICovCkBAIC0yNSwxNCArMjUsMTQgQEAKIAkJc3VwZXIocGFyZW50LCBuYW1lKTsKIAkJdGhpcy51bmlxdWVLZXkgPSB1bmlxdWVLZXk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5RmllbGQjZ2V0S2V5KCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKIAkJcmV0dXJuIHRoaXMudW5pcXVlS2V5OwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCNpc1Jlc29sdmVkKCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5TWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZEJpbmFyeU1ldGhvZC5qYXZhCmluZGV4IGFmZjExNzEuLmQzNmM4ZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5TWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVzb2x2ZWRCaW5hcnlNZXRob2QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSw5ICsxNSw5IEBACiAgKiBUaGUgdW5pcXVlS2V5IGNvbnRhaW5zIHRoZSBnZW5lcmljU2lnbmF0dXJlIG9mIHRoZSByZXNvbHZlZCBtZXRob2QuIFVzZSBCaW5kaW5nS2V5IHRvIGRlY29kZSBpdC4KICAqLwogcHVibGljIGNsYXNzIFJlc29sdmVkQmluYXJ5TWV0aG9kIGV4dGVuZHMgQmluYXJ5TWV0aG9kIHsKLQkKKwogCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUtleTsKLQkKKwogCS8qCiAJICogU2VlIGNsYXNzIGNvbW1lbnRzLgogCSAqLwpAQCAtMzcsNyArMzcsNyBAQAogCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogCSAqLwpAQCAtNDksNyArNDksNyBAQAogCQkJYnVmZmVyLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgSmF2YUVsZW1lbnQgdW5yZXNvbHZlZCgpIHsKIAkJU291cmNlUmVmRWxlbWVudCBoYW5kbGUgPSBuZXcgQmluYXJ5TWV0aG9kKHRoaXMucGFyZW50LCB0aGlzLm5hbWUsIHRoaXMucGFyYW1ldGVyVHlwZXMpOwogCQloYW5kbGUub2NjdXJyZW5jZUNvdW50ID0gdGhpcy5vY2N1cnJlbmNlQ291bnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZEJpbmFyeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5VHlwZS5qYXZhCmluZGV4IGIxY2M0YWQuLjFjNWQyZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkQmluYXJ5VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDkgKzE3LDkgQEAKICAqIFRoZSB1bmlxdWVLZXkgY29udGFpbnMgdGhlIGdlbmVyaWNUeXBlU2lnbmF0dXJlIG9mIHRoZSByZXNvbHZlZCB0eXBlLiBVc2UgQmluZGluZ0tleSB0byBkZWNvZGUgaXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvbHZlZEJpbmFyeVR5cGUgZXh0ZW5kcyBCaW5hcnlUeXBlIHsKLQkKKwogCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUtleTsKLQkKKwogCS8qCiAJICogU2VlIGNsYXNzIGNvbW1lbnRzLgogCSAqLwpAQCAtMjksMjMgKzI5LDIzIEBACiAJfQogCiAJcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFBhcmFtZXRlcml6ZWROYW1lKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRGdWxseVF1YWxpZmllZFBhcmFtZXRlcml6ZWROYW1lKGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCB0aGlzLnVuaXF1ZUtleSk7CisJCXJldHVybiBnZXRGdWxseVF1YWxpZmllZFBhcmFtZXRlcml6ZWROYW1lKGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpLCB0aGlzLnVuaXF1ZUtleSk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZSNnZXRLZXkoKQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewogCQlyZXR1cm4gdGhpcy51bmlxdWVLZXk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZSNpc1Jlc29sdmVkKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKIAkgKi8KQEAgLTU3LDcgKzU3LDcgQEAKIAkJCWJ1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCQorCiAJcHVibGljIEphdmFFbGVtZW50IHVucmVzb2x2ZWQoKSB7CiAJCVNvdXJjZVJlZkVsZW1lbnQgaGFuZGxlID0gbmV3IEJpbmFyeVR5cGUodGhpcy5wYXJlbnQsIHRoaXMubmFtZSk7CiAJCWhhbmRsZS5vY2N1cnJlbmNlQ291bnQgPSB0aGlzLm9jY3VycmVuY2VDb3VudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkU291cmNlRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkU291cmNlRmllbGQuamF2YQppbmRleCBkNzEwZjA0Li44OTgyNmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVzb2x2ZWRTb3VyY2VGaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDkgKzE1LDkgQEAKICAqIFRoZSB1bmlxdWVLZXkgY29udGFpbnMgdGhlIGdlbmVyaWNTaWduYXR1cmUgb2YgdGhlIHJlc29sdmVkIGZpZWxkLiBVc2UgQmluZGluZ0tleSB0byBkZWNvZGUgaXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvbHZlZFNvdXJjZUZpZWxkIGV4dGVuZHMgU291cmNlRmllbGQgewotCQorCiAJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlS2V5OwotCQorCiAJLyoKIAkgKiBTZWUgY2xhc3MgY29tbWVudHMuCiAJICovCkBAIC0yNSwyMSArMjUsMjEgQEAKIAkJc3VwZXIocGFyZW50LCBuYW1lKTsKIAkJdGhpcy51bmlxdWVLZXkgPSB1bmlxdWVLZXk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlRmllbGQjZ2V0S2V5KCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKIAkJcmV0dXJuIHRoaXMudW5pcXVlS2V5OwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZCNpc1Jlc29sdmVkKCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKIAkgKi8KQEAgLTQ3LDExICs0NywxMSBAQAogCQlzdXBlci50b1N0cmluZ0luZm8odGFiLCBidWZmZXIsIGluZm8sIHNob3dSZXNvbHZlZEluZm8pOwogCQlpZiAoc2hvd1Jlc29sdmVkSW5mbykgewogCQkJYnVmZmVyLmFwcGVuZCgiIHtrZXk9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy51bmlxdWVLZXkpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEtleSgpKTsKIAkJCWJ1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCQorCiAJcHVibGljIEphdmFFbGVtZW50IHVucmVzb2x2ZWQoKSB7CiAJCVNvdXJjZVJlZkVsZW1lbnQgaGFuZGxlID0gbmV3IFNvdXJjZUZpZWxkKHRoaXMucGFyZW50LCB0aGlzLm5hbWUpOwogCQloYW5kbGUub2NjdXJyZW5jZUNvdW50ID0gdGhpcy5vY2N1cnJlbmNlQ291bnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVzb2x2ZWRTb3VyY2VNZXRob2QuamF2YQppbmRleCAxYjY3NjUxLi40MTVjNDRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1Jlc29sdmVkU291cmNlTWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsOSArMTUsOSBAQAogICogVGhlIHVuaXF1ZUtleSBjb250YWlucyB0aGUgZ2VuZXJpY1NpZ25hdHVyZSBvZiB0aGUgcmVzb2x2ZWQgbWV0aG9kLiBVc2UgQmluZGluZ0tleSB0byBkZWNvZGUgaXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvbHZlZFNvdXJjZU1ldGhvZCBleHRlbmRzIFNvdXJjZU1ldGhvZCB7Ci0JCisKIAlwcml2YXRlIFN0cmluZyB1bmlxdWVLZXk7Ci0JCisKIAkvKgogCSAqIFNlZSBjbGFzcyBjb21tZW50cy4KIAkgKi8KQEAgLTI1LDcgKzI1LDcgQEAKIAkJc3VwZXIocGFyZW50LCBuYW1lLCBwYXJhbWV0ZXJUeXBlcyk7CiAJCXRoaXMudW5pcXVlS2V5ID0gdW5pcXVlS2V5OwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1ldGhvZCNnZXRLZXkoKQogCSAqLwpAQCAtMzgsNyArMzgsNyBAQAogCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogCSAqLwpAQCAtNDYsNyArNDYsNyBAQAogCQlzdXBlci50b1N0cmluZ0luZm8odGFiLCBidWZmZXIsIGluZm8sIHNob3dSZXNvbHZlZEluZm8pOwogCQlpZiAoc2hvd1Jlc29sdmVkSW5mbykgewogCQkJYnVmZmVyLmFwcGVuZCgiIHtrZXk9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy51bmlxdWVLZXkpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEtleSgpKTsKIAkJCWJ1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVzb2x2ZWRTb3VyY2VUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZVR5cGUuamF2YQppbmRleCA1OWM0ZTZkLi4xOWFhOTE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZXNvbHZlZFNvdXJjZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw5ICsxNyw5IEBACiAgKiBUaGUgdW5pcXVlS2V5IGNvbnRhaW5zIHRoZSBnZW5lcmljVHlwZVNpZ25hdHVyZSBvZiB0aGUgcmVzb2x2ZWQgdHlwZS4gVXNlIEJpbmRpbmdLZXkgdG8gZGVjb2RlIGl0LgogICovCiBwdWJsaWMgY2xhc3MgUmVzb2x2ZWRTb3VyY2VUeXBlIGV4dGVuZHMgU291cmNlVHlwZSB7Ci0JCisKIAlwcml2YXRlIFN0cmluZyB1bmlxdWVLZXk7Ci0JCisKIAkvKgogCSAqIFNlZSBjbGFzcyBjb21tZW50cy4KIAkgKi8KQEAgLTI3LDI1ICsyNywyNSBAQAogCQlzdXBlcihwYXJlbnQsIG5hbWUpOwogCQl0aGlzLnVuaXF1ZUtleSA9IHVuaXF1ZUtleTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHRoaXMudW5pcXVlS2V5KTsKKwkJcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyksIHRoaXMudW5pcXVlS2V5KTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlI2dldEtleSgpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CiAJCXJldHVybiB0aGlzLnVuaXF1ZUtleTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlI2lzUmVzb2x2ZWQoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogCSAqLwpAQCAtNTMsMTEgKzUzLDExIEBACiAJCXN1cGVyLnRvU3RyaW5nSW5mbyh0YWIsIGJ1ZmZlciwgaW5mbywgc2hvd1Jlc29sdmVkSW5mbyk7CiAJCWlmIChzaG93UmVzb2x2ZWRJbmZvKSB7CiAJCQlidWZmZXIuYXBwZW5kKCIge2tleT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnVuaXF1ZUtleSk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0S2V5KCkpOwogCQkJYnVmZmVyLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgSmF2YUVsZW1lbnQgdW5yZXNvbHZlZCgpIHsKIAkJU291cmNlUmVmRWxlbWVudCBoYW5kbGUgPSBuZXcgU291cmNlVHlwZSh0aGlzLnBhcmVudCwgdGhpcy5uYW1lKTsKIAkJaGFuZGxlLm9jY3VycmVuY2VDb3VudCA9IHRoaXMub2NjdXJyZW5jZUNvdW50OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnQuamF2YQppbmRleCA0NWFjZWZjLi45MTNmM2U3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gY29udHJpYnV0aW9uIGZvciBidWcgMzM3ODY4IC0gW2NvbXBpbGVyXVttb2RlbF0gaW5jb21wbGV0ZSBzdXBwb3J0IGZvciBwYWNrYWdlLWluZm8uamF2YSB3aGVuIHVzaW5nIFNlYXJjaGFibGVFbnZpcm9ubWVudAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCkBAIC0yMiwyMyArMjMsMjggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkJhc2ljU2VhcmNoRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JUmVzdHJpY3RlZEFjY2Vzc0NvbnN0cnVjdG9yUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgogICoJVGhpcyBjbGFzcyBwcm92aWRlcyBhIDxjb2RlPlNlYXJjaGFibGVCdWlsZGVyRW52aXJvbm1lbnQ8L2NvZGU+IGZvciBjb2RlIGFzc2lzdCB3aGljaAotICoJdXNlcyB0aGUgSmF2YSBtb2RlbCBhcyBhIHNlYXJjaCB0b29sLiAgCisgKgl1c2VzIHRoZSBKYXZhIG1vZGVsIGFzIGEgc2VhcmNoIHRvb2wuCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWFyY2hhYmxlRW52aXJvbm1lbnQKIAlpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnQsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQkKKwogCXB1YmxpYyBOYW1lTG9va3VwIG5hbWVMb29rdXA7CiAJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcDsKIAlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXM7CisJcHJvdGVjdGVkIFdvcmtpbmdDb3B5T3duZXIgb3duZXI7CiAKIAlwcm90ZWN0ZWQgSmF2YVByb2plY3QgcHJvamVjdDsKIAlwcm90ZWN0ZWQgSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZTsKLQkKKwogCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXNzUmVzdHJpY3Rpb25zOwogCiAJLyoqCkBAIC00NiwxOCArNTIsMTEgQEAKIAkgKi8KIAlwdWJsaWMgU2VhcmNoYWJsZUVudmlyb25tZW50KEphdmFQcm9qZWN0IHByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbXSB3b3JraW5nQ29waWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5jaGVja0FjY2Vzc1Jlc3RyaWN0aW9ucyA9IAorCQl0aGlzLmNoZWNrQWNjZXNzUmVzdHJpY3Rpb25zID0KIAkJCSFKYXZhQ29yZS5JR05PUkUuZXF1YWxzKHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0ZPUkJJRERFTl9SRUZFUkVOQ0UsIHRydWUpKQogCQkJfHwgIUphdmFDb3JlLklHTk9SRS5lcXVhbHMocHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfRElTQ09VUkFHRURfUkVGRVJFTkNFLCB0cnVlKSk7CiAJCXRoaXMud29ya2luZ0NvcGllcyA9IHdvcmtpbmdDb3BpZXM7CiAJCXRoaXMubmFtZUxvb2t1cCA9IHByb2plY3QubmV3TmFtZUxvb2t1cCh3b3JraW5nQ29waWVzKTsKLQotCQkvLyBDcmVhdGUgc2VhcmNoIHNjb3BlIHdpdGggdmlzaWJsZSBlbnRyeSBvbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aAotCQlpZih0aGlzLmNoZWNrQWNjZXNzUmVzdHJpY3Rpb25zKSB7Ci0JCQl0aGlzLnNlYXJjaFNjb3BlID0gQmFzaWNTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cHJvamVjdH0pOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZWFyY2hTY29wZSA9IEJhc2ljU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZSh0aGlzLm5hbWVMb29rdXAucGFja2FnZUZyYWdtZW50Um9vdHMpOwotCQl9CiAJfQogCiAJLyoqCkBAIC02NSw2ICs2NCw3IEBACiAJICovCiAJcHVibGljIFNlYXJjaGFibGVFbnZpcm9ubWVudChKYXZhUHJvamVjdCBwcm9qZWN0LCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcyhwcm9qZWN0LCBvd25lciA9PSBudWxsID8gbnVsbCA6IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFdvcmtpbmdDb3BpZXMob3duZXIsIHRydWUvKmFkZCBwcmltYXJ5IFdDcyovKSk7CisJCXRoaXMub3duZXIgPSBvd25lcjsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBpbnQgY29udmVydFNlYXJjaEZpbHRlclRvTW9kZWxGaWx0ZXIoaW50IHNlYXJjaEZpbHRlcikgewpAQCAtOTIsNiArOTIsMTMgQEAKIAlwcm90ZWN0ZWQgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKIAkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCiAJCQlwYWNrYWdlTmFtZSA9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCWlmICh0aGlzLm93bmVyICE9IG51bGwpIHsKKwkJCVN0cmluZyBzb3VyY2UgPSB0aGlzLm93bmVyLmZpbmRTb3VyY2UodHlwZU5hbWUsIHBhY2thZ2VOYW1lKTsKKwkJCWlmIChzb3VyY2UgIT0gbnVsbCkgeworCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQmFzaWNDb21waWxhdGlvblVuaXQoc291cmNlLnRvQ2hhckFycmF5KCksIENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHBhY2thZ2VOYW1lLnRvQ2hhckFycmF5KCkpLCB0eXBlTmFtZSArIFV0aWwuZGVmYXVsdEphdmFFeHRlbnNpb24oKSk7CisJCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoY3UsIG51bGwpOworCQkJfQorCQl9CiAJCU5hbWVMb29rdXAuQW5zd2VyIGFuc3dlciA9CiAJCQl0aGlzLm5hbWVMb29rdXAuZmluZFR5cGUoCiAJCQkJdHlwZU5hbWUsCkBAIC0xMDUsNyArMTEyLDcgQEAKIAkJCQl0cnkgewogCQkJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcigoSUJpbmFyeVR5cGUpICgoQmluYXJ5VHlwZSkgYW5zd2VyLnR5cGUpLmdldEVsZW1lbnRJbmZvKCksIGFuc3dlci5yZXN0cmljdGlvbik7CiAJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJLy8gZmFsbCBiYWNrIHRvIHVzaW5nIG93bmVyCiAJCQkJfQogCQkJfSBlbHNlIHsgLy9Tb3VyY2VUeXBlCiAJCQkJdHJ5IHsKQEAgLTExOCw3ICsxMjUsNyBAQAogCQkJCQkvLyBmaW5kIGFsbCBzaWJsaW5ncyAob3RoZXIgdHlwZXMgZGVjbGFyZWQgaW4gc2FtZSB1bml0LCBzaW5jZSBtYXkgYmUgdXNlZCBmb3IgbmFtZSByZXNvbHV0aW9uKQogCQkJCQlJVHlwZVtdIHR5cGVzID0gc291cmNlVHlwZS5nZXRIYW5kbGUoKS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlcygpOwogCQkJCQlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzID0gbmV3IElTb3VyY2VUeXBlW3R5cGVzLmxlbmd0aF07Ci0JCisKIAkJCQkJLy8gaW4gdGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uLCBlbnN1cmUgdGhlIHJlcXVlc3RlZCB0eXBlIGlzIHRoZSBmaXJzdCBvbmUKIAkJCQkJc291cmNlVHlwZXNbMF0gPSBzb3VyY2VUeXBlOwogCQkJCQlpbnQgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOwpAQCAtMTI5LDggKzEzNiwxMyBAQAogCQkJCQkJCXNvdXJjZVR5cGVzW2luZGV4KytdID0gb3RoZXJUeXBlOwogCQkJCQl9CiAJCQkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHNvdXJjZVR5cGVzLCBhbnN3ZXIucmVzdHJpY3Rpb24pOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQkJCQlpZiAoam1lLmlzRG9lc05vdEV4aXN0KCkgJiYgU3RyaW5nLnZhbHVlT2YoVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkuZXF1YWxzKHR5cGVOYW1lKSkgeworCQkJCQkJLy8gaW4gY2FzZSBvZiBwYWNrYWdlLWluZm8uamF2YSB0aGUgdHlwZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBtb2RlbCwKKwkJCQkJCS8vIGJ1dCB0aGUgQ1UgbWF5IHN0aWxsIGhlbHAgaW4gb3JkZXIgdG8gZmV0Y2ggcGFja2FnZSBsZXZlbCBhbm5vdGF0aW9ucy4KKwkJCQkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKChJQ29tcGlsYXRpb25Vbml0KWFuc3dlci50eXBlLmdldFBhcmVudCgpLCBhbnN3ZXIucmVzdHJpY3Rpb24pOworCQkJCQl9CisJCQkJCS8vIG5vIHVzYWJsZSBhbnN3ZXIKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTE5NCwxMCArMjA2LDEwIEBACiAJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAogCQkJCX0KIAkJCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQkJCQlyZXR1cm4gaXNDYW5jZWxlZDsKKwkJCQkJcmV0dXJuIHRoaXMuaXNDYW5jZWxlZDsKIAkJCQl9CiAJCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQkJCQlpc0NhbmNlbGVkID0gdmFsdWU7CisJCQkJCXRoaXMuaXNDYW5jZWxlZCA9IHZhbHVlOwogCQkJCX0KIAkJCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbikgewogCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKQEAgLTIyNSw3ICsyMzcsNyBAQAogCQkJCQluYW1lLAogCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsCiAJCQkJCXNlYXJjaEZvciwKLQkJCQkJdGhpcy5zZWFyY2hTY29wZSwKKwkJCQkJZ2V0U2VhcmNoU2NvcGUoKSwKIAkJCQkJdHlwZVJlcXVlc3RvciwKIAkJCQkJQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gsCiAJCQkJCXByb2dyZXNzTW9uaXRvcik7CkBAIC0yNDIsNyArMjU0LDcgQEAKIAkJCQljb252ZXJ0U2VhcmNoRmlsdGVyVG9Nb2RlbEZpbHRlcihzZWFyY2hGb3IpKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYWxsIHR5cGVzIHdob3NlIHNpbXBsZSBuYW1lIG1hdGNoZXMgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+bmFtZTwvY29kZT4uCiAJICovCkBAIC0yNTEsNyArMjYzLDcgQEAKIAkJCW5ldyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3Ioc3RvcmFnZSwgdGhpcy51bml0VG9Ta2lwLCB0aGlzLnByb2plY3QsIHRoaXMubmFtZUxvb2t1cCk7CiAJCXRoaXMubmFtZUxvb2t1cC5zZWVrVHlwZXMobmFtZSwgbnVsbCwgZmFsc2UsIHR5cGUsIHJlcXVlc3Rvcik7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQjZmluZFR5cGUoY2hhcltdW10pCiAJICovCkBAIC0zMDAsMTEgKzMxMiwzMiBAQAogCSAqIHR5cGVzIGFyZSBmb3VuZCByZWxhdGl2ZSB0byB0aGVpciBlbmNsb3NpbmcgdHlwZS4KIAkgKi8KIAlwdWJsaWMgdm9pZCBmaW5kVHlwZXMoY2hhcltdIHByZWZpeCwgZmluYWwgYm9vbGVhbiBmaW5kTWVtYmVycywgYm9vbGVhbiBjYW1lbENhc2VNYXRjaCwgaW50IHNlYXJjaEZvciwgZmluYWwgSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlKSB7Ci0KKwkJZmluZFR5cGVzKHByZWZpeCwgZmluZE1lbWJlcnMsIGNhbWVsQ2FzZU1hdGNoLCBzZWFyY2hGb3IsIHN0b3JhZ2UsIG51bGwpOworCX0KKwkvKioKKwkgKiBNdXN0IGJlIHVzZWQgb25seSBieSBDb21wbGV0aW9uRW5naW5lLgorCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIGlzIHVzZWQgdG8gYmUgYWJsZSB0byBjYW5jZWwgY29tcGxldGlvbiBvcGVyYXRpb25zCisJICogCisJICogRmluZCB0aGUgdG9wLWxldmVsIHR5cGVzIHRoYXQgYXJlIGRlZmluZWQKKwkgKiBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhbmQgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCB0aGUKKwkgKiBnaXZlbiBwcmVmaXguIFRoZSBwcmVmaXggaXMgYSBxdWFsaWZpZWQgbmFtZSBzZXBhcmF0ZWQgYnkgcGVyaW9kcworCSAqIG9yIGEgc2ltcGxlIG5hbWUgKGV4LiBqYXZhLnV0aWwuViBvciBWKS4KKwkgKgorCSAqIFRoZSB0eXBlcyBmb3VuZCBhcmUgcGFzc2VkIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKGlmIGFkZGl0aW9uYWwKKwkgKiBpbmZvcm1hdGlvbiBpcyBrbm93biBhYm91dCB0aGUgdHlwZXMpOgorCSAqICAgIElTZWFyY2hSZXF1ZXN0b3IuYWNjZXB0VHlwZShjaGFyW11bXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKQorCSAqICAgIElTZWFyY2hSZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoY2hhcltdW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IG1vZGlmaWVycykKKwkgKiAgICBJU2VhcmNoUmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZShjaGFyW11bXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgbW9kaWZpZXJzKQorCSAqCisJICogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIHRvIGZpbmQgbWVtYmVyIHR5cGVzLi4uIG1lbWJlcgorCSAqIHR5cGVzIGFyZSBmb3VuZCByZWxhdGl2ZSB0byB0aGVpciBlbmNsb3NpbmcgdHlwZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBmaW5kVHlwZXMoY2hhcltdIHByZWZpeCwgZmluYWwgYm9vbGVhbiBmaW5kTWVtYmVycywgYm9vbGVhbiBjYW1lbENhc2VNYXRjaCwgaW50IHNlYXJjaEZvciwgZmluYWwgSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCiAJCS8qCiAJCQlpZiAodHJ1ZSl7CiAJCQkJZmluZFR5cGVzKG5ldyBTdHJpbmcocHJlZml4KSwgc3RvcmFnZSwgTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IE5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOwotCQkJCXJldHVybjsJCQorCQkJCXJldHVybjsKIAkJCX0KIAkJKi8KIAkJdHJ5IHsKQEAgLTM1NCwxMCArMzg3LDEwIEBACiAJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAogCQkJCX0KIAkJCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQkJCQlyZXR1cm4gaXNDYW5jZWxlZDsKKwkJCQkJcmV0dXJuIHRoaXMuaXNDYW5jZWxlZDsKIAkJCQl9CiAJCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQkJCQlpc0NhbmNlbGVkID0gdmFsdWU7CisJCQkJCXRoaXMuaXNDYW5jZWxlZCA9IHZhbHVlOwogCQkJCX0KIAkJCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewogCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKQEAgLTM3OCwyNCArNDExLDcxIEBACiAJCQkJCXN0b3JhZ2UuYWNjZXB0VHlwZShwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgbW9kaWZpZXJzLCBhY2Nlc3MpOwogCQkJCX0KIAkJCX07Ci0JCQl0cnkgewotCQkJCWludCBtYXRjaFJ1bGUgPSBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIOwotCQkJCWlmIChjYW1lbENhc2VNYXRjaCkgbWF0Y2hSdWxlIHw9IFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g7Ci0JCQkJbmV3IEJhc2ljU2VhcmNoRW5naW5lKHRoaXMud29ya2luZ0NvcGllcykuc2VhcmNoQWxsVHlwZU5hbWVzKAotCQkJCQlxdWFsaWZpY2F0aW9uLAotCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsCi0JCQkJCXNpbXBsZU5hbWUsCi0JCQkJCW1hdGNoUnVsZSwgLy8gbm90IGNhc2Ugc2Vuc2l0aXZlCi0JCQkJCXNlYXJjaEZvciwKLQkJCQkJdGhpcy5zZWFyY2hTY29wZSwKLQkJCQkJdHlwZVJlcXVlc3RvciwKLQkJCQkJQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gsCi0JCQkJCXByb2dyZXNzTW9uaXRvcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmluZFR5cGVzKAotCQkJCQluZXcgU3RyaW5nKHByZWZpeCksCi0JCQkJCXN0b3JhZ2UsCi0JCQkJCWNvbnZlcnRTZWFyY2hGaWx0ZXJUb01vZGVsRmlsdGVyKHNlYXJjaEZvcikpOworCQkJCisJCQlpbnQgbWF0Y2hSdWxlID0gU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSDsKKwkJCWlmIChjYW1lbENhc2VNYXRjaCkgbWF0Y2hSdWxlIHw9IFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCQkJaWYgKGluZGV4TWFuYWdlci5hd2FpdGluZ0pvYnNDb3VudCgpID09IDApIHsKKwkJCQkJLy8gaW5kZXhlcyB3ZXJlIGFscmVhZHkgdGhlcmUsIHNvIHBlcmZvcm0gYW4gaW1tZWRpYXRlIHNlYXJjaCB0byBhdm9pZCBhbnkgaW5kZXggcmVidWlsdAorCQkJCQluZXcgQmFzaWNTZWFyY2hFbmdpbmUodGhpcy53b3JraW5nQ29waWVzKS5zZWFyY2hBbGxUeXBlTmFtZXMoCisJCQkJCQlxdWFsaWZpY2F0aW9uLAorCQkJCQkJU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILAorCQkJCQkJc2ltcGxlTmFtZSwKKwkJCQkJCW1hdGNoUnVsZSwgLy8gbm90IGNhc2Ugc2Vuc2l0aXZlCisJCQkJCQlzZWFyY2hGb3IsCisJCQkJCQlnZXRTZWFyY2hTY29wZSgpLAorCQkJCQkJdHlwZVJlcXVlc3RvciwKKwkJCQkJCUZPUkNFX0lNTUVESUFURV9TRUFSQ0gsCisJCQkJCQlwcm9ncmVzc01vbml0b3IpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGluZGV4ZXMgd2VyZSBub3QgcmVhZHksIGdpdmUgdGhlIGluZGV4aW5nIGEgY2hhbmNlIHRvIGZpbmlzaCBzbWFsbCBqb2JzIGJ5IHNsZWVwaW5nIDEwMG1zLi4uCisJCQkJCXRyeSB7CisJCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gRG8gbm90aGluZworCQkJCQl9CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCX0KKwkJCQkJaWYgKGluZGV4TWFuYWdlci5hd2FpdGluZ0pvYnNDb3VudCgpID09IDApIHsKKwkJCQkJCS8vIGluZGV4ZXMgYXJlIG5vdyByZWFkeSwgc28gcGVyZm9ybSBhbiBpbW1lZGlhdGUgc2VhcmNoIHRvIGF2b2lkIGFueSBpbmRleCByZWJ1aWx0CisJCQkJCQluZXcgQmFzaWNTZWFyY2hFbmdpbmUodGhpcy53b3JraW5nQ29waWVzKS5zZWFyY2hBbGxUeXBlTmFtZXMoCisJCQkJCQkJcXVhbGlmaWNhdGlvbiwKKwkJCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsCisJCQkJCQkJc2ltcGxlTmFtZSwKKwkJCQkJCQltYXRjaFJ1bGUsIC8vIG5vdCBjYXNlIHNlbnNpdGl2ZQorCQkJCQkJCXNlYXJjaEZvciwKKwkJCQkJCQlnZXRTZWFyY2hTY29wZSgpLAorCQkJCQkJCXR5cGVSZXF1ZXN0b3IsCisJCQkJCQkJRk9SQ0VfSU1NRURJQVRFX1NFQVJDSCwKKwkJCQkJCQlwcm9ncmVzc01vbml0b3IpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gSW5kZXhlcyBhcmUgc3RpbGwgbm90IHJlYWR5LCBzbyBsb29rIGZvciB0eXBlcyBpbiB0aGUgbW9kZWwgaW5zdGVhZCBvZiBhIHNlYXJjaCByZXF1ZXN0CisJCQkJCQlmaW5kVHlwZXMoCisJCQkJCQkJbmV3IFN0cmluZyhwcmVmaXgpLAorCQkJCQkJCXN0b3JhZ2UsCisJCQkJCQkJY29udmVydFNlYXJjaEZpbHRlclRvTW9kZWxGaWx0ZXIoc2VhcmNoRm9yKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRyeSB7CisJCQkJCW5ldyBCYXNpY1NlYXJjaEVuZ2luZSh0aGlzLndvcmtpbmdDb3BpZXMpLnNlYXJjaEFsbFR5cGVOYW1lcygKKwkJCQkJCXF1YWxpZmljYXRpb24sCisJCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsCisJCQkJCQlzaW1wbGVOYW1lLAorCQkJCQkJbWF0Y2hSdWxlLCAvLyBub3QgY2FzZSBzZW5zaXRpdmUKKwkJCQkJCXNlYXJjaEZvciwKKwkJCQkJCWdldFNlYXJjaFNjb3BlKCksCisJCQkJCQl0eXBlUmVxdWVzdG9yLAorCQkJCQkJQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gsCisJCQkJCQlwcm9ncmVzc01vbml0b3IpOworCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJZmluZFR5cGVzKAorCQkJCQkJbmV3IFN0cmluZyhwcmVmaXgpLAorCQkJCQkJc3RvcmFnZSwKKwkJCQkJCWNvbnZlcnRTZWFyY2hGaWx0ZXJUb01vZGVsRmlsdGVyKHNlYXJjaEZvcikpOworCQkJCX0KIAkJCX0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCWZpbmRUeXBlcygKQEAgLTQwNCw2ICs0ODQsMTQ3IEBACiAJCQkJY29udmVydFNlYXJjaEZpbHRlclRvTW9kZWxGaWx0ZXIoc2VhcmNoRm9yKSk7CiAJCX0KIAl9CisJCisJLyoqCisJICogTXVzdCBiZSB1c2VkIG9ubHkgYnkgQ29tcGxldGlvbkVuZ2luZS4KKwkgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyB1c2VkIHRvIGJlIGFibGUgdG8gY2FuY2VsIGNvbXBsZXRpb24gb3BlcmF0aW9ucworCSAqIAorCSAqIEZpbmQgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGRlZmluZWQKKwkgKiBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhbmQgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCB0aGUKKwkgKiBnaXZlbiBwcmVmaXguIFRoZSBwcmVmaXggaXMgYSBxdWFsaWZpZWQgbmFtZSBzZXBhcmF0ZWQgYnkgcGVyaW9kcworCSAqIG9yIGEgc2ltcGxlIG5hbWUgKGV4LiBqYXZhLnV0aWwuViBvciBWKS4KKwkgKgorCSAqIFRoZSBjb25zdHJ1Y3RvcnMgZm91bmQgYXJlIHBhc3NlZCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCSAqICAgIElTZWFyY2hSZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3IoLi4uKQorCSAqLworCXB1YmxpYyB2b2lkIGZpbmRDb25zdHJ1Y3RvckRlY2xhcmF0aW9ucyhjaGFyW10gcHJlZml4LCBib29sZWFuIGNhbWVsQ2FzZU1hdGNoLCBmaW5hbCBJU2VhcmNoUmVxdWVzdG9yIHN0b3JhZ2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0cnkgeworCQkJZmluYWwgU3RyaW5nIGV4Y2x1ZGVQYXRoOworCQkJaWYgKHRoaXMudW5pdFRvU2tpcCAhPSBudWxsICYmIHRoaXMudW5pdFRvU2tpcCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgeworCQkJCWV4Y2x1ZGVQYXRoID0gKChJSmF2YUVsZW1lbnQpIHRoaXMudW5pdFRvU2tpcCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCWV4Y2x1ZGVQYXRoID0gbnVsbDsKKwkJCX0KKwkJCQorCQkJaW50IGxhc3REb3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBwcmVmaXgpOworCQkJY2hhcltdIHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWU7CisJCQlpZiAobGFzdERvdEluZGV4IDwgMCkgeworCQkJCXF1YWxpZmljYXRpb24gPSBudWxsOworCQkJCWlmIChjYW1lbENhc2VNYXRjaCkgeworCQkJCQlzaW1wbGVOYW1lID0gcHJlZml4OworCQkJCX0gZWxzZSB7CisJCQkJCXNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHByZWZpeCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlxdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShwcmVmaXgsIDAsIGxhc3REb3RJbmRleCk7CisJCQkJaWYgKGNhbWVsQ2FzZU1hdGNoKSB7CisJCQkJCXNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHByZWZpeCwgbGFzdERvdEluZGV4ICsgMSwgcHJlZml4Lmxlbmd0aCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2ltcGxlTmFtZSA9CisJCQkJCQlDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKAorCQkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkocHJlZml4LCBsYXN0RG90SW5kZXggKyAxLCBwcmVmaXgubGVuZ3RoKSk7CisJCQkJfQorCQkJfQorCisJCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBJUHJvZ3Jlc3NNb25pdG9yKCkgeworCQkJCWJvb2xlYW4gaXNDYW5jZWxlZCA9IGZhbHNlOworCQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgeworCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgZG9uZSgpIHsKKwkJCQkJLy8gaW1wbGVtZW50cyBpbnRlcmZhY2UgbWV0aG9kCisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7CisJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAorCQkJCX0KKwkJCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCQkJCQlyZXR1cm4gdGhpcy5pc0NhbmNlbGVkOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7CisJCQkJCXRoaXMuaXNDYW5jZWxlZCA9IHZhbHVlOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgeworCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgeworCQkJCQkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7CisJCQkJCS8vIGltcGxlbWVudHMgaW50ZXJmYWNlIG1ldGhvZAorCQkJCX0KKwkJCX07CisJCQkKKwkJCUlSZXN0cmljdGVkQWNjZXNzQ29uc3RydWN0b3JSZXF1ZXN0b3IgY29uc3RydWN0b3JSZXF1ZXN0b3IgPSBuZXcgSVJlc3RyaWN0ZWRBY2Nlc3NDb25zdHJ1Y3RvclJlcXVlc3RvcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvcigKKwkJCQkJCWludCBtb2RpZmllcnMsCisJCQkJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQkJCQlpbnQgcGFyYW1ldGVyQ291bnQsCisJCQkJCQljaGFyW10gc2lnbmF0dXJlLAorCQkJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJCQkJCWludCB0eXBlTW9kaWZpZXJzLAorCQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQkJCQkJaW50IGV4dHJhRmxhZ3MsCisJCQkJCQlTdHJpbmcgcGF0aCwKKwkJCQkJCUFjY2Vzc1Jlc3RyaWN0aW9uIGFjY2VzcykgeworCQkJCQlpZiAoZXhjbHVkZVBhdGggIT0gbnVsbCAmJiBleGNsdWRlUGF0aC5lcXVhbHMocGF0aCkpCisJCQkJCQlyZXR1cm47CisJCQkJCQorCQkJCQlzdG9yYWdlLmFjY2VwdENvbnN0cnVjdG9yKAorCQkJCQkJCW1vZGlmaWVycywKKwkJCQkJCQlzaW1wbGVUeXBlTmFtZSwKKwkJCQkJCQlwYXJhbWV0ZXJDb3VudCwKKwkJCQkJCQlzaWduYXR1cmUsCisJCQkJCQkJcGFyYW1ldGVyVHlwZXMsCisJCQkJCQkJcGFyYW1ldGVyTmFtZXMsIAorCQkJCQkJCXR5cGVNb2RpZmllcnMsCisJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJZXh0cmFGbGFncywKKwkJCQkJCQlwYXRoLAorCQkJCQkJCWFjY2Vzcyk7CisJCQkJfQorCQkJfTsKKwkJCQorCQkJaW50IG1hdGNoUnVsZSA9IFNlYXJjaFBhdHRlcm4uUl9QUkVGSVhfTUFUQ0g7CisJCQlpZiAoY2FtZWxDYXNlTWF0Y2gpIG1hdGNoUnVsZSB8PSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOworCQkJCXdoaWxlIChpbmRleE1hbmFnZXIuYXdhaXRpbmdKb2JzQ291bnQoKSA+IDApIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCVRocmVhZC5zbGVlcCg1MCk7IC8vIGluZGV4ZXMgYXJlIG5vdCByZWFkeSwgIHNsZWVwIDUwbXMuLi4KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gRG8gbm90aGluZworCQkJCQl9CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJbmV3IEJhc2ljU2VhcmNoRW5naW5lKHRoaXMud29ya2luZ0NvcGllcykuc2VhcmNoQWxsQ29uc3RydWN0b3JEZWNsYXJhdGlvbnMoCisJCQkJCQlxdWFsaWZpY2F0aW9uLAorCQkJCQkJc2ltcGxlTmFtZSwKKwkJCQkJCW1hdGNoUnVsZSwKKwkJCQkJCWdldFNlYXJjaFNjb3BlKCksCisJCQkJCQljb25zdHJ1Y3RvclJlcXVlc3RvciwKKwkJCQkJCUZPUkNFX0lNTUVESUFURV9TRUFSQ0gsCisJCQkJCQlwcm9ncmVzc01vbml0b3IpOworCQkJfSBlbHNlIHsKKwkJCQl0cnkgeworCQkJCQluZXcgQmFzaWNTZWFyY2hFbmdpbmUodGhpcy53b3JraW5nQ29waWVzKS5zZWFyY2hBbGxDb25zdHJ1Y3RvckRlY2xhcmF0aW9ucygKKwkJCQkJCQlxdWFsaWZpY2F0aW9uLAorCQkJCQkJCXNpbXBsZU5hbWUsCisJCQkJCQkJbWF0Y2hSdWxlLAorCQkJCQkJCWdldFNlYXJjaFNjb3BlKCksCisJCQkJCQkJY29uc3RydWN0b3JSZXF1ZXN0b3IsCisJCQkJCQkJQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gsCisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIERvIG5vdGhpbmcKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEbyBub3RoaW5nCisJCX0KKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIGFsbCB0eXBlcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiAocXVhbGlmaWVkKSA8Y29kZT5wcmVmaXg8L2NvZGU+LgpAQCAtNDMyLDYgKzY1MywxOCBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSBJSmF2YVNlYXJjaFNjb3BlIGdldFNlYXJjaFNjb3BlKCkgeworCQlpZiAodGhpcy5zZWFyY2hTY29wZSA9PSBudWxsKSB7CisJCQkvLyBDcmVhdGUgc2VhcmNoIHNjb3BlIHdpdGggdmlzaWJsZSBlbnRyeSBvbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aAorCQkJaWYodGhpcy5jaGVja0FjY2Vzc1Jlc3RyaWN0aW9ucykgeworCQkJCXRoaXMuc2VhcmNoU2NvcGUgPSBCYXNpY1NlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHt0aGlzLnByb2plY3R9KTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5zZWFyY2hTY29wZSA9IEJhc2ljU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZSh0aGlzLm5hbWVMb29rdXAucGFja2FnZUZyYWdtZW50Um9vdHMpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzLnNlYXJjaFNjb3BlOworCX0KKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50I2lzUGFja2FnZShjaGFyW11bXSwgY2hhcltdKQogCSAqLwpAQCAtNDQ2LDcgKzY3OSw5IEBACiAJCQkJcGtnTmFtZVtpXSA9IG5ldyBTdHJpbmcocGFyZW50UGFja2FnZU5hbWVbaV0pOwogCQkJcGtnTmFtZVtsZW5ndGhdID0gbmV3IFN0cmluZyhzdWJQYWNrYWdlTmFtZSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMubmFtZUxvb2t1cC5pc1BhY2thZ2UocGtnTmFtZSk7CisJCXJldHVybiAKKwkJCSh0aGlzLm93bmVyICE9IG51bGwgJiYgdGhpcy5vd25lci5pc1BhY2thZ2UocGtnTmFtZSkpCisJCQl8fCB0aGlzLm5hbWVMb29rdXAuaXNQYWNrYWdlKHBrZ05hbWUpOwogCX0KIAogCS8qKgpAQCAtNDY3LDcgKzcwMiw3IEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CiAJCS8vIG5vdGhpbmcgdG8gZG8KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCmluZGV4IDU4MDBjY2UuLjQ5YmZkMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDExICszOCwxMSBAQAogCSAqIGFjY2VwdCB0eXBlcyB3aXRoaW4uCiAJICovCiAJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcDsKLQkKKwogCXByb3RlY3RlZCBJSmF2YVByb2plY3QgcHJvamVjdDsKLQkKKwogCXByb3RlY3RlZCBOYW1lTG9va3VwIG5hbWVMb29rdXA7Ci0JCisKIAlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0FjY2Vzc1Jlc3RyaWN0aW9uczsKIC8qKgogICogQ29uc3RydWN0cyBhIFNlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3RvciB0aGF0IHdyYXBzIHRoZQpAQCAtNTQsNyArNTQsNyBAQAogCXRoaXMucHJvamVjdD0gbnVsbDsKIAl0aGlzLm5hbWVMb29rdXA9IG51bGw7CiAJdGhpcy5jaGVja0FjY2Vzc1Jlc3RyaWN0aW9ucyA9IGZhbHNlOwotCQorCiB9CiAvKioKICAqIENvbnN0cnVjdHMgYSBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgdGhhdCB3cmFwcyB0aGUKQEAgLTY2LDcgKzY2LDcgQEAKIAl0aGlzLnVuaXRUb1NraXA9IHVuaXRUb1NraXA7CiAJdGhpcy5wcm9qZWN0PSBwcm9qZWN0OwogCXRoaXMubmFtZUxvb2t1cCA9IG5hbWVMb29rdXA7Ci0JdGhpcy5jaGVja0FjY2Vzc1Jlc3RyaWN0aW9ucyA9IAorCXRoaXMuY2hlY2tBY2Nlc3NSZXN0cmljdGlvbnMgPQogCQkhSmF2YUNvcmUuSUdOT1JFLmVxdWFscyhwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9QQl9GT1JCSURERU5fUkVGRVJFTkNFLCB0cnVlKSkKIAkJfHwgIUphdmFDb3JlLklHTk9SRS5lcXVhbHMocHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfRElTQ09VUkFHRURfUkVGRVJFTkNFLCB0cnVlKSk7CiB9CkBAIC05NSwxMCArOTUsMTAgQEAKIAkJfQogCQljaGFyW10gcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJYm9vbGVhbiBpc0JpbmFyeSA9IHR5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlOwotCQkKKwogCQkvLyBkZXRlcm1pbmUgYXNzb2NpYXRlZCBhY2Nlc3MgcmVzdHJpY3Rpb24KIAkJQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24gPSBudWxsOwotCQkKKwogCQlpZiAodGhpcy5jaGVja0FjY2Vzc1Jlc3RyaWN0aW9ucyAmJiAoaXNCaW5hcnkgfHwgIXR5cGUuZ2V0SmF2YVByb2plY3QoKS5lcXVhbHModGhpcy5wcm9qZWN0KSkpIHsKIAkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KXR5cGUuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CiAJCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgdGhpcy5uYW1lTG9va3VwLnJvb3RUb1Jlc29sdmVkRW50cmllcy5nZXQocm9vdCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWxlY3Rpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGQ3Yjc0MWMuLjRjY2IxNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwpAQCAtMzMsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwpAQCAtODAsNyArODIsNyBAQAogCQljaGFyW10gdW5pcXVlS2V5LAogCQlib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKIAl0cnkgewotCQlpZighaXNDb25zdHJ1Y3RvciB8fCAoKEphdmFFbGVtZW50KW1ldGhvZCkuZ2V0U291cmNlTWFwcGVyKCkgPT0gbnVsbCkgeworCQlpZighaXNDb25zdHJ1Y3RvciB8fCAoKEphdmFFbGVtZW50KW1ldGhvZCkuZ2V0Q2xhc3NGaWxlKCkuZ2V0QnVmZmVyKCkgPT0gbnVsbCkgewogCQkJaWYgKHVuaXF1ZUtleSAhPSBudWxsKSB7CiAJCQkJUmVzb2x2ZWRCaW5hcnlNZXRob2QgcmVzb2x2ZWRNZXRob2QgPSBuZXcgUmVzb2x2ZWRCaW5hcnlNZXRob2QoCiAJCQkJCQkoSmF2YUVsZW1lbnQpbWV0aG9kLmdldFBhcmVudCgpLApAQCAtMTQ5LDcgKzE1MSw3IEBACiAJaWYgKG1ldGhvZC5leGlzdHMoKSkgewogCQlpZiAodHlwZVBhcmFtZXRlck5hbWVzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlck5hbWVzLmxlbmd0aCAhPSAwKSB7CiAJCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZmluZE1ldGhvZHMobWV0aG9kKTsKLQkJCWlmIChtZXRob2RzLmxlbmd0aCA+IDEpIHsKKwkJCWlmIChtZXRob2RzICE9IG51bGwgJiYgbWV0aG9kcy5sZW5ndGggPiAxKSB7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCWlmIChhcmVUeXBlUGFyYW1ldGVyc0NvbXBhdGlibGUobWV0aG9kc1tpXSwgdHlwZVBhcmFtZXRlck5hbWVzLCB0eXBlUGFyYW1ldGVyQm91bmROYW1lcykpIHsKIAkJCQkJCWFjY2VwdEJpbmFyeU1ldGhvZCh0eXBlLCBtZXRob2QsIHVuaXF1ZUtleSwgaXNDb25zdHJ1Y3Rvcik7CkBAIC0yMTEsNiArMjEzLDI4IEBACiAJfQogfQogLyoqCisgKiBSZXNvbHZlIHRoZSB0eXBlLgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKElUeXBlIHR5cGUpIHsKKwlTdHJpbmcga2V5ID0gdHlwZS5nZXRLZXkoKTsKKwlpZih0eXBlLmlzQmluYXJ5KCkpIHsKKwkJUmVzb2x2ZWRCaW5hcnlUeXBlIHJlc29sdmVkVHlwZSA9IG5ldyBSZXNvbHZlZEJpbmFyeVR5cGUoKEphdmFFbGVtZW50KXR5cGUuZ2V0UGFyZW50KCksIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSwga2V5KTsKKwkJcmVzb2x2ZWRUeXBlLm9jY3VycmVuY2VDb3VudCA9IHR5cGUuZ2V0T2NjdXJyZW5jZUNvdW50KCk7CisJCXR5cGUgPSByZXNvbHZlZFR5cGU7CisJfSBlbHNlIHsKKwkJUmVzb2x2ZWRTb3VyY2VUeXBlIHJlc29sdmVkVHlwZSA9IG5ldyBSZXNvbHZlZFNvdXJjZVR5cGUoKEphdmFFbGVtZW50KXR5cGUuZ2V0UGFyZW50KCksIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSwga2V5KTsKKwkJcmVzb2x2ZWRUeXBlLm9jY3VycmVuY2VDb3VudCA9IHR5cGUuZ2V0T2NjdXJyZW5jZUNvdW50KCk7CisJCXR5cGUgPSByZXNvbHZlZFR5cGU7CisJfQorCisJYWRkRWxlbWVudCh0eXBlKTsKKwlpZihTZWxlY3Rpb25FbmdpbmUuREVCVUcpeworCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgdHlwZSgiKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50KHR5cGUudG9TdHJpbmcoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiKSIpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCiAgKiBAc2VlIElTZWxlY3Rpb25SZXF1ZXN0b3IjYWNjZXB0RXJyb3IKICAqLwogcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoQ2F0ZWdvcml6ZWRQcm9ibGVtIGVycm9yKSB7CkBAIC00MTgsNyArNDQyLDcgQEAKIHB1YmxpYyB2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYmluZGluZykgewogCUxvY2FsRGVjbGFyYXRpb24gbG9jYWwgPSBiaW5kaW5nLmRlY2xhcmF0aW9uOwogCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBmaW5kTG9jYWxFbGVtZW50KGxvY2FsLnNvdXJjZVN0YXJ0KTsgLy8gZmluZExvY2FsRWxlbWVudCgpIGNhbm5vdCBmaW5kIGxvY2FsIHZhcmlhYmxlCi0JSUphdmFFbGVtZW50IGxvY2FsVmFyID0gbnVsbDsKKwlMb2NhbFZhcmlhYmxlIGxvY2FsVmFyID0gbnVsbDsKIAlpZihwYXJlbnQgIT0gbnVsbCkgewogCQlsb2NhbFZhciA9IG5ldyBMb2NhbFZhcmlhYmxlKAogCQkJCShKYXZhRWxlbWVudClwYXJlbnQsCkBAIC00MjcsNyArNDUxLDEwIEBACiAJCQkJbG9jYWwuZGVjbGFyYXRpb25Tb3VyY2VFbmQsCiAJCQkJbG9jYWwuc291cmNlU3RhcnQsCiAJCQkJbG9jYWwuc291cmNlRW5kLAotCQkJCVV0aWwudHlwZVNpZ25hdHVyZShsb2NhbC50eXBlKSk7CisJCQkJVXRpbC50eXBlU2lnbmF0dXJlKGxvY2FsLnR5cGUpLAorCQkJCWxvY2FsLmFubm90YXRpb25zLAorCQkJCWxvY2FsLm1vZGlmaWVycywKKwkJCQlsb2NhbC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLlBBUkFNRVRFUik7CiAJfQogCWlmIChsb2NhbFZhciAhPSBudWxsKSB7CiAJCWFkZEVsZW1lbnQobG9jYWxWYXIpOwpAQCAtNDY3LDcgKzQ5NCw3IEBACiAJCQkJc3RhcnQsIGVuZCk7CiAKIAkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKHR5cGUsIHNlbGVjdG9yLCBzdGFydCwgZW5kKTsKKwkJCWFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKHR5cGUsIHNlbGVjdG9yLCBzdGFydCwgZW5kKTsKIAkJfQogCX0gZWxzZSB7CiAJCUlUeXBlIHR5cGUgPSByZXNvbHZlVHlwZShkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLApAQCAtNzQzLDYgKzc3MCwxMyBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAJaW50IGVsZW1lbnRMZW5ndGggPSB0aGlzLmVsZW1lbnRJbmRleCArIDE7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRMZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5lbGVtZW50c1tpXS5lcXVhbHMoZWxlbWVudCkpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwogCWlmIChlbGVtZW50TGVuZ3RoID09IHRoaXMuZWxlbWVudHMubGVuZ3RoKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgdGhpcy5lbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbKGVsZW1lbnRMZW5ndGgqMikgKyAxXSwgMCwgZWxlbWVudExlbmd0aCk7CiAJfQpAQCAtODA5LDYgKzg0MywzMSBAQAogCX0KIAlyZXR1cm4gcmVzOwogfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gSU1ldGhvZCBlbGVtZW50IGZyb20gdGhlIGdpdmVuIG1ldGhvZCBhbmQgZGVjbGFyaW5nIHR5cGUgYmluZGluZ3MuIEhvd2V2ZXIsCisgKiB1bmxpa2Uge0BsaW5rIFV0aWwjZmluZE1ldGhvZChJVHlwZSwgY2hhcltdLCBTdHJpbmdbXSwgYm9vbGVhbil9ICwgdGhpcyBkb2VzIG5vdCByZXF1aXJlIGFuIElUeXBlIHRvIGdldCAKKyAqIHRoZSBJTWV0aG9kIGVsZW1lbnQuCisgKiBAcGFyYW0gbWV0aG9kIHRoZSBnaXZlbiBtZXRob2QgYmluZGluZworICogQHBhcmFtIHNpZ25hdHVyZXMgdGhlIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgbWV0aG9kIGFyZ3VtZW50cworICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIHRoZSBiaW5kaW5nIG9mIHRoZSBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MKKyAqIEByZXR1cm4gYW4gSU1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QgYmluZGluZyBnaXZlbiwgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGZpbmRNZXRob2RGcm9tQmluZGluZyhNZXRob2RCaW5kaW5nIG1ldGhvZCwgU3RyaW5nW10gc2lnbmF0dXJlcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCUlUeXBlIGZvdW5kVHlwZSA9IHRoaXMucmVzb2x2ZVR5cGUoZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLCBOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTICYgTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7CisJaWYgKGZvdW5kVHlwZSAhPSBudWxsKSB7CisJCWlmIChmb3VuZFR5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBVdGlsLmZpbmRNZXRob2QoZm91bmRUeXBlLCBtZXRob2Quc2VsZWN0b3IsIHNpZ25hdHVyZXMsIG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmb3VuZFR5cGUuZ2V0TWV0aG9kKG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgc2lnbmF0dXJlcyk7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CiAvKioKICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGVsZW1lbnRzLgogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCmluZGV4IGQyMTExN2EuLmVjMGNjZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDEyICsxMCwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm87CiAKIC8qKgogICogVGhpcyBvcGVyYXRpb24gc2V0cyBhbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+J3MgY2xhc3NwYXRoLgpAQCAtMjUsMjEgKzMwLDMzIEBACiBwdWJsaWMgY2xhc3MgU2V0Q2xhc3NwYXRoT3BlcmF0aW9uIGV4dGVuZHMgQ2hhbmdlQ2xhc3NwYXRoT3BlcmF0aW9uIHsKIAogCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd0NsYXNzcGF0aDsKKwlJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllczsKIAlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbjsKIAlKYXZhUHJvamVjdCBwcm9qZWN0OwotCQkJCi0JLyoqCi0JICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gc2V0cyB0aGUgcmF3IGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLworCiAJcHVibGljIFNldENsYXNzcGF0aE9wZXJhdGlvbigKIAkJSmF2YVByb2plY3QgcHJvamVjdCwKIAkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3Q2xhc3NwYXRoLAogCQlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwKIAkJYm9vbGVhbiBjYW5DaGFuZ2VSZXNvdXJjZSkgewogCisJCXRoaXMocHJvamVjdCwgbmV3UmF3Q2xhc3NwYXRoLCBudWxsLCBuZXdPdXRwdXRMb2NhdGlvbiwgY2FuQ2hhbmdlUmVzb3VyY2UpOworCX0KKwkKKwkvKioKKwkgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiBzZXRzIHRoZSByYXcgY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gb2YgdGhlIGdpdmVuIHByb2plY3QuCisJICovCisJcHVibGljIFNldENsYXNzcGF0aE9wZXJhdGlvbigKKwkJSmF2YVByb2plY3QgcHJvamVjdCwKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3Q2xhc3NwYXRoLAorCQlJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcywKKwkJSVBhdGggbmV3T3V0cHV0TG9jYXRpb24sCisJCWJvb2xlYW4gY2FuQ2hhbmdlUmVzb3VyY2UpIHsKKwogCQlzdXBlcihuZXcgSUphdmFFbGVtZW50W10geyBwcm9qZWN0IH0sIGNhbkNoYW5nZVJlc291cmNlKTsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAkJdGhpcy5uZXdSYXdDbGFzc3BhdGggPSBuZXdSYXdDbGFzc3BhdGg7CisJCXRoaXMucmVmZXJlbmNlZEVudHJpZXMgPSByZWZlcmVuY2VkRW50cmllczsKIAkJdGhpcy5uZXdPdXRwdXRMb2NhdGlvbiA9IG5ld091dHB1dExvY2F0aW9uOwogCX0KIApAQCAtNTAsMTggKzY3LDMzIEBACiAJCWNoZWNrQ2FuY2VsZWQoKTsKIAkJdHJ5IHsKIAkJCS8vIHNldCByYXcgY2xhc3NwYXRoIGFuZCBudWxsIG91dCByZXNvbHZlZCBpbmZvCi0JCQl0aGlzLnByb2plY3QuZ2V0UGVyUHJvamVjdEluZm8oKS5zZXRDbGFzc3BhdGgodGhpcy5uZXdSYXdDbGFzc3BhdGgsIHRoaXMubmV3T3V0cHV0TG9jYXRpb24sIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSy8qZm9ybWF0IGlzIG9rKi8sIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCQkJCisJCQlQZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IHRoaXMucHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpOworCQkJQ2xhc3NwYXRoQ2hhbmdlIGNsYXNzcGF0aENoYW5nZSA9IHBlclByb2plY3RJbmZvLnNldFJhd0NsYXNzcGF0aCh0aGlzLm5ld1Jhd0NsYXNzcGF0aCwgdGhpcy5yZWZlcmVuY2VkRW50cmllcywgdGhpcy5uZXdPdXRwdXRMb2NhdGlvbiwgSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LLypmb3JtYXQgaXMgb2sqLyk7CisKIAkJCS8vIGlmIG5lZWRlZCwgZ2VuZXJhdGUgZGVsdGEsIHVwZGF0ZSBwcm9qZWN0IHJlZiwgY3JlYXRlIG1hcmtlcnMsIC4uLgotCQkJY2xhc3NwYXRoQ2hhbmdlZCh0aGlzLnByb2plY3QpOwotCQkJCisJCQljbGFzc3BhdGhDaGFuZ2VkKGNsYXNzcGF0aENoYW5nZSwgdHJ1ZS8qcmVmcmVzaCBpZiBleHRlcm5hbCBsaW5rZWQgZm9sZGVyIGFscmVhZHkgZXhpc3RzKi8pOworCiAJCQkvLyB3cml0ZSAuY2xhc3NwYXRoIGZpbGUKLQkJCWlmICh0aGlzLmNhbkNoYW5nZVJlc291cmNlcyAmJiB0aGlzLnByb2plY3Quc2F2ZUNsYXNzcGF0aCh0aGlzLm5ld1Jhd0NsYXNzcGF0aCwgdGhpcy5uZXdPdXRwdXRMb2NhdGlvbikpCisJCQlpZiAodGhpcy5jYW5DaGFuZ2VSZXNvdXJjZXMgJiYgcGVyUHJvamVjdEluZm8ud3JpdGVBbmRDYWNoZUNsYXNzcGF0aCh0aGlzLnByb2plY3QsIHRoaXMubmV3UmF3Q2xhc3NwYXRoLCB0aGlzLm5ld091dHB1dExvY2F0aW9uKSkKIAkJCQlzZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOwotCQl9IGZpbmFsbHkgewkJCisJCX0gZmluYWxseSB7CiAJCQlkb25lKCk7CiAJCX0KIAl9CisJCisJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpIHsKKwkJaWYgKHRoaXMuY2FuQ2hhbmdlUmVzb3VyY2VzKSB7CisJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOworCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUobmV3IElTY2hlZHVsaW5nUnVsZVtdIHsKKwkJCQkvLyB1c2UgcHJvamVjdCBtb2RpZmljYXRpb24gcnVsZSBhcyB0aGlzIGlzIG5lZWRlZCB0byBjcmVhdGUgdGhlIC5jbGFzc3BhdGggZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCwgb3IgdG8gdXBkYXRlIHByb2plY3QgcmVmZXJlbmNlcworCQkJCXJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUodGhpcy5wcm9qZWN0LmdldFByb2plY3QoKSksCisJCQkJCisJCQkJLy8gYW5kIGV4dGVybmFsIHByb2plY3QgbW9kaWZpY2F0aW9uIHJ1bGUgaW4gY2FzZSB0aGUgZXh0ZXJuYWwgZm9sZGVycyBhcmUgbW9kaWZpZWQKKwkJCQlydWxlRmFjdG9yeS5tb2RpZnlSdWxlKEphdmFNb2RlbE1hbmFnZXIuZ2V0RXh0ZXJuYWxNYW5hZ2VyKCkuZ2V0RXh0ZXJuYWxGb2xkZXJzUHJvamVjdCgpKQorCQkJfSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldFNjaGVkdWxpbmdSdWxlKCk7CisJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CkBAIC04Miw2ICsxMTQsNyBAQAogCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZlcmlmeSgpOwogCQlpZiAoIXN0YXR1cy5pc09LKCkpCiAJCQlyZXR1cm4gc3RhdHVzOworCQl0aGlzLnByb2plY3QuZmx1c2hDbGFzc3BhdGhQcm9ibGVtTWFya2VycyhmYWxzZSwgZmFsc2UsIHRydWUpOwogCQlyZXR1cm4gQ2xhc3NwYXRoRW50cnkudmFsaWRhdGVDbGFzc3BhdGgoCXRoaXMucHJvamVjdCwgdGhpcy5uZXdSYXdDbGFzc3BhdGgsIHRoaXMubmV3T3V0cHV0TG9jYXRpb24pOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2V0Q29udGFpbmVyT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDb250YWluZXJPcGVyYXRpb24uamF2YQppbmRleCAyMmEwMzQ3Li40YTQ5OGZiIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDb250YWluZXJPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDb250YWluZXJPcGVyYXRpb24uamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxLDExICsyMSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIFNldENvbnRhaW5lck9wZXJhdGlvbiBleHRlbmRzIENoYW5nZUNsYXNzcGF0aE9wZXJhdGlvbiB7Ci0JCisKIAlJUGF0aCBjb250YWluZXJQYXRoOwogCUlKYXZhUHJvamVjdFtdIGFmZmVjdGVkUHJvamVjdHM7CiAJSUNsYXNzcGF0aENvbnRhaW5lcltdIHJlc3BlY3RpdmVDb250YWluZXJzOwotCQorCiAJLyoKIAkgKiBDcmVhdGVzIGEgbmV3IFNldENvbnRhaW5lck9wZXJhdGlvbi4KIAkgKi8KQEAgLTQ0LDIwICs0NCwxOSBAQAogCQkJCXZlcmJvc2Vfc2V0X2NvbnRhaW5lcigpOwogCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFX0FEVkFOQ0VEKQogCQkJCXZlcmJvc2Vfc2V0X2NvbnRhaW5lcl9pbnZvY2F0aW9uX3RyYWNlKCk7Ci0JCQkKKwogCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJCQlpZiAobWFuYWdlci5jb250YWluZXJQdXRJZkluaXRpYWxpemluZ1dpdGhTYW1lRW50cmllcyh0aGlzLmNvbnRhaW5lclBhdGgsIHRoaXMuYWZmZWN0ZWRQcm9qZWN0cywgdGhpcy5yZXNwZWN0aXZlQ29udGFpbmVycykpCiAJCQkJcmV0dXJuOwotCQotCQkJZmluYWwgaW50IHByb2plY3RMZW5ndGggPSB0aGlzLmFmZmVjdGVkUHJvamVjdHMubGVuZ3RoOwkKKworCQkJZmluYWwgaW50IHByb2plY3RMZW5ndGggPSB0aGlzLmFmZmVjdGVkUHJvamVjdHMubGVuZ3RoOwogCQkJZmluYWwgSUphdmFQcm9qZWN0W10gbW9kaWZpZWRQcm9qZWN0czsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hZmZlY3RlZFByb2plY3RzLCAwLCBtb2RpZmllZFByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtwcm9qZWN0TGVuZ3RoXSwgMCwgcHJvamVjdExlbmd0aCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXVtdIG9sZFJlc29sdmVkUGF0aHMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Byb2plY3RMZW5ndGhdW107Ci0JCQkJCisKIAkJCS8vIGZpbHRlciBvdXQgdW5tb2RpZmllZCBwcm9qZWN0IGNvbnRhaW5lcnMKIAkJCWludCByZW1haW5pbmcgPSAwOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TGVuZ3RoOyBpKyspewotCQkJCWlmIChpc0NhbmNlbGVkKCkpIAorCQkJCWlmIChpc0NhbmNlbGVkKCkpCiAJCQkJCXJldHVybjsKIAkJCQlKYXZhUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSAoSmF2YVByb2plY3QpIHRoaXMuYWZmZWN0ZWRQcm9qZWN0c1tpXTsKIAkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIG5ld0NvbnRhaW5lciA9IHRoaXMucmVzcGVjdGl2ZUNvbnRhaW5lcnNbaV07CkBAIC04NywzMCArODYsMjkgQEAKIAkJCQkJbW9kaWZpZWRQcm9qZWN0c1tpXSA9IG51bGw7IC8vIGZpbHRlciBvdXQgdGhpcyBwcm9qZWN0IC0gY29udGFpbmVyIGRpZCBub3QgY2hhbmdlCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KLQkJCQlyZW1haW5pbmcrKzsgCi0JCQkJb2xkUmVzb2x2ZWRQYXRoc1tpXSA9IGFmZmVjdGVkUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJCXJlbWFpbmluZysrOwogCQkJCW1hbmFnZXIuY29udGFpbmVyUHV0KGFmZmVjdGVkUHJvamVjdCwgdGhpcy5jb250YWluZXJQYXRoLCBuZXdDb250YWluZXIpOwogCQkJfQotCQkJCisKIAkJCWlmIChyZW1haW5pbmcgPT0gMCkgcmV0dXJuOwotCQkJCisKIAkJCS8vIHRyaWdnZXIgbW9kZWwgcmVmcmVzaAogCQkJdHJ5IHsKIAkJCQlmb3IoaW50IGkgPSAwOyBpIDwgcHJvamVjdExlbmd0aDsgaSsrKXsKLQkJCQkJaWYgKGlzQ2FuY2VsZWQoKSkgCisJCQkJCWlmIChpc0NhbmNlbGVkKCkpCiAJCQkJCQlyZXR1cm47Ci0JCQkJCQorCiAJCQkJCUphdmFQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IChKYXZhUHJvamVjdCltb2RpZmllZFByb2plY3RzW2ldOwogCQkJCQlpZiAoYWZmZWN0ZWRQcm9qZWN0ID09IG51bGwpIGNvbnRpbnVlOyAvLyB3YXMgZmlsdGVyZWQgb3V0CiAJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCkKIAkJCQkJCXZlcmJvc2VfdXBkYXRlX3Byb2plY3QoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCisKIAkJCQkJLy8gZm9yY2UgcmVzb2x2ZWQgY2xhc3NwYXRoIHRvIGJlIHJlY29tcHV0ZWQKLQkJCQkJYWZmZWN0ZWRQcm9qZWN0LmdldFBlclByb2plY3RJbmZvKCkucmVzZXRSZXNvbHZlZENsYXNzcGF0aCgpOwotCQkJCQkKKwkJCQkJQ2xhc3NwYXRoQ2hhbmdlIGNsYXNzcGF0aENoYW5nZSA9IGFmZmVjdGVkUHJvamVjdC5nZXRQZXJQcm9qZWN0SW5mbygpLnJlc2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKKwogCQkJCQkvLyBpZiBuZWVkZWQsIGdlbmVyYXRlIGRlbHRhLCB1cGRhdGUgcHJvamVjdCByZWYsIGNyZWF0ZSBtYXJrZXJzLCAuLi4KLQkJCQkJY2xhc3NwYXRoQ2hhbmdlZChhZmZlY3RlZFByb2plY3QpOwotCQkJCQkKKwkJCQkJY2xhc3NwYXRoQ2hhbmdlZChjbGFzc3BhdGhDaGFuZ2UsIGk9PTAvKnJlZnJlc2ggZXh0ZXJuYWwgbGlua2VkIGZvbGRlciBvbmx5IG9uY2UqLyk7CisKIAkJCQkJaWYgKHRoaXMuY2FuQ2hhbmdlUmVzb3VyY2VzKSB7CiAJCQkJCQkvLyB0b3VjaCBwcm9qZWN0IHRvIGZvcmNlIGEgYnVpbGQgaWYgbmVlZGVkCiAJCQkJCQl0cnkgewpAQCAtMTIzLDcgKzEyMSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkKKwkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UgfHwgSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkKIAkJCQkJdmVyYm9zZV9mYWlsdXJlKGUpOwogCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CiAJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pZTsKQEAgLTEzNyw3ICsxMzUsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IGZpbmFsbHkgewkJCisJCX0gZmluYWxseSB7CiAJCQlkb25lKCk7CiAJCX0KIAl9CkBAIC0xNjMsMTUgKzE2MSwxNSBAQAogCQkJIgljb250YWluZXIgcGF0aDogIiArIHRoaXMuY29udGFpbmVyUGF0aCArICdcbicgKyAvLyROT04tTkxTLTEkCiAJCQkiCXByb2plY3RzOiB7IiArLy8kTk9OLU5MUy0xJAogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC50b1N0cmluZygKLQkJCQl0aGlzLmFmZmVjdGVkUHJvamVjdHMsIAotCQkJCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkRpc3BsYXlhYmxlKCl7IAorCQkJCXRoaXMuYWZmZWN0ZWRQcm9qZWN0cywKKwkJCQluZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5EaXNwbGF5YWJsZSgpewogCQkJCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pIHsgcmV0dXJuICgoSUphdmFQcm9qZWN0KSBvKS5nZXRFbGVtZW50TmFtZSgpOyB9CiAJCQkJfSkgKwogCQkJIn1cbgl2YWx1ZXM6IHtcbiIgICsvLyROT04tTkxTLTEkCiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnRvU3RyaW5nKAotCQkJCXRoaXMucmVzcGVjdGl2ZUNvbnRhaW5lcnMsIAotCQkJCW5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkRpc3BsYXlhYmxlKCl7IAotCQkJCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pIHsgCisJCQkJdGhpcy5yZXNwZWN0aXZlQ29udGFpbmVycywKKwkJCQluZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5EaXNwbGF5YWJsZSgpeworCQkJCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pIHsKIAkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCIJCSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAobyA9PSBudWxsKSB7CiAJCQkJCQkJYnVmZmVyLmFwcGVuZCgiPG51bGw+Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTE4NCw4ICsxODIsOCBAQAogCQkJCQkJaWYgKGVudHJpZXMgIT0gbnVsbCl7CiAJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKXsKIAkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiIAkJCSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZW50cmllc1tpXSk7IAotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOyAKKwkJCQkJCQkJYnVmZmVyLmFwcGVuZChlbnRyaWVzW2ldKTsKKwkJCQkJCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQlidWZmZXIuYXBwZW5kKCIgCQl9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTE5NCwxMiArMTkyLDEyIEBACiAJCQkJfSkgKwogCQkJIlxuCX0iKTsvLyROT04tTkxTLTEkCiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHZlcmJvc2Vfc2V0X2NvbnRhaW5lcl9pbnZvY2F0aW9uX3RyYWNlKCkgewogCQlVdGlsLnZlcmJvc2UoCiAJCQkiQ1BDb250YWluZXIgU0VUICAtIHNldHRpbmcgY29udGFpbmVyXG4iICsgLy8kTk9OLU5MUy0xJAogCQkJIglpbnZvY2F0aW9uIHN0YWNrIHRyYWNlOiIpOyAvLyROT04tTkxTLTEkCiAJCQluZXcgRXhjZXB0aW9uKCI8RmFrZSBleGNlcHRpb24+IikucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRWYXJpYWJsZXNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldFZhcmlhYmxlc09wZXJhdGlvbi5qYXZhCmluZGV4IGRlZjQ5YTYuLmU0ZGZjNWMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldFZhcmlhYmxlc09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldFZhcmlhYmxlc09wZXJhdGlvbi5qYXZhCkBAIC0xLDEwICsxLDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQsMTEgKzI0LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgU2V0VmFyaWFibGVzT3BlcmF0aW9uIGV4dGVuZHMgQ2hhbmdlQ2xhc3NwYXRoT3BlcmF0aW9uIHsKLQkKKwogCVN0cmluZ1tdIHZhcmlhYmxlTmFtZXM7CiAJSVBhdGhbXSB2YXJpYWJsZVBhdGhzOwogCWJvb2xlYW4gdXBkYXRlUHJlZmVyZW5jZXM7Ci0JCQorCiAJLyoKIAkgKiBDcmVhdGVzIGEgbmV3IFNldFZhcmlhYmxlc09wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlIHZhbHVlcyAobnVsbCBwYXRoIG1lYW5pbmcgcmVtb3ZhbCksIGFsbG93aW5nIHRvIGNoYW5nZSBtdWx0aXBsZSB2YXJpYWJsZSB2YWx1ZXMgYXQgb25jZS4KIAkgKi8KQEAgLTQ1LDIyICs0NSwyMiBAQAogCQkJYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAogCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKQogCQkJCXZlcmJvc2Vfc2V0X3ZhcmlhYmxlcygpOwotCQkJCisKIAkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwogCQkJaWYgKG1hbmFnZXIudmFyaWFibGVQdXRJZkluaXRpYWxpemluZ1dpdGhTYW1lVmFsdWUodGhpcy52YXJpYWJsZU5hbWVzLCB0aGlzLnZhcmlhYmxlUGF0aHMpKQogCQkJCXJldHVybjsKLQkKKwogCQkJaW50IHZhckxlbmd0aCA9IHRoaXMudmFyaWFibGVOYW1lcy5sZW5ndGg7Ci0JCQkKKwogCQkJLy8gZ2F0aGVyIGNsYXNzcGF0aCBpbmZvcm1hdGlvbiBmb3IgdXBkYXRpbmcKIAkJCWZpbmFsIEhhc2hNYXAgYWZmZWN0ZWRQcm9qZWN0Q2xhc3NwYXRocyA9IG5ldyBIYXNoTWFwKDUpOwogCQkJSUphdmFNb2RlbCBtb2RlbCA9IGdldEphdmFNb2RlbCgpOwotCQkKKwogCQkJLy8gZmlsdGVyIG91dCB1bm1vZGlmaWVkIHZhcmlhYmxlcwogCQkJaW50IGRpc2NhcmRDb3VudCA9IDA7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKXsKIAkJCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gdGhpcy52YXJpYWJsZU5hbWVzW2ldOwotCQkJCUlQYXRoIG9sZFBhdGggPSBtYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7IC8vIGlmIHJlZW50ZXJpbmcgd2lsbCBwcm92aWRlIHByZXZpb3VzIHNlc3Npb24gdmFsdWUgCisJCQkJSVBhdGggb2xkUGF0aCA9IG1hbmFnZXIudmFyaWFibGVHZXQodmFyaWFibGVOYW1lKTsgLy8gaWYgcmVlbnRlcmluZyB3aWxsIHByb3ZpZGUgcHJldmlvdXMgc2Vzc2lvbiB2YWx1ZQogCQkJCWlmIChvbGRQYXRoID09IEphdmFNb2RlbE1hbmFnZXIuVkFSSUFCTEVfSU5JVElBTElaQVRJT05fSU5fUFJPR1JFU1MpIHsKIAkJCQkJb2xkUGF0aCA9IG51bGw7ICAvLzMzNjk1IC0gY2Fubm90IGZpbHRlciBvdXQgcmVzdG9yZWQgdmFyaWFibGUsIG11c3QgdXBkYXRlIGFmZmVjdGVkIHByb2plY3QgdG8gcmVzZXQgY2FjaGVkIENQCiAJCQkJfQpAQCAtODUsMjQgKzg1LDI0IEBACiAJCQkJdGhpcy52YXJpYWJsZVBhdGhzID0gY2hhbmdlZFZhcmlhYmxlUGF0aHM7CiAJCQkJdmFyTGVuZ3RoID0gY2hhbmdlZExlbmd0aDsKIAkJCX0KLQkJCQotCQkJaWYgKGlzQ2FuY2VsZWQoKSkgCisKKwkJCWlmIChpc0NhbmNlbGVkKCkpCiAJCQkJcmV0dXJuOwotCQorCiAJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOwogCQkJbmV4dFByb2plY3QgOiBmb3IgKGludCBpID0gMCwgcHJvamVjdExlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IHByb2plY3RMZW5ndGg7IGkrKyl7CiAJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV07Ci0JCQkJCQkKKwogCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIG1vZGlmaWVkIHZhcmlhYmxlcyBpcyBwcmVzZW50IG9uIHRoZSBjbGFzc3BhdGgKIAkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwogCQkJCWZvciAoaW50IGogPSAwLCBjcExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjcExlbmd0aDsgaisrKXsKLQkJCQkJCisKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOwogCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHZhckxlbmd0aDsgaysrKXsKLQkKLQkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB0aGlzLnZhcmlhYmxlTmFtZXNba107CQkJCQkJCisKKwkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB0aGlzLnZhcmlhYmxlTmFtZXNba107CiAJCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpewotCQorCiAJCQkJCQkJaWYgKHZhcmlhYmxlTmFtZS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpKXsKIAkJCQkJCQkJYWZmZWN0ZWRQcm9qZWN0Q2xhc3NwYXRocy5wdXQocHJvamVjdCwgcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpKTsKIAkJCQkJCQkJY29udGludWUgbmV4dFByb2plY3Q7CkBAIC0xMTAsMTEgKzExMCwxMSBAQAogCQkJCQkJCUlQYXRoIHNvdXJjZVBhdGgsIHNvdXJjZVJvb3RQYXRoOwogCQkJCQkJCWlmICgoKHNvdXJjZVBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKSAhPSBudWxsCSYmIHZhcmlhYmxlTmFtZS5lcXVhbHMoc291cmNlUGF0aC5zZWdtZW50KDApKSkKIAkJCQkJCQkJfHwgKChzb3VyY2VSb290UGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKSAhPSBudWxsCSYmIHZhcmlhYmxlTmFtZS5lcXVhbHMoc291cmNlUm9vdFBhdGguc2VnbWVudCgwKSkpKSB7Ci0JCisKIAkJCQkJCQkJYWZmZWN0ZWRQcm9qZWN0Q2xhc3NwYXRocy5wdXQocHJvamVjdCwgcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpKTsKIAkJCQkJCQkJY29udGludWUgbmV4dFByb2plY3Q7CiAJCQkJCQkJfQotCQkJCQkJfQkJCQkJCQkJCQkJCQorCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCQkJaWYgKHRoaXMudXBkYXRlUHJlZmVyZW5jZXMpCiAJCQkJCW1hbmFnZXIudmFyaWFibGVQcmVmZXJlbmNlc1B1dCh0aGlzLnZhcmlhYmxlTmFtZXNbaV0sIHRoaXMudmFyaWFibGVQYXRoc1tpXSk7CiAJCQl9Ci0JCQkJCQorCiAJCQkvLyB1cGRhdGUgYWZmZWN0ZWQgcHJvamVjdCBjbGFzc3BhdGhzCiAJCQlpZiAoIWFmZmVjdGVkUHJvamVjdENsYXNzcGF0aHMuaXNFbXB0eSgpKSB7CiAJCQkJU3RyaW5nW10gZGJnVmFyaWFibGVOYW1lcyA9IHRoaXMudmFyaWFibGVOYW1lczsKQEAgLTEzMywxOCArMTMzLDE4IEBACiAJCQkJCS8vIHByb3BhZ2F0ZSBjbGFzc3BhdGggY2hhbmdlCiAJCQkJCUl0ZXJhdG9yIHByb2plY3RzVG9VcGRhdGUgPSBhZmZlY3RlZFByb2plY3RDbGFzc3BhdGhzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCQkJCXdoaWxlIChwcm9qZWN0c1RvVXBkYXRlLmhhc05leHQoKSkgewotCQorCiAJCQkJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKLQkKKwogCQkJCQkJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0c1RvVXBkYXRlLm5leHQoKTsKLQkKKwogCQkJCQkJLy8gZm9yY2UgcmVzb2x2ZWQgY2xhc3NwYXRoIHRvIGJlIHJlY29tcHV0ZWQKIAkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9BRFZBTkNFRCkKIAkJCQkJCQl2ZXJib3NlX3VwZGF0ZV9wcm9qZWN0KGRiZ1ZhcmlhYmxlTmFtZXMsIGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJCQlhZmZlY3RlZFByb2plY3QuZ2V0UGVyUHJvamVjdEluZm8oKS5yZXNldFJlc29sdmVkQ2xhc3NwYXRoKCk7Ci0JCQkJCQkKKwkJCQkJCUNsYXNzcGF0aENoYW5nZSBjbGFzc3BhdGhDaGFuZ2UgPSBhZmZlY3RlZFByb2plY3QuZ2V0UGVyUHJvamVjdEluZm8oKS5yZXNldFJlc29sdmVkQ2xhc3NwYXRoKCk7CisKIAkJCQkJCS8vIGlmIG5lZWRlZCwgZ2VuZXJhdGUgZGVsdGEsIHVwZGF0ZSBwcm9qZWN0IHJlZiwgY3JlYXRlIG1hcmtlcnMsIC4uLgotCQkJCQkJY2xhc3NwYXRoQ2hhbmdlZChhZmZlY3RlZFByb2plY3QpOworCQkJCQkJY2xhc3NwYXRoQ2hhbmdlZChjbGFzc3BhdGhDaGFuZ2UsIHRydWUvKnJlZnJlc2ggaWYgZXh0ZXJuYWwgbGlua2VkIGZvbGRlciBhbHJlYWR5IGV4aXN0cyovKTsKIAogCQkJCQkJaWYgKHRoaXMuY2FuQ2hhbmdlUmVzb3VyY2VzKSB7CiAJCQkJCQkJLy8gdG91Y2ggcHJvamVjdCB0byBmb3JjZSBhIGJ1aWxkIGlmIG5lZWRlZApAQCAtMTUyLDggKzE1Miw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKLQkJCQkJCXZlcmJvc2VfZmFpbHVyZShkYmdWYXJpYWJsZU5hbWVzKTsgCisJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSB8fCBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKXsKKwkJCQkJCXZlcmJvc2VfZmFpbHVyZShkYmdWYXJpYWJsZU5hbWVzKTsKIAkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJCX0KIAkJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IGZpbmFsbHkgewkJCisJCX0gZmluYWxseSB7CiAJCQlkb25lKCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW1wbGVEZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2ltcGxlRGVsdGEuamF2YQppbmRleCA1MzY1MGQ3Li4xMTllZTkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW1wbGVEZWx0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NpbXBsZURlbHRhLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMTkgKzIxLDE5IEBACiAJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YSNnZXRLaW5kKCkKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IGtpbmQgPSAwOwotCQorCiAJLyoKIAkgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhI2dldEZsYWdzKCkKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IGNoYW5nZUZsYWdzID0gMDsKLQkKKwogCS8qCiAJICogTWFya3MgdGhpcyBkZWx0YSBhcyBhZGRlZAogCSAqLwogCXB1YmxpYyB2b2lkIGFkZGVkKCkgewogCQl0aGlzLmtpbmQgPSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDsKIAl9Ci0JCisKIAkvKgogCSAqIE1hcmtzIHRoaXMgZGVsdGEgYXMgY2hhbmdlZCB3aXRoIHRoZSBnaXZlbiBjaGFuZ2UgZmxhZwogCSAqLwpAQCAtNDEsMTQgKzQxLDE0IEBACiAJCXRoaXMua2luZCA9IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7CiAJCXRoaXMuY2hhbmdlRmxhZ3MgfD0gZmxhZ3M7CiAJfQotCQorCiAJLyoKIAkgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhI2dldEZsYWdzKCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldEZsYWdzKCkgewogCQlyZXR1cm4gdGhpcy5jaGFuZ2VGbGFnczsKIAl9Ci0JCisKIAkvKgogCSAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEjZ2V0S2luZCgpCiAJICovCkBAIC03MCw3ICs3MCw3IEBACiAJCXRoaXMua2luZCA9IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ7CiAJCXRoaXMuY2hhbmdlRmxhZ3MgPSAwOwogCX0KLQkKKwogCS8qCiAJICogTWFyayB0aGlzIGRlbHRhIGhhcyBhIGhhdmluZyBhIHN1cGVyIHR5cGUgY2hhbmdlCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEKaW5kZXggMWIyYzgyOC4uNGJlNjYzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2luZ2xlVHlwZVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NpbmdsZVR5cGVSZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywxNCArMTcsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIAogLyoqCi0gKiBUaGUgU2luZ2xlVHlwZVJlcXVlc3RvciBpcyBhbiBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgdGhhdCAKKyAqIFRoZSBTaW5nbGVUeXBlUmVxdWVzdG9yIGlzIGFuIElKYXZhRWxlbWVudFJlcXVlc3RvciB0aGF0CiAgKiBvbmx5IGFjY2VwdHMgb25lIHJlc3VsdCBlbGVtZW50IGFuZCB0aGVuIGNhbmNlbHMuCiAgKi8KIC8qIHBhY2thZ2UgKi8gY2xhc3MgU2luZ2xlVHlwZVJlcXVlc3RvciBpbXBsZW1lbnRzIElKYXZhRWxlbWVudFJlcXVlc3RvciB7CiAJLyoqCiAJICogVGhlIHNpbmdsZSBhY2NlcHRlZCBlbGVtZW50CiAJICovCi0JcHJvdGVjdGVkIElUeXBlIGZFbGVtZW50PSBudWxsOworCXByb3RlY3RlZCBJVHlwZSBlbGVtZW50PSBudWxsOwogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCkBAIC00MSw3ICs0MSw3IEBACiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgdm9pZCBhY2NlcHRNZW1iZXJUeXBlKElUeXBlIHR5cGUpIHsKLQlmRWxlbWVudD0gdHlwZTsKKwl0aGlzLmVsZW1lbnQ9IHR5cGU7CiB9CiAvKioKICAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCkBAIC01OSwyNSArNTksMjUgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoSVR5cGUgdHlwZSkgewotCWZFbGVtZW50PSB0eXBlOworCXRoaXMuZWxlbWVudD0gdHlwZTsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgdHlwZSBhY2NlcHRlZCBieSB0aGlzIHJlcXVlc3Rvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KICAqIGlmIG5vIHR5cGUgaGFzIGJlZW4gYWNjZXB0ZWQuCiAgKi8KIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkgewotCXJldHVybiBmRWxlbWVudDsKKwlyZXR1cm4gdGhpcy5lbGVtZW50OwogfQogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgogICovCiBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCXJldHVybiBmRWxlbWVudCAhPSBudWxsOworCXJldHVybiB0aGlzLmVsZW1lbnQgIT0gbnVsbDsKIH0KIC8qKgogICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoaXMgcmVxdWVzdG9yCiAgKi8KIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotCWZFbGVtZW50PSBudWxsOworCXRoaXMuZWxlbWVudD0gbnVsbDsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvcnRFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggNDhiOTE1YS4uOThjODNiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDgsNyArNDgsNyBAQAogLyoqCiAgKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHRvIHNvcnQgZWxlbWVudHMgaW4gYSBjb21waWxhdGlvbiB1bml0IGFjY29yZGluZyB0bwogICogY2VydGFpbiBjcml0ZXJpYS4KLSAqIAorICoKICAqIEBzaW5jZSAyLjEKICAqLwogcHVibGljIGNsYXNzIFNvcnRFbGVtZW50c09wZXJhdGlvbiBleHRlbmRzIEphdmFNb2RlbE9wZXJhdGlvbiB7CkBAIC01NywxMCArNTcsMTAgQEAKIAlDb21wYXJhdG9yIGNvbXBhcmF0b3I7CiAJaW50W10gcG9zaXRpb25zOwogICAgIGludCBhcGlMZXZlbDsKLSAgICAKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBTb3J0RWxlbWVudHNPcGVyYXRpb24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIEFTVCBBUEkgbGV2ZWw7IG9uZSBvZiB0aGUgQVNUIExFVkVMIGNvbnN0YW50cwogCSAqIEBwYXJhbSBlbGVtZW50cwogCSAqIEBwYXJhbSBwb3NpdGlvbnMKQEAgLTgwLDcgKzgwLDcgQEAKIAlwcm90ZWN0ZWQgaW50IGdldE1haW5BbW91bnRPZldvcmsoKXsKIAkJcmV0dXJuIHRoaXMuZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOwogCX0KLQkKKwogCWJvb2xlYW4gY2hlY2tNYWxmb3JtZWROb2RlcyhBU1ROb2RlIG5vZGUpIHsKIAkJT2JqZWN0IHByb3BlcnR5ID0gbm9kZS5nZXRQcm9wZXJ0eShDT05UQUlOU19NQUxGT1JNRURfTk9ERVMpOwogCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwpAQCAtOTYsMTEgKzk2LDExIEBACiAJICovCiAJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0cnkgewotCQkJYmVnaW5UYXNrKE1lc3NhZ2VzLm9wZXJhdGlvbl9zb3J0ZWxlbWVudHMsIGdldE1haW5BbW91bnRPZldvcmsoKSk7IAorCQkJYmVnaW5UYXNrKE1lc3NhZ2VzLm9wZXJhdGlvbl9zb3J0ZWxlbWVudHMsIGdldE1haW5BbW91bnRPZldvcmsoKSk7CiAJCQlDb21waWxhdGlvblVuaXQgY29weSA9IChDb21waWxhdGlvblVuaXQpIHRoaXMuZWxlbWVudHNUb1Byb2Nlc3NbMF07CiAJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBjb3B5LmdldFByaW1hcnkoKTsKIAkJCUlCdWZmZXIgYnVmZmVyID0gY29weS5nZXRCdWZmZXIoKTsKLQkJCWlmIChidWZmZXIgID09IG51bGwpIHsgCisJCQlpZiAoYnVmZmVyICA9PSBudWxsKSB7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJY2hhcltdIGJ1ZmZlckNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKQEAgLTExMywzMSArMTEzLDMxIEBACiAJCQlkb25lKCk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBDYWxjdWxhdGVzIHRoZSByZXF1aXJlZCB0ZXh0IGVkaXRzIHRvIHNvcnQgdGhlIDxjb2RlPnVuaXQ8L2NvZGU+Ci0JICogQHBhcmFtIGdyb3VwIAorCSAqIEBwYXJhbSBncm91cAogCSAqIEByZXR1cm4gdGhlIGVkaXQgb3IgbnVsbCBpZiBubyBzb3J0aW5nIGlzIHJlcXVpcmVkCiAJICovCiAJcHVibGljIFRleHRFZGl0IGNhbGN1bGF0ZUVkaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCB1bml0LCBUZXh0RWRpdEdyb3VwIGdyb3VwKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoICE9IDEpCiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKSk7Ci0JCQorCiAJCWlmICghKHRoaXMuZWxlbWVudHNUb1Byb2Nlc3NbMF0gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSkKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgdGhpcy5lbGVtZW50c1RvUHJvY2Vzc1swXSkpOwotCQkKKwogCQl0cnkgewogCQkJYmVnaW5UYXNrKE1lc3NhZ2VzLm9wZXJhdGlvbl9zb3J0ZWxlbWVudHMsIGdldE1haW5BbW91bnRPZldvcmsoKSk7Ci0JCQkKKwogCQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gKElDb21waWxhdGlvblVuaXQpdGhpcy5lbGVtZW50c1RvUHJvY2Vzc1swXTsKIAkJCVN0cmluZyBjb250ZW50PSBjdS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpOwogCQkJQVNUUmV3cml0ZSByZXdyaXRlPSBzb3J0Q29tcGlsYXRpb25Vbml0KHVuaXQsIGdyb3VwKTsKIAkJCWlmIChyZXdyaXRlID09IG51bGwpIHsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KLQkJCQorCiAJCQlEb2N1bWVudCBkb2N1bWVudD0gbmV3IERvY3VtZW50KGNvbnRlbnQpOwotCQkJcmV0dXJuIHJld3JpdGUucmV3cml0ZUFTVChkb2N1bWVudCwgbnVsbCk7CisJCQlyZXR1cm4gcmV3cml0ZS5yZXdyaXRlQVNUKGRvY3VtZW50LCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpOwogCQl9IGZpbmFsbHkgewogCQkJZG9uZSgpOwogCQl9CkBAIC0xNTcsMTMgKzE1NywxMyBAQAogCQlwYXJzZXIuc2V0S2luZChBU1RQYXJzZXIuS19DT01QSUxBVElPTl9VTklUKTsKIAkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyhmYWxzZSk7CiAJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQgYXN0ID0gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0gICAgICAgIAorCiAJCUFTVFJld3JpdGUgcmV3cml0ZXI9IHNvcnRDb21waWxhdGlvblVuaXQoYXN0LCBudWxsKTsKIAkJaWYgKHJld3JpdGVyID09IG51bGwpCiAJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0KCk7Ci0JCQotCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIG51bGwpOwotCQkKKworCQlUZXh0RWRpdCBlZGl0cyA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIHVuaXQuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsKKwogCQlSYW5nZU1hcmtlcltdIG1hcmtlcnMgPSBudWxsOwogCQlpZiAodGhpcy5wb3NpdGlvbnMgIT0gbnVsbCkgewogCQkJbWFya2VycyA9IG5ldyBSYW5nZU1hcmtlclt0aGlzLnBvc2l0aW9ucy5sZW5ndGhdOwpAQCAtMTg0LDggKzE4NCw4IEBACiAJCX0KIAkJcmV0dXJuIGRvY3VtZW50LmdldCgpOwogCX0KLQkKLQkKKworCiAJcHJpdmF0ZSBBU1RSZXdyaXRlIHNvcnRDb21waWxhdGlvblVuaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCBhc3QsIGZpbmFsIFRleHRFZGl0R3JvdXAgZ3JvdXApIHsKIAkJYXN0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKIAkJCXB1YmxpYyBib29sZWFuIHZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CkBAIC0yMTYsNyArMjE2LDcgQEAKIAkJCQl9CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQkKKwogCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewogCQkJCUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7CiAJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYm9keURlY2xhcmF0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKQEAgLTIzOSwyNCArMjM5LDI0IEBACiAJCQkJCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uID0gKEVudW1Db25zdGFudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKIAkJCQkJZW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0UHJvcGVydHkoQ29tcGlsYXRpb25Vbml0U29ydGVyLlJFTEFUSVZFX09SREVSLCBuZXcgSW50ZWdlcihlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRTdGFydFBvc2l0aW9uKCkpKTsKIAkJCQkJZW51bURlY2xhcmF0aW9uLnNldFByb3BlcnR5KENPTlRBSU5TX01BTEZPUk1FRF9OT0RFUywgQm9vbGVhbi52YWx1ZU9mKGlzTWFsZm9ybWVkKGVudW1Db25zdGFudERlY2xhcmF0aW9uKSkpOwotCQkJCX0JCQkJCisJCQkJfQogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9KTsKLQkJCi0JCWZpbmFsIEFTVFJld3JpdGUgcmV3cml0ZXI9IEFTVFJld3JpdGUuY3JlYXRlKGFzdC5nZXRBU1QoKSk7IAotCQlmaW5hbCBib29sZWFuW10gaGFzQ2hhbmdlcz0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OyAKLQkJCisKKwkJZmluYWwgQVNUUmV3cml0ZSByZXdyaXRlcj0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0LmdldEFTVCgpKTsKKwkJZmluYWwgYm9vbGVhbltdIGhhc0NoYW5nZXM9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKKwogCQlhc3QuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotCQkKKwogCQkJcHJpdmF0ZSB2b2lkIHNvcnRFbGVtZW50cyhMaXN0IGVsZW1lbnRzLCBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSkgewogCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gMCkKIAkJCQkJcmV0dXJuOwotCQkJCQorCiAJCQkJZmluYWwgTGlzdCBteUNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQkJbXlDb3B5LmFkZEFsbChlbGVtZW50cyk7CiAJCQkJQ29sbGVjdGlvbnMuc29ydChteUNvcHksIFNvcnRFbGVtZW50c09wZXJhdGlvbi50aGlzLmNvbXBhcmF0b3IpOwotCQkJCQorCiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewogCQkJCQlBU1ROb2RlIG9sZE5vZGU9IChBU1ROb2RlKSBlbGVtZW50cy5nZXQoaSk7CiAJCQkJCUFTVE5vZGUgbmV3Tm9kZT0gKEFTVE5vZGUpIG15Q29weS5nZXQoaSk7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJCQlpZiAoY2hlY2tNYWxmb3JtZWROb2Rlcyhjb21waWxhdGlvblVuaXQpKSB7CiAJCQkJCXJldHVybiB0cnVlOyAvLyBhYm9ydCBzb3J0aW5nIG9mIGN1cnJlbnQgZWxlbWVudAogCQkJCX0KLQkJCQkKKwogCQkJCXNvcnRFbGVtZW50cyhjb21waWxhdGlvblVuaXQudHlwZXMoKSwgcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0LlRZUEVTX1BST1BFUlRZKSk7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CkBAIC0yODAsNyArMjgwLDcgQEAKIAkJCQlpZiAoY2hlY2tNYWxmb3JtZWROb2Rlcyhhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSkgewogCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gYWJvcnQgc29ydGluZyBvZiBjdXJyZW50IGVsZW1lbnQKIAkJCQl9Ci0JCQkJCisKIAkJCQlzb3J0RWxlbWVudHMoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCksIHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24sIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uQk9EWV9ERUNMQVJBVElPTlNfUFJPUEVSVFkpKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KQEAgLTI4OSwxNiArMjg5LDE2IEBACiAJCQkJaWYgKGNoZWNrTWFsZm9ybWVkTm9kZXMoYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikpIHsKIAkJCQkJcmV0dXJuIHRydWU7IC8vIGFib3J0IHNvcnRpbmcgb2YgY3VycmVudCBlbGVtZW50CiAJCQkJfQotCQkJCQotCQkJCXNvcnRFbGVtZW50cyhhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKSwgcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiwgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5CT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSkpOwkKKworCQkJCXNvcnRFbGVtZW50cyhhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKSwgcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiwgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5CT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSkpOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJCisKIAkJCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKIAkJCQlpZiAoY2hlY2tNYWxmb3JtZWROb2Rlcyh0eXBlRGVjbGFyYXRpb24pKSB7CiAJCQkJCXJldHVybiB0cnVlOyAvLyBhYm9ydCBzb3J0aW5nIG9mIGN1cnJlbnQgZWxlbWVudAogCQkJCX0KLQkJCQkKKwogCQkJCXNvcnRFbGVtZW50cyh0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLCByZXdyaXRlci5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIFR5cGVEZWNsYXJhdGlvbi5CT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSkpOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQpAQCAtMzA3LDE2ICszMDcsMTYgQEAKIAkJCQlpZiAoY2hlY2tNYWxmb3JtZWROb2RlcyhlbnVtRGVjbGFyYXRpb24pKSB7CiAJCQkJCXJldHVybiB0cnVlOyAvLyBhYm9ydCBzb3J0aW5nIG9mIGN1cnJlbnQgZWxlbWVudAogCQkJCX0KLQkJCQkKKwogCQkJCXNvcnRFbGVtZW50cyhlbnVtRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLCByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShlbnVtRGVjbGFyYXRpb24sIEVudW1EZWNsYXJhdGlvbi5CT0RZX0RFQ0xBUkFUSU9OU19QUk9QRVJUWSkpOwogCQkJCXNvcnRFbGVtZW50cyhlbnVtRGVjbGFyYXRpb24uZW51bUNvbnN0YW50cygpLCByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShlbnVtRGVjbGFyYXRpb24sIEVudW1EZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UU19QUk9QRVJUWSkpOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9KTsKLQkJCisKIAkJaWYgKCFoYXNDaGFuZ2VzWzBdKQogCQkJcmV0dXJuIG51bGw7Ci0JCQorCiAJCXJldHVybiByZXdyaXRlcjsKIAl9CiAKQEAgLTM0MCw3ICszNDAsNyBAQAogCQl9CiAJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyB2b2lkIGluc2VydChUZXh0RWRpdCBwYXJlbnQsIFRleHRFZGl0IGVkaXQpIHsKIAkJaWYgKCFwYXJlbnQuaGFzQ2hpbGRyZW4oKSkgewogCQkJcGFyZW50LmFkZENoaWxkKGVkaXQpOwpAQCAtMzY2LDE0ICszNjYsMTQgQEAKIAkJfQogCQlwYXJlbnQuYWRkQ2hpbGQoZWRpdCk7CiAJfQotCQorCiAJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3ZlcnMoVGV4dEVkaXQgdGhpc0VkaXQsIFRleHRFZGl0IG90aGVyRWRpdCkgewogCQlpZiAodGhpc0VkaXQuZ2V0TGVuZ3RoKCkgPT0gMCkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCQorCiAJCWludCB0aGlzT2Zmc2V0PSB0aGlzRWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IHRoaXNFbmQ9IHRoaXNFZGl0LmdldEV4Y2x1c2l2ZUVuZCgpOwkKKwkJaW50IHRoaXNFbmQ9IHRoaXNFZGl0LmdldEV4Y2x1c2l2ZUVuZCgpOwogCQlpZiAob3RoZXJFZGl0LmdldExlbmd0aCgpID09IDApIHsKIAkJCWludCBvdGhlck9mZnNldD0gb3RoZXJFZGl0LmdldE9mZnNldCgpOwogCQkJcmV0dXJuIHRoaXNPZmZzZXQgPD0gb3RoZXJPZmZzZXQgJiYgb3RoZXJPZmZzZXQgPCB0aGlzRW5kOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlQW5ub3RhdGlvbk1ldGhvZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUFubm90YXRpb25NZXRob2RJbmZvLmphdmEKaW5kZXggYjg2ODc4NS4uNDU2ZTUxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlQW5ub3RhdGlvbk1ldGhvZEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VBbm5vdGF0aW9uTWV0aG9kSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDYgKzEwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7CisKIC8qCiAgKiBFbGVtZW50IGluZm8gZm9yIGFubm90YXRpb24gbWV0aG9kIGZyb20gc291cmNlLgogICovCkBAIC0yMCwxMSArMjIsMTMgQEAKIAkgKiBUaGVzZSBhcmUgey0xLCAtMX0gaWYgdGhlIG1ldGhvZCBpcyBhbiBhbm5vdGF0aW9uIG1ldGhvZCB3aXRoIG5vIGRlZmF1bHQgdmFsdWUuCiAJICogT3RoZXJ3aXNlIHRoZXNlIGFyZSB0aGUgc3RhcnQgYW5kIGVuZCAoaW5jbHVzaXZlKSBvZiB0aGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCiAJICovCi0gcHVibGljIGludCBkZWZhdWx0VmFsdWVTdGFydDsKLSBwdWJsaWMgaW50IGRlZmF1bHRWYWx1ZUVuZDsKKwlwdWJsaWMgaW50IGRlZmF1bHRWYWx1ZVN0YXJ0ID0gLTE7CisJcHVibGljIGludCBkZWZhdWx0VmFsdWVFbmQgPSAtMTsKKworCXB1YmxpYyBJTWVtYmVyVmFsdWVQYWlyIGRlZmF1bHRWYWx1ZTsKIAogCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbk1ldGhvZCgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VDb25zdHJ1Y3RvckluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUNvbnN0cnVjdG9ySW5mby5qYXZhCmluZGV4IDkyMmEyZDcuLjU5NjFmZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUNvbnN0cnVjdG9ySW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUNvbnN0cnVjdG9ySW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDIyICsxNCwyMiBAQAogICogRWxlbWVudCBpbmZvIGZvciBjb25zdHJ1Y3RvciBmcm9tIHNvdXJjZS4KICAqLwogcHVibGljIGNsYXNzIFNvdXJjZUNvbnN0cnVjdG9ySW5mbyBleHRlbmRzIFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvIHsKLQkKKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBSRVRVUk5fVFlQRV9OQU1FID0gbmV3IGNoYXJbXXsndicsICdvJywnaScsICdkJ307Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25NZXRob2QoKSB7CiAJCS8vIGEgY29uc3RydWN0b3IgY2Fubm90IGJlIGFuIGFubm90YXRpb24gbWV0aG9kCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIGdldFJldHVyblR5cGVOYW1lKCkgewogCQlyZXR1cm4gUkVUVVJOX1RZUEVfTkFNRTsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5UeXBlKGNoYXJbXSB0eXBlKSB7CiAJCS8vIGlnbm9yZSAoYWx3YXlzIHZvaWQpCiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlQ29uc3RydWN0b3JXaXRoQ2hpbGRyZW5JbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VDb25zdHJ1Y3RvcldpdGhDaGlsZHJlbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2E1ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlQ29uc3RydWN0b3JXaXRoQ2hpbGRyZW5JbmZvLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKKworcHVibGljIGNsYXNzIFNvdXJjZUNvbnN0cnVjdG9yV2l0aENoaWxkcmVuSW5mbyBleHRlbmRzIFNvdXJjZUNvbnN0cnVjdG9ySW5mbyB7CisKKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW47CisJCisJcHVibGljIFNvdXJjZUNvbnN0cnVjdG9yV2l0aENoaWxkcmVuSW5mbyhJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbikgeworCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisJfQorCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZC5qYXZhCmluZGV4IGUwMjUyMTMuLjA2MzRjZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw3IEBACiBwdWJsaWMgY2xhc3MgU291cmNlRmllbGQgZXh0ZW5kcyBOYW1lZE1lbWJlciBpbXBsZW1lbnRzIElGaWVsZCB7CiAKIC8qKgotICogQ29uc3RydWN0cyBhIGhhbmRsZSB0byB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgc3BlY2lmaWVkIHR5cGUuIAorICogQ29uc3RydWN0cyBhIGhhbmRsZSB0byB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgKi8KIHByb3RlY3RlZCBTb3VyY2VGaWVsZChKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CiAJc3VwZXIocGFyZW50LCBuYW1lKTsKQEAgLTQ1LDEzICs0NSwxMyBAQAogICogQHNlZSBJRmllbGQKICAqLwogcHVibGljIE9iamVjdCBnZXRDb25zdGFudCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCU9iamVjdCBjb25zdGFudCA9IG51bGw7CQorCU9iamVjdCBjb25zdGFudCA9IG51bGw7CiAJU291cmNlRmllbGRFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZUZpZWxkRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CiAJZmluYWwgY2hhcltdIGNvbnN0YW50U291cmNlQ2hhcnMgPSBpbmZvLmluaXRpYWxpemF0aW9uU291cmNlOwogCWlmIChjb25zdGFudFNvdXJjZUNoYXJzID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQkJCisKIAlTdHJpbmcgY29uc3RhbnRTb3VyY2UgPSBuZXcgU3RyaW5nKGNvbnN0YW50U291cmNlQ2hhcnMpOwogCVN0cmluZyBzaWduYXR1cmUgPSBpbmZvLmdldFR5cGVTaWduYXR1cmUoKTsKIAl0cnkgewpAQCAtODUsNiArODUsOCBAQAogCQkJfQogCQl9IGVsc2UgaWYgKHNpZ25hdHVyZS5lcXVhbHMoIlFTdHJpbmc7IikpIHsvLyROT04tTkxTLTEkCiAJCQljb25zdGFudCA9IGNvbnN0YW50U291cmNlOworCQl9IGVsc2UgaWYgKHNpZ25hdHVyZS5lcXVhbHMoIlFqYXZhLmxhbmcuU3RyaW5nOyIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJY29uc3RhbnQgPSBjb25zdGFudFNvdXJjZTsKIAkJfQogCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCS8vIG5vdCBhIHBhcnNhYmxlIGNvbnN0YW50CkBAIC0xNTMsNyArMTU1LDcgQEAKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewotCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CiAJaWYgKGluZm8gPT0gbnVsbCkgewogCQl0b1N0cmluZ05hbWUoYnVmZmVyKTsKIAkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJApAQCAtMTYxLDcgKzE2Myw3IEBACiAJCXRvU3RyaW5nTmFtZShidWZmZXIpOwogCX0gZWxzZSB7CiAJCXRyeSB7Ci0JCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyh0aGlzLmdldFR5cGVTaWduYXR1cmUoKSkpOworCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcoZ2V0VHlwZVNpZ25hdHVyZSgpKSk7CiAJCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKIAkJCXRvU3RyaW5nTmFtZShidWZmZXIpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGRFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGRFbGVtZW50SW5mby5qYXZhCmluZGV4IDkyNDdmOGMuLjJlZTgyODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZEVsZW1lbnRJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsMTMgKzE3LDEzIEBACiAgKiBFbGVtZW50IGluZm8gZm9yIElGaWVsZCBlbGVtZW50cy4KICAqLwogCi1wdWJsaWMgY2xhc3MgU291cmNlRmllbGRFbGVtZW50SW5mbyBleHRlbmRzIE1lbWJlckVsZW1lbnRJbmZvIGltcGxlbWVudHMgSVNvdXJjZUZpZWxkIHsKLQkKK3B1YmxpYyBjbGFzcyBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvIGV4dGVuZHMgQW5ub3RhdGFibGVJbmZvIGltcGxlbWVudHMgSVNvdXJjZUZpZWxkIHsKKwogCS8qKgogCSAqIFRoZSB0eXBlIG5hbWUgb2YgdGhpcyBmaWVsZC4KIAkgKi8KIAlwcm90ZWN0ZWQgY2hhcltdIHR5cGVOYW1lOwotCQorCiAJLyoqCiAJICogVGhlIGZpZWxkJ3MgaW5pdGlhbGl6ZXIgc3RyaW5nIChpZiB0aGUgZmllbGQgaXMgYSBjb25zdGFudCkuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZFdpdGhDaGlsZHJlbkluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkV2l0aENoaWxkcmVuSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWU5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZFdpdGhDaGlsZHJlbkluZm8uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworCitwdWJsaWMgY2xhc3MgU291cmNlRmllbGRXaXRoQ2hpbGRyZW5JbmZvIGV4dGVuZHMgU291cmNlRmllbGRFbGVtZW50SW5mbyB7CisKKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW47CisJCisJcHVibGljIFNvdXJjZUZpZWxkV2l0aENoaWxkcmVuSW5mbyhJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbikgeworCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisJfQorCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1hcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEKaW5kZXggZDZjYTZmNC4uYjIzMDJkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywxMSArNywxMCBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBLZWxseSBDYW1wYmVsbCA8a2VsbHljQGdvb2dsZS5jb20+IC0gSGFuZ3MgaW4gU291cmNlTWFwcGVyIGR1cmluZyBqYXZhIHByb3Bvc2FscyAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODE1NzUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC00OSwxMSArNDgsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNvdXJjZVJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNhdGVnb3JpemVkUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CkBAIC03MywxNiArNzUsNjggQEAKIHB1YmxpYyBjbGFzcyBTb3VyY2VNYXBwZXIKIAlleHRlbmRzIFJlZmVyZW5jZUluZm9BZGFwdGVyCiAJaW1wbGVtZW50cyBJU291cmNlRWxlbWVudFJlcXVlc3RvciwgU3VmZml4Q29uc3RhbnRzIHsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYWxWYXJpYWJsZUVsZW1lbnRLZXkgeworCQlTdHJpbmcgcGFyZW50OworCQlTdHJpbmcgbmFtZTsKIAkJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIGZpbGUgbmFtZSBmaWx0ZXIgdXNlIHRvIGNvbXB1dGUgdGhlIHJvb3QgcGF0aHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZW5hbWVGaWx0ZXIgRklMRU5BTUVfRklMVEVSID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShuYW1lKTsKKwkJcHVibGljIExvY2FsVmFyaWFibGVFbGVtZW50S2V5KElKYXZhRWxlbWVudCBtZXRob2QsIFN0cmluZyBuYW1lKSB7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChtZXRob2QuZ2V0UGFyZW50KCkuZ2V0SGFuZGxlSWRlbnRpZmllcigpKQorCQkJCS5hcHBlbmQoJyMnKQorCQkJCS5hcHBlbmQobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpCisJCQkJLmFwcGVuZCgnKCcpOworCQkJaWYgKG1ldGhvZC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKKwkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9ICgoSU1ldGhvZCkgbWV0aG9kKS5nZXRQYXJhbWV0ZXJUeXBlcygpOworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKKwkJCQkJfQorCQkJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKHBhcmFtZXRlclR5cGVzW2ldKSk7CisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgnKScpOworCQkJdGhpcy5wYXJlbnQgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOworCQkJdGhpcy5uYW1lID0gbmFtZTsKIAkJfQotCX07CisKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQkJaW50IHJlc3VsdCA9IDE7CisJCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGhpcy5uYW1lID09IG51bGwpID8gMCA6IHRoaXMubmFtZS5oYXNoQ29kZSgpKTsKKwkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0aGlzLnBhcmVudCA9PSBudWxsKSA/IDAgOiB0aGlzLnBhcmVudC5oYXNoQ29kZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQkJaWYgKHRoaXMgPT0gb2JqKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKG9iaiA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCUxvY2FsVmFyaWFibGVFbGVtZW50S2V5IG90aGVyID0gKExvY2FsVmFyaWFibGVFbGVtZW50S2V5KSBvYmo7CisJCQlpZiAodGhpcy5uYW1lID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7CisJCQkJaWYgKG90aGVyLnBhcmVudCAhPSBudWxsKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCF0aGlzLnBhcmVudC5lcXVhbHMob3RoZXIucGFyZW50KSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJygnKS5hcHBlbmQodGhpcy5wYXJlbnQpLmFwcGVuZCgnLicpLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgnKScpOworCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwogCS8qKgogCSAqIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgd2l0aGluCiAJICogdGhlIHppcCAoZW1wdHkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJvb3QpLiA8Y29kZT5udWxsPC9jb2RlPiBpcwpAQCAtMTExLDcgKzE2NSw3IEBACiAJICogS2V5cyBhcmUgdGhlIG1ldGhvZCBoYW5kbGVzLCBlbnRyaWVzIGFyZSA8Y29kZT5jaGFyW11bXTwvY29kZT4uCiAJICovCiAJcHJvdGVjdGVkIEhhc2hNYXAgcGFyYW1ldGVyTmFtZXM7Ci0JCisKIAkvKioKIAkgKiBUYWJsZSB0aGF0IG1hcHMgYSBiaW5hcnkgZWxlbWVudCB0byBpdHMgPGNvZGU+U291cmNlUmFuZ2U8L2NvZGU+cy4KIAkgKiBLZXlzIGFyZSB0aGUgZWxlbWVudCBoYW5kbGVzLCBlbnRyaWVzIGFyZSA8Y29kZT5Tb3VyY2VSYW5nZVtdPC9jb2RlPiB3aGljaApAQCAtMTE5LDEyICsxNzMsMjIgQEAKIAkgKiBiZWluZyBuYW1lIHJhbmdlLgogCSAqLwogCXByb3RlY3RlZCBIYXNoTWFwIHNvdXJjZVJhbmdlczsKLQkKKwogCS8qCiAJICogQSBtYXAgZnJvbSBJSmF2YUVsZW1lbnQgdG8gU3RyaW5nW10KIAkgKi8KIAlwcm90ZWN0ZWQgSGFzaE1hcCBjYXRlZ29yaWVzOworCisJLyoqCisJICogVGFibGUgdGhhdCBjb250YWlucyBhbGwgc291cmNlIHJhbmdlcyBmb3IgbG9jYWwgdmFyaWFibGVzLgorCSAqIEtleXMgYXJlIHRoZSBzcGVjaWFsIGxvY2FsIHZhcmlhYmxlIGVsZW1lbnRzLCBlbnRyaWVzIGFyZSA8Y29kZT5jaGFyW11bXTwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIEhhc2hNYXAgcGFyYW1ldGVyc1JhbmdlczsKIAkKKwkvKioKKwkgKiBTZXQgdGhhdCBjb250YWlucyBhbGwgZmluYWwgbG9jYWwgdmFyaWFibGVzLgorCSAqLworCXByb3RlY3RlZCBIYXNoU2V0IGZpbmFsUGFyYW1ldGVyczsKIAogCS8qKgogCSAqIFRoZSB1bmtub3duIHNvdXJjZSByYW5nZSB7LTEsIDB9CkBAIC0xNDQsMTcgKzIwOCwxNyBAQAogCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1lbWJlciBlbGVtZW50LgogCSAqLwogCXByb3RlY3RlZCBTdHJpbmdbXSBtZW1iZXJOYW1lOwotCQorCiAJLyoqCiAJICogVGhlIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1cnJlbnQgbWVtYmVyIG1ldGhvZCBlbGVtZW50LgogCSAqLwogCXByb3RlY3RlZCBjaGFyW11bXVtdIG1ldGhvZFBhcmFtZXRlck5hbWVzOwotCQorCiAJLyoqCiAJICogVGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIGN1cnJlbnQgbWVtYmVyIG1ldGhvZCBlbGVtZW50LgogCSAqLwogCXByb3RlY3RlZCBjaGFyW11bXVtdIG1ldGhvZFBhcmFtZXRlclR5cGVzOwotCQorCiAKIAkvKioKIAkgKiBUaGUgZWxlbWVudCBzZWFyY2hlZCBmb3IKQEAgLTE3NSwyOCArMjM5LDI4IEBACiAJU291cmNlUmFuZ2VbXSB0eXBlTmFtZVJhbmdlczsKIAlpbnRbXSB0eXBlTW9kaWZpZXJzOwogCWludCB0eXBlRGVwdGg7Ci0JCisKIAkvKioKIAkgKiAgQW5vbnltb3VzIGNvdW50ZXIgaW4gY2FzZSB3ZSB3YW50IHRvIG1hcCB0aGUgc291cmNlIG9mIGFuIGFub255bW91cyBjbGFzcy4KIAkgKi8KIAlpbnQgYW5vbnltb3VzQ291bnRlcjsKIAlpbnQgYW5vbnltb3VzQ2xhc3NOYW1lOwotCQorCiAJLyoqCiAJICpPcHRpb25zIHRvIGJlIHVzZWQKIAkgKi8KIAlTdHJpbmcgZW5jb2Rpbmc7CiAJTWFwIG9wdGlvbnM7Ci0JCisKIAkvKioKIAkgKiBVc2UgdG8gaGFuZGxlIHJvb3QgcGF0aHMgaW5mZXJlbmNlCiAJICovCiAJcHJpdmF0ZSBib29sZWFuIGFyZVJvb3RQYXRoc0NvbXB1dGVkOwotCQkKKwogCXB1YmxpYyBTb3VyY2VNYXBwZXIoKSB7CiAJCXRoaXMuYXJlUm9vdFBhdGhzQ29tcHV0ZWQgPSBmYWxzZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgPGNvZGU+U291cmNlTWFwcGVyPC9jb2RlPiB0aGF0IGxvY2F0ZXMgc291cmNlIGluIHRoZSB6aXAgZmlsZQogCSAqIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KQEAgLTIxNSwxNyArMjc5LDIwIEBACiAJCX0KIAkJdGhpcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDsKIAkJdGhpcy5zb3VyY2VSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLnBhcmFtZXRlcnNSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5pbXBvcnRzVGFibGUgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmltcG9ydHNDb3VudGVyVGFibGUgPSBuZXcgSGFzaE1hcCgpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoCiAJCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKIAkJCWludCBkZWNsYXJhdGlvbkVuZCwKKwkJCWludCBuYW1lU3RhcnQsCisJCQlpbnQgbmFtZUVuZCwKIAkJCWNoYXJbXVtdIHRva2VucywKIAkJCWJvb2xlYW4gb25EZW1hbmQsCiAJCQlpbnQgbW9kaWZpZXJzKSB7CkBAIC0yNTYsMzEgKzMyMywyOCBAQAogCQl0aGlzLmltcG9ydHNUYWJsZS5wdXQodGhpcy5iaW5hcnlUeXBlLCBpbXBvcnRzKTsKIAkJdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLnB1dCh0aGlzLmJpbmFyeVR5cGUsIG5ldyBJbnRlZ2VyKGltcG9ydHNDb3VudGVyKSk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogCSAqLwogCXB1YmxpYyB2b2lkIGFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoaW50W10gcG9zaXRpb25zKSB7CiAJCS8vZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKAotCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKLQkJaW50IGRlY2xhcmF0aW9uRW5kLAotCQljaGFyW10gbmFtZSkgeworCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSkgewogCQkvL2RvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAJICovCiAJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSkgewogCQkvL2RvIG5vdGhpbmcKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgYWRkQ2F0ZWdvcmllcyhJSmF2YUVsZW1lbnQgZWxlbWVudCwgY2hhcltdW10gZWxlbWVudENhdGVnb3JpZXMpIHsKIAkJaWYgKGVsZW1lbnRDYXRlZ29yaWVzID09IG51bGwpIHJldHVybjsKIAkJaWYgKHRoaXMuY2F0ZWdvcmllcyA9PSBudWxsKQpAQCAtMjk1LDYgKzM1OSw4IEBACiAJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCXRoaXMuc291cmNlUmFuZ2VzID0gbnVsbDsKIAkJdGhpcy5wYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisJCXRoaXMucGFyYW1ldGVyc1JhbmdlcyA9IG51bGw7CisJCXRoaXMuZmluYWxQYXJhbWV0ZXJzID0gbnVsbDsKIAl9CiAKIAkvKioKQEAgLTMxMiw3ICszNzgsNyBAQAogCQlTdHJpbmdbXSB0eXBlU2lncyA9IG5ldyBTdHJpbmdbbl07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAJCQljaGFyW10gdHlwZVNpZyA9IFNpZ25hdHVyZS5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKHR5cGVOYW1lc1tpXSwgZmFsc2UpOwotCQkJCisKIAkJCS8vIHRyYW5zZm9ybXMgc2lnbmF0dXJlcyB0aGF0IGNvbnRhaW5zIGEgcXVhbGlmaWNhdGlvbiBpbnRvIHVucXVhbGlmaWVkIHNpZ25hdHVyZXMKIAkJCS8vIGUuZy4gIlFYPCtRTWFwLkVudHJ5Oz47IiBiZWNvbWVzICJRWDwrUUVudHJ5Oz47IgogCQkJU3RyaW5nQnVmZmVyIHNpbXBsZVR5cGVTaWcgPSBudWxsOwpAQCAtMzUwLDEyICs0MTYsMTMgQEAKIAkJfQogCQlyZXR1cm4gdHlwZVNpZ3M7CiAJfQotCQorCiAJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjb21wdXRlQWxsUm9vdFBhdGhzKElUeXBlIHR5cGUpIHsKIAkJaWYgKHRoaXMuYXJlUm9vdFBhdGhzQ29tcHV0ZWQpIHsKIAkJCXJldHVybjsKIAkJfQogCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpOworCQlJUGF0aCBwa2dGcmFnbWVudFJvb3RQYXRoID0gcm9vdC5nZXRQYXRoKCk7CiAJCWZpbmFsIEhhc2hTZXQgdGVtcFJvb3RzID0gbmV3IEhhc2hTZXQoKTsKIAkJbG9uZyB0aW1lID0gMDsKIAkJaWYgKFZFUkJPU0UpIHsKQEAgLTM2NCwzNiArNDMxLDQwIEBACiAJCX0KIAkJZmluYWwgSGFzaFNldCBmaXJzdExldmVsUGFja2FnZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKIAkJYm9vbGVhbiBjb250YWluc0FEZWZhdWx0UGFja2FnZSA9IGZhbHNlOworCQlib29sZWFuIGNvbnRhaW5zSmF2YVNvdXJjZSA9ICFwa2dGcmFnbWVudFJvb3RQYXRoLmVxdWFscyh0aGlzLnNvdXJjZVBhdGgpOyAvLyB1c2VkIHRvIG9wdGltaXplIHppcCBmaWxlIHJlYWRpbmcgb25seSBpZiBzb3VyY2UgcGF0aCBhbmQgcm9vdCBwYXRoIGFyZSBlcXVhbHMsIG90aGVyd2lzZSBhc3N1bWUgdGhhdCBhdHRhY2htZW50IGNvbnRhaW5zIEphdmEgc291cmNlCiAKKwkJU3RyaW5nIHNvdXJjZUxldmVsID0gbnVsbDsKKwkJU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IG51bGw7CiAJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7Ci0JCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IGphclBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdDsKLQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gamFyUGFja2FnZUZyYWdtZW50Um9vdC5nZXRKYXZhUHJvamVjdCgpOwotCQkJU3RyaW5nIHNvdXJjZUxldmVsID0gbnVsbDsKLQkJCVN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBudWxsOwogCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJCQlaaXBGaWxlIHppcCA9IG51bGw7CiAJCQl0cnkgewotCQkJCXppcCA9IG1hbmFnZXIuZ2V0WmlwRmlsZShqYXJQYWNrYWdlRnJhZ21lbnRSb290LmdldFBhdGgoKSk7CisJCQkJemlwID0gbWFuYWdlci5nZXRaaXBGaWxlKHBrZ0ZyYWdtZW50Um9vdFBhdGgpOwogCQkJCWZvciAoRW51bWVyYXRpb24gZW50cmllcyA9IHppcC5lbnRyaWVzKCk7IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewogCQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwogCQkJCQlTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwogCQkJCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCWludCBpbmRleCA9IGVudHJ5TmFtZS5pbmRleE9mKCcvJyk7Ci0JCQkJCQlpZiAoaW5kZXggIT0gLTEgJiYgVXRpbC5pc0NsYXNzRmlsZU5hbWUoZW50cnlOYW1lKSkgewotCQkJCQkJCVN0cmluZyBmaXJzdExldmVsUGFja2FnZU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQlpZiAoIWZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuY29udGFpbnMoZmlyc3RMZXZlbFBhY2thZ2VOYW1lKSkgewotCQkJCQkJCQlpZiAoc291cmNlTGV2ZWwgPT0gbnVsbCkgewotCQkJCQkJCQkJc291cmNlTGV2ZWwgPSBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOwotCQkJCQkJCQkJY29tcGxpYW5jZUxldmVsID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7CisJCQkJCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUoZW50cnlOYW1lKSkgeworCQkJCQkJCWludCBpbmRleCA9IGVudHJ5TmFtZS5pbmRleE9mKCcvJyk7CisJCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQkJCQkJCVN0cmluZyBmaXJzdExldmVsUGFja2FnZU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCQkJCQkJaWYgKCFmaXJzdExldmVsUGFja2FnZU5hbWVzLmNvbnRhaW5zKGZpcnN0TGV2ZWxQYWNrYWdlTmFtZSkpIHsKKwkJCQkJCQkJCWlmIChzb3VyY2VMZXZlbCA9PSBudWxsKSB7CisJCQkJCQkJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSByb290LmdldEphdmFQcm9qZWN0KCk7CisJCQkJCQkJCQkJc291cmNlTGV2ZWwgPSBwcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOworCQkJCQkJCQkJCWNvbXBsaWFuY2VMZXZlbCA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShmaXJzdExldmVsUGFja2FnZU5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOworCQkJCQkJCQkJaWYgKHN0YXR1cy5pc09LKCkgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7CisJCQkJCQkJCQkJZmlyc3RMZXZlbFBhY2thZ2VOYW1lcy5hZGQoZmlyc3RMZXZlbFBhY2thZ2VOYW1lKTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKGZpcnN0TGV2ZWxQYWNrYWdlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0JCQkJCQkJCWlmIChzdGF0dXMuaXNPSygpIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJCQkJCQkJZmlyc3RMZXZlbFBhY2thZ2VOYW1lcy5hZGQoZmlyc3RMZXZlbFBhY2thZ2VOYW1lKTsKLQkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNvbnRhaW5zQURlZmF1bHRQYWNrYWdlID0gdHJ1ZTsKIAkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKGVudHJ5TmFtZSkpIHsKLQkJCQkJCQljb250YWluc0FEZWZhdWx0UGFja2FnZSA9IHRydWU7Ci0JCQkJCQl9CQkJCQkJCisJCQkJCQl9IGVsc2UgaWYgKCFjb250YWluc0phdmFTb3VyY2UgJiYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShlbnRyeU5hbWUpKSB7CisJCQkJCQkJY29udGFpbnNKYXZhU291cmNlID0gdHJ1ZTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtNDAyLDcgKzQ3Myw3IEBACiAJCQkJbWFuYWdlci5jbG9zZVppcEZpbGUoemlwKTsgLy8gaGFuZGxlIG51bGwgY2FzZQogCQkJfQogCQl9IGVsc2UgewotCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgcm9vdC5nZXRQYXRoKCksIHRydWUpOworCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocm9vdC5nZXRQYXRoKCksIHRydWUpOwogCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewogCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKIAkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CkBAIC00MTAsNzMgKzQ4MSw2NSBAQAogCQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCQkJSVJlc291cmNlIG1lbWJlciA9IG1lbWJlcnNbaV07CisJCQkJCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IG1lbWJlci5nZXROYW1lKCk7CiAJCQkJCQkJaWYgKG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQkJCQlmaXJzdExldmVsUGFja2FnZU5hbWVzLmFkZChtZW1iZXIuZ2V0TmFtZSgpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKG1lbWJlci5nZXROYW1lKCkpKSB7CisJCQkJCQkJCWlmIChzb3VyY2VMZXZlbCA9PSBudWxsKSB7CisJCQkJCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQkJCQkJCXNvdXJjZUxldmVsID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKKwkJCQkJCQkJCWNvbXBsaWFuY2VMZXZlbCA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOworCQkJCQkJCQl9CisJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocmVzb3VyY2VOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKKwkJCQkJCQkJaWYgKHN0YXR1cy5pc09LKCkgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7CisJCQkJCQkJCQlmaXJzdExldmVsUGFja2FnZU5hbWVzLmFkZChyZXNvdXJjZU5hbWUpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIGlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShyZXNvdXJjZU5hbWUpKSB7CiAJCQkJCQkJCWNvbnRhaW5zQURlZmF1bHRQYWNrYWdlID0gdHJ1ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKCFjb250YWluc0phdmFTb3VyY2UgJiYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShyZXNvdXJjZU5hbWUpKSB7CisJCQkJCQkJCWNvbnRhaW5zSmF2YVNvdXJjZSA9IHRydWU7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQkJCS8vIGlnbm9yZQogCQkJCQl9CiAJCQkJfQotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpdGFyZ2V0OwotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQkJCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJCWZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuYWRkKGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKGN1cnJlbnRGaWxlLmdldE5hbWUoKSkpIHsKLQkJCQkJCQljb250YWluc0FEZWZhdWx0UGFja2FnZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CiAJCQl9CiAJCX0KIAotCQlpZiAoVXRpbC5pc0FyY2hpdmVGaWxlTmFtZSh0aGlzLnNvdXJjZVBhdGgubGFzdFNlZ21lbnQoKSkpIHsKLQkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCQkJWmlwRmlsZSB6aXAgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXAgPSBtYW5hZ2VyLmdldFppcEZpbGUodGhpcy5zb3VyY2VQYXRoKTsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXAuZW50cmllcygpOyBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIGVudHJ5TmFtZTsKLQkJCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpICYmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUoZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpKSkgewotCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGVudHJ5TmFtZSk7Ci0JCQkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhdGguc2VnbWVudENvdW50KCkgLSAxOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCQkJaWYgKGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuY29udGFpbnMocGF0aC5zZWdtZW50KGkpKSkgewotCQkJCQkJCQkJdGVtcFJvb3RzLmFkZChwYXRoLnVwdG9TZWdtZW50KGkpKTsKLQkJCQkJCQkJCS8vIGRvbid0IGJyZWFrIGhlcmUgYXMgdGhpcyBwYXRoIGNvdWxkIGNvbnRhaW4gb3RoZXIgZmlyc3QgbGV2ZWwgcGFja2FnZSBuYW1lcyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDAxNCkKKwkJaWYgKGNvbnRhaW5zSmF2YVNvdXJjZSkgeyAvLyBubyBuZWVkIHRvIHJlYWQgc291cmNlIGF0dGFjaG1lbnQgaWYgaXQgY29udGFpbnMgbm8gSmF2YSBzb3VyY2UgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwODQwICkKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHRoaXMuc291cmNlUGF0aCwgdHJ1ZSk7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJCUlDb250YWluZXIgZm9sZGVyID0gKElDb250YWluZXIpdGFyZ2V0OworCQkJCWNvbXB1dGVSb290UGF0aChmb2xkZXIsIGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMsIGNvbnRhaW5zQURlZmF1bHRQYWNrYWdlLCB0ZW1wUm9vdHMsIGZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpLyppZiBleHRlcm5hbCBmb2xkZXIsIHRoaXMgaXMgdGhlIGxpbmtlZCBmb2xkZXIgcGF0aCovKTsKKwkJCX0gZWxzZSB7CisJCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQkJWmlwRmlsZSB6aXAgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCXppcCA9IG1hbmFnZXIuZ2V0WmlwRmlsZSh0aGlzLnNvdXJjZVBhdGgpOworCQkJCQlmb3IgKEVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXAuZW50cmllcygpOyBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpOyApIHsKKwkJCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisJCQkJCQlTdHJpbmcgZW50cnlOYW1lOworCQkJCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpICYmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUoZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChlbnRyeU5hbWUpOworCQkJCQkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOworCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7CisJCQkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXRoLnNlZ21lbnRDb3VudCgpIC0gMTsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJCQlpZiAoZmlyc3RMZXZlbFBhY2thZ2VOYW1lcy5jb250YWlucyhwYXRoLnNlZ21lbnQoaSkpKSB7CisJCQkJCQkJCQkJdGVtcFJvb3RzLmFkZChwYXRoLnVwdG9TZWdtZW50KGkpKTsKKwkJCQkJCQkJCQkvLyBkb24ndCBicmVhayBoZXJlIGFzIHRoaXMgcGF0aCBjb3VsZCBjb250YWluIG90aGVyIGZpcnN0IGxldmVsIHBhY2thZ2UgbmFtZXMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMTQpCisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoaSA9PSBtYXggLSAxICYmIGNvbnRhaW5zQURlZmF1bHRQYWNrYWdlKSB7CisJCQkJCQkJCQkJdGVtcFJvb3RzLmFkZChwYXRoLnVwdG9TZWdtZW50KG1heCkpOworCQkJCQkJCQkJfQogCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChpID09IG1heCAtIDEgJiYgY29udGFpbnNBRGVmYXVsdFBhY2thZ2UpIHsKLQkJCQkJCQkJCXRlbXBSb290cy5hZGQocGF0aC51cHRvU2VnbWVudChtYXgpKTsKLQkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoY29udGFpbnNBRGVmYXVsdFBhY2thZ2UpIHsKKwkJCQkJCQkJdGVtcFJvb3RzLmFkZChuZXcgUGF0aCgiIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChjb250YWluc0FEZWZhdWx0UGFja2FnZSkgewotCQkJCQkJCXRlbXBSb290cy5hZGQobmV3IFBhdGgoIiIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGZpbmFsbHkgewotCQkJCW1hbmFnZXIuY2xvc2VaaXBGaWxlKHppcCk7IC8vIGhhbmRsZSBudWxsIGNhc2UKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHRoaXMuc291cmNlUGF0aCwgdHJ1ZSk7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJY29tcHV0ZVJvb3RQYXRoKChJQ29udGFpbmVyKXRhcmdldCwgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgY29udGFpbnNBRGVmYXVsdFBhY2thZ2UsIHRlbXBSb290cyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpdGFyZ2V0OwotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJY29tcHV0ZVJvb3RQYXRoKGZpbGUsIGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMsIGNvbnRhaW5zQURlZmF1bHRQYWNrYWdlLCB0ZW1wUm9vdHMpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9IGZpbmFsbHkgeworCQkJCQltYW5hZ2VyLmNsb3NlWmlwRmlsZSh6aXApOyAvLyBoYW5kbGUgbnVsbCBjYXNlCiAJCQkJfQogCQkJfQogCQl9CkBAIC01MTcsNTEgKzU4MCwyNSBAQAogCQkJfQogCQl9CiAJfQotCQotCXByaXZhdGUgdm9pZCBjb21wdXRlUm9vdFBhdGgoRmlsZSBkaXJlY3RvcnksIEhhc2hTZXQgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgYm9vbGVhbiBoYXNEZWZhdWx0UGFja2FnZSwgU2V0IHNldCkgewotCQlGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCWJvb2xlYW4gaGFzU3ViRGlyZWN0b3JpZXMgPSBmYWxzZTsKLQkJbG9vcDogZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQloYXNTdWJEaXJlY3RvcmllcyA9IHRydWU7Ci0JCQkJaWYgKGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuY29udGFpbnMoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlQYXRoIGZ1bGxQYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGF0aCgpKTsKLQkJCQkJSVBhdGggcm9vdFBhdGhFbnRyeSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHModGhpcy5zb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpKS5zZXREZXZpY2UobnVsbCk7Ci0JCQkJCXNldC5hZGQocm9vdFBhdGhFbnRyeSk7Ci0JCQkJCWJyZWFrIGxvb3A7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tcHV0ZVJvb3RQYXRoKGZpbGUsIGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMsIGhhc0RlZmF1bHRQYWNrYWdlLCBzZXQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaSA9PSBtYXggLSAxICYmICFoYXNTdWJEaXJlY3RvcmllcyAmJiBoYXNEZWZhdWx0UGFja2FnZSkgewotCQkJCUZpbGUgcGFyZW50RGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKHBhcmVudERpci5saXN0KEZJTEVOQU1FX0ZJTFRFUikubGVuZ3RoICE9IDApIHsKLQkJCQkJSVBhdGggZnVsbFBhdGggPSBuZXcgUGF0aChwYXJlbnREaXIuZ2V0UGF0aCgpKTsKLQkJCQkJSVBhdGggcm9vdFBhdGhFbnRyeSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHModGhpcy5zb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpKS5zZXREZXZpY2UobnVsbCk7Ci0JCQkJCXNldC5hZGQocm9vdFBhdGhFbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkKIAotCXByaXZhdGUgdm9pZCBjb21wdXRlUm9vdFBhdGgoSUNvbnRhaW5lciBjb250YWluZXIsIEhhc2hTZXQgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgYm9vbGVhbiBoYXNEZWZhdWx0UGFja2FnZSwgU2V0IHNldCkgeworCXByaXZhdGUgdm9pZCBjb21wdXRlUm9vdFBhdGgoSUNvbnRhaW5lciBjb250YWluZXIsIEhhc2hTZXQgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgYm9vbGVhbiBoYXNEZWZhdWx0UGFja2FnZSwgU2V0IHNldCwgaW50IHNvdXJjZVBhdGhTZWdtZW50Q291bnQpIHsKIAkJdHJ5IHsKIAkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQlib29sZWFuIGhhc1N1YkRpcmVjdG9yaWVzID0gZmFsc2U7Ci0JCQlsb29wOiBmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwogCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQloYXNTdWJEaXJlY3RvcmllcyA9IHRydWU7CiAJCQkJCWlmIChmaXJzdExldmVsUGFja2FnZU5hbWVzLmNvbnRhaW5zKHJlc291cmNlLmdldE5hbWUoKSkpIHsKIAkJCQkJCUlQYXRoIGZ1bGxQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCByb290UGF0aEVudHJ5ID0gZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh0aGlzLnNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpLnNldERldmljZShudWxsKTsKLQkJCQkJCXNldC5hZGQocm9vdFBhdGhFbnRyeSk7Ci0JCQkJCQlicmVhayBsb29wOworCQkJCQkJSVBhdGggcm9vdFBhdGhFbnRyeSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlUGF0aFNlZ21lbnRDb3VudCkuc2V0RGV2aWNlKG51bGwpOworCQkJCQkJaWYgKHJvb3RQYXRoRW50cnkuc2VnbWVudENvdW50KCkgPj0gMSkgeworCQkJCQkJCXNldC5hZGQocm9vdFBhdGhFbnRyeSk7CisJCQkJCQl9CisJCQkJCQljb21wdXRlUm9vdFBhdGgoKElGb2xkZXIpIHJlc291cmNlLCBmaXJzdExldmVsUGFja2FnZU5hbWVzLCBoYXNEZWZhdWx0UGFja2FnZSwgc2V0LCBzb3VyY2VQYXRoU2VnbWVudENvdW50KTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbXB1dGVSb290UGF0aCgoSUZvbGRlcikgcmVzb3VyY2UsIGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMsIGhhc0RlZmF1bHRQYWNrYWdlLCBzZXQpOworCQkJCQkJY29tcHV0ZVJvb3RQYXRoKChJRm9sZGVyKSByZXNvdXJjZSwgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgaGFzRGVmYXVsdFBhY2thZ2UsIHNldCwgc291cmNlUGF0aFNlZ21lbnRDb3VudCk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJaWYgKGkgPT0gbWF4IC0gMSAmJiAhaGFzU3ViRGlyZWN0b3JpZXMgJiYgaGFzRGVmYXVsdFBhY2thZ2UpIHsKKwkJCQlpZiAoaSA9PSBtYXggLSAxICYmIGhhc0RlZmF1bHRQYWNrYWdlKSB7CiAJCQkJCS8vIGNoZWNrIGlmIG9uZSBtZW1iZXIgaXMgYSAuamF2YSBmaWxlCiAJCQkJCWJvb2xlYW4gaGFzSmF2YVNvdXJjZUZpbGUgPSBmYWxzZTsKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXg7IGorKykgewpAQCAtNTcyLDE1ICs2MDksMTYgQEAKIAkJCQkJfQogCQkJCQlpZiAoaGFzSmF2YVNvdXJjZUZpbGUpIHsKIAkJCQkJCUlQYXRoIGZ1bGxQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCByb290UGF0aEVudHJ5ID0gZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh0aGlzLnNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpLnNldERldmljZShudWxsKTsKKwkJCQkJCUlQYXRoIHJvb3RQYXRoRW50cnkgPSBmdWxsUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVBhdGhTZWdtZW50Q291bnQpLnNldERldmljZShudWxsKTsKIAkJCQkJCXNldC5hZGQocm9vdFBhdGhFbnRyeSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCisJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQl9Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCkBAIC02MTgsNyArNjU2LDcgQEAKIAkJCQkwLAogCQkJCXRoaXMubWVtYmVyRGVjbGFyYXRpb25TdGFydCA9IG5ldyBpbnRbdGhpcy50eXBlRGVwdGggKiAyXSwKIAkJCQkwLAotCQkJCXRoaXMudHlwZURlcHRoKTsJCQkJCQkJCisJCQkJdGhpcy50eXBlRGVwdGgpOwogCQkJU3lzdGVtLmFycmF5Y29weSgKIAkJCQl0aGlzLm1lbWJlck5hbWVSYW5nZSwKIAkJCQkwLApAQCAtNjM2LDcgKzY3NCw3IEBACiAJCQkJMCwKIAkJCQl0aGlzLm1ldGhvZFBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbdGhpcy50eXBlRGVwdGggKiAyXVtdW10sCiAJCQkJMCwKLQkJCQl0aGlzLnR5cGVEZXB0aCk7CQkJCQkKKwkJCQl0aGlzLnR5cGVEZXB0aCk7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KAogCQkJCXRoaXMudHlwZU1vZGlmaWVycywKIAkJCQkwLApAQCAtNjQ3LDE5ICs2ODUsMTkgQEAKIAkJaWYgKHR5cGVJbmZvLm5hbWUubGVuZ3RoID09IDApIHsKIAkJCXRoaXMuYW5vbnltb3VzQ291bnRlcisrOwogCQkJaWYgKHRoaXMuYW5vbnltb3VzQ291bnRlciA9PSB0aGlzLmFub255bW91c0NsYXNzTmFtZSkgewotCQkJCXRoaXMudHlwZXNbdHlwZURlcHRoXSA9IHRoaXMuZ2V0VHlwZSh0aGlzLmJpbmFyeVR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJdGhpcy50eXBlc1t0aGlzLnR5cGVEZXB0aF0gPSBnZXRUeXBlKHRoaXMuYmluYXJ5VHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJdGhpcy50eXBlc1t0eXBlRGVwdGhdID0gdGhpcy5nZXRUeXBlKG5ldyBTdHJpbmcodHlwZUluZm8ubmFtZSkpOwkJCQkKKwkJCQl0aGlzLnR5cGVzW3RoaXMudHlwZURlcHRoXSA9IGdldFR5cGUobmV3IFN0cmluZyh0eXBlSW5mby5uYW1lKSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0aGlzLnR5cGVzW3R5cGVEZXB0aF0gPSB0aGlzLmdldFR5cGUobmV3IFN0cmluZyh0eXBlSW5mby5uYW1lKSk7CisJCQl0aGlzLnR5cGVzW3RoaXMudHlwZURlcHRoXSA9IGdldFR5cGUobmV3IFN0cmluZyh0eXBlSW5mby5uYW1lKSk7CiAJCX0KLQkJdGhpcy50eXBlTmFtZVJhbmdlc1t0eXBlRGVwdGhdID0KKwkJdGhpcy50eXBlTmFtZVJhbmdlc1t0aGlzLnR5cGVEZXB0aF0gPQogCQkJbmV3IFNvdXJjZVJhbmdlKHR5cGVJbmZvLm5hbWVTb3VyY2VTdGFydCwgdHlwZUluZm8ubmFtZVNvdXJjZUVuZCAtIHR5cGVJbmZvLm5hbWVTb3VyY2VTdGFydCArIDEpOwotCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdID0gdHlwZUluZm8uZGVjbGFyYXRpb25TdGFydDsKKwkJdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHNbdGhpcy50eXBlRGVwdGhdID0gdHlwZUluZm8uZGVjbGFyYXRpb25TdGFydDsKIAotCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKLQkJCisJCUlUeXBlIGN1cnJlbnRUeXBlID0gdGhpcy50eXBlc1t0aGlzLnR5cGVEZXB0aF07CisKIAkJLy8gdHlwZSBwYXJhbWV0ZXJzCiAJCWlmICh0eXBlSW5mby50eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTY3NSw5ICs3MTMsOSBAQAogCQkJCQkJdHlwZVBhcmFtZXRlckluZm8ubmFtZVNvdXJjZUVuZCAtIHR5cGVQYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VTdGFydCArIDEpKTsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyB0eXBlIG1vZGlmaWVycwotCQl0aGlzLnR5cGVNb2RpZmllcnNbdHlwZURlcHRoXSA9IHR5cGVJbmZvLm1vZGlmaWVyczsKKwkJdGhpcy50eXBlTW9kaWZpZXJzW3RoaXMudHlwZURlcHRoXSA9IHR5cGVJbmZvLm1vZGlmaWVyczsKIAogCQkvLyBjYXRlZ29yaWVzCiAJCWFkZENhdGVnb3JpZXMoY3VycmVudFR5cGUsIHR5cGVJbmZvLmNhdGVnb3JpZXMpOwpAQCAtNjg5LDMyICs3MjcsMzIgQEAKIAlwdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHsKIAkJLy8gZG8gbm90aGluZwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKE1ldGhvZEluZm8gbWV0aG9kSW5mbykgewogCQllbnRlckFic3RyYWN0TWV0aG9kKG1ldGhvZEluZm8pOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbnRlckZpZWxkKEZpZWxkSW5mbyBmaWVsZEluZm8pIHsKLQkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7Ci0JCQl0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdHlwZURlcHRoXSA9IGZpZWxkSW5mby5kZWNsYXJhdGlvblN0YXJ0OwotCQkJdGhpcy5tZW1iZXJOYW1lUmFuZ2VbdHlwZURlcHRoXSA9CisJCWlmICh0aGlzLnR5cGVEZXB0aCA+PSAwKSB7CisJCQl0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdGhpcy50eXBlRGVwdGhdID0gZmllbGRJbmZvLmRlY2xhcmF0aW9uU3RhcnQ7CisJCQl0aGlzLm1lbWJlck5hbWVSYW5nZVt0aGlzLnR5cGVEZXB0aF0gPQogCQkJCW5ldyBTb3VyY2VSYW5nZShmaWVsZEluZm8ubmFtZVNvdXJjZVN0YXJ0LCBmaWVsZEluZm8ubmFtZVNvdXJjZUVuZCAtIGZpZWxkSW5mby5uYW1lU291cmNlU3RhcnQgKyAxKTsKIAkJCVN0cmluZyBmaWVsZE5hbWUgPSBuZXcgU3RyaW5nKGZpZWxkSW5mby5uYW1lKTsKLQkJCXRoaXMubWVtYmVyTmFtZVt0eXBlRGVwdGhdID0gZmllbGROYW1lOwotCQkJCisJCQl0aGlzLm1lbWJlck5hbWVbdGhpcy50eXBlRGVwdGhdID0gZmllbGROYW1lOworCiAJCQkvLyBjYXRlZ29yaWVzCi0JCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKKwkJCUlUeXBlIGN1cnJlbnRUeXBlID0gdGhpcy50eXBlc1t0aGlzLnR5cGVEZXB0aF07CiAJCQlJRmllbGQgZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOwogCQkJYWRkQ2F0ZWdvcmllcyhmaWVsZCwgZmllbGRJbmZvLmNhdGVnb3JpZXMpOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogCSAqLwpAQCAtNzIzLDcgKzc2MSw3IEBACiAJCWludCBtb2RpZmllcnMpIHsKIAkJLy9kbyBub3RoaW5nCiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogCSAqLwpAQCAtNzMxLDQyICs3NjksNDYgQEAKIAkJZW50ZXJBYnN0cmFjdE1ldGhvZChtZXRob2RJbmZvKTsKIAl9CiAJcHJpdmF0ZSB2b2lkIGVudGVyQWJzdHJhY3RNZXRob2QoTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7Ci0JCWlmICh0eXBlRGVwdGggPj0gMCkgewotCQkJdGhpcy5tZW1iZXJOYW1lW3R5cGVEZXB0aF0gPSBuZXcgU3RyaW5nKG1ldGhvZEluZm8ubmFtZSk7Ci0JCQl0aGlzLm1lbWJlck5hbWVSYW5nZVt0eXBlRGVwdGhdID0KKwkJaWYgKHRoaXMudHlwZURlcHRoID49IDApIHsKKwkJCXRoaXMubWVtYmVyTmFtZVt0aGlzLnR5cGVEZXB0aF0gPSBuZXcgU3RyaW5nKG1ldGhvZEluZm8ubmFtZSk7CisJCQl0aGlzLm1lbWJlck5hbWVSYW5nZVt0aGlzLnR5cGVEZXB0aF0gPQogCQkJCW5ldyBTb3VyY2VSYW5nZShtZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCwgbWV0aG9kSW5mby5uYW1lU291cmNlRW5kIC0gbWV0aG9kSW5mby5uYW1lU291cmNlU3RhcnQgKyAxKTsKLQkJCXRoaXMubWVtYmVyRGVjbGFyYXRpb25TdGFydFt0eXBlRGVwdGhdID0gbWV0aG9kSW5mby5kZWNsYXJhdGlvblN0YXJ0OwotCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07Ci0JCQlpbnQgY3VycmVuVHlwZU1vZGlmaWVycyA9IHRoaXMudHlwZU1vZGlmaWVyc1t0eXBlRGVwdGhdOworCQkJdGhpcy5tZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3RoaXMudHlwZURlcHRoXSA9IG1ldGhvZEluZm8uZGVjbGFyYXRpb25TdGFydDsKKwkJCUlUeXBlIGN1cnJlbnRUeXBlID0gdGhpcy50eXBlc1t0aGlzLnR5cGVEZXB0aF07CisJCQlpbnQgY3VycmVuVHlwZU1vZGlmaWVycyA9IHRoaXMudHlwZU1vZGlmaWVyc1t0aGlzLnR5cGVEZXB0aF07CiAJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZEluZm8ucGFyYW1ldGVyVHlwZXM7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCAmJiBtZXRob2RJbmZvLmlzQ29uc3RydWN0b3IgJiYgY3VycmVudFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwgJiYgIUZsYWdzLmlzU3RhdGljKGN1cnJlblR5cGVNb2RpZmllcnMpKSB7CisJCQlpZiAobWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yICYmIGN1cnJlbnRUeXBlLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsICYmICFGbGFncy5pc1N0YXRpYyhjdXJyZW5UeXBlTW9kaWZpZXJzKSkgewogCQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBjdXJyZW50VHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CiAJCQkJU3RyaW5nIGRlY2xhcmluZ1R5cGVOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOwogCQkJCWlmIChkZWNsYXJpbmdUeXBlTmFtZS5sZW5ndGgoKSA9PSAwKSB7CiAJCQkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gZGVjbGFyaW5nVHlwZS5nZXRDbGFzc0ZpbGUoKTsKLQkJCQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJCQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzICE9IG51bGwgPyBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggOiAwOwogCQkJCQljaGFyW11bXSBuZXdQYXJhbWV0ZXJUeXBlcyA9IG5ldyBjaGFyW2xlbmd0aCsxXVtdOwogCQkJCQlkZWNsYXJpbmdUeXBlTmFtZSA9IGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOwogCQkJCQlkZWNsYXJpbmdUeXBlTmFtZSA9IGRlY2xhcmluZ1R5cGVOYW1lLnN1YnN0cmluZygwLCBkZWNsYXJpbmdUeXBlTmFtZS5pbmRleE9mKCcuJykpOwogCQkJCQluZXdQYXJhbWV0ZXJUeXBlc1swXSA9IGRlY2xhcmluZ1R5cGVOYW1lLnRvQ2hhckFycmF5KCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZXMsIDAsIG5ld1BhcmFtZXRlclR5cGVzLCAxLCBsZW5ndGgpOwotCQkJCQl0aGlzLm1ldGhvZFBhcmFtZXRlclR5cGVzW3R5cGVEZXB0aF0gPSBuZXdQYXJhbWV0ZXJUeXBlczsKKwkJCQkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBuZXdQYXJhbWV0ZXJUeXBlcywgMSwgbGVuZ3RoKTsKKwkJCQkJfQorCQkJCQl0aGlzLm1ldGhvZFBhcmFtZXRlclR5cGVzW3RoaXMudHlwZURlcHRoXSA9IG5ld1BhcmFtZXRlclR5cGVzOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CisJCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlcyAhPSBudWxsID8gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIDogMDsKIAkJCQkJY2hhcltdW10gbmV3UGFyYW1ldGVyVHlwZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXTsKIAkJCQkJbmV3UGFyYW1ldGVyVHlwZXNbMF0gPSBkZWNsYXJpbmdUeXBlTmFtZS50b0NoYXJBcnJheSgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBuZXdQYXJhbWV0ZXJUeXBlcywgMSwgbGVuZ3RoKTsKLQkJCQkJdGhpcy5tZXRob2RQYXJhbWV0ZXJUeXBlc1t0eXBlRGVwdGhdID0gbmV3UGFyYW1ldGVyVHlwZXM7CisJCQkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJUeXBlcywgMCwgbmV3UGFyYW1ldGVyVHlwZXMsIDEsIGxlbmd0aCk7CisJCQkJCX0KKwkJCQkJdGhpcy5tZXRob2RQYXJhbWV0ZXJUeXBlc1t0aGlzLnR5cGVEZXB0aF0gPSBuZXdQYXJhbWV0ZXJUeXBlczsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXRoaXMubWV0aG9kUGFyYW1ldGVyVHlwZXNbdHlwZURlcHRoXSA9IHBhcmFtZXRlclR5cGVzOworCQkJCXRoaXMubWV0aG9kUGFyYW1ldGVyVHlwZXNbdGhpcy50eXBlRGVwdGhdID0gcGFyYW1ldGVyVHlwZXM7CiAJCQl9Ci0JCQl0aGlzLm1ldGhvZFBhcmFtZXRlck5hbWVzW3R5cGVEZXB0aF0gPSBtZXRob2RJbmZvLnBhcmFtZXRlck5hbWVzOwotCQkJCisJCQl0aGlzLm1ldGhvZFBhcmFtZXRlck5hbWVzW3RoaXMudHlwZURlcHRoXSA9IG1ldGhvZEluZm8ucGFyYW1ldGVyTmFtZXM7CisKIAkJCUlNZXRob2QgbWV0aG9kID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kKAotCQkJCQl0aGlzLm1lbWJlck5hbWVbdHlwZURlcHRoXSwKLQkJCQkJY29udmVydFR5cGVOYW1lc1RvU2lncyh0aGlzLm1ldGhvZFBhcmFtZXRlclR5cGVzW3R5cGVEZXB0aF0pKTsKLQkJCQorCQkJCQl0aGlzLm1lbWJlck5hbWVbdGhpcy50eXBlRGVwdGhdLAorCQkJCQljb252ZXJ0VHlwZU5hbWVzVG9TaWdzKHRoaXMubWV0aG9kUGFyYW1ldGVyVHlwZXNbdGhpcy50eXBlRGVwdGhdKSk7CisKIAkJCS8vIHR5cGUgcGFyYW1ldGVycwogCQkJaWYgKG1ldGhvZEluZm8udHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RJbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC03ODEsOTEgKzgyMywxMTUgQEAKIAkJCQkJCQl0eXBlUGFyYW1ldGVySW5mby5uYW1lU291cmNlU3RhcnQsCiAJCQkJCQkJdHlwZVBhcmFtZXRlckluZm8ubmFtZVNvdXJjZUVuZCAtIHR5cGVQYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VTdGFydCArIDEpKTsKIAkJCQl9Ci0JCQl9CQotCQkJCisJCQl9CisJCQkvLyBwYXJhbWV0ZXJzIGluZm9zCisJCQlpZiAobWV0aG9kSW5mby5wYXJhbWV0ZXJJbmZvcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZEluZm8ucGFyYW1ldGVySW5mb3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJUGFyYW1ldGVySW5mbyBwYXJhbWV0ZXJJbmZvID0gbWV0aG9kSW5mby5wYXJhbWV0ZXJJbmZvc1tpXTsKKwkJCQkJTG9jYWxWYXJpYWJsZUVsZW1lbnRLZXkga2V5ID0gbmV3IExvY2FsVmFyaWFibGVFbGVtZW50S2V5KG1ldGhvZCwgbmV3IFN0cmluZyhwYXJhbWV0ZXJJbmZvLm5hbWUpKTsKKwkJCQkJU291cmNlUmFuZ2VbXSBhbGxSYW5nZXMgPSBuZXcgU291cmNlUmFuZ2VbXSB7CisJCQkJCQluZXcgU291cmNlUmFuZ2UoCisJCQkJCQkJcGFyYW1ldGVySW5mby5kZWNsYXJhdGlvblN0YXJ0LAorCQkJCQkJCXBhcmFtZXRlckluZm8uZGVjbGFyYXRpb25FbmQgLSBwYXJhbWV0ZXJJbmZvLmRlY2xhcmF0aW9uU3RhcnQgKyAxKSwKKwkJCQkJCW5ldyBTb3VyY2VSYW5nZSgKKwkJCQkJCQlwYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VTdGFydCwKKwkJCQkJCQlwYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VFbmQgLSBwYXJhbWV0ZXJJbmZvLm5hbWVTb3VyY2VTdGFydCArIDEpCisJCQkJCX07CisJCQkJCXRoaXMucGFyYW1ldGVyc1Jhbmdlcy5wdXQoCisJCQkJCQlrZXksCisJCQkJCQlhbGxSYW5nZXMpOworCQkJCQlpZiAocGFyYW1ldGVySW5mby5tb2RpZmllcnMgIT0gMCkgeworCQkJCQkJaWYgKHRoaXMuZmluYWxQYXJhbWV0ZXJzID09IG51bGwpIHsKKwkJCQkJCQl0aGlzLmZpbmFsUGFyYW1ldGVycyA9IG5ldyBIYXNoU2V0KCk7CisJCQkJCQl9CisJCQkJCQl0aGlzLmZpbmFsUGFyYW1ldGVycy5hZGQoa2V5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwogCQkJLy8gY2F0ZWdvcmllcwogCQkJYWRkQ2F0ZWdvcmllcyhtZXRob2QsIG1ldGhvZEluZm8uY2F0ZWdvcmllcyk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAJICovCiAJcHVibGljIHZvaWQgZXhpdFR5cGUoaW50IGRlY2xhcmF0aW9uRW5kKSB7Ci0JCWlmICh0eXBlRGVwdGggPj0gMCkgewotCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07CisJCWlmICh0aGlzLnR5cGVEZXB0aCA+PSAwKSB7CisJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdGhpcy50eXBlRGVwdGhdOwogCQkJc2V0U291cmNlUmFuZ2UoCiAJCQkJY3VycmVudFR5cGUsCiAJCQkJbmV3IFNvdXJjZVJhbmdlKAotCQkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdLAotCQkJCQlkZWNsYXJhdGlvbkVuZCAtIHRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzW3R5cGVEZXB0aF0gKyAxKSwKLQkJCQl0aGlzLnR5cGVOYW1lUmFuZ2VzW3R5cGVEZXB0aF0pOworCQkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0aGlzLnR5cGVEZXB0aF0sCisJCQkJCWRlY2xhcmF0aW9uRW5kIC0gdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHNbdGhpcy50eXBlRGVwdGhdICsgMSksCisJCQkJdGhpcy50eXBlTmFtZVJhbmdlc1t0aGlzLnR5cGVEZXB0aF0pOwogCQkJdGhpcy50eXBlRGVwdGgtLTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBleGl0Q29tcGlsYXRpb25Vbml0KGludCBkZWNsYXJhdGlvbkVuZCkgewogCQkvL2RvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAJICovCiAJcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgewogCQlleGl0QWJzdHJhY3RNZXRob2QoZGVjbGFyYXRpb25FbmQpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBleGl0RmllbGQoaW50IGluaXRpYWxpemF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kKSB7Ci0JCWlmICh0eXBlRGVwdGggPj0gMCkgewotCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07CisJCWlmICh0aGlzLnR5cGVEZXB0aCA+PSAwKSB7CisJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdGhpcy50eXBlRGVwdGhdOwogCQkJc2V0U291cmNlUmFuZ2UoCi0JCQkJY3VycmVudFR5cGUuZ2V0RmllbGQodGhpcy5tZW1iZXJOYW1lW3R5cGVEZXB0aF0pLAorCQkJCWN1cnJlbnRUeXBlLmdldEZpZWxkKHRoaXMubWVtYmVyTmFtZVt0aGlzLnR5cGVEZXB0aF0pLAogCQkJCW5ldyBTb3VyY2VSYW5nZSgKLQkJCQkJdGhpcy5tZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3R5cGVEZXB0aF0sCi0JCQkJCWRlY2xhcmF0aW9uRW5kIC0gdGhpcy5tZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3R5cGVEZXB0aF0gKyAxKSwKLQkJCQl0aGlzLm1lbWJlck5hbWVSYW5nZVt0eXBlRGVwdGhdKTsKKwkJCQkJdGhpcy5tZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3RoaXMudHlwZURlcHRoXSwKKwkJCQkJZGVjbGFyYXRpb25FbmQgLSB0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdGhpcy50eXBlRGVwdGhdICsgMSksCisJCQkJdGhpcy5tZW1iZXJOYW1lUmFuZ2VbdGhpcy50eXBlRGVwdGhdKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKIAkgKi8KIAlwdWJsaWMgdm9pZCBleGl0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uRW5kKSB7CiAJCS8vIGltcGxlbWVudHMgYWJzdHJhY3QgbWV0aG9kCiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgogCSAqLwotCXB1YmxpYyB2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVmYXVsdFZhbHVlU3RhcnQsIGludCBkZWZhdWx0VmFsdWVFbmQpIHsKKwlwdWJsaWMgdm9pZCBleGl0TWV0aG9kKGludCBkZWNsYXJhdGlvbkVuZCwgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUpIHsKIAkJZXhpdEFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uRW5kKTsKIAl9CiAJcHJpdmF0ZSB2b2lkIGV4aXRBYnN0cmFjdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7Ci0JCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKKwkJaWYgKHRoaXMudHlwZURlcHRoID49IDApIHsKKwkJCUlUeXBlIGN1cnJlbnRUeXBlID0gdGhpcy50eXBlc1t0aGlzLnR5cGVEZXB0aF07CiAJCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSA9CiAJCQkJbmV3IFNvdXJjZVJhbmdlKAotCQkJCQl0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdHlwZURlcHRoXSwKLQkJCQkJZGVjbGFyYXRpb25FbmQgLSB0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdHlwZURlcHRoXSArIDEpOworCQkJCQl0aGlzLm1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdGhpcy50eXBlRGVwdGhdLAorCQkJCQlkZWNsYXJhdGlvbkVuZCAtIHRoaXMubWVtYmVyRGVjbGFyYXRpb25TdGFydFt0aGlzLnR5cGVEZXB0aF0gKyAxKTsKIAkJCUlNZXRob2QgbWV0aG9kID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kKAotCQkJCQl0aGlzLm1lbWJlck5hbWVbdHlwZURlcHRoXSwKLQkJCQkJY29udmVydFR5cGVOYW1lc1RvU2lncyh0aGlzLm1ldGhvZFBhcmFtZXRlclR5cGVzW3R5cGVEZXB0aF0pKTsKKwkJCQkJdGhpcy5tZW1iZXJOYW1lW3RoaXMudHlwZURlcHRoXSwKKwkJCQkJY29udmVydFR5cGVOYW1lc1RvU2lncyh0aGlzLm1ldGhvZFBhcmFtZXRlclR5cGVzW3RoaXMudHlwZURlcHRoXSkpOwogCQkJc2V0U291cmNlUmFuZ2UoCiAJCQkJbWV0aG9kLAogCQkJCXNvdXJjZVJhbmdlLAotCQkJCXRoaXMubWVtYmVyTmFtZVJhbmdlW3R5cGVEZXB0aF0pOworCQkJCXRoaXMubWVtYmVyTmFtZVJhbmdlW3RoaXMudHlwZURlcHRoXSk7CiAJCQlzZXRNZXRob2RQYXJhbWV0ZXJOYW1lcygKIAkJCQltZXRob2QsCi0JCQkJdGhpcy5tZXRob2RQYXJhbWV0ZXJOYW1lc1t0eXBlRGVwdGhdKTsKKwkJCQl0aGlzLm1ldGhvZFBhcmFtZXRlck5hbWVzW3RoaXMudHlwZURlcHRoXSk7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBMb2NhdGVzIGFuZCByZXR1cm5zIHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gKGJpbmFyeSkgdHlwZSwgaW4gdGhpcwogCSAqIFNvdXJjZU1hcHBlcidzIFpJUCBmaWxlLCBvciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHNvdXJjZQpAQCAtODgxLDcgKzk0Nyw3IEBACiAJCX0KIAkJcmV0dXJuIGZpbmRTb3VyY2UodHlwZSwgc2ltcGxlU291cmNlRmlsZU5hbWUpOwogCX0KLQkKKwogCS8qKgogCSAqIExvY2F0ZXMgYW5kIHJldHVybnMgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiAoYmluYXJ5KSB0eXBlLCBpbiB0aGlzCiAJICogU291cmNlTWFwcGVyJ3MgWklQIGZpbGUsIG9yIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgc291cmNlCkBAIC04OTYsMjggKzk2MiwzNSBAQAogCQl9CiAJCVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnID0gKFBhY2thZ2VGcmFnbWVudCkgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKIAkJU3RyaW5nIG5hbWUgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwuY29uY2F0V2l0aChwa2dGcmFnLm5hbWVzLCBzaW1wbGVTb3VyY2VGaWxlTmFtZSwgJy8nKTsKLQkKLQkJY2hhcltdIHNvdXJjZSA9IG51bGw7Ci0JCQotCQlpZiAodGhpcy5yb290UGF0aCAhPSBudWxsKSB7Ci0JCQlzb3VyY2UgPSBnZXRTb3VyY2VGb3JSb290UGF0aCh0aGlzLnJvb3RQYXRoLCBuYW1lKTsKLQkJfQogCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJY29tcHV0ZUFsbFJvb3RQYXRocyh0eXBlKTsKLQkJCWlmICh0aGlzLnJvb3RQYXRocyAhPSBudWxsKSB7Ci0JCQkJbG9vcDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucm9vdFBhdGhzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQkJCVN0cmluZyBjdXJyZW50Um9vdFBhdGggPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghY3VycmVudFJvb3RQYXRoLmVxdWFscyh0aGlzLnJvb3RQYXRoKSkgewotCQkJCQkJc291cmNlID0gZ2V0U291cmNlRm9yUm9vdFBhdGgoY3VycmVudFJvb3RQYXRoLCBuYW1lKTsKLQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCS8vIHJlbWVtYmVyIHJpZ2h0IHJvb3QgcGF0aAotCQkJCQkJCXRoaXMucm9vdFBhdGggPSBjdXJyZW50Um9vdFBhdGg7Ci0JCQkJCQkJYnJlYWsgbG9vcDsKKwkJY2hhcltdIHNvdXJjZSA9IG51bGw7CisKKwkJSmF2YU1vZGVsTWFuYWdlciBqYXZhTW9kZWxNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCXRyeSB7CisJCQlqYXZhTW9kZWxNYW5hZ2VyLmNhY2hlWmlwRmlsZXModGhpcyk7IC8vIENhY2hlIGFueSB6aXAgZmlsZXMgd2Ugb3BlbiBkdXJpbmcgdGhpcyBvcGVyYXRpb24KKworCQkJaWYgKHRoaXMucm9vdFBhdGggIT0gbnVsbCkgeworCQkJCXNvdXJjZSA9IGdldFNvdXJjZUZvclJvb3RQYXRoKHRoaXMucm9vdFBhdGgsIG5hbWUpOworCQkJfQorCQorCQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7CisJCQkJY29tcHV0ZUFsbFJvb3RQYXRocyh0eXBlKTsKKwkJCQlpZiAodGhpcy5yb290UGF0aHMgIT0gbnVsbCkgeworCQkJCQlsb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5yb290UGF0aHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKwkJCQkJCVN0cmluZyBjdXJyZW50Um9vdFBhdGggPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCQlpZiAoIWN1cnJlbnRSb290UGF0aC5lcXVhbHModGhpcy5yb290UGF0aCkpIHsKKwkJCQkJCQlzb3VyY2UgPSBnZXRTb3VyY2VGb3JSb290UGF0aChjdXJyZW50Um9vdFBhdGgsIG5hbWUpOworCQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkvLyByZW1lbWJlciByaWdodCByb290IHBhdGgKKwkJCQkJCQkJdGhpcy5yb290UGF0aCA9IGN1cnJlbnRSb290UGF0aDsKKwkJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCX0gZmluYWxseSB7CisJCQlqYXZhTW9kZWxNYW5hZ2VyLmZsdXNoWmlwRmlsZXModGhpcyk7IC8vIGNsZWFuIHVwIGNhY2hlZCB6aXAgZmlsZXMuCiAJCX0KIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigic3BlbnQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIm1zIGZvciAiICsgdHlwZS5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC05MzgsMTAgKzEwMTEsMzAgQEAKIAkJfQogCQlyZXR1cm4gdGhpcy5maW5kU291cmNlKG5ld0Z1bGxOYW1lKTsKIAl9Ci0JCisKIAlwdWJsaWMgY2hhcltdIGZpbmRTb3VyY2UoU3RyaW5nIGZ1bGxOYW1lKSB7CiAJCWNoYXJbXSBzb3VyY2UgPSBudWxsOwotCQlpZiAoVXRpbC5pc0FyY2hpdmVGaWxlTmFtZSh0aGlzLnNvdXJjZVBhdGgubGFzdFNlZ21lbnQoKSkpIHsKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQodGhpcy5zb3VyY2VQYXRoLCB0cnVlKTsKKwkJU3RyaW5nIGNoYXJTZXQgPSBudWxsOworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJSVJlc291cmNlIHJlcyA9ICgoSUNvbnRhaW5lcil0YXJnZXQpLmZpbmRNZW1iZXIoZnVsbE5hbWUpOworCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJdHJ5IHsKKwkJCQkJc291cmNlID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheSgoSUZpbGUpcmVzKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM1MTEKKwkJCQkvLyBGb3IgYSByZXNvdXJjZSBpbnNpZGUgdGhlIHdvcmtzcGFjZSwgdXNlIHRoZSBlbmNvZGluZyBzZXQgb24gdGhlIHJlc291cmNlCisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKQorCQkJCQljaGFyU2V0ID0gKChJRmlsZSl0YXJnZXQpLmdldENoYXJzZXQoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vIElnbm9yZQorCQkJfQorCQkJCiAJCQkvLyB0cnkgdG8gZ2V0IHRoZSBlbnRyeQogCQkJWmlwRW50cnkgZW50cnkgPSBudWxsOwogCQkJWmlwRmlsZSB6aXAgPSBudWxsOwpAQCAtOTUxLDQ1ICsxMDQ0LDI5IEBACiAJCQkJZW50cnkgPSB6aXAuZ2V0RW50cnkoZnVsbE5hbWUpOwogCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7CiAJCQkJCS8vIG5vdyByZWFkIHRoZSBzb3VyY2UgY29kZQotCQkJCQlzb3VyY2UgPSByZWFkU291cmNlKGVudHJ5LCB6aXApOworCQkJCQlzb3VyY2UgPSByZWFkU291cmNlKGVudHJ5LCB6aXAsIGNoYXJTZXQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJCXJldHVybiBudWxsOwogCQkJfSBmaW5hbGx5IHsKIAkJCQltYW5hZ2VyLmNsb3NlWmlwRmlsZSh6aXApOyAvLyBoYW5kbGUgbnVsbCBjYXNlCiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCB0aGlzLnNvdXJjZVBhdGgsIHRydWUpOwotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXMgPSAoKElDb250YWluZXIpdGFyZ2V0KS5maW5kTWVtYmVyKGZ1bGxOYW1lKTsKLQkJCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZSA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoKElGaWxlKXJlcyk7Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpdGFyZ2V0OwotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoZmlsZSwgZnVsbE5hbWUpOwotCQkJCQlpZiAoc291cmNlRmlsZS5pc0ZpbGUoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2UgPSBVdGlsLmdldEZpbGVDaGFyQ29udGVudChzb3VyY2VGaWxlLCB0aGlzLmVuY29kaW5nKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KIAkJfQogCQlyZXR1cm4gc291cmNlOwogCX0KIAogCi0JCisJcHVibGljIGludCBnZXRGbGFncyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlzd2l0Y2goZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSA6CisJCQkJTG9jYWxWYXJpYWJsZUVsZW1lbnRLZXkga2V5ID0gbmV3IExvY2FsVmFyaWFibGVFbGVtZW50S2V5KGVsZW1lbnQuZ2V0UGFyZW50KCksIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJaWYgKHRoaXMuZmluYWxQYXJhbWV0ZXJzICE9IG51bGwgJiYgdGhpcy5maW5hbFBhcmFtZXRlcnMuY29udGFpbnMoa2V5KSkgeworCQkJCQlyZXR1cm4gRmxhZ3MuQWNjRmluYWw7CisJCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIFNvdXJjZVJhbmdlIGZvciB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgb3IKIAkgKiB7LTEsIC0xfSBpZiBubyBzb3VyY2UgcmFuZ2UgaXMga25vd24gZm9yIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LgpAQCAtMTAyMCw2ICsxMDk3LDE1IEBACiAJCQkJCQllbGVtZW50ID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKIAkJCQkJfQogCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFIDoKKwkJCQlMb2NhbFZhcmlhYmxlRWxlbWVudEtleSBrZXkgPSBuZXcgTG9jYWxWYXJpYWJsZUVsZW1lbnRLZXkoZWxlbWVudC5nZXRQYXJlbnQoKSwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQlTb3VyY2VSYW5nZVtdIHJhbmdlcyA9IChTb3VyY2VSYW5nZVtdKSB0aGlzLnBhcmFtZXRlcnNSYW5nZXMuZ2V0KGtleSk7CisJCQkJaWYgKHJhbmdlcyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBVTktOT1dOX1JBTkdFOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiByYW5nZXNbMV07CisJCQkJfQogCQl9CiAJCVNvdXJjZVJhbmdlW10gcmFuZ2VzID0gKFNvdXJjZVJhbmdlW10pIHRoaXMuc291cmNlUmFuZ2VzLmdldChlbGVtZW50KTsKIAkJaWYgKHJhbmdlcyA9PSBudWxsKSB7CkBAIC0xMDI4LDcgKzExMTQsNyBAQAogCQkJcmV0dXJuIHJhbmdlc1sxXTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgcGFyYW1ldGVycyBuYW1lcyBmb3IgdGhlIGdpdmVuIG1ldGhvZCwgb3IKIAkgKiBudWxsIGlmIG5vIHBhcmFtZXRlciBuYW1lcyBhcmUga25vd24gZm9yIHRoZSBtZXRob2QuCkBAIC0xMDQ5LDcgKzExMzUsNyBAQAogCQkJcmV0dXJuIHBhcmFtZXRlcnM7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSA8Y29kZT5Tb3VyY2VSYW5nZTwvY29kZT4gZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvcgogCSAqIHstMSwgLTF9IGlmIG5vIHNvdXJjZSByYW5nZSBpcyBrbm93biBmb3IgdGhlIGVsZW1lbnQuCkBAIC0xMDgwLDYgKzExNjYsMTUgQEAKIAkJCQkJCWVsZW1lbnQgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwogCQkJCQl9CiAJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgOgorCQkJCUxvY2FsVmFyaWFibGVFbGVtZW50S2V5IGtleSA9IG5ldyBMb2NhbFZhcmlhYmxlRWxlbWVudEtleShlbGVtZW50LmdldFBhcmVudCgpLCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQkJCVNvdXJjZVJhbmdlW10gcmFuZ2VzID0gKFNvdXJjZVJhbmdlW10pIHRoaXMucGFyYW1ldGVyc1Jhbmdlcy5nZXQoa2V5KTsKKwkJCQlpZiAocmFuZ2VzID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIFVOS05PV05fUkFOR0U7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHJhbmdlc1swXTsKKwkJCQl9CiAJCX0KIAkJU291cmNlUmFuZ2VbXSByYW5nZXMgPSAoU291cmNlUmFuZ2VbXSkgdGhpcy5zb3VyY2VSYW5nZXMuZ2V0KGVsZW1lbnQpOwogCQlpZiAocmFuZ2VzID09IG51bGwpIHsKQEAgLTEwODgsNyArMTE4Myw3IEBACiAJCQlyZXR1cm4gcmFuZ2VzWzBdOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiA8Y29kZT50eXBlTmFtZTwvY29kZT4uICBSZXR1cm5zIGlubmVyIGNsYXNzZXMKIAkgKiBhcyB3ZWxsLgpAQCAtMTEwOSw3ICsxMjA0LDcgQEAKIAkJZWxzZQogCQkJcmV0dXJuIHRoaXMuYmluYXJ5VHlwZS5nZXRUeXBlKHR5cGVOYW1lKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgaGFuZGxlIHRoYXQgaGFzIHBhcmFtZXRlciB0eXBlcyB0aGF0IGFyZSBub3QKIAkgKiBmdWxseSBxdWFsaWZpZWQgc28gdGhhdCB0aGUgY29ycmVjdCBzb3VyY2UgaXMgZm91bmQuCkBAIC0xMTI0LDcgKzEyMTksNyBAQAogCQkJdW5xdWFsaWZpZWRQYXJhbWV0ZXJUeXBlc1tpXSA9IHVucXVhbGlmaWVkVHlwZVNpZy50b1N0cmluZygpOwogCQkJaGFzRG9sbGFyIHw9IHVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXNbaV0ubGFzdEluZGV4T2YoJyQnKSAhPSAtMTsKIAkJfQotCQkKKwogCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSBuZXcgSUphdmFFbGVtZW50WzJdOwogCQlyZXN1bHRbMF0gPSAoKElUeXBlKSBtZXRob2QuZ2V0UGFyZW50KCkpLmdldE1ldGhvZCgKIAkJCW1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLApAQCAtMTE3Myw2ICsxMjY4LDE4IEBACiAJCQkJY2FzZSBTaWduYXR1cmUuQ19ET1Q6CiAJCQkJCXN0YXJ0ID0gKytpOwogCQkJCQlicmVhazsKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0JPT0xFQU4gOgorCQkJCWNhc2UgU2lnbmF0dXJlLkNfQllURSA6CisJCQkJY2FzZSBTaWduYXR1cmUuQ19DSEFSIDoKKwkJCQljYXNlIFNpZ25hdHVyZS5DX0RPVUJMRSA6CisJCQkJY2FzZSBTaWduYXR1cmUuQ19GTE9BVCA6CisJCQkJY2FzZSBTaWduYXR1cmUuQ19JTlQgOgorCQkJCWNhc2UgU2lnbmF0dXJlLkNfTE9ORyA6CisJCQkJY2FzZSBTaWduYXR1cmUuQ19TSE9SVCA6CisJCQkJCWlmICghc2lnU3RhcnQpIHsKKwkJCQkJCXVucXVhbGlmaWVkVHlwZVNpZy5hcHBlbmQoY3VycmVudCk7CisJCQkJCQlyZXR1cm4gaSsxOworCQkJCQl9CiAJCQl9CiAJCX0KIAkJc3dpdGNoIChmaXJzdENoYXIpIHsKQEAgLTEyMTEsMTcgKzEzMTgsMTcgQEAKIAkJCQlyZXR1cm4gZW5kOwogCQl9CiAJfQotCQkKKwogCS8qKgogCSAqIE1hcHMgdGhlIGdpdmVuIHNvdXJjZSBjb2RlIHRvIHRoZSBnaXZlbiBiaW5hcnkgdHlwZSBhbmQgaXRzIGNoaWxkcmVuLgogCSAqLwogCXB1YmxpYyB2b2lkIG1hcFNvdXJjZShJVHlwZSB0eXBlLCBjaGFyW10gY29udGVudHMsIElCaW5hcnlUeXBlIGluZm8pIHsKIAkJdGhpcy5tYXBTb3VyY2UodHlwZSwgY29udGVudHMsIGluZm8sIG51bGwpOwogCX0KLQkKKwogCS8qKgogCSAqIE1hcHMgdGhlIGdpdmVuIHNvdXJjZSBjb2RlIHRvIHRoZSBnaXZlbiBiaW5hcnkgdHlwZSBhbmQgaXRzIGNoaWxkcmVuLgotCSAqIElmIGEgbm9uLW51bGwgamF2YSBlbGVtZW50IGlzIHBhc3NlZCwgZmluZHMgdGhlIG5hbWUgcmFuZ2UgZm9yIHRoZSAKKwkgKiBJZiBhIG5vbi1udWxsIGphdmEgZWxlbWVudCBpcyBwYXNzZWQsIGZpbmRzIHRoZSBuYW1lIHJhbmdlIGZvciB0aGUKIAkgKiBnaXZlbiBqYXZhIGVsZW1lbnQgd2l0aG91dCBzdG9yaW5nIGl0LgogCSAqLwogCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVNvdXJjZVJhbmdlIG1hcFNvdXJjZSgKQEAgLTEyMjksMTIgKzEzMzYsMTIgQEAKIAkJY2hhcltdIGNvbnRlbnRzLAogCQlJQmluYXJ5VHlwZSBpbmZvLAogCQlJSmF2YUVsZW1lbnQgZWxlbWVudFRvRmluZCkgewotCQkJCisKIAkJdGhpcy5iaW5hcnlUeXBlID0gKEJpbmFyeVR5cGUpIHR5cGU7Ci0JCQorCiAJCS8vIGNoZWNrIHdoZXRoZXIgaXQgaXMgYWxyZWFkeSBtYXBwZWQKIAkJaWYgKHRoaXMuc291cmNlUmFuZ2VzLmdldCh0eXBlKSAhPSBudWxsKSByZXR1cm4gKGVsZW1lbnRUb0ZpbmQgIT0gbnVsbCkgPyBnZXROYW1lUmFuZ2UoZWxlbWVudFRvRmluZCkgOiBudWxsOwotCQkKKwogCQl0aGlzLmltcG9ydHNUYWJsZS5yZW1vdmUodGhpcy5iaW5hcnlUeXBlKTsKIAkJdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLnJlbW92ZSh0aGlzLmJpbmFyeVR5cGUpOwogCQl0aGlzLnNlYXJjaGVkRWxlbWVudCA9IGVsZW1lbnRUb0ZpbmQ7CkBAIC0xMjQ5LDggKzEzNTYsMTEgQEAKIAkJdGhpcy5tZXRob2RQYXJhbWV0ZXJUeXBlcyA9IG5ldyBjaGFyWzFdW11bXTsKIAkJdGhpcy5tZXRob2RQYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyWzFdW11bXTsKIAkJdGhpcy5hbm9ueW1vdXNDb3VudGVyID0gMDsKLQkJCi0JCUhhc2hNYXAgb2xkU291cmNlUmFuZ2VzID0gKEhhc2hNYXApIHRoaXMuc291cmNlUmFuZ2VzLmNsb25lKCk7CisKKwkJSGFzaE1hcCBvbGRTb3VyY2VSYW5nZXMgPSBudWxsOworCQlpZiAoZWxlbWVudFRvRmluZCAhPSBudWxsKSB7CisJCQlvbGRTb3VyY2VSYW5nZXMgPSAoSGFzaE1hcCkgdGhpcy5zb3VyY2VSYW5nZXMuY2xvbmUoKTsKKwkJfQogCQl0cnkgewogCQkJSVByb2JsZW1GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCk7CiAJCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG51bGw7CkBAIC0xMjgwLDkgKzEzOTAsMTAgQEAKIAkJCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKSBqYXZhRWxlbWVudCA9IHRoaXMuYmluYXJ5VHlwZS5nZXRQYXJlbnQoKTsKIAkJCXBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdCgKIAkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoY29udGVudHMsIG51bGwsIHRoaXMuYmluYXJ5VHlwZS5zb3VyY2VGaWxlTmFtZShpbmZvKSwgamF2YUVsZW1lbnQpLAotCQkJCWRvRnVsbFBhcnNlKTsKKwkJCQlkb0Z1bGxQYXJzZSwKKwkJCQludWxsLypubyBwcm9ncmVzcyovKTsKIAkJCWlmIChlbGVtZW50VG9GaW5kICE9IG51bGwpIHsKLQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSB0aGlzLmdldE5hbWVSYW5nZShlbGVtZW50VG9GaW5kKTsKKwkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBnZXROYW1lUmFuZ2UoZWxlbWVudFRvRmluZCk7CiAJCQkJcmV0dXJuIHJhbmdlOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gbnVsbDsKQEAgLTEyOTksMTkgKzE0MTAsMTkgQEAKIAkJCXRoaXMudHlwZURlcHRoID0gLTE7CiAJCX0KIAl9Ci0JcHJpdmF0ZSBjaGFyW10gcmVhZFNvdXJjZShaaXBFbnRyeSBlbnRyeSwgWmlwRmlsZSB6aXApIHsKKwlwcml2YXRlIGNoYXJbXSByZWFkU291cmNlKFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIHppcCwgU3RyaW5nIGNoYXJTZXQpIHsKIAkJdHJ5IHsKIAkJCWJ5dGVbXSBieXRlcyA9IFV0aWwuZ2V0WmlwRW50cnlCeXRlQ29udGVudChlbnRyeSwgemlwKTsKIAkJCWlmIChieXRlcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFV0aWwuYnl0ZXNUb0NoYXIoYnl0ZXMsIHRoaXMuZW5jb2RpbmcpOworCQkJCXJldHVybiBVdGlsLmJ5dGVzVG9DaGFyKGJ5dGVzLCBjaGFyU2V0ID09IG51bGwgPyB0aGlzLmVuY29kaW5nIDogY2hhclNldCk7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlnbm9yZQogCQl9CiAJCXJldHVybiBudWxsOwotCX0JCi0JCi0JLyoqIAorCX0KKworCS8qKgogCSAqIFNldHMgdGhlIG1hcHBpbmcgZm9yIHRoaXMgbWV0aG9kIHRvIGl0cyBwYXJhbWV0ZXIgbmFtZXMuCiAJICoKIAkgKiBAc2VlICNwYXJhbWV0ZXJOYW1lcwpAQCAtMTMyNCw4ICsxNDM1LDggQEAKIAkJfQogCQl0aGlzLnBhcmFtZXRlck5hbWVzLnB1dChtZXRob2QsIHBhcmFtZXRlck5hbWVzKTsKIAl9Ci0JCi0JLyoqIAorCisJLyoqCiAJICogU2V0cyB0aGUgbWFwcGluZyBmb3IgdGhpcyBlbGVtZW50IHRvIGl0cyBzb3VyY2UgcmFuZ2VzIGZvciBpdHMgc291cmNlIHJhbmdlCiAJICogYW5kIG5hbWUgcmFuZ2UuCiAJICoKQEAgLTEzNTcsNyArMTQ2OCw3IEBACiAJCX0KIAkJcmV0dXJuIGltcG9ydHM7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIGhhc1RvUmV0cmlldmVTb3VyY2VSYW5nZXNGb3JMb2NhbENsYXNzKGNoYXJbXSBlbHROYW1lKSB7CiAJCS8qCiAJCSAqIEEkMSRCJDIgOiB0cnVlCkBAIC0xMzc5LDYgKzE0OTAsNiBAQAogCQkJZG9sbGFySW5kZXggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyQnLCBlbHROYW1lLCBuYW1lU3RhcnQpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKLQl9CQotCQorCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQppbmRleCA0ZjYwNTMwLi4wMDAyNmFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01MCw2ICs1MCwxMyBAQAogCWlmICghKG8gaW5zdGFuY2VvZiBTb3VyY2VNZXRob2QpKSByZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHN1cGVyLmVxdWFscyhvKSAmJiBVdGlsLmVxdWFsQXJyYXlzT3JOdWxsKHRoaXMucGFyYW1ldGVyVHlwZXMsICgoU291cmNlTWV0aG9kKW8pLnBhcmFtZXRlclR5cGVzKTsKIH0KK3B1YmxpYyBJTWVtYmVyVmFsdWVQYWlyIGdldERlZmF1bHRWYWx1ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvIHNvdXJjZU1ldGhvZEluZm8gPSAoU291cmNlTWV0aG9kRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJaWYgKHNvdXJjZU1ldGhvZEluZm8uaXNBbm5vdGF0aW9uTWV0aG9kKCkpIHsKKwkJcmV0dXJuICgoU291cmNlQW5ub3RhdGlvbk1ldGhvZEluZm8pIHNvdXJjZU1ldGhvZEluZm8pLmRlZmF1bHRWYWx1ZTsKKwl9CisJcmV0dXJuIG51bGw7Cit9CiAvKioKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KQEAgLTEyNyw3ICsxMzQsMTIgQEAKIAlTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOwogCXJldHVybiBpbmZvLnR5cGVQYXJhbWV0ZXJzOwogfQotCitwdWJsaWMgSUxvY2FsVmFyaWFibGVbXSBnZXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUxvY2FsVmFyaWFibGVbXSBhcmd1bWVudHMgPSAoKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpKS5hcmd1bWVudHM7CisJaWYgKGFyZ3VtZW50cyA9PSBudWxsKQorCQlyZXR1cm4gTG9jYWxWYXJpYWJsZS5OT19MT0NBTF9WQVJJQUJMRVM7CisJcmV0dXJuIGFyZ3VtZW50czsKK30KIC8qKgogICogQHNlZSBJTWV0aG9kI2dldFR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzKCkKICAqIEBzaW5jZSAzLjAKQEAgLTE5Nyw3ICsyMDksNyBAQAogICogQHNlZSBJTWV0aG9kCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoIXRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGhpcy5wYXJlbnQuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwlpZiAoIWdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRoaXMucGFyZW50LmdldEVsZW1lbnROYW1lKCkpKSB7CiAJCS8vIGZhc3RlciB0aGFuIHJlYWNoaW5nIHRoZSBpbmZvCiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yMjAsOSArMjMyLDkgQEAKICAqIEBzZWUgSU1ldGhvZCNpc1NpbWlsYXIoSU1ldGhvZCkKICAqLwogcHVibGljIGJvb2xlYW4gaXNTaW1pbGFyKElNZXRob2QgbWV0aG9kKSB7Ci0JcmV0dXJuIAorCXJldHVybgogCQlhcmVTaW1pbGFyTWV0aG9kcygKLQkJCXRoaXMuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5nZXRQYXJhbWV0ZXJUeXBlcygpLAorCQkJZ2V0RWxlbWVudE5hbWUoKSwgZ2V0UGFyYW1ldGVyVHlwZXMoKSwKIAkJCW1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSwKIAkJCW51bGwpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kRWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZEVsZW1lbnRJbmZvLmphdmEKaW5kZXggZjliYTE5Ny4uYTg1Y2ZhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RFbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDE1ICsxNSwxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kOwogCi0vKiogCi0gKiBFbGVtZW50IGluZm8gZm9yIElNZXRob2QgZWxlbWVudHMuIAorLyoqCisgKiBFbGVtZW50IGluZm8gZm9yIElNZXRob2QgZWxlbWVudHMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBleHRlbmRzIE1lbWJlckVsZW1lbnRJbmZvIGltcGxlbWVudHMgSVNvdXJjZU1ldGhvZCB7Ci0JCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlTWV0aG9kRWxlbWVudEluZm8gZXh0ZW5kcyBBbm5vdGF0YWJsZUluZm8gaW1wbGVtZW50cyBJU291cmNlTWV0aG9kIHsKKwogCS8qKgogCSAqIEZvciBhIHNvdXJjZSBtZXRob2QgKHRoYXQgaXMsIGEgbWV0aG9kIGNvbnRhaW5lZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQpCiAJICogdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZCwKLQkgKiBpbiB0aGUgb3JkZXIgdGhlIHBhcmFtZXRlcnMgYXJlIGRlbGNhcmVkLiBGb3IgYSBiaW5hcnkgbWV0aG9kICh0aGF0IGlzLCAKKwkgKiBpbiB0aGUgb3JkZXIgdGhlIHBhcmFtZXRlcnMgYXJlIGRlbGNhcmVkLiBGb3IgYSBiaW5hcnkgbWV0aG9kICh0aGF0IGlzLAogCSAqIGEgbWV0aG9kIGRlY2xhcmVkIGluIGEgYmluYXJ5IHR5cGUpLCB0aGVzZSBuYW1lcyBhcmUgaW52ZW50ZWQgYXMKIAkgKiAiYXJnImkgd2hlcmUgaSBzdGFydHMgYXQgMS4gVGhpcyBpcyBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIG1ldGhvZAogCSAqIGhhcyBubyBwYXJhbWV0ZXJzLgpAQCAtMzgsMTIgKzM4LDE0IEBACiAJICogRm9yIGV4YW1wbGUsIEhhc2h0YWJsZSBvciBqYXZhLnV0aWwuSGFzaHRhYmxlLgogCSAqLwogCXByb3RlY3RlZCBjaGFyW11bXSBleGNlcHRpb25UeXBlczsKKwkKKwlwcm90ZWN0ZWQgSUxvY2FsVmFyaWFibGVbXSBhcmd1bWVudHM7CiAKIAkvKgogCSAqIFRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VyY2UgdHlwZS4gRW1wdHkgaWYgbm9uZS4KIAkgKi8KIAlwcm90ZWN0ZWQgSVR5cGVQYXJhbWV0ZXJbXSB0eXBlUGFyYW1ldGVycyA9IFR5cGVQYXJhbWV0ZXIuTk9fVFlQRV9QQVJBTUVURVJTOwotCQorCiBwdWJsaWMgY2hhcltdW10gZ2V0QXJndW1lbnROYW1lcygpIHsKIAlyZXR1cm4gdGhpcy5hcmd1bWVudE5hbWVzOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kSW5mby5qYXZhCmluZGV4IGNlODQ4OWMuLjU5N2FmYmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTEgKzIwLDExIEBACiAJICogY29uc3RydWN0b3JzIGlzIGVxdWl2YWxlbnQgdG8gdm9pZC4KIAkgKi8KIAlwcm90ZWN0ZWQgY2hhcltdIHJldHVyblR5cGU7Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25NZXRob2QoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kV2l0aENoaWxkcmVuSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kV2l0aENoaWxkcmVuSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmFlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RXaXRoQ2hpbGRyZW5JbmZvLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKKworcHVibGljIGNsYXNzIFNvdXJjZU1ldGhvZFdpdGhDaGlsZHJlbkluZm8gZXh0ZW5kcyBTb3VyY2VNZXRob2RJbmZvIHsKKworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbjsKKwkKKwlwdWJsaWMgU291cmNlTWV0aG9kV2l0aENoaWxkcmVuSW5mbyhJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbikgeworCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisJfQorCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjllOTFiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7Ci0KLS8qKgotICogQHNlZSBJU291cmNlUmFuZ2UKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVJhbmdlIGltcGxlbWVudHMgSVNvdXJjZVJhbmdlIHsKLQotcHJvdGVjdGVkIGludCBvZmZzZXQsIGxlbmd0aDsKLQotcHVibGljIFNvdXJjZVJhbmdlKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLX0KLS8qCi0gKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCWlmICghKG9iaiBpbnN0YW5jZW9mIElTb3VyY2VSYW5nZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQlJU291cmNlUmFuZ2Ugc291cmNlUmFuZ2UgPSAoSVNvdXJjZVJhbmdlKSBvYmo7Ci0gICAgcmV0dXJuIHNvdXJjZVJhbmdlLmdldE9mZnNldCgpID09IHRoaXMub2Zmc2V0ICYmIHNvdXJjZVJhbmdlLmdldExlbmd0aCgpID09IHRoaXMubGVuZ3RoOwotfQotLyoqCi0gKiBAc2VlIElTb3VyY2VSYW5nZQotICovCi1wdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci19Ci0vKioKLSAqIEBzZWUgSVNvdXJjZVJhbmdlCi0gKi8KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCXJldHVybiB0aGlzLm9mZnNldDsKLX0KLS8qCi0gKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0gKi8KLXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIHRoaXMubGVuZ3RoIF4gdGhpcy5vZmZzZXQ7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZCgiW29mZnNldD0iKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQodGhpcy5vZmZzZXQpOwotCWJ1ZmZlci5hcHBlbmQoIiwgbGVuZ3RoPSIpOyAvLyROT04tTkxTLTEkCi0JYnVmZmVyLmFwcGVuZCh0aGlzLmxlbmd0aCk7Ci0JYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhCmluZGV4IDI2Y2U1N2UuLjI0MGQ5MDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsNyArMzEsNyBAQAogCSAqIHRoYXQgYSBkdXBsaWNhdGUgbmFtZWQgZWxlbWVudCBleGlzdHMuIEZvciBleGFtcGxlLCBpZgogCSAqIHRoZXJlIGFyZSB0d28gZmllbGRzIGluIGEgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZQogCSAqIHNhbWUgbmFtZSwgdGhlIG9jY3VycmVuY2UgY291bnQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaAotCSAqIHRoZW0uICBUaGUgb2NjdXJyZW5jZSBjb3VudCBzdGFydHMgYXQgMSAodGh1cyB0aGUgZmlyc3QgCisJICogdGhlbS4gIFRoZSBvY2N1cnJlbmNlIGNvdW50IHN0YXJ0cyBhdCAxICh0aHVzIHRoZSBmaXJzdAogCSAqIG9jY3VycmVuY2UgaXMgb2NjdXJyZW5jZSAxLCBub3Qgb2NjdXJyZW5jZSAwKS4KIAkgKi8KIAlwdWJsaWMgaW50IG9jY3VycmVuY2VDb3VudCA9IDE7CkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHB1YmxpYyB2b2lkIGNvcHkoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMub3BlcmF0aW9uX251bGxDb250YWluZXIpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5vcGVyYXRpb25fbnVsbENvbnRhaW5lcik7CiAJfQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OwogCUlKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y29udGFpbmVyfTsKQEAgLTEwNyw2ICsxMDcsMTMgQEAKIAkJb3BlbmFibGVQYXJlbnQuZ2VuZXJhdGVJbmZvcyhvcGVuYWJsZVBhcmVudC5jcmVhdGVFbGVtZW50SW5mbygpLCBuZXdFbGVtZW50cywgcG0pOwogCX0KIH0KK3B1YmxpYyBJQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHRoaXMsIG5hbWUpOworfQorcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBbm5vdGF0YWJsZUluZm8gaW5mbyA9IChBbm5vdGF0YWJsZUluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJcmV0dXJuIGluZm8uYW5ub3RhdGlvbnM7Cit9CiAvKioKICAqIEBzZWUgSU1lbWJlcgogICovCkBAIC0xNzUsMTMgKzE4MiwxMyBAQAogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwogcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpOworCXJldHVybiBnZXRQYXJlbnQoKS5nZXRQYXRoKCk7CiB9CiAvKgogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwotcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRSZXNvdXJjZSgpOworcHVibGljIElSZXNvdXJjZSByZXNvdXJjZSgpIHsKKwlyZXR1cm4gdGhpcy5wYXJlbnQucmVzb3VyY2UoKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlUmVmZXJlbmNlCkBAIC0yMTksNyArMjI2LDcgQEAKIAlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CiB9CiAvKioKLSAqIEBzZWUgSVBhcmVudCAKKyAqIEBzZWUgSVBhcmVudAogICovCiBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCXJldHVybiBnZXRDaGlsZHJlbigpLmxlbmd0aCA+IDA7CkBAIC0yMzYsNyArMjQzLDcgQEAKICAqLwogcHVibGljIHZvaWQgbW92ZShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5vcGVyYXRpb25fbnVsbENvbnRhaW5lcik7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm9wZXJhdGlvbl9udWxsQ29udGFpbmVyKTsKIAl9CiAJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CiAJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9OwpAQCAtMjU1LDEwICsyNjIsMTAgQEAKICAqLwogcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuZXdOYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChuZXdOYW1lID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X251bGxOYW1lKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9udWxsTmFtZSk7CiAJfQogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OwotCUlKYXZhRWxlbWVudFtdIGRlc3RzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXMuZ2V0UGFyZW50KCl9OworCUlKYXZhRWxlbWVudFtdIGRlc3RzPSBuZXcgSUphdmFFbGVtZW50W10ge2dldFBhcmVudCgpfTsKIAlTdHJpbmdbXSByZW5hbWluZ3M9IG5ldyBTdHJpbmdbXSB7bmV3TmFtZX07CiAJZ2V0SmF2YU1vZGVsKCkucmVuYW1lKGVsZW1lbnRzLCBkZXN0cywgcmVuYW1pbmdzLCBmb3JjZSwgbW9uaXRvcik7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudEluZm8uamF2YQppbmRleCAxMjgzOGMxLi5kYzVmZjg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnRJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsMTkgKzExLDIwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNvdXJjZVJhbmdlOwogCi0vKiogCi0gKiBFbGVtZW50IGluZm8gZm9yIElTb3VyY2VSZWZlcmVuY2UgZWxlbWVudHMuIAorLyoqCisgKiBFbGVtZW50IGluZm8gZm9yIElTb3VyY2VSZWZlcmVuY2UgZWxlbWVudHMuCiAgKi8KIC8qIHBhY2thZ2UgKi8gY2xhc3MgU291cmNlUmVmRWxlbWVudEluZm8gZXh0ZW5kcyBKYXZhRWxlbWVudEluZm8gewotCXByb3RlY3RlZCBpbnQgZlNvdXJjZVJhbmdlU3RhcnQsIGZTb3VyY2VSYW5nZUVuZDsKKwlwcm90ZWN0ZWQgaW50IHNvdXJjZVJhbmdlU3RhcnQsIHNvdXJjZVJhbmdlRW5kOwogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGUjZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2QjZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKQogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZCNnZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpCiAgKi8KIHB1YmxpYyBpbnQgZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSB7Ci0JcmV0dXJuIGZTb3VyY2VSYW5nZUVuZDsKKwlyZXR1cm4gdGhpcy5zb3VyY2VSYW5nZUVuZDsKIH0KIC8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlI2dldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKQpAQCAtMzEsMTUgKzMyLDE1IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZUZpZWxkI2dldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKQogICovCiBwdWJsaWMgaW50IGdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSB7Ci0JcmV0dXJuIGZTb3VyY2VSYW5nZVN0YXJ0OworCXJldHVybiB0aGlzLnNvdXJjZVJhbmdlU3RhcnQ7CiB9CiBwcm90ZWN0ZWQgSVNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgewotCXJldHVybiBuZXcgU291cmNlUmFuZ2UoZlNvdXJjZVJhbmdlU3RhcnQsIGZTb3VyY2VSYW5nZUVuZCAtIGZTb3VyY2VSYW5nZVN0YXJ0ICsgMSk7CisJcmV0dXJuIG5ldyBTb3VyY2VSYW5nZSh0aGlzLnNvdXJjZVJhbmdlU3RhcnQsIHRoaXMuc291cmNlUmFuZ2VFbmQgLSB0aGlzLnNvdXJjZVJhbmdlU3RhcnQgKyAxKTsKIH0KIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlRW5kKGludCBlbmQpIHsKLQlmU291cmNlUmFuZ2VFbmQgPSBlbmQ7CisJdGhpcy5zb3VyY2VSYW5nZUVuZCA9IGVuZDsKIH0KIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlU3RhcnQoaW50IHN0YXJ0KSB7Ci0JZlNvdXJjZVJhbmdlU3RhcnQgPSBzdGFydDsKKwl0aGlzLnNvdXJjZVJhbmdlU3RhcnQgPSBzdGFydDsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YQppbmRleCBhNzZkMjFiLi4yY2U3OTBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDEwICsyMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LkNvbXBsZXRpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlbGVjdGlvblJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5TZWxlY3Rpb25FbmdpbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5LlR5cGVIaWVyYXJjaHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5NZW1lbnRvVG9rZW5pemVyOwpAQCAtMzgsNyArMzUsNyBAQAogICovCiAKIHB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlIGV4dGVuZHMgTmFtZWRNZW1iZXIgaW1wbGVtZW50cyBJVHlwZSB7Ci0JCisKIHByb3RlY3RlZCBTb3VyY2VUeXBlKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKIAlzdXBlcihwYXJlbnQsIG5hbWUpOwogfQpAQCAtNzcsMzAgKzc0LDUyIEBACiAvKioKICAqIEBzZWUgSVR5cGUKICAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGNoYXJbXSBzbmlwcGV0LGludCBpbnNlcnRpb24saW50IHBvc2l0aW9uLGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsYm9vbGVhbiBpc1N0YXRpYyxDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUoc25pcHBldCwgaW5zZXJ0aW9uLCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYywgcmVxdWVzdG9yLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZLCBtb25pdG9yKTsKK30KKy8qKgorICogQHNlZSBJVHlwZQorICovCiBwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoY2hhcltdIHNuaXBwZXQsaW50IGluc2VydGlvbixpbnQgcG9zaXRpb24sY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyxjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyxib29sZWFuIGlzU3RhdGljLENvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUoc25pcHBldCwgaW5zZXJ0aW9uLCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYywgcmVxdWVzdG9yLCBvd25lciwgbnVsbCk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKAorCQljaGFyW10gc25pcHBldCwKKwkJaW50IGluc2VydGlvbiwKKwkJaW50IHBvc2l0aW9uLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsCisJCWludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsCisJCWJvb2xlYW4gaXNTdGF0aWMsCisJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlXb3JraW5nQ29weU93bmVyIG93bmVyLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCkgewogCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wbGV0aW9uIHJlcXVlc3RvciBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJfQotCQorCiAJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKIAlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBwcm9qZWN0Lm5ld1NlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQob3duZXIpOwotCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgcHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCBwcm9qZWN0KTsKKwlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgcHJvamVjdCwgb3duZXIsIG1vbml0b3IpOwogCiAJU3RyaW5nIHNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldFNvdXJjZSgpOwogCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBpbnNlcnRpb24gPiAtMSAmJiBpbnNlcnRpb24gPCBzb3VyY2UubGVuZ3RoKCkpIHsKLQkJCisKIAkJY2hhcltdIHByZWZpeCA9IENoYXJPcGVyYXRpb24uY29uY2F0KHNvdXJjZS5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uKS50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdeyd7J30pOwogCQljaGFyW10gc3VmZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmV3IGNoYXJbXXsnfSd9LCBzb3VyY2Uuc3Vic3RyaW5nKGluc2VydGlvbikudG9DaGFyQXJyYXkoKSk7CiAJCWNoYXJbXSBmYWtlU291cmNlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4LCBzbmlwcGV0LCBzdWZmaXgpOwotCQkKLQkJQmFzaWNDb21waWxhdGlvblVuaXQgY3UgPSAKKworCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9CiAJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCi0JCQkJZmFrZVNvdXJjZSwgCisJCQkJZmFrZVNvdXJjZSwKIAkJCQludWxsLAogCQkJCWdldEVsZW1lbnROYW1lKCksCiAJCQkJZ2V0UGFyZW50KCkpOwogCi0JCWVuZ2luZS5jb21wbGV0ZShjdSwgcHJlZml4Lmxlbmd0aCArIHBvc2l0aW9uLCBwcmVmaXgubGVuZ3RoKTsKKwkJZW5naW5lLmNvbXBsZXRlKGN1LCBwcmVmaXgubGVuZ3RoICsgcG9zaXRpb24sIHByZWZpeC5sZW5ndGgsIG51bGwvKmV4dGVuZGVkIGNvbnRleHQgaXNuJ3QgY29tcHV0ZWQqLyk7CiAJfSBlbHNlIHsKIAkJZW5naW5lLmNvbXBsZXRlKHRoaXMsIHNuaXBwZXQsIHBvc2l0aW9uLCBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCBsb2NhbFZhcmlhYmxlTmFtZXMsIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIGlzU3RhdGljKTsKIAl9CkBAIC0xNjgsNiArMTg3LDEwIEBACiAJCXJldHVybiBudWxsOwogCX0KIH0KK3B1YmxpYyBJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQW5ub3RhdGFibGVJbmZvIGluZm8gPSAoQW5ub3RhdGFibGVJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCXJldHVybiBpbmZvLmFubm90YXRpb25zOworfQogcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuRm9yQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CiAJaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKQEAgLTE4MCw3ICsyMDMsNyBAQAogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07CiAJCVN0cmluZ1tdIGVsZW1lbnRDYXRlZ29yaWVzID0gKFN0cmluZ1tdKSBjYXRlZ29yaWVzLmdldChjaGlsZCk7Ci0JCWlmIChlbGVtZW50Q2F0ZWdvcmllcyAhPSBudWxsKSAKKwkJaWYgKGVsZW1lbnRDYXRlZ29yaWVzICE9IG51bGwpCiAJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGVsZW1lbnRDYXRlZ29yaWVzLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgewogCQkJCWlmIChlbGVtZW50Q2F0ZWdvcmllc1tqXS5lcXVhbHMoY2F0ZWdvcnkpKQogCQkJCQlyZXN1bHRbaW5kZXgrK10gPSBjaGlsZDsKQEAgLTI3OCw2ICszMDEsNyBAQAogCQkJCXN3aXRjaCAodG9rZW4uY2hhckF0KDApKSB7CiAJCQkJCWNhc2UgSkVNX1RZUEU6CiAJCQkJCWNhc2UgSkVNX1RZUEVfUEFSQU1FVEVSOgorCQkJCQljYXNlIEpFTV9BTk5PVEFUSU9OOgogCQkJCQkJYnJlYWsgbmV4dFBhcmFtOwogCQkJCQljYXNlIEpFTV9NRVRIT0Q6CiAJCQkJCQlpZiAoIW1lbWVudG8uaGFzTW9yZVRva2VucygpKSByZXR1cm4gdGhpczsKQEAgLTMwMSw2ICszMjUsNyBAQAogCQkJCWNhc2UgSkVNX1RZUEU6CiAJCQkJY2FzZSBKRU1fVFlQRV9QQVJBTUVURVI6CiAJCQkJY2FzZSBKRU1fTE9DQUxWQVJJQUJMRToKKwkJCQljYXNlIEpFTV9BTk5PVEFUSU9OOgogCQkJCQlyZXR1cm4gbWV0aG9kLmdldEhhbmRsZUZyb21NZW1lbnRvKHRva2VuLCBtZW1lbnRvLCB3b3JraW5nQ29weU93bmVyKTsKIAkJCQlkZWZhdWx0OgogCQkJCQlyZXR1cm4gbWV0aG9kOwpAQCAtMzMxLDcgKzM1NiwxMSBAQAogCQkJU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lID0gbWVtZW50by5uZXh0VG9rZW4oKTsKIAkJCUphdmFFbGVtZW50IHR5cGVQYXJhbWV0ZXIgPSBuZXcgVHlwZVBhcmFtZXRlcih0aGlzLCB0eXBlUGFyYW1ldGVyTmFtZSk7CiAJCQlyZXR1cm4gdHlwZVBhcmFtZXRlci5nZXRIYW5kbGVGcm9tTWVtZW50byhtZW1lbnRvLCB3b3JraW5nQ29weU93bmVyKTsKLQkJCQorCQljYXNlIEpFTV9BTk5PVEFUSU9OOgorCQkJaWYgKCFtZW1lbnRvLmhhc01vcmVUb2tlbnMoKSkgcmV0dXJuIHRoaXM7CisJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBtZW1lbnRvLm5leHRUb2tlbigpOworCQkJSmF2YUVsZW1lbnQgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lKTsKKwkJCXJldHVybiBhbm5vdGF0aW9uLmdldEhhbmRsZUZyb21NZW1lbnRvKG1lbWVudG8sIHdvcmtpbmdDb3B5T3duZXIpOwogCX0KIAlyZXR1cm4gbnVsbDsKIH0KQEAgLTYxMCwxNSArNjM5LDE1IEBACiB9CiAvKioKICAqIE5PVEU6IFRoaXMgbWV0aG9kIGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgaGFzIGl0IGlzIG5vdCBjbGVhciBjbGllbnRzIHdvdWxkIGVhc2lseSB1c2UgaXQ6IHRoZXkgd291bGQgbmVlZCB0bwotICogZmlyc3QgbWFrZSBzdXJlIGFsbCB3b3JraW5nIGNvcGllcyBmb3IgdGhlIGdpdmVuIG93bmVyIGV4aXN0IGJlZm9yZSBjYWxsaW5nIGl0LiBUaGlzIGlzIGVzcGVjaWFsbHkgaGFyIGF0IHN0YXJ0dXAgCisgKiBmaXJzdCBtYWtlIHN1cmUgYWxsIHdvcmtpbmcgY29waWVzIGZvciB0aGUgZ2l2ZW4gb3duZXIgZXhpc3QgYmVmb3JlIGNhbGxpbmcgaXQuIFRoaXMgaXMgZXNwZWNpYWxseSBoYXIgYXQgc3RhcnR1cAogICogdGltZS4KICAqIEluIGNhc2UgY2xpZW50cyB3YW50IHRoaXMgQVBJLCBoZXJlIGlzIGhvdyBpdCBzaG91bGQgYmUgc3BlY2lmaWVkOgogICogPHA+CiAgKiBMb2FkcyBhIHByZXZpb3VzbHkgc2F2ZWQgSVR5cGVIaWVyYXJjaHkgZnJvbSBhbiBpbnB1dCBzdHJlYW0uIEEgdHlwZSBoaWVyYXJjaHkgY2FuCiAgKiBiZSBzdG9yZWQgdXNpbmcgSVR5cGVIaWVyYWNoeSNzdG9yZShPdXRwdXRTdHJlYW0pLiBBIGNvbXBpbGF0aW9uIHVuaXQgb2YgYQotICogbG9hZGVkIHR5cGUgaGFzIHRoZSBnaXZlbiBvd25lciBpZiBzdWNoIGEgd29ya2luZyBjb3B5IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSB0eXBlJ3MgCisgKiBsb2FkZWQgdHlwZSBoYXMgdGhlIGdpdmVuIG93bmVyIGlmIHN1Y2ggYSB3b3JraW5nIGNvcHkgZXhpc3RzLCBvdGhlcndpc2UgdGhlIHR5cGUncwogICogY29tcGlsYXRpb24gdW5pdCBpcyBhIHByaW1hcnkgY29tcGlsYXRpb24gdW5pdC4KLSAqIAorICoKICAqIE9ubHkgaGllcmFyY2hpZXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgbG9hZGVkOgogICogPHVsPgogICogPGxpPklUeXBlI25ld1N1cGVydHlwZUhpZXJhcmNoeShJUHJvZ3Jlc3NNb25pdG9yKTwvbGk+CkBAIC02MjgsMTIgKzY1NywxMiBAQAogICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvcik8L2xpPgogICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcik8L2xpPgogICogPC91PgotICogCisgKgogICogQHBhcmFtIGlucHV0IHN0cmVhbSB3aGVyZSBoaWVyYXJjaHkgd2lsbCBiZSByZWFkCiAgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgogICogQHJldHVybiB0aGUgc3RvcmVkIGhpZXJhcmNoeQogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGhpZXJhcmNoeSBjb3VsZCBub3QgYmUgcmVzdG9yZWQsIHJlYXNvbnMgaW5jbHVkZToKLSAqICAgICAgLSB0eXBlIGlzIG5vdCB0aGUgZm9jdXMgb2YgdGhlIGhpZXJhcmNoeSBvciAKKyAqICAgICAgLSB0eXBlIGlzIG5vdCB0aGUgZm9jdXMgb2YgdGhlIGhpZXJhcmNoeSBvcgogICoJCS0gdW5hYmxlIHRvIHJlYWQgdGhlIGlucHV0IHN0cmVhbSAod3JvbmcgZm9ybWF0LCBJT0V4Y2VwdGlvbiBkdXJpbmcgcmVhZGluZywgLi4uKQogICogQHNlZSBJVHlwZUhpZXJhcmNoeSNzdG9yZShqYXZhLmlvLk91dHB1dFN0cmVhbSwgSVByb2dyZXNzTW9uaXRvcikKICAqIEBzaW5jZSAzLjAKQEAgLTcwOCw3ICs3MzcsNyBAQAogICovCiBwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJSmF2YVByb2plY3QgcHJvamVjdCwgV29ya2luZ0NvcHlPd25lciBvd25lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuaGllcmFyY2h5X251bGxQcm9qZWN0KTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuaGllcmFyY2h5X251bGxQcm9qZWN0KTsKIAl9CiAJSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRXb3JraW5nQ29waWVzKG93bmVyLCB0cnVlLyphZGQgcHJpbWFyeSB3b3JraW5nIGNvcGllcyovKTsKIAlJQ29tcGlsYXRpb25Vbml0W10gcHJvamVjdFdDcyA9IG51bGw7CkBAIC03MjcsOSArNzU2LDkgQEAKIAkJfQogCX0KIAlDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uIG9wPSBuZXcgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbigKLQkJdGhpcywgCisJCXRoaXMsCiAJCXByb2plY3RXQ3MsCi0JCXByb2plY3QsIAorCQlwcm9qZWN0LAogCQl0cnVlKTsKIAlvcC5ydW5PcGVyYXRpb24obW9uaXRvcik7CiAJcmV0dXJuIG9wLmdldFJlc3VsdCgpOwpAQCAtNzM4LDkgKzc2Nyw5IEBACiAgKiBAc2VlIElUeXBlCiAgKi8KIHB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24odGhpcywgbnVsbCwgU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksIHRydWUpOwotCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKLQlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODg0NSwgVGhlIG5ldyB0eXBlIGhpZXJhcmNoeSBzaG91bGQgY29uc2lkZXIgY2hhbmdlcyBpbiBwcmltYXJ5CisJLy8gd29ya2luZyBjb3B5LiAKKwlyZXR1cm4gbmV3VHlwZUhpZXJhcmNoeShEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZLCBtb25pdG9yKTsKIH0KIC8qCiAgKiBAc2VlIElUeXBlI25ld1R5cGVIaWVyYXJjaHkoSUNvbXBpbGF0aW9uVW5pdFtdLCBJUHJvZ3Jlc3NNb25pdG9yKQpAQCAtNzQ5LDcgKzc3OCw3IEBACiAJSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXMsCiAJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKHRoaXMsIHdvcmtpbmdDb3BpZXMsIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCB0cnVlKTsKIAlvcC5ydW5PcGVyYXRpb24obW9uaXRvcik7CiAJcmV0dXJuIG9wLmdldFJlc3VsdCgpOwpAQCAtNzYyLDcgKzc5MSw3IEBACiAJSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcywKIAlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQorCiAJSUNvbXBpbGF0aW9uVW5pdFtdIGNvcGllczsKIAlpZiAod29ya2luZ0NvcGllcyA9PSBudWxsKSB7CiAJCWNvcGllcyA9IG51bGw7CkBAIC03NzksMTEgKzgwOCwxMSBAQAogCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCiAJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCUlDb21waWxhdGlvblVuaXRbXSB3b3JraW5nQ29waWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0V29ya2luZ0NvcGllcyhvd25lciwgdHJ1ZS8qYWRkIHByaW1hcnkgd29ya2luZyBjb3BpZXMqLyk7CiAJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24odGhpcywgd29ya2luZ0NvcGllcywgU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksIHRydWUpOwogCW9wLnJ1bk9wZXJhdGlvbihtb25pdG9yKTsKLQlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CQorCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKIH0KIHB1YmxpYyBKYXZhRWxlbWVudCByZXNvbHZlZChCaW5kaW5nIGJpbmRpbmcpIHsKIAlTb3VyY2VSZWZFbGVtZW50IHJlc29sdmVkSGFuZGxlID0gbmV3IFJlc29sdmVkU291cmNlVHlwZSh0aGlzLnBhcmVudCwgdGhpcy5uYW1lLCBuZXcgU3RyaW5nKGJpbmRpbmcuY29tcHV0ZVVuaXF1ZUtleSgpKSk7CkBAIC03OTEsNzEgKzgyMCw2IEBACiAJcmV0dXJuIHJlc29sdmVkSGFuZGxlOwogfQogLyoqCi0gKiBAc2VlIElUeXBlI3Jlc29sdmVUeXBlKFN0cmluZykKLSAqLwotcHVibGljIFN0cmluZ1tdW10gcmVzb2x2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlyZXR1cm4gcmVzb2x2ZVR5cGUodHlwZU5hbWUsIERlZmF1bHRXb3JraW5nQ29weU93bmVyLlBSSU1BUlkpOwotfQotLyoqCi0gKiBAc2VlIElUeXBlI3Jlc29sdmVUeXBlKFN0cmluZywgV29ya2luZ0NvcHlPd25lcikKLSAqLwotcHVibGljIFN0cmluZ1tdW10gcmVzb2x2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJU291cmNlVHlwZSBpbmZvID0gKElTb3VyY2VUeXBlKSBnZXRFbGVtZW50SW5mbygpOwotCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCk7Ci0JU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gcHJvamVjdC5uZXdTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KG93bmVyKTsKLQotCWNsYXNzIFR5cGVSZXNvbHZlUmVxdWVzdG9yIGltcGxlbWVudHMgSVNlbGVjdGlvblJlcXVlc3RvciB7Ci0JCVN0cmluZ1tdW10gYW5zd2VycyA9IG51bGw7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdE5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNEZWNsYXJhdGlvbiwgY2hhcltdIHVuaXF1ZUtleSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlTdHJpbmdbXSBhbnN3ZXIgPSBuZXcgU3RyaW5nW10gIHtuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKSwgbmV3IFN0cmluZyh0TmFtZSkgfTsKLQkJCWlmICh0aGlzLmFuc3dlcnMgPT0gbnVsbCkgewotCQkJCXRoaXMuYW5zd2VycyA9IG5ldyBTdHJpbmdbXVtdeyBhbnN3ZXIgfTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZ3JvdwotCQkJCWludCBsZW5ndGggPSB0aGlzLmFuc3dlcnMubGVuZ3RoOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5hbnN3ZXJzLCAwLCB0aGlzLmFuc3dlcnMgPSBuZXcgU3RyaW5nW2xlbmd0aCsxXVtdLCAwLCBsZW5ndGgpOwotCQkJCXRoaXMuYW5zd2Vyc1tsZW5ndGhdID0gYW5zd2VyOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdEVycm9yKENhdGVnb3JpemVkUHJvYmxlbSBlcnJvcikgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gZmllbGROYW1lLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgU3RyaW5nIGVuY2xvc2luZ0RlY2xhcmluZ1R5cGVTaWduYXR1cmUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIFN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMsIGNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJOYW1lcywgY2hhcltdW11bXSB0eXBlUGFyYW1ldGVyQm91bmROYW1lcywgYm9vbGVhbiBpc0NvbnN0cnVjdG9yLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZVBhcmFtZXRlcihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZFR5cGVQYXJhbWV0ZXIoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gc2VsZWN0b3IsIGludCBzZWxlY3RvclN0YXJ0LCBpbnQgc2VsY2V0b3JFbmQsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQl9Ci0JVHlwZVJlc29sdmVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFR5cGVSZXNvbHZlUmVxdWVzdG9yKCk7Ci0JU2VsZWN0aW9uRW5naW5lIGVuZ2luZSA9IAotCQluZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQotIAlJVHlwZVtdIHRvcExldmVsVHlwZXMgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlcygpOwotIAlpbnQgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7Ci0gCVNvdXJjZVR5cGVFbGVtZW50SW5mb1tdIHRvcExldmVsSW5mb3MgPSBuZXcgU291cmNlVHlwZUVsZW1lbnRJbmZvW2xlbmd0aF07Ci0gCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdG9wTGV2ZWxJbmZvc1tpXSA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pICgoU291cmNlVHlwZSl0b3BMZXZlbFR5cGVzW2ldKS5nZXRFbGVtZW50SW5mbygpOwotCX0KLQkJCi0JZW5naW5lLnNlbGVjdFR5cGUoaW5mbywgdHlwZU5hbWUudG9DaGFyQXJyYXkoKSwgdG9wTGV2ZWxJbmZvcywgZmFsc2UpOwotCWlmIChOYW1lTG9va3VwLlZFUkJPU0UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIFRJTUUgU1BFTlQgaW4gTmFtZUxvb3BrdXAjc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlOiAiICsgZW52aXJvbm1lbnQubmFtZUxvb2t1cC50aW1lU3BlbnRJblNlZWtUeXBlc0luU291cmNlUGFja2FnZSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBUSU1FIFNQRU5UIGluIE5hbWVMb29wa3VwI3NlZWtUeXBlc0luQmluYXJ5UGFja2FnZTogIiArIGVudmlyb25tZW50Lm5hbWVMb29rdXAudGltZVNwZW50SW5TZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2UgKyAibXMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlyZXR1cm4gcmVxdWVzdG9yLmFuc3dlcnM7Ci19Ci0vKioKICAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8sIGJvb2xlYW4gc2hvd1Jlc29sdmVkSW5mbykgewpAQCAtODgxLDExICs4NDUsMTEgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXRyeSB7Ci0JCQlpZiAodGhpcy5pc0VudW0oKSkgeworCQkJaWYgKGlzRW51bSgpKSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgiZW51bSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICh0aGlzLmlzQW5ub3RhdGlvbigpKSB7CisJCQl9IGVsc2UgaWYgKGlzQW5ub3RhdGlvbigpKSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgiQGludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICh0aGlzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCX0gZWxzZSBpZiAoaXNJbnRlcmZhY2UoKSkgewogCQkJCWJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAogCQkJfSBlbHNlIHsKIAkJCQlidWZmZXIuYXBwZW5kKCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZUVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlRWxlbWVudEluZm8uamF2YQppbmRleCBkZTU3ZTFjLi4yNzkzYTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlRWxlbWVudEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwyMyArMTksMjYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKIAotLyoqIAotICogRWxlbWVudCBpbmZvIGZvciBhbiBJVHlwZSBlbGVtZW50IHRoYXQgb3JpZ2luYXRlZCBmcm9tIHNvdXJjZS4gCisvKioKKyAqIEVsZW1lbnQgaW5mbyBmb3IgYW4gSVR5cGUgZWxlbWVudCB0aGF0IG9yaWdpbmF0ZWQgZnJvbSBzb3VyY2UuCiAgKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlRWxlbWVudEluZm8gZXh0ZW5kcyBNZW1iZXJFbGVtZW50SW5mbyBpbXBsZW1lbnRzIElTb3VyY2VUeXBlIHsKK3B1YmxpYyBjbGFzcyBTb3VyY2VUeXBlRWxlbWVudEluZm8gZXh0ZW5kcyBBbm5vdGF0YWJsZUluZm8gaW1wbGVtZW50cyBJU291cmNlVHlwZSB7CiAKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTb3VyY2VJbXBvcnRbXSBOT19JTVBPUlRTID0gbmV3IElTb3VyY2VJbXBvcnRbMF07CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbml0aWFsaXplckVsZW1lbnRJbmZvW10gTk9fSU5JVElBTElaRVJTID0gbmV3IEluaXRpYWxpemVyRWxlbWVudEluZm9bMF07CiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTb3VyY2VGaWVsZFtdIE5PX0ZJRUxEUyA9IG5ldyBTb3VyY2VGaWVsZFswXTsKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNvdXJjZU1ldGhvZFtdIE5PX01FVEhPRFMgPSBuZXcgU291cmNlTWV0aG9kWzBdOwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU291cmNlVHlwZVtdIE5PX1RZUEVTID0gbmV3IFNvdXJjZVR5cGVbMF07CisKKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBKYXZhRWxlbWVudC5OT19FTEVNRU5UUzsKKwkKIAkvKioKIAkgKiBUaGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBmb3IgdGhpcyB0eXBlLiBUaGlzIG5hbWUKIAkgKiBpcyBmdWxseSBxdWFsaWZpZWQgZm9yIGJpbmFyeSB0eXBlcyBhbmQgaXMgTk9UCiAJICogZnVsbHkgcXVhbGlmaWVkIGZvciBzb3VyY2UgdHlwZXMuCiAJICovCiAJcHJvdGVjdGVkIGNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKLQkKKwogCS8qKgogCSAqIFRoZSBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGlzIHR5cGUgaW1wbGVtZW50cyBvcgogCSAqIGV4dGVuZHMuIFRoZXNlIG5hbWVzIGFyZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGNhc2UKQEAgLTQzLDIzICs0NiwyMyBAQAogCSAqIGNhc2Ugb2YgYSBzb3VyY2UgdHlwZQogCSAqLwogCXByb3RlY3RlZCBjaGFyW11bXSBzdXBlckludGVyZmFjZU5hbWVzOwotCQorCiAJLyoqCiAJICogQmFja3BvaW50ZXIgdG8gbXkgdHlwZSBoYW5kbGUgLSB1c2VmdWwgZm9yIHRyYW5zbGF0aW9uCiAJICogZnJvbSBpbmZvIHRvIGhhbmRsZS4KIAkgKi8KIAlwcm90ZWN0ZWQgSVR5cGUgaGFuZGxlID0gbnVsbDsKLQkKKwogCS8qCiAJICogVGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGlzIHNvdXJjZSB0eXBlLiBFbXB0eSBpZiBub25lLgogCSAqLwogCXByb3RlY3RlZCBJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gVHlwZVBhcmFtZXRlci5OT19UWVBFX1BBUkFNRVRFUlM7Ci0JCisKIAkvKgogCSAqIEEgbWFwIGZyb20gYW4gSUphdmFFbGVtZW50ICh0aGlzIHR5cGUgb3IgYSBjaGlsZCBvZiB0aGlzIHR5cGUpIHRvIGEgU3RyaW5nW10gKHRoZSBjYXRlZ29yaWVzIG9mIHRoaXMgZWxlbWVudCkKIAkgKi8KIAlwcm90ZWN0ZWQgSGFzaE1hcCBjYXRlZ29yaWVzOwotCQorCiBwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yaWVzKElKYXZhRWxlbWVudCBlbGVtZW50LCBjaGFyW11bXSBlbGVtZW50Q2F0ZWdvcmllcykgewogCWlmIChlbGVtZW50Q2F0ZWdvcmllcyA9PSBudWxsKSByZXR1cm47CiAJaWYgKHRoaXMuY2F0ZWdvcmllcyA9PSBudWxsKQpAQCAtNzQsNiArNzcsMTAgQEAKIAlyZXR1cm4gdGhpcy5jYXRlZ29yaWVzOwogfQogCitwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7CisJcmV0dXJuIHRoaXMuY2hpbGRyZW47Cit9CisKIC8qKgogICogUmV0dXJucyB0aGUgSVNvdXJjZVR5cGUgdGhhdCBpcyB0aGUgZW5jbG9zaW5nIHR5cGUgZm9yIHRoaXMKICAqIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdHlwZSBpcyBhIHRvcCBsZXZlbCB0eXBlLgpAQCAtMjQ0LDExICsyNTEsMTEgQEAKICAqLwogcHVibGljIGNoYXJbXSBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKIAlpZiAodGhpcy5oYW5kbGUuZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7IC8vIGlmIGFub255bW91cyB0eXBlCi0JCWNoYXJbXVtdIGludGVyZmFjZU5hbWVzID0gdGhpcy5zdXBlckludGVyZmFjZU5hbWVzOwkKKwkJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSB0aGlzLnN1cGVySW50ZXJmYWNlTmFtZXM7CiAJCWlmIChpbnRlcmZhY2VOYW1lcyAhPSBudWxsICYmIGludGVyZmFjZU5hbWVzLmxlbmd0aCA+IDApIHsKIAkJCXJldHVybiBpbnRlcmZhY2VOYW1lc1swXTsKIAkJfQotCX0gCisJfQogCXJldHVybiB0aGlzLnN1cGVyY2xhc3NOYW1lOwogfQogcHVibGljIGNoYXJbXVtdW10gZ2V0VHlwZVBhcmFtZXRlckJvdW5kcygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVQYXJhbWV0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVQYXJhbWV0ZXIuamF2YQppbmRleCAyZmFjMDA4Li5kYWRlMzRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlUGFyYW1ldGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVBhcmFtZXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDIxICsxMCwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBUeXBlUGFyYW1ldGVyIGV4dGVuZHMgU291cmNlUmVmRWxlbWVudCBpbXBsZW1lbnRzIElUeXBlUGFyYW1ldGVyIHsKIAogCXN0YXRpYyBmaW5hbCBJVHlwZVBhcmFtZXRlcltdIE5PX1RZUEVfUEFSQU1FVEVSUyA9IG5ldyBJVHlwZVBhcmFtZXRlclswXTsKLQkKKwogCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkKKwogCXB1YmxpYyBUeXBlUGFyYW1ldGVyKEphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIocGFyZW50KTsKIAkJdGhpcy5uYW1lID0gbmFtZTsKQEAgLTM1LDIzICsyOSw0MSBAQAogCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwogCX0KIAotCS8qCi0JICogQHNlZSBKYXZhRWxlbWVudCNnZW5lcmF0ZUluZm9zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVJbmZvcyhPYmplY3QgaW5mbywgSGFzaE1hcCBuZXdFbGVtZW50cywgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCU9wZW5hYmxlIG9wZW5hYmxlUGFyZW50ID0gKE9wZW5hYmxlKWdldE9wZW5hYmxlUGFyZW50KCk7Ci0JCWlmIChKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKG9wZW5hYmxlUGFyZW50KSA9PSBudWxsKSB7Ci0JCQlvcGVuYWJsZVBhcmVudC5nZW5lcmF0ZUluZm9zKG9wZW5hYmxlUGFyZW50LmNyZWF0ZUVsZW1lbnRJbmZvKCksIG5ld0VsZW1lbnRzLCBwbSk7Ci0JCX0KLQl9CQotCQogCXB1YmxpYyBTdHJpbmdbXSBnZXRCb3VuZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJVHlwZVBhcmFtZXRlckVsZW1lbnRJbmZvIGluZm8gPSAoVHlwZVBhcmFtZXRlckVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOwogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoaW5mby5ib3VuZHMpOwogCX0KLQorCQorCXB1YmxpYyBTdHJpbmdbXSBnZXRCb3VuZHNTaWduYXR1cmVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQlTdHJpbmdbXSBib3VuZFNpZ25hdHVyZXMgPSBudWxsOworCQlUeXBlUGFyYW1ldGVyRWxlbWVudEluZm8gaW5mbyA9IChUeXBlUGFyYW1ldGVyRWxlbWVudEluZm8pIHRoaXMuZ2V0RWxlbWVudEluZm8oKTsKKwkJCisJCS8vIEZvciBhIGJpbmFyeSB0eXBlIG9yIG1ldGhvZCwgdGhlIHNpZ25hdHVyZSBpcyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIHRoZSAuY2xhc3MgZmlsZS4KKwkJLy8gTm8gbmVlZCB0byBjb25zdHJ1Y3QgYWdhaW4KKwkJaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgQmluYXJ5TWVtYmVyKSB7CisJCQljaGFyW11bXSBib3VuZHNTaWduYXR1cmVzID0gaW5mby5ib3VuZHNTaWduYXR1cmVzOworCQkJaWYgKGJvdW5kc1NpZ25hdHVyZXMgPT0gbnVsbCB8fCBib3VuZHNTaWduYXR1cmVzLmxlbmd0aCA9PSAwKSB7CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsJCisJCQl9CisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoaW5mby5ib3VuZHNTaWduYXR1cmVzKTsKKwkJfQorCQkKKwkJY2hhcltdW10gYm91bmRzID0gaW5mby5ib3VuZHM7CisJCWlmIChib3VuZHMgPT0gbnVsbCB8fCBib3VuZHMubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CisJCX0KKwkKKwkJaW50IGJvdW5kc0xlbmd0aCA9IGJvdW5kcy5sZW5ndGg7CisJCWJvdW5kU2lnbmF0dXJlcyA9IG5ldyBTdHJpbmdbYm91bmRzTGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHNMZW5ndGg7IGkrKykgeworCQkJYm91bmRTaWduYXR1cmVzW2ldID0gbmV3IFN0cmluZyhTaWduYXR1cmUuY3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZShib3VuZHNbaV0sIGZhbHNlKSk7CisJCX0KKwkJcmV0dXJuIGJvdW5kU2lnbmF0dXJlczsKKwl9CisJCiAJcHVibGljIElNZW1iZXIgZ2V0RGVjbGFyaW5nTWVtYmVyKCkgewotCQkJcmV0dXJuIChJTWVtYmVyKSBnZXRQYXJlbnQoKTsKKwkJcmV0dXJuIChJTWVtYmVyKSBnZXRQYXJlbnQoKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewpAQCAtNjUsNyArNzcsNyBAQAogCXByb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7CiAJCXJldHVybiBKYXZhRWxlbWVudC5KRU1fVFlQRV9QQVJBTUVURVI7CiAJfQotCQorCiAJcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU291cmNlTWFwcGVyIG1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7CiAJCWlmIChtYXBwZXIgIT0gbnVsbCkgewpAQCAtOTksNiArMTExLDE0IEBACiAJcHVibGljIElDbGFzc0ZpbGUgZ2V0Q2xhc3NGaWxlKCkgewogCQlyZXR1cm4gKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0Q2xhc3NGaWxlKCk7CiAJfQorCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKiBAc2luY2UgMy43CisJICovCisJcHVibGljIElUeXBlUm9vdCBnZXRUeXBlUm9vdCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0VHlwZVJvb3QoKTsKKwl9CiAKIAlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ05hbWUoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogCQlidWZmZXIuYXBwZW5kKCc8Jyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlUGFyYW1ldGVyRWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVQYXJhbWV0ZXJFbGVtZW50SW5mby5qYXZhCmluZGV4IDI4YWZmYzQuLjQwMWJhMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVQYXJhbWV0ZXJFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVQYXJhbWV0ZXJFbGVtZW50SW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDcgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIHB1YmxpYyBjbGFzcyBUeXBlUGFyYW1ldGVyRWxlbWVudEluZm8gZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50SW5mbyB7Ci0JCisKIAkvKgogCSAqIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyJ3MgbmFtZSBpbiB0aGUgaXRzCiAJICogb3BlbmFibGUncyBidWZmZXIuCkBAIC0yOCw0ICsyOCw5IEBACiAJICogVGhlIGJvdW5kcyBuYW1lcyBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyLgogCSAqLwogCXB1YmxpYyBjaGFyW11bXSBib3VuZHM7CisJCisJLyoKKwkgKiBUaGUgYm91bmRzJyBzaWduYXR1cmVzIGZvciB0aGlzIHR5cGUgcGFyYW1ldGVyLiAKKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gYm91bmRzU2lnbmF0dXJlczsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVWZWN0b3IuamF2YQppbmRleCAyZGI2NWRiLi4xYzg3MWJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlVmVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDQ2ICsxNCw0NiBAQAogCiBwdWJsaWMgZmluYWwgY2xhc3MgVHlwZVZlY3RvciB7CiAJc3RhdGljIGludCBJTklUSUFMX1NJWkUgPSAxMDsKLQkKKwogCXB1YmxpYyBpbnQgc2l6ZTsKIAlpbnQgbWF4U2l6ZTsKIAlJVHlwZVtdIGVsZW1lbnRzOwotCQorCiAJcHVibGljIGZpbmFsIHN0YXRpYyBJVHlwZVtdIE5vRWxlbWVudHMgPSBuZXcgSVR5cGVbMF07Ci0JCisKIHB1YmxpYyBUeXBlVmVjdG9yKCkgewotCW1heFNpemUgPSBJTklUSUFMX1NJWkU7Ci0Jc2l6ZSA9IDA7Ci0JZWxlbWVudHMgPSBuZXcgSVR5cGVbbWF4U2l6ZV07CisJdGhpcy5tYXhTaXplID0gSU5JVElBTF9TSVpFOworCXRoaXMuc2l6ZSA9IDA7CisJdGhpcy5lbGVtZW50cyA9IG5ldyBJVHlwZVt0aGlzLm1heFNpemVdOwogfQogcHVibGljIFR5cGVWZWN0b3IoSVR5cGVbXSB0eXBlcykgewotCXRoaXMuc2l6ZSA9IHR5cGVzLmxlbmd0aDsgCisJdGhpcy5zaXplID0gdHlwZXMubGVuZ3RoOwogCXRoaXMubWF4U2l6ZSA9IHRoaXMuc2l6ZSArIDE7IC8vIHdoZW4gYW4gZWxlbWVudCBpcyBhZGRlZCwgaXQgYXNzdW1lcyB0aGF0IHRoZSBsZW5ndGggaXMgPiAwCi0JZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplXTsKLQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCBlbGVtZW50cywgMCwgdGhpcy5zaXplKTsJCisJdGhpcy5lbGVtZW50cyA9IG5ldyBJVHlwZVt0aGlzLm1heFNpemVdOworCVN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIHRoaXMuZWxlbWVudHMsIDAsIHRoaXMuc2l6ZSk7CiB9CiBwdWJsaWMgVHlwZVZlY3RvcihJVHlwZSB0eXBlKSB7CiAJdGhpcy5tYXhTaXplID0gSU5JVElBTF9TSVpFOwogCXRoaXMuc2l6ZSA9IDE7Ci0JZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplXTsKLQllbGVtZW50c1swXSA9IHR5cGU7CisJdGhpcy5lbGVtZW50cyA9IG5ldyBJVHlwZVt0aGlzLm1heFNpemVdOworCXRoaXMuZWxlbWVudHNbMF0gPSB0eXBlOwogfQogcHVibGljIHZvaWQgYWRkKElUeXBlIG5ld0VsZW1lbnQpIHsKLQlpZiAoc2l6ZSA9PSBtYXhTaXplKQkvLyBrbm93cyB0aGF0IHNpemUgc3RhcnRzIDw9IG1heFNpemUKLQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgKGVsZW1lbnRzID0gbmV3IElUeXBlW21heFNpemUgKj0gMl0pLCAwLCBzaXplKTsKLQllbGVtZW50c1tzaXplKytdID0gbmV3RWxlbWVudDsKKwlpZiAodGhpcy5zaXplID09IHRoaXMubWF4U2l6ZSkJLy8ga25vd3MgdGhhdCBzaXplIHN0YXJ0cyA8PSBtYXhTaXplCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplICo9IDJdKSwgMCwgdGhpcy5zaXplKTsKKwl0aGlzLmVsZW1lbnRzW3RoaXMuc2l6ZSsrXSA9IG5ld0VsZW1lbnQ7CiB9CiBwdWJsaWMgdm9pZCBhZGRBbGwoSVR5cGVbXSBuZXdFbGVtZW50cykgewotCWlmIChzaXplICsgbmV3RWxlbWVudHMubGVuZ3RoID49IG1heFNpemUpIHsKLQkJbWF4U2l6ZSA9IHNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGg7CS8vIGFzc3VtZSBubyBtb3JlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKLQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgKGVsZW1lbnRzID0gbmV3IElUeXBlW21heFNpemVdKSwgMCwgc2l6ZSk7CisJaWYgKHRoaXMuc2l6ZSArIG5ld0VsZW1lbnRzLmxlbmd0aCA+PSB0aGlzLm1heFNpemUpIHsKKwkJdGhpcy5tYXhTaXplID0gdGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOwkvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplXSksIDAsIHRoaXMuc2l6ZSk7CiAJfQotCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIGVsZW1lbnRzLCBzaXplLCBuZXdFbGVtZW50cy5sZW5ndGgpOwotCXNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOworCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIHRoaXMuZWxlbWVudHMsIHRoaXMuc2l6ZSwgbmV3RWxlbWVudHMubGVuZ3RoKTsKKwl0aGlzLnNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOwogfQogcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVR5cGUgZWxlbWVudCkgewotCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCi0JCWlmIChlbGVtZW50LmVxdWFscyhlbGVtZW50c1tpXSkpCisJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQlpZiAoZWxlbWVudC5lcXVhbHModGhpcy5lbGVtZW50c1tpXSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC02Niw0NiArNjYsNDYgQEAKIAlyZXR1cm4gY2xvbmU7CiB9CiBwdWJsaWMgSVR5cGUgZWxlbWVudEF0KGludCBpbmRleCkgewotCXJldHVybiBlbGVtZW50c1tpbmRleF07CisJcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdOwogfQogcHVibGljIElUeXBlW10gZWxlbWVudHMoKSB7Ci0JCisKIAkvLyBkbyBub3QgcmVzaXplIHRvIDAgaWYgZW1wdHkgc2luY2UgbWF5IGFkZCBtb3JlIGVsZW1lbnRzIGxhdGVyCiAJaWYgKHRoaXMuc2l6ZSA9PSAwKSByZXR1cm4gTm9FbGVtZW50czsKLQkKKwogCWlmICh0aGlzLnNpemUgPCB0aGlzLm1heFNpemUpIHsKLQkJbWF4U2l6ZSA9IHNpemU7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgSVR5cGVbbWF4U2l6ZV0pLCAwLCBzaXplKTsKKwkJdGhpcy5tYXhTaXplID0gdGhpcy5zaXplOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IElUeXBlW3RoaXMubWF4U2l6ZV0pLCAwLCB0aGlzLnNpemUpOwogCX0KIAlyZXR1cm4gdGhpcy5lbGVtZW50czsKIH0KIHB1YmxpYyBJVHlwZSBmaW5kKElUeXBlIGVsZW1lbnQpIHsKLQlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KQotCQlpZiAoZWxlbWVudCA9PSBlbGVtZW50c1tpXSkKLQkJCXJldHVybiBlbGVtZW50c1tpXTsKKwlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCisJCWlmIChlbGVtZW50ID09IHRoaXMuZWxlbWVudHNbaV0pCisJCQlyZXR1cm4gdGhpcy5lbGVtZW50c1tpXTsKIAlyZXR1cm4gbnVsbDsKIH0KIHB1YmxpYyBJVHlwZSByZW1vdmUoSVR5cGUgZWxlbWVudCkgewogCS8vIGFzc3VtZXMgb25seSBvbmUgb2NjdXJyZW5jZSBvZiB0aGUgZWxlbWVudCBleGlzdHMKLQlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KQotCQlpZiAoZWxlbWVudCA9PSBlbGVtZW50c1tpXSkgeworCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKKwkJaWYgKGVsZW1lbnQgPT0gdGhpcy5lbGVtZW50c1tpXSkgewogCQkJLy8gc2hpZnQgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBkb3duIG9uZSBzcG90Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCBpICsgMSwgZWxlbWVudHMsIGksIC0tc2l6ZSAtIGkpOwotCQkJZWxlbWVudHNbc2l6ZV0gPSBudWxsOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCBpICsgMSwgdGhpcy5lbGVtZW50cywgaSwgLS10aGlzLnNpemUgLSBpKTsKKwkJCXRoaXMuZWxlbWVudHNbdGhpcy5zaXplXSA9IG51bGw7CiAJCQlyZXR1cm4gZWxlbWVudDsKIAkJfQogCXJldHVybiBudWxsOwogfQogcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCi0JCWVsZW1lbnRzW2ldID0gbnVsbDsKLQlzaXplID0gMDsKKwlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCisJCXRoaXMuZWxlbWVudHNbaV0gPSBudWxsOworCXRoaXMuc2l6ZSA9IDA7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7IC8vJE5PTi1OTFMtMSQKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zaXplOyBpKyspIHsKIAkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRzW2ldKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmVsZW1lbnRzW2ldKTsKIAl9CiAJYnVmZmVyLmFwcGVuZCgiXG5dIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Vc2VyTGlicmFyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnkuamF2YQppbmRleCBiZjQzYmYzLi5iZDk0YTVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Vc2VyTGlicmFyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1VzZXJMaWJyYXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzksNyArMzksOCBAQAogICovCiBwdWJsaWMgY2xhc3MgVXNlckxpYnJhcnkgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVkVSU0lPTj0gIjEiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fT05FID0gIjEiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVkVSU0lPTj0gIjIiOyAvLyROT04tTkxTLTEkCiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1ZFUlNJT049ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFUkxJQlJBUlk9ICJ1c2VybGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKQEAgLTQ4LDcgKzQ5LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBVEg9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVJDSElWRT0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TWVNURU1MSUJSQVJZPSAic3lzdGVtbGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpYnJhcnk7CiAJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzOwogCkBAIC01NywxMSArNTgsMTEgQEAKIAkJdGhpcy5lbnRyaWVzPSBlbnRyaWVzOwogCQl0aGlzLmlzU3lzdGVtTGlicmFyeT0gaXNTeXN0ZW1MaWJyYXJ5OwogCX0KLQkKKwogCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRFbnRyaWVzKCkgewogCQlyZXR1cm4gdGhpcy5lbnRyaWVzOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtTGlicmFyeSgpIHsKIAkJcmV0dXJuIHRoaXMuaXNTeXN0ZW1MaWJyYXJ5OwogCX0KQEAgLTgzLDcgKzg0LDcgQEAKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCiAJICovCkBAIC05NywyOCArOTgsMjggQEAKIAkJfQogCQlyZXR1cm4gaGFzaENvZGU7CiAJfQotCQorCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIGJvb2xlYW4gaXNTeXN0ZW1MaWJyYXJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAogCQlYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcih3cml0ZXIsIG51bGwvKnVzZSB0aGUgd29ya3NwYWNlIGxpbmUgZGVsaW1pdGVyKi8sIHRydWUvKnByaW50IFhNTCB2ZXJzaW9uKi8pOwotCQkKKwogCQlIYXNoTWFwIGxpYnJhcnkgPSBuZXcgSGFzaE1hcCgpOwogCQlsaWJyYXJ5LnB1dChUQUdfVkVSU0lPTiwgU3RyaW5nLnZhbHVlT2YoQ1VSUkVOVF9WRVJTSU9OKSk7CiAJCWxpYnJhcnkucHV0KFRBR19TWVNURU1MSUJSQVJZLCBTdHJpbmcudmFsdWVPZihpc1N5c3RlbUxpYnJhcnkpKTsKIAkJeG1sV3JpdGVyLnByaW50VGFnKFRBR19VU0VSTElCUkFSWSwgbGlicmFyeSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQkKKwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkgewogCQkJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgZW50cmllc1tpXTsKLQkJCisKIAkJCUhhc2hNYXAgYXJjaGl2ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlhcmNoaXZlLnB1dChUQUdfUEFUSCwgY3BFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7CisJCQlhcmNoaXZlLnB1dChUQUdfUEFUSCwgY3BFbnRyeS5nZXRQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKIAkJCUlQYXRoIHNvdXJjZUF0dGFjaD0gY3BFbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwogCQkJaWYgKHNvdXJjZUF0dGFjaCAhPSBudWxsKQotCQkJCWFyY2hpdmUucHV0KFRBR19TT1VSQ0VBVFRBQ0hNRU5ULCBzb3VyY2VBdHRhY2gpOworCQkJCWFyY2hpdmUucHV0KFRBR19TT1VSQ0VBVFRBQ0hNRU5ULCBzb3VyY2VBdHRhY2gudG9Qb3J0YWJsZVN0cmluZygpKTsKIAkJCUlQYXRoIHNvdXJjZUF0dGFjaFJvb3Q9IGNwRW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7CiAJCQlpZiAoc291cmNlQXR0YWNoUm9vdCAhPSBudWxsKQotCQkJCWFyY2hpdmUucHV0KFRBR19TT1VSQ0VBVFRBQ0hNRU5UUk9PVCwgc291cmNlQXR0YWNoUm9vdCk7CQkJCQorCQkJCWFyY2hpdmUucHV0KFRBR19TT1VSQ0VBVFRBQ0hNRU5UUk9PVCwgc291cmNlQXR0YWNoUm9vdC50b1BvcnRhYmxlU3RyaW5nKCkpOwogCiAJCQlib29sZWFuIGhhc0V4dHJhQXR0cmlidXRlcyA9IGNwRW50cnkuZXh0cmFBdHRyaWJ1dGVzICE9IG51bGwgJiYgY3BFbnRyeS5leHRyYUF0dHJpYnV0ZXMubGVuZ3RoICE9IDA7CiAJCQlib29sZWFuIGhhc1Jlc3RyaWN0aW9ucyA9IGNwRW50cnkuZ2V0QWNjZXNzUnVsZVNldCgpICE9IG51bGw7IC8vIGFjY2VzcyBydWxlIHNldCBpcyBudWxsIGlmIG5vIGFjY2VzcyBydWxlcwpAQCAtMTM4LDY0ICsxMzksNzYgQEAKIAkJCWlmIChoYXNFeHRyYUF0dHJpYnV0ZXMgfHwgaGFzUmVzdHJpY3Rpb25zKSB7CiAJCQkJeG1sV3JpdGVyLmVuZFRhZyhUQUdfQVJDSElWRSwgdHJ1ZS8qaW5zZXJ0IHRhYiovLCB0cnVlLyppbnNlcnQgbmV3IGxpbmUqLyk7CiAJCQl9Ci0JCX0JCisJCX0KIAkJeG1sV3JpdGVyLmVuZFRhZyhUQUdfVVNFUkxJQlJBUlksIHRydWUvKmluc2VydCB0YWIqLywgdHJ1ZS8qaW5zZXJ0IG5ldyBsaW5lKi8pOwogCQl3cml0ZXIuZmx1c2goKTsKIAkJd3JpdGVyLmNsb3NlKCk7CiAJCXJldHVybiBzLnRvU3RyaW5nKCJVVEY4Iik7Ly8kTk9OLU5MUy0xJAogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgVXNlckxpYnJhcnkgY3JlYXRlRnJvbVN0cmluZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlFbGVtZW50IGNwRWxlbWVudDsKIAkJdHJ5IHsKIAkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CiAJCQljcEVsZW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpLmdldERvY3VtZW50RWxlbWVudCgpOwogCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmZpbGVfYmFkRm9ybWF0KTsgCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZmlsZV9iYWRGb3JtYXQpOwogCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5maWxlX2JhZEZvcm1hdCk7IAorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmZpbGVfYmFkRm9ybWF0KTsKIAkJfSBmaW5hbGx5IHsKIAkJCXJlYWRlci5jbG9zZSgpOwogCQl9Ci0JCQorCiAJCWlmICghY3BFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShUQUdfVVNFUkxJQlJBUlkpKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZmlsZV9iYWRGb3JtYXQpOyAKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5maWxlX2JhZEZvcm1hdCk7CiAJCX0KLQkJLy8gU3RyaW5nIHZlcnNpb249IGNwRWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1ZFUlNJT04pOwotCQkvLyBpbiBjYXNlIHdlIHVwZGF0ZSB0aGUgZm9ybWF0OiBhZGQgY29kZSB0byByZWFkIG9sZGVyIHZlcnNpb25zCi0JCQorCQlTdHJpbmcgdmVyc2lvbj0gY3BFbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfVkVSU0lPTik7CiAJCWJvb2xlYW4gaXNTeXN0ZW09IEJvb2xlYW4udmFsdWVPZihjcEVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19TWVNURU1MSUJSQVJZKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQorCiAJCU5vZGVMaXN0IGxpc3Q9IGNwRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CiAJCWludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotCQkKKwogCQlBcnJheUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KGxlbmd0aCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKIAkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCQorCiAJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAJCQkJRWxlbWVudCBlbGVtZW50PSAoRWxlbWVudCkgbm9kZTsKIAkJCQlpZiAoZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscyhUQUdfQVJDSElWRSkpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfUEFUSCk7Ci0JCQkJCUlQYXRoIHNvdXJjZUF0dGFjaD0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoVEFHX1NPVVJDRUFUVEFDSE1FTlQpID8gbmV3IFBhdGgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1NPVVJDRUFUVEFDSE1FTlQpKSA6IG51bGw7Ci0JCQkJCUlQYXRoIHNvdXJjZUF0dGFjaFJvb3Q9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFRBR19TT1VSQ0VBVFRBQ0hNRU5UUk9PVCkgPyBuZXcgUGF0aChlbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfU09VUkNFQVRUQUNITUVOVFJPT1QpKSA6IG51bGw7CisJCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1BBVEgpOworCQkJCQlTdHJpbmcgc291cmNlQXR0YWNoU3RyaW5nID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoVEFHX1NPVVJDRUFUVEFDSE1FTlQpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1NPVVJDRUFUVEFDSE1FTlQpIDogbnVsbDsKKwkJCQkJU3RyaW5nIHNvdXJjZUF0dGFjaFJvb3RTdHJpbmcgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShUQUdfU09VUkNFQVRUQUNITUVOVFJPT1QpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX1NPVVJDRUFUVEFDSE1FTlRST09UKSA6IG51bGw7CisJCQkJCUlQYXRoIGVudHJ5UGF0aCA9IG51bGw7IAorCQkJCQlJUGF0aCBzb3VyY2VBdHRhY2hQYXRoID0gbnVsbDsKKwkJCQkJSVBhdGggc291cmNlQXR0YWNoUm9vdFBhdGggPSBudWxsOworCQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoVkVSU0lPTl9PTkUpKSB7CisJCQkJCQllbnRyeVBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoU3RyaW5nKTsKKwkJCQkJCWlmIChzb3VyY2VBdHRhY2hTdHJpbmcgIT0gbnVsbCkgc291cmNlQXR0YWNoUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHNvdXJjZUF0dGFjaFN0cmluZyk7CisJCQkJCQlpZiAoc291cmNlQXR0YWNoUm9vdFN0cmluZyAhPSBudWxsKSBzb3VyY2VBdHRhY2hSb290UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHNvdXJjZUF0dGFjaFJvb3RTdHJpbmcpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJZW50cnlQYXRoID0gUGF0aC5mcm9tUG9ydGFibGVTdHJpbmcocGF0aFN0cmluZyk7CisJCQkJCQlpZiAoc291cmNlQXR0YWNoU3RyaW5nICE9IG51bGwpIHNvdXJjZUF0dGFjaFBhdGggPSBQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhzb3VyY2VBdHRhY2hTdHJpbmcpOworCQkJCQkJaWYgKHNvdXJjZUF0dGFjaFJvb3RTdHJpbmcgIT0gbnVsbCkgc291cmNlQXR0YWNoUm9vdFBhdGggPSBQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhzb3VyY2VBdHRhY2hSb290U3RyaW5nKTsKKwkJCQkJfQorCiAJCQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJvb2xlYW5bXSBmb3VuZENoaWxkcmVuID0gbmV3IGJvb2xlYW5bY2hpbGRyZW4uZ2V0TGVuZ3RoKCldOwogCQkJCQlOb2RlTGlzdCBhdHRyaWJ1dGVMaXN0ID0gQ2xhc3NwYXRoRW50cnkuZ2V0Q2hpbGRBdHRyaWJ1dGVzKENsYXNzcGF0aEVudHJ5LlRBR19BVFRSSUJVVEVTLCBjaGlsZHJlbiwgZm91bmRDaGlsZHJlbik7CiAJCQkJCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMgPSBDbGFzc3BhdGhFbnRyeS5kZWNvZGVFeHRyYUF0dHJpYnV0ZXMoYXR0cmlidXRlTGlzdCk7CiAJCQkJCWF0dHJpYnV0ZUxpc3QgPSBDbGFzc3BhdGhFbnRyeS5nZXRDaGlsZEF0dHJpYnV0ZXMoQ2xhc3NwYXRoRW50cnkuVEFHX0FDQ0VTU19SVUxFUywgY2hpbGRyZW4sIGZvdW5kQ2hpbGRyZW4pOwogCQkJCQlJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzID0gQ2xhc3NwYXRoRW50cnkuZGVjb2RlQWNjZXNzUnVsZXMoYXR0cmlidXRlTGlzdCk7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwYXRoKSwgc291cmNlQXR0YWNoLCBzb3VyY2VBdHRhY2hSb290LCBhY2Nlc3NSdWxlcywgZXh0cmFBdHRyaWJ1dGVzLCBmYWxzZS8qbm90IGV4cG9ydGVkKi8pOworCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZW50cnlQYXRoLCBzb3VyY2VBdHRhY2hQYXRoLCBzb3VyY2VBdHRhY2hSb290UGF0aCwgYWNjZXNzUnVsZXMsIGV4dHJhQXR0cmlidXRlcywgZmFsc2UvKm5vdCBleHBvcnRlZCovKTsKIAkJCQkJcmVzLmFkZChlbnRyeSk7CiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM9IChJQ2xhc3NwYXRoRW50cnlbXSkgcmVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtyZXMuc2l6ZSgpXSk7Ci0JCQorCiAJCXJldHVybiBuZXcgVXNlckxpYnJhcnkoZW50cmllcywgaXNTeXN0ZW0pOwogCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmICh0aGlzLmVudHJpZXMgPT0gbnVsbCkKIAkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1VzZXJMaWJyYXJ5Q2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Vc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmluZGV4IGMwMjMxMGUuLjk1YmE2NmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1VzZXJMaWJyYXJ5Q2xhc3NwYXRoQ29udGFpbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSwxMyArMjEsMTMgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBVc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lciBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXIgewotCQorCiAJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKKwogCXB1YmxpYyBVc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lcihTdHJpbmcgbmFtZSkgewogCQl0aGlzLm5hbWUgPSBuYW1lOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0Q2xhc3NwYXRoRW50cmllcygpCiAJICovCkBAIC02MywxMCArNjMsMTAgQEAKIAlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKIAkJcmV0dXJuIG5ldyBQYXRoKEphdmFDb3JlLlVTRVJfTElCUkFSWV9DT05UQUlORVJfSUQpLmFwcGVuZCh0aGlzLm5hbWUpOwogCX0KLQkKKwogCXByaXZhdGUgVXNlckxpYnJhcnkgZ2V0VXNlckxpYnJhcnkoKSB7CiAJCVVzZXJMaWJyYXJ5IHVzZXJMaWJyYXJ5ID0gSmF2YU1vZGVsTWFuYWdlci5nZXRVc2VyTGlicmFyeU1hbmFnZXIoKS5nZXRVc2VyTGlicmFyeSh0aGlzLm5hbWUpOwotCQlpZiAodXNlckxpYnJhcnkgPT0gbnVsbCAmJiBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgeworCQlpZiAodXNlckxpYnJhcnkgPT0gbnVsbCAmJiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UgfHwgSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkpIHsKIAkJCXZlcmJvc2Vfbm9fdXNlcl9saWJyYXJ5X2ZvdW5kKHRoaXMubmFtZSk7CiAJCX0KIAkJcmV0dXJuIHVzZXJMaWJyYXJ5OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCmluZGV4IDFiMDIyNjAuLjQ3NDA3N2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1VzZXJMaWJyYXJ5Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Vc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzYsNyArMzYsNyBAQAogCXB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyaXNvbklEKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CiAJCXJldHVybiBjb250YWluZXJQYXRoOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCiAJICovCkBAIC01NCwxOCArNTQsMTggQEAKIAkJCWlmICh1c2VyTGlicmFyeSAhPSBudWxsKSB7CiAJCQkJVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFVzZXJMaWJyYXJ5Q2xhc3NwYXRoQ29udGFpbmVyKHVzZXJMaWJOYW1lKTsKIAkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgcHJvamVjdCB9LCBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgY29udGFpbmVyIH0sIG51bGwpOwotCQkJfSBlbHNlIGlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgeworCQkJfSBlbHNlIGlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSB8fCBKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRV9GQUlMVVJFKSB7CiAJCQkJdmVyYm9zZV9ub191c2VyX2xpYnJhcnlfZm91bmQocHJvamVjdCwgdXNlckxpYk5hbWUpOwogCQkJfQotCQl9IGVsc2UgaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKSB7CisJCX0gZWxzZSBpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UgfHwgSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0VfRkFJTFVSRSkgewogCQkJdmVyYm9zZV9ub3RfYV91c2VyX2xpYnJhcnkocHJvamVjdCwgY29udGFpbmVyUGF0aCk7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gaXNVc2VyTGlicmFyeUNvbnRhaW5lcihJUGF0aCBwYXRoKSB7CiAJCXJldHVybiBwYXRoICE9IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA9PSAyICYmIEphdmFDb3JlLlVTRVJfTElCUkFSWV9DT05UQUlORVJfSUQuZXF1YWxzKHBhdGguc2VnbWVudCgwKSk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyKQogCSAqLwpAQCAtODcsNyArODcsNyBAQAogCQkJIglwcm9qZWN0OiAiICsgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpICsgJ1xuJyArIC8vJE5PTi1OTFMtMSQKIAkJCSIJdXNlckxpYnJhcnlOYW1lOiAiICsgdXNlckxpYnJhcnlOYW1lKTsgLy8kTk9OLU5MUy0xJAogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB2ZXJib3NlX25vdF9hX3VzZXJfbGlicmFyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggY29udGFpbmVyUGF0aCkgewogCQlVdGlsLnZlcmJvc2UoCiAJCQkiVXNlckxpYnJhcnkgSU5JVCAtIEZBSUxFRCAobm90IGEgdXNlciBsaWJyYXJ5KVxuIiArIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1VzZXJMaWJyYXJ5TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlNYW5hZ2VyLmphdmEKaW5kZXggYTY0Y2UxNi4uYmIwZWMwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlNYW5hZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXNlckxpYnJhcnlNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzEsOCArMzEsOCBAQAogLyoqCiAgKgogICovCi1wdWJsaWMgY2xhc3MgVXNlckxpYnJhcnlNYW5hZ2VyIGltcGxlbWVudHMgSUVjbGlwc2VQcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHsKLQkKK3B1YmxpYyBjbGFzcyBVc2VyTGlicmFyeU1hbmFnZXIgeworCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1BfVVNFUkxJQlJBUllfUFJFRkVSRU5DRVNfUFJFRklYID0gSmF2YUNvcmUuUExVR0lOX0lEKyIudXNlckxpYnJhcnkuIjsgLy8kTk9OLU5MUy0xJAogCiAJcHJpdmF0ZSBNYXAgdXNlckxpYnJhcmllczsKQEAgLTQwLDIzICs0MCwyMyBAQAogCXB1YmxpYyBVc2VyTGlicmFyeU1hbmFnZXIoKSB7CiAJCWluaXRpYWxpemUoKTsKIAl9Ci0JCQorCiAJLyoKIAkgKiBHZXRzIHRoZSBsaWJyYXJ5IGZvciBhIGdpdmVuIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBsaWJyYXJ5IGV4aXN0cy4KIAkgKi8KIAlwdWJsaWMgc3luY2hyb25pemVkIFVzZXJMaWJyYXJ5IGdldFVzZXJMaWJyYXJ5KFN0cmluZyBsaWJOYW1lKSB7CiAJCXJldHVybiAoVXNlckxpYnJhcnkpIHRoaXMudXNlckxpYnJhcmllcy5nZXQobGliTmFtZSk7CiAJfQotCQorCiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgZGVmaW5lZCB1c2VyIGxpYnJhcmllcy4gVGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGNvbnRhaW5lciBwYXRoCi0JICogaXMgdGhlIG5hbWUgYXBwZW5kZWQgdG8gdGhlIENPTlRBSU5FUl9JRC4gIAorCSAqIGlzIHRoZSBuYW1lIGFwcGVuZGVkIHRvIHRoZSBDT05UQUlORVJfSUQuCiAJICovCiAJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRVc2VyTGlicmFyeU5hbWVzKCkgewogCQlTZXQgc2V0ID0gdGhpcy51c2VyTGlicmFyaWVzLmtleVNldCgpOwogCQlyZXR1cm4gKFN0cmluZ1tdKSBzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAkJdGhpcy51c2VyTGlicmFyaWVzID0gbmV3IEhhc2hNYXAoKTsKIAkJSUVjbGlwc2VQcmVmZXJlbmNlcyBpbnN0YW5jZVByZWZlcmVuY2VzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5zdGFuY2VQcmVmZXJlbmNlcygpOwpAQCAtODQsNiArODQsMTEgQEAKIAkJCQkJCWluc3RhbmNlUHJlZmVyZW5jZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7CiAJCQkJCQlwcmVmZXJlbmNlc05lZWRGbHVzaCA9IHRydWU7CiAJCQkJCQljb250aW51ZTsKKwkJCQkJfSBjYXRjaCAoQ2xhc3NwYXRoRW50cnkuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgaW5pdGlhbGl6aW5nIHVzZXIgbGlicmFyeSAiICsgbGliTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWluc3RhbmNlUHJlZmVyZW5jZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7CisJCQkJCQlwcmVmZXJlbmNlc05lZWRGbHVzaCA9IHRydWU7CisJCQkJCQljb250aW51ZTsKIAkJCQkJfQogCQkJCQl0aGlzLnVzZXJMaWJyYXJpZXMucHV0KGxpYk5hbWUsIGxpYnJhcnkpOwogCQkJCX0KQEAgLTk4LDkwICsxMDMsOTQgQEAKIAkJfQogCX0KIAotCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoSUVjbGlwc2VQcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGtleSA9IGV2ZW50LmdldEtleSgpOwotCQlpZiAoa2V5LnN0YXJ0c1dpdGgoQ1BfVVNFUkxJQlJBUllfUFJFRkVSRU5DRVNfUFJFRklYKSkgewotCQkJU3RyaW5nIGxpYk5hbWUgPSBrZXkuc3Vic3RyaW5nKENQX1VTRVJMSUJSQVJZX1BSRUZFUkVOQ0VTX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCS8vIGZpbmQgYWZmZWN0ZWQgcHJvamVjdHMKLQkJCQlJUGF0aCBjb250YWluZXJQYXRoID0gbmV3IFBhdGgoSmF2YUNvcmUuVVNFUl9MSUJSQVJZX0NPTlRBSU5FUl9JRCkuYXBwZW5kKGxpYk5hbWUpOwotCQkJCUlKYXZhUHJvamVjdFtdIGFsbEphdmFQcm9qZWN0cyA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKS5nZXRKYXZhUHJvamVjdHMoKTsKLQkJCQlBcnJheUxpc3QgYWZmZWN0ZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgYWxsSmF2YVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGFsbEphdmFQcm9qZWN0c1tpXTsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJCWZvciAoaW50IGo9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKSB7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lclBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKLQkJCQkJCQkJYWZmZWN0ZWRQcm9qZWN0cy5hZGQoamF2YVByb2plY3QpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9CQkJCQorCXB1YmxpYyB2b2lkIHVwZGF0ZVVzZXJMaWJyYXJ5KFN0cmluZyBsaWJOYW1lLCBTdHJpbmcgZW5jb2RlZFVzZXJMaWJyYXJ5KSB7CisJCXRyeSB7CisJCQkvLyBmaW5kIGFmZmVjdGVkIHByb2plY3RzCisJCQlJUGF0aCBjb250YWluZXJQYXRoID0gbmV3IFBhdGgoSmF2YUNvcmUuVVNFUl9MSUJSQVJZX0NPTlRBSU5FUl9JRCkuYXBwZW5kKGxpYk5hbWUpOworCQkJSUphdmFQcm9qZWN0W10gYWxsSmF2YVByb2plY3RzID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpLmdldEphdmFQcm9qZWN0cygpOworCQkJQXJyYXlMaXN0IGFmZmVjdGVkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgYWxsSmF2YVByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gYWxsSmF2YVByb2plY3RzW2ldOworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQkJCWZvciAoaW50IGo9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07CisJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgeworCQkJCQkJaWYgKGNvbnRhaW5lclBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKKwkJCQkJCQlhZmZlY3RlZFByb2plY3RzLmFkZChqYXZhUHJvamVjdCk7CisJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJCi0JCQkJLy8gZGVjb2RlIHVzZXIgbGlicmFyeQotCQkJCVN0cmluZyBlbmNvZGVkVXNlckxpYnJhcnkgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVVzZXJMaWJyYXJ5IHVzZXJMaWJyYXJ5ID0gZW5jb2RlZFVzZXJMaWJyYXJ5ID09IG51bGwgPyBudWxsIDogVXNlckxpYnJhcnkuY3JlYXRlRnJvbVN0cmluZyhuZXcgU3RyaW5nUmVhZGVyKGVuY29kZWRVc2VyTGlicmFyeSkpOwotCQkJCQorCQkJfQorCisJCQkvLyBkZWNvZGUgdXNlciBsaWJyYXJ5CisJCQlVc2VyTGlicmFyeSB1c2VyTGlicmFyeSA9IGVuY29kZWRVc2VyTGlicmFyeSA9PSBudWxsID8gbnVsbCA6IFVzZXJMaWJyYXJ5LmNyZWF0ZUZyb21TdHJpbmcobmV3IFN0cmluZ1JlYWRlcihlbmNvZGVkVXNlckxpYnJhcnkpKTsKKworCQkJc3luY2hyb25pemVkICh0aGlzKSB7CiAJCQkJLy8gdXBkYXRlIHVzZXIgbGlicmFyaWVzIG1hcAogCQkJCWlmICh1c2VyTGlicmFyeSAhPSBudWxsKSB7CiAJCQkJCXRoaXMudXNlckxpYnJhcmllcy5wdXQobGliTmFtZSwgdXNlckxpYnJhcnkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMudXNlckxpYnJhcmllcy5yZW1vdmUobGliTmFtZSk7CiAJCQkJfQotCQkJCQotCQkJCS8vIHVwZGF0ZSBhZmZlY3RlZCBwcm9qZWN0cwotCQkJCWludCBsZW5ndGggPSBhZmZlY3RlZFByb2plY3RzLnNpemUoKTsKLQkJCQlpZiAobGVuZ3RoID09IDApCi0JCQkJCXJldHVybjsKLQkJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJSmF2YVByb2plY3RbbGVuZ3RoXTsKLQkJCQlhZmZlY3RlZFByb2plY3RzLnRvQXJyYXkocHJvamVjdHMpOwotCQkJCUlDbGFzc3BhdGhDb250YWluZXJbXSBjb250YWluZXJzID0gbmV3IElDbGFzc3BhdGhDb250YWluZXJbbGVuZ3RoXTsKLQkJCQlpZiAodXNlckxpYnJhcnkgIT0gbnVsbCkgewotCQkJCQlVc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXIobGliTmFtZSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCWNvbnRhaW5lcnNbaV0gPSBjb250YWluZXI7Ci0JCQkJCX0KKwkJCX0KKworCQkJLy8gdXBkYXRlIGFmZmVjdGVkIHByb2plY3RzCisJCQlpbnQgbGVuZ3RoID0gYWZmZWN0ZWRQcm9qZWN0cy5zaXplKCk7CisJCQlpZiAobGVuZ3RoID09IDApCisJCQkJcmV0dXJuOworCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W2xlbmd0aF07CisJCQlhZmZlY3RlZFByb2plY3RzLnRvQXJyYXkocHJvamVjdHMpOworCQkJSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltsZW5ndGhdOworCQkJaWYgKHVzZXJMaWJyYXJ5ICE9IG51bGwpIHsKKwkJCQlVc2VyTGlicmFyeUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgVXNlckxpYnJhcnlDbGFzc3BhdGhDb250YWluZXIobGliTmFtZSk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQljb250YWluZXJzW2ldID0gY29udGFpbmVyOwogCQkJCX0KLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgcHJvamVjdHMsIGNvbnRhaW5lcnMsIG51bGwpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgZGVjb2RpbmcgdXNlciBsaWJyYXJ5ICciKyBsaWJOYW1lICsiJy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgc2V0dGluZyB1c2VyIGxpYnJhcnkgJyIrIGxpYk5hbWUgKyInLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBwcm9qZWN0cywgY29udGFpbmVycywgbnVsbCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgZGVjb2RpbmcgdXNlciBsaWJyYXJ5ICciKyBsaWJOYW1lICsiJy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHNldHRpbmcgdXNlciBsaWJyYXJ5ICciKyBsaWJOYW1lICsiJy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0gY2F0Y2ggKENsYXNzcGF0aEVudHJ5LkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBhc2UpIHsKKwkJCVV0aWwubG9nKGFzZSwgIkV4Y2VwdGlvbiB3aGlsZSBkZWNvZGluZyB1c2VyIGxpYnJhcnkgJyIrIGxpYk5hbWUgKyInLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVVc2VyTGlicmFyeShTdHJpbmcgbGliTmFtZSkgIHsKKwkJc3luY2hyb25pemVkICh0aGlzLnVzZXJMaWJyYXJpZXMpIHsKKwkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgaW5zdGFuY2VQcmVmZXJlbmNlcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluc3RhbmNlUHJlZmVyZW5jZXMoKTsKKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBDUF9VU0VSTElCUkFSWV9QUkVGRVJFTkNFU19QUkVGSVgrbGliTmFtZTsKKwkJCWluc3RhbmNlUHJlZmVyZW5jZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7CisJCQl0cnkgeworCQkJCWluc3RhbmNlUHJlZmVyZW5jZXMuZmx1c2goKTsKKwkJCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSByZW1vdmluZyB1c2VyIGxpYnJhcnkgIiArIGxpYk5hbWUpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KKwkJLy8gdGhpcy51c2VyTGlicmFyaWVzIHdhcyB1cGRhdGVkIGR1cmluZyB0aGUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IChzZWUgcHJlZmVyZW5jZUNoYW5nZSguLi4pKQogCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVXNlckxpYnJhcnkoU3RyaW5nIGxpYk5hbWUpICB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgaW5zdGFuY2VQcmVmZXJlbmNlcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluc3RhbmNlUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IENQX1VTRVJMSUJSQVJZX1BSRUZFUkVOQ0VTX1BSRUZJWCtsaWJOYW1lOwotCQlpbnN0YW5jZVByZWZlcmVuY2VzLnJlbW92ZShwcm9wZXJ0eU5hbWUpOwotCQl0cnkgewotCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5mbHVzaCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJVXRpbC5sb2coZSwgIkV4Y2VwdGlvbiB3aGlsZSByZW1vdmluZyB1c2VyIGxpYnJhcnkgIiArIGxpYk5hbWUpOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyTGlicmFyeShTdHJpbmcgbGliTmFtZSwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywgYm9vbGVhbiBpc1N5c3RlbUxpYnJhcnkpICB7CisJCXN5bmNocm9uaXplZCAodGhpcy51c2VyTGlicmFyaWVzKSB7CisJCQlJRWNsaXBzZVByZWZlcmVuY2VzIGluc3RhbmNlUHJlZmVyZW5jZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbnN0YW5jZVByZWZlcmVuY2VzKCk7CisJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gQ1BfVVNFUkxJQlJBUllfUFJFRkVSRU5DRVNfUFJFRklYK2xpYk5hbWU7CisJCQl0cnkgeworCQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gVXNlckxpYnJhcnkuc2VyaWFsaXplKGVudHJpZXMsIGlzU3lzdGVtTGlicmFyeSk7CisJCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsgLy8gc2VuZHMgb3V0IGEgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IChzZWUgcHJlZmVyZW5jZUNoYW5nZSguLi4pKQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgc2VyaWFsaXppbmcgdXNlciBsaWJyYXJ5ICIgKyBsaWJOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJCX0KKwkJCXRyeSB7CisJCQkJaW5zdGFuY2VQcmVmZXJlbmNlcy5mbHVzaCgpOworCQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHNhdmluZyB1c2VyIGxpYnJhcnkgIiArIGxpYk5hbWUpOyAvLyROT04tTkxTLTEkCisJCQl9CiAJCX0KIAkJLy8gdGhpcy51c2VyTGlicmFyaWVzIHdhcyB1cGRhdGVkIGR1cmluZyB0aGUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IChzZWUgcHJlZmVyZW5jZUNoYW5nZSguLi4pKQogCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckxpYnJhcnkoU3RyaW5nIGxpYk5hbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIGJvb2xlYW4gaXNTeXN0ZW1MaWJyYXJ5KSAgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGluc3RhbmNlUHJlZmVyZW5jZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbnN0YW5jZVByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBDUF9VU0VSTElCUkFSWV9QUkVGRVJFTkNFU19QUkVGSVgrbGliTmFtZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gVXNlckxpYnJhcnkuc2VyaWFsaXplKGVudHJpZXMsIGlzU3lzdGVtTGlicmFyeSk7Ci0JCQlpbnN0YW5jZVByZWZlcmVuY2VzLnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOyAvLyBzZW5kcyBvdXQgYSBQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgKHNlZSBwcmVmZXJlbmNlQ2hhbmdlKC4uLikpCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgc2VyaWFsaXppbmcgdXNlciBsaWJyYXJ5ICIgKyBsaWJOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnN0YW5jZVByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVdGlsLmxvZyhlLCAiRXhjZXB0aW9uIHdoaWxlIHNhdmluZyB1c2VyIGxpYnJhcnkgIiArIGxpYk5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gdGhpcy51c2VyTGlicmFyaWVzIHdhcyB1cGRhdGVkIGR1cmluZyB0aGUgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IChzZWUgcHJlZmVyZW5jZUNoYW5nZSguLi4pKQotCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVmVyYm9zZUVsZW1lbnRDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVmVyYm9zZUVsZW1lbnRDYWNoZS5qYXZhCmluZGV4IDM3NGNlMmIuLjg0ZGQ3MzcgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1ZlcmJvc2VFbGVtZW50Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9WZXJib3NlRWxlbWVudENhY2hlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0Fic3RyYWN0SW1hZ2VCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0Fic3RyYWN0SW1hZ2VCdWlsZGVyLmphdmEKaW5kZXggM2E4OGVlNS4uNTMxYjJiNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYnN0cmFjdEltYWdlQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJzdHJhY3RJbWFnZUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CkBAIC01NywyMiArNTgsMjIgQEAKIAogcHVibGljIHN0YXRpYyBpbnQgTUFYX0FUX09OQ0UgPSAyMDAwOyAvLyBiZXN0IGNvbXByb21pc2UgYmV0d2VlbiBzcGFjZSB1c2VkIGFuZCBzcGVlZAogcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKQVZBX1BST0JMRU1fTUFSS0VSX0FUVFJJQlVURV9OQU1FUyA9IHsKLQlJTWFya2VyLk1FU1NBR0UsIAotCUlNYXJrZXIuU0VWRVJJVFksIAotCUlKYXZhTW9kZWxNYXJrZXIuSUQsIAotCUlNYXJrZXIuQ0hBUl9TVEFSVCwgCi0JSU1hcmtlci5DSEFSX0VORCwgCi0JSU1hcmtlci5MSU5FX05VTUJFUiwgCisJSU1hcmtlci5NRVNTQUdFLAorCUlNYXJrZXIuU0VWRVJJVFksCisJSUphdmFNb2RlbE1hcmtlci5JRCwKKwlJTWFya2VyLkNIQVJfU1RBUlQsCisJSU1hcmtlci5DSEFSX0VORCwKKwlJTWFya2VyLkxJTkVfTlVNQkVSLAogCUlKYXZhTW9kZWxNYXJrZXIuQVJHVU1FTlRTLAotCUlKYXZhTW9kZWxNYXJrZXIuQ0FURUdPUllfSUQsCQorCUlKYXZhTW9kZWxNYXJrZXIuQ0FURUdPUllfSUQsCiB9OwogcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKQVZBX1RBU0tfTUFSS0VSX0FUVFJJQlVURV9OQU1FUyA9IHsKLQlJTWFya2VyLk1FU1NBR0UsIAotCUlNYXJrZXIuUFJJT1JJVFksIAotCUlKYXZhTW9kZWxNYXJrZXIuSUQsIAotCUlNYXJrZXIuQ0hBUl9TVEFSVCwgCi0JSU1hcmtlci5DSEFSX0VORCwgCi0JSU1hcmtlci5MSU5FX05VTUJFUiwgCisJSU1hcmtlci5NRVNTQUdFLAorCUlNYXJrZXIuUFJJT1JJVFksCisJSUphdmFNb2RlbE1hcmtlci5JRCwKKwlJTWFya2VyLkNIQVJfU1RBUlQsCisJSU1hcmtlci5DSEFSX0VORCwKKwlJTWFya2VyLkxJTkVfTlVNQkVSLAogCUlNYXJrZXIuVVNFUl9FRElUQUJMRSwKIAlJTWFya2VyLlNPVVJDRV9JRCwKIH07CkBAIC0xMjAsOCArMTIxLDggQEAKIAkvLyByZW1vdmUgdGhlIG9sZCBwcm9ibGVtcy4gUGx1cyBkZWxldGUgYWRkaXRpb25hbCBjbGFzcyBmaWxlcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KIAogCVNvdXJjZUZpbGUgY29tcGlsYXRpb25Vbml0ID0gKFNvdXJjZUZpbGUpIHJlc3VsdC5nZXRDb21waWxhdGlvblVuaXQoKTsgLy8gZ28gZGlyZWN0bHkgYmFjayB0byB0aGUgc291cmNlRmlsZQotCWlmICghd29ya1F1ZXVlLmlzQ29tcGlsZWQoY29tcGlsYXRpb25Vbml0KSkgewotCQl3b3JrUXVldWUuZmluaXNoZWQoY29tcGlsYXRpb25Vbml0KTsKKwlpZiAoIXRoaXMud29ya1F1ZXVlLmlzQ29tcGlsZWQoY29tcGlsYXRpb25Vbml0KSkgeworCQl0aGlzLndvcmtRdWV1ZS5maW5pc2hlZChjb21waWxhdGlvblVuaXQpOwogCiAJCXRyeSB7CiAJCQl1cGRhdGVQcm9ibGVtc0Zvcihjb21waWxhdGlvblVuaXQsIHJlc3VsdCk7IC8vIHJlY29yZCBjb21waWxhdGlvbiBwcm9ibGVtcyBiZWZvcmUgcG90ZW50aWFsbHkgYWRkaW5nIGR1cGxpY2F0ZSBlcnJvcnMKQEAgLTEzMiw4ICsxMzMsOCBAQAogCiAJCWlmIChyZXN1bHQuaGFzSW5jb25zaXN0ZW50VG9wbGV2ZWxIaWVyYXJjaGllcykKIAkJCS8vIGVuc3VyZSB0aGF0IHRoaXMgZmlsZSBpcyBhbHdheXMgcmV0cmlldmVkIGZyb20gc291cmNlIGZvciB0aGUgcmVzdCBvZiB0aGUgYnVpbGQKLQkJCWlmICghcHJvYmxlbVNvdXJjZUZpbGVzLmNvbnRhaW5zKGNvbXBpbGF0aW9uVW5pdCkpCi0JCQkJcHJvYmxlbVNvdXJjZUZpbGVzLmFkZChjb21waWxhdGlvblVuaXQpOworCQkJaWYgKCF0aGlzLnByb2JsZW1Tb3VyY2VGaWxlcy5jb250YWlucyhjb21waWxhdGlvblVuaXQpKQorCQkJCXRoaXMucHJvYmxlbVNvdXJjZUZpbGVzLmFkZChjb21waWxhdGlvblVuaXQpOwogCiAJCUlUeXBlIG1haW5UeXBlID0gbnVsbDsKIAkJU3RyaW5nIG1haW5UeXBlTmFtZSA9IG51bGw7CkBAIC0xNDcsMjMgKzE0OCwyMyBAQAogCiAJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBjbGFzc0ZpbGUuZ2V0Q29tcG91bmROYW1lKCk7CiAJCQljaGFyW10gdHlwZU5hbWUgPSBjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aCAtIDFdOwotCQkJYm9vbGVhbiBpc05lc3RlZFR5cGUgPSBjbGFzc0ZpbGUuZW5jbG9zaW5nQ2xhc3NGaWxlICE9IG51bGw7CisJCQlib29sZWFuIGlzTmVzdGVkVHlwZSA9IGNsYXNzRmlsZS5pc05lc3RlZFR5cGU7CiAKIAkJCS8vIExvb2sgZm9yIGEgcG9zc2libGUgY29sbGlzaW9uLCBpZiBvbmUgZXhpc3RzLCByZXBvcnQgYW4gZXJyb3IgYnV0IGRvIG5vdCB3cml0ZSB0aGUgY2xhc3MgZmlsZQogCQkJaWYgKGlzTmVzdGVkVHlwZSkgewogCQkJCVN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSA9IG5ldyBTdHJpbmcoY2xhc3NGaWxlLm91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpLmZpbGVOYW1lKCkpOwotCQkJCWlmIChuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0b3IocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKSkKKwkJCQlpZiAodGhpcy5uZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0b3IocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKSkKIAkJCQkJY29udGludWU7CiAJCQl9IGVsc2UgewogCQkJCVN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSA9IG5ldyBTdHJpbmcoY2xhc3NGaWxlLmZpbGVOYW1lKCkpOyAvLyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSAicDEvcDIvQSIKLQkJCQlpZiAobmV3U3RhdGUuaXNEdXBsaWNhdGVMb2NhdG9yKHF1YWxpZmllZFR5cGVOYW1lLCB0eXBlTG9jYXRvcikpIHsKKwkJCQlpZiAodGhpcy5uZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0b3IocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKSkgewogCQkJCQlpZiAoZHVwbGljYXRlVHlwZU5hbWVzID09IG51bGwpCiAJCQkJCQlkdXBsaWNhdGVUeXBlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQkJCWR1cGxpY2F0ZVR5cGVOYW1lcy5hZGQoY29tcG91bmROYW1lKTsKIAkJCQkJaWYgKG1haW5UeXBlID09IG51bGwpIHsKIAkJCQkJCXRyeSB7CiAJCQkJCQkJbWFpblR5cGVOYW1lID0gY29tcGlsYXRpb25Vbml0LmluaXRpYWxUeXBlTmFtZTsgLy8gc2xhc2ggc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lICJwMS9wMS9BIgotCQkJCQkJCW1haW5UeXBlID0gamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZmluZFR5cGUobWFpblR5cGVOYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKKwkJCQkJCQltYWluVHlwZSA9IHRoaXMuamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZmluZFR5cGUobWFpblR5cGVOYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKIAkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJLy8gaWdub3JlCiAJCQkJCQl9CkBAIC0xNzUsMTEgKzE3NiwxMSBAQAogCQkJCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcocXVhbGlmaWVkVHlwZU5hbWUubGFzdEluZGV4T2YoJy8nKSsxKTsKIAkJCQkJCXR5cGUgPSBtYWluVHlwZSA9PSBudWxsID8gbnVsbCA6IG1haW5UeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFR5cGUoc2ltcGxlTmFtZSk7CiAJCQkJCX0KLQkJCQkJY3JlYXRlUHJvYmxlbUZvcihjb21waWxhdGlvblVuaXQucmVzb3VyY2UsIHR5cGUsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfZHVwbGljYXRlQ2xhc3NGaWxlLCBuZXcgU3RyaW5nKHR5cGVOYW1lKSksIEphdmFDb3JlLkVSUk9SKTsgCisJCQkJCWNyZWF0ZVByb2JsZW1Gb3IoY29tcGlsYXRpb25Vbml0LnJlc291cmNlLCB0eXBlLCBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2R1cGxpY2F0ZUNsYXNzRmlsZSwgbmV3IFN0cmluZyh0eXBlTmFtZSkpLCBKYXZhQ29yZS5FUlJPUik7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KLQkJCQluZXdTdGF0ZS5yZWNvcmRMb2NhdG9yRm9yVHlwZShxdWFsaWZpZWRUeXBlTmFtZSwgdHlwZUxvY2F0b3IpOwotCQkJCWlmICghcXVhbGlmaWVkVHlwZU5hbWUuZXF1YWxzKGNvbXBpbGF0aW9uVW5pdC5pbml0aWFsVHlwZU5hbWUpKQorCQkJCXRoaXMubmV3U3RhdGUucmVjb3JkTG9jYXRvckZvclR5cGUocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKTsKKwkJCQlpZiAocmVzdWx0LmNoZWNrU2Vjb25kYXJ5VHlwZXMgJiYgIXF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyhjb21waWxhdGlvblVuaXQuaW5pdGlhbFR5cGVOYW1lKSkKIAkJCQkJYWNjZXB0U2Vjb25kYXJ5VHlwZShjbGFzc0ZpbGUpOwogCQkJfQogCQkJdHJ5IHsKQEAgLTE4NywxNiArMTg4LDE3IEBACiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQlVdGlsLmxvZyhlLCAiSmF2YUJ1aWxkZXIgaGFuZGxpbmcgQ29yZUV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5DQVNFX1ZBUklBTlRfRVhJU1RTKQotCQkJCQljcmVhdGVQcm9ibGVtRm9yKGNvbXBpbGF0aW9uVW5pdC5yZXNvdXJjZSwgbnVsbCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jbGFzc0ZpbGVDb2xsaXNpb24sIGUuZ2V0TWVzc2FnZSgpKSwgSmF2YUNvcmUuRVJST1IpOyAKKwkJCQkJY3JlYXRlUHJvYmxlbUZvcihjb21waWxhdGlvblVuaXQucmVzb3VyY2UsIG51bGwsIE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY2xhc3NGaWxlQ29sbGlzaW9uLCBlLmdldE1lc3NhZ2UoKSksIEphdmFDb3JlLkVSUk9SKTsKIAkJCQllbHNlCi0JCQkJCWNyZWF0ZVByb2JsZW1Gb3IoY29tcGlsYXRpb25Vbml0LnJlc291cmNlLCBudWxsLCBNZXNzYWdlcy5idWlsZF9pbmNvbnNpc3RlbnRDbGFzc0ZpbGUsIEphdmFDb3JlLkVSUk9SKTsgCisJCQkJCWNyZWF0ZVByb2JsZW1Gb3IoY29tcGlsYXRpb25Vbml0LnJlc291cmNlLCBudWxsLCBNZXNzYWdlcy5idWlsZF9pbmNvbnNpc3RlbnRDbGFzc0ZpbGUsIEphdmFDb3JlLkVSUk9SKTsKIAkJCX0KIAkJfQogCQlpZiAocmVzdWx0Lmhhc0Fubm90YXRpb25zICYmIHRoaXMuZmlsZXNXaXRoQW5ub3RhdGlvbnMgIT0gbnVsbCkgLy8gb25seSBpbml0aWFsaXplZCBpZiBhbiBhbm5vdGF0aW9uIHByb2Nlc3NvciBpcyBhdHRhY2hlZAogCQkJdGhpcy5maWxlc1dpdGhBbm5vdGF0aW9ucy5hZGQoY29tcGlsYXRpb25Vbml0KTsKIAorCQl0aGlzLmNvbXBpbGVyLmxvb2t1cEVudmlyb25tZW50LnJlbGVhc2VDbGFzc0ZpbGVzKGNsYXNzRmlsZXMpOwogCQlmaW5pc2hlZFdpdGgodHlwZUxvY2F0b3IsIHJlc3VsdCwgY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpLCBkZWZpbmVkVHlwZU5hbWVzLCBkdXBsaWNhdGVUeXBlTmFtZXMpOwotCQlub3RpZmllci5jb21waWxlZChjb21waWxhdGlvblVuaXQpOworCQl0aGlzLm5vdGlmaWVyLmNvbXBpbGVkKGNvbXBpbGF0aW9uVW5pdCk7CiAJfQogfQogCkBAIC0yMDUsMTEgKzIwNywxMSBAQAogfQogCiBwcm90ZWN0ZWQgdm9pZCBhZGRBbGxTb3VyY2VGaWxlcyhmaW5hbCBBcnJheUxpc3Qgc291cmNlRmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJZmluYWwgQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJZmluYWwgQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24gPSB0aGlzLnNvdXJjZUxvY2F0aW9uc1tpXTsKIAkJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSBzb3VyY2VMb2NhdGlvbi5leGNsdXNpb25QYXR0ZXJuczsKIAkJZmluYWwgY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMgPSBzb3VyY2VMb2NhdGlvbi5pbmNsdXNpb25QYXR0ZXJuczsKLQkJZmluYWwgYm9vbGVhbiBpc0Fsc29Qcm9qZWN0ID0gc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmVxdWFscyhqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CisJCWZpbmFsIGJvb2xlYW4gaXNBbHNvUHJvamVjdCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5lcXVhbHModGhpcy5qYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CiAJCWZpbmFsIGludCBzZWdtZW50Q291bnQgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50Q291bnQoKTsKIAkJZmluYWwgSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSBzb3VyY2VMb2NhdGlvbi5iaW5hcnlGb2xkZXI7CiAJCWZpbmFsIGJvb2xlYW4gaXNPdXRwdXRGb2xkZXIgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZXF1YWxzKG91dHB1dEZvbGRlcik7CkBAIC0yNDUsOCArMjQ3LDggQEAKIAkJCQkJCQkJCWZvbGRlclBhdGggPSBwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKTsKIAkJCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZm9sZGVyUGF0aC5sYXN0U2VnbWVudCgpOwogCQkJCQkJCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlTdHJpbmcgc291cmNlTGV2ZWwgPSBqYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKLQkJCQkJCQkJCVN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBqYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7CisJCQkJCQkJCQlTdHJpbmcgc291cmNlTGV2ZWwgPSBBYnN0cmFjdEltYWdlQnVpbGRlci50aGlzLmphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOworCQkJCQkJCQkJU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IEFic3RyYWN0SW1hZ2VCdWlsZGVyLnRoaXMuamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOwogCQkJCQkJCQkJaWYgKEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCiAJCQkJCQkJCQkJY3JlYXRlRm9sZGVyKGZvbGRlclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLCBvdXRwdXRGb2xkZXIpOwogCQkJCQkJCQl9CkBAIC0yNTcsNyArMjU5LDcgQEAKIAkJCX0sCiAJCQlJUmVzb3VyY2UuTk9ORQogCQkpOwotCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJfQogfQogCkBAIC0yNzMsNyArMjc1LDcgQEAKIAl0aGlzLnByb2JsZW1Tb3VyY2VGaWxlcyA9IG51bGw7CiB9CiAKLS8qIENvbXBpbGUgdGhlIGdpdmVuIGVsZW1lbnRzLCBhZGRpbmcgbW9yZSBlbGVtZW50cyB0byB0aGUgd29yayBxdWV1ZSAKKy8qIENvbXBpbGUgdGhlIGdpdmVuIGVsZW1lbnRzLCBhZGRpbmcgbW9yZSBlbGVtZW50cyB0byB0aGUgd29yayBxdWV1ZQogKiBpZiB0aGV5IGFyZSBhZmZlY3RlZCBieSB0aGUgY2hhbmdlcy4KICovCiBwcm90ZWN0ZWQgdm9pZCBjb21waWxlKFNvdXJjZUZpbGVbXSB1bml0cykgewpAQCAtMjgyLDcgKzI4NCw3IEBACiAJCXRoaXMuZmlsZXNXaXRoQW5ub3RhdGlvbnMuY2xlYXIoKTsKIAogCS8vIG5vdGlmeSBDb21waWxhdGlvblBhcnRpY2lwYW50cyB3aGljaCBzb3VyY2UgZmlsZXMgYXJlIGFib3V0IHRvIGJlIGNvbXBpbGVkCi0JQnVpbGRDb250ZXh0W10gcGFydGljaXBhbnRSZXN1bHRzID0gdGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHMgPT0gbnVsbCA/IG51bGwgOiBub3RpZnlQYXJ0aWNpcGFudHModW5pdHMpOworCUNvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHRbXSBwYXJ0aWNpcGFudFJlc3VsdHMgPSB0aGlzLmphdmFCdWlsZGVyLnBhcnRpY2lwYW50cyA9PSBudWxsID8gbnVsbCA6IG5vdGlmeVBhcnRpY2lwYW50cyh1bml0cyk7CiAJaWYgKHBhcnRpY2lwYW50UmVzdWx0cyAhPSBudWxsICYmIHBhcnRpY2lwYW50UmVzdWx0cy5sZW5ndGggPiB1bml0cy5sZW5ndGgpIHsKIAkJdW5pdHMgPSBuZXcgU291cmNlRmlsZVtwYXJ0aWNpcGFudFJlc3VsdHMubGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IHBhcnRpY2lwYW50UmVzdWx0cy5sZW5ndGg7IC0taSA+PSAwOykKQEAgLTMzOSwzNiArMzQxLDQ5IEBACiAKIHByb3RlY3RlZCB2b2lkIGNvbXBpbGUoU291cmNlRmlsZVtdIHVuaXRzLCBTb3VyY2VGaWxlW10gYWRkaXRpb25hbFVuaXRzLCBib29sZWFuIGNvbXBpbGluZ0ZpcnN0R3JvdXApIHsKIAlpZiAodW5pdHMubGVuZ3RoID09IDApIHJldHVybjsKLQlub3RpZmllci5hYm91dFRvQ29tcGlsZSh1bml0c1swXSk7IC8vIGp1c3QgdG8gY2hhbmdlIHRoZSBtZXNzYWdlCisJdGhpcy5ub3RpZmllci5hYm91dFRvQ29tcGlsZSh1bml0c1swXSk7IC8vIGp1c3QgdG8gY2hhbmdlIHRoZSBtZXNzYWdlCiAKIAkvLyBleHRlbmQgYWRkaXRpb25hbEZpbGVuYW1lcyB3aXRoIGFsbCBoaWVyYXJjaGljYWwgcHJvYmxlbSB0eXBlcyBmb3VuZCBkdXJpbmcgdGhpcyBlbnRpcmUgYnVpbGQKLQlpZiAoIXByb2JsZW1Tb3VyY2VGaWxlcy5pc0VtcHR5KCkpIHsKLQkJaW50IHRvQWRkID0gcHJvYmxlbVNvdXJjZUZpbGVzLnNpemUoKTsKKwlpZiAoIXRoaXMucHJvYmxlbVNvdXJjZUZpbGVzLmlzRW1wdHkoKSkgeworCQlpbnQgdG9BZGQgPSB0aGlzLnByb2JsZW1Tb3VyY2VGaWxlcy5zaXplKCk7CiAJCWludCBsZW5ndGggPSBhZGRpdGlvbmFsVW5pdHMgPT0gbnVsbCA/IDAgOiBhZGRpdGlvbmFsVW5pdHMubGVuZ3RoOwogCQlpZiAobGVuZ3RoID09IDApCiAJCQlhZGRpdGlvbmFsVW5pdHMgPSBuZXcgU291cmNlRmlsZVt0b0FkZF07CiAJCWVsc2UKIAkJCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25hbFVuaXRzLCAwLCBhZGRpdGlvbmFsVW5pdHMgPSBuZXcgU291cmNlRmlsZVtsZW5ndGggKyB0b0FkZF0sIDAsIGxlbmd0aCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9BZGQ7IGkrKykKLQkJCWFkZGl0aW9uYWxVbml0c1tsZW5ndGggKyBpXSA9IChTb3VyY2VGaWxlKSBwcm9ibGVtU291cmNlRmlsZXMuZ2V0KGkpOworCQkJYWRkaXRpb25hbFVuaXRzW2xlbmd0aCArIGldID0gKFNvdXJjZUZpbGUpIHRoaXMucHJvYmxlbVNvdXJjZUZpbGVzLmdldChpKTsKIAl9CiAJU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbdW5pdHMubGVuZ3RoXTsKIAlmb3IgKGludCBpID0gMCwgbCA9IHVuaXRzLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJaW5pdGlhbFR5cGVOYW1lc1tpXSA9IHVuaXRzW2ldLmluaXRpYWxUeXBlTmFtZTsKLQluYW1lRW52aXJvbm1lbnQuc2V0TmFtZXMoaW5pdGlhbFR5cGVOYW1lcywgYWRkaXRpb25hbFVuaXRzKTsKLQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCXRoaXMubmFtZUVudmlyb25tZW50LnNldE5hbWVzKGluaXRpYWxUeXBlTmFtZXMsIGFkZGl0aW9uYWxVbml0cyk7CisJdGhpcy5ub3RpZmllci5jaGVja0NhbmNlbCgpOwogCXRyeSB7Ci0JCWluQ29tcGlsZXIgPSB0cnVlOwotCQljb21waWxlci5jb21waWxlKHVuaXRzKTsKKwkJdGhpcy5pbkNvbXBpbGVyID0gdHJ1ZTsKKwkJdGhpcy5jb21waWxlci5jb21waWxlKHVuaXRzKTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGlnbm9yZWQpIHsKIAkJLy8gaWdub3JlIHRoZSBBYm9ydENvbXBpbGNhdGlvbiBjb21pbmcgZnJvbSBCdWlsZE5vdGlmaWVyLmNoZWNrQ2FuY2VsV2l0aGluQ29tcGlsZXIoKQogCQkvLyB0aGUgQ29tcGlsZXIgZmFpbGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBjaG9zZSB0byBjYW5jZWwuLi4gbGlrZWx5IGR1ZSB0byBhbiBPdXRPZk1lbW9yeSBlcnJvcgogCX0gZmluYWxseSB7Ci0JCWluQ29tcGlsZXIgPSBmYWxzZTsKKwkJdGhpcy5pbkNvbXBpbGVyID0gZmFsc2U7CiAJfQogCS8vIENoZWNrIGZvciBjYW5jZWwgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjb21waWxlLCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkKIAkvLyBoYXZlIGJlZW4gY2FuY2VsbGVkIGJ1dCB3aXRob3V0IHByb3BhZ2F0aW5nIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbgotCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJdGhpcy5ub3RpZmllci5jaGVja0NhbmNlbCgpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb3B5UmVzb3VyY2UoSVJlc291cmNlIHNvdXJjZSwgSVJlc291cmNlIGRlc3RpbmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVBhdGggZGVzdFBhdGggPSBkZXN0aW5hdGlvbi5nZXRGdWxsUGF0aCgpOworCXRyeSB7CisJCXNvdXJjZS5jb3B5KGRlc3RQYXRoLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuREVSSVZFRCwgbnVsbCk7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCS8vIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBzb3VyY2UgcmVzb3VyY2UgaXMgZGVsZXRlZAorCQlzb3VyY2UucmVmcmVzaExvY2FsKDAsIG51bGwpOworCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkgcmV0dXJuOyAvLyBzb3VyY2UgcmVzb3VyY2Ugd2FzIGRlbGV0ZWQgc28gc2tpcCBpdAorCQl0aHJvdyBlOworCX0KKwlVdGlsLnNldFJlYWRPbmx5KGRlc3RpbmF0aW9uLCBmYWxzZSk7IC8vIGp1c3QgaW4gY2FzZSB0aGUgb3JpZ2luYWwgd2FzIHJlYWQgb25seQogfQogCiBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9ibGVtRm9yKElSZXNvdXJjZSByZXNvdXJjZSwgSU1lbWJlciBqYXZhRWxlbWVudCwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwcm9ibGVtU2V2ZXJpdHkpIHsKQEAgLTM3Niw3ICszOTEsMjEgQEAKIAkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKIAkJaW50IHNldmVyaXR5ID0gcHJvYmxlbVNldmVyaXR5LmVxdWFscyhKYXZhQ29yZS5XQVJOSU5HKSA/IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyA6IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7CiAKLQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gamF2YUVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBqYXZhRWxlbWVudC5nZXROYW1lUmFuZ2UoKTsKKwkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKKwkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmFuZ2UgPSBqYXZhRWxlbWVudC5nZXROYW1lUmFuZ2UoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCkuZ2V0Q29kZSgpICE9IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCkgeworCQkJCQl0aHJvdyBlOworCQkJCX0KKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGphdmFFbGVtZW50LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwgVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRSkpIHsKKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQkJLy8gZWxzZSBzaWxlbnRseSBzd2FsbG93IHRoZSBleGNlcHRpb24gYXMgdGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UgdHlwZSBwYWNrYWdlLWluZm8gaGFzIG5vCisJCQkJLy8gc291cmNlIHJhbmdlIHJlYWxseS4gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgxNDUKKwkJCX0KKwkJfQogCQlpbnQgc3RhcnQgPSByYW5nZSA9PSBudWxsID8gMCA6IHJhbmdlLmdldE9mZnNldCgpOwogCQlpbnQgZW5kID0gcmFuZ2UgPT0gbnVsbCA/IDEgOiBzdGFydCArIHJhbmdlLmdldExlbmd0aCgpOwogCQltYXJrZXIuc2V0QXR0cmlidXRlcygKQEAgLTM5NSwxMiArNDI0LDEyIEBACiAJaWYgKG11c3RFeGlzdCAmJiAhZmlsZS5leGlzdHMoKSkgcmV0dXJuIG51bGw7CiAKIAkvLyBhc3N1bWVzIHRoZSBmaWxlIGV4aXN0cyBpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHNvdXJjZSBmb2xkZXJzICYgaXMgbm90IGV4Y2x1ZGVkCi0JQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSBzb3VyY2VMb2NhdGlvbnNbMF07Ci0JaWYgKHNvdXJjZUxvY2F0aW9ucy5sZW5ndGggPiAxKSB7CisJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSB0aGlzLnNvdXJjZUxvY2F0aW9uc1swXTsKKwlpZiAodGhpcy5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoID4gMSkgewogCQlJUGF0aCBzb3VyY2VGaWxlRnVsbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCWZvciAoaW50IGogPSAwLCBtID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaiA8IG07IGorKykgewotCQkJaWYgKHNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKHNvdXJjZUZpbGVGdWxsUGF0aCkpIHsKLQkJCQltZCA9IHNvdXJjZUxvY2F0aW9uc1tqXTsKKwkJZm9yIChpbnQgaiA9IDAsIG0gPSB0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKwkJCWlmICh0aGlzLnNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKHNvdXJjZUZpbGVGdWxsUGF0aCkpIHsKKwkJCQltZCA9IHRoaXMuc291cmNlTG9jYXRpb25zW2pdOwogCQkJCWlmIChtZC5leGNsdXNpb25QYXR0ZXJucyA9PSBudWxsICYmIG1kLmluY2x1c2lvblBhdHRlcm5zID09IG51bGwpCiAJCQkJCWJyZWFrOwogCQkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKGZpbGUsIG1kLmluY2x1c2lvblBhdHRlcm5zLCBtZC5leGNsdXNpb25QYXR0ZXJucykpCkBAIC00MTMsMTEgKzQ0MiwxMCBAQAogCiBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFdpdGgoU3RyaW5nIHNvdXJjZUxvY2F0b3IsIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIG1haW5UeXBlTmFtZSwgQXJyYXlMaXN0IGRlZmluZWRUeXBlTmFtZXMsIEFycmF5TGlzdCBkdXBsaWNhdGVUeXBlTmFtZXMpIHsKIAlpZiAoZHVwbGljYXRlVHlwZU5hbWVzID09IG51bGwpIHsKLQkJbmV3U3RhdGUucmVjb3JkKHNvdXJjZUxvY2F0b3IsIHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzLCByZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7CisJCXRoaXMubmV3U3RhdGUucmVjb3JkKHNvdXJjZUxvY2F0b3IsIHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzLCByZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXMsIHJlc3VsdC5yb290UmVmZXJlbmNlcywgbWFpblR5cGVOYW1lLCBkZWZpbmVkVHlwZU5hbWVzKTsKIAkJcmV0dXJuOwogCX0KIAotCWNoYXJbXVtdW10gcXVhbGlmaWVkUmVmcyA9IHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzOwogCWNoYXJbXVtdIHNpbXBsZVJlZnMgPSByZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXM7CiAJLy8gZm9yIGVhY2ggZHVwbGljYXRlIHR5cGUgcDEucDIuQSwgYWRkIHRoZSB0eXBlIG5hbWUgQSAocGFja2FnZSB3YXMgYWxyZWFkeSBhZGRlZCkKIAluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBkdXBsaWNhdGVUeXBlTmFtZXMuc2l6ZSgpOyBpIDwgbDsgaSsrKSB7CkBAIC00MzAsNyArNDU4LDcgQEAKIAkJU3lzdGVtLmFycmF5Y29weShzaW1wbGVSZWZzLCAwLCBzaW1wbGVSZWZzID0gbmV3IGNoYXJbc0xlbmd0aCArIDFdW10sIDAsIHNMZW5ndGgpOwogCQlzaW1wbGVSZWZzW3NMZW5ndGhdID0gdHlwZU5hbWU7CiAJfQotCW5ld1N0YXRlLnJlY29yZChzb3VyY2VMb2NhdG9yLCBxdWFsaWZpZWRSZWZzLCBzaW1wbGVSZWZzLCBtYWluVHlwZU5hbWUsIGRlZmluZWRUeXBlTmFtZXMpOworCXRoaXMubmV3U3RhdGUucmVjb3JkKHNvdXJjZUxvY2F0b3IsIHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzLCBzaW1wbGVSZWZzLCByZXN1bHQucm9vdFJlZmVyZW5jZXMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7CiB9CiAKIHByb3RlY3RlZCBJQ29udGFpbmVyIGNyZWF0ZUZvbGRlcihJUGF0aCBwYWNrYWdlUGF0aCwgSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKQEAgLTQ1NSw3ICs0ODMsNyBAQAogcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyKENvbXBpbGVyIG5ld0NvbXBpbGVyKSB7CiAJQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yTWFuYWdlciBhbm5vdGF0aW9uTWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNyZWF0ZUFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyKCk7CiAJaWYgKGFubm90YXRpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJYW5ub3RhdGlvbk1hbmFnZXIuY29uZmlndXJlRnJvbVBsYXRmb3JtKG5ld0NvbXBpbGVyLCB0aGlzLCBqYXZhQnVpbGRlci5qYXZhUHJvamVjdCk7CisJCWFubm90YXRpb25NYW5hZ2VyLmNvbmZpZ3VyZUZyb21QbGF0Zm9ybShuZXdDb21waWxlciwgdGhpcywgdGhpcy5qYXZhQnVpbGRlci5qYXZhUHJvamVjdCk7CiAJCWFubm90YXRpb25NYW5hZ2VyLnNldEVycihuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycikpOwogCQlhbm5vdGF0aW9uTWFuYWdlci5zZXRPdXQobmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpKTsKIAl9CkBAIC00NjQsNyArNDkyLDcgQEAKIAogcHJvdGVjdGVkIFJ1bnRpbWVFeGNlcHRpb24gaW50ZXJuYWxFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiB0KSB7CiAJSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24gaW1hZ2VCdWlsZGVyRXhjZXB0aW9uID0gbmV3IEltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uKHQpOwotCWlmIChpbkNvbXBpbGVyKQorCWlmICh0aGlzLmluQ29tcGlsZXIpCiAJCXJldHVybiBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBpbWFnZUJ1aWxkZXJFeGNlcHRpb24pOwogCXJldHVybiBpbWFnZUJ1aWxkZXJFeGNlcHRpb247CiB9CkBAIC00NzMsMTcgKzUwMSwxNyBAQAogCS8vIGFuc3dlciB3aGV0aGVyIHRoZSBmb2xkZXIgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiB3YWxraW5nIHRoZSBwcm9qZWN0IGFzIGEgc291cmNlIGZvbGRlcgogCWlmIChjaGlsZFBhdGguc2VnbWVudENvdW50KCkgPiAyKSByZXR1cm4gZmFsc2U7IC8vIGlzIGEgc3ViZm9sZGVyIG9mIGEgcGFja2FnZQogCi0JZm9yIChpbnQgaiA9IDAsIGsgPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBqIDwgazsgaisrKSB7Ci0JCWlmIChjaGlsZFBhdGguZXF1YWxzKHNvdXJjZUxvY2F0aW9uc1tqXS5iaW5hcnlGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHJldHVybiB0cnVlOwotCQlpZiAoY2hpbGRQYXRoLmVxdWFscyhzb3VyY2VMb2NhdGlvbnNbal0uc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkpKSByZXR1cm4gdHJ1ZTsKKwlmb3IgKGludCBqID0gMCwgayA9IHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaiA8IGs7IGorKykgeworCQlpZiAoY2hpbGRQYXRoLmVxdWFscyh0aGlzLnNvdXJjZUxvY2F0aW9uc1tqXS5iaW5hcnlGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHJldHVybiB0cnVlOworCQlpZiAoY2hpbGRQYXRoLmVxdWFscyh0aGlzLnNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHJldHVybiB0cnVlOwogCX0KIAkvLyBza2lwIGRlZmF1bHQgb3V0cHV0IGZvbGRlciB3aGljaCBtYXkgbm90IGJlIHVzZWQgYnkgYW55IHNvdXJjZSBmb2xkZXIKLQlyZXR1cm4gY2hpbGRQYXRoLmVxdWFscyhqYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwlyZXR1cm4gY2hpbGRQYXRoLmVxdWFscyh0aGlzLmphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkpOwogfQogCiBwcm90ZWN0ZWQgQ29tcGlsZXIgbmV3Q29tcGlsZXIoKSB7CiAJLy8gZGlzYWJsZSBlbnRpcmUgamF2YWRvYyBzdXBwb3J0IGlmIG5vdCBpbnRlcmVzdGVkIGluIGRpYWdub3N0aWNzCi0JTWFwIHByb2plY3RPcHRpb25zID0gamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKKwlNYXAgcHJvamVjdE9wdGlvbnMgPSB0aGlzLmphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7CiAJU3RyaW5nIG9wdGlvbiA9IChTdHJpbmcpIHByb2plY3RPcHRpb25zLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9JTlZBTElEX0pBVkFET0MpOwogCWlmIChvcHRpb24gPT0gbnVsbCB8fCBvcHRpb24uZXF1YWxzKEphdmFDb3JlLklHTk9SRSkpIHsgLy8gVE9ETyAoZnJlZGVyaWMpIHNlZSB3aHkgb3B0aW9uIGlzIG51bGwgc29tZXRpbWVzIHdoaWxlIHJ1bm5pbmcgbW9kZWwgdGVzdHMhPwogCQlvcHRpb24gPSAoU3RyaW5nKSBwcm9qZWN0T3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR1MpOwpAQCAtNDk3LDE5ICs1MjUsMjIgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8vIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGJ1aWxkZXIgaXMgaW5pdGlhbGl6ZWQuLi4gY2FuIG92ZXJyaWRlIGlmIG5lZWRlZAogCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKHByb2plY3RPcHRpb25zKTsKIAljb21waWxlck9wdGlvbnMucGVyZm9ybU1ldGhvZHNGdWxsUmVjb3ZlcnkgPSB0cnVlOwogCWNvbXBpbGVyT3B0aW9ucy5wZXJmb3JtU3RhdGVtZW50c1JlY292ZXJ5ID0gdHJ1ZTsKIAlDb21waWxlciBuZXdDb21waWxlciA9IG5ldyBDb21waWxlcigKLQkJbmFtZUVudmlyb25tZW50LAorCQl0aGlzLm5hbWVFbnZpcm9ubWVudCwKIAkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksCiAJCWNvbXBpbGVyT3B0aW9ucywKIAkJdGhpcywKIAkJUHJvYmxlbUZhY3RvcnkuZ2V0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpOwogCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3Q29tcGlsZXIub3B0aW9uczsKLQkKKwkvLyB0ZW1wb3JhcnkgY29kZSB0byBhbGxvdyB0aGUgY29tcGlsZXIgdG8gcmV2ZXJ0IHRvIGEgc2luZ2xlIHRocmVhZAorCVN0cmluZyBzZXR0aW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJqZHQuY29tcGlsZXIudXNlU2luZ2xlVGhyZWFkIik7IC8vJE5PTi1OTFMtMSQKKwluZXdDb21waWxlci51c2VTaW5nbGVUaHJlYWQgPSBzZXR0aW5nICE9IG51bGwgJiYgc2V0dGluZy5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAorCiAJLy8gZW5hYmxlIHRoZSBjb21waWxlciByZWZlcmVuY2UgaW5mbyBzdXBwb3J0CiAJb3B0aW9ucy5wcm9kdWNlUmVmZXJlbmNlSW5mbyA9IHRydWU7CiAKQEAgLTUxOCwxNCArNTQ5LDE0IEBACiAJCS8vIHN1cHBvcnQgZm9yIEphdmEgNiBhbm5vdGF0aW9uIHByb2Nlc3NvcnMKIAkJaW5pdGlhbGl6ZUFubm90YXRpb25Qcm9jZXNzb3JNYW5hZ2VyKG5ld0NvbXBpbGVyKTsKIAl9Ci0JCisKIAlyZXR1cm4gbmV3Q29tcGlsZXI7CiB9CiAKLXByb3RlY3RlZCBCdWlsZENvbnRleHRbXSBub3RpZnlQYXJ0aWNpcGFudHMoU291cmNlRmlsZVtdIHVuaXRzQWJvdXRUb0NvbXBpbGUpIHsKLQlCdWlsZENvbnRleHRbXSByZXN1bHRzID0gbmV3IEJ1aWxkQ29udGV4dFt1bml0c0Fib3V0VG9Db21waWxlLmxlbmd0aF07Citwcm90ZWN0ZWQgQ29tcGlsYXRpb25QYXJ0aWNpcGFudFJlc3VsdFtdIG5vdGlmeVBhcnRpY2lwYW50cyhTb3VyY2VGaWxlW10gdW5pdHNBYm91dFRvQ29tcGlsZSkgeworCUNvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHRbXSByZXN1bHRzID0gbmV3IENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHRbdW5pdHNBYm91dFRvQ29tcGlsZS5sZW5ndGhdOwogCWZvciAoaW50IGkgPSB1bml0c0Fib3V0VG9Db21waWxlLmxlbmd0aDsgLS1pID49IDA7KQotCQlyZXN1bHRzW2ldID0gbmV3IEJ1aWxkQ29udGV4dCh1bml0c0Fib3V0VG9Db21waWxlW2ldKTsKKwkJcmVzdWx0c1tpXSA9IG5ldyBDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0KHVuaXRzQWJvdXRUb0NvbXBpbGVbaV0pOwogCiAJLy8gVE9ETyAoa2VudCkgZG8gd2UgZXhwZWN0IHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBwYXJ0aWNpcGFudD8KIAkvLyBhbmQgaWYgc28gc2hvdWxkIHdlIHBhc3MgdGhlIGdlbmVyYXRlZCBmaWxlcyBmcm9tIHRoZSBlYWNoIHByb2Nlc3NvciB0byB0aGUgb3RoZXJzIHRvIHByb2Nlc3M/CkBAIC01NTUsNyArNTg2LDcgQEAKIAkJCQkJCXVuaXF1ZUZpbGVzLmFkZCh1bml0c0Fib3V0VG9Db21waWxlW2ZdKTsKIAkJCQl9CiAJCQkJaWYgKHVuaXF1ZUZpbGVzLmFkZElmTm90SW5jbHVkZWQoc291cmNlRmlsZSkgPT0gc291cmNlRmlsZSkgewotCQkJCQlDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0IG5ld1Jlc3VsdCA9IG5ldyBCdWlsZENvbnRleHQoc291cmNlRmlsZSk7CisJCQkJCUNvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQgbmV3UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQoc291cmNlRmlsZSk7CiAJCQkJCS8vIGlzIHRoZXJlIGVub3VnaCByb29tIHRvIGFkZCBhbGwgdGhlIGFkZGVkR2VuZXJhdGVkRmlsZXMubGVuZ3RoID8KIAkJCQkJaWYgKHRvQWRkID09IG51bGwpIHsKIAkJCQkJCXRvQWRkID0gbmV3IENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHRbYWRkZWRHZW5lcmF0ZWRGaWxlcy5sZW5ndGhdOwpAQCAtNTcyLDcgKzYwMyw3IEBACiAKIAlpZiAoYWRkZWQgPjAgKSB7CiAJCWludCBsZW5ndGggPSByZXN1bHRzLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLCAwLCByZXN1bHRzID0gbmV3IEJ1aWxkQ29udGV4dFtsZW5ndGggKyBhZGRlZF0sIDAgLCBsZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHMsIDAsIHJlc3VsdHMgPSBuZXcgQ29tcGlsYXRpb25QYXJ0aWNpcGFudFJlc3VsdFtsZW5ndGggKyBhZGRlZF0sIDAgLCBsZW5ndGgpOwogCQlTeXN0ZW0uYXJyYXljb3B5KHRvQWRkLCAwLCByZXN1bHRzLCBsZW5ndGgsIGFkZGVkKTsKIAl9CiAJcmV0dXJuIHJlc3VsdHM7CkBAIC01ODAsNyArNjExLDcgQEAKIAogcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0Fubm90YXRpb25SZXN1bHRzKENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHRbXSByZXN1bHRzKTsKIAotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Fubm90YXRpb25zKEJ1aWxkQ29udGV4dFtdIHJlc3VsdHMpIHsKK3Byb3RlY3RlZCB2b2lkIHByb2Nlc3NBbm5vdGF0aW9ucyhDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0W10gcmVzdWx0cykgewogCWJvb2xlYW4gaGFzQW5ub3RhdGlvblByb2Nlc3NvciA9IGZhbHNlOwogCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHMubGVuZ3RoOyAhaGFzQW5ub3RhdGlvblByb2Nlc3NvciAmJiBpIDwgbDsgaSsrKQogCQloYXNBbm5vdGF0aW9uUHJvY2Vzc29yID0gdGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHNbaV0uaXNBbm5vdGF0aW9uUHJvY2Vzc29yKCk7CkBAIC01ODgsNyArNjE5LDcgQEAKIAogCWJvb2xlYW4gZm91bmRBbm5vdGF0aW9ucyA9IHRoaXMuZmlsZXNXaXRoQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiB0aGlzLmZpbGVzV2l0aEFubm90YXRpb25zLmVsZW1lbnRTaXplID4gMDsKIAlmb3IgKGludCBpID0gcmVzdWx0cy5sZW5ndGg7IC0taSA+PSAwOykKLQkJKChDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0KSByZXN1bHRzW2ldKS5yZXNldChmb3VuZEFubm90YXRpb25zICYmIHRoaXMuZmlsZXNXaXRoQW5ub3RhdGlvbnMuaW5jbHVkZXMocmVzdWx0c1tpXS5zb3VyY2VGaWxlKSk7CisJCXJlc3VsdHNbaV0ucmVzZXQoZm91bmRBbm5vdGF0aW9ucyAmJiB0aGlzLmZpbGVzV2l0aEFubm90YXRpb25zLmluY2x1ZGVzKHJlc3VsdHNbaV0uc291cmNlRmlsZSkpOwogCiAJLy8gZXZlbiBpZiBubyBmaWxlcyBoYXZlIGFubm90YXRpb25zLCBtdXN0IHN0aWxsIHRlbGwgZXZlcnkgYW5ub3RhdGlvbiBwcm9jZXNzb3IgaW4gY2FzZSB0aGUgZmlsZSB1c2VkIHRvIGhhdmUgdGhlbQogCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQpAQCAtNjA5LDcgKzY0MCw3IEBACiAJCQlzdG9yZVByb2JsZW1zRm9yKHJlc3VsdC5zb3VyY2VGaWxlLCBwcm9ibGVtcyk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJLy8gbXVzdCBjb250aW51ZSB3aXRoIGNvbXBpbGUgbG9vcCBzbyBqdXN0IGxvZyB0aGUgQ29yZUV4Y2VwdGlvbgotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCVV0aWwubG9nKGUsICJKYXZhQnVpbGRlciBsb2dnaW5nIENvbXBpbGF0aW9uUGFydGljaXBhbnQncyBDb3JlRXhjZXB0aW9uIHRvIGhlbHAgZGVidWdnaW5nIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIApAQCAtNjMwLDggKzY2MSw4IEBACiAgKgkgLSBpdHMgcHJpb3JpdHkgcmVmbGVjdHMgdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtCiAgKgkgLSBpdHMgcmFuZ2UgaXMgdGhlIHByb2JsZW0ncyByYW5nZQogICoJIC0gaXQgaGFzIGFuIGV4dHJhIGF0dHJpYnV0ZSAiSUQiIHdoaWNoIGhvbGRzIHRoZSBwcm9ibGVtJ3MgaWQKLSAqICAgLSBpdCdzIEdFTkVSQVRFRF9CWSBhdHRyaWJ1dGUgaXMgcG9zaXRpb25lZCB0byBKYXZhQnVpbGRlci5HRU5FUkFURURfQlkgaWYKLSAqICAgICB0aGUgcHJvYmxlbSB3YXMgZ2VuZXJhdGVkIGJ5IEpEVDsgZWxzZSB0aGUgR0VORVJBVEVEX0JZIGF0dHJpYnV0ZSBpcyAKKyAqICAgLSBpdCdzIHtAbGluayBJTWFya2VyI1NPVVJDRV9JRH0gYXR0cmlidXRlIGlzIHBvc2l0aW9uZWQgdG8ge0BsaW5rIEphdmFCdWlsZGVyI1NPVVJDRV9JRH0gaWYKKyAqICAgICB0aGUgcHJvYmxlbSB3YXMgZ2VuZXJhdGVkIGJ5IEpEVDsgZWxzZSB0aGUge0BsaW5rIElNYXJrZXIjU09VUkNFX0lEfSBhdHRyaWJ1dGUgaXMKICAqICAgICBjYXJyaWVkIGZyb20gdGhlIHByb2JsZW0gdG8gdGhlIG1hcmtlciBpbiBleHRyYSBhdHRyaWJ1dGVzLCBpZiBwcmVzZW50LgogICovCiBwcm90ZWN0ZWQgdm9pZCBzdG9yZVByb2JsZW1zRm9yKFNvdXJjZUZpbGUgc291cmNlRmlsZSwgQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKQEAgLTY1MSwxMCArNjgyLDEwIEBACiAJCQlTdHJpbmcgbWlzc2luZ0NsYXNzZmlsZU5hbWUgPSBwcm9ibGVtLmdldEFyZ3VtZW50cygpWzBdOwogCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2luY29tcGxldGVDbGFzc1BhdGgsIG1pc3NpbmdDbGFzc2ZpbGVOYW1lKSk7Ci0JCQlib29sZWFuIGlzSW52YWxpZENsYXNzcGF0aEVycm9yID0gSmF2YUNvcmUuRVJST1IuZXF1YWxzKGphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCB0cnVlKSk7CisJCQlib29sZWFuIGlzSW52YWxpZENsYXNzcGF0aEVycm9yID0gSmF2YUNvcmUuRVJST1IuZXF1YWxzKHRoaXMuamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSU5DT01QTEVURV9DTEFTU1BBVEgsIHRydWUpKTsKIAkJCS8vIGluc2VydCBleHRyYSBjbGFzc3BhdGggcHJvYmxlbSwgYW5kIG1ha2UgaXQgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0IChvcHRpb25hbCkKLQkJCWlmIChpc0ludmFsaWRDbGFzc3BhdGhFcnJvciAmJiBKYXZhQ29yZS5BQk9SVC5lcXVhbHMoamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCwgdHJ1ZSkpKSB7Ci0JCQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0ZvcihqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKKwkJCWlmIChpc0ludmFsaWRDbGFzc3BhdGhFcnJvciAmJiBKYXZhQ29yZS5BQk9SVC5lcXVhbHModGhpcy5qYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRILCB0cnVlKSkpIHsKKwkJCQlKYXZhQnVpbGRlci5yZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKHRoaXMuamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOyAvLyBtYWtlIHRoaXMgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0CiAJCQkJdGhpcy5rZWVwU3RvcmluZ1Byb2JsZW1NYXJrZXJzID0gZmFsc2U7CiAJCQl9CiAJCQlJTWFya2VyIG1hcmtlciA9IHRoaXMuamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CkBAIC02OTgsMTEgKzcyOSwxMiBAQAogCQkJYWxsVmFsdWVzW2luZGV4KytdID0gcHJvYmxlbS5pc0Vycm9yKCkgPyBTX0VSUk9SIDogU19XQVJOSU5HOyAvLyBzZXZlcml0eQogCQkJYWxsVmFsdWVzW2luZGV4KytdID0gbmV3IEludGVnZXIoaWQpOyAvLyBJRAogCQkJYWxsVmFsdWVzW2luZGV4KytdID0gbmV3IEludGVnZXIocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKTsgLy8gc3RhcnQKLQkJCWFsbFZhbHVlc1tpbmRleCsrXSA9IG5ldyBJbnRlZ2VyKHByb2JsZW0uZ2V0U291cmNlRW5kKCkgKyAxKTsgLy8gZW5kCisJCQlpbnQgZW5kID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKKwkJCWFsbFZhbHVlc1tpbmRleCsrXSA9IG5ldyBJbnRlZ2VyKGVuZCA+IDAgPyBlbmQgKyAxIDogZW5kKTsgLy8gZW5kCiAJCQlhbGxWYWx1ZXNbaW5kZXgrK10gPSBuZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSk7IC8vIGxpbmUKIAkJCWFsbFZhbHVlc1tpbmRleCsrXSA9IFV0aWwuZ2V0UHJvYmxlbUFyZ3VtZW50c0Zvck1hcmtlcihwcm9ibGVtLmdldEFyZ3VtZW50cygpKTsgLy8gYXJndW1lbnRzCiAJCQlhbGxWYWx1ZXNbaW5kZXgrK10gPSBuZXcgSW50ZWdlcihwcm9ibGVtLmdldENhdGVnb3J5SUQoKSk7IC8vIGNhdGVnb3J5IElECi0JCQkvLyBHRU5FUkFURURfQlkgYXR0cmlidXRlIGZvciBKRFQgcHJvYmxlbXMKKwkJCS8vIFNPVVJDRV9JRCBhdHRyaWJ1dGUgZm9yIEpEVCBwcm9ibGVtcwogCQkJaWYgKG1hbmFnZWRMZW5ndGggPiAwKQogCQkJCWFsbFZhbHVlc1tpbmRleCsrXSA9IEphdmFCdWlsZGVyLlNPVVJDRV9JRDsKIAkJCS8vIG9wdGlvbmFsIGV4dHJhIGF0dHJpYnV0ZXMKQEAgLTc2Niw3ICs3OTgsNyBAQAogCUNhdGVnb3JpemVkUHJvYmxlbVtdIHByb2JsZW1zID0gcmVzdWx0LmdldFByb2JsZW1zKCk7CiAJaWYgKHByb2JsZW1zID09IG51bGwgfHwgcHJvYmxlbXMubGVuZ3RoID09IDApIHJldHVybjsKIAotCW5vdGlmaWVyLnVwZGF0ZVByb2JsZW1Db3VudHMocHJvYmxlbXMpOworCXRoaXMubm90aWZpZXIudXBkYXRlUHJvYmxlbUNvdW50cyhwcm9ibGVtcyk7CiAJc3RvcmVQcm9ibGVtc0Zvcihzb3VyY2VGaWxlLCBwcm9ibGVtcyk7CiB9CiAKQEAgLTc4MCw3ICs4MTIsNyBAQAogcHJvdGVjdGVkIGNoYXJbXSB3cml0ZUNsYXNzRmlsZShDbGFzc0ZpbGUgY2xhc3NGaWxlLCBTb3VyY2VGaWxlIGNvbXBpbGF0aW9uVW5pdCwgYm9vbGVhbiBpc1RvcExldmVsVHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCVN0cmluZyBmaWxlTmFtZSA9IG5ldyBTdHJpbmcoY2xhc3NGaWxlLmZpbGVOYW1lKCkpOyAvLyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSAicDEvcDIvQSIKIAlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVOYW1lKTsKLQlJQ29udGFpbmVyIG91dHB1dEZvbGRlciA9IGNvbXBpbGF0aW9uVW5pdC5zb3VyY2VMb2NhdGlvbi5iaW5hcnlGb2xkZXI7IAorCUlDb250YWluZXIgb3V0cHV0Rm9sZGVyID0gY29tcGlsYXRpb25Vbml0LnNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcjsKIAlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG91dHB1dEZvbGRlcjsKIAlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7CiAJCWNvbnRhaW5lciA9IGNyZWF0ZUZvbGRlcihmaWxlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIG91dHB1dEZvbGRlcik7CkBAIC03ODgsMjcgKzgyMCwyOCBAQAogCX0KIAogCUlGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKFN1ZmZpeENvbnN0YW50cy5FWFRFTlNJT05fY2xhc3MpKTsKLQl3cml0ZUNsYXNzRmlsZUJ5dGVzKGNsYXNzRmlsZS5nZXRCeXRlcygpLCBmaWxlLCBmaWxlTmFtZSwgaXNUb3BMZXZlbFR5cGUsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JaWYgKGNsYXNzRmlsZS5pc1NoYXJlZCkgewotCQl0aGlzLmNvbXBpbGVyLmxvb2t1cEVudmlyb25tZW50LmNsYXNzRmlsZVBvb2wucmVsZWFzZShjbGFzc0ZpbGUpOwotCX0KKwl3cml0ZUNsYXNzRmlsZUNvbnRlbnRzKGNsYXNzRmlsZSwgZmlsZSwgZmlsZU5hbWUsIGlzVG9wTGV2ZWxUeXBlLCBjb21waWxhdGlvblVuaXQpOwogCS8vIGFuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZSBhcyBpbiBZIG9yIFkkTQogCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpLnRvQ2hhckFycmF5KCk7CiB9CiAKLXByb3RlY3RlZCB2b2lkIHdyaXRlQ2xhc3NGaWxlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBJRmlsZSBmaWxlLCBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUsIGJvb2xlYW4gaXNUb3BMZXZlbFR5cGUsIFNvdXJjZUZpbGUgY29tcGlsYXRpb25Vbml0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCB3cml0ZUNsYXNzRmlsZUNvbnRlbnRzKENsYXNzRmlsZSBjbGFzc0ZpbGUsIElGaWxlIGZpbGUsIFN0cmluZyBxdWFsaWZpZWRGaWxlTmFtZSwgYm9vbGVhbiBpc1RvcExldmVsVHlwZSwgU291cmNlRmlsZSBjb21waWxhdGlvblVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKy8vCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0oCisvLwkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjbGFzc0ZpbGUuaGVhZGVyLCAwLCBjbGFzc0ZpbGUuaGVhZGVyT2Zmc2V0KSwKKy8vCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNsYXNzRmlsZS5jb250ZW50cywgMCwgY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KSk7CisJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY2xhc3NGaWxlLmdldEJ5dGVzKCkpOwogCWlmIChmaWxlLmV4aXN0cygpKSB7CiAJCS8vIERlYWwgd2l0aCBzaGFyZWQgb3V0cHV0IGZvbGRlcnMuLi4gbGFzdCBvbmUgd2lucy4uLiBubyBjb2xsaXNpb24gY2FzZXMgZGV0ZWN0ZWQKIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIGNoYW5nZWQgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKIAkJaWYgKCFmaWxlLmlzRGVyaXZlZCgpKQotCQkJZmlsZS5zZXREZXJpdmVkKHRydWUpOwotCQlmaWxlLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIHRydWUsIGZhbHNlLCBudWxsKTsKKwkJCWZpbGUuc2V0RGVyaXZlZCh0cnVlLCBudWxsKTsKKwkJZmlsZS5zZXRDb250ZW50cyhpbnB1dCwgdHJ1ZSwgZmFsc2UsIG51bGwpOwogCX0gZWxzZSB7CiAJCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCB3cml0ZXMgb3V0IHRoZSBieXRlcyBmb3IgdGhlIG5ldyBjbGFzcyBmaWxlLi4uCiAJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBuZXcgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKLQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLkRFUklWRUQsIG51bGwpOworCQlmaWxlLmNyZWF0ZShpbnB1dCwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLkRFUklWRUQsIG51bGwpOwogCX0KIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0FkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbi5qYXZhCmluZGV4IDI1OTcyNzMuLjliZjg5MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw5ICsxNCw5IEBACiAKIGNoYXJbXVtdIGRlZmluZWRUeXBlTmFtZXM7CiAKLXByb3RlY3RlZCBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24oY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcywgY2hhcltdW11bXSBxdWFsaWZpZWRSZWZlcmVuY2VzLCBjaGFyW11bXSBzaW1wbGVOYW1lUmVmZXJlbmNlcykgewotCXN1cGVyKHF1YWxpZmllZFJlZmVyZW5jZXMsIHNpbXBsZU5hbWVSZWZlcmVuY2VzKTsKLQl0aGlzLmRlZmluZWRUeXBlTmFtZXMgPSBkZWZpbmVkVHlwZU5hbWVzOyAvLyBkbyBub3QgYm90aGVyIGludGVybmluZyBtZW1iZXIgdHlwZSBuYW1lcyAoaWUuICdBJE0nKQorcHJvdGVjdGVkIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbihjaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzLCBjaGFyW11bXVtdIHF1YWxpZmllZFJlZmVyZW5jZXMsIGNoYXJbXVtdIHNpbXBsZU5hbWVSZWZlcmVuY2VzLCBjaGFyW11bXSByb290UmVmZXJlbmNlcykgeworCXN1cGVyKHF1YWxpZmllZFJlZmVyZW5jZXMsIHNpbXBsZU5hbWVSZWZlcmVuY2VzLCByb290UmVmZXJlbmNlcyk7CisJdGhpcy5kZWZpbmVkVHlwZU5hbWVzID0gZGVmaW5lZFR5cGVOYW1lczsgLy8gZG8gbm90IGJvdGhlciBpbnRlcm5pbmcgbWVtYmVyIHR5cGUgbmFtZXMgKGkuZS4gJ0EkTScpCiB9CiB9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YQppbmRleCAwNjE1NTIwLi41ODkzZTM4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0JhdGNoSW1hZ2VCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CYXRjaEltYWdlQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJTdGF0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIApAQCAtNDAsMjIgKzQxLDIyIEBACiAJCVN5c3RlbS5vdXQucHJpbnRsbigiRlVMTCBidWlsZCIpOyAvLyROT04tTkxTLTEkCiAKIAl0cnkgewotCQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY2xlYW5pbmdPdXRwdXQsIHRoaXMuamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKSk7Ci0JCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOworCQl0aGlzLm5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jbGVhbmluZ091dHB1dCwgdGhpcy5qYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsKKwkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcih0aGlzLmphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0KTsKIAkJY2xlYW5PdXRwdXRGb2xkZXJzKHRydWUpOwotCQlub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMDVmKTsKKwkJdGhpcy5ub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMDVmKTsKIAotCQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJ1aWxkX2FuYWx5emluZ1NvdXJjZXMpOyAKKwkJdGhpcy5ub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJ1aWxkX2FuYWx5emluZ1NvdXJjZXMpOwogCQlBcnJheUxpc3Qgc291cmNlRmlsZXMgPSBuZXcgQXJyYXlMaXN0KDMzKTsKIAkJYWRkQWxsU291cmNlRmlsZXMoc291cmNlRmlsZXMpOwotCQlub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMTBmKTsKKwkJdGhpcy5ub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMTBmKTsKIAogCQlpZiAoc291cmNlRmlsZXMuc2l6ZSgpID4gMCkgewogCQkJU291cmNlRmlsZVtdIGFsbFNvdXJjZUZpbGVzID0gbmV3IFNvdXJjZUZpbGVbc291cmNlRmlsZXMuc2l6ZSgpXTsKIAkJCXNvdXJjZUZpbGVzLnRvQXJyYXkoYWxsU291cmNlRmlsZXMpOwogCi0JCQlub3RpZmllci5zZXRQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdCgwLjc1ZiAvIGFsbFNvdXJjZUZpbGVzLmxlbmd0aCk7Ci0JCQl3b3JrUXVldWUuYWRkQWxsKGFsbFNvdXJjZUZpbGVzKTsKKwkJCXRoaXMubm90aWZpZXIuc2V0UHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQoMC43NWYgLyBhbGxTb3VyY2VGaWxlcy5sZW5ndGgpOworCQkJdGhpcy53b3JrUXVldWUuYWRkQWxsKGFsbFNvdXJjZUZpbGVzKTsKIAkJCWNvbXBpbGUoYWxsU291cmNlRmlsZXMpOwogCiAJCQlpZiAodGhpcy50eXBlTG9jYXRvcnNXaXRoVW5kZWZpbmVkVHlwZXMgIT0gbnVsbCkKQEAgLTY1LDExICs2NiwxMyBAQAogCQkJCXRoaXMuaW5jcmVtZW50YWxCdWlsZGVyLmJ1aWxkQWZ0ZXJCYXRjaEJ1aWxkKCk7CiAJCX0KIAotCQlpZiAoamF2YUJ1aWxkZXIuamF2YVByb2plY3QuaGFzQ3ljbGVNYXJrZXIoKSkKLQkJCWphdmFCdWlsZGVyLm11c3RQcm9wYWdhdGVTdHJ1Y3R1cmFsQ2hhbmdlcygpOworCQlpZiAodGhpcy5qYXZhQnVpbGRlci5qYXZhUHJvamVjdC5oYXNDeWNsZU1hcmtlcigpKQorCQkJdGhpcy5qYXZhQnVpbGRlci5tdXN0UHJvcGFnYXRlU3RydWN0dXJhbENoYW5nZXMoKTsKIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJdGhyb3cgaW50ZXJuYWxFeGNlcHRpb24oZSk7CiAJfSBmaW5hbGx5IHsKKwkJaWYgKEphdmFCdWlsZGVyLlNIT1dfU1RBVFMpCisJCQlwcmludFN0YXRzKCk7CiAJCWNsZWFuVXAoKTsKIAl9CiB9CkBAIC04MSwyOCArODQsMjggQEAKIAogcHJvdGVjdGVkIHZvaWQgY2xlYW5PdXRwdXRGb2xkZXJzKGJvb2xlYW4gY29weUJhY2spIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAlib29sZWFuIGRlbGV0ZUFsbCA9IEphdmFDb3JlLkNMRUFOLmVxdWFscygKLQkJamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCB0cnVlKSk7CisJCXRoaXMuamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSLCB0cnVlKSk7CiAJaWYgKGRlbGV0ZUFsbCkgewogCQlpZiAodGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHMgIT0gbnVsbCkKIAkJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5qYXZhQnVpbGRlci5wYXJ0aWNpcGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQkJCXRoaXMuamF2YUJ1aWxkZXIucGFydGljaXBhbnRzW2ldLmNsZWFuU3RhcnRpbmcodGhpcy5qYXZhQnVpbGRlci5qYXZhUHJvamVjdCk7CiAKLQkJQXJyYXlMaXN0IHZpc2l0ZWQgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZUxvY2F0aW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCW5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jbGVhbmluZ091dHB1dCwgdGhpcy5qYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsgCi0JCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBzb3VyY2VMb2NhdGlvbiA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwkJQXJyYXlMaXN0IHZpc2l0ZWQgPSBuZXcgQXJyYXlMaXN0KHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQl0aGlzLm5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9jbGVhbmluZ091dHB1dCwgdGhpcy5qYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsKKwkJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IHNvdXJjZUxvY2F0aW9uID0gdGhpcy5zb3VyY2VMb2NhdGlvbnNbaV07CiAJCQlpZiAoc291cmNlTG9jYXRpb24uaGFzSW5kZXBlbmRlbnRPdXRwdXRGb2xkZXIpIHsKIAkJCQlJQ29udGFpbmVyIG91dHB1dEZvbGRlciA9IHNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcjsKIAkJCQlpZiAoIXZpc2l0ZWQuY29udGFpbnMob3V0cHV0Rm9sZGVyKSkgewogCQkJCQl2aXNpdGVkLmFkZChvdXRwdXRGb2xkZXIpOwotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gb3V0cHV0Rm9sZGVyLm1lbWJlcnMoKTsgCisJCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBvdXRwdXRGb2xkZXIubWVtYmVycygpOwogCQkJCQlmb3IgKGludCBqID0gMCwgbSA9IG1lbWJlcnMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAJCQkJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tqXTsKIAkJCQkJCWlmICghbWVtYmVyLmlzRGVyaXZlZCgpKSB7CiAJCQkJCQkJbWVtYmVyLmFjY2VwdCgKIAkJCQkJCQkJbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CiAJCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQlyZXNvdXJjZS5zZXREZXJpdmVkKHRydWUpOworCQkJCQkJCQkJCXJlc291cmNlLnNldERlcml2ZWQodHJ1ZSwgbnVsbCk7CiAJCQkJCQkJCQkJcmV0dXJuIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQpAQCAtMTExLDcgKzExNCw3IEBACiAJCQkJCQltZW1iZXIuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJCQkJaWYgKGNvcHlCYWNrKQogCQkJCQljb3B5RXh0cmFSZXNvdXJjZXNCYWNrKHNvdXJjZUxvY2F0aW9uLCB0cnVlKTsKIAkJCX0gZWxzZSB7CkBAIC0xMzMsNiArMTM2LDggQEAKIAkJCQkJCQkJCWlmIChleGNsdXNpb25QYXR0ZXJucyAhPSBudWxsIHx8IGluY2x1c2lvblBhdHRlcm5zICE9IG51bGwpCiAJCQkJCQkJCQkJaWYgKFV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIGZhbHNlKSkKIAkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJaWYgKCFyZXNvdXJjZS5pc0Rlcml2ZWQoKSkKKwkJCQkJCQkJCQlyZXNvdXJjZS5zZXREZXJpdmVkKHRydWUsIG51bGwpOwogCQkJCQkJCQkJcmVzb3VyY2UuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTQwLDIyICsxNDUsMjIgQEAKIAkJCQkJCQlpZiAoZXhjbHVzaW9uUGF0dGVybnMgIT0gbnVsbCAmJiBpbmNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSAvLyBtdXN0IHdhbGsgY2hpbGRyZW4gaWYgaW5jbHVzaW9uUGF0dGVybnMgIT0gbnVsbAogCQkJCQkJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHByb3h5LnJlcXVlc3RGdWxsUGF0aCgpLCBudWxsLCBleGNsdXNpb25QYXR0ZXJucywgdHJ1ZSkpCiAJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCQkJCQlCYXRjaEltYWdlQnVpbGRlci50aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCQl9CiAJCQkJCX0sCiAJCQkJCUlSZXNvdXJjZS5OT05FCiAJCQkJKTsKLQkJCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQkJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAkJCX0KLQkJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJCX0KIAl9IGVsc2UgaWYgKGNvcHlCYWNrKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBzb3VyY2VMb2NhdGlvbiA9IHRoaXMuc291cmNlTG9jYXRpb25zW2ldOwogCQkJaWYgKHNvdXJjZUxvY2F0aW9uLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyKQogCQkJCWNvcHlFeHRyYVJlc291cmNlc0JhY2soc291cmNlTG9jYXRpb24sIGZhbHNlKTsKLQkJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJCX0KIAl9CiB9CkBAIC0xNzcsMTIgKzE4MiwxMiBAQAogCS8vIFdoZW4sIGlmIGV2ZXIsIGRvZXMgYSBidWlsZGVyIG5lZWQgdG8gY29weSByZXNvdXJjZXMgZmlsZXMgKG5vdCAuamF2YSBvciAuY2xhc3MpIGludG8gdGhlIG91dHB1dCBmb2xkZXI/CiAJLy8gSWYgd2Ugd2lwZSB0aGUgb3V0cHV0IGZvbGRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWlsZCB0aGVuIGFsbCAnZXh0cmEnIHJlc291cmNlcyBtdXN0IGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlci4KIAotCW5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYnVpbGRfY29weWluZ1Jlc291cmNlcyk7IAorCXRoaXMubm90aWZpZXIuc3ViVGFzayhNZXNzYWdlcy5idWlsZF9jb3B5aW5nUmVzb3VyY2VzKTsKIAlmaW5hbCBpbnQgc2VnbWVudENvdW50ID0gc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7CiAJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSBzb3VyY2VMb2NhdGlvbi5leGNsdXNpb25QYXR0ZXJuczsKIAlmaW5hbCBjaGFyW11bXSBpbmNsdXNpb25QYXR0ZXJucyA9IHNvdXJjZUxvY2F0aW9uLmluY2x1c2lvblBhdHRlcm5zOwogCWZpbmFsIElDb250YWluZXIgb3V0cHV0Rm9sZGVyID0gc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyOwotCWZpbmFsIGJvb2xlYW4gaXNBbHNvUHJvamVjdCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5lcXVhbHMoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOworCWZpbmFsIGJvb2xlYW4gaXNBbHNvUHJvamVjdCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5lcXVhbHModGhpcy5qYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CiAJc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmFjY2VwdCgKIAkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKIAkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CkBAIC0xOTMsNyArMTk4LDcgQEAKIAkJCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShwcm94eS5nZXROYW1lKCkpKSByZXR1cm4gZmFsc2U7CiAKIAkJCQkJCXJlc291cmNlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCQlpZiAoamF2YUJ1aWxkZXIuZmlsdGVyRXh0cmFSZXNvdXJjZShyZXNvdXJjZSkpIHJldHVybiBmYWxzZTsKKwkJCQkJCWlmIChCYXRjaEltYWdlQnVpbGRlci50aGlzLmphdmFCdWlsZGVyLmZpbHRlckV4dHJhUmVzb3VyY2UocmVzb3VyY2UpKSByZXR1cm4gZmFsc2U7CiAJCQkJCQlpZiAoZXhjbHVzaW9uUGF0dGVybnMgIT0gbnVsbCB8fCBpbmNsdXNpb25QYXR0ZXJucyAhPSBudWxsKQogCQkJCQkJCWlmIChVdGlsLmlzRXhjbHVkZWQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zLCBmYWxzZSkpCiAJCQkJCQkJCXJldHVybiBmYWxzZTsKQEAgLTIwNywxOSArMjEyLDE4IEBACiAJCQkJCQkJCWNyZWF0ZVByb2JsZW1Gb3IoCiAJCQkJCQkJCQlyZXNvdXJjZSwKIAkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2R1cGxpY2F0ZVJlc291cmNlLCBpZCksIAotCQkJCQkJCQkJamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIHRydWUpKTsKKwkJCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfZHVwbGljYXRlUmVzb3VyY2UsIGlkKSwKKwkJCQkJCQkJCUJhdGNoSW1hZ2VCdWlsZGVyLnRoaXMuamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIHRydWUpKTsKIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJCX0KIAkJCQkJCQljb3BpZWRSZXNvdXJjZS5kZWxldGUoSVJlc291cmNlLkZPUkNFLCBudWxsKTsgLy8gbGFzdCBvbmUgd2lucwogCQkJCQkJfQogCQkJCQkJY3JlYXRlRm9sZGVyKHBhcnRpYWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgb3V0cHV0Rm9sZGVyKTsgLy8gZW5zdXJlIHBhY2thZ2UgZm9sZGVyIGV4aXN0cwotCQkJCQkJcmVzb3VyY2UuY29weShjb3BpZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuREVSSVZFRCwgbnVsbCk7Ci0JCQkJCQlVdGlsLnNldFJlYWRPbmx5KGNvcGllZFJlc291cmNlLCBmYWxzZSk7IC8vIGp1c3QgaW4gY2FzZSB0aGUgb3JpZ2luYWwgd2FzIHJlYWQgb25seQorCQkJCQkJY29weVJlc291cmNlKHJlc291cmNlLCBjb3BpZWRSZXNvdXJjZSk7CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CiAJCQkJCQlyZXNvdXJjZSA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlckV4dHJhUmVzb3VyY2UocmVzb3VyY2UpKSByZXR1cm4gZmFsc2U7CisJCQkJCQlpZiAoQmF0Y2hJbWFnZUJ1aWxkZXIudGhpcy5qYXZhQnVpbGRlci5maWx0ZXJFeHRyYVJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuIGZhbHNlOwogCQkJCQkJaWYgKGlzQWxzb1Byb2plY3QgJiYgaXNFeGNsdWRlZEZyb21Qcm9qZWN0KHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKSByZXR1cm4gZmFsc2U7IC8vIHRoZSBzb3VyY2VGb2xkZXIgPT0gcHJvamVjdAogCQkJCQkJaWYgKGV4Y2x1c2lvblBhdHRlcm5zICE9IG51bGwgJiYgaW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgLy8gbXVzdCB3YWxrIGNoaWxkcmVuIGlmIGluY2x1c2lvblBhdHRlcm5zICE9IG51bGwKIAkJCQkJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG51bGwsIGV4Y2x1c2lvblBhdHRlcm5zLCB0cnVlKSkKQEAgLTIzMyw4ICsyMzcsOCBAQAogfQogCiBwcm90ZWN0ZWQgSVJlc291cmNlIGZpbmRPcmlnaW5hbFJlc291cmNlKElQYXRoIHBhcnRpYWxQYXRoKSB7Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IHNvdXJjZUxvY2F0aW9uID0gc291cmNlTG9jYXRpb25zW2ldOworCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IHNvdXJjZUxvY2F0aW9uID0gdGhpcy5zb3VyY2VMb2NhdGlvbnNbaV07CiAJCWlmIChzb3VyY2VMb2NhdGlvbi5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlcikgewogCQkJSVJlc291cmNlIG9yaWdpbmFsUmVzb3VyY2UgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZ2V0RmlsZShwYXJ0aWFsUGF0aCk7CiAJCQlpZiAob3JpZ2luYWxSZXNvdXJjZS5leGlzdHMoKSkgcmV0dXJuIG9yaWdpbmFsUmVzb3VyY2U7CkBAIC0yNDMsNiArMjQ3LDIwIEBACiAJcmV0dXJuIG51bGw7CiB9CiAKK3ByaXZhdGUgdm9pZCBwcmludFN0YXRzKCkgeworCWlmICh0aGlzLmNvbXBpbGVyID09IG51bGwpIHJldHVybjsKKwlDb21waWxlclN0YXRzIGNvbXBpbGVyU3RhdHMgPSB0aGlzLmNvbXBpbGVyLnN0YXRzOworCWxvbmcgdGltZSA9IGNvbXBpbGVyU3RhdHMuZWxhcHNlZFRpbWUoKTsKKwlsb25nIGxpbmVDb3VudCA9IGNvbXBpbGVyU3RhdHMubGluZUNvdW50OworCWRvdWJsZSBzcGVlZCA9ICgoaW50KSAobGluZUNvdW50ICogMTAwMDAuMCAvIHRpbWUpKSAvIDEwLjA7CisJU3lzdGVtLm91dC5wcmludGxuKCI+RlVMTCBCVUlMRCBTVEFUUyBmb3I6ICIrdGhpcy5qYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCVN5c3RlbS5vdXQucHJpbnRsbigiPiAgIGNvbXBpbGVkICIgKyBsaW5lQ291bnQgKyAiIGxpbmVzIGluICIgKyB0aW1lICsgIm1zOiIgKyBzcGVlZCArICJsaW5lcy9zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKKwlTeXN0ZW0ub3V0LnByaW50KCI+ICAgcGFyc2U6ICIgKyBjb21waWxlclN0YXRzLnBhcnNlVGltZSArICIgbXMgKCIgKyAoKGludCkgKGNvbXBpbGVyU3RhdHMucGFyc2VUaW1lICogMTAwMC4wIC8gdGltZSkpIC8gMTAuMCArICIlKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCVN5c3RlbS5vdXQucHJpbnQoIiwgcmVzb2x2ZTogIiArIGNvbXBpbGVyU3RhdHMucmVzb2x2ZVRpbWUgKyAiIG1zICgiICsgKChpbnQpIChjb21waWxlclN0YXRzLnJlc29sdmVUaW1lICogMTAwMC4wIC8gdGltZSkpIC8gMTAuMCArICIlKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCVN5c3RlbS5vdXQucHJpbnQoIiwgYW5hbHl6ZTogIiArIGNvbXBpbGVyU3RhdHMuYW5hbHl6ZVRpbWUgKyAiIG1zICgiICsgKChpbnQpIChjb21waWxlclN0YXRzLmFuYWx5emVUaW1lICogMTAwMC4wIC8gdGltZSkpIC8gMTAuMCArICIlKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCVN5c3RlbS5vdXQucHJpbnRsbigiLCBnZW5lcmF0ZTogIiArIGNvbXBpbGVyU3RhdHMuZ2VuZXJhdGVUaW1lICsgIiBtcyAoIiArICgoaW50KSAoY29tcGlsZXJTdGF0cy5nZW5lcmF0ZVRpbWUgKiAxMDAwLjAgLyB0aW1lKSkgLyAxMC4wICsgIiUpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCit9CisKIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBbm5vdGF0aW9uUmVzdWx0cyhDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0W10gcmVzdWx0cykgewogCS8vIHRvIGNvbXBpbGUgdGhlIGNvbXBpbGF0aW9uIHBhcnRpY2lwYW50IHJlc3VsdHMsIHdlIG5lZWQgdG8gaW5jcmVtZW50YWxseSByZWNvbXBpbGUgYWxsIGFmZmVjdGVkIHR5cGVzCiAJLy8gd2hlbmV2ZXIgdGhlIGdlbmVyYXRlZCB0eXBlcyBhcmUgaW5pdGlhbGx5IGFkZGVkIG9yIHN0cnVjdHVyYWxseSBjaGFuZ2VkCkBAIC0yNTgsMTQgKzI3NiwxOSBAQAogCWlmICh0aGlzLmluY3JlbWVudGFsQnVpbGRlciA9PSBudWxsKQogCQl0aGlzLmluY3JlbWVudGFsQnVpbGRlciA9IG5ldyBJbmNyZW1lbnRhbEltYWdlQnVpbGRlcih0aGlzKTsKIAotCWZvciAoaW50IGkgPSB0aGlzLnNlY29uZGFyeVR5cGVzLnNpemUoKTsgLS1pID49MDspIHsKLQkJY2hhcltdIHNlY29uZGFyeVR5cGVOYW1lID0gKGNoYXJbXSkgdGhpcy5zZWNvbmRhcnlUeXBlcy5nZXQoaSk7CisJaW50IGNvdW50ID0gdGhpcy5zZWNvbmRhcnlUeXBlcy5zaXplKCk7CisJU3RyaW5nU2V0IHF1YWxpZmllZE5hbWVzID0gbmV3IFN0cmluZ1NldChjb3VudCAqIDIpOworCVN0cmluZ1NldCBzaW1wbGVOYW1lcyA9IG5ldyBTdHJpbmdTZXQoY291bnQpOworCVN0cmluZ1NldCByb290TmFtZXMgPSBuZXcgU3RyaW5nU2V0KDMpOworCXdoaWxlICgtLWNvdW50ID49MCkgeworCQljaGFyW10gc2Vjb25kYXJ5VHlwZU5hbWUgPSAoY2hhcltdKSB0aGlzLnNlY29uZGFyeVR5cGVzLmdldChjb3VudCk7CiAJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChudWxsLCBuZXcgU3RyaW5nKHNlY29uZGFyeVR5cGVOYW1lKSk7Ci0JCXRoaXMuaW5jcmVtZW50YWxCdWlsZGVyLmFkZERlcGVuZGVudHNPZihwYXRoLCBmYWxzZSk7CisJCXRoaXMuaW5jcmVtZW50YWxCdWlsZGVyLmFkZERlcGVuZGVudHNPZihwYXRoLCBmYWxzZSwgcXVhbGlmaWVkTmFtZXMsIHNpbXBsZU5hbWVzLCByb290TmFtZXMpOwogCX0KIAl0aGlzLmluY3JlbWVudGFsQnVpbGRlci5hZGRBZmZlY3RlZFNvdXJjZUZpbGVzKAotCQl0aGlzLmluY3JlbWVudGFsQnVpbGRlci5xdWFsaWZpZWRTdHJpbmdzLAotCQl0aGlzLmluY3JlbWVudGFsQnVpbGRlci5zaW1wbGVTdHJpbmdzLAorCQlxdWFsaWZpZWROYW1lcywKKwkJc2ltcGxlTmFtZXMsCisJCXJvb3ROYW1lcywKIAkJdGhpcy50eXBlTG9jYXRvcnNXaXRoVW5kZWZpbmVkVHlwZXMpOwogfQogCkBAIC0yODYsNiArMzA5LDYgQEAKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gImJhdGNoIGltYWdlIGJ1aWxkZXIgZm9yOlxuXHRuZXcgc3RhdGU6ICIgKyBuZXdTdGF0ZTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiYmF0Y2ggaW1hZ2UgYnVpbGRlciBmb3I6XG5cdG5ldyBzdGF0ZTogIiArIHRoaXMubmV3U3RhdGU7IC8vJE5PTi1OTFMtMSQKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQnVpbGROb3RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CdWlsZE5vdGlmaWVyLmphdmEKaW5kZXggZGJlMTdiYy4uYWI3MmZkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CdWlsZE5vdGlmaWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CdWlsZE5vdGlmaWVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTksMTMgKzU5LDEzIEBACiAgKiBOb3RpZmljYXRpb24gYmVmb3JlIGEgY29tcGlsZSB0aGF0IGEgdW5pdCBpcyBhYm91dCB0byBiZSBjb21waWxlZC4KICAqLwogcHVibGljIHZvaWQgYWJvdXRUb0NvbXBpbGUoU291cmNlRmlsZSB1bml0KSB7Ci0JU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2NvbXBpbGluZywgdW5pdC5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKTsgCisJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2NvbXBpbGluZywgdW5pdC5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKTsKIAlzdWJUYXNrKG1lc3NhZ2UpOwogfQogCiBwdWJsaWMgdm9pZCBiZWdpbigpIHsKLQlpZiAobW9uaXRvciAhPSBudWxsKQotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdG90YWxXb3JrKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLm1vbml0b3IgIT0gbnVsbCkKKwkJdGhpcy5tb25pdG9yLmJlZ2luVGFzaygiIiwgdGhpcy50b3RhbFdvcmspOyAvLyROT04tTkxTLTEkCiAJdGhpcy5wcmV2aW91c1N1YnRhc2sgPSBudWxsOwogfQogCkBAIC03Myw3ICs3Myw3IEBACiAgKiBDaGVjayB3aGV0aGVyIHRoZSBidWlsZCBoYXMgYmVlbiBjYW5jZWxlZC4KICAqLwogcHVibGljIHZvaWQgY2hlY2tDYW5jZWwoKSB7Ci0JaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwlpZiAodGhpcy5tb25pdG9yICE9IG51bGwgJiYgdGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkKIAkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiB9CiAKQEAgLTgyLDEyICs4MiwxMiBAQAogICogTXVzdCB1c2UgdGhpcyBjYWxsIGluc3RlYWQgb2YgY2hlY2tDYW5jZWwoKSB3aGVuIHdpdGhpbiB0aGUgY29tcGlsZXIuCiAgKi8KIHB1YmxpYyB2b2lkIGNoZWNrQ2FuY2VsV2l0aGluQ29tcGlsZXIoKSB7Ci0JaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiAhY2FuY2VsbGluZykgeworCWlmICh0aGlzLm1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLm1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aGlzLmNhbmNlbGxpbmcpIHsKIAkJLy8gT25jZSB0aGUgY29tcGlsZXIgaGFzIGJlZW4gY2FuY2VsZWQsIGRvbid0IGNoZWNrIGFnYWluLgogCQlzZXRDYW5jZWxsaW5nKHRydWUpOwogCQkvLyBPbmx5IEFib3J0Q29tcGlsYXRpb24gY2FuIHN0b3AgdGhlIGNvbXBpbGVyIGNsZWFubHkuCiAJCS8vIFdlIGNoZWNrIGNhbmNlbGF0aW9uIGFnYWluIGZvbGxvd2luZyB0aGUgY2FsbCB0byBjb21waWxlLgotCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBudWxsKTsgCisJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHRydWUsIG51bGwpOwogCX0KIH0KIApAQCAtOTUsOSArOTUsOSBAQAogICogTm90aWZpY2F0aW9uIHdoaWxlIHdpdGhpbiBhIGNvbXBpbGUgdGhhdCBhIHVuaXQgaGFzIGZpbmlzaGVkIGJlaW5nIGNvbXBpbGVkLgogICovCiBwdWJsaWMgdm9pZCBjb21waWxlZChTb3VyY2VGaWxlIHVuaXQpIHsKLQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY29tcGlsaW5nLCB1bml0LnJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOyAKKwlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfY29tcGlsaW5nLCB1bml0LnJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwogCXN1YlRhc2sobWVzc2FnZSk7Ci0JdXBkYXRlUHJvZ3Jlc3NEZWx0YShwcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdCk7CisJdXBkYXRlUHJvZ3Jlc3NEZWx0YSh0aGlzLnByb2dyZXNzUGVyQ29tcGlsYXRpb25Vbml0KTsKIAljaGVja0NhbmNlbFdpdGhpbkNvbXBpbGVyKCk7CiB9CiAKQEAgLTEwOCw5ICsxMDgsOSBAQAogCUZpeGVkV2FybmluZ0NvdW50ID0gdGhpcy5maXhlZFdhcm5pbmdDb3VudDsKIAogCXVwZGF0ZVByb2dyZXNzKDEuMGYpOwotCXN1YlRhc2soTWVzc2FnZXMuYnVpbGRfZG9uZSk7IAotCWlmIChtb25pdG9yICE9IG51bGwpCi0JCW1vbml0b3IuZG9uZSgpOworCXN1YlRhc2soTWVzc2FnZXMuYnVpbGRfZG9uZSk7CisJaWYgKHRoaXMubW9uaXRvciAhPSBudWxsKQorCQl0aGlzLm1vbml0b3IuZG9uZSgpOwogCXRoaXMucHJldmlvdXNTdWJ0YXNrID0gbnVsbDsKIH0KIApAQCAtMTE4LDggKzExOCw4IEBACiAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2JsZW1zLgogICovCiBwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW1zTWVzc2FnZSgpIHsKLQlpbnQgbnVtTmV3ID0gbmV3RXJyb3JDb3VudCArIG5ld1dhcm5pbmdDb3VudDsKLQlpbnQgbnVtRml4ZWQgPSBmaXhlZEVycm9yQ291bnQgKyBmaXhlZFdhcm5pbmdDb3VudDsKKwlpbnQgbnVtTmV3ID0gdGhpcy5uZXdFcnJvckNvdW50ICsgdGhpcy5uZXdXYXJuaW5nQ291bnQ7CisJaW50IG51bUZpeGVkID0gdGhpcy5maXhlZEVycm9yQ291bnQgKyB0aGlzLmZpeGVkV2FybmluZ0NvdW50OwogCWlmIChudW1OZXcgPT0gMCAmJiBudW1GaXhlZCA9PSAwKSByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAogCWJvb2xlYW4gZGlzcGxheUJvdGggPSBudW1OZXcgPiAwICYmIG51bUZpeGVkID4gMDsKQEAgLTEyNyw0NyArMTI3LDQ3IEBACiAJYnVmZmVyLmFwcGVuZCgnKCcpOwogCWlmIChudW1OZXcgPiAwKSB7CiAJCS8vIChGb3VuZCB4IGVycm9ycyArIHkgd2FybmluZ3MpCi0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYnVpbGRfZm91bmRIZWFkZXIpOyAKKwkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5idWlsZF9mb3VuZEhlYWRlcik7CiAJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKGRpc3BsYXlCb3RoIHx8IG5ld0Vycm9yQ291bnQgPiAwKSB7Ci0JCQlpZiAobmV3RXJyb3JDb3VudCA9PSAxKQotCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYnVpbGRfb25lRXJyb3IpOyAKKwkJaWYgKGRpc3BsYXlCb3RoIHx8IHRoaXMubmV3RXJyb3JDb3VudCA+IDApIHsKKwkJCWlmICh0aGlzLm5ld0Vycm9yQ291bnQgPT0gMSkKKwkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJ1aWxkX29uZUVycm9yKTsKIAkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfbXVsdGlwbGVFcnJvcnMsIFN0cmluZy52YWx1ZU9mKG5ld0Vycm9yQ291bnQpKSk7IAotCQkJaWYgKGRpc3BsYXlCb3RoIHx8IG5ld1dhcm5pbmdDb3VudCA+IDApCisJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX211bHRpcGxlRXJyb3JzLCBTdHJpbmcudmFsdWVPZih0aGlzLm5ld0Vycm9yQ291bnQpKSk7CisJCQlpZiAoZGlzcGxheUJvdGggfHwgdGhpcy5uZXdXYXJuaW5nQ291bnQgPiAwKQogCQkJCWJ1ZmZlci5hcHBlbmQoIiArICIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJaWYgKGRpc3BsYXlCb3RoIHx8IG5ld1dhcm5pbmdDb3VudCA+IDApIHsKLQkJCWlmIChuZXdXYXJuaW5nQ291bnQgPT0gMSkKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJ1aWxkX29uZVdhcm5pbmcpOyAKKwkJaWYgKGRpc3BsYXlCb3RoIHx8IHRoaXMubmV3V2FybmluZ0NvdW50ID4gMCkgeworCQkJaWYgKHRoaXMubmV3V2FybmluZ0NvdW50ID09IDEpCisJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5idWlsZF9vbmVXYXJuaW5nKTsKIAkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfbXVsdGlwbGVXYXJuaW5ncywgU3RyaW5nLnZhbHVlT2YobmV3V2FybmluZ0NvdW50KSkpOyAKKwkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfbXVsdGlwbGVXYXJuaW5ncywgU3RyaW5nLnZhbHVlT2YodGhpcy5uZXdXYXJuaW5nQ291bnQpKSk7CiAJCX0KIAkJaWYgKG51bUZpeGVkID4gMCkKIAkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJaWYgKG51bUZpeGVkID4gMCkgewogCQkvLyAoRml4ZWQgeCBlcnJvcnMgKyB5IHdhcm5pbmdzKSBvciAoRm91bmQgeCBlcnJvcnMgKyB5IHdhcm5pbmdzLCBGaXhlZCB4ICsgeSkKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5idWlsZF9maXhlZEhlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJ1aWxkX2ZpeGVkSGVhZGVyKTsKIAkJYnVmZmVyLmFwcGVuZCgnICcpOwogCQlpZiAoZGlzcGxheUJvdGgpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZml4ZWRFcnJvckNvdW50KSk7CisJCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKHRoaXMuZml4ZWRFcnJvckNvdW50KSk7CiAJCQlidWZmZXIuYXBwZW5kKCIgKyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihmaXhlZFdhcm5pbmdDb3VudCkpOworCQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZih0aGlzLmZpeGVkV2FybmluZ0NvdW50KSk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoZml4ZWRFcnJvckNvdW50ID4gMCkgewotCQkJCWlmIChmaXhlZEVycm9yQ291bnQgPT0gMSkKLQkJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5idWlsZF9vbmVFcnJvcik7IAorCQkJaWYgKHRoaXMuZml4ZWRFcnJvckNvdW50ID4gMCkgeworCQkJCWlmICh0aGlzLmZpeGVkRXJyb3JDb3VudCA9PSAxKQorCQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJ1aWxkX29uZUVycm9yKTsKIAkJCQllbHNlCi0JCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9tdWx0aXBsZUVycm9ycywgU3RyaW5nLnZhbHVlT2YoZml4ZWRFcnJvckNvdW50KSkpOyAKLQkJCQlpZiAoZml4ZWRXYXJuaW5nQ291bnQgPiAwKQorCQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfbXVsdGlwbGVFcnJvcnMsIFN0cmluZy52YWx1ZU9mKHRoaXMuZml4ZWRFcnJvckNvdW50KSkpOworCQkJCWlmICh0aGlzLmZpeGVkV2FybmluZ0NvdW50ID4gMCkKIAkJCQkJYnVmZmVyLmFwcGVuZCgiICsgIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KLQkJCWlmIChmaXhlZFdhcm5pbmdDb3VudCA+IDApIHsKLQkJCQlpZiAoZml4ZWRXYXJuaW5nQ291bnQgPT0gMSkKLQkJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5idWlsZF9vbmVXYXJuaW5nKTsgCisJCQlpZiAodGhpcy5maXhlZFdhcm5pbmdDb3VudCA+IDApIHsKKwkJCQlpZiAodGhpcy5maXhlZFdhcm5pbmdDb3VudCA9PSAxKQorCQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJ1aWxkX29uZVdhcm5pbmcpOwogCQkJCWVsc2UKLQkJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX211bHRpcGxlV2FybmluZ3MsIFN0cmluZy52YWx1ZU9mKGZpeGVkV2FybmluZ0NvdW50KSkpOyAKKwkJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX211bHRpcGxlV2FybmluZ3MsIFN0cmluZy52YWx1ZU9mKHRoaXMuZml4ZWRXYXJuaW5nQ291bnQpKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xOTgsMTUgKzE5OCwxNSBAQAogCiAJaWYgKG1zZy5lcXVhbHModGhpcy5wcmV2aW91c1N1YnRhc2spKSByZXR1cm47IC8vIGF2b2lkIHJlZnJlc2hpbmcgd2l0aCBzYW1lIG9uZQogCS8vaWYgKEphdmFCdWlsZGVyLkRFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQlpZiAobW9uaXRvciAhPSBudWxsKQotCQltb25pdG9yLnN1YlRhc2sobXNnKTsKKwlpZiAodGhpcy5tb25pdG9yICE9IG51bGwpCisJCXRoaXMubW9uaXRvci5zdWJUYXNrKG1zZyk7CiAKIAl0aGlzLnByZXZpb3VzU3VidGFzayA9IG1zZzsKIH0KIAogcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUNvdW50cyhDYXRlZ29yaXplZFByb2JsZW1bXSBuZXdQcm9ibGVtcykgewogCWZvciAoaW50IGkgPSAwLCBsID0gbmV3UHJvYmxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlpZiAobmV3UHJvYmxlbXNbaV0uaXNFcnJvcigpKSBuZXdFcnJvckNvdW50Kys7IGVsc2UgbmV3V2FybmluZ0NvdW50Kys7CisJCWlmIChuZXdQcm9ibGVtc1tpXS5pc0Vycm9yKCkpIHRoaXMubmV3RXJyb3JDb3VudCsrOyBlbHNlIHRoaXMubmV3V2FybmluZ0NvdW50Kys7CiB9CiAKIC8qKgpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoaXNFcnJvcikgbmV3RXJyb3JDb3VudCsrOyBlbHNlIG5ld1dhcm5pbmdDb3VudCsrOworCQkJaWYgKGlzRXJyb3IpIHRoaXMubmV3RXJyb3JDb3VudCsrOyBlbHNlIHRoaXMubmV3V2FybmluZ0NvdW50Kys7CiAJCX0KIAl9CiAJaWYgKG9sZFByb2JsZW1zICE9IG51bGwpIHsKQEAgLTI1Miw3ICsyNTIsNyBAQAogCQkJCQkJY29udGludWUgbmV4dDsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAod2FzRXJyb3IpIGZpeGVkRXJyb3JDb3VudCsrOyBlbHNlIGZpeGVkV2FybmluZ0NvdW50Kys7CisJCQlpZiAod2FzRXJyb3IpIHRoaXMuZml4ZWRFcnJvckNvdW50Kys7IGVsc2UgdGhpcy5maXhlZFdhcm5pbmdDb3VudCsrOwogCQl9CiAJfQogfQpAQCAtMjYyLDggKzI2Miw4IEBACiAJCXRoaXMucGVyY2VudENvbXBsZXRlID0gTWF0aC5taW4obmV3UGVyY2VudENvbXBsZXRlLCAxLjBmKTsKIAkJaW50IHdvcmsgPSBNYXRoLnJvdW5kKHRoaXMucGVyY2VudENvbXBsZXRlICogdGhpcy50b3RhbFdvcmspOwogCQlpZiAod29yayA+IHRoaXMud29ya0RvbmUpIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQod29yayAtIHRoaXMud29ya0RvbmUpOworCQkJaWYgKHRoaXMubW9uaXRvciAhPSBudWxsKQorCQkJCXRoaXMubW9uaXRvci53b3JrZWQod29yayAtIHRoaXMud29ya0RvbmUpOwogCQkJLy9pZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oamF2YS50ZXh0Lk51bWJlckZvcm1hdC5nZXRQZXJjZW50SW5zdGFuY2UoKS5mb3JtYXQodGhpcy5wZXJjZW50Q29tcGxldGUpKTsKIAkJCXRoaXMud29ya0RvbmUgPSB3b3JrOwpAQCAtMjcyLDYgKzI3Miw2IEBACiB9CiAKIHB1YmxpYyB2b2lkIHVwZGF0ZVByb2dyZXNzRGVsdGEoZmxvYXQgcGVyY2VudFdvcmtlZCkgewotCXVwZGF0ZVByb2dyZXNzKHBlcmNlbnRDb21wbGV0ZSArIHBlcmNlbnRXb3JrZWQpOworCXVwZGF0ZVByb2dyZXNzKHRoaXMucGVyY2VudENvbXBsZXRlICsgcGVyY2VudFdvcmtlZCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQppbmRleCA3MjRmZDBiLi42M2M4ZGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzMsNyArMzMsNyBAQAogCiBDbGFzc3BhdGhEaXJlY3RvcnkoSUNvbnRhaW5lciBiaW5hcnlGb2xkZXIsIGJvb2xlYW4gaXNPdXRwdXRGb2xkZXIsIEFjY2Vzc1J1bGVTZXQgYWNjZXNzUnVsZVNldCkgewogCXRoaXMuYmluYXJ5Rm9sZGVyID0gYmluYXJ5Rm9sZGVyOwotCXRoaXMuaXNPdXRwdXRGb2xkZXIgPSBpc091dHB1dEZvbGRlcjsKKwl0aGlzLmlzT3V0cHV0Rm9sZGVyID0gaXNPdXRwdXRGb2xkZXIgfHwgYmluYXJ5Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5pc0VtcHR5KCk7IC8vIGlmIGJpbmFyeUZvbGRlciA9PSBwcm9qZWN0LCB0aGVuIHRyZWF0IGl0IGFzIGFuIG91dHB1dEZvbGRlcgogCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7CiAJdGhpcy5hY2Nlc3NSdWxlU2V0ID0gYWNjZXNzUnVsZVNldDsKIH0KQEAgLTQzLDEyICs0MywxMiBAQAogfQogCiBTdHJpbmdbXSBkaXJlY3RvcnlMaXN0KFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgewotCVN0cmluZ1tdIGRpckxpc3QgPSAoU3RyaW5nW10pIGRpcmVjdG9yeUNhY2hlLmdldChxdWFsaWZpZWRQYWNrYWdlTmFtZSk7Ci0JaWYgKGRpckxpc3QgPT0gbWlzc2luZ1BhY2thZ2VIb2xkZXIpIHJldHVybiBudWxsOyAvLyBwYWNrYWdlIGV4aXN0cyBpbiBhbm90aGVyIGNsYXNzcGF0aCBkaXJlY3Rvcnkgb3IgamFyCisJU3RyaW5nW10gZGlyTGlzdCA9IChTdHJpbmdbXSkgdGhpcy5kaXJlY3RvcnlDYWNoZS5nZXQocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCWlmIChkaXJMaXN0ID09IHRoaXMubWlzc2luZ1BhY2thZ2VIb2xkZXIpIHJldHVybiBudWxsOyAvLyBwYWNrYWdlIGV4aXN0cyBpbiBhbm90aGVyIGNsYXNzcGF0aCBkaXJlY3Rvcnkgb3IgamFyCiAJaWYgKGRpckxpc3QgIT0gbnVsbCkgcmV0dXJuIGRpckxpc3Q7CiAKIAl0cnkgewotCQlJUmVzb3VyY2UgY29udGFpbmVyID0gYmluYXJ5Rm9sZGVyLmZpbmRNZW1iZXIocXVhbGlmaWVkUGFja2FnZU5hbWUpOyAvLyB0aGlzIGlzIGEgY2FzZS1zZW5zaXRpdmUgY2hlY2sKKwkJSVJlc291cmNlIGNvbnRhaW5lciA9IHRoaXMuYmluYXJ5Rm9sZGVyLmZpbmRNZW1iZXIocXVhbGlmaWVkUGFja2FnZU5hbWUpOyAvLyB0aGlzIGlzIGEgY2FzZS1zZW5zaXRpdmUgY2hlY2sKIAkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKIAkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSAoKElDb250YWluZXIpIGNvbnRhaW5lcikubWVtYmVycygpOwogCQkJZGlyTGlzdCA9IG5ldyBTdHJpbmdbbWVtYmVycy5sZW5ndGhdOwpAQCAtNjEsMTMgKzYxLDEzIEBACiAJCQl9CiAJCQlpZiAoaW5kZXggPCBkaXJMaXN0Lmxlbmd0aCkKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KGRpckxpc3QsIDAsIGRpckxpc3QgPSBuZXcgU3RyaW5nW2luZGV4XSwgMCwgaW5kZXgpOwotCQkJZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCBkaXJMaXN0KTsKKwkJCXRoaXMuZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCBkaXJMaXN0KTsKIAkJCXJldHVybiBkaXJMaXN0OwogCQl9CiAJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGlnbm9yZWQpIHsKIAkJLy8gaWdub3JlCiAJfQotCWRpcmVjdG9yeUNhY2hlLnB1dChxdWFsaWZpZWRQYWNrYWdlTmFtZSwgbWlzc2luZ1BhY2thZ2VIb2xkZXIpOworCXRoaXMuZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCB0aGlzLm1pc3NpbmdQYWNrYWdlSG9sZGVyKTsKIAlyZXR1cm4gbnVsbDsKIH0KIApAQCAtOTAsNyArOTAsNyBAQAogCQlpZiAodGhpcy5hY2Nlc3NSdWxlU2V0ID09IG51bGwgfHwgIXRoaXMuYWNjZXNzUnVsZVNldC5lcXVhbHMoZGlyLmFjY2Vzc1J1bGVTZXQpKQogCQkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0aGlzLmJpbmFyeUZvbGRlci5lcXVhbHMoZGlyLmJpbmFyeUZvbGRlcik7Ci19IAorfQogCiBwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhTdHJpbmcgYmluYXJ5RmlsZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKSB7CiAJaWYgKCFkb2VzRmlsZUV4aXN0KGJpbmFyeUZpbGVOYW1lLCBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpKSByZXR1cm4gbnVsbDsgLy8gbW9zdCBjb21tb24gY2FzZQpAQCAtMTE1LDcgKzExNSwxMSBAQAogfQogCiBwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHsKLQlyZXR1cm4gYmluYXJ5Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwlyZXR1cm4gdGhpcy5iaW5hcnlGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworfQorCitwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCXJldHVybiB0aGlzLmJpbmFyeUZvbGRlciA9PSBudWxsID8gc3VwZXIuaGFzaENvZGUoKSA6IHRoaXMuYmluYXJ5Rm9sZGVyLmhhc2hDb2RlKCk7CiB9CiAKIHByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoSVJlc291cmNlIHJlc291cmNlKSB7CkBAIC0xMjMsNyArMTI3LDcgQEAKIH0KIAogcHVibGljIGJvb2xlYW4gaXNPdXRwdXRGb2xkZXIoKSB7Ci0JcmV0dXJuIGlzT3V0cHV0Rm9sZGVyOworCXJldHVybiB0aGlzLmlzT3V0cHV0Rm9sZGVyOwogfQogCiBwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aEphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhKYXIuamF2YQppbmRleCAwMDBhMDkwLi4zMjY4YjRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aEphci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoSmFyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwpAQCAtMzIsNyArMzMsNyBAQAogCWxvbmcgbGFzdE1vZGlmaWVkOwogCWxvbmcgZmlsZVNpemU7CiAJU2ltcGxlU2V0IHBhY2thZ2VTZXQ7Ci0JCisKIAlQYWNrYWdlQ2FjaGVFbnRyeShsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBmaWxlU2l6ZSwgU2ltcGxlU2V0IHBhY2thZ2VTZXQpIHsKIAkJdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7CiAJCXRoaXMuZmlsZVNpemUgPSBmaWxlU2l6ZTsKQEAgLTk2LDcgKzk3LDcgQEAKIAkJfQogCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkvLyBpZ25vcmUKLQl9CQorCX0KIAl0aGlzLnppcEZpbGUgPSBudWxsOwogCXRoaXMua25vd25QYWNrYWdlTmFtZXMgPSBudWxsOwogCXRoaXMuYWNjZXNzUnVsZVNldCA9IGFjY2Vzc1J1bGVTZXQ7CkBAIC0xMzcsNyArMTM4LDcgQEAKIAlpZiAodGhpcy5hY2Nlc3NSdWxlU2V0ICE9IGphci5hY2Nlc3NSdWxlU2V0KQogCQlpZiAodGhpcy5hY2Nlc3NSdWxlU2V0ID09IG51bGwgfHwgIXRoaXMuYWNjZXNzUnVsZVNldC5lcXVhbHMoamFyLmFjY2Vzc1J1bGVTZXQpKQogCQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0aGlzLnppcEZpbGVuYW1lLmVxdWFscyhqYXIuemlwRmlsZW5hbWUpICYmIHRoaXMubGFzdE1vZGlmaWVkKCkgPT0gamFyLmxhc3RNb2RpZmllZCgpOworCXJldHVybiB0aGlzLnppcEZpbGVuYW1lLmVxdWFscyhqYXIuemlwRmlsZW5hbWUpICYmIGxhc3RNb2RpZmllZCgpID09IGphci5sYXN0TW9kaWZpZWQoKTsKIH0KIAogcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIGJpbmFyeUZpbGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSkgewpAQCAtMTUxLDcgKzE1Miw4IEBACiAJCQlTdHJpbmcgZmlsZU5hbWVXaXRob3V0RXh0ZW5zaW9uID0gcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9DTEFTUy5sZW5ndGgpOwogCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIocmVhZGVyLCB0aGlzLmFjY2Vzc1J1bGVTZXQuZ2V0VmlvbGF0ZWRSZXN0cmljdGlvbihmaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24udG9DaGFyQXJyYXkoKSkpOwogCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gdHJlYXQgYXMgaWYgY2xhc3MgZmlsZSBpcyBtaXNzaW5nCisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyB0cmVhdCBhcyBpZiBjbGFzcyBmaWxlIGlzIG1pc3NpbmcKKwl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7IC8vIHRyZWF0IGFzIGlmIGNsYXNzIGZpbGUgaXMgbWlzc2luZwogCX0KIAlyZXR1cm4gbnVsbDsKIH0KQEAgLTE2MSw2ICsxNjMsMTAgQEAKIAlyZXR1cm4JdGhpcy5yZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CiB9CiAKK3B1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIHRoaXMuemlwRmlsZW5hbWUgPT0gbnVsbCA/IHN1cGVyLmhhc2hDb2RlKCkgOiB0aGlzLnppcEZpbGVuYW1lLmhhc2hDb2RlKCk7Cit9CisKIHB1YmxpYyBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKIAlpZiAodGhpcy5rbm93blBhY2thZ2VOYW1lcyAhPSBudWxsKQogCQlyZXR1cm4gdGhpcy5rbm93blBhY2thZ2VOYW1lcy5pbmNsdWRlcyhxdWFsaWZpZWRQYWNrYWdlTmFtZSk7CkBAIC0xNjgsOSArMTc0LDkgQEAKIAl0cnkgewogCQlpZiAodGhpcy56aXBGaWxlID09IG51bGwpIHsKIAkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIikgW0NsYXNzcGF0aEphci5pc1BhY2thZ2UoU3RyaW5nKV0gQ3JlYXRpbmcgWmlwRmlsZSBvbiAiICsgemlwRmlsZW5hbWUpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIpIFtDbGFzc3BhdGhKYXIuaXNQYWNrYWdlKFN0cmluZyldIENyZWF0aW5nIFppcEZpbGUgb24gIiArIHRoaXMuemlwRmlsZW5hbWUpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKIAkJCX0KLQkJCXRoaXMuemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGVuYW1lKTsKKwkJCXRoaXMuemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuemlwRmlsZW5hbWUpOwogCQkJdGhpcy5jbG9zZVppcEZpbGVBdEVuZCA9IHRydWU7CiAJCX0KIAkJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IGZpbmRQYWNrYWdlU2V0KHRoaXMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhNdWx0aURpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhNdWx0aURpcmVjdG9yeS5qYXZhCmluZGV4IDkwYjMwYTIuLjEyNzMyODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aE11bHRpRGlyZWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDIsMTAgKzQyLDEwIEBACiAJaWYgKCEobyBpbnN0YW5jZW9mIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSkgcmV0dXJuIGZhbHNlOwogCiAJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSAoQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIG87Ci0JcmV0dXJuIHNvdXJjZUZvbGRlci5lcXVhbHMobWQuc291cmNlRm9sZGVyKSAmJiBiaW5hcnlGb2xkZXIuZXF1YWxzKG1kLmJpbmFyeUZvbGRlcikKLQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW5jbHVzaW9uUGF0dGVybnMsIG1kLmluY2x1c2lvblBhdHRlcm5zKQotCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhleGNsdXNpb25QYXR0ZXJucywgbWQuZXhjbHVzaW9uUGF0dGVybnMpOwotfSAKKwlyZXR1cm4gdGhpcy5zb3VyY2VGb2xkZXIuZXF1YWxzKG1kLnNvdXJjZUZvbGRlcikgJiYgdGhpcy5iaW5hcnlGb2xkZXIuZXF1YWxzKG1kLmJpbmFyeUZvbGRlcikKKwkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5pbmNsdXNpb25QYXR0ZXJucywgbWQuaW5jbHVzaW9uUGF0dGVybnMpCisJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZXhjbHVzaW9uUGF0dGVybnMsIG1kLmV4Y2x1c2lvblBhdHRlcm5zKTsKK30KIAogcHJvdGVjdGVkIGJvb2xlYW4gaXNFeGNsdWRlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAlpZiAodGhpcy5leGNsdXNpb25QYXR0ZXJucyAhPSBudWxsIHx8IHRoaXMuaW5jbHVzaW9uUGF0dGVybnMgIT0gbnVsbCkKQEAgLTU1LDcgKzU1LDcgQEAKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlNvdXJjZSBjbGFzc3BhdGggZGlyZWN0b3J5ICIgKyBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiU291cmNlIGNsYXNzcGF0aCBkaXJlY3RvcnkgIiArIHRoaXMuc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSArIC8vJE5PTi1OTFMtMSQKIAkJIiB3aXRoICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ29tcGlsYXRpb25QYXJ0aWNpcGFudFJlc3VsdC5qYXZhCmluZGV4IDFhNzE1NzQuLmEzOTk3MTIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ29tcGlsYXRpb25QYXJ0aWNpcGFudFJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ29tcGlsYXRpb25QYXJ0aWNpcGFudFJlc3VsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNyArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgSUJNIC0gcmV3cm90ZSBzcGVjCi0gKiAgICAKKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwpAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiAKLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0IHsKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblBhcnRpY2lwYW50UmVzdWx0IGV4dGVuZHMgQnVpbGRDb250ZXh0IHsKIAlwcm90ZWN0ZWQgU291cmNlRmlsZSBzb3VyY2VGaWxlOwogCXByb3RlY3RlZCBib29sZWFuIGhhc0Fubm90YXRpb25zOyAvLyBvbmx5IHNldCBkdXJpbmcgcHJvY2Vzc0Fubm90YXRpb25zCiAJcHJvdGVjdGVkIElGaWxlW10gYWRkZWRGaWxlczsgLy8gYWRkZWQvY2hhbmdlZCBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZApAQCAtMzIsNiArMzIsMTA1IEBACiAJdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsOwogfQogCisvKioKKyAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorICoKKyAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJcmV0dXJuIHRoaXMuc291cmNlRmlsZS5nZXRDb250ZW50cygpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPklGaWxlPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisgKgorICogQHJldHVybiB0aGUgPGNvZGU+SUZpbGU8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgY29tcGlsYXRpb24gdW5pdAorICovCitwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKKwlyZXR1cm4gdGhpcy5zb3VyY2VGaWxlLnJlc291cmNlOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBjb250YWluZWQgYW55IGFubm90YXRpb25zIHdoZW4gaXQgd2FzIGNvbXBpbGVkLgorICoKKyAqIE5PVEU6IFRoaXMgaXMgb25seSB2YWxpZCBkdXJpbmcge0BsaW5rIENvbXBpbGF0aW9uUGFydGljaXBhbnQjcHJvY2Vzc0Fubm90YXRpb25zKEJ1aWxkQ29udGV4dFtdKX0uCisgKgorICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0IGNvbnRhaW5lZCBhbnkgYW5ub3RhdGlvbnMgd2hlbiBpdCB3YXMgY29tcGlsZWQKKyAqLworcHVibGljIGJvb2xlYW4gaGFzQW5ub3RhdGlvbnMoKSB7CisJcmV0dXJuIHRoaXMuaGFzQW5ub3RhdGlvbnM7IC8vIG9ubHkgc2V0IGR1cmluZyBwcm9jZXNzQW5ub3RhdGlvbnMKK30KKworLyoqCisgKiBSZWNvcmQgdGhlIGFkZGVkL2NoYW5nZWQgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZC4KKyAqCisgKiBAcGFyYW0gYWRkZWRHZW5lcmF0ZWRGaWxlcyB0aGUgYWRkZWQvY2hhbmdlZCBmaWxlcworICovCitwdWJsaWMgdm9pZCByZWNvcmRBZGRlZEdlbmVyYXRlZEZpbGVzKElGaWxlW10gYWRkZWRHZW5lcmF0ZWRGaWxlcykgeworCWludCBsZW5ndGgyID0gYWRkZWRHZW5lcmF0ZWRGaWxlcy5sZW5ndGg7CisJaWYgKGxlbmd0aDIgPT0gMCkgcmV0dXJuOworCisJaW50IGxlbmd0aDEgPSB0aGlzLmFkZGVkRmlsZXMgPT0gbnVsbCA/IDAgOiB0aGlzLmFkZGVkRmlsZXMubGVuZ3RoOworCUlGaWxlW10gbWVyZ2VkID0gbmV3IElGaWxlW2xlbmd0aDEgKyBsZW5ndGgyXTsKKwlpZiAobGVuZ3RoMSA+IDApIC8vIGFsd2F5cyBtYWtlIGEgY29weSBldmVuIGlmIGN1cnJlbnRseSBlbXB0eQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYWRkZWRGaWxlcywgMCwgbWVyZ2VkLCAwLCBsZW5ndGgxKTsKKwlTeXN0ZW0uYXJyYXljb3B5KGFkZGVkR2VuZXJhdGVkRmlsZXMsIDAsIG1lcmdlZCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJdGhpcy5hZGRlZEZpbGVzID0gbWVyZ2VkOworfQorCisvKioKKyAqIFJlY29yZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkLgorICoKKyAqIEBwYXJhbSBkZWxldGVkR2VuZXJhdGVkRmlsZXMgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkCisgKi8KK3B1YmxpYyB2b2lkIHJlY29yZERlbGV0ZWRHZW5lcmF0ZWRGaWxlcyhJRmlsZVtdIGRlbGV0ZWRHZW5lcmF0ZWRGaWxlcykgeworCWludCBsZW5ndGgyID0gZGVsZXRlZEdlbmVyYXRlZEZpbGVzLmxlbmd0aDsKKwlpZiAobGVuZ3RoMiA9PSAwKSByZXR1cm47CisKKwlpbnQgbGVuZ3RoMSA9IHRoaXMuZGVsZXRlZEZpbGVzID09IG51bGwgPyAwIDogdGhpcy5kZWxldGVkRmlsZXMubGVuZ3RoOworCUlGaWxlW10gbWVyZ2VkID0gbmV3IElGaWxlW2xlbmd0aDEgKyBsZW5ndGgyXTsKKwlpZiAobGVuZ3RoMSA+IDApIC8vIGFsd2F5cyBtYWtlIGEgY29weSBldmVuIGlmIGN1cnJlbnRseSBlbXB0eQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZGVsZXRlZEZpbGVzLCAwLCBtZXJnZWQsIDAsIGxlbmd0aDEpOworCVN5c3RlbS5hcnJheWNvcHkoZGVsZXRlZEdlbmVyYXRlZEZpbGVzLCAwLCBtZXJnZWQsIGxlbmd0aDEsIGxlbmd0aDIpOworCXRoaXMuZGVsZXRlZEZpbGVzID0gbWVyZ2VkOworfQorCisvKioKKyAqIFJlY29yZCB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZXMgb2YgYW55IG5ldyBkZXBlbmRlbmNpZXMsIGVhY2ggbmFtZSBpcyBvZiB0aGUgZm9ybSAicDEucDIuQS5CIi4KKyAqCisgKiBAcGFyYW0gdHlwZU5hbWVEZXBlbmRlbmNpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWVzIG9mIG5ldyBkZXBlbmRlbmNpZXMKKyAqLworcHVibGljIHZvaWQgcmVjb3JkRGVwZW5kZW5jaWVzKFN0cmluZ1tdIHR5cGVOYW1lRGVwZW5kZW5jaWVzKSB7CisJaW50IGxlbmd0aDIgPSB0eXBlTmFtZURlcGVuZGVuY2llcy5sZW5ndGg7CisJaWYgKGxlbmd0aDIgPT0gMCkgcmV0dXJuOworCisJaW50IGxlbmd0aDEgPSB0aGlzLmRlcGVuZGVuY2llcyA9PSBudWxsID8gMCA6IHRoaXMuZGVwZW5kZW5jaWVzLmxlbmd0aDsKKwlTdHJpbmdbXSBtZXJnZWQgPSBuZXcgU3RyaW5nW2xlbmd0aDEgKyBsZW5ndGgyXTsKKwlpZiAobGVuZ3RoMSA+IDApIC8vIGFsd2F5cyBtYWtlIGEgY29weSBldmVuIGlmIGN1cnJlbnRseSBlbXB0eQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZGVwZW5kZW5jaWVzLCAwLCBtZXJnZWQsIDAsIGxlbmd0aDEpOworCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWVEZXBlbmRlbmNpZXMsIDAsIG1lcmdlZCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJdGhpcy5kZXBlbmRlbmNpZXMgPSBtZXJnZWQ7Cit9CisKKy8qKgorICogUmVjb3JkIG5ldyBwcm9ibGVtcyB0byByZXBvcnQgYWdhaW5zdCB0aGlzIGNvbXBpbGF0aW9uVW5pdC4KKyAqIE1hcmtlcnMgYXJlIHBlcnNpc3RlZCBmb3IgdGhlc2UgcHJvYmxlbXMgb25seSBmb3IgdGhlIGRlY2xhcmVkIG1hbmFnZWQgbWFya2VyIHR5cGUKKyAqIChzZWUgdGhlICdjb21waWxhdGlvblBhcnRpY2lwYW50JyBleHRlbnNpb24gcG9pbnQpLgorICoKKyAqIEBwYXJhbSBuZXdQcm9ibGVtcyB0aGUgcHJvYmxlbXMgdG8gcmVwb3J0CisgKi8KK3B1YmxpYyB2b2lkIHJlY29yZE5ld1Byb2JsZW1zKENhdGVnb3JpemVkUHJvYmxlbVtdIG5ld1Byb2JsZW1zKSB7CisJaW50IGxlbmd0aDIgPSBuZXdQcm9ibGVtcy5sZW5ndGg7CisJaWYgKGxlbmd0aDIgPT0gMCkgcmV0dXJuOworCisJaW50IGxlbmd0aDEgPSB0aGlzLnByb2JsZW1zID09IG51bGwgPyAwIDogdGhpcy5wcm9ibGVtcy5sZW5ndGg7CisJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gbWVyZ2VkID0gbmV3IENhdGVnb3JpemVkUHJvYmxlbVtsZW5ndGgxICsgbGVuZ3RoMl07CisJaWYgKGxlbmd0aDEgPiAwKSAvLyBhbHdheXMgbWFrZSBhIGNvcHkgZXZlbiBpZiBjdXJyZW50bHkgZW1wdHkKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnByb2JsZW1zLCAwLCBtZXJnZWQsIDAsIGxlbmd0aDEpOworCVN5c3RlbS5hcnJheWNvcHkobmV3UHJvYmxlbXMsIDAsIG1lcmdlZCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJdGhpcy5wcm9ibGVtcyA9IG1lcmdlZDsKK30KKwogdm9pZCByZXNldChib29sZWFuIGRldGVjdGVkQW5ub3RhdGlvbnMpIHsKIAkvLyBjYWxsZWQgcHJpb3IgdG8gcHJvY2Vzc0Fubm90YXRpb25zCiAJdGhpcy5oYXNBbm5vdGF0aW9ucyA9IGRldGVjdGVkQW5ub3RhdGlvbnM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0lDb21waWxhdGlvblVuaXRMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0lDb21waWxhdGlvblVuaXRMb2NhdG9yLmphdmEKaW5kZXggYzNjZGI1Ni4uYWVhOWYwZSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JQ29tcGlsYXRpb25Vbml0TG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSUNvbXBpbGF0aW9uVW5pdExvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQkVBIFN5c3RlbXMsIEluYy4gCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgQkVBIFN5c3RlbXMsIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNyArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgd2hhcmxleUBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAKKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDU1NTUzOWMuLmU1OWNiMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsMjUgKzI1LDE1IEBACiAJdGhpcy5jb3JlRXhjZXB0aW9uID0gZTsKIH0KIAotcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb3JlRXhjZXB0aW9uLmdldFN0YXR1cygpOwotCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkgICAgcmV0dXJuIGNoaWxkcmVuWzBdLmdldE1lc3NhZ2UoKTsKLQl9Ci0gICAgcmV0dXJuIHRoaXMuY29yZUV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci19Ci0KIHB1YmxpYyBDb3JlRXhjZXB0aW9uIGdldFRocm93YWJsZSgpIHsKLQlyZXR1cm4gY29yZUV4Y2VwdGlvbjsKKwlyZXR1cm4gdGhpcy5jb3JlRXhjZXB0aW9uOwogfQogCiBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JaWYgKGNvcmVFeGNlcHRpb24gIT0gbnVsbCkgeworCWlmICh0aGlzLmNvcmVFeGNlcHRpb24gIT0gbnVsbCkgewogCQlTeXN0ZW0uZXJyLnByaW50bG4odGhpcyk7CiAJCVN5c3RlbS5lcnIucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgZW1iZWRkZWQgY29yZSBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJY29yZUV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJdGhpcy5jb3JlRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwogCX0gZWxzZSB7CiAJCXN1cGVyLnByaW50U3RhY2tUcmFjZSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YQppbmRleCAxOTgxODc2Li5kMTMyNWMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0luY3JlbWVudGFsSW1hZ2VCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbmNyZW1lbnRhbEltYWdlQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlN1ZmZpeENvbnN0YW50czsKQEAgLTM2LDYgKzM3LDcgQEAKIHByb3RlY3RlZCBBcnJheUxpc3QgcHJldmlvdXNTb3VyY2VGaWxlczsKIHByb3RlY3RlZCBTdHJpbmdTZXQgcXVhbGlmaWVkU3RyaW5nczsKIHByb3RlY3RlZCBTdHJpbmdTZXQgc2ltcGxlU3RyaW5nczsKK3Byb3RlY3RlZCBTdHJpbmdTZXQgcm9vdFN0cmluZ3M7CiBwcm90ZWN0ZWQgU2ltcGxlTG9va3VwVGFibGUgc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZTsKIHByb3RlY3RlZCBib29sZWFuIGhhc1N0cnVjdHVyYWxDaGFuZ2VzOwogcHJvdGVjdGVkIGludCBjb21waWxlTG9vcDsKQEAgLTc3LDIwICs3OSwyMiBAQAogCXRyeSB7CiAJCXJlc2V0Q29sbGVjdGlvbnMoKTsKIAotCQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJ1aWxkX2FuYWx5emluZ0RlbHRhcyk7Ci0JCWlmIChqYXZhQnVpbGRlci5oYXNCdWlsZHBhdGhFcnJvcnMoKSkgeworCQl0aGlzLm5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYnVpbGRfYW5hbHl6aW5nRGVsdGFzKTsKKwkJaWYgKHRoaXMuamF2YUJ1aWxkZXIuaGFzQnVpbGRwYXRoRXJyb3JzKCkpIHsKIAkJCS8vIGlmIGEgbXNzaW5nIGNsYXNzIGZpbGUgd2FzIGRldGVjdGVkIGluIHRoZSBsYXN0IGJ1aWxkLCBhIGJ1aWxkIHN0YXRlIHdhcyBzYXZlZCBzaW5jZSBpdHMgbm8gbG9uZ2VyIGZhdGFsCiAJCQkvLyBidXQgd2UgbmVlZCB0byByZWJ1aWxkIGV2ZXJ5IHNvdXJjZSBmaWxlIHNpbmNlIHByb2JsZW1zIHdlcmUgbm90IHJlY29yZGVkCiAJCQkvLyBBTkQgdG8gYXZvaWQgdGhlIGluZmluaXRlIGJ1aWxkIHNjZW5hcmlvIGlmIHRoaXMgcHJvamVjdCBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xlLCBzZWUgYnVnIDE2MDU1MAogCQkJLy8gd2UgbmVlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkZWx0YXMgY2F1c2VkIGJ5IGRvaW5nIGEgZnVsbCBidWlsZCBpbiB0aGlzIGNhc2UKLQkJCWphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0LmRlbGV0ZU1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJYWRkQWxsU291cmNlRmlsZXMoc291cmNlRmlsZXMpOwotCQkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjI1Zik7CisJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDT01QSUxJTkcgYWxsIHNvdXJjZSBmaWxlcyBzaW5jZSB0aGUgYnVpbGRwYXRoIGhhcyBlcnJvcnMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRoaXMuamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QuZGVsZXRlTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CisJCQlhZGRBbGxTb3VyY2VGaWxlcyh0aGlzLnNvdXJjZUZpbGVzKTsKKwkJCXRoaXMubm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjI1Zik7CiAJCX0gZWxzZSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBzb3VyY2VEZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgZGVsdGFzLmdldChqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CisJCQlJUmVzb3VyY2VEZWx0YSBzb3VyY2VEZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgZGVsdGFzLmdldCh0aGlzLmphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0KTsKIAkJCWlmIChzb3VyY2VEZWx0YSAhPSBudWxsKQogCQkJCWlmICghZmluZFNvdXJjZUZpbGVzKHNvdXJjZURlbHRhKSkgcmV0dXJuIGZhbHNlOwotCQkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjEwZik7CisJCQl0aGlzLm5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4xMGYpOwogCiAJCQlPYmplY3RbXSBrZXlUYWJsZSA9IGRlbHRhcy5rZXlUYWJsZTsKIAkJCU9iamVjdFtdIHZhbHVlVGFibGUgPSBkZWx0YXMudmFsdWVUYWJsZTsKQEAgLTk4LDQxICsxMDIsNDEgQEAKIAkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgdmFsdWVUYWJsZVtpXTsKIAkJCQlpZiAoZGVsdGEgIT0gbnVsbCkgewogCQkJCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBrZXlUYWJsZVtpXTsKLQkJCQkJQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc0ZvbGRlcnNBbmRKYXJzID0gKENsYXNzcGF0aExvY2F0aW9uW10pIGphdmFCdWlsZGVyLmJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QuZ2V0KHApOworCQkJCQlDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoQ2xhc3NwYXRoTG9jYXRpb25bXSkgdGhpcy5qYXZhQnVpbGRlci5iaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0LmdldChwKTsKIAkJCQkJaWYgKGNsYXNzRm9sZGVyc0FuZEphcnMgIT0gbnVsbCkKIAkJCQkJCWlmICghZmluZEFmZmVjdGVkU291cmNlRmlsZXMoZGVsdGEsIGNsYXNzRm9sZGVyc0FuZEphcnMsIHApKSByZXR1cm4gZmFsc2U7CiAJCQkJfQogCQkJfQotCQkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjEwZik7CisJCQl0aGlzLm5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4xMGYpOwogCi0JCQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJ1aWxkX2FuYWx5emluZ1NvdXJjZXMpOyAKKwkJCXRoaXMubm90aWZpZXIuc3ViVGFzayhNZXNzYWdlcy5idWlsZF9hbmFseXppbmdTb3VyY2VzKTsKIAkJCWFkZEFmZmVjdGVkU291cmNlRmlsZXMoKTsKLQkJCW5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4wNWYpOworCQkJdGhpcy5ub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMDVmKTsKIAkJfQogCiAJCXRoaXMuY29tcGlsZUxvb3AgPSAwOwogCQlmbG9hdCBpbmNyZW1lbnQgPSAwLjQwZjsKLQkJd2hpbGUgKHNvdXJjZUZpbGVzLnNpemUoKSA+IDApIHsgLy8gYWRkZWQgdG8gaW4gYWNjZXB0UmVzdWx0CisJCXdoaWxlICh0aGlzLnNvdXJjZUZpbGVzLnNpemUoKSA+IDApIHsgLy8gYWRkZWQgdG8gaW4gYWNjZXB0UmVzdWx0CiAJCQlpZiAoKyt0aGlzLmNvbXBpbGVMb29wID4gTWF4Q29tcGlsZUxvb3ApIHsKIAkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQUJPUlRJTkcgaW5jcmVtZW50YWwgYnVpbGQuLi4gZXhjZWVkZWQgbG9vcCBjb3VudCIpOyAvLyROT04tTkxTLTEkCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQotCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAotCQkJU291cmNlRmlsZVtdIGFsbFNvdXJjZUZpbGVzID0gbmV3IFNvdXJjZUZpbGVbc291cmNlRmlsZXMuc2l6ZSgpXTsKLQkJCXNvdXJjZUZpbGVzLnRvQXJyYXkoYWxsU291cmNlRmlsZXMpOworCQkJU291cmNlRmlsZVtdIGFsbFNvdXJjZUZpbGVzID0gbmV3IFNvdXJjZUZpbGVbdGhpcy5zb3VyY2VGaWxlcy5zaXplKCldOworCQkJdGhpcy5zb3VyY2VGaWxlcy50b0FycmF5KGFsbFNvdXJjZUZpbGVzKTsKIAkJCXJlc2V0Q29sbGVjdGlvbnMoKTsKIAotCQkJd29ya1F1ZXVlLmFkZEFsbChhbGxTb3VyY2VGaWxlcyk7Ci0JCQlub3RpZmllci5zZXRQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdChpbmNyZW1lbnQgLyBhbGxTb3VyY2VGaWxlcy5sZW5ndGgpOworCQkJdGhpcy53b3JrUXVldWUuYWRkQWxsKGFsbFNvdXJjZUZpbGVzKTsKKwkJCXRoaXMubm90aWZpZXIuc2V0UHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQoaW5jcmVtZW50IC8gYWxsU291cmNlRmlsZXMubGVuZ3RoKTsKIAkJCWluY3JlbWVudCA9IGluY3JlbWVudCAvIDI7CiAJCQljb21waWxlKGFsbFNvdXJjZUZpbGVzKTsKIAkJCXJlbW92ZVNlY29uZGFyeVR5cGVzKCk7CiAJCQlhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKCk7CiAJCX0KLQkJaWYgKHRoaXMuaGFzU3RydWN0dXJhbENoYW5nZXMgJiYgamF2YUJ1aWxkZXIuamF2YVByb2plY3QuaGFzQ3ljbGVNYXJrZXIoKSkKLQkJCWphdmFCdWlsZGVyLm11c3RQcm9wYWdhdGVTdHJ1Y3R1cmFsQ2hhbmdlcygpOworCQlpZiAodGhpcy5oYXNTdHJ1Y3R1cmFsQ2hhbmdlcyAmJiB0aGlzLmphdmFCdWlsZGVyLmphdmFQcm9qZWN0Lmhhc0N5Y2xlTWFya2VyKCkpCisJCQl0aGlzLmphdmFCdWlsZGVyLm11c3RQcm9wYWdhdGVTdHJ1Y3R1cmFsQ2hhbmdlcygpOwogCX0gY2F0Y2ggKEFib3J0SW5jcmVtZW50YWxCdWlsZEV4Y2VwdGlvbiBlKSB7CiAJCS8vIGFib3J0IHRoZSBpbmNyZW1lbnRhbCBidWlsZCBhbmQgbGV0IHRoZSBiYXRjaCBidWlsZGVyIGhhbmRsZSB0aGUgcHJvYmxlbQogCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCkBAIC0xNTgsMTEgKzE2MiwxMSBAQAogCXRyeSB7CiAJCWFkZEFmZmVjdGVkU291cmNlRmlsZXMoKTsKIAkJd2hpbGUgKHRoaXMuc291cmNlRmlsZXMuc2l6ZSgpID4gMCkgewotCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAkJCVNvdXJjZUZpbGVbXSBhbGxTb3VyY2VGaWxlcyA9IG5ldyBTb3VyY2VGaWxlW3RoaXMuc291cmNlRmlsZXMuc2l6ZSgpXTsKIAkJCXRoaXMuc291cmNlRmlsZXMudG9BcnJheShhbGxTb3VyY2VGaWxlcyk7CiAJCQlyZXNldENvbGxlY3Rpb25zKCk7Ci0JCQlub3RpZmllci5zZXRQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdCgwLjA4ZiAvIGFsbFNvdXJjZUZpbGVzLmxlbmd0aCk7CisJCQl0aGlzLm5vdGlmaWVyLnNldFByb2dyZXNzUGVyQ29tcGlsYXRpb25Vbml0KDAuMDhmIC8gYWxsU291cmNlRmlsZXMubGVuZ3RoKTsKIAkJCXRoaXMud29ya1F1ZXVlLmFkZEFsbChhbGxTb3VyY2VGaWxlcyk7CiAJCQljb21waWxlKGFsbFNvdXJjZUZpbGVzKTsKIAkJCXJlbW92ZVNlY29uZGFyeVR5cGVzKCk7CkBAIC0xNzYsNTkgKzE4MCw4MSBAQAogfQogCiBwcm90ZWN0ZWQgdm9pZCBhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKCkgewotCWlmIChxdWFsaWZpZWRTdHJpbmdzLmVsZW1lbnRTaXplID09IDAgJiYgc2ltcGxlU3RyaW5ncy5lbGVtZW50U2l6ZSA9PSAwKSByZXR1cm47CisJaWYgKHRoaXMucXVhbGlmaWVkU3RyaW5ncy5lbGVtZW50U2l6ZSA9PSAwICYmIHRoaXMuc2ltcGxlU3RyaW5ncy5lbGVtZW50U2l6ZSA9PSAwKSByZXR1cm47CiAKLQlhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKHF1YWxpZmllZFN0cmluZ3MsIHNpbXBsZVN0cmluZ3MsIG51bGwpOworCWFkZEFmZmVjdGVkU291cmNlRmlsZXModGhpcy5xdWFsaWZpZWRTdHJpbmdzLCB0aGlzLnNpbXBsZVN0cmluZ3MsIHRoaXMucm9vdFN0cmluZ3MsIG51bGwpOwogfQogCi1wcm90ZWN0ZWQgdm9pZCBhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKFN0cmluZ1NldCBxdWFsaWZpZWRTZXQsIFN0cmluZ1NldCBzaW1wbGVTZXQsIFN0cmluZ1NldCBhZmZlY3RlZFR5cGVzKSB7Citwcm90ZWN0ZWQgdm9pZCBhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKFN0cmluZ1NldCBxdWFsaWZpZWRTZXQsIFN0cmluZ1NldCBzaW1wbGVTZXQsIFN0cmluZ1NldCByb290U2V0LCBTdHJpbmdTZXQgYWZmZWN0ZWRUeXBlcykgewogCS8vIHRoZSBxdWFsaWZpZWRTdHJpbmdzIGFyZSBvZiB0aGUgZm9ybSAncDEvcDInICYgdGhlIHNpbXBsZVN0cmluZ3MgYXJlIGp1c3QgJ1gnCiAJY2hhcltdW11bXSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5RdWFsaWZpZWROYW1lcyhxdWFsaWZpZWRTZXQpOwogCS8vIGlmIGEgd2VsbCBrbm93biBxdWFsaWZpZWQgbmFtZSB3YXMgZm91bmQgdGhlbiB3ZSBjYW4gc2tpcCBvdmVyIHRoZXNlCiAJaWYgKGludGVybmVkUXVhbGlmaWVkTmFtZXMubGVuZ3RoIDwgcXVhbGlmaWVkU2V0LmVsZW1lbnRTaXplKQogCQlpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gbnVsbDsKLQljaGFyW11bXSBpbnRlcm5lZFNpbXBsZU5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5TaW1wbGVOYW1lcyhzaW1wbGVTZXQpOworCWNoYXJbXVtdIGludGVybmVkU2ltcGxlTmFtZXMgPSBSZWZlcmVuY2VDb2xsZWN0aW9uLmludGVyblNpbXBsZU5hbWVzKHNpbXBsZVNldCwgdHJ1ZSk7CiAJLy8gaWYgYSB3ZWxsIGtub3duIG5hbWUgd2FzIGZvdW5kIHRoZW4gd2UgY2FuIHNraXAgb3ZlciB0aGVzZQogCWlmIChpbnRlcm5lZFNpbXBsZU5hbWVzLmxlbmd0aCA8IHNpbXBsZVNldC5lbGVtZW50U2l6ZSkKIAkJaW50ZXJuZWRTaW1wbGVOYW1lcyA9IG51bGw7CisJY2hhcltdW10gaW50ZXJuZWRSb290TmFtZXMgPSBSZWZlcmVuY2VDb2xsZWN0aW9uLmludGVyblNpbXBsZU5hbWVzKHJvb3RTZXQsIGZhbHNlKTsKIAotCU9iamVjdFtdIGtleVRhYmxlID0gbmV3U3RhdGUucmVmZXJlbmNlcy5rZXlUYWJsZTsKLQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gbmV3U3RhdGUucmVmZXJlbmNlcy52YWx1ZVRhYmxlOworCU9iamVjdFtdIGtleVRhYmxlID0gdGhpcy5uZXdTdGF0ZS5yZWZlcmVuY2VzLmtleVRhYmxlOworCU9iamVjdFtdIHZhbHVlVGFibGUgPSB0aGlzLm5ld1N0YXRlLnJlZmVyZW5jZXMudmFsdWVUYWJsZTsKIAluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQlTdHJpbmcgdHlwZUxvY2F0b3IgPSAoU3RyaW5nKSBrZXlUYWJsZVtpXTsKIAkJaWYgKHR5cGVMb2NhdG9yICE9IG51bGwpIHsKIAkJCWlmIChhZmZlY3RlZFR5cGVzICE9IG51bGwgJiYgIWFmZmVjdGVkVHlwZXMuaW5jbHVkZXModHlwZUxvY2F0b3IpKSBjb250aW51ZSBuZXh0OwogCQkJUmVmZXJlbmNlQ29sbGVjdGlvbiByZWZzID0gKFJlZmVyZW5jZUNvbGxlY3Rpb24pIHZhbHVlVGFibGVbaV07Ci0JCQlpZiAocmVmcy5pbmNsdWRlcyhpbnRlcm5lZFF1YWxpZmllZE5hbWVzLCBpbnRlcm5lZFNpbXBsZU5hbWVzKSkgewotCQkJCUlGaWxlIGZpbGUgPSBqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXRGaWxlKHR5cGVMb2NhdG9yKTsKKwkJCWlmIChyZWZzLmluY2x1ZGVzKGludGVybmVkUXVhbGlmaWVkTmFtZXMsIGludGVybmVkU2ltcGxlTmFtZXMsIGludGVybmVkUm9vdE5hbWVzKSkgeworCQkJCUlGaWxlIGZpbGUgPSB0aGlzLmphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0LmdldEZpbGUodHlwZUxvY2F0b3IpOwogCQkJCVNvdXJjZUZpbGUgc291cmNlRmlsZSA9IGZpbmRTb3VyY2VGaWxlKGZpbGUsIHRydWUpOwogCQkJCWlmIChzb3VyY2VGaWxlID09IG51bGwpIGNvbnRpbnVlIG5leHQ7Ci0JCQkJaWYgKHNvdXJjZUZpbGVzLmNvbnRhaW5zKHNvdXJjZUZpbGUpKSBjb250aW51ZSBuZXh0OwotCQkJCWlmIChjb21waWxlZEFsbEF0T25jZSAmJiBwcmV2aW91c1NvdXJjZUZpbGVzICE9IG51bGwgJiYgcHJldmlvdXNTb3VyY2VGaWxlcy5jb250YWlucyhzb3VyY2VGaWxlKSkKKwkJCQlpZiAodGhpcy5zb3VyY2VGaWxlcy5jb250YWlucyhzb3VyY2VGaWxlKSkgY29udGludWUgbmV4dDsKKwkJCQlpZiAodGhpcy5jb21waWxlZEFsbEF0T25jZSAmJiB0aGlzLnByZXZpb3VzU291cmNlRmlsZXMgIT0gbnVsbCAmJiB0aGlzLnByZXZpb3VzU291cmNlRmlsZXMuY29udGFpbnMoc291cmNlRmlsZSkpCiAJCQkJCWNvbnRpbnVlIG5leHQ7IC8vIGNhbiBza2lwIHByZXZpb3VzbHkgY29tcGlsZWQgZmlsZXMgc2luY2UgYWxyZWFkeSBzYXcgaGllcmFyY2h5IHJlbGF0ZWQgcHJvYmxlbXMKLQkKKwogCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGFkZGluZyBhZmZlY3RlZCBzb3VyY2UgZmlsZSAiICsgdHlwZUxvY2F0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJc291cmNlRmlsZXMuYWRkKHNvdXJjZUZpbGUpOworCQkJCXRoaXMuc291cmNlRmlsZXMuYWRkKHNvdXJjZUZpbGUpOwogCQkJfQogCQl9CiAJfQogfQogCiBwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbnRzT2YoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1N0cnVjdHVyYWxDaGFuZ2UpIHsKKwlhZGREZXBlbmRlbnRzT2YocGF0aCwgaXNTdHJ1Y3R1cmFsQ2hhbmdlLCB0aGlzLnF1YWxpZmllZFN0cmluZ3MsIHRoaXMuc2ltcGxlU3RyaW5ncywgdGhpcy5yb290U3RyaW5ncyk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVudHNPZihJUGF0aCBwYXRoLCBib29sZWFuIGlzU3RydWN0dXJhbENoYW5nZSwgU3RyaW5nU2V0IHF1YWxpZmllZE5hbWVzLCBTdHJpbmdTZXQgc2ltcGxlTmFtZXMsIFN0cmluZ1NldCByb290TmFtZXMpIHsKKwlwYXRoID0gcGF0aC5zZXREZXZpY2UobnVsbCk7CisJaWYgKGlzU3RydWN0dXJhbENoYW5nZSkgeworCQlTdHJpbmcgbGFzdCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKKwkJaWYgKGxhc3QubGVuZ3RoKCkgPT0gVHlwZUNvbnN0YW50cy5QQUNLQUdFX0lORk9fTkFNRS5sZW5ndGgpCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobGFzdC50b0NoYXJBcnJheSgpLCBUeXBlQ29uc3RhbnRzLlBBQ0tBR0VfSU5GT19OQU1FKSkgeworCQkJCXBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsgLy8gdGhlIHBhY2thZ2UtaW5mbyBmaWxlIGhhcyBjaGFuZ2VkIHNvIGJsYW1lIHRoZSBwYWNrYWdlIGl0c2VsZgorCQkJCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM3ODUsIGluIHRoZSBjYXNlIG9mIGRlZmF1bHQgcGFja2FnZSwKKwkJCQkgICB0aGVyZSBpcyBubyBuZWVkIHRvIGJsYW1lIHRoZSBwYWNrYWdlIGl0c2VsZiBhcyB0aGVyZSBjYW4gYmUgbm8gYW5ub3RhdGlvbnMgb3IgZG9jdW1lbnRhdGlvbgorCQkJCSAgIGNvbW1lbnQgdGFncyBpbiB0aGUgcGFja2FnZS1pbmZvIGZpbGUgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZSByZXN0IG9mIHRoZSBwYWNrYWdlLiBKdXN0IGJhaWwgb3V0CisJCQkJICAgc28gd2UgZG9uJ3QgdG91Y2ggbnVsbCBvYmplY3RzIGJlbG93LgorCQkJCSAqLworCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKKwkJCQkJcmV0dXJuOworCQkJfQorCX0KKwogCWlmIChpc1N0cnVjdHVyYWxDaGFuZ2UgJiYgIXRoaXMuaGFzU3RydWN0dXJhbENoYW5nZXMpIHsKLQkJbmV3U3RhdGUudGFnQXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKCk7CisJCXRoaXMubmV3U3RhdGUudGFnQXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKCk7CiAJCXRoaXMuaGFzU3RydWN0dXJhbENoYW5nZXMgPSB0cnVlOwogCX0KIAkvLyB0aGUgcXVhbGlmaWVkU3RyaW5ncyBhcmUgb2YgdGhlIGZvcm0gJ3AxL3AyJyAmIHRoZSBzaW1wbGVTdHJpbmdzIGFyZSBqdXN0ICdYJwotCXBhdGggPSBwYXRoLnNldERldmljZShudWxsKTsKKwlyb290TmFtZXMuYWRkKHBhdGguc2VnbWVudCgwKSk7CiAJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQlxdWFsaWZpZWRTdHJpbmdzLmFkZChwYWNrYWdlTmFtZSk7CisJYm9vbGVhbiB3YXNOZXcgPSBxdWFsaWZpZWROYW1lcy5hZGQocGFja2FnZU5hbWUpOwogCVN0cmluZyB0eXBlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKIAlpbnQgbWVtYmVySW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCckJyk7CiAJaWYgKG1lbWJlckluZGV4ID4gMCkKIAkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgbWVtYmVySW5kZXgpOwotCWlmIChzaW1wbGVTdHJpbmdzLmFkZCh0eXBlTmFtZSkgJiYgSmF2YUJ1aWxkZXIuREVCVUcpCisJd2FzTmV3ID0gc2ltcGxlTmFtZXMuYWRkKHR5cGVOYW1lKSB8IHdhc05ldzsKKwlpZiAod2FzTmV3ICYmIEphdmFCdWlsZGVyLkRFQlVHKQogCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgd2lsbCBsb29rIGZvciBkZXBlbmRlbnRzIG9mICIgLy8kTk9OLU5MUy0xJAogCQkJKyB0eXBlTmFtZSArICIgaW4gIiArIHBhY2thZ2VOYW1lKTsgLy8kTk9OLU5MUy0xJAogfQpAQCAtMjUyLDcgKzI3OCw3IEBACiAJCQlpZiAoIWlzRXhjbHVkZWQgJiYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKSkgewogCQkJCS8vIHBlcmZvcm0gZnVsbCBidWlsZCBpZiBhIG1hbmFnZWQgY2xhc3MgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkCiAJCQkJSVBhdGggdHlwZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKG5ld1N0YXRlLmlzS25vd25UeXBlKHR5cGVQYXRoLnRvU3RyaW5nKCkpKSB7CisJCQkJaWYgKHRoaXMubmV3U3RhdGUuaXNLbm93blR5cGUodHlwZVBhdGgudG9TdHJpbmcoKSkpIHsKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNVVNUIERPIEZVTEwgQlVJTEQuIEZvdW5kIGNoYW5nZSB0byBjbGFzcyBmaWxlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjcwLDYgKzI5Niw3IEBACiAJdGhpcy5wcmV2aW91c1NvdXJjZUZpbGVzID0gbnVsbDsKIAl0aGlzLnF1YWxpZmllZFN0cmluZ3MgPSBudWxsOwogCXRoaXMuc2ltcGxlU3RyaW5ncyA9IG51bGw7CisJdGhpcy5yb290U3RyaW5ncyA9IG51bGw7CiAJdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlID0gbnVsbDsKIAl0aGlzLmhhc1N0cnVjdHVyYWxDaGFuZ2VzID0gZmFsc2U7CiAJdGhpcy5jb21waWxlTG9vcCA9IDA7CkBAIC0yODMsNyArMzEwLDcgQEAKIAkJQXJyYXlMaXN0IGV4dHJhcyA9IG51bGw7CiAJCWZvciAoaW50IGkgPSAwLCBsID0gYWRkaXRpb25hbFVuaXRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJU291cmNlRmlsZSB1bml0ID0gYWRkaXRpb25hbFVuaXRzW2ldOwotCQkJaWYgKHVuaXQgIT0gbnVsbCAmJiBuZXdTdGF0ZS5nZXREZWZpbmVkVHlwZU5hbWVzRm9yKHVuaXQudHlwZUxvY2F0b3IoKSkgIT0gbnVsbCkgeworCQkJaWYgKHVuaXQgIT0gbnVsbCAmJiB0aGlzLm5ld1N0YXRlLmdldERlZmluZWRUeXBlTmFtZXNGb3IodW5pdC50eXBlTG9jYXRvcigpKSAhPSBudWxsKSB7CiAJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3V0IHRvIGNvbXBpbGUgZmlsZSB3aXRoIHNlY29uZGFyeSB0eXBlcyAiKyB1bml0LnR5cGVMb2NhdG9yKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJaWYgKGV4dHJhcyA9PSBudWxsKQpAQCAtMzE0LDggKzM0MSw4IEBACiAJCQlpbnQgbWRTZWdtZW50Q291bnQgPSBzb3VyY2VGaWxlLnNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOwogCQkJSVBhdGggdHlwZVBhdGggPSBzb3VyY2VGaWxlLnJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhtZFNlZ21lbnRDb3VudCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwogCQkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCB0cnVlKTsgLy8gYWRkIGRlcGVuZGVudHMgb2YgdGhlIHNvdXJjZSBmaWxlIHNpbmNlIGl0cyBub3cgZGVsZXRlZAotCQkJcHJldmlvdXNTb3VyY2VGaWxlcyA9IG51bGw7IC8vIGV4aXN0aW5nIHNvdXJjZSBmaWxlcyBkaWQgbm90IHNlZSBpdCBhcyBkZWxldGVkIHNpbmNlIHRoZXkgd2VyZSBjb21waWxlZCBiZWZvcmUgaXQgd2FzCi0JCQljaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzID0gbmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcih0eXBlTG9jYXRvcik7CisJCQl0aGlzLnByZXZpb3VzU291cmNlRmlsZXMgPSBudWxsOyAvLyBleGlzdGluZyBzb3VyY2UgZmlsZXMgZGlkIG5vdCBzZWUgaXQgYXMgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmUgY29tcGlsZWQgYmVmb3JlIGl0IHdhcworCQkJY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcyA9IHRoaXMubmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcih0eXBlTG9jYXRvcik7CiAJCQlpZiAoZGVmaW5lZFR5cGVOYW1lcyA9PSBudWxsKSB7IC8vIGRlZmluZWQgYSBzaW5nbGUgdHlwZSBtYXRjaGluZyB0eXBlUGF0aAogCQkJCXJlbW92ZUNsYXNzRmlsZSh0eXBlUGF0aCwgc291cmNlRmlsZS5zb3VyY2VMb2NhdGlvbi5iaW5hcnlGb2xkZXIpOwogCQkJfSBlbHNlIHsKQEAgLTMyOSw3ICszNTYsNyBAQAogCQl9CiAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCS8vIG11c3QgY29udGludWUgd2l0aCBjb21waWxlIGxvb3Agc28ganVzdCBsb2cgdGhlIENvcmVFeGNlcHRpb24KLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJVXRpbC5sb2coZSwgIkphdmFCdWlsZGVyIGxvZ2dpbmcgQ29tcGlsYXRpb25QYXJ0aWNpcGFudCdzIENvcmVFeGNlcHRpb24gdG8gaGVscCBkZWJ1Z2dpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIH0KIApAQCAtMzU2LDEwICszODMsMTAgQEAKIAkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGJpbmFyeURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsgLy8gLmNsYXNzIGZpbGVzIGZyb20gY2xhc3MgZm9sZGVyCiAJCQkJCVN0cmluZ1NldCBzdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXMgPSBudWxsOwogCQkJCQlpZiAoYkxvY2F0aW9uLmlzT3V0cHV0Rm9sZGVyKCkpCi0JCQkJCQlzdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXMgPSB0aGlzLm5ld1N0YXRlLmdldFN0cnVjdHVyYWxseUNoYW5nZWRUeXBlcyhqYXZhQnVpbGRlci5nZXRMYXN0U3RhdGUocHJlcmVxUHJvamVjdCkpOworCQkJCQkJc3RydWN0dXJhbGx5Q2hhbmdlZFR5cGVzID0gdGhpcy5uZXdTdGF0ZS5nZXRTdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXModGhpcy5qYXZhQnVpbGRlci5nZXRMYXN0U3RhdGUocHJlcmVxUHJvamVjdCkpOwogCQkJCQlmb3IgKGludCBqID0gMCwgbSA9IGNoaWxkcmVuLmxlbmd0aDsgaiA8IG07IGorKykKIAkJCQkJCWZpbmRBZmZlY3RlZFNvdXJjZUZpbGVzKGNoaWxkcmVuW2pdLCBzZWdtZW50Q291bnQsIHN0cnVjdHVyYWxseUNoYW5nZWRUeXBlcyk7Ci0JCQkJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCQkJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4MCw3ICs0MDcsNyBAQAogCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlUGF0aC50b1N0cmluZygpOwogCQkJCQlpZiAoYmluYXJ5RGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7CiAJCQkJCQkvLyBzZWUgaWYgYW55IGtub3duIHNvdXJjZSBmaWxlIGlzIGZyb20gdGhlIHNhbWUgcGFja2FnZS4uLiBjbGFzc3BhdGggYWxyZWFkeSBpbmNsdWRlcyBuZXcgcGFja2FnZQotCQkJCQkJaWYgKCFuZXdTdGF0ZS5pc0tub3duUGFja2FnZShwYWNrYWdlTmFtZSkpIHsKKwkJCQkJCWlmICghdGhpcy5uZXdTdGF0ZS5pc0tub3duUGFja2FnZShwYWNrYWdlTmFtZSkpIHsKIAkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgYWRkZWQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJYWRkRGVwZW5kZW50c09mKHBhY2thZ2VQYXRoLCBmYWxzZSk7CkBAIC0zOTAsNyArNDE3LDcgQEAKIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwZWQgZGVwZW5kZW50cyBvZiBhZGRlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIHNlZSBpZiB0aGUgcGFja2FnZSBzdGlsbCBleGlzdHMgb24gdGhlIGNsYXNzcGF0aAotCQkJCQkJaWYgKCFuYW1lRW52aXJvbm1lbnQuaXNQYWNrYWdlKHBhY2thZ2VOYW1lKSkgeworCQkJCQkJaWYgKCF0aGlzLm5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UocGFja2FnZU5hbWUpKSB7CiAJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHJlbW92ZWQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJYWRkRGVwZW5kZW50c09mKHBhY2thZ2VQYXRoLCBmYWxzZSk7CkBAIC0zOTksNyArNDI2LDcgQEAKIAkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwZWQgZGVwZW5kZW50cyBvZiByZW1vdmVkIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9Ci0JCQkJCS8vIGZhbGwgdGhydSAmIHRyYXZlcnNlIHRoZSBzdWItcGFja2FnZXMgYW5kIC5jbGFzcyBmaWxlcworCQkJCQkvLyRGQUxMLVRIUk9VR0gkIHRyYXZlcnNlIHRoZSBzdWItcGFja2FnZXMgYW5kIC5jbGFzcyBmaWxlcwogCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CiAJCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBiaW5hcnlEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKQpAQCAtNDMxLDkgKzQ1OCw5IEBACiB9CiAKIHByb3RlY3RlZCBib29sZWFuIGZpbmRTb3VyY2VGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUFycmF5TGlzdCB2aXNpdGVkID0gdGhpcy5tYWtlT3V0cHV0Rm9sZGVyQ29uc2lzdGVudCA/IG5ldyBBcnJheUxpc3Qoc291cmNlTG9jYXRpb25zLmxlbmd0aCkgOiBudWxsOwotCWZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwlBcnJheUxpc3QgdmlzaXRlZCA9IHRoaXMubWFrZU91dHB1dEZvbGRlckNvbnNpc3RlbnQgPyBuZXcgQXJyYXlMaXN0KHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aCkgOiBudWxsOworCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG1kID0gdGhpcy5zb3VyY2VMb2NhdGlvbnNbaV07CiAJCWlmICh0aGlzLm1ha2VPdXRwdXRGb2xkZXJDb25zaXN0ZW50ICYmIG1kLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyICYmICF2aXNpdGVkLmNvbnRhaW5zKG1kLmJpbmFyeUZvbGRlcikpIHsKIAkJCS8vIGV2ZW4gYSBwcm9qZWN0IHdoaWNoIGFjdHMgYXMgaXRzIG93biBzb3VyY2UgZm9sZGVyIGNhbiBoYXZlIGFuIGluZGVwZW5kZW50L25lc3RlZCBvdXRwdXQgZm9sZGVyCiAJCQl2aXNpdGVkLmFkZChtZC5iaW5hcnlGb2xkZXIpOwpAQCAtNDQ2LDcgKzQ3Myw3IEBACiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KLQkJaWYgKG1kLnNvdXJjZUZvbGRlci5lcXVhbHMoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpKSB7CisJCWlmIChtZC5zb3VyY2VGb2xkZXIuZXF1YWxzKHRoaXMuamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpKSB7CiAJCQkvLyBza2lwIG5lc3RlZCBzb3VyY2UgJiBvdXRwdXQgZm9sZGVycyB3aGVuIHRoZSBwcm9qZWN0IGlzIGEgc291cmNlIGZvbGRlcgogCQkJaW50IHNlZ21lbnRDb3VudCA9IGRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7CiAJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwpAQCAtNDc5LDcgKzUwNiw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CkBAIC01MDIsNyArNTI5LDcgQEAKIAkJCQkJCUlQYXRoIGFkZGVkUGFja2FnZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KTsKIAkJCQkJCWNyZWF0ZUZvbGRlcihhZGRlZFBhY2thZ2VQYXRoLCBtZC5iaW5hcnlGb2xkZXIpOyAvLyBlbnN1cmUgcGFja2FnZSBleGlzdHMgaW4gdGhlIG91dHB1dCBmb2xkZXIKIAkJCQkJCS8vIHNlZSBpZiBhbnkga25vd24gc291cmNlIGZpbGUgaXMgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLi4uIGNsYXNzcGF0aCBhbHJlYWR5IGluY2x1ZGVzIG5ldyBwYWNrYWdlCi0JCQkJCQlpZiAoc291cmNlTG9jYXRpb25zLmxlbmd0aCA+IDEgJiYgbmV3U3RhdGUuaXNLbm93blBhY2thZ2UoYWRkZWRQYWNrYWdlUGF0aC50b1N0cmluZygpKSkgeworCQkJCQkJaWYgKHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aCA+IDEgJiYgdGhpcy5uZXdTdGF0ZS5pc0tub3duUGFja2FnZShhZGRlZFBhY2thZ2VQYXRoLnRvU3RyaW5nKCkpKSB7CiAJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwZWQgZGVwZW5kZW50cyBvZiBhZGRlZCBwYWNrYWdlICIgKyBhZGRlZFBhY2thZ2VQYXRoKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfSBlbHNlIHsKQEAgLTUxMCw4ICs1MzcsOCBAQAogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIGFkZGVkIHBhY2thZ2UgIiArIGFkZGVkUGFja2FnZVBhdGgpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJYWRkRGVwZW5kZW50c09mKGFkZGVkUGFja2FnZVBhdGgsIHRydWUpOwogCQkJCQkJfQotIAkJCQkgICAgfQotCQkJCQkvLyBmYWxsIHRocnUgJiBjb2xsZWN0IGFsbCB0aGUgc291cmNlIGZpbGVzCisJCQkJICAgIH0KKwkJCQkJLy8kRkFMTC1USFJPVUdIJCBjb2xsZWN0IGFsbCB0aGUgc291cmNlIGZpbGVzCiAJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKIAkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IHNvdXJjZURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKIAkJCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspCkBAIC01MjgsOSArNTU1LDkgQEAKIAkJCQkJCXJldHVybiB0cnVlOwogCQkJCSAgICB9CiAJCQkJCUlQYXRoIHJlbW92ZWRQYWNrYWdlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpOwotCQkJCQlpZiAoc291cmNlTG9jYXRpb25zLmxlbmd0aCA+IDEpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJCQkJCWlmIChzb3VyY2VMb2NhdGlvbnNbaV0uc291cmNlRm9sZGVyLmdldEZvbGRlcihyZW1vdmVkUGFja2FnZVBhdGgpLmV4aXN0cygpKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGggPiAxKSB7CisJCQkJCQlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCQkJCWlmICh0aGlzLnNvdXJjZUxvY2F0aW9uc1tpXS5zb3VyY2VGb2xkZXIuZ2V0Rm9sZGVyKHJlbW92ZWRQYWNrYWdlUGF0aCkuZXhpc3RzKCkpIHsKIAkJCQkJCQkJLy8gb25seSBhIHBhY2thZ2UgZnJhZ21lbnQgd2FzIHJlbW92ZWQsIHNhbWUgYXMgcmVtb3ZpbmcgbXVsdGlwbGUgc291cmNlIGZpbGVzCiAJCQkJCQkJCWNyZWF0ZUZvbGRlcihyZW1vdmVkUGFja2FnZVBhdGgsIG1kLmJpbmFyeUZvbGRlcik7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgogCQkJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIHJlbW92ZWRDaGlsZHJlbiA9IHNvdXJjZURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKQEAgLTU0MSw2ICs1NjgsMTIgQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJaWYgKChzb3VyY2VEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKKwkJCQkJCS8vIHNhbWUgaWRlYSBhcyBtb3ZpbmcgYSBzb3VyY2UgZmlsZQorCQkJCQkJLy8gc2VlIGJ1ZyAxNjMyMDAKKwkJCQkJCUlSZXNvdXJjZSBtb3ZlZEZvbGRlciA9IHRoaXMuamF2YUJ1aWxkZXIud29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoc291cmNlRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSk7CisJCQkJCQlKYXZhQnVpbGRlci5yZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKG1vdmVkRm9sZGVyKTsKKwkJCQkJfQogCQkJCQlJRm9sZGVyIHJlbW92ZWRQYWNrYWdlRm9sZGVyID0gbWQuYmluYXJ5Rm9sZGVyLmdldEZvbGRlcihyZW1vdmVkUGFja2FnZVBhdGgpOwogCQkJCQlpZiAocmVtb3ZlZFBhY2thZ2VGb2xkZXIuZXhpc3RzKCkpCiAJCQkJCQlyZW1vdmVkUGFja2FnZUZvbGRlci5kZWxldGUoSVJlc291cmNlLkZPUkNFLCBudWxsKTsKQEAgLTU0OCw3ICs1ODEsNyBAQAogCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHJlbW92ZWQgcGFja2FnZSAiICsgcmVtb3ZlZFBhY2thZ2VQYXRoKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlhZGREZXBlbmRlbnRzT2YocmVtb3ZlZFBhY2thZ2VQYXRoLCB0cnVlKTsKLQkJCQkJbmV3U3RhdGUucmVtb3ZlUGFja2FnZShzb3VyY2VEZWx0YSk7CisJCQkJCXRoaXMubmV3U3RhdGUucmVtb3ZlUGFja2FnZShzb3VyY2VEZWx0YSk7CiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CkBAIC01NjIsMTYgKzU5NSwxNiBAQAogCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKIAkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGUgdGhpcyBhZGRlZCBzb3VyY2UgZmlsZSAiICsgdHlwZUxvY2F0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlzb3VyY2VGaWxlcy5hZGQobmV3IFNvdXJjZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgbWQsIHRydWUpKTsKKwkJCQkJCXRoaXMuc291cmNlRmlsZXMuYWRkKG5ldyBTb3VyY2VGaWxlKChJRmlsZSkgcmVzb3VyY2UsIG1kLCB0cnVlKSk7CiAJCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlUGF0aC50b1N0cmluZygpOwotCQkJCQkJaWYgKCFuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0b3IodHlwZU5hbWUsIHR5cGVMb2NhdG9yKSkgeyAvLyBhZGRpbmcgZGVwZW5kZW50cyByZXN1bHRzIGluIDIgZHVwbGljYXRlIGVycm9ycworCQkJCQkJaWYgKCF0aGlzLm5ld1N0YXRlLmlzRHVwbGljYXRlTG9jYXRvcih0eXBlTmFtZSwgdHlwZUxvY2F0b3IpKSB7IC8vIGFkZGluZyBkZXBlbmRlbnRzIHJlc3VsdHMgaW4gMiBkdXBsaWNhdGUgZXJyb3JzCiAJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIGFkZGVkIHNvdXJjZSBmaWxlICIgKyB0eXBlTmFtZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlhZGREZXBlbmRlbnRzT2YodHlwZVBhdGgsIHRydWUpOwogCQkJCQkJfQogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCQljaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzID0gbmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcih0eXBlTG9jYXRvcik7CisJCQkJCQljaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzID0gdGhpcy5uZXdTdGF0ZS5nZXREZWZpbmVkVHlwZU5hbWVzRm9yKHR5cGVMb2NhdG9yKTsKIAkJCQkJCWlmIChkZWZpbmVkVHlwZU5hbWVzID09IG51bGwpIHsgLy8gZGVmaW5lZCBhIHNpbmdsZSB0eXBlIG1hdGNoaW5nIHR5cGVQYXRoCiAJCQkJCQkJcmVtb3ZlQ2xhc3NGaWxlKHR5cGVQYXRoLCBtZC5iaW5hcnlGb2xkZXIpOwogCQkJCQkJCWlmICgoc291cmNlRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7CkBAIC01NzksOCArNjEyLDggQEAKIAkJCQkJCQkJLy8gaWYgdGhlIHRhcmdldCBmaWxlIGlzIGEgY29tcGlsYXRpb24gdW5pdCwgdGhlIG5ldyBjdSB3aWxsIGJlIHJlY29tcGlsZWQKIAkJCQkJCQkJLy8gaWYgdGhlIHRhcmdldCBmaWxlIGlzIGEgbm9uLWphdmEgcmVzb3VyY2UsIHRoZW4gbWFya2VycyBhcmUgcmVtb3ZlZAogCQkJCQkJCQkvLyBzZWUgYnVnIDI4NTcKLQkJCQkJCQkJSVJlc291cmNlIG1vdmVkRmlsZSA9IGphdmFCdWlsZGVyLndvcmtzcGFjZVJvb3QuZ2V0RmlsZShzb3VyY2VEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKTsKLQkJCQkJCQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcihtb3ZlZEZpbGUpOyAKKwkJCQkJCQkJSVJlc291cmNlIG1vdmVkRmlsZSA9IHRoaXMuamF2YUJ1aWxkZXIud29ya3NwYWNlUm9vdC5nZXRGaWxlKHNvdXJjZURlbHRhLmdldE1vdmVkVG9QYXRoKCkpOworCQkJCQkJCQlKYXZhQnVpbGRlci5yZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKG1vdmVkRmlsZSk7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCkBAIC01OTIsNyArNjI1LDcgQEAKIAkJCQkJCQkJCXJlbW92ZUNsYXNzRmlsZShwYWNrYWdlUGF0aC5hcHBlbmQobmV3IFN0cmluZyhkZWZpbmVkVHlwZU5hbWVzW2ldKSksIG1kLmJpbmFyeUZvbGRlcik7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJbmV3U3RhdGUucmVtb3ZlTG9jYXRvcih0eXBlTG9jYXRvcik7CisJCQkJCQl0aGlzLm5ld1N0YXRlLnJlbW92ZUxvY2F0b3IodHlwZUxvY2F0b3IpOwogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CiAJCQkJCQlpZiAoKHNvdXJjZURlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwCkBAIC02MDAsMTQgKzYzMywxNCBAQAogCQkJCQkJCXJldHVybiB0cnVlOyAvLyBza2lwIGl0IHNpbmNlIGl0IHJlYWxseSBpc24ndCBjaGFuZ2VkCiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgY2hhbmdlZCBzb3VyY2UgZmlsZSAiICsgdHlwZUxvY2F0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlzb3VyY2VGaWxlcy5hZGQobmV3IFNvdXJjZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgbWQsIHRydWUpKTsKKwkJCQkJCXRoaXMuc291cmNlRmlsZXMuYWRkKG5ldyBTb3VyY2VGaWxlKChJRmlsZSkgcmVzb3VyY2UsIG1kLCB0cnVlKSk7CiAJCQkJfQogCQkJCXJldHVybiB0cnVlOwogCQkJfSBlbHNlIGlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShyZXNvdXJjZU5hbWUpKSB7CiAJCQkJLy8gcGVyZm9ybSBmdWxsIGJ1aWxkIGlmIGEgbWFuYWdlZCBjbGFzcyBmaWxlIGhhcyBiZWVuIGNoYW5nZWQKIAkJCQlpZiAodGhpcy5tYWtlT3V0cHV0Rm9sZGVyQ29uc2lzdGVudCkgewogCQkJCQlJUGF0aCB0eXBlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKG5ld1N0YXRlLmlzS25vd25UeXBlKHR5cGVQYXRoLnRvU3RyaW5nKCkpKSB7CisJCQkJCWlmICh0aGlzLm5ld1N0YXRlLmlzS25vd25UeXBlKHR5cGVQYXRoLnRvU3RyaW5nKCkpKSB7CiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNVVNUIERPIEZVTEwgQlVJTEQuIEZvdW5kIGNoYW5nZSB0byBjbGFzcyBmaWxlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCXJldHVybiBmYWxzZTsKQEAgLTYxNSw3ICs2NDgsNyBAQAogCQkJCX0KIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0gZWxzZSBpZiAobWQuaGFzSW5kZXBlbmRlbnRPdXRwdXRGb2xkZXIpIHsKLQkJCQlpZiAoamF2YUJ1aWxkZXIuZmlsdGVyRXh0cmFSZXNvdXJjZShyZXNvdXJjZSkpIHJldHVybiB0cnVlOworCQkJCWlmICh0aGlzLmphdmFCdWlsZGVyLmZpbHRlckV4dHJhUmVzb3VyY2UocmVzb3VyY2UpKSByZXR1cm4gdHJ1ZTsKIAogCQkJCS8vIGNvcHkgYWxsIG90aGVyIHJlc291cmNlIGRlbHRhcyB0byB0aGUgb3V0cHV0IGZvbGRlcgogCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpOwpAQCAtNjMwLDggKzY2Myw3IEBACiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGFkZGVkIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWNyZWF0ZUZvbGRlcihyZXNvdXJjZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBtZC5iaW5hcnlGb2xkZXIpOyAvLyBlbnN1cmUgcGFja2FnZSBleGlzdHMgaW4gdGhlIG91dHB1dCBmb2xkZXIKLQkJCQkJCXJlc291cmNlLmNvcHkob3V0cHV0RmlsZS5nZXRGdWxsUGF0aCgpLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuREVSSVZFRCwgbnVsbCk7Ci0JCQkJCQlVdGlsLnNldFJlYWRPbmx5KG91dHB1dEZpbGUsIGZhbHNlKTsgLy8ganVzdCBpbiBjYXNlIHRoZSBvcmlnaW5hbCB3YXMgcmVhZCBvbmx5CisJCQkJCQljb3B5UmVzb3VyY2UocmVzb3VyY2UsIG91dHB1dEZpbGUpOwogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CiAJCQkJCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgewpAQCAtNjUyLDggKzY4NCw3IEBACiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGNoYW5nZWQgZmlsZSAiICsgcmVzb3VyY2VQYXRoKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJY3JlYXRlRm9sZGVyKHJlc291cmNlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIG1kLmJpbmFyeUZvbGRlcik7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgotCQkJCQkJcmVzb3VyY2UuY29weShvdXRwdXRGaWxlLmdldEZ1bGxQYXRoKCksIElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5ERVJJVkVELCBudWxsKTsKLQkJCQkJCVV0aWwuc2V0UmVhZE9ubHkob3V0cHV0RmlsZSwgZmFsc2UpOyAvLyBqdXN0IGluIGNhc2UgdGhlIG9yaWdpbmFsIHdhcyByZWFkIG9ubHkKKwkJCQkJCWNvcHlSZXNvdXJjZShyZXNvdXJjZSwgb3V0cHV0RmlsZSk7CiAJCQkJfQogCQkJCXJldHVybiB0cnVlOwogCQkJfQpAQCAtNjYyLDcgKzY5Myw3IEBACiB9CiAKIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkV2l0aChTdHJpbmcgc291cmNlTG9jYXRvciwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0LCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgZGVmaW5lZFR5cGVOYW1lcywgQXJyYXlMaXN0IGR1cGxpY2F0ZVR5cGVOYW1lcykgewotCWNoYXJbXVtdIHByZXZpb3VzVHlwZU5hbWVzID0gbmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcihzb3VyY2VMb2NhdG9yKTsKKwljaGFyW11bXSBwcmV2aW91c1R5cGVOYW1lcyA9IHRoaXMubmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcihzb3VyY2VMb2NhdG9yKTsKIAlpZiAocHJldmlvdXNUeXBlTmFtZXMgPT0gbnVsbCkKIAkJcHJldmlvdXNUeXBlTmFtZXMgPSBuZXcgY2hhcltdW10ge21haW5UeXBlTmFtZX07CiAJSVBhdGggcGFja2FnZVBhdGggPSBudWxsOwpAQCAtNjc3LDEzICs3MDgsMTMgQEAKIAkJCWludCBjb3VudCA9IHNvdXJjZUZpbGUuc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7CiAJCQlwYWNrYWdlUGF0aCA9IHNvdXJjZUZpbGUucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvdW50KS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CiAJCX0KLQkJaWYgKHNlY29uZGFyeVR5cGVzVG9SZW1vdmUgPT0gbnVsbCkKKwkJaWYgKHRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9PSBudWxsKQogCQkJdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKCk7Ci0JCUFycmF5TGlzdCB0eXBlcyA9IChBcnJheUxpc3QpIHNlY29uZGFyeVR5cGVzVG9SZW1vdmUuZ2V0KHNvdXJjZUZpbGUuc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyKTsKKwkJQXJyYXlMaXN0IHR5cGVzID0gKEFycmF5TGlzdCkgdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmdldChzb3VyY2VGaWxlLnNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcik7CiAJCWlmICh0eXBlcyA9PSBudWxsKQogCQkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0KGRlZmluZWRUeXBlTmFtZXMuc2l6ZSgpKTsKIAkJdHlwZXMuYWRkKHBhY2thZ2VQYXRoLmFwcGVuZChuZXcgU3RyaW5nKHByZXZpb3VzKSkpOwotCQlzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLnB1dChzb3VyY2VGaWxlLnNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlciwgdHlwZXMpOworCQl0aGlzLnNlY29uZGFyeVR5cGVzVG9SZW1vdmUucHV0KHNvdXJjZUZpbGUuc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyLCB0eXBlcyk7CiAJfQogCXN1cGVyLmZpbmlzaGVkV2l0aChzb3VyY2VMb2NhdG9yLCByZXN1bHQsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcywgZHVwbGljYXRlVHlwZU5hbWVzKTsKIH0KQEAgLTcwMSw3ICs3MzIsNyBAQAogCQlpZiAoYWRkZWRHZW5lcmF0ZWRGaWxlcyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBqID0gYWRkZWRHZW5lcmF0ZWRGaWxlcy5sZW5ndGg7IC0taiA+PSAwOykgewogCQkJCVNvdXJjZUZpbGUgc291cmNlRmlsZSA9IGZpbmRTb3VyY2VGaWxlKGFkZGVkR2VuZXJhdGVkRmlsZXNbal0sIHRydWUpOwotCQkJCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgIXNvdXJjZUZpbGVzLmNvbnRhaW5zKHNvdXJjZUZpbGUpKQorCQkJCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgIXRoaXMuc291cmNlRmlsZXMuY29udGFpbnMoc291cmNlRmlsZSkpCiAJCQkJCXRoaXMuc291cmNlRmlsZXMuYWRkKHNvdXJjZUZpbGUpOwogCQkJfQogCQl9CkBAIC03MTIsNyArNzQzLDcgQEAKIAogcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2xhc3NGaWxlKElQYXRoIHR5cGVQYXRoLCBJQ29udGFpbmVyIG91dHB1dEZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWlmICh0eXBlUGF0aC5sYXN0U2VnbWVudCgpLmluZGV4T2YoJyQnKSA9PSAtMSkgeyAvLyBpcyBub3QgYSBuZXN0ZWQgdHlwZQotCQluZXdTdGF0ZS5yZW1vdmVRdWFsaWZpZWRUeXBlTmFtZSh0eXBlUGF0aC50b1N0cmluZygpKTsKKwkJdGhpcy5uZXdTdGF0ZS5yZW1vdmVRdWFsaWZpZWRUeXBlTmFtZSh0eXBlUGF0aC50b1N0cmluZygpKTsKIAkJLy8gYWRkIGRlcGVuZGVudHMgZXZlbiB3aGVuIHRoZSB0eXBlIHRoaW5rcyBpdCBkb2VzIG5vdCBleGlzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCiAJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgcmVtb3ZlZCB0eXBlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKQEAgLTcyNyw5ICs3NTgsOSBAQAogfQogCiBwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWNvbmRhcnlUeXBlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlpZiAoc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSAhPSBudWxsKSB7IC8vIGRlbGF5ZWQgZGVsZXRpbmcgc2Vjb25kYXJ5IHR5cGVzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbXBpbGUgbG9vcAotCQlPYmplY3RbXSBrZXlUYWJsZSA9IHNlY29uZGFyeVR5cGVzVG9SZW1vdmUua2V5VGFibGU7Ci0JCU9iamVjdFtdIHZhbHVlVGFibGUgPSBzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLnZhbHVlVGFibGU7CisJaWYgKHRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSAhPSBudWxsKSB7IC8vIGRlbGF5ZWQgZGVsZXRpbmcgc2Vjb25kYXJ5IHR5cGVzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbXBpbGUgbG9vcAorCQlPYmplY3RbXSBrZXlUYWJsZSA9IHRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZS5rZXlUYWJsZTsKKwkJT2JqZWN0W10gdmFsdWVUYWJsZSA9IHRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZS52YWx1ZVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSAoSUNvbnRhaW5lcikga2V5VGFibGVbaV07CiAJCQlpZiAob3V0cHV0Rm9sZGVyICE9IG51bGwpIHsKQEAgLTczOSw3ICs3NzAsNyBAQAogCQkJfQogCQl9CiAJCXRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9IG51bGw7Ci0JCWlmIChwcmV2aW91c1NvdXJjZUZpbGVzICE9IG51bGwpCisJCWlmICh0aGlzLnByZXZpb3VzU291cmNlRmlsZXMgIT0gbnVsbCkKIAkJCXRoaXMucHJldmlvdXNTb3VyY2VGaWxlcyA9IG51bGw7IC8vIGNhbm5vdCBvcHRpbWl6ZSByZWNvbXBpbGUgY2FzZSB3aGVuIGEgc2Vjb25kYXJ5IHR5cGUgaXMgZGVsZXRlZCwgc2VlIDE4MTI2OQogCX0KIH0KQEAgLTc1MCw2ICs3ODEsNyBAQAogCQl0aGlzLnByZXZpb3VzU291cmNlRmlsZXMgPSBudWxsOwogCQl0aGlzLnF1YWxpZmllZFN0cmluZ3MgPSBuZXcgU3RyaW5nU2V0KDMpOwogCQl0aGlzLnNpbXBsZVN0cmluZ3MgPSBuZXcgU3RyaW5nU2V0KDMpOworCQl0aGlzLnJvb3RTdHJpbmdzID0gbmV3IFN0cmluZ1NldCgzKTsKIAkJdGhpcy5oYXNTdHJ1Y3R1cmFsQ2hhbmdlcyA9IGZhbHNlOwogCQl0aGlzLmNvbXBpbGVMb29wID0gMDsKIAl9IGVsc2UgewpAQCAtNzU4LDYgKzc5MCw3IEBACiAJCXRoaXMuc291cmNlRmlsZXMuY2xlYXIoKTsKIAkJdGhpcy5xdWFsaWZpZWRTdHJpbmdzLmNsZWFyKCk7CiAJCXRoaXMuc2ltcGxlU3RyaW5ncy5jbGVhcigpOworCQl0aGlzLnJvb3RTdHJpbmdzLmNsZWFyKCk7CiAJCXRoaXMud29ya1F1ZXVlLmNsZWFyKCk7CiAJfQogfQpAQCAtNzY3LDcgKzgwMCw3IEBACiAJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKIAlpZiAocHJvYmxlbXMgPT0gbnVsbCAmJiBtYXJrZXJzLmxlbmd0aCA9PSAwKSByZXR1cm47CiAKLQlub3RpZmllci51cGRhdGVQcm9ibGVtQ291bnRzKG1hcmtlcnMsIHByb2JsZW1zKTsKKwl0aGlzLm5vdGlmaWVyLnVwZGF0ZVByb2JsZW1Db3VudHMobWFya2VycywgcHJvYmxlbXMpOwogCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zRm9yKHNvdXJjZUZpbGUucmVzb3VyY2UpOwogCXN0b3JlUHJvYmxlbXNGb3Ioc291cmNlRmlsZSwgcHJvYmxlbXMpOwogfQpAQCAtNzgxLDE1ICs4MTQsMTkgQEAKIAlzdG9yZVRhc2tzRm9yKHNvdXJjZUZpbGUsIHRhc2tzKTsKIH0KIAotcHJvdGVjdGVkIHZvaWQgd3JpdGVDbGFzc0ZpbGVCeXRlcyhieXRlW10gYnl0ZXMsIElGaWxlIGZpbGUsIFN0cmluZyBxdWFsaWZpZWRGaWxlTmFtZSwgYm9vbGVhbiBpc1RvcExldmVsVHlwZSwgU291cmNlRmlsZSBjb21waWxhdGlvblVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkFic3RyYWN0SW1hZ2VCdWlsZGVyI3dyaXRlQ2xhc3NGaWxlQ29udGVudHMob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZSwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuU291cmNlRmlsZSkKKyAqLworcHJvdGVjdGVkIHZvaWQgd3JpdGVDbGFzc0ZpbGVDb250ZW50cyhDbGFzc0ZpbGUgY2xhc3NmaWxlLCBJRmlsZSBmaWxlLCBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUsIGJvb2xlYW4gaXNUb3BMZXZlbFR5cGUsIFNvdXJjZUZpbGUgY29tcGlsYXRpb25Vbml0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJLy8gQmVmb3JlIHdyaXRpbmcgb3V0IHRoZSBjbGFzcyBmaWxlLCBjb21wYXJlIGl0IHRvIHRoZSBwcmV2aW91cyBmaWxlCiAJLy8gSWYgc3RydWN0dXJhbCBjaGFuZ2VzIG9jY3VycmVkIHRoZW4gYWRkIGRlcGVuZGVudCBzb3VyY2UgZmlsZXMKKwlieXRlW10gYnl0ZXMgPSBjbGFzc2ZpbGUuZ2V0Qnl0ZXMoKTsKIAlpZiAoZmlsZS5leGlzdHMoKSkgewogCQlpZiAod3JpdGVDbGFzc0ZpbGVDaGVjayhmaWxlLCBxdWFsaWZpZWRGaWxlTmFtZSwgYnl0ZXMpIHx8IGNvbXBpbGF0aW9uVW5pdC51cGRhdGVDbGFzc0ZpbGUpIHsgLy8gc2VlIDQ2MDkzCiAJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIGNoYW5nZWQgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKIAkJCWlmICghZmlsZS5pc0Rlcml2ZWQoKSkKLQkJCQlmaWxlLnNldERlcml2ZWQodHJ1ZSk7CisJCQkJZmlsZS5zZXREZXJpdmVkKHRydWUsIG51bGwpOwogCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCB0cnVlLCBmYWxzZSwgbnVsbCk7CiAJCX0gZWxzZSBpZiAoSmF2YUJ1aWxkZXIuREVCVUcpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBlZCBvdmVyIHVuY2hhbmdlZCBjbGFzcyBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJApAQCAtODA3LDcgKzg0NCw3IEBACiAJCQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIElSZXNvdXJjZVN0YXR1cykgewogCQkJCQlJUGF0aCBvbGRGaWxlUGF0aCA9ICgoSVJlc291cmNlU3RhdHVzKSBzdGF0dXMpLmdldFBhdGgoKTsKIAkJCQkJY2hhcltdIG9sZFR5cGVOYW1lID0gb2xkRmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCkudG9DaGFyQXJyYXkoKTsKLQkJCQkJY2hhcltdW10gcHJldmlvdXNUeXBlTmFtZXMgPSBuZXdTdGF0ZS5nZXREZWZpbmVkVHlwZU5hbWVzRm9yKGNvbXBpbGF0aW9uVW5pdC50eXBlTG9jYXRvcigpKTsKKwkJCQkJY2hhcltdW10gcHJldmlvdXNUeXBlTmFtZXMgPSB0aGlzLm5ld1N0YXRlLmdldERlZmluZWRUeXBlTmFtZXNGb3IoY29tcGlsYXRpb25Vbml0LnR5cGVMb2NhdG9yKCkpOwogCQkJCQlib29sZWFuIGZyb21TYW1lRmlsZSA9IGZhbHNlOwogCQkJCQlpZiAocHJldmlvdXNUeXBlTmFtZXMgPT0gbnVsbCkgewogCQkJCQkJZnJvbVNhbWVGaWxlID0gQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpLCBvbGRUeXBlTmFtZSk7CkBAIC04NjgsNyArOTA1LDcgQEAKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gImluY3JlbWVudGFsIGltYWdlIGJ1aWxkZXIgZm9yOlxuXHRuZXcgc3RhdGU6ICIgKyBuZXdTdGF0ZTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiaW5jcmVtZW50YWwgaW1hZ2UgYnVpbGRlciBmb3I6XG5cdG5ldyBzdGF0ZTogIiArIHRoaXMubmV3U3RhdGU7IC8vJE5PTi1OTFMtMSQKIH0KIAogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0phdmFCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0phdmFCdWlsZGVyLmphdmEKaW5kZXggZTBlNjE3My4uYTk3ZGM2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9KYXZhQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSmF2YUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zOCw2ICszOCw3IEBACiBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfSUQgPSAiSkRUIjsgLy8kTk9OLU5MUy0xJAogCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBTSE9XX1NUQVRTID0gZmFsc2U7CiAKIC8qKgogICogQSBsaXN0IG9mIHByb2plY3QgbmFtZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQuCkBAIC0xNTMsMTYgKzE1NCwxNiBAQAogCiBwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGlnbm9yZWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCXRoaXMuY3VycmVudFByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwgfHwgIWN1cnJlbnRQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSByZXR1cm4gbmV3IElQcm9qZWN0WzBdOworCWlmICh0aGlzLmN1cnJlbnRQcm9qZWN0ID09IG51bGwgfHwgIXRoaXMuY3VycmVudFByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHJldHVybiBuZXcgSVByb2plY3RbMF07CiAKIAlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5TdGFydGluZyBidWlsZCBvZiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIGJ1aWxkIG9mICIgKyB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSAvLyROT04tTkxTLTEkCiAJCQkrICIgQCAiICsgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsgLy8kTk9OLU5MUy0xJAotCXRoaXMubm90aWZpZXIgPSBuZXcgQnVpbGROb3RpZmllcihtb25pdG9yLCBjdXJyZW50UHJvamVjdCk7Ci0Jbm90aWZpZXIuYmVnaW4oKTsKKwl0aGlzLm5vdGlmaWVyID0gbmV3IEJ1aWxkTm90aWZpZXIobW9uaXRvciwgdGhpcy5jdXJyZW50UHJvamVjdCk7CisJdGhpcy5ub3RpZmllci5iZWdpbigpOwogCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAl0cnkgewotCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJCWtpbmQgPSBpbml0aWFsaXplQnVpbGRlcihraW5kLCB0cnVlKTsKIAogCQlpZiAoaXNXb3J0aEJ1aWxkaW5nKCkpIHsKQEAgLTE3MSw3ICsxNzIsNyBAQAogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgZnVsbCBidWlsZCBhcyByZXF1ZXN0ZWQgYnkgdXNlciIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnVpbGRBbGwoKTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKCh0aGlzLmxhc3RTdGF0ZSA9IGdldExhc3RTdGF0ZShjdXJyZW50UHJvamVjdCkpID09IG51bGwpIHsKKwkJCQlpZiAoKHRoaXMubGFzdFN0YXRlID0gZ2V0TGFzdFN0YXRlKHRoaXMuY3VycmVudFByb2plY3QpKSA9PSBudWxsKSB7CiAJCQkJCWlmIChERUJVRykKIAkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGVyZm9ybWluZyBmdWxsIGJ1aWxkIHNpbmNlIGxhc3Qgc2F2ZWQgc3RhdGUgd2FzIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJ1aWxkQWxsKCk7CkBAIC0xODEsNyArMTgyLDcgQEAKIAkJCQkJaWYgKERFQlVHKQogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQZXJmb3JtaW5nIGZ1bGwgYnVpbGQgc2luY2UgY2xhc3NwYXRoIGhhcyBjaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJYnVpbGRBbGwoKTsKLQkJCQl9IGVsc2UgaWYgKG5hbWVFbnZpcm9ubWVudC5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoID4gMCkgeworCQkJCX0gZWxzZSBpZiAodGhpcy5uYW1lRW52aXJvbm1lbnQuc291cmNlTG9jYXRpb25zLmxlbmd0aCA+IDApIHsKIAkJCQkJLy8gaWYgdGhlcmUgaXMgbm8gc291cmNlIHRvIGNvbXBpbGUgJiBubyBjbGFzc3BhdGggY2hhbmdlcyB0aGVuIHdlIGFyZSBkb25lCiAJCQkJCVNpbXBsZUxvb2t1cFRhYmxlIGRlbHRhcyA9IGZpbmREZWx0YXMoKTsKIAkJCQkJaWYgKGRlbHRhcyA9PSBudWxsKSB7CkBAIC0yMDEsNDIgKzIwMiwyNCBAQAogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYgKERFQlVHKQogCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aGluZyB0byBidWlsZCBzaW5jZSB0aGVyZSBhcmUgbm8gc291cmNlIGZvbGRlcnMgYW5kIG5vIGRlbHRhcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsYXN0U3RhdGUudGFnQXNOb29wQnVpbGQoKTsKKwkJCQkJCXRoaXMubGFzdFN0YXRlLnRhZ0FzTm9vcEJ1aWxkKCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQlvayA9IHRydWU7CiAJCX0KIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJVXRpbC5sb2coZSwgIkphdmFCdWlsZGVyIGhhbmRsaW5nIENvcmVFeGNlcHRpb24gd2hpbGUgYnVpbGRpbmc6ICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAotCQkJbmV3IFN0cmluZ1tdIHtJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuU0VWRVJJVFksIElKYXZhTW9kZWxNYXJrZXIuQ0FURUdPUllfSUQsIElNYXJrZXIuU09VUkNFX0lEfSwKLQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9pbmNvbnNpc3RlbnRQcm9qZWN0LCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksCi0JCQkJbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9FUlJPUiksCi0JCQkJbmV3IEludGVnZXIoQ2F0ZWdvcml6ZWRQcm9ibGVtLkNBVF9CVUlMRFBBVEgpLAotCQkJCUphdmFCdWlsZGVyLlNPVVJDRV9JRAotCQkJfQotCQkpOworCQlVdGlsLmxvZyhlLCAiSmF2YUJ1aWxkZXIgaGFuZGxpbmcgQ29yZUV4Y2VwdGlvbiB3aGlsZSBidWlsZGluZzogIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQljcmVhdGVJbmNvbnNpc3RlbnRCdWlsZE1hcmtlcihlKTsKIAl9IGNhdGNoIChJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiBlKSB7Ci0JCVV0aWwubG9nKGUuZ2V0VGhyb3dhYmxlKCksICJKYXZhQnVpbGRlciBoYW5kbGluZyBJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiB3aGlsZSBidWlsZGluZzogIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCi0JCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSUphdmFNb2RlbE1hcmtlci5DQVRFR09SWV9JRCwgSU1hcmtlci5TT1VSQ0VfSUR9LAotCQkJbmV3IE9iamVjdFtdIHsKLQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2luY29uc2lzdGVudFByb2plY3QsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwKLQkJCQluZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSwKLQkJCQluZXcgSW50ZWdlcihDYXRlZ29yaXplZFByb2JsZW0uQ0FUX0JVSUxEUEFUSCksCi0JCQkJSmF2YUJ1aWxkZXIuU09VUkNFX0lECi0JCQl9Ci0JCSk7CisJCVV0aWwubG9nKGUuZ2V0VGhyb3dhYmxlKCksICJKYXZhQnVpbGRlciBoYW5kbGluZyBJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiB3aGlsZSBidWlsZGluZzogIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQljcmVhdGVJbmNvbnNpc3RlbnRCdWlsZE1hcmtlcihlLmNvcmVFeGNlcHRpb24pOwogCX0gY2F0Y2ggKE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uIGUpIHsKIAkJLy8gZG8gbm90IGxvZyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSBpdHMgdGhyb3duIHRvIGhhbmRsZSBhYm9ydGVkIGNvbXBpbGVzIGJlY2F1c2Ugb2YgbWlzc2luZyBzb3VyY2UgZmlsZXMKIAkJaWYgKERFQlVHKQogCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfbWlzc2luZ1NvdXJjZUZpbGUsIGUubWlzc2luZ1NvdXJjZUZpbGUpKTsKLQkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKLQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKKwkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcih0aGlzLmN1cnJlbnRQcm9qZWN0KTsgLy8gbWFrZSB0aGlzIHRoZSBvbmx5IHByb2JsZW0gZm9yIHRoaXMgcHJvamVjdAorCQlJTWFya2VyIG1hcmtlciA9IHRoaXMuY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CiAJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAogCQkJbmV3IFN0cmluZ1tdIHtJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU09VUkNFX0lEfSwKIAkJCW5ldyBPYmplY3RbXSB7CkBAIC0yNDYsMjQgKzIyOSwyNiBAQAogCQkJfQogCQkpOwogCX0gZmluYWxseSB7CisJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5wYXJ0aWNpcGFudHMgPT0gbnVsbCA/IDAgOiB0aGlzLnBhcnRpY2lwYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQl0aGlzLnBhcnRpY2lwYW50c1tpXS5idWlsZEZpbmlzaGVkKHRoaXMuamF2YVByb2plY3QpOwogCQlpZiAoIW9rKQogCQkJLy8gSWYgdGhlIGJ1aWxkIGZhaWxlZCwgY2xlYXIgdGhlIHByZXZpb3VzbHkgYnVpbHQgc3RhdGUsIGZvcmNpbmcgYSBmdWxsIGJ1aWxkIG5leHQgdGltZS4KIAkJCWNsZWFyTGFzdFN0YXRlKCk7Ci0JCW5vdGlmaWVyLmRvbmUoKTsKKwkJdGhpcy5ub3RpZmllci5kb25lKCk7CiAJCWNsZWFudXAoKTsKIAl9CiAJSVByb2plY3RbXSByZXF1aXJlZFByb2plY3RzID0gZ2V0UmVxdWlyZWRQcm9qZWN0cyh0cnVlKTsKIAlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgYnVpbGQgb2YgIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgYnVpbGQgb2YgIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCSsgIiBAICIgKyBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHJlcXVpcmVkUHJvamVjdHM7CiB9CiAKIHByaXZhdGUgdm9pZCBidWlsZEFsbCgpIHsKLQlub3RpZmllci5jaGVja0NhbmNlbCgpOwotCW5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9wcmVwYXJpbmdCdWlsZCwgdGhpcy5jdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsKLQlpZiAoREVCVUcgJiYgbGFzdFN0YXRlICE9IG51bGwpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSA6ICIgKyBsYXN0U3RhdGUpOyAvLyROT04tTkxTLTEkCisJdGhpcy5ub3RpZmllci5jaGVja0NhbmNlbCgpOworCXRoaXMubm90aWZpZXIuc3ViVGFzayhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX3ByZXBhcmluZ0J1aWxkLCB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSkpOworCWlmIChERUJVRyAmJiB0aGlzLmxhc3RTdGF0ZSAhPSBudWxsKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsZWFyaW5nIGxhc3Qgc3RhdGUgOiAiICsgdGhpcy5sYXN0U3RhdGUpOyAvLyROT04tTkxTLTEkCiAJY2xlYXJMYXN0U3RhdGUoKTsKIAlCYXRjaEltYWdlQnVpbGRlciBpbWFnZUJ1aWxkZXIgPSBuZXcgQmF0Y2hJbWFnZUJ1aWxkZXIodGhpcywgdHJ1ZSk7CiAJaW1hZ2VCdWlsZGVyLmJ1aWxkKCk7CkBAIC0yNzEsMTAgKzI1NiwxMCBAQAogfQogCiBwcml2YXRlIHZvaWQgYnVpbGREZWx0YXMoU2ltcGxlTG9va3VwVGFibGUgZGVsdGFzKSB7Ci0Jbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKLQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfcHJlcGFyaW5nQnVpbGQsIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKSk7Ci0JaWYgKERFQlVHICYmIGxhc3RTdGF0ZSAhPSBudWxsKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsZWFyaW5nIGxhc3Qgc3RhdGUgOiAiICsgbGFzdFN0YXRlKTsgLy8kTk9OLU5MUy0xJAorCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwl0aGlzLm5vdGlmaWVyLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5idWlsZF9wcmVwYXJpbmdCdWlsZCwgdGhpcy5jdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsKKwlpZiAoREVCVUcgJiYgdGhpcy5sYXN0U3RhdGUgIT0gbnVsbCkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDbGVhcmluZyBsYXN0IHN0YXRlIDogIiArIHRoaXMubGFzdFN0YXRlKTsgLy8kTk9OLU5MUy0xJAogCWNsZWFyTGFzdFN0YXRlKCk7IC8vIGNsZWFyIHRoZSBwcmV2aW91c2x5IGJ1aWx0IHN0YXRlIHNvIGlmIHRoZSBidWlsZCBmYWlscywgYSBmdWxsIGJ1aWxkIHdpbGwgb2NjdXIgbmV4dCB0aW1lCiAJSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIgaW1hZ2VCdWlsZGVyID0gbmV3IEluY3JlbWVudGFsSW1hZ2VCdWlsZGVyKHRoaXMpOwogCWlmIChpbWFnZUJ1aWxkZXIuYnVpbGQoZGVsdGFzKSkgewpAQCAtMjg4LDQyICsyNzMsNTcgQEAKIAogcHJvdGVjdGVkIHZvaWQgY2xlYW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJdGhpcy5jdXJyZW50UHJvamVjdCA9IGdldFByb2plY3QoKTsKLQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCB8fCAhY3VycmVudFByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHJldHVybjsKKwlpZiAodGhpcy5jdXJyZW50UHJvamVjdCA9PSBudWxsIHx8ICF0aGlzLmN1cnJlbnRQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSByZXR1cm47CiAKIAlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DbGVhbmluZyAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNsZWFuaW5nICIgKyB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSAvLyROT04tTkxTLTEkCiAJCQkrICIgQCAiICsgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsgLy8kTk9OLU5MUy0xJAotCXRoaXMubm90aWZpZXIgPSBuZXcgQnVpbGROb3RpZmllcihtb25pdG9yLCBjdXJyZW50UHJvamVjdCk7Ci0Jbm90aWZpZXIuYmVnaW4oKTsKKwl0aGlzLm5vdGlmaWVyID0gbmV3IEJ1aWxkTm90aWZpZXIobW9uaXRvciwgdGhpcy5jdXJyZW50UHJvamVjdCk7CisJdGhpcy5ub3RpZmllci5iZWdpbigpOwogCXRyeSB7Ci0JCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCXRoaXMubm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAogCQlpbml0aWFsaXplQnVpbGRlcihDTEVBTl9CVUlMRCwgdHJ1ZSk7CiAJCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSBhcyBwYXJ0IG9mIGNsZWFuIDogIiArIGxhc3RTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSBhcyBwYXJ0IG9mIGNsZWFuIDogIiArIHRoaXMubGFzdFN0YXRlKTsgLy8kTk9OLU5MUy0xJAogCQljbGVhckxhc3RTdGF0ZSgpOwotCQlyZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKGN1cnJlbnRQcm9qZWN0KTsKKwkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcih0aGlzLmN1cnJlbnRQcm9qZWN0KTsKIAkJbmV3IEJhdGNoSW1hZ2VCdWlsZGVyKHRoaXMsIGZhbHNlKS5jbGVhbk91dHB1dEZvbGRlcnMoZmFsc2UpOwogCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlVdGlsLmxvZyhlLCAiSmF2YUJ1aWxkZXIgaGFuZGxpbmcgQ29yZUV4Y2VwdGlvbiB3aGlsZSBjbGVhbmluZzogIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCi0JCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TT1VSQ0VfSUR9LAotCQkJbmV3IE9iamVjdFtdIHsKLQkJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX2luY29uc2lzdGVudFByb2plY3QsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwKLQkJCQluZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSwKLQkJCQlKYXZhQnVpbGRlci5TT1VSQ0VfSUQKLQkJCX0KLQkJKTsKKwkJVXRpbC5sb2coZSwgIkphdmFCdWlsZGVyIGhhbmRsaW5nIENvcmVFeGNlcHRpb24gd2hpbGUgY2xlYW5pbmc6ICIgKyB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJY3JlYXRlSW5jb25zaXN0ZW50QnVpbGRNYXJrZXIoZSk7CiAJfSBmaW5hbGx5IHsKLQkJbm90aWZpZXIuZG9uZSgpOworCQl0aGlzLm5vdGlmaWVyLmRvbmUoKTsKIAkJY2xlYW51cCgpOwogCX0KIAlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgY2xlYW5pbmcgIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgY2xlYW5pbmcgIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCSsgIiBAICIgKyBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOyAvLyROT04tTkxTLTEkCiB9CiAKK3ByaXZhdGUgdm9pZCBjcmVhdGVJbmNvbnNpc3RlbnRCdWlsZE1hcmtlcihDb3JlRXhjZXB0aW9uIGNvcmVFeGNlcHRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJSVN0YXR1cyBzdGF0dXMgPSBjb3JlRXhjZXB0aW9uLmdldFN0YXR1cygpOworIAlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgeworIAkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7CisgCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQorIAkJICAgIG1lc3NhZ2UgPSBjaGlsZHJlblswXS5nZXRNZXNzYWdlKCk7CisgCX0KKyAJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAJCW1lc3NhZ2UgPSBjb3JlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKworCUlNYXJrZXIgbWFya2VyID0gdGhpcy5jdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKKwltYXJrZXIuc2V0QXR0cmlidXRlcygKKwkJbmV3IFN0cmluZ1tdIHtJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuU0VWRVJJVFksIElKYXZhTW9kZWxNYXJrZXIuQ0FURUdPUllfSUQsIElNYXJrZXIuU09VUkNFX0lEfSwKKwkJbmV3IE9iamVjdFtdIHsKKwkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfaW5jb25zaXN0ZW50UHJvamVjdCwgbWVzc2FnZSksCisJCQluZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSwKKwkJCW5ldyBJbnRlZ2VyKENhdGVnb3JpemVkUHJvYmxlbS5DQVRfQlVJTERQQVRIKSwKKwkJCUphdmFCdWlsZGVyLlNPVVJDRV9JRAorCQl9CisJKTsKK30KKwogcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7CiAJdGhpcy5wYXJ0aWNpcGFudHMgPSBudWxsOwogCXRoaXMubmFtZUVudmlyb25tZW50ID0gbnVsbDsKQEAgLTMzNSw1NCArMzM1LDU0IEBACiB9CiAKIHByaXZhdGUgdm9pZCBjbGVhckxhc3RTdGF0ZSgpIHsKLQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5zZXRMYXN0QnVpbHRTdGF0ZShjdXJyZW50UHJvamVjdCwgbnVsbCk7CisJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuc2V0TGFzdEJ1aWx0U3RhdGUodGhpcy5jdXJyZW50UHJvamVjdCwgbnVsbCk7CiB9CiAKIGJvb2xlYW4gZmlsdGVyRXh0cmFSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQlpZiAoZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzICE9IG51bGwpIHsKKwlpZiAodGhpcy5leHRyYVJlc291cmNlRmlsZUZpbHRlcnMgIT0gbnVsbCkgewogCQljaGFyW10gbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKS50b0NoYXJBcnJheSgpOwotCQlmb3IgKGludCBpID0gMCwgbCA9IGV4dHJhUmVzb3VyY2VGaWxlRmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChleHRyYVJlc291cmNlRmlsZUZpbHRlcnNbaV0sIG5hbWUsIHRydWUpKQorCQlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMuZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHRoaXMuZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzW2ldLCBuYW1lLCB0cnVlKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKGV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzICE9IG51bGwpIHsKKwlpZiAodGhpcy5leHRyYVJlc291cmNlRm9sZGVyRmlsdGVycyAhPSBudWxsKSB7CiAJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CiAJCVN0cmluZyBwYXRoTmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKIAkJaW50IGNvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKIAkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgY291bnQtLTsKLQkJZm9yIChpbnQgaSA9IDAsIGwgPSBleHRyYVJlc291cmNlRm9sZGVyRmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCQlpZiAocGF0aE5hbWUuaW5kZXhPZihleHRyYVJlc291cmNlRm9sZGVyRmlsdGVyc1tpXSkgIT0gLTEpCisJCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5leHRyYVJlc291cmNlRm9sZGVyRmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQlpZiAocGF0aE5hbWUuaW5kZXhPZih0aGlzLmV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzW2ldKSAhPSAtMSkKIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspCi0JCQkJCWlmIChleHRyYVJlc291cmNlRm9sZGVyRmlsdGVyc1tpXS5lcXVhbHMocGF0aC5zZWdtZW50KGopKSkKKwkJCQkJaWYgKHRoaXMuZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbaV0uZXF1YWxzKHBhdGguc2VnbWVudChqKSkpCiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQogCiBwcml2YXRlIFNpbXBsZUxvb2t1cFRhYmxlIGZpbmREZWx0YXMoKSB7Ci0Jbm90aWZpZXIuc3ViVGFzayhNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmJ1aWxkX3JlYWRpbmdEZWx0YSwgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKSk7Ci0JSVJlc291cmNlRGVsdGEgZGVsdGEgPSBnZXREZWx0YShjdXJyZW50UHJvamVjdCk7CisJdGhpcy5ub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfcmVhZGluZ0RlbHRhLCB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSkpOworCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZ2V0RGVsdGEodGhpcy5jdXJyZW50UHJvamVjdCk7CiAJU2ltcGxlTG9va3VwVGFibGUgZGVsdGFzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOwogCWlmIChkZWx0YSAhPSBudWxsKSB7CiAJCWlmIChkZWx0YS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKSB7CiAJCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBzb3VyY2UgZGVsdGEgZm9yOiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVsdGFzLnB1dChjdXJyZW50UHJvamVjdCwgZGVsdGEpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgc291cmNlIGRlbHRhIGZvcjogIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVsdGFzLnB1dCh0aGlzLmN1cnJlbnRQcm9qZWN0LCBkZWx0YSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pc3NpbmcgZGVsdGEgZm9yOiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlub3RpZmllci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIGRlbHRhIGZvcjogIiArIHRoaXMuY3VycmVudFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLm5vdGlmaWVyLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBudWxsOwogCX0KIAotCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5rZXlUYWJsZTsKLQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC52YWx1ZVRhYmxlOworCU9iamVjdFtdIGtleVRhYmxlID0gdGhpcy5iaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0LmtleVRhYmxlOworCU9iamVjdFtdIHZhbHVlVGFibGUgPSB0aGlzLmJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QudmFsdWVUYWJsZTsKIAluZXh0UHJvamVjdCA6IGZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGtleVRhYmxlW2ldOwotCQlpZiAocCAhPSBudWxsICYmIHAgIT0gY3VycmVudFByb2plY3QpIHsKKwkJaWYgKHAgIT0gbnVsbCAmJiBwICE9IHRoaXMuY3VycmVudFByb2plY3QpIHsKIAkJCVN0YXRlIHMgPSBnZXRMYXN0U3RhdGUocCk7Ci0JCQlpZiAoIWxhc3RTdGF0ZS53YXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKHAsIHMpKSB7IC8vIHNlZSBpZiB3ZSBjYW4gc2tpcCBpdHMgZGVsdGEKKwkJCWlmICghdGhpcy5sYXN0U3RhdGUud2FzU3RydWN0dXJhbGx5Q2hhbmdlZChwLCBzKSkgeyAvLyBzZWUgaWYgd2UgY2FuIHNraXAgaXRzIGRlbHRhCiAJCQkJaWYgKHMud2FzTm9vcEJ1aWxkKCkpCiAJCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0OyAvLyBwcm9qZWN0IGhhcyBubyBzb3VyY2UgZm9sZGVycyBhbmQgY2FuIGJlIHNraXBwZWQKIAkJCQlDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoQ2xhc3NwYXRoTG9jYXRpb25bXSkgdmFsdWVUYWJsZVtpXTsKQEAgLTM5Niw3ICszOTYsNyBAQAogCQkJCWlmIChjYW5Ta2lwKSBjb250aW51ZSBuZXh0UHJvamVjdDsgLy8gcHJvamVjdCBoYXMgbm8gc3RydWN0dXJhbCBjaGFuZ2VzIGluIGl0cyBvdXRwdXQgZm9sZGVycwogCQkJfQogCi0JCQlub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfcmVhZGluZ0RlbHRhLCBwLmdldE5hbWUoKSkpOworCQkJdGhpcy5ub3RpZmllci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuYnVpbGRfcmVhZGluZ0RlbHRhLCBwLmdldE5hbWUoKSkpOwogCQkJZGVsdGEgPSBnZXREZWx0YShwKTsKIAkJCWlmIChkZWx0YSAhPSBudWxsKSB7CiAJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpIHsKQEAgLTQwNywxNyArNDA3LDE3IEBACiAJCQl9IGVsc2UgewogCQkJCWlmIChERUJVRykKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIGRlbHRhIGZvcjogIiArIHAuZ2V0TmFtZSgpKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQlub3RpZmllci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMubm90aWZpZXIuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJfQogCX0KLQlub3RpZmllci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAorCXRoaXMubm90aWZpZXIuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gZGVsdGFzOwogfQogCiBwdWJsaWMgU3RhdGUgZ2V0TGFzdFN0YXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQlyZXR1cm4gKFN0YXRlKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRMYXN0QnVpbHRTdGF0ZShwcm9qZWN0LCBub3RpZmllci5tb25pdG9yKTsKKwlyZXR1cm4gKFN0YXRlKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRMYXN0QnVpbHRTdGF0ZShwcm9qZWN0LCB0aGlzLm5vdGlmaWVyLm1vbml0b3IpOwogfQogCiAvKiBSZXR1cm4gdGhlIGxpc3Qgb2YgcHJvamVjdHMgZm9yIHdoaWNoIGl0IHJlcXVpcmVzIGEgcmVzb3VyY2UgZGVsdGEuIFRoaXMgYnVpbGRlcidzIHByb2plY3QKQEAgLTQyNywyNyArNDI3LDMzIEBACiAqIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSB3b3Jrc3BhY2UuCiAqLwogcHJpdmF0ZSBJUHJvamVjdFtdIGdldFJlcXVpcmVkUHJvamVjdHMoYm9vbGVhbiBpbmNsdWRlQmluYXJ5UHJlcmVxdWlzaXRlcykgewotCWlmIChqYXZhUHJvamVjdCA9PSBudWxsIHx8IHdvcmtzcGFjZVJvb3QgPT0gbnVsbCkgcmV0dXJuIG5ldyBJUHJvamVjdFswXTsKKwlpZiAodGhpcy5qYXZhUHJvamVjdCA9PSBudWxsIHx8IHRoaXMud29ya3NwYWNlUm9vdCA9PSBudWxsKSByZXR1cm4gbmV3IElQcm9qZWN0WzBdOwogCiAJQXJyYXlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOworCUV4dGVybmFsRm9sZGVyc01hbmFnZXIgZXh0ZXJuYWxGb2xkZXJzTWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0RXh0ZXJuYWxNYW5hZ2VyKCk7CiAJdHJ5IHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKCk7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSB0aGlzLmphdmFQcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKCk7CiAJCWZvciAoaW50IGkgPSAwLCBsID0gZW50cmllcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CiAJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwogCQkJSVByb2plY3QgcCA9IG51bGw7CiAJCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7CiAJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlwID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSk7IC8vIG1pc3NpbmcgcHJvamVjdHMgYXJlIGNvbnNpZGVyZWQgdG9vCisJCQkJCXAgPSB0aGlzLndvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXRoLmxhc3RTZWdtZW50KCkpOyAvLyBtaXNzaW5nIHByb2plY3RzIGFyZSBjb25zaWRlcmVkIHRvbwogCQkJCQlpZiAoKChDbGFzc3BhdGhFbnRyeSkgZW50cnkpLmlzT3B0aW9uYWwoKSAmJiAhSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwKSkgLy8gZXhjZXB0IGlmIGVudHJ5IGlzIG9wdGlvbmFsCiAJCQkJCQlwID0gbnVsbDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQlpZiAoaW5jbHVkZUJpbmFyeVByZXJlcXVpc2l0ZXMgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKKwkJCQkJaWYgKGluY2x1ZGVCaW5hcnlQcmVyZXF1aXNpdGVzICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7CiAJCQkJCQkvLyBzb21lIGJpbmFyeSByZXNvdXJjZXMgb24gdGhlIGNsYXNzIHBhdGggY2FuIGNvbWUgZnJvbSBwcm9qZWN0cyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHByb2plY3QgcmVmZXJlbmNlcwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGguc2VnbWVudCgwKSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkKKwkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMud29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGguc2VnbWVudCgwKSk7CisJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewogCQkJCQkJCXAgPSAoSVByb2plY3QpIHJlc291cmNlOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXNvdXJjZSA9IGV4dGVybmFsRm9sZGVyc01hbmFnZXIuZ2V0Rm9sZGVyKHBhdGgpOworCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQorCQkJCQkJCQlwID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOworCQkJCQkJfQogCQkJCQl9CiAJCQl9CiAJCQlpZiAocCAhPSBudWxsICYmICFwcm9qZWN0cy5jb250YWlucyhwKSkKQEAgLTQ3MCw4ICs0NzYsOCBAQAogfQogCiBwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NwYXRoQ2hhbmdlZCgpIHsKLQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVtdIG5ld1NvdXJjZUxvY2F0aW9ucyA9IG5hbWVFbnZpcm9ubWVudC5zb3VyY2VMb2NhdGlvbnM7Ci0JQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnlbXSBvbGRTb3VyY2VMb2NhdGlvbnMgPSBsYXN0U3RhdGUuc291cmNlTG9jYXRpb25zOworCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5W10gbmV3U291cmNlTG9jYXRpb25zID0gdGhpcy5uYW1lRW52aXJvbm1lbnQuc291cmNlTG9jYXRpb25zOworCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5W10gb2xkU291cmNlTG9jYXRpb25zID0gdGhpcy5sYXN0U3RhdGUuc291cmNlTG9jYXRpb25zOwogCWludCBuZXdMZW5ndGggPSBuZXdTb3VyY2VMb2NhdGlvbnMubGVuZ3RoOwogCWludCBvbGRMZW5ndGggPSBvbGRTb3VyY2VMb2NhdGlvbnMubGVuZ3RoOwogCWludCBuLCBvOwpAQCAtNDgxLDYgKzQ4Nyw5IEBACiAJCQlpZiAobmV3U291cmNlTG9jYXRpb25zW25dLnNvdXJjZUZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID09IDApIHsgLy8gYWRkZWQgbmV3IGVtcHR5IHNvdXJjZSBmb2xkZXIKIAkJCQlvLS07CiAJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHRoaXMubGFzdFN0YXRlLmlzU291cmNlRm9sZGVyRW1wdHkob2xkU291cmNlTG9jYXRpb25zW29dLnNvdXJjZUZvbGRlcikpIHsKKwkJCQluLS07CisJCQkJY29udGludWU7CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7IC8vIHNraXAgaXQKIAkJfQpAQCAtNTA0LDE2ICs1MTMsMjAgQEAKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKG8gPCBvbGRMZW5ndGgpIHsKKwl3aGlsZSAobyA8IG9sZExlbmd0aCkgeworCQlpZiAodGhpcy5sYXN0U3RhdGUuaXNTb3VyY2VGb2xkZXJFbXB0eShvbGRTb3VyY2VMb2NhdGlvbnNbb10uc291cmNlRm9sZGVyKSkgeworCQkJbysrOworCQkJY29udGludWU7CisJCX0KIAkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbW92ZWQgc291cmNlIGZvbGRlciIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbW92ZWQgbm9uLWVtcHR5IHNvdXJjZSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAogCQkJcHJpbnRMb2NhdGlvbnMobmV3U291cmNlTG9jYXRpb25zLCBvbGRTb3VyY2VMb2NhdGlvbnMpOwogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KIAotCUNsYXNzcGF0aExvY2F0aW9uW10gbmV3QmluYXJ5TG9jYXRpb25zID0gbmFtZUVudmlyb25tZW50LmJpbmFyeUxvY2F0aW9uczsKLQlDbGFzc3BhdGhMb2NhdGlvbltdIG9sZEJpbmFyeUxvY2F0aW9ucyA9IGxhc3RTdGF0ZS5iaW5hcnlMb2NhdGlvbnM7CisJQ2xhc3NwYXRoTG9jYXRpb25bXSBuZXdCaW5hcnlMb2NhdGlvbnMgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5iaW5hcnlMb2NhdGlvbnM7CisJQ2xhc3NwYXRoTG9jYXRpb25bXSBvbGRCaW5hcnlMb2NhdGlvbnMgPSB0aGlzLmxhc3RTdGF0ZS5iaW5hcnlMb2NhdGlvbnM7CiAJbmV3TGVuZ3RoID0gbmV3QmluYXJ5TG9jYXRpb25zLmxlbmd0aDsKIAlvbGRMZW5ndGggPSBvbGRCaW5hcnlMb2NhdGlvbnMubGVuZ3RoOwogCWZvciAobiA9IG8gPSAwOyBuIDwgbmV3TGVuZ3RoICYmIG8gPCBvbGRMZW5ndGg7IG4rKywgbysrKSB7CkBAIC01NDQsOSArNTU3LDkgQEAKIAogcHJpdmF0ZSBib29sZWFuIGhhc1N0cnVjdHVyYWxEZWx0YSgpIHsKIAkvLyBoYW5kbGUgY2FzZSB3aGVuIGN1cnJlbnRQcm9qZWN0IGhhcyBvbmx5IC5jbGFzcyBmaWxlIGZvbGRlcnMgYW5kL29yIGphciBmaWxlcy4uLiBubyBzb3VyY2Uvb3V0cHV0IGZvbGRlcnMKLQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKGN1cnJlbnRQcm9qZWN0KTsKKwlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKHRoaXMuY3VycmVudFByb2plY3QpOwogCWlmIChkZWx0YSAhPSBudWxsICYmIGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpIHsKLQkJQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc0ZvbGRlcnNBbmRKYXJzID0gKENsYXNzcGF0aExvY2F0aW9uW10pIGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QuZ2V0KGN1cnJlbnRQcm9qZWN0KTsKKwkJQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc0ZvbGRlcnNBbmRKYXJzID0gKENsYXNzcGF0aExvY2F0aW9uW10pIHRoaXMuYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5nZXQodGhpcy5jdXJyZW50UHJvamVjdCk7CiAJCWlmIChjbGFzc0ZvbGRlcnNBbmRKYXJzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBsID0gY2xhc3NGb2xkZXJzQW5kSmFycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCQlDbGFzc3BhdGhMb2NhdGlvbiBjbGFzc0ZvbGRlck9ySmFyID0gY2xhc3NGb2xkZXJzQW5kSmFyc1tpXTsgLy8gZWl0aGVyIGEgLmNsYXNzIGZpbGUgZm9sZGVyIG9yIGEgemlwL2phciBmaWxlCkBAIC01NjYsOCArNTc5LDggQEAKIAogcHJpdmF0ZSBpbnQgaW5pdGlhbGl6ZUJ1aWxkZXIoaW50IGtpbmQsIGJvb2xlYW4gZm9yQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkvLyBzb21lIGNhbGxzIGp1c3QgbmVlZCB0aGUgbmFtZUVudmlyb25tZW50IGluaXRpYWxpemVkIHNvIHNraXAgdGhlIHJlc3QKLQl0aGlzLmphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUoY3VycmVudFByb2plY3QpOwotCXRoaXMud29ya3NwYWNlUm9vdCA9IGN1cnJlbnRQcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwl0aGlzLmphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUodGhpcy5jdXJyZW50UHJvamVjdCk7CisJdGhpcy53b3Jrc3BhY2VSb290ID0gdGhpcy5jdXJyZW50UHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAKIAlpZiAoZm9yQnVpbGQpIHsKIAkJLy8gY2FjaGUgdGhlIGtub3duIHBhcnRpY2lwYW50cyBmb3IgdGhpcyBwcm9qZWN0CkBAIC01NzgsNyArNTkxLDcgQEAKIAkJCQkJa2luZCA9IEZVTExfQlVJTEQ7CiAKIAkJLy8gRmx1c2ggdGhlIGV4aXN0aW5nIGV4dGVybmFsIGZpbGVzIGNhY2hlIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiBhIGJ1aWxkIGN5Y2xlCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKTsKKwkJU3RyaW5nIHByb2plY3ROYW1lID0gdGhpcy5jdXJyZW50UHJvamVjdC5nZXROYW1lKCk7CiAJCWlmIChidWlsdFByb2plY3RzID09IG51bGwgfHwgYnVpbHRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0TmFtZSkpIHsKIAkJCUphdmFNb2RlbC5mbHVzaEV4dGVybmFsRmlsZUNhY2hlKCk7CiAJCQlidWlsdFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtNTg3LDEwICs2MDAsMTAgQEAKIAl9CiAKIAl0aGlzLmJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7Ci0JdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuZXcgTmFtZUVudmlyb25tZW50KHdvcmtzcGFjZVJvb3QsIGphdmFQcm9qZWN0LCBiaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0LCBub3RpZmllcik7CisJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuZXcgTmFtZUVudmlyb25tZW50KHRoaXMud29ya3NwYWNlUm9vdCwgdGhpcy5qYXZhUHJvamVjdCwgdGhpcy5iaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0LCB0aGlzLm5vdGlmaWVyKTsKIAogCWlmIChmb3JCdWlsZCkgewotCQlTdHJpbmcgZmlsdGVyU2VxdWVuY2UgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCB0cnVlKTsKKwkJU3RyaW5nIGZpbHRlclNlcXVlbmNlID0gdGhpcy5qYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCB0cnVlKTsKIAkJY2hhcltdW10gZmlsdGVycyA9IGZpbHRlclNlcXVlbmNlICE9IG51bGwgJiYgZmlsdGVyU2VxdWVuY2UubGVuZ3RoKCkgPiAwCiAJCQk/IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCBmaWx0ZXJTZXF1ZW5jZS50b0NoYXJBcnJheSgpKQogCQkJOiBudWxsOwpAQCAtNjEwLDkgKzYyMyw5IEBACiAJCQkJY2hhcltdIGYgPSBmaWx0ZXJzW2ldOwogCQkJCWlmIChmLmxlbmd0aCA9PSAwKSBjb250aW51ZTsKIAkJCQlpZiAoZltmLmxlbmd0aCAtIDFdID09ICcvJykKLQkJCQkJZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbLS1mb2xkZXJDb3VudF0gPSBuZXcgU3RyaW5nKGYsIDAsIGYubGVuZ3RoIC0gMSk7CisJCQkJCXRoaXMuZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbLS1mb2xkZXJDb3VudF0gPSBuZXcgU3RyaW5nKGYsIDAsIGYubGVuZ3RoIC0gMSk7CiAJCQkJZWxzZQotCQkJCQlleHRyYVJlc291cmNlRmlsZUZpbHRlcnNbLS1maWxlQ291bnRdID0gZjsKKwkJCQkJdGhpcy5leHRyYVJlc291cmNlRmlsZUZpbHRlcnNbLS1maWxlQ291bnRdID0gZjsKIAkJCX0KIAkJfQogCX0KQEAgLTYyOSwxNyArNjQyLDE3IEBACiAKIHByaXZhdGUgYm9vbGVhbiBpc1dvcnRoQnVpbGRpbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJYm9vbGVhbiBhYm9ydEJ1aWxkcyA9Ci0JCUphdmFDb3JlLkFCT1JULmVxdWFscyhqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRILCB0cnVlKSk7CisJCUphdmFDb3JlLkFCT1JULmVxdWFscyh0aGlzLmphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgsIHRydWUpKTsKIAlpZiAoIWFib3J0QnVpbGRzKSByZXR1cm4gdHJ1ZTsKIAogCS8vIEFib3J0IGJ1aWxkIG9ubHkgaWYgdGhlcmUgYXJlIGNsYXNzcGF0aCBlcnJvcnMKLQlpZiAoaXNDbGFzc3BhdGhCcm9rZW4oamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIGN1cnJlbnRQcm9qZWN0KSkgeworCWlmIChpc0NsYXNzcGF0aEJyb2tlbih0aGlzLmphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCB0aGlzLmN1cnJlbnRQcm9qZWN0KSkgewogCQlpZiAoREVCVUcpCiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3J0ZWQgYnVpbGQgYmVjYXVzZSBwcm9qZWN0IGhhcyBjbGFzc3BhdGggZXJyb3JzIChpbmNvbXBsZXRlIG9yIGludm9sdmVkIGluIGN5Y2xlKSIpOyAvLyROT04tTkxTLTEkCiAKLQkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIHJlbW92ZSBhbGwgY29tcGlsYXRpb24gcHJvYmxlbXMKKwkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcih0aGlzLmN1cnJlbnRQcm9qZWN0KTsgLy8gcmVtb3ZlIGFsbCBjb21waWxhdGlvbiBwcm9ibGVtcwogCi0JCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CisJCUlNYXJrZXIgbWFya2VyID0gdGhpcy5jdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKIAkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCiAJCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSUphdmFNb2RlbE1hcmtlci5DQVRFR09SWV9JRCwgSU1hcmtlci5TT1VSQ0VfSUR9LAogCQkJbmV3IE9iamVjdFtdIHsKQEAgLTY1Miw3ICs2NjUsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JaWYgKEphdmFDb3JlLldBUk5JTkcuZXF1YWxzKGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCB0cnVlKSkpCisJaWYgKEphdmFDb3JlLldBUk5JTkcuZXF1YWxzKHRoaXMuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSU5DT01QTEVURV9DTEFTU1BBVEgsIHRydWUpKSkKIAkJcmV0dXJuIHRydWU7CiAKIAkvLyBtYWtlIHN1cmUgYWxsIHByZXJlcSBwcm9qZWN0cyBoYXZlIHZhbGlkIGJ1aWxkIHN0YXRlcy4uLiBvbmx5IHdoZW4gYWJvcnRpbmcgYnVpbGRzIHNpbmNlIHByb2plY3RzIGluIGN5Y2xlcyBkbyBub3QgaGF2ZSBidWlsZCBzdGF0ZXMKQEAgLTY2Myw3ICs2NzYsNyBAQAogCQlpZiAoZ2V0TGFzdFN0YXRlKHApID09IG51bGwpICB7CiAJCQkvLyBUaGUgcHJlcmVxIHByb2plY3QgaGFzIG5vIGJ1aWxkIHN0YXRlOiBpZiB0aGlzIHByZXJlcSBwcm9qZWN0IGhhcyBhICd3YXJuaW5nJyBjeWNsZSBtYXJrZXIgdGhlbiBhbGxvdyBidWlsZCAoc2VlIGJ1ZyBpZCAyMzM1NykKIAkJCUphdmFQcm9qZWN0IHByZXJlcSA9IChKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHApOwotCQkJaWYgKHByZXJlcS5oYXNDeWNsZU1hcmtlcigpICYmIEphdmFDb3JlLldBUk5JTkcuZXF1YWxzKGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCwgdHJ1ZSkpKSB7CisJCQlpZiAocHJlcmVxLmhhc0N5Y2xlTWFya2VyKCkgJiYgSmF2YUNvcmUuV0FSTklORy5lcXVhbHModGhpcy5qYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIHRydWUpKSkgewogCQkJCWlmIChERUJVRykKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZWQgdG8gYnVpbGQgZXZlbiB0aG91Z2ggcHJlcmVxIHByb2plY3QgIiArIHAuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCQkJCSsgIiB3YXMgbm90IGJ1aWx0IHNpbmNlIGl0cyBwYXJ0IG9mIGEgY3ljbGUiKTsgLy8kTk9OLU5MUy0xJApAQCAtNjc5LDggKzY5Miw4IEBACiAJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm9ydGVkIGJ1aWxkIGJlY2F1c2UgcHJlcmVxIHByb2plY3QgIiArIHAuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCQkJKyAiIHdhcyBub3QgYnVpbHQiKTsgLy8kTk9OLU5MUy0xJAogCi0JCQlyZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKGN1cnJlbnRQcm9qZWN0KTsgLy8gbWFrZSB0aGlzIHRoZSBvbmx5IHByb2JsZW0gZm9yIHRoaXMgcHJvamVjdAotCQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKKwkJCXJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IodGhpcy5jdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKKwkJCUlNYXJrZXIgbWFya2VyID0gdGhpcy5jdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKIAkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAogCQkJCW5ldyBTdHJpbmdbXSB7SU1hcmtlci5NRVNTQUdFLCBJTWFya2VyLlNFVkVSSVRZLCBJSmF2YU1vZGVsTWFya2VyLkNBVEVHT1JZX0lELCBJTWFya2VyLlNPVVJDRV9JRH0sCiAJCQkJbmV3IE9iamVjdFtdIHsKQEAgLTcwMywxNCArNzE2LDE0IEBACiAgKiBuZWVkcyB0byBwcm9wYWdhdGUgc3RydWN0dXJhbCBjaGFuZ2VzIHRvIHRoZSBvdGhlciBwcm9qZWN0cyBpbiB0aGUgY3ljbGUuCiAgKi8KIHZvaWQgbXVzdFByb3BhZ2F0ZVN0cnVjdHVyYWxDaGFuZ2VzKCkgewotCUhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgSGFzaFNldCgzKTsKLQlqYXZhUHJvamVjdC51cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhuZXcgQXJyYXlMaXN0KCksIGN5Y2xlUGFydGljaXBhbnRzLCB3b3Jrc3BhY2VSb290LCBuZXcgSGFzaFNldCgzKSwgbnVsbCk7Ci0JSVBhdGggY3VycmVudFBhdGggPSBqYXZhUHJvamVjdC5nZXRQYXRoKCk7CisJTGlua2VkSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KDMpOworCXRoaXMuamF2YVByb2plY3QudXBkYXRlQ3ljbGVQYXJ0aWNpcGFudHMobmV3IEFycmF5TGlzdCgpLCBjeWNsZVBhcnRpY2lwYW50cywgdGhpcy53b3Jrc3BhY2VSb290LCBuZXcgSGFzaFNldCgzKSwgbnVsbCk7CisJSVBhdGggY3VycmVudFBhdGggPSB0aGlzLmphdmFQcm9qZWN0LmdldFBhdGgoKTsKIAlJdGVyYXRvciBpPSBjeWNsZVBhcnRpY2lwYW50cy5pdGVyYXRvcigpOwogCXdoaWxlIChpLmhhc05leHQoKSkgewogCQlJUGF0aCBwYXJ0aWNpcGFudFBhdGggPSAoSVBhdGgpIGkubmV4dCgpOwogCQlpZiAocGFydGljaXBhbnRQYXRoICE9IGN1cnJlbnRQYXRoKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHBhcnRpY2lwYW50UGF0aC5zZWdtZW50KDApKTsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLndvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXJ0aWNpcGFudFBhdGguc2VnbWVudCgwKSk7CiAJCQlpZiAoaGFzQmVlbkJ1aWx0KHByb2plY3QpKSB7CiAJCQkJaWYgKERFQlVHKQogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3RpbmcgYW5vdGhlciBidWlsZCBpdGVyYXRpb24gc2luY2UgY3ljbGUgcGFydGljaXBhbnQgIiArIHByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKQEAgLTczMiwyNSArNzQ1LDI1IEBACiB9CiAKIHByaXZhdGUgdm9pZCByZWNvcmROZXdTdGF0ZShTdGF0ZSBzdGF0ZSkgewotCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5rZXlUYWJsZTsKKwlPYmplY3RbXSBrZXlUYWJsZSA9IHRoaXMuYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5rZXlUYWJsZTsKIAlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQlJUHJvamVjdCBwcmVyZXFQcm9qZWN0ID0gKElQcm9qZWN0KSBrZXlUYWJsZVtpXTsKLQkJaWYgKHByZXJlcVByb2plY3QgIT0gbnVsbCAmJiBwcmVyZXFQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQorCQlpZiAocHJlcmVxUHJvamVjdCAhPSBudWxsICYmIHByZXJlcVByb2plY3QgIT0gdGhpcy5jdXJyZW50UHJvamVjdCkKIAkJCXN0YXRlLnJlY29yZFN0cnVjdHVyYWxEZXBlbmRlbmN5KHByZXJlcVByb2plY3QsIGdldExhc3RTdGF0ZShwcmVyZXFQcm9qZWN0KSk7CiAJfQogCiAJaWYgKERFQlVHKQogCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZGluZyBuZXcgc3RhdGUgOiAiICsgc3RhdGUpOyAvLyROT04tTkxTLTEkCiAJLy8gc3RhdGUuZHVtcCgpOwotCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnNldExhc3RCdWlsdFN0YXRlKGN1cnJlbnRQcm9qZWN0LCBzdGF0ZSk7CisJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuc2V0TGFzdEJ1aWx0U3RhdGUodGhpcy5jdXJyZW50UHJvamVjdCwgc3RhdGUpOwogfQogCiAvKioKICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuIGN1cnJlbnRQcm9qZWN0ID09IG51bGwKKwlyZXR1cm4gdGhpcy5jdXJyZW50UHJvamVjdCA9PSBudWxsCiAJCT8gIkphdmFCdWlsZGVyIGZvciB1bmtub3duIHByb2plY3QiIC8vJE5PTi1OTFMtMSQKLQkJOiAiSmF2YUJ1aWxkZXIgZm9yICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJOiAiSmF2YUJ1aWxkZXIgZm9yICIgKyB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDMyOGYyMzUuLjlmNDVkZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsNyArMTcsNyBAQAogCiAJcHJvdGVjdGVkIFN0cmluZyBtaXNzaW5nU291cmNlRmlsZTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQxNjYwOTAwNDk3MTExNTcxOUw7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGUKLQkKKwogcHVibGljIE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKFN0cmluZyBtaXNzaW5nU291cmNlRmlsZSkgewogCXRoaXMubWlzc2luZ1NvdXJjZUZpbGUgPSBtaXNzaW5nU291cmNlRmlsZTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL05hbWVFbnZpcm9ubWVudC5qYXZhCmluZGV4IDIzYjcxNjMuLjY2ZmRlOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZUVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9OYW1lRW52aXJvbm1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC05NiwxNCArOTYsMTQgQEAKIAluZXh0RW50cnkgOiBmb3IgKGludCBpID0gMCwgbCA9IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKENsYXNzcGF0aEVudHJ5KSBjbGFzc3BhdGhFbnRyaWVzW2ldOwogCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChyb290LCBwYXRoLCB0cnVlKTsKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocGF0aCwgdHJ1ZSk7CiAJCWlmICh0YXJnZXQgPT0gbnVsbCkgY29udGludWUgbmV4dEVudHJ5OwogCiAJCXN3aXRjaChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CiAJCQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikpIGNvbnRpbnVlIG5leHRFbnRyeTsKLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSAhPSBudWxsIAotCQkJCQk/IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgCisJCQkJSVBhdGggb3V0cHV0UGF0aCA9IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbAorCQkJCQk/IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkKIAkJCQkJOiBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwogCQkJCUlDb250YWluZXIgb3V0cHV0Rm9sZGVyOwogCQkJCWlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKQEAgLTEyOCwxMCArMTI4LDEwIEBACiAJCQkJbmV4dFByZXJlcUVudHJ5OiBmb3IgKGludCBqID0gMCwgbSA9IHByZXJlcUNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAJCQkJCUlDbGFzc3BhdGhFbnRyeSBwcmVyZXFFbnRyeSA9IHByZXJlcUNsYXNzcGF0aEVudHJpZXNbal07CiAJCQkJCWlmIChwcmVyZXFFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQkJT2JqZWN0IHByZXJlcVRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocm9vdCwgcHJlcmVxRW50cnkuZ2V0UGF0aCgpLCB0cnVlKTsKKwkJCQkJCU9iamVjdCBwcmVyZXFUYXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHByZXJlcUVudHJ5LmdldFBhdGgoKSwgdHJ1ZSk7CiAJCQkJCQlpZiAoIShwcmVyZXFUYXJnZXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkgY29udGludWUgbmV4dFByZXJlcUVudHJ5OwotCQkJCQkJSVBhdGggcHJlcmVxT3V0cHV0UGF0aCA9IHByZXJlcUVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCAKLQkJCQkJCQk/IHByZXJlcUVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgCisJCQkJCQlJUGF0aCBwcmVyZXFPdXRwdXRQYXRoID0gcHJlcmVxRW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSAhPSBudWxsCisJCQkJCQkJPyBwcmVyZXFFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpCiAJCQkJCQkJOiBwcmVyZXFKYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwogCQkJCQkJSUNvbnRhaW5lciBiaW5hcnlGb2xkZXIgPSBwcmVyZXFPdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEKIAkJCQkJCQk/IChJQ29udGFpbmVyKSBwcmVyZXFQcm9qZWN0CkBAIC0xNjEsMTYgKzE2MSwxNCBAQAogCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7CiAJCQkJCUNsYXNzcGF0aExvY2F0aW9uIGJMb2NhdGlvbiA9IG51bGw7CiAJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlpZiAoIShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSkpKQotCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKLQkJCQkJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzUnVsZVNldCA9IAorCQkJCQkJQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0ID0KIAkJCQkJCQkoSmF2YUNvcmUuSUdOT1JFLmVxdWFscyhqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfRk9SQklEREVOX1JFRkVSRU5DRSwgdHJ1ZSkpCiAJCQkJCQkJJiYgSmF2YUNvcmUuSUdOT1JFLmVxdWFscyhqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfRElTQ09VUkFHRURfUkVGRVJFTkNFLCB0cnVlKSkpCiAJCQkJCQkJCT8gbnVsbAogCQkJCQkJCQk6IGVudHJ5LmdldEFjY2Vzc1J1bGVTZXQoKTsKIAkJCQkJCWJMb2NhdGlvbiA9IENsYXNzcGF0aExvY2F0aW9uLmZvckxpYnJhcnkoKElGaWxlKSByZXNvdXJjZSwgYWNjZXNzUnVsZVNldCk7CiAJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCQlBY2Nlc3NSdWxlU2V0IGFjY2Vzc1J1bGVTZXQgPSAKKwkJCQkJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzUnVsZVNldCA9CiAJCQkJCQkJKEphdmFDb3JlLklHTk9SRS5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0ZPUkJJRERFTl9SRUZFUkVOQ0UsIHRydWUpKQogCQkJCQkJCSYmIEphdmFDb3JlLklHTk9SRS5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0RJU0NPVVJBR0VEX1JFRkVSRU5DRSwgdHJ1ZSkpKQogCQkJCQkJCQk/IG51bGwKQEAgLTE5MSw5ICsxODksNyBAQAogCQkJCQkJYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5wdXQocCwgZXhpc3RpbmdMb2NhdGlvbnMpOwogCQkJCQl9CiAJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7Ci0JCQkJCWlmICghKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKSkpCi0JCQkJCQljb250aW51ZSBuZXh0RW50cnk7Ci0JCQkJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzUnVsZVNldCA9IAorCQkJCQlBY2Nlc3NSdWxlU2V0IGFjY2Vzc1J1bGVTZXQgPQogCQkJCQkJKEphdmFDb3JlLklHTk9SRS5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0ZPUkJJRERFTl9SRUZFUkVOQ0UsIHRydWUpKQogCQkJCQkJCSYmIEphdmFDb3JlLklHTk9SRS5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0RJU0NPVVJBR0VEX1JFRkVSRU5DRSwgdHJ1ZSkpKQogCQkJCQkJCQk/IG51bGwKQEAgLTIxMSwyMCArMjA3LDIwIEBACiAJCXNMb2NhdGlvbnMudG9BcnJheSh0aGlzLnNvdXJjZUxvY2F0aW9ucyk7CiAKIAkJLy8gY29sbGVjdCB0aGUgb3V0cHV0IGZvbGRlcnMsIHNraXBwaW5nIGR1cGxpY2F0ZXMKLQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJCW5leHQgOiBmb3IgKGludCBpID0gMCwgbCA9IHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSB0aGlzLnNvdXJjZUxvY2F0aW9uc1tpXTsKIAkJCUlQYXRoIG91dHB1dFBhdGggPSBtZC5iaW5hcnlGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7IC8vIGNvbXBhcmUgYWdhaW5zdCBwcmV2aW91c2x5IHdhbGtlZCBzb3VyY2UgZm9sZGVycwotCQkJCWlmIChvdXRwdXRQYXRoLmVxdWFscyhzb3VyY2VMb2NhdGlvbnNbal0uYmluYXJ5Rm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCW1kLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyID0gc291cmNlTG9jYXRpb25zW2pdLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyOworCQkJCWlmIChvdXRwdXRQYXRoLmVxdWFscyh0aGlzLnNvdXJjZUxvY2F0aW9uc1tqXS5iaW5hcnlGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHsKKwkJCQkJbWQuaGFzSW5kZXBlbmRlbnRPdXRwdXRGb2xkZXIgPSB0aGlzLnNvdXJjZUxvY2F0aW9uc1tqXS5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlcjsKIAkJCQkJY29udGludWUgbmV4dDsKIAkJCQl9CiAJCQl9CiAJCQlvdXRwdXRGb2xkZXJzLmFkZChtZCk7CiAKIAkJCS8vIGFsc28gdGFnIGVhY2ggc291cmNlIGZvbGRlciB3aG9zZSBvdXRwdXQgZm9sZGVyIGlzIGFuIGluZGVwZW5kZW50IGZvbGRlciAmIGlzIG5vdCBhbHNvIGEgc291cmNlIGZvbGRlcgotCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBqIDwgbTsgaisrKQotCQkJCWlmIChvdXRwdXRQYXRoLmVxdWFscyhzb3VyY2VMb2NhdGlvbnNbal0uc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkpKQorCQkJZm9yIChpbnQgaiA9IDAsIG0gPSB0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJaWYgKG91dHB1dFBhdGguZXF1YWxzKHRoaXMuc291cmNlTG9jYXRpb25zW2pdLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpKSkKIAkJCQkJY29udGludWUgbmV4dDsKIAkJCW1kLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyID0gdHJ1ZTsKIAkJfQpAQCAtMjQyLDEwICsyMzgsMTAgQEAKIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CiAJdGhpcy5pbml0aWFsVHlwZU5hbWVzID0gbnVsbDsKIAl0aGlzLmFkZGl0aW9uYWxVbml0cyA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlzb3VyY2VMb2NhdGlvbnNbaV0uY2xlYW51cCgpOwotCWZvciAoaW50IGkgPSAwLCBsID0gYmluYXJ5TG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJYmluYXJ5TG9jYXRpb25zW2ldLmNsZWFudXAoKTsKKwlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJdGhpcy5zb3VyY2VMb2NhdGlvbnNbaV0uY2xlYW51cCgpOworCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5iaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQl0aGlzLmJpbmFyeUxvY2F0aW9uc1tpXS5jbGVhbnVwKCk7CiB9CiAKIHByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKQEAgLTI2NSw3ICsyNjEsNyBAQAogCQl0aGlzLm5vdGlmaWVyLmNoZWNrQ2FuY2VsV2l0aGluQ29tcGlsZXIoKTsKIAogCWlmICh0aGlzLmluaXRpYWxUeXBlTmFtZXMgIT0gbnVsbCAmJiB0aGlzLmluaXRpYWxUeXBlTmFtZXMuaW5jbHVkZXMocXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCWlmIChpc0luY3JlbWVudGFsQnVpbGQpCisJCWlmICh0aGlzLmlzSW5jcmVtZW50YWxCdWlsZCkKIAkJCS8vIGNhdGNoIHRoZSBjYXNlIHRoYXQgYSB0eXBlIGluc2lkZSBhIHNvdXJjZSBmaWxlIGhhcyBiZWVuIHJlbmFtZWQgYnV0IG90aGVyIGNsYXNzIGZpbGVzIGFyZSBsb29raW5nIGZvciBpdAogCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbmV3IEFib3J0SW5jcmVtZW50YWxCdWlsZEV4Y2VwdGlvbihxdWFsaWZpZWRUeXBlTmFtZSkpOwogCQlyZXR1cm4gbnVsbDsgLy8gbG9va2luZyBmb3IgYSBmaWxlIHdoaWNoIHdlIGtub3cgd2FzIHByb3ZpZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXBpbGF0aW9uCkBAIC0yOTEsOCArMjg3LDggQEAKIAogCS8vIE5PVEU6IHRoZSBvdXRwdXQgZm9sZGVycyBhcmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmluYXJ5TG9jYXRpb25zCiAJTmFtZUVudmlyb25tZW50QW5zd2VyIHN1Z2dlc3RlZEFuc3dlciA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXIgPSBiaW5hcnlMb2NhdGlvbnNbaV0uZmluZENsYXNzKGJpbmFyeUZpbGVOYW1lLCBxUGFja2FnZU5hbWUsIHFCaW5hcnlGaWxlTmFtZSk7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLmJpbmFyeUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IHRoaXMuYmluYXJ5TG9jYXRpb25zW2ldLmZpbmRDbGFzcyhiaW5hcnlGaWxlTmFtZSwgcVBhY2thZ2VOYW1lLCBxQmluYXJ5RmlsZU5hbWUpOwogCQlpZiAoYW5zd2VyICE9IG51bGwpIHsKIAkJCWlmICghYW5zd2VyLmlnbm9yZUlmQmV0dGVyKCkpIHsKIAkJCQlpZiAoYW5zd2VyLmlzQmV0dGVyKHN1Z2dlc3RlZEFuc3dlcikpCkBAIC0zMzAsOCArMzI2LDggQEAKIAogcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgewogCS8vIE5PVEU6IHRoZSBvdXRwdXQgZm9sZGVycyBhcmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmluYXJ5TG9jYXRpb25zCi0JZm9yIChpbnQgaSA9IDAsIGwgPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlpZiAoYmluYXJ5TG9jYXRpb25zW2ldLmlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLmJpbmFyeUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmICh0aGlzLmJpbmFyeUxvY2F0aW9uc1tpXS5pc1BhY2thZ2UocXVhbGlmaWVkUGFja2FnZU5hbWUpKQogCQkJcmV0dXJuIHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtMzU3LDkgKzM1Myw5IEBACiAJCX0KIAl9CiAKLQlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCXNvdXJjZUxvY2F0aW9uc1tpXS5yZXNldCgpOwotCWZvciAoaW50IGkgPSAwLCBsID0gYmluYXJ5TG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJYmluYXJ5TG9jYXRpb25zW2ldLnJlc2V0KCk7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCXRoaXMuc291cmNlTG9jYXRpb25zW2ldLnJlc2V0KCk7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLmJpbmFyeUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCXRoaXMuYmluYXJ5TG9jYXRpb25zW2ldLnJlc2V0KCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL05hbWVTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZVNldC5qYXZhCmluZGV4IGJjYzE5ZDYuLjRjZDVkNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZVNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDI1ICsyOSwyNSBAQAogfQogCiBwdWJsaWMgY2hhcltdIGFkZChjaGFyW10gbmFtZSkgewotCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHRoaXMubmFtZXMubGVuZ3RoOwogCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUobmFtZSkgJSBsZW5ndGg7CiAJY2hhcltdIGN1cnJlbnQ7Ci0Jd2hpbGUgKChjdXJyZW50ID0gbmFtZXNbaW5kZXhdKSAhPSBudWxsKSB7CisJd2hpbGUgKChjdXJyZW50ID0gdGhpcy5uYW1lc1tpbmRleF0pICE9IG51bGwpIHsKIAkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnQsIG5hbWUpKSByZXR1cm4gY3VycmVudDsKIAkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CiAJfQotCW5hbWVzW2luZGV4XSA9IG5hbWU7CisJdGhpcy5uYW1lc1tpbmRleF0gPSBuYW1lOwogCiAJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQotCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKSByZWhhc2goKTsKKwlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpIHJlaGFzaCgpOwogCXJldHVybiBuYW1lOwogfQogCiBwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCU5hbWVTZXQgbmV3U2V0ID0gbmV3IE5hbWVTZXQoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlOYW1lU2V0IG5ld1NldCA9IG5ldyBOYW1lU2V0KHRoaXMuZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAljaGFyW10gY3VycmVudDsKLQlmb3IgKGludCBpID0gbmFtZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICgoY3VycmVudCA9IG5hbWVzW2ldKSAhPSBudWxsKQorCWZvciAoaW50IGkgPSB0aGlzLm5hbWVzLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoKGN1cnJlbnQgPSB0aGlzLm5hbWVzW2ldKSAhPSBudWxsKQogCQkJbmV3U2V0LmFkZChjdXJyZW50KTsKIAogCXRoaXMubmFtZXMgPSBuZXdTZXQubmFtZXM7CkBAIC01OCw4ICs1OCw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKIAljaGFyW10gbmFtZTsKLQlmb3IgKGludCBpID0gMCwgbCA9IG5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJaWYgKChuYW1lID0gbmFtZXNbaV0pICE9IG51bGwpCisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLm5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJaWYgKChuYW1lID0gdGhpcy5uYW1lc1tpXSkgIT0gbnVsbCkKIAkJCXMgKz0gbmV3IFN0cmluZyhuYW1lKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gczsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUXVhbGlmaWVkTmFtZVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9RdWFsaWZpZWROYW1lU2V0LmphdmEKaW5kZXggZTczNTRiZS4uZTJiYzFiNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9RdWFsaWZpZWROYW1lU2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9RdWFsaWZpZWROYW1lU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsMjUgKzMyLDI1IEBACiAJaW50IHFMZW5ndGggPSBxdWFsaWZpZWROYW1lLmxlbmd0aDsKIAlpZiAocUxlbmd0aCA9PSAwKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAKLQlpbnQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZXMubGVuZ3RoOworCWludCBsZW5ndGggPSB0aGlzLnF1YWxpZmllZE5hbWVzLmxlbmd0aDsKIAlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHF1YWxpZmllZE5hbWVbcUxlbmd0aCAtIDFdKSAlIGxlbmd0aDsKIAljaGFyW11bXSBjdXJyZW50OwotCXdoaWxlICgoY3VycmVudCA9IHF1YWxpZmllZE5hbWVzW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudCA9IHRoaXMucXVhbGlmaWVkTmFtZXNbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50LCBxdWFsaWZpZWROYW1lKSkgcmV0dXJuIGN1cnJlbnQ7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KLQlxdWFsaWZpZWROYW1lc1tpbmRleF0gPSBxdWFsaWZpZWROYW1lOworCXRoaXMucXVhbGlmaWVkTmFtZXNbaW5kZXhdID0gcXVhbGlmaWVkTmFtZTsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgcmVoYXNoKCk7CisJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKSByZWhhc2goKTsKIAlyZXR1cm4gcXVhbGlmaWVkTmFtZTsKIH0KIAogcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQlRdWFsaWZpZWROYW1lU2V0IG5ld1NldCA9IG5ldyBRdWFsaWZpZWROYW1lU2V0KGVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJUXVhbGlmaWVkTmFtZVNldCBuZXdTZXQgPSBuZXcgUXVhbGlmaWVkTmFtZVNldCh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJY2hhcltdW10gY3VycmVudDsKLQlmb3IgKGludCBpID0gcXVhbGlmaWVkTmFtZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICgoY3VycmVudCA9IHF1YWxpZmllZE5hbWVzW2ldKSAhPSBudWxsKQorCWZvciAoaW50IGkgPSB0aGlzLnF1YWxpZmllZE5hbWVzLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoKGN1cnJlbnQgPSB0aGlzLnF1YWxpZmllZE5hbWVzW2ldKSAhPSBudWxsKQogCQkJbmV3U2V0LmFkZChjdXJyZW50KTsKIAogCXRoaXMucXVhbGlmaWVkTmFtZXMgPSBuZXdTZXQucXVhbGlmaWVkTmFtZXM7CkBAIC02MSw4ICs2MSw4IEBACiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKIAljaGFyW11bXSBxdWFsaWZpZWROYW1lOwotCWZvciAoaW50IGkgPSAwLCBsID0gcXVhbGlmaWVkTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlpZiAoKHF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lc1tpXSkgIT0gbnVsbCkKKwlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMucXVhbGlmaWVkTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlpZiAoKHF1YWxpZmllZE5hbWUgPSB0aGlzLnF1YWxpZmllZE5hbWVzW2ldKSAhPSBudWxsKQogCQkJcyArPSBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHF1YWxpZmllZE5hbWUpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBzOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9SZWZlcmVuY2VDb2xsZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1JlZmVyZW5jZUNvbGxlY3Rpb24uamF2YQppbmRleCAyMmUwMWU1Li42ZDg0MTBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1JlZmVyZW5jZUNvbGxlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1JlZmVyZW5jZUNvbGxlY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCwyMCArMTgsMjIgQEAKIAogY2hhcltdW11bXSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlczsgLy8gY29udGFpbnMgbm8gc2ltcGxlIG5hbWVzIGFzIGluIGp1c3QgJ2EnIHdoaWNoIGlzIGtlcHQgaW4gc2ltcGxlTmFtZVJlZmVyZW5jZXMgaW5zdGVhZAogY2hhcltdW10gc2ltcGxlTmFtZVJlZmVyZW5jZXM7CitjaGFyW11bXSByb290UmVmZXJlbmNlczsKIAotcHJvdGVjdGVkIFJlZmVyZW5jZUNvbGxlY3Rpb24oY2hhcltdW11bXSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlcywgY2hhcltdW10gc2ltcGxlTmFtZVJlZmVyZW5jZXMpIHsKLQl0aGlzLnF1YWxpZmllZE5hbWVSZWZlcmVuY2VzID0gaW50ZXJuUXVhbGlmaWVkTmFtZXMocXVhbGlmaWVkTmFtZVJlZmVyZW5jZXMpOworcHJvdGVjdGVkIFJlZmVyZW5jZUNvbGxlY3Rpb24oY2hhcltdW11bXSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlcywgY2hhcltdW10gc2ltcGxlTmFtZVJlZmVyZW5jZXMsIGNoYXJbXVtdIHJvb3RSZWZlcmVuY2VzKSB7CisJdGhpcy5xdWFsaWZpZWROYW1lUmVmZXJlbmNlcyA9IGludGVyblF1YWxpZmllZE5hbWVzKHF1YWxpZmllZE5hbWVSZWZlcmVuY2VzLCBmYWxzZSk7CiAJdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcyA9IGludGVyblNpbXBsZU5hbWVzKHNpbXBsZU5hbWVSZWZlcmVuY2VzLCB0cnVlKTsKKwl0aGlzLnJvb3RSZWZlcmVuY2VzID0gaW50ZXJuU2ltcGxlTmFtZXMocm9vdFJlZmVyZW5jZXMsIGZhbHNlKTsKIH0KIAotdm9pZCBhZGREZXBlbmRlbmNpZXMoU3RyaW5nW10gdHlwZU5hbWVEZXBlbmRlbmNpZXMpIHsKK3B1YmxpYyB2b2lkIGFkZERlcGVuZGVuY2llcyhTdHJpbmdbXSB0eXBlTmFtZURlcGVuZGVuY2llcykgewogCS8vIGlmIGVhY2ggcXVhbGlmaWVkIHR5cGUgbmFtZSBpcyBhbHJlYWR5IGtub3duIHRoZW4gYWxsIG9mIGl0cyBzdWJOYW1lcyBjYW4gYmUgc2tpcHBlZAogCS8vIGFuZCBpdHMgZXhwZWN0ZWQgdGhhdCB2ZXJ5IGZldyBxdWFsaWZpZWQgbmFtZXMgaW4gdHlwZU5hbWVEZXBlbmRlbmNpZXMgbmVlZCB0byBiZSBhZGRlZAogCS8vIGJ1dCBjb3VsZCBhbHdheXMgdGFrZSAncDEucDIucDMuWCcgYW5kIG1ha2UgYWxsIHF1YWxpZmllZCBuYW1lcyAncDEnICdwMS5wMicgJ3AxLnAyLnAzJyAncDEucDIucDMuWCcsIHRoZW4gaW50ZXJuCiAJY2hhcltdW11bXSBxTmFtZXMgPSBuZXcgY2hhclt0eXBlTmFtZURlcGVuZGVuY2llcy5sZW5ndGhdW11bXTsKIAlmb3IgKGludCBpID0gdHlwZU5hbWVEZXBlbmRlbmNpZXMubGVuZ3RoOyAtLWkgPj0gMDspCiAJCXFOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lRGVwZW5kZW5jaWVzW2ldLnRvQ2hhckFycmF5KCkpOwotCXFOYW1lcyA9IGludGVyblF1YWxpZmllZE5hbWVzKHFOYW1lcyk7CisJcU5hbWVzID0gaW50ZXJuUXVhbGlmaWVkTmFtZXMocU5hbWVzLCBmYWxzZSk7CiAKIAluZXh0IDogZm9yIChpbnQgaSA9IHFOYW1lcy5sZW5ndGg7IC0taSA+PSAwOykgewogCQljaGFyW11bXSBxdWFsaWZpZWRUeXBlTmFtZSA9IHFOYW1lc1tpXTsKQEAgLTM5LDE0ICs0MSwxOSBAQAogCQkJaWYgKCFpbmNsdWRlcyhxdWFsaWZpZWRUeXBlTmFtZVtxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGggLSAxXSkpIHsKIAkJCQlpbnQgbGVuZ3RoID0gdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcy5sZW5ndGg7CiAJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzLCAwLCB0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzID0gbmV3IGNoYXJbbGVuZ3RoICsgMV1bXSwgMCwgbGVuZ3RoKTsKLQkJCQl0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzW2xlbmd0aF0gPSBxdWFsaWZpZWRUeXBlTmFtZVtxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGggLSAxXTsJCQkJCisJCQkJdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlc1tsZW5ndGhdID0gcXVhbGlmaWVkVHlwZU5hbWVbcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoIC0gMV07CisJCQl9CisJCQlpZiAoIWluc2lkZVJvb3QocXVhbGlmaWVkVHlwZU5hbWVbMF0pKSB7CisJCQkJaW50IGxlbmd0aCA9IHRoaXMucm9vdFJlZmVyZW5jZXMubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5yb290UmVmZXJlbmNlcywgMCwgdGhpcy5yb290UmVmZXJlbmNlcyA9IG5ldyBjaGFyW2xlbmd0aCArIDFdW10sIDAsIGxlbmd0aCk7CisJCQkJdGhpcy5yb290UmVmZXJlbmNlc1tsZW5ndGhdID0gcXVhbGlmaWVkVHlwZU5hbWVbMF07CiAJCQl9CiAJCQlpbnQgbGVuZ3RoID0gdGhpcy5xdWFsaWZpZWROYW1lUmVmZXJlbmNlcy5sZW5ndGg7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXMsIDAsIHRoaXMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXMgPSBuZXcgY2hhcltsZW5ndGggKyAxXVtdW10sIDAsIGxlbmd0aCk7CiAJCQl0aGlzLnF1YWxpZmllZE5hbWVSZWZlcmVuY2VzW2xlbmd0aF0gPSBxdWFsaWZpZWRUeXBlTmFtZTsKIAogCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHF1YWxpZmllZFR5cGVOYW1lLCAwLCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGggLSAxKTsKLQkJCWNoYXJbXVtdW10gdGVtcCA9IGludGVyblF1YWxpZmllZE5hbWVzKG5ldyBjaGFyW11bXVtdIHtxdWFsaWZpZWRUeXBlTmFtZX0pOworCQkJY2hhcltdW11bXSB0ZW1wID0gaW50ZXJuUXVhbGlmaWVkTmFtZXMobmV3IGNoYXJbXVtdW10ge3F1YWxpZmllZFR5cGVOYW1lfSwgZmFsc2UpOwogCQkJaWYgKHRlbXAgPT0gRW1wdHlRdWFsaWZpZWROYW1lcykKIAkJCQljb250aW51ZSBuZXh0OyAvLyBxdWFsaWZpZWRUeXBlTmFtZSBpcyBhIHdlbGwga25vd24gbmFtZQogCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSB0ZW1wWzBdOwpAQCAtNTQsMjAgKzYxLDM0IEBACiAJfQogfQogCi1ib29sZWFuIGluY2x1ZGVzKGNoYXJbXSBzaW1wbGVOYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSBzaW1wbGVOYW1lUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCWlmIChzaW1wbGVOYW1lID09IHNpbXBsZU5hbWVSZWZlcmVuY2VzW2ldKSByZXR1cm4gdHJ1ZTsKK3B1YmxpYyBib29sZWFuIGluY2x1ZGVzKGNoYXJbXSBzaW1wbGVOYW1lKSB7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJaWYgKHNpbXBsZU5hbWUgPT0gdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlc1tpXSkgcmV0dXJuIHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1ib29sZWFuIGluY2x1ZGVzKGNoYXJbXVtdIHF1YWxpZmllZE5hbWUpIHsKLQlmb3IgKGludCBpID0gMCwgbCA9IHF1YWxpZmllZE5hbWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gcXVhbGlmaWVkTmFtZVJlZmVyZW5jZXNbaV0pIHJldHVybiB0cnVlOworcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoY2hhcltdW10gcXVhbGlmaWVkTmFtZSkgeworCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5xdWFsaWZpZWROYW1lUmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmIChxdWFsaWZpZWROYW1lID09IHRoaXMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXNbaV0pIHJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KIAotYm9vbGVhbiBpbmNsdWRlcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzLCBjaGFyW11bXSBzaW1wbGVOYW1lcykgeworLyoqCisgKiBAZGVwcmVjYXRlZAorICovCitwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzLCBjaGFyW11bXSBzaW1wbGVOYW1lcykgeworCXJldHVybiBpbmNsdWRlcyhxdWFsaWZpZWROYW1lcywgc2ltcGxlTmFtZXMsIG51bGwpOworfQorCitwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzLCBjaGFyW11bXSBzaW1wbGVOYW1lcywgY2hhcltdW10gcm9vdE5hbWVzKSB7CiAJLy8gaWYgZWl0aGVyIGNvbGxlY3Rpb24gb2YgbmFtZXMgaXMgbnVsbCwgaXQgbWVhbnMgaXQgY29udGFpbmVkIGEgd2VsbCBrbm93biBuYW1lIHNvIHdlIGtub3cgaXQgYWxyZWFkeSBoYXMgYSBtYXRjaAorCWlmIChyb290TmFtZXMgIT0gbnVsbCkgeworCQlib29sZWFuIGZvdW5kUm9vdCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMCwgbCA9IHJvb3ROYW1lcy5sZW5ndGg7ICFmb3VuZFJvb3QgJiYgaSA8IGw7IGkrKykKKwkJCWZvdW5kUm9vdCA9IGluc2lkZVJvb3Qocm9vdE5hbWVzW2ldKTsKKwkJaWYgKCFmb3VuZFJvb3QpCisJCQlyZXR1cm4gZmFsc2U7CisJfQogCWlmIChzaW1wbGVOYW1lcyA9PSBudWxsIHx8IHF1YWxpZmllZE5hbWVzID09IG51bGwpIHsKIAkJaWYgKHNpbXBsZU5hbWVzID09IG51bGwgJiYgcXVhbGlmaWVkTmFtZXMgPT0gbnVsbCkgewogCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQpAQCAtOTEsMTAgKzExMiwxNSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsID0gc2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpbnQgc0xlbmd0aCA9IHNpbXBsZU5hbWVzLmxlbmd0aDsKKwlpbnQgcUxlbmd0aCA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsKKwlpZiAoc0xlbmd0aCA8PSBxTGVuZ3RoKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc0xlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaW5jbHVkZXMoc2ltcGxlTmFtZXNbaV0pKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBxdWFsaWZpZWROYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHFMZW5ndGg7IGorKykgewogCQkJCQljaGFyW11bXSBxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZXNbal07CiAJCQkJCWlmIChxdWFsaWZpZWROYW1lLmxlbmd0aCA9PSAxID8gaW5jbHVkZXMocXVhbGlmaWVkTmFtZVswXSkgOiBpbmNsdWRlcyhxdWFsaWZpZWROYW1lKSkgewogCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQpAQCAtMTA2LDEwICsxMzIsMzEgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KKwl9IGVsc2UgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHFMZW5ndGg7IGkrKykgeworCQkJY2hhcltdW10gcXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWVzW2ldOworCQkJaWYgKHF1YWxpZmllZE5hbWUubGVuZ3RoID09IDEgPyBpbmNsdWRlcyhxdWFsaWZpZWROYW1lWzBdKSA6IGluY2x1ZGVzKHF1YWxpZmllZE5hbWUpKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzTGVuZ3RoOyBqKyspIHsKKwkJCQkJaWYgKGluY2x1ZGVzKHNpbXBsZU5hbWVzW2pdKSkgeworCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgbWF0Y2ggaW4gIiArIENoYXJPcGVyYXRpb24udG9TdHJpbmcocXVhbGlmaWVkTmFtZSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrICIgdG8gIiArIG5ldyBTdHJpbmcoc2ltcGxlTmFtZXNbal0pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CiAJfQogCXJldHVybiBmYWxzZTsKIH0KIAorcHVibGljIGJvb2xlYW4gaW5zaWRlUm9vdChjaGFyW10gcm9vdE5hbWUpIHsKKwlmb3IgKGludCBpID0gMCwgbCA9IHRoaXMucm9vdFJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlpZiAocm9vdE5hbWUgPT0gdGhpcy5yb290UmVmZXJlbmNlc1tpXSkgcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCiAKIC8vIFdoZW4gYW55IHR5cGUgaXMgY29tcGlsZWQsIGl0cyBtZXRob2RzIGFyZSB2ZXJpZmllZCBmb3IgY2VydGFpbiBwcm9ibGVtcwogLy8gdGhlIE1ldGhvZFZlcmlmaWVyIHJlcXVlc3RzIDMgd2VsbCBrbm93biB0eXBlcyB3aGljaCBlbmQgdXAgaW4gdGhlIHJlZmVyZW5jZSBjb2xsZWN0aW9uCkBAIC0xNDksNyArMTk2LDcgQEAKIAkJSW50ZXJuZWRTaW1wbGVOYW1lc1tpXSA9IG5ldyBOYW1lU2V0KDM3KTsKIH0KIAotc3RhdGljIGNoYXJbXVtdW10gaW50ZXJuUXVhbGlmaWVkTmFtZXMoU3RyaW5nU2V0IHF1YWxpZmllZFN0cmluZ3MpIHsKK3B1YmxpYyBzdGF0aWMgY2hhcltdW11bXSBpbnRlcm5RdWFsaWZpZWROYW1lcyhTdHJpbmdTZXQgcXVhbGlmaWVkU3RyaW5ncykgewogCWlmIChxdWFsaWZpZWRTdHJpbmdzID09IG51bGwpIHJldHVybiBFbXB0eVF1YWxpZmllZE5hbWVzOwogCWludCBsZW5ndGggPSBxdWFsaWZpZWRTdHJpbmdzLmVsZW1lbnRTaXplOwogCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVtcHR5UXVhbGlmaWVkTmFtZXM7CkBAIC0xNTksMTAgKzIwNiwxNCBAQAogCWZvciAoaW50IGkgPSAwLCBsID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBsOyBpKyspCiAJCWlmIChzdHJpbmdzW2ldICE9IG51bGwpCiAJCQlyZXN1bHRbLS1sZW5ndGhdID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgc3RyaW5nc1tpXS50b0NoYXJBcnJheSgpKTsKLQlyZXR1cm4gaW50ZXJuUXVhbGlmaWVkTmFtZXMocmVzdWx0KTsKKwlyZXR1cm4gaW50ZXJuUXVhbGlmaWVkTmFtZXMocmVzdWx0LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBjaGFyW11bXVtdIGludGVyblF1YWxpZmllZE5hbWVzKGNoYXJbXVtdW10gcXVhbGlmaWVkTmFtZXMpIHsKK3B1YmxpYyBzdGF0aWMgY2hhcltdW11bXSBpbnRlcm5RdWFsaWZpZWROYW1lcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzKSB7CisJcmV0dXJuIGludGVyblF1YWxpZmllZE5hbWVzKHF1YWxpZmllZE5hbWVzLCBmYWxzZSk7Cit9CisKK3B1YmxpYyBzdGF0aWMgY2hhcltdW11bXSBpbnRlcm5RdWFsaWZpZWROYW1lcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzLCBib29sZWFuIGtlZXBXZWxsS25vd24pIHsKIAlpZiAocXVhbGlmaWVkTmFtZXMgPT0gbnVsbCkgcmV0dXJuIEVtcHR5UXVhbGlmaWVkTmFtZXM7CiAJaW50IGxlbmd0aCA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsKIAlpZiAobGVuZ3RoID09IDApIHJldHVybiBFbXB0eVF1YWxpZmllZE5hbWVzOwpAQCAtMTc2LDggKzIyNywxMiBAQAogCQkJY2hhcltdW10gd2VsbEtub3duTmFtZSA9IFdlbGxLbm93blF1YWxpZmllZE5hbWVzW2pdOwogCQkJaWYgKHFMZW5ndGggPiB3ZWxsS25vd25OYW1lLmxlbmd0aCkKIAkJCQlicmVhazsgLy8gYWxsIHJlbWFpbmluZyB3ZWxsIGtub3duIG5hbWVzIGFyZSBzaG9ydGVyCi0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocXVhbGlmaWVkTmFtZSwgd2VsbEtub3duTmFtZSkpCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocXVhbGlmaWVkTmFtZSwgd2VsbEtub3duTmFtZSkpIHsKKwkJCQlpZiAoa2VlcFdlbGxLbm93bikgeworCQkJCQlrZWVwZXJzW2luZGV4KytdID0gd2VsbEtub3duTmFtZTsKKwkJCQl9CiAJCQkJY29udGludWUgbmV4dDsKKwkJCX0KIAkJfQogCiAJCS8vIEludGVybmVkUXVhbGlmaWVkTmFtZXNbMF0gaXMgZm9yIHRoZSByZXN0ICg+IDcgJiAxKQpAQCAtMTk0LDcgKzI0OSwxNCBAQAogCXJldHVybiBrZWVwZXJzOwogfQogCi1zdGF0aWMgY2hhcltdW10gaW50ZXJuU2ltcGxlTmFtZXMoU3RyaW5nU2V0IHNpbXBsZVN0cmluZ3MpIHsKKy8qKgorICogQGRlcHJlY2F0ZWQKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW11bXSBpbnRlcm5TaW1wbGVOYW1lcyhTdHJpbmdTZXQgc2ltcGxlU3RyaW5ncykgeworCXJldHVybiBpbnRlcm5TaW1wbGVOYW1lcyhzaW1wbGVTdHJpbmdzLCB0cnVlKTsKK30KKworcHVibGljIHN0YXRpYyBjaGFyW11bXSBpbnRlcm5TaW1wbGVOYW1lcyhTdHJpbmdTZXQgc2ltcGxlU3RyaW5ncywgYm9vbGVhbiByZW1vdmVXZWxsS25vd24pIHsKIAlpZiAoc2ltcGxlU3RyaW5ncyA9PSBudWxsKSByZXR1cm4gRW1wdHlTaW1wbGVOYW1lczsKIAlpbnQgbGVuZ3RoID0gc2ltcGxlU3RyaW5ncy5lbGVtZW50U2l6ZTsKIAlpZiAobGVuZ3RoID09IDApIHJldHVybiBFbXB0eVNpbXBsZU5hbWVzOwpAQCAtMjA0LDEwICsyNjYsMTAgQEAKIAlmb3IgKGludCBpID0gMCwgbCA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQlpZiAoc3RyaW5nc1tpXSAhPSBudWxsKQogCQkJcmVzdWx0Wy0tbGVuZ3RoXSA9IHN0cmluZ3NbaV0udG9DaGFyQXJyYXkoKTsKLQlyZXR1cm4gaW50ZXJuU2ltcGxlTmFtZXMocmVzdWx0LCB0cnVlKTsKKwlyZXR1cm4gaW50ZXJuU2ltcGxlTmFtZXMocmVzdWx0LCByZW1vdmVXZWxsS25vd24pOwogfQogCi1zdGF0aWMgY2hhcltdW10gaW50ZXJuU2ltcGxlTmFtZXMoY2hhcltdW10gc2ltcGxlTmFtZXMsIGJvb2xlYW4gcmVtb3ZlV2VsbEtub3duKSB7CitwdWJsaWMgc3RhdGljIGNoYXJbXVtdIGludGVyblNpbXBsZU5hbWVzKGNoYXJbXVtdIHNpbXBsZU5hbWVzLCBib29sZWFuIHJlbW92ZVdlbGxLbm93bikgewogCWlmIChzaW1wbGVOYW1lcyA9PSBudWxsKSByZXR1cm4gRW1wdHlTaW1wbGVOYW1lczsKIAlpbnQgbGVuZ3RoID0gc2ltcGxlTmFtZXMubGVuZ3RoOwogCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVtcHR5U2ltcGxlTmFtZXM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU291cmNlRmlsZS5qYXZhCmluZGV4IGY1NWUyOWQuLjQ5NTVmNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU291cmNlRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU291cmNlRmlsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogCVNvdXJjZUZpbGUgZiA9IChTb3VyY2VGaWxlKSBvOwogCXJldHVybiB0aGlzLnNvdXJjZUxvY2F0aW9uID09IGYuc291cmNlTG9jYXRpb24gJiYgdGhpcy5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhmLnJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotfSAKK30KIAogU3RyaW5nIGV4dHJhY3RUeXBlTmFtZSgpIHsKIAkvLyBhbnN3ZXIgYSBTdHJpbmcgd2l0aCB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSBmb3IgdGhlIHNvdXJjZSBmaWxlIGluIHRoZSBmb3JtOiAncDEvcDIvQScKQEAgLTc1LDcgKzc1LDcgQEAKIAogcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKIAotCXRyeSB7CQorCXRyeSB7CiAJCXJldHVybiBVdGlsLmdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheSh0aGlzLnJlc291cmNlKTsKIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbmV3IE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKHRoaXMucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1N0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1N0YXRlLmphdmEKaW5kZXggYzVkN2U0OC4uNDM0ODY2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU3RhdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSw3ICsyOSw3IEBACiBTdHJpbmcgamF2YVByb2plY3ROYW1lOwogQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnlbXSBzb3VyY2VMb2NhdGlvbnM7CiBDbGFzc3BhdGhMb2NhdGlvbltdIGJpbmFyeUxvY2F0aW9uczsKLS8vIGtleWVkIGJ5IHRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggb2YgdGhlIHR5cGUgKGllLiAic3JjMS9wMS9wMi9BLmphdmEiKSwgdmFsdWUgaXMgYSBSZWZlcmVuY2VDb2xsZWN0aW9uIG9yIGFuIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbgorLy8ga2V5ZWQgYnkgdGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdHlwZSAoaS5lLiAic3JjMS9wMS9wMi9BLmphdmEiKSwgdmFsdWUgaXMgYSBSZWZlcmVuY2VDb2xsZWN0aW9uIG9yIGFuIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbgogU2ltcGxlTG9va3VwVGFibGUgcmVmZXJlbmNlczsKIC8vIGtleWVkIGJ5IHF1YWxpZmllZCB0eXBlIG5hbWUgInAxL3AyL0EiLCB2YWx1ZSBpcyB0aGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIHdoaWNoIGRlZmluZXMgdGhpcyB0eXBlICJzcmMxL3AxL3AyL0EuamF2YSIKIHB1YmxpYyBTaW1wbGVMb29rdXBUYWJsZSB0eXBlTG9jYXRvcnM7CkBAIC00NCw3ICs0NCw3IEBACiBwcml2YXRlIFN0cmluZ1NldCBzdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXM7CiBwdWJsaWMgc3RhdGljIGludCBNYXhTdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXMgPSAxMDA7IC8vIGtlZXAgdHJhY2sgb2YgPyBzdHJ1Y3R1cmFsbHkgY2hhbmdlZCB0eXBlcywgb3RoZXJ3aXNlIGNvbnNpZGVyIGFsbCB0byBiZSBjaGFuZ2VkCiAKLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OID0gMHgwMDE1OyAvLyBjaGFuZ2VkIGFjY2VzcyBydWxlIHByZXNlbnRhdGlvbgorcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAweDAwMUE7IC8vIGZpeCBmb3IgMjg3MTY0CiAKIHN0YXRpYyBmaW5hbCBieXRlIFNPVVJDRV9GT0xERVIgPSAxOwogc3RhdGljIGZpbmFsIGJ5dGUgQklOQVJZX0ZPTERFUiA9IDI7CkBAIC0xMDUsMTUgKzEwNSwxOSBAQAogCX0KIH0KIHB1YmxpYyBjaGFyW11bXSBnZXREZWZpbmVkVHlwZU5hbWVzRm9yKFN0cmluZyB0eXBlTG9jYXRvcikgewotCU9iamVjdCBjID0gcmVmZXJlbmNlcy5nZXQodHlwZUxvY2F0b3IpOworCU9iamVjdCBjID0gdGhpcy5yZWZlcmVuY2VzLmdldCh0eXBlTG9jYXRvcik7CiAJaWYgKGMgaW5zdGFuY2VvZiBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24pCiAJCXJldHVybiAoKEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbikgYykuZGVmaW5lZFR5cGVOYW1lczsKIAlyZXR1cm4gbnVsbDsgLy8gbWVhbnMgb25seSBvbmUgdHlwZSBpcyBkZWZpbmVkIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmlsZS4uLiBzYXZlcyBzcGFjZQogfQogCitwdWJsaWMgU2ltcGxlTG9va3VwVGFibGUgZ2V0UmVmZXJlbmNlcygpIHsKKwlyZXR1cm4gdGhpcy5yZWZlcmVuY2VzOworfQorCiBTdHJpbmdTZXQgZ2V0U3RydWN0dXJhbGx5Q2hhbmdlZFR5cGVzKFN0YXRlIHByZXJlcVN0YXRlKSB7CiAJaWYgKHByZXJlcVN0YXRlICE9IG51bGwgJiYgcHJlcmVxU3RhdGUucHJldmlvdXNTdHJ1Y3R1cmFsQnVpbGRUaW1lID4gMCkgewotCQlPYmplY3QgbyA9IHN0cnVjdHVyYWxCdWlsZFRpbWVzLmdldChwcmVyZXFTdGF0ZS5qYXZhUHJvamVjdE5hbWUpOworCQlPYmplY3QgbyA9IHRoaXMuc3RydWN0dXJhbEJ1aWxkVGltZXMuZ2V0KHByZXJlcVN0YXRlLmphdmFQcm9qZWN0TmFtZSk7CiAJCWxvbmcgcHJldmlvdXMgPSBvID09IG51bGwgPyAwIDogKChMb25nKSBvKS5sb25nVmFsdWUoKTsKIAkJaWYgKHByZXZpb3VzID09IHByZXJlcVN0YXRlLnByZXZpb3VzU3RydWN0dXJhbEJ1aWxkVGltZSkKIAkJCXJldHVybiBwcmVyZXFTdGF0ZS5zdHJ1Y3R1cmFsbHlDaGFuZ2VkVHlwZXM7CkBAIC0xMjEsMTUgKzEyNSwxNSBAQAogCXJldHVybiBudWxsOwogfQogCi1ib29sZWFuIGlzRHVwbGljYXRlTG9jYXRvcihTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIFN0cmluZyB0eXBlTG9jYXRvcikgewotCVN0cmluZyBleGlzdGluZyA9IChTdHJpbmcpIHR5cGVMb2NhdG9ycy5nZXQocXVhbGlmaWVkVHlwZU5hbWUpOworcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGVMb2NhdG9yKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgU3RyaW5nIHR5cGVMb2NhdG9yKSB7CisJU3RyaW5nIGV4aXN0aW5nID0gKFN0cmluZykgdGhpcy50eXBlTG9jYXRvcnMuZ2V0KHF1YWxpZmllZFR5cGVOYW1lKTsKIAlyZXR1cm4gZXhpc3RpbmcgIT0gbnVsbCAmJiAhZXhpc3RpbmcuZXF1YWxzKHR5cGVMb2NhdG9yKTsKIH0KIAotYm9vbGVhbiBpc0tub3duUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKLQlpZiAoa25vd25QYWNrYWdlTmFtZXMgPT0gbnVsbCkgewotCQlBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KHR5cGVMb2NhdG9ycy5lbGVtZW50U2l6ZSk7Ci0JCU9iamVjdFtdIGtleVRhYmxlID0gdHlwZUxvY2F0b3JzLmtleVRhYmxlOworcHVibGljIGJvb2xlYW4gaXNLbm93blBhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJaWYgKHRoaXMua25vd25QYWNrYWdlTmFtZXMgPT0gbnVsbCkgeworCQlBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KHRoaXMudHlwZUxvY2F0b3JzLmVsZW1lbnRTaXplKTsKKwkJT2JqZWN0W10ga2V5VGFibGUgPSB0aGlzLnR5cGVMb2NhdG9ycy5rZXlUYWJsZTsKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CiAJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZykga2V5VGFibGVbaV07IC8vIGlzIGEgdHlwZSBuYW1lIG9mIHRoZSBmb3JtIHAxL3AyL0EKQEAgLTE0MiwyNiArMTQ2LDM1IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWtub3duUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tuYW1lcy5zaXplKCldOwotCQluYW1lcy50b0FycmF5KGtub3duUGFja2FnZU5hbWVzKTsKKwkJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXTsKKwkJbmFtZXMudG9BcnJheSh0aGlzLmtub3duUGFja2FnZU5hbWVzKTsKIAl9Ci0JZm9yIChpbnQgaSA9IDAsIGwgPSBrbm93blBhY2thZ2VOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspCi0JCWlmIChrbm93blBhY2thZ2VOYW1lc1tpXS5lcXVhbHMocXVhbGlmaWVkUGFja2FnZU5hbWUpKQorCWZvciAoaW50IGkgPSAwLCBsID0gdGhpcy5rbm93blBhY2thZ2VOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmICh0aGlzLmtub3duUGFja2FnZU5hbWVzW2ldLmVxdWFscyhxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2xlYW4gaXNLbm93blR5cGUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JcmV0dXJuIHR5cGVMb2NhdG9ycy5jb250YWluc0tleShxdWFsaWZpZWRUeXBlTmFtZSk7CitwdWJsaWMgYm9vbGVhbiBpc0tub3duVHlwZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpIHsKKwlyZXR1cm4gdGhpcy50eXBlTG9jYXRvcnMuY29udGFpbnNLZXkocXVhbGlmaWVkVHlwZU5hbWUpOwogfQogCi12b2lkIHJlY29yZChTdHJpbmcgdHlwZUxvY2F0b3IsIGNoYXJbXVtdW10gcXVhbGlmaWVkUmVmcywgY2hhcltdW10gc2ltcGxlUmVmcywgY2hhcltdIG1haW5UeXBlTmFtZSwgQXJyYXlMaXN0IHR5cGVOYW1lcykgeworYm9vbGVhbiBpc1NvdXJjZUZvbGRlckVtcHR5KElDb250YWluZXIgc291cmNlRm9sZGVyKSB7CisJU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSBzb3VyY2VGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKTsKKwlPYmplY3RbXSB0YWJsZSA9IHRoaXMudHlwZUxvY2F0b3JzLnZhbHVlVGFibGU7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0YWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmICh0YWJsZVtpXSAhPSBudWxsICYmICgoU3RyaW5nKSB0YWJsZVtpXSkuc3RhcnRzV2l0aChzb3VyY2VGb2xkZXJOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCByZWNvcmQoU3RyaW5nIHR5cGVMb2NhdG9yLCBjaGFyW11bXVtdIHF1YWxpZmllZFJlZnMsIGNoYXJbXVtdIHNpbXBsZVJlZnMsIGNoYXJbXVtdIHJvb3RSZWZzLCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgdHlwZU5hbWVzKSB7CiAJaWYgKHR5cGVOYW1lcy5zaXplKCkgPT0gMSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtYWluVHlwZU5hbWUsIChjaGFyW10pIHR5cGVOYW1lcy5nZXQoMCkpKSB7Ci0JCXJlZmVyZW5jZXMucHV0KHR5cGVMb2NhdG9yLCBuZXcgUmVmZXJlbmNlQ29sbGVjdGlvbihxdWFsaWZpZWRSZWZzLCBzaW1wbGVSZWZzKSk7CisJCXRoaXMucmVmZXJlbmNlcy5wdXQodHlwZUxvY2F0b3IsIG5ldyBSZWZlcmVuY2VDb2xsZWN0aW9uKHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMsIHJvb3RSZWZzKSk7CiAJfSBlbHNlIHsKIAkJY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcyA9IG5ldyBjaGFyW3R5cGVOYW1lcy5zaXplKCldW107IC8vIGNhbiBiZSBlbXB0eSB3aGVuIG5vIHR5cGVzIGFyZSBkZWZpbmVkCiAJCXR5cGVOYW1lcy50b0FycmF5KGRlZmluZWRUeXBlTmFtZXMpOwotCQlyZWZlcmVuY2VzLnB1dCh0eXBlTG9jYXRvciwgbmV3IEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbihkZWZpbmVkVHlwZU5hbWVzLCBxdWFsaWZpZWRSZWZzLCBzaW1wbGVSZWZzKSk7CisJCXRoaXMucmVmZXJlbmNlcy5wdXQodHlwZUxvY2F0b3IsIG5ldyBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24oZGVmaW5lZFR5cGVOYW1lcywgcXVhbGlmaWVkUmVmcywgc2ltcGxlUmVmcywgcm9vdFJlZnMpKTsKIAl9CiB9CiAKQEAgLTE3MSwxOSArMTg0LDE5IEBACiAJaW50IHN0YXJ0ID0gdHlwZUxvY2F0b3IuaW5kZXhPZihxdWFsaWZpZWRUeXBlTmFtZSwgMCk7CiAJaWYgKHN0YXJ0ID4gMCkKIAkJcXVhbGlmaWVkVHlwZU5hbWUgPSB0eXBlTG9jYXRvci5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkpOwotCXR5cGVMb2NhdG9ycy5wdXQocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKTsKKwl0aGlzLnR5cGVMb2NhdG9ycy5wdXQocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKTsKIH0KIAogdm9pZCByZWNvcmRTdHJ1Y3R1cmFsRGVwZW5kZW5jeShJUHJvamVjdCBwcmVyZXFQcm9qZWN0LCBTdGF0ZSBwcmVyZXFTdGF0ZSkgewogCWlmIChwcmVyZXFTdGF0ZSAhPSBudWxsKQogCQlpZiAocHJlcmVxU3RhdGUubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUgPiAwKSAvLyBjYW4gc2tpcCBpZiAwIChmdWxsIGJ1aWxkKSBzaW5jZSBpdHMgYXNzdW1lZCB0byBiZSAwIGlmIHVua25vd24KLQkJCXN0cnVjdHVyYWxCdWlsZFRpbWVzLnB1dChwcmVyZXFQcm9qZWN0LmdldE5hbWUoKSwgbmV3IExvbmcocHJlcmVxU3RhdGUubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpKTsKKwkJCXRoaXMuc3RydWN0dXJhbEJ1aWxkVGltZXMucHV0KHByZXJlcVByb2plY3QuZ2V0TmFtZSgpLCBuZXcgTG9uZyhwcmVyZXFTdGF0ZS5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSkpOwogfQogCiB2b2lkIHJlbW92ZUxvY2F0b3IoU3RyaW5nIHR5cGVMb2NhdG9yVG9SZW1vdmUpIHsKIAl0aGlzLmtub3duUGFja2FnZU5hbWVzID0gbnVsbDsKLQlyZWZlcmVuY2VzLnJlbW92ZUtleSh0eXBlTG9jYXRvclRvUmVtb3ZlKTsKLQl0eXBlTG9jYXRvcnMucmVtb3ZlVmFsdWUodHlwZUxvY2F0b3JUb1JlbW92ZSk7CisJdGhpcy5yZWZlcmVuY2VzLnJlbW92ZUtleSh0eXBlTG9jYXRvclRvUmVtb3ZlKTsKKwl0aGlzLnR5cGVMb2NhdG9ycy5yZW1vdmVWYWx1ZSh0eXBlTG9jYXRvclRvUmVtb3ZlKTsKIH0KIAogdm9pZCByZW1vdmVQYWNrYWdlKElSZXNvdXJjZURlbHRhIHNvdXJjZURlbHRhKSB7CkBAIC0yMDMsNyArMjE2LDcgQEAKIAogdm9pZCByZW1vdmVRdWFsaWZpZWRUeXBlTmFtZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWVUb1JlbW92ZSkgewogCXRoaXMua25vd25QYWNrYWdlTmFtZXMgPSBudWxsOwotCXR5cGVMb2NhdG9ycy5yZW1vdmVLZXkocXVhbGlmaWVkVHlwZU5hbWVUb1JlbW92ZSk7CisJdGhpcy50eXBlTG9jYXRvcnMucmVtb3ZlS2V5KHF1YWxpZmllZFR5cGVOYW1lVG9SZW1vdmUpOwogfQogCiBzdGF0aWMgU3RhdGUgcmVhZChJUHJvamVjdCBwcm9qZWN0LCBEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yNzQsNiArMjg3LDcgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogCQluZXdTdGF0ZS5yZWNvcmRMb2NhdG9yRm9yVHlwZShpbi5yZWFkVVRGKCksIGludGVybmVkVHlwZUxvY2F0b3JzW2luLnJlYWRJbnQoKV0pOwogCisJY2hhcltdW10gaW50ZXJuZWRSb290TmFtZXMgPSBSZWZlcmVuY2VDb2xsZWN0aW9uLmludGVyblNpbXBsZU5hbWVzKHJlYWROYW1lcyhpbiksIGZhbHNlKTsKIAljaGFyW11bXSBpbnRlcm5lZFNpbXBsZU5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5TaW1wbGVOYW1lcyhyZWFkTmFtZXMoaW4pLCBmYWxzZSk7CiAJY2hhcltdW11bXSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoID0gaW4ucmVhZEludCgpXVtdW107CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtMjgzLDcgKzI5Nyw3IEBACiAJCQlxTmFtZVtqXSA9IGludGVybmVkU2ltcGxlTmFtZXNbaW4ucmVhZEludCgpXTsKIAkJaW50ZXJuZWRRdWFsaWZpZWROYW1lc1tpXSA9IHFOYW1lOwogCX0KLQlpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5RdWFsaWZpZWROYW1lcyhpbnRlcm5lZFF1YWxpZmllZE5hbWVzKTsKKwlpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5RdWFsaWZpZWROYW1lcyhpbnRlcm5lZFF1YWxpZmllZE5hbWVzLCBmYWxzZSk7CiAKIAluZXdTdGF0ZS5yZWZlcmVuY2VzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKGxlbmd0aCA9IGluLnJlYWRJbnQoKSk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtMjk4LDcgKzMxMiwxMCBAQAogCQkJCWNoYXJbXVtdIHNpbXBsZU5hbWVzID0gbmV3IGNoYXJbaW4ucmVhZEludCgpXVtdOwogCQkJCWZvciAoaW50IGogPSAwLCBtID0gc2ltcGxlTmFtZXMubGVuZ3RoOyBqIDwgbTsgaisrKQogCQkJCQlzaW1wbGVOYW1lc1tqXSA9IGludGVybmVkU2ltcGxlTmFtZXNbaW4ucmVhZEludCgpXTsKLQkJCQljb2xsZWN0aW9uID0gbmV3IEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbihhZGRpdGlvbmFsVHlwZU5hbWVzLCBxdWFsaWZpZWROYW1lcywgc2ltcGxlTmFtZXMpOworCQkJCWNoYXJbXVtdIHJvb3ROYW1lcyA9IG5ldyBjaGFyW2luLnJlYWRJbnQoKV1bXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IHJvb3ROYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJCXJvb3ROYW1lc1tqXSA9IGludGVybmVkUm9vdE5hbWVzW2luLnJlYWRJbnQoKV07CisJCQkJY29sbGVjdGlvbiA9IG5ldyBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24oYWRkaXRpb25hbFR5cGVOYW1lcywgcXVhbGlmaWVkTmFtZXMsIHNpbXBsZU5hbWVzLCByb290TmFtZXMpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAyIDoKIAkJCQljaGFyW11bXVtdIHFOYW1lcyA9IG5ldyBjaGFyW2luLnJlYWRJbnQoKV1bXVtdOwpAQCAtMzA3LDcgKzMyNCwxMCBAQAogCQkJCWNoYXJbXVtdIHNOYW1lcyA9IG5ldyBjaGFyW2luLnJlYWRJbnQoKV1bXTsKIAkJCQlmb3IgKGludCBqID0gMCwgbSA9IHNOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspCiAJCQkJCXNOYW1lc1tqXSA9IGludGVybmVkU2ltcGxlTmFtZXNbaW4ucmVhZEludCgpXTsKLQkJCQljb2xsZWN0aW9uID0gbmV3IFJlZmVyZW5jZUNvbGxlY3Rpb24ocU5hbWVzLCBzTmFtZXMpOworCQkJCWNoYXJbXVtdIHJOYW1lcyA9IG5ldyBjaGFyW2luLnJlYWRJbnQoKV1bXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IHJOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJCXJOYW1lc1tqXSA9IGludGVybmVkUm9vdE5hbWVzW2luLnJlYWRJbnQoKV07CisJCQkJY29sbGVjdGlvbiA9IG5ldyBSZWZlcmVuY2VDb2xsZWN0aW9uKHFOYW1lcywgc05hbWVzLCByTmFtZXMpOwogCQl9CiAJCW5ld1N0YXRlLnJlZmVyZW5jZXMucHV0KHR5cGVMb2NhdG9yLCBjb2xsZWN0aW9uKTsKIAl9CkBAIC0zNDIsMTIgKzM2Miw3IEBACiAJCWFjY2Vzc1J1bGVzW2ldID0gbmV3IENsYXNzcGF0aEFjY2Vzc1J1bGUocGF0dGVybiwgcHJvYmxlbUlkKTsKIAl9CiAJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7Ci0JU3RyaW5nW10gbWVzc2FnZVRlbXBsYXRlcyA9IG5ldyBTdHJpbmdbQWNjZXNzUnVsZVNldC5NRVNTQUdFX1RFTVBMQVRFU19MRU5HVEhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgQWNjZXNzUnVsZVNldC5NRVNTQUdFX1RFTVBMQVRFU19MRU5HVEg7IGkrKykgewotCQltZXNzYWdlVGVtcGxhdGVzW2ldID0gbWFuYWdlci5pbnRlcm4oaW4ucmVhZFVURigpKTsKLQl9Ci0JQWNjZXNzUnVsZVNldCBhY2Nlc3NSdWxlU2V0ID0gbmV3IEFjY2Vzc1J1bGVTZXQoYWNjZXNzUnVsZXMsIG1lc3NhZ2VUZW1wbGF0ZXMpOwotCXJldHVybiBhY2Nlc3NSdWxlU2V0OworCXJldHVybiBuZXcgQWNjZXNzUnVsZVNldChhY2Nlc3NSdWxlcywgaW4ucmVhZEJ5dGUoKSwgbWFuYWdlci5pbnRlcm4oaW4ucmVhZFVURigpKSk7CiB9CiAKIHZvaWQgdGFnQXNOb29wQnVpbGQoKSB7CkBAIC0zNTUsNyArMzcwLDcgQEAKIH0KIAogYm9vbGVhbiB3YXNOb29wQnVpbGQoKSB7Ci0JcmV0dXJuIGJ1aWxkTnVtYmVyID09IC0xOworCXJldHVybiB0aGlzLmJ1aWxkTnVtYmVyID09IC0xOwogfQogCiB2b2lkIHRhZ0FzU3RydWN0dXJhbGx5Q2hhbmdlZCgpIHsKQEAgLTM2Niw3ICszODEsNyBAQAogCiBib29sZWFuIHdhc1N0cnVjdHVyYWxseUNoYW5nZWQoSVByb2plY3QgcHJlcmVxUHJvamVjdCwgU3RhdGUgcHJlcmVxU3RhdGUpIHsKIAlpZiAocHJlcmVxU3RhdGUgIT0gbnVsbCkgewotCQlPYmplY3QgbyA9IHN0cnVjdHVyYWxCdWlsZFRpbWVzLmdldChwcmVyZXFQcm9qZWN0LmdldE5hbWUoKSk7CisJCU9iamVjdCBvID0gdGhpcy5zdHJ1Y3R1cmFsQnVpbGRUaW1lcy5nZXQocHJlcmVxUHJvamVjdC5nZXROYW1lKCkpOwogCQlsb25nIHByZXZpb3VzID0gbyA9PSBudWxsID8gMCA6ICgoTG9uZykgbykubG9uZ1ZhbHVlKCk7CiAJCWlmIChwcmV2aW91cyA9PSBwcmVyZXFTdGF0ZS5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSkgcmV0dXJuIGZhbHNlOwogCX0KQEAgLTM5NCwxOCArNDA5LDE4IEBACiAgKiBpbnQJCQlsYXN0IHN0cnVjdHVyYWwgYnVpbGQgbnVtYmVyCiAqLwogCW91dC53cml0ZUJ5dGUoVkVSU0lPTik7Ci0Jb3V0LndyaXRlVVRGKGphdmFQcm9qZWN0TmFtZSk7Ci0Jb3V0LndyaXRlSW50KGJ1aWxkTnVtYmVyKTsKLQlvdXQud3JpdGVMb25nKGxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lKTsKKwlvdXQud3JpdGVVVEYodGhpcy5qYXZhUHJvamVjdE5hbWUpOworCW91dC53cml0ZUludCh0aGlzLmJ1aWxkTnVtYmVyKTsKKwlvdXQud3JpdGVMb25nKHRoaXMubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpOwogCiAvKgogICogQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnlbXQogICogaW50CQkJaWQKICAqIFN0cmluZwkJcGF0aChzKQogKi8KLQlvdXQud3JpdGVJbnQobGVuZ3RoID0gc291cmNlTG9jYXRpb25zLmxlbmd0aCk7CisJb3V0LndyaXRlSW50KGxlbmd0aCA9IHRoaXMuc291cmNlTG9jYXRpb25zLmxlbmd0aCk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwkJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSB0aGlzLnNvdXJjZUxvY2F0aW9uc1tpXTsKIAkJb3V0LndyaXRlVVRGKG1kLnNvdXJjZUZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CiAJCW91dC53cml0ZVVURihtZC5iaW5hcnlGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwogCQl3cml0ZU5hbWVzKG1kLmluY2x1c2lvblBhdHRlcm5zLCBvdXQpOwpAQCAtNDE4LDEzICs0MzMsMTMgQEAKICAqIGludAkJCWlkCiAgKiBTdHJpbmcJCXBhdGgocykKICovCi0Jb3V0LndyaXRlSW50KGxlbmd0aCA9IGJpbmFyeUxvY2F0aW9ucy5sZW5ndGgpOworCW91dC53cml0ZUludChsZW5ndGggPSB0aGlzLmJpbmFyeUxvY2F0aW9ucy5sZW5ndGgpOwogCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzcGF0aExvY2F0aW9uIGMgPSBiaW5hcnlMb2NhdGlvbnNbaV07CisJCUNsYXNzcGF0aExvY2F0aW9uIGMgPSB0aGlzLmJpbmFyeUxvY2F0aW9uc1tpXTsKIAkJaWYgKGMgaW5zdGFuY2VvZiBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgewogCQkJb3V0LndyaXRlQnl0ZShTT1VSQ0VfRk9MREVSKTsKLQkJCWZvciAoaW50IGogPSAwLCBtID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaiA8IG07IGorKykgewotCQkJCWlmIChzb3VyY2VMb2NhdGlvbnNbal0gPT0gYykgeworCQkJZm9yIChpbnQgaiA9IDAsIG0gPSB0aGlzLnNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKwkJCQlpZiAodGhpcy5zb3VyY2VMb2NhdGlvbnNbal0gPT0gYykgewogCQkJCQlvdXQud3JpdGVJbnQoaik7CiAJCQkJCWNvbnRpbnVlIG5leHQ7CiAJCQkJfQpAQCAtNDU0LDEwICs0NjksMTAgQEAKICAqIFN0cmluZwkJcHJlcmVxIHByb2plY3QgbmFtZQogICogaW50CQkJbGFzdCBzdHJ1Y3R1cmFsIGJ1aWxkIG51bWJlcgogKi8KLQlvdXQud3JpdGVJbnQobGVuZ3RoID0gc3RydWN0dXJhbEJ1aWxkVGltZXMuZWxlbWVudFNpemUpOworCW91dC53cml0ZUludChsZW5ndGggPSB0aGlzLnN0cnVjdHVyYWxCdWlsZFRpbWVzLmVsZW1lbnRTaXplKTsKIAlpZiAobGVuZ3RoID4gMCkgewotCQlrZXlUYWJsZSA9IHN0cnVjdHVyYWxCdWlsZFRpbWVzLmtleVRhYmxlOwotCQl2YWx1ZVRhYmxlID0gc3RydWN0dXJhbEJ1aWxkVGltZXMudmFsdWVUYWJsZTsKKwkJa2V5VGFibGUgPSB0aGlzLnN0cnVjdHVyYWxCdWlsZFRpbWVzLmtleVRhYmxlOworCQl2YWx1ZVRhYmxlID0gdGhpcy5zdHJ1Y3R1cmFsQnVpbGRUaW1lcy52YWx1ZVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKIAkJCQlsZW5ndGgtLTsKQEAgLTQ3MiwxMCArNDg3LDEwIEBACiAvKgogICogU3RyaW5nW10JSW50ZXJuZWQgdHlwZSBsb2NhdG9ycwogICovCi0Jb3V0LndyaXRlSW50KGxlbmd0aCA9IHJlZmVyZW5jZXMuZWxlbWVudFNpemUpOworCW91dC53cml0ZUludChsZW5ndGggPSB0aGlzLnJlZmVyZW5jZXMuZWxlbWVudFNpemUpOwogCVNpbXBsZUxvb2t1cFRhYmxlIGludGVybmVkVHlwZUxvY2F0b3JzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKGxlbmd0aCk7CiAJaWYgKGxlbmd0aCA+IDApIHsKLQkJa2V5VGFibGUgPSByZWZlcmVuY2VzLmtleVRhYmxlOworCQlrZXlUYWJsZSA9IHRoaXMucmVmZXJlbmNlcy5rZXlUYWJsZTsKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CiAJCQkJbGVuZ3RoLS07CkBAIC00OTMsMTAgKzUwOCwxMCBAQAogICogU3RyaW5nCQl0eXBlIG5hbWUKICAqIGludAkJCWludGVybmVkIGxvY2F0b3IgaWQKICAqLwotCW91dC53cml0ZUludChsZW5ndGggPSB0eXBlTG9jYXRvcnMuZWxlbWVudFNpemUpOworCW91dC53cml0ZUludChsZW5ndGggPSB0aGlzLnR5cGVMb2NhdG9ycy5lbGVtZW50U2l6ZSk7CiAJaWYgKGxlbmd0aCA+IDApIHsKLQkJa2V5VGFibGUgPSB0eXBlTG9jYXRvcnMua2V5VGFibGU7Ci0JCXZhbHVlVGFibGUgPSB0eXBlTG9jYXRvcnMudmFsdWVUYWJsZTsKKwkJa2V5VGFibGUgPSB0aGlzLnR5cGVMb2NhdG9ycy5rZXlUYWJsZTsKKwkJdmFsdWVUYWJsZSA9IHRoaXMudHlwZUxvY2F0b3JzLnZhbHVlVGFibGU7CiAJCWZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkgewogCQkJCWxlbmd0aC0tOwpAQCAtNTEwLDE1ICs1MjUsMjMgQEAKIAl9CiAKIC8qCisgKiBjaGFyW11bXQlJbnRlcm5lZCByb290IG5hbWVzCiAgKiBjaGFyW11bXVtdCUludGVybmVkIHF1YWxpZmllZCBuYW1lcwogICogY2hhcltdW10JSW50ZXJuZWQgc2ltcGxlIG5hbWVzCiAgKi8KKwlTaW1wbGVMb29rdXBUYWJsZSBpbnRlcm5lZFJvb3ROYW1lcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKIAlTaW1wbGVMb29rdXBUYWJsZSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMxKTsKIAlTaW1wbGVMb29rdXBUYWJsZSBpbnRlcm5lZFNpbXBsZU5hbWVzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMxKTsKLQl2YWx1ZVRhYmxlID0gcmVmZXJlbmNlcy52YWx1ZVRhYmxlOworCXZhbHVlVGFibGUgPSB0aGlzLnJlZmVyZW5jZXMudmFsdWVUYWJsZTsKIAlmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCWlmICh2YWx1ZVRhYmxlW2ldICE9IG51bGwpIHsKIAkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOworCQkJY2hhcltdW10gck5hbWVzID0gY29sbGVjdGlvbi5yb290UmVmZXJlbmNlczsKKwkJCWZvciAoaW50IGogPSAwLCBtID0gck5hbWVzLmxlbmd0aDsgaiA8IG07IGorKykgeworCQkJCWNoYXJbXSByTmFtZSA9IHJOYW1lc1tqXTsKKwkJCQlpZiAoIWludGVybmVkUm9vdE5hbWVzLmNvbnRhaW5zS2V5KHJOYW1lKSkgLy8gcmVtZW1iZXIgdGhlIG5hbWVzIGhhdmUgYmVlbiBpbnRlcm5lZAorCQkJCQlpbnRlcm5lZFJvb3ROYW1lcy5wdXQock5hbWUsIG5ldyBJbnRlZ2VyKGludGVybmVkUm9vdE5hbWVzLmVsZW1lbnRTaXplKSk7CisJCQl9CiAJCQljaGFyW11bXVtdIHFOYW1lcyA9IGNvbGxlY3Rpb24ucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXM7CiAJCQlmb3IgKGludCBqID0gMCwgbSA9IHFOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCQljaGFyW11bXSBxTmFtZSA9IHFOYW1lc1tqXTsKQEAgLTUzOSw5ICs1NjIsMjAgQEAKIAkJCX0KIAkJfQogCX0KLQljaGFyW11bXSBpbnRlcm5lZEFycmF5ID0gbmV3IGNoYXJbaW50ZXJuZWRTaW1wbGVOYW1lcy5lbGVtZW50U2l6ZV1bXTsKKwljaGFyW11bXSBpbnRlcm5lZEFycmF5ID0gbmV3IGNoYXJbaW50ZXJuZWRSb290TmFtZXMuZWxlbWVudFNpemVdW107CisJT2JqZWN0W10gcm9vdE5hbWVzID0gaW50ZXJuZWRSb290TmFtZXMua2V5VGFibGU7CisJT2JqZWN0W10gcG9zaXRpb25zID0gaW50ZXJuZWRSb290TmFtZXMudmFsdWVUYWJsZTsKKwlmb3IgKGludCBpID0gcG9zaXRpb25zLmxlbmd0aDsgLS1pID49IDA7ICkgeworCQlpZiAocG9zaXRpb25zW2ldICE9IG51bGwpIHsKKwkJCWludCBpbmRleCA9ICgoSW50ZWdlcikgcG9zaXRpb25zW2ldKS5pbnRWYWx1ZSgpOworCQkJaW50ZXJuZWRBcnJheVtpbmRleF0gPSAoY2hhcltdKSByb290TmFtZXNbaV07CisJCX0KKwl9CisJd3JpdGVOYW1lcyhpbnRlcm5lZEFycmF5LCBvdXQpOworCS8vIG5vdyB3cml0ZSB0aGUgaW50ZXJuZWQgc2ltcGxlIG5hbWVzCisJaW50ZXJuZWRBcnJheSA9IG5ldyBjaGFyW2ludGVybmVkU2ltcGxlTmFtZXMuZWxlbWVudFNpemVdW107CiAJT2JqZWN0W10gc2ltcGxlTmFtZXMgPSBpbnRlcm5lZFNpbXBsZU5hbWVzLmtleVRhYmxlOwotCU9iamVjdFtdIHBvc2l0aW9ucyA9IGludGVybmVkU2ltcGxlTmFtZXMudmFsdWVUYWJsZTsKKwlwb3NpdGlvbnMgPSBpbnRlcm5lZFNpbXBsZU5hbWVzLnZhbHVlVGFibGU7CiAJZm9yIChpbnQgaSA9IHBvc2l0aW9ucy5sZW5ndGg7IC0taSA+PSAwOyApIHsKIAkJaWYgKHBvc2l0aW9uc1tpXSAhPSBudWxsKSB7CiAJCQlpbnQgaW5kZXggPSAoKEludGVnZXIpIHBvc2l0aW9uc1tpXSkuaW50VmFsdWUoKTsKQEAgLTU3NSw5ICs2MDksOSBAQAogICogaW50CQlpbnRlcm5lZCBsb2NhdG9yIGlkCiAgKiBSZWZlcmVuY2VDb2xsZWN0aW9uCiAqLwotCW91dC53cml0ZUludChsZW5ndGggPSByZWZlcmVuY2VzLmVsZW1lbnRTaXplKTsKKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gdGhpcy5yZWZlcmVuY2VzLmVsZW1lbnRTaXplKTsKIAlpZiAobGVuZ3RoID4gMCkgewotCQlrZXlUYWJsZSA9IHJlZmVyZW5jZXMua2V5VGFibGU7CisJCWtleVRhYmxlID0gdGhpcy5yZWZlcmVuY2VzLmtleVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKIAkJCQlsZW5ndGgtLTsKQEAgLTYwNSw2ICs2MzksMTMgQEAKIAkJCQkJaW5kZXggPSAoSW50ZWdlcikgaW50ZXJuZWRTaW1wbGVOYW1lcy5nZXQoc05hbWVzW2pdKTsKIAkJCQkJb3V0LndyaXRlSW50KGluZGV4LmludFZhbHVlKCkpOwogCQkJCX0KKwkJCQljaGFyW11bXSByTmFtZXMgPSBjb2xsZWN0aW9uLnJvb3RSZWZlcmVuY2VzOworCQkJCWludCByTGVuZ3RoID0gck5hbWVzLmxlbmd0aDsKKwkJCQlvdXQud3JpdGVJbnQockxlbmd0aCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByTGVuZ3RoOyBqKyspIHsKKwkJCQkJaW5kZXggPSAoSW50ZWdlcikgaW50ZXJuZWRSb290TmFtZXMuZ2V0KHJOYW1lc1tqXSk7CisJCQkJCW91dC53cml0ZUludChpbmRleC5pbnRWYWx1ZSgpKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHICYmIGxlbmd0aCAhPSAwKQpAQCAtNjM5LDggKzY4MCw4IEBACiAJCQkJd3JpdGVOYW1lKGFjY2Vzc1J1bGUucGF0dGVybiwgb3V0KTsKIAkJCQlvdXQud3JpdGVJbnQoYWNjZXNzUnVsZS5wcm9ibGVtSWQpOwogCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBBY2Nlc3NSdWxlU2V0Lk1FU1NBR0VfVEVNUExBVEVTX0xFTkdUSDsgaSsrKQotCQkJCW91dC53cml0ZVVURihhY2Nlc3NSdWxlU2V0Lm1lc3NhZ2VUZW1wbGF0ZXNbaV0pOworCQkJb3V0LndyaXRlQnl0ZShhY2Nlc3NSdWxlU2V0LmNsYXNzcGF0aEVudHJ5VHlwZSk7CisJCQlvdXQud3JpdGVVVEYoYWNjZXNzUnVsZVNldC5jbGFzc3BhdGhFbnRyeU5hbWUpOwogCQl9CiAJfQogfQpAQCAtNjQ5LDkgKzY5MCw5IEBACiAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlci4KICAqLwogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlN0YXRlIGZvciAiICsgamF2YVByb2plY3ROYW1lIC8vJE5PTi1OTFMtMSQKLQkJKyAiICgjIiArIGJ1aWxkTnVtYmVyIC8vJE5PTi1OTFMtMSQKLQkJCSsgIiBAICIgKyBuZXcgRGF0ZShsYXN0U3RydWN0dXJhbEJ1aWxkVGltZSkgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiU3RhdGUgZm9yICIgKyB0aGlzLmphdmFQcm9qZWN0TmFtZSAvLyROT04tTkxTLTEkCisJCSsgIiAoIyIgKyB0aGlzLmJ1aWxkTnVtYmVyIC8vJE5PTi1OTFMtMSQKKwkJCSsgIiBAICIgKyBuZXcgRGF0ZSh0aGlzLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lKSAvLyROT04tTkxTLTEkCiAJCQkJKyAiKSI7IC8vJE5PTi1OTFMtMSQKIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdHJpbmdTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU3RyaW5nU2V0LmphdmEKaW5kZXggMGI3MDQ1Mi4uZGVhMjJjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdHJpbmdTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1N0cmluZ1NldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM3LDcgKzM3LDcgQEAKIAl0aGlzLnZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgcmVoYXNoKCk7CisJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKSByZWhhc2goKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDgsNyArNDgsNyBAQAogfQogCiBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhTdHJpbmcgdmFsdWUpIHsKLQlpbnQgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoOwogCWludCBpbmRleCA9ICh2YWx1ZS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CiAJU3RyaW5nIGN1cnJlbnQ7CiAJd2hpbGUgKChjdXJyZW50ID0gdGhpcy52YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CkBAIC01OSw3ICs1OSw3IEBACiB9CiAKIHByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JU3RyaW5nU2V0IG5ld1NldCA9IG5ldyBTdHJpbmdTZXQoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlTdHJpbmdTZXQgbmV3U2V0ID0gbmV3IFN0cmluZ1NldCh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJU3RyaW5nIGN1cnJlbnQ7CiAJZm9yIChpbnQgaSA9IHRoaXMudmFsdWVzLmxlbmd0aDsgLS1pID49IDA7KQogCQlpZiAoKGN1cnJlbnQgPSB0aGlzLnZhbHVlc1tpXSkgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvV29ya1F1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1dvcmtRdWV1ZS5qYXZhCmluZGV4IGY3ODk3ZjMuLjczY2ZiNDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvV29ya1F1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Xb3JrUXVldWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMyw3ICsyMyw3IEBACiB9CiAKIHB1YmxpYyB2b2lkIGFkZChTb3VyY2VGaWxlIGVsZW1lbnQpIHsKLQluZWVkc0NvbXBpbGVMaXN0LmFkZChlbGVtZW50KTsKKwl0aGlzLm5lZWRzQ29tcGlsZUxpc3QuYWRkKGVsZW1lbnQpOwogfQogCiBwdWJsaWMgdm9pZCBhZGRBbGwoU291cmNlRmlsZVtdIGVsZW1lbnRzKSB7CkBAIC0zNCwyMiArMzQsMjIgQEAKIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCXRoaXMubmVlZHNDb21waWxlTGlzdC5jbGVhcigpOwogCXRoaXMuY29tcGlsZWRMaXN0LmNsZWFyKCk7Ci19CQorfQogCiBwdWJsaWMgdm9pZCBmaW5pc2hlZChTb3VyY2VGaWxlIGVsZW1lbnQpIHsKLQluZWVkc0NvbXBpbGVMaXN0LnJlbW92ZShlbGVtZW50KTsKLQljb21waWxlZExpc3QuYWRkKGVsZW1lbnQpOworCXRoaXMubmVlZHNDb21waWxlTGlzdC5yZW1vdmUoZWxlbWVudCk7CisJdGhpcy5jb21waWxlZExpc3QuYWRkKGVsZW1lbnQpOwogfQogCiBwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGVkKFNvdXJjZUZpbGUgZWxlbWVudCkgewotCXJldHVybiBjb21waWxlZExpc3QuaW5jbHVkZXMoZWxlbWVudCk7CisJcmV0dXJuIHRoaXMuY29tcGlsZWRMaXN0LmluY2x1ZGVzKGVsZW1lbnQpOwogfQogCiBwdWJsaWMgYm9vbGVhbiBpc1dhaXRpbmcoU291cmNlRmlsZSBlbGVtZW50KSB7Ci0JcmV0dXJuIG5lZWRzQ29tcGlsZUxpc3QuaW5jbHVkZXMoZWxlbWVudCk7CisJcmV0dXJuIHRoaXMubmVlZHNDb21waWxlTGlzdC5pbmNsdWRlcyhlbGVtZW50KTsKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIldvcmtRdWV1ZTogIiArIG5lZWRzQ29tcGlsZUxpc3Q7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gIldvcmtRdWV1ZTogIiArIHRoaXMubmVlZHNDb21waWxlTGlzdDsgLy8kTk9OLU5MUy0xJAogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvRXZhbHVhdGlvbkNvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggZjUzM2E3OS4uNmMzMWM4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0V2YWx1YXRpb25Db250ZXh0V3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDEzICsxNSw2IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JQ29kZVNuaXBwZXRSZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JRXZhbHVhdGlvbkNvbnRleHQ7CkBAIC0zMCwxMiArMjMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CaW5hcnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU2VsZWN0aW9uUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1hcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLk5hbWVFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLlByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25Db250ZXh0OwpAQCAtNDQsNyArMzEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkluc3RhbGxFeGNlcHRpb247CiAKIC8qKgotICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgaW5mcmFzdHJ1Y3R1cmUgZXZhbHVhdGlvbiBjb250ZXh0LiAKKyAqIEEgd3JhcHBlciBhcm91bmQgdGhlIGluZnJhc3RydWN0dXJlIGV2YWx1YXRpb24gY29udGV4dC4KICAqLwogcHVibGljIGNsYXNzIEV2YWx1YXRpb25Db250ZXh0V3JhcHBlciBpbXBsZW1lbnRzIElFdmFsdWF0aW9uQ29udGV4dCB7CiAJcHJvdGVjdGVkIEV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQ7CkBAIC03Myw3ICs2MCw3IEBACiAgKiBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBwcmV2aW91c2x5IGJ1aWx0IHN0YXRlLgogICovCiBwcm90ZWN0ZWQgdm9pZCBjaGVja0J1aWxkZXJTdGF0ZSgpIHsKLQkKKwogCXJldHVybjsKIH0KIC8qKgpAQCAtMTAwLDkgKzg3LDI2IEBACiAJY29kZUNvbXBsZXRlKGNvZGVTbmlwcGV0LCBwb3NpdGlvbiwgcmVxdWVzdG9yLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZKTsKIH0KIC8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dCNjb2RlQ29tcGxldGUoU3RyaW5nLCBpbnQsIENvbXBsZXRpb25SZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShTdHJpbmcgY29kZVNuaXBwZXQsIGludCBwb3NpdGlvbiwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJY29kZUNvbXBsZXRlKGNvZGVTbmlwcGV0LCBwb3NpdGlvbiwgcmVxdWVzdG9yLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZLCBudWxsKTsKK30KKy8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dCNjb2RlQ29tcGxldGUoU3RyaW5nLCBpbnQsIENvbXBsZXRpb25SZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIpCiAgKi8KIHB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShTdHJpbmcgY29kZVNuaXBwZXQsIGludCBwb3NpdGlvbiwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWNvZGVDb21wbGV0ZShjb2RlU25pcHBldCwgcG9zaXRpb24sIHJlcXVlc3Rvciwgb3duZXIsIG51bGwpOworfQorLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUV2YWx1YXRpb25Db250ZXh0I2NvZGVDb21wbGV0ZShTdHJpbmcsIGludCwgQ29tcGxldGlvblJlcXVlc3RvciwgV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKAorCQlTdHJpbmcgY29kZVNuaXBwZXQsCisJCWludCBwb3NpdGlvbiwKKwkJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCisJCVdvcmtpbmdDb3B5T3duZXIgb3duZXIsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gdGhpcy5wcm9qZWN0Lm5ld1NlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQob3duZXIpOwogCXRoaXMuY29udGV4dC5jb21wbGV0ZSgKIAkJY29kZVNuaXBwZXQudG9DaGFyQXJyYXkoKSwKQEAgLTExMCw3ICsxMTQsOSBAQAogCQllbnZpcm9ubWVudCwKIAkJcmVxdWVzdG9yLAogCQl0aGlzLnByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwKLQkJdGhpcy5wcm9qZWN0CisJCXRoaXMucHJvamVjdCwKKwkJb3duZXIsCisJCW1vbml0b3IKIAkpOwogfQogLyoqCkBAIC0xMzEsNyArMTM3LDggQEAKIAkJb2Zmc2V0ICsgbGVuZ3RoIC0gMSwKIAkJZW52aXJvbm1lbnQsCiAJCXJlcXVlc3RvciwKLQkJdGhpcy5wcm9qZWN0LmdldE9wdGlvbnModHJ1ZSkKKwkJdGhpcy5wcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCisJCW93bmVyCiAJKTsKIAlyZXR1cm4gcmVxdWVzdG9yLmdldEVsZW1lbnRzKCk7CiB9CkBAIC0xNTAsMTggKzE1NywxOCBAQAogICogQHNlZSBJRXZhbHVhdGlvbkNvbnRleHQjZXZhbHVhdGVDb2RlU25pcHBldChTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmdbXSwgaW50W10sIElUeXBlLCBib29sZWFuLCBib29sZWFuLCBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCiAgKi8KIHB1YmxpYyB2b2lkIGV2YWx1YXRlQ29kZVNuaXBwZXQoCi0JU3RyaW5nIGNvZGVTbmlwcGV0LCAKLQlTdHJpbmdbXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCAKLQlTdHJpbmdbXSBsb2NhbFZhcmlhYmxlTmFtZXMsIAotCWludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIAotCUlUeXBlIGRlY2xhcmluZ1R5cGUsIAotCWJvb2xlYW4gaXNTdGF0aWMsIAotCWJvb2xlYW4gaXNDb25zdHJ1Y3RvckNhbGwsIAotCUlDb2RlU25pcHBldFJlcXVlc3RvciByZXF1ZXN0b3IsIAorCVN0cmluZyBjb2RlU25pcHBldCwKKwlTdHJpbmdbXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCVN0cmluZ1tdIGxvY2FsVmFyaWFibGVOYW1lcywKKwlpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAorCUlUeXBlIGRlY2xhcmluZ1R5cGUsCisJYm9vbGVhbiBpc1N0YXRpYywKKwlib29sZWFuIGlzQ29uc3RydWN0b3JDYWxsLAorCUlDb2RlU25pcHBldFJlcXVlc3RvciByZXF1ZXN0b3IsCiAJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCWNoZWNrQnVpbGRlclN0YXRlKCk7Ci0JCisKIAlpbnQgbGVuZ3RoID0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcy5sZW5ndGg7CiAJY2hhcltdW10gdmFyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspewpAQCAtMTc3LDcgKzE4NCw3IEBACiAJTWFwIG9wdGlvbnMgPSB0aGlzLnByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKIAkvLyB0cmFuc2ZlciB0aGUgaW1wb3J0cyBvZiB0aGUgSVR5cGUgdG8gdGhlIGV2YWx1YXRpb24gY29udGV4dAogCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJLy8gcmV0cmlldmVzIHRoZSBwYWNrYWdlIHN0YXRlbWVudCAKKwkJLy8gcmV0cmlldmVzIHRoZSBwYWNrYWdlIHN0YXRlbWVudAogCQl0aGlzLmNvbnRleHQuc2V0UGFja2FnZU5hbWUoZGVjbGFyaW5nVHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpOwogCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCWlmIChjb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewpAQCAtMjE2LDkgKzIyMyw5IEBACiAJCQlkZWNsYXJpbmdUeXBlID09IG51bGw/IG51bGwgOiBkZWNsYXJpbmdUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCksCiAJCQlpc1N0YXRpYywKIAkJCWlzQ29uc3RydWN0b3JDYWxsLAotCQkJZW52aXJvbm1lbnQgPSBnZXRCdWlsZE5hbWVFbnZpcm9ubWVudCgpLCAKLQkJCW9wdGlvbnMsIAotCQkJZ2V0SW5mcmFzdHJ1Y3R1cmVFdmFsdWF0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIAorCQkJZW52aXJvbm1lbnQgPSBnZXRCdWlsZE5hbWVFbnZpcm9ubWVudCgpLAorCQkJb3B0aW9ucywKKwkJCWdldEluZnJhc3RydWN0dXJlRXZhbHVhdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLAogCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7CiAJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7CiAJCWhhbmRsZUluc3RhbGxFeGNlcHRpb24oZSk7CkBAIC0yMzUsMTAgKzI0MiwxMCBAQAogCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBudWxsOwogCXRyeSB7CiAJCXRoaXMuY29udGV4dC5ldmFsdWF0ZSgKLQkJCWNvZGVTbmlwcGV0LnRvQ2hhckFycmF5KCksIAotCQkJZW52aXJvbm1lbnQgPSBnZXRCdWlsZE5hbWVFbnZpcm9ubWVudCgpLCAKLQkJCXRoaXMucHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCAKLQkJCWdldEluZnJhc3RydWN0dXJlRXZhbHVhdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLCAKKwkJCWNvZGVTbmlwcGV0LnRvQ2hhckFycmF5KCksCisJCQllbnZpcm9ubWVudCA9IGdldEJ1aWxkTmFtZUVudmlyb25tZW50KCksCisJCQl0aGlzLnByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwKKwkJCWdldEluZnJhc3RydWN0dXJlRXZhbHVhdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLAogCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7CiAJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7CiAJCWhhbmRsZUluc3RhbGxFeGNlcHRpb24oZSk7CkBAIC0yNTUsMTAgKzI2MiwxMCBAQAogCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBudWxsOwogCXRyeSB7CiAJCXRoaXMuY29udGV4dC5ldmFsdWF0ZVZhcmlhYmxlKAotCQkJKChHbG9iYWxWYXJpYWJsZVdyYXBwZXIpdmFyaWFibGUpLnZhcmlhYmxlLCAKLQkJCWVudmlyb25tZW50ID0gZ2V0QnVpbGROYW1lRW52aXJvbm1lbnQoKSwgCi0JCQl0aGlzLnByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgCi0JCQlnZXRJbmZyYXN0cnVjdHVyZUV2YWx1YXRpb25SZXF1ZXN0b3IocmVxdWVzdG9yKSwgCisJCQkoKEdsb2JhbFZhcmlhYmxlV3JhcHBlcil2YXJpYWJsZSkudmFyaWFibGUsCisJCQllbnZpcm9ubWVudCA9IGdldEJ1aWxkTmFtZUVudmlyb25tZW50KCksCisJCQl0aGlzLnByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwKKwkJCWdldEluZnJhc3RydWN0dXJlRXZhbHVhdGlvblJlcXVlc3RvcihyZXF1ZXN0b3IpLAogCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7CiAJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7CiAJCWhhbmRsZUluc3RhbGxFeGNlcHRpb24oZSk7CkBAIC0zMjgsMTAgKzMzNSwxMCBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dCNuZXdWYXJpYWJsZShTdHJpbmcsIFN0cmluZywgU3RyaW5nKQogICovCiBwdWJsaWMgSUdsb2JhbFZhcmlhYmxlIG5ld1ZhcmlhYmxlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBpbml0aWFsaXplcikgewotCUdsb2JhbFZhcmlhYmxlIG5ld1ZhciA9IAorCUdsb2JhbFZhcmlhYmxlIG5ld1ZhciA9CiAJCXRoaXMuY29udGV4dC5uZXdWYXJpYWJsZSgKLQkJCXR5cGVOYW1lLnRvQ2hhckFycmF5KCksIAotCQkJbmFtZS50b0NoYXJBcnJheSgpLCAKKwkJCXR5cGVOYW1lLnRvQ2hhckFycmF5KCksCisJCQluYW1lLnRvQ2hhckFycmF5KCksCiAJCQkoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgPwogCQkJCW51bGwgOgogCQkJCWluaXRpYWxpemVyLnRvQ2hhckFycmF5KCkpOwpAQCAtMzU4LDEzICszNjUsMTMgQEAKICAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I3ZhbGlkYXRlSW1wb3J0cyhJQ29kZVNuaXBwZXRSZXF1ZXN0b3IpCiAgKi8KIHB1YmxpYyB2b2lkIHZhbGlkYXRlSW1wb3J0cyhJQ29kZVNuaXBwZXRSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCisKIAljaGVja0J1aWxkZXJTdGF0ZSgpOwogCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBudWxsOwogCXRyeSB7CiAJCXRoaXMuY29udGV4dC5ldmFsdWF0ZUltcG9ydHMoCi0JCQllbnZpcm9ubWVudCA9IGdldEJ1aWxkTmFtZUVudmlyb25tZW50KCksIAotCQkJZ2V0SW5mcmFzdHJ1Y3R1cmVFdmFsdWF0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIAorCQkJZW52aXJvbm1lbnQgPSBnZXRCdWlsZE5hbWVFbnZpcm9ubWVudCgpLAorCQkJZ2V0SW5mcmFzdHJ1Y3R1cmVFdmFsdWF0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksCiAJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKIAl9IGZpbmFsbHkgewogCQlpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgZW52aXJvbm1lbnQuY2xlYW51cCgpOwpAQCAtMzkzLDcgKzQwMCw3IEBACiAJCQlwdWJsaWMgdm9pZCBhY2NlcHRFcnJvcihJUHJvYmxlbSBlcnJvcikgewogCQkJCS8vIHdhcyBkaXNhYmxlZCBpbiAxLjAKIAkJCX0KLQkJCQorCiAJCQlwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbmFtZSwgdHlwZVBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvR2xvYmFsVmFyaWFibGVXcmFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0dsb2JhbFZhcmlhYmxlV3JhcHBlci5qYXZhCmluZGV4IDkzOWQwNzguLmE5MjRiMjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvR2xvYmFsVmFyaWFibGVXcmFwcGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9HbG9iYWxWYXJpYWJsZVdyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuR2xvYmFsVmFyaWFibGU7CiAKIC8qKgotICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgaW5mcmFzdHJ1Y3R1cmUgZ2xvYmFsIHZhcmlhYmxlLiAgCisgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBpbmZyYXN0cnVjdHVyZSBnbG9iYWwgdmFyaWFibGUuCiAgKi8KIGNsYXNzIEdsb2JhbFZhcmlhYmxlV3JhcHBlciBpbXBsZW1lbnRzIElHbG9iYWxWYXJpYWJsZSB7CiAJR2xvYmFsVmFyaWFibGUgdmFyaWFibGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL1JlcXVlc3RvcldyYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhCmluZGV4IDc3ZjI2ZDQuLjllZGEwMjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDExICsxOSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5KYXZhQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JUmVxdWVzdG9yOwotIAorCiBwdWJsaWMgY2xhc3MgUmVxdWVzdG9yV3JhcHBlciBpbXBsZW1lbnRzIElSZXF1ZXN0b3IgewotCQorCiAJSUNvZGVTbmlwcGV0UmVxdWVzdG9yIHJlcXVlc3RvcjsKLQkKKwogcHVibGljIFJlcXVlc3RvcldyYXBwZXIoSUNvZGVTbmlwcGV0UmVxdWVzdG9yIHJlcXVlc3RvcikgewogCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0NoYW5nZUNvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0NoYW5nZUNvbGxlY3Rvci5qYXZhCmluZGV4IDIwNzg2YzAuLjZiYzA5OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9DaGFuZ2VDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvQ2hhbmdlQ29sbGVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsMTggKzI2LDE4IEBACiAgKiBDb2xsZWN0cyBjaGFuZ2VzIChyZXBvcnRlZCB0aHJvdWdoIGZpbmUtZ3JhaW5lZCBkZWx0YXMpIHRoYXQgY2FuIGFmZmVjdCBhIHR5cGUgaGllcmFyY2h5LgogICovCiBwdWJsaWMgY2xhc3MgQ2hhbmdlQ29sbGVjdG9yIHsKLQkKKwogCS8qCiAJICogQSB0YWJsZSBmcm9tIElUeXBlcyB0byBUeXBlRGVsdGFzCiAJICovCiAJSGFzaE1hcCBjaGFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkKKwogCVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5OwotCQorCiAJcHVibGljIENoYW5nZUNvbGxlY3RvcihUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSkgewogCQl0aGlzLmhpZXJhcmNoeSA9IGhpZXJhcmNoeTsKIAl9Ci0JCisKIAkvKgogCSAqIEFkZHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBkZWx0YSB0byB0aGUgbGlzdCBvZiBjaGFuZ2VzLgogCSAqLwpAQCAtNjQsNyArNjQsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyoKIAkgKiBBZGRzIHRoZSBnaXZlbiBkZWx0YSBvbiBhIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIGxpc3Qgb2YgY2hhbmdlcy4KIAkgKi8KQEAgLTkyLDcgKzkyLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBhZGRDaGFuZ2UoSUltcG9ydENvbnRhaW5lciBpbXBvcnRDb250YWluZXIsIElKYXZhRWxlbWVudERlbHRhIG5ld0RlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaW50IG5ld0tpbmQgPSBuZXdEZWx0YS5nZXRLaW5kKCk7CiAJCWlmIChuZXdLaW5kID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQpIHsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQkJdGhpcy5jaGFuZ2VzLnB1dChpbXBvcnREZWNsLCBkZWx0YSk7CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIEFkZHMgYSBjaGFuZ2UgZm9yIHRoZSBnaXZlbiBtZW1iZXIgKGEgbWV0aG9kLCBhIGZpZWxkIG9yIGFuIGluaXRpYWxpemVyKSBhbmQgdGhlIHR5cGVzIGl0IGRlZmluZXMuCiAJICovCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQkKKwogCS8qCiAJICogQWRkcyBhIGNoYW5nZSBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIHRoZSB0eXBlcyBpdCBkZWZpbmVzLgogCSAqLwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCQkJCWlmIChoYXNTdXBlclR5cGVDaGFuZ2UodHlwZSkpIHsKIAkJCQkJCWV4aXN0aW5nRGVsdGEuc3VwZXJUeXBlcygpOwogCQkJCQkJaGFzQ2hhbmdlID0gdHJ1ZTsKLQkJCQkJfSAKKwkJCQkJfQogCQkJCQlpZiAoaGFzVmlzaWJpbGl0eUNoYW5nZSh0eXBlKSkgewogCQkJCQkJZXhpc3RpbmdEZWx0YS5tb2RpZmllcnMoKTsKIAkJCQkJCWhhc0NoYW5nZSA9IHRydWU7CkBAIC0yNDcsOCArMjQ3LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHR5cGUgYWRkaXRpb24gYWZmZWN0cyB0aGUgaGllcmFyY2h5CiAJCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZiAodGhpcy5oaWVyYXJjaHkuaGFzU3VwZXJ0eXBlKHR5cGVOYW1lKSAKLQkJCQkJfHwgdGhpcy5oaWVyYXJjaHkuc3VidHlwZXNJbmNsdWRlU3VwZXJ0eXBlT2YodHlwZSkgCisJCQlpZiAodGhpcy5oaWVyYXJjaHkuaGFzU3VwZXJ0eXBlKHR5cGVOYW1lKQorCQkJCQl8fCB0aGlzLmhpZXJhcmNoeS5zdWJ0eXBlc0luY2x1ZGVTdXBlcnR5cGVPZih0eXBlKQogCQkJCQl8fCB0aGlzLmhpZXJhcmNoeS5taXNzaW5nVHlwZXMuY29udGFpbnModHlwZU5hbWUpKSB7CiAJCQkJU2ltcGxlRGVsdGEgZGVsdGEgPSBuZXcgU2ltcGxlRGVsdGEoKTsKIAkJCQlkZWx0YS5hZGRlZCgpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgYWRkVHlwZUNoYW5nZShJVHlwZSB0eXBlLCBpbnQgbmV3RmxhZ3MsIFNpbXBsZURlbHRhIGV4aXN0aW5nRGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlpZiAoZXhpc3RpbmdEZWx0YSAhPSBudWxsKSB7CiAJCQlzd2l0Y2ggKGV4aXN0aW5nRGVsdGEuZ2V0S2luZCgpKSB7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAkJCQkJCQkmJiBoYXNTdXBlclR5cGVDaGFuZ2UodHlwZSkpIHsKIAkJCQkJCWV4aXN0aW5nRGVsdGEuc3VwZXJUeXBlcygpOwogCQkJCQkJaGFzQ2hhbmdlID0gdHJ1ZTsKLQkJCQkJfSAKKwkJCQkJfQogCQkJCQlpZiAoKGV4aXN0aW5nRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PRElGSUVSUykgIT0gMAogCQkJCQkJCSYmIGhhc1Zpc2liaWxpdHlDaGFuZ2UodHlwZSkpIHsKIAkJCQkJCWV4aXN0aW5nRGVsdGEubW9kaWZpZXJzKCk7CkBAIC0yODUsNyArMjg1LDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHR5cGUgY2hhbmdlIGFmZmVjdHMgdGhlIGhpZXJhcmNoeQogCQkJU2ltcGxlRGVsdGEgdHlwZURlbHRhID0gbnVsbDsKLQkJCWlmICgobmV3RmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NVUEVSX1RZUEVTKSAhPSAwIAorCQkJaWYgKChuZXdGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfU1VQRVJfVFlQRVMpICE9IDAKIAkJCQkJJiYgdGhpcy5oaWVyYXJjaHkuaW5jbHVkZXNUeXBlT3JTdXBlcnR5cGUodHlwZSkpIHsKIAkJCQl0eXBlRGVsdGEgPSBuZXcgU2ltcGxlRGVsdGEoKTsKIAkJCQl0eXBlRGVsdGEuc3VwZXJUeXBlcygpOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgYWxsIHR5cGVzIGRlZmluZWQgaW4gdGhlIGdpdmVuIGVsZW1lbnQgZXhjbHVkaW5nIHRoZSBnaXZlbiBlbGVtZW50LgogCSAqLwpAQCAtMzYwLDcgKzM2MCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgYWxsIHR5cGVzIGluIHRoZSBleGlzdGluZyBoaWVyYXJjaHkgdGhhdCBoYXZlIHRoZSBnaXZlbiBlbGVtZW50IGFzIGEgcGFyZW50LgogCSAqLwpAQCAtMzg4LDcgKzM4OCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gaGFzU3VwZXJUeXBlQ2hhbmdlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkvLyBjaGVjayBzdXBlciBjbGFzcwogCQlJVHlwZSBzdXBlcmNsYXNzID0gdGhpcy5oaWVyYXJjaHkuZ2V0U3VwZXJjbGFzcyh0eXBlKTsKQEAgLTM5Nyw3ICszOTcsNyBAQAogCQlpZiAoZXhpc3RpbmdTdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmICFleGlzdGluZ1N1cGVyY2xhc3NOYW1lLmVxdWFscyhuZXdTdXBlcmNsYXNzTmFtZSkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQorCiAJCS8vIGNoZWNrIHN1cGVyIGludGVyZmFjZXMKIAkJSVR5cGVbXSBleGlzdGluZ1N1cGVySW50ZXJmYWNlcyA9IHRoaXMuaGllcmFyY2h5LmdldFN1cGVySW50ZXJmYWNlcyh0eXBlKTsKIAkJU3RyaW5nW10gbmV3U3VwZXJJbnRlcmZhY2VzID0gdHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCk7CkBAIC00MTAsMTAgKzQxMCwxMCBAQAogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9Ci0JCQorCiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gaGFzVmlzaWJpbGl0eUNoYW5nZShJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaW50IGV4aXN0aW5nRmxhZ3MgPSB0aGlzLmhpZXJhcmNoeS5nZXRDYWNoZWRGbGFncyh0eXBlKTsKIAkJaW50IG5ld0ZsYWdzID0gdHlwZS5nZXRGbGFncygpOwpAQCAtNDI0LDkgKzQyNCw5IEBACiAJICogV2hldGhlciB0aGUgaGllcmFyY2h5IG5lZWRzIHJlZnJlc2ggYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2VzIGNvbGxlY3RlZCBzbyBmYXIuCiAJICovCiAJcHVibGljIGJvb2xlYW4gbmVlZHNSZWZyZXNoKCkgewotCQlyZXR1cm4gY2hhbmdlcy5zaXplKCkgIT0gMDsKKwkJcmV0dXJuIHRoaXMuY2hhbmdlcy5zaXplKCkgIT0gMDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuY2hhbmdlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QmluYXJ5VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJpbmFyeVR5cGUuamF2YQppbmRleCA3YjYxZTA2Li5iOTBmYTI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QmluYXJ5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzAsNyArMzAsNyBAQAogCXByaXZhdGUgY2hhcltdW10gc3VwZXJJbnRlcmZhY2VzID0gTm9JbnRlcmZhY2U7CiAJcHJpdmF0ZSBjaGFyW11bXSB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlczsKIAlwcml2YXRlIGNoYXJbXSBnZW5lcmljU2lnbmF0dXJlOwotCQorCiBwdWJsaWMgSGllcmFyY2h5QmluYXJ5VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcXVhbGlmaWNhdGlvbiwgY2hhcltdIHNvdXJjZU5hbWUsIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSwgY2hhcltdW10gdHlwZVBhcmFtZXRlclNpZ25hdHVyZXMsIGNoYXIgdHlwZVN1ZmZpeCl7CiAKIAl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKQEAgLTQ2LDYgKzQ2LDE1IEBACiAJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMubmFtZSwgJy4nLCAnLycpOwogfQogLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGUKKyAqLworcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgY2hhcltdIGdldEVuY2xvc2luZ01ldGhvZCgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgogICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgdHlwZSBpbiB0aGUKICAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMKICAqIG9yIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdG9wIGxldmVsIHR5cGUuCkBAIC03OSw3ICs4OCw3IEBACiAJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKCJqYXZhLmxhbmcuT2JqZWN0IiwgdHJ1ZS8qcmVzb2x2ZWQqLykpOyAvLyROT04tTkxTLTEkCiAJCWVsc2UKIAkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodGhpcy5zdXBlcmNsYXNzLCB0cnVlLypyZXNvbHZlZCovKSk7Ci0JCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSAKKwkJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpCiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCiAJCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0aGlzLnN1cGVySW50ZXJmYWNlc1tpXSwgdHJ1ZS8qcmVzb2x2ZWQqLykpOwogCQl0aGlzLmdlbmVyaWNTaWduYXR1cmUgPSBidWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwpAQCAtMTEyLDYgKzEyMSwxNCBAQAogcHVibGljIElCaW5hcnlNZXRob2RbXSBnZXRNZXRob2RzKCkgewogCXJldHVybiBudWxsOwogfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZSNnZXRNaXNzaW5nVHlwZU5hbWVzKCkKKyAqLworcHVibGljIGNoYXJbXVtdW10gZ2V0TWlzc2luZ1R5cGVOYW1lcygpIHsKKwlyZXR1cm4gbnVsbDsKK30KKwogLyoqCiAgKiBBbnN3ZXIgYW4gaW50IHdob3NlIGJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdGhlIGFjY2VzcyBjb25zdGFudHMKICAqIGRlZmluZWQgYnkgdGhlIFZNIHNwZWMuCkBAIC0xMTksNiArMTM2LDcgQEAKIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogCXJldHVybiB0aGlzLm1vZGlmaWVyczsKIH0KKwogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHR5cGUgaW4gdGhlCiAgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjLgpAQCAtMTMyLDcgKzE1MCw2IEBACiBwdWJsaWMgY2hhcltdIGdldFNvdXJjZU5hbWUoKSB7CiAJcmV0dXJuIHRoaXMuc291cmNlTmFtZTsKIH0KLQogLyoqCiAgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3Mgc3VwZXJjbGFzcyBpbiB0aGUKICAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMKQEAgLTE0MywxMCArMTYwLDE0IEBACiBwdWJsaWMgY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCkgewogCXJldHVybiB0aGlzLnN1cGVyY2xhc3M7CiB9CisKKy8vIFRPRE8gKGplcm9tZSkgcGxlYXNlIHZlcmlmeSB0aGF0IHdlIGRvbid0IG5lZWQgdGhlIHRhZ2JpdHMgZm9yIHRoZSByZWNlaXZlcgorcHVibGljIGxvbmcgZ2V0VGFnQml0cygpIHsKKwlyZXR1cm4gMDsKK30KIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgewogCXJldHVybiBmYWxzZTsgLy8gaW5kZXggZGlkIG5vdCByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiAoc2luY2UgdW51c2VkIGZvciBoaWVyYXJjaGllcykKIH0KLQogLyoqCiAgKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgY29udGFpbnMgdGhlIHJlc29sdmVkIGJpbmFyeSBmb3JtCiAgKiBvciB0aGUgdW5yZXNvbHZlZCBzb3VyY2UgZm9ybSBvZiB0aGUgdHlwZS4KQEAgLTE1NCw2ICsxNzUsNyBAQAogcHVibGljIGJvb2xlYW4gaXNCaW5hcnlUeXBlKCkgewogCXJldHVybiB0cnVlOwogfQorCiBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewogCXJldHVybiBmYWxzZTsgIC8vIGluZGV4IGRpZCBub3QgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gKHNpbmNlIHVudXNlZCBmb3IgaGllcmFyY2hpZXMpCiB9CkBAIC0xNzIsMTcgKzE5NCwxNyBAQAogCQkJc3VwZXJRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzdXBlclF1YWxpZmljYXRpb24sIDAsIGxlbmd0aCAtIGVuY2xvc2luZ1N1cGVyTmFtZS5sZW5ndGggLSAxKTsKIAkJfQogCX0KLQkKKwogCWlmIChzdXBlckNsYXNzT3JJbnRlcmZhY2UgPT0gSUluZGV4Q29uc3RhbnRzLkNMQVNTX1NVRkZJWCl7CiAJCS8vIGludGVyZmFjZXMgYXJlIGluZGV4ZWQgYXMgaGF2aW5nIHN1cGVyY2xhc3MgcmVmZXJlbmNlcyB0byBPYmplY3QgYnkgZGVmYXVsdCwKIAkJLy8gdGhpcyBpcyBhbiBhcnRpZmFjdCB1c2VkIGZvciBiZWluZyBhYmxlIHRvIHF1ZXJ5IHRoZW0gb25seS4KLQkJaWYgKFR5cGVEZWNsYXJhdGlvbi5raW5kKHRoaXMubW9kaWZpZXJzKSA9PSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wpIHJldHVybjsgCisJCWlmIChUeXBlRGVjbGFyYXRpb24ua2luZCh0aGlzLm1vZGlmaWVycykgPT0gVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMKSByZXR1cm47CiAJCWNoYXJbXSBlbmNvZGVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJUeXBlTmFtZSwgJy8nKTsKLQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKGVuY29kZWROYW1lLCAnLicsICcvJyk7IAorCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZW5jb2RlZE5hbWUsICcuJywgJy8nKTsKIAkJdGhpcy5zdXBlcmNsYXNzID0gZW5jb2RlZE5hbWU7CiAJfSBlbHNlIHsKIAkJY2hhcltdIGVuY29kZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc3VwZXJRdWFsaWZpY2F0aW9uLCBzdXBlclR5cGVOYW1lLCAnLycpOwotCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZW5jb2RlZE5hbWUsICcuJywgJy8nKTsgCisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShlbmNvZGVkTmFtZSwgJy4nLCAnLycpOwogCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgPT0gTm9JbnRlcmZhY2UpewogCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgY2hhcltdW10geyBlbmNvZGVkTmFtZSB9OwogCQl9IGVsc2UgewpAQCAtMTkyLDYgKzIxNCwxMyBAQAogCQl9CiAJfQogfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZQorICovCitwdWJsaWMgY2hhcltdIHNvdXJjZUZpbGVOYW1lKCkgeworCXJldHVybiBudWxsOworfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCWlmICh0aGlzLm1vZGlmaWVycyA9PSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljKSB7CkBAIC0yMDAsMTMgKzIyOSwxMyBAQAogCXN3aXRjaCAoVHlwZURlY2xhcmF0aW9uLmtpbmQodGhpcy5tb2RpZmllcnMpKSB7CiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0wgOgogCQkJYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJyZWFrOwkJCisJCQlicmVhazsKIAkJY2FzZSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wgOgogCQkJYnVmZmVyLmFwcGVuZCgiaW50ZXJmYWNlICIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsJCQorCQkJYnJlYWs7CiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTCA6CiAJCQlidWZmZXIuYXBwZW5kKCJlbnVtICIpOyAvLyROT04tTkxTLTEkCi0JCQlicmVhazsJCQorCQkJYnJlYWs7CiAJfQogCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgewogCQlidWZmZXIuYXBwZW5kKHRoaXMubmFtZSk7CkBAIC0yMjcsMjIgKzI1Niw0IEBACiAJfQogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIH0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGUKLSAqLwotcHVibGljIElCaW5hcnlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlCi0gKi8KLXB1YmxpYyBjaGFyW10gc291cmNlRmlsZU5hbWUoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vLyBUT0RPIChqZXJvbWUpIHBsZWFzZSB2ZXJpZnkgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSB0YWdiaXRzIGZvciB0aGUgcmVjZWl2ZXIKLXB1YmxpYyBsb25nIGdldFRhZ0JpdHMoKSB7Ci0JcmV0dXJuIDA7Ci19CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJ1aWxkZXIuamF2YQppbmRleCA2OTAyNDEyLi4wM2ExYWJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTUsMTIgKzU1LDEyIEBACiAJICogVGhlIGRvdC1zZXBhcmF0ZWQgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZvY3VzIHR5cGUsIG9yIG51bGwgb2Ygbm9uZS4KIAkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nIGZvY3VzUXVhbGlmaWVkTmFtZTsKLQkKKwogCXB1YmxpYyBIaWVyYXJjaHlCdWlsZGVyKFR5cGVIaWVyYXJjaHkgaGllcmFyY2h5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJdGhpcy5oaWVyYXJjaHkgPSBoaWVyYXJjaHk7CiAJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGhpZXJhcmNoeS5qYXZhUHJvamVjdCgpOwotCQkKKwogCQlJVHlwZSBmb2N1c1R5cGUgPSBoaWVyYXJjaHkuZ2V0VHlwZSgpOwogCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IHVuaXRUb0xvb2tJbnNpZGUgPSBmb2N1c1R5cGUgPT0gbnVsbCA/IG51bGwgOiBmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbXSB3b3JraW5nQ29waWVzID0gdGhpcy5oaWVyYXJjaHkud29ya2luZ0NvcGllczsKQEAgLTkwLDE0ICs5MCwxNCBAQAogCQl0aGlzLmluZm9Ub0hhbmRsZSA9IG5ldyBIYXNoTWFwKDUpOwogCQl0aGlzLmZvY3VzUXVhbGlmaWVkTmFtZSA9IGZvY3VzVHlwZSA9PSBudWxsID8gbnVsbCA6IGZvY3VzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKIAl9Ci0JCisKIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBidWlsZChib29sZWFuIGNvbXB1dGVTdWJ0eXBlcykKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKIAkvKioKIAkgKiBDb25maWd1cmUgdGhpcyB0eXBlIGhpZXJhcmNoeSBieSBjb21wdXRpbmcgdGhlIHN1cGVydHlwZXMgb25seS4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBidWlsZFN1cGVydHlwZXMoKSB7Ci0JCUlUeXBlIGZvY3VzVHlwZSA9IHRoaXMuZ2V0VHlwZSgpOworCQlJVHlwZSBmb2N1c1R5cGUgPSBnZXRUeXBlKCk7CiAJCWlmIChmb2N1c1R5cGUgPT0gbnVsbCkKIAkJCXJldHVybjsKIAkJLy8gZ2V0IGdlbmVyaWMgdHlwZSBmcm9tIGZvY3VzIHR5cGUKQEAgLTExMCw3ICsxMTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCS8vTkI6IG5vIG5lZWQgdG8gc2V0IGZvY3VzIHR5cGUgb24gaGllcmFyY2h5IHJlc29sdmVyIHNpbmNlIG5vIG90aGVyIHR5cGUgaXMgaW5qZWN0ZWQKLQkJLy8gICAgaW4gdGhlIGhpZXJhcmNoeSByZXNvbHZlciwgdGh1cyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoYXQgYSB0eXBlIGlzIAorCQkvLyAgICBpbiB0aGUgaGllcmFyY2h5IHJlc29sdmVyLCB0aHVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgdGhhdCBhIHR5cGUgaXMKIAkJLy8gICAgYSBzdWIgb3Igc3VwZXIgdHlwZSBvZiB0aGUgZm9jdXMgdHlwZS4KIAkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlci5yZXNvbHZlKHR5cGUpOwogCkBAIC0xNjcsMTQgKzE2NywxNiBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uSU5URVJGQUNFX0RFQ0wgOgogCQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0wgOgotCQkJCXRoaXMuaGllcmFyY2h5LmFkZEludGVyZmFjZSh0eXBlSGFuZGxlKTsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NjYzCisJCQkJaWYgKHRoaXMuaGllcmFyY2h5LnR5cGVUb1N1cGVySW50ZXJmYWNlcy5nZXQodHlwZUhhbmRsZSkgPT0gbnVsbCkKKwkJCQkJdGhpcy5oaWVyYXJjaHkuYWRkSW50ZXJmYWNlKHR5cGVIYW5kbGUpOwogCQkJCWJyZWFrOwotCQl9CQkKKwkJfQogCQlpZiAoc3VwZXJpbnRlcmZhY2VIYW5kbGVzID09IG51bGwpIHsKIAkJCXN1cGVyaW50ZXJmYWNlSGFuZGxlcyA9IFR5cGVIaWVyYXJjaHkuTk9fVFlQRTsKIAkJfQogCQl0aGlzLmhpZXJhcmNoeS5jYWNoZVN1cGVySW50ZXJmYWNlcyh0eXBlSGFuZGxlLCBzdXBlcmludGVyZmFjZUhhbmRsZXMpOwotCQkgCisKIAkJLy8gcmVjb3JkIGZsYWdzCiAJCXRoaXMuaGllcmFyY2h5LmNhY2hlRmxhZ3ModHlwZUhhbmRsZSwgdHlwZS5nZXRNb2RpZmllcnMoKSk7CiAJfQpAQCAtMjAzLDcgKzIwNSw3IEBACiAJCQkJLy8gb3B0aW1pemF0aW9uOiByZW1lbWJlciB0aGUgaGFuZGxlIGZvciBuZXh0IGNhbGwgKGNhc2Ugb2YgamF2YS5pby5TZXJpYWxpemFibGUgdGhhdCBhIGxvdCBvZiBjbGFzc2VzIGltcGxlbWVudCkKIAkJCQljbGFzc0ZpbGUgPSAoQ2xhc3NGaWxlKSBoYW5kbGUuZ2V0UGFyZW50KCk7CiAJCQkJdGhpcy5pbmZvVG9IYW5kbGUucHV0KGdlbmVyaWNUeXBlLCBjbGFzc0ZpbGUpOwotCQkJfSAKKwkJCX0KIAkJCXJldHVybiBuZXcgUmVzb2x2ZWRCaW5hcnlUeXBlKGNsYXNzRmlsZSwgY2xhc3NGaWxlLmdldFR5cGVOYW1lKCksIG5ldyBTdHJpbmcoYmluZGluZy5jb21wdXRlVW5pcXVlS2V5KCkpKTsKIAkJfSBlbHNlIGlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVFbGVtZW50SW5mbykgewogCQkJSVR5cGUgaGFuZGxlID0gKChTb3VyY2VUeXBlRWxlbWVudEluZm8pIGdlbmVyaWNUeXBlKS5nZXRIYW5kbGUoKTsKQEAgLTIzNCw3ICsyMzYsNyBAQAogCQkJCS8vY2FzZSBJR2VuZXJpY1R5cGUuQU5OT1RBVElPTiA6CiAJCQkJZmxhZyA9IE5hbWVMb29rdXAuQUNDRVBUX0FOTk9UQVRJT05TOwogCQkJCWJyZWFrOwotCQl9CQkJCisJCX0KIAkJY2hhcltdIGJOYW1lID0gdHlwZUluZm8uZ2V0TmFtZSgpOwogCQlxdWFsaWZpZWROYW1lID0gbmV3IFN0cmluZyhDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWUoYk5hbWUpKTsKIAkJaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKHRoaXMuZm9jdXNRdWFsaWZpZWROYW1lKSkgcmV0dXJuIGdldFR5cGUoKTsKQEAgLTI0Niw3ICsyNDgsNyBAQAogCQkJZmFsc2UvKmRvbid0IGNoZWNrIHJlc3RyaWN0aW9ucyovLAogCQkJbnVsbCk7CiAJCXJldHVybiBhbnN3ZXIgPT0gbnVsbCB8fCBhbnN3ZXIudHlwZSA9PSBudWxsIHx8ICFhbnN3ZXIudHlwZS5pc0JpbmFyeSgpID8gbnVsbCA6IGFuc3dlci50eXBlOwotCQkKKwogCX0KIAlwcm90ZWN0ZWQgdm9pZCB3b3JrZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgd29yaykgewogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CkBAIC0yOTEsNyArMjkzLDcgQEAKIAkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7Ci0JfQkJCQkJCQorCX0KIAl0aGlzLmluZm9Ub0hhbmRsZS5wdXQoaW5mbywgaGFuZGxlKTsKIAlyZXR1cm4gaW5mbzsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVJlc29sdmVyLmphdmEKaW5kZXggYjc5NzU0Yi4uMDUxMzYwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVJlc29sdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgU3RlcGhhbiBIZXJybWFubiAtIGNvbnRyaWJ1dGlvbiBmb3IgQnVnIDMwMDU3NiAtIE5QRSBDb21wdXRpbmcgdHlwZSBoaWVyYXJjaHkgd2hlbiBjb21wbGlhbmNlIGRvZXNuJ3QgbWF0Y2ggbGlicmFyaWVzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCkBAIC01Myw2ICs1NCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwpAQCAtNjAsNyArNjIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuSGFuZGxlRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIEhpZXJhcmNoeVJlc29sdmVyIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3IgewotCQorCiAJcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nIGZvY3VzVHlwZTsKIAlwcml2YXRlIGJvb2xlYW4gc3VwZXJUeXBlc09ubHk7CiAJcHJpdmF0ZSBib29sZWFuIGhhc01pc3NpbmdTdXBlckNsYXNzOwpAQCAtNzEsMTkgKzczLDI3IEBACiAKIAlwcml2YXRlIGludCB0eXBlSW5kZXg7CiAJcHJpdmF0ZSBJR2VuZXJpY1R5cGVbXSB0eXBlTW9kZWxzOwotCQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gRmFrZVVuaXQ7CisJc3RhdGljIHsKKwkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5ID0gRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpOworCQlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbmV3IFByb2JsZW1SZXBvcnRlcihwb2xpY3ksIG5ldyBDb21waWxlck9wdGlvbnMoKSwgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsKKwkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KENoYXJPcGVyYXRpb24uTk9fQ0hBUiwgMCwgMCwgMCk7CisJCUZha2VVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgcmVzdWx0LCAwKTsKKwl9CisKIHB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcihJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudCwgTWFwIHNldHRpbmdzLCBIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXIsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgewogCS8vIGNyZWF0ZSBhIHByb2JsZW0gaGFuZGxlciB3aXRoIHRoZSAnZXhpdCBhZnRlciBhbGwgcHJvYmxlbXMnIGhhbmRsaW5nIHBvbGljeQogCXRoaXMub3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOwogCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSA9IERlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKTsKIAlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbmV3IFByb2JsZW1SZXBvcnRlcihwb2xpY3ksIHRoaXMub3B0aW9ucywgcHJvYmxlbUZhY3RvcnkpOwogCi0JdGhpcy5zZXRFbnZpcm9ubWVudCgKKwlzZXRFbnZpcm9ubWVudCgKIAkJbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIHRoaXMub3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpLAogCQlidWlsZGVyKTsKIH0KIHB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcihMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudCwgSGllcmFyY2h5QnVpbGRlciBidWlsZGVyKSB7Ci0JdGhpcy5zZXRFbnZpcm9ubWVudChsb29rdXBFbnZpcm9ubWVudCwgYnVpbGRlcik7CisJc2V0RW52aXJvbm1lbnQobG9va3VwRW52aXJvbm1lbnQsIGJ1aWxkZXIpOwogfQogCiAvKioKQEAgLTk1LDcgKzEwNSw3IEBACiAJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSB0aGlzLmJ1aWxkZXIuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvcjsKIAlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkKIAkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCisKIAlCaW5hcnlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcsIGFjY2Vzc1Jlc3RyaWN0aW9uKTsKIAl0cnkgewogCQl0aGlzLnJlbWVtYmVyKGJpbmFyeVR5cGUsIHR5cGVCaW5kaW5nKTsKQEAgLTExMSw3ICsxMjEsNyBAQAogcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzUmVzdHJpY3Rpb24pIHsKIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGFjY2VwdCBjb21waWxhdGlvbiB1bml0cyBpbnNpZGUgdGhlIEhpZXJhcmNoeVJlc29sdmVyLiIpOwogCXRoaXMubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAotCQluZXcgU3RyaW5nQnVmZmVyKE1lc3NhZ2VzLmFjY2VwdF9jYW5ub3QpIAorCQluZXcgU3RyaW5nQnVmZmVyKE1lc3NhZ2VzLmFjY2VwdF9jYW5ub3QpCiAJCQkuYXBwZW5kKHNvdXJjZVVuaXQuZ2V0RmlsZU5hbWUoKSkKIAkJCS50b1N0cmluZygpKTsKIH0KQEAgLTEyNSwxMyArMTM1LDEzIEBACiAJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSB0aGlzLmJ1aWxkZXIuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvcjsKIAlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkKIAkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCi0JLy8gZmluZCBtb3N0IGVuY2xvc2luZyB0eXBlIGZpcnN0IChuZWVkZWQgd2hlbiBleHBsaWNpdCBhc2tGb3JUeXBlKC4uLikgaXMgZG9uZSAKKworCS8vIGZpbmQgbW9zdCBlbmNsb3NpbmcgdHlwZSBmaXJzdCAobmVlZGVkIHdoZW4gZXhwbGljaXQgYXNrRm9yVHlwZSguLi4pIGlzIGRvbmUKIAkvLyB3aXRoIGEgbWVtYmVyIHR5cGUgKGUuZy4gcC5BJEIpKQogCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlc1swXTsKIAl3aGlsZSAoc291cmNlVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkKIAkJc291cmNlVHlwZSA9IHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOwotCQorCiAJLy8gYnVpbGQgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0CiAJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGUuZ2V0RmlsZU5hbWUoKSwgMSwgMSwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CkBAIC0xMzksMTQgKzE0OSwxNCBAQAogCQkJbmV3IElTb3VyY2VUeXBlW10ge3NvdXJjZVR5cGV9LCAvLyBpZ25vcmUgc2Vjb25kYXJ5IHR5cGVzLCB0byBpbXByb3ZlIGxhemluZXNzCiAJCQlTb3VyY2VUeXBlQ29udmVydGVyLk1FTUJFUl9UWVBFLCAvLyBuZWVkIG1lbWJlciB0eXBlcwogCQkJLy8gbm8gbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KLQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCAKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLAogCQkJcmVzdWx0KTsKLQkJCisKIAkvLyBidWlsZCBiaW5kaW5ncwogCWlmICh1bml0ICE9IG51bGwpIHsKIAkJdHJ5IHsKIAkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCwgYWNjZXNzUmVzdHJpY3Rpb24pOwotCQkJCisKIAkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UgPSAoKFNvdXJjZVR5cGVFbGVtZW50SW5mbylzb3VyY2VUeXBlKS5nZXRIYW5kbGUoKS5nZXRDb21waWxhdGlvblVuaXQoKTsKIAkJCXJlbWVtYmVyQWxsVHlwZXModW5pdCwgY3UsIGZhbHNlKTsKIApAQCAtMTYzLDcgKzE3Myw3IEBACiAgKi8KIHByaXZhdGUgSVR5cGUgZmluZFN1cGVyQ2xhc3MoSUdlbmVyaWNUeXBlIHR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKIAlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyQmluZGluZyA9IHR5cGVCaW5kaW5nLnN1cGVyY2xhc3MoKTsKLQkKKwogCWlmIChzdXBlckJpbmRpbmcgIT0gbnVsbCkgewogCQlzdXBlckJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJCaW5kaW5nLmVyYXN1cmUoKTsKIAkJaWYgKHR5cGVCaW5kaW5nLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpIHsKQEAgLTE4Niw3ICsxOTYsNyBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KLQkJCQkKKwogCQkJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsKSB7IC8vIGNoZWNrIHdoZXRoZXIgc3ViY2xhc3Mgb2YgT2JqZWN0IGR1ZSB0byBicm9rZW4gaGllcmFyY2h5IChhcyBvcHBvc2VkIHRvIGV4cGxpY2l0bHkgZXh0ZW5kaW5nIGl0KQogCQkJCQlpbnQgbGFzdFNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2Yoc2VwYXJhdG9yLCBzdXBlcmNsYXNzTmFtZSk7CiAJCQkJCWNoYXJbXSBzaW1wbGVOYW1lID0gbGFzdFNlcGFyYXRvciA9PSAtMSA/IHN1cGVyY2xhc3NOYW1lIDogQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzdXBlcmNsYXNzTmFtZSwgbGFzdFNlcGFyYXRvcisxLCBzdXBlcmNsYXNzTmFtZS5sZW5ndGgpOwpAQCAtMjAzLDcgKzIxMyw3IEBACiAJCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5nZXRIYW5kbGUodGhpcy50eXBlTW9kZWxzW3RdLCBzdXBlckJpbmRpbmcpOwogCQkJfQogCQl9Ci0JfSAKKwl9CiAJcmV0dXJuIG51bGw7CiB9CiAvKgpAQCAtMjQ2LDggKzI1Niw4IEBACiAJfSBlbHNlewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCi0JUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZUJpbmRpbmdzID0gdHlwZUJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CQorCisJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZUJpbmRpbmdzID0gdHlwZUJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CiAJaW50IGJpbmRpbmdJbmRleCA9IDA7CiAJaW50IGJpbmRpbmdMZW5ndGggPSBpbnRlcmZhY2VCaW5kaW5ncyA9PSBudWxsID8gMCA6IGludGVyZmFjZUJpbmRpbmdzLmxlbmd0aDsKIAlpbnQgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VOYW1lcyA9PSBudWxsID8gMCA6IHN1cGVySW50ZXJmYWNlTmFtZXMubGVuZ3RoOwpAQCAtMjU2LDIxICsyNjYsMjEgQEAKIAluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQljaGFyW10gc3VwZXJJbnRlcmZhY2VOYW1lID0gc3VwZXJJbnRlcmZhY2VOYW1lc1tpXTsKIAkJaW50IGVuZCA9IHN1cGVySW50ZXJmYWNlTmFtZS5sZW5ndGg7Ci0JCQorCiAJCS8vIGZpbmQgdGhlIGVuZCBvZiBzaW1wbGUgbmFtZQogCQlpbnQgZ2VuZXJpY1N0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQsIHN1cGVySW50ZXJmYWNlTmFtZSk7CiAJCWlmIChnZW5lcmljU3RhcnQgIT0gLTEpIGVuZCA9IGdlbmVyaWNTdGFydDsKLQkJCQkKKwogCQkvLyBmaW5kIHRoZSBzdGFydCBvZiBzaW1wbGUgbmFtZQogCQlpbnQgbGFzdFNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2Yoc2VwYXJhdG9yLCBzdXBlckludGVyZmFjZU5hbWUsIDAsIGVuZCk7Ci0JCWludCBzdGFydCA9IGxhc3RTZXBhcmF0b3IgKyAxOyAKLQkJCisJCWludCBzdGFydCA9IGxhc3RTZXBhcmF0b3IgKyAxOworCiAJCS8vIGNhc2Ugb2YgYmluYXJ5IGlubmVyIHR5cGUgLT4gdGFrZSB0aGUgbGFzdCBwYXJ0CiAJCWludCBsYXN0RG9sbGFyID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignJCcsIHN1cGVySW50ZXJmYWNlTmFtZSwgc3RhcnQpOwogCQlpZiAobGFzdERvbGxhciAhPSAtMSkgc3RhcnQgPSBsYXN0RG9sbGFyICsgMTsKLQkJCisKIAkJY2hhcltdIHNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHN1cGVySW50ZXJmYWNlTmFtZSwgc3RhcnQsIGVuZCk7Ci0JCQorCiAJCWlmIChiaW5kaW5nSW5kZXggPCBiaW5kaW5nTGVuZ3RoKSB7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgaW50ZXJmYWNlQmluZGluZ3NbYmluZGluZ0luZGV4XS5lcmFzdXJlKCk7CiAKQEAgLTI3OSw4ICsyODksMTEgQEAKIAkJCQliaW5kaW5nSW5kZXgrKzsKIAkJCQlmb3IgKGludCB0ID0gdGhpcy50eXBlSW5kZXg7IHQgPj0gMDsgdC0tKSB7CiAJCQkJCWlmICh0aGlzLnR5cGVCaW5kaW5nc1t0XSA9PSBpbnRlcmZhY2VCaW5kaW5nKSB7Ci0JCQkJCQlzdXBlcmludGVyZmFjZXNbaW5kZXgrK10gPSB0aGlzLmJ1aWxkZXIuZ2V0SGFuZGxlKHRoaXMudHlwZU1vZGVsc1t0XSwgaW50ZXJmYWNlQmluZGluZyk7Ci0JCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJSVR5cGUgaGFuZGxlID0gdGhpcy5idWlsZGVyLmdldEhhbmRsZSh0aGlzLnR5cGVNb2RlbHNbdF0sIGludGVyZmFjZUJpbmRpbmcpOworCQkJCQkJaWYgKGhhbmRsZSAhPSBudWxsKSB7CisJCQkJCQkJc3VwZXJpbnRlcmZhY2VzW2luZGV4KytdID0gaGFuZGxlOworCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0yOTEsMjMgKzMwNCw0MSBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyaW50ZXJmYWNlcywgMCwgc3VwZXJpbnRlcmZhY2VzID0gbmV3IElUeXBlW2luZGV4XSwgMCwgaW5kZXgpOwogCXJldHVybiBzdXBlcmludGVyZmFjZXM7CiB9CisvKgorICogRm9yIGFsbCB0eXBlIGJpbmRpbmdzIHRoYXQgaGF2ZSBoaWVyYXJjaHkgcHJvYmxlbXMsIGFydGlmaWNpYWxseSBmaXggdGhlaXIgc3VwZXJjbGFzcy9zdXBlckludGVyZmFjZXMgc28gdGhhdCB0aGUgY29ubmVjdGlvbgorICogY2FuIGJlIG1hZGUuCisgKi8KIHByaXZhdGUgdm9pZCBmaXhTdXBlcnR5cGVCaW5kaW5ncygpIHsKIAlmb3IgKGludCBjdXJyZW50ID0gdGhpcy50eXBlSW5kZXg7IGN1cnJlbnQgPj0gMDsgY3VycmVudC0tKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLnR5cGVCaW5kaW5nc1tjdXJyZW50XTsKLQkKLQkJCisJCWlmICgodHlwZUJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXMpID09IDApCisJCQljb250aW51ZTsKKwogCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykgeworCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgTG9jYWxUeXBlQmluZGluZykgeworCQkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlQmluZGluZyA9IChMb2NhbFR5cGVCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiA9IGxvY2FsVHlwZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5hbGxvY2F0aW9uOworCQkJCVR5cGVSZWZlcmVuY2UgdHlwZTsKKwkJCQlpZiAoYWxsb2NhdGlvbkV4cHJlc3Npb24gIT0gbnVsbCAmJiAodHlwZSA9IGFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUpICE9IG51bGwgJiYgdHlwZS5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgeworCQkJCQlsb2NhbFR5cGVCaW5kaW5nLnN1cGVyY2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZS5yZXNvbHZlZFR5cGU7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KIAkJCUNsYXNzU2NvcGUgc2NvcGUgPSAoKFNvdXJjZVR5cGVCaW5kaW5nKSB0eXBlQmluZGluZykuc2NvcGU7CiAJCQlpZiAoc2NvcGUgIT0gbnVsbCkgewogCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0OwogCQkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzc1JlZiA9IHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsID8gbnVsbCA6IHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzOwogCQkJCVR5cGVCaW5kaW5nIHN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzUmVmID09IG51bGwgPyBudWxsIDogc3VwZXJjbGFzc1JlZi5yZXNvbHZlZFR5cGU7Ci0JCQkJaWYgKHN1cGVyY2xhc3MgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgewotCQkJCQlzdXBlcmNsYXNzID0gKChQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgc3VwZXJjbGFzcykuY2xvc2VzdE1hdGNoKCk7CisJCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJCQlzdXBlcmNsYXNzID0gc3VwZXJjbGFzcy5jbG9zZXN0TWF0Y2goKTsKIAkJCQl9Ci0JCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgCi0JCQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHR5cGVCaW5kaW5nKS5zdXBlcmNsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHN1cGVyY2xhc3M7Ci0JCisJCQkJaWYgKHN1cGVyY2xhc3MgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCS8vIGVuc3VyZSB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgY3ljbGUgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1NjgxICkKKwkJCQkJaWYgKCEoc3ViVHlwZU9mVHlwZSgoUmVmZXJlbmNlQmluZGluZykgc3VwZXJjbGFzcywgdHlwZUJpbmRpbmcpKSkgeworCQkJCQkJKChTb3VyY2VUeXBlQmluZGluZykgdHlwZUJpbmRpbmcpLnN1cGVyY2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJjbGFzczsKKwkJCQkJfQorCQkJCX0KKwogCQkJCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCA/IG51bGwgOiB0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzOwogCQkJCWludCBsZW5ndGg7CiAJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZUJpbmRpbmdzID0gdHlwZUJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CkBAIC0zMTUsMTcgKzM0NiwyMiBAQAogCQkJCQlpbnRlcmZhY2VCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xlbmd0aF07CiAJCQkJCWludCBpbmRleCA9IDA7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJJbnRlcmZhY2VzW2ldLnJlc29sdmVkVHlwZTsKLQkJCQkJCWlmIChzdXBlckludGVyZmFjZSBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKQorCQkJCQkJVHlwZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV0ucmVzb2x2ZWRUeXBlOworCQkJCQkJaWYgKHN1cGVySW50ZXJmYWNlICE9IG51bGwpIHsKIAkJCQkJCQlzdXBlckludGVyZmFjZSA9IHN1cGVySW50ZXJmYWNlLmNsb3Nlc3RNYXRjaCgpOwotCQkJCQkJaWYgKHN1cGVySW50ZXJmYWNlICE9IG51bGwpCi0JCQkJCQkJaW50ZXJmYWNlQmluZGluZ3NbaW5kZXgrK10gPSBzdXBlckludGVyZmFjZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzdXBlckludGVyZmFjZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCQkvLyBlbnN1cmUgd2UgYXJlIG5vdCBjcmVhdGluZyBhIGN5Y2xlIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTY4MSApCisJCQkJCQkJaWYgKCEoc3ViVHlwZU9mVHlwZSgoUmVmZXJlbmNlQmluZGluZykgc3VwZXJJbnRlcmZhY2UsIHR5cGVCaW5kaW5nKSkpIHsKKwkJCQkJCQkJaW50ZXJmYWNlQmluZGluZ3NbaW5kZXgrK10gPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJJbnRlcmZhY2U7CisJCQkJCQkJfQorCQkJCQkJfQogCQkJCQl9CiAJCQkJCWlmIChpbmRleCA8IGxlbmd0aCkKIAkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlQmluZGluZ3MsIDAsIGludGVyZmFjZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbaW5kZXhdLCAwICwgaW5kZXgpOwogCQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSB0eXBlQmluZGluZykuc3VwZXJJbnRlcmZhY2VzID0gaW50ZXJmYWNlQmluZGluZ3M7CiAJCQkJfQotCQkJfQkJCisJCQl9CiAJCX0gZWxzZSBpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBCaW5hcnlUeXBlQmluZGluZykgewogCQkJdHJ5IHsKIAkJCQl0eXBlQmluZGluZy5zdXBlcmNsYXNzKCk7CkBAIC0zNDIsMTEgKzM3OCwxMSBAQAogCQkJCSgoQmluYXJ5VHlwZUJpbmRpbmcpIHR5cGVCaW5kaW5nKS50YWdCaXRzICY9IH5UYWdCaXRzLkhhc1VucmVzb2x2ZWRTdXBlcmludGVyZmFjZXM7CiAJCQl9CiAJCX0KLQl9CQorCX0KIH0KIHByaXZhdGUgdm9pZCByZW1lbWJlcihJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CiAJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHJldHVybjsKLQkKKwogCWlmICgrK3RoaXMudHlwZUluZGV4ID09IHRoaXMudHlwZU1vZGVscy5sZW5ndGgpIHsKIAkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnR5cGVNb2RlbHMsIDAsIHRoaXMudHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbdGhpcy50eXBlSW5kZXggKiAyXSwgMCwgdGhpcy50eXBlSW5kZXgpOwogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudHlwZUJpbmRpbmdzLCAwLCB0aGlzLnR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3RoaXMudHlwZUluZGV4ICogMl0sIDAsIHRoaXMudHlwZUluZGV4KTsKQEAgLTM2NSw5ICs0MDEsOSBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHJldHVybjsKLQkJCisKIAkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9ICgoU291cmNlVHlwZUJpbmRpbmcpdHlwZUJpbmRpbmcpLnNjb3BlLnJlZmVyZW5jZVR5cGUoKTsKLQkKKwogCQkvLyBzaW1wbGUgc3VwZXIgY2xhc3MgbmFtZQogCQljaGFyW10gc3VwZXJjbGFzc05hbWUgPSBudWxsOwogCQlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3M7CkBAIC0zODAsNyArNDE2LDcgQEAKIAkJCWNoYXJbXVtdIHR5cGVOYW1lID0gc3VwZXJjbGFzcy5nZXRUeXBlTmFtZSgpOwogCQkJc3VwZXJjbGFzc05hbWUgPSB0eXBlTmFtZSA9PSBudWxsID8gbnVsbCA6IHR5cGVOYW1lW3R5cGVOYW1lLmxlbmd0aC0xXTsKIAkJfQotCQkKKwogCQkvLyBzaW1wbGUgc3VwZXIgaW50ZXJmYWNlIG5hbWVzCiAJCWNoYXJbXVtdIHN1cGVySW50ZXJmYWNlTmFtZXMgPSBudWxsOwogCQlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKQEAgLTM5Myw5ICs0MjksOSBAQAogCQkJCXN1cGVySW50ZXJmYWNlTmFtZXNbaV0gPSB0eXBlTmFtZVt0eXBlTmFtZS5sZW5ndGgtMV07CiAJCQl9CiAJCX0KLQkKKwogCQlIaWVyYXJjaHlUeXBlIGhpZXJhcmNoeVR5cGUgPSBuZXcgSGllcmFyY2h5VHlwZSgKLQkJCXR5cGUsIAorCQkJdHlwZSwKIAkJCXR5cGVEZWNsYXJhdGlvbi5uYW1lLAogCQkJdHlwZURlY2xhcmF0aW9uLmJpbmRpbmcubW9kaWZpZXJzLAogCQkJc3VwZXJjbGFzc05hbWUsCkBAIC00MzAsNyArNDY2LDcgQEAKIH0KIHByaXZhdGUgdm9pZCByZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wsIElUeXBlIHR5cGVIYW5kbGUpIHsKIAlyZW1lbWJlcih0eXBlSGFuZGxlLCB0eXBlRGVjbC5iaW5kaW5nKTsKLQkKKwogCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZURlY2wubWVtYmVyVHlwZXM7CiAJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC00NDMsOCArNDc5LDggQEAKICAqIFJlcG9ydHMgdGhlIGhpZXJhcmNoeSBmcm9tIHRoZSByZW1lbWJlcmVkIGJpbmRpbmdzLgogICogTm90ZSB0aGF0ICdiaW5hcnlUeXBlQmluZGluZycgaXMgbnVsbCBpZiBmb2N1cyB0eXBlIGlzIGEgc291cmNlIHR5cGUuCiAgKi8KLXByaXZhdGUgdm9pZCByZXBvcnRIaWVyYXJjaHkoSVR5cGUgZm9jdXMsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQsIFJlZmVyZW5jZUJpbmRpbmcgYmluYXJ5VHlwZUJpbmRpbmcpIHsKLQkKK3ByaXZhdGUgdm9pZCByZXBvcnRIaWVyYXJjaHkoSVR5cGUgZm9jdXMsIFR5cGVEZWNsYXJhdGlvbiBmb2N1c0xvY2FsVHlwZSwgUmVmZXJlbmNlQmluZGluZyBiaW5hcnlUeXBlQmluZGluZykgeworCiAJLy8gc2V0IGZvY3VzIHR5cGUgYmluZGluZwogCWlmIChmb2N1cyAhPSBudWxsKSB7CiAJCWlmIChiaW5hcnlUeXBlQmluZGluZyAhPSBudWxsKSB7CkBAIC00NTIsMjggKzQ4OCwyNiBAQAogCQkJdGhpcy5mb2N1c1R5cGUgPSBiaW5hcnlUeXBlQmluZGluZzsKIAkJfSBlbHNlIHsKIAkJCS8vIHNvdXJjZSB0eXBlCi0JCQlNZW1iZXIgZGVjbGFyaW5nTWVtYmVyID0gKChNZW1iZXIpZm9jdXMpLmdldE91dGVyTW9zdExvY2FsQ29udGV4dCgpOwotCQkJaWYgKGRlY2xhcmluZ01lbWJlciA9PSBudWxsKSB7CisJCQlpZiAoZm9jdXNMb2NhbFR5cGUgIT0gbnVsbCkgeworCQkJCS8vIGFub255bW91cyBvciBsb2NhbCB0eXBlCisJCQkJdGhpcy5mb2N1c1R5cGUgPSBmb2N1c0xvY2FsVHlwZS5iaW5kaW5nOworCQkJfSBlbHNlIHsKIAkJCQkvLyB0b3AgbGV2ZWwgb3IgbWVtYmVyIHR5cGUKIAkJCQljaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gZm9jdXMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJCQlzZXRGb2N1c1R5cGUoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgZnVsbHlRdWFsaWZpZWROYW1lKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGFub255bW91cyBvciBsb2NhbCB0eXBlCi0JCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgewotCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBuZXcgQVNUTm9kZUZpbmRlcihwYXJzZWRVbml0KS5maW5kVHlwZShmb2N1cyk7Ci0JCQkJCWlmICh0eXBlRGVjbCAhPSBudWxsKSB7Ci0JCQkJCQl0aGlzLmZvY3VzVHlwZSA9IHR5cGVEZWNsLmJpbmRpbmc7Ci0JCQkJCX0KLQkJCQl9IAogCQkJfQogCQl9CiAJfQotCQorCiAJLy8gYmUgcmVzaWxpZW50IGFuZCBmaXggc3VwZXIgdHlwZSBiaW5kaW5ncwogCWZpeFN1cGVydHlwZUJpbmRpbmdzKCk7Ci0JCisKIAlpbnQgb2JqZWN0SW5kZXggPSAtMTsKKwlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IHRoaXMuYnVpbGRlci5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yOwogCWZvciAoaW50IGN1cnJlbnQgPSB0aGlzLnR5cGVJbmRleDsgY3VycmVudCA+PSAwOyBjdXJyZW50LS0pIHsKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCiAJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLnR5cGVCaW5kaW5nc1tjdXJyZW50XTsKIAogCQkvLyBqYXZhLmxhbmcuT2JqZWN0IHRyZWF0ZWQgYXQgdGhlIGVuZApAQCAtNDk1LDExICs1MjksMTEgQEAKIAkJCXN1cGVyY2xhc3MgPSBmaW5kU3VwZXJDbGFzcyhzdXBwbGllZFR5cGUsIHR5cGVCaW5kaW5nKTsKIAkJfQogCQlJVHlwZVtdIHN1cGVyaW50ZXJmYWNlcyA9IGZpbmRTdXBlckludGVyZmFjZXMoc3VwcGxpZWRUeXBlLCB0eXBlQmluZGluZyk7Ci0JCQorCiAJCXRoaXMuYnVpbGRlci5jb25uZWN0KHN1cHBsaWVkVHlwZSwgdGhpcy5idWlsZGVyLmdldEhhbmRsZShzdXBwbGllZFR5cGUsIHR5cGVCaW5kaW5nKSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzKTsKIAl9CiAJLy8gYWRkIGphdmEubGFuZy5PYmplY3Qgb25seSBpZiB0aGUgc3VwZXIgY2xhc3MgaXMgbm90IG1pc3NpbmcKLQlpZiAoIXRoaXMuaGFzTWlzc2luZ1N1cGVyQ2xhc3MgJiYgb2JqZWN0SW5kZXggPiAtMSkgeworCWlmIChvYmplY3RJbmRleCA+IC0xICYmICghdGhpcy5oYXNNaXNzaW5nU3VwZXJDbGFzcyB8fCB0aGlzLmZvY3VzVHlwZSA9PSBudWxsKSkgewogCQlJR2VuZXJpY1R5cGUgb2JqZWN0VHlwZSA9IHRoaXMudHlwZU1vZGVsc1tvYmplY3RJbmRleF07CiAJCXRoaXMuYnVpbGRlci5jb25uZWN0KG9iamVjdFR5cGUsIHRoaXMuYnVpbGRlci5nZXRIYW5kbGUob2JqZWN0VHlwZSwgdGhpcy50eXBlQmluZGluZ3Nbb2JqZWN0SW5kZXhdKSwgbnVsbCwgbnVsbCk7CiAJfQpAQCAtNTMwLDE2ICs1NjQsMjQgQEAKIAkJCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IHRoaXMudHlwZUluZGV4OyBpKyspIHsKIAkJCQlJR2VuZXJpY1R5cGUgaWdUeXBlID0gdGhpcy50eXBlTW9kZWxzW2ldOwogCQkJCWlmIChpZ1R5cGUgIT0gbnVsbCAmJiBpZ1R5cGUuaXNCaW5hcnlUeXBlKCkpIHsKKwkJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcHJldmlvdXNVbml0QmVpbmdDb21wbGV0ZWQgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZDsKIAkJCQkJLy8gZmF1bHQgaW4gaXRzIGhpZXJhcmNoeS4uLgogCQkJCQl0cnkgeworCQkJCQkJLy8gZW5zdXJlIHRoYXQgdW5pdEJlaW5nQ29tcGxldGVkIGlzIHNldCBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBBYm9ydENvbXBpbGF0aW9uIGZvciBhIG1pc3NpbmcgdHlwZQorCQkJCQkJLy8gKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzMjQ5ICkKKwkJCQkJCWlmIChwcmV2aW91c1VuaXRCZWluZ0NvbXBsZXRlZCA9PSBudWxsKSB7CisJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQgPSBGYWtlVW5pdDsKKwkJCQkJCX0KIAkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLnR5cGVCaW5kaW5nc1tpXTsKIAkJCQkJCXR5cGVCaW5kaW5nLnN1cGVyY2xhc3MoKTsKIAkJCQkJCXR5cGVCaW5kaW5nLnN1cGVySW50ZXJmYWNlcygpOwogCQkJCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAkJCQkJCS8vIGNsYXNzcGF0aCBwcm9ibGVtIGZvciB0aGlzIHR5cGU6IGlnbm9yZQorCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQgPSBwcmV2aW91c1VuaXRCZWluZ0NvbXBsZXRlZDsKIAkJCQkJfQogCQkJCX0KLQkJCX0JCQorCQkJfQogCQkJdGhpcy5zdXBlclR5cGVzT25seSA9IHRydWU7CiAJCQlyZXBvcnRIaWVyYXJjaHkodGhpcy5idWlsZGVyLmdldFR5cGUoKSwgbnVsbCwgYmluYXJ5VHlwZUJpbmRpbmcpOwogCQl9IGVsc2UgewpAQCAtNTc1LDcgKzYxNyw3IEBACiAJCWJvb2xlYW5bXSBoYXNMb2NhbFR5cGUgPSBuZXcgYm9vbGVhbltvcGVuYWJsZXNMZW5ndGhdOwogCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0W10gY3VzID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbb3BlbmFibGVzTGVuZ3RoXTsKIAkJaW50IHVuaXRzSW5kZXggPSAwOwotCQkKKwogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBmb2N1c1VuaXQgPSBudWxsOwogCQlSZWZlcmVuY2VCaW5kaW5nIGZvY3VzQmluYXJ5QmluZGluZyA9IG51bGw7CiAJCUlUeXBlIGZvY3VzID0gdGhpcy5idWlsZGVyLmdldFR5cGUoKTsKQEAgLTU4Nyw3ICs2MjksNyBAQAogCQkJCWZvY3VzT3BlbmFibGUgPSAoT3BlbmFibGUpZm9jdXMuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gYnVpbGQgdHlwZSBiaW5kaW5ncwogCQlQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcih0aGlzLmxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgdHJ1ZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlbmFibGVzTGVuZ3RoOyBpKyspIHsKQEAgLTYwMywxMiArNjQ1LDEyIEBACiAJCQkJCUlQYXRoIHBhdGggPSBjdS5nZXRQYXRoKCk7CiAJCQkJCWNvbnRhaW5zTG9jYWxUeXBlID0gbG9jYWxUeXBlcy5jb250YWlucyhwYXRoLnRvU3RyaW5nKCkpOwogCQkJCX0KLQkJCQkKKwogCQkJCS8vIGJ1aWxkIHBhcnNlZCB1bml0CiAJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IG51bGw7CiAJCQkJaWYgKGN1LmlzT3BlbigpKSB7CiAJCQkJCS8vIGNyZWF0ZSBwYXJzZWQgdW5pdCBmcm9tIHNvdXJjZSBlbGVtZW50IGluZm9zCi0JCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgoKElDb21waWxhdGlvblVuaXQpY3UpLmdldEZpbGVOYW1lKCksIGksIG9wZW5hYmxlc0xlbmd0aCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgoSUNvbXBpbGF0aW9uVW5pdCljdSwgaSwgb3BlbmFibGVzTGVuZ3RoLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKIAkJCQkJU291cmNlVHlwZUVsZW1lbnRJbmZvW10gdHlwZUluZm9zID0gbnVsbDsKIAkJCQkJdHJ5IHsKIAkJCQkJCUlUeXBlW10gdG9wTGV2ZWxUeXBlcyA9IGN1LmdldFR5cGVzKCk7CkBAIC02MjIsMjIgKzY2NCwyNiBAQAogCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCQkJLy8gdHlwZXMvY3UgZXhpc3Qgc2luY2UgY3UgaXMgb3BlbmVkCiAJCQkJCX0KLQkJCQkJaW50IGZsYWdzID0gIWNvbnRhaW5zTG9jYWxUeXBlIAotCQkJCQkJPyBTb3VyY2VUeXBlQ29udmVydGVyLk1FTUJFUl9UWVBFIAorCQkJCQlpbnQgZmxhZ3MgPSAhY29udGFpbnNMb2NhbFR5cGUKKwkJCQkJCT8gU291cmNlVHlwZUNvbnZlcnRlci5NRU1CRVJfVFlQRQogCQkJCQkJOiBTb3VyY2VUeXBlQ29udmVydGVyLkZJRUxEX0FORF9NRVRIT0QgfCBTb3VyY2VUeXBlQ29udmVydGVyLk1FTUJFUl9UWVBFIHwgU291cmNlVHlwZUNvbnZlcnRlci5MT0NBTF9UWVBFOwotCQkJCQlwYXJzZWRVbml0ID0gCisJCQkJCXBhcnNlZFVuaXQgPQogCQkJCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKLQkJCQkJCQl0eXBlSW5mb3MsIAorCQkJCQkJCXR5cGVJbmZvcywKIAkJCQkJCQlmbGFncywKLQkJCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgCisJCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCiAJCQkJCQkJcmVzdWx0KTsKKwkJCQkJCisJCQkJCS8vIFdlIHdvdWxkIGhhdmUgZ290IGFsbCB0aGUgbmVjZXNzYXJ5IGxvY2FsIHR5cGVzIGJ5IG5vdyBhbmQgaGVuY2UgdGhlcmUgaXMgbm8gZnVydGhlciBuZWVkIAorCQkJCQkvLyB0byBwYXJzZSB0aGUgbWV0aG9kIGJvZGllcy4gUGFyc2VyLmdldE1ldGhvZEJvZGllcywgd2hpY2ggaXMgY2FsbGVkIGxhdHRlciBpbiB0aGlzIGZ1bmN0aW9uLCAKKwkJCQkJLy8gd2lsbCBub3QgcGFyc2UgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzIGlmIEFTVE5vZGUuSGFzQWxsTWV0aG9kQm9kaWVzIGlzIHNldC4gCiAJCQkJCWlmIChjb250YWluc0xvY2FsVHlwZSkgCXBhcnNlZFVuaXQuYml0cyB8PSBBU1ROb2RlLkhhc0FsbE1ldGhvZEJvZGllczsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyBjcmVhdGUgcGFyc2VkIHVuaXQgZnJvbSBmaWxlCiAJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7CiAJCQkJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IHRoaXMuYnVpbGRlci5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tUGF0aChvcGVuYWJsZSwgZmlsZSk7Ci0JCQkJCQotCQkJCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIGksIG9wZW5hYmxlc0xlbmd0aCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7IAorCisJCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgaSwgb3BlbmFibGVzTGVuZ3RoLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKIAkJCQkJcGFyc2VkVW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgdW5pdFJlc3VsdCk7CiAJCQkJfQogCkBAIC02NTcsMjEgKzcwMywxMyBAQAogCQkJfSBlbHNlIHsKIAkJCQkvLyBjYWNoZSBiaW5hcnkgdHlwZSBiaW5kaW5nCiAJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpb3BlbmFibGU7Ci0JCQkJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IG51bGw7Ci0JCQkJaWYgKGNsYXNzRmlsZS5pc09wZW4oKSkgewotCQkJCQkvLyBjcmVhdGUgYmluYXJ5IHR5cGUgZnJvbSBpbmZvCi0JCQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOwotCQkJCQl0cnkgewotCQkJCQkJYmluYXJ5VHlwZSA9IChJQmluYXJ5VHlwZSkoKEphdmFFbGVtZW50KXR5cGUpLmdldEVsZW1lbnRJbmZvKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyB0eXBlIGV4aXN0cyBzaW5jZSBjbGFzcyBmaWxlIGlzIG9wZW5lZAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKKwkJCQlJQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKElCaW5hcnlUeXBlKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKGNsYXNzRmlsZS5nZXRUeXBlKCkpOworCQkJCWlmIChiaW5hcnlUeXBlID09IG51bGwpIHsKIAkJCQkJLy8gY3JlYXRlIGJpbmFyeSB0eXBlIGZyb20gZmlsZQogCQkJCQlpZiAoY2xhc3NGaWxlLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5pc0FyY2hpdmUoKSkgewogCQkJCQkJYmluYXJ5VHlwZSA9IHRoaXMuYnVpbGRlci5jcmVhdGVJbmZvRnJvbUNsYXNzRmlsZUluSmFyKGNsYXNzRmlsZSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlJUmVzb3VyY2UgZmlsZSA9IGNsYXNzRmlsZS5nZXRSZXNvdXJjZSgpOworCQkJCQkJSVJlc291cmNlIGZpbGUgPSBjbGFzc0ZpbGUucmVzb3VyY2UoKTsKIAkJCQkJCWJpbmFyeVR5cGUgPSB0aGlzLmJ1aWxkZXIuY3JlYXRlSW5mb0Zyb21DbGFzc0ZpbGUoY2xhc3NGaWxlLCBmaWxlKTsKIAkJCQkJfQogCQkJCX0KQEAgLTY4OCw2NyArNzI2LDg5IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCisJCS8vIHJlbWVtYmVyIHR5cGUgZGVjbGFyYXRpb24gb2YgZm9jdXMgaWYgbG9jYWwvYW5vbnltb3VzIGVhcmx5IChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDQ5OCkKKwkJVHlwZURlY2xhcmF0aW9uIGZvY3VzTG9jYWxUeXBlID0gbnVsbDsKKwkJaWYgKGZvY3VzICE9IG51bGwgJiYgZm9jdXNCaW5hcnlCaW5kaW5nID09IG51bGwgJiYgZm9jdXNVbml0ICE9IG51bGwgJiYgKChNZW1iZXIpZm9jdXMpLmdldE91dGVyTW9zdExvY2FsQ29udGV4dCgpICE9IG51bGwpIHsKKwkJCWZvY3VzTG9jYWxUeXBlID0gbmV3IEFTVE5vZGVGaW5kZXIoZm9jdXNVbml0KS5maW5kVHlwZShmb2N1cyk7CisJCX0KKworCiAJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMudHlwZUluZGV4OyBpKyspIHsKIAkJCUlHZW5lcmljVHlwZSBzdXBwbGllZFR5cGUgPSB0aGlzLnR5cGVNb2RlbHNbaV07CiAJCQlpZiAoc3VwcGxpZWRUeXBlICE9IG51bGwgJiYgc3VwcGxpZWRUeXBlLmlzQmluYXJ5VHlwZSgpKSB7CisJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcHJldmlvdXNVbml0QmVpbmdDb21wbGV0ZWQgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZDsKIAkJCQkvLyBmYXVsdCBpbiBpdHMgaGllcmFyY2h5Li4uCiAJCQkJdHJ5IHsKKwkJCQkJLy8gZW5zdXJlIHRoYXQgdW5pdEJlaW5nQ29tcGxldGVkIGlzIHNldCBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBBYm9ydENvbXBpbGF0aW9uIGZvciBhIG1pc3NpbmcgdHlwZQorCQkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTMyNDkgKQorCQkJCQlpZiAocHJldmlvdXNVbml0QmVpbmdDb21wbGV0ZWQgPT0gbnVsbCkgeworCQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC51bml0QmVpbmdDb21wbGV0ZWQgPSBGYWtlVW5pdDsKKwkJCQkJfQogCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy50eXBlQmluZGluZ3NbaV07CiAJCQkJCXR5cGVCaW5kaW5nLnN1cGVyY2xhc3MoKTsKIAkJCQkJdHlwZUJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CiAJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CiAJCQkJCS8vIGNsYXNzcGF0aCBwcm9ibGVtIGZvciB0aGlzIHR5cGU6IGlnbm9yZQorCQkJCX0gZmluYWxseSB7CisJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQudW5pdEJlaW5nQ29tcGxldGVkID0gcHJldmlvdXNVbml0QmVpbmdDb21wbGV0ZWQ7CiAJCQkJfQogCQkJfQotCQl9CQkKLQkJCi0JCS8vIGNvbXBsZXRlIHR5cGUgYmluZGluZ3MgKGllLiBjb25uZWN0IHN1cGVyIHR5cGVzKQorCQl9CisKKwkJLy8gY29tcGxldGUgdHlwZSBiaW5kaW5ncyAoaS5lLiBjb25uZWN0IHN1cGVyIHR5cGVzKQogCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRzSW5kZXg7IGkrKykgewogCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHBhcnNlZFVuaXRzW2ldOwogCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgewogCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gY29udGFpbnNMb2NhbFR5cGUgPSBoYXNMb2NhbFR5cGVbaV07Ci0JCQkJCWlmIChjb250YWluc0xvY2FsVHlwZSkgeyAvLyBOQjogbm8tb3AgaWYgbWV0aG9kIGJvZGllcyBoYXZlIGJlZW4gYWxyZWFkeSBwYXJzZWQKKwkJCQkJaWYgKGhhc0xvY2FsVHlwZVtpXSkgeyAvLyBOQjogbm8tb3AgaWYgbWV0aG9kIGJvZGllcyBoYXZlIGJlZW4gYWxyZWFkeSBwYXJzZWQKKwkJCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJCQkJCQlwYXJzZXIuZ2V0TWV0aG9kQm9kaWVzKHBhcnNlZFVuaXQpOwogCQkJCQl9Ci0JCQkJCS8vIGNvbXBsZXRlIHR5cGUgYmluZGluZ3MgYW5kIGJ1aWxkIGZpZWxkcyBhbmQgbWV0aG9kcyBvbmx5IGZvciBsb2NhbCB0eXBlcwotCQkJCQkvLyAoaW4gdGhpcyBjYXNlIHRoZSBjb25zdHJ1Y3RvciBpcyBuZWVkZWQgd2hlbiByZXNvbHZpbmcgbG9jYWwgdHlwZXMpCi0JCQkJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTMzMykKLQkJCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCBjb250YWluc0xvY2FsVHlwZSk7CiAJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CiAJCQkJCS8vIGNsYXNzcGF0aCBwcm9ibGVtIGZvciB0aGlzIHR5cGU6IGRvbid0IHRyeSB0byByZXNvbHZlIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5ODA5KQogCQkJCQloYXNMb2NhbFR5cGVbaV0gPSBmYWxzZTsKIAkJCQl9CiAJCQl9Ci0JCQl3b3JrZWQobW9uaXRvciwgMSk7CiAJCX0KLQkJCi0JCS8vIHJlbWVtYmVyIHR5cGUgYmluZGluZ3MKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0c0luZGV4OyBpKyspIHsKLQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZWRVbml0c1tpXTsKLQkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGNvbnRhaW5zTG9jYWxUeXBlID0gaGFzTG9jYWxUeXBlW2ldOwotCQkJCWlmIChjb250YWluc0xvY2FsVHlwZSkgewotCQkJCQlwYXJzZWRVbml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOwotCQkJCQlwYXJzZWRVbml0LnJlc29sdmUoKTsKLQkJCQl9CisJCS8vIGNvbXBsZXRlIHR5cGUgYmluZGluZ3MgYW5kIGJ1aWxkIGZpZWxkcyBhbmQgbWV0aG9kcyBvbmx5IGZvciBsb2NhbCB0eXBlcworCQkvLyAoaW4gdGhpcyBjYXNlIHRoZSBjb25zdHJ1Y3RvciBpcyBuZWVkZWQgd2hlbiByZXNvbHZpbmcgbG9jYWwgdHlwZXMpCisJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTMzMykKKwkJdHJ5IHsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdHMsIGhhc0xvY2FsVHlwZSwgdW5pdHNJbmRleCk7CisJCQkvLyByZW1lbWJlciB0eXBlIGJpbmRpbmdzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRzSW5kZXg7IGkrKykgeworCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZWRVbml0c1tpXTsKKwkJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsICYmICFwYXJzZWRVbml0Lmhhc0Vycm9ycygpKSB7CisJCQkJCWJvb2xlYW4gY29udGFpbnNMb2NhbFR5cGUgPSBoYXNMb2NhbFR5cGVbaV07CisJCQkJCWlmIChjb250YWluc0xvY2FsVHlwZSkgeworCQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQlwYXJzZWRVbml0LnJlc29sdmUoKTsKKwkJCQkJfQogCQkJCQkKLQkJCQlyZW1lbWJlckFsbFR5cGVzKHBhcnNlZFVuaXQsIGN1c1tpXSwgY29udGFpbnNMb2NhbFR5cGUpOworCQkJCQlyZW1lbWJlckFsbFR5cGVzKHBhcnNlZFVuaXQsIGN1c1tpXSwgY29udGFpbnNMb2NhbFR5cGUpOworCQkJCX0KIAkJCX0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkvLyBza2lwIGl0IHNpbGVudGx5CiAJCX0KLQkJCisJCXdvcmtlZChtb25pdG9yLCAxKTsKKworCiAJCS8vIGlmIG5vIHBvdGVudGlhbCBzdWJ0eXBlIHdhcyBhIHJlYWwgc3VidHlwZSBvZiB0aGUgYmluYXJ5IGZvY3VzIHR5cGUsIG5vIG5lZWQgdG8gZ28gZnVydGhlcgogCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDA0MykKIAkJaWYgKGZvY3VzQmluYXJ5QmluZGluZyA9PSBudWxsICYmIGZvY3VzICE9IG51bGwgJiYgZm9jdXMuaXNCaW5hcnkoKSkgewogCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZvY3VzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCk7CiAJCQlmb2N1c0JpbmFyeUJpbmRpbmcgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmdldENhY2hlZFR5cGUoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgZnVsbHlRdWFsaWZpZWROYW1lKSk7Ci0JCQlpZiAoZm9jdXNCaW5hcnlCaW5kaW5nID09IG51bGwpIAorCQkJaWYgKGZvY3VzQmluYXJ5QmluZGluZyA9PSBudWxsKQogCQkJCXJldHVybjsKIAkJfQogCi0JCXJlcG9ydEhpZXJhcmNoeShmb2N1cywgZm9jdXNVbml0LCBmb2N1c0JpbmFyeUJpbmRpbmcpOwotCQkKKwkJcmVwb3J0SGllcmFyY2h5KGZvY3VzLCBmb2N1c0xvY2FsVHlwZSwgZm9jdXNCaW5hcnlCaW5kaW5nKTsKKwogCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKXsgLy8gd29yay1hcm91bmQgZm9yIDFHRjVXMVMgLSBjYW4gaGFwcGVuIGluIGNhc2UgZHVwbGljYXRlcyBhcmUgZmVkIHRvIHRoZSBoaWVyYXJjaHkgd2l0aCBiaW5hcmllcyBoaWRpbmcgc291cmNlcwogCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeyAvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24gZm9yIG5vdyBzaW5jZSBpdCB0eXBpY2FsbHkgbWVhbnMgd2UgY2Fubm90IGZpbmQgamF2YS5sYW5nLk9iamVjdAogCQlpZiAoVHlwZUhpZXJhcmNoeS5ERUJVRykKQEAgLTc2Nyw3ICs4MjcsNyBAQAogfQogCiAvKgotICogU2V0IHRoZSBmb2N1cyB0eXBlIChpZS4gdGhlIHR5cGUgdGhhdCB0aGlzIHJlc29sdmVyIGlzIGNvbXB1dGluZyB0aGUgaGllcmFyY2ggZm9yLgorICogU2V0IHRoZSBmb2N1cyB0eXBlIChpLmUuIHRoZSB0eXBlIHRoYXQgdGhpcyByZXNvbHZlciBpcyBjb21wdXRpbmcgdGhlIGhpZXJhcmNoIGZvci4KICAqIFJldHVybnMgdGhlIGJpbmRpbmcgb2YgdGhpcyBmb2N1cyB0eXBlIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kLgogICovCiBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzZXRGb2N1c1R5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CkBAIC03NzUsMTQgKzgzNSwyOSBAQAogCXRoaXMuZm9jdXNUeXBlID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC5nZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7CiAJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHsKIAkJdGhpcy5mb2N1c1R5cGUgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmFza0ZvclR5cGUoY29tcG91bmROYW1lKTsKKwkJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCQkJY2hhcltdIHR5cGVOYW1lID0gY29tcG91bmROYW1lW2xlbmd0aC0xXTsKKwkJCWludCBmaXJzdERvbGxhciA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignJCcsIHR5cGVOYW1lKTsKKwkJCWlmIChmaXJzdERvbGxhciAhPSAtMSkgeworCQkJCWNvbXBvdW5kTmFtZVtsZW5ndGgtMV0gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVOYW1lLCAwLCBmaXJzdERvbGxhcik7CisJCQkJdGhpcy5mb2N1c1R5cGUgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmFza0ZvclR5cGUoY29tcG91bmROYW1lKTsKKwkJCQlpZiAodGhpcy5mb2N1c1R5cGUgIT0gbnVsbCkgeworCQkJCQljaGFyW11bXSBtZW1iZXJUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJyQnLCB0eXBlTmFtZSwgZmlyc3REb2xsYXIrMSwgdHlwZU5hbWUubGVuZ3RoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCXRoaXMuZm9jdXNUeXBlID0gdGhpcy5mb2N1c1R5cGUuZ2V0TWVtYmVyVHlwZShtZW1iZXJUeXBlTmFtZXNbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CiAJfQogCXJldHVybiB0aGlzLmZvY3VzVHlwZTsKIH0KIHB1YmxpYyBib29sZWFuIHN1Yk9yU3VwZXJPZkZvY3VzKFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKIAlpZiAodGhpcy5mb2N1c1R5cGUgPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIGFjY2VwdCBhbGwgdHlwZXMgKGNhc2Ugb2YgaGllcmFyY2h5IGluIGEgcmVnaW9uKQogCXRyeSB7Ci0JCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUodGhpcy5mb2N1c1R5cGUsIHR5cGVCaW5kaW5nKSkgcmV0dXJuIHRydWU7Ci0JCWlmICghdGhpcy5zdXBlclR5cGVzT25seSAmJiB0aGlzLnN1YlR5cGVPZlR5cGUodHlwZUJpbmRpbmcsIHRoaXMuZm9jdXNUeXBlKSkgcmV0dXJuIHRydWU7CisJCWlmIChzdWJUeXBlT2ZUeXBlKHRoaXMuZm9jdXNUeXBlLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOworCQlpZiAoIXRoaXMuc3VwZXJUeXBlc09ubHkgJiYgc3ViVHlwZU9mVHlwZSh0eXBlQmluZGluZywgdGhpcy5mb2N1c1R5cGUpKSByZXR1cm4gdHJ1ZTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAkJLy8gdW5yZXNvbHZlZCBzdXBlcmNsYXNzL3N1cGVyaW50ZXJmYWNlIC0+IGlnbm9yZQogCX0KQEAgLTc5NCwxMyArODY5LDEzIEBACiAJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gc3ViVHlwZS5zdXBlcmNsYXNzKCk7CiAJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgc3VwZXJjbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKSBzdXBlcmNsYXNzLmVyYXN1cmUoKTsKIC8vCWlmIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QgJiYgc3ViVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKSByZXR1cm4gZmFsc2U7Ci0JaWYgKHRoaXMuc3ViVHlwZU9mVHlwZShzdXBlcmNsYXNzLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOworCWlmIChzdWJUeXBlT2ZUeXBlKHN1cGVyY2xhc3MsIHR5cGVCaW5kaW5nKSkgcmV0dXJuIHRydWU7CiAJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcyA9IHN1YlR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CiAJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJJbnRlcmZhY2UgPSAoUmVmZXJlbmNlQmluZGluZykgc3VwZXJJbnRlcmZhY2VzW2ldLmVyYXN1cmUoKTsKLQkJCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUoc3VwZXJJbnRlcmZhY2UsIHR5cGVCaW5kaW5nKSkgcmV0dXJuIHRydWU7Ci0JCX0gCisJCQlpZiAoc3ViVHlwZU9mVHlwZShzdXBlckludGVyZmFjZSwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsKKwkJfQogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVR5cGUuamF2YQppbmRleCAxMWU2NjhlLi5lZjY3NGFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNUeXBlOwogCiAvKioKLSAqIAorICoKICAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgYW4gSUdlbmVyaWNUeXBlIHVzZWQgdG8KICAqIGFuc3dlciBoaWVyYXJjaGllcy4KICAqLwpAQCAtMjUsMTQgKzI1LDE0IEBACiAJcHVibGljIGludCBtb2RpZmllcnM7CiAJcHVibGljIGNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKIAlwdWJsaWMgY2hhcltdW10gc3VwZXJJbnRlcmZhY2VOYW1lczsKLQkKKwogcHVibGljIEhpZXJhcmNoeVR5cGUoCi0JSVR5cGUgdHlwZUhhbmRsZSwgCi0JY2hhcltdIG5hbWUsIAotCWludCBtb2RpZmllcnMsIAorCUlUeXBlIHR5cGVIYW5kbGUsCisJY2hhcltdIG5hbWUsCisJaW50IG1vZGlmaWVycywKIAljaGFyW10gc3VwZXJjbGFzc05hbWUsCiAJY2hhcltdW10gc3VwZXJJbnRlcmZhY2VOYW1lcykgewotCQkKKwogCXRoaXMudHlwZUhhbmRsZSA9IHR5cGVIYW5kbGU7CiAJdGhpcy5uYW1lID0gbmFtZTsKIAl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0luZGV4QmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKaW5kZXggNzM1NWVmMS4uYmY1NGE3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0luZGV4QmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0luZGV4QmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTgsNyArNTgsNyBAQAogCSAqIENhY2hlIHVzZWQgdG8gcmVjb3JkIGJpbmFyaWVzIHJlY3JlYXRlZCBmcm9tIGluZGV4IG1hdGNoZXMKIAkgKi8KIAlwcm90ZWN0ZWQgTWFwIGJpbmFyaWVzRnJvbUluZGV4TWF0Y2hlczsKLQkKKwogCS8qKgogCSAqIENvbGxlY3Rpb24gdXNlZCB0byBxdWV1ZSBzdWJ0eXBlIGluZGV4IHF1ZXJpZXMKIAkgKi8KQEAgLTc2LDcgKzc2LDcgQEAKIAkJfQogCQlwdWJsaWMgY2hhcltdIHJldHJpZXZlKCl7CiAJCQlpZiAodGhpcy5zdGFydCA+IHRoaXMuZW5kKSByZXR1cm4gbnVsbDsgLy8gbm9uZQotCQkJCisKIAkJCWNoYXJbXSBuYW1lID0gdGhpcy5uYW1lc1t0aGlzLnN0YXJ0KytdOwogCQkJaWYgKHRoaXMuc3RhcnQgPiB0aGlzLmVuZCl7CiAJCQkJdGhpcy5zdGFydCA9IDA7CkBAIC04Nyw3ICs4Nyw3IEBACiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJRdWV1ZTpcbiIpOyAvLyROT04tTkxTLTEkCiAJCQlmb3IgKGludCBpID0gdGhpcy5zdGFydDsgaSA8PSB0aGlzLmVuZDsgaSsrKXsKLQkJCQlidWZmZXIuYXBwZW5kKHRoaXMubmFtZXNbaV0pLmFwcGVuZCgnXG4nKTsJCQorCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lc1tpXSkuYXBwZW5kKCdcbicpOwogCQkJfQogCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCQl9CkBAIC0xMDIsNDAgKzEwMiw0MCBAQAogCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwogCXRyeSB7CiAJCS8vIG9wdGltaXplIGFjY2VzcyB0byB6aXAgZmlsZXMgd2hpbGUgYnVpbGRpbmcgaGllcmFyY2h5Ci0JCW1hbmFnZXIuY2FjaGVaaXBGaWxlcygpOwotCQkJCQorCQltYW5hZ2VyLmNhY2hlWmlwRmlsZXModGhpcyk7CisKIAkJaWYgKGNvbXB1dGVTdWJ0eXBlcykgewogCQkJLy8gTm90ZSBieSBjb25zdHJ1Y3Rpb24gdGhlcmUgYWx3YXlzIGlzIGEgZm9jdXMgdHlwZSBoZXJlCiAJCQlJVHlwZSBmb2N1c1R5cGUgPSBnZXRUeXBlKCk7CiAJCQlib29sZWFuIGZvY3VzSXNPYmplY3QgPSBmb2N1c1R5cGUuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobmV3IFN0cmluZyhJSW5kZXhDb25zdGFudHMuT0JKRUNUKSk7CiAJCQlpbnQgYW1vdW50T2ZXb3JrRm9yU3VidHlwZXMgPSBmb2N1c0lzT2JqZWN0ID8gNSA6IDgwOyAvLyBwZXJjZW50YWdlIG9mIHdvcmsgbmVlZGVkIHRvIGdldCBwb3NzaWJsZSBzdWJ0eXBlcwotCQkJSVByb2dyZXNzTW9uaXRvciBwb3NzaWJsZVN1YnR5cGVzTW9uaXRvciA9IAotCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gCi0JCQkJCW51bGwgOiAKKwkJCUlQcm9ncmVzc01vbml0b3IgcG9zc2libGVTdWJ0eXBlc01vbml0b3IgPQorCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8KKwkJCQkJbnVsbCA6CiAJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IodGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yLCBhbW91bnRPZldvcmtGb3JTdWJ0eXBlcyk7CiAJCQlIYXNoU2V0IGxvY2FsVHlwZXMgPSBuZXcgSGFzaFNldCgxMCk7IC8vIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IGhhdmUgcG90ZW50aWFsIHN1YnR5cGVzIHRoYXQgYXJlIGxvY2FsL2Fub255bW91cyB0eXBlcwogCQkJU3RyaW5nW10gYWxsUG9zc2libGVTdWJ0eXBlczsKIAkJCWlmICgoKE1lbWJlcilmb2N1c1R5cGUpLmdldE91dGVyTW9zdExvY2FsQ29udGV4dCgpID09IG51bGwpIHsKIAkJCQkvLyB0b3AgbGV2ZWwgb3IgbWVtYmVyIHR5cGUKLQkJCQlhbGxQb3NzaWJsZVN1YnR5cGVzID0gdGhpcy5kZXRlcm1pbmVQb3NzaWJsZVN1YlR5cGVzKGxvY2FsVHlwZXMsIHBvc3NpYmxlU3VidHlwZXNNb25pdG9yKTsKKwkJCQlhbGxQb3NzaWJsZVN1YnR5cGVzID0gZGV0ZXJtaW5lUG9zc2libGVTdWJUeXBlcyhsb2NhbFR5cGVzLCBwb3NzaWJsZVN1YnR5cGVzTW9uaXRvcik7CiAJCQl9IGVsc2UgewogCQkJCS8vIGxvY2FsIG9yIGFub255bW91cyB0eXBlCiAJCQkJYWxsUG9zc2libGVTdWJ0eXBlcyA9IENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKIAkJCX0KIAkJCWlmIChhbGxQb3NzaWJsZVN1YnR5cGVzICE9IG51bGwpIHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIGJ1aWxkTW9uaXRvciA9IAotCQkJCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IAotCQkJCQkJbnVsbCA6IAorCQkJCUlQcm9ncmVzc01vbml0b3IgYnVpbGRNb25pdG9yID0KKwkJCQkJdGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPworCQkJCQkJbnVsbCA6CiAJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciwgMTAwIC0gYW1vdW50T2ZXb3JrRm9yU3VidHlwZXMpOwogCQkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoYWxsUG9zc2libGVTdWJ0eXBlcy5sZW5ndGgpOwogCQkJCWJ1aWxkRnJvbVBvdGVudGlhbFN1YnR5cGVzKGFsbFBvc3NpYmxlU3VidHlwZXMsIGxvY2FsVHlwZXMsIGJ1aWxkTW9uaXRvcik7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQl0aGlzLmhpZXJhcmNoeS5pbml0aWFsaXplKDEpOwotCQkJdGhpcy5idWlsZFN1cGVydHlwZXMoKTsKKwkJCWJ1aWxkU3VwZXJ0eXBlcygpOwogCQl9CiAJfSBmaW5hbGx5IHsKLQkJbWFuYWdlci5mbHVzaFppcEZpbGVzKCk7CisJCW1hbmFnZXIuZmx1c2haaXBGaWxlcyh0aGlzKTsKIAl9CiB9CiBwcml2YXRlIHZvaWQgYnVpbGRGb3JQcm9qZWN0KEphdmFQcm9qZWN0IHByb2plY3QsIEFycmF5TGlzdCBwb3RlbnRpYWxTdWJ0eXBlcywgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXMsIEhhc2hTZXQgbG9jYWxUeXBlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcm9vdHNMZW5ndGg7IGluZGV4KyspIHsKIAkJCQlpZiAocm9vdHNbaW5kZXhdLmVxdWFscyhyb290KSkKIAkJCQkJYnJlYWs7Ci0JCQl9CQkKKwkJCX0KIAkJCWluZGV4ZXMucHV0KG9wZW5hYmxlc1tpXSwgaW5kZXgpOwogCQl9CiAJCUFycmF5cy5zb3J0KG9wZW5hYmxlcywgbmV3IENvbXBhcmF0b3IoKSB7CkBAIC0xNzAsOCArMTcwLDggQEAKIAkJCQlyZXR1cm4gKChPcGVuYWJsZSkgYikuZ2V0RWxlbWVudE5hbWUoKS5jb21wYXJlVG8oKChPcGVuYWJsZSkgYSkuZ2V0RWxlbWVudE5hbWUoKSk7CiAJCQl9CiAJCX0pOwotCQkKLQkJSVR5cGUgZm9jdXNUeXBlID0gdGhpcy5nZXRUeXBlKCk7CisKKwkJSVR5cGUgZm9jdXNUeXBlID0gZ2V0VHlwZSgpOwogCQlib29sZWFuIGluUHJvamVjdE9mRm9jdXNUeXBlID0gZm9jdXNUeXBlICE9IG51bGwgJiYgZm9jdXNUeXBlLmdldEphdmFQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpOwogCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0W10gdW5pdHNUb0xvb2tJbnNpZGUgPSBudWxsOwogCQlpZiAoaW5Qcm9qZWN0T2ZGb2N1c1R5cGUpIHsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQlNYXAgb3B0aW9ucyA9IHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKIAkJLy8gZGlzYWJsZSB0YXNrIHRhZ3MgdG8gc3BlZWQgdXAgcGFyc2luZwogCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyID0gCisJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIgPQogCQkJbmV3IEhpZXJhcmNoeVJlc29sdmVyKHNlYXJjaGFibGVFbnZpcm9ubWVudCwgb3B0aW9ucywgdGhpcywgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsKIAkJaWYgKGZvY3VzVHlwZSAhPSBudWxsKSB7CiAJCQlNZW1iZXIgZGVjbGFyaW5nTWVtYmVyID0gKChNZW1iZXIpZm9jdXNUeXBlKS5nZXRPdXRlck1vc3RMb2NhbENvbnRleHQoKTsKQEAgLTIzMCw4ICsyMzAsOCBAQAogICogQ29uZmlndXJlIHRoaXMgdHlwZSBoaWVyYXJjaHkgYmFzZWQgb24gdGhlIGdpdmVuIHBvdGVudGlhbCBzdWJ0eXBlcy4KICAqLwogcHJpdmF0ZSB2b2lkIGJ1aWxkRnJvbVBvdGVudGlhbFN1YnR5cGVzKFN0cmluZ1tdIGFsbFBvdGVudGlhbFN1YlR5cGVzLCBIYXNoU2V0IGxvY2FsVHlwZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCUlUeXBlIGZvY3VzVHlwZSA9IHRoaXMuZ2V0VHlwZSgpOwotCQkKKwlJVHlwZSBmb2N1c1R5cGUgPSBnZXRUeXBlKCk7CisKIAkvLyBzdWJzdGl0dXRlIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggd29ya2luZyBjb3BpZXMKIAlIYXNoTWFwIHdjUGF0aHMgPSBuZXcgSGFzaE1hcCgpOyAvLyBhIG1hcCBmcm9tIHBhdGggdG8gd29ya2luZyBjb3BpZXMKIAlpbnQgd2NMZW5ndGg7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJU3lzdGVtLmFycmF5Y29weShhbGxQb3RlbnRpYWxTdWJUeXBlcywgMCwgYWxsUG90ZW50aWFsU3ViVHlwZXMgPSBuZXcgU3RyaW5nW3BvdGVudGlhbFN1YnR5cGVzTGVuZ3RoK3djTGVuZ3RoXSwgMCwgcG90ZW50aWFsU3VidHlwZXNMZW5ndGgpOwogCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1BhdGhzLCAwLCBhbGxQb3RlbnRpYWxTdWJUeXBlcywgcG90ZW50aWFsU3VidHlwZXNMZW5ndGgsIHdjTGVuZ3RoKTsKIAl9Ci0JCQkKKwogCWludCBsZW5ndGggPSBhbGxQb3RlbnRpYWxTdWJUeXBlcy5sZW5ndGg7CiAKIAkvLyBpbmplY3QgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb2YgdGhlIGZvY3VzIHR5cGUgKHNvIHRoYXQgdHlwZXMgaW4KQEAgLTI2MCwxMyArMjYwLDEzIEBACiAJCWZvY3VzUGF0aCA9IGZvY3VzQ1UuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CiAJCWlmIChsZW5ndGggPiAwKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGFsbFBvdGVudGlhbFN1YlR5cGVzLCAwLCBhbGxQb3RlbnRpYWxTdWJUeXBlcyA9IG5ldyBTdHJpbmdbbGVuZ3RoKzFdLCAwLCBsZW5ndGgpOwotCQkJYWxsUG90ZW50aWFsU3ViVHlwZXNbbGVuZ3RoXSA9IGZvY3VzUGF0aDsJCisJCQlhbGxQb3RlbnRpYWxTdWJUeXBlc1tsZW5ndGhdID0gZm9jdXNQYXRoOwogCQl9IGVsc2UgewogCQkJYWxsUG90ZW50aWFsU3ViVHlwZXMgPSBuZXcgU3RyaW5nW10ge2ZvY3VzUGF0aH07CiAJCX0KIAkJbGVuZ3RoKys7CiAJfQotCQorCiAJLyoKIAkgKiBTb3J0IGluIGFscGhhYmV0aWNhbCBvcmRlciBzbyB0aGF0IHBvdGVudGlhbCBzdWJ0eXBlcyBhcmUgZ3JvdXBlZCBwZXIgcHJvamVjdAogCSAqLwpAQCAtMjgxLDM5ICsyODEsMzkgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJdHJ5IHsKIAkJCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0gYWxsUG90ZW50aWFsU3ViVHlwZXNbaV07Ci0JCQkJCisKIAkJCQkvLyBza2lwIGR1cGxpY2F0ZSBwYXRocyAoZS5nLiBpZiBmb2N1cyBwYXRoIHdhcyBpbmplY3RlZCB3aGVuIGl0IHdhcyBhbHJlYWR5IGEgcG90ZW50aWFsIHN1YnR5cGUpCiAJCQkJaWYgKGkgPiAwICYmIHJlc291cmNlUGF0aC5lcXVhbHMoYWxsUG90ZW50aWFsU3ViVHlwZXNbaS0xXSkpIGNvbnRpbnVlOwotCQkJCQorCiAJCQkJT3BlbmFibGUgaGFuZGxlOwogCQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCl3Y1BhdGhzLmdldChyZXNvdXJjZVBhdGgpOwogCQkJCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7CiAJCQkJCWhhbmRsZSA9IChPcGVuYWJsZSl3b3JraW5nQ29weTsKIAkJCQl9IGVsc2UgewotCQkJCQloYW5kbGUgPSAKLQkJCQkJCXJlc291cmNlUGF0aC5lcXVhbHMoZm9jdXNQYXRoKSA/IAorCQkJCQloYW5kbGUgPQorCQkJCQkJcmVzb3VyY2VQYXRoLmVxdWFscyhmb2N1c1BhdGgpID8KIAkJCQkJCQlmb2N1c0NVIDoKIAkJCQkJCQlmYWN0b3J5LmNyZWF0ZU9wZW5hYmxlKHJlc291cmNlUGF0aCwgdGhpcy5zY29wZSk7CiAJCQkJCWlmIChoYW5kbGUgPT0gbnVsbCkgY29udGludWU7IC8vIG1hdGNoIGlzIG91dHNpZGUgY2xhc3NwYXRoCiAJCQkJfQotCQkJCQorCiAJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBoYW5kbGUuZ2V0SmF2YVByb2plY3QoKTsKIAkJCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCkgewogCQkJCQljdXJyZW50UHJvamVjdCA9IHByb2plY3Q7CiAJCQkJCXBvdGVudGlhbFN1YnR5cGVzID0gbmV3IEFycmF5TGlzdCg1KTsKIAkJCQl9IGVsc2UgaWYgKCFjdXJyZW50UHJvamVjdC5lcXVhbHMocHJvamVjdCkpIHsKIAkJCQkJLy8gYnVpbGQgY3VycmVudCBwcm9qZWN0Ci0JCQkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgcG90ZW50aWFsU3VidHlwZXMsIHdvcmtpbmdDb3BpZXMsIGxvY2FsVHlwZXMsIG1vbml0b3IpOworCQkJCQlidWlsZEZvclByb2plY3QoKEphdmFQcm9qZWN0KWN1cnJlbnRQcm9qZWN0LCBwb3RlbnRpYWxTdWJ0eXBlcywgd29ya2luZ0NvcGllcywgbG9jYWxUeXBlcywgbW9uaXRvcik7CiAJCQkJCWN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKIAkJCQkJcG90ZW50aWFsU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwogCQkJCX0KLQkJCQkKKwogCQkJCXBvdGVudGlhbFN1YnR5cGVzLmFkZChoYW5kbGUpOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyBidWlsZCBsYXN0IHByb2plY3QKIAkJdHJ5IHsKIAkJCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsKSB7CkBAIC0zMjUsMTEgKzMyNSwxMSBAQAogCQkJCQlwb3RlbnRpYWxTdWJ0eXBlcy5hZGQoZm9jdXNUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKIAkJCQl9CiAJCQl9Ci0JCQl0aGlzLmJ1aWxkRm9yUHJvamVjdCgoSmF2YVByb2plY3QpY3VycmVudFByb2plY3QsIHBvdGVudGlhbFN1YnR5cGVzLCB3b3JraW5nQ29waWVzLCBsb2NhbFR5cGVzLCBtb25pdG9yKTsKKwkJCWJ1aWxkRm9yUHJvamVjdCgoSmF2YVByb2plY3QpY3VycmVudFByb2plY3QsIHBvdGVudGlhbFN1YnR5cGVzLCB3b3JraW5nQ29waWVzLCBsb2NhbFR5cGVzLCBtb25pdG9yKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlnbm9yZQogCQl9Ci0JCQorCiAJCS8vIENvbXB1dGUgaGllcmFyY2h5IG9mIGZvY3VzIHR5cGUgaWYgbm90IGFscmVhZHkgZG9uZSAoY2FzZSBvZiBhIHR5cGUgd2l0aCBwb3RlbnRpYWwgc3VidHlwZXMgdGhhdCBhcmUgbm90IHJlYWwgc3VidHlwZXMpCiAJCWlmICghdGhpcy5oaWVyYXJjaHkuY29udGFpbnMoZm9jdXNUeXBlKSkgewogCQkJdHJ5IHsKQEAgLTM0MCwxMiArMzQwLDEyIEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJcG90ZW50aWFsU3VidHlwZXMuYWRkKGZvY3VzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSk7CiAJCQkJfQotCQkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgcG90ZW50aWFsU3VidHlwZXMsIHdvcmtpbmdDb3BpZXMsIGxvY2FsVHlwZXMsIG1vbml0b3IpOworCQkJCWJ1aWxkRm9yUHJvamVjdCgoSmF2YVByb2plY3QpY3VycmVudFByb2plY3QsIHBvdGVudGlhbFN1YnR5cGVzLCB3b3JraW5nQ29waWVzLCBsb2NhbFR5cGVzLCBtb25pdG9yKTsKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gaWdub3JlCiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gQWRkIGZvY3VzIGlmIG5vdCBhbHJlYWR5IGluIChjYXNlIG9mIGEgdHlwZSB3aXRoIG5vIGV4cGxpY2l0IHN1cGVyIHR5cGUpCiAJCWlmICghdGhpcy5oaWVyYXJjaHkuY29udGFpbnMoZm9jdXNUeXBlKSkgewogCQkJdGhpcy5oaWVyYXJjaHkuYWRkUm9vdENsYXNzKGZvY3VzVHlwZSk7CkBAIC00MDAsMTEgKzQwMCwxMSBAQAogCQl9CiAJfQogCVBhdGhDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFBhdGhDb2xsZWN0b3IoKTsKLQkKKwogCXRyeSB7CiAJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuYmVnaW5UYXNrKCIiLCBNQVhUSUNLUyk7IC8vJE5PTi1OTFMtMSQKIAkJc2VhcmNoQWxsUG9zc2libGVTdWJUeXBlcygKLQkJCXRoaXMuZ2V0VHlwZSgpLAorCQkJZ2V0VHlwZSgpLAogCQkJdGhpcy5zY29wZSwKIAkJCXRoaXMuYmluYXJpZXNGcm9tSW5kZXhNYXRjaGVzLAogCQkJY29sbGVjdG9yLApAQCAtNDIwLDcgKzQyMCw3IEBACiAJaW50IGNvdW50ID0gMDsKIAlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXRocy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKIAkJcmVzdWx0W2NvdW50KytdID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JfSAKKwl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNDUxLDcgKzQ1MSw3IEBACiAJZmluYWwgUXVldWUgcXVldWUgPSBuZXcgUXVldWUoKTsKIAlmaW5hbCBIYXNodGFibGVPZk9iamVjdCBmb3VuZFN1cGVyTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoNSk7CiAKLQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7CiAKIAkvKiB1c2UgYSBzcGVjaWFsIGNvbGxlY3RvciB0byBjb2xsZWN0IHBhdGhzIGFuZCBxdWV1ZSBuZXcgc3VidHlwZSBuYW1lcyAqLwogCUluZGV4UXVlcnlSZXF1ZXN0b3Igc2VhcmNoUmVxdWVzdG9yID0gbmV3IEluZGV4UXVlcnlSZXF1ZXN0b3IoKSB7CkBAIC00NjAsOCArNDYwLDggQEAKIAkJCWJvb2xlYW4gaXNMb2NhbE9yQW5vbnltb3VzID0gcmVjb3JkLmVuY2xvc2luZ1R5cGVOYW1lID09IElJbmRleENvbnN0YW50cy5PTkVfWkVSTzsKIAkJCXBhdGhSZXF1ZXN0b3IuYWNjZXB0UGF0aChkb2N1bWVudFBhdGgsIGlzTG9jYWxPckFub255bW91cyk7CiAJCQljaGFyW10gdHlwZU5hbWUgPSByZWNvcmQuc2ltcGxlTmFtZTsKLQkJCWludCBzdWZmaXggPSBkb2N1bWVudFBhdGgudG9Mb3dlckNhc2UoKS5sYXN0SW5kZXhPZihTVUZGSVhfU1RSSU5HX2NsYXNzKTsKLQkJCWlmIChzdWZmaXggIT0gLTEpeyAKKwkJCWlmIChkb2N1bWVudFBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChTVUZGSVhfU1RSSU5HX2NsYXNzKSkgeworCQkJICAgIGludCBzdWZmaXggPSBkb2N1bWVudFBhdGgubGVuZ3RoKCktU1VGRklYX1NUUklOR19jbGFzcy5sZW5ndGgoKTsKIAkJCQlIaWVyYXJjaHlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSAoSGllcmFyY2h5QmluYXJ5VHlwZSliaW5hcmllc0Zyb21JbmRleE1hdGNoZXMuZ2V0KGRvY3VtZW50UGF0aCk7CiAJCQkJaWYgKGJpbmFyeVR5cGUgPT0gbnVsbCl7CiAJCQkJCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9IHJlY29yZC5lbmNsb3NpbmdUeXBlTmFtZTsKQEAgLTQ4OSw3ICs0ODksNyBAQAogCQkJCXF1ZXVlLmFkZCh0eXBlTmFtZSk7CiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCisJCX0KIAl9OwogCiAJaW50IHN1cGVyUmVmS2luZDsKQEAgLTUwMiw5ICs1MDIsOSBAQAogCQluZXcgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybihudWxsLCBudWxsLCBzdXBlclJlZktpbmQsIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRSk7CiAJTWF0Y2hMb2NhdG9yLnNldEZvY3VzKHBhdHRlcm4sIHR5cGUpOwogCVN1YlR5cGVTZWFyY2hKb2Igam9iID0gbmV3IFN1YlR5cGVTZWFyY2hKb2IoCi0JCXBhdHRlcm4sIAorCQlwYXR0ZXJuLAogCQluZXcgSmF2YVNlYXJjaFBhcnRpY2lwYW50KCksIC8vIGphdmEgc2VhcmNoIG9ubHkKLQkJc2NvcGUsIAorCQlzY29wZSwKIAkJc2VhcmNoUmVxdWVzdG9yKTsKIAogCWludCB0aWNrcyA9IDA7CkBAIC01MjAsMTUgKzUyMCwxOSBAQAogCiAJCQkvLyBzZWFyY2ggYWxsIGluZGV4IHJlZmVyZW5jZXMgdG8gYSBnaXZlbiBzdXBlcnR5cGUKIAkJCXBhdHRlcm4uc3VwZXJTaW1wbGVOYW1lID0gY3VycmVudFR5cGVOYW1lOwotCQkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKGpvYiwgd2FpdGluZ1BvbGljeSwgcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSB7IAotCQkJCS8vIGRvbid0IHJlcG9ydCBwcm9ncmVzcyBzaW5jZSB0aGlzIGlzIHRvbyBjb3N0bHkgZm9yIGRlZXAgaGllcmFyY2hpZXMKLQkJCQkvLyBqdXN0IGhhbmRsZSBpc0NhbmNlbGVkKCkgKHNlZWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk1MTEpCisJCQlpbmRleE1hbmFnZXIucGVyZm9ybUNvbmN1cnJlbnRKb2Ioam9iLCB3YWl0aW5nUG9saWN5LCBwcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IG51bGwgOiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIHsKKwkJCQkvLyBkb24ndCByZXBvcnQgcHJvZ3Jlc3Mgc2luY2UgdGhpcyBpcyB0b28gY29zdGx5IGZvciBkZWVwIGhpZXJhcmNoaWVzIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDc4ICkKKwkJCQkvLyBqdXN0IGhhbmRsZSBpc0NhbmNlbGVkKCkgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NTExICkKIAkJCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7CiAJCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh2YWx1ZSk7CiAJCQkJfQogCQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CiAJCQkJCXJldHVybiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwogCQkJCX0KKwkJCQkvLyBhbmQgaGFuZGxlIHN1YlRhc2soLi4uKSAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA3OCApCisJCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgeworCQkJCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhuYW1lKTsKKwkJCQl9CiAJCQl9KTsKIAkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiArK3RpY2tzIDw9IE1BWFRJQ0tTKQogCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKaW5kZXggNzBjNzM3Yi4uYTRhYTgyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9SZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSw1OCArMzEsNTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5TZWFyY2hhYmxlRW52aXJvbm1lbnQ7CiAKIHB1YmxpYyBjbGFzcyBSZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIgZXh0ZW5kcyBIaWVyYXJjaHlCdWlsZGVyIHsKLQkKKwogCXB1YmxpYyBSZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIoVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJCisKIAkJc3VwZXIoaGllcmFyY2h5KTsKIAl9Ci0JCisKIHB1YmxpYyB2b2lkIGJ1aWxkKGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB7Ci0JCQorCiAJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJdHJ5IHsKIAkJLy8gb3B0aW1pemUgYWNjZXNzIHRvIHppcCBmaWxlcyB3aGlsZSBidWlsZGluZyBoaWVyYXJjaHkKLQkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7Ci0JCQkJCisJCW1hbmFnZXIuY2FjaGVaaXBGaWxlcyh0aGlzKTsKKwogCQlpZiAodGhpcy5oaWVyYXJjaHkuZm9jdXNUeXBlID09IG51bGwgfHwgY29tcHV0ZVN1YnR5cGVzKSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHR5cGVJblJlZ2lvbk1vbml0b3IgPSAKLQkJCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IAotCQkJCQludWxsIDogCisJCQlJUHJvZ3Jlc3NNb25pdG9yIHR5cGVJblJlZ2lvbk1vbml0b3IgPQorCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8KKwkJCQkJbnVsbCA6CiAJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IodGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yLCAzMCk7CiAJCQlIYXNoTWFwIGFsbE9wZW5hYmxlc0luUmVnaW9uID0gZGV0ZXJtaW5lT3BlbmFibGVzSW5SZWdpb24odHlwZUluUmVnaW9uTW9uaXRvcik7CiAJCQl0aGlzLmhpZXJhcmNoeS5pbml0aWFsaXplKGFsbE9wZW5hYmxlc0luUmVnaW9uLnNpemUoKSk7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIGJ1aWxkTW9uaXRvciA9IAotCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gCi0JCQkJCW51bGwgOiAKKwkJCUlQcm9ncmVzc01vbml0b3IgYnVpbGRNb25pdG9yID0KKwkJCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/CisJCQkJCW51bGwgOgogCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciwgNzApOwogCQkJY3JlYXRlVHlwZUhpZXJhcmNoeUJhc2VkT25SZWdpb24oYWxsT3BlbmFibGVzSW5SZWdpb24sIGJ1aWxkTW9uaXRvcik7CiAJCQkoKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSl0aGlzLmhpZXJhcmNoeSkucHJ1bmVEZWFkQnJhbmNoZXMoKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoMSk7Ci0JCQl0aGlzLmJ1aWxkU3VwZXJ0eXBlcygpOworCQkJYnVpbGRTdXBlcnR5cGVzKCk7CiAJCX0KIAl9IGZpbmFsbHkgewotCQltYW5hZ2VyLmZsdXNoWmlwRmlsZXMoKTsKKwkJbWFuYWdlci5mbHVzaFppcEZpbGVzKHRoaXMpOwogCX0KIH0KIC8qKgogICogQ29uZmlndXJlIHRoaXMgdHlwZSBoaWVyYXJjaHkgdGhhdCBpcyBiYXNlZCBvbiBhIHJlZ2lvbi4KICAqLwogcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGVIaWVyYXJjaHlCYXNlZE9uUmVnaW9uKEhhc2hNYXAgYWxsT3BlbmFibGVzSW5SZWdpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQorCiAJdHJ5IHsKLQkJaW50IHNpemUgPSBhbGxPcGVuYWJsZXNJblJlZ2lvbi5zaXplKCk7CQkKKwkJaW50IHNpemUgPSBhbGxPcGVuYWJsZXNJblJlZ2lvbi5zaXplKCk7CiAJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuYmVnaW5UYXNrKCIiLCBzaXplICogMi8qIDEgZm9yIGJ1aWxkIGJpbmRpbmcsIDEgZm9yIGNvbm5lY3QgaGllcmFyY2h5Ki8pOyAvLyROT04tTkxTLTEkCiAJCXRoaXMuaW5mb1RvSGFuZGxlID0gbmV3IEhhc2hNYXAoc2l6ZSk7CiAJCUl0ZXJhdG9yIGphdmFQcm9qZWN0cyA9IGFsbE9wZW5hYmxlc0luUmVnaW9uLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGphdmFQcm9qZWN0cy5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGphdmFQcm9qZWN0cy5uZXh0KCk7ICAKKwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGphdmFQcm9qZWN0cy5uZXh0KCk7CiAJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBlbnRyeS5nZXRLZXkoKTsKIAkJCUFycmF5TGlzdCBhbGxPcGVuYWJsZXMgPSAoQXJyYXlMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOwogCQkJT3BlbmFibGVbXSBvcGVuYWJsZXMgPSBuZXcgT3BlbmFibGVbYWxsT3BlbmFibGVzLnNpemUoKV07CiAJCQlhbGxPcGVuYWJsZXMudG9BcnJheShvcGVuYWJsZXMpOwotCQorCiAJCQl0cnkgewogCQkJCS8vIHJlc29sdmUKIAkJCQlTZWFyY2hhYmxlRW52aXJvbm1lbnQgc2VhcmNoYWJsZUVudmlyb25tZW50ID0gcHJvamVjdC5uZXdTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KHRoaXMuaGllcmFyY2h5LndvcmtpbmdDb3BpZXMpOwpAQCAtOTAsMTMgKzkwLDEzIEBACiAJCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlci5yZXNvbHZlKG9wZW5hYmxlcywgbnVsbCwgbW9uaXRvcik7CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCS8vIHByb2plY3QgZG9lc24ndCBleGl0OiBpZ25vcmUKLQkJCX0gCisJCQl9CiAJCX0KIAl9IGZpbmFsbHkgewogCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKIAl9CiB9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGFsbCBvZiB0aGUgb3BlbmFibGVzIGRlZmluZWQgaW4gdGhlIHJlZ2lvbiBvZiB0aGlzIHR5cGUgaGllcmFyY2h5LgogCSAqIFJldHVybnMgYSBtYXAgZnJvbSBJSmF2YVByb2plY3QgdG8gQXJyYXlMaXN0IG9mIE9wZW5hYmxlCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogQWRkcyBhbGwgb2YgdGhlIG9wZW5hYmxlcyBkZWZpbmVkIHdpdGhpbiB0aGlzIGphdmEgcHJvamVjdCB0byB0aGUKIAkgKiBsaXN0LgpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCQkvLyBpZ25vcmUKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEFkZHMgYWxsIG9mIHRoZSBvcGVuYWJsZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHRvIHRoZQogCSAqIGxpc3QuCkBAIC0xNzksNyArMTc5LDcgQEAKIAlwcml2YXRlIHZvaWQgaW5qZWN0QWxsT3BlbmFibGVzRm9yUGFja2FnZUZyYWdtZW50KAogCQlJUGFja2FnZUZyYWdtZW50IHBhY2tGcmFnLAogCQlBcnJheUxpc3Qgb3BlbmFibGVzKSB7Ci0JCQkKKwogCQl0cnkgewogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja0ZyYWcuZ2V0UGFyZW50KCk7CiAJCQlpbnQga2luZCA9IHJvb3QuZ2V0S2luZCgpOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCQkvLyBpZ25vcmUKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIEFkZHMgYWxsIG9mIHRoZSBvcGVuYWJsZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdG8gdGhlCiAJICogbGlzdC4KQEAgLTIxOSw1ICsyMTksNSBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5LmphdmEKaW5kZXggNGRkMDhhYy4uZGM5YjkwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9SZWdpb25CYXNlZFR5cGVIaWVyYXJjaHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiw3ICsyNiw3IEBACiAJICogVGhlIHJlZ2lvbiBvZiB0eXBlcyBmb3Igd2hpY2ggdG8gYnVpbGQgdGhlIGhpZXJhcmNoeQogCSAqLwogCXByb3RlY3RlZCBJUmVnaW9uIHJlZ2lvbjsKLQkKKwogLyoqCiAgKiBDcmVhdGVzIGEgVHlwZUhpZXJhcmNoeSBvbiB0aGUgdHlwZXMgaW4gdGhlIHNwZWNpZmllZCByZWdpb24sCiAgKiBjb25zaWRlcmluZyBmaXJzdCB0aGUgZ2l2ZW4gd29ya2luZyBjb3BpZXMsCkBAIC0zNiwzNSArMzYsMzUgQEAKICAqLwogcHVibGljIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeShJUmVnaW9uIHJlZ2lvbiwgSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXMsIElUeXBlIHR5cGUsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB7CiAJc3VwZXIodHlwZSwgd29ya2luZ0NvcGllcywgKElKYXZhU2VhcmNoU2NvcGUpbnVsbCwgY29tcHV0ZVN1YnR5cGVzKTsKLQkKKwogCVJlZ2lvbiBuZXdSZWdpb24gPSBuZXcgUmVnaW9uKCkgewogCQlwdWJsaWMgdm9pZCBhZGQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKIAkJCWlmICghY29udGFpbnMoZWxlbWVudCkpIHsKIAkJCQkvLyJuZXciIGVsZW1lbnQgYWRkZWQgdG8gcmVnaW9uCiAJCQkJcmVtb3ZlQWxsQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJZlJvb3RFbGVtZW50cy5hZGQoZWxlbWVudCk7CisJCQkJdGhpcy5yb290RWxlbWVudHMuYWRkKGVsZW1lbnQpOwogCQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCQkvLyBhZGQgamFyIHJvb3RzIGFzIHdlbGwgc28gdGhhdCBqYXJzIGRvbid0IHJlbHkgb24gdGhlaXIgcGFyZW50IHRvIGtub3cgCisJCQkJCS8vIGFkZCBqYXIgcm9vdHMgYXMgd2VsbCBzbyB0aGF0IGphcnMgZG9uJ3QgcmVseSBvbiB0aGVpciBwYXJlbnQgdG8ga25vdwogCQkJCQkvLyBpZiB0aGV5IGFyZSBjb250YWluZWQgaW4gdGhlIHJlZ2lvbgogCQkJCQkvLyAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY2MTUpCiAJCQkJCXRyeSB7CiAJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gKChJSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CiAJCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAocm9vdHNbaV0uaXNBcmNoaXZlKCkgJiYgIWZSb290RWxlbWVudHMuY29udGFpbnMocm9vdHNbaV0pKQotCQkJCQkJCQlmUm9vdEVsZW1lbnRzLmFkZChyb290c1tpXSk7CisJCQkJCQkJaWYgKHJvb3RzW2ldLmlzQXJjaGl2ZSgpICYmICF0aGlzLnJvb3RFbGVtZW50cy5jb250YWlucyhyb290c1tpXSkpCisJCQkJCQkJCXRoaXMucm9vdEVsZW1lbnRzLmFkZChyb290c1tpXSk7CiAJCQkJCQl9CiAJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QKIAkJCQkJfQogCQkJCX0KLQkJCQlmUm9vdEVsZW1lbnRzLnRyaW1Ub1NpemUoKTsKKwkJCQl0aGlzLnJvb3RFbGVtZW50cy50cmltVG9TaXplKCk7CiAJCQl9CiAJCX0KIAl9OwogCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnaW9uLmdldEVsZW1lbnRzKCk7CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCW5ld1JlZ2lvbi5hZGQoZWxlbWVudHNbaV0pOwotCQkKKwogCX0KIAl0aGlzLnJlZ2lvbiA9IG5ld1JlZ2lvbjsKIAlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkKQEAgLTk2LDE3ICs5NiwxNyBAQAogCUhpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIodGhpcyk7CiAJYnVpbGRlci5idWlsZCh0aGlzLmNvbXB1dGVTdWJ0eXBlcyk7CiB9Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc0FmZmVjdGVkQnlPcGVuYWJsZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKK3Byb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0ZWRCeU9wZW5hYmxlKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewogCS8vIGNoYW5nZSB0byB3b3JraW5nIGNvcHkKIAlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCAmJiAoKENvbXBpbGF0aW9uVW5pdCllbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJcmV0dXJuIHN1cGVyLmlzQWZmZWN0ZWRCeU9wZW5hYmxlKGRlbHRhLCBlbGVtZW50KTsKKwkJcmV0dXJuIHN1cGVyLmlzQWZmZWN0ZWRCeU9wZW5hYmxlKGRlbHRhLCBlbGVtZW50LCBldmVudFR5cGUpOwogCX0KIAogCS8vIGlmIG5vIGZvY3VzLCBoaWVyYXJjaHkgaXMgYWZmZWN0ZWQgaWYgdGhlIGVsZW1lbnQgaXMgcGFydCBvZiB0aGUgcmVnaW9uCiAJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHsKIAkJcmV0dXJuIHRoaXMucmVnaW9uLmNvbnRhaW5zKGVsZW1lbnQpOwogCX0gZWxzZSB7Ci0JCXJldHVybiBzdXBlci5pc0FmZmVjdGVkQnlPcGVuYWJsZShkZWx0YSwgZWxlbWVudCk7CisJCXJldHVybiBzdXBlci5pc0FmZmVjdGVkQnlPcGVuYWJsZShkZWx0YSwgZWxlbWVudCwgZXZlbnRUeXBlKTsKIAl9CiB9CiAvKioKQEAgLTE0MiwxMSArMTQyLDExIEBACiAgKiByZW1vdmVzIGl0cyBzdXBlcmNsYXNzIGVudHJ5IGFuZCByZW1vdmVzIHRoZSByZWZlcmVuY2VzIGZyb20gaXRzIHN1cGVyIHR5cGVzLgogICovCiBwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlKElUeXBlIHR5cGUpIHsKLQlJVHlwZVtdIHN1YnR5cGVzID0gdGhpcy5nZXRTdWJ0eXBlcyh0eXBlKTsKKwlJVHlwZVtdIHN1YnR5cGVzID0gZ2V0U3VidHlwZXModHlwZSk7CiAJdGhpcy50eXBlVG9TdWJ0eXBlcy5yZW1vdmUodHlwZSk7CiAJaWYgKHN1YnR5cGVzICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IHN1YnR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLnJlbW92ZVR5cGUoc3VidHlwZXNbaV0pOworCQkJcmVtb3ZlVHlwZShzdWJ0eXBlc1tpXSk7CiAJCX0KIAl9CiAJSVR5cGUgc3VwZXJjbGFzcyA9IChJVHlwZSl0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLnJlbW92ZSh0eXBlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9UeXBlSGllcmFyY2h5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvVHlwZUhpZXJhcmNoeS5qYXZhCmluZGV4IDczOTc3MDMuLjFiZmRmOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9UeXBlSGllcmFyY2h5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zOSw3ICszOSw3IEBACiBwdWJsaWMgY2xhc3MgVHlwZUhpZXJhcmNoeSBpbXBsZW1lbnRzIElUeXBlSGllcmFyY2h5LCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7CiAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkKKwogCXN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAweDAwMDA7CiAJLy8gU0VQQVJBVE9SCiAJc3RhdGljIGZpbmFsIGJ5dGUgU0VQQVJBVE9SMSA9ICdcbic7CkBAIC00OCw3ICs0OCw3IEBACiAJc3RhdGljIGZpbmFsIGJ5dGUgU0VQQVJBVE9SNCA9ICdccic7CiAJLy8gZ2VuZXJhbCBpbmZvCiAJc3RhdGljIGZpbmFsIGJ5dGUgQ09NUFVURV9TVUJUWVBFUyA9IDB4MDAwMTsKLQkKKwogCS8vIHR5cGUgaW5mbwogCXN0YXRpYyBmaW5hbCBieXRlIENMQVNTID0gMHgwMDAwOwogCXN0YXRpYyBmaW5hbCBieXRlIElOVEVSRkFDRSA9IDB4MDAwMTsKQEAgLTU4LDcgKzU4LDcgQEAKIAkvLyBjc3QKIAlzdGF0aWMgZmluYWwgYnl0ZVtdIE5PX0ZMQUdTID0gbmV3IGJ5dGVbXXt9OwogCXN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDEwOwotCQorCiAJLyoqCiAJICogVGhlIEphdmEgUHJvamVjdCBpbiB3aGljaCB0aGUgaGllcmFyY2h5IGlzIGJlaW5nIGJ1aWx0IC0gdGhpcwogCSAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciBkZXRlcm1pbmluZyBhIGNsYXNzcGF0aCBhbmQgbmFtZWxvb2t1cCBydWxlcy4KQEAgLTcwLDcgKzcwLDcgQEAKIAkgKiBwb3NzaWJseSBudWxsLgogCSAqLwogCXByb3RlY3RlZCBJVHlwZSBmb2N1c1R5cGU7Ci0JCisKIAkvKgogCSAqIFRoZSB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCiAJICovCkBAIC04Myw5ICs4Myw5IEBACiAJcHJvdGVjdGVkIFR5cGVWZWN0b3Igcm9vdENsYXNzZXMgPSBuZXcgVHlwZVZlY3RvcigpOwogCXByb3RlY3RlZCBBcnJheUxpc3QgaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3QoMTApOwogCXB1YmxpYyBBcnJheUxpc3QgbWlzc2luZ1R5cGVzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkKKwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVR5cGVbXSBOT19UWVBFID0gbmV3IElUeXBlWzBdOwotCQorCiAJLyoqCiAJICogVGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkIHRvby4KIAkgKi8KQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqIGhpZXJhcmNoeS4gTnVsbCBpZiBub3QgYWN0aXZhdGVkLgogCSAqLwogCXByb3RlY3RlZCBSZWdpb24gcHJvamVjdFJlZ2lvbiA9IG51bGw7Ci0JCisKIAkvKioKIAkgKiBXaGV0aGVyIHRoaXMgaGllcmFyY2h5IHNob3VsZCBjb250YWlucyBzdWJ0eXBlcy4KIAkgKi8KQEAgLTEyMiwxMiArMTIyLDEyIEBACiAJICogVGhlIHNjb3BlIHRoaXMgaGllcmFyY2h5IHNob3VsZCByZXN0cmFpbiBpdHNlZiBpbi4KIAkgKi8KIAlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOwotCQorCiAJLyoKIAkgKiBXaGV0aGVyIHRoaXMgaGllcmFyY2h5IG5lZWRzIHJlZnJlc2gKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBuZWVkc1JlZnJlc2ggPSB0cnVlOwotCQorCiAJLyoKIAkgKiBDb2xsZWN0cyBjaGFuZ2VzIHRvIHR5cGVzCiAJICovCkBAIC0yMjgsMTIgKzIyOCwxMiBAQAogCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewogCQl0aGlzLmNoYW5nZUxpc3RlbmVycyA9IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKIAl9Ci0JCisKIAkvLyByZWdpc3RlciB3aXRoIEphdmFDb3JlIHRvIGdldCBKYXZhIGVsZW1lbnQgZGVsdGEgb24gZmlyc3QgbGlzdGVuZXIgYWRkZWQKIAlpZiAobGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CiAJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CiAJfQotCQorCiAJLy8gYWRkIGxpc3RlbmVyIG9ubHkgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudAogCWlmIChsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcikgPT0gLTEpIHsKIAkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CkBAIC0yNjAsNyArMjYwLDcgQEAKIAlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAJCXRoaXMuY2xhc3NUb1N1cGVyY2xhc3MucHV0KHR5cGUsIHN1cGVyY2xhc3MpOwogCQlhZGRTdWJ0eXBlKHN1cGVyY2xhc3MsIHR5cGUpOwotCX0gCisJfQogfQogLyoqCiAgKiBDYWNoZXMgYWxsIG9mIHRoZSBzdXBlcmludGVyZmFjZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGZvciB0aGUKQEAgLTI5Myw5ICsyOTMsOSBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CiAJaWYgKHRoaXMuZm9jdXNUeXBlICE9IG51bGwpIHsKLQkJSGllcmFyY2h5QnVpbGRlciBidWlsZGVyID0gCisJCUhpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciA9CiAJCQluZXcgSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIoCi0JCQkJdGhpcywgCisJCQkJdGhpcywKIAkJCQl0aGlzLnNjb3BlKTsKIAkJYnVpbGRlci5idWlsZCh0aGlzLmNvbXB1dGVTdWJ0eXBlcyk7CiAJfSAvLyBlbHNlIGEgUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5IHNob3VsZCBiZSB1c2VkCkBAIC0zMTQsMTggKzMxNCwxOCBAQAogCiAJLy8gaW50ZXJmYWNlcwogCWlmICh0aGlzLmludGVyZmFjZXMuY29udGFpbnModHlwZSkpIHJldHVybiB0cnVlOwotCQorCiAJcmV0dXJuIGZhbHNlOwogfQogLyoqCi0gKiBEZXRlcm1pbmVzIGlmIHRoZSBjaGFuZ2UgZWZmZWN0cyB0aGlzIGhpZXJhcmNoeSwgYW5kIGZpcmVzCisgKiBEZXRlcm1pbmVzIGlmIHRoZSBjaGFuZ2UgYWZmZWN0cyB0aGlzIGhpZXJhcmNoeSwgYW5kIGZpcmVzCiAgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHJlcXVpcmVkLgogICovCiBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7CiAJLy8gdHlwZSBoaWVyYXJjaHkgY2hhbmdlIGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQKIAlpZiAodGhpcy5uZWVkc1JlZnJlc2gpIHJldHVybjsKLQkKLQlpZiAoaXNBZmZlY3RlZChldmVudC5nZXREZWx0YSgpKSkgeworCisJaWYgKGlzQWZmZWN0ZWQoZXZlbnQuZ2V0RGVsdGEoKSwgZXZlbnQuZ2V0VHlwZSgpKSkgewogCQl0aGlzLm5lZWRzUmVmcmVzaCA9IHRydWU7CiAJCWZpcmVDaGFuZ2UoKTsKIAl9CkBAIC0zMzUsOCArMzM1LDggQEAKICAqLwogcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewogCWlmICghdGhpcy5uZWVkc1JlZnJlc2gpIHJldHVybiB0cnVlOwotCQotCXJldHVybiAodGhpcy5mb2N1c1R5cGUgPT0gbnVsbCB8fCB0aGlzLmZvY3VzVHlwZS5leGlzdHMoKSkgJiYgdGhpcy5qYXZhUHJvamVjdCgpLmV4aXN0cygpOworCisJcmV0dXJuICh0aGlzLmZvY3VzVHlwZSA9PSBudWxsIHx8IHRoaXMuZm9jdXNUeXBlLmV4aXN0cygpKSAmJiBqYXZhUHJvamVjdCgpLmV4aXN0cygpOwogfQogLyoqCiAgKiBOb3RpZmllcyBsaXN0ZW5lcnMgdGhhdCB0aGlzIGhpZXJhcmNoeSBoYXMgY2hhbmdlZCBhbmQgbmVlZHMKQEAgLTM0NCw3ICszNDQsNyBAQAogICogdGhyb3VnaCB0aGUgbGlzdC4KICAqLwogcHVibGljIHZvaWQgZmlyZUNoYW5nZSgpIHsKLQlBcnJheUxpc3QgbGlzdGVuZXJzID0gdGhpcy5jaGFuZ2VMaXN0ZW5lcnM7CisJQXJyYXlMaXN0IGxpc3RlbmVycyA9IGdldENsb25lZENoYW5nZUxpc3RlbmVycygpOyAvLyBjbG9uZSBzbyB0aGF0IGEgbGlzdGVuZXIgY2Fubm90IGhhdmUgYSBzaWRlLWVmZmVjdCBvbiB0aGlzIGxpc3Qgd2hlbiBiZWluZyBub3RpZmllZAogCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewogCQlyZXR1cm47CiAJfQpAQCAtMzU0LDggKzM1NCw3IEBACiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3IgaGllcmFyY2h5IGZvY3VzZWQgb24gIiArICgoSmF2YUVsZW1lbnQpdGhpcy5mb2N1c1R5cGUpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQotCS8vIGNsb25lIHNvIHRoYXQgYSBsaXN0ZW5lciBjYW5ub3QgaGF2ZSBhIHNpZGUtZWZmZWN0IG9uIHRoaXMgbGlzdCB3aGVuIGJlaW5nIG5vdGlmaWVkCi0JbGlzdGVuZXJzID0gKEFycmF5TGlzdClsaXN0ZW5lcnMuY2xvbmUoKTsKKwkKIAlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7CiAJCWZpbmFsIElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyPSAoSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIpbGlzdGVuZXJzLmdldChpKTsKIAkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CkBAIC0zNjgsNiArMzY3LDEzIEBACiAJCX0pOwogCX0KIH0KK3ByaXZhdGUgc3luY2hyb25pemVkIEFycmF5TGlzdCBnZXRDbG9uZWRDaGFuZ2VMaXN0ZW5lcnMoKSB7CisJQXJyYXlMaXN0IGxpc3RlbmVycyA9IHRoaXMuY2hhbmdlTGlzdGVuZXJzOworCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIChBcnJheUxpc3QpIGxpc3RlbmVycy5jbG9uZSgpOworfQogcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGZsYWdzVG9CeXRlcyhJbnRlZ2VyIGZsYWdzKXsKIAlpZihmbGFncyAhPSBudWxsKSB7CiAJCXJldHVybiBmbGFncy50b1N0cmluZygpLmdldEJ5dGVzKCk7CkBAIC00MzgsNTQgKzQ0NCw2MiBAQAogICogQHNlZSBJVHlwZUhpZXJhcmNoeQogICovCiBwdWJsaWMgSVR5cGVbXSBnZXRBbGxTdXBlckludGVyZmFjZXMoSVR5cGUgdHlwZSkgewotCUFycmF5TGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JaWYgKHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmdldCh0eXBlKSA9PSBudWxsKSB7CisJQXJyYXlMaXN0IHN1cGVycyA9IGdldEFsbFN1cGVySW50ZXJmYWNlczAodHlwZSwgbnVsbCk7CisJaWYgKHN1cGVycyA9PSBudWxsKQogCQlyZXR1cm4gTk9fVFlQRTsKLQl9Ci0JZ2V0QWxsU3VwZXJJbnRlcmZhY2VzMCh0eXBlLCBzdXBlcnMpOwogCUlUeXBlW10gc3VwZXJpbnRlcmZhY2VzID0gbmV3IElUeXBlW3N1cGVycy5zaXplKCldOwogCXN1cGVycy50b0FycmF5KHN1cGVyaW50ZXJmYWNlcyk7CiAJcmV0dXJuIHN1cGVyaW50ZXJmYWNlczsKIH0KLXByaXZhdGUgdm9pZCBnZXRBbGxTdXBlckludGVyZmFjZXMwKElUeXBlIHR5cGUsIEFycmF5TGlzdCBzdXBlcnMpIHsKK3ByaXZhdGUgQXJyYXlMaXN0IGdldEFsbFN1cGVySW50ZXJmYWNlczAoSVR5cGUgdHlwZSwgQXJyYXlMaXN0IHN1cGVycykgewogCUlUeXBlW10gc3VwZXJpbnRlcmZhY2VzID0gKElUeXBlW10pIHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmdldCh0eXBlKTsKLQlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwgJiYgc3VwZXJpbnRlcmZhY2VzLmxlbmd0aCAhPSAwKSB7CisJaWYgKHN1cGVyaW50ZXJmYWNlcyA9PSBudWxsKSAvLyB0eXBlIGlzIG5vdCBwYXJ0IG9mIHRoZSBoaWVyYXJjaHkKKwkJcmV0dXJuIHN1cGVyczsKKwlpZiAoc3VwZXJpbnRlcmZhY2VzLmxlbmd0aCAhPSAwKSB7CisJCWlmIChzdXBlcnMgPT0gbnVsbCkKKwkJCXN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJYWRkQWxsQ2hlY2tpbmdEdXBsaWNhdGVzKHN1cGVycywgc3VwZXJpbnRlcmZhY2VzKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcmludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWdldEFsbFN1cGVySW50ZXJmYWNlczAoc3VwZXJpbnRlcmZhY2VzW2ldLCBzdXBlcnMpOworCQkJc3VwZXJzID0gZ2V0QWxsU3VwZXJJbnRlcmZhY2VzMChzdXBlcmludGVyZmFjZXNbaV0sIHN1cGVycyk7CiAJCX0KIAl9CiAJSVR5cGUgc3VwZXJjbGFzcyA9IChJVHlwZSkgdGhpcy5jbGFzc1RvU3VwZXJjbGFzcy5nZXQodHlwZSk7CiAJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQlnZXRBbGxTdXBlckludGVyZmFjZXMwKHN1cGVyY2xhc3MsIHN1cGVycyk7CisJCXN1cGVycyA9IGdldEFsbFN1cGVySW50ZXJmYWNlczAoc3VwZXJjbGFzcywgc3VwZXJzKTsKIAl9CisJcmV0dXJuIHN1cGVyczsKIH0KIC8qKgogICogQHNlZSBJVHlwZUhpZXJhcmNoeQogICovCiBwdWJsaWMgSVR5cGVbXSBnZXRBbGxTdXBlcnR5cGVzKElUeXBlIHR5cGUpIHsKLQlBcnJheUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCWlmICh0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcy5nZXQodHlwZSkgPT0gbnVsbCkgeworCUFycmF5TGlzdCBzdXBlcnMgPSBnZXRBbGxTdXBlcnR5cGVzMCh0eXBlLCBudWxsKTsKKwlpZiAoc3VwZXJzID09IG51bGwpCiAJCXJldHVybiBOT19UWVBFOwotCX0KLQlnZXRBbGxTdXBlcnR5cGVzMCh0eXBlLCBzdXBlcnMpOwogCUlUeXBlW10gc3VwZXJ0eXBlcyA9IG5ldyBJVHlwZVtzdXBlcnMuc2l6ZSgpXTsKIAlzdXBlcnMudG9BcnJheShzdXBlcnR5cGVzKTsKIAlyZXR1cm4gc3VwZXJ0eXBlczsKIH0KLXByaXZhdGUgdm9pZCBnZXRBbGxTdXBlcnR5cGVzMChJVHlwZSB0eXBlLCBBcnJheUxpc3Qgc3VwZXJzKSB7Citwcml2YXRlIEFycmF5TGlzdCBnZXRBbGxTdXBlcnR5cGVzMChJVHlwZSB0eXBlLCBBcnJheUxpc3Qgc3VwZXJzKSB7CiAJSVR5cGVbXSBzdXBlcmludGVyZmFjZXMgPSAoSVR5cGVbXSkgdGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMuZ2V0KHR5cGUpOwotCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCAmJiBzdXBlcmludGVyZmFjZXMubGVuZ3RoICE9IDApIHsKKwlpZiAoc3VwZXJpbnRlcmZhY2VzID09IG51bGwpIC8vIHR5cGUgaXMgbm90IHBhcnQgb2YgdGhlIGhpZXJhcmNoeQorCQlyZXR1cm4gc3VwZXJzOworCWlmIChzdXBlcmludGVyZmFjZXMubGVuZ3RoICE9IDApIHsKKwkJaWYgKHN1cGVycyA9PSBudWxsKQorCQkJc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwogCQlhZGRBbGxDaGVja2luZ0R1cGxpY2F0ZXMoc3VwZXJzLCBzdXBlcmludGVyZmFjZXMpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJZ2V0QWxsU3VwZXJJbnRlcmZhY2VzMChzdXBlcmludGVyZmFjZXNbaV0sIHN1cGVycyk7CisJCQlzdXBlcnMgPSBnZXRBbGxTdXBlckludGVyZmFjZXMwKHN1cGVyaW50ZXJmYWNlc1tpXSwgc3VwZXJzKTsKIAkJfQogCX0KIAlJVHlwZSBzdXBlcmNsYXNzID0gKElUeXBlKSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmdldCh0eXBlKTsKIAlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCWlmIChzdXBlcnMgPT0gbnVsbCkKKwkJCXN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJc3VwZXJzLmFkZChzdXBlcmNsYXNzKTsKLQkJZ2V0QWxsU3VwZXJ0eXBlczAoc3VwZXJjbGFzcywgc3VwZXJzKTsKKwkJc3VwZXJzID0gZ2V0QWxsU3VwZXJ0eXBlczAoc3VwZXJjbGFzcywgc3VwZXJzKTsKIAl9CisJcmV0dXJuIHN1cGVyczsKIH0KIC8qKgogICogQHNlZSBJVHlwZUhpZXJhcmNoeQpAQCAtNTE2LDcgKzUzMCw3IEBACiAgKiBAc2VlIElUeXBlSGllcmFyY2h5CiAgKi8KIHB1YmxpYyBJVHlwZVtdIGdldEV4dGVuZGluZ0ludGVyZmFjZXMoSVR5cGUgdHlwZSkgewotCWlmICghdGhpcy5pc0ludGVyZmFjZSh0eXBlKSkgcmV0dXJuIE5PX1RZUEU7CisJaWYgKCFpc0ludGVyZmFjZSh0eXBlKSkgcmV0dXJuIE5PX1RZUEU7CiAJcmV0dXJuIGdldEV4dGVuZGluZ0ludGVyZmFjZXMwKHR5cGUpOwogfQogLyoqCkBAIC01MjksNyArNTQzLDcgQEAKIAl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKIAkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CiAJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGVudHJ5LmdldEtleSgpOwotCQlpZiAoIXRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKKwkJaWYgKCFpc0ludGVyZmFjZSh0eXBlKSkgewogCQkJY29udGludWU7CiAJCX0KIAkJSVR5cGVbXSBzdXBlckludGVyZmFjZXMgPSAoSVR5cGVbXSkgZW50cnkuZ2V0VmFsdWUoKTsKQEAgLTU1MCw3ICs1NjQsNyBAQAogICogQHNlZSBJVHlwZUhpZXJhcmNoeQogICovCiBwdWJsaWMgSVR5cGVbXSBnZXRJbXBsZW1lbnRpbmdDbGFzc2VzKElUeXBlIHR5cGUpIHsKLQlpZiAoIXRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKKwlpZiAoIWlzSW50ZXJmYWNlKHR5cGUpKSB7CiAJCXJldHVybiBOT19UWVBFOwogCX0KIAlyZXR1cm4gZ2V0SW1wbGVtZW50aW5nQ2xhc3NlczAodHlwZSk7CkBAIC01NjAsMTMgKzU3NCwxMyBAQAogICogQHNlZSAjZ2V0SW1wbGVtZW50aW5nQ2xhc3NlcwogICovCiBwcml2YXRlIElUeXBlW10gZ2V0SW1wbGVtZW50aW5nQ2xhc3NlczAoSVR5cGUgaW50ZXJmY2UpIHsKLQkKKwogCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CiAJQXJyYXlMaXN0IGlNZW50ZXJzID0gbmV3IEFycmF5TGlzdCgpOwogCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewogCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKIAkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZW50cnkuZ2V0S2V5KCk7Ci0JCWlmICh0aGlzLmlzSW50ZXJmYWNlKHR5cGUpKSB7CisJCWlmIChpc0ludGVyZmFjZSh0eXBlKSkgewogCQkJY29udGludWU7CiAJCX0KIAkJSVR5cGVbXSB0eXBlcyA9IChJVHlwZVtdKSBlbnRyeS5nZXRWYWx1ZSgpOwpAQCAtNjEwLDEzICs2MjQsMTMgQEAKICAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKICAqLwogcHVibGljIElUeXBlW10gZ2V0U3ViY2xhc3NlcyhJVHlwZSB0eXBlKSB7Ci0JaWYgKHRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKKwlpZiAoaXNJbnRlcmZhY2UodHlwZSkpIHsKIAkJcmV0dXJuIE5PX1RZUEU7CiAJfQogCVR5cGVWZWN0b3IgdmVjdG9yID0gKFR5cGVWZWN0b3IpdGhpcy50eXBlVG9TdWJ0eXBlcy5nZXQodHlwZSk7CiAJaWYgKHZlY3RvciA9PSBudWxsKQogCQlyZXR1cm4gTk9fVFlQRTsKLQllbHNlIAorCWVsc2UKIAkJcmV0dXJuIHZlY3Rvci5lbGVtZW50cygpOwogfQogLyoqCkBAIC02MzIsMTQgKzY0NiwxNCBAQAogCVR5cGVWZWN0b3IgdmVjdG9yID0gKFR5cGVWZWN0b3IpdGhpcy50eXBlVG9TdWJ0eXBlcy5nZXQodHlwZSk7CiAJaWYgKHZlY3RvciA9PSBudWxsKQogCQlyZXR1cm4gTk9fVFlQRTsKLQllbHNlIAorCWVsc2UKIAkJcmV0dXJuIHZlY3Rvci5lbGVtZW50cygpOwogfQogLyoqCiAgKiBAc2VlIElUeXBlSGllcmFyY2h5CiAgKi8KIHB1YmxpYyBJVHlwZSBnZXRTdXBlcmNsYXNzKElUeXBlIHR5cGUpIHsKLQlpZiAodGhpcy5pc0ludGVyZmFjZSh0eXBlKSkgeworCWlmIChpc0ludGVyZmFjZSh0eXBlKSkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAJcmV0dXJuIChJVHlwZSkgdGhpcy5jbGFzc1RvU3VwZXJjbGFzcy5nZXQodHlwZSk7CkBAIC03MjksNyArNzQzLDcgQEAKICAqIFJldHVybnMgd2hldGhlciBvbmUgb2YgdGhlIHR5cGVzIGluIHRoaXMgaGllcmFyY2h5IGhhcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCiAgKi8KIHByaXZhdGUgYm9vbGVhbiBoYXNUeXBlTmFtZWQoU3RyaW5nIHNpbXBsZU5hbWUpIHsKLQlJVHlwZVtdIHR5cGVzID0gdGhpcy5nZXRBbGxUeXBlcygpOworCUlUeXBlW10gdHlwZXMgPSBnZXRBbGxUeXBlcygpOwogCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAodHlwZXNbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoc2ltcGxlTmFtZSkpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNzM5LDE0ICs3NTMsMTQgQEAKIH0KIAogLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcyBpcyAKKyAqIFJldHVybnMgd2hldGhlciB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGdpdmVuIHR5cGUgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzIGlzCiAgKiB0aGUgc2ltcGxlIG5hbWUgb2Ygb25lIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeS4KICAqLwogYm9vbGVhbiBpbmNsdWRlc1R5cGVPclN1cGVydHlwZShJVHlwZSB0eXBlKSB7CiAJdHJ5IHsKIAkJLy8gY2hlY2sgdHlwZQogCQlpZiAoaGFzVHlwZU5hbWVkKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpIHJldHVybiB0cnVlOwotCQkKKwogCQkvLyBjaGVjayBzdXBlcmNsYXNzCiAJCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IHR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKIAkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpIHsKQEAgLTc1NCw3ICs3NjgsNyBAQAogCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBzdXBlcmNsYXNzTmFtZS5zdWJzdHJpbmcobGFzdFNlcGFyYXRvcisxKTsKIAkJCWlmIChoYXNUeXBlTmFtZWQoc2ltcGxlTmFtZSkpIHJldHVybiB0cnVlOwogCQl9Ci0JCisKIAkJLy8gY2hlY2sgc3VwZXJpbnRlcmZhY2VzCiAJCVN0cmluZ1tdIHN1cGVyaW50ZXJmYWNlTmFtZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKIAkJaWYgKHN1cGVyaW50ZXJmYWNlTmFtZXMgIT0gbnVsbCkgewpAQCAtNzg1LDQxICs3OTksNDMgQEAKIAl0aGlzLnR5cGVUb1N1YnR5cGVzID0gbmV3IEhhc2hNYXAoc21hbGxTaXplKTsKIAl0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwKHNtYWxsU2l6ZSk7CiAJdGhpcy50eXBlRmxhZ3MgPSBuZXcgSGFzaE1hcChzbWFsbFNpemUpOwotCQorCiAJdGhpcy5wcm9qZWN0UmVnaW9uID0gbmV3IFJlZ2lvbigpOwogCXRoaXMucGFja2FnZVJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKIAl0aGlzLmZpbGVzID0gbmV3IEhhc2hNYXAoNSk7CiB9CiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVsdGEgY291bGQgY2hhbmdlIHRoaXMgdHlwZSBoaWVyYXJjaHkKKyAqIEBwYXJhbSBldmVudFR5cGUgVE9ETwogICovCi1wdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBZmZlY3RlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQWZmZWN0ZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGludCBldmVudFR5cGUpIHsKIAlJSmF2YUVsZW1lbnQgZWxlbWVudD0gZGVsdGEuZ2V0RWxlbWVudCgpOwogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6Ci0JCQlyZXR1cm4gaXNBZmZlY3RlZEJ5SmF2YU1vZGVsKGRlbHRhLCBlbGVtZW50KTsKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlKYXZhTW9kZWwoZGVsdGEsIGVsZW1lbnQsIGV2ZW50VHlwZSk7CiAJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKLQkJCXJldHVybiBpc0FmZmVjdGVkQnlKYXZhUHJvamVjdChkZWx0YSwgZWxlbWVudCk7CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5SmF2YVByb2plY3QoZGVsdGEsIGVsZW1lbnQsIGV2ZW50VHlwZSk7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKLQkJCXJldHVybiBpc0FmZmVjdGVkQnlQYWNrYWdlRnJhZ21lbnRSb290KGRlbHRhLCBlbGVtZW50KTsKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlQYWNrYWdlRnJhZ21lbnRSb290KGRlbHRhLCBlbGVtZW50LCBldmVudFR5cGUpOwogCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJcmV0dXJuIGlzQWZmZWN0ZWRCeVBhY2thZ2VGcmFnbWVudChkZWx0YSwgKFBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCk7CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50KGRlbHRhLCAoUGFja2FnZUZyYWdtZW50KSBlbGVtZW50LCBldmVudFR5cGUpOwogCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOgogCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgotCQkJcmV0dXJuIGlzQWZmZWN0ZWRCeU9wZW5hYmxlKGRlbHRhLCBlbGVtZW50KTsKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlPcGVuYWJsZShkZWx0YSwgZWxlbWVudCwgZXZlbnRUeXBlKTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBjaGlsZHJlbiBvZiBhIHByb2plY3QsIHBhY2thZ2UKICAqIGZyYWdtZW50IHJvb3QsIG9yIHBhY2thZ2UgZnJhZ21lbnQgaGF2ZSBjaGFuZ2VkIGluIGEgd2F5IHRoYXQKLSAqIGVmZmVjdHMgdGhpcyB0eXBlIGhpZXJhcmNoeS4KKyAqIGFmZmVjdHMgdGhpcyB0eXBlIGhpZXJhcmNoeS4KKyAqIEBwYXJhbSBldmVudFR5cGUgVE9ETwogICovCi1wcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5Q2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKK3ByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlDaGlsZHJlbihJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IGV2ZW50VHlwZSkgewogCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pID4gMCkgewogCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CiAJCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzQWZmZWN0ZWQoY2hpbGRyZW5baV0pKSB7CisJCQlpZiAoaXNBZmZlY3RlZChjaGlsZHJlbltpXSwgZXZlbnRUeXBlKSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9CkBAIC04MjgsMjEgKzg0NCwyMyBAQAogfQogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGphdmEgbW9kZWwgZGVsdGEgY291bGQgYWZmZWN0IHRoaXMgdHlwZSBoaWVyYXJjaHkKKyAqIEBwYXJhbSBldmVudFR5cGUgVE9ETwogICovCi1wcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5SmF2YU1vZGVsKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworcHJpdmF0ZSBib29sZWFuIGlzQWZmZWN0ZWRCeUphdmFNb2RlbChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUpIHsKIAlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewogCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEIDoKIAkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKLQkJCXJldHVybiBlbGVtZW50LmVxdWFscyh0aGlzLmphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOworCQkJcmV0dXJuIGVsZW1lbnQuZXF1YWxzKGphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOwogCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgOgotCQkJcmV0dXJuIGlzQWZmZWN0ZWRCeUNoaWxkcmVuKGRlbHRhKTsKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlDaGlsZHJlbihkZWx0YSwgZXZlbnRUeXBlKTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBkZWx0YSBjb3VsZCBhZmZlY3QgdGhpcyB0eXBlIGhpZXJhcmNoeQorICogQHBhcmFtIGV2ZW50VHlwZSBUT0RPCiAgKi8KLXByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlKYXZhUHJvamVjdChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKK3ByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlKYXZhUHJvamVjdChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUpIHsKICAgICBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKICAgICBpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwogICAgIGlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkgewpAQCAtODU1LDkgKzg3Myw5IEBACiAJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOgogCQkJdHJ5IHsKIAkJCQkvLyBpZiB0aGUgYWRkZWQgcHJvamVjdCBpcyBvbiB0aGUgY2xhc3NwYXRoLCB0aGVuIHRoZSBoaWVyYXJjaHkgaGFzIGNoYW5nZWQKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSAoKEphdmFQcm9qZWN0KXRoaXMuamF2YVByb2plY3QoKSkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgoKTsKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSAoKEphdmFQcm9qZWN0KWphdmFQcm9qZWN0KCkpLmdldEV4cGFuZGVkQ2xhc3NwYXRoKCk7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgCisJCQkJCWlmIChjbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUCiAJCQkJCQkJJiYgY2xhc3NwYXRoW2ldLmdldFBhdGgoKS5lcXVhbHMoZWxlbWVudC5nZXRQYXRoKCkpKSB7CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJfQpAQCAtODY3LDcgKzg4NSw3IEBACiAJCQkJCWNsYXNzcGF0aCA9ICgoSmF2YVByb2plY3QpZWxlbWVudCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgoKTsKIAkJCQkJSVBhdGggaGllcmFyY2h5UHJvamVjdCA9IGphdmFQcm9qZWN0KCkuZ2V0UGF0aCgpOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgCisJCQkJCQlpZiAoY2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVAogCQkJCQkJCQkmJiBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhoaWVyYXJjaHlQcm9qZWN0KSkgewogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJfQpAQCAtODg5LDE0ICs5MDcsMTUgQEAKIAkJCX0KIAkJCXJldHVybiBmYWxzZTsKIAkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDoKLQkJCXJldHVybiBpc0FmZmVjdGVkQnlDaGlsZHJlbihkZWx0YSk7CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5Q2hpbGRyZW4oZGVsdGEsIGV2ZW50VHlwZSk7CiAJfQogCXJldHVybiBmYWxzZTsKIH0KIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IGRlbHRhIGNvdWxkIGFmZmVjdCB0aGlzIHR5cGUgaGllcmFyY2h5CisgKiBAcGFyYW0gZXZlbnRUeXBlIFRPRE8KICAqLwotcHJpdmF0ZSBib29sZWFuIGlzQWZmZWN0ZWRCeVBhY2thZ2VGcmFnbWVudChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgUGFja2FnZUZyYWdtZW50IGVsZW1lbnQpIHsKK3ByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlQYWNrYWdlRnJhZ21lbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIFBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlKSB7CiAJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKIAkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6CiAJCQkvLyBpZiB0aGUgcGFja2FnZSBmcmFnbWVudCBpcyBpbiB0aGUgcHJvamVjdHMgYmVpbmcgY29uc2lkZXJlZCwgdGhpcyBjb3VsZApAQCAtOTA3LDE0ICs5MjYsMTUgQEAKIAkJCXJldHVybiBwYWNrYWdlUmVnaW9uQ29udGFpbnNTYW1lUGFja2FnZUZyYWdtZW50KGVsZW1lbnQpOwogCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgOgogCQkJLy8gbG9vayBhdCB0aGUgZmlsZXMgaW4gdGhlIHBhY2thZ2UgZnJhZ21lbnQKLQkJCXJldHVybiBpc0FmZmVjdGVkQnlDaGlsZHJlbihkZWx0YSk7CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5Q2hpbGRyZW4oZGVsdGEsIGV2ZW50VHlwZSk7CiAJfQogCXJldHVybiBmYWxzZTsKIH0KIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZGVsdGEgY291bGQgYWZmZWN0IHRoaXMgdHlwZSBoaWVyYXJjaHkKKyAqIEBwYXJhbSBldmVudFR5cGUgVE9ETwogICovCi1wcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50Um9vdChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKK3ByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlQYWNrYWdlRnJhZ21lbnRSb290KElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewogCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOgogCQkJcmV0dXJuIHRoaXMucHJvamVjdFJlZ2lvbi5jb250YWlucyhlbGVtZW50KTsKQEAgLTk0MCwxMSArOTYwLDExIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDAgfHwgKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSA+IDApIHsKKwkJCWlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpID4gMCB8fCAoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEKSA+IDApIHsKIAkJCQkvLyAxLiByZW1vdmVkIGZyb20gY2xhc3NwYXRoIC0gaWYgaXQgY29udGFpbnMgcGFja2FnZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4KIAkJCQkvLyB0aGUgdGhlIHR5cGUgaGllcmFyY2h5IGhhcyBjaGFuZ2VkCiAJCQkJLy8gMi4gY29udGVudCBvZiBhIGphciBjaGFuZ2VkIC0gaWYgaXQgY29udGFpbnMgcGFja2FnZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJCQkvLyB0aGUgdGhlIHR5cGUgaGllcmFyY2h5IGhhcyBjaGFuZ2VkCisJCQkJLy8gdGhlbiB0aGUgdHlwZSBoaWVyYXJjaHkgaGFzIGNoYW5nZWQKIAkJCQlJSmF2YUVsZW1lbnRbXSBwa2dzID0gdGhpcy5wYWNrYWdlUmVnaW9uLmdldEVsZW1lbnRzKCk7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCWlmIChwa2dzW2ldLmdldFBhcmVudCgpLmVxdWFscyhlbGVtZW50KSkgewpAQCAtOTU0LDE1ICs5NzQsMjQgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJfQotCXJldHVybiBpc0FmZmVjdGVkQnlDaGlsZHJlbihkZWx0YSk7CisJcmV0dXJuIGlzQWZmZWN0ZWRCeUNoaWxkcmVuKGRlbHRhLCBldmVudFR5cGUpOwogfQogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgZGVsdGEgKGEgY29tcGlsYXRpb24gdW5pdCBkZWx0YSBvciBhIGNsYXNzIGZpbGUgZGVsdGEpCiAgKiBjb3VsZCBhZmZlY3QgdGhpcyB0eXBlIGhpZXJhcmNoeS4KKyAqIEBwYXJhbSBldmVudFR5cGUgVE9ETwogICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0FmZmVjdGVkQnlPcGVuYWJsZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKK3Byb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0ZWRCeU9wZW5hYmxlKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewogCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CiAJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpZWxlbWVudDsKKwkJSUNvbXBpbGF0aW9uVW5pdCBmb2N1c0NVID0gCisJCQl0aGlzLmZvY3VzVHlwZSAhPSBudWxsID8gdGhpcy5mb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkgOiBudWxsOworCQlpZiAoZm9jdXNDVSAhPSBudWxsICYmIGZvY3VzQ1UuZ2V0T3duZXIoKSAhPSBjdS5nZXRPd25lcigpKQorCQkJcmV0dXJuIGZhbHNlOworCQkvL0FEREVEIGRlbHRhIGFyaXNpbmcgZnJvbSBnZXRXb3JraW5nQ29weSgpIHNob3VsZCBiZSBpZ25vcmVkCisJCWlmIChldmVudFR5cGUgIT0gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSAmJiAhY3UuaXNQcmltYXJ5KCkgJiYKKwkJCQlkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpCisJCQlyZXR1cm4gZmFsc2U7CiAJCUNoYW5nZUNvbGxlY3RvciBjb2xsZWN0b3IgPSB0aGlzLmNoYW5nZUNvbGxlY3RvcjsKIAkJaWYgKGNvbGxlY3RvciA9PSBudWxsKSB7CiAJCSAgICBjb2xsZWN0b3IgPSBuZXcgQ2hhbmdlQ29sbGVjdG9yKHRoaXMpOwpAQCAtOTczLDcgKzEwMDIsNyBAQAogCQkJaWYgKERFQlVHKQogCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCX0KLQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgeworCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpICYmIGV2ZW50VHlwZSA9PSBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFKSB7CiAJCQkvLyBjaGFuZ2VzIHRvIHdvcmtpbmcgY29waWVzIGFyZSBiYXRjaGVkCiAJCQl0aGlzLmNoYW5nZUNvbGxlY3RvciA9IGNvbGxlY3RvcjsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTk4NywxMCArMTAxNiwxMCBAQAogCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKIAkJCQlJVHlwZSB0eXBlID0gKChDbGFzc0ZpbGUpZWxlbWVudCkuZ2V0VHlwZSgpOwogCQkJCVN0cmluZyB0eXBlTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlpZiAoaGFzU3VwZXJ0eXBlKHR5cGVOYW1lKSAKKwkJCQlpZiAoaGFzU3VwZXJ0eXBlKHR5cGVOYW1lKQogCQkJCQl8fCBzdWJ0eXBlc0luY2x1ZGVTdXBlcnR5cGVPZih0eXBlKQogCQkJCQl8fCB0aGlzLm1pc3NpbmdUeXBlcy5jb250YWlucyh0eXBlTmFtZSkpIHsKLQkJCQkJCQorCiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTEwMTUsNyArMTA0NCw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJmYWNlKElUeXBlIHR5cGUpIHsKLQlpbnQgZmxhZ3MgPSB0aGlzLmdldENhY2hlZEZsYWdzKHR5cGUpOworCWludCBmbGFncyA9IGdldENhY2hlZEZsYWdzKHR5cGUpOwogCWlmIChmbGFncyA9PSAtMSkgewogCQl0cnkgewogCQkJcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKTsKQEAgLTEwNTUsMTIgKzEwODQsMTIgQEAKIAl0cnkgewogCQlUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBuZXcgVHlwZUhpZXJhcmNoeSgpOwogCQl0eXBlSGllcmFyY2h5LmluaXRpYWxpemUoMSk7Ci0JCQorCiAJCUlUeXBlW10gdHlwZXMgPSBuZXcgSVR5cGVbU0laRV07CiAJCWludCB0eXBlQ291bnQgPSAwOwotCQkKKwogCQlieXRlIHZlcnNpb24gPSAoYnl0ZSlpbnB1dC5yZWFkKCk7Ci0JCisKIAkJaWYodmVyc2lvbiAhPSBWRVJTSU9OKSB7CiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSVN0YXR1cy5FUlJPUikpOwogCQl9CkBAIC0xMDY4LDEwICsxMDk3LDEwIEBACiAJCWlmKChnZW5lcmFsSW5mbyAmIENPTVBVVEVfU1VCVFlQRVMpICE9IDApIHsKIAkJCXR5cGVIaWVyYXJjaHkuY29tcHV0ZVN1YnR5cGVzID0gdHJ1ZTsKIAkJfQotCQkKKwogCQlieXRlIGI7CiAJCWJ5dGVbXSBieXRlczsKLQkJCisKIAkJLy8gcmVhZCBwcm9qZWN0CiAJCWJ5dGVzID0gcmVhZFVudGlsKGlucHV0LCBTRVBBUkFUT1IxKTsKIAkJaWYoYnl0ZXMubGVuZ3RoID4gMCkgewpAQCAtMTA4MSw3ICsxMTEwLDcgQEAKIAkJCXR5cGVIaWVyYXJjaHkucHJvamVjdCA9IG51bGw7CiAJCQl0eXBlSGllcmFyY2h5LnNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCk7CiAJCX0KLQkJCisKIAkJLy8gcmVhZCBtaXNzaW5nIHR5cGUKIAkJewogCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjEpOwpAQCAtMTEwNiwyOCArMTEzNSwyOCBAQAogCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjQsIDEpOwogCQkJYnl0ZXNbMF0gPSBiOwogCQkJSVR5cGUgZWxlbWVudCA9IChJVHlwZSlKYXZhQ29yZS5jcmVhdGUobmV3IFN0cmluZyhieXRlcyksIG93bmVyKTsKLQkJCQorCiAJCQlpZih0eXBlcy5sZW5ndGggPT0gdHlwZUNvdW50KSB7CiAJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlcywgMCwgdHlwZXMgPSBuZXcgSVR5cGVbdHlwZUNvdW50ICogMl0sIDAsIHR5cGVDb3VudCk7CiAJCQl9CiAJCQl0eXBlc1t0eXBlQ291bnQrK10gPSBlbGVtZW50OwotCQkJCisKIAkJCS8vIHJlYWQgZmxhZ3MKIAkJCWJ5dGVzID0gcmVhZFVudGlsKGlucHV0LCBTRVBBUkFUT1I0KTsKIAkJCUludGVnZXIgZmxhZ3MgPSBieXRlc1RvRmxhZ3MoYnl0ZXMpOwogCQkJaWYoZmxhZ3MgIT0gbnVsbCkgewogCQkJCXR5cGVIaWVyYXJjaHkuY2FjaGVGbGFncyhlbGVtZW50LCBmbGFncy5pbnRWYWx1ZSgpKTsKIAkJCX0KLQkJCQorCiAJCQkvLyByZWFkIGluZm8KIAkJCWJ5dGUgaW5mbyA9IChieXRlKWlucHV0LnJlYWQoKTsKLQkJCQorCiAJCQlpZigoaW5mbyAmIElOVEVSRkFDRSkgIT0gMCkgewogCQkJCXR5cGVIaWVyYXJjaHkuYWRkSW50ZXJmYWNlKGVsZW1lbnQpOwogCQkJfQogCQkJaWYoKGluZm8gJiBDT01QVVRFRF9GT1IpICE9IDApIHsKIAkJCQlpZighZWxlbWVudC5lcXVhbHModHlwZSkpIHsKLQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElTdGF0dXMuRVJST1IpKTsgCisJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJU3RhdHVzLkVSUk9SKSk7CiAJCQkJfQogCQkJCXR5cGVIaWVyYXJjaHkuZm9jdXNUeXBlID0gZWxlbWVudDsKIAkJCX0KQEAgLTExMzUsMzMgKzExNjQsMzMgQEAKIAkJCQl0eXBlSGllcmFyY2h5LmFkZFJvb3RDbGFzcyhlbGVtZW50KTsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyByZWFkIHN1cGVyIGNsYXNzCiAJCXdoaWxlKChiID0gKGJ5dGUpaW5wdXQucmVhZCgpKSAhPSBTRVBBUkFUT1IxICYmIGIgIT0gLTEpIHsKIAkJCWJ5dGVzID0gcmVhZFVudGlsKGlucHV0LCBTRVBBUkFUT1IzLCAxKTsKIAkJCWJ5dGVzWzBdID0gYjsKIAkJCWludCBzdWJDbGFzcyA9IG5ldyBJbnRlZ2VyKG5ldyBTdHJpbmcoYnl0ZXMpKS5pbnRWYWx1ZSgpOwotCQkJCisKIAkJCS8vIHJlYWQgc3VwZXIgdHlwZQogCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjEpOwogCQkJaW50IHN1cGVyQ2xhc3MgPSBuZXcgSW50ZWdlcihuZXcgU3RyaW5nKGJ5dGVzKSkuaW50VmFsdWUoKTsKLQkJCQorCiAJCQl0eXBlSGllcmFyY2h5LmNhY2hlU3VwZXJjbGFzcygKIAkJCQl0eXBlc1tzdWJDbGFzc10sCiAJCQkJdHlwZXNbc3VwZXJDbGFzc10pOwogCQl9Ci0JCQorCiAJCS8vIHJlYWQgc3VwZXIgaW50ZXJmYWNlCiAJCXdoaWxlKChiID0gKGJ5dGUpaW5wdXQucmVhZCgpKSAhPSBTRVBBUkFUT1IxICYmIGIgIT0gLTEpIHsKIAkJCWJ5dGVzID0gcmVhZFVudGlsKGlucHV0LCBTRVBBUkFUT1IzLCAxKTsKIAkJCWJ5dGVzWzBdID0gYjsKIAkJCWludCBzdWJDbGFzcyA9IG5ldyBJbnRlZ2VyKG5ldyBTdHJpbmcoYnl0ZXMpKS5pbnRWYWx1ZSgpOwotCQkJCisKIAkJCS8vIHJlYWQgc3VwZXIgaW50ZXJmYWNlCiAJCQlieXRlcyA9IHJlYWRVbnRpbChpbnB1dCwgU0VQQVJBVE9SMSk7CiAJCQlJVHlwZVtdIHN1cGVySW50ZXJmYWNlcyA9IG5ldyBJVHlwZVsoYnl0ZXMubGVuZ3RoIC8gMikgKyAxXTsKIAkJCWludCBpbnRlcmZhY2VDb3VudCA9IDA7Ci0JCQkKKwogCQkJaW50IGogPSAwOwogCQkJYnl0ZVtdIGIyOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewpAQCAtMTE3Niw3ICsxMjA1LDcgQEAKIAkJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIGosIGIyLCAwLCBieXRlcy5sZW5ndGggLSBqKTsKIAkJCXN1cGVySW50ZXJmYWNlc1tpbnRlcmZhY2VDb3VudCsrXSA9IHR5cGVzW25ldyBJbnRlZ2VyKG5ldyBTdHJpbmcoYjIpKS5pbnRWYWx1ZSgpXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoc3VwZXJJbnRlcmZhY2VzLCAwLCBzdXBlckludGVyZmFjZXMgPSBuZXcgSVR5cGVbaW50ZXJmYWNlQ291bnRdLCAwLCBpbnRlcmZhY2VDb3VudCk7Ci0JCQkKKwogCQkJdHlwZUhpZXJhcmNoeS5jYWNoZVN1cGVySW50ZXJmYWNlcygKIAkJCQl0eXBlc1tzdWJDbGFzc10sCiAJCQkJc3VwZXJJbnRlcmZhY2VzKTsKQEAgLTEyMTMsMTAgKzEyNDIsMTAgQEAKIAkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CiAJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJdGhpcy5mb2N1c1R5cGUgIT0gbnVsbCA/IAotCQkJCQkJCU1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuaGllcmFyY2h5X2NyZWF0aW5nT25UeXBlLCB0aGlzLmZvY3VzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOiAKLQkJCQkJCQlNZXNzYWdlcy5oaWVyYXJjaHlfY3JlYXRpbmcsIAotCQkJCQkxMDApOyAKKwkJCQkJdGhpcy5mb2N1c1R5cGUgIT0gbnVsbCA/CisJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5oaWVyYXJjaHlfY3JlYXRpbmdPblR5cGUsIHRoaXMuZm9jdXNUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6CisJCQkJCQkJTWVzc2FnZXMuaGllcmFyY2h5X2NyZWF0aW5nLAorCQkJCQkxMDApOwogCQl9CiAJCWxvbmcgc3RhcnQgPSAtMTsKIAkJaWYgKERFQlVHKSB7CkBAIC0xMjgwLDcgKzEzMDksNyBAQAogCQlIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwogCQlIYXNodGFibGUgaGFzaHRhYmxlMiA9IG5ldyBIYXNodGFibGUoKTsKIAkJaW50IGNvdW50ID0gMDsKLQkJCisKIAkJaWYodGhpcy5mb2N1c1R5cGUgIT0gbnVsbCkgewogCQkJSW50ZWdlciBpbmRleCA9IG5ldyBJbnRlZ2VyKGNvdW50KyspOwogCQkJaGFzaHRhYmxlLnB1dCh0aGlzLmZvY3VzVHlwZSwgaW5kZXgpOwpAQCAtMTMyNSwzNCArMTM1NCwzNCBAQAogCQl9CiAJCS8vIHNhdmUgdmVyc2lvbiBvZiB0aGUgaGllcmFyY2h5IGZvcm1hdAogCQlvdXRwdXQud3JpdGUoVkVSU0lPTik7Ci0JCQorCiAJCS8vIHNhdmUgZ2VuZXJhbCBpbmZvCiAJCWJ5dGUgZ2VuZXJhbEluZm8gPSAwOwogCQlpZih0aGlzLmNvbXB1dGVTdWJ0eXBlcykgewogCQkJZ2VuZXJhbEluZm8gfD0gQ09NUFVURV9TVUJUWVBFUzsKIAkJfQogCQlvdXRwdXQud3JpdGUoZ2VuZXJhbEluZm8pOwotCQkKKwogCQkvLyBzYXZlIHByb2plY3QKIAkJaWYodGhpcy5wcm9qZWN0ICE9IG51bGwpIHsKIAkJCW91dHB1dC53cml0ZSh0aGlzLnByb2plY3QuZ2V0SGFuZGxlSWRlbnRpZmllcigpLmdldEJ5dGVzKCkpOwogCQl9CiAJCW91dHB1dC53cml0ZShTRVBBUkFUT1IxKTsKLQkJCisKIAkJLy8gc2F2ZSBtaXNzaW5nIHR5cGVzCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5taXNzaW5nVHlwZXMuc2l6ZSgpOyBpKyspIHsKIAkJCWlmKGkgIT0gMCkgewogCQkJCW91dHB1dC53cml0ZShTRVBBUkFUT1IyKTsKIAkJCX0KIAkJCW91dHB1dC53cml0ZSgoKFN0cmluZyl0aGlzLm1pc3NpbmdUeXBlcy5nZXQoaSkpLmdldEJ5dGVzKCkpOwotCQkJCisKIAkJfQogCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMSk7Ci0JCQorCiAJCS8vIHNhdmUgdHlwZXMKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgewogCQkJSVR5cGUgdCA9IChJVHlwZSloYXNodGFibGUyLmdldChuZXcgSW50ZWdlcihpKSk7Ci0JCQkKKwogCQkJLy8gbiBieXRlcwogCQkJb3V0cHV0LndyaXRlKHQuZ2V0SGFuZGxlSWRlbnRpZmllcigpLmdldEJ5dGVzKCkpOwogCQkJb3V0cHV0LndyaXRlKFNFUEFSQVRPUjQpOwpAQCAtMTM3MSwyOCArMTQwMCwyOCBAQAogCQkJb3V0cHV0LndyaXRlKGluZm8pOwogCQl9CiAJCW91dHB1dC53cml0ZShTRVBBUkFUT1IxKTsKLQkJCisKIAkJLy8gc2F2ZSBzdXBlcmNsYXNzZXMKIAkJdHlwZXMgPSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmVudHJ5U2V0KCkudG9BcnJheSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSB0eXBlc1tpXTsKIAkJCUlKYXZhRWxlbWVudCBrZXkgPSAoSUphdmFFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKIAkJCUlKYXZhRWxlbWVudCB2YWx1ZSA9IChJSmF2YUVsZW1lbnQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkKKwogCQkJb3V0cHV0LndyaXRlKCgoSW50ZWdlciloYXNodGFibGUuZ2V0KGtleSkpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CiAJCQlvdXRwdXQud3JpdGUoJz4nKTsKIAkJCW91dHB1dC53cml0ZSgoKEludGVnZXIpaGFzaHRhYmxlLmdldCh2YWx1ZSkpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CiAJCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMSk7CiAJCX0KIAkJb3V0cHV0LndyaXRlKFNFUEFSQVRPUjEpOwotCQkKKwogCQkvLyBzYXZlIHN1cGVyaW50ZXJmYWNlcwogCQl0eXBlcyA9IHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmVudHJ5U2V0KCkudG9BcnJheSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSB0eXBlc1tpXTsKIAkJCUlKYXZhRWxlbWVudCBrZXkgPSAoSUphdmFFbGVtZW50KSBlbnRyeS5nZXRLZXkoKTsKIAkJCUlKYXZhRWxlbWVudFtdIHZhbHVlcyA9IChJSmF2YUVsZW1lbnRbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQorCiAJCQlpZih2YWx1ZXMubGVuZ3RoID4gMCkgewogCQkJCW91dHB1dC53cml0ZSgoKEludGVnZXIpaGFzaHRhYmxlLmdldChrZXkpKS50b1N0cmluZygpLmdldEJ5dGVzKCkpOwogCQkJCW91dHB1dC53cml0ZShTRVBBUkFUT1IzKTsKQEAgLTE0MTAsNyArMTQzOSw3IEBACiAJfQogfQogLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNpbXBsZSBuYW1lIG9mIGEgc3VwZXJ0eXBlIG9mIHRoZSBnaXZlbiB0eXBlIGlzIAorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzaW1wbGUgbmFtZSBvZiBhIHN1cGVydHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZSBpcwogICogdGhlIHNpbXBsZSBuYW1lIG9mIG9uZSBvZiB0aGUgc3VidHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkgb3IgdGhlCiAgKiBzaW1wbGUgbmFtZSBvZiB0aGlzIHR5cGUuCiAgKi8KQEAgLTE0NTUsNyArMTQ4NCw3IEBACiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KLQkKKwogCXJldHVybiBmYWxzZTsKIH0KIC8qKgpAQCAtMTQ2NCwzMSArMTQ5MywzOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCWJ1ZmZlci5hcHBlbmQoIkZvY3VzOiAiKTsgLy8kTk9OLU5MUy0xJAotCWJ1ZmZlci5hcHBlbmQodGhpcy5mb2N1c1R5cGUgPT0gbnVsbCA/ICI8Tk9ORT4iIDogKChKYXZhRWxlbWVudCl0aGlzLmZvY3VzVHlwZSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKGZhbHNlLypkb24ndCBzaG93IGtleSovKSk7IC8vJE5PTi1OTFMtMSQKLQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiPE5PTkU+XG4iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXRvU3RyaW5nKGJ1ZmZlciwgdGhpcy5mb2N1c1R5cGUsIDApOworCX0KIAlpZiAoZXhpc3RzKCkpIHsKIAkJaWYgKHRoaXMuZm9jdXNUeXBlICE9IG51bGwpIHsKIAkJCWJ1ZmZlci5hcHBlbmQoIlN1cGVyIHR5cGVzOlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRvU3RyaW5nKGJ1ZmZlciwgdGhpcy5mb2N1c1R5cGUsIDEsIHRydWUpOworCQkJdG9TdHJpbmcoYnVmZmVyLCB0aGlzLmZvY3VzVHlwZSwgMCwgdHJ1ZSk7CiAJCQlidWZmZXIuYXBwZW5kKCJTdWIgdHlwZXM6XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdG9TdHJpbmcoYnVmZmVyLCB0aGlzLmZvY3VzVHlwZSwgMSwgZmFsc2UpOworCQkJdG9TdHJpbmcoYnVmZmVyLCB0aGlzLmZvY3VzVHlwZSwgMCwgZmFsc2UpOwogCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgiU3ViIHR5cGVzIG9mIHJvb3QgY2xhc3NlczpcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlJSmF2YUVsZW1lbnRbXSByb290cyA9IFV0aWwuc29ydENvcHkoZ2V0Um9vdENsYXNzZXMoKSk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQl0b1N0cmluZyhidWZmZXIsIChJVHlwZSkgcm9vdHNbaV0sIDEsIGZhbHNlKTsKKwkJCWlmICh0aGlzLnJvb3RDbGFzc2VzLnNpemUgPiAwKSB7CisJCQkJSUphdmFFbGVtZW50W10gcm9vdHMgPSBVdGlsLnNvcnRDb3B5KGdldFJvb3RDbGFzc2VzKCkpOworCQkJCWJ1ZmZlci5hcHBlbmQoIlN1cGVyIHR5cGVzIG9mIHJvb3QgY2xhc3NlczpcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJaW50IGxlbmd0aCA9IHJvb3RzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlKYXZhRWxlbWVudCByb290ID0gcm9vdHNbaV07CisJCQkJCXRvU3RyaW5nKGJ1ZmZlciwgcm9vdCwgMSk7CisJCQkJCXRvU3RyaW5nKGJ1ZmZlciwgcm9vdCwgMSwgdHJ1ZSk7CisJCQkJfQorCQkJCWJ1ZmZlci5hcHBlbmQoIlN1YiB0eXBlcyBvZiByb290IGNsYXNzZXM6XG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUphdmFFbGVtZW50IHJvb3QgPSByb290c1tpXTsKKwkJCQkJdG9TdHJpbmcoYnVmZmVyLCByb290LCAxKTsKKwkJCQkJdG9TdHJpbmcoYnVmZmVyLCByb290LCAxLCBmYWxzZSk7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0aGlzLnJvb3RDbGFzc2VzLnNpemUgPT0gMCkgeworCQkJCS8vIHNlZSBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY5MQorCQkJCWJ1ZmZlci5hcHBlbmQoIk5vIHJvb3QgY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KLQkJaWYgKHRoaXMucm9vdENsYXNzZXMuc2l6ZSA+IDEpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlJvb3QgY2xhc3NlczpcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlJSmF2YUVsZW1lbnRbXSByb290cyA9IFV0aWwuc29ydENvcHkoZ2V0Um9vdENsYXNzZXMoKSk7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQl0b1N0cmluZyhidWZmZXIsIChJVHlwZSkgcm9vdHNbaV0sIDEsIGZhbHNlKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0aGlzLnJvb3RDbGFzc2VzLnNpemUgPT0gMCkgewotCQkJLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjkxCi0JCQlidWZmZXIuYXBwZW5kKCJObyByb290IGNsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZCgiKEhpZXJhcmNoeSBiZWNhbWUgc3RhbGUpIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xNDk5LDIxICsxNTM1LDIzIEBACiAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGVudGF0aW9uIGxldmVsLgogICogSWYgYXNjZW5kYW50LCBzaG93cyB0aGUgc3VwZXIgdHlwZXMsIG90aGVyd2lzZSBzaG93IHRoZSBzdWIgdHlwZXMuCiAgKi8KLXByaXZhdGUgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBJVHlwZSB0eXBlLCBpbnQgaW5kZW50LCBib29sZWFuIGFzY2VuZGFudCkgewotCUlUeXBlW10gdHlwZXM9IGFzY2VuZGFudCA/IGdldFN1cGVydHlwZXModHlwZSkgOiBnZXRTdWJ0eXBlcyh0eXBlKTsKK3ByaXZhdGUgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBJSmF2YUVsZW1lbnQgdHlwZSwgaW50IGluZGVudCwgYm9vbGVhbiBhc2NlbmRhbnQpIHsKKwlJVHlwZVtdIHR5cGVzPSBhc2NlbmRhbnQgPyBnZXRTdXBlcnR5cGVzKChJVHlwZSkgdHlwZSkgOiBnZXRTdWJ0eXBlcygoSVR5cGUpIHR5cGUpOwogCUlKYXZhRWxlbWVudFtdIHNvcnRlZFR5cGVzID0gVXRpbC5zb3J0Q29weSh0eXBlcyk7CiAJZm9yIChpbnQgaT0gMDsgaSA8IHNvcnRlZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWZvciAoaW50IGo9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUphdmFFbGVtZW50IGVsZW1lbnQgPSAoSmF2YUVsZW1lbnQpc29ydGVkVHlwZXNbaV07Ci0JCWJ1ZmZlci5hcHBlbmQoZWxlbWVudC50b1N0cmluZ1dpdGhBbmNlc3RvcnMoZmFsc2UvKmRvbid0IHNob3cga2V5Ki8pKTsKLQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJdG9TdHJpbmcoYnVmZmVyLCB0eXBlc1tpXSwgaW5kZW50ICsgMSwgYXNjZW5kYW50KTsKKwkJdG9TdHJpbmcoYnVmZmVyLCBzb3J0ZWRUeXBlc1tpXSwgaW5kZW50ICsgMSk7CisJCXRvU3RyaW5nKGJ1ZmZlciwgc29ydGVkVHlwZXNbaV0sIGluZGVudCArIDEsIGFzY2VuZGFudCk7CiAJfQogfQorcHJpdmF0ZSB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIsIElKYXZhRWxlbWVudCB0eXBlLCBpbnQgaW5kZW50KSB7CisJZm9yIChpbnQgaj0gMDsgaiA8IGluZGVudDsgaisrKSB7CisJCWJ1ZmZlci5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJYnVmZmVyLmFwcGVuZCgoKEphdmFFbGVtZW50KSB0eXBlKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoZmFsc2UvKmRvbid0IHNob3cga2V5Ki8pKTsKKwlidWZmZXIuYXBwZW5kKCdcbicpOworfQogLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgb25lIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeSBoYXMgYSBzdXBlcnR5cGUgd2hvc2Ugc2ltcGxlIAorICogUmV0dXJucyB3aGV0aGVyIG9uZSBvZiB0aGUgdHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkgaGFzIGEgc3VwZXJ0eXBlIHdob3NlIHNpbXBsZQogICogbmFtZSBpcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCiAgKi8KIGJvb2xlYW4gaGFzU3VwZXJ0eXBlKFN0cmluZyBzaW1wbGVOYW1lKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0Fic3RyYWN0RE9NQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9BYnN0cmFjdERPTUJ1aWxkZXIuamF2YQppbmRleCA3YzY3YTQ3Li5hZGJlYTQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0Fic3RyYWN0RE9NQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQWJzdHJhY3RET01CdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNyArMTksNyBAQAogLyoqCiAgKiBBbiBhYnN0cmFjdCBET00gYnVpbGRlciB0aGF0IGNvbnRhaW5zIHNoYXJlZCBmdW5jdGlvbmFsaXR5IG9mIERPTUJ1aWxkZXIgYW5kIFNpbXBsZURPTUJ1aWxkZXIuCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KICAqLwogcHVibGljIGNsYXNzIEFic3RyYWN0RE9NQnVpbGRlciBleHRlbmRzIFJlZmVyZW5jZUluZm9BZGFwdGVyIGltcGxlbWVudHMgSUxpbmVTdGFydEZpbmRlciB7CkBAIC0yOCw3ICsyOCw3IEBACiAJICogZnV6enkgcGFyc2luZwogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIGZBYm9ydDsKLQkKKwogCS8qKgogCSAqIFRydWUgd2hlbiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAJICogRmFsc2Ugd2hlbiBhbnkgb3RoZXIgdHlwZSBvZiBkb2N1bWVudCBmcmFnbWVudCBpcwpAQCAtNDcsNyArNDcsNyBAQAogCSAqIFRoZSBTdHJpbmcgb24gd2hpY2ggdGhlIEpET00gaXMgYmVpbmcgY3JlYXRlZC4KIAkgKi8KIAlwcm90ZWN0ZWQgY2hhcltdIGZEb2N1bWVudD0gbnVsbDsKLQkJCisKIAkvKioKIAkgKiBUaGUgc291cmNlIHBvc2l0aW9ucyBvZiBhbGwgb2YgdGhlIGxpbmUgc2VwYXJhdG9ycyBpbiB0aGUgZG9jdW1lbnQuCiAJICovCkBAIC01OCw3ICs1OCw3IEBACiAJICogYSBjb21waWxhdGlvbiB1bml0IG9yIHR5cGUuIFRoZSB0b3Agb2YgdGhlIHN0YWNrCiAJICogaXMgdGhlIGRvY3VtZW50IGZyYWdtZW50IHRoYXQgY2hpbGRyZW4gYXJlIGFkZGVkIHRvLgogCSAqLwotCXByb3RlY3RlZCBTdGFjayBmU3RhY2sgPSBudWxsOwkKKwlwcm90ZWN0ZWQgU3RhY2sgZlN0YWNrID0gbnVsbDsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2YgZmllbGRzIGNvbnN0cnVjdGVkIGluIHRoZSBjdXJyZW50CkBAIC04OSwyNiArODksMjYgQEAKIAlpZiAocG9zaXRpb25zICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CiAJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlmTGluZVN0YXJ0UG9zaXRpb25zID0gbmV3IGludFtsZW5ndGggKyAxXTsKLQkJCWZMaW5lU3RhcnRQb3NpdGlvbnNbMF0gPSAwOwotCQkJaW50IGRvY3VtZW50TGVuZ3RoID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJCXRoaXMuZkxpbmVTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbbGVuZ3RoICsgMV07CisJCQl0aGlzLmZMaW5lU3RhcnRQb3NpdGlvbnNbMF0gPSAwOworCQkJaW50IGRvY3VtZW50TGVuZ3RoID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCWludCBpUGx1c09uZSA9IGkgKyAxOwotCQkJCWludCBwb3NpdGlvblBsdXNPbmUgPSBwb3NpdGlvbnNbaV0gKyAxOwkKKwkJCQlpbnQgcG9zaXRpb25QbHVzT25lID0gcG9zaXRpb25zW2ldICsgMTsKIAkJCQlpZiAocG9zaXRpb25QbHVzT25lIDwgZG9jdW1lbnRMZW5ndGgpIHsKIAkJCQkJaWYgKGlQbHVzT25lIDwgbGVuZ3RoKSB7CiAJCQkJCQkvLyBtb3JlIHNlcGFyYXRvcnMKLQkJCQkJCWZMaW5lU3RhcnRQb3NpdGlvbnNbaVBsdXNPbmVdID0gcG9zaXRpb25QbHVzT25lOworCQkJCQkJdGhpcy5mTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIG5vIG1vcmUgc2VwYXJhdG9ycwotCQkJCQkJaWYgKGZEb2N1bWVudFtwb3NpdGlvblBsdXNPbmVdID09ICdcbicpIHsKLQkJCQkJCQlmTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZSArIDE7CisJCQkJCQlpZiAodGhpcy5mRG9jdW1lbnRbcG9zaXRpb25QbHVzT25lXSA9PSAnXG4nKSB7CisJCQkJCQkJdGhpcy5mTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZSArIDE7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCWZMaW5lU3RhcnRQb3NpdGlvbnNbaVBsdXNPbmVdID0gcG9zaXRpb25QbHVzT25lOworCQkJCQkJCXRoaXMuZkxpbmVTdGFydFBvc2l0aW9uc1tpUGx1c09uZV0gPSBwb3NpdGlvblBsdXNPbmU7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlmTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZTsKKwkJCQkJdGhpcy5mTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTEyMCwxMiArMTIwLDEyIEBACiAgKiBpcyBiZWluZyBidWlsdCAoc2luY2UgdGhvc2UgYXJlIHRoZSBvbmx5IG5vZGVzIHRoYXQgaGF2ZSBjaGlsZHJlbikuCiAgKgogICogPHA+Tk9URTogbm9kZXMgYXJlIGFkZGVkIHRvIHRoZSBKRE9NIHZpYSB0aGUgbWV0aG9kICNiYXNpY0FkZENoaWxkIHN1Y2ggdGhhdAotICogdGhlIG5vZGVzIGluIHRoZSBuZXdseSBjcmVhdGVkIEpET00gYXJlIG5vdCBmcmFnbWVudGVkLiAKKyAqIHRoZSBub2RlcyBpbiB0aGUgbmV3bHkgY3JlYXRlZCBKRE9NIGFyZSBub3QgZnJhZ21lbnRlZC4KICAqLwogcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoSURPTU5vZGUgY2hpbGQpIHsKLQlpZiAoZlN0YWNrLnNpemUoKSA+IDApIHsKLQkJRE9NTm9kZSBwYXJlbnQgPSAoRE9NTm9kZSkgZlN0YWNrLnBlZWsoKTsKLQkJaWYgKGZCdWlsZGluZ0NVIHx8IGZCdWlsZGluZ1R5cGUpIHsKKwlpZiAodGhpcy5mU3RhY2suc2l6ZSgpID4gMCkgeworCQlET01Ob2RlIHBhcmVudCA9IChET01Ob2RlKSB0aGlzLmZTdGFjay5wZWVrKCk7CisJCWlmICh0aGlzLmZCdWlsZGluZ0NVIHx8IHRoaXMuZkJ1aWxkaW5nVHlwZSkgewogCQkJcGFyZW50LmJhc2ljQWRkQ2hpbGQoY2hpbGQpOwogCQl9CiAJfQpAQCAtMTQwLDE5ICsxNDAsMTkgQEAKICAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQogICovCiBwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQlpZiAoZkFib3J0KSB7CisJaWYgKHRoaXMuZkFib3J0KSB7CiAJCXJldHVybiBudWxsOwogCX0KLQlmTm9kZS5ub3JtYWxpemUodGhpcyk7Ci0JcmV0dXJuIChJRE9NQ29tcGlsYXRpb25Vbml0KWZOb2RlOworCXRoaXMuZk5vZGUubm9ybWFsaXplKHRoaXMpOworCXJldHVybiAoSURPTUNvbXBpbGF0aW9uVW5pdCl0aGlzLmZOb2RlOwogfQogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2VudGVyQ2xhc3MoaW50LCBpbnRbXSwgaW50LCBpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgY2hhcltdW10sIGludFtdLCBpbnRbXSwgaW50KQogICovCiBwdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHsKLSAJaWYgKGZCdWlsZGluZ0NVKSB7Ci0gCQlJRE9NQ29tcGlsYXRpb25Vbml0IGN1PSBuZXcgRE9NQ29tcGlsYXRpb25Vbml0KGZEb2N1bWVudCwgbmV3IGludFtdIHswLCBmRG9jdW1lbnQubGVuZ3RoIC0gMX0pOwotIAkJZlN0YWNrLnB1c2goY3UpOworIAlpZiAodGhpcy5mQnVpbGRpbmdDVSkgeworIAkJSURPTUNvbXBpbGF0aW9uVW5pdCBjdT0gbmV3IERPTUNvbXBpbGF0aW9uVW5pdCh0aGlzLmZEb2N1bWVudCwgbmV3IGludFtdIHswLCB0aGlzLmZEb2N1bWVudC5sZW5ndGggLSAxfSk7CisgCQl0aGlzLmZTdGFjay5wdXNoKGN1KTsKICAJfQogfQogLyoqCkBAIC0xNjIsOSArMTYyLDkgQEAKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbXBpbGF0aW9uVW5pdChpbnQpCiAgKi8KIHB1YmxpYyB2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKSB7Ci0JRE9NQ29tcGlsYXRpb25Vbml0IGN1ID0gKERPTUNvbXBpbGF0aW9uVW5pdCkgZlN0YWNrLnBvcCgpOworCURPTUNvbXBpbGF0aW9uVW5pdCBjdSA9IChET01Db21waWxhdGlvblVuaXQpIHRoaXMuZlN0YWNrLnBvcCgpOwogCWN1LnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKLQlmTm9kZSA9IGN1OworCXRoaXMuZk5vZGUgPSBjdTsKIH0KIC8qKgogICogRmluaXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgRE9NIG9iamVjdHMuCkBAIC0xNzQsMjEgKzE3NCwyMSBAQAogICoJCWRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KICAqLwogcHJvdGVjdGVkIHZvaWQgZXhpdFR5cGUoaW50IGJvZHlFbmQsIGludCBkZWNsYXJhdGlvbkVuZCkgewotCURPTVR5cGUgdHlwZSA9IChET01UeXBlKWZTdGFjay5wb3AoKTsKKwlET01UeXBlIHR5cGUgPSAoRE9NVHlwZSl0aGlzLmZTdGFjay5wb3AoKTsKIAl0eXBlLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKIAl0eXBlLnNldENsb3NlQm9keVJhbmdlU3RhcnQoYm9keUVuZCk7CiAJdHlwZS5zZXRDbG9zZUJvZHlSYW5nZUVuZChib2R5RW5kKTsKLQlmTm9kZSA9IHR5cGU7CisJdGhpcy5mTm9kZSA9IHR5cGU7CiB9CiAvKioKICAqIEBzZWUgSUxpbmVTdGFydEZpbmRlciNnZXRMaW5lU3RhcnQoaW50KQogICovCiBwdWJsaWMgaW50IGdldExpbmVTdGFydChpbnQgcG9zaXRpb24pIHsKLQlpbnQgbGluZVNlcGFyYXRvckNvdW50ID0gZkxpbmVTdGFydFBvc2l0aW9ucy5sZW5ndGg7CisJaW50IGxpbmVTZXBhcmF0b3JDb3VudCA9IHRoaXMuZkxpbmVTdGFydFBvc2l0aW9ucy5sZW5ndGg7CiAJLy8gcmV2ZXJzZSB0cmF2ZXJzYWwgaW50ZW50aW9uYWwuCiAJZm9yKGludCBpID0gbGluZVNlcGFyYXRvckNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKGZMaW5lU3RhcnRQb3NpdGlvbnNbaV0gPD0gcG9zaXRpb24pCi0JCQlyZXR1cm4gZkxpbmVTdGFydFBvc2l0aW9uc1tpXTsKKwkJaWYgKHRoaXMuZkxpbmVTdGFydFBvc2l0aW9uc1tpXSA8PSBwb3NpdGlvbikKKwkJCXJldHVybiB0aGlzLmZMaW5lU3RhcnRQb3NpdGlvbnNbaV07CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjAyLDExICsyMDIsMTEgQEAKICAqCQl0eXBlIG9yIGNvbXBpbGF0aW9uIHVuaXQKICAqLwogcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1aWxkKGNoYXJbXSBzb3VyY2VDb2RlLCBib29sZWFuIGJ1aWxkaW5nQ29tcGlsYXRpb25Vbml0LCBib29sZWFuIGJ1aWxkaW5nVHlwZSkgewotCWZCdWlsZGluZ0NVID0gYnVpbGRpbmdDb21waWxhdGlvblVuaXQ7Ci0JZkJ1aWxkaW5nVHlwZSA9IGJ1aWxkaW5nVHlwZTsKLQlmU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlmRG9jdW1lbnQgPSBzb3VyY2VDb2RlOwotCWZGaWVsZENvdW50ID0gMDsKLQlmQWJvcnQgPSBmYWxzZTsKKwl0aGlzLmZCdWlsZGluZ0NVID0gYnVpbGRpbmdDb21waWxhdGlvblVuaXQ7CisJdGhpcy5mQnVpbGRpbmdUeXBlID0gYnVpbGRpbmdUeXBlOworCXRoaXMuZlN0YWNrID0gbmV3IFN0YWNrKCk7CisJdGhpcy5mRG9jdW1lbnQgPSBzb3VyY2VDb2RlOworCXRoaXMuZkZpZWxkQ291bnQgPSAwOworCXRoaXMuZkFib3J0ID0gZmFsc2U7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YQppbmRleCA4ZTc1Y2VlLi5mYzY0NDk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsOCArMjIsOCBAQAogCXByb3RlY3RlZCBjaGFyW10gZkZpbGVOYW1lOwogCXByb3RlY3RlZCBjaGFyW10gZk1haW5UeXBlTmFtZTsKIHB1YmxpYyBDb21waWxhdGlvblVuaXQoY2hhcltdIGNvbnRlbnRzLCBjaGFyW10gZmlsZW5hbWUpIHsKLQlmQ29udGVudHMgPSBjb250ZW50czsKLQlmRmlsZU5hbWUgPSBmaWxlbmFtZTsKKwl0aGlzLmZDb250ZW50cyA9IGNvbnRlbnRzOworCXRoaXMuZkZpbGVOYW1lID0gZmlsZW5hbWU7CiAKIAlTdHJpbmcgZmlsZSA9IG5ldyBTdHJpbmcoZmlsZW5hbWUpOwogCWludCBzdGFydCA9IGZpbGUubGFzdEluZGV4T2YoIi8iKSArIDE7IC8vJE5PTi1OTFMtMSQKQEAgLTM0LDI0ICszNCwyNCBAQAogCWlmIChlbmQgPT0gLTEpCiAJCWVuZCA9IGZpbGUubGVuZ3RoKCk7CiAKLQlmTWFpblR5cGVOYW1lID0gZmlsZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudG9DaGFyQXJyYXkoKTsKKwl0aGlzLmZNYWluVHlwZU5hbWUgPSBmaWxlLnN1YnN0cmluZyhzdGFydCwgZW5kKS50b0NoYXJBcnJheSgpOwogfQogcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKLQlyZXR1cm4gZkNvbnRlbnRzOworCXJldHVybiB0aGlzLmZDb250ZW50czsKIH0KIC8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklEZXBlbmRlbnQjZ2V0RmlsZU5hbWUoKQogICovCiBwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgewotCXJldHVybiBmRmlsZU5hbWU7CisJcmV0dXJuIHRoaXMuZkZpbGVOYW1lOwogfQogcHVibGljIGNoYXJbXSBnZXRNYWluVHlwZU5hbWUoKSB7Ci0JcmV0dXJuIGZNYWluVHlwZU5hbWU7CisJcmV0dXJuIHRoaXMuZk1haW5UeXBlTmFtZTsKIH0KIHB1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKIAlyZXR1cm4gbnVsbDsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJDb21waWxhdGlvblVuaXRbIiArIG5ldyBTdHJpbmcoZkZpbGVOYW1lKSArICJdIjsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiQ29tcGlsYXRpb25Vbml0WyIgKyBuZXcgU3RyaW5nKHRoaXMuZkZpbGVOYW1lKSArICJdIjsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUJ1aWxkZXIuamF2YQppbmRleCAzZTY4ZDA0Li5jYmEzZDY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywyNCArMjcsMjQgQEAKICAqIGZvciB0aGUgRE9NRmFjdG9yeS4gVGhlIERPTUJ1aWxkZXIgaGFzIGJlZW4gc2VwYXJhdGVkIGZyb20gdGhlCiAgKiBET01GYWN0b3J5IHRvIGhpZGUgdGhlIGltcGxtZW50YXRpb24gb2Ygbm9kZSBjcmVhdGlvbiBhbmQgdGhlCiAgKiBwdWJsaWMgUmVxdWVzdG9yIEFQSSBtZXRob2RzLgotICogCisgKgogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBET01CdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RET01CdWlsZGVyIGltcGxlbWVudHMgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciB7Ci0JCisKIAkvKioKIAkgKiBUcnVlIHdoZW4gcGFyc2luZyBhIHNpbmdsZSBtZW1iZXIgLSBpZ25vcmUgYW55IHByb2JsZW1zCiAJICogZW5jb3VudGVyZWQgYWZ0ZXIgdGhlIG1lbWJlci4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBmQnVpbGRpbmdTaW5nbGVNZW1iZXI9IGZhbHNlOwotCQorCiAJLyoqCiAJICogVHJ1ZSB3aGVuIHRoZSBzaW5nbGUgbWVtYmVyIGJlaW5nIGJ1aWx0IGhhcyBiZWVuCiAJICogZXhpdGVkLgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZGaW5pc2hlZFNpbmdsZU1lbWJlciA9IGZhbHNlOwkJCisJcHJvdGVjdGVkIGJvb2xlYW4gZkZpbmlzaGVkU2luZ2xlTWVtYmVyID0gZmFsc2U7CiAKIAkvKioKIAkgKiBDb2xsZWN0aW9uIG9mIG11bHRpcGxlIGZpZWxkcyBpbiBvbmUgZGVjbGFyYXRpb24KQEAgLTYyLDI0ICs2MiwyNCBAQAogLyoqCiAgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0SW1wb3J0KGludCwgaW50LCBpbnRbXSwgY2hhcltdLCBpbnQsIGJvb2xlYW4sIGludCkKICAqLwotcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGNoYXJbXSBuYW1lLCAKK3B1YmxpYyB2b2lkIGFjY2VwdEltcG9ydChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBjaGFyW10gbmFtZSwKIAlpbnQgbmFtZVN0YXJ0LCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKSB7CiAJaW50W10gc291cmNlUmFuZ2UgPSB7ZGVjbGFyYXRpb25TdGFydCwgZGVjbGFyYXRpb25FbmR9OwogCWludFtdIG5hbWVSYW5nZSA9IHtuYW1lU3RhcnQsIGRlY2xhcmF0aW9uRW5kIC0gMX07Ci0JCi0JLyogU2VlIDFGVklJMVAgKi8KLQlTdHJpbmcgaW1wb3J0TmFtZSA9IG5ldyBTdHJpbmcoZkRvY3VtZW50LCBuYW1lUmFuZ2VbMF0sIG5hbWVSYW5nZVsxXSArIDEgLSBuYW1lUmFuZ2VbMF0pOwogCi0JZk5vZGU9IG5ldyBET01JbXBvcnQoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgaW1wb3J0TmFtZSwgbmFtZVJhbmdlLCBvbkRlbWFuZCwgbW9kaWZpZXJzKTsKLQlhZGRDaGlsZChmTm9kZSk7Ci0JaWYgKGZCdWlsZGluZ1NpbmdsZU1lbWJlcikgewotCQlmRmluaXNoZWRTaW5nbGVNZW1iZXI9IHRydWU7CisJLyogU2VlIDFGVklJMVAgKi8KKwlTdHJpbmcgaW1wb3J0TmFtZSA9IG5ldyBTdHJpbmcodGhpcy5mRG9jdW1lbnQsIG5hbWVSYW5nZVswXSwgbmFtZVJhbmdlWzFdICsgMSAtIG5hbWVSYW5nZVswXSk7CisKKwl0aGlzLmZOb2RlPSBuZXcgRE9NSW1wb3J0KHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgaW1wb3J0TmFtZSwgbmFtZVJhbmdlLCBvbkRlbWFuZCwgbW9kaWZpZXJzKTsKKwlhZGRDaGlsZCh0aGlzLmZOb2RlKTsKKwlpZiAodGhpcy5mQnVpbGRpbmdTaW5nbGVNZW1iZXIpIHsKKwkJdGhpcy5mRmluaXNoZWRTaW5nbGVNZW1iZXI9IHRydWU7CiAJfQogfQogLyoqCiAgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCBpbnQgYm9keVN0YXJ0LCBpbnQgYm9keUVuZCkKICAqLwotcHVibGljIHZvaWQgYWNjZXB0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgCitwdWJsaWMgdm9pZCBhY2NlcHRJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBpbnQgbW9kaWZpZXJzLAogCWludCBtb2RpZmllcnNTdGFydCwgaW50IGJvZHlTdGFydCwgaW50IGJvZHlFbmQpIHsKIAlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZH07CiAJaW50W10gY29tbWVudFJhbmdlID0gey0xLCAtMX07CkBAIC05NCwyNCArOTQsMzEgQEAKIAkJbW9kaWZpZXJzUmFuZ2VbMF0gPSBtb2RpZmllcnNTdGFydDsKIAkJbW9kaWZpZXJzUmFuZ2VbMV0gPSBib2R5U3RhcnQgLSAxOwogCX0KLQlmTm9kZSA9IG5ldyBET01Jbml0aWFsaXplcihmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBjb21tZW50UmFuZ2UsIG1vZGlmaWVycywgCisJdGhpcy5mTm9kZSA9IG5ldyBET01Jbml0aWFsaXplcih0aGlzLmZEb2N1bWVudCwgc291cmNlUmFuZ2UsIGNvbW1lbnRSYW5nZSwgbW9kaWZpZXJzLAogCQltb2RpZmllcnNSYW5nZSwgYm9keVN0YXJ0KTsKLQlhZGRDaGlsZChmTm9kZSk7Ci0JaWYgKGZCdWlsZGluZ1NpbmdsZU1lbWJlcikgewotCQlmRmluaXNoZWRTaW5nbGVNZW1iZXI9IHRydWU7CisJYWRkQ2hpbGQodGhpcy5mTm9kZSk7CisJaWYgKHRoaXMuZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7CisJCXRoaXMuZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSB0cnVlOwogCX0KIH0KIC8qKgogICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2FjY2VwdFBhY2thZ2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnRQb3NpdGlvbikKICAqLwotcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBjaGFyW10gbmFtZSwgCitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnRQb3NpdGlvbikgewotCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIGRlY2xhcmF0aW9uRW5kfTsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IG51bGw7CisJaWYgKGphdmFEb2NQb3NpdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gamF2YURvY1Bvc2l0aW9ucy5sZW5ndGg7CisJCS8vIGdldCBsYXN0IGphdmFkb2MgY29tbWVudCAoc2VlIGJ1ZyA2ODc3MikKKwkJc291cmNlUmFuZ2UgPSBuZXcgaW50W10ge2phdmFEb2NQb3NpdGlvbnNbbGVuZ3RoIC0gMl0sIGRlY2xhcmF0aW9uRW5kfTsKKwl9IGVsc2UgeworCQlzb3VyY2VSYW5nZSA9IG5ldyBpbnRbXSB7ZGVjbGFyYXRpb25TdGFydCwgZGVjbGFyYXRpb25FbmR9OworCX0KIAlpbnRbXSBuYW1lUmFuZ2UgPSB7bmFtZVN0YXJ0UG9zaXRpb24sIGRlY2xhcmF0aW9uRW5kIC0gMX07Ci0JZk5vZGU9IG5ldyBET01QYWNrYWdlKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJPcGVyYXRpb24uY2hhclRvU3RyaW5nKG5hbWUpLCBuYW1lUmFuZ2UpOwotCWFkZENoaWxkKGZOb2RlKTsKLQlpZiAoZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7Ci0JCWZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKKwl0aGlzLmZOb2RlPSBuZXcgRE9NUGFja2FnZSh0aGlzLmZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJPcGVyYXRpb24uY2hhclRvU3RyaW5nKG5hbWUpLCBuYW1lUmFuZ2UpOworCWFkZENoaWxkKHRoaXMuZk5vZGUpOworCWlmICh0aGlzLmZCdWlsZGluZ1NpbmdsZU1lbWJlcikgeworCQl0aGlzLmZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKIAl9CiB9CiAvKioKQEAgLTEyMiwxMCArMTI5LDEwIEBACiAgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IKICAqLwogcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0gcHJvYmxlbSl7Ci0JaWYgKGZCdWlsZGluZ1NpbmdsZU1lbWJlciAmJiBmRmluaXNoZWRTaW5nbGVNZW1iZXIpIHsKKwlpZiAodGhpcy5mQnVpbGRpbmdTaW5nbGVNZW1iZXIgJiYgdGhpcy5mRmluaXNoZWRTaW5nbGVNZW1iZXIpIHsKIAkJcmV0dXJuOwogCX0KLQlmQWJvcnQ9IHRydWU7CisJdGhpcy5mQWJvcnQ9IHRydWU7CiB9CiAvKioKICAqIEFkZHMgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGN1cnJlbnQgZW5jbG9zaW5nIHNjb3BlLCBidWlsZGluZyB0aGUgSkRPTQpAQCAtMTMzLDEyICsxNDAsMTIgQEAKICAqIGlzIGJlaW5nIGJ1aWx0IChzaW5jZSB0aG9zZSBhcmUgdGhlIG9ubHkgbm9kZXMgdGhhdCBoYXZlIGNoaWxkcmVuKS4KICAqCiAgKiA8cD5OT1RFOiBub2RlcyBhcmUgYWRkZWQgdG8gdGhlIEpET00gdmlhIHRoZSBtZXRob2QgI2Jhc2ljQWRkQ2hpbGQgc3VjaCB0aGF0Ci0gKiB0aGUgbm9kZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgSkRPTSBhcmUgbm90IGZyYWdtZW50ZWQuIAorICogdGhlIG5vZGVzIGluIHRoZSBuZXdseSBjcmVhdGVkIEpET00gYXJlIG5vdCBmcmFnbWVudGVkLgogICovCiBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZChJRE9NTm9kZSBjaGlsZCkgewogCXN1cGVyLmFkZENoaWxkKGNoaWxkKTsKLQlpZiAoZlN0YWNrLmlzRW1wdHkoKSAmJiBmRmllbGRzICE9IG51bGwpIHsKLQkJZkZpZWxkcy5hZGQoY2hpbGQpOworCWlmICh0aGlzLmZTdGFjay5pc0VtcHR5KCkgJiYgdGhpcy5mRmllbGRzICE9IG51bGwpIHsKKwkJdGhpcy5mRmllbGRzLmFkZChjaGlsZCk7CiAJfQogfQogLyoqCkBAIC0xNTIsNyArMTU5LDcgQEAKICAqLwogcHVibGljIElET01Db21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKGNvbXBpbGF0aW9uVW5pdC5nZXRDb250ZW50cygpLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JZ2V0UGFyc2VyKG9wdGlvbnMpLnBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCk7CisJZ2V0UGFyc2VyKHRoaXMub3B0aW9ucykucGFyc2VDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0KTsKIAlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCk7CiB9CiAvKioKQEAgLTE2MCwzMSArMTY3LDMxIEBACiAgKi8KIHB1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoY2hhcltdIHNvdXJjZUNvZGUpIHsKIAlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VGaWVsZChzb3VyY2VDb2RlKTsKLQlpZiAoZkFib3J0IHx8IGZOb2RlID09IG51bGwpIHsKKwlnZXRQYXJzZXIodGhpcy5vcHRpb25zKS5wYXJzZUZpZWxkKHNvdXJjZUNvZGUpOworCWlmICh0aGlzLmZBYm9ydCB8fCB0aGlzLmZOb2RlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLy8gd2Ugb25seSBhY2NlcHQgZmllbGQgZGVjbGFyYXRpb25zIHdpdGggb25lIGZpZWxkCi0JaWYgKGZGaWVsZENvdW50ID4gMSkgeworCWlmICh0aGlzLmZGaWVsZENvdW50ID4gMSkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCi0JZk5vZGUubm9ybWFsaXplKHRoaXMpOwotCXJldHVybiAoSURPTUZpZWxkKWZOb2RlOworCisJdGhpcy5mTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NRmllbGQpdGhpcy5mTm9kZTsKIH0KIC8qKgotICogCisgKgogICovCiBwdWJsaWMgSURPTUZpZWxkW10gY3JlYXRlRmllbGRzKGNoYXJbXSBzb3VyY2VDb2RlKSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCWZGaWVsZHM9IG5ldyBBcnJheUxpc3QoKTsKLQlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VGaWVsZChzb3VyY2VDb2RlKTsKLQlpZiAoZkFib3J0KSB7CisJdGhpcy5mRmllbGRzPSBuZXcgQXJyYXlMaXN0KCk7CisJZ2V0UGFyc2VyKHRoaXMub3B0aW9ucykucGFyc2VGaWVsZChzb3VyY2VDb2RlKTsKKwlpZiAodGhpcy5mQWJvcnQpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCUlET01GaWVsZFtdIGZpZWxkcz0gbmV3IElET01GaWVsZFtmRmllbGRzLnNpemUoKV07Ci0JZkZpZWxkcy50b0FycmF5KGZpZWxkcyk7CisJSURPTUZpZWxkW10gZmllbGRzPSBuZXcgSURPTUZpZWxkW3RoaXMuZkZpZWxkcy5zaXplKCldOworCXRoaXMuZkZpZWxkcy50b0FycmF5KGZpZWxkcyk7CiAJZm9yIChpbnQgaT0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewogCQlET01Ob2RlIG5vZGU9IChET01Ob2RlKWZpZWxkc1tpXTsKIAkJaWYgKGkgPCAoZmllbGRzLmxlbmd0aCAtIDEpKSB7CkBAIC0yMDcsMTIgKzIxNCwxMiBAQAogICovCiBwdWJsaWMgSURPTUltcG9ydCBjcmVhdGVJbXBvcnQoY2hhcltdIHNvdXJjZUNvZGUpIHsKIAlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VJbXBvcnQoc291cmNlQ29kZSk7Ci0JaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CisJZ2V0UGFyc2VyKHRoaXMub3B0aW9ucykucGFyc2VJbXBvcnQoc291cmNlQ29kZSk7CisJaWYgKHRoaXMuZkFib3J0IHx8IHRoaXMuZk5vZGUgPT0gbnVsbCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JZk5vZGUubm9ybWFsaXplKHRoaXMpOwotCXJldHVybiAoSURPTUltcG9ydClmTm9kZTsKKwl0aGlzLmZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKKwlyZXR1cm4gKElET01JbXBvcnQpdGhpcy5mTm9kZTsKIH0KIC8qKgogICogQ3JlYXRlcyBhbiBJTklUSUFMSVpFUiBkb2N1bWVudCBmcmFnbWVudCBmcm9tIHRoZSBnaXZlbiBzb3VyY2UuCkBAIC0yMjEsMjQgKzIyOCwyNCBAQAogICovCiBwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKGNoYXJbXSBzb3VyY2VDb2RlKSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JZ2V0UGFyc2VyKG9wdGlvbnMpLnBhcnNlSW5pdGlhbGl6ZXIoc291cmNlQ29kZSk7Ci0JaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsIHx8ICEoZk5vZGUgaW5zdGFuY2VvZiBJRE9NSW5pdGlhbGl6ZXIpKSB7CisJZ2V0UGFyc2VyKHRoaXMub3B0aW9ucykucGFyc2VJbml0aWFsaXplcihzb3VyY2VDb2RlKTsKKwlpZiAodGhpcy5mQWJvcnQgfHwgdGhpcy5mTm9kZSA9PSBudWxsIHx8ICEodGhpcy5mTm9kZSBpbnN0YW5jZW9mIElET01Jbml0aWFsaXplcikpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCWZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKLQlyZXR1cm4gKElET01Jbml0aWFsaXplcilmTm9kZTsKKwl0aGlzLmZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKKwlyZXR1cm4gKElET01Jbml0aWFsaXplcil0aGlzLmZOb2RlOwogfQogLyoqCiAgKiBAc2VlIElET01GYWN0b3J5I2NyZWF0ZU1ldGhvZChTdHJpbmcpCiAgKi8KIHB1YmxpYyBJRE9NTWV0aG9kIGNyZWF0ZU1ldGhvZChjaGFyW10gc291cmNlQ29kZSkgewogCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWdldFBhcnNlcihvcHRpb25zKS5wYXJzZU1ldGhvZChzb3VyY2VDb2RlKTsKLQlpZiAoZkFib3J0IHx8IGZOb2RlID09IG51bGwpIHsKKwlnZXRQYXJzZXIodGhpcy5vcHRpb25zKS5wYXJzZU1ldGhvZChzb3VyY2VDb2RlKTsKKwlpZiAodGhpcy5mQWJvcnQgfHwgdGhpcy5mTm9kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQlmTm9kZS5ub3JtYWxpemUodGhpcyk7Ci0JcmV0dXJuIChJRE9NTWV0aG9kKWZOb2RlOworCXRoaXMuZk5vZGUubm9ybWFsaXplKHRoaXMpOworCXJldHVybiAoSURPTU1ldGhvZCl0aGlzLmZOb2RlOwogfQogLyoqCiAgKiBAc2VlIElET01GYWN0b3J5I2NyZWF0ZVBhY2thZ2UoKQpAQCAtMjUxLDMyICsyNTgsMzIgQEAKICAqLwogcHVibGljIElET01QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoY2hhcltdIHNvdXJjZUNvZGUpIHsKIAlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VQYWNrYWdlKHNvdXJjZUNvZGUpOwotCWlmIChmQWJvcnQgfHwgZk5vZGUgPT0gbnVsbCkgeworCWdldFBhcnNlcih0aGlzLm9wdGlvbnMpLnBhcnNlUGFja2FnZShzb3VyY2VDb2RlKTsKKwlpZiAodGhpcy5mQWJvcnQgfHwgdGhpcy5mTm9kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQlmTm9kZS5ub3JtYWxpemUodGhpcyk7Ci0JcmV0dXJuIChJRE9NUGFja2FnZSlmTm9kZTsKKwl0aGlzLmZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKKwlyZXR1cm4gKElET01QYWNrYWdlKXRoaXMuZk5vZGU7CiB9CiAvKioKICAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlVHlwZShTdHJpbmcpCiAgKi8KIHB1YmxpYyBJRE9NVHlwZSBjcmVhdGVUeXBlKGNoYXJbXSBzb3VyY2VDb2RlKSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JZ2V0UGFyc2VyKG9wdGlvbnMpLnBhcnNlVHlwZShzb3VyY2VDb2RlKTsKLQlpZiAoZkFib3J0KSB7CisJZ2V0UGFyc2VyKHRoaXMub3B0aW9ucykucGFyc2VUeXBlKHNvdXJjZUNvZGUpOworCWlmICh0aGlzLmZBYm9ydCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JaWYgKGZOb2RlICE9IG51bGwpIGZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKLQlpZiAoZk5vZGUgaW5zdGFuY2VvZiBJRE9NVHlwZSkgewotCQlyZXR1cm4gKElET01UeXBlKSBmTm9kZTsKKwlpZiAodGhpcy5mTm9kZSAhPSBudWxsKSB0aGlzLmZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKKwlpZiAodGhpcy5mTm9kZSBpbnN0YW5jZW9mIElET01UeXBlKSB7CisJCXJldHVybiAoSURPTVR5cGUpIHRoaXMuZk5vZGU7CiAJfQogCXJldHVybiBudWxsOwogfQogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IERPTU1ldGhvZCBhbmQgaW5pemlhbGl6ZXMuCiAgKgotICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgCisgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgogICoJCW9mIHRoaXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KICAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yIGNvbnZlcnRlZCB0byBhIGZsYWcKICAqIEBwYXJhbSBtb2RpZmllcnNTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKQEAgLTMwOCwxNSArMzE1LDE1IEBACiAgKgkJY2hhcmFjdGVyIG9mIHRoZSByZXNwZWN0aXZlIGV4Y2VwdGlvbiB0eXBlcwogICogQHBhcmFtIGV4Y2VwdGlvblR5cGVFbmRzIC0gYSBsaXN0IG9mIHNvdXJjZSBwb3NpdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdAogICoJCWNoYXJhY3RlciBvZiB0aGUgcmVzcGVjdGl2ZSBleGNlcHRpb24gdHlwZXMKLSAqIEBwYXJhbSBib2R5U3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydCBvZiB0aGlzIAorICogQHBhcmFtIGJvZHlTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMKICAqCQljb25zdHJ1Y3RvcidzIGJvZHkKICAqLwotcHJvdGVjdGVkIHZvaWQgZW50ZXJBYnN0cmFjdE1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCAKLQljaGFyW10gcmV0dXJuVHlwZSwgaW50IHJldHVyblR5cGVTdGFydCwgaW50IHJldHVyblR5cGVFbmQsIGludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAotCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGludFtdIHBhcmFtZXRlclR5cGVTdGFydHMsIAotCWludFtdIHBhcmFtZXRlclR5cGVFbmRzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgaW50W10gcGFyYW1ldGVyTmFtZVN0YXJ0cywgCi0JaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCBpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAotCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLCBpbnRbXSBleGNlcHRpb25UeXBlU3RhcnRzLCAKK3Byb3RlY3RlZCB2b2lkIGVudGVyQWJzdHJhY3RNZXRob2QoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwKKwljaGFyW10gcmV0dXJuVHlwZSwgaW50IHJldHVyblR5cGVTdGFydCwgaW50IHJldHVyblR5cGVFbmQsIGludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsCisJY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgaW50W10gcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwlpbnRbXSBwYXJhbWV0ZXJUeXBlRW5kcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGludFtdIHBhcmFtZXRlck5hbWVTdGFydHMsCisJaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCBpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsCisJaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZCwgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsIGludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsCiAJaW50W10gZXhjZXB0aW9uVHlwZUVuZHMsIGludCBib2R5U3RhcnQsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgewogCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIC0xfTsgLy8gd2lsbCBiZSBmaXhlZCB1cCBvbiBleGl0CiAJaW50W10gbmFtZVJhbmdlID0ge25hbWVTdGFydCwgbmFtZUVuZH07CkBAIC0zMzYsOSArMzQzLDkgQEAKIAkJfQogCX0KIAlpbnRbXSByZXR1cm5UeXBlUmFuZ2UgPSBudWxsOwotCQorCiAJaWYgKGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50ID4gMCkKLQkJcmV0dXJuVHlwZVJhbmdlID0gbmV3IGludFtdIHtyZXR1cm5UeXBlU3RhcnQsIHJldHVyblR5cGVFbmQsIAorCQlyZXR1cm5UeXBlUmFuZ2UgPSBuZXcgaW50W10ge3JldHVyblR5cGVTdGFydCwgcmV0dXJuVHlwZUVuZCwKIAkJCXBhcmFtZXRlcnNFbmQgKyAxLCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmR9OwogCWVsc2UKIAkJcmV0dXJuVHlwZVJhbmdlID0gbmV3IGludFtdIHtyZXR1cm5UeXBlU3RhcnQsIHJldHVyblR5cGVFbmR9OwpAQCAtMzU1LDEzICszNjIsMTMgQEAKIAl9IGVsc2UgewogCQlib2R5UmFuZ2UgPSBuZXcgaW50W10ge3BhcmFtZXRlcnNFbmQgKyAxLCAtMX07CiAJfQotCWZOb2RlID0gbmV3IERPTU1ldGhvZChmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBDaGFyT3BlcmF0aW9uLmNoYXJUb1N0cmluZyhuYW1lKSwgbmFtZVJhbmdlLCBjb21tZW50UmFuZ2UsIG1vZGlmaWVycywgCisJdGhpcy5mTm9kZSA9IG5ldyBET01NZXRob2QodGhpcy5mRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBDaGFyT3BlcmF0aW9uLmNoYXJUb1N0cmluZyhuYW1lKSwgbmFtZVJhbmdlLCBjb21tZW50UmFuZ2UsIG1vZGlmaWVycywKIAkJbW9kaWZpZXJzUmFuZ2UsIGlzQ29uc3RydWN0b3IsIENoYXJPcGVyYXRpb24uY2hhclRvU3RyaW5nKHJldHVyblR5cGUpLCByZXR1cm5UeXBlUmFuZ2UsCiAJCUNoYXJPcGVyYXRpb24uY2hhckFycmF5VG9TdHJpbmdBcnJheShwYXJhbWV0ZXJUeXBlcyksCi0JCUNoYXJPcGVyYXRpb24uY2hhckFycmF5VG9TdHJpbmdBcnJheShwYXJhbWV0ZXJOYW1lcyksIAorCQlDaGFyT3BlcmF0aW9uLmNoYXJBcnJheVRvU3RyaW5nQXJyYXkocGFyYW1ldGVyTmFtZXMpLAogCQlwYXJhbWV0ZXJSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyQXJyYXlUb1N0cmluZ0FycmF5KGV4Y2VwdGlvblR5cGVzKSwgZXhjZXB0aW9uUmFuZ2UsIGJvZHlSYW5nZSk7Ci0JYWRkQ2hpbGQoZk5vZGUpOwotCWZTdGFjay5wdXNoKGZOb2RlKTsKKwlhZGRDaGlsZCh0aGlzLmZOb2RlKTsKKwl0aGlzLmZTdGFjay5wdXNoKHRoaXMuZk5vZGUpOwogfQogLyoqCiAgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJDbGFzcygKQEAgLTM2OSw3ICszNzYsNyBAQAogCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCiAJaW50IG1vZGlmaWVycywKIAlpbnQgbW9kaWZpZXJzU3RhcnQsCi0JaW50IGNsYXNzU3RhcnQsIAorCWludCBjbGFzc1N0YXJ0LAogCWNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnQsCiAJaW50IG5hbWVFbmQsCkBAIC0zODEsNjIgKzM4OCw2MiBAQAogCWludFtdIHN1cGVyaW50ZXJmYWNlRW5kcywKIAlpbnQgYm9keVN0YXJ0KQogICovCi1wdWJsaWMgdm9pZCBlbnRlckNsYXNzKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXJzU3RhcnQsIGludCBrZXl3b3JkU3RhcnQsIAotCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdIHN1cGVyY2xhc3MsIGludCBzdXBlcmNsYXNzU3RhcnQsIAotCWludCBzdXBlcmNsYXNzRW5kLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMsIGludFtdIHN1cGVyaW50ZXJmYWNlU3RhcnRzLCAKK3B1YmxpYyB2b2lkIGVudGVyQ2xhc3MoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwgaW50IGtleXdvcmRTdGFydCwKKwljaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXSBzdXBlcmNsYXNzLCBpbnQgc3VwZXJjbGFzc1N0YXJ0LAorCWludCBzdXBlcmNsYXNzRW5kLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMsIGludFtdIHN1cGVyaW50ZXJmYWNlU3RhcnRzLAogCWludFtdIHN1cGVyaW50ZXJmYWNlRW5kcywgaW50IGJvZHlTdGFydCkgewogCiAJZW50ZXJUeXBlKGRlY2xhcmF0aW9uU3RhcnQsIGphdmFEb2NQb3NpdGlvbnMsIG1vZGlmaWVycywgbW9kaWZpZXJzU3RhcnQsIGtleXdvcmRTdGFydCwKLQkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBzdXBlcmNsYXNzLCBzdXBlcmNsYXNzU3RhcnQsIAotCQlzdXBlcmNsYXNzRW5kLCBzdXBlcmludGVyZmFjZXMsIHN1cGVyaW50ZXJmYWNlU3RhcnRzLCAKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBzdXBlcmNsYXNzLCBzdXBlcmNsYXNzU3RhcnQsCisJCXN1cGVyY2xhc3NFbmQsIHN1cGVyaW50ZXJmYWNlcywgc3VwZXJpbnRlcmZhY2VTdGFydHMsCiAJCXN1cGVyaW50ZXJmYWNlRW5kcywgYm9keVN0YXJ0LCB0cnVlKTsKIH0KIC8qKgogICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2VudGVyQ29uc3RydWN0b3IoCiAJaW50IGRlY2xhcmF0aW9uU3RhcnQsCi0JaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywKIAlpbnQgbW9kaWZpZXJzLAotCWludCBtb2RpZmllcnNTdGFydCwgCisJaW50IG1vZGlmaWVyc1N0YXJ0LAogCWNoYXJbXSBuYW1lLAogCWludCBuYW1lU3RhcnQsCiAJaW50IG5hbWVFbmQsCiAJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCiAJaW50IFtdIHBhcmFtZXRlclR5cGVTdGFydHMsCi0JaW50IFtdIHBhcmFtZXRlclR5cGVFbmRzLAkJCQorCWludCBbXSBwYXJhbWV0ZXJUeXBlRW5kcywKIAljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZVN0YXJ0cywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZUVuZHMsCi0JaW50IHBhcmFtZXRlcnNFbmQsCQorCWludCBwYXJhbWV0ZXJzRW5kLAogCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLAogCWludCBbXSBleGNlcHRpb25UeXBlU3RhcnRzLAogCWludCBbXSBleGNlcHRpb25UeXBlRW5kcywKIAlpbnQgYm9keVN0YXJ0KQogICovCi1wdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXJzU3RhcnQsIAotCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIAotCWludFtdIHBhcmFtZXRlclR5cGVTdGFydHMsIGludFtdIHBhcmFtZXRlclR5cGVFbmRzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgCi0JaW50W10gcGFyYW1ldGVyTmFtZVN0YXJ0cywgaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCAKLQljaGFyW11bXSBleGNlcHRpb25UeXBlcywgaW50W10gZXhjZXB0aW9uVHlwZVN0YXJ0cywgaW50W10gZXhjZXB0aW9uVHlwZUVuZHMsIAorcHVibGljIHZvaWQgZW50ZXJDb25zdHJ1Y3RvcihpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LAorCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJaW50W10gcGFyYW1ldGVyVHlwZVN0YXJ0cywgaW50W10gcGFyYW1ldGVyVHlwZUVuZHMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCWludFtdIHBhcmFtZXRlck5hbWVTdGFydHMsIGludFtdIHBhcmFtZXRlck5hbWVFbmRzLCBpbnQgcGFyYW1ldGVyc0VuZCwKKwljaGFyW11bXSBleGNlcHRpb25UeXBlcywgaW50W10gZXhjZXB0aW9uVHlwZVN0YXJ0cywgaW50W10gZXhjZXB0aW9uVHlwZUVuZHMsCiAJaW50IGJvZHlTdGFydCkgewotCQkKKwogCS8qIHNlZSAxRlZJSVFaICovCi0JU3RyaW5nIG5hbWVTdHJpbmcgPSBuZXcgU3RyaW5nKGZEb2N1bWVudCwgbmFtZVN0YXJ0LCBuYW1lRW5kIC0gbmFtZVN0YXJ0KTsKKwlTdHJpbmcgbmFtZVN0cmluZyA9IG5ldyBTdHJpbmcodGhpcy5mRG9jdW1lbnQsIG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCk7CiAJaW50IG9wZW5QYXJlblBvc2l0aW9uID0gbmFtZVN0cmluZy5pbmRleE9mKCcoJyk7CiAJaWYgKG9wZW5QYXJlblBvc2l0aW9uID4gLTEpCiAJCW5hbWVFbmQgPSBuYW1lU3RhcnQgKyBvcGVuUGFyZW5Qb3NpdGlvbiAtIDE7Ci0JCQotCWVudGVyQWJzdHJhY3RNZXRob2QoZGVjbGFyYXRpb25TdGFydCwgamF2YURvY1Bvc2l0aW9ucywgbW9kaWZpZXJzLCBtb2RpZmllcnNTdGFydCwgCi0JCW51bGwsIC0xLCAtMSwgMCwgCi0JCW5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVTdGFydHMsIAotCQlwYXJhbWV0ZXJUeXBlRW5kcywgcGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlck5hbWVTdGFydHMsIAotCQlwYXJhbWV0ZXJOYW1lRW5kcywgcGFyYW1ldGVyc0VuZCwgMCwgCi0JCS0xLCBleGNlcHRpb25UeXBlcywgZXhjZXB0aW9uVHlwZVN0YXJ0cywgCisKKwllbnRlckFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uU3RhcnQsIGphdmFEb2NQb3NpdGlvbnMsIG1vZGlmaWVycywgbW9kaWZpZXJzU3RhcnQsCisJCW51bGwsIC0xLCAtMSwgMCwKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwkJcGFyYW1ldGVyVHlwZUVuZHMsIHBhcmFtZXRlck5hbWVzLCBwYXJhbWV0ZXJOYW1lU3RhcnRzLAorCQlwYXJhbWV0ZXJOYW1lRW5kcywgcGFyYW1ldGVyc0VuZCwgMCwKKwkJLTEsIGV4Y2VwdGlvblR5cGVzLCBleGNlcHRpb25UeXBlU3RhcnRzLAogCQlleGNlcHRpb25UeXBlRW5kcywgYm9keVN0YXJ0LHRydWUpOwogfQogLyoqCiAgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJGaWVsZCgKIAlpbnQgZGVjbGFyYXRpb25TdGFydCwKLQlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAogCWludCBtb2RpZmllcnMsCiAJaW50IG1vZGlmaWVyc1N0YXJ0LAogCWNoYXJbXSB0eXBlLApAQCAtNDQ5LDE5ICs0NTYsMTkgQEAKIAlpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uQ291bnQsCiAJaW50IGV4dGVuZGVkVHlwZURpbWVuc2lvbkVuZCkKICAqLwotcHVibGljIHZvaWQgZW50ZXJGaWVsZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCAKLQljaGFyW10gdHlwZSwgaW50IHR5cGVTdGFydCwgaW50IHR5cGVFbmQsIGludCB0eXBlRGltZW5zaW9uQ291bnQsIGNoYXJbXSBuYW1lLCAKLQlpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgaW50IGV4dGVuZGVkVHlwZURpbWVuc2lvbkNvdW50LCAKK3B1YmxpYyB2b2lkIGVudGVyRmllbGQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwKKwljaGFyW10gdHlwZSwgaW50IHR5cGVTdGFydCwgaW50IHR5cGVFbmQsIGludCB0eXBlRGltZW5zaW9uQ291bnQsIGNoYXJbXSBuYW1lLAorCWludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uQ291bnQsCiAJaW50IGV4dGVuZGVkVHlwZURpbWVuc2lvbkVuZCkgewotCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIAorCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsCiAJCShleHRlbmRlZFR5cGVEaW1lbnNpb25FbmQgPiBuYW1lRW5kKSA/IGV4dGVuZGVkVHlwZURpbWVuc2lvbkVuZCA6IG5hbWVFbmR9OwogCWludFtdIG5hbWVSYW5nZSA9IHtuYW1lU3RhcnQsIG5hbWVFbmR9OwogCWludFtdIGNvbW1lbnRSYW5nZSA9IHstMSwgLTF9OwotCQlpZiAoamF2YURvY1Bvc2l0aW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gamF2YURvY1Bvc2l0aW9ucy5sZW5ndGg7Ci0JCQljb21tZW50UmFuZ2VbMF0gPSBqYXZhRG9jUG9zaXRpb25zW2xlbmd0aCAtIDJdOyAvLyBnZXQgbGFzdCBqYXZhZG9jIGNvbW1lbnQgKHNlZSBidWcgNjg3NzIpCi0JCQljb21tZW50UmFuZ2VbMV0gPSBqYXZhRG9jUG9zaXRpb25zW2xlbmd0aCAtIDFdOwotCQl9CisJaWYgKGphdmFEb2NQb3NpdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gamF2YURvY1Bvc2l0aW9ucy5sZW5ndGg7CisJCWNvbW1lbnRSYW5nZVswXSA9IGphdmFEb2NQb3NpdGlvbnNbbGVuZ3RoIC0gMl07IC8vIGdldCBsYXN0IGphdmFkb2MgY29tbWVudCAoc2VlIGJ1ZyA2ODc3MikKKwkJY29tbWVudFJhbmdlWzFdID0gamF2YURvY1Bvc2l0aW9uc1tsZW5ndGggLSAxXTsKKwl9CiAJaW50W10gbW9kaWZpZXJzUmFuZ2UgPSB7LTEsIC0xfTsKIAlpZiAobW9kaWZpZXJzU3RhcnQgPiAtMSkgewogCQltb2RpZmllcnNSYW5nZVswXSA9IG1vZGlmaWVyc1N0YXJ0OwpAQCAtNDcxLDIxICs0NzgsMjEgQEAKIAlib29sZWFuIGhhc0luaXRpYWxpemVyID0gZmFsc2U7IC8vIGZpeGVkIG9uIGV4aXRGaWVsZAogCWludFtdIGluaXRpYWxpemVyUmFuZ2UgPSB7LTEsIC0xfTsgLy8gZml4ZWQgb24gZXhpdEZpZWxkCiAJYm9vbGVhbiBpc1ZhcmlhYmxlRGVjbGFyYXRvciA9IGZhbHNlOwotCWlmIChmTm9kZSBpbnN0YW5jZW9mIERPTUZpZWxkKSB7Ci0JCURPTUZpZWxkIGZpZWxkID0gKERPTUZpZWxkKWZOb2RlOworCWlmICh0aGlzLmZOb2RlIGluc3RhbmNlb2YgRE9NRmllbGQpIHsKKwkJRE9NRmllbGQgZmllbGQgPSAoRE9NRmllbGQpdGhpcy5mTm9kZTsKIAkJaWYgKGZpZWxkLmZUeXBlUmFuZ2VbMF0gPT0gdHlwZVN0YXJ0KQogCQkJaXNWYXJpYWJsZURlY2xhcmF0b3IgPSB0cnVlOwotCX0JCi0JZk5vZGUgPSBuZXcgRE9NRmllbGQoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcobmFtZSksIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCAKLQkJbW9kaWZpZXJzLCBtb2RpZmllcnNSYW5nZSwgdHlwZVJhbmdlLCBDaGFyT3BlcmF0aW9uLmNoYXJUb1N0cmluZyh0eXBlKSwgaGFzSW5pdGlhbGl6ZXIsIAorCX0KKwl0aGlzLmZOb2RlID0gbmV3IERPTUZpZWxkKHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcobmFtZSksIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLAorCQltb2RpZmllcnMsIG1vZGlmaWVyc1JhbmdlLCB0eXBlUmFuZ2UsIENoYXJPcGVyYXRpb24uY2hhclRvU3RyaW5nKHR5cGUpLCBoYXNJbml0aWFsaXplciwKIAkJaW5pdGlhbGl6ZXJSYW5nZSwgaXNWYXJpYWJsZURlY2xhcmF0b3IpOwotCWFkZENoaWxkKGZOb2RlKTsKLQlmU3RhY2sucHVzaChmTm9kZSk7CisJYWRkQ2hpbGQodGhpcy5mTm9kZSk7CisJdGhpcy5mU3RhY2sucHVzaCh0aGlzLmZOb2RlKTsKIH0KIC8qKgogICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2VudGVySW50ZXJmYWNlKAogCWludCBkZWNsYXJhdGlvblN0YXJ0LAotCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCiAJaW50IG1vZGlmaWVycywKIAlpbnQgbW9kaWZpZXJzU3RhcnQsCiAJaW50IGludGVyZmFjZVN0YXJ0LApAQCAtNDk4LDE5ICs1MDUsMTkgQEAKIAlpbnQgYm9keVN0YXJ0KQogICovCiBwdWJsaWMgdm9pZCBlbnRlckludGVyZmFjZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCBpbnQga2V5d29yZFN0YXJ0LAotCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzLCAKKwljaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywKIAlpbnRbXSBzdXBlcmludGVyZmFjZVN0YXJ0cywgaW50W10gc3VwZXJpbnRlcmZhY2VFbmRzLCBpbnQgYm9keVN0YXJ0KSB7CiAKIAllbnRlclR5cGUoZGVjbGFyYXRpb25TdGFydCwgamF2YURvY1Bvc2l0aW9ucywgbW9kaWZpZXJzLCBtb2RpZmllcnNTdGFydCwga2V5d29yZFN0YXJ0LAotCQluYW1lLCBuYW1lU3RhcnQsIG5hbWVFbmQsIG51bGwsIC0xLCAtMSwgc3VwZXJpbnRlcmZhY2VzLCAKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBudWxsLCAtMSwgLTEsIHN1cGVyaW50ZXJmYWNlcywKIAkJc3VwZXJpbnRlcmZhY2VTdGFydHMsIHN1cGVyaW50ZXJmYWNlRW5kcywgYm9keVN0YXJ0LCBmYWxzZSk7CiB9CiAvKioKICAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNlbnRlck1ldGhvZCgKIAlpbnQgZGVjbGFyYXRpb25TdGFydCwKLQlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAogCWludCBtb2RpZmllcnMsCi0JaW50IG1vZGlmaWVyc1N0YXJ0LCAKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCiAJY2hhcltdIHJldHVyblR5cGUsCiAJaW50IHJldHVyblR5cGVTdGFydCwKIAlpbnQgcmV0dXJuVHlwZUVuZCwKQEAgLTUyMCw0MCArNTI3LDQwIEBACiAJaW50IG5hbWVFbmQsCiAJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCiAJaW50IFtdIHBhcmFtZXRlclR5cGVTdGFydHMsCi0JaW50IFtdIHBhcmFtZXRlclR5cGVFbmRzLAkJCQorCWludCBbXSBwYXJhbWV0ZXJUeXBlRW5kcywKIAljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZVN0YXJ0cywKIAlpbnQgW10gcGFyYW1ldGVyTmFtZUVuZHMsCiAJaW50IHBhcmFtZXRlcnNFbmQsCiAJaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50LAotCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsCQorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsCiAJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsCiAJaW50IFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsCiAJaW50IFtdIGV4Y2VwdGlvblR5cGVFbmRzLAogCWludCBib2R5U3RhcnQpCiAgKi8KLXB1YmxpYyB2b2lkIGVudGVyTWV0aG9kKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXJzU3RhcnQsIAotCWNoYXJbXSByZXR1cm5UeXBlLCBpbnQgcmV0dXJuVHlwZVN0YXJ0LCBpbnQgcmV0dXJuVHlwZUVuZCwgaW50IHJldHVyblR5cGVEaW1lbnNpb25Db3VudCwgCi0JY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgaW50W10gcGFyYW1ldGVyVHlwZVN0YXJ0cywgCi0JaW50W10gcGFyYW1ldGVyVHlwZUVuZHMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBpbnRbXSBwYXJhbWV0ZXJOYW1lU3RhcnRzLCAKLQlpbnRbXSBwYXJhbWV0ZXJOYW1lRW5kcywgaW50IHBhcmFtZXRlcnNFbmQsIGludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25Db3VudCwgCi0JaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZCwgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsIGludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsIAorcHVibGljIHZvaWQgZW50ZXJNZXRob2QoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwKKwljaGFyW10gcmV0dXJuVHlwZSwgaW50IHJldHVyblR5cGVTdGFydCwgaW50IHJldHVyblR5cGVFbmQsIGludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsCisJY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgaW50W10gcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwlpbnRbXSBwYXJhbWV0ZXJUeXBlRW5kcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGludFtdIHBhcmFtZXRlck5hbWVTdGFydHMsCisJaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCBpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsCisJaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZCwgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsIGludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsCiAJaW50W10gZXhjZXB0aW9uVHlwZUVuZHMsIGludCBib2R5U3RhcnQpIHsKLQllbnRlckFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uU3RhcnQsIGphdmFEb2NQb3NpdGlvbnMsIG1vZGlmaWVycywgbW9kaWZpZXJzU3RhcnQsIAotCQlyZXR1cm5UeXBlLCByZXR1cm5UeXBlU3RhcnQsIHJldHVyblR5cGVFbmQsIHJldHVyblR5cGVEaW1lbnNpb25Db3VudCwgCi0JCW5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVTdGFydHMsIAotCQlwYXJhbWV0ZXJUeXBlRW5kcywgcGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlck5hbWVTdGFydHMsIAotCQlwYXJhbWV0ZXJOYW1lRW5kcywgcGFyYW1ldGVyc0VuZCwgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAotCQlleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsIGV4Y2VwdGlvblR5cGVzLCBleGNlcHRpb25UeXBlU3RhcnRzLCAKKwllbnRlckFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uU3RhcnQsIGphdmFEb2NQb3NpdGlvbnMsIG1vZGlmaWVycywgbW9kaWZpZXJzU3RhcnQsCisJCXJldHVyblR5cGUsIHJldHVyblR5cGVTdGFydCwgcmV0dXJuVHlwZUVuZCwgcmV0dXJuVHlwZURpbWVuc2lvbkNvdW50LAorCQluYW1lLCBuYW1lU3RhcnQsIG5hbWVFbmQsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJUeXBlU3RhcnRzLAorCQlwYXJhbWV0ZXJUeXBlRW5kcywgcGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlck5hbWVTdGFydHMsCisJCXBhcmFtZXRlck5hbWVFbmRzLCBwYXJhbWV0ZXJzRW5kLCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25Db3VudCwKKwkJZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uRW5kLCBleGNlcHRpb25UeXBlcywgZXhjZXB0aW9uVHlwZVN0YXJ0cywKIAkJZXhjZXB0aW9uVHlwZUVuZHMsIGJvZHlTdGFydCxmYWxzZSk7CiB9CiAKLXByb3RlY3RlZCB2b2lkIGVudGVyVHlwZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgCi0JaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCBpbnQga2V5d29yZFN0YXJ0LCBjaGFyW10gbmFtZSwgCi0JaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXSBzdXBlcmNsYXNzLCBpbnQgc3VwZXJjbGFzc1N0YXJ0LCAKLQlpbnQgc3VwZXJjbGFzc0VuZCwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzLCBpbnRbXSBzdXBlcmludGVyZmFjZVN0YXJ0cywgCitwcm90ZWN0ZWQgdm9pZCBlbnRlclR5cGUoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsCisJaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCBpbnQga2V5d29yZFN0YXJ0LCBjaGFyW10gbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdIHN1cGVyY2xhc3MsIGludCBzdXBlcmNsYXNzU3RhcnQsCisJaW50IHN1cGVyY2xhc3NFbmQsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywgaW50W10gc3VwZXJpbnRlcmZhY2VTdGFydHMsCiAJaW50W10gc3VwZXJpbnRlcmZhY2VFbmRzLCBpbnQgYm9keVN0YXJ0LCBib29sZWFuIGlzQ2xhc3MpIHsKLQlpZiAoZkJ1aWxkaW5nVHlwZSkgeworCWlmICh0aGlzLmZCdWlsZGluZ1R5cGUpIHsKIAkJaW50W10gc291cmNlUmFuZ2UgPSB7ZGVjbGFyYXRpb25TdGFydCwgLTF9OyAvLyB3aWxsIGJlIGZpeGVkIGluIHRoZSBleGl0CiAJCWludFtdIGNvbW1lbnRSYW5nZSA9IHstMSwgLTF9OwogCQlpZiAoamF2YURvY1Bvc2l0aW9ucyAhPSBudWxsKSB7CkBAIC01OTksMTQgKzYwNiwxNCBAQAogCQkJfQogCQl9CiAJCWludFtdIG9wZW5Cb2R5UmFuZ2UgPSB7Ym9keVN0YXJ0LCAtMX07IC8vIGZpeGVkIGJ5IHNldFR5cGVSYW5nZXMoRE9NTm9kZSkKLQkJaW50W10gY2xvc2VCb2R5UmFuZ2UgPSB7LTEsIC0xfTsgLy8gd2lsbCBiZSBmaXhlZCBpbiBleGl0CQkKLQkJZk5vZGUgPSBuZXcgRE9NVHlwZShmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuZXcgU3RyaW5nKG5hbWUpLCBuYW1lUmFuZ2UsIGNvbW1lbnRSYW5nZSwgCi0JCQltb2RpZmllcnMsIG1vZGlmaWVyc1JhbmdlLCB0eXBlS2V5d29yZFJhbmdlLCBzdXBlcmNsYXNzUmFuZ2UsIGV4dGVuZHNLZXl3b3JkUmFuZ2UsIAorCQlpbnRbXSBjbG9zZUJvZHlSYW5nZSA9IHstMSwgLTF9OyAvLyB3aWxsIGJlIGZpeGVkIGluIGV4aXQKKwkJdGhpcy5mTm9kZSA9IG5ldyBET01UeXBlKHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmV3IFN0cmluZyhuYW1lKSwgbmFtZVJhbmdlLCBjb21tZW50UmFuZ2UsCisJCQltb2RpZmllcnMsIG1vZGlmaWVyc1JhbmdlLCB0eXBlS2V5d29yZFJhbmdlLCBzdXBlcmNsYXNzUmFuZ2UsIGV4dGVuZHNLZXl3b3JkUmFuZ2UsCiAJCQlDaGFyT3BlcmF0aW9uLmNoYXJBcnJheVRvU3RyaW5nQXJyYXkoc3VwZXJpbnRlcmZhY2VzKSwgaW50ZXJmYWNlc1JhbmdlLAotCQkJaW1wbGVtZW50c0tleXdvcmRSYW5nZSwgb3BlbkJvZHlSYW5nZSwgCisJCQlpbXBsZW1lbnRzS2V5d29yZFJhbmdlLCBvcGVuQm9keVJhbmdlLAogCQkJY2xvc2VCb2R5UmFuZ2UsIGlzQ2xhc3MpOwotCQlhZGRDaGlsZChmTm9kZSk7Ci0JCWZTdGFjay5wdXNoKGZOb2RlKTsKKwkJYWRkQ2hpbGQodGhpcy5mTm9kZSk7CisJCXRoaXMuZlN0YWNrLnB1c2godGhpcy5mTm9kZSk7CiAJfQogfQogLyoqCkBAIC02MTcsMTIgKzYyNCwxMiBAQAogICoJCWRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KICAqLwogcHJvdGVjdGVkIHZvaWQgZXhpdEFic3RyYWN0TWV0aG9kKGludCBib2R5RW5kLCBpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQlET01NZXRob2QgbWV0aG9kID0gKERPTU1ldGhvZCkgZlN0YWNrLnBvcCgpOworCURPTU1ldGhvZCBtZXRob2QgPSAoRE9NTWV0aG9kKSB0aGlzLmZTdGFjay5wb3AoKTsKIAltZXRob2Quc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25FbmQpOwogCW1ldGhvZC5zZXRCb2R5UmFuZ2VFbmQoYm9keUVuZCArIDEpOwotCWZOb2RlID0gbWV0aG9kOwotCWlmIChmQnVpbGRpbmdTaW5nbGVNZW1iZXIpIHsKLQkJZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSB0cnVlOworCXRoaXMuZk5vZGUgPSBtZXRob2Q7CisJaWYgKHRoaXMuZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7CisJCXRoaXMuZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSB0cnVlOwogCX0KIH0KIC8qKgpAQCAtNjUwLDEzICs2NTcsMTMgQEAKICAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0RmllbGQoaW50LCBpbnQpCiAgKi8KIHB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgYm9keUVuZCwgaW50IGRlY2xhcmF0aW9uRW5kKSB7Ci0JRE9NRmllbGQgZmllbGQgPSAoRE9NRmllbGQpZlN0YWNrLnBvcCgpOworCURPTUZpZWxkIGZpZWxkID0gKERPTUZpZWxkKXRoaXMuZlN0YWNrLnBvcCgpOwogCWlmIChmaWVsZC5nZXRFbmRQb3NpdGlvbigpIDwgZGVjbGFyYXRpb25FbmQpIHsKIAkJZmllbGQuc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25FbmQpOwogCQlpbnQgbmFtZUVuZCA9IGZpZWxkLmZOYW1lUmFuZ2VbMV07CiAJCWlmIChuYW1lRW5kIDwgYm9keUVuZCkgewogCQkJLyogc2VlIDFGVklJVjggLSBvYnRhaW4gaW5pdGlhbGl6ZXIgcmFuZ2UgKi8KLQkJCVN0cmluZyBpbml0aWFsaXplciA9IG5ldyBTdHJpbmcoZkRvY3VtZW50LCBuYW1lRW5kICsgMSwgYm9keUVuZCAtIG5hbWVFbmQpOworCQkJU3RyaW5nIGluaXRpYWxpemVyID0gbmV3IFN0cmluZyh0aGlzLmZEb2N1bWVudCwgbmFtZUVuZCArIDEsIGJvZHlFbmQgLSBuYW1lRW5kKTsKIAkJCWludCBpbmRleCA9IGluaXRpYWxpemVyLmluZGV4T2YoJz0nKTsKIAkJCWlmIChpbmRleCA+IC0xKSB7CiAJCQkJZmllbGQuc2V0SGFzSW5pdGlhbGl6ZXIodHJ1ZSk7CkBAIC02NjQsMTAgKzY3MSwxMCBAQAogCQkJfQogCQl9CiAJfQotCWZGaWVsZENvdW50Kys7Ci0JZk5vZGUgPSBmaWVsZDsKLQlpZiAoZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7Ci0JCWZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKKwl0aGlzLmZGaWVsZENvdW50Kys7CisJdGhpcy5mTm9kZSA9IGZpZWxkOworCWlmICh0aGlzLmZCdWlsZGluZ1NpbmdsZU1lbWJlcikgeworCQl0aGlzLmZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKIAl9CiB9CiAvKioKQEAgLTcwNiw4ICs3MTMsOCBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnVpbGQoY2hhcltdIHNvdXJjZUNvZGUsIGJvb2xlYW4gYnVpbGRpbmdDb21waWxhdGlvblVuaXQsIGJvb2xlYW4gYnVpbGRpbmdUeXBlLCBib29sZWFuIHNpbmdsZU1lbWJlcikgewogCXN1cGVyLmluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBidWlsZGluZ0NvbXBpbGF0aW9uVW5pdCwgYnVpbGRpbmdUeXBlKTsKLQlmQnVpbGRpbmdTaW5nbGVNZW1iZXI9IHNpbmdsZU1lbWJlcjsKLQlmRmluaXNoZWRTaW5nbGVNZW1iZXI9IGZhbHNlOworCXRoaXMuZkJ1aWxkaW5nU2luZ2xlTWVtYmVyPSBzaW5nbGVNZW1iZXI7CisJdGhpcy5mRmluaXNoZWRTaW5nbGVNZW1iZXI9IGZhbHNlOwogCiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Db21waWxhdGlvblVuaXQuamF2YQppbmRleCBkMTUwYzgzLi5lODIzOThhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNyArMjQsNyBAQAogICogQHNlZSBJRE9NQ29tcGlsYXRpb25Vbml0CiAgKiBAc2VlIERPTU5vZGUKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgogICovCiBjbGFzcyBET01Db21waWxhdGlvblVuaXQgZXh0ZW5kcyBET01Ob2RlIGltcGxlbWVudHMgSURPTUNvbXBpbGF0aW9uVW5pdCwgU3VmZml4Q29uc3RhbnRzIHsKQEAgLTM5LDcgKzM5LDcgQEAKICAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgQ09NUElMQVRJT05fVU5JVCBkb2N1bWVudCBmcmFnbWVudC4KICAqLwogRE9NQ29tcGlsYXRpb25Vbml0KCkgewotCWZIZWFkZXI9IiI7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmZIZWFkZXI9IiI7IC8vJE5PTi1OTFMtMSQKIH0KIC8qKgogICogQ3JlYXRlcyBhIG5ldyBDT01QSUxBVElPTl9VTklUIG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCkBAIC00NywxMyArNDcsMTMgQEAKICAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCiAgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCiAgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCi0gKiAJCUEgY29tcGlsYXRpb24gdW5pdCdzIHNvdXJjZSByYW5nZSBpcyB0aGUgZW50aXJlIGRvY3VtZW50IC0gCisgKiAJCUEgY29tcGlsYXRpb24gdW5pdCdzIHNvdXJjZSByYW5nZSBpcyB0aGUgZW50aXJlIGRvY3VtZW50IC0KICAqCQl0aGUgZmlyc3QgaW50ZWdlciBpcyB6ZXJvLCBhbmQgdGhlIHNlY29uZCBpbnRlZ2VyIGlzIHRoZSBwb3NpdGlvbgogICoJCW9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZG9jdW1lbnQuCiAgKi8KIERPTUNvbXBpbGF0aW9uVW5pdChjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlKSB7CiAJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBudWxsLCBuZXcgaW50W117LTEsIC0xfSk7Ci0JZkhlYWRlciA9ICIiOyAvLyROT04tTkxTLTEkCisJdGhpcy5mSGVhZGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKIH0KIC8qKgogICogQHNlZSBET01Ob2RlI2FwcGVuZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKQEAgLTcyLDcgKzcyLDcgQEAKICAqIEBzZWUgSURPTUNvbXBpbGF0aW9uVW5pdCNnZXRIZWFkZXIoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcigpIHsKLQlyZXR1cm4gZkhlYWRlcjsKKwlyZXR1cm4gdGhpcy5mSGVhZGVyOwogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI2dldEphdmFFbGVtZW50CkBAIC04MSwxNiArODEsMTYgQEAKIAlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKIAkJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudClwYXJlbnQpLmdldENvbXBpbGF0aW9uVW5pdChnZXROYW1lKCkpOwogCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9pbGxlZ2FsUGFyZW50KTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9pbGxlZ2FsUGFyZW50KTsKIAl9CiB9CiAvKioKICAqIEBzZWUgSURPTUNvbXBpbGF0aW9uVW5pdCNnZXROYW1lKCkKICAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyAKK3B1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAlJRE9NVHlwZSB0b3BMZXZlbFR5cGU9IG51bGw7CiAJSURPTVR5cGUgZmlyc3RUeXBlPSBudWxsOwotCUlET01Ob2RlIGNoaWxkPSBmRmlyc3RDaGlsZDsKKwlJRE9NTm9kZSBjaGlsZD0gdGhpcy5mRmlyc3RDaGlsZDsKIAl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewogCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJRE9NTm9kZS5UWVBFKSB7CiAJCQlJRE9NVHlwZSB0eXBlPSAoSURPTVR5cGUpY2hpbGQ7CkBAIC0xMjcsNyArMTI3LDcgQEAKIAlpZiAoY2hpbGQgIT0gbnVsbCkgewogCQlpbnQgY2hpbGRTdGFydCA9IGNoaWxkLmdldFN0YXJ0UG9zaXRpb24oKTsKIAkJaWYgKGNoaWxkU3RhcnQgPiAxKSB7Ci0JCQlzZXRIZWFkZXIobmV3IFN0cmluZyhmRG9jdW1lbnQsIDAsIGNoaWxkU3RhcnQpKTsKKwkJCXNldEhlYWRlcihuZXcgU3RyaW5nKHRoaXMuZkRvY3VtZW50LCAwLCBjaGlsZFN0YXJ0KSk7CiAJCX0KIAl9CiB9CkBAIC0xMzcsMTEgKzEzNywxMSBAQAogcHVibGljIGJvb2xlYW4gaXNBbGxvd2FibGVDaGlsZChJRE9NTm9kZSBub2RlKSB7CiAJaWYgKG5vZGUgIT0gbnVsbCkgewogCQlpbnQgdHlwZT0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBJRE9NTm9kZS5QQUNLQUdFIHx8IHR5cGUgPT0gSURPTU5vZGUuSU1QT1JUIHx8IHR5cGUgPT0gSURPTU5vZGUuVFlQRTsgCisJCXJldHVybiB0eXBlID09IElET01Ob2RlLlBBQ0tBR0UgfHwgdHlwZSA9PSBJRE9NTm9kZS5JTVBPUlQgfHwgdHlwZSA9PSBJRE9NTm9kZS5UWVBFOwogCX0gZWxzZSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIH0KIC8qKgogICogQHNlZSBET01Ob2RlCkBAIC0xNjIsNyArMTYyLDcgQEAKICAqIEBzZWUgSURPTUNvbXBpbGF0aW9uVW5pdCNzZXRIZWFkZXIoU3RyaW5nKQogICovCiBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIGNvbW1lbnQpIHsKLQlmSGVhZGVyPSBjb21tZW50OworCXRoaXMuZkhlYWRlcj0gY29tbWVudDsKIAlmcmFnbWVudCgpOwogfQogLyoqCkBAIC0xNzYsNyArMTc2LDcgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKIAlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOwotCWZIZWFkZXI9ICgoRE9NQ29tcGlsYXRpb25Vbml0KW5vZGUpLmZIZWFkZXI7CisJdGhpcy5mSGVhZGVyPSAoKERPTUNvbXBpbGF0aW9uVW5pdClub2RlKS5mSGVhZGVyOwogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YQppbmRleCAzOTk0MTI2Li44NTg0OGJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01GaWVsZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDExICsyNSwxMSBAQAogICogQHNlZSBJRE9NRmllbGQKICAqIEBzZWUgRE9NTm9kZQogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIGNsYXNzIERPTUZpZWxkIGV4dGVuZHMgRE9NTWVtYmVyIGltcGxlbWVudHMgSURPTUZpZWxkIHsKLQkKKwogCS8qKgogCSAqIENvbnRhaW5zIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCB3aGVuIHRoZSB0eXBlCiAJICogaGFzIGJlZW4gYWx0ZXJlZCBmcm9tIHRoZSBjb250ZW50cyBpbiB0aGUKQEAgLTQyLDcgKzQyLDcgQEAKIAkgKiBmaWVsZCdzIHR5cGUgaW4gdGhlIGRvY3VtZW50LgogCSAqLwogCXByb3RlY3RlZCBpbnRbXSBmVHlwZVJhbmdlOwotCQkKKwogCS8qKgogCSAqIFRoZSBjb250ZW50cyBvZiB0aGUgaW5pdGlhbGl6ZXIgd2hlbiB0aGUKIAkgKiBpbml0aWFsaXplciBoYXMgYmVlbiBhbHRlcmVkIGZyb20gdGhlCkBAIC0xMTAsMTAgKzExMCwxMCBAQAogRE9NRmllbGQoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgaW50W10gY29tbWVudFJhbmdlLCBpbnQgZmxhZ3MsIGludFtdIG1vZGlmaWVyUmFuZ2UsIGludFtdIHR5cGVSYW5nZSwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gaGFzSW5pdGlhbGl6ZXIsIGludFtdIGluaXRSYW5nZSwgYm9vbGVhbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcikgewogCXN1cGVyKGRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmFtZSwgbmFtZVJhbmdlLCBjb21tZW50UmFuZ2UsIGZsYWdzLCBtb2RpZmllclJhbmdlKTsKIAotCWZUeXBlPSB0eXBlOwotCWZUeXBlUmFuZ2U9IHR5cGVSYW5nZTsKKwl0aGlzLmZUeXBlPSB0eXBlOworCXRoaXMuZlR5cGVSYW5nZT0gdHlwZVJhbmdlOwogCXNldEhhc0luaXRpYWxpemVyKGhhc0luaXRpYWxpemVyKTsKLQlmSW5pdGlhbGl6ZXJSYW5nZT0gaW5pdFJhbmdlOworCXRoaXMuZkluaXRpYWxpemVyUmFuZ2U9IGluaXRSYW5nZTsKIAlzZXRJc1ZhcmlhYmxlRGVjbGFyYXRvcihpc1ZhcmlhYmxlRGVjbGFyYXRvcik7CiAJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCB0cnVlKTsKIApAQCAtMTYxLDMxICsxNjEsMzEgQEAKIHByb3RlY3RlZCB2b2lkIGFwcGVuZE1lbWJlckRlY2xhcmF0aW9uQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogCiAJaWYgKGlzVmFyaWFibGVEZWNsYXJhdG9yKCkpIHsKLQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZlNvdXJjZVJhbmdlWzBdLCB0aGlzLmZOYW1lUmFuZ2VbMF0gLSB0aGlzLmZTb3VyY2VSYW5nZVswXSk7CiAJfSBlbHNlIHsKIAkJYnVmZmVyCiAJCQkuYXBwZW5kKGdldFR5cGVDb250ZW50cygpKQotCQkJLmFwcGVuZChmRG9jdW1lbnQsIGZUeXBlUmFuZ2VbMV0gKyAxLCBmTmFtZVJhbmdlWzBdIC0gZlR5cGVSYW5nZVsxXSAtIDEpOworCQkJLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mVHlwZVJhbmdlWzFdICsgMSwgdGhpcy5mTmFtZVJhbmdlWzBdIC0gdGhpcy5mVHlwZVJhbmdlWzFdIC0gMSk7CiAJfQotCQorCiAJYnVmZmVyLmFwcGVuZChnZXROYW1lQ29udGVudHMoKSk7CiAJaWYgKGhhc0luaXRpYWxpemVyKCkpIHsKLQkJaWYgKGZJbml0aWFsaXplclJhbmdlWzBdIDwgMCkgeworCQlpZiAodGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVswXSA8IDApIHsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQoJz0nKQotCQkJCS5hcHBlbmQoZkluaXRpYWxpemVyKQotCQkJCS5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJCQkJLmFwcGVuZCh0aGlzLmZJbml0aWFsaXplcikKKwkJCQkuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZOYW1lUmFuZ2VbMV0gKyAxLCB0aGlzLmZTb3VyY2VSYW5nZVsxXSAtIHRoaXMuZk5hbWVSYW5nZVsxXSk7CiAJCX0gZWxzZSB7CiAJCQlidWZmZXIKLQkJCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZJbml0aWFsaXplclJhbmdlWzBdIC0gZk5hbWVSYW5nZVsxXSAtIDEpCisJCQkJLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzFdICsgMSwgdGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVswXSAtIHRoaXMuZk5hbWVSYW5nZVsxXSAtIDEpCiAJCQkJLmFwcGVuZChnZXRJbml0aWFsaXplcigpKQotCQkJCS5hcHBlbmQoZkRvY3VtZW50LCBmSW5pdGlhbGl6ZXJSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZJbml0aWFsaXplclJhbmdlWzFdKTsKKwkJCQkuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZJbml0aWFsaXplclJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZJbml0aWFsaXplclJhbmdlWzFdKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChmSW5pdGlhbGl6ZXJSYW5nZVswXSA8IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJCWlmICh0aGlzLmZJbml0aWFsaXplclJhbmdlWzBdIDwgMCkgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZOYW1lUmFuZ2VbMV0pOwogCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZJbml0aWFsaXplclJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZkluaXRpYWxpemVyUmFuZ2VbMV0pOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVsxXSArIDEsIHRoaXMuZlNvdXJjZVJhbmdlWzFdIC0gdGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVsxXSk7CiAJCX0KIAl9CiAKQEAgLTIxMiwxMSArMjEyLDExIEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIGFwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKIAkvLyBhcHBlbmQgZXZleXRoaW5nIGJlZm9yZSBteSBuYW1lCi0JYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mU291cmNlUmFuZ2VbMF0sIHRoaXMuZk5hbWVSYW5nZVswXSAtIHRoaXMuZlNvdXJjZVJhbmdlWzBdKTsKIAkvLyBhcHBlbmQgbXkgbmFtZQotCWJ1ZmZlci5hcHBlbmQoZk5hbWUpOworCWJ1ZmZlci5hcHBlbmQodGhpcy5mTmFtZSk7CiAJLy8gYXBwZW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgbXkgbmFtZQotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZOYW1lUmFuZ2VbMV0pOwogfQogLyoqCiAgKiBHZW5lcmF0ZXMgZGV0YWlsZWQgc291cmNlIGluZGV4ZXMgZm9yIHRoaXMgbm9kZSBpZiBwb3NzaWJsZS4KQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJRE9NQnVpbGRlciBidWlsZGVyID0gbmV3IERPTUJ1aWxkZXIoKTsKIAkJCUlET01GaWVsZFtdIGRldGFpbHM9IGJ1aWxkZXIuY3JlYXRlRmllbGRzKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKIAkJCWlmIChkZXRhaWxzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fY2Fubm90RGV0YWlsKTsgCisJCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fY2Fubm90RGV0YWlsKTsKIAkJCX0gZWxzZSB7CiAJCQkJbm9kZT0gdGhpczsKIAkJCQlmb3IgKGludCBpPSAwOyBpIDwgZGV0YWlscy5sZW5ndGg7IGkrKykgewpAQCAtMjY0LDcgKzI2NCw3IEBACiB9CiAvKioKICAqIEV4cGFuZHMgYWxsIHZhcmlhYmxlIGRlY2xhcmF0b3JzIGluIHRoaXMgZmllbGQgZGVjbGFyYXRpb24gaW50bwotICogc3RhbmQtYWxvbmUgZmllbGQgZGVjbGFyYXRpb25zLiAKKyAqIHN0YW5kLWFsb25lIGZpZWxkIGRlY2xhcmF0aW9ucy4KICAqLwogcHJvdGVjdGVkIHZvaWQgZXhwYW5kKCkgewogCWlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcigpIHx8IGhhc011bHRpcGxlVmFyaWFibGVEZWNsYXJhdG9ycygpKSB7CkBAIC0yOTgsNyArMjk4LDcgQEAKICAqLwogcHJvdGVjdGVkIERPTUZpZWxkIGdldEZpcnN0RmllbGREZWNsYXJhdGlvbigpIHsKIAlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgewotCQlyZXR1cm4gKChET01GaWVsZClmUHJldmlvdXNOb2RlKS5nZXRGaXJzdEZpZWxkRGVjbGFyYXRpb24oKTsKKwkJcmV0dXJuICgoRE9NRmllbGQpdGhpcy5mUHJldmlvdXNOb2RlKS5nZXRGaXJzdEZpZWxkRGVjbGFyYXRpb24oKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0zMDksMTAgKzMwOSwxMCBAQAogcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXplcigpIHsKIAliZWNvbWVEZXRhaWxlZCgpOwogCWlmIChoYXNJbml0aWFsaXplcigpKSB7Ci0JCWlmIChmSW5pdGlhbGl6ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZJbml0aWFsaXplcjsKKwkJaWYgKHRoaXMuZkluaXRpYWxpemVyICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLmZJbml0aWFsaXplcjsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGZEb2N1bWVudCwgZkluaXRpYWxpemVyUmFuZ2VbMF0sIGZJbml0aWFsaXplclJhbmdlWzFdICsgMSAtIGZJbml0aWFsaXplclJhbmdlWzBdKTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZJbml0aWFsaXplclJhbmdlWzBdLCB0aGlzLmZJbml0aWFsaXplclJhbmdlWzFdICsgMSAtIHRoaXMuZkluaXRpYWxpemVyUmFuZ2VbMF0pOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dXJuIG51bGw7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKIAkJcmV0dXJuICgoSVR5cGUpcGFyZW50KS5nZXRGaWVsZChnZXROYW1lKCkpOwogCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9pbGxlZ2FsUGFyZW50KTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9pbGxlZ2FsUGFyZW50KTsKIAl9CiB9CiAvKioKQEAgLTM0Niw3ICszNDYsNyBAQAogICogQHNlZSBET01NZW1iZXIjZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkKICAqLwogcHJvdGVjdGVkIGludCBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSB7Ci0JcmV0dXJuIGZUeXBlUmFuZ2VbMF07CisJcmV0dXJuIHRoaXMuZlR5cGVSYW5nZVswXTsKIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSNnZXROb2RlVHlwZSgpCkBAIC0zNjksMjMgKzM2OSwyMyBAQAogCQlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgewogCQkJYnVmZmVyLmFwcGVuZCgnICcpOwogCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZUeXBlUmFuZ2VbMV0gKyAxLCBmTmFtZVJhbmdlWzBdIC0gZlR5cGVSYW5nZVsxXSAtIDEpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mVHlwZVJhbmdlWzFdICsgMSwgdGhpcy5mTmFtZVJhbmdlWzBdIC0gdGhpcy5mVHlwZVJhbmdlWzFdIC0gMSk7CiAJCX0KIAl9IGVsc2UgewogCQlidWZmZXIuYXBwZW5kKGZpcnN0LmZEb2N1bWVudCwgZmlyc3QuZlNvdXJjZVJhbmdlWzBdLCBmaXJzdC5mTmFtZVJhbmdlWzBdIC0gZmlyc3QuZlNvdXJjZVJhbmdlWzBdKTsKIAl9Ci0JCisKIAlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7CiAJaWYgKGhhc0luaXRpYWxpemVyKCkpIHsKLQkJaWYgKGZJbml0aWFsaXplclJhbmdlWzBdIDwgMCkgeworCQlpZiAodGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVswXSA8IDApIHsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQoJz0nKQotCQkJCS5hcHBlbmQoZkluaXRpYWxpemVyKQorCQkJCS5hcHBlbmQodGhpcy5mSW5pdGlhbGl6ZXIpCiAJCQkJLmFwcGVuZCgnOycpCiAJCQkJLmFwcGVuZChVdGlsLmdldExpbmVTZXBhcmF0b3IoYnVmZmVyLnRvU3RyaW5nKCksIG51bGwpKTsKIAkJfSBlbHNlIHsKIAkJCWJ1ZmZlcgotCQkJCS5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZkluaXRpYWxpemVyUmFuZ2VbMF0gLSBmTmFtZVJhbmdlWzFdIC0gMSkKKwkJCQkuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZOYW1lUmFuZ2VbMV0gKyAxLCB0aGlzLmZJbml0aWFsaXplclJhbmdlWzBdIC0gdGhpcy5mTmFtZVJhbmdlWzFdIC0gMSkKIAkJCQkuYXBwZW5kKGdldEluaXRpYWxpemVyKCkpCiAJCQkJLmFwcGVuZCgnOycpCiAJCQkJLmFwcGVuZChVdGlsLmdldExpbmVTZXBhcmF0b3IoYnVmZmVyLnRvU3RyaW5nKCksIG51bGwpKTsKQEAgLTM5OSw3ICszOTksNyBAQAogICogQHNlZSBJRE9NRmllbGQjZ2V0VHlwZSgpCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQlyZXR1cm4gZlR5cGU7CisJcmV0dXJuIHRoaXMuZlR5cGU7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIHNvdWNlIGNvZGUgdG8gYmUgdXNlZCBmb3IgdGhpcwpAQCAtNDA3LDkgKzQwNyw5IEBACiAgKi8KIHByb3RlY3RlZCBjaGFyW10gZ2V0VHlwZUNvbnRlbnRzKCkgewogCWlmIChpc1R5cGVBbHRlcmVkKCkpIHsKLQkJcmV0dXJuIGZUeXBlLnRvQ2hhckFycmF5KCk7CisJCXJldHVybiB0aGlzLmZUeXBlLnRvQ2hhckFycmF5KCk7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZkRvY3VtZW50LCBmVHlwZVJhbmdlWzBdLCBmVHlwZVJhbmdlWzFdICsgMSk7CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuZkRvY3VtZW50LCB0aGlzLmZUeXBlUmFuZ2VbMF0sIHRoaXMuZlR5cGVSYW5nZVsxXSArIDEpOwogCX0KIH0KIC8qKgpAQCAtNDI0LDggKzQyNCw4IEBACiAgKiB2YXJpYWJsZSBkZWNsYXJhdG9yLCBvdGhlcndpc2UgZmFsc2U7CiAgKi8KIHByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlVmFyaWFibGVEZWNsYXJhdG9ycygpIHsKLQlyZXR1cm4gZk5leHROb2RlICE9IG51bGwgJiYgKGZOZXh0Tm9kZSBpbnN0YW5jZW9mIERPTUZpZWxkKSAmJgotCQkoKERPTUZpZWxkKWZOZXh0Tm9kZSkuaXNWYXJpYWJsZURlY2xhcmF0b3IoKTsKKwlyZXR1cm4gdGhpcy5mTmV4dE5vZGUgIT0gbnVsbCAmJiAodGhpcy5mTmV4dE5vZGUgaW5zdGFuY2VvZiBET01GaWVsZCkgJiYKKwkJKChET01GaWVsZCl0aGlzLmZOZXh0Tm9kZSkuaXNWYXJpYWJsZURlY2xhcmF0b3IoKTsKIH0KIC8qKgogICogSW5zZXJ0cyB0aGUgZ2l2ZW4gdW4tcGFyZW50ZWQgbm9kZSBhcyBhIHNpYmxpbmcgb2YgdGhpcyBub2RlLCBpbW1lZGlhdGVseSBiZWZvcmUKQEAgLTQzOSw3ICs0MzksNyBAQAogcHVibGljIHZvaWQgaW5zZXJ0U2libGluZyhJRE9NTm9kZSBzaWJsaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBET01FeGNlcHRpb24gewogCWlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcigpKSB7CiAJCWV4cGFuZCgpOwotCX0gCisJfQogCXN1cGVyLmluc2VydFNpYmxpbmcoc2libGluZyk7CiB9CiAvKioKQEAgLTQ3MSwyMyArNDcxLDIzIEBACiAJCS8vIHRvIHRoZSBlbmQgb2YgdGhlIGVuY2xvc2luZyBub2RlCiAJCURPTU5vZGUgcGFyZW50ID0gKERPTU5vZGUpIGdldFBhcmVudCgpOwogCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50IGluc3RhbmNlb2YgRE9NQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlzZXRTb3VyY2VSYW5nZUVuZChmRG9jdW1lbnQubGVuZ3RoIC0gMSk7CisJCQlzZXRTb3VyY2VSYW5nZUVuZCh0aGlzLmZEb2N1bWVudC5sZW5ndGggLSAxKTsKIAkJfSBlbHNlIHsKIAkJCS8vIHBhcmVudCBpcyBhIHR5cGUKIAkJCWludCB0ZW1wID0gKChET01UeXBlKXBhcmVudCkuZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKSAtIDE7CiAJCQlzZXRTb3VyY2VSYW5nZUVuZCh0ZW1wKTsKLQkJCWZJbnNlcnRpb25Qb3NpdGlvbiA9IE1hdGgubWF4KGZpbmRlci5nZXRMaW5lU3RhcnQodGVtcCArIDEpLCBnZXRFbmRQb3NpdGlvbigpKTsKKwkJCXRoaXMuZkluc2VydGlvblBvc2l0aW9uID0gTWF0aC5tYXgoZmluZGVyLmdldExpbmVTdGFydCh0ZW1wICsgMSksIGdldEVuZFBvc2l0aW9uKCkpOwogCQl9CiAJfSBlbHNlIHsKIAkJLy8gdGhpcyBub2RlJ3MgZW5kIHBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBub2RlCiAJCS8vIHVubGVzcyB0aGUgbmV4dCBub2RlIGlzIGEgZmllbGQgdGhhdCBpcyBkZWNsYXJlZCBhbG9uZyB3aXRoIHRoaXMgb25lCiAJCWludCB0ZW1wID0gbmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxOwotCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBNYXRoLm1heChmaW5kZXIuZ2V0TGluZVN0YXJ0KHRlbXAgKyAxKSwgZ2V0RW5kUG9zaXRpb24oKSk7Ci0JCQorCQl0aGlzLmZJbnNlcnRpb25Qb3NpdGlvbiA9IE1hdGgubWF4KGZpbmRlci5nZXRMaW5lU3RhcnQodGVtcCArIDEpLCBnZXRFbmRQb3NpdGlvbigpKTsKKwogCQluZXh0Lm5vcm1hbGl6ZVN0YXJ0UG9zaXRpb24oZ2V0RW5kUG9zaXRpb24oKSwgZmluZGVyKTsKIAkJaWYgKG5leHQgaW5zdGFuY2VvZiBET01GaWVsZCkgewogCQkJRE9NRmllbGQgZmllbGQgPSAoRE9NRmllbGQpIG5leHQ7Ci0JCQlpZiAoZmllbGQuaXNWYXJpYWJsZURlY2xhcmF0b3IoKSAmJiBmVHlwZVJhbmdlWzBdID09IGZpZWxkLmZUeXBlUmFuZ2VbMF0pCisJCQlpZiAoZmllbGQuaXNWYXJpYWJsZURlY2xhcmF0b3IoKSAmJiB0aGlzLmZUeXBlUmFuZ2VbMF0gPT0gZmllbGQuZlR5cGVSYW5nZVswXSkKIAkJCQlyZXR1cm47CiAJCX0KIAkJc2V0U291cmNlUmFuZ2VFbmQobmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxKTsKQEAgLTQ5OSw3ICs0OTksNyBAQAogdm9pZCBub3JtYWxpemVTdGFydFBvc2l0aW9uKGludCBlbmRQb3NpdGlvbiwgSUxpbmVTdGFydEZpbmRlciBmaW5kZXIpIHsKIAlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgewogCQkvLyBzdGFydCBwb3NpdGlvbiBpcyBlbmQgb2YgbGFzdCBlbGVtZW50Ci0JCXNldFN0YXJ0UG9zaXRpb24oZlByZXZpb3VzTm9kZS5nZXRFbmRQb3NpdGlvbigpICsgMSk7CisJCXNldFN0YXJ0UG9zaXRpb24odGhpcy5mUHJldmlvdXNOb2RlLmdldEVuZFBvc2l0aW9uKCkgKyAxKTsKIAl9IGVsc2UgewogCQlzdXBlci5ub3JtYWxpemVTdGFydFBvc2l0aW9uKGVuZFBvc2l0aW9uLCBmaW5kZXIpOwogCX0KQEAgLTUwOSw4ICs1MDksOCBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgewogCXN1cGVyLm9mZnNldChvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZJbml0aWFsaXplclJhbmdlLCBvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZUeXBlUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mSW5pdGlhbGl6ZXJSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZSh0aGlzLmZUeXBlUmFuZ2UsIG9mZnNldCk7CiB9CiAvKioKICAqIFNlcGFyYXRlcyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50IGFuZCBzaWJsaW5ncywgbWFpbnRhaW5pbmcgYW55IHRpZXMgdGhhdApAQCAtNTUzLDE0ICs1NTMsMTQgQEAKIAliZWNvbWVEZXRhaWxlZCgpOwogCWZyYWdtZW50KCk7CiAJc2V0SGFzSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIgIT0gbnVsbCk7Ci0JZkluaXRpYWxpemVyPSBpbml0aWFsaXplcjsKKwl0aGlzLmZJbml0aWFsaXplcj0gaW5pdGlhbGl6ZXI7CiB9CiAvKioKICAqIFNldHMgdGhlIGluaXRpYWxpemVyIHJhbmdlLgogICovCiB2b2lkIHNldEluaXRpYWxpemVyUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JZkluaXRpYWxpemVyUmFuZ2VbMF0gPSBzdGFydDsKLQlmSW5pdGlhbGl6ZXJSYW5nZVsxXSA9IGVuZDsKKwl0aGlzLmZJbml0aWFsaXplclJhbmdlWzBdID0gc3RhcnQ7CisJdGhpcy5mSW5pdGlhbGl6ZXJSYW5nZVsxXSA9IGVuZDsKIH0KIC8qKgogICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiBhcyBiZWluZyBhCkBAIC01NzUsNyArNTc1LDcgQEAKICAqLwogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAJaWYgKG5hbWUgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbE5hbWUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X251bGxOYW1lKTsKIAl9IGVsc2UgewogCQlzdXBlci5zZXROYW1lKG5hbWUpOwogCQlzZXRUeXBlQWx0ZXJlZCh0cnVlKTsKQEAgLTU4NiwxNCArNTg2LDE0IEBACiAgKi8KIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKIAlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbFR5cGUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X251bGxUeXBlKTsKIAl9CiAJYmVjb21lRGV0YWlsZWQoKTsKIAlleHBhbmQoKTsKIAlmcmFnbWVudCgpOwogCXNldFR5cGVBbHRlcmVkKHRydWUpOwogCXNldE5hbWVBbHRlcmVkKHRydWUpOwotCWZUeXBlPSB0eXBlTmFtZTsKKwl0aGlzLmZUeXBlPSB0eXBlTmFtZTsKIH0KIC8qKgogICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiBhcyBoYXZpbmcKQEAgLTYwOCwxMCArNjA4LDEwIEBACiBwcm90ZWN0ZWQgdm9pZCBzaGFyZUNvbnRlbnRzKERPTU5vZGUgbm9kZSkgewogCXN1cGVyLnNoYXJlQ29udGVudHMobm9kZSk7CiAJRE9NRmllbGQgZmllbGQ9IChET01GaWVsZClub2RlOwotCWZJbml0aWFsaXplcj0gZmllbGQuZkluaXRpYWxpemVyOwotCWZJbml0aWFsaXplclJhbmdlPSByYW5nZUNvcHkoZmllbGQuZkluaXRpYWxpemVyUmFuZ2UpOwotCWZUeXBlPSBmaWVsZC5mVHlwZTsKLQlmVHlwZVJhbmdlPSByYW5nZUNvcHkoZmllbGQuZlR5cGVSYW5nZSk7CisJdGhpcy5mSW5pdGlhbGl6ZXI9IGZpZWxkLmZJbml0aWFsaXplcjsKKwl0aGlzLmZJbml0aWFsaXplclJhbmdlPSByYW5nZUNvcHkoZmllbGQuZkluaXRpYWxpemVyUmFuZ2UpOworCXRoaXMuZlR5cGU9IGZpZWxkLmZUeXBlOworCXRoaXMuZlR5cGVSYW5nZT0gcmFuZ2VDb3B5KGZpZWxkLmZUeXBlUmFuZ2UpOwogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW1wb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUltcG9ydC5qYXZhCmluZGV4IDhjNDBjMGEuLmExMWUyNWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW1wb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNCwyOCArMjQsMjggQEAKICAqIEBzZWUgSURPTUltcG9ydAogICogQHNlZSBET01Ob2RlCiAgKiBAZGVwcmVjYXRlZCBUaGUgSkRPTSB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgYWRkaXRpb24gaW4gMi4wIG9mIHRoZSBtb3JlCi0gKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZSAKKyAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlCiAgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20gcGFja2FnZS4KICAqLwogLy8gVE9ETyAoamVyb21lKSAtIGFkZCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciAxLjUgZmVhdHVyZXMKIGNsYXNzIERPTUltcG9ydCBleHRlbmRzIERPTU5vZGUgaW1wbGVtZW50cyBJRE9NSW1wb3J0IHsKLQkKKwogCS8qKgogCSAqIEluZGljYXRlcyBpZiB0aGlzIGltcG9ydCBpcyBhbiBvbiBkZW1hbmQgdHlwZSBpbXBvcnQKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBmT25EZW1hbmQ7Ci0JCisKIAkvKioKIAkgKiBNb2RpZmllcnMgZm9yIHRoaXMgaW1wb3J0LgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IGZGbGFncyA9IEZsYWdzLkFjY0RlZmF1bHQ7Ci0JCisKIC8qKgogICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBJTVBPUlQgbm9kZS4KICAqLwogRE9NSW1wb3J0KCkgewotCWZOYW1lID0gImphdmEubGFuZy4qIjsgLy8kTk9OLU5MUy0xJAorCXRoaXMuZk5hbWUgPSAiamF2YS5sYW5nLioiOyAvLyROT04tTkxTLTEkCiAJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCB0cnVlKTsKIH0KIC8qKgpAQCAtNjgsOCArNjgsOCBAQAogICovCiBET01JbXBvcnQoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgYm9vbGVhbiBvbkRlbWFuZCwgaW50IG1vZGlmaWVycykgewogCXN1cGVyKGRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmFtZSwgbmFtZVJhbmdlKTsKLQlmT25EZW1hbmQgPSBvbkRlbWFuZDsKLQlmRmxhZ3MgPSBtb2RpZmllcnM7CisJdGhpcy5mT25EZW1hbmQgPSBvbkRlbWFuZDsKKwl0aGlzLmZGbGFncyA9IG1vZGlmaWVyczsKIAlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIHRydWUpOwogfQogLyoqCkBAIC04OCwzMSArODgsMzEgQEAKICAqLwogRE9NSW1wb3J0KGNoYXJbXSBkb2N1bWVudCwgaW50W10gc291cmNlUmFuZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKSB7CiAJdGhpcyhkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5ldyBpbnRbXSB7LTEsIC0xfSwgb25EZW1hbmQsIG1vZGlmaWVycyk7Ci0JZk9uRGVtYW5kID0gb25EZW1hbmQ7CisJdGhpcy5mT25EZW1hbmQgPSBvbkRlbWFuZDsKIAlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIGZhbHNlKTsKIH0KIC8qKgogICogQHNlZSBET01Ob2RlI2FwcGVuZEZyYWdtZW50ZWRDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCiAgKi8KIHByb3RlY3RlZCB2b2lkIGFwcGVuZEZyYWdtZW50ZWRDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7Ci0JaWYgKGZOYW1lUmFuZ2VbMF0gPCAwKSB7CisJaWYgKHRoaXMuZk5hbWVSYW5nZVswXSA8IDApIHsKIAkJYnVmZmVyCiAJCQkuYXBwZW5kKCJpbXBvcnQgIikgLy8kTk9OLU5MUy0xJAotCQkJLmFwcGVuZChmTmFtZSkKKwkJCS5hcHBlbmQodGhpcy5mTmFtZSkKIAkJCS5hcHBlbmQoJzsnKQogCQkJLmFwcGVuZChVdGlsLmdldExpbmVTZXBhcmF0b3IoYnVmZmVyLnRvU3RyaW5nKCksIG51bGwpKTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mU291cmNlUmFuZ2VbMF0sIHRoaXMuZk5hbWVSYW5nZVswXSAtIHRoaXMuZlNvdXJjZVJhbmdlWzBdKTsKIAkJLy9idWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVswXSwgZk5hbWVSYW5nZVsxXSAtIGZOYW1lUmFuZ2VbMF0gKyAxKTsKLQkJYnVmZmVyLmFwcGVuZChmTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5mTmFtZSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZk5hbWVSYW5nZVsxXSArIDEsIHRoaXMuZlNvdXJjZVJhbmdlWzFdIC0gdGhpcy5mTmFtZVJhbmdlWzFdKTsKIAl9CiB9Ci0vKiogCisvKioKICAqIEBzZWUgSURPTU5vZGUjZ2V0Q29udGVudHMoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgewotCWlmIChmTmFtZSA9PSBudWxsKSB7CisJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkgewogCQlyZXR1cm4gbnVsbDsKIAl9IGVsc2UgewogCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewogCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KXBhcmVudCkuZ2V0SW1wb3J0KGdldE5hbWUoKSk7CiAJfSBlbHNlIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X2lsbGVnYWxQYXJlbnQpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X2lsbGVnYWxQYXJlbnQpOwogCX0KIH0KIC8qKgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgKiBAc2VlIElET01JbXBvcnQjaXNPbkRlbWFuZCgpCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzT25EZW1hbmQoKSB7Ci0JcmV0dXJuIGZPbkRlbWFuZDsJCisJcmV0dXJuIHRoaXMuZk9uRGVtYW5kOwogfQogLyoqCiAgKiBAc2VlIERPTU5vZGUKQEAgLTE1NywxMSArMTU3LDExIEBACiAgKi8KIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKIAlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9udWxsTmFtZSk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbE5hbWUpOwogCX0KIAliZWNvbWVEZXRhaWxlZCgpOwogCXN1cGVyLnNldE5hbWUobmFtZSk7Ci0JZk9uRGVtYW5kID0gbmFtZS5lbmRzV2l0aCgiLioiKTsgLy8kTk9OLU5MUy0xJAorCXRoaXMuZk9uRGVtYW5kID0gbmFtZS5lbmRzV2l0aCgiLioiKTsgLy8kTk9OLU5MUy0xJAogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YQppbmRleCA3NGFhZjAxLi4wODViMzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Jbml0aWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDcgKzIyLDcgQEAKICAqIEBzZWUgSURPTUluaXRpYWxpemVyCiAgKiBAc2VlIERPTU5vZGUKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgogICovCiBjbGFzcyBET01Jbml0aWFsaXplciBleHRlbmRzIERPTU1lbWJlciBpbXBsZW1lbnRzIElET01Jbml0aWFsaXplciB7CkBAIC03NSw5ICs3NSw5IEBACiAgKi8KIERPTUluaXRpYWxpemVyKGNoYXJbXSBkb2N1bWVudCwgaW50W10gc291cmNlUmFuZ2UsIGludFtdIGNvbW1lbnRSYW5nZSwgaW50IGZsYWdzLCBpbnRbXSBtb2RpZmllclJhbmdlLCBpbnQgYm9keVN0YXJ0UG9zaXRpb24pIHsKIAlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG51bGwsIG5ldyBpbnRbXXstMSwgLTF9LCBjb21tZW50UmFuZ2UsIGZsYWdzLCBtb2RpZmllclJhbmdlKTsKLQlmQm9keVJhbmdlPSBuZXcgaW50WzJdOwotCWZCb2R5UmFuZ2VbMF09IGJvZHlTdGFydFBvc2l0aW9uOwotCWZCb2R5UmFuZ2VbMV09IHNvdXJjZVJhbmdlWzFdOworCXRoaXMuZkJvZHlSYW5nZT0gbmV3IGludFsyXTsKKwl0aGlzLmZCb2R5UmFuZ2VbMF09IGJvZHlTdGFydFBvc2l0aW9uOworCXRoaXMuZkJvZHlSYW5nZVsxXT0gc291cmNlUmFuZ2VbMV07CiAJc2V0SGFzQm9keSh0cnVlKTsKIAlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIHRydWUpOwogfQpAQCAtOTcsNyArOTcsNyBAQAogRE9NSW5pdGlhbGl6ZXIoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgaW50IGZsYWdzKSB7CiAJdGhpcyhkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZmxhZ3MsIG5ldyBpbnRbXSB7LTEsIC0xfSwgLTEpOwogCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgZmFsc2UpOwotCQorCiB9CiAvKioKICAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZE1lbWJlckJvZHlDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlpZiAoaGFzQm9keSgpKSB7CiAJCWJ1ZmZlcgogCQkJLmFwcGVuZChnZXRCb2R5KCkpCi0JCQkuYXBwZW5kKGZEb2N1bWVudCwgZkJvZHlSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZCb2R5UmFuZ2VbMV0pOworCQkJLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mQm9keVJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZCb2R5UmFuZ2VbMV0pOwogCX0gZWxzZSB7CiAJCWJ1ZmZlci5hcHBlbmQoInt9IikuYXBwZW5kKFV0aWwuZ2V0TGluZVNlcGFyYXRvcihidWZmZXIudG9TdHJpbmcoKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTIyLDExICsxMjIsMTEgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2ltcGxlQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogCS8vIGFwcGVuZCBldmV5dGhpbmcgYmVmb3JlIG15IG5hbWUKLQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZTb3VyY2VSYW5nZVswXSwgdGhpcy5mTmFtZVJhbmdlWzBdIC0gdGhpcy5mU291cmNlUmFuZ2VbMF0pOwogCS8vIGFwcGVuZCBteSBuYW1lCi0JYnVmZmVyLmFwcGVuZChmTmFtZSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZOYW1lKTsKIAkvLyBhcHBlbmQgZXZlcnl0aGluZyBhZnRlciBteSBuYW1lCi0JYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZOYW1lUmFuZ2VbMV0gKyAxLCB0aGlzLmZTb3VyY2VSYW5nZVsxXSAtIHRoaXMuZk5hbWVSYW5nZVsxXSk7CiB9CiAvKioKICAqIEBzZWUgSURPTUluaXRpYWxpemVyI2dldEJvZHkoKQpAQCAtMTM0LDEwICsxMzQsMTAgQEAKIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKIAliZWNvbWVEZXRhaWxlZCgpOwogCWlmIChoYXNCb2R5KCkpIHsKLQkJaWYgKGZCb2R5ICE9IG51bGwpIHsKLQkJCXJldHVybiBmQm9keTsKKwkJaWYgKHRoaXMuZkJvZHkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMuZkJvZHk7CiAJCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhmRG9jdW1lbnQsIGZCb2R5UmFuZ2VbMF0sIGZCb2R5UmFuZ2VbMV0gKyAxIC0gZkJvZHlSYW5nZVswXSk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZEb2N1bWVudCwgdGhpcy5mQm9keVJhbmdlWzBdLCB0aGlzLmZCb2R5UmFuZ2VbMV0gKyAxIC0gdGhpcy5mQm9keVJhbmdlWzBdKTsKIAkJfQogCX0gZWxzZSB7CiAJCXJldHVybiBudWxsOwpAQCAtMTY0LDE0ICsxNjQsMTQgQEAKIAkJfQogCQlyZXR1cm4gKChJVHlwZSkgcGFyZW50KS5nZXRJbml0aWFsaXplcihjb3VudCk7CiAJfSBlbHNlIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X2lsbGVnYWxQYXJlbnQpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X2lsbGVnYWxQYXJlbnQpOwogCX0KIH0KIC8qKgogICogQHNlZSBET01NZW1iZXIjZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkKICAqLwogcHJvdGVjdGVkIGludCBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSB7Ci0JcmV0dXJuIGZCb2R5UmFuZ2VbMF07CisJcmV0dXJuIHRoaXMuZkJvZHlSYW5nZVswXTsKIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSNnZXROb2RlVHlwZSgpCkBAIC0xOTksMTQgKzE5OSwxNCBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgewogCXN1cGVyLm9mZnNldChvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZCb2R5UmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mQm9keVJhbmdlLCBvZmZzZXQpOwogfQogLyoqCiAgKiBAc2VlIElET01Jbml0aWFsaXplciNzZXRCb2R5KFN0cmluZykKICAqLwogcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgYm9keSkgewogCWJlY29tZURldGFpbGVkKCk7Ci0JZkJvZHk9IGJvZHk7CisJdGhpcy5mQm9keT0gYm9keTsKIAlzZXRIYXNCb2R5KGJvZHkgIT0gbnVsbCk7CiAJZnJhZ21lbnQoKTsKIH0KQEAgLTIyMiw4ICsyMjIsOCBAQAogcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKIAlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOwogCURPTUluaXRpYWxpemVyIGluaXQ9IChET01Jbml0aWFsaXplcilub2RlOwotCWZCb2R5PSBpbml0LmZCb2R5OwotCWZCb2R5UmFuZ2U9IHJhbmdlQ29weShpbml0LmZCb2R5UmFuZ2UpOworCXRoaXMuZkJvZHk9IGluaXQuZkJvZHk7CisJdGhpcy5mQm9keVJhbmdlPSByYW5nZUNvcHkoaW5pdC5mQm9keVJhbmdlKTsKIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSN0b1N0cmluZygpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZW1iZXIuamF2YQppbmRleCAxOWMxMjQyLi5lZThjN2Y4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1lbWJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsNyArMjEsNyBAQAogICogQHNlZSBJRE9NTWVtYmVyCiAgKiBAc2VlIERPTU5vZGUKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgogICovCiBhYnN0cmFjdCBjbGFzcyBET01NZW1iZXIgZXh0ZW5kcyBET01Ob2RlIGltcGxlbWVudHMgSURPTU1lbWJlciB7CkBAIC00OCw3ICs0OCw3IEBACiAKIAogCS8qKgotCSAqIFRoZSBtZW1iZXIncyBtb2RpZmllcnMgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB3aGVuIAorCSAqIFRoZSBtZW1iZXIncyBtb2RpZmllcnMgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB3aGVuCiAJICogdGhlIG1vZGlmaWVycyAoZmxhZ3MpIGhhdmUgYmVlbiBhbHRlcmVkIGZyb20KIAkgKiB0aGVpciBvcmlnaW5hbCBjb250ZW50cywgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqLwpAQCAtMTAwLDEwICsxMDAsMTAgQEAKICAqLwogRE9NTWVtYmVyKGNoYXJbXSBkb2N1bWVudCwgaW50W10gc291cmNlUmFuZ2UsIFN0cmluZyBuYW1lLCBpbnRbXSBuYW1lUmFuZ2UsIGludFtdIGNvbW1lbnRSYW5nZSwgaW50IGZsYWdzLCBpbnRbXSBtb2RpZmllclJhbmdlKSB7CiAJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UpOwotCWZGbGFncz0gZmxhZ3M7Ci0JZkNvbW1lbnQ9IG51bGw7Ci0JZkNvbW1lbnRSYW5nZT0gY29tbWVudFJhbmdlOwotCWZNb2RpZmllclJhbmdlPSBtb2RpZmllclJhbmdlOworCXRoaXMuZkZsYWdzPSBmbGFnczsKKwl0aGlzLmZDb21tZW50PSBudWxsOworCXRoaXMuZkNvbW1lbnRSYW5nZT0gY29tbWVudFJhbmdlOworCXRoaXMuZk1vZGlmaWVyUmFuZ2U9IG1vZGlmaWVyUmFuZ2U7CiAJc2V0SGFzQ29tbWVudChjb21tZW50UmFuZ2VbMF0gPj0gMCk7CiB9CiAvKioKQEAgLTE1MSwzMSArMTUxLDMxIEBACiAKIAkvLyBzcGFjZSBiZWZvcmUgY29tbWVudAogCWlmIChoYXNDb21tZW50KCkpIHsKLQkJc3BhY2VTdGFydD0gZlNvdXJjZVJhbmdlWzBdOwotCQlzcGFjZUVuZD0gZkNvbW1lbnRSYW5nZVswXTsKKwkJc3BhY2VTdGFydD0gdGhpcy5mU291cmNlUmFuZ2VbMF07CisJCXNwYWNlRW5kPSB0aGlzLmZDb21tZW50UmFuZ2VbMF07CiAJCWlmIChzcGFjZUVuZCA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBzcGFjZVN0YXJ0LCBzcGFjZUVuZCAtIHNwYWNlU3RhcnQpOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgc3BhY2VTdGFydCwgc3BhY2VFbmQgLSBzcGFjZVN0YXJ0KTsKIAkJfQogCX0KLQkKKwogCVN0cmluZyBmcmFnbWVudD0gZ2V0Q29tbWVudCgpOwogCWlmIChmcmFnbWVudCAhPSBudWxsKSB7CiAJCWJ1ZmZlci5hcHBlbmQoZnJhZ21lbnQpOwogCX0KIAotCWlmIChmQ29tbWVudFJhbmdlWzFdID49IDApIHsKLQkJc3BhY2VTdGFydD0gZkNvbW1lbnRSYW5nZVsxXSArIDE7CisJaWYgKHRoaXMuZkNvbW1lbnRSYW5nZVsxXSA+PSAwKSB7CisJCXNwYWNlU3RhcnQ9IHRoaXMuZkNvbW1lbnRSYW5nZVsxXSArIDE7CiAJfSBlbHNlIHsKLQkJc3BhY2VTdGFydD0gZlNvdXJjZVJhbmdlWzBdOworCQlzcGFjZVN0YXJ0PSB0aGlzLmZTb3VyY2VSYW5nZVswXTsKIAl9Ci0JaWYgKGZNb2RpZmllclJhbmdlWzBdID49IDApIHsKLQkJc3BhY2VFbmQ9IGZNb2RpZmllclJhbmdlWzBdIC0gMTsKKwlpZiAodGhpcy5mTW9kaWZpZXJSYW5nZVswXSA+PSAwKSB7CisJCXNwYWNlRW5kPSB0aGlzLmZNb2RpZmllclJhbmdlWzBdIC0gMTsKIAl9IGVsc2UgewogCQlzcGFjZUVuZD0gZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkgLSAxOwogCX0KIAogCWlmIChzcGFjZUVuZCA+PSBzcGFjZVN0YXJ0KSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBzcGFjZVN0YXJ0LCBzcGFjZUVuZCArIDEgLSBzcGFjZVN0YXJ0KTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgc3BhY2VTdGFydCwgc3BhY2VFbmQgKyAxIC0gc3BhY2VTdGFydCk7CiAJfQogCWJ1ZmZlci5hcHBlbmQoZ2V0TW9kaWZpZXJzVGV4dCgpKTsKIApAQCAtMjE3LDEwICsyMTcsMTAgQEAKIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKIAliZWNvbWVEZXRhaWxlZCgpOwogCWlmIChoYXNDb21tZW50KCkpIHsKLQkJaWYgKGZDb21tZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBmQ29tbWVudDsKKwkJaWYgKHRoaXMuZkNvbW1lbnQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMuZkNvbW1lbnQ7CiAJCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhmRG9jdW1lbnQsIGZDb21tZW50UmFuZ2VbMF0sIGZDb21tZW50UmFuZ2VbMV0gKyAxIC0gZkNvbW1lbnRSYW5nZVswXSk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZEb2N1bWVudCwgdGhpcy5mQ29tbWVudFJhbmdlWzBdLCB0aGlzLmZDb21tZW50UmFuZ2VbMV0gKyAxIC0gdGhpcy5mQ29tbWVudFJhbmdlWzBdKTsKIAkJfQogCX0gZWxzZSB7CiAJCXJldHVybiBudWxsOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgKiBAc2VlIElET01NZW1iZXIjZ2V0RmxhZ3MoKQogICovCiBwdWJsaWMgaW50IGdldEZsYWdzKCkgewotCXJldHVybiBmRmxhZ3M7CisJcmV0dXJuIHRoaXMuZkZsYWdzOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBtZW1iZXIncyBkZWNsYXJhdGlvbgpAQCAtMjQzLDE0ICsyNDMsMTQgQEAKICAqIG9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZS4KICAqLwogcHJvdGVjdGVkIGNoYXJbXSBnZXRNb2RpZmllcnNUZXh0KCkgewotCWlmIChmTW9kaWZpZXJzID09IG51bGwpIHsKLQkJaWYgKGZNb2RpZmllclJhbmdlWzBdIDwgMCkgeworCWlmICh0aGlzLmZNb2RpZmllcnMgPT0gbnVsbCkgeworCQlpZiAodGhpcy5mTW9kaWZpZXJSYW5nZVswXSA8IDApIHsKIAkJCXJldHVybiBudWxsOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZkRvY3VtZW50LCBmTW9kaWZpZXJSYW5nZVswXSwgZk1vZGlmaWVyUmFuZ2VbMV0gKyAxKTsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRoaXMuZkRvY3VtZW50LCB0aGlzLmZNb2RpZmllclJhbmdlWzBdLCB0aGlzLmZNb2RpZmllclJhbmdlWzFdICsgMSk7CiAJCX0KIAl9IGVsc2UgewotCQlyZXR1cm4gZk1vZGlmaWVyczsKKwkJcmV0dXJuIHRoaXMuZk1vZGlmaWVyczsKIAl9CiB9CiAvKioKQEAgLTI3MCwzNiArMjcwLDM2IEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIG9mZnNldChpbnQgb2Zmc2V0KSB7CiAJc3VwZXIub2Zmc2V0KG9mZnNldCk7Ci0Jb2Zmc2V0UmFuZ2UoZkNvbW1lbnRSYW5nZSwgb2Zmc2V0KTsKLQlvZmZzZXRSYW5nZShmTW9kaWZpZXJSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZSh0aGlzLmZDb21tZW50UmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mTW9kaWZpZXJSYW5nZSwgb2Zmc2V0KTsKIH0KIC8qKgogICogQHNlZSBJRE9NTWVtYmVyI3NldENvbW1lbnQoU3RyaW5nKQogICovCiBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CiAJYmVjb21lRGV0YWlsZWQoKTsKLQlmQ29tbWVudD0gY29tbWVudDsKKwl0aGlzLmZDb21tZW50PSBjb21tZW50OwogCWZyYWdtZW50KCk7CiAJc2V0SGFzQ29tbWVudChjb21tZW50ICE9IG51bGwpOwogCS8qIHNlZSAxRlZJSkFIICovCiAJaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50LmluZGV4T2YoIkBkZXByZWNhdGVkIikgPj0gMCkgeyAvLyROT04tTkxTLTEkCi0JCWZGbGFncz0gZkZsYWdzIHwgQ2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQ7CisJCXRoaXMuZkZsYWdzPSB0aGlzLmZGbGFncyB8IENsYXNzRmlsZUNvbnN0YW50cy5BY2NEZXByZWNhdGVkOwogCQlyZXR1cm47CiAJfQotCWZGbGFncz0gZkZsYWdzICYgKH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7CisJdGhpcy5mRmxhZ3M9IHRoaXMuZkZsYWdzICYgKH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7CiB9CiAvKioKICAqIEBzZWUgSURPTU1lbWJlciNzZXRGbGFncyhpbnQpCiAgKi8KIHB1YmxpYyB2b2lkIHNldEZsYWdzKGludCBmbGFncykgewogCWJlY29tZURldGFpbGVkKCk7Ci0JaWYgKEZsYWdzLmlzRGVwcmVjYXRlZChmRmxhZ3MpKSB7Ci0JCWZGbGFncz0gZmxhZ3MgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZDsKKwlpZiAoRmxhZ3MuaXNEZXByZWNhdGVkKHRoaXMuZkZsYWdzKSkgeworCQl0aGlzLmZGbGFncz0gZmxhZ3MgfCBDbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZDsKIAl9IGVsc2UgewotCQlmRmxhZ3M9IGZsYWdzICYgKH5DbGFzc0ZpbGVDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7CisJCXRoaXMuZkZsYWdzPSBmbGFncyAmICh+Q2xhc3NGaWxlQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOwogCX0KIAlmcmFnbWVudCgpOwotCWZNb2RpZmllcnM9IGdlbmVyYXRlRmxhZ3MoKTsKKwl0aGlzLmZNb2RpZmllcnM9IGdlbmVyYXRlRmxhZ3MoKTsKIH0KIC8qKgogICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24gYXMgaGF2aW5nCkBAIC0zMjQsOCArMzI0LDggQEAKICAqIG5vZGUuCiAgKi8KIHByb3RlY3RlZCB2b2lkIHNldFN0YXJ0UG9zaXRpb24oaW50IHN0YXJ0KSB7Ci0JaWYgKGZDb21tZW50UmFuZ2VbMF0gPj0gMCkgewotCQlmQ29tbWVudFJhbmdlWzBdPSBzdGFydDsKKwlpZiAodGhpcy5mQ29tbWVudFJhbmdlWzBdID49IDApIHsKKwkJdGhpcy5mQ29tbWVudFJhbmdlWzBdPSBzdGFydDsKIAl9CiAJc3VwZXIuc2V0U3RhcnRQb3NpdGlvbihzdGFydCk7CiB9CkBAIC0zMzUsMTAgKzMzNSwxMCBAQAogcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKIAlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOwogCURPTU1lbWJlciBtZW1iZXI9IChET01NZW1iZXIpbm9kZTsKLQlmQ29tbWVudD0gbWVtYmVyLmZDb21tZW50OwotCWZDb21tZW50UmFuZ2U9IHJhbmdlQ29weShtZW1iZXIuZkNvbW1lbnRSYW5nZSk7Ci0JZkZsYWdzPSBtZW1iZXIuZkZsYWdzOwotCWZNb2RpZmllcnM9IG1lbWJlci5mTW9kaWZpZXJzOwotCWZNb2RpZmllclJhbmdlPSByYW5nZUNvcHkobWVtYmVyLmZNb2RpZmllclJhbmdlKTsKKwl0aGlzLmZDb21tZW50PSBtZW1iZXIuZkNvbW1lbnQ7CisJdGhpcy5mQ29tbWVudFJhbmdlPSByYW5nZUNvcHkobWVtYmVyLmZDb21tZW50UmFuZ2UpOworCXRoaXMuZkZsYWdzPSBtZW1iZXIuZkZsYWdzOworCXRoaXMuZk1vZGlmaWVycz0gbWVtYmVyLmZNb2RpZmllcnM7CisJdGhpcy5mTW9kaWZpZXJSYW5nZT0gcmFuZ2VDb3B5KG1lbWJlci5mTW9kaWZpZXJSYW5nZSk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZXRob2QuamF2YQppbmRleCBkYjgwY2ZjLi5hNzAyMGQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogICogQHNlZSBJRE9NTWV0aG9kCiAgKiBAc2VlIERPTU5vZGUKICAqIEBkZXByZWNhdGVkIFRoZSBKRE9NIHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBhZGRpdGlvbiBpbiAyLjAgb2YgdGhlIG1vcmUKLSAqIHBvd2VyZnVsLCBmaW5lLWdyYWluZWQgRE9NL0FTVCBBUEkgZm91bmQgaW4gdGhlIAorICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUKICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbSBwYWNrYWdlLgogICovCiAvLyBUT0RPIChqZXJvbWUpIC0gYWRkIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIDEuNSBmZWF0dXJlcwpAQCAtNzksNyArNzksNyBAQAogCSAqIG1ldGhvZCdzIGV4Y2VwdGlvbiBsaXN0IGluIHRoZSBkb2N1bWVudC4KIAkgKi8KIAlwcm90ZWN0ZWQgaW50W10gIGZFeGNlcHRpb25SYW5nZTsKLQkKKwogCS8qKgogCSAqIENvbnRhaW5zIHRoZSBtZXRob2QncyBib2R5IHdoZW4gdGhlIGJvZHkgaGFzCiAJICogYmVlbiBhbHRlcmVkIGZyb20gdGhlIGNvbnRlbnRzIGluIHRoZSBkb2N1bWVudCwKQEAgLTEyNiw3ICsxMjYsNyBAQAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nIGZEZWZhdWx0VmFsdWUgPSBudWxsOwotCQorCiAvKioKICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgbWV0aG9kIG5vZGUuCiAgKi8KQEAgLTE5OCwxNyArMTk4LDE3IEBACiAJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UsIGNvbW1lbnRSYW5nZSwgZmxhZ3MsIG1vZGlmaWVyUmFuZ2UpOwogCiAJc2V0TWFzayhNQVNLX0lTX0NPTlNUUlVDVE9SLCBpc0NvbnN0cnVjdG9yKTsKLQlmUmV0dXJuVHlwZT0gcmV0dXJuVHlwZTsKLQlmUmV0dXJuVHlwZVJhbmdlPSByZXR1cm5UeXBlUmFuZ2U7Ci0JZlBhcmFtZXRlclR5cGVzPSBwYXJhbWV0ZXJUeXBlczsKLQlmUGFyYW1ldGVyTmFtZXM9IHBhcmFtZXRlck5hbWVzOwotCWZQYXJhbWV0ZXJSYW5nZT0gcGFyYW1ldGVyUmFuZ2U7Ci0JZkV4Y2VwdGlvblJhbmdlPSBleGNlcHRpb25SYW5nZTsKLQlmRXhjZXB0aW9ucz0gZXhjZXB0aW9uczsKKwl0aGlzLmZSZXR1cm5UeXBlPSByZXR1cm5UeXBlOworCXRoaXMuZlJldHVyblR5cGVSYW5nZT0gcmV0dXJuVHlwZVJhbmdlOworCXRoaXMuZlBhcmFtZXRlclR5cGVzPSBwYXJhbWV0ZXJUeXBlczsKKwl0aGlzLmZQYXJhbWV0ZXJOYW1lcz0gcGFyYW1ldGVyTmFtZXM7CisJdGhpcy5mUGFyYW1ldGVyUmFuZ2U9IHBhcmFtZXRlclJhbmdlOworCXRoaXMuZkV4Y2VwdGlvblJhbmdlPSBleGNlcHRpb25SYW5nZTsKKwl0aGlzLmZFeGNlcHRpb25zPSBleGNlcHRpb25zOwogCXNldEhhc0JvZHkodHJ1ZSk7Ci0JZkJvZHlSYW5nZT0gYm9keVJhbmdlOworCXRoaXMuZkJvZHlSYW5nZT0gYm9keVJhbmdlOwogCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7Ci0JCisKIH0KIC8qKgogICogQ3JlYXRlcyBhIG5ldyBzaW1wbGUgTUVUSE9EIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCkBAIC0yNDYsNDggKzI0Niw0OCBAQAogICovCiBwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCWlmIChuYW1lID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbEV4Y2VwdGlvblR5cGUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbEV4Y2VwdGlvblR5cGUpOwogCX0KLQlpZiAoZkV4Y2VwdGlvbnMgPT0gbnVsbCkgewotCQlmRXhjZXB0aW9ucz0gbmV3IFN0cmluZ1sxXTsKLQkJZkV4Y2VwdGlvbnNbMF09IG5hbWU7CisJaWYgKHRoaXMuZkV4Y2VwdGlvbnMgPT0gbnVsbCkgeworCQl0aGlzLmZFeGNlcHRpb25zPSBuZXcgU3RyaW5nWzFdOworCQl0aGlzLmZFeGNlcHRpb25zWzBdPSBuYW1lOwogCX0gZWxzZSB7Ci0JCWZFeGNlcHRpb25zPSBhcHBlbmRTdHJpbmcoZkV4Y2VwdGlvbnMsIG5hbWUpOworCQl0aGlzLmZFeGNlcHRpb25zPSBhcHBlbmRTdHJpbmcodGhpcy5mRXhjZXB0aW9ucywgbmFtZSk7CiAJfQotCXNldEV4Y2VwdGlvbnMoZkV4Y2VwdGlvbnMpOworCXNldEV4Y2VwdGlvbnModGhpcy5mRXhjZXB0aW9ucyk7CiB9CiAvKioKICAqIEBzZWUgSURPTU1ldGhvZCNhZGRQYXJhbWV0ZXIoU3RyaW5nLCBTdHJpbmcpCiAgKi8KIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCWlmICh0eXBlID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbFR5cGVQYXJhbWV0ZXIpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbFR5cGVQYXJhbWV0ZXIpOwogCX0KIAlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZG9tX251bGxOYW1lUGFyYW1ldGVyKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZG9tX251bGxOYW1lUGFyYW1ldGVyKTsKIAl9Ci0JaWYgKGZQYXJhbWV0ZXJOYW1lcyA9PSBudWxsKSB7Ci0JCWZQYXJhbWV0ZXJOYW1lcz0gbmV3IFN0cmluZ1sxXTsKLQkJZlBhcmFtZXRlck5hbWVzWzBdPSBuYW1lOworCWlmICh0aGlzLmZQYXJhbWV0ZXJOYW1lcyA9PSBudWxsKSB7CisJCXRoaXMuZlBhcmFtZXRlck5hbWVzPSBuZXcgU3RyaW5nWzFdOworCQl0aGlzLmZQYXJhbWV0ZXJOYW1lc1swXT0gbmFtZTsKIAl9IGVsc2UgewotCQlmUGFyYW1ldGVyTmFtZXM9IGFwcGVuZFN0cmluZyhmUGFyYW1ldGVyTmFtZXMsIG5hbWUpOworCQl0aGlzLmZQYXJhbWV0ZXJOYW1lcz0gYXBwZW5kU3RyaW5nKHRoaXMuZlBhcmFtZXRlck5hbWVzLCBuYW1lKTsKIAl9Ci0JaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCWZQYXJhbWV0ZXJUeXBlcz0gbmV3IFN0cmluZ1sxXTsKLQkJZlBhcmFtZXRlclR5cGVzWzBdPSB0eXBlOworCWlmICh0aGlzLmZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7CisJCXRoaXMuZlBhcmFtZXRlclR5cGVzPSBuZXcgU3RyaW5nWzFdOworCQl0aGlzLmZQYXJhbWV0ZXJUeXBlc1swXT0gdHlwZTsKIAl9IGVsc2UgewotCQlmUGFyYW1ldGVyVHlwZXM9IGFwcGVuZFN0cmluZyhmUGFyYW1ldGVyVHlwZXMsIHR5cGUpOworCQl0aGlzLmZQYXJhbWV0ZXJUeXBlcz0gYXBwZW5kU3RyaW5nKHRoaXMuZlBhcmFtZXRlclR5cGVzLCB0eXBlKTsKIAl9Ci0Jc2V0UGFyYW1ldGVycyhmUGFyYW1ldGVyVHlwZXMsIGZQYXJhbWV0ZXJOYW1lcyk7CisJc2V0UGFyYW1ldGVycyh0aGlzLmZQYXJhbWV0ZXJUeXBlcywgdGhpcy5mUGFyYW1ldGVyTmFtZXMpOwogfQogLyoqCiAgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyKQogICovCiBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewotCWlmIChmQm9keSAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZkJvZHkpOworCWlmICh0aGlzLmZCb2R5ICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZCb2R5KTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkJvZHlSYW5nZVswXSwgZkJvZHlSYW5nZVsxXSArIDEgLSBmQm9keVJhbmdlWzBdKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mQm9keVJhbmdlWzBdLCB0aGlzLmZCb2R5UmFuZ2VbMV0gKyAxIC0gdGhpcy5mQm9keVJhbmdlWzBdKTsKIAl9CiB9CiAvKioKQEAgLTI5OCw3MyArMjk4LDczIEBACiAJaWYgKGlzQ29uc3RydWN0b3IoKSkgewogCQlidWZmZXIKIAkJCS5hcHBlbmQoZ2V0Q29uc3RydWN0b3JOYW1lKCkpCi0JCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZQYXJhbWV0ZXJSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKTsKKwkJCS5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZk5hbWVSYW5nZVsxXSArIDEsIHRoaXMuZlBhcmFtZXRlclJhbmdlWzBdIC0gdGhpcy5mTmFtZVJhbmdlWzFdIC0gMSk7CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZChnZXRSZXR1cm5UeXBlQ29udGVudHMoKSk7Ci0JCWlmIChmUmV0dXJuVHlwZVJhbmdlWzBdID49IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmUmV0dXJuVHlwZVJhbmdlWzFdICsgMSwgZk5hbWVSYW5nZVswXSAtIGZSZXR1cm5UeXBlUmFuZ2VbMV0gLSAxKTsKKwkJaWYgKHRoaXMuZlJldHVyblR5cGVSYW5nZVswXSA+PSAwKSB7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZSZXR1cm5UeXBlUmFuZ2VbMV0gKyAxLCB0aGlzLmZOYW1lUmFuZ2VbMF0gLSB0aGlzLmZSZXR1cm5UeXBlUmFuZ2VbMV0gLSAxKTsKIAkJfSBlbHNlIHsKIAkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKIAkJfQogCQlidWZmZXIKIAkJCS5hcHBlbmQoZ2V0TmFtZUNvbnRlbnRzKCkpCi0JCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZQYXJhbWV0ZXJSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKTsKKwkJCS5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZk5hbWVSYW5nZVsxXSArIDEsIHRoaXMuZlBhcmFtZXRlclJhbmdlWzBdIC0gdGhpcy5mTmFtZVJhbmdlWzFdIC0gMSk7CiAJfQotCWlmIChmUGFyYW1ldGVyTGlzdCAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZlBhcmFtZXRlckxpc3QpOworCWlmICh0aGlzLmZQYXJhbWV0ZXJMaXN0ICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZQYXJhbWV0ZXJMaXN0KTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlBhcmFtZXRlclJhbmdlWzBdLCBmUGFyYW1ldGVyUmFuZ2VbMV0gKyAxIC0gZlBhcmFtZXRlclJhbmdlWzBdKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mUGFyYW1ldGVyUmFuZ2VbMF0sIHRoaXMuZlBhcmFtZXRlclJhbmdlWzFdICsgMSAtIHRoaXMuZlBhcmFtZXRlclJhbmdlWzBdKTsKIAl9CiAJaW50IHN0YXJ0OwogCWlmIChoYXNUcmFpbGluZ0FycmF5UXVhbGlmaWVyKCkgJiYgaXNSZXR1cm5UeXBlQWx0ZXJlZCgpKSB7Ci0JCXN0YXJ0PSBmUmV0dXJuVHlwZVJhbmdlWzNdICsgMTsKKwkJc3RhcnQ9IHRoaXMuZlJldHVyblR5cGVSYW5nZVszXSArIDE7CiAJfSBlbHNlIHsKLQkJc3RhcnQ9IGZQYXJhbWV0ZXJSYW5nZVsxXSArIDE7CisJCXN0YXJ0PSB0aGlzLmZQYXJhbWV0ZXJSYW5nZVsxXSArIDE7CiAJfQotCWlmIChmRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJaWYgKHRoaXMuZkV4Y2VwdGlvbnMgIT0gbnVsbCkgewogCQkvLyBhZGQgJ3Rocm93cycga2V5d29yZAotCQlpZiAoZkV4Y2VwdGlvblJhbmdlWzBdID49IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBzdGFydCwgZkV4Y2VwdGlvblJhbmdlWzBdIC0gc3RhcnQpOworCQlpZiAodGhpcy5mRXhjZXB0aW9uUmFuZ2VbMF0gPj0gMCkgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgc3RhcnQsIHRoaXMuZkV4Y2VwdGlvblJhbmdlWzBdIC0gc3RhcnQpOwogCQl9IGVsc2UgewogCQkJYnVmZmVyLmFwcGVuZCgiIHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCS8vIGFkZCBleGNlcHRpb24gbGlzdAotCQlpZiAoZkV4Y2VwdGlvbkxpc3QgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChmRXhjZXB0aW9uTGlzdCk7CisJCWlmICh0aGlzLmZFeGNlcHRpb25MaXN0ICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRXhjZXB0aW9uTGlzdCk7CiAJCQkvLyBhZGQgc3BhY2UgYmVmb3JlIGJvZHkKLQkJCWlmIChmRXhjZXB0aW9uUmFuZ2VbMF0gPj0gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXhjZXB0aW9uUmFuZ2VbMV0gKyAxLCBmQm9keVJhbmdlWzBdIC0gZkV4Y2VwdGlvblJhbmdlWzFdIC0gMSk7CisJCQlpZiAodGhpcy5mRXhjZXB0aW9uUmFuZ2VbMF0gPj0gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkV4Y2VwdGlvblJhbmdlWzFdICsgMSwgdGhpcy5mQm9keVJhbmdlWzBdIC0gdGhpcy5mRXhjZXB0aW9uUmFuZ2VbMV0gLSAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZQYXJhbWV0ZXJSYW5nZVsxXSArIDEsIGZCb2R5UmFuZ2VbMF0gLSBmUGFyYW1ldGVyUmFuZ2VbMV0gLSAxKTsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZQYXJhbWV0ZXJSYW5nZVsxXSArIDEsIHRoaXMuZkJvZHlSYW5nZVswXSAtIHRoaXMuZlBhcmFtZXRlclJhbmdlWzFdIC0gMSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvLyBhZGQgbGlzdCBhbmQgc3BhY2UgYmVmb3JlIGJvZHkKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXhjZXB0aW9uUmFuZ2VbMF0sIGZCb2R5UmFuZ2VbMF0gLSBmRXhjZXB0aW9uUmFuZ2VbMF0pOworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mRXhjZXB0aW9uUmFuZ2VbMF0sIHRoaXMuZkJvZHlSYW5nZVswXSAtIHRoaXMuZkV4Y2VwdGlvblJhbmdlWzBdKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8vIGFkZCBzcGFjZSBiZWZvcmUgYm9keQotCQlpZiAoZkV4Y2VwdGlvblJhbmdlWzBdID49IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXhjZXB0aW9uUmFuZ2VbMV0gKyAxLCBmQm9keVJhbmdlWzBdIC0gZkV4Y2VwdGlvblJhbmdlWzFdIC0gMSk7CisJCWlmICh0aGlzLmZFeGNlcHRpb25SYW5nZVswXSA+PSAwKSB7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZFeGNlcHRpb25SYW5nZVsxXSArIDEsIHRoaXMuZkJvZHlSYW5nZVswXSAtIHRoaXMuZkV4Y2VwdGlvblJhbmdlWzFdIC0gMSk7CiAJCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgc3RhcnQsIGZCb2R5UmFuZ2VbMF0gLSBzdGFydCk7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCBzdGFydCwgdGhpcy5mQm9keVJhbmdlWzBdIC0gc3RhcnQpOwogCQl9CiAJfQotCQorCiB9CiAvKioKICAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2ltcGxlQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogCS8vIGFwcGVuZCBldmV5dGhpbmcgYmVmb3JlIG15IG5hbWUKLQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZTb3VyY2VSYW5nZVswXSwgdGhpcy5mTmFtZVJhbmdlWzBdIC0gdGhpcy5mU291cmNlUmFuZ2VbMF0pOwogCS8vIGFwcGVuZCBteSBuYW1lCiAJaWYgKGlzQ29uc3RydWN0b3IoKSkgewogCQlidWZmZXIuYXBwZW5kKGdldENvbnN0cnVjdG9yTmFtZSgpKTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZOYW1lKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZOYW1lKTsKIAl9CiAJLy8gYXBwZW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgbXkgbmFtZQotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZOYW1lUmFuZ2VbMV0pOwogfQogLyoqCiAgKiBAc2VlIElET01NZXRob2QjZ2V0Qm9keSgpCkBAIC0zNzIsMTAgKzM3MiwxMCBAQAogcHVibGljIFN0cmluZyBnZXRCb2R5KCkgewogCWJlY29tZURldGFpbGVkKCk7CiAJaWYgKGhhc0JvZHkoKSkgewotCQlpZiAoZkJvZHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZCb2R5OworCQlpZiAodGhpcy5mQm9keSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5mQm9keTsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGZEb2N1bWVudCwgZkJvZHlSYW5nZVswXSwgZkJvZHlSYW5nZVsxXSArIDEgLSBmQm9keVJhbmdlWzBdKTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZCb2R5UmFuZ2VbMF0sIHRoaXMuZkJvZHlSYW5nZVsxXSArIDEgLSB0aGlzLmZCb2R5UmFuZ2VbMF0pOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dXJuIG51bGw7CkBAIC0zOTgsNyArMzk4LDcgQEAKIAl9IGVsc2UgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKIH0KIC8qKgogICogQHNlZSBET01Ob2RlI2dldERldGFpbGVkTm9kZSgpCkBAIC00MTAsNyArNDEwLDcgQEAKICAqIEBzZWUgSURPTU1ldGhvZCNnZXRFeGNlcHRpb25zKCkKICAqLwogcHVibGljIFN0cmluZ1tdIGdldEV4Y2VwdGlvbnMoKSB7Ci0JcmV0dXJuIGZFeGNlcHRpb25zOworCXJldHVybiB0aGlzLmZFeGNlcHRpb25zOwogfQogcHJvdGVjdGVkIGNoYXJbXSBnZW5lcmF0ZUZsYWdzKCkgewogCWNoYXJbXSBmbGFncz0gRmxhZ3MudG9TdHJpbmcoZ2V0RmxhZ3MoKSAmIH5GbGFncy5BY2NWYXJhcmdzKS50b0NoYXJBcnJheSgpOwpAQCAtNDI2LDExICs0MjYsMTEgQEAKIAlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKIAkJLy8gdHJhbnNsYXRlIHBhcmFtZXRlciB0eXBlcyB0byBzaWduYXR1cmVzCiAJCVN0cmluZ1tdIHNpZ3M9IG51bGw7Ci0JCWlmIChmUGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewotCQkJc2lncz0gbmV3IFN0cmluZ1tmUGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKKwkJaWYgKHRoaXMuZlBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKKwkJCXNpZ3M9IG5ldyBTdHJpbmdbdGhpcy5mUGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKIAkJCWludCBpOwotCQkJZm9yIChpPSAwOyBpIDwgZlBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2lnc1tpXT0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZlBhcmFtZXRlclR5cGVzW2ldLnRvQ2hhckFycmF5KCksIGZhbHNlKTsKKwkJCWZvciAoaT0gMDsgaSA8IHRoaXMuZlBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJc2lnc1tpXT0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodGhpcy5mUGFyYW1ldGVyVHlwZXNbaV0udG9DaGFyQXJyYXkoKSwgZmFsc2UpOwogCQkJfQogCQl9CiAJCVN0cmluZyBuYW1lPSBudWxsOwpAQCAtNDQxLDE3ICs0NDEsMTcgQEAKIAkJfQogCQlyZXR1cm4gKChJVHlwZSlwYXJlbnQpLmdldE1ldGhvZChuYW1lLCBzaWdzKTsKIAl9IGVsc2UgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaWxsZWdhbFBhcmVudCk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaWxsZWdhbFBhcmVudCk7CiAJfQogfQogLyoqCiAgKiBAc2VlIERPTU1lbWJlciNnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKQogICovCiBwcm90ZWN0ZWQgaW50IGdldE1lbWJlckRlY2xhcmF0aW9uU3RhcnRQb3NpdGlvbigpIHsKLQlpZiAoZlJldHVyblR5cGVSYW5nZVswXSA+PSAwKSB7Ci0JCXJldHVybiBmUmV0dXJuVHlwZVJhbmdlWzBdOworCWlmICh0aGlzLmZSZXR1cm5UeXBlUmFuZ2VbMF0gPj0gMCkgeworCQlyZXR1cm4gdGhpcy5mUmV0dXJuVHlwZVJhbmdlWzBdOwogCX0gZWxzZSB7Ci0JCXJldHVybiBmTmFtZVJhbmdlWzBdOworCQlyZXR1cm4gdGhpcy5mTmFtZVJhbmdlWzBdOwogCX0KIH0KIC8qKgpAQCAtNDc0LDEzICs0NzQsMTMgQEAKICAqIEBzZWUgSURPTU1ldGhvZCNnZXRQYXJhbWV0ZXJOYW1lcygpCiAgKi8KIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKLQlyZXR1cm4gZlBhcmFtZXRlck5hbWVzOworCXJldHVybiB0aGlzLmZQYXJhbWV0ZXJOYW1lczsKIH0KIC8qKgogICogQHNlZSBJRE9NTWV0aG9kI2dldFBhcmFtZXRlclR5cGVzKCkKICAqLwogcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7CisJcmV0dXJuIHRoaXMuZlBhcmFtZXRlclR5cGVzOwogfQogLyoqCiAgKiBAc2VlIElET01NZXRob2QjZ2V0UmV0dXJuVHlwZSgpCkBAIC00ODksNyArNDg5LDcgQEAKIAlpZiAoaXNDb25zdHJ1Y3RvcigpKSB7CiAJCXJldHVybiBudWxsOwogCX0gZWxzZSB7Ci0JCXJldHVybiBmUmV0dXJuVHlwZTsKKwkJcmV0dXJuIHRoaXMuZlJldHVyblR5cGU7CiAJfQogfQogLyoqCkBAIC01MDAsOSArNTAwLDkgQEAKIAkJcmV0dXJuIG51bGw7CiAJfSBlbHNlIHsKIAkJaWYgKGlzUmV0dXJuVHlwZUFsdGVyZWQoKSkgewotCQkJcmV0dXJuIGZSZXR1cm5UeXBlLnRvQ2hhckFycmF5KCk7CisJCQlyZXR1cm4gdGhpcy5mUmV0dXJuVHlwZS50b0NoYXJBcnJheSgpOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZkRvY3VtZW50LCBmUmV0dXJuVHlwZVJhbmdlWzBdLCBmUmV0dXJuVHlwZVJhbmdlWzFdICsgMSk7CisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0aGlzLmZEb2N1bWVudCwgdGhpcy5mUmV0dXJuVHlwZVJhbmdlWzBdLCB0aGlzLmZSZXR1cm5UeXBlUmFuZ2VbMV0gKyAxKTsKIAkJfQogCiAJfQpAQCAtNTEyLDcgKzUxMiw3IEBACiAgKiBhcnJheSBxdWFsaWZpZXJzICgnW10nKSBmb2xsb3dpbmcgdGhlIHBhcmFtZXRlciBsaXN0LgogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUcmFpbGluZ0FycmF5UXVhbGlmaWVyKCkgewotCXJldHVybiBmUmV0dXJuVHlwZVJhbmdlLmxlbmd0aCA+IDI7CisJcmV0dXJuIHRoaXMuZlJldHVyblR5cGVSYW5nZS5sZW5ndGggPiAyOwogfQogLyoqCiAgKiBAc2VlIElET01NZXRob2QjaXNDb25zdHJ1Y3RvcigpCkBAIC01MzcsNyArNTM3LDcgQEAKIAlib29sZWFuIG9rPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGUoKTsKIAlpZiAob2spIHsKIAkJSURPTU1ldGhvZCBtZXRob2Q9IChJRE9NTWV0aG9kKW5vZGU7Ci0JCW9rID0gKGlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB8fCAgCisJCW9rID0gKGlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB8fAogCQkJKCFpc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpOwogCQlpZiAob2sgJiYgIWlzQ29uc3RydWN0b3IoKSkgewogCQkJb2s9IGdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSk7CkBAIC01NDUsOSArNTQ1LDkgQEAKIAkJaWYgKCFvaykgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCQorCiAJCVN0cmluZ1tdIHR5cGVzPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IGZQYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkgeworCQlpZiAodGhpcy5mUGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCB0aGlzLmZQYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkgewogCQkJLy8gdGhpcyBtZXRob2QgaGFzIG5vIHBhcmFtZXRlcnMKIAkJCWlmICh0eXBlcyA9PSBudWxsIHx8IHR5cGVzLmxlbmd0aCA9PSAwKSB7CiAJCQkJLy8gdGhlIG90aGVyIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycyBlaXRoZXIKQEAgLTU1OSwxMyArNTU5LDEzIEBACiAJCQkJLy8gdGhlIG90aGVyIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJCWlmIChmUGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IHR5cGVzLmxlbmd0aCkgeworCQkJaWYgKHRoaXMuZlBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSB0eXBlcy5sZW5ndGgpIHsKIAkJCQkvLyB0aGUgbWV0aG9kcyBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBwYXJhbWV0ZXJzCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJaW50IGk7CiAJCQlmb3IgKGk9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZlBhcmFtZXRlclR5cGVzW2ldLmVxdWFscyh0eXBlc1tpXSkpIHsKKwkJCQlpZiAoIXRoaXMuZlBhcmFtZXRlclR5cGVzW2ldLmVxdWFscyh0eXBlc1tpXSkpIHsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCX0KQEAgLTU3Myw3ICs1NzMsNyBAQAogCQl9CiAJfQogCXJldHVybiBmYWxzZTsKLQkKKwogfQogLyoqCiAgKiBAc2VlIERPTU5vZGUKQEAgLTU4NiwxMCArNTg2LDEwIEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIG9mZnNldChpbnQgb2Zmc2V0KSB7CiAJc3VwZXIub2Zmc2V0KG9mZnNldCk7Ci0Jb2Zmc2V0UmFuZ2UoZkJvZHlSYW5nZSwgb2Zmc2V0KTsKLQlvZmZzZXRSYW5nZShmRXhjZXB0aW9uUmFuZ2UsIG9mZnNldCk7Ci0Jb2Zmc2V0UmFuZ2UoZlBhcmFtZXRlclJhbmdlLCBvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZSZXR1cm5UeXBlUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mQm9keVJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKHRoaXMuZkV4Y2VwdGlvblJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKHRoaXMuZlBhcmFtZXRlclJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKHRoaXMuZlJldHVyblR5cGVSYW5nZSwgb2Zmc2V0KTsKIH0KIC8qKgogICogQHNlZSBJRE9NTWV0aG9kI3NldEJvZHkKQEAgLTU5NywxNyArNTk3LDE3IEBACiBwdWJsaWMgdm9pZCBzZXRCb2R5KFN0cmluZyBib2R5KSB7CiAJYmVjb21lRGV0YWlsZWQoKTsKIAlmcmFnbWVudCgpOwotCWZCb2R5PSBib2R5OworCXRoaXMuZkJvZHk9IGJvZHk7CiAJc2V0SGFzQm9keShib2R5ICE9IG51bGwpOwogCWlmICghaGFzQm9keSgpKSB7Ci0JCWZCb2R5PSAiOyIgKyBVdGlsLmdldExpbmVTZXBhcmF0b3IoYm9keSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5mQm9keT0gIjsiICsgVXRpbC5nZXRMaW5lU2VwYXJhdG9yKGJvZHksIG51bGwpOyAvLyROT04tTkxTLTEkCiAJfQogfQogLyoqCiAgKiBTZXRzIHRoZSBlbmQgb2YgdGhlIGJvZHkgcmFuZ2UKICAqLwogdm9pZCBzZXRCb2R5UmFuZ2VFbmQoaW50IGVuZCkgewotCWZCb2R5UmFuZ2VbMV0gPSBlbmQ7CisJdGhpcy5mQm9keVJhbmdlWzFdID0gZW5kOwogfQogLyoqCiAgKiBAc2VlIElET01NZXRob2Qjc2V0Q29uc3RydWN0b3IoYm9vbGVhbikKQEAgLTYyMyw5ICs2MjMsOSBAQAogcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhTdHJpbmdbXSBuYW1lcykgewogCWJlY29tZURldGFpbGVkKCk7CiAJaWYgKG5hbWVzID09IG51bGwgfHwgbmFtZXMubGVuZ3RoID09IDApIHsKLQkJZkV4Y2VwdGlvbnM9IG51bGw7CisJCXRoaXMuZkV4Y2VwdGlvbnM9IG51bGw7CiAJfSBlbHNlIHsKLQkJZkV4Y2VwdGlvbnM9IG5hbWVzOworCQl0aGlzLmZFeGNlcHRpb25zPSBuYW1lczsKIAkJQ2hhckFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKIAkJY2hhcltdIGNvbW1hID0gbmV3IGNoYXJbXSB7JywnLCAnICd9OwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTYzMyw3ICs2MzMsNyBAQAogCQkJCWJ1ZmZlci5hcHBlbmQoY29tbWEpOwogCQkJYnVmZmVyLmFwcGVuZChuYW1lc1tpXSk7CiAJCX0KLQkJZkV4Y2VwdGlvbkxpc3Q9IGJ1ZmZlci5nZXRDb250ZW50cygpOwkJCisJCXRoaXMuZkV4Y2VwdGlvbkxpc3Q9IGJ1ZmZlci5nZXRDb250ZW50cygpOwogCX0KIAlmcmFnbWVudCgpOwogfQpAQCAtNjQyLDcgKzY0Miw3IEBACiAgKi8KIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKIAlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9udWxsTmFtZSk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbE5hbWUpOwogCX0gZWxzZSB7CiAJCXN1cGVyLnNldE5hbWUobmFtZSk7CiAJfQpAQCAtNjU0LDE5ICs2NTQsMTkgQEAKIAliZWNvbWVEZXRhaWxlZCgpOwogCWlmICh0eXBlcz09IG51bGwgfHwgbmFtZXMgPT0gbnVsbCkgewogCQlpZiAodHlwZXMgPT0gbnVsbCAmJiBuYW1lcyA9PSBudWxsKSB7Ci0JCQlmUGFyYW1ldGVyVHlwZXM9IG51bGw7Ci0JCQlmUGFyYW1ldGVyTmFtZXM9IG51bGw7Ci0JCQlmUGFyYW1ldGVyTGlzdD0gbmV3IGNoYXJbXSB7JygnLCcpJ307CisJCQl0aGlzLmZQYXJhbWV0ZXJUeXBlcz0gbnVsbDsKKwkJCXRoaXMuZlBhcmFtZXRlck5hbWVzPSBudWxsOworCQkJdGhpcy5mUGFyYW1ldGVyTGlzdD0gbmV3IGNoYXJbXSB7JygnLCcpJ307CiAJCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9taXNtYXRjaEFyZ05hbWVzQW5kVHlwZXMpOyAKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZG9tX21pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyk7CiAJCX0KIAl9IGVsc2UgaWYgKG5hbWVzLmxlbmd0aCAhPSB0eXBlcy5sZW5ndGgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbWlzbWF0Y2hBcmdOYW1lc0FuZFR5cGVzKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZG9tX21pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyk7CiAJfSBlbHNlIGlmIChuYW1lcy5sZW5ndGggPT0gMCkgewogCQlzZXRQYXJhbWV0ZXJzKG51bGwsIG51bGwpOwogCX0gZWxzZSB7Ci0JCWZQYXJhbWV0ZXJOYW1lcz0gbmFtZXM7Ci0JCWZQYXJhbWV0ZXJUeXBlcz0gdHlwZXM7CisJCXRoaXMuZlBhcmFtZXRlck5hbWVzPSBuYW1lczsKKwkJdGhpcy5mUGFyYW1ldGVyVHlwZXM9IHR5cGVzOwogCQlDaGFyQXJyYXlCdWZmZXIgcGFyYW1ldGVyc0J1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKIAkJcGFyYW1ldGVyc0J1ZmZlci5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAogCQljaGFyW10gY29tbWEgPSBuZXcgY2hhcltdIHsnLCcsICcgJ307CkBAIC02ODAsNyArNjgwLDcgQEAKIAkJCQkuYXBwZW5kKG5hbWVzW2ldKTsKIAkJfQogCQlwYXJhbWV0ZXJzQnVmZmVyLmFwcGVuZCgnKScpOwotCQlmUGFyYW1ldGVyTGlzdD0gcGFyYW1ldGVyc0J1ZmZlci5nZXRDb250ZW50cygpOwkJCisJCXRoaXMuZlBhcmFtZXRlckxpc3Q9IHBhcmFtZXRlcnNCdWZmZXIuZ2V0Q29udGVudHMoKTsKIAl9CiAJZnJhZ21lbnQoKTsKIH0KQEAgLTY4OSwxMiArNjg5LDEyIEBACiAgKi8KIHB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCWlmIChuYW1lID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbFJldHVyblR5cGUpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbFJldHVyblR5cGUpOwogCX0KIAliZWNvbWVEZXRhaWxlZCgpOwogCWZyYWdtZW50KCk7CiAJc2V0UmV0dXJuVHlwZUFsdGVyZWQodHJ1ZSk7Ci0JZlJldHVyblR5cGU9IG5hbWU7CisJdGhpcy5mUmV0dXJuVHlwZT0gbmFtZTsKIH0KIC8qKgogICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gYXMgaGF2aW5nCkBAIC03MDcsNyArNzA3LDcgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlUmFuZ2VFbmQoaW50IGVuZCkgewogCXN1cGVyLnNldFNvdXJjZVJhbmdlRW5kKGVuZCk7Ci0JZkJvZHlSYW5nZVsxXT0gZW5kOworCXRoaXMuZkJvZHlSYW5nZVsxXT0gZW5kOwogfQogLyoqCiAgKiBAc2VlIERPTU5vZGUjc2hhcmVDb250ZW50cyhET01Ob2RlKQpAQCAtNzE1LDE3ICs3MTUsMTcgQEAKIHByb3RlY3RlZCB2b2lkIHNoYXJlQ29udGVudHMoRE9NTm9kZSBub2RlKSB7CiAJc3VwZXIuc2hhcmVDb250ZW50cyhub2RlKTsKIAlET01NZXRob2QgbWV0aG9kPSAoRE9NTWV0aG9kKW5vZGU7Ci0JZkJvZHk9IG1ldGhvZC5mQm9keTsKLQlmQm9keVJhbmdlPSByYW5nZUNvcHkobWV0aG9kLmZCb2R5UmFuZ2UpOwotCWZFeGNlcHRpb25MaXN0PSBtZXRob2QuZkV4Y2VwdGlvbkxpc3Q7Ci0JZkV4Y2VwdGlvblJhbmdlPSByYW5nZUNvcHkobWV0aG9kLmZFeGNlcHRpb25SYW5nZSk7Ci0JZkV4Y2VwdGlvbnM9IG1ldGhvZC5mRXhjZXB0aW9uczsKLQlmUGFyYW1ldGVyTGlzdD0gbWV0aG9kLmZQYXJhbWV0ZXJMaXN0OwotCWZQYXJhbWV0ZXJOYW1lcz0gbWV0aG9kLmZQYXJhbWV0ZXJOYW1lczsKLQlmUGFyYW1ldGVyUmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZlBhcmFtZXRlclJhbmdlKTsKLQlmUGFyYW1ldGVyVHlwZXM9IG1ldGhvZC5mUGFyYW1ldGVyVHlwZXM7Ci0JZlJldHVyblR5cGU9IG1ldGhvZC5mUmV0dXJuVHlwZTsKLQlmUmV0dXJuVHlwZVJhbmdlPSByYW5nZUNvcHkobWV0aG9kLmZSZXR1cm5UeXBlUmFuZ2UpOworCXRoaXMuZkJvZHk9IG1ldGhvZC5mQm9keTsKKwl0aGlzLmZCb2R5UmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZkJvZHlSYW5nZSk7CisJdGhpcy5mRXhjZXB0aW9uTGlzdD0gbWV0aG9kLmZFeGNlcHRpb25MaXN0OworCXRoaXMuZkV4Y2VwdGlvblJhbmdlPSByYW5nZUNvcHkobWV0aG9kLmZFeGNlcHRpb25SYW5nZSk7CisJdGhpcy5mRXhjZXB0aW9ucz0gbWV0aG9kLmZFeGNlcHRpb25zOworCXRoaXMuZlBhcmFtZXRlckxpc3Q9IG1ldGhvZC5mUGFyYW1ldGVyTGlzdDsKKwl0aGlzLmZQYXJhbWV0ZXJOYW1lcz0gbWV0aG9kLmZQYXJhbWV0ZXJOYW1lczsKKwl0aGlzLmZQYXJhbWV0ZXJSYW5nZT0gcmFuZ2VDb3B5KG1ldGhvZC5mUGFyYW1ldGVyUmFuZ2UpOworCXRoaXMuZlBhcmFtZXRlclR5cGVzPSBtZXRob2QuZlBhcmFtZXRlclR5cGVzOworCXRoaXMuZlJldHVyblR5cGU9IG1ldGhvZC5mUmV0dXJuVHlwZTsKKwl0aGlzLmZSZXR1cm5UeXBlUmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZlJldHVyblR5cGVSYW5nZSk7CiB9CiAvKioKICAqIEBzZWUgSURPTU5vZGUjdG9TdHJpbmcoKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Ob2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQppbmRleCA4ZGE5ZGJmLi5jNDk1OTI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMyw3ICsyMyw3IEBACiAgKiBjb250ZW50cyBhcmUgbG9jYXRlZCBpbiBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYSBzaGFyZWQgZG9jdW1lbnQuIEEgc2hhcmVkCiAgKiBkb2N1bWVudCBpcyBhIGNoYXIgYXJyYXksIGFuZCBpcyBzaGFyZWQgaW4gdGhlIHNlbnNlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIG90aGVyCiAgKiBkb2N1bWVudCBmcmFnbWVudHMgbWF5IGFsc28gYmUgY29udGFpbmVkIGluIHRoZSBhcnJheS4KLSAqIAorICoKICAqIDxwPkEgbm9kZSBtYWludGFpbnMgaW5kaWNpZXMgb2YgcmVsZXZhbnQgcG9ydGlvbnMgb2YgaXRzIGNvbnRlbnRzCiAgKiBpbiB0aGUgc2hhcmVkIGRvY3VtZW50LiBUaHVzIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBhbmQgaW5kaWNpZXMgY3JlYXRlIGEKICAqIGZvcm0gZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGZyYWdtZW50LiBBcyBhdHRyaWJ1dGVzCkBAIC00NSwxMSArNDUsMTEgQEAKICAqIHByZWNlZGluZyB0aGUgbm9kZSBvbiB0aGUgbGluZSB3aGVyZSB0aGUgbm9kZSBiZWdpbnMsIGFuZCB0byBpbmNsdWRlIGFuZCB0cmFpbGluZwogICogd2hpdGVzcGFjZSB1cCB0byB0aGUgbGluZSB3aGVyZSB0aGUgbmV4dCBub2RlIGJlZ2lucy4gQW55IHRyYWlsaW5nIC8vIGNvbW1lbnRzCiAgKiB0aGF0IGJlZ2luIG9uIHRoZSBsaW5lIHdoZXJlIHRoZSBjdXJyZW50IG5vZGUgZW5kcywgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGF0Ci0gKiBub2RlLiAKKyAqIG5vZGUuCiAgKgogICogQHNlZSBJRE9NTm9kZQogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBET01Ob2RlIGltcGxlbWVudHMgSURPTU5vZGUgewpAQCAtOTQsNyArOTQsNyBAQAogCSAqIHNoYXJlZCBkb2N1bWVudCwgb3Igd2hlbiB0aGUgYXR0cmlidXRlcyBvZiBhCiAJICogZGVzY2VuZGFudCBoYXZlIGJlZW4gYWx0ZXJlZC4gRmFsc2Ugd2hlbiB0aGUKIAkgKiBjb250ZW50cyBvZiB0aGlzIG5vZGUgYW5kIGFsbCBkZXNjZW5kYW50cyBhcmUKLQkgKiBjb25zaXN0ZW50IHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHNoYXJlZCAKKwkgKiBjb25zaXN0ZW50IHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHNoYXJlZAogCSAqIGRvY3VtZW50LgogCSAqLwogCXByb3RlY3RlZCBib29sZWFuIGZJc0ZyYWdtZW50ZWQ9IGZhbHNlOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJICogZXhwcmVzc2lvbgogCSAqLwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfRklFTERfSEFTX0lOSVRJQUxJWkVSPSAweDAwMDAwMDAxOwotCQorCiAJLyoqCiAJICogQSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoaXMgZmllbGQgaXMgYSBzZWNvbmRhcnkgdmFyaWFibGUKIAkgKiBkZWNsYXJhdG9yIGZvciBhIHByZXZpb3VzIGZpZWxkIGRlY2xhcmF0aW9uLgpAQCAtMTc0LDcgKzE3NCw3IEBACiAJICogYm9keS4KIAkgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVNLX0hBU19CT0RZPSAweDAwMDAwMDEwOwotCQorCiAJLyoqCiAJICogQSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoaXMgbm9kZSBjdXJyZW50bHkgaGFzIGEKIAkgKiBwcmVjZWRpbmcgY29tbWVudC4KQEAgLTIxOCwxMCArMjE4LDEwIEBACiAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IGRvY3VtZW50IGZyYWdtZW50LgogICovCiBET01Ob2RlKCkgewotCWZOYW1lPSBudWxsOwotCWZEb2N1bWVudD0gbnVsbDsKLQlmU291cmNlUmFuZ2U9IG5ldyBpbnRbXXstMSwgLTF9OwotCWZOYW1lUmFuZ2U9IG5ldyBpbnRbXXstMSwgLTF9OworCXRoaXMuZk5hbWU9IG51bGw7CisJdGhpcy5mRG9jdW1lbnQ9IG51bGw7CisJdGhpcy5mU291cmNlUmFuZ2U9IG5ldyBpbnRbXXstMSwgLTF9OworCXRoaXMuZk5hbWVSYW5nZT0gbmV3IGludFtdey0xLCAtMX07CiAJZnJhZ21lbnQoKTsKIH0KIC8qKgpAQCAtMjQzLDEwICsyNDMsMTAgQEAKICAqLwogRE9NTm9kZShjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlKSB7CiAJc3VwZXIoKTsKLQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCWZTb3VyY2VSYW5nZT0gc291cmNlUmFuZ2U7Ci0JZk5hbWU9IG5hbWU7Ci0JZk5hbWVSYW5nZT0gbmFtZVJhbmdlOworCXRoaXMuZkRvY3VtZW50PSBkb2N1bWVudDsKKwl0aGlzLmZTb3VyY2VSYW5nZT0gc291cmNlUmFuZ2U7CisJdGhpcy5mTmFtZT0gbmFtZTsKKwl0aGlzLmZOYW1lUmFuZ2U9IG5hbWVSYW5nZTsKIAogfQogLyoqCkBAIC0yNTUsMTIgKzI1NSwxMiBAQAogICoKICAqIDxwPldoZW4gYSBjaGlsZCBpcyBhZGRlZCwgdGhpcyBub2RlIG11c3QgYmUgY29uc2lkZXJlZCBmcmFnbWVudGVkIHN1Y2ggdGhhdAogICogdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSBhcmUgcHJvcGVybHkgZ2VuZXJhdGVkLgotICogCisgKgogICogQHNlZSBJRE9NTm9kZSNhZGRDaGlsZChJRE9NTm9kZSkKICAqLwogcHVibGljIHZvaWQgYWRkQ2hpbGQoSURPTU5vZGUgY2hpbGQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7CiAJYmFzaWNBZGRDaGlsZChjaGlsZCk7Ci0JCisKIAkvLyBpZiB0aGUgbm9kZSBpcyBhIGNvbnN0cnVjdG9yLCBpdCBtdXN0IGFsc28gYmUgZnJhZ21lbnRlZCB0byB1cGRhdGUgdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZQogCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLk1FVEhPRCAmJiAoKElET01NZXRob2QpY2hpbGQpLmlzQ29uc3RydWN0b3IoKSkgewogCQkoKERPTU5vZGUpY2hpbGQpLmZyYWdtZW50KCk7CkBAIC0yNzYsMTMgKzI3NiwxMyBAQAogICogdXNpbmcgdGhlIG9yaWdpbmFsIGRvY3VtZW50IGFuZCBpbmRpY2llcyBhcyBhIGZvcm0gZm9yIHRoZSBjdXJyZW50CiAgKiBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoaXMgbm9kZS4gSWYgdGhpcyBub2RlIG5vdCBmcmFnbWVudGVkLCB0aGUKICAqIGNvbnRlbnRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBkb2N1bWVudC4KLSAqIAorICoKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogCWlmIChpc0ZyYWdtZW50ZWQoKSkgewogCQlhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoYnVmZmVyKTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmU291cmNlUmFuZ2VbMV0gKyAxIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mU291cmNlUmFuZ2VbMF0sIHRoaXMuZlNvdXJjZVJhbmdlWzFdICsgMSAtIHRoaXMuZlNvdXJjZVJhbmdlWzBdKTsKIAl9CiB9CiAvKioKQEAgLTI5NCw5ICsyOTQsOSBAQAogICoKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kQ29udGVudHNPZkNoaWxkcmVuKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKLQlET01Ob2RlIGNoaWxkPSBmRmlyc3RDaGlsZDsKKwlET01Ob2RlIGNoaWxkPSB0aGlzLmZGaXJzdENoaWxkOwogCURPTU5vZGUgc2libGluZzsKLQkKKwogCWludCBzdGFydD0gMCwgZW5kPSAwOwogCWlmIChjaGlsZCAhPSBudWxsKSB7CiAJCXN0YXJ0PSBjaGlsZC5nZXRTdGFydFBvc2l0aW9uKCk7CkBAIC0zNDEsNDIgKzM0MSw0MiBAQAogdm9pZCBiYXNpY0FkZENoaWxkKElET01Ob2RlIGNoaWxkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBET01FeGNlcHRpb24gewogCS8vIHZlcmlmeSBjaGlsZCBtYXkgYmUgYWRkZWQKIAlpZiAoIWNhbkhhdmVDaGlsZHJlbigpKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oTWVzc2FnZXMuZG9tX3VuYWJsZUFkZENoaWxkKTsgCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oTWVzc2FnZXMuZG9tX3VuYWJsZUFkZENoaWxkKTsKIAl9CiAJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkTnVsbENoaWxkKTsgCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZG9tX2FkZE51bGxDaGlsZCk7CiAJfQogCWlmICghaXNBbGxvd2FibGVDaGlsZChjaGlsZCkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkSW5jb21wYXRpYmxlQ2hpbGQpOyAKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkSW5jb21wYXRpYmxlQ2hpbGQpOwogCX0KIAlpZiAoY2hpbGQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGRDaGlsZFdpdGhQYXJlbnQpOyAKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkQ2hpbGRXaXRoUGFyZW50KTsKIAl9CiAJLyogTk9URTogVG8gdGVzdCBpZiB0aGUgY2hpbGQgaXMgYW4gYW5jZXN0b3Igb2YgdGhpcyBub2RlLCB3ZQogCSAqIG5lZWQgb25seSB0ZXN0IGlmIHRoZSByb290IG9mIHRoaXMgbm9kZSBpcyB0aGUgY2hpbGQgKHRoZSBjaGlsZAogCSAqIGlzIGFscmVhZHkgYSByb290IHNpbmNlIHdlIGhhdmUganVzdCBndWFyZW50ZWVkIGl0IGhhcyBubyBwYXJlbnQpLgogCSAqLwogCWlmIChjaGlsZCA9PSBnZXRSb290KCkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkQW5jZXN0b3JBc0NoaWxkKTsgCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oTWVzc2FnZXMuZG9tX2FkZEFuY2VzdG9yQXNDaGlsZCk7CiAJfQogCiAJRE9NTm9kZSBub2RlPSAoRE9NTm9kZSljaGlsZDsKLQkKKwogCS8vIGlmIHRoZSBjaGlsZCBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQsIGxvY2FsaXplIGl0cyBjb250ZW50cwogCS8vIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIHRyZWUKIAlpZiAobm9kZS5nZXREb2N1bWVudCgpICE9IGdldERvY3VtZW50KCkpIHsKIAkJbm9kZS5sb2NhbGl6ZUNvbnRlbnRzKCk7CiAJfQotCQorCiAJLy8gYWRkIHRoZSBjaGlsZCBsYXN0Ci0JaWYgKGZGaXJzdENoaWxkID09IG51bGwpIHsKKwlpZiAodGhpcy5mRmlyc3RDaGlsZCA9PSBudWxsKSB7CiAJCS8vIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBvbmx5IGNoaWxkCi0JCWZGaXJzdENoaWxkPSBub2RlOworCQl0aGlzLmZGaXJzdENoaWxkPSBub2RlOwogCX0gZWxzZSB7Ci0JCWZMYXN0Q2hpbGQuZk5leHROb2RlPSBub2RlOwotCQlub2RlLmZQcmV2aW91c05vZGU9IGZMYXN0Q2hpbGQ7CisJCXRoaXMuZkxhc3RDaGlsZC5mTmV4dE5vZGU9IG5vZGU7CisJCW5vZGUuZlByZXZpb3VzTm9kZT0gdGhpcy5mTGFzdENoaWxkOwogCX0KLQlmTGFzdENoaWxkPSBub2RlOworCXRoaXMuZkxhc3RDaGlsZD0gbm9kZTsKIAlub2RlLmZQYXJlbnQ9IHRoaXM7CiB9CiAvKioKQEAgLTM4OSw3ICszODksNyBAQAogCWlmICghaXNEZXRhaWxlZCgpKSB7CiAJCURPTU5vZGUgZGV0YWlsZWQ9IGdldERldGFpbGVkTm9kZSgpOwogCQlpZiAoZGV0YWlsZWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fY2Fubm90RGV0YWlsKTsgCisJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9jYW5ub3REZXRhaWwpOwogCQl9CiAJCWlmIChkZXRhaWxlZCAhPSB0aGlzKSB7CiAJCQlzaGFyZUNvbnRlbnRzKGRldGFpbGVkKTsKQEAgLTQxNiwxMyArNDE2LDEzIEBACiAJLy8gY3JlYXRlIGEgbmV3IGJ1ZmZlciB3aXRoIGFsbCBteSBjb250ZW50cyBhbmQgY2hpbGRyZW4gY29udGVudHMKIAlpbnQgbGVuZ3RoPSAwOwogCWNoYXJbXSBidWZmZXI9IG51bGw7Ci0JaW50IG9mZnNldD0gZlNvdXJjZVJhbmdlWzBdOwotCQorCWludCBvZmZzZXQ9IHRoaXMuZlNvdXJjZVJhbmdlWzBdOworCiAJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCWxlbmd0aD0gZlNvdXJjZVJhbmdlWzFdIC0gb2Zmc2V0ICsgMTsKKwkJbGVuZ3RoPSB0aGlzLmZTb3VyY2VSYW5nZVsxXSAtIG9mZnNldCArIDE7CiAJCWJ1ZmZlcj0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShmRG9jdW1lbnQsIG9mZnNldCwgYnVmZmVyLCAwLCBsZW5ndGgpOwotCX0JCisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5mRG9jdW1lbnQsIG9mZnNldCwgYnVmZmVyLCAwLCBsZW5ndGgpOworCX0KIAlET01Ob2RlIGNsb25lPSBuZXdET01Ob2RlKCk7CiAJY2xvbmUuc2hhcmVDb250ZW50cyh0aGlzKTsKIAljbG9uZS5mRG9jdW1lbnQgPSBidWZmZXI7CkBAIC00MzYsMTcgKzQzNiwxNyBAQAogCQlFbnVtZXJhdGlvbiBjaGlsZHJlbj0gZ2V0Q2hpbGRyZW4oKTsKIAkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7CiAJCQlET01Ob2RlIGNoaWxkPSAoRE9NTm9kZSljaGlsZHJlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGNoaWxkLmZEb2N1bWVudCA9PSBmRG9jdW1lbnQpIHsKKwkJCWlmIChjaGlsZC5mRG9jdW1lbnQgPT0gdGhpcy5mRG9jdW1lbnQpIHsKIAkJCQlET01Ob2RlIGNoaWxkQ2xvbmU9IGNoaWxkLmNsb25lU2hhcmluZ0RvY3VtZW50KGJ1ZmZlciwgb2Zmc2V0KTsKIAkJCQljbG9uZS5iYXNpY0FkZENoaWxkKGNoaWxkQ2xvbmUpOwogCQkJfSBlbHNlIHsKIAkJCQlET01Ob2RlIGNoaWxkQ2xvbmU9IChET01Ob2RlKWNoaWxkLmNsb25lKCk7CiAJCQkJY2xvbmUuYWRkQ2hpbGQoY2hpbGRDbG9uZSk7CiAJCQl9Ci0JCQkKKwogCQl9CiAJfQotCQorCiAJcmV0dXJuIGNsb25lOwogfQogcHJpdmF0ZSBET01Ob2RlIGNsb25lU2hhcmluZ0RvY3VtZW50KGNoYXJbXSBkb2N1bWVudCwgaW50IHJvb3RPZmZzZXQpIHsKQEAgLTQ1NywxMiArNDU3LDEyIEBACiAJaWYgKHJvb3RPZmZzZXQgPiAwKSB7CiAJCWNsb25lLm9mZnNldCgwIC0gcm9vdE9mZnNldCk7CiAJfQotCQorCiAJaWYgKGNhbkhhdmVDaGlsZHJlbigpKSB7CiAJCUVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKIAkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7CiAJCQlET01Ob2RlIGNoaWxkID0gKERPTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoY2hpbGQuZkRvY3VtZW50ID09IGZEb2N1bWVudCkgeworCQkJaWYgKGNoaWxkLmZEb2N1bWVudCA9PSB0aGlzLmZEb2N1bWVudCkgewogCQkJCURPTU5vZGUgY2hpbGRDbG9uZT0gY2hpbGQuY2xvbmVTaGFyaW5nRG9jdW1lbnQoZG9jdW1lbnQsIHJvb3RPZmZzZXQpOwogCQkJCWNsb25lLmJhc2ljQWRkQ2hpbGQoY2hpbGRDbG9uZSk7CiAJCQl9IGVsc2UgewpAQCAtNDgyLDkgKzQ4Miw5IEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIGZyYWdtZW50KCkgewogCWlmICghaXNGcmFnbWVudGVkKCkpIHsKLQkJZklzRnJhZ21lbnRlZD0gdHJ1ZTsKLQkJaWYgKGZQYXJlbnQgIT0gbnVsbCkgewotCQkJZlBhcmVudC5mcmFnbWVudCgpOworCQl0aGlzLmZJc0ZyYWdtZW50ZWQ9IHRydWU7CisJCWlmICh0aGlzLmZQYXJlbnQgIT0gbnVsbCkgeworCQkJdGhpcy5mUGFyZW50LmZyYWdtZW50KCk7CiAJCX0KIAl9CiB9CkBAIC01MDAsNyArNTAwLDcgQEAKICAqIEBzZWUgSURPTU5vZGUjZ2V0Q2hpbGQoU3RyaW5nKQogICovCiBwdWJsaWMgSURPTU5vZGUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKLQlET01Ob2RlIGNoaWxkID0gZkZpcnN0Q2hpbGQ7CisJRE9NTm9kZSBjaGlsZCA9IHRoaXMuZkZpcnN0Q2hpbGQ7CiAJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKIAkJU3RyaW5nIG4gPSBjaGlsZC5nZXROYW1lKCk7CiAJCWlmIChuYW1lID09IG51bGwpIHsKQEAgLTUyMCw3ICs1MjAsNyBAQAogICogQHNlZSBJRE9NTm9kZSNnZXRDaGlsZHJlbigpCiAgKi8KIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRDaGlsZHJlbigpIHsKLQlyZXR1cm4gbmV3IFNpYmxpbmdFbnVtZXJhdGlvbihmRmlyc3RDaGlsZCk7CisJcmV0dXJuIG5ldyBTaWJsaW5nRW51bWVyYXRpb24odGhpcy5mRmlyc3RDaGlsZCk7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhpcyBkb2N1bWVudCBmcmFnbWVudCwKQEAgLTUzMCw3ICs1MzAsNyBAQAogICogdXNpbmcgdGhlIG9yaWdpbmFsIGRvY3VtZW50IGFuZCBpbmRpY2llcyBhcyBhIGZvcm0gZm9yIHRoZSBjdXJyZW50CiAgKiBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoaXMgbm9kZS4gSWYgdGhpcyBub2RlIG5vdCBmcmFnbWVudGVkLCB0aGUKICAqIGNvbnRlbnRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBkb2N1bWVudC4KLSAqIAorICoKICAqIEBzZWUgSURPTU5vZGUjZ2V0Q29udGVudHMoKQogICovCiBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgewpAQCAtNTUxLDE0ICs1NTEsMTQgQEAKICAqIFRoZSBkb2N1bWVudCBtYXkgYmUgc2hhcmVkIGJ5IG90aGVyIG5vZGVzLgogICovCiBwcm90ZWN0ZWQgY2hhcltdIGdldERvY3VtZW50KCkgewotCXJldHVybiBmRG9jdW1lbnQ7CisJcmV0dXJuIHRoaXMuZkRvY3VtZW50OwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcwogICogbm9kZSdzIGNvbnRlbnRzIGluIGl0cyBkb2N1bWVudC4KICAqLwogcHVibGljIGludCBnZXRFbmRQb3NpdGlvbigpIHsKLQlyZXR1cm4gZlNvdXJjZVJhbmdlWzFdOworCXJldHVybiB0aGlzLmZTb3VyY2VSYW5nZVsxXTsKIH0KIC8qKgogICogUmV0dXJucyBhIGZhY3Rvcnkgd2l0aCB3aGljaCB0byBjcmVhdGUgbmV3IGRvY3VtZW50IGZyYWdtZW50cy4KQEAgLTU3MCw0MCArNTcwLDQwIEBACiAgKiBAc2VlIElET01Ob2RlI2dldEZpcnN0Q2hpbGQoKQogICovCiBwdWJsaWMgSURPTU5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQlyZXR1cm4gZkZpcnN0Q2hpbGQ7CisJcmV0dXJuIHRoaXMuZkZpcnN0Q2hpbGQ7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIG5vZGUgc2hvdWxkIGJlIGluc2VydGVkLgogICovCiBwdWJsaWMgaW50IGdldEluc2VydGlvblBvc2l0aW9uKCkgewotCXJldHVybiBmSW5zZXJ0aW9uUG9zaXRpb247CisJcmV0dXJuIHRoaXMuZkluc2VydGlvblBvc2l0aW9uOwogfQogLyoqCiAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtYXNrIG9mIHRoaXMgbm9kZSdzIHN0YXRlIGZsYWcKICAqIGlzIHR1cm5lZCBvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KICAqLwogcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TWFzayhpbnQgbWFzaykgewotCXJldHVybiAoZlN0YXRlTWFzayAmIG1hc2spID4gMDsKKwlyZXR1cm4gKHRoaXMuZlN0YXRlTWFzayAmIG1hc2spID4gMDsKIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSNnZXROYW1lKCkKICAqLwogcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCXJldHVybiBmTmFtZTsKKwlyZXR1cm4gdGhpcy5mTmFtZTsKIH0KIC8qKgogICogUmV0dXJucyB0aGUgc291cmNlIGNvZGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBub2RlJ3MgbmFtZS4KICAqLwogcHJvdGVjdGVkIGNoYXJbXSBnZXROYW1lQ29udGVudHMoKSB7CiAJaWYgKGlzTmFtZUFsdGVyZWQoKSkgewotCQlyZXR1cm4gZk5hbWUudG9DaGFyQXJyYXkoKTsKKwkJcmV0dXJuIHRoaXMuZk5hbWUudG9DaGFyQXJyYXkoKTsKIAl9IGVsc2UgewotCQlpZiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZVJhbmdlWzBdIDwgMCkgeworCQlpZiAodGhpcy5mTmFtZSA9PSBudWxsIHx8IHRoaXMuZk5hbWVSYW5nZVswXSA8IDApIHsKIAkJCXJldHVybiBudWxsOwogCQl9IGVsc2UgewotCQkJaW50IGxlbmd0aCA9IGZOYW1lUmFuZ2VbMV0gKyAxIC0gZk5hbWVSYW5nZVswXTsKKwkJCWludCBsZW5ndGggPSB0aGlzLmZOYW1lUmFuZ2VbMV0gKyAxIC0gdGhpcy5mTmFtZVJhbmdlWzBdOwogCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudCwgZk5hbWVSYW5nZVswXSwgcmVzdWx0LCAwLCBsZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzBdLCByZXN1bHQsIDAsIGxlbmd0aCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJfQpAQCAtNjEyLDEzICs2MTIsMTMgQEAKICAqIEBzZWUgSURPTU5vZGUjZ2V0TmV4dE5vZGUoKQogICovCiBwdWJsaWMgSURPTU5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JcmV0dXJuIGZOZXh0Tm9kZTsKKwlyZXR1cm4gdGhpcy5mTmV4dE5vZGU7CiB9CiAvKioKICAqIEBzZWUgSURPTU5vZGUjZ2V0UGFyZW50KCkKICAqLwogcHVibGljIElET01Ob2RlIGdldFBhcmVudCgpIHsKLQlyZXR1cm4gZlBhcmVudDsKKwlyZXR1cm4gdGhpcy5mUGFyZW50OwogfQogLyoqCiAgKiBBbnN3ZXJzIGEgc291cmNlIHBvc2l0aW9uIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmVudApAQCAtNjQwLDE2ICs2NDAsMTYgQEAKICAqIEBzZWUgSURPTU5vZGUjZ2V0UHJldmlvdXNOb2RlKCkKICAqLwogcHVibGljIElET01Ob2RlIGdldFByZXZpb3VzTm9kZSgpIHsKLQlyZXR1cm4gZlByZXZpb3VzTm9kZTsKKwlyZXR1cm4gdGhpcy5mUHJldmlvdXNOb2RlOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBkb2N1bWVudCBmcmFnbWVudC4KICAqLwogcHJvdGVjdGVkIElET01Ob2RlIGdldFJvb3QoKSB7Ci0JaWYgKGZQYXJlbnQgPT0gbnVsbCkgeworCWlmICh0aGlzLmZQYXJlbnQgPT0gbnVsbCkgewogCQlyZXR1cm4gdGhpczsKIAl9IGVsc2UgewotCQlyZXR1cm4gZlBhcmVudC5nZXRSb290KCk7CisJCXJldHVybiB0aGlzLmZQYXJlbnQuZ2V0Um9vdCgpOwogCX0KIH0KIC8qKgpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgKiBub2RlJ3MgY29udGVudHMgaW4gaXRzIGRvY3VtZW50LgogICovCiBwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JcmV0dXJuIGZTb3VyY2VSYW5nZVswXTsKKwlyZXR1cm4gdGhpcy5mU291cmNlUmFuZ2VbMF07CiB9CiAvKioKICAqIEBzZWUgSURPTU5vZGUjaW5zZXJ0U2libGluZyhJRE9NTm9kZSkKQEAgLTY2NSwyNyArNjY1LDI3IEBACiBwdWJsaWMgdm9pZCBpbnNlcnRTaWJsaW5nKElET01Ob2RlIHNpYmxpbmcpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7CiAJLy8gdmVyaWZ5IHNpYmxpbmcgbWF5IGJlIGFkZGVkCiAJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGROdWxsU2libGluZyk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGROdWxsU2libGluZyk7CiAJfQotCWlmIChmUGFyZW50ID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkU2libGluZ0JlZm9yZVJvb3QpOyAKKwlpZiAodGhpcy5mUGFyZW50ID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkU2libGluZ0JlZm9yZVJvb3QpOwogCX0KLQlpZiAoIWZQYXJlbnQuaXNBbGxvd2FibGVDaGlsZChzaWJsaW5nKSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGRJbmNvbXBhdGlibGVTaWJsaW5nKTsgCisJaWYgKCF0aGlzLmZQYXJlbnQuaXNBbGxvd2FibGVDaGlsZChzaWJsaW5nKSkgeworCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGRJbmNvbXBhdGlibGVTaWJsaW5nKTsKIAl9CiAJaWYgKHNpYmxpbmcuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGRTaWJsaW5nV2l0aFBhcmVudCk7IAorCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGRTaWJsaW5nV2l0aFBhcmVudCk7CiAJfQogCS8qIE5PVEU6IFRvIHRlc3QgaWYgdGhlIHNpYmxpbmcgaXMgYW4gYW5jZXN0b3Igb2YgdGhpcyBub2RlLCB3ZQogCSAqIG5lZWQgb25seSB0ZXN0IGlmIHRoZSByb290IG9mIHRoaXMgbm9kZSBpcyB0aGUgY2hpbGQgKHRoZSBzaWJsaW5nCiAJICogaXMgYWxyZWFkeSBhIHJvb3Qgc2luY2Ugd2UgaGF2ZSBqdXN0IGd1YXJhbnRlZWQgaXQgaGFzIG5vIHBhcmVudCkuCiAJICovCiAJaWYgKHNpYmxpbmcgPT0gZ2V0Um9vdCgpKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oTWVzc2FnZXMuZG9tX2FkZEFuY2VzdG9yQXNTaWJsaW5nKTsgCisJCXRocm93IG5ldyBET01FeGNlcHRpb24oTWVzc2FnZXMuZG9tX2FkZEFuY2VzdG9yQXNTaWJsaW5nKTsKIAl9CiAKIAlET01Ob2RlIG5vZGU9IChET01Ob2RlKXNpYmxpbmc7Ci0JCisKIAkvLyBpZiB0aGUgc2libGluZyBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQsIGxvY2FsaXplIGl0cyBjb250ZW50cwogCS8vIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW50byB0aGUgdHJlZQogCWlmIChub2RlLmdldERvY3VtZW50KCkgIT0gZ2V0RG9jdW1lbnQoKSkgewpAQCAtNjkzLDIxICs2OTMsMjEgQEAKIAl9CiAKIAkvLyBpbnNlcnQgdGhlIG5vZGUKLQlpZiAoZlByZXZpb3VzTm9kZSA9PSBudWxsKSB7Ci0JCWZQYXJlbnQuZkZpcnN0Q2hpbGQ9IG5vZGU7CisJaWYgKHRoaXMuZlByZXZpb3VzTm9kZSA9PSBudWxsKSB7CisJCXRoaXMuZlBhcmVudC5mRmlyc3RDaGlsZD0gbm9kZTsKIAl9IGVsc2UgewotCQlmUHJldmlvdXNOb2RlLmZOZXh0Tm9kZT0gbm9kZTsJCisJCXRoaXMuZlByZXZpb3VzTm9kZS5mTmV4dE5vZGU9IG5vZGU7CiAJfQotCW5vZGUuZlBhcmVudD0gZlBhcmVudDsKLQlub2RlLmZQcmV2aW91c05vZGU9IGZQcmV2aW91c05vZGU7CisJbm9kZS5mUGFyZW50PSB0aGlzLmZQYXJlbnQ7CisJbm9kZS5mUHJldmlvdXNOb2RlPSB0aGlzLmZQcmV2aW91c05vZGU7CiAJbm9kZS5mTmV4dE5vZGU9IHRoaXM7Ci0JZlByZXZpb3VzTm9kZT0gbm9kZTsKKwl0aGlzLmZQcmV2aW91c05vZGU9IG5vZGU7CiAKIAkvLyBpZiB0aGUgbm9kZSBpcyBhIGNvbnN0cnVjdG9yLCBpdCBtdXN0IGFsc28gYmUgZnJhZ21lbnRlZCB0byB1cGRhdGUgdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZQogCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuTUVUSE9EICYmICgoSURPTU1ldGhvZClub2RlKS5pc0NvbnN0cnVjdG9yKCkpIHsKIAkJbm9kZS5mcmFnbWVudCgpOwogCX0gZWxzZSB7Ci0JCWZQYXJlbnQuZnJhZ21lbnQoKTsKKwkJdGhpcy5mUGFyZW50LmZyYWdtZW50KCk7CiAJfQogfQogLyoqCkBAIC03MzUsMTMgKzczNSwxMyBAQAogCXJldHVybiBnZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMpOwogfQogLyoqCi0gKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9kZSdzIG9yIGEgZGVzY2VuZGFudCBub2RlJ3MgY29udGVudHMgCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9kZSdzIG9yIGEgZGVzY2VuZGFudCBub2RlJ3MgY29udGVudHMKICAqIGhhdmUgYmVlbiBhbHRlcmVkIHNpbmNlIHRoaXMgbm9kZSB3YXMgY3JlYXRlZC4gVGhpcyBpbmRpY2F0ZXMKICAqIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSBhcmUgbm8gbG9uZ2VyIGNvbnNpc3RlbnQgd2l0aAogICogdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSdzIGRvY3VtZW50LgogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZyYWdtZW50ZWQoKSB7Ci0JcmV0dXJuIGZJc0ZyYWdtZW50ZWQ7CisJcmV0dXJuIHRoaXMuZklzRnJhZ21lbnRlZDsKIH0KIC8qKgogICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZWQncyBuYW1lIGhhcyBiZWVuIGFsdGVyZWQKQEAgLTgwNCwxNyArODA0LDE3IEBACiAJCS8vIHRvIHRoZSBlbmQgb2YgdGhlIGVuY2xvc2luZyBub2RlCiAJCURPTU5vZGUgcGFyZW50ID0gKERPTU5vZGUpIGdldFBhcmVudCgpOwogCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50IGluc3RhbmNlb2YgRE9NQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlzZXRTb3VyY2VSYW5nZUVuZChmRG9jdW1lbnQubGVuZ3RoIC0gMSk7CisJCQlzZXRTb3VyY2VSYW5nZUVuZCh0aGlzLmZEb2N1bWVudC5sZW5ndGggLSAxKTsKIAkJfSBlbHNlIHsKIAkJCS8vIHBhcmVudCBpcyBhIHR5cGUKIAkJCWludCB0ZW1wID0gKChET01UeXBlKXBhcmVudCkuZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKSAtIDE7CiAJCQlzZXRTb3VyY2VSYW5nZUVuZCh0ZW1wKTsKLQkJCWZJbnNlcnRpb25Qb3NpdGlvbiA9IE1hdGgubWF4KGZpbmRlci5nZXRMaW5lU3RhcnQodGVtcCArIDEpLCBnZXRFbmRQb3NpdGlvbigpKTsKKwkJCXRoaXMuZkluc2VydGlvblBvc2l0aW9uID0gTWF0aC5tYXgoZmluZGVyLmdldExpbmVTdGFydCh0ZW1wICsgMSksIGdldEVuZFBvc2l0aW9uKCkpOwogCQl9CiAJfSBlbHNlIHsKIAkJLy8gdGhpcyBub2RlJ3MgZW5kIHBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBub2RlCiAJCWludCB0ZW1wID0gbmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxOwotCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBNYXRoLm1heChmaW5kZXIuZ2V0TGluZVN0YXJ0KHRlbXAgKyAxKSwgZ2V0RW5kUG9zaXRpb24oKSk7CisJCXRoaXMuZkluc2VydGlvblBvc2l0aW9uID0gTWF0aC5tYXgoZmluZGVyLmdldExpbmVTdGFydCh0ZW1wICsgMSksIGdldEVuZFBvc2l0aW9uKCkpOwogCQluZXh0Lm5vcm1hbGl6ZVN0YXJ0UG9zaXRpb24oZ2V0RW5kUG9zaXRpb24oKSwgZmluZGVyKTsKIAkJc2V0U291cmNlUmFuZ2VFbmQobmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxKTsKIAl9CkBAIC04MjYsMTQgKzgyNiwxNCBAQAogCWludCBub2RlU3RhcnQgPSBnZXRTdGFydFBvc2l0aW9uKCk7CiAJaW50IGxpbmVTdGFydCA9IGZpbmRlci5nZXRMaW5lU3RhcnQobm9kZVN0YXJ0KTsKIAlpZiAobm9kZVN0YXJ0ID4gbGluZVN0YXJ0ICYmIChsaW5lU3RhcnQgPiBwcmV2aW91c0VuZCB8fCAocHJldmlvdXNFbmQgPT0gMCAmJiBsaW5lU3RhcnQgPT0gMCkpKQotCQlzZXRTdGFydFBvc2l0aW9uKGxpbmVTdGFydCk7CQkJCisJCXNldFN0YXJ0UG9zaXRpb24obGluZVN0YXJ0KTsKIH0KIC8qKgogICogT2Zmc2V0cyBhbGwgdGhlIHNvdXJjZSBpbmRleGVzIGluIHRoaXMgbm9kZSBieSB0aGUgZ2l2ZW4gYW1vdW50LgogICovCiBwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgewotCW9mZnNldFJhbmdlKGZOYW1lUmFuZ2UsIG9mZnNldCk7Ci0Jb2Zmc2V0UmFuZ2UoZlNvdXJjZVJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKHRoaXMuZk5hbWVSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZSh0aGlzLmZTb3VyY2VSYW5nZSwgb2Zmc2V0KTsKIH0KIC8qKgogICogT2Zmc2V0cyB0aGUgc291cmNlIHJhbmdlIGJ5IHRoZSBnaXZlbiBhbW91bnQKQEAgLTg2NywzMCArODY3LDMwIEBACiAgKi8KIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKIAotCWlmIChmUGFyZW50ICE9IG51bGwpIHsKLQkJZlBhcmVudC5mcmFnbWVudCgpOworCWlmICh0aGlzLmZQYXJlbnQgIT0gbnVsbCkgeworCQl0aGlzLmZQYXJlbnQuZnJhZ21lbnQoKTsKIAl9Ci0JCisKIAkvLyBsaW5rIHNpYmxpbmdzCi0JaWYgKGZOZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCWZOZXh0Tm9kZS5mUHJldmlvdXNOb2RlPSBmUHJldmlvdXNOb2RlOworCWlmICh0aGlzLmZOZXh0Tm9kZSAhPSBudWxsKSB7CisJCXRoaXMuZk5leHROb2RlLmZQcmV2aW91c05vZGU9IHRoaXMuZlByZXZpb3VzTm9kZTsKIAl9Ci0JaWYgKGZQcmV2aW91c05vZGUgIT0gbnVsbCkgewotCQlmUHJldmlvdXNOb2RlLmZOZXh0Tm9kZT0gZk5leHROb2RlOworCWlmICh0aGlzLmZQcmV2aW91c05vZGUgIT0gbnVsbCkgeworCQl0aGlzLmZQcmV2aW91c05vZGUuZk5leHROb2RlPSB0aGlzLmZOZXh0Tm9kZTsKIAl9CiAJLy8gZml4IHBhcmVudCdzIHBvaW50ZXJzCi0JaWYgKGZQYXJlbnQgIT0gbnVsbCkgewotCQlpZiAoZlBhcmVudC5mRmlyc3RDaGlsZCA9PSB0aGlzKSB7Ci0JCQlmUGFyZW50LmZGaXJzdENoaWxkPSBmTmV4dE5vZGU7CisJaWYgKHRoaXMuZlBhcmVudCAhPSBudWxsKSB7CisJCWlmICh0aGlzLmZQYXJlbnQuZkZpcnN0Q2hpbGQgPT0gdGhpcykgeworCQkJdGhpcy5mUGFyZW50LmZGaXJzdENoaWxkPSB0aGlzLmZOZXh0Tm9kZTsKIAkJfQotCQlpZiAoZlBhcmVudC5mTGFzdENoaWxkID09IHRoaXMpIHsKLQkJCWZQYXJlbnQuZkxhc3RDaGlsZD0gZlByZXZpb3VzTm9kZTsKKwkJaWYgKHRoaXMuZlBhcmVudC5mTGFzdENoaWxkID09IHRoaXMpIHsKKwkJCXRoaXMuZlBhcmVudC5mTGFzdENoaWxkPSB0aGlzLmZQcmV2aW91c05vZGU7CiAJCX0KIAl9CiAJLy8gcmVtb3ZlIG15c2VsZgotCWZQYXJlbnQ9IG51bGw7Ci0JZk5leHROb2RlPSBudWxsOwotCWZQcmV2aW91c05vZGU9IG51bGw7CisJdGhpcy5mUGFyZW50PSBudWxsOworCXRoaXMuZk5leHROb2RlPSBudWxsOworCXRoaXMuZlByZXZpb3VzTm9kZT0gbnVsbDsKIH0KIC8qKgogICogU2V0cyB0aGUgc3BlY2lmaWVkIG1hc2sgb2YgdGhpcyBub2RlJ3Mgc3RhdGUgbWFzayBvbiBvciBvZmYKQEAgLTg5OCwxNiArODk4LDE2IEBACiAgKi8KIHByb3RlY3RlZCB2b2lkIHNldE1hc2soaW50IG1hc2ssIGJvb2xlYW4gb24pIHsKIAlpZiAob24pIHsKLQkJZlN0YXRlTWFzayB8PSBtYXNrOworCQl0aGlzLmZTdGF0ZU1hc2sgfD0gbWFzazsKIAl9IGVsc2UgewotCQlmU3RhdGVNYXNrICY9IH5tYXNrOworCQl0aGlzLmZTdGF0ZU1hc2sgJj0gfm1hc2s7CiAJfQogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI3NldE5hbWUKICAqLwogcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCWZOYW1lPSBuYW1lOworCXRoaXMuZk5hbWU9IG5hbWU7CiAJc2V0TmFtZUFsdGVyZWQodHJ1ZSk7CiAJZnJhZ21lbnQoKTsKIH0KQEAgLTkyNSw3ICs5MjUsNyBAQAogICogbm9ybWFsaXppbmcgdGhlIHNvdXJjZSByYW5nZSBvZiBlYWNoIG5vZGUuCiAgKi8KIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlRW5kKGludCBlbmQpIHsKLQlmU291cmNlUmFuZ2VbMV09IGVuZDsKKwl0aGlzLmZTb3VyY2VSYW5nZVsxXT0gZW5kOwogfQogLyoqCiAgKiBTZXRzIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgbm9kZSdzIGNvbnRlbnRzCkBAIC05MzMsNyArOTMzLDcgQEAKICAqIG5vcm1hbGl6aW5nIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgZWFjaCBub2RlLgogICovCiBwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydFBvc2l0aW9uKGludCBzdGFydCkgewotCWZTb3VyY2VSYW5nZVswXT0gc3RhcnQ7CisJdGhpcy5mU291cmNlUmFuZ2VbMF09IHN0YXJ0OwogfQogLyoqCiAgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUgYW5kIGRlc2NlbmRhbnQgbm9kZXMgdG8gYmUgdGhlCkBAIC05NDMsMTQgKzk0MywxNCBAQAogICogdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZS4KICAqLwogcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKLQlmRG9jdW1lbnQ9IG5vZGUuZkRvY3VtZW50OwotCWZJc0ZyYWdtZW50ZWQ9IG5vZGUuZklzRnJhZ21lbnRlZDsKLQlmTmFtZT0gbm9kZS5mTmFtZTsKLQlmTmFtZVJhbmdlPSByYW5nZUNvcHkobm9kZS5mTmFtZVJhbmdlKTsKLQlmU291cmNlUmFuZ2U9IHJhbmdlQ29weShub2RlLmZTb3VyY2VSYW5nZSk7Ci0JZlN0YXRlTWFzaz0gbm9kZS5mU3RhdGVNYXNrOworCXRoaXMuZkRvY3VtZW50PSBub2RlLmZEb2N1bWVudDsKKwl0aGlzLmZJc0ZyYWdtZW50ZWQ9IG5vZGUuZklzRnJhZ21lbnRlZDsKKwl0aGlzLmZOYW1lPSBub2RlLmZOYW1lOworCXRoaXMuZk5hbWVSYW5nZT0gcmFuZ2VDb3B5KG5vZGUuZk5hbWVSYW5nZSk7CisJdGhpcy5mU291cmNlUmFuZ2U9IHJhbmdlQ29weShub2RlLmZTb3VyY2VSYW5nZSk7CisJdGhpcy5mU3RhdGVNYXNrPSBub2RlLmZTdGF0ZU1hc2s7CiAKLQkKKwogCWlmIChjYW5IYXZlQ2hpbGRyZW4oKSkgewogCQlFbnVtZXJhdGlvbiBteUNoaWxkcmVuPSBnZXRDaGlsZHJlbigpOwogCQlFbnVtZXJhdGlvbiBvdGhlckNoaWxkcmVuPSBub2RlLmdldENoaWxkcmVuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTVBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCmluZGV4IDQyODA4ODUuLjI3NjcyYzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIEBzZWUgSURPTVBhY2thZ2UKICAqIEBzZWUgRE9NTm9kZQogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIGNsYXNzIERPTVBhY2thZ2UgZXh0ZW5kcyBET01Ob2RlIGltcGxlbWVudHMgSURPTVBhY2thZ2UgewpAQCAtNzYsMjYgKzc2LDI2IEBACiAgKiBAc2VlIERPTU5vZGUjYXBwZW5kRnJhZ21lbnRlZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kRnJhZ21lbnRlZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKLQlpZiAoZk5hbWVSYW5nZVswXSA8IDApIHsKKwlpZiAodGhpcy5mTmFtZVJhbmdlWzBdIDwgMCkgewogCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFV0aWwuZ2V0TGluZVNlcGFyYXRvcihidWZmZXIudG9TdHJpbmcoKSwgbnVsbCk7CiAJCWJ1ZmZlcgogCQkJLmFwcGVuZCgicGFja2FnZSAiKSAvLyROT04tTkxTLTEkCi0JCQkuYXBwZW5kKGZOYW1lKQorCQkJLmFwcGVuZCh0aGlzLmZOYW1lKQogCQkJLmFwcGVuZCgnOycpCiAJCQkuYXBwZW5kKGxpbmVTZXBhcmF0b3IpCiAJCQkuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwogCX0gZWxzZSB7CiAJCWJ1ZmZlcgotCQkJLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSkKLQkJCS5hcHBlbmQoZk5hbWUpCi0JCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZOYW1lUmFuZ2VbMV0pOworCQkJLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mU291cmNlUmFuZ2VbMF0sIHRoaXMuZk5hbWVSYW5nZVswXSAtIHRoaXMuZlNvdXJjZVJhbmdlWzBdKQorCQkJLmFwcGVuZCh0aGlzLmZOYW1lKQorCQkJLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mTmFtZVJhbmdlWzFdICsgMSwgdGhpcy5mU291cmNlUmFuZ2VbMV0gLSB0aGlzLmZOYW1lUmFuZ2VbMV0pOwogCX0KIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSNnZXRDb250ZW50cygpCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoKSB7Ci0JaWYgKGZOYW1lID09IG51bGwpIHsKKwlpZiAodGhpcy5mTmFtZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0gZWxzZSB7CiAJCXJldHVybiBzdXBlci5nZXRDb250ZW50cygpOwpAQCAtMTE0LDcgKzExNCw3IEBACiAJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CiAJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpcGFyZW50KS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oZ2V0TmFtZSgpKTsKIAl9IGVsc2UgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaWxsZWdhbFBhcmVudCk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaWxsZWdhbFBhcmVudCk7CiAJfQogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCmluZGV4IGZhZmYwNTguLmVjYWY3YzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDkgKzI4LDkgQEAKICAqIEBzZWUgSURPTVR5cGUKICAqIEBzZWUgRE9NTm9kZQogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCi0gKi8gCisgKi8KIC8vIFRPRE8gKGplcm9tZSkgLSBhZGQgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgMS41IGZlYXR1cmVzCiAvKiBwYWNrYWdlICovIGNsYXNzIERPTVR5cGUgZXh0ZW5kcyBET01NZW1iZXIgaW1wbGVtZW50cyBJRE9NVHlwZSB7CiAJLyoqCkBAIC03Miw3ICs3Miw3IEBACiAJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VjZSByYW5nZSBvZiB0aGUgJ2ltcGxlbWVudHMnIGtleXdvcmQKIAkgKiBpbiB0aGUgZG9jdW1lbnQsIGluY2x1ZGluZyBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLCBvciAtMSdzIGlmCiAJICogdGhlIGtleXdvcmQgd2FzIG5vdCBwcmVzZW50IGluIHRoZSBkb2N1bWVudC4KLQkgKi8JCisJICovCiAJcHJvdGVjdGVkIGludFtdCSBmSW1wbGVtZW50c1JhbmdlOwogCiAJLyoqCkBAIC05MCwyMiArOTAsMjIgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgaW50W10gIGZJbnRlcmZhY2VzUmFuZ2U7CiAKLQkKIAotCS8qKiAKKworCS8qKgogCSAqIFRoZSBvcmlnaW5hbCBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlCiAJICogdHlwZSBuYW1lIHN1cGVyY2xhc3MgbmFtZSwgb3IgaW50ZXJmYWNlIGxpc3QsIHVwIHRvIGFuZCBpbmNsdWRpbmcKIAkgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlZm9yZSB0aGUgZmlyc3QgdHlwZSBtZW1iZXIuCi0JICovCQorCSAqLwogCXByb3RlY3RlZCBpbnRbXSAgZk9wZW5Cb2R5UmFuZ2U7CiAKLQkvKiogCisJLyoqCiAJICogVGhlIG9yaWdpbmFsIHNvdXJjZSByYW5nZSBvZiB0aGUgZmlyc3QgbmV3IGxpbmUgb3Igbm9uIHdoaXRlc3BhY2UKIAkgKiBjaGFyYWN0ZXIgcHJlY2VkaW5nIHRoZSBjbG9zZSBicmFjZSBvZiB0aGUgdHlwZSdzIGJvZHksIHVwIHRvIHRoZQogCSAqIGFuZCBpbmNsdWRpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciBiZWZvcmUgdGhlIG5leHQgbm9kZSAoaWYgdGhlcmUgYXJlCiAJICogbm8gZm9sbG93aW5nIG5vZGVzLCB0aGUgcmFuZ2UgZW5kcyBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QKIAkgKiBjaGFyYWN0ZXIgaW4gdGhlIGRvY3VtZW50KS4KLQkgKi8JCisJICovCiAJcHJvdGVjdGVkIGludFtdICBmQ2xvc2VCb2R5UmFuZ2U7CiAKIAkvKioKQEAgLTExNCw3ICsxMTQsNyBAQAogCSAqIG9yIGltcGxlbWVudCBhbnkgaW50ZXJmYWNlcy4KIAkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nW10gZlN1cGVySW50ZXJmYWNlcz0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwotCQorCiAJLyoqCiAJICogVGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMuCiAJICogQHNpbmNlIDMuMApAQCAtMTI2LDEzICsxMjYsMTMgQEAKIAkgKiBAc2luY2UgMy4wCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gZklzRW51bT0gZmFsc2U7Ci0JCisKIAkvKioKIAkgKiBJbmRpY2F0ZXMgdGhpcyB0eXBlIGlzIGFuIGFubm90YXRhdGlvbiB0eXBlIChpbnRlcmZhY2UpLgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNBbm5vdGF0aW9uPSBmYWxzZTsKLQkKKwogCS8qKgogCSAqIFRoaXMgcG9zaXRpb24gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlIHN0YXJ0aW5nCiAJICogcG9zaXRpb24gb2YgdGhlIHJlY2VpdmVyLgpAQCAtMjA1LDE5ICsyMDUsMTkgQEAKIERPTVR5cGUoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgaW50W10gY29tbWVudFJhbmdlLCBpbnQgZmxhZ3MsIGludFtdIG1vZGlmaWVyUmFuZ2UsIGludFtdIHR5cGVSYW5nZSwgaW50W10gc3VwZXJjbGFzc1JhbmdlLCBpbnRbXSBleHRlbmRzUmFuZ2UsIFN0cmluZ1tdIGltcGxlbWVudHNMaXN0LCBpbnRbXSBpbXBsZW1lbnRzUmFuZ2UsIGludFtdIGltcGxlbWVudHNLZXl3b3JkUmFuZ2UsIGludFtdIG9wZW5Cb2R5UmFuZ2UsIGludFtdIGNsb3NlQm9keVJhbmdlLCBib29sZWFuIGlzQ2xhc3MpIHsKIAlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCBmbGFncywgbW9kaWZpZXJSYW5nZSk7CiAKLQlmVHlwZVJhbmdlPSB0eXBlUmFuZ2U7CisJdGhpcy5mVHlwZVJhbmdlPSB0eXBlUmFuZ2U7CiAJc2V0TWFzayhNQVNLX1RZUEVfSVNfQ0xBU1MsIGlzQ2xhc3MpOwogCi0JZkV4dGVuZHNSYW5nZT0gZXh0ZW5kc1JhbmdlOwotCWZJbXBsZW1lbnRzUmFuZ2U9IGltcGxlbWVudHNLZXl3b3JkUmFuZ2U7Ci0JZlN1cGVyY2xhc3NSYW5nZT0gc3VwZXJjbGFzc1JhbmdlOwotCWZJbnRlcmZhY2VzUmFuZ2U9IGltcGxlbWVudHNSYW5nZTsKLQlmQ2xvc2VCb2R5UmFuZ2U9IGNsb3NlQm9keVJhbmdlOworCXRoaXMuZkV4dGVuZHNSYW5nZT0gZXh0ZW5kc1JhbmdlOworCXRoaXMuZkltcGxlbWVudHNSYW5nZT0gaW1wbGVtZW50c0tleXdvcmRSYW5nZTsKKwl0aGlzLmZTdXBlcmNsYXNzUmFuZ2U9IHN1cGVyY2xhc3NSYW5nZTsKKwl0aGlzLmZJbnRlcmZhY2VzUmFuZ2U9IGltcGxlbWVudHNSYW5nZTsKKwl0aGlzLmZDbG9zZUJvZHlSYW5nZT0gY2xvc2VCb2R5UmFuZ2U7CiAJc2V0TWFzayhNQVNLX1RZUEVfSEFTX1NVUEVSQ0xBU1MsIHN1cGVyY2xhc3NSYW5nZVswXSA+IDApOwogCXNldE1hc2soTUFTS19UWVBFX0hBU19JTlRFUkZBQ0VTLCBpbXBsZW1lbnRzTGlzdCAhPSBudWxsKTsKLQlmU3VwZXJJbnRlcmZhY2VzPSBpbXBsZW1lbnRzTGlzdDsKLQlmT3BlbkJvZHlSYW5nZT0gb3BlbkJvZHlSYW5nZTsKLQlmQ2xvc2VCb2R5UmFuZ2U9IGNsb3NlQm9keVJhbmdlOworCXRoaXMuZlN1cGVySW50ZXJmYWNlcz0gaW1wbGVtZW50c0xpc3Q7CisJdGhpcy5mT3BlbkJvZHlSYW5nZT0gb3BlbkJvZHlSYW5nZTsKKwl0aGlzLmZDbG9zZUJvZHlSYW5nZT0gY2xvc2VCb2R5UmFuZ2U7CiAJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCB0cnVlKTsKIAogfQpAQCAtMjU1LDM1ICsyNTUsMzUgQEAKICAqLwogcHVibGljIHZvaWQgYWRkU3VwZXJJbnRlcmZhY2UoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogCWlmIChuYW1lID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fYWRkTnVsbEludGVyZmFjZSk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmRvbV9hZGROdWxsSW50ZXJmYWNlKTsKIAl9Ci0JaWYgKGZTdXBlckludGVyZmFjZXMgPT0gbnVsbCkgewotCQlmU3VwZXJJbnRlcmZhY2VzPSBuZXcgU3RyaW5nWzFdOwotCQlmU3VwZXJJbnRlcmZhY2VzWzBdPSBuYW1lOworCWlmICh0aGlzLmZTdXBlckludGVyZmFjZXMgPT0gbnVsbCkgeworCQl0aGlzLmZTdXBlckludGVyZmFjZXM9IG5ldyBTdHJpbmdbMV07CisJCXRoaXMuZlN1cGVySW50ZXJmYWNlc1swXT0gbmFtZTsKIAl9IGVsc2UgewotCQlmU3VwZXJJbnRlcmZhY2VzPSBhcHBlbmRTdHJpbmcoZlN1cGVySW50ZXJmYWNlcywgbmFtZSk7CisJCXRoaXMuZlN1cGVySW50ZXJmYWNlcz0gYXBwZW5kU3RyaW5nKHRoaXMuZlN1cGVySW50ZXJmYWNlcywgbmFtZSk7CiAJfQotCXNldFN1cGVySW50ZXJmYWNlcyhmU3VwZXJJbnRlcmZhY2VzKTsKKwlzZXRTdXBlckludGVyZmFjZXModGhpcy5mU3VwZXJJbnRlcmZhY2VzKTsKIH0KIC8qKgogICogQHNlZSBET01NZW1iZXIjYXBwZW5kTWVtYmVyQm9keUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKICAqLwogcHJvdGVjdGVkIHZvaWQgYXBwZW5kTWVtYmVyQm9keUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKLQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZk9wZW5Cb2R5UmFuZ2VbMF0sIGZPcGVuQm9keVJhbmdlWzFdICsgMSAtIGZPcGVuQm9keVJhbmdlWzBdKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZPcGVuQm9keVJhbmdlWzBdLCB0aGlzLmZPcGVuQm9keVJhbmdlWzFdICsgMSAtIHRoaXMuZk9wZW5Cb2R5UmFuZ2VbMF0pOwogCWFwcGVuZENvbnRlbnRzT2ZDaGlsZHJlbihidWZmZXIpOwotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQ2xvc2VCb2R5UmFuZ2VbMF0sIGZDbG9zZUJvZHlSYW5nZVsxXSArIDEgLSBmQ2xvc2VCb2R5UmFuZ2VbMF0pOwotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQ2xvc2VCb2R5UmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmQ2xvc2VCb2R5UmFuZ2VbMV0pOworCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkNsb3NlQm9keVJhbmdlWzBdLCB0aGlzLmZDbG9zZUJvZHlSYW5nZVsxXSArIDEgLSB0aGlzLmZDbG9zZUJvZHlSYW5nZVswXSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mQ2xvc2VCb2R5UmFuZ2VbMV0gKyAxLCB0aGlzLmZTb3VyY2VSYW5nZVsxXSAtIHRoaXMuZkNsb3NlQm9keVJhbmdlWzFdKTsKIH0KIC8qKgogICogQHNlZSBET01NZW1iZXIjYXBwZW5kTWVtYmVyRGVjbGFyYXRpb25Db250ZW50cyhDaGFyQXJyYXlCdWZmZXIgKQogICovCiBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJEZWNsYXJhdGlvbkNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciAgYnVmZmVyKSB7Ci0JCi0JaWYgKGZUeXBlS2V5d29yZCAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZlR5cGVLZXl3b3JkKTsKLQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZUeXBlUmFuZ2VbMV0sIGZOYW1lUmFuZ2VbMF0gLSBmVHlwZVJhbmdlWzFdICk7CisKKwlpZiAodGhpcy5mVHlwZUtleXdvcmQgIT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKHRoaXMuZlR5cGVLZXl3b3JkKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mVHlwZVJhbmdlWzFdLCB0aGlzLmZOYW1lUmFuZ2VbMF0gLSB0aGlzLmZUeXBlUmFuZ2VbMV0gKTsKIAl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlR5cGVSYW5nZVswXSwgZlR5cGVSYW5nZVsxXSArIDEgLSBmVHlwZVJhbmdlWzBdKTsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mVHlwZVJhbmdlWzBdLCB0aGlzLmZUeXBlUmFuZ2VbMV0gKyAxIC0gdGhpcy5mVHlwZVJhbmdlWzBdKTsKIAl9CiAKIAlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7CkBAIC0yOTEsODUgKzI5MSw4NSBAQAogCWlmIChpc0NsYXNzKCkpIHsKIAkJYm9vbGVhbiBoYXNJbnRlcmZhY2VzID0gZmFsc2U7CiAJCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfU1VQRVJDTEFTUykpIHsKLQkJCWlmIChmRXh0ZW5kc1JhbmdlWzBdIDwgMCkgeworCQkJaWYgKHRoaXMuZkV4dGVuZHNSYW5nZVswXSA8IDApIHsKIAkJCQlidWZmZXIuYXBwZW5kKCIgZXh0ZW5kcyAiKTsgLy8kTk9OLU5MUy0xJAogCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkV4dGVuZHNSYW5nZVswXSwgZkV4dGVuZHNSYW5nZVsxXSArIDEgLSBmRXh0ZW5kc1JhbmdlWzBdKTsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZFeHRlbmRzUmFuZ2VbMF0sIHRoaXMuZkV4dGVuZHNSYW5nZVsxXSArIDEgLSB0aGlzLmZFeHRlbmRzUmFuZ2VbMF0pOwogCQkJfQotCQkJaWYgKGZTdXBlcmNsYXNzICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGZTdXBlcmNsYXNzKTsKKwkJCWlmICh0aGlzLmZTdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZlN1cGVyY2xhc3MpOwogCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVswXSwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSBmU3VwZXJjbGFzc1JhbmdlWzBdKTsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZTdXBlcmNsYXNzUmFuZ2VbMF0sIHRoaXMuZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSB0aGlzLmZTdXBlcmNsYXNzUmFuZ2VbMF0pOwogCQkJfQogCQl9CiAJCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUykpIHsKIAkJCWhhc0ludGVyZmFjZXMgPSB0cnVlOwotCQkJaWYgKGZJbXBsZW1lbnRzUmFuZ2VbMF0gPCAwKSB7CisJCQlpZiAodGhpcy5mSW1wbGVtZW50c1JhbmdlWzBdIDwgMCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoIiBpbXBsZW1lbnRzICIpOyAvLyROT04tTkxTLTEkCiAJCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW1wbGVtZW50c1JhbmdlWzBdLCBmSW1wbGVtZW50c1JhbmdlWzFdICsgMSAtIGZJbXBsZW1lbnRzUmFuZ2VbMF0pOworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkltcGxlbWVudHNSYW5nZVswXSwgdGhpcy5mSW1wbGVtZW50c1JhbmdlWzFdICsgMSAtIHRoaXMuZkltcGxlbWVudHNSYW5nZVswXSk7CiAJCQl9Ci0JCQlpZiAoZkludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkludGVyZmFjZXMpOworCQkJaWYgKHRoaXMuZkludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mSW50ZXJmYWNlcyk7CiAJCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW50ZXJmYWNlc1JhbmdlWzBdLCBmSW50ZXJmYWNlc1JhbmdlWzFdICsgMSAtIGZJbnRlcmZhY2VzUmFuZ2VbMF0pOworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkludGVyZmFjZXNSYW5nZVswXSwgdGhpcy5mSW50ZXJmYWNlc1JhbmdlWzFdICsgMSAtIHRoaXMuZkludGVyZmFjZXNSYW5nZVswXSk7CiAJCQl9CiAJCX0KIAkJaWYgKGhhc0ludGVyZmFjZXMpIHsKLQkJCWlmIChmSW1wbGVtZW50c1JhbmdlWzBdIDwgMCkgeworCQkJaWYgKHRoaXMuZkltcGxlbWVudHNSYW5nZVswXSA8IDApIHsKIAkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CiAJCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW50ZXJmYWNlc1JhbmdlWzFdICsgMSwgZk9wZW5Cb2R5UmFuZ2VbMF0gLSBmSW50ZXJmYWNlc1JhbmdlWzFdIC0gMSk7CisJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mSW50ZXJmYWNlc1JhbmdlWzFdICsgMSwgdGhpcy5mT3BlbkJvZHlSYW5nZVswXSAtIHRoaXMuZkludGVyZmFjZXNSYW5nZVsxXSAtIDEpOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKGZTdXBlcmNsYXNzUmFuZ2VbMF0gPCAwKSB7CisJCQlpZiAodGhpcy5mU3VwZXJjbGFzc1JhbmdlWzBdIDwgMCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCX0gZWxzZSBpZiAoZkltcGxlbWVudHNSYW5nZVswXSA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEsIGZJbXBsZW1lbnRzUmFuZ2VbMF0gLSBmU3VwZXJjbGFzc1JhbmdlWzFdIC0gMSk7Ci0JCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZJbnRlcmZhY2VzUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVswXSAtIGZJbnRlcmZhY2VzUmFuZ2VbMV0gLSAxKTsKKwkJCX0gZWxzZSBpZiAodGhpcy5mSW1wbGVtZW50c1JhbmdlWzBdID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEsIHRoaXMuZkltcGxlbWVudHNSYW5nZVswXSAtIHRoaXMuZlN1cGVyY2xhc3NSYW5nZVsxXSAtIDEpOworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkludGVyZmFjZXNSYW5nZVsxXSArIDEsIHRoaXMuZk9wZW5Cb2R5UmFuZ2VbMF0gLSB0aGlzLmZJbnRlcmZhY2VzUmFuZ2VbMV0gLSAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTdXBlcmNsYXNzUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVswXSAtIGZTdXBlcmNsYXNzUmFuZ2VbMV0gLSAxKTsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZTdXBlcmNsYXNzUmFuZ2VbMV0gKyAxLCB0aGlzLmZPcGVuQm9keVJhbmdlWzBdIC0gdGhpcy5mU3VwZXJjbGFzc1JhbmdlWzFdIC0gMSk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoZ2V0TWFzayhNQVNLX1RZUEVfSEFTX0lOVEVSRkFDRVMpKSB7Ci0JCQlpZiAoZkV4dGVuZHNSYW5nZVswXSA8IDApIHsKKwkJCWlmICh0aGlzLmZFeHRlbmRzUmFuZ2VbMF0gPCAwKSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZFeHRlbmRzUmFuZ2VbMF0sIGZFeHRlbmRzUmFuZ2VbMV0gKyAxIC0gZkV4dGVuZHNSYW5nZVswXSk7CisJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mRXh0ZW5kc1JhbmdlWzBdLCB0aGlzLmZFeHRlbmRzUmFuZ2VbMV0gKyAxIC0gdGhpcy5mRXh0ZW5kc1JhbmdlWzBdKTsKIAkJCX0KLQkJCWlmIChmSW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChmSW50ZXJmYWNlcyk7CisJCQlpZiAodGhpcy5mSW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZJbnRlcmZhY2VzKTsKIAkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CiAJCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW50ZXJmYWNlc1JhbmdlWzBdLCBmSW50ZXJmYWNlc1JhbmdlWzFdICsgMSAtIGZJbnRlcmZhY2VzUmFuZ2VbMF0pOworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkludGVyZmFjZXNSYW5nZVswXSwgdGhpcy5mSW50ZXJmYWNlc1JhbmdlWzFdICsgMSAtIHRoaXMuZkludGVyZmFjZXNSYW5nZVswXSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoZkltcGxlbWVudHNSYW5nZVswXSA8IDApIHsKKwkJCWlmICh0aGlzLmZJbXBsZW1lbnRzUmFuZ2VbMF0gPCAwKSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgnICcpOwogCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZPcGVuQm9keVJhbmdlWzBdIC0gZk5hbWVSYW5nZVsxXSAtIDEpOworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZk5hbWVSYW5nZVsxXSArIDEsIHRoaXMuZk9wZW5Cb2R5UmFuZ2VbMF0gLSB0aGlzLmZOYW1lUmFuZ2VbMV0gLSAxKTsKIAkJCX0KIAkJfQogCX0KLQkKKwogfQogLyoqCiAgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRTaW1wbGVDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCiAgKi8KIHByb3RlY3RlZCB2b2lkIGFwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKIAkvLyBhcHBlbmQgZXZleXRoaW5nIGJlZm9yZSBteSBuYW1lCi0JYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmZEb2N1bWVudCwgdGhpcy5mU291cmNlUmFuZ2VbMF0sIHRoaXMuZk5hbWVSYW5nZVswXSAtIHRoaXMuZlNvdXJjZVJhbmdlWzBdKTsKIAkvLyBhcHBlbmQgbXkgbmFtZQotCWJ1ZmZlci5hcHBlbmQoZk5hbWUpOworCWJ1ZmZlci5hcHBlbmQodGhpcy5mTmFtZSk7CiAKLQkKKwogCS8vIGFwcGVuZCBldmVyeXRoaW5nIGFmdGVyIG15IG5hbWUgYW5kIGJlZm9yZSBteSBmaXJzdCBjaGlsZAotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZk9wZW5Cb2R5UmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZOYW1lUmFuZ2VbMV0gKyAxLCB0aGlzLmZPcGVuQm9keVJhbmdlWzFdIC0gdGhpcy5mTmFtZVJhbmdlWzFdKTsKIAkvLyBhcHBlbmQgbXkgY2hpbGRyZW4KIAlhcHBlbmRDb250ZW50c09mQ2hpbGRyZW4oYnVmZmVyKTsKIAkvLyBhcHBlbmQgZnJvbSBteSBsYXN0IGNoaWxkIHRvIG15IGVuZAotCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQ2xvc2VCb2R5UmFuZ2VbMF0sIGZTb3VyY2VSYW5nZVsxXSAtIGZDbG9zZUJvZHlSYW5nZVswXSArIDEpOworCWJ1ZmZlci5hcHBlbmQodGhpcy5mRG9jdW1lbnQsIHRoaXMuZkNsb3NlQm9keVJhbmdlWzBdLCB0aGlzLmZTb3VyY2VSYW5nZVsxXSAtIHRoaXMuZkNsb3NlQm9keVJhbmdlWzBdICsgMSk7CiAKIAogfQpAQCAtMzg1LDcgKzM4NSw3IEBACiAgKiBiZWVuIG5vcm1hbGl6ZWQgYW5kIGlzIHByZXNlbnQgb25seSBmb3Igbm9ybWFsaXphdGlvbi4KICAqLwogaW50IGdldENsb3NlQm9keVBvc2l0aW9uKCkgewotCXJldHVybiBmQ2xvc2VCb2R5UmFuZ2VbMF07CisJcmV0dXJuIHRoaXMuZkNsb3NlQm9keVJhbmdlWzBdOwogfQogLyoqCiAgKiBAc2VlIERPTU5vZGUjZ2V0RGV0YWlsZWROb2RlKCkKQEAgLTM5OSw3ICszOTksNyBAQAogcHVibGljIGludCBnZXRJbnNlcnRpb25Qb3NpdGlvbigpIHsKIAkvLyB0aGlzIHNob3VsZCByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlIG9mIHRoZSB0eXBlCiAJLy8gU2VlIFBSIDFHRUxTRFE6IElUUEpVSTpXSU5OVCAtIEpET006IElUeXBlLmNyZWF0ZU1ldGhvZCBkb2VzIG5vdCBpbnNlcnQgbmljZWx5IGZvciBpbm5lciB0eXBlcwotCXJldHVybiBmSW5zZXJ0aW9uUG9zaXRpb247CisJcmV0dXJuIHRoaXMuZkluc2VydGlvblBvc2l0aW9uOwogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlI2dldEphdmFFbGVtZW50CkBAIC00MTAsMTYgKzQxMCwxNiBAQAogCQkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldFR5cGUoZ2V0TmFtZSgpKTsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKIAkJCXJldHVybiAoKElUeXBlKXBhcmVudCkuZ2V0VHlwZShnZXROYW1lKCkpOwotCQkvLyBOb3RlOiBjcmVhdGluZyBsb2NhbC9hbm9ueW1vdXMgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIAorCQkvLyBOb3RlOiBjcmVhdGluZyBsb2NhbC9hbm9ueW1vdXMgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCiAJCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfaWxsZWdhbFBhcmVudCk7IAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lbGVtZW50X2lsbGVnYWxQYXJlbnQpOwogCX0KIH0KIC8qKgogICogQHNlZSBET01NZW1iZXIjZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkKICAqLwogcHJvdGVjdGVkIGludCBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSB7Ci0JcmV0dXJuIGZUeXBlUmFuZ2VbMF07CisJcmV0dXJuIHRoaXMuZlR5cGVSYW5nZVswXTsKIH0KIC8qKgogICogQHNlZSBJRE9NTm9kZSNnZXROb2RlVHlwZSgpCkBAIC00MzEsNyArNDMxLDcgQEAKICAqIEFuc3dlcnMgdGhlIG9wZW4gYm9keSByYW5nZSBlbmQgcG9zaXRpb24uCiAgKi8KIGludCBnZXRPcGVuQm9keUVuZCgpIHsKLQlyZXR1cm4gZk9wZW5Cb2R5UmFuZ2VbMV07CisJcmV0dXJuIHRoaXMuZk9wZW5Cb2R5UmFuZ2VbMV07CiB9CiAvKioKICAqIEBzZWUgSURPTVR5cGUjZ2V0U3VwZXJjbGFzcygpCkBAIC00MzksMTAgKzQzOSwxMCBAQAogcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzKCkgewogCWJlY29tZURldGFpbGVkKCk7CiAJaWYgKGdldE1hc2soTUFTS19UWVBFX0hBU19TVVBFUkNMQVNTKSkgewotCQlpZiAoZlN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZTdXBlcmNsYXNzOworCQlpZiAodGhpcy5mU3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5mU3VwZXJjbGFzczsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVswXSwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSBmU3VwZXJjbGFzc1JhbmdlWzBdKTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZTdXBlcmNsYXNzUmFuZ2VbMF0sIHRoaXMuZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSB0aGlzLmZTdXBlcmNsYXNzUmFuZ2VbMF0pOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dXJuIG51bGw7CkBAIC00NTIsNyArNDUyLDcgQEAKICAqIEBzZWUgSURPTVR5cGUjZ2V0U3VwZXJJbnRlcmZhY2VzKCkKICAqLwogcHVibGljIFN0cmluZ1tdIGdldFN1cGVySW50ZXJmYWNlcygpIHsKLQlyZXR1cm4gZlN1cGVySW50ZXJmYWNlczsKKwlyZXR1cm4gdGhpcy5mU3VwZXJJbnRlcmZhY2VzOwogfQogLyoqCiAgKiBAc2VlIElET01Ob2RlCkBAIC00NjAsMTIgKzQ2MCwxMiBAQAogcHVibGljIGJvb2xlYW4gaXNBbGxvd2FibGVDaGlsZChJRE9NTm9kZSBub2RlKSB7CiAJaWYgKG5vZGUgIT0gbnVsbCkgewogCQlpbnQgdHlwZT0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBJRE9NTm9kZS5UWVBFIHx8IHR5cGUgPT0gSURPTU5vZGUuRklFTER8fCB0eXBlID09IElET01Ob2RlLk1FVEhPRCB8fCAKLQkJCXR5cGUgPT0gSURPTU5vZGUuSU5JVElBTElaRVI7IAorCQlyZXR1cm4gdHlwZSA9PSBJRE9NTm9kZS5UWVBFIHx8IHR5cGUgPT0gSURPTU5vZGUuRklFTER8fCB0eXBlID09IElET01Ob2RlLk1FVEhPRCB8fAorCQkJdHlwZSA9PSBJRE9NTm9kZS5JTklUSUFMSVpFUjsKIAl9IGVsc2UgewogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiB9CiAvKioKICAqIEBzZWUgSURPTVR5cGUjaXNDbGFzcygpCkBAIC00OTEsMjUgKzQ5MSwyNSBAQAogCURPTU5vZGUgbGFzdE5vZGUgPSBudWxsOwogCS8vIGxvb2sgZm9yIHRoZSBvcGVuIGJvZHkKIAlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcigpOwotCXNjYW5uZXIuc2V0U291cmNlKGZEb2N1bWVudCk7Ci0Jc2Nhbm5lci5yZXNldFRvKGZOYW1lUmFuZ2VbMV0gKyAxLCBmRG9jdW1lbnQubGVuZ3RoKTsKLQkKKwlzY2FubmVyLnNldFNvdXJjZSh0aGlzLmZEb2N1bWVudCk7CisJc2Nhbm5lci5yZXNldFRvKHRoaXMuZk5hbWVSYW5nZVsxXSArIDEsIHRoaXMuZkRvY3VtZW50Lmxlbmd0aCk7CisKIAl0cnkgewogCQlpbnQgY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJd2hpbGUoY3VycmVudFRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSAmJgogCQkJCWN1cnJlbnRUb2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCWN1cnJlbnRUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CiAJCX0KLQkJaWYoY3VycmVudFRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSkgewkJCisJCWlmKGN1cnJlbnRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UpIHsKIAkJCW9wZW5Cb2R5RW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCQkJb3BlbkJvZHlTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKIAkJfSBlbHNlIHsKLQkJCW9wZW5Cb2R5RW5kID0gZkRvY3VtZW50Lmxlbmd0aDsKLQkJCW9wZW5Cb2R5U3RhcnQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJb3BlbkJvZHlFbmQgPSB0aGlzLmZEb2N1bWVudC5sZW5ndGg7CisJCQlvcGVuQm9keVN0YXJ0ID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOwogCQl9CiAJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQlvcGVuQm9keUVuZCA9IGZEb2N1bWVudC5sZW5ndGg7Ci0JCW9wZW5Cb2R5U3RhcnQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQlvcGVuQm9keUVuZCA9IHRoaXMuZkRvY3VtZW50Lmxlbmd0aDsKKwkJb3BlbkJvZHlTdGFydCA9IHRoaXMuZkRvY3VtZW50Lmxlbmd0aDsKIAl9CiAJaWYgKGZpcnN0ICE9IG51bGwpIHsKIAkJaW50IGxpbmVTdGFydCA9IGZpbmRlci5nZXRMaW5lU3RhcnQoZmlyc3QuZ2V0U3RhcnRQb3NpdGlvbigpKTsKQEAgLTUxNyw3ICs1MTcsNyBAQAogCQkJb3BlbkJvZHlFbmQgPSBsaW5lU3RhcnQgLSAxOwogCQl9IGVsc2UgewogCQkJb3BlbkJvZHlFbmQgPSBmaXJzdC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxOwotCQl9CQkKKwkJfQogCQlsYXN0Tm9kZSA9IChET01Ob2RlKSBmaXJzdC5nZXROZXh0Tm9kZSgpOwogCQlpZiAobGFzdE5vZGUgPT0gbnVsbCkgewogCQkJbGFzdE5vZGUgPSBmaXJzdDsKQEAgLTUyNiw0MyArNTI2LDQzIEBACiAJCQkJbGFzdE5vZGUgPSAoRE9NTm9kZSkgbGFzdE5vZGUuZ2V0TmV4dE5vZGUoKTsKIAkJCX0KIAkJfQotCQlzY2FubmVyLnNldFNvdXJjZShmRG9jdW1lbnQpOwotCQlzY2FubmVyLnJlc2V0VG8obGFzdE5vZGUuZ2V0RW5kUG9zaXRpb24oKSArIDEsIGZEb2N1bWVudC5sZW5ndGgpOworCQlzY2FubmVyLnNldFNvdXJjZSh0aGlzLmZEb2N1bWVudCk7CisJCXNjYW5uZXIucmVzZXRUbyhsYXN0Tm9kZS5nZXRFbmRQb3NpdGlvbigpICsgMSwgdGhpcy5mRG9jdW1lbnQubGVuZ3RoKTsKIAkJdHJ5IHsKIAkJCWludCBjdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJd2hpbGUoY3VycmVudFRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSAmJgogCQkJCQljdXJyZW50VG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCX0KLQkJCWlmKGN1cnJlbnRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UpIHsJCQorCQkJaWYoY3VycmVudFRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSkgewogCQkJCWNsb3NlQm9keVN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJCWNsb3NlQm9keUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCX0gZWxzZSB7Ci0JCQkJY2xvc2VCb2R5U3RhcnQgPSBmRG9jdW1lbnQubGVuZ3RoOwotCQkJCWNsb3NlQm9keUVuZCA9IGZEb2N1bWVudC5sZW5ndGg7CisJCQkJY2xvc2VCb2R5U3RhcnQgPSB0aGlzLmZEb2N1bWVudC5sZW5ndGg7CisJCQkJY2xvc2VCb2R5RW5kID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOwogCQkJfQogCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQljbG9zZUJvZHlTdGFydCA9IGZEb2N1bWVudC5sZW5ndGg7Ci0JCQljbG9zZUJvZHlFbmQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJY2xvc2VCb2R5U3RhcnQgPSB0aGlzLmZEb2N1bWVudC5sZW5ndGg7CisJCQljbG9zZUJvZHlFbmQgPSB0aGlzLmZEb2N1bWVudC5sZW5ndGg7CiAJCX0KIAl9IGVsc2UgewotCQlzY2FubmVyLnJlc2V0VG8ob3BlbkJvZHlFbmQsIGZEb2N1bWVudC5sZW5ndGgpOworCQlzY2FubmVyLnJlc2V0VG8ob3BlbkJvZHlFbmQsIHRoaXMuZkRvY3VtZW50Lmxlbmd0aCk7CiAJCXRyeSB7CiAJCQlpbnQgY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCXdoaWxlKGN1cnJlbnRUb2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UgJiYKIAkJCQkJY3VycmVudFRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCWN1cnJlbnRUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CiAJCQl9Ci0JCQlpZihjdXJyZW50VG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFKSB7CQkKKwkJCWlmKGN1cnJlbnRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UpIHsKIAkJCQljbG9zZUJvZHlTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKIAkJCQljbG9zZUJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQl9IGVsc2UgewotCQkJCWNsb3NlQm9keVN0YXJ0ID0gZkRvY3VtZW50Lmxlbmd0aDsKLQkJCQljbG9zZUJvZHlFbmQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJCWNsb3NlQm9keVN0YXJ0ID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOworCQkJCWNsb3NlQm9keUVuZCA9IHRoaXMuZkRvY3VtZW50Lmxlbmd0aDsKIAkJCX0KIAkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJY2xvc2VCb2R5U3RhcnQgPSBmRG9jdW1lbnQubGVuZ3RoOwotCQkJY2xvc2VCb2R5RW5kID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJCWNsb3NlQm9keVN0YXJ0ID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOworCQkJY2xvc2VCb2R5RW5kID0gdGhpcy5mRG9jdW1lbnQubGVuZ3RoOwogCQl9CiAJCW9wZW5Cb2R5RW5kID0gY2xvc2VCb2R5RW5kIC0gMTsKIAl9CkBAIC01NzAsMTIgKzU3MCwxMiBAQAogCXNldE9wZW5Cb2R5UmFuZ2VTdGFydChvcGVuQm9keVN0YXJ0KTsKIAlzZXRDbG9zZUJvZHlSYW5nZVN0YXJ0KGNsb3NlQm9keVN0YXJ0KTsKIAlzZXRDbG9zZUJvZHlSYW5nZUVuZChjbG9zZUJvZHlFbmQpOwotCWZJbnNlcnRpb25Qb3NpdGlvbiA9IGZpbmRlci5nZXRMaW5lU3RhcnQoY2xvc2VCb2R5U3RhcnQpOwotCWlmIChsYXN0Tm9kZSAhPSBudWxsICYmIGZJbnNlcnRpb25Qb3NpdGlvbiA8IGxhc3ROb2RlLmdldEVuZFBvc2l0aW9uKCkpIHsKLQkJZkluc2VydGlvblBvc2l0aW9uID0gZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKTsKKwl0aGlzLmZJbnNlcnRpb25Qb3NpdGlvbiA9IGZpbmRlci5nZXRMaW5lU3RhcnQoY2xvc2VCb2R5U3RhcnQpOworCWlmIChsYXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuZkluc2VydGlvblBvc2l0aW9uIDwgbGFzdE5vZGUuZ2V0RW5kUG9zaXRpb24oKSkgeworCQl0aGlzLmZJbnNlcnRpb25Qb3NpdGlvbiA9IGdldENsb3NlQm9keVBvc2l0aW9uKCk7CiAJfQotCWlmIChmSW5zZXJ0aW9uUG9zaXRpb24gPD0gb3BlbkJvZHlFbmQpIHsKLQkJZkluc2VydGlvblBvc2l0aW9uID0gZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKTsKKwlpZiAodGhpcy5mSW5zZXJ0aW9uUG9zaXRpb24gPD0gb3BlbkJvZHlFbmQpIHsKKwkJdGhpcy5mSW5zZXJ0aW9uUG9zaXRpb24gPSBnZXRDbG9zZUJvZHlQb3NpdGlvbigpOwogCX0KIAlzdXBlci5ub3JtYWxpemUoZmluZGVyKTsKIH0KQEAgLTU4OSw3ICs1ODksNyBAQAogCQkvLyB0byB0aGUgZW5kIG9mIHRoZSBlbmNsb3Npbmcgbm9kZQogCQlET01Ob2RlIHBhcmVudCA9IChET01Ob2RlKSBnZXRQYXJlbnQoKTsKIAkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCBpbnN0YW5jZW9mIERPTUNvbXBpbGF0aW9uVW5pdCkgewotCQkJc2V0U291cmNlUmFuZ2VFbmQoZkRvY3VtZW50Lmxlbmd0aCAtIDEpOworCQkJc2V0U291cmNlUmFuZ2VFbmQodGhpcy5mRG9jdW1lbnQubGVuZ3RoIC0gMSk7CiAJCX0gZWxzZSB7CiAJCQkvLyBwYXJlbnQgaXMgYSB0eXBlCiAJCQlzZXRTb3VyY2VSYW5nZUVuZCgoKERPTVR5cGUpcGFyZW50KS5nZXRDbG9zZUJvZHlQb3NpdGlvbigpIC0gMSk7CkBAIC02MDYsMTMgKzYwNiwxMyBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgewogCXN1cGVyLm9mZnNldChvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZDbG9zZUJvZHlSYW5nZSwgb2Zmc2V0KTsKLQlvZmZzZXRSYW5nZShmRXh0ZW5kc1JhbmdlLCBvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZJbXBsZW1lbnRzUmFuZ2UsIG9mZnNldCk7Ci0Jb2Zmc2V0UmFuZ2UoZkludGVyZmFjZXNSYW5nZSwgb2Zmc2V0KTsKLQlvZmZzZXRSYW5nZShmT3BlbkJvZHlSYW5nZSwgb2Zmc2V0KTsKLQlvZmZzZXRSYW5nZShmU3VwZXJjbGFzc1JhbmdlLCBvZmZzZXQpOwotCW9mZnNldFJhbmdlKGZUeXBlUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mQ2xvc2VCb2R5UmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mRXh0ZW5kc1JhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKHRoaXMuZkltcGxlbWVudHNSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZSh0aGlzLmZJbnRlcmZhY2VzUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mT3BlbkJvZHlSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZSh0aGlzLmZTdXBlcmNsYXNzUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UodGhpcy5mVHlwZVJhbmdlLCBvZmZzZXQpOwogfQogLyoqCiAgKiBAc2VlIElET01UeXBlI3NldENsYXNzKGJvb2xlYW4pCkBAIC02MjIsMjMgKzYyMiwyMyBAQAogCWZyYWdtZW50KCk7CiAJc2V0TWFzayhNQVNLX1RZUEVfSVNfQ0xBU1MsIGIpOwogCWlmIChiKSB7Ci0JCWZUeXBlS2V5d29yZD0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmZUeXBlS2V5d29yZD0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAogCX0gZWxzZSB7Ci0JCWZUeXBlS2V5d29yZD0gImludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5mVHlwZUtleXdvcmQ9ICJpbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCiAJCXNldFN1cGVyY2xhc3MobnVsbCk7CiAJfQogfQogLyoqCi0gKiBTZXRzIHRoZSBlbmQgb2YgdGhlIGNsb3NlIGJvZHkgcmFuZ2UgCisgKiBTZXRzIHRoZSBlbmQgb2YgdGhlIGNsb3NlIGJvZHkgcmFuZ2UKICAqLwogdm9pZCBzZXRDbG9zZUJvZHlSYW5nZUVuZChpbnQgZW5kKSB7Ci0JZkNsb3NlQm9keVJhbmdlWzFdID0gZW5kOworCXRoaXMuZkNsb3NlQm9keVJhbmdlWzFdID0gZW5kOwogfQogLyoqCi0gKiBTZXRzIHRoZSBzdGFydCBvZiB0aGUgY2xvc2UgYm9keSByYW5nZSAKKyAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBjbG9zZSBib2R5IHJhbmdlCiAgKi8KIHZvaWQgc2V0Q2xvc2VCb2R5UmFuZ2VTdGFydChpbnQgc3RhcnQpIHsKLQlmQ2xvc2VCb2R5UmFuZ2VbMF0gPSBzdGFydDsKKwl0aGlzLmZDbG9zZUJvZHlSYW5nZVswXSA9IHN0YXJ0OwogfQogLyoqCiAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KQEAgLTY1MSw3ICs2NTEsNyBAQAogICovCiBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKIAlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZWxlbWVudF9udWxsTmFtZSk7IAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVsZW1lbnRfbnVsbE5hbWUpOwogCX0KIAlzdXBlci5zZXROYW1lKG5hbWUpOwogCUVudW1lcmF0aW9uIGNoaWxkcmVuPSBnZXRDaGlsZHJlbigpOwpAQCAtNjYzLDE2ICs2NjMsMTYgQEAKIAl9CiB9CiAvKioKLSAqIFNldHMgdGhlIGVuZCBvZiB0aGUgb3BlbiBib2R5IHJhbmdlIAorICogU2V0cyB0aGUgZW5kIG9mIHRoZSBvcGVuIGJvZHkgcmFuZ2UKICAqLwogdm9pZCBzZXRPcGVuQm9keVJhbmdlRW5kKGludCBlbmQpIHsKLQlmT3BlbkJvZHlSYW5nZVsxXSA9IGVuZDsKKwl0aGlzLmZPcGVuQm9keVJhbmdlWzFdID0gZW5kOwogfQogLyoqCi0gKiBTZXRzIHRoZSBzdGFydCBvZiB0aGUgb3BlbiBib2R5IHJhbmdlIAorICogU2V0cyB0aGUgc3RhcnQgb2YgdGhlIG9wZW4gYm9keSByYW5nZQogICovCiB2b2lkIHNldE9wZW5Cb2R5UmFuZ2VTdGFydChpbnQgc3RhcnQpIHsKLQlmT3BlbkJvZHlSYW5nZVswXSA9IHN0YXJ0OworCXRoaXMuZk9wZW5Cb2R5UmFuZ2VbMF0gPSBzdGFydDsKIH0KIC8qKgogICogQHNlZSBJRE9NVHlwZSNzZXRTdXBlcmNsYXNzKFN0cmluZykKQEAgLTY4MCw3ICs2ODAsNyBAQAogcHVibGljIHZvaWQgc2V0U3VwZXJjbGFzcyhTdHJpbmcgc3VwZXJjbGFzc05hbWUpIHsKIAliZWNvbWVEZXRhaWxlZCgpOwogCWZyYWdtZW50KCk7Ci0JZlN1cGVyY2xhc3M9IHN1cGVyY2xhc3NOYW1lOworCXRoaXMuZlN1cGVyY2xhc3M9IHN1cGVyY2xhc3NOYW1lOwogCXNldE1hc2soTUFTS19UWVBFX0hBU19TVVBFUkNMQVNTLCBzdXBlcmNsYXNzTmFtZSAhPSBudWxsKTsKIH0KIC8qKgpAQCAtNjg5LDEzICs2ODksMTMgQEAKIHB1YmxpYyB2b2lkIHNldFN1cGVySW50ZXJmYWNlcyhTdHJpbmdbXSBuYW1lcykgewogCWJlY29tZURldGFpbGVkKCk7CiAJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbEludGVyZmFjZXMpOyAKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5kb21fbnVsbEludGVyZmFjZXMpOwogCX0KIAlmcmFnbWVudCgpOwotCWZTdXBlckludGVyZmFjZXM9IG5hbWVzOworCXRoaXMuZlN1cGVySW50ZXJmYWNlcz0gbmFtZXM7CiAJaWYgKG5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCWZJbnRlcmZhY2VzPSBudWxsOwotCQlmU3VwZXJJbnRlcmZhY2VzPSBDaGFyT3BlcmF0aW9uLk5PX1NUUklOR1M7CisJCXRoaXMuZkludGVyZmFjZXM9IG51bGw7CisJCXRoaXMuZlN1cGVySW50ZXJmYWNlcz0gQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTOwogCQlzZXRNYXNrKE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUywgZmFsc2UpOwogCX0gZWxzZSB7CiAJCXNldE1hc2soTUFTS19UWVBFX0hBU19JTlRFUkZBQ0VTLCB0cnVlKTsKQEAgLTcwNiwxNCArNzA2LDE0IEBACiAJCQl9CiAJCQlidWZmZXIuYXBwZW5kKG5hbWVzW2ldKTsKIAkJfQotCQlmSW50ZXJmYWNlcyA9IGJ1ZmZlci5nZXRDb250ZW50cygpOworCQl0aGlzLmZJbnRlcmZhY2VzID0gYnVmZmVyLmdldENvbnRlbnRzKCk7CiAJfQogfQogLyoqCiAgKiBTZXRzIHRoZSB0eXBlIGtleXdvcmQKICAqLwogdm9pZCBzZXRUeXBlS2V5d29yZChTdHJpbmcga2V5d29yZCkgewotCWZUeXBlS2V5d29yZCA9IGtleXdvcmQ7CisJdGhpcy5mVHlwZUtleXdvcmQgPSBrZXl3b3JkOwogfQogLyoqCiAgKiBAc2VlIERPTU5vZGUjc2hhcmVDb250ZW50cyhET01Ob2RlKQpAQCAtNzIxLDE3ICs3MjEsMTcgQEAKIHByb3RlY3RlZCB2b2lkIHNoYXJlQ29udGVudHMoRE9NTm9kZSBub2RlKSB7CiAJc3VwZXIuc2hhcmVDb250ZW50cyhub2RlKTsKIAlET01UeXBlIHR5cGU9IChET01UeXBlKW5vZGU7Ci0JZkNsb3NlQm9keVJhbmdlPSByYW5nZUNvcHkodHlwZS5mQ2xvc2VCb2R5UmFuZ2UpOwotCWZFeHRlbmRzUmFuZ2U9IHR5cGUuZkV4dGVuZHNSYW5nZTsKLQlmSW1wbGVtZW50c1JhbmdlPSByYW5nZUNvcHkodHlwZS5mSW1wbGVtZW50c1JhbmdlKTsKLQlmSW50ZXJmYWNlcz0gdHlwZS5mSW50ZXJmYWNlczsKLQlmSW50ZXJmYWNlc1JhbmdlPSByYW5nZUNvcHkodHlwZS5mSW50ZXJmYWNlc1JhbmdlKTsKLQlmT3BlbkJvZHlSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZk9wZW5Cb2R5UmFuZ2UpOwotCWZTdXBlcmNsYXNzPSB0eXBlLmZTdXBlcmNsYXNzOwotCWZTdXBlcmNsYXNzUmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZTdXBlcmNsYXNzUmFuZ2UpOwotCWZTdXBlckludGVyZmFjZXM9IHR5cGUuZlN1cGVySW50ZXJmYWNlczsKLQlmVHlwZUtleXdvcmQ9IHR5cGUuZlR5cGVLZXl3b3JkOwotCWZUeXBlUmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZUeXBlUmFuZ2UpOworCXRoaXMuZkNsb3NlQm9keVJhbmdlPSByYW5nZUNvcHkodHlwZS5mQ2xvc2VCb2R5UmFuZ2UpOworCXRoaXMuZkV4dGVuZHNSYW5nZT0gdHlwZS5mRXh0ZW5kc1JhbmdlOworCXRoaXMuZkltcGxlbWVudHNSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZkltcGxlbWVudHNSYW5nZSk7CisJdGhpcy5mSW50ZXJmYWNlcz0gdHlwZS5mSW50ZXJmYWNlczsKKwl0aGlzLmZJbnRlcmZhY2VzUmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZJbnRlcmZhY2VzUmFuZ2UpOworCXRoaXMuZk9wZW5Cb2R5UmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZPcGVuQm9keVJhbmdlKTsKKwl0aGlzLmZTdXBlcmNsYXNzPSB0eXBlLmZTdXBlcmNsYXNzOworCXRoaXMuZlN1cGVyY2xhc3NSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZlN1cGVyY2xhc3NSYW5nZSk7CisJdGhpcy5mU3VwZXJJbnRlcmZhY2VzPSB0eXBlLmZTdXBlckludGVyZmFjZXM7CisJdGhpcy5mVHlwZUtleXdvcmQ9IHR5cGUuZlR5cGVLZXl3b3JkOworCXRoaXMuZlR5cGVSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZlR5cGVSYW5nZSk7CiB9CiAvKioKICAqIEBzZWUgSURPTU5vZGUjdG9TdHJpbmcoKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2libGluZ0VudW1lcmF0aW9uLmphdmEKaW5kZXggZmY1YjgwMC4uOWNiODY3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL1NpYmxpbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIwLDcgKzIwLDcgQEAKICAqCiAgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbgogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIC8qIHBhY2thZ2UgKi8gY2xhc3MgU2libGluZ0VudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewpAQCAtMzUsMjEgKzM1LDIxIEBACiAgKiBJZiB0aGUgZ2l2ZW4gbm9kZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgZW51bWVyYXRpb24gaXMgZW1wdHkuCiAgKi8KIFNpYmxpbmdFbnVtZXJhdGlvbihJRE9NTm9kZSBjaGlsZCkgewotCWZDdXJyZW50RWxlbWVudD0gY2hpbGQ7CisJdGhpcy5mQ3VycmVudEVsZW1lbnQ9IGNoaWxkOwogfQogLyoqCiAgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbiNoYXNNb3JlRWxlbWVudHMoKQogICovCiBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JcmV0dXJuIGZDdXJyZW50RWxlbWVudCAhPSBudWxsOworCXJldHVybiB0aGlzLmZDdXJyZW50RWxlbWVudCAhPSBudWxsOwogfQogLyoqCiAgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbiNuZXh0RWxlbWVudCgpCiAgKi8KIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JSURPTU5vZGUgY3Vycj0gIGZDdXJyZW50RWxlbWVudDsKKwlJRE9NTm9kZSBjdXJyPSAgdGhpcy5mQ3VycmVudEVsZW1lbnQ7CiAJaWYgKGN1cnIgIT0gbnVsbCkgewotCQlmQ3VycmVudEVsZW1lbnQ9IGZDdXJyZW50RWxlbWVudC5nZXROZXh0Tm9kZSgpOworCQl0aGlzLmZDdXJyZW50RWxlbWVudD0gdGhpcy5mQ3VycmVudEVsZW1lbnQuZ2V0TmV4dE5vZGUoKTsKIAl9CiAJcmV0dXJuIGN1cnI7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL1NpbXBsZURPTUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2ltcGxlRE9NQnVpbGRlci5qYXZhCmluZGV4IGI5MGM1MzAuLmM3ZDdjZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2ltcGxlRE9NQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2ltcGxlRE9NQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDYgKzE4LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwpAQCAtMjUsNyArMjcsNyBAQAogLyoqCiAgKiBBIERPTSBidWlsZGVyIHRoYXQgdXNlcyB0aGUgU291cmNlRWxlbWVudFBhcnNlcgogICogQGRlcHJlY2F0ZWQgVGhlIEpET00gd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGFkZGl0aW9uIGluIDIuMCBvZiB0aGUgbW9yZQotICogcG93ZXJmdWwsIGZpbmUtZ3JhaW5lZCBET00vQVNUIEFQSSBmb3VuZCBpbiB0aGUgCisgKiBwb3dlcmZ1bCwgZmluZS1ncmFpbmVkIERPTS9BU1QgQVBJIGZvdW5kIGluIHRoZQogICogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tIHBhY2thZ2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW1wbGVET01CdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RET01CdWlsZGVyIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgewpAQCAtMzcsMjAgKzM5LDIxIEBACiAJLy8gbm90aGluZyB0byBkbwogfQogCi1wdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdW10gdG9rZW5zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKSB7CitwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHRva2VucywgYm9vbGVhbiBvbkRlbWFuZCwgaW50IG1vZGlmaWVycykgewogCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIGRlY2xhcmF0aW9uRW5kfTsKIAlTdHJpbmcgaW1wb3J0TmFtZSA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKSk7CiAJLyoqIG5hbWUgaXMgc2V0IHRvIGNvbnRhaW4gdGhlICcqJyAqLwogCWlmIChvbkRlbWFuZCkgewogCQlpbXBvcnROYW1lKz0iLioiOyAvLyROT04tTkxTLTEkCiAJfQotCWZOb2RlPSBuZXcgRE9NSW1wb3J0KGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIGltcG9ydE5hbWUsIG9uRGVtYW5kLCBtb2RpZmllcnMpOwotCWFkZENoaWxkKGZOb2RlKTsJCisJdGhpcy5mTm9kZT0gbmV3IERPTUltcG9ydCh0aGlzLmZEb2N1bWVudCwgc291cmNlUmFuZ2UsIGltcG9ydE5hbWUsIG9uRGVtYW5kLCBtb2RpZmllcnMpOworCWFkZENoaWxkKHRoaXMuZk5vZGUpOwogfQotcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBjaGFyW10gbmFtZSkgewotCWludFtdIHNvdXJjZVJhbmdlPSBuZXcgaW50W10ge2RlY2xhcmF0aW9uU3RhcnQsIGRlY2xhcmF0aW9uRW5kfTsKLQlmTm9kZT0gbmV3IERPTVBhY2thZ2UoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcobmFtZSkpOwotCWFkZENoaWxkKGZOb2RlKTsJCitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZT0gbmV3IGludFtdIHtpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kfTsKKwljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpOworCXRoaXMuZk5vZGU9IG5ldyBET01QYWNrYWdlKHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmV3IFN0cmluZyhuYW1lKSk7CisJYWRkQ2hpbGQodGhpcy5mTm9kZSk7CiB9CiAvKioKICAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQpAQCAtNjMsMzEgKzY2LDMxIEBACiAgKi8KIHB1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewogCWluaXRpYWxpemVCdWlsZChjb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JZ2V0UGFyc2VyKEphdmFDb3JlLmdldE9wdGlvbnMoKSkucGFyc2VDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0LCBmYWxzZS8qZGlldCBwYXJzZSovKTsKKwlnZXRQYXJzZXIoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKS5wYXJzZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXQsIGZhbHNlLypkaWV0IHBhcnNlKi8sIG51bGwvKm5vIHByb2dyZXNzKi8pOwogCXJldHVybiBzdXBlci5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0KTsKIH0KIC8qKgogICogQ3JlYXRlcyBhIG5ldyBET01NZXRob2QgYW5kIGluaXppYWxpemVzLgogICovCiBwcm90ZWN0ZWQgdm9pZCBlbnRlckFic3RyYWN0TWV0aG9kKE1ldGhvZEluZm8gbWV0aG9kSW5mbykgewotCQkKKwogCWludFtdIHNvdXJjZVJhbmdlID0ge21ldGhvZEluZm8uZGVjbGFyYXRpb25TdGFydCwgLTF9OyAvLyB3aWxsIGJlIGZpeGVkIHVwIG9uIGV4aXQKIAlpbnRbXSBuYW1lUmFuZ2UgPSB7bWV0aG9kSW5mby5uYW1lU291cmNlU3RhcnQsIG1ldGhvZEluZm8ubmFtZVNvdXJjZUVuZH07Ci0JZk5vZGUgPSBuZXcgRE9NTWV0aG9kKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJPcGVyYXRpb24uY2hhclRvU3RyaW5nKG1ldGhvZEluZm8ubmFtZSksIG5hbWVSYW5nZSwgbWV0aG9kSW5mby5tb2RpZmllcnMsIAorCXRoaXMuZk5vZGUgPSBuZXcgRE9NTWV0aG9kKHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcobWV0aG9kSW5mby5uYW1lKSwgbmFtZVJhbmdlLCBtZXRob2RJbmZvLm1vZGlmaWVycywKIAkJbWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yLCBDaGFyT3BlcmF0aW9uLmNoYXJUb1N0cmluZyhtZXRob2RJbmZvLnJldHVyblR5cGUpLAogCQlDaGFyT3BlcmF0aW9uLmNoYXJBcnJheVRvU3RyaW5nQXJyYXkobWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcyksCi0JCUNoYXJPcGVyYXRpb24uY2hhckFycmF5VG9TdHJpbmdBcnJheShtZXRob2RJbmZvLnBhcmFtZXRlck5hbWVzKSwgCisJCUNoYXJPcGVyYXRpb24uY2hhckFycmF5VG9TdHJpbmdBcnJheShtZXRob2RJbmZvLnBhcmFtZXRlck5hbWVzKSwKIAkJQ2hhck9wZXJhdGlvbi5jaGFyQXJyYXlUb1N0cmluZ0FycmF5KG1ldGhvZEluZm8uZXhjZXB0aW9uVHlwZXMpKTsKLQlhZGRDaGlsZChmTm9kZSk7Ci0JZlN0YWNrLnB1c2goZk5vZGUpOwotCQorCWFkZENoaWxkKHRoaXMuZk5vZGUpOworCXRoaXMuZlN0YWNrLnB1c2godGhpcy5mTm9kZSk7CisKIAkvLyB0eXBlIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCBieSBKRE9NCiB9CiAvKioKICAqLwogcHVibGljIHZvaWQgZW50ZXJDb25zdHJ1Y3RvcihNZXRob2RJbmZvIG1ldGhvZEluZm8pIHsKIAkvKiBzZWUgMUZWSUlRWiAqLwotCVN0cmluZyBuYW1lU3RyaW5nID0gbmV3IFN0cmluZyhmRG9jdW1lbnQsIG1ldGhvZEluZm8ubmFtZVNvdXJjZVN0YXJ0LCBtZXRob2RJbmZvLm5hbWVTb3VyY2VFbmQgLSBtZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCk7CisJU3RyaW5nIG5hbWVTdHJpbmcgPSBuZXcgU3RyaW5nKHRoaXMuZkRvY3VtZW50LCBtZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCwgbWV0aG9kSW5mby5uYW1lU291cmNlRW5kIC0gbWV0aG9kSW5mby5uYW1lU291cmNlU3RhcnQpOwogCWludCBvcGVuUGFyZW5Qb3NpdGlvbiA9IG5hbWVTdHJpbmcuaW5kZXhPZignKCcpOwogCWlmIChvcGVuUGFyZW5Qb3NpdGlvbiA+IC0xKQogCQltZXRob2RJbmZvLm5hbWVTb3VyY2VFbmQgPSBtZXRob2RJbmZvLm5hbWVTb3VyY2VTdGFydCArIG9wZW5QYXJlblBvc2l0aW9uIC0gMTsKQEAgLTEwMSwyMiArMTA0LDIyIEBACiAJaW50W10gc291cmNlUmFuZ2UgPSB7ZmllbGRJbmZvLmRlY2xhcmF0aW9uU3RhcnQsIC0xfTsKIAlpbnRbXSBuYW1lUmFuZ2UgPSB7ZmllbGRJbmZvLm5hbWVTb3VyY2VTdGFydCwgZmllbGRJbmZvLm5hbWVTb3VyY2VFbmR9OwogCWJvb2xlYW4gaXNTZWNvbmRhcnk9IGZhbHNlOwotCWlmIChmTm9kZSBpbnN0YW5jZW9mIERPTUZpZWxkKSB7Ci0JCWlzU2Vjb25kYXJ5ID0gZmllbGRJbmZvLmRlY2xhcmF0aW9uU3RhcnQgPT0gZk5vZGUuZlNvdXJjZVJhbmdlWzBdOworCWlmICh0aGlzLmZOb2RlIGluc3RhbmNlb2YgRE9NRmllbGQpIHsKKwkJaXNTZWNvbmRhcnkgPSBmaWVsZEluZm8uZGVjbGFyYXRpb25TdGFydCA9PSB0aGlzLmZOb2RlLmZTb3VyY2VSYW5nZVswXTsKIAl9Ci0JZk5vZGUgPSBuZXcgRE9NRmllbGQoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcoZmllbGRJbmZvLm5hbWUpLCBuYW1lUmFuZ2UsIAorCXRoaXMuZk5vZGUgPSBuZXcgRE9NRmllbGQodGhpcy5mRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBDaGFyT3BlcmF0aW9uLmNoYXJUb1N0cmluZyhmaWVsZEluZm8ubmFtZSksIG5hbWVSYW5nZSwKIAkJZmllbGRJbmZvLm1vZGlmaWVycywgQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcoZmllbGRJbmZvLnR5cGUpLCBpc1NlY29uZGFyeSk7Ci0JYWRkQ2hpbGQoZk5vZGUpOwotCWZTdGFjay5wdXNoKGZOb2RlKTsKKwlhZGRDaGlsZCh0aGlzLmZOb2RlKTsKKwl0aGlzLmZTdGFjay5wdXNoKHRoaXMuZk5vZGUpOwogfQogLyoqCiAKICAqLwogcHVibGljIHZvaWQgZW50ZXJJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgaW50IG1vZGlmaWVycykgewogCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU291cmNlU3RhcnQsIC0xfTsKLQlmTm9kZSA9IG5ldyBET01Jbml0aWFsaXplcihmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBtb2RpZmllcnMpOwotCWFkZENoaWxkKGZOb2RlKTsKLQlmU3RhY2sucHVzaChmTm9kZSk7CisJdGhpcy5mTm9kZSA9IG5ldyBET01Jbml0aWFsaXplcih0aGlzLmZEb2N1bWVudCwgc291cmNlUmFuZ2UsIG1vZGlmaWVycyk7CisJYWRkQ2hpbGQodGhpcy5mTm9kZSk7CisJdGhpcy5mU3RhY2sucHVzaCh0aGlzLmZOb2RlKTsKIH0KIC8qKgogICovCkBAIC0xMjYsMTQgKzEyOSwxNCBAQAogLyoqCiAgKi8KIHB1YmxpYyB2b2lkIGVudGVyVHlwZShUeXBlSW5mbyB0eXBlSW5mbykgewotCWlmIChmQnVpbGRpbmdUeXBlKSB7CisJaWYgKHRoaXMuZkJ1aWxkaW5nVHlwZSkgewogCQlpbnRbXSBzb3VyY2VSYW5nZSA9IHt0eXBlSW5mby5kZWNsYXJhdGlvblN0YXJ0LCAtMX07IC8vIHdpbGwgYmUgZml4ZWQgaW4gdGhlIGV4aXQKIAkJaW50W10gbmFtZVJhbmdlID0gbmV3IGludFtdIHt0eXBlSW5mby5uYW1lU291cmNlU3RhcnQsIHR5cGVJbmZvLm5hbWVTb3VyY2VFbmR9OwotCQlmTm9kZSA9IG5ldyBET01UeXBlKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIG5ldyBTdHJpbmcodHlwZUluZm8ubmFtZSksIG5hbWVSYW5nZSwKKwkJdGhpcy5mTm9kZSA9IG5ldyBET01UeXBlKHRoaXMuZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmV3IFN0cmluZyh0eXBlSW5mby5uYW1lKSwgbmFtZVJhbmdlLAogCQkJdHlwZUluZm8ubW9kaWZpZXJzLCBDaGFyT3BlcmF0aW9uLmNoYXJBcnJheVRvU3RyaW5nQXJyYXkodHlwZUluZm8uc3VwZXJpbnRlcmZhY2VzKSwgVHlwZURlY2xhcmF0aW9uLmtpbmQodHlwZUluZm8ubW9kaWZpZXJzKSA9PSBUeXBlRGVjbGFyYXRpb24uQ0xBU1NfREVDTCk7IC8vIFRPRE8gKGplcm9tZSkgc2hvdWxkIHBhc3MgaW4ga2luZAotCQlhZGRDaGlsZChmTm9kZSk7Ci0JCWZTdGFjay5wdXNoKGZOb2RlKTsKLQkJCisJCWFkZENoaWxkKHRoaXMuZk5vZGUpOworCQl0aGlzLmZTdGFjay5wdXNoKHRoaXMuZk5vZGUpOworCiAJCS8vIHR5cGUgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkIGJ5IEpET00KIAl9CiB9CkBAIC0xNjMsMTMgKzE2NiwxMyBAQAogICoJCWRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KICAqLwogcHJvdGVjdGVkIHZvaWQgZXhpdE1lbWJlcihpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQlET01NZW1iZXIgbT0gKERPTU1lbWJlcikgZlN0YWNrLnBvcCgpOworCURPTU1lbWJlciBtPSAoRE9NTWVtYmVyKSB0aGlzLmZTdGFjay5wb3AoKTsKIAltLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKLQlmTm9kZSA9IG07CisJdGhpcy5mTm9kZSA9IG07CiB9CiAvKioKICAqLwotcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIGludCBkZWZhdWx0VmFsdWVTdGFydCwgaW50IGRlZmF1bHRWYWx1ZUVuZCkgeworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CiAJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7CiB9CiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQVNUTm9kZUZpbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9BU1ROb2RlRmluZGVyLmphdmEKaW5kZXggZTQzNjRiYS4uNTkzMDBlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9BU1ROb2RlRmluZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9BU1ROb2RlRmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIwLDE0ICsxMjAsMTQgQEAKIAkJCVR5cGVEZWNsYXJhdGlvbiByZXN1bHQ7CiAJCQlpbnQgY291bnQgPSAwOwogCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgewotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQkJCWlmICh0aGlzLnJlc3VsdCAhPSBudWxsKSByZXR1cm4gZmFsc2U7CiAJCQkJaWYgKCh0eXBlRGVjbGFyYXRpb24uYml0cyAmIEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlKSAhPSAwKSB7Ci0JCQkJCWlmIChmaW5kQW5vbnltb3VzICYmICsrY291bnQgPT0gb2NjdXJlbmNlQ291bnQpIHsKLQkJCQkJCXJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbjsKKwkJCQkJaWYgKGZpbmRBbm9ueW1vdXMgJiYgKyt0aGlzLmNvdW50ID09IG9jY3VyZW5jZUNvdW50KSB7CisJCQkJCQl0aGlzLnJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCWlmICghZmluZEFub255bW91cyAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZSwgdHlwZURlY2xhcmF0aW9uLm5hbWUpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0eXBlRGVjbGFyYXRpb247CisJCQkJCQl0aGlzLnJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbjsKIAkJCQkJfQogCQkJCX0KIAkJCQlyZXR1cm4gZmFsc2U7IC8vIHZpc2l0IG9ubHkgb25lIGxldmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fubm90YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbi5qYXZhCmluZGV4IDQ3NTAyMWYuLmU0YzQxZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDE2ICsyMywxNiBAQAogcHVibGljIGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJQW5ub3RhdGlvbiB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQW5ub3RhdGlvbkNvbXBvbmVudFtdIE5PX0VOVFJJRVMgPSBuZXcgSUFubm90YXRpb25Db21wb25lbnRbMF07Ci0JCisKIAlwcml2YXRlIGludCB0eXBlSW5kZXg7CiAJcHJpdmF0ZSBjaGFyW10gdHlwZU5hbWU7CiAJcHJpdmF0ZSBpbnQgY29tcG9uZW50c051bWJlcjsKIAlwcml2YXRlIElBbm5vdGF0aW9uQ29tcG9uZW50W10gY29tcG9uZW50czsKIAlwcml2YXRlIGludCByZWFkT2Zmc2V0OwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIEFubm90YXRpb24uCi0JICogCisJICoKIAkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMKIAkgKiBAcGFyYW0gY29uc3RhbnRQb29sCiAJICogQHBhcmFtIG9mZnNldApAQCAtNDIsNyArNDIsNyBAQAogCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzLAogCQkJSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsCiAJCQlpbnQgb2Zmc2V0KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewotCQkKKwogCQlmaW5hbCBpbnQgaW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOwogCQl0aGlzLnR5cGVJbmRleCA9IGluZGV4OwogCQlpZiAoaW5kZXggIT0gMCkgewpAQCAtNjAsNyArNjAsNyBAQAogCQlpZiAobGVuZ3RoICE9IDApIHsKIAkJCXRoaXMuY29tcG9uZW50cyA9IG5ldyBJQW5ub3RhdGlvbkNvbXBvbmVudFtsZW5ndGhdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUFubm90YXRpb25Db21wb25lbnQgY29tcG9uZW50ID0gbmV3IEFubm90YXRpb25Db21wb25lbnQoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJQW5ub3RhdGlvbkNvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudChjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyB0aGlzLnJlYWRPZmZzZXQpOwogCQkJCXRoaXMuY29tcG9uZW50c1tpXSA9IGNvbXBvbmVudDsKIAkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gY29tcG9uZW50LnNpemVJbkJ5dGVzKCk7CiAJCQl9CkBAIC02OCw3ICs2OCw3IEBACiAJCQl0aGlzLmNvbXBvbmVudHMgPSBOT19FTlRSSUVTOwogCQl9CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQW5ub3RhdGlvbiNnZXRUeXBlSW5kZXgoKQogCSAqLwpAQCAtODcsNyArODcsNyBAQAogCXB1YmxpYyBJQW5ub3RhdGlvbkNvbXBvbmVudFtdIGdldENvbXBvbmVudHMoKSB7CiAJCXJldHVybiB0aGlzLmNvbXBvbmVudHM7CiAJfQotCQorCiAJaW50IHNpemVJbkJ5dGVzKCkgewogCQlyZXR1cm4gdGhpcy5yZWFkT2Zmc2V0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbkNvbXBvbmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uQ29tcG9uZW50LmphdmEKaW5kZXggMzBlZDNjNS4uZjFhOGJkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uQ29tcG9uZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uQ29tcG9uZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMTIgKzIxLDEyIEBACiAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElBbm5vdGF0aW9uQ29tcG9uZW50CiAgKi8KIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQ29tcG9uZW50IGV4dGVuZHMgQ2xhc3NGaWxlU3RydWN0IGltcGxlbWVudHMgSUFubm90YXRpb25Db21wb25lbnQgewotCQorCiAJcHJpdmF0ZSBpbnQgY29tcG9uZW50TmFtZUluZGV4OwogCXByaXZhdGUgY2hhcltdIGNvbXBvbmVudE5hbWU7CiAJcHJpdmF0ZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlIGNvbXBvbmVudFZhbHVlOwogCXByaXZhdGUgaW50IHJlYWRPZmZzZXQ7Ci0JCisKIAlwdWJsaWMgQW5ub3RhdGlvbkNvbXBvbmVudCgKIAkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywKIAkJCUlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLApAQCAtNDEsMTEgKzQxLDExIEBACiAJCQl0aGlzLmNvbXBvbmVudE5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKIAkJfQogCQl0aGlzLnJlYWRPZmZzZXQgPSAyOwotCQlBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgdmFsdWUgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOworCQlBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgdmFsdWUgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHRoaXMucmVhZE9mZnNldCk7CiAJCXRoaXMuY29tcG9uZW50VmFsdWUgPSB2YWx1ZTsKIAkJdGhpcy5yZWFkT2Zmc2V0ICs9IHZhbHVlLnNpemVJbkJ5dGVzKCk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQW5ub3RhdGlvbkNvbXBvbmVudCNnZXRDb21wb25lbnROYW1lSW5kZXgoKQogCSAqLwpAQCAtNjQsNyArNjQsNyBAQAogCXB1YmxpYyBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlIGdldENvbXBvbmVudFZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy5jb21wb25lbnRWYWx1ZTsKIAl9Ci0JCisKIAlpbnQgc2l6ZUluQnl0ZXMoKSB7CiAJCXJldHVybiB0aGlzLnJlYWRPZmZzZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLmphdmEKaW5kZXggNzM1ODgwNi4uZWNhZmY4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fubm90YXRpb25Db21wb25lbnRWYWx1ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogcHVibGljIGNsYXNzIEFubm90YXRpb25Db21wb25lbnRWYWx1ZSBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVbXSBOT19WQUxVRVMgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlWzBdOwotCQorCiAJcHJpdmF0ZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlW10gYW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlczsKIAlwcml2YXRlIElBbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZTsKIAlwcml2YXRlIElDb25zdGFudFBvb2xFbnRyeSBjbGFzc0luZm87CkBAIC0zNyw3ICszNyw3IEBACiAJcHJpdmF0ZSBpbnQgcmVhZE9mZnNldDsKIAlwcml2YXRlIGludCB0YWc7CiAJcHJpdmF0ZSBpbnQgdmFsdWVzTnVtYmVyOwotCQorCiAJcHVibGljIEFubm90YXRpb25Db21wb25lbnRWYWx1ZSgKIAkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywKIAkJCUlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLApAQCAtNTksNyArNTksNyBAQAogCQkJY2FzZSAnUycgOgogCQkJY2FzZSAnWicgOgogCQkJY2FzZSAncycgOgotCQkJCWZpbmFsIGludCBjb25zdGFudEluZGV4ID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CisJCQkJZmluYWwgaW50IGNvbnN0YW50SW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CiAJCQkJdGhpcy5jb25zdGFudFZhbHVlSW5kZXggPSBjb25zdGFudEluZGV4OwogCQkJCWlmIChjb25zdGFudEluZGV4ICE9IDApIHsKIAkJCQkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGNvbnN0YW50SW5kZXgpOwpAQCAtNzgsNyArNzgsNyBAQAogCQkJCXRoaXMucmVhZE9mZnNldCArPSAyOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnZScgOgotCQkJCWludCBpbmRleCA9IHRoaXMudTJBdChjbGFzc0ZpbGVCeXRlcywgdGhpcy5yZWFkT2Zmc2V0LCBvZmZzZXQpOworCQkJCWludCBpbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHRoaXMucmVhZE9mZnNldCwgb2Zmc2V0KTsKIAkJCQl0aGlzLmVudW1Db25zdGFudFR5cGVOYW1lSW5kZXggPSBpbmRleDsKIAkJCQlpZiAoaW5kZXggIT0gMCkgewogCQkJCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkoaW5kZXgpOwpAQCAtODgsNyArODgsNyBAQAogCQkJCQl0aGlzLmVudW1Db25zdGFudFR5cGVOYW1lID0gY29uc3RhbnRQb29sRW50cnkuZ2V0VXRmOFZhbHVlKCk7CiAJCQkJfQogCQkJCXRoaXMucmVhZE9mZnNldCArPSAyOwotCQkJCWluZGV4ID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CisJCQkJaW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CiAJCQkJdGhpcy5lbnVtQ29uc3RhbnROYW1lSW5kZXggPSBpbmRleDsKIAkJCQlpZiAoaW5kZXggIT0gMCkgewogCQkJCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkoaW5kZXgpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCQkJdGhpcy5yZWFkT2Zmc2V0ICs9IDI7CiAJCQkJYnJlYWs7CiAJCQljYXNlICdjJyA6Ci0JCQkJZmluYWwgaW50IGNsYXNzRmlsZUluZGV4ID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CisJCQkJZmluYWwgaW50IGNsYXNzRmlsZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgdGhpcy5yZWFkT2Zmc2V0LCBvZmZzZXQpOwogCQkJCXRoaXMuY2xhc3NGaWxlSW5mb0luZGV4ID0gY2xhc3NGaWxlSW5kZXg7CiAJCQkJaWYgKGNsYXNzRmlsZUluZGV4ICE9IDApIHsKIAkJCQkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGNsYXNzRmlsZUluZGV4KTsKQEAgLTExNywxMyArMTE3LDEzIEBACiAJCQkJdGhpcy5yZWFkT2Zmc2V0ICs9IGFubm90YXRpb24uc2l6ZUluQnl0ZXMoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ1snIDoKLQkJCQlmaW5hbCBpbnQgbnVtYmVyT2ZWYWx1ZXMgPSB0aGlzLnUyQXQoY2xhc3NGaWxlQnl0ZXMsIHRoaXMucmVhZE9mZnNldCwgb2Zmc2V0KTsKKwkJCQlmaW5hbCBpbnQgbnVtYmVyT2ZWYWx1ZXMgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCB0aGlzLnJlYWRPZmZzZXQsIG9mZnNldCk7CiAJCQkJdGhpcy52YWx1ZXNOdW1iZXIgPSBudW1iZXJPZlZhbHVlczsKKwkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gMjsKIAkJCQlpZiAobnVtYmVyT2ZWYWx1ZXMgIT0gMCkgewotCQkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gMjsKIAkJCQkJdGhpcy5hbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVzID0gbmV3IElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVbbnVtYmVyT2ZWYWx1ZXNdOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mVmFsdWVzOyBpKyspIHsKLQkJCQkJCUFubm90YXRpb25Db21wb25lbnRWYWx1ZSB2YWx1ZSA9IG5ldyBBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJCQlBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgdmFsdWUgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHRoaXMucmVhZE9mZnNldCk7CiAJCQkJCQl0aGlzLmFubm90YXRpb25Db21wb25lbnRWYWx1ZXNbaV0gPSB2YWx1ZTsKIAkJCQkJCXRoaXMucmVhZE9mZnNldCArPSB2YWx1ZS5zaXplSW5CeXRlcygpOwogCQkJCQl9CkBAIC0xOTEsNyArMTkxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUFubm90YXRpb25Db21wb25lbnRWYWx1ZSNnZXRFbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4KCkKIAkgKi8KIAlwdWJsaWMgaW50IGdldEVudW1Db25zdGFudFR5cGVOYW1lSW5kZXgoKSB7Ci0JCXJldHVybiBlbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4OworCQlyZXR1cm4gdGhpcy5lbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4OwogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUjZ2V0VGFnKCkKQEAgLTIwNSw3ICsyMDUsNyBAQAogCXB1YmxpYyBpbnQgZ2V0VmFsdWVzTnVtYmVyKCkgewogCQlyZXR1cm4gdGhpcy52YWx1ZXNOdW1iZXI7CiAJfQotCQorCiAJaW50IHNpemVJbkJ5dGVzKCkgewogCQlyZXR1cm4gdGhpcy5yZWFkT2Zmc2V0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUuamF2YQppbmRleCBhZDRjZDc4Li44OTUxNDYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDcgKzE3LDcgQEAKIAogLyoqCiAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUKQEAgLTI1LDcgKzI1LDcgQEAKIAkJCUlBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSB7CiAKIAlwcml2YXRlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgbWVtYmVyVmFsdWU7Ci0JCisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgQW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUuCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCkBAIC00MSw3ICs0MSw3IEBACiAJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CiAJCXRoaXMubWVtYmVyVmFsdWUgPSBuZXcgQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIDYpOwogCX0KLQkKKwogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlI2dldE1lbWJlclZhbHVlKCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQmluZGluZ0tleVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9CaW5kaW5nS2V5UGFyc2VyLmphdmEKaW5kZXggZDAyNDhjZS4uMTI0YWRhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9CaW5kaW5nS2V5UGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9CaW5kaW5nS2V5UGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsOSArMTQsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2lsZGNhcmQ7CiAKIHB1YmxpYyBjbGFzcyBCaW5kaW5nS2V5UGFyc2VyIHsKLQkKKwogCWludCBrZXlTdGFydDsKLQkKKwogCXN0YXRpYyBmaW5hbCBjaGFyIENfVEhST1dOID0gJ3wnOwogCiAJc3RhdGljIGNsYXNzIFNjYW5uZXIgewpAQCAtMzEsMTE0ICszMSwxMjEgQEAKIAkJc3RhdGljIGZpbmFsIGludCBDQVBUVVJFID0gODsKIAkJc3RhdGljIGZpbmFsIGludCBCQVNFX1RZUEUgPSA5OwogCQlzdGF0aWMgZmluYWwgaW50IEVORCA9IDEwOwotCQkKKwogCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gLTE7Ci0JCQorCiAJCWludCBpbmRleCA9IDAsIHN0YXJ0OwogCQljaGFyW10gc291cmNlOwogCQlpbnQgdG9rZW4gPSBTVEFSVDsKLQkKKwogCQlTY2FubmVyKGNoYXJbXSBzb3VyY2UpIHsKIAkJCXRoaXMuc291cmNlID0gc291cmNlOwogCQl9Ci0JCQorCiAJCWNoYXJbXSBnZXRUb2tlblNvdXJjZSgpIHsKIAkJCWludCBsZW5ndGggPSB0aGlzLmluZGV4LXRoaXMuc3RhcnQ7CiAJCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zb3VyY2UsIHRoaXMuc3RhcnQsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KLQkJCisKKwkJYm9vbGVhbiBpc0F0QW5ub3RhdGlvblN0YXJ0KCkgeworCQkJcmV0dXJuCisJCQkJdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAorCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09ICdAJzsKKwkJfQorCiAJCWJvb2xlYW4gaXNBdENhcHR1cmVTdGFydCgpIHsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCXRoaXMuaW5kZXggPCB0aGlzLnNvdXJjZS5sZW5ndGgKIAkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAnISc7CiAJCX0KLQkJCisKIAkJYm9vbGVhbiBpc0F0RmllbGRPck1ldGhvZFN0YXJ0KCkgewotCQkJcmV0dXJuIAorCQkJcmV0dXJuCiAJCQkJdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09ICcuJzsKIAkJfQotCQkKKwogCQlib29sZWFuIGlzQXRMb2NhbFZhcmlhYmxlU3RhcnQoKSB7Ci0JCQlyZXR1cm4gCisJCQlyZXR1cm4KIAkJCQl0aGlzLmluZGV4IDwgdGhpcy5zb3VyY2UubGVuZ3RoCiAJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJyMnOwogCQl9Ci0JCQorCiAJCWJvb2xlYW4gaXNBdE1lbWJlclR5cGVTdGFydCgpIHsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCXRoaXMuaW5kZXggPCB0aGlzLnNvdXJjZS5sZW5ndGgKIAkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJyQnCiAJCQkJCXx8ICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAnLicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleC0xXSA9PSAnPicpKTsKIAkJfQotCQkKKwogCQlib29sZWFuIGlzQXRQYXJhbWV0ZXJzRW5kKCkgewotCQkJcmV0dXJuIAorCQkJcmV0dXJuCiAJCQkJdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAnPic7CiAJCX0KLQkJCisKIAkJYm9vbGVhbiBpc0F0UGFyYW1ldGVyc1N0YXJ0KCkgewogCQkJY2hhciBjdXJyZW50Q2hhcjsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCXRoaXMuaW5kZXggPiAwCiAJCQkJJiYgdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCSYmICgoY3VycmVudENoYXIgPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSkgPT0gJzwnCiAJCQkJCXx8IGN1cnJlbnRDaGFyID09ICclJyk7CiAJCX0KLQkJCisKIAkJYm9vbGVhbiBpc0F0UmF3VHlwZUVuZCgpIHsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCXRoaXMuaW5kZXggPiAwCiAJCQkJJiYgdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09ICc+JzsKIAkJfQotCQkKKwogCQlib29sZWFuIGlzQXRTZWNvbmRhcnlUeXBlU3RhcnQoKSB7Ci0JCQlyZXR1cm4gCisJCQlyZXR1cm4KIAkJCQl0aGlzLmluZGV4IDwgdGhpcy5zb3VyY2UubGVuZ3RoCiAJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJ34nOwogCQl9Ci0JCQorCiAJCWJvb2xlYW4gaXNBdFdpbGRjYXJkU3RhcnQoKSB7Ci0JCQlyZXR1cm4gCisJCQlyZXR1cm4KIAkJCQl0aGlzLmluZGV4IDwgdGhpcy5zb3VyY2UubGVuZ3RoCi0JCQkJJiYgIiorLSIuaW5kZXhPZih0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSkgIT0gLTE7IC8vJE5PTi1OTFMtMSQKKwkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAneyc7ICAgLy8gZS5nIHsxfStMamF2YS9sYW5nL1N0cmluZzsKIAkJfQotCQkKKwogCQlib29sZWFuIGlzQXRUeXBlUGFyYW1ldGVyU3RhcnQoKSB7Ci0JCQlyZXR1cm4gCisJCQlyZXR1cm4KIAkJCQl0aGlzLmluZGV4IDwgdGhpcy5zb3VyY2UubGVuZ3RoCiAJCQkJJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJ1QnOwogCQl9Ci0JCisKIAkJYm9vbGVhbiBpc0F0VHlwZUFyZ3VtZW50U3RhcnQoKSB7CiAJCQlyZXR1cm4gdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiAiTElaVkNEQkZKU1shIi5pbmRleE9mKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdKSAhPSAtMTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQorCiAJCWJvb2xlYW4gaXNBdFRocm93blN0YXJ0KCkgewotCQkJcmV0dXJuIAorCQkJcmV0dXJuCiAJCQkJdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09IENfVEhST1dOOwogCQl9Ci0JCQorCiAJCWJvb2xlYW4gaXNBdFR5cGVWYXJpYWJsZVN0YXJ0KCkgewotCQkJcmV0dXJuIAorCQkJcmV0dXJuCiAJCQkJdGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aAogCQkJCSYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09ICc6JzsKIAkJfQotCQkKKwogCQlib29sZWFuIGlzQXRUeXBlV2l0aENhcHR1cmVTdGFydCgpIHsKLQkJCXJldHVybiAKKwkJCXJldHVybgogCQkJCXRoaXMuaW5kZXggPCB0aGlzLnNvdXJjZS5sZW5ndGgKIAkJCQkmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAnJic7CiAJCX0KLQkJCisKIAkJaW50IG5leHRUb2tlbigpIHsKIAkJCWludCBwcmV2aW91c1Rva2VuRW5kID0gdGhpcy5pbmRleDsKIAkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4OworCQkJaW50IGRvbGxhckluZGV4ID0gLTE7CiAJCQlpbnQgbGVuZ3RoID0gdGhpcy5zb3VyY2UubGVuZ3RoOwogCQkJd2hpbGUgKHRoaXMuaW5kZXggPD0gbGVuZ3RoKSB7CiAJCQkJY2hhciBjdXJyZW50Q2hhciA9IHRoaXMuaW5kZXggPT0gbGVuZ3RoID8gQ2hhcmFjdGVyLk1JTl9WQUxVRSA6IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdOwpAQCAtMTU0LDcgKzE2MSw3IEBACiAJCQkJCWNhc2UgJ1YnOgogCQkJCQljYXNlICdaJzoKIAkJCQkJCS8vIGJhc2UgdHlwZQotCQkJCQkJaWYgKHRoaXMuaW5kZXggPT0gcHJldmlvdXNUb2tlbkVuZCAKKwkJCQkJCWlmICh0aGlzLmluZGV4ID09IHByZXZpb3VzVG9rZW5FbmQKIAkJCQkJCQkJJiYgKHRoaXMuaW5kZXggPT0gMCB8fCB0aGlzLnNvdXJjZVt0aGlzLmluZGV4LTFdICE9ICcuJykpIHsgLy8gY2FzZSBvZiBmaWVsZCBvciBtZXRob2Qgc3RhcnRpbmcgd2l0aCBvbmUgb2YgdGhlIGNoYXJhY3RlciBhYm92ZQogCQkJCQkJCXRoaXMuaW5kZXgrKzsKIAkJCQkJCQl0aGlzLnRva2VuID0gQkFTRV9UWVBFOwpAQCAtMTYzLDI0ICsxNzAsNDEgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlICdMJzoKIAkJCQkJY2FzZSAnVCc6Ci0JCQkJCQlpZiAodGhpcy5pbmRleCA9PSBwcmV2aW91c1Rva2VuRW5kIAorCQkJCQkJaWYgKHRoaXMuaW5kZXggPT0gcHJldmlvdXNUb2tlbkVuZAogCQkJCQkJCQkmJiAodGhpcy5pbmRleCA9PSAwIHx8IHRoaXMuc291cmNlW3RoaXMuaW5kZXgtMV0gIT0gJy4nKSkgeyAvLyBjYXNlIG9mIGZpZWxkIG9yIG1ldGhvZCBzdGFydGluZyB3aXRoIG9uZSBvZiB0aGUgY2hhcmFjdGVyIGFib3ZlCiAJCQkJCQkJdGhpcy5zdGFydCA9IHRoaXMuaW5kZXgrMTsKKwkJCQkJCQlkb2xsYXJJbmRleCA9IC0xOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJzsnOgogCQkJCQkJaWYgKHRoaXMuaW5kZXggPT0gcHJldmlvdXNUb2tlbkVuZCkgewogCQkJCQkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4KzE7CisJCQkJCQkJZG9sbGFySW5kZXggPSAtMTsKIAkJCQkJCQlwcmV2aW91c1Rva2VuRW5kID0gdGhpcy5zdGFydDsKIAkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKGRvbGxhckluZGV4ICE9IC0xKSB0aGlzLmluZGV4ID0gZG9sbGFySW5kZXg7CiAJCQkJCQkJdGhpcy50b2tlbiA9IFRZUEU7CiAJCQkJCQkJcmV0dXJuIHRoaXMudG9rZW47CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSAnJCc6CisJCQkJCQlpZiAodGhpcy5pbmRleCA9PSBwcmV2aW91c1Rva2VuRW5kKSB7CisJCQkJCQkJdGhpcy5zdGFydCA9IHRoaXMuaW5kZXgrMTsKKwkJCQkJCQlkb2xsYXJJbmRleCA9IC0xOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoZG9sbGFySW5kZXggPT0gLTEpIHsKKwkJCQkJCQkJZG9sbGFySW5kZXggPSB0aGlzLmluZGV4OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5pbmRleCA9IGRvbGxhckluZGV4OworCQkJCQkJCXRoaXMudG9rZW4gPSBUWVBFOworCQkJCQkJCXJldHVybiB0aGlzLnRva2VuOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJ34nOgogCQkJCQkJaWYgKHRoaXMuaW5kZXggPT0gcHJldmlvdXNUb2tlbkVuZCkgewogCQkJCQkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4KzE7CisJCQkJCQkJZG9sbGFySW5kZXggPSAtMTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJdGhpcy50b2tlbiA9IFRZUEU7CiAJCQkJCQkJcmV0dXJuIHRoaXMudG9rZW47CkBAIC0xOTAsNyArMjE0LDkgQEAKIAkJCQkJY2FzZSAnJSc6CiAJCQkJCWNhc2UgJzonOgogCQkJCQljYXNlICc+JzoKKwkJCQkJY2FzZSAnQCc6CiAJCQkJCQl0aGlzLnN0YXJ0ID0gdGhpcy5pbmRleCsxOworCQkJCQkJZG9sbGFySW5kZXggPSAtMTsKIAkJCQkJCXByZXZpb3VzVG9rZW5FbmQgPSB0aGlzLnN0YXJ0OwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJ1snOgpAQCAtMjAyLDIyICsyMjgsMjYgQEAKIAkJCQkJCWlmICh0aGlzLnN0YXJ0ID4gMCkgewogCQkJCQkJCXN3aXRjaCAodGhpcy5zb3VyY2VbdGhpcy5zdGFydC0xXSkgewogCQkJCQkJCQljYXNlICcuJzoKLQkJCQkJCQkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLnN0YXJ0LTJdID09ICc+JykKKwkJCQkJCQkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLnN0YXJ0LTJdID09ICc+JykgewogCQkJCQkJCQkJCS8vIGNhc2Ugb2YgbWVtYmVyIHR5cGUgd2hlcmUgZW5jbG9zaW5nIHR5cGUgaXMgcGFyYW1ldGVyaXplZAorCQkJCQkJCQkJCWlmIChkb2xsYXJJbmRleCAhPSAtMSkgdGhpcy5pbmRleCA9IGRvbGxhckluZGV4OwogCQkJCQkJCQkJCXRoaXMudG9rZW4gPSBUWVBFOwotCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQl0aGlzLnRva2VuID0gTUVUSE9EOworCQkJCQkJCQkJfQogCQkJCQkJCQkJcmV0dXJuIHRoaXMudG9rZW47CiAJCQkJCQkJCWRlZmF1bHQ6CiAJCQkJCQkJCQlpZiAodGhpcy5pbmRleCA9PSBwcmV2aW91c1Rva2VuRW5kKSB7CiAJCQkJCQkJCQkJdGhpcy5zdGFydCA9IHRoaXMuaW5kZXgrMTsKKwkJCQkJCQkJCQlkb2xsYXJJbmRleCA9IC0xOwogCQkJCQkJCQkJCXByZXZpb3VzVG9rZW5FbmQgPSB0aGlzLnN0YXJ0OwogCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpZiAoZG9sbGFySW5kZXggIT0gLTEpIHRoaXMuaW5kZXggPSBkb2xsYXJJbmRleDsKIAkJCQkJCQkJCQl0aGlzLnRva2VuID0gVFlQRTsKIAkJCQkJCQkJCQlyZXR1cm4gdGhpcy50b2tlbjsKIAkJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQl9IAorCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJygnOgogCQkJCQkJdGhpcy50b2tlbiA9IE1FVEhPRDsKQEAgLTIyOCwxMSArMjU4LDEzIEBACiAJCQkJCQkJcmV0dXJuIHRoaXMudG9rZW47CiAJCQkJCQl9CiAJCQkJCQl0aGlzLnN0YXJ0ID0gdGhpcy5pbmRleCsxOworCQkJCQkJZG9sbGFySW5kZXggPSAtMTsKIAkJCQkJCXByZXZpb3VzVG9rZW5FbmQgPSB0aGlzLnN0YXJ0OwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJyMnOgogCQkJCQkJaWYgKHRoaXMuaW5kZXggPT0gcHJldmlvdXNUb2tlbkVuZCkgewogCQkJCQkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4KzE7CisJCQkJCQkJZG9sbGFySW5kZXggPSAtMTsKIAkJCQkJCQlwcmV2aW91c1Rva2VuRW5kID0gdGhpcy5zdGFydDsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJdGhpcy50b2tlbiA9IExPQ0FMX1ZBUjsKQEAgLTI3OSw3ICszMTEsNyBAQAogCQkJdGhpcy50b2tlbiA9IEVORDsKIAkJCXJldHVybiB0aGlzLnRva2VuOwogCQl9Ci0JCQorCiAJCXZvaWQgc2tpcE1ldGhvZFNpZ25hdHVyZSgpIHsKIAkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4OwogCQkJaW50IGJyYWtldCA9IDA7CkBAIC0yODcsNiArMzE5LDcgQEAKIAkJCQlzd2l0Y2ggKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdKSB7CiAJCQkJCWNhc2UgJyMnOgogCQkJCQljYXNlICclJzoKKwkJCQkJY2FzZSAnQCc6CiAJCQkJCWNhc2UgQ19USFJPV046CiAJCQkJCQlyZXR1cm47CiAJCQkJCWNhc2UgJzonOgpAQCAtMzA1LDYgKzMzOCwxMiBAQAogCQkJCXRoaXMuaW5kZXgrKzsKIAkJCX0KIAkJfQorCisJCXZvaWQgc2tpcFJhbmsoKSB7CisJCQl0aGlzLnN0YXJ0ID0gdGhpcy5pbmRleDsKKwkJCXdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5zb3VyY2UubGVuZ3RoICYmICIwMTIzNDU2Nzg5Ii5pbmRleE9mKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuaW5kZXgrKzsKKwkJfQogCQkKIAkJdm9pZCBza2lwVGhyb3duU3RhcnQoKSB7CiAJCQl3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSBDX1RIUk9XTikKQEAgLTMxNSwxOCArMzU0LDI5IEBACiAJCQl3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiAodGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJzwnIHx8IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09ICclJykpCiAJCQkJdGhpcy5pbmRleCsrOwogCQl9Ci0JCQorCiAJCXZvaWQgc2tpcFBhcmFtZXRlcnNFbmQoKSB7CiAJCQl3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSAhPSAnPicpCiAJCQkJdGhpcy5pbmRleCsrOwogCQkJdGhpcy5pbmRleCsrOwogCQl9Ci0JCQorCiAJCXZvaWQgc2tpcFR5cGVFbmQoKSB7CiAJCQlpZiAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAnOycpCiAJCQkJdGhpcy5pbmRleCsrOwogCQl9CiAJCQorCQl2b2lkIHNraXBSYW5rU3RhcnQoKSB7CisJCQlpZiAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PSAneycpCisJCQkJdGhpcy5pbmRleCsrOworCQl9CisJCQorCQl2b2lkIHNraXBSYW5rRW5kKCkgeworCQkJaWYgKHRoaXMuaW5kZXggPCB0aGlzLnNvdXJjZS5sZW5ndGggJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT0gJ30nKQorCQkJCXRoaXMuaW5kZXgrKzsKKwkJCXRoaXMuc3RhcnQgPSB0aGlzLmluZGV4OworCQl9CisKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCQlzd2l0Y2ggKHRoaXMudG9rZW4pIHsKQEAgLTM4OSwyNCArNDM5LDMyIEBACiAJCX0KIAl9CiAJcHJpdmF0ZSBib29sZWFuIHBhcnNpbmdQYXVzZWQ7Ci0JCisKIAlwcml2YXRlIFNjYW5uZXIgc2Nhbm5lcjsKLQkKKwogCXByaXZhdGUgYm9vbGVhbiBoYXNUeXBlTmFtZSA9IHRydWU7CisKKwlwcml2YXRlIGJvb2xlYW4gaXNNYWxmb3JtZWQ7CiAJCisJcHJpdmF0ZSBib29sZWFuIGlzUGFyc2luZ1Rocm93bkV4Y2VwdGlvbnMgPSBmYWxzZTsJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjQ1MQorCiAJcHVibGljIEJpbmRpbmdLZXlQYXJzZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIpIHsKIAkJdGhpcygiIik7IC8vJE5PTi1OTFMtMSQKIAkJdGhpcy5zY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CiAJfQotCQorCiAJcHVibGljIEJpbmRpbmdLZXlQYXJzZXIoU3RyaW5nIGtleSkgewogCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcihrZXkudG9DaGFyQXJyYXkoKSk7CiAJfQotCQorCisJcHVibGljIHZvaWQgY29uc3VtZUFubm90YXRpb24oKSB7CisJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZworCX0KKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVBcnJheURpbWVuc2lvbihjaGFyW10gYnJha2V0cykgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lQmFzZVR5cGUoY2hhcltdIGJhc2VUeXBlU2lnKSB7CiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KQEAgLTQxNCw3ICs0NzIsNyBAQAogCXB1YmxpYyB2b2lkIGNvbnN1bWVDYXB0dXJlKGludCBwb3NpdGlvbikgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lRXhjZXB0aW9uKCkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9CkBAIC00MjIsMjcgKzQ4MCwyNyBAQAogCXB1YmxpYyB2b2lkIGNvbnN1bWVGaWVsZChjaGFyW10gZmllbGROYW1lKSB7CiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZCgpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZUxvY2FsVHlwZShjaGFyW10gdW5pcXVlS2V5KSB7CiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxWYXIoY2hhcltdIHZhck5hbWUpIHsKKworCXB1YmxpYyB2b2lkIGNvbnN1bWVMb2NhbFZhcihjaGFyW10gdmFyTmFtZSwgaW50IG9jY3VycmVuY2VDb3VudCkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lTWV0aG9kKGNoYXJbXSBzZWxlY3RvciwgY2hhcltdIHNpZ25hdHVyZSkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lTW9kaWZpZXJzKGNoYXJbXSBtb2RpZmllcnMpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZU5vbkdlbmVyaWNUeXBlKCkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9CkBAIC00NTQsMjMgKzUxMiwyMyBAQAogCXB1YmxpYyB2b2lkIGNvbnN1bWVQYWNrYWdlKGNoYXJbXSBwa2dOYW1lKSB7CiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVQYXJhbWV0ZXJpemVkVHlwZShjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGJvb2xlYW4gaXNSYXcpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVBhcnNlcihCaW5kaW5nS2V5UGFyc2VyIHBhcnNlcikgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lUmF3VHlwZSgpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVNjb3BlKGludCBzY29wZU51bWJlcikgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lU2Vjb25kYXJ5VHlwZShjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQpAQCAtNDg2LDE5ICs1NDQsMTkgQEAKIAlwdWJsaWMgdm9pZCBjb25zdW1lVG9wTGV2ZWxUeXBlKCkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lVHlwZSgpIHsKIAkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVR5cGVQYXJhbWV0ZXIoY2hhcltdIHR5cGVQYXJhbWV0ZXJOYW1lKSB7CiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVUeXBlVmFyaWFibGUoY2hhcltdIHBvc2l0aW9uLCBjaGFyW10gdHlwZVZhcmlhYmxlTmFtZSkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lVHlwZVdpdGhDYXB0dXJlKCkgewogCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKIAl9CkBAIC01MDcsMTAxICs1NjUsMTA4IEBACiAJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwogCX0KIAkKKwlwdWJsaWMgdm9pZCBjb25zdW1lV2lsZGNhcmRSYW5rKGludCByYW5rKSB7CisJCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZworCX0KKwogCS8qCiAJICogUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgdGhpcyBiaW5kaW5nIGtleSB3cmFwcy4KIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5zY2FubmVyLnNvdXJjZSk7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaGFzVHlwZU5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmhhc1R5cGVOYW1lOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIG1hbGZvcm1lZEtleSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCisJCXRoaXMuaXNNYWxmb3JtZWQgPSB0cnVlOwogCX0KLQkKKwogCXB1YmxpYyBCaW5kaW5nS2V5UGFyc2VyIG5ld1BhcnNlcigpIHsKIAkJcmV0dXJuIG5ldyBCaW5kaW5nS2V5UGFyc2VyKHRoaXMpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIHBhcnNlKCkgewogCQlwYXJzZShmYWxzZS8qZG9uJ3QgcGF1c2UgYWZ0ZXIgZnVsbHkgcXVhbGlmaWVkIG5hbWUqLyk7CiAJfQogCiAJcHVibGljIHZvaWQgcGFyc2UoYm9vbGVhbiBwYXVzZUFmdGVyRnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIXRoaXMucGFyc2luZ1BhdXNlZCkgewotCQkJCS8vIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0JCQkJcGFyc2VGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQlwYXJzZVNlY29uZGFyeVR5cGUoKTsKLQkJCQlpZiAocGF1c2VBZnRlckZ1bGx5UXVhbGlmaWVkTmFtZSkgewotCQkJCQl0aGlzLnBhcnNpbmdQYXVzZWQgPSB0cnVlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoYXNUeXBlTmFtZSgpKSB7Ci0JCQkJY29uc3VtZUtleSgpOworCQlpZiAoIXRoaXMucGFyc2luZ1BhdXNlZCkgeworCQkJLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUKKwkJCXBhcnNlRnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCQlwYXJzZVNlY29uZGFyeVR5cGUoKTsKKwkJCWlmIChwYXVzZUFmdGVyRnVsbHlRdWFsaWZpZWROYW1lKSB7CisJCQkJdGhpcy5wYXJzaW5nUGF1c2VkID0gdHJ1ZTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQljb25zdW1lVG9wTGV2ZWxUeXBlKCk7Ci0JCQlwYXJzZUlubmVyVHlwZSgpOwotCQkJCi0JCQlpZiAodGhpcy5zY2FubmVyLmlzQXRQYXJhbWV0ZXJzU3RhcnQoKSkgewotCQkJCXRoaXMuc2Nhbm5lci5za2lwUGFyYW1ldGVyc1N0YXJ0KCk7Ci0JCQkJaWYgKHRoaXMuc2Nhbm5lci5pc0F0VHlwZVBhcmFtZXRlclN0YXJ0KCkpCXsJCQotCQkJCQkvLyBnZW5lcmljIHR5cGUKLQkJCQkJcGFyc2VHZW5lcmljVHlwZSgpOwotCQkJCSAJLy8gc2tpcCAiOz4iCi0JCQkJIAl0aGlzLnNjYW5uZXIuc2tpcFBhcmFtZXRlcnNFbmQoKTsKLQkJCQkJLy8gbG9jYWwgdHlwZSBpbiBnZW5lcmljIHR5cGUKLQkJCQkJcGFyc2VJbm5lclR5cGUoKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc0F0VHlwZUFyZ3VtZW50U3RhcnQoKSkKLQkJCQkJLy8gcGFyYW1ldGVyaXplZCB0eXBlCi0JCQkJCXBhcnNlUGFyYW1ldGVyaXplZFR5cGUobnVsbC8qdG9wIGxldmVsIHR5cGUgb3IgbWVtYmVyIHR5cGUgd2l0aCByYXcgZW5jbG9zaW5nIHR5cGUqLywgZmFsc2UvKm5vIHJhdyovKTsKLQkJCQllbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFJhd1R5cGVFbmQoKSkKLQkJCQkJLy8gcmF3IHR5cGUKLQkJCQkJcGFyc2VSYXdUeXBlKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5vbi1nZW5lcmljIHR5cGUKLQkJCQljb25zdW1lTm9uR2VuZXJpY1R5cGUoKTsKLQkJCX0KLQkJCQotCQkJY29uc3VtZVR5cGUoKTsKLQkJCXRoaXMuc2Nhbm5lci5za2lwVHlwZUVuZCgpOwotCQkJCi0JCQlpZiAodGhpcy5zY2FubmVyLmlzQXRGaWVsZE9yTWV0aG9kU3RhcnQoKSkgewotCQkJCXN3aXRjaCAodGhpcy5zY2FubmVyLm5leHRUb2tlbigpKSB7Ci0JCQkJCWNhc2UgU2Nhbm5lci5GSUVMRDoKLQkJCQkJCXBhcnNlRmllbGQoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBTY2FubmVyLk1FVEhPRDoKLQkJCQkJCXBhcnNlTWV0aG9kKCk7Ci0JCQkJCQlpZiAodGhpcy5zY2FubmVyLmlzQXRMb2NhbFZhcmlhYmxlU3RhcnQoKSkgewotCQkJCQkJCXBhcnNlTG9jYWxWYXJpYWJsZSgpOwotCQkJCQkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFR5cGVWYXJpYWJsZVN0YXJ0KCkpIHsKLQkJCQkJCQlwYXJzZVR5cGVWYXJpYWJsZSgpOwotCQkJCQkJfQotCQkJCSAJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJbWFsZm9ybWVkS2V5KCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFR5cGVWYXJpYWJsZVN0YXJ0KCkpIHsKLQkJCQlwYXJzZVR5cGVWYXJpYWJsZSgpOwotCQkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFdpbGRjYXJkU3RhcnQoKSkgewotCQkJCXBhcnNlV2lsZGNhcmQoKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzQXRUeXBlV2l0aENhcHR1cmVTdGFydCgpKSB7Ci0JCQkJcGFyc2VUeXBlV2l0aENhcHR1cmUoKTsKLQkJCX0KLQkJCQotCQkJY29uc3VtZUtleSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gdGhlIGdpdmVuIGtleSB3YXMgaWxsZWdhbAogCQl9CisJCWlmICghaGFzVHlwZU5hbWUoKSkgeworCQkJY29uc3VtZUtleSgpOworCQkJcmV0dXJuOworCQl9CisJCWNvbnN1bWVUb3BMZXZlbFR5cGUoKTsKKwkJcGFyc2VJbm5lclR5cGUoKTsKKworCQlpZiAodGhpcy5zY2FubmVyLmlzQXRQYXJhbWV0ZXJzU3RhcnQoKSkgeworCQkJdGhpcy5zY2FubmVyLnNraXBQYXJhbWV0ZXJzU3RhcnQoKTsKKwkJCWlmICh0aGlzLnNjYW5uZXIuaXNBdFR5cGVQYXJhbWV0ZXJTdGFydCgpKQl7CisJCQkJLy8gZ2VuZXJpYyB0eXBlCisJCQkJcGFyc2VHZW5lcmljVHlwZSgpOworCQkJIAkvLyBza2lwICI7PiIKKwkJCSAJdGhpcy5zY2FubmVyLnNraXBQYXJhbWV0ZXJzRW5kKCk7CisJCQkJLy8gbG9jYWwgdHlwZSBpbiBnZW5lcmljIHR5cGUKKwkJCQlwYXJzZUlubmVyVHlwZSgpOworCQkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFR5cGVBcmd1bWVudFN0YXJ0KCkpCisJCQkJLy8gcGFyYW1ldGVyaXplZCB0eXBlCisJCQkJcGFyc2VQYXJhbWV0ZXJpemVkVHlwZShudWxsLyp0b3AgbGV2ZWwgdHlwZSBvciBtZW1iZXIgdHlwZSB3aXRoIHJhdyBlbmNsb3NpbmcgdHlwZSovLCBmYWxzZS8qbm8gcmF3Ki8pOworCQkJZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzQXRSYXdUeXBlRW5kKCkpCisJCQkJLy8gcmF3IHR5cGUKKwkJCQlwYXJzZVJhd1R5cGUoKTsKKwkJfSBlbHNlIHsKKwkJCS8vIG5vbi1nZW5lcmljIHR5cGUKKwkJCWNvbnN1bWVOb25HZW5lcmljVHlwZSgpOworCQl9CisKKwkJY29uc3VtZVR5cGUoKTsKKwkJdGhpcy5zY2FubmVyLnNraXBUeXBlRW5kKCk7CisKKwkJaWYgKHRoaXMuc2Nhbm5lci5pc0F0RmllbGRPck1ldGhvZFN0YXJ0KCkpIHsKKwkJCXN3aXRjaCAodGhpcy5zY2FubmVyLm5leHRUb2tlbigpKSB7CisJCQkJY2FzZSBTY2FubmVyLkZJRUxEOgorCQkJCQlwYXJzZUZpZWxkKCk7CisJCQkJCWlmICh0aGlzLnNjYW5uZXIuaXNBdEFubm90YXRpb25TdGFydCgpKSB7CisJCQkJCQlwYXJzZUFubm90YXRpb24oKTsKKwkJCQkJfQorCQkJCQlyZXR1cm47CisJCQkJY2FzZSBTY2FubmVyLk1FVEhPRDoKKwkJCQkJcGFyc2VNZXRob2QoKTsKKwkJCQkJaWYgKHRoaXMuc2Nhbm5lci5pc0F0TG9jYWxWYXJpYWJsZVN0YXJ0KCkpIHsKKwkJCQkJCXBhcnNlTG9jYWxWYXJpYWJsZSgpOworCQkJCQl9IGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc0F0VHlwZVZhcmlhYmxlU3RhcnQoKSkgeworCQkJCQkJcGFyc2VUeXBlVmFyaWFibGUoKTsKKwkJCQkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdEFubm90YXRpb25TdGFydCgpKSB7CisJCQkJCQlwYXJzZUFubm90YXRpb24oKTsKKwkJCQkJfQorCQkJIAkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJbWFsZm9ybWVkS2V5KCk7CisJCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIGlmICghdGhpcy5pc1BhcnNpbmdUaHJvd25FeGNlcHRpb25zICYmIHRoaXMuc2Nhbm5lci5pc0F0VHlwZVZhcmlhYmxlU3RhcnQoKSkgeworCQkJcGFyc2VUeXBlVmFyaWFibGUoKTsKKwkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdFdpbGRjYXJkU3RhcnQoKSkgeworCQkJcGFyc2VXaWxkY2FyZCgpOworCQl9IGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc0F0VHlwZVdpdGhDYXB0dXJlU3RhcnQoKSkgeworCQkJcGFyc2VUeXBlV2l0aENhcHR1cmUoKTsKKwkJfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNBdEFubm90YXRpb25TdGFydCgpKSB7CisJCQlwYXJzZUFubm90YXRpb24oKTsKKwkJfQorCisJCWNvbnN1bWVLZXkoKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VGdWxseVF1YWxpZmllZE5hbWUoKSB7CiAJCWlmICh0aGlzLnNjYW5uZXIuaXNBdENhcHR1cmVTdGFydCgpKSB7CiAJCQlwYXJzZUNhcHR1cmUoKTsKQEAgLTYyMywzOCArNjg4LDM4IEBACiAJCQkJY29uc3VtZUJhc2VUeXBlKHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpKTsKIAkJCQl0aGlzLmhhc1R5cGVOYW1lID0gZmFsc2U7CiAJCQkJYnJlYWs7Ci0JIAkJY2FzZSBTY2FubmVyLkFSUkFZOgotCSAJCQl0aGlzLmtleVN0YXJ0ID0gdGhpcy5zY2FubmVyLnN0YXJ0OwotCSAJCQljb25zdW1lQXJyYXlEaW1lbnNpb24odGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCkpOwotCSAJCQlzd2l0Y2ggKHRoaXMuc2Nhbm5lci5uZXh0VG9rZW4oKSkgewotCSAJCQkJY2FzZSBTY2FubmVyLlRZUEU6Ci0JCSAJCQkJY29uc3VtZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKSk7Ci0JCSAJCQkJYnJlYWs7Ci0JIAkJCQljYXNlIFNjYW5uZXIuQkFTRV9UWVBFOgotCSAJCQkJCWNvbnN1bWVCYXNlVHlwZSh0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKSk7Ci0JIAkJCQkJdGhpcy5oYXNUeXBlTmFtZSA9IGZhbHNlOwotCSAJCQkJCWJyZWFrOwotCSAJCQkJZGVmYXVsdDoKKwkJCWNhc2UgU2Nhbm5lci5BUlJBWToKKwkJCQl0aGlzLmtleVN0YXJ0ID0gdGhpcy5zY2FubmVyLnN0YXJ0OworCQkJCWNvbnN1bWVBcnJheURpbWVuc2lvbih0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKSk7CisJCQkJc3dpdGNoICh0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkpIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRZUEU6CisJCQkJCQljb25zdW1lRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuQkFTRV9UWVBFOgorCQkJCQkJY29uc3VtZUJhc2VUeXBlKHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCXRoaXMuaGFzVHlwZU5hbWUgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgogCQkJCQkJbWFsZm9ybWVkS2V5KCk7CiAJCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkgCQkJbWFsZm9ybWVkS2V5KCk7CisJCQkJbWFsZm9ybWVkS2V5KCk7CiAJCQkJcmV0dXJuOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1ldGVyaXplZE1ldGhvZCgpIHsKIAkJdGhpcy5zY2FubmVyLnNraXBQYXJhbWV0ZXJzU3RhcnQoKTsKLQkJd2hpbGUgKCF0aGlzLnNjYW5uZXIuaXNBdFBhcmFtZXRlcnNFbmQoKSkgeworCQl3aGlsZSAoIXRoaXMuc2Nhbm5lci5pc0F0UGFyYW1ldGVyc0VuZCgpICYmICF0aGlzLmlzTWFsZm9ybWVkKSB7CiAJCQlwYXJzZVR5cGVBcmd1bWVudCgpOwogCQl9CiAJCWNvbnN1bWVQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZCgpOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBwYXJzZUdlbmVyaWNUeXBlKCkgewotCQl3aGlsZSAoIXRoaXMuc2Nhbm5lci5pc0F0UGFyYW1ldGVyc0VuZCgpKSB7CisJCXdoaWxlICghdGhpcy5zY2FubmVyLmlzQXRQYXJhbWV0ZXJzRW5kKCkgJiYgIXRoaXMuaXNNYWxmb3JtZWQpIHsKIAkJCWlmICh0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkgIT0gU2Nhbm5lci5UWVBFKSB7CiAJCQkJbWFsZm9ybWVkS2V5KCk7CiAJCQkJcmV0dXJuOwpAQCAtNjYzLDI5ICs3MjgsMzIgQEAKIAkJCXRoaXMuc2Nhbm5lci5za2lwVHlwZUVuZCgpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlSW5uZXJUeXBlKCkgewogCQlpZiAoIXRoaXMuc2Nhbm5lci5pc0F0TWVtYmVyVHlwZVN0YXJ0KCkgfHwgdGhpcy5zY2FubmVyLm5leHRUb2tlbigpICE9IFNjYW5uZXIuVFlQRSkKIAkJCXJldHVybjsKIAkJY2hhcltdIHR5cGVOYW1lID0gdGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCk7Ci0JIAlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQodHlwZU5hbWVbMF0pKSB7Ci0JIAkJLy8gYW5vbnltb3VzIG9yIGxvY2FsIHR5cGUKLQkgCQlpbnQgbmV4dFRva2VuID0gU2Nhbm5lci5UWVBFOwotCSAJCXdoaWxlICh0aGlzLnNjYW5uZXIuaXNBdE1lbWJlclR5cGVTdGFydCgpKSAKLQkgCQkJbmV4dFRva2VuID0gdGhpcy5zY2FubmVyLm5leHRUb2tlbigpOwotCSAJCXR5cGVOYW1lID0gbmV4dFRva2VuID09IFNjYW5uZXIuRU5EID8gdGhpcy5zY2FubmVyLnNvdXJjZSA6IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodGhpcy5zY2FubmVyLnNvdXJjZSwgdGhpcy5rZXlTdGFydCwgdGhpcy5zY2FubmVyLmluZGV4KzEpOwotCSAJCWNvbnN1bWVMb2NhbFR5cGUodHlwZU5hbWUpOwotCSAJfSBlbHNlIHsKKwkJLy8gTWlnaHQgbm90IGFjdHVhbGx5IGJlIGFuIGlubmVyIHR5cGUgYnV0IGNhbWUgaGVyZSBhcyBhIGNvbnNlcXVlbmNlIG9mICckJyBiZWluZyBwcmVzZW50IGluIHR5cGUgbmFtZQorCQlpZiAodHlwZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdCh0eXBlTmFtZVswXSkpIHsKKwkJCS8vIGFub255bW91cyBvciBsb2NhbCB0eXBlCisJCQlpbnQgbmV4dFRva2VuID0gU2Nhbm5lci5UWVBFOworCQkJd2hpbGUgKHRoaXMuc2Nhbm5lci5pc0F0TWVtYmVyVHlwZVN0YXJ0KCkgJiYgIXRoaXMuaXNNYWxmb3JtZWQpCisJCQkJbmV4dFRva2VuID0gdGhpcy5zY2FubmVyLm5leHRUb2tlbigpOworCQkJdHlwZU5hbWUgPSBuZXh0VG9rZW4gPT0gU2Nhbm5lci5FTkQgPyB0aGlzLnNjYW5uZXIuc291cmNlIDogQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0aGlzLnNjYW5uZXIuc291cmNlLCB0aGlzLmtleVN0YXJ0LCB0aGlzLnNjYW5uZXIuaW5kZXgrMSk7CisJCQljb25zdW1lTG9jYWxUeXBlKHR5cGVOYW1lKTsKKwkJfSBlbHNlIHsKIAkJCWNvbnN1bWVNZW1iZXJUeXBlKHR5cGVOYW1lKTsKIAkJCXBhcnNlSW5uZXJUeXBlKCk7Ci0JIAl9CisJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VMb2NhbFZhcmlhYmxlKCkgewotCSAJaWYgKHRoaXMuc2Nhbm5lci5uZXh0VG9rZW4oKSAhPSBTY2FubmVyLkxPQ0FMX1ZBUikgewotCSAJCW1hbGZvcm1lZEtleSgpOworCQlpZiAodGhpcy5zY2FubmVyLm5leHRUb2tlbigpICE9IFNjYW5uZXIuTE9DQUxfVkFSKSB7CisJCQltYWxmb3JtZWRLZXkoKTsKIAkJCXJldHVybjsKLQkgCX0KKwkJfQogCQljaGFyW10gdmFyTmFtZSA9IHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpOwogCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQodmFyTmFtZVswXSkpIHsKIAkJCWludCBpbmRleCA9IEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyh2YXJOYW1lKSk7CkBAIC02OTYsNjAgKzc2NCw5OCBAQAogCQkJfQogCQkJcGFyc2VMb2NhbFZhcmlhYmxlKCk7CiAJCX0gZWxzZSB7Ci0JCSAJY29uc3VtZUxvY2FsVmFyKHZhck5hbWUpOworCQkJaW50IG9jY3VycmVuY2VDb3VudCA9IDA7CisJCQlpZiAodGhpcy5zY2FubmVyLmlzQXRMb2NhbFZhcmlhYmxlU3RhcnQoKSkgeworCQkJCWlmICh0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkgIT0gU2Nhbm5lci5MT0NBTF9WQVIpIHsKKwkJCQkJbWFsZm9ybWVkS2V5KCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJY2hhcltdIG9jY3VycmVuY2UgPSB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKTsKKwkJCQlvY2N1cnJlbmNlQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcob2NjdXJyZW5jZSkpOworCQkJfQorCQkJY29uc3VtZUxvY2FsVmFyKHZhck5hbWUsIG9jY3VycmVuY2VDb3VudCk7CiAJCX0KLSAJfQotCQorCX0KKwogCXByaXZhdGUgdm9pZCBwYXJzZU1ldGhvZCgpIHsKLQkgCWNoYXJbXSBzZWxlY3RvciA9IHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpOwotCSAJdGhpcy5zY2FubmVyLnNraXBNZXRob2RTaWduYXR1cmUoKTsKLQkgCWNoYXJbXSBzaWduYXR1cmUgPSB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKTsKLQkgCWNvbnN1bWVNZXRob2Qoc2VsZWN0b3IsIHNpZ25hdHVyZSk7Ci0JIAlpZiAodGhpcy5zY2FubmVyLmlzQXRUaHJvd25TdGFydCgpKSB7CisJCWNoYXJbXSBzZWxlY3RvciA9IHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpOworCQl0aGlzLnNjYW5uZXIuc2tpcE1ldGhvZFNpZ25hdHVyZSgpOworCQljaGFyW10gc2lnbmF0dXJlID0gdGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCk7CisJCWNvbnN1bWVNZXRob2Qoc2VsZWN0b3IsIHNpZ25hdHVyZSk7CisJCWlmICh0aGlzLnNjYW5uZXIuaXNBdFRocm93blN0YXJ0KCkpIHsKIAkJCXBhcnNlVGhyb3duRXhjZXB0aW9ucygpOwotCSAJfQorCQl9CiAJCWlmICh0aGlzLnNjYW5uZXIuaXNBdFBhcmFtZXRlcnNTdGFydCgpKQogCQkJcGFyc2VQYXJhbWV0ZXJpemVkTWV0aG9kKCk7CiAJfQotCQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlQW5ub3RhdGlvbigpIHsKKwkJLyoKKwkJICogVGhlIGNhbGwgcGFyc2VyLnBhcnNlKCkgbWlnaHQgaGF2ZSBhIHNpZGUtZWZmZWN0IG9uIHRoZSBjdXJyZW50IHRva2VuIHR5cGUKKwkJICogU2VlIGJ1ZyAyNjQ0NDMKKwkJICovCisJCWludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci50b2tlbjsKKwkJQmluZGluZ0tleVBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoKTsKKwkJcGFyc2VyLnBhcnNlKCk7CisJCWNvbnN1bWVQYXJzZXIocGFyc2VyKTsKKwkJY29uc3VtZUFubm90YXRpb24oKTsKKwkJdGhpcy5pc01hbGZvcm1lZCA9IHBhcnNlci5pc01hbGZvcm1lZDsKKwkJdGhpcy5zY2FubmVyLnRva2VuID0gdG9rZW47CisJfQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlQ2FwdHVyZSgpIHsKIAkJaWYgKHRoaXMuc2Nhbm5lci5uZXh0VG9rZW4oKSAhPSBTY2FubmVyLkNBUFRVUkUpIHJldHVybjsKLQkgCXBhcnNlQ2FwdHVyZVdpbGRjYXJkKCk7CisJCXBhcnNlQ2FwdHVyZVdpbGRjYXJkKCk7CiAJCWlmICh0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkgIT0gU2Nhbm5lci5UWVBFKSB7Ci0JIAkJbWFsZm9ybWVkS2V5KCk7CisJCQltYWxmb3JtZWRLZXkoKTsKIAkJCXJldHVybjsKLQkgCX0KKwkJfQogCQljaGFyW10gcG9zaXRpb25DaGFycyA9IHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpOwogCQlpbnQgcG9zaXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcocG9zaXRpb25DaGFycykpOwogCQljb25zdW1lQ2FwdHVyZShwb3NpdGlvbik7CiAJCXRoaXMuc2Nhbm5lci5za2lwVHlwZUVuZCgpOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBwYXJzZUNhcHR1cmVXaWxkY2FyZCgpIHsKKwkJLyoKKwkJICogVGhlIGNhbGwgcGFyc2VyLnBhcnNlKCkgbWlnaHQgaGF2ZSBhIHNpZGUtZWZmZWN0IG9uIHRoZSBjdXJyZW50IHRva2VuIHR5cGUKKwkJICogU2VlIGJ1ZyAyNjQ0NDMKKwkJICovCisJCWludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci50b2tlbjsKIAkJQmluZGluZ0tleVBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoKTsKIAkJcGFyc2VyLnBhcnNlKCk7CiAJCWNvbnN1bWVQYXJzZXIocGFyc2VyKTsKKwkJdGhpcy5pc01hbGZvcm1lZCA9IHBhcnNlci5pc01hbGZvcm1lZDsKKwkJdGhpcy5zY2FubmVyLnRva2VuID0gdG9rZW47CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlRmllbGQoKSB7CiAJCWNoYXJbXSBmaWVsZE5hbWUgPSB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5Tb3VyY2UoKTsKIAkJcGFyc2VSZXR1cm5UeXBlKCk7CiAgCQljb25zdW1lRmllbGQoZmllbGROYW1lKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VUaHJvd25FeGNlcHRpb25zKCkgewotCQl3aGlsZSAodGhpcy5zY2FubmVyLmlzQXRUaHJvd25TdGFydCgpKSB7CisJCS8qCisJCSAqIFRoZSBjYWxsIHBhcnNlci5wYXJzZSgpIG1pZ2h0IGhhdmUgYSBzaWRlLWVmZmVjdCBvbiB0aGUgY3VycmVudCB0b2tlbiB0eXBlCisJCSAqIFNlZSBidWcgMjY0NDQzCisJCSAqLworCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIudG9rZW47CisJCXdoaWxlICh0aGlzLnNjYW5uZXIuaXNBdFRocm93blN0YXJ0KCkgJiYgIXRoaXMuaXNNYWxmb3JtZWQpIHsKIAkJCXRoaXMuc2Nhbm5lci5za2lwVGhyb3duU3RhcnQoKTsKIAkJCUJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCk7CisJCQlwYXJzZXIuaXNQYXJzaW5nVGhyb3duRXhjZXB0aW9ucyA9IHRydWU7CiAJCQlwYXJzZXIucGFyc2UoKTsKIAkJCWNvbnN1bWVQYXJzZXIocGFyc2VyKTsKIAkJCWNvbnN1bWVFeGNlcHRpb24oKTsKKwkJCXRoaXMuaXNNYWxmb3JtZWQgPSBwYXJzZXIuaXNNYWxmb3JtZWQ7CiAJCX0KKwkJdGhpcy5zY2FubmVyLnRva2VuID0gdG9rZW47CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlUGFyYW1ldGVyaXplZFR5cGUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmF3KSB7CiAJCWlmICghaXNSYXcpIHsKLQkJCXdoaWxlICghdGhpcy5zY2FubmVyLmlzQXRQYXJhbWV0ZXJzRW5kKCkpIHsKKwkJCXdoaWxlICghdGhpcy5zY2FubmVyLmlzQXRQYXJhbWV0ZXJzRW5kKCkgJiYgIXRoaXMuaXNNYWxmb3JtZWQpIHsKIAkJCQlwYXJzZVR5cGVBcmd1bWVudCgpOwogCQkJfQogCQl9CkBAIC03NjYsNyArODcyLDcgQEAKIAkJCQljb25zdW1lUGFyYW1ldGVyaXplZFR5cGUodHlwZU5hbWUsIHRydWUvKnJhdyovKTsKIAkgCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VSYXdUeXBlKCkgewogCQl0aGlzLnNjYW5uZXIuc2tpcFBhcmFtZXRlcnNFbmQoKTsKIAkJY29uc3VtZVJhd1R5cGUoKTsKQEAgLTc4MCwzMiArODg2LDU0IEBACiAJCQkJY29uc3VtZVBhcmFtZXRlcml6ZWRUeXBlKHR5cGVOYW1lLCB0cnVlLypyYXcqLyk7CiAJIAl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIHBhcnNlUmV0dXJuVHlwZSgpIHsKKwkJdGhpcy5zY2FubmVyLmluZGV4Kys7IC8vIHNraXAgJyknCisJCS8qCisJCSAqIFRoZSBjYWxsIHBhcnNlci5wYXJzZSgpIG1pZ2h0IGhhdmUgYSBzaWRlLWVmZmVjdCBvbiB0aGUgY3VycmVudCB0b2tlbiB0eXBlCisJCSAqIFNlZSBidWcgMjY0NDQzCisJCSAqLworCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIudG9rZW47CiAJCUJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCk7CiAJCXBhcnNlci5wYXJzZSgpOwogCQljb25zdW1lUGFyc2VyKHBhcnNlcik7CisJCXRoaXMuaXNNYWxmb3JtZWQgPSBwYXJzZXIuaXNNYWxmb3JtZWQ7CisJCXRoaXMuc2Nhbm5lci50b2tlbiA9IHRva2VuOwogCX0KIAogCXByaXZhdGUgdm9pZCBwYXJzZVNlY29uZGFyeVR5cGUoKSB7CiAJCWlmICghdGhpcy5zY2FubmVyLmlzQXRTZWNvbmRhcnlUeXBlU3RhcnQoKSB8fCB0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkgIT0gU2Nhbm5lci5UWVBFKSByZXR1cm47CiAJCWNvbnN1bWVTZWNvbmRhcnlUeXBlKHRoaXMuc2Nhbm5lci5nZXRUb2tlblNvdXJjZSgpKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VUeXBlQXJndW1lbnQoKSB7CisJCS8qCisJCSAqIFRoZSBjYWxsIHBhcnNlci5wYXJzZSgpIG1pZ2h0IGhhdmUgYSBzaWRlLWVmZmVjdCBvbiB0aGUgY3VycmVudCB0b2tlbiB0eXBlCisJCSAqIFNlZSBidWcgMjY0NDQzCisJCSAqLworCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIudG9rZW47CiAJCUJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCk7CiAJCXBhcnNlci5wYXJzZSgpOwogCQljb25zdW1lUGFyc2VyKHBhcnNlcik7CisJCXRoaXMuaXNNYWxmb3JtZWQgPSBwYXJzZXIuaXNNYWxmb3JtZWQ7CisJCXRoaXMuc2Nhbm5lci50b2tlbiA9IHRva2VuOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBwYXJzZVR5cGVXaXRoQ2FwdHVyZSgpIHsKIAkJaWYgKHRoaXMuc2Nhbm5lci5uZXh0VG9rZW4oKSAhPSBTY2FubmVyLkNBUFRVUkUpIHJldHVybjsKKwkJLyoKKwkJICogVGhlIGNhbGwgcGFyc2VyLnBhcnNlKCkgbWlnaHQgaGF2ZSBhIHNpZGUtZWZmZWN0IG9uIHRoZSBjdXJyZW50IHRva2VuIHR5cGUKKwkJICogU2VlIGJ1ZyAyNjQ0NDMKKwkJICovCisJCWludCB0b2tlbiA9IHRoaXMuc2Nhbm5lci50b2tlbjsKIAkJQmluZGluZ0tleVBhcnNlciBwYXJzZXIgPSBuZXdQYXJzZXIoKTsKIAkJcGFyc2VyLnBhcnNlKCk7CiAJCWNvbnN1bWVQYXJzZXIocGFyc2VyKTsKIAkJY29uc3VtZVR5cGVXaXRoQ2FwdHVyZSgpOworCQl0aGlzLmlzTWFsZm9ybWVkID0gcGFyc2VyLmlzTWFsZm9ybWVkOworCQl0aGlzLnNjYW5uZXIudG9rZW4gPSB0b2tlbjsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VUeXBlVmFyaWFibGUoKSB7CiAJCWlmICh0aGlzLnNjYW5uZXIubmV4dFRva2VuKCkgIT0gU2Nhbm5lci5UWVBFKSB7CiAJCQltYWxmb3JtZWRLZXkoKTsKQEAgLTgyNCwzOSArOTUyLDU1IEBACiAJCWNvbnN1bWVUeXBlVmFyaWFibGUocG9zaXRpb24sIHR5cGVWYXJpYWJsZU5hbWUpOwogCQl0aGlzLnNjYW5uZXIuc2tpcFR5cGVFbmQoKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgcGFyc2VXaWxkY2FyZCgpIHsKKwkJcGFyc2VXaWxkY2FyZFJhbmsoKTsKIAkJaWYgKHRoaXMuc2Nhbm5lci5uZXh0VG9rZW4oKSAhPSBTY2FubmVyLldJTERDQVJEKSByZXR1cm47Ci0JIAljaGFyW10gc291cmNlID0gdGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCk7Ci0JIAlpZiAoc291cmNlLmxlbmd0aCA9PSAwKSB7Ci0JIAkJbWFsZm9ybWVkS2V5KCk7Ci0JIAkJcmV0dXJuOwotCSAJfQotCSAJaW50IGtpbmQgPSAtMTsKLQkgCXN3aXRjaCAoc291cmNlWzBdKSB7Ci0JCSAJY2FzZSAnKic6Ci0JCSAJCWtpbmQgPSBXaWxkY2FyZC5VTkJPVU5EOwotCQkgCQlicmVhazsKLQkJIAljYXNlICcrJzoKLQkJIAkJa2luZCA9IFdpbGRjYXJkLkVYVEVORFM7Ci0JCSAJCWJyZWFrOwotCQkgCWNhc2UgJy0nOgotCQkgCQlraW5kID0gV2lsZGNhcmQuU1VQRVI7Ci0JCSAJCWJyZWFrOwotCSAJfQotCSAJaWYgKGtpbmQgPT0gLTEpIHsKLQkgCQltYWxmb3JtZWRLZXkoKTsKLQkgCQlyZXR1cm47Ci0JIAl9Ci0JIAlpZiAoa2luZCAhPSBXaWxkY2FyZC5VTkJPVU5EKQotCSAJCXBhcnNlV2lsZGNhcmRCb3VuZCgpOwotCSAJY29uc3VtZVdpbGRDYXJkKGtpbmQpOworCQljaGFyW10gc291cmNlID0gdGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCk7CisJCWlmIChzb3VyY2UubGVuZ3RoID09IDApIHsKKwkJCW1hbGZvcm1lZEtleSgpOworCQkJcmV0dXJuOworCQl9CisJCWludCBraW5kID0gLTE7CisJCXN3aXRjaCAoc291cmNlWzBdKSB7CisJCQljYXNlICcqJzoKKwkJCQlraW5kID0gV2lsZGNhcmQuVU5CT1VORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJysnOgorCQkJCWtpbmQgPSBXaWxkY2FyZC5FWFRFTkRTOworCQkJCWJyZWFrOworCQkJY2FzZSAnLSc6CisJCQkJa2luZCA9IFdpbGRjYXJkLlNVUEVSOworCQkJCWJyZWFrOworCQl9CisJCWlmIChraW5kID09IC0xKSB7CisJCQltYWxmb3JtZWRLZXkoKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoa2luZCAhPSBXaWxkY2FyZC5VTkJPVU5EKQorCQkJcGFyc2VXaWxkY2FyZEJvdW5kKCk7CisJCWNvbnN1bWVXaWxkQ2FyZChraW5kKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VXaWxkY2FyZFJhbmsoKSB7CisJCXRoaXMuc2Nhbm5lci5za2lwUmFua1N0YXJ0KCk7CisJCXRoaXMuc2Nhbm5lci5za2lwUmFuaygpOworCQljaGFyW10gc291cmNlID0gdGhpcy5zY2FubmVyLmdldFRva2VuU291cmNlKCk7CisJCWNvbnN1bWVXaWxkY2FyZFJhbmsoSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKHNvdXJjZSkpKTsKKwkJdGhpcy5zY2FubmVyLnNraXBSYW5rRW5kKCk7CiAJfQogCQogCXByaXZhdGUgdm9pZCBwYXJzZVdpbGRjYXJkQm91bmQoKSB7CisJCS8qCisJCSAqIFRoZSBjYWxsIHBhcnNlci5wYXJzZSgpIG1pZ2h0IGhhdmUgYSBzaWRlLWVmZmVjdCBvbiB0aGUgY3VycmVudCB0b2tlbiB0eXBlCisJCSAqIFNlZSBidWcgMjY0NDQzCisJCSAqLworCQlpbnQgdG9rZW4gPSB0aGlzLnNjYW5uZXIudG9rZW47CiAJCUJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyID0gbmV3UGFyc2VyKCk7CiAJCXBhcnNlci5wYXJzZSgpOwogCQljb25zdW1lUGFyc2VyKHBhcnNlcik7CisJCXRoaXMuaXNNYWxmb3JtZWQgPSBwYXJzZXIuaXNNYWxmb3JtZWQ7CisJCXRoaXMuc2Nhbm5lci50b2tlbiA9IHRva2VuOwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9CaW5kaW5nS2V5UmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQmluZGluZ0tleVJlc29sdmVyLmphdmEKaW5kZXggMzJlMTZiYS4uMjIzMGU4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9CaW5kaW5nS2V5UmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0JpbmRpbmdLZXlSZXNvbHZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDYgKzEyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQVNUVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CkBAIC0yNiw4ICsyNyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Bbm5vdGF0aW9uQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmFyeVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DYXB0dXJlQmluZGluZzsKQEAgLTM4LDUzICszOSw1OSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUG9seW1vcnBoaWNNZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmF3VHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuV2lsZGNhcmRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogCiBwdWJsaWMgY2xhc3MgQmluZGluZ0tleVJlc29sdmVyIGV4dGVuZHMgQmluZGluZ0tleVBhcnNlciB7CiAJQ29tcGlsZXIgY29tcGlsZXI7CiAJQmluZGluZyBjb21waWxlckJpbmRpbmc7Ci0JCisKIAljaGFyW11bXSBjb21wb3VuZE5hbWU7CiAJaW50IGRpbWVuc2lvbjsKIAlMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKIAlSZWZlcmVuY2VCaW5kaW5nIGdlbmVyaWNUeXBlOwogCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsKLQkKKwlBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uQmluZGluZzsKKwogCWNoYXJbXSBzZWNvbmRhcnlTaW1wbGVOYW1lOwogCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7CiAJQmxvY2tTY29wZSBzY29wZTsKIAlUeXBlQmluZGluZyB0eXBlQmluZGluZzsKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOwogCUFycmF5TGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlpbnQgcmFuayA9IDA7CiAJCiAJaW50IHdpbGRjYXJkUmFuazsKLQkKKwogCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIG91dGVyTW9zdFBhcnNlZFVuaXQ7Ci0JCi0JcHJpdmF0ZSBCaW5kaW5nS2V5UmVzb2x2ZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIsIENvbXBpbGVyIGNvbXBpbGVyLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgaW50IHdpbGRjYXJkUmFuaywgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gb3V0ZXJNb3N0UGFyc2VkVW5pdCkgeworCisJLyoKKwkgKiBBIGhhc2ggc2V0IG9mIHRoZSBmaWxlIG5hbWVzIG9mIGFscmVhZHkgcmVzb2x2ZWQgdW5pdHMKKwkgKi8KKwlIYXNodGFibGVPZk9iamVjdCByZXNvbHZlZFVuaXRzOworCisJcHJpdmF0ZSBCaW5kaW5nS2V5UmVzb2x2ZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIsIENvbXBpbGVyIGNvbXBpbGVyLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gb3V0ZXJNb3N0UGFyc2VkVW5pdCwgSGFzaHRhYmxlT2ZPYmplY3QgcGFyc2VkVW5pdHMpIHsKIAkJc3VwZXIocGFyc2VyKTsKIAkJdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOwogCQl0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7Ci0JCXRoaXMud2lsZGNhcmRSYW5rID0gd2lsZGNhcmRSYW5rOwogCQl0aGlzLm91dGVyTW9zdFBhcnNlZFVuaXQgPSBvdXRlck1vc3RQYXJzZWRVbml0OwotCX0KLQkKLQlwdWJsaWMgQmluZGluZ0tleVJlc29sdmVyKFN0cmluZyBrZXkpIHsKLQkJdGhpcyhrZXksIG51bGwsIG51bGwpOworCQl0aGlzLnJlc29sdmVkVW5pdHMgPSBwYXJzZWRVbml0czsKIAl9CiAKIAlwdWJsaWMgQmluZGluZ0tleVJlc29sdmVyKFN0cmluZyBrZXksIENvbXBpbGVyIGNvbXBpbGVyLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogCQlzdXBlcihrZXkpOwogCQl0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CiAJCXRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKKwkJdGhpcy5yZXNvbHZlZFVuaXRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KCk7CiAJfQotCQorCiAJLyoKIAkgKiBJZiBub3QgYWxyZWFkeSBjYWNoZWQsIGNvbXB1dGVzIGFuZCBjYWNoZSB0aGUgY29tcG91bmQgbmFtZSAocGtnIG5hbWUgKyB0b3AgbGV2ZWwgbmFtZSkgb2YgdGhpcyBrZXkuCiAJICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGlmIGtleSBpcyBhIHBrZyBrZXkuCkBAIC05NCwxMSArMTAxLDM0IEBACiAJcHVibGljIGNoYXJbXVtdIGNvbXBvdW5kTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMuY29tcG91bmROYW1lOwogCX0KLQkgCisKKwlwdWJsaWMgdm9pZCBjb25zdW1lQW5ub3RhdGlvbigpIHsKKwkJaW50IHNpemUgPSB0aGlzLnR5cGVzLnNpemUoKTsKKwkJaWYgKHNpemUgPT0gMCkgcmV0dXJuOworCQlCaW5kaW5nIGFubm90YXRpb25UeXBlID0gKChCaW5kaW5nS2V5UmVzb2x2ZXIpIHRoaXMudHlwZXMuZ2V0KHNpemUtMSkpLmNvbXBpbGVyQmluZGluZzsKKwkJQW5ub3RhdGlvbkJpbmRpbmdbXSBhbm5vdGF0aW9uQmluZGluZ3M7CisJCWlmICh0aGlzLmNvbXBpbGVyQmluZGluZyA9PSBudWxsICYmIHRoaXMudHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlhbm5vdGF0aW9uQmluZGluZ3MgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMudHlwZUJpbmRpbmcpLmdldEFubm90YXRpb25zKCk7CisJCX0gZWxzZSBpZiAodGhpcy5jb21waWxlckJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSB7CisJCQlhbm5vdGF0aW9uQmluZGluZ3MgPSAoKE1ldGhvZEJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nKS5nZXRBbm5vdGF0aW9ucygpOworCQl9IGVsc2UgaWYgKHRoaXMuY29tcGlsZXJCaW5kaW5nIGluc3RhbmNlb2YgVmFyaWFibGVCaW5kaW5nKSB7CisJCQlhbm5vdGF0aW9uQmluZGluZ3MgPSAoKFZhcmlhYmxlQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmcpLmdldEFubm90YXRpb25zKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFubm90YXRpb25CaW5kaW5ncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJQW5ub3RhdGlvbkJpbmRpbmcgYmluZGluZyA9IGFubm90YXRpb25CaW5kaW5nc1tpXTsKKwkJCWlmIChiaW5kaW5nLmdldEFubm90YXRpb25UeXBlKCkgPT0gYW5ub3RhdGlvblR5cGUpIHsKKwkJCQl0aGlzLmFubm90YXRpb25CaW5kaW5nID0gYmluZGluZzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVBcnJheURpbWVuc2lvbihjaGFyW10gYnJha2V0cykgewogCQl0aGlzLmRpbWVuc2lvbiA9IGJyYWtldHMubGVuZ3RoOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVCYXNlVHlwZShjaGFyW10gYmFzZVR5cGVTaWcpIHsKIAkJdGhpcy5jb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10ge2dldEtleSgpLnRvQ2hhckFycmF5KCl9OwogCQlUeXBlQmluZGluZyBiYXNlVHlwZUJpbmRpbmcgPSBnZXRCYXNlVHlwZUJpbmRpbmcoYmFzZVR5cGVTaWcpOwpAQCAtMTA2LDcgKzEzNiw3IEBACiAJCQl0aGlzLnR5cGVCaW5kaW5nID0gYmFzZVR5cGVCaW5kaW5nOwogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZUNhcHR1cmUoZmluYWwgaW50IHBvc2l0aW9uKSB7CiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIG91dGVyUGFyc2VkVW5pdCA9IHRoaXMub3V0ZXJNb3N0UGFyc2VkVW5pdCA9PSBudWxsID8gdGhpcy5wYXJzZWRVbml0IDogdGhpcy5vdXRlck1vc3RQYXJzZWRVbml0OwogCQlpZiAob3V0ZXJQYXJzZWRVbml0ID09IG51bGwpIHJldHVybjsKQEAgLTEyNyw2ICsxNTcsMTYgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIEJpbmRpbmcuV0lMRENBUkRfVFlQRToKIAkJCQkJCXJldHVybiBjaGVja1R5cGUoKChXaWxkY2FyZEJpbmRpbmcpIGJpbmRpbmcpLmJvdW5kKTsKKwkJCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgorCQkJCQkJaWYgKGNoZWNrVHlwZSgoKFdpbGRjYXJkQmluZGluZykgYmluZGluZykuYm91bmQpKQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJVHlwZUJpbmRpbmdbXSBvdGhlckJvdW5kcyA9ICgoV2lsZGNhcmRCaW5kaW5nKSBiaW5kaW5nKS5vdGhlckJvdW5kczsKKwkJCQkJCS8vIHBlciBjb25zdHJ1Y3Rpb24sIG90aGVyQm91bmRzIGlzIG5ldmVyIG51bGwKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvdGhlckJvdW5kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCWlmIChjaGVja1R5cGUob3RoZXJCb3VuZHNbaV0pKQorCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOwogCQkJCQljYXNlIEJpbmRpbmcuQVJSQVlfVFlQRToKIAkJCQkJCXJldHVybiBjaGVja1R5cGUoKChBcnJheUJpbmRpbmcpIGJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlKTsKIAkJCQkJY2FzZSBCaW5kaW5nLlRZUEVfUEFSQU1FVEVSOgpAQCAtMTQyLDcgKzE4Miw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTmFtZVJlZmVyZW5jZSBzaW5nbGVOYW1lUmVmZXJlbmNlLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKLQkJCQlpZiAoY2hlY2tUeXBlKHNpbmdsZU5hbWVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlKSkgCisJCQkJaWYgKGNoZWNrVHlwZShzaW5nbGVOYW1lUmVmZXJlbmNlLnJlc29sdmVkVHlwZSkpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQlyZXR1cm4gc3VwZXIudmlzaXQoc2luZ2xlTmFtZVJlZmVyZW5jZSwgYmxvY2tTY29wZSk7CiAJCQl9CkBAIC0xODYsMTIgKzIyNiwxNCBAQAogCQlvdXRlclBhcnNlZFVuaXQudHJhdmVyc2UoY2FwdHVyZUZpbmRlciwgb3V0ZXJQYXJzZWRVbml0LnNjb3BlKTsKIAkJdGhpcy50eXBlQmluZGluZyA9IGNhcHR1cmVGaW5kZXIuY2FwdHVyZTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lRXhjZXB0aW9uKCkgewogCQl0aGlzLnR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwogCX0KIAogCXB1YmxpYyB2b2lkIGNvbnN1bWVGaWVsZChjaGFyW10gZmllbGROYW1lKSB7CisJCWlmICh0aGlzLnR5cGVCaW5kaW5nID09IG51bGwpCisJCQlyZXR1cm47CiAJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9ICgoUmVmZXJlbmNlQmluZGluZykgdGhpcy50eXBlQmluZGluZykuYXZhaWxhYmxlRmllbGRzKCk7IC8vIHJlc2lsaWVuY2UKIAkgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tpXTsKQEAgLTIwNywxMyArMjQ5LDE4IEBACiAJCWlmICh0aGlzLm1ldGhvZEJpbmRpbmcgPT0gbnVsbCkKIAkJCXJldHVybjsKIAkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudHMgPSBnZXRUeXBlQmluZGluZ0FyZ3VtZW50cygpOworCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKKwkJCXRoaXMubWV0aG9kQmluZGluZyA9IG51bGw7CisJCQl0aGlzLmNvbXBpbGVyQmluZGluZyA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KIAkJaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy5tZXRob2RCaW5kaW5nLnR5cGVWYXJpYWJsZXMoKS5sZW5ndGgpCiAJCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmNyZWF0ZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKHRoaXMubWV0aG9kQmluZGluZywgKFJhd1R5cGVCaW5kaW5nKSBudWxsKTsKIAkJZWxzZQogCSAJCXRoaXMubWV0aG9kQmluZGluZyA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2QodGhpcy5tZXRob2RCaW5kaW5nLCBhcmd1bWVudHMpOwogCQl0aGlzLmNvbXBpbGVyQmluZGluZyA9IHRoaXMubWV0aG9kQmluZGluZzsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxUeXBlKGNoYXJbXSB1bmlxdWVLZXkpIHsKICAJCUxvY2FsVHlwZUJpbmRpbmdbXSBsb2NhbFR5cGVCaW5kaW5ncyAgPSB0aGlzLnBhcnNlZFVuaXQubG9jYWxUeXBlczsKICAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRVbml0LmxvY2FsVHlwZUNvdW50OyBpKyspCkBAIC0yMjMsMTMgKzI3MCwxNiBAQAogIAkJCX0KIAl9CiAKLQlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxWYXIoY2hhcltdIHZhck5hbWUpIHsKKwlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxWYXIoY2hhcltdIHZhck5hbWUsIGludCBvY2N1cnJlbmNlQ291bnQpIHsKIAkJaWYgKHRoaXMuc2NvcGUgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMubWV0aG9kQmluZGluZyA9PSBudWxsKQorCQkJCXJldHVybjsKIAkJCXRoaXMuc2NvcGUgPSB0aGlzLm1ldGhvZEJpbmRpbmcuc291cmNlTWV0aG9kKCkuc2NvcGU7CiAJCX0KIAkgCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zY29wZS5sb2NhbEluZGV4OyBpKyspIHsKIAkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gdGhpcy5zY29wZS5sb2NhbHNbaV07Ci0JCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModmFyTmFtZSwgbG9jYWwubmFtZSkpIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhsb2NhbC5uYW1lLCB2YXJOYW1lKQorCQkJCQkmJiBvY2N1cnJlbmNlQ291bnQtLSA9PSAwKSB7CiAJCQkJdGhpcy5tZXRob2RCaW5kaW5nID0gbnVsbDsKIAkJCQl0aGlzLmNvbXBpbGVyQmluZGluZyA9IGxvY2FsOwogCQkJCXJldHVybjsKQEAgLTIzOCw2ICsyODgsOCBAQAogCX0KIAogCXB1YmxpYyB2b2lkIGNvbnN1bWVNZXRob2QoY2hhcltdIHNlbGVjdG9yLCBjaGFyW10gc2lnbmF0dXJlKSB7CisJCWlmICh0aGlzLnR5cGVCaW5kaW5nID09IG51bGwpCisJCQlyZXR1cm47CiAJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnR5cGVCaW5kaW5nKS5hdmFpbGFibGVNZXRob2RzKCk7IC8vIHJlc2lsaWVuY2UKIAkgCWZvciAoaW50IGkgPSAwLCBtZXRob2RMZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1ldGhvZExlbmd0aDsgaSsrKSB7CiAJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CkBAIC0yNTAsMTEgKzMwMiw3NSBAQAogCQkJCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSBtZXRob2Q7CiAJCQkJCXRoaXMuY29tcGlsZXJCaW5kaW5nID0gdGhpcy5tZXRob2RCaW5kaW5nOwogCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIGlmICgobWV0aG9kLnRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Qb2x5bW9ycGhpY1NpZ25hdHVyZSkgIT0gMCkgeworCQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gbnVsbDsKKwkJCQkJY2hhcltdW10gdHlwZVBhcmFtZXRlcnMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoc2lnbmF0dXJlKTsKKwkJCQkJaW50IGxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQlwYXJhbWV0ZXJUeXBlc1tqXSA9IGdldFR5cGUodHlwZVBhcmFtZXRlcnNbal0pOworCQkJCQl9CisJCQkJCVBvbHltb3JwaGljTWV0aG9kQmluZGluZyBwb2x5bW9ycGhpY01ldGhvZCA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlUG9seW1vcnBoaWNNZXRob2QobWV0aG9kLCBwYXJhbWV0ZXJUeXBlcyk7CisJCQkJCXRoaXMubWV0aG9kQmluZGluZyA9IHBvbHltb3JwaGljTWV0aG9kOworCQkJCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LnVwZGF0ZVBvbHltb3JwaGljTWV0aG9kUmV0dXJuVHlwZSgKKwkJCQkJCQlwb2x5bW9ycGhpY01ldGhvZCwKKwkJCQkJCQlnZXRUeXBlKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKHNpZ25hdHVyZSkpKTsKKwkJCQkJdGhpcy5jb21waWxlckJpbmRpbmcgPSB0aGlzLm1ldGhvZEJpbmRpbmc7CisJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CiAJCX0KIAl9Ci0JCisKKwlwcml2YXRlIFR5cGVCaW5kaW5nIGdldFR5cGUoY2hhcltdIHR5cGUpIHsKKwkJVHlwZUJpbmRpbmcgYmluZGluZyA9IG51bGw7CisJCWludCBsZW5ndGggPSB0eXBlLmxlbmd0aDsKKwkJc3dpdGNoKGxlbmd0aCkgeworCQkJY2FzZSAxIDoKKwkJCQlzd2l0Y2ggKHR5cGVbMF0pIHsKKwkJCQkJY2FzZSAnSScgOgorCQkJCQkJYmluZGluZyA9IFR5cGVCaW5kaW5nLklOVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdaJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuQk9PTEVBTjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdWJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuVk9JRDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdDJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuQ0hBUjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdEJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuRE9VQkxFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ0InIDoKKwkJCQkJCWJpbmRpbmcgPSBUeXBlQmluZGluZy5CWVRFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ0YnIDoKKwkJCQkJCWJpbmRpbmcgPSBUeXBlQmluZGluZy5GTE9BVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdKJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuTE9ORzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdTJyA6CisJCQkJCQliaW5kaW5nID0gVHlwZUJpbmRpbmcuU0hPUlQ7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWludCBkaW1lbnNpb25zID0gMDsKKwkJCQlpbnQgc3RhcnQgPSAwOworCQkJCXdoaWxlICh0eXBlW3N0YXJ0XSA9PSAnWycpIHsKKwkJCQkJc3RhcnQrKzsKKwkJCQkJZGltZW5zaW9ucysrOworCQkJCX0KKwkJCQliaW5kaW5nID0gdGhpcy5lbnZpcm9ubWVudC5nZXRUeXBlKENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIHR5cGUsIHN0YXJ0ICsgMSwgbGVuZ3RoIC0gMSkpOworCQkJCWlmIChkaW1lbnNpb25zICE9IDApIHsKKwkJCQkJYmluZGluZyA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlQXJyYXlUeXBlKGJpbmRpbmcsIGRpbWVuc2lvbnMpOworCQkJCX0KKwkJfQorCQlyZXR1cm4gYmluZGluZzsKKwl9CiAJcHVibGljIHZvaWQgY29uc3VtZU1lbWJlclR5cGUoY2hhcltdIHNpbXBsZVR5cGVOYW1lKSB7CiAJCXRoaXMudHlwZUJpbmRpbmcgPSBnZXRUeXBlQmluZGluZyhzaW1wbGVUeXBlTmFtZSk7CiAJfQpAQCAtMjYzLDkgKzM3OSwxNiBAQAogCQl0aGlzLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIHBrZ05hbWUpOwogCQl0aGlzLmNvbXBpbGVyQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyh0aGlzLmNvbXBvdW5kTmFtZSwgbnVsbCwgdGhpcy5lbnZpcm9ubWVudCk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVBhcmFtZXRlcml6ZWRUeXBlKGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgYm9vbGVhbiBpc1JhdykgeworCQlpZiAodGhpcy50eXBlQmluZGluZyA9PSBudWxsKQorCQkJcmV0dXJuOwogCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IGdldFR5cGVCaW5kaW5nQXJndW1lbnRzKCk7CisJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgeworCQkJdGhpcy50eXBlQmluZGluZyA9IG51bGw7CisJCQl0aGlzLmdlbmVyaWNUeXBlID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQogCQlpZiAoc2ltcGxlVHlwZU5hbWUgIT0gbnVsbCkgewogCQkJaWYgKHRoaXMuZ2VuZXJpY1R5cGUgPT0gbnVsbCkgewogCQkJCS8vIHBhcmFtZXRlcml6ZWQgbWVtYmVyIHR5cGUgd2l0aCByYXcgZW5jbG9zaW5nIHR5cGUKQEAgLTI4Myw0MyArNDA2LDQ1IEBACiAJCQkvLyBwYXJhbWV0ZXJpemVkIHRvcCBsZXZlbCB0eXBlIG9yIHBhcmFtZXRlcml6ZWQgbWVtYmVyIHR5cGUgd2l0aCByYXcgZW5jbG9zaW5nIHR5cGUKIAkJCXRoaXMuZ2VuZXJpY1R5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy50eXBlQmluZGluZzsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nID0gdGhpcy5nZW5lcmljVHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQlpZiAoZW5jbG9zaW5nICE9IG51bGwpIGVuY2xvc2luZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmVudmlyb25tZW50LmNvbnZlcnRUb1Jhd1R5cGUoZW5jbG9zaW5nKTsKKwkJCWlmIChlbmNsb3NpbmcgIT0gbnVsbCkgZW5jbG9zaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZShlbmNsb3NpbmcsIGZhbHNlIC8qZG8gbm90IGZvcmNlIGNvbnZlcnNpb24gb2YgZW5jbG9zaW5nIHR5cGVzKi8pOwogCQkJdGhpcy50eXBlQmluZGluZyA9IHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlUGFyYW1ldGVyaXplZFR5cGUodGhpcy5nZW5lcmljVHlwZSwgYXJndW1lbnRzLCBlbmNsb3NpbmcpOwogCQl9CiAJfQotCQorCiAKIAlwdWJsaWMgdm9pZCBjb25zdW1lUGFyc2VyKEJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyKSB7CiAJCXRoaXMudHlwZXMuYWRkKHBhcnNlcik7Ci0JCWlmICgoKEJpbmRpbmdLZXlSZXNvbHZlcikgcGFyc2VyKS5jb21waWxlckJpbmRpbmcgaW5zdGFuY2VvZiBXaWxkY2FyZEJpbmRpbmcpCi0JCQl0aGlzLnJhbmsrKzsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lU2NvcGUoaW50IHNjb3BlTnVtYmVyKSB7CiAJCWlmICh0aGlzLnNjb3BlID09IG51bGwpIHsKKwkJCWlmICh0aGlzLm1ldGhvZEJpbmRpbmcgPT0gbnVsbCkKKwkJCQlyZXR1cm47CiAJCQl0aGlzLnNjb3BlID0gdGhpcy5tZXRob2RCaW5kaW5nLnNvdXJjZU1ldGhvZCgpLnNjb3BlOwogCQl9CiAJCWlmIChzY29wZU51bWJlciA+PSB0aGlzLnNjb3BlLnN1YnNjb3BlQ291bnQpCiAJCQlyZXR1cm47IC8vIG1hbGZvcm1lZCBrZXkKIAkJdGhpcy5zY29wZSA9IChCbG9ja1Njb3BlKSB0aGlzLnNjb3BlLnN1YnNjb3Blc1tzY29wZU51bWJlcl07CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVJhd1R5cGUoKSB7CiAJCWlmICh0aGlzLnR5cGVCaW5kaW5nID09IG51bGwpIHJldHVybjsKLQkJdGhpcy50eXBlQmluZGluZyA9IHRoaXMuZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZSh0aGlzLnR5cGVCaW5kaW5nKTsKKwkJdGhpcy50eXBlQmluZGluZyA9IHRoaXMuZW52aXJvbm1lbnQuY29udmVydFRvUmF3VHlwZSh0aGlzLnR5cGVCaW5kaW5nLCBmYWxzZSAvKmRvIG5vdCBmb3JjZSBjb252ZXJzaW9uIG9mIGVuY2xvc2luZyB0eXBlcyovKTsKIAl9CiAJcHVibGljIHZvaWQgY29uc3VtZVNlY29uZGFyeVR5cGUoY2hhcltdIHNpbXBsZVR5cGVOYW1lKSB7CiAJCXRoaXMuc2Vjb25kYXJ5U2ltcGxlTmFtZSA9IHNpbXBsZVR5cGVOYW1lOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVGdWxseVF1YWxpZmllZE5hbWUoY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSkgewogCQl0aGlzLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIGZ1bGx5UXVhbGlmaWVkTmFtZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVRvcExldmVsVHlwZSgpIHsKKwkJY2hhcltdIGZpbGVOYW1lOwogCQl0aGlzLnBhcnNlZFVuaXQgPSBnZXRDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigpOwotCQlpZiAodGhpcy5wYXJzZWRVbml0ICE9IG51bGwgJiYgdGhpcy5jb21waWxlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbXBpbGVyLnByb2Nlc3ModGhpcy5wYXJzZWRVbml0LCB0aGlzLmNvbXBpbGVyLnRvdGFsVW5pdHMrMSk7IC8vIG5vb3AgaWYgdW5pdCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkCisJCWlmICh0aGlzLnBhcnNlZFVuaXQgIT0gbnVsbCAmJiB0aGlzLmNvbXBpbGVyICE9IG51bGwgJiYgIXRoaXMucmVzb2x2ZWRVbml0cy5jb250YWluc0tleShmaWxlTmFtZSA9IHRoaXMucGFyc2VkVW5pdC5nZXRGaWxlTmFtZSgpKSkgeworCQkJdGhpcy5jb21waWxlci5wcm9jZXNzKHRoaXMucGFyc2VkVW5pdCwgdGhpcy5jb21waWxlci50b3RhbFVuaXRzKzEpOyAvLyB1bml0IGlzIHJlc29sdmVkIG9ubHkgb25jZSB0aGFua3MgdG8gdGhlIHJlc29sdmVkVW5pdHMgcHJvdGVjdGlvbgorCQkJdGhpcy5yZXNvbHZlZFVuaXRzLnB1dChmaWxlTmFtZSwgZmlsZU5hbWUpOwogCQl9CiAJCWlmICh0aGlzLnBhcnNlZFVuaXQgPT0gbnVsbCkgewogCQkJdGhpcy50eXBlQmluZGluZyA9IGdldEJpbmFyeUJpbmRpbmcoKTsKQEAgLTMyOCwyMyArNDUzLDMyIEBACiAJCQl0aGlzLnR5cGVCaW5kaW5nID0gZ2V0VHlwZUJpbmRpbmcodHlwZU5hbWUpOwogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZUtleSgpIHsKIAkJaWYgKHRoaXMudHlwZUJpbmRpbmcgIT0gbnVsbCkgewogCQkJdGhpcy50eXBlQmluZGluZyA9IGdldEFycmF5QmluZGluZyh0aGlzLmRpbWVuc2lvbiwgdGhpcy50eXBlQmluZGluZyk7CiAJCQl0aGlzLmNvbXBpbGVyQmluZGluZyA9IHRoaXMudHlwZUJpbmRpbmc7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lVHlwZVZhcmlhYmxlKGNoYXJbXSBwb3NpdGlvbiwgY2hhcltdIHR5cGVWYXJpYWJsZU5hbWUpIHsKIAkJaWYgKHBvc2l0aW9uLmxlbmd0aCA+IDApIHsKKwkJCWlmICh0aGlzLnR5cGVCaW5kaW5nID09IG51bGwpCisJCQkJcmV0dXJuOwogCQkJaW50IHBvcyA9IEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyhwb3NpdGlvbikpOwogCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMudHlwZUJpbmRpbmcpLmF2YWlsYWJsZU1ldGhvZHMoKTsgLy8gcmVzaWxpZW5jZQogCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCAmJiBwb3MgPCBtZXRob2RzLmxlbmd0aCkgewogCQkJCXRoaXMubWV0aG9kQmluZGluZyA9IG1ldGhvZHNbcG9zXTsKIAkJCX0KIAkJfQotCSAJVHlwZVZhcmlhYmxlQmluZGluZ1tdIHR5cGVWYXJpYWJsZUJpbmRpbmdzID0gdGhpcy5tZXRob2RCaW5kaW5nICE9IG51bGwgPyB0aGlzLm1ldGhvZEJpbmRpbmcudHlwZVZhcmlhYmxlcygpIDogdGhpcy50eXBlQmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJIAlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlQmluZGluZ3M7CisJIAlpZiAodGhpcy5tZXRob2RCaW5kaW5nICE9IG51bGwpIHsKKwkgCQl0eXBlVmFyaWFibGVCaW5kaW5ncyA9IHRoaXMubWV0aG9kQmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJIAl9IGVsc2UgaWYgKHRoaXMudHlwZUJpbmRpbmcgIT0gbnVsbCkgeworCSAJCXR5cGVWYXJpYWJsZUJpbmRpbmdzID0gdGhpcy50eXBlQmluZGluZy50eXBlVmFyaWFibGVzKCk7CisJIAl9IGVsc2UgeworCSAJCXJldHVybjsKKwkgCX0KIAkgCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlVmFyaWFibGVCaW5kaW5ncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJVHlwZVZhcmlhYmxlQmluZGluZyB0eXBlVmFyaWFibGVCaW5kaW5nID0gdHlwZVZhcmlhYmxlQmluZGluZ3NbaV07CiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZVZhcmlhYmxlTmFtZSwgdHlwZVZhcmlhYmxlQmluZGluZy5zb3VyY2VOYW1lKCkpKSB7CkBAIC0zNTMsMjUgKzQ4Nyw0MCBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVR5cGVXaXRoQ2FwdHVyZSgpIHsKIAkJQmluZGluZ0tleVJlc29sdmVyIHJlc29sdmVyID0gKEJpbmRpbmdLZXlSZXNvbHZlcikgdGhpcy50eXBlcy5nZXQoMCk7CiAJCXRoaXMudHlwZUJpbmRpbmcgPShUeXBlQmluZGluZykgcmVzb2x2ZXIuY29tcGlsZXJCaW5kaW5nOwogCX0KKworCXB1YmxpYyB2b2lkIGNvbnN1bWVXaWxkY2FyZFJhbmsoaW50IGFSYW5rKSB7CisJCXRoaXMud2lsZGNhcmRSYW5rID0gYVJhbms7CisJfQogCQogCXB1YmxpYyB2b2lkIGNvbnN1bWVXaWxkQ2FyZChpbnQga2luZCkgewogCQlzd2l0Y2ggKGtpbmQpIHsKIAkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKIAkJCWNhc2UgV2lsZGNhcmQuU1VQRVI6CiAJCQkJQmluZGluZ0tleVJlc29sdmVyIGJvdW5kUmVzb2x2ZXIgPSAoQmluZGluZ0tleVJlc29sdmVyKSB0aGlzLnR5cGVzLmdldCgwKTsKLQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVXaWxkY2FyZCgoUmVmZXJlbmNlQmluZGluZykgdGhpcy50eXBlQmluZGluZywgdGhpcy53aWxkY2FyZFJhbmssIChUeXBlQmluZGluZykgYm91bmRSZXNvbHZlci5jb21waWxlckJpbmRpbmcsIG51bGwgLypubyBleHRyYSBib3VuZCovLCBraW5kKTsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3ODQ3LCBkbyBub3QgYWxsb3cgY3JlYXRpb24gb2YKKwkJCQkvLyBpbnRlcm5hbGx5IGluY29uc2lzdGVudCB3aWxkY2FyZHMgb2YgdGhlIGZvcm0gJz8gc3VwZXIgPG51bGw+JyBvciAnPyBleHRlbmRzIDxudWxsPicKKwkJCQlmaW5hbCBCaW5kaW5nIGJvdW5kQmluZGluZyA9IGJvdW5kUmVzb2x2ZXIuY29tcGlsZXJCaW5kaW5nOworCQkJCWlmIChib3VuZEJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykgeworCQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVXaWxkY2FyZCgoUmVmZXJlbmNlQmluZGluZykgdGhpcy50eXBlQmluZGluZywgdGhpcy53aWxkY2FyZFJhbmssIChUeXBlQmluZGluZykgYm91bmRCaW5kaW5nLCBudWxsIC8qbm8gZXh0cmEgYm91bmQqLywga2luZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy50eXBlQmluZGluZyA9IG51bGw7CisJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBXaWxkY2FyZC5VTkJPVU5EOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmNyZWF0ZVdpbGRjYXJkKChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnR5cGVCaW5kaW5nLCByYW5rKyssIG51bGwvKm5vIGJvdW5kKi8sIG51bGwgLypubyBleHRyYSBib3VuZCovLCBraW5kKTsKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGVXaWxkY2FyZCgoUmVmZXJlbmNlQmluZGluZykgdGhpcy50eXBlQmluZGluZywgdGhpcy53aWxkY2FyZFJhbmssIG51bGwvKm5vIGJvdW5kKi8sIG51bGwgLypubyBleHRyYSBib3VuZCovLCBraW5kKTsKIAkJCQlicmVhazsKIAkJfQogCX0KLQkKKworCXB1YmxpYyBBbm5vdGF0aW9uQmluZGluZyBnZXRBbm5vdGF0aW9uQmluZGluZygpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkJpbmRpbmc7CisJfQorCiAJLyoKIAkgKiBJZiB0aGUgZ2l2ZW4gZGltZW5zaW9uIGlzIGdyZWF0ZXIgdGhhbiAwIHJldHVybnMgYW4gYXJyYXkgYmluZGluZyBmb3IgdGhlIGdpdmVuIHR5cGUgYmluZGluZy4KIAkgKiBPdGhlcndpc2UgcmV0dXJuIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcuCkBAIC0zODIsNyArNTMxLDcgQEAKIAkJaWYgKGRpbSA9PSAwKSByZXR1cm4gYmluZGluZzsKIAkJcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuY3JlYXRlQXJyYXlUeXBlKGJpbmRpbmcsIGRpbSk7CiAJfQotCQorCiAJcHJpdmF0ZSBUeXBlQmluZGluZyBnZXRCYXNlVHlwZUJpbmRpbmcoY2hhcltdIHNpZ25hdHVyZSkgewogCQlzd2l0Y2ggKHNpZ25hdHVyZVswXSkgewogCQkJY2FzZSAnSScgOgpAQCAtNDA5LDcgKzU1OCw3IEBACiAJCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9Ci0JIAorCiAJLyoKIAkgKiBSZXR1cm5zIGEgYmluYXJ5IGJpbmRpbmcgY29ycmVzb25kaW5nIHRvIHRoaXMga2V5J3MgY29tcG91bmQgbmFtZS4KIAkgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLgpAQCAtNDE4LDcgKzU2Nyw3IEBACiAJCWlmICh0aGlzLmNvbXBvdW5kTmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CiAJCXJldHVybiB0aGlzLmVudmlyb25tZW50LmdldFR5cGUodGhpcy5jb21wb3VuZE5hbWUpOwogCX0KLQkgCisKIAkvKgogCSAqIEZpbmRzIHRoZSBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSBpbiB0aGUgZ2l2ZW4gbG9va3VwIGVudmlyb25tZW50LgogCSAqIFJldHVybnMgbnVsbCBpZiBubyBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9uIGNvdWxkIGJlIGZvdW5kLgpAQCAtNDMwLDcgKzU3OSw3IEBACiAJCWlmICh0aGlzLmVudmlyb25tZW50ID09IG51bGwpIHJldHVybiBudWxsOwogCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmVudmlyb25tZW50LmdldFR5cGUobmFtZSk7CiAJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZykpIHsKLQkJCWlmICh0aGlzLnNlY29uZGFyeVNpbXBsZU5hbWUgPT0gbnVsbCkgCisJCQlpZiAodGhpcy5zZWNvbmRhcnlTaW1wbGVOYW1lID09IG51bGwpCiAJCQkJcmV0dXJuIG51bGw7CiAJCQkvLyBjYXNlIG9mIGEgc2Vjb25kYXJ5IHR5cGUgd2l0aCBubyBwcmltYXJ5IHR5cGUgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3MTE1KQogCQkJaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOwpAQCAtNDQxLDExICs1OTAsMTEgQEAKIAkJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlQmluZGluZyA9IChTb3VyY2VUeXBlQmluZGluZykgYmluZGluZzsKLQkJaWYgKHNvdXJjZVR5cGVCaW5kaW5nLnNjb3BlID09IG51bGwpIAorCQlpZiAoc291cmNlVHlwZUJpbmRpbmcuc2NvcGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCQlyZXR1cm4gc291cmNlVHlwZUJpbmRpbmcuc2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0OwogCX0KLQkgCisKIAkvKgogCSAqIFJldHVybnMgdGhlIGNvbXBpbGVyIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGtleS4KIAkgKiBSZXR1cm5zIG51bGwgaXMgbWFsZm9ybWVkLgpAQCAtNDYwLDI3ICs2MDksMjYgQEAKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKLQkJaWYgKHRoaXMudHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBCaW5hcnlUeXBlQmluZGluZykgewotCQkJcmV0dXJuICgoQmluYXJ5VHlwZUJpbmRpbmcpIHRoaXMudHlwZUJpbmRpbmcpLmdldE1lbWJlclR5cGUoc2ltcGxlVHlwZU5hbWUpOwotCQl9IGVsc2UgewotCQkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IAotCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uID09IG51bGwgPyAKLQkJCQkJKHRoaXMucGFyc2VkVW5pdCA9PSBudWxsID8gbnVsbCA6IHRoaXMucGFyc2VkVW5pdC50eXBlcykgOiAKLQkJCQkJdGhpcy50eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXM7Ci0JCQlpZiAodHlwZURlY2xhcmF0aW9ucyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlRGVjbGFyYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uc1tpXTsKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2ltcGxlVHlwZU5hbWUsIGRlY2xhcmF0aW9uLm5hbWUpKSB7Ci0JCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCQkJCXJldHVybiBkZWNsYXJhdGlvbi5iaW5kaW5nOwotCQkJCX0KKwkJaWYgKHRoaXMudHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlyZXR1cm4gKChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnR5cGVCaW5kaW5nKS5nZXRNZW1iZXJUeXBlKHNpbXBsZVR5cGVOYW1lKTsKKwkJfQorCQlUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zID0KKwkJCXRoaXMudHlwZURlY2xhcmF0aW9uID09IG51bGwgPworCQkJCSh0aGlzLnBhcnNlZFVuaXQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnBhcnNlZFVuaXQudHlwZXMpIDoKKwkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlczsKKwkJaWYgKHR5cGVEZWNsYXJhdGlvbnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlRGVjbGFyYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb25zW2ldOworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNpbXBsZVR5cGVOYW1lLCBkZWNsYXJhdGlvbi5uYW1lKSkgeworCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CisJCQkJcmV0dXJuIGRlY2xhcmF0aW9uLmJpbmRpbmc7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCiAJcHJpdmF0ZSBUeXBlQmluZGluZ1tdIGdldFR5cGVCaW5kaW5nQXJndW1lbnRzKCkgewogCQlpbnQgc2l6ZSA9IHRoaXMudHlwZXMuc2l6ZSgpOwogCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50cyA9IG5ldyBUeXBlQmluZGluZ1tzaXplXTsKQEAgLTQ4OCwyMiArNjM2LDIzIEBACiAJCQlCaW5kaW5nS2V5UmVzb2x2ZXIgcmVzb2x2ZXIgPSAoQmluZGluZ0tleVJlc29sdmVyKSB0aGlzLnR5cGVzLmdldChpKTsKIAkJCVR5cGVCaW5kaW5nIGNvbXBpbGVyQmluZGluZzIgPSAoVHlwZUJpbmRpbmcpIHJlc29sdmVyLmNvbXBpbGVyQmluZGluZzsKIAkJCWlmIChjb21waWxlckJpbmRpbmcyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkJdGhpcy50eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJCWFyZ3VtZW50c1tpXSA9IGNvbXBpbGVyQmluZGluZzI7CiAJCX0KIAkJdGhpcy50eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJcmV0dXJuIGFyZ3VtZW50czsKIAl9Ci0JIAorCiAJcHVibGljIHZvaWQgbWFsZm9ybWVkS2V5KCkgewogCQl0aGlzLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwogCX0KLQkKKwogCXB1YmxpYyBCaW5kaW5nS2V5UGFyc2VyIG5ld1BhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBCaW5kaW5nS2V5UmVzb2x2ZXIodGhpcywgdGhpcy5jb21waWxlciwgdGhpcy5lbnZpcm9ubWVudCwgdGhpcy5yYW5rLCB0aGlzLm91dGVyTW9zdFBhcnNlZFVuaXQgPT0gbnVsbCA/IHRoaXMucGFyc2VkVW5pdCA6IHRoaXMub3V0ZXJNb3N0UGFyc2VkVW5pdCk7CisJCXJldHVybiBuZXcgQmluZGluZ0tleVJlc29sdmVyKHRoaXMsIHRoaXMuY29tcGlsZXIsIHRoaXMuZW52aXJvbm1lbnQsIHRoaXMub3V0ZXJNb3N0UGFyc2VkVW5pdCA9PSBudWxsID8gdGhpcy5wYXJzZWRVbml0IDogdGhpcy5vdXRlck1vc3RQYXJzZWRVbml0LCB0aGlzLnJlc29sdmVkVW5pdHMpOwogCX0KLQkgCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gZ2V0S2V5KCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlCdWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5QnVmZmVyLmphdmEKaW5kZXggYWFiMmMzMi4uNWZkZDg1NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlCdWZmZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheUJ1ZmZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMzLDcgKzMzLDcgQEAKIAkgKiBUaGlzIGlzIHRoZSBidWZmZXIgb2YgY2hhciBhcnJheXMgd2hpY2ggbXVzdCBiZSBhcHBlbmRlZCB0b2dldGhlcgogCSAqIGR1cmluZyB0aGUgZ2V0Q29udGVudHMgbWV0aG9kLgogCSAqLwotCXByb3RlY3RlZCBjaGFyW11bXSBmQnVmZmVyOworCXByb3RlY3RlZCBjaGFyW11bXSBidWZmZXI7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZS4KQEAgLTQzLDE5ICs0MywxOSBAQAogCS8qKgogCSAqIFRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgogCSAqLwotCXByb3RlY3RlZCBpbnQgZkVuZDsKKwlwcm90ZWN0ZWQgaW50IGVuZDsKIAogCS8qKgogCSAqIFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGJ1ZmZlci4KIAkgKi8KLQlwcm90ZWN0ZWQgaW50IGZTaXplOworCXByb3RlY3RlZCBpbnQgc2l6ZTsKIAogCS8qKgogCSAqIEEgYnVmZmVyIG9mIHJhbmdlcyB3aGljaCBpcyBtYWludGFpbmVkIGFsb25nIHdpdGgKIAkgKiB0aGUgYnVmZmVyLiAgUmFuZ2VzIGFyZSBvZiB0aGUgZm9ybSB7c3RhcnQsIGxlbmd0aH0uCiAJICogRW5hYmxlcyBhcHBlbmQoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpLgogCSAqLwotCXByb3RlY3RlZCBpbnRbXVtdIGZSYW5nZXM7CisJcHJvdGVjdGVkIGludFtdW10gcmFuZ2VzOwogLyoqCiAgKiBDcmVhdGVzIGEgPGNvZGU+Q2hhckFycmF5QnVmZmVyPC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplICgxMCkuCiAgKi8KQEAgLTc5LDEwICs3OSwxMCBAQAogICogQHBhcmFtIHNpemUgLSB0aGUgYnVmZmVyIHNpemUsIGlmIGxlc3MgdGhhbiAxLCBzZXQgdG8gdGhlIERFRkFVTFRfQlVGRkVSX1NJWkUuCiAgKi8KIHB1YmxpYyBDaGFyQXJyYXlCdWZmZXIoY2hhcltdIGZpcnN0LCBpbnQgc2l6ZSkgewotCWZTaXplID0gKHNpemUgPiAwKSA/IHNpemUgOiBERUZBVUxUX0JVRkZFUl9TSVpFOwotCWZCdWZmZXIgPSBuZXcgY2hhcltmU2l6ZV1bXTsKLQlmUmFuZ2VzID0gbmV3IGludFtmU2l6ZV1bXTsKLQlmRW5kID0gMDsKKwl0aGlzLnNpemUgPSAoc2l6ZSA+IDApID8gc2l6ZSA6IERFRkFVTFRfQlVGRkVSX1NJWkU7CisJdGhpcy5idWZmZXIgPSBuZXcgY2hhclt0aGlzLnNpemVdW107CisJdGhpcy5yYW5nZXMgPSBuZXcgaW50W3RoaXMuc2l6ZV1bXTsKKwl0aGlzLmVuZCA9IDA7CiAJaWYgKGZpcnN0ICE9IG51bGwpCiAJCWFwcGVuZChmaXJzdCwgMCwgZmlyc3QubGVuZ3RoKTsKIH0KQEAgLTEyMiwxNSArMTIyLDE1IEBACiAJCWlmIChsZW5ndGggKyBzdGFydCA+IHNyY0xlbmd0aCkgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogCQkvKiogZG8gbGVuZ3RoIGNoZWNrIGhlcmUgdG8gYWxsb3cgZXhjZXB0aW9ucyB0byBiZSB0aHJvd24gKi8KIAkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCWlmIChmRW5kID09IGZTaXplKSB7Ci0JCQkJaW50IHNpemUyID0gZlNpemUgKiAyOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZkJ1ZmZlciwgMCwgKGZCdWZmZXIgPSBuZXcgY2hhcltzaXplMl1bXSksIDAsIGZTaXplKTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZSYW5nZXMsIDAsIChmUmFuZ2VzID0gbmV3IGludFtzaXplMl1bXSksIDAsIGZTaXplKTsKLQkJCQlmU2l6ZSAqPSAyOworCQkJaWYgKHRoaXMuZW5kID09IHRoaXMuc2l6ZSkgeworCQkJCWludCBzaXplMiA9IHRoaXMuc2l6ZSAqIDI7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmJ1ZmZlciwgMCwgKHRoaXMuYnVmZmVyID0gbmV3IGNoYXJbc2l6ZTJdW10pLCAwLCB0aGlzLnNpemUpOworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5yYW5nZXMsIDAsICh0aGlzLnJhbmdlcyA9IG5ldyBpbnRbc2l6ZTJdW10pLCAwLCB0aGlzLnNpemUpOworCQkJCXRoaXMuc2l6ZSAqPSAyOwogCQkJfQotCQkJZkJ1ZmZlcltmRW5kXSA9IHNyYzsKLQkJCWZSYW5nZXNbZkVuZF0gPSBuZXcgaW50W10ge3N0YXJ0LCBsZW5ndGh9OwotCQkJZkVuZCsrOworCQkJdGhpcy5idWZmZXJbdGhpcy5lbmRdID0gc3JjOworCQkJdGhpcy5yYW5nZXNbdGhpcy5lbmRdID0gbmV3IGludFtdIHtzdGFydCwgbGVuZ3RofTsKKwkJCXRoaXMuZW5kKys7CiAJCX0KIAl9CiAJcmV0dXJuIHRoaXM7CkBAIC0xNjAsMjMgKzE2MCwyMyBAQAogICogY2hhcltdIG9yIG51bGwgaWYgbm90aGluZyBoYXMgYmVlbiBwdXQgaW4gdGhlIGJ1ZmZlci4KICAqLwogcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKLQlpZiAoZkVuZCA9PSAwKQorCWlmICh0aGlzLmVuZCA9PSAwKQogCQlyZXR1cm4gbnVsbDsKIAotCS8vIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKLQlpbnQgc2l6ZSA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmRW5kOyBpKyspCi0JCXNpemUgKz0gZlJhbmdlc1tpXVsxXTsKKwkvLyBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKwlpbnQgbGVuZ3RoID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZW5kOyBpKyspCisJCWxlbmd0aCArPSB0aGlzLnJhbmdlc1tpXVsxXTsKIAotCWlmIChzaXplID4gMCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07CiAJCWludCBjdXJyZW50ID0gMDsKIAkJLy8gY29weSB0aGUgcmVzdWx0cwotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkVuZDsgaSsrKSB7Ci0JCQlpbnRbXSByYW5nZSA9IGZSYW5nZXNbaV07Ci0JCQlpbnQgbGVuZ3RoID0gcmFuZ2VbMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZCdWZmZXJbaV0sIHJhbmdlWzBdLCByZXN1bHQsIGN1cnJlbnQsIGxlbmd0aCk7Ci0JCQljdXJyZW50ICs9IGxlbmd0aDsKKwkJZm9yKGludCBpID0gMDsgaSA8IHRoaXMuZW5kOyBpKyspIHsKKwkJCWludFtdIHJhbmdlID0gdGhpcy5yYW5nZXNbaV07CisJCQlpbnQgbGVuZ3RoMiA9IHJhbmdlWzFdOworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmJ1ZmZlcltpXSwgcmFuZ2VbMF0sIHJlc3VsdCwgY3VycmVudCwgbGVuZ3RoMik7CisJCQljdXJyZW50ICs9IGxlbmd0aDI7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YQppbmRleCA2MGFkODcxLi4xY2IxOTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNyArMjQsNyBAQAogCXByaXZhdGUgbG9uZyBhdHRyaWJ1dGVMZW5ndGg7CiAJcHJpdmF0ZSBpbnQgYXR0cmlidXRlTmFtZUluZGV4OwogCXByaXZhdGUgY2hhcltdIGF0dHJpYnV0ZU5hbWU7Ci0JCisKIAlwdWJsaWMgQ2xhc3NGaWxlQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJCXRoaXMuYXR0cmlidXRlTmFtZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMCwgb2Zmc2V0KTsKIAkJdGhpcy5hdHRyaWJ1dGVMZW5ndGggPSB1NEF0KGNsYXNzRmlsZUJ5dGVzLCAyLCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEKaW5kZXggZTAxOGE3Mi4uMTliODBkYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVSZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTUyLDIwICs1MiwyMCBAQAogCXByaXZhdGUgSVNvdXJjZUF0dHJpYnV0ZSBzb3VyY2VGaWxlQXR0cmlidXRlOwogCXByaXZhdGUgY2hhcltdIHN1cGVyY2xhc3NOYW1lOwogCXByaXZhdGUgaW50IHN1cGVyY2xhc3NOYW1lSW5kZXg7Ci0JCisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgQ2xhc3NGaWxlUmVhZGVyLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIHRoZSByYXcgYnl0ZXMgb2YgdGhlIC5jbGFzcyBmaWxlCiAJICogQHBhcmFtIGRlY29kaW5nRmxhZ3MgdGhlIGRlY29kaW5nIGZsYWdzCi0JICogCisJICoKIAkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjQUxMCiAJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI0NMQVNTRklMRV9BVFRSSUJVVEVTCiAJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI0NPTlNUQU5UX1BPT0wKIAkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjRklFTERfSU5GT1MKIAkgKi8KIAlwdWJsaWMgQ2xhc3NGaWxlUmVhZGVyKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgaW50IGRlY29kaW5nRmxhZ3MpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCisKIAkJLy8gVGhpcyBtZXRob2QgbG9va3MgdWdseSBidXQgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlLCB0aGUgY29uc3RhbnRQb29sIGlzIGNvbnN0cnVjdGVkCiAJCS8vIGluIDMgcGFzc2VzLiAgQWxsIG5vbi1wcmltaXRpdmUgY29uc3RhbnQgcG9vbCBtZW1iZXJzIHRoYXQgdXN1YWxseSByZWZlciB0byBvdGhlciBtZW1iZXJzCiAJCS8vIGJ5IGluZGV4IGFyZSB0d2Vha2VkIHRvIGhhdmUgdGhlaXIgdmFsdWUgaW4gaW5zdCB2YXJzLCB0aGlzIG1pbm9yIGNvc3QgYXQgcmVhZC10aW1lIG1ha2VzCkBAIC03NywyMSArNzcsMjEgQEAKIAkJCWlmICh0aGlzLm1hZ2ljTnVtYmVyICE9IDB4Q0FGRUJBQkUpIHsKIAkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9NQUdJQ19OVU1CRVIpOwogCQkJfQotCQkJCisKIAkJCWludCByZWFkT2Zmc2V0ID0gMTA7Ci0JCQl0aGlzLm1pbm9yVmVyc2lvbiA9IHRoaXMudTJBdChjbGFzc0ZpbGVCeXRlcywgNCwgMCk7Ci0JCQl0aGlzLm1ham9yVmVyc2lvbiA9IHRoaXMudTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgMCk7Ci0JCQkKKwkJCXRoaXMubWlub3JWZXJzaW9uID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNCwgMCk7CisJCQl0aGlzLm1ham9yVmVyc2lvbiA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIDApOworCiAJCQlpZiAoKGRlY29kaW5nRmxhZ3MgJiBJQ2xhc3NGaWxlUmVhZGVyLkNPTlNUQU5UX1BPT0wpID09IDApIHsKIAkJCQkvLyBubyBuZWVkIHRvIGdvIGZ1cnRoZXIKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQkKLQkJCWNvbnN0YW50UG9vbENvdW50ID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCA4LCAwKTsKKworCQkJY29uc3RhbnRQb29sQ291bnQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA4LCAwKTsKIAkJCS8vIFBhc3MgIzEgLSBGaWxsIGluIGFsbCBwcmltaXRpdmUgY29uc3RhbnRzCiAJCQljb25zdGFudFBvb2xPZmZzZXRzID0gbmV3IGludFtjb25zdGFudFBvb2xDb3VudF07CiAJCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbnN0YW50UG9vbENvdW50OyBpKyspIHsKLQkJCQlpbnQgdGFnID0gdGhpcy51MUF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKTsKKwkJCQlpbnQgdGFnID0gdTFBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CiAJCQkJc3dpdGNoICh0YWcpIHsKIAkJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCA6CiAJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKQEAgLTE0NCwyNiArMTQ0LDI2IEBACiAJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9UQUdfQ09OU1RBTlQpOwogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQl0aGlzLmNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2woY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbE9mZnNldHMpOwogCQkJLy8gUmVhZCBhbmQgdmFsaWRhdGUgYWNjZXNzIGZsYWdzCiAJCQl0aGlzLmFjY2Vzc0ZsYWdzID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CiAJCQlyZWFkT2Zmc2V0ICs9IDI7Ci0JCisKIAkJCS8vIFJlYWQgdGhlIGNsYXNzbmFtZSwgdXNlIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBjYXRjaCBiYWQgZm9ybWF0CiAJCQl0aGlzLmNsYXNzTmFtZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CiAJCQl0aGlzLmNsYXNzTmFtZSA9IGdldENvbnN0YW50Q2xhc3NOYW1lQXQoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbE9mZnNldHMsIHRoaXMuY2xhc3NOYW1lSW5kZXgpOwogCQkJcmVhZE9mZnNldCArPSAyOwotCQorCiAJCQkvLyBSZWFkIHRoZSBzdXBlcmNsYXNzIG5hbWUsIGNhbiBiZSB6ZXJvIGZvciBqYXZhLmxhbmcuT2JqZWN0CiAJCQl0aGlzLnN1cGVyY2xhc3NOYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKTsKIAkJCXJlYWRPZmZzZXQgKz0gMjsKLQkJCS8vIGlmIHN1cGVyY2xhc3NOYW1lSW5kZXggaXMgZXF1YWxzIHRvIDAgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhlIAorCQkJLy8gaWYgc3VwZXJjbGFzc05hbWVJbmRleCBpcyBlcXVhbHMgdG8gMCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIHZhbHVlIGZvciB0aGUKIAkJCS8vIGZpZWxkIHRoaXMuc3VwZXJjbGFzc05hbWUuIG51bGwgaXMgZmluZS4KLQkJCWlmIChzdXBlcmNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWlmICh0aGlzLnN1cGVyY2xhc3NOYW1lSW5kZXggIT0gMCkgewogCQkJCXRoaXMuc3VwZXJjbGFzc05hbWUgPSBnZXRDb25zdGFudENsYXNzTmFtZUF0KGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2xPZmZzZXRzLCB0aGlzLnN1cGVyY2xhc3NOYW1lSW5kZXgpOwogCQkJfQotCQorCiAJCQkvLyBSZWFkIHRoZSBpbnRlcmZhY2VzLCB1c2UgZXhjZXB0aW9uIGhhbmRsZXJzIHRvIGNhdGNoIGJhZCBmb3JtYXQKIAkJCXRoaXMuaW50ZXJmYWNlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CiAJCQlyZWFkT2Zmc2V0ICs9IDI7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCQkJCQkJcmVhZE9mZnNldCArPSAoNiArIGF0dHJpYnV0ZUxlbmd0aCk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9CQkJCQkKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCS8vIFJlYWQgdGhlIHRoaXMubWV0aG9kcwpAQCAtMjMxLDIwICsyMzEsMjAgQEAKIAkJCQkJCQkJcmVhZE9mZnNldCArPSAoNiArIGF0dHJpYnV0ZUxlbmd0aCk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9CQkJCQkKKwkJCQkJfQogCQkJCX0KIAkJCX0KLQkKKwogCQkJLy8gUmVhZCB0aGUgYXR0cmlidXRlcwogCQkJdGhpcy5hdHRyaWJ1dGVzQ291bnQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKTsKIAkJCXJlYWRPZmZzZXQgKz0gMjsKLQkKKwogCQkJaW50IGF0dHJpYnV0ZXNJbmRleCA9IDA7CiAJCQl0aGlzLmF0dHJpYnV0ZXMgPSBDbGFzc0ZpbGVBdHRyaWJ1dGUuTk9fQVRUUklCVVRFUzsKIAkJCWlmICh0aGlzLmF0dHJpYnV0ZXNDb3VudCAhPSAwKSB7CiAJCQkJaWYgKChkZWNvZGluZ0ZsYWdzICYgSUNsYXNzRmlsZVJlYWRlci5DTEFTU0ZJTEVfQVRUUklCVVRFUykgIT0gSUNsYXNzRmlsZVJlYWRlci5DT05TVEFOVF9QT09MKSB7CiAJCQkJCXRoaXMuYXR0cmlidXRlcyA9IG5ldyBJQ2xhc3NGaWxlQXR0cmlidXRlW3RoaXMuYXR0cmlidXRlc0NvdW50XTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlc0NvdW50OyBpKyspIHsKIAkJCQkJCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKV07CiAJCQkJCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdChjbGFzc0ZpbGVCeXRlcywgdXRmOE9mZnNldCArIDMsIDAsIHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHV0ZjhPZmZzZXQgKyAxLCAwKSk7CiAJCQkJCQlpZiAoZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5JTk5FUl9DTEFTU0VTKSkgewpAQCAtMjY1LDIxICsyNjUsMjEgQEAKIAkJCQkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgdGhpcy5jb25zdGFudFBvb2wsIHJlYWRPZmZzZXQpOwogCQkJCQkJfQogCQkJCQkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQgKyAyLCAwKSk7Ci0JCQkJCX0JCQkJCQorCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlc0NvdW50OyBpKyspIHsKIAkJCQkJCXJlYWRPZmZzZXQgKz0gKDYgKyB1NEF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0ICsgMiwgMCkpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYgKHJlYWRPZmZzZXQgIT0gY2xhc3NGaWxlQnl0ZXMubGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLlRPT19NQU5ZX0JZVEVTKTsgCisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLlRPT19NQU5ZX0JZVEVTKTsKIAkJCX0KIAkJfSBjYXRjaChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBlOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FUlJPUl9UUlVOQ0FURURfSU5QVVQpOyAKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FUlJPUl9UUlVOQ0FURURfSU5QVVQpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQppbmRleCBmYWNhMDVkLi4xNDg1Mjg2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlU3RydWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsMTEgKzE2LDExIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NGaWxlU3RydWN0IHsKIAogCXByb3RlY3RlZCBkb3VibGUgZG91YmxlQXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7Ci0JCXJldHVybiAoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5pOEF0KHJlZmVyZW5jZSwgcmVsYXRpdmVPZmZzZXQsIHN0cnVjdE9mZnNldCkpKTsKKwkJcmV0dXJuIChEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShpOEF0KHJlZmVyZW5jZSwgcmVsYXRpdmVPZmZzZXQsIHN0cnVjdE9mZnNldCkpKTsKIAl9CiAKIAlwcm90ZWN0ZWQgZmxvYXQgZmxvYXRBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsIGludCBzdHJ1Y3RPZmZzZXQpIHsKLQkJcmV0dXJuIChGbG9hdC5pbnRCaXRzVG9GbG9hdCh0aGlzLmk0QXQocmVmZXJlbmNlLCByZWxhdGl2ZU9mZnNldCwgc3RydWN0T2Zmc2V0KSkpOworCQlyZXR1cm4gKEZsb2F0LmludEJpdHNUb0Zsb2F0KGk0QXQocmVmZXJlbmNlLCByZWxhdGl2ZU9mZnNldCwgc3RydWN0T2Zmc2V0KSkpOwogCX0KIAlwcm90ZWN0ZWQgaW50IGkxQXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7CiAJCXJldHVybiByZWZlcmVuY2VbcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXRdOwpAQCAtOTcsNyArOTcsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCiAJCQlyZXR1cm4gZmFsc2U7Ci0JCisKIAkJZm9yIChpbnQgaSA9IGZpcnN0Lmxlbmd0aDsgLS1pID49IDA7KQogCQkJaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkKIAkJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29kZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDIxYTdkZmUuLjgyYmE5NTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29kZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29kZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQxLDcgKzQxLDcgQEAKIAlwcml2YXRlIElMb2NhbFZhcmlhYmxlQXR0cmlidXRlIGxvY2FsVmFyaWFibGVBdHRyaWJ1dGU7CiAJcHJpdmF0ZSBpbnQgbWF4TG9jYWxzOwogCXByaXZhdGUgaW50IG1heFN0YWNrOwotCQorCiAJQ29kZUF0dHJpYnV0ZShieXRlW10gY2xhc3NGaWxlQnl0ZXMsIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewogCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOwogCQl0aGlzLmNsYXNzRmlsZUJ5dGVzID0gY2xhc3NGaWxlQnl0ZXM7CkBAIC0xMTEsNyArMTExLDcgQEAKIAkgKi8KIAlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVjb2RlcygpIHsKIAkJaWYgKHRoaXMuYnl0ZWNvZGVzID09IG51bGwpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jbGFzc0ZpbGVCeXRlcywgdGhpcy5jb2RlT2Zmc2V0LCAodGhpcy5ieXRlY29kZXMgPSBuZXcgYnl0ZVsoaW50KSB0aGlzLmNvZGVMZW5ndGhdKSwgMCwgKGludCkgdGhpcy5jb2RlTGVuZ3RoKTsgCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIHRoaXMuY29kZU9mZnNldCwgKHRoaXMuYnl0ZWNvZGVzID0gbmV3IGJ5dGVbKGludCkgdGhpcy5jb2RlTGVuZ3RoXSksIDAsIChpbnQpIHRoaXMuY29kZUxlbmd0aCk7CiAJCX0KIAkJcmV0dXJuIHRoaXMuYnl0ZWNvZGVzOwogCX0KQEAgLTE1MCw3ICsxNTAsNyBAQAogCXB1YmxpYyBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSBnZXRMb2NhbFZhcmlhYmxlQXR0cmlidXRlKCkgewogCQlyZXR1cm4gdGhpcy5sb2NhbFZhcmlhYmxlQXR0cmlidXRlOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0TWF4TG9jYWxzKCkKIAkgKi8KQEAgLTE2NCw3ICsxNjQsNyBAQAogCXB1YmxpYyBpbnQgZ2V0TWF4U3RhY2soKSB7CiAJCXJldHVybiB0aGlzLm1heFN0YWNrOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjdHJhdmVyc2UoSUJ5dGVjb2RlVmlzaXRvciB2aXNpdG9yKQogCSAqLwpAQCAtMTA0Niw2ICsxMDQ2LDE5IEBACiAJCQkJCXZpc2l0b3IuX2ludm9rZWludGVyZmFjZShwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvdW50LCBjb25zdGFudFBvb2xFbnRyeSk7CiAJCQkJCXBjICs9IDU7CiAJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTlZPS0VEWU5BTUlDIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX05hbWVBbmRUeXBlKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9pbnZva2VkeW5hbWljKAorCQkJCQkJCXBjIC0gdGhpcy5jb2RlT2Zmc2V0LAorCQkJCQkJCWluZGV4LAorCQkJCQkJCXRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGNvbnN0YW50UG9vbEVudHJ5LmdldE5hbWVBbmRUeXBlSW5mb05hbWVJbmRleCgpKSwKKwkJCQkJCQl0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShjb25zdGFudFBvb2xFbnRyeS5nZXROYW1lQW5kVHlwZUluZm9EZXNjcmlwdG9ySW5kZXgoKSkpOworCQkJCQlwYyArPSA1OworCQkJCQlicmVhazsKIAkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTkVXIDoKIAkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKIAkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CkBAIC0xMTU5LDcgKzExNzIsNyBAQAogCQkJCQlwYysrOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9CWVRFQ09ERSk7CQkJCisJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0JZVEVDT0RFKTsKIAkJCX0KIAkJCWlmIChwYyA+PSAodGhpcy5jb2RlTGVuZ3RoICsgdGhpcy5jb2RlT2Zmc2V0KSkgewogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db2RlU25pcHBldFBhcnNpbmdVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVTbmlwcGV0UGFyc2luZ1V0aWwuamF2YQppbmRleCA4YTMxYjU0Li42MTE1ZTNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVTbmlwcGV0UGFyc2luZ1V0aWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVTbmlwcGV0UGFyc2luZ1V0aWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMiw4ICszMiwxNyBAQAogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0UGFyc2luZ1V0aWwgewogCiAJcHVibGljIFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uIHJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uOworCXB1YmxpYyBib29sZWFuIGlnbm9yZU1ldGhvZEJvZGllczsKKwkKKwlwdWJsaWMgQ29kZVNuaXBwZXRQYXJzaW5nVXRpbChib29sZWFuIGlnbm9yZU1ldGhvZEJvZGllcykgeworCQl0aGlzLmlnbm9yZU1ldGhvZEJvZGllcyA9IGlnbm9yZU1ldGhvZEJvZGllczsKKwl9CiAKLQlwcml2YXRlIFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uIGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBDb21tZW50UmVjb3JkZXJQYXJzZXIgcGFyc2VyKSB7CisJcHVibGljIENvZGVTbmlwcGV0UGFyc2luZ1V0aWwoKSB7CisJCXRoaXMoZmFsc2UpOworCX0KKworCXByaXZhdGUgUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24gZ2V0UmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIGludFtdW10gY29tbWVudFBvc2l0aW9ucykgewogCQlpbnQgcHJvYmxlbXNDb3VudCA9IGNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1Db3VudDsKIAkJQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSBudWxsOwogCQlpZiAocHJvYmxlbXNDb3VudCAhPSAwKSB7CkBAIC00NCwzOSArNTMsNDYgQEAKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbXBpbGF0aW9uUmVzdWx0UHJvYmxlbXMsIDAsIChwcm9ibGVtcyA9IG5ldyBDYXRlZ29yaXplZFByb2JsZW1bcHJvYmxlbXNDb3VudF0pLCAwLCBwcm9ibGVtc0NvdW50KTsKIAkJCX0KIAkJfQotCQlyZXR1cm4gbmV3IFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKHByb2JsZW1zLCBjb21waWxhdGlvblJlc3VsdC5nZXRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKCksIHBhcnNlci5nZXRDb21tZW50c1Bvc2l0aW9ucygpKTsKKwkJcmV0dXJuIG5ldyBSZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbihwcm9ibGVtcywgY29tcGlsYXRpb25SZXN1bHQuZ2V0TGluZVNlcGFyYXRvclBvc2l0aW9ucygpLCBjb21tZW50UG9zaXRpb25zKTsKIAl9CiAKIAlwdWJsaWMgQVNUTm9kZVtdIHBhcnNlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKGNoYXJbXSBzb3VyY2UsIE1hcCBzZXR0aW5ncywgYm9vbGVhbiByZWNvcmRQYXJzaW5nSW5mb3JtYXRpb24pIHsKLQkJcmV0dXJuIHBhcnNlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCwgc2V0dGluZ3MsIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbik7Ci0JfQkKKwkJcmV0dXJuIHBhcnNlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCwgc2V0dGluZ3MsIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbiwgZmFsc2UpOworCX0KIAotCXB1YmxpYyBBU1ROb2RlW10gcGFyc2VDbGFzc0JvZHlEZWNsYXJhdGlvbnMoY2hhcltdIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgTWFwIHNldHRpbmdzLCBib29sZWFuIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbikgeworCXB1YmxpYyBBU1ROb2RlW10gcGFyc2VDbGFzc0JvZHlEZWNsYXJhdGlvbnMoCisJCQljaGFyW10gc291cmNlLAorCQkJaW50IG9mZnNldCwKKwkJCWludCBsZW5ndGgsCisJCQlNYXAgc2V0dGluZ3MsCisJCQlib29sZWFuIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbiwKKwkJCWJvb2xlYW4gZW5hYmxlZFN0YXRlbWVudFJlY292ZXJ5KSB7CiAJCWlmIChzb3VyY2UgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKHNldHRpbmdzKTsKKwkJY29tcGlsZXJPcHRpb25zLmlnbm9yZU1ldGhvZEJvZGllcyA9IHRoaXMuaWdub3JlTWV0aG9kQm9kaWVzOwogCQlmaW5hbCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCQljb21waWxlck9wdGlvbnMsIAorCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKKwkJCQkJY29tcGlsZXJPcHRpb25zLAogCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKTsKLQkJCQkJCisKIAkJQ29tbWVudFJlY29yZGVyUGFyc2VyIHBhcnNlciA9IG5ldyBDb21tZW50UmVjb3JkZXJQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBmYWxzZSk7CiAJCXBhcnNlci5zZXRNZXRob2RzRnVsbFJlY292ZXJ5KGZhbHNlKTsKLQkJcGFyc2VyLnNldFN0YXRlbWVudHNSZWNvdmVyeShmYWxzZSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAKKwkJcGFyc2VyLnNldFN0YXRlbWVudHNSZWNvdmVyeShlbmFibGVkU3RhdGVtZW50UmVjb3ZlcnkpOworCisJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9CiAJCQluZXcgQ29tcGlsYXRpb25Vbml0KAotCQkJCXNvdXJjZSwgCisJCQkJc291cmNlLAogCQkJCSIiLCAvLyROT04tTkxTLTEkCiAJCQkJY29tcGlsZXJPcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7CiAKIAkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCWZpbmFsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgY29tcGlsYXRpb25SZXN1bHQsIHNvdXJjZS5sZW5ndGgpOwogCQlBU1ROb2RlW10gcmVzdWx0ID0gcGFyc2VyLnBhcnNlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKHNvdXJjZSwgb2Zmc2V0LCBsZW5ndGgsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKLQkJCisKIAkJaWYgKHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbikgewotCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBwYXJzZXIpOworCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21tZW50cyk7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC04Niw0MiArMTAyLDQzIEBACiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KIAkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOworCQljb21waWxlck9wdGlvbnMuaWdub3JlTWV0aG9kQm9kaWVzID0gdGhpcy5pZ25vcmVNZXRob2RCb2RpZXM7CiAJCUNvbW1lbnRSZWNvcmRlclBhcnNlciBwYXJzZXIgPQogCQkJbmV3IENvbW1lbnRSZWNvcmRlclBhcnNlcigKIAkJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAotCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwgCi0JCQkJCWNvbXBpbGVyT3B0aW9ucywgCisJCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQkJCQljb21waWxlck9wdGlvbnMsCiAJCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpLAogCQkJZmFsc2UpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gCisKKwkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0KIAkJCW5ldyBDb21waWxhdGlvblVuaXQoCi0JCQkJc291cmNlLCAKKwkJCQlzb3VyY2UsCiAJCQkJIiIsIC8vJE5PTi1OTFMtMSQKIAkJCQljb21waWxlck9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKTsKIAkJZmluYWwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7CiAKIAkJaWYgKHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbikgewotCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBwYXJzZXIpOworCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21tZW50cyk7CiAJCX0KLQkJCisKIAkJaWYgKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmlnbm9yZU1ldGhvZEJvZGllcykgewogCQkJY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOwogCQkJLy8gaWYgaW5pdGlhbCBkaWV0IHBhcnNlIGRpZCBub3Qgd29yaywgbm8gbmVlZCB0byBkaWcgaW50byBtZXRob2QgYm9kaWVzLgotCQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOyAKKwkJCXJldHVybiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKIAkJfQotCQkKKwogCQkvL2ZpbGwgdGhlIG1ldGhvZHMgYm9kaWVzIGluIG9yZGVyIGZvciB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKIAkJLy9yZWFsIHBhcnNlIG9mIHRoZSBtZXRob2QuLi4uCiAJCXBhcnNlci5zY2FubmVyLnNldFNvdXJjZShjb21waWxhdGlvblJlc3VsdCk7CiAJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKIAkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IC0taSA+PSAwOykgewotCQkJCXR5cGVzW2ldLnBhcnNlTWV0aG9kKHBhcnNlciwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdHlwZXNbaV0ucGFyc2VNZXRob2RzKHBhcnNlciwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOwogCQkJfQogCQl9Ci0JCQorCiAJCWlmIChyZWNvcmRQYXJzaW5nSW5mb3JtYXRpb24pIHsKIAkJCXRoaXMucmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24udXBkYXRlUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOwogCQl9CkBAIC0xMzEsMzEgKzE0OCwzMyBAQAogCXB1YmxpYyBFeHByZXNzaW9uIHBhcnNlRXhwcmVzc2lvbihjaGFyW10gc291cmNlLCBNYXAgc2V0dGluZ3MsIGJvb2xlYW4gcmVjb3JkUGFyc2luZ0luZm9ybWF0aW9uKSB7CiAJCXJldHVybiBwYXJzZUV4cHJlc3Npb24oc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoLCBzZXR0aW5ncywgcmVjb3JkUGFyc2luZ0luZm9ybWF0aW9uKTsKIAl9Ci0JCisKIAlwdWJsaWMgRXhwcmVzc2lvbiBwYXJzZUV4cHJlc3Npb24oY2hhcltdIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgTWFwIHNldHRpbmdzLCBib29sZWFuIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbikgewotCQkKKwogCQlpZiAoc291cmNlID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7CisJCS8vIGluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGlnbm9yZSBtZXRob2QgYm9kaWVzIHNpbmNlIHdlIGFyZSBwYXJzaW5nIG9ubHkgYW4gZXhwcmVzc2lvbgogCQlmaW5hbCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCQljb21waWxlck9wdGlvbnMsIAorCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKKwkJCQkJY29tcGlsZXJPcHRpb25zLAogCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKTsKLQkJCQkJCisKIAkJQ29tbWVudFJlY29yZGVyUGFyc2VyIHBhcnNlciA9IG5ldyBDb21tZW50UmVjb3JkZXJQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBmYWxzZSk7CiAKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gCisJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9CiAJCQluZXcgQ29tcGlsYXRpb25Vbml0KAotCQkJCXNvdXJjZSwgCisJCQkJc291cmNlLAogCQkJCSIiLCAvLyROT04tTkxTLTEkCiAJCQkJY29tcGlsZXJPcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7CiAKIAkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgY29tcGlsZXJPcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7Ci0JCUV4cHJlc3Npb24gcmVzdWx0ID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihzb3VyY2UsIG9mZnNldCwgbGVuZ3RoLCBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24ocHJvYmxlbVJlcG9ydGVyLCBjb21waWxhdGlvblJlc3VsdCwgc291cmNlLmxlbmd0aCkpOwotCQkKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0LCBzb3VyY2UubGVuZ3RoKTsKKwkJRXhwcmVzc2lvbiByZXN1bHQgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHNvdXJjZSwgb2Zmc2V0LCBsZW5ndGgsIHVuaXQpOworCiAJCWlmIChyZWNvcmRQYXJzaW5nSW5mb3JtYXRpb24pIHsKLQkJCXRoaXMucmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24gPSBnZXRSZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbihjb21waWxhdGlvblJlc3VsdCwgcGFyc2VyKTsKKwkJCXRoaXMucmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24gPSBnZXRSZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbihjb21waWxhdGlvblJlc3VsdCwgdW5pdC5jb21tZW50cyk7CiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xNjMsNDEgKzE4Miw0OCBAQAogCXB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHBhcnNlU3RhdGVtZW50cyhjaGFyW10gc291cmNlLCBNYXAgc2V0dGluZ3MsIGJvb2xlYW4gcmVjb3JkUGFyc2luZ0luZm9ybWF0aW9uLCBib29sZWFuIGVuYWJsZWRTdGF0ZW1lbnRSZWNvdmVyeSkgewogCQlyZXR1cm4gcGFyc2VTdGF0ZW1lbnRzKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCwgc2V0dGluZ3MsIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbiwgZW5hYmxlZFN0YXRlbWVudFJlY292ZXJ5KTsKIAl9Ci0JCi0JcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gcGFyc2VTdGF0ZW1lbnRzKGNoYXJbXSBzb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIE1hcCBzZXR0aW5ncywgYm9vbGVhbiByZWNvcmRQYXJzaW5nSW5mb3JtYXRpb24sIGJvb2xlYW4gZW5hYmxlZFN0YXRlbWVudFJlY292ZXJ5KSB7CisKKwlwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBwYXJzZVN0YXRlbWVudHMoCisJCQljaGFyW10gc291cmNlLAorCQkJaW50IG9mZnNldCwKKwkJCWludCBsZW5ndGgsCisJCQlNYXAgc2V0dGluZ3MsCisJCQlib29sZWFuIHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbiwKKwkJCWJvb2xlYW4gZW5hYmxlZFN0YXRlbWVudFJlY292ZXJ5KSB7CiAJCWlmIChzb3VyY2UgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKHNldHRpbmdzKTsKKwkJLy8gaW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gaWdub3JlIG1ldGhvZCBib2RpZXMgc2luY2Ugd2UgYXJlIHBhcnNpbmcgb25seSBzdGF0ZW1lbnRzCiAJCWZpbmFsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSBuZXcgUHJvYmxlbVJlcG9ydGVyKAotCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwgCi0JCQkJCWNvbXBpbGVyT3B0aW9ucywgCisJCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQkJCQljb21waWxlck9wdGlvbnMsCiAJCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpOwogCQlDb21tZW50UmVjb3JkZXJQYXJzZXIgcGFyc2VyID0gbmV3IENvbW1lbnRSZWNvcmRlclBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIGZhbHNlKTsKIAkJcGFyc2VyLnNldE1ldGhvZHNGdWxsUmVjb3ZlcnkoZmFsc2UpOwogCQlwYXJzZXIuc2V0U3RhdGVtZW50c1JlY292ZXJ5KGVuYWJsZWRTdGF0ZW1lbnRSZWNvdmVyeSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAKKworCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPQogCQkJbmV3IENvbXBpbGF0aW9uVW5pdCgKLQkJCQlzb3VyY2UsIAorCQkJCXNvdXJjZSwKIAkJCQkiIiwgLy8kTk9OLU5MUy0xJAogCQkJCWNvbXBpbGVyT3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpOwogCiAJCWZpbmFsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIGNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0LCBsZW5ndGgpOwkJCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgY29tcGlsYXRpb25SZXN1bHQsIGxlbmd0aCk7CiAKIAkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOwogCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvdXJjZUVuZCAgPSAtMTsKIAkJY29uc3RydWN0b3JEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IG9mZnNldCArIGxlbmd0aCAtIDE7CiAJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gb2Zmc2V0OwogCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmJvZHlFbmQgPSBvZmZzZXQgKyBsZW5ndGggLSAxOwotCQkKKwogCQlwYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25SZXN1bHQpOwogCQlwYXJzZXIuc2Nhbm5lci5yZXNldFRvKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKIAkJcGFyc2VyLnBhcnNlKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCB0cnVlKTsKLQkJCisKIAkJaWYgKHJlY29yZFBhcnNpbmdJbmZvcm1hdGlvbikgewotCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBwYXJzZXIpOworCQkJdGhpcy5yZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbiA9IGdldFJlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0LCBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21tZW50cyk7CiAJCX0KIAkJcmV0dXJuIGNvbnN0cnVjdG9yRGVjbGFyYXRpb247CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db21tZW50UmVjb3JkZXJQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29tbWVudFJlY29yZGVyUGFyc2VyLmphdmEKaW5kZXggY2JiY2MzOC4uNDFkNTFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db21tZW50UmVjb3JkZXJQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbW1lbnRSZWNvcmRlclBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDE2ICsxNCwxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CiAKIC8qKgogICogSW50ZXJuYWwgcGFyc2VyIHVzZWQgZm9yIHBhcnNpbmcgc291cmNlIHRvIGNyZWF0ZSBET00gQVNUIG5vZGVzLgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgQ29tbWVudFJlY29yZGVyUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHsKLQkKKwogCS8vIHN1cHBvcnQgZm9yIGNvbW1lbnRzCiAJaW50W10gY29tbWVudFN0b3BzID0gbmV3IGludFsxMF07CiAJaW50W10gY29tbWVudFN0YXJ0cyA9IG5ldyBpbnRbMTBdOwpAQCAtMzksNyArNDAsNyBAQAogCX0KIAogCS8vIG9sZCBqYXZhZG9jIHN0eWxlIGNoZWNrIHdoaWNoIGRvZXNuJ3QgaW5jbHVkZSBhbGwgbGVhZGluZyBjb21tZW50cyBpbnRvIGRlY2xhcmF0aW9uCi0JLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAyLjEgRE9NIAorCS8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggMi4xIERPTQogCXB1YmxpYyB2b2lkIGNoZWNrQ29tbWVudCgpIHsKIAogCQkvLyBkaXNjYXJkIG9ic29sZXRlIGNvbW1lbnRzIHdoaWxlIGluc2lkZSBtZXRob2RzIG9yIGZpZWxkcyBpbml0aWFsaXplciAoc2VlIGJ1ZyA3NDM2OSkKQEAgLTQ5LDEyICs1MCwxMiBAQAogCQlib29sZWFuIGRlcHJlY2F0ZWQgPSBmYWxzZTsKIAkJYm9vbGVhbiBjaGVja0RlcHJlY2F0ZWQgPSBmYWxzZTsKIAkJaW50IGxhc3RDb21tZW50SW5kZXggPSAtMTsKLQkJCisKIAkJLy9zaW5jZSBqZGsxLjIgbG9vayBvbmx5IGluIHRoZSBsYXN0IGphdmEgZG9jIGNvbW1lbnQuLi4KIAkJbmV4dENvbW1lbnQgOiBmb3IgKGxhc3RDb21tZW50SW5kZXggPSB0aGlzLnNjYW5uZXIuY29tbWVudFB0cjsgbGFzdENvbW1lbnRJbmRleCA+PSAwOyBsYXN0Q29tbWVudEluZGV4LS0pewogCQkJLy9sb29rIGZvciBAZGVwcmVjYXRlZCBpbnRvIHRoZSBmaXJzdCBqYXZhZG9jIGNvbW1lbnQgcHJlY2VlZGluZyB0aGUgZGVjbGFyYXRpb24KIAkJCWludCBjb21tZW50U291cmNlU3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tsYXN0Q29tbWVudEluZGV4XTsKLQkJCS8vIGphdmFkb2Mgb25seSAobm9uIGphdmFkb2MgY29tbWVudCBoYXZlIG5lZ2F0aXZlIGVuZCBwb3NpdGlvbnMuKQorCQkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgc3RhcnQgYW5kL29yIGVuZCBwb3NpdGlvbnMuKQogCQkJaWYgKChjb21tZW50U291cmNlU3RhcnQgPCAwKSB8fAogCQkJCSh0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ICE9IC0xICYmIHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPCBjb21tZW50U291cmNlU3RhcnQpIHx8CiAJCQkJKHRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdENvbW1lbnRJbmRleF0gPCAwKSkKQEAgLTYzLDExICs2NCwxNSBAQAogCQkJfQogCQkJY2hlY2tEZXByZWNhdGVkID0gdHJ1ZTsKIAkJCWludCBjb21tZW50U291cmNlRW5kID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wc1tsYXN0Q29tbWVudEluZGV4XSAtIDE7IC8vc3RvcCBpcyBvbmUgb3ZlcgotCQkJCiAJCQkvLyBkbyBub3QgcmVwb3J0IHByb2JsZW0gYmVmb3JlIGxhc3QgcGFyc2VkIGNvbW1lbnQgd2hpbGUgcmVjb3ZlcmluZyBjb2RlLi4uCi0JCQl0aGlzLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSB0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwgfHwgY29tbWVudFNvdXJjZUVuZCA+IHRoaXMubGFzdEphdmFkb2NFbmQ7CisJCQlpZiAodGhpcy5qYXZhZG9jUGFyc2VyLnNob3VsZFJlcG9ydFByb2JsZW1zKSB7CisJCQkJdGhpcy5qYXZhZG9jUGFyc2VyLnJlcG9ydFByb2JsZW1zID0gdGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsIHx8IGNvbW1lbnRTb3VyY2VFbmQgPiB0aGlzLmxhc3RKYXZhZG9jRW5kOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSBmYWxzZTsKKwkJCX0KIAkJCWRlcHJlY2F0ZWQgPSB0aGlzLmphdmFkb2NQYXJzZXIuY2hlY2tEZXByZWNhdGlvbihsYXN0Q29tbWVudEluZGV4KTsKIAkJCXRoaXMuamF2YWRvYyA9IHRoaXMuamF2YWRvY1BhcnNlci5kb2NDb21tZW50OworCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgdGhpcy5sYXN0SmF2YWRvY0VuZCA9IGNvbW1lbnRTb3VyY2VFbmQ7CiAJCQlicmVhayBuZXh0Q29tbWVudDsKIAkJfQogCQlpZiAoZGVwcmVjYXRlZCkgewpAQCAtNzUsNyArODAsNyBAQAogCQl9CiAJCS8vIG1vZGlmeSB0aGUgbW9kaWZpZXIgc291cmNlIHN0YXJ0IHRvIHBvaW50IGF0IHRoZSBmaXJzdCBjb21tZW50CiAJCWlmIChsYXN0Q29tbWVudEluZGV4ID49IDAgJiYgY2hlY2tEZXByZWNhdGVkKSB7Ci0JCQl0aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdENvbW1lbnRJbmRleF07IAorCQkJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IHRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RDb21tZW50SW5kZXhdOwogCQkJaWYgKHRoaXMubW9kaWZpZXJzU291cmNlU3RhcnQgPCAwKSB7CiAJCQkJdGhpcy5tb2RpZmllcnNTb3VyY2VTdGFydCA9IC10aGlzLm1vZGlmaWVyc1NvdXJjZVN0YXJ0OwogCQkJfQpAQCAtMTA0LDI2ICsxMDksNiBAQAogCQlzdXBlci5jb25zdW1lSW50ZXJmYWNlSGVhZGVyKCk7CiAJfQogCi0JLyoqCi0JICogSW5zdXJlIHRoYXQgc3RhcnQgcG9zaXRpb24gaXMgYWx3YXlzIHBvc2l0aXZlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXIjY29udGFpbnNDb21tZW50KGludCwgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29tbWVudChpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKLQkJaW50IGlDb21tZW50ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7Ci0JCWZvciAoOyBpQ29tbWVudCA+PSAwOyBpQ29tbWVudC0tKSB7Ci0JCQlpbnQgY29tbWVudFN0YXJ0ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbaUNvbW1lbnRdOwotCQkJaWYgKGNvbW1lbnRTdGFydCA8IDApIHsKLQkJCQljb21tZW50U3RhcnQgPSAtY29tbWVudFN0YXJ0OwotCQkJfQotCQkJLy8gaWdub3JlIGNvbW1lbnRzIGJlZm9yZSBzdGFydAotCQkJaWYgKGNvbW1lbnRTdGFydCA8IHNvdXJjZVN0YXJ0KSBjb250aW51ZTsKLQkJCS8vIGlnbm9yZSBjb21tZW50cyBhZnRlciBlbmQKLQkJCWlmIChjb21tZW50U3RhcnQgPiBzb3VyY2VFbmQpIGNvbnRpbnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyI2VuZFBhcnNlKGludCkKIAkgKi8KQEAgLTE0NCw3ICsxMjksNyBAQAogCiAJCWludCBsYXN0Q29tbWVudEluZGV4ID0gdGhpcy5zY2FubmVyLmNvbW1lbnRQdHI7CiAJCWlmIChsYXN0Q29tbWVudEluZGV4IDwgMCkgcmV0dXJuIHBvc2l0aW9uOyAvLyBubyBjb21tZW50Ci0JCisKIAkJLy8gY29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9ic29sZXRlIGNvbW1lbnQKIAkJaW50IGluZGV4ID0gbGFzdENvbW1lbnRJbmRleDsKIAkJaW50IHZhbGlkQ291bnQgPSAwOwpAQCAtMTY0LDE0ICsxNDksMTQgQEAKIAkJCXdoaWxlIChpbmRleDxsYXN0Q29tbWVudEluZGV4ICYmIChpbW1lZGlhdGVDb21tZW50RW5kID0gLXRoaXMuc2Nhbm5lci5jb21tZW50U3RvcHNbaW5kZXgrMV0pICA+IDApeyAvLyBvbmx5IHRvbGVyYXRpbmcgbm9uLWphdmFkb2MgY29tbWVudHMgKG5vbi1qYXZhZG9jIGNvbW1lbnQgZW5kIHBvc2l0aW9ucyBhcmUgbmVnYXRpdmUpCiAJCQkJLy8gaXMgdGhlcmUgYW55IGxpbmUgYnJlYWsgdW50aWwgdGhlIGVuZCBvZiB0aGUgaW1tZWRpYXRlIGNvbW1lbnQgPyAodGh1cyBvbmx5IHRvbGVyYXRpbmcgbGluZSBjb21tZW50KQogCQkJCWltbWVkaWF0ZUNvbW1lbnRFbmQtLTsgLy8gY29tbWVudCBlbmQgaW4gb25lIGNoYXIgdG9vIGZhcgotCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldExpbmVOdW1iZXIocG9zaXRpb24sIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpIAorCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldExpbmVOdW1iZXIocG9zaXRpb24sIHRoaXMuc2Nhbm5lci5saW5lRW5kcywgMCwgdGhpcy5zY2FubmVyLmxpbmVQdHIpCiAJCQkJCQkhPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldExpbmVOdW1iZXIoaW1tZWRpYXRlQ29tbWVudEVuZCwgdGhpcy5zY2FubmVyLmxpbmVFbmRzLCAwLCB0aGlzLnNjYW5uZXIubGluZVB0cikpIGJyZWFrOwogCQkJCXBvc2l0aW9uID0gaW1tZWRpYXRlQ29tbWVudEVuZDsKIAkJCQl2YWxpZENvdW50LS07IC8vIGZsdXNoIHRoaXMgY29tbWVudAogCQkJCWluZGV4Kys7CiAJCQl9CiAJCX0KLQkKKwogCQlpZiAoaW5kZXggPCAwKSByZXR1cm4gcG9zaXRpb247IC8vIG5vIG9ic29sZXRlIGNvbW1lbnQKIAkJcHVzaE9uQ29tbWVudHNTdGFjaygwLCBpbmRleCk7IC8vIHN0b3JlIGNvbW1lbnQgYmVmb3JlIGZsdXNoaW5nIHRoZW0KIApAQCAtMTk1LDcgKzE4MCw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHMsIGluZGV4ICsgMSwgdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHMsIDAsIHZhbGlkQ291bnQpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wcywgaW5kZXggKyAxLCB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzLCAwLCB2YWxpZENvdW50KTsJCQorCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zY2FubmVyLmNvbW1lbnRTdG9wcywgaW5kZXggKyAxLCB0aGlzLnNjYW5uZXIuY29tbWVudFN0b3BzLCAwLCB2YWxpZENvdW50KTsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2Nhbm5lci5jb21tZW50VGFnU3RhcnRzLCBpbmRleCArIDEsIHRoaXMuc2Nhbm5lci5jb21tZW50VGFnU3RhcnRzLCAwLCB2YWxpZENvdW50KTsKIAkJfQogCQl0aGlzLnNjYW5uZXIuY29tbWVudFB0ciA9IHZhbGlkQ291bnQgLSAxOwpAQCAtMjI5LDE5ICsyMTQsMTkgQEAKIAkJc3VwZXIuaW5pdGlhbGl6ZSgpOwogCQl0aGlzLmNvbW1lbnRQdHIgPSAtMTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQ3JlYXRlIGFuZCBzdG9yZSBhIHNwZWNpZmljIGNvbW1lbnQgcmVjb3JkZXIgc2Nhbm5lci4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyI2luaXRpYWxpemVTY2FubmVyKCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplU2Nhbm5lcigpIHsKLQkJdGhpcy5zY2FubmVyID0gbmV3IENvbW1lbnRSZWNvcmRlclNjYW5uZXIoCi0JCQkJZmFsc2UgLypjb21tZW50Ki8sIAotCQkJCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKLQkJCQl0aGlzLm9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlIC8qbmxzKi8sIAotCQkJCXRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCAvKnNvdXJjZUxldmVsKi8sIAorCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcigKKwkJCQlmYWxzZSAvKmNvbW1lbnQqLywKKwkJCQlmYWxzZSAvKndoaXRlc3BhY2UqLywKKwkJCQl0aGlzLm9wdGlvbnMuZ2V0U2V2ZXJpdHkoQ29tcGlsZXJPcHRpb25zLk5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlIC8qbmxzKi8sCisJCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsIC8qc291cmNlTGV2ZWwqLywKIAkJCQl0aGlzLm9wdGlvbnMudGFza1RhZ3MvKnRhc2tUYWdzKi8sCi0JCQkJdGhpcy5vcHRpb25zLnRhc2tQcmlvcml0ZXMvKnRhc2tQcmlvcml0aWVzKi8sCisJCQkJdGhpcy5vcHRpb25zLnRhc2tQcmlvcml0aWVzLyp0YXNrUHJpb3JpdGllcyovLAogCQkJCXRoaXMub3B0aW9ucy5pc1Rhc2tDYXNlU2Vuc2l0aXZlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKIAl9CiAKQEAgLTI0OSw3ICsyMzQsNyBAQAogCSAqIFB1c2ggYWxsIHN0b3JlZCBjb21tZW50cyBpbiBzdGFjay4KIAkgKi8KIAlwcml2YXRlIHZvaWQgcHVzaE9uQ29tbWVudHNTdGFjayhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkKKwogCQlmb3IgKGludCBpPXN0YXJ0OyBpPD1lbmQ7IGkrKykgewogCQkJLy8gRmlyc3Qgc2VlIGlmIGNvbW1lbnQgaGFzbid0IGJlZW4gYWxyZWFkeSBzdG9yZWQKIAkJCWludCBzY2FubmVyU3RhcnQgPSB0aGlzLnNjYW5uZXIuY29tbWVudFN0YXJ0c1tpXTwwID8gLXRoaXMuc2Nhbm5lci5jb21tZW50U3RhcnRzW2ldIDogdGhpcy5zY2FubmVyLmNvbW1lbnRTdGFydHNbaV07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbW1lbnRSZWNvcmRlclNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29tbWVudFJlY29yZGVyU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBjZjA5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29tbWVudFJlY29yZGVyU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7Ci0KLS8qKgotICogSW50ZXJuYWwgc2Nhbm5lciB1c2VkIGZvciBET00gQVNUIG5vZGVzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50UmVjb3JkZXJTY2FubmVyIGV4dGVuZHMgU2Nhbm5lciB7Ci0KLQlwdWJsaWMgQ29tbWVudFJlY29yZGVyU2Nhbm5lcigKLQkJYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLAotCQlib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwKLQkJYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzLAotCQlsb25nIHNvdXJjZUxldmVsLAotCQljaGFyW11bXSB0YXNrVGFncywKLQkJY2hhcltdW10gdGFza1ByaW9yaXRpZXMsCi0JCWJvb2xlYW4gaXNUYXNrQ2FzZVNlbnNpdGl2ZSkgewotCQlzdXBlcih0b2tlbml6ZUNvbW1lbnRzLCB0b2tlbml6ZVdoaXRlU3BhY2UsIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIHNvdXJjZUxldmVsLCB0YXNrVGFncywgdGFza1ByaW9yaXRpZXMsIGlzVGFza0Nhc2VTZW5zaXRpdmUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgc3RhcnQgcG9zaXRpb24gbmVnYXRpdmUgZm9yIGxpbmUgY29tbWVudHMuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXIjcmVjb3JkQ29tbWVudChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVjb3JkQ29tbWVudChpbnQgdG9rZW4pIHsKLQkJc3VwZXIucmVjb3JkQ29tbWVudCh0b2tlbik7Ci0JCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVDT01NRU5UX0xJTkUpIHsKLQkJCS8vIGZvciBjb21tZW50IGxpbmUgYm90aCBwb3NpdGlvbnMgYXJlIG5lZ2F0aXZlCi0JCQl0aGlzLmNvbW1lbnRTdGFydHNbdGhpcy5jb21tZW50UHRyXSA9IC10aGlzLmNvbW1lbnRTdGFydHNbdGhpcy5jb21tZW50UHRyXTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbC5qYXZhCmluZGV4IDFmYzIzNTUuLmFlZWVlMjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCwxMSArMTgsMTEgQEAKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUNvbnN0YW50UG9vbC4KICAqLwogcHVibGljIGNsYXNzIENvbnN0YW50UG9vbCBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElDb25zdGFudFBvb2wgewotCQorCiAJcHJpdmF0ZSBpbnQgY29uc3RhbnRQb29sQ291bnQ7CiAJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXQ7CiAJcHJpdmF0ZSBieXRlW10gY2xhc3NGaWxlQnl0ZXM7Ci0JCisKIAlDb25zdGFudFBvb2woYnl0ZVtdIHJlZmVyZW5jZSwgaW50W10gY29uc3RhbnRQb29sT2Zmc2V0KSB7CiAJCXRoaXMuY29uc3RhbnRQb29sQ291bnQgPSBjb25zdGFudFBvb2xPZmZzZXQubGVuZ3RoOwogCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldDsKQEAgLTQzLDcgKzQzLDcgQEAKIAkJCQljb25zdGFudFBvb2xFbnRyeS5zZXRDbGFzc0luZm9OYW1lKGdldFV0ZjhWYWx1ZUF0KGNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5mb05hbWVJbmRleCgpKSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Eb3VibGUgOgotCQkJCWNvbnN0YW50UG9vbEVudHJ5LnNldERvdWJsZVZhbHVlKGRvdWJsZUF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQljb25zdGFudFBvb2xFbnRyeS5zZXREb3VibGVWYWx1ZShkb3VibGVBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmIDoKIAkJCQljb25zdGFudFBvb2xFbnRyeS5zZXRDbGFzc0luZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOwpAQCAtNjcsMTMgKzY3LDEzIEBACiAJCQkJY29uc3RhbnRQb29sRW50cnkuc2V0TWV0aG9kRGVzY3JpcHRvcihnZXRVdGY4VmFsdWVBdChtZXRob2REZXNjcmlwdG9ySW5kZXgpKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0IDoKLQkJCQljb25zdGFudFBvb2xFbnRyeS5zZXRGbG9hdFZhbHVlKGZsb2F0QXQoY2xhc3NGaWxlQnl0ZXMsIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOworCQkJCWNvbnN0YW50UG9vbEVudHJ5LnNldEZsb2F0VmFsdWUoZmxvYXRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXIgOgotCQkJCWNvbnN0YW50UG9vbEVudHJ5LnNldEludGVnZXJWYWx1ZShpNEF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQljb25zdGFudFBvb2xFbnRyeS5zZXRJbnRlZ2VyVmFsdWUoaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0xvbmcgOgotCQkJCWNvbnN0YW50UG9vbEVudHJ5LnNldExvbmdWYWx1ZShpOEF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQljb25zdGFudFBvb2xFbnRyeS5zZXRMb25nVmFsdWUoaThBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX05hbWVBbmRUeXBlIDoKIAkJCQljb25zdGFudFBvb2xFbnRyeS5zZXROYW1lQW5kVHlwZU5hbWVJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKQEAgLTEwMSwxMSArMTAxLDExIEBACiAJICogQHNlZSBJQ29uc3RhbnRQb29sI2dldEVudHJ5S2luZChpbnQpCiAJICovCiAJcHVibGljIGludCBnZXRFbnRyeUtpbmQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKTsKKwkJcmV0dXJuIHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKTsKIAl9CiAKIAlwcml2YXRlIGNoYXJbXSBnZXRVdGY4VmFsdWVBdChpbnQgdXRmOEluZGV4KSB7CiAJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdXRmOEluZGV4XTsKLQkJcmV0dXJuIHV0ZjhBdChjbGFzc0ZpbGVCeXRlcywgMCwgdXRmOE9mZnNldCArIDMsIHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDAsIHV0ZjhPZmZzZXQgKyAxKSk7CisJCXJldHVybiB1dGY4QXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgdXRmOE9mZnNldCArIDMsIHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgdXRmOE9mZnNldCArIDEpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKaW5kZXggZWFjMzE4MS4uNTVjYzE3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sRW50cnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJQ29uc3RhbnRQb29sRW50cnkKLSAqIAorICoKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGNsYXNzIENvbnN0YW50UG9vbEVudHJ5IGltcGxlbWVudHMgSUNvbnN0YW50UG9vbEVudHJ5IHsKQEAgLTM5LDcgKzM5LDcgQEAKIAlwcml2YXRlIGNoYXJbXSB1dGY4VmFsdWU7CiAJcHJpdmF0ZSBpbnQgdXRmOExlbmd0aDsKIAlwcml2YXRlIGNoYXJbXSBjbGFzc0luZm9OYW1lOwotCQorCiAJcHVibGljIENvbnN0YW50UG9vbEVudHJ5KCkgewogCQl0aGlzLmNsYXNzSW5mb05hbWVJbmRleCA9IC0xOwogCQl0aGlzLmNsYXNzSW5kZXggPSAtMTsKQEAgLTU5LDkgKzU5LDkgQEAKIAkJdGhpcy5tZXRob2REZXNjcmlwdG9yID0gbnVsbDsKIAkJdGhpcy51dGY4VmFsdWUgPSBudWxsOwogCQl0aGlzLnV0ZjhMZW5ndGggPSAtMTsKLQkJdGhpcy5jbGFzc0luZm9OYW1lID0gbnVsbDsJCQorCQl0aGlzLmNsYXNzSW5mb05hbWUgPSBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldEtpbmQoKQogCSAqLwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJICogQHJldHVybiBSZXR1cm5zIGEgaW50CiAJICovCiAJcHVibGljIGludCBnZXROYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleCgpIHsKLQkJcmV0dXJuIG5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4OworCQlyZXR1cm4gdGhpcy5uYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleDsKIAl9CiAKIAkvKioKQEAgLTI5Niw3ICsyOTYsNyBAQAogCSAqIEByZXR1cm4gUmV0dXJucyBhIGludAogCSAqLwogCXB1YmxpYyBpbnQgZ2V0TmFtZUFuZFR5cGVOYW1lSW5kZXgoKSB7Ci0JCXJldHVybiBuYW1lQW5kVHlwZU5hbWVJbmRleDsKKwkJcmV0dXJuIHRoaXMubmFtZUFuZFR5cGVOYW1lSW5kZXg7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDY0NTZjMzEuLmQwZDQ4MGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDExICsyMSwxMSBAQAogcHVibGljIGNsYXNzIENvbnN0YW50VmFsdWVBdHRyaWJ1dGUKIAlleHRlbmRzIENsYXNzRmlsZUF0dHJpYnV0ZQogCWltcGxlbWVudHMgSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgewotCQorCiAJcHJpdmF0ZSBpbnQgY29uc3RhbnRWYWx1ZUluZGV4OwogCXByaXZhdGUgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5OwogCi0JCisKIAlDb25zdGFudFZhbHVlQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CiAJCXRoaXMuY29uc3RhbnRWYWx1ZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRE9NRmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0RPTUZpbmRlci5qYXZhCmluZGV4IGIwMGUyZTMuLmY1NmNlNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRE9NRmluZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9ET01GaW5kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiwyOSArMjYsMzMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZVBhcmFtZXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVJlZkVsZW1lbnQ7CiAKIHB1YmxpYyBjbGFzcyBET01GaW5kZXIgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKLQkKKwogCXB1YmxpYyBBU1ROb2RlIGZvdW5kTm9kZSA9IG51bGw7CiAJcHVibGljIElCaW5kaW5nIGZvdW5kQmluZGluZyA9IG51bGw7Ci0JCisKIAlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBhc3Q7CiAJcHJpdmF0ZSBTb3VyY2VSZWZFbGVtZW50IGVsZW1lbnQ7CiAJcHJpdmF0ZSBib29sZWFuIHJlc29sdmVCaW5kaW5nOwogCXByaXZhdGUgaW50IHJhbmdlU3RhcnQgPSAtMSwgcmFuZ2VMZW5ndGggPSAwOwotCQorCiAJcHVibGljIERPTUZpbmRlcihDb21waWxhdGlvblVuaXQgYXN0LCBTb3VyY2VSZWZFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmcpIHsKIAkJdGhpcy5hc3QgPSBhc3Q7CiAJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAJCXRoaXMucmVzb2x2ZUJpbmRpbmcgPSByZXNvbHZlQmluZGluZzsKIAl9Ci0JCisKIAlwcm90ZWN0ZWQgYm9vbGVhbiBmb3VuZChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgbmFtZSkgewogCQlpZiAobmFtZS5nZXRTdGFydFBvc2l0aW9uKCkgPT0gdGhpcy5yYW5nZVN0YXJ0ICYmIG5hbWUuZ2V0TGVuZ3RoKCkgPT0gdGhpcy5yYW5nZUxlbmd0aCkgewogCQkJdGhpcy5mb3VuZE5vZGUgPSBub2RlOwpAQCAtNTYsNyArNjAsNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwdWJsaWMgQVNUTm9kZSBzZWFyY2goKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKIAkJaWYgKHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIgJiYgISh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBJSW5pdGlhbGl6ZXIpKQpAQCAtNjgsMjUgKzcyLDI4IEBACiAJCXRoaXMuYXN0LmFjY2VwdCh0aGlzKTsKIAkJcmV0dXJuIHRoaXMuZm91bmROb2RlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlpZiAoZm91bmQobm9kZSwgbm9kZS5nZXROYW1lKCkpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpIAorCQlpZiAoZm91bmQobm9kZSwgbm9kZS5nZXROYW1lKCkpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpCiAJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykgCisJCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykKIAkJCXRoaXMuZm91bmRCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKIAkJQVNUTm9kZSBuYW1lOwogCQlBU1ROb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7CiAJCXN3aXRjaCAocGFyZW50LmdldE5vZGVUeXBlKCkpIHsKIAkJCWNhc2UgQVNUTm9kZS5DTEFTU19JTlNUQU5DRV9DUkVBVElPTjoKIAkJCQluYW1lID0gKChDbGFzc0luc3RhbmNlQ3JlYXRpb24pIHBhcmVudCkuZ2V0VHlwZSgpOworCQkJCWlmIChuYW1lLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QQVJBTUVURVJJWkVEX1RZUEUpIHsKKwkJCQkJbmFtZSA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIG5hbWUpLmdldFR5cGUoKTsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFTVE5vZGUuRU5VTV9DT05TVEFOVF9ERUNMQVJBVElPTjoKIAkJCQluYW1lID0gKChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgcGFyZW50KS5nZXROYW1lKCk7CkBAIC05OCw1NyArMTA1LDc1IEBACiAJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQlpZiAoZm91bmQobm9kZSwgbm9kZS5nZXROYW1lKCkpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpIAorCQlpZiAoZm91bmQobm9kZSwgbm9kZS5nZXROYW1lKCkpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpCiAJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZVZhcmlhYmxlKCk7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KEVudW1EZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykgCisJCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykKIAkJCXRoaXMuZm91bmRCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWlmIChmb3VuZChub2RlLCBub2RlKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKSAKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpCiAJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewogCQkvLyBub3RlIHRoYXQgbm8gYmluZGluZyBleGlzdHMgZm9yIGFuIEluaXRpYWxpemVyCiAJCWZvdW5kKG5vZGUsIG5vZGUpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpCisJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZUFubm90YXRpb25CaW5kaW5nKCk7CisJCXJldHVybiB0cnVlOworCX0KKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJaWYgKGZvdW5kKG5vZGUsIG5vZGUuZ2V0TmFtZSgpKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKSAKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUuZ2V0TmFtZSgpKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKQogCQkJdGhpcy5mb3VuZEJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKworCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgeworCQlpZiAoZm91bmQobm9kZSwgbm9kZSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykKKwkJCXRoaXMuZm91bmRCaW5kaW5nID0gbm9kZS5yZXNvbHZlQW5ub3RhdGlvbkJpbmRpbmcoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJaWYgKGZvdW5kKG5vZGUsIG5vZGUpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpIAorCQlpZiAoZm91bmQobm9kZSwgbm9kZSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykKIAkJCXRoaXMuZm91bmRCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpCisJCQl0aGlzLmZvdW5kQmluZGluZyA9IG5vZGUucmVzb2x2ZUFubm90YXRpb25CaW5kaW5nKCk7CisJCXJldHVybiB0cnVlOworCX0KKwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykgCisJCWlmIChmb3VuZChub2RlLCBub2RlLmdldE5hbWUoKSkgJiYgdGhpcy5yZXNvbHZlQmluZGluZykKIAkJCXRoaXMuZm91bmRCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKLQkJaWYgKGZvdW5kKG5vZGUsIG5vZGUuZ2V0TmFtZSgpKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKSAKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUuZ2V0TmFtZSgpKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKQogCQkJdGhpcy5mb3VuZEJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewkJCQkJCQotCQlpZiAoZm91bmQobm9kZSwgbm9kZS5nZXROYW1lKCkpICYmIHRoaXMucmVzb2x2ZUJpbmRpbmcpIAorCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKKwkJaWYgKGZvdW5kKG5vZGUsIG5vZGUuZ2V0TmFtZSgpKSAmJiB0aGlzLnJlc29sdmVCaW5kaW5nKQogCQkJdGhpcy5mb3VuZEJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGVmYXVsdEJ5dGVjb2RlVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKaW5kZXggZjEzZTg1MC4uZDk0ZGQ0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksOCArMTksOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JT3Bjb2RlTW5lbW9uaWNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuT3Bjb2RlU3RyaW5nVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU9wY29kZU1uZW1vbmljczsKIAogLyoqCiAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEJ5dGVDb2RlVmlzaXRvcgpAQCAtNDEsMTcgKzQxLDIwIEBACiAJcHJpdmF0ZSBTdHJpbmcgbGluZVNlcGFyYXRvcjsKIAlwcml2YXRlIGludCB0YWJOdW1iZXI7CiAJcHJpdmF0ZSBpbnQgZGlnaXROdW1iZXJGb3JQQzsKLSAgICBwcml2YXRlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXM7Ci0gICAgcHJpdmF0ZSBpbnQgbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZUxlbmd0aDsKKwlwcml2YXRlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXM7CisJcHJpdmF0ZSBpbnQgbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZUxlbmd0aDsKIAlwcml2YXRlIGludCBtb2RlOwotCQotCXB1YmxpYyBEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yKElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgeworCXByaXZhdGUgY2hhcltdW10gcGFyYW1ldGVyTmFtZXM7CisJcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljOworCXByaXZhdGUgaW50W10gYXJndW1lbnRTaXplczsKKworCXB1YmxpYyBEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yKElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW10gbWV0aG9kRGVzY3JpcHRvciwgYm9vbGVhbiBpc1N0YXRpYywgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CiAJCUlMb2NhbFZhcmlhYmxlQXR0cmlidXRlIGxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExvY2FsVmFyaWFibGVBdHRyaWJ1dGUoKTsKIAkJdGhpcy5sb2NhbFZhcmlhYmxlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSA9PSBudWxsID8gMCA6IGxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuZ2V0TG9jYWxWYXJpYWJsZVRhYmxlTGVuZ3RoKCk7CiAJCWlmICh0aGlzLmxvY2FsVmFyaWFibGVBdHRyaWJ1dGVMZW5ndGggIT0gMCkgewogCQkJdGhpcy5sb2NhbFZhcmlhYmxlVGFibGVFbnRyaWVzID0gbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5nZXRMb2NhbFZhcmlhYmxlVGFibGUoKTsKIAkJfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMubG9jYWxWYXJpYWJsZVRhYmxlRW50cmllcyA9IG51bGw7CisJCQl0aGlzLmxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXMgPSBudWxsOwogCQl9CiAJCXRoaXMuYnVmZmVyID0gYnVmZmVyOwogCQl0aGlzLmxpbmVTZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yOwpAQCAtNTksMTMgKzYyLDI1IEBACiAJCWxvbmcgY29kZUxlbmd0aCA9IGNvZGVBdHRyaWJ1dGUuZ2V0Q29kZUxlbmd0aCgpOwogCQl0aGlzLmRpZ2l0TnVtYmVyRm9yUEMgPSBMb25nLnRvU3RyaW5nKGNvZGVMZW5ndGgpLmxlbmd0aCgpOwogCQl0aGlzLm1vZGUgPSBtb2RlOworCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gcGFyYW1ldGVyTmFtZXM7CisJCXRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKKwkJLy8gY29tcHV0ZSBhcmd1bWVudCBzaXplcworCQlpZiAocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgeworCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kRGVzY3JpcHRvcik7CisJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOworCQkJdGhpcy5hcmd1bWVudFNpemVzID0gbmV3IGludFtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbaV07CisJCQkJdGhpcy5hcmd1bWVudFNpemVzW2ldID0gcGFyYW1ldGVyVHlwZS5sZW5ndGggPT0gMSAmJiAocGFyYW1ldGVyVHlwZVswXSA9PSAnRCcgfHwgcGFyYW1ldGVyVHlwZVswXSA9PSAnSicpID8gMiA6IDE7CisJCQl9CisJCX0KIAl9CiAJLyoqCiAJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hYWxvYWQoaW50KQogCSAqLwogCXB1YmxpYyB2b2lkIF9hYWxvYWQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUFMT0FEXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BQUxPQURdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCXByaXZhdGUgdm9pZCBkdW1wUGNOdW1iZXIoaW50IHBjKSB7CkBAIC03NSwxMCArOTAsMTAgQEAKIAkJCWRpZ2l0Rm9yUEMgPSBJbnRlZ2VyLnRvU3RyaW5nKHBjKS5sZW5ndGgoKTsKIAkJfQogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5kaWdpdE51bWJlckZvclBDIC0gZGlnaXRGb3JQQzsgaSA8IG1heDsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoJyAnKTsKIAkJfQotCQlidWZmZXIuYXBwZW5kKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfaW5kZW50YXRpb24pOyAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKHBjKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbmRlbnRhdGlvbik7CiAJfQogCiAJLyoqCkBAIC04Niw3ICsxMDEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hYXN0b3JlKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFBU1RPUkVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFBU1RPUkVdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC05NSw3ICsxMTAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hY29uc3RfbnVsbChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BQ09OU1RfTlVMTF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUNPTlNUX05VTExdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xMDQsNyArMTE5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYWxvYWRfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsCisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsCiAJCQluZXcgU3RyaW5nW10gewogCQkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFMT0FEXzBdLAogCQkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAwKQpAQCAtMTE3LDcgKzEzMiw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Fsb2FkXzEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURfMV0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMSkKIAkJfSkpOwpAQCAtMTI5LDcgKzE0NCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Fsb2FkXzIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURfMl0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMikKIAkJfSkpOwpAQCAtMTQxLDcgKzE1Niw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Fsb2FkXzMoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURfM10sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMykKIAkJfSkpOwpAQCAtMTUzLDcgKzE2OCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Fsb2FkKGludCBwYywgaW50IGluZGV4KSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIGluZGV4LCB0cnVlKQogCQl9KSk7CkBAIC0xNjUsNyArMTgwLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYW5ld2FycmF5KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIKKwkJdGhpcy5idWZmZXIKIAkJCS5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9hbmV3YXJyYXksIG5ldyBTdHJpbmdbXSB7CiAJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQU5FV0FSUkFZXSwKIAkJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKQEAgLTE3OSw3ICsxOTQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hcmV0dXJuKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFSRVRVUk5dKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFSRVRVUk5dKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xODgsNyArMjAzLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYXJyYXlsZW5ndGgoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVJSQVlMRU5HVEhdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFSUkFZTEVOR1RIXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTk3LDcgKzIxMiw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2FzdG9yZV8wKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVNUT1JFXzBdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDApCiAJCX0pKTsKQEAgLTIwOSw3ICsyMjQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hc3RvcmVfMShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV8xXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAxKQogCQl9KSk7CkBAIC0yMTgsMzcgKzIzMyw3MCBAQAogCXByaXZhdGUgU3RyaW5nIGdldExvY2FsVmFyaWFibGVOYW1lKGludCBwYywgaW50IGluZGV4KSB7CiAJCXJldHVybiBnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgaW5kZXgsIGZhbHNlKTsKIAl9Ci0JCisKIAlwcml2YXRlIFN0cmluZyBnZXRMb2NhbFZhcmlhYmxlTmFtZShpbnQgcGMsIGludCBpbmRleCwgYm9vbGVhbiBzaG93SW5kZXgpIHsKLSAgICAgICAgaW50IG5leHRQQyA9IHBjICsgMTsKLSAgICAgICAgc3dpdGNoKGluZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgbmV4dFBDID0gaW5kZXggPD0gMjU1ID8gcGMgKyAyIDogcGMgKyAzOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmxvY2FsVmFyaWFibGVBdHRyaWJ1dGVMZW5ndGg7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IGVudHJ5ID0gdGhpcy5sb2NhbFZhcmlhYmxlVGFibGVFbnRyaWVzW2ldOwotICAgICAgICAgICAgZmluYWwgaW50IHN0YXJ0UEMgPSBlbnRyeS5nZXRTdGFydFBDKCk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0SW5kZXgoKSA9PSBpbmRleCAmJiAoc3RhcnRQQyA8PSBuZXh0UEMpICYmICgoc3RhcnRQQyArIGVudHJ5LmdldExlbmd0aCgpKSA+IG5leHRQQykpIHsKLSAgICAgICAgICAgIAlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgCWlmIChzaG93SW5kZXgpIHsKLSAgICAgICAgICAgIAkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoJ1snKS5hcHBlbmQoZW50cnkuZ2V0TmFtZSgpKS5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIAlyZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RyaW5nQnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAlpZiAoc2hvd0luZGV4KSB7Ci0gICAgICAgIAlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAJc3RyaW5nQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgICAJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0cmluZ0J1ZmZlcik7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIEVNUFRZX0xPQ0FMX05BTUU7CisJCWludCBuZXh0UEMgPSBwYyArIDE7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwIDoKKwkJCWNhc2UgMSA6CisJCQljYXNlIDIgOgorCQkJY2FzZSAzIDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCW5leHRQQyA9IGluZGV4IDw9IDI1NSA/IHBjICsgMiA6IHBjICsgMzsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmxvY2FsVmFyaWFibGVBdHRyaWJ1dGVMZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJZmluYWwgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IGVudHJ5ID0gdGhpcy5sb2NhbFZhcmlhYmxlVGFibGVFbnRyaWVzW2ldOworCQkJZmluYWwgaW50IHN0YXJ0UEMgPSBlbnRyeS5nZXRTdGFydFBDKCk7CisJCQlpZiAoZW50cnkuZ2V0SW5kZXgoKSA9PSBpbmRleCAmJiAoc3RhcnRQQyA8PSBuZXh0UEMpICYmICgoc3RhcnRQQyArIGVudHJ5LmdldExlbmd0aCgpKSA+IG5leHRQQykpIHsKKwkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCWlmIChzaG93SW5kZXgpIHsKKwkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnICcpLmFwcGVuZChpbmRleCk7CisJCQkJfQorCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoJ1snKS5hcHBlbmQoZW50cnkuZ2V0TmFtZSgpKS5hcHBlbmQoJ10nKTsKKwkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RyaW5nQnVmZmVyKTsKKwkJCX0KKwkJfQorCQlpZiAodGhpcy5wYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7CisJCQlpZiAoaW5kZXggPT0gMCkgeworCQkJCWlmICghdGhpcy5pc1N0YXRpYykgeworCQkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcgJykuYXBwZW5kKCdbJykuYXBwZW5kKCJ0aGlzIikuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0cmluZ0J1ZmZlcik7CisJCQkJfQorCQkJfQorCQkJaW50IGluZGV4SW5QYXJhbWV0ZXJOYW1lcyA9IGluZGV4OworCQkJaWYgKGluZGV4ICE9IDApIHsKKwkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IDA7CisJCQkJaWYgKCF0aGlzLmlzU3RhdGljKSB7CisJCQkJCXJlc29sdmVkUG9zaXRpb24gPSAxOworCQkJCX0KKwkJCQlpbnQgaSA9IDA7CisJCQkJbG9vcDogZm9yIChpbnQgbWF4ID0gdGhpcy5hcmd1bWVudFNpemVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCWlmIChpbmRleCA9PSByZXNvbHZlZFBvc2l0aW9uKSB7CisJCQkJCQlicmVhayBsb29wOworCQkJCQl9CisJCQkJCXJlc29sdmVkUG9zaXRpb24gKz0gdGhpcy5hcmd1bWVudFNpemVzW2ldOworCQkJCX0KKwkJCQlpbmRleEluUGFyYW1ldGVyTmFtZXMgPSBpOworCQkJfQorCQkJaWYgKGluZGV4SW5QYXJhbWV0ZXJOYW1lcyA8IHRoaXMucGFyYW1ldGVyTmFtZXMubGVuZ3RoCisJCQkJCSYmIHRoaXMucGFyYW1ldGVyTmFtZXNbaW5kZXhJblBhcmFtZXRlck5hbWVzXSAhPSBudWxsKSB7CisJCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZiAoc2hvd0luZGV4KSB7CisJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoaW5kZXgpOworCQkJCX0KKwkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcgJykuYXBwZW5kKCdbJykuYXBwZW5kKHRoaXMucGFyYW1ldGVyTmFtZXNbaW5kZXhJblBhcmFtZXRlck5hbWVzXSkuYXBwZW5kKCddJyk7CisJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0cmluZ0J1ZmZlcik7CisJCQl9CisJCX0KKwkJaWYgKHNob3dJbmRleCkgeworCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKS5hcHBlbmQoaW5kZXgpOworCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0cmluZ0J1ZmZlcik7CisJCX0KKwkJcmV0dXJuIEVNUFRZX0xPQ0FMX05BTUU7CiAJfQogCiAJLyoqCkBAIC0yNTYsNyArMzA0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYXN0b3JlXzIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BU1RPUkVfMl0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMikKIAkJfSkpOwpAQCAtMjY4LDcgKzMxNiw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2FzdG9yZV8zKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVNUT1JFXzNdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDMpCiAJCX0pKTsKQEAgLTI4MCw3ICszMjgsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgaW5kZXgsIHRydWUpCiAJCX0pKTsKQEAgLTI5Miw3ICszNDAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9hdGhyb3coaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVRIUk9XXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BVEhST1ddKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0zMDEsNyArMzQ5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYmFsb2FkKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJBTE9BRF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQkFMT0FEXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMzEwLDE3ICszNTgsMTcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYmFzdG9yZShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5CQVNUT1JFXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5CQVNUT1JFXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYmlwdXNoKGludCwgYnl0ZSkKIAkgKi8KIAlwdWJsaWMgdm9pZCBfYmlwdXNoKGludCBwYywgYnl0ZSBfYnl0ZSkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJJUFVTSF0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5CSVBVU0hdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKF9ieXRlKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMzMwLDcgKzM3OCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2NhbG9hZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5DQUxPQURdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkNBTE9BRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTMzOSw3ICszODcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9jYXN0b3JlKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkNBU1RPUkVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkNBU1RPUkVdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0zNDgsNyArMzk2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfY2hlY2tjYXN0KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIKKwkJdGhpcy5idWZmZXIKIAkJCS5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9jaGVja2Nhc3QsIG5ldyBTdHJpbmdbXSB7CiAJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQ0hFQ0tDQVNUXSwKIAkJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKQEAgLTM2Miw3ICs0MTAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kMmYoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRDJGXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EMkZdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0zNzEsNyArNDE5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZDJpKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkQySV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRDJJXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMzgwLDcgKzQyOCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2QybChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EMkxdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkQyTF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTM4OSw3ICs0MzcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kYWRkKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRBRERdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRBRERdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0zOTgsNyArNDQ2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZGFsb2FkKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRBTE9BRF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuREFMT0FEXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNDA3LDcgKzQ1NSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Rhc3RvcmUoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuREFTVE9SRV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuREFTVE9SRV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTQxNiw3ICs0NjQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kY21wZyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQ01QR10pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRENNUEddKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC00MjUsNyArNDczLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZGNtcGwoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRENNUExdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRDTVBMXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNDM0LDcgKzQ4Miw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Rjb25zdF8wKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRDT05TVF8wXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQ09OU1RfMF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTQ0Myw3ICs0OTEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kY29uc3RfMShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQ09OU1RfMV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRENPTlNUXzFdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC00NTIsNyArNTAwLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZGRpdihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5ERElWXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5ERElWXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNDYxLDcgKzUwOSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Rsb2FkXzAoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXzBdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDApCiAJCX0pKTsKQEAgLTQ3Myw3ICs1MjEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kbG9hZF8xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXzFdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDEpCiAJCX0pKTsKQEAgLTQ4NSwxOSArNTMzLDE5IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Rsb2FkXzIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRExPQURfMl0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMikKIAkJfSkpOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rsb2FkXzMoaW50KQogCSAqLwogCXB1YmxpYyB2b2lkIF9kbG9hZF8zKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXzNdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDMpCiAJCX0pKTsKQEAgLTUwOSw3ICs1NTcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kbG9hZChpbnQgcGMsIGludCBpbmRleCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCBpbmRleCwgdHJ1ZSkKIAkJfSkpOwpAQCAtNTIxLDcgKzU2OSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2RtdWwoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRE1VTF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRE1VTF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTUzMCw3ICs1NzgsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kbmVnKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRORUddKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRORUddKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC01MzksNyArNTg3LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHJlbShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EUkVNXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EUkVNXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNTQ4LDcgKzU5Niw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2RyZXR1cm4oaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFJFVFVSTl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFJFVFVSTl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTU1Nyw3ICs2MDUsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kc3RvcmVfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRTVE9SRV8wXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAwKQogCQl9KSk7CkBAIC01NjksNyArNjE3LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHN0b3JlXzEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1RPUkVfMV0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMSkKIAkJfSkpOwpAQCAtNTgxLDcgKzYyOSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2RzdG9yZV8yKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFNUT1JFXzJdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDIpCiAJCX0pKTsKQEAgLTU5Myw3ICs2NDEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kc3RvcmVfMyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRTVE9SRV8zXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAzKQogCQl9KSk7CkBAIC02MDUsNyArNjUzLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHN0b3JlKGludCBwYywgaW50IGluZGV4KSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1RPUkVdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIGluZGV4LCB0cnVlKQogCQl9KSk7CkBAIC02MTcsNyArNjY1LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHN1YihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1VCXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1VCXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNjI2LDcgKzY3NCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2R1cF94MShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVBfWDFdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUF9YMV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTYzNSw3ICs2ODMsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kdXBfeDIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQX1gyXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVBfWDJdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC02NDQsNyArNjkyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHVwKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNjUzLDcgKzcwMSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2R1cDJfeDEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQMl9YMV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQMl9YMV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTY2Miw3ICs3MTAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9kdXAyX3gyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUDJfWDJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUDJfWDJdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC02NzEsNyArNzE5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZHVwMihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVAyXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVAyXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNjgwLDcgKzcyOCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2YyZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GMkRdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkYyRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTY4OSwxNiArNzM3LDE2IEBACiAJICovCiAJcHVibGljIHZvaWQgX2YyaShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GMkldKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkYySV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2YybChpbnQpCiAJICovCiAJcHVibGljIHZvaWQgX2YybChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GMkxdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkYyTF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTcwNywxNiArNzU1LDE2IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZhZGQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkFERF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkFERF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZhbG9hZChpbnQpCiAJICovCiAJcHVibGljIHZvaWQgX2ZhbG9hZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQUxPQURdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZBTE9BRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTcyNSw3ICs3NzMsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mYXN0b3JlKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZBU1RPUkVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZBU1RPUkVdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC03MzQsNyArNzgyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmNtcGcoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkNNUEddKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZDTVBHXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNzQzLDcgKzc5MSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZjbXBsKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZDTVBMXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQ01QTF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTc1Miw3ICs4MDAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mY29uc3RfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQ09OU1RfMF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkNPTlNUXzBdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC03NjEsNyArODA5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmNvbnN0XzEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkNPTlNUXzFdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZDT05TVF8xXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtNzcwLDcgKzgxOCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2Zjb25zdF8yKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZDT05TVF8yXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQ09OU1RfMl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTc3OSw3ICs4MjcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mZGl2KGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZESVZdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZESVZdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC03ODgsNyArODM2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmxvYWRfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF8wXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAwKQogCQl9KSk7CkBAIC04MDAsNyArODQ4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmxvYWRfMShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF8xXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAxKQogCQl9KSk7CkBAIC04MTIsNyArODYwLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmxvYWRfMihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF8yXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAyKQogCQl9KSk7CkBAIC04MjQsNyArODcyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmxvYWRfMyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF8zXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAzKQogCQl9KSk7CkBAIC04MzYsNyArODg0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZmxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgaW5kZXgsIHRydWUpCiAJCX0pKTsKQEAgLTg0OCw3ICs4OTYsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mbXVsKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZNVUxdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZNVUxdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC04NTcsMTYgKzkwNSwxNiBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mbmVnKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZORUddKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZORUddKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQotCQorCiAJLyoqCiAJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mcmVtKGludCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZnJlbShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GUkVNXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GUkVNXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtODc1LDcgKzkyMyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZyZXR1cm4oaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlJFVFVSTl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlJFVFVSTl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTg4NCw3ICs5MzIsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mc3RvcmVfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GU1RPUkVfMF0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMCkKIAkJfSkpOwpAQCAtODk2LDcgKzk0NCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZzdG9yZV8xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlNUT1JFXzFdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDEpCiAJCX0pKTsKQEAgLTkwOCw3ICs5NTYsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9mc3RvcmVfMihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZTVE9SRV8yXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAyKQogCQl9KSk7CkBAIC05MjAsNyArOTY4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZnN0b3JlXzMoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GU1RPUkVfM10sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMykKIAkJfSkpOwpAQCAtOTMyLDcgKzk4MCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZzdG9yZShpbnQgcGMsIGludCBpbmRleCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlNUT1JFXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCBpbmRleCwgdHJ1ZSkKIAkJfSkpOwpAQCAtOTQ0LDcgKzk5Miw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2ZzdWIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlNVQl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlNVQl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTk1Myw3ICsxMDAxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZ2V0ZmllbGQoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9nZXRmaWVsZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfZ2V0ZmllbGQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5HRVRGSUVMRF0sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXJldHVybkRlY2xhcmluZ0NsYXNzTmFtZShjb25zdGFudEZpZWxkcmVmKSwKQEAgLTk2OCw3ICsxMDE2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZ2V0c3RhdGljKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRGaWVsZHJlZikgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfZ2V0c3RhdGljLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9nZXRzdGF0aWMsIG5ldyBTdHJpbmdbXSB7CiAJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuR0VUU1RBVElDXSwKIAkJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCQlyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRGaWVsZHJlZiksCkBAIC05ODMsOCArMTAzMSw4IEBACiAJICovCiAJcHVibGljIHZvaWQgX2dvdG9fdyhpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5HT1RPX1ddKQotCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuR09UT19XXSkKKwkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKQogCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KQEAgLTk5NCw4ICsxMDQyLDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfZ290byhpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5HT1RPXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkdPVE9dKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTAwNSw3ICsxMDUzLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJiKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyQl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJCXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTAxNCw3ICsxMDYyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJjKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyQ10pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJDXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTAyMyw3ICsxMDcxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJkKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyRF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJEXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTAzMiw3ICsxMDgwLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJmKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyRl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJGXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA0MSw3ICsxMDg5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJsKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyTF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJMXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA1MCw3ICsxMDk4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaTJzKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyU10pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJTXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA1OSw3ICsxMTA3LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWFkZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQUREXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQUREXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA2OCw3ICsxMTE2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWFsb2FkKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklBTE9BRF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUFMT0FEXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA3Nyw3ICsxMTI1LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWFuZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQU5EXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQU5EXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA4Niw3ICsxMTM0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWFzdG9yZShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQVNUT1JFXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQVNUT1JFXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTA5NSw4ICsxMTQzLDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfYWNtcGVxKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0FDTVBFUV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9BQ01QRVFdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTEwNiw4ICsxMTU0LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfYWNtcG5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0FDTVBORV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9BQ01QTkVdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTExNyw4ICsxMTY1LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcGVxKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBFUV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QRVFdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTEyOCw4ICsxMTc2LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcGdlKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBHRV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QR0VdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTEzOSw4ICsxMTg3LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcGd0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBHVF0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QR1RdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTE1MCw4ICsxMTk4LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcGxlKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBMRV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTEVdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTE2MSw4ICsxMjA5LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcGx0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBMVF0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTFRdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTE3Miw4ICsxMjIwLDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZfaWNtcG5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBORV0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTkVdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTE4Myw3ICsxMjMxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzAoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzBdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8wXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTE5Miw3ICsxMjQwLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzFdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8xXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTIwMSw3ICsxMjQ5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8yXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTIxMCw3ICsxMjU4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzMoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzNdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8zXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTIxOSw3ICsxMjY3LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzRdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF80XSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTIyOCw3ICsxMjc2LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0XzUoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF81XSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTIzNyw3ICsxMjg1LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWNvbnN0X20xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF9NMV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUX00xXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTI0Niw3ICsxMjk0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWRpdihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRElWXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRElWXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTI1NSw4ICsxMzAzLDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZlcShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkVRXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGRVFdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTI2Niw4ICsxMzE0LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZnZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkdFXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGR0VdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTI3Nyw4ICsxMzI1LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZndChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkdUXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGR1RdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTI4OCw4ICsxMzM2LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZsZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkxFXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTEVdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTI5OSw4ICsxMzQ3LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZsdChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkxUXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTFRdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTMxMCw4ICsxMzU4LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRk5FXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTkVdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTMyMSw4ICsxMzY5LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZub25udWxsKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTk9OTlVMTF0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRk5PTk5VTExdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTMzMiw4ICsxMzgwLDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWZudWxsKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTlVMTF0pCi0JCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRk5VTExdKQorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCiAJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTM0Myw3ICsxMzkxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWluYyhpbnQgcGMsIGludCBpbmRleCwgaW50IF9jb25zdCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfaWluYywgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfaWluYywgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklJTkNdLAogCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKF9jb25zdCksCkBAIC0xMzU3LDcgKzE0MDUsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbG9hZF8wKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklMT0FEXzBdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDApCiAJCX0pKTsKQEAgLTEzNjksNyArMTQxNyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2lsb2FkXzEoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUxPQURfMV0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMSkKIAkJfSkpOwpAQCAtMTM4MSw3ICsxNDI5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfaWxvYWRfMihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTE9BRF8yXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAyKQogCQl9KSk7CkBAIC0xMzkzLDcgKzE0NDEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbG9hZF8zKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklMT0FEXzNdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDMpCiAJCX0pKTsKQEAgLTE0MDUsNyArMTQ1Myw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2lsb2FkKGludCBwYywgaW50IGluZGV4KSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUxPQURdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIGluZGV4LCB0cnVlKQogCQl9KSk7CkBAIC0xNDE3LDcgKzE0NjUsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbXVsKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNVUxdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNVUxdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNDI2LDcgKzE0NzQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbmVnKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklORUddKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklORUddKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNDM1LDE0ICsxNDgzLDM1IEBACiAJICovCiAJcHVibGljIHZvaWQgX2luc3RhbmNlb2YoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnN0YW5jZW9mLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnN0YW5jZW9mLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU5TVEFOQ0VPRl0sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXJldHVybkNvbnN0YW50Q2xhc3NOYW1lKGNvbnN0YW50Q2xhc3MpCiAJCX0pKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQorCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW52b2tlZHluYW1pYyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2ludm9rZWR5bmFtaWMoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlJQ29uc3RhbnRQb29sRW50cnkgbmFtZUVudHJ5LAorCQlJQ29uc3RhbnRQb29sRW50cnkgZGVzY3JpcHRvckVudHJ5KSB7CiAKKwkJZHVtcFBjTnVtYmVyKHBjKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfaW52b2tlZHluYW1pYywgbmV3IFN0cmluZ1tdIHsKKwkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklOVk9LRURZTkFNSUNdLAorCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCisJCQlVdGlsLnRvU3RyaW5nKAorCQkJCW51bGwsCisJCQkJbmFtZUVudHJ5LmdldFV0ZjhWYWx1ZSgpLAorCQkJCWRlc2NyaXB0b3JFbnRyeS5nZXRVdGY4VmFsdWUoKSwKKwkJCQl0cnVlLAorCQkJCWlzQ29tcGFjdCgpKQorCQl9KSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KIAkvKioKIAkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZWludGVyZmFjZShpbnQsIGludCwgYnl0ZSwgSUNvbnN0YW50UG9vbEVudHJ5KQogCSAqLwpAQCAtMTQ1Myw3ICsxNTIyLDcgQEAKIAkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50SW50ZXJmYWNlTWV0aG9kcmVmKSB7CiAKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2ludm9rZWludGVyZmFjZSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfaW52b2tlaW50ZXJmYWNlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU5WT0tFSU5URVJGQUNFXSwKIAkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJSW50ZWdlci50b1N0cmluZyhuYXJncyksCkBAIC0xNDczLDcgKzE1NDIsNyBAQAogCXB1YmxpYyB2b2lkIF9pbnZva2VzcGVjaWFsKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRNZXRob2RyZWYpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKIAkJZmluYWwgU3RyaW5nIHNpZ25hdHVyZSA9IHJldHVybk1ldGhvZFNpZ25hdHVyZShjb25zdGFudE1ldGhvZHJlZik7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnZva2VzcGVjaWFsLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnZva2VzcGVjaWFsLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU5WT0tFU1BFQ0lBTF0sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXNpZ25hdHVyZQpAQCAtMTQ4Niw3ICsxNTU1LDcgQEAKIAlwdWJsaWMgdm9pZCBfaW52b2tlc3RhdGljKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRNZXRob2RyZWYpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKIAkJZmluYWwgU3RyaW5nIHNpZ25hdHVyZSA9IHJldHVybk1ldGhvZFNpZ25hdHVyZShjb25zdGFudE1ldGhvZHJlZik7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnZva2VzdGF0aWMsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2ludm9rZXN0YXRpYywgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklOVk9LRVNUQVRJQ10sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXNpZ25hdHVyZQpAQCAtMTUwMCw3ICsxNTY5LDcgQEAKIAlwdWJsaWMgdm9pZCBfaW52b2tldmlydHVhbChpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKSB7CiAJCWR1bXBQY051bWJlcihwYyk7CiAJCWZpbmFsIFN0cmluZyBzaWduYXR1cmUgPSByZXR1cm5NZXRob2RTaWduYXR1cmUoY29uc3RhbnRNZXRob2RyZWYpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfaW52b2tldmlydHVhbCxuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9pbnZva2V2aXJ0dWFsLG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTlZPS0VWSVJUVUFMXSwKIAkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJc2lnbmF0dXJlCkBAIC0xNTEzLDcgKzE1ODIsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pb3IoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU9SXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JT1JdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNTIyLDcgKzE1OTEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pcmVtKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklSRU1dKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklSRU1dKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNTMxLDcgKzE2MDAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pcmV0dXJuKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklSRVRVUk5dKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklSRVRVUk5dKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNTQwLDcgKzE2MDksNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc2hsKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTSExdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTSExdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNTQ5LDcgKzE2MTgsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc2hyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTSFJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTSFJdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0xNTU4LDcgKzE2MjcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc3RvcmVfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8wXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAwKQogCQl9KSk7CkBAIC0xNTcwLDcgKzE2MzksNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc3RvcmVfMShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8xXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAxKQogCQl9KSk7CkBAIC0xNTgyLDcgKzE2NTEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc3RvcmVfMihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8yXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAyKQogCQl9KSk7CkBAIC0xNTk0LDcgKzE2NjMsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc3RvcmVfMyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8zXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAzKQogCQl9KSk7CkBAIC0xNjA2LDcgKzE2NzUsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9zdG9yZSwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgaW5kZXgsIHRydWUpCiAJCX0pKTsKQEAgLTE2MTgsNyArMTY4Nyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2lzdWIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVNVQl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVNVQl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2MjcsNyArMTY5Niw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2l1c2hyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklVU0hSXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JVVNIUl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2MzYsNyArMTcwNSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2l4b3IoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVhPUl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVhPUl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2NDUsOCArMTcxNCw4IEBACiAJICovCiAJcHVibGljIHZvaWQgX2pzcl93KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkpTUl9XXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkpTUl9XXSkKKwkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKQogCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KQEAgLTE2NTYsOCArMTcyNSw4IEBACiAJICovCiAJcHVibGljIHZvaWQgX2pzcihpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5KU1JdKQotCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSlNSXSkKKwkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKQogCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KQEAgLTE2NjcsNyArMTczNiw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2wyZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MMkRdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkwyRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2NzYsNyArMTc0NSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2wyZihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MMkZdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkwyRl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2ODUsNyArMTc1NCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2wyaShpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MMkldKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkwySV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE2OTQsNyArMTc2Myw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xhZGQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFERF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFERF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3MDMsNyArMTc3Miw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xhbG9hZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MQUxPQURdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxBTE9BRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3MTIsNyArMTc4MSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xhbmQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFORF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFORF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3MjEsNyArMTc5MCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xhc3RvcmUoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFTVE9SRV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTEFTVE9SRV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3MzAsNyArMTc5OSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xjbXAoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTENNUF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTENNUF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3MzksNyArMTgwOCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xjb25zdF8wKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxDT05TVF8wXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MQ09OU1RfMF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3NDgsNyArMTgxNyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xjb25zdF8xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxDT05TVF8xXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MQ09OU1RfMV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE3NTksMjggKzE4MjgsMjggQEAKIAkJZHVtcFBjTnVtYmVyKHBjKTsKIAkJc3dpdGNoIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkpIHsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0IDoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfZmxvYXQsIG5ldyBTdHJpbmdbXSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfZmxvYXQsIG5ldyBTdHJpbmdbXSB7CiAJCQkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQ19XXSwKIAkJCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQkJCUZsb2F0LnRvU3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5LmdldEZsb2F0VmFsdWUoKSkKIAkJCQl9KSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlZ2VyIDoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfaW50ZWdlciwgbmV3IFN0cmluZ1tdIHsKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sZGNfd19pbnRlZ2VyLCBuZXcgU3RyaW5nW10gewogCQkJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRENfV10sCiAJCQkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKQogCQkJCX0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1N0cmluZyA6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X3N0cmluZywgbmV3IFN0cmluZ1tdIHsKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sZGNfd19zdHJpbmcsIG5ldyBTdHJpbmdbXSB7CiAJCQkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQ19XXSwKIAkJCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQkJCURpc2Fzc2VtYmxlci5lc2NhcGVTdHJpbmcoY29uc3RhbnRQb29sRW50cnkuZ2V0U3RyaW5nVmFsdWUoKSkKIAkJCQl9KSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzcyA6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X2NsYXNzLCBuZXcgU3RyaW5nW10geworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X2NsYXNzLCBuZXcgU3RyaW5nW10gewogCQkJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRENfV10sCiAJCQkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJCQlyZXR1cm5Db25zdGFudENsYXNzTmFtZShjb25zdGFudFBvb2xFbnRyeSkKQEAgLTE3OTYsMjggKzE4NjUsMjggQEAKIAkJZHVtcFBjTnVtYmVyKHBjKTsKIAkJc3dpdGNoIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkpIHsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0IDoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfZmxvYXQsIG5ldyBTdHJpbmdbXSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfZmxvYXQsIG5ldyBTdHJpbmdbXSB7CiAJCQkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQ10sCiAJCQkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJCQlGbG9hdC50b1N0cmluZyhjb25zdGFudFBvb2xFbnRyeS5nZXRGbG9hdFZhbHVlKCkpCiAJCQkJfSkpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfSW50ZWdlciA6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X2ludGVnZXIsIG5ldyBTdHJpbmdbXSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfaW50ZWdlciwgbmV3IFN0cmluZ1tdIHsKIAkJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTERDXSwKIAkJCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQkJCUludGVnZXIudG9TdHJpbmcoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpCiAJCQkJfSkpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfU3RyaW5nIDoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjX3dfc3RyaW5nLCBuZXcgU3RyaW5nW10geworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X3N0cmluZywgbmV3IFN0cmluZ1tdIHsKIAkJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTERDXSwKIAkJCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQkJCURpc2Fzc2VtYmxlci5lc2NhcGVTdHJpbmcoY29uc3RhbnRQb29sRW50cnkuZ2V0U3RyaW5nVmFsdWUoKSkKIAkJCQl9KSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzcyA6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X2NsYXNzLCBuZXcgU3RyaW5nW10geworCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkY193X2NsYXNzLCBuZXcgU3RyaW5nW10gewogCQkJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRENdLAogCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCQkJcmV0dXJuQ29uc3RhbnRDbGFzc05hbWUoY29uc3RhbnRQb29sRW50cnkpCkBAIC0xODMzLDE0ICsxOTAyLDE0IEBACiAJCWR1bXBQY051bWJlcihwYyk7CiAJCXN3aXRjaCAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpKSB7CiAJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nIDoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjMl93X2xvbmcsIG5ldyBTdHJpbmdbXSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjMl93X2xvbmcsIG5ldyBTdHJpbmdbXSB7CiAJCQkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQzJfV10sCiAJCQkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJCQlMb25nLnRvU3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5LmdldExvbmdWYWx1ZSgpKQogCQkJCX0pKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0RvdWJsZSA6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xkYzJfd19kb3VibGUsIG5ldyBTdHJpbmdbXSB7CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbGRjMl93X2RvdWJsZSwgbmV3IFN0cmluZ1tdIHsKIAkJCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTERDMl9XXSwKIAkJCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQkJCURvdWJsZS50b1N0cmluZyhjb25zdGFudFBvb2xFbnRyeS5nZXREb3VibGVWYWx1ZSgpKQpAQCAtMTg1NCw3ICsxOTIzLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbGRpdihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRElWXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRElWXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTg2Myw3ICsxOTMyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbGxvYWRfMChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTE9BRF8wXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAwKQogCQl9KSk7CkBAIC0xODc1LDcgKzE5NDQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9sbG9hZF8xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxMT0FEXzFdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDEpCiAJCX0pKTsKQEAgLTE4ODcsNyArMTk1Niw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xsb2FkXzIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9sb2FkLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTExPQURfMl0sCiAJCQlnZXRMb2NhbFZhcmlhYmxlTmFtZShwYywgMikKIAkJfSkpOwpAQCAtMTg5OSw3ICsxOTY4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbGxvYWRfMyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X2xvYWQsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTE9BRF8zXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCAzKQogCQl9KSk7CkBAIC0xOTExLDcgKzE5ODAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9sbG9hZChpbnQgcGMsIGludCBpbmRleCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbG9hZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxMT0FEXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCBpbmRleCwgdHJ1ZSkKIAkJfSkpOwpAQCAtMTkyMyw3ICsxOTkyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbG11bChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTVVMXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTVVMXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTkzMiw3ICsyMDAxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbG5lZyhpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTkVHXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTkVHXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMTk0MSwxMyArMjAxMCwxMyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9sb29rdXBzd2l0Y2goaW50IHBjLCBpbnQgZGVmYXVsdG9mZnNldCwgaW50IG5wYWlycywgaW50W11bXSBvZmZzZXRfcGFpcnMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MT09LVVBTV0lUQ0hdKQorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTE9PS1VQU1dJVENIXSkKIAkJCS5hcHBlbmQoIiBkZWZhdWx0OiAiKSAvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKGRlZmF1bHRvZmZzZXQgKyBwYyk7CiAJCXdyaXRlTmV3TGluZSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG5wYWlyczsgaSsrKSB7CiAJCQl3cml0ZUV4dHJhVGFicygzKTsKLQkJCWJ1ZmZlcgorCQkJdGhpcy5idWZmZXIKIAkJCQkuYXBwZW5kKCJjYXNlICIpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKG9mZnNldF9wYWlyc1tpXVswXSkKIAkJCQkuYXBwZW5kKCI6ICIpIC8vJE5PTi1OTFMtMSQKQEAgLTE5NjEsNyArMjAzMCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xvcihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MT1JdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxPUl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE5NzAsNyArMjAzOSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xyZW0oaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFJFTV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFJFTV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE5NzksNyArMjA0OCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xyZXR1cm4oaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFJFVFVSTl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFJFVFVSTl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE5ODgsNyArMjA1Nyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzaGwoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNITF0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNITF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTE5OTcsNyArMjA2Niw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzaHIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNIUl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNIUl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTIwMDYsNyArMjA3NSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzdG9yZV8wKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzBdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDApCiAJCX0pKTsKQEAgLTIwMTgsNyArMjA4Nyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzdG9yZV8xKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzFdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDEpCiAJCX0pKTsKQEAgLTIwMzAsNyArMjA5OSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzdG9yZV8yKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzJdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDIpCiAJCX0pKTsKQEAgLTIwNDIsNyArMjExMSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzdG9yZV8zKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzNdLAogCQkJZ2V0TG9jYWxWYXJpYWJsZU5hbWUocGMsIDMpCiAJCX0pKTsKQEAgLTIwNTQsNyArMjEyMyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX2xzdG9yZShpbnQgcGMsIGludCBpbmRleCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfc3RvcmUsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3N0b3JlLCBuZXcgU3RyaW5nW10gewogCQkJT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXSwKIAkJCWdldExvY2FsVmFyaWFibGVOYW1lKHBjLCBpbmRleCwgdHJ1ZSkKIAkJfSkpOwpAQCAtMjA2Niw3ICsyMTM1LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbHN1YihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MU1VCXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MU1VCXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMjA3NSw3ICsyMTQ0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbHVzaHIoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFVTSFJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxVU0hSXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMjA4NCw3ICsyMTUzLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbHhvcihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MWE9SXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MWE9SXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMjA5Myw3ICsyMTYyLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbW9uaXRvcmVudGVyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLk1PTklUT1JFTlRFUl0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTU9OSVRPUkVOVEVSXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMjEwMiw3ICsyMTcxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfbW9uaXRvcmV4aXQoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTU9OSVRPUkVYSVRdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLk1PTklUT1JFWElUXSk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KIApAQCAtMjExNSw3ICsyMTg0LDcgQEAKIAkJaW50IGRpbWVuc2lvbnMsCiAJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9tdWx0aWFuZXdhcnJheSwgbmV3IFN0cmluZ1tdIHsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfbXVsdGlhbmV3YXJyYXksIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5NVUxUSUFORVdBUlJBWV0sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXJldHVybkNvbnN0YW50Q2xhc3NOYW1lKGNvbnN0YW50Q2xhc3MpCkBAIC0yMTI4LDcgKzIxOTcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9uZXcoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9uZXcsIG5ldyBTdHJpbmdbXSB7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X25ldywgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLk5FV10sCiAJCQlJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwKIAkJCXJldHVybkNvbnN0YW50Q2xhc3NOYW1lKGNvbnN0YW50Q2xhc3MpCkBAIC0yMTk4LDcgKzIyNjcsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9ub3AoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTk9QXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5OT1BdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yMjA3LDcgKzIyNzYsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9wb3AoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuUE9QXSk7CisJCXRoaXMuYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5QT1BdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yMjE2LDcgKzIyODUsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9wb3AyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlBPUDJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlBPUDJdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yMjI1LDcgKzIyOTQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9wdXRmaWVsZChpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmNsYXNzZm9ybWF0X3B1dGZpZWxkLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9wdXRmaWVsZCwgbmV3IFN0cmluZ1tdIHsKIAkJCU9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlBVVEZJRUxEXSwKIAkJCUludGVnZXIudG9TdHJpbmcoaW5kZXgpLAogCQkJcmV0dXJuRGVjbGFyaW5nQ2xhc3NOYW1lKGNvbnN0YW50RmllbGRyZWYpLApAQCAtMjI0MCw3ICsyMzA5LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfcHV0c3RhdGljKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRGaWVsZHJlZikgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3Nmb3JtYXRfcHV0c3RhdGljLCBuZXcgU3RyaW5nW10geworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5jbGFzc2Zvcm1hdF9wdXRzdGF0aWMsIG5ldyBTdHJpbmdbXSB7CiAJCQlPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5QVVRTVEFUSUNdLAogCQkJSW50ZWdlci50b1N0cmluZyhpbmRleCksCiAJCQlyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRGaWVsZHJlZiksCkBAIC0yMjU1LDggKzIzMjQsOCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9yZXQoaW50IHBjLCBpbnQgaW5kZXgpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5SRVRdKQotCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuUkVUXSkKKwkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKQogCQkJLmFwcGVuZChpbmRleCk7CiAJCXdyaXRlTmV3TGluZSgpOwogCX0KQEAgLTIyNjYsNyArMjMzNSw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX3JldHVybihpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5SRVRVUk5dKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlJFVFVSTl0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTIyNzUsNyArMjM0NCw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX3NhbG9hZChpbnQgcGMpIHsKIAkJZHVtcFBjTnVtYmVyKHBjKTsKLQkJYnVmZmVyLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5TQUxPQURdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlNBTE9BRF0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTIyODQsNyArMjM1Myw3IEBACiAJICovCiAJcHVibGljIHZvaWQgX3Nhc3RvcmUoaW50IHBjKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuU0FTVE9SRV0pOworCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuU0FTVE9SRV0pOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CiAKQEAgLTIyOTMsOCArMjM2Miw4IEBACiAJICovCiAJcHVibGljIHZvaWQgX3NpcHVzaChpbnQgcGMsIHNob3J0IHZhbHVlKSB7CiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuU0lQVVNIXSkKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKSAKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlNJUFVTSF0pCisJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkKIAkJCS5hcHBlbmQodmFsdWUpOwogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CkBAIC0yMzA0LDcgKzIzNzMsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9zd2FwKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlNXQVBdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlNXQVBdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yMzEyLDIwICsyMzgxLDIwIEBACiAJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI190YWJsZXN3aXRjaChpbnQsIGludCwgaW50LCBpbnQsIGludFtdKQogCSAqLwogCXB1YmxpYyB2b2lkIF90YWJsZXN3aXRjaCgKLQkJaW50IHBjLCAKKwkJaW50IHBjLAogCQlpbnQgZGVmYXVsdG9mZnNldCwKIAkJaW50IGxvdywKIAkJaW50IGhpZ2gsCiAJCWludFtdIGp1bXBfb2Zmc2V0cykgewogCiAJCWR1bXBQY051bWJlcihwYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuVEFCTEVTV0lUQ0hdKQorCQl0aGlzLmJ1ZmZlci5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuVEFCTEVTV0lUQ0hdKQogCQkJLmFwcGVuZCgiIGRlZmF1bHQ6ICIpIC8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQoZGVmYXVsdG9mZnNldCArIHBjKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJCWZvciAoaW50IGkgPSBsb3c7IGkgPCBoaWdoICsgMTsgaSsrKSB7CiAJCQl3cml0ZUV4dHJhVGFicygzKTsKLQkJCWJ1ZmZlcgorCQkJdGhpcy5idWZmZXIKIAkJCQkuYXBwZW5kKCJjYXNlICIpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKGkpCiAJCQkJLmFwcGVuZCgiOiAiKSAvLyROT04tTkxTLTEkCkBAIC0yMzM5LDcgKzI0MDgsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF93aWRlKGludCBwYywgaW50IGlpbmNvcGNvZGUsIGludCBpbmRleCwgaW50IF9jb25zdCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLldJREVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLldJREVdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJCV9paW5jKHBjICsgMSwgaW5kZXgsIF9jb25zdCk7CiAJfQpAQCAtMjM0OSw3ICsyNDE4LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBfd2lkZShpbnQgcGMsIGludCBvcGNvZGUsIGludCBpbmRleCkgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLldJREVdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLldJREVdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJCXN3aXRjaChvcGNvZGUpIHsKIAkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTE9BRCA6CkBAIC0yMzkyLDcgKzI0NjEsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9icmVha3BvaW50KGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJSRUFLUE9JTlRdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJSRUFLUE9JTlRdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yNDAxLDcgKzI0NzAsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbXBkZXAxKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDFdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDFdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yNDEwLDcgKzI0NzksNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIF9pbXBkZXAyKGludCBwYykgewogCQlkdW1wUGNOdW1iZXIocGMpOwotCQlidWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDJdKTsKKwkJdGhpcy5idWZmZXIuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDJdKTsKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQogCkBAIC0yNDI5LDcgKzI0OTgsNyBAQAogCQkJCVV0aWwuYXBwZW5kVHlwZVNpZ25hdHVyZShjbGFzc05hbWUsIDAsIGNsYXNzTmFtZUJ1ZmZlciwgaXNDb21wYWN0KCkpOwogCQkJCXJldHVybiBjbGFzc05hbWVCdWZmZXIudG9TdHJpbmcoKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHJldHVybkNsYXNzTmFtZShjbGFzc05hbWUpOwkKKwkJCQlyZXR1cm4gcmV0dXJuQ2xhc3NOYW1lKGNsYXNzTmFtZSk7CiAJCX0KIAl9CiAJcHJpdmF0ZSBTdHJpbmcgcmV0dXJuQ2xhc3NOYW1lKGNoYXJbXSBjbGFzc0luZm9OYW1lKSB7CkBAIC0yNDY0LDE5ICsyNTMzLDE5IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlTmV3TGluZSgpIHsKLQkJdGhpcy5idWZmZXIuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCX0JCisJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLmxpbmVTZXBhcmF0b3IpOworCX0KIAogCXByaXZhdGUgdm9pZCB3cml0ZVRhYnMoKSB7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnRhYk51bWJlcjsgaSA8IG1heDsgaSsrKSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2luZGVudGF0aW9uKTsgCisJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2luZGVudGF0aW9uKTsKIAkJfQotCX0JCisJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlRXh0cmFUYWJzKGludCBleHRyYVRhYnMpIHsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudGFiTnVtYmVyICsgZXh0cmFUYWJzOyBpIDwgbWF4OyBpKyspIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfaW5kZW50YXRpb24pOyAKKwkJCXRoaXMuYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfaW5kZW50YXRpb24pOwogCQl9Ci0JfQkKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGVmYXVsdFN0YWNrTWFwRnJhbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGVmYXVsdFN0YWNrTWFwRnJhbWUuamF2YQppbmRleCA5NGQyZjNmLi45ZTY3ZDJlIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0RlZmF1bHRTdGFja01hcEZyYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0U3RhY2tNYXBGcmFtZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDEwICsyNywxMCBAQAogCXByaXZhdGUgSVZlcmlmaWNhdGlvblR5cGVJbmZvW10gbG9jYWxzOwogCXByaXZhdGUgSVZlcmlmaWNhdGlvblR5cGVJbmZvW10gc3RhY2tJdGVtczsKIAlwcml2YXRlIGludCBvZmZzZXREZWx0YTsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBTdGFja01hcEZyYW1lLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCiAJICogQHBhcmFtIGNvbnN0YW50UG9vbAogCSAqIEBwYXJhbSBvZmZzZXQKQEAgLTQ0LDkgKzQ0LDkgQEAKIAkJdGhpcy5vZmZzZXREZWx0YSA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDAsIG9mZnNldCk7CiAJCWludCB0ZW1wTG9jYWxzID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMiwgb2Zmc2V0KTsKIAkJdGhpcy5udW1iZXJPZkxvY2FscyA9IHRlbXBMb2NhbHM7CisJCXRoaXMucmVhZE9mZnNldCA9IDQ7CiAJCWlmICh0ZW1wTG9jYWxzICE9IDApIHsKIAkJCXRoaXMubG9jYWxzID0gbmV3IElWZXJpZmljYXRpb25UeXBlSW5mb1t0ZW1wTG9jYWxzXTsKLQkJCXRoaXMucmVhZE9mZnNldCA9IDQ7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMb2NhbHM7IGkrKykgewogCQkJCVZlcmlmaWNhdGlvbkluZm8gdmVyaWZpY2F0aW9uSW5mbyA9IG5ldyBWZXJpZmljYXRpb25JbmZvKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHRoaXMucmVhZE9mZnNldCk7CiAJCQkJdGhpcy5sb2NhbHNbaV0gPSB2ZXJpZmljYXRpb25JbmZvOwpAQCAtNTUsNyArNTUsNyBAQAogCQl9IGVsc2UgewogCQkJdGhpcy5sb2NhbHMgPSBFTVBUWV9MT0NBTFNfT1JfU1RBQ0tfSVRFTVM7CiAJCX0KLQkJaW50IHRlbXBTdGFja0l0ZW1zID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KTsKKwkJaW50IHRlbXBTdGFja0l0ZW1zID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgdGhpcy5yZWFkT2Zmc2V0LCBvZmZzZXQpOwogCQl0aGlzLnJlYWRPZmZzZXQgKz0gMjsKIAkJdGhpcy5udW1iZXJPZlN0YWNrSXRlbXMgPSB0ZW1wU3RhY2tJdGVtczsKIAkJaWYgKHRlbXBTdGFja0l0ZW1zICE9IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGlzYXNzZW1ibGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2Fzc2VtYmxlci5qYXZhCmluZGV4IDY5ZGJhYWIuLmM1NGZkNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGlzYXNzZW1ibGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EaXNhc3NlbWJsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw5ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKQEAgLTI2LDEzICsyMywxMyBAQAogICovCiBwdWJsaWMgY2xhc3MgRGlzYXNzZW1ibGVyIGV4dGVuZHMgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFOWV9FWENFUFRJT04gPSBNZXNzYWdlcy5jbGFzc2ZpbGVmb3JtYXRfYW55ZXhjZXB0aW9uaGFuZGxlci50b0NoYXJBcnJheSgpOwkgCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFOWV9FWENFUFRJT04gPSBNZXNzYWdlcy5jbGFzc2ZpbGVmb3JtYXRfYW55ZXhjZXB0aW9uaGFuZGxlci50b0NoYXJBcnJheSgpOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1VOS05PV04gPSBNZXNzYWdlcy5jbGFzc2ZpbGVmb3JtYXRfdmVyc2lvblVua25vd247CiAKIAlwcml2YXRlIGJvb2xlYW4gYXBwZW5kTW9kaWZpZXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzLCBpbnQgbW9kaWZpZXJDb25zdGFudCwgU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGZpcnN0TW9kaWZpZXIpIHsKIAkJaWYgKChhY2Nlc3NGbGFncyAmIG1vZGlmaWVyQ29uc3RhbnQpICE9IDApIHsKIAkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKTsgCisJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpOwogCQkJfQogCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKIAkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CkBAIC00MSwxMSArMzgsMTEgQEAKIAkJfQogCQlyZXR1cm4gZmlyc3RNb2RpZmllcjsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgZGVjb2RlTW9kaWZpZXJzKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBhY2Nlc3NGbGFncywgaW50W10gY2hlY2tCaXRzKSB7CiAJCWRlY29kZU1vZGlmaWVycyhidWZmZXIsIGFjY2Vzc0ZsYWdzLCBmYWxzZSwgZmFsc2UsIGNoZWNrQml0cyk7CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGRlY29kZU1vZGlmaWVycyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MsIGJvb2xlYW4gcHJpbnREZWZhdWx0LCBib29sZWFuIGFzQnJpZGdlLCBpbnRbXSBjaGVja0JpdHMpIHsKIAkJaWYgKGNoZWNrQml0cyA9PSBudWxsKSByZXR1cm47CiAJCWJvb2xlYW4gZmlyc3RNb2RpZmllciA9IHRydWU7CkBAIC05NSwxMyArOTIsMTMgQEAKIAkJCX0KIAkJfQogCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCWlmICghcHJpbnREZWZhdWx0KSBidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSk7IAorCQkJaWYgKCFwcmludERlZmF1bHQpIGJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKTsKIAkJfSBlbHNlIGlmIChwcmludERlZmF1bHQpIHsKIAkJCS8vIG5vIG1vZGlmaWVyOiBwYWNrYWdlIGRlZmF1bHQgdmlzaWJpbGl0eQogCQkJYnVmZmVyLmFwcGVuZCgiZGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9yRmllbGQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzKSB7CiAJCWRlY29kZU1vZGlmaWVycyhidWZmZXIsIGFjY2Vzc0ZsYWdzLCBuZXcgaW50W10gewogCQkJCUlNb2RpZmllckNvbnN0YW50cy5BQ0NfUFVCTElDLApAQCAtMTI1LDggKzEyMiw4IEBACiAJCQkJSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19UUkFOU0lFTlQsCiAJCQkJSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19WT0xBVElMRSwKIAkJfSk7Ci0JfQkKLQkKKwl9CisKIAlwcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBhY2Nlc3NGbGFncywgYm9vbGVhbiBwcmludERlZmF1bHQpIHsKIAkJZGVjb2RlTW9kaWZpZXJzKGJ1ZmZlciwgYWNjZXNzRmxhZ3MsIHByaW50RGVmYXVsdCwgZmFsc2UsIG5ldyBpbnRbXSB7CiAJCQkJSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMsCkBAIC0xNjEsMTA3ICsxNTgsNjQgQEAKIAkJfSk7CiAJfQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZVN0cmluZyhTdHJpbmcgcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcy5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCXN3aXRjaChjKSB7Ci0JCQkJY2FzZSAnXGInIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDAnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFwwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDEnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFwxIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDInIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFwyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDMnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFwzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDQnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFw0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDUnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFw1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDYnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFw2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXDcnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFw3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7CQkJCi0JCQkJZGVmYXVsdDoKLQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCXJldHVybiBkZWNvZGVTdHJpbmdWYWx1ZShzKTsKIAl9CiAKIAlzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZ1ZhbHVlKGNoYXJbXSBjaGFycykgewogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY2hhcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCWNoYXIgYyA9IGNoYXJzW2ldOwotCQkJc3dpdGNoKGMpIHsKLQkJCQljYXNlICdcYicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCcgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcMCcgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcMScgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcMicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcMycgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcNCcgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcNScgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcNicgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcNycgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJcXDciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsJCQkKLQkJCQlkZWZhdWx0OgotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJfQorCQkJZXNjYXBlQ2hhcihidWZmZXIsIGMpOwogCQl9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9CiAKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGVzY2FwZUNoYXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgY2hhciBjKSB7CisJCXN3aXRjaChjKSB7CisJCQljYXNlICdcYicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcdCcgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcdCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcbicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcZicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcZiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdccicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcciIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcMCcgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcMScgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcMicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcMycgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMyIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNCcgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNScgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNicgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNycgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJ1ZmZlci5hcHBlbmQoYyk7CisJCX0KKwl9CisKIAlzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZ1ZhbHVlKFN0cmluZyBzKSB7CiAJCXJldHVybiBkZWNvZGVTdHJpbmdWYWx1ZShzLnRvQ2hhckFycmF5KCkpOwogCX0KQEAgLTI3MywxMiArMjI3LDcgQEAKIAkJdHJ5IHsKIAkJCXJldHVybiBkaXNhc3NlbWJsZShuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzRmlsZUJ5dGVzLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCksIGxpbmVTZXBhcmF0b3IsIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFRkFVTFQpOwogCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotCQkJZS5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2Yoc3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpKSk7CisJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9CiAJfQogCkBAIC0yODksMzMgKzIzOCwyOCBAQAogCQl0cnkgewogCQkJcmV0dXJuIGRpc2Fzc2VtYmxlKG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlQnl0ZXMsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKSwgbGluZVNlcGFyYXRvciwgbW9kZSk7CiAJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0JCQllLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkpKTsKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwogCQlmaW5hbCBpbnQgdHlwZUluZGV4ID0gYW5ub3RhdGlvbi5nZXRUeXBlSW5kZXgoKTsKIAkJZmluYWwgY2hhcltdIHR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSwgJy8nLCAnLicpOwogCQlidWZmZXIuYXBwZW5kKAogCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmVudHJ5c3RhcnQsIG5ldyBTdHJpbmdbXSB7CiAJCQkJSW50ZWdlci50b1N0cmluZyh0eXBlSW5kZXgpLAotCQkJCW5ldyBTdHJpbmcoU2lnbmF0dXJlLnRvQ2hhckFycmF5KHR5cGVOYW1lKSkKKwkJCQluZXcgU3RyaW5nKHJldHVybkNsYXNzTmFtZShTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZU5hbWUpLCAnLicsIG1vZGUpKQogCQkJfSkpOwogCQlmaW5hbCBJQW5ub3RhdGlvbkNvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBhbm5vdGF0aW9uLmdldENvbXBvbmVudHMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWRpc2Fzc2VtYmxlKGNvbXBvbmVudHNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCQlkaXNhc3NlbWJsZShjb21wb25lbnRzW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCQl9CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uZW50cnllbmQpOyAKKwkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmVudHJ5ZW5kKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb25Db21wb25lbnQgYW5ub3RhdGlvbkNvbXBvbmVudCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb25Db21wb25lbnQgYW5ub3RhdGlvbkNvbXBvbmVudCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwogCQlidWZmZXIuYXBwZW5kKAogCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmNvbXBvbmVudCwKQEAgLTMyMywxMCArMjY3LDEwIEBACiAJCQkJCUludGVnZXIudG9TdHJpbmcoYW5ub3RhdGlvbkNvbXBvbmVudC5nZXRDb21wb25lbnROYW1lSW5kZXgoKSksCiAJCQkJCW5ldyBTdHJpbmcoYW5ub3RhdGlvbkNvbXBvbmVudC5nZXRDb21wb25lbnROYW1lKCkpCiAJCQkJfSkpOwotCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uQ29tcG9uZW50LmdldENvbXBvbmVudFZhbHVlKCksIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCWRpc2Fzc2VtYmxlKGFubm90YXRpb25Db21wb25lbnQuZ2V0Q29tcG9uZW50VmFsdWUoKSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb25Db21wb25lbnRWYWx1ZSBhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgYW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJc3dpdGNoKGFubm90YXRpb25Db21wb25lbnRWYWx1ZS5nZXRUYWcoKSkgewogCQkJY2FzZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLkJZVEVfVEFHOgogCQkJY2FzZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLkNIQVJfVEFHOgpAQCAtMzUwLDI3ICsyOTQsMzEgQEAKIAkJCQkJCXZhbHVlID0gRG91YmxlLnRvU3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5LmdldERvdWJsZVZhbHVlKCkpOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXI6CisJCQkJCQlTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJCQkJCXN3aXRjaChhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuZ2V0VGFnKCkpIHsKIAkJCQkJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuQ0hBUl9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICInIiArIChjaGFyKSBjb25zdGFudFBvb2xFbnRyeS5nZXRJbnRlZ2VyVmFsdWUoKSArICInIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoJ1wnJyk7CisJCQkJCQkJCWVzY2FwZUNoYXIodGVtcCwgKGNoYXIpIGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKTsKKwkJCQkJCQkJdGVtcC5hcHBlbmQoJ1wnJyk7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5CT09MRUFOX1RBRyA6Ci0JCQkJCQkJCXZhbHVlID0gY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgPT0gMSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgPT0gMSA/ICJ0cnVlIiA6ICJmYWxzZSIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5CWVRFX1RBRyA6Ci0JCQkJCQkJCXZhbHVlID0gIihieXRlKSAiICsgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoIihieXRlKSAiKS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5TSE9SVF9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICAiKHNob3J0KSAiICsgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoIihzaG9ydCkgIikuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQlicmVhazsKIAkJCQkJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuSU5URUdFUl9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICAiKGludCkgIiArIGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCXRlbXAuYXBwZW5kKCIoaW50KSAiKS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CisJCQkJCQl2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHRlbXApOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0Zjg6CiAJCQkJCQl2YWx1ZSA9ICJcIiIgKyBkZWNvZGVTdHJpbmdWYWx1ZShjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKSkgKyAiXCIiOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmRlZmF1bHR2YWx1ZSwgdmFsdWUpKTsgCisJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uZGVmYXVsdHZhbHVlLCB2YWx1ZSkpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLkVOVU1fVEFHOgogCQkJCWZpbmFsIGludCBlbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4ID0gYW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLmdldEVudW1Db25zdGFudFR5cGVOYW1lSW5kZXgoKTsKQEAgLTM4MSw3ICszMjksNyBAQAogCQkJCQluZXcgU3RyaW5nW10gewogCQkJCQkJSW50ZWdlci50b1N0cmluZyhlbnVtQ29uc3RhbnRUeXBlTmFtZUluZGV4KSwKIAkJCQkJCUludGVnZXIudG9TdHJpbmcoZW51bUNvbnN0YW50TmFtZUluZGV4KSwKLQkJCQkJCW5ldyBTdHJpbmcoU2lnbmF0dXJlLnRvQ2hhckFycmF5KHR5cGVOYW1lKSksCisJCQkJCQluZXcgU3RyaW5nKHJldHVybkNsYXNzTmFtZShTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZU5hbWUpLCAnLicsIG1vZGUpKSwKIAkJCQkJCW5ldyBTdHJpbmcoY29uc3RhbnROYW1lKQogCQkJCQl9KSk7CiAJCQkJYnJlYWs7CkBAIC0zOTIsMzUgKzM0MCwzNSBAQAogCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmNsYXNzdmFsdWUsCiAJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGNsYXNzSW5kZXgpLAotCQkJCQkJbmV3IFN0cmluZyhTaWduYXR1cmUudG9DaGFyQXJyYXkoY2xhc3NOYW1lKSkKKwkJCQkJCW5ldyBTdHJpbmcocmV0dXJuQ2xhc3NOYW1lKFNpZ25hdHVyZS50b0NoYXJBcnJheShjbGFzc05hbWUpLCAnLicsIG1vZGUpKQogCQkJCQl9KSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuQU5OT1RBVElPTl9UQUc6Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmFubm90YXRpb252YWx1ZSk7IAorCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2Fubm90YXRpb25hbm5vdGF0aW9udmFsdWUpOwogCQkJCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuZ2V0QW5ub3RhdGlvblZhbHVlKCk7Ci0JCQkJZGlzYXNzZW1ibGUoYW5ub3RhdGlvbiwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJQW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLkFSUkFZX1RBRzoKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uYXJyYXl2YWx1ZXN0YXJ0KTsgCisJCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfYW5ub3RhdGlvbmFycmF5dmFsdWVzdGFydCk7CiAJCQkJZmluYWwgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZVtdIGFubm90YXRpb25Db21wb25lbnRWYWx1ZXMgPSBhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuZ2V0QW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlcygpOwogCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwotCQkJCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVzW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWVzW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCQkJCX0KIAkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uYXJyYXl2YWx1ZWVuZCk7IAorCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2Fubm90YXRpb25hcnJheXZhbHVlZW5kKTsKIAkJfQogCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlIGFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlcikgeworCisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSBhbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uZGVmYXVsdGhlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9hbm5vdGF0aW9uZGVmYXVsdGhlYWRlcik7CiAJCUlBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUgY29tcG9uZW50VmFsdWUgPSBhbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZS5nZXRNZW1iZXJWYWx1ZSgpOwogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAyKTsKLQkJZGlzYXNzZW1ibGUoY29tcG9uZW50VmFsdWUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCWRpc2Fzc2VtYmxlKGNvbXBvbmVudFZhbHVlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJQ2xhc3NGaWxlQXR0cmlidXRlIGNsYXNzRmlsZUF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUNsYXNzRmlsZUF0dHJpYnV0ZSBjbGFzc0ZpbGVBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgewogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKIAkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9nZW5lcmljYXR0cmlidXRlaGVhZGVyLAogCQkJbmV3IFN0cmluZ1tdIHsKQEAgLTQzNywxMSArMzg1LDExIEBACiAJCWZpbmFsIElDbGFzc0ZpbGVBdHRyaWJ1dGUgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlID0gVXRpbC5nZXRBdHRyaWJ1dGUobWV0aG9kSW5mbywgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJVTlRJTUVfSU5WSVNJQkxFX0FOTk9UQVRJT05TKTsKIAkJLy8gZGlzYXNzZW1ibGUgY29tcGFjdCB2ZXJzaW9uIG9mIGFubm90YXRpb25zCiAJCWlmIChydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJZGlzYXNzZW1ibGVBc01vZGlmaWVyKChJUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSwgbW9kZSk7CisJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJfQogCQlpZiAocnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOworCQkJZGlzYXNzZW1ibGVBc01vZGlmaWVyKChJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJfQogCQlmaW5hbCBpbnQgYWNjZXNzRmxhZ3MgPSBtZXRob2RJbmZvLmdldEFjY2Vzc0ZsYWdzKCk7CkBAIC00NzYsNyArNDI0LDcgQEAKIAkJCWlmIChyZXR1cm5UeXBlLmxlbmd0aCA9PSAxKSB7CiAJCQkJc3dpdGNoKHJldHVyblR5cGVbMF0pIHsKIAkJCQkJY2FzZSAnVicgOgotCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsJCQkJCQkJCisJCQkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJ0knIDoKIAkJCQkJY2FzZSAnQicgOgpAQCAtNDg3LDI2ICs0MzUsMjYgQEAKIAkJCQkJY2FzZSAnQycgOgogCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CiAJCQkJCQlidWZmZXIuYXBwZW5kKCJyZXR1cm4gMDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsJCQkJCQkJCisJCQkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQgOgogCQkJCQkJLy8gYm9vbGVhbgogCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CiAJCQkJCQlidWZmZXIuYXBwZW5kKCJyZXR1cm4gZmFsc2U7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CQkJCQkJCQorCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCS8vIG9iamVjdAogCQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOwogCQkJCWJ1ZmZlci5hcHBlbmQoInJldHVybiBudWxsOyIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsJCQkJCQkJCisJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCX0KIAkJCWJ1ZmZlci5hcHBlbmQoJ30nKTsKIAkJfSBlbHNlIHsKIAkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIERpc2Fzc2VtYmxlIGEgbWV0aG9kIGluZm8gaGVhZGVyCiAJICovCkBAIC01MjgsNyArNDc2LDcgQEAKIAkJCQl9KSk7CiAJCQlpZiAobWV0aG9kSW5mby5pc0RlcHJlY2F0ZWQoKSkgewogCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2RlcHJlY2F0ZWQpOwotCQkJfQkJCQorCQkJfQogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCWlmIChzaWduYXR1cmVBdHRyaWJ1dGUgIT0gbnVsbCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc2lnbmF0dXJlYXR0cmlidXRlaGVhZGVyLCBuZXcgU3RyaW5nKHNpZ25hdHVyZUF0dHJpYnV0ZS5nZXRTaWduYXR1cmUoKSkpKTsKQEAgLTU0NiwxMSArNDk0LDExIEBACiAJCWlmIChjaGVja01vZGUobW9kZSwgREVUQUlMRUQpKSB7CiAJCQkvLyBkaXNhc3NlbWJsZSBjb21wYWN0IHZlcnNpb24gb2YgYW5ub3RhdGlvbnMKIAkJCWlmIChydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOworCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCX0KIAkJCWlmIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOworCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQkJfQogCQl9CkBAIC01NTgsMzMgKzUwNiwxMDAgQEAKIAkJZGVjb2RlTW9kaWZpZXJzRm9yTWV0aG9kKGJ1ZmZlciwgYWNjZXNzRmxhZ3MpOwogCQlpZiAobWV0aG9kSW5mby5pc1N5bnRoZXRpYygpICYmICFjaGVja01vZGUobW9kZSwgV09SS0lOR19DT1BZKSkgewogCQkJYnVmZmVyLmFwcGVuZCgic3ludGhldGljIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKTsgCisJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSk7CiAJCX0KIAkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1ldGhvZERlc2NyaXB0b3IsICcvJywgJy4nKTsKIAkJZmluYWwgYm9vbGVhbiBpc1ZhckFyZ3MgPSBpc1ZhckFyZ3MobWV0aG9kSW5mbyk7CisJCWNoYXJbXSBtZXRob2RIZWFkZXIgPSBudWxsOworCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisJCWlmICghbWV0aG9kSW5mby5pc0NsaW5pdCgpKSB7CisJCQlwYXJhbWV0ZXJOYW1lcyA9IGdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IsIGNvZGVBdHRyaWJ1dGUsIGFjY2Vzc0ZsYWdzKTsKKwkJfQogCQlpZiAobWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yKCkpIHsKIAkJCWlmIChjaGVja01vZGUobW9kZSwgV09SS0lOR19DT1BZKSAmJiBzaWduYXR1cmVBdHRyaWJ1dGUgIT0gbnVsbCkgewogCQkJCWZpbmFsIGNoYXJbXSBzaWduYXR1cmUgPSBzaWduYXR1cmVBdHRyaWJ1dGUuZ2V0U2lnbmF0dXJlKCk7CiAJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHNpZ25hdHVyZSwgJy8nLCAnLicpOwogCQkJCWRpc2Fzc2VtYmxlR2VuZXJpY1NpZ25hdHVyZShtb2RlLCBidWZmZXIsIHNpZ25hdHVyZSk7CiAJCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KHNpZ25hdHVyZSwgcmV0dXJuQ2xhc3NOYW1lKGNsYXNzTmFtZSwgJy4nLCBDT01QQUNUKSwgZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciwgY29kZUF0dHJpYnV0ZSwgYWNjZXNzRmxhZ3MpICwgIWNoZWNrTW9kZShtb2RlLCBDT01QQUNUKSwgZmFsc2UsIGlzVmFyQXJncykpOworCQkJCW1ldGhvZEhlYWRlciA9IFNpZ25hdHVyZS50b0NoYXJBcnJheShzaWduYXR1cmUsIHJldHVybkNsYXNzTmFtZShjbGFzc05hbWUsICcuJywgQ09NUEFDVCksIHBhcmFtZXRlck5hbWVzLCAhY2hlY2tNb2RlKG1vZGUsIENPTVBBQ1QpLCBmYWxzZSwgaXNWYXJBcmdzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkobWV0aG9kRGVzY3JpcHRvciwgcmV0dXJuQ2xhc3NOYW1lKGNsYXNzTmFtZSwgJy4nLCBDT01QQUNUKSwgZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciwgY29kZUF0dHJpYnV0ZSwgYWNjZXNzRmxhZ3MpICwgIWNoZWNrTW9kZShtb2RlLCBDT01QQUNUKSwgZmFsc2UsIGlzVmFyQXJncykpOworCQkJCW1ldGhvZEhlYWRlciA9IFNpZ25hdHVyZS50b0NoYXJBcnJheShtZXRob2REZXNjcmlwdG9yLCByZXR1cm5DbGFzc05hbWUoY2xhc3NOYW1lLCAnLicsIENPTVBBQ1QpLCBwYXJhbWV0ZXJOYW1lcywgIWNoZWNrTW9kZShtb2RlLCBDT01QQUNUKSwgZmFsc2UsIGlzVmFyQXJncyk7CiAJCQl9CiAJCX0gZWxzZSBpZiAobWV0aG9kSW5mby5pc0NsaW5pdCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NmaWxlZm9ybWF0X2NsaW5pdG5hbWUpKTsKKwkJCW1ldGhvZEhlYWRlciA9IE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuY2xhc3NmaWxlZm9ybWF0X2NsaW5pdG5hbWUpLnRvQ2hhckFycmF5KCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY2hlY2tNb2RlKG1vZGUsIFdPUktJTkdfQ09QWSkgJiYgc2lnbmF0dXJlQXR0cmlidXRlICE9IG51bGwpIHsKIAkJCQlmaW5hbCBjaGFyW10gc2lnbmF0dXJlID0gc2lnbmF0dXJlQXR0cmlidXRlLmdldFNpZ25hdHVyZSgpOwogCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShzaWduYXR1cmUsICcvJywgJy4nKTsKIAkJCQlkaXNhc3NlbWJsZUdlbmVyaWNTaWduYXR1cmUobW9kZSwgYnVmZmVyLCBzaWduYXR1cmUpOwogCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b0NoYXJBcnJheShzaWduYXR1cmUsIG1ldGhvZEluZm8uZ2V0TmFtZSgpLCBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yLCBjb2RlQXR0cmlidXRlLCBhY2Nlc3NGbGFncykgLCAhY2hlY2tNb2RlKG1vZGUsIENPTVBBQ1QpLCB0cnVlLCBpc1ZhckFyZ3MpKTsKKwkJCQltZXRob2RIZWFkZXIgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkoc2lnbmF0dXJlLCBtZXRob2RJbmZvLmdldE5hbWUoKSwgcGFyYW1ldGVyTmFtZXMsICFjaGVja01vZGUobW9kZSwgQ09NUEFDVCksIHRydWUsIGlzVmFyQXJncyk7CiAJCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KG1ldGhvZERlc2NyaXB0b3IsIG1ldGhvZEluZm8uZ2V0TmFtZSgpLCBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yLCBjb2RlQXR0cmlidXRlLCBhY2Nlc3NGbGFncykgLCAhY2hlY2tNb2RlKG1vZGUsIENPTVBBQ1QpLCB0cnVlLCBpc1ZhckFyZ3MpKTsKKwkJCQltZXRob2RIZWFkZXIgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkobWV0aG9kRGVzY3JpcHRvciwgbWV0aG9kSW5mby5nZXROYW1lKCksIHBhcmFtZXRlck5hbWVzLCAhY2hlY2tNb2RlKG1vZGUsIENPTVBBQ1QpLCB0cnVlLCBpc1ZhckFyZ3MpOwogCQkJfQogCQl9CisJCWlmIChjaGVja01vZGUobW9kZSwgREVUQUlMRUQpICYmIChydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCB8fCBydW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpKSB7CisJCQlJUGFyYW1ldGVyQW5ub3RhdGlvbltdIGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID0gbnVsbDsKKwkJCUlQYXJhbWV0ZXJBbm5vdGF0aW9uW10gdmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID0gbnVsbDsKKwkJCWludCBsZW5ndGggPSAtMTsKKwkJCWlmIChydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCUlSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgYXR0cmlidXRlID0gKElSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZTsKKwkJCQlpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGF0dHJpYnV0ZS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworCQkJCWxlbmd0aCA9IGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aDsKKwkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQlpbnQgcGFyYW1ldGVyTmFtZXNMZW5ndGggPSBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7CisJCQkJCWlmIChsZW5ndGggPCBwYXJhbWV0ZXJOYW1lc0xlbmd0aCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucywgMCwgKGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID0gbmV3IElQYXJhbWV0ZXJBbm5vdGF0aW9uW3BhcmFtZXRlck5hbWVzTGVuZ3RoXSksIDEsIGxlbmd0aCk7CisJCQkJCQlsZW5ndGggPSBwYXJhbWV0ZXJOYW1lc0xlbmd0aDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChydW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQlJUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGU7CisJCQkJdmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID0gYXR0cmlidXRlLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CisJCQkJbGVuZ3RoID0gdmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aDsKKwkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQlpbnQgcGFyYW1ldGVyTmFtZXNMZW5ndGggPSBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7CisJCQkJCWlmIChsZW5ndGggPCBwYXJhbWV0ZXJOYW1lc0xlbmd0aCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh2aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMsIDAsICh2aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBuZXcgSVBhcmFtZXRlckFubm90YXRpb25bcGFyYW1ldGVyTmFtZXNMZW5ndGhdKSwgMSwgbGVuZ3RoKTsKKwkJCQkJCWxlbmd0aCA9IHBhcmFtZXRlck5hbWVzTGVuZ3RoOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaW50IGluc2VydGlvblBvc2l0aW9uID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcoJywgbWV0aG9kSGVhZGVyKSArIDE7CisJCQlpbnQgc3RhcnQgPSAwOworCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobWV0aG9kSGVhZGVyLCAwLCBpbnNlcnRpb25Qb3NpdGlvbik7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQl9CisJCQkJaW50IHN0cmluZ0J1ZmZlclNpemUgPSBzdHJpbmdCdWZmZXIubGVuZ3RoKCk7CisJCQkJaWYgKHZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcih2aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMsIHN0cmluZ0J1ZmZlciwgaSwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKKwkJCQl9CisJCQkJaWYgKGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQkJaWYgKHN0cmluZ0J1ZmZlci5sZW5ndGgoKSAhPSBzdHJpbmdCdWZmZXJTaXplKSB7CisJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcgJyk7CisJCQkJCQlzdHJpbmdCdWZmZXJTaXplID0gc3RyaW5nQnVmZmVyLmxlbmd0aCgpOworCQkJCQl9CisJCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcihpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucywgc3RyaW5nQnVmZmVyLCBpLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOworCQkJCX0KKwkJCQlpZiAoaSA9PSAwICYmIHN0cmluZ0J1ZmZlci5sZW5ndGgoKSAhPSBzdHJpbmdCdWZmZXJTaXplKSB7CisJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQl9CisJCQkJc3RhcnQgPSBpbnNlcnRpb25Qb3NpdGlvbjsKKwkJCQlpbnNlcnRpb25Qb3NpdGlvbiA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignLCcsIG1ldGhvZEhlYWRlciwgc3RhcnQgKyAxKSArIDE7CisJCQkJaWYgKGluc2VydGlvblBvc2l0aW9uID09IDApIHsKKwkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChtZXRob2RIZWFkZXIsIHN0YXJ0LCBtZXRob2RIZWFkZXIubGVuZ3RoIC0gc3RhcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobWV0aG9kSGVhZGVyLCBzdGFydCwgaW5zZXJ0aW9uUG9zaXRpb24gLSBzdGFydCk7CisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZChzdHJpbmdCdWZmZXIpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChtZXRob2RIZWFkZXIpOworCQl9CiAJCUlFeGNlcHRpb25BdHRyaWJ1dGUgZXhjZXB0aW9uQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRFeGNlcHRpb25BdHRyaWJ1dGUoKTsKIAkJaWYgKGV4Y2VwdGlvbkF0dHJpYnV0ZSAhPSBudWxsKSB7CiAJCQlidWZmZXIuYXBwZW5kKCIgdGhyb3dzICIpOyAvLyROT04tTkxTLTEkCkBAIC02NDgsMTQgKzY2MywxNCBAQAogCQkJCWJ1ZmZlci5hcHBlbmQoJ30nKTsKIAkJCX0gZWxzZSB7CiAJCQkJYnVmZmVyLmFwcGVuZCgnOycpOwotCQkJfQkKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2VuZG9mbWV0aG9kaGVhZGVyKTsKIAkJfQotCQkKKwogCQlpZiAoY2hlY2tNb2RlKG1vZGUsIFNZU1RFTSB8IERFVEFJTEVEKSkgewogCQkJaWYgKGNvZGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWRpc2Fzc2VtYmxlKGNvZGVBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKKwkJCQlkaXNhc3NlbWJsZShjb2RlQXR0cmlidXRlLCBwYXJhbWV0ZXJOYW1lcywgbWV0aG9kRGVzY3JpcHRvciwgKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TVEFUSUMpICE9IDAsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCX0KIAkJfQogCQlpZiAoY2hlY2tNb2RlKG1vZGUsIFNZU1RFTSkpIHsKQEAgLTY3NCwyNSArNjg5LDI1IEBACiAJCQkJCQkJJiYgYXR0cmlidXRlICE9IHJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUKIAkJCQkJCQkmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlLmdldEF0dHJpYnV0ZU5hbWUoKSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkRFUFJFQ0FURUQpCiAJCQkJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVOYW1lKCksIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TWU5USEVUSUMpKSB7Ci0JCQkJCQlkaXNhc3NlbWJsZShhdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQkJCWRpc2Fzc2VtYmxlKGF0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWlmIChhbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJZGlzYXNzZW1ibGUoKElBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSkgYW5ub3RhdGlvbkRlZmF1bHRBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQlkaXNhc3NlbWJsZSgoSUFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlKSBhbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJfQogCQkJaWYgKHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJfQogCQkJaWYgKHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJZGlzYXNzZW1ibGUoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCX0KIAkJCWlmIChydW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCX0KIAkJCWlmIChydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC03MDgsMTEgKzcyMywxMSBAQAogCSAqIEFuc3dlcnMgYmFjayB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgSUNsYXNzRmlsZVJlYWRlciBhY2NvcmRpbmcgdG8gdGhlCiAJICogbW9kZS4KIAkgKiBUaGlzIGlzIGFuIG91dHB1dCBxdWl0ZSBzaW1pbGFyIHRvIHRoZSBqYXZhcCB0b29sLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZVJlYWRlciBUaGUgY2xhc3NGaWxlUmVhZGVyIHRvIGJlIGRpc2Fzc2VtYmxlZAogCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuCiAJICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgdXNlZCB0byBkaXNhc3NlbWJsZSB0aGUgSUNsYXNzRmlsZVJlYWRlcgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgSUNsYXNzRmlsZVJlYWRlciBhY2NvcmRpbmcgdG8gdGhlIG1vZGUKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IG1vZGUpIHsKQEAgLTczNCw5ICs3NDksOSBAQAogCQlpZiAoY2hlY2tNb2RlKG1vZGUsIFNZU1RFTSB8IERFVEFJTEVEKSkgewogCQkJaW50IG1pbm9yVmVyc2lvbiA9IGNsYXNzRmlsZVJlYWRlci5nZXRNaW5vclZlcnNpb24oKTsKIAkJCWludCBtYWpvclZlcnNpb24gPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWFqb3JWZXJzaW9uKCk7Ci0JCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9iZWdpbmNvbW1lbnRsaW5lKTsgCisJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9iZWdpbmNvbW1lbnRsaW5lKTsKIAkJCWlmIChzb3VyY2VBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NvdXJjZWF0dHJpYnV0ZWhlYWRlcik7IAorCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NvdXJjZWF0dHJpYnV0ZWhlYWRlcik7CiAJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2VBdHRyaWJ1dGUuZ2V0U291cmNlRmlsZU5hbWUoKSk7CiAJCQl9CiAJCQlTdHJpbmcgdmVyc2lvbk51bWJlciA9IFZFUlNJT05fVU5LTk9XTjsKQEAgLTc2OCwxMyArNzgzLDEzIEBACiAJCQkJfSkpOwogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CiAJCQlpZiAoc2lnbmF0dXJlQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NpZ25hdHVyZWF0dHJpYnV0ZWhlYWRlciwgbmV3IFN0cmluZyhzaWduYXR1cmVBdHRyaWJ1dGUuZ2V0U2lnbmF0dXJlKCkpKSk7IAorCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc2lnbmF0dXJlYXR0cmlidXRlaGVhZGVyLCBuZXcgU3RyaW5nKHNpZ25hdHVyZUF0dHJpYnV0ZS5nZXRTaWduYXR1cmUoKSkpKTsKIAkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKIAkJCX0KIAkJfQogCQlmaW5hbCBpbnQgbGFzdERvdEluZGV4SW5DbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcuJywgY2xhc3NOYW1lKTsKLQkJCi0JCWlmIChjaGVja01vZGUobW9kZSwgV09SS0lOR19DT1BZKSAmJiBsYXN0RG90SW5kZXhJbkNsYXNzTmFtZSAhPSAtMSkgeyAKKworCQlpZiAoY2hlY2tNb2RlKG1vZGUsIFdPUktJTkdfQ09QWSkgJiYgbGFzdERvdEluZGV4SW5DbGFzc05hbWUgIT0gLTEpIHsKIAkJCS8vIHdlIHByaW50IGEgcGFja2FnZSBkZWNsYXJhdGlvbgogCQkJYnVmZmVyLmFwcGVuZCgicGFja2FnZSAiKTsvLyROT04tTkxTLTEkCiAJCQlidWZmZXIuYXBwZW5kKGNsYXNzTmFtZSwgMCwgbGFzdERvdEluZGV4SW5DbGFzc05hbWUpOwpAQCAtNzg1LDE1ICs4MDAsMTUgQEAKIAkJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBpbm5lckNsYXNzZXNBdHRyaWJ1dGUgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0SW5uZXJDbGFzc2VzQXR0cmlidXRlKCk7CiAJCUlDbGFzc0ZpbGVBdHRyaWJ1dGUgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSA9IFV0aWwuZ2V0QXR0cmlidXRlKGNsYXNzRmlsZVJlYWRlciwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJVTlRJTUVfVklTSUJMRV9BTk5PVEFUSU9OUyk7CiAJCUlDbGFzc0ZpbGVBdHRyaWJ1dGUgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlID0gVXRpbC5nZXRBdHRyaWJ1dGUoY2xhc3NGaWxlUmVhZGVyLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUlVOVElNRV9JTlZJU0lCTEVfQU5OT1RBVElPTlMpOwotCQkKKwogCQlpZiAoY2hlY2tNb2RlKG1vZGUsIERFVEFJTEVEKSkgewogCQkJLy8gZGlzYXNzZW1ibGUgY29tcGFjdCB2ZXJzaW9uIG9mIGFubm90YXRpb25zCiAJCQlpZiAocnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAxLCBtb2RlKTsKKwkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwLCBtb2RlKTsKIAkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKIAkJCX0KIAkJCWlmIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIDEsIG1vZGUpOworCQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCwgbW9kZSk7CiAJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CiAJCQl9CiAJCX0KQEAgLTgxOSwxMSArODM0LDExIEBACiAJCQkJZGVjb2RlTW9kaWZpZXJzRm9yVHlwZShidWZmZXIsIGFjY2Vzc0ZsYWdzKTsKIAkJCQlpZiAoaXNTeW50aGV0aWMoY2xhc3NGaWxlUmVhZGVyKSkgewogCQkJCQlidWZmZXIuYXBwZW5kKCJzeW50aGV0aWMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSk7IAorCQkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSk7CiAJCQkJfQogCQkJfQogCQl9Ci0JCQorCiAJCWZpbmFsIGJvb2xlYW4gaXNBbm5vdGF0aW9uID0gKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19BTk5PVEFUSU9OKSAhPSAwOwogCQlib29sZWFuIGlzSW50ZXJmYWNlID0gZmFsc2U7CiAJCWlmIChpc0VudW0pIHsKQEAgLTgzNyw3ICs4NTIsNyBAQAogCQkJYnVmZmVyLmFwcGVuZCgiaW50ZXJmYWNlICIpOyAvLyROT04tTkxTLTEkCiAJCQlpc0ludGVyZmFjZSA9IHRydWU7CiAJCX0KLQkJCisKIAkJaWYgKGNoZWNrTW9kZShtb2RlLCBXT1JLSU5HX0NPUFkpKSB7CiAJCQkvLyB3ZSBwcmludCB0aGUgc2ltcGxlIGNsYXNzIG5hbWUKIAkJCWZpbmFsIGludCBzdGFydCA9IGxhc3REb3RJbmRleEluQ2xhc3NOYW1lICsgMTsKQEAgLTg0OSw3ICs4NjQsNyBAQAogCQl9IGVsc2UgewogCQkJYnVmZmVyLmFwcGVuZChjbGFzc05hbWUpOwogCQl9Ci0JCQorCiAJCWNoYXJbXSBzdXBlcmNsYXNzTmFtZSA9IGNsYXNzRmlsZVJlYWRlci5nZXRTdXBlcmNsYXNzTmFtZSgpOwogCQlpZiAoc3VwZXJjbGFzc05hbWUgIT0gbnVsbCkgewogCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHN1cGVyY2xhc3NOYW1lLCAnLycsICcuJyk7CkBAIC04NzEsNyArODg2LDcgQEAKIAkJCQkJaWYgKGkgIT0gMCkgewogCQkJCQkJYnVmZmVyCiAJCQkJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29tbWEpCi0JCQkJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpOyAKKwkJCQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSk7CiAJCQkJCX0KIAkJCQkJY2hhcltdIHN1cGVyaW50ZXJmYWNlID0gc3VwZXJjbGFzc0ludGVyZmFjZXNbaV07CiAJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShzdXBlcmludGVyZmFjZSwgJy8nLCAnLicpOwpAQCAtODgwLDcgKzg5NSw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuYmluZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfb3BlbnR5cGVkZWNsYXJhdGlvbikpOyAKKwkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9vcGVudHlwZWRlY2xhcmF0aW9uKSk7CiAJCWlmIChjaGVja01vZGUobW9kZSwgU1lTVEVNKSkgewogCQkJZGlzYXNzZW1ibGUoY2xhc3NGaWxlUmVhZGVyLmdldENvbnN0YW50UG9vbCgpLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIDEpOwogCQl9CkBAIC05MTMsMTAgKzkyOCwxMCBAQAogCQkJfQogCQkJaWYgKGNoZWNrTW9kZShtb2RlLCBTWVNURU0pKSB7CiAJCQkJaWYgKHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwLCBtb2RlKTsKIAkJCQl9CiAJCQkJaWYgKHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCwgbW9kZSk7CiAJCQkJfQogCQkJCWlmIChsZW5ndGggIT0gMCkgewogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC05MjksMTQgKzk0NCwxNCBAQAogCQkJCQkJCSYmIGF0dHJpYnV0ZSAhPSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlCiAJCQkJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVOYW1lKCksIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5ERVBSRUNBVEVEKQogCQkJCQkJCSYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU1lOVEhFVElDKSkgewotCQkJCQkJCWRpc2Fzc2VtYmxlKGF0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKKwkJCQkJCQlkaXNhc3NlbWJsZShhdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCwgbW9kZSk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2Nsb3NldHlwZWRlY2xhcmF0aW9uKTsgCisJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2Nsb3NldHlwZWRlY2xhcmF0aW9uKTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KIApAQCAtOTgwLDE2ICs5OTUsMTcgQEAKIAlwcml2YXRlIGJvb2xlYW4gaXNKYXZhTGFuZ09iamVjdChmaW5hbCBjaGFyW10gY2xhc3NOYW1lKSB7CiAJCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QsIENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGNsYXNzTmFtZSkpOwogCX0KLQkKKworCiAJcHJpdmF0ZSBib29sZWFuIGlzVmFyQXJncyhJTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7CiAJCWludCBhY2Nlc3NGbGFncyA9IG1ldGhvZEluZm8uZ2V0QWNjZXNzRmxhZ3MoKTsKIAkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfVkFSQVJHUykgIT0gMCkgcmV0dXJuIHRydWU7CiAJCS8vIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiB0aGUgdW5zcGVjaWZpZWQgVmFyYXJncyBhdHRyaWJ1dGUKIAkJcmV0dXJuIFV0aWwuZ2V0QXR0cmlidXRlKG1ldGhvZEluZm8sIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlZhcmFyZ3NOYW1lKSAhPSBudWxsOwogCX0KLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW10gbWV0aG9kRGVzY3JpcHRvciwgYm9vbGVhbiBpc1N0YXRpYywgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciAtIDEpOwotCQlEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRGVmYXVsdEJ5dGVjb2RlVmlzaXRvcihjb2RlQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CisJCURlZmF1bHRCeXRlY29kZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yKGNvZGVBdHRyaWJ1dGUsIHBhcmFtZXRlck5hbWVzLCBtZXRob2REZXNjcmlwdG9yLCBpc1N0YXRpYywgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQl0cnkgewogCQkJY29kZUF0dHJpYnV0ZS50cmF2ZXJzZSh2aXNpdG9yKTsKIAkJfSBjYXRjaChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CkBAIC0xMDA0LDcgKzEwMjAsNyBAQAogCQkJaXNGaXJzdEF0dHJpYnV0ZSA9IGZhbHNlOwogCQkJZHVtcFRhYih0YWJOdW1iZXJGb3JFeGNlcHRpb25BdHRyaWJ1dGUsIGJ1ZmZlcik7CiAJCQlmaW5hbCBJRXhjZXB0aW9uVGFibGVFbnRyeVtdIGV4Y2VwdGlvblRhYmxlRW50cmllcyA9IGNvZGVBdHRyaWJ1dGUuZ2V0RXhjZXB0aW9uVGFibGUoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2V4Y2VwdGlvbnRhYmxlaGVhZGVyKTsgCisJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9leGNlcHRpb250YWJsZWhlYWRlcik7CiAJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXJGb3JFeGNlcHRpb25BdHRyaWJ1dGUgKyAxKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uVGFibGVMZW5ndGg7IGkrKykgewogCQkJCWlmIChpICE9IDApIHsKQEAgLTEwMjQsNyArMTA0MCw3IEBACiAJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGV4Y2VwdGlvblRhYmxlRW50cnkuZ2V0U3RhcnRQQygpKSwKIAkJCQkJCUludGVnZXIudG9TdHJpbmcoZXhjZXB0aW9uVGFibGVFbnRyeS5nZXRFbmRQQygpKSwKIAkJCQkJCUludGVnZXIudG9TdHJpbmcoZXhjZXB0aW9uVGFibGVFbnRyeS5nZXRIYW5kbGVyUEMoKSksCi0JCQkJCQluZXcgU3RyaW5nKGNhdGNoVHlwZSkKKwkJCQkJCW5ldyBTdHJpbmcoY2F0Y2hUeXBlKSwKIAkJCQkJfSkpOwogCQkJfQogCQl9CkBAIC0xMDM4LDcgKzEwNTQsNyBAQAogCQkJCWR1bXBUYWIodGFiTnVtYmVyRm9yTGluZUF0dHJpYnV0ZSwgYnVmZmVyKTsKIAkJCQlpc0ZpcnN0QXR0cmlidXRlID0gZmFsc2U7CiAJCQl9Ci0JCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9saW5lbnVtYmVyYXR0cmlidXRlaGVhZGVyKTsgCisJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9saW5lbnVtYmVyYXR0cmlidXRlaGVhZGVyKTsKIAkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlckZvckxpbmVBdHRyaWJ1dGUgKyAxKTsKIAkJCWludFtdW10gbGluZWF0dHJpYnV0ZXNFbnRyaWVzID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUF0dHJpYnV0ZUxlbmd0aDsgaSsrKSB7CkBAIC0xMDUxLDcgKzEwNjcsNyBAQAogCQkJCQkJSW50ZWdlci50b1N0cmluZyhsaW5lYXR0cmlidXRlc0VudHJpZXNbaV1bMV0pCiAJCQkJCX0pKTsKIAkJCX0KLQkJfSAKKwkJfQogCQlmaW5hbCBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSBsb2NhbFZhcmlhYmxlQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMb2NhbFZhcmlhYmxlQXR0cmlidXRlKCk7CiAJCWZpbmFsIGludCBsb2NhbFZhcmlhYmxlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSA9PSBudWxsID8gMCA6IGxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuZ2V0TG9jYWxWYXJpYWJsZVRhYmxlTGVuZ3RoKCk7CiAJCWlmIChsb2NhbFZhcmlhYmxlQXR0cmlidXRlTGVuZ3RoICE9IDApIHsKQEAgLTEwNjIsNyArMTA3OCw3IEBACiAJCQkJaXNGaXJzdEF0dHJpYnV0ZSA9IGZhbHNlOwogCQkJCWR1bXBUYWIodGFiTnVtYmVyRm9yTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgYnVmZmVyKTsKIAkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2xvY2FsdmFyaWFibGV0YWJsZWF0dHJpYnV0ZWhlYWRlcik7IAorCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfbG9jYWx2YXJpYWJsZXRhYmxlYXR0cmlidXRlaGVhZGVyKTsKIAkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlckZvckxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgKyAxKTsKIAkJCUlMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXMgPSBsb2NhbFZhcmlhYmxlQXR0cmlidXRlLmdldExvY2FsVmFyaWFibGVUYWJsZSgpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFZhcmlhYmxlQXR0cmlidXRlTGVuZ3RoOyBpKyspIHsKQEAgLTEwOTUsNyArMTExMSw3IEBACiAJCQkJaXNGaXJzdEF0dHJpYnV0ZSA9IGZhbHNlOwogCQkJCWR1bXBUYWIodGFiTnVtYmVyRm9yTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgYnVmZmVyKTsKIAkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2xvY2FsdmFyaWFibGV0eXBldGFibGVhdHRyaWJ1dGVoZWFkZXIpOyAKKwkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2xvY2FsdmFyaWFibGV0eXBldGFibGVhdHRyaWJ1dGVoZWFkZXIpOwogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyRm9yTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSArIDEpOwogCQkJSUxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyaWVzID0gbG9jYWxWYXJpYWJsZVR5cGVBdHRyaWJ1dGUuZ2V0TG9jYWxWYXJpYWJsZVR5cGVUYWJsZSgpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFZhcmlhYmxlVHlwZVRhYmxlTGVuZ3RoOyBpKyspIHsKQEAgLTExNjcsNyArMTE4Myw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSVN0YWNrTWFwVGFibGVBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMyk7CiAJCWludCBudW1iZXJPZkVudHJpZXMgPSBhdHRyaWJ1dGUuZ2V0TnVtYmVyT2ZFbnRyaWVzKCk7CkBAIC0xMjYwLDI1ICsxMjc2LDE3IEBACiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDMpOwogCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gYXR0cmlidXRlLmdldE51bWJlck9mRW50cmllcygpOwogCQlmaW5hbCBJU3RhY2tNYXBGcmFtZVtdIHN0YWNrTWFwRnJhbWVzID0gYXR0cmlidXRlLmdldFN0YWNrTWFwRnJhbWUoKTsKLQkJaW50IGFic29sdXRlUEMgPSAtMTsKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJPZkVudHJpZXM7IGorKykgewogCQkJaWYgKGogPiAwKSB7CiAJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMyk7CiAJCQl9CiAJCQlmaW5hbCBJU3RhY2tNYXBGcmFtZSBmcmFtZSA9IHN0YWNrTWFwRnJhbWVzW2pdOwogCQkJLy8gZGlzYXNzZW1ibGUgZWFjaCBmcmFtZQotCQkJaW50IG9mZnNldERlbHRhID0gZnJhbWUuZ2V0T2Zmc2V0RGVsdGEoKTsKLQkJCWlmIChhYnNvbHV0ZVBDID09IC0xKSB7Ci0JCQkJYWJzb2x1dGVQQyA9IG9mZnNldERlbHRhOwotCQkJfSBlbHNlIHsKLQkJCQlhYnNvbHV0ZVBDICs9IChvZmZzZXREZWx0YSArIDEpOwotCQkJfQotCQkJLy8gRlVMTF9GUkFNRQogCQkJYnVmZmVyLmFwcGVuZCgKIAkJCQkJTWVzc2FnZXMuYmluZCgKIAkJCQkJCU1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9mcmFtZV9mdWxsX2ZyYW1lLAogCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGFic29sdXRlUEMpLAorCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZnJhbWUuZ2V0T2Zmc2V0RGVsdGEoKSksCiAJCQkJCQkJSW50ZWdlci50b1N0cmluZyhmcmFtZS5nZXROdW1iZXJPZkxvY2FscygpKSwKIAkJCQkJCQlkaXNhc3NlbWJsZShmcmFtZS5nZXRMb2NhbHMoKSwgbW9kZSksCiAJCQkJCQkJSW50ZWdlci50b1N0cmluZyhmcmFtZS5nZXROdW1iZXJPZlN0YWNrSXRlbXMoKSksCkBAIC0xMjkxLDcgKzEyOTksNyBAQAogCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJaW50IGxlbmd0aCA9IGNvbnN0YW50UG9vbC5nZXRDb25zdGFudFBvb2xDb3VudCgpOwotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9jb25zdGFudHBvb2xoZWFkZXIpOyAKKwkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29uc3RhbnRwb29saGVhZGVyKTsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CiAJCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCWlmIChpICE9IDEpIHsKQEAgLTE0MDYsMTIgKzE0MTQsMTIgQEAKIAogCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlIGVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2VuY2xvc2luZ21ldGhvZGhlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9lbmNsb3NpbmdtZXRob2RoZWFkZXIpOwogCQlidWZmZXIKLQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbnN0YW50cG9vbGluZGV4KSAKKwkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbnN0YW50cG9vbGluZGV4KQogCQkJLmFwcGVuZChlbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUuZ2V0RW5jbG9zaW5nQ2xhc3NJbmRleCgpKQogCQkJLmFwcGVuZCgiICIpLy8kTk9OLU5MUy0xJAotCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29uc3RhbnRwb29saW5kZXgpIAorCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29uc3RhbnRwb29saW5kZXgpCiAJCQkuYXBwZW5kKGVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5nZXRNZXRob2ROYW1lQW5kVHlwZUluZGV4KCkpCiAJCQkuYXBwZW5kKCIgIikvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKGVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5nZXRFbmNsb3NpbmdDbGFzcygpKTsKQEAgLTE0MjIsMTggKzE0MzAsMTggQEAKIAkJCQkuYXBwZW5kKGVuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5nZXRNZXRob2REZXNjcmlwdG9yKCkpOwogCQl9CiAJfQotCQorCiAJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlRW51bUNvbnN0YW50cyhJRmllbGRJbmZvIGZpZWxkSW5mbywgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGNoYXJbXVtdIGFyZ3VtZW50VHlwZXMsIGludCBtb2RlKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CiAJCWZpbmFsIElDbGFzc0ZpbGVBdHRyaWJ1dGUgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSA9IFV0aWwuZ2V0QXR0cmlidXRlKGZpZWxkSW5mbywgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlJVTlRJTUVfVklTSUJMRV9BTk5PVEFUSU9OUyk7CiAJCWZpbmFsIElDbGFzc0ZpbGVBdHRyaWJ1dGUgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlID0gVXRpbC5nZXRBdHRyaWJ1dGUoZmllbGRJbmZvLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuUlVOVElNRV9JTlZJU0lCTEVfQU5OT1RBVElPTlMpOwogCQkvLyBkaXNhc3NlbWJsZSBjb21wYWN0IHZlcnNpb24gb2YgYW5ub3RhdGlvbnMKIAkJaWYgKHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKKwkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQl9CiAJCWlmIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcigoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSwgbW9kZSk7CisJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQl9CiAJCWJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhmaWVsZEluZm8uZ2V0TmFtZSgpKSk7CkBAIC0xNDcyLDcgKzE0ODAsNyBAQAogCQl9CiAJCWJ1ZmZlci5hcHBlbmQoJyknKS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbW1hKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBEaXNhc3NlbWJsZSBhIGZpZWxkIGluZm8KIAkgKi8KQEAgLTE0OTEsNyArMTQ5OSw3IEBACiAJCQl9CiAJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQkJaWYgKHNpZ25hdHVyZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zaWduYXR1cmVhdHRyaWJ1dGVoZWFkZXIsIG5ldyBTdHJpbmcoc2lnbmF0dXJlQXR0cmlidXRlLmdldFNpZ25hdHVyZSgpKSkpOyAKKwkJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NpZ25hdHVyZWF0dHJpYnV0ZWhlYWRlciwgbmV3IFN0cmluZyhzaWduYXR1cmVBdHRyaWJ1dGUuZ2V0U2lnbmF0dXJlKCkpKSk7CiAJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCX0KIAkJfQpAQCAtMTUwMCwxMSArMTUwOCwxMSBAQAogCQlpZiAoY2hlY2tNb2RlKG1vZGUsIERFVEFJTEVEKSkgewogCQkJLy8gZGlzYXNzZW1ibGUgY29tcGFjdCB2ZXJzaW9uIG9mIGFubm90YXRpb25zCiAJCQlpZiAocnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKKwkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwogCQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CiAJCQl9CiAJCQlpZiAocnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJZGlzYXNzZW1ibGVBc01vZGlmaWVyKChJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKKwkJCQlkaXNhc3NlbWJsZUFzTW9kaWZpZXIoKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCX0KIAkJfQpAQCAtMTUyNyw3ICsxNTM1LDcgQEAKIAkJYnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKGZpZWxkSW5mby5nZXROYW1lKCkpKTsKIAkJSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSA9IGZpZWxkSW5mby5nZXRDb25zdGFudFZhbHVlQXR0cmlidXRlKCk7CiAJCWlmIChjb25zdGFudFZhbHVlQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2ZpZWxkaGFzY29uc3RhbnQpOyAKKwkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2ZpZWxkaGFzY29uc3RhbnQpOwogCQkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5nZXRDb25zdGFudFZhbHVlKCk7CiAJCQlzd2l0Y2goY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpKSB7CiAJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfTG9uZyA6CkBAIC0xNTcyLDcgKzE1ODAsNyBAQAogCQkJCQlidWZmZXIuYXBwZW5kKCJcIiIgKyBkZWNvZGVTdHJpbmdWYWx1ZShjb25zdGFudFBvb2xFbnRyeS5nZXRTdHJpbmdWYWx1ZSgpKSArICJcIiIgKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQkJfQogCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2VuZG9mZmllbGRoZWFkZXIpOyAKKwkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfZW5kb2ZmaWVsZGhlYWRlcik7CiAJCWlmIChjaGVja01vZGUobW9kZSwgU1lTVEVNKSkgewogCQkJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBmaWVsZEluZm8uZ2V0QXR0cmlidXRlcygpOwogCQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMubGVuZ3RoOwpAQCAtMTU4NSwyMiArMTU5MywyMiBAQAogCQkJCQkJJiYgYXR0cmlidXRlICE9IHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUKIAkJCQkJCSYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuREVQUkVDQVRFRCkKIAkJCQkJCSYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU1lOVEhFVElDKSkgewotCQkJCQkJZGlzYXNzZW1ibGUoYXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCQkJCQlkaXNhc3NlbWJsZShhdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWlmIChydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUpIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKIAkJCX0KIAkJCWlmIChydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWRpc2Fzc2VtYmxlKChJUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlKSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQlkaXNhc3NlbWJsZSgoSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSkgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciwgbW9kZSk7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBpbm5lckNsYXNzZXNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2lubmVyYXR0cmlidXRlc2hlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbm5lcmF0dHJpYnV0ZXNoZWFkZXIpOwogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKIAkJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5W10gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cmllcyA9IGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5nZXRJbm5lckNsYXNzQXR0cmlidXRlc0VudHJpZXMoKTsKIAkJaW50IGxlbmd0aCA9IGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJpZXMubGVuZ3RoOwpAQCAtMTYwOSw3ICsxNjE3LDcgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJaWYgKGkgIT0gMCkgewogCQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbW1hKTsKLQkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsJCQkJCisJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CiAJCQl9CiAJCQlpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSA9IGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJpZXNbaV07CiAJCQlpbm5lckNsYXNzTmFtZUluZGV4ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJDbGFzc05hbWVJbmRleCgpOwpAQCAtMTYxNyw5MyArMTYyNSw5MyBAQAogCQkJaW5uZXJOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lck5hbWVJbmRleCgpOwogCQkJYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRBY2Nlc3NGbGFncygpOwogCQkJYnVmZmVyCi0JCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfb3BlbmlubmVyY2xhc3NlbnRyeSkgCi0JCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfaW5uZXJfY2xhc3NfaW5mb19uYW1lKSAKLQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9jb25zdGFudHBvb2xpbmRleCkgCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfb3BlbmlubmVyY2xhc3NlbnRyeSkKKwkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbm5lcl9jbGFzc19pbmZvX25hbWUpCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29uc3RhbnRwb29saW5kZXgpCiAJCQkJLmFwcGVuZChpbm5lckNsYXNzTmFtZUluZGV4KTsKIAkJCWlmIChpbm5lckNsYXNzTmFtZUluZGV4ICE9IDApIHsKIAkJCQlidWZmZXIKLQkJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAorCQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkKIAkJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lckNsYXNzTmFtZSgpKTsKIAkJCX0KIAkJCWJ1ZmZlcgotCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbW1hKSAKLQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCi0JCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfb3V0ZXJfY2xhc3NfaW5mb19uYW1lKSAKLQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9jb25zdGFudHBvb2xpbmRleCkgCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY29tbWEpCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfb3V0ZXJfY2xhc3NfaW5mb19uYW1lKQorCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbnN0YW50cG9vbGluZGV4KQogCQkJCS5hcHBlbmQob3V0ZXJDbGFzc05hbWVJbmRleCk7CiAJCQlpZiAob3V0ZXJDbGFzc05hbWVJbmRleCAhPSAwKSB7Ci0JCQkJYnVmZmVyCQotCQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkgCisJCQkJYnVmZmVyCisJCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKQogCQkJCQkuYXBwZW5kKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmdldE91dGVyQ2xhc3NOYW1lKCkpOwogCQkJfQogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCWR1bXBUYWIodGFiTnVtYmVyLCBidWZmZXIpOwotCQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpOyAKKwkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKTsKIAkJCWJ1ZmZlcgotCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2lubmVyX25hbWUpIAotCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbnN0YW50cG9vbGluZGV4KSAKKwkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbm5lcl9uYW1lKQorCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2NvbnN0YW50cG9vbGluZGV4KQogCQkJCS5hcHBlbmQoaW5uZXJOYW1lSW5kZXgpOwogCQkJaWYgKGlubmVyTmFtZUluZGV4ICE9IDApIHsKIAkJCQlidWZmZXIKLQkJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAorCQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkKIAkJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lck5hbWUoKSk7CiAJCQl9CiAJCQlidWZmZXIKLQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9jb21tYSkgCi0JCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpIAotCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2lubmVyX2FjY2Vzc2ZsYWdzKSAKKwkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9jb21tYSkKKwkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9zcGFjZSkKKwkJCQkuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbm5lcl9hY2Nlc3NmbGFncykKIAkJCQkuYXBwZW5kKGFjY2Vzc0ZsYWdzKQotCQkJCS5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3NwYWNlKTsgCisJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfc3BhY2UpOwogCQkJZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKGJ1ZmZlciwgYWNjZXNzRmxhZ3MsIHRydWUpOwogCQkJYnVmZmVyCiAJCQkJLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfY2xvc2Vpbm5lcmNsYXNzZW50cnkpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKGludCBpbmRleCwgSVBhcmFtZXRlckFubm90YXRpb24gcGFyYW1ldGVyQW5ub3RhdGlvbiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoaW50IGluZGV4LCBJUGFyYW1ldGVyQW5ub3RhdGlvbiBwYXJhbWV0ZXJBbm5vdGF0aW9uLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHBhcmFtZXRlckFubm90YXRpb24uZ2V0QW5ub3RhdGlvbnMoKTsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CiAJCWJ1ZmZlci5hcHBlbmQoCiAJCQlNZXNzYWdlcy5iaW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9wYXJhbWV0ZXJhbm5vdGF0aW9uZW50cnlzdGFydCwgbmV3IFN0cmluZ1tdIHtJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KSwgSW50ZWdlci50b1N0cmluZyhhbm5vdGF0aW9ucy5sZW5ndGgpfSkpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWRpc2Fzc2VtYmxlKGFubm90YXRpb25zW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJZGlzYXNzZW1ibGUoYW5ub3RhdGlvbnNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSwgbW9kZSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSVJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSBydW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3J1bnRpbWVpbnZpc2libGVhbm5vdGF0aW9uc2F0dHJpYnV0ZWhlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9ydW50aW1laW52aXNpYmxlYW5ub3RhdGlvbnNhdHRyaWJ1dGVoZWFkZXIpOwogCQlJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmdldEFubm90YXRpb25zKCk7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJZGlzYXNzZW1ibGUoYW5ub3RhdGlvbnNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlIHJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSVJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSBydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgewogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcnVudGltZWludmlzaWJsZXBhcmFtZXRlcmFubm90YXRpb25zYXR0cmlidXRlaGVhZGVyKTsgCisJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3J1bnRpbWVpbnZpc2libGVwYXJhbWV0ZXJhbm5vdGF0aW9uc2F0dHJpYnV0ZWhlYWRlcik7CiAJCUlQYXJhbWV0ZXJBbm5vdGF0aW9uW10gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBydW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlkaXNhc3NlbWJsZShpLCBwYXJhbWV0ZXJBbm5vdGF0aW9uc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgcnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKLQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3J1bnRpbWV2aXNpYmxlYW5ub3RhdGlvbnNhdHRyaWJ1dGVoZWFkZXIpOyAKLQkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWRpc2Fzc2VtYmxlKGksIHBhcmFtZXRlckFubm90YXRpb25zW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlIHJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElSdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlIHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgewogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKLQkJYnVmZmVyLmFwcGVuZChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcnVudGltZXZpc2libGVwYXJhbWV0ZXJhbm5vdGF0aW9uc2F0dHJpYnV0ZWhlYWRlcik7IAorCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9ydW50aW1ldmlzaWJsZWFubm90YXRpb25zYXR0cmlidXRlaGVhZGVyKTsKKwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlkaXNhc3NlbWJsZShhbm5vdGF0aW9uc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSBydW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3J1bnRpbWV2aXNpYmxlcGFyYW1ldGVyYW5ub3RhdGlvbnNhdHRyaWJ1dGVoZWFkZXIpOwogCQlJUGFyYW1ldGVyQW5ub3RhdGlvbltdIHBhcmFtZXRlckFubm90YXRpb25zID0gcnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWRpc2Fzc2VtYmxlKGksIHBhcmFtZXRlckFubm90YXRpb25zW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJZGlzYXNzZW1ibGUoaSwgcGFyYW1ldGVyQW5ub3RhdGlvbnNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSwgbW9kZSk7CiAJCX0KIAl9CiAKQEAgLTE4MDMsMjIgKzE4MTEsMjYgQEAKIAkJCQkJCXZhbHVlID0gRG91YmxlLnRvU3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5LmdldERvdWJsZVZhbHVlKCkpOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXI6CisJCQkJCQlTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJCQkJCXN3aXRjaChhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuZ2V0VGFnKCkpIHsKIAkJCQkJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuQ0hBUl9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICInIiArIChjaGFyKSBjb25zdGFudFBvb2xFbnRyeS5nZXRJbnRlZ2VyVmFsdWUoKSArICInIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoJ1wnJyk7CisJCQkJCQkJCWVzY2FwZUNoYXIodGVtcCwgKGNoYXIpIGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKTsKKwkJCQkJCQkJdGVtcC5hcHBlbmQoJ1wnJyk7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5CT09MRUFOX1RBRyA6Ci0JCQkJCQkJCXZhbHVlID0gY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgPT0gMSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgPT0gMSA/ICJ0cnVlIiA6ICJmYWxzZSIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5CWVRFX1RBRyA6Ci0JCQkJCQkJCXZhbHVlID0gIihieXRlKSAiICsgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoIihieXRlKSAiKS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5TSE9SVF9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICAiKHNob3J0KSAiICsgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJdGVtcC5hcHBlbmQoIihzaG9ydCkgIikuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQlicmVhazsKIAkJCQkJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuSU5URUdFUl9UQUcgOgotCQkJCQkJCQl2YWx1ZSA9ICAiKGludCkgIiArIGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCXRlbXAuYXBwZW5kKCIoaW50KSAiKS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CisJCQkJCQl2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHRlbXApOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0Zjg6CiAJCQkJCQl2YWx1ZSA9ICJcIiIgKyBkZWNvZGVTdHJpbmdWYWx1ZShjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKSkgKyAiXCIiOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCkBAIC0xODI4LDEyICsxODQwLDEyIEBACiAJCQljYXNlIElBbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuRU5VTV9UQUc6CiAJCQkJZmluYWwgY2hhcltdIHR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGFubm90YXRpb25Db21wb25lbnRWYWx1ZS5nZXRFbnVtQ29uc3RhbnRUeXBlTmFtZSgpLCAnLycsICcuJyk7CiAJCQkJZmluYWwgY2hhcltdIGNvbnN0YW50TmFtZSA9IGFubm90YXRpb25Db21wb25lbnRWYWx1ZS5nZXRFbnVtQ29uc3RhbnROYW1lKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZU5hbWUpKS5hcHBlbmQoJy4nKS5hcHBlbmQoY29uc3RhbnROYW1lKTsKKwkJCQlidWZmZXIuYXBwZW5kKHJldHVybkNsYXNzTmFtZShTaWduYXR1cmUudG9DaGFyQXJyYXkodHlwZU5hbWUpLCAnLicsIG1vZGUpKS5hcHBlbmQoJy4nKS5hcHBlbmQoY29uc3RhbnROYW1lKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5DTEFTU19UQUc6CiAJCQkJY29uc3RhbnRQb29sRW50cnkgPSBhbm5vdGF0aW9uQ29tcG9uZW50VmFsdWUuZ2V0Q2xhc3NJbmZvKCk7CiAJCQkJZmluYWwgY2hhcltdIGNsYXNzTmFtZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKSwgJy8nLCAnLicpOwotCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KGNsYXNzTmFtZSkpOworCQkJCWJ1ZmZlci5hcHBlbmQocmV0dXJuQ2xhc3NOYW1lKFNpZ25hdHVyZS50b0NoYXJBcnJheShjbGFzc05hbWUpLCAnLicsIG1vZGUpKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUFubm90YXRpb25Db21wb25lbnRWYWx1ZS5BTk5PVEFUSU9OX1RBRzoKIAkJCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbkNvbXBvbmVudFZhbHVlLmdldEFubm90YXRpb25WYWx1ZSgpOwpAQCAtMTg1Niw3ICsxODY4LDcgQEAKIAkJSUFubm90YXRpb25Db21wb25lbnRWYWx1ZSBjb21wb25lbnRWYWx1ZSA9IGFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlLmdldE1lbWJlclZhbHVlKCk7CiAJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcihjb21wb25lbnRWYWx1ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxLCBtb2RlKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGVBc01vZGlmaWVyKElSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgcnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKQEAgLTE4NjQsOSArMTg3NiwyOSBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlQXNNb2RpZmllcihJUGFyYW1ldGVyQW5ub3RhdGlvbltdIHBhcmFtZXRlckFubm90YXRpb25zLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgaW5kZXgsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgeworCQlpZiAocGFyYW1ldGVyQW5ub3RhdGlvbnMubGVuZ3RoID4gaW5kZXgpIHsKKwkJCWRpc2Fzc2VtYmxlQXNNb2RpZmllcihwYXJhbWV0ZXJBbm5vdGF0aW9uc1tpbmRleF0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSwgbW9kZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGVBc01vZGlmaWVyKElQYXJhbWV0ZXJBbm5vdGF0aW9uIHBhcmFtZXRlckFubm90YXRpb24sIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgeworCQlpZiAocGFyYW1ldGVyQW5ub3RhdGlvbiA9PSBudWxsKSByZXR1cm47CisJCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uLmdldEFubm90YXRpb25zKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQkJfQorCQkJZGlzYXNzZW1ibGVBc01vZGlmaWVyKGFubm90YXRpb25zW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOworCQl9CisJfQorCiAJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlQXNNb2RpZmllcihJUnVudGltZVZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZSBydW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKIAkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFubm90YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAoaSA+IDApIHsKKwkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQkJfQogCQkJZGlzYXNzZW1ibGVBc01vZGlmaWVyKGFubm90YXRpb25zW2ldLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEsIG1vZGUpOwogCQl9CiAJfQpAQCAtMTk0Miw3ICsxOTc0LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXByaXZhdGUgY2hhcltdW10gZ2V0Q29uc3RydWN0b3JBcmd1bWVudHNGb3JFbnVtKGZpbmFsIElNZXRob2RJbmZvW10gbWV0aG9kcykgewogCQlsb29wOiBmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZHNbaV07CkBAIC0xOTYxLDIxICsxOTkzLDIxIEBACiAKIAlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcFRhYihpbnQgdGFiTnVtYmVyLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiTnVtYmVyOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2luZGVudGF0aW9uKTsgCisJCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9pbmRlbnRhdGlvbik7CiAJCX0KIAl9Ci0JCisKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBkdW1wTmV3TGluZVdpdGhUYWJzKFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CiAJCXJldHVybiBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotCX0gCi0JCisJfQorCiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyI2dldERlc2NyaXB0aW9uKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuZGlzYXNzZW1ibGVyX2Rlc2NyaXB0aW9uOyAKKwkJcmV0dXJuIE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9kZXNjcmlwdGlvbjsKIAl9CiAKIAlwcml2YXRlIElFbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUgZ2V0RW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyKSB7CkBAIC0xOTk2LDcgKzIwMjgsNyBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXByaXZhdGUgY2hhcltdW10gZ2V0UGFyYW1ldGVyTmFtZXMoY2hhcltdIG1ldGhvZERlc2NyaXB0b3IsIElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIGludCBhY2Nlc3NGbGFncykgewogCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChtZXRob2REZXNjcmlwdG9yKTsKIAkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltwYXJhbUNvdW50XVtdOwpAQCAtMjAxMSwyMiArMjA0MywyMiBAQAogCQkJCQlpZiAoc2VhcmNoZWRFbnRyeSAhPSBudWxsKSB7CiAJCQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IHNlYXJjaGVkRW50cnkuZ2V0TmFtZSgpOwogCQkJCQl9IGVsc2UgewotCQkJCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcGFyYW1ldGVybmFtZS50b0NoYXJBcnJheSgpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLnRvQ2hhckFycmF5KCkpOyAKKwkJCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoTWVzc2FnZXMuZGlzYXNzZW1ibGVyX3BhcmFtZXRlcm5hbWUudG9DaGFyQXJyYXkoKSwgSW50ZWdlci50b1N0cmluZyhpKS50b0NoYXJBcnJheSgpKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUNvdW50OyBpKyspIHsKLQkJCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcGFyYW1ldGVybmFtZS50b0NoYXJBcnJheSgpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLnRvQ2hhckFycmF5KCkpOyAKKwkJCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcGFyYW1ldGVybmFtZS50b0NoYXJBcnJheSgpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLnRvQ2hhckFycmF5KCkpOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChNZXNzYWdlcy5kaXNhc3NlbWJsZXJfcGFyYW1ldGVybmFtZS50b0NoYXJBcnJheSgpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLnRvQ2hhckFycmF5KCkpOyAKKwkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KE1lc3NhZ2VzLmRpc2Fzc2VtYmxlcl9wYXJhbWV0ZXJuYW1lLnRvQ2hhckFycmF5KCksIEludGVnZXIudG9TdHJpbmcoaSkudG9DaGFyQXJyYXkoKSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIHBhcmFtZXRlck5hbWVzOwogCX0KLQkKKwogCXByaXZhdGUgaW50IGdldExvY2FsSW5kZXgoZmluYWwgaW50IHN0YXJ0aW5nU2xvdCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBjaGFyW10gbWV0aG9kRGVzY3JpcHRvcikgewogCQlpbnQgc2xvdCA9IHN0YXJ0aW5nU2xvdDsKIAkJZmluYWwgY2hhcltdW10gdHlwZXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kRGVzY3JpcHRvcik7CkBAIC0yMDY3LDcgKzIwOTksNyBAQAogCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZmllbGREZXNjcmlwdG9yU2lnbmF0dXJlLCAnJScsICckJyk7CiAJCXJldHVybiBmaWVsZERlc2NyaXB0b3JTaWduYXR1cmU7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIGlzRGVwcmVjYXRlZChJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlcikgewogCQlJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRBdHRyaWJ1dGVzKCk7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CkBAIC0yMDc3LDcgKzIxMDksNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gaXNTeW50aGV0aWMoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIpIHsKIAkJaW50IGZsYWdzID0gY2xhc3NGaWxlUmVhZGVyLmdldEFjY2Vzc0ZsYWdzKCk7CiAJCWlmICgoZmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NZTlRIRVRJQykgIT0gMCkgewpAQCAtMjA5MSwxMSArMjEyMywxMSBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RlKGludCBtb2RlLCBpbnQgZmxhZykgewogCQlyZXR1cm4gKG1vZGUgJiBmbGFnKSAhPSAwOwogCX0KLQkKKwogCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBhY3QoaW50IG1vZGUpIHsKIAkJcmV0dXJuIChtb2RlICYgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuQ09NUEFDVCkgIT0gMDsKIAl9CkBAIC0yMTExLDcgKzIxNDMsNyBAQAogCQl9CiAJCXJldHVybiBjbGFzc0luZm9OYW1lOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCB3cml0ZU5ld0xpbmUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKIAkJYnVmZmVyLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKIAkJZHVtcFRhYih0YWJOdW1iZXIsIGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0VuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUuamF2YQppbmRleCBiZmE5YTYwLi5mM2MzZGJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0VuY2xvc2luZ01ldGhvZEF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMTEgKzE4LDExIEBACiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBFbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUuCi0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBjbGFzcyBFbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUgaW1wbGVtZW50cyBJRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlIHsKLQkKKwogCXByaXZhdGUgaW50IGVuY2xvc2luZ0NsYXNzSW5kZXg7CiAJcHJpdmF0ZSBjaGFyW10gZW5jbG9zaW5nQ2xhc3NOYW1lOwogCXByaXZhdGUgaW50IG1ldGhvZERlc2NyaXB0b3JJbmRleDsKQEAgLTMwLDcgKzMwLDcgQEAKIAlwcml2YXRlIGludCBtZXRob2ROYW1lSW5kZXg7CiAJcHJpdmF0ZSBjaGFyW10gbWV0aG9kTmFtZTsKIAlwcml2YXRlIGludCBtZXRob2ROYW1lQW5kVHlwZUluZGV4OwotCQorCiAJRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CiAJCWludCBpbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25BdHRyaWJ1dGUuamF2YQppbmRleCA1MTliZmNmLi5jMGVlOTA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTEgKzIwLDExIEBACiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUV4Y2VwdGlvbkF0dHJpYnV0ZS4KICAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkF0dHJpYnV0ZSBleHRlbmRzIENsYXNzRmlsZUF0dHJpYnV0ZSBpbXBsZW1lbnRzIElFeGNlcHRpb25BdHRyaWJ1dGUgewkKK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25BdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUgaW1wbGVtZW50cyBJRXhjZXB0aW9uQXR0cmlidXRlIHsKIAlwcml2YXRlIGludCBleGNlcHRpb25zTnVtYmVyOwogCXByaXZhdGUgY2hhcltdW10gZXhjZXB0aW9uTmFtZXM7CiAJcHJpdmF0ZSBpbnRbXSBleGNlcHRpb25JbmRleGVzOwotCQorCiAJRXhjZXB0aW9uQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CiAJCXRoaXMuZXhjZXB0aW9uc051bWJlciA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CkBAIC0zOCwxNiArMzgsMTYgQEAKIAkJaW50IHJlYWRPZmZzZXQgPSA4OwogCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uTGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2VwdGlvbkluZGV4ZXNbaV0gPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCBvZmZzZXQpOwotCQkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkoZXhjZXB0aW9uSW5kZXhlc1tpXSk7CisJCQl0aGlzLmV4Y2VwdGlvbkluZGV4ZXNbaV0gPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCBvZmZzZXQpOworCQkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5leGNlcHRpb25JbmRleGVzW2ldKTsKIAkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzKSB7CiAJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CiAJCQl9Ci0JCQlleGNlcHRpb25OYW1lc1tpXSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5mb05hbWUoKTsKKwkJCXRoaXMuZXhjZXB0aW9uTmFtZXNbaV0gPSBjb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZm9OYW1lKCk7CiAJCQlyZWFkT2Zmc2V0ICs9IDI7CiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIElFeGNlcHRpb25BdHRyaWJ1dGUjZ2V0RXhjZXB0aW9uSW5kZXhlcygpCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvblRhYmxlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCmluZGV4IGYwMWVhMzcuLjBlZGIxOGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5LDcgKzI5LDcgQEAKIAlwcml2YXRlIGludCBoYW5kbGVyUEM7CiAJcHJpdmF0ZSBpbnQgY2F0Y2hUeXBlSW5kZXg7CiAJcHJpdmF0ZSBjaGFyW10gY2F0Y2hUeXBlOwotCQorCiAJRXhjZXB0aW9uVGFibGVFbnRyeShieXRlW10gY2xhc3NGaWxlQnl0ZXMsIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewogCQl0aGlzLnN0YXJ0UEMgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOwogCQl0aGlzLmVuZFBDID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMiwgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRmllbGRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0ZpZWxkSW5mby5qYXZhCmluZGV4IDhhMGRjYzEuLmUwMmY4YzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRmllbGRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9GaWVsZEluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNSw3ICszNSw3IEBACiAJcHJpdmF0ZSBib29sZWFuIGlzU3ludGhldGljOwogCXByaXZhdGUgY2hhcltdIG5hbWU7CiAJcHJpdmF0ZSBpbnQgbmFtZUluZGV4OwotCQorCiAJLyoqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIGJ5dGVbXQogCSAqIEBwYXJhbSBjb25zdGFudFBvb2wgSUNvbnN0YW50UG9vbApAQCAtNTQsMTQgKzU0LDE0IEBACiAJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKIAkJfQogCQl0aGlzLm5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKLQkKKwogCQl0aGlzLmRlc2NyaXB0b3JJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDQsIG9mZnNldCk7CiAJCWNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KHRoaXMuZGVzY3JpcHRvckluZGV4KTsKIAkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgewogCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CiAJCX0KIAkJdGhpcy5kZXNjcmlwdG9yID0gY29uc3RhbnRQb29sRW50cnkuZ2V0VXRmOFZhbHVlKCk7Ci0JCisKIAkJdGhpcy5hdHRyaWJ1dGVzQ291bnQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOwogCQl0aGlzLmF0dHJpYnV0ZXMgPSBDbGFzc0ZpbGVBdHRyaWJ1dGUuTk9fQVRUUklCVVRFUzsKIAkJaW50IHJlYWRPZmZzZXQgPSA4OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9IYW5kbGVGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0hhbmRsZUZhY3RvcnkuamF2YQppbmRleCA0ODA3NDQxLi5jNzdiOWQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0hhbmRsZUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0hhbmRsZUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMywxOCArMzMsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5BYnN0cmFjdEphdmFTZWFyY2hTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIC8qKgpAQCAtNTYsNyArNDksNyBAQAogCSAqIENhY2hlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSBzcGVlZCBwZXJmb3JtYW5jZS4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBsYXN0UGtnRnJhZ21lbnRSb290UGF0aDsKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGxhc3RQa2dGcmFnbWVudFJvb3Q7CisJcHJpdmF0ZSBQYWNrYWdlRnJhZ21lbnRSb290IGxhc3RQa2dGcmFnbWVudFJvb3Q7CiAKIAkvKioKIAkgKiBDYWNoZSBwYWNrYWdlIGhhbmRsZXMgdG8gb3B0aW1pemUgbWVtb3J5LgpAQCAtNjgsMTQgKzYxLDE0IEBACiAJcHVibGljIEhhbmRsZUZhY3RvcnkoKSB7CiAJCXRoaXMuamF2YU1vZGVsID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7CiAJfQotCQorCiAKIAkvKioKIAkgKiBDcmVhdGVzIGFuIE9wZW5hYmxlIGhhbmRsZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoLgotCSAqIFRoZSByZXNvdXJjZSBwYXRoIGNhbiBiZSBhIHBhdGggdG8gYSBmaWxlIGluIHRoZSB3b3JrYmVuY2ggKGVnLiAvUHJvai9jb20vaWJtL2pkdC9jb3JlL0hhbmRsZUZhY3RvcnkuamF2YSkKKwkgKiBUaGUgcmVzb3VyY2UgcGF0aCBjYW4gYmUgYSBwYXRoIHRvIGEgZmlsZSBpbiB0aGUgd29ya2JlbmNoIChlLmcuIC9Qcm9qL2NvbS9pYm0vamR0L2NvcmUvSGFuZGxlRmFjdG9yeS5qYXZhKQogCSAqIG9yIGEgcGF0aCB0byBhIGZpbGUgaW4gYSBqYXIgZmlsZSAtIGl0IHRoZW4gY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIGphciBmaWxlIGFuZCB0aGUgcGF0aCB0byB0aGUgZmlsZSBpbiB0aGUgamFyCi0JICogKGVnLiBjOi9qZGsxLjIuMi9qcmUvbGliL3J0LmphcnxqYXZhL2xhbmcvT2JqZWN0LmNsYXNzIG9yIC9Qcm9qL3J0LmphcnxqYXZhL2xhbmcvT2JqZWN0LmNsYXNzKQotCSAqIE5PVEU6IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSByZXNvdXJjZSBwYXRoIGlzIHRoZSB0b1N0cmluZygpIG9mIGFuIElQYXRoLCAKKwkgKiAoZS5nLiBjOi9qZGsxLjIuMi9qcmUvbGliL3J0LmphcnxqYXZhL2xhbmcvT2JqZWN0LmNsYXNzIG9yIC9Qcm9qL3J0LmphcnxqYXZhL2xhbmcvT2JqZWN0LmNsYXNzKQorCSAqIE5PVEU6IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSByZXNvdXJjZSBwYXRoIGlzIHRoZSB0b1N0cmluZygpIG9mIGFuIElQYXRoLAogCSAqICAgICAgIGluIG90aGVyIHdvcmRzLCBpdCB1c2VzIHRoZSBJUGF0aC5TRVBBUkFUT1IgZm9yIGZpbGUgcGF0aAogCSAqICAgICAgICAgICAgYW5kIGl0IHVzZXMgJy8nIGZvciBlbnRyaWVzIGluIGEgemlwIGZpbGUuCiAJICogSWYgbm90IG51bGwsIHVzZXMgdGhlIGdpdmVuIHNjb3BlIGFzIGEgaGludCBmb3IgZ2V0dGluZyBKYXZhIHByb2plY3QgaGFuZGxlcy4KQEAgLTg2LDExICs3OSwxMSBAQAogCQkJLy8gcGF0aCB0byBhIGNsYXNzIGZpbGUgaW5zaWRlIGEgamFyCiAJCQkvLyBPcHRpbWl6YXRpb246IGNhY2hlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBoYW5kbGUgYW5kIHBhY2thZ2UgaGFuZGxlcwogCQkJaW50IHJvb3RQYXRoTGVuZ3RoOwotCQkJaWYgKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPT0gbnVsbCAKKwkJCWlmICh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoID09IG51bGwKIAkJCQkJfHwgKHJvb3RQYXRoTGVuZ3RoID0gdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aC5sZW5ndGgoKSkgIT0gcmVzb3VyY2VQYXRoLmxlbmd0aCgpCiAJCQkJCXx8ICFyZXNvdXJjZVBhdGgucmVnaW9uTWF0Y2hlcygwLCB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoLCAwLCByb290UGF0aExlbmd0aCkpIHsKIAkJCQlTdHJpbmcgamFyUGF0aD0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gdGhpcy5nZXRKYXJQa2dGcmFnbWVudFJvb3QoamFyUGF0aCwgc2NvcGUpOworCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZ2V0SmFyUGtnRnJhZ21lbnRSb290KHJlc291cmNlUGF0aCwgc2VwYXJhdG9ySW5kZXgsIGphclBhdGgsIHNjb3BlKTsKIAkJCQlpZiAocm9vdCA9PSBudWxsKQogCQkJCQlyZXR1cm4gbnVsbDsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgKIAkJCQl0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoPSBqYXJQYXRoOwpAQCAtMTEwLDcgKzEwMyw3IEBACiAJCQl9CiAJCQlJUGFja2FnZUZyYWdtZW50IHBrZ0ZyYWdtZW50PSAoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5wYWNrYWdlSGFuZGxlcy5nZXQocGtnTmFtZSk7CiAJCQlpZiAocGtnRnJhZ21lbnQgPT0gbnVsbCkgewotCQkJCXBrZ0ZyYWdtZW50PSAoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdCkuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOworCQkJCXBrZ0ZyYWdtZW50PSB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOwogCQkJCXRoaXMucGFja2FnZUhhbmRsZXMucHV0KHBrZ05hbWUsIHBrZ0ZyYWdtZW50KTsKIAkJCX0KIAkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlPSBwa2dGcmFnbWVudC5nZXRDbGFzc0ZpbGUoc2ltcGxlTmFtZXNbbGVuZ3RoXSk7CkBAIC0xMTksMTUgKzExMiwxNiBAQAogCQkJLy8gcGF0aCB0byBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKIAkJCS8vIE9wdGltaXphdGlvbjogY2FjaGUgcGFja2FnZSBmcmFnbWVudCByb290IGhhbmRsZSBhbmQgcGFja2FnZSBoYW5kbGVzCiAJCQlpbnQgcm9vdFBhdGhMZW5ndGggPSAtMTsKLQkJCWlmICh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoID09IG51bGwgCi0JCQkJfHwgIShyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoKSAKKwkJCWlmICh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoID09IG51bGwKKwkJCQl8fCAhKHJlc291cmNlUGF0aC5zdGFydHNXaXRoKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGgpCisJCQkJCSYmICFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzRXhjbHVkZWQocmVzb3VyY2VQYXRoLnRvQ2hhckFycmF5KCksIHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdC5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksIHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdC5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCksIGZhbHNlKQogCQkJCQkmJiAocm9vdFBhdGhMZW5ndGggPSB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoLmxlbmd0aCgpKSA+IDAKIAkJCQkJJiYgcmVzb3VyY2VQYXRoLmNoYXJBdChyb290UGF0aExlbmd0aCkgPT0gJy8nKSkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IHRoaXMuZ2V0UGtnRnJhZ21lbnRSb290KHJlc291cmNlUGF0aCk7CisJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQa2dGcmFnbWVudFJvb3QocmVzb3VyY2VQYXRoKTsKIAkJCQlpZiAocm9vdCA9PSBudWxsKQogCQkJCQlyZXR1cm4gbnVsbDsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgKIAkJCQl0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3QgPSByb290OwotCQkJCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPSB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3QuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQkJdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aCA9IHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdC5pbnRlcm5hbFBhdGgoKS50b1N0cmluZygpOwogCQkJCXRoaXMucGFja2FnZUhhbmRsZXMgPSBuZXcgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0KDUpOwogCQkJfQogCQkJLy8gY3JlYXRlIGhhbmRsZQpAQCAtMTQzLDIwICsxMzcsMjEgQEAKIAkJCX0KIAkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnRnJhZ21lbnQ9IChJUGFja2FnZUZyYWdtZW50KSB0aGlzLnBhY2thZ2VIYW5kbGVzLmdldChwa2dOYW1lKTsKIAkJCWlmIChwa2dGcmFnbWVudCA9PSBudWxsKSB7Ci0JCQkJcGtnRnJhZ21lbnQ9ICgoUGFja2FnZUZyYWdtZW50Um9vdCkgdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290KS5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7CisJCQkJcGtnRnJhZ21lbnQ9IHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSk7CiAJCQkJdGhpcy5wYWNrYWdlSGFuZGxlcy5wdXQocGtnTmFtZSwgcGtnRnJhZ21lbnQpOwogCQkJfQogCQkJU3RyaW5nIHNpbXBsZU5hbWU9IHNpbXBsZU5hbWVzW2xlbmd0aF07CiAJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLmlzSmF2YUxpa2VGaWxlTmFtZShzaW1wbGVOYW1lKSkgewogCQkJCUlDb21waWxhdGlvblVuaXQgdW5pdD0gcGtnRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KHNpbXBsZU5hbWUpOwogCQkJCXJldHVybiAoT3BlbmFibGUpIHVuaXQ7Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlIGlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShzaW1wbGVOYW1lKSl7CiAJCQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGU9IHBrZ0ZyYWdtZW50LmdldENsYXNzRmlsZShzaW1wbGVOYW1lKTsKIAkJCQlyZXR1cm4gKE9wZW5hYmxlKSBjbGFzc0ZpbGU7CiAJCQl9CisJCQlyZXR1cm4gbnVsbDsKIAkJfQotCX0JCi0JCisJfQorCiAJLyoqCiAJICogUmV0dXJucyBhIGhhbmRsZSBkZW5vdGluZyB0aGUgY2xhc3MgbWVtYmVyIGlkZW50aWZpZWQgYnkgaXRzIHNjb3BlLgogCSAqLwpAQCAtMTY5LDE3ICsxNjQsMTcgQEAKIAlwcml2YXRlIElKYXZhRWxlbWVudCBjcmVhdGVFbGVtZW50KFNjb3BlIHNjb3BlLCBpbnQgZWxlbWVudFBvc2l0aW9uLCBJQ29tcGlsYXRpb25Vbml0IHVuaXQsIEhhc2hTZXQgZXhpc3RpbmdFbGVtZW50cywgSGFzaE1hcCBrbm93blNjb3BlcykgewogCQlJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCA9IChJSmF2YUVsZW1lbnQpa25vd25TY29wZXMuZ2V0KHNjb3BlKTsKIAkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JCisKIAkJc3dpdGNoKHNjb3BlLmtpbmQpIHsKIAkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CiAJCQkJbmV3RWxlbWVudCA9IHVuaXQ7Ci0JCQkJYnJlYWs7CQkJCisJCQkJYnJlYWs7CiAJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKIAkJCQlJSmF2YUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoc2NvcGUucGFyZW50LCBlbGVtZW50UG9zaXRpb24sIHVuaXQsIGV4aXN0aW5nRWxlbWVudHMsIGtub3duU2NvcGVzKTsKIAkJCQlzd2l0Y2ggKHBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewogCQkJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKIAkJCQkJCW5ld0VsZW1lbnQgPSAoKElDb21waWxhdGlvblVuaXQpcGFyZW50RWxlbWVudCkuZ2V0VHlwZShuZXcgU3RyaW5nKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5zb3VyY2VOYW1lKSk7Ci0JCQkJCQlicmVhazsJCQkJCQkKKwkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKIAkJCQkJCW5ld0VsZW1lbnQgPSAoKElUeXBlKXBhcmVudEVsZW1lbnQpLmdldFR5cGUobmV3IFN0cmluZyhzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuc291cmNlTmFtZSkpOwogCQkJCQkJYnJlYWs7CkBAIC0xOTYsNyArMTkxLDcgQEAKIAkJCQkJCQkJd2hpbGUgKCFleGlzdGluZ0VsZW1lbnRzLmFkZChuZXdFbGVtZW50KSkgKChTb3VyY2VSZWZFbGVtZW50KW5ld0VsZW1lbnQpLm9jY3VycmVuY2VDb3VudCsrOwogCQkJCQkJCX0KIAkJCQkJICAgIH0KLQkJCQkJCWJyZWFrOwkJCQkJCQorCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKIAkJCQkJa25vd25TY29wZXMucHV0KHNjb3BlLCBuZXdFbGVtZW50KTsKQEAgLTIwOSw5ICsyMDQsMTAgQEAKIAkJCQkJLy8gaW5zaWRlIGZpZWxkIG9yIGluaXRpYWxpemVyLCBtdXN0IGZpbmQgcHJvcGVyIG9uZQogCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IG1ldGhvZFNjb3BlLnJlZmVyZW5jZVR5cGUoKTsKIAkJCQkJaW50IG9jY3VyZW5jZUNvdW50ID0gMTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGUuZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWludCBsZW5ndGggPSB0eXBlLmZpZWxkcyA9PSBudWxsID8gMCA6IHR5cGUuZmllbGRzLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQkJCQkJaWYgKGZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPCBlbGVtZW50UG9zaXRpb24gJiYgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiBlbGVtZW50UG9zaXRpb24pIHsKKwkJCQkJCWlmIChmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IGVsZW1lbnRQb3NpdGlvbiAmJiBlbGVtZW50UG9zaXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKIAkJCQkJCQlzd2l0Y2ggKGZpZWxkLmdldEtpbmQoKSkgewogCQkJCQkJCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5GSUVMRCA6CiAJCQkJCQkJCWNhc2UgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLkVOVU1fQ09OU1RBTlQgOgpAQCAtMjM0LDcgKzIzMCw3IEBACiAJCQkJCQlrbm93blNjb3Blcy5wdXQoc2NvcGUsIG5ld0VsZW1lbnQpOwogCQkJCQl9CiAJCQkJfQotCQkJCWJyZWFrOwkJCQkKKwkJCQlicmVhazsKIAkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgogCQkJCS8vIHN0YW5kYXJkIGJsb2NrLCBubyBlbGVtZW50IHBlciBzZQogCQkJCW5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHNjb3BlLnBhcmVudCwgZWxlbWVudFBvc2l0aW9uLCB1bml0LCBleGlzdGluZ0VsZW1lbnRzLCBrbm93blNjb3Blcyk7CkBAIC0yNDcsNDkgKzI0Myw1NSBAQAogCSAqIFNlZSBjcmVhdGVPcGVuYWJsZSguLi4pIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBqYXIgcGF0aCBzdHJpbmcuCiAJICogSWYgbm90IG51bGwsIHVzZXMgdGhlIGdpdmVuIHNjb3BlIGFzIGEgaGludCBmb3IgZ2V0dGluZyBKYXZhIHByb2plY3QgaGFuZGxlcy4KIAkgKi8KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEphclBrZ0ZyYWdtZW50Um9vdChTdHJpbmcgamFyUGF0aFN0cmluZywgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgeworCXByaXZhdGUgUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXJQa2dGcmFnbWVudFJvb3QoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZywgaW50IGphclNlcGFyYXRvckluZGV4LCBTdHJpbmcgamFyUGF0aFN0cmluZywgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewogCiAJCUlQYXRoIGphclBhdGg9IG5ldyBQYXRoKGphclBhdGhTdHJpbmcpOwotCQkKLQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgamFyUGF0aCwgZmFsc2UpOworCisJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGphclBhdGgsIGZhbHNlKTsKIAkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7CiAJCQkvLyBpbnRlcm5hbCBqYXI6IGlzIGl0IG9uIHRoZSBjbGFzc3BhdGggb2YgaXRzIHByb2plY3Q/Ci0JCQkvLyAgZS5nLiBvcmcuZWNsaXBzZS5zd3Qud2luMzIvd3Mvd2luMzIvc3d0LmphciAKKwkJCS8vICBlLmcuIG9yZy5lY2xpcHNlLnN3dC53aW4zMi93cy93aW4zMi9zd3QuamFyCiAJCQkvLyAgICAgICAgaXMgTk9UIG9uIHRoZSBjbGFzc3BhdGggb2Ygb3JnLmVjbGlwc2Uuc3d0LndpbjMyCiAJCQlJRmlsZSBqYXJGaWxlID0gKElGaWxlKXRhcmdldDsKIAkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChqYXJGaWxlKTsKIAkJCXRyeSB7CiAJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gamF2YVByb2plY3QuZ2V0Q2xhc3NwYXRoRW50cnlGb3IoamFyUGF0aCk7CiAJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyRmlsZSk7CisJCQkJCXJldHVybiAoUGFja2FnZUZyYWdtZW50Um9vdCkgamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChqYXJGaWxlKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCS8vIGlnbm9yZSBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBwcm9qZWN0CiAJCQl9CiAJCX0KLQkJCisKIAkJLy8gd2FsayBwcm9qZWN0cyBpbiB0aGUgc2NvcGUgYW5kIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGhhcyB0aGUgZ2l2ZW4gamFyIHBhdGggaW4gaXRzIGNsYXNzcGF0aAogCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0czsKIAkJaWYgKHNjb3BlICE9IG51bGwpIHsKLQkJCUlQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzID0gc2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7Ci0JCQlpbnQgbGVuZ3RoID0gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzLmxlbmd0aDsKLQkJCXByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtsZW5ndGhdOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJUGF0aCBwYXRoID0gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2ldOwotCQkJCWlmICghb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShwYXRoLmxhc3RTZWdtZW50KCkpKSB7Ci0JCQkJCXByb2plY3RzW2luZGV4KytdID0gdGhpcy5qYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocGF0aC5zZWdtZW50KDApKTsKKwkJCWlmIChzY29wZSBpbnN0YW5jZW9mIEFic3RyYWN0SmF2YVNlYXJjaFNjb3BlKSB7CisJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpICgoQWJzdHJhY3RKYXZhU2VhcmNoU2NvcGUpIHNjb3BlKS5wYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlUGF0aFN0cmluZywgamFyU2VwYXJhdG9ySW5kZXgsIGphclBhdGhTdHJpbmcpOworCQkJCWlmIChyb290ICE9IG51bGwpCisJCQkJCXJldHVybiByb290OworCQkJfSBlbHNlIHsKKwkJCQlJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycyA9IHNjb3BlLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpOworCQkJCWludCBsZW5ndGggPSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMubGVuZ3RoOworCQkJCXByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtsZW5ndGhdOworCQkJCWludCBpbmRleCA9IDA7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJUGF0aCBwYXRoID0gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2ldOworCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CisJCQkJCQlwcm9qZWN0c1tpbmRleCsrXSA9IHRoaXMuamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KHBhdGguc2VnbWVudCgwKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGluZGV4IDwgbGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdHMsIDAsIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtpbmRleF0sIDAsIGluZGV4KTsKKwkJCQl9CisJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0SmFyUGtnRnJhZ21lbnRSb290KGphclBhdGgsIHRhcmdldCwgcHJvamVjdHMpOworCQkJCWlmIChyb290ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJvb3Q7CiAJCQkJfQogCQkJfQotCQkJaWYgKGluZGV4IDwgbGVuZ3RoKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0cywgMCwgcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W2luZGV4XSwgMCwgaW5kZXgpOwotCQkJfQotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldEphclBrZ0ZyYWdtZW50Um9vdChqYXJQYXRoLCB0YXJnZXQsIHByb2plY3RzKTsKLQkJCWlmIChyb290ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcm9vdDsKLQkJCX0KLQkJfSAKLQkJCisJCX0KKwogCQkvLyBub3QgZm91bmQgaW4gdGhlIHNjb3BlLCB3YWxrIGFsbCBwcm9qZWN0cwogCQl0cnkgewogCQkJcHJvamVjdHMgPSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKQEAgLTI5OSw4ICszMDEsOCBAQAogCQl9CiAJCXJldHVybiBnZXRKYXJQa2dGcmFnbWVudFJvb3QoamFyUGF0aCwgdGFyZ2V0LCBwcm9qZWN0cyk7CiAJfQotCQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmFyUGtnRnJhZ21lbnRSb290KAorCisJcHJpdmF0ZSBQYWNrYWdlRnJhZ21lbnRSb290IGdldEphclBrZ0ZyYWdtZW50Um9vdCgKIAkJSVBhdGggamFyUGF0aCwKIAkJT2JqZWN0IHRhcmdldCwKIAkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMpIHsKQEAgLTMxMSwzNiArMzEzLDM2IEBACiAJCQkJaWYgKGNsYXNzcGF0aEVudHkgIT0gbnVsbCkgewogCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKIAkJCQkJCS8vIGludGVybmFsIGphcgotCQkJCQkJcmV0dXJuIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElGaWxlKXRhcmdldCk7CisJCQkJCQlyZXR1cm4gKFBhY2thZ2VGcmFnbWVudFJvb3QpIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElGaWxlKXRhcmdldCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQkvLyBleHRlcm5hbCBqYXIKLQkJCQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290MChqYXJQYXRoKTsKKwkJCQkJCXJldHVybiAoUGFja2FnZUZyYWdtZW50Um9vdCkgamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAoamFyUGF0aCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIEphdmFNb2RlbEV4Y2VwdGlvbiBmcm9tIGdldFJlc29sdmVkQ2xhc3NwYXRoIC0gYSBwcm9ibGVtIG9jY3VyZWQgd2hpbGUgYWNjZXNzaW5nIHByb2plY3Q6IG5vdGhpbmcgd2UgY2FuIGRvLCBpZ25vcmUKKwkJCQkvLyBKYXZhTW9kZWxFeGNlcHRpb24gZnJvbSBnZXRSZXNvbHZlZENsYXNzcGF0aCAtIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBhY2Nlc3NpbmcgcHJvamVjdDogbm90aGluZyB3ZSBjYW4gZG8sIGlnbm9yZQogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoLgogCSAqLwotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGtnRnJhZ21lbnRSb290KFN0cmluZyBwYXRoU3RyaW5nKSB7CisJcHJpdmF0ZSBQYWNrYWdlRnJhZ21lbnRSb290IGdldFBrZ0ZyYWdtZW50Um9vdChTdHJpbmcgcGF0aFN0cmluZykgewogCiAJCUlQYXRoIHBhdGg9IG5ldyBQYXRoKHBhdGhTdHJpbmcpOwogCQlJUHJvamVjdFtdIHByb2plY3RzPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CiAJCWZvciAoaW50IGk9IDAsIG1heD0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCXRyeSB7CiAJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSAKKwkJCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkKIAkJCQkJfHwgIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIGNvbnRpbnVlOwogCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdD0gdGhpcy5qYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7CiAJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cz0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKIAkJCQlmb3IgKGludCBqPSAwLCByb290Q291bnQ9IHJvb3RzLmxlbmd0aDsgaiA8IHJvb3RDb3VudDsgaisrKSB7CiAJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gKFBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdHNbal07Ci0JCQkJCWlmIChyb290LmdldFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpICYmICFVdGlsLmlzRXhjbHVkZWQocGF0aCwgcm9vdC5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksIHJvb3QuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpLCBmYWxzZSkpIHsKKwkJCQkJaWYgKHJvb3QuaW50ZXJuYWxQYXRoKCkuaXNQcmVmaXhPZihwYXRoKSAmJiAhVXRpbC5pc0V4Y2x1ZGVkKHBhdGgsIHJvb3QuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLCByb290LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSwgZmFsc2UpKSB7CiAJCQkJCQlyZXR1cm4gcm9vdDsKIAkJCQkJfQogCQkJCX0KQEAgLTM1MSw1ICszNTMsNSBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9IYXNoU2V0T2ZBcnJheS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9IYXNoU2V0T2ZBcnJheS5qYXZhCmluZGV4IDk4NGI3NGIuLjljMjQ5MDUgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSGFzaFNldE9mQXJyYXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0hhc2hTZXRPZkFycmF5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNyArMTQsNyBAQAogICogSGFzaFNldCBvZiBPYmplY3RbXQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSGFzaFNldE9mQXJyYXkgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCQorCiAJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwogCXB1YmxpYyBPYmplY3RbXVtdIHNldDsKIApAQCAtNjUsMTQgKzY1LDE0IEBACiAJcHJpdmF0ZSBpbnQgaGFzaENvZGUoT2JqZWN0W10gZWxlbWVudCkgewogCQlyZXR1cm4gaGFzaENvZGUoZWxlbWVudCwgZWxlbWVudC5sZW5ndGgpOwogCX0KLQkKKwogCXByaXZhdGUgaW50IGhhc2hDb2RlKE9iamVjdFtdIGVsZW1lbnQsIGludCBsZW5ndGgpIHsKIAkJaW50IGhhc2ggPSAwOwogCQlmb3IgKGludCBpID0gbGVuZ3RoLTE7IGkgPj0gMDsgaS0tKQogCQkJaGFzaCA9IFV0aWwuY29tYmluZUhhc2hDb2RlcyhoYXNoLCBlbGVtZW50W2ldLmhhc2hDb2RlKCkpOwogCQlyZXR1cm4gaGFzaCAmIDB4N0ZGRkZGRkY7CiAJfQotCQorCiAJcHVibGljIE9iamVjdCBhZGQoT2JqZWN0W10gYXJyYXkpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMuc2V0Lmxlbmd0aDsKIAkJaW50IGluZGV4ID0gaGFzaENvZGUoYXJyYXkpICUgbGVuZ3RoOwpAQCAtODgsNyArODgsNyBAQAogCQl0aGlzLnNldFtpbmRleF0gPSBhcnJheTsKIAogCQkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCi0JCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkKIAkJCXJlaGFzaCgpOwogCQlyZXR1cm4gYXJyYXk7CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBACiAKIAlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewogCi0JCUhhc2hTZXRPZkFycmF5IG5ld0hhc2hTZXQgPSBuZXcgSGFzaFNldE9mQXJyYXkoZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJCUhhc2hTZXRPZkFycmF5IG5ld0hhc2hTZXQgPSBuZXcgSGFzaFNldE9mQXJyYXkodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAkJT2JqZWN0W10gY3VycmVudEFycmF5OwogCQlmb3IgKGludCBpID0gdGhpcy5zZXQubGVuZ3RoOyAtLWkgPj0gMDspCiAJCQlpZiAoKGN1cnJlbnRBcnJheSA9IHRoaXMuc2V0W2ldKSAhPSBudWxsKQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJfQogCiAJcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZWxlbWVudFNpemU7CisJCXJldHVybiB0aGlzLmVsZW1lbnRTaXplOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xMzcsNyArMTM3LDcgQEAKIAkJCQlidWZmZXIuYXBwZW5kKCd7Jyk7CiAJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBlbGVtZW50Lmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgewogCQkJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRbal0pOwotCQkJCQlpZiAoaiAhPSBsZW5ndGgyLTEpIAorCQkJCQlpZiAoaiAhPSBsZW5ndGgyLTEpCiAJCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCWJ1ZmZlci5hcHBlbmQoIn0iKTsgIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSGFzaFNldE9mQ2hhckFycmF5QXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSGFzaFNldE9mQ2hhckFycmF5QXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU1YzhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9IYXNoU2V0T2ZDaGFyQXJyYXlBcnJheS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogSGFzaFNldCBvZiBjaGFyW11bXQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSGFzaFNldE9mQ2hhckFycmF5QXJyYXkgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscworCXB1YmxpYyBjaGFyW11bXVtdIHNldDsKKworCXB1YmxpYyBpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKKwlpbnQgdGhyZXNob2xkOworCisJcHVibGljIEhhc2hTZXRPZkNoYXJBcnJheUFycmF5KCkgeworCQl0aGlzKDEzKTsKKwl9CisKKwlwdWJsaWMgSGFzaFNldE9mQ2hhckFycmF5QXJyYXkoaW50IHNpemUpIHsKKworCQl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwkJdGhpcy50aHJlc2hvbGQgPSBzaXplOyAvLyBzaXplIHJlcHJlc2VudHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbGVtZW50cworCQlpbnQgZXh0cmFSb29tID0gKGludCkgKHNpemUgKiAxLjc1Zik7CisJCWlmICh0aGlzLnRocmVzaG9sZCA9PSBleHRyYVJvb20pCisJCQlleHRyYVJvb20rKzsKKwkJdGhpcy5zZXQgPSBuZXcgY2hhcltleHRyYVJvb21dW11bXTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwkJSGFzaFNldE9mQ2hhckFycmF5QXJyYXkgcmVzdWx0ID0gKEhhc2hTZXRPZkNoYXJBcnJheUFycmF5KSBzdXBlci5jbG9uZSgpOworCQlyZXN1bHQuZWxlbWVudFNpemUgPSB0aGlzLmVsZW1lbnRTaXplOworCQlyZXN1bHQudGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQ7CisKKwkJaW50IGxlbmd0aCA9IHRoaXMuc2V0Lmxlbmd0aDsKKwkJcmVzdWx0LnNldCA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2V0LCAwLCByZXN1bHQuc2V0LCAwLCBsZW5ndGgpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdW10gYXJyYXkpIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMuc2V0Lmxlbmd0aDsKKwkJaW50IGluZGV4ID0gaGFzaENvZGUoYXJyYXkpICUgbGVuZ3RoOworCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7CisJCWNoYXJbXVtdIGN1cnJlbnRBcnJheTsKKwkJd2hpbGUgKChjdXJyZW50QXJyYXkgPSB0aGlzLnNldFtpbmRleF0pICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50QXJyYXkubGVuZ3RoID09IGFycmF5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRBcnJheSwgYXJyYXkpKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGludCBoYXNoQ29kZShjaGFyW11bXSBlbGVtZW50KSB7CisJCXJldHVybiBoYXNoQ29kZShlbGVtZW50LCBlbGVtZW50Lmxlbmd0aCk7CisJfQorCisJcHJpdmF0ZSBpbnQgaGFzaENvZGUoY2hhcltdW10gZWxlbWVudCwgaW50IGxlbmd0aCkgeworCQlpbnQgaGFzaCA9IDA7CisJCWZvciAoaW50IGkgPSBsZW5ndGgtMTsgaSA+PSAwOyBpLS0pCisJCQloYXNoID0gVXRpbC5jb21iaW5lSGFzaENvZGVzKGhhc2gsIENoYXJPcGVyYXRpb24uaGFzaENvZGUoZWxlbWVudFtpXSkpOworCQlyZXR1cm4gaGFzaCAmIDB4N0ZGRkZGRkY7CisJfQorCisJcHVibGljIGNoYXJbXVtdIGFkZChjaGFyW11bXSBhcnJheSkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5zZXQubGVuZ3RoOworCQlpbnQgaW5kZXggPSBoYXNoQ29kZShhcnJheSkgJSBsZW5ndGg7CisJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKwkJY2hhcltdW10gY3VycmVudEFycmF5OworCQl3aGlsZSAoKGN1cnJlbnRBcnJheSA9IHRoaXMuc2V0W2luZGV4XSkgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRBcnJheS5sZW5ndGggPT0gYXJyYXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudEFycmF5LCBhcnJheSkpCisJCQkJcmV0dXJuIHRoaXMuc2V0W2luZGV4XSA9IGFycmF5OworCQkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSB7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQl9CisJCXRoaXMuc2V0W2luZGV4XSA9IGFycmF5OworCisJCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwkJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKQorCQkJcmVoYXNoKCk7CisJCXJldHVybiBhcnJheTsKKwl9CisKKwlwdWJsaWMgY2hhcltdW10gcmVtb3ZlKGNoYXJbXVtdIGFycmF5KSB7CisJCWludCBsZW5ndGggPSB0aGlzLnNldC5sZW5ndGg7CisJCWludCBpbmRleCA9IGhhc2hDb2RlKGFycmF5KSAlIGxlbmd0aDsKKwkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCQljaGFyW11bXSBjdXJyZW50QXJyYXk7CisJCXdoaWxlICgoY3VycmVudEFycmF5ID0gdGhpcy5zZXRbaW5kZXhdKSAhPSBudWxsKSB7CisJCQlpZiAoY3VycmVudEFycmF5Lmxlbmd0aCA9PSBhcnJheUxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50QXJyYXksIGFycmF5KSkgeworCQkJCWNoYXJbXVtdIGV4aXN0aW5nID0gdGhpcy5zZXRbaW5kZXhdOworCQkJCXRoaXMuZWxlbWVudFNpemUtLTsKKwkJCQl0aGlzLnNldFtpbmRleF0gPSBudWxsOworCQkJCXJlaGFzaCgpOworCQkJCXJldHVybiBleGlzdGluZzsKKwkJCX0KKwkJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgeworCQkJCWluZGV4ID0gMDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVoYXNoKCkgeworCQlIYXNoU2V0T2ZDaGFyQXJyYXlBcnJheSBuZXdIYXNoU2V0ID0gbmV3IEhhc2hTZXRPZkNoYXJBcnJheUFycmF5KHRoaXMuZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJCWNoYXJbXVtdIGN1cnJlbnRBcnJheTsKKwkJZm9yIChpbnQgaSA9IHRoaXMuc2V0Lmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKChjdXJyZW50QXJyYXkgPSB0aGlzLnNldFtpXSkgIT0gbnVsbCkKKwkJCQluZXdIYXNoU2V0LmFkZChjdXJyZW50QXJyYXkpOworCisJCXRoaXMuc2V0ID0gbmV3SGFzaFNldC5zZXQ7CisJCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaFNldC50aHJlc2hvbGQ7CisJfQorCisJcHVibGljIGludCBzaXplKCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zZXQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWNoYXJbXVtdIGFycmF5QXJyYXkgPSB0aGlzLnNldFtpXTsKKwkJCWlmIChhcnJheUFycmF5ICE9IG51bGwpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGFycmF5QXJyYXkubGVuZ3RoOyBqIDwgbGVuZ3RoMjsgaisrKSB7CisJCQkJCWNoYXJbXSBhcnJheSA9IGFycmF5QXJyYXlbal07CisJCQkJCWJ1ZmZlci5hcHBlbmQoJ3snKTsKKwkJCQkJZm9yIChpbnQgayA9IDAsIGxlbmd0aDMgPSBhcnJheS5sZW5ndGg7IGsgPCBsZW5ndGgzOyBrKyspIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1wnJyk7CisJCQkJCQlidWZmZXIuYXBwZW5kKGFycmF5W2tdKTsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1wnJyk7CisJCQkJCQlpZiAoayAhPSBsZW5ndGgzLTEpCisJCQkJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWJ1ZmZlci5hcHBlbmQoJ30nKTsKKwkJCQkJaWYgKGogIT0gbGVuZ3RoMi0xKQorCQkJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlidWZmZXIuYXBwZW5kKCJ9Iik7ICAvLyROT04tTkxTLTEkCisJCQkJaWYgKGkgIT0gbGVuZ3RoLTEpCisJCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0hhc2h0YWJsZU9mQXJyYXlUb09iamVjdC5qYXZhCmluZGV4IGYyMGE5MWMuLjFmODIyZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9IYXNodGFibGVPZkFycmF5VG9PYmplY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw3ICsxNCw3IEBACiAgKiBIYXNodGFibGUgb2Yge09iamVjdFtdIC0tPiBPYmplY3QgfQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkKKwogCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKIAlwdWJsaWMgT2JqZWN0W11bXSBrZXlUYWJsZTsKIAlwdWJsaWMgT2JqZWN0W10gdmFsdWVUYWJsZTsKQEAgLTgyLDYgKzgyLDIxIEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCXB1YmxpYyBpbnQgZ2V0SW5kZXgoT2JqZWN0W10ga2V5KSB7CisJCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKKwkJaW50IGluZGV4ID0gaGFzaENvZGUoa2V5KSAlIGxlbmd0aDsKKwkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJCU9iamVjdFtdIGN1cnJlbnRLZXk7CisJCXdoaWxlICgoY3VycmVudEtleSA9IHRoaXMua2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIFV0aWwuZXF1YWxBcnJheXNPck51bGwoY3VycmVudEtleSwga2V5KSkKKwkJCQlyZXR1cm4gaW5kZXg7CisJCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIHsKKwkJCQlpbmRleCA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkKIAlwdWJsaWMgT2JqZWN0W10gZ2V0S2V5KE9iamVjdFtdIGtleSwgaW50IGtleUxlbmd0aCkgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CiAJCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSwga2V5TGVuZ3RoKSAlIGxlbmd0aDsKQEAgLTk5LDE0ICsxMTQsMTQgQEAKIAlwcml2YXRlIGludCBoYXNoQ29kZShPYmplY3RbXSBlbGVtZW50KSB7CiAJCXJldHVybiBoYXNoQ29kZShlbGVtZW50LCBlbGVtZW50Lmxlbmd0aCk7CiAJfQotCQorCiAJcHJpdmF0ZSBpbnQgaGFzaENvZGUoT2JqZWN0W10gZWxlbWVudCwgaW50IGxlbmd0aCkgewogCQlpbnQgaGFzaCA9IDA7CiAJCWZvciAoaW50IGkgPSBsZW5ndGgtMTsgaSA+PSAwOyBpLS0pCiAJCQloYXNoID0gVXRpbC5jb21iaW5lSGFzaENvZGVzKGhhc2gsIGVsZW1lbnRbaV0uaGFzaENvZGUoKSk7CiAJCXJldHVybiBoYXNoICYgMHg3RkZGRkZGRjsKIAl9Ci0JCisKIAlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3RbXSBrZXksIE9iamVjdCB2YWx1ZSkgewogCQlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CiAJCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSkgJSBsZW5ndGg7CkBAIC0xMjMsNyArMTM4LDcgQEAKIAkJdGhpcy52YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwogCiAJCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQkJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKQogCQkJcmVoYXNoKCk7CiAJCXJldHVybiB2YWx1ZTsKIAl9CkBAIC0xNTEsNyArMTY2LDcgQEAKIAogCXByaXZhdGUgdm9pZCByZWhhc2goKSB7CiAKLQkJSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZkFycmF5VG9PYmplY3QoZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJCUhhc2h0YWJsZU9mQXJyYXlUb09iamVjdCBuZXdIYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0KHRoaXMuZWxlbWVudFNpemUgKiAyKTsJCS8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJCU9iamVjdFtdIGN1cnJlbnRLZXk7CiAJCWZvciAoaW50IGkgPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQogCQkJaWYgKChjdXJyZW50S2V5ID0gdGhpcy5rZXlUYWJsZVtpXSkgIT0gbnVsbCkKQEAgLTE2Myw3ICsxNzgsNyBAQAogCX0KIAogCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRTaXplOworCQlyZXR1cm4gdGhpcy5lbGVtZW50U2l6ZTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMTc0LDcgKzE4OSw3IEBACiAJCQkJYnVmZmVyLmFwcGVuZCgneycpOwogCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gZWxlbWVudC5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKIAkJCQkJYnVmZmVyLmFwcGVuZChlbGVtZW50W2pdKTsKLQkJCQkJaWYgKGogIT0gbGVuZ3RoMi0xKSAKKwkJCQkJaWYgKGogIT0gbGVuZ3RoMi0xKQogCQkJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KIAkJCQlidWZmZXIuYXBwZW5kKCJ9IC0+ICIpOyAgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhCmluZGV4IDkyNWI4ODcuLjAyY2NiNzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUNhY2hlRW51bWVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lDYWNoZUVudW1lcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTMgKzEzLDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiAvKioKLSAqIFRoZSA8Y29kZT5JQ2FjaGVFbnVtZXJhdGlvbjwvY29kZT4gaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgYm90aCB0aGUga2V5cyAKLSAqIGFuZCB2YWx1ZXMgaW4gYW4gTFJVQ2FjaGUuICBUaGUgPGNvZGU+Z2V0VmFsdWUoKTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIAotICogdmFsdWUgb2YgdGhlIGxhc3Qga2V5IHRvIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5uZXh0RWxlbWVudCgpPC9jb2RlPi4gIAotICogVGhlIDxjb2RlPm5leHRFbGVtZW50KCk8L2NvZGU+IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIAorICogVGhlIDxjb2RlPklDYWNoZUVudW1lcmF0aW9uPC9jb2RlPiBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBib3RoIHRoZSBrZXlzCisgKiBhbmQgdmFsdWVzIGluIGFuIExSVUNhY2hlLiAgVGhlIDxjb2RlPmdldFZhbHVlKCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZQorICogdmFsdWUgb2YgdGhlIGxhc3Qga2V5IHRvIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5uZXh0RWxlbWVudCgpPC9jb2RlPi4KKyAqIFRoZSA8Y29kZT5uZXh0RWxlbWVudCgpPC9jb2RlPiBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZQogICogPGNvZGU+Z2V0VmFsdWUoKTwvY29kZT4gbWV0aG9kLgogICoKLSAqIDxwPlRoZSBpdGVyYXRpb24gY2FuIGJlIG1hZGUgZWZmaWNpZW50IGJ5IG1ha2luZyB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB2YWx1ZXMgaW4gCisgKiA8cD5UaGUgaXRlcmF0aW9uIGNhbiBiZSBtYWRlIGVmZmljaWVudCBieSBtYWtpbmcgdXNlIG9mIHRoZSBmYWN0IHRoYXQgdmFsdWVzIGluCiAgKiB0aGUgY2FjaGUgKGluc3RhbmNlcyBvZiA8Y29kZT5MUlVDYWNoZUVudHJ5PC9jb2RlPiksIGtub3cgdGhlaXIga2V5LiAgRm9yIHRoaXMgcmVhc29uLAogICogSGFzaHRhYmxlIGxvb2t1cHMgZG9uJ3QgaGF2ZSB0byBiZSBtYWRlIGF0IGVhY2ggc3RlcCBvZiB0aGUgaXRlcmF0aW9uLgogICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5qYXZhCmluZGV4IDljZWM1NWEuLmQwNjk5ZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCw3ICsxOCw3IEBACiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZS4KICAqLwotcHVibGljIGNsYXNzIElubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBleHRlbmRzIENsYXNzRmlsZUF0dHJpYnV0ZSBpbXBsZW1lbnRzIElJbm5lckNsYXNzZXNBdHRyaWJ1dGUgewkJCitwdWJsaWMgY2xhc3MgSW5uZXJDbGFzc2VzQXR0cmlidXRlIGV4dGVuZHMgQ2xhc3NGaWxlQXR0cmlidXRlIGltcGxlbWVudHMgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5W10gTk9fRU5UUklFUyA9IG5ldyBJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnlbMF07CiAKIAlwcml2YXRlIGludCBudW1iZXJPZkNsYXNzZXM7CkBAIC00NCw3ICs0NCw3IEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJdGhpcy5lbnRyaWVzW2ldID0gbmV3IElubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5KGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOwogCQkJCXJlYWRPZmZzZXQgKz0gODsKLQkJCX0JCQorCQkJfQogCQl9IGVsc2UgewogCQkJdGhpcy5lbnRyaWVzID0gTk9fRU5UUklFUzsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhCmluZGV4IDlhYzIyN2MuLmEwNTc1M2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDUsMTQgKzQ1LDE0IEBACiAJCQl9CiAJCQl0aGlzLmlubmVyQ2xhc3NOYW1lID0gY29uc3RhbnRQb29sRW50cnkuZ2V0Q2xhc3NJbmZvTmFtZSgpOwogCQl9Ci0JCWlmIChvdXRlckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJaWYgKHRoaXMub3V0ZXJDbGFzc05hbWVJbmRleCAhPSAwKSB7CiAJCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLm91dGVyQ2xhc3NOYW1lSW5kZXgpOwogCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfQ2xhc3MpIHsKIAkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKIAkJCX0KIAkJCXRoaXMub3V0ZXJDbGFzc05hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZm9OYW1lKCk7CiAJCX0KLQkJaWYgKGlubmVyTmFtZUluZGV4ICE9IDApIHsKKwkJaWYgKHRoaXMuaW5uZXJOYW1lSW5kZXggIT0gMCkgewogCQkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5pbm5lck5hbWVJbmRleCk7CiAJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CiAJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0phdmFFbGVtZW50RmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0phdmFFbGVtZW50RmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxZjY1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSmF2YUVsZW1lbnRGaW5kZXIuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlN1ZmZpeENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOworCitwdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnRGaW5kZXIgZXh0ZW5kcyBCaW5kaW5nS2V5UGFyc2VyIHsKKworCXByaXZhdGUgSmF2YVByb2plY3QgcHJvamVjdDsKKwlwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgb3duZXI7CisJcHVibGljIElKYXZhRWxlbWVudCBlbGVtZW50OworCXB1YmxpYyBKYXZhTW9kZWxFeGNlcHRpb24gZXhjZXB0aW9uOworCXByaXZhdGUgQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCisJcHVibGljIEphdmFFbGVtZW50RmluZGVyKFN0cmluZyBrZXksIEphdmFQcm9qZWN0IHByb2plY3QsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHsKKwkJc3VwZXIoa2V5KTsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCX0KKworCXByaXZhdGUgSmF2YUVsZW1lbnRGaW5kZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIsIEphdmFQcm9qZWN0IHByb2plY3QsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHsKKwkJc3VwZXIocGFyc2VyKTsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnN1bWVBbm5vdGF0aW9uKCkgeworCQlpZiAoISh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBJQW5ub3RhdGFibGUpKSByZXR1cm47CisJCWludCBzaXplID0gdGhpcy50eXBlcy5zaXplKCk7CisJCWlmIChzaXplID09IDApIHJldHVybjsKKwkJSUphdmFFbGVtZW50IGFubm90YXRpb25UeXBlID0gKChKYXZhRWxlbWVudEZpbmRlcikgdGhpcy50eXBlcy5nZXQoc2l6ZS0xKSkuZWxlbWVudDsKKwkJdGhpcy5lbGVtZW50ID0gKChJQW5ub3RhdGFibGUpIHRoaXMuZWxlbWVudCkuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb25zdW1lRmllbGQoY2hhcltdIGZpZWxkTmFtZSkgeworCQlpZiAoISh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkpIHJldHVybjsKKwkJdGhpcy5lbGVtZW50ID0gKChJVHlwZSkgdGhpcy5lbGVtZW50KS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkTmFtZSkpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnN1bWVGdWxseVF1YWxpZmllZE5hbWUoY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSkgeworCQl0cnkgeworCQkJdGhpcy5lbGVtZW50ID0gdGhpcy5wcm9qZWN0LmZpbmRUeXBlKG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGZ1bGx5UXVhbGlmaWVkTmFtZSwgJy8nLCAnLicpKSwgdGhpcy5vd25lcik7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl0aGlzLmV4Y2VwdGlvbiA9IGU7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxUeXBlKGNoYXJbXSB1bmlxdWVLZXkpIHsKKwkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCWlmICh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7CisJCQlpbnQgbGFzdFNsYXNoID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHVuaXF1ZUtleSk7CisJCQlpbnQgZW5kID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7JywgdW5pcXVlS2V5LCBsYXN0U2xhc2grMSk7CisJCQljaGFyW10gbG9jYWxOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh1bmlxdWVLZXksIGxhc3RTbGFzaCsxLCBlbmQpOworCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5lbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKKwkJCXRoaXMuZWxlbWVudCA9IHBrZy5nZXRDbGFzc0ZpbGUobmV3IFN0cmluZyhsb2NhbE5hbWUpICsgU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfY2xhc3MpOworCQl9IGVsc2UgeworCQkJaW50IGZpcnN0RG9sbGFyID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgdW5pcXVlS2V5KTsKKwkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyQnLCB1bmlxdWVLZXksIGZpcnN0RG9sbGFyKzEpOworCQkJaWYgKGVuZCA9PSAtMSkKKwkJCQllbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCB1bmlxdWVLZXksIGZpcnN0RG9sbGFyKzEpOworCQkJY2hhcltdIHNvdXJjZVN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh1bmlxdWVLZXksIGZpcnN0RG9sbGFyKzEsIGVuZCk7CisJCQlpbnQgcG9zaXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcoc291cmNlU3RhcnQpKTsKKwkJCXRyeSB7CisJCQkJdGhpcy5lbGVtZW50ID0gKChJVHlwZVJvb3QpIHRoaXMuZWxlbWVudC5nZXRPcGVuYWJsZSgpKS5nZXRFbGVtZW50QXQocG9zaXRpb24pOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQl0aGlzLmV4Y2VwdGlvbiA9IGU7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjb25zdW1lTWVtYmVyVHlwZShjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKKwkJaWYgKCEodGhpcy5lbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpKSByZXR1cm47CisJCXRoaXMuZWxlbWVudCA9ICgoSVR5cGUpIHRoaXMuZWxlbWVudCkuZ2V0VHlwZShuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lKSk7CisJfQorCisJcHVibGljIHZvaWQgY29uc3VtZU1ldGhvZChjaGFyW10gc2VsZWN0b3IsIGNoYXJbXSBzaWduYXR1cmUpIHsKKwkJaWYgKCEodGhpcy5lbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpKSByZXR1cm47CisJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG5ldyBTdHJpbmcoc2lnbmF0dXJlKSk7CisJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIHRoaXMuZWxlbWVudDsKKwkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKHNlbGVjdG9yKSwgcGFyYW1ldGVyVHlwZXMpOworCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZmluZE1ldGhvZHMobWV0aG9kKTsKKwkJaWYgKG1ldGhvZHMubGVuZ3RoID4gMCkKKwkJCXRoaXMuZWxlbWVudCA9IG1ldGhvZHNbMF07CisJfQorCisJcHVibGljIHZvaWQgY29uc3VtZVBhY2thZ2UoY2hhcltdIHBrZ05hbWUpIHsKKwkJcGtnTmFtZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShwa2dOYW1lLCAnLycsICcuJyk7CisJCXRyeSB7CisJCQl0aGlzLmVsZW1lbnQgPSB0aGlzLnByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudChuZXcgU3RyaW5nKHBrZ05hbWUpKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXRoaXMuZXhjZXB0aW9uID0gZTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNvbnN1bWVQYXJzZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIpIHsKKwkJdGhpcy50eXBlcy5hZGQocGFyc2VyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb25zdW1lU2Vjb25kYXJ5VHlwZShjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKKwkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCUlPcGVuYWJsZSBvcGVuYWJsZSA9IHRoaXMuZWxlbWVudC5nZXRPcGVuYWJsZSgpOworCQlpZiAoIShvcGVuYWJsZSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpKSByZXR1cm47CisJCXRoaXMuZWxlbWVudCA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgb3BlbmFibGUpLmdldFR5cGUobmV3IFN0cmluZyhzaW1wbGVUeXBlTmFtZSkpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnN1bWVUeXBlVmFyaWFibGUoY2hhcltdIHBvc2l0aW9uLCBjaGFyW10gdHlwZVZhcmlhYmxlTmFtZSkgeworCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpIHJldHVybjsKKwkJc3dpdGNoICh0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgorCQkJdGhpcy5lbGVtZW50ID0gKChJVHlwZSkgdGhpcy5lbGVtZW50KS5nZXRUeXBlUGFyYW1ldGVyKG5ldyBTdHJpbmcodHlwZVZhcmlhYmxlTmFtZSkpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKKwkJCXRoaXMuZWxlbWVudCA9ICgoSU1ldGhvZCkgdGhpcy5lbGVtZW50KS5nZXRUeXBlUGFyYW1ldGVyKG5ldyBTdHJpbmcodHlwZVZhcmlhYmxlTmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdWJsaWMgQmluZGluZ0tleVBhcnNlciBuZXdQYXJzZXIoKSB7CisJCXJldHVybiBuZXcgSmF2YUVsZW1lbnRGaW5kZXIodGhpcywgdGhpcy5wcm9qZWN0LCB0aGlzLm93bmVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvS2V5S2luZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9LZXlLaW5kLmphdmEKaW5kZXggZDJhNzg4YS4uMWQ3NTVlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9LZXlLaW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9LZXlLaW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMzEgKzEyLDMxIEBACiAKIHB1YmxpYyBjbGFzcyBLZXlLaW5kIGV4dGVuZHMgQmluZGluZ0tleVBhcnNlciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1RZUEUgPSAweDAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTUVUSE9EID0gMHgwMDAxMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0ZJRUxEID0gMHgwMDAxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1RZUEVfUEFSQU1FVEVSID0gMHgwMDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0xPQ0FMX1ZBUiA9IDB4MDAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9NRU1CRVIgPSAweDAwMTEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTE9DQUwgPSAweDAwMTExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfUEFSQU1FVEVSSVpFRF9UWVBFID0gMHgwMTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1JBV19UWVBFID0gMHgwMTAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1dJTERDQVJEX1RZUEUgPSAweDAxMDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfUEFSQU1FVEVSSVpFRF9NRVRIT0QgPSAweDAxMDExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfQ0FQVFVSRSA9IDB4MDExMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9DT05TVFJVQ1RPUiA9IDB4MTAwMDA7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9UWVBFID0gMHgwMDAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTUVUSE9EID0gMHgwMDAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfRklFTEQgPSAweDAwMDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9UWVBFX1BBUkFNRVRFUiA9IDB4MDAwODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0xPQ0FMX1ZBUiA9IDB4MDAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX01FTUJFUiA9IDB4MDAyMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0xPQ0FMID0gMHgwMDQwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfUEFSQU1FVEVSSVpFRF9UWVBFID0gMHgwMDgwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfUkFXX1RZUEUgPSAweDAxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9XSUxEQ0FSRF9UWVBFID0gMHgwMjAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfUEFSQU1FVEVSSVpFRF9NRVRIT0QgPSAweDA0MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9DQVBUVVJFID0gMHgwODAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfQ09OU1RSVUNUT1IgPSAweDEwMDA7CisKIAlwdWJsaWMgaW50IGZsYWdzID0gMDsKIAlwcml2YXRlIEtleUtpbmQgaW5uZXJLZXlLaW5kOwotCQorCiAJcHVibGljIEtleUtpbmQoQmluZGluZ0tleVBhcnNlciBwYXJzZXIpIHsKIAkJc3VwZXIocGFyc2VyKTsKIAl9Ci0JCisKIAlwdWJsaWMgS2V5S2luZChTdHJpbmcga2V5KSB7CiAJCXN1cGVyKGtleSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZUJhc2VUeXBlKGNoYXJbXSBiYXNlVHlwZVNpZykgewogCQl0aGlzLmZsYWdzIHw9IEZfVFlQRTsKIAl9CkBAIC00NCw3ICs0NCw3IEBACiAJcHVibGljIHZvaWQgY29uc3VtZUNhcHR1cmUoaW50IHBvc2l0aW9uKSB7CiAJCXRoaXMuZmxhZ3MgfD0gRl9DQVBUVVJFOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVGaWVsZChjaGFyW10gZmllbGROYW1lKSB7CiAJCXRoaXMuZmxhZ3MgfD0gRl9GSUVMRDsKIAl9CkBAIC01Myw3ICs1Myw3IEBACiAJCXRoaXMuZmxhZ3MgfD0gRl9MT0NBTDsKIAl9CiAKLQlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxWYXIoY2hhcltdIHZhck5hbWUpIHsKKwlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxWYXIoY2hhcltdIHZhck5hbWUsIGludCBvY2N1cnJlbmNlQ291bnQpIHsKIAkJdGhpcy5mbGFncyB8PSBGX0xPQ0FMX1ZBUjsKIAl9CiAKQEAgLTc0LDcgKzc0LDcgQEAKIAlwdWJsaWMgdm9pZCBjb25zdW1lUGFyYW1ldGVyaXplZFR5cGUoY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBib29sZWFuIGlzUmF3KSB7CiAJCXRoaXMuZmxhZ3MgfD0gaXNSYXcgPyBGX1JBV19UWVBFIDogRl9QQVJBTUVURVJJWkVEX1RZUEU7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVBhcnNlcihCaW5kaW5nS2V5UGFyc2VyIHBhcnNlcikgewogCQl0aGlzLmlubmVyS2V5S2luZCA9IChLZXlLaW5kKSBwYXJzZXI7CiAJfQpAQCAtOTAsNyArOTAsNyBAQAogCXB1YmxpYyB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVyKGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSkgewogCQl0aGlzLmZsYWdzIHw9IEZfVFlQRV9QQVJBTUVURVI7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVR5cGVXaXRoQ2FwdHVyZSgpIHsKIAkJdGhpcy5mbGFncyA9IHRoaXMuaW5uZXJLZXlLaW5kLmZsYWdzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvS2V5VG9TaWduYXR1cmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvS2V5VG9TaWduYXR1cmUuamF2YQppbmRleCA1NGYxM2FmLi42MTNlNTQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0tleVRvU2lnbmF0dXJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9LZXlUb1NpZ25hdHVyZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDQ4ICsxOCw0OSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvbnN0YW50UG9vbDsKIAogLyoKLSAqIENvbnZlcnRzIGEgYmluZGluZyBrZXkgaW50byBhIHNpZ25hdHVyZSAKKyAqIENvbnZlcnRzIGEgYmluZGluZyBrZXkgaW50byBhIHNpZ25hdHVyZQogICovCiBwdWJsaWMgY2xhc3MgS2V5VG9TaWduYXR1cmUgZXh0ZW5kcyBCaW5kaW5nS2V5UGFyc2VyIHsKLQkKKwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRSA9IDA7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUkdVTUVOVFMgPSAxOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0xBUklOR19UWVBFID0gMjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJPV05fRVhDRVBUSU9OUyA9IDM7Ci0JCisKIAlwdWJsaWMgU3RyaW5nQnVmZmVyIHNpZ25hdHVyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAlwcml2YXRlIGludCBraW5kOwogCXByaXZhdGUgQXJyYXlMaXN0IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcml2YXRlIEFycmF5TGlzdCB0eXBlQXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwogCXByaXZhdGUgQXJyYXlMaXN0IHR5cGVQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwogCXByaXZhdGUgQXJyYXlMaXN0IHRocm93bkV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJcHJpdmF0ZSBpbnQgbWFpblR5cGVTdGFydCA9IC0xOwogCXByaXZhdGUgaW50IG1haW5UeXBlRW5kOwogCXByaXZhdGUgaW50IHR5cGVTaWdTdGFydCA9IC0xOwotCQorCiAJcHVibGljIEtleVRvU2lnbmF0dXJlKEJpbmRpbmdLZXlQYXJzZXIgcGFyc2VyKSB7CiAJCXN1cGVyKHBhcnNlcik7CiAJCXRoaXMua2luZCA9ICgoS2V5VG9TaWduYXR1cmUpIHBhcnNlcikua2luZDsKIAl9Ci0JCisKIAlwdWJsaWMgS2V5VG9TaWduYXR1cmUoU3RyaW5nIGtleSwgaW50IGtpbmQpIHsKIAkJc3VwZXIoa2V5KTsKIAkJdGhpcy5raW5kID0ga2luZDsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lQXJyYXlEaW1lbnNpb24oY2hhcltdIGJyYWtldHMpIHsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKGJyYWtldHMpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVCYXNlVHlwZShjaGFyW10gYmFzZVR5cGVTaWcpIHsKIAkJdGhpcy50eXBlU2lnU3RhcnQgPSB0aGlzLnNpZ25hdHVyZS5sZW5ndGgoKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKGJhc2VUeXBlU2lnKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lQ2FwdHVyZShpbnQgcG9zaXRpb24pIHsKLQkJLy8gYmVoYXZlIGFzIGlmIGl0IHdhcyBhIHdpbGRjYXJkCi0JCXRoaXMuc2lnbmF0dXJlID0gKChLZXlUb1NpZ25hdHVyZSkgdGhpcy5hcmd1bWVudHMuZ2V0KDApKS5zaWduYXR1cmU7CisJCXRoaXMuc2lnbmF0dXJlLmFwcGVuZCgnIScpOworCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQoKChLZXlUb1NpZ25hdHVyZSkgdGhpcy5hcmd1bWVudHMuZ2V0KDApKS5zaWduYXR1cmUpOwogCX0KLQkJCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lTG9jYWxUeXBlKGNoYXJbXSB1bmlxdWVLZXkpIHsKIAkJdGhpcy5zaWduYXR1cmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCS8vIHJlbW92ZSB0cmFpbGluZyBzZW1pLWNvbG9uIGFzIGl0IGlzIGFkZGVkIGxhdGVyIGluIGNvbXN1bWVUeXBlKCkKQEAgLTY3LDkgKzY4LDEwIEBACiAJCUNoYXJPcGVyYXRpb24ucmVwbGFjZSh1bmlxdWVLZXksICcvJywgJy4nKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKHVuaXF1ZUtleSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZU1ldGhvZChjaGFyW10gc2VsZWN0b3IsIGNoYXJbXSBtZXRob2RTaWduYXR1cmUpIHsKIAkJdGhpcy5hcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXRoaXMudHlwZUFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1ldGhvZFNpZ25hdHVyZSwgJy8nLCAnLicpOwogCQlzd2l0Y2godGhpcy5raW5kKSB7CiAJCQljYXNlIFNJR05BVFVSRToKQEAgLTg3LDcgKzg5LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVNZW1iZXJUeXBlKGNoYXJbXSBzaW1wbGVUeXBlTmFtZSkgewogCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQoJyQnKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKHNpbXBsZVR5cGVOYW1lKTsKQEAgLTk2LDggKzk4LDkgQEAKIAlwdWJsaWMgdm9pZCBjb25zdW1lUGFja2FnZShjaGFyW10gcGtnTmFtZSkgewogCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQocGtnTmFtZSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kKCkgeworCQl0aGlzLnR5cGVBcmd1bWVudHMgPSB0aGlzLmFyZ3VtZW50czsKIAkJaW50IHR5cGVQYXJhbWV0ZXJzU2l6ZSA9IHRoaXMuYXJndW1lbnRzLnNpemUoKTsKIAkJaWYgKHR5cGVQYXJhbWV0ZXJzU2l6ZSA+IDApIHsKIAkJCWludCBzaWdMZW5ndGggPSB0aGlzLnNpZ25hdHVyZS5sZW5ndGgoKTsKQEAgLTEwNywyMSArMTEwLDIxIEBACiAJCQlpZiAodHlwZVBhcmFtZXRlclNpZ3MubGVuZ3RoICE9IHR5cGVQYXJhbWV0ZXJzU2l6ZSkKIAkJCQlyZXR1cm47CiAJCQl0aGlzLnNpZ25hdHVyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQorCiAJCQkvLyB0eXBlIHBhcmFtZXRlcnMKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnNTaXplOyBpKyspCiAJCQkJdHlwZVBhcmFtZXRlclNpZ3NbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChTaWduYXR1cmUuQ19UWVBFX1ZBUklBQkxFLFNpZ25hdHVyZS5nZXRUeXBlVmFyaWFibGUodHlwZVBhcmFtZXRlclNpZ3NbaV0pLCBTaWduYXR1cmUuQ19TRU1JQ09MT04pOwogCQkJaW50IHBhcmFtU3RhcnQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU2lnbmF0dXJlLkNfUEFSQU1fU1RBUlQsIG1ldGhvZFNpZ25hdHVyZSk7CiAJCQljaGFyW10gdHlwZVBhcmFtZXRlcnNTdHJpbmcgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG1ldGhvZFNpZ25hdHVyZSwgMCwgcGFyYW1TdGFydCk7CiAJCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQodHlwZVBhcmFtZXRlcnNTdHJpbmcpOwotCQkJCisKIAkJCS8vIHN1YnN0aXR1dGUgcGFyYW1ldGVycwogCQkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKFNpZ25hdHVyZS5DX1BBUkFNX1NUQVJUKTsKIAkJCWNoYXJbXVtdIHBhcmFtZXRlcnMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kU2lnbmF0dXJlKTsKIAkJCWZvciAoaW50IGkgPSAwLCBwYXJhbWV0ZXJzTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7IGkgPCBwYXJhbWV0ZXJzTGVuZ3RoOyBpKyspCiAJCQkJc3Vic3RpdHV0ZShwYXJhbWV0ZXJzW2ldLCB0eXBlUGFyYW1ldGVyU2lncywgdHlwZVBhcmFtZXRlcnNTaXplKTsKIAkJCXRoaXMuc2lnbmF0dXJlLmFwcGVuZChTaWduYXR1cmUuQ19QQVJBTV9FTkQpOwotCQkJCisKIAkJCS8vIHN1YnN0aXR1dGUgcmV0dXJuIHR5cGUKIAkJCWNoYXJbXSByZXR1cm5UeXBlID0gU2lnbmF0dXJlLmdldFJldHVyblR5cGUobWV0aG9kU2lnbmF0dXJlKTsKIAkJCXN1YnN0aXR1dGUocmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlclNpZ3MsIHR5cGVQYXJhbWV0ZXJzU2l6ZSk7CkBAIC0xMzIsMTAgKzEzNSwxMCBAQAogCQkJCXRoaXMuc2lnbmF0dXJlLmFwcGVuZChTaWduYXR1cmUuQ19FWENFUFRJT05fU1RBUlQpOwogCQkJCXN1YnN0aXR1dGUoZXhjZXB0aW9uc1tpXSwgdHlwZVBhcmFtZXRlclNpZ3MsIHR5cGVQYXJhbWV0ZXJzU2l6ZSk7CiAJCQl9Ci0JCQorCiAJCX0KIAl9Ci0JCisKIAkvKgogCSAqIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHZhcmlhYmxlcyByZWZlcmVuY2VkIGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgKGEgcGFyYW1ldGVyaXplZCB0eXBlIHNpZ25hdHVyZSkgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogCSAqIHR5cGUgYXJndW1lbnQuCkBAIC0xNzYsMTMgKzE3OSwxMyBAQAogCQkJCQkJYnJlYWsgbG9vcDsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAoaW5kZXggPiAwKSAKKwkJCWlmIChpbmRleCA+IDApCiAJCQkJc3Vic3RpdHV0ZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhcmFtZXRlciwgaW5kZXgsIGxlbmd0aCksIHR5cGVQYXJhbWV0ZXJTaWdzLCB0eXBlUGFyYW1ldGVyc0xlbmd0aCk7CiAJCQllbHNlCiAJCQkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKHBhcmFtZXRlcik7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lUGFyYW1ldGVyaXplZFR5cGUoY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBib29sZWFuIGlzUmF3KSB7CiAJCWlmIChzaW1wbGVUeXBlTmFtZSAhPSBudWxsKSB7CiAJCQkvLyBtZW1iZXIgdHlwZQpAQCAtMTk2LDIxICsxOTksMjEgQEAKIAkJCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQoKChLZXlUb1NpZ25hdHVyZSkgdGhpcy5hcmd1bWVudHMuZ2V0KGkpKS5zaWduYXR1cmUpOwogCQkJfQogCQkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKCc+Jyk7Ci0JCQlpZiAodGhpcy5raW5kICE9IFRZUEVfQVJHVU1FTlRTKQotCQkJCXRoaXMuYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQkJdGhpcy50eXBlQXJndW1lbnRzID0gdGhpcy5hcmd1bWVudHM7CisJCQl0aGlzLmFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVQYXJzZXIoQmluZGluZ0tleVBhcnNlciBwYXJzZXIpIHsKIAkJdGhpcy5hcmd1bWVudHMuYWRkKHBhcnNlcik7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZUZpZWxkKGNoYXJbXSBmaWVsZE5hbWUpIHsKIAkJaWYgKHRoaXMua2luZCA9PSBTSUdOQVRVUkUpIHsKIAkJCXRoaXMuc2lnbmF0dXJlID0gKChLZXlUb1NpZ25hdHVyZSkgdGhpcy5hcmd1bWVudHMuZ2V0KDApKS5zaWduYXR1cmU7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lRXhjZXB0aW9uKCkgewogCQlpbnQgc2l6ZSA9IHRoaXMuYXJndW1lbnRzLnNpemUoKTsKIAkJaWYgKHNpemUgPiAwKSB7CkBAIC0yMTgsMjAgKzIyMSwyOCBAQAogCQkJCXRoaXMudGhyb3duRXhjZXB0aW9ucy5hZGQoKChLZXlUb1NpZ25hdHVyZSkgdGhpcy5hcmd1bWVudHMuZ2V0KGkpKS5zaWduYXR1cmUudG9TdHJpbmcoKSk7CiAJCQl9CiAJCQl0aGlzLmFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCXRoaXMudHlwZUFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJfQogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVGdWxseVF1YWxpZmllZE5hbWUoY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSkgewogCQl0aGlzLnR5cGVTaWdTdGFydCA9IHRoaXMuc2lnbmF0dXJlLmxlbmd0aCgpOwogCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQoJ0wnKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShmdWxseVF1YWxpZmllZE5hbWUsICcvJywgJy4nKSk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVNlY29uZGFyeVR5cGUoY2hhcltdIHNpbXBsZVR5cGVOYW1lKSB7CiAJCXRoaXMuc2lnbmF0dXJlLmFwcGVuZCgnficpOwogCQl0aGlzLm1haW5UeXBlU3RhcnQgPSB0aGlzLnNpZ25hdHVyZS5sYXN0SW5kZXhPZigiLiIpICsgMTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5tYWluVHlwZVN0YXJ0ID09IDApCi0JCQl0aGlzLm1haW5UeXBlU3RhcnQgPSAxOyAvLyBkZWZhdWx0IHBhY2thZ2UKKwkJaWYgKHRoaXMubWFpblR5cGVTdGFydCA9PSAwKSB7CisJCQl0aGlzLm1haW5UeXBlU3RhcnQgPSAxOyAvLyBkZWZhdWx0IHBhY2thZ2UgKDEgZm9yIHRoZSAnTCcpCisJCQlpbnQgaSA9IDA7CisJCQkvLyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhcnJheSBpZiBuZWVkZWQKKwkJCXdoaWxlICh0aGlzLnNpZ25hdHVyZS5jaGFyQXQoaSkgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIHsKKwkJCQl0aGlzLm1haW5UeXBlU3RhcnQgKys7CisJCQkJaSsrOworCQkJfQorCQl9CiAJCXRoaXMubWFpblR5cGVFbmQgPSB0aGlzLnNpZ25hdHVyZS5sZW5ndGgoKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKHNpbXBsZVR5cGVOYW1lKTsKIAl9CkBAIC0yNDgsMzYgKzI1OSwzNyBAQAogCQkJdHlwZVBhcmFtZXRlcnNTaWcuYXBwZW5kKCc8Jyk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJY2hhcltdIHR5cGVQYXJhbWV0ZXJTaWcgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVBhcmFtZXRlclNpZ25hdHVyZSgKLQkJCQkJCShjaGFyW10pIHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KGkpLCAKKwkJCQkJCShjaGFyW10pIHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KGkpLAogCQkJCQkJbmV3IGNoYXJbXVtdeyBDb25zdGFudFBvb2wuT2JqZWN0U2lnbmF0dXJlIH0pOwogCQkJCXR5cGVQYXJhbWV0ZXJzU2lnLmFwcGVuZCh0eXBlUGFyYW1ldGVyU2lnKTsKIAkJCQkvLyBUT0RPIChqZXJvbWUpIGFkZCB0eXBlIHBhcmFtZXRlciBib3VuZHMgaW4gYmluZGluZyBrZXkKIAkJCX0KIAkJCXR5cGVQYXJhbWV0ZXJzU2lnLmFwcGVuZCgnPicpOwotCQkJdGhpcy5zaWduYXR1cmUuaW5zZXJ0KHRoaXMudHlwZVNpZ1N0YXJ0LCB0eXBlUGFyYW1ldGVyc1NpZyk7CisJCQl0aGlzLnNpZ25hdHVyZS5pbnNlcnQodGhpcy50eXBlU2lnU3RhcnQsIHR5cGVQYXJhbWV0ZXJzU2lnLnRvU3RyaW5nKCkpOwogCQkJdGhpcy50eXBlUGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJfQogCQl0aGlzLnNpZ25hdHVyZS5hcHBlbmQoJzsnKTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBjb25zdW1lVHlwZVBhcmFtZXRlcihjaGFyW10gdHlwZVBhcmFtZXRlck5hbWUpIHsKIAkJdGhpcy50eXBlUGFyYW1ldGVycy5hZGQodHlwZVBhcmFtZXRlck5hbWUpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVUeXBlVmFyaWFibGUoY2hhcltdIHBvc2l0aW9uLCBjaGFyW10gdHlwZVZhcmlhYmxlTmFtZSkgewogCQl0aGlzLnNpZ25hdHVyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKCdUJyk7CiAJCXRoaXMuc2lnbmF0dXJlLmFwcGVuZCh0eXBlVmFyaWFibGVOYW1lKTsKIAkJdGhpcy5zaWduYXR1cmUuYXBwZW5kKCc7Jyk7CiAJfQotCQorCiAJcHVibGljIHZvaWQgY29uc3VtZVR5cGVXaXRoQ2FwdHVyZSgpIHsKIAkJS2V5VG9TaWduYXR1cmUga2V5VG9TaWduYXR1cmUgPSAoS2V5VG9TaWduYXR1cmUpIHRoaXMuYXJndW1lbnRzLmdldCgwKTsKIAkJdGhpcy5zaWduYXR1cmUgPSBrZXlUb1NpZ25hdHVyZS5zaWduYXR1cmU7CiAJCXRoaXMuYXJndW1lbnRzID0ga2V5VG9TaWduYXR1cmUuYXJndW1lbnRzOworCQl0aGlzLnR5cGVBcmd1bWVudHMgPSBrZXlUb1NpZ25hdHVyZS50eXBlQXJndW1lbnRzOwogCQl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBrZXlUb1NpZ25hdHVyZS50aHJvd25FeGNlcHRpb25zOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIGNvbnN1bWVXaWxkQ2FyZChpbnQgd2lsZENhcmRLaW5kKSB7CiAJCS8vIGRvbid0IHB1dCBnZW5lcmljIHR5cGUgaW4gc2lnbmF0dXJlCiAJCXRoaXMuc2lnbmF0dXJlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMjk4LDcgKzMxMCw3IEBACiAJCQkJcmV0dXJuOwogCQl9CiAJfQotCQorCiAJcHVibGljIFN0cmluZ1tdIGdldFRocm93bkV4Y2VwdGlvbnMoKSB7CiAJCWludCBsZW5ndGggPSB0aGlzLnRocm93bkV4Y2VwdGlvbnMuc2l6ZSgpOwogCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07CkBAIC0zMDcsMjAgKzMxOSwyMCBAQAogCQl9CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCQorCiAJcHVibGljIFN0cmluZ1tdIGdldFR5cGVBcmd1bWVudHMoKSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmFyZ3VtZW50cy5zaXplKCk7CisJCWludCBsZW5ndGggPSB0aGlzLnR5cGVBcmd1bWVudHMuc2l6ZSgpOwogCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9ICgoS2V5VG9TaWduYXR1cmUpIHRoaXMuYXJndW1lbnRzLmdldChpKSkuc2lnbmF0dXJlLnRvU3RyaW5nKCk7CisJCQlyZXN1bHRbaV0gPSAoKEtleVRvU2lnbmF0dXJlKSB0aGlzLnR5cGVBcmd1bWVudHMuZ2V0KGkpKS5zaWduYXR1cmUudG9TdHJpbmcoKTsKIAkJfQogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKKwogCXB1YmxpYyBCaW5kaW5nS2V5UGFyc2VyIG5ld1BhcnNlcigpIHsKIAkJcmV0dXJuIG5ldyBLZXlUb1NpZ25hdHVyZSh0aGlzKTsKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YQppbmRleCAxNDkzM2VjLi4xZWFmOTA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MUlVDYWNoZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDEyICsxNSwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKIC8qKgotICogVGhlIDxjb2RlPkxSVUNhY2hlPC9jb2RlPiBpcyBhIGhhc2h0YWJsZSB0aGF0IHN0b3JlcyBhIGZpbml0ZSBudW1iZXIgb2YgZWxlbWVudHMuICAKKyAqIFRoZSA8Y29kZT5MUlVDYWNoZTwvY29kZT4gaXMgYSBoYXNodGFibGUgdGhhdCBzdG9yZXMgYSBmaW5pdGUgbnVtYmVyIG9mIGVsZW1lbnRzLgogICogV2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIHZhbHVlcyB0byBhIGZ1bGwgY2FjaGUsIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIHZhbHVlcwogICogaW4gdGhlIGNhY2hlIGFyZSBkaXNjYXJkZWQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IHZhbHVlcyBhcyBuZWNlc3NhcnkuCi0gKiAKKyAqCiAgKiA8cD5UaGUgZGF0YSBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24gdGhlIExSVSB2aXJ0dWFsIG1lbW9yeSBwYWdpbmcgc2NoZW1lLgotICogCisgKgogICogPHA+T2JqZWN0cyBjYW4gdGFrZSB1cCBhIHZhcmlhYmxlIGFtb3VudCBvZiBjYWNoZSBzcGFjZSBieSBpbXBsZW1lbnRpbmcKICAqIHRoZSA8Y29kZT5JTFJVQ2FjaGVhYmxlPC9jb2RlPiBpbnRlcmZhY2UuCiAgKgpAQCAtMzIsNyArMzIsNyBAQAogcHVibGljIGNsYXNzIExSVUNhY2hlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIAogCS8qKgotCSAqIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIExSVUNhY2hlIHRvIHJlcHJlc2VudCBlbnRyaWVzIAorCSAqIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIExSVUNhY2hlIHRvIHJlcHJlc2VudCBlbnRyaWVzCiAJICogc3RvcmVkIGluIHRoZSBjYWNoZS4KIAkgKiBJdCBpcyBzdGF0aWMgYmVjYXVzZSBpdCBkb2VzIG5vdCByZXF1aXJlIGEgcG9pbnRlciB0byB0aGUgY2FjaGUKIAkgKiB3aGljaCBjb250YWlucyBpdC4KQEAgLTQwLDQ1ICs0MCw0NSBAQAogCSAqIEBzZWUgTFJVQ2FjaGUKIAkgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExSVUNhY2hlRW50cnkgewotCQkKKwogCQkvKioKIAkJICogSGFzaCB0YWJsZSBrZXkKIAkJICovCi0JCXB1YmxpYyBPYmplY3QgX2ZLZXk7Ci0JCSAKKwkJcHVibGljIE9iamVjdCBrZXk7CisKIAkJLyoqCiAJCSAqIEhhc2ggdGFibGUgdmFsdWUgKGFuIExSVUNhY2hlRW50cnkgb2JqZWN0KQogCQkgKi8KLQkJcHVibGljIE9iamVjdCBfZlZhbHVlOwkJIAorCQlwdWJsaWMgT2JqZWN0IHZhbHVlOwogCiAJCS8qKgogCQkgKiBUaW1lIHZhbHVlIGZvciBxdWV1ZSBzb3J0aW5nCiAJCSAqLwotCQlwdWJsaWMgaW50IF9mVGltZXN0YW1wOwotCQkKKwkJcHVibGljIGludCB0aW1lc3RhbXA7CisKIAkJLyoqCiAJCSAqIENhY2hlIGZvb3RwcmludCBvZiB0aGlzIGVudHJ5CiAJCSAqLwotCQlwdWJsaWMgaW50IF9mU3BhY2U7Ci0JCQorCQlwdWJsaWMgaW50IHNwYWNlOworCiAJCS8qKgogCQkgKiBQcmV2aW91cyBlbnRyeSBpbiBxdWV1ZQogCQkgKi8KLQkJcHVibGljIExSVUNhY2hlRW50cnkgX2ZQcmV2aW91czsKLQkJCQorCQlwdWJsaWMgTFJVQ2FjaGVFbnRyeSBwcmV2aW91czsKKwogCQkvKioKIAkJICogTmV4dCBlbnRyeSBpbiBxdWV1ZQogCQkgKi8KLQkJcHVibGljIExSVUNhY2hlRW50cnkgX2ZOZXh0OwotCQkJCisJCXB1YmxpYyBMUlVDYWNoZUVudHJ5IG5leHQ7CisKIAkJLyoqCiAJCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcwogCQkgKiBmb3Iga2V5LCB2YWx1ZSwgYW5kIHNwYWNlLgogCQkgKi8KIAkJcHVibGljIExSVUNhY2hlRW50cnkgKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgaW50IHNwYWNlKSB7Ci0JCQlfZktleSA9IGtleTsKLQkJCV9mVmFsdWUgPSB2YWx1ZTsKLQkJCV9mU3BhY2UgPSBzcGFjZTsKKwkJCXRoaXMua2V5ID0ga2V5OworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQkJdGhpcy5zcGFjZSA9IHNwYWNlOwogCQl9CiAKIAkJLyoqCkBAIC04Niw1MCArODYsMTk4IEBACiAJCSAqLwogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCi0JCQlyZXR1cm4gIkxSVUNhY2hlRW50cnkgWyIgKyBfZktleSArICItLT4iICsgX2ZWYWx1ZSArICJdIjsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXJldHVybiAiTFJVQ2FjaGVFbnRyeSBbIiArIHRoaXMua2V5ICsgIi0tPiIgKyB0aGlzLnZhbHVlICsgIl0iOyAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9Ci0JfQkKKwl9CisJCisJcHVibGljIGNsYXNzIFN0YXRzIHsKKwkJcHJpdmF0ZSBpbnRbXSBjb3VudGVycyA9IG5ldyBpbnRbMjBdOworCQlwcml2YXRlIGxvbmdbXSB0aW1lc3RhbXBzID0gbmV3IGxvbmdbMjBdOworCQlwcml2YXRlIGludCBjb3VudGVySW5kZXggPSAtMTsKKwkJCisJCXByaXZhdGUgdm9pZCBhZGQoaW50IGNvdW50ZXIpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuY291bnRlckluZGV4OyBpKyspIHsKKwkJCQlpZiAodGhpcy5jb3VudGVyc1tpXSA9PSBjb3VudGVyKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jb3VudGVycy5sZW5ndGg7CisJCQlpZiAoKyt0aGlzLmNvdW50ZXJJbmRleCA9PSBsZW5ndGgpIHsKKwkJCQlpbnQgbmV3TGVuZ3RoID0gdGhpcy5jb3VudGVycy5sZW5ndGggKiAyOworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb3VudGVycywgMCwgdGhpcy5jb3VudGVycyA9IG5ldyBpbnRbbmV3TGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudGltZXN0YW1wcywgMCwgdGhpcy50aW1lc3RhbXBzID0gbmV3IGxvbmdbbmV3TGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXRoaXMuY291bnRlcnNbdGhpcy5jb3VudGVySW5kZXhdID0gY291bnRlcjsKKwkJCXRoaXMudGltZXN0YW1wc1t0aGlzLmNvdW50ZXJJbmRleF0gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJfQorCQlwcml2YXRlIFN0cmluZyBnZXRBdmVyYWdlQWdlKGxvbmcgdG90YWxUaW1lLCBpbnQgbnVtYmVyT2ZFbGVtZW50cywgbG9uZyBjdXJyZW50VGltZSkgeworCQkJaWYgKG51bWJlck9mRWxlbWVudHMgPT0gMCkKKwkJCQlyZXR1cm4gIk4vQSI7IC8vJE5PTi1OTFMtMSQKKwkJCWxvbmcgdGltZSA9IHRvdGFsVGltZSAvIG51bWJlck9mRWxlbWVudHM7CisJCQlsb25nIGFnZSA9IGN1cnJlbnRUaW1lIC0gdGltZTsKKwkJCWxvbmcgYWdlSW5TZWNvbmRzID0gYWdlLzEwMDA7CisJCQlpbnQgc2Vjb25kcyA9IDA7CisJCQlpbnQgbWludXRlcyA9IDA7CisJCQlpbnQgaG91cnMgPSAwOworCQkJaW50IGRheXMgPSAwOworCQkJaWYgKGFnZUluU2Vjb25kcyA+IDYwKSB7CisJCQkJbG9uZyBhZ2VJbk1pbiA9IGFnZUluU2Vjb25kcyAvIDYwOworCQkJCXNlY29uZHMgPSAoaW50KSAoYWdlSW5TZWNvbmRzIC0gKDYwICogYWdlSW5NaW4pKTsKKwkJCQlpZiAoYWdlSW5NaW4gPiA2MCkgeworCQkJCQlsb25nIGFnZUluSG91cnMgPSBhZ2VJbk1pbiAvIDYwOworCQkJCQltaW51dGVzID0gKGludCkgKGFnZUluTWluIC0gKDYwICogYWdlSW5Ib3VycykpOworCQkJCQlpZiAoYWdlSW5Ib3VycyA+IDI0KSB7CisJCQkJCQlsb25nIGFnZUluRGF5cyA9IGFnZUluSG91cnMgLyAyNDsKKwkJCQkJCWhvdXJzID0gKGludCkgKGFnZUluSG91cnMgLSAoMjQgKiBhZ2VJbkRheXMpKTsKKwkJCQkJCWRheXMgPSAoaW50KSBhZ2VJbkRheXM7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlob3VycyA9IChpbnQpIGFnZUluSG91cnM7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQltaW51dGVzID0gKGludCkgYWdlSW5NaW47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzZWNvbmRzID0gKGludCkgYWdlSW5TZWNvbmRzOworCQkJfQorCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWlmIChkYXlzID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoZGF5cyk7CisJCQkJYnVmZmVyLmFwcGVuZCgiIGRheXMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChob3VycyA+IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKGhvdXJzKTsKKwkJCQlidWZmZXIuYXBwZW5kKCIgaG91cnMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChtaW51dGVzID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQobWludXRlcyk7CisJCQkJYnVmZmVyLmFwcGVuZCgiIG1pbnV0ZXMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kcyk7CisJCQlidWZmZXIuYXBwZW5kKCIgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKwkJcHJpdmF0ZSBsb25nIGdldFRpbWVzdGFtcHMoaW50IGNvdW50ZXIpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IHRoaXMuY291bnRlckluZGV4OyBpKyspIHsKKwkJCQlpZiAodGhpcy5jb3VudGVyc1tpXSA+PSBjb3VudGVyKQorCQkJCQlyZXR1cm4gdGhpcy50aW1lc3RhbXBzW2ldOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHByaW50U3RhdHMoKSB7CisJCQlpbnQgbnVtYmVyT2ZFbGVtZW50cyA9IExSVUNhY2hlLnRoaXMuY3VycmVudFNwYWNlOworCQkJaWYgKG51bWJlck9mRWxlbWVudHMgPT0gMCkgeworCQkJCXJldHVybiAiTm8gZWxlbWVudHMgaW4gY2FjaGUiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCisJCQlidWZmZXIuYXBwZW5kKCJOdW1iZXIgb2YgZWxlbWVudHMgaW4gY2FjaGU6ICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKG51bWJlck9mRWxlbWVudHMpOworCQkJCisJCQlmaW5hbCBpbnQgbnVtYmVyT2ZHcm91cHMgPSA1OworCQkJaW50IG51bWJlck9mRWxlbWVudHNQZXJHcm91cCA9IG51bWJlck9mRWxlbWVudHMgLyBudW1iZXJPZkdyb3VwczsKKwkJCWJ1ZmZlci5hcHBlbmQoIlxuKCIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKG51bWJlck9mR3JvdXBzKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiBncm91cHMgb2YgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQobnVtYmVyT2ZFbGVtZW50c1Blckdyb3VwKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiBlbGVtZW50cykiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCgiXG5cbkF2ZXJhZ2UgYWdlOiIpOyAvLyROT04tTkxTLTEkCisJCQlpbnQgZ3JvdXBOdW1iZXIgPSAxOworCQkJaW50IGVsZW1lbnRDb3VudGVyID0gMDsKKwkJCUxSVUNhY2hlRW50cnkgZW50cnkgPSBMUlVDYWNoZS50aGlzLmVudHJ5UXVldWVUYWlsOworCQkJbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJbG9uZyBhY2N1bXVsYXRlZFRpbWUgPSAwOworCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKKwkJCQlsb25nIHRpbWVTdGFtcHMgPSBnZXRUaW1lc3RhbXBzKGVudHJ5LnRpbWVzdGFtcCk7CisJCQkJaWYgKHRpbWVTdGFtcHMgPiAwKSB7CisJCQkJCWFjY3VtdWxhdGVkVGltZSArPSB0aW1lU3RhbXBzOworCQkJCQllbGVtZW50Q291bnRlcisrOworCQkJCX0KKwkJCQlpZiAoZWxlbWVudENvdW50ZXIgPj0gbnVtYmVyT2ZFbGVtZW50c1Blckdyb3VwICYmIChncm91cE51bWJlciA8IG51bWJlck9mR3JvdXBzKSkgeworCQkJCQlidWZmZXIuYXBwZW5kKCJcbkdyb3VwICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJ1ZmZlci5hcHBlbmQoZ3JvdXBOdW1iZXIpOworCQkJCQlpZiAoZ3JvdXBOdW1iZXIgPT0gMSkgeworCQkJCQkJYnVmZmVyLmFwcGVuZCgiIChvbGRlc3QpXHQ6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKCJcdFx0OiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWdyb3VwTnVtYmVyKys7CisJCQkJCWJ1ZmZlci5hcHBlbmQoZ2V0QXZlcmFnZUFnZShhY2N1bXVsYXRlZFRpbWUsIGVsZW1lbnRDb3VudGVyLCBjdXJyZW50VGltZSkpOworCQkJCQllbGVtZW50Q291bnRlciA9IDA7CisJCQkJCWFjY3VtdWxhdGVkVGltZSA9IDA7CisJCQkJfQorCQkJCWVudHJ5ID0gZW50cnkucHJldmlvdXM7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJcbkdyb3VwICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKG51bWJlck9mR3JvdXBzKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiAoeW91bmdlc3QpXHQ6ICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKGdldEF2ZXJhZ2VBZ2UoYWNjdW11bGF0ZWRUaW1lLCBlbGVtZW50Q291bnRlciwgY3VycmVudFRpbWUpKTsKKwkJCQorCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9CisJCXByaXZhdGUgdm9pZCByZW1vdmVDb3VudGVyc09sZGVyVGhhbihpbnQgY291bnRlcikgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gdGhpcy5jb3VudGVySW5kZXg7IGkrKykgeworCQkJCWlmICh0aGlzLmNvdW50ZXJzW2ldID49IGNvdW50ZXIpIHsKKwkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy5jb3VudGVySW5kZXgtaSsxOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvdW50ZXJzLCBpLCB0aGlzLmNvdW50ZXJzLCAwLCBsZW5ndGgpOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnRpbWVzdGFtcHMsIGksIHRoaXMudGltZXN0YW1wcywgMCwgbGVuZ3RoKTsKKwkJCQkJCXRoaXMuY291bnRlckluZGV4ID0gbGVuZ3RoOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHVibGljIE9iamVjdCBnZXRPbGRlc3RFbGVtZW50KCkgeworCQkJcmV0dXJuIExSVUNhY2hlLnRoaXMuZ2V0T2xkZXN0RWxlbWVudCgpOworCQl9CisJCXB1YmxpYyBsb25nIGdldE9sZGVzdFRpbWVzdGFtcHMoKSB7CisJCQlyZXR1cm4gZ2V0VGltZXN0YW1wcyhnZXRPbGRlc3RUaW1lc3RhbXBDb3VudGVyKCkpOworCQl9CisJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzbmFwc2hvdCgpIHsKKwkJCXJlbW92ZUNvdW50ZXJzT2xkZXJUaGFuKGdldE9sZGVzdFRpbWVzdGFtcENvdW50ZXIoKSk7CisJCQlhZGQoZ2V0TmV3ZXN0VGltZXN0YW1wQ291bnRlcigpKTsKKwkJfQorCX0KIAogCS8qKgogCSAqIEFtb3VudCBvZiBjYWNoZSBzcGFjZSB1c2VkIHNvIGZhcgogCSAqLwotCXByb3RlY3RlZCBpbnQgZkN1cnJlbnRTcGFjZTsKLQkKKwlwcm90ZWN0ZWQgaW50IGN1cnJlbnRTcGFjZTsKKwogCS8qKgogCSAqIE1heGltdW0gc3BhY2UgYWxsb3dlZCBpbiBjYWNoZQogCSAqLwotCXByb3RlY3RlZCBpbnQgZlNwYWNlTGltaXQ7Ci0JCisJcHJvdGVjdGVkIGludCBzcGFjZUxpbWl0OworCiAJLyoqCiAJICogQ291bnRlciBmb3IgaGFuZGluZyBvdXQgc2VxdWVudGlhbCB0aW1lc3RhbXBzCiAJICovCi0JcHJvdGVjdGVkIGludAlmVGltZXN0YW1wQ291bnRlcjsKLQkKKwlwcm90ZWN0ZWQgaW50IHRpbWVzdGFtcENvdW50ZXI7CisKIAkvKioKIAkgKiBIYXNoIHRhYmxlIGZvciBmYXN0IHJhbmRvbSBhY2Nlc3MgdG8gY2FjaGUgZW50cmllcwogCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGUgZkVudHJ5VGFibGU7CisJcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnRyeVRhYmxlOwogCiAJLyoqCi0JICogU3RhcnQgb2YgcXVldWUgKG1vc3QgcmVjZW50bHkgdXNlZCBlbnRyeSkgCi0JICovCQotCXByb3RlY3RlZCBMUlVDYWNoZUVudHJ5IGZFbnRyeVF1ZXVlOworCSAqIFN0YXJ0IG9mIHF1ZXVlIChtb3N0IHJlY2VudGx5IHVzZWQgZW50cnkpCisJICovCisJcHJvdGVjdGVkIExSVUNhY2hlRW50cnkgZW50cnlRdWV1ZTsKIAogCS8qKgogCSAqIEVuZCBvZiBxdWV1ZSAobGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSkKLQkgKi8JCi0JcHJvdGVjdGVkIExSVUNhY2hlRW50cnkgZkVudHJ5UXVldWVUYWlsOwotCQkKKwkgKi8KKwlwcm90ZWN0ZWQgTFJVQ2FjaGVFbnRyeSBlbnRyeVF1ZXVlVGFpbDsKKwogCS8qKgogCSAqIERlZmF1bHQgYW1vdW50IG9mIHNwYWNlIGluIHRoZSBjYWNoZQogCSAqLwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1BBQ0VMSU1JVCA9IDEwMDsKIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNhY2hlLiAgU2l6ZSBvZiBjYWNoZSBpcyBkZWZpbmVkIGJ5IAorCSAqIENyZWF0ZXMgYSBuZXcgY2FjaGUuICBTaXplIG9mIGNhY2hlIGlzIGRlZmluZWQgYnkKIAkgKiA8Y29kZT5ERUZBVUxUX1NQQUNFTElNSVQ8L2NvZGU+LgogCSAqLwogCXB1YmxpYyBMUlVDYWNoZSgpIHsKLQkJCisKIAkJdGhpcyhERUZBVUxUX1NQQUNFTElNSVQpOwogCX0KIAkvKioKQEAgLTEzNywxMSArMjg1LDExIEBACiAJICogQHBhcmFtIHNpemUgU2l6ZSBvZiBDYWNoZQogCSAqLwogCXB1YmxpYyBMUlVDYWNoZShpbnQgc2l6ZSkgewotCQkKLQkJZlRpbWVzdGFtcENvdW50ZXIgPSBmQ3VycmVudFNwYWNlID0gMDsKLQkJZkVudHJ5UXVldWUgPSBmRW50cnlRdWV1ZVRhaWwgPSBudWxsOwotCQlmRW50cnlUYWJsZSA9IG5ldyBIYXNodGFibGUoc2l6ZSk7Ci0JCWZTcGFjZUxpbWl0ID0gc2l6ZTsKKworCQl0aGlzLnRpbWVzdGFtcENvdW50ZXIgPSB0aGlzLmN1cnJlbnRTcGFjZSA9IDA7CisJCXRoaXMuZW50cnlRdWV1ZSA9IHRoaXMuZW50cnlRdWV1ZVRhaWwgPSBudWxsOworCQl0aGlzLmVudHJ5VGFibGUgPSBuZXcgSGFzaHRhYmxlKHNpemUpOworCQl0aGlzLnNwYWNlTGltaXQgPSBzaXplOwogCX0KIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGNhY2hlIGNvbnRhaW5pbmcgdGhlIHNhbWUgY29udGVudHMuCkBAIC0xNDksMzIgKzI5NywzMiBAQAogCSAqIEByZXR1cm4gTmV3IGNvcHkgb2Ygb2JqZWN0LgogCSAqLwogCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCQotCQlMUlVDYWNoZSBuZXdDYWNoZSA9IG5ld0luc3RhbmNlKGZTcGFjZUxpbWl0KTsKKworCQlMUlVDYWNoZSBuZXdDYWNoZSA9IG5ld0luc3RhbmNlKHRoaXMuc3BhY2VMaW1pdCk7CiAJCUxSVUNhY2hlRW50cnkgcUVudHJ5OwotCQkKKwogCQkvKiBQcmVzZXJ2ZSBvcmRlciBvZiBlbnRyaWVzIGJ5IGNvcHlpbmcgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0ICovCi0JCXFFbnRyeSA9IHRoaXMuZkVudHJ5UXVldWVUYWlsOworCQlxRW50cnkgPSB0aGlzLmVudHJ5UXVldWVUYWlsOwogCQl3aGlsZSAocUVudHJ5ICE9IG51bGwpIHsKLQkJCW5ld0NhY2hlLnByaXZhdGVBZGQgKHFFbnRyeS5fZktleSwgcUVudHJ5Ll9mVmFsdWUsIHFFbnRyeS5fZlNwYWNlKTsKLQkJCXFFbnRyeSA9IHFFbnRyeS5fZlByZXZpb3VzOworCQkJbmV3Q2FjaGUucHJpdmF0ZUFkZCAocUVudHJ5LmtleSwgcUVudHJ5LnZhbHVlLCBxRW50cnkuc3BhY2UpOworCQkJcUVudHJ5ID0gcUVudHJ5LnByZXZpb3VzOwogCQl9CiAJCXJldHVybiBuZXdDYWNoZTsKIAl9CiAJcHVibGljIGRvdWJsZSBmaWxsaW5nUmF0aW8oKSB7Ci0JCXJldHVybiAoZkN1cnJlbnRTcGFjZSkgKiAxMDAuMCAvIGZTcGFjZUxpbWl0OworCQlyZXR1cm4gKHRoaXMuY3VycmVudFNwYWNlKSAqIDEwMC4wIC8gdGhpcy5zcGFjZUxpbWl0OwogCX0KIAkvKioKIAkgKiBGbHVzaGVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLgogCSAqLwogCXB1YmxpYyB2b2lkIGZsdXNoKCkgewogCi0JCWZDdXJyZW50U3BhY2UgPSAwOwotCQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gZkVudHJ5UXVldWVUYWlsOyAvLyBSZW1lbWJlciBsYXN0IGVudHJ5Ci0JCWZFbnRyeVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgLy8gQ2xlYXIgaXQgb3V0Ci0JCWZFbnRyeVF1ZXVlID0gZkVudHJ5UXVldWVUYWlsID0gbnVsbDsgIAorCQl0aGlzLmN1cnJlbnRTcGFjZSA9IDA7CisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSB0aGlzLmVudHJ5UXVldWVUYWlsOyAvLyBSZW1lbWJlciBsYXN0IGVudHJ5CisJCXRoaXMuZW50cnlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsgIC8vIENsZWFyIGl0IG91dAorCQl0aGlzLmVudHJ5UXVldWUgPSB0aGlzLmVudHJ5UXVldWVUYWlsID0gbnVsbDsKIAkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsgIC8vIHNlbmQgZGVsZXRpb24gbm90aWZpY2F0aW9ucyBpbiBMUlUgb3JkZXIKLQkJCWVudHJ5ID0gZW50cnkuX2ZQcmV2aW91czsKKwkJCWVudHJ5ID0gZW50cnkucHJldmlvdXM7CiAJCX0KIAl9CiAJLyoqCkBAIC0xODQsMTUgKzMzMiwyNiBAQAogCSAqIEBwYXJhbSBrZXkgS2V5IG9mIG9iamVjdCB0byBmbHVzaAogCSAqLwogCXB1YmxpYyB2b2lkIGZsdXNoIChPYmplY3Qga2V5KSB7Ci0JCQorCiAJCUxSVUNhY2hlRW50cnkgZW50cnk7Ci0JCQotCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQoa2V5KTsKKworCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSB0aGlzLmVudHJ5VGFibGUuZ2V0KGtleSk7CiAKIAkJLyogSWYgZW50cnkgZG9lcyBub3QgZXhpc3QsIHJldHVybiAqLwogCQlpZiAoZW50cnkgPT0gbnVsbCkgcmV0dXJuOwogCi0JCXRoaXMucHJpdmF0ZVJlbW92ZUVudHJ5IChlbnRyeSwgZmFsc2UpOworCQlwcml2YXRlUmVtb3ZlRW50cnkgKGVudHJ5LCBmYWxzZSk7CisJfQorCS8qCisJICogQW5zd2VycyB0aGUgZXhpc3Rpbmcga2V5IHRoYXQgaXMgZXF1YWxzIHRvIHRoZSBnaXZlbiBrZXkuCisJICogSWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGNhY2hlLCByZXR1cm5zIHRoZSBnaXZlbiBrZXkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEtleShPYmplY3Qga2V5KSB7CisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgdGhpcy5lbnRyeVRhYmxlLmdldChrZXkpOworCQlpZiAoZW50cnkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGtleTsKKwkJfQorCQlyZXR1cm4gZW50cnkua2V5OwogCX0KIAkvKioKIAkgKiBBbnN3ZXJzIHRoZSB2YWx1ZSBpbiB0aGUgY2FjaGUgYXQgdGhlIGdpdmVuIGtleS4KQEAgLTIwMiw1OCArMzYxLDc3IEBACiAJICogQHJldHVybiBSZXRyZWl2ZWQgb2JqZWN0LCBvciBudWxsIGlmIG9iamVjdCBkb2VzIG5vdCBleGlzdAogCSAqLwogCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkJCi0JCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0KGtleSk7CisKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeSA9IChMUlVDYWNoZUVudHJ5KSB0aGlzLmVudHJ5VGFibGUuZ2V0KGtleSk7CiAJCWlmIChlbnRyeSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQkKLQkJdGhpcy51cGRhdGVUaW1lc3RhbXAgKGVudHJ5KTsKLQkJcmV0dXJuIGVudHJ5Ll9mVmFsdWU7CisKKwkJdXBkYXRlVGltZXN0YW1wIChlbnRyeSk7CisJCXJldHVybiBlbnRyeS52YWx1ZTsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHNwYWNlIHRoYXQgaXMgY3VycmVudCB1c2VkIGluIHRoZSBjYWNoZS4KIAkgKi8KIAlwdWJsaWMgaW50IGdldEN1cnJlbnRTcGFjZSgpIHsKLQkJcmV0dXJuIGZDdXJyZW50U3BhY2U7CisJCXJldHVybiB0aGlzLmN1cnJlbnRTcGFjZTsKIAl9CiAJLyoqCisJICogUmV0dXJucyB0aGUgdGltZXN0YW1wcyBvZiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGVsZW1lbnQgaW4gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmV3ZXN0VGltZXN0YW1wQ291bnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuZW50cnlRdWV1ZSA9PSBudWxsID8gMCA6IHRoaXMuZW50cnlRdWV1ZS50aW1lc3RhbXA7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZWxlbWVudCBpbiB0aGUgY2FjaGUuCisJICovCisJcHVibGljIGludCBnZXRPbGRlc3RUaW1lc3RhbXBDb3VudGVyKCkgeworCQlyZXR1cm4gdGhpcy5lbnRyeVF1ZXVlVGFpbCA9PSBudWxsID8gMCA6IHRoaXMuZW50cnlRdWV1ZVRhaWwudGltZXN0YW1wOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZXN0IHJlY2VudGx5IHVzZWQgZWxlbWVudCBpbiB0aGUgY2FjaGUKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldE9sZGVzdEVsZW1lbnQoKSB7CisJCXJldHVybiB0aGlzLmVudHJ5UXVldWVUYWlsID09IG51bGwgPyBudWxsIDogdGhpcy5lbnRyeVF1ZXVlVGFpbC5rZXk7CisJfQorCQorCS8qKgogCSAqIFJldHVybnMgdGhlIG1heGltdW0gYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGUuCiAJICovCiAJcHVibGljIGludCBnZXRTcGFjZUxpbWl0KCkgewotCQlyZXR1cm4gZlNwYWNlTGltaXQ7CisJCXJldHVybiB0aGlzLnNwYWNlTGltaXQ7CiAJfQogCS8qKgogCSAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb2YgdGhlIGtleXMgY3VycmVudGx5IGluIHRoZSBjYWNoZS4KIAkgKi8KIAlwdWJsaWMgRW51bWVyYXRpb24ga2V5cygpIHsKLQkJCi0JCXJldHVybiBmRW50cnlUYWJsZS5rZXlzKCk7CisKKwkJcmV0dXJuIHRoaXMuZW50cnlUYWJsZS5rZXlzKCk7CiAJfQogCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzIAorCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzCiAJICogY3VycmVudGx5IGluIHRoZSBjYWNoZS4KIAkgKi8KIAlwdWJsaWMgSUNhY2hlRW51bWVyYXRpb24ga2V5c0FuZFZhbHVlcygpIHsKIAkJcmV0dXJuIG5ldyBJQ2FjaGVFbnVtZXJhdGlvbigpIHsKLQkJCi0JCQlFbnVtZXJhdGlvbiBmVmFsdWVzID0gZkVudHJ5VGFibGUuZWxlbWVudHMoKTsKLQkJCUxSVUNhY2hlRW50cnkgZkVudHJ5OwotCQkJCisKKwkJCUVudW1lcmF0aW9uIHZhbHVlcyA9IExSVUNhY2hlLnRoaXMuZW50cnlUYWJsZS5lbGVtZW50cygpOworCQkJTFJVQ2FjaGVFbnRyeSBlbnRyeTsKKwogCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiBmVmFsdWVzLmhhc01vcmVFbGVtZW50cygpOworCQkJCXJldHVybiB0aGlzLnZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKTsKIAkJCX0KLQkJCQorCiAJCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJCWZFbnRyeSA9IChMUlVDYWNoZUVudHJ5KSBmVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGZFbnRyeS5fZktleTsKKwkJCQl0aGlzLmVudHJ5ID0gKExSVUNhY2hlRW50cnkpIHRoaXMudmFsdWVzLm5leHRFbGVtZW50KCk7CisJCQkJcmV0dXJuIHRoaXMuZW50cnkua2V5OwogCQkJfQotCQkJCisKIAkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQkJaWYgKGZFbnRyeSA9PSBudWxsKSB7CisJCQkJaWYgKHRoaXMuZW50cnkgPT0gbnVsbCkgewogCQkJCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGZFbnRyeS5fZlZhbHVlOworCQkJCXJldHVybiB0aGlzLmVudHJ5LnZhbHVlOwogCQkJfQogCQl9OwogCX0KQEAgLTI2NSwyNCArNDQzLDI0IEBACiAJICogQHBhcmFtIHNwYWNlIEFtb3VudCBvZiBzcGFjZSB0byBmcmVlIHVwCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gbWFrZVNwYWNlIChpbnQgc3BhY2UpIHsKLQkJCisKIAkJaW50IGxpbWl0OwotCQkKLQkJbGltaXQgPSB0aGlzLmdldFNwYWNlTGltaXQoKTsKLQkJCisKKwkJbGltaXQgPSBnZXRTcGFjZUxpbWl0KCk7CisKIAkJLyogaWYgc3BhY2UgaXMgYWxyZWFkeSBhdmFpbGFibGUgKi8KLQkJaWYgKGZDdXJyZW50U3BhY2UgKyBzcGFjZSA8PSBsaW1pdCkgeworCQlpZiAodGhpcy5jdXJyZW50U3BhY2UgKyBzcGFjZSA8PSBsaW1pdCkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJCisKIAkJLyogaWYgZW50cnkgaXMgdG9vIGJpZyBmb3IgY2FjaGUgKi8KIAkJaWYgKHNwYWNlID4gbGltaXQpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQkKKwogCQkvKiBGcmVlIHVwIHNwYWNlIGJ5IHJlbW92aW5nIG9sZGVzdCBlbnRyaWVzICovCi0JCXdoaWxlIChmQ3VycmVudFNwYWNlICsgc3BhY2UgPiBsaW1pdCAmJiBmRW50cnlRdWV1ZVRhaWwgIT0gbnVsbCkgewotCQkJdGhpcy5wcml2YXRlUmVtb3ZlRW50cnkgKGZFbnRyeVF1ZXVlVGFpbCwgZmFsc2UpOworCQl3aGlsZSAodGhpcy5jdXJyZW50U3BhY2UgKyBzcGFjZSA+IGxpbWl0ICYmIHRoaXMuZW50cnlRdWV1ZVRhaWwgIT0gbnVsbCkgeworCQkJcHJpdmF0ZVJlbW92ZUVudHJ5ICh0aGlzLmVudHJ5UXVldWVUYWlsLCBmYWxzZSk7CiAJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMjk5LDc3ICs0NzcsNzcgQEAKIAkgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSB0aW1lc3RhbXBzLgogCSAqLwogCXB1YmxpYyBPYmplY3QgcGVlayhPYmplY3Qga2V5KSB7Ci0JCQotCQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gKExSVUNhY2hlRW50cnkpIGZFbnRyeVRhYmxlLmdldChrZXkpOworCisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgdGhpcy5lbnRyeVRhYmxlLmdldChrZXkpOwogCQlpZiAoZW50cnkgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIGVudHJ5Ll9mVmFsdWU7CisJCXJldHVybiBlbnRyeS52YWx1ZTsKIAl9CiAJLyoqCiAJICogQWRkcyBhbiBlbnRyeSBmb3IgdGhlIGdpdmVuIGtleS92YWx1ZS9zcGFjZS4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlQWRkIChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGludCBzcGFjZSkgewotCQkKKwogCQlMUlVDYWNoZUVudHJ5IGVudHJ5OwotCQkKKwogCQllbnRyeSA9IG5ldyBMUlVDYWNoZUVudHJ5KGtleSwgdmFsdWUsIHNwYWNlKTsKLQkJdGhpcy5wcml2YXRlQWRkRW50cnkgKGVudHJ5LCBmYWxzZSk7CisJCXByaXZhdGVBZGRFbnRyeSAoZW50cnksIGZhbHNlKTsKIAl9CiAJLyoqCiAJICogQWRkcyB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcmVjZWl2ZXIuCi0JICogQHBhcmFtIHNodWZmbGUgSW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZSAKKwkgKiBAcGFyYW0gc2h1ZmZsZSBJbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUganVzdCBzaHVmZmxpbmcgdGhlIHF1ZXVlCiAJICogKGluIHdoaWNoIGNhc2UsIHRoZSBlbnRyeSB0YWJsZSBpcyBub3QgbW9kaWZpZWQpLgogCSAqLwogCXByb3RlY3RlZCB2b2lkIHByaXZhdGVBZGRFbnRyeSAoTFJVQ2FjaGVFbnRyeSBlbnRyeSwgYm9vbGVhbiBzaHVmZmxlKSB7Ci0JCQorCiAJCWlmICghc2h1ZmZsZSkgewotCQkJZkVudHJ5VGFibGUucHV0IChlbnRyeS5fZktleSwgZW50cnkpOwotCQkJZkN1cnJlbnRTcGFjZSArPSBlbnRyeS5fZlNwYWNlOworCQkJdGhpcy5lbnRyeVRhYmxlLnB1dCAoZW50cnkua2V5LCBlbnRyeSk7CisJCQl0aGlzLmN1cnJlbnRTcGFjZSArPSBlbnRyeS5zcGFjZTsKIAkJfQotCQkKLQkJZW50cnkuX2ZUaW1lc3RhbXAgPSBmVGltZXN0YW1wQ291bnRlcisrOwotCQllbnRyeS5fZk5leHQgPSB0aGlzLmZFbnRyeVF1ZXVlOwotCQllbnRyeS5fZlByZXZpb3VzID0gbnVsbDsKLQkJCi0JCWlmIChmRW50cnlRdWV1ZSA9PSBudWxsKSB7CisKKwkJZW50cnkudGltZXN0YW1wID0gdGhpcy50aW1lc3RhbXBDb3VudGVyKys7CisJCWVudHJ5Lm5leHQgPSB0aGlzLmVudHJ5UXVldWU7CisJCWVudHJ5LnByZXZpb3VzID0gbnVsbDsKKworCQlpZiAodGhpcy5lbnRyeVF1ZXVlID09IG51bGwpIHsKIAkJCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBsYXN0IGVudHJ5ICovCi0JCQlmRW50cnlRdWV1ZVRhaWwgPSBlbnRyeTsKKwkJCXRoaXMuZW50cnlRdWV1ZVRhaWwgPSBlbnRyeTsKIAkJfSBlbHNlIHsKLQkJCWZFbnRyeVF1ZXVlLl9mUHJldmlvdXMgPSBlbnRyeTsKKwkJCXRoaXMuZW50cnlRdWV1ZS5wcmV2aW91cyA9IGVudHJ5OwogCQl9Ci0JCQotCQlmRW50cnlRdWV1ZSA9IGVudHJ5OworCisJCXRoaXMuZW50cnlRdWV1ZSA9IGVudHJ5OwogCX0KIAkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIHRoZSBlbnRyeSBxdWV1ZS4gIAotCSAqIEBwYXJhbSBzaHVmZmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBqdXN0IHNodWZmbGluZyB0aGUgcXVldWUgCisJICogUmVtb3ZlcyB0aGUgZW50cnkgZnJvbSB0aGUgZW50cnkgcXVldWUuCisJICogQHBhcmFtIHNodWZmbGUgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZQogCSAqIChpbiB3aGljaCBjYXNlLCB0aGUgZW50cnkgdGFibGUgaXMgbm90IG1vZGlmaWVkKS4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlUmVtb3ZlRW50cnkgKExSVUNhY2hlRW50cnkgZW50cnksIGJvb2xlYW4gc2h1ZmZsZSkgewotCQkKKwogCQlMUlVDYWNoZUVudHJ5IHByZXZpb3VzLCBuZXh0OwotCQkKLQkJcHJldmlvdXMgPSBlbnRyeS5fZlByZXZpb3VzOwotCQluZXh0ID0gZW50cnkuX2ZOZXh0OwotCQkKKworCQlwcmV2aW91cyA9IGVudHJ5LnByZXZpb3VzOworCQluZXh0ID0gZW50cnkubmV4dDsKKwogCQlpZiAoIXNodWZmbGUpIHsKLQkJCWZFbnRyeVRhYmxlLnJlbW92ZShlbnRyeS5fZktleSk7Ci0JCQlmQ3VycmVudFNwYWNlIC09IGVudHJ5Ll9mU3BhY2U7CisJCQl0aGlzLmVudHJ5VGFibGUucmVtb3ZlKGVudHJ5LmtleSk7CisJCQl0aGlzLmN1cnJlbnRTcGFjZSAtPSBlbnRyeS5zcGFjZTsKIAkJfQogCiAJCS8qIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCBlbnRyeSAqLwogCQlpZiAocHJldmlvdXMgPT0gbnVsbCkgewotCQkJZkVudHJ5UXVldWUgPSBuZXh0OworCQkJdGhpcy5lbnRyeVF1ZXVlID0gbmV4dDsKIAkJfSBlbHNlIHsKLQkJCXByZXZpb3VzLl9mTmV4dCA9IG5leHQ7CisJCQlwcmV2aW91cy5uZXh0ID0gbmV4dDsKIAkJfQogCiAJCS8qIGlmIHRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5ICovCiAJCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCWZFbnRyeVF1ZXVlVGFpbCA9IHByZXZpb3VzOworCQkJdGhpcy5lbnRyeVF1ZXVlVGFpbCA9IHByZXZpb3VzOwogCQl9IGVsc2UgewotCQkJbmV4dC5fZlByZXZpb3VzID0gcHJldmlvdXM7CisJCQluZXh0LnByZXZpb3VzID0gcHJldmlvdXM7CiAJCX0KIAl9CiAJLyoqCkBAIC0zODAsMjggKzU1OCwyOCBAQAogCSAqIEByZXR1cm4gYWRkZWQgdmFsdWUuCiAJICovCiAJcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQorCiAJCWludCBuZXdTcGFjZSwgb2xkU3BhY2UsIG5ld1RvdGFsOwogCQlMUlVDYWNoZUVudHJ5IGVudHJ5OwotCQkKKwogCQkvKiBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW4gZW50cnkgaW4gdGhlIGNhY2hlICovCiAJCW5ld1NwYWNlID0gc3BhY2VGb3IodmFsdWUpOwotCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQgKGtleSk7Ci0JCQorCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSB0aGlzLmVudHJ5VGFibGUuZ2V0IChrZXkpOworCiAJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkKKwogCQkJLyoqCiAJCQkgKiBSZXBsYWNlIHRoZSBlbnRyeSBpbiB0aGUgY2FjaGUgaWYgaXQgd291bGQgbm90IG92ZXJmbG93Ci0JCQkgKiB0aGUgY2FjaGUuICBPdGhlcndpc2UgZmx1c2ggdGhlIGVudHJ5IGFuZCByZS1hZGQgaXQgc28gYXMgCisJCQkgKiB0aGUgY2FjaGUuICBPdGhlcndpc2UgZmx1c2ggdGhlIGVudHJ5IGFuZCByZS1hZGQgaXQgc28gYXMKIAkJCSAqIHRvIGtlZXAgY2FjaGUgd2l0aGluIGJ1ZGdldAogCQkJICovCi0JCQlvbGRTcGFjZSA9IGVudHJ5Ll9mU3BhY2U7CisJCQlvbGRTcGFjZSA9IGVudHJ5LnNwYWNlOwogCQkJbmV3VG90YWwgPSBnZXRDdXJyZW50U3BhY2UoKSAtIG9sZFNwYWNlICsgbmV3U3BhY2U7CiAJCQlpZiAobmV3VG90YWwgPD0gZ2V0U3BhY2VMaW1pdCgpKSB7CiAJCQkJdXBkYXRlVGltZXN0YW1wIChlbnRyeSk7Ci0JCQkJZW50cnkuX2ZWYWx1ZSA9IHZhbHVlOwotCQkJCWVudHJ5Ll9mU3BhY2UgPSBuZXdTcGFjZTsKLQkJCQl0aGlzLmZDdXJyZW50U3BhY2UgPSBuZXdUb3RhbDsKKwkJCQllbnRyeS52YWx1ZSA9IHZhbHVlOworCQkJCWVudHJ5LnNwYWNlID0gbmV3U3BhY2U7CisJCQkJdGhpcy5jdXJyZW50U3BhY2UgPSBuZXdUb3RhbDsKIAkJCQlyZXR1cm4gdmFsdWU7CiAJCQl9IGVsc2UgewogCQkJCXByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIGZhbHNlKTsKQEAgLTQyMCwxMyArNTk4LDEzIEBACiAJICogQHJldHVybiBWYWx1ZSByZW1vdmVkIGZyb20gY2FjaGUuCiAJICovCiAJcHVibGljIE9iamVjdCByZW1vdmVLZXkgKE9iamVjdCBrZXkpIHsKLQkJCi0JCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0KGtleSk7CisKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeSA9IChMUlVDYWNoZUVudHJ5KSB0aGlzLmVudHJ5VGFibGUuZ2V0KGtleSk7CiAJCWlmIChlbnRyeSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5fZlZhbHVlOwotCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIGZhbHNlKTsKKwkJT2JqZWN0IHZhbHVlID0gZW50cnkudmFsdWU7CisJCXByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIGZhbHNlKTsKIAkJcmV0dXJuIHZhbHVlOwogCX0KIAkvKioKQEAgLTQzNSwxNiArNjEzLDE2IEBACiAJICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiB1bml0cyBvZiBjYWNoZSBzcGFjZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFNwYWNlTGltaXQoaW50IGxpbWl0KSB7Ci0JCWlmIChsaW1pdCA8IGZTcGFjZUxpbWl0KSB7Ci0JCQltYWtlU3BhY2UoZlNwYWNlTGltaXQgLSBsaW1pdCk7CisJCWlmIChsaW1pdCA8IHRoaXMuc3BhY2VMaW1pdCkgeworCQkJbWFrZVNwYWNlKHRoaXMuc3BhY2VMaW1pdCAtIGxpbWl0KTsKIAkJfQotCQlmU3BhY2VMaW1pdCA9IGxpbWl0OworCQl0aGlzLnNwYWNlTGltaXQgPSBsaW1pdDsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgc3BhY2UgdGFrZW4gYnkgdGhlIGdpdmVuIHZhbHVlLgogCSAqLwogCXByb3RlY3RlZCBpbnQgc3BhY2VGb3IgKE9iamVjdCB2YWx1ZSkgewotCQkKKwogCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJTFJVQ2FjaGVhYmxlKSB7CiAJCQlyZXR1cm4gKChJTFJVQ2FjaGVhYmxlKSB2YWx1ZSkuZ2V0Q2FjaGVGb290cHJpbnQoKTsKIAkJfSBlbHNlIHsKQEAgLTQ1NiwyNSArNjM0LDI1IEBACiAJICogaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAKKwkJcmV0dXJuCiAJCQl0b1N0cmluZ0ZpbGxpbmdSYXRpb24oIkxSVUNhY2hlIikgKyAvLyROT04tTkxTLTEkCiAJCQl0b1N0cmluZ0NvbnRlbnRzKCk7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0LiAgVGhpcyBtZXRob2QKIAkgKiBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCiAJICovCiAJcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0NvbnRlbnRzKCkgewogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuZ3RoID0gZkVudHJ5VGFibGUuc2l6ZSgpOworCQlpbnQgbGVuZ3RoID0gdGhpcy5lbnRyeVRhYmxlLnNpemUoKTsKIAkJT2JqZWN0W10gdW5zb3J0ZWRLZXlzID0gbmV3IE9iamVjdFtsZW5ndGhdOwogCQlTdHJpbmdbXSB1bnNvcnRlZFRvU3RyaW5ncyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkJRW51bWVyYXRpb24gZSA9IHRoaXMua2V5cygpOworCQlFbnVtZXJhdGlvbiBlID0ga2V5cygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlPYmplY3Qga2V5ID0gZS5uZXh0RWxlbWVudCgpOwogCQkJdW5zb3J0ZWRLZXlzW2ldID0ga2V5OwotCQkJdW5zb3J0ZWRUb1N0cmluZ3NbaV0gPSAKKwkJCXVuc29ydGVkVG9TdHJpbmdzW2ldID0KIAkJCQkoa2V5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQpID8KIAkJCQkJKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudClrZXkpLmdldEVsZW1lbnROYW1lKCkgOgogCQkJCQlrZXkudG9TdHJpbmcoKTsKQEAgLTQ4MywxNSArNjYxLDE1IEBACiAJCXNvcnRlci5zb3J0KHVuc29ydGVkS2V5cywgdW5zb3J0ZWRUb1N0cmluZ3MpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlTdHJpbmcgdG9TdHJpbmcgPSBzb3J0ZXIuc29ydGVkU3RyaW5nc1tpXTsKLQkJCU9iamVjdCB2YWx1ZSA9IHRoaXMuZ2V0KHNvcnRlci5zb3J0ZWRPYmplY3RzW2ldKTsKLQkJCXJlc3VsdC5hcHBlbmQodG9TdHJpbmcpOwkJCisJCQlPYmplY3QgdmFsdWUgPSBnZXQoc29ydGVyLnNvcnRlZE9iamVjdHNbaV0pOworCQkJcmVzdWx0LmFwcGVuZCh0b1N0cmluZyk7CiAJCQlyZXN1bHQuYXBwZW5kKCIgLT4gIik7IC8vJE5PTi1OTFMtMSQKIAkJCXJlc3VsdC5hcHBlbmQodmFsdWUpOwogCQkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRmlsbGluZ1JhdGlvbihTdHJpbmcgY2FjaGVOYW1lKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNhY2hlTmFtZSk7CiAJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKQEAgLTUwMywxNSArNjgxLDE1IEBACiAJfQogCiAJLyoqCi0JICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzIAorCSAqIFVwZGF0ZXMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGdpdmVuIGVudHJ5LCBlbnN1cmluZyB0aGF0IHRoZSBxdWV1ZSBpcwogCSAqIGtlcHQgaW4gY29ycmVjdCBvcmRlci4gIFRoZSBlbnRyeSBtdXN0IGV4aXN0CiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGltZXN0YW1wIChMUlVDYWNoZUVudHJ5IGVudHJ5KSB7Ci0JCQotCQllbnRyeS5fZlRpbWVzdGFtcCA9IGZUaW1lc3RhbXBDb3VudGVyKys7Ci0JCWlmIChmRW50cnlRdWV1ZSAhPSBlbnRyeSkgewotCQkJdGhpcy5wcml2YXRlUmVtb3ZlRW50cnkgKGVudHJ5LCB0cnVlKTsKLQkJCXRoaXMucHJpdmF0ZUFkZEVudHJ5IChlbnRyeSwgdHJ1ZSk7CisKKwkJZW50cnkudGltZXN0YW1wID0gdGhpcy50aW1lc3RhbXBDb3VudGVyKys7CisJCWlmICh0aGlzLmVudHJ5UXVldWUgIT0gZW50cnkpIHsKKwkJCXByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIHRydWUpOworCQkJcHJpdmF0ZUFkZEVudHJ5IChlbnRyeSwgdHJ1ZSk7CiAJCX0KIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKaW5kZXggM2Y1YzI5Ni4uZTQ3Mjg3NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsNyArMjQsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gTk9fRU5UUklFUyA9IG5ldyBpbnRbMF1bMF07CiAJcHJpdmF0ZSBpbnQgbGluZU51bWJlclRhYmxlTGVuZ3RoOwogCXByaXZhdGUgaW50W11bXSBsaW5lTnVtYmVyVGFibGU7Ci0JCisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgTGluZU51bWJlckF0dHJpYnV0ZS4KIAkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMKQEAgLTM4LDcgKzM4LDcgQEAKIAkJaW50IG9mZnNldCkKIAkJdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKIAkJc3VwZXIoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0KTsKLQkJCisKIAkJZmluYWwgaW50IGxlbmd0aCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CiAJCXRoaXMubGluZU51bWJlclRhYmxlTGVuZ3RoID0gbGVuZ3RoOwogCQlpZiAobGVuZ3RoICE9IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKaW5kZXggNjBjODJjNi4uZDFiYmRiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIE5PX0VOVFJJRVMgPSBuZXcgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5WzBdOwogCXByaXZhdGUgaW50IGxvY2FsVmFyaWFibGVUYWJsZUxlbmd0aDsKIAlwcml2YXRlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUYWJsZTsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbFZhcmlhYmxlQXR0cmlidXRlLgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCmluZGV4IDRkYzExYWQuLmY4MzQ2NTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsMTAgKzI4LDEwIEBACiAJcHJpdmF0ZSBjaGFyW10gbmFtZTsKIAlwcml2YXRlIGNoYXJbXSBkZXNjcmlwdG9yOwogCXByaXZhdGUgaW50IGluZGV4OwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIExvY2FsVmFyaWFibGVUYWJsZUVudHJ5LgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCiAJICogQHBhcmFtIGNvbnN0YW50UG9vbAogCSAqIEBwYXJhbSBvZmZzZXQKQEAgLTU3LDcgKzU3LDcgQEAKIAkJCX0KIAkJCXRoaXMuZGVzY3JpcHRvciA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOwogCQl9Ci0JCQorCiAJLyoqCiAJICogQHNlZSBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkjZ2V0U3RhcnRQQygpCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUeXBlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUeXBlQXR0cmlidXRlLmphdmEKaW5kZXggY2ZkMTE3My4uYWEyMzViNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVHlwZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVR5cGVBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeVtdIE5PX0VOVFJJRVMgPSBuZXcgSUxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeVswXTsKIAlwcml2YXRlIGludCBsb2NhbFZhcmlhYmxlVHlwZVRhYmxlTGVuZ3RoOwogCXByaXZhdGUgSUxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyaWVzOwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIExvY2FsVmFyaWFibGVUeXBlQXR0cmlidXRlLgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVHlwZVRhYmxlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUVudHJ5LmphdmEKaW5kZXggYTNiYmFiZC4uMjg0NmVmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVHlwZVRhYmxlRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDEwICsyOCwxMCBAQAogCXByaXZhdGUgY2hhcltdIG5hbWU7CiAJcHJpdmF0ZSBjaGFyW10gc2lnbmF0dXJlOwogCXByaXZhdGUgaW50IGluZGV4OwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIExvY2FsVmFyaWFibGVUeXBlVGFibGVFbnRyeS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwogCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKIAkgKiBAcGFyYW0gb2Zmc2V0CkBAIC01Nyw3ICs1Nyw3IEBACiAJCQl9CiAJCQl0aGlzLnNpZ25hdHVyZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOwogCQl9Ci0JCQorCiAJLyoqCiAJICogQHNlZSBJTG9jYWxWYXJpYWJsZVR5cGVUYWJsZUVudHJ5I2dldFN0YXJ0UEMoKQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZW1lbnRvVG9rZW5pemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01lbWVudG9Ub2tlbml6ZXIuamF2YQppbmRleCBlM2QwMDk1Li44NmY5NmYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01lbWVudG9Ub2tlbml6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01lbWVudG9Ub2tlbml6ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMywzNCArMTMsMzUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKIAogcHVibGljIGNsYXNzIE1lbWVudG9Ub2tlbml6ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fQ09VTlQpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBUFJPSkVDVCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fSkFWQVBST0pFQ1QpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFRlJBR01FTlRST09UID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9QQUNLQUdFRlJBR01FTlRST09UKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRUZSQUdNRU5UID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9QQUNLQUdFRlJBR01FTlQpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fRklFTEQpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0QgPSBDaGFyYWN0ZXIudG9TdHJpbmcoSmF2YUVsZW1lbnQuSkVNX01FVEhPRCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxJWkVSID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9JTklUSUFMSVpFUik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEFUSU9OVU5JVCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fQ09NUElMQVRJT05VTklUKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NGSUxFID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9DTEFTU0ZJTEUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURFQ0xBUkFUSU9OID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9QQUNLQUdFREVDTEFSQVRJT04pOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRERUNMQVJBVElPTiA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fSU1QT1JUREVDTEFSQVRJT04pOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTFZBUklBQkxFID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9MT0NBTFZBUklBQkxFKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QQVJBTUVURVIgPSBDaGFyYWN0ZXIudG9TdHJpbmcoSmF2YUVsZW1lbnQuSkVNX1RZUEVfUEFSQU1FVEVSKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fQ09VTlQpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFQUk9KRUNUID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9KQVZBUFJPSkVDVCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRUZSQUdNRU5UUk9PVCA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fUEFDS0FHRUZSQUdNRU5UUk9PVCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRUZSQUdNRU5UID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9QQUNLQUdFRlJBR01FTlQpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9GSUVMRCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9NRVRIT0QpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxJWkVSID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9JTklUSUFMSVpFUik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMQVRJT05VTklUID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9DT01QSUxBVElPTlVOSVQpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTRklMRSA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fQ0xBU1NGSUxFKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9UWVBFKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFREVDTEFSQVRJT04gPSBDaGFyYWN0ZXIudG9TdHJpbmcoSmF2YUVsZW1lbnQuSkVNX1BBQ0tBR0VERUNMQVJBVElPTik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUREVDTEFSQVRJT04gPSBDaGFyYWN0ZXIudG9TdHJpbmcoSmF2YUVsZW1lbnQuSkVNX0lNUE9SVERFQ0xBUkFUSU9OKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTFZBUklBQkxFID0gQ2hhcmFjdGVyLnRvU3RyaW5nKEphdmFFbGVtZW50LkpFTV9MT0NBTFZBUklBQkxFKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BBUkFNRVRFUiA9IENoYXJhY3Rlci50b1N0cmluZyhKYXZhRWxlbWVudC5KRU1fVFlQRV9QQVJBTUVURVIpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT04gPSBDaGFyYWN0ZXIudG9TdHJpbmcoSmF2YUVsZW1lbnQuSkVNX0FOTk9UQVRJT04pOwogCiAJcHJpdmF0ZSBmaW5hbCBjaGFyW10gbWVtZW50bzsKIAlwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7CiAJcHJpdmF0ZSBpbnQgaW5kZXggPSAwOwotCQorCiAJcHVibGljIE1lbWVudG9Ub2tlbml6ZXIoU3RyaW5nIG1lbWVudG8pIHsKIAkJdGhpcy5tZW1lbnRvID0gbWVtZW50by50b0NoYXJBcnJheSgpOwogCQl0aGlzLmxlbmd0aCA9IHRoaXMubWVtZW50by5sZW5ndGg7CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKIAkJcmV0dXJuIHRoaXMuaW5kZXggPCB0aGlzLmxlbmd0aDsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIG5leHRUb2tlbigpIHsKIAkJaW50IHN0YXJ0ID0gdGhpcy5pbmRleDsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7CkBAIC03OCw2ICs3OSw4IEBACiAJCQkJcmV0dXJuIExPQ0FMVkFSSUFCTEU7CiAJCQljYXNlIEphdmFFbGVtZW50LkpFTV9UWVBFX1BBUkFNRVRFUjoKIAkJCQlyZXR1cm4gVFlQRV9QQVJBTUVURVI7CisJCQljYXNlIEphdmFFbGVtZW50LkpFTV9BTk5PVEFUSU9OOgorCQkJCXJldHVybiBBTk5PVEFUSU9OOwogCQl9CiAJCWxvb3A6IHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5sZW5ndGgpIHsKIAkJCXN3aXRjaCAodGhpcy5tZW1lbnRvW3RoaXMuaW5kZXhdKSB7CkBAIC0xMDAsNiArMTAzLDcgQEAKIAkJCQljYXNlIEphdmFFbGVtZW50LkpFTV9JTVBPUlRERUNMQVJBVElPTjoKIAkJCQljYXNlIEphdmFFbGVtZW50LkpFTV9MT0NBTFZBUklBQkxFOgogCQkJCWNhc2UgSmF2YUVsZW1lbnQuSkVNX1RZUEVfUEFSQU1FVEVSOgorCQkJCWNhc2UgSmF2YUVsZW1lbnQuSkVNX0FOTk9UQVRJT046CiAJCQkJCWJyZWFrIGxvb3A7CiAJCQl9CiAJCQl0aGlzLmluZGV4Kys7CkBAIC0xMTEsNSArMTE1LDUgQEAKIAkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMubWVtZW50bywgc3RhcnQsIHRoaXMuaW5kZXggLSBzdGFydCk7CiAJCX0KIAl9Ci0JCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWVzc2FnZXMuamF2YQppbmRleCBkMmI4OTBlLi43NWVjYmFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01lc3NhZ2VzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZXNzYWdlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM3LDEyICszNywxNCBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRfbnVsbFR5cGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudF9pbGxlZ2FsUGFyZW50OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFtb2RlbF9pbml0aWFsaXphdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhbW9kZWxfaW5pdGlhbGl6aW5nX2RlbHRhX3N0YXRlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFtb2RlbF9idWlsZGluZ19hZnRlcl91cGdyYWRlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFtb2RlbF9jb25maWd1cmluZzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhbW9kZWxfY29uZmlndXJpbmdfY2xhc3NwYXRoX2NvbnRhaW5lcnM7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgamF2YW1vZGVsX2NvbmZpZ3VyaW5nX3NlYXJjaGVuZ2luZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhbW9kZWxfZ2V0dGluZ19idWlsZF9zdGF0ZV9udW1iZXI7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgamF2YW1vZGVsX3JlZnJlc2hpbmdfZXh0ZXJuYWxfamFyczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhbW9kZWxfcmVzZXR0aW5nX3NvdXJjZV9hdHRhY2htZW50X3Byb3BlcnRpZXM7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0aW9uX25lZWRFbGVtZW50czsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVyYXRpb25fbmVlZE5hbWU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0aW9uX25lZWRQYXRoOwpAQCAtNzIsNiArNzQsNyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZXJhdGlvbl9wYXRoT3V0c2lkZVByb2plY3Q7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0aW9uX3NvcnRlbGVtZW50czsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JraW5nQ29weV9jb21taXQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVmZmVyX2Nsb3NlZDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZF9wcmVwYXJpbmdCdWlsZDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZF9yZWFkU3RhdGVQcm9ncmVzczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZF9zYXZlU3RhdGVQcm9ncmVzczsKQEAgLTEwNCw3ICsxMDcsOCBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkX3ByZXJlcVByb2plY3RIYXNDbGFzc3BhdGhQcm9ibGVtczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZF9wcmVyZXFQcm9qZWN0TXVzdEJlUmVidWlsdDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZF9hYm9ydER1ZVRvQ2xhc3NwYXRoUHJvYmxlbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdHVzX2Nhbm5vdF9yZXRyaWV2ZV9hdHRhY2hlZF9qYXZhZG9jOwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0dXNfY2Fubm90X3JldHJpZXZlX2F0dGFjaGVkX2phdmFkb2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdHVzX3RpbWVvdXRfamF2YWRvYzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0dXNfY2Fubm90VXNlRGV2aWNlT25QYXRoOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXR1c19jb3JlRXhjZXB0aW9uOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXR1c19kZWZhdWx0UGFja2FnZVJlYWRPbmx5OwpAQCAtMTQ2LDggKzE1MCwxMSBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9pbGxlZ2FsQ29udGFpbmVyUGF0aDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfaWxsZWdhbEVudHJ5SW5DbGFzc3BhdGhGaWxlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeVBhdGg7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX2lsbGVnYWxMaWJyYXJ5UGF0aEluQ29udGFpbmVyOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeUFyY2hpdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX2FyY2hpdmVSZWFkRXJyb3I7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX2lsbGVnYWxFeHRlcm5hbEZvbGRlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfaWxsZWdhbEV4dGVybmFsRm9sZGVySW5Db250YWluZXI7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX2lsbGVnYWxQcm9qZWN0UGF0aDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfaWxsZWdhbFNvdXJjZUZvbGRlclBhdGg7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX2lsbGVnYWxWYXJpYWJsZVBhdGg7CkBAIC0xNTYsMTAgKzE2MywxNCBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9tdXN0RW5kV2l0aFNsYXNoOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF91bmJvdW5kQ29udGFpbmVyUGF0aDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5ib3VuZExpYnJhcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX3VzZXJMaWJyYXJ5SW5mbzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfY29udGFpbmVySW5mbzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5ib3VuZExpYnJhcnlJbkNvbnRhaW5lcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5ib3VuZFByb2plY3Q7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX3NldHRpbmdPdXRwdXRMb2NhdGlvblByb2dyZXNzOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9zZXR0aW5nUHJvZ3Jlc3M7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VBdHRhY2htZW50OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF91bmJvdW5kU291cmNlQXR0YWNobWVudEluQ29udGFpbmVkTGlicmFyeTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUZvbGRlcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5ib3VuZFZhcmlhYmxlUGF0aDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfdW5rbm93bktpbmQ7CkBAIC0xNjcsNiArMTc4LDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfZGlzYWJsZWRJbmNsdXNpb25FeGNsdXNpb25QYXR0ZXJuczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfZGlzYWJsZWRNdWx0aXBsZU91dHB1dExvY2F0aW9uczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfaW5jb21wYXRpYmxlTGlicmFyeUpES0xldmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aF9pbmNvbXBhdGlibGVMaWJyYXJ5SkRLTGV2ZWxJbkNvbnRhaW5lcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfZHVwbGljYXRlRW50cnlFeHRyYUF0dHJpYnV0ZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhfZGVwcmVjYXRlZF92YXJpYWJsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlX25vdEZvdW5kOwpAQCAtMTc1LDE0ICsxODcsOCBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhfbXVzdEJlQWJzb2x1dGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2FjaGVfaW52YWxpZExvYWRGYWN0b3I7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZWRTdGF0ZV9qb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RyaWN0ZWRBY2Nlc3NfcHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN0cmljdGVkQWNjZXNzX2xpYnJhcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdHJpY3RlZEFjY2Vzc19jb25zdHJ1Y3Rvcl9wcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RyaWN0ZWRBY2Nlc3NfY29uc3RydWN0b3JfbGlicmFyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN0cmljdGVkQWNjZXNzX2ZpZWxkX3Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdHJpY3RlZEFjY2Vzc19maWVsZF9saWJyYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RyaWN0ZWRBY2Nlc3NfbWV0aG9kX3Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdHJpY3RlZEFjY2Vzc19tZXRob2RfbGlicmFyeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoaW5nX2V4dGVybmFsX2ZvbGRlcnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRpbmdfZXh0ZXJuYWxfYXJjaGl2ZXNfam9iTmFtZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZW50aW9uX3VuaXRfbnVsbE5hbWU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVudGlvbl91bml0X25vdEphdmFOYW1lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlbnRpb25fY2xhc3NGaWxlX251bGxOYW1lOwpAQCAtMjIyLDEzICsyMjgsMTQgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRSZXdyaXRlX3Byb2Nlc3NEZXNjcmlwdGlvbjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3JyZWN0aW9uX251bGxSZXF1ZXN0b3I7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY29ycmVjdGlvbl9udWxsVW5pdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfY29tcGxldGluZzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfc2VhcmNoaW5nOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZ2luZV9zZWFyY2hpbmdfaW5kZXhpbmc7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fd3JvbmdGb3JtYXQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hbmFnZXJfZmlsZXNUb0luZGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hbmFnZXJfaW5kZXhpbmdJblByb2dyZXNzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYm1hbmFnZXJfZmlsZXNUb0luZGV4OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYm1hbmFnZXJfaW5kZXhpbmc7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzYXNzZW1ibGVyX2Rlc2NyaXB0aW9uOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9vcGVudHlwZWRlY2xhcmF0aW9uOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9jbG9zZXR5cGVkZWNsYXJhdGlvbjsKQEAgLTMxMiw2ICszMTksNyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzZm9ybWF0X2ludm9rZWludGVyZmFjZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc2Zvcm1hdF9pbnZva2VzdGF0aWM7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3Nmb3JtYXRfaW52b2tldmlydHVhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc2Zvcm1hdF9pbnZva2VkeW5hbWljOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzZm9ybWF0X2dldGZpZWxkOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzZm9ybWF0X2dldHN0YXRpYzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc2Zvcm1hdF9wdXRzdGF0aWM7CkBAIC0zMzEsNyArMzM5LDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc2ZpbGVmb3JtYXRfbGluZW51bWJlcnRhYmxlZW50cnk7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NmaWxlZm9ybWF0X2xvY2FsdmFyaWFibGV0YWJsZWVudHJ5OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzZmlsZWZvcm1hdF92ZXJzaW9uVW5rbm93bjsKLQkKKwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9mcmFtZV9zYW1lX2xvY2Fsc18xX3N0YWNrX2l0ZW1fZXh0ZW5kZWQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzYXNzZW1ibGVyX2ZyYW1lX2Nob3A7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzYXNzZW1ibGVyX2ZyYW1lX3NhbWVfZnJhbWVfZXh0ZW5kZWQ7CkBAIC0zMzksMjQgKzM0NywyNSBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9mcmFtZV9mdWxsX2ZyYW1lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9mcmFtZV9zYW1lX2ZyYW1lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2Fzc2VtYmxlcl9mcmFtZV9zYW1lX2xvY2Fsc18xX3N0YWNrX2l0ZW07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29kZV9hc3Npc3RfaW50ZXJuYWxfZXJyb3I7CiAKIAlzdGF0aWMgewogCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7CiAJfQotCQorCiAJLyoqCiAJICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCiAJICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSkgewogCQlyZXR1cm4gYmluZChtZXNzYWdlLCBudWxsKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAorCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKIAkgKiBAcGFyYW0gYmluZGluZyB0aGUgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKIAkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKQEAgLTM2Nyw3ICszNzYsNyBAQAogCiAJLyoqCiAJICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCiAJICogQHBhcmFtIGJpbmRpbmcxIEFuIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCiAJICogQHBhcmFtIGJpbmRpbmcyIEEgc2Vjb25kIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCkBAIC0zNzksNyArMzg4LDcgQEAKIAogCS8qKgogCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAogCSAqIEBwYXJhbSBiaW5kaW5ncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKIAkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZXRob2RJbmZvLmphdmEKaW5kZXggYjg3NGZiZi4uYzBkM2FhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZXRob2RJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZXRob2RJbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzgsNyArMzgsNyBAQAogCXByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYzsKIAlwcml2YXRlIGNoYXJbXSBuYW1lOwogCXByaXZhdGUgaW50IG5hbWVJbmRleDsKLQkKKwogCS8qKgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyBieXRlW10KIAkgKiBAcGFyYW0gY29uc3RhbnRQb29sIElDb25zdGFudFBvb2wKQEAgLTQ3LDI4ICs0NywyOCBAQAogCSAqLwogCXB1YmxpYyBNZXRob2RJbmZvKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQsIGludCBkZWNvZGluZ0ZsYWdzKQogCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewotCQkJCisKIAkJYm9vbGVhbiBub19jb2RlX2F0dHJpYnV0ZSA9IChkZWNvZGluZ0ZsYWdzICYgSUNsYXNzRmlsZVJlYWRlci5NRVRIT0RfQk9ESUVTKSA9PSAwOwogCQlmaW5hbCBpbnQgZmxhZ3MgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOwogCQl0aGlzLmFjY2Vzc0ZsYWdzID0gZmxhZ3M7CiAJCWlmICgoZmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NZTlRIRVRJQykgIT0gMCkgewogCQkJdGhpcy5pc1N5bnRoZXRpYyA9IHRydWU7CiAJCX0KLQkJCisKIAkJdGhpcy5uYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAyLCBvZmZzZXQpOwogCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5uYW1lSW5kZXgpOwogCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CiAJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKIAkJfQogCQl0aGlzLm5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKLQkJCisKIAkJdGhpcy5kZXNjcmlwdG9ySW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA0LCBvZmZzZXQpOwogCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLmRlc2NyaXB0b3JJbmRleCk7CiAJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjgpIHsKIAkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOwogCQl9CiAJCXRoaXMuZGVzY3JpcHRvciA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOwotCQkKKwogCQl0aGlzLmF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CiAJCXRoaXMuYXR0cmlidXRlcyA9IENsYXNzRmlsZUF0dHJpYnV0ZS5OT19BVFRSSUJVVEVTOwogCQlpZiAodGhpcy5hdHRyaWJ1dGVzQ291bnQgIT0gMCkgewpAQCAtMjA3LDcgKzIwNyw3IEBACiAJcHVibGljIGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgewogCQlyZXR1cm4gdGhpcy5pc0RlcHJlY2F0ZWQ7CiAJfQotCQorCiAJcHJpdmF0ZSBib29sZWFuIGlzTmF0aXZlKCkgewogCQlyZXR1cm4gKHRoaXMuYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX05BVElWRSkgIT0gMDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1BhcmFtZXRlckFubm90YXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGFyYW1ldGVyQW5ub3RhdGlvbi5qYXZhCmluZGV4IDNlN2QzMDQuLjQyYTI0Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGFyYW1ldGVyQW5ub3RhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGFyYW1ldGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDE0ICsyMSwxNCBAQAogcHVibGljIGNsYXNzIFBhcmFtZXRlckFubm90YXRpb24gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJUGFyYW1ldGVyQW5ub3RhdGlvbiB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQW5ub3RhdGlvbltdIE5PX0VOVFJJRVMgPSBuZXcgSUFubm90YXRpb25bMF07Ci0JCisKIAlwcml2YXRlIGludCBhbm5vdGF0aW9uc051bWJlcjsKIAlwcml2YXRlIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CiAJcHJpdmF0ZSBpbnQgcmVhZE9mZnNldDsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBBbm5vdGF0aW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCiAJICogQHBhcmFtIGNvbnN0YW50UG9vbAogCSAqIEBwYXJhbSBvZmZzZXQKQEAgLTM4LDE0ICszOCwxNCBAQAogCQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzLAogCQkJSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsCiAJCQlpbnQgb2Zmc2V0KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewotCQkKKwogCQlmaW5hbCBpbnQgbGVuZ3RoID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMCwgb2Zmc2V0KTsKIAkJdGhpcy5yZWFkT2Zmc2V0ID0gMjsKIAkJdGhpcy5hbm5vdGF0aW9uc051bWJlciA9IGxlbmd0aDsKIAkJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCQl0aGlzLmFubm90YXRpb25zID0gbmV3IElBbm5vdGF0aW9uW2xlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgdGhpcy5yZWFkT2Zmc2V0KTsKIAkJCQl0aGlzLmFubm90YXRpb25zW2ldID0gYW5ub3RhdGlvbjsKIAkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gYW5ub3RhdGlvbi5zaXplSW5CeXRlcygpOwogCQkJfQpAQCAtNTMsNyArNTMsNyBAQAogCQkJdGhpcy5hbm5vdGF0aW9ucyA9IE5PX0VOVFJJRVM7CiAJCX0KIAl9Ci0JCisKIAlpbnQgc2l6ZUluQnl0ZXMoKSB7CiAJCXJldHVybiB0aGlzLnJlYWRPZmZzZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9QdWJsaWNTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQppbmRleCBkYjU4N2UyLi5kYjJlYWRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCwzMSArMTgsMzIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuTkxTVGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBQdWJsaWNTY2FubmVyIGltcGxlbWVudHMgSVNjYW5uZXIsIElUZXJtaW5hbFN5bWJvbHMgewotCQorCiAJLy9wdWJsaWMgaW50IG5ld0lkZW50Q291bnQgPSAwOwotCQorCiAJLyogQVBJcyBhcmVzCiAJIC0gZ2V0TmV4dFRva2VuKCkgd2hpY2ggcmV0dXJuIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhlIHRva2VuCiAJICAgKHRoaXMgdmFsdWUgaXMgbm90IG1lbW9yaXplZCBieSB0aGUgc2Nhbm5lcikKIAkgLSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSB3aGljaCBwcm92aWRlcyB3aXRoIHRoZSB0b2tlbiAiUkVBTCIgc291cmNlCiAJICAgKGFrYSBhbGwgdW5pY29kZSBoYXZlIGJlZW4gdHJhbnNmb3JtZWQgaW50byBhIGNvcnJlY3QgY2hhcikKIAkgLSBzb3VyY2VTdGFydCBnaXZlcyB0aGUgcG9zaXRpb24gaW50byB0aGUgc3RyZWFtCi0JIC0gY3VycmVudFBvc2l0aW9uLTEgZ2l2ZXMgdGhlIHNvdXJjZUVuZCBwb3NpdGlvbiBpbnRvIHRoZSBzdHJlYW0gCisJIC0gY3VycmVudFBvc2l0aW9uLTEgZ2l2ZXMgdGhlIHNvdXJjZUVuZCBwb3NpdGlvbiBpbnRvIHRoZSBzdHJlYW0KIAkqLwogCXB1YmxpYyBsb25nIHNvdXJjZUxldmVsOwogCXB1YmxpYyBsb25nIGNvbXBsaWFuY2VMZXZlbDsKIAotCS8vIDEuNCBmZWF0dXJlIAorCS8vIDEuNCBmZWF0dXJlCiAJcHVibGljIGJvb2xlYW4gdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7Ci0JLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydCAKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsgCi0JCisJLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydAorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IGZhbHNlOworCiAJLy8gMS41IGZlYXR1cmUKIAlwdWJsaWMgYm9vbGVhbiB1c2VFbnVtQXNBbkluZGVudGlmaWVyID0gZmFsc2U7Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CiAJcHVibGljIGNoYXIgY3VycmVudENoYXJhY3RlcjsKIAlwdWJsaWMgaW50IHN0YXJ0UG9zaXRpb247CkBAIC01MCw2ICs1MSw3IEBACiAJcHVibGljIGludCBpbml0aWFsUG9zaXRpb24sIGVvZlBvc2l0aW9uOwogCS8vIGFmdGVyIHRoaXMgcG9zaXRpb24gZW9mIGFyZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWFsIHRva2VuIGZyb20gdGhlIHNvdXJjZQogCisJcHVibGljIGJvb2xlYW4gc2tpcENvbW1lbnRzID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gdG9rZW5pemVDb21tZW50cyA9IGZhbHNlOwogCXB1YmxpYyBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSA9IGZhbHNlOwogCkBAIC03MSw3ICs3Myw3IEBACiAJcHVibGljIGludFtdIGNvbW1lbnRUYWdTdGFydHMgPSBuZXcgaW50W0NPTU1FTlRfQVJSQVlTX1NJWkVdOwogCXB1YmxpYyBpbnQgY29tbWVudFB0ciA9IC0xOyAvLyBubyBjb21tZW50IHRlc3Qgd2l0aCBjb21tZW50UHRyIHZhbHVlIC0xCiAJcHJvdGVjdGVkIGludCBsYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IC0xOwotCQorCiAJLy8gdGFzayB0YWcgc3VwcG9ydAogCXB1YmxpYyBjaGFyW11bXSBmb3VuZFRhc2tUYWdzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gZm91bmRUYXNrTWVzc2FnZXM7CkBAIC04MSw3ICs4Myw3IEBACiAJcHVibGljIGNoYXJbXVtdIHRhc2tUYWdzID0gbnVsbDsKIAlwdWJsaWMgY2hhcltdW10gdGFza1ByaW9yaXRpZXMgPSBudWxsOwogCXB1YmxpYyBib29sZWFuIGlzVGFza0Nhc2VTZW5zaXRpdmUgPSB0cnVlOwotCQorCiAJLy9kaWV0IHBhcnNpbmcgc3VwcG9ydCAtIGp1bXAgb3ZlciBzb21lIG1ldGhvZCBib2R5IHdoZW4gcmVxdWVzdGVkCiAJcHVibGljIGJvb2xlYW4gZGlldCA9IGZhbHNlOwogCkBAIC0xMTAsNDEgKzExMiw0NyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfRElHSVQgPSAiSW52YWxpZF9EaWdpdCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9MSU5FX0VORFMgPSBVdGlsLkVNUFRZX0lOVF9BUlJBWTsKIAotCS8vLS0tLS0tLS0tLS0tLS0tLW9wdGltaXplZCBpZGVudGlmaWVyIG1hbmFnbWVudC0tLS0tLS0tLS0tLS0tLS0tLQotCXN0YXRpYyBmaW5hbCBjaGFyW10gY2hhckFycmF5X2EgPSBuZXcgY2hhcltdIHsnYSd9LCAKLQkJY2hhckFycmF5X2IgPSBuZXcgY2hhcltdIHsnYid9LCAKLQkJY2hhckFycmF5X2MgPSBuZXcgY2hhcltdIHsnYyd9LCAKLQkJY2hhckFycmF5X2QgPSBuZXcgY2hhcltdIHsnZCd9LCAKLQkJY2hhckFycmF5X2UgPSBuZXcgY2hhcltdIHsnZSd9LCAKLQkJY2hhckFycmF5X2YgPSBuZXcgY2hhcltdIHsnZid9LCAKLQkJY2hhckFycmF5X2cgPSBuZXcgY2hhcltdIHsnZyd9LCAKLQkJY2hhckFycmF5X2ggPSBuZXcgY2hhcltdIHsnaCd9LCAKLQkJY2hhckFycmF5X2kgPSBuZXcgY2hhcltdIHsnaSd9LCAKLQkJY2hhckFycmF5X2ogPSBuZXcgY2hhcltdIHsnaid9LCAKLQkJY2hhckFycmF5X2sgPSBuZXcgY2hhcltdIHsnayd9LCAKLQkJY2hhckFycmF5X2wgPSBuZXcgY2hhcltdIHsnbCd9LCAKLQkJY2hhckFycmF5X20gPSBuZXcgY2hhcltdIHsnbSd9LCAKLQkJY2hhckFycmF5X24gPSBuZXcgY2hhcltdIHsnbid9LCAKLQkJY2hhckFycmF5X28gPSBuZXcgY2hhcltdIHsnbyd9LCAKLQkJY2hhckFycmF5X3AgPSBuZXcgY2hhcltdIHsncCd9LCAKLQkJY2hhckFycmF5X3EgPSBuZXcgY2hhcltdIHsncSd9LCAKLQkJY2hhckFycmF5X3IgPSBuZXcgY2hhcltdIHsncid9LCAKLQkJY2hhckFycmF5X3MgPSBuZXcgY2hhcltdIHsncyd9LCAKLQkJY2hhckFycmF5X3QgPSBuZXcgY2hhcltdIHsndCd9LCAKLQkJY2hhckFycmF5X3UgPSBuZXcgY2hhcltdIHsndSd9LCAKLQkJY2hhckFycmF5X3YgPSBuZXcgY2hhcltdIHsndid9LCAKLQkJY2hhckFycmF5X3cgPSBuZXcgY2hhcltdIHsndyd9LCAKLQkJY2hhckFycmF5X3ggPSBuZXcgY2hhcltdIHsneCd9LCAKLQkJY2hhckFycmF5X3kgPSBuZXcgY2hhcltdIHsneSd9LCAKLQkJY2hhckFycmF5X3ogPSBuZXcgY2hhcltdIHsneid9OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0JJTkFSWSA9ICJJbnZhbGlkX0JpbmFyeV9MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9MSVRFUkFMX05PVF9CRUxPV18xNyA9ICJCaW5hcnlfTGl0ZXJhbF9Ob3RfQmVsb3dfMTciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUxMRUdBTF9IRVhBX0xJVEVSQUwgPSAiSWxsZWdhbF9IZXhhX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9VTkRFUlNDT1JFID0gIkludmFsaWRfVW5kZXJzY29yZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUlNDT1JFU19JTl9MSVRFUkFMU19OT1RfQkVMT1dfMTcgPSAiVW5kZXJzY29yZXNfSW5fTGl0ZXJhbHNfTm90X0JlbG93XzE3IjsgLy8kTk9OLU5MUy0xJGAKIAotCXN0YXRpYyBmaW5hbCBjaGFyW10gaW5pdENoYXJBcnJheSA9IAotCQluZXcgY2hhcltdIHsnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnfTsgCisJLy8tLS0tLS0tLS0tLS0tLS0tb3B0aW1pemVkIGlkZW50aWZpZXIgbWFuYWdtZW50LS0tLS0tLS0tLS0tLS0tLS0tCisJc3RhdGljIGZpbmFsIGNoYXJbXSBjaGFyQXJyYXlfYSA9IG5ldyBjaGFyW10geydhJ30sCisJCWNoYXJBcnJheV9iID0gbmV3IGNoYXJbXSB7J2InfSwKKwkJY2hhckFycmF5X2MgPSBuZXcgY2hhcltdIHsnYyd9LAorCQljaGFyQXJyYXlfZCA9IG5ldyBjaGFyW10geydkJ30sCisJCWNoYXJBcnJheV9lID0gbmV3IGNoYXJbXSB7J2UnfSwKKwkJY2hhckFycmF5X2YgPSBuZXcgY2hhcltdIHsnZid9LAorCQljaGFyQXJyYXlfZyA9IG5ldyBjaGFyW10geydnJ30sCisJCWNoYXJBcnJheV9oID0gbmV3IGNoYXJbXSB7J2gnfSwKKwkJY2hhckFycmF5X2kgPSBuZXcgY2hhcltdIHsnaSd9LAorCQljaGFyQXJyYXlfaiA9IG5ldyBjaGFyW10geydqJ30sCisJCWNoYXJBcnJheV9rID0gbmV3IGNoYXJbXSB7J2snfSwKKwkJY2hhckFycmF5X2wgPSBuZXcgY2hhcltdIHsnbCd9LAorCQljaGFyQXJyYXlfbSA9IG5ldyBjaGFyW10geydtJ30sCisJCWNoYXJBcnJheV9uID0gbmV3IGNoYXJbXSB7J24nfSwKKwkJY2hhckFycmF5X28gPSBuZXcgY2hhcltdIHsnbyd9LAorCQljaGFyQXJyYXlfcCA9IG5ldyBjaGFyW10geydwJ30sCisJCWNoYXJBcnJheV9xID0gbmV3IGNoYXJbXSB7J3EnfSwKKwkJY2hhckFycmF5X3IgPSBuZXcgY2hhcltdIHsncid9LAorCQljaGFyQXJyYXlfcyA9IG5ldyBjaGFyW10geydzJ30sCisJCWNoYXJBcnJheV90ID0gbmV3IGNoYXJbXSB7J3QnfSwKKwkJY2hhckFycmF5X3UgPSBuZXcgY2hhcltdIHsndSd9LAorCQljaGFyQXJyYXlfdiA9IG5ldyBjaGFyW10geyd2J30sCisJCWNoYXJBcnJheV93ID0gbmV3IGNoYXJbXSB7J3cnfSwKKwkJY2hhckFycmF5X3ggPSBuZXcgY2hhcltdIHsneCd9LAorCQljaGFyQXJyYXlfeSA9IG5ldyBjaGFyW10geyd5J30sCisJCWNoYXJBcnJheV96ID0gbmV3IGNoYXJbXSB7J3onfTsKKworCXN0YXRpYyBmaW5hbCBjaGFyW10gaW5pdENoYXJBcnJheSA9CisJCW5ldyBjaGFyW10geydcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCd9OwogCXN0YXRpYyBmaW5hbCBpbnQgVGFibGVTaXplID0gMzAsIEludGVybmFsVGFibGVTaXplID0gNjsgLy8zMCo2ID0yMTAgZW50cmllcwotCQorCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3B0aW1pemVkTGVuZ3RoID0gNzsKLQlwdWJsaWMgLypzdGF0aWMqLyBmaW5hbCBjaGFyW11bXVtdW10gY2hhckFycmF5X2xlbmd0aCA9IAotCQluZXcgY2hhcltPcHRpbWl6ZWRMZW5ndGhdW1RhYmxlU2l6ZV1bSW50ZXJuYWxUYWJsZVNpemVdW107IAorCXB1YmxpYyAvKnN0YXRpYyovIGZpbmFsIGNoYXJbXVtdW11bXSBjaGFyQXJyYXlfbGVuZ3RoID0KKwkJbmV3IGNoYXJbT3B0aW1pemVkTGVuZ3RoXVtUYWJsZVNpemVdW0ludGVybmFsVGFibGVTaXplXVtdOwogCS8vIHN1cHBvcnQgZm9yIGRldGVjdGluZyBub24tZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFscwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFRBR19QUkVGSVg9ICIvLyROT04tTkxTLSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19QUkVGSVhfTEVOR1RIPSBUQUdfUFJFRklYLmxlbmd0aDsKQEAgLTE1MywxMCArMTYxLDEyIEBACiAJcHJpdmF0ZSBOTFNUYWdbXSBubHNUYWdzID0gbnVsbDsKIAlwcm90ZWN0ZWQgaW50IG5sc1RhZ3NQdHI7CiAJcHVibGljIGJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsczsKLQkKKworCXByb3RlY3RlZCBpbnQgbGFzdFBvc2l0aW9uOworCiAJLy8gZ2VuZXJpYyBzdXBwb3J0CiAJcHVibGljIGJvb2xlYW4gcmV0dXJuT25seUdyZWF0ZXIgPSBmYWxzZTsKLQkKKwogCS8qc3RhdGljKi8gewogCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBUYWJsZVNpemU7IGorKykgewpAQCAtMTY2LDE4ICsxNzYsMTggQEAKIAkJCX0KIAkJfQogCX0KLQkvKnN0YXRpYyovIGludCBuZXdFbnRyeTIgPSAwLCAKLQkJbmV3RW50cnkzID0gMCwgCi0JCW5ld0VudHJ5NCA9IDAsIAotCQluZXdFbnRyeTUgPSAwLCAKKwkvKnN0YXRpYyovIGludCBuZXdFbnRyeTIgPSAwLAorCQluZXdFbnRyeTMgPSAwLAorCQluZXdFbnRyeTQgPSAwLAorCQluZXdFbnRyeTUgPSAwLAogCQluZXdFbnRyeTYgPSAwOwogCXB1YmxpYyBib29sZWFuIGluc2lkZVJlY292ZXJ5ID0gZmFsc2U7CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3VuZEJyYWNrZXQgPSAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNxdWFyZUJyYWNrZXQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN1cmx5QnJhY2tldCA9IDI7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN1cmx5QnJhY2tldCA9IDI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQnJhY2tldEtpbmRzID0gMzsKLQkKKwogCS8vIGV4dGVuZGVkIHVuaWNvZGUgc3VwcG9ydAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV19TVVJST0dBVEVfTUlOX1ZBTFVFID0gMHhEQzAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJR0hfU1VSUk9HQVRFX01JTl9WQUxVRSA9IDB4RDgwMDsKQEAgLTE4OSw5ICsxOTksOSBAQAogfQogCiBwdWJsaWMgUHVibGljU2Nhbm5lcigKLQkJYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCAKLQkJYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIAotCQlib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIAorCQlib29sZWFuIHRva2VuaXplQ29tbWVudHMsCisJCWJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlLAorCQlib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsCiAJCWxvbmcgc291cmNlTGV2ZWwsCiAJCWxvbmcgY29tcGxpYW5jZUxldmVsLAogCQljaGFyW11bXSB0YXNrVGFncywKQEAgLTIwNCwxNSArMjE0LDQxIEBACiAJdGhpcy5zb3VyY2VMZXZlbCA9IHNvdXJjZUxldmVsOwogCXRoaXMuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZUxldmVsOwogCXRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyA9IGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHM7Ci0JdGhpcy50YXNrVGFncyA9IHRhc2tUYWdzOwotCXRoaXMudGFza1ByaW9yaXRpZXMgPSB0YXNrUHJpb3JpdGllczsKLQl0aGlzLmlzVGFza0Nhc2VTZW5zaXRpdmUgPSBpc1Rhc2tDYXNlU2Vuc2l0aXZlOworCWlmICh0YXNrVGFncyAhPSBudWxsKSB7CisJCWludCB0YXNrVGFnc0xlbmd0aCA9IHRhc2tUYWdzLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IHRhc2tUYWdzTGVuZ3RoOworCQlpZiAodGFza1ByaW9yaXRpZXMgIT0gbnVsbCkgeworCQkJaW50IHRhc2tQcmlvcml0aWVzTGVuZ3RoID0gdGFza1ByaW9yaXRpZXMubGVuZ3RoOworCQkJaWYgKHRhc2tQcmlvcml0aWVzTGVuZ3RoICE9IHRhc2tUYWdzTGVuZ3RoKSB7CisJCQkJaWYgKHRhc2tQcmlvcml0aWVzTGVuZ3RoID4gdGFza1RhZ3NMZW5ndGgpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0YXNrUHJpb3JpdGllcywgMCwgKHRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGFza1RhZ3NMZW5ndGhdW10pLCAwLCB0YXNrVGFnc0xlbmd0aCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0YXNrVGFncywgMCwgKHRhc2tUYWdzID0gbmV3IGNoYXJbdGFza1ByaW9yaXRpZXNMZW5ndGhdW10pLCAwLCB0YXNrUHJpb3JpdGllc0xlbmd0aCk7CisJCQkJCWxlbmd0aCA9IHRhc2tQcmlvcml0aWVzTGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJCWludFtdIGluaXRpYWxJbmRleGVzID0gbmV3IGludFtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWluaXRpYWxJbmRleGVzW2ldID0gaTsKKwkJCX0KKwkJCVV0aWwucmV2ZXJzZVF1aWNrU29ydCh0YXNrVGFncywgMCwgbGVuZ3RoIC0gMSwgaW5pdGlhbEluZGV4ZXMpOworCQkJY2hhcltdW10gdGVtcCA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQl0ZW1wW2ldID0gdGFza1ByaW9yaXRpZXNbaW5pdGlhbEluZGV4ZXNbaV1dOworCQkJfQorCQkJdGhpcy50YXNrUHJpb3JpdGllcyA9IHRlbXA7CisJCX0gZWxzZSB7CisJCQlVdGlsLnJldmVyc2VRdWlja1NvcnQodGFza1RhZ3MsIDAsIGxlbmd0aCAtIDEpOworCQl9CisJCXRoaXMudGFza1RhZ3MgPSB0YXNrVGFnczsKKwkJdGhpcy5pc1Rhc2tDYXNlU2Vuc2l0aXZlID0gaXNUYXNrQ2FzZVNlbnNpdGl2ZTsKKwl9CiB9CiAKIHB1YmxpYyBQdWJsaWNTY2FubmVyKAotCQlib29sZWFuIHRva2VuaXplQ29tbWVudHMsIAotCQlib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgCi0JCWJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywgCisJCWJvb2xlYW4gdG9rZW5pemVDb21tZW50cywKKwkJYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsCisJCWJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywKIAkJbG9uZyBzb3VyY2VMZXZlbCwKIAkJY2hhcltdW10gdGFza1RhZ3MsCiAJCWNoYXJbXVtdIHRhc2tQcmlvcml0aWVzLApAQCAtMjMwLDcgKzI2Niw3IEBACiB9CiAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGF0RW5kKCkgewotCS8vIFRoaXMgY29kZSBpcyBub3QgcmVsZXZhbnQgaWYgc291cmNlIGlzIAorCS8vIFRoaXMgY29kZSBpcyBub3QgcmVsZXZhbnQgaWYgc291cmNlIGlzCiAJLy8gT25seSBhIHBhcnQgb2YgdGhlIHJlYWwgc3RyZWFtIGlucHV0CiAKIAlyZXR1cm4gdGhpcy5lb2ZQb3NpdGlvbiA8PSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKQEAgLTI0MCw3ICsyNzYsNyBAQAogLy8gVE9ETyAoZnJlZGVyaWMpIHNlZSBpZiB3ZSBuZWVkIHRvIHRha2UgdW5pY29kZSBjaGFyYWN0ZXJzIGludG8gYWNjb3VudC4uLgogcHVibGljIHZvaWQgY2hlY2tUYXNrVGFnKGludCBjb21tZW50U3RhcnQsIGludCBjb21tZW50RW5kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAljaGFyW10gc3JjID0gdGhpcy5zb3VyY2U7Ci0JCisKIAkvLyBvbmx5IGxvb2sgZm9yIG5ld2VyIHRhc2s6IHRhZ3MKIAlpZiAodGhpcy5mb3VuZFRhc2tDb3VudCA+IDAKIAkJJiYgdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnNbdGhpcy5mb3VuZFRhc2tDb3VudCAtIDFdWzBdID49IGNvbW1lbnRTdGFydCkgewpAQCAtMjU4LDI3ICsyOTQsMjkgQEAKIAkJCQl0YWcgPSB0aGlzLnRhc2tUYWdzW2l0YWddOwogCQkJCWludCB0YWdMZW5ndGggPSB0YWcubGVuZ3RoOwogCQkJCWlmICh0YWdMZW5ndGggPT0gMCkgY29udGludWUgbmV4dFRhZzsKLQkKKwogCQkJCS8vIGVuc3VyZSB0YWcgaXMgbm90IGxlYWRlZCB3aXRoIGxldHRlciBpZiB0YWcgc3RhcnRzIHdpdGggYSBsZXR0ZXIKLQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGFnWzBdKSkgewotCQkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChwcmV2aW91cykpIHsKKwkJCQlpZiAoU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIHRhZ1swXSkpIHsKKwkJCQkJaWYgKFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIHByZXZpb3VzKSkgewogCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQkJfQogCQkJCX0KLQkKKwogCQkJCWZvciAoaW50IHQgPSAwOyB0IDwgdGFnTGVuZ3RoOyB0KyspIHsKIAkJCQkJY2hhciBzYywgdGM7CiAJCQkJCWludCB4ID0gaSt0OwogCQkJCQlpZiAoeCA+PSB0aGlzLmVvZlBvc2l0aW9uIHx8IHggPj0gY29tbWVudEVuZCkgY29udGludWUgbmV4dFRhZzsKLQkJCQkJaWYgKChzYyA9IHNyY1tpICsgdF0pICE9ICh0YyA9IHRhZ1t0XSkpIHsgCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZSBzZW5zaXRpdmUgY2hlY2sKLQkJCQkJCWlmICh0aGlzLmlzVGFza0Nhc2VTZW5zaXRpdmUgfHwgKFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2Uoc2MpICE9IFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2UodGMpKSkgeyAJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjaworCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZSBjaGVjaworCQkJCQlpZiAoKHNjID0gc3JjW2kgKyB0XSkgIT0gKHRjID0gdGFnW3RdKSkgeworCQkJCQkJLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjaworCQkJCQkJaWYgKHRoaXMuaXNUYXNrQ2FzZVNlbnNpdGl2ZSB8fCAoU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShzYykgIT0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZSh0YykpKSB7CiAJCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQkvLyBlbnN1cmUgdGFnIGlzIG5vdCBmb2xsb3dlZCB3aXRoIGxldHRlciBpZiB0YWcgZmluaXNoZXMgd2l0aCBhIGxldHRlcgotCQkJCWlmIChpK3RhZ0xlbmd0aCA8IGNvbW1lbnRFbmQgJiYgU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChzcmNbaSt0YWdMZW5ndGgtMV0pKSB7Ci0JCQkJCWlmIChTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHNyY1tpICsgdGFnTGVuZ3RoXSkpCisJCQkJaWYgKGkrdGFnTGVuZ3RoIDwgY29tbWVudEVuZCAmJiBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBzcmNbaSt0YWdMZW5ndGgtMV0pKSB7CisJCQkJCWlmIChTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBzcmNbaSArIHRhZ0xlbmd0aF0pKQogCQkJCQkJY29udGludWUgbmV4dFRhZzsKIAkJCQl9CiAJCQkJaWYgKHRoaXMuZm91bmRUYXNrVGFncyA9PSBudWxsKSB7CkBAIC0yOTIsMTEgKzMzMCwxMSBAQAogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUHJpb3JpdGllcywgMCwgdGhpcy5mb3VuZFRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGhpcy5mb3VuZFRhc2tDb3VudCAqIDJdW10sIDAsIHRoaXMuZm91bmRUYXNrQ291bnQpOwogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUG9zaXRpb25zLCAwLCB0aGlzLmZvdW5kVGFza1Bvc2l0aW9ucyA9IG5ldyBpbnRbdGhpcy5mb3VuZFRhc2tDb3VudCAqIDJdW10sIDAsIHRoaXMuZm91bmRUYXNrQ291bnQpOwogCQkJCX0KLQkJCQkKKwogCQkJCXByaW9yaXR5ID0gdGhpcy50YXNrUHJpb3JpdGllcyAhPSBudWxsICYmIGl0YWcgPCB0aGlzLnRhc2tQcmlvcml0aWVzLmxlbmd0aAogCQkJCQkJCT8gdGhpcy50YXNrUHJpb3JpdGllc1tpdGFnXQogCQkJCQkJCTogbnVsbDsKLQkJCQkKKwogCQkJCXRoaXMuZm91bmRUYXNrVGFnc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IHRhZzsKIAkJCQl0aGlzLmZvdW5kVGFza1ByaW9yaXRpZXNbdGhpcy5mb3VuZFRhc2tDb3VudF0gPSBwcmlvcml0eTsKIAkJCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IG5ldyBpbnRbXSB7IGksIGkgKyB0YWdMZW5ndGggLSAxIH07CkBAIC0zNDQsMTAgKzM4Miw5IEBACiAJCQljb250aW51ZTsKIAkJfQogCQkvLyB0cmltIHRoZSBtZXNzYWdlCisJCS8vIHdlIGRvbid0IHRyaW0gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHNob3cgaXQgYWZ0ZXIgdGhlIHRhc2sgdGFnCiAJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShzcmNbZW5kXSkgJiYgbXNnU3RhcnQgPD0gZW5kKQogCQkJZW5kLS07Ci0JCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShzcmNbbXNnU3RhcnRdKSAmJiBtc2dTdGFydCA8PSBlbmQpCi0JCQltc2dTdGFydCsrOwogCQkvLyB1cGRhdGUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgdGFzawogCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVsxXSA9IGVuZDsKIAkJLy8gZ2V0IHRoZSBtZXNzYWdlIHNvdXJjZQpAQCAtMzczLDM3ICs0MTAsMzUgQEAKIAogcHVibGljIGNoYXJbXSBnZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpIHsKIAkvL3JldHVybiB0aGUgdG9rZW4gUkVBTCBzb3VyY2UgKGFrYSB1bmljb2RlcyBhcmUgcHJlY29tcHV0ZWQpCi0KLQljaGFyW10gcmVzdWx0OwogCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKIAkJLy8wIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgCi0JCQkxLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLCAKLQkJCTAsIAotCQkJdGhpcy53aXRob3V0VW5pY29kZVB0cik7IAotCX0gZWxzZSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbjsKLQkJaWYgKGxlbmd0aCA9PSB0aGlzLmVvZlBvc2l0aW9uKSByZXR1cm4gdGhpcy5zb3VyY2U7Ci0JCXN3aXRjaCAobGVuZ3RoKSB7IC8vIHNlZSBPcHRpbWl6ZWRMZW5ndGgKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTEoKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTIoKTsKLQkJCWNhc2UgMyA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTMoKTsKLQkJCWNhc2UgNCA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTQoKTsKLQkJCWNhc2UgNSA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTUoKTsKLQkJCWNhc2UgNiA6Ci0JCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKTsKLQkJfQotCQkvL25vIG9wdGltaXphdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLnN0YXJ0UG9zaXRpb24sIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLAorCQkJMSwKKwkJCXJlc3VsdCwKKwkJCTAsCisJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JLy9uZXdJZGVudENvdW50Kys7CisJaW50IGxlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uOworCWlmIChsZW5ndGggPT0gdGhpcy5lb2ZQb3NpdGlvbikgcmV0dXJuIHRoaXMuc291cmNlOworCXN3aXRjaCAobGVuZ3RoKSB7IC8vIHNlZSBPcHRpbWl6ZWRMZW5ndGgKKwkJY2FzZSAxIDoKKwkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UxKCk7CisJCWNhc2UgMiA6CisJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMigpOworCQljYXNlIDMgOgorCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTMoKTsKKwkJY2FzZSA0IDoKKwkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U0KCk7CisJCWNhc2UgNSA6CisJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNSgpOworCQljYXNlIDYgOgorCQkJcmV0dXJuIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKTsKKwl9CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCByZXN1bHQsIDAsIGxlbmd0aCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKXsKQEAgLTQxNiwxOSArNDUxLDE5IEBACiAJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKIAkJLy8gMCBpcyB1c2VkIGFzIGEgZmFzdCB0ZXN0IGZsYWcgc28gdGhlIHJlYWwgZmlyc3QgY2hhciBpcyBpbiBwb3NpdGlvbiAxCiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAKLQkJCTEsIAotCQkJcmVzdWx0ID0gbmV3IGNoYXJbdGhpcy53aXRob3V0VW5pY29kZVB0cl0sIAotCQkJMCwgCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsgCisJCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLAorCQkJMSwKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLAorCQkJMCwKKwkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIpOwogCWVsc2UgewogCQlpbnQgbGVuZ3RoOwogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy5zb3VyY2UsIAotCQkJdGhpcy5zdGFydFBvc2l0aW9uLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uXSwgCi0JCQkwLCAKLQkJCWxlbmd0aCk7IAorCQkJdGhpcy5zb3VyY2UsCisJCQl0aGlzLnN0YXJ0UG9zaXRpb24sCisJCQlyZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbl0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQzOCwxNCArNDczLDE0IEBACiAJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewogCQkvLyAwIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKIAkJcmV0dXJuIG5ldyBTdHJpbmcoCi0JCQl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAKLQkJCTEsIAorCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwKKwkJCTEsCiAJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyKTsKIAl9CiAJcmV0dXJuIG5ldyBTdHJpbmcoCi0JCXRoaXMuc291cmNlLCAKLQkJdGhpcy5zdGFydFBvc2l0aW9uLCAKLQkJdGhpcy5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24pOyAKKwkJdGhpcy5zb3VyY2UsCisJCXRoaXMuc3RhcnRQb3NpdGlvbiwKKwkJdGhpcy5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24pOwogfQogcHVibGljIGNoYXJbXSBnZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSB7CiAJLy9yZXR1cm4gdGhlIHRva2VuIFJFQUwgc291cmNlIChha2EgdW5pY29kZXMgYXJlIHByZWNvbXB1dGVkKS4KQEAgLTQ2MCwxMSArNDk1LDExIEBACiAJZWxzZSB7CiAJCWludCBsZW5ndGg7CiAJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLnNvdXJjZSwgCi0JCQl0aGlzLnN0YXJ0UG9zaXRpb24gKyAxLCAKLQkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uIC0gMl0sIAotCQkJMCwgCi0JCQlsZW5ndGgpOyAKKwkJCXRoaXMuc291cmNlLAorCQkJdGhpcy5zdGFydFBvc2l0aW9uICsgMSwKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uIC0gMl0sCisJCQkwLAorCQkJbGVuZ3RoKTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ4NCwzNiArNTE5LDM2IEBACiAJaW50IGxlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uOwogCWNoYXJbXSB0b2tlblNvdXJjZSA9IG5ldyBjaGFyW2xlbmd0aF07CiAJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0b2tlblNvdXJjZSwgMCwgbGVuZ3RoKTsKLQlyZXR1cm4gdG9rZW5Tb3VyY2U7CQorCXJldHVybiB0b2tlblNvdXJjZTsKIH0KLQkKKwogcHVibGljIGZpbmFsIGNoYXJbXSBnZXRSYXdUb2tlblNvdXJjZUVuZCgpIHsKIAlpbnQgbGVuZ3RoID0gdGhpcy5lb2ZQb3NpdGlvbiAtIHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMTsKIAljaGFyW10gc291cmNlRW5kID0gbmV3IGNoYXJbbGVuZ3RoXTsKIAlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc291cmNlLCB0aGlzLmN1cnJlbnRQb3NpdGlvbiwgc291cmNlRW5kLCAwLCBsZW5ndGgpOwotCXJldHVybiBzb3VyY2VFbmQ7CQorCXJldHVybiBzb3VyY2VFbmQ7CiB9Ci0JCisKIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpewogCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247CiB9CiAvKgogICogU2VhcmNoIHRoZSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKICAqCi0gKiBMaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQsIGFuZCByZWxhdGl2ZSB0byB0aGUgc2Nhbm5lciBpbml0aWFsUG9zaXRpb24uIAorICogTGluZSBudW1iZXJzIGFyZSAxLWJhc2VkLCBhbmQgcmVsYXRpdmUgdG8gdGhlIHNjYW5uZXIgaW5pdGlhbFBvc2l0aW9uLgogICogQ2hhcmFjdGVyIHBvc2l0aW9ucyBhcmUgMC1iYXNlZC4KICAqCiAgKiBJbiBjYXNlIHRoZSBnaXZlbiBsaW5lIG51bWJlciBpcyBpbmNvbnNpc3RlbnQsIGFuc3dlcnMgLTEuCiAgKi8KIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TGluZUVuZChpbnQgbGluZU51bWJlcikgewogCi0JaWYgKHRoaXMubGluZUVuZHMgPT0gbnVsbCB8fCB0aGlzLmxpbmVQdHIgPT0gLTEpIAorCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwgfHwgdGhpcy5saW5lUHRyID09IC0xKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPiB0aGlzLmxpbmVFbmRzLmxlbmd0aCsxKSAKKwlpZiAobGluZU51bWJlciA+IHRoaXMubGluZUVuZHMubGVuZ3RoKzEpCiAJCXJldHVybiAtMTsKLQlpZiAobGluZU51bWJlciA8PSAwKSAKKwlpZiAobGluZU51bWJlciA8PSAwKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPT0gdGhpcy5saW5lRW5kcy5sZW5ndGggKyAxKSAKKwlpZiAobGluZU51bWJlciA9PSB0aGlzLmxpbmVFbmRzLmxlbmd0aCArIDEpCiAJCXJldHVybiB0aGlzLmVvZlBvc2l0aW9uOwogCXJldHVybiB0aGlzLmxpbmVFbmRzW2xpbmVOdW1iZXItMV07IC8vIG5leHQgbGluZSBzdGFydCBvbmUgY2hhcmFjdGVyIGJlaGluZCB0aGUgbGluZUVuZCBvZiB0aGUgcHJldmlvdXMgbGluZQogfQpAQCAtNTMxLDI2ICs1NjYsMjYgQEAKIC8qKgogICogU2VhcmNoIHRoZSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKICAqCi0gKiBMaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQsIGFuZCByZWxhdGl2ZSB0byB0aGUgc2Nhbm5lciBpbml0aWFsUG9zaXRpb24uIAorICogTGluZSBudW1iZXJzIGFyZSAxLWJhc2VkLCBhbmQgcmVsYXRpdmUgdG8gdGhlIHNjYW5uZXIgaW5pdGlhbFBvc2l0aW9uLgogICogQ2hhcmFjdGVyIHBvc2l0aW9ucyBhcmUgMC1iYXNlZC4KICAqCiAgKiBlLmcuCWdldExpbmVTdGFydCgxKSAtLT4gMAlpbmRpY2F0ZXMgdGhhdCB0aGUgZmlyc3QgbGluZSBzdGFydHMgYXQgY2hhcmFjdGVyIDAuCiAgKgogICogSW4gY2FzZSB0aGUgZ2l2ZW4gbGluZSBudW1iZXIgaXMgaW5jb25zaXN0ZW50LCBhbnN3ZXJzIC0xLgotICogCisgKgogICogQHBhcmFtIGxpbmVOdW1iZXIgaW50CiAgKiBAcmV0dXJuIGludAogICovCiBwdWJsaWMgZmluYWwgaW50IGdldExpbmVTdGFydChpbnQgbGluZU51bWJlcikgewogCi0JaWYgKHRoaXMubGluZUVuZHMgPT0gbnVsbCB8fCB0aGlzLmxpbmVQdHIgPT0gLTEpIAorCWlmICh0aGlzLmxpbmVFbmRzID09IG51bGwgfHwgdGhpcy5saW5lUHRyID09IC0xKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPiB0aGlzLmxpbmVFbmRzLmxlbmd0aCArIDEpIAorCWlmIChsaW5lTnVtYmVyID4gdGhpcy5saW5lRW5kcy5sZW5ndGggKyAxKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGxpbmVOdW1iZXIgPD0gMCkgCisJaWYgKGxpbmVOdW1iZXIgPD0gMCkKIAkJcmV0dXJuIC0xOwotCQotCWlmIChsaW5lTnVtYmVyID09IDEpIAorCisJaWYgKGxpbmVOdW1iZXIgPT0gMSkKIAkJcmV0dXJuIHRoaXMuaW5pdGlhbFBvc2l0aW9uOwogCXJldHVybiB0aGlzLmxpbmVFbmRzW2xpbmVOdW1iZXItMl0rMTsgLy8gbmV4dCBsaW5lIHN0YXJ0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBsaW5lRW5kIG9mIHRoZSBwcmV2aW91cyBsaW5lCiB9CkBAIC02MDcsNyArNjQyLDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgPT0gdG8gdGhlIHRlc3RlZENoYXIKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAogCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7IC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKQEAgLTY1Niw3ICs2OTEsNyBAQAogCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyA9PSB0byB0aGUgdGVzdGVkQ2hhcjEvMgogCS8vT24gZmFsc2UsIG5vIHNpZGUgZWZmZWN0IGhhcyBvY2N1cmVkLgogCi0JLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTIAorCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUwogCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSAvLyBoYW5kbGUgdGhlIG9idmlvdXMgY2FzZSB1cGZyb250CiAJCXJldHVybiAtMTsKIApAQCAtNjk4LDYgKzczMyw1NCBAQAogCQlyZXR1cm4gLTE7CiAJfQogfQorLyoKKyAqIFRoaXMgbWV0aG9kIGNvbnN1bWVzIGRpZ2l0cyBhcyB3ZWxsIGFzIHVuZGVyc2NvcmVzIGlmIHVuZGVyc2NvcmVzIGFyZSBsb2NhdGVkIGJldHdlZW4gZGlnaXRzCisgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBpZiB1bmRlcnNjb3JlcyBhcmUgbm90IGxvY2F0ZWQgYmV0d2VlbiBkaWdpdHMgb3IgaWYgdW5kZXJzY29yZXMgYXJlIHVzZWQgaW4gc291cmNlIDwgMS43IAorICovCitwcml2YXRlIGZpbmFsIHZvaWQgY29uc3VtZURpZ2l0cyhpbnQgcmFkaXgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWNvbnN1bWVEaWdpdHMocmFkaXgsIGZhbHNlKTsKK30KKy8qCisgKiBUaGlzIG1ldGhvZCBjb25zdW1lcyBkaWdpdHMgYXMgd2VsbCBhcyB1bmRlcnNjb3JlcyBpZiB1bmRlcnNjb3JlcyBhcmUgbG9jYXRlZCBiZXR3ZWVuIGRpZ2l0cworICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gaWYgdW5kZXJzY29yZXMgYXJlIG5vdCBsb2NhdGVkIGJldHdlZW4gZGlnaXRzIG9yIGlmIHVuZGVyc2NvcmVzIGFyZSB1c2VkIGluIHNvdXJjZSA8IDEuNyAKKyAqLworcHJpdmF0ZSBmaW5hbCB2b2lkIGNvbnN1bWVEaWdpdHMoaW50IHJhZGl4LCBib29sZWFuIGV4cGVjdGluZ0RpZ2l0Rmlyc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWZpbmFsIGludCBVU0lOR19VTkRFUlNDT1JFID0gMTsKKwlmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IDI7CisJc3dpdGNoKGNvbnN1bWVEaWdpdHMwKHJhZGl4LCBVU0lOR19VTkRFUlNDT1JFLCBJTlZBTElEX1BPU0lUSU9OLCBleHBlY3RpbmdEaWdpdEZpcnN0KSkgeworCQljYXNlIFVTSU5HX1VOREVSU0NPUkUgOgorCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihVTkRFUlNDT1JFU19JTl9MSVRFUkFMU19OT1RfQkVMT1dfMTcpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSU5WQUxJRF9QT1NJVElPTiA6CisJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzcpIHsKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOREVSU0NPUkVTX0lOX0xJVEVSQUxTX05PVF9CRUxPV18xNyk7CisJCQl9CisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5ERVJTQ09SRSk7CisJfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgY29uc3VtZURpZ2l0czAoaW50IHJhZGl4LCBpbnQgdXNpbmdVbmRlcnNjb3JlLCBpbnQgaW52YWxpZFBvc2l0aW9uLCBib29sZWFuIGV4cGVjdGluZ0RpZ2l0Rmlyc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWludCBraW5kID0gMDsKKwlpZiAoZ2V0TmV4dENoYXIoJ18nKSkgeworCQlpZiAoZXhwZWN0aW5nRGlnaXRGaXJzdCkgeworCQkJcmV0dXJuIGludmFsaWRQb3NpdGlvbjsKKwkJfQorCQlraW5kID0gdXNpbmdVbmRlcnNjb3JlOworCQl3aGlsZSAoZ2V0TmV4dENoYXIoJ18nKSkgey8qZW1wdHkgKi99CisJfQorCWlmIChnZXROZXh0Q2hhckFzRGlnaXQocmFkaXgpKSB7CisJCS8vIGNvbnRpbnVlIHRvIHJlYWQgZGlnaXRzIG9yIHVuZGVyc2NvcmUKKwkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdChyYWRpeCkpIHsvKmVtcHR5ICovfQorCQlpbnQga2luZDIgPSBjb25zdW1lRGlnaXRzMChyYWRpeCwgdXNpbmdVbmRlcnNjb3JlLCBpbnZhbGlkUG9zaXRpb24sIGZhbHNlKTsKKwkJaWYgKGtpbmQyID09IDApIHsKKwkJCXJldHVybiBraW5kOworCQl9CisJCXJldHVybiBraW5kMjsKKwl9CisJaWYgKGtpbmQgPT0gdXNpbmdVbmRlcnNjb3JlKSByZXR1cm4gaW52YWxpZFBvc2l0aW9uOworCXJldHVybiBraW5kOworfQogcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TmV4dENoYXJBc0RpZ2l0KCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJLy9CT09MRUFOCiAJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KQEAgLTcwNyw3ICs3OTAsNyBAQAogCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyBhIGRpZ2l0CiAJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03NDgsNyArODMxLDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBkaWdpdCBiYXNlIG9uIHJhZGl4CiAJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03ODksNyArODcyLDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBKYXZhSWRlbnRpZmllclBhcnQKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAlpbnQgcG9zID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJaWYgKHBvcyA+PSB0aGlzLmVvZlBvc2l0aW9uKSAvLyBoYW5kbGUgdGhlIG9idmlvdXMgY2FzZSB1cGZyb250CiAJCXJldHVybiBmYWxzZTsKQEAgLTgyMCwxNCArOTAzLDE0IEBACiAJCQkJdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IHRlbXAyOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChjLCBsb3cpOworCQkJaXNKYXZhSWRlbnRpZmllclBhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjLCBsb3cpOwogCQl9CiAJCWVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gPSBwb3M7CiAJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyID0gdGVtcDI7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZWxzZSB7Ci0JCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7CisJCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMpOwogCQl9CiAJCWlmICh1bmljb2RlKSB7CiAJCQlpZiAoIWlzSmF2YUlkZW50aWZpZXJQYXJ0KSB7CkBAIC04NjEsNyArOTQ0LDcgQEAKIAkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBKYXZhSWRlbnRpZmllclBhcnQKIAkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KIAotCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMKIAlpbnQgcG9zOwogCWlmICgocG9zID0gdGhpcy5jdXJyZW50UG9zaXRpb24pID49IHRoaXMuZW9mUG9zaXRpb24pIC8vIGhhbmRsZSB0aGUgb2J2aW91cyBjYXNlIHVwZnJvbnQKIAkJcmV0dXJuIGZhbHNlOwpAQCAtODkwLDE0ICs5NzMsMTQgQEAKIAkJCQl0aGlzLndpdGhvdXRVbmljb2RlUHRyID0gdGVtcDI7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQotCQkJaXNKYXZhSWRlbnRpZmllclBhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMsIGxvdyk7CisJCQlpc0phdmFJZGVudGlmaWVyUGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclBhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCX0KIAkJZWxzZSBpZiAoYyA+PSBMT1dfU1VSUk9HQVRFX01JTl9WQUxVRSAmJiBjIDw9IExPV19TVVJST0dBVEVfTUFYX1ZBTFVFKSB7CiAJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbiA9IHBvczsKIAkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIgPSB0ZW1wMjsKIAkJCXJldHVybiBmYWxzZTsKIAkJfSBlbHNlIHsKLQkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKKwkJCWlzSmF2YUlkZW50aWZpZXJQYXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgYyk7CiAJCX0KIAkJaWYgKHVuaWNvZGUpIHsKIAkJCWlmICghaXNKYXZhSWRlbnRpZmllclBhcnQpIHsKQEAgLTk2NSw4ICsxMDQ4LDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJb2Zmc2V0ID0gdGhpcy5jdXJyZW50UG9zaXRpb24gLSBvZmZzZXQ7CiAJCQkJLy8gaW5saW5lIHZlcnNpb24gb2Y6Ci0JCQkJLy9pc1doaXRlU3BhY2UgPSAKLQkJCQkvLwkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJLy9pc1doaXRlU3BhY2UgPQorCQkJCS8vCSh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnKSB8fCBTY2FubmVySGVscGVyLmlzV2hpdGVzcGFjZSh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpOwogCQkJCXN3aXRjaCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSB7CiAJCQkJCWNhc2UgMTAgOiAvKiBcIHUwMDBhOiBMSU5FIEZFRUQgICAgICAgICAgICAgICAqLwogCQkJCQljYXNlIDEyIDogLyogXCB1MDAwYzogRk9STSBGRUVEICAgICAgICAgICAgICAgKi8KQEAgLTEwMTcsNyArMTEwMCw3IEBACiAJCQkJLy8gaWxsZWdhbCBsb3cgc3Vycm9nYXRlCiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0xPV19TVVJST0dBVEUpOwogCQkJfQotCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMsIGxvdyk7CisJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCX0gZWxzZSBpZiAoYyA+PSBMT1dfU1VSUk9HQVRFX01JTl9WQUxVRSAmJiBjIDw9IExPV19TVVJST0dBVEVfTUFYX1ZBTFVFKSB7CiAJCQlpZiAodGhpcy5jb21wbGlhbmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKQEAgLTEwMjUsNyArMTEwOCw3IEBACiAJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSElHSF9TVVJST0dBVEUpOwogCQl9IGVsc2UgewogCQkJLy8gb3B0aW1pemVkIGNhc2UgYWxyZWFkeSBjaGVja2VkCi0JCQlpc0phdmFJZFN0YXJ0ID0gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKKwkJCWlzSmF2YUlkU3RhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCh0aGlzLmNvbXBsaWFuY2VMZXZlbCwgYyk7CiAJCX0KIAkJaWYgKGlzSmF2YUlkU3RhcnQpCiAJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmRXaXRoQm91bmRDaGVjaygpOwpAQCAtMTA2OCw4ICsxMTUxLDE1IEBACiAJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+IHRoaXMuZW9mUG9zaXRpb24pCiAJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOwogCQkJCX0KLQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPiB0aGlzLmVvZlBvc2l0aW9uKQorCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+IHRoaXMuZW9mUG9zaXRpb24pIHsKKwkJCQkJaWYgKHRoaXMudG9rZW5pemVXaGl0ZVNwYWNlICYmICh3aGl0ZVN0YXJ0ICE9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkpIHsKKwkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uLS07CisJCQkJCQkvLyByZXBvc2l0aW9uIHNjYW5uZXIgaW4gY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBieSBzcGFjZXMgYXMgdG9rZW5zCisJCQkJCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJCQkJcmV0dXJuIFRva2VuTmFtZVdISVRFU1BBQ0U7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUVPRjsKKwkJCQl9CiAJCQkJaWYgKGNoZWNrSWZVbmljb2RlKSB7CiAJCQkJCWlzV2hpdGVTcGFjZSA9IGp1bXBPdmVyVW5pY29kZVdoaXRlU3BhY2UoKTsKIAkJCQkJb2Zmc2V0ID0gdGhpcy5jdXJyZW50UG9zaXRpb24gLSBvZmZzZXQ7CkBAIC0xMDgxLDggKzExNzEsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJCS8vIGlubGluZSB2ZXJzaW9uIG9mOgotCQkJCQkvL2lzV2hpdGVTcGFjZSA9IAotCQkJCQkvLwkodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgU2Nhbm5lckhlbHBlci5pc1doaXRlc3BhY2UodGhpcy5jdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJCS8vaXNXaGl0ZVNwYWNlID0KKwkJCQkJLy8JKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuY3VycmVudENoYXJhY3Rlcik7CiAJCQkJCXN3aXRjaCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSB7CiAJCQkJCQljYXNlIDEwIDogLyogXCB1MDAwYTogTElORSBGRUVEICAgICAgICAgICAgICAgKi8KIAkJCQkJCWNhc2UgMTIgOiAvKiBcIHUwMDBjOiBGT1JNIEZFRUQgICAgICAgICAgICAgICAqLwpAQCAtMTM0OCw2ICsxNDM4LDkgQEAKIAkJCQkJCX0KIAogCQkJCQkJd2hpbGUgKHRoaXMuY3VycmVudENoYXJhY3RlciAhPSAnIicpIHsKKwkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9TVFJJTkcpOworCQkJCQkJCX0KIAkJCQkJCQkvKioqKiBcciBhbmQgXG4gYXJlIG5vdCB2YWxpZCBpbiBzdHJpbmcgbGl0ZXJhbHMgKioqKi8KIAkJCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpKSB7CiAJCQkJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCkBAIC0xNDM4LDExICsxNTMxLDExIEBACiAJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZVN0cmluZ0xpdGVyYWw7CiAJCQkJY2FzZSAnLycgOgotCQkJCQl7Ci0JCQkJCQlpbnQgdGVzdDsKLQkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCcvJywgJyonKSkgPT0gMCkgeyAvL2xpbmUgY29tbWVudCAKKwkJCQkJaWYgKCF0aGlzLnNraXBDb21tZW50cykgeworCQkJCQkJaW50IHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJyk7CisJCQkJCQlpZiAodGVzdCA9PSAwKSB7IC8vbGluZSBjb21tZW50CiAJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwotCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJdHJ5IHsgLy9nZXQgdGhlIG5leHQgY2hhcgogCQkJCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwpAQCAtMTQ1NSw5ICsxNTQ4LDE1IEBACiAJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCWJvb2xlYW4gaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCXdoaWxlICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiB0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJykgeworCQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID49IHRoaXMuZW9mUG9zaXRpb24pIHsKKwkJCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gKys7CisJCQkJCQkJCQkJLy8gdGhpcyBhdm9pZHMgZHVwbGljYXRpbmcgdGhlIGNvZGUgaW4gdGhlIGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKKwkJCQkJCQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgotCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CQkJCQkJCQkJCisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQogCQkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKQEAgLTE0NzMsMjAgKzE1NzIsMjEgQEAKIAkJCQkJCQkJICogV2UgbmVlZCB0byBjb21wbGV0ZWx5IGNvbnN1bWUgdGhlIGxpbmUgYnJlYWsKIAkJCQkJCQkJICovCiAJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJwotCQkJCQkJCQkgICAmJiB0aGlzLmVvZlBvc2l0aW9uID4gdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKLQkJCQkJCQkJICAgCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJCQkJCQkJCSYmIHRoaXMuZW9mUG9zaXRpb24gPiB0aGlzLmN1cnJlbnRQb3NpdGlvbikgeworCQkJCQkJCQkJaWYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJCQl0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSAnXG4nOwotCQkJCQkJCQkgICAJfSBlbHNlIGlmICgodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQl9IGVsc2UgaWYgKCh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJykKIAkJCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24gKyAxXSA9PSAndScpKSB7CiAJCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKIAkJCQkJCQkJCX0KLQkJCQkJCQkgICAJfQorCQkJCQkJCQl9CiAJCQkJCQkJCXJlY29yZENvbW1lbnQoVG9rZW5OYW1lQ09NTUVOVF9MSU5FKTsKIAkJCQkJCQkJaWYgKHRoaXMudGFza1RhZ3MgIT0gbnVsbCkgY2hlY2tUYXNrVGFnKHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5jdXJyZW50UG9zaXRpb24pOwogCQkJCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7Ci0JCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJCXRoaXMubGFzdFBvc2l0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKIAkJCQkJCQkJCQlwYXJzZVRhZ3MoKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICh0aGlzLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKQEAgLTE1MDQsMTMgKzE2MDQsMTQgQEAKIAkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24tLTsKIAkJCQkJCQkJcmVjb3JkQ29tbWVudChUb2tlbk5hbWVDT01NRU5UX0xJTkUpOwogCQkJCQkJCQlpZiAodGhpcy50YXNrVGFncyAhPSBudWxsKSBjaGVja1Rhc2tUYWcodGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmN1cnJlbnRQb3NpdGlvbik7Ci0JCQkJCQkJCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKKwkJCQkJCQkJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyAmJgorCQkJCQkJCQkJCXRoaXMubGFzdFBvc2l0aW9uIDwgdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKIAkJCQkJCQkJCXBhcnNlVGFncygpOwogCQkJCQkJCQl9CiAJCQkJCQkJCWlmICh0aGlzLnRva2VuaXplQ29tbWVudHMpIHsKIAkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0xJTkU7CiAJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbisrOyAKKwkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJYnJlYWs7CkBAIC0xNTYyLDEyICsxNjYzLDE1IEBACiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsgLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCX0KIAkJCQkJCQkJLy8gZW1wdHkgY29tbWVudCBpcyBub3QgYSBqYXZhZG9jIC8qKi8KLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8KIAkJCQkJCQkJaW50IGZpcnN0VGFnID0gMDsKIAkJCQkJCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJy8nKSB8fCAoIXN0YXIpKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oVU5URVJNSU5BVEVEX0NPTU1FTlQpOworCQkJCQkJCQkJfQogCQkJCQkJCQkJaWYgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgewogCQkJCQkJCQkJCWlmICh0aGlzLnJlY29yZExpbmVTZXBhcmF0b3IpIHsKIAkJCQkJCQkJCQkJaWYgKGlzVW5pY29kZSkgewpAQCAtMTU4MiwxMCArMTY4NiwxMCBAQAogCQkJCQkJCQkJCQlzdGFyID0gdHJ1ZTsKIAkJCQkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJCQkJY2FzZSAnQCc6Ci0JCQkJCQkJCQkJCWlmIChmaXJzdFRhZyA9PSAwKSB7CisJCQkJCQkJCQkJCWlmIChmaXJzdFRhZyA9PSAwICYmIHRoaXMuaXNGaXJzdFRhZygpKSB7CiAJCQkJCQkJCQkJCQlmaXJzdFRhZyA9IHByZXZpb3VzOwogCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCS8vIGZhbGwgdGhyb3VnaCBkZWZhdWx0IGNhc2UgdG8gc2V0IHN0YXIgdG8gZmFsc2UKKwkJCQkJCQkJCQkJLy8kRkFMTC1USFJPVUdIJCBkZWZhdWx0IGNhc2UgdG8gc2V0IHN0YXIgdG8gZmFsc2UKIAkJCQkJCQkJCQlkZWZhdWx0OgogCQkJCQkJCQkJCQlzdGFyID0gZmFsc2U7CiAJCQkJCQkJCQl9CkBAIC0xNjIzLDEwICsxNzI3LDEwIEBACiAJCQkJCQkJfQogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQotCQkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCi0JCQkJCQkJcmV0dXJuIFRva2VuTmFtZURJVklERV9FUVVBTDsKLQkJCQkJCXJldHVybiBUb2tlbk5hbWVESVZJREU7CiAJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFX0VRVUFMOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFOwogCQkJCWNhc2UgJ1x1MDAxYScgOgogCQkJCQlpZiAoYXRFbmQoKSkKIAkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CkBAIC0xNjU0LDcgKzE3NTgsNyBAQAogCQkJCQkJCS8vIGlsbGVnYWwgbG93IHN1cnJvZ2F0ZQogCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9MT1dfU1VSUk9HQVRFKTsKIAkJCQkJCX0KLQkJCQkJCWlzSmF2YUlkU3RhcnQgPSBTY2FubmVySGVscGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjLCBsb3cpOworCQkJCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjLCBsb3cpOwogCQkJCQl9CiAJCQkJCWVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJCQkJaWYgKHRoaXMuY29tcGxpYW5jZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewpAQCAtMTY2MywxMyArMTc2NywxMyBAQAogCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hJR0hfU1VSUk9HQVRFKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIG9wdGltaXplZCBjYXNlIGFscmVhZHkgY2hlY2tlZAotCQkJCQkJaXNKYXZhSWRTdGFydCA9IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7CisJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMpOwogCQkJCQl9CiAJCQkJCWlmIChpc0phdmFJZFN0YXJ0KQogCQkJCQkJcmV0dXJuIHNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKCk7CiAJCQkJCWlmIChTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgewogCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIoZmFsc2UpOwotCQkJCQl9CQkJCQkJCisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUVSUk9SOwogCQkJfQogCQl9CkBAIC0xNjkyLDcgKzE3OTYsNyBAQAogCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCiAJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CiAKLQkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTCiAJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMCwgdW5pY29kZVNpemUgPSA2OwogCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uIDwgdGhpcy5lb2ZQb3NpdGlvbikgewpAQCAtMTc0Niw2ICsxODUwLDkgQEAKIHB1YmxpYyBjaGFyW10gZ2V0U291cmNlKCl7CiAJcmV0dXJuIHRoaXMuc291cmNlOwogfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXJzdFRhZygpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KIHB1YmxpYyBmaW5hbCB2b2lkIGp1bXBPdmVyTWV0aG9kQm9keSgpIHsKIAogCXRoaXMud2FzQWNyID0gZmFsc2U7CkBAIC0xODI5LDEzICsxOTM2LDE2IEBACiAJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKLQkJCQkJCQkJICAgIHVuaWNvZGVTdG9yZSgpOworCQkJCQkJCQkJdW5pY29kZVN0b3JlKCk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKIAkJCQkJCQkJLy8gaWdub3JlCiAJCQkJCQl9CiAJCQkJCQl3aGlsZSAodGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICciJykgeworCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CiAJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKXsKIAkJCQkJCQkJaWYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB0aGlzLmN1cnJlbnRQb3NpdGlvbisrOwogCQkJCQkJCQlicmVhayBOZXh0VG9rZW47IC8vIHRoZSBzdHJpbmcgY2Fubm90IGdvIGZ1cnRoZXIgdGhhdCB0aGUgbGluZQpAQCAtMTg4NCwxMCArMTk5NCwxMCBAQAogCQkJCWNhc2UgJy8nIDoKIAkJCQkJewogCQkJCQkJaW50IHRlc3Q7Ci0JCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQKIAkJCQkJCQl0cnkgewogCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIKIAkJCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKQEAgLTE4OTksOCArMjAwOSwxNCBAQAogCQkJCQkJCQl9IC8vanVtcCBvdmVyIHRoZSBcXAogCQkJCQkJCQlib29sZWFuIGlzVW5pY29kZSA9IGZhbHNlOwogCQkJCQkJCQl3aGlsZSAodGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgdGhpcy5jdXJyZW50Q2hhcmFjdGVyICE9ICdcbicpIHsKKwkJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRQb3NpdGlvbiA+PSB0aGlzLmVvZlBvc2l0aW9uKSB7CisJCQkJCQkJCQkJdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uICsrOworCQkJCQkJCQkJCS8vIHRoaXMgYXZvaWRzIGR1cGxpY2F0aW5nIHRoZSBjb2RlIGluc2lkZSB0aGUgY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSBiZWxvdworCQkJCQkJCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJCQkJCQkJCQl9CiAJCQkJCQkJCQl0aGlzLmxhc3RDb21tZW50TGluZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgogCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CkBAIC0xOTE3LDIwICsyMDMzLDIxIEBACiAJCQkJCQkJCSAqIFdlIG5lZWQgdG8gY29tcGxldGVseSBjb25zdW1lIHRoZSBsaW5lIGJyZWFrCiAJCQkJCQkJCSAqLwogCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicKLQkJCQkJCQkJICAgJiYgdGhpcy5lb2ZQb3NpdGlvbiA+IHRoaXMuY3VycmVudFBvc2l0aW9uKSB7Ci0JCQkJCQkJCSAgIAlpZiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcbicpIHsKKwkJCQkJCQkJCQkmJiB0aGlzLmVvZlBvc2l0aW9uID4gdGhpcy5jdXJyZW50UG9zaXRpb24pIHsKKwkJCQkJCQkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgewogCQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7CiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gJ1xuJzsKLQkJCQkJCQkJICAgCX0gZWxzZSBpZiAoKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJfSBlbHNlIGlmICgodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICdcXCcpCiAJCQkJCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbiArIDFdID09ICd1JykpIHsKIAkJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOwogCQkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJCQkJfQotCQkJCQkJCSAgIAl9CisJCQkJCQkJCX0KIAkJCQkJCQkJcmVjb3JkQ29tbWVudChUb2tlbk5hbWVDT01NRU5UX0xJTkUpOwogCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yCiAJCQkJCQkJCQkmJiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkgewotCQkJCQkJCQkJCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKKwkJCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJCQl0aGlzLmxhc3RQb3NpdGlvbiA8IHRoaXMuY3VycmVudFBvc2l0aW9uKSB7CiAJCQkJCQkJCQkJCXBhcnNlVGFncygpOwogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CkBAIC0xOTQ1LDExICsyMDYyLDEyIEBACiAJCQkJCQkJCSAvL2FuIGVvZiB3aWxsIHRoZW4gYmUgZ2VuZXJhdGVkCiAJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uLS07CiAJCQkJCQkJCXJlY29yZENvbW1lbnQoVG9rZW5OYW1lQ09NTUVOVF9MSU5FKTsKLQkJCQkJCQkJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgeworCQkJCQkJCQlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzICYmCisJCQkJCQkJCQkJdGhpcy5sYXN0UG9zaXRpb24gPCB0aGlzLmN1cnJlbnRQb3NpdGlvbikgewogCQkJCQkJCQkJcGFyc2VUYWdzKCk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJaWYgKCF0aGlzLnRva2VuaXplQ29tbWVudHMpIHsKLQkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uKys7IAorCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCQlicmVhayBOZXh0VG9rZW47CkBAIC0xOTY5LDEwICsyMDg3LDEwIEBACiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKLSAgICAJCQkJCQkJCSAgICB1bmljb2RlU3RvcmUoKTsKKwkJCQkJCQkJCQl1bmljb2RlU3RvcmUoKTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQorCiAJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSB0cnVlOwogCQkJCQkJCQkJc3RhciA9IHRydWU7CkBAIC0yMDAxLDEyICsyMTE5LDE1IEBACiAJCQkJCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24rKzsgLy9qdW1wIG92ZXIgdGhlIFxcCiAJCQkJCQkJCX0KIAkJCQkJCQkJLy8gZW1wdHkgY29tbWVudCBpcyBub3QgYSBqYXZhZG9jIC8qKi8KLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy8nKSB7CiAJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8KIAkJCQkJCQkJaW50IGZpcnN0VGFnID0gMDsKIAkJCQkJCQkJd2hpbGUgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJy8nKSB8fCAoIXN0YXIpKSB7CisJCQkJCQkJCQlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPj0gdGhpcy5lb2ZQb3NpdGlvbikgeworCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJCWlmICgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKIAkJCQkJCQkJCQlpZiAodGhpcy5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CiAJCQkJCQkJCQkJCWlmIChpc1VuaWNvZGUpIHsKQEAgLTIwMjEsMTAgKzIxNDIsMTAgQEAKIAkJCQkJCQkJCQkJc3RhciA9IHRydWU7CiAJCQkJCQkJCQkJCWJyZWFrOwogCQkJCQkJCQkJCWNhc2UgJ0AnOgotCQkJCQkJCQkJCQlpZiAoZmlyc3RUYWcgPT0gMCkgeworCQkJCQkJCQkJCQlpZiAoZmlyc3RUYWcgPT0gMCAmJiB0aGlzLmlzRmlyc3RUYWcoKSkgewogCQkJCQkJCQkJCQkJZmlyc3RUYWcgPSBwcmV2aW91czsKIAkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkvLyBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlIHRvIHNldCBzdGFyIHRvIGZhbHNlCisJCQkJCQkJCQkJCS8vJEZBTEwtVEhST1VHSCQgZGVmYXVsdCBjYXNlIHRvIHNldCBzdGFyIHRvIGZhbHNlCiAJCQkJCQkJCQkJZGVmYXVsdDoKIAkJCQkJCQkJCQkJc3RhciA9IGZhbHNlOwogCQkJCQkJCQkJfQpAQCAtMjA3OCwxMiArMjE5OSwxMiBAQAogCQkJCQkJCQkvLyBpbGxlZ2FsIGxvdyBzdXJyb2dhdGUKIAkJCQkJCQkJYnJlYWsgTmV4dFRva2VuOwogCQkJCQkJCX0KLQkJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYywgbG93KTsKKwkJCQkJCQlpc0phdmFJZFN0YXJ0ID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodGhpcy5jb21wbGlhbmNlTGV2ZWwsIGMsIGxvdyk7CiAJCQkJCQl9IGVsc2UgaWYgKGMgPj0gTE9XX1NVUlJPR0FURV9NSU5fVkFMVUUgJiYgYyA8PSBMT1dfU1VSUk9HQVRFX01BWF9WQUxVRSkgewogCQkJCQkJCWJyZWFrIE5leHRUb2tlbjsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJLy8gb3B0aW1pemVkIGNhc2UgYWxyZWFkeSBjaGVja2VkCi0JCQkJCQkJaXNKYXZhSWRTdGFydCA9IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7CisJCQkJCQkJaXNKYXZhSWRTdGFydCA9IFNjYW5uZXJIZWxwZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHRoaXMuY29tcGxpYW5jZUxldmVsLCBjKTsKIAkJCQkJCX0KIAkJCQkJCWlmIChpc0phdmFJZFN0YXJ0KSB7CiAJCQkJCQkJc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKQEAgLTIwOTIsNyArMjIxMyw3IEBACiAvLwkJCQkJCWlmIChTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgewogLy8JCQkJCQkJc2Nhbk51bWJlcihmYWxzZSk7CiAvLwkJCQkJCQlicmVhayBOZXh0VG9rZW47Ci0vLwkJCQkJCX0JCQkJCQkKKy8vCQkJCQkJfQogCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKIAkJCQkJCS8vIGlnbm9yZQogCQkJCQl9CkBAIC0yMTg2LDkgKzIzMDcsOSBAQAogCWNoYXJbXSBzcmMgPSB0aGlzLnNvdXJjZTsKIAlpbnQgc3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJY2hhciBjMCAsIGMxOwotCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzE9c3JjW3N0YXJ0KzFdKSkgJSBUYWJsZVNpemU7IAorCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzE9c3JjW3N0YXJ0KzFdKSkgJSBUYWJsZVNpemU7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMF1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTI7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5MjsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkpCkBAIC0yMTk2LDcgKzIzMTcsNyBAQAogCX0KIAkvLy0tLS0tLS0tLW90aGVyIHNpZGUtLS0tLS0tLS0KIAlpID0gLTE7Ci0JaW50IG1heCA9IG5ld0VudHJ5MjsKKwlpbnQgbWF4ID0gdGhpcy5uZXdFbnRyeTI7CiAJd2hpbGUgKCsraSA8PSBtYXgpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkpCkBAIC0yMjA3LDcgKzIzMjgsNyBAQAogCWNoYXJbXSByOwogCVN5c3RlbS5hcnJheWNvcHkoc3JjLCBzdGFydCwgcj0gbmV3IGNoYXJbMl0sIDAsIDIpOwogCS8vbmV3SWRlbnRDb3VudCsrOwotCXJldHVybiB0YWJsZVtuZXdFbnRyeTIgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMX0pOworCXJldHVybiB0YWJsZVt0aGlzLm5ld0VudHJ5MiA9IG1heF0gPSByOyAvLyhyID0gbmV3IGNoYXJbXSB7YzAsIGMxfSk7CiB9CiBmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMygpIHsKIAkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQpAQCAtMjIxNSwxMCArMjMzNiwxMCBAQAogCWNoYXJbXSBzcmMgPSB0aGlzLnNvdXJjZTsKIAlpbnQgc3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJY2hhciBjMCwgYzE9c3JjW3N0YXJ0KzFdLCBjMjsKLQlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7IAotLy8JaW50IGhhc2ggPSAoKGMwIDw8IDEyKSArIChjMTw8IDYpICsgYzIpICUgVGFibGVTaXplOyAKKwlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7CisvLwlpbnQgaGFzaCA9ICgoYzAgPDwgMTIpICsgKGMxPDwgNikgKyBjMikgJSBUYWJsZVNpemU7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMV1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTM7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5MzsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkgJiYgKGMyID09IGNoYXJBcnJheVsyXSkpCkBAIC0yMjI2LDcgKzIzNDcsNyBAQAogCX0KIAkvLy0tLS0tLS0tLW90aGVyIHNpZGUtLS0tLS0tLS0KIAlpID0gLTE7Ci0JaW50IG1heCA9IG5ld0VudHJ5MzsKKwlpbnQgbWF4ID0gdGhpcy5uZXdFbnRyeTM7CiAJd2hpbGUgKCsraSA8PSBtYXgpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkgJiYgKGMxID09IGNoYXJBcnJheVsxXSkgJiYgKGMyID09IGNoYXJBcnJheVsyXSkpCkBAIC0yMjM3LDcgKzIzNTgsNyBAQAogCWNoYXJbXSByOwogCVN5c3RlbS5hcnJheWNvcHkoc3JjLCBzdGFydCwgcj0gbmV3IGNoYXJbM10sIDAsIDMpOwogCS8vbmV3SWRlbnRDb3VudCsrOwotCXJldHVybiB0YWJsZVtuZXdFbnRyeTMgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKKwlyZXR1cm4gdGFibGVbdGhpcy5uZXdFbnRyeTMgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKIH0KIGZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U0KCkgewogCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCkBAIC0yMjQ2LDkgKzIzNjcsOSBAQAogCWludCBzdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAljaGFyIGMwLCBjMSA9IHNyY1tzdGFydCsxXSwgYzIsIGMzID0gc3JjW3N0YXJ0KzNdOwogCWludCBoYXNoID0gKCgoYzA9c3JjW3N0YXJ0XSkgPDwgNikgKyAoYzI9c3JjW3N0YXJ0KzJdKSkgJSBUYWJsZVNpemU7Ci0vLwlpbnQgaGFzaCA9IChpbnQpICgoKCgobG9uZykgYzApIDw8IDE4KSArIChjMSA8PCAxMikgKyAoYzIgPDwgNikgKyBjMykgJSBUYWJsZVNpemUpOyAKKy8vCWludCBoYXNoID0gKGludCkgKCgoKChsb25nKSBjMCkgPDwgMTgpICsgKGMxIDw8IDEyKSArIChjMiA8PCA2KSArIGMzKSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbMl1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTQ7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NDsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIyNTksNyArMjM4MCw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk0OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NDsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjI3Myw3ICsyMzk0LDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzRdLCAwLCA0KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk0ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjM30pOworCXJldHVybiB0YWJsZVt0aGlzLm5ld0VudHJ5NCA9IG1heF0gPSByOyAvLyhyID0gbmV3IGNoYXJbXSB7YzAsIGMxLCBjMiwgYzN9KTsKIH0KIGZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U1KCkgewogCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCkBAIC0yMjgyLDkgKzI0MDMsOSBAQAogCWludCBzdGFydCA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAljaGFyIGMwLCBjMSA9IHNyY1tzdGFydCsxXSwgYzIsIGMzID0gc3JjW3N0YXJ0KzNdLCBjNDsKIAlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pIDw8IDEyKSArKChjMj1zcmNbc3RhcnQrMl0pIDw8IDYpICsgKGM0PXNyY1tzdGFydCs0XSkpICUgVGFibGVTaXplOwotLy8JaW50IGhhc2ggPSAoaW50KSAoKCgoKGxvbmcpIGMwKSA8PCAyNCkgKyAoKChsb25nKSBjMSkgPDwgMTgpICsgKGMyIDw8IDEyKSArIChjMyA8PCA2KSArIGM0KSAlIFRhYmxlU2l6ZSk7IAorLy8JaW50IGhhc2ggPSAoaW50KSAoKCgoKGxvbmcpIGMwKSA8PCAyNCkgKyAoKChsb25nKSBjMSkgPDwgMTgpICsgKGMyIDw8IDEyKSArIChjMyA8PCA2KSArIGM0KSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbM11baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTU7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NTsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIyOTYsNyArMjQxNyw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk1OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NTsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjMxMSw3ICsyNDMyLDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzVdLCAwLCA1KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk1ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzR9KTsKKwlyZXR1cm4gdGFibGVbdGhpcy5uZXdFbnRyeTUgPSBtYXhdID0gcjsgLy8ociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzIsIGMzLCBjNH0pOwogfQogZmluYWwgY2hhcltdIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKSB7CiAJLy90cnkgdG8gcmV0dXJuIHRoZSBzYW1lIGNoYXJbXSBidWlsZCBvbmx5IG9uY2UKQEAgLTIzMjAsOSArMjQ0MSw5IEBACiAJaW50IHN0YXJ0ID0gdGhpcy5zdGFydFBvc2l0aW9uOwogCWNoYXIgYzAsIGMxID0gc3JjW3N0YXJ0KzFdLCBjMiwgYzMgPSBzcmNbc3RhcnQrM10sIGM0LCBjNSA9IHNyY1tzdGFydCs1XTsKIAlpbnQgaGFzaCA9ICgoKGMwPXNyY1tzdGFydF0pIDw8IDEyKSArKChjMj1zcmNbc3RhcnQrMl0pIDw8IDYpICsgKGM0PXNyY1tzdGFydCs0XSkpICUgVGFibGVTaXplOwotLy8JaW50IGhhc2ggPSAoaW50KSgoKCgobG9uZykgYzApIDw8IDMyKSArICgoKGxvbmcpIGMxKSA8PCAyNCkgKyAoKChsb25nKSBjMikgPDwgMTgpICsgKGMzIDw8IDEyKSArIChjNCA8PCA2KSArIGM1KSAlIFRhYmxlU2l6ZSk7IAorLy8JaW50IGhhc2ggPSAoaW50KSgoKCgobG9uZykgYzApIDw8IDMyKSArICgoKGxvbmcpIGMxKSA8PCAyNCkgKyAoKChsb25nKSBjMikgPDwgMTgpICsgKGMzIDw8IDEyKSArIChjNCA8PCA2KSArIGM1KSAlIFRhYmxlU2l6ZSk7CiAJY2hhcltdW10gdGFibGUgPSB0aGlzLmNoYXJBcnJheV9sZW5ndGhbNF1baGFzaF07Ci0JaW50IGkgPSBuZXdFbnRyeTY7CisJaW50IGkgPSB0aGlzLm5ld0VudHJ5NjsKIAl3aGlsZSAoKytpIDwgSW50ZXJuYWxUYWJsZVNpemUpIHsKIAkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOwogCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKQEAgLTIzMzUsNyArMjQ1Niw3IEBACiAJfQogCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQogCWkgPSAtMTsKLQlpbnQgbWF4ID0gbmV3RW50cnk2OworCWludCBtYXggPSB0aGlzLm5ld0VudHJ5NjsKIAl3aGlsZSAoKytpIDw9IG1heCkgewogCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CiAJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQpAQCAtMjM1MSw3ICsyNDcyLDcgQEAKIAljaGFyW10gcjsKIAlTeXN0ZW0uYXJyYXljb3B5KHNyYywgc3RhcnQsIHI9IG5ldyBjaGFyWzZdLCAwLCA2KTsKIAkvL25ld0lkZW50Q291bnQrKzsKLQlyZXR1cm4gdGFibGVbbmV3RW50cnk2ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CisJcmV0dXJuIHRhYmxlW3RoaXMubmV3RW50cnk2ID0gbWF4XSA9IHI7IC8vKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CiB9CiAKIHByaXZhdGUgdm9pZCBwYXJzZVRhZ3MoKSB7CkBAIC0yMzU5LDcgKzI0ODAsNyBAQAogCWZpbmFsIGludCBjdXJyZW50U3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIAlmaW5hbCBpbnQgY3VycmVudExpbmVQdHIgPSB0aGlzLmxpbmVQdHI7CiAJaWYgKGN1cnJlbnRMaW5lUHRyID49IDApIHsKLQkJcG9zaXRpb24gPSB0aGlzLmxpbmVFbmRzW2N1cnJlbnRMaW5lUHRyXSArIDE7IAorCQlwb3NpdGlvbiA9IHRoaXMubGluZUVuZHNbY3VycmVudExpbmVQdHJdICsgMTsKIAl9CiAJd2hpbGUgKFNjYW5uZXJIZWxwZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlW3Bvc2l0aW9uXSkpIHsKIAkJcG9zaXRpb24rKzsKQEAgLTIzNzUsMTAgKzI0OTYsMTAgQEAKIAlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CiAJCS8vIDAgaXMgdXNlZCBhcyBhIGZhc3QgdGVzdCBmbGFnIHNvIHRoZSByZWFsIGZpcnN0IGNoYXIgaXMgaW4gcG9zaXRpb24gMQogCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgCi0JCQkxLCAKLQkJCXMgPSBuZXcgY2hhclt0aGlzLndpdGhvdXRVbmljb2RlUHRyXSwgCi0JCQkwLCAKKwkJCXRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsCisJCQkxLAorCQkJcyA9IG5ldyBjaGFyW3RoaXMud2l0aG91dFVuaWNvZGVQdHJdLAorCQkJMCwKIAkJCXRoaXMud2l0aG91dFVuaWNvZGVQdHIpOwogCQlzb3VyY2VFbmQgPSB0aGlzLndpdGhvdXRVbmljb2RlUHRyOwogCQlzb3VyY2VTdGFydCA9IDE7CkBAIC0yNDc1LDcgKzI1OTYsNyBAQAogCQkvLyBsb29rLWFoZWFkIGZvciBtZXJnZWQgY3IrbGYKIAkJdHJ5IHsKIAkJCWlmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29rLWFoZWFkIExGLSIgKyB0aGlzLmN1cnJlbnRQb3NpdGlvbik7CQkJCisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2stYWhlYWQgTEYtIiArIHRoaXMuY3VycmVudFBvc2l0aW9uKTsKIAkJCQl0aGlzLmxpbmVFbmRzW3RoaXMubGluZVB0cl0gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjsKIAkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbisrOwogCQkJCXRoaXMud2FzQWNyID0gZmFsc2U7CkBAIC0yNDg5LDcgKzI2MTAsNyBAQAogCQkvLyBsZiAwMDBBCiAJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykgeyAvL211c3QgbWVyZ2UgZXZlbnR1YWwgY3IgZm9sbG93ZWQgYnkgbGYKIAkJCWlmICh0aGlzLndhc0FjciAmJiAodGhpcy5saW5lRW5kc1t0aGlzLmxpbmVQdHJdID09ICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDIpKSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZXJnZSBMRi0iICsgKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkpOwkJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWVyZ2UgTEYtIiArICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKIAkJCQl0aGlzLmxpbmVFbmRzW3RoaXMubGluZVB0cl0gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQl9IGVsc2UgewogCQkJCWludCBzZXBhcmF0b3JQb3MgPSB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7CkBAIC0yNTIxLDEyICsyNjQyLDE2IEBACiAKIHB1YmxpYyB2b2lkIHJlY29yZENvbW1lbnQoaW50IHRva2VuKSB7CiAJLy8gY29tcHV0ZSBwb3NpdGlvbgorCWludCBjb21tZW50U3RhcnQgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAJaW50IHN0b3BQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwogCXN3aXRjaCAodG9rZW4pIHsKIAkJY2FzZSBUb2tlbk5hbWVDT01NRU5UX0xJTkU6CisJCQkvLyBib3RoIHBvc2l0aW9ucyBhcmUgbmVnYXRpdmUKKwkJCWNvbW1lbnRTdGFydCA9IC10aGlzLnN0YXJ0UG9zaXRpb247CiAJCQlzdG9wUG9zaXRpb24gPSAtdGhpcy5sYXN0Q29tbWVudExpbmVQb3NpdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIFRva2VuTmFtZUNPTU1FTlRfQkxPQ0s6CisJCQkvLyBvbmx5IGVuZCBwb3NpdGlvbiBpcyBuZWdhdGl2ZQogCQkJc3RvcFBvc2l0aW9uID0gLXRoaXMuY3VycmVudFBvc2l0aW9uOwogCQkJYnJlYWs7CiAJfQpAQCAtMjU0MCwxMyArMjY2NSwxMyBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tbWVudFRhZ1N0YXJ0cywgMCwgdGhpcy5jb21tZW50VGFnU3RhcnRzID0gbmV3IGludFtuZXdMZW5ndGhdLCAwLCBsZW5ndGgpOwogCX0KIAl0aGlzLmNvbW1lbnRTdG9wc1t0aGlzLmNvbW1lbnRQdHJdID0gc3RvcFBvc2l0aW9uOwotCXRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gdGhpcy5zdGFydFBvc2l0aW9uOworCXRoaXMuY29tbWVudFN0YXJ0c1t0aGlzLmNvbW1lbnRQdHJdID0gY29tbWVudFN0YXJ0OwogfQogCiAvKioKICAqIFJlcG9zaXRpb24gdGhlIHNjYW5uZXIgb24gc29tZSBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuIFRoZSBnaXZlbiBlbmRQb3NpdGlvbiBpcyB0aGUgbGFzdCB2YWxpZCBwb3NpdGlvbi4KICAqIEJleW9uZCB0aGlzIHBvc2l0aW9uLCB0aGUgc2Nhbm5lciB3aWxsIGFuc3dlciBFT0YgdG9rZW5zICg8Y29kZT5JVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRjwvY29kZT4pLgotICogCisgKgogICogQHBhcmFtIGJlZ2luIHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbgogICogQHBhcmFtIGVuZCB0aGUgZ2l2ZW4gZW5kIHBvc2l0aW9uCiAgKi8KQEAgLTI1NjQsNyArMjY4OSw3IEBACiAJdGhpcy5mb3VuZFRhc2tDb3VudCA9IDA7CiB9CiAKLXB1YmxpYyBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKK3Byb3RlY3RlZCBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkvLyB0aGUgc3RyaW5nIHdpdGggIlxcdSIgaXMgYSBsZWdhbCBzdHJpbmcgb2YgdHdvIGNoYXJzIFwgYW5kIHUKIAkvL3RodXMgd2UgdXNlIGEgZGlyZWN0IGFjY2VzcyB0byB0aGUgc291cmNlIChmb3IgcmVndWxhciBjYXNlcykuCiAJc3dpdGNoICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpIHsKQEAgLTI2MTksNyArMjc0NCw3IEBACiAJCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25EaWdpdC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKIAkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbi0tOwogCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0LS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgkJCQkJCQorCQkJCQl9IGVsc2UgeyAvLyBoYXMgcmVhZCBcT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0LS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgogCQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24tLTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKQEAgLTI2MzgsNyArMjc2Myw3IEBACiAJLy9maXJzdCBkaXNwYXRjaCBvbiB0aGUgZmlyc3QgY2hhci4KIAkvL3RoZW4gdGhlIGxlbmd0aC4gSWYgdGhlcmUgYXJlIHNldmVyYWwKIAkvL2tleXdvcnMgd2l0aCB0aGUgc2FtZSBsZW5ndGggQU5EIHRoZSBzYW1lIGZpcnN0IGNoYXIsIHRoZW4gZG8gYW5vdGhlcgotCS8vZGlzcGF0Y2ggb24gdGhlIHNlY29uZCBjaGFyIAorCS8vZGlzcGF0Y2ggb24gdGhlIHNlY29uZCBjaGFyCiAJdGhpcy51c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsKIAl0aGlzLnVzZUVudW1Bc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsKIApAQCAtMjY1MSw5ICsyNzc2LDkgQEAKIAkJCQlicmVhayBpZGVudExvb3A7CiAJCQljaGFyIGMgPSBzcmNbcG9zXTsKIAkJCWlmIChjIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgewotCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmIAorCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjXSAmCiAJCQkJCQkoU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19MT1dFUl9MRVRURVIgfCBTY2FubmVySGVscGVyLkNfSURFTlRfUEFSVCB8IFNjYW5uZXJIZWxwZXIuQ19ESUdJVCkpICE9IDApIHsKLQkJICAgICAgICAgICAgICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CiAJCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gYzsKIAkJCQkJCQl1bmljb2RlU3RvcmUoKTsKIAkJCQkJCX0KQEAgLTI2NjIsMTggKzI3ODcsMTggQEAKIAkJCQkJCXRoaXMuY3VycmVudENoYXJhY3RlciA9IGM7CiAJCQkJCQlicmVhayBpZGVudExvb3A7CiAJCQkJfSBlbHNlIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNsb3c8PTEyODogICIrIGMpOwkJCQkJCQorCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdzw9MTI4OiAgIisgYyk7CiAJCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0V2l0aEJvdW5kQ2hlY2soKSl7LyplbXB0eSovfQotCQkJCQlicmVhayBpZGVudExvb3A7CQkJCQkJCisJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93Pj4xMjg6ICAiKyBjKTsJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdz4+MTI4OiAgIisgYyk7CiAJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnRXaXRoQm91bmRDaGVjaygpKXsvKmVtcHR5Ki99Ci0JCQkJYnJlYWsgaWRlbnRMb29wOwkJCQkJCQorCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCX0KIAkJfQogCX0KLQkKKwogCWludCBpbmRleCwgbGVuZ3RoOwogCWNoYXJbXSBkYXRhOwogCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyID09IDApIHsKQEAgLTI2OTksOCArMjgyNCw4IEBACiAKIAkvL2ZpcnN0IGRpc3BhdGNoIG9uIHRoZSBmaXJzdCBjaGFyLgogCS8vdGhlbiB0aGUgbGVuZ3RoLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbAotCS8va2V5d29ycyB3aXRoIHRoZSBzYW1lIGxlbmd0aCBBTkQgdGhlIHNhbWUgZmlyc3QgY2hhciwgdGhlbiBkbyBhbm90aGVyCi0JLy9kaXNwYXRjaCBvbiB0aGUgc2Vjb25kIGNoYXIgCisJLy9rZXl3b3JkcyB3aXRoIHRoZSBzYW1lIGxlbmd0aCBBTkQgdGhlIHNhbWUgZmlyc3QgY2hhciwgdGhlbiBkbyBhbm90aGVyCisJLy9kaXNwYXRjaCBvbiB0aGUgc2Vjb25kIGNoYXIKIAl0aGlzLnVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IGZhbHNlOwogCXRoaXMudXNlRW51bUFzQW5JbmRlbnRpZmllciA9IGZhbHNlOwogCkBAIC0yNzEzLDkgKzI4MzgsOSBAQAogCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCWNoYXIgYyA9IHNyY1twb3NdOwogCQkJaWYgKGMgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7Ci0JCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYgCisJCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW2NdICYKIAkJCQkJCShTY2FubmVySGVscGVyLkNfVVBQRVJfTEVUVEVSIHwgU2Nhbm5lckhlbHBlci5DX0xPV0VSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19JREVOVF9QQVJUIHwgU2Nhbm5lckhlbHBlci5DX0RJR0lUKSkgIT0gMCkgewotCQkgICAgICAgICAgICAgICBpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKIAkJCQkJCQl0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSBjOwogCQkJCQkJCXVuaWNvZGVTdG9yZSgpOwogCQkJCQkJfQpAQCAtMjcyNCwxOCArMjg0OSwxOCBAQAogCQkJCQkJdGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gYzsKIAkJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9IGVsc2UgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdzw9MTI4OiAgIisgYyk7CQkJCQkJCisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93PD0xMjg6ICAiKyBjKTsKIAkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSl7LyplbXB0eSovfQotCQkJCQlicmVhayBpZGVudExvb3A7CQkJCQkJCisJCQkJCWJyZWFrIGlkZW50TG9vcDsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzbG93Pj4xMjg6ICAiKyBjKTsJCQkJCQkKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2xvdz4+MTI4OiAgIisgYyk7CiAJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSl7LyplbXB0eSovfQotCQkJCWJyZWFrIGlkZW50TG9vcDsJCQkJCQkKKwkJCQlicmVhayBpZGVudExvb3A7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlpbnQgaW5kZXgsIGxlbmd0aDsKIAljaGFyW10gZGF0YTsKIAlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CkBAIC0yNzU2LDEwICsyODgxLDkgQEAKIAogCXJldHVybiBpbnRlcm5hbFNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKGluZGV4LCBsZW5ndGgsIGRhdGEpOwogfQotCiBwcml2YXRlIGludCBpbnRlcm5hbFNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKGludCBpbmRleCwgaW50IGxlbmd0aCwgY2hhcltdIGRhdGEpIHsKIAlzd2l0Y2ggKGRhdGFbaW5kZXhdKSB7Ci0JCWNhc2UgJ2EnIDogCisJCWNhc2UgJ2EnIDoKIAkJCXN3aXRjaChsZW5ndGgpIHsKIAkJCQljYXNlIDg6IC8vYWJzdHJhY3QKIAkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdiJykKQEAgLTI3ODQsMTIgKzI5MDgsMTIgQEAKIAkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWFzc2VydDsKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQl0aGlzLnVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IHRydWU7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwkJCQkJCQkJCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwogCQkJCQkJCX0KIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQkJCQl9Ci0JCQkJZGVmYXVsdDogCisJCQkJZGVmYXVsdDoKIAkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQl9CiAJCWNhc2UgJ2InIDogLy9ib29sZWFuIGJyZWFrIGJ5dGUKQEAgLTI5MDIsMjAgKzMwMjYsMjMgQEAKIAkJY2FzZSAnZScgOiAvL2Vsc2UgZXh0ZW5kcwogCQkJc3dpdGNoIChsZW5ndGgpIHsKIAkJCQljYXNlIDQgOgotCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2wnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpICYmIChkYXRhWysraW5kZXhdID09ICdlJykpCi0JCQkJCQlyZXR1cm4gVG9rZW5OYW1lZWxzZTsKLQkJCQkJZWxzZSBpZiAoKGRhdGFbaW5kZXhdID09ICduJykKLQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd1JykKLQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdtJykpIHsKLQkJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVlbnVtOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRoaXMudXNlRW51bUFzQW5JbmRlbnRpZmllciA9IHRydWU7Ci0JCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwkJCQkJCQkJCi0JCQkJCQkJfQorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpIHsKKwkJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncycpICYmIChkYXRhWysraW5kZXhdID09ICdlJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZWxzZTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CiAJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoKGRhdGFbaW5kZXhdID09ICduJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ20nKSkgeworCQkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPj0gQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVlbnVtOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLnVzZUVudW1Bc0FuSW5kZW50aWZpZXIgPSB0cnVlOworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOwogCQkJCWNhc2UgNyA6CiAJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneCcpCiAJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCkBAIC0zMjE3LDcgKzMzNDQsNyBAQAogCQkJCQllbHNlCiAJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKIAkJCQljYXNlIDQgOgotCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpIAorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCiAJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2knKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpKQogCQkJCQkJCXJldHVybiBUb2tlbk5hbWV0aGlzOwogCQkJCQkJZWxzZQpAQCAtMzMxNSwxMCArMzQ0MiwxMCBAQAogCS8vZG90UHJlZml4IGlzIHRydWUKIAogCWJvb2xlYW4gZmxvYXRpbmcgPSBkb3RQcmVmaXg7Ci0JaWYgKCghZG90UHJlZml4KSAmJiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcwJykpIHsKKwlpZiAoIWRvdFByZWZpeCAmJiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcwJykpIHsKIAkJaWYgKGdldE5leHRDaGFyKCd4JywgJ1gnKSA+PSAwKSB7IC8vLS0tLS0tLS0tLWhleGEtLS0tLS0tLS0tLS0tLS0tLQogCQkJaW50IHN0YXJ0ID0gdGhpcy5jdXJyZW50UG9zaXRpb247Ci0JCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KDE2KSl7LyplbXB0eSovfQorCQkJY29uc3VtZURpZ2l0cygxNiwgdHJ1ZSk7CiAJCQlpbnQgZW5kID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJCQlpZiAoZ2V0TmV4dENoYXIoJ2wnLCAnTCcpID49IDApIHsKIAkJCQlpZiAoZW5kID09IHN0YXJ0KSB7CkBAIC0zMzI2LDI3ICszNDUzLDIzIEBACiAJCQkJfQogCQkJCXJldHVybiBUb2tlbk5hbWVMb25nTGl0ZXJhbDsKIAkJCX0gZWxzZSBpZiAoZ2V0TmV4dENoYXIoJy4nKSkgewotCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgewotCQkJCQlpZiAoZW5kID09IHN0YXJ0KSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSEVYQSk7Ci0JCQkJCX0KLQkJCQkJdGhpcy5jdXJyZW50UG9zaXRpb24gPSBlbmQ7Ci0JCQkJCXJldHVybiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKLQkJCQl9CiAJCQkJLy8gaGV4YWRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbAogCQkJCS8vIHJlYWQgZGVjaW1hbCBwYXJ0CiAJCQkJYm9vbGVhbiBoYXNOb0RpZ2l0c0JlZm9yZURvdCA9IGVuZCA9PSBzdGFydDsKIAkJCQlzdGFydCA9IHRoaXMuY3VycmVudFBvc2l0aW9uOwotCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoMTYpKXsvKmVtcHR5Ki99CisJCQkJY29uc3VtZURpZ2l0cygxNiwgdHJ1ZSk7CiAJCQkJZW5kID0gdGhpcy5jdXJyZW50UG9zaXRpb247CiAJCQkJaWYgKGhhc05vRGlnaXRzQmVmb3JlRG90ICYmIGVuZCA9PSBzdGFydCkgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9Ci0JCQkJCisKIAkJCQlpZiAoZ2V0TmV4dENoYXIoJ3AnLCAnUCcpID49IDApIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zMzU1LDEwICszNDc4LDEwIEBACiAJCQkJCX0KIAogCQkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLScpCi0JCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCiAJCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zMzY3LDMxICszNDkwLDQ5IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCQl9CisJCQkJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdfJykgeworCQkJCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOREVSU0NPUkUpOworCQkJCQkJfQogCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hFWEEpOwogCQkJCQl9Ci0JCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQorCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKIAkJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKSB7CisJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJCX0KIAkJCQkJCXJldHVybiBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDsKIAkJCQkJfQogCQkJCQlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDApIHsKKwkJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQkJfQogCQkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CiAJCQkJCX0KIAkJCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJCX0KIAkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKLQkJCQkJfQkJCQkJCisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElMTEVHQUxfSEVYQV9MSVRFUkFMKTsKKwkJCQkJfQogCQkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCQl9IGVsc2UgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGdldE5leHRDaGFyKCdwJywgJ1AnKSA+PSAwKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKLQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKLQkJCQkJLy8gaWYgd2UgYXJlIGluIHNvdXJjZSBsZXZlbCA8IDEuNSB3ZSByZXBvcnQgYW4gaW50ZWdlciBsaXRlcmFsCi0JCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uID0gZW5kOwotCQkJCQlyZXR1cm4gVG9rZW5OYW1lSW50ZWdlckxpdGVyYWw7Ci0JCQkJfQogCQkJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM0MDAsMTAgKzM1NDEsMTAgQEAKIAkJCQl9CiAKIAkJCQlpZiAoKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnLScpCi0JCQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQl0aGlzLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAodGhpcy53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC0zNDExLDI4ICszNTUyLDcxIEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJaWYgKCFTY2FubmVySGVscGVyLmlzRGlnaXQodGhpcy5jdXJyZW50Q2hhcmFjdGVyKSkKKwkJCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnXycpIHsKKwkJCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9VTkRFUlNDT1JFKTsKKwkJCQkJfQogCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfRkxPQVQpOwotCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQotCQkJCWlmIChnZXROZXh0Q2hhcignZicsICdGJykgPj0gMCkKKwkJCQl9CisJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsOwotCQkJCWlmIChnZXROZXh0Q2hhcignZCcsICdEJykgPj0gMCkKKwkJCQl9CisJCQkJaWYgKGdldE5leHRDaGFyKCdkJywgJ0QnKSA+PSAwKSB7CisJCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTExFR0FMX0hFWEFfTElURVJBTCk7CisJCQkJCX0KIAkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CisJCQkJfQogCQkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkgeworCQkJCQlpZiAodGhpcy5zb3VyY2VMZXZlbCA8IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCQl9CiAJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9IRVhBKTsKIAkJCQl9CisJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSUxMRUdBTF9IRVhBX0xJVEVSQUwpOworCQkJCX0KIAkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGVuZCA9PSBzdGFydCkKIAkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0hFWEEpOwogCQkJCXJldHVybiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKIAkJCX0KKwkJfSBlbHNlIGlmIChnZXROZXh0Q2hhcignYicsICdCJykgPj0gMCkgeyAvLy0tLS0tLS0tLS1iaW5hcnktLS0tLS0tLS0tLS0tLS0tLQorCQkJaW50IHN0YXJ0ID0gdGhpcy5jdXJyZW50UG9zaXRpb247CisJCQljb25zdW1lRGlnaXRzKDIsIHRydWUpOworCQkJaW50IGVuZCA9IHRoaXMuY3VycmVudFBvc2l0aW9uOworCQkJaWYgKGVuZCA9PSBzdGFydCkgeworCQkJCWlmICh0aGlzLnNvdXJjZUxldmVsIDwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfNykgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKEJJTkFSWV9MSVRFUkFMX05PVF9CRUxPV18xNyk7CisJCQkJfQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9CSU5BUlkpOworCQkJfQorCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oQklOQVJZX0xJVEVSQUxfTk9UX0JFTE9XXzE3KTsKKwkJCQl9CisJCQkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOworCQkJfQorCQkJaWYgKHRoaXMuc291cmNlTGV2ZWwgPCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV83KSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihCSU5BUllfTElURVJBTF9OT1RfQkVMT1dfMTcpOworCQkJfQorCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOwogCQl9CiAKLQkJLy90aGVyZSBpcyB4IG9yIFggaW4gdGhlIG51bWJlcgotCQkvL3BvdGVudGlhbCBvY3RhbCAhIC4uLiBzb21lIG9uZSBtYXkgd3JpdGUgMDAwMDk5LjAgISB0aHVzIDAwMTAwIDwgMDAwNzguMCBpcyB0cnVlICEhISEhIGNyYXp5IGxhbmd1YWdlCisJCS8vdGhlcmUgaXMgbm8geCBvciBYIG5vciBiIG9yIEIgaW4gdGhlIG51bWJlcgorCQkvL3BvdGVudGlhbCBvY3RhbAogCQlpZiAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpIHsgLy8tLS0tLS0tLS0tLS0tcG90ZW50aWFsIG9jdGFsLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSl7LyplbXB0eSovfQorCQkJY29uc3VtZURpZ2l0cygxMCk7CiAKIAkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkgewogCQkJCXJldHVybiBUb2tlbk5hbWVMb25nTGl0ZXJhbDsKQEAgLTM0NDYsMTUgKzM2MzAsMTUgQEAKIAkJCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKIAkJCX0gZWxzZSB7IC8vbWFrZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBvY3RhbCBhbmQgZmxvYXQgLi4uLgogCQkJCWJvb2xlYW4gaXNJbnRlZ2VyID0gdHJ1ZTsKLQkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgeyAKKwkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgewogCQkJCQlpc0ludGVnZXIgPSBmYWxzZTsKLQkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCQkJCWNvbnN1bWVEaWdpdHMoMTApOwogCQkJCX0KIAkJCQlpZiAoZ2V0TmV4dENoYXIoJ2UnLCAnRScpID49IDApIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQlpc0ludGVnZXIgPSBmYWxzZTsKIAkJCQkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJaWYgKCgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID0gdGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewpAQCAtMzQ2MywxMCArMzY0NywxMCBAQAogCQkJCQl9CiAKIAkJCQkJaWYgKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJy0nKQotCQkJCQkJfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQl8fCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQkJdGhpcy51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQotCQkJCQkJCSYmICh0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaWYgKHRoaXMud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewpAQCAtMzQ3NCw5ICszNjU4LDE1IEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWlmICghU2Nhbm5lckhlbHBlci5pc0RpZ2l0KHRoaXMuY3VycmVudENoYXJhY3RlcikpCisJCQkJCWlmICghU2Nhbm5lckhlbHBlci5pc0RpZ2l0KHRoaXMuY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCWlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ18nKSB7CisJCQkJCQkJLy8gd3JvbmdseSBwbGFjZSAnXycKKwkJCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5ERVJTQ09SRSk7CisJCQkJCQl9CiAJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfRkxPQVQpOwotCQkJCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpey8qZW1wdHkqL30KKwkJCQkJfQorCQkJCQljb25zdW1lRGlnaXRzKDEwKTsKIAkJCQl9CiAJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKQogCQkJCQlyZXR1cm4gVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw7CkBAIC0zNDg5LDEzICszNjc5LDEzIEBACiAJCX0KIAl9CiAKLQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpey8qZW1wdHkqL30KKwljb25zdW1lRGlnaXRzKDEwKTsKIAogCWlmICgoIWRvdFByZWZpeCkgJiYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSkKIAkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOwogCiAJaWYgKCghZG90UHJlZml4KSAmJiAoZ2V0TmV4dENoYXIoJy4nKSkpIHsgLy9kZWNpbWFsIHBhcnQgdGhhdCBjYW4gYmUgZW1wdHkKLQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCWNvbnN1bWVEaWdpdHMoMTAsIHRydWUpOwogCQlmbG9hdGluZyA9IHRydWU7CiAJfQogCkBAIC0zNTA2LDcgKzM2OTYsNyBAQAogCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCiAJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCWlmICgoKHRoaXMuY3VycmVudENoYXJhY3RlciA9IHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQotCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKIAkJfSBlbHNlIHsKIAkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM1MTUsMTAgKzM3MDUsMTAgQEAKIAkJfQogCiAJCWlmICgodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICctJykKLQkJCXx8ICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJfHwgKHRoaXMuY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKIAkJCXRoaXMudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CiAJCQlpZiAoKCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIgPSB0aGlzLnNvdXJjZVt0aGlzLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkmJiAodGhpcy5zb3VyY2VbdGhpcy5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJJiYgKHRoaXMuc291cmNlW3RoaXMuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQl9IGVsc2UgewogCQkJCWlmICh0aGlzLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKQEAgLTM1MjYsOSArMzcxNiwxNiBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKQorCQlpZiAoIVNjYW5uZXJIZWxwZXIuaXNEaWdpdCh0aGlzLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQlpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyID09ICdfJykgeworCQkJCS8vIHdyb25nbHkgcGxhY2UgJ18nCisJCQkJY29uc3VtZURpZ2l0cygxMCk7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOREVSU0NPUkUpOworCQkJfQogCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKLQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKXsvKmVtcHR5Ki99CisJCX0KKwkJLy8gY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBkaWdpdCBzbyB3ZSBleHBlY3Qgbm8gZGlnaXQgZmlyc3QgKHRoZSBuZXh0IGNoYXJhY3RlciBjb3VsZCBiZSBhbiB1bmRlcnNjb3JlKQorCQljb25zdW1lRGlnaXRzKDEwKTsKIAl9CiAKIAlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDApCkBAIC0zNTY0LDEwICszNzYxLDEwIEBACiAJdGhpcy5lb2ZQb3NpdGlvbiA9IHNvdXJjZUxlbmd0aDsKIAl0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvc2l0aW9uID0gMDsKIAl0aGlzLmNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IGZhbHNlOwotCXRoaXMubGluZVB0ciA9IC0xOwkKKwl0aGlzLmxpbmVQdHIgPSAtMTsKIH0KIC8qCi0gKiBTaG91bGQgYmUgdXNlZCBpZiBhIHBhcnNlICh1c3VhbGx5IGEgZGlldCBwYXJzZSkgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHVuaXQsIAorICogU2hvdWxkIGJlIHVzZWQgaWYgYSBwYXJzZSAodXN1YWxseSBhIGRpZXQgcGFyc2UpIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkIG9uIHRoZSB1bml0LAogICogc28gYXMgdG8gZ2V0IHRoZSBhbHJlYWR5IGNvbXB1dGVkIGxpbmUgZW5kIHBvc2l0aW9ucy4KICAqLwogcHVibGljIGZpbmFsIHZvaWQgc2V0U291cmNlKGNoYXJbXSBjb250ZW50cywgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKQEAgLTM1ODQsNyArMzc4MSw3IEBACiAJfQogfQogLyoKLSAqIFNob3VsZCBiZSB1c2VkIGlmIGEgcGFyc2UgKHVzdWFsbHkgYSBkaWV0IHBhcnNlKSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgdW5pdCwgCisgKiBTaG91bGQgYmUgdXNlZCBpZiBhIHBhcnNlICh1c3VhbGx5IGEgZGlldCBwYXJzZSkgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHVuaXQsCiAgKiBzbyBhcyB0byBnZXQgdGhlIGFscmVhZHkgY29tcHV0ZWQgbGluZSBlbmQgcG9zaXRpb25zLgogICovCiBwdWJsaWMgZmluYWwgdm9pZCBzZXRTb3VyY2UoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKQEAgLTM1OTUsMzcgKzM3OTIsMjkgQEAKIAkJcmV0dXJuICJFT0ZcblxuIiArIG5ldyBTdHJpbmcodGhpcy5zb3VyY2UpOyAvLyROT04tTkxTLTEkCiAJaWYgKHRoaXMuY3VycmVudFBvc2l0aW9uID4gdGhpcy5lb2ZQb3NpdGlvbikKIAkJcmV0dXJuICJiZWhpbmQgdGhlIEVPRlxuXG4iICsgbmV3IFN0cmluZyh0aGlzLnNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKKwlpZiAodGhpcy5jdXJyZW50UG9zaXRpb24gPD0gMCkKKwkJcmV0dXJuICJOT1Qgc3RhcnRlZCFcblxuIisgbmV3IFN0cmluZyh0aGlzLnNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKIAotCWNoYXIgZnJvbnRbXSA9IG5ldyBjaGFyW3RoaXMuc3RhcnRQb3NpdGlvbl07Ci0JU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgMCwgZnJvbnQsIDAsIHRoaXMuc3RhcnRQb3NpdGlvbik7Ci0KLQlpbnQgbWlkZGxlTGVuZ3RoID0gKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkgLSB0aGlzLnN0YXJ0UG9zaXRpb24gKyAxOwotCWNoYXIgbWlkZGxlW107Ci0JaWYgKG1pZGRsZUxlbmd0aCA+IC0xKSB7Ci0JCW1pZGRsZSA9IG5ldyBjaGFyW21pZGRsZUxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQl0aGlzLnNvdXJjZSwgCi0JCQl0aGlzLnN0YXJ0UG9zaXRpb24sIAotCQkJbWlkZGxlLCAKLQkJCTAsIAotCQkJbWlkZGxlTGVuZ3RoKTsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPCAxMDAwKSB7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIDAsIHRoaXMuc3RhcnRQb3NpdGlvbik7CiAJfSBlbHNlIHsKLQkJbWlkZGxlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQlidWZmZXIuYXBwZW5kKCI8c291cmNlIGJlZ2lubmluZz5cbi4uLlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGxpbmUgPSBVdGlsLmdldExpbmVOdW1iZXIodGhpcy5zdGFydFBvc2l0aW9uLTEwMDAsIHRoaXMubGluZUVuZHMsIDAsIHRoaXMubGluZVB0cik7CisJCWludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIGxpbmVTdGFydCwgdGhpcy5zdGFydFBvc2l0aW9uLWxpbmVTdGFydCk7CiAJfQotCQotCWNoYXIgZW5kW10gPSBuZXcgY2hhclt0aGlzLmVvZlBvc2l0aW9uIC0gKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSldOwotCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRoaXMuc291cmNlLCAKLQkJKHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMSkgKyAxLCAKLQkJZW5kLCAKLQkJMCwgCi0JCXRoaXMuZW9mUG9zaXRpb24gLSAodGhpcy5jdXJyZW50UG9zaXRpb24gLSAxKSAtIDEpOwotCQotCXJldHVybiBuZXcgU3RyaW5nKGZyb250KQotCQkrICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblN0YXJ0cyBoZXJlIC0tPiIgLy8kTk9OLU5MUy0xJAotCQkrIG5ldyBTdHJpbmcobWlkZGxlKQotCQkrICI8LS0gRW5kcyBoZXJlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iIC8vJE5PTi1OTFMtMSQKLQkJKyBuZXcgU3RyaW5nKGVuZCk7IAorCisJYnVmZmVyLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5TdGFydHMgaGVyZSAtLT4iKTsgLy8kTk9OLU5MUy0xJAorCWludCBtaWRkbGVMZW5ndGggPSAodGhpcy5jdXJyZW50UG9zaXRpb24gLSAxKSAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDE7CisJaWYgKG1pZGRsZUxlbmd0aCA+IC0xKSB7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsIHRoaXMuc3RhcnRQb3NpdGlvbiwgbWlkZGxlTGVuZ3RoKTsKKwl9CisJYnVmZmVyLmFwcGVuZCgiPC0tIEVuZHMgaGVyZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7IC8vJE5PTi1OTFMtMSQKKworCWJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2UsICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpICsgMSwgdGhpcy5lb2ZQb3NpdGlvbiAtICh0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDEpIC0gMSk7CisKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nQWN0aW9uKGludCBhY3QpIHsKIAlzd2l0Y2ggKGFjdCkgewpAQCAtMzg0MiwyMSArNDAzMSwxMDYgQEAKIAl9CiB9CiBwdWJsaWMgdm9pZCB1bmljb2RlSW5pdGlhbGl6ZUJ1ZmZlcihpbnQgbGVuZ3RoKSB7Ci0JdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IGxlbmd0aDsJCi0gICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPT0gbnVsbCkgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCsoMSsxMCldOwotICAgIGludCBiTGVuZ3RoID0gdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlci5sZW5ndGg7Ci0gICAgaWYgKDErbGVuZ3RoID49IGJMZW5ndGgpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAwLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICsgKDErMTApXSwgMCwgYkxlbmd0aCk7Ci0gICAgfQotCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zb3VyY2UsIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMSwgbGVuZ3RoKTsgICAgCisJdGhpcy53aXRob3V0VW5pY29kZVB0ciA9IGxlbmd0aDsKKwlpZiAodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9PSBudWxsKSB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoKygxKzEwKV07CisJaW50IGJMZW5ndGggPSB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLmxlbmd0aDsKKwlpZiAoMStsZW5ndGggPj0gYkxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIsIDAsIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKyAoMSsxMCldLCAwLCBiTGVuZ3RoKTsKKwl9CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLnNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAxLCBsZW5ndGgpOwogfQogcHVibGljIHZvaWQgdW5pY29kZVN0b3JlKCkgewogCWludCBwb3MgPSArK3RoaXMud2l0aG91dFVuaWNvZGVQdHI7Ci0gICAgaWYgKHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPT0gbnVsbCkgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyWzEwXTsKLSAgICBpbnQgbGVuZ3RoID0gdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlci5sZW5ndGg7Ci0gICAgaWYgKHBvcyA9PSBsZW5ndGgpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyLCAwLCB0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICogMl0sIDAsIGxlbmd0aCk7Ci0gICAgfQorCWlmICh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID09IG51bGwpIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhclsxMF07CisJaW50IGxlbmd0aCA9IHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIubGVuZ3RoOworCWlmIChwb3MgPT0gbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMCwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCX0KIAl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyW3Bvc10gPSB0aGlzLmN1cnJlbnRDaGFyYWN0ZXI7CiB9CitwdWJsaWMgdm9pZCB1bmljb2RlU3RvcmUoY2hhciBjaGFyYWN0ZXIpIHsKKwlpbnQgcG9zID0gKyt0aGlzLndpdGhvdXRVbmljb2RlUHRyOworCWlmICh0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyID09IG51bGwpIHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhclsxMF07CisJaW50IGxlbmd0aCA9IHRoaXMud2l0aG91dFVuaWNvZGVCdWZmZXIubGVuZ3RoOworCWlmIChwb3MgPT0gbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciwgMCwgdGhpcy53aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdLCAwLCBsZW5ndGgpOworCX0KKwl0aGlzLndpdGhvdXRVbmljb2RlQnVmZmVyW3Bvc10gPSBjaGFyYWN0ZXI7Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lkZW50aWZpZXIoaW50IHRva2VuKSB7CisJcmV0dXJuIHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXI7Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpdGVyYWwoaW50IHRva2VuKSB7CisJc3dpdGNoKHRva2VuKSB7CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSW50ZWdlckxpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTG9uZ0xpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTdHJpbmdMaXRlcmFsOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tleXdvcmQoaW50IHRva2VuKSB7CisJc3dpdGNoKHRva2VuKSB7CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYWJzdHJhY3Q6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYXNzZXJ0OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWJ5dGU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnJlYWs6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYm9vbGVhbjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVjYXNlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXI6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2F0Y2g6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2xhc3M6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY29udGludWU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG86CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG91YmxlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWRlZmF1bHQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZWxzZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVleHRlbmRzOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZvcjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmaW5hbDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmYWxzZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmaW5hbGx5OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWlmOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVpbXBvcnQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50ZXJmYWNlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWltcGxlbWVudHM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW5zdGFuY2VvZjoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVsb25nOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZW5ldzoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVudWxsOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZW5hdGl2ZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwdWJsaWM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lcGFja2FnZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVwcml2YXRlOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXByb3RlY3RlZDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVyZXR1cm46CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc2hvcnQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXI6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3RhdGljOgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXN3aXRjaDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzdHJpY3RmcDoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVzeW5jaHJvbml6ZWQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ5OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRoaXM6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJ1ZToKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aHJvdzoKKwkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWV0aHJvd3M6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldHJhbnNpZW50OgorCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXZvaWQ6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldm9sYXRpbGU6CisJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ld2hpbGU6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwl9Cit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1JlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1JlY29yZGVkUGFyc2luZ0luZm9ybWF0aW9uLmphdmEKaW5kZXggOWNkMzFlNy4uM2RkOWVkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZWNvcmRlZFBhcnNpbmdJbmZvcm1hdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiwxNCArMjIsMTQgQEAKIAlwdWJsaWMgaW50IHByb2JsZW1zQ291bnQ7CiAJcHVibGljIGludFtdIGxpbmVFbmRzOwogCXB1YmxpYyBpbnRbXVtdIGNvbW1lbnRQb3NpdGlvbnM7Ci0JCisKIAlwdWJsaWMgUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24oQ2F0ZWdvcml6ZWRQcm9ibGVtW10gcHJvYmxlbXMsIGludFtdIGxpbmVFbmRzLCBpbnRbXVtdIGNvbW1lbnRQb3NpdGlvbnMpIHsKIAkJdGhpcy5wcm9ibGVtcyA9IHByb2JsZW1zOwogCQl0aGlzLmxpbmVFbmRzID0gbGluZUVuZHM7CiAJCXRoaXMuY29tbWVudFBvc2l0aW9ucyA9IGNvbW1lbnRQb3NpdGlvbnM7CiAJCXRoaXMucHJvYmxlbXNDb3VudCA9IHByb2JsZW1zICE9IG51bGwgPyBwcm9ibGVtcy5sZW5ndGggOiAwOwogCX0KLQkKKwogCXZvaWQgdXBkYXRlUmVjb3JkZWRQYXJzaW5nSW5mb3JtYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKIAkJaWYgKGNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1zICE9IG51bGwpIHsKIAkJCXRoaXMucHJvYmxlbXMgPSBjb21waWxhdGlvblJlc3VsdC5wcm9ibGVtczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVmZXJlbmNlSW5mb0FkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVmZXJlbmNlSW5mb0FkYXB0ZXIuamF2YQppbmRleCBmYmExMjEyLi5lNWQzYzkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1JlZmVyZW5jZUluZm9BZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZWZlcmVuY2VJbmZvQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDYgKzE4LDE4IEBACiAvKioKICAqIERvZXMgbm90aGluZy4KICAqLworcHVibGljIHZvaWQgYWNjZXB0QW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY2hhcltdW10gdHlwZU5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCS8vIERvZXMgbm90aGluZworfQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJLy8gRG9lcyBub3RoaW5nCit9CisvKioKKyAqIERvZXMgbm90aGluZy4KKyAqLwogcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoY2hhcltdIHR5cGVOYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbikgewogCS8vIERvZXMgbm90aGluZwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCmluZGV4IDBlNTVmZmYuLmY4MmE0YWEgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVzb3VyY2VDb21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1Jlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsOSArMjEsOSBAQAogICogQW4gSUNvbXBpbGF0aW9uVW5pdCB0aGF0IHJldHJpZXZlcyBpdHMgY29udGVudHMgdXNpbmcgYW4gSUZpbGUKICAqLwogcHVibGljIGNsYXNzIFJlc291cmNlQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgQ29tcGlsYXRpb25Vbml0IHsKLQkKKwogCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkKKwogCXB1YmxpYyBSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJRmlsZSBmaWxlLCBVUkkgbG9jYXRpb24pIHsKIAkJc3VwZXIobnVsbC8qbm8gY29udGVudHMqLywgbG9jYXRpb24gPT0gbnVsbCA/IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogbG9jYXRpb24uZ2V0UGF0aCgpLCBudWxsLyplbmNvZGluZyBpcyB1c2VkIG9ubHkgd2hlbiByZXRyaWV2aW5nIHRoZSBjb250ZW50cyovKTsKIAkJdGhpcy5maWxlID0gZmlsZTsKQEAgLTMyLDcgKzMyLDcgQEAKIAlwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgewogCQlpZiAodGhpcy5jb250ZW50cyAhPSBudWxsKQogCQkJcmV0dXJuIHRoaXMuY29udGVudHM7ICAgLy8gYW5zd2VyIHRoZSBjYWNoZWQgc291cmNlCi0JCisKIAkJLy8gb3RoZXJ3aXNlIHJldHJpZXZlIGl0CiAJCXRyeSB7CiAJCQlyZXR1cm4gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkodGhpcy5maWxlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9uc0F0dHJpYnV0ZS5qYXZhCmluZGV4IDI1OTg1NDYuLmE4ODMzYmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUnVudGltZUludmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUFubm90YXRpb25bXSBOT19FTlRSSUVTID0gbmV3IElBbm5vdGF0aW9uWzBdOwogCXByaXZhdGUgaW50IGFubm90YXRpb25zTnVtYmVyOwogCXByaXZhdGUgSUFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMuCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCAwOTlhMDMyLi5lMTRhZjgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjUsNyArMjUsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXJhbWV0ZXJBbm5vdGF0aW9uW10gTk9fRU5UUklFUyA9IG5ldyBJUGFyYW1ldGVyQW5ub3RhdGlvblswXTsKIAlwcml2YXRlIElQYXJhbWV0ZXJBbm5vdGF0aW9uW10gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CiAJcHJpdmF0ZSBpbnQgcGFyYW1ldGVyc051bWJlcjsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zLgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SdW50aW1lVmlzaWJsZUFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCA2MmFmNWIxLi40YzFkZDJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUFubm90YXRpb25bXSBOT19FTlRSSUVTID0gbmV3IElBbm5vdGF0aW9uWzBdOwogCXByaXZhdGUgaW50IGFubm90YXRpb25zTnVtYmVyOwogCXByaXZhdGUgSUFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBSdW50aW1lVmlzaWJsZUFubm90YXRpb25zLgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQppbmRleCA2ZjNlOGQxLi4wMGNlZDIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1J1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw3ICsyNSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhcmFtZXRlckFubm90YXRpb25bXSBOT19FTlRSSUVTID0gbmV3IElQYXJhbWV0ZXJBbm5vdGF0aW9uWzBdOwogCXByaXZhdGUgaW50IHBhcmFtZXRlcnNOdW1iZXI7CiAJcHJpdmF0ZSBJUGFyYW1ldGVyQW5ub3RhdGlvbltdIHBhcmFtZXRlckFubm90YXRpb25zOwotCQorCiAJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIFJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMuCiAJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NpZ25hdHVyZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TaWduYXR1cmVBdHRyaWJ1dGUuamF2YQppbmRleCBlNmU2NWIxLi4wYzhjMzExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NpZ25hdHVyZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2lnbmF0dXJlQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTAgKzIwLDEwIEBACiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTaWduYXR1cmVBdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUgaW1wbGVtZW50cyBJU2lnbmF0dXJlQXR0cmlidXRlIHsKLQkKKwogCXByaXZhdGUgaW50IHNpZ25hdHVyZUluZGV4OwogCXByaXZhdGUgY2hhcltdIHNpZ25hdHVyZTsKLQkKKwogCVNpZ25hdHVyZUF0dHJpYnV0ZShieXRlW10gY2xhc3NGaWxlQnl0ZXMsIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewogCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOwogCQlmaW5hbCBpbnQgaW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TaW1wbGVEb2N1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TaW1wbGVEb2N1bWVudC5qYXZhCmluZGV4IDdmYjQzODYuLmQ5YmI5ZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlRG9jdW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NpbXBsZURvY3VtZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsMTQgKzIzLDE0IEBACiAgKiBNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIElEb2N1bWVudCB0byBhcHBseSB0ZXh0IGVkaXQgb250byBhIHN0cmluZy4KICAqLwogcHVibGljIGNsYXNzIFNpbXBsZURvY3VtZW50IGltcGxlbWVudHMgSURvY3VtZW50IHsKLQkKKwogCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKIAotCQorCiAJcHVibGljIFNpbXBsZURvY3VtZW50KFN0cmluZyBzb3VyY2UpIHsKIAkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZSk7CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0Q2hhcihpbnQpCiAJICovCkBAIC03MCw3ICs3MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZXBsYWNlKGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLwogCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJCisKIAkJdGhpcy5idWZmZXIucmVwbGFjZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgdGV4dCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NpbXBsZVdvcmRTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlV29yZFNldC5qYXZhCmluZGV4IGE5ZTYxOTcuLmZmNGU0NGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlV29yZFNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlV29yZFNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMyLDE0ICszMiwxNCBAQAogCWludCBsZW5ndGggPSB0aGlzLndvcmRzLmxlbmd0aDsKIAlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHdvcmQpICUgbGVuZ3RoOwogCWNoYXJbXSBjdXJyZW50OwotCXdoaWxlICgoY3VycmVudCA9IHdvcmRzW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudCA9IHRoaXMud29yZHNbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50LCB3b3JkKSkgcmV0dXJuIGN1cnJlbnQ7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KLQl3b3Jkc1tpbmRleF0gPSB3b3JkOworCXRoaXMud29yZHNbaW5kZXhdID0gd29yZDsKIAogCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKLQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgcmVoYXNoKCk7CisJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKSByZWhhc2goKTsKIAlyZXR1cm4gd29yZDsKIH0KIApAQCAtNDcsNyArNDcsNyBAQAogCWludCBsZW5ndGggPSB0aGlzLndvcmRzLmxlbmd0aDsKIAlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHdvcmQpICUgbGVuZ3RoOwogCWNoYXJbXSBjdXJyZW50OwotCXdoaWxlICgoY3VycmVudCA9IHdvcmRzW2luZGV4XSkgIT0gbnVsbCkgeworCXdoaWxlICgoY3VycmVudCA9IHRoaXMud29yZHNbaW5kZXhdKSAhPSBudWxsKSB7CiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50LCB3b3JkKSkgcmV0dXJuIHRydWU7CiAJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOwogCX0KQEAgLTU1LDEwICs1NSwxMCBAQAogfQogCiBwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCVNpbXBsZVdvcmRTZXQgbmV3U2V0ID0gbmV3IFNpbXBsZVdvcmRTZXQoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlTaW1wbGVXb3JkU2V0IG5ld1NldCA9IG5ldyBTaW1wbGVXb3JkU2V0KHRoaXMuZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAljaGFyW10gY3VycmVudDsKLQlmb3IgKGludCBpID0gd29yZHMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICgoY3VycmVudCA9IHdvcmRzW2ldKSAhPSBudWxsKQorCWZvciAoaW50IGkgPSB0aGlzLndvcmRzLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoKGN1cnJlbnQgPSB0aGlzLndvcmRzW2ldKSAhPSBudWxsKQogCQkJbmV3U2V0LmFkZChjdXJyZW50KTsKIAogCXRoaXMud29yZHMgPSBuZXdTZXQud29yZHM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NvdXJjZUZpbGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU291cmNlRmlsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGZjYmEzM2QuLjM3YTU3MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU291cmNlRmlsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU291cmNlRmlsZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI1LDcgKzI1LDcgQEAKIAogCXByaXZhdGUgaW50IHNvdXJjZUZpbGVJbmRleDsKIAlwcml2YXRlIGNoYXJbXSBzb3VyY2VGaWxlTmFtZTsKLQkKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBTb3VyY2VGaWxlQXR0cmlidXRlLgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdGFja01hcEF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdGFja01hcEF0dHJpYnV0ZS5qYXZhCmluZGV4IDVjMzJhNjQuLmU2ODZjN2MgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RhY2tNYXBBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0YWNrTWFwQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjcsNyArMjcsNyBAQAogCiAJcHJpdmF0ZSBpbnQgbnVtYmVyT2ZFbnRyaWVzOwogCXByaXZhdGUgSVN0YWNrTWFwRnJhbWVbXSBmcmFtZXM7Ci0JCisKIAlwcml2YXRlIGJ5dGVbXSBieXRlczsKIAogCS8qKgpAQCAtNDMsOCArNDMsOCBAQAogCQkJaW50IG9mZnNldCkKIAkJCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7Ci0JCQotCQlmaW5hbCBpbnQgbGVuZ3RoID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsgCisKKwkJZmluYWwgaW50IGxlbmd0aCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CiAJCXRoaXMubnVtYmVyT2ZFbnRyaWVzID0gbGVuZ3RoOwogCQlpZiAobGVuZ3RoICE9IDApIHsKIAkJCWludCByZWFkT2Zmc2V0ID0gODsKQEAgLTU4LDcgKzU4LDcgQEAKIAkJCXRoaXMuZnJhbWVzID0gTk9fRlJBTUVTOwogCQl9CiAJCWZpbmFsIGludCBieXRlTGVuZ3RoID0gKGludCkgdTRBdChjbGFzc0ZpbGVCeXRlcywgMiwgb2Zmc2V0KTsKLQkJCisKIAkJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzRmlsZUJ5dGVzLCBvZmZzZXQgKyA2LCB0aGlzLmJ5dGVzID0gbmV3IGJ5dGVbYnl0ZUxlbmd0aF0sIDAsIGJ5dGVMZW5ndGgpOwogCQl9IGVsc2UgewpAQCAtNzMsNyArNzMsNyBAQAogCXB1YmxpYyBJU3RhY2tNYXBGcmFtZVtdIGdldFN0YWNrTWFwRnJhbWUoKSB7CiAJCXJldHVybiB0aGlzLmZyYW1lczsKIAl9Ci0JCisKIAkvKioKIAkgKi8KIAlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdGFja01hcEZyYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0YWNrTWFwRnJhbWUuamF2YQppbmRleCAzZTZkMDYwLi4xMGRjZjhlIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0YWNrTWFwRnJhbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0YWNrTWFwRnJhbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCwxMCArMjgsMTAgQEAKIAlwcml2YXRlIElWZXJpZmljYXRpb25UeXBlSW5mb1tdIGxvY2FsczsKIAlwcml2YXRlIElWZXJpZmljYXRpb25UeXBlSW5mb1tdIHN0YWNrSXRlbXM7CiAJcHJpdmF0ZSBpbnQgb2Zmc2V0RGVsdGE7Ci0JCisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgU3RhY2tNYXBGcmFtZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcwogCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKIAkgKiBAcGFyYW0gb2Zmc2V0CkBAIC00MSw3ICs0MSw3IEBACiAJCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMsCiAJCQlJQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCwKIAkJCWludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCQorCiAJCWZpbmFsIGludCB0eXBlID0gdTFBdChjbGFzc0ZpbGVCeXRlcywgMCwgb2Zmc2V0KTsKIAkJdGhpcy5mcmFtZVR5cGUgPSB0eXBlOwogCQlzd2l0Y2godHlwZSkgewpAQCAtODgsNyArODgsNyBAQAogCQkJCXRoaXMubnVtYmVyT2ZMb2NhbHMgPSBkaWZmTG9jYWxzOwogCQkJCXRoaXMubG9jYWxzID0gbmV3IElWZXJpZmljYXRpb25UeXBlSW5mb1tkaWZmTG9jYWxzXTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpZmZMb2NhbHM7IGkrKykgewotCQkJCQlWZXJpZmljYXRpb25JbmZvIHZlcmlmaWNhdGlvbkluZm8gPSBuZXcgVmVyaWZpY2F0aW9uSW5mbyhjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCQkJVmVyaWZpY2F0aW9uSW5mbyB2ZXJpZmljYXRpb25JbmZvID0gbmV3IFZlcmlmaWNhdGlvbkluZm8oY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgdGhpcy5yZWFkT2Zmc2V0KTsKIAkJCQkJdGhpcy5sb2NhbHNbaV0gPSB2ZXJpZmljYXRpb25JbmZvOwogCQkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gdmVyaWZpY2F0aW9uSW5mby5zaXplSW5CeXRlcygpOwogCQkJCX0KQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCXRoaXMubG9jYWxzID0gRU1QVFlfTE9DQUxTX09SX1NUQUNLX0lURU1TOwogCQkJCX0KLQkJCQlpbnQgdGVtcFN0YWNrSXRlbXMgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCBvZmZzZXQpOworCQkJCWludCB0ZW1wU3RhY2tJdGVtcyA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHRoaXMucmVhZE9mZnNldCwgb2Zmc2V0KTsKIAkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gMjsKIAkJCQl0aGlzLm51bWJlck9mU3RhY2tJdGVtcyA9IHRlbXBTdGFja0l0ZW1zOwogCQkJCWlmICh0ZW1wU3RhY2tJdGVtcyAhPSAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1N0YWNrTWFwVGFibGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGExODRmOTcuLmIxNGY0MjIgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RhY2tNYXBUYWJsZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDcgKzI3LDcgQEAKIAogCXByaXZhdGUgaW50IG51bWJlck9mRW50cmllczsKIAlwcml2YXRlIElTdGFja01hcEZyYW1lW10gZnJhbWVzOwotCQorCiAJcHJpdmF0ZSBieXRlW10gYnl0ZXM7CiAKIAkvKioKQEAgLTQzLDggKzQzLDggQEAKIAkJCWludCBvZmZzZXQpCiAJCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24gewogCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOwotCQkKLQkJZmluYWwgaW50IGxlbmd0aCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7IAorCisJCWZpbmFsIGludCBsZW5ndGggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOwogCQl0aGlzLm51bWJlck9mRW50cmllcyA9IGxlbmd0aDsKIAkJaWYgKGxlbmd0aCAhPSAwKSB7CiAJCQlpbnQgcmVhZE9mZnNldCA9IDg7CkBAIC01OCw3ICs1OCw3IEBACiAJCQl0aGlzLmZyYW1lcyA9IE5PX0ZSQU1FUzsKIAkJfQogCQlmaW5hbCBpbnQgYnl0ZUxlbmd0aCA9IChpbnQpIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIDIsIG9mZnNldCk7Ci0JCQorCiAJCWlmIChsZW5ndGggIT0gMCkgewogCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc0ZpbGVCeXRlcywgb2Zmc2V0ICsgNiwgdGhpcy5ieXRlcyA9IG5ldyBieXRlW2J5dGVMZW5ndGhdLCAwLCBieXRlTGVuZ3RoKTsKIAkJfSBlbHNlIHsKQEAgLTczLDcgKzczLDcgQEAKIAlwdWJsaWMgSVN0YWNrTWFwRnJhbWVbXSBnZXRTdGFja01hcEZyYW1lKCkgewogCQlyZXR1cm4gdGhpcy5mcmFtZXM7CiAJfQotCQorCiAJLyoqCiAJICovCiAJcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVG9TdHJpbmdTb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVG9TdHJpbmdTb3J0ZXIuamF2YQppbmRleCAxYjcxMWI4Li5iMTE1Y2U2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1RvU3RyaW5nU29ydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Ub1N0cmluZ1NvcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM0LDcgKzM0LDcgQEAKIAlpbnQgb3JpZ2luYWxSaWdodCA9IHJpZ2h0OwogCWludCBtaWRJbmRleCA9ICBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCkgLyAyOwogCVN0cmluZyBtaWRUb1N0cmluZyA9IHRoaXMuc29ydGVkU3RyaW5nc1ttaWRJbmRleF07Ci0JCisKIAlkbyB7CiAJCXdoaWxlIChjb21wYXJlKHRoaXMuc29ydGVkU3RyaW5nc1tsZWZ0XSwgbWlkVG9TdHJpbmcpKQogCQkJbGVmdCsrOwpAQCAtNTEsNyArNTEsNyBAQAogCQkJcmlnaHQtLTsKIAkJfQogCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCQorCiAJaWYgKG9yaWdpbmFsTGVmdCA8IHJpZ2h0KQogCQlxdWlja1NvcnQob3JpZ2luYWxMZWZ0LCByaWdodCk7CiAJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQpAQCAtNjUsOCArNjUsOCBAQAogCWludCBzaXplID0gdW5Tb3J0ZWRPYmplY3RzLmxlbmd0aDsKIAl0aGlzLnNvcnRlZE9iamVjdHMgPSBuZXcgT2JqZWN0W3NpemVdOwogCXRoaXMuc29ydGVkU3RyaW5ncyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCi0JLy9jb3B5IHRoZSBhcnJheSBzbyBjYW4gcmV0dXJuIGEgbmV3IHNvcnRlZCBjb2xsZWN0aW9uICAKKworCS8vY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgogCVN5c3RlbS5hcnJheWNvcHkodW5Tb3J0ZWRPYmplY3RzLCAwLCB0aGlzLnNvcnRlZE9iamVjdHMsIDAsIHNpemUpOwogCVN5c3RlbS5hcnJheWNvcHkodW5zb3J0ZWRTdHJpbmdzLCAwLCB0aGlzLnNvcnRlZFN0cmluZ3MsIDAsIHNpemUpOwogCWlmIChzaXplID4gMSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKaW5kZXggNmQ4MGEyMi4uMjAyMzk1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzksMTQgKzM5LDMzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRmllbGRJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1ldGhvZEluZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5VbmlvblR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5DbGFzc1NpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkVudW1Db25zdGFudFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSURlcGVuZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk1lbWJlclZhbHVlUGFpcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKQEAgLTcyLDEyICs5MSwxNiBAQAogCQkgKi8KIAkJaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKTsKIAl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UU19ERUxJTUlURVIgPSAiIyI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEJpbmRpbmdzVG9Ob2Rlc01hcCB7CisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGUgZ2V0KEJpbmRpbmcgYmluZGluZyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBUkdVTUVOVFNfREVMSU1JVEVSID0gJyMnOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0FSR1VNRU5UID0gIiAgICI7IC8vJE5PTi1OTFMtMSQKLQkKKwogCXByaXZhdGUgc3RhdGljIGNoYXJbXVtdIEpBVkFfTElLRV9FWFRFTlNJT05TOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFTkFCTEVfSkFWQV9MSUtFX0VYVEVOU0lPTlMgPSB0cnVlOwogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJPT0xFQU4gPSAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCWVRFID0gImJ5dGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKQEAgLTg5LDExICsxMTIsMTQgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0hPUlQgPSAic2hvcnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVk9JRCA9ICJ2b2lkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIElOSVQgPSAiPGluaXQ+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19QUklPUklUSUVTX1BST0JMRU0gPSAiVEFTS19QUklPUklUSUVTX1BCIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIExpc3QgZmdSZXBlYXRlZE1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KDUpOworCiAJcHJpdmF0ZSBVdGlsKCkgewogCQkvLyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyBhIG5ldyBhcnJheSBhZGRpbmcgdGhlIHNlY29uZCBhcnJheSBhdCB0aGUgZW5kIG9mIGZpcnN0IGFycmF5LgogCSAqIEl0IGFuc3dlcnMgbnVsbCBpZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmUgbnVsbC4KQEAgLTEyMSw3ICsxNDcsNyBAQAogCSAqIDwvcHJlPgogCSAqIDwvbGk+CiAJICogPC9vbD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKIAkgKiBAcGFyYW0gc2Vjb25kIHRoZSBhcnJheSB0byBhZGQgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgYXJyYXkKIAkgKiBAcmV0dXJuIGEgbmV3IGFycmF5IGFkZGluZyB0aGUgc2Vjb25kIGFycmF5IGF0IHRoZSBlbmQgb2YgZmlyc3QgYXJyYXksIG9yIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCkBAIC0xMzYsNyArMTYyLDcgQEAKIAkJaWYgKGZpcnN0Lmxlbmd0aCA9PSAwKSB7CiAJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtzZWNvbmR9OwogCQl9Ci0JCQorCiAJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGVuZ3RoICsgMV07CiAJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKIAkJcmVzdWx0W2xlbmd0aF0gPSBzZWNvbmQ7CkBAIC0xNDQsNyArMTcwLDcgQEAKIAl9CiAKIAkvKioKLQkgKiBDaGVja3MgdGhlIHR5cGUgc2lnbmF0dXJlIGluIFN0cmluZyBzaWcsIAorCSAqIENoZWNrcyB0aGUgdHlwZSBzaWduYXR1cmUgaW4gU3RyaW5nIHNpZywKIAkgKiBzdGFydGluZyBhdCBzdGFydCBhbmQgZW5kaW5nIGJlZm9yZSBlbmQgKGVuZCBpcyBub3QgaW5jbHVkZWQpLgogCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNpZ25hdHVyZSBpZiB2YWxpZCwKIAkgKiBvciAtMSBpZiBub3QgdmFsaWQuCkBAIC0xNjEsMTIgKzE4NywxMiBAQAogCQl9CiAJCXN3aXRjaCAoYykgewogCQkJY2FzZSAnQic6Ci0JCQljYXNlICdDJzogCisJCQljYXNlICdDJzoKIAkJCWNhc2UgJ0QnOgogCQkJY2FzZSAnRic6CiAJCQljYXNlICdJJzoKIAkJCWNhc2UgJ0onOgotCQkJY2FzZSAnUyc6IAorCQkJY2FzZSAnUyc6CiAJCQljYXNlICdaJzoKIAkJCQlicmVhazsKIAkJCWNhc2UgJ1YnOgpAQCAtMTg1LDE2ICsyMTEsMTYgQEAKIAkJfQogCQlyZXR1cm4gaTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb21iaW5lcyB0d28gaGFzaCBjb2RlcyB0byBtYWtlIGEgbmV3IG9uZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGludCBjb21iaW5lSGFzaENvZGVzKGludCBoYXNoQ29kZTEsIGludCBoYXNoQ29kZTIpIHsKIAkJcmV0dXJuIGhhc2hDb2RlMSAqIDE3ICsgaGFzaENvZGUyOwogCX0KLQkKKwogCS8qKgotCSAqIENvbXBhcmVzIHR3byBieXRlIGFycmF5cy4gIAorCSAqIENvbXBhcmVzIHR3byBieXRlIGFycmF5cy4KIAkgKiBSZXR1cm5zIDwwIGlmIGEgYnl0ZSBpbiBhIGlzIGxlc3MgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIGIsIG9yIGlmIGEgaXMgc2hvcnRlciwgb3IgaWYgYSBpcyBudWxsLgogCSAqIFJldHVybnMgPjAgaWYgYSBieXRlIGluIGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgaW4gYiwgb3IgaWYgYSBpcyBsb25nZXIsIG9yIGlmIGIgaXMgbnVsbC4KIAkgKiBSZXR1cm5zIDAgaWYgdGhleSBhcmUgZXF1YWwgb3IgYm90aCBudWxsLgpAQCAtMjE5LDEzICsyNDUsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCS8qKgotCSAqIENvbXBhcmVzIHR3byBzdHJpbmdzIGxleGljb2dyYXBoaWNhbGx5LiAKKwkgKiBDb21wYXJlcyB0d28gc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4KIAkgKiBUaGUgY29tcGFyaXNvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciBpbgotCSAqIHRoZSBzdHJpbmdzLiAKKwkgKiB0aGUgc3RyaW5ncy4KIAkgKgogCSAqIEByZXR1cm4gIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgc3RyMSBpcyBlcXVhbCB0byBzdHIyOwogCSAqICAgICAgICAgIGEgdmFsdWUgbGVzcyB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIHN0cjEKLQkgKiAgICAgICAgICBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gc3RyMjsgCisJICogICAgICAgICAgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIHN0cjI7CiAJICogICAgICAgICAgYW5kIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIHN0cjEgaXMKIAkgKiAgICAgICAgICBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyIHRoYW4gc3RyMi4KIAkgKi8KQEAgLTI0Myw0NCArMjY5LDQxIEBACiAJCX0KIAkJcmV0dXJuIGxlbjEgLSBsZW4yOwogCX0KLQogCS8qKgotCSAqIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzIHdpdGggYSBjaGFyIGluIGJldHdlZW4uCi0JICogQHNlZSAjY29uY2F0KFN0cmluZywgU3RyaW5nKQorCSAqIENvbmNhdGVuYXRlIGEgU3RyaW5nW10gY29tcG91bmQgbmFtZSB0byBhIGNvbnRpbnVvdXMgY2hhcltdLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIGNoYXIgYywgU3RyaW5nIHMyKSB7Ci0JCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoczIgPT0gbnVsbCkgczIgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGwxID0gczEubGVuZ3RoKCk7Ci0JCWludCBsMiA9IHMyLmxlbmd0aCgpOwotCQljaGFyW10gYnVmID0gbmV3IGNoYXJbbDEgKyAxICsgbDJdOwotCQlzMS5nZXRDaGFycygwLCBsMSwgYnVmLCAwKTsKLQkJYnVmW2wxXSA9IGM7Ci0JCXMyLmdldENoYXJzKDAsIGwyLCBidWYsIGwxICsgMSk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJ1Zik7CisJcHVibGljIHN0YXRpYyBjaGFyW10gY29uY2F0Q29tcG91bmROYW1lVG9DaGFyQXJyYXkoU3RyaW5nW10gY29tcG91bmROYW1lKSB7CisJCWlmIChjb21wb3VuZE5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgY2hhclswXTsKKwkJaW50IHNpemUgPSAwOworCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCXNpemUgKz0gY29tcG91bmROYW1lW2ldLmxlbmd0aCgpOworCQl9CisJCWNoYXJbXSBjb21wb3VuZENoYXJzID0gbmV3IGNoYXJbc2l6ZStsZW5ndGgtMV07CisJCWludCBwb3MgPSAwOworCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBuYW1lID0gY29tcG91bmROYW1lW2ldOworCQkJaWYgKGkgPiAwKSBjb21wb3VuZENoYXJzW3BvcysrXSA9ICcuJzsKKwkJCWludCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKKwkJCW5hbWUuZ2V0Q2hhcnMoMCwgbmFtZUxlbmd0aCwgY29tcG91bmRDaGFycywgcG9zKTsKKwkJCXBvcyArPSBuYW1lTGVuZ3RoOworCQl9CisJCXJldHVybiBjb21wb3VuZENoYXJzOwogCX0KLQkKLQkvKioKLQkgKiBDb25jYXRlbmF0ZSB0d28gc3RyaW5ncy4KLQkgKiBNdWNoIGZhc3RlciB0aGFuIHVzaW5nICssIHdoaWNoOgotCSAqIAkJLSBjcmVhdGVzIGEgU3RyaW5nQnVmZmVyLAotCSAqIAkJLSB3aGljaCBpcyBzeW5jaHJvbml6ZWQsCi0JICogCQktIG9mIGRlZmF1bHQgc2l6ZSwgc28gdGhlIHJlc3VsdGluZyBjaGFyIGFycmF5IGlzCi0JICogICAgICAgIG9mdGVuIGxhcmdlciB0aGFuIG5lZWRlZC4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYW4gZXh0cmEgY2hhciBhcnJheSwgc2luY2UgdGhlCi0JICogU3RyaW5nIGNvbnN0cnVjdG9yIGNvcGllcyBpdHMgYXJndW1lbnQsIGJ1dCB0aGVyZSdzIG5vIHdheSBhcm91bmQgdGhpcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jYXQoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKHMxID09IG51bGwpIHMxID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzMiA9PSBudWxsKSBzMiA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbDEgPSBzMS5sZW5ndGgoKTsKLQkJaW50IGwyID0gczIubGVuZ3RoKCk7Ci0JCWNoYXJbXSBidWYgPSBuZXcgY2hhcltsMSArIGwyXTsKLQkJczEuZ2V0Q2hhcnMoMCwgbDEsIGJ1ZiwgMCk7Ci0JCXMyLmdldENoYXJzKDAsIGwyLCBidWYsIGwxKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jYXRlbmF0ZU5hbWUoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIsIGNoYXIgc2VwYXJhdG9yKSB7CisJCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaWYgKG5hbWUxICE9IG51bGwgJiYgbmFtZTEubGVuZ3RoKCkgPiAwKSB7CisJCQlidWYuYXBwZW5kKG5hbWUxKTsKKwkJfQorCQlpZiAobmFtZTIgIT0gbnVsbCAmJiBuYW1lMi5sZW5ndGgoKSA+IDApIHsKKwkJCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7CisJCQkJYnVmLmFwcGVuZChzZXBhcmF0b3IpOworCQkJfQorCQkJYnVmLmFwcGVuZChuYW1lMik7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogCX0KLQogCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIGFycmF5IHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IgYmV0d2VlbiBlYWNoIHBhcnQuCiAJICogPGJyPgpAQCAtMjk5LDcgKzMyMiw3IEBACiAJICogICAgPT4gcmVzdWx0ID0gIiIKIAkgKiA8L3ByZT48L2xpPgogCSAqIDwvb2w+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAJICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCiAJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2ggcGFydApAQCAtMzEzLDcgKzMzNiw3IEBACiAJCX0KIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIGFycmF5IHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IgYmV0d2VlbiBlYWNoCiAJICogcGFydCBhbmQgYXBwZW5kaW5nIHRoZSBnaXZlbiBuYW1lIGF0IHRoZSBlbmQuCkBAIC0zNDEsNyArMzY0LDcgQEAKIAkgKiAgICA9PiByZXN1bHQgPSAiYyIKIAkgKiA8L3ByZT48L2xpPgogCSAqIDwvb2w+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CiAJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKIAkgKiBAcGFyYW0gc2VwYXJhdG9yIHRoZSBnaXZlbiBzZXBhcmF0b3IKQEAgLTM1Miw3ICszNzUsNyBAQAogCQlTdHJpbmdbXSBhcnJheSwKIAkJU3RyaW5nIG5hbWUsCiAJCWNoYXIgc2VwYXJhdG9yKSB7Ci0JCQorCiAJCWlmIChhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA9PSAwKSByZXR1cm4gbmFtZTsKIAkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBjb25jYXRXaXRoKGFycmF5LCBzZXBhcmF0b3IpOwogCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwpAQCAtMzYyLDM0ICszODUsMTUgQEAKIAkJfQogCQlidWZmZXIuYXBwZW5kKG5hbWUpOwogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQorCiAJfQotCQotCS8qKgotCSAqIENvbmNhdGVuYXRlIHRocmVlIHN0cmluZ3MuCi0JICogQHNlZSAjY29uY2F0KFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIFN0cmluZyBzMiwgU3RyaW5nIHMzKSB7Ci0JCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoczIgPT0gbnVsbCkgczIgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHMzID09IG51bGwpIHMzID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCWludCBsMSA9IHMxLmxlbmd0aCgpOwotCQlpbnQgbDIgPSBzMi5sZW5ndGgoKTsKLQkJaW50IGwzID0gczMubGVuZ3RoKCk7Ci0JCWNoYXJbXSBidWYgPSBuZXcgY2hhcltsMSArIGwyICsgbDNdOwotCQlzMS5nZXRDaGFycygwLCBsMSwgYnVmLCAwKTsKLQkJczIuZ2V0Q2hhcnMoMCwgbDIsIGJ1ZiwgbDEpOwotCQlzMy5nZXRDaGFycygwLCBsMywgYnVmLCBsMSArIGwyKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKLQl9Ci0JCQogCS8qKgogCSAqIENvbnZlcnRzIGEgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgSUJpbmFyeVR5cGUgcmVwcmVzZW50YXRpb24gdG8gdGhlIERDIHJlcHJlc2VudGF0aW9uLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUeXBlU2lnbmF0dXJlKGNoYXJbXSBzaWcsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewogCQlyZXR1cm4gbmV3IFN0cmluZyhzaWcsIHN0YXJ0LCBsZW5ndGgpLnJlcGxhY2UoJy8nLCAnLicpOwogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB0aGUgZGVmYXVsdCBqYXZhIGV4dGVuc2lvbiAoIi5qYXZhIikuCiAJICogVG8gYmUgdXNlZCB3aGVuIHRoZSBleHRlbnNpb24gaXMgbm90IGtub3duLgpAQCAtNDAxLDEwICs0MDUsMTAgQEAKIAkvKioKIAkgKiBBcHBseSB0aGUgZ2l2ZW4gZWRpdCBvbiB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgc3RyaW5nLgogCSAqIFJldHVybiB0aGUgZ2l2ZW4gc3RyaW5nIGlmIGFueXRoaW5nIHdyb25nIGhhcHBlbiB3aGlsZSBhcHBseWluZyB0aGUgZWRpdC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvcmlnaW5hbCB0aGUgZ2l2ZW4gc3RyaW5nCiAJICogQHBhcmFtIGVkaXQgdGhlIGdpdmVuIGVkaXQKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgc3RyaW5nCiAJICovCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgZWRpdGVkU3RyaW5nKFN0cmluZyBvcmlnaW5hbCwgVGV4dEVkaXQgZWRpdCkgewpAQCAtNDI4LDIxICs0MzIsMjEgQEAKIAkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY3JlYXRpbmcgZXh0cmEgc3RyaW5ncy4KIAkgKi8KIAlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzdHIsIFN0cmluZyBlbmQpIHsKLQkJCisKIAkJaW50IHN0ckxlbmd0aCA9IHN0ciA9PSBudWxsID8gMCA6IHN0ci5sZW5ndGgoKTsKIAkJaW50IGVuZExlbmd0aCA9IGVuZCA9PSBudWxsID8gMCA6IGVuZC5sZW5ndGgoKTsKLQkJCisKIAkJLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBlbmQuCiAJCWlmKGVuZExlbmd0aCA+IHN0ckxlbmd0aCkKIAkJCXJldHVybiBmYWxzZTsKLQkJCQorCiAJCS8vIHJldHVybiBmYWxzZSBpZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBlbmQgYXJlCiAJCS8vIG5vdCB0aGUgc2FtZSBpbiBsb3dlciBjYXNlLgogCQlmb3IoaW50IGkgPSAxIDsgaSA8PSBlbmRMZW5ndGg7IGkrKyl7CiAJCQlpZihTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKGVuZC5jaGFyQXQoZW5kTGVuZ3RoIC0gaSkpICE9IFNjYW5uZXJIZWxwZXIudG9Mb3dlckNhc2Uoc3RyLmNoYXJBdChzdHJMZW5ndGggLSBpKSkpCiAJCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCQorCiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNTAxLDcgKzUwNSw3IEBACiAKIAkJaW50IGxlbiA9IGEubGVuZ3RoOwogCQlpZiAobGVuICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0JCS8vIHdhbGsgYXJyYXkgZnJvbSBlbmQgdG8gYmVnaW5uaW5nIGFzIHRoaXMgb3B0aW1pemVzIHBhY2thZ2UgbmFtZSBjYXNlcyAKKwkJLy8gd2FsayBhcnJheSBmcm9tIGVuZCB0byBiZWdpbm5pbmcgYXMgdGhpcyBvcHRpbWl6ZXMgcGFja2FnZSBuYW1lIGNhc2VzCiAJCS8vIHdoZXJlIHRoZSBmaXJzdCBwYXJ0IGlzIGFsd2F5cyB0aGUgc2FtZSAoZS5nLiBvcmcuZWNsaXBzZS5qZHQpCiAJCWZvciAoaW50IGkgPSBsZW4tMTsgaSA+PSAwOyBpLS0pIHsKIAkJCWlmIChhW2ldID09IG51bGwpIHsKQEAgLTUxMiw3ICs1MTYsNyBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIENvbXBhcmVzIHR3byBhcnJheXMgdXNpbmcgZXF1YWxzKCkgb24gdGhlIGVsZW1lbnRzLgogCSAqIFRoZSBhcnJheXMgYXJlIGZpcnN0IHNvcnRlZC4KQEAgLTUzNyw3ICs1NDEsNyBAQAogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKwogCS8qKgogCSAqIENvbXBhcmVzIHR3byBTdHJpbmcgYXJyYXlzIHVzaW5nIGVxdWFscygpIG9uIHRoZSBlbGVtZW50cy4KIAkgKiBUaGUgYXJyYXlzIGFyZSBmaXJzdCBzb3J0ZWQuCkBAIC01NjIsNyArNTY2LDcgQEAKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCisKIAkvKioKIAkgKiBDb21wYXJlcyB0d28gb2JqZWN0cyB1c2luZyBlcXVhbHMoKS4KIAkgKiBFaXRoZXIgb3IgYm90aCBhcnJheSBtYXkgYmUgbnVsbC4KQEAgLTU3OSw3ICs1ODMsNyBAQAogCQl9CiAJCXJldHVybiBhLmVxdWFscyhiKTsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGVxdWFscyB0byB0aGUgZ2l2ZW4gc3RyaW5nIGlnbm9yaW5nIHRoZSBqYXZhIGxpa2UgZXh0ZW5zaW9uCiAJICogb2YgdGhlIGZpbGUgbmFtZS4KQEAgLTYwMSwxNCArNjA1LDE0IEBACiAJCQlpZiAoZXh0ZW5zaW9uU3RhcnQgKyBzdWZmaXgubGVuZ3RoICE9IGZpbGVOYW1lTGVuZ3RoKSBjb250aW51ZTsKIAkJCWlmIChmaWxlTmFtZS5jaGFyQXQoc3RyaW5nTGVuZ3RoKSAhPSAnLicpIGNvbnRpbnVlOwogCQkJZm9yIChpbnQgaiA9IGV4dGVuc2lvblN0YXJ0OyBqIDwgZmlsZU5hbWVMZW5ndGg7IGorKykgewotCQkJCWlmIChmaWxlTmFtZS5jaGFyQXQoaikgIT0gc3VmZml4W2otZXh0ZW5zaW9uU3RhcnRdKSAKKwkJCQlpZiAoZmlsZU5hbWUuY2hhckF0KGopICE9IHN1ZmZpeFtqLWV4dGVuc2lvblN0YXJ0XSkKIAkJCQkJY29udGludWUgc3VmZml4ZXM7CiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQotCQorCiAJLyoqCiAJICogR2l2ZW4gYSBxdWFsaWZpZWQgbmFtZSwgZXh0cmFjdCB0aGUgbGFzdCBjb21wb25lbnQuCiAJICogSWYgdGhlIGlucHV0IGlzIG5vdCBxdWFsaWZpZWQsIHRoZSBzYW1lIHN0cmluZyBpcyBhbnN3ZXJlZC4KQEAgLTYxOCw3ICs2MjIsNyBAQAogCQlpZiAoaSA9PSAtMSkgcmV0dXJuIHF1YWxpZmllZE5hbWU7CiAJCXJldHVybiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpKzEpOwogCX0KLQkKKwogCS8qKgogCSAqIEV4dHJhY3RzIHRoZSBwYXJhbWV0ZXIgdHlwZXMgZnJvbSBhIG1ldGhvZCBzaWduYXR1cmUuCiAJICovCkBAIC02NjAsNyArNjY0LDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0UmV0dXJuVHlwZShTdHJpbmcgc2lnKSB7CiAJCWludCBpID0gc2lnLmxhc3RJbmRleE9mKCcpJyk7CiAJCUFzc2VydC5pc1RydWUoaSAhPSAtMSk7Ci0JCXJldHVybiBzaWcuc3Vic3RyaW5nKGkrMSk7CQorCQlyZXR1cm4gc2lnLnN1YnN0cmluZyhpKzEpOwogCX0KIAlwcml2YXRlIHN0YXRpYyBJRmlsZSBmaW5kRmlyc3RDbGFzc0ZpbGUoSUZvbGRlciBmb2xkZXIpIHsKIAkJdHJ5IHsKQEAgLTY3OCw3ICs2ODIsNyBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCS8qKgogCSAqIEZpbmRzIHRoZSBmaXJzdCBsaW5lIHNlcGFyYXRvciB1c2VkIGJ5IHRoZSBnaXZlbiB0ZXh0LgogCSAqCkBAIC03MDIsNyArNzA2LDcgQEAKIAkJLy8gbm90IGZvdW5kCiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzRmlsZUF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIsIGNoYXJbXSBhdHRyaWJ1dGVOYW1lKSB7CiAJCUlDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzID0gY2xhc3NGaWxlUmVhZGVyLmdldEF0dHJpYnV0ZXMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKQEAgLTcxMiw3ICs3MTYsNyBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKKwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzRmlsZUF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSwgY2hhcltdIGF0dHJpYnV0ZU5hbWUpIHsKIAkJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBjb2RlQXR0cmlidXRlLmdldEF0dHJpYnV0ZXMoKTsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKQEAgLTcyMSw4ICs3MjUsOCBAQAogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwotCX0JCi0JCisJfQorCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlQXR0cmlidXRlIGdldEF0dHJpYnV0ZShJRmllbGRJbmZvIGZpZWxkSW5mbywgY2hhcltdIGF0dHJpYnV0ZU5hbWUpIHsKIAkJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBmaWVsZEluZm8uZ2V0QXR0cmlidXRlcygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtNzQyLDQyICs3NDYsNjkgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCisKKwlwcml2YXRlIHN0YXRpYyBJQ2xhc3NGaWxlIGdldENsYXNzRmlsZShjaGFyW10gZmlsZU5hbWUpIHsKKwkJaW50IGphclNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihJRGVwZW5kZW50LkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiwgZmlsZU5hbWUpOworCQlpbnQgcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIGZpbGVOYW1lKTsgLy8gcGtnRW5kIGlzIGV4Y2x1c2l2ZQorCQlpZiAocGtnRW5kID09IC0xKQorCQkJcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGZpbGVOYW1lKTsKKwkJaWYgKGphclNlcGFyYXRvciAhPSAtMSAmJiBwa2dFbmQgPCBqYXJTZXBhcmF0b3IpIC8vIGlmIGluIGEgamFyIGFuZCBubyBzbGFzaCwgaXQgaXMgYSBkZWZhdWx0IHBhY2thZ2UgLT4gcGtnRW5kIHNob3VsZCBiZSBlcXVhbCB0byBqYXJTZXBhcmF0b3IKKwkJCXBrZ0VuZCA9IGphclNlcGFyYXRvcjsKKwkJaWYgKHBrZ0VuZCA9PSAtMSkKKwkJCXJldHVybiBudWxsOworCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudChmaWxlTmFtZSwgcGtnRW5kLCBqYXJTZXBhcmF0b3IpOworCQlpZiAocGtnID09IG51bGwpIHJldHVybiBudWxsOworCQlpbnQgc3RhcnQ7CisJCXJldHVybiBwa2cuZ2V0Q2xhc3NGaWxlKG5ldyBTdHJpbmcoZmlsZU5hbWUsIHN0YXJ0ID0gcGtnRW5kICsgMSwgZmlsZU5hbWUubGVuZ3RoIC0gc3RhcnQpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChjaGFyW10gZmlsZU5hbWUsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lcikgeworCQljaGFyW10gc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZSA9IENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weShmaWxlTmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworCQlpbnQgcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHNsYXNoU2VwYXJhdGVkRmlsZU5hbWUpOyAvLyBwa2dFbmQgaXMgZXhjbHVzaXZlCisJCWlmIChwa2dFbmQgPT0gLTEpCisJCQlyZXR1cm4gbnVsbDsKKwkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZSwgcGtnRW5kLCAtMS8qbm8gamFyIHNlcGFyYXRvciBmb3IgLmphdmEgZmlsZXMqLyk7CisJCWlmIChwa2cgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWludCBzdGFydDsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBrZy5nZXRDb21waWxhdGlvblVuaXQobmV3IFN0cmluZyhzbGFzaFNlcGFyYXRlZEZpbGVOYW1lLCBzdGFydCA9ICBwa2dFbmQrMSwgc2xhc2hTZXBhcmF0ZWRGaWxlTmFtZS5sZW5ndGggLSBzdGFydCkpOworCQlpZiAod29ya2luZ0NvcHlPd25lciAhPSBudWxsKSB7CisJCQlJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5ID0gY3UuZmluZFdvcmtpbmdDb3B5KHdvcmtpbmdDb3B5T3duZXIpOworCQkJaWYgKHdvcmtpbmdDb3B5ICE9IG51bGwpCisJCQkJcmV0dXJuIHdvcmtpbmdDb3B5OworCQl9CisJCXJldHVybiBjdTsKKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIEphdmEgbGlrZSBleHRlbnNpb25zLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgewogCQlpZiAoSkFWQV9MSUtFX0VYVEVOU0lPTlMgPT0gbnVsbCkgewotCQkJLy8gVE9ETyAoamVyb21lKSByZWVuYWJsZSBvbmNlIEpEVCBVSSBzdXBwb3J0cyBvdGhlciBmaWxlIGV4dGVuc2lvbnMgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NjApCi0JCQlpZiAoIUVOQUJMRV9KQVZBX0xJS0VfRVhURU5TSU9OUykKLQkJCQlKQVZBX0xJS0VfRVhURU5TSU9OUyA9IG5ldyBjaGFyW11bXSB7U3VmZml4Q29uc3RhbnRzLkVYVEVOU0lPTl9qYXZhLnRvQ2hhckFycmF5KCl9OwotCQkJZWxzZSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGphdmFDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7Ci0JCQkJSGFzaFNldCBmaWxlRXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJLy8gY29udGVudCB0eXBlcyBkZXJpdmVkIGZyb20gamF2YSBjb250ZW50IHR5cGUgc2hvdWxkIGJlIGluY2x1ZGVkIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNzE1KQotCQkJCUlDb250ZW50VHlwZVtdIGNvbnRlbnRUeXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldEFsbENvbnRlbnRUeXBlcygpOwotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjb250ZW50VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlc1tpXS5pc0tpbmRPZihqYXZhQ29udGVudFR5cGUpKSB7IC8vIG5vdGUgdGhhdCBqYXZhQ29udGVudFR5cGUuaXNLaW5kT2YoamF2YUNvbnRlbnRUeXBlKSA9PSB0cnVlCi0JCQkJCQlTdHJpbmdbXSBmaWxlRXh0ZW5zaW9uID0gY29udGVudFR5cGVzW2ldLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQyk7Ci0JCQkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGZpbGVFeHRlbnNpb24ubGVuZ3RoOyBqIDwgbGVuZ3RoMjsgaisrKSB7Ci0JCQkJCQkJZmlsZUV4dGVuc2lvbnMuYWRkKGZpbGVFeHRlbnNpb25bal0pOwotCQkJCQkJfQorCQkJSUNvbnRlbnRUeXBlIGphdmFDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7CisJCQlIYXNoU2V0IGZpbGVFeHRlbnNpb25zID0gbmV3IEhhc2hTZXQoKTsKKwkJCS8vIGNvbnRlbnQgdHlwZXMgZGVyaXZlZCBmcm9tIGphdmEgY29udGVudCB0eXBlIHNob3VsZCBiZSBpbmNsdWRlZCAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTcxNSkKKwkJCUlDb250ZW50VHlwZVtdIGNvbnRlbnRUeXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldEFsbENvbnRlbnRUeXBlcygpOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNvbnRlbnRUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChjb250ZW50VHlwZXNbaV0uaXNLaW5kT2YoamF2YUNvbnRlbnRUeXBlKSkgeyAvLyBub3RlIHRoYXQgamF2YUNvbnRlbnRUeXBlLmlzS2luZE9mKGphdmFDb250ZW50VHlwZSkgPT0gdHJ1ZQorCQkJCQlTdHJpbmdbXSBmaWxlRXh0ZW5zaW9uID0gY29udGVudFR5cGVzW2ldLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQyk7CisJCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGgyID0gZmlsZUV4dGVuc2lvbi5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKKwkJCQkJCWZpbGVFeHRlbnNpb25zLmFkZChmaWxlRXh0ZW5zaW9uW2pdKTsKIAkJCQkJfQogCQkJCX0KLQkJCQlpbnQgbGVuZ3RoID0gZmlsZUV4dGVuc2lvbnMuc2l6ZSgpOwotCQkJCS8vIG5vdGUgdGhhdCBmaWxlIGV4dGVuc2lvbnMgY29udGFpbnMgImphdmEiIGFzIGl0IGlzIGRlZmluZWQgaW4gSkRUIENvcmUncyBwbHVnaW4ueG1sCi0JCQkJY2hhcltdW10gZXh0ZW5zaW9ucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCQlleHRlbnNpb25zWzBdID0gU3VmZml4Q29uc3RhbnRzLkVYVEVOU0lPTl9qYXZhLnRvQ2hhckFycmF5KCk7IC8vIGVuc3VyZSB0aGF0ICJqYXZhIiBpcyBmaXJzdAotCQkJCWludCBpbmRleCA9IDE7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWxlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChTdWZmaXhDb25zdGFudHMuRVhURU5TSU9OX2phdmEuZXF1YWxzKGZpbGVFeHRlbnNpb24pKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWV4dGVuc2lvbnNbaW5kZXgrK10gPSBmaWxlRXh0ZW5zaW9uLnRvQ2hhckFycmF5KCk7Ci0JCQkJfQotCQkJCUpBVkFfTElLRV9FWFRFTlNJT05TID0gZXh0ZW5zaW9uczsKIAkJCX0KKwkJCWludCBsZW5ndGggPSBmaWxlRXh0ZW5zaW9ucy5zaXplKCk7CisJCQkvLyBub3RlIHRoYXQgZmlsZSBleHRlbnNpb25zIGNvbnRhaW5zICJqYXZhIiBhcyBpdCBpcyBkZWZpbmVkIGluIEpEVCBDb3JlJ3MgcGx1Z2luLnhtbAorCQkJY2hhcltdW10gZXh0ZW5zaW9ucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCWV4dGVuc2lvbnNbMF0gPSBTdWZmaXhDb25zdGFudHMuRVhURU5TSU9OX2phdmEudG9DaGFyQXJyYXkoKTsgLy8gZW5zdXJlIHRoYXQgImphdmEiIGlzIGZpcnN0CisJCQlpbnQgaW5kZXggPSAxOworCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWxlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworCQkJCWlmIChTdWZmaXhDb25zdGFudHMuRVhURU5TSU9OX2phdmEuZXF1YWxzKGZpbGVFeHRlbnNpb24pKQorCQkJCQljb250aW51ZTsKKwkJCQlleHRlbnNpb25zW2luZGV4KytdID0gZmlsZUV4dGVuc2lvbi50b0NoYXJBcnJheSgpOworCQkJfQorCQkJSkFWQV9MSUtFX0VYVEVOU0lPTlMgPSBleHRlbnNpb25zOwogCQl9CiAJCXJldHVybiBKQVZBX0xJS0VfRVhURU5TSU9OUzsKIAl9CkBAIC04MzksNyArODcwLDcgQEAKIAkJfQogCQlyZXR1cm4gMDsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgdGhlIGdpdmVuIGZpbGUgbmFtZSwgZW5kaW5nIGF0IHRoZSBzdGFydCBvZiBhCiAJICogSmF2YSBsaWtlIGV4dGVuc2lvbi4gVGhlIGVudGlyZSBmaWxlIG5hbWUgaXMgcmV0dXJuZWQgaWYgaXQgZG9lc24ndCBlbmQKQEAgLTg1MSw0MiArODgyLDQ0IEBACiAJCQlyZXR1cm4gZmlsZU5hbWU7CiAJCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpbmUgc2VwYXJhdG9yIGZvdW5kIGluIHRoZSBnaXZlbiB0ZXh0LgotCSAqIElmIGl0IGlzIG51bGwsIG9yIG5vdCBmb3VuZCByZXR1cm4gdGhlIGxpbmUgZGVsaW1pdG9yIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KKwkgKiBJZiBpdCBpcyBudWxsLCBvciBub3QgZm91bmQgcmV0dXJuIHRoZSBsaW5lIGRlbGltaXRlciBmb3IgdGhlIGdpdmVuIHByb2plY3QuCiAJICogSWYgdGhlIHByb2plY3QgaXMgbnVsbCwgcmV0dXJucyB0aGUgbGluZSBzZXBhcmF0b3IgZm9yIHRoZSB3b3Jrc3BhY2UuCiAJICogSWYgc3RpbGwgbnVsbCwgcmV0dXJuIHRoZSBzeXN0ZW0gbGluZSBzZXBhcmF0b3IuCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGluZVNlcGFyYXRvcihTdHJpbmcgdGV4dCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKIAkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBudWxsOwotCQkKKwogCQkvLyBsaW5lIGRlbGltaXRlciBpbiBnaXZlbiB0ZXh0CiAJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSAhPSAwKSB7CiAJCQlsaW5lU2VwYXJhdG9yID0gZmluZExpbmVTZXBhcmF0b3IodGV4dC50b0NoYXJBcnJheSgpKTsKIAkJCWlmIChsaW5lU2VwYXJhdG9yICE9IG51bGwpCiAJCQkJcmV0dXJuIGxpbmVTZXBhcmF0b3I7CiAJCX0KLQkJCi0JCS8vIGxpbmUgZGVsaW1pdGVyIGluIHByb2plY3QgcHJlZmVyZW5jZQotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVDb250ZXh0OwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlzY29wZUNvbnRleHQ9IG5ldyBJU2NvcGVDb250ZXh0W10geyBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QuZ2V0UHJvamVjdCgpKSB9OwotCQkJbGluZVNlcGFyYXRvcj0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIG51bGwsIHNjb3BlQ29udGV4dCk7CisKKwkJaWYgKFBsYXRmb3JtLmlzUnVubmluZygpKSB7CisJCQkvLyBsaW5lIGRlbGltaXRlciBpbiBwcm9qZWN0IHByZWZlcmVuY2UKKwkJCUlTY29wZUNvbnRleHRbXSBzY29wZUNvbnRleHQ7CisJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7CisJCQkJc2NvcGVDb250ZXh0PSBuZXcgSVNjb3BlQ29udGV4dFtdIHsgbmV3IFByb2plY3RTY29wZShwcm9qZWN0LmdldFByb2plY3QoKSkgfTsKKwkJCQlsaW5lU2VwYXJhdG9yPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgbnVsbCwgc2NvcGVDb250ZXh0KTsKKwkJCQlpZiAobGluZVNlcGFyYXRvciAhPSBudWxsKQorCQkJCQlyZXR1cm4gbGluZVNlcGFyYXRvcjsKKwkJCX0KKwkKKwkJCS8vIGxpbmUgZGVsaW1pdGVyIGluIHdvcmtzcGFjZSBwcmVmZXJlbmNlCisJCQlzY29wZUNvbnRleHQ9IG5ldyBJU2NvcGVDb250ZXh0W10geyBJbnN0YW5jZVNjb3BlLklOU1RBTkNFIH07CisJCQlsaW5lU2VwYXJhdG9yID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIG51bGwsIHNjb3BlQ29udGV4dCk7CiAJCQlpZiAobGluZVNlcGFyYXRvciAhPSBudWxsKQogCQkJCXJldHVybiBsaW5lU2VwYXJhdG9yOwogCQl9Ci0JCQotCQkvLyBsaW5lIGRlbGltaXRlciBpbiB3b3Jrc3BhY2UgcHJlZmVyZW5jZQotCQlzY29wZUNvbnRleHQ9IG5ldyBJU2NvcGVDb250ZXh0W10geyBuZXcgSW5zdGFuY2VTY29wZSgpIH07Ci0JCWxpbmVTZXBhcmF0b3IgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgbnVsbCwgc2NvcGVDb250ZXh0KTsKLQkJaWYgKGxpbmVTZXBhcmF0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBsaW5lU2VwYXJhdG9yOwotCQkKKwogCQkvLyBzeXN0ZW0gbGluZSBkZWxpbWl0ZXIKIAkJcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuTElORV9TRVBBUkFUT1I7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbGluZSBzZXBhcmF0b3IgdXNlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyLgogCSAqIFVzZXMgdGhlIGdpdmVuIHRleHQgaWYgbm9uZSBmb3VuZC4KQEAgLTkwNiw3ICs5MzksMzYgQEAKIAkJfQogCQlyZXR1cm4gbGluZVNlcGFyYXRvcjsKIAl9Ci0JCQorCisJcHJpdmF0ZSBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoY2hhcltdIGZpbGVOYW1lLCBpbnQgcGtnRW5kLCBpbnQgamFyU2VwYXJhdG9yKSB7CisJCWlmIChqYXJTZXBhcmF0b3IgIT0gLTEpIHsKKwkJCVN0cmluZyBqYXJNZW1lbnRvID0gbmV3IFN0cmluZyhmaWxlTmFtZSwgMCwgamFyU2VwYXJhdG9yKTsKKwkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSBKYXZhQ29yZS5jcmVhdGUoamFyTWVtZW50byk7CisJCQlpZiAocGtnRW5kID09IGphclNlcGFyYXRvcikKKwkJCQlyZXR1cm4gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTKTsKKwkJCWNoYXJbXSBwa2dOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShmaWxlTmFtZSwgamFyU2VwYXJhdG9yKzEsIHBrZ0VuZCk7CisJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBwa2dOYW1lKTsKKwkJCXJldHVybiByb290LmdldFBhY2thZ2VGcmFnbWVudChDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhjb21wb3VuZE5hbWUpKTsKKwkJfSBlbHNlIHsKKwkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ldyBTdHJpbmcoZmlsZU5hbWUsIDAsIHBrZ0VuZCkpOworCQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCQlJQ29udGFpbmVyIGZvbGRlciA9IHBhdGguc2VnbWVudENvdW50KCkgPT0gMSA/IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXRoLmxhc3RTZWdtZW50KCkpIDogKElDb250YWluZXIpIHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKHBhdGgpOworCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoZm9sZGVyKTsKKwkJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOworCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgorCQkJCQlyZXR1cm4gKChQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5nZXRQYWNrYWdlRnJhZ21lbnQoQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTKTsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KSAoKElKYXZhUHJvamVjdCkgZWxlbWVudCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOworCQkJCQlpZiAocm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQkJcmV0dXJuIHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUyk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgdHlwZXMgaW4gYSBtZXRob2Qgc2lnbmF0dXJlLgogCSAqLwpAQCAtOTM1LDY3ICs5OTcsMTMyIEBACiAJCX0KIAkJcmV0dXJuIGNvdW50OwogCX0KLQkKKwogCS8qKgogCSAqIFB1dCBhbGwgdGhlIGFyZ3VtZW50cyBpbiBvbmUgU3RyaW5nLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2JsZW1Bcmd1bWVudHNGb3JNYXJrZXIoU3RyaW5nW10gYXJndW1lbnRzKXsKIAkJU3RyaW5nQnVmZmVyIGFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJCisKIAkJYXJncy5hcHBlbmQoYXJndW1lbnRzLmxlbmd0aCk7CiAJCWFyZ3MuYXBwZW5kKCc6Jyk7Ci0JCQotCQkJCisKKwogCQlmb3IgKGludCBqID0gMDsgaiA8IGFyZ3VtZW50cy5sZW5ndGg7IGorKykgewogCQkJaWYoaiAhPSAwKQogCQkJCWFyZ3MuYXBwZW5kKEFSR1VNRU5UU19ERUxJTUlURVIpOwotCQkJCisKIAkJCWlmKGFyZ3VtZW50c1tqXS5sZW5ndGgoKSA9PSAwKSB7CiAJCQkJYXJncy5hcHBlbmQoRU1QVFlfQVJHVU1FTlQpOwotCQkJfSBlbHNlIHsJCQkKLQkJCQlhcmdzLmFwcGVuZChhcmd1bWVudHNbal0pOworCQkJfSBlbHNlIHsKKwkJCQllbmNvZGVBcmd1bWVudChhcmd1bWVudHNbal0sIGFyZ3MpOwogCQkJfQogCQl9Ci0JCQorCiAJCXJldHVybiBhcmdzLnRvU3RyaW5nKCk7CiAJfQotCQorCisJLyoqCisJICogRW5jb2RlIHRoZSBhcmd1bWVudCBieSBkb3VibGluZyB0aGUgJyMnIGlmIHByZXNlbnQgaW50byB0aGUgYXJndW1lbnQgdmFsdWUuCisJICogCisJICogPHA+VGhpcyBzdG9yZXMgdGhlIGVuY29kZWQgYXJndW1lbnQgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLjwvcD4KKwkgKgorCSAqIEBwYXJhbSBhcmd1bWVudCB0aGUgZ2l2ZW4gYXJndW1lbnQKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGVuY29kZWQgYXJndW1lbnQgaXMgc3RvcmVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGVBcmd1bWVudChTdHJpbmcgYXJndW1lbnQsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50Lmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsKKwkJCWNoYXIgY2hhckF0ID0gYXJndW1lbnQuY2hhckF0KGkpOworCQkJc3dpdGNoKGNoYXJBdCkgeworCQkJCWNhc2UgQVJHVU1FTlRTX0RFTElNSVRFUiA6CisJCQkJCWJ1ZmZlci5hcHBlbmQoQVJHVU1FTlRTX0RFTElNSVRFUikuYXBwZW5kKEFSR1VNRU5UU19ERUxJTUlURVIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlidWZmZXIuYXBwZW5kKGNoYXJBdCk7CisJCQl9CisJCX0KKwl9CisKIAkvKioKIAkgKiBTZXBhcmF0ZSBhbGwgdGhlIGFyZ3VtZW50cyBvZiBhIFN0cmluZyBtYWRlIGJ5IGdldFByb2JsZW1Bcmd1bWVudHNGb3JNYXJrZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2JsZW1Bcmd1bWVudHNGcm9tTWFya2VyKFN0cmluZyBhcmd1bWVudHNTdHJpbmcpewotCQlpZiAoYXJndW1lbnRzU3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOworCQlpZiAoYXJndW1lbnRzU3RyaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CiAJCWludCBpbmRleCA9IGFyZ3VtZW50c1N0cmluZy5pbmRleE9mKCc6Jyk7CiAJCWlmKGluZGV4ID09IC0xKQogCQkJcmV0dXJuIG51bGw7Ci0JCQorCiAJCWludCBsZW5ndGggPSBhcmd1bWVudHNTdHJpbmcubGVuZ3RoKCk7Ci0JCWludCBudW1iZXJPZkFyZzsKKwkJaW50IG51bWJlck9mQXJnID0gMDsKIAkJdHJ5ewogCQkJbnVtYmVyT2ZBcmcgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3VtZW50c1N0cmluZy5zdWJzdHJpbmcoMCAsIGluZGV4KSk7CiAJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlhcmd1bWVudHNTdHJpbmcgPSBhcmd1bWVudHNTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSwgbGVuZ3RoKTsKLQkJCi0JCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhcmd1bWVudHNTdHJpbmcsIEFSR1VNRU5UU19ERUxJTUlURVIpOwotCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgYXJndW1lbnQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZihhcmd1bWVudC5lcXVhbHMoRU1QVFlfQVJHVU1FTlQpKQotCQkJCWFyZ3VtZW50ID0gIiI7ICAvLyROT04tTkxTLTEkCi0JCQlhcmdzW2NvdW50KytdID0gYXJndW1lbnQ7Ci0JCX0KLQkJCi0JCWlmKGNvdW50ICE9IG51bWJlck9mQXJnKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGFyZ3MgPSBuZXcgU3RyaW5nW2NvdW50XSwgMCwgY291bnQpOwotCQlyZXR1cm4gYXJnczsKKworCQlyZXR1cm4gZGVjb2RlQXJndW1lbnRTdHJpbmcobnVtYmVyT2ZBcmcsIGFyZ3VtZW50c1N0cmluZyk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZGVjb2RlQXJndW1lbnRTdHJpbmcoaW50IGxlbmd0aCwgU3RyaW5nIGFyZ3VtZW50c1N0cmluZykgeworCQkvLyBkZWNvZGUgdGhlIGFyZ3VtZW50U3RyaW5nIGtub3dpbmcgdGhhdCAnIycgaXMgZG91YmxlZCBpZiBwYXJ0IG9mIHRoZSBhcmd1bWVudCB2YWx1ZQorCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCWlmIChhcmd1bWVudHNTdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKKwkJfQorCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCWludCBjb3VudCA9IDA7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHNTdHJpbmcubGVuZ3RoKCk7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhciBjdXJyZW50ID0gYXJndW1lbnRzU3RyaW5nLmNoYXJBdChpKTsKKwkJCXN3aXRjaChjdXJyZW50KSB7CisJCQkJY2FzZSBBUkdVTUVOVFNfREVMSU1JVEVSIDoKKwkJCQkJLyogY2hlY2sgdGhlIG5leHQgY2hhcmFjdGVyLiBJZiB0aGlzIGlzIGFsc28gQVJHVU1FTlRTX0RFTElNSVRFUiB0aGVuIG9ubHkgcHV0IG9uZSBpbnRvIHRoZQorCQkJCQkgKiBkZWNvZGVkIGFyZ3VtZW50IGFuZCBwcm9jZWVkIHdpdGggdGhlIG5leHQgY2hhcmFjdGVyCisJCQkJCSAqLworCQkJCQlpZiAoKGkgKyAxKSA9PSBtYXgpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJCWNoYXIgbmV4dCA9IGFyZ3VtZW50c1N0cmluZy5jaGFyQXQoaSArIDEpOworCQkJCQlpZiAobmV4dCA9PSBBUkdVTUVOVFNfREVMSU1JVEVSKSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKEFSR1VNRU5UU19ERUxJTUlURVIpOworCQkJCQkJaSsrOyAvLyBwcm9jZWVkIHdpdGggdGhlIG5leHQgY2hhcmFjdGVyCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB0aGlzIG1lYW5zIHRoZSBjdXJyZW50IGFyZ3VtZW50IGlzIG92ZXIKKwkJCQkJCVN0cmluZyBjdXJyZW50QXJndW1lbnRDb250ZW50cyA9IFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7CisJCQkJCQlpZiAoRU1QVFlfQVJHVU1FTlQuZXF1YWxzKGN1cnJlbnRBcmd1bWVudENvbnRlbnRzKSkgeworCQkJCQkJCWN1cnJlbnRBcmd1bWVudENvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5FTVBUWV9TVFJJTkc7CisJCQkJCQl9CisJCQkJCQlyZXN1bHRbY291bnQrK10gPSBjdXJyZW50QXJndW1lbnRDb250ZW50czsKKwkJCQkJCWlmIChjb3VudCA+IGxlbmd0aCkgeworCQkJCQkJCS8vIHRvbyBtYW55IGVsZW1lbnRzIC0gaWxsLWZvcm1lZAorCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQkJYnVmZmVyLmRlbGV0ZSgwLCBidWZmZXIubGVuZ3RoKCkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlidWZmZXIuYXBwZW5kKGN1cnJlbnQpOworCQkJfQorCQl9CisJCS8vIHByb2Nlc3MgbGFzdCBhcmd1bWVudAorCQlTdHJpbmcgY3VycmVudEFyZ3VtZW50Q29udGVudHMgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOworCQlpZiAoRU1QVFlfQVJHVU1FTlQuZXF1YWxzKGN1cnJlbnRBcmd1bWVudENvbnRlbnRzKSkgeworCQkJY3VycmVudEFyZ3VtZW50Q29udGVudHMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkVNUFRZX1NUUklORzsKKwkJfQorCQlyZXN1bHRbY291bnQrK10gPSBjdXJyZW50QXJndW1lbnRDb250ZW50czsKKwkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7CisJCQkvLyB0b28gbWFueSBlbGVtZW50cyAtIGlsbC1mb3JtZWQKKwkJCXJldHVybiBudWxsOworCQl9CisJCWJ1ZmZlci5kZWxldGUoMCwgYnVmZmVyLmxlbmd0aCgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBnaXZlbiBmaWxlJ3MgY29udGVudHMgYXMgYSBieXRlIGFycmF5LgogCSAqLwpAQCAtMTAxOCw3ICsxMTQ1LDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGdpdmVuIGZpbGUncyBjb250ZW50cyBhcyBhIGNoYXJhY3RlciBhcnJheS4KIAkgKi8KQEAgLTEwMzMsOCArMTE2MCw4IEBACiAJCX0KIAkJcmV0dXJuIGdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheShmaWxlLCBlbmNvZGluZyk7CiAJfQotCQkKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoSUZpbGUgZmlsZSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCQorCisJcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KElGaWxlIGZpbGUsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCS8vIEdldCBmaWxlIGxlbmd0aAogCQkvLyB3b3JrYXJvdW5kIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA3MzYgYnkgdXNpbmcgamF2YS5pby5GaWxlIGlmIHBvc3NpYmxlCiAJCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOwpAQCAtMTA0MiwxNSArMTE2OSwxOCBAQAogCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewogCQkJLy8gbm9uIGxvY2FsIGZpbGUKIAkJCXRyeSB7Ci0JCQkJbGVuZ3RoID0gRUZTLmdldFN0b3JlKGZpbGUuZ2V0TG9jYXRpb25VUkkoKSkuZmV0Y2hJbmZvKCkuZ2V0TGVuZ3RoKCk7CisJCQkJVVJJIGxvY2F0aW9uVVJJID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpOworCQkJCWlmIChsb2NhdGlvblVSSSA9PSBudWxsKQorCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgTWVzc2FnZXMuYmluZChNZXNzYWdlcy5maWxlX25vdEZvdW5kLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsKKwkJCQlsZW5ndGggPSBFRlMuZ2V0U3RvcmUobG9jYXRpb25VUkkpLmZldGNoSW5mbygpLmdldExlbmd0aCgpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvLyBsb2NhbCBmaWxlCiAJCQlsZW5ndGggPSBsb2NhdGlvbi50b0ZpbGUoKS5sZW5ndGgoKTsKIAkJfQotCQkKKwogCQkvLyBHZXQgcmVzb3VyY2UgY29udGVudHMKIAkJSW5wdXRTdHJlYW0gc3RyZWFtPSBudWxsOwogCQl0cnkgewpAQCAtMTA3MCw3ICsxMjAwLDcgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnaXZlbiB0eXBlLgogCSAqLwpAQCAtMTA3OSw3ICsxMjA5LDcgQEAKIAkJZ2V0RnVsbHlRdWFsaWZpZWROYW1lKHR5cGUsIGJ1ZmZlcik7CiAJCXJldHVybiBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShidWZmZXIudG9TdHJpbmcoKSwgZmFsc2UvKm5vdCByZXNvbHZlZCBpbiBzb3VyY2UqLyk7CiAJfQotCQorCiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYXR0YWNobWVudCBwcm9wZXJ0eSBmb3IgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBwYXRoCiAJICovCkBAIC0xMTAzLDI0ICsxMjMzLDI4IEBACiAJCX0gZWxzZQogCQkJcmV0dXJuIHByb3BlcnR5OwogCX0KLQkKKwogCXByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWUgZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZShJUGF0aCBwYXRoKSB7CiAJCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJzb3VyY2VhdHRhY2htZW50OiAiICsgcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHVibGljIHN0YXRpYyB2b2lkIHNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShJUGF0aCBwYXRoLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucm9vdFBhdGhUb0F0dGFjaG1lbnRzLnB1dChwYXRoLCBwcm9wZXJ0eSk7CisJCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yb290UGF0aFRvQXR0YWNobWVudHMucHV0KHBhdGgsIFBhY2thZ2VGcmFnbWVudFJvb3QuTk9fU09VUkNFX0FUVEFDSE1FTlQpOworCQl9IGVsc2UgeworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucm9vdFBhdGhUb0F0dGFjaG1lbnRzLnB1dChwYXRoLCBwcm9wZXJ0eSk7CisJCX0KIAkJdHJ5IHsKIAkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eU5hbWUocGF0aCksIHByb3BlcnR5KTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQl9CiAJfQotCQorCiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBkZWNsYXJpbmcgdHlwZSBzaWduYXR1cmUgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGJpbmRpbmcga2V5LgogCSAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZWxlbWVudCBpZiBpdCBpcyBhIHR5cGUuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBkZWNsYXJpbmcgdHlwZSBzaWduYXR1cmUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWNsYXJpbmdUeXBlU2lnbmF0dXJlKFN0cmluZyBrZXkpIHsKQEAgLTExMjgsNyArMTI2Miw3IEBACiAJCWtleVRvU2lnbmF0dXJlLnBhcnNlKCk7CiAJCXJldHVybiBrZXlUb1NpZ25hdHVyZS5zaWduYXR1cmUudG9TdHJpbmcoKTsKIAl9Ci0JCisKIAkvKgogCSAqIEFwcGVuZHMgdG8gdGhlIGdpdmVuIGJ1ZmZlciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgKGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNvdXJjZSkgb2YgdGhlIGdpdmVuIHR5cGUKIAkgKi8KQEAgLTExOTIsOCArMTMyNiwyMjAgQEAKIAkJfQogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKLQkJLyoKKworCS8qKgorCSAqIFJldHVybiB0aGUgamF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBpbGVyIGJpbmRpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoRmllbGRCaW5kaW5nIGJpbmRpbmcsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwgQmluZGluZ3NUb05vZGVzTWFwIGJpbmRpbmdzVG9Ob2RlcykgeworCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gYXJyYXkgbGVuZ3RoCisJCUphdmFFbGVtZW50IHVucmVzb2x2ZWRKYXZhRWxlbWVudCA9IGdldFVucmVzb2x2ZWRKYXZhRWxlbWVudChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCB3b3JraW5nQ29weU93bmVyLCBiaW5kaW5nc1RvTm9kZXMpOworCQlpZiAodW5yZXNvbHZlZEphdmFFbGVtZW50ID09IG51bGwgfHwgdW5yZXNvbHZlZEphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiAoSmF2YUVsZW1lbnQpICgoSVR5cGUpIHVucmVzb2x2ZWRKYXZhRWxlbWVudCkuZ2V0RmllbGQoU3RyaW5nLnZhbHVlT2YoYmluZGluZy5uYW1lKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgSUluaXRpYWxpemVyIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBnaXZlbiB0eXBlCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoaW50IGxvY2FsU291cmNlU3RhcnQsIGludCBsb2NhbFNvdXJjZUVuZCwgSmF2YUVsZW1lbnQgdHlwZSkgeworCQl0cnkgeworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIElUeXBlKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCUlJbml0aWFsaXplcltdIGluaXRpYWxpemVycyA9ICgoSVR5cGUpIHR5cGUpLmdldEluaXRpYWxpemVycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcnNbaV07CisJCQkJSVNvdXJjZVJhbmdlIHNvdXJjZVJhbmdlID0gaW5pdGlhbGl6ZXIuZ2V0U291cmNlUmFuZ2UoKTsKKwkJCQlpZiAoc291cmNlUmFuZ2UgIT0gbnVsbCkgeworCQkJCQlpbnQgaW5pdGlhbGl6ZXJTdGFydCA9IHNvdXJjZVJhbmdlLmdldE9mZnNldCgpOworCQkJCQlpbnQgaW5pdGlhbGl6ZXJFbmQgPSBpbml0aWFsaXplclN0YXJ0ICsgc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCk7CisJCQkJCWlmIChpbml0aWFsaXplclN0YXJ0IDw9IGxvY2FsU291cmNlU3RhcnQgJiYgbG9jYWxTb3VyY2VFbmQgPD0gaW5pdGlhbGl6ZXJFbmQpIHsKKwkJCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGluaXRpYWxpemVyOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgamF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBpbGVyIGJpbmRpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nLCBXb3JraW5nQ29weU93bmVyIHdvcmtpbmdDb3B5T3duZXIsIEJpbmRpbmdzVG9Ob2Rlc01hcCBiaW5kaW5nc1RvTm9kZXMpIHsKKwkJSmF2YUVsZW1lbnQgdW5yZXNvbHZlZEphdmFFbGVtZW50ID0gZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIHdvcmtpbmdDb3B5T3duZXIsIGJpbmRpbmdzVG9Ob2Rlcyk7CisJCWlmICh1bnJlc29sdmVkSmF2YUVsZW1lbnQgPT0gbnVsbCB8fCB1bnJlc29sdmVkSmF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IChJVHlwZSkgdW5yZXNvbHZlZEphdmFFbGVtZW50OworCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZSBub2RlID0gYmluZGluZ3NUb05vZGVzID09IG51bGwgPyBudWxsIDogYmluZGluZ3NUb05vZGVzLmdldChtZXRob2RCaW5kaW5nKTsKKwkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhZGVjbGFyaW5nVHlwZS5pc0JpbmFyeSgpKSB7CisJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEFubm90YXRpb25NZXRob2REZWNsYXJhdGlvbikgeworCQkJCS8vIG5vZGUgaXMgYW4gQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uCisJCQkJQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIHR5cGVNZW1iZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7CisJCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgZGVjbGFyaW5nVHlwZS5nZXRNZXRob2QoU3RyaW5nLnZhbHVlT2YodHlwZU1lbWJlckRlY2xhcmF0aW9uLnNlbGVjdG9yKSwgQ2hhck9wZXJhdGlvbi5OT19TVFJJTkdTKTsgLy8gYW5ub3RhdGlvbiB0eXBlIG1lbWJlcnMgZG9uJ3QgaGF2ZSBwYXJhbWV0ZXJzCisJCQl9IGVsc2UgeworCQkJCS8vIG5vZGUgaXMgYW4gTWV0aG9kRGVjbGFyYXRpb24KKwkJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKKworCQkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzOworCQkJCVN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXM7CisJCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJCXBhcmFtZXRlclNpZ25hdHVyZXMgPSBuZXcgU3RyaW5nW2FyZ3VtZW50cy5sZW5ndGhdOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJQXJndW1lbnQgYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CisJCQkJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBhcmd1bWVudC50eXBlOworCQkJCQkJaW50IGFycmF5RGltID0gdHlwZVJlZmVyZW5jZS5kaW1lbnNpb25zKCk7CisKKwkJCQkJCVN0cmluZyB0eXBlU2lnID0KKwkJCQkJCQlTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSgKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aCgKKwkJCQkJCQkJCQkJdHlwZVJlZmVyZW5jZS5nZXRUeXBlTmFtZSgpLCAnLicpLCBmYWxzZSk7CisJCQkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCQkJdHlwZVNpZyA9IFNpZ25hdHVyZS5jcmVhdGVBcnJheVNpZ25hdHVyZSh0eXBlU2lnLCBhcnJheURpbSk7CisJCQkJCQl9CisJCQkJCQlwYXJhbWV0ZXJTaWduYXR1cmVzW2ldID0gdHlwZVNpZzsKKworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcGFyYW1ldGVyU2lnbmF0dXJlcyA9IENoYXJPcGVyYXRpb24uTk9fU1RSSU5HUzsKKwkJCQl9CisJCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgZGVjbGFyaW5nVHlwZS5nZXRNZXRob2QoU3RyaW5nLnZhbHVlT2YobWV0aG9kRGVjbGFyYXRpb24uc2VsZWN0b3IpLCBwYXJhbWV0ZXJTaWduYXR1cmVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGNhc2Ugb2YgbWV0aG9kIG5vdCBpbiB0aGUgY3JlYXRlZCBBU1QsIG9yIGEgYmluYXJ5IG1ldGhvZAorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG9yaWdpbmFsID0gbWV0aG9kQmluZGluZy5vcmlnaW5hbCgpOworCQkJU3RyaW5nIHNlbGVjdG9yID0gb3JpZ2luYWwuaXNDb25zdHJ1Y3RvcigpID8gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpIDogbmV3IFN0cmluZyhvcmlnaW5hbC5zZWxlY3Rvcik7CisJCQlib29sZWFuIGlzQmluYXJ5ID0gZGVjbGFyaW5nVHlwZS5pc0JpbmFyeSgpOworCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gb3JpZ2luYWwuZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpOworCQkJYm9vbGVhbiBpc0lubmVyQmluYXJ5VHlwZUNvbnN0cnVjdG9yID0gaXNCaW5hcnkgJiYgb3JpZ2luYWwuaXNDb25zdHJ1Y3RvcigpICYmIGVuY2xvc2luZ1R5cGUgIT0gbnVsbDsKKwkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG9yaWdpbmFsLnBhcmFtZXRlcnM7CisJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycyA9PSBudWxsID8gMCA6IHBhcmFtZXRlcnMubGVuZ3RoOworCQkJaW50IGRlY2xhcmluZ0luZGV4ID0gaXNJbm5lckJpbmFyeVR5cGVDb25zdHJ1Y3RvciA/IDEgOiAwOworCQkJU3RyaW5nW10gcGFyYW1ldGVyU2lnbmF0dXJlcyA9IG5ldyBTdHJpbmdbZGVjbGFyaW5nSW5kZXggKyBsZW5ndGhdOworCQkJaWYgKGlzSW5uZXJCaW5hcnlUeXBlQ29uc3RydWN0b3IpCisJCQkJcGFyYW1ldGVyU2lnbmF0dXJlc1swXSA9IG5ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZS5nZW5lcmljVHlwZVNpZ25hdHVyZSgpKS5yZXBsYWNlKCcvJywgJy4nKTsKKwkJCWZvciAoaW50IGkgPSAwOyAgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJY2hhcltdIHNpZ25hdHVyZSA9IHBhcmFtZXRlcnNbaV0uZ2VuZXJpY1R5cGVTaWduYXR1cmUoKTsKKwkJCQlpZiAoaXNCaW5hcnkpIHsKKwkJCQkJc2lnbmF0dXJlID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KHNpZ25hdHVyZSwgJy8nLCAnLicpOworCQkJCX0gZWxzZSB7CisJCQkJCXNpZ25hdHVyZSA9IHRvVW5yZXNvbHZlZFR5cGVTaWduYXR1cmUoc2lnbmF0dXJlKTsKKwkJCQl9CisJCQkJcGFyYW1ldGVyU2lnbmF0dXJlc1tkZWNsYXJpbmdJbmRleCArIGldID0gbmV3IFN0cmluZyhzaWduYXR1cmUpOworCQkJfQorCQkJSU1ldGhvZCByZXN1bHQgPSBkZWNsYXJpbmdUeXBlLmdldE1ldGhvZChzZWxlY3RvciwgcGFyYW1ldGVyU2lnbmF0dXJlcyk7CisJCQlpZiAoaXNCaW5hcnkpCisJCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgcmVzdWx0OworCQkJaWYgKHJlc3VsdC5leGlzdHMoKSkgLy8gaWYgcGVyZmVjdCBtYXRjaCAoc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDk1NjcgKQorCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIHJlc3VsdDsKKwkJCUlNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJbWV0aG9kcyA9IGRlY2xhcmluZ1R5cGUuZ2V0TWV0aG9kcygpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBkZWNsYXJpbmcgdHlwZSBkb2Vzbid0IGV4aXN0CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlJTWV0aG9kW10gY2FuZGlkYXRlcyA9IE1lbWJlci5maW5kTWV0aG9kcyhyZXN1bHQsIG1ldGhvZHMpOworCQkJaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCB8fCBjYW5kaWRhdGVzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybiBudWxsOworCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgY2FuZGlkYXRlc1swXTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgamF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbXBpbGVyIGJpbmRpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhRWxlbWVudCBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciwgQmluZGluZ3NUb05vZGVzTWFwIGJpbmRpbmdzVG9Ob2RlcykgeworCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlzd2l0Y2ggKHR5cGVCaW5kaW5nLmtpbmQoKSkgeworCQkJY2FzZSBCaW5kaW5nLkFSUkFZX1RZUEUgOgorCQkJCXR5cGVCaW5kaW5nID0gKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZykgdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlKCk7CisJCQkJcmV0dXJuIGdldFVucmVzb2x2ZWRKYXZhRWxlbWVudCh0eXBlQmluZGluZywgd29ya2luZ0NvcHlPd25lciwgYmluZGluZ3NUb05vZGVzKTsKKwkJCWNhc2UgQmluZGluZy5CQVNFX1RZUEUgOgorCQkJY2FzZSBCaW5kaW5nLldJTERDQVJEX1RZUEUgOgorCQkJY2FzZSBCaW5kaW5nLklOVEVSU0VDVElPTl9UWVBFOgorCQkJCXJldHVybiBudWxsOworCQkJZGVmYXVsdCA6CisJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQ2FwdHVyZSgpKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmc7CisJCWlmICh0eXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkgfHwgdHlwZUJpbmRpbmcuaXNSYXdUeXBlKCkpCisJCQlyZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nLmVyYXN1cmUoKTsKKwkJZWxzZQorCQkJcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJY2hhcltdIGZpbGVOYW1lID0gcmVmZXJlbmNlQmluZGluZy5nZXRGaWxlTmFtZSgpOworCQlpZiAocmVmZXJlbmNlQmluZGluZy5pc0xvY2FsVHlwZSgpIHx8IHJlZmVyZW5jZUJpbmRpbmcuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCS8vIGxvY2FsIG9yIGFub255bW91cyB0eXBlCisJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUoZmlsZU5hbWUpKSB7CisJCQkJaW50IGphclNlcGFyYXRvciA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihJRGVwZW5kZW50LkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiwgZmlsZU5hbWUpOworCQkJCWludCBwa2dFbmQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcvJywgZmlsZU5hbWUpOyAvLyBwa2dFbmQgaXMgZXhjbHVzaXZlCisJCQkJaWYgKHBrZ0VuZCA9PSAtMSkKKwkJCQkJcGtnRW5kID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGZpbGVOYW1lKTsKKwkJCQlpZiAoamFyU2VwYXJhdG9yICE9IC0xICYmIHBrZ0VuZCA8IGphclNlcGFyYXRvcikgLy8gaWYgaW4gYSBqYXIgYW5kIG5vIHNsYXNoLCBpdCBpcyBhIGRlZmF1bHQgcGFja2FnZSAtPiBwa2dFbmQgc2hvdWxkIGJlIGVxdWFsIHRvIGphclNlcGFyYXRvcgorCQkJCQlwa2dFbmQgPSBqYXJTZXBhcmF0b3I7CisJCQkJaWYgKHBrZ0VuZCA9PSAtMSkKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoZmlsZU5hbWUsIHBrZ0VuZCwgamFyU2VwYXJhdG9yKTsKKwkJCQljaGFyW10gY29uc3RhbnRQb29sTmFtZSA9IHJlZmVyZW5jZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpOworCQkJCWlmIChjb25zdGFudFBvb2xOYW1lID09IG51bGwpIHsKKwkJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIGdldENsYXNzRmlsZShmaWxlTmFtZSk7CisJCQkJCXJldHVybiBjbGFzc0ZpbGUgPT0gbnVsbCA/IG51bGwgOiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJCQkJfQorCQkJCXBrZ0VuZCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy8nLCBjb25zdGFudFBvb2xOYW1lKTsKKwkJCQljaGFyW10gY2xhc3NGaWxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29uc3RhbnRQb29sTmFtZSwgcGtnRW5kKzEsIGNvbnN0YW50UG9vbE5hbWUubGVuZ3RoKTsKKwkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgcGtnLmdldENsYXNzRmlsZShuZXcgU3RyaW5nKGNsYXNzRmlsZU5hbWUpICsgU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9TVFJJTkdfY2xhc3MpOworCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJCQl9CisJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCB3b3JraW5nQ29weU93bmVyKTsKKwkJCWlmIChjdSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCS8vIG11c3QgdXNlIGdldEVsZW1lbnRBdCguLi4pIGFzIHRoZXJlIGlzIG5vIGJhY2sgcG9pbnRlciB0byB0aGUgZGVmaW5pbmcgbWV0aG9kIChzY29wZSBpcyBudWxsIGFmdGVyIHJlc29sdXRpb24gaGFzIGVuZGVkKQorCQkJdHJ5IHsKKwkJCQlpbnQgc291cmNlU3RhcnQgPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxUeXBlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykuc291cmNlU3RhcnQ7CisJCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgY3UuZ2V0RWxlbWVudEF0KHNvdXJjZVN0YXJ0KTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gZG9lcyBub3QgZXhpc3QKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChyZWZlcmVuY2VCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkpIHsKKwkJCS8vIHR5cGUgcGFyYW1ldGVyCisJCQlmaW5hbCBTdHJpbmcgdHlwZVZhcmlhYmxlTmFtZSA9IG5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zb3VyY2VOYW1lKCkpOworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nIGRlY2xhcmluZ0VsZW1lbnQgPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZVZhcmlhYmxlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykuZGVjbGFyaW5nRWxlbWVudDsKKwkJCWlmIChkZWNsYXJpbmdFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykgeworCQkJCUlNZXRob2QgZGVjbGFyaW5nTWV0aG9kID0gKElNZXRob2QpIGdldFVucmVzb2x2ZWRKYXZhRWxlbWVudCgoTWV0aG9kQmluZGluZykgZGVjbGFyaW5nRWxlbWVudCwgd29ya2luZ0NvcHlPd25lciwgYmluZGluZ3NUb05vZGVzKTsKKwkJCQlyZXR1cm4gKEphdmFFbGVtZW50KSBkZWNsYXJpbmdNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih0eXBlVmFyaWFibGVOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IChJVHlwZSkgZ2V0VW5yZXNvbHZlZEphdmFFbGVtZW50KChUeXBlQmluZGluZykgZGVjbGFyaW5nRWxlbWVudCwgd29ya2luZ0NvcHlPd25lciwgYmluZGluZ3NUb05vZGVzKTsKKwkJCQlyZXR1cm4gKEphdmFFbGVtZW50KSBkZWNsYXJpbmdUeXBlLmdldFR5cGVQYXJhbWV0ZXIodHlwZVZhcmlhYmxlTmFtZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGNhc2Ugb2YgYSBXaWxDYXJkQmluZGluZyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgSmF2YSBlbGVtZW50CisJCQkvLyBtZW1iZXIgb3IgdG9wIGxldmVsIHR5cGUKKwkJCVR5cGVCaW5kaW5nIGRlY2xhcmluZ1R5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOworCQkJaWYgKGRlY2xhcmluZ1R5cGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQkvLyB0b3AgbGV2ZWwgdHlwZQorCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSkpIHsKKwkJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIGdldENsYXNzRmlsZShmaWxlTmFtZSk7CisJCQkJCWlmIChjbGFzc0ZpbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJCXJldHVybiAoSmF2YUVsZW1lbnQpIGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJCQkJfQorCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoZmlsZU5hbWUsIHdvcmtpbmdDb3B5T3duZXIpOworCQkJCWlmIChjdSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQlyZXR1cm4gKEphdmFFbGVtZW50KSBjdS5nZXRUeXBlKG5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zb3VyY2VOYW1lKCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbWVtYmVyIHR5cGUKKwkJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gKElUeXBlKSBnZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoZGVjbGFyaW5nVHlwZUJpbmRpbmcsIHdvcmtpbmdDb3B5T3duZXIsIGJpbmRpbmdzVG9Ob2Rlcyk7CisJCQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJcmV0dXJuIChKYXZhRWxlbWVudCkgZGVjbGFyaW5nVHlwZS5nZXRUeXBlKG5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zb3VyY2VOYW1lKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCiAJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1vc3Qgc3BlY2lmaWMgYXJndW1lbnQgcGF0aHMgd2hpY2ggaXMgc3RyaWN0bHkgZW5jbG9zaW5nIHRoZSBwYXRoIHRvIGNoZWNrCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkVuY2xvc2luZ1BhdGgoSVBhdGggY2hlY2tlZFBhdGgsIElQYXRoW10gcGF0aHMsIGludCBwYXRoQ291bnQpIHsKQEAgLTEyMTEsMTAgKzE1NTcsMTAgQEAKIAkJfQogCQlyZXR1cm4gYmVzdE1hdGNoOwogCX0KLQkKKwogCS8qCiAJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIEphdmEgbGlrZSBleHRlbnNpb24gb2YgdGhlIGdpdmVuIGZpbGUgbmFtZQotCSAqIG9yIC0xIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggYSBrbm93biBKYXZhIGxpa2UgZXh0ZW5zaW9uLiAKKwkgKiBvciAtMSBpZiBpdCBkb2Vzbid0IGVuZCB3aXRoIGEga25vd24gSmF2YSBsaWtlIGV4dGVuc2lvbi4KIAkgKiBOb3RlIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSAnLicgZXZlbiBpZiBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBleHRlbnNpb24uCiAJICovCiAJcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkphdmFMaWtlRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewpAQCAtMTIzNSw3ICsxNTgxLDcgQEAKIAkJfQogCQlyZXR1cm4gLTE7CiAJfQotCQorCiAJLyoKIAkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJndW1lbnQgcGF0aHMgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHBhdGggdG8gY2hlY2sKIAkgKi8KQEAgLTEyNjUsNyArMTYxMSw3IEBACiAJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQXR0cmlidXRlU3VwcG9ydGVkKGludCBhdHRyaWJ1dGUpIHsKIAkJcmV0dXJuIChFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuYXR0cmlidXRlcygpICYgYXR0cmlidXRlKSAhPSAwOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgcmVhZC1vbmx5IG9yIG5vdC4KIAkgKiBAcGFyYW0gcmVzb3VyY2UKQEAgLTEzMDIsMTkgKzE2NDgsMTkgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7CisJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gKChQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQpLnJlc291cmNlKCk7CiAJCQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgaXNFeGNsdWRlZChyZXNvdXJjZSwgcm9vdC5mdWxsSW5jbHVzaW9uUGF0dGVybkNoYXJzKCksIHJvb3QuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpKTsKLQkJCQkKKwogCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKLQkJCQlyb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKKwkJCQlyb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CiAJCQkJcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIAorCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJaWYgKGlzRXhjbHVkZWQocmVzb3VyY2UsIHJvb3QuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpLCByb290LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJCXJldHVybiBpc0V4Y2x1ZGVkKGVsZW1lbnQuZ2V0UGFyZW50KCkpOwotCQkJCQorCiAJCQlkZWZhdWx0OgogCQkJCUlKYXZhRWxlbWVudCBjdSA9IGVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpOwogCQkJCXJldHVybiBjdSAhPSBudWxsICYmIGlzRXhjbHVkZWQoY3UpOwpAQCAtMTMzMCw3ICsxNjc2LDcgQEAKIAlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChJUGF0aCByZXNvdXJjZVBhdGgsIGNoYXJbXVtdIGluY2x1c2lvblBhdHRlcm5zLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucywgYm9vbGVhbiBpc0ZvbGRlclBhdGgpIHsKIAkJaWYgKGluY2x1c2lvblBhdHRlcm5zID09IG51bGwgJiYgZXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0V4Y2x1ZGVkKHJlc291cmNlUGF0aC50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucywgaXNGb2xkZXJQYXRoKTsKLQl9CQorCX0KIAogCS8qCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBtYXRjaGVzIG9uZSBvZiB0aGUgZXhjbHVzaW9uIHBhdHRlcm5zLgpAQCAtMTM1OCw3ICsxNzA0LDcgQEAKIAkgKiBAcGFyYW0gc291cmNlTGV2ZWwgdGhlIHNvdXJjZSBsZXZlbAogCSAqIEBwYXJhbSBjb21wbGlhbmNlTGV2ZWwgdGhlIGNvbXBsaWFuY2UgbGV2ZWwKIAkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLQkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSAuY2xhc3MgZmlsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgLmNsYXNzIGZpbGUgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2xhc3NGaWxlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKSB7CkBAIC0xMzc5LDcgKzE3MjUsNyBAQAogCSAqIEBwYXJhbSBzb3VyY2VMZXZlbCB0aGUgc291cmNlIGxldmVsCiAJICogQHBhcmFtIGNvbXBsaWFuY2VMZXZlbCB0aGUgY29tcGxpYW5jZSBsZXZlbAogCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCiAJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZUxldmVsLCBTdHJpbmcgY29tcGxpYW5jZUxldmVsKSB7CkBAIC0xMzk1LDcgKzE3NDEsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UoU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBzb3VyY2VMZXZlbCwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCkgewogCQlyZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihmb2xkZXJOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgaXMgdmFsaWQsCkBAIC0xNDE4LDcgKzE3NjQsNyBAQAogCQlpID0gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZywgaSwgbGVuLCB0cnVlKTsKIAkJcmV0dXJuIGkgPT0gbGVuOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUgaXMgdmFsaWQsCiAJICogZmFsc2UgaWYgaXQgaXMgbm90LgpAQCAtMTQyNywxMyArMTc3MywxMyBAQAogCQlpbnQgbGVuID0gc2lnLmxlbmd0aCgpOwogCQlyZXR1cm4gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZywgMCwgbGVuLCBhbGxvd1ZvaWQpID09IGxlbjsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIGEgbG9jYWwgdHlwZSBmcm9tIHRoZSBnaXZlbiBiaW5hcnkgdHlwZSBuYW1lLgogCSAqIFRoZSBsYXN0ICckJyBpcyBhdCBsYXN0RG9sbGFyLiBUaGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHR5cGUgbmFtZSBpcyBhdCBlbmQtMS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFR5cGVOYW1lKFN0cmluZyBiaW5hcnlUeXBlTmFtZSwgaW50IGxhc3REb2xsYXIsIGludCBlbmQpIHsKLQkJaWYgKGxhc3REb2xsYXIgPiAwICYmIGJpbmFyeVR5cGVOYW1lLmNoYXJBdChsYXN0RG9sbGFyLTEpID09ICckJykgCisJCWlmIChsYXN0RG9sbGFyID4gMCAmJiBiaW5hcnlUeXBlTmFtZS5jaGFyQXQobGFzdERvbGxhci0xKSA9PSAnJCcpCiAJCQkvLyBsb2NhbCBuYW1lIHN0YXJ0cyB3aXRoIGEgZG9sbGFyIHNpZ24KIAkJCS8vIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzQ2NikKIAkJCXJldHVybiBiaW5hcnlUeXBlTmFtZTsKQEAgLTE0NDgsMTkgKzE3OTQsNzEgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlLCBTdHJpbmcgbWVzc2FnZSkgewogCQlUaHJvd2FibGUgbmVzdGVkRXhjZXB0aW9uOwotCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbiAKKwkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24KIAkJCQkmJiAobmVzdGVkRXhjZXB0aW9uID0gKChKYXZhTW9kZWxFeGNlcHRpb24pZSkuZ2V0RXhjZXB0aW9uKCkpICE9IG51bGwpIHsKIAkJCWUgPSBuZXN0ZWRFeGNlcHRpb247CiAJCX0KLQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCAKLQkJCUphdmFDb3JlLlBMVUdJTl9JRCwgCi0JCQlJU3RhdHVzLkVSUk9SLCAKLQkJCW1lc3NhZ2UsIAotCQkJZSk7IAorCQlsb2cobmV3IFN0YXR1cygKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCUphdmFDb3JlLlBMVUdJTl9JRCwKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCW1lc3NhZ2UsCisJCQkJZSkpOworCX0KKworCS8qKgorCSAqIExvZyBhIG1lc3NhZ2UgdGhhdCBpcyBwb3RlbnRpYWxseSByZXBlYXRlZCBpbiB0aGUgc2FtZSBzZXNzaW9uLgorCSAqIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgZ2l2ZW4gZXhjZXB0aW9uLCB0aGUKKwkgKiBleGNlcHRpb24gc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiB0byB0aGUgbG9nLgorCSAqIDxwPk9ubHkgaW50ZW5kZWQgZm9yIHVzZSBpbiBkZWJ1ZyBzdGF0ZW1lbnRzLjwvcD4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIGdpdmVuIGtleQorCSAqIEBwYXJhbSBlIHRoZSBnaXZlbiBleGNlcHRpb24KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4ga2V5IGlzIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nUmVwZWF0ZWRNZXNzYWdlKFN0cmluZyBrZXksIEV4Y2VwdGlvbiBlKSB7CisJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoZmdSZXBlYXRlZE1lc3NhZ2VzLmNvbnRhaW5zKGtleSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmZ1JlcGVhdGVkTWVzc2FnZXMuYWRkKGtleSk7CisJCWxvZyhlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nUmVwZWF0ZWRNZXNzYWdlKFN0cmluZyBrZXksIGludCBzdGF0dXNFcnJvcklELCBTdHJpbmcgbWVzc2FnZSkgeworCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGZnUmVwZWF0ZWRNZXNzYWdlcy5jb250YWlucyhrZXkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZmdSZXBlYXRlZE1lc3NhZ2VzLmFkZChrZXkpOworCQlsb2coc3RhdHVzRXJyb3JJRCwgbWVzc2FnZSk7CisJfQorCisJLyoKKwkgKiBBZGQgYSBsb2cgZW50cnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzdGF0dXNFcnJvcklELCBTdHJpbmcgbWVzc2FnZSkgeworCQlsb2cobmV3IFN0YXR1cygKKwkJCQlzdGF0dXNFcnJvcklELAorCQkJCUphdmFDb3JlLlBMVUdJTl9JRCwKKwkJCQltZXNzYWdlKSk7CisJfQorCisJLyoKKwkgKiBBZGQgYSBsb2cgZW50cnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7CiAJCUphdmFDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwogCX0KLQkKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKKwkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBNZXNzYWdlcy5jb2RlX2Fzc2lzdF9pbnRlcm5hbF9lcnJvciwgZSkpOworCX0KKwogCXB1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlUmVhZGVyIG5ld0NsYXNzRmlsZVJlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CiAJCXRyeSB7CkBAIC0xNTMzLDggKzE5MzEsOCBAQAogCX0KIAogCS8qKgotCSAqIE5vcm1hbGl6ZXMgdGhlIGNhcmlhZ2UgcmV0dXJucyBpbiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKiBUaGV5IGFyZSBhbGwgY2hhbmdlZCAgdG8gdXNlIGdpdmVuIGJ1ZmZlcidzIGxpbmUgc2VwYXRhdG9yLgorCSAqIE5vcm1hbGl6ZXMgdGhlIGNhcnJpYWdlIHJldHVybnMgaW4gdGhlIGdpdmVuIHRleHQuCisJICogVGhleSBhcmUgYWxsIGNoYW5nZWQgdG8gdXNlIGdpdmVuIGJ1ZmZlcidzIGxpbmUgc2VwYXJhdG9yLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZUNScyhTdHJpbmcgdGV4dCwgU3RyaW5nIGJ1ZmZlcikgewogCQlyZXR1cm4gbmV3IFN0cmluZyhub3JtYWxpemVDUnModGV4dC50b0NoYXJBcnJheSgpLCBidWZmZXIudG9DaGFyQXJyYXkoKSkpOwpAQCAtMTczMiw3ICsyMTMwLDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxhdGl2ZVBhdGgoSVBhdGggZnVsbFBhdGgsIGludCBza2lwU2VnbWVudENvdW50KSB7CiAJCWJvb2xlYW4gaGFzVHJhaWxpbmdTZXBhcmF0b3IgPSBmdWxsUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpOwogCQlTdHJpbmdbXSBzZWdtZW50cyA9IGZ1bGxQYXRoLnNlZ21lbnRzKCk7Ci0JCQorCiAJCS8vIGNvbXB1dGUgbGVuZ3RoCiAJCWludCBsZW5ndGggPSAwOwogCQlpbnQgbWF4ID0gc2VnbWVudHMubGVuZ3RoOwpAQCAtMTc2NiwxNiArMjE2NCwzNiBAQAogCQkJcmVzdWx0W29mZnNldCsrXSA9ICcvJzsKIAkJcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0KTsKIAl9Ci0JCisKIAkvKgogCSAqIFJlc2V0cyB0aGUgbGlzdCBvZiBKYXZhLWxpa2UgZXh0ZW5zaW9ucyBhZnRlciBhIGNoYW5nZSBpbiBjb250ZW50LXR5cGUuCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgewogCQlKQVZBX0xJS0VfRVhURU5TSU9OUyA9IG51bGw7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyLiBUaGUgZ2l2ZW4gZW5kIAorCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGluZGV4CisJICogYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KKwkgKiA8cHJlPgorCSAqIFR5cGVTaWduYXR1cmU6CisJICogIHwgIEJhc2VUeXBlU2lnbmF0dXJlCisJICogIHwgIEFycmF5VHlwZVNpZ25hdHVyZQorCSAqICB8ICBDbGFzc1R5cGVTaWduYXR1cmUKKwkgKiAgfCAgVHlwZVZhcmlhYmxlU2lnbmF0dXJlCisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCisJICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgeworCQkvLyB0aGlzIG1ldGhvZCBpcyB1c2VkIGluIGpkdC5kZWJ1ZworCQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5zY2FuVHlwZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKKwl9CisJLyoqCisJICogUmV0dXJuIGEgbmV3IGFycmF5IHdoaWNoIGlzIHRoZSBzcGxpdCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyLiBUaGUgZ2l2ZW4gZW5kCiAJICogaXMgZXhjbHVzaXZlIGFuZCB0aGUgZ2l2ZW4gc3RhcnQgaXMgaW5jbHVzaXZlLgogCSAqIDxicj4KIAkgKiA8YnI+CkBAIC0xNzkwLDcgKzIyMDgsNyBAQAogCSAqIDwvcHJlPgogCSAqIDwvbGk+CiAJICogPC9vbD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkaXZpZGVyIHRoZSBnaXZlbiBkaXZpZGVyCiAJICogQHBhcmFtIHN0cmluZyB0aGUgZ2l2ZW4gc3RyaW5nCiAJICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydGluZyBpbmRleApAQCAtMTgyNSw5ICsyMjQzLDkgQEAKIAkvKioKIAkgKiBTZXRzIG9yIHVuc2V0cyB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXMgcmVhZC1vbmx5IGluIHRoZSBmaWxlIHN5c3RlbS4KIAkgKiBJdCdzIGEgbm8tb3AgaWYgdGhlIGZpbGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlYWQtb25seSBhdHRyaWJ1dGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIHNldCBhcyByZWFkLW9ubHkKLQkgKiBAcGFyYW0gcmVhZE9ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2V0IGl0IHRvIHJlYWQtb25seSwgCisJICogQHBhcmFtIHJlYWRPbmx5IDxjb2RlPnRydWU8L2NvZGU+IHRvIHNldCBpdCB0byByZWFkLW9ubHksCiAJICoJCTxjb2RlPmZhbHNlPC9jb2RlPiB0byB1bnNldAogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWFkT25seShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVhZE9ubHkpIHsKQEAgLTE4ODksOCArMjMwNyw4IEBACiAJfQogCiAJLyoqCi0JICogU29ydHMgYW4gYXJyYXkgb2YgSmF2YSBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciB0b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSwgCi0JICogcmV0dXJuaW5nIGEgbmV3IGFycmF5IHdpdGggdGhlIHNvcnRlZCBpdGVtcy4gCisJICogU29ydHMgYW4gYXJyYXkgb2YgSmF2YSBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciB0b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSwKKwkgKiByZXR1cm5pbmcgYSBuZXcgYXJyYXkgd2l0aCB0aGUgc29ydGVkIGl0ZW1zLgogCSAqIFRoZSBvcmlnaW5hbCBhcnJheSBpcyBsZWZ0IHVudG91Y2hlZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudFtdIHNvcnRDb3B5KElKYXZhRWxlbWVudFtdIGVsZW1lbnRzKSB7CkBAIC0xOTA0LDcgKzIzMjIsNyBAQAogCQl9KTsKIAkJcmV0dXJuIGNvcHk7CiAJfQotCQorCiAJLyoqCiAJICogU29ydHMgYW4gYXJyYXkgb2YgU3RyaW5ncywgcmV0dXJuaW5nIGEgbmV3IGFycmF5CiAJICogd2l0aCB0aGUgc29ydGVkIGl0ZW1zLiAgVGhlIG9yaWdpbmFsIGFycmF5IGlzIGxlZnQgdW50b3VjaGVkLgpAQCAtMTkzMSw3ICsyMzQ5LDcgQEAKIAogCS8qCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjb21wb3VuZCBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBuIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBwcmVmaXggYXJlIGVxdWFscyBhbmQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBuIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBwcmVmaXggYXJlIGVxdWFscyBhbmQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUKIAkgKiBwcmVmaXggaXMgYSBwcmVmaXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUgY29tcG91bmQgbmFtZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnRzV2l0aElnbm9yZUNhc2UoU3RyaW5nW10gY29tcG91bmROYW1lLCBTdHJpbmdbXSBwcmVmaXgsIGJvb2xlYW4gcGFydGlhbE1hdGNoKSB7CkBAIC0xOTQ1LDMwICsyMzYzLDYgQEAKIAkJcmV0dXJuIChwYXJ0aWFsTWF0Y2ggfHwgcHJlZml4TGVuZ3RoID09IG5hbWVMZW5ndGgpICYmIGNvbXBvdW5kTmFtZVtwcmVmaXhMZW5ndGgtMV0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeFtwcmVmaXhMZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBvdW5kIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlc1dpdGhJZ25vcmVDYXNlKFN0cmluZ1tdIGNvbXBvdW5kTmFtZSwgU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4uZXF1YWxzKCIqIikpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWludCBuYW1lTGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsKLQkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIG5hbWVMZW5ndGggPT0gMDsKLQkJaWYgKG5hbWVMZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gbmFtZUxlbmd0aC0xOwotCQlmb3IgKGludCBpPTA7IGk8bmFtZUxlbmd0aDsgaSsrKSB7Ci0JCQlsZW5ndGggKz0gY29tcG91bmROYW1lW2ldLmxlbmd0aCgpOwotCQl9Ci0JCWNoYXJbXSBjb21wb3VuZENoYXJzID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHBvcyA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxuYW1lTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwb3MgPiAwKSBjb21wb3VuZENoYXJzW3BvcysrXSA9ICcuJzsKLQkJCWNoYXJbXSBhcnJheSA9IGNvbXBvdW5kTmFtZVtpXS50b0NoYXJBcnJheSgpOwotCQkJaW50IHNpemUgPSBhcnJheS5sZW5ndGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBjb21wb3VuZENoYXJzLCBwb3MsIHNpemUpOwotCQkJcG9zICs9IHNpemU7Ci0JCX0KLQkJcmV0dXJuIENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybi50b0NoYXJBcnJheSgpLCBjb21wb3VuZENoYXJzLCBmYWxzZSk7Ci0JfQotCiAJLyoqCiAJICogQ29udmVydHMgYSBTdHJpbmdbXSB0byBjaGFyW11bXS4KIAkgKi8KQEAgLTIwMDUsNiArMjM5OSw3IEBACiAJCX0KIAkJcmV0dXJuIHNlZ3M7CiAJfQorCiAJLyoKIAkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gVVJJIHRvIGEgbG9jYWwgZmlsZS4gVXNlIHRoZSBleGlzdGluZyBmaWxlIGlmIHRoZSB1cmkgaXMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgogCSAqIE90aGVyd2lzZSBmZXRjaCBpdC4KQEAgLTIwNDMsNyArMjQzOCw3IEBACiAJCXNiLmFwcGVuZChkKTsKIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAJfQotCQorCiAJLyoKIAkgKiBDb252ZXJ0cyBhIGNoYXJbXVtdIHRvIFN0cmluZ1tdLgogCSAqLwpAQCAtMjA1NSw2ICsyNDUwLDQ0IEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHRvVW5yZXNvbHZlZFR5cGVTaWduYXR1cmUoY2hhcltdIHNpZ25hdHVyZSkgeworCQlpbnQgbGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA8PSAxKQorCQkJcmV0dXJuIHNpZ25hdHVyZTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKKwkJdG9VbnJlc29sdmVkVHlwZVNpZ25hdHVyZShzaWduYXR1cmUsIDAsIGxlbmd0aCwgYnVmZmVyKTsKKwkJaW50IGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2J1ZmZlckxlbmd0aF07CisJCWJ1ZmZlci5nZXRDaGFycygwLCBidWZmZXJMZW5ndGgsIHJlc3VsdCwgMCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IHRvVW5yZXNvbHZlZFR5cGVTaWduYXR1cmUoY2hhcltdIHNpZ25hdHVyZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWlmIChzaWduYXR1cmVbc3RhcnRdID09IFNpZ25hdHVyZS5DX1JFU09MVkVEKQorCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUuQ19VTlJFU09MVkVEKTsKKwkJZWxzZQorCQkJYnVmZmVyLmFwcGVuZChzaWduYXR1cmVbc3RhcnRdKTsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0KzE7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJY2hhciBjID0gc2lnbmF0dXJlW2ldOworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICcvJzoKKwkJCWNhc2UgU2lnbmF0dXJlLkNfRE9MTEFSOgorCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLkNfRE9UKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2lnbmF0dXJlLkNfR0VORVJJQ19TVEFSVDoKKwkJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQpOworCQkJCWkgPSB0b1VucmVzb2x2ZWRUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgaSsxLCBsZW5ndGgsIGJ1ZmZlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNpZ25hdHVyZS5DX0dFTkVSSUNfRU5EOgorCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLkNfR0VORVJJQ19FTkQpOworCQkJCXJldHVybiBpOworCQkJZGVmYXVsdDoKKwkJCQlidWZmZXIuYXBwZW5kKGMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBsZW5ndGg7CisJfQogCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQXJyYXlUeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBjb21wYWN0KSB7CiAJCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOwogCQkvLyBuZWVkIGEgbWluaW11bSAyIGNoYXIKQEAgLTIwNjUsNyArMjQ5OCw3IEBACiAJCWlmIChjICE9IFNpZ25hdHVyZS5DX0FSUkFZKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJCisKIAkJaW50IGluZGV4ID0gc3RhcnQ7CiAJCWMgPSBzdHJpbmdbKytpbmRleF07CiAJCXdoaWxlKGMgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIHsKQEAgLTIwNzUsOSArMjUwOCw5IEBACiAJCQl9CiAJCQljID0gc3RyaW5nWysraW5kZXhdOwogCQl9Ci0JCQorCiAJCWFwcGVuZFR5cGVTaWduYXR1cmUoc3RyaW5nLCBpbmRleCwgYnVmZmVyLCBjb21wYWN0KTsKLQkJCisKIAkJZm9yKGludCBpID0gMCwgZGltcyA9IGluZGV4IC0gc3RhcnQ7IGkgPCBkaW1zOyBpKyspIHsKIAkJCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQoJ10nKTsKIAkJfQpAQCAtMjEyOSw3ICsyNTYyLDcgQEAKIAkJCQlhcHBlbmRDbGFzc1R5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCwgYnVmZmVyLCBjb21wYWN0KTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU2lnbmF0dXJlLkNfVFlQRV9WQVJJQUJMRSA6Ci0JCQkJaW50IGUgPSBVdGlsLnNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQkJaW50IGUgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLnNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CiAJCQkJYnVmZmVyLmFwcGVuZChzdHJpbmcsIHN0YXJ0ICsgMSwgZSAtIHN0YXJ0IC0gMSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNpZ25hdHVyZS5DX0JPT0xFQU4gOgpAQCAtMjE2NywxMiArMjYwMCwxMiBAQAogCQlpZiAoZmlyc3RQYXJlbiA9PSAtMSkgewogCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJCisKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWV0aG9kU2lnbmF0dXJlLmxlbmd0aCArIDEwKTsKLQkJCisKIAkJLy8gZGVjb2RlIGRlY2xhcmluZyBjbGFzcyBuYW1lCiAJCS8vIGl0IGNhbiBiZSBlaXRoZXIgYW4gYXJyYXkgc2lnbmF0dXJlIG9yIGEgdHlwZSBzaWduYXR1cmUKLQkJaWYgKGRlY2xhcmluZ0NsYXNzLmxlbmd0aCA+IDApIHsKKwkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgZGVjbGFyaW5nQ2xhc3MubGVuZ3RoID4gMCkgewogCQkJY2hhcltdIGRlY2xhcmluZ0NsYXNzU2lnbmF0dXJlID0gbnVsbDsKIAkJCWlmIChkZWNsYXJpbmdDbGFzc1swXSA9PSBTaWduYXR1cmUuQ19BUlJBWSkgewogCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShkZWNsYXJpbmdDbGFzcywgJy8nLCAnLicpOwpAQCAtMjE4NywxNiArMjYyMCwxNiBAQAogCQkJfSBlbHNlIHsKIAkJCQlidWZmZXIuYXBwZW5kKGRlY2xhcmluZ0NsYXNzU2lnbmF0dXJlKTsKIAkJCX0KKwkJCWlmICghaXNDb25zdHJ1Y3RvcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKKwkJCX0KIAkJfQogCiAJCS8vIHNlbGVjdG9yCi0JCWlmICghaXNDb25zdHJ1Y3RvcikgewotCQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCQl9CisJCWlmICghaXNDb25zdHJ1Y3RvciAmJiBtZXRob2ROYW1lICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kTmFtZSk7CiAJCX0KLQkJCisKIAkJLy8gcGFyYW1ldGVycwogCQlidWZmZXIuYXBwZW5kKCcoJyk7CiAJCWNoYXJbXVtdIHB0cyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhtZXRob2RTaWduYXR1cmUpOwpAQCAtMjIwOCw3ICsyNjQxLDcgQEAKIAkJCX0KIAkJfQogCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCQorCiAJCWlmICghaXNDb25zdHJ1Y3RvcikgewogCQkJYnVmZmVyLmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKIAkJCS8vIHJldHVybiB0eXBlCkBAIC0yMjM4LDEzICsyNjcxLDI4IEBACiAJfQogCiAJLyoKLQkgKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBnaXZlbiB0eXBlIHJlZmVyZW5jZSwgCisJICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSByZWZlcmVuY2UsCiAJICogZS5nLiAiUVN0cmluZzsiLCAiW2ludCIsICJbW1FqYXZhLnV0aWwuVmVjdG9yOyIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU2lnbmF0dXJlKFR5cGVSZWZlcmVuY2UgdHlwZSkgewotCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSB0eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpOwotCQljaGFyW10gdHlwZU5hbWUgPUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyk7Ci0JCVN0cmluZyBzaWduYXR1cmUgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgZmFsc2UvKmRvbid0IHJlc29sdmUqLyk7CisJCVN0cmluZyBzaWduYXR1cmUgPSBudWxsOworCQlpZiAoKHR5cGUuYml0cyAmIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZS5Jc1VuaW9uVHlwZSkgIT0gMCkgeworCQkJLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHVuaW9uIHR5cGUgcmVmZXJlbmNlCisJCQlVbmlvblR5cGVSZWZlcmVuY2UgdW5pb25UeXBlUmVmZXJlbmNlID0gKFVuaW9uVHlwZVJlZmVyZW5jZSkgdHlwZTsKKwkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlUmVmZXJlbmNlcyA9IHVuaW9uVHlwZVJlZmVyZW5jZS50eXBlUmVmZXJlbmNlczsKKwkJCWludCBsZW5ndGggPSB0eXBlUmVmZXJlbmNlcy5sZW5ndGg7CisJCQlTdHJpbmdbXSB0eXBlU2lnbmF0dXJlcyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IHR5cGVSZWZlcmVuY2VzW2ldLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpOworCQkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyk7CisJCQkJdHlwZVNpZ25hdHVyZXNbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgZmFsc2UvKmRvbid0IHJlc29sdmUqLyk7CisJCQl9CisJCQlzaWduYXR1cmUgPSBTaWduYXR1cmUuY3JlYXRlSW50ZXJzZWN0aW9uVHlwZVNpZ25hdHVyZSh0eXBlU2lnbmF0dXJlcyk7CisJCX0gZWxzZSB7CisJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSB0eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpOworCQkJY2hhcltdIHR5cGVOYW1lID1DaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpOworCQkJc2lnbmF0dXJlID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGZhbHNlLypkb24ndCByZXNvbHZlKi8pOworCQl9CiAJCXJldHVybiBzaWduYXR1cmU7CiAJfQogCkBAIC0yMzA5LDM4OCArMjc1Nyw4IEBACiAJfQogCiAJLyoqCi0JICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXgKLQkgKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgotCSAqIDxwcmU+Ci0JICogVHlwZVNpZ25hdHVyZToKLQkgKiAgfCAgQmFzZVR5cGVTaWduYXR1cmUKLQkgKiAgfCAgQXJyYXlUeXBlU2lnbmF0dXJlCi0JICogIHwgIENsYXNzVHlwZVNpZ25hdHVyZQotCSAqICB8ICBUeXBlVmFyaWFibGVTaWduYXR1cmUKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0JICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlU2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgewotCQkvLyBuZWVkIGEgbWluaW11bSAxIGNoYXIKLQkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgU2lnbmF0dXJlLkNfQVJSQVkgOgotCQkJCXJldHVybiBzY2FuQXJyYXlUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19SRVNPTFZFRCA6Ci0JCQljYXNlIFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgOgotCQkJCXJldHVybiBzY2FuQ2xhc3NUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19UWVBFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gc2NhblR5cGVWYXJpYWJsZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKLQkJCWNhc2UgU2lnbmF0dXJlLkNfQk9PTEVBTiA6Ci0JCQljYXNlIFNpZ25hdHVyZS5DX0JZVEUgOgotCQkJY2FzZSBTaWduYXR1cmUuQ19DSEFSIDoKLQkJCWNhc2UgU2lnbmF0dXJlLkNfRE9VQkxFIDoKLQkJCWNhc2UgU2lnbmF0dXJlLkNfRkxPQVQgOgotCQkJY2FzZSBTaWduYXR1cmUuQ19JTlQgOgotCQkJY2FzZSBTaWduYXR1cmUuQ19MT05HIDoKLQkJCWNhc2UgU2lnbmF0dXJlLkNfU0hPUlQgOgotCQkJY2FzZSBTaWduYXR1cmUuQ19WT0lEIDoKLQkJCQlyZXR1cm4gc2NhbkJhc2VUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19DQVBUVVJFIDoKLQkJCQlyZXR1cm4gc2NhbkNhcHR1cmVUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19FWFRFTkRTOgotCQkJY2FzZSBTaWduYXR1cmUuQ19TVVBFUjoKLQkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUjoKLQkJCQlyZXR1cm4gc2NhblR5cGVCb3VuZFNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgYmFzZSB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXgKLQkgKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgotCSAqIDxwcmU+Ci0JICogQmFzZVR5cGVTaWduYXR1cmU6Ci0JICogICAgIDxiPkI8L2I+IHwgPGI+QzwvYj4gfCA8Yj5EPC9iPiB8IDxiPkY8L2I+IHwgPGI+STwvYj4KLQkgKiAgIHwgPGI+SjwvYj4gfCA8Yj5TPC9iPiB8IDxiPlY8L2I+IHwgPGI+WjwvYj4KLQkgKiA8L3ByZT4KLQkgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGJhc2UgdHlwZSAiViIgaXMgb25seSBhbGxvd2VkIGluIG1ldGhvZCByZXR1cm4gdHlwZXMsCi0JICogdGhlcmUgaXMgbm8gc3ludGFjdGljIGFtYmlndWl0eS4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgdGhlbSBhbnl3aGVyZQotCSAqIHdpdGhvdXQgY29tcGxhaW50LgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIGJhc2UgdHlwZSBzaWduYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzY2FuQmFzZVR5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7Ci0JCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhcgotCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07Ci0JCWlmICgiQkNERklKU1ZaIi5pbmRleE9mKGMpID49IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0YXJ0OwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYW4gYXJyYXkgdHlwZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCi0JICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KLQkgKiA8cHJlPgotCSAqIEFycmF5VHlwZVNpZ25hdHVyZToKLQkgKiAgICAgPGI+WzwvYj4gVHlwZVNpZ25hdHVyZQotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5BcnJheVR5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7Ci0JCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQkvLyBuZWVkIGEgbWluaW11bSAyIGNoYXIKLQkJaWYgKHN0YXJ0ID49IGxlbmd0aCAtIDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlpZiAoYyAhPSBTaWduYXR1cmUuQ19BUlJBWSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQljID0gc3RyaW5nWysrc3RhcnRdOwotCQl3aGlsZShjID09IFNpZ25hdHVyZS5DX0FSUkFZKSB7Ci0JCQkvLyBuZWVkIGEgbWluaW11bSAyIGNoYXIKLQkJCWlmIChzdGFydCA+PSBsZW5ndGggLSAxKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJYyA9IHN0cmluZ1srK3N0YXJ0XTsKLQkJfQotCQlyZXR1cm4gc2NhblR5cGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7Ci0JfQotCQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgY2FwdHVyZSBvZiBhIHdpbGRjYXJkIHR5cGUgc2lnbmF0dXJlIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgotCSAqIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIuCi0JICogPHByZT4KLQkgKiBDYXB0dXJlVHlwZVNpZ25hdHVyZToKLQkgKiAgICAgPGI+ITwvYj4gVHlwZUJvdW5kU2lnbmF0dXJlCi0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwotCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgY2FwdHVyZSB0eXBlIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5DYXB0dXJlVHlwZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQpIHsKLQkJLy8gbmVlZCBhIG1pbmltdW0gMiBjaGFyCi0JCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoIC0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWNoYXIgYyA9IHN0cmluZ1tzdGFydF07Ci0JCWlmIChjICE9IFNpZ25hdHVyZS5DX0NBUFRVUkUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc2NhblR5cGVCb3VuZFNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0ICsgMSk7Ci0JfQkKLQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSB2YXJpYWJsZSBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCi0JICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KLQkgKiA8cHJlPgotCSAqIFR5cGVWYXJpYWJsZVNpZ25hdHVyZToKLQkgKiAgICAgPGI+VDwvYj4gSWRlbnRpZmllciA8Yj47PC9iPgotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNpZ25hdHVyZSBzdHJpbmcKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIHR5cGUgdmFyaWFibGUgc2lnbmF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2NhblR5cGVWYXJpYWJsZVNpZ25hdHVyZShjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQpIHsKLQkJLy8gbmVlZCBhIG1pbmltdW0gMyBjaGFycyAiVHg7IgotCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDIpIHsgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gbXVzdCBzdGFydCBpbiAiVCIKLQkJY2hhciBjID0gc3RyaW5nW3N0YXJ0XTsKLQkJaWYgKGMgIT0gU2lnbmF0dXJlLkNfVFlQRV9WQVJJQUJMRSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBpZCA9IHNjYW5JZGVudGlmaWVyKHN0cmluZywgc3RhcnQgKyAxKTsKLQkJYyA9IHN0cmluZ1tpZCArIDFdOwotCQlpZiAoYyA9PSBTaWduYXR1cmUuQ19TRU1JQ09MT04pIHsKLQkJCXJldHVybiBpZCArIDE7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTY2FucyB0aGUgZ2l2ZW4gc3RyaW5nIGZvciBhbiBpZGVudGlmaWVyIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbgotCSAqIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIuIAotCSAqIFN0b3AgY2hhcmFjdGVycyBhcmU6ICI7IiwgIjoiLCAiJmx0OyIsICImZ3Q7IiwgIi8iLCAiLiIuCi0JICogCi0JICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwotCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGFuIGlkZW50aWZpZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzY2FuSWRlbnRpZmllcihjaGFyW10gc3RyaW5nLCBpbnQgc3RhcnQpIHsKLQkJLy8gbmVlZCBhIG1pbmltdW0gMSBjaGFyCi0JCWlmIChzdGFydCA+PSBzdHJpbmcubGVuZ3RoKSB7IAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBwID0gc3RhcnQ7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbcF07Ci0JCQlpZiAoYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwgYyA9PSAnOicgfHwgYyA9PSAnOycgfHwgYyA9PSAnLicgfHwgYyA9PSAnLycpIHsKLQkJCQlyZXR1cm4gcCAtIDE7Ci0JCQl9Ci0JCQlwKys7Ci0JCQlpZiAocCA9PSBzdHJpbmcubGVuZ3RoKSB7Ci0JCQkJcmV0dXJuIHAgLSAxOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2NhbnMgdGhlIGdpdmVuIHN0cmluZyBmb3IgYSBjbGFzcyB0eXBlIHNpZ25hdHVyZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KLQkgKiBpbmRleCBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyLgotCSAqIDxwcmU+Ci0JICogQ2xhc3NUeXBlU2lnbmF0dXJlOgotCSAqICAgICB7IDxiPkw8L2I+IHwgPGI+UTwvYj4gfSBJZGVudGlmaWVyCi0JICogICAgICAgICAgIHsgeyA8Yj4vPC9iPiB8IDxiPi48L2I+IElkZW50aWZpZXIgWyA8Yj4mbHQ7PC9iPiBUeXBlQXJndW1lbnRTaWduYXR1cmUqIDxiPiZndDs8L2I+IF0gfQotCSAqICAgICAgICAgICA8Yj47PC9iPgotCSAqIDwvcHJlPgotCSAqIE5vdGUgdGhhdCBhbHRob3VnaCBhbGwgIi8iLWlkZW50aWZpZXJzIG1vc3QgY29tZSBiZWZvcmUgIi4iLWlkZW50aWZpZXJzLAotCSAqIHRoZXJlIGlzIG5vIHN5bnRhY3RpYyBhbWJpZ3VpdHkuIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IHRoZW0gd2l0aG91dAotCSAqIGNvbXBsYWludC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0JICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSBjbGFzcyB0eXBlIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5DbGFzc1R5cGVTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7Ci0JCS8vIG5lZWQgYSBtaW5pbXVtIDMgY2hhcnMgIkx4OyIKLQkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAyKSB7IAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIG11c3Qgc3RhcnQgaW4gIkwiIG9yICJRIgotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlpZiAoYyAhPSBTaWduYXR1cmUuQ19SRVNPTFZFRCAmJiBjICE9IFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnQgcCA9IHN0YXJ0ICsgMTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChwID49IHN0cmluZy5sZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljID0gc3RyaW5nW3BdOwotCQkJaWYgKGMgPT0gU2lnbmF0dXJlLkNfU0VNSUNPTE9OKSB7Ci0JCQkJLy8gYWxsIGRvbmUKLQkJCQlyZXR1cm4gcDsKLQkJCX0gZWxzZSBpZiAoYyA9PSBTaWduYXR1cmUuQ19HRU5FUklDX1NUQVJUKSB7Ci0JCQkJaW50IGUgPSBzY2FuVHlwZUFyZ3VtZW50U2lnbmF0dXJlcyhzdHJpbmcsIHApOwotCQkJCXAgPSBlOwotCQkJfSBlbHNlIGlmIChjID09IFNpZ25hdHVyZS5DX0RPVCB8fCBjID09ICcvJykgewotCQkJCWludCBpZCA9IHNjYW5JZGVudGlmaWVyKHN0cmluZywgcCArIDEpOwotCQkJCXAgPSBpZDsKLQkJCX0KLQkJCXArKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSBib3VuZCBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCi0JICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KLQkgKiA8cHJlPgotCSAqIFR5cGVCb3VuZFNpZ25hdHVyZToKLQkgKiAgICAgPGI+Wy0rXTwvYj4gVHlwZVNpZ25hdHVyZSA8Yj47PC9iPgotCSAqICAgICA8Yj4qPC9iPjwvYj4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0JICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSB0eXBlIHZhcmlhYmxlIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlQm91bmRTaWduYXR1cmUoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0KSB7Ci0JCS8vIG5lZWQgYSBtaW5pbXVtIDEgY2hhciBmb3Igd2lsZGNhcmQKLQkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUiA6Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJY2FzZSBTaWduYXR1cmUuQ19TVVBFUiA6Ci0JCQljYXNlIFNpZ25hdHVyZS5DX0VYVEVORFMgOgotCQkJCS8vIG5lZWQgYSBtaW5pbXVtIDMgY2hhcnMgIitbSSIKLQkJCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDIpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIG11c3Qgc3RhcnQgaW4gIisvLSIKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCQotCQl9Ci0JCWMgPSBzdHJpbmdbKytzdGFydF07Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSBTaWduYXR1cmUuQ19DQVBUVVJFIDoKLQkJCQlyZXR1cm4gc2NhbkNhcHR1cmVUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19TVVBFUiA6Ci0JCQljYXNlIFNpZ25hdHVyZS5DX0VYVEVORFMgOgotCQkJCXJldHVybiBzY2FuVHlwZUJvdW5kU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19SRVNPTFZFRCA6Ci0JCQljYXNlIFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgOgotCQkJCXJldHVybiBzY2FuQ2xhc3NUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19UWVBFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gc2NhblR5cGVWYXJpYWJsZVNpZ25hdHVyZShzdHJpbmcsIHN0YXJ0KTsKLQkJCWNhc2UgU2lnbmF0dXJlLkNfQVJSQVkgOgotCQkJCXJldHVybiBzY2FuQXJyYXlUeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJY2FzZSBTaWduYXR1cmUuQ19TVEFSOgotCQkJCXJldHVybiBzdGFydDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgbGlzdCBvZiB0eXBlIGFyZ3VtZW50IHNpZ25hdHVyZXMgc3RhcnRpbmcgYXQKLQkgKiB0aGUgZ2l2ZW4gaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KLQkgKiA8cHJlPgotCSAqIFR5cGVBcmd1bWVudFNpZ25hdHVyZXM6Ci0JICogICAgIDxiPiZsdDs8L2I+IFR5cGVBcmd1bWVudFNpZ25hdHVyZSogPGI+Jmd0OzwvYj4KLQkgKiA8L3ByZT4KLQkgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgYXQgbGVhc3Qgb25lIHR5cGUgYXJndW1lbnQsIHRoZXJlCi0JICogaXMgbm8gc3ludGFjdGljIGFtYmlndWl0eSBpZiB0aGVyZSBhcmUgbm9uZS4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgemVybwotCSAqIHR5cGUgYXJndW1lbnQgc2lnbmF0dXJlcyB3aXRob3V0IGNvbXBsYWludC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nIHRoZSBzaWduYXR1cmUgc3RyaW5nCi0JICogQHBhcmFtIHN0YXJ0IHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0JICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgYSBsaXN0IG9mIHR5cGUgYXJndW1lbnRzCi0JICogc2lnbmF0dXJlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmVzKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgewotCQkvLyBuZWVkIGEgbWluaW11bSAyIGNoYXIgIjw+IgotCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlpZiAoYyAhPSBTaWduYXR1cmUuQ19HRU5FUklDX1NUQVJUKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IHAgPSBzdGFydCArIDE7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAocCA+PSBzdHJpbmcubGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJYyA9IHN0cmluZ1twXTsKLQkJCWlmIChjID09IFNpZ25hdHVyZS5DX0dFTkVSSUNfRU5EKSB7Ci0JCQkJcmV0dXJuIHA7Ci0JCQl9Ci0JCQlpbnQgZSA9IHNjYW5UeXBlQXJndW1lbnRTaWduYXR1cmUoc3RyaW5nLCBwKTsKLQkJCXAgPSBlICsgMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNjYW5zIHRoZSBnaXZlbiBzdHJpbmcgZm9yIGEgdHlwZSBhcmd1bWVudCBzaWduYXR1cmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCi0JICogaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3Rlci4KLQkgKiA8cHJlPgotCSAqIFR5cGVBcmd1bWVudFNpZ25hdHVyZToKLQkgKiAgICAgPGI+JiM0Mjs8L2I+Ci0JICogIHwgIDxiPis8L2I+IFR5cGVTaWduYXR1cmUKLQkgKiAgfCAgPGI+LTwvYj4gVHlwZVNpZ25hdHVyZQotCSAqICB8ICBUeXBlU2lnbmF0dXJlCi0JICogPC9wcmU+Ci0JICogTm90ZSB0aGF0IGFsdGhvdWdoIGJhc2UgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIGluIHR5cGUgYXJndW1lbnRzLCB0aGVyZSBpcwotCSAqIG5vIHN5bnRhY3RpYyBhbWJpZ3VpdHkuIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IHRoZW0gd2l0aG91dCBjb21wbGFpbnQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZyB0aGUgc2lnbmF0dXJlIHN0cmluZwotCSAqIEBwYXJhbSBzdGFydCB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgdHlwZSBhcmd1bWVudCBzaWduYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzY2FuVHlwZUFyZ3VtZW50U2lnbmF0dXJlKGNoYXJbXSBzdHJpbmcsIGludCBzdGFydCkgewotCQkvLyBuZWVkIGEgbWluaW11bSAxIGNoYXIKLQkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIGMgPSBzdHJpbmdbc3RhcnRdOwotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUiA6Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJY2FzZSBTaWduYXR1cmUuQ19FWFRFTkRTIDoKLQkJCWNhc2UgU2lnbmF0dXJlLkNfU1VQRVIgOgotCQkJCXJldHVybiBzY2FuVHlwZUJvdW5kU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHNjYW5UeXBlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwotCQl9Ci0JfQkKLQotCS8qKgogCSAqIEdldCBhbGwgdHlwZSBhcmd1bWVudHMgZnJvbSBhbiBhcnJheSBvZiBzaWduYXR1cmVzLgotCSAqIAorCSAqCiAJICogRXhhbXBsZToKIAkgKiAJRm9yIGZvbGxvd2luZyB0eXBlIFg8WTxaPixWPFc+LFU+LkE8Qj4gc2lnbmF0dXJlcyBpczoKIAkgKiAJWwpAQCAtMjcwOSw3ICsyNzc3LDcgQEAKIAkgKiAJCQlbJ0wnLCdCJywnOyddCiAJICogCQldCiAJICogCV0KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlcyBBcnJheSBvZiBzaWduYXR1cmVzIChvbmUgcGVyIGVhY2ggdHlwZSBsZXZlbHMpCiAJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgb25lIG9mIHByb3ZpZGVkIHNpZ25hdHVyZSBpcyBtYWxmb3JtZWQKIAkgKiBAcmV0dXJuIGNoYXJbXVtdW10gQXJyYXkgb2YgdHlwZSBhcmd1bWVudHMgZm9yIGVhY2ggc2lnbmF0dXJlCkBAIC0yNzIzLDE4ICsyNzkxLDEzOSBAQAogCQl9CiAJCXJldHVybiB0eXBlQXJndW1lbnRzOwogCX0KKwlwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oSmF2YUVsZW1lbnQgcGFyZW50LCBJQmluYXJ5QW5ub3RhdGlvbiBiaW5hcnlBbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSkgeworCQljaGFyW10gdHlwZU5hbWUgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmUudG9DaGFyQXJyYXkoQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGJpbmFyeUFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSwgJy8nLCAnLicpKTsKKwkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHBhcmVudCwgbmV3IFN0cmluZyh0eXBlTmFtZSksIG1lbWJlclZhbHVlUGFpck5hbWUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBbm5vdGF0aW9uTWVtYmVyVmFsdWUoSmF2YUVsZW1lbnQgcGFyZW50LCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBPYmplY3QgYmluYXJ5VmFsdWUpIHsKKwkJaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgQ29uc3RhbnQpIHsKKwkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWVtYmVyVmFsdWUobWVtYmVyVmFsdWVQYWlyLCAoQ29uc3RhbnQpIGJpbmFyeVZhbHVlKTsKKwkJfSBlbHNlIGlmIChiaW5hcnlWYWx1ZSBpbnN0YW5jZW9mIElCaW5hcnlBbm5vdGF0aW9uKSB7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0FOTk9UQVRJT047CisJCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbihwYXJlbnQsIChJQmluYXJ5QW5ub3RhdGlvbikgYmluYXJ5VmFsdWUsIG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkpOworCQl9IGVsc2UgaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgQ2xhc3NTaWduYXR1cmUpIHsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfQ0xBU1M7CisJCQljaGFyW10gY2xhc3NOYW1lID0gU2lnbmF0dXJlLnRvQ2hhckFycmF5KENoYXJPcGVyYXRpb24ucmVwbGFjZU9uQ29weSgoKENsYXNzU2lnbmF0dXJlKSBiaW5hcnlWYWx1ZSkuZ2V0VHlwZU5hbWUoKSwgJy8nLCAnLicpKTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKGNsYXNzTmFtZSk7CisJCX0gZWxzZSBpZiAoYmluYXJ5VmFsdWUgaW5zdGFuY2VvZiBFbnVtQ29uc3RhbnRTaWduYXR1cmUpIHsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfUVVBTElGSUVEX05BTUU7CisJCQlFbnVtQ29uc3RhbnRTaWduYXR1cmUgZW51bUNvbnN0YW50ID0gKEVudW1Db25zdGFudFNpZ25hdHVyZSkgYmluYXJ5VmFsdWU7CisJCQljaGFyW10gZW51bU5hbWUgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkoQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGVudW1Db25zdGFudC5nZXRUeXBlTmFtZSgpLCAnLycsICcuJykpOworCQkJY2hhcltdIHF1YWxpZmllZE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbnVtTmFtZSwgZW51bUNvbnN0YW50LmdldEVudW1Db25zdGFudE5hbWUoKSwgJy4nKTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHF1YWxpZmllZE5hbWUpOworCQl9IGVsc2UgaWYgKGJpbmFyeVZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKwkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSAtMTsgLy8gbW9kaWZpZWQgYmVsb3cgYnkgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0TWVtYmVyVmFsdWUoLi4uKQorCQkJT2JqZWN0W10gYmluYXJ5VmFsdWVzID0gKE9iamVjdFtdKSBiaW5hcnlWYWx1ZTsKKwkJCWludCBsZW5ndGggPSBiaW5hcnlWYWx1ZXMubGVuZ3RoOworCQkJT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFtsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWludCBwcmV2aW91c1ZhbHVlS2luZCA9IG1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQ7CisJCQkJT2JqZWN0IHZhbHVlID0gZ2V0QW5ub3RhdGlvbk1lbWJlclZhbHVlKHBhcmVudCwgbWVtYmVyVmFsdWVQYWlyLCBiaW5hcnlWYWx1ZXNbaV0pOworCQkJCWlmIChwcmV2aW91c1ZhbHVlS2luZCAhPSAtMSAmJiBtZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kICE9IHByZXZpb3VzVmFsdWVLaW5kKSB7CisJCQkJCS8vIHZhbHVlcyBhcmUgaGV0ZXJvZ2VuZW91cywgdmFsdWUga2luZCBpcyB0aHVzIHVua25vd24KKwkJCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19VTktOT1dOOworCQkJCX0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7CisJCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSB2YWx1ZTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkJCWlmIChhbm5vdGF0aW9uLmVxdWFscyh2YWx1ZXNbal0pKSB7CisJCQkJCQkJYW5ub3RhdGlvbi5vY2N1cnJlbmNlQ291bnQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl2YWx1ZXNbaV0gPSB2YWx1ZTsKKwkJCX0KKwkJCWlmIChtZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID09IC0xKQorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfVU5LTk9XTjsKKwkJCXJldHVybiB2YWx1ZXM7CisJCX0gZWxzZSB7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qCisJICogQ3JlYXRlcyBhIG1lbWJlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBjb25zdGFudCwgYW5kIHNldHMgdGhlIHZhbHVlS2luZCBvbiB0aGUgZ2l2ZW4gbWVtYmVyVmFsdWVQYWlyCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbk1lbWJlclZhbHVlKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIENvbnN0YW50IGNvbnN0YW50KSB7CisJCWlmIChjb25zdGFudCA9PSBudWxsKSB7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKGNvbnN0YW50LnR5cGVJRCgpKSB7CisJCQljYXNlIFR5cGVJZHMuVF9pbnQgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfSU5UOworCQkJCXJldHVybiBuZXcgSW50ZWdlcihjb25zdGFudC5pbnRWYWx1ZSgpKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfQllURTsKKwkJCQlyZXR1cm4gbmV3IEJ5dGUoY29uc3RhbnQuYnl0ZVZhbHVlKCkpOworCQkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfU0hPUlQ7CisJCQkJcmV0dXJuIG5ldyBTaG9ydChjb25zdGFudC5zaG9ydFZhbHVlKCkpOworCQkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CisJCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19DSEFSOworCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKGNvbnN0YW50LmNoYXJWYWx1ZSgpKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0ZMT0FUOworCQkJCXJldHVybiBuZXcgRmxvYXQoY29uc3RhbnQuZmxvYXRWYWx1ZSgpKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19ET1VCTEU7CisJCQkJcmV0dXJuIG5ldyBEb3VibGUoY29uc3RhbnQuZG91YmxlVmFsdWUoKSk7CisJCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0JPT0xFQU47CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb25zdGFudC5ib29sZWFuVmFsdWUoKSk7CisJCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX0xPTkc7CisJCQkJcmV0dXJuIG5ldyBMb25nKGNvbnN0YW50LmxvbmdWYWx1ZSgpKTsKKwkJCWNhc2UgVHlwZUlkcy5UX0phdmFMYW5nU3RyaW5nIDoKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1NUUklORzsKKwkJCQlyZXR1cm4gY29uc3RhbnQuc3RyaW5nVmFsdWUoKTsKKwkJCWRlZmF1bHQ6CisJCQkJbWVtYmVyVmFsdWVQYWlyLnZhbHVlS2luZCA9IElNZW1iZXJWYWx1ZVBhaXIuS19VTktOT1dOOworCQkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8qCisJICogQ3JlYXRlcyBhIG1lbWJlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBjb25zdGFudCBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWVyYWxzLAorCSAqIGFuZCBzZXRzIHRoZSB2YWx1ZUtpbmQgb24gdGhlIGdpdmVuIG1lbWJlclZhbHVlUGFpcgorCSAqLworCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5lZ2F0aXZlQW5ub3RhdGlvbk1lbWJlclZhbHVlKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIENvbnN0YW50IGNvbnN0YW50KSB7CisJCWlmIChjb25zdGFudCA9PSBudWxsKSB7CisJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKGNvbnN0YW50LnR5cGVJRCgpKSB7CisJCQljYXNlIFR5cGVJZHMuVF9pbnQgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfSU5UOworCQkJCXJldHVybiBuZXcgSW50ZWdlcihjb25zdGFudC5pbnRWYWx1ZSgpICogLTEpOworCQkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfRkxPQVQ7CisJCQkJcmV0dXJuIG5ldyBGbG9hdChjb25zdGFudC5mbG9hdFZhbHVlKCkgKiAtMS4wZik7CisJCQljYXNlIFR5cGVJZHMuVF9kb3VibGUgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfRE9VQkxFOworCQkJCXJldHVybiBuZXcgRG91YmxlKGNvbnN0YW50LmRvdWJsZVZhbHVlKCkgKiAtMS4wKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgorCQkJCW1lbWJlclZhbHVlUGFpci52YWx1ZUtpbmQgPSBJTWVtYmVyVmFsdWVQYWlyLktfTE9ORzsKKwkJCQlyZXR1cm4gbmV3IExvbmcoY29uc3RhbnQubG9uZ1ZhbHVlKCkgKiAtMUwpOworCQkJZGVmYXVsdDoKKwkJCQltZW1iZXJWYWx1ZVBhaXIudmFsdWVLaW5kID0gSU1lbWJlclZhbHVlUGFpci5LX1VOS05PV047CisJCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CiAJLyoqCiAJICogU3BsaXQgc2lnbmF0dXJlcyBvZiBhbGwgbGV2ZWxzICBmcm9tIGEgdHlwZSB1bmlxdWUga2V5LgotCSAqIAorCSAqCiAJICogRXhhbXBsZToKIAkgKiAJRm9yIGZvbGxvd2luZyB0eXBlIFg8WTxaPixWPFc+LFU+LkE8Qj4sIHVuaXF1ZSBrZXkgaXM6CiAJICogCSJMWDxMWTxMWjs+O0xWPExXOz47TFU7Pi5MQTxMQjs+OyIKLQkgKiAKKwkgKgogCSAqIAlUaGUgcmV0dXJuIHNwbGl0dGVkIHNpZ25hdHVyZXMgYXJyYXkgaXM6CiAJICogCVsKIAkgKiAJCVsnTCcsJ1gnLCc8JywnTCcsJ1knLCc8JywnTCcsJ1onLCc7Jz4nLCc7JywnTCcsJ1YnLCc8JywnTCcsJ1cnLCc7Jz4nLCc7JywnTCcsJ1UnLCc+JywnOyddLAogCSAqIAkJWydMJywnQScsJzwnLCdMJywnQicsJzsnLCc+JywnOyddCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSBQYXJhbWV0ZXJpemVkU291cmNlVHlwZSB0eXBlIHNpZ25hdHVyZQogCSAqIEByZXR1cm4gY2hhcltdW10gQXJyYXkgb2Ygc2lnbmF0dXJlcyBmb3IgZWFjaCBsZXZlbCBvZiBnaXZlbiB1bmlxdWUga2V5CiAJICovCkBAIC0yNzQ3LDkgKzI5MzYsOCBAQAogCQljaGFyW11bXSBzaWduYXR1cmVzID0gbmV3IGNoYXJbMTBdW107CiAJCWludCBzaWduYXR1cmVzQ291bnQgPSAwOwogLy8JCWludFtdIGxlbmd0aGVzID0gbmV3IGludCBbMTBdOwotCQlpbnQgdHlwZUFyZ3NDb3VudCA9IDA7CiAJCWludCBwYXJhbU9wZW5pbmcgPSAwOwotCQkKKwogCQkvLyBTY2FuIGVhY2ggc2lnbmF0dXJlIGNoYXJhY3RlcgogCQlmb3IgKGludCBpZHg9MCwgbG4gPSBzb3VyY2UubGVuZ3RoOyBpZHggPCBsbjsgaWR4KyspIHsKIAkJCXN3aXRjaCAoc291cmNlW2lkeF0pIHsKQEAgLTI3NTksMTggKzI5NDcsMTAgQEAKIAkJCQkJCWlmIChzaWduYXR1cmVzQ291bnQgPT0gc2lnbmF0dXJlcy5sZW5ndGgpIHsKIAkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNpZ25hdHVyZXMsIDAsIHNpZ25hdHVyZXMgPSBuZXcgY2hhcltzaWduYXR1cmVzQ291bnQrMTBdW10sIDAsIHNpZ25hdHVyZXNDb3VudCk7CiAJCQkJCQl9Ci0JCQkJCQl0eXBlQXJnc0NvdW50ID0gMDsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlICc8JzoKIAkJCQkJcGFyYW1PcGVuaW5nKys7Ci0JCQkJCWlmIChwYXJhbU9wZW5pbmcgPT0gMSkgewotCQkJCQkJdHlwZUFyZ3NDb3VudCA9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKic6Ci0JCQkJY2FzZSAnOyc6Ci0JCQkJCWlmIChwYXJhbU9wZW5pbmcgPT0gMSkgdHlwZUFyZ3NDb3VudCsrOwogCQkJCQlicmVhazsKIAkJCQljYXNlICcuJzoKIAkJCQkJaWYgKHBhcmFtT3BlbmluZyA9PSAwKSAgewpAQCAtMjc5NywzNCArMjk3NywzNCBAQAogCQl9CiAJCXJldHVybiB0eXBlU2lnbmF0dXJlczsKIAl9Ci0JCisKIAkvKgotCSAqIENhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb3IgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIAorCSAqIENhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb3IgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9BbmNob3IoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSwgU3RyaW5nIG1ldGhvZE5hbWUsIGJvb2xlYW4gaXNWYXJBcmdzKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9BbmNob3IoaW50IHN0YXJ0aW5nSW5kZXgsIGNoYXJbXSBtZXRob2RTaWduYXR1cmUsIFN0cmluZyBtZXRob2ROYW1lLCBib29sZWFuIGlzVmFyQXJncykgewogCQl0cnkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmcodG9BbmNob3IobWV0aG9kU2lnbmF0dXJlLCBtZXRob2ROYW1lLnRvQ2hhckFycmF5KCksIGlzVmFyQXJncykpOworCQkJcmV0dXJuIG5ldyBTdHJpbmcodG9BbmNob3Ioc3RhcnRpbmdJbmRleCwgbWV0aG9kU2lnbmF0dXJlLCBtZXRob2ROYW1lLnRvQ2hhckFycmF5KCksIGlzVmFyQXJncykpOwogCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdG9BbmNob3IoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSwgY2hhcltdIG1ldGhvZE5hbWUsIGJvb2xlYW4gaXNWYXJnQXJncykgeworCXB1YmxpYyBzdGF0aWMgY2hhcltdIHRvQW5jaG9yKGludCBzdGFydGluZ0luZGV4LCBjaGFyW10gbWV0aG9kU2lnbmF0dXJlLCBjaGFyW10gbWV0aG9kTmFtZSwgYm9vbGVhbiBpc1ZhcmdBcmdzKSB7CiAJCWludCBmaXJzdFBhcmVuID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNpZ25hdHVyZS5DX1BBUkFNX1NUQVJULCBtZXRob2RTaWduYXR1cmUpOwogCQlpZiAoZmlyc3RQYXJlbiA9PSAtMSkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCQorCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG1ldGhvZFNpZ25hdHVyZS5sZW5ndGggKyAxMCk7CiAKIAkJLy8gc2VsZWN0b3IKIAkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewogCQkJYnVmZmVyLmFwcGVuZChtZXRob2ROYW1lKTsKIAkJfQotCQkKKwogCQkvLyBwYXJhbWV0ZXJzCiAJCWJ1ZmZlci5hcHBlbmQoJygnKTsKIAkJY2hhcltdW10gcHRzID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG1ldGhvZFNpZ25hdHVyZSk7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0aW5nSW5kZXgsIG1heCA9IHB0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJaWYgKGkgPT0gbWF4IC0gMSkgewogCQkJCWFwcGVuZFR5cGVTaWduYXR1cmVGb3JBbmNob3IocHRzW2ldLCAwICwgYnVmZmVyLCBpc1ZhcmdBcmdzKTsKIAkJCX0gZWxzZSB7CkBAIC0yODc2LDcgKzMwNTYsNyBAQAogCQkJCWNhc2UgU2lnbmF0dXJlLkNfUkVTT0xWRUQgOgogCQkJCQlyZXR1cm4gYXBwZW5kQ2xhc3NUeXBlU2lnbmF0dXJlRm9yQW5jaG9yKHN0cmluZywgc3RhcnQsIGJ1ZmZlcik7CiAJCQkJY2FzZSBTaWduYXR1cmUuQ19UWVBFX1ZBUklBQkxFIDoKLQkJCQkJaW50IGUgPSBVdGlsLnNjYW5UeXBlVmFyaWFibGVTaWduYXR1cmUoc3RyaW5nLCBzdGFydCk7CisJCQkJCWludCBlID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5zY2FuVHlwZVZhcmlhYmxlU2lnbmF0dXJlKHN0cmluZywgc3RhcnQpOwogCQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZywgc3RhcnQgKyAxLCBlIC0gc3RhcnQgLSAxKTsKIAkJCQkJcmV0dXJuIGU7CiAJCQkJY2FzZSBTaWduYXR1cmUuQ19CT09MRUFOIDoKQEAgLTI5NTUsNyArMzEzNSw3IEBACiAJCWlmIChjICE9IFNpZ25hdHVyZS5DX0FSUkFZKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJCisKIAkJaW50IGluZGV4ID0gc3RhcnQ7CiAJCWMgPSBzdHJpbmdbKytpbmRleF07CiAJCXdoaWxlKGMgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIHsKQEAgLTI5NjUsMTMgKzMxNDUsMTMgQEAKIAkJCX0KIAkJCWMgPSBzdHJpbmdbKytpbmRleF07CiAJCX0KLQkJCisKIAkJaW50IGUgPSBhcHBlbmRUeXBlU2lnbmF0dXJlRm9yQW5jaG9yKHN0cmluZywgaW5kZXgsIGJ1ZmZlciwgZmFsc2UpOwotCQkKKwogCQlmb3IoaW50IGkgPSAxLCBkaW1zID0gaW5kZXggLSBzdGFydDsgaSA8IGRpbXM7IGkrKykgewogCQkJYnVmZmVyLmFwcGVuZCgnWycpLmFwcGVuZCgnXScpOwogCQl9Ci0JCQorCiAJCWlmIChpc1ZhckFyZ3MpIHsKIAkJCWJ1ZmZlci5hcHBlbmQoJy4nKS5hcHBlbmQoJy4nKS5hcHBlbmQoJy4nKTsKIAkJfSBlbHNlIHsKQEAgLTI5ODEsNyArMzE2MSw3IEBACiAJfQogCXByaXZhdGUgc3RhdGljIGludCBhcHBlbmRDbGFzc1R5cGVTaWduYXR1cmVGb3JBbmNob3IoY2hhcltdIHN0cmluZywgaW50IHN0YXJ0LCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAJCS8vIG5lZWQgYSBtaW5pbXVtIDMgY2hhcnMgIkx4OyIKLQkJaWYgKHN0YXJ0ID49IHN0cmluZy5sZW5ndGggLSAyKSB7IAorCQlpZiAoc3RhcnQgPj0gc3RyaW5nLmxlbmd0aCAtIDIpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQkvLyBtdXN0IHN0YXJ0IGluICJMIiBvciAiUSIKQEAgLTMwNDksNCArMzIyOSw4MSBAQAogCQl9CiAJCXJldHVybiBzdGFydDsKIAl9CisKKwkvKgorCSAqIFRoaXMgbWV0aG9kIGFkanVzdHMgdGhlIHRhc2sgdGFncyBhbmQgdGFzayBwcmlvcml0aWVzIHNvIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIHNpemUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZml4VGFza1RhZ3MoTWFwIGRlZmF1bHRPcHRpb25zTWFwKSB7CisJCU9iamVjdCB0YXNrVGFnc1ZhbHVlID0gZGVmYXVsdE9wdGlvbnNNYXAuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUyk7CisJCWNoYXJbXVtdIHRhc2tUYWdzID0gbnVsbDsKKwkJaWYgKHRhc2tUYWdzVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXRhc2tUYWdzID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsICgoU3RyaW5nKSB0YXNrVGFnc1ZhbHVlKS50b0NoYXJBcnJheSgpKTsKKwkJfQorCQlPYmplY3QgdGFza1ByaW9yaXRpZXNWYWx1ZSA9IGRlZmF1bHRPcHRpb25zTWFwLmdldChKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1BSSU9SSVRJRVMpOworCQljaGFyW11bXSB0YXNrUHJpb3JpdGllcyA9IG51bGw7CisJCWlmICh0YXNrUHJpb3JpdGllc1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQl0YXNrUHJpb3JpdGllcyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCAoKFN0cmluZykgdGFza1ByaW9yaXRpZXNWYWx1ZSkudG9DaGFyQXJyYXkoKSk7CisJCX0KKwkJaWYgKHRhc2tQcmlvcml0aWVzID09IG51bGwpIHsKKwkJCWlmICh0YXNrVGFncyAhPSBudWxsKSB7CisJCQkJVXRpbC5sb2dSZXBlYXRlZE1lc3NhZ2UoVEFTS19QUklPUklUSUVTX1BST0JMRU0sIElTdGF0dXMuRVJST1IsICJJbmNvbnNpc3RlbnQgdmFsdWVzIGZvciB0YXNrVGFncyAobm90IG51bGwpIGFuZCB0YXNrIHByaW9yaXRpZXMgKG51bGwpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlkZWZhdWx0T3B0aW9uc01hcC5yZW1vdmUoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICh0YXNrVGFncyA9PSBudWxsKSB7CisJCQlVdGlsLmxvZ1JlcGVhdGVkTWVzc2FnZShUQVNLX1BSSU9SSVRJRVNfUFJPQkxFTSwgSVN0YXR1cy5FUlJPUiwgIkluY29uc2lzdGVudCB2YWx1ZXMgZm9yIHRhc2tUYWdzIChudWxsKSBhbmQgdGFzayBwcmlvcml0aWVzIChub3QgbnVsbCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVmYXVsdE9wdGlvbnNNYXAucmVtb3ZlKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfUFJJT1JJVElFUyk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHRhc2tUYWdzTGVuZ3RoID0gdGFza1RhZ3MubGVuZ3RoOworCQlpbnQgdGFza1ByaW9yaXRpZXNMZW5ndGggPSB0YXNrUHJpb3JpdGllcy5sZW5ndGg7CisJCWlmICh0YXNrVGFnc0xlbmd0aCAhPSB0YXNrUHJpb3JpdGllc0xlbmd0aCkgeworCQkJVXRpbC5sb2dSZXBlYXRlZE1lc3NhZ2UoVEFTS19QUklPUklUSUVTX1BST0JMRU0sIElTdGF0dXMuRVJST1IsICJJbmNvbnNpc3RlbnQgdmFsdWVzIGZvciB0YXNrVGFncyBhbmQgdGFzayBwcmlvcml0aWVzIDogbGVuZ3RoIGlzIGRpZmZlcmVudCIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAodGFza1RhZ3NMZW5ndGggPiB0YXNrUHJpb3JpdGllc0xlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGFza1RhZ3MsIDAsICh0YXNrVGFncyA9IG5ldyBjaGFyW3Rhc2tQcmlvcml0aWVzTGVuZ3RoXVtdKSwgMCwgdGFza1ByaW9yaXRpZXNMZW5ndGgpOworCQkJCWRlZmF1bHRPcHRpb25zTWFwLnB1dChKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRhc2tUYWdzLCcsJykpKTsKKwkJCX0gZWxzZSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0YXNrUHJpb3JpdGllcywgMCwgKHRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGFza1RhZ3NMZW5ndGhdW10pLCAwLCB0YXNrVGFnc0xlbmd0aCk7CisJCQkJZGVmYXVsdE9wdGlvbnNNYXAucHV0KEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfUFJJT1JJVElFUywgbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGFza1ByaW9yaXRpZXMsJywnKSkpOworCQkJfQorCQl9CisJfQorCS8qKgorCSAqIEZpbmRzIHRoZSBJTWV0aG9kIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0b3IsIAorCSAqIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgZHVtbXkgaW5zdGFuY2Ugb2YgYSBiaW5hcnkgbWV0aG9kLiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpbiB3aGljaCB0aGUgbWV0aG9kIGlzIGRlY2xhcmVkCisJICogQHBhcmFtIHNlbGVjdG9yIHRoZSBtZXRob2QgbmFtZQorCSAqIEBwYXJhbSBwYXJhbVR5cGVTaWduYXR1cmVzIHRoZSB0eXBlIHNpZ25hdHVyZXMgb2YgdGhlIG1ldGhvZCBhcmd1bWVudHMKKwkgKiBAcGFyYW0gaXNDb25zdHJ1Y3RvciB3aGV0aGVyIHdlJ3JlIGxvb2tpbmcgZm9yIGEgY29uc3RydWN0b3IKKwkgKiBAcmV0dXJuIGFuIElNZXRob2QgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsCisJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElNZXRob2QgZmluZE1ldGhvZChJVHlwZSB0eXBlLCBjaGFyW10gc2VsZWN0b3IsIFN0cmluZ1tdIHBhcmFtVHlwZVNpZ25hdHVyZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlNZXRob2QgbWV0aG9kID0gbnVsbDsKKwkJaW50IHN0YXJ0aW5nSW5kZXggPSAwOworCQlTdHJpbmdbXSBhcmdzOworCQlJVHlwZSBlbmNsb3NpbmdUeXBlID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCS8vIElmIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3RvciBvZiBhIG5vbi1zdGF0aWMgaW5uZXIgdHlwZSwgYWRkIHRoZSBlbmNsb3NpbmcgdHlwZSBhcyBhbiAKKwkJLy8gYWRkaXRpb25hbCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yCisJCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwKKwkJCQkmJiBpc0NvbnN0cnVjdG9yCisJCQkJJiYgIUZsYWdzLmlzU3RhdGljKHR5cGUuZ2V0RmxhZ3MoKSkpIHsKKwkJCWFyZ3MgPSBuZXcgU3RyaW5nW3BhcmFtVHlwZVNpZ25hdHVyZXMubGVuZ3RoKzFdOworCQkJc3RhcnRpbmdJbmRleCA9IDE7CisJCQlhcmdzWzBdID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZW5jbG9zaW5nVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlhcmdzID0gbmV3IFN0cmluZ1twYXJhbVR5cGVTaWduYXR1cmVzLmxlbmd0aF07CisJCX0KKwkJaW50IGxlbmd0aCA9IGFyZ3MubGVuZ3RoOworCQlmb3IoaW50IGkgPSBzdGFydGluZ0luZGV4OwlpPCBsZW5ndGggOyBpKyspeworCQkJYXJnc1tpXSA9IG5ldyBTdHJpbmcocGFyYW1UeXBlU2lnbmF0dXJlc1tpLXN0YXJ0aW5nSW5kZXhdKTsKKwkJfQorCQltZXRob2QgPSB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKHNlbGVjdG9yKSwgYXJncyk7CisJCQorCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZmluZE1ldGhvZHMobWV0aG9kKTsKKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCAmJiBtZXRob2RzLmxlbmd0aCA+IDApIHsKKwkJCW1ldGhvZCA9IG1ldGhvZHNbMF07CisJCX0KKwkJcmV0dXJuIG1ldGhvZDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1ZlcmlmaWNhdGlvbkluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVmVyaWZpY2F0aW9uSW5mby5qYXZhCmluZGV4IDYyYWI5NWIuLmIyNzY2MTMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVmVyaWZpY2F0aW9uSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVmVyaWZpY2F0aW9uSW5mby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE3LDcgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklWZXJpZmljYXRpb25UeXBlSW5mbzsKIAogcHVibGljIGNsYXNzIFZlcmlmaWNhdGlvbkluZm8gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uVHlwZUluZm8gewotCQorCiAJcHJpdmF0ZSBpbnQgdGFnOwogCXByaXZhdGUgaW50IG9mZnNldDsKIAlwcml2YXRlIGludCBjb25zdGFudFBvb2xJbmRleDsKQEAgLTQ0LDEyICs0NCwxMiBAQAogCQkJCX0KIAkJCQl0aGlzLnJlYWRPZmZzZXQgKz0gMjsKIAkJCQlicmVhazsKLQkJCWNhc2UgSVZlcmlmaWNhdGlvblR5cGVJbmZvLklURU1fVU5JTklUSUFMSVpFRCA6IAorCQkJY2FzZSBJVmVyaWZpY2F0aW9uVHlwZUluZm8uSVRFTV9VTklOSVRJQUxJWkVEIDoKIAkJCQl0aGlzLm9mZnNldCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDEsIG9mZnNldCk7CiAJCQkJdGhpcy5yZWFkT2Zmc2V0ICs9IDI7CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgaW50IGdldFRhZygpIHsKIAkJcmV0dXJuIHRoaXMudGFnOwogCX0KQEAgLTY1LDcgKzY1LDcgQEAKIAlwdWJsaWMgY2hhcltdIGdldENsYXNzVHlwZU5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmNsYXNzVHlwZU5hbWU7CiAJfQotCQorCiAJcHVibGljIGludCBzaXplSW5CeXRlcygpIHsKIAkJcmV0dXJuIHRoaXMucmVhZE9mZnNldDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1dlYWtIYXNoU2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1dlYWtIYXNoU2V0LmphdmEKaW5kZXggOGViMTliNy4uN2QwYzg4NSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9XZWFrSGFzaFNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvV2Vha0hhc2hTZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw3ICsxNiw3IEBACiAgKiBBIGhhc2hzZXQgd2hvc2UgdmFsdWVzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KICAqLwogcHVibGljIGNsYXNzIFdlYWtIYXNoU2V0IHsKLQkKKwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgSGFzaGFibGVXZWFrUmVmZXJlbmNlIGV4dGVuZHMgV2Vha1JlZmVyZW5jZSB7CiAJCXB1YmxpYyBpbnQgaGFzaENvZGU7CiAJCXB1YmxpYyBIYXNoYWJsZVdlYWtSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW50LCBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSkgewpAQCAtMzksMTYgKzM5LDE2IEBACiAJCQlyZXR1cm4gIltoYXNoQ29kZT0iICsgdGhpcy5oYXNoQ29kZSArICJdICIgKyByZWZlcmVudC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KLQkKKwogCUhhc2hhYmxlV2Vha1JlZmVyZW5jZVtdIHZhbHVlczsKIAlwdWJsaWMgaW50IGVsZW1lbnRTaXplOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlCiAJaW50IHRocmVzaG9sZDsKLQlSZWZlcmVuY2VRdWV1ZSByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwkKLQkKKwlSZWZlcmVuY2VRdWV1ZSByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOworCiAJcHVibGljIFdlYWtIYXNoU2V0KCkgewogCQl0aGlzKDUpOwogCX0KLQkKKwogCXB1YmxpYyBXZWFrSGFzaFNldChpbnQgc2l6ZSkgewogCQl0aGlzLmVsZW1lbnRTaXplID0gMDsKIAkJdGhpcy50aHJlc2hvbGQgPSBzaXplOyAvLyBzaXplIHJlcHJlc2VudHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbGVtZW50cwpAQCAtNTcsNyArNTcsNyBAQAogCQkJZXh0cmFSb29tKys7CiAJCXRoaXMudmFsdWVzID0gbmV3IEhhc2hhYmxlV2Vha1JlZmVyZW5jZVtleHRyYVJvb21dOwogCX0KLQkKKwogCS8qCiAJICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoaXMgc2V0LgogCSAqIElmIGFuIG9iamVjdCB0aGF0IGlzIGVxdWFscyB0byB0aGUgZ2l2ZW4gb2JqZWN0IGFscmVhZHkgZXhpc3RzLCBkbyBub3RoaW5nLgpAQCAtODIsMTAgKzgyLDEwIEBACiAJCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKIAkJaWYgKCsrdGhpcy5lbGVtZW50U2l6ZSA+IHRoaXMudGhyZXNob2xkKQogCQkJcmVoYXNoKCk7Ci0JCQorCiAJCXJldHVybiBvYmo7CiAJfQotCQkKKwogCXByaXZhdGUgdm9pZCBhZGRWYWx1ZShIYXNoYWJsZVdlYWtSZWZlcmVuY2UgdmFsdWUpIHsKIAkJT2JqZWN0IG9iaiA9IHZhbHVlLmdldCgpOwogCQlpZiAob2JqID09IG51bGwpIHJldHVybjsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCQlyZWhhc2goKTsKIAl9Ci0JCisKIAlwcml2YXRlIHZvaWQgY2xlYW51cEdhcmJhZ2VDb2xsZWN0ZWRWYWx1ZXMoKSB7CiAJCUhhc2hhYmxlV2Vha1JlZmVyZW5jZSB0b0JlUmVtb3ZlZDsKIAkJd2hpbGUgKCh0b0JlUmVtb3ZlZCA9IChIYXNoYWJsZVdlYWtSZWZlcmVuY2UpIHRoaXMucmVmZXJlbmNlUXVldWUucG9sbCgpKSAhPSBudWxsKSB7CkBAIC0xMzIsMTEgKzEzMiwxMSBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgewogCQlyZXR1cm4gZ2V0KG9iaikgIT0gbnVsbDsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoYXQgaXMgaW4gdGhpcyBzZXQgYW5kIHRoYXQgaXMgZXF1YWxzIHRvIHRoZSBnaXZlbiBvYmplY3QuCiAJICogUmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQkKKwogCXByaXZhdGUgdm9pZCByZWhhc2goKSB7CiAJCVdlYWtIYXNoU2V0IG5ld0hhc2hTZXQgPSBuZXcgV2Vha0hhc2hTZXQodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAkJbmV3SGFzaFNldC5yZWZlcmVuY2VRdWV1ZSA9IHRoaXMucmVmZXJlbmNlUXVldWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1dlYWtIYXNoU2V0T2ZDaGFyQXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvV2Vha0hhc2hTZXRPZkNoYXJBcnJheS5qYXZhCmluZGV4IDc5MGY4ZjguLjZjZGQ1MzAgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvV2Vha0hhc2hTZXRPZkNoYXJBcnJheS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvV2Vha0hhc2hTZXRPZkNoYXJBcnJheS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDcgKzE4LDcgQEAKICAqIEEgaGFzaHNldCBvZiBjaGFyW10gd2hvc2UgdmFsdWVzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KICAqLwogcHVibGljIGNsYXNzIFdlYWtIYXNoU2V0T2ZDaGFyQXJyYXkgewotCQorCiAJcHVibGljIHN0YXRpYyBjbGFzcyBIYXNoYWJsZVdlYWtSZWZlcmVuY2UgZXh0ZW5kcyBXZWFrUmVmZXJlbmNlIHsKIAkJcHVibGljIGludCBoYXNoQ29kZTsKIAkJcHVibGljIEhhc2hhYmxlV2Vha1JlZmVyZW5jZShjaGFyW10gcmVmZXJlbnQsIFJlZmVyZW5jZVF1ZXVlIHF1ZXVlKSB7CkBAIC00MSwxNiArNDEsMTYgQEAKIAkJCXJldHVybiAiW2hhc2hDb2RlPSIgKyB0aGlzLmhhc2hDb2RlICsgIl0gXCIiICsgbmV3IFN0cmluZyhyZWZlcmVudCkgKyAnXCInOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KLQkKKwogCUhhc2hhYmxlV2Vha1JlZmVyZW5jZVtdIHZhbHVlczsKIAlwdWJsaWMgaW50IGVsZW1lbnRTaXplOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlCiAJaW50IHRocmVzaG9sZDsKLQlSZWZlcmVuY2VRdWV1ZSByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOwkKLQkKKwlSZWZlcmVuY2VRdWV1ZSByZWZlcmVuY2VRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOworCiAJcHVibGljIFdlYWtIYXNoU2V0T2ZDaGFyQXJyYXkoKSB7CiAJCXRoaXMoNSk7CiAJfQotCQorCiAJcHVibGljIFdlYWtIYXNoU2V0T2ZDaGFyQXJyYXkoaW50IHNpemUpIHsKIAkJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CiAJCXRoaXMudGhyZXNob2xkID0gc2l6ZTsgLy8gc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMKQEAgLTU5LDcgKzU5LDcgQEAKIAkJCWV4dHJhUm9vbSsrOwogCQl0aGlzLnZhbHVlcyA9IG5ldyBIYXNoYWJsZVdlYWtSZWZlcmVuY2VbZXh0cmFSb29tXTsKIAl9Ci0JCisKIAkvKgogCSAqIEFkZHMgdGhlIGdpdmVuIGNoYXIgYXJyYXkgdG8gdGhpcyBzZXQuCiAJICogSWYgYSBjaGFyIGFycmF5IHRoYXQgaXMgZXF1YWxzIHRvIHRoZSBnaXZlbiBjaGFyIGFycmF5IGFscmVhZHkgZXhpc3RzLCBkbyBub3RoaW5nLgpAQCAtNjcsNyArNjcsNyBAQAogCSAqLwogCXB1YmxpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSkgewogCQljbGVhbnVwR2FyYmFnZUNvbGxlY3RlZFZhbHVlcygpOwotCQlpbnQgdmFsdWVzTGVuZ3RoID0gdGhpcy52YWx1ZXMubGVuZ3RoLCAKKwkJaW50IHZhbHVlc0xlbmd0aCA9IHRoaXMudmFsdWVzLmxlbmd0aCwKIAkJCWluZGV4ID0gKENoYXJPcGVyYXRpb24uaGFzaENvZGUoYXJyYXkpICYgMHg3RkZGRkZGRikgJSB2YWx1ZXNMZW5ndGg7CiAJCUhhc2hhYmxlV2Vha1JlZmVyZW5jZSBjdXJyZW50VmFsdWU7CiAJCXdoaWxlICgoY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZXNbaW5kZXhdKSAhPSBudWxsKSB7CkBAIC04NCwxMCArODQsMTAgQEAKIAkJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQogCQlpZiAoKyt0aGlzLmVsZW1lbnRTaXplID4gdGhpcy50aHJlc2hvbGQpCiAJCQlyZWhhc2goKTsKLQkJCisKIAkJcmV0dXJuIGFycmF5OwogCX0KLQkJCisKIAlwcml2YXRlIHZvaWQgYWRkVmFsdWUoSGFzaGFibGVXZWFrUmVmZXJlbmNlIHZhbHVlKSB7CiAJCWNoYXJbXSBhcnJheSA9IChjaGFyW10pIHZhbHVlLmdldCgpOwogCQlpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkKIAkJCXJlaGFzaCgpOwogCX0KLQkKKwogCXByaXZhdGUgdm9pZCBjbGVhbnVwR2FyYmFnZUNvbGxlY3RlZFZhbHVlcygpIHsKIAkJSGFzaGFibGVXZWFrUmVmZXJlbmNlIHRvQmVSZW1vdmVkOwogCQl3aGlsZSAoKHRvQmVSZW1vdmVkID0gKEhhc2hhYmxlV2Vha1JlZmVyZW5jZSkgdGhpcy5yZWZlcmVuY2VRdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKQEAgLTEzNCwxMSArMTM0LDExIEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhjaGFyW10gYXJyYXkpIHsKIAkJcmV0dXJuIGdldChhcnJheSkgIT0gbnVsbDsKIAl9Ci0JCisKIAkvKgogCSAqIFJldHVybiB0aGUgY2hhciBhcnJheSB0aGF0IGlzIGluIHRoaXMgc2V0IGFuZCB0aGF0IGlzIGVxdWFscyB0byB0aGUgZ2l2ZW4gY2hhciBhcnJheS4KIAkgKiBSZXR1cm4gbnVsbCBpZiBub3QgZm91bmQuCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCQorCiAJcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKIAkJV2Vha0hhc2hTZXRPZkNoYXJBcnJheSBuZXdIYXNoU2V0ID0gbmV3IFdlYWtIYXNoU2V0T2ZDaGFyQXJyYXkodGhpcy5lbGVtZW50U2l6ZSAqIDIpOwkJLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKIAkJbmV3SGFzaFNldC5yZWZlcmVuY2VRdWV1ZSA9IHRoaXMucmVmZXJlbmNlUXVldWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggY2Q0NWMwNC4uZTc1ZTU2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw3IEBACiAjIyMgamF2YSBlbGVtZW50CiBlbGVtZW50X2RvZXNOb3RFeGlzdCA9IHswfSBkb2VzIG5vdCBleGlzdAogZWxlbWVudF9ub3RPbkNsYXNzcGF0aCA9IHswfSBpcyBub3Qgb24gaXRzIHByb2plY3QnJ3MgYnVpbGQgcGF0aAotZWxlbWVudF9pbnZhbGlkQ2xhc3NGaWxlTmFtZSA9IENsYXNzIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC5jbGFzcworZWxlbWVudF9pbnZhbGlkQ2xhc3NGaWxlTmFtZSA9IHswfSBpcyBub3QgYSB2YWxpZCBjbGFzcyBmaWxlIG5hbWUKIGVsZW1lbnRfcmVjb25jaWxpbmcgPSBSZWNvbmNpbGluZy4uLgogZWxlbWVudF9hdHRhY2hpbmdTb3VyY2UgPSBBdHRhY2hpbmcgc291cmNlLi4uCiBlbGVtZW50X2ludmFsaWRSZXNvdXJjZUZvclByb2plY3QgPSBJbGxlZ2FsIGFyZ3VtZW50IC0gbXVzdCBiZSBvbmUgb2YgSVByb2plY3QsIElGb2xkZXIsIG9yIElGaWxlCkBAIC0xMjUsNiArMTI1LDcgQEAKIHN0YXR1c191cGRhdGVDb25mbGljdCA9IFVwZGF0ZSBjb25mbGljdAogc3RhdHVzX2Nhbm5vdF9yZXRyaWV2ZV9hdHRhY2hlZF9qYXZhZG9jID0gQ2Fubm90IHJldHJpZXZlIHRoZSBhdHRhY2hlZCBqYXZhZG9jIGZvciB7MH17MX0KIHN0YXR1c191bmtub3duX2phdmFkb2NfZm9ybWF0ID0gVW5rbm93biBqYXZhZG9jIGZvcm1hdCBmb3IgezB9CitzdGF0dXNfdGltZW91dF9qYXZhZG9jID0gVGltZWQgb3V0IHdoaWxlIHJldHJpZXZpbmcgdGhlIGF0dGFjaGVkIGphdmFkb2MgZm9yIHswfXsxfSAKIAogIyMjIGNsYXNzcGF0aAogY2xhc3NwYXRoX2J1aWxkUGF0aCA9IEJ1aWxkIHBhdGgKQEAgLTE0MCwxMyArMTQxLDE2IEBACiBjbGFzc3BhdGhfY2Fubm90VXNlTGlicmFyeUFzT3V0cHV0ID0gU291cmNlIGZvbGRlciAnJ3swfScnIGluIHByb2plY3QgJyd7Mn0nJyBjYW5ub3Qgb3V0cHV0IHRvIGxpYnJhcnkgJyd7MX0nJwogY2xhc3NwYXRoX2Nsb3NlZFByb2plY3QgPSBSZXF1aXJlZCBwcm9qZWN0ICcnezB9JycgbmVlZHMgdG8gYmUgb3BlbgogY2xhc3NwYXRoX2NvdWxkTm90V3JpdGVDbGFzc3BhdGhGaWxlID0gQ291bGQgbm90IHdyaXRlICcnLmNsYXNzcGF0aCcnIGZpbGUgb2YgcHJvamVjdCAnJ3swfScnOiB7MX0KLWNsYXNzcGF0aF9jeWNsZSA9IEEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3QgJyd7MH0nJworY2xhc3NwYXRoX2N5Y2xlID0gQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdCAnJ3swfScnLiBUaGUgY3ljbGUgY29uc2lzdHMgb2YgcHJvamVjdHMgJ3snezF9J30nCiBjbGFzc3BhdGhfZHVwbGljYXRlRW50cnlQYXRoID0gQnVpbGQgcGF0aCBjb250YWlucyBkdXBsaWNhdGUgZW50cnk6ICcnezB9JycgZm9yIHByb2plY3QgJyd7MX0nJwogY2xhc3NwYXRoX2lsbGVnYWxDb250YWluZXJQYXRoID0gSWxsZWdhbCBjbGFzc3BhdGggY29udGFpbmVyIHBhdGg6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnLCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQgKGNvbnRhaW5lcklEK2hpbnRzKQogY2xhc3NwYXRoX2lsbGVnYWxFbnRyeUluQ2xhc3NwYXRoRmlsZSA9IElsbGVnYWwgZW50cnkgaW4gJycuY2xhc3NwYXRoJycgb2YgcHJvamVjdCAnJ3swfScnIGZpbGU6IHsxfQogY2xhc3NwYXRoX2lsbGVnYWxMaWJyYXJ5UGF0aCA9IElsbGVnYWwgcGF0aCBmb3IgcmVxdWlyZWQgbGlicmFyeTogJyd7MH0nJyBpbiBwcm9qZWN0ICcnezF9JycKK2NsYXNzcGF0aF9pbGxlZ2FsTGlicmFyeVBhdGhJbkNvbnRhaW5lciA9IElsbGVnYWwgcGF0aCBmb3IgcmVxdWlyZWQgbGlicmFyeTogJyd7MH0nJyBpbiB0aGUgezF9CiBjbGFzc3BhdGhfaWxsZWdhbExpYnJhcnlBcmNoaXZlID0gSWxsZWdhbCB0eXBlIG9mIGFyY2hpdmUgZm9yIHJlcXVpcmVkIGxpYnJhcnk6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnCitjbGFzc3BhdGhfYXJjaGl2ZVJlYWRFcnJvciA9IEFyY2hpdmUgZm9yIHJlcXVpcmVkIGxpYnJhcnk6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnIGNhbm5vdCBiZSByZWFkIG9yIGlzIG5vdCBhIHZhbGlkIFpJUCBmaWxlCiBjbGFzc3BhdGhfaWxsZWdhbEV4dGVybmFsRm9sZGVyID0gUmVxdWlyZWQgbGlicmFyeSBjYW5ub3QgZGVub3RlIGV4dGVybmFsIGZvbGRlcjogJyd7MH0nJyBmb3IgcHJvamVjdCAnJ3sxfScnCitjbGFzc3BhdGhfaWxsZWdhbEV4dGVybmFsRm9sZGVySW5Db250YWluZXIgPSBSZXF1aXJlZCBsaWJyYXJ5IGNhbm5vdCBkZW5vdGUgZXh0ZXJuYWwgZm9sZGVyOiAnJ3swfScnIGluIHRoZSB7MX0KIGNsYXNzcGF0aF9pbGxlZ2FsUHJvamVjdFBhdGggPSBJbGxlZ2FsIHBhdGggZm9yIHJlcXVpcmVkIHByb2plY3Q6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnCiBjbGFzc3BhdGhfaWxsZWdhbFNvdXJjZUZvbGRlclBhdGggPSBJbGxlZ2FsIHBhdGggZm9yIHJlcXVpcmVkIHNvdXJjZSBmb2xkZXI6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnCiBjbGFzc3BhdGhfaWxsZWdhbFZhcmlhYmxlUGF0aCA9IElsbGVnYWwgY2xhc3NwYXRoIHZhcmlhYmxlIHBhdGg6ICcnezB9JycgaW4gcHJvamVjdCAnJ3sxfScnLCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQKQEAgLTE1NSwxMCArMTU5LDE0IEBACiBjbGFzc3BhdGhfbXVzdEVuZFdpdGhTbGFzaCA9IEVuZCBleGNsdXNpb24gZmlsdGVyICcnezB9Jycgd2l0aCAvIHRvIGZ1bGx5IGV4Y2x1ZGUgJyd7MX0nJwogY2xhc3NwYXRoX3VuYm91bmRDb250YWluZXJQYXRoID0gVW5ib3VuZCBjbGFzc3BhdGggY29udGFpbmVyOiAnJ3swfScnIGluIHByb2plY3QgJyd7MX0nJwogY2xhc3NwYXRoX3VuYm91bmRMaWJyYXJ5ID0gUHJvamVjdCAnJ3sxfScnIGlzIG1pc3NpbmcgcmVxdWlyZWQgbGlicmFyeTogJyd7MH0nJworY2xhc3NwYXRoX3VzZXJMaWJyYXJ5SW5mbyA9IHVzZXIgbGlicmFyeSAnJ3swfScnCitjbGFzc3BhdGhfY29udGFpbmVySW5mbyA9IGNvbnRhaW5lciAnJ3swfScnCitjbGFzc3BhdGhfdW5ib3VuZExpYnJhcnlJbkNvbnRhaW5lciA9IFRoZSB7MX0gcmVmZXJlbmNlcyBub24gZXhpc3RpbmcgbGlicmFyeSAnJ3swfScnCiBjbGFzc3BhdGhfdW5ib3VuZFByb2plY3QgPSBQcm9qZWN0ICcnezF9JycgaXMgbWlzc2luZyByZXF1aXJlZCBKYXZhIHByb2plY3Q6ICcnezB9JycKIGNsYXNzcGF0aF9zZXR0aW5nT3V0cHV0TG9jYXRpb25Qcm9ncmVzcyA9IFNldHRpbmcgb3V0cHV0IGxvY2F0aW9uIGZvcjogJyd7MH0nJwogY2xhc3NwYXRoX3NldHRpbmdQcm9ncmVzcyA9IFNldHRpbmcgY2xhc3NwYXRoIGZvcjogezB9Ci1jbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQgPSBJbnZhbGlkIHNvdXJjZSBhdHRhY2htZW50OiAnJ3swfScnIGZvciByZXF1aXJlZCBsaWJyYXJ5ICcnezF9JycgaW4gcHJvamVjdCAnJ3sxfScnCitjbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQgPSBJbnZhbGlkIHNvdXJjZSBhdHRhY2htZW50OiAnJ3swfScnIGZvciByZXF1aXJlZCBsaWJyYXJ5ICcnezF9JycgaW4gcHJvamVjdCAnJ3syfScnCitjbGFzc3BhdGhfdW5ib3VuZFNvdXJjZUF0dGFjaG1lbnRJbkNvbnRhaW5lZExpYnJhcnkgPSBJbnZhbGlkIHNvdXJjZSBhdHRhY2htZW50OiAnJ3swfScnIGZvciByZXF1aXJlZCBsaWJyYXJ5ICcnezF9JycgaW4gdGhlIHsyfQogY2xhc3NwYXRoX3VuYm91bmRTb3VyY2VGb2xkZXIgPSBQcm9qZWN0ICcnezF9JycgaXMgbWlzc2luZyByZXF1aXJlZCBzb3VyY2UgZm9sZGVyOiAnJ3swfScnCiBjbGFzc3BhdGhfdW5ib3VuZFZhcmlhYmxlUGF0aCA9IFVuYm91bmQgY2xhc3NwYXRoIHZhcmlhYmxlOiAnJ3swfScnIGluIHByb2plY3QgJyd7MX0nJwogY2xhc3NwYXRoX3Vua25vd25LaW5kID0gVW5rbm93biBraW5kOiAnJ3swfScnCkBAIC0xNjYsMzUgKzE3NCwzMSBAQAogY2xhc3NwYXRoX2Rpc2FibGVkSW5jbHVzaW9uRXhjbHVzaW9uUGF0dGVybnMgPSBJbmNsdXNpb24gb3IgZXhjbHVzaW9uIHBhdHRlcm5zIGFyZSBkaXNhYmxlZCBpbiBwcm9qZWN0ICcnezF9JycsIGNhbm5vdCBzZWxlY3RpdmVseSBpbmNsdWRlIG9yIGV4Y2x1ZGUgZnJvbSBlbnRyeTogJyd7MH0nJwogY2xhc3NwYXRoX2Rpc2FibGVkTXVsdGlwbGVPdXRwdXRMb2NhdGlvbnMgPSBNdWx0aXBsZSBvdXRwdXQgbG9jYXRpb25zIGFyZSBkaXNhYmxlZCBpbiBwcm9qZWN0ICcnezF9JycsIGNhbm5vdCBhc3NvY2lhdGUgZW50cnk6ICcnezB9Jycgd2l0aCBhIHNwZWNpZmljIG91dHB1dAogY2xhc3NwYXRoX2luY29tcGF0aWJsZUxpYnJhcnlKREtMZXZlbCA9IEluY29tcGF0aWJsZSAuY2xhc3MgZmlsZXMgdmVyc2lvbiBpbiByZXF1aXJlZCBiaW5hcmllcy4gUHJvamVjdCAnJ3swfScnIGlzIHRhcmdldGluZyBhIHsxfSBydW50aW1lLCBidXQgaXMgY29tcGlsZWQgYWdhaW5zdCAnJ3syfScnIHdoaWNoIHJlcXVpcmVzIGEgezN9IHJ1bnRpbWUKK2NsYXNzcGF0aF9pbmNvbXBhdGlibGVMaWJyYXJ5SkRLTGV2ZWxJbkNvbnRhaW5lciA9IEluY29tcGF0aWJsZSAuY2xhc3MgZmlsZXMgdmVyc2lvbiBpbiByZXF1aXJlZCBiaW5hcmllcy4gUHJvamVjdCAnJ3swfScnIGlzIHRhcmdldGluZyBhIHsxfSBydW50aW1lLCBidXQgaXMgY29tcGlsZWQgYWdhaW5zdCAnJ3syfScnIChmcm9tIHRoZSB7M30pIHdoaWNoIHJlcXVpcmVzIGEgezR9IHJ1bnRpbWUKIGNsYXNzcGF0aF9kdXBsaWNhdGVFbnRyeUV4dHJhQXR0cmlidXRlID0gRHVwbGljYXRlIGV4dHJhIGF0dHJpYnV0ZTogJyd7MH0nJyBpbiBjbGFzc3BhdGggZW50cnkgJyd7MX0nJyBmb3IgcHJvamVjdCAnJ3syfScnCiBjbGFzc3BhdGhfZGVwcmVjYXRlZF92YXJpYWJsZSA9IENsYXNzcGF0aCB2YXJpYWJsZSAnJ3swfScnIGluIHByb2plY3QgJyd7MX0nJyBpcyBkZXByZWNhdGVkOiB7Mn0KIAogIyMjIG1pc2NlbGxhbmVvdXMKK2J1ZmZlcl9jbG9zZWQ9QnVmZmVyIGlzIGNsb3NlZAogZmlsZV9ub3RGb3VuZCA9IEZpbGUgbm90IGZvdW5kOiAnJ3swfScnCiBmaWxlX2JhZEZvcm1hdCA9IEJhZCBmb3JtYXQKIHBhdGhfbnVsbFBhdGggPSBQYXRoIGNhbm5vdCBiZSBudWxsCiBwYXRoX211c3RCZUFic29sdXRlID0gUGF0aCBtdXN0IGJlIGFic29sdXRlCiBjYWNoZV9pbnZhbGlkTG9hZEZhY3RvciA9IEluY29ycmVjdCBsb2FkIGZhY3Rvcgogc2F2ZWRTdGF0ZV9qb2JOYW1lID0gUHJvY2Vzc2luZyBKYXZhIGNoYW5nZXMgc2luY2UgbGFzdCBhY3RpdmF0aW9uCityZWZyZXNoaW5nX2V4dGVybmFsX2ZvbGRlcnMgPSBSZWZyZXNoaW5nIGV4dGVybmFsIGZvbGRlcnMKK3VwZGF0aW5nX2V4dGVybmFsX2FyY2hpdmVzX2pvYk5hbWUgPSBSZWZyZXNoaW5nIGV4dGVybmFsIGFyY2hpdmVzCiAKICMjIGphdmEgbW9kZWwgaW5pdGlhbGl6YXRpb24KIGphdmFtb2RlbF9pbml0aWFsaXphdGlvbiA9IEluaXRpYWxpemluZyBKYXZhIHRvb2xpbmcKK2phdmFtb2RlbF9pbml0aWFsaXppbmdfZGVsdGFfc3RhdGU9IEluaXRpYWxpemluZyBkZWx0YSBzdGF0ZQogamF2YW1vZGVsX2NvbmZpZ3VyaW5nX3NlYXJjaGVuZ2luZT1Db25maWd1cmluZyBzZWFyY2ggZW5naW5lCiBqYXZhbW9kZWxfY29uZmlndXJpbmdfY2xhc3NwYXRoX2NvbnRhaW5lcnM9Q29uZmlndXJpbmcgY2xhc3NwYXRoIGNvbnRhaW5lcnMKIGphdmFtb2RlbF9nZXR0aW5nX2J1aWxkX3N0YXRlX251bWJlcj1HZXR0aW5nIGJ1aWxkIHN0YXRlIHZlcnNpb24gbnVtYmVyCiBqYXZhbW9kZWxfY29uZmlndXJpbmc9Q29uZmlndXJpbmcgezB9CiBqYXZhbW9kZWxfYnVpbGRpbmdfYWZ0ZXJfdXBncmFkZT1UcmlnZ2VyaW5nIGJ1aWxkIGFmdGVyIHVwZ3JhZGUKIGphdmFtb2RlbF9yZWZyZXNoaW5nX2V4dGVybmFsX2phcnM9UmVmcmVzaGluZyBleHRlcm5hbCBhcmNoaXZlcwotCi0jIyMgYWNjZXNzIHJlc3RyaWN0aW9ucwotcmVzdHJpY3RlZEFjY2Vzc19wcm9qZWN0ID0gVGhlIHR5cGUgezB9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBwcm9qZWN0IHsxfQotcmVzdHJpY3RlZEFjY2Vzc19saWJyYXJ5ID0gVGhlIHR5cGUgezB9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBsaWJyYXJ5IHsxfQotcmVzdHJpY3RlZEFjY2Vzc19jb25zdHJ1Y3Rvcl9wcm9qZWN0ID0gVGhlIGNvbnN0cnVjdG9yIHswfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgcHJvamVjdCB7MX0KLXJlc3RyaWN0ZWRBY2Nlc3NfY29uc3RydWN0b3JfbGlicmFyeSA9IFRoZSBjb25zdHJ1Y3RvciB7MH0gaXMgbm90IGFjY2Vzc2libGUgZHVlIHRvIHJlc3RyaWN0aW9uIG9uIHJlcXVpcmVkIGxpYnJhcnkgezF9Ci1yZXN0cmljdGVkQWNjZXNzX2ZpZWxkX3Byb2plY3QgPSBUaGUgZmllbGQgezB9IGZyb20gdGhlIHR5cGUgezF9IGlzIG5vdCBhY2Nlc3NpYmxlIGR1ZSB0byByZXN0cmljdGlvbiBvbiByZXF1aXJlZCBwcm9qZWN0IHsyfQotcmVzdHJpY3RlZEFjY2Vzc19maWVsZF9saWJyYXJ5ID0gVGhlIGZpZWxkIHswfSBmcm9tIHRoZSB0eXBlIHsxfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgbGlicmFyeSB7Mn0KLXJlc3RyaWN0ZWRBY2Nlc3NfbWV0aG9kX3Byb2plY3QgPSBUaGUgbWV0aG9kIHswfSBmcm9tIHRoZSB0eXBlIHsxfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgcHJvamVjdCB7Mn0KLXJlc3RyaWN0ZWRBY2Nlc3NfbWV0aG9kX2xpYnJhcnkgPSBUaGUgbWV0aG9kIHswfSBmcm9tIHRoZSB0eXBlIHsxfSBpcyBub3QgYWNjZXNzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb24gb24gcmVxdWlyZWQgbGlicmFyeSB7Mn0KK2phdmFtb2RlbF9yZXNldHRpbmdfc291cmNlX2F0dGFjaG1lbnRfcHJvcGVydGllcz1SZXNldHRpbmcgc291cmNlIGF0dGFjaG1lbnQgcHJvcGVydGllcwogCiAjIyMgamF2YSBjb252ZW50aW9ucwogY29udmVudGlvbl91bml0X251bGxOYW1lID0gQ29tcGlsYXRpb24gdW5pdCBuYW1lIG11c3Qgbm90IGJlIG51bGwKQEAgLTI1MCw4ICsyNTQsOCBAQAogZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZyA9IExvY2F0aW5nIHswfSBtYXRjaGVzLi4uCiBleGNlcHRpb25fd3JvbmdGb3JtYXQgPSBXcm9uZyBmb3JtYXQKIHByb2Nlc3NfbmFtZSA9IEphdmEgaW5kZXhpbmcKLW1hbmFnZXJfZmlsZXNUb0luZGV4ID0gezB9IGZpbGVzIHRvIGluZGV4Ci1tYW5hZ2VyX2luZGV4aW5nSW5Qcm9ncmVzcyA9IEphdmEgaW5kZXhpbmcgaW4gcHJvZ3Jlc3MKK2pvYm1hbmFnZXJfZmlsZXNUb0luZGV4ID0gezF9IGZpbGVzIHRvIGluZGV4ICh7MH0pCitqb2JtYW5hZ2VyX2luZGV4aW5nID0gSmF2YSBpbmRleGluZy4uLiAKIAogIyMjIERpc2Fzc2VtYmxlciBtZXNzYWdlcwogCkBAIC0zNTQsNiArMzU4LDcgQEAKIGNsYXNzZm9ybWF0X2lpbmMgPSB7MH0gezF9IHsyfXszfQogY2xhc3Nmb3JtYXRfaW52b2tlc3BlY2lhbCA9ezB9IHsyfSBbezF9XQogY2xhc3Nmb3JtYXRfaW52b2tlaW50ZXJmYWNlID17MH0gezN9IFt7MX1dIFtuYXJnczogezJ9XQorY2xhc3Nmb3JtYXRfaW52b2tlZHluYW1pYz17MH0gezJ9IFt7MX1dCiBjbGFzc2Zvcm1hdF9pbnZva2VzdGF0aWMgPXswfSB7Mn0gW3sxfV0KIGNsYXNzZm9ybWF0X2ludm9rZXZpcnR1YWwgPXswfSB7Mn0gW3sxfV0KIGNsYXNzZm9ybWF0X2dldGZpZWxkID17MH0gezJ9LnszfSA6IHs0fSBbezF9XQpAQCAtMzc0LDMgKzM3OSw3IEBACiBjbGFzc2ZpbGVmb3JtYXRfZXhjZXB0aW9udGFibGVlbnRyeSA9IFtwYzogezB9LCBwYzogezF9XSAtPiB7Mn0gd2hlbiA6IHszfQogY2xhc3NmaWxlZm9ybWF0X2xpbmVudW1iZXJ0YWJsZWVudHJ5ID0gW3BjOiB7MH0sIGxpbmU6IHsxfV0KIGNsYXNzZmlsZWZvcm1hdF9sb2NhbHZhcmlhYmxldGFibGVlbnRyeSA9IFtwYzogezB9LCBwYzogezF9XSBsb2NhbDogezJ9IGluZGV4OiB7M30gdHlwZTogezR9CisKKyMjIyBFY2xpcHNlIEphdmEgQ29yZSBjb21wbGV0aW9uIG1lc3NhZ2VzLgorZW5naW5lX2NvbXBsZXRpbmcgPSBDb21wdXRpbmcgcHJvcG9zYWxzLi4uCitjb2RlX2Fzc2lzdF9pbnRlcm5hbF9lcnJvcj1Db2RlIGFzc2lzdCBpbnRlcm5hbCBlcnJvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvQVBJX2NoYW5nZXMuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwKaW5kZXggNTkyYmRhNS4uMGFlMzFhNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvQVBJX2NoYW5nZXMuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9BUElfY2hhbmdlcy5odG1sCkBAIC05Miw3ICs5Miw3IEBACiAJYmVpbmcgY29tcGF0aWJsZSB3aXRoIDxjb2RlPklXb3JraW5nQ29weTwvY29kZT4uCiAKIDxocj48aDE+Q2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goLi4uKSB0cmVhdHMgbm9uIGFic29sdXRlIHBhdHRlcm4gYXMgQW50IGRvZXM8L2gxPgotCUxhc3QgZWRpdDogMjAwMy8wNi8xMSAoLT5NMikKKwlMYXN0IGVkaXQ6IDIwMDMvMDYvMTEgKC0mZ3Q7TTIpCiA8aDI+UHJvYmxlbSBkZXNjcmlwdGlvbjwvaDI+CiAJPGNvZGU+Q2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goLi4uKTwvY29kZT4gdXNlZCB0byB0cmVhdCBub24gYWJzb2x1dGUgcGF0dGVybiA8Y29kZT4nZm9vJzwvY29kZT4KIAlhcyA8Y29kZT4nKiovZm9vJzwvY29kZT4gZm9yIGZyZWUuIFRoaXMgd2FzIGluY29uc2lzdGVudCB3aXRoIEFudCBwYXR0ZXJuc2V0IHJ1bGVzLgpAQCAtMTA1LDcgKzEwNSw3IEBACiAJVE9ETwogCiA8aHI+PGgxPkNoYW5nZSBpbiBzeW50YXggZXJyb3IgbWVzc2FnZSBJRDwvaDE+Ci0JTGFzdCBlZGl0OiAyMDAzLzA2LzExICgtPk0yKQorCUxhc3QgZWRpdDogMjAwMy8wNi8xMSAoLSZndDtNMikKIDxoMj5Qcm9ibGVtIGRlc2NyaXB0aW9uPC9oMj4KIAlUT0RPCiA8aDI+UHJvYmxlbSByZXNvbHV0aW9uPC9oMj4KQEAgLTEzOCw3ICsxMzgsNyBAQAogCVRPRE8KIAogPGhyPjxoMT5Gb3JjZSByZWxvYWQgb2YgLmNsYXNzcGF0aCBmaWxlPC9oMT4KLQlMYXN0IGVkaXQ6IDIwMDMvMDYvMTIgKC0+TTIpCisJTGFzdCBlZGl0OiAyMDAzLzA2LzEyICgtJmd0O00yKQogPGgyPlByb2JsZW0gZGVzY3JpcHRpb248L2gyPgogCVRPRE8KIDxoMj5Qcm9ibGVtIHJlc29sdXRpb248L2gyPgpAQCAtMTcxLDcgKzE3MSw3IEBACiAJVE9ETwogCiA8aHI+PGgxPkFsbG93IGVtcHR5IHBhdGggdG8gYmUgZXF1aXZhbGVudCB0byBubyBzb3VyY2UgYXR0YWNobWVudDwvaDE+Ci0JTGFzdCBlZGl0OiAyMDAzLzA2LzEzICgtPk0yKQorCUxhc3QgZWRpdDogMjAwMy8wNi8xMyAoLSZndDtNMikKIDxoMj5Qcm9ibGVtIGRlc2NyaXB0aW9uPC9oMj4KIAk8Y29kZT5KYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoLi4uKTwvY29kZT4gdXNlZCB0byBub3QgYWxsb3cgYW4gZW1wdHkgc291cmNlIGF0dGFjaG1lbnQgKAogCTxjb2RlPm5ldyBQYXRoKCIiKTwvY29kZT4pIHRvIGJlIGVxdWl2YWxlbnQgdG8gbm8gc291cmNlIGF0dGFjaG1lbnQgKGkuZS4gPGNvZGU+bnVsbDwvY29kZT4pLiAKQEAgLTE4OSw3ICsxODksNyBAQAogCVRPRE8KIAogPGhyPjxoMT5DbG9zZSB0aGUgZ2FwIGJldHdlZW4gY29tcGlsYXRpb24gdW5pdHMgYW5kIHdvcmtpbmcgY29waWVzPC9oMT4KLQlMYXN0IGVkaXQ6IDIwMDMvMDYvMjcgKC0+TTIpCisJTGFzdCBlZGl0OiAyMDAzLzA2LzI3ICgtJmd0O00yKQogPGgyPlByb2JsZW0gZGVzY3JpcHRpb248L2gyPgogCVRPRE8KIAk8cD5TZWUgYWxzbyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjg4OCAiPmJ1ZyAzNjg4ODwvYT4uCkBAIC0yMzIsNyArMjMyLDcgQEAKICAqCiAgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkCiAgKiBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCwgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBhbiB1cGRhdGUgY29uZmxpY3QuCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGZvcmNlIHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisgKiBUaGUgdmFsdWUgb2YgdGhlIGZvcmNlIHBhcmFtZXRlciBhZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCiAgKiBzdWNoIGEgY29uZmxpY3Q6CiAgKiAtIHRydWUgLSBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IGFyZSBhcHBsaWVkIHRvCiAgKiAJdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZXZlbiB0aG91Z2ggdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQgCkBAIC00MTksNyArNDE5LDcgQEAKIAlUT0RPCiAKIDxocj48aDE+SUphdmFFbGVtZW50LmdldFJlc291cmNlKCkgcmV0dXJucyBhIG5vbiBudWxsIHZhbHVlIGZvciB3b3JraW5nIGNvcGllczwvaDE+Ci0JTGFzdCBlZGl0OiAyMDAzLzA2LzE4ICgtPk0yKQorCUxhc3QgZWRpdDogMjAwMy8wNi8xOCAoLSZndDtNMikKIDxoMj5Qcm9ibGVtIGRlc2NyaXB0aW9uPC9oMj4KIAk8Y29kZT5JSmF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKTwvY29kZT4gd2FzIHNwZWNpZmllZCB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZm9yIHdvcmtpbmcgY29waWVzLiAKIAlUaGlzIGRpZG4ndCBtYWtlIHNlbnNlIGFzCXRoaXMgaXMgYSBoYW5kbGUtb25seSBvcGVyYXRpb24gYW5kIGFuIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gaXMgYWxzbyBhIGhhbmRsZS4gCkBAIC00MzAsNyArNDMwLDcgQEAKIAlUT0RPCiAKIDxocj48aDE+UmVuYW1lIGdldE9yaWdpbmFsRWxlbWVudCgpIGludG8gZ2V0UHJpbWFyeUVsZW1lbnQoKTwvaDE+Ci0JTGFzdCBlZGl0OiAyMDAzLzA2LzIwICgtPk0yKQorCUxhc3QgZWRpdDogMjAwMy8wNi8yMCAoLSZndDtNMikKIDxoMj5Qcm9ibGVtIGRlc2NyaXB0aW9uPC9oMj4KIAlUaGUgMi4xIEFQSSA8Y29kZT5JV29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCk8L2NvZGU+IHJldHVybnMgYW4gPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPi4gSW4gcHJhY3RpY2UgCiAJdGhlIG9yaWdpbmFsIGVsZW1lbnQgZm9yIGEgd29ya2luZyBjb3B5IGlzIGFsd2F5cyBhbiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiB3aG9zZSBvd25lciBpcyB0aGUgcHJpbWFyeSBvd25lci4gCkBAIC00NzEsNyArNDcxLDcgQEAKIAlUT0RPCiAKIDxocj48aDE+SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KC4uLikgbm8gbG9uZ2VyIGFjY2VwdHMgYSByZWxhdGl2ZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoPC9oMT4KLQlMYXN0IGVkaXQ6IDIwMDMvMDYvMzAgKC0+TTIpCisJTGFzdCBlZGl0OiAyMDAzLzA2LzMwICgtJmd0O00yKQogPGgyPlByb2JsZW0gZGVzY3JpcHRpb248L2gyPgogCVRoZSBBUEkgPGNvZGU+SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCk8L2NvZGU+IAogCWZvciBjcmVhdGluZyBhIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJ5IHdpdGggYSBzb3VyY2UgYXR0YWNobWVudCB1c2VkIHRvIGFjY2VwdCBhIHJlbGF0aXZlIHNvdXJjZSBhdHRhY2htZW50IHBhdGguIEl0IHdhcyBzcGVjJ2VkIGFzIHN1Y2gsIApAQCAtNDkxLDcgKzQ5MSw3IEBACiAJVE9ETwogCiA8aHI+PGgxPlJlYWQgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZSBjb250ZW50cyBldmVuIGlmIHByb2plY3QgaGFzIG5vdCB0aGUgamF2YSBuYXR1cmUgeWV0PC9oMT4KLQlMYXN0IGVkaXQ6IDIwMDMvMDkvMDEgKC0+TTQpCisJTGFzdCBlZGl0OiAyMDAzLzA5LzAxICgtJmd0O000KQogPGgyPlByb2JsZW0gZGVzY3JpcHRpb248L2gyPgogSW4gMi4wIGl0IHdhcyBhbGxvd2VkIHRvIGFjY2VzcyBJSmF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24vZ2V0UmF3Q2xhc3NwYXRoIG9uIGEgcHJvamVjdCB3aGVyZSB0aGUgSmF2YU5hdHVyZSB3YXMgbm90IHNldCB5ZXQuIFNpbmNlIDIuMSBhCiBKYXZhTW9kZWxFeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoYXQgaGFwcGVucy4KQEAgLTUwNSwxOSArNTA1LDE5IEBACiAvKioKICAqIFJldHVybnMgdGhlIHJhdyBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0IGFzIGRlZmluZWQgYnkgaXRzIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgZnJvbSBkaXNrLCBvciA8Y29kZT5udWxsPC9jb2RlPgogICogaWYgdW5hYmxlIHRvIHJlYWQgdGhlIGZpbGUuIAotICogPHA+CisgKiAKICAqIFRoaXMgY2xhc3NwYXRoIG1heSBkaWZmZXIgZnJvbSB0aGUgaW4tbWVtb3J5IGNsYXNzcGF0aCByZXR1cm5lZCBieSA8Y29kZT5nZXRSYXdDbGFzc3BhdGg8L2NvZGU+LCBpbiBjYXNlIHRoZSAKICAqIGF1dG9tYXRpYyByZWNvbmNpbGlhdGlvbiBtZWNoYW5pc20gaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCB5ZXQuIFVzdWFsbHksIGFueSBjaGFuZ2UgdG8gdGhlIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgCiAgKiBpcyBhdXRvbWF0aWNhbGx5IG5vdGljZWQgYW5kIHJlY29uY2lsZWQgYXQgdGhlIG5leHQgcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudC4gCiAgKiBIb3dldmVyLCBpZiB0aGUgZmlsZSBpcyBtb2RpZmllZCB3aXRoaW4gYW4gb3BlcmF0aW9uLCB3aGVyZSB0aGlzIGNoYW5nZSBuZWVkcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgYmVmb3JlIHRoZSAKICAqIG9wZXJhdGlvbiBlbmRzLCB0aGVuIHRoZSBjbGFzc3BhdGggZnJvbSBkaXNrIGNhbiBiZSByZWFkIHVzaW5nIHRoaXMgbWV0aG9kLCBhbmQgZnVydGhlciBhc3NpZ25lZCB0byB0aGUgcHJvamVjdCAKICAqIHVzaW5nIDxjb2RlPnNldFJhd0NsYXNzcGF0aCguLi4pPC9jb2RlPi4KLSAqIDxwPgorICogCiAgKiBBIHJhdyBjbGFzc3BhdGggbWF5IGNvbnRhaW4gY2xhc3NwYXRoIHZhcmlhYmxlIGFuZC9vciBjb250YWluZXIgZW50cmllcy4gQ2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgY2FuIGJlIHJlc29sdmVkIAogICogaW5kaXZpZHVhbGx5IChzZWUgPGNvZGU+SmF2YUNvcmUjZ2V0Q2xhc3NwYXRoVmFyaWFibGU8L2NvZGU+KSwgb3IgdGhlIGZ1bGwgY2xhc3NwYXRoIGNhbiBiZSByZXNvbHZlZCBhdCBvbmNlIHVzaW5nIHRoZSAKICAqIGhlbHBlciBtZXRob2QgPGNvZGU+Z2V0UmVzb2x2ZWRDbGFzc3BhdGg8L2NvZGU+LgogICogVE9ETyAoamltKSBwbGVhc2UgcmVmb3JtdWxhdGUgdG8gaW5jbHVkZSBjbGFzc3BhdGggY29udGFpbmVycyBpbiByZXNvbHV0aW9uIGFzcGVjdHMKLSAqIDxwPgorICogCiAgKiBOb3RlIHRoYXQgbm8gY2hlY2sgaXMgcGVyZm9ybWVkIHdoZXRoZXIgdGhlIHByb2plY3QgaGFzIHRoZSBKYXZhIG5hdHVyZSBzZXQsIGFsbG93aW5nIGFuIGV4aXN0aW5nIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IAogICogZmlsZSB0byBiZSBjb25zaWRlcmVkIGluZGVwZW5kYW50bHkgKHVubGlrZSA8Y29kZT5nZXRSYXdDbGFzc3BhdGg8L2NvZGU+IHdoaWNoIHJlcXVpcmVzIHRoZSBKYXZhIG5hdHVyZSB0byBiZSBhc3NvY2lhdGVkIAogICogd2l0aCB0aGUgcHJvamVjdCkuIApAQCAtNTM1LDE0ICs1MzUsMTQgQEAKIC8qKgogICogUmV0dXJucyB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFzIGRlZmluZWQgYnkgaXRzIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgZnJvbSBkaXNrLCBvciA8Y29kZT5udWxsPC9jb2RlPgogICogaWYgdW5hYmxlIHRvIHJlYWQgdGhlIGZpbGUuIAotICogPHA+CisgKiAKICAqIFRoaXMgb3V0cHV0IGxvY2F0aW9uIG1heSBkaWZmZXIgZnJvbSB0aGUgaW4tbWVtb3J5IG9uZSByZXR1cm5lZCBieSA8Y29kZT5nZXRPdXRwdXRMb2NhdGlvbjwvY29kZT4sIGluIGNhc2UgdGhlIAogICogYXV0b21hdGljIHJlY29uY2lsaWF0aW9uIG1lY2hhbmlzbSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkIHlldC4gVXN1YWxseSwgYW55IGNoYW5nZSB0byB0aGUgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZSAKICAqIGlzIGF1dG9tYXRpY2FsbHkgbm90aWNlZCBhbmQgcmVjb25jaWxlZCBhdCB0aGUgbmV4dCByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV2ZW50LiAKICAqIEhvd2V2ZXIsIGlmIHRoZSBmaWxlIGlzIG1vZGlmaWVkIHdpdGhpbiBhbiBvcGVyYXRpb24sIHdoZXJlIHRoaXMgY2hhbmdlIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBiZWZvcmUgdGhlIAogICogb3BlcmF0aW9uIGVuZHMsIHRoZW4gdGhlIG91dHB1dCBsb2NhdGlvbiBmcm9tIGRpc2sgY2FuIGJlIHJlYWQgdXNpbmcgdGhpcyBtZXRob2QsIGFuZCBmdXJ0aGVyIGFzc2lnbmVkIHRvIHRoZSBwcm9qZWN0IAogICogdXNpbmcgPGNvZGU+c2V0UmF3Q2xhc3NwYXRoKC4uLik8L2NvZGU+LgotICogPHA+CisgKiAKICAqIFRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBpcyB3aGVyZSBjbGFzcyBmaWxlcyBhcmUgb3JkaW5hcmlseSBnZW5lcmF0ZWQKICAqIChhbmQgcmVzb3VyY2UgZmlsZXMsIGNvcGllZCkuIEVhY2ggc291cmNlIGNsYXNzcGF0aCBlbnRyeSBjYW4gYWxzbwogICogc3BlY2lmeSBhbiBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgKGFuZCBjb3BpZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IyMF9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMjBfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCmluZGV4IGU2ZmFmY2YuLjYyMWM3M2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IyMF9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIwX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbApAQCAtMTcsNyArMTcsNyBAQAogICA8L3RyPgogICA8dHI+CiAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMSI+Ci0gICAgICA8Zm9udCBzaXplPSItMiIgY29sb3I9IiM4MDgwZmYiPmphdmEgZGV2ZWxvcG1lbnQgdG9vbGluZyBjb3JlPC9mb250PjwvdGQ+CisgICAgICA8Zm9udCBzaXplPSItMiIgY29sb3I9IiM4MDgwZmYiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD48L3RkPgogICA8L3RyPgogCTx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgogICA8dHI+CkBAIC0zOCw3ICszOCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIEdNNSAtIDI3dGggSnVuZSAyMDAyIC0gUkVMRUFTRSAyLjAgKFIyXzApCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2NAogPGgyPgpAQCAtNTMsNyArNTMsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCBHTTQgLSAyNnRoIEp1bmUgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjMKIDxoMj4KQEAgLTc4LDcgKzc4LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MjQgLSAyNHRoIEp1bmUgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjIKIDxoMj4KQEAgLTk0LDcgKzk0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MjEgLSAyMXN0IEp1bmUgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjEKIDxoMj4KQEAgLTExNiw3ICsxMTYsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyMCAtIDIwdGggSnVuZSAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MAogPGgyPgpAQCAtMTM4LDcgKzEzOCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjE4IC0gMTh0aCBKdW5lIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU5CiA8aDI+CkBAIC0xNTQsNyArMTU0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MTcgLSAxN3RoIEp1bmUgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTgKIDxoMj4KQEAgLTE5Miw3ICsxOTIsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxMiAtIDEydGggSnVuZSAyMDAyIC0gRlJFRVpFIDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU3CiA8aDI+CkBAIC0yMjQsNyArMjI0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MTEgLSAxMXRoIEp1bmUgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU2CiA8aDI+CkBAIC0yNzQsNyArMjc0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MDYgLSA2dGggSnVuZSAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTUKIDxoMj4KQEAgLTMzNiw3ICszMzYsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTM5Ij4xODUzOTwvYT4gIAogdW5hYmxlIHRvIHJ1biBKREJDIHByb2dyYW0sIGNsYXNzIG5vdCBmb3VuZAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTIiPjMyOTI8L2E+ICAKLUFkZGluZyBuZXcgY2xhc3MgdGFrZXMgdmVyeSBsb25nICg+MjBzKSAoMUdFVUdGUSkKK0FkZGluZyBuZXcgY2xhc3MgdGFrZXMgdmVyeSBsb25nICgmZ3Q7MjBzKSAoMUdFVUdGUSkKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzMzIj4zMzMzPC9hPiAgCiBKYXZhQ29yZSBkb2VzIG5vdCByZWNvZ25pemUgZG90IG5vdGF0aW9uIGZvciBpbm5lciBjbGFzc2VzICgxR0k3R1pHKSAgCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MDciPjE4NTA3PC9hPgpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjAxIC0gMXN0IEp1bmUgMjAwMiAtIEZSRUVaRSAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NAogPGgyPgpAQCAtNDAwLDcgKzQwMCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMxIC0gMzFzdCBNYXkgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUzCiA8aDI+CkBAIC00MzksNyArNDM5LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MzAgLSAzMHRoIE1heSAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTIKIDxoMj4KQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyOSAtIDI5dGggTWF5IDIwMDIgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1MQogPGgyPgpAQCAtNTQ5LDcgKzU0OSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTI3IC0gMjd0aCBNYXkgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUwCiA8aDI+CkBAIC01NTcsNyArNTU3LDcgQEAKIDx1bD4KIDxsaT5BZGRlZCBBUEkgdG8gcmV0cmlldmUgY2FjaGVkIGZsYWdzIG9uIHR5cGUgaGllcmFyY2hpZXMgKHNlZSA8Y29kZT5JVHlwZUhpZXJhcmNoeSNnZXRDYWNoZWRGbGFncyhJVHlwZSk8L2NvZGU+KS4gTm90ZSB0aGF0IHRoZXNlCiBmbGFncyBjYW4gaGVscCBhbnN3ZXJpbmcgYm90aCBpc0NsYXNzL2lzSW50ZXJmYWNlIHF1ZXJpZXMgYXMgd2VsbCAoc2VlIDxjb2RlPkZsYWdzLmlzSW50ZXJmYWNlKGludCk8L2NvZGU+PC9saT4KLTxsaT5BZGRlZCBBUEkgdG8gdHJpZ2dlciBhIEphdmEgbW9kZWwgcmVmcmVzaCB3aXRoIHJlc3BlY3QgdG8gZXh0ZXJuYWwgSkFSczogPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxKQVJzPC9jb2RlPi4gPC9saT4KKzxsaT5BZGRlZCBBUEkgdG8gdHJpZ2dlciBhIEphdmEgbW9kZWwgcmVmcmVzaCB3aXRoIHJlc3BlY3QgdG8gZXh0ZXJuYWwgSkFSczogPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxKQVJzPC9jb2RlPi4KIDxwcmU+CiAvKioKICAqIFRyaWdnZXJzIGFuIHVwZGF0ZSBvZiB0aGUgSmF2YU1vZGVsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlZCBleHRlcm5hbCBKQVJzLgpAQCAtNTczLDcgKzU3Myw3IEBACiAgKi8KIHZvaWQgcmVmcmVzaEV4dGVybmFsSkFScyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiA8L3ByZT4KLTxsaT5BZGRlZCBmbGFnIGZvciBub3RpZnlpbmcgYSBKQVIgY29udGVudCBjaGFuZ2UgZHVyaW5nIEphdmEgZGVsdGEgbm90aWZpY2F0aW9uOiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YSNGX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEPC9jb2RlPjwvbGk+CisgPC9saT48bGk+QWRkZWQgZmxhZyBmb3Igbm90aWZ5aW5nIGEgSkFSIGNvbnRlbnQgY2hhbmdlIGR1cmluZyBKYXZhIGRlbHRhIG5vdGlmaWNhdGlvbjogPGNvZGU+SUphdmFFbGVtZW50RGVsdGEjRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRDwvY29kZT48L2xpPgogPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CkBAIC02MDAsNyArNjAwLDcgQEAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzgyNyI+MTc4Mjc8L2E+CiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBhdCAgQ29tcGlsYXRpb25SZXN1bHQuY29tcHV0ZVByaW9yaXR5CiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NjEiPjE2NzYxPC9hPgotTlBFIHdoZW4gZG9pbmcgUHJvamVjdCAtPiBSZWJ1aWxkIEFsbAorTlBFIHdoZW4gZG9pbmcgUHJvamVjdCAtJmd0OyBSZWJ1aWxkIEFsbAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjkiPjMzMjk8L2E+CiBTcGVjaWZpY2F0aW9uIGZvciBJSmF2YUVsZW1lbnREZWx0YSBuZWVkZWQgKDFHSFZXNU0pICAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjc1MyI+MTY3NTM8L2E+CkBAIC02NTQsNyArNjU0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MjEgLSAyMXN0IE1heSAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDkgLSBNSUxFU1RPTkUgNiAvIEZSRUVaRSAxCiA8aDI+CkBAIC02NzgsNyArNjc4LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MTggLSAxOHRoIE1heSAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDgKIDxoMj4KQEAgLTcyMywyMCArNzIzLDIwIEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE1IC0gMTV0aCBNYXkgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ3CiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci0gICAgPGxpPiBOZXcgY29tcGlsZXIgb3B0aW9uIGFkZGVkIHRvIGNvbnRyb2wgbWF4IG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBvbiBhIHVuaXQuIERlZmF1bHQgaXMgMTAwLiBTZWUgPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMoKTwvY29kZT4gPC9saT4KKyAgICA8bGk+IE5ldyBjb21waWxlciBvcHRpb24gYWRkZWQgdG8gY29udHJvbCBtYXggbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGEgdW5pdC4gRGVmYXVsdCBpcyAxMDAuIFNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPgogICAgIDxwcmU+CiAJICogQ09NUElMRVIgLyBNYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBwZXIgY29tcGlsYXRpb24gdW5pdAogCSAqICAgIFNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGVhY2ggY29tcGlsYXRpb24gdW5pdC4KIAkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IgogCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJIiZsdDtuJmd0OyIgd2hlcmUgJmx0O24mZ3Q7IGlzIHplcm8gb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIChpZiB6ZXJvIHRoZW4gYWxsIHByb2JsZW1zIGFyZSByZXBvcnRlZCkuCiAJICogICAgIC0gZGVmYXVsdDoJCQkiMTAwIgotICAgIDwvcHJlPgorICAgIDwvcHJlPiA8L2xpPgogICAgIDxsaT5CeSBkZWZhdWx0LCB0aGUgSmF2YSBidWlsZGVyIGlzIG5vdyBhYm9ydGluZyBidWlsZCBwcm9jZXNzIG9uIHByb2plY3RzIHdpdGggY2xhc3NwYXRoIHByb2JsZW1zLiBUaGlzIG9wdGlvbiBjYW4gYmUgZGlzYWJsZWQgdGhyb3VnaCB0aGUgSmF2YSBwcmVmZXJlbmNlczoKICAgICBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtCdWlsZGVyJmd0OzwvbGk+CiA8L3VsPgpAQCAtNzczLDcgKzc3Myw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE0IC0gMTR0aCBNYXkgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ2CiA8aDI+CkBAIC04NDUsNyArODQ1LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MDcgLSA3dGggTWF5IDIwMDIgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0NQogPGgyPgpAQCAtOTYyLDcgKzk2Miw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDMwIC0gMzB0aCBBcHJpbCAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDMKIDxoMj4KQEAgLTExMjAsNyArMTEyMCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTA4LU01cGF0Y2giIC0gOHRoIE1heSAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDJiCiA8aDI+CkBAIC0xMTM0LDcgKzExMzQsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQyMyAtIDIzcmQgQXByaWwgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQyYQogPGgyPgpAQCAtMTIyMSw3ICsxMjIxLDcgQEAKIERCQ1M6IG5vIGVycm9yIG1lc3NhZ2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgaW4gamF2YSBzb3VyY2UgCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQxOCAtIDE4dGggQXByaWwgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQxYQogPGgyPgpAQCAtMTI4Miw3ICsxMjgyLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTYgLSAxNnRoIEFwcmlsIDIwMDIgLSBNSUxFU1RPTkUgNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDAKIDxoMj4KQEAgLTE0MjQsNyArMTQyNCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDExIC0gMTF0aCBBcHJpbCAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzkKIDxoMj4KQEAgLTE1MjUsNyArMTUyNSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDA5IC0gOXRoIEFwcmlsIDIwMDIgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzOGEKIDxoMj4KQEAgLTE2NjMsNyArMTY2Myw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDAyIC0gMm5kIEFwcmlsIDIwMDIgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNwogPGgyPgpAQCAtMTc0NSw3ICsxNzQ1LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MjYgLSAyNnRoIEFwcmlsIDIwMDIgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNgogPGgyPgpAQCAtMTc4OCw4ICsxNzg4LDggQEAKIDwvbGk+CQogPGxpPlNvbWUgaW50ZXJuYWwgY2xhc3NlcyBnb3QgZGVwcmVjYXRlZCAoYXMgY2xpZW50IGNvZGUgcmVsaWVzIG9uIHRoZW0pLCBzaW5jZSBiZWluZyBzdXJmYWNlZDoKIAk8dWw+Ci0JCTxsaT4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUucGFyc2VyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gPGJyPj09PiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb248L2NvZGU+IDwvbGk+Ci0JCTxsaT4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUucGFyc2VyLlRlcm1pbmFsU3ltYm9sczwvY29kZT4gPGJyPj09PiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzPC9jb2RlPiA8L2xpPgorCQk8bGk+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnBhcnNlci5JbnZhbGlkSW5wdXRFeGNlcHRpb248L2NvZGU+IDxicj49PSZndDsgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uPC9jb2RlPiA8L2xpPgorCQk8bGk+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnBhcnNlci5UZXJtaW5hbFN5bWJvbHM8L2NvZGU+IDxicj49PSZndDsgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczwvY29kZT4gPC9saT4KIAk8L3VsPgogCVRoZXkgd2lsbCBiZSByZW1vdmVkIGluIGEgc3Vic2VxdWVudCBidWlsZC4KIDwvdWw+CkBAIC0xODU2LDcgKzE4NTYsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMyMSAtIDIxc3QgTWFyY2ggMjAwMiAtIE1JTEVTVE9ORSA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNWEKIDxoMj4KQEAgLTE5MDMsNyArMTkwMyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzE5IC0gMTl0aCBNYXJjaCAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNAogPGgyPgpAQCAtMTkzNCw3ICsxOTM0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMTggLSAxOHRoIE1hcmNoIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjMzCiA8aDI+CkBAIC0xOTk2LDcgKzE5OTYsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxNCAtIDE0dGggTWFyY2ggMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzIKIDxoMj4KQEAgLTIwNDEsNyArMjA0MSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzEyIC0gMTJ0aCBNYXJjaCAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzMQogPGgyPgpAQCAtMjE4Niw3ICsyMTg2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMDUgLSA1dGggTWFyY2ggMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzAKIDxoMj4KQEAgLTIzMTksNyArMjMxOSw3IEBACiAgCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIyNiAtIDI2dGggRmVicnVhcnkgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjkKIDxoMj4KQEAgLTIzODQsNyArMjM4NCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjE0IC0gMTR0aCBGZWJydWFyeSAyMDAyIC0gTUlMRVNUT05FIDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI4CiA8aDI+CkBAIC0yNDIyLDcgKzI0MjIsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIxMiAtIDEydGggRmVicnVhcnkgMjAwCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNwogPGgyPgpAQCAtMjU5NCw3ICsyNTk0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAyMDUgLSA1dGggRmVicnVhcnkgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjYKIDxoMj4KQEAgLTI2NzUsNyArMjY3NSw3IEBACiBPdmVycmlkZW4gbWV0aG9kcyBpbnNlcnRlZCBwYXN0IHRoZSBlbmQgb2Ygc291cmNlCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEyOSAtIDI5dGggSmFudWFyeSAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNQogPGgyPgpAQCAtMjc0MSw3ICsyNzQxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMjQgLSAyNHRoIEphbnVhcnkgMjAwMiAtIE1JTEVTVE9ORSAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNAogPGgyPgpAQCAtMjc3NCw3ICsyNzc0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMjMgLSAyM3JkIEphbnVhcnkgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjMKIDxoMj4KQEAgLTI3OTcsNyArMjc5Nyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTIyIC0gMjJuZCBKYW51YXJ5IDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjIyCiA8aDI+CkBAIC0yODcxLDcgKzI4NzEsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDExNSAtIDE1dGggSmFudWFyeSAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMQogPGgyPgpAQCAtMjg4Niw3ICsyODg2LDcgQEAKICAgICAgYnV0IHRoZSBzdWJ0eXBlIChvZiB0aGUgbWlzc2luZyB0eXBlKSB3aWxsIGJlIGEgcm9vdCAodGhpcyBpcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgVkEvSmF2YSBhbmQgVkFNRS4pCiA8bGk+IEFkZGluZyBhIHR5cGUgdGhhdCB3YXMgbWlzc2luZyBmcm9tIGEgaGllcmFyY2h5IHdpbGwgdXBkYXRlIHRoZSBoaWVyYXJjaHkgY29ycmVjdGx5LgotPGxpPiBOZXcgQVBJIG9uIElDb21wbGV0aW9uUmVxdWVzdG9yIGZvciBzdWdnZXN0IGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uOjwvbGk+Cis8bGk+IE5ldyBBUEkgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IgZm9yIHN1Z2dlc3QgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb246CiA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDx0dD52b2lkIGFjY2VwdEFub255bW91c1R5cGUoPC90dD4KIDxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBzdXBlclR5cGVQYWNrYWdlTmFtZSw8L3R0PgogPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHN1cGVyVHlwZU5hbWUsPC90dD4KQEAgLTI4OTgsNiArMjg5OCw3IEBACiA8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LDwvdHQ+CiA8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7PC90dD4KIDxicj4mbmJzcDsKKzwvbGk+CiA8L3VsPgogCiA8aDM+CkBAIC0yOTk0LDcgKzI5OTUsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEwOCAtIDh0aCBKYW51YXJ5IDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjIwYQogPGgyPgpAQCAtMzIwMCw3ICszMjAxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMTggLSAxOHRoIERlY2VtYmVyIDIwMDEgLSBNSUxFU1RPTkUgMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTlhCiA8aDI+CkBAIC0zMjIxLDcgKzMyMjIsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTIxMSAtIDExdGggRGVjZW1iZXIgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTgKIDxoMj4KQEAgLTMzNDksNyArMzM1MCw3IEBACiAgICAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjA2IC0gMDZ0aCBEZWNlbWJlciAyMDAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxNwogPGgyPgpAQCAtMzM2OSw3ICszMzcwLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMDQgLSA0dGggRGVjZW1iZXIgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTZjCiA8aDI+CkBAIC0zNDI3LDcgKzM0MjgsNyBAQAogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIGluZGV4IG1lcmdpbmcKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMTI3IC0gMjd0aCBOb3ZlbWJlciAyMDAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxNWEKIDxoMj4KQEAgLTM0NDMsMTAgKzM0NDQsMTAgQEAKIDxsaT4KIE5ldyBBUEkgZm9yIHNldHRpbmcgYm90aCBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiBhdCB0aGUgc2FtZSB0aW1lCiAoYWxsb3dpbmcgdG8gYXZvaWQgY2xhc3NwYXRoIHZhbGlkYXRpb24gZmFpbHVyZXMgaW4gY2FzZSB0aGVyZSBpcyBubyB3YXkKLXRvIGNoYW5nZSBib3RoIGluZGVwZW5kYW50bHkpOjwvbGk+Cit0byBjaGFuZ2UgYm90aCBpbmRlcGVuZGFudGx5KToKIAogPGJyPjx0dD5JSmF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGgKLW5ld091dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC90dD48L3VsPgorbmV3T3V0cHV0TG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik8L3R0PjwvbGk+PC91bD4KIAogPGgzPgogUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KQEAgLTM1MDgsNyArMzUwOSw3IEBACiBCdWcgaW4gT2JqZWN0U2V0LkVudW1lcmF0aW9uLm5leHRFbGVtZW50CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTEyMCAtIDIwdGggTm92ZW1iZXIgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTMKIDxoMj4KQEAgLTM1NjMsNyArMzU2NCw3IEBACiBzdWIgZm9sZGVycyB3aXRoIGRvdCBub3QgdmlzaWJsZSBpbiBwYWNrYWdlcyB2aWV3ICgxR0NPSDE3KQogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMjAwMTExMTMgLSAxM3RoIE5vdmVtYmVyIDIwMDEKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjExYgogPGgyPgpAQCAtMzU4OSw3ICszNTkwLDcgQEAKIG1pc3NpbmcgZmllbGQgcmVmZXJlbmNlCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMiAtIDEydGggTm92ZW1iZXIgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTBfMDEKIDxoMj4KQEAgLTM2OTUsNyArMzY5Niw3IEBACiA8YnI+Jm5ic3A7CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTAyNSAtIDI1dGggT2N0b2JlciAyMDAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIwNgogPGgyPgpAQCAtMzc1NSw3ICszNzU2LDcgQEAKIDxicj4mbmJzcDsKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMDE4IC0gMTh0aCBPY3RvYmVyIDIwMDEKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjA1CiA8aDI+CkBAIC0zNzYzLDcgKzM3NjQsNyBAQAogCiA8dWw+CiA8bGk+Ci1Db2RlQXNzaXN0IHByb3ZpZGVzIHZhcmlhYmxlIG5hbWUgc3VnZ2VzdGlvbnMuPC9saT4KK0NvZGVBc3Npc3QgcHJvdmlkZXMgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucy4KIAogPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAoYnJlYWtpbmcpIEFQSSBDaGFuZ2VzIG9uIDx0dD5JQ29tcGxldGlvblJlcXVlc3RvcjwvdHQ+CiA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPis8L2I+IDx1PkFkZGVkPC91PiBBUEkgZm9yIHN1Z2dlc3QgdmFyaWFibGUgbmFtZToKQEAgLTM3NzUsMTAgKzM3NzYsMTEgQEAKIDxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBjb21wbGV0aW9uU3RhcnQsPC90dD4KIDxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBjb21wbGV0aW9uRW5kKTs8L3R0PgogPGJyPiZuYnNwOworPC9saT4KIDxsaT4KLUhlbHBlciBtZXRob2QgZm9yIGNvbXB1dGluZyBhIHJlc29sdmVkIGFuZCBleHBhbmRlZCBwYXRoIChhbGwgZXhwb3J0cyBmcm9tCis8cD5IZWxwZXIgbWV0aG9kIGZvciBjb21wdXRpbmcgYSByZXNvbHZlZCBhbmQgZXhwYW5kZWQgcGF0aCAoYWxsIGV4cG9ydHMgZnJvbQogcHJlcmVxdWlzaXRlcykgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gMjA0LCBnb3QgPHU+cmVtb3ZlZDwvdT4uIFRoaXMgaXMKLW5vdCBhbiBBUEkgY2hhbmdlLCBpdCBuZXZlciBtYWRlIGl0IG91dCBvZmZpY2lhbGx5LjwvbGk+Citub3QgYW4gQVBJIGNoYW5nZSwgaXQgbmV2ZXIgbWFkZSBpdCBvdXQgb2ZmaWNpYWxseS48L3A+CiAKIDxicj4mbmJzcDsmbmJzcDsgPGI+LTwvYj4gPHR0PklKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKTwvdHQ+CiA8cD48dHQ+U2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L3R0PiBoYXMgYmVlbiBkZXByZWNhdGVkLgpAQCAtMzc4OCw3ICszNzkwLDcgQEAKIGVsZW1lbnRzIHRoYXQgZGlkbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlc291cmNlIChlLmcuIGV4dGVybmFsIGphcnMpLgogVGhpcyBkZXByZWNhdGVkIEFQSSdzIGJlaGF2aW9yIGhhcyBhbHNvIHJldmVydGVkIHRvIHRoZSAxLjAgc3RhdGUgZm9yIGJhY2t3YXJkCiBjb21wYXRpYmlsaXR5LiBUaGUgc3BlY2lmaWNhdGlvbiBvZiA8dHQ+Y3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKTwvdHQ+Ci1pcyBhcyBmb2xsb3dzOgoraXMgYXMgZm9sbG93czo8L3A+CiA8dWw+CiA8bGk+CiBJZiBhbiBlbGVtZW50IGlzIGFuIDx0dD5JSmF2YVByb2plY3Q8L3R0PiwgdGhlbiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXJzLApAQCAtMzgwMyw3ICszODA1LDcgQEAKIElmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklQYWNrYWdlRnJhZ21lbnQ8L3R0PiwgdGhlbiBvbmx5IHRoZSBjb21waWxhdGlvbgogdW5pdCBhbmQgY2xhc3MgZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzCiB3aWxsIE5PVCBiZSBpbmNsdWRlZC48L2xpPgotPC91bD4KKzwvdWw+PC9saT4KIDwvdWw+CiAKIDxoMz4KQEAgLTM4NzIsNyArMzg3NCw3IEBACiA8YnI+Jm5ic3A7CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTAxMSAtIE9jdG9iZXIgMTF0aCwgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDQKIDxoMj4KQEAgLTM4ODUsMTAgKzM4ODcsMTAgQEAKIGFsb25nIHdpdGggaXRzIG91dHB1dCBsb2NhdGlvbi48L2xpPgogCiA8bGk+Ci1BZGRlZCBBUElzOjwvbGk+CitBZGRlZCBBUElzOgogCiA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRlc3Rpbmcgc3RhdHVzIG9mIGEgZ2l2ZW4gZW50cnkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKyBJQ2xhc3NwYXRoRW50cnkuaXNFeHBvcnRlZCgpPC91bD4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgKyBJQ2xhc3NwYXRoRW50cnkuaXNFeHBvcnRlZCgpPC9saT48L3VsPgogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IENyZWF0aW5nCiBlbnRyaWVzIHdpdGggZXhwb3J0IGZsYWcKIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQEAgLTM5MDcsNyArMzkwOSw3IEBACiBhbWJpZ3VpdGllcy48L2xpPgogCiA8bGk+Ci1Db2RlQXNzaXN0IHByb3ZpZGVzIHBhcmFtZXRlciBuYW1lcyBvbiBtZXRob2QgY29tcGxldGlvbnMuPC9saT4KK0NvZGVBc3Npc3QgcHJvdmlkZXMgcGFyYW1ldGVyIG5hbWVzIG9uIG1ldGhvZCBjb21wbGV0aW9ucy4KIAogPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBBUEkgQ2hhbmdlcyBvbiBJQ29tcGxldGlvblJlcXVlc3RvcgogPGJyPiZuYnNwOyZuYnNwOyArIEFkZGVkIEFQSSBmb3IgYW5zd2VyaW5nIG1ldGhvZCBkZWNsYXJhdGlvbiBjb21wbGV0aW9uczoKQEAgLTM5NDEsMTMgKzM5NDMsMTQgQEAKIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCwKIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOwogPGJyPiZuYnNwOworPC9saT4KIDxsaT4KIENvZGVBc3Npc3Qgb3B0aW9uYWxseSBwZXJmb3JtcyB2aXNpYmlsaXR5IGNoZWNrcyAoc2VlIEphdmFDb3JlIG9wdGlvbjoKICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIikuPC9saT4KIAogPGxpPgogU2VhcmNoIGZvciBmaWVsZCByZWFkIGFuZCBmaWVsZCB3cml0ZSByZWZlcmVuY2VzLiBUd28gbmV3IGNvbnN0YW50cyBoYXZlCi1iZWVuIGFkZGVkPC9saT4KK2JlZW4gYWRkZWQKIAogPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvbiBJSmF2YVNlYXJjaENvbnN0YW50cyB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcKIGEgZmllbGQgcmVmZXJlbmNlIHNlYXJjaCBwYXR0ZXJuOgpAQCAtMzk1NywxMyArMzk2MCwxMyBAQAogd3JpdGUgYWNjZXNzIHRvIGEgZmllbGQuCiA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IE5vdGUgdGhhdCBpZiBSRUZFUkVOQ0VTIGlzIHVzZWQsIHRoZW4gc2VhcmNoIHJlc3VsdHMKIGNvbnRhaW4gYm90aCByZWFkIGFuZCB3cml0ZQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBhY2Nlc3NzIHRvIGEgZmllbGQuCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFjY2Vzc3MgdG8gYSBmaWVsZC48L2xpPgogPGxpPgotT3Blbk9uU2VsZWN0aW9uIGNhbiBub3cgbG9jYXRlIHNlbGVjdGVkIGRlY2xhcmF0aW9ucyB3aGljaCBoYXZlIGEgY29ycmVzcG9uZGluZzwvbGk+CitPcGVuT25TZWxlY3Rpb24gY2FuIG5vdyBsb2NhdGUgc2VsZWN0ZWQgZGVjbGFyYXRpb25zIHdoaWNoIGhhdmUgYSBjb3JyZXNwb25kaW5nCiAKIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsgSmF2YSBlbGVtZW50IChpLmUuIG5vIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGZvdW5kKSwKIGFuZCBpcyBtb3JlIHRvbGVyYW50IG9mCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGluY29ycmVjdCBjb2RlLjwvdWw+Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGluY29ycmVjdCBjb2RlLjwvbGk+PC91bD4KIAogPGgyPgogUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMj4KQEAgLTQwOTcsNyArNDEwMCw3IEBACiA8YnI+Jm5ic3A7IDFHOThYUjc6IElUUEpDT1JFOldJTjIwMDAgLSBGZWF0dXJlIFJlcXVlc3QgZm9yIEphdmFEb2MgQ29kZUFzc2lzdAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgQnVpbGQgMC4yMDIgLSBTcGV0ZW1iZXIgMjd0aCwgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDIKIDxoMj4KQEAgLTQxMDUsMTEgKzQxMDgsMTEgQEAKIAogPHVsPgogPGxpPgotTmV3IEFTVCBub2RlIGZvciBlbXB0eSBzdGF0ZW1lbnRzIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkVtcHR5U3RhdGVtZW50KTwvbGk+CitOZXcgQVNUIG5vZGUgZm9yIGVtcHR5IHN0YXRlbWVudHMgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRW1wdHlTdGF0ZW1lbnQpCiAKIDxicj4mbmJzcDsmbmJzcDsgaS5lLiAyIG1vcmUgQVBJcyBvbiB0aGUgQVNUIHZpc2l0b3IuIE5vdGU6IHRoaXMgd2FzIG5vdAogYW4gb2ZmaWNpYWwgQVBJCi08bGk+Cis8L2xpPjxsaT4KIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yIG5vdGlmaWVzIGVudGVyL2V4aXQgaW5pdGlhbGl6ZXJzIGluc3RlYWQgb2YganVzdAogYWNjZXB0SW5pdGlhbGl6ZXIuIE5vdGU6IHRoaXMgd2FzIG5vdCBhbiBvZmZpY2lhbCBBUEk8L2xpPgogCkBAIC00MTE4LDE2ICs0MTIxLDE2IEBACiBvbiBzdGFydC11cC48L2xpPgogCiA8bGk+Ci0mbmJzcDsgUmVtb3ZlZCBDb2RlQXNzaXN0IG9wdGlvbiBmb3IgaHVuZ3J5IG1vZGUgKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5lbnRpcmVXb3JkUmVwbGFjZW1lbnQpPC9saT4KKyZuYnNwOyBSZW1vdmVkIENvZGVBc3Npc3Qgb3B0aW9uIGZvciBodW5ncnkgbW9kZSAob3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmVudGlyZVdvcmRSZXBsYWNlbWVudCkKIAogPGJyPiZuYnNwOyZuYnNwOyBDbGllbnQgY29kZSBjYW4gZGVjaWRlIHdoZXRoZXIgdXNpbmcgaW5mZXJyZWQgZW5kIHBvc2l0aW9uCiAoaHVuZ3J5IGJlaGF2aW9yKSBvciBvcmlnaW5hbCBjdXJzb3IgbG9jYXRpb24gKGluc2VydCBiZWhhdmlvcikKLTxicj4mbmJzcDsmbmJzcDsgYmFzZWQgb24gdGhlIGtleXN0cm9rZSAoZW50ZXIvaW5zZXJ0PykuCis8YnI+Jm5ic3A7Jm5ic3A7IGJhc2VkIG9uIHRoZSBrZXlzdHJva2UgKGVudGVyL2luc2VydD8pLjwvbGk+CiA8bGk+CiAmbmJzcDsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIG5vdyBjbGVhcmx5Ci1zdGF0ZXMgdGhhdDwvbGk+CitzdGF0ZXMgdGhhdAogCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSBvcmRlciBvZiB0aGUgc2VhcmNoIHJlc3VsdCBpcyB1bnNwZWNpZmllZC48L3VsPgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgb3JkZXIgb2YgdGhlIHNlYXJjaCByZXN1bHQgaXMgdW5zcGVjaWZpZWQuPC9saT48L3VsPgogCiA8aDI+CiBQcm9ibGVtIHJlcG9ydHMgZml4ZWQ8L2gyPgpAQCAtNDIxMSw3ICs0MjE0LDcgQEAKIDxicj4mbmJzcDsgMUZXOE5WNjogSVRQSkNPUkU6QUxMIC0gRENSIC0gSk0gLSBOZWVkIEFQSSBmb3IgY29tcGlsZXIgb3B0aW9ucwogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogQnVpbGQgMC4yMDAgLSBTZXB0ZW1iZXIgMTN0aCwgMjAwMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDAKIDxoMj4KQEAgLTQyMjIsNyArNDIyNSw3IEBACiBKQ0sxLjNhIGNvbXBsaWFudC48L2xpPgogCiA8bGk+Ci1BZGRlZCAyIG5ldyBBUElzIG9uIEphdmFDb252ZW50aW9ucyBmb3IgY2xhc3NwYXRoIHZhbGlkYXRpb24uPC9saT4KK0FkZGVkIDIgbmV3IEFQSXMgb24gSmF2YUNvbnZlbnRpb25zIGZvciBjbGFzc3BhdGggdmFsaWRhdGlvbi4KIAogPHVsPgogPGxpPgpAQCAtNDIzMyw3ICs0MjM2LDcgQEAKIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5CiBlbnRyeSwgYm9vbGVhbiBjaGVja1NvdXJjZUF0dGFjaG1lbnQpPC9saT4KIDwvdWw+Ci0KKzwvbGk+CiA8bGk+CiBBbnQgRWNsaXBzZSBjb21waWxlciB0YXNrIGFkZGVkIChvcmcuZWNsaXBzZS5qZHQuY29yZS5hbnQuSmR0Y29tKTwvbGk+CiAKQEAgLTQyNDMsNyArNDI0Niw3IEBACiAKIDxsaT4KIE1vcmUgb3B0aW9ucyBhcmUgc3VyZmFjZWQgb24gSmF2YUNvcmUuIFNlZSBKYXZhQ29yZS5nZXREZWZhdWx0T3B0aW9ucygpCi1mb3IgZGVzY3JpcHRpb24uPC9saT4KK2ZvciBkZXNjcmlwdGlvbi4KIAogPHVsPgogPGxpPgpAQCAtNDI1Miw3ICs0MjU1LDcgQEAKIDxsaT4KIEV2YWx1YXRpb24gaW4gYmluYXJpZXMgaXMgZnVuY3Rpb25hbDwvbGk+CiA8L3VsPgotCis8L2xpPgogPGxpPgogU2VhcmNoIGZvciByZWZlcmVuY2VzIG5vdyBmaW5kcyByZXN1bHRzIGluIGJpbmFyaWVzLiBJbmRleGVzIGluIG9sZCB3b3Jrc3BhY2VzCiBhcmUgcmVjb21wdXRlZCB3aGVuIHJlc3RhcnRlZCB3aGljaCBtYXkgcmVzdWx0IGluIGxvbmdlciBzdGFydHVwIHRpbWVzLjwvbGk+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMjFfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIxX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAppbmRleCA4YzViNmQ1Li5jZmFmN2IzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMjFfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IyMV9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTE2LDcgKzE2LDcgQEAKICAgPC90cj4KICAgPHRyPgogCSAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj4KLQkgIAkgIDxmb250IHNpemU9Ii0yIiBjb2xvcj0iIzgwODBmZiI+amF2YSBkZXZlbG9wbWVudCB0b29saW5nIGNvcmU8L2ZvbnQ+CisJICAJICA8Zm9udCBzaXplPSItMiIgY29sb3I9IiM4MDgwZmYiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD4KIAkgIDwvdGQ+CiAgIDwvdHI+CiAJPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CkBAIC0zNSw3ICszNSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI3dGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMTEgLSAyLjEgUkVMRUFTRSAoUjJfMSkKIDxoMj4KQEAgLTYzLDcgKzYzLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjZ0aCBNYXJjaCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMxMAogPGgyPgpAQCAtODEsNyArODEsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyNXRoIE1hcmNoIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzA5CiA8aDI+CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjB0aCBNYXJjaCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwOCAtIDIuMSBSRUxFQVNFIENBTkRJREFURSAzYQogPGgyPgpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE5dGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDcgLSAyLjEgUkVMRUFTRSBDQU5ESURBVEUgMwogPGgyPgpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE4dGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDYgCiA8aDI+CkBAIC0xOTMsNyArMTkzLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTN0aCBNYXJjaCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwNQogPGgyPgpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDExdGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDQKIDxoMj4KQEAgLTI2NSw3ICsyNjUsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSA2dGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDMgLSAyLjEgUkVMRUFTRSBDQU5ESURBVEUgMgogPGgyPgpAQCAtMzEyLDcgKzMxMiw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDR0aCBNYXJjaCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwMmEKIDxoMj4KQEAgLTMzMCw3ICszMzAsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSA0dGggTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDIKIDxoMj4KQEAgLTQxMyw3ICs0MTMsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyN3RoIEZlYnJ1YXJ5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzAxCiA8aDI+CkBAIC00NzcsNyArNDc3LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjFzdCBGZWJydWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwMCAtIDIuMSBSRUxFQVNFIENBTkRJREFURSAxCiA8aDI+CkBAIC01MDEsNyArNTAxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjB0aCBGZWJydWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5OQogPGgyPgpAQCAtNTg0LDcgKzU4NCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE4dGggRmVicnVhcnkgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTgKIDxoMj4KQEAgLTcxNCw3ICs3MTQsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxM3RoIEZlYnJ1YXJ5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjk3CiA8aDI+CkBAIC03NTYsNyArNzU2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTF0aCBGZWJydWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5NgogPGgyPgpAQCAtODAyLDcgKzgwMiw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDZ0aCBGZWJydWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5NSAtIDIuMSBNSUxFU1RPTkUtNSAoYWthIDIuMSBSRUxFQVNFIENBTkRJREFURSAwKQogPGgyPgpAQCAtODI2LDcgKzgyNiw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDV0aCBGZWJydWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5NAogPGgyPgpAQCAtODM4LDcgKzgzOCw3IEBACiBzdWl0YWJsZSByZWNvdmVyeSBhY3Rpb25zIGZvciB0aGVzZS4KIDwvbGk+CiA8bGk+IFByb2plY3QgY3ljbGVzIGNhbiBub3cgYmUgYnVpbHQgYXMgc29vbiBhcyB0aGUgY29tcGlsZXIgc2V2ZXJpdHkgZm9yIGNpcmN1bGFyCi1kZXBlbmRlbmNpZXMgaXMgbG93ZXJlZCB0byBhIHdhcm5pbmcgKHNlZSBQcmVmZXJlbmNlcz5KYXZhPkNvbXBpbGVyPk90aGVyPkNpcmN1bGFyIGRlcGVuZGVuY2llcz5XYXJuaW5nKS4KK2RlcGVuZGVuY2llcyBpcyBsb3dlcmVkIHRvIGEgd2FybmluZyAoc2VlIFByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29tcGlsZXImZ3Q7T3RoZXImZ3Q7Q2lyY3VsYXIgZGVwZW5kZW5jaWVzJmd0O1dhcm5pbmcpLgogPC9saT4KIDxsaT4gU3VyZmFjZWQgY29tcGlsZXIgb3B0aW9ucyBmb3IgcmVwb3J0aW5nIHVzYWdlIG9mIGNoYXJbXSBpbiBTdHJpbmcgY29uY2F0ZW5hdGlvbnMgKGRlZmF1bHQgaXMgc3RpbGwgd2FybmluZykuCiA8cHJlPgpAQCAtOTgzLDcgKzk4Myw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI4dGggSmFudWFyeSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5MwogPGgyPgpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjFzdCBKYW51YXJ5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjkyYQogPGgyPgpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjFzdCBKYW51YXJ5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjkyCiA8aDI+CkBAIC0xMjk1LDcgKzEyOTUsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxNXRoIEphbnVhcnkgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTFhCiA8aDI+CkBAIC0xMzExLDcgKzEzMTEsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxNHRoIEphbnVhcnkgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTEKIDxoMj4KQEAgLTEzNDEsNyArMTM0MSw3IEBACiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1MzEiPjI4NTMxPC9hPgogQ2xhc3NwYXRoIEVudHJ5OiBPdXRwdXQgZm9sZGVyIGNhbiBub3QgYmUgc2V0IHRvIHByb2plY3QgCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4MjQiPjI4ODI0PC9hPgotUXVpY2sgRml4OiBUeXBlIE1pc21hdGNoIC0+IENhc3QgYnVnIFtxdWljayBmaXhdCitRdWljayBGaXg6IFR5cGUgTWlzbWF0Y2ggLSZndDsgQ2FzdCBidWcgW3F1aWNrIGZpeF0KIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODU5OSI+Mjg1OTk8L2E+CiB2YWxpZGF0ZUNsYXNzcGF0aCByZW5kZXJpbmcgb2YgcGF0aHMgCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwNzkiPjI5MDc5PC9hPgpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTd0aCBEZWNlbWJlciAyMDAyIC0gMi4xIE1JTEVTVE9ORS00CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5MAogPGgyPgpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTZ0aCBEZWNlbWJlciAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4OQogPGgyPgpAQCAtMTU3MSw3ICsxNTcxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTN0aCBEZWNlbWJlciAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4OAogPGgyPgpAQCAtMTYxNSw3ICsxNjE1LDcgQEAKICAgCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMXRoIERlY2VtYmVyIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjg3YQogPGgyPgpAQCAtMTYzMSw3ICsxNjMxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTB0aCBEZWNlbWJlciAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODcKIDxoMj4KQEAgLTE3NzIsNyArMTc3Miw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDNyZCBEZWNlbWJlciAyMDAyIAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODYKIDxoMj4KQEAgLTE4NDUsNyArMTg0NSw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI2dGggTm92ZW1iZXIgMjAwMiAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjg1CiA8aDI+CkBAIC0yMDQyLDcgKzIwNDIsNyBAQAogICAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE0dGggTm92ZW1iZXIgMjAwMiAtIDIuMSBNSUxFU1RPTkUtMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODQKIDxoMj4KQEAgLTIwNTgsNyArMjA1OCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDEzdGggTm92ZW1iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODMKIDxoMj4KQEAgLTIwODIsNyArMjA4Miw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDEydGggTm92ZW1iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODJiCiA8aDI+CkBAIC0yMjE5LDcgKzIyMTksNyBAQAogICAgCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSA1dGggTm92ZW1iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODEKIDxoMj4KQEAgLTIyOTYsNyArMjI5Niw3IEBACiAgICAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI5dGggT2N0b2JlciAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4MAogPGgyPgpAQCAtMjM4OCw3ICsyMzg4LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjNyZCBPY3RvYmVyIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjc5YQogPGgyPgpAQCAtMjQwNCw3ICsyNDA0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjJuZCBPY3RvYmVyIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjc5CiA8aDI+CkBAIC0yNDg0LDcgKzI0ODQsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxNXRoIE9jdG9iZXIgMjAwMiAtIDIuMSBNSUxFU1RPTkUtMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzgKIDxoMj4KQEAgLTI1MTQsNyArMjUxNCw3IEBACiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4MTIiPjIzODEyPC9hPiAgCiBDb25maWd1cmFibGUgKFRPRE8pIE1hcmtlcnMgcHJpb3JpdHkgaW4gdGFrc2xpc3QgIAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODQwIj4yMjg0MDwvYT4gIAotUmVmYWN0b3ItPk1vdmUgZG9lc24ndCB1cGRhdGUgTG9jYWwgSGlzdG9yeSAgCitSZWZhY3Rvci0mZ3Q7TW92ZSBkb2Vzbid0IHVwZGF0ZSBMb2NhbCBIaXN0b3J5ICAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY4NSI+MjQ2ODU8L2E+ICAKIElubmVyIHBhY2thZ2UgZnJhZ21lbnRzIGdldHMgZGVsZXRlZCAtIG1vZGVsIG91dCBvZiBzeW5jaCAgCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0OTgiPjI0NDk4PC9hPiAgCkBAIC0yNTU4LDcgKzI1NTgsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIzIj4yNDYyMzwvYT4KIEFTVDogTm8gbWV0aG9kIGJvZHkgd2hlbiBhYnN0cmFjdCBtb2RpZmllciBpcyBleGlzdGluZwogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTU4Ij4yNDU1ODwvYT4KLWNvbXBpbGVyIGVycm9yLCBtZXRob2QgZGVjbGFyYXRpb24gaW4gaW50ZXJmYWNlIC0+IE51bGxQb2ludGVyRXhjZXB0aW9uCitjb21waWxlciBlcnJvciwgbWV0aG9kIGRlY2xhcmF0aW9uIGluIGludGVyZmFjZSAtJmd0OyBOdWxsUG9pbnRlckV4Y2VwdGlvbgogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIxIj4yNDYyMTwvYT4KIENhbm5vdCBzcGVjaWZpZWQgSlJFIGZvciBlYWNoIHByb2plY3Qgc2VwYXJlbHkgLi4uCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2MDAiPjI0NjAwPC9hPgpAQCAtMjU3Niw3ICsyNTc2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gOHRoIE9jdG9iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzcKIDxoMj4KQEAgLTI2NTgsNyArMjY1OCw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDFzdCBPY3RvYmVyIDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjc2CiA8aDI+CkBAIC0yNzA4LDcgKzI3MDgsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyNnRoIFNlcHRlbWJlciAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3NQogPGgyPgpAQCAtMjcyNCw3ICsyNzI0LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjR0aCBTZXB0ZW1iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzQKIDxoMj4KQEAgLTI3NDIsOSArMjc0Miw5IEBACiAJLyoqCiAJICogSGVscGVyIG1ldGhvZCBmb3IgcmV0dXJuaW5nIG9uZSBvcHRpb24gdmFsdWUgb25seS4gRXF1aXZhbGVudCB0byA8Y29kZT4oU3RyaW5nKXRoaXMuZ2V0T3B0aW9ucyhpbmhlcml0SmF2YUNvcmVPcHRpb25zKS5nZXQob3B0aW9uTmFtZSk8L2NvZGU+CiAJICogTm90ZSB0aGF0IGl0IG1heSBhbnN3ZXIgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcHRpb24gZG9lcyBub3QgZXhpc3QsIG9yIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSB2YWx1ZSBmb3IgaXQuCi0JICogPHA+CisJICogCiAJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgotCSAqIDwvcD4KKwkgKiAKIAkgKiBAcGFyYW0gb3B0aW9uTmFtZSB0aGUgbmFtZSBvZiBhbiBvcHRpb24KIAkgKiBAcGFyYW0gaW5oZXJpdEphdmFDb3JlT3B0aW9ucyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIEphdmFDb3JlIG9wdGlvbnMgc2hvdWxkIGJlIGluaGVyaXRlZCBhcyB3ZWxsCiAJICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIGEgZ2l2ZW4gb3B0aW9uCkBAIC0yNzYwLDkgKzI3NjAsOSBAQAogCSAqIFJldHVybnMgdGhlIHRhYmxlIG9mIHRoZSBjdXJyZW50IGN1c3RvbSBvcHRpb25zIGZvciB0aGlzIHByb2plY3QuIFByb2plY3RzIHJlbWVtYmVyIHRoZWlyIGN1c3RvbSBvcHRpb25zLAogCSAqIGkuZS4gb25seSB0aGUgb3B0aW9ucyBkaWZmZXJlbnQgZnJvbSB0aGUgdGhlIEphdmFDb3JlIGdsb2JhbCBvcHRpb25zIGZvciB0aGUgd29ya3NwYWNlLgogCSAqIEEgYm9vbGVhbiBhcmd1bWVudCBhbGxvd3MgdG8gZGlyZWN0bHkgbWVyZ2UgdGhlIHByb2plY3Qgb3B0aW9ucyB3aXRoIGdsb2JhbCBvbmVzIGZyb20gPGNvZGU+SmF2YUNvcmU8L2NvZGU+LgotCSAqIDxwPgorCSAqIAogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLQkgKiA8L3A+CisJICogCiAJICogCiAJICogQHBhcmFtIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBKYXZhQ29yZSBvcHRpb25zIHNob3VsZCBiZSBpbmhlcml0ZWQgYXMgd2VsbAogCSAqIEByZXR1cm4gdGFibGUgb2YgY3VycmVudCBzZXR0aW5ncyBvZiBhbGwgb3B0aW9ucyAKQEAgLTI3NzksOSArMjc3OSw5IEBACiAJICogU2V0cyB0aGUgcHJvamVjdCBjdXN0b20gb3B0aW9ucy4gQWxsIGFuZCBvbmx5IHRoZSBvcHRpb25zIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIHRhYmxlIAogCSAqIGFyZSByZW1lbWJlcmVkOyBhbGwgcHJldmlvdXMgb3B0aW9uIHNldHRpbmdzIGFyZSBmb3Jnb3R0ZW4sIGluY2x1ZGluZyBvbmVzIG5vdCBleHBsaWNpdGx5CiAJICogbWVudGlvbmVkLgotCSAqIDxwPgorCSAqIAogCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KLQkgKiA8L3A+CisJICogCiAJICogCiAJICogQHBhcmFtIG5ld09wdGlvbnMgdGhlIG5ldyBvcHRpb25zIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPiksCiAJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBmbHVzaCBhbGwgY3VzdG9tIG9wdGlvbnMgKGNsaWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZ2xvYmFsIEphdmFDb3JlIG9wdGlvbnMpLgpAQCAtMjg2OSw3ICsyODY5LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTl0aCBTZXB0ZW1iZXIgMjAwMiAtIDIuMSBNSUxFU1RPTkUtMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzNhCiA8aDI+CkBAIC0yODg3LDcgKzI4ODcsNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxNnRoIFNlcHRlbWJlciAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3MwogPGgyPgpAQCAtMjk0Niw3ICsyOTQ2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTB0aCBTZXB0ZW1iZXIgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzIKIDxoMj4KQEAgLTMxMjMsNyArMzEyMyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMCBCdWlsZCAtIDFzdCBBdWd1c3QgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzAKIDxoMj4KQEAgLTMxNDcsNyArMzE0Nyw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDMwdGggSnVseSAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2OQogPGgyPgpAQCAtMzE4Niw3ICszMTg2LDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4wIEJ1aWxkIC0gMjNyZCBKdWx5IDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjY4CiA8aDI+CkBAIC0zMjE5LDcgKzMyMTksNyBAQAogCiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyMm5kIEp1bHkgMjAwMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjcKIDxoMj4KQEAgLTMyNDMsNyArMzI0Myw3IEBACiAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDIuMCBCdWlsZCAtIDE1dGggSnVseSAyMDAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2NgogPGgyPgpAQCAtMzI2MSw3ICszMjYxLDcgQEAKIAogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTJ0aCBKdWx5IDIwMDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjY1CiA8aDI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzBfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjMwX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAppbmRleCBhMDdjZjljLi5jYzk4NWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzBfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMF9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTE2LDcgKzE2LDcgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+Ci0JCTxmb250IHNpemU9Ii0yIiBjb2xvcj0iIzgwODBmZiI+amF2YSBkZXZlbG9wbWVudCB0b29saW5nIGNvcmU8L2ZvbnQ+CisJCTxmb250IHNpemU9Ii0yIiBjb2xvcj0iIzgwODBmZiI+SmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9mb250PgogCTwvdGQ+CiAgIDwvdHI+CiAJPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CkBAIC0zNyw3ICszNyw3IEBACiA8YSBuYW1lPSJ2XzQ0OSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wUkM0IEJ1aWxkIC0gMjR0aCBKdW5lIDIwMDQgLSAzLjAgUkVMRUFTRSBDQU5ESURBVEUgNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQ5Ij5jdnM8L2E+KS4KQEAgLTU0LDcgKzU0LDcgQEAKIDxhIG5hbWU9InZfNDQ4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzQgQnVpbGQgLSAyNHRoIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQ4Ij5jdnM8L2E+KS4KQEAgLTY5LDcgKzY5LDcgQEAKIDxhIG5hbWU9InZfNDQ3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzQgQnVpbGQgLSAyM3JkIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQ3Ij5jdnM8L2E+KS4KQEAgLTg0LDcgKzg0LDcgQEAKIDxhIG5hbWU9InZfNDQ2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzQgQnVpbGQgLSAyMm5kIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQ2Ij5jdnM8L2E+KS4KQEAgLTEwMCw3ICsxMDAsNyBAQAogPGEgbmFtZT0idl80NDUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMFJDMyBCdWlsZCAtIDE4dGggSnVuZSAyMDA0IC0gMy4wIFJFTEVBU0UgQ0FORElEQVRFIDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDQ1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQ0NSI+Y3ZzPC9hPikuCkBAIC0xMTYsNyArMTE2LDcgQEAKIDxhIG5hbWU9InZfNDQ0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzMgQnVpbGQgLSAxOHRoIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQ0Ij5jdnM8L2E+KS4KQEAgLTEzNCw3ICsxMzQsNyBAQAogPGEgbmFtZT0idl80NDMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMFJDMyBCdWlsZCAtIDE4dGggSnVuZSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQ0MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80NDMiPmN2czwvYT4pLgpAQCAtMTUwLDcgKzE1MCw3IEBACiA8YSBuYW1lPSJ2XzQ0MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wUkMzIEJ1aWxkIC0gMTd0aCBKdW5lIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDQyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQ0MiI+Y3ZzPC9hPikuCkBAIC0xNzAsNyArMTcwLDcgQEAKIDxhIG5hbWU9InZfNDQxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzMgQnVpbGQgLSAxNnRoIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80NDEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDQxIj5jdnM8L2E+KS4KQEAgLTE5Niw3ICsxOTYsNyBAQAogPGEgbmFtZT0idl80NDAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMFJDMiBCdWlsZCAtIDEwdGggSnVuZSAyMDA0IC0gMy4wIFJFTEVBU0UgQ0FORElEQVRFIDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDQwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQ0MCI+Y3ZzPC9hPikuCkBAIC0yMTQsNyArMjE0LDcgQEAKIDxhIG5hbWU9InZfNDM5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzIgQnVpbGQgLSAxMHRoIEp1bmUgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MzkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDM5Ij5jdnM8L2E+KS4KQEAgLTIzNiw3ICsyMzYsNyBAQAogPGEgbmFtZT0idl80MzgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMFJDMiBCdWlsZCAtIDl0aCBKdW5lIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDM4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQzOCI+Y3ZzPC9hPikuCkBAIC0yNjIsNyArMjYyLDcgQEAKIDxhIG5hbWU9InZfNDM3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBSQzIgQnVpbGQgLSA4dGggSnVuZSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQzNwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MzciPmN2czwvYT4pLgpAQCAtMzEwLDcgKzMxMCw3IEBACiA8YSBuYW1lPSJ2XzQzNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wUkMxIEJ1aWxkIC0gMjh0aCBNYXkgMjAwNCAtIDMuMCBSRUxFQVNFIENBTkRJREFURSAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQzNgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MzYiPmN2czwvYT4pLgpAQCAtMzQ4LDcgKzM0OCw3IEBACiA8YSBuYW1lPSJ2XzQzNSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wUkMxIEJ1aWxkIC0gMjd0aCBNYXkgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MzUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDM1Ij5jdnM8L2E+KS4KQEAgLTM4MCw3ICszODAsNyBAQAogPGEgbmFtZT0idl80MzQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMFJDMSBCdWlsZCAtIDI2dGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDM0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQzNCI+Y3ZzPC9hPikuCkBAIC00MzUsMzIgKzQzNSwzMiBAQAogPGEgbmFtZT0idl80MzMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME05IEJ1aWxkIC0gMjFzdCBNYXkgMjAwNCAtIDMuMCBNSUxFU1RPTkUtOSAvIDMuMCBSRUxFQVNFIENBTkRJREFURSAwCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQzMwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MzMiPmN2czwvYT4pLgogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPlB1dCBiYWNrIHRlc3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuSmF2YUVsZW1lbnREZWx0YVRlc3RzLnRlc3RCdWlsZFByb2plY3RVc2VkQXNMaWIoKQotYWZ0ZXIgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyOTI3Ij42MjkyNzwvYT4gd2FzIGZpeGVkLgorPHVsPjxsaT5QdXQgYmFjayB0ZXN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLkphdmFFbGVtZW50RGVsdGFUZXN0cy50ZXN0QnVpbGRQcm9qZWN0VXNlZEFzTGliKCkKK2FmdGVyIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjkyNyI+NjI5Mjc8L2E+IHdhcyBmaXhlZC48L2xpPgogPC91bD4KIAogPGEgbmFtZT0idl80MzIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME05IEJ1aWxkIC0gMjB0aCBNYXkgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MzIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDMyIj5jdnM8L2E+KS4KIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD5FeGNsdWRlZCB0ZXN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLkphdmFFbGVtZW50RGVsdGFUZXN0cy50ZXN0QnVpbGRQcm9qZWN0VXNlZEFzTGliKCkKKzx1bD48bGk+RXhjbHVkZWQgdGVzdCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5KYXZhRWxlbWVudERlbHRhVGVzdHMudGVzdEJ1aWxkUHJvamVjdFVzZWRBc0xpYigpPC9saT4KIDwvdWw+CiAKIDxhIG5hbWU9InZfNDMxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDIwdGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDMxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQzMSI+Y3ZzPC9hPikuCkBAIC00NzgsNyArNDc4LDcgQEAKIDxhIG5hbWU9InZfNDMwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDE4dGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDMwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQzMCI+Y3ZzPC9hPikuCkBAIC00OTcsNyArNDk3LDcgQEAKIDxhIG5hbWU9InZfNDI5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDE4dGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyOSI+Y3ZzPC9hPikuCkBAIC01MzcsNyArNTM3LDcgQEAKIDxhIG5hbWU9InZfNDI4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDEzdGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyOCI+Y3ZzPC9hPikuCkBAIC01ODksNyArNTg5LDcgQEAKIDxhIG5hbWU9InZfNDI3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDExdGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI3CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyNyI+Y3ZzPC9hPikuCkBAIC02NDIsMTIgKzY0MiwxMiBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwODQ4Ij42MDg0ODwvYT4KIFtyZWNvbmNpbGluZ10gVW5jbG9zZWQgQ29tbWVudCBpbiBKYXZhIFRleHRlZGl0b3IKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDgyMiI+NjA4MjI8L2E+Ci1SZWFjdGluZyB0byBQcm9qZWN0ID4gQ2xlYW4uLi4gCitSZWFjdGluZyB0byBQcm9qZWN0ICZndDsgQ2xlYW4uLi4gCiAJICAJCiA8YSBuYW1lPSJ2XzQyNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTkgQnVpbGQgLSA0dGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyNiI+Y3ZzPC9hPikuCkBAIC02OTYsNyArNjk2LDcgQEAKIDxhIG5hbWU9InZfNDI1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDI4dGggQXByaWwgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MjUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDI1Ij5jdnM8L2E+KS4KQEAgLTcyMSw3ICs3MjEsNyBAQAogLyoqCiAgKiBSZW1vdmVzIHRoZSBnaXZlbiBwcmUtcHJvY2Vzc2luZyByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyLgogICoKLSAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgorICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCiAgKgogICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgogICogQHNpbmNlIDMuMApAQCAtNzc1LDcgKzc3NSw3IEBACiA8YSBuYW1lPSJ2XzQyNCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTkgQnVpbGQgLSAyN3RoIEFwcmlsIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyNCI+Y3ZzPC9hPikuCkBAIC04MTksNyArODE5LDcgQEAKIDxhIG5hbWU9InZfNDIzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDIybmQgQXByaWwgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MjMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDIzIj5jdnM8L2E+KS4KQEAgLTg0Miw3ICs4NDIsNyBAQAogPGEgbmFtZT0idl80MjIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME05IEJ1aWxkIC0gMjB0aCBBcHJpbCAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQyMgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MjIiPmN2czwvYT4pLgpAQCAtODc0LDcgKzg3NCw3IEBACiAgKiBzaG91bGQgZW5zdXJlIHVzaW5nIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lciBpbml0aWFsaXplci4gSW5kZWVkLCBhIHJhbmRvbSBjb250YWluZXIKICAqIGluaXRpYWxpemVyIGNhbm5vdCBiZSBoZWxkIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBjb21wYXJpc29uIElEcyBmb3IgYXJiaXRyYXJ5IAogICogY29udGFpbmVycy4KLSAqIDxwPgorICogCiAgKiBAcGFyYW0gY29udGFpbmVyUGF0aCB0aGUgcGF0aCBvZiB0aGUgY29udGFpbmVyIHdoaWNoIGlzIGJlaW5nIGNoZWNrZWQKICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB3aGljaCB0aGUgY29udGFpbmVyIGlzIHRvIGJlaW5nIGNoZWNrZWQKICAqIEByZXR1cm4gcmV0dXJucyBhbiBPYmplY3QgaWRlbnRpZnlpbmcgdGhlIGNvbnRhaW5lciBmb3IgY29tcGFyaXNvbgpAQCAtOTE5LDcgKzkxOSw3IEBACiA8YSBuYW1lPSJ2XzQyMSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTkgQnVpbGQgLSAxM3RoIEFwcmlsIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDIxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQyMSI+Y3ZzPC9hPikuCkBAIC05NDksNyArOTQ5LDcgQEAKIDxhIG5hbWU9InZfNDIwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOSBCdWlsZCAtIDZ0aCBBcHJpbCAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQyMAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MjAiPmN2czwvYT4pLgpAQCAtOTk4LDcgKzk5OCw3IEBACiA8YSBuYW1lPSJ2XzQxOSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTkgQnVpbGQgLSAzMHRoIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDE5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxOSI+Y3ZzPC9hPikuCkBAIC0xMDE5LDcgKzEwMTksNyBAQAogPGEgbmFtZT0idl80MTgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gMjV0aCBNYXJjaCAyMDA0IC0gMy4wIE1JTEVTVE9ORS04CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQxOAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MTgiPmN2czwvYT4pLgpAQCAtMTAzNyw3ICsxMDM3LDcgQEAKIDxhIG5hbWU9InZfNDE3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOCBCdWlsZCAtIDI0dGggTWFyY2ggMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MTcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDE3Ij5jdnM8L2E+KS4KQEAgLTEwNTMsNyArMTA1Myw3IEBACiA8YSBuYW1lPSJ2XzQxNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTggQnVpbGQgLSAyM3JkIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDE2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxNiI+Y3ZzPC9hPikuCkBAIC0xMDY5LDcgKzEwNjksNyBAQAogPGEgbmFtZT0idl80MTUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gMjNyZCBNYXJjaCAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQxNQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MTUiPmN2czwvYT4pLgpAQCAtMTEyNiw3ICsxMTI2LDcgQEAKIDxhIG5hbWU9InZfNDE0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNOCBCdWlsZCAtIDIybmQgTWFyY2ggMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MTQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDE0Ij5jdnM8L2E+KS4KQEAgLTExNTYsNyArMTE1Niw3IEBACiA8YSBuYW1lPSJ2XzQxMyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTggQnVpbGQgLSAxNXRoIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDEzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxMyI+Y3ZzPC9hPikuCkBAIC0xMTk5LDcgKzExOTksNyBAQAogPGEgbmFtZT0idl80MTIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gOHRoIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDEyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxMiI+Y3ZzPC9hPikuCkBAIC0xMjU5LDcgKzEyNTksNyBAQAogPGEgbmFtZT0idl80MTEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gM3JkIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDExCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxMSI+Y3ZzPC9hPikuCkBAIC0xMjgyLDcgKzEyODIsNyBAQAogPGEgbmFtZT0idl80MTAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gMm5kIE1hcmNoIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDEwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQxMCI+Y3ZzPC9hPikuCkBAIC0xMzM2LDcgKzEzMzYsNyBAQAogPGEgbmFtZT0idl80MDkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME04IEJ1aWxkIC0gMjR0aCBGZWJydWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwOQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDkiPmN2czwvYT4pLgpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIDxhIG5hbWU9InZfNDA4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDEydGggRmVicnVhcnkgMjAwNCAtIDMuMCBNSUxFU1RPTkUtNwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MDgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNDA4Ij5jdnM8L2E+KS4KQEAgLTE0NDQsNyArMTQ0NCw3IEBACiA8YSBuYW1lPSJ2XzQwNyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTcgQnVpbGQgLSAxMXRoIEZlYnJ1YXJ5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDA3CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzQwNyI+Y3ZzPC9hPikuCkBAIC0xNDYzLDcgKzE0NjMsNyBAQAogPGEgbmFtZT0idl80MDYiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME03IEJ1aWxkIC0gMTB0aCBGZWJydWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwNgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDYiPmN2czwvYT4pLgpAQCAtMTQ4MCw3ICsxNDgwLDcgQEAKIDxhIG5hbWU9InZfNDA1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDl0aCBGZWJydWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwNQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDUiPmN2czwvYT4pLgpAQCAtMTUyMiw3ICsxNTIyLDcgQEAKIDxhIG5hbWU9InZfNDA0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDNyZCBGZWJydWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwNAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDQiPmN2czwvYT4pLgpAQCAtMTUzOCw3ICsxNTM4LDcgQEAKIDxhIG5hbWU9InZfNDAzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDNyZCBGZWJydWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwMwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDMiPmN2czwvYT4pLgpAQCAtMTU1Nyw3ICsxNTU3LDcgQEAKIDxhIG5hbWU9InZfNDAyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDMwdGggSmFudWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwMgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDIiPmN2czwvYT4pLgpAQCAtMTU5MSw3ICsxNTkxLDcgQEAKIDxhIG5hbWU9InZfNDAxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDI5dGggSmFudWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwMQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDEiPmN2czwvYT4pLgpAQCAtMTYxNSw3ICsxNjE1LDcgQEAKIDxhIG5hbWU9InZfNDAwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDI4dGggSmFudWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQwMAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl80MDAiPmN2czwvYT4pLgpAQCAtMTYzNSw3ICsxNjM1LDcgQEAKIDxhIG5hbWU9InZfMzk5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNyBCdWlsZCAtIDI3dGggSmFudWFyeSAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM5OQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zOTkiPmN2czwvYT4pLgpAQCAtMTY5MSw3ICsxNjkxLDcgQEAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY5NyI+NTA2OTc8L2E+CiBJbXByb3ZlIERPTS9BU1Qgc3VwcG9ydCBmb3IgbG9jYXRpbmcgYWxsIGNvbW1lbnRzCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA2NjciPjUwNjY3PC9hPgotRGVhZGxvY2sgb24gUmVmYWN0b3IgLT4gRXh0cmFjdCBtZXRob2QKK0RlYWRsb2NrIG9uIFJlZmFjdG9yIC0mZ3Q7IEV4dHJhY3QgbWV0aG9kCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDc0MzAiPjQ3NDMwPC9hPgogdGhlIGltbXV0YWJsZSBiaXQgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIHJlc291cmNlIHRvIHRoZSBvdXB1dCBkaXJlY3RvcnkKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDYwMSI+NTA2MDE8L2E+CkBAIC0xNzE1LDcgKzE3MTUsNyBAQAogPGEgbmFtZT0idl8zOTgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME03IEJ1aWxkIC0gMjB0aCBKYW51YXJ5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzk4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM5OCI+Y3ZzPC9hPikuCkBAIC0xODY0LDcgKzE4NjQsNyBAQAogPGEgbmFtZT0idl8zOTciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME03IEJ1aWxkIC0gMTN0aCBKYW51YXJ5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzk3CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM5NyI+Y3ZzPC9hPikuCkBAIC0xOTY3LDcgKzE5NjcsNyBAQAogPGEgbmFtZT0idl8zOTYiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME02IEJ1aWxkIC0gMTh0aCBEZWNlbWJlciAyMDAzIC0gMy4wIE1JTEVTVE9ORS02CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM5NgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zOTYiPmN2czwvYT4pLgpAQCAtMTk4Myw3ICsxOTgzLDcgQEAKIDxhIG5hbWU9InZfMzk1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNiBCdWlsZCAtIDE3dGggRGVjZW1iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zOTUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzk1Ij5jdnM8L2E+KS4KQEAgLTIwMDEsNyArMjAwMSw3IEBACiA8YSBuYW1lPSJ2XzM5NCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTYgQnVpbGQgLSAxNnRoIERlY2VtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzk0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM5NCI+Y3ZzPC9hPikuCkBAIC0yMDE3LDcgKzIwMTcsNyBAQAogPGEgbmFtZT0idl8zOTMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME02IEJ1aWxkIC0gMTZ0aCBEZWNlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM5MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zOTMiPmN2czwvYT4pLgpAQCAtMjA0Miw3ICsyMDQyLDcgQEAKIDxhIG5hbWU9InZfMzkyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNiBCdWlsZCAtIDE1dGggRGVjZW1iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zOTIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzkyIj5jdnM8L2E+KS4KQEAgLTIxNzYsNyArMjE3Niw3IEBACiA8YSBuYW1lPSJ2XzM5MSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTYgQnVpbGQgLSAxMHRoIERlY2VtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzkxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM5MSI+Y3ZzPC9hPikuCkBAIC0yMTk5LDcgKzIxOTksNyBAQAogPGEgbmFtZT0idl8zOTAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME02IEJ1aWxkIC0gOXRoIERlY2VtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzkwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM5MCI+Y3ZzPC9hPikuCkBAIC0yMjMzLDcgKzIyMzMsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ0NjczIj40NDY3MzwvYT4KIEZvcm1hdHRpbmcKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODUyMyI+Mzg1MjM8L2E+Ci1zbyBhZGQgIkluc2VydCBuZXcgbGluZSBhZnRlciBlYWNoIHBhcmFtZXRlciBpZiBsaW5lIGlzIHRvbyBsb25nIiBjaGVja2JveCB0byBQcmVmZXJlbmNlcyA+IEphdmEgPiBDb2RlIEZvcm1hdHRlciA+IE5ldyBMaW5lcworc28gYWRkICJJbnNlcnQgbmV3IGxpbmUgYWZ0ZXIgZWFjaCBwYXJhbWV0ZXIgaWYgbGluZSBpcyB0b28gbG9uZyIgY2hlY2tib3ggdG8gUHJlZmVyZW5jZXMgJmd0OyBKYXZhICZndDsgQ29kZSBGb3JtYXR0ZXIgJmd0OyBOZXcgTGluZXMKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDg5NyI+MzQ4OTc8L2E+CiBDb2RlIEZvcm1hdHRlciBmZWF0dXJlIHJlcXVlc3QKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NjkzNyI+NDY5Mzc8L2E+CkBAIC0yMjY4LDcgKzIyNjgsNyBAQAogPGEgbmFtZT0idl8zODkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME02IEJ1aWxkIC0gMm5kIERlY2VtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzg5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM4OSI+Y3ZzPC9hPikuCkBAIC0yMzU2LDcgKzIzNTYsNyBAQAogPGEgbmFtZT0idl8zODgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME02IEJ1aWxkIC0gMjV0aCBOb3ZlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM4OAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zODgiPmN2czwvYT4pLgpAQCAtMjM3NSw3ICsyMzc1LDcgQEAKIDxhIG5hbWU9InZfMzg3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNSBCdWlsZCAtIDIxc3QgTm92ZW1iZXIgMjAwMyAtIDMuMCBNSUxFU1RPTkUtNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zODcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzg3Ij5jdnM8L2E+KS4KQEAgLTI0MDUsNyArMjQwNSw3IEBACiA8YSBuYW1lPSJ2XzM4NiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTUgQnVpbGQgLSAyMHRoIE5vdmVtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzg2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM4NiI+Y3ZzPC9hPikuCkBAIC0yNDk2LDcgKzI0OTYsNyBAQAogPGEgbmFtZT0idl8zODUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME01IEJ1aWxkIC0gMTl0aCBOb3ZlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM4NQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zODUiPmN2czwvYT4pLgpAQCAtMjUxNCw3ICsyNTE0LDcgQEAKIDxhIG5hbWU9InZfMzg0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNSBCdWlsZCAtIDE5dGggTm92ZW1iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zODQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzg0Ij5jdnM8L2E+KS4KQEAgLTI2MDAsNyArMjYwMCw3IEBACiA8YSBuYW1lPSJ2XzM4MyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTUgQnVpbGQgLSAxOHRoIE5vdmVtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzgzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM4MyI+Y3ZzPC9hPikuCkBAIC0yNjYwLDcgKzI2NjAsNyBAQAogPGEgbmFtZT0idl8zODIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME01IEJ1aWxkIC0gMTB0aCBOb3ZlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM4MgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zODIiPmN2czwvYT4pLgpAQCAtMjY5Nyw3ICsyNjk3LDcgQEAKIDxhIG5hbWU9InZfMzgxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNSBCdWlsZCAtIDR0aCBOb3ZlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM4MQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zODEiPmN2czwvYT4pLgpAQCAtMjc1MSw3ICsyNzUxLDcgQEAKIDxhIG5hbWU9InZfMzgwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNSBCdWlsZCAtIDI4dGggT2N0b2JlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM4MAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zODAiPmN2czwvYT4pLgpAQCAtMjc2NSw3ICsyNzY1LDcgQEAKIAl0eXBlcyBvZiBleGNlcHRpb25zIGRlY2xhcmVkIGluIDxjb2RlPkB0aHJvd3M8L2NvZGU+Lzxjb2RlPkBleGNlcHRpb248L2NvZGU+IHRhZ3MgYW5kIGFsbCBpbnN0YW5jZSB2YXJpYWJsZXMsIG1ldGhvZHMsIHR5cGVzIG9yIAogCXBhY2thZ2VzIGRlY2xhcmVkIGluIDxjb2RlPkBzZWU8L2NvZGU+IHRhZ3MuCiAJPGJyPk5vdGUgdGhhdCBvbmx5IHZhbGlkIHJlZmVyZW5jZXMgaW4gSmF2YWRvYyBjb21tZW50cyB3aWxsIGJlIHJlcG9ydGVkIGR1cmluZyBzZWFyY2guIEluIG9yZGVyIHRvIGVuc3VyZSB0aGUgaW50ZWdyaXR5IG9mIHlvdXIgSmF2YWRvYyBjb21tZW50cywKLQl5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoZSBjb21waWxlciBjaGVjayBmb3IgSmF2YWRvYyAoUHJlZmVyZW5jZXM+SmF2YT5Db21waWxlcj5TdHlsZT5Qcm9ibGVtIGluIEphdmFkb2MgdGFncykuCisJeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGUgY29tcGlsZXIgY2hlY2sgZm9yIEphdmFkb2MgKFByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29tcGlsZXImZ3Q7U3R5bGUmZ3Q7UHJvYmxlbSBpbiBKYXZhZG9jIHRhZ3MpLgogPC9saT4KIDwvdWw+CiAKQEAgLTI4MDAsNyArMjgwMCw3IEBACiA8YSBuYW1lPSJ2XzM3OSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTUgQnVpbGQgLSAyMXN0IE9jdG9iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNzkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzc5Ij5jdnM8L2E+KS4KQEAgLTI4NjgsNyArMjg2OCw3IEBACiA8YSBuYW1lPSJ2XzM3OCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTUgQnVpbGQgLSAxNXRoIE9jdG9iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNzgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzc4Ij5jdnM8L2E+KS4KQEAgLTI5MjcsNyArMjkyNyw3IEBACiA8YSBuYW1lPSJ2XzM3NyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTQgQnVpbGQgLSA5dGggT2N0b2JlciAyMDAzIC0gMy4wIE1JTEVTVE9ORS00CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM3NwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNzciPmN2czwvYT4pLgpAQCAtMjk1OSw3ICsyOTU5LDcgQEAKIDxhIG5hbWU9InZfMzc2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNCBCdWlsZCAtIDh0aCBPY3RvYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzc2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM3NiI+Y3ZzPC9hPikuCkBAIC0yOTkzLDcgKzI5OTMsNyBAQAogPGEgbmFtZT0idl8zNzQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME00IEJ1aWxkIC0gN3RoIE9jdG9iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNzQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzc0Ij5jdnM8L2E+KS4KQEAgLTMxNDEsNyArMzE0MSw3IEBACiA8YSBuYW1lPSJ2XzM3MyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTQgQnVpbGQgLSAzMHRoIFNlcHRlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM3MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNzMiPmN2czwvYT4pLgpAQCAtMzE4MCw3ICszMTgwLDcgQEAKIDxhIG5hbWU9InZfMzcyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNCBCdWlsZCAtIDI0dGggU2VwdGVtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzcyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM3MiI+Y3ZzPC9hPikuCkBAIC0zMjAzLDcgKzMyMDMsNyBAQAogPGEgbmFtZT0idl8zNzEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME00IEJ1aWxkIC0gMjJuZCBTZXB0ZW1iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNzEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzcxIj5jdnM8L2E+KS4KQEAgLTMyNTQsNyArMzI1NCw3IEBACiA8YSBuYW1lPSJ2XzM3MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTQgQnVpbGQgLSAxNnRoIFNlcHRlbWJlciAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM3MCAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzcwIj5jdnM8L2E+KS4KQEAgLTMyODIsNyArMzI4Miw3IEBACiA8YSBuYW1lPSJ2XzM2OSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTQgQnVpbGQgLSA5dGggU2VwdGVtYmVyIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzY5IAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNjkiPmN2czwvYT4pLgpAQCAtMzMxOSw3ICszMzE5LDcgQEAKIDxhIG5hbWU9InZfMzY4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNNCBCdWlsZCAtIDFzdCBTZXB0ZW1iZXIgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNjggCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM2OCI+Y3ZzPC9hPikuCkBAIC0zMzk3LDcgKzMzOTcsNyBAQAogPGEgbmFtZT0idl8zNjciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0zIEJ1aWxkIC0gMjJuZCBBdWd1c3QgMjAwMyAtIDMuMCBNSUxFU1RPTkUtMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNjcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzY3Ij5jdnM8L2E+KS4KQEAgLTM0MjksNyArMzQyOSw3IEBACiA8YSBuYW1lPSJ2XzM2NiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTMgQnVpbGQgLSAxOXRoIEF1Z3VzdCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM2NiAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzY2Ij5jdnM8L2E+KS4KQEAgLTM0ODcsNyArMzQ4Nyw3IEBACiA8YSBuYW1lPSJ2XzM2NWEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0zIEJ1aWxkIC0gMjR0aCBKdWx5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzY1YSAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzY1YSI+Y3ZzPC9hPikuCkBAIC0zNTA3LDcgKzM1MDcsNyBAQAogPGEgbmFtZT0idl8zNjUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0zIEJ1aWxkIC0gMjJuZCBKdWx5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzY1IAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNjUiPmN2czwvYT4pLgpAQCAtMzU2Myw3ICszNTYzLDcgQEAKIDxhIG5hbWU9InZfMzY0YiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTIgQnVpbGQgLSAxOHRoIEp1bHkgMjAwMyAtIDMuMCBNSUxFU1RPTkUtMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNjRiIAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNjRiIj5jdnM8L2E+KS4KQEAgLTM1NzgsNyArMzU3OCw3IEBACiA8YSBuYW1lPSJ2XzM2NGEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0yIEJ1aWxkIC0gMTd0aCBKdWx5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzY0YSAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzY0YSI+Y3ZzPC9hPikuCkBAIC0zNTk1LDcgKzM1OTUsNyBAQAogPGEgbmFtZT0idl8zNjQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0yIEJ1aWxkIC0gMTZ0aCBKdWx5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzY0IAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNjQiPmN2czwvYT4pLgpAQCAtMzYxMCw3ICszNjEwLDcgQEAKIDxhIG5hbWU9InZfMzYzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNMiBCdWlsZCAtIDE1dGggSnVseSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM2MyAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzYzIj5jdnM8L2E+KS4KQEAgLTM2MzIsNyArMzYzMiw3IEBACiA8YSBuYW1lPSJ2XzM2MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTIgQnVpbGQgLSAxNHRoIEp1bHkgMjAwMyAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzYyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM2MiI+Y3ZzPC9hPikuCkBAIC0zNjkzLDcgKzM2OTMsNyBAQAogPGEgbmFtZT0idl8zNjEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0yIEJ1aWxkIC0gN3RoIEp1bHkgMjAwMyAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzYxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM2MSI+Y3ZzPC9hPikuCkBAIC0zNzQ5LDcgKzM3NDksNyBAQAogPGEgbmFtZT0idl8zNjAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0yIEJ1aWxkIC0gMXN0IEp1bHkgMjAwMyAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzYwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM2MCI+Y3ZzPC9hPikuCkBAIC0zODM3LDcgKzM4MzcsNyBAQAogPGEgbmFtZT0idl8zNTkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0yIEJ1aWxkIC0gMjNyZCBKdW5lIDIwMDMgCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM1OQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNTkiPmN2czwvYT4pLgpAQCAtMzkwMSw3ICszOTAxLDcgQEAKIDxhIG5hbWU9InZfMzU3YiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTIgQnVpbGQgLSAxOHRoIEp1bmUgMjAwMyAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzU3YgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNTdiIj5jdnM8L2E+KS4KQEAgLTM5MTksNyArMzkxOSw3IEBACiA8YSBuYW1lPSJ2XzM1OCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTIgQnVpbGQgLSAxNnRoIEp1bmUgMjAwMyAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzU4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM1OCI+Y3ZzPC9hPikuCkBAIC00MDA2LDcgKzQwMDYsNyBAQAogICoKICAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKICAqIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIGFuIHVwZGF0ZSBjb25mbGljdC4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9yY2UgcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKyAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9yY2UgcGFyYW1ldGVyIGFmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKICAqIHN1Y2ggYSBjb25mbGljdDoKICAqIC0gdHJ1ZSAtIGluIHRoaXMgY2FzZSB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkgYXJlIGFwcGxpZWQgdG8KICAqIAl0aGUgdW5kZXJseWluZyByZXNvdXJjZSBldmVuIHRob3VnaCB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCAKQEAgLTQxODYsNyArNDE4Niw3IEBACiA8YSBuYW1lPSJ2XzM1NyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTEgQnVpbGQgLSA1dGggSnVuZSAyMDAzIC0gMy4wIE1JTEVTVE9ORS0xCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM1NwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNTciPmN2czwvYT4pLgpAQCAtNDIwMyw3ICs0MjAzLDcgQEAKIDxhIG5hbWU9InZfMzU2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNMSBCdWlsZCAtIDR0aCBKdW5lIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzU2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM1NiI+Y3ZzPC9hPikuCkBAIC00MjIwLDcgKzQyMjAsNyBAQAogPGEgbmFtZT0idl8zNTUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0xIEJ1aWxkIC0gM3JkIEp1bmUgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNTUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzU1Ij5jdnM8L2E+KS4KQEAgLTQyNDQsNyArNDI0NCw3IEBACiA8YSBuYW1lPSJ2XzM1NCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTEgQnVpbGQgLSAyNnRoIE1heSAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM1NAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNTQiPmN2czwvYT4pLgpAQCAtNDI4NSw3ICs0Mjg1LDcgQEAKIDxhIG5hbWU9InZfMzUzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjBNMSBCdWlsZCAtIDE5dGggTWF5IDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzUzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM1MyI+Y3ZzPC9hPikuCkBAIC00MzEyLDcgKzQzMTIsNyBAQAogPGEgbmFtZT0idl8zNTIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0xIEJ1aWxkIC0gMTN0aCBNYXkgMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNTIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzUyIj5jdnM8L2E+KS4KQEAgLTQzMzMsMTIgKzQzMzMsMTIgQEAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNzM4MSI+MzczODE8L2E+CiBBU1Q6IFdyb25nIHNvdXJjZSByYW5nZXMgb24gVmFyaWFibGVEZWNsRXhwcmVzc2lvbgogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3MjAwIj4zNzIwMDwvYT4KLSJTb3VyY2UtPkdlbmVyYXRlIERlbGVnYXRlIE1ldGhvZHMuLi4iIGZhaWxzCisiU291cmNlLSZndDtHZW5lcmF0ZSBEZWxlZ2F0ZSBNZXRob2RzLi4uIiBmYWlscwogCiA8YSBuYW1lPSJ2XzM1MSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wTTEgQnVpbGQgLSAyOXRoIEFwcmlsIDIwMDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzUxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzM1MSI+Y3ZzPC9hPikuCkBAIC00MzY0LDcgKzQzNjQsNyBAQAogPGEgbmFtZT0idl8zNTAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuME0xIEJ1aWxkIC0gMjJuZCBBcHJpbCAyMDAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM1MAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl8zNTAiPmN2czwvYT4pLgpAQCAtNDQ3MSw3ICs0NDcxLDcgQEAKIDxhIG5hbWU9InZfMzEyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAyLjEgQnVpbGQgKGJlZm9yZSAzLjAvMi4xLjEgYnJhbmNoaW5nKSAtIDMxc3QgTWFyY2ggMjAwMwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMTIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfMzEyIj5jdnM8L2E+KS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMV9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzFfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCmluZGV4IGMzYzU2MTUuLjdhNjRiMmEgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMV9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjMxX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbApAQCAtMTMsNyArMTMsNyBAQAogICAgICAgPGZvbnQgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMy4xIHN0cmVhbTwvYj48L2ZvbnQ+CiAgICAgPC90ZD4KICAgPC90cj4KLSAgPHRyPjx0ZCB0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+PGZvbnQgc2l6ZT0iLTIiPmphdmEgZGV2ZWxvcG1lbnQgdG9vbGluZyBjb3JlPC9mb250PjwvdGQ+PC90cj4KKyAgPHRyPjx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+PGZvbnQgc2l6ZT0iLTIiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD48L3RkPjwvdHI+CiAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgogICA8dHI+CiAgIAk8dGQgY2xhc3M9InRpdGxlMyI+CkBAIC0zMiw3ICszMiw3IEBACiA8YSBuYW1lPSJ2XzU3MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkM0IC0gMjd0aCBKdW5lIDIwMDUgLSAzLjEgUkVMRUFTRSAoUjNfMSkKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTcwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU3MCI+Y3ZzPC9hPikuCkBAIC01MSw3ICs1MSw3IEBACiA8YSBuYW1lPSJ2XzU2OSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkM0IC0gMjR0aCBKdW5lIDIwMDUgLSAzLjEgUkVMRUFTRSBDQU5ESURBVEUgNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NjkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTY5Ij5jdnM8L2E+KS4KQEAgLTY3LDcgKzY3LDcgQEAKIDxhIG5hbWU9InZfNTY4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFSQzQgLSAyM3JkIEp1bmUgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NjgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTY4Ij5jdnM8L2E+KS4KQEAgLTk3LDcgKzk3LDcgQEAKIDxhIG5hbWU9InZfNTY3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFSQzMgLSAxN3RoIEp1bmUgMjAwNSAtIDMuMSBSRUxFQVNFIENBTkRJREFURSAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU2NwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NjciPmN2czwvYT4pLgpAQCAtMTE0LDcgKzExNCw3IEBACiA8YSBuYW1lPSJ2XzU2NiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkMzIC0gMTZ0aCBKdW5lIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTY2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU2NiI+Y3ZzPC9hPikuCkBAIC0xMzEsNyArMTMxLDcgQEAKIDxhIG5hbWU9InZfNTY1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFSQzMgLSAxNnRoIEp1bmUgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NjUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTY1Ij5jdnM8L2E+KS4KQEAgLTE0OSw3ICsxNDksNyBAQAogPGEgbmFtZT0idl81NjQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMVJDMyAtIDE2dGggSnVuZSAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU2NAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NjQiPmN2czwvYT4pLgpAQCAtMjQyLDcgKzI0Miw3IEBACiA8YSBuYW1lPSJ2XzU2MyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkMyIC0gMTB0aCBKdW5lIDIwMDUgLSAzLjEgUkVMRUFTRSBDQU5ESURBVEUgMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NjMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTYzIj5jdnM8L2E+KS4KQEAgLTI2Myw3ICsyNjMsNyBAQAogPGEgbmFtZT0idl81NjIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMVJDMiAtIDl0aCBKdW5lIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTYyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU2MiI+Y3ZzPC9hPikuCkBAIC0yODMsNyArMjgzLDcgQEAKIDxhIG5hbWU9InZfNTYxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFSQzIgLSA5dGggSnVuZSAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU2MQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NjEiPmN2czwvYT4pLgpAQCAtNTY1LDcgKzU2NSw3IEBACiA8YSBuYW1lPSJ2XzU2MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkMxIC0gMjZ0aCBNYXkgMjAwNSAtIDMuMSBSRUxFQVNFIENBTkRJREFURSAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU2MAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NjAiPmN2czwvYT4pLgpAQCAtNTg0LDcgKzU4NCw3IEBACiA8YSBuYW1lPSJ2XzU1OSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xUkMxIC0gMjZ0aCBNYXkgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NTkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTU5Ij5jdnM8L2E+KS4KQEAgLTYwMSw3ICs2MDEsNyBAQAogPGEgbmFtZT0idl81NTgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMVJDMSAtIDI2dGggTWF5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTU4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU1OCI+Y3ZzPC9hPikuCkBAIC04MjAsNyArODIwLDcgQEAKIDxhIG5hbWU9InZfNTU3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNyAtIDEydGggTWF5IDIwMDUgLSAzLjEgTUlMRVNUT05FIDcgLyAzLjEgUkVMRUFTRSBDQU5ESURBVEUgMAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NTcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTU3Ij5jdnM8L2E+KS4KQEAgLTgzNyw3ICs4MzcsNyBAQAogPGEgbmFtZT0idl81NTYiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU03IC0gMTJ0aCBNYXkgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NTYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTU2Ij5jdnM8L2E+KS4KQEAgLTg5Niw3ICs4OTYsNyBAQAogPGEgbmFtZT0idl81NTUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU03IC0gOXRoIE1heSAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU1NQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NTUiPmN2czwvYT4pLgpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIDxhIG5hbWU9InZfNTU0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNyAtIDZ0aCBNYXkgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NTQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTU0Ij5jdnM8L2E+KS4KQEAgLTExODcsNyArMTE4Nyw3IEBACiA8YSBuYW1lPSJ2XzU1MyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTcgLSAyNnRoIEFwcmlsIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTUzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU1MyI+Y3ZzPC9hPikuCkBAIC0xMjEyLDcgKzEyMTIsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0MDQ5Ij44NDA0OTwvYT4KIFtqYXZhZG9jXVtkb21dIEV4dGVuZGVkIHJhbmdlcyB3cm9uZyBmb3IgbWV0aG9kIG5hbWUgd2l0aG91dCByZXR1cm4gdHlwZQogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyNjczIj44MjY3MzwvYT4KLVtzZWFyY2hdIFJlZmFjdG9yLT5SZW5hbWUgb24gbG9jYWwgY2xhc3MgYWxzbyByZW5hbWVzIHJlZmVyZW5jZXMgdG8gZGlmZmVyZW50IGxvY2FsIGNsYXNzZXMgd2l0aCBzYW1lIG5hbWUKK1tzZWFyY2hdIFJlZmFjdG9yLSZndDtSZW5hbWUgb24gbG9jYWwgY2xhc3MgYWxzbyByZW5hbWVzIHJlZmVyZW5jZXMgdG8gZGlmZmVyZW50IGxvY2FsIGNsYXNzZXMgd2l0aCBzYW1lIG5hbWUKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTA2MiI+ODEwNjI8L2E+CiBbYnVpbGRlcl0gQnVpbGQgaXMgYWJvcnRlZCBldmVuIHdoZW4gbm8gZXJyb3JzIGFyZSBvY2N1cmluZyAoaW5jb21wbGV0ZSBidWlsZCBwYXRoID09IHdhcm5pbmcpCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODMwMTIiPjgzMDEyPC9hPgpAQCAtMTI3NSw3ICsxMjc1LDcgQEAKIDxhIG5hbWU9InZfNTUyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNyAtIDIwdGggQXByaWwgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NTIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTUyIj5jdnM8L2E+KS4KQEAgLTEyOTcsNyArMTI5Nyw3IEBACiA8YSBuYW1lPSJ2XzU1MSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTcgLSAxOXRoIEFwcmlsIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTUxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU1MSI+Y3ZzPC9hPikuCkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMDk4Ij45MTA5ODwvYT4KIFRoZSBNYXJrIE9jY3VycmVuY2VzIGZlYXR1cmUgZG9lcyBub3QgbWFyayBhbGwgb2NjdXJyZW5jZXMKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTI4OCI+NzkyODg8L2E+Ci1Db2RlIGFzc2lzdCBvZmZlcnMgdHlwZXMgd2hpY2ggYXJlIG91dCBvZiBzY29wZSA9PT4gY29tcGlsZSBlcnJvcnMKK0NvZGUgYXNzaXN0IG9mZmVycyB0eXBlcyB3aGljaCBhcmUgb3V0IG9mIHNjb3BlID09Jmd0OyBjb21waWxlIGVycm9ycwogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4Mjk4Ij44ODI5ODwvYT4KIFsxLjVdW2Fzc2lzdF0gbm8gY29tcGxldGlvbiBpbnNpZGUgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbgogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMjM4Ij45MTIzODwvYT4KQEAgLTEzNjEsNyArMTM2MSw3IEBACiA8YSBuYW1lPSJ2XzU1MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTcgLSAxMnRoIEFwcmlsIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTUwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU1MCI+Y3ZzPC9hPikuCkBAIC0xNDAzLDcgKzE0MDMsNyBAQAogPGEgbmFtZT0idl81NDkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU03IC0gNXRoIEFwcmlsIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTQ5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU0OSI+Y3ZzPC9hPikuCkBAIC0xNDI3LDcgKzE0MjcsNyBAQAogPGEgbmFtZT0idl81NDgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMXN0IEFwcmlsIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTQ4IC0gMy4xIE1JTEVTVE9ORSA2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU0OCI+Y3ZzPC9hPikuCkBAIC0xNDYwLDcgKzE0NjAsNyBAQAogPGEgbmFtZT0idl81NDciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMzFzdCBNYXJjaCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU0NwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NDciPmN2czwvYT4pLgpAQCAtMTQ3OSw3ICsxNDc5LDcgQEAKIDxhIG5hbWU9InZfNTQ2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNiAtIDMxc3QgTWFyY2ggMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NDYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTQ2Ij5jdnM8L2E+KS4KQEAgLTE1MDQsNyArMTUwNCw3IEBACiA8YSBuYW1lPSJ2XzU0NSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTYgLSAyOXRoIE1hcmNoIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTQ1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU0NSI+Y3ZzPC9hPikuCkBAIC0xNTIwLDcgKzE1MjAsNyBAQAogPGEgbmFtZT0idl81NDQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMjl0aCBNYXJjaCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU0NAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NDQiPmN2czwvYT4pLgpAQCAtMTU2NSw3ICsxNTY1LDcgQEAKIDxhIG5hbWU9InZfNTQzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNiAtIDI0dGggTWFyY2ggMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81NDMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTQzIj5jdnM8L2E+KS4KQEAgLTE2NDUsNyArMTY0NSw3IEBACiA8YSBuYW1lPSJ2XzU0MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTYgLSAyMm5kIE1hcmNoIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTQyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU0MiI+Y3ZzPC9hPikuCkBAIC0xNzA0LDcgKzE3MDQsNyBAQAogICAgICAgPC91bD4KIDwvbGk+CiA8bGk+Q29kZSBzZWxlY3Qgbm93IHdvcmtzIGludG8gSmF2YWRvYyBjb21tZW50IHdoZXJldmVyIGEgcmVmZXJlbmNlIGNhbiBiZSBzcGVjaWZpZWQKLShpZS4gQHNlZSwgQGxpbmssIEBsaW5rcGxhaW4sIEB0aHJvd3MsIEBleGNlcHRpb24sIEBwYXJhbSBvciBAdmFsdWUgdGFncyk8YnI+CisoaS5lLiBAc2VlLCBAbGluaywgQGxpbmtwbGFpbiwgQHRocm93cywgQGV4Y2VwdGlvbiwgQHBhcmFtIG9yIEB2YWx1ZSB0YWdzKTxicj4KIChzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0OTY4Ij41NDk2ODwvYT4pLjxicj4KIEZvciBleGFtcGxlLCBoaXQgRjMgd2l0aCBjdXJzb3IgbG9jYXRlZCBpbiA8Y29kZT5NeUNsYXNzPC9jb2RlPiwgaW4gZm9sbG93aW5nIEphdmFkb2MgY29tbWVudDoKIDxwcmU+CkBAIC0xODA4LDcgKzE4MDgsNyBAQAogPGEgbmFtZT0idl81NDEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMTV0aCBNYXJjaCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzU0MQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81NDEiPmN2czwvYT4pLgpAQCAtMTg1MCw3ICsxODUwLDcgQEAKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kIHJlZmVyZW5jZSBwYXJhbWV0ZXIgaXMgZm9yCiAgKiB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgYSB2YXJpYWJsZSBhcml0eSBtZXRob2QgKGFkZGVkIGluIEpMUzMgQVBJKS4KLSAqIDxwPgorICogCiAgKiBOb3RlIHRoYXQgdGhlIGJpbmRpbmcgZm9yIHRoZSB0eXBlIDxjb2RlPkZvbzwvY29kZT5pbiB0aGUgdmFyYXJnIG1ldGhvZAogICogcmVmZXJlbmNlIDxjb2RlPiNmdW4oRm9vLi4uKTwvY29kZT4gaXMgYWx3YXlzIGZvciB0aGUgdHlwZSBhcyAKICAqIHdyaXR0ZW47IGkuZS4sIHRoZSB0eXBlIGJpbmRpbmcgZm9yIDxjb2RlPkZvbzwvY29kZT4uIEhvd2V2ZXIsIGlmIHlvdQpAQCAtMTg1OCw3ICsxODU4LDcgQEAKICAqIHR5cGUgYmluZGluZyBmb3IgaXRzIGxhc3QgcGFyYW1ldGVyLCB0aGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgdmFyYXJnCiAgKiBwYXJhbWV0ZXIgaXMgYWx3YXlzIGFuIGFycmF5IHR5cGUgKGkuZS4sIDxjb2RlPkZvb1tdPC9jb2RlPikgcmVmbGVjdGluZwogICogdGhlIHdheSB2YXJhcmcgbWV0aG9kcyBnZXQgY29tcGlsZWQuCi0gKiA8L3A+CisgKiAKICAqIAogICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYXJpdHkgcGFyYW1ldGVyLAogICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKQEAgLTE4OTgsNyArMTg5OCw3IEBACiAgKi8KIGludCBJR05PUkVfUkVUVVJOX1RZUEUgPSAweDIwOwogPC9wcmU+Ci1Ob3RlIHRoYXQgdGhlc2UgZmxhZ3MgYXJlIGFjdGl2ZSBvbmx5IGZvciBzZWFyY2ggb2YgZGVjbGFyYXRpb25zIChpZS4gPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TPC9jb2RlPiBhbmQgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTPC9jb2RlPikKK05vdGUgdGhhdCB0aGVzZSBmbGFncyBhcmUgYWN0aXZlIG9ubHkgZm9yIHNlYXJjaCBvZiBkZWNsYXJhdGlvbnMgKGkuZS4gPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TPC9jb2RlPiBhbmQgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTPC9jb2RlPikKIGFuZCB3aGlsZSBzZWFyY2hpbmcgZm9yIElKYXZhRWxlbWVudCAoc2VlIGRvYyBvZiA8Y29kZT5TZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oSUphdmFFbGVtZW50LCBpbnQpPC9jb2RlPiBBUEkgbWV0aG9kKS4KIDwvbGk+CiA8bGk+SW1wcm92ZWQgQVBJIGZvciB0eXBlIG5hbWUgcmVxdWVzdG9yLiBBYnN0cmFjdCBjbGFzcyA8Y29kZT5UeXBlTmFtZVJlcXVlc3RvcjwvY29kZT4gcmVwbGFjZXMgaW50ZXJmYWNlIDxjb2RlPklUeXBlTmFtZVJlcXVlc3RvcjwvY29kZT4gd2hpY2ggaXMgZGVwcmVjYXRlZC48YnI+CkBAIC0yMDE0LDcgKzIwMTQsNyBAQAogPGEgbmFtZT0idl81NDAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gOHRoIE1hcmNoIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTQwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzU0MCI+Y3ZzPC9hPikuCkBAIC0yMDY0LDcgKzIwNjQsNyBAQAogPGEgbmFtZT0idl81MzkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMXN0IE1hcmNoIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTM5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzOSI+Y3ZzPC9hPikuCkBAIC0yMjE0LDcgKzIyMTQsNyBAQAogPGEgbmFtZT0idl81MzgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU02IC0gMjJuZCBGZWJydWFyeSAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUzOAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MzgiPmN2czwvYT4pLgpAQCAtMjI5OCw3ICsyMjk4LDcgQEAKIDxhIG5hbWU9InZfNTM3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNSAtIDE1dGggRmVicnVhcnkgMjAwNSAtIDMuMSBNSUxFU1RPTkUgNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MzcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTM3Ij5jdnM8L2E+KS4KQEAgLTIzMjYsNyArMjMyNiw3IEBACiA8YSBuYW1lPSJ2XzUzNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTUgLSAxNHRoIEZlYnJ1YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTM2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzNiI+Y3ZzPC9hPikuCkBAIC0yMzcyLDcgKzIzNzIsNyBAQAogPGEgbmFtZT0idl81MzUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gOHRoIEZlYnJ1YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTM1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzNSI+Y3ZzPC9hPikuCkBAIC0yNDU4LDcgKzI0NTgsNyBAQAogPGEgbmFtZT0idl81MzQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gMXN0IEZlYnJ1YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTM0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzNCI+Y3ZzPC9hPikuCkBAIC0yNTEzLDcgKzI1MTMsNyBAQAogPGEgbmFtZT0idl81MzMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gMjV0aCBKYW51YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTMzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzMyI+Y3ZzPC9hPikuCkBAIC0yNTc0LDcgKzI1NzQsNyBAQAogPGEgbmFtZT0idl81MzIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gMTh0aCBKYW51YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTMyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzMiI+Y3ZzPC9hPikuCkBAIC0yNjU4LDcgKzI2NTgsNyBAQAogPGEgbmFtZT0idl81MzEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gMTF0aCBKYW51YXJ5IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTMxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUzMSI+Y3ZzPC9hPikuCkBAIC0yNzM5LDcgKzI3MzksNyBAQAogPGEgbmFtZT0idl81MzAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU01IC0gNHRoIEphbnVhcnkgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MzAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTMwIj5jdnM8L2E+KS4KQEAgLTI4MTQsNyArMjgxNCw3IEBACiA8YSBuYW1lPSJ2XzUyOSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTQgLSAxNnRoIERlY2VtYmVyIDIwMDQgLSAzLjEgTUlMRVNUT05FIDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTI5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyOSI+Y3ZzPC9hPikuCkBAIC0yODUxLDcgKzI4NTEsNyBAQAogPGEgbmFtZT0idl81MjgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU00IC0gMTR0aCBEZWNlbWJlciAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUyOAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MjgiPmN2czwvYT4pLgpAQCAtMjg2OSw3ICsyODY5LDcgQEAKIDxhIG5hbWU9InZfNTI3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNCAtIDE0dGggRGVjZW1iZXIgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MjcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTI3Ij5jdnM8L2E+KS4KQEAgLTI4ODksNyArMjg4OSw3IEBACiA8YSBuYW1lPSJ2XzUyNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTQgLSAxM3RoIERlY2VtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTI2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyNiI+Y3ZzPC9hPikuCkBAIC0zMDE0LDcgKzMwMTQsNyBAQAogPGEgbmFtZT0idl81MjUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU00IC0gN3RoIERlY2VtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTI1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyNSI+Y3ZzPC9hPikuCkBAIC0zMTA0LDcgKzMxMDQsNyBAQAogPGEgbmFtZT0idl81MjQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU00IC0gMzB0aCBOb3ZlbWJlciAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUyNAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MjQiPmN2czwvYT4pLgpAQCAtMzIxMCw3ICszMjEwLDcgQEAKIDxhIG5hbWU9InZfNTIzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNNCAtIDIzcmQgTm92ZW1iZXIgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MjMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTIzIj5jdnM8L2E+KS4KQEAgLTMzMTEsNyArMzMxMSw3IEBACiA8YSBuYW1lPSJ2XzUyMiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTQgLSAxNnRoIE5vdmVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTIyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyMiI+Y3ZzPC9hPikuCkBAIC0zMzcyLDcgKzMzNzIsNyBAQAogPGEgbmFtZT0idl81MjEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU00IC0gOXRoIE5vdmVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTIxCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyMSI+Y3ZzPC9hPikuCkBAIC0zNDEwLDcgKzM0MTAsNyBAQAogPGEgbmFtZT0idl81MjAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gNHRoIE5vdmVtYmVyIDIwMDQgLSAzLjEgTUlMRVNUT05FIDMKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTIwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUyMCI+Y3ZzPC9hPikuCkBAIC0zNDI2LDcgKzM0MjYsNyBAQAogPGEgbmFtZT0idl81MTkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gNHRoIE5vdmVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxOSI+Y3ZzPC9hPikuCkBAIC0zNDQ3LDcgKzM0NDcsNyBAQAogPGEgbmFtZT0idl81MTgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gMm5kIE5vdmVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxOCI+Y3ZzPC9hPikuCkBAIC0zNDc4LDcgKzM0NzgsNyBAQAogPGEgbmFtZT0idl81MTciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gMm5kIE5vdmVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE3CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxNyI+Y3ZzPC9hPikuCkBAIC0zNTU3LDcgKzM1NTcsNyBAQAogPGEgbmFtZT0idl81MTYiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gMjZ0aCBPY3RvYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxNiI+Y3ZzPC9hPikuCkBAIC0zNjM0LDcgKzM2MzQsNyBAQAogPGEgbmFtZT0idl81MTUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gMTl0aCBPY3RvYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxNSI+Y3ZzPC9hPikuCkBAIC0zODE4LDcgKzM4MTgsNyBAQAogPGEgbmFtZT0idl81MTQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gMTJ0aCBPY3RvYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTE0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxNCI+Y3ZzPC9hPikuCkBAIC0zODcxLDcgKzM4NzEsNyBAQAogPGEgbmFtZT0idl81MTMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0zIC0gNXRoIE9jdG9iZXIgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MTMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTEzIj5jdnM8L2E+KS4KQEAgLTM5MDMsNyArMzkwMyw3IEBACiA8YSBuYW1lPSJ2XzUxMiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTMgLSAyOHRoIFNlcHRlbWJlciAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUxMgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MTIiPmN2czwvYT4pLgpAQCAtMzkyMyw3ICszOTIzLDcgQEAKIDxhIG5hbWU9InZfNTExIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNMiAtIDI0dGggU2VwdGVtYmVyIDIwMDQgLSAzLjEgTUlMRVNUT05FIDIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTExCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUxMSI+Y3ZzPC9hPikuCkBAIC0zOTM5LDcgKzM5MzksNyBAQAogPGEgbmFtZT0idl81MTAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0yIC0gMjNyZCBTZXB0ZW1iZXIgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MTAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTEwIj5jdnM8L2E+KS4KQEAgLTM5NzAsNyArMzk3MCw3IEBACiA8YSBuYW1lPSJ2XzUwOSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTIgLSAyMXN0IFNlcHRlbWJlciAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUwOQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MDkiPmN2czwvYT4pLgpAQCAtMzk5MSw3ICszOTkxLDcgQEAKIDxhIG5hbWU9InZfNTA4Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNMiAtIDIwdGggU2VwdGVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTA4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUwOCI+Y3ZzPC9hPikuCkBAIC00MDMzLDcgKzQwMzMsNyBAQAogPGEgbmFtZT0idl81MDciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0yIC0gMTR0aCBTZXB0ZW1iZXIgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MDcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTA3Ij5jdnM8L2E+KS4KQEAgLTQxMDMsNyArNDEwMyw3IEBACiA8YSBuYW1lPSJ2XzUwNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTIgLSA3dGggU2VwdGVtYmVyIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTA2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUwNiI+Y3ZzPC9hPikuCkBAIC00MTQzLDcgKzQxNDMsNyBAQAogPGEgbmFtZT0idl81MDUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0yIC0gMzFzdCBBdWd1c3QgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MDUKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTA1Ij5jdnM8L2E+KS4KQEAgLTQxNjAsNyArNDE2MCw3IEBACiA8YSBuYW1lPSJ2XzUwNCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTIgLSAzMXN0IEF1Z3VzdCAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzUwNAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl81MDQiPmN2czwvYT4pLgpAQCAtNDIwNCw3ICs0MjA0LDcgQEAKIDxhIG5hbWU9InZfNTAzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjFNMiAtIDI0dGggQXVndXN0IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTAzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUwMyI+Y3ZzPC9hPikuCkBAIC00MjY1LDcgKzQyNjUsNyBAQAogPGEgbmFtZT0idl81MDIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0xIC0gMTB0aCBBdWd1c3QgMjAwNCAtIDMuMSBNSUxFU1RPTkUgMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MDIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTAyIj5jdnM8L2E+KS4KQEAgLTQzMjAsNyArNDMyMCw3IEBACiA8YSBuYW1lPSJ2XzUwMSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4xTTEgLSAyN3RoIEp1bHkgMjAwNCAtIENvZGVuYW1lICJDaGVldGFoIgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl81MDEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNTAxIj5jdnM8L2E+KS4KQEAgLTQ0MDgsNyArNDQwOCw3IEBACiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk4MDAiPjY5ODAwPC9hPgogWzEuNV0gZWNsaXBzZSBmYWlscyB0byByZXBvcnQgaW5jb21wYXRpYmxlIHR5cGVzCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAyOTUiPjcwMjk1PC9hPgotWzEuNV0gbWV0aG9kKENsYXNzJmx0Oz8+KSBpcyBub3QgYXBwbGljYWJsZSBmb3IgQ2xhc3MmbHQ7PyBleHRlbmRzIE9iamVjdD4KK1sxLjVdIG1ldGhvZChDbGFzcyZsdDs/PikgaXMgbm90IGFwcGxpY2FibGUgZm9yIENsYXNzJmx0Oz8gZXh0ZW5kcyBPYmplY3QmZ3Q7CiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNDciPjcwMjQ3PC9hPgogWzEuNV0gTlBFIGluIFR5cGVWYXJpYWJsZUJpbmRpbmcKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODcyNiI+Njg3MjY8L2E+CkBAIC00NDk5LDcgKzQ0OTksNyBAQAogPGEgbmFtZT0idl81MDAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMU0xIC0gMjl0aCBKdW5lIDIwMDQgLSBDb2RlbmFtZSAiQ2hlZXRhaCIKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNTAwIChDaGVldGFoMDYpCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzUwMCI+Y3ZzPC9hPikuCkBAIC00NTI1LDcgKzQ1MjUsNyBAQAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4NDQwIj42ODQ0MDwvYT4KIFsxLjVdIFZlcmlmeUVycm9yIHdpdGggbmV3IGZvciBsb29wCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQxNTkiPjY0MTU5PC9hPgotWzEuNV0gY2FsbCB0byBhZGRBbGwoQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgVD4pIGluY29ycmVjdGx5IGRpc3NhbG93ZWQKK1sxLjVdIGNhbGwgdG8gYWRkQWxsKENvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIFQmZ3Q7KSBpbmNvcnJlY3RseSBkaXNzYWxvd2VkCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg2MDIiPjY4NjAyPC9hPgogWzEuNV0gQVNUIGNvbnZlcnRlciBmYWlscyBvbiBsb2NhbCB0eXBlcwogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NDI0Ij42NjQyNDwvYT4KQEAgLTQ1NjMsNyArNDU2Myw3IEBACiA8YSBuYW1lPSJ2XzQyOV9DaGVldGFoMDUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBFY2xpcHNlIFNESyAzLjFNMSAtIDE1dGggTWF5IDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDI5X0NoZWV0YWgwNQpAQCAtNDYwNSw3ICs0NjA1LDcgQEAKIDxhIG5hbWU9InZfNDIyX0NoZWV0YWgwNCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEVjbGlwc2UgU0RLIDMuMU0xIC0gMjN0aCBBcHJpbCAyMDA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzQyMl9DaGVldGFoMDQKQEAgLTQ2NDAsNyArNDY0MCw3IEBACiA8YSBuYW1lPSJ2XzQyMV9DaGVldGFoMDMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBFY2xpcHNlIFNESyAzLjFNMSAtIDE2dGggQXByaWwgMjAwNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl80MjFfQ2hlZXRhaDAzCkBAIC00Njc3LDcgKzQ2NzcsNyBAQAogPGEgbmFtZT0idl80MjFfQ2hlZXRhaDAyIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogRWNsaXBzZSBTREsgMy4xTTEgLSAxM3RoIEFwcmlsIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDIxX0NoZWV0YWgwMgpAQCAtNDcwMiw3ICs0NzAyLDcgQEAKIDxhIG5hbWU9InZfNDIwX0NoZWV0YWgwMSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEVjbGlwc2UgU0RLIDMuMU0xIC0gNHRoIEFwcmlsIDIwMDQKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNDIwX0NoZWV0YWgwMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjMyX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMl9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKaW5kZXggMzA3ZjNlZi4uMzc3ODdhYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjMyX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzJfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgICA8Zm9udCBzaXplPSIrMyI+PGI+amR0IGNvcmUgLSBidWlsZCBub3RlcyAzLjIgc3RyZWFtPC9iPjwvZm9udD4KICAgICA8L3RkPgogICA8L3RyPgotICA8dHI+PHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj48Zm9udCBzaXplPSItMiI+amF2YSBkZXZlbG9wbWVudCB0b29saW5nIGNvcmU8L2ZvbnQ+PC90ZD48L3RyPgorICA8dHI+PHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj48Zm9udCBzaXplPSItMiI+SmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9mb250PjwvdGQ+PC90cj4KICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CiAgIDx0cj4KICAgCTx0ZCBjbGFzcz0idGl0bGUzIj4KQEAgLTQ0LDcgKzQ0LDcgQEAKIDxhIG5hbWU9InZfNjcxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjIgLSA2dGggSnVuZSAyMDA2IC0gMy4yIFJFTEVBU0UgKFIzXzIpCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY3MQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NzEiPmN2czwvYT4pLgpAQCAtNTcsNyArNTcsNyBAQAogPGEgbmFtZT0idl82NzAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDNyAtIDJuZCBKdW5lIDIwMDYgLSAzLjIgUkVMRUFTRSBDQU5ESURBVEUgNwogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NzAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjcwIj5jdnM8L2E+KS4KQEAgLTcwLDcgKzcwLDcgQEAKIDxhIG5hbWU9InZfNjY5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJSQzcgLSAybmQgSnVuZSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2OQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjkiPmN2czwvYT4pLgpAQCAtODUsNyArODUsNyBAQAogPGEgbmFtZT0idl82NjgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDNiAtIDI2dGggTWF5IDIwMDYgLSAzLjIgUkVMRUFTRSBDQU5ESURBVEUgNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NjgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjY4Ij5jdnM8L2E+KS4KQEAgLTEwMCw3ICsxMDAsNyBAQAogPGEgbmFtZT0idl82NjciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDNSAtIDE5dGggTWF5IDIwMDYgLSAzLjIgUkVMRUFTRSBDQU5ESURBVEUgNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NjcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjY3Ij5jdnM8L2E+KS4KQEAgLTEyMyw3ICsxMjMsNyBAQAogPGEgbmFtZT0idl82NjYiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDNCAtIDExdGggTWF5IDIwMDYgLSAzLjIgUkVMRUFTRSBDQU5ESURBVEUgNAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NjYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjY2Ij5jdnM8L2E+KS4KQEAgLTE1Miw3ICsxNTIsNyBAQAogPGEgbmFtZT0idl82NjUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDMyAtIDV0aCBNYXkgMjAwNiAtIDMuMiBSRUxFQVNFIENBTkRJREFURSAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2NQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjUiPmN2czwvYT4pLgpAQCAtMTY1LDcgKzE2NSw3IEBACiA8YSBuYW1lPSJ2XzY2NCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMzIC0gNHRoIE1heSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2NAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjQiPmN2czwvYT4pLgpAQCAtMTc4LDcgKzE3OCw3IEBACiA8YSBuYW1lPSJ2XzY2MyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMzIC0gNHRoIE1heSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjMiPmN2czwvYT4pLgpAQCAtMTk1LDcgKzE5NSw3IEBACiA8YSBuYW1lPSJ2XzY2MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMzIC0gMm5kIE1heSAyMDA2IAogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NjIKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjYyIj5jdnM8L2E+KS4KQEAgLTIyMyw3ICsyMjMsNyBAQAogPGEgbmFtZT0idl82NjEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDMiAtIDI4dGggQXByaWwgMjAwNiAtIDMuMiBSRUxFQVNFIENBTkRJREFURSAyCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2MQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjEiPmN2czwvYT4pLgpAQCAtMjM2LDcgKzIzNiw3IEBACiA8YSBuYW1lPSJ2XzY2MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMyIC0gMjd0aCBBcHJpbCAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY2MAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NjAiPmN2czwvYT4pLgpAQCAtMjUzLDcgKzI1Myw3IEBACiA8YnI+PGEgbmFtZT0idl82NTkiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDMiAtIDI3dGggQXByaWwgMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NTkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjU5Ij5jdnM8L2E+KS4KQEAgLTM1MSw3ICszNTEsNyBAQAogPGEgbmFtZT0idl82NTgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDMSAtIDEzdGggQXByaWwgMjAwNiAtIDMuMiBSRUxFQVNFIENBTkRJREFURSAxCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY1OAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NTgiPmN2czwvYT4pLgpAQCAtMzY2LDcgKzM2Niw3IEBACiA8YSBuYW1lPSJ2XzY1NyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMxIC0gMTJ0aCBBcHJpbCAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY1NwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NTciPmN2czwvYT4pLgpAQCAtMzgyLDcgKzM4Miw3IEBACiA8YSBuYW1lPSJ2XzY1NiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yUkMxIC0gMTJ0aCBBcHJpbCAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY1NgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NTYiPmN2czwvYT4pLgpAQCAtNDY0LDcgKzQ2NCw3IEBACiA8YSBuYW1lPSJ2XzY1NWEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMlJDMSAtIDV0aCBBcHJpbCAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY1NWEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjU1YSI+Y3ZzPC9hPikuCkBAIC00OTYsNyArNDk2LDcgQEAKIDxhIG5hbWU9InZfNjU0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJSQzEgLSA0dGggQXByaWwgMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NTQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjU0Ij5jdnM8L2E+KS4KQEAgLTUzMCw3ICs1MzAsNyBAQAogPGEgbmFtZT0idl82NTMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk02IC0gMzB0aCBNYXJjaCAyMDA2IC0gMy4yIE1JTEVTVE9ORSA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY1MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NTMiPmN2czwvYT4pLgpAQCAtNTQ0LDcgKzU0NCw3IEBACiA8YSBuYW1lPSJ2XzY1MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTYgLSAyOXRoIE1hcmNoIDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjUyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzY1MiI+Y3ZzPC9hPikuCkBAIC01NjAsNyArNTYwLDcgQEAKIDxhIG5hbWU9InZfNjUxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNiAtIDI5dGggTWFyY2ggMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NTEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjUxIj5jdnM8L2E+KS4KQEAgLTU4Niw3ICs1ODYsNyBAQAogPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxOTM1Ij4xMzE5MzU8L2E+CiBbMS41XVtjb21waWxlcl0gSWxsZWdhbCBnZW5lcmljIGNvbnZlcnNpb24gYWxsb3dlZC4KIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkwODIiPjEyOTA4MjwvYT4KLVtyZWdyZXNzaW9uXSBSZWZyZXNoLT5SdW4gYWN0aW9uIGRlbGV0ZXMgYWxsIGZpbGVzIGluICdiaW4nIGRpcmVjdG9yeSBhbmQgcmVjb21waWxlcyBhbGwgY2xhc3NlcworW3JlZ3Jlc3Npb25dIFJlZnJlc2gtJmd0O1J1biBhY3Rpb24gZGVsZXRlcyBhbGwgZmlsZXMgaW4gJ2JpbicgZGlyZWN0b3J5IGFuZCByZWNvbXBpbGVzIGFsbCBjbGFzc2VzCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNjEzIj4xMzI2MTM8L2E+CiBOUEUgaW4gamF2YSBidWlsZGVyIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGEgZmlsZQogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjA5MCI+MTA2MDkwPC9hPgpAQCAtNTk5LDcgKzU5OSw3IEBACiA8YSBuYW1lPSJ2XzY1MCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTYgLSAyN3RoIE1hcmNoIDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjUwCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzY1MCI+Y3ZzPC9hPikuCkBAIC02MjUsNyArNjI1LDcgQEAKIDxhIG5hbWU9InZfNjQ5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNiAtIDI2dGggTWFyY2ggMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NDkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjQ5Ij5jdnM8L2E+KS4KQEAgLTY1NSw3ICs2NTUsNyBAQAogPGEgbmFtZT0idl82NDgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk02IC0gMjJuZCBNYXJjaCAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY0OAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NDgiPmN2czwvYT4pLgpAQCAtNjY4LDcgKzY2OCw3IEBACiA8YSBuYW1lPSJ2XzY0NyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTYgLSAyMXN0IE1hcmNoIDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjQ3CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzY0NyI+Y3ZzPC9hPikuCkBAIC03MDMsNyArNzAzLDcgQEAKIDxhIG5hbWU9InZfNjQ2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNiAtIDE0dGggTWFyY2ggMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NDYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjQ2Ij5jdnM8L2E+KS4KQEAgLTczOCw3ICs3MzgsNyBAQAogPGEgbmFtZT0idl82NDUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk02IC0gN3RoIE1hcmNoIDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjQ1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzY0NSI+Y3ZzPC9hPikuCkBAIC03OTgsNyArNzk4LDcgQEAKIDxhIG5hbWU9InZfNjQ0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNiAtIDI4dGggRmVicnVhcnkgMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NDQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjQ0Ij5jdnM8L2E+KS4KQEAgLTg3Nyw3ICs4NzcsNyBAQAogPGEgbmFtZT0idl82NDMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk02IC0gMjFzdCBGZWJydWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY0MwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NDMiPmN2czwvYT4pLgpAQCAtOTI0LDcgKzkyNCw3IEBACiA8YSBuYW1lPSJ2XzY0MiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTUgLSAxNnRoIEZlYnJ1YXJ5IDIwMDYgLSAzLjIgTUlMRVNUT05FIDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjQyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzY0MiI+Y3ZzPC9hPikuCkBAIC05NDIsNyArOTQyLDcgQEAKIDxhIG5hbWU9InZfNjQxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNSAtIDE1dGggRmVicnVhcnkgMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82NDEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjQxIj5jdnM8L2E+KS4KQEAgLTk2NCw3ICs5NjQsNyBAQAogPGEgbmFtZT0idl82NDAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk01IC0gMTV0aCBGZWJydWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzY0MAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82NDAiPmN2czwvYT4pLgpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIDxhIG5hbWU9InZfNjM5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNSAtIDEzdGggRmVicnVhcnkgMjAwNgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MzkKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjM5Ij5jdnM8L2E+KS4KQEAgLTEwNDAsNyArMTA0MCw3IEBACiA8YSBuYW1lPSJ2XzYzOCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTUgLSAxM3RoIEZlYnJ1YXJ5IDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjM4CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYzOCI+Y3ZzPC9hPikuCkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogPGEgbmFtZT0idl82MzciPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk01IC0gMTB0aCBGZWJydWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYzNwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MzciPmN2czwvYT4pLgpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIDxhIG5hbWU9InZfNjM2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNSAtIDd0aCBGZWJydWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYzNgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MzYiPmN2czwvYT4pLgpAQCAtMTIzMCw3ICsxMjMwLDcgQEAKIDxhIG5hbWU9InZfNjM1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNSAtIDMxc3QgSmFudWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYzNQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MzUiPmN2czwvYT4pLgpAQCAtMTI5OCw3ICsxMjk4LDcgQEAKIDxhIG5hbWU9InZfNjM0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNSAtIDI0dGggSmFudWFyeSAyMDA2CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYzNAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MzQiPmN2czwvYT4pLgpAQCAtMTMxMyw3ICsxMzEzLDcgQEAKIAkgV2hlbiBub3QgcHJlc2VudCwgPGNvZGU+ImZhbHNlIjwvY29kZT4gaXMgYXNzdW1lZC4gSWYgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4sIAogCSB0aGUgY2xhc3NwYXRoIGVudHJ5IGlzIG9wdGlvbmFsLiA8L2xpPgogPGxpPkFkZGVkIHN1cHBvcnQgZm9yIHN0YXRlbWVudCByZWNvdmVyeSBpbiBQYXJzZXI8YnI+Ci0JIEN1cnJlbnRseSB0aGlzIG5ldyBiZWhhdmlvciBpcyBpbmNvbXBsZXRlIChtYXBwaW5nIG5vbi10ZXJtaW5hbHMgLT4gdGVybWluYWxzKSBhbmQgZGlzYWJsZWQuIFRoZSBvcHRpb24gSmF2YUNvcmUuQ09NUElMRVJfU1RBVEVNRU5UU19SRUNPVkVSWSBtdXN0IGJlIHNldCB0byBFTkFCTEVEIHRvIHVzZSBpdCAoSXQncyBhIHRlbXBvcmFyeSBvcHRpb24pLjwvbGk+CisJIEN1cnJlbnRseSB0aGlzIG5ldyBiZWhhdmlvciBpcyBpbmNvbXBsZXRlIChtYXBwaW5nIG5vbi10ZXJtaW5hbHMgLSZndDsgdGVybWluYWxzKSBhbmQgZGlzYWJsZWQuIFRoZSBvcHRpb24gSmF2YUNvcmUuQ09NUElMRVJfU1RBVEVNRU5UU19SRUNPVkVSWSBtdXN0IGJlIHNldCB0byBFTkFCTEVEIHRvIHVzZSBpdCAoSXQncyBhIHRlbXBvcmFyeSBvcHRpb24pLjwvbGk+CiA8bGk+QWRkZWQgQVBJIGZvciBET00gQVNUTm9kZSBmbGFnOiA8Y29kZT5BU1ROb2RlLlJFQ09WRVJFRDwvY29kZT48YnI+CiAJIEl0IGlzIGEgZmxhZyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBub2RlIG9yIGEgcGFydCBvZiB0aGlzIG5vZGUgaXMgcmVjb3ZlcmVkCiAJIGZyb20gc291cmNlIHRoYXQgY29udGFpbnMgYSBzeW50YXggZXJyb3IgZGV0ZWN0ZWQgaW4gdGhlIHZpY2luaXR5LjwvbGk+CkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogPGEgbmFtZT0idl82MzMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk01IC0gMTd0aCBKYW51YXJ5IDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjMzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYzMyI+Y3ZzPC9hPikuCkBAIC0xNDA1LDcgKzE0MDUsNyBAQAogPGEgbmFtZT0idl82MzIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk01IC0gMTB0aCBKYW51YXJ5IDIwMDYKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjMyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYzMiI+Y3ZzPC9hPikuCkBAIC0xNTA2LDcgKzE1MDYsNyBAQAogPGEgbmFtZT0idl82MzEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk00IC0gMTR0aCBEZWNlbWJlciAyMDA1IC0gMy4yIE1JTEVTVE9ORSA0CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYzMQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MzEiPmN2czwvYT4pLgpAQCAtMTUyMSw3ICsxNTIxLDcgQEAKIDxhIG5hbWU9InZfNjMwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDE0dGggRGVjZW1iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MzAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjMwIj5jdnM8L2E+KS4KQEAgLTE1MzUsNyArMTUzNSw3IEBACiA8YSBuYW1lPSJ2XzYyOSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTQgLSAxM3RoIERlY2VtYmVyIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjI5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYyOSI+Y3ZzPC9hPikuCkBAIC0xNTYzLDcgKzE1NjMsNyBAQAogPGEgbmFtZT0idl82MjgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk00IC0gMTJ0aCBEZWNlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYyOAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MjgiPmN2czwvYT4pLgpAQCAtMTU3Nyw3ICsxNTc3LDcgQEAKIDxhIG5hbWU9InZfNjI3Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDl0aCBEZWNlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYyNwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MjciPmN2czwvYT4pLgpAQCAtMTYwNyw3ICsxNjA3LDcgQEAKIDxhIG5hbWU9InZfNjI2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDZ0aCBEZWNlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYyNgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MjYiPmN2czwvYT4pLgpAQCAtMTYyMyw3ICsxNjIzLDcgQEAKIDxhIG5hbWU9InZfNjI1Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDZ0aCBEZWNlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYyNQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MjUiPmN2czwvYT4pLgpAQCAtMTc1Myw3ICsxNzUzLDcgQEAKIDxhIG5hbWU9InZfNjI0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDI5dGggTm92ZW1iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MjQKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjI0Ij5jdnM8L2E+KS4KQEAgLTE4NjEsNyArMTg2MSw3IEBACiA8YSBuYW1lPSJ2XzYyMyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTQgLSAyMm5kIE5vdmVtYmVyIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjIzCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYyMyI+Y3ZzPC9hPikuCkBAIC0xOTc0LDcgKzE5NzQsNyBAQAogPGEgbmFtZT0idl82MjIiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk00IC0gMTZ0aCBOb3ZlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYyMgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MjIiPmN2czwvYT4pLgpAQCAtMTk5Niw3ICsxOTk2LDcgQEAKIDxhIG5hbWU9InZfNjIxIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNNCAtIDE1dGggTm92ZW1iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MjEKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjIxIj5jdnM8L2E+KS4KQEAgLTIxMTcsNyArMjExNyw3IEBACiA8YSBuYW1lPSJ2XzYyMCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTQgLSA4dGggTm92ZW1iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MjAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjIwIj5jdnM8L2E+KS4KQEAgLTIyMTUsNyArMjIxNSw3IEBACiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzOTQ1Ij4xMTM5NDU8L2E+CiBObyBjb2RlYXNzaXN0IGluIGFub255bW91cyBjbGFzcyBpbiBnZW5lcmljcwogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDA4NiI+MTE0MDg2PC9hPgotUmVmYWN0b3ItPlJlbmFtZSBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgZmFpbHMgd2l0aCAiLTEiIHdoZW4gQ29kZSBTdHlsZS0+RmllbGRzIHByZWZpeCBsaXN0IGhhcyBkYW5nbGluZyAiLCIKK1JlZmFjdG9yLSZndDtSZW5hbWUgb2YgaW5zdGFuY2UgdmFyaWFibGVzIGZhaWxzIHdpdGggIi0xIiB3aGVuIENvZGUgU3R5bGUtJmd0O0ZpZWxkcyBwcmVmaXggbGlzdCBoYXMgZGFuZ2xpbmcgIiwiCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzQxIj4xMTQzNDE8L2E+CiBbamF2YWRvY11bYXNzaXN0XSByYW5nZSBvZiB0aGUgcXVhbGlmaWVkIHR5cGUgY29tcGxldGlvbiBpbiBqYXZhZG9jIHRleHQgaXNuJ3QgY29ycmVjdAogPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDMzOCI+MTE0MzM4PC9hPgpAQCAtMjIzNyw3ICsyMjM3LDcgQEAKIDxhIG5hbWU9InZfNjE5Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMyAtIDMxc3QgT2N0b2JlciAyMDA1IC0gMy4yIE1JTEVTVE9ORSAzCiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYxOQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MTkiPmN2czwvYT4pLgpAQCAtMjI2NCwxMCArMjI2NCwxMCBAQAogICogRm9yIGV4YW1wbGU6CiAgKiAgLSBwYXR0ZXJuID0gIk5QRSIKICAqICAgIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICogICAgcmVzdWx0ID0+IHRydWUKKyAqICAgIHJlc3VsdCA9Jmd0OyB0cnVlCiAgKiAgLSBwYXR0ZXJuID0gIm5wZSIKICAqICAgIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICogICAgcmVzdWx0ID0+IGZhbHNlCisgKiAgICByZXN1bHQgPSZndDsgZmFsc2UKICAqCiAgKiBAc2VlIENoYXJPcGVyYXRpb24jY2FtZWxDYXNlTWF0Y2goY2hhcltdLCBjaGFyW10pCiAgKiAJSW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZW50aXJlbHkgY29waWVkIGZyb20gdGhpcyBtZXRob2QgZXhjZXB0IGZvciBhcnJheSBsZW5ndGhlcwpAQCAtMjMwMywxNCArMjMwMywxNCBAQAogICogICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCiAgKiAgICBuYW1lU3RhcnQgPSAwCiAgKiAgICBuYW1lRW5kID0gMjAKLSAqICAgIHJlc3VsdCA9PiB0cnVlCisgKiAgICByZXN1bHQgPSZndDsgdHJ1ZQogICogIC0gcGF0dGVybiA9ICJucGUiCiAgKiAgICBwYXR0ZXJuU3RhcnQgPSAxCiAgKiAgICBwYXR0ZXJuRW5kID0gMwogICogICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCiAgKiAgICBuYW1lU3RhcnQgPSAwCiAgKiAgICBuYW1lRW5kID0gMjAKLSAqICAgIHJlc3VsdCA9PiBmYWxzZQorICogICAgcmVzdWx0ID0mZ3Q7IGZhbHNlCiAgKgogICogQHNlZSBDaGFyT3BlcmF0aW9uI2NhbWVsQ2FzZU1hdGNoKGNoYXJbXSwgaW50LCBpbnQsIGNoYXJbXSwgaW50LCBpbnQpCiAgKiAJSW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZW50aXJlbHkgY29waWVkIGZyb20gdGhpcyBtZXRob2QgZXhjZXB0IGZvciBhcnJheSBsZW5ndGhlcwpAQCAtMjMzMCw3ICsyMzMwLDcgQEAKIC8qKgogICogVmFsaWRhdGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGdpdmVuIHN0cmluZyBwYXR0ZXJuIGFuZCBtYXRjaCBydWxlLgogICoKLSAqIE9wdGltaXplZCAoaWUuIHJldHVybmVkIG1hdGNoIHJ1bGUgaXMgbW9kaWZpZWQpIGNvbWJpbmF0aW9ucyBhcmU6CisgKiBPcHRpbWl6ZWQgKGkuZS4gcmV0dXJuZWQgbWF0Y2ggcnVsZSBpcyBtb2RpZmllZCkgY29tYmluYXRpb25zIGFyZToKICAqICAtIHtAbGluayAjUl9QQVRURVJOX01BVENIfSB3aXRob3V0IGFueSAnKicgb3IgJz8nIGluIHN0cmluZyBwYXR0ZXJuOgogICogCQlwYXR0ZXJuIG1hdGNoIGJpdCBpcyB1bnNldCwKICAqIAktIHtAbGluayAjUl9QQVRURVJOX01BVENIfSBhbmQge0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gIGJpdHMgc2ltdWx0YW5lb3VzbHkgc2V0OgpAQCAtMjM0Miw3ICsyMzQyLDcgQEAKICAqIAktIHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9IGNvbWJpbmVkIHdpdGgge0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gYW5kIHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX0KICAqIAkJYml0cyBpcyByZWR1Y2VkIHRvIG9ubHkge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0gYXMgQ2FtZWwgQ2FzZSBzZWFyY2ggaXMgYWxyZWFkeSBwcmVmaXggYW5kIGNhc2Ugc2Vuc2l0aXZlLgogICoKLSAqIFJlamVjdGVkIChpZS4gcmV0dXJuZWQgbWF0Y2ggcnVsZSAtMSkgY29tYmluYXRpb25zIGFyZToKKyAqIFJlamVjdGVkIChpLmUuIHJldHVybmVkIG1hdGNoIHJ1bGUgLTEpIGNvbWJpbmF0aW9ucyBhcmU6CiAgKiAJLSB7QGxpbmsgI1JfUkVHRVhQX01BVENIfSB3aXRoIGFueSBvdGhlciBtYXRjaCBtb2RlIGJpdCBzZXQuCiAgKgogICogQHBhcmFtIHN0cmluZ1BhdHRlcm4gVGhlIHN0cmluZyBwYXR0ZXJuCkBAIC0yMzU1LDcgKzIzNTUsNyBAQAogPGxpPkFkZGVkIENhbWVsIENhc2Ugc3VwcG9ydCBpbiBjb21wbGV0aW9uLgogV2hlbiB5b3UgcGVyZm9ybSBjb2RlIGNvbXBsZXRlLCB0aGUgcHJvcG9zYWxzIGxpc3QgY29udGFpbnMgcHJvcG9zYWxzIHdob3NlIG5hbWUgbWF0Y2ggd2l0aCB0aGUgY2FtZWwgY2FzZSBwYXR0ZXJuLgogPGJyPgotZWcuIGEgcG9zc2libGUgcHJvcG9zYWwgZm9yIFRUfCBpcyBUb1RvLgorZS5nLiBhIHBvc3NpYmxlIHByb3Bvc2FsIGZvciBUVHwgaXMgVG9Uby4KIDwvbGk+CiA8bGk+QWRkZWQgb3B0aW9uIHRvIGNvbnRyb2wgQ2FtZWwgQ2FzZSBjb21wbGV0aW9uLgogPHByZT4KQEAgLTIzOTksNyArMjM5OSw3IEBACiA8YSBuYW1lPSJ2XzYxOCI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTMgLSAyNXRoIE9jdG9iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MTgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjE4Ij5jdnM8L2E+KS4KQEAgLTI1ODEsNyArMjU4MSw3IEBACiA8YSBuYW1lPSJ2XzYxNyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTMgLSAxOHRoIE9jdG9iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MTcKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjE3Ij5jdnM8L2E+KS4KQEAgLTI2NjgsNyArMjY2OCw3IEBACiA8YSBuYW1lPSJ2XzYxNiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTMgLSAxMXRoIE9jdG9iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MTYKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjE2Ij5jdnM8L2E+KS4KQEAgLTI3NzgsNyArMjc3OCw3IEBACiA8YSBuYW1lPSJ2XzYxNSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTMgLSA0dGggT2N0b2JlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYxNQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MTUiPmN2czwvYT4pLgpAQCAtMjg1Miw3ICsyODUyLDcgQEAKIDxhIG5hbWU9InZfNjE0Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMyAtIDI3dGggU2VwdGVtYmVyIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjE0CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYxNCI+Y3ZzPC9hPikuCkBAIC0yODk0LDcgKzI4OTQsNyBAQAogPGEgbmFtZT0idl82MTMiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0yIC0gMjFzdCBTZXB0ZW1iZXIgMjAwNSAtIDMuMiBNSUxFU1RPTkUgMgogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MTMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjEzIj5jdnM8L2E+KS4KQEAgLTI5MDgsNyArMjkwOCw3IEBACiA8YSBuYW1lPSJ2XzYxMiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTIgLSAxOXRoIFNlcHRlbWJlciAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYxMgogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MTIiPmN2czwvYT4pLgpAQCAtMjkzMCw3ICsyOTMwLDcgQEAKIDxhIG5hbWU9InZfNjExIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMiAtIDE2dGggU2VwdGVtYmVyIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjExCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYxMSI+Y3ZzPC9hPikuCkBAIC0yOTQ2LDcgKzI5NDYsNyBAQAogPGEgbmFtZT0idl82MTAiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0yIC0gMTN0aCBTZXB0ZW1iZXIgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MTAKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjEwIj5jdnM8L2E+KS4KQEAgLTI5ODMsNyArMjk4Myw3IEBACiA8YSBuYW1lPSJ2XzYwOSI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTIgLSA2dGggU2VwdGVtYmVyIDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjA5CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYwOSI+Y3ZzPC9hPikuCkBAIC0zMDM1LDcgKzMwMzUsNyBAQAogPGEgbmFtZT0idl82MDgiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0yIC0gMzB0aCBBdWd1c3QgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MDgKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjA4Ij5jdnM8L2E+KS4KQEAgLTMwNjMsNyArMzA2Myw3IEBACiA8YSBuYW1lPSJ2XzYwNyI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTIgLSAyM3JkIEF1Z3VzdCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYwNwogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MDciPmN2czwvYT4pLgpAQCAtMzEwMCw3ICszMTAwLDcgQEAKIDxhIG5hbWU9InZfNjA2Ij48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMiAtIDE2dGggQXVndXN0IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjA2CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYwNiI+Y3ZzPC9hPikuCkBAIC0zMTYyLDcgKzMxNjIsNyBAQAogPGEgbmFtZT0idl82MDUiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0xIC0gMTB0aCBBdWd1c3QgMjAwNSAtIDMuMiBNSUxFU1RPTkUgMSAKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjA1CiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYwNSI+Y3ZzPC9hPikuCkBAIC0zMTc3LDcgKzMxNzcsNyBAQAogPGEgbmFtZT0idl82MDQiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0xIC0gOXRoIEF1Z3VzdCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYwNAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MDQiPmN2czwvYT4pLgpAQCAtMzE5Miw3ICszMTkyLDcgQEAKIDxhIG5hbWU9InZfNjAzIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMSAtIDh0aCBBdWd1c3QgMjAwNQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl82MDMKICg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNjAzIj5jdnM8L2E+KS4KQEAgLTMyMDcsNyArMzIwNyw3IEBACiA8YSBuYW1lPSJ2XzYwMiI+PC9hPgogPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4yTTEgLSAybmQgQXVndXN0IDIwMDUKIDxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNjAyCiAoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzYwMiI+Y3ZzPC9hPikuCkBAIC0zMjMwLDcgKzMyMzAsNyBAQAogPGEgbmFtZT0idl82MDEiPjwvYT4KIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KIEVjbGlwc2UgU0RLIDMuMk0xIC0gMm5kIEF1Z3VzdCAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYwMQogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MDEiPmN2czwvYT4pLgpAQCAtMzI0OSw3ICszMjQ5LDcgQEAKIDxhIG5hbWU9InZfNjAwIj48L2E+CiA8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CiBFY2xpcHNlIFNESyAzLjJNMSAtIDI2dGggSnVseSAyMDA1CiA8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzYwMAogKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl82MDAiPmN2czwvYT4pLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjMzX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzM19idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhNjM2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzM19idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTAsMCArMSwzMjIxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDx0aXRsZT5KRFQvQ29yZSBSZWxlYXNlIE5vdGVzIDMuMzwvdGl0bGU+CisgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImpkdF9jb3JlX3N0eWxlLmNzcyIgY2hhcnNldD0iaXNvLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI3MiUiIGNsYXNzPSJ0aXRsZTEiPgorICAgICAgPGZvbnQgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMy4zIHN0cmVhbTwvYj48L2ZvbnQ+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPjx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+PGZvbnQgc2l6ZT0iLTIiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD48L3RkPjwvdHI+CisgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICA8dHI+CisgIAk8dGQgY2xhc3M9InRpdGxlMyI+CisJICA8Zm9udCBzaXplPSItMSI+CisJICBIZXJlIGFyZSB0aGUgYnVpbGQgbm90ZXMgZm9yIHRoZSBFY2xpcHNlIEpEVC9Db3JlIHBsdWctaW4gcHJvamVjdAorCSAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9pbmRleC5waHAiPjxiPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9iPjwvYT4sCisJICBkZXNjcmliaW5nIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MiIHRhcmdldD1uZXc+YnVnPC9hPiByZXNvbHV0aW9uIGFuZCBzdWJzdGFudGlhbCBjaGFuZ2VzIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlIj48Yj5IRUFEPC9iPjwvYT4gYnJhbmNoLgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gMy4zIHBsYW5uaW5nLCBwbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9yMy4zL2luZGV4LnBocCNyZWxlYXNlLXBsYW4iPkpEVC9Db3JlIHJlbGVhc2UgcGxhbjwvYT4sCisJICB0aGUgbmV4dCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjMvaW5kZXgucGhwI21pbGVzdG9uZS1wbGFuIj5taWxlc3RvbmUgcGxhbjwvYT4sCisJICB0aGUgb3ZlcmFsbCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvZGV2ZWxvcG1lbnQvZWNsaXBzZV9wcm9qZWN0X3BsYW5fM18yLmh0bWwiPm9mZmljaWFsIHBsYW48L2E+LAorCSAgb3IgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9wbGF0Zm9ybS1yZWxlbmcvYnVpbGRTY2hlZHVsZS5odG1sIj5idWlsZCBzY2hlZHVsZTwvYT4uCisJICA8IS0tCisJICBUaGlzIHByZXNlbnQgZG9jdW1lbnQgY292ZXJzIGFsbCBjaGFuZ2VzIHNpbmNlIFJlbGVhc2UgMy4wIChhbHNvIHNlZSBhIHN1bW1hcnkgb2YgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9BUElfY2hhbmdlcy5odG1sIj5BUEkgY2hhbmdlczwvYT4pLgorCSAgT2xkZXIgY2hhbmdlcyB3aGljaCBvY2N1cnJlZCB1cCB0byBSZWxlYXNlIDMuMCBjYW4gYmUgZm91bmQgaW4KKwkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIxX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCI+YnVpbGQgbm90ZXMgUjIuMTwvYT4uCisJICAtLT4KKwkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgc2luY2UgUmVsZWFzZSAzLjIgKGFsc28gc2VlIGEgc3VtbWFyeSBvZiA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwiPkFQSSBjaGFuZ2VzPC9hPikuCisJICA8YnI+TWFpbnRlbmFuY2Ugb2YgcHJldmlvdXMgcmVsZWFzZXMgb2YgSkRUL0NvcmUgaXMgcGVyZm9ybWVkIGluIHBhcmFsbGVsIGJyYW5jaGVzOgorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfMl9tYWludGVuYW5jZSI+UjMuMi54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzFfbWFpbnRlbmFuY2UiPlIzLjEueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18wX21haW50ZW5hbmNlIj5SMy4wLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjJfMV9tYWludGVuYW5jZSI+UjIuMS54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIyXzBfMSI+UjIuMC54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPUVDTElQU0VfMV8wIj5SMS4wLng8L2E+LgorCSAgPC9mb250PgorCTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGEgbmFtZT0idl83NzEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuMyAtIEp1bmUgMjEsIDIwMDcgLSAzLjMgUkVMRUFTRQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NzEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzcxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkzNTcwIj4xOTM1NzA8L2E+CithZGQgZWNsaXBzZS5pbmYgdG8gdG9wIGxldmVsIGRpcmVjdG9yeSBvZiBqZHQuY29yZQorCis8YSBuYW1lPSJ2Xzc3MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkM0IC0gSnVuZSA1LCAyMDA3IC0gMy4zIFJFTEVBU0UgQ0FORElEQVRFIDQKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzcwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc3MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDc0OCI+MTkwNzQ4PC9hPgorWzEuNV1bY29tcGlsZXJdIEFic3RyYWN0TWV0aG9kRXJyb3Igb24gZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBkZXJpdmVkIEludGVyZmFjZSBkZWNsYXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTkzMyI+MTg5OTMzPC9hPgorW2NvbXBpbGVyXVsxLjVdIGV4dHJhbmVvdXMgYW1iaWd1b3VzIGNvbnN0cnVjdG9yIGVycm9yIG9uIGdlbmVyaWNzCisKKzxhIG5hbWU9InZfNzY5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNSQzQgLSBKdW5lIDQsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzY5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2OSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDQ5MyI+MTkwNDkzPC9hPgorWzEuNl1bY29tcGlsZXJdIENvbXBpbGluZyBmb3IgMS42IHNob3VsZCBub3QgcmVxdWlyZSBjb21waWxlciB0byBydW4gb24gMS42IGl0c2VsZgorCisKKzxhIG5hbWU9InZfNzY4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNSQzMgLSBNYXkgMzAsIDIwMDcgLSAzLjMgUkVMRUFTRSBDQU5ESURBVEUgMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzY4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5NTQ3Ij4xODk1NDc8L2E+CitQb3NzaWJsZSByZXNvdXJjZSBsZWFrIGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5ODUyIj4xODk4NTI8L2E+CitbcGVyZnNdIFRvbyBtYW55IEpEVC9Db3JlIHBlcmZvcm1hbmNlIHRlc3RzIGluIGZpbmdlcnByaW50cworCis8YSBuYW1lPSJ2Xzc2NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkMzIC0gTWF5IDI5LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk0NTYiPjE4OTQ1NjwvYT4KK0Zvcm1hdHRlciBpcyBzbG93IG9uICBiaWcgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgxMDUiPjE4ODEwNTwvYT4KK29yZy5lY2xpcHNlLmpkdC5hcHQucGx1Z2dhYmxlLmNvcmUgaW1wb3J0ZWQgYXMgc291cmNlIGRvZXMgbm90IGNvbXBpbGUKKworPGEgbmFtZT0idl83NjYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM1JDMiAtIE1heSAyNSwgMjAwNyAtIDMuMyBSRUxFQVNFIENBTkRJREFURSAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2NgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5UaGUgbmV3IEFQSSA8Y29kZT5Ub29sRmFjdG9yeSNjcmVhdGVDb2RlRm9ybWF0dGVyKE1hcCBvcHRpb25zLCBpbnQgbW9kZSk8L2NvZGU+IGFsbG93cyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGNvZGUKKyAgICAgIGZvcm1hdHRlciBpcyBnb2luZyB0byBmb3JtYXQgbmV3IGNvZGUgb3IgZXhpc3RpbmcgY29kZS48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODg5NjAiPjE4ODk2MDwvYT4KK1sxLjVdW2NvbXBpbGVyXURvIG5vdCBkZXRlY3QgZHVwbGljYXRlIGNvbnN0cnVjdG9ycyBpbiBhIFBhcmFtZXRlcml6ZWRUeXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1OTI4Ij4xODU5Mjg8L2E+CitOZXcgRm9ybWF0dGVyIE9wdGlvbiAmcXVvdDtOZXZlciBpbmRlbnQgY29tbWVudHMgb24gZmlyc3QgY29sdW1uJnF1b3Q7IGJyZWFrcyBmb3JtYXR0aW5nIG9mIGF1dG8gZ2VuZXJhdGVkIGJvZGllcworCis8YSBuYW1lPSJ2Xzc2NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkMyIC0gTWF5IDI0LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2NQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI4MjAiPjE3MjgyMDwvYT4KK0hhcmQtY29kZWQgY2xhc3MgbGlicmFyaWVzIG5hbWVzIGluIG9yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4NzQxIj4xODg3NDE8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb3JyZWN0IGFtYmlndW91cyBtZXRob2QgZXJyb3Igd2l0aCBpbmhlcml0ZWQgcmF3IHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgyNDciPjE4ODI0NzwvYT4KK1tjb250ZW50IGFzc2lzdF0gQ29kZSBDb21wbGV0aW9uIGZvciBzdGF0aWMgaW1wb3J0aW5nIGZpZWxkcyBub3Qgd29ya2luZworCisKKzxhIG5hbWU9InZfNzY0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNSQzIgLSBNYXkgMjMsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzY0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc2NCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4ODY0OCI+MTg4NjQ4PC9hPgorRUNKIGNvbXBpbGVyIGZhaWxzIHRvIGZpbmQgYm9vdCBjbGFzc2VzIG9uIEhhcm1vbnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODg2NTYiPjE4ODY1NjwvYT4KK1twZXJmc10gMiUgcmVncmVzc2lvbiBvbiBzb21lIEJhdGNoIENvbXBpbGVyIHRlc3RzIHNpbmNlIHZfNzU2Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MTM2Ij4xODgxMzY8L2E+CitbamF2YWRvY11bYXNzaXN0XSBFcnJvcnMgaW4gb3JnLmVjbGlwc2UuamR0LnVpLkphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODgxMjciPjE4ODEyNzwvYT4KK1t0ZXN0XSBTb21lIHRlc3RzIGZhaWwgb24gSGFybW9ueQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjA1NCI+MTYyMDU0PC9hPgorW2J1aWxkXSBHb3QgYSBmYWlsdXJlIG9uIE11bHRpUHJvamVjdFRlc3RzLnRlc3RDeWNsZTUgb24gbXkgc3BlZWR5IHRlc3QgYm94Li4uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4MTAzIj4xODgxMDM8L2E+CitbMS41XVtjb21waWxlcl0gSW5hcHByb3ByaWF0ZSB1c2FnZSBvZiBIYXNoU2V0CisKKzxhIG5hbWU9InZfNzYzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgMTYsIDIwMDcgLSAzLjMgUkVMRUFTRSBDQU5ESURBVEUgMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzYzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3MzI5Ij4xODczMjk8L2E+Citjb21waWxhdGlvbiBlcnJvciBjb25zdGFudHMgY3JlYXRlZCB3aXRoIHN0YXRpYyBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3MjIzIj4xODcyMjM8L2E+CitDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IyLmdldFJldmVyc2VkUmVzdWx0cyBoYXMgaW5jb3JyZWN0IGNvbXBhcmF0b3IKKworPGEgbmFtZT0idl83NjIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM1JDMSAtIE1heSAxNiwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzYyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMTQxIj4xMzMxNDE8L2E+CitNdXN0IEphdmFDb3JlLmNyZWF0ZShJRmlsZSkgYWx3YXlzIGRvIGZ1bGwgY2hlY2tzPworCis8YSBuYW1lPSJ2Xzc2MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkMxIC0gTWF5IDE1LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc2MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NjEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMzMzgiPjE4MzMzODwvYT4KK1twZXJmc10gVG9vIG1hbnkgSkRUL0NvcmUgcGVyZm9ybWFuY2UgdGVzdHMgYXJlIHllbGxvdworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjgzMyI+MTg2ODMzPC9hPgorWzEuNV1bY29tcGlsZXJdIFNob3VsZCBkZXRlY3QgbWVtYmVyIHN1cGVydHlwZSBjeWNsZSB3aGVuIHJlc29sdmVkIHRocnUgc3RhdGljIGltcG9ydAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjM4MiI+MTg2MzgyPC9hPgorWzEuNV1bY29tcGlsZXJdIEFtYmlndW91cyBtZXRob2QgY2FsbCBlcnJvciByZXBvcnRlZCBvbiBhIGRlbW9uc3RyYWJseSB1bmFtYmlndW91cyBjYWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NzQ5Ij4xODY3NDk8L2E+CitDQ0UgaW4gU2NvcGUuZmluZE1lbWJlclR5cGUKKworPGEgbmFtZT0idl83NjAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM1JDMSAtIE1heSAxNSwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NjAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzYwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTIyIj4xNzc5MjI8L2E+CitGbGV4aWJsZVByb2plY3RDb250YWluZXIgcmVmcmVzaCBsb2dpYyBzcG9yYWRpY2FsbHkgbGVhdmVzIHByb2plY3Qgd2l0aCAmcXVvdDttaXNzaW5nIGxpYnJhcnkmcXVvdDsgZXJyb3Igb24gcmVuYW1lL2RlbGV0ZQorCis8YSBuYW1lPSJ2Xzc1OSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkMxIC0gTWF5IDE0LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU1NzYiPjE4NTU3NjwvYT4KK1tqYXZhZG9jXVthc3Npc3RdIFR5cGUgcGFyYW1ldGVycyBzaG91bGQgbm90IGJlIHByb3Bvc2VkIHdoaWxlIGNvbXBsZXRpbmcgaW4gQGxpbmsgb3IgQHNlZSByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMwMjYiPjE0MzAyNjwvYT4KK1thc3QgcmV3cml0ZV0gQ2xlYW4gdXAgcGFyYW50aGVzZXMgYXJlIG5vdCByZWNvZ25pemluZyBjb21tZW50IC8vCisKKzxhIG5hbWU9InZfNzU4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNSQzEgLSBNYXkgMTEsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzU4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1OCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODIwOCI+MTY4MjA4PC9hPgorUmVuYW1pbmcgY2xhc3NlcyBmcm9tIGxvd2VyY2FzZSB0byB1cHBlcmNhc2UgcmVzdWx0cyBpbiBhbiBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjE4MSI+MTg2MTgxPC9hPgorMS41IGNvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgY2xhc3MgZmlsZXMgYnVpbHQgYnkgLXRhcmdldCBqc3IxNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjQxNSI+MTg2NDE1PC9hPgorW3NlYXJjaF0gU2VhcmNoIGZvciBwYWNrYWdlIGRlY2xhcmF0aW9ucyBzaG91bGQgbm90IHJldHVybiBkdXBsaWNhdGUgZWxlbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUxMjkiPjE4NTEyOTwvYT4KK05QRSBpbiBMb2NhbFZhcmlhYmxlQmluZGluZy5jb21wdXRlVW5pcXVlS2V5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MTE5Ij4xODUxMTk8L2E+Citbc2VhcmNoXSBUeXBlTmFtZU1hdGNoIG11c3Qgc3BlY2lmeSB0aGF0IGl0IGNvdWxkIG5vdCBiZSBvdmVycmlkZGVuIGJ5IGNsaWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ1NDYiPjE4NDU0NjwvYT4KK1tjb21waWxlcl1bbnVsbF0gU3B1cmlvdXMgcmVkdW5kYW50IG51bGwgY2hlY2sgd2FybmluZyBpbiBmaW5hbGx5IHdoZW4gdGhlIGNsYXNzIGhhcyBhIHN0YXRpYyBmaWVsZAorCis8YSBuYW1lPSJ2Xzc1NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zUkMxIC0gTWF5IDEwLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUzMDYiPjE4NTMwNjwvYT4KK0hlbHAgd2l0aCBmaWVsZHMgYW5kIG1ldGhvZHMgb24gYmluYXJ5IHN1cGVyIHR5cGVzIHdpdGggdW5yZXNvbHZlZCByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1OTUwIj4xODU5NTA8L2E+CitbcGVyZm9ybWFuY2VdIG9wZW5pbmcgY2xhc3MgZmlsZSB3aXRob3V0IHNvdXJjZSBhdHRhY2hlbWVudCBpcyB0b28gc2xvdworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjE4OSI+MTg2MTg5PC9hPgorTlBFIHRyeWluZyB0byBvcGVuIHRoZSBmb2xsb3dpbmcgY2xhc3MgdXNpbmcgdGhlIEFTVFZpZXcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM5NDQiPjE3Mzk0NDwvYT4KK2Nhbm5vdCBjYW5jZWwgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUxODIiPjE4NTE4MjwvYT4KK0Z1cCBvZiAxMjY3MTIsIHRoZSB0d28gcmVncmVzc2lvbnMgdGVzdHMgaW4gUnVudGltZVRlc3RzIHNob3VsZCBiZSByZXdyaXR0ZW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3MzMiPjE4NTczMzwvYT4KK1JlZnJlc2hpbmcgZXh0ZXJuYWwgamFyIGRvZXNuJ3QgdXBkYXRlIHByb2JsZW0gbWFya2VyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMDI1Ij4xNDMwMjU8L2E+CitbYnVpbGQgcGF0aF0gRGVyaXZlZCBhdHRyaWJ1dGUgb24gZGVmYXVsdCBvdXRwdXQgZm9sZGVyIG9mIEphdmEgcHJvamVjdCBkb2Vzbid0IHdvcmsKKworPGEgbmFtZT0idl83NTYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM1JDMSAtIE1heSA3LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1NgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU3ODciPjE4NTc4NzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIHVubmVjZXNzYXJ5IGNhc3QgZGlhZ25vc2lzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NjkzIj4xNTQ2OTM8L2E+Citwcm9qZWN0IGNsZWFuICZhbXA7IGJ1aWxkIHNvbWV0aW1lcyBjb3BpZXMgc3VidmVyc2lvbiAuc3ZuIGZvbGRlcnMgdG8gYmluIHRyZWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDg4NiI+ODQ4ODY8L2E+CitbY29tcGlsZXJdIGNvbXBpbGVkIGNvZGUgd3Jvbmcgd2l0aCBhbWJpZ3VvdXMgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTc2OCI+MTg1NzY4PC9hPgorWzEuNl1bY29tcGlsZXJdIEVuYWJsaW5nIGFwdCBieSBkZWZhdWx0IGluIGJhdGNoIG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU1NjciPjE4NTU2NzwvYT4KK1tjb21waWxlcl0gZGVhZCBieXRlY29kZXMgYXJlIGdlbmVyYXRlZCBpbnNpZGUgb3B0aW1pemVkIGJvb2xlYW4gY29uZGl0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyOTY1Ij4xNjI5NjU8L2E+CitbY29tcGlsZXJdIGRlYWQgYnl0ZWNvZGVzIGFyZSBnZW5lcmF0ZWQgaW5zaWRlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MzEwIj4xODUzMTA8L2E+CitSZW1vdmluZyBpbnRlcm5hbCBqYXIgcmVmZXJlbmNlZCBmcm9tIGFub3RoZXIgcHJvamVjdCBkb2Vzbid0IHVwZGF0ZSBQYWNrYWdlIEV4cGxvcmVyCisKKzxhIG5hbWU9InZfNzU1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNyAtIE1heSAyLCAyMDA3IC0gMy4zIE1JTEVTVE9ORSA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1NQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY3MzEiPjE1NjczMTwvYT4KK1tjb21waWxlcl0gSW1wcm92ZSBjb21waWxlciBmYXVsdC10b2xlcmFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ5NTciPjE4NDk1NzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciBjcmFzaAorCis8YSBuYW1lPSJ2Xzc1NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTcgLSBBcHJpbCAzMCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NTQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzU0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MjkzIj4xODQyOTM8L2E+CitVbm5lY2Vzc2FyeSBpbmhlcml0ZWQgbWV0aG9kIGVycm9ycyByZXBvcnRlZCBhZ2FpbnN0IHN1YnR5cGVzCisKKzxhIG5hbWU9InZfNzUzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNyAtIEFwcmlsIDI4LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1MworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjU3ODMiPjE2NTc4MzwvYT4KK1thc3QgcmV3cml0ZV0gSW1wb3J0IGRlY2xhcmF0aW9uIHN0YXRpYyBwcm9wZXJ0eSBjYW4gbm90IGJlIHNldCBjb3JyZWN0bHkKKworPGEgbmFtZT0idl83NTIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMjcsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzUyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc1MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTQwOSI+MTc1NDA5PC9hPgorbWV0aG9kIHJlZmVyZW5jZSBjb250YWlucyBnZW5lcmljIG1ldGhvZCBiaW5kaW5nCisKKzxhIG5hbWU9InZfNzUxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNyAtIEFwcmlsIDI2LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc1MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NTEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA3MTMiPjE4MDcxMzwvYT4KK0Fub255bW91cyB0eXBlIHJlbmRlcmVkIGFzIG51bWJlciBpbiBob3ZlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjE1NCI+MTgyMTU0PC9hPgorSmF2YSBzZWFyY2ggZ2l2ZXMgbm8gcmVzdWx0cyBvbiB3b3Jrc3BhY2Ugd2l0aCBtdWx0aXBsZSBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDc3NiI+MTQ0Nzc2PC9hPgorSmF2YVByb2plY3QucmVzZXRDYWNoZXMoKSBuZWVkcyB0byByZXNldCBkZXBlbmRlbnQgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwMTEiPjE3OTAxMTwvYT4KK0lUeXBlI2dldE1ldGhvZCguLikgc2hvdWxkIG5vdCB0aHJvdyBBRkUgd2hlbiBuYW1lIGNvbnRhaW5zIGRvdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjEwNCI+MTYyMTA0PC9hPgorTlBFIGluIFBhY2thZ2VFeHBsb3JlckNvbnRlbnRQcm92aWRlci5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4OTg1Ij4xNTg5ODU8L2E+CitDb2RlIGNvbXBsZXRpb24gZW5naW5lIGhpbnRzIGFubm90YXRpb25zIG9uIHdyb25nIHBsYWNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzgzMyI+MTgzODMzPC9hPgorTlBFIGluIGxhdGVzdCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzQxMyI+MTgzNDEzPC9hPgorUERFIGNhbid0IGZpbmQgdGhlIHNvdXJjZSBmb3IgcGx1Zy1pbnMgaW4gdGhlIHRhcmdldAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDEwMiI+MTg0MTAyPC9hPgorWzEuNl1bY29tcGlsZXJdIEluY29uc2lzdGVudCBzdGFja21hcCBmcmFtZSBnZW5lcmF0ZWQgZm9yIHN0YXRpYyBpbml0aWFsaXplciBvZiBlbnVtcyBjb250YWluaW5nIG92ZXJyaWRkZW4gbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjU1NiI+MTQ2NTU2PC9hPgorU2hvdWxkIHJlZmFjdG9yIGJvb2xlYW4gZmllbGRzIGludG8gYml0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MzE0Ij40OTMxNDwvYT4KK2NvbW1lbnRzIGZvcm1hdHRlZCBldmVuIGlmICZxdW90O0VuYWJsZSBjb21tZW50IGZvcm1hdHRpbmcmcXVvdDsgaXMgZGlzYWJsZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDc5MyI+MjA3OTM8L2E+CitbZm9ybWF0dGVyXSBUaGUgY29kZSBmb3JtYXR0ZXIgaW5kZW50IGxlZnQgYWxpZ25lZCBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDkwNSI+MTgwOTA1PC9hPgorVHdlYWtzIHRvIHJlY292ZXJlZCBiaW5kaW5ncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzIxNiI+MTgzMjE2PC9hPgorWzEuNV1bY29tcGlsZXJdIENhbm5vdCByZWZlciB0byBhIGdlbmVyaWMgbWVtYmVyIHR5cGUgdXNpbmcgYSBub24gc3RhdGljIHN1YmNsYXNzIG9mIHRoZSBlbmNsb3NpbmcgdHlwZQorCis8YSBuYW1lPSJ2Xzc1MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTcgLSBBcHJpbCAyNCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83NTAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzUwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyOTMwIj4xODI5MzA8L2E+CitKYXZhTW9kZWxDYWNoZSdzIHNpemUgIGdyb3dzIHdoZW4gZGlzcGxheWluZyB0eXBlIGhpZXJhcmNoeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzA2MiI+MTgzMDYyPC9hPgorW3NlYXJjaF0gT3V0T2ZNZW1vcnlFcnJvciBkdXJpbmcgcmVuYW1lIHJlZmFjdG9yaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkwNjgiPjc5MDY4PC9hPgorW2Zvcm1hdHRlcl0gTmVlZCBvcHRpb24gdG8gY29udHJvbCBsaW5lIHdyYXBwaW5nIGJlZm9yZS9hZnRlciBvcGVyYXRvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA3ODkiPjE4MDc4OTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBpbnZhbGlkIGluY29tcGF0aWJsZSByZXR1cm4gdHlwZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzUzOCI+MTgzNTM4PC9hPgorTm90IGdldHRpbmcgQEluaGVyaXRlZCBhbm5vdGF0aW9uIG9uIGFubm90YXRpb24gdHlwZXMgZnJvbSBiaW5hcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM0NjgiPjE4MzQ2ODwvYT4KK05QRSB0cnlpbmcgdG8gY2FsbCBpc0RlZmF1bHQoKSBvbiB0aGUgTWVtYmVyVmFsdWVQYWlyQmluZGluZyBjb3JyZXNwb25kaW5nIHRvIGFycmF5PTEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMzOTUiPjE4MzM5NTwvYT4KK0Z1cCBvZiBidWcgMTQ0ODU4LCBpbnRlcm5hbCBlcnJvciBpcyB0aHJvd24gZm9yIHdyb25nIGV4Y2VwdGlvbiB0eXBlIGluIGNhdGNoIGNsYXVzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTM0OSI+MTgxMzQ5PC9hPgorQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoaWxlIGVkaXRpbmcgSmF2YSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyNDg1Ij4xODI0ODU8L2E+CitNaXNzaW5nIHRyYW5zbGF0aW9uIGZpbGVzIGluIEpEVCBwbHVnLWlucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTE3NSI+MTYxMTc1PC9hPgorSmFyUGFja2FnZUZyYWdtZW50Um9vdCBzbG93IHRvIGluaXRpYWxpemUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIyMDQiPjE4MjIwNDwvYT4KK0RlbGV0aW5nIGEgSlJFIHJlZmVyZW5jZWQgYnkgY29udGFpbmVyIGRvZXMgbm90IHJlc3VsdCBpbiB1bmJvdW5kIGNvbnRhaW5lciBwcm9ibGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMzcwIj4xNjIzNzA8L2E+CitNZXRob2RWZXJpZmllciNhcmVSZXR1cm5UeXBlc0VxdWFsIGlzIGEgbWlzbm9tZXIKKworPGEgbmFtZT0idl83NDkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM003IC0gQXByaWwgMTcsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0OSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODIxNyI+MTE4MjE3PC9hPgorQ29tcGlsZXIgZXJyb3Ivd2FybmluZyBvcHRpb24gJ1BhcmFtZXRlciBpcyBuZXZlciByZWFkJyBwcm9kdWNlcyBhIGxvdCBvZiBmYWxzZS1wb3NpdGl2ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzOTMiPjE4MTM5MzwvYT4KK0RlZmF1bHRBU1RWaXNpdG9yIGRvZXNuJ3Qgb3ZlcnJpZGUgYWxsIG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUzMjkiPjE0NTMyOTwvYT4KK1tzY2FsaW5nXSBVbmFibGUgdG8gbG9jYXRlIHNvdXJjZSBpbiBtb25zdGVyIHdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzE3NCI+MTc3MTc0PC9hPgorW2Fzc2lzdF0gV3JvbmcgbmFtZXMgYXJlIHByb3Bvc2VkIGFzIHVucmVzb2x2ZWQgbG9jYWwgdmFyaWFibGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE3MjciPjE4MTcyNzwvYT4KK1twZXJmc10gSkRUL0NvcmUgcGVyZm9ybWFuY2VzIHRlc3RzIGxhc3QgdG9vIGxvbmcgb24gc2xvd2VzdCByZWxlbmcgdGVzdCBib3hlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDEwOSI+MTgwMTA5PC9hPgorW2NvbXBpbGVyXSBKRFQgVGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBvbiBpbmNyZW1lbnRhbCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzgxOSI+MTc3ODE5PC9hPgorSmFyIGZpbGVzIGFkZGVkIHRvIGEgcGx1Z2luIGFyZSBpZ25vcmVkCisKKzxhIG5hbWU9InZfNzQ4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNyAtIEFwcmlsIDEwLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0OAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDgiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEyNjkiPjE4MTI2OTwvYT4KK0RlbGV0aW5nIHNlY29uZGFyeSB0eXBlIGlzIG5vdCBkZXRlY3RlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTY4NCI+MTc5Njg0PC9hPgorJnF1b3Q7UmVjb25jaWxlIGVkaXRvciBjaGFuZ2UmcXVvdDsgcGVyZiB0ZXN0IGlzIGdldHRpbmcgc2xvd2VyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNjgzIj4xODA2ODM8L2E+Citjb2RlU2VsZWN0IGRvZXMgbm90IHdvcmsgaW4gdW5pY29kZSBuYW1lcyBsaWtlIFx1MDA0MgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTI3MCI+MTgxMjcwPC9hPgorWzEuNV1bY29tcGlsZXJdIENsYXNzIGxpdGVyYWwgb2YgYXJyYXkgb2YgdHlwZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHJlamVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NTUxIj4xNzg1NTE8L2E+CitbaW5kZXhdIERlYWRsb2NrIHdoZW4gZG9pbmcgVHlwZSBIaWVyYXJjaHkgd2hpbGUgdXBkYXRpbmcgYSBsYXJnZSB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA1MjQiPjE4MDUyNDwvYT4KK05QRSBpbiBJVHlwZUJpbmRpbmcjY3JlYXRlQXJyYXlUeXBlKC4uKSBvbiBhbm9ueW1vdXMgdHlwZQorCis8YSBuYW1lPSJ2Xzc0NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTcgLSBBcHJpbCAzLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzgyMTMiPjE3ODIxMzwvYT4KK0NvbXBpbGF0aW9uIFVuaXQgbm90IHNob3duIGluIFBhY2thZ2UgRXhwbG9yZXIgYWZ0ZXIgYSByZW5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA0NzEiPjE4MDQ3MTwvYT4KK1tjb21waWxlcl0gVW5vcHRpbWFsIGNvZGUgZ2VuZXJhdGlvbiBmb3IgZm9yLWxvb3BzIHdoZW4gbm8gY29udGludWF0aW9uIHBvaW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzIwIj4xNzYzMjA8L2E+CitOb24gbGluZWFyIHByb2dyZXNzIGluIG9wZW4gdHlwZSBkaWFsb2cKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY0NzIiPjE3NjQ3MjwvYT4KK1tjb21waWxlcl1bbnVsbF0gZXh0cmFuZW91cyBlcnJvciBpbiBjYXNlIG9mIGEgbGFiZWxlZCB3aGlsZSh0cnVlKSBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY5NjMiPjE2Njk2MzwvYT4KK1tjb21waWxlcl0gcmVzb2x2ZSBiaW5kaW5nIGZvciBsb2NhbCB2YXJpYWJsZSBpbiBDb25zdHJ1Y3Rvckludm9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk2MzAiPjE3OTYzMDwvYT4KK0NvbXBpbGVyIHBhcnNpbmcgdGVzdHMgZmFpbCB3aXRoIElCTSBKMlNFIDEuNC4yLCA1LjAsIGFuZCA2LjAgKGVhcmx5IGFjY2VzcykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE3ODciPjE1MTc4NzwvYT4KK1tjb21waWxlcl0gY29tcGlsZXIgYWxsb3dzIGFzc2lnbm1lbnQgdG8gZmluYWwgZmllbGQgaW4gY29uc3RydWN0b3Igb3RoZXIgdGhhbiB0aHJvdWdoICd0aGlzJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODQ5OSI+MTc4NDk5PC9hPgorW3BlcmZzXSBKRFQvQ29yZSBtb2RlbCBwZXJmb3JtYW5jZXMgdGVzdHMgbXVzdCBiZSBpbXByb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDE2OSI+MTgwMTY5PC9hPgorQWRkIHByb3RlY3Rpb24gYWdhaW5zdCBtaXNzYmVoYXZpbmcgY29udGFpbmVyIChyZXR1cm5pbmcgbnVsbCBlbnRyaWVzKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDA0NiI+MTgwMDQ2PC9hPgorcGF0Y2ggdG8gYW50YWRhcHRlciBlY2xpcHNlLmluZgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjQ0OSI+MTY2NDQ5PC9hPgorRG9uJ3QgYWJvcnQgYnVpbGQgd2hlbiBDb21waWxhdGlvblBhcnRpY2lwYW50cyBmaXggY2xhc3NwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NTI5Ij4xNzk1Mjk8L2E+CitTdG9wIEVjbGlwc2UgdGFrZXMgYSBsb3Qgb2YgdGltZSBpbiBjYXNlIG9mIGJpZyB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwMDAiPjE3OTAwMDwvYT4KK1tjb2RlIGFzc2lzdF0gcnVuKCkgc2hvdWxkIG5vdCBiZSBhIHZhbGlkIHByb3Bvc2FsIGluc2lkZSB0aGUgc2NyYXBib29rIHBhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjk3MjgiPjE2OTcyODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBXaWxkY2FyZEJpbmRpbmcuYm91bmRDaGVjayBjb2RpbmcgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwNTYiPjE3OTA1NjwvYT4KK1tjb21waWxlcl0gQ29tcGlsZXIgZ2l2ZXMgbWlzbGVhZGluZyBSYW5nZSBmb3IgaW52aXNpYmxlIGZpZWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5Njk5Ij4xNzk2OTk8L2E+Cit0eXBlLm5ld1R5cGVIaWVyYXJjaHkgZG9lc24ndCBjYW5jZWwKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk2NzIiPjE3OTY3MjwvYT4KK1thc3Npc3RdIE9ubHkgb25lIGFzc2VydGlvbiBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBjb21wbGV0aW9uIHBhcnNlciB0ZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0NDQ1Ij4xNzQ0NDU8L2E+CitbMS41XVtjb21waWxlcl0gbWlzc2luZyB1bmNoZWNrZWQgY29udmVyc2lvbiB3YXJuaW5nIHVwb24gcGFyYW1ldHJpemVkIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTI1OCI+MTc5MjU4PC9hPgorc2ltcGxlIHJlY29uY2lsZSBzdGFydHMgcHJvYmxlbSBmaW5kZXIgLSBtYWluIHRocmVhZCB3YWl0aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NDc3Ij4xNzk0Nzc8L2E+CitbY29tcGlsZXJdIHByb2JsZW0gaW4gZmlyc3QgZWxlbWVudCBvZiBhcnJheSBpbml0aWFsaXplciBzdXBwcmVzc2VzIGZ1cnRoZXIgcHJvYmxlbXMKKworPGEgbmFtZT0idl83NDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM003IC0gTWFyY2ggMjcsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0NiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTE5OSI+MTc5MTk5PC9hPgorW3NlYXJjaF0gT3BlbiB0eXBlIHRocm93cyBOUEUgZHVyaW5nIEl0ZW1zIGZpbHRlcmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODg5NSI+MTc4ODk1PC9hPgorW2NvbXBpbGVyXVtudWxsXSBBIGZvci1lYWNoIGxvb3AgY2hhbmdlcyBpdHMgdmFsdWUgb24gZWFjaCBpdGVyYXRvciBidXQgdGhlIG51bGwgcG9pbnRlciBhbmFseXNpcyBpcyBub3QgdGFraW5nIHRoYXQgaW50byBjb25zaWRlcmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODYzIj4xNzc4NjM8L2E+CitbY29tcGlsZXJdW251bGxdIFNwdXJpb3VzIG51bGwgcG9pbnRlciB3YXJuaW5nIGluIGZpbmFsbHkgYmxvY2sgKGludm9sdmluZyBkZWYuIHVua25vd24pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDY1Ij4xNzkwNjU8L2E+CitbRE9NXSBUZXN0IGNvdmVyYWdlIGZvciBJTWVtYmVyVmFsdWVQYWlyQmluZGluZyBtZXRob2RzIG11c3QgYmUgaW1wcm92ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwNDIiPjE3OTA0MjwvYT4KK1tET01dIEltcGxlbWVudGF0aW9uIG9mIElCaW5kaW5nLmdldE1vZGlmaWVycygpIHNob3VsZCByZXR1cm4gTW9kaWZpZXIuTk9ORSB3aGVuIG5vIG1vZGlmaWVycyBhcmUgYXZhaWxhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4ODYxIj4xNzg4NjE8L2E+CitFeGVjdXRpbmcgcnVuKCkgaW4gYSBzY3JhcGJvb2sgcGFnZSBsZWFkcyB0byBhIE5QRQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODAzOSI+MTc4MDM5PC9hPgorU2VwYXJhdGUgYWR2YW5jZWQgdmVyYm9zZSBmb3IgY29udGFpbmVyIGFuZCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmcm9tIHJlZ3VsYXIgdmVyYm9zZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODg0NyI+MTc4ODQ3PC9hPgorW3NlYXJjaF0gUG90ZW50aWFsIG1hdGNoZXMgZm91bmQgd2hlbiBzZWFyY2hpbmcgcmVmZXJlbmNlcyB0byBJSmF2YUVsZW1lbnQjZ2V0UmVzb3VyY2UoKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDkyMCI+MTc0OTIwPC9hPgorW21vZGVsXSBjbG9zaW5nIGEgc2luZ2xlIHByb2plY3QgY2F1c2VzIGFsbCB2YXJpYWJsZXMgYW5kIGNvbnRhaW5lcnMgdG8gYmUgc2F2ZWQKKworPGEgbmFtZT0idl83NDUiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM002IC0gTWFyY2ggMjEsIDIwMDcgLSAzLjMgTUlMRVNUT05FIDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0NSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI3NldENvbXBpbGFuY2VPcHRpb25zKFN0cmluZywgTWFwKTwvY29kZT4gaGFzIGJlZW4gcmVuYW1lZCB0byA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5zZXRDb21wbGlhbmNlT3B0aW9ucyhTdHJpbmcsIE1hcCk8L2NvZGU+LjwvbGk+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlJlY292ZXJlZFR5cGVCaW5kaW5nPC9jb2RlPiwgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlJlY292ZXJlZFZhcmlhYmxlQmluZGluZzwvY29kZT4gYXJlIG5vdCBwYXJ0IG9mIHRoZSBBUEkuIFRoZXkgaGF2ZSBiZWVuCitjaGFuZ2VkIHRvIHBhY2thZ2UgZGVmYXVsdCB2aXNpYmlsaXR5LjwvbGk+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLk1ldGhvZFJlZmVyZW5jZU1hdGNoI2lzUG9seW1vcnBoaWMoKTwvY29kZT4gaGFzIGJlZW4gcmVtb3ZlZC48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg2MTYiPjE3ODYxNjwvYT4KK1tBUEldIEZpeCB0eXBvIGZvciBKYXZhQ29yZSNzZXRDb21wbGlhbmNlT3B0aW9ucyhTdHJpbmcsIE1hcCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg2MDciPjE3ODYwNzwvYT4KK1tBUEldW2RvbV0gUmVjb3ZlcmVkVHlwZUJpbmRpbmcgYW5kIFJlY292ZXJlZFZhcmlhYmxlQmluZGluZyBzaG91bGQgbm90IGJlIHB1YmxpYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODU5NCI+MTc4NTk0PC9hPgorW3NlYXJjaF0gRGVwcmVjYXRlZCBNZXRob2RSZWZlcmVuY2VNYXRjaC5pc1BvbHltb3JwaGljKCkgc2hvdWxkIGJlIHJlbW92ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYxMTgiPjE3NjExODwvYT4KK01pc3NpbmcgbGlicmFyeSBjbGFzc2VzIGtpbGwgSW50ZWxsaXNlbnNlIHdpdGhvdXQgRXJyb3IKKworPGEgbmFtZT0idl83NDQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM002IC0gTWFyY2ggMjAsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQ0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0NCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoaXMgZHJvcCBvbmx5IGZpeGVzIHRlc3RzIGZhaWx1cmVzIHJlcG9ydGVkIGluIEkyMDA3MDMxOS0xODAwLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGEgbmFtZT0idl83NDMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM002IC0gTWFyY2ggMTksIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBjb25zdGFudCBBUEkgaGF2ZSBiZWVuIGFkZGVkIGluIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50czwvY29kZT4gaW4gb3JkZXIgdG8gZml4IGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3OTMiPjIwNzkzPC9hPi4KK1RoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGFmdGVyIDMuM002Ljxicj4KKzxwcmU+CisJLyoqCisJICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGluZGVudCBibG9jayBjb21tZW50cyB0aGF0IHN0YXJ0IG9uIHRoZSBmaXJzdCBjb2x1bW4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKwkgKiBAc2VlICNUUlVFCisJICogQHNlZSAjRkFMU0UKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX05FVkVSX0lOREVOVF9CTE9DS19DT01NRU5UU19PTl9GSVJTVF9DT0xVTU4gPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIjsgLy8kTk9OLU5MUy0xJAkKKwkvKioKKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gaW5kZW50IGxpbmUgY29tbWVudHMgdGhhdCBzdGFydCBvbiB0aGUgZmlyc3QgY29sdW1uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKwkgKiBAc2VlICNUUlVFCisJICogQHNlZSAjRkFMU0UKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX05FVkVSX0lOREVOVF9MSU5FX0NPTU1FTlRTX09OX0ZJUlNUX0NPTFVNTiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiI7IC8vJE5PTi1OTFMtMSQJCis8L3ByZT4KKzwvbGk+Cis8bGk+TmV3IGNvbnN0YW50IEFQSSBoYXZlIGJlZW4gYWRkZWQgaW4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzPC9jb2RlPiBpbiBvcmRlciB0byBmaXggYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTA2OCI+NzkwNjg8L2E+LgorVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgYWZ0ZXIgMy4zTTYuPGJyPgorPHByZT4KKwkvKioKKwkgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gd3JhcCBiZWZvcmUgdGhlIGJpbmFyeSBvcGVyYXRvcgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIEZBTFNFCisJICogVGhpcyBvcHRpb24gaXMgdXNlZCBvbmx5IGlmIHRoZSBvcHRpb24ge0BsaW5rICNGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9CSU5BUllfRVhQUkVTU0lPTn0gaXMgc2V0LgorCSAqIEBzZWUgI1RSVUUKKwkgKiBAc2VlICNGQUxTRQorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfV1JBUF9CRUZPUkVfQklOQVJZX09QRVJBVE9SID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ5ODQiPjE1NDk4NDwvYT4KK0phcnMgaW4gbGlicmFyeSBub3QgcmVjb2duaXplZCBzb21ldGltZXMuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDczIj4xMDI0NzM8L2E+Citjb2RlIGFzc2lzdDogcGFyYW1ldGVyIG5hbWVzIG5vdCBoYXJ2ZXN0ZWQgZnJvbSBkZWJ1ZyBpbmZvIGluIGNsYXNzIGZpbGVzCisKKzxhIG5hbWU9InZfNzQyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNiAtIE1hcmNoIDE4LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzc0MgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83NDIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BcyBzb21lIGNsaWVudHMgbmVlZCB0byBrbm93IGlmIHNvbWUgY2xhc3NwYXRoIGNvbnRhaW5lciBjaGlsZHJlbiBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgb3IKK2NhbiBiZSBtb2RpZmlhYmxlLCB0aGUgZm9sbG93aW5nIEFQSSBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCBpbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gY2xhc3M6Cis8dWw+Cis8bGk+PGNvZGU+I2dldEFjY2Vzc1J1bGVzU3RhdHVzKElQYXRoLCBJSmF2YVByb2plY3QpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+I2dldEF0dHJpYnV0ZVN0YXR1cyhJUGF0aCwgSUphdmFQcm9qZWN0LCBTdHJpbmcpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+I2dldFNvdXJjZUF0dGFjaG1lbnRTdGF0dXMoSVBhdGgsIElKYXZhUHJvamVjdCk8L2NvZGU+PC9saT4KKzwvdWw+CitGb3IgZWFjaCBvZiB0aGVzZSBtZXRob2RzLCB0aGUgcmV0dXJuZWQgc3RhdHVzIGNhbiBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNldmVyaXRpZXM6Cis8dWw+Cis8bGk+PGNvZGU+SVN0YXR1cyNPSzwvY29kZT46IG1lYW5zIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdXBwb3J0ZWQgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gaXMgbW9kaWZpYWJsZTwvbGk+Cis8bGk+PGNvZGU+SVN0YXR1cyNFUlJPUjwvY29kZT46IG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBvciBpcyBub3QgbW9kaWZpYWJsZS48YnI+CisJSW4gdGhpcyBjYXNlLCB0aGUgPGNvZGU+SVN0YXR1cyNnZXRDb2RlKCk8L2NvZGU+IHdpbGwgaGF2ZSByZXNwZWN0aXZlbHkgdGhlIDxjb2RlPiNBVFRSSUJVVEVfTk9UX1NVUFBPUlRFRDwvY29kZT4gdmFsdWUKKwlvciB0aGUgPGNvZGU+I0FUVFJJQlVURV9SRUFEX09OTFk8L2NvZGU+IHZhbHVlLjwvbGk+Cis8L3VsPgorTm90ZSB0aGF0IGlmIHRoZSBzdWJjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgdGhlbiB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcwordG8gcmV0dXJuIDxjb2RlPklTdGF0dXMjT0s8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbgorYmUgdXBkYXRlZCAoc2VlIDxjb2RlPiNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCk8L2NvZGU+KS4KKzwvbGk+Cis8bGk+QVBJIGFkZGl0aW9uIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMDAxIj4xMzAwMDE8L2E+LiBJdCBpcyBiZWluZyBhYmxlIGZvciBhIHVzZXIKK3RvIHF1ZXJ5IHdoYXQgb3B0aW9ucyB3ZXJlIGVuYWJsZWQgd2hlbiB0aGUgRE9NL0FTVCB0cmVlIGhhcyBiZWVuIGNyZWF0ZWQuIFRoZSBmb2xsb3dpbmcgQVBJIG1ldGhvZHMgaGF2ZSBiZWVuIGFkZGVkOgorPHVsPgorPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QjaGFzUmVzb2x2ZWRCaW5kaW5ncygpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVCNoYXNTdGF0ZW1lbnRzUmVjb3ZlcnkoKTwvY29kZT48L2xpPgorPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QjaGFzQmluZGluZ3NSZWNvdmVyeSgpPC9jb2RlPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaT5BUEkgYWRkaXRpb24gdG8gZml4IGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1NjciPjE0OTU2NzwvYT4uIEl0IGlzIGFib3V0Cit0aGUgaW5jb21wbGV0ZSBiaW5kaW5nIGhhbmRsaW5nLiBUaGUgZm9sbG93aW5nIEFQSSBtZXRob2RzIG9yIGZpZWxkcyBoYXZlIGJlZW4gYWRkZWQ6Cis8dWw+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlciNzZXRCaW5kaW5nc1JlY292ZXJ5KGJvb2xlYW4pPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nI2lzUmVjb3ZlcmVkKCk8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0I3JlY29uY2lsZShpbnQsIGludCwgV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0I0ZPUkNFX1BST0JMRU1fREVURUNUSU9OPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCNFTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWTwvY29kZT48L2xpPgorPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQjRU5BQkxFX0JJTkRJTkdTX1JFQ09WRVJZPC9jb2RlPjwvbGk+Cis8L3VsPgorPC9saT4KKzxsaT5UaGUgd29ya2luZyBjb3B5IG93bmVyICg8Y29kZT5Xb3JraW5nQ29weU93bmVyPC9jb2RlPikgbm93IHNwZWNpZmllcyB0aGUgcHJvYmxlbSByZXF1ZXN0b3IKKyg8Y29kZT5JUHJvYmxlbXJlcXVlc3RvcjwvY29kZT4pIHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIG9uIHdvcmtpbmcgY29waWVzIGl0IG93bnMgCisoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUyNDMiPjE3NTI0MzwvYT4pLjxicj4KK1RvIGltcGxlbWVudCB0aGlzIG5ldyByZXNwb25zaWJpbGl0eSwgYSBuZXcgQVBJIG1ldGhvZCBoYXMgYmVlbiBhZGRlZCBvbiA8Y29kZT5Xb3JraW5nQ29weU93bmVyPC9jb2RlPiBjbGFzczoKKzxwcmU+CisvKioKKyAqIFJldHVybnMgdGhlIHByb2JsZW0gcmVxdWVzdG9yIHVzZWQgYnkgYSB3b3JraW5nIGNvcHkgb2YgdGhpcyB3b3JraW5nIGNvcHkgb3duZXIuCisgKgorICogQnkgZGVmYXVsdCwgbm8gcHJvYmxlbSByZXF1ZXN0b3IgaXMgY29uZmlndXJlZC4gQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyAKKyAqIG1ldGhvZCB0byBwcm92aWRlIGEgcmVxdWVzdG9yLgorICogCisgKiBAcGFyYW0gd29ya2luZ0NvcHkgVGhlIHByb2JsZW0gcmVxdWVzdG9yIHVzZWQgZm9yIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkuCisgKiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiByZXR1cm4gdGhlIHByb2JsZW0gcmVxdWVzdG9yIHVzZWQgZm9yIGFsbCB3b3JraW5nIAorICogY29waWVzIG9mIHRoZSB3b3JraW5nIGNvcHkgb3duZXIuCisgKiBAcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciB0byBiZSB1c2VkIGJ5IHdvcmtpbmcgY29waWVzIG9mIHRoaXMgd29ya2luZyAKKyAqIGNvcHkgb3duZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvYmxlbSByZXF1ZXN0b3IgaXMgY29uZmlndXJlZC4KKyAqIAorICogQHNpbmNlIDMuMworICovCitwdWJsaWMgSVByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcihJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5KSB7CisJcmV0dXJuIG51bGw7Cit9Cis8L3ByZT4KK0FzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyBhZGRpdGlvbiwgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+IHBhcmFtZXRlcgorb2YgPGNvZGU+KldvcmtpbmdDb3B5PC9jb2RlPiBtZXRob2RzIGJlY29tZXMgdW5uZWNlc3NhcnkgYW5kIGNvcnJlc3BvbmRpbmcKK21ldGhvZHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQ6Cis8b2w+Cis8bGk+PGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5JQ29tcGlsYXRpb25Vbml0I2dldFdvcmtpbmdDb3B5KFdvcmtpbmdDb3B5T3duZXIsIElQcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgorPGxpPjxjb2RlPklDbGFzc0ZpbGUjYmVjb21lV29ya2luZ0NvcHkoSVByb2JsZW1SZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIsIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+V29ya2luZ0NvcHlPd25lciNuZXdXb3JraW5nQ29weShTdHJpbmcsIElDbGFzc3BhdGhFbnRyeVtdLCBJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKzwvb2w+CitBbmQgYXJlIG9idmlvdXNseSByZXBsYWNlZCBieSBmb2xsb3dpbmcgbWV0aG9kczoKKzxvbD4KKzxsaT48Y29kZT5JQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNnZXRXb3JraW5nQ29weShXb3JraW5nQ29weU93bmVyLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgorPGxpPjxjb2RlPklDbGFzc0ZpbGUjYmVjb21lV29ya2luZ0NvcHkoV29ya2luZ0NvcHlPd25lciwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5Xb3JraW5nQ29weU93bmVyI25ld1dvcmtpbmdDb3B5KFN0cmluZywgSUNsYXNzcGF0aEVudHJ5W10sIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+Cis8L29sPgorPC9saT4KKzxsaT5BZGRlZCBBUEkgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjZ2V0R2VuZXJhdGVkUmVzb3VyY2VzKElSZWdpb24sIGJvb2xlYW4pIHRvIGJlIGFibGUgdG8gZ2V0IHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2VzIGZvciBhbGwKK2VsZW1lbnRzIG9mIGEgSVJlZ2lvbi4gU2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg0Ij42NTg0PC9hPiBmb3IgZGV0YWlscy48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc2MjMiPjE3NzYyMzwvYT4KK1sxLjZdW2NvbXBpbGVyXSBTdGFja21hcCBmcmFtZXMgZ2VuZXJhdGlvbiBzaG91bGQgYmUgcHJvdGVjdGVkIGFnYWluc3QgaW52YWxpZCBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NjIxIj4xNzc2MjE8L2E+CitYTUwgbG9nIG1pZ2h0IGJlIGNvcnJ1cHRlZCBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGV4dHJhY3RpbmcgcHJvYmxlbSBjb250ZXh0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NzI1Ij4xNzY3MjU8L2E+CitbcmVjb3ZlcnldIG1lbWJlciB2YWx1ZSBhcnJheSBpbml0aWFsaXplciBhcmVuO3QgY29ycmVjdGx5IHJlY292ZXJlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODA3NyI+MTY4MDc3PC9hPgorW2NsYXNzcGF0aF0gTGV0IGNsYXNzcGF0aCBjb250YWluZXJzIGRlZmluZSB3aGF0IGlzIGNvbmZpZ3VyYWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzQ3OCI+MTc3NDc4PC9hPgorW2Zvcm1hdHRlcl0gSW5kZW50IG5ldyBsaW5lcyBvcHRpb24gYWRkcyBleHRyYSBlbXB0eSBsaW5lcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDAwMSI+MTMwMDAxPC9hPgorW2FwaV1bQVNUXSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOiBzaG91bGQgaGF2ZSBBUEkgaGFzUmVzb2x2ZWRCaW5kaW5ncywgaGFzU3RhdGVtZW50UmVjb3ZlcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1NjciPjE0OTU2NzwvYT4KK0FTVCBEQ1I6IEFsbG93IGluY29tcGxldGUgdmFyaWFibGUgYmluZGluZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzcwMDkiPjE3NzAwOTwvYT4KK1tqYXZhZG9jXSBNaXNzaW5nIEphdmFkb2MgdGFnIG5vdCByZXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzMxOSI+MTc3MzE5PC9hPgorQW5ub3RhdGlvbiBQcm9jZXNzaW5nIChBUFQpIGFmZmVjdHMgZWNsaXBzZSBzcGVlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzE5NCI+MTc3MTk0PC9hPgorWzEuNV1bY29tcGlsZXJdIHByZXNlcnZlQWxsTG9jYWxzIG9wdGlvbiBoYXMgdW5kZXNpcmFibGUgc2lkZS1lZmZlY3Qgd2hlbiBpbnZva2luZyBnZW5lcmljIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzM3MiI+MTc3MzcyPC9hPgorWzEuNV1bY29tcGlsZXJdIE1pc3NpbmcgdW5ib3hpbmcgY29udmVyc2lvbiB3aGVuIG5vIHZhbHVlIHJlcXVpcmVkIGZyb20gbWVzc2FnZSBzZW5kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2ODI1Ij4xNzY4MjU8L2E+CitGdWxsU291cmNlV29ya3NwYWNlQ29tcGxldGlvblRlc3RzIGRvZXNuJ3QgcnVuIGNvcnJlY3RseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzM4NiI+MTc3Mzg2PC9hPgorV29yZGluZyBpbiBKYXZhZG9jIG9mIFR5cGVOYW1lTWF0Y2ggYW5kIC1SZXF1ZXN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzcxMTUiPjE3NzExNTwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIEJpbmRpbmdLZXlSZXNvbHZlci5jb25zdW1lVHlwZVZhcmlhYmxlKC4uLikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUyNDMiPjE3NTI0MzwvYT4KK1ttb2RlbF0gTGV0IHdvcmtpbmcgY29weSBvd25lciBjb250cm9sIHRoZSBwcm9ibGVtIHJlcXVlc3RvciB1c2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzMzIj4xNjM3MzM8L2E+CitJbmNyZW1lbnRhbEltYWdlQnVpbGRlci5kZWxldGVHZW5lcmF0ZWRGaWxlcygpIGlzIGJyb2tlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzA3OSI+MTc3MDc5PC9hPgorQWRkIGpkdC5hcHQucGx1Z2dhYmxlLmNvcmUgYXMgeC1mcmllbmQgdG8gamR0LmNvcmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg0Ij42NTg0PC9hPgorTmVlZCBhIHdheSB0byBnZXQgY2xhc3MgZmlsZXMgZm9yIGEgamF2YSBmaWxlIChvciBDVSkKKworPGEgbmFtZT0idl83NDEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM002IC0gTWFyY2ggMTMsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSBub24tSmF2YSByZXNvdXJjZXMgaW4gamFyIGZpbGVzIHJldHVybmVkIGJ5IDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290I2dldE5vbkphdmFSZXNvdXJjZXMoKTwvY29kZT4gYW5kCisgICAgICA8Y29kZT5JUGFja2FnZUZyYWdtZW50I2dldE5vbkphdmFSZXNvdXJjZXMoKTwvY29kZT4gYXJlIG5vdyBvZiB0eXBlIDxjb2RlPklKYXJFbnRyeVJlc291cmNlPC9jb2RlPiAoYSBzdWJpbnRlcmZhY2UKKyAgICAgIG9mIDxjb2RlPklTdG9yYWdlPC9jb2RlPikuIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB0byBuYXZpZ2F0ZSB0aGUgdHJlZSBvZiBub24tSmF2YSByZXNvdXJjZXMgdXNpbmcgdGhlCisgICAgICA8Y29kZT5nZXRDaGlsZHJlbigpPC9jb2RlPiBhbmQgPGNvZGU+Z2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZHMuPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MjY5Ij4xNzYyNjk8L2E+CitbaW5kZXhdIE51bGxQb2ludGVyRXhjZXB0aW9uIGZpbHRlcmluZyBmb3IgZXhjZXB0aW9uIGJyZWFrcG9pbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYwMjciPjE3NjAyNzwvYT4KK1tqYXZhZG9jXSB7QGxpbmt9IHRvIG1lbWJlciB0eXBlIGhhbmRsZWQgaW5jb3JyZWN0bHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMwNDQiPjE1MzA0NDwvYT4KK0phckVudHJ5RmlsZSBkb2VzIG5vdCByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIHBhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA1OTUiPjE3MDU5NTwvYT4KK1tiYXRjaF1bY29tcGlsZXJdIEJhdGNoQ29tcGlsZXJUZXN0I3Rlc3QwMjQgaXMgbm8gbW9yZSBzaWduaWZpY2FudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Njk3MSI+MTc2OTcxPC9hPgorW2Fzc2lzdF0gdHlwZXMgYXJlIGNvbXB1dGVkIGlmIFRZUEVfUkVGIGFyZSBmaWx0ZXJyZWQgYW5kIEpBVkFET0NfVFlQRV9SRUYgYXJlbid0IGZpbHRlcmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1OTg3Ij4xNzU5ODc8L2E+CitbMS41XVtjb21waWxlcl0gTWlzc2luZyBlcnJvciB3aGVuIGltcGxlbWVudGluZyBhIG1ldGhvZCB3aXRoIGEgbWl4IG9mIHBhcmFtZXRlcml6ZWQgYW5kIHJhdyBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODk0NCI+MTQ4OTQ0PC9hPgorbmVlZCB0byByZW5kZXIgcmVzb3VyY2UgZm9sZGVycyBpbiBKQVJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MTkwIj4xNzYxOTA8L2E+CitbYXNzaXN0XSBJbmZlcnJlZCB2YXJpYWJsZSBuYW1lcyBhcmUgbm90IGdvb2Qgd2hlbiB0aGUgZGVjbGFyZWQgdHlwZSBpcyBhIGJhc2UgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjA1NyI+MTc2MDU3PC9hPgorSUFFIGluIEFTVENvbnZlcnRlciBmb3IgaW52YWxpZCBzb3VyY2UgcmFuZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQ0MzYiPjE3NDQzNjwvYT4KK0FQSSByZXF1ZXN0OiBNZXRob2RJbnZvY2F0aW9uL1N1cGVyTWV0aG9kSW52b2NhdGlvbiNpc1Jlc29sdmVkVHlwZUluZmVycmVkRnJvbUV4cGVjdGVkVHlwZSgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzY0Ij4xNzYzNjQ8L2E+CitbYXNzaXN0XSBtaXNzaW5nIHJldHVybiBhbmQgY29udGludWUgcHJvcG9zYWxzIHdpdGhpbiBzd2l0Y2ggc3RhdGVtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTcwNCI+MTYxNzA0PC9hPgorW21vZGVsXSBJbXByb3ZlIHByb2dyZXNzIGZvciBKYXZhIGluaXRpYWxpemF0aW9uIHRhc2sgam9iCisKKzxhIG5hbWU9InZfNzQwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNiAtIE1hcmNoIDYsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzQwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzc0MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlJlZmluZWQgdGhlIHByb2JsZW0gSURzIGFuZCBtZXNzYWdlcyBhc3NvY2lhdGVkIHRvIG51bGwtcmVsYXRlZCBpc3N1ZXMKKyAgICBkZXRlY3Rpb24sIGZvciB3aGljaCB0eXBpY2FsIGV4YW1wbGVzIHdvdWxkIG5vdyBiZToKKyAgICA8dWw+CisgICAgICA8bGk+PGNvZGU+TnVsbExvY2FsVmFyaWFibGVSZWZlcmVuY2U8L2NvZGU+IC0gTnVsbCBwb2ludGVyIGFjY2VzczogVGhlIHZhcmlhYmxlIG8gY2FuIG9ubHkgYmUgbnVsbCBhdCB0aGlzIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48Y29kZT5Qb3RlbnRpYWxOdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZTwvY29kZT4gLSBQb3RlbnRpYWwgbnVsbCBwb2ludGVyIGFjY2VzczogVGhlIHZhcmlhYmxlIG8gbWF5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+CisgICAgICA8bGk+PGNvZGU+UmVkdW5kYW50TnVsbENoZWNrT25OdWxsTG9jYWxWYXJpYWJsZTwvY29kZT4gLSBSZWR1bmRhbnQgbnVsbCBjaGVjazogVGhlIHZhcmlhYmxlIG8gY2FuIG9ubHkgYmUgbnVsbCBhdCB0aGlzIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48Y29kZT5OdWxsTG9jYWxWYXJpYWJsZUNvbXBhcmlzb25ZaWVsZHNGYWxzZTwvY29kZT4gLSBOdWxsIGNvbXBhcmlzb24gYWx3YXlzIHlpZWxkcyBmYWxzZTogVGhlIHZhcmlhYmxlIHggY2FuIG9ubHkgYmUgbnVsbCBhdCB0aGlzIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48Y29kZT5SZWR1bmRhbnRMb2NhbFZhcmlhYmxlTnVsbEFzc2lnbm1lbnQ8L2NvZGU+IC0gUmVkdW5kYW50IGFzc2lnbm1lbnQ6IFRoZSB2YXJpYWJsZSB4IGNhbiBvbmx5IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+CisgICAgICA8bGk+PGNvZGU+TnVsbExvY2FsVmFyaWFibGVJbnN0YW5jZW9mWWllbGRzRmFsc2U8L2NvZGU+IC0gaW5zdGFuY2VvZiBhbHdheXMgeWllbGRzIGZhbHNlOiBUaGUgdmFyaWFibGUgbyBjYW4gb25seSBiZSBudWxsIGF0IHRoaXMgbG9jYXRpb248L2xpPgorICAgICAgPGxpPjxjb2RlPlJlZHVuZGFudE51bGxDaGVja09uTm9uTnVsbExvY2FsVmFyaWFibGU8L2NvZGU+IC0gUmVkdW5kYW50IG51bGwgY2hlY2s6IFRoZSB2YXJpYWJsZSBvMiBjYW5ub3QgYmUgbnVsbCBhdCB0aGlzIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48Y29kZT5Ob25OdWxsTG9jYWxWYXJpYWJsZUNvbXBhcmlzb25ZaWVsZHNGYWxzZTwvY29kZT4gLSBOdWxsIGNvbXBhcmlzb24gYWx3YXlzIHlpZWxkcyBmYWxzZTogVGhlIHZhcmlhYmxlIGkgY2Fubm90IGJlIG51bGwgYXQgdGhpcyBsb2NhdGlvbjwvbGk+CisgICAgPC91bD4KKyAgICBOb3RlIHRoYXQgcHJvYmxlbSBJRHMgPGNvZGU+TG9jYWxWYXJpYWJsZUNhbm5vdEJlTnVsbDwvY29kZT4sCisgICAgPGNvZGU+TG9jYWxWYXJpYWJsZUNhbk9ubHlCZU51bGw8L2NvZGU+LCBhbmQKKyAgICA8Y29kZT5Mb2NhbFZhcmlhYmxlTWF5QmVOdWxsPC9jb2RlPiBoYXZlIGJlZW4gZGVwcmVjYXRlZC48YnI+CisgICAgU2VlIGJ1Z3MgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NTcwIj4xNzU1NzA8L2E+CisgICAgYW5kIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTU3MSI+MTc1NTcxPC9hPgorICAgIGZvciBkZXRhaWxzLgorPC9saT4KKzxsaT5UaGUgQVBJIG1ldGhvZCA8Y29kZT5JQ2xhc3NGaWxlI2dldFR5cGUoKTwvY29kZT4gZG9lcyBub3QgbG9uZ2VyIHRocm93IDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4KKyhzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDY2NyI+MTU0NjY3PC9hPikuPC9saT4KKzxsaT5Db2RlIEFzc2lzdDogdW5yZXNvbHZlZCBzaW1wbGUgbmFtZXMgYXJlIHByb3Bvc2VkIHdoZW4gY29tcGxldGluZyBhIHNpbXBsZSBuYW1lIHJlZmVyZW5jZTxicj4KKzxwcmU+CitwYWNrYWdlIHRlc3Q7CitwdWJsaWMgY2xhc3MgRTEgeworICAgICAgICB2b2lkIG0oKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGUgPSAxMDsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odik7IC8vIGRvIGNvbXBsZXRpb24gYWZ0ZXIgJ3YnCisgICAgICAgIH0KK30KKzwvcHJlPgorV2hlbiA8aT52PC9pPiBpcyBjb21wbGV0ZWQsIDxpPnZhcmlhYmxlPC9pPiBpcyBwcm9wb3NlZCBhcyBhIHBvc3NpYmxlIGxvY2FsIHZhcmlhYmxlIHdoaWNoIGFyZSBub3QgeWV0IGRlY2xhcmVkLjxicj4KK1VucmVzb2x2ZWQgc2ltcGxlIG5hbWVzIGFyZSBzZWFyY2hlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0NTg4Ij4xNzQ1ODg8L2E+CitbY29tcGlsZXJdIENvZGUgaW4gYWJzdHJhY3QgY2xhc3MgY2FsbHMgd3Jvbmcgb3ZlcmxvYWRlZCBtZXRob2QuIENvcnJlY3QgbWV0aG9kIGlzIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGVkIGludGVyZmFjZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzMjEiPjE3NjMyMTwvYT4KK1Rlc3QgZmFpbHVyZXMgaW4gTWV0aG9kUGFyYW1ldGVyR3Vlc3NpbmdDb21wbGV0aW9uVGVzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM2MSI+MTc2MzYxPC9hPgorW3NlYXJjaF0gVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIgY3JlYXRlcyBpbnZhbGlkIGhhbmRsZSBmb3IgbWVtYmVyIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzNTgiPjE3NjM1ODwvYT4KK1tzZWFyY2hdIEZhaWx1cmUgaW4gSmF2YVNlYXJjaEJ1Z3NUZXN0IHdoaWxlIHJ1bm5pbmcgcmFuZG9tIHRlc3RzIG9yZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NDYxIj4xNDc0NjE8L2E+CitbY29tcGlsZXJdW2JhdGNoXVtvcHRpb25zXSB0aWdodGVuIHRoZSB1c2Ugb2YgOiBhbmQgOyB3aXRoaW4gYWNjZXNzIHJlc3RyaWN0aW9uIHNwZWNpZmljYXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyODY1Ij4xNjI4NjU8L2E+CitDb250ZW50IGFzc2lzdCBmb3IgdW5kZWNsYXJlZCBsb2NhbHMgd2hlbiB1c2luZyBsb2NhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDY2NyI+MTU0NjY3PC9hPgorSUNsYXNzRmlsZSNnZXRUeXBlKCkgc2hvdWxkIG5vdCB0aHJvdyBKYXZhTW9kZWxFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU1NzEiPjE3NTU3MTwvYT4KK1tjb21waWxlcl1bbnVsbF0gQmV0dGVyIGNvbXBpbGVyIG1lc3NhZ2UgZm9yICdSZWR1bmRhbnQgbnVsbCBjaGVjaycKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU1NzAiPjE3NTU3MDwvYT4KK1tjb21waWxlcl1bbnVsbF0gSW1wcm92ZSBjb21waWxlciBtZXNzYWdlIGZvciAnTnVsbCByZWZlcmVuY2UnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1ODQ5Ij4xNzU4NDk8L2E+CitQcm9qZWN0IGlzIHRvdWNoZWQgb24gcmVzdGFydAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTgzMiI+MTc1ODMyPC9hPgorW3JlY292ZXJ5XSAkbWlzc2luZyQgc2hvdWxkIG5vdCBiZSBzaG93biBpbnNpZGUgYSBtZXNzYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1ODM0Ij4xNzU4MzQ8L2E+CitbYXNzaXN0XSBhbHJlYWR5IGRlZmluZWQgbmFtZSBpcyBwcm9wb3NlZCBhcyB2YXJpYWJsZSBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NTMxIj4xNzU1MzE8L2E+CitMaXZlbG9jayBpbiBPdmVyZmxvd2luZ0xSVUNhY2hlLnByaXZhdGVSZW1vdmVFbnRyeQorCis8YSBuYW1lPSJ2XzczOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTYgLSAyN3RoIEZlYnJ1YXJ5IDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzM5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlJlZmluZWQgdGhlIG9wdGlvbnMgdGhhdCBjb250cm9sIG51bGwtcmVsYXRlZCBpc3N1ZXMgZGV0ZWN0aW9uLiBUaGUgZXhpc3RpbmcKKzxjb2RlPm51bGxSZWZlcmVuY2U8L2NvZGU+IG9wdGlvbiBoYXMgYmVlbiByZXB1cnBvc2VkIGFuZCBzcGxpdCBpbnRvIHRocmVlCitvcHRpb25zOgorPHByZT4KK0NPTVBJTEVSIC8gUmVwb3J0aW5nIE51bGwgRGVyZWZlcmVuY2UKKyAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEKKyAgIHZhcmlhYmxlIHRoYXQgaXMgc3RhdGljYWxseSBrbm93biB0byBob2xkIGEgbnVsbCB2YWx1ZSBpcyB1c2VkIHRvCisgICBhY2Nlc3MgYSBmaWVsZCBvciBtZXRob2QuCisgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZSIKKyAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCitDT01QSUxFUiAvIFJlcG9ydGluZyBQb3RlbnRpYWwgTnVsbCBEZXJlZmVyZW5jZQorICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYQorICAgdmFyaWFibGUgdGhhdCBoYXMgZm9ybWVybHkgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBudWxsIGJ1dCBpcyBub3QgKG5vIG1vcmUpCisgICBzdGF0aWNhbGx5IGtub3duIHRvIGhvbGQgYSBub24tbnVsbCB2YWx1ZSBpcyB1c2VkIHRvIGFjY2VzcyBhIGZpZWxkIG9yCisgICBtZXRob2QuCisgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZSIKKyAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCitDT01QSUxFUiAvIFJlcG9ydGluZyBSZWR1bmRhbnQgTnVsbCBDaGVjaworICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYQorICAgdmFyaWFibGUgdGhhdCBpcyBzdGF0aWNhbGx5IGtub3duIHRvIGhvbGQgYSBudWxsIG9yIGEgbm9uLW51bGwgdmFsdWUKKyAgIGlzIHRlc3RlZCBhZ2FpbnN0IG51bGwuCisgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrIgorICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKKzwvcHJlPgorU2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA3MDQiPjE3MDcwNDwvYT4KK2ZvciBkZXRhaWxzLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwNzA0Ij4xNzA3MDQ8L2E+CitbY29tcGlsZXJdW251bGxdW2VuaF0gc2VwYXJhdGUgIm51bGwgZGVyZWZlcmVuY2UiIGFuZCAibnVsbCByZWZlcmVuY2UiIGNvbXBpbGVyIG9wdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI2NjYiPjE3MjY2NjwvYT4KK0ltcG9ydGluZyBwZGUudWkgYW5kIGRlcGVuZGVuY2llcyBhcyBiaW5hcnkgZ2l2ZXMgY29tcGlsZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDk3MSI+MTc0OTcxPC9hPgorW2luZGV4XSBNYW55IGV4Y2VwdGlvbnMgZnJvbSBiYWNrZ3JvdW5kIGluZGV4ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI5MTMiPjE3MjkxMzwvYT4KK1tjb21waWxlcl1bMS41XSBhbiBleHRyYSBjaGVja2Nhc3QgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODc5Ij4xNzQ4Nzk8L2E+CitbMS41XVtjb21waWxlcl0gT3B0aW1pc2F0aW9uIGZvciBlbXB0eSBpZiBibG9ja3MgcmVzdWx0cyBpbiBub3QgZXZhbHVhdGluZyB0aGUgdGVzdCBleHByZXNzaW9uCisKKzxhIG5hbWU9InZfNzM4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNiAtIDIxc3QgRmVicnVhcnkgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzM4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxODAyIj4xNzE4MDI8L2E+CitbamF2YWRvY11bc2VsZWN0XSBGMyBkb2VzIG5vdCB3b3JrIG9uIG1ldGhvZCB3aGljaCBoYXZlIGRlcHJlY2F0ZWQgdHlwZSBhcyBhcmd1bWVudAorCis8YSBuYW1lPSJ2XzczNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTYgLSAyMHRoIEZlYnJ1YXJ5IDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzM3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczNyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFQSSBhZGRlZCBvbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlPC9jb2RlPjoKKzxwcmU+CisvKioKKyAqIFJldHVybnMgdGhlIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzIGZpbGUuCisgKgorICogQHJldHVybiB0aGUgYnl0ZXMgY29udGFpbmVkIGluIHRoaXMgY2xhc3MgZmlsZQorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICogQHNpbmNlIDMuMworICovCitieXRlW10gZ2V0Qnl0ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDI0NCI+MTUwMjQ0PC9hPiBmb3IgZGV0YWlscy4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTY1MyI+MTcxNjUzPC9hPgorW2luZGV4XSBKYXZhIFRvb2xpbmcgaW5pdGlhbGl6YXRpb24gcGVyZm9ybWFuY2UgaXNzdWUgYWZ0ZXIgc3RhcnR1cAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDM0OCI+MTc0MzQ4PC9hPgorW2NsYXNzcGF0aF0gQ2xhc3NwYXRoIHZhbGlkYXRpb24gbWVzc2FnZXMgYXJlIG5vbi1zdGFuZGFyZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM0NSI+MTcyMzQ1PC9hPgorW21vZGVsXVtkZWx0YV0gcGF0aCBlcnJvciBtYXJrZXJzIGFyZSBub3QgcmVnZW5lcmF0ZWQgb24gcHJvamVjdCByZWJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTcxOTkiPjk3MTk5PC9hPgorW2Zvcm1hdHRpbmddIENvZGUgZm9ybWF0dGluZyBhY3RpdmF0aW9uIGluIGNvbW1lbnRzICh1c2luZyAmbHQ7UFJFJmd0OykgaXMgY2FzZSBzZW5zaXRpdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAyNDQiPjE1MDI0NDwvYT4KK1tBUEldIEFkZCBnZXRCeXRlcygpIG9uIElDbGFzc0ZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQ0MzQiPjE3NDQzNDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBQYXJhbWV0ZXJpemVkIGNvbnN0cnVjdG9yIGxlYWRzIHRvIEludGVybmFsIEVycnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mjg1MCI+MTUyODUwPC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIG1hcmtzIHVuY2hhbmdlZCBmaWxlIGRpcnR5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0MzcxIj4xMDQzNzE8L2E+CitbSkRPTV0gSkRPTSBzaG91bGQgbm90IGNyYXNoIG9uIDEuNSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4OTEwIj4xNjg5MTA8L2E+CitTaG91bGQgZGVmYXVsdCBjb21wbGlhbmNlIGJlIDYuMCBpbiBKU1IxOTkgYmF0Y2ggY29tcGlsYXRpb24/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MzE3Ij4xNjczMTc8L2E+CitlY2pzcmMuemlwIHNob3VsZCBjb250YWluIGEgYnVpbGQgc3lzdGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczOTkyIj4xNzM5OTI8L2E+CitEdXBsaWNhdGUgbG9jYWwgdmFyaWFibGUgIGZvciBleGNlcHRpb24gaW4gZGlmZmVyZW50IGNhdGNoIGJsb2NrcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDI5OCI+MTc0Mjk4PC9hPgorV3JvbmcgTkFNRV9QUk9QRVJUWSBjaGlsZCB0eXBlIGZvciBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFuZCBFbnVtRGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQwMDIiPjE3NDAwMjwvYT4KK1thc3Npc3RdIEV4Y2VwdGlvbnMgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieSB0aGUgYW5vdGhlciBleGNlcHRpb24gYXJlIHByb3Bvc2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MDAxIj4xNzQwMDE8L2E+CitbYXNzaXN0XSBVbmV4cGVjdGVkIHR5cGVzIGFyZSBwcm9wb3NlZCBpbnNpZGUgY2F0Y2ggYmxvY2sKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkxNTQiPjE0OTE1NDwvYT4KK0JpbmFyeU1ldGhvZCNnZXRQYXJhbWV0ZXJOYW1lcygpIHNob3VsZCBub3QgdHJ5IHRvIGV4dHJhY3QgZnJvbSBhdHRhY2hlZCBqYXZhZG9jIGZvciBzeW50aGV0aWNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MTMxIj4xNzQxMzE8L2E+CitbYXNzaXN0XSBSZXN1bHQgb2YgdGVzdCBDb21wbGV0aW9uVGVzdHMjdGVzdENvbXBsZXRpb25JbnNpZGVFeHRlbmRzMTAgaXMgd3JvbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM3MyI+MzQzNzM8L2E+CitDbGFzcyBmaWxlIHZpZXcgZG9lc24ndCBzaG93IGFjdHVhbCBtb2RpZmllcnMgZm9yIG1lbWJlciB0eXBlcworCis8YSBuYW1lPSJ2XzczNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTYgLSAxM3RoIEZlYnJ1YXJ5IDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzM2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODAzOSI+MTU4MDM5PC9hPgorW2FzdCByZXdyaXRlXSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiByZXdyaXRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM5MDciPjE3MzkwNzwvYT4KK1tjb2RlIGFzc2lzdF0gc2V2ZXJlIE5QRSBvbiBleGNlcHRpb24gY29tcGxldGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4MDAiPjE3MzgwMDwvYT4KK1tjb21waWxlcl0gc3Vib3B0aW1hbCBsaW5lIG51bWJlciBhdHRyaWJ1dGVzIGZvciBjYXNjYWRpbmcgZmllbGQgYWNjZXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4NDkiPjE3Mzg0OTwvYT4KK0lUeXBlQmluZGluZyNnZXRKYXZhRWxlbWVudCgpIGZhaWxzIGZvciBhcnJheSBvZiBpbm5lciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODUzIj4xNzM4NTM8L2E+CitbcmVjb3ZlcnldIFJlY292ZXJ5IGFkZCBhbiB1bm5lY2Vzc2FyeSBkZWZhdWx0IGNvbnRydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzMwMTMiPjE3MzAxMzwvYT4KK1thc3Npc3RdIE5QRSB3aGlsZSBjb21wbGV0aW5nIGluIGNhdGNoIGZvcm1hbCBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDIyMzQiPjE0MjIzNDwvYT4KK3Byb2JsZW0gcmFuZ2UgaW5jbHVkZXMgcGFyZW50aGVzaXMgZm9yIHdhcm5pbmcgb24gZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzAwMSI+MTA3MDAxPC9hPgorSVR5cGVCaW5kaW5nI2dldEJpbmFyeU5hbWUoKSByZXR1cm5zIGphdmEubGFuZy5PYmplY3QgZm9yIHR5cGUgdmFyaWFibGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYzMDciPjE1NjMwNzwvYT4KK0phdmFFbGVtZW50LmdldFVSTENvbnRlbnRzKCkgaGFjayBicmVha3MgJnF1b3Q7T3BlbiBFeHRlcm5hbCBKYXZhZG9jJnF1b3Q7Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTI5Ij4xMTE1Mjk8L2E+CitucGUgdHJ5aW5nIHRvIGdldCBJVHlwZUJpbmRpbmcgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDc0MiI+MTQ0NzQyPC9hPgorU2V0dGluZyB0aGUgYm9vdGNsYXNzcGF0aCBmb3Igc29tZSBWTXMgZmFpbHMgdGhlIGV2YWx1YXRpb24gdGVzdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI3NDMiPjE3Mjc0MzwvYT4KK1tqc3IyNjldIEFQVCBuZWVkcyB0byBjb252ZXJ0IElGaWxlIGludG8gaW50ZXJuYWwgSUNvbXBpbGF0aW9uVW5pdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODg5NyI+MTM4ODk3PC9hPgorRXJyb3IgcmFuZ2VzIGZvciB1bnJlYWNoYWJsZSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyODQ4Ij4xNzI4NDg8L2E+CitbZm9ybWF0dGVyXSBjb2RlIGZvcm1hdHRlciBwcm9kdWNlcyBzeW50YXggZXJyb3IgKHVuYXJ5IG9wZXJhdG9yKyBmb2xsb3dlZCBieSBwcmVmaXggaW5jcmVtZW50IG9wZXJhdG9yKyspCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczMzc2Ij4xNzMzNzY8L2E+CitbanNyMjY5XSBNdWx0aXBsZSBhbm5vdGF0aW9ucyBvbiBjbGFzcywgb25seSBmaXJzdCBpcyByZXNvbHZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzQxNiI+MTczNDE2PC9hPgorW2NvbXBpbGVyXVtiYXRjaF1bb3B0aW9uc10gZWNqIGRvZXNuJ3Qgc3VwcG9ydCBjbGFzc3BhdGggZW50cnkgc3RhcnRpbmcgd2l0aCBbCisKKzxhIG5hbWU9InZfNzM1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNSAtIDh0aCBGZWJydWFyeSAyMDA3IC0gMy4zIE1JTEVTVE9ORSA1Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI2MzMiPjE3MjYzMzwvYT4KK05QRXMgd2hpbGUgc3RhcnRpbmcgbXkgd29ya3NwYWNlCisKKzxhIG5hbWU9InZfNzM0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNSAtIDNyZCBGZWJydWFyeSAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgZXh0ZW5zaW9uIHBvaW50IGhhcyBiZWVuIGFkZGVkIHRvIHJlZ2lzdGVyIGFuIGFubm90YXRpb24gcHJvY2Vzc29yIG1hbmFnZXIgaW5zaWRlIHRoZSBKYXZhIEJ1aWxkZXIuCitTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM2OSI+MTcyMzY5PC9hPiBmb3IgZGV0YWlscy48L2xpPgorPGxpPkluIG9yZGVyIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk0MTIiPjQ5NDEyPC9hPiwgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQ6Cis8dWw+Cis8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0NMRUFSX0JMQU5LX0xJTkVTPC9saT4KKzxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUPC9saT4KKzwvdWw+CitUaGV5IGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGVzZSBjb25zdGFudHMgcmVzcGVjdGl2ZWx5OgorPHVsPgorPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfQ09NTUVOVF9DTEVBUl9CTEFOS19MSU5FU19JTl9KQVZBRE9DX0NPTU1FTlQ8YnI+CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfQ0xFQVJfQkxBTktfTElORVNfSU5fQkxPQ0tfQ09NTUVOVDwvbGk+Cis8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9MSU5FX0NPTU1FTlQ8YnI+CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0JMT0NLX0NPTU1FTlQ8YnI+CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfRk9STUFUX0pBVkFET0NfQ09NTUVOVDwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyNjQ4Ij4xNzI2NDg8L2E+CitbbW9kZWxdIFNvbWUgaW5jb25zaXN0ZW5jaWVzIHdoaWxlIGFkZGluZyBsaXN0ZW5lcnMgdG8gRGVsdGFQcm9jZXNzaW5nU3RhdGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTQxMiI+NDk0MTI8L2E+CitbZm9ybWF0dGluZ10gT2ZmZXIgY29tbWVudCBmb3JtYXR0aW5nIG9wdGlvbnMgcGVyIGNvbW1lbnQgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk5NiI+MTYxOTk2PC9hPgorW2NvbXBpbGVyXVtiYXRjaF1bb3B0aW9uc10gZWNqIGNhbid0IGNvcGUgd2l0aCBbXSBicmFja2V0cyBpbiBjbGFzc3BhdGggbmFtZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI0NDQiPjE3MjQ0NDwvYT4KK2J1aWxkIHdvcmtzcGFjZSBvcGVyYXRpb24gbGF1bmNoZWQgYWZ0ZXIgZWFjaCBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyMDI4Ij4xNzIwMjg8L2E+CitbY2xlYW4gdXBdIFNvcnQgbWVtYmVycyBjbGVhbiB1cCBsZWFrcyB3b3JraW5nIGNvcGllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjM2OSI+MTcyMzY5PC9hPgorQWRkaW5nIGFuIGV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBhbiBhbm5vdGF0aW9uIHByb2Nlc3NvciBpbnNpZGUgdGhlIGphdmEgYnVpbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjE4OSI+MTcyMTg5PC9hPgorWzEuNV1bY29tcGlsZXJdIE5QRSBpbiBDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3Mgd2l0aCBleHBsaWNpdCB3aWxkY2FyZCBpbnZvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcyMjA3Ij4xNzIyMDc8L2E+CitbbW9kZWxdIE1hcmtlciBmb3IgZGVwcmVjYXRlZCBjbGFzc3BhdGggdmFyaWFibGUgc2hvdWxkIGFsd2F5cyBoYXZlIFdBUk5JTkcgc2V2ZXJpdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzIzMjgiPjE3MjMyODwvYT4KK0phdmFkb2MgZm9yIFNlYXJjaEVuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMoLi4pIGhhcyB3cm9uZyBAcGFyYW0gb3JkZXJpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE2ODQiPjE3MTY4NDwvYT4KK1JlcGxhY2UgcmVmZXJlbmNlcyB0byBJTWFya2VyLkdFTkVSQVRFRF9CWSB3aXRoIElNYXJrZXIuU09VUkNFX0lECisKKzxhIG5hbWU9InZfNzMzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNSAtIDMwdGggSmFudWFyeSAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgQVBJIGFkZGVkIGluIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb248L2NvZGU+Ojxicj4KKzxwcmU+CisvKioKKyAqIENvbXBhcmVzIHRoZSB0d28gY2hhciBhcnJheXMgbGV4aWNvZ3JhcGhpY2FsbHkuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYXJyYXkxIGxleGljb2dyYXBoaWNhbGx5IHByZWNlZGVzIHRoZSBhcnJheTIsCisgKiBhIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBhcnJheTEgbGV4aWNvZ3JhcGhpY2FsbHkgZm9sbG93cyB0aGUgYXJyYXkyLCBvcgorICogemVybyBpZiBib3RoIGFycmF5cyBhcmUgZXF1YWwuCisgKgorICogQHBhcmFtIGFycmF5MSB0aGUgZmlyc3QgYXJyYXkKKyAqIEBwYXJhbSBhcnJheTIgdGhlIHNlY29uZCBhcnJheQorICogQHJldHVybiB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBhcnJheTEgYW5kIGFycmF5MgorICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIGFycmF5cyBpcyBudWxsCisgKiBAc2luY2UgMy4zCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhcmVUbyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQorPC9wcmU+Cis8L2xpPgorPGxpPk5ldyBBUEkgYWRkZWQgaW4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5Db21waWxhdGlvblVuaXRTb3J0ZXI8L2NvZGU+Ojxicj4KKzxwcmU+CS8qKgorCSAqIFJlb3JkZXJzIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIHNwZWNpZmllZCBjb21wYXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhcnJhbmdpbmcgaW4gYWR2YW5jZQorCSAqIHRoYXQgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgaXMgYSB3b3JraW5nIGNvcHksIGFuZCBmb3IgYXBwbHlpbmcgdGhlCisJICogcmV0dXJuZWQgVGV4dEVkaXQgYWZ0ZXJ3YXJkcy4KKwkgKgorCSAqIDxiPk5vdGU6PC9iPiBSZW9yZGVyaW5nIHRoZSBtZW1iZXJzIHdpdGhpbiBhIHR5cGUgZGVjbGFyYXRpb24gbWlnaHQgYmUKKwkgKiBtb3JlIHRoYW4gYSBjb3NtZXRpYyBjaGFuZ2UgYW5kIGNvdWxkIGhhdmUgcG90ZW50aWFsbHkgc2VyaW91cworCSAqIHJlcGVyY3Vzc2lvbnMuIEZpcnN0bHksIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIG9mIGEgdHlwZSBhcmUKKwkgKiBpbml0aWFsaXplZCBpcyBzaWduaWZpY2FudCBpbiB0aGUgSmF2YSBsYW5ndWFnZTsgcmVvcmRlcmluZyBmaWVsZHMgYW5kCisJICogaW5pdGlhbGl6ZXJzIG1heSByZXN1bHQgaW4gY29tcGlsYXRpb24gZXJyb3JzIG9yIGNoYW5nZSB0aGUgZXhlY3V0aW9uCisJICogYmVoYXZpb3Igb2YgdGhlIGNvZGUuIFNlY29uZGx5LCByZW9yZGVyaW5nIGEgY2xhc3MncyBtZW1iZXJzIG1heSBhZmZlY3QKKwkgKiBob3cgaXRzIGluc3RhbmNlcyBhcmUgc2VyaWFsaXplZC4gVGhpcyBvcGVyYXRpb24gc2hvdWxkIHRoZXJlZm9yZSBiZSB1c2VkCisJICogd2l0aCBjYXV0aW9uIGFuZCBkdWUgY29uY2VybiBmb3IgcG90ZW50aWFsIG5lZ2F0aXZlIHNpZGUgZWZmZWN0cy4KKwkgKgorCSAqCisJICogVGhlIDxjb2RlPmNvbXBhcmU8L2NvZGU+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gY29tcGFyYXRvciBpcyBwYXNzZWQgcGFpcnMKKwkgKiBvZiBib2R5IGRlY2xhcmF0aW9ucyAoc3ViY2xhc3NlcyBvZiA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KQorCSAqIHJlcHJlc2VudGluZyBib2R5IGRlY2xhcmF0aW9ucyBhdCB0aGUgc2FtZSBsZXZlbC4gVGhlIG5vZGVzIGFyZSBmcm9tIGFuCisJICogQVNUIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwgKHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyI25ld1BhcnNlcihpbnQpfS4KKwkgKiBDbGllbnRzIHdpbGwgZ2VuZXJhbGx5IHVzZSBBU1QuSkxTMyBzaW5jZSB0aGF0IHdpbGwgY292ZXIgYWxsCisJICogY29uc3RydWN0cyBmb3VuZCBpbiBKYXZhIDEuMCwgMS4xLCAxLjIsIDEuMywgMS40LCBhbmQgMS41IHNvdXJjZSBjb2RlLgorCSAqIFRoZSBjb21wYXJhdG9yIGlzIGNhbGxlZCBvbiBib2R5IGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgY2xhc3NlcywKKwkgKiBpbmNsdWRpbmcgYW5vbnltb3VzIGFuZCBsb2NhbCBjbGFzc2VzLCBidXQgYWx3YXlzIGF0IHRoZSBzYW1lIGxldmVsLgorCSAqIENsaWVudHMgbmVlZCB0byBwcm92aWRlIGEgY29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbiAodGhlcmUgaXMgbm8gc3RhbmRhcmQKKwkgKiBjb21wYXJhdG9yKS4gVGhlIDxjb2RlPlJFTEFUSVZFX09SREVSPC9jb2RlPiBwcm9wZXJ0eSBhdHRhY2hlZCB0byB0aGVzZQorCSAqIEFTVCBub2RlcyBhZmZvcmRzIHRoZSBjb21wYXJhdG9yIGEgd2F5IHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCByZWxhdGl2ZQorCSAqIG9yZGVyLgorCSAqCisJICoKKwkgKiBUaGUgYm9keSBkZWNsYXJhdGlvbnMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGNvbXBhcmF0b3IgYWx3YXlzIGNhcnJ5CisJICogYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBtaW5pbWFsIHNpZ25hdHVyZSBpbmZvcm1hdGlvbjoKKwkgKgorCSAqCisJICogPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPgorCSAqIDxjb2RlPm1vZGlmaWVycywgaXNJbnRlcmZhY2UsIG5hbWUsIHN1cGVyY2xhc3MsCisJICogICAgICAgIHN1cGVySW50ZXJmYWNlcywgdHlwZVBhcmFtZXRlcnMKKwkgKiAgICAgICAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+CisJICoKKwkgKiA8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPgorCSAqIDxjb2RlPm1vZGlmaWVycywgdHlwZSwgZnJhZ21lbnRzCisJICogICAgICAgIChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzCisJICogICAgICAgIHdpdGggbmFtZSBvbmx5KQorCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KKwkgKgorCSAqIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uPC9jb2RlPgorCSAqIDxjb2RlPm1vZGlmaWVycywgaXNDb25zdHJ1Y3RvciwgcmV0dXJuVHlwZSwgbmFtZSwKKwkgKiAgICAgICAgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMKKwkgKiAgICAgICAgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zIHdpdGggbmFtZSwgdHlwZSwgYW5kIG1vZGlmaWVycyBvbmx5KSwKKwkgKiAgICAgICAgdGhyb3duRXhjZXB0aW9ucworCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KKwkgKgorCSAqIDxjb2RlPkluaXRpYWxpemVyPC9jb2RlPgorCSAqIDxjb2RlPm1vZGlmaWVycworCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KKwkgKgorCSAqIDxjb2RlPkFubm90YXRpb25UeXBlRGVjbGFyYXRpb248L2NvZGU+CisJICogPGNvZGU+bW9kaWZpZXJzLCBuYW1lCisJICogICAgICAgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPgorCSAqCisJICogPGNvZGU+QW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbjwvY29kZT4KKwkgKiA8Y29kZT5tb2RpZmllcnMsIG5hbWUsIHR5cGUsIGRlZmF1bHQKKwkgKiAgICAgICAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+CisJICoKKwkgKiA8Y29kZT5FbnVtRGVjbGFyYXRpb248L2NvZGU+CisJICogPGNvZGU+bW9kaWZpZXJzLCBuYW1lLCBzdXBlckludGVyZmFjZXMKKwkgKiAgICAgICAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+CisJICoKKwkgKiA8Y29kZT5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjwvY29kZT4KKwkgKiA8Y29kZT5tb2RpZmllcnMsIG5hbWUsIGFyZ3VtZW50cworCSAqICAgICAgICBSRUxBVElWRV9PUkRFUiBwcm9wZXJ0eTwvY29kZT4KKwkgKgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBBU1Qgbm9kZXMgYmVpbmcgcHJvcGVybHkgcGFyZW50ZWQKKwkgKiBvciBvbiBoYXZpbmcgc291cmNlIHJhbmdlIGluZm9ybWF0aW9uLiAoRnV0dXJlIHJlbGVhc2VzIG1heSBwcm92aWRlCisJICogb3B0aW9ucyBmb3IgcmVxdWVzdGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxpa2Ugc291cmNlIHBvc2l0aW9ucywgZnVsbAorCSAqIEFTVHMsIG5vbi1yZWN1cnNpdmUgc29ydGluZywgZXRjLikKKwkgKgorCSAqIEBwYXJhbSB1bml0CisJICogICAgICAgICAgICB0aGUgQ29tcGlsYXRpb25Vbml0IHRvIHNvcnQKKwkgKiBAcGFyYW0gY29tcGFyYXRvcgorCSAqICAgICAgICAgICAgdGhlIGNvbXBhcmF0b3IgY2FwYWJsZSBvZiBvcmRlcmluZworCSAqICAgICAgICAgICAgPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPnM7IHRoaXMgY29tcGFyYXRvciBpcyBwYXNzZWQKKwkgKiAgICAgICAgICAgIEFTVCBub2RlcyBmcm9tIGFuIEFTVCBvZiB0aGUgc3BlY2lmaWVkIEFTVCBsZXZlbAorCSAqIEBwYXJhbSBvcHRpb25zCisJICogICAgICAgICAgICBiaXR3aXNlLW9yIG9mIG9wdGlvbiBmbGFnczsgPGNvZGU+MDwvY29kZT4gZm9yIGRlZmF1bHQKKwkgKiAgICAgICAgICAgIGJlaGF2aW9yIChyZXNlcnZlZCBmb3IgZnV0dXJlIGdyb3d0aCkKKwkgKiBAcGFyYW0gZ3JvdXAKKwkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGVkaXQgZ3JvdXAgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB0ZXh0IGVkaXRzLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBtb25pdG9yCisJICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBub3RpZnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAcmV0dXJuIGEgVGV4dEVkaXQgZGVzY3JpYmluZyB0aGUgcmVxdWlyZWQgZWRpdHMgdG8gZG8gdGhlIHNvcnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgICAgICAgICBpZiBzb3J0aW5nIGlzIG5vdCByZXF1aXJlZAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgdGhlIGNvbXBpbGF0aW9uIHVuaXQgY291bGQgbm90IGJlIHNvcnRlZC4gUmVhc29ucworCSAqICAgICAgICAgICAgICAgIGluY2x1ZGU6CisJICogICAgICAgICAgICAgICAgLSBUaGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBkb2VzIG5vdCBleGlzdAorCSAqICAgICAgICAgICAgICAgIChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKQorCSAqICAgICAgICAgICAgICAgIC0gVGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGEgd29ya2luZyBjb3B5CisJICogICAgICAgICAgICAgICAgKElOVkFMSURfRUxFTUVOVF9UWVBFUykKKwkgKiAgICAgICAgICAgICAgICAtIEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUKKwkgKiAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkgKiAgICAgICAgICAgICAgICAtIFRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGRvZXNuJ3QgY29tZSBmcm9tIGFuIElDb21waWxhdGlvblVuaXQgYW5kIHRoaXMgSUNvbXBpbGF0aW9uVW5pdCBpcworCSAqICAgICAgICAgICAgICAgIG5vdCBhIHdvcmtpbmcgY29weSAoTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUykKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGlzIG51bGwgb3IgaWYgdGhlIGdpdmVuCisJICogICAgICAgICAgICAgICAgY29tcGFyYXRvciBpcyBudWxsLCBvciBpZiA8Y29kZT5vcHRpb25zPC9jb2RlPiBpcyBub3Qgb25lCisJICogICAgICAgICAgICAgICAgb2YgdGhlIHN1cHBvcnRlZCBsZXZlbHMuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uCisJICogQHNlZSAjUkVMQVRJVkVfT1JERVIKKwkgKiBAc2luY2UgMy4zCisJICovCisJIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgc29ydChDb21waWxhdGlvblVuaXQgdW5pdCwKKwkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciwKKwkJCWludCBvcHRpb25zLAorCQkJVGV4dEVkaXRHcm91cCBncm91cCwKKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjs8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjM1NCI+MTY2MzU0PC9hPgorWzEuNV1bY29tcGlsZXJdIGV4dHJhbmVvdXMgZXJyb3IgY2F1c2VkIGJ5IGEgbm9uIHZpc2libGUgbWV0aG9kIG9mIGFuIGluaGVyaXRlZAorY2xhc3MgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciBhIHZpc2libGUgbWV0aG9kIG9mIGFuIGVuY2xvc2luZyBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzE5MCI+MTY3MTkwPC9hPgorW3NlYXJjaF0gVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIgY2F1c2luZyBDbGFzc0Nhc3RFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE4MzAiPjE0MTgzMDwvYT4KK1sxLjNdW2NvbXBpbGVyXSBTZXZlcmUgcnVudGltZSBlcnJvcnMgd2l0aCBhbm9ueW1vdXMgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTYzNCI+MTcxNjM0PC9hPgorW2Zvcm1hdHRlcl0gZG9lc24ndCBhZGQgbGluZSBmZWVkIGF0IGVuZCBvZiBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxNDcyIj4xNzE0NzI8L2E+CitbMS42XVtjb21waWxlcl0gSWxsZWdhbCBzdGFjayBtYXAgZnJhbWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTkwIj4xNjM1OTA8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb21wYXRpYmxlIHR5cGUgYm91bmRzIG1lc3NhZ2UgcG9pbnRzIHRvIHRoZSBnZW5lcmljIHR5cGUgaW5zdGVhZCBvZiBpdHMgdHlwZSBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE3NzEiPjE3MTc3MTwvYT4KK1thc3Npc3RdIEpBVkFET0NfVFlQRV9SRUYgYXJlbid0IGNvcnJlY3RseSBmaWx0ZXJlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTE4NCI+MTcxMTg0PC9hPgorW2NvbXBpbGVyXSBKYXZhIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlIElubmVyQ2xhc3MgYXR0cmlidXRlIGFzIHBlciBKVk1TCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczMjc5Ij4xNzMyNzk8L2E+CitbaW5kZXhpbmddIENhdGVnb3J5IHRhYmxlIGlzIG5vdCBjYWNoZWQgZm9yIHJ0LmphciBzaW5jZSAxLjUgdmVyc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODMwOSI+MTM4MzA5PC9hPgorW2luZGV4XSBPcHRpbWl6ZSBpbmRleCBmaWxlcyBwYXRoIHN0b3JhZ2UgaW4gRGlza0luZGV4IGFuZCBJbmRleE1hbmFnZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjY1NzAiPjE2NjU3MDwvYT4KK1thc3Npc3RdIFByb3Bvc2FsIGNvbXB1dGVyIGZyb20gdGhlICdvcmcuZWNsaXBzZS5teWxhci5qYXZhJyBwbHVnLWluIGRpZCBub3QgY29tcGxldGUgbm9ybWFsbHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIwNzMiPjE2MjA3MzwvYT4KK1tjb21waWxlcl0gZXh0cmFuZW91cyBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTA2NiI+MTcxMDY2PC9hPgorUHJvdmlkZSBUZXh0RWRpdCB3aGVuIHNvcnRpbmcgY29tcGlsYXRpb24gdW5pdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDMxOCI+MTcwMzE4PC9hPgorWzEuNV1bY29tcGlsZXJdIGltcHJvdmUgbWVzc2FnZSBvbiBuYW1lY2xhc2ggd2hlbiBvdmVycmlkaW5nIG1ldGhvZCB3aXRoICJ3aWxkY2FyZCIgcGFyYW1ldGVyCisKKzxhIG5hbWU9InZfNzMyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNSAtIDIzcmQgSmFudWFyeSAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzczMgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MzIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5Db2RlIEFzc2lzdDogRXhjZXB0aW9uIHRocm93biBpbiBhIHRyeSBibG9jayBhcmUgbW9yZSByZWxldmFudCBpZiB0aGUgY29tcGxldGlvbiBvY2N1cnMgaW4gYSBjYXRjaCBjbGF1c2UuCitBbHJlYWR5IGNhdWdodCBleGNlcHRpb25zIGFyZSBmaWx0ZXJlZC4KKzxwcmU+CitwdWJsaWMgY2xhc3MgWCB7CisgIHZvaWQgZm9vKCkgdGhyb3dzIFhBRXhjZXB0aW9uLCBYQkV4Y2VwdGlvbiB7fQorICB2b2lkIGJhcigpIHsKKyAgICB0cnkgeworICAgIAlmb28oKTsKKyAgICB9IGNhdGNoKFhBRXhjZXB0aW9uIGUpIHsKKyAgICB9IGNhdGNoKFh8IC8vZG8gY3RybCArIHNwYWNlIGF0IHwKKyAgfQorPC9wcmU+CitJbiB0aGlzIGV4YW1wbGUgWEJFeGNlcHRpb24gd2lsbCBtb3JlIHJlbGV2YW50IHRoYW4gWENFeGNlcHRpb24gYW5kIFhBRXhjZXB0aW9uIHdvbid0IGJlIHByb3Bvc2VkLgorPC9saT4KKzxsaT5DbGFzc3BhdGggdmFyaWFibGUgbWF5IG5vdyBiZSBmbGFnZ2VkIGFzIGRlcHJlY2F0ZWQgb3IgcmVhZC1vbmx5IChzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODU5OSI+MTM4NTk5PC9hPgorYW5kIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYyMjYiPjE1NjIyNjwvYT4pLjxicj4KK1R3byBuZXcgYXR0cmlidXRlcyBoYXZlIGJlZW4gYWRkZWQgb24gPGNvZGU+Q2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvY29kZT4gc2NoZW1hOgorPHByZT4KKyAgICZsdDtlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiJmd0OworICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0OworICAgICAgICAgLi4uCisgICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImRlcHJlY2F0ZWQiIHR5cGU9InN0cmluZyImZ3Q7CisgICAgICAgICAgICAmbHQ7YW5ub3RhdGlvbiZndDsKKyAgICAgICAgICAgICAgICZsdDtkb2N1bWVudGF0aW9uJmd0OworICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGxhaW5pbmcgdGhlIHJlYXNvbiB3aHkgdGhlIGFzc29jaWF0ZWQgdmFyaWFibGUgaXMgZGVwcmVjYXRlZAorICAgICAgICAgICAgICAgJmx0Oy9kb2N1bWVudGF0aW9uJmd0OworICAgICAgICAgICAgICAgJmx0O2FwcEluZm8mZ3Q7CisgICAgICAgICAgICAgICAgICAmbHQ7bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8mZ3Q7CisgICAgICAgICAgICAgICAmbHQ7L2FwcEluZm8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2Fubm90YXRpb24mZ3Q7CisgICAgICAgICAmbHQ7L2F0dHJpYnV0ZSZndDsKKyAgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0icmVhZE9ubHkiIHR5cGU9ImJvb2xlYW4iJmd0OworICAgICAgICAgICAgJmx0O2Fubm90YXRpb24mZ3Q7CisgICAgICAgICAgICAgICAmbHQ7ZG9jdW1lbnRhdGlvbiZndDsKKyAgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlIGNhbm5vdCBiZSBtb2RpZmllZAorICAgICAgICAgICAgICAgJmx0Oy9kb2N1bWVudGF0aW9uJmd0OworICAgICAgICAgICAgJmx0Oy9hbm5vdGF0aW9uJmd0OworICAgICAgICAgJmx0Oy9hdHRyaWJ1dGUmZ3Q7CisgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0OworICAgJmx0Oy9lbGVtZW50Jmd0OworPC9wcmU+CitXaGVuIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIHNldCBvbiBDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIGV4dGVuc2lvbiBwb2ludCwgY2xhc3NwYXRoIGVudHJ5IHZhbGlkYXRpb24KK3JldHVybnMgYSB3YXJuaW5nIHN0YXR1cyBpZiBubyBvdGhlciBlcnJvciB3YXMgcHJldmlvdXNseSBkZXRlY3RlZC4KKzxicj4KK0ZvciBleGFtcGxlLCBmb2xsb3dpbmcgPGNvZGU+IGNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBzZXQKK3RoZSA8Y29kZT5URVNUPC9jb2RlPiBjbGFzc3BhdGggdmFyaWFibGUgYXMgZGVwcmVjYXRlZCBhbmQgcmVhZC1vbmx5OgorPHByZT4KKyAgICZsdDtleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIiZndDsKKyAgICAgICZsdDtjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LnRlc3RzLm1vZGVsLlRlc3RJbml0aWFsaXplciIKKyAgICAgICAgICAgIGRlcHJlY2F0ZWQ9IlRoZSByZWFzb24gd2h5IHRoaXMgdmFyaWFibGUgaXMgZGVwcmVjYXRlZCIKKyAgICAgICAgICAgIHJlYWRPbmx5PSJ0cnVlIgorICAgICAgICAgICAgdmFyaWFibGU9IlRFU1QiJmd0OworICAgICAgJmx0Oy9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7Cis8L3ByZT4KK0NhbGxpbmcgPGNvZGU+SmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoSUphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnksIGJvb2xlYW4pPC9jb2RlPgorbWV0aG9kIG9uIHRoaXMgdmFyaWFibGUgZW50cnkgd2lsbCByZXR1cm4gYSA8Y29kZT5JU3RhdHVzLldBUk5JTkc8L2NvZGU+IHN0YXR1cyB3aXRoIGZvbGxvd2luZyBtZXNzYWdlOgorLgorPGJyPgorQ2xhc3NwYXRoIHZhcmlhYmxlIGRlcHJlY2F0aW9uIG1lc3NhZ2UgYW5kIHJlYWQtb25seSBpbmZvcm1hdGlvbiBhcmUgYWNjZXNzaWJsZSB1c2luZyB0d28gbmV3IGFkZGVkCis8Y29kZT5KYXZhQ29yZTwvY29kZT4gQVBJIG1ldGhvZHM6Cis8cHJlPgorLyoqCisgKiBSZXR1cm5zIGRlcHJlY2F0aW9uIG1lc3NhZ2Ugb2YgYSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuCisgKgorICogQHBhcmFtIHZhcmlhYmxlTmFtZQorICogQHJldHVybiBBIHN0cmluZyBpZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoVmFyaWFibGVEZXByZWNhdGlvbk1lc3NhZ2UoU3RyaW5nIHZhcmlhYmxlTmFtZSkKKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUgaXMgcmVhZC1vbmx5IG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdmFyaWFibGVOYW1lCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzc3BhdGggdmFyaWFibGUgaXMgcmVhZC1vbmx5LAorICogCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgKiBAc2luY2UgMy4zCisgKi8KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzcGF0aFZhcmlhYmxlUmVhZE9ubHkoU3RyaW5nIHZhcmlhYmxlTmFtZSkKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5MDE3Ij4xNjkwMTc8L2E+CitbMS42XVtjb21waWxlcl0gVmVyaWZ5RXJyb3I6IEluY29uc2lzdGVudCBzdGFja21hcCBmcmFtZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYyMjYiPjE1NjIyNjwvYT4KK1ttb2RlbF1bY2xhc3NwYXRoXSBBbGxvdyBjbGFzc3BhdGggdmFyaWFibGUgdG8gYmUgbWFya2VkIGFzIG5vbiBtb2RpZmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTk5Ij4xMzg1OTk8L2E+CitbbW9kZWxdW2NsYXNzcGF0aF0gTmVlZCBhIHdheSB0byBtYXJrIGEgY2xhc3NwYXRoIHZhcmlhYmxlIGFzIGRlcHJlY2F0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc1ODQiPjE1NzU4NDwvYT4KK1tjb250ZW50IGFzc2lzdF0gVGhlcmUgaXMgbm8gY29udGVudCBhc3Npc3QgZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzEwMTYiPjE3MTAxNjwvYT4KK1tqYXZhZG9jXVthc3Npc3RdIE5vIGNvbXBsZXRpb24gZm9yIHRhZyB3aGVuIHVwcGVyY2FzZSBpcyB1c2VkCisKKworPGEgbmFtZT0idl83MzEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM001IC0gMTZ0aCBKYW51YXJ5IDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzMxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzczMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSBjb21waWxlciBjYW4gbm93IGRldGVjdCB1bnVzZWQgbG9jYWwgdHlwZXMgKGFzIG9wcG9zZWQgdG8gb25seSBwcml2YXRlIHR5cGVzIHVwIHVudGlsIG5vdykuIDwvbGk+Cis8bGk+VGhlIGNvbXBpbGVyIGlzIG5vdyBiZXR0ZXIgYWJsZSB0byBkZXRlY3QgdW51c2VkIHByaXZhdGUgY29uc3RydWN0b3JzLCBpdCBub3cgdG9sZXJhdGVzIG1vcmUgdGhhbiB0aGUKK3ByaXZhdGUgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXIgYXMgdGhlIGtub3duIHBhdHRlcm4gZm9yIGJsb2NraW5nIGluc3RhbnRpYXRpb24uIEJhc2ljYWxseSwgdW5sZXNzIGEKK25vbiBwcml2YXRlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQgYXMgd2VsbCwgaXQgd2lsbCBpZ25vcmUgdW51c2VkIHByaXZhdGUgY29uc3RydWN0b3JzIGZyb20gbm93IG9uIChhbHNvIHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNDQzIj4xNjM0NDM8L2E+KS48L2xpPgorPGxpPkNvZGUgQXNzaXN0IGNhbiBwcm9wb3NlIGltcG9ydCBzdGF0ZW1lbnRzOgorPHByZT4KK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWwgeworCS4uLgorCS8qKgorCSAqIENvbXBsZXRpb24gaXMgYW4gaW1wb3J0IG9mIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBmaWVsZC4KKwkgKiAmbHQ7cCZndDsKKwkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6CisJICogJmx0O3VsJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQorCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3MgKGluY2x1ZGluZyBBQ0NfRU5VTSkgb2YgdGhlIGZpZWxkIHRoYXQgaXMgaW1wb3J0ZWQKKwkgKiAmbHQ7L2xpJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldE5hbWUoKX0gLQorCSAqIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkJ3MgdHlwZSAoYXMgb3Bwb3NlZCB0byB0aGUKKwkgKiBzaWduYXR1cmUgb2YgdGhlIHR5cGUgaW4gd2hpY2ggdGhlIHJlZmVyZW5jZWQgZmllbGQKKwkgKiBpcyBkZWNsYXJlZCkKKwkgKiAmbHQ7L2xpJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldEFkZGl0aW9uYWxGbGFncygpfSAtCisJICogdGhlIGNvbXBsZXRpb24gZmxhZ3MgKGluY2x1ZGluZyBDb21sZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpCisJICogb2YgdGhlIHByb3Bvc2VkIGltcG9ydAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0Oy91bCZndDsKKwkgKiAmbHQ7L3AmZ3Q7CisJICoKKwkgKiBAc2VlICNnZXRLaW5kKCkKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9JTVBPUlQ7CisKKwkvKioKKwkgKiBDb21wbGV0aW9uIGlzIGFuIGltcG9ydCBvZiByZWZlcmVuY2UgdG8gYSBzdGF0aWMgbWV0aG9kLgorCSAqICZsdDtwJmd0OworCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorCSAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKwkgKiAmbHQ7dWwmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKX0gLQorCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQorCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3Mgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGltcG9ydGVkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXROYW1lKCl9IC0KKwkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIGltcG9ydGVkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXRTaWduYXR1cmUoKX0gLQorCSAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0QWRkaXRpb25hbEZsYWdzKCl9IC0KKwkgKiB0aGUgY29tcGxldGlvbiBmbGFncyAoaW5jbHVkaW5nIENvbWxldGlvbkZsYWdzLlN0YXRpY0ltcG9ydCkKKwkgKiBvZiB0aGUgcHJvcG9zZWQgaW1wb3J0CisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7L3VsJmd0OworCSAqICZsdDsvcCZndDsKKwkgKgorCSAqIEBzZWUgI2dldEtpbmQoKQorCSAqCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9JTVBPUlQ7CisKKwkvKioKKwkgKiBDb21wbGV0aW9uIGlzIGFuIGltcG9ydCBvZiByZWZlcmVuY2UgdG8gYSB0eXBlLgorCSAqIE9ubHkgcmVmZXJlbmNlIHRvIHJlZmVyZW5jZSB0eXBlcyBhcmUgYWxsb3dlZC4KKwkgKiAmbHQ7cCZndDsKKwkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6CisJICogJmx0O3VsJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgZG90LWJhc2VkIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IGNvbnRhaW5zCisJICogdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBpcyBpbXBvcnRlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQorCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3MgKGluY2x1ZGluZyBGbGFncy5BY2NJbnRlcmZhY2UsIEFjY0VudW0sCisJICogYW5kIEFjY0Fubm90YXRpb24pIG9mIHRoZSB0eXBlIHRoYXQgaXMgaW1wb3J0ZWQKKwkgKiAmbHQ7L2xpJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldEFkZGl0aW9uYWxGbGFncygpfSAtCisJICogdGhlIGNvbXBsZXRpb24gZmxhZ3MgKGluY2x1ZGluZyBDb21sZXRpb25GbGFncy5TdGF0aWNJbXBvcnQpCisJICogb2YgdGhlIHByb3Bvc2VkIGltcG9ydAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0Oy91bCZndDsKKwkgKiAmbHQ7L3AmZ3Q7CisJICoKKwkgKiBAc2VlICNnZXRLaW5kKCkKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lNUE9SVDsKKwkuLi4KK30KKzwvcHJlPjwvbGk+Cis8bGk+Q29kZSBBc3Npc3QgcHJvcG9zZSBjb21wbGV0aW9ucyBjb21wdXRlZCBmcm9tIGEgbGlzdCBhIGZhdm9yaXRlIHJlZmVyZW5jZXMuCis8cHJlPgorcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3IgeworCS4uLgorCS8qKgorCSAqIFJldHVybnMgdGhlIGZhdm9yaXRlIHJlZmVyZW5jZXMgd2hpY2ggYXJlIHVzZWQgdG8gY29tcHV0ZSBzb21lIGNvbXBsZXRpb24gcHJvcG9zYWxzLgorCSAqICZsdDtwJmd0OworCSAqIEEgZmF2b3JpdGUgcmVmZXJlbmNlIGlzIGEgcXVhbGlmaWVkIHJlZmVyZW5jZSBhcyBpdCBjYW4gYmUgc2VlbiBpbiBhbiBpbXBvcnQgc3RhdGVtZW50LiZsdDticiZndDsKKwkgKiBlLmcuICZsdDtjb2RlJmd0O3siamF2YS51dGlsLkFycmF5cyJ9Jmx0Oy9jb2RlJmd0OyZsdDticiZndDsKKwkgKiBJdCBjYW4gYmUgYW4gb24gZGVtYW5kIHJlZmVyZW5jZS4mbHQ7YnImZ3Q7CisJICogZS5nLiAmbHQ7Y29kZSZndDt7ImphdmEudXRpbC5BcnJheXMuKiJ9Jmx0Oy9jb2RlJmd0OworCSAqIEl0IGNhbiBiZSBhIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBtZXRob2Qgb3IgZmllbGQgKGFzIGluIGEgc3RhdGljIGltcG9ydCkmbHQ7YnImZ3Q7CisJICogZS5nLiAmbHQ7Y29kZSZndDt7ImphdmEudXRpbC5BcnJheXMuZXF1YWxzIn0mbHQ7L2NvZGUmZ3Q7CisJICogJmx0Oy9wJmd0OworCSAqICZsdDtwJmd0OworCSAqIEN1cnJlbnRseSBvbmx5IG9uIGRlbWFuZCB0eXBlIHJlZmVyZW5jZXMgKCZsdDtjb2RlJmd0OyJqYXZhLnV0aWwuQXJyYXlzLioiJmx0Oy9jb2RlJmd0OyksCisJICogcmVmZXJlbmNlcyB0byBhIHN0YXRpYyBtZXRob2Qgb3IgYSBzdGF0aWMgZmllbGQgYXJlIHVzZWQgdG8gY29tcHV0ZSBjb21wbGV0aW9uIHByb3Bvc2Fscy4KKwkgKiBPdGhlciBraW5kIG9mIHJlZmVyZW5jZSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmdXR1cmUuCisJICogJmx0Oy9wJmd0OworCSAqIEByZXR1cm4gZmF2b3JpdGUgaW1wb3J0cworCSAqCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRGYXZvcml0ZVJlZmVyZW5jZXMoKSB7Li4ufQorCisJLyoqCisJICogU2V0IHRoZSBmYXZvcml0ZSByZWZlcmVuY2VzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjb21wdXRlIHNvbWUgY29tcGxldGlvbiBwcm9wb3NhbHMuCisJICogQSBmYXZvcml0ZSByZWZlcmVuY2UgaXMgYSBxdWFsaWZpZWQgcmVmZXJlbmNlIGFzIGl0IGNhbiBiZSBzZWVuIGluIGFuIGltcG9ydCBzdGF0ZW1lbnQuJmx0O2JyJmd0OworCSAqCisJICogQHBhcmFtIGZhdm9yaXRlSW1wb3J0cworCSAqCisJICogQHNlZSAjZ2V0RmF2b3JpdGVSZWZlcmVuY2VzKCkKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGYXZvcml0ZVJlZmVyZW5jZXMoU3RyaW5nW10gZmF2b3JpdGVJbXBvcnRzKSB7Li4ufQorCS4uLgorfQorPC9wcmU+CitXaXRoIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpZiB0aGUgZmF2b3JpdGUgcmVmZXJlbmNlIGlzIDxiPiJqYXZhLnV0aWwuQXJyYXlzLioiPC9iPiB0aGVuIGEgcHJvcG9zYWwKK3dpbGwgYmUgdGhlIG1ldGhvZCA8Yj4ic29ydCgpIjwvYj4gd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsIG9mIGEgc3RhdGljIGltcG9ydCA8Yj4iaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLnNvcnQ7IjwvYj4uCitJZiB0aGUgY29tcGxldGlvbiBsZXZlbCBpcyBsZXNzZXIgdGhhbiAxLjUgdGhlIHByb3Bvc2FsIHdpbGwgYmUgPGI+IkFycmF5cy5zb3J0KCkiPC9iPiB3aXRoIGEgcmVxdWlyZWQgcHJvcG9zYWwgb2YgYW4gaW1wb3J0Cis8Yj4iaW1wb3J0IGphdmEudXRpbC5BcnJheXM7IjwvYj4uCis8cD4KK1RoZSBvcHRpb24gPGNvZGU+SmF2YUNvcmUuQ09ERUFTU0lTVF9TVUdHRVNUX1NUQVRJQ19JTVBPUlRTPC9jb2RlPiBjYW4gYmUgZGlzYWJsZWQgdG8gYXZvaWQgdG8gcHJvcG9zZSBzdGF0aWMgaW1wb3J0CitldmVuIGlmIGNvbXBsaWFuY2UgaXMgMS41IG9yIGdyZWF0ZXIuCis8L3A+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjgzMzEiPjE2ODMzMTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBBYnN0cmFjdE1ldGhvZEVycm9yIG9uIGludGVyZmFjZSBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzAxODEiPjE3MDE4MTwvYT4KK1tjb21waWxlcl0gQ291bGQgZGlhZ25vc2UgdW51c2VkIGxvY2FsIHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MDQ0Ij4xNDQwNDQ8L2E+Citbc2VhcmNoXSBOUEUgd2hlbiB0cnlpbmcgdG8gZmluZCByZWZlcmVuY2VzIHRvIGZpZWxkIHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyMTIzIj4xNTIxMjM8L2E+CitbMS41XVthc3Npc3RdIENvZGUgYXNzaXN0IGZvciByZWZlcmVuY2VzIHRoYXQgcmVxdWlyZSBzdGF0aWMgaW1wb3J0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDI0NyI+MTcwMjQ3PC9hPgorW21vZGVsXSBEb2N1bWVudCByZWFzb25zIHRvIHVzZSBvciBub3QgdXNlIENvbXBpbGF0aW9uUGFydGljaXBhbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAzNDAiPjE0MDM0MDwvYT4KK1s1LjBdW3RlbXBsYXRlc10gZm9yZWFjaCB0ZW1wbGF0ZSBkb2VzIG5vdCB3b3JrIHdoZW4gYW4gSXRlcmFibGUgb3ZlciBhIHN0YXRpYyBpbm5lciBjbGFzcyBleGlzdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM0NDMiPjE2MzQ0MzwvYT4KK1tjbGVhbiB1cF0gcHJpdmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlciBmbGFnZ2VkIGFzIHVubmVjZXNzYXJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyOTYxIj4xNTI5NjE8L2E+CitbY29tcGlsZXJdIFByaXZhdGUgaW5uZXIgaW50ZXJmYWNlIGlzICJuZXZlciB1c2VkIGxvY2FsbHkiCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MDM1Ij4xNTcwMzU8L2E+CismcXVvdDtPcGVuIFR5cGUgSGllcmFyY2h5JnF1b3Q7IGZhaWxzIGlmIHN1YnR5cGUgaXMgYW5vbnltb3VzIG9yIGxvY2FsIGNsYXNzIGFuZCBsb2NhdGlvbiBmb3IgdGhpcyBzdWJ0eXBlIGNvbnRhaW5zICZxdW90Oy5jbGFzcyZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzQ4OCI+MTY3NDg4PC9hPgorW2NvbXBpbGVyXSBGdXAgb2YgYnVnIDE2NTI5MSwgdGhlIHR3byB3YXJuaW5ncyAoYXNzaWdubWVudCBoYXMgbm8gZWZmZWN0KSBzaG91bGQgbm90IGJlIHJlcG9ydGVkCisKKworPGEgbmFtZT0idl83MzAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM001IC0gOXRoIEphbnVhcnkgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MzAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzMwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+VGhlIGdyYW1tYXIgZmlsZSBqYXZhXzFfNS5nIGlzIHJlbmFtZWQgamF2YS5nLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNDc4Ij4xNjI0Nzg8L2E+CitOUEUgaW4gTWV0aG9kQmluZGluZyNzaWduYXR1cmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjk3NDQiPjE2OTc0NDwvYT4KK1tBU1RdIGNoYXJhY3RlciBwb3NpdGlvbiByYW5nZSB3cm9uZyBmb3Igc3VwZXIgbWV0aG9kIGNhbGwgd2l0aCB0eXBlIGFyZ3VtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk5MSI+MTYyOTkxPC9hPgorWzEuNV1bY29tcGlsZXJdIE5hbWUgY2xhc2ggcmVwb3J0ZWQgZm9yIChjb3JyZWN0KSBlY2xpcHNlLWdlbmVyYXRlZCBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MzM2Ij4xNTczMzY8L2E+CitidWlsZCBvdXRwdXQgY29udGFpbnMgdW5uZWNlc3NhcnkgZW1wdHkgZGlyZWN0b3JpZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcwMTkiPjE1NzAxOTwvYT4KK1tidWlsZF0gaW5jcmVtZW50YWwgYnVpbGQgaW52b2x2aW5nIGEgcmVzb3VyY2UgZmlsdGVyIGZhaWxzIHRvIHByb2R1Y2UgZXhwZWN0ZWQgc3ViZGlyZWN0b3J5IG9mIHRoZSBvdXRwdXQgZm9sZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk3MzgiPjk5NzM4PC9hPgorW2Zvcm1hdHRpbmddIGVhY2ggZm9ybWF0IHNoaWZ0cyBjb2RlIGluc2lkZSAmbHQ7cHJlJmd0OyBvbmUgc3BhY2UgdG8gdGhlIHJpZ2h0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NTk2Ij4xNjk1OTY8L2E+CithbmV3YXJyYXkgbm90IHByb3BlcnRseSBzdXBwb3J0ZWQgaW4gMS42Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NTQ1Ij4xNjk1NDU8L2E+CitqYXZhXzFfNC5nIHNob3VsZCBiZSByZW1vdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjY1Ij4xNjg2NjU8L2E+CitbMS42XVtjb21waWxlcl0gQUlPT0JFIGR1cmluZyBzdGFjayBtYXAgZnJhbWUgZ2VuZXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDU1MCI+MTYwNTUwPC9hPgorSW5maW5pdGUgYnVpbGQgd2hlbiBwcm9qZWN0cyBoYXZlIGN5Y2xlIGFuZCBidWlsZCBwYXRoIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDM0OSI+MTE0MzQ5PC9hPgorW2NvbXBpbGVyXSBQcm9ibGVtcyBidWlsZGluZyBjeWNsaWNhbCBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTU0MSI+MTYxNTQxPC9hPgorW2NvbXBpbGVyXVsxLjVdIGVjbGlwc2UgZmFpbHMgdG8gY29tcGlsZSB3aGVuIHR3byBtZXRob2RzIGFyZSBqb2luZWQgdG8gb25lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2OTc3Ij4xNjY5Nzc8L2E+CitbdmlzdGFdIFVuZXhwZWN0ZWQgZXJyb3JzIHdoaWxlIHJ1bm5pbmcgSkRUL0NvcmUgdGVzdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg2NzEiPjE2ODY3MTwvYT4KK1ttb2RlbF0gTW9kZWwgdGVzdHMgc2hvdWxkIG5vdCBydW4gcmVhZC1vbmx5IHRlc3RzIHdoZW4gZmlsZSBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBpdAorCis8YSBuYW1lPSJ2XzcyOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTUgLSAxOXRoIERlY2VtYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzI5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODYxMCI+MTY4NjEwPC9hPgorQ2hrcGlpIGVycm9yIGluIGJ1aWxkIEkyMDA2MTIxOC0wODAwCisKKzxhIG5hbWU9InZfNzI4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNSAtIDE5dGggRGVjZW1iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzI4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NzQzIj4xNjc3NDM8L2E+Citbc2VhcmNoXSBPcGVuIFR5cGUgRGlhbG9nIGNhbm5vdCBmaW5kIHR5cGVzIGZyb20gcHJvamVjdHMgbWlncmF0ZWQgZnJvbSAzLjIuMSB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjgwODgiPjE2ODA4ODwvYT4KK1NvdXJjZVR5cGVDb252ZXJ0ZXIgTlBFIGluIGxvZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDc3MyI+MTYwNzczPC9hPgorW2pzcjI2OV0gTmVlZCBpbnRlcmZhY2VzIGJldHdlZW4gamR0IGNvbXBpbGVyIGFuZCBqc3IyNjkgaW1wbAorCisKKzxhIG5hbWU9InZfNzI3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNCAtIDl0aCBEZWNlbWJlciAyMDA2IC0gMy4zIE1JTEVTVE9ORSA0Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKyAgPGxpPklNYXJrZXItcyBnZW5lcmF0ZWQgYnkgSkRUIGFuZCBjb21waWxlciBwYXJ0aWNpcGFudHMgbWF5IG5vdyBoYXZlIHRoZWlyCisgICAgICBJTWFya2VyI0dFTkVSQVRFRF9CWSBhdHRyaWJ1dGUgc2V0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgICAgPHVsPgorICAgICAgICA8bGk+SU1hcmtlci1zIGdlbmVyYXRlZCBieSBKRFQgZ2V0IEphdmFCdWlsZGVyI0dFTkVSQVRFRF9CWSwgY3VycmVudGx5CisgICAgICAgICAgICB2YWx1ZWQgdG8gSkRULCBhcyB0aGVpciBHRU5FUkFURURfQlkgYXR0cmlidXRlOyA8ZW0+dGhhdCB2YWx1ZSBpcworICAgICAgICAgICAgbm9uIEFQSSBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXM8L2VtPjs8L2xpPgorICAgICAgICA8bGk+SU1hcmtlci1zIG9yaWdpbmF0aW5nIGZyb20gY29tcGlsZXIgcGFydGljaXBhbnRzJyBjYXRlZ29yaXplZAorICAgICAgICAgICAgcHJvYmxlbXMgd2hpY2ggZG8gbm90IGhhdmUgdGhlIElNYXJrZXIjR0VORVJBVEVEX0JZIGV4dHJhIGF0dHJpYnV0ZQorICAgICAgICAgICAgc2V0IGRvIG5vdCBoYXZlIHRoZWlyIEdFTkVSQVRFRF9CWSBhdHRyaWJ1dGUgc2V0OzwvbGk+CisgICAgICAgIDxsaT5JTWFya2VyLXMgb3JpZ2luYXRpbmcgZnJvbSBjb21waWxlciBwYXJ0aWNpcGFudHMnIGNhdGVnb3JpemVkCisgICAgICAgICAgICBwcm9ibGVtcyB3aGljaCBoYXZlIHRoZSBJTWFya2VyI0dFTkVSQVRFRF9CWSBzZXQgdG8gYSBnaXZlbiB2YWx1ZQorICAgICAgICAgICAgZ2V0IHRoZWlyIEdFTkVSQVRFRF9CWSBhdHRyaWJ1dGUgc2V0IHRvIHRoZSBzYWlkIHZhbHVlLjwvbGk+CisgICAgICA8L3VsPgorICAgICAgU2VlIGFsc28gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODYxMSI+MTU4NjExPC9hPi4KKyAgPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MjE3Ij4xNjcyMTc8L2E+CitbMS41XVtjb21waWxlcl0gQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBhbm5vdGF0aW9uIGNvZGUgZ2VuZXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTkwMCI+MTY1OTAwPC9hPgorW3NlbGVjdF0gSW5jb2hlcmVudCBiZWhhdmlvciB3aGVuIHRoZXJlIGlzIGFtYmlndW91cyBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2NTcwIj4xNjY1NzA8L2E+CitbYXNzaXN0XSBQcm9wb3NhbCBjb21wdXRlciBmcm9tIHRoZSAnb3JnLmVjbGlwc2UubXlsYXIuamF2YScgcGx1Zy1pbiBkaWQgbm90IGNvbXBsZXRlIG5vcm1hbGx5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NjExIj4xNTg2MTE8L2E+CitTZXQgJ2dlbmVyYXRlZEJ5JyBhdHRyaWJ1dGUgb2YgSU1hcmtlciBhbnl3aGVyZSBtYXJrZXJzIGFyZSBnZW5lcmF0ZWQgaW4gSkRUL0NvcmUgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjM0OCI+MTY2MzQ4PC9hPgorW3NlYXJjaF0gU3RhY2sgdHJhY2UgY29uc29sZSByZXNvbHZlcyB3cm9uZyBzb3VyY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ3OTIiPjE2NDc5MjwvYT4KK0NvZGVBc3Npc3Qgc2hvdWxkIHRyZWF0ICNjbG9uZSgpIHNwZWNpYWwgaW4gMS41IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQxMTEiPjE1NDExMTwvYT4KK0NvbXBpbGVyIEFQSSAoSlNSIDE5OSkKKworPGEgbmFtZT0idl83MjYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM000IC0gNXRoIERlY2VtYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzI2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjY0MSI+MTY2NjQxPC9hPgorW2NvbXBpbGVyXSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG5vdCByZXBvcnRlZCBpbiBpZiAoZmFsc2UpIGJsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMTkxIj4xNDAxOTE8L2E+CitOUEUgaW4gQ2xhc3NGaWxlUmVhZGVyLmdldFNvdXJjZU5hbWUgbG9ncyBmdWxsIENVIHNvdXJjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjQzNiI+MTY2NDM2PC9hPgorW2phdmFkb2NdIFBvdGVudGlhbGx5IHdyb25nIGphdmFkb2Mgd2FybmluZyBmb3IgdW5leHBlY3RlZCBkdXBsaWNhdGUgdGFnIEB2YWx1ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjM2NSI+MTY2MzY1PC9hPgorW2phdmFkb2NdIHNldmVyaXR5IGxldmVsIG9mIG1hbGZvcm1lZCBqYXZhZG9jIGNvbW1lbnRzIGRpZCBub3Qgd29yayBwcm9wZXJseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjA3NyI+MTY2MDc3PC9hPgorW2NvbXBpbGVyXSBleHRyYW5lb3VzIHRlc3RzIGluIFNjb3BlI2ZpbmRFeGFjdE1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTk3NiI+MTY1OTc2PC9hPgorRUNKIEFudCBhZGFwdGVyIGRvZXNuJ3QgYWxsb3cgc2V0dGluZyBlbXB0eSBib290Y2xhc3NwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjA1Ij4xNDIyMDU8L2E+CitbYmF0Y2hdW29wdGlvbnNdIC1kZXByZWNhdGlvbiBvcHRpb24gaXMgbm90IG9uIGJ5IGRlZmF1bHQsIHdoZXJlYXMgdGhlIGhlbHAgbWVzc2FnZSBzYXlzIHNvCisKKzxhIG5hbWU9InZfNzI1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNCAtIDI4dGggTm92ZW1iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzI1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjVkVSU0lPTl8xXzc8L2NvZGU+LiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGNvbXBsaWFuY2UsIHRoZSBzb3VyY2Ugb3IgdGhlCit0YXJnZXQgcGxhdGZvcm0gdmFsdWVzLiBUaGlzIGhhcyBubyBpbXBhY3QgcmlnaHQgbm93IGJlc2lkZSBzZXR0aW5nIHRoZSBtYWpvciB2ZXJzaW9uIGluc2lkZSAuY2xhc3MgZmlsZSB0bworPGNvZGU+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50cyNNQUpPUl9WRVJTSU9OXzFfNzwvY29kZT4uPC9saT4KKzxsaT5BZGRlZCBuZXcgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI3NldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKTwvY29kZT4gdG8gc2V0IHRoZSBjb21waWxlcidzCitvcHRpb25zIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gY29tcGlsZXIncyBjb21wbGlhbmNlLjwvbGk+Cis8bGk+VHVuZWQgY29tcGlsZXIgc2VtYW50aWNzIGZvciB1bmNoZWNrZWQgY2FzdCBkZXRlY3Rpb24uIEFzIGEgY29uc2VxdWVuY2UsIG1vcmUgd2FybmluZ3Mgc2hvdWxkIGJlIGlzc3VlZAorKGFsc28gc2VlIGJ1Z3MgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NDUxIj4xMDY0NTE8L2E+IGFuZAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1MTQzIj4xNjUxNDM8L2E+KS4gPC9saT4KKzxsaT5SYXcgdHlwZSB3YXJuaW5ncyBhcmUgbm93IGFsc28gZGlhZ25vc2VkIGZvciBjYXN0IHR5cGVzLiA8L2xpPgorPGxpPkltcHJvdmVkIGNvbXBpbGVyIGRpYWdub3NpcyBmb3IgdHlwZSBoaWRpbmcgdG8gbm93IHJlcG9ydDogbWVtYmVyIHR5cGUgaGlkaW5nIHR5cGUgcGFyYW1ldGVycywKK25lc3RlZCB0eXBlcyBoaWRpbmcgb3RoZXIgYWNjZXNzaWJsZSB0eXBlcyBpbiBzY29wZSAoZGlyZWN0IGVuY2xvc2luZyBhcmUgYWxyZWFkeSByZXBvcnRlZCBhcyBlcnJvcnMpLiA8L2xpPgorPGxpPkNvbXBpbGVyIGlzIG5vdyBtb3JlIHJlc2lsaWVudCB3aXRoIGR1cGxpY2F0ZSBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uczsgdGh1cyBhbGxvd2luZyBmdXJ0aGVyCitvcGVyYXRpb24gdG8gc3RpbGwgYmUgY2FycmllZCBvdXQgYWNjdXJhdGVseSAoY29kZXNlbGVjdCwgY29tcGxldGlvbiwgc2VhcmNoLCBET00gQVNUIG9wcykKKyhjZi4gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTY2MiI+MTY1NjYyPC9hPikuPC9saT4KKzxsaT5OZXcgSmF2YSBNb2RlbCBlbGVtZW50IGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCBhcyBjb21tb24gc3VwZXJ0eXBlIGZvciA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiBhbmQgPGNvZGU+SUNsYXNzRmlsZTwvY29kZT4KKyhzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUwNCI+MTI1NTA0PC9hPikuCis8cHJlPgorLyoqCisgKiBSZXByZXNlbnRzIGFuIGVudGlyZSBKYXZhIHR5cGUgcm9vdCAoZWl0aGVyIGFuIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+CisgKiBvciBhbiA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPikuCisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0CisgKiBAc2VlIElDbGFzc0ZpbGUKKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIGludGVyZmFjZSBJVHlwZVJvb3QgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElQYXJlbnQsIElPcGVuYWJsZSwgSVNvdXJjZVJlZmVyZW5jZSwgSUNvZGVBc3Npc3QgeworLi4uCit9Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTkxNyI+MTY1OTE3PC9hPgorRXJyb3IgcmFuZ2UgZm9yIElQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGUgc2hvdWxkIGJlIHByZWRpY3RhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjIwIj4xNjU2MjA8L2E+CitSZWdyZXNzaW9uIGluIDMuM00zIHdpdGggZ2VuZXJpY3MgLSBhbWJpZ3VvdXMgbWV0aG9kLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzM3MCI+MTYzMzcwPC9hPgorWzEuNV1bY29tcGlsZXJdIEluY29ycmVjdCBhbWJpZ3VvdXMgbWV0aG9kIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1Nzk0Ij4xNjU3OTQ8L2E+CitbamF2YWRvY10gU2hvdWxkIG5vdCByZXBvcnQgYW1iaWd1b3VzIG9uIG1ldGhvZCB3aXRoIHBhcmFtZXRlcml6ZWQgdHlwZXMgYXMgcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTcwMSI+MTY1NzAxPC9hPgorW21vZGVsXSBOUEUgd2hpbGUgY29tcHV0aW5nIG1ldGhvZCB1bmlxdWUga2V5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjE5Ij4xNDIyMTk8L2E+CitbYmF0Y2hdW29wdGlvbnNdIGluY29uc2lzdGVudCBoZWxwIG1lc3NhZ2U6IC1YJmx0O29wdGlvbiZndDsgdnMgLVhlbWFjcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDUyMCI+MTYwNTIwPC9hPgorW2NvbXBpbGVyXSBTaG91bGQgYmV0dGVyIGxvY2F0ZSBvdmVycmlkaW5nIHJldHVybiB0eXBlIGNvbmZsaWN0IG9udG8gcmV0dXJuIHR5cGUgcmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NTA0Ij4xMjU1MDQ8L2E+CitbQVBJXSBjb21tb24gc3VwZXJ0eXBlIGZvciBJQ29tcGlsYXRpb25Vbml0IGFuZCBJQ2xhc3NGaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NTI1Ij4xNjU1MjU8L2E+CitbY29tbWVudHNdIEFTVFBhcnNlciBleGNsdWRlcyB0cmFpbGluZyBsaW5lIGNvbW1lbnRzIGZyb20gZXh0ZW5kZWQgcmFuZ2Ugb2YgZmllbGRzIGluIGVudW1zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjU0Ij4xNjU2NTQ8L2E+CitbYXN0IHJld3JpdGVdIGFkZCBmaW5hbCB0byBwYXJhbWV0ZXIgZG9lcyBub3Qgd29yayB3aXRoIGFubm90YXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxOTgwIj4xNjE5ODA8L2E+CitNYWtlIHNvbWUgbWVtYmVyIGNsYXNzIHN0YXRpYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk3NSI+MTYxOTc1PC9hPgorU2hvdWxkIGZhY3Rvcml6ZWQgYWxsIGVtcHR5IHN0cmluZ3MgY29uc3RhbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNjgwIj4xNjM2ODA8L2E+CitbMS41XSBbY29tcGlsZXJdIEpEVCBJbnRlcm5hbCBFeGNlcHRpb24gdW5kZXIgaW1wb3J0IGNpcmN1bGFyaXR5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NjQ1Ij4xNjU2NDU8L2E+CitbMS41XVtjb21waWxlcl0gTWVtYmVyIHR5cGUgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVuY2xvc2luZyB0eXBlIHBhcmFtZXRlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjU2NjIiPjE2NTY2MjwvYT4KK1tjb21waWxlcl0gQmUgbW9yZSByZXNpbGllbnQgd2l0aCBkdXBsaWNhdGUgbG9jYWwgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE2MTciPjE2MTYxNzwvYT4KK1thc3QgcmV3cml0ZV0gcmVwbGFjaW5nIEluc3RhbmNlb2ZFeHByZXNzaW9uLkxFRlRfT1BFUkFORF9QUk9QRVJUWSBzaG91bGQgZW5zdXJlIHdoaXRlc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUyOTEiPjE2NTI5MTwvYT4KK1sxLjVdIE1pc3NpbmcgZGlhZ25vc2lzIGZvciBpbGxlZ2FsIGZvcndhcmQgZmllbGQgcmVmIGluIGdlbmVyaWNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NDUzIj4xNjU0NTM8L2E+CitbMS41XVtjb21waWxlcl0gSW1wcm92ZSB1bmNoZWNrZWQgY2FzdCBtZXNzYWdlIGluIGNvbXBpbGVyJ3Mgd2FybmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTE0NSI+MTY1MTQ1PC9hPgorWzEuNV1bY29tcGlsZXJdIE1pc3NpbmcgcmF3IHR5cGUgd2FybmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjQ1MSI+MTA2NDUxPC9hPgorWzEuNV1bY29tcGlsZXJdIEVycm9yIGFuZCB1bmNoZWNrZWQgd2FybmluZ3MgbWlzc2luZyBmb3IgY2FzdCB0byBwYXJhbWV0ZXJpemVkIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUxNDMiPjE2NTE0MzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIHVuY2hlY2tlZCBjYXN0IHdhcm5pbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUzNDYiPjE2NTM0NjwvYT4KK1tjb21waWxlcl1bbnVsbF0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvckV4cHJlc3Npb24ubnVsbFN0YXR1cyhGbG93SW5mbykgdG9vIGNvbnNlcnZhdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTExOCI+MTQ5MTE4PC9hPgorW2JhdGNoXSBzaG9ydGVuIHRoZSBlcnJvciBtZXNzYWdlIGluIGNhc2UgYSAuamF2YSBkaXJlY3RvcnkgaXMgdXNlZCBhcyBhIHBhcmFtZXRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjMzOSI+MTU2MzM5PC9hPgorQWJvcnQgY29tcGlsYXRpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGUgVUkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ2NTciPjE2NDY1NzwvYT4KK1tjb21waWxlcl0gV3JvbmcgbGluZSBpcyBzaG93ZWQgZHVyaW5nIGRlYnVnCisKKzxhIG5hbWU9InZfNzI0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNCAtIDIxc3QgTm92ZW1iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzI0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzI0ZPUk1BVFRFUl9CTEFOS19MSU5FU19CRVRXRUVOX0lNUE9SVF9HUk9VUFM8L2NvZGU+LiBTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDk0NiI+MTY1MjEwPC9hPiBmb3IgZGV0YWlscy48L2xpPgorPGxpPkFkZGVkIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fSU5fVEhST1c8L2NvZGU+LiBTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDk0NiI+MTY0OTQ2PC9hPiBmb3IgZGV0YWlscy48L2xpPgorPGxpPmphdmFkb2MgY2hlY2tlciBub3cgY29ycmVjdGx5IGFsbG93IHVzYWdlIG9mIHtAdmFsdWV9IHRhZ3Mgb25seSBvbiBmaWVsZCBkZWNsYXJhdGlvbiB3aGVuIHNvdXJjZSBsZXZlbCBpcyBsZXNzIHRoYW4gMS41Cisoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMzOTkiPjE1MzM5OTwvYT4pLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0NzA3Ij4xNjQ3MDc8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gSmF2YU1vZGVsTWFuYWdlciBpZiBzb3VyY2UgbGV2ZWwgPT0gNi4wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1MjEwIj4xNjUyMTA8L2E+CitGdXAgb2YgYnVnIDc0OTk3LCBhZGQgbmV3IGZvcm1hdHRlciBvcHRpb24gZm9yIG51bWJlciBvZiBibGFuayBsaW5lcyBiZXR3ZWVuIGltcG9ydCBncm91cHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUwNjkiPjE2NTA2OTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBpbmNvcnJlY3QgZmllbGQgaGlkaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1MDgxIj4xNjUwODE8L2E+CitbMS41XVtjb21waWxlcl0gRnVwIG9mIGJ1ZyAxNjUwNjksIHVudXNlZCBpbXBvcnRzIGFyZSBub3QgcmVwb3J0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ5OTMiPjE1NDk5MzwvYT4KK29yZy5lY2xpcHNlLmpkdC51aS5KYXZhTm9UeXBlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgdGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gd2hlbiB1c2luZyBjb250ZW50IGFzc2lzdCBvbiAndGhpcy4nIGluIGFubm9udGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTYyMSI+MTM5NjIxPC9hPgorW2phdmFkb2NdW2Fzc2lzdF0gTm8gSmF2YWRvYyBjb21wbGV0aW9ucyBpZiB0aGVyZSdzIG5vIG1lbWJlciBiZWxvdworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDk0NiI+MTY0OTQ2PC9hPgorU3BhY2VzIGluIGNvbnRyb2wgc3RhdGVtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzgwNyI+MTYzODA3PC9hPgorSkRUIGZhaWxzIHRvIGNvbXBpbGUgbGVnYWwgSmF2YSBzb3VyY2UgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMzOTkiPjE1MzM5OTwvYT4KK1tqYXZhZG9jXSBKRFQgQ29yZSBzaG91bGQgd2FybiBpZiB0aGUgQHZhbHVlIHRhZyBpcyBub3QgdXNlZCBjb3JyZWN0bHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDA0OSI+ODQwNDk8L2E+CitbamF2YWRvY11bZG9tXSBFeHRlbmRlZCByYW5nZXMgd3JvbmcgZm9yIG1ldGhvZCBuYW1lIHdpdGhvdXQgcmV0dXJuIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ3OTEiPjE2NDc5MTwvYT4KK1tzZWFyY2hdIFR5cGUgcmVmZXJlbmNlIHJlcG9ydHMgYW5vbnltb3VzIHR5cGUgaW4gaW52YWxpZCBjbGFzcyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0NDUwIj4xNjQ0NTA8L2E+CitbY29tbWVudHNdIERlZmF1bHRDb21tZW50TWFwcGVyIHNob3VsZCByZWxlYXNlIHNjYW5uZXIgYWZ0ZXIgdXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzOTg0Ij4xNjM5ODQ8L2E+Citbc2VhcmNoXSBubyByZXN1bHRzIGZyb20gU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyB3aXRoIHR5cGVzIGluIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5OTciPjc0OTk3PC9hPgoraW1wb3J0IHJld3JpdGU6IG5vIGVtcHR5IGxpbmUgYmV0d2VlbiBncm91cHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQzMTEiPjE2NDMxMTwvYT4KK0NvZGUgY29tcGxldGlvbiB1bmF2YWlsYWJsZSBmb3Igc3RhdGljIG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYzNTIiPjE1NjM1MjwvYT4KK05QRSB3aGVuIGFjY2Vzc2luZyBhbm5vdGF0aW9ucyBmcm9tIElUeXBlQmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5OTI4Ij45OTkyODwvYT4KK0NvbnRlbnRBc3Npc3Qgc2hvdWxkIHByb3Bvc2UgbWV0aG9kcyBvZiBpbnRlcnNlY3Rpb24gdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc1NzAiPjE1NzU3MDwvYT4KK0J1ZyBpbiBBU1RQYXJzZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ2NTYiPjE2NDY1NjwvYT4KK0lTY2FubmVyLnNldFNvdXJjZSBzaG91bGQgc3BlYyB0aGF0ICdudWxsJyBpcyBhbGxvd2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNjM3Ij4xNjA2Mzc8L2E+CitnZXRLZXkoLi4uKSBmb3IgQmluYXJ5TWV0aG9kIHJldHVybnMgYSBrZXkgd2l0aCAnLicgaW4gdGhlIHJldHVybiB0eXBlIGluc3RlYWQgb2YgJy8nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDc3MSI+MTEwNzcxPC9hPgorYWxpZ24gYWxsIElDb21waWxhdGlvblVuaXQjZ2V0Q29udGVudHMgaW1wbGVtZW50YXRpb25zIG9uIGEgJ25ldmVyIG51bGwnIGJlaGF2aW9yCisKKzxhIG5hbWU9InZfNzIzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNNCAtIDE0dGggTm92ZW1iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzIzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+amF2YWRvYyBjaGVja2VyIGRpZCBpbmNvcnJlY3RseSBhbGxvdyBjb21wYXRpYmxlIG1hdGNoZXMgZm9yIG1ldGhvZCByZWZlcmVuY2VzOyB3aGVyZSBvbmx5IGV4YWN0IG1hdGNoZXMgYXJlIG1hbmRhdGVkCisoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM2NTkiPjE2MzY1OTwvYT4pLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDk4MCI+MTQwOTgwPC9hPgorW3JlY292ZXJ5XSBDbGFzc0Nhc3RFeGNlcHRpb24gZnJvbSBKRFQgY29tcGlsZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyOTE4Ij4xNjI5MTg8L2E+CitbY29tcGlsZXJdIElsbGVnYWwgdXNhZ2Ugb2YgYSBsb2NhbCBpbnNpZGUgYSBzd2l0Y2ggc3RhdGVtZW50IGlzIG5vdCByZWplY3RlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDEyMSI+MTY0MTIxPC9hPgorW3NlYXJjaF0gTWlzc2VzIGRlY2xhcmF0aW9ucyBvZiBtZXRob2QgcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDA4MSI+MTY0MDgxPC9hPgorWE1MIGxvZyBjb3VsZCBjb250YWluIHBhY2thZ2UgaW5mb3JtYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMDEiPjE2MDMwMTwvYT4KK1tzZWFyY2hdIHRvbyBtYW55IG1hdGNoZXMgZm91bmQgZm9yIG1ldGhvZCByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNjU5Ij4xNjM2NTk8L2E+CitbamF2YWRvY10gQ29tcGlsZXIgc2hvdWxkIHdhcm4gd2hlbiBtZXRob2QgcGFyYW1ldGVycyBhcmUgbm90IGlkZW50aWNhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDA5MiI+MTY0MDkyPC9hPgorW21vZGVsXSBQb3NzaWJsZSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CdWZmZXIuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MDkxIj4xNjQwOTE8L2E+CitbbW9kZWxdIFBvc3NpYmxlIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEphdmFQcm9qZWN0RWxlbWVudEluZm8uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5OTM5Ij4xNTk5Mzk8L2E+CitbMS41XVtjb21waWxlcl0gRWNsaXBzZSBhbGxvd3MgTGlzdCZsdDt2b2lkW10mZ3Q7LCBqYXZhYyBkb2Vzbid0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNjIxIj4xNjI2MjE8L2E+CitbbW9kZWxdW2RlbHRhXSBWYWxpZGF0aW9uIGVycm9ycyBkbyBub3QgY2xlYXIgYWZ0ZXIgcmVwbGFjaW5nIGphciBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzgyIj4xNjM3ODI8L2E+CitQb3NzaWJsZSByZXNvdXJjZSBsZWFrcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjAyNiI+MTYyMDI2PC9hPgorWzEuNV1bY29tcGlsZXJdIEVycm9uZW91cyBSZXBvcnQgb2YgYW4gQW1iaWd1b3VzIE1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzYwMCI+MTYzNjAwPC9hPgorW2NvbXBpbGVyXSBJbnRlcm5hbCByZWZlcmVuY2VzIHRvIHN0YXRpYyBpbm5lciBjbGFzc2VzIGZhaWwgaW4gcHJlc2VuY2Ugb2YgYXNzZXJ0IGtleXdvcmQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkwMDQiPjE0OTAwNDwvYT4KK3N0YXRpYyBmaWVsZHMgZnJvbSBwYWNrYWdlIGNsYXNzZXMgd3JvbmcgcXVpY2stZml4J2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNDc2Ij4xMDE0NzY8L2E+CismcXVvdDtTZXJpYWxpemFibGUgY2xhc3Mgd2l0aG91dCBzZXJpYWxWZXJzaW9uVUlEJnF1b3Q7IHNldHRpbmcgYW5kIHdyaXRlUmVwbGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzY0NyI+MTYzNjQ3PC9hPgorW21vZGVsXSBUaHJvd24gZXhjZXB0aW9ucyBhcmUgbm90IGZvdW5kIGluIG1ldGhvZCBiaW5kaW5nIGtleSB3aGljaCBoYXZlIGEgY2FwdHVyZSBhcyBkZWNsYXJpbmcgY2xhc3MKKworPGEgbmFtZT0idl83MjIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM000IC0gN3RoIE5vdmVtYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzIyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcyMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPjxjb2RlPkphdmFDb252ZW50aW9uczwvY29kZT4gY2FuIG5vdyB2YWxpZGF0ZSBuYW1lcyB1c2luZyBzcGVjaWZpYyBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLiBOZXcgPGNvZGU+dmFsaWRhdGUqTmFtZTwvY29kZT4gQVBJIG1ldGhvZHMKK3dpdGggdGhlIHNvdXJjZSBhbmQgdGhlIGNvbXBsaWFuY2UgbGV2ZWwgYXMgZ2l2ZW4gcGFyYW1ldGVycyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBjbGFzcy4gQ2xpZW50cyBzaG91bGQgbm93IHVzZSB0aGVzZSBuZXcgbWV0aG9kcyBpbnN0ZWFkCitvZiBkZXByZWNhdGVkIG9uZXMgd2hpY2ggb25seSB2ZXJpZnkgbmFtZXMgdXNpbmcgdGhlIDEuMyBkZWZhdWx0IGxldmVsLgorPC9saT4KKzxsaT5BZGRlZCBuZXcgQVBJIG1ldGhvZCBvbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5CaW5kaW5nS2V5PC9jb2RlPiBjbGFzcyB0byBnZXQgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IGEgbWV0aG9kCisoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwMDMiPjE1NTAwMzwvYT4pOgorPHByZT4KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aHJvd24gZXhjZXB0aW9uIHNpZ25hdHVyZXMgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nIGtleS4KKwkgKiBJZiB0aGlzIGJpbmRpbmcga2V5IGRvZXMgbm90ICByZXByZXNlbnQgYSBtZXRob2Qgb3IgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbiwKKwkgKiByZXR1cm5zIGFuIGVtcHR5IGFycmF5LgorCSAqCisJICogQHJldHVybiB0aGUgdGhyb3duIGV4Y2VwdGlvbnMgc2lnbmF0dXJlcworCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0VGhyb3duRXhjZXB0aW9ucygpCis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjkwMyI+MTYyOTAzPC9hPgorU3VwcHJlc3NXYXJuaW5ncyBhbmQgTk9OLU5MUydkIHN0cmluZ3MgYXMgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNDAwIj4xNjE0MDA8L2E+CitTY2FubmluZyBvZiBpZGVudGlmaWVycyBzaG91bGQgYmUgb3B0aW1pemVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzMzQ5Ij4xNjMzNDk8L2E+CitbYXNzaXN0XSBjb2RlIGFzc2lzdCBkb2Vzbid0IGNvcnJlY3RseSB1c2Ugc2Nhbm5lciBlb2ZQb3NpdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk2OCI+MTYyOTY4PC9hPgorQ29udGVudCBBc3Npc3QgZm9yIHVuZGVjbGFyZWQgbG9jYWwgdmFyaWFibGUgc2hvdWxkIHByaW9yaXRpemUgdW5ib3VuZCBuYW1lcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzU0OSI+MTYzNTQ5PC9hPgorRXhjbHVkZSBKRFQgYW50IHRhc2tzIGZyb20gc2lnbmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzA3MiI+MTYzMDcyPC9hPgorW3NlYXJjaF0gbWV0aG9kIHJlZmVyZW5jZSByZXBvcnRzIHdyb25nIHBvdGVudGlhbCBtYXRjaGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDAzIj4xNTUwMDM8L2E+CitbbW9kZWxdIE1pc3NpbmcgZXhjZXB0aW9uIHR5cGVzIC8gd3Jvbmcgc2lnbmF0dXJlPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTYyMSI+MTYxNjIxPC9hPgorZW51bSBpcyBhIEtleXdvcmQgZm9yIEphdmE1IGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIEVudW0gbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjc0MyI+MTYyNzQzPC9hPgorRHVwbGljYXRlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGNvZGUgYXNzaXN0IHByb3Bvc2FscworCis8YSBuYW1lPSJ2XzcyMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTMgLSAzMHRoIE9jdG9iZXIgMjAwNiAtIDMuMyBNSUxFU1RPTkUgMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MjEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzIxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmVtb3ZlZCBmaXggZm9yIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEyODkiPjE0MTI4OTwvYT48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIG5hbWU9InZfNzIwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNMyAtIDMwdGggT2N0b2JlciAyMDA2Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcyMAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MjAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgwNDEiPjE0ODA0MTwvYT4KK1tjb21waWxlcl1bMS41XSBzaG91bGQgaXNzdWUgdW5jaGVja2VkIHdhcm5pbmcgb24gY2FzdCB0byBTZXQmbHQ7WCZndDsgb2YgSXRlcmF0b3IjbmV4dCAoKSByZXR1cm5pbmcgWAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTYzMSI+MTU5NjMxPC9hPgorW2RvbV0gTlBFIHdoaWxlIHRyeWluZyB0byBjbGVhbnVwIHNwZWNpZmljIHBhaXIgb2YgZmlsZQorCis8YSBuYW1lPSJ2XzcxOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTMgLSAyOXRoIE9jdG9iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTkKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE5Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxODQ2Ij4xNjE4NDY8L2E+CitFeHBhbmRpbmcgYSBqYXZhIHByb2plY3Qgd2l0aCBpbnZhbGlkIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcyBpbiBQcm9qZWN0IEV4cGxvcmVyIGNhdXNlcyBDUFUgdG8gc3RheSBhdCAxMDAlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NzM4Ij4xNTk3Mzg8L2E+CitbMS41XVtjb21waWxlcl0gTWlzc2luZyBjbGFzcyBjYXN0cyBpbiBnZW5lcmF0ZWQgYnl0ZSBjb2RlIGZvciBnZW5lcmljIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjI5NiI+MTYyMjk2PC9hPgorW2NvbXBpbGVyXSBBbm9ueW1vdXMgYW5kIGxvY2FsIGNsYXNzZXMgYXJlIHRhZ2dlZCBhcyBmaW5hbCBhbmQvb3IgcHJpdmF0ZSBpbiB0aGUgaW5uZXIgY2xhc3MgaW5mb3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIzOTAiPjE2MjM5MDwvYT4KK0phdmFDb2RlRm9ybWF0dGVyIEFubm90YXRpb24gQnVnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNDAwIj4xNjI0MDA8L2E+CitbMS41XVtjb21waWxlcl0gUmV0dXJuIHR5cGUgaW5mZXJlbmNlIGRvZXMgbm90IHBlcmZvcm0gd2VsbCBpbiBhcnJheSBpbml0aWFsaXplcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTg5MyI+MTU5ODkzPC9hPgorW2NvbXBpbGVyXSBDb21waWxhdGlvbiBFcnJvciB3aXRoIG5lc3RlZCBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMDU2Ij4xNjIwNTY8L2E+CitbcmVjb3ZlcnldIENvbmZ1c2luZyBlcnJvcnMgaW4gZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0ODExIj4xNTQ4MTE8L2E+CitbY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yIHdoaWxlIHBhcnNpbmcvZm9ybWF0dGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDgyMyI+MTYwODIzPC9hPgorW2Zvcm1hdHRlcl0gSmF2YSBDb252ZW50aW9ucyBbYnVpbHQtaW5dIGluc2VydHMgYmxhbmsgbGluZSBiZXR3ZWVuIGZpZWxkIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTQxMiI+MTYxNDEyPC9hPgorb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTmFtZWRNZW1iZXIjZ2V0RnVsbHlRdWFsaWZpZWRQYXJhbWV0ZXJpemVkTmFtZSBwcm9iYWJseSBib2dndXMKKworPGEgbmFtZT0idl83MTgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00zIC0gMjR0aCBPY3RvYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzE4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBjb21waWxlciB3YXJuaW5nIHRvIGRldGVjdCBvdmVycmlkaW5nIG9mIGEgbWV0aG9kIHdpdGhvdXQgYSBzdXBlciBpbnZvY2F0aW9uIGhhcyBiZWVuIGFkZGVkLgorU2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY3MzYiPjE1NjczNjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlscy48L2xpPgorPGxpPkNvZGUgQXNzaXN0IHByb3Bvc2UgdW5yZXNvbHZlZCBuYW1lcyBhcyBwb3NzaWJsZSBsb2NhbCB2YXJpYWJsZSBuYW1lPGJyPgorPHByZT4KK2ludCBmJmx0O2NvZGUgYXNzaXN0Jmd0OworU3lzdGVtLm91dC5wcmludChmb28pOworPC9wcmU+CitJbiB0aGlzIGV4YW1wbGUgZm9vIGlzIHByb3Bvc2VkIGFzIGEgcG9zc2libGUgY29tcGxldGlvbi4KKzwvbGk+Cis8bGk+VGhlIGNvbXBpbGVyIG5vdyB0b2xlcmF0ZXMgdGhhdCBtZXRob2RzIGltcGxlbWVudGluZyBhIG1ldGhvZCBkZWNsYXJlZAorICAgIGluIGFuIGltcGxlbWVudGVkIGludGVyZmFjZSBvciBhbiBleHRlbmRlZCBhYnN0cmFjdCBjbGFzcyBiZWFyIGFuIEBPdmVycmlkZQorICAgIGFubm90YXRpb24gKDEuNiBtb2RlIG9ubHkgLSBzZWUgYWxzbyBidWcKKyAgICA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE5MzEiPjE0MTkzMTwvYT4pLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk2NyI+MTYxOTY3PC9hPgorTWFwLmtleVNldCgpIGNhbiBiZSByZXBsYWNlZCB3aXRoIE1hcC5lbnRyeVNldCgpIHdoZW4gdmFsdWUgaXMgdXNlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTIxNCI+MTYxMjE0PC9hPgorW2NvbXBpbGVyXSBGdXAgb24gYnVnIDE1OTcwOTogaW1wcm92ZSBkZXByZWNhdGlvbiBtYXJrcyBwcm9wYWdhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTU4MSI+MTYxNTgxPC9hPgorQWRkaW5nIGEgbWlzc2luZyBmb2xkZXIgZG9lc24ndCByZW1vdmUgY2xhc3NwYXRoIG1hcmtlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Nzk5NiI+MTU3OTk2PC9hPgorW2NvbXBpbGVyXSBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBtaXNzaW5nIGEgY2xvc2VzdE1hdGNoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMzM3Ij4xNjAzMzc8L2E+CitFbXB0eSBibG9jayBub3QgZGV0ZWN0ZWQgaW5zaWRlIGFub255bW91cyBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTU1NSI+MTYxNTU1PC9hPgorb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuUmVjb25jaWxlclRlc3RzI3Rlc3REZWxldGVUd29NZXRob2RzIGlzIGZhaWxpbmcgb24gSUJNIDEuNSBWTQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTU1NyI+MTYxNTU3PC9hPgorW2Fzc2lzdF0gSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB0aHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiB3aGVuIHVzaW5nIGNvbnRlbnQgYXNzaXN0IG9uIGdlbmVyaWNzIHR5cGUgYXJndW1lbnQgd2l0aCBpbnN0YW5jZSBtZW1iZXIgYXJyYXlzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwMjI4Ij4xNTAyMjg8L2E+CitDb2RlIGFzc2lzdCBmb3IgdW5yZXNvbHZlZCBsb2NhbCB2YXJpYWJsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjEyMDQiPjE2MTIwNDwvYT4KK2NvZGUgYXNzaXN0IHdpdGggdW5yZXNvbHZlZCB0eXBlcyBkb2VzIG5vdCB3b3JrIHdoZW4gdXNpbmcgNS4wIHJ0LmphcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTU1NCI+MTYxNTU0PC9hPgorb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbi5HZW5lcmljVHlwZVRlc3QjdGVzdDEwNTAgZmFpbHMgb24gSUJNIEpESyAxLjUgVk0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE5MzEiPjE0MTkzMTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBAT3ZlcnJpZGU6IHVwY29taW5nIGNoYW5nZXMgb2YgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTQ3NiI+MTYxNDc2PC9hPgorb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbi5CYXRjaENvbXBpbGVyVGVzdC50ZXN0MDI0IHBhc3NlcyB1bmV4cGVjdGVkbHkgd2l0aCBJQk0gSmF2YTIgNS4wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNDU5Ij4xNjE0NTk8L2E+Cis5IHRlc3RzIGluIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb24gZmFpbCBvbiBJQk0gSmF2YTIgNS4wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NzM2Ij4xNTY3MzY8L2E+CitbY29tcGlsZXJdIEFkZCBjb21waWxlciBvcHRpb24gdG8gd2FybiBvdmVycmlkaW5nIG1ldGhvZHMgdGhhdCBkbyBub3QgY2FsbCBzdXBlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTcxMSI+MTU5NzExPC9hPgorWzEuNV1bY29tcGlsZXJdIHdyb25nbHkgcmVwb3J0cyBhbWJpZ3VvdXMgbWV0aG9kIGVycm9yCisKKzxhIG5hbWU9InZfNzE3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNMyAtIDE3dGggT2N0b2JlciAyMDA2Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcxNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT48Y29kZT5UeXBlTmFtZU1hdGNoPC9jb2RlPiBBUEkgaGFzIGJlZW4gcG9saXNoZWQgd2hpbGUgaW1wbGVtZW50aW5nIG5ldyA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdW10gY2hhcltdW10sLi4uKTwvY29kZT4KK0FQSSBtZXRob2QgKHNlZSBuZXh0IHBvaW50KS48YnI+CitUaGlzIGNsYXNzIGhhcyBiZWVuIGFic3RyYWN0ZWQgYW5kIGNsaWVudHMgbm93IG5lZWQgdG8gdXNlIGFkZGVkIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gZm9sbG93aW5nIG1ldGhvZAordG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGl0OgorPHByZT4KKy8qKgorICogQ3JlYXRlIGEgdHlwZSBuYW1lIG1hdGNoIG9uIGEgZ2l2ZW4gdHlwZSB3aXRoIHNwZWNpZmljIG1vZGlmaWVycy4KKyAqCisgKiBAcGFyYW0gdHlwZSBUaGUgamF2YSBtb2RlbCBoYW5kbGUgb2YgdGhlIHR5cGUKKyAqIEBwYXJhbSBtb2RpZmllcnMgTW9kaWZpZXJzIG9mIHRoZSB0eXBlCisgKiBAcmV0dXJuIEEgbm9uLW51bGwgbWF0Y2ggb24gdGhlIGdpdmVuIHR5cGUuCisgKi8KK3B1YmxpYyBzdGF0aWMgVHlwZU5hbWVNYXRjaCBjcmVhdGVUeXBlTmFtZU1hdGNoKElUeXBlIHR5cGUsIGludCBtb2RpZmllcnMpCis8L3ByZT4KK0Vhcmx5IHBlcmZvcm1hbmNlIHRlc3RzIHVzaW5nIGFkZGVkIDxjb2RlPnNlYXJjaEFsbFR5cGVOYW1lczwvY29kZT4gbWV0aG9kIHdpdGggPGNvZGU+VHlwZU5hbWVNYXRjaFJlcXVlc3RvcjwvY29kZT4KK3JlcXVlc3RvciAoaS5lLiBhIGxhIE9wZW4gVHlwZSBkaWFsb2cpIHNob3cgaW50ZXJlc3RpbmcgbWVtb3J5IGZvb3RwcmludCByZWR1Y3Rpb24gKGFyb3VuZCAzMCUpLiBNb3JlIHByZWNpc2UgbWVhc3VyZXMgb2YgdGhpcworcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2lsbCBiZSBkb25lIGxhdGVyLi4uCis8L2xpPgorPGxpPkFkZGVkIG5ldyA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IEFQSSBtZXRob2QgZm9yIHNlYXJjaCBhbGwgdHlwZSBuYW1lcyB3aXRoIG11bHRpcGxlIHF1YWxpZmljYXRpb25zIGFuZCB0eXBlIG5hbWVzCisoc2VlIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjQiPjE2MDMyNDwvYT4pLjxicj4KK09ubHkgcmVxdWVzdG9yIGRpZmZlcnMgZnJvbSBhbHJlYWR5IGV4aXN0aW5nIGNvcnJlc3BvbmRpbmcgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzPC9jb2RlPiBtZXRob2Q6Cis8cHJlPgorLyoqCisgKiBTZWFyY2hlcyBmb3IgYWxsIHRvcC1sZXZlbCB0eXBlcyBhbmQgbWVtYmVyIHR5cGVzIGluIHRoZSBnaXZlbiBzY29wZSBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIHF1YWxpZmljYXRpb25zCisgKiBhbmQgdHlwZSBuYW1lcyBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4KKyAqCisgKiBQcm92aWRlZCB7QGxpbmsgVHlwZU5hbWVNYXRjaFJlcXVlc3Rvcn0gcmVxdWVzdG9yIHdpbGwgY29sbGVjdCB7QGxpbmsgVHlwZU5hbWVNYXRjaH0KKyAqIG1hdGNoZXMgZm91bmQgZHVyaW5nIHRoZSBzZWFyY2guCisuLi4KKyAqIEBwYXJhbSBuYW1lTWF0Y2hSZXF1ZXN0b3IgdGhlIHtAbGluayBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yIHJlcXVlc3Rvcn0gdGhhdCBjb2xsZWN0cworICogCQkJCXtAbGluayBUeXBlTmFtZU1hdGNoIG1hdGNoZXN9IG9mIHRoZSBzZWFyY2guCisuLi4KKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAorCWZpbmFsIGNoYXJbXVtdIHF1YWxpZmljYXRpb25zLAorCWZpbmFsIGNoYXJbXVtdIHR5cGVOYW1lcywKKwlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAorCWZpbmFsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAorCWludCB3YWl0aW5nUG9saWN5LAorCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorPC9wcmU+CitTaW1pbGFyaWx5IHRvIHByZXZpb3VzIGFkZGVkIDxjb2RlPnNlYXJjaEFsbFR5cGVOYW1lczwvY29kZT4gbmV3IEFQSSBtZXRob2QsIGNsaWVudHMgaGF2ZSB0byBwcm92aWRlCithIG5ldyByZXF1ZXN0b3I6IDxjb2RlPlR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3I8L2NvZGU+IGluIG9yZGVyIHRvIGdldCBtYXRjaGVzIGNvbGxlY3RlZCBkdXJpbmcgdGhlIHNlYXJjaC48YnI+Cis8L2xpPgorPGxpPkNvZGUgQXNzaXN0IGNhbiByZXR1cm4gY29tcGxldGlvbiBwcm9wcm9zYWxzIHRoYXQgcmVxdWlyZWQgc29tZSBvdGhlciBjb21wbGV0aW9uIHByb3Bvc2Fsczo8YnI+CitUbyBhcHBseSBhIGNvbXBsZXRpb24gcHJvcG9zYWwgdGhlIHJlcXVpcmVkIGNvbXBsZXRpb24gcHJvcG9zYWxzIG11c3QgYmUgYXBwbGllZCBvdGhlcndpc2UgdGhlIHJlc3VsdGluZyBjb2RlIHdvbid0IGJlIGNvcnJlY3QuPGJyPgorVG8gbWFuYWdlIGNvbXBsZXRpb24gcHJvcG9zYWxzd2l0aCByZXF1aXJlZCBwcm9wb3NhbHMgdGhlIGZvbGxvd2luZyBBUEkgaGF2ZSBiZWVuIGFkZGVkOgorPHByZT4KK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWwgeworCisJLi4uCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscy4KKwkgKiBUaGUgcHJvcG9zYWwgY2FuIGJlIGFwcGx5IG9ubHkgaWYgdGhlc2UgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbHMgYXJlIGFsc28gYXBwbGllZC4KKwkgKiBJZiB0aGUgcmVxdWlyZWQgcHJvcG9zYWwgYXJlbid0IGFwcGxpZWQgdGhlIGNvbXBsZXRpb24gY291bGQgY3JlYXRlIGNvbXBsYXRpb25zIHByb2JsZW1zLgorCSAqCisJICogJmx0O3AmZ3Q7CisJICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKwkgKiBjb21wbGV0aW9uIHByb3Bvc2FsczoKKwkgKiAmbHQ7dWwmZ3Q7CisJICogCSZsdDtsaSZndDsmbHQ7Y29kZSZndDtGSUVMRF9SRUYmbHQ7L2NvZGUmZ3Q7IC0gVGhlIGFsbG93ZWQgcmVxdWlyZWQgcHJvcG9zYWxzIGZvciB0aGlzIGtpbmQgYXJlOgorCSAqICAgJmx0O3VsJmd0OworCSAqICAgICZsdDtsaSZndDsmbHQ7Y29kZSZndDtUWVBFX1JFRiZsdDsvY29kZSZndDsmbHQ7L2xpJmd0OworCSAqICAgJmx0Oy91bCZndDsKKwkgKiAmbHQ7L2xpJmd0OworCSAqIAkmbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7TUVUSE9EX1JFRiZsdDsvY29kZSZndDsgLSBUaGUgYWxsb3dlZCByZXF1aXJlZCBwcm9wb3NhbHMgZm9yIHRoaXMga2luZCBhcmU6CisJICogICAmbHQ7dWwmZ3Q7CisJICogICAgJmx0O2xpJmd0OyZsdDtjb2RlJmd0O1RZUEVfUkVGJmx0Oy9jb2RlJmd0OyZsdDsvbGkmZ3Q7CisJICogICAmbHQ7L3VsJmd0OworCSAqICAmbHQ7L2xpJmd0OworCSAqICZsdDsvdWwmZ3Q7CisJICogJmx0Oy9wJmd0OworCSAqICZsdDtwJmd0OworCSAqIE90aGVyIGtpbmRzIG9mIHJlcXVpcmVkIHByb3Bvc2FscyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBmdXR1cmUsIHRoZXJlZm9yZSBjbGllbnRzIG9mIHRoaXMKKwkgKiBBUEkgbXVzdCBhbGxvdyB3aXRoIHtAbGluayBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKX0KKwkgKiBvbmx5IGtpbmRzIHdoaWNoIGFyZSBpbiB0aGlzIGxpc3QgdG8gYXZvaWQgdW5leHBlY3RlZCByZXN1bHRzIGluIHRoZSBmdXR1cmUuCisJICogJmx0Oy9wJmd0OworCSAqICZsdDtwJmd0OworCSAqIEEgcmVxdWlyZWQgY29tcGxldGlvbiBwcm9wb3NhbCBjYW5ub3QgaGF2ZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscy4KKwkgKiAmbHQ7L3AmZ3Q7CisJICoKKwkgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBjb21wbGV0aW9uIHByb3Bvc2Fscywgb3IgJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsgaWYgbm9uZS4KKwkgKgorCSAqIEBzZWUgQ29tcGxldGlvblJlcXVlc3RvciNzZXRBbGxvd3NSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCxib29sZWFuKQorCSAqCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRSZXF1aXJlZFByb3Bvc2FscygpIHsuLi59CisKKwkuLi4KKworfQorPC9wcmU+Cis8cHJlPgorcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3IgeworCisJLi4uCisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCisJICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZC4KKwkgKgorCSAqIEBwYXJhbSBwcm9wb3NhbEtpbmQgb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyBkZWNsYXJlZAorCSAqIEBwYXJhbSByZXF1aXJlZFByb3Bvc2FsS2luZClvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCisJICogb24gJmx0O2NvZGUmZ3Q7Q29tcGxldGlvblByb3Bvc2FsJmx0Oy9jb2RlJmd0OworCSAqIEByZXR1cm4gJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDsgaWYgYSBwcm9wb3NhbCBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIHJlcXVpcmVkIHByb3Bvc2FsCisJICogb2YgdGhlIGdpdmVuIGtpbmQgaXMgYWxsb3dlZCBieSB0aGlzIHJlcXVlc3RvciwgYW5kICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OworCSAqIGlmIGl0IGlzbid0IG9mIGludGVyZXN0LgorCSAqICZsdDtwJmd0OworCSAqIEJ5IGRlZmF1bHQsIGFsbCBraW5kcyBvZiByZXF1aXJlZCBwcm9wb3NhbHMgYXJlbid0IGFsbG93ZWQuCisJICogJmx0Oy9wJmd0OworCSAqIEBzZWUgI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQorCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldEtpbmQoKQorCSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsI2dldFJlcXVpcmVkUHJvcG9zYWxzKCkKKwkgKgorCSAqIEBzaW5jZSAzLjMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FsbG93aW5nUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kKSB7Li4ufQorCisJLyoqCisJICogU2V0cyB3aGV0aGVyIGEgcHJvcG9zYWwgb2YgYSBnaXZlbiBraW5kIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbAorCSAqIG9mIHRoZSBnaXZlbiBraW5kIGlzIGFsbG93ZWQuCisJICoKKwkgKiBDdXJyZW5sdHkgb25seSBhIHN1YnNldCBvZiBraW5kcyBzdXBwb3J0IHJlcXVpcmVkIHByb3Bvc2Fscy4gVG8gc2VlIHdoYXQgY29tYmluYXRpb25zCisJICogYXJlIHN1cHBvcnRlZCB5b3UgbXVzdCBsb29rIGF0IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWwjZ2V0UmVxdWlyZWRQcm9wb3NhbHMoKX0KKwkgKiBkb2N1bWVudGF0aW9uLgorCSAqCisJICogQHBhcmFtIHByb3Bvc2FsS2luZCBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIGRlY2xhcmVkCisJICogQHBhcmFtIHJlcXVpcmVkUHJvcG9zYWxLaW5kKW9uZSBvZiB0aGUga2luZCBjb25zdGFudHMgZGVjbGFyZWQKKwkgKiBvbiAmbHQ7Y29kZSZndDtDb21wbGV0aW9uUHJvcG9zYWwmbHQ7L2NvZGUmZ3Q7CisJICogQHBhcmFtIGFsbG93ICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGlmIGEgcHJvcG9zYWwgb2YgYSBnaXZlbiBraW5kIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbAorCSAqIG9mIHRoZSBnaXZlbiBraW5kIGlzIGFsbG93ZWQgYnkgdGhpcyByZXF1ZXN0b3IsIGFuZCAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsKKwkgKiBpZiBpdCBpc24ndCBvZiBpbnRlcmVzdAorCSAqIEBzZWUgI2lzQWxsb3dpbmdSZXF1aXJlZFByb3Bvc2FscyhpbnQsIGludCkKKwkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRLaW5kKCkKKwkgKiBAc2VlIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRSZXF1aXJlZFByb3Bvc2FscygpCisJICoKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHZvaWQgc2V0QWxsb3dzUmVxdWlyZWRQcm9wb3NhbHMoaW50IHByb3Bvc2FsS2luZCwgaW50IHJlcXVpcmVkUHJvcG9zYWxLaW5kKWJvb2xlYW4gYWxsb3cpIHsuLi59CisKKwkuLi4KKworfQorPC9wcmU+Cis8L2xpPgorPGxpPkNvZGUgQXNzaXN0IHByb3Bvc2UgY29tcGxldGlvbiBldmVuIGlmIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgb3IgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgaXMgbWlzc2luZy48YnI+CitlLmcuCis8cHJlPgorcGFja2FnZSBwOworcHVibGljIGNsYXNzIFggeworICB2b2lkIGZvbygpIHsKKyAgICBWZWN0b3IgdiA9IG51bGw7CisgICAgdi5hZGRFbHwgLy8gY29tcGxldGUgYXQgfCBsb2NhdGlvbgorICB9Cit9Cis8L3ByZT4KK0EgY29tcGxldGlvbiBwcm9wb3NhbCB3aXRoIHJlcXVpcmVkIHByb3Bvc2FscyB3aWxsIGJlIHJldHVybmVkLiBUaGUgbWFpbiBwcm9wb3NhbCB3aWxsIGJlIHRoZSBtZXRob2QgPGNvZGU+YWRkRWxlbWVudCgpPC9jb2RlPgorYXQgPGNvZGU+YWRkRWw8L2NvZGU+IGxvY2F0aW9uIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbCBvZiB0aGUgdHlwZSA8Y29kZT5qYXZhLnV0aWwuVmVjdG9yPC9jb2RlPiBhdAorPGNvZGU+VmVjdG9yPC9jb2RlPiBsb2NhdGlvbi4KK1RoZSBzYW1lIGtpbmQgb2YgY29tcGxldGlvbiBjYW4gYmUgY29tcHV0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLgorPHByZT4KK3BhY2thZ2UgcDsKK3B1YmxpYyBjbGFzcyBYIHsKKyAgVmVjdG9yIHYgPSBudWxsOworICB2b2lkIGZvbygpIHsKKyAgICB2LmFkZEVsfCAvLyBjb21wbGV0ZSBhdCB8IGxvY2F0aW9uCisgIH0KK30KKzwvcHJlPgorPHByZT4KK3BhY2thZ2UgcDsKK3B1YmxpYyBjbGFzcyBYIHsKKyAgVmVjdG9yIGJhcigpIHtyZXR1cm4gbnVsbDt9CisgIHZvaWQgZm9vKCkgeworICAgIGJhcigpLmFkZEVsfCAvLyBjb21wbGV0ZSBhdCB8IGxvY2F0aW9uCisgIH0KK30KKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMTkwIj4xNjExOTA8L2E+Citbc2VhcmNoXSBBbGwgdHlwZSBzZWFyY2ggZG9lc24ndCBmaW5kIGFsbCB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTc1NiI+MTUxNzU2PC9hPgorW2NvbXBpbGVyXSB1bnZlcmlmaWFibGUgYnl0ZWNvZGUgY3JlYXRlZCB3aXRoIGN2cyBoZWFkIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDI4Ij4xNjEwMjg8L2E+Citbc2VhcmNoXSBOUEUgb24gb3JnYW5pemUgaW1wb3J0cyBpbiBUeXBlTmFtZU1hdGNoLmVxdWFscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDg1NCI+MTYwODU0PC9hPgorW3NlYXJjaF0gTm8gdHlwZSBpcyBmb3VuZCB1c2luZyBzZWFjaEFsbFR5cGVOYW1lcyhjaGFyW11bXSxjaGFyW11bXSwuLi4pIG1ldGhvZHMgd2hlbiBubyB0eXBlIG5hbWVzIGlzIHNwZWNpZmllZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwMzM5Ij44MDMzOTwvYT4KK1dyb25nIGVycm9yIG1lc3NhZ2UgIjsgZXhwZWN0ZWQiIHdoZW4gd3JpdGluZyBhbiBpbnRlcmZhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk3MDkiPjE1OTcwOTwvYT4KK1tjb21waWxlcl0gbWlzc2luZyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBtZW1iZXIgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxNzAiPjE1NzE3MDwvYT4KK1tBU1QgdmlzaXRvcl0gVW52aXNpdGVkIGVsZW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5OTczIj4xNTk5NzM8L2E+CitbMS41XSBbY29tcGlsZXJdIFZlcmlmeUVycm9yIGR1ZSB0byBjb21waWxlciBnZW5lcmF0aW5nIGluY29ycmVjdCBzeW50aGV0aWMgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDY1NSI+MTYwNjU1PC9hPgorW2Fzc2lzdF0gQnVnIHdpdGggY29kZSBhc3Npc3QgYW5kIGdlbmVyaWNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDQ5ODQiPjQ0OTg0PC9hPgorW3R5cGluZ10gQXV0b21hdGljYWxseSBvcHRpbWl6ZSBjbGFzcyBpbXBvcnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNDk0Ij4xNjA0OTQ8L2E+Citbc2VhcmNoXSBzZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdW10sIGNoYXJbXVtdLC4uLikgZmFpbHMgdG8gZmluZCB0eXBlcyBpbiBkZWZhdWx0IHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjgiPjE2MDMyODwvYT4KK1tzZWFyY2hdIFJlbW92ZSBjb25zdHJ1Y3RvciBUeXBlTmFtZU1hdGNoKElUeXBlKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDMyNyI+MTYwMzI3PC9hPgorW3NlYXJjaF0gQWRkIHNwZWNpZmljYXRpb24gZm9yIFR5cGVOYW1lTWF0Y2guZ2V0VHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDMyNCI+MTYwMzI0PC9hPgorW3NlYXJjaF0gU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyhjaGFyW11bXSwgY2hhcltdW10sIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAzMjMiPjE2MDMyMzwvYT4KK1tzZWFyY2hdIFR5cGVOYW1lTWF0Y2g6IHN1cHBvcnQgaGFzaENvZGUvZXF1YWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMzUyIj4xNjAzNTI8L2E+CitDT01QQUNUIG1vZGUgZG9lc24ndCB3b3JrIGZvciBleGNlcHRpb24gdGFibGUgaW4gdGhlIGRpc2Fzc2VtYmxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjAwIj45MDYwMDwvYT4KK1ttb2RlbF0gQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uYXBwbHk6IHNob3VsZCB1c2UgcHJvamVjdCBvcHRpb25zIGZvciByZXdyaXRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDM1MiI+MTYwMzUyPC9hPgorQ09NUEFDVCBtb2RlIGRvZXNuJ3Qgd29yayBmb3IgZXhjZXB0aW9uIHRhYmxlIGluIHRoZSBkaXNhc3NlbWJsZXIKKworPGEgbmFtZT0idl83MTYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00zIC0gMTB0aCBPY3RvYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzE2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlJhdyB0eXBlIHJlZmVyZW5jZSBhcmUgbm93IHJlcG9ydGVkIGJ5IGRlZmF1bHQuIFNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NDU2Ij4xNTk0NTY8L2E+LjwvbGk+Cis8bGk+QVBJIG9mIDxjb2RlPlR5cGVOYW1lTWF0Y2g8L2NvZGU+IGhhcyBiZWVuIGNoYW5nZWQgdG8gaW1wcm92ZSBtZW1vcnkgY29uc3VtcHRpb24gcGVyZm9ybWFuY2UuCitJdCBub3cgY3JlYXRlcyBJVHlwZSBoYW5kbGUgd2hpbGUgYWNjZXB0aW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uIGZyb20gaW5kZXhlcyBhbmQgc3RvcmVzIHRoZWlyIG1vZGlmaWVycwordG8gYXZvaWQgamF2YSBlbGVtZW50IG9wZW5pbmcgd2hpbGUgZ2V0dGluZyB0aGlzIHBpZWNlIG9mIGluZm9ybWF0aW9uLjxicj4KK05vdGUgdGhhdCB0aGVyZSdzIG5vIEphdmEgTW9kZWwgaW5pdGlhbGl6YXRpb24gbm9yIHBvcHVsYXRpbmcgd2hpbGUgY3JlYXRpbmcgaGFuZGxlcy4uLjxicj4KK05vdGUgYWxzbyB0aGF0IHByZXZpb3VzbHkgYWRkZWQgQVBJIG1ldGhvZCBvbiBJSmF2YVByb2plY3QgaGFzIGJlZW4gcmVtb3ZlZDoKKzxwcmU+CitJVHlwZSBmaW5kVHlwZShTdHJpbmcgcGFja2FnZU5hbWUsCisJU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lLAorCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsCisJSUNvbXBpbGF0aW9uVW5pdFtdIHVuaXRzLAorCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworPC9wcmU+Cis8L2xpPgorPGxpPldoaWxlIGZpeGluZyBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3ODE0Ij4xNTc4MTQ8L2E+LCBuZXcgPGNvZGU+TWV0aG9kUmVmZXJlbmNlTWF0Y2guaXNQb2x5bW9ycGhpYygpPC9jb2RlPiBBUEkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG86Cis8cHJlPgorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBvbiBhIG1lc3NhZ2Ugc2VudCBmcm9tIGEgdHlwZQorICogd2hpY2ggaXMgYSBzdXBlciB0eXBlIG9mIHRoZSBzZWFyY2hlZCBtZXRob2QgZGVjbGFyaW5nIHR5cGUuCisgKiBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIG1ldGhvZCBjYWxsZWQgYXQgcnVuLXRpbWUgbWF5IG9yIG1heSBub3QgYmUKKyAqIHRoZSBzZWFyY2ggdGFyZ2V0LCBkZXBlbmRpbmcgb24gdGhlIHJ1bi10aW1lIHR5cGUgb2YgdGhlIHJlY2VpdmVyIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgaXMgb24gYSBtZXNzYWdlIHNlbnQgZnJvbQorICogYSBzdXBlci10eXBlIG9mIHRoZSBzZWFyY2ggbWV0aG9kIGRlY2xhcmluZyBjbGFzcywgPGNvZGU+ZmFsc2UgPC9jb2RlPiBvdGhlcndpc2UKKyAqLworcHVibGljIGJvb2xlYW4gaXNTdXBlckludm9jYXRpb24oKQorPC9wcmU+Cis8L2xpPgorPGxpPkFkZGVkIG5ldyBBUEkgPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RmFpbHVyZUNvbnRhaW5lciguLi4pPC9jb2RlPiB0aGF0IHJldHVybnMgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgdGhhdAorICAgICBzaG91bGQgYmUgdXNlZCBpZiBhIGNvbnRhaW5lciBpbml0aWFsaXplciBmYWlscyB0byBpbml0aWFsaXplIGEgY29udGFpbmVyLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1MDA4Ij45NTAwODwvYT4KK1thc3Npc3RdIE1pc3NpbmcgY29tcGxldGlvbiBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24gaW4gYm9vbGVhbiBjYXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMDE1Ij4xNjAwMTU8L2E+CitbMS41XVtqYXZhZG9jXSBNaXNzaW5nIHdhcm5pbmcgb24gYXV0b2JveGluZyBjb21wYXRpYmxlIG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAxMzIiPjE2MDEzMjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciBmYWlscyB3aXRoIGluZGlyZWN0IHJlZmVyZW5jZSBlcnJvciBtZXNzYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMDA1Ij4xNjAwMDU8L2E+CitBZGQgcHJvdGVjdGlvbiBhYm91dCBtaXNiZWhhdmluZyBjb250YWluZXIgaW5pdGlhbGl6ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjQ4MiI+ODY0ODI8L2E+CitJU291cmNlUmFuZ2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaW1wbGVtZW50cyB2YWx1ZSBlcXVhbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc4MTQiPjE1NzgxNDwvYT4KK1tzZWFyY2hdIHBvbHltb3JwaGljIG1hdGNoZXMgaW4gc3VwZXJ0eXBlIGhpZXJhcmNoeSBzaG91bGQgYmUgbWFya2VkIGFzIHBvdGVudGlhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODM4MCI+MTQ4MzgwPC9hPgorW3NlYXJjaF0gZ2V0IElUeXBlIGZyb20gVHlwZU5hbWVSZXF1ZXN0b3IgcmVzdWx0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMDI1Ij4xNjAwMjU8L2E+CitDaGFyT3BlcmF0aW9uIGZhaWxzIHdpdGggQUlPT0JFIHdoZW4gcmVwbGFjZWQgYXJyYXkgY29udGFpbnMgdGhlIHNhbWUgY2hhcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk2NDEiPjE1OTY0MTwvYT4KK3BhdGNoIHRvIHJlZmFjdG9yIE1haW4gYW5kIGFkZCBuZXcgJnF1b3Q7R0NDTWFpbiZxdW90OyBkcml2ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQ4NDgiPjEzNDg0ODwvYT4KK1tjb21waWxlcl1bbnVsbF0gZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgbmVzdGVkIGxvb3Agd2l0aCBicmVhayB0byBleHBsaWNpdCBsYWJlbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTY1NCI+MTU5NjU0PC9hPgorW2NvbXBpbGVyXSB1bnZlcmlmaWFibGUgYnl0ZWNvZGUgY3JlYXRlZCBieSBjdXJyZW50IGN2cyBoZWFkIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTE4Ij4xNTg1MTg8L2E+CitSZW1vdmUgZGVwZW5kZW5jeSBvZiBHZW5lcmljVHlwZVRlc3QjdGVzdDM3MCBvbiBTVU4gaW50ZXJuYWwgQVBJcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTYwNyI+MTU5NjA3PC9hPgorWzEuNV1bY29tcGlsZXJdIE0yOiBVbm5lY2Vzc2FyeSBjYXN0IGlzIG5lY2Vzc2FyeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODI2NyI+MTU4MjY3PC9hPgorQnJhY2UgcG9zaXRpb25zIGxpbmUgYWZ0ZXIgYW5ub3RhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODI1OCI+MTU4MjU4PC9hPgorRG91YmxlIGNoZWNrIHNvcnRpbmcgYWxnb3JpdGhtcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTQ1NiI+MTU5NDU2PC9hPgorWzEuNV1bY29tcGlsZXJdIEVuYWJsZSBjb21waWxlciB3YXJuaW5nIGZvciByYXcgdHlwZSByZWZlcmVuY2UgYnkgZGVmYXVsdAorCis8YSBuYW1lPSJ2XzcxNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTMgLSAzcmQgT2N0b2JlciAyMDA2Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcxNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MTUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBuZXcgPGNvZGU+U2VhcmNoRW5naW5lPC9jb2RlPiBBUEkgbWV0aG9kIGZvciBzZWFyY2ggYWxsIHR5cGUgbmFtZXMgKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzgwIj4xNDgzODA8L2E+KS48YnI+CitPbmx5IHJlcXVlc3RvciBkaWZmZXJzIGZyb20gYWxyZWFkeSBleGlzdGluZyA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXM8L2NvZGU+IG1ldGhvZDoKKzxwcmU+CisvKioKKyAqIFNlYXJjaGVzIGZvciBhbGwgdG9wLWxldmVsIHR5cGVzIGFuZCBtZW1iZXIgdHlwZXMgaW4gdGhlIGdpdmVuIHNjb3BlLgorICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2UgbmFtZSB1c2luZyBzcGVjaWZpYyBtYXRjaCBtb2RlCisgKiBhbmQvb3IgYSB0eXBlIG5hbWUgdXNpbmcgYW5vdGhlciBzcGVjaWZpYyBtYXRjaCBtb2RlKS4KKyAqCisgKiBQcm92aWRlZCB7QGxpbmsgVHlwZU5hbWVNYXRjaFJlcXVlc3Rvcn0gcmVxdWVzdG9yIHdpbGwgY29sbGVjdCB7QGxpbmsgVHlwZU5hbWVNYXRjaH0KKyAqIG1hdGNoZXMgZm91bmQgZHVyaW5nIHRoZSBzZWFyY2guCisuLi4KKyAqIEBwYXJhbSBuYW1lTWF0Y2hSZXF1ZXN0b3IgdGhlIHtAbGluayBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yIHJlcXVlc3Rvcn0gdGhhdCBjb2xsZWN0cworICogCQkJCXtAbGluayBUeXBlTmFtZU1hdGNoIG1hdGNoZXN9IG9mIHRoZSBzZWFyY2guCisuLi4KKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAorCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKKwlmaW5hbCBpbnQgcGFja2FnZU1hdGNoUnVsZSwKKwlmaW5hbCBjaGFyW10gdHlwZU5hbWUsCisJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsCisJaW50IHNlYXJjaEZvciwKKwlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAorCWZpbmFsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAorCWludCB3YWl0aW5nUG9saWN5LAorCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorPC9wcmU+CitDbGllbnRzIGhhdmUgdG8gcHJvdmlkZSBhIG5ldyByZXF1ZXN0b3I6IDxjb2RlPlR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3I8L2NvZGU+IGluIG9yZGVyIHRvCitnZXQgbWF0Y2hlcyBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBzZWFyY2guPGJyPgorTm90ZSB0aGF0IHRoaXMgbWF0Y2ggKDxjb2RlPlR5cGVOYW1lTWF0Y2g8L2NvZGU+KSBjYW4gcmVzb2x2ZSB0eXBlIGFuZCB0aGVuIHByb3ZpZGUgY29ycmVzcG9uZGluZyBqYXZhIG1vZGVsIDxjb2RlPklUeXBlPC9jb2RlPjoKKzxwcmU+CisvKioKKyAqIFJldHVybnMgdGhlIGphdmEgbW9kZWwgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUKKyAqIChiYXNlZCBvbiBwYWNrYWdlLCBlbmNsb3NpbmcgdHlwZXMgYW5kIHNpbXBsZSBuYW1lKS4KKyAqCisgKiBAcmV0dXJuIHRoZSBqYXZhIG1vZGVsIHR5cGUKKyAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGhhcHBlbnMgd2hlbiB0eXBlIHN0b3JlZCBpbmZvcm1hdGlvbiBhcmUgbm90IHZhbGlkCisgKi8KK3B1YmxpYyBJVHlwZSByZXNvbHZlZFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCis8L3ByZT4KKzwvbGk+Cis8bGk+CitEZXByZWNhdGVkIGV4aXN0aW5nIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gQVBJIGhlbHBlciBtZXRob2Q6Cis8cHJlPgorCXB1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKKwkJZmluYWwgY2hhcltdIHBhY2thZ2VFeGFjdE5hbWUsCisJCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKKwkJZmluYWwgaW50IG1hdGNoUnVsZSwKKwkJaW50IHNlYXJjaEZvciwKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKKwkJZmluYWwgVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKKwkJaW50IHdhaXRpbmdQb2xpY3ksCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorPC9wcmU+CitUaGlzIHNob3VsZCBhdm9pZCB0byBoYXZlIHRvbyBtYW55IHNpbWlsYXIgPGNvZGU+c2VhcmNoQWxsVHlwZU5hbWVzPC9jb2RlPiBhdmFpbGFibGUgbWV0aG9kcy4uLgorPC9saT4KKzxsaT4KK0FkZGVkIG5ldyA8Y29kZT5KYXZhQ29yZTwvY29kZT4gQVBJIG1ldGhvZCB0byBjcmVhdGUgYSBqYXZhIGVsZW1lbnQgZnJvbSBhbiA8Y29kZT5JRmlsZTwvY29kZT4KK3VzaW5nIGEgc3BlY2lmaWMgcHJvamVjdDoKKzxwcmU+CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWxlLCBpdHMgcHJvamVjdCBiZWluZyB0aGUgZ2l2ZW4KKyAqIHByb2plY3QuCisgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZpbGUKKyAqIHdpdGggYSBKYXZhIGVsZW1lbnQuCisgKgorICogVGhlIGZpbGUgbXVzdCBiZSBvbmUgb2Y6CisgKiAgLiBhIGZpbGUgd2l0aCBvbmUgb2YgdGhlIHtAbGluayBKYXZhQ29yZSNnZXRKYXZhTGlrZUV4dGVuc2lvbnMoKQorICogICAgICBKYXZhLWxpa2UgZXh0ZW5zaW9uc30gLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPgorICogIC4gYSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPgorICogIC4gYSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+CisgKgorICogQ3JlYXRpbmcgYSBKYXZhIGVsZW1lbnQgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhbmQgb3BlbmluZyBhbGwgb2YgdGhlCisgKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uCisgKgorICogQHBhcmFtIGZpbGUgdGhlIGdpdmVuIGZpbGUKKyAqIEByZXR1cm4gdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWxlLCBvcgorICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgZ2l2ZW4gZmlsZQorICogd2l0aCBhIEphdmEgZWxlbWVudAorICogQHNpbmNlIDMuMworICovCitwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoSUZpbGUgZmlsZSwgSUphdmFQcm9qZWN0IHByb2plY3QpCis8L3ByZT4KK0V4aXN0aW5nIEFQSSBtZXRob2QgPGNvZGU+SmF2YUNvcmUuY3JlYXRlKElGaWxlKTwvY29kZT4gYXNzdW1lZCB0aGF0IHByb2plY3QgdG8gdXNlIHdhcyB0aGUgZmlsZSBvbmUKK2J1dCBpdCB3YXMgbm90IGFsd2F5cyB0aGUgY2FzZSwgZXNwZWNpYWxseSBmb3IgY2xhc3MgZmlsZXMgYmVsb25naW5nIHRvIGFuIGV4dGVybmFsIGNsYXNzIGZvbGRlci4uLjxicj4KK05vdGUgdGhhdCBubyBvdGhlciBtZXRob2RzIHdhcyBhZGRlZCBmb3IgPGNvZGU+SVJlc291cmNlPC9jb2RlPiBhbmQgPGNvZGU+SUZvbGRlcjwvY29kZT4gYXMgZGVmYXVsdCBwcm9qZWN0IHdhcworYWx3YXlzIHdlbGwgY29tcHV0ZWQgZm9yIHRoaXMga2luZCBvZiByZXNvdXJjZXMuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg1MDYiPjE1ODUwNjwvYT4KK1tzZWFyY2hdIFNlYXJjaEVuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMgc2hvdWxkIHNwZWMgdGhhdCBudWxsIGlzIHZhbGlkIGZvciBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MzI1Ij4xNTkzMjU8L2E+CitBbnkgaWRlYSB3aHkgQ2xhc3NwYXRoRW50cnkgY2hlY2tzIGZvciBzdHJpbmcgb2JqZWN0IHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGVxdWFscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTgyNCI+MTU1ODI0PC9hPgorW2phdmFkb2NdIENvbnRlbnQgYXNzaXN0ICBkb2Vzbid0IHN1Z2dlc3QgVmFyYXJncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDI4OSI+MTUwMjg5PC9hPgorW2hpZXJhcmNoeV0gTlBFIGluIGhpZXJhcmNoeSBidWlsZGVyIHdoZW4gcmVnaW9uIGlzIGVtcHR5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjUwIj4xNTkyNTA8L2E+CitbMS41XVtjb21waWxlcl0gU2hvdWxkIGJldHRlciBsb2NhdGUgcmF3IHR5cGUgdXNhZ2UgZm9yIGFycmF5IHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkyNDUiPjE1OTI0NTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIHJhdyB0eXBlIHVzYWdlIHdhcm5pbmcgZm9yIGFycmF5IHR5cGUgcmVmCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjQzIj4xNTkyNDM8L2E+CitbY29tcGlsZXJdIFNob3VsZCBiZXR0ZXIgbG9jYXRlIGRlcHJlY2F0aW9uIGlzc3VlIGZvciBxdWFsaWZpZWQgdHlwZSByZWYKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg5NTEiPjE1ODk1MTwvYT4KK1ttb2RlbF0gSVdvcmtpbmdDb3B5IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBpbiBhbnkgamF2YWRvYyBjb21tZW50IG9mIEphdmFNb2RlbCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMTMzIj4xNTMxMzM8L2E+CitbbW9kZWxdIHRvZ2dsZSBicmVha3BvaW50IGluIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBjbGFzcyBsb2FkIGJyZWFrcG9pbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkwMjEiPjE1OTAyMTwvYT4KK1tjb21waWxlcl0gVW51c2VkIGxvY2FscyBpbml0aWFsaXNhdGlvbiBpcyBvcHRpbWl6ZWQgb3V0IHdoZW4gaXQgaXMgYSBzaW5nbGUgbmFtZSByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg1NDgiPjE1ODU0ODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciBzaG91bGQgYmUgbW9yZSByZXNpbGllbnQgd2l0aCB1bnJlc29sdmVkIHBhcmFtZXRlcml6ZWQgdHlwZSByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0OTk1Ij4xNTQ5OTU8L2E+CitbY29tcGlsZXJdW251bGxdIGZhbHNlIHBvc2l0aXZlIGluIGVtYmVkZGVkIHdoaWxlL3doaWxlL2JyZWFrIGNvZGUKKworPGEgbmFtZT0idl83MTQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00zIC0gMjZ0aCBTZXB0ZW1iZXIgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzE0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NjY3Ij4xNDc2Njc8L2E+CitbMS41XVtjb21waWxlcl0gSWxsZWdhbCBjb21waWxlIGVycm9yOiAidGhlIG1ldGhvZCBYWFggaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZSBZWVkiCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MDAwIj4xNTgwMDA8L2E+CitbY29tcGlsZXJdW251bGxdIFNlY29uZCBkaWFnbm9zdGljIGFic29yYmVkIHdpdGhpbiBmaW5hbGx5IGJsb2NrcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDA4MiI+MTUwMDgyPC9hPgorW2NvbXBpbGVyXVtudWxsXSBOdWxsIHJlZmVyZW5jZSB3YXJuaW5nIGlnbm9yZXMgdHJ5IGJsb2NrcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTY2NSI+MTQ5NjY1PC9hPgorW2NvbXBpbGVyXVtudWxsXSBVbmV4cGVjdGVkIHZhcmlhYmxlIG1pZ2h0IGJlIG51bGwgd2FybmluZyBpbiBmaW5hbGx5IGJsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MTE4Ij4xNDcxMTg8L2E+CitbY29tcGlsZXJdW251bGxdIEluY29ycmVjdCBudWxsIGFuYWx5c2lzIGludm9sdmluZyBkb193aGlsZSBsb29wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMzAzIj4xNDIzMDM8L2E+CitSaWdodC1jbGljaywgIk9wZW4gRGVjbGFyYXRpb24iIGZhaWxzIHVuZGVyIDMuMlJDNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxOCI+MTQxNTE4PC9hPgorSUV2YWx1YXRpb25Db250ZXh0Lm5ld1ZhcmlhYmxlIGlzIG5vdCBjb25zaWRlcmVkIHdoZW4gZG9pbmcgY29kZWNvbXBsZXRlLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzAwMSI+MTQzMDAxPC9hPgorU3RhdGVtZW50IHJlY292ZXJ5IGRvZXNuJ3QgcmVjb3ZlciBicm9rZW4gdHJ5IHN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzIyNSI+MTIzMjI1PC9hPgorQ29kZSBhc3Npc3Qgc3VnZ2VzdHMgb3ZlcnJpZGRlbiBtZXRob2QKKworPGEgbmFtZT0idl83MTMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00yIC0gMTV0aCBTZXB0ZW1iZXIgMjAwNiAtIDMuMyBNSUxFU1RPTkUgMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MTMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzEzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgPGNvZGU+aXNQb2x5bW9ycGhpYygpPC9jb2RlPiBnZXR0ZXIgdG8gPGNvZGU+TWV0aG9kUmVmZXJlbmNlTWF0Y2g8L2NvZGU+IChzZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM0MDEiPmJ1ZyA3MzQwMTwvYT4KK2FuZCA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY0OTEiPmJ1ZyAxNTY0OTE8L2E+KS4KKzxicj4KK1doZW4gYSBzZWFyY2ggcmVxdWVzdG9yICg8Y29kZT5TZWFyY2hSZXF1ZXN0b3I8L2NvZGU+KSBhY2NlcHRzIHRoaXMga2luZCBvZiBtYXRjaCwKK2l0IGtub3dzIGlmIGEgbWV0aG9kIHJlZmVyZW5jZSBtYXRjaCBpcyBhIHBvbHltb3JwaGljIG1ldGhvZCAoaS5lLiBpbXBsZW1lbnRlZCBpbiBhIHN1cGVyIG9yIHN1YiB0eXBlKSBvciBub3QuCis8cD4KK0ZvciBleGFtcGxlLCBpbiBleGFtcGxlIGJlbG93OjwvcD4KKzxwcmU+CitjbGFzcyBBIHsgcHVibGljIHZvaWQgZm9vKCkge30gfQorY2xhc3MgQiBleHRlbmRzIEEge30KK2NsYXNzIEMgZXh0ZW5kcyBCIHsgcHVibGljIHZvaWQgZm9vKCkge30gfQorY2xhc3MgRCBleHRlbmRzIEMge30KK3B1YmxpYyBjbGFzcyBYIHsKKwl2b2lkIGZvbygpIHsKKwkJbmV3IEIoKS5mb28oKTsKKwkJbmV3IEMoKS5mb28oKTsKKwkJbmV3IEQoKS5mb28oKTsKKwl9Cit9Cis8L3ByZT4KKzxwPgorU2VhcmNoaW5nIGZvciBhbGwgcmVmZXJlbmNlcyB0byA8Y29kZT5DLmZvbygpPC9jb2RlPiBtZXRob2QgZ2V0IDMgbWF0Y2hlcworKGluc3RhbmNlIG9mIDxjb2RlPk1ldGhvZFJlZmVyZW5jZU1hdGNoPC9jb2RlPikuIFR3byBvZiB0aGVtLCA8Y29kZT5uZXcgQigpLmZvbygpPC9jb2RlPiBhbmQKKzxjb2RlPm5ldyBEKCkuZm9vKCk8L2NvZGU+IGFyZSBmbGFnZ2VkIGFzIHBvbHltb3JwaGljIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXNlIGFyZSBtZXRob2RzCityZXNwZWN0aXZlbHkgb2YgYSBzdXBlcmNsYXNzIGFuZCBvZiBhIHN1YmNsYXNzLi4uCis8L3A+Cis8cD4KK1NlYXJjaCB2aWV3IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGZpbHRlciB0aGlzIGtpbmQgb2YgbWF0Y2hlcyB3aGVuIHVzZXIgd2FudHMgdG8gZm9jdXMgb25seQorb24gZXhhY3QgcmVmZXJlbmNlcyBvZiB0aGUgc2VhcmNoZWQgbWV0aG9kLjwvcD4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzM4OSI+MTU3Mzg5PC9hPgorWzEuNF1bY29tcGlsZXJdIGFzc2VydGlvblN0YXR1cyBpcyBub3Qgc2V0IHByb3Blcmx5IGZvciBuZXN0ZWQgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTczMzMiPjE1NzMzMzwvYT4KK2NhbGxpbmcgZGVsZXRlIG9uIGVudW0gY29uc3RhbnQgZGVsZXRlcyBlbnRpcmUgRW51bQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQwMyI+MTU3NDAzPC9hPgorTlBFIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgYXN0IGZvciBhIGNsYXNzIHdpdGggYm9nZ3VzIGFubm90YXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NDkxIj4xNTY0OTE8L2E+Citbc2VhcmNoXSBSZWZlcmVuY2Ugc2VhcmNoIHVudXNhYmxlIGluIHNvbWUgc2l0dWF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNDAxIj43MzQwMTwvYT4KK1tzZWFyY2hdIFVuYWJsZSB0byBzZWFyY2gganVzdCBmb3IgcmVmZXJlbmNlcyB0byBvdmVycmlkZGVuIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzI0NyI+MTU3MjQ3PC9hPgorWzEuNl0gW2NvbXBpbGVyXSBWZXJpZnlFcnJvciB3aXRoIFN0YWNrTWFwIGZyYW1lcyB3aGVuIG5vIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMgYXJlIGdlbmVyYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzA4NiI+MTU3MDg2PC9hPgorc2hvdWxkIGFkb3B0IElDVSBDb2xsYXRvciBhbmQgdXNlIG5ldyBBUElzIG9uIFN0cnVjdHVyZWRWaWV3ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk3NTEiPjE0OTc1MTwvYT4KK0VudW0tdmFsdWVkIGFubm90YXRpb24gZWxlbWVudCBoYW5kbGVzIG5vbi1lbnVtIGNvbnN0YW50IGJhZGx5CisKKzxhIG5hbWU9InZfNzEyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNMiAtIDEydGggU2VwdGVtYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzEyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkNvZGUgQXNzaXN0OiBBbm5vdGF0aW9uIHR5cGVzIGFyZSBwcm9wb3NlZCBldmVuIHRoZXJlIGlzIG5vIHByZWZpeC4KKzxwcmU+CisgICBwdWJsaWMgQGludGVyZmFjZSBNeUFubm90IHsKKyAgICAgIGludCBmb28oKTsKKyAgIH0KKyAgIEB8CisgICBwdWJsaWMgY2xhc3MgQUNsYXNzIHt9Cis8L3ByZT4KKydNeUFubm90JyBpcyBwcm9wb3NlZCBpZiB5b3UgZG8gY29kZSBhc3Npc3QgYXQgJ3wnIGxvY2F0aW9uLgorPC9saT4KKzxsaT4KK0FkZGVkIG5ldyBmbGFnIG9uIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50IHRvIHNwZWNpZnkgYm90aCBpbnRlcmZhY2VzIGFuZCBhbm5vdGF0aW9ucyAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjE3NyI+YnVnIDE1NjE3NzwvYT4pLgorVGhpcyBmbGFnIGlzIGRlZmluZWQgb24gSUphdmFTZWFyY2hDb25zdGFudHMgaW50ZXJmYWNlOgorPHByZT4KKwkvKioKKwkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhbiBpbnRlcmZhY2Ugb3IgYW5ub3RhdGlvbiB0eXBlLgorCSAqIE1vcmUgc2VsZWN0aXZlIHRoYW4gdXNpbmcge0BsaW5rICNUWVBFfS4KKwkgKiBAc2luY2UgMy4zCisJICovCisJaW50IElOVEVSRkFDRV9BTkRfQU5OT1RBVElPTj0gMTE7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODg1OSI+MTQ4ODU5PC9hPgorW21vZGVsXVtkZWx0YV0gUGFja2FnZSBFeHBsb3JlciBvbmx5IHNob3dzIGRlZmF1bHQgcGFja2FnZSBhZnRlciBpbXBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY1OTEiPjE1NjU5MTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBjb25zdGFudC1zcGVjaWZpYyBtZXRob2RzIGluIGVudW0gY2Fubm90IGJlIGFic3RyYWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NTQwIj4xNTY1NDA8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgcHJvZHVjZXMgaW52YWxpZCBieXRlY29kZSBmb3IgY2VydGFpbiBlbnVtIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjE3NyI+MTU2MTc3PC9hPgorW3NlYXJjaF0gaW50ZXJmYWNlcyBhbmQgYW5ub3RhdGlvbnMgY291bGQgYmUgZm91bmQgd2l0aCBvbmx5IG9uZSByZXF1ZXRzIG9mIHNlYXJjaEFsbFR5cGVOYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MzQwIj4xNTYzNDA8L2E+Citbc2VhcmNoXSBzZWFyY2hBbGxUeXBlTmFtZXMgcmV0dXJuIG5vdGhpbmcgZm9yIGVtcHR5IHByZWZpeAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTE4OSI+MTUxMTg5PC9hPgorW3NlYXJjaF0gRGVjbGFyYXRpb24gc2VhcmNoIGRvZXMgbm90IGZpbmQgYWxsIG1hdGNoZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTM4NzQiPjE1Mzg3NDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciBmYWlscyB0byBjb25zaWRlciBicmlkZ2UgbWV0aG9kIHdpdGggLXNvdXJjZSAxLjQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk5ODMiPjEyOTk4MzwvYT4KK1sxLjVdW2Fzc2lzdF0gTmVlZCBwYXJ0aWFsIHdvcmQgZm9yIGFubm90YXRpb24gYXV0b2NvbXBsZXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYxOTQiPjE1NjE5NDwvYT4KK1tjb2RlYXNzaXN0XSBQUk9QT1NFX01FTUJFUl9UWVBFUyBjYW4gYmUgcmVtb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTExNSI+MTU1MTE1PC9hPgorVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmdzIHN1cmZhY2luZyB0aHJvdWdoIERPTSBBU1QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMjgiPjE1MzEyODwvYT4KK1tjb21waWxlcl0gRHVwbGljYXRlIG1ldGhvZHMgZ2VuZXJhdGVkIChmcm9tIGludmFsaWQgc291cmNlLCBidXQgc3RpbGwgOi0pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MTE5Ij4xNTYxMTk8L2E+CitObyB3YXJuaW5nIGZvciB1bm5lY2Vzc2FyeSBzZW1pY29sb24gaW4gaW50ZXJmYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MjU1Ij4xNTUyNTU8L2E+CitbMS41XVtjb21waWxlcl0gdGVybmFyeSBjb25kaXRpb25hbCBvcGVyYXRvciByZXR1cm5zIHdyb25nIHR5cGUKKworCis8YSBuYW1lPSJ2XzcxMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTIgLSA1dGggU2VwdGVtYmVyIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzExCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIHRvIHRoZSBiYXRjaCBjb21waWxlciB0aGUgYWJpbGl0eSB0byByZWRlZmluZSB0aGUgZGVzdGluYXRpb24gcGF0aAorICAgIG9uIGEgc291cmNlIGZvbGRlciBiYXNpcy4gRGlyZWN0b3JpZXMgY2l0ZWQgYXMgc291cmNlcywgZGlyZWN0bHkgb3IgYXMKKyAgICBhcmd1bWVudHMgdG8gdGhlIDxjb2RlPi1jbGFzc3BhdGg8L2NvZGU+IGFuZCBvdGhlciBjbGFzc3BhdGggcmVsYXRlZAorICAgIG9wdGlvbnMsIGNhbiBiZWFyIGEgPGNvZGU+Wy1kIGRpcl08L2NvZGU+IHNwZWNpZmljYXRpb24gdGhhdCBkaXJlY3RzIHRoZQorICAgIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyB0byA8Y29kZT5kaXI8L2NvZGU+IGZvciBzb3VyY2UgZmlsZXMgZmV0Y2hlZCBmcm9tIHRoZQorICAgIHNhaWQgZGlyZWN0b3JpZXMuCisgICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBzb3VyY2UgZmlsZXMgPGNvZGU+c3JjL1guamF2YTwvY29kZT4gYW5kCisgICAgPGNvZGU+WS5qYXZhPC9jb2RlPiwgWCBkZXBlbmRpbmcgZnJvbSBZLCB0aGUgY29tbWFuZCA8Y29kZT5lY2ogc3JjWy1kIGJpbjFdCisgICAgLWQgYmluMjwvY29kZT4gd2lsbCBwcm9kdWNlIHRoZSBmaWxlcyA8Y29kZT5iaW4xL1guY2xhc3M8L2NvZGU+IGFuZAorICAgIDxjb2RlPmJpbjIvWS5jbGFzczwvY29kZT4sIHdoaWxlIHRoZSBjb21tYW5kIDxjb2RlPmVjaiBzcmNbLWQgYmluXSAtZAorICAgIG5vbmU8L2NvZGU+IHdpbGwgb25seSBwcm9kdWNlIHRoZSBmaWxlIDxjb2RlPmJpbi9YLmNsYXNzPC9jb2RlPi4KKzwvbGk+Cis8bGk+Q29kZSBBc3Npc3Q6IEFubm90YXRpb24gYXJndW1lbnRzIG5hbWVzIGFyZSBwcm9wb3NlZCBldmVuIHRoZXJlIGlzIG5vIHByZWZpeC4KKzxwcmU+CisgICBwdWJsaWMgQGludGVyZmFjZSBNeUFubm90IHsKKyAgICAgIGludCBmb28oKTsKKyAgIH0KKyAgIEBNeUFubm90KHwKKyAgIHB1YmxpYyBjbGFzcyBBQ2xhc3Mge30KKzwvcHJlPgorJ2ZvbycgaXMgcHJvcG9zZWQgaWYgeW91IGRvIGNvZGUgYXNzaXN0IGF0ICd8JyBsb2NhdGlvbi4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODUyMSI+MTQ4NTIxPC9hPgorWzUuMF1bY29udGVudCBhc3Npc3RdIENvbnRlbnQgYXNzaXN0IHNob3cgYWxsIG1lbWJlcnMgb2YgYSBmdWxsIGFubm90YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYxMDgiPjE1NjEwODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBBdXRvYm94aW5nIGRvZXNudCB3b3JrdCBpbiBzd2l0Y2gtc3RhdGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMTIzIj4xNDAxMjM8L2E+CitNaXNzaW5nIGNhbGxiYWNrIGluIENvZGVTbmlwcGV0VG9DdU1hcHBlciNnZXRDb21wbGV0aW9uUmVxdWVzdG9yKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMzAiPjE1MzEzMDwvYT4KK1thc3Npc3RdIElPQiBkdXJpbmcgY29udGVudCBhc3Npc3QgaW4gc2NyYXBib29rCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MTcwIj4xNTQxNzA8L2E+CitQcmludGluZyB3YXJuaW5ncyBicmVha3MgaW4tZWRpdG9yIHF1aWNrIGZpeGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NTU0Ij4xNDY1NTQ8L2E+CitbYmF0Y2hdW2NvbXBpbGVyXVtvcHRpb25zXSBBbGxvdyB0aGUgYmF0Y2ggY29tcGlsZXIgdG8gb3V0cHV0IGNvbXBpbGVkIGZpbGVzCitpbnRvIG11bHRpcGxlIG91dHB1dCBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1ODg3Ij4xNTU4ODc8L2E+CitCcmVha3BvaW50IGluICdmaW5hbGx5JyBub3QgaGl0IC0gdGVzdCBzdWl0ZSBmYWlsaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1Nzk1Ij4xNTU3OTU8L2E+CitQYXRjaCB0byBmaXggamZhY2UudGV4dC5Bc3NlcnQgZGVwcmVjYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ4ODAiPjE1NDg4MDwvYT4KK0RlbHRhUHJvY2Vzc29yIGRvZXMgbm90IHNldCBwcm9qZWN0IHJlZmVyZW5jZXMgaWYgZmlyc3QgYnVpbGQgaXMgYSBwcm9qZWN0IGJ1aWxkCisKKzxhIG5hbWU9InZfNzEwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNMiAtIDI5dGggQXVndXN0IDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzEwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcxMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTQyMyI+MTU1NDIzPC9hPgorW2NvbXBpbGVyXSBVbm9wdGltYWwgY29kZSBnZW5lcmF0aW9uIHdoZW4gYW4gaW5pdGlhbGl6ZXIgY29udGFpbnMgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTUzIj4xNTExNTM8L2E+CitbMS42XVtjb21waWxlcl0gSW52YWxpZCBTdGFja21hcCBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciB0ZXJuYXJ5IG9wZXJhdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1Mzk3Ij4xNDUzOTc8L2E+CitbMS42XVtjb21waWxlcl0gSW52YWxpZCBTdGFja01hcCBhdHRyaWJ1dGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgyMjQiPjE0ODIyNDwvYT4KK0FTVCBBUEkgcmVxdWVzdDogaGF2ZSBiaW5kaW5nIGZvciBpbnQsIG5lZWQgaW50W10sIGludFtdW10gLi4uLgorCis8YSBuYW1lPSJ2XzcwOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTIgLSAxNXRoIEF1Z3VzdCAyMDA2Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzcwOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl83MDkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE3NTYiPjE1MTc1NjwvYT4KK1tjb21waWxlcl0gdW52ZXJpZmlhYmxlIGJ5dGVjb2RlIGNyZWF0ZWQgd2l0aCBjdnMgaGVhZCBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzMwMyI+MTUzMzAzPC9hPgorSUJpbmRpbmcuZ2V0QW5ub3RhdGlvbnMoKSByZXR1cm5zIGFycmF5IHdpdGggbnVsbCBlbGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NjYxIj4xNDg2NjE8L2E+CitbZm9ybWF0dGVyXSBsZXZlcmFnZSBDb21iaW5lZEJpbmFyeUV4cHJlc3Npb24gaW4gQmluYXJ5RXhwcmVzc2lvbkZyYWdtZW50QnVpbGRlciN2aXNpdChCaW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlKQorCis8YSBuYW1lPSJ2XzcwOCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTEgLSA2dGggQXVndXN0IDIwMDYgLSAzLjMgTUlMRVNUT05FIDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzA4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBmaXggZm9yIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1MTUyIj5idWcgOTUxNTI8L2E+IHJlcXVpcmVkIHRoZSBpbmRleCB2ZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkLgorICAgICBJbmRleGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZCB1cG9uIHN1YnNlcXVlbnQgc2VhcmNoIHF1ZXJpZXMgKGFjY291bnRpbmcgZm9yIGluZGV4aW5nIG5vdGlmaWNhdGlvbiBpbiBzZWFyY2ggcHJvZ3Jlc3MgZGlhbG9ncykuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTE1MiI+OTUxNTI8L2E+Citbc2VhcmNoXSBGMyBjYW4ndCBmaW5kIHN5bnRoZXRpYyBjb25zdHJ1Y3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MjcyNSI+MTUyNzI1PC9hPgorWzEuNl1bZm9ybWF0dGVyXSBDb2RlIGZvcm1hdHRlciBkb2VzIG5vdCBmb3JtYXQgMS41IGNvZGUgd2hlbiBzb3VyY2UgbGV2ZWwgaXMgMS42CisKKzxhIG5hbWU9InZfNzA3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjNNMSAtIDNyZCBBdWd1c3QgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzA3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitTZWFyY2hQYXR0ZXJuIEFQSSBtZXRob2QgPGNvZGU+Y3JlYXRlUGF0dGVybihJSmF2YUVsZW1lbnQsIGludCwgaW50KTwvY29kZT4gYmVoYXZpb3IgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIGdlbmVyaWMgc2VhcmNoZXMuPGJyPgorSXQgbm93IHJldHVybnMgZXJhc3VyZSBtYXRjaGVzIGluc3RlYWQgb2YgZXhhY3Qgb25lcyAgKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDg5Ij4xMjQ0ODk8L2E+IGZvciBkZXRhaWxlZCBkaXNjdXNzaW9uIG9uIHRoaXMgdG9waWMpLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDU5Ij4xMTY0NTk8L2E+CitbMS41XVtzZWFyY2hdIEdlbmVyaWMgdHlwZSByZWZlcmVuY2Ugc2hvdWxkIHJldHVybiBleGFjdCBtYXRjaCBvbiBwYXJhbWV0ZXJpemVkIHR5cGUgd2l0aCBpdHMgb3duIHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4OSI+MTI0NDg5PC9hPgorWzEuNV1bc2VhcmNoXSAmcXVvdDtGaW5kIHVudXNlZCBkZXBlbmRlbmNpZXMmcXVvdDsgbWlzc2VzIHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyB0eXBlcworCis8YSBuYW1lPSJ2XzcwNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTEgLSAxc3QgQXVndXN0IDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzA2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzAyNCI+MTMzMDI0PC9hPgorW2FzdCByZXdyaXRlXSBBU1RSZXdyaXRlIGRvZXMgbm90IGhvbm9yIGZvcmNlZCBsaW5lIHNwbGl0cworCis8YSBuYW1lPSJ2XzcwNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTEgLSAyNXRoIEp1bHkgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzA1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTE4Ij4xNTExMTg8L2E+Cit2ZXJpZmllciBlcnJvcnMgb2NjdXIgd2hlbiBydW5uaW5nIG9zZ2kgdGVzdHMKKworPGEgbmFtZT0idl83MDQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00xIC0gMTh0aCBKdWx5IDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzA0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwNCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPldpbGRjYXJkIGNhcHR1cmVzIGFyZSBub3cgaW5kaWNhdGluZyBzb21lIElEIHRvIGJldHRlciBhZGRyZXNzIGFtYmlndWl0aWVzIGluIGVycm9yIG1lc3NhZ2VzCis8YnI+ZS5nLiBub3cgdGVsbGluZzogPGNvZGU+Y2FwdHVyZSMyLW9mID8gZXh0ZW5kcyBOdW1iZXI8L2NvZGU+IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggPGNvZGU+Y2FwdHVyZSMxLW9mID8gZXh0ZW5kcyBOdW1iZXI8L2NvZGU+Cis8YnI+YXMgb3Bwb3NlZCB0bzogPGNvZGU+Y2FwdHVyZS1vZiA/IGV4dGVuZHMgTnVtYmVyPC9jb2RlPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIDxjb2RlPmNhcHR1cmUtb2YgPyBleHRlbmRzIE51bWJlcjwvY29kZT4KKyhhbHNvIHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTczIj4xNDk1NzM8L2E+KS48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkzMTciPjEyOTMxNzwvYT4KK091dGxpbmUgdmlldyBpbmNvbnNpc3RlbnQgd2l0aCBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyODc1Ij4xMDI4NzU8L2E+Citjb2RlIGFzc2lzdCBzaG91bGQgcHJvcG9zZSB0eXBlcyBldmVuIGlmIHRoZXJlJ3Mgbm8gaW5pdGlhbCBjaGFyYWN0ZXIocykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk1ODQiPjEyOTU4NDwvYT4KK0phdmEgbW9kZWwgZ2l2ZXMgZGlmZmVyZW50IHJlc3VsdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA3NTgiPjE1MDc1ODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBpbnRlcm5hbCBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDA3NCI+MTUwMDc0PC9hPgorW2NvbXBpbGVyXSBpbml0IHBhcnQgb2YgZm9yIGVhY2ggbG9vcCB3aXRoIGVtcHR5IGJvZHkgaXMgbm90IGV4ZWN1dGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDI4Ij4xNDkwMjg8L2E+CitMaW1pdGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIHdpdGggdGhlIGZpbGUgc2l6ZSBpcyBpbnZhbGlkLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTg5MyI+MTQ5ODkzPC9hPgorWzEuNV0gQ29tcGlsYXRpb24gZXJyb3I6IFRoZSBtZXRob2QgaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTM3NiI+MTQ5Mzc2PC9hPgorSW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igb24gImltcG9ydCBzdGF0aWMiCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NTczIj4xNDk1NzM8L2E+CitbMS41XVtjb21waWxlcl0gSW1wcm92ZSByZWFkYWJsZSBuYW1lIG9mIHdpbGRjYXJkIGNhcHR1cmVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4MDczIj4xMjgwNzM8L2E+CitDb250ZW50IEFzc2lzdCBzaG91bGQgZ2l2ZSBzdGF0aWMgZmllbGRzIGFuZCBtZXRob2RzIGRlY2xhcmVkIGluIHRhcmdldCB0eXBlIGhpZ2hlciByZWxldmFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkwNDMiPjE0OTA0MzwvYT4KK1VucmVzb2x2YWJsZSBjbGFzc3BhdGggY29udGFpbmVyIGxlYWRzIHRvIGxvdHMgb2Ygc2NoZWR1bGVkIGpvYnMKKworPGEgbmFtZT0idl83MDMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00xIC0gNHRoIEp1bHkgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzAzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDEzIj4xNDkwMTM8L2E+CitbamF2YWRvY10gSW4gbGF0ZXN0IDMuMyBidWlsZCwgdGhlcmUgaXMgYSBqYXZhZG9jIGVycm9yIGluIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5ODU3Ij4xMTk4NTc8L2E+CitbamF2YWRvY10gU29tZSBpbm5lciBjbGFzcyByZWZlcmVuY2VzIHNob3VsZCBiZSBmbGFnZ2VkIGFzIHVucmVzb2x2ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMzMDQiPjEwMzMwNDwvYT4KK1tKYXZhZG9jXSBXcm9uZyByZWZlcmVuY2UgcHJvcG9zYWwgZm9yIGlubmVyIGNsYXNzZXMuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4Nzk3Ij4xNDg3OTc8L2E+CitTeW50YXggZXJyb3IgaW4gamF2YSBjbGFzcyByZXN1bHRzIGluIEFTVD1udWxsLWVycm9yIG9uICJvcmdhbml6ZSBpbXBvcnRzIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODc0MiI+MTQ4NzQyPC9hPgorWzUuMF1bY29udGVudCBhc3Npc3RdIEFubm90YXRpb24gY29udGVudCBhc3Npc3Qgbm90IHdvcmtpbmcgaW4gYWxsIGNhc2VzIGZvciBwYXJhbWV0ZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzAyIj4xMTczMDI8L2E+CitDbGVhbiBidWlsZCBvZiBsYXJnZSBwcm9qZWN0IGdpdmVzIHVucmVzb2x2ZWQgdHlwZSBlcnJvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc4NzUiPjE0Nzg3NTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBOUEUgd2hlbiBpbml0aWFsaXppbmcgYW5ub3RhdGlvbnMgb2YgYSBiaW5hcnkgZmllbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYwMTIiPjE0NjAxMjwvYT4KK05vIEZfQ09OVEVOVCBmbGFnIG9uIGRlbHRhIHdoZW4gcmV2ZXJ0aW5nIHRvIG9sZCBhbm5vdGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODk3MCI+MTQ4OTcwPC9hPgorRXhjZXB0aW9ucyBvcGVuaW5nIGV4dGVybmFsIEphdmEgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODk0OSI+MTQ4OTQ5PC9hPgorSmFyRW50cnlGaWxlIG5vdyByZXR1cm5pbmcgJ251bGwnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwODY1Ij4xMjA4NjU8L2E+CitJQ29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSguLikgc2hvdWxkIG5vdCB0aHJvdyBpbnRlcm5hbCBBRkUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzNzAiPjE0ODM3MDwvYT4KK1tmb3JtYXR0ZXJdIG5ldyBDbGFzcyZsdDs/Jmd0O1tdIHt9IGtpbGxzIGZvcm1hdHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODAxMCI+MTQ4MDEwPC9hPgorQ29kZSBzZWxlY3QgZG9lc24ndCBmaW5kIGJpbmFyeSBwYXJhbWV0ZXJpemVkIG1ldGhvZAorCis8YSBuYW1lPSJ2XzcwMiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTEgLSAyN3RoIEp1bmUgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzAyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkIG5ldyBTZWFyY2ggQVBJIG1ldGhvZCB0byBzdXBwb3J0IHBhdHRlcm5zIGZvciBwYWNrYWdlL2VuY2xvc2luZyB0eXBlIG5hbWUgd2hpbGUgc2VhcmNoaW5nIGFsbCB0eXBlcyBuYW1lcworKHNlZSBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIyNjQiPjkyMjY0PC9hPikuPGJyPgorPHByZT4KKy8qKgorICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCisgKiBUaGUgc2VhcmNoIGNhbiBiZSBzZWxlY3Rpbmcgc3BlY2lmaWMgdHlwZXMgKGdpdmVuIGEgcGFja2FnZSBuYW1lIHVzaW5nIHNwZWNpZmljIG1hdGNoIG1vZGUKKyAqIGFuZC9vciBhIHR5cGUgbmFtZSB1c2luZyBhbm90aGVyIHNwZWNpZmljIG1hdGNoIG1vZGUpLgorICoKKyAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBwYWNrYWdlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcywgb3IgYSBwcmVmaXggZm9yIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyBwYWNrYWdlLgorICogQHBhcmFtIHR5cGVOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWFyY2hlZCB0eXBlICh0aGUgcXVhbGlmaWNhdGlvbiBpbmNsdWRlCisgKiAgICAgICAgICAgICAgICAgdGhlIGVuY2xvc2luZyB0eXBlcyBpZiB0aGUgc2VhcmNoZWQgdHlwZSBpcyBhIG1lbWJlciB0eXBlKSwgb3IgYSBwcmVmaXgKKyAqICAgICAgICAgICAgICAgICBmb3IgdGhpcyB0eXBlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyB0eXBlLgorICogQHBhcmFtIHBhY2thZ2VNYXRjaFJ1bGUgb25lIG9mCisgKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzCisgKiAgICAgICAgICAgIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KKyAqICAgICAgICAuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcworICogICAgICAgICAgICBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCisgKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuCisgKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9NQVRDSH0gaWYgdHlwZSBuYW1lIGFyZSBjYW1lbCBjYXNlIG9mIHRoZSBuYW1lcyBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCisgKiAgICBjb21iaW5lZCB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9LAorICogICAgICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsCisgKiAgICAgICBvciB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZC4KKyAqIEBwYXJhbSB0eXBlTWF0Y2hSdWxlIG9uZSBvZgorICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSB0aGUgZnVsbCBuYW1lcworICogICAgICAgICAgICBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCisgKiAgICAgICAgLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSBwcmVmaXhlcyBvZiB0aGUgbmFtZXMKKyAqICAgICAgICAgICAgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLgorICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgY29udGFpbiB3aWxkLWNhcmRzLgorICogICAgICAgIC4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHR5cGUgbmFtZSBhcmUgY2FtZWwgY2FzZSBvZiB0aGUgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLgorICogICAgIGNvbWJpbmVkIHdpdGgge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0sCisgKiAgICAgICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwKKyAqICAgICAgIG9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgorICogQHBhcmFtIHNlYXJjaEZvciBkZXRlcm1pbmVzIHRoZSBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnRzCisgKiAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1N9OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMKKyAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGludGVyZmFjZXMKKyAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNFTlVNfTogb25seSBsb29rIGZvciBlbnVtZXJhdGlvbgorICogICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FOTk9UQVRJT05fVFlQRX06IG9ubHkgbG9vayBmb3IgYW5ub3RhdGlvbiB0eXBlCisgKiAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0VOVU19OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGVudW1lcmF0aW9ucworICogICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NMQVNTX0FORF9JTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKKyAqICAgICAuIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpLmUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpCisgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHRvIHNlYXJjaCBpbgorICogQHBhcmFtIG5hbWVSZXF1ZXN0b3IgdGhlIHJlcXVlc3RvciB0aGF0IGNvbGxlY3RzIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2gKKyAqIEBwYXJhbSB3YWl0aW5nUG9saWN5IG9uZSBvZgorICogICAgICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0ZPUkNFX0lNTUVESUFURV9TRUFSQ0h9IGlmIHRoZSBzZWFyY2ggc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5CisgKiAgICAgICAgLiB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0h9IGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhbmNlbGxlZCBpZiB0aGUKKyAqICAgICAgICAgICAgdW5kZXJseWluZyBpbmRleGVyIGhhcyBub3QgZmluaXNoZWQgaW5kZXhpbmcgdGhlIHdvcmtzcGFjZQorICogICAgICAgIC4ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1dBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNIfSBpZiB0aGUgc2VhcmNoIHNob3VsZCB3YWl0IGZvciB0aGUKKyAqICAgICAgICAgICAgdW5kZXJseWluZyBpbmRleGVyIHRvIGZpbmlzaCBpbmRleGluZyB0aGUgd29ya3NwYWNlCisgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0bywgb3IgbnVsbCBpZiBubyBwcm9ncmVzcworICogICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIGlzIHByb3ZpZGVkCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgorICogICAgICAgIC4gdGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAorCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKKwlmaW5hbCBpbnQgcGFja2FnZU1hdGNoUnVsZSwKKwlmaW5hbCBjaGFyW10gdHlwZU5hbWUsCisJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsCisJaW50IHNlYXJjaEZvciwKKwlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAorCWZpbmFsIFR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IsCisJaW50IHdhaXRpbmdQb2xpY3ksCisJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCis8L3ByZT4KK05vdGUgdGhhdCBhbHJlYWR5IGV4aXN0aW5nIDxjb2RlPnNlYXJjaEFsbFR5cGVOYW1lcyhjaGFyIFtdLCBjaGFyW10sIGludCwgaW50LCBJSmF2YVNlYXJjaFNjb3BlLCBUeXBlTmFtZVJlcXVlc3RvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4gQVBJIG1ldGhvZCBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdGVkIHRoZSBmYWN0Cit0aGF0IHBhY2thZ2UgbmFtZSBpcyBhbiBleGFjdCBuYW1lIGFuZCBkb2VzIG5vdCBhY2NlcHQgd2lsZGNhcmRzLgorPC9saT4KKzxsaT5JbmNyZW1lbnRlZCBwbHVnLWluIHZlcnNpb24gSUQgdG8gJnF1b3Q7My4zLjAmcXVvdDsgZHVlIHRvIG5ld2x5IGFkZGVkIEFQSSBtZXRob2QgKHNlZSBkZXRhaWxzIGFib3ZlKS48L2xpPgorPGxpPkh1Z2UgU3RyaW5nIGNvbmNhdGVuYXRpb25zIC0gdGhvdXNhbmRzIG9mIHRlcm1zIGFuZCBiZXlvbmQgLSBhcmUgbm93CisgICAgaGFuZGxlZCBzbW9vdGhseSBieSB0aGUgY29tcGlsZXIgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBzb2xlbHkgY29tcHJpc2VkIG9mCisgICAgbGl0ZXJhbHMgYW5kIG90aGVyIGNvbnN0YW50cyAoY2YuIGJ1ZworICAgIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjcyOCI+MTAyNzI4PC9hPikuCisgICAgPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4Mjc4Ij4xNDgyNzg8L2E+CitEZWZhdWx0LXBhY2thZ2UgY2xhc3NlcyBtaXNzaW5nIGluIFBhY2thZ2UgRXhwbG9yZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzNTIiPjE0ODM1MjwvYT4KK05MUyB3YXJuaW5nIHNob3dzIHVwIG9uIGluY29tcGxldGUgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjcyOCI+MTAyNzI4PC9hPgorW2NvbXBpbGVyXSBSZWR1Y2UgdGhlIHN0YWNrIGRlcHRoIGRlbWFuZHMgb2YgZXh0ZW5kZWQgc3RyaW5nIGNvbmNhdGVuYXRpb24gQVNUcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjUzMCI+MTQyNTMwPC9hPgorW2hpZXJhcmNoaWNhbCBwYWNrYWdlc10gJy4nIGluIGZvbGRlciBuYW1lcyBjb25mdXNlcyBwYWNrYWdlIGV4cGxvcmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NTIzIj4xNDg1MjM8L2E+CitbYmF0Y2hdIEJhdGNoIGNvbXBpbGVyIG91dHB1dCBjb250YWlucyBleHRyYSBsaW5lYnJlYWsgYmVmb3JlIGxpbmUgcG9zaXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc0ODUiPjE0NzQ4NTwvYT4KK0Fub255bW91cyB0eXBlIG1pc3NpbmcgZnJvbSBqYXZhIG1vZGVsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDg2Ij4xMTEwODY8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgYWNjZXB0cyBjYWxsIHRvIHBhcmFtZXRlcml6ZWQgbWV0aG9kIHdpdGggaW52YWxpZCBhcmd1bWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgyMTUiPjE0ODIxNTwvYT4KK1tzZWFyY2hdIEV4Y2VwdGlvbiB3aGlsZSBzZWFyY2hpbmcgZm9yIGRlY2xhcmF0aW9ucyBvZiByZWZlcmVuY2VkIHR5cGVzIGluIGJpbmFyeSBqYXZhIGVsZW1lbnRzIHBhY2thZ2VkIGluIGEgamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2MzMxIj4xNDYzMzE8L2E+CitKYXZhIEVkaXRvciB3b24ndCBzYXZlIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUzNjciPjE0NTM2NzwvYT4KK0ZhaWxpbmcgdG8gb3BlbiBhIGJpbmFyeSBtZW1iZXIgbGVhdmVzIGNhY2hlIGluY29uc2lzdGVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MjM3Ij45NjIzNzwvYT4KK1tqYXZhZG9jXSBJbm5lciB0eXBlcyBtdXN0IGJlIHF1YWxpZmllZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyMjY0Ij45MjI2NDwvYT4KK1tzZWFyY2hdIGFsbCB0eXBlcyBuYW1lcyBzaG91bGQgc3VwcG9ydCBwYXR0ZXJucyBmb3IgcGFja2FnZS9lbmNsb3NpbmcgdHlwZSBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNzIwIj4xMDI3MjA8L2E+CitvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmUgc3BlYyBpbmNvbXBsZXRlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MDE1Ij4xNDgwMTU8L2E+CitOUEUgaW4gbG9nIGZyb20gQ2xhc3NwYXRoQ2hhbmdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMjEyIj4xNDMyMTI8L2E+CitJQUUgaW4gbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NTQ0Ij4xNDU1NDQ8L2E+CitDb21tZW50IGluZGVudGF0aW9uIHdyb25nIHdoZW4gdXNpbmcgc3VuIGNvbnZlbnRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2MjE0Ij4xNDYyMTQ8L2E+CitSZWZhY3RvciBYbWxXcml0dGVyIGFuZCBNYWluLkxvZ2dlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Nzg3NyI+MTQ3ODc3PC9hPgorc291cmNlIGVuZCBvZiBhcnJheSBhY2Nlc3MgaXNuJ3QgY29ycmVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTAwNyI+MTQ1MDA3PC9hPgorWzEuNV1bamF2YWRvY10gR2VuZXJpY3MgKyBJbm5lciBDbGFzcyAtJmd0OyBKYXZhZG9jICZxdW90O21pc3NpbmcgQHRocm93cyZxdW90OyB3YXJuaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NjkwIj4xNDc2OTA8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb21wYXRpYmxlIHNlcmlhbHZlcnNpb251aWQgd2hlbiB1c2luZyBjb3ZhcmlhbnQgaW4gSmF2YSAxLjUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc3NDciPjE0Nzc0NzwvYT4KK21heCBzdGFjayBmb3IgY2xpbml0IG9mIGVudW0gb3ZlcmVzdGltYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjA1OSI+MTQyMDU5PC9hPgorW2Vmc10gcmVuYW1pbmcgcGFja2FnZSBmYWlscyB0byB1cGRhdGUgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzAxMyI+MTQzMDEzPC9hPgorU1dURXhjZXB0aW9uOiBGYWlsZWQgdG8gZXhlY3V0ZSBydW5uYWJsZSAoLi4uQWJvcnRDb21waWxhdGlvbikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDcwMjQiPjE0NzAyNDwvYT4KK1tjb21waWxlcl0gQ29tcGlsZXIgYnVnIHdoZW4gYWNjZXNzaW5nIHN0YXRpYyBmaW5hbCBhdHRyaWJ1dGUgaW4gYSBub24tc3RhdGljIHdheQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzY4NCI+MTQzNjg0PC9hPgorQ3JlYXRpbmcgb2Ygc3RhdGljIGltcG9ydHMgaXMgdW5hdmFpbGFibGUuLgorCis8YSBuYW1lPSJ2XzcwMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4zTTEgLSAyMHRoIEp1bmUgMjAwNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl83MDEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfNzAxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Rml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA2NjciPmJ1ZyAxMjA2Njc8L2E+IHJlcXVpcmVkIHRoZSBpbmRleCB2ZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkLgorICAgICBJbmRleGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZCB1cG9uIHN1YnNlcXVlbnQgc2VhcmNoIHF1ZXJpZXMgKGFjY291bnRpbmcgZm9yIGluZGV4aW5nIG5vdGlmaWNhdGlvbiBpbiBzZWFyY2ggcHJvZ3Jlc3MgZGlhbG9ncykuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc3MzYiPjE0NzczNjwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBUeXBlSGllcmFyY2h5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3MDkiPjkxNzA5PC9hPgorWzEuNV1bbW9kZWxdIFF1aWNrIEZpeCBFcnJvciBidXQgbm8gUHJvYmxlbSBSZXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzM4MSI+MTQ3MzgxPC9hPgorWzEuNV1bY29tcGlsZXJdIEdlbmVyaWNzIGRpc2NyZXBhbmN5IGJldHdlZW4gRWNsaXBzZSBjb21waWxlciBhbmQgU3VuIGNvbXBpbGVyLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU1NSI+MTM5NTU1PC9hPgorW2hpZXJhcmNoeV0gT3BlbmluZyBhIGNsYXNzIGZyb20gVHlwZSBoaWVyYXJjaHkgd2lsbCBnaXZlIHRoZSB3cm9uZyBvbmUgaWYgc291cmNlIGFuZCBjb21waWxlZCBhcmUgaW4gZGVmaW5lZCBpbiBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NTczIj4xNDQ1NzM8L2E+Citjb21waWxhdGlvblBhcnRpY2lwYW50IGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgaW5jb21wbGV0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTgzNSI+MTQ1ODM1PC9hPgorZ2V0SmF2YUNsYXNzTGlicyBuZWVkcyB0byBhY2NvdW50IGZvciBJQk0gSjJTRSAxLjUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUzMzMiPjE0NTMzMzwvYT4KK1toaWVyYXJjaHldIFJlc29sdmluZyB0b28gbXVjaAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjQ0NCI+MTIyNDQ0PC9hPgorW2hpZXJhcmNoeV0gVHlwZSBoaWVyYXJjaHkgb2YgaW5uZXIgbWVtYmVyIHR5cGUgbWlzc2VzIGFub255bW91cyBzdWJ0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDg5NCI+MTE0ODk0PC9hPgorW2NvbXBpbGVyXSBDb21waWxlciBnZW5lcmF0ZSBkZWFkIGJ5dGVjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MDk2Ij4xNDcwOTY8L2E+CitlY2ouamFyIG1hbmlmZXN0IHNob3VsZCBub3QgdXNlIHgtZnJpZW5kcywgYnV0IHVzZSB4LWludGVybmFsPXRydWUgaW5zdGVhZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjAxNSI+MTQ2MDE1PC9hPgorU29tZSBKRFQvQ29yZSB0ZXN0cyByZXN1bHRzIGFyZSBzdGlsbCBWTSBkZXBlbmRlbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA2NjciPjEyMDY2NzwvYT4KK1toaWVyYXJjaHldIFR5cGUgaGllcmFyY2h5IGZvciBlbnVtIHR5cGUgZG9lcyBub3QgaW5jbHVkZSBhbm9ueW1vdXMgc3VidHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYzMjQiPjE0NjMyNDwvYT4KK0JhdGNoIGJ1aWxkcyBwcm9kdWNlICJUaGUgdHlwZSBYIGlzIGFscmVhZHkgZGVmaW5lZCIgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NjE1Ij4xNDY2MTU8L2E+CitbaGllcmFyY2h5XSBUeXBlSGllcmFyY2h5VGVzdHMgaXMgdGVzdHMgb3JkZXIgZGVwZW5kZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjA3Ij4xNDIyMDc8L2E+CitbYmF0Y2hdW29wdGlvbnNdIFNvdXJjZS90YXJnZXQgbGV2ZWwgbmFtZXMgNSBhbmQgNS4wIG1pc3NpbmcgZnJvbSBiYXRjaAorY29tcGlsZXIgaGVscCBtZXNzYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MzQiPjc2NzM0PC9hPgorW2NsYXNzcGF0aF0gQXR0ZW1wIHRvIGxvY2sgd29ya3NwYWNlIGR1cmluZyBjb250YWluZXIgaW5pdGlhbGl6YXRpb24KKworPGEgbmFtZT0idl83MDAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuM00xIC0gMTN0aCBKdW5lIDIwMDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfNzAwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzcwMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlByb2dyZXNzaXZlIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGJhdGNoIGNvbXBpbGVyLjxicj4KKwlUaGUgbmV3IDx0dD4taGVscDp3YXJuPC90dD4gb3B0aW9uIGRpc3BsYXlzIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMKKyAgICBwYXJhbWV0ZXJzIGFwcGxpY2FibGUgdG8gdGhlIDx0dD4td2FybjwvdHQ+IG9wdGlvbjsgdGhlc2UgZGV0YWlscyBhcmUgbm8KKyAgICBtb3JlIHBhcnQgb2YgdGhlIGdlbmVyYWwgaGVscCBtZXNzYWdlLCB3aGljaCBpcyB0aHVzIG1vcmUgY29tcGFjdAorICAgIChjZi4gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDI0OCI+MTQ0MjQ4PC9hPikuCisgICAgPC9saT4KKzxsaT5Db21waWxlciBpcyBub3cgYmV0dGVyIHJlc2lsaWVudCB0byBkdXBsaWNhdGUgbG9jYWwgdmFyaWFibGVzLCB0aHVzIGFsbG93aW5nIGZ1cnRoZXIKK29wZXJhdGlvbiB0byBzdGlsbCBiZSBjYXJyaWVkIG91dCBhY2N1cmF0ZWx5IChjb2Rlc2VsZWN0LCBjb21wbGV0aW9uLCBzZWFyY2gsIERPTSBBU1Qgb3BzKQorKGNmLiBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0ODU4Ij4xNDQ4NTg8L2E+KS48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYyMTUiPjE0NjIxNTwvYT4KK0pEVCBDb3JlIHRlc3RzIHNob3VsZCBub3QgYmUgZGVwZW5kZW50IG9uIEhhc2hNYXAgaW1wbGVtZW50YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ4NTgiPjE0NDg1ODwvYT4KK1tjb21waWxlcl0gU2hvdWxkIGJlIG1vcmUgcmVzaWxpZW50IHdpdGggZHVwbGljYXRlIGxvY2FscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTc0NiI+MTQ1NzQ2PC9hPgorWzEuNV1bY29tcGlsZXJdIEVudW0gc3ludGhldGljIG1ldGhvZHMgc2hvdWxkIGJlIGltcHJvdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzMyIj4xNDU3MzI8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb25zaXN0ZW50IGJlaGF2aW9yIGluIEVDSiBjb2RlIGZvciBlbnVtIHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NTE2Ij4xNDU1MTY8L2E+CitCYWQgcGVyZm9ybWFuY2Ugd2hlbiBjb21waWxpbmcgYSBqYXZhIGZpbGUgd2l0aCBub24gamF2YSBjb250ZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyODk3Ij4xNDI4OTc8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgY2Fubm90IHJlc29sdmUgdHlwZSBvZiBpbm5lciBjbGFzcyBvZiBhIGJvdW5kZWQgZ2VuZXJpYyB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0OTc2Ij4xNDQ5NzY8L2E+CitbaGllcmFyY2h5XSBOUEUgaW4gUmVmZXJlbmNlQmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTUwMCI+MTQ1NTAwPC9hPgorW2hpZXJhcmNoeV0gU3VwZXJjbGFzcyBjb3VsZCBiZSBtb3JlIHJlc2lsaWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDg2NiI+MTQ0ODY2PC9hPgorW2Fzc2lzdF1bamF2YWRvY10gV3JvbmcgY29tcGxldGlvbiBpbnNpZGUgQHZhbHVlIHRhZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDQxNCI+MTQ0NDE0PC9hPgorSkRUIENvbXBpbGVyIGZhaWxzIHdoaWxlIHN0YW5kYXJkIGphdmFjIGNvbXBpbGVyIGNhbiBwcm9jZWVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNzcyIj4xNDI3NzI8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsYXRpb24gc3VjY2VlZHMgd2l0aCBzdGF0aWMgaW1wb3J0cyB0aGF0IGZhaWwgd2l0aCBqYXZhYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzI1OSI+MTQzMjU5PC9hPgorWzEuNV1bY29tcGlsZXJdIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIFJlZmVyZW5jZUJpbmRpbmcuYmluYXJ5U2VhcmNoICwgRWNsaXBzZSAzLjJSQzQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ0MjYiPjE0NDQyNjwvYT4KK1tjb21waWxlcl0gQ29tcGlsZXIgaW5jb3JyZWN0bHkgcmVwb3J0cyAiYXNzaWdubWVudCB0byB2YXJpYWJsZSBoYXMgbm8gZWZmZWN0IiB3aGVuIGl0IGlzIGEgZHVwbGljYXRlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MjQ4Ij4xNDQyNDg8L2E+CitbYmF0Y2hdIFByb2dyZXNzaXZlIGhlbHAgdGV4dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxMiI+MTQxNTEyPC9hPgorW2JhdGNoXSByZS1mb3JtYXQgdGhlIGhlbHAgbWVzc2FnZSBzbyBhcyB0byBmaXQgaW50byA4MCBjb2x1bW5zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNTIyIj4xNDE1MjI8L2E+CitbY29tcGlsZXJdW2JhdGNoXSBDbGFzc0ZpbGUjYnVpbGRBbGxEaXJlY3Rvcmllc0ludG8gc2hvdWxkIHByb3RlY3QgaXRzZWxmCithZ2FpbnN0IGNvbmN1cnJlbnQgZGlyZWN0b3J5IGNyZWF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMzMwIj4xNDEzMzA8L2E+CitbMS41XVtjb21waWxlcl0gU3VzcGljaW91cyBlcnJvciBtZXNzYWdlIGZvciB0eXBlIG1pc21hdGNoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMjUyIj4xNDEyNTI8L2E+CitbMS42XV1bY29tcGlsZXJdIENsYXNzRm9ybWF0RXJyb3I6IElsbGVnYWwgY2xhc3MgbmFtZSAiIiBpbiBjbGFzcyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxODEwIj4xNDE4MTA8L2E+CitbMS41XVtjb21waWxlcl0gRW51bSBzd2l0Y2ggdGFibGVzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEzMjciPjE0MTMyNzwvYT4KK1N0YWNrRnJhbWUgYW5kIFZlcmlmaWNhdGlvblR5cGVJbmZvIG11c3QgY2FsbCBzdXBlci5jbG9uZSgpIGluIHRoZWlyIGNsb25lKCkgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNDc2Ij4xNDA0NzY8L2E+CitKRE9NOiBJRE9NVHlwZS5zZXRTdXBlckludGVyZmFjZXMobmV3IFN0cmluZyBbMF0pIGZhaWxzIHRvIHJlbW92ZSBleGlzdGluZyBpbXBsZW1lbnRzIGNsYXVzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjQzMCI+MTMyNDMwPC9hPgorWzEuNV1bamF2YWRvY10gVW53YW50ZWQgbWlzc2luZyB0YWcgd2FybmluZyBmb3Igb3ZlcnJpZGRlbiBtZXRob2Qgd2l0aCBwYXJhbWV0ZXIgY29udGFpbmluZyB0eXBlIHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNzUyIj4xMzA3NTI8L2E+CitbY29tbWVudHNdIGZpcnN0IEJsb2NrQ29tbWVudCBwYXJzZWQgYXMgTGluZUNvbW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxNTYiPjE0MDE1NjwvYT4KK1sxLjVdW3NlYXJjaF0gSW52YWxpZCBtZXRob2QgaGFuZGxlIHdpdGggcGFyYW1ldGVyaXplZCBwYXJhbWV0ZXJzIHdoZW4gbm8gc291cmNlIGlzIGF0dGFjaGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjc5Ij4xMjM2Nzk8L2E+Citbc2VhcmNoXSBtaXNzaW5nIGljb24gb3IgYmFkIGhpdCBpbiBzZWFyY2ggcmVzdWx0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTU1MCI+MTQxNTUwPC9hPgorRW5hYmxlIG5vdyBwYXNzaW5nIHRlc3RzCisKKzxocj4KKzxwPkZvciBlYXJsaWVyIGJ1aWxkIG5vdGVzLCBhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzMl9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwiPmJ1aWxkIG5vdGVzIHVwIHRvIFJlbGVhc2UgMy4yPC9hPi48L3A+Cis8YnI+CisgIDxwPgorICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrP3VyaT1yZWZlcmVyIj48aW1nCisgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQtaHRtbDQwMSIKKyAgICAgICAgYWx0PSJWYWxpZCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiPjwvYT4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzRfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjM0X2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFjMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjM0X2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbApAQCAtMCwwICsxLDM1MTEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPHRpdGxlPkpEVC9Db3JlIFJlbGVhc2UgTm90ZXMgMy40PC90aXRsZT4KKyAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iamR0X2NvcmVfc3R5bGUuY3NzIiBjaGFyc2V0PSJpc28tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+Cis8Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTIgd2lkdGg9IjEwMCUiID4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMSI+CisgICAgICA8Zm9udCBzaXplPSIrMyI+PGI+amR0IGNvcmUgLSBidWlsZCBub3RlcyAzLjQgc3RyZWFtPC9iPjwvZm9udD4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+PHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNzIlIiBjbGFzcz0idGl0bGUyIj48Zm9udCBzaXplPSItMiI+SmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9mb250PjwvdGQ+PC90cj4KKyAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgIDx0cj4KKyAgCTx0ZCBjbGFzcz0idGl0bGUzIj4KKwkgIDxmb250IHNpemU9Ii0xIj4KKwkgIEhlcmUgYXJlIHRoZSBidWlsZCBub3RlcyBmb3IgdGhlIEVjbGlwc2UgSkRUL0NvcmUgcGx1Zy1pbiBwcm9qZWN0CisJICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL2luZGV4LnBocCI+PGI+b3JnLmVjbGlwc2UuamR0LmNvcmU8L2I+PC9hPiwKKwkgIGRlc2NyaWJpbmcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncyIgdGFyZ2V0PW5ldz5idWc8L2E+IHJlc29sdXRpb24gYW5kIHN1YnN0YW50aWFsIGNoYW5nZXMgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUiPjxiPkhFQUQ8L2I+PC9hPiBicmFuY2guCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAzLjQgcGxhbm5pbmcsIHBsZWFzZSByZWZlciB0byA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjQvaW5kZXgucGhwI3JlbGVhc2UtcGxhbiI+SkRUL0NvcmUgcmVsZWFzZSBwbGFuPC9hPiwKKwkgIHRoZSBuZXh0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamR0L2NvcmUvcjMuNC9pbmRleC5waHAjbWlsZXN0b25lLXBsYW4iPm1pbGVzdG9uZSBwbGFuPC9hPiwKKwkgIHRoZSBvdmVyYWxsIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9kZXZlbG9wbWVudC9lY2xpcHNlX3Byb2plY3RfcGxhbl8zXzQuaHRtbCI+b2ZmaWNpYWwgcGxhbjwvYT4sCisJICBvciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlL3BsYXRmb3JtLXJlbGVuZy9idWlsZFNjaGVkdWxlLmh0bWwiPmJ1aWxkIHNjaGVkdWxlPC9hPi4KKwkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgc2luY2UgUmVsZWFzZSAzLjMgKGFsc28gc2VlIGEgc3VtbWFyeSBvZiA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL0FQSV9jaGFuZ2VzLmh0bWwiPkFQSSBjaGFuZ2VzPC9hPikuCisJICA8YnI+TWFpbnRlbmFuY2Ugb2YgcHJldmlvdXMgcmVsZWFzZXMgb2YgSkRUL0NvcmUgaXMgcGVyZm9ybWVkIGluIHBhcmFsbGVsIGJyYW5jaGVzOgorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfM19tYWludGVuYW5jZSI+UjMuMy54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzJfbWFpbnRlbmFuY2UiPlIzLjIueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18xX21haW50ZW5hbmNlIj5SMy4xLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfMF9tYWludGVuYW5jZSI+UjMuMC54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIyXzFfbWFpbnRlbmFuY2UiPlIyLjEueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SMl8wXzEiPlIyLjAueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1FQ0xJUFNFXzFfMCI+UjEuMC54PC9hPi4KKwkgIDwvZm9udD4KKwk8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGEgbmFtZT0idl84NzQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNC4wIC0gSnVuZSAxMywgMjAwOCAtIDMuNC4wCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg3NAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NzQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzY1OTkiPjIzNjU5OTwvYT4KK0ZpeCB3b3JkaW5nIG9mIEpEVAorCis8YSBuYW1lPSJ2Xzg3MyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40LjAgLSBKdW5lIDksIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODczCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg3MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjI1MiI+MjM2MjUyPC9hPgorQmF0Y2ggY29tcGlsZXIncyBoZWxwIHNob3VsZCBub3QgaGF2ZSAncmVsZWFzZSBjYW5kaWRhdGUtNCcgaW4gdGhlIHZlcnNpb24gbmFtZQorCis8YSBuYW1lPSJ2Xzg3MiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkM0IC0gSnVuZSAzLCAyMDA4IC0gMy40IFJFTEVBU0UgQ0FORElEQVRFIDQKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODcyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg3MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDcxOCI+MjM0NzE4PC9hPgorSmFyUGFja2FnZUZyYWdtZW50Um9vdC5jb21wdXRlQ2hpbGRyZW4oLi4pIGlzIHNsb3cKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ4NDgiPjIzNDg0ODwvYT4KK05lZWQgdG8gdHJhY2UgY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXphdGlvbiBmYWlsdXJlcworCis8YSBuYW1lPSJ2Xzg3MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMzIC0gTWF5IDI5LCAyMDA4IC0gMy40IFJFTEVBU0UgQ0FORElEQVRFIDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODcxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg3MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDMwNyI+MjM0MzA3PC9hPgorSmF2YSBNb2RlbCBFeGNlcHRpb24gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CdWZmZXIuc2F2ZShCdWZmZXIuamF2Z2E6MzYxKQorCis8YSBuYW1lPSJ2Xzg3MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMzIC0gTWF5IDI5LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg3MAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NzAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQzMzYiPjIzNDMzNjwvYT4KK1tmb3JtYXR0ZXJdIEphdmFEb2NUZXN0Q2FzZS50ZXN0TXVsdGlMaW5lQ29tbWVudEluZGVudCogdGVzdHMgZmFpbCBpbiBJMjAwODA1MjctMjAwMCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzgwMCI+MjMzODAwPC9hPgorWzEuNV1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIE5QRSBvbiBjaGVja1Vuc2FmZUNhc3QKKworPGEgbmFtZT0idl84NjkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNFJDMyAtIE1heSAyNywgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NjkKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODY5Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM0MTIwIj4yMzQxMjA8L2E+CitQdWJsaWNTY2FubmVyIG5vdCBpbiBzeW5jIHdpdGggaW50ZXJuYWwgU2Nhbm5lcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzYyNSI+MjMzNjI1PC9hPgorQ29udGVudCBBc3Npc3Qgb3V0b2YgbWVtb3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyNzY4Ij4yMzI3Njg8L2E+CitbZm9ybWF0dGVyXSBkb2VzIG5vdCBmb3JtYXQgYmxvY2sgYW5kIHNpbmdsZSBsaW5lIGNvbW1lbnQgaWYgdG9vIG11Y2ggc2VsZWN0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzM4ODciPjIzMzg4NzwvYT4KK1tqYXZhZG9jXVsxLjVdIEJ1aWxkIG9mIEVjbGlwc2UgcHJvamVjdCBzdG9wIGJ5IE51bGxQb2ludGVyRXhjZXB0aW9uIGFuZCB3aWxsIG5vdCBjb250aW51ZSBvbiBFY2xpcHNlIHZlcnNpb24gbGF0ZXIgdGhhbiAzLjRNNworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjgxNCI+MjMyODE0PC9hPgorW2NvbXBpbGVyXSBUZXN0Y2FzZSB3aXRoICZxdW90O3ZhbHVlMSAtICgtdmFsdWUyKSZxdW90OyBub3Qgd29ya2luZyB3aGVuIHZhbHVlMiBpcyBmaW5hbAorCis8YSBuYW1lPSJ2Xzg2OCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMyIC0gTWF5IDIyLCAyMDA4IC0gMy40IFJFTEVBU0UgQ0FORElEQVRFIDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODY4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2OCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDk0NCI+MjMwOTQ0PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIGRvZXMgbm90IHJlc3BlY3QgLyotCisKKzxhIG5hbWU9InZfODY3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRSQzIgLSBNYXkgMjIsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODY3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2NyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjc4OCI+MjMyNzg4PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIG1pc2FsaWducyBzdGFycyB3aGVuIGZvcm1hdHRpbmcgYmxvY2sgY29tbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzMyMjgiPjIzMzIyODwvYT4KK1tmb3JtYXR0ZXJdIGxpbmUgY29tbWVudHMgd2hpY2ggY29udGFpbnMgXFx1IGFyZSBub3QgY29ycmVjdGx5IGZvcm1hdHRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzIyNCI+MjMzMjI0PC9hPgorW2Zvcm1hdHRlcl0gWGRvY2xldCB0YWdzIGxvb3NlcyBAIG9uIGZvcm1hdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjQ2NiI+MjMyNDY2PC9hPgorW2Zvcm1hdHRlcl0gUmVmZXJlbmNlcyBvZiBpbmxpbmVkIHRhZ3MgYXJlIHN0aWxsIHNwbGl0IGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODY0OCI+MjI4NjQ4PC9hPgorQVNUOiBubyBiaW5kaW5nIGZvciBKYXZhZG9jIHJlZmVyZW5jZSB0byBpbm5lciBjbGFzcworCis8YSBuYW1lPSJ2Xzg2NiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMyIC0gTWF5IDIwLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg2NgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NjYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4MDMiPjIzMjgwMzwvYT4KK1JlY29uY2lsZSBkb2Vzbid0IGZpbmQgbWV0aG9kcyB3aXRoIGEgJCBpbiBwYXJhbWV0ZXIgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI0ODgiPjIzMjQ4ODwvYT4KK1tmb3JtYXR0ZXJdIENvZGUgZm9ybWF0dGVyIHNjcmFtYmxlcyBKYXZhRG9jIG9mIEdlbmVyaWNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzM3Ij4yMjU3Mzc8L2E+CitbY29tcGlsZXJdWzEuNV0gR2VuZXJpY3MgLSBKRFQgY2Fubm90IGNvbXBpbGUgaHVkc29uLWNvcmUgd2hlbiBqYXZhYyBjYW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzE4NjEiPjIzMTg2MTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBHZW5lcmljczogcHJvYmxlbSB3aXRoIHBhcnRpYWwgZ2VuZXJpY3MKKworCis8YSBuYW1lPSJ2Xzg2NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMxIC0gTWF5IDE1LCAyMDA4LSAzLjQgUkVMRUFTRSBDQU5ESURBVEUgMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NjUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODY1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMjg1Ij4yMzIyODU8L2E+CitbZm9ybWF0dGVyXSBOZXcgY29tbWVudCBmb3JtYXR0ZXIgd3JvbmdseSBmb3JtYXRzIGphdmFkb2MgaGVhZGVyL2Zvb3RlciB3aXRoIHNldmVyYWwgY29udGlndW91cyBzdGFycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTQ4MCI+MjI5NDgwPC9hPgorW2J1aWxkZXJdIGNvbXBpbGVyIGV4Y2VwdGlvbiBjYXVzZXMgTlBFIGluIEFic3RyYWN0SW1hZ2VCdWlsZGVyLmFjY2VwdFJlc3VsdCgpCisKKzxhIG5hbWU9InZfODY0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRSQzEgLSBNYXkgMTQsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODY0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2NCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjAzNyI+MjMyMDM3PC9hPgorQ29tcGlsYXRpb25Vbml0I2VxdWFscyhPYmplY3QpIHRocm93cyBOUEUgaWYgb3duZXIgaXMgbnVsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzE4NSI+MjI3MTg1PC9hPgorWzEuNV1bY29tcGlsZXJdIENvbXBpbGVyIGVycm9yIHVzaW5nIGdlbmVyaWNzIHdpdGggc3RhdGljIGNsYXNzCisgCisKKzxhIG5hbWU9InZfODYzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRSQzEgLSBNYXkgMTMsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODYzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTI5NyI+MjMxMjk3PC9hPgorW2Zvcm1hdHRlcl0gTmV3IEphdmFEb2MgZm9ybWF0dGVyIHdyb25nbHkgc3BsaXQgaW5saW5lIHRhZ3MgYmVmb3JlIHJlZmVyZW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTI2MyI+MjMxMjYzPC9hPgorW2Zvcm1hdHRlcl0gTmV3IEphdmFEb2MgZm9ybWF0dGVyIHdyb25nbHkgaW5kZW50IHRhZ3MgZGVzY3JpcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjk2ODIiPjIyOTY4MjwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IHB1dCB0ZXh0IG92ZXIgdGhlIG1heCBsaW5lIGxlbmd0aCBpbiBzb21lIGNhc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMjkzIj4yMzEyOTM8L2E+CitOZXcgZXJyb3JzIGFib3V0IGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjbGFzc2VzIGZyb20gcmVxdWlyZWQgLmNsYXNzIGZpbGVzIGluIDIwMDgwNTA4LTIwMAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTYyMiI+MjMxNjIyPC9hPgorU29tZSBjbGFzc2VzIGZyb20gTWlzc2luZyBjbGFzc2VzIGZyb20gQ250cmwtU2hpZnQtVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTc0NyI+MjMxNzQ3PC9hPgorW2Fzc2lzdF0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXZlbiB3aGVuIHRoZSBjb250ZXh0IGlzIGV4dGVuZGVkCisKKzxhIG5hbWU9InZfODYyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRSQzEgLSBNYXkgMTIsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODYyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTU3OSI+MjMxNTc5PC9hPgorQ29udmVydGluZyBjb21waWxlci50b29sIHRvIEFQSSB0b29scyBzdXBwb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMzY3Ij4yMzEzNjc8L2E+CitvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCBpcyBub3Qgc2luZ2xldG9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwMDI2Ij4yMzAwMjY8L2E+CitbMS41XVtjb21waWxlcl0gQ0NFIGR1cmluZyBzdGF0aWMgaW1wb3J0IHJlc29sdXRpb24gd2l0aCBwYXJhbWV0ZXJpemVkIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA4ODUiPjIzMDg4NTwvYT4KK1tjb250ZW50IGFzc2lzdF0gTlBFIGF0IFBhcmFtZXRlckd1ZXNzZXIuY3JlYXRlVmFyaWFibGUoKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzIwMCI+MTYzMjAwPC9hPgorTW92aW5nIGNvZGUgd2l0aCBjb21waWxlIGVycm9ycyBvdXRzaWRlIG9mIGEgc291cmNlIGZvbGRlciBwcmVzZXJ2ZSBjb21waWxlIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTk1MSI+MjI5OTUxPC9hPgorU3RhY2tPdmVyZmxvd0Vycm9yIGR1cmluZyBKYXZhU2VhcmNoU2NvcGUuYWRkIGZvciBsYXJnZSB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA4NjQiPjIzMDg2NDwvYT4KK1thc3Npc3RdIENvZGUgYXNzaXN0IGRvIG5vdCB3b3JrIGluIHBhcmFtZXRlcml6ZWQgbWV0aG9kIHdpdGggJ3RoaXMnIGFzIHJlY2VpdmUKKworPGEgbmFtZT0idl84NjEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNFJDMSAtIE1heSA4LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg2MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NjEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzAxMjciPjIzMDEyNzwvYT4KK1tjbGVhbiB1cF0gTlBFIGluIE9yZ2FuaXplIEltcG9ydHMgc2F2ZSBhY3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzEwNTMiPjIzMTA1MzwvYT4KK1tmb3JtYXR0ZXJdIENvbW1lbnQgZm9ybWF0dGVyIGZhaWxzIHRvIGZvcm1hdCBsb25nIHN0cmluZ3MgaW4gQHNlZSByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMDYwIj4yMzEwNjA8L2E+CitbZm9ybWF0dGVyXSAnKicgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gSmF2YWRvYyBjb21tZW50cyB3aGVuIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQorCis8YSBuYW1lPSJ2Xzg2MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40UkMxIC0gTWF5IDcsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODYwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg2MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjI4NCI+MjIyMjg0PC9hPgorW3NlYXJjaF0gWmlwRXhjZXB0aW9uIHdoaWxlIHNlYXJjaGluZyBpZiBsaW5rZWQgamFyIGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTMyMiI+MTkxMzIyPC9hPgorW2phdmFkb2NdIEBzZWUgb3IgQGxpbmsgcmVmZXJlbmNlIHRvIG1ldGhvZCB3aXRob3V0IHNpZ25hdHVyZSBmYWlscyB0byByZXNvbHZlIHRvIGJhc2UgY2xhc3MgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk0NzQzIj4xOTQ3NDM8L2E+CitDb25zdHJ1Y3RvciB0b29sdGlwIGRvZXMgbm90IHNob3cgY29uc3RydWN0b3IgamF2YWRvYyB3aXRob3V0IHNvdXJjZSBhdHRhY2htZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NDY0Ij4yMjg0NjQ8L2E+CitBbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKSBlbXB0eSBmb3Igc2luZ2xlIGF0dHJpYnV0ZSB3aXRoIGVtcHR5IHZhbHVlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MTI4Ij4yMjkxMjg8L2E+Citbc2VhcmNoXSBTZWFyY2ggZmluZGluZyBtYXRjaGVzIGluIHdvcmtpbmcgY29waWVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwMzkxIj4yMzAzOTE8L2E+Citbb3JnYW5pemUgaW1wb3J0c10gdW5tYXRjaGVkIHBhY2thZ2VzIGdyb3VwIGlzIGFsd2F5cyBmaXJzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTkyNyI+MjI5OTI3PC9hPgorTm8gY29kZSBhc3Npc3QgaW4gYXJyYXkgaW5pdGlhbGl6ZXIKKworPGEgbmFtZT0idl84NTkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNFJDMSAtIE1heSA1LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg1OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzAzNjQiPjIzMDM2NDwvYT4KK1tmb3JtYXR0ZXJdIFRlc3QgZmFpbHVyZSBpbiBDbGVhblVwU3RyZXNzVGVzdCBhZnRlciBjaGFuZ2VzIHRvIGNvbW1lbnQgZm9ybWF0dGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NTU4Ij4yMTQ1NTg8L2E+CitbMS41XVtjb21waWxlcl0gamF2YWMgcmVwb3J0cyBhbWJpZ3VvdXMgbWV0aG9kIHJlZiB0aGF0IEVjbGlwc2UgZG9lcyBub3QgaWRlbnRpZnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjgyOTEiPjIyODI5MTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbmNvcnJlY3QgdW5zYWZlIHdhcm5pbmcgZm9yIGNhc3RpbmcgY29tcGxleCBidXQgc3RhdGljIHR5cGVzLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDA3MCI+MjMwMDcwPC9hPgorWzEuNV1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBhdCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uLmNoZWNrVW5zYWZlQ2FzdCgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwMjMwIj4yMzAyMzA8L2E+CitbZm9ybWF0dGVyXSBOZXcgY29tbWVudCBmb3JtYXR0ZXIgZG9lcyBub3QgaGFuZGxlIHByb3Blcmx5IGFsbCBzY2FubmVyIGV4Y2VwdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzAxODQiPjIzMDE4NDwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciBzcGxpdCBjb21tZW50IGxpbmUgYmV0d2VlbiBjb250aWd1b3VzIHRva2VucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTk1NCI+MjI5OTU0PC9hPgorW2Zvcm1hdHRlcl0gTmV3IGNvbW1lbnQgZm9ybWF0dGVyIGZhaWxzIHRvIGZvcm1hdCBjb3JyZWN0bHkgd2hlbiBpbnZhbGlkIHRocm93cyByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjk5MzIiPjIyOTkzMjwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciB3cm9uZ2x5IGZvcm1hdHMgQHBhcmFtIHRhZ3Mgd2l0aCB3cm9uZyBzeW50YXgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjk2ODMiPjIyOTY4MzwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciB0YWtlcyAyIHBhc3NlcyB0byBmb3JtYXQgd2hlbiB0YWdzIGFyZSBpbnNpZGUgdGV4dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTk2OCI+MjI5OTY4PC9hPgorUGVyZiByZWdyZXNzaW9uIHdoaWxlIGNvbXB1dGluZyB0eXBlIGhpZXJhcmNoeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTYzNiI+MjI5NjM2PC9hPgorSmF2YU1vZGVsRXhjZXB0aW9uIHNob3VsZCBzdGF5IGluc3RhbmNpYXRhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4MTA5Ij4yMjgxMDk8L2E+CitbMS41XVtjb21waWxlcl0gRW51bSBzdGF0aWMgZmllbGQgaW5pdGlhbGl6ZXIgaW4gZW51bSBjb25zdHJ1Y3RvciBmYWlsZWQgdG8gZ2l2ZSBjb21waWxhdGlvbiBlcnJvcgorCis8YSBuYW1lPSJ2Xzg1OCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTcgLSBBcHJpbCAzMCwgMjAwOCAtIDMuNCBNSUxFU1RPTkUgNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NTgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODU4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NjUxIj4yMjg2NTE8L2E+CitbZG9tXSBOUEUgaW4gTWVtYmVyVmFsdWVQYWlyQmluZGluZy5pc0RlZmF1bHQoKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTU2OSI+MjI5NTY5PC9hPgorW2Zvcm1hdHRlcl0gTmV3IGNvbW1lbnRzIGZvcm1hdHRlciBkb2VzIG5vdCBpbmRlbnQgbGluZXMgaW5zaWRlIGltbXV0YWJsZSB0YWdzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5NTI2Ij4yMjk1MjY8L2E+CitDb252ZXJzaW9uIHRvIEFwaSB0b29scyBhZGRzIGEgbmV3IGludGVybmFsIG1ldGhvZCBpbnNpZGUgYW4gQVBJIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5NTk1Ij4yMjk1OTU8L2E+CitPcHRpb25UZXN0cy50ZXN0QnVnNjg5OTMoKSBmYWlsaW5nIGR1ZSB0byB3cm9uZyBhc3N1bXB0aW9uCisKKzxhIG5hbWU9InZfODU3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNyAtIEFwcmlsIDI5LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg1NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkzNzMiPjIyOTM3MzwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciBnZXRzIGxvc3Qgd2hlbiBlbmNvdW50ZXJpbmcgaW52YWxpZCBjbG9zaW5nIHRhZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkzMDQiPjIyOTMwNDwvYT4KK2Nhbm5vdCAnT3BlbiBUeXBlJyBhIGJpbmFyeSB0eXBlIHRoYXQgaXMgcHJlc2VudCBpbiBhbiBleHRlcm5hbCBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkzMjYiPjIyOTMyNjwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciB0YWtlcyAyIHBhc3NlcyB0byBmb3JtYXQgc29tZSBibG9jayBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzczMCI+MjI3NzMwPC9hPgorW0phdmFkb2NdIE1pc3NpbmcgZGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSB3YXJuZWQgZm9yIHtAaW5oZXJpdERvY30KKworPGEgbmFtZT0idl84NTYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE03IC0gQXByaWwgMjgsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODU2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg1NiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTEwOCI+MjI5MTA4PC9hPgorW2Zvcm1hdHRlcl0gTmV3IGNvbW1lbnQgZm9ybWF0dGVyIGFkZHMgdW5uZWNlc3Nhcnkgc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgJmx0O2NvZGUmZ3Q7IHRhZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkxMDciPjIyOTEwNzwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBjb21tZW50IGZvcm1hdHRlciBmYWlscyB0byBmb3JtYXQgY29ycmVjdGx5IHdoZW4gJmx0O3RhYmxlIC4uLiZndDsgdGFncyBpcyB1c2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MTAzIj4yMjkxMDM8L2E+CitbZm9ybWF0dGVyXSBOZXcgY29tbWVudCBmb3JtYXR0ZXIgc3BsaXQgaW5saW5lZCB0YWdzIGluY29ycmVjdGx5CisKKzxhIG5hbWU9InZfODU1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNyAtIEFwcmlsIDI3LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg1NQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NTUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjcwNDMiPjIyNzA0MzwvYT4KK1tmb3JtYXR0ZXJdIENvZGVGb3JtYXR0ZXIgZG9lcyBub3QgZm9ybWF0IGxpbmUgYW5kIGJsb2NrIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NTI4Ij4yMjg1Mjg8L2E+CitOUEUgd2hlbiBpbnRlcnJ1cHRpbmcgdGhlIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NjM5Ij4yMjg2Mzk8L2E+CitTb3VyY2UgYXR0YWNobWVudCByb290IGRldGVjdGlvbiBkb2Vzbid0IHdvcmsgaWYgc291cmNlIGZvbGRlciBjb250YWlucyBNRVRBLUlORgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5Nzk4Ij43OTc5ODwvYT4KK1tjb21waWxlcl0gV3JvbmcgY29tcGlsZXIgZXJyb3Igd2hlbiBpbnRlcmZhY2Ugb3ZlcnJpZGVzIHR3byBtZXRob2RzIHdpdGggc2FtZSBzaWduYXR1cmUgYnV0IGRpZmZlcmVudCBleGNlcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTQ2Ij4yMjc1NDY8L2E+CitbYXNzaXN0XSBObyBtZXRob2QgZGVjbGFyYXRpb24gY29tcGxldGlvbiBpbiBlbnVtIGNvbnN0YW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTI2Ij4xNTg1MjY8L2E+Citbc2VhcmNoXSBOUEUgaW4gSmF2YVNlYXJjaFNjb3BlLmFkZEVuY2xvc2luZ1Byb2plY3RPckphciguLikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODI3MzgiPjE4MjczODwvYT4KK1tzZWFyY2hdIEF2b2lkIGtlZXBpbmcgbGlzdCBvZiByb290cyBpbiBKYXZhV29ya3NwYWNlU2NvcGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjgxOTMiPjIyODE5MzwvYT4KK1tmb3JtYXR0ZXJdIEphdmFkb2MgY29tbWVudHMgYXJlIHN0aWxsIGZvcm1hdHRlZCB1c2luZyBKYXZhRG9jUmVnaW9uIQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzgyMiI+MjI3ODIyPC9hPgorW3NlbGVjdF0gQ2xhc3NDYXN0RXhjZXB0aW9uIHRocm93biBpZiB1bmFibGUgdG8gcmVzb2x2ZSBjb3JlIEphdmEgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc4NTUiPjIyNzg1NTwvYT4KK2luY29ycmVjdCBjb21waWxhdGlvbiBlcnJvcnMgcmVsYXRlZCB0byBhbm5vdGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODAxMCI+MjA4MDEwPC9hPgorW2NvbXBpbGVyXSBDb21waWxlciByZXBvcnRzIHVubmVjY2Vzc2FyeSB3YXJuaW5nIGZvciBzdGF0aWMgbWVtYmVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjczNSI+MjIyNzM1PC9hPgorRE9NIEFTVDogaGlkZSByZWNvdmVyZWQgYmluZGluZ3MgdW5sZXNzICdyZWNvdmVyZWQgYmluZGluZ3MnIGlzIGVuYWJsZWQKKworPGEgbmFtZT0idl84NTQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE03IC0gQXByaWwgMjIsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODU0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg1NCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlpJUCBhcmNoaXZlcyB0aGF0IGhhdmUgYW4gZXh0ZW5zaW9uIG90aGVyIHRoYW4gPGNvZGU+LnppcDwvY29kZT4gYW5kIDxjb2RlPi5qYXI8L2NvZGU+IGNhbiBub3cgYmUgcHV0IG9uIHRoZSBjbGFzc3BhdGggYXMgd2VsbC4KKyAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIzNjAiPmJ1ZyAxODIzNjA8L2E+IGZvciBkZXRhaWxzLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTY0MyI+MjA5NjQzPC9hPgora2V5d29yZCBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgQGludGVyZmFjZSBhbmQgZW51bQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzUzMSI+MjI3NTMxPC9hPgorYWRkIG9uZSBleGNlcHRpb24gbG9nZ2luZyBpbiBBU1RQYXJzZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc5NDEiPjIyNzk0MTwvYT4KK29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluIHdyaXRlcyBiYWQgY2hhcmFjdGVycyB0byBhbiB4bWwgbG9nIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc5MzAiPjIyNzkzMDwvYT4KK1tjb21waWxlcl0gTlBFIGR1cmluZyBleGNlcHRpb24gcmVwb3J0aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTAyIj4yMjc1MDI8L2E+CitbMS41XVtjb21waWxlcl0gQmFkIGVycm9yIG1lc3NhZ2UgZm9yIGFic3RyYWN0IGVudW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc3NjEiPjIyNzc2MTwvYT4KK05QRSBmcm9tIENvbXBsZXRpb25Db250ZXh0LmdldFZpc2libGVFbGVtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzgxMyI+MjI3ODEzPC9hPgorcm9vdCBkZXRlY3Rpb24gaW4gaW4gZXh0ZXJuYWwgbGlua2VkIHNvdXJjZSBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5MTQ5Ij4yMDkxNDk8L2E+CitbMS43XVtjb21waWxlcl0gMS43IGNvbXBsaWFuY2UgYWxsb3dzIHR5cGUgcGFyYW1zIHRvIGJlIGRlY2xhcmVkIGluIGFueSBvcmRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjM2MCI+MTgyMzYwPC9hPgorT25seSBKYXIgYW5kIFppcCBmaWxlcyBhbGxvd2VkIGZvciBqYXZhLmlvLkZpbGUgaW4gQ2xhc3NwYXRoQ29udGFpbmVycyB1c2luZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjMyNiI+MjIyMzI2PC9hPgorWzEuNV1bY29tcGlsZXJdIE51bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZzogIkNvbXB1dGUgbGF1bmNoIGJ1dHRvbiB0b29sdGlwIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTAzMCI+MTYxMDMwPC9hPgorYWRkIGNvZGUgYXNzaXN0IGZvciBlbnVtIHZhbHVlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzYzMSI+MjA3NjMxPC9hPgorW0NvbnRlbnQgQXNzaXN0XSBBdXRvY29tcGxldGlvbiBmYWlscyBhZnRlciB1c2Ugb2YgYmluYXJ5IHJpZ2h0LXNoaWZ0IG9wZXJhdG9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNjkxOCI+MjI2OTE4PC9hPgorW2pzcjE5OV0gdGhlIHN0YW5kYXJkIGphdmEgZmlsZSBtYW5hZ2VyIHJldHVybmVkIGJ5IHRoZSBFY2xpcHNlIGNvbXBpbGVyIGRvZXMgbm90IGFjY2VwdCBub24tbW9kaWZpYWJsZSBpdGVyYXRvcnMgYXMgcmVtYWluaW5nIGFyZyB0byBKYXZhRmlsZU1hbmFnZXIjaGFuZGxlT3B0aW9uCisKKzxhIG5hbWU9InZfODUzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNyAtIEFwcmlsIDE1LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg1MworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NTMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5UaGUgSmF2YSBjb21waWxlciBub3cgdXNlcyBtdWx0aXBsZSBDUFVzIHdoZW4gcnVubmluZyBpbiBiYXRjaCBtb2RlLiBTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjEyNiI+MTQyMTI2PC9hPi48L2xpPgorPGxpPkluIG9yZGVyIHRvIGF2b2lkIGJyZWFraW5nIGV4aXN0aW5nIGNsaWVudHMgd2hpbGUgZml4aW5nIGJ1ZyAKKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc4MCI+MTAyNzgwPC9hPiwgCit0aGUgbmV3IGZvcm1hdHRlciBiZWhhdmlvciAoaS5lLiBmb3JtYXQgY29tbWVudHMgd2hpbGUgZm9ybWF0dGluZyB0aGUgd2hvbGUKK2NvbXBpbGF0aW9uIHVuaXQpIHdpbGwgYmUgYWN0aXZhdGVkIG9ubHkgaWYgYSBzcGVjaWZpYyBmbGFnIHdhcyBzZXQuCis8cD4KK1RoaXMgZmxhZyBpcyBkZWZpbmVkIGluIENvZGVGb3JtYXR0ZXIgYW5kIG5hbWVkIDxjb2RlPidGX0lOQ0xVREVfQ09NTUVOVFMnPC9jb2RlPi4KK0NsaWVudHMgd2lsbCBoYXZlIHRvIGNvbWJpbmUgaXQgd2l0aCBleGlzdGluZyBDb2RlRm9ybWF0dGVyLktfQ09NUElMQVRJT05fVU5JVAorb3IgQ29kZUZvcm1hdHRlci5VTktOT1dOIGtpbmRzIHRvIHNlZSB0aGUgZml4IGZvciB0aGlzIGJ1ZyBhY3RpdmF0ZWQuLi4KKzwvcD4KK0hlcmUncyBpdHMgY29tcGxldGUgbmV3IEFQSSBjaGFuZ2VzIGRvbmUgb24KKzxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyPC9jb2RlPjoKKzxwcmU+CisvKioKKyAqIEZsYWcgdXNlZCB0byBpbmNsdWRlIHRoZSBjb21tZW50cyBkdXJpbmcgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIGNvZGUKKyAqIHNuaXBwZXQuCisgKgorICogVGhpcyBmbGFnIGNhbiBvbmx5IGJlIGNvbWJpbmVkIHdpdGggZm9sbG93aW5nIGtpbmRzOgorICogICAgICAuIHtAbGluayAjS19DT01QSUxBVElPTl9VTklUfQorICogICAgICAuIHtAbGluayAjS19VTktOT1dOfQorICoKKyAqIE5vdGUgYWxzbyB0aGF0IGl0IGhhcyBhbiBlZmZlY3Qgb25seSB3aGVuIHRoZSBvcHRpb24KKyAqIHtAbGluayBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cworICogICNGT1JNQVRURVJfQ09NTUVOVF9GT1JNQVRfSkFWQURPQ19DT01NRU5UfQorICogaXMgc2V0IHRvIHtAbGluayBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNUUlVFfSB3aGlsZSBjYWxsaW5nCisgKiB7QGxpbmsgI2Zvcm1hdChpbnQsIFN0cmluZywgaW50LCBpbnQsIGludCwgU3RyaW5nKX0gb3IKKyAqIHtAbGluayAjZm9ybWF0KGludCwgU3RyaW5nLCBJUmVnaW9uW10sIGludCwgU3RyaW5nKX0gbWV0aG9kcworICoKKyAqIEZvciBleGFtcGxlLCB3aXRoIHRoZSBFY2xpcHNlIGRlZmF1bHQgZm9ybWF0dGVyIG9wdGlvbnMsIHRoZSBmb3JtYXR0aW5nIG9mCisgKiB0aGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCB1c2luZyB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH06CisgKgorICogcHVibGljIGNsYXNzIFggeworICogLyoqCisgKiAgKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgZXhhbXBsZSB0byBzaG93IHRoYXQgY29tbWVudHMgd2lsbCBiZSBmb3JtYXR0ZWQgd2hpbGUgcHJvY2Vzc2luZyBhIGNvbXBpbGF0aW9uIHVuaXQgb25seSBpZiB0aGUgY29uc3RhbnQgZmxhZyA8Y29kZT5GX0lOQ0xVREVfQ09NTUVOVDwvY29kZT4gZmxhZyBpcyBzZXQuCisgKiAgKiBAcGFyYW0gc3RyIFRoZSBpbnB1dCBzdHJpbmcgKi8KKyAqICB2b2lkIGZvbyhTdHJpbmcgc3RyKXt9fQorICoKKyAqIHdpbGwgcHJvZHVjZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKKyAqCisgKiBwdWJsaWMgY2xhc3MgWCB7CisgKiAgICAgIC8qKgorICogICAgICAgKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgZXhhbXBsZSB0byBzaG93IHRoYXQgY29tbWVudHMgd2lsbCBiZSBmb3JtYXR0ZWQgd2hpbGUgcHJvY2Vzc2luZyBhIGNvbXBpbGF0aW9uIHVuaXQgb25seSBpZiB0aGUgY29uc3RhbnQgZmxhZyA8Y29kZT5GX0lOQ0xVREVfQ09NTUVOVDwvY29kZT4gZmxhZyBpcyBzZXQuCisgKiAgICAgICAqIAorICogICAgICAgKiBAcGFyYW0gc3RyIFRoZSBpbnB1dCBzdHJpbmcKKyAqICAgICAgICovCisgKiAgICAgIHZvaWQgZm9vKFN0cmluZyBzdHIpeworICogICAgICB9CisgKiAgfQorICoKKyAqIEFkZGluZyB0aGlzIGZsYXZvciB0byB0aGUga2luZCBnaXZlbiB3aGlsZSBmb3JtYXR0aW5nIHRoZSBzYW1lIHNvdXJjZQorICogKGUuZy4ge0BsaW5rICNLX0NPTVBJTEFUSU9OX1VOSVR9IHwge0BsaW5rICNGX0lOQ0xVREVfQ09NTUVOVFN9KQorICogd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IGluc3RlYWQ6CisgKgorICogcHVibGljIGNsYXNzIFggeworICogICAgICAvKioKKyAqICAgICAgICogVGhpcyBpcyBqdXN0IGEgc2ltcGxlIGV4YW1wbGUgdG8gc2hvdyB0aGF0IGNvbW1lbnRzIHdpbGwgYmUgZm9ybWF0dGVkCisgKiAgICAgICAqIHdoaWxlIHByb2Nlc3NpbmcgYSBjb21waWxhdGlvbiB1bml0IG9ubHkgaWYgdGhlIGNvbnN0YW50IGZsYWcKKyAqICAgICAgICogPGNvZGU+Rl9JTkNMVURFX0NPTU1FTlQ8L2NvZGU+IGZsYWcgaXMgc2V0LgorICogICAgICAgKiAKKyAqICAgICAgICogQHBhcmFtIHN0cgorICogICAgICAgKiAgICAgICAgICAgICAgICAgVGhlIGlucHV0IHN0cmluZworICogICAgICAgKi8KKyAqICAgICAgdm9pZCBmb28oU3RyaW5nIHN0cil7CisgKiAgICAgIH0KKyAqICB9CisgKgorICogPGk+PHU+Tm90ZTwvdT46IEFsdGhvdWdoIHdlJ3JlIGNvbnZpbmNlZCB0aGF0IHRoZSBmb3JtYXR0ZXIgc2hvdWxkCisgKiBhbHdheXMgaW5jbHVkZSB0aGUgY29tbWVudHMgd2hpbGUgcHJvY2Vzc2luZyBhCisgKiB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVCBraW5kIG9mIGNvbXBpbGF0aW9uIHVuaXR9LCB3ZQorICogaGF2ZSBkZWNpZGVkIHRvIGFkZCBhIHNwZWNpZmljIGZsYWcgdG8gZml4IHRoaXMgZm9ybWF0dGVyIGluY29ycmVjdCBiZWhhdmlvci4KKyAqIFRoaXMgd2lsbCBwcmV2ZW50IGFsbCBleGlzdGluZyBjbGllbnRzIHVzaW5nIHRoZSB7QGxpbmsgI0tfQ09NUElMQVRJT05fVU5JVH0KKyAqIGtpbmQgdG8gYmUgYnJva2VuIHdoaWxlIGZvcm1hdHRpbmcuPC9pPgorICoKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9JTkNMVURFX0NPTU1FTlRTID0gMHgxMDAwOworPC9wcmU+CitOb3RlIHRoYXQgQ29kZUZvcm1hdHRlci5VTktOT1dOIGFuZCBDb2RlRm9ybWF0dGVyLktfQ09NUElMQVRJT05fVU5JVAorc3BlY2lmaWNhdGlvbiB3aWxsIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGlzIG5ldyBwb3NzaWJsZSBjb21iaW5hdGlvbjoKKzxwcmU+CisvKioKKyAqIFVua25vd24ga2luZAorICogCisgKiBOb3RlIHRoYXQgc2luY2UgMy40LCB0aGUge0BsaW5rICNGX0lOQ0xVREVfQ09NTUVOVFN9IGZsYWcgY2FuIGJlIGFkZGVkCisgKiB0byB0aGlzIGNvbnN0YW50IGluIG9yZGVyIHRvIGdldCB0aGUgY29tbWVudHMgZm9ybWF0dGVkIGlmIGEKKyAqIGNvbXBpbGF0aW9uIHVuaXQgaXMgcHJvY2Vzc2VkLgorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX1VOS05PV04gPSAweDAwOworCisvKioKKyAqIEtpbmQgdXNlZCB0byBmb3JtYXQgYSBjb21waWxhdGlvbiB1bml0CisgKgorICogTm90ZSB0aGF0IHVzaW5nIHRoaXMgY29uc3RhbnQsIHRoZSBqYXZhZG9jIGNvbW1lbnRzIGFyZSBvbmx5IGluZGVudGVkIHdoaWxlCisgKiBwcm9jZXNzaW5nIHRoZSBjb21waWxhdGlvbiB1bml0LgorICoKKyAqIDxiPlNpbmNlIDMuNDwvYj4sIGlmIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgb3B0aW9uIGlzIHNldCB0bworICogPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGZvcm1hdCB0aGUgY29tbWVudHMgb24gdGhlIGZseQorICogYnkgYWRkaW5nIHRoZSB7QGxpbmsgI0ZfSU5DTFVERV9DT01NRU5UU30gZmxhZyB0byB0aGlzIGtpbmQgb2YgZm9ybWF0LgorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLX0NPTVBJTEFUSU9OX1VOSVQgPSAweDA4OworPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDIxMjYiPjE0MjEyNjwvYT4KK3V0aWxpemluZyBtdWx0aXBsZSBDUFVzIGZvciBKYXZhIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNzgwIj4xMDI3ODA8L2E+CitbZm9ybWF0dGVyXSBDb2RlRm9ybWF0dGVyIGRvZXMgbm90IGZvcm1hdCBKYXZhZG9jCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5ODU1Ij4yMTk4NTU8L2E+CitbMS41XVtjb21waWxlcl0gU3RhY2tPdmVyZmxvd0Vycm9yIGR1cmluZzogIlJlcXVlc3RpbmcgSmF2YSBBU1QgZnJvbSBzZWxlY3Rpb24iCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzOTg2Ij4yMjM5ODY8L2E+CitJbnZhbGlkIGluY29tcGF0aWJsZSByZXR1cm4gdHlwZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNjg5MCI+MjI2ODkwPC9hPgorW2pzcjE5OV0gZW5hYmxlIENvbXBpbGVyVG9vbFRlc3RzI3Rlc3RDb21waWxlck9uZUNsYXNzV2l0aEVjbGlwc2VDb21waWxlcjQgb24gTGludXgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjY2NzMiPjIyNjY3MzwvYT4KK0NvbXBsZXRpb25Db250ZXh0LmdldFZpc2libGVFbGVtZW50cyguLikgZG9lc24ndCBmaW5kIGFzc2lnbmFibGUgZmllbGRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4OTgyIj4xNzg5ODI8L2E+CitbYXNzaXN0XSBCYWQgc3RhdGljIGltcG9ydCByZWxldmFuY2UgaW4gY29udGVudCBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjU1NjMiPjIyNTU2MzwvYT4KK0NsYXNzIHdpdGggY29tcGlsZSBlcnJvcnMgcmVzdWx0cyBpbiBpbnZhbGlkIGNsYXNzIGZpbGUgZm9ybWF0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI2MzEzIj4yMjYzMTM8L2E+CitBbm9ueW1vdXMgZW51bSB0eXBlIGhhcyB3cm9uZyBuYW1lIGFuZCBzb3VyY2UgcmFuZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjM2ODUiPjIyMzY4NTwvYT4KK1tjbGVhbi11cF0gTmVjZXNzYXJ5IGNhc3QgcmVtb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyNzEyIj44MjcxMjwvYT4KK1sxLjVdIENvZGUgYXNzaXN0IGRvZXMgbm90IHNob3cgbWV0aG9kIHBhcmFtZXRlcnMgZnJvbSBzdGF0aWMgaW1wb3J0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNjEzNCI+MjI2MTM0PC9hPgorQ0NFIGluIFNvdXJjZU1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKSBmb3IgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzMxMCI+OTczMTA8L2E+Citjb2RlIGFzc2lzdCBmb3IgdHlwZSB2YXJpYWJsZSBib3VuZHM6IHNob3VsZCBub3Qgc3VnZ2VzdCBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0NDAyIj4yMjQ0MDI8L2E+CitbY29tcGlsZXJdIENDRSBpbiBjb21waWxlcjogTWlzc2luZ1R5cGVCaW5kaW5nIGNhbm5vdCBiZSBjYXN0IHRvIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY2MDQiPjk2NjA0PC9hPgorWzEuNV1bY29kZWFzc2lzdF0gbWlzc2luZyBwcm9wb3NhbHMgZm9yIHdpbGRjYXJkIGNhcHR1cmUKKworPGEgbmFtZT0idl84NTIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE03IC0gQXByaWwgOCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NTIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODUyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1MzMxIj4yMTUzMzE8L2E+CitbYXNzaXN0XSBJbmNvbnNpc3RlbnQgY29tcGxldGlvbnMgZm9yIG1lbWJlciB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTkwNCI+MjIxOTA0PC9hPgorSmF2YSBNb2RlbCBFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIG9wZW4gKi5jbGFzcyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzNDg4Ij4yMjM0ODg8L2E+CisncGFja2FnZS1pbmZvLmphdmEnIGRvZXMgbm90IGV4aXN0IGluIFBhY2thZ2VCaW5kaW5nLmdldEFubm90YXRpb25zKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTMwNDUiPjE5MzA0NTwvYT4KK1sxLjVdW2Fzc2lzdF0gQ29kZSBjb21wbGV0aW9uIGZhaWxzIGluIGlubmVyIGNsYXNzIHcvIGZvcmVhY2ggbG9vcAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzg5OSI+MjIzODk5PC9hPgorQmFzZSB0eXBlIHZhciBzaG91bGQgbm90IGJlIHByb3Bvc2VkIGJlZm9yZSBPYmplY3QgdmFyIGluID09IGNhc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjU1NzciPjIyNTU3NzwvYT4KK1tjb21waWxlcl0gRGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzIHNob3VsZCBiZSB0YWdnZWQgYXMgc3ludGhldGljCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzMDA1Ij4xMzMwMDU8L2E+CitCaW5hcnlUeXBlQ29udmVydGVyIGNhbm5vdCBjb252ZXJ0IGdlbmVyaWMgdHlwZSByZWZlcmVuY2UuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0MzUxIj4yMjQzNTE8L2E+CitSZWdyZXNzaW9uIGluIHBlcmZvcm1hbmNlIHRlc3QgRnVsbFNvdXJjZVdvcmtzcGFjZU1vZGVsVGVzdHMjdGVzdEZpbmRUeXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1OTc1Ij4yMTU5NzU8L2E+CituZXcgZmllbGQgZGVjbGFyYXRpb24gQ29tcGxldGlvblByb3Bvc2FsIGN1dHMgY2hhbmdlcyBpbml0aWFsIHByZWZpeAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzA3OCI+MjE3MDc4PC9hPgorW2NvbXBpbGVyXSBjb21waWxlci5yZWdyZXNzaW9uLlJ1bnRpbWVUZXN0cyN0ZXN0MDAwMV9tZW1vcnlfZXhoYXVzdGlvbiBmYWlsaW5nIHdoZW4gdXNpbmcgSUJNIEpSRQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTA5OSI+MjE5MDk5PC9hPgorQ29udGVudCBhc3Npc3QgZG9lcyBub3Qgbm90IG9mZmVyIG11bHRpcGxlIGNob2ljZXMgZm9yIGFtYmlndW91cyBzdGF0aWMgaW1wb3J0cworCis8YSBuYW1lPSJ2Xzg1MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTcgLSBBcHJpbCAxLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg1MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NTEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQ3MTUiPjIyNDcxNTwvYT4KK01pc3NpbmcgYWJzdHJhY3QgcHJvYmxlbSBtZXRob2RzIHNob3VsZCBiZSB0YWdnZWQgYXMgc3ludGhldGljIG1ldGhvZHMKKworPGEgbmFtZT0idl84NTAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE02IC0gTWFyY2ggMjgsIDIwMDggLSAzLjQgTUlMRVNUT05FIDYKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODUwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg1MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNDQ1OCI+MjI0NDU4PC9hPgorW3NlYXJjaF0gTlBFIHRyeWluZyB0byBzZWFyY2ggZm9yIGEgZmllbGQgZGVjbGFyYXRpb24KKworPGEgbmFtZT0idl84NDkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE02IC0gTWFyY2ggMjcsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODQ5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg0OSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzg3OCI+MjIzODc4PC9hPgorW2NvbnRlbnQgYXNzaXN0XSBJbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbiBmcm9tIGNvbnRlbnQgYXNzaXN0CisKKzxhIG5hbWU9InZfODQ4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIE1hcmNoIDI2LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg0OAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NDgiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjI1MzQiPjIyMjUzNDwvYT4KK1tjb21waWxlcl0gd3JvbmcgZmllbGQgaGlkZXMgZmllbGQgd2FybmluZyBmb3IgcHJpdmF0ZSBmaWVsZHMKKworPGEgbmFtZT0idl84NDciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE02IC0gTWFyY2ggMjUsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODQ3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg0NyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPjxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSkFWQURPQ19UQUdfREVTQ1JJUFRJT05fQUxMX1RBR1M8L2NvZGU+IGludHJvZHVjZWQgaW4gMy40TTMgaGFzIGJlZW4gcmVuYW1lZCB0byAKKyAgICAgPGNvZGU+Q09NUElMRVJfUEJfTUlTU0lOR19KQVZBRE9DX1RBR19ERVNDUklQVElPTl9BTExfU1RBTkRBUkRfVEFHUzwvY29kZT4uPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzODM4Ij4yMjM4Mzg8L2E+CitbZG9tXSBBbm5vdGF0aW9uQmluZGluZy5pc1JlY292ZXJlZCgpIGFsd2F5cyByZXR1cm4gZmFsc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjEyNjciPjIyMTI2NzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBtaXNzaW5nIGFubm90YXRpb24gYmluZGluZ3Mgb24gaW50ZXJmYWNlIG1ldGhvZCBwYXJhbWV0ZXIKKworPGEgbmFtZT0idl84NDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE02IC0gTWFyY2ggMjMsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODQ2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg0NiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSBiYXRjaCBjb21waWxlciBub3cgdXNlcyB0aGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4gY2xhdXNlIG9mIGphciBmaWxlcyAKKyAgICBtYW5pZmVzdHMgdG8gY29tcGxldGUgdGhlIGNsYXNzcGF0aC4gRm9yIGphciBmaWxlcyB0aGF0IGFyZSBzcGVjaWZpZWQgb24gYQorICAgIDxjb2RlPi1jbGFzc3BhdGg8L2NvZGU+IG9wdGlvbiwgdGhlIGNvbXBpbGVyIGZvbGxvd3MgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4KKyAgICBjbGF1c2VzIHJlY3Vyc2l2ZWx5IGFuZCBhcHBlbmRzIGVhY2ggcmVmZXJlbmNlZCBqYXIgZmlsZSB0byB0aGUgZW5kIG9mIHRoZSAKKyAgICBjbGFzc3BhdGgsIHByb3ZpZGVkIGl0IGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoIHlldC4gU2VlIGJ1ZworICAgIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzMyIj45NzMzMjwvYT4gZm9yCisgICAgZnVydGhlciBkZXRhaWxzLjwvbGk+Cis8bGk+QWRkZWQgQVBJcyB0byBjYWxsIHRoZSBiYXRjaCBjb21waWxlciBmcm9tIGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb246CisJIDxjb2RlPkJhdGNoQ29tcGlsZXIjY29tcGlsZXIoU3RyaW5nLCBQcmludFdyaXRlciwgUHJpbnRXcml0ZXIsIENvbXBpbGF0aW9uUHJvZ3Jlc3MpPC9jb2RlPiBhbmQKKwkgPGNvZGU+QmF0Y2hDb21waWxlciNjb21waWxlcihTdHJpbmdbXSwgUHJpbnRXcml0ZXIsIFByaW50V3JpdGVyLCBDb21waWxhdGlvblByb2dyZXNzKTwvY29kZT4uCisJIFNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTcyMzMiPjIxNzIzMzwvYT4gZm9yIG1vcmUgZGV0YWlscy48L2xpPgorPGxpPkFsbCBzZWFyY2ggcmVmZXJlbmNlIG1hdGNoZXMgbWF5IG5vdyBoYXZlIGEgbG9jYWwgZWxlbWVudC4gQ2xpZW50cyBjYW4gYWNjZXNzCit0aGlzIGxvY2FsIGVsZW1lbnQgdXNpbmcgdGhlIDxjb2RlPmdldExvY2FsRWxlbWVudCgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIG5ldworPGNvZGU+UmVmZXJlbmNlTWF0Y2g8L2NvZGU+IEFQSSBjbGFzczo8cHJlPgorCisvKioKKyAqIEFuIGFic3RyYWN0IEphdmEgc2VhcmNoIG1hdGNoIHRoYXQgcmVwcmVzZW50cyBhIHJlZmVyZW5jZS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKgorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmZXJlbmNlTWF0Y2ggZXh0ZW5kcyBTZWFyY2hNYXRjaCB7CisuLi4KKy8qKgorICogUmV0dXJucyB0aGUgbG9jYWwgZWxlbWVudCBvZiB0aGlzIHNlYXJjaCBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAqIEEgbG9jYWwgZWxlbWVudCBpcyB0aGUgaW5uZXIgbW9zdCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBhbmQgdGhhdCBpcyBub3QKKyAqIHJlYWNoYWJsZSBieSBuYXZpZ2F0aW5nIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHtAbGluayBJSmF2YU1vZGVsfSB1c2luZyAKKyAqIHtAbGluayBJUGFyZW50I2dldENoaWxkcmVuKCl9LgorICoKKyAqIEtub3duIGVsZW1lbnQgdHlwZXMgZm9yIGxvY2FsIGVsZW1lbnRzIGFyZSB7QGxpbmsgSUphdmFFbGVtZW50I0FOTk9UQVRJT059LCAKKyAqIHtAbGluayBJSmF2YUVsZW1lbnQjTE9DQUxfVkFSSUFCTEV9IGFuZCB7QGxpbmsgSUphdmFFbGVtZW50I1RZUEVfUEFSQU1FVEVSfS4KKyAqIEhvd2V2ZXIgY2xpZW50cyBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoaXMgc2V0IG9mIGVsZW1lbnQgdHlwZXMgaXMgY2xvc2VkIGFzCisgKiBvdGhlciB0eXBlcyBvZiBlbGVtZW50cyBtYXkgYmUgcmV0dXJuZWQgaW4gdGhlIGZ1dHVyZSwgZS5nLiBpZiBuZXcgdHlwZXMKKyAqIG9mIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiB0aGUgSmF2YSBtb2RlbC4gQ2xpZW50cyBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUKKyAqIHtAbGluayBJSmF2YUVsZW1lbnQjZ2V0UGFyZW50KCkgcGFyZW50fSBjaGFpbiBvZiB0aGlzIGxvY2FsIGVsZW1lbnQgZXZlbnR1YWxseSBsZWFkcyAKKyAqIHRvIHRoZSBlbGVtZW50IGZyb20ge0BsaW5rICNnZXRFbGVtZW50KCl9LgorICoKKyAqIFRoZSBsb2NhbCBlbGVtZW50IGJlaW5nIGFuIHtAbGluayBJQW5ub3RhdGlvbn0gaXMgdGhlIG1vc3QgdXNhbCBjYXNlLiBGb3IgZXhhbXBsZSwKKyAqCisgKiAgICAuIHNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIG1ldGhvZCA8Y29kZT5Bbm5vdC5jbGF6eigpPC9jb2RlPiBpbgorICogCisgKiAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdCB7CisgKiAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7CisgKiAgICAgICAgICAgICAgICAgICAgIEBBbm5vdChjbGF6ej1UZXN0LmNsYXNzKSBpbnQgeDsKKyAqICAgICAgICAgICAgICAgICB9CisgKiAgICAgICAgICAgICB9CisgKiAKKyAqICAgICAgd2lsbCByZXR1cm4gb25lIHtAbGluayBNZXRob2RSZWZlcmVuY2VNYXRjaH0gbWF0Y2ggd2hvc2UgbG9jYWwgZWxlbWVudAorICogICAgICBpcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSAnPGNvZGU+QW5ub3Q8L2NvZGU+Jy4KKyAqCisgKiAgICAuIHNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+RGVwcmVjYXRlZDwvY29kZT4gaW4KKyAqIAorICogICAgICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgICAgQERlcHJlY2F0ZWQgdm9pZCBtZXRob2QoKSB7fQorICogICAgICAgICAgICAgfQorICogCisgKiAgICAgIHdpbGwgcmV0dXJuIG9uZSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAgICAgIGlzIHRoZSB7QGxpbmsgSUFubm90YXRpb259ICc8Y29kZT5EZXByZWNhdGVkPC9jb2RlPicuCisgKgorICogICAgLiBzZWFyY2hpbmcgZm9yIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBmaWVsZCA8Y29kZT5DT05TVDwvY29kZT4gaW4KKyAqIAorICogICAgICAgICAgICAgIEBOdW0obnVtYmVyPSBOdW0uQ09OU1QpCisgKiAgICAgICAgICAgICAgQGludGVyZmFjZSBOdW0geworICogICAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVD0gNDI7CisgKiAgICAgICAgICAgICAgICAgIGludCBudW1iZXIoKTsKKyAqICAgICAgICAgICAgICB9CisgKiAKKyAqICAgICAgd2lsbCByZXR1cm4gb25lIHtAbGluayBGaWVsZFJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAgICAgIGlzIHRoZSB7QGxpbmsgSUFubm90YXRpb259ICc8Y29kZT5OdW08L2NvZGU+Jy4KKyAqCisgKiBBIGxvY2FsIGVsZW1lbnQgbWF5IGFsc28gYmUgYSB7QGxpbmsgSUxvY2FsVmFyaWFibGV9IHdob3NlIHR5cGUgaXMgdGhlIHJlZmVyZW5jZWQgdHlwZS4gRm9yIGV4YW1wbGUsCisgKgorICogICAgLiBzZWFyY2hpbmcgZm9yIHRoZSByZWZlcmVuY2VzIHRvIHRoZSB0eXBlIDxjb2RlPlRlc3Q8L2NvZGU+IGluCisgKiAKKyAqICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgICAgICBUZXN0IGxvY2FsOworICogICAgICAgICAgICAgfQorICogICAgICAgICB9CisgKiAKKyAqICAgICAgd2lsbCByZXR1cm4gb25lIHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoIHdob3NlIGxvY2FsIGVsZW1lbnQKKyAqICAgICAgaXMgdGhlIHtAbGluayBJTG9jYWxWYXJpYWJsZX0gJzxjb2RlPmxvY2FsPC9jb2RlPicuCisgKgorICogT3IgYSBsb2NhbCBlbGVtZW50IG1heSBiZSBhbiB7QGxpbmsgSVR5cGVQYXJhbWV0ZXJ9IHRoYXQgZXh0ZW5kcyB0aGUgcmVmZXJlbmNlZCB0eXBlLiBGb3IgZXhhbXBsZSwKKyAqCisgKiAgICAuIHNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+VGVzdDwvY29kZT4gaW4gCisgKiAKKyAqICAgICAgICAgcHVibGljIGNsYXNzIFgmbHQ7VCBleHRlbmRzIFRlc3QmZ3Q7IHsKKyAqICAgICAgICAgfQorICogCisgKiAgICAgIHdpbGwgcmV0dXJuIG9uZSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAgICAgIGlzIHRoZSB7QGxpbmsgSVR5cGVQYXJhbWV0ZXJ9ICc8Y29kZT5UPC9jb2RlPicuCisgKiAKKyAqIEByZXR1cm4gdGhlIGxvY2FsIGVsZW1lbnQgb2YgdGhpcyBzZWFyY2ggbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgKiAKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRMb2NhbEVsZW1lbnQoKSB7CisJcmV0dXJuIG51bGw7Cit9Cis8L3ByZT4KK1NlZSA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5OTk2Ij5idWcgMjA5OTk2PC9hPgorZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+CisKKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5OTk2Ij4yMDk5OTY8L2E+Citbc2VhcmNoXSBBZGQgYSB3YXkgdG8gYWNjZXNzIHRoZSBtb3N0IGxvY2FsIGVuY2xvc2luZyBhbm5vdGF0aW9uIGZvciByZWZlcmVuY2Ugc2VhcmNoIG1hdGNoZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjI5MDIiPjIyMjkwMjwvYT4KK1tKYXZhZG9jXSBNaXNzaW5nIGRlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgd2FybmVkIGluIHNvbWUgY2FzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTcyMzMiPjIxNzIzMzwvYT4KK1tjb21waWxlcl0gQWRkIGNvbXBpbGVyIEFQSSB0byBjYWxsIHRoZSBiYXRjaCBjb21waWxlciBmcm9tIGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjM0OTUiPjIyMzQ5NTwvYT4KK1thc3Npc3RdIE1lbWJlciB0eXBlcyBvZiBtaXNzaW5nIHBhcmFtZXRyaXplZCB0eXBlcyBhcmUgbm90IHByb3Bvc2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzNDc5Ij4yMjM0Nzk8L2E+CitbYXNzaXN0XSBNZW1iZXIgdHlwZXMgb2YgbWlzc2luZyB0eXBlcyBhcmUgbm90IHByb3Bvc2VkIGluIGNsYXNzIGJvZHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjMyNTMiPjIyMzI1MzwvYT4KK05QRSBpbiBUeXBlQmluZGluZy5nZXROYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzMzYwIj4yMjMzNjA8L2E+Citbc2VhcmNoXSBIdWdlIGVycm9yIG1lc3NhZ2UgaWYgT09NRSB3aGlsZSBidWlsZGluZyB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjIyMTMiPjIyMjIxMzwvYT4KK0phdmEgbW9kZWwgbm90IHVwZGF0ZWQgYWZ0ZXIgcXVpY2sgZml4ICdBZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzMyIj45NzMzMjwvYT4KK1tjb21waWxlcl0gQWRkIHN1cHBvcnQgZm9yIGNsYXNzcGF0aCBzcGVjaWZpZWQgaW4gbWFuaWZlc3QgZmlsZSBpbnNpZGUgYSBqYXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg4MjQiPjIxODgyNDwvYT4KK1tET00vQVNUXSBpbmNvcnJlY3QgY29kZSBsZWFkcyB0byBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZHVyaW5nIEFTVCBjcmVhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzIxMSI+MTgzMjExPC9hPgorWzEuNV1bY29tcGlsZXJdIHNpbmdsZSBzdGF0aWMgaW1wb3J0IGZvciBhIGZpZWxkIGlzIGFtYmlndW91cworCis8YSBuYW1lPSJ2Xzg0NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTYgLSBNYXJjaCAxOCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NDUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODQ1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgbmV3IEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSNnZXRPcHRpb25Gb3JDb25maWd1cmFibGVTZXZlcml0eShpbnQpPC9jb2RlPgorICAgIHRvIGxpbmsgYmFjayBwcm9ibGVtIElEcyB0byBvcHRpb25zIHRoYXQgY29uZmlndXJlIHByb2JsZW1zOjxicj4KKzxwcmU+CisJLyoqCisJICogUmV0dXJucyB0aGUgb3B0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBzZXZlcml0eSBvZiB0aGUgCisJICogY29tcGlsZXIgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHByb2JsZW1JRCBpZiBhbnksIG51bGwgb3RoZXJ3aXNlLiBOb24tbnVsbCAKKwkgKiByZXR1cm4gdmFsdWVzIGFyZSB0YWtlbiBmcm9tIHRoZSBjb25zdGFudHMgZGVmaW5lZCBieSB0aGlzIGNsYXNzIHdob3NlIAorCSAqIG5hbWVzIHN0YXJ0IHdpdGggQ09NUElMRVJfUEIgYW5kIGZvciB3aGljaCB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAKKwkgKiBvcHRpb24gYXJlIGRlZmluZWQgYnkgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0uIEEgbnVsbCByZXR1cm4gCisJICogdmFsdWUgbWVhbnMgdGhhdCB0aGUgcHJvdmlkZWQgcHJvYmxlbSBJRCBpcyB1bmtub3duIG9yIHRoYXQgaXQgbWF0Y2hlcyAKKwkgKiBhIHByb2JsZW0gd2hvc2Ugc2V2ZXJpdHkgY2Fubm90IGJlIGNvbmZpZ3VyZWQuCisJICogQHBhcmFtIHByb2JsZW1JRCBvbmUgb2YgdGhlIHByb2JsZW0gSURzIGRlZmluZWQgYnkge0BsaW5rIElQcm9ibGVtfQorCSAqIEByZXR1cm4gdGhlIG9wdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIAorCSAqICAgICAgICAgY29tcGlsZXIgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHByb2JsZW1JRCBpZiBhbnksIG51bGwgb3RoZXJ3aXNlCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wdGlvbkZvckNvbmZpZ3VyYWJsZVNldmVyaXR5KGludCBwcm9ibGVtSUQpIHsuLi59Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjM5OSI+MjIyMzk5PC9hPgorUmVncmVzc2lvbiBpbiBzZXZlcmFsIE1vZGVsIHBlcmZvcm1hbmNlIHRlc3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNjgwIj4yMjE2ODA8L2E+CitDbGFzc3BhdGggZ2V0cyByZXNldCByYW5kb21seSBpbiBoZWFkbGVzcyBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyNDU4Ij4yMjI0NTg8L2E+CitJVHlwZSNnZXRGdWxseVF1YWxpZmllZFBhcmFtZXRlcml6ZWROYW1lKCkgaXMgdW5kZXJzcGVjaWZpZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE3MjMiPjIyMTcyMzwvYT4KK092ZXJyaWRlIG1ldGhvZCBmYWlscyB3aXRoIGFuZCBlcnJvciBzYXlpbmcgJnF1b3Q7MSZxdW90OyBkdWUgdG8gYSBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODYwMyI+MjE4NjAzPC9hPgorW2FwaV0gcHJvdmlkZSBhIG1hcHBpbmcgZnJvbSBwcm9ibGVtIGlkIHRvIHByZWZlcmVuY2Uga2V5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5NjI1Ij4yMTk2MjU8L2E+CitbMS41XVtjb21waWxlcl0gR2VuZXJpY3MgcmVsYXRlZCBBYnN0cmFjdE1ldGhvZEVycm9yIHRoYXQgaXMgbm90IGdpdmVuIGJ5IFN1biBKYXZhCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2OTMwIj4yMTY5MzA8L2E+CitbMS41XVtjb21waWxlcl0gV3JvbmcgY29tcGlsZXIgZXJyb3Igd2hlbiB1c2luZyBzdGF0aWMgbWV0aG9kIHdpdGggc2FtZSBzaWduYXR1cmUgYXMgbm9uIHN0YXRpYyBvbmUgYnV0IHdpdGggdmFyaWFibGUgYXJndW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyNDU3Ij4yMjI0NTc8L2E+CitKYXZhZG9jIGZpeGVzIGZvciBJVHlwZSNnZXQqUXVhbGlmaWVkTmFtZSgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyMDgwIj4yMjIwODA8L2E+CitbYXNzaXN0XSBXcm9uZyBwcm9wb3NhbHMgb3JkZXIgd2hlbiBjb21wbGV0aW5nIG9uIGFuIGl0ZW0gb2YgYW4gYXJyYXkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjIxODIiPjIyMjE4MjwvYT4KK1tmb3JtYXR0ZXJdIEFJT09CIGluIFV0aWwuZ2V0TGluZU51bWJlcihVdGlsLmphdmE6NDM4KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjE2OCI+MTU2MTY4PC9hPgorW21vZGVsXSB0eXBlIHNlcGFyYXRvciBpcyBpZ25vcmVkIGluIEJpbmFyeVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpCisKKzxhIG5hbWU9InZfODQ0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIE1hcmNoIDExLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg0NAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NDQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5Db2RlQXNzaXN0OiBBZGRlZCBuZXcgQVBJIHRvIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb21wbGV0aW9uIGNvbnRleHQ6PGJyPgorPHVsPgorPGxpPkNvbXBsZXRpb25Db250ZXh0I2dldEVuY2xvc2luZ0VsZW1lbnQoKSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgSmF2YSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLgorPHByZT4KK3B1YmxpYyBjbGFzcyBYIHsKKwl2b2lkIGZvbygpIHsKKwkJenp6fCAvLyBjdHJsK3NwYWNlIGF0IHwgbG9jYXRpb24KKwl9Cit9Cis8L3ByZT4KKzxjb2RlPmdldEVuY2xvc2luZ0VsZW1lbnQoKTwvY29kZT4gcmV0dXJucyB0aGUgSU1ldGhvZCBuYW1lZCBmb28uCis8L2xpPgorPGxpPkNvbXBsZXRpb25Db250ZXh0I2dldFZpc2libGVFbGVtZW50cyhTdHJpbmcpIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLgorPHByZT4KK3B1YmxpYyBjbGFzcyBYIHsKKwlwLlkgZjE7CisJcC5aIGYyOworCXZvaWQgZm9vKCkgeworCQlwLlkgbDE7CisJCXAuWiBsMjsKKwkJenp6fCAvLyBjdHJsK3NwYWNlIGF0IHwgbG9jYXRpb24KKwl9Cit9Cis8L3ByZT4KKzxjb2RlPmdldFZpc2libGVFbGVtZW50cygiTHAvWjsiKTwvY29kZT4gcmV0dXJucyB0aGUgSUZpZWxkIG5hbWVkIGYyIGFuZCB0aGUgSUxvY2FsVmFyaWFibGUgbmFtZSBsMi4KKzwvbGk+Cis8L3VsPgorCis8cHJlPgorcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3IgeworCS4uLgorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJlcXVlc3RvciByZXF1aXJlcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqIAorCSAqIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVxdWVzdG9yIHJlcXVpcmVzIGFuIGV4dGVuZGVkIGNvbnRleHQuCisJICogCisJICogQHNlZSBDb21wbGV0aW9uQ29udGV4dCNpc0V4dGVuZGVkKCkKKwkgKiAKKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHRlbmRlZENvbnRleHRSZXF1aXJlZCgpIHsuLi59CisJCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgcmVxdWVzdG9yIHJlcXVpcmVzIGFuIGV4dGVuZGVkIGNvbnRleHQuCisJICogCisJICogQHBhcmFtIHJlcXVpcmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXF1ZXN0b3IgcmVxdWlyZXMgYW4gZXh0ZW5kZWQgY29udGV4dC4KKwkgKiAKKwkgKiBAc2VlIENvbXBsZXRpb25Db250ZXh0I2lzRXh0ZW5kZWQoKQorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlRXh0ZW5kZWRDb250ZXh0KGJvb2xlYW4gcmVxdWlyZSkgey4uLn0KKwkKKwkuLi4KK30KKyA8L3ByZT4KKyA8cHJlPgorcHVibGljIGNsYXNzIENvbXBsZXRpb25Db250ZXh0IHsKKwkuLi4KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21wbGV0aW9uIGNvbnRleHQgaXMgYW4gZXh0ZW5kZWQgY29udGV4dC4KKwkgKiBTb21lIG1ldGhvZHMgb2YgdGhpcyBjb250ZXh0IGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhpcyBjb250ZXh0IGlzIGFuIGV4dGVuZGVkIGNvbnRleHQgYnV0IGFuIGV4dGVuZGVkIGNvbnRleHQgY29uc3VtZXMgbW9yZSBtZW1vcnkuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbXBsZXRpb24gY29udGV4dCBpcyBhbiBleHRlbmRlZCBjb250ZXh0LgorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZGVkKCkgey4uLn0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIEphdmEgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgY29tcGxldGlvbiBsb2NhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgY2Fubm90IGJlIGNvbXB1dGVkLgorCSAqIFRoZSByZXR1cm5lZCBKYXZhIGVsZW1lbnQgYW5kIGFsbCBKYXZhIGVsZW1lbnRzIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgd2hpY2ggY2FuIGJlIG5hdmlnYXRlZCB0byBmcm9tIHRoZSByZXR1cm5lZCBKYXZhIGVsZW1lbnQgYXJlIHNwZWNpYWwgSmF2YSBlbGVtZW50czoKKwkgKgorCSAqIC0gdGhleSBhcmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGJ1ZmZlciwgdGhleSBhcmUgbm90IHRoZSByZXN1bHQgb2YgYSByZWNvbmNpbGUgb3BlcmF0aW9uCisJICogLSB0aGV5IGFyZSBub3QgdXBkYXRlZCBpZiB0aGUgYnVmZmVyIGNoYW5nZXMuCisJICogLSB0aGV5IGRvIG5vdCBjb250YWluIGxvY2FsIHR5cGVzIHdoaWNoIGFyZSBub3QgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLgorCSAqIC0gdGhleSBkbyBub3QgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCBjYXRlZ29yaWVzLiB7QGxpbmsgSU1lbWJlciNnZXRDYXRlZ29yaWVzKCl9IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5CisJICogCisJICogUmVhc29ucyBmb3IgcmV0dXJuaW5nIDxjb2RlPm51bGw8L2NvZGU+IGluY2x1ZGU6CisJICogCisJICogLSB0aGUgY29tcGlsYXRpb24gdW5pdCBubyBsb25nZXIgZXhpc3RzCisJICogLSB0aGUgY29tcGxldGlvbiBvY2N1cnJlZCBpbiBhIGJpbmFyeSB0eXBlLiBIb3dldmVyIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgYmUgcmVsYXhlZCBpbiB0aGUgZnV0dXJlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgSmF2YSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBjYW5ub3QgYmUgY29tcHV0ZWQuCisJICogCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY29udGV4dCBpcyBub3QgYW4gZXh0ZW5kZWQgY29udGV4dAorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IGdldEVuY2xvc2luZ0VsZW1lbnQoKSB7Li4ufQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIHZpc2libGUgZnJvbSB0aGUgY29tcGxldGlvbiBsb2NhdGlvbiBhbmQgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiB0eXBlLgorCSAqIEFuIGVsZW1lbnQgaXMgYXNzaWduYWJsZSBpZiBpdHMgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZQorCSAqIG9mIHRoZSBnaXZlbiB0eXBlLCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA1LjIgb2YgPGVtPlRoZSBKYXZhIExhbmd1YWdlCisJICogU3BlY2lmaWNhdGlvbiwgVGhpcmQgRWRpdGlvbjwvZW0+IChKTFMzKS4KKwkgKiBBIHZpc2libGUgZWxlbWVudCBpcyBlaXRoZXI6CisJICoKKwkgKiAtIGEge0BsaW5rIElMb2NhbFZhcmlhYmxlfSAtIHRoZSBlbGVtZW50IHR5cGUgaXMge0BsaW5rIElMb2NhbFZhcmlhYmxlI2dldFR5cGVTaWduYXR1cmUoKX0KKwkgKiAtIGEge0BsaW5rIElGaWVsZH0gLSB0aGUgZWxlbWVudCB0eXBlIGlzIHtAbGluayBJRmllbGQjZ2V0VHlwZVNpZ25hdHVyZSgpfQorCSAqIC0gYSB7QGxpbmsgSU1ldGhvZH0gLSB0aGUgZWxlbWVudCB0eXBlIGlzIHtAbGluayBJTWV0aG9kI2dldFJldHVyblR5cGUoKX0KKwkgKiAKKwkgKiBSZXR1cm5lZCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjb21wbGV0ZWQgY29tcGlsYXRpb24gdW5pdCBhcmUgc3BlY2lhbCBKYXZhIGVsZW1lbnRzOgorCSAqIAorCSAqIC0gdGhleSBhcmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGJ1ZmZlciwgdGhleSBhcmUgbm90IHRoZSByZXN1bHQgb2YgYSByZWNvbmNpbGUgb3BlcmF0aW9uCisJICogLSB0aGV5IGFyZSBub3QgdXBkYXRlZCBpZiB0aGUgYnVmZmVyIGNoYW5nZXMuCisJICogLSB0aGV5IGRvIG5vdCBjb250YWluIGxvY2FsIHR5cGVzIHdoaWNoIGFyZSBub3QgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uLgorCSAqIC0gdGhleSBkbyBub3QgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCBjYXRlZ29yaWVzLiB7QGxpbmsgSU1lbWJlciNnZXRDYXRlZ29yaWVzKCl9IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5CisJICogCisJICogTm90ZSB0aGUgYXJyYXkgY2FuIGJlIGVtcHR5IGlmOgorCSAqCisJICogLSB0aGUgY29tcGlsYXRpb24gdW5pdCBubyBsb25nZXIgZXhpc3RzCisJICogLSB0aGUgY29tcGxldGlvbiBvY2N1cnJlZCBpbiBhIGJpbmFyeSB0eXBlLiBIb3dldmVyIHRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgYmUgcmVsYXhlZCBpbiB0aGUgZnV0dXJlLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlU2lnbmF0dXJlIGVsZW1lbnRzIHdoaWNoIGNhbiBiZSBhc3NpZ25lZCB0byB0aGlzIHR5cGUgYXJlIHJldHVybmVkLgorCSAqIAkJSWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlcmUgaXMgbm8gY29uc3RyYWludCBvbiB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgZWxlbWVudHMuCisJICogCisJICogQHJldHVybiBlbGVtZW50cyB3aGljaCBhcmUgdmlzaWJsZSBmcm9tIHRoZSBjb21wbGV0aW9uIGxvY2F0aW9uIGFuZCB3aGljaCBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIHR5cGUuCisJICogCisJICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY29udGV4dCBpcyBub3QgYW4gZXh0ZW5kZWQgY29udGV4dAorCSAqIAorCSAqIEBzZWUgI2lzRXh0ZW5kZWQoKQorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0VmlzaWJsZUVsZW1lbnRzKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Li4ufQorCQorCS4uLgorfQorIDwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxMjY2Ij4yMjEyNjY8L2E+CitCYWQgc3ludGF4IGVycm9yIHJlcG9ydCBvbiBzdHJpbmcgbGl0ZXJhbHMgY29udGFpbmluZyBlc2NhcGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNDcwIj4yMDI0NzA8L2E+CitbYXNzaXN0XSBwcm92aWRlIGFsbCBlbGVtZW50cyB0aGF0IGFyZSB2aXNpYmxlCisKKzxhIG5hbWU9InZfODQzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIE1hcmNoIDUsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODQzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg0MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIG5ldyBjb21waWxlciBvcHRpb24gdG8gY29udHJvbCB3aGV0aGVyIEV4Y2VwdGlvbiBhbmQgVGhyb3dhYmxlIGFyZQorICAgIGNvbnNpZGVyZWQgb3Igbm90IHdoaWxlIHJlcG9ydGluZyB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbnMuCis8cHJlPgorICogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgVW51c2VkIERlY2xhcmVkIFRocm93biBFeGNlcHRpb24gRXhlbXB0cyBFeGNlcHRpb24gQW5kIFRocm93YWJsZS4KKyAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYSAKKyAqICAgIG1ldGhvZCBvciBhIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmluZyBhIGNoZWNrZWQgZXhjZXB0aW9uIGVsc2UgdGhhbgorICogICAgamF2YS5sYW5nLlRocm93YWJsZSBvciBqYXZhLmxhbmcuRXhjZXB0aW9uIGFzIHRocm93biwKKyAqICAgIGJ1dCBpdHMgYm9keSBhY3R1YWxseSByYWlzZXMgbmVpdGhlciB0aGF0IGV4Y2VwdGlvbiwgbm9yIGFueSBvdGhlciAKKyAqICAgIGV4Y2VwdGlvbiBleHRlbmRpbmcgaXQuIFdoZW4gZGlzYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIAorICogICAgZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gYSBtZXRob2Qgb3IgYSBjb25zdHJ1Y3RvciBpcyBkZWNsYXJpbmcgYSAKKyAqICAgIGNoZWNrZWQgZXhjZXB0aW9uIChpbmNsdWRpbmcgamF2YS5sYW5nLlRocm93YWJsZSBhbmQgCisgKiAgICBqYXZhLmxhbmcuRXhjZXB0aW9uKSBhcyB0aHJvd24sIGJ1dCBpdHMgYm9keSBhY3R1YWxseSByYWlzZXMgCisgKiAgICBuZWl0aGVyIHRoYXQgZXhjZXB0aW9uLCBub3IgYW55IG90aGVyIGV4Y2VwdGlvbiBleHRlbmRpbmcgaXQuIAorICogICAgVGhlIHNldmVyaXR5IG9mIHRoZSB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBwcm9ibGVtIGlzIAorICogICAgY29udHJvbGxlZCB3aXRoIG9wdGlvbiBDT01QSUxFUl9QQl9VTlVTRURfREVDTEFSRURfVEhST1dOX0VYQ0VQVElPTi4KKyAqICAgIFRoaXMgZGlhZ25vc3RpYyBpcyBmdXJ0aGVyIHR1bmVkIGJ5IG9wdGlvbnMKKyAqICAgIENPTVBJTEVSX1BCX1VOVVNFRF9ERUNMQVJFRF9USFJPV05fRVhDRVBUSU9OX0lOQ0xVREVfRE9DX0NPTU1FTlRfUkVGRVJFTkNFCisgKiAgICBhbmQgQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT05fV0hFTl9PVkVSUklESU5HLgorICoKKyAqICAgIE9wdGlvbiBpZDogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGUiCisgKiAgICBQb3NzaWJsZSB2YWx1ZXM6IHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKyAqICAgIERlZmF1bHQ6ICJlbmFibGVkIgorIDwvcHJlPgorKG5vdGUgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgdW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb24gaGFzIGJlZW4KK2FtZW5kZWQgYWNjb3JkaW5nbHksIGFuZCB0aGF0IGFub3RoZXIgb3B0aW9uIHRoYXQgaGFkIGJlZW4gYWRkZWQgaW4gMy40TTUgYnV0CituZXZlciBzdXJmYWNlZCBpbiB0aGUgSURFIGhhcyBiZWVuIHdpdGhkcmF3bjsgc2VlIAorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTQ2MSI+YnVnIDIxOTQ2MTwvYT4KK2ZvciBkZXRhaWxzKQorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxMjE1Ij4yMjEyMTU8L2E+CitbYXNzaXN0XSBOUEUgaW4gcHJvYmxlbSByZXBvcnRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTQ2MSI+MjE5NDYxPC9hPgorW2NvbXBpbGVyXVtvcHRpb25zXSBMaW1pdCB3YXJuaW5nIGZvciB1bmVjZXNzYXJ5IHVuY2hlY2tlZCBleGNlcHRpb25zIHRvIFRocm93YWJsZSBhbmQgRXhjZXB0aW9uCisKKzxhIG5hbWU9InZfODQyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIE1hcmNoIDQsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODQyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzg0MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIG9uZSBuZXcgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHM8L2NvZGU+IGZpbmUgZ3JhaW5lZCBzZWFyY2ggQVBJCitjb25zdGFudCB0byByZWR1Y2UgdGhlIHNlYXJjaCB0byB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiB0aGUgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4KK3BhdHRlcm4gKHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjExMzAiPmJ1ZyAyMjExMzA8L2E+KToKKzxwcmU+CisvKioKKyAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGFuIGluc3RhbmNlIG9mLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBJTlNUQU5DRU9GX1RZUEVfUkVGRVJFTkNFID0gMHgxMDAwMDA7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTExMCI+MjIxMTEwPC9hPgorW3NlYXJjaF0gTlBFIGF0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZUxvb2t1cFRhYmxlLnJlbW92ZUtleQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTEzMCI+MjIxMTMwPC9hPgorW3NlYXJjaF0gTm8gZmluZS1ncmFpbiBzZWFyY2ggZm9yIGluc3RhbmNlb2YgY3JpdGVyaWEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjA1NjUiPjIyMDU2NTwvYT4KK2FkYXB0IHRvIG5ldyBBUEkgSUNvbXBpbGF0aW9uVW5pdC5hcHBseUVkaXRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5OTM3Ij4yMTk5Mzc8L2E+CitKYXZhZG9jIGNvbnRlbnQgYXNzaXN0IGRvZXMgbm90IHByb3Bvc2UgbWV0aG9kIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzI2MiI+MTY3MjYyPC9hPgorWzEuNV1bY29tcGlsZXJdIEBPdmVycmlkZSBzcGVjaWZpY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIwOTY3Ij4yMjA5Njc8L2E+CitbY29tcGlsZXJdIEV4dHJhIHNlY29uZGFyeSBlcnJvciBpbiBwcmVzZW5jZSBvZiBtaXNzaW5nIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjA4MTEiPjIyMDgxMTwvYT4KK05QRSB0cnlpbmcgdG8gdXBkYXRlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTg0MSI+MjE1ODQxPC9hPgorW3NlYXJjaF0gT3BlbmluZyBUeXBlIEhpZXJhcmNoeSBleHRyZW1lbHkgc2xvdworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMDU0MiI+MjIwNTQyPC9hPgorVHJhaWxpbmcgc2VwYXJhdG9yIGluIGNsYXNzcGF0aCBlbnRyeSBsb3N0CisKKzxhIG5hbWU9InZfODQxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIEZlYnJ1YXJ5IDI3LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzg0MQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84NDEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgQVBJIGFkZGVkIG9uIElDb21waWxhdGlvblVuaXQgdG8gYXBwbHkgdGV4dCBlZGl0cyB0byBpdHMgYnVmZmVyLiAKKzxwcmU+CitwdWJsaWMgaW50ZXJmYWNlIElDb21waWxhdGlvblVuaXQgeworCS4uLgorCQorICAgLyoqCisgICAgKiBBcHBsaWVzIGEgdGV4dCBlZGl0IHRvIHRoZSBjb21waWxhdGlvbiB1bml0J3MgYnVmZmVyLiAKKyAgICAqIAorICAgICogQHBhcmFtIGVkaXQgdGhlIGVkaXQgdG8gYXBwbHkKKyAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICogICAgICAgICAgICAgICAgbm8gcHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgKiBAcmV0dXJuIHRoZSB1bmRvIGVkaXQgCisgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVkaXQgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb24gdW5pdCdzIGJ1ZmZlci4gUmVhc29ucyBpbmNsdWRlOgorICAgICogVGhpcyBjb21waWxhdGlvbiB1bml0IGRvZXMgbm90IGV4aXN0CisgICAgKiAoe0BsaW5rIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjRUxFTUVOVF9ET0VTX05PVF9FWElTVH0pLgorICAgICogVGhlIHByb3ZpZGVkIGVkaXQgY2FuIG5vdCBiZSBhcHBsaWVkIGFzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZQorICAgICogdGV4dCBlZGl0IGxvY2F0aW9ucyAoe0BsaW5rIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjQkFEX1RFWFRfRURJVF9MT0NBVElPTn0pLgorICAgICogCisgICAgKiBAc2luY2UgMy40CisgICAgKi8KKyAgICBwdWJsaWMgVW5kb0VkaXQgYXBwbHlUZXh0RWRpdChUZXh0RWRpdCBlZGl0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisgICAgLi4uCit9Cis8L3ByZT4KK0ltcGxlbWVudG9ycyBvZiBJQnVmZmVyIGNhbiBub3cgYWRkaXRpb25hbGx5IGltcGxlbWVudCA8Y29kZT5JQnVmZmVyLklUZXh0RWRpdENhcGFiaWxpdHk8L2NvZGU+CithbmQgcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIDxjb2RlPmFwcGx5VGV4dEVkaXQ8L2NvZGU+LiBDYWxscyB0byA8Y29kZT5JQ29tcGlsYXRpb25Vbml0LmFwcGx5VGV4dEVkaXQ8L2NvZGU+Cit3aWxsIHRoZW4gYmUgZm9yd2FyZGVkIHRvIHRoaXMgQVBJLgorPC9saT4KKzxsaT5Db21waWxlciBpcyBub3cgYWxzbyBhYmxlIHRvIHJlY292ZXIgbWlzc2luZyBwYXJhbWV0ZXJpemVkIHR5cGVzIChlLmcuIDxjb2RlPlpvcmsmbHQ7U3RyaW5nJmd0OzwvY29kZT4pLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NjIwMCI+MTk2MjAwPC9hPgorW2pzcjI2OV0gTmVlZCBhbm5vdGF0aW9uIGJpbmRpbmdzIGV2ZW4gd2hlbiBjb2RlIGNvbnRhaW5zIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMDM2MSI+MjIwMzYxPC9hPgorWzEuNV1bY29tcGlsZXJdIENvbXBpbGVyIGluY29ycmVjdGx5IHJlamVjdHMgc3RhdGljIHJhdyBtZW1iZXIgdHlwZSBhcyBwYXJhbWV0ZXJpemVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIwMTExIj4yMjAxMTE8L2E+CitbMS41XVtjb21waWxlcl0gVHlwZSBtaXNtYXRjaCBlcnJvcnMgb24gaWRlbnRpY2FsIHR5cGVzOyBjb2RlIGNvbXBpbGVzIHdpdGggamF2YWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc2OTQiPjExNzY5NDwvYT4KK1thcGldIEFwcGx5aW5nIGVkaXRzIHRvIGEgSUNvbXBpbGF0aW9uVW5pdC4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjA0NTMiPjIyMDQ1MzwvYT4KK0FkZGl0aW9uIG9mIGV4dGVybmFsRm9sZGVyc01hbmFnZXIgaW5zaWRlIHRoZSBqYXZhIG1vZGVsIG1hbmFnZXIgYnJlYWtzIHJldHJpZXZhbCBvZiBKYXZhQ29yZS5nZXRPcHRpb25zKCkgd2l0aCBubyBoZWFkbGVzcyBlY2xpcHNlCisKKwkKKworCis8YSBuYW1lPSJ2Xzg0MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTYgLSBGZWJydWFyeSAyNiwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84NDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODQwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+RXh0ZXJuYWwgbGlicmFyeSBmb2xkZXJzIGFyZSBub3cgc3VwcG9ydGVkLiBPbmUgY2FuIHVzZSB0aGUgZXhpc3RpbmcgQVBJIDxjb2RlPkphdmFDb3JlI25ld0xpYnJhcnlFbnRyeSguLi4pPC9jb2RlPiB3aXRoIAorICAgICBhIGZpbGUgc3lzdGVtIHBhdGggdG8gYW4gZXh0ZXJuYWwgbGlicmFyeSBmb2xkZXIgdG8gYWRkIHRoaXMgZm9sZGVyIG9uIHRoZSBidWlsZCBwYXRoLiBOb3RlIHRoYXQgb25lIGNhbiBhbHNvIHVzZSBhbiBleHRlcm5hbCBzb3VyY2UgZm9sZGVyCisgICAgIGFzIGEgc291cmNlIGF0dGFjaG1lbnQgdXNpbmcgdGhlIHNhbWUgQVBJLjwvbGk+Cis8bGk+Q29kZSBBc3Npc3Q6IEFkZGVkIEFQSSB0byBnaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wbGV0ZWQgdG9rZW4gbG9jYXRpb24uPGJyPgorQ2xpZW50cyBjYW4gY2FsbCA8Y29kZT5Db21wbGV0aW9uQ29udGV4dCNnZXRUb2tlbkxvY2F0aW9uKCk8L2NvZGU+IHRvIGtub3cgaWYgdGhlIGNvbXBsZXRlZCB0b2tlbiBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIG1lbWJlcgorb3IgYXQgdGhlIHN0YXJ0IG9mIGEgc3RhdGVtZW50LiBJbiB0aGUgZnV0dXJlIHRoaXMgQVBJIGNvdWxkIGJlIGltcHJvdmVkIGFuZCBtb3JlIGxvY2F0aW9ucyBjb3VsZCBiZSByZWNvZ25pemVkLgorPHByZT4KK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uQ29udGV4dCB7CisJLi4uCisJCisJLyoqCisJICogVGhlIGNvbXBsZXRlZCB0b2tlbiBpcyB0aGUgZmlyc3QgdG9rZW4gb2YgYSBtZW1iZXIgZGVjbGFyYXRpb24uCisJICogZS5nLgorCSAqCisJICogcHVibGljIGNsYXNzIFggeworCSAqICAgRm9vfCAvLyBjb21wbGV0aW9uIG9jY3VycyBhdCB8CisJICogfQorCSAqIAorCSAqIEBzZWUgI2dldFRva2VuTG9jYXRpb24oKQorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTF9NRU1CRVJfU1RBUlQgPSAxOworCQorCS8qKgorCSAqIFRoZSBjb21wbGV0ZWQgdG9rZW4gaXMgdGhlIGZpcnN0IHRva2VuIG9mIGEgc3RhdGVtZW50LgorCSAqIGUuZy4KKwkgKgorCSAqIHB1YmxpYyBjbGFzcyBYIHsKKwkgKiAgIHB1YmxpYyB2b2lkIGJhcigpIHsKKwkgKiAgICAgRm9vfCAvLyBjb21wbGV0aW9uIG9jY3VycyBhdCB8CisJICogICB9CisJICogfQorCSAqIAorCSAqIEBzZWUgI2dldFRva2VuTG9jYXRpb24oKQorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTF9TVEFURU1FTlRfU1RBUlQgPSAyOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIGNvbXBsZXRpb24gdG9rZW4gYmVpbmcgcHJvcG9zZWQuCisJICogVGhlIHJldHVybmVkIGxvY2F0aW9uIGlzIGEgYml0IG1hc2sgd2hpY2ggY2FuIGNvbnRhaW4gc29tZSB2YWx1ZXMKKwkgKiBvZiB0aGUgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHRoaXMgY2xhc3Mgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCA8Y29kZT5UTDwvY29kZT4sCisJICogb3IgcG9zc2libHkgdmFsdWVzIHVua25vd24gdG8gdGhlIGNhbGxlci4KKwkgKiAKKwkgKiBUaGUgc2V0IG9mIGRpZmZlcmVudCBsb2NhdGlvbiB2YWx1ZXMgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIG92ZXIgdGltZS4KKwkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgZG8gPGI+bm90PC9iPiBhc3N1bWUgdGhhdAorCSAqIHRoZSBsb2NhdGlvbiBjb250YWlucyBvbmx5IGtub3duIHZhbHVlLCBhbmQgY29kZSBkZWZlbnNpdmVseSBmb3IgCisJICogdGhlIHBvc3NpYmlsaXR5IG9mIHVuZXhwZWN0ZWQgZnV0dXJlIGdyb3d0aC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbgorCSAqIAorCSAqIEBzaW5jZSAzLjQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFRva2VuTG9jYXRpb24oKSB7Li4ufQorCQorCS4uLgorfQorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTgzOTciPjIxODM5NzwvYT4KK1tzZWFyY2hdIENhbid0IGZpbmQgcmVmZXJlbmNlcyBvZiBnZW5lcmljIGxvY2FsIGNsYXNzLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMDE3MSI+MjIwMTcxPC9hPgorW2Fzc2lzdF0gTm8gc3VnZ2VzdGluZyAnaGFzR2VuZXJpY0Vycm9yJyB2YXJpYWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjUzNyI+MTgyNTM3PC9hPgorRW5oYW5jZSBjbGFzc3BhdGggY29udGFpbmVyIHRvIHN1cHBvcnQgZXh0ZXJuYWwgY2xhc3MgZm9sZGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjQ2NyI+MjAyNDY3PC9hPgorW2Fzc2lzdF0gcHJvdmlkZSBpbmZvIHdoYXQgaXMgY29tcGxldGVkCisKKzxhIG5hbWU9InZfODM5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNiAtIEZlYnJ1YXJ5IDIyLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgzOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MzkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5UaGUgY29tcGlsZXIgaXMgbm93IGJldHRlciByZXNpbGllbnQgdG8gbWlzc2luZyB0eXBlcyByZWZlcmVuY2VkIGZyb20gc291cmNlcy4gVGhpcyB3aWxsIGltcHJvdmUgc2Vjb25kYXJ5IGVycm9ycywgCithbmQgYWxsIEpEVCBzdGFjayBtYW5pcHVsYXRpbmcgRE9NIEFTVCBhbmQgYmluZGluZ3MuIEFubm90YXRpb24gcHJvY2Vzc29ycyBhcmUgYWxzbyBub3cgYWJsZSB0byBzZWUgc3VjaCBtaXNzaW5nIHR5cGVzCisoYWxzbyBzZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NjIwMCI+MTk2MjAwPC9hPikuIE5vdGUgdGhhdCB3aXRoIGN1cnJlbnQgc3VwcG9ydCwgCitwYXJhbWV0ZXJpemVkIHR5cGVzIGFyZSBub3QgZnVsbHkgcmVjb3ZlcmVkLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGEgbmFtZT0idl84MzgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE02IC0gRmVicnVhcnkgMTksIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODM4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgzOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzk5NSI+MjE3OTk1PC9hPgorRG9jdW1lbnRhdGlvbiBmb3IgSmF2YUNvcmUjQ09NUElMRVJfUEJfVU5VU0VEX0RFQ0xBUkVEX1RIUk9XTl9FWENFUFRJT04gWy4uLl0gZmFpbHMgdG8gbWFrZSBjcnlzdGFsLWNsZWFyIHRoZSBjYXNlcyBvZiBFeGNlcHRpb24gYW5kIFRocm93YWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzkxMCI+MjE3OTEwPC9hPgorUGFyYW1ldGVyIGFubm90YXRpb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gZnJvbnQgb2YgZWFjaCBwYXJhbWV0ZXIgaW4gZGlzYXNzZW1ibGVkIGNvZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTkwNjQiPjIxOTA2NDwvYT4KK0phdmFkb2Mgb2YgQVNUI25ld1R5cGVEZWNsYXJhdGlvbigpIHJlZmVycyB0byBpbmV4aXN0ZW50IHNldEVudW1lcmF0aW9uKC4uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMjA5NiI+MjEyMDk2PC9hPgorTG9jYWxWYXJpYWJsZS5oYXNoQ29kZSB0aHJvd3MgTlBFIHdoZW4gdGhpcy5wYXJlbnQgaXMgbnVsbAorCis8YSBuYW1lPSJ2XzgzNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTYgLSBGZWJydWFyeSAxMiwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MzcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODM3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3OTA3Ij4yMTc5MDc8L2E+CitDb21wYWN0IG1vZGUgaW4gdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgYWxzbyB3b3JrIGZvciBhbm5vdGF0aW9uIHZhbHVlcworCis8YSBuYW1lPSJ2XzgzNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTUgLSBGZWJydWFyeSA1LCAyMDA4IC0gMy40IE1JTEVTVE9ORSA1Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgzNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MzYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIxMDAiPjIxMjEwMDwvYT4KK1tkb21dIENhbid0IGNyZWF0ZSBiaW5kaW5nIHRvIGlubmVyIGNsYXNzCisKKzxhIG5hbWU9InZfODM1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNSAtIEZlYnJ1YXJ5IDMsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODM1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgzNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkNvZGUgZm9ybWF0dGVyOiAzIG5ldyBvcHRpb25zIHdlcmUgYWRkZWQgdG8gYmV0dGVyIGhhbmRsZSB0aGUgYWRkaXRpb24gb2YgbmV3IGxpbmVzIGFmdGVyIGFubm90YXRpb25zLgorPHByZT4KKyAqIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9NRU1CRVIKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgbWVtYmVyIChwYWNrYWdlLCBjbGFzcywgbWV0aG9kLCBmaWVsZCBkZWNsYXJhdGlvbikKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlciIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IElOU0VSVCwgRE9fTk9UX0lOU0VSVCB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgSU5TRVJUCisgKiAKKyAqIEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTl9PTl9QQVJBTUVURVIKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgcGFyYW1ldGVyCisgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXIiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQorICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIERPX05PVF9JTlNFUlQKKyAqCisgKiBGT1JNQVRURVJfSU5TRVJUX05FV19MSU5FX0FGVEVSX0FOTk9UQVRJT05fT05fTE9DQUxfVkFSSUFCTEUKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhbiBhbm5vdGF0aW9uIG9uIGEgbG9jYWwgdmFyaWFibGUKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlIgorICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgSU5TRVJULCBET19OT1RfSU5TRVJUIH0KKyAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBJTlNFUlQKKzwvcHJlPgorVGhlIGFkZGl0aW9uIG9mIG5ldyBsaW5lcyBhZnRlciBhbm5vdGF0aW9ucyBoYXMgYmVlbiBkaXNjdXNzZWQgaW4gPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyMjQ3Ij5idWcgMTIyMjQ3PC9hPjxicj4KK0Fsc28gbm90ZSB0aGF0IHByZXZpb3VzbHkgYXZhaWxhYmxlIGNvZGUgZm9ybWF0dGVyIGNvbnN0YW50IEZPUk1BVFRFUl9JTlNFUlRfTkVXX0xJTkVfQUZURVJfQU5OT1RBVElPTiBoYXMgYmVlbiBkZXByZWNhdGVkLjxicj4KK0FsbCBuZXcgb3B0aW9ucyBtdXN0IGJlIGVuYWJsZWQgdG8gYWN0aXZhdGUgb2xkIHN0cmF0ZWd5LgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNDI1Ij4yMTA0MjU8L2E+CitbMS41XVtjb21waWxlcl0gQFN1cHByZXNzV2FybmluZ3MoJnF1b3Q7dW5jaGVja2VkJnF1b3Q7KSAgbm90IGNvbnNpZGVyZWQgbmVjZXNzYXJ5IGZvciB1bmNvbnN0cmFpbmVkIGdlbmVyaWMgcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzA1OSI+MjE3MDU5PC9hPgorUmVncmVzc2lvbiBpbiBNb2RlbCBwZXJmb3JtYW5jZSB0ZXN0IHRlc3RQcm9qZWN0RmluZFVua25vd25UeXBlKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI5MTIiPjIxMjkxMjwvYT4KK0phdmFkb2MgYnVncyBpbiBJTWVtYmVyVmFsdWVQYWlyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyMjQ3Ij4xMjIyNDc8L2E+CitbZm9ybWF0dGVyXSBhZGQgc3VwcG9ydCB0byBoYW5kbGUgcGFyYW1ldGVyIGFubm90YXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2Njg2Ij4yMTY2ODY8L2E+CitbMS41XVtjb21waWxlcl0gRmFpbHVyZXMgb2YgaW5mZXJlbmNlIGFuZCBvdmVybG9hZCByZXNvbHV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2ODk3Ij4yMTY4OTc8L2E+CitbY29tcGlsZXJdW29wdGlvbnNdIENvbXBpbGUgZXJyb3Igd2hlbiBkaXNhYmxpbmcgJ0lnbm9yZSBVbmNoZWNrZWQgRXhjZXB0aW9uJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNjY4MyI+MjE2NjgzPC9hPgorWzEuNV1bY29tcGlsZXJdIENvbmZ1c2lvbiB3aGVuIGhvbW55bW91cyB0eXBlcyBpbiBsb2NhbCBhbmQgZW5jbG9zaW5nIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNDkwIj4yMDI0OTA8L2E+CitKYXZhZG9jIG9mIEphdmFDb3JlIG9wdGlvbnMgaGFyZCB0byB1c2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTYyOTEiPjIxNjI5MTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciBtZXNzYWdlcyBzaG91bGQgdXNlICZxdW90OzEuNSZxdW90OyBpbnN0ZWFkIG9mICZxdW90OzUuMCZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNjg3NSI+MjE2ODc1PC9hPgorW3NlYXJjaF0gRmllbGQtIGFuZCBMb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2ggY29uZnVzZSByZWFkL3dyaXRlIGZvciBmaWVsZCBhY2Nlc3Mgb24gTEhTCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2ODk1Ij4yMTY4OTU8L2E+CitOUEUgZm91bmQgaW4gLmxvZyB3aGlsZSBydW5uaW5nIENsYXNzcGF0aFRlc3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2ODE3Ij4yMTY4MTc8L2E+CitKYXZhQ29yZS5nZXRFbmNvZGluZygpIGZhaWxzIHdoZW4gdGhlcmUgaXMgbm8gd29ya3NwYWNlLgorCis8YSBuYW1lPSJ2XzgzNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTUgLSBKYW51YXJ5IDI5LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgzNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MzQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY2OTIiPjIxNjY5MjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBQcm90ZWN0ZWQgdHlwZSBub3QgdmlzaWJsZSBpbiBzdWJjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNjU2NSI+MjE2NTY1PC9hPgorWzEuNV1bY29tcGlsZXJdIENhbm5vdCBjb252ZXJ0IFQgdG8gVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNjc0NyI+MjE2NzQ3PC9hPgorU2hvdWxkIHVzZSBBVk9JRF9OQVRVUkVfQ09ORklHIHdoZW4gdXBkYXRpbmcgcHJvamVjdCByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4MjYwIj4yMDgyNjA8L2E+Citbc2VhcmNoXSBEb2N1bWVudCB0aGUgcGF0dGVybiBzeW50YXggZm9yIFNlYXJjaFBhdHRlcm4jY3JlYXRlUGF0dGVybihTdHJpbmcsIC4uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDc3OCI+MTMwNzc4PC9hPgorSW52YWxpZCBhbm5vdGF0aW9uIGVsZW1lbnRzIGNhdXNlIG5vIGFubm90YXRpb24gdG8gYmUgaW4gdGhlIEFTVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDUyNCI+MjEwNTI0PC9hPgorW2JhdGNoXVtjb21waWxlcl1bb3B0aW9uc10gLXdhcm46YWxsRGVwcmVjYXRpb24gLXdhcm46LWRlcHJlY2F0aW9uIGRvZXMgbm90IGJlaGF2ZSBhcyBkb2N1bWVudGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2MTAwIj4yMTYxMDA8L2E+CitbMS41XVtjb21waWxlcl0gQnJpZ2RlcyBhcmUgbm90IGNvcnJlY2x5IGdlbmVyYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzI0OSI+MjEzMjQ5PC9hPgorUmVncmVzc2lvbiBpbiBUeXBlSGllcmFyY2h5IHdoZW4gYSBzdXBlci1jbGFzcyBjYW4ndCBiZSByZXNvbHZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTY4MSI+MjE1NjgxPC9hPgorVHlwZSBIaWVyYXJjaHkgY3Jhc2hlcyBpbiBzb21lIGNhc2VzIG9mIHVzZXIgaW5wdXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTUzMzMiPjIxNTMzMzwvYT4KK1tiYXRjaF1bY29tcGlsZXJdW29wdGlvbnNdIHRoZSBkb2N1bWVudGF0aW9uIGZvciBzcGVjaWFsUGFyYW1IaWRpbmcgbmVlZHMgaW1wcm92ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAyNzgiPjEwMDI3ODwvYT4KK1tjb21waWxlcl0gQWRkIGNvbXBpbGVyIHdhcm5pbmcgZm9yIGV4cGxpY2l0bHkgZGVjbGFyZWQgcnVudGltZSBleGNlcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkxMDkwIj4xOTEwOTA8L2E+CitbY29tcGlsZXJdIFByZXNlcnZlIGFubm90YXRpb25zIGZvciB0aGUgcHJvYmxlbSBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1ODQzIj4yMTU4NDM8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgZXJyb3Igd2l0aCBnZW5lcmljIGNvdmFyaWFudAorCis8YSBuYW1lPSJ2XzgzMyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTUgLSBKYW51YXJ5IDIyLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgzMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MzMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU5NzYiPjIxNTk3NjwvYT4KK1B1YmxpY1NjYW5uZXIgZG9lc24ndCBjb250YWluIGFsbCB0aGUgZml4IG9mIFNjYW5uZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU3NTkiPjIxNTc1OTwvYT4KK0RPTSBBU1QgcmVncmVzc2lvbiB0ZXN0cyBzaG91bGQgYmUgaW1wcm92ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU4NTgiPjIxNTg1ODwvYT4KK1tBU1QvRE9NXSBDQ0Ugd2hlbiB1c2luZyBBU1RQYXJzZXIuc2V0Rm9jYWxQb3NpdGlvbihpbnQpIHdpdGggdGhlIHBvc2l0aW9uIG9mIGEgZmllbGQgZGVjbGFyYXRpb24gbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzczOSI+MTI3NzM5PC9hPgorSUFFIGluIFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlIHdoaWxlIGhvdmVyaW5nIGEgbWV0aG9kIG9mIHR5cGUgaGF2aW5nICQgaW4gaXRzIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTA3NDYiPjIxMDc0NjwvYT4KK0NsYXNzIGZvbGRlciBpbiBidWlsZCBwYXRoIGRvZXMgbm90IHJlZnJlc2ggcHJvcGVybHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg4ODIiPjEzODg4MjwvYT4KK1Nob3VsZCBzdXJmYWNlIGZhaWx1cmUgdG8gZ2V0IENVJ3MgY29udGVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ5NzIiPjIxNDk3MjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBXcm9uZyBTaWduYXR1cmUgZm9yIG1ldGhvZHMgaW5zaWRlIElubmVyVHlwZXMgd2l0aCBnZW5lcmljcyAuCisKKzxhIG5hbWU9InZfODMyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNSAtIEphbnVhcnkgMTUsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODMyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgzMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTAxOSI+MjE1MDE5PC9hPgorW3NlYXJjaF0gSmF2YVNlYXJjaEJ1Z3NUZXN0cy50ZXN0QnVnMTgxNDg4YSBpcyByYW5kb21seSBmYWlsaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNzAzIj4yMTM3MDM8L2E+Citbc2VhcmNoXSBJbmRleGluZyBqb2IgcHJvZ3Jlc3Mgc2hvdWxkIGJlIG1vcmUgZGV0YWlsZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY1NDAiPjE4NjU0MDwvYT4KK1tzZWFyY2hdIGVuZ2luZSBzaG91bGQgYWxsb2NhdGUgcHJvZ3Jlc3MgbW9uaXRvciB0aWNrcyBmb3IgcmVwb3J0aW5nIHBhY2thZ2UgZGVjbGFyYXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NzMxIj4yMTQ3MzE8L2E+CitbYmF0Y2hdW2NvbXBpbGVyXSBDbGFzc3BhdGhKYXIjZ2V0UGF0aCBkb2VzIG5vdCBob25vciBpdHMgY29udHJhY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE1ODgiPjIxMTU4ODwvYT4KK1tiYXRjaF1bY29tcGlsZXJdW29wdGlvbnNdIHVuZHVlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGVuYWJsZUphdmFkb2MsIGphdmFkb2MgYW5kIGFsbEphdmFkb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTM0MjciPjIxMzQyNzwvYT4KK0VGUyB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE5ODEiPjE4MTk4MTwvYT4KK1ttb2RlbF0gTGlua2VkIFNvdXJjZSBGb2xkZXJzIHdpdGggUGFyYWxsZWwgcGFja2FnZSBzdHJ1Y3R1cmUgZG8gbm90IHdvcmsgd2l0aCBvY2N1cnJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzY5MiI+MjEzNjkyPC9hPgorW2NvbXBpbGVyXSBXcm9uZyB1bm5lY2Vzc2FyeSBOT04tTkxTIGRpYWdub3N0aWMgYWZ0ZXIgc3ludGF4IHJlY292ZXJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NDUwIj4yMTQ0NTA8L2E+Cithbm5vdGF0aW9uIGlzIGJyb2tlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjgzMSI+MTc2ODMxPC9hPgorW3NlYXJjaF0gTm8gc2VhcmNoIHJlc3VsdHMgZHVlIHRvIG1hbGZvcm1lZCBzZWFyY2ggc2NvcGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ2NDciPjIxNDY0NzwvYT4KK1tkb21dIE5QRSBpbiBNZXRob2RCaW5kaW5nLmdldFBhcmFtZXRlckFubm90YXRpb25zKC4uKQorCisKKzxhIG5hbWU9InZfODMxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNSAtIEphbnVhcnkgOCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MzEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODMxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5OTM2Ij4yMDk5MzY8L2E+CitbamF2YWRvY10gTWlzc2luZyBjb2RlIGltcGxlbWVudGF0aW9uIGluIHRoZSBjb21waWxlciBvbiBpbm5lciBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNjgxIj4yMTA2ODE8L2E+CitDb2RlIGFzc2lzdCBmYWlscyB0byBwcm9wb3NlIGlubmVyIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE4ODEiPjIxMTg4MTwvYT4KK1thc3Npc3RdIENvZGUgYXNzaXN0IGZhaWxzIGluc2lkZSBhbiBpZiBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIxNTMiPjIxMjE1MzwvYT4KK3N0YWNrIG92ZXJmbG93IHdoZW4gcHJlc3MgY3RybCtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDUxOCI+MjEwNTE4PC9hPgorW2JhdGNoXVtjb21waWxlcl1bb3B0aW9uc10gLXdhcm46dW51c2VkIHdyb25nbHkgYmVoYXZlcyBhcyAtd2FybjordW51c2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0MDAyIj4yMTQwMDI8L2E+CitbZG9tXSBOUEUgaW4gTWV0aG9kQmluZGluZy5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzNzY1Ij4xNTM3NjU8L2E+Citbc2VhcmNoXSBSZWZlcmVuY2UgdG8gcGFja2FnZSBpcyBub3QgZm91bmQgaW4gcXVhbGlmaWVkIGFubm90YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTMyODQiPjIxMzI4NDwvYT4KK1tmb3JtYXR0ZXJdIE5QRSBvbiBmb3JtYXR0aW5nIHJlZ2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzI4MyI+MjEzMjgzPC9hPgorW2Zvcm1hdHRlcl0gQUlPT0JFIHdoZW4gZm9ybWF0dGluZyByZWdpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTM1NzAiPjIxMzU3MDwvYT4KK0luY3JlbWVudGFsVGVzdHMjdGVzdFJlbmFtZU1haW5UeXBlKCkgZmFpbHMgd2l0aCBJQk0gSlJFIDYuMAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzUwOSI+MjEzNTA5PC9hPgorW2RvbV0gSU1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMgcmV0dXJucyBhbm5vdGF0aW9ucyBmb3Igd3JvbmcgcGFyYW1ldGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0NzQ5Ij4yMDQ3NDk8L2E+CitbMS41XVtqYXZhZG9jXSBOUEUgaW4gSmF2YWRvY1F1YWxpZmllZFR5cGVSZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTI4MzQiPjIxMjgzNDwvYT4KK1tkb21dIElNZXRob2RCaW5kaW5nLmdldFBhcmFtZXRlckFubm90YXRpb25zIGRvZXMgbm90IHJldHVybiBhbm5vdGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTcxOCI+MjExNzE4PC9hPgorWzEuNV1bY29tcGlsZXJdIGNvbXBpbGVyIGVycm9yIHdpdGggbmVzdGVkIGVudW0gaW4gY2xhc3MgdXNpbmcgZ2VuZXJpY3MKKworPGEgbmFtZT0idl84MzAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE01IC0gRGVjZW1iZXIgMTgsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODMwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgzMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMjg1NyI+MjEyODU3PC9hPgorW2RvbV0gQVNUIGhhcyB3cm9uZyBzb3VyY2UgcmFuZ2UgYWZ0ZXIgcGFyYW1ldGVyIHdpdGggYXJyYXktdmFsdWVkIGFubm90YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIyMjQiPjIxMjIyNDwvYT4KK1VucmVzb2x2YWJsZSB0eXBlIGNhdXNlcyBBcnJheU91dE9mQm91bmRzRXhjZXB0aW9uIGluIElUeXBlLnJlc29sdmVUeXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEyNzY5Ij4yMTI3Njk8L2E+CitTZXRDbGFzc3BhdGhPcGVyYXRpb24gbm8gbG9uZ2VyIGFkZHMgcHJvamVjdCBmb3IgcmVmcmVzaAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDg2MiI+MTY0ODYyPC9hPgorW2FzdCByZXdyaXRlXSBMaXN0UmV3cml0ZS5yZW1vdmUoLi4uKSBkb2VzIG5vdCByZW1vdmUgaW5zZXJ0ZWQgbm9kZXMKKworPGEgbmFtZT0idl84MjkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE00IC0gRGVjZW1iZXIgMTIsIDIwMDcgLSAzLjQgTUlMRVNUT05FIDQKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODI5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgyOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMjU5OSI+MjEyNTk5PC9hPgorW3NlYXJjaF0gZmluZSBncmFpbmVkIHNlYXJjaCBtdXN0IG5vdCByZXBvcnQgbWF0Y2hlcyBpbiBKYXZhZG9jCisKKzxhIG5hbWU9InZfODI4Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNCAtIERlY2VtYmVyIDgsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODI4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgyOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTk5MyI+MjA5OTkzPC9hPgorWzEuNV1bc2VhcmNoXSBHZW5lcmljIHNlYXJjaCBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdoaWxlIHVzaW5nIEJpbmRpbmdLZXkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE3ODEiPjIxMTc4MTwvYT4KK1tzZWFyY2hdIGNsYXJpZnkgJ0FMTE9DQVRJT05fRVhQUkVTU0lPTl9UWVBFX1JFRkVSRU5DRScKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE3NzkiPjIxMTc3OTwvYT4KK1tzZWFyY2hdIGJldHRlciBuYW1lIGZvciBTVVBFUlRZUEVfVFlQRV9SRUZFUkVOQ0U/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExODcyIj4yMTE4NzI8L2E+Citbc2VhcmNoXSBSZWZlcmVuY2VzIHRvIGFubm90YXRpb25zIG5vdCBmb3VuZCBpbiBjbGFzcyBmaWxlIHdpdGhvdXQgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwMDk0Ij4yMTAwOTQ8L2E+CitDcmVhdGluZyB0eXBlIGhpZXJhcmNoeSBkb2VzIG5vdCByZXBvcnQgcHJvZ3Jlc3MKKworPGEgbmFtZT0idl84MjciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE00IC0gRGVjZW1iZXIgNCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MjcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODI3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHM8L2NvZGU+IEFQSSBjb25zdGFudHMgZm9yIGZpbmUgZ3JhaW5lZCBzZWFyY2gKKyhzZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDEzIj5idWcgMTU1MDEzPC9hPikuPGJyPgorVGhlc2UgY29uc3RhbnRzIGFyZSBhZGRpdGlvbmFsIGZsYWdzIHdoaWNoIHNob3VsZCBiZSBzZXQgb24gPGNvZGU+bGltaXRUbzwvY29kZT4KK3BhcmFtZXRlciB3aGlsZSBjYWxsaW5nIDxjb2RlPlNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybiguLi4pPC9jb2RlPiBtZXRob2RzLjxicj4KK1RoZXkgY2FuIGJlIGNvbWJpbmVkIHRvIGdldCByZXN1bHRzIG9mIG11bHRpcGxlIGZpbmUgZ3JhaW4gc2VhcmNoIGluIG9uZSBzaW5nbGUgcXVlcnkuCis8cD4KK0hlcmUgaXMgdGhlIGV4aGF1c3RpdmUgbGlzdCBvZiB0aGVzZSBmaW5lIGdyYWluIHNlYXJjaCBmbGFnczo8cHJlPgorCisvKioKKyAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIHRoZSB0eXBlIG9mIGEgZmllbGQgZGVjbGFyYXRpb24uCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogQHNpbmNlIDMuNAorICogQGNhdGVnb3J5IGxpbWl0VG8KKyAqLworaW50IEZJRUxEX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFID0gMHg0MDsKKworLyoqCisgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyB0aGUgdHlwZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBMT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSA9IDB4ODA7CisKKy8qKgorICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBtZXRob2QgcGFyYW1ldGVyCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAY2F0ZWdvcnkgbGltaXRUbworICovCitpbnQgUEFSQU1FVEVSX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFID0gMHgxMDA7CisKKy8qKgorICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSBzdXBlciB0eXBlIG9yIGFzIGEgc3VwZXIgaW50ZXJmYWNlLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBTVVBFUlRZUEVfVFlQRV9SRUZFUkVOQ0UgPSAweDIwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIHRocm93cyBjbGF1c2UuCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogQHNpbmNlIDMuNAorICogQGNhdGVnb3J5IGxpbWl0VG8KKyAqLworaW50IFRIUk9XU19DTEFVU0VfVFlQRV9SRUZFUkVOQ0UgPSAweDQwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIGNhc3QgZXhwcmVzc2lvbi4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAY2F0ZWdvcnkgbGltaXRUbworICovCitpbnQgQ0FTVF9UWVBFX1JFRkVSRU5DRSA9IDB4ODAwOworCisvKioKKyAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGEgY2F0Y2ggaGVhZGVyLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBDQVRDSF9UWVBFX1JFRkVSRU5DRSA9IDB4MTAwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbi4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBFeGFtcGxlOgorICogCXB1YmxpYyBjbGFzcyBUZXN0IHsKKyAqIAkJVGVzdCgpIHt9CisgKiAJCXN0YXRpYyBUZXN0IGJhcigpICB7CisgKiAJCQlyZXR1cm4gbmV3IDxpPlRlc3Q8L2k+KCk7CisgKiAJCX0KKyAqIAl9CisgKgorICogU2VhcmNoaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+VGVzdDwvY29kZT4gdXNpbmcgdGhpcyBmbGFnIGluIHRoZQorICogYWJvdmUgc25pcHBldCB3aWxsIG1hdGNoIG9ubHkgdGhlIHJlZmVyZW5jZSBpbiBpdGFsaWMuCisgKiAKKyAqIE5vdGUgdGhhdCBhcnJheSBjcmVhdGlvbnMgYXJlIG5vdCByZXR1cm5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZy4KKyAqIAorICogQHNpbmNlIDMuNAorICogQGNhdGVnb3J5IGxpbWl0VG8KKyAqLworaW50IENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFID0gMHgyMDAwOworCisvKioKKyAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgbWV0aG9kIHJldHVybiB0eXBlLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBSRVRVUk5fVFlQRV9SRUZFUkVOQ0UgPSAweDQwMDA7CisKKy8qKgorICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYW4gaW1wb3J0IGRlY2xhcmF0aW9uLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBJTVBPUlRfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgPSAweDgwMDA7CisKKy8qKgorICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYW4gYW5ub3RhdGlvbi4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAY2F0ZWdvcnkgbGltaXRUbworICovCitpbnQgQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSA9IDB4MTAwMDA7CisKKy8qKgorICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSB0eXBlIGFyZ3VtZW50IGluIGEgcGFyYW1ldGVyaXplZAorICogdHlwZSBvciBhIHBhcmFtZXRlcml6ZWQgbWV0aG9kLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKyAqIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBUWVBFX0FSR1VNRU5UX1RZUEVfUkVGRVJFTkNFID0gMHgyMDAwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgdmFyaWFibGUgYm91bmQuCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogQHNpbmNlIDMuNAorICogQGNhdGVnb3J5IGxpbWl0VG8KKyAqLworaW50IFRZUEVfVkFSSUFCTEVfQk9VTkRfVFlQRV9SRUZFUkVOQ0UgPSAweDQwMDAwOworCisvKioKKyAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgd2lsZGNhcmQgYm91bmQuCisgKgorICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogQHNpbmNlIDMuNAorICogQGNhdGVnb3J5IGxpbWl0VG8KKyAqLworaW50IFdJTERDQVJEX0JPVU5EX1RZUEVfUkVGRVJFTkNFID0gMHg4MDAwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSBzdXBlciBmaWVsZCBhY2Nlc3NlcyBvciBzdXBlciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4gdXNpbmcgdGhlCisgKiA8Y29kZT5zdXBlcjwvY29kZT4gcXVhbGlmaWVyKS4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBraW5kIG9mIHJldHVybmVkIG1hdGNoZXMgd2lsbCBkZXBlbmQgb24gdGhlCisgKiBzcGVjaWZpZWQgbmF0dXJlIG9mIHRoZSBzZWFyY2hlZCBlbGVtZW50OgorICogCS4gZm9yIHRoZSB7QGxpbmsgI0ZJRUxEfSBuYXR1cmUsIG9ubHkge0BsaW5rIEZpZWxkUmVmZXJlbmNlTWF0Y2h9CisgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZCwKKyAqIAkuIGZvciB0aGUge0BsaW5rICNNRVRIT0R9IG5hdHVyZSwgb25seSB7QGxpbmsgTWV0aG9kUmVmZXJlbmNlTWF0Y2h9CisgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAY2F0ZWdvcnkgbGltaXRUbworICovCitpbnQgU1VQRVJfUkVGRVJFTkNFID0gMHgxMDAwMDAwOworCisvKioKKyAqIFJldHVybiBvbmx5IHF1YWxpZmllZCBmaWVsZCBhY2Nlc3NlcyBvciBxdWFsaWZpZWQgbWV0aG9kIGludm9jYXRpb25zLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGtpbmQgb2YgcmV0dXJuZWQgbWF0Y2hlcyB3aWxsIGRlcGVuZCBvbiB0aGUKKyAqIHNwZWNpZmllZCBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnQ6CisgKiAJLiBmb3IgdGhlIHtAbGluayAjRklFTER9IG5hdHVyZSwgb25seSB7QGxpbmsgRmllbGRSZWZlcmVuY2VNYXRjaH0KKyAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLAorICogCS4gZm9yIHRoZSB7QGxpbmsgI01FVEhPRH0gbmF0dXJlLCBvbmx5IHtAbGluayBNZXRob2RSZWZlcmVuY2VNYXRjaH0KKyAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBRVUFMSUZJRURfUkVGRVJFTkNFID0gMHgyMDAwMDAwOworCisvKioKKyAqIFJldHVybiBvbmx5IHByaW1hcnkgZmllbGQgYWNjZXNzZXMgb3IgcHJpbWFyeSBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4gdXNpbmcKKyAqIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBxdWFsaWZpZXIpLgorICoKKyAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGtpbmQgb2YgcmV0dXJuZWQgbWF0Y2hlcyB3aWxsIGRlcGVuZCBvbiB0aGUKKyAqIHNwZWNpZmllZCBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnQ6CisgKiAJLiBmb3IgdGhlIHtAbGluayAjRklFTER9IG5hdHVyZSwgb25seSB7QGxpbmsgRmllbGRSZWZlcmVuY2VNYXRjaH0KKyAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLAorICogCS4gZm9yIHRoZSB7QGxpbmsgI01FVEhPRH0gbmF0dXJlLCBvbmx5IHtAbGluayBNZXRob2RSZWZlcmVuY2VNYXRjaH0KKyAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqIEBjYXRlZ29yeSBsaW1pdFRvCisgKi8KK2ludCBUSElTX1JFRkVSRU5DRSA9IDB4NDAwMDAwMDsKKworLyoqCisgKiBSZXR1cm4gb25seSBmaWVsZCBhY2Nlc3NlcyBvciBtZXRob2QgaW52b2NhdGlvbnMgd2l0aG91dCBhbnkgcXVhbGlmaWNhdGlvbi4KKyAqCisgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBraW5kIG9mIHJldHVybmVkIG1hdGNoZXMgd2lsbCBkZXBlbmQgb24gdGhlCisgKiBzcGVjaWZpZWQgbmF0dXJlIG9mIHRoZSBzZWFyY2hlZCBlbGVtZW50OgorICogCS4gZm9yIHRoZSB7QGxpbmsgI0ZJRUxEfSBuYXR1cmUsIG9ubHkge0BsaW5rIEZpZWxkUmVmZXJlbmNlTWF0Y2h9CisgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZCwKKyAqIAkuIGZvciB0aGUge0BsaW5rICNNRVRIT0R9IG5hdHVyZSwgb25seSB7QGxpbmsgTWV0aG9kUmVmZXJlbmNlTWF0Y2h9CisgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBAc2luY2UgMy40CisgKiBAY2F0ZWdvcnkgbGltaXRUbworICovCitpbnQgSU1QTElDSVRfVEhJU19SRUZFUkVOQ0UgPSAweDgwMDAwMDA7Cis8L3ByZT4KKzwvbGk+Cis8bGk+Rml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk2NDIiPmJ1ZyAyMDk2NDI8L2E+IHJlcXVpcmVkIHRoZSBpbmRleCB2ZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkLiAKKyAgICBJbmRleGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZCB1cG9uIHN1YnNlcXVlbnQgc2VhcmNoIHF1ZXJpZXMgKGFjY291bnRpbmcgZm9yIGluZGV4aW5nIG5vdGlmaWNhdGlvbiBpbiBzZWFyY2ggcHJvZ3Jlc3MgCisgICAgZGlhbG9ncykuCis8L2xpPgorPGxpPlNlYXJjaCBFbmdpbmUgaXMgbm93IGFibGUgdG8gZmluZCByZWZlcmVuY2VzIHRvIGFubm90YXRpb25zIGluc2lkZSBjbGFzcyBmaWxlcyB3aGljaCBkbyBub3QgaGF2ZSBhbnkgYXR0YWNoZWQgc291cmNlcy4KKyhzZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExMzY2Ij5idWcgMjExMzY2PC9hPiBmb3IgbW9yZSBkZXRhaWxzKS4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTg1NyI+MjExODU3PC9hPgorW3NlYXJjaF0gU3RhbmRhcmQgYW5ub3RhdGlvbnMgcmVmZXJlbmNlcyBub3QgZm91bmQgb24gYmluYXJ5IGZpZWxkcyBhbmQgbWV0aG9kcyB3aGVuIG5vIHNvdXJjZSBpcyBhdHRhY2hlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTM2NiI+MjExMzY2PC9hPgorW3NlYXJjaF0gZG9lcyBub3QgcmV0dXJuIHJlZmVyZW5jZXMgdG8gdHlwZXMgaW4gYmluYXJ5IGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE3NjIiPjIxMTc2MjwvYT4KK0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaW5pdGlhbGl6aW5nIEphdmEgVG9vbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTA0OTgiPjIxMDQ5ODwvYT4KK0V4dHJhIHR5cGUgaW4gaGllcmFyY2h5IHdoZW4gZm9jdXNpbmcgb24gbG9jYWwgY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE2MDkiPjIxMTYwOTwvYT4KK1tjb21waWxlcl1bMS41XSBVbmFibGUgdG8gcmVzb2x2ZSBhbm5vdGF0aW9ucyBkZWZpbmVkIHdpdGggYSBDbGFzcyBhdHRyaWJ1dGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk5MzYiPjIwOTkzNjwvYT4KK1tqYXZhZG9jXSBNaXNzaW5nIGNvZGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGNvbXBpbGVyIG9uIGlubmVyIGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY1OTciPjIwNjU5NzwvYT4KK0lUeXBlI3Jlc29sdmVUeXBlKFN0cmluZykgaXMgbm90IGltcGxlbWVudGVkIGZvciBiaW5hcnkgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDc3NzUiPjIwNzc3NTwvYT4KK2luY29tcGxldGUgc291cmNlIHJhbmdlIGZvciBhbm9ueW1vdXMgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTI5MCI+MjExMjkwPC9hPgorV3JvbmcgZGVsdGEgcmVuYW1pbmcgLmNsYXNzcGF0aCBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3ODkwIj4yMDc4OTA8L2E+CitDaGVja2luZyBvdXQgSkZhY2UgYW5kIHRoZW4gU1dUIGxlYWRzIHRvIGEgc3RyYW5nZSBzdGF0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTY0MiI+MjA5NjQyPC9hPgorW2luZGV4XSBJbXByb3ZlIHNlYXJjaCBmb3IgYW5ub3RhdGlvbiByZWZlcmVuY2VzIGJ5IHVzaW5nIGEgc3BlY2lmaWMgY2F0ZWdvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwMTMiPjE1NTAxMzwvYT4KK1tzZWFyY2hdIFtEQ1JdIE1vcmUgZmluZWdyYWluZWQgb3B0aW9ucyBmb3IgSmF2YSBzZWFyY2gKKworPGEgbmFtZT0idl84MjYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE00IC0gTm92ZW1iZXIgMjcsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODI2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgyNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlR1bmVkIHRoZSBjb21waWxlciBkaWFnbm9zaXMgZm9yIHVudXNlZCA8Y29kZT5AU3VwcHJlc3NXYXJuaW5nczwvY29kZT4gdG8gb25seSBjb21wbGFpbiBpZiB0aGUgcmVsZXZhbnQgd2FybmluZ3Mgd2VyZSBlZmZlY3RpdmVseQorZW5hYmxlZCB3aGVuIGNvbXBpbGluZy4gU28gaWYgeW91IHR1cm4gb2ZmIGNlcnRhaW4gd2FybmluZ3MsIHRoZW4gdGhlIGNvbXBpbGVyIGlzIG5vdCBnb2luZyB0byBzdWdnZXN0IGdldHRpbmcgcmlkIG9mIGV4aXN0aW5nIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPgoraW4geW91ciBjb2RlLCB1bnRpbCB5b3Ugd2lsbCBoYXZlIGVuYWJsZWQgdGhlc2UgYmFjaywgYW5kIHRoZSBjb21waWxlciB3aWxsIGhhdmUgcHJvdmVkIHRoYXQgdGhlcmUgaXMgbm8gb2NjdXJyZW5jZSBvZiB0aGVtLgorPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SU1ldGhvZCNnZXREZWZhdWx0VmFsdWUoKTwvY29kZT4gdG8gcmV0cmlldmUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbiBtZXRob2QuPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SU1lbWJlclZhbHVlUGFpciNLX1NJTVBMRV9OQU1FPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBraW5kIG9mIHRoZSB2YWx1ZSBpcyBhIHNpbXBsZSBuYW1lIHJlZmVyZW5jZS48L2xpPgorPGxpPkFkZGVkIEFQSSA8Y29kZT5JSmF2YVByb2plY3QjZmluZEVsZW1lbnQoU3RyaW5nLCBXb3JraW5nQ29weU93bmVyKTwvY29kZT4gdG8gcmV0cmlldmUgYSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGZyb20gYSBiaW5kaW5nIGtleS48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI2NzAiPjE5MjY3MDwvYT4KK1thcGldIG5lZWQgYXBpIHRvIGdldCBmcm9tIGJpbmRpbmcga2V5IHRvIGEgSUphdmFFbGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNTY3Ij4yMTA1Njc8L2E+CitbMS41XVtzZWFyY2hdIFBhcmFtZXRlcml6ZWQgdHlwZSByZWZlcmVuY2Ugbm90IGZvdW5kIHdoZW4gdXNlZCBpbiB0eXBlIHBhcmFtZXRlciBib3VuZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTA5MjIiPjIxMDkyMjwvYT4KK0FycmF5U3RvcmVFeGNlcHRpb24gd2hlbiBmb3JtYXR0aW5nIHNldCBvZiByZWdpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwMzUzIj4yMTAzNTM8L2E+CitJbXByb3ZlIGRvY3VtZW50YXRpb24gZm9yIG92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCBvcHRpb24gaW4gSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMnIGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg1NDEiPjIwODU0MTwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdHRlciBkb2VzIG5vdCBmb3JtYXQgd2hvbGUgcmVnaW9uL3NlbGVjdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDYzOCI+MjEwNjM4PC9hPgorW0RlYnVnXSBDYW4ndCByZXN0b3JlIEJyZWFrcG9pbnRzIHZpZXcgOiBjb25jdXJyZW50IGFjY2Vzcy9oYXNobWFwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNjkxIj4yMTA2OTE8L2E+Citbc2VhcmNoXSBUeXBlIHJlZmVyZW5jZXMgcG9zaXRpb24gaW52YWxpZCBpbiBpbXBvcnQgcmVmZXJlbmNlcyB3aGVuIHVzaW5nICZxdW90OyomcXVvdDsgcGF0dGVybgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDY4OSI+MjEwNjg5PC9hPgorW3NlYXJjaF0gVHlwZSByZWZlcmVuY2VzIGFyZSBub3QgZm91bmQgaW4gaW1wb3J0IGRlY2xhcmF0aW9ucyB3aGVuIEpVbml0IHRlc3RzIG9ubHkgdXNlIHdvcmtpbmcgY29waWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNTY1Ij4yMTA1NjU8L2E+CitOdWxsIHZhbHVlIGlzIG9idGFpbmVkIGZyb20gSU1lbWJlclZhbHVlUGFpciwgd2hlbiB0eXBlIGlzIEVudW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk5NTgiPjIwOTk1ODwvYT4KK1N1cHBvcnQgZ2V0dGluZyBkZWZhdWx0IHZhbHVlIGZyb20gSU1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDMxMCI+MjEwMzEwPC9hPgorSUphdmFFbGVtZW50RGVsdGEgY29udGFpbnMgd3JvbmcgZGF0YSBhZnRlciBBUFQgcHJvY2Vzc29yIGlzIGVuYWJsZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTAyMTMiPjIxMDIxMzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBVbnVzZWQgU3VwcHJlc3NXYXJuaW5ncyBzaG91bGRuJ3QgY29tcGxhaW4gaWYgd2FybmluZ3MgYXJlIG5vdCBldmVuIGVuYWJsZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTAwNzAiPjIxMDA3MDwvYT4KK1R5cGUgaGllcmFyY2h5IHVucHJlZGljdGFibGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTA0MDQiPjIxMDQwNDwvYT4KK01ldGhvZCBwYXJhbWV0ZXJzIGFyZSBub3QgcmVjb3ZlcmVkIHdoZW4gZm9sbG93ZWQgYnkgYW4gYW5ub3RhdGlvbiB3aXRoIGEgc3ludGF4IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwNDIyIj4yMTA0MjI8L2E+CitbY29tcGlsZXJdIE5lZWQgdG8gaGF2ZSBsb2NhbCBiaW5kaW5ncyBjcmVhdGVkIGluIGVycm9yIGNhc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEwMjczIj4yMTAyNzM8L2E+CitDb250ZW50IEFzc2lzdCBjYW5ub3QgY29wZSB3aXRoIGV4cGxpY2l0IHBhcmFtZXRlciB0eXBlcworCis8YSBuYW1lPSJ2XzgyNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTQgLSBOb3ZlbWJlciAyMCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MjUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODI1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5NjIzIj4yMDk2MjM8L2E+CitOdWxsUG9pbnRlcmV4Y2VwdGlvbiBvbiBMaXN0LnRvQXJyYXkgKyBGMworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTgyMyI+MjA5ODIzPC9hPgorSUFubm90YXRpb24jZ2V0U291cmNlUmFuZ2UoKSBhbmQgI2dldE5hbWVSYW5nZSgpIHRocm93IEpNRSBvbiBhbm5vdGF0aW9uIG9mIElMb2NhbFZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5OTYxIj4yMDk5NjE8L2E+CitbY29tcGlsZXJdW2FwdF0gTlBFIGluIGFwdCBwcm9jZXNzaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5NDc1Ij4yMDk0NzU8L2E+CitCaW5kaW5nS2V5LmlzUmF3VHlwZSgpIGRvZXNuJ3QgcmV0dXJuIHRoZSByaWdodCByZXN1bHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkyMjIiPjIwOTIyMjwvYT4KK1N0YWNrIG92ZXJmbG93IGluIFR5cGVIaWVyYXJjaHlQZXJmVGVzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTY2MSI+MjA5NjYxPC9hPgorSUxvY2FsVmFyaWFibGUgZm9yIG1ldGhvZCBwYXJhbWV0ZXIgbWlzc2VzIGFubm90YXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5NjU1Ij4yMDk2NTU8L2E+CitbanNyMTk5XSBleHBvcnQgcGFja2FnZSBzaG91bGQgc3BlY2lmeSB4LWludGVybmFsOj10cnVlCisKKzxhIG5hbWU9InZfODI0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNCAtIE5vdmVtYmVyIDEzLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgyNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MjQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBuZXcgY29tcGlsZXIgb3B0aW9uIHRvIGZpbmQgcmVkdW5kYW50IHN1cGVyaW50ZXJmYWNlcy4KKzxwcmU+CisqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFJlZHVuZGFudCBTdXBlcmludGVyZmFjZQorKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIHR5cGUKKyogICAgZXhwbGljaXRseSBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0aGF0IGlzIGFscmVhZHkgaW1wbGVtZW50ZWQgYnkgYW55IAorKiAgICBvZiBpdHMgc3VwZXJ0eXBlcy4KKyogICAgIC0gb3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZSIKKyogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgorPC9wcmU+Cisoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3OTE4Ij5idWcgNzc5MTg8L2E+KQorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA5NTEiPjIwMDk1MTwvYT4KK1thc3QgcmV3cml0ZV0gcmVtb3ZpbmcgcGFyZW50aGVzZXMgeWllbGRzIHN5bnRheCBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTMxOSI+MjA5MzE5PC9hPgorW2FzdCByZXdyaXRlXSBAU3VwcHJlc3NXYXJuaW5nIGlzIGluc2VydGluZyBhbiBleHRyYSBsaW5lIGJyZWFrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4MzgzIj4yMDgzODM8L2E+CitJUHJvYmxlbS5VbnVzZWRXYXJuaW5nVG9rZW4gaGFzIHdyb25nIGNhdGVnb3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5MTUzIj4yMDkxNTM8L2E+CitbMS41XVtjb21waWxlcl0gVmVyaWZ5RXJyb3IgZHVlIHRvIGdlbmVyaWMgY2FzdCB0byBhIG5vbiB2aXNpYmxlIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkxNTAiPjIwOTE1MDwvYT4KK1tkb21dIFJlY292ZXJlZCB0eXBlIGJpbmRpbmcgZm9yICZxdW90O2phdmEubGFuZy5PYmplY3QmcXVvdDsgaW5mb3JtYXRpb24gYXJlIG5vdCBjb21wbGV0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjQxMCI+MTg2NDEwPC9hPgorW2RvbV0gU3RhY2tPdmVyZmxvd0Vycm9yIGR1ZSB0byBlbmRsZXNzIHN1cGVyY2xhc3MgYmluZGluZ3MgaGllcmFyY2h5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MTgiPjc3OTE4PC9hPgorW2NvbXBpbGVyXSBVbm5lY2Vzc2FyeSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgaW4gY2xhc3MgZGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg5OTUiPjIwODk5NTwvYT4KK1N0YXRpYyBtZXRob2QgaGlkZXMgbWV0aG9kIGZyb20gaW5zdGFuY2Ugd2hlbiB1c2luZyBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTA1NCI+MjA5MDU0PC9hPgorW3NlYXJjaF0gZm9yIHJlZmVyZW5jZXMgdG8gbWV0aG9kIGZpbmRzIHdyb25nIGludGVyZmFjZSBjYWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4MjM0Ij4yMDgyMzQ8L2E+CitTcGVjaWZ5IHRoYXQgQ29kZUZvcm1hdHRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODAxOCI+MTM4MDE4PC9hPgorV2hlbiBwYXNzZWQgdW5zdXBwb3J0ZWQgamF2YWMgLXdhcm4gd2FybmluZyBvcHRpb25zLCBmYWlsIGdyYWNlZnVsbHkgJmFtcDsgaWdub3JlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NDIzIj4yMDY0MjM8L2E+CitPcHRpbWl6YXRpb24gb3Bwb3J0dW5pdHkgaW4gRGVmYXVsdFByb2JsZW1GYWN0b3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4OTYwIj4yMDg5NjA8L2E+CitJbnRlcm5hbCBDb21waWxlciBFcnJvciBvbiB2YWxpZCBjb2RlIHdpdGggcGFydGljdWxhciBjb21iaW5hdGlvbiBvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIGFuZCBvLmUuai5jLmMuc291cmNlCisKKzxhIG5hbWU9InZfODIzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNNCAtIE5vdmVtYmVyIDYsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODIzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgyMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODgwNyI+MjA4ODA3PC9hPgorSmF2YUNvcmUuZ2V0RGVmYXVsdE9wdGlvbnMoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdGhlcmUgaXMgbm8gd29ya3NwYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NTk2Ij4xNzg1OTY8L2E+Citbc2VhcmNoXSBTZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIGRvZXMgbm90IGZpbmQgcmVmZXJlbmNlcyB0byBpbnRlcmZhY2UgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NzU0Ij4yMDc3NTQ8L2E+CitbQVNUXVtET01dIHNvdXJjZSByYW5nZSBvZiBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwYXJlbnRoZXNpcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NzQzMCI+MTg3NDMwPC9hPgorVW5yZXNvbHZlZCB0eXBlcyBzdXJmYWNpbmcgdGhyb3VnaCBET00gQVNUIGZvciBhbm5vdGF0aW9uIGRlZmF1bHQgdmFsdWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3OTI5Ij4yMDc5Mjk8L2E+CitObyBpbXBvcnQgYWRkZWQgdG8gZGVjbGFyaW5nIGNsYXNzIGlmIHN0YXRpYyBtZW1iZXIgaXMgJ2NsYXNzJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzU3MiI+MjA3NTcyPC9hPgorW3NlbGVjdF0gY29kZXNlbGVjdCBub3QgYXZhaWxhYmxlIGlmIHVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTA5MyI+MTExMDkzPC9hPgorTW9yZSBwcm9ibGVtcyB3aXRoIElNZXRob2RCaW5kaW5nI2lzU3Vic2lnbmF0dXJlKC4uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjAxNyI+MjA2MDE3PC9hPgorW2NvbXBpbGVyXSBUeXBlIG1pc3RtYXRjaCBvbiBmaWVsZCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQgYWdhaW5zdCBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4MjYzIj4yMDgyNjM8L2E+CitbYXN0IHJld3JpdGVdIHBlcmZvcm1hbmNlIHByb2JsZW1zIHdpdGggbG90cyBvZiBjaGFuZ2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NzU4Ij4yMDc3NTg8L2E+CitbMS41XVtjb21waWxlcl0gVW51c2VkIFN1cHJlc3NXYXJuaW5ncyBkZXRlY3Rpb24gc2hvdWxkIGNvbnNpZGVyIG1vcmUgZXJyb3Igc2l0dWF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzU3MyI+MjA3NTczPC9hPgorWzEuNV1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yOiBDbGFzc0Nhc3RFeGNlcHRpb24gLyBBcnJheUJpbmRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDgwMzAiPjIwODAzMDwvYT4KK1sxLjddW2NvbXBpbGVyXSBNaXNzaW5nIHVudXNlZCB0eXBlIGFyZ3VtZW50IHdhcm5pbmcgZm9yIGNvbnN0cnVjdG9yIGludm9jYXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4Mzg2Ij4yMDgzODY8L2E+CitBbm5vdGF0aW9uIEphdmFkb2MgZ2xpdGNoZXMKKworPGEgbmFtZT0idl84MjIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0zIC0gT2N0b2JlciAzMSwgMjAwNyAtIDMuNCBNSUxFU1RPTkUgMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MjIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODIyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgQVBJIDxjb2RlPkNvZGVGb3JtYXR0ZXIjZm9ybWF0KGludCwgU3RyaW5nLCBJUmVnaW9uW10sIGludCwgU3RyaW5nKTwvY29kZT4gdG8gYWxsb3cgdGhlIGZvcm1hdHRpbmcgb2YgYSBzZXQgb2YKKwkgPGNvZGU+b3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uPC9jb2RlPnMuPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMzA0Ij4yMDMzMDQ8L2E+CitBbGxvdyB0byBmb3JtYXQgc2V0IG9mIHJlZ2lvbnMKKworPGEgbmFtZT0idl84MjEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0zIC0gT2N0b2JlciAyNywgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MjEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODIxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgbmV3IGNvbXBpbGVyIG9wdGlvbmFsIHdhcm5pbmcgZm9yIGRpYWdub3NpbmcgdW5uZWNlc3NhcnkgQFN1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbi4gVGhpcyBpcyBtb3N0bHkgaGVscGZ1bAordG8gZ2V0IHJpZCBvZiA8Y29kZT5AU3VwcmVzc1dhcm5pbmdzKC4uLik8L2NvZGU+IGFubm90YXRpb25zIHdoaWNoIHdlcmUgbmVjZXNzYXJ5IGEgd2hpbGUgYWdvLCBidXQgYXJlIG5vIGxvbmdlciB1c2VmdWwuCitOb3RlIHRoYXQgPGNvZGU+QFN1cHByZXNzV2FybmluZ3MoImFsbCIpPC9jb2RlPiBpcyBzdGlsbCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgZm9yIHVubmVjZXNzYXJ5IDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiwKK2FzIGl0IGlzIHRoZSBtYXN0ZXIgc3dpdGNoIHRvIHNpbGVuY2UgQUxMIHdhcm5pbmdzLgorQWxzbyBhZGRlZCBvcHRpb246IDxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX1VOVVNFRF9XQVJOSU5HX1RPS0VOPC9jb2RlPiBhbmQgcHJvYmxlbSBJRAorPGNvZGU+SVByb2JsZW0uVW51c2VkV2FybmluZ1Rva2VuPC9jb2RlPi4KKzxwcmU+CisqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVubmVjZXNzYXJ5IEBTdXBwcmVzc1dhcm5pbmdzCisqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW4gZW5jb3VudGVyaW5nIEBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gCisqICAgIGZvciB3aGljaCBubyBjb3JyZXNwb25kaW5nIHdhcm5pbmcgZ290IGRldGVjdGVkIGluIHRoZSBjb2RlLiBUaGlzIGRpYWdub3N0aWMgaXMgcHJvdmlkZWQgdG8gaGVscCBkZXZlbG9wZXJzIHRvIGdldAorKiAgICByaWQgb2YgdHJhbnNpZW50IEBTdXBwcmVzc1dhcm5pbmdzIG5vIGxvbmdlciBuZWVkZWQuIE5vdGUgdGhhdCA8Y29kZT5AU3VwcHJlc3NXYXJuaW5ncygiYWxsIik8L2NvZGU+IGlzIHN0aWxsIAorKiAgICBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgZm9yIHVubmVjZXNzYXJ5IDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzPC9jb2RlPiwgYXMgaXQgaXMgdGhlIG1hc3RlciBzd2l0Y2ggdG8gc2lsZW5jZSBBTEwgd2FybmluZ3MuCisqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW4iCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCis8L3ByZT4KKyhzZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NTMzIj5idWcgMTI3NTMzPC9hPikKKzwvbGk+Cis8bGk+QWRkZWQgdGhlIGZvbGxvd2luZyBBUElzIHRvIHN1cHBvcnQgYW5ub3RhdGlvbiBpbiB0aGUgSmF2YSBtb2RlbCAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MTEyIj5idWcgNzkxMTI8L2E+CisgICAgIGZvciBtb3JlIGRldGFpbHMpOgorICAgICA8dWw+CisgICAgIDxsaT48cHJlPgorcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbiBleHRlbmRzIElKYXZhRWxlbWVudCwgSVNvdXJjZVJlZmVyZW5jZSB7CisJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisJSU1lbWJlclZhbHVlUGFpcltdIGdldE1lbWJlclZhbHVlUGFpcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCUlTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCWludCBnZXRPY2N1cnJlbmNlQ291bnQoKTsKK30gICAgPC9wcmU+PC9saT4KKyAgICAgPGxpPjxwcmU+CitwdWJsaWMgaW50ZXJmYWNlIElNZW1iZXJWYWx1ZVBhaXIgeworCWludCBLX0lOVCA9IDE7CisJaW50IEtfQllURSA9IDI7CisJaW50IEtfU0hPUlQgPSAzOworCWludCBLX0NIQVIgPSA0OworCWludCBLX0ZMT0FUID0gNTsKKwlpbnQgS19ET1VCTEUgPSA2OworCWludCBLX0xPTkcgPSA3OworCWludCBLX0JPT0xFQU4gPSA4OworCWludCBLX1NUUklORyA9IDk7CisJaW50IEtfQU5OT1RBVElPTiA9IDEwOworCWludCBLX0NMQVNTID0gMTE7CisJaW50IEtfUVVBTElGSUVEX05BTUUgPSAxMjsKKwlpbnQgS19VTktOT1dOID0gMTM7CisJU3RyaW5nIGdldE1lbWJlck5hbWUoKTsKKwlPYmplY3QgZ2V0VmFsdWUoKTsKKwlpbnQgZ2V0VmFsdWVLaW5kKCk7Cit9ICAgIDwvcHJlPjwvbGk+CisgICAgIDxsaT48cHJlPgorcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGFibGUgeworCUlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIG5hbWUpOworCUlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfSAgICA8L3ByZT48Y29kZT5JRmllbGQ8L2NvZGU+LCA8Y29kZT5JTWV0aG9kPC9jb2RlPiwgPGNvZGU+SVR5cGU8L2NvZGU+LCA8Y29kZT5JUGFja2FnZURlY2xhcmF0aW9uPC9jb2RlPiwgYW5kIDxjb2RlPklMb2NhbFZhcmlhYmxlPC9jb2RlPgorICAgICBub3cgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLjwvbGk+CisgICAgIDxsaT48cHJlPgorcHVibGljIGludGVyZmFjZSBJSmF2YUVsZW1lbnQgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKKwkuLi4KKwlpbnQgQU5OT1RBVElPTiA9IDE2OworCS4uLgorfSAgICA8L3ByZT48L2xpPgorICAgICA8bGk+PHByZT4KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbGVtZW50RGVsdGEgeworCS4uLgorCXB1YmxpYyBpbnQgRl9BTk5PVEFUSU9OUyA9IDB4NDAwMDAwOworCXB1YmxpYyBJSmF2YUVsZW1lbnREZWx0YVtdIGdldEFubm90YXRpb25EZWx0YXMoKTsJCisJLi4uCit9ICAgIDwvcHJlPjwvbGk+CisgICAgIDwvdWw+Cis8L2xpPgorPGxpPkNvZGUgQXNzaXN0OiBBZGRlZCBBUEkgPGNvZGU+Q29tcGxldGlvblJlcXVlc3RvciNDb21wbGV0aW9uUmVxdWVzdG9yKGJvb2xlYW4gaWdub3JlQWxsKTwvY29kZT4gdG8gYmUgYWJsZSB0byBpZ25vcmUgYWxsIGNvbXBsZXRpb24ga2luZHMgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIHByb3Bvc2UgYWxsIGNvbXBsZXRpb24ga2luZHMgYnkgZGVmYXVsdC4KKzwvbGk+Cis8bGk+Q29kZSBBc3Npc3Q6IEltcHJvdmVkIGNvZGUgYXNzaXN0IGluc2lkZSBhbiA8Y29kZT5pZjwvY29kZT4gc3RhdGVtZW50IHdpdGggYW4gPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gZXhwcmVzc2lvbiBhcyBjb25kaXRpb24uPGJyPgorV2hlbiBhIG1lbWJlciBhY2Nlc3MgaXMgY29tcGxldGVkIGluIHRoaXMgY2FzZSB0aGVuIHRoZSBtZW1iZXJzIG9mIHRoZSA8Y29kZT5pbnN0YW5jZW9mPC9jb2RlPiB0eXBlIGFyZSBwcm9wb3NlZCBhbmQgdGhlIHJlY2VpdmVyIGlzIGNhc3RlZCB0byB0aGlzIHR5cGUuCis8cHJlPgorT2JqZWN0IHggPSAuLi4gOworaWYgKHggaW5zdGFuY2VvZiBJVHlwZSkgeworICAgeC5nZXR8Y29kZSBhc3Npc3QKKzwvcHJlPgorVGhlIG1ldGhvZCA8Y29kZT5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoKTwvY29kZT4gd2lsbCBiZSBwcm9wb3NlZCBhbmQgdGhlIHJlY2VpdmVyIHdpbGwgYmUgY2FzdGVkIHRvIDxjb2RlPklUeXBlPC9jb2RlPi4KK1RoZSBjb21wbGV0aW9uIHN0cmluZyB3aWxsIGJlICcoKElUeXBlKXgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpJy48YnI+Cis8YnI+CitUaGVzZSBwcm9wb3NhbHMgd2lsbCBiZSBwcm9wb3NlZCB3aXRoIHRoZSBuZXcgcHJvcG9zYWwga2luZHMgPGNvZGU+Q29tcGxldGlvblByb3Bvc2FsI01FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI8L2NvZGU+IGFuZAorPGNvZGU+Q29tcGxldGlvblByb3Bvc2FsI0ZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjwvY29kZT4uPGJyPgorVGhlc2UgbmV3IHByb3Bvc2FscyByZXF1aXJlIG5ldyBBUEkgb24gQ29tcGxldGlvblByb3Bvc2FsIHRvIGJlIHVzYWJsZSBieSBjbGllbnQuCis8cHJlPgorcHVibGljIGNsYXNzIENvbXBsZXRpb25Qcm9wb3NhbCB7CisgICAuLi4KKworICAgLyoqCisgICAgKiBDb21wbGV0aW9uIGlzIGEgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIHdpdGggYSBjYXN0ZWQgcmVjZWl2ZXIuCisgICAgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQorICAgICogJmx0O2NvZGUmZ3Q7InJlY2VpdmVyLmZvXigpOyImbHQ7L2NvZGUmZ3Q7IGFuZCBjb21wbGV0ZSBpdCB0bworICAgICogJmx0O2NvZGUmZ3Q7IiIoKFgpcmVjZWl2ZXIpLmZvbygpOyImbHQ7L2NvZGUmZ3Q7LgorICAgICogJmx0O3AmZ3Q7CisgICAgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKyAgICAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKyAgICAqICZsdDt1bCZndDsKKyAgICAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKyAgICAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQorICAgICogdGhlIG1vZGlmaWVycyBmbGFncyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVmZXJlbmNlZAorICAgICogJmx0Oy9saSZndDsKKyAgICAqICZsdDtsaSZndDt7QGxpbmsgI2dldE5hbWUoKX0gLQorICAgICogdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0O2xpJmd0O3tAbGluayAjZ2V0UmVjZWl2ZXJTaWduYXR1cmUoKX0gLQorICAgICogdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZWNlaXZlciB0eXBlLiBJdCdzIHRoZSB0eXBlIG9mIHRoZSBjYXN0IGV4cHJlc3Npb24uCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKyAgICAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgdGhhdCBpcyByZWZlcmVuY2VkCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0Oy91bCZndDsKKyAgICAqICZsdDsvcCZndDsKKyAgICAqIAorICAgICogQHNlZSAjZ2V0S2luZCgpCisgICAgKiAKKyAgICAqIEBzaW5jZSAzLjQKKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVI7CisKKyAgIC8qKgorICAgICogQ29tcGxldGlvbiBpcyBhIHJlZmVyZW5jZSB0byBhIGZpZWxkIHdpdGggYSBjYXN0ZWQgcmVjZWl2ZXIuCisgICAgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQorICAgICogJmx0O2NvZGUmZ3Q7InJlY2V2aWVyLnJlZl4gPSAwOyImbHQ7L2NvZGUmZ3Q7IGFuZCBjb21wbGV0ZSBpdCB0bworICAgICogJmx0O2NvZGUmZ3Q7IigoWClyZWNlaXZlcikucmVmY291bnQgPSAwOyImbHQ7L2NvZGUmZ3Q7LgorICAgICogJmx0O3AmZ3Q7CisgICAgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKyAgICAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKyAgICAqICZsdDt1bCZndDsKKyAgICAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKyAgICAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQKKyAgICAqICZsdDsvbGkmZ3Q7CisgICAgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXRGbGFncygpfSAtCisgICAgKiB0aGUgbW9kaWZpZXJzIGZsYWdzIChpbmNsdWRpbmcgQUNDX0VOVU0pIG9mIHRoZSBmaWVsZCB0aGF0IGlzIHJlZmVyZW5jZWQKKyAgICAqICZsdDsvbGkmZ3Q7CisgICAgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXROYW1lKCl9IC0KKyAgICAqIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmllbGQgdGhhdCBpcyByZWZlcmVuY2VkCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0O2xpJmd0O3tAbGluayAjZ2V0UmVjZWl2ZXJTaWduYXR1cmUoKX0gLQorICAgICogdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZWNlaXZlciB0eXBlLiBJdCdzIHRoZSB0eXBlIG9mIHRoZSBjYXN0IGV4cHJlc3Npb24uCisgICAgKiAmbHQ7L2xpJmd0OworICAgICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKyAgICAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgZmllbGQncyB0eXBlIChhcyBvcHBvc2VkIHRvIHRoZQorICAgICogc2lnbmF0dXJlIG9mIHRoZSB0eXBlIGluIHdoaWNoIHRoZSByZWZlcmVuY2VkIGZpZWxkCisgICAgKiBpcyBkZWNsYXJlZCkKKyAgICAqICZsdDsvbGkmZ3Q7CisgICAgKiAKKyAgICAqICZsdDsvdWwmZ3Q7CisgICAgKiAmbHQ7L3AmZ3Q7CisgICAgKiAKKyAgICAqIEBzZWUgI2dldEtpbmQoKQorICAgICogCisgICAgKiBAc2luY2UgMy40CisgICAgKi8KKyAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUjsKKworICAgLyoqCisgICAgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBvciBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlbGV2YW50CisgICAgKiByZWNlaXZlciBpbiB0aGUgY29udGV4dCwgb3IgJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsgaWYgbm9uZS4KKyAgICAqICZsdDtwJmd0OworICAgICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKyAgICAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorICAgICogJmx0O3VsJmd0OworICAgICogICZsdDtsaSZndDsmbHQ7Y29kZSZndDtGSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVImbHQ7L2NvZGUmZ3Q7IC0gdHlwZSBzaWduYXR1cmUKKyAgICAqIG9mIHRoZSB0eXBlIHRoYXQgY2FzdCB0aGUgcmVjZWl2ZXIgb2YgdGhlIGZpZWxkIHRoYXQgaXMgcmVmZXJlbmNlZCZsdDsvbGkmZ3Q7CisgICAgKiAgJmx0O2xpJmd0OyZsdDtjb2RlJmd0O01FVEhPRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVImbHQ7L2NvZGUmZ3Q7IC0gdHlwZSBzaWduYXR1cmUKKyAgICAqIG9mIHRoZSB0eXBlIHRoYXQgY2FzdCB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlZmVyZW5jZWQmbHQ7L2xpJmd0OworICAgICogJmx0Oy91bCZndDsKKyAgICAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucworICAgICogJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsuIENsaWVudHMgbXVzdCBub3QgbW9kaWZ5IHRoZSBhcnJheQorICAgICogcmV0dXJuZWQuCisgICAgKiAmbHQ7L3AmZ3Q7CisgICAgKiAKKyAgICAqIEByZXR1cm4gYSB0eXBlIHNpZ25hdHVyZSBvciBhIHBhY2thZ2UgbmFtZSAoZGVwZW5kaW5nCisgICAgKiBvbiB0aGUga2luZCBvZiBjb21wbGV0aW9uKSwgb3IgJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsgaWYgbm9uZQorICAgICogQHNlZSBTaWduYXR1cmUKKyAgICAqIAorICAgICogQHNpbmNlIDMuNAorICAgICovCisgICBwdWJsaWMgY2hhcltdIGdldFJlY2VpdmVyU2lnbmF0dXJlKCkge30KKworICAgLyoqCisgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZQorICAgICogc3VicmFuZ2UgaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICAgICogcmVsZXZhbnQgcmVjZWl2ZXIgb2YgdGhlIG1lbWJlciBiZWluZyBjb21wbGV0ZWQuIFRoaXMKKyAgICAqIHJlY2VpdmVyIGlzIGFuIGV4cHJlc3Npb24uCisgICAgKiAKKyAgICAqICZsdDtwJmd0OworICAgICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcga2luZHMgb2YKKyAgICAqIGNvbXBsZXRpb24gcHJvcG9zYWxzOgorICAgICogJmx0O3VsJmd0OworICAgICogICZsdDtsaSZndDsmbHQ7Y29kZSZndDtGSUVMRF9SRUZfV0lUSF9DQVNURURfUkVDRUlWRVImbHQ7L2NvZGUmZ3Q7Jmx0Oy9saSZndDsKKyAgICAqICAmbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7TUVUSE9EX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiZsdDsvY29kZSZndDsmbHQ7L2xpJmd0OworICAgICogJmx0Oy91bCZndDsKKyAgICAqIEZvciBraW5kcyBvZiBjb21wbGV0aW9uIHByb3Bvc2FscywgdGhpcyBtZXRob2QgcmV0dXJucyAmbHQ7Y29kZSZndDswJmx0Oy9jb2RlJmd0Oy4KKyAgICAqICZsdDsvcCZndDsKKyAgICAqIAorICAgICogQHJldHVybiBjaGFyYWN0ZXIgaW5kZXggb2YgcmVjZWl2ZXIgc3RhcnQgcG9zaXRpb24gKGluY2x1c2l2ZSkKKyAgICAqIAorICAgICogQHNpbmNlIDMuNAorICAgICovCisgICBwdWJsaWMgaW50IGdldFJlY2VpdmVyU3RhcnQoKSB7fQorCisgICAvKioKKyAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBzdWJyYW5nZQorICAgICogaW4gdGhlIHNvdXJjZSBmaWxlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICAgICogcmVsZXZhbnQgcmVjZWl2ZXIgb2YgdGhlIG1lbWJlciBiZWluZyBjb21wbGV0ZWQuCisgICAgKiAKKyAgICAqICogJmx0O3AmZ3Q7CisgICAgKiBUaGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBraW5kcyBvZgorICAgICogY29tcGxldGlvbiBwcm9wb3NhbHM6CisgICAgKiAmbHQ7dWwmZ3Q7CisgICAgKiAgJmx0O2xpJmd0OyZsdDtjb2RlJmd0O0ZJRUxEX1JFRl9XSVRIX0NBU1RFRF9SRUNFSVZFUiZsdDsvY29kZSZndDsmbHQ7L2xpJmd0OworICAgICogICZsdDtsaSZndDsmbHQ7Y29kZSZndDtNRVRIT0RfUkVGX1dJVEhfQ0FTVEVEX1JFQ0VJVkVSJmx0Oy9jb2RlJmd0OyZsdDsvbGkmZ3Q7CisgICAgKiAmbHQ7L3VsJmd0OworICAgICogRm9yIGtpbmRzIG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLCB0aGlzIG1ldGhvZCByZXR1cm5zICZsdDtjb2RlJmd0OzAmbHQ7L2NvZGUmZ3Q7LgorICAgICogJmx0Oy9wJmd0OworICAgICogCisgICAgKiBAcmV0dXJuIGNoYXJhY3RlciBpbmRleCBvZiByZWNlaXZlciBlbmQgcG9zaXRpb24gKGV4Y2x1c2l2ZSkKKyAgICAqIAorICAgICogQHNpbmNlIDMuNAorICAgICovCisgICBwdWJsaWMgaW50IGdldFJlY2VpdmVyRW5kKCkge30KKworICAgLi4uCit9Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzUzMyI+MTI3NTMzPC9hPgorWzEuNV1bY29tcGlsZXJdIHdhcm5pbmcgb24gdW51c2VkIEBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NDQ1Ij4yMDc0NDU8L2E+CitJTWVtYmVyVmFsdWVQYWlyIHdpdGggaGV0ZXJvZ2Vub3VzIGFycmF5IHZhbHVlcyBzaG91bGQgYmUgb2Yga2luZCBLX1VOS05PV04KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDcyNTciPjIwNzI1NzwvYT4KK1tzZWFyY2hdIFNlYXJjaEVuZ2luZSByZXR1cm5zIGluY29ycmVjdGx5IHR5cGVkIFNlYXJjaE1hdGNoIHdoZW4gc2VhcmNoaW5nIGZvciBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDc0NDEiPjIwNzQ0MTwvYT4KK1dyb25nIGRlbHRhIGZvciBmaWxlcyBjcmVhdGVkIGluIGZvbGRlcnMgdGhhdCBhcmUgb24gYSBqYXZhIHByb2plY3QgYXMgY2xhc3NlcyBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDc0NjUiPjIwNzQ2NTwvYT4KK1thc3Npc3RdIENvbXBsZXRpb25SZXF1ZXN0b3IgamF2YWRvYyBkb2Vzbid0IHNwZWNpZnkgaWYgJ2lzSWdub3JlZCcgaGFzIGFuIGVmZmVjdCBvbiByZXF1aXJlZCBwcm9wb3NhbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTMyMTAiPjE5MzIxMDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbnRlcm5hbCBjb21waWxlciBlcnJvciBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTM5MDkiPjE5MzkwOTwvYT4KK2ltcHJvdmUgY29udGVudCBhc3Npc3QgYWZ0ZXIgJ2luc3RhbmNlb2YnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3Mjk5Ij4yMDcyOTk8L2E+CitbMS41XVtjb21waWxlcl0gU3RhY2tPdmVyZmxvdyB3aGVuIGVsaW1pbmF0aW5nIHR5cGUgdmFyaWFibGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NDE4Ij4yMDc0MTg8L2E+CitOZWVkIEFQSSBvbiBDb21wbGV0aW9uUmVxdWVzdG9yIHRvIGlnbm9yZSBhbGwgcHJvcG9zYWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkxMTIiPjc5MTEyPC9hPgorWzEuNV0gW21vZGVsXSBhY2Nlc3NpbmcgYW5ub3RhdGlvbiBvbiBKYXZhIGVsZW1lbnRzCisKKzxhIG5hbWU9InZfODIwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMyAtIE9jdG9iZXIgMjMsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODIwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgyMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgbmV3IGNvbXBpbGVyIHBhcnRpY2lwYW50IEFQSSB0byBub3RpZnkgcGFydGljaXBhbnRzIHdoZW4gYSBwcm9qZWN0J3MgYnVpbGQgaXMgZmluaXNoZWQKKyhzZWUgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDEwNyI+YnVnIDE4MDEwNzwvYT4pOgorPHByZT4KKy8qKgorICogTm90aWZpZXMgdGhpcyBwYXJ0aWNpcGFudCB0aGF0IGEgYnVpbGQgaGFzIGZpbmlzaGVkIGZvciB0aGUgcHJvamVjdC4KKyAqIFRoaXMgd2lsbCBiZSBzZW50LCBldmVuIGlmIGJ1aWxkU3RhcnRpbmcoKSB3YXMgbm90IHNlbnQgd2hlbiBubyBzb3VyY2UgZmlsZXMgbmVlZGVkIHRvIGJlIGNvbXBpbGVkCisgKiBvciB0aGUgYnVpbGQgZmFpbGVkLgorICogT25seSBzZW50IHRvIHBhcnRpY2lwYW50cyBpbnRlcmVzdGVkIGluIHRoZSBwcm9qZWN0LgorICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgYWJvdXQgdG8gYnVpbGQKKyAqIEBzaW5jZSAzLjQKKyAgKi8KK3B1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoSUphdmFQcm9qZWN0IHByb2plY3QpCis8L3ByZT4KKzwvbGk+Cis8bGk+VGhlICdOdWxsIHBvaW50ZXIgYWNjZXNzJyBwb3RlbnRpYWwgcHJvZ3JhbW1pbmcgcHJvYmxlbSBpcyBub3cgcmVwb3J0ZWQgYXMgYSAKKyAgICB3YXJuaW5nIGJ5IGRlZmF1bHQsIHdoZXJlYXMgaXQgd2FzIHByZXZpb3VzbHkgaWdub3JlZC4gU2VlIGRldGFpbHMgaW4gYnVnCisgICAgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyODc1Ij4xOTI4NzU8L2E+LgorPC9saT4gCis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzU0MSI+MTU3NTQxPC9hPgorW29yZ2FuaXplIGltcG9ydHNdIG9yZ2FuaXplIGltcG9ydHMgZG9lcyBub3Qgd29yayBpbiBwYWNrYWdlLWluZm8uamF2YQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDcyNCI+MjAwNzI0PC9hPgorW2NvbXBpbGVyXSBBc3NpZ25tZW50IHdpdGggbm8gZWZmZWN0IHVuZGV0ZWN0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI4NzUiPjE5Mjg3NTwvYT4KK1tjb21waWxlcl1bb3B0aW9uc11bbnVsbF0gU2V0ICZxdW90O051bGwgcG9pbnRlciBhY2Nlc3MmcXVvdDsgdG8gd2FybmluZyBieSBkZWZhdWx0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwMTA3Ij4xODAxMDc8L2E+CitbUEVSRl0gbmVlZCBDb21waWxhdGlvblBhcnRpY2lwYW50LmJ1aWxkQ29tcGxldGUoKSBBUEkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDU4NjAiPjIwNTg2MDwvYT4KK0FTVFBhcnNlci5jcmVhdGVCaW5kaW5ncygpIHJldHVybnMgW251bGxdCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2MDI3Ij4yMDYwMjc8L2E+CitKYXZhQ29yZSNpbml0aWFsaXplQWZ0ZXJMb2FkIC0gVXRpbC5zZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkgcGVyZm9ybWFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY1MjIiPjIwNjUyMjwvYT4KK0Noa3BpaSBlcnJvciBpbiBOMjAwNzEwMTYtMDAxMAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjQ4MyI+MjA2NDgzPC9hPgorW2NvbXBpbGVyXVsxLjddIDEuNyBWTXMgY2Fubm90IHJlYWQgLmNsYXNzIGZpbGVzIGdlbmVyYXRlZCB3aXRoIHRhcmdldCAxLjcKKworPGEgbmFtZT0idl84MTkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0zIC0gT2N0b2JlciAxNiwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MTkKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODE5Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgbmV3IGNvbXBpbGVyIG9wdGlvbmFsIHdhcm5pbmcgZm9yIGRpYWdub3NpbmcgZ2VuZXJpYyBpbnZvY2F0aW9ucyBvZiBub24tZ2VuZXJpYyBtZXRob2RzLiBCYXNpY2FsbHksIGZyb20gSmF2YTcgY29tcGxpYW5jZSBvbiwgYSBub24tZ2VuZXJpYyBtZXRob2QKK21heSBiZSBpbnZva2VkIHdpdGggZXhwbGljaXQgdHlwZSBhcmd1bWVudHMgc3ludGF4LCB3aGljaCB0aG91Z2ggdW51c2VkIGFyZSB0byBiZSBzaWxlbnRseSBpZ25vcmVkLiBXaXRoIHRoaXMgd2FybmluZywgdGhlIGNvbXBpbGVyIHdpbGwgc3RpbGwgZmxhZyBzdWNoIHNpdHVhdGlvbnMuCitUaGUgd2FybmluZyBpcyBvbiBieSBkZWZhdWx0LCBhbmQgaXMgc3VwcHJlc3NhYmxlIHdpdGggPGNvZGU+QFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpPC9jb2RlPi4KK0Fsc28gYWRkZWQgb3B0aW9uOiA8Y29kZT5KYXZhQ29yZS5DT01QSUxFUl9QQl9VTlVTRURfVFlQRV9BUkdVTUVOVFNfRk9SX01FVEhPRF9JTlZPQ0FUSU9OPC9jb2RlPiBhbmQgcHJvYmxlbSBJRAorPGNvZGU+SVByb2JsZW0uVW51c2VkVHlwZUFyZ3VtZW50c0Zvck1ldGhvZEludm9jYXRpb248L2NvZGU+LgorPHByZT4KKyogQ09NUElMRVIgLyBSZXBvcnRpbmcgUHJlc2VuY2Ugb2YgVHlwZSBBcmd1bWVudHMgZm9yIGEgTm9uLUdlbmVyaWMgTWV0aG9kIEludm9jYXRpb24KKyogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgdHlwZSBhcmd1bWVudHMgYXJlIGVuY291bnRlcmVkIGZvciBhCisqICAgIG5vbi1nZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uLiBOb3RlIHRoYXQgcHJpb3IgdG8gY29tcGxpYW5jZSBsZXZlbCBpcyAiMS43IiwgdGhpcyBzaXR1YXRpb24gd291bGQgYXV0b21hdGljYWxseSByZXN1bHQKKyogICAgaW4gYW4gZXJyb3IuIEZyb20gSmF2YTcgb24sIHVudXNlZCB0eXBlIGFyZ3VtZW50cyBhcmUgYmVpbmcgdG9sZXJhdGVkLCBhbmQgb3B0aW9uYWxseSB3YXJuZWQgYWdhaW5zdC4KKyogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFR5cGVBcmd1bWVudHNGb3JNZXRob2RJbnZvY2F0aW9uIgorKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKyogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgorPC9wcmU+Cis8L2xpPgorPGxpPkZpeCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyODg1Ij5idWcgMTIyODg1PC9hPiByZXF1aXJlZCB0aGUgYnVpbGQgc3RhdGUgZm9ybWF0IHRvIGNoYW5nZS4gCisgICAgQXMgYSBjb25zZXF1ZW5jZSwgYSBmdWxsIHJlYnVpbGQgaXMgZXhwZWN0ZWQgd2hlbiByZXVzaW5nIGV4aXN0aW5nIHdvcmtzcGFjZXMuCis8L2xpPgorPC91bD4KKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4MjMwIj4xNjgyMzA8L2E+CitbMS41XVtjb21waWxlcl0gTm9uLWdlbmVyaWMgbWV0aG9kcyBjYW4gYmUgY2FsbGVkIHdpdGggdHlwZSBhcmd1bWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDYzMzYiPjIwNjMzNjwvYT4KK1thc3Npc3RdIENvbXBsZXRpb25Qcm9wb3NhbCNnZXRUb2tlblN0YXJ0KCkgcmV0dXJuIGFsd2F5cyAwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyODg1Ij4xMjI4ODU8L2E+CitbYnVpbGRlcl0gUHJvamVjdCBidWlsZCBzdGF0ZXMgc2hvdWxkIG5vdCBzdG9yZSB0aGUgYWNjZXNzIHJlc3RyaWN0aW9ucyB0ZW1wbGF0ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDUyMzUiPjIwNTIzNTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIHN5bnRheCBoaWdobGlnaHRpbmcgZmxhZyBjb3JyZWN0IHN5bnRheCBhcyBhIGhpZXJhcmNoeSBjeWNsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDAyNiI+MjAwMDI2PC9hPgorWzEuNV1bY29tcGlsZXJdIGNvbXBpbGVyIG1lc3NhZ2Ugb24gaW5jb21wbGV0ZSBlbnVtIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDAxNiI+MjAwMDE2PC9hPgorWzEuNV1bY29tcGlsZXJdIGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gZW51bSBjb25zdGFudHMgbXVzdCBpbXBsZW1lbnQgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTAyNCI+MTIxMDI0PC9hPgorWzEuNV1bY29tcGlsZXJdIENhbGwgb2YgcGFyYW1ldHJpemVkIG1ldGhvZCByZXBvcnRlZCBhbWJpZ3VvdXMgYnkgZWNsaXBzZSBub3QgYnkgamF2YWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDYwMjEiPjIwNjAyMTwvYT4KK0ltcHJvdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nIGluICZxdW90O0luaXRpYWxpemluZyBKYXZhIFRvb2xpbmcmcXVvdDsgam9iCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0ODQ1Ij4yMDQ4NDU8L2E+CitCYXRjaENvbXBpbGVyVGVzdCB0ZXN0cyBmYWlsIHdoZW4gdGhlIHJ1bnRpbWUgSlJFIHBvaW50cyB0byBhIHBhdGggY29udGFpbmluZyB3aGl0ZSBzcGFjZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU4MjMiPjE5NTgyMzwvYT4KK0NsYXNzRm9ybWF0RXhjZXB0aW9uIGR1cmluZyBjbGFzcyBmaWxlIGluZGV4aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMDg4Ij4xMjAwODg8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb21wYXJhYmxlIHR5cGVzIC0gb2JqZWN0LmdldENsYXNzKCkgPT0gU29tZS5jbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODA0NiI+MTQ4MDQ2PC9hPgorW2NvbXBpbGVyXVsxLjVdIHNob3VsZCByYWlzZSBhbiBpbmNvbXBhdGlibGUgdHlwZXMgZXJyb3Igd2hlbiBhIGdpdmVuIHR5cGUgdmFyaWFibGUgY2Fubm90IGZ1bGZpbGwgaXRzIGJvdW5kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODg3MCI+MTU4ODcwPC9hPgorWzEuNV1bY29tcGlsZXJdIGphdmFjIGluY29udmVydGlibGUgdHlwZXMgb24gY2FzdCBhbGxvd2VkIGJ5IEVjbGlwc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTk0MCI+ODk5NDA8L2E+CitbMS41XVtjb21waWxlcl0gd3JvbmcgY2FzdCBhbGxvd2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MzciPjkwNDM3PC9hPgorWzEuNV1bY29tcGlsZXJdIENhc3Rpbmcgd2l0aCBFcmFzdXJlIGdlbmVyYXRlcyB3YXJuaW5nIGluIEVjbGlwc2UgYnV0IEVSUk9SIHdpdGggSkRLCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY1MzUyIj4xNjUzNTI8L2E+CitbMS41XVtjb21waWxlcl0gQ2FzdCBzaG91bGQgYmUgcmVqZWN0ZWQKKworCis8YSBuYW1lPSJ2XzgxOCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTMgLSBPY3RvYmVyIDksIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODE4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgxOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTg0NyI+MjA1ODQ3PC9hPgorW2NvbXBpbGVyXSBDb21waWxlciByZWZlcmVuY2luZyBKYXZhIG1vZGVsIGNvZGUKKworPGEgbmFtZT0idl84MTciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0zIC0gT2N0b2JlciA4LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgxNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+U2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g8L2NvZGU+Ljxicj4KK1RoaXMgY29uc3RhbnQgdGVsbHMgU2VhcmNoIEVuZ2luZSB0byByZXBvcnQgbWF0Y2hlcyB3aGljaCBoYXZlIDxiPmV4YWN0bHk8L2I+Cit0aGUgc2FtZSBjb3VudCBvZiBwYXJ0cyAoaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycykgdGhhbiB0aGUgQ2FtZWwgQ2FzZSBwYXR0ZXJuIAorKHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE0MjYiPmJ1ZyAyMDE0MjY8L2E+KToKKzxwcmU+CisvKioKKyAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBjb250YWlucyBhIENhbWVsIENhc2UgZXhwcmVzc2lvbiB3aXRoCisgKiBhIHN0cmljdCBleHBlY3RlZCBudW1iZXIgb2YgcGFydHMuCisgKgorICogRXhhbXBsZXM6CisgKiAJLiAnSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJyB0eXBlcywKKyAqIAkgIGJ1dCBub3QgJ0hhc2hNYXBFbnRyeScKKyAqIAkuICdITWFwJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgc3RpbGwgbWF0Y2ggcHJldmlvdXMgJ0hhc2hNYXAnIGFuZAorICogCSAgJ0h0bWxNYXBwZXInIHR5cGVzLCBidXQgbm90ICdIaWdoTWFnbml0dWRlJworICoKKyAqIFRoaXMgcnVsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbWF0Y2ggcnVsZS4gSW4gY2FzZQorICogb2Ygb3RoZXIgbWF0Y2ggcnVsZSBmbGFncyBhcmUgY29tYmluZWQgd2l0aCB0aGlzIG9uZSwgdGhlbiBtYXRjaCBydWxlIHZhbGlkYXRpb24KKyAqIHdpbGwgcmV0dXJuIGEgbW9kaWZpZWQgcnVsZSBpbiBvcmRlciB0byBwZXJmb3JtIGEgYmV0dGVyIGFwcHJvcHJpYXRlIHNlYXJjaCByZXF1ZXN0CisgKiAoc2VlIHtAbGluayAjdmFsaWRhdGVNYXRjaFJ1bGUoU3RyaW5nLCBpbnQpfSBmb3IgbW9yZSBkZXRhaWxzKS4KKyAqCisgKiBAc2VlIENoYXJPcGVyYXRpb24jY2FtZWxDYXNlTWF0Y2goY2hhcltdLCBjaGFyW10sIGJvb2xlYW4pIGZvciBhIGRldGFpbGVkCisgKiBleHBsYW5hdGlvbiBvZiBDYW1lbCBDYXNlIG1hdGNoaW5nLgorICoKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIID0gMHgwMTAwOworPC9wcmU+CitOb3RlIHRoYXQgdGhpcyBjb25zdGFudCByZXBsYWNlIHByZXZpb3VzIG9uZSA8Y29kZT5SX0NBTUVMX0NBU0VfTUFUQ0g8L2NvZGU+CithZGRlZCB3aGlsZSBmaXhpbmcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NjI0Ij5idWcgMTI0NjI0PC9hPi48YnI+CitBbHNvIG5vdGUgdGhhdCA8Y29kZT5SX0NBTUVMQ0FTRV9NQVRDSDwvY29kZT4gaXMgbm8gbG9uZ2VyIGRlcHJlY2F0ZWQgYXMsIGZpbmFsbHksCitDYW1lbCBDYXNlIG1hdGNoIHJ1bGUgZmxhZ3MgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBjb21iaW5lZCB3aXRoIG90aGVyIG9uZXMgKGUuZy4KKzxjb2RlPlJfUFJFRklYX01BVENIPC9jb2RlPiBvciA8Y29kZT5SX1BBVFRFUk5fTUFUQ0g8L2NvZGU+KS4KKzwvbGk+Cis8bGk+RXhpc3RpbmcgQVBJIG1ldGhvZCA8Y29kZT5TZWFyY2hQYXR0ZXJuI3ZhbGlkYXRlTWF0Y2hSdWxlKFN0cmluZywgaW50KTwvY29kZT4KK2hhcyBiZWVuIG1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlIG5ldyA8Y29kZT4jUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIPC9jb2RlPiBjb25zdGFudDoKKzxwcmU+CisvKioKKyAqIFZhbGlkYXRlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBnaXZlbiBzdHJpbmcgcGF0dGVybiBhbmQgbWF0Y2ggcnVsZS4KKyAqCisgKiBJbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdywgdGhlIHJldHVybmVkIG1hdGNoIHJ1bGUgaXMKKyAqIG1vZGlmaWVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudCBzZWFyY2ggcGF0dGVybjoKKyAqIAkxLgl3aGVuIHRoZSB7QGxpbmsgI1JfUkVHRVhQX01BVENIfSBmbGFnIGlzIHNldCwgdGhlbiA8Yj50aGUgcGF0dGVybiBpcworICogCQlyZWplY3RlZDwvYj4gYXMgdGhpcyBraW5kIG9mIG1hdGNoIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCA8Y29kZT4tMTwvY29kZT4KKyAqIAkJcyByZXR1cm5lZCkuCisgKiAJMi4Jd2hlbiB0aGUgc3RyaW5nIHBhdHRlcm4gaGFzIDx1Pm5vPC91PiBwYXR0ZXJuIGNoYXJhY3RlcnMgKGUuZy4gJyonIG9yICc/JykKKyAqIAkJYW5kIHRoZSBwYXR0ZXJuIG1hdGNoIGZsYWcgaXMgc2V0IChpLmUuIHRoZSBtYXRjaCBydWxlIGhhcyB0aGUge0BsaW5rICNSX1BBVFRFUk5fTUFUQ0h9CisgKiAJCWZsYWcpLCB0aGVuIDxiPnRoZSBwYXR0ZXJuIG1hdGNoIGZsYWcgaXMgcmVzZXQ8L2I+LgorICogCQlSZXZlcnNlbHksIHdoZW4gdGhlIHN0cmluZyBwYXR0ZXJuIGhhcyBwYXR0ZXJuIGNoYXJhY3RlcnMgYW5kIHRoZSBwYXR0ZXJuCisgKiAJCW1hdGNoIGZsYWcgaXMgPHU+bm90PC91PiBzZXQsIHRoZW4gPGI+dGhlIHBhdHRlcm4gbWF0Y2ggZmxhZyBpcyBzZXQ8L2I+LgorICogCTMuCXdoZW4gdGhlIHtAbGluayAjUl9QQVRURVJOX01BVENIfSBmbGFnIGlzIHNldCB0aGVuLCA8Yj5vdGhlcgorICogCQl7QGxpbmsgI1JfUFJFRklYX01BVENIfSwge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0gb3IKKyAqIAkJe0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9IGZsYWdzIGFyZSByZXNldDwvYj4KKyAqIAkJaWYgdGhleSBhcmUgdGVudGF0aXZlbHkgY29tYmluZWQuCisgKiAJNC4Jd2hlbiB0aGUge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0gZmxhZyBpcyBzZXQsIHRoZW4gPGI+b3RoZXIgCisgKiAJCXtAbGluayAjUl9QUkVGSVhfTUFUQ0h9IG9yIHtAbGluayAjUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfQorICogCQlmbGFncyBhcmUgcmVzZXQ8L2I+IGlmIHRoZXkgYXJlIHRlbnRhdGl2ZWx5IGNvbWJpbmVkLgorICogCQlSZXZlcnNlbHksIGlmIHRoZSBzdHJpbmcgcGF0dGVybiBjYW5ub3QgYmUgYSBjYW1lbCBjYXNlIHBhdHRlcm4gKGkuZS4gY29udGFpbnMKKyAqIAkJaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgY2hhcmFjdGVycyBvciBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IHR3byB1cHBlcmNhc2UKKyAqIAkJY2hhcmFjdGVycyAtIG9uZSBmb3IgbWV0aG9kIGNhbWVsIGNhc2UgcGF0dGVybnMpLCB0aGVuIDxiPnRoZSBDYW1lbENhc2UKKyAqIAkJbWF0Y2ggZmxhZyBpcyByZXBsYWNlZCB3aXRoIGEgcHJlZml4IG1hdGNoIGZsYWc8L2I+LgorICogCTUuCXdoZW4gdGhlIHtAbGluayAjUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfSBmbGFnIGlzIHNldCwKKyAqIAkJdGhlbiA8Yj4oe0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gZmxhZyBpcyByZXNldDwvYj4gaWYgaXQncyB0ZW50YXRpdmVseQorICogCQljb21iaW5lZC4KKyAqIAkJUmV2ZXJzZWx5LCBpZiB0aGUgc3RyaW5nIHBhdHRlcm4gY2Fubm90IGJlIGEgY2FtZWwgY2FzZSBwYXR0ZXJuIChpLmUuIGNvbnRhaW5zCisgKiAJCWludmFsaWQgSmF2YSBpZGVudGlmaWVyIGNoYXJhY3RlcnMgb3IgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gdXBwZXJjYXNlCisgKiAJCWNoYXJhY3RlcnMgLSBvbmUgZm9yIG1ldGhvZCBjYW1lbCBjYXNlIHBhdHRlcm5zKSwgdGhlbiA8Yj50aGUgQ2FtZWxDYXNlCisgKiAJCXBhcnQgY291bnQgbWF0Y2ggZmxhZyBpcyByZXNldDwvYj4uCisgKiA8aT5Ob3RlOiB0aGUgcnVsZXMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgZG9jdW1lbnRlZCBvcmRlci4gRm9yIGV4YW1wbGUsIGl0IG1lYW5zCisgKiAJdGhhdCBhcyBzb29uIGFzIHRoZSBzdHJpbmcgcGF0dGVybiBjb250YWlucyBvbmUgcGF0dGVybiBjaGFyYWN0ZXIsIHRoZSBwYXR0ZXJuCisgKiAJbWF0Y2ggZmxhZyB3aWxsIGJlIHNldCBhbmQgYWxsIG90aGVyIG1hdGNoIGZsYWdzIHJlc2V0OiB2YWxpZGF0aW9uIG9mIHJ1bGUgMikKKyAqIAlmb2xsb3dlZCBieSBydWxlIDMpLi4uPC9pPgorICoKKyAqIEBwYXJhbSBzdHJpbmdQYXR0ZXJuIFRoZSBzdHJpbmcgcGF0dGVybgorICogQHBhcmFtIG1hdGNoUnVsZSBUaGUgbWF0Y2ggcnVsZQorICogQHJldHVybiBPcHRpbWl6ZWQgdmFsaWQgbWF0Y2ggcnVsZSBvciAtMSBpZiBhbiBpbmNvbXBhdGliaWxpdHkgd2FzIGRldGVjdGVkLgorICogQHNpbmNlIDMuMgorICovCitwdWJsaWMgc3RhdGljIGludCB2YWxpZGF0ZU1hdGNoUnVsZShTdHJpbmcgc3RyaW5nUGF0dGVybiwgaW50IG1hdGNoUnVsZSkgeworLi4uCit9Cis8L3ByZT4KKzwvbGk+Cis8bGk+PGNvZGU+Q2hhck9wZXJhdGlvbjwvY29kZT4gYW5kIDxjb2RlPlNlYXJjaFBhdHRlcm48L2NvZGU+IENhbWVsIENhc2UgQVBJIG1ldGhvZHMKK2FkZGVkIHdoaWxlIGZpeGluZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ2MjQiPmJ1ZyAxMjQ2MjQ8L2E+KQoraGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGNsYXJpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyLjxicj4KK1RoaXMgcGFyYW1ldGVyIG5vdyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcGF0dGVybiBhbmQgdGhlIG5hbWUgc2hvdWxkIGhhdmUgdGhlIHNhbWUKK2NvdW50IG9mIHBhcnRzIChpLmUuIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKSBvciBub3Q6Cis8cHJlPgorLyoqCisgKi4uLgorICogQ2FtZWxDYXNlIGNhbiBiZSByZXN0cmljdGVkIHRvIG1hdGNoIG9ubHkgdGhlIHNhbWUgY291bnQgb2YgcGFydHMuIFdoZW4gdGhpcworICogcmVzdHJpY3Rpb24gaXMgc3BlY2lmaWVkIHRoZSBnaXZlbiBwYXR0ZXJuIGFuZCB0aGUgZ2l2ZW4gbmFtZSBtdXN0IGhhdmUgPGI+ZXhhY3RseTwvYj4KKyAqIHRoZSBzYW1lIG51bWJlciBvZiBwYXJ0cyAoaS5lLiB0aGUgc2FtZSBudW1iZXIgb2YgdXBwZXJjYXNlIGNoYXJhY3RlcnMpLgorICogRm9yIGluc3RhbmNlLCAnSE0nICwgJ0hhTWEnIGFuZCAgJ0hNYXAnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGFuZAorICogJ0hhdE1hcHBlcicgPGI+YnV0IG5vdDwvYj4gJ0hhc2hNYXBFbnRyeScuCisgKi4uLgorICogLiBwYXR0ZXJuID0gIkhNIi50b0NoYXJBcnJheSgpCisgKiBuYW1lID0gIkhhc2hNYXBFbnRyeSIudG9DaGFyQXJyYXkoKQorICogcmVzdWx0ID0mZ3Q7IChzYW1lUGFydENvdW50ID09IGZhbHNlKQorICouLi4KKyAqIEBwYXJhbSBzYW1lUGFydENvdW50IGZsYWcgdGVsbGluZyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGFuZCB0aGUgbmFtZSBzaG91bGQKKyAqIAloYXZlIHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzIG9yIG5vdC4KKyAqIAkmbmJzcDsmbmJzcDtGb3IgZXhhbXBsZToKKyAqIAkJLiAnSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJyB0eXBlcywKKyAqIAkJCQlidXQgbm90ICdIYXNoTWFwRW50cnknCisgKiAJCS4gJ0hNYXAnIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBzdGlsbCBtYXRjaCBwcmV2aW91cyAnSGFzaE1hcCcgYW5kCisgKiAJCQkJJ0h0bWxNYXBwZXInIHR5cGVzLCBidXQgbm90ICdIaWdoTWFnbml0dWRlJworICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goY2hhcltdIHBhdHRlcm4sIGNoYXJbXSBuYW1lLCBib29sZWFuIHNhbWVQYXJ0Q291bnQpIHsKKy4uLgorfQorCisvKioKKyAqLi4uCisgKiBDYW1lbENhc2UgY2FuIGJlIHJlc3RyaWN0ZWQgdG8gbWF0Y2ggb25seSB0aGUgc2FtZSBjb3VudCBvZiBwYXJ0cy4gV2hlbiB0aGlzCisgKiByZXN0cmljdGlvbiBpcyBzcGVjaWZpZWQgdGhlIGdpdmVuIHBhdHRlcm4gYW5kIHRoZSBnaXZlbiBuYW1lIG11c3QgaGF2ZSA8Yj5leGFjdGx5PC9iPgorICogdGhlIHNhbWUgbnVtYmVyIG9mIHBhcnRzIChpLmUuIHRoZSBzYW1lIG51bWJlciBvZiB1cHBlcmNhc2UgY2hhcmFjdGVycykuCisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kCisgKiAnSGF0TWFwcGVyJyA8Yj5idXQgbm90PC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqLi4uCisgKiAuIHBhdHRlcm4gPSAiSE0iLnRvQ2hhckFycmF5KCkKKyAqIHBhdHRlcm5TdGFydCA9IDAKKyAqIHBhdHRlcm5FbmQgPSAyCisgKiBuYW1lID0gIkhhc2hNYXBFbnRyeSIudG9DaGFyQXJyYXkoKQorICogbmFtZVN0YXJ0ID0gMAorICogbmFtZUVuZCA9IDEyCisgKiByZXN1bHQgPSZndDsgKHNhbWVQYXJ0Q291bnQgPT0gZmFsc2UpCisgKi4uLgorICogQHBhcmFtIHNhbWVQYXJ0Q291bnQgZmxhZyB0ZWxsaW5nIHdoZXRoZXIgdGhlIHBhdHRlcm4gYW5kIHRoZSBuYW1lIHNob3VsZAorICogCWhhdmUgdGhlIHNhbWUgY291bnQgb2YgcGFydHMgb3Igbm90LgorICogCSZuYnNwOyZuYnNwO0ZvciBleGFtcGxlOgorICogCQkuICdITScgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoICdIYXNoTWFwJyBhbmQgJ0h0bWxNYXBwZXInIHR5cGVzLAorICogCQkJCWJ1dCBub3QgJ0hhc2hNYXBFbnRyeScKKyAqIAkJLiAnSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIHN0aWxsIG1hdGNoIHByZXZpb3VzICdIYXNoTWFwJyBhbmQKKyAqIAkJCQknSHRtbE1hcHBlcicgdHlwZXMsIGJ1dCBub3QgJ0hpZ2hNYWduaXR1ZGUnCisgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW1lbENhc2VNYXRjaChjaGFyW10gcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgYm9vbGVhbiBwcmVmaXhNYXRjaCkgeworLi4uCit9Cis8L3ByZT4KK05vdGUgdGhhdCBzaW1pbGFyIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIGRvbmUgb24gPGNvZGU+U2VhcmNoUGF0dGVybjwvY29kZT4KK2NvcnJlc3BvbmRpbmcgbWV0aG9kczoKKzxwcmU+CitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBuYW1lLCBib29sZWFuIHNhbWVQYXJ0Q291bnQpIHsKKy4uLgorfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbWVsQ2FzZU1hdGNoKFN0cmluZyBwYXR0ZXJuLCBpbnQgcGF0dGVyblN0YXJ0LCBpbnQgcGF0dGVybkVuZCwgU3RyaW5nIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBib29sZWFuIHNhbWVQYXJ0Q291bnQpIHsKKy4uLgorfQorPC9wcmU+Cis8L2xpPgorPGxpPk1vZGlmaWVkIEFQSSA8Y29kZT5Db21wbGV0aW9uUHJvcG9zYWwjZ2V0UmVxdWlyZWRQcm9wb3NhbHMoKTwvY29kZT4uPGJyPgorPGNvZGU+VFlQRV9SRUY8L2NvZGU+IHByb3Bvc2FscyBjYW4gbm93IGhhdmUgYSBUWVBFX1JFRiBwcm9wb3NhbCBhcyByZXF1aXJlZCBwcm9wb3NhbCAKKzwvbGk+Cis8bGk+Q29kZUFzc2lzdDogTWVtYmVyIHR5cGVzIGFuZCBzdGF0aWMgbWVtYmVycyBhcmUgcHJvcG9zZWQgd2hlbiB0aGUgcmVjZWl2ZXIgaXMgYSBub3QgeWV0IGltcG9ydGVkIHR5cGUuCis8cHJlPgorcGFja2FnZSBwOworcHVibGljIGNsYXNzIFggeworICAgcHVibGljIHN0YXRpYyB2b2lkIGJhcigpIHt9Cit9CisKK3BhY2thZ2UgcTsKK3B1YmxpYyBjbGFzcyBZIHsKKyAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICAgIFguYmFyCisgICB9Cit9Cis8L3ByZT4KK1doZW4gdGhlIGNvbXBsZXRpb24gb2NjdXJzIGFmdGVyIDxpPlguYmFyPC9pPiB0aGUgbWV0aG9kIDxjb2RlPlgjYmFyKCk8L2NvZGU+IGlzIHByb3Bvc2VkIHdpdGggYSByZXF1aXJlZCBwcm9wb3NhbCB0byBjb21wbGV0ZSB0aGUgbm90IHlldCBpbXBvcnRlZCB0eXBlLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDQ2MjciPjQ0NjI3PC9hPgorW2Fzc2lzdF0gaW1wcm92ZSBjb250ZW50IGFzc2lzdCBmb3Igc3RhdGljIG1lbWJlcnMgd2hlbiBpbXBvcnQgbWlzc2luZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUxOCI+MTI1NTE4PC9hPgorW2phdmFkb2NdIEVtYmVkZGluZyBodG1sIGluIGEgbGluayBwbGFjZWQgaW4gYSBAc2VlIEphdmFEb2MgdGFnIGNhdXNlcyBhIHdhcm5pbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njc2OSI+ODY3Njk8L2E+CitbamF2YWRvY10gV2Fybi9FcnJvciBmb3IgJ01pc3NpbmcgamF2YWRvYyBjb21tZW50cycgZG9lc24ndCByZWNvZ25pemUgcHJpdmF0ZSBpbm5lciBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4ODQ5Ij4xNjg4NDk8L2E+CitbamF2YWRvY10gSmF2YWRvYyB3YXJuaW5nIG9uIEBzZWUgcmVmZXJlbmNlIGluIGNsYXNzIGxldmVsIGRvY3MuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwOTcwIj4xOTA5NzA8L2E+CitbamF2YWRvY10gJnF1b3Q7ZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5JnF1b3Q7IGFuYWx5c2lzIHNob3VsZCBub3QgY29uc2lkZXIgamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTM3NCI+MTk1Mzc0PC9hPgorW2phdmFkb2NdIE1pc3NpbmcgSmF2YWRvYyB3YXJuaW5nIGZvciByZXF1aXJlZCBxdWFsaWZpY2F0aW9uIGZvciBpbm5lciB0eXBlcyBhdCAxLjQgbGV2ZWwKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI0NDkiPjE5MjQ0OTwvYT4KK1tqYXZhZG9jXVthc3Npc3RdIFNlbGVjdGlvbkphdmFkb2NQYXJzZXIgc2hvdWxkIG5vdCByZXBvcnQgcHJvYmxlbXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzM1MiI+NzMzNTI8L2E+CitbSmF2YWRvY10gTWlzc2luZyBkZXNjcmlwdGlvbiBzaG91bGQgYmUgd2FybmVkIGZvciBhbGwgdGFncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTkzMSI+MTkxOTMxPC9hPgorQmF0Y2hJbWFnZUJ1aWxkZXIgc29tZXRpbWVzIG1hcmtzIHJlc291cmNlcyBhcyBkZXJpdmVkIGJlZm9yZSBkZWxldGluZyB0aGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxNDI2Ij4yMDE0MjY8L2E+Citbc2VhcmNoXSBOZXcgU2VhcmNoUGF0dGVybiBjb25zdGFudCBSX0NBTUVMX0NBU0VfTUFUQ0ggbmFtZSBtYXkgYmUgbWlzbGVhZGluZyBmb3IgdXNlcnMKKworPGEgbmFtZT0idl84MTYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0zIC0gT2N0b2JlciAyLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgxNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MTYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SUphdmFFbGVtZW50RGVsdGEjRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRDwvY29kZT4uIFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIG9mIGEgSmF2YSBwcm9qZWN0IGNoYW5nZXMuCisgICAgIFRoaXMgaXMgaW5kZXBlbmRlbnQgZnJvbSA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YSNGX0NMQVNTUEFUSF9DSEFOR0VEPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmF3IGNsYXNzcGF0aCBoYXMgY2hhbmdlZC48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQ2MjQiPjIwNDYyNDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBObyBlcnJvciBvbiBhYnN0cmFjdCBtZXRob2QgaW1wbGVtZW50YXRpb24gd2l0aCBtaXNzaW5nIHBhcmFtZXRlciBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDMzOSI+MjA0MzM5PC9hPgorW2NvbXBpbGVyXSBJbnZhbGlkIGxlbmd0aCBmb3IgbWlzc2luZyBwYWNrYWdlIGRlY2xhcmF0aW9uIGluIGVtcHR5IHBhY2thZ2UtaW5mby5qYXZhIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM1ODciPjIwMzU4NzwvYT4KK0ltcHJvdmUgbWVzc2FnZXMgY29uc2lzdGVuY3kgaW4gY2FzZSBvZiBnZW5lcmljIG1ldGhvZHMgaGF2aW5nIHNhbWUgZXJhc3VyZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDY2MiI+MjA0NjYyPC9hPgorb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXIuZW5kUGFyc2UgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNjYyIj4yMDM2NjI8L2E+CitQZXJmOiBVbm5lY2Vzc2FyeSBjb21waWxhdGlvbiB3aGVuIHBhY2thZ2UgYWRkZWQgdG8gc2Vjb25kIHNvdXJjZSByb290Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0ODA1Ij4yMDQ4MDU8L2E+CitJQ29tcGlsYXRpb25Vbml0LmNvbW1pdFdvcmtpbmdDb3B5IGRvZXNuJ3Qgc2VuZCB0eXBlSGllcmFyY2h5Q2hhbmdlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDY1MiI+MjA0NjUyPC9hPgorJnF1b3Q7T3BlbiBUeXBlJnF1b3Q7OiBDbGFzc0Nhc3RFeGNlcHRpb24gaW4gY29uanVuY3Rpb24gd2l0aCBhIGNsYXNzIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDUzNCI+MjA0NTM0PC9hPgorWzEuNV1bY29tcGlsZXJdIEFubm95aW5nIGNvbnNlcXVlbmNlIG9mIG1ldGhvZCB2ZXJpZmljYXRpb24gcHJvYmxlbQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDQxNyI+MjA0NDE3PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5yZXNvbHZlVHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDUzNiI+MjA0NTM2PC9hPgorWzEuNV1bY29tcGlsZXJdIFR5cGUgdmFyaWFibGVzIGluc3VmZmljaWVudGx5IGNvbm5lY3RlZCBpbiBwcmVzZW5jZSBvZiBlcnJvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQwNzEiPjE1NDA3MTwvYT4KK05vIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2UgaWYgYSBwcm9qZWN0IGlzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lcgorCis8YSBuYW1lPSJ2XzgxNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTMgLSBTZXB0ZW1iZXIgMjUsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODE1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgxNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTY2OCI+MTk5NjY4PC9hPgorSUFFIGluIEFTVE5vZGUuc2V0U291cmNlUmFuZ2Ugd2hpbGUgZWRpdGluZyBhIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0MjgzIj4yMDQyODM8L2E+CitbY29tcGlsZXJdIHN5bnRoZXRpYyBmaWVsZCBmb3IgY2xhc3MgbGl0ZXJhbCBhY2Nlc3Mgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIGZvciBpbnQuY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTAwOTQiPjE5MDA5NDwvYT4KK0phdmEgT3V0bGluZSBDYXVzZXMgRWNsaXBzZSBMb2NrLXVwLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzYwOSI+MjAzNjA5PC9hPgorWzEuNl1bY29tcGlsZXJdIEFjY1N5bnRoZXRpYyBzaG91bGQgYmUgc2V0IGZvciBwYWNrYWdlLWluZm8gdHlwZSBpZiB0YXJnZXQgJmd0Oz0gMS42Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNTc5Ij4yMDM1Nzk8L2E+CitbZG9tXSBMZW5ndGggb2YgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBpbnNpZGUgYSAnZm9yJyBpbml0aWFsaXNhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDA0MCI+MjA0MDQwPC9hPgorQ2xhc3MgbGl0ZXJhbCBjb2RlIGdlbmVyYXRpb24gbXVzdCBiZSBpbXByb3ZlZCBmb3IgY2xkYyB0YXJnZXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQxMDgiPjIwNDEwODwvYT4KK3VudXNlZCBpbXBvcnQgaW4gamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTA0OSI+MTY5MDQ5PC9hPgorWzEuNV1bY29tcGlsZXJdIEJvZ3VzIGJvdW5kIG1pc21hdGNoIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzkwNSI+MjAzOTA1PC9hPgorWzEuNV1bY29tcGlsZXJdIHNob3dzIHdyb25nIGVycm9yIHdpdGggZ2VuZXJpY3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM3MjEiPjIwMzcyMTwvYT4KK1tjb21waWxlcl0gJnF1b3Q7UGFyYW1ldGVyIGlzIG5ldmVyIHJlYWQmcXVvdDsgbm90IHJlcG9ydGVkIGlmIHVubmVjZXNzYXJ5IGRlY2xhcmVkIGNoZWNrZWQgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwMTU4Ij4yMDAxNTg8L2E+CitbY29tcGlsZXJdIGluY29uc2lzdGVudCBoYW5kbGluZyBvZiB1bnJlYWNoYWJsZSBjb2RlCisKKzxhIG5hbWU9InZfODE0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMiAtIFNlcHRlbWJlciAxOSwgMjAwNyAtIDMuNCBNSUxFU1RPTkUgMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MTQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODE0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0MDAyIj4yMDQwMDI8L2E+CitBSU9CIHdoZW4gZW5hYmxpbmcgQ0xEQyAxLjEKKworPGEgbmFtZT0idl84MTMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0yIC0gU2VwdGVtYmVyIDE3LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgxMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MTMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5UaGUgPGNvZGU+U2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9NQVRDSDwvY29kZT4gY29uc3RhbnQgaXMgbm8gbG9uZ2VyIGRlcHJlY2F0ZWQgYW5kPGJyPgordGhlIG5ldyBjb25zdGFudCA8Y29kZT5TZWFyY2hQYXR0ZXJuI1JfQ0FNRUxfQ0FTRV9NQVRDSDwvY29kZT4gPGI+d2lsbCBzdXJlbHkgYmUgcmVuYW1lZCBpbiBuZXh0IG1pbGVzdG9uZTwvYj4uPGJyPgorKHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE0MjYiPmJ1ZyAyMDE0MjY8L2E+IHRvIGZvbGxvdy11cAord29yayBpbiBwcm9ncmVzcyBpbiB0aGlzIGFyZWEuLi4pCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM1NzciPjIwMzU3NzwvYT4KK0NsYXNzRm9ybWF0RXhjZXB0aW9uIHZpZXdpbmcgYW5ub3RhdGlvbiB3aXRoIGVtcHR5IHRhcmdldCBhbm5vdGF0aW9uCisKKzxhIG5hbWU9InZfODEyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMiAtIFNlcHRlbWJlciAxNSwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MTIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODEyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgbmV3IEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSNWRVJTSU9OX0NMRENfMV8xPC9jb2RlPiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSBjbGRjMS4xIHRhcmdldCBpbnNpZGUgdGhlIElERS4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDIyMyI+MTIwMjIzPC9hPgorW2NvbXBpbGVyXSBTdXBwb3J0IGZvciAiLXRhcmdldCBjbGRjMS4xIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzI0MSI+MjAzMjQxPC9hPgorW2NvbXBpbGVyXSBNaXNzaW5nIHdhcm5pbmcgd2hlbiBhIHNlcmlhbGl6YWJsZSBjbGFzcyB3aXRob3V0IHNlcmlhbFZlcnNpb25VSUQgaXMgYWxzbyBhYnN0cmFjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzQ1NCI+MjAzNDU0PC9hPgorTlBFIGluIGNvbXBpbGVyIHdoZW4gcHJvY2Vzc2luZyBhbm5vdGF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzM0MiI+MjAzMzQyPC9hPgorQVNUIG9mIGEgTnVtYmVyTGl0ZXJhbCBoYXMgd3Jvbmcgc291cmNlIGNvZGUgcmFuZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMwODkiPjIwMzA4OTwvYT4KK2dldERlZmF1bHRPcHRpb25zIG1pc3NlcyBvcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkyMTQiPjE1OTIxNDwvYT4KK1sxLjVdIFtjb21waWxlcl0gRWNsaXBzZSBjb21waWxlciB3aWxkY2FyZCBidWcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDI0MDQiPjIwMjQwNDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbmNvcnJlY3QgaGFuZGxpbmcgb2YgdHlwZSB2YXJpYWJsZSBib3VuZHMgaXNzdWVkIGJ5IGNhcHR1cmUgY29udmVyc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzMxOCI+MjAzMzE4PC9hPgorWzEuNV1bY29tcGlsZXJdIEltcHJvcGVyIGNhcHR1cmUgb2Ygd2lsZGNhcmQgd2l0aCBsZXNzZXIgYm91bmQgdGhhbiBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDI5MzYiPjIwMjkzNjwvYT4KK1tjb21waWxlcl0gQ29tcGlsZXIgZXJyb3IgZm9yIEphdmEgc3dpdGNoIGV4cHJlc3Npb24gcHJvdmlkZXMgaW5hY2N1cmF0ZSBsaXN0IG9mIGFsbG93ZWQgZGF0YSB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzA2MSI+MjAzMDYxPC9hPgorW2NvbXBpbGVyXSBVbmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMgdXNlZCBpbiBub25zdGF0aWMgaW5pdGlhbGl6ZXJzIG9mIHBlZXIgbWVtYmVycyBkb24ndCB0cmlnZ2VyIGNvbXBpbGF0aW9uIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMDU4Ij4yMDMwNTg8L2E+CitCdWlsZGluZyB3b3Jrc3BhY2UgaGFuZ3MgaW4gZW5kbGVzcyBsb29wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyODMwIj4yMDI4MzA8L2E+CitbY29tcGlsZXJdWzEuNV0gZWNsaXBzZSBmYWlscyB0byBjb21waWxlIHN1YmNsYXNzIHdoZW4gc3VwZXJjbGFzcyBoYXMgdHdvIGdlbmVyaWMgbWV0aG9kcyBvZiB0aGUgc2FtZSBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMDIwIj4yMDMwMjA8L2E+Citmb3JtYXR0ZXIgbWF5IGNoYW5nZSBjb2RlIHNlbWFudGljcyBvbiB1bmFyeSBvcGVyYXRvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDExODIiPjIwMTE4MjwvYT4KK1tjb21waWxlcl1bbnVsbF0gTnVsbCBwb2ludGVyIGFjY2VzcyBjb21waWxlciB3YXJuaW5nIGZhaWxzIHdoZW4gJnF1b3Q7dGhyb3cgbnVsbCZxdW90OworCisKKzxhIG5hbWU9InZfODExIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMiAtIFNlcHRlbWJlciAxMSwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MTEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODExIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgYW4gb3B0aW9uIHRoYXQgYWxsb3dzIEB0aHJvd3MgamF2YWRvYyBlbnRyaWVzIHRvIGRlZnVzZSB0aGUgdW51c2VkCisgICAgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBjaGVjay4gCis8cHJlPgorQ09NUElMRVIgLyBDb25zaWRlciBSZWZlcmVuY2UgaW4gRG9jIENvbW1lbnQgZm9yIFVudXNlZCBEZWNsYXJlZCBUaHJvd24gRXhjZXB0aW9uIENoZWNrCisgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIGRvYyBjb21tZW50IHJlZmVyZW5jZXMgdG8gZXhjZXB0aW9ucyAKKyAgIChpLmUuIEB0aHJvd3MgY2xhdXNlcykgZm9yIHRoZSB1bnVzZWQgZGVjbGFyZWQgdGhyb3duIGV4Y2VwdGlvbiBjaGVjay4gVGh1cywgCisgICBkb2N1bWVudGVkIGV4Y2VwdGlvbnMgd2lsbCBiZSBjb25zaWRlcmVkIGFzIG1hbmRhdGVkIGFzIHBlciBkb2MgY29udHJhY3QuCisgICBUaGUgc2V2ZXJpdHkgb2YgdGhlIHVudXNlZCBkZWNsYXJlZCB0aHJvd24gZXhjZXB0aW9uIHByb2JsZW0gaXMgY29udHJvbGxlZCAKKyAgIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uIi4KKyAgIE5vdGU6IHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgdW50aWwgdGhlIGRvYyBjb21tZW50IHN1cHBvcnQgaXMgZW5hYmxlZCAKKyAgIGFjY29yZGluZyB0byB0aGUgb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0Ii4KKyAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NSZWZlcmVuY2UiCisgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQorICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczMjQ0Ij43MzI0NDwvYT4KK2ZvciBkZXRhaWxzLgorPC9saT4KKzwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczMjQ0Ij43MzI0NDwvYT4KK1tvcHRpb25zXSBJbXByb3ZlICZxdW90O1VubmVjZXNzYXJ5IGRlY2xhcmF0aW9uIG9mIHRocm93biBjaGVja2VkIGV4Y2VwdGlvbnMmcXVvdDsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTMwMSI+ODkzMDE8L2E+CitBbnkgdXNlciBvcGVyYXRpb24gdGhhdCB3b3VsZCB0cmlnZ2VyIGFuIGF1dG9idWlsZCBzaG91bGQgY2FuY2VsIGEgcnVubmluZyBhdXRvYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQyOTgiPjE4NDI5ODwvYT4KK1tjb21waWxlcl1bbnVsbF0gU3B1cmlvdXMgJnF1b3Q7VmFyaWFibGUgY2FuIG9ubHkgYmUgbnVsbCZxdW90OyB3YXJuaW5nIGluIGNhc2Ugb2YgYW4gaW5maW5pdGUgbG9vcAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTkyOSI+MjAxOTI5PC9hPgorTWVtYmVyIG9mIGxvY2FsIHR5cGUgc2hvdWxkIG5vdCBoYXZlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDIxMzQiPjIwMjEzNDwvYT4KK1sxLjZdW2NvbXBpbGVyXSBvcmcuZWNsaXBzZS5qZHQudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbi5Db25mb3JtVGVzdCN0ZXN0MDAzIG5ldmVyIGVuZHMgaW4gLjE2IG1vZGUKKworCis8YSBuYW1lPSJ2XzgxMCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTIgLSBTZXB0ZW1iZXIgNCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MTAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODEwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyMDc2Ij4yMDIwNzY8L2E+CitOUEUgaW4gRGVsdGFQcm9jZXNzb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIzNTkiPjE4MjM1OTwvYT4KK1tjb21waWxlcl0gb3B0aW1pemUgbGluZSBudW1iZXIgZ2VuZXJhdGlvbiB1c2luZyB0aGUgbmV3IGdldExpbmVOdW1iZXIgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MzUwIj4xODUzNTA8L2E+CitbMS42XVtjb21waWxlcl0gQ29kZSBnZW5lcmF0aW9uIHNlZW1zIHRvIGJlIG11Y2ggc2xvd2VyIHRoYW4gaW4gMS41IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTYyNTMiPjE5NjI1MzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBGYWlsdXJlIHRvIGNvbXBpbGUgZ2VuZXJpY3Mgd2l0aCB3aWxkY2FyZCBhbmQgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTE1OCI+MTg5MTU4PC9hPgorWzEuNV1bY29tcGlsZXJdIE1hbGZvcm1lZCBnZW5lcmljIHNpZ25hdHVyZSBmb3IgbmVzdGVkIGNsYXNzZXMgKC4gdnMgJCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNjIiPjIwMTA2MjwvYT4KK01pc3NpbmcgbGlicmFyeSBpbiBwcm9qZWN0IGNsYXNzcGF0aCBldmVuIGxpYnJhcnkgZXhpc3RzCisKKzxhIG5hbWU9InZfODA5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMiAtIEF1Z3VzdCAyOCwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MDkKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODA5Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UHJlZml4IG1hdGNoaW5nIGNhbiBiZSBkaXNhYmxlZCB3aGlsZSB1c2luZyBDYW1lbCBDYXNlIEFQSSBtZXRob2RzLiAoc2VlIAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NjI0Ij5idWcgMTI0NjI0PC9hPikuPGJyPgorRm9sbG93aW5nIEFQSSBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCBvbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uPC9jb2RlPjoKKzxwcmU+CisvKioKKyAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lIHVzaW5nIENhbWVsQ2FzZSBydWxlcywgb3IKKyAqIGZhbHNlIG90aGVyd2lzZS4gY2hhcltdIENhbWVsQ2FzZSBtYXRjaGluZyBkb2VzIE5PVCBhY2NlcHQgZXhwbGljaXQgd2lsZC1jYXJkcworICogJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuCisgKgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhCisgKiBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICoKKyAqIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLCB3aGljaCB3aWxsIGJlIG1hdGNoIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICoKKyAqIERpZ2l0IGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheS4gVGhleSBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0dGVybgorICogYnV0IGFyZSBub3QgYWx3YXlzIGNvbnNpZGVyZWQgYXMgbGVhZGluZyBjaGFyYWN0ZXIuIEZvciBpbnN0YW5jZSwgYm90aAorICogJ1VURjE2RFNTJyBhbmQgJ1VURkRTUycgcGF0dGVybnMgd2lsbCBtYXRjaCAnVVRGMTZEb2N1bWVudFNjYW5uZXJTdXBwb3J0Jy4KKyAqCisgKiBDYW1lbENhc2UgbWF5IG9yIG1heSBub3QgbWF0Y2ggcHJlZml4ZXMgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBwYXJhbWV0ZXIuCisgKiBXaGVuIHRoZSBwcmVmaXggbWF0Y2ggcGFyYW1ldGVyIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZ2l2ZW4gcGF0dGVybiBjYW4KKyAqIG1hdGNoIG9ubHkgYSBwcmVmaXggb2YgdGhlIGdpdmVuIG5hbWUuIEZvciBpbnN0YW5jZSwgJ0hNJyAsICdIYU1hJyBhbmQgICdITWFwJworICogcGF0dGVybnMgd2lsbCBhbGwgbWF0Y2ggJ0hhc2hNYXAnLCAnSGF0TWFwcGVyJyA8Yj5hbmQ8L2I+ICdIYXNoTWFwRW50cnknLgorICogUmV2ZXJzZWx5LCBpZiB0aGUgcHJlZml4IG1hdGNoIHBhcmFtZXRlciBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZW4gcGF0dGVybgorICogYW5kIG5hbWUgbXVzdCBoYXZlIDxiPmV4YWN0bHk8L2I+IHRoZSBzYW1lIG51bWJlciBvZiBwYXJ0cywgYW5kIHRoZWlyIGxhc3QKKyAqIHBhcnRzIG11c3QgYmUgaWRlbnRpY2FsIGlmIHRoZXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycy4KKyAqIEZvciBpbnN0YW5jZSwgJ0hNYXAnIGFuZCAnSGFNYXAnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGJ1dCBuZWl0aGVyCisgKiAnSGFzaE1hcEVudHJ5JyBub3IgJ0hhdE1hcHBlcicuIE5vdGUgdGhhdCB3aGVuIHRoZSBsYXN0IHBhcnQgZG9lcyBub3QgY29udGFpbgorICogbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHRoZW4gdGhlIG5hbWUgbWF5IGVuZCB3aXRoIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLgorICogU28sICdITScgcGF0dGVybiB3aWxsIG1hdGNoIGJvdGggJ0hhc2hNYXAnIDxiPmFuZDwvYj4gJ0hhdE1hcHBlcicgYnV0IHdpbGwgbm90CisgKiBtYXRjaCAnSGFzaE1hcEVudHJ5Jy4KKyAqCisgKiBFeGFtcGxlczoKKyAqICAxLglwYXR0ZXJuID0geyAnTicsICdQJywgJ0UnIH0KKyAqICAJbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCXJlc3VsdCA9Jmd0OyB0cnVlCisgKiAgMi4JcGF0dGVybiA9IHsgJ04nLCAnUCcsICdFJyB9CisgKiAgCW5hbWUgPSB7ICdOJywgJ28nLCAnUCcsICdlJywgJ3InLCAnbScsICdpJywgJ3MnLCAncycsICdpJywgJ28nLCAnbicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQorICogIAlyZXN1bHQgPSZndDsgdHJ1ZQorICogIDMuCXBhdHRlcm4gPSB7ICdOJywgJ3UnLCAnUCcsICdvJywgJ0UnLCAneCcgfQorICogIAluYW1lID0geyAnTicsICd1JywnbCcsICdsJywgJ1AnLCAnbycsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nIH0KKyAqICAJcmVzdWx0ID0mZ3Q7IHRydWUKKyAqICA0LglwYXR0ZXJuID0geyAnTicsICd1JywgJ1AnLCAnbycsICdFJywgJ3gnIH0KKyAqICAJbmFtZSA9IHsgJ04nLCAnbycsICdQJywgJ2UnLCAncicsICdtJywgJ2knLCAncycsICdzJywgJ2knLCAnbycsICduJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCXJlc3VsdCA9Jmd0OyBmYWxzZQorICogIDUuCXBhdHRlcm4gPSB7ICduJywgcCcsICdlJyB9CisgKiAgCW5hbWUgPSB7ICdOJywgJ3UnLCdsJywgJ2wnLCAnUCcsICdvJywgJ2knLCAnbicsICd0JywgJ2UnLCAncicsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicgfQorICogIAlyZXN1bHQgPSZndDsgZmFsc2UKKyAqICA2LglwYXR0ZXJuID0geyAnSScsICdQJywgJ0wnLCAnMycgfQorICogIAluYW1lID0geyAnSScsICdQJywgJ2UnLCAncicsICdzJywgJ3AnLCAnZScsICdjJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnTCcsICdpJywgJ3MnLCAndCcsICdlJywgJ24nLCAnZScsICdyJywgJzMnIH0KKyAqICAJcmVzdWx0ID0mZ3Q7IHRydWUKKyAqICA3LglwYXR0ZXJuID0geyAnSCcsIE0nIH0KKyAqICAJbmFtZSA9IHsgJ0gnLCAnYScsICdzJywgJ2gnLCAnTScsICdhJywgJ3AnLCAnRScsICduJywgJ3QnLCAncicsICd5JyB9CisgKiAgCXJlc3VsdCA9Jmd0OyAocHJlZml4TWF0Y2ggPT0gdHJ1ZSkKKyAqICA4LglwYXR0ZXJuID0geyAnSCcsIE0nLCAnYScsICdwJyB9CisgKiAgCW5hbWUgPSB7ICdIJywgJ2EnLCAndCcsICdNJywgJ2EnLCAncCcsICdwJywgJ2UnLCAncicgfQorICogIAlyZXN1bHQgPSZndDsgKHByZWZpeE1hdGNoID09IHRydWUpCisgKiAKKyAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCisgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorICogQHBhcmFtIHByZWZpeE1hdGNoIGZsYWcgdGVsbGluZyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBuYW1lIHByZWZpeCBvciBub3QuCisgKiAJCS4gRm9yIGV4YW1wbGUsIHdoZW4gaXQncyA8Y29kZT50cnVlPC9jb2RlPjoKKyAqIAkJCS0gJ0hNJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggICdIYXNoTWFwJyBhbmQgJ0h0bWxNYXBwZXInIHR5cGVzLAorICogCQkJICBidXQgbm90ICdIYXNoTWFwRW50cnknCisgKiAJCQktICdITWFwJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggICdIYXNoTWFwJyB0eXBlIGJ1dCBub3QgJ0h0bWxNYXBwZXInLgorICogCQkuIGFuZCwgd2hlbiBpdCdzIDxjb2RlPmZhbHNlPC9jb2RlPjoKKyAqIAkJCS0gJ0hNJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggYm90aCAgICdIYXNoTWFwJyBhbmQgJ0h0bWxNYXBwZXInCisgKiAJCQkgIGFuZCAnSGFzaE1hcEVudHJ5JworICogCQkJLSAnSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoIGJvdGggJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicKKyAqIAkJCSAgdHlwZXMuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goY2hhcltdIHBhdHRlcm4sIGNoYXJbXSBuYW1lLCBib29sZWFuIHByZWZpeE1hdGNoKSB7CisuLi4KK30KKworLyoqCisgKiBBbnN3ZXJzIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSB1c2luZyAKKyAqIENhbWVsQ2FzZSBydWxlcywgb3IgZmFsc2Ugb3RoZXJ3aXNlLiAgY2hhcltdIENhbWVsQ2FzZSBtYXRjaGluZyBkb2VzIE5PVAorICogYWNjZXB0IGV4cGxpY2l0IHdpbGQtY2FyZHMgJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuIAorICogQ2FuIG1hdGNoIG9ubHkgc3Vic2V0IG9mIG5hbWUvcGF0dGVybiwgY29uc2lkZXJpbmcgZW5kIHBvc2l0aW9ucyBhcworICogbm9uLWluY2x1c2l2ZS4gVGhlIHN1Yi1wYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQgcGF0dGVybkVuZAorICogcG9zaXRpb25zLgorICoKKyAqIENhbWVsQ2FzZSBkZW5vdGVzIHRoZSBjb252ZW50aW9uIG9mIHdyaXRpbmcgY29tcG91bmQgbmFtZXMgd2l0aG91dCBzcGFjZXMsCisgKiBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBib3RoIHVwcGVyIGFuZCBsb3dlcgorICogQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQgb3Igbm90LgorICogVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4KKyAqIGEgc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZyBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsCisgKiBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4KKyAqIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QgY2hhcmFjdGVyLiBJbiBKYXZhLCB0eXBlIG5hbWVzIGZvbGxvdyB0aGUgdXBwZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLCB3aGVyZWFzIG1ldGhvZCBvciBmaWVsZCBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyCisgKiBDYW1lbENhc2UgY29udmVudGlvbi4KKyAqCisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaCBpbiBhIGNhc2UKKyAqIHNlbnNpdGl2ZSB3YXkuIFRoZXNlIGNoYXJhY3RlcnMgbXVzdCBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuCisgKiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOdWxsUG9pbnRlckV4Q0VQVElPTicgb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90CisgKiAnTm9Qb2ludGVyRXhjZXB0aW9uJy4KKyAqCisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKgorICogQ2FtZWxDYXNlIG1heSBvciBtYXkgbm90IG1hdGNoIHByZWZpeGVzIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyLgorICogV2hlbiB0aGUgcHJlZml4IG1hdGNoIHBhcmFtZXRlciBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGdpdmVuIHBhdHRlcm4gY2FuCisgKiBtYXRjaCBvbmx5IGEgcHJlZml4IG9mIHRoZSBnaXZlbiBuYW1lLiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcKKyAqIHBhdHRlcm5zIHdpbGwgYWxsIG1hdGNoICdIYXNoTWFwJywgJ0hhdE1hcHBlcicgPGI+YW5kPC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIFJldmVyc2VseSwgaWYgdGhlIHByZWZpeCBtYXRjaCBwYXJhbWV0ZXIgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGVuIHBhdHRlcm4KKyAqIGFuZCBuYW1lIG11c3QgaGF2ZSA8Yj5leGFjdGx5PC9iPiB0aGUgc2FtZSBudW1iZXIgb2YgcGFydHMsIGFuZCB0aGVpciBsYXN0CisgKiBwYXJ0cyBtdXN0IGJlIGlkZW50aWNhbCBpZiB0aGV5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMuCisgKiBGb3IgaW5zdGFuY2UsICdITWFwJyBhbmQgJ0hhTWFwJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdIYXNoTWFwJyBidXQgbmVpdGhlcgorICogJ0hhc2hNYXBFbnRyeScgbm9yICdIYXRNYXBwZXInLiBOb3RlIHRoYXQgd2hlbiB0aGUgbGFzdCBwYXJ0IGRvZXMgbm90IGNvbnRhaW4KKyAqIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLCB0aGVuIHRoZSBuYW1lIG1heSBlbmQgd2l0aCBsb3dlcmNhc2UgY2hhcmFjdGVycy4KKyAqIFNvLCAnSE0nIHBhdHRlcm4gd2lsbCBtYXRjaCBib3RoICdIYXNoTWFwJyA8Yj5hbmQ8L2I+ICdIYXRNYXBwZXInIGJ1dCB3aWxsIG5vdAorICogbWF0Y2ggJ0hhc2hNYXBFbnRyeScuCisgKgorICogRXhhbXBsZXM6CisgKiAgMS4JcGF0dGVybiA9IHsgJ04nLCAnUCcsICdFJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDMKKyAqICAJbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDIwCisgKiAgCXJlc3VsdCA9Jmd0OyB0cnVlCisgKiAgMi4JcGF0dGVybiA9IHsgJ04nLCAnUCcsICdFJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDMKKyAqICAJbmFtZSA9IHsgJ04nLCAnbycsICdQJywgJ2UnLCAncicsICdtJywgJ2knLCAncycsICdzJywgJ2knLCAnbycsICduJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDIxCisgKiAgCXJlc3VsdCA9Jmd0OyB0cnVlCisgKiAgMy4JcGF0dGVybiA9IHsgJ04nLCAndScsICdQJywgJ28nLCAnRScsICd4JyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDYKKyAqICAJbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDIwCisgKiAgCXJlc3VsdCA9Jmd0OyB0cnVlCisgKiAgNC4JcGF0dGVybiA9IHsgJ04nLCAndScsICdQJywgJ28nLCAnRScsICd4JyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDYKKyAqICAJbmFtZSA9IHsgJ04nLCAnbycsICdQJywgJ2UnLCAncicsICdtJywgJ2knLCAncycsICdzJywgJ2knLCAnbycsICduJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDIxCisgKiAgCXJlc3VsdCA9Jmd0OyBmYWxzZQorICogIDUuCXBhdHRlcm4gPSB7ICduJywgcCcsICdlJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDMKKyAqICAJbmFtZSA9IHsgJ04nLCAndScsJ2wnLCAnbCcsICdQJywgJ28nLCAnaScsICduJywgJ3QnLCAnZScsICdyJywgJ0UnLCAneCcsICdjJywgJ2UnLCAncCcsICd0JywgJ2knLCAnbycsICduJyB9CisgKiAgCW5hbWVTdGFydCA9IDIwCisgKiAgCW5hbWVFbmQgPSA5CisgKiAgCXJlc3VsdCA9Jmd0OyBmYWxzZQorICogIDYuCXBhdHRlcm4gPSB7ICdJJywgJ1AnLCAnTCcsICczJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDQKKyAqICAJbmFtZSA9IHsgJ0knLCAnUCcsICdlJywgJ3InLCAncycsICdwJywgJ2UnLCAnYycsICd0JywgJ2knLCAndicsICdlJywgJ0wnLCAnaScsICdzJywgJ3QnLCAnZScsICduJywgJ2UnLCAncicsICczJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDIxCisgKiAgCXJlc3VsdCA9Jmd0OyB0cnVlCisgKiAgNy4JcGF0dGVybiA9IHsgJ0gnLCBNJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDIKKyAqICAJbmFtZSA9IHsgJ0gnLCAnYScsICdzJywgJ2gnLCAnTScsICdhJywgJ3AnLCAnRScsICduJywgJ3QnLCAncicsICd5JyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDEyCisgKiAgCXJlc3VsdCA9Jmd0OyAocHJlZml4TWF0Y2ggPT0gdHJ1ZSkKKyAqICA4LglwYXR0ZXJuID0geyAnSCcsIE0nLCAnYScsICdwJyB9CisgKiAgCXBhdHRlcm5TdGFydCA9IDAKKyAqICAJcGF0dGVybkVuZCA9IDQKKyAqICAJbmFtZSA9IHsgJ0gnLCAnYScsICd0JywgJ00nLCAnYScsICdwJywgJ3AnLCAnZScsICdyJyB9CisgKiAgCW5hbWVTdGFydCA9IDAKKyAqICAJbmFtZUVuZCA9IDkKKyAqICAJcmVzdWx0ID0mZ3Q7IChwcmVmaXhNYXRjaCA9PSB0cnVlKQorICogCisgKiBAcGFyYW0gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgorICogQHBhcmFtIHBhdHRlcm5TdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHBhdHRlcm4sIGluY2x1c2l2ZQorICogQHBhcmFtIHBhdHRlcm5FbmQgdGhlIGVuZCBpbmRleCBvZiB0aGUgcGF0dGVybiwgZXhjbHVzaXZlCisgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorICogQHBhcmFtIG5hbWVTdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIG5hbWUsIGluY2x1c2l2ZQorICogQHBhcmFtIG5hbWVFbmQgdGhlIGVuZCBpbmRleCBvZiB0aGUgbmFtZSwgZXhjbHVzaXZlCisgKiBAcGFyYW0gcHJlZml4TWF0Y2ggZmxhZyB0ZWxsaW5nIHdoZXRoZXIgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIG5hbWUgcHJlZml4IG9yIG5vdC4KKyAqIAkJLiBGb3IgZXhhbXBsZSwgd2hlbiBpdCdzIDxjb2RlPnRydWU8L2NvZGU+OgorICogCQkJLSAnSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAgJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicgdHlwZXMsCisgKiAJCQkgIGJ1dCBub3QgJ0hhc2hNYXBFbnRyeScKKyAqIAkJCS0gJ0hNYXAnIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAgJ0hhc2hNYXAnIHR5cGUgYnV0IG5vdCAnSHRtbE1hcHBlcicuCisgKiAJCS4gYW5kLCB3aGVuIGl0J3MgPGNvZGU+ZmFsc2U8L2NvZGU+OgorICogCQkJLSAnSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCBib3RoICAgJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicKKyAqIAkJCSAgYW5kICdIYXNoTWFwRW50cnknCisgKiAJCQktICdITWFwJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggYm90aCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJworICogCQkJICB0eXBlcy4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWItcGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW1lbENhc2VNYXRjaChjaGFyW10gcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgYm9vbGVhbiBwcmVmaXhNYXRjaCkgeworLi4uCit9Cis8L3ByZT4KK05vdGUgdGhhdCBzYW1lIG1ldGhvZHMgaGF2ZSBiZWVuIGFkZGVkIG9uIDxjb2RlPlNlYXJjaFBhdHRlcm48L2NvZGU+IGJ1dCB3aXRoCis8Y29kZT5TdHJpbmc8L2NvZGU+IHBhcmFtZXRlcnMgaW5zdGVhZCBvZiA8Y29kZT5jaGFyW108L2NvZGU+IG9uZXMgKGphdmFkb2MgY29tbWVudHMKK2FyZSBpZGVudGljYWwpOgorPHByZT4KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW1lbENhc2VNYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcHJlZml4TWF0Y2gpIHsKKy4uLgorfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbWVsQ2FzZU1hdGNoKFN0cmluZyBwYXR0ZXJuLCBpbnQgcGF0dGVyblN0YXJ0LCBpbnQgcGF0dGVybkVuZCwgU3RyaW5nIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBib29sZWFuIHByZWZpeE1hdGNoKSB7CisuLi4KK30KKzwvcHJlPgorTm90ZSBhbHNvIHRoYXQgbWV0aG9kcyA8Y29kZT5jYW1lbENhc2VNYXRjaChTdHJpbmcsIGludCwgaW50LCBTdHJpbmcsIGludCwgaW50KTwvY29kZT4KK29mIDxjb2RlPkNoYXJPcGVyYXRpb248L2NvZGU+IGFuZCA8Y29kZT5TZWFyY2hQYXR0ZXJuPC9jb2RlPiBjbGFzc2VzIGhhdmUgYmVlbgorZGVwcmVjYXRlZCB0byBhdm9pZCB0b28gbWFueSAnY2FtZWxDYXNlTWF0Y2gqJyBtZXRob2RzIG9uIHRoZXNlIGNsYXNzZXMuCis8L2xpPgorPGxpPlNlYXJjaCBFbmdpbmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYmV0dGVyIGhhbmRsZSBhZGRpdGlvbmFsIDxjb2RlPlNlYXJjaFBhdHRlcm48L2NvZGU+Citjb25zdGFudHMgd2hpbGUgdXNpbmcgQ2FtZWwgQ2FzZSBvbmUgKHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA0MDAiPmJ1ZyAyMDA0MDA8L2E+KS48YnI+CitFeGlzdGluZyA8Y29kZT5TZWFyY2hQYXR0ZXJuI1JfQ0FNRUxDQVNFX01BVENIPC9jb2RlPiBjb25zdGFudCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZDxicj4KK2lzIDxiPm5vdyByZXBsYWNlZCBieSA8Y29kZT5TZWFyY2hQYXR0ZXJuI1JfQ0FNRUxfQ0FTRV9NQVRDSDwvY29kZT48L2I+OjxwcmU+CisJLyoqCisJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIGEgQ2FtZWwgQ2FzZSBleHByZXNzaW9uIHdpdGgKKwkgKiBhIHN0cmljdCBudW1iZXIgb2YgcGFydHMgYW5kIHByZXZlbnRpbmcgYXV0b21hdGljIHByZWZpeCBtYXRjaGluZyBmb3IgdGhlIGxhc3QKKwkgKiBwYXJ0IChpZiBpdCBjb25zaXN0cyBvZiBtdWx0aXBsZSBsZXR0ZXJzKS4KKwkgKiAKKwkgKiBFeGFtcGxlczoKKwkgKiAJLiAnSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJyB0eXBlcywKKwkgKiAJCWJ1dCBub3QgJ0hhc2hNYXBFbnRyeScKKwkgKiAJLiAnSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoICdIYXNoTWFwJyB0eXBlIGJ1dCBub3QgJ0h0bWxNYXBwZXInLgorCSAqCisJICogVGhpcyBDYW1lbCBDYXNlIG1hdGNoIHJ1bGUgZG9lcyBub3QgYWxsb3cgcHJlZml4IG1hdGNoIGJ1dCBhY2NlcHQgaW5zZW5zaXRpdmUKKwkgKiBjYXNlLiBGb3IgaW5zdGFuY2UsICdIYXNoTWFwJyBvciAnSEFTSE1BUCcgcGF0dGVybnMgdXNpbmcgdGhpcyBDYW1lbCBDYXNlCisJICogcnVsZSB3aWxsIG1hdGNoIGJvdGggJ0hhc2hNYXAnIGJ1dCBub3QgJ0hhc2hNYXBFbnRyeScuCisJICoKKwkgKiBUaGlzIHJ1bGUgc3RpbGwgY2FuIGJlIGNvbWJpbmVkIHRvIHByZWZpeCBtYXRjaCB0byBhY2NlcHQgcHJlZml4IG1hdGNoZXMKKwkgKiAoJ0hhc2hNYXAnIHBhdHRlcm4gbWF0Y2hpbmcgJ0hhc2hNYXBFbnRyeScgbmFtZSkuIEl0IGNhbiBhbHNvIGJlIGNvbWJpbmVkCisJICogdG8gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggdG8gcmVqZWN0IGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hlcyAoJ0hBTUEnIHBhdHRlcm4KKwkgKiB3aWxsIG5vdCBtYXRjaCAnSGFzaE1hcCcgbmFtZSkuCisJICoKKwkgKiBJZiB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0gcnVsZSBpcyBhbHNvIGNvbWJpbmVkLCB0aGVuIHRoZSByZWFsIHVzZWQKKwkgKiBtYXRjaCBydWxlIHdpbGwgZGVwZW5kIG9uIHdoZXRoZXIgc3RyaW5nIHBhdHRlcm4gY29udGFpbnMgc3BlY2lmaWMgcGF0dGVybgorCSAqIGNoYXJhY3RlcnMgKGUuZy4gJyonIG9yICc/Jykgb3Igbm90LiBJZiBpdCBkb2VzLCB0aGVuIG9ubHkgUGF0dGVybiBtYXRjaCBydWxlIHdpbGwKKwkgKiBiZSB1c2VkLCBvdGhlcndpc2Ugb25seSBDYW1lbCBDYXNlIG1hdGNoIHdpbGwgYmUgdXNlZC4KKwkgKiBGb3IgZXhhbXBsZSwgd2l0aCAnTlBFJyBzdHJpbmcgcGF0dGVybiwgc2VhcmNoIHdpbGwgb25seSB1c2UKKwkgKiBDYW1lbCBDYXNlIG1hdGNoIHJ1bGUsIGJ1dCB3aXRoICdOKlAqRSonIHN0cmluZyBwYXR0ZXJuLCBpdCB3aWxsIAorCSAqIHVzZSBvbmx5IFBhdHRlcm4gbWF0Y2ggcnVsZS4KKwkgKgorCSAqIEBzZWUgQ2hhck9wZXJhdGlvbiNjYW1lbENhc2VNYXRjaChjaGFyW10sIGNoYXJbXSwgYm9vbGVhbikgZm9yIGEgZGV0YWlsZWQKKwkgKiBleHBsYW5hdGlvbiBvZiBDYW1lbCBDYXNlIG1hdGNoaW5nLgorCSAqCisJICogQHNpbmNlIDMuNAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfQ0FNRUxfQ0FTRV9NQVRDSCA9IDB4MDEwMDsKKzwvcHJlPgorVGhpcyBjaGFuZ2Ugd2FzIG5lY2Vzc2FyeSBoYXMgdGhlIG9ic29sZXRlIDxjb2RlPlJfQ0FNRUxDQVNFX01BVENIPC9jb2RlPiBjb3VsZAorbm90IHN1cHBvcnQgY29ycmVjdGx5IGFkZGl0aW9uYWwgY29uc3RhbnRzIGFzIDxjb2RlPlJfUFJFRklYX01BVENIPC9jb2RlPiBvciAKKzxjb2RlPlJfQ0FTRV9TRU5TSVRJVkU8L2NvZGU+Ljxicj4KK0hvd2V2ZXIsIHRoaXMgZGVwcmVjYXRlZCBjb25zdGFudCBpcyBzdGlsbCBhY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorYnV0IHVzZXIgaXMgYWR2aXNlZCB0byByZXBsYWNlIGl0IHdpdGggPGNvZGU+Ul9DQU1FTF9DQVNFX01BVENIIHwgUl9QUkVGSVhfTUFUQ0g8L2NvZGU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEwNjYiPjIwMTA2NjwvYT4KK1twcmVmc10gUHJlZmVyZW5jZXMgbGlzdGVuZXJzIGFyZSBub3QgcmVtb3ZlZCB3aGlsZSBzaHV0dGluZyBkb3duIEphdmFNb2RlbE1hbmFnZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI4NDEiPjE1Mjg0MTwvYT4KK1ttb2RlbF0gSUphdmFQcm9qZWN0LmZpbmRUeXBlKG5hbWUsIG1vbml0b3IpIGRvZXNuJ3QgZmluZCBzZWNvbmRhcnkgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQ1NiI+MTA4NDU2PC9hPgorSVBhY2thZ2VGcmFnbWVudFJvb3QjZ2V0UGFja2FnZUZyYWdtZW50KCkgc2hvdWxkIG5vdCBhY2NlcHQgaW52YWxpZCBwYWNrYWdlIG5hbWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMTA0Ij4yMDExMDQ8L2E+CitKYXZhRWxlbWVudCBvZiBhIHJlY292ZXJlZCB0eXBlIGJpbmRpbmcgc2hvdWxkIG5vdCByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0IHdpdGggbm8gcGFyZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNjIyIj4xOTA2MjI8L2E+Cit0eXBlIGJpbmRpbmcgbWFya2VkIGFzIHJlY292ZXJlZCBidXQgYWxsIGlzIGNvbXBpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTA2NCI+MjAxMDY0PC9hPgorW3NlYXJjaF0gU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyguLikgZG9lcyBub3QgZmluZCBDYW1lbENhc2UgbWF0Y2gKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMxMTciPjE4MzExNzwvYT4KK1VzZXIgTGlicmFyeSBMb3N0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwNDAwIj4yMDA0MDA8L2E+Citbc2VhcmNoXSBDYW1lbCBDYXNlIG1hdGNoIHByZWZpeCBpbnNlbnNpdGl2ZSBhbHRob3VnaCBzcGVjIHNheXMgcHJlZml4IHNlbnNpdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDYyNCI+MTI0NjI0PC9hPgorW3NlYXJjaF0gQ2FtZWxjYXNlIG1hdGNoaW5nIHJvdXRpbmVzIHNob3VsZCBzdXBwb3J0IGVuZCBjaGFyYWN0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTE3MzkiPjE5MTczOTwvYT4KKyJEdXBsaWNhdGUgbmVzdGVkIHR5cGUiIGJvZ3VzIGVycm9yIG9uIHN0YXRpYyBjbGFzcyBvZiBhYnN0cmFjdCBjbGFzcyBvciBpbnRlcmZhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA5MzEiPjIwMDkzMTwvYT4KK0dFTkVSQVRFRF9CWSByZWZlcmVuY2VzIHN0aWxsIGV4aXN0IGluIHNvbWUgamF2YWRvYyBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDU0NyI+MjAwNTQ3PC9hPgorWzEuNV1bY29tcGlsZXJdIEludmFsaWQgYW1iaWd1b3VzIGVycm9yIHdoZW4gY2FsbGluZyBhbiBvdmVycmlkZW4gZ2VuZXJpYyBtZXRob2Qgd2l0aCBNVUxUSVBMRSBib3VuZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgxMjAiPjE5ODEyMDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDYW5ub3QgZGlyZWN0bHkgaW52b2tlIHRoZSBhYnN0cmFjdCBtZXRob2QgaHVjaChJMSkgZm9yIHRoZSB0eXBlIEkxCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MjU0Ij4xOTYyNTQ8L2E+CitPdmVycmlkZXMgd3JvbmcgZm9yIHdpbGRjYXJkIHBhcmFtZXRlcml6ZWQgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MzI2NSI+MTkzMjY1PC9hPgorWzEuNV1bY29tcGlsZXJdIEluY29ycmVjdCBhbWJpZ3VvdXMgbWV0aG9kIGVycm9yIGludm9sdmluZyBhYnN0cmFjdCBjbGFzc2VzIGFuZCBlbnVtcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODI1MyI+MTk4MjUzPC9hPgordW52ZXJzaW9uZWQgZG93bmxvYWRzIG9mIGVjai5qYXIgYW5kIGVjanNyYy56aXAKKworCis8YSBuYW1lPSJ2XzgwOCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTIgLSBBdWd1c3QgMjEsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODA4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgwOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBmaXggZm9yIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Njc4MSI+YnVnIDE4Njc4MTwvYT4gcmVxdWlyZWQgdGhlIGluZGV4IHZlcnNpb24gdG8gYmUgaW5jcmVtZW50ZWQuCisgICAgIEluZGV4ZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2VuZXJhdGVkIHVwb24gc3Vic2VxdWVudCBzZWFyY2ggcXVlcmllcyAoYWNjb3VudGluZyBmb3IgaW5kZXhpbmcgbm90aWZpY2F0aW9uIGluIHNlYXJjaCBwcm9ncmVzcyBkaWFsb2dzKS4KKzwvbGk+Cis8bGk+QVBJIG1ldGhvZCA8Y29kZT5KYXZhUHJvamVjdC5zZXRPcHRpb24oU3RyaW5nLCBTdHJpbmcpPC9jb2RlPiBiZWhhdmlvciBoYXMgYmVlbiBzbGlnaHRseSBjaGFuZ2VkIGNvbnNlcXVlbnQgdXBvbiBmb2xsb3dpbmcgYnVncyBmaXhpbmc6Cis8dWw+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNTYyIj5idWcgMTUyNTYyPC9hPjogCis8Y29kZT5udWxsPC9jb2RlPiBpcyBub3cgYWNjZXB0ZWQgZm9yIHRoZSBvcHRpb24gdmFsdWUgYW5kIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBwcmVmZXJlbmNlIGZyb20gdGhlIHByb2plY3QsPC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI1NzgiPmJ1ZyAxNTI1Nzg8L2E+OiAKK3RoZSBwcmVmZXJlbmNlIGlzIG5vdCByZW1vdmVkIGZyb20gcHJvamVjdCB3aGVuIHRoZSB2YWx1ZSBpcyBlcXVhbHMgdG8gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlIHZhbHVlLjwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzOTIzIj4xODM5MjM8L2E+CitbcHJlZnNdIE5QRSBpbiBKYXZhUHJvamVjdCNzZXRPcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNTc4Ij4xNTI1Nzg8L2E+CitbcHJlZnNdIElKYXZhUHJvamVjdC5zZXRPcHRpb24oT2JqZWN0LE9iamVjdCkgd3JvbmdseSByZW1vdmVzIGtleSB3aGVuIHZhbHVlIGlzIGVxdWFscyB0byBKYXZhQ29yZSBvbmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI1NjIiPjE1MjU2MjwvYT4KK1twcmVmc10gSUphdmFQcm9qZWN0LnNldE9wdGlvbiguLi4sIG51bGwpIGRvZXMgbm90IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA0NDkiPjIwMDQ0OTwvYT4KK1ttb2RlbF0gQ2xhc3NwYXRoIHZhcmlhYmxlIGRlcHJlY2F0aW9uIG1lc3NhZ2UgaXMgbm90IGZsdXNoZWQgZnJvbSBjYWNoZSB3aGVuIHZhcmlhYmxlIGlzIHJlbW92ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYxMTMiPjE4NjExMzwvYT4KK1ttb2RlbF0gY2xhc3NwYXRoIHZhcmlhYmxlIGRlcHJlY2F0aW9uIG1lc3NhZ2VzIG5vdCBpbml0aWFsaXplZCB3aGVuIGNhbGxlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTY5NSI+MTA5Njk1PC9hPgorW3NlYXJjaF0gTnVtYmVycyBzaG91bGQgYmUgdHJlYXRlZCBhcyB1cHBlci1jYXNlIGxldHRlcnMgaW4gQ2FtZWxDYXNlIG1hdGNoaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NzgxIj4xODY3ODE8L2E+CitTdGFja092ZXJmbG93RXJyb3Igd2hpbGUgY29tcHV0aW5nIGxhdW5jaCBidXR0b24gdG9vbHRpcAorCis8YSBuYW1lPSJ2XzgwNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy40TTIgLSBBdWd1c3QgMTUsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODA3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgwNyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPk5ldyBmaXggZm9yIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDA2NCI+YnVnIDIwMDA2NDwvYT4gcmVxdWlyZWQgdGhlIGluZGV4IHZlcnNpb24gdG8gYmUgaW5jcmVtZW50ZWQuCisgICAgIEluZGV4ZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2VuZXJhdGVkIHVwb24gc3Vic2VxdWVudCBzZWFyY2ggcXVlcmllcyAoYWNjb3VudGluZyBmb3IgaW5kZXhpbmcgbm90aWZpY2F0aW9uIGluIHNlYXJjaCBwcm9ncmVzcyBkaWFsb2dzKS4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDA2NCI+MjAwMDY0PC9hPgorW3NlYXJjaF0gUmVzb3VyY2VFeGNlcHRpb24gd2hpbGUgc2VhcmNoaW5nIGZvciBtZXRob2QgcmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MDUxIj4xOTgwNTE8L2E+CitbMS41XVtjb21waWxlcl0gSW1wcm9wZXIgUG9seW1vcnBoaWMgRXhjZXB0aW9uIEhhbmRsaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDM5OSI+MTk0Mzk5PC9hPgorSUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nLCBXb3JraW5nQ29weU93bmVyKSBkb2Vzbid0IHJldHVybiB0aGUgc2FtZSBlbGVtZW50IHdpdGggZGlmZmVyZW50IFZNcy4KKworPGEgbmFtZT0idl84MDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0yIC0gQXVndXN0IDE0LCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgwNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MDYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgZml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgxODQiPmJ1ZyAxMzgxODQ8L2E+IHJlcXVpcmVkIHRoZSBpbmRleCB2ZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkLgorICAgICBJbmRleGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZCB1cG9uIHN1YnNlcXVlbnQgc2VhcmNoIHF1ZXJpZXMgKGFjY291bnRpbmcgZm9yIGluZGV4aW5nIG5vdGlmaWNhdGlvbiBpbiBzZWFyY2ggcHJvZ3Jlc3MgZGlhbG9ncykuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjk5NzAiPjE2OTk3MDwvYT4KK1ttb2RlbF0gY29kZSBhc3Npc3QgZmF2b3JpdGVzIG11c3QgaG9ub3VyIGJ1aWxkIHBhdGggb2YgcHJvamVjdCBpbiBjb250ZXh0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1NDkzIj4xMzU0OTM8L2E+Citbc2VhcmNoXSBDbGFyaWZ5IFR5cGVOYW1lUmVxdWVzdG9yI2FjY2VwdFR5cGUoLi4uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODE4NCI+MTM4MTg0PC9hPgorW3NlYXJjaF0gVHlwZSBEaWFsb2cgKENvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIG5hbWUgdG8gYSB0eXBlKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTAwNCI+MTk5MDA0PC9hPgorW3NlYXJjaF0gSmF2YSBTZWFyY2ggaW4gJ0pSRSBsaWJyYXJpZXMnIGZpbmRzIG1hdGNoZXMgaW4gQXBwbGljYXRpb24gTGlicmFyaWVzCisKKzxhIG5hbWU9InZfODA1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMSAtIEF1Z3VzdCAyLCAyMDA3IC0gMy40IE1JTEVTVE9ORSAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgwNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MDUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTg0ODMiPjE5ODQ4MzwvYT4KK0J1aWxkZXJUZXN0czogbmVlZCBleHBlY3RpbmdVbmlxdWVDb21waWxlZENsYXNzZXMgbWV0aG9kCisKKzxhIG5hbWU9InZfODA0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMSAtIEF1Z3VzdCAxLCAyMDA3Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzgwNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl84MDQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BbGwgdGVzdHMgcHJvamVjdHMgYW5kIG9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sIHByb2plY3QncyB2ZXJzaW9ucyBoYXZlIGJlZW4gaW5jcmVtZW50ZWQuPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzYyIj4xOTgzNjI8L2E+CitGb3JtYXR0ZXIgc3RvcHMgd29ya2luZyB3aGVuIHNvdXJjZSBjb2RlIGNvbnRhaW5zIGZvbGxvd2luZyBsaW5lCisKKzxhIG5hbWU9InZfODAzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMSAtIEp1bHkgMzAsIDIwMDcKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfODAzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzgwMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTYzNiI+MTA5NjM2PC9hPgorQ29tbWVudCBmb3JtYXR0ZXIgZG9lc24ndCBzdXBwb3J0ICZxdW90OyZhbXA7IzQyOy8mcXVvdDsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTcxNjkiPjE5NzE2OTwvYT4KK0Zvcm1hdHRlciBleHBhbmRzICZhbXA7IzY0OyBpbiBhbm5vdGF0aW9uIGluIGphdmFkb2MsIGNyZWF0aW5nIGludmFsaWQgdGFnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MTUzIj4xOTgxNTM8L2E+CitbZm9ybWF0dGVyXSBhZGRzIGV4dHJhIHNwYWNlIGJlZm9yZSBleHBhbmRlZCBudW1lcmljYWwgZW50aXR5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk3NDAwIj4xOTc0MDA8L2E+CitOUEUgZm9yIGNvbXBsZXRpb24gZW5naW5lIGluIGNsYXNzIHN0YXRpYyBibG9jaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNzI3Ij41MzcyNzwvYT4KK1tUYXNrc10gIGxvbmdlc3QgdGFncyBzaG91bGQgbWF0Y2gKKworPGEgbmFtZT0idl84MDIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0xIC0gSnVseSAyMywgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MDIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODAyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY2MDkzIj4xNjYwOTM8L2E+Citbc2VhcmNoXSBOUEUgc2VhcmNoaW5nIGZvciByZWZlcmVuY2VzIHRvIHByaXZhdGUgc3RhdGljIG1ldGhvZCBpbiBjbGFzcyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2NTE0Ij4xOTY1MTQ8L2E+CitCdW5jaCBvZiBleGNlcHRpb24gZHVyaW5nIGNvZGUgdHlwaW5nIGluIEpEVCBlZGl0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYzMzMiPjE4NjMzMzwvYT4KK1tzZWFyY2hdIFNob3VsZCBiZXR0ZXIgbG9jYXRlIGZpZWxkcyBhbmQgbWV0aG9kcyBtYXRjaGVzIG9uIGJpbmFyeSBzdXBlciB0eXBlcyB3aXRoIHVucmVzb2x2ZWQgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzM1NyI+MTY3MzU3PC9hPgorbm9uLWVtcHR5IGluaXQgYmxvY2sgaW4gbG9jYWwgbWVtYmVyIHR5cGUgaGFzIG5vIGNoaWxkcmVuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2MTE0Ij4xODYxMTQ8L2E+CitJTWV0aG9kQmluZGluZy5vdmVycmlkZXMoLi4pIHNob3VsZCBjb25zaWRlciBzdGF0aWMKKworPGEgbmFtZT0idl84MDEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNE0xIC0gSnVseSAxNywgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MDEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODAxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+SW5jcmVtZW50ZWQgSkRUL0NvcmUgcGx1Zy1pbiBpZCB0byAiMy40LjAiIGFzIGZpeCBmb3IgMTg2ODIyIGFkZHMgbmV3IGNvbnN0YW50cyBpbiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTwvY29kZT4uCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTYzMzkiPjE5NjMzOTwvYT4KK1tzZWFyY2hdIFNlYXJjaEVuZ2luZSBub3QgcmV0dXJuaW5nIGNvcnJlY3QgcmVzdWx0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MzU0Ij4xOTYzNTQ8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gaW4gcGFja2FnZSBiaW5kaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MjQ5Ij4xOTYyNDk8L2E+Citwcm9ibGVtIGluIHBhcnNpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU4MDIiPjE5NTgwMjwvYT4KK05hbWUgY2xhc2ggY29tcGlsZSBlcnJvciBnZW5lcmF0ZWQgaWYgc3VwZXJjbGFzcyBpcyBhYnN0cmFjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTQ2OCI+MTk1NDY4PC9hPgorWzEuNV1bY29tcGlsZXJdIEVjbGlwc2UgY29tcGlsZXIgZGlmZmVycyBmcm9tIGphdmFjIHdpdGggZ2VuZXJpY3MgKG5hbWUgY2xhc2gpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2NjUzIj4xOTY2NTM8L2E+CitbY29tcGlsZXJdIE1vcmUgcmVzaWxpZW5jZSB3aXRoIHVuYm91bmQgY2F1Z2h0IGV4Y2VwdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTIzODciPjE5MjM4NzwvYT4KK1dyb25nIHdhcm5pbmcgbG9jYXRpb24gZm9yIGEgbm9uIHN0YXRpYyByZWZlcmVuY2UgdG8gYW4gZW51bSB2YWx1ZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUyMjgiPjE5NTIyODwvYT4KK1tzZWFyY2hdIEludmFsaWQgcGF0aCBpbiBvcGVuIHR5cGUgZGlhbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2ODIyIj4xODY4MjI8L2E+CitbMS41XVtjb21waWxlcl0gQWRkIG1vcmUgcmVzaWxpZW5jZSBvbiBhbm5vdGF0aW9uIGFuZCBlbnVtIHR5cGUgZGVjbGFyYXRpb24gd2l0aCB0eXBlIHBhcmFtZXRlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Nzk5OCI+OTc5OTg8L2E+CitbYnVpbGRlcl0gaW1wcm92ZSB0aGUgZXJyb3IgaGFuZGxpbmcgaW4gY2FzZSB0aGUgYnVpbGQgZW5jb3VudGVycyBhIGxvY2tlZCBmaWxlIHdpdGhpbiB0aGUgdGhlIG91dHB1dCBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODg4NzYiPjE4ODg3NjwvYT4KK1thc3Npc3RdIFByb3Bvc2FscyBpbnNpZGUgYW4gaW1wb3J0IHN0YXRlbWVudCBzaG91bGRuJ3QgYmUgZnVsbHkgcXVhbGlmaWVkCisKKzxhIG5hbWU9InZfODAwIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjRNMSAtIEp1bHkgOSwgMjAwNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl84MDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfODAwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+SW5jcmVtZW50ZWQgSkRUL0NvcmUgcGx1Zy1pbiBpZCB0byAiMy4zLjEwMCIuIFdpbGwgZ28gdG8gIjMuNC4wIiBhcyBzb29uIGFzIGFuIEFQSS9mZWF0dXJlIGdldHMgYWRkZWQuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTA5NjAiPjE5MDk2MDwvYT4KK1tiYXRjaF1bY29tcGlsZXJdIGhlbHAgbWVzc2FnZSBmb3IgYW5ub3RhdGlvbnMgcHJvY2Vzc2luZyBzaG91bGQgYmUgaW1wcm92ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM2NTQiPjEwMzY1NDwvYT4KK0JpbmRpbmdLZXkuZ2V0VHlwZUFyZ3VtZW50cyBidWcgd2l0aCBxdWFsaWZpZWQgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTExMjUiPjE5MTEyNTwvYT4KK1sxLjVdIFthc3Npc3RdIE5QRSBpbiBDb21wbGV0aW9uRW5naW5lLnByb3Bvc2VUeXBlKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU0ODkiPjE5NTQ4OTwvYT4KK1tzZWFyY2hdIEphdmFkb2MgcmVmZXJlbmNlIG5vdCBmb3VuZCB3aGlsZSB1c2luZyBTZWFyY2hFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUzMTciPjE5NTMxNzwvYT4KK1tjb21waWxlcl0gamF2YS5sYW5nLkNsYXNzRm9ybWF0RXJyb3I6IEludmFsaWQgcGMgaW4gTGluZU51bWJlclRhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NTA5Ij4xOTU1MDk8L2E+CitOZWVkIHRvIGltcHJvdmUgY2xhc3NwYXRoIHJlc29sdXRpb24gZm9yIEFwYWNoZSBIYXJtb255IGluIG9yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NTI2Ij4xOTU1MjY8L2E+CitvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uLkdlbmVyaWNUeXBlVGVzdC50ZXN0MDc0NCBkZXBlbmRzIG9uIG5vbi1zcGVjaWZpZWQgcGFja2FnZS1wcml2YXRlIGNsYXNzIEhhc2hNYXAuRW50cnkgaW1wbGVtZW50YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTEwODIiPjE5MTA4MjwvYT4KK0Fubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSByZXR1cm5zIHdyb25nIHZhbHVlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5Nzk5Ij4xODk3OTk8L2E+CitbanNyMjY5XSBNYWtlIGdldERvY0NvbW1lbnQoKSBiZWhhdmUgbW9yZSBsaWtlIGphdmFjCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyNzc0Ij4xOTI3NzQ8L2E+CitBbm5vdGF0aW9uIEFTVCBub2RlcyBzaG91bGQgaGF2ZSB1bmlxdWUgSUFubm90YXRpb25CaW5kaW5ncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTcwMyI+MTcxNzAzPC9hPgorRWNsaXBzZSBjYW5ub3QgZmluZCBzb3VyY2UgZm9yICouY2xhc3MgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTM5NzkiPjE5Mzk3OTwvYT4KK0FTVCBwYXJzZXIgZ2VuZXJhdGVzIHdyb25nIEFTVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1Mjg4Ij45NTI4ODwvYT4KK1ttb2RlbF0gQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uIHJ1bnMgd2l0aCB3cm9uZyBJU2NoZWR1bGluZ1J1bGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDIwNDQiPjE0MjA0NDwvYT4KK1tzZWFyY2hdICZxdW90O0FuZCZxdW90OyBQYXR0ZXJuIGZhaWxzIHdpdGggTnVsbFBvaW50ZXJFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE4ODIiPjExMTg4MjwvYT4KK1thc3Npc3RdIEludmFsaWQgcmVsZXZhbmNlIHdoaWxlIGNvbXBsZXRpbmcgaW4gY2FzZSBvZiBhIHN3aXRjaAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NTI2MyI+MTk1MjYzPC9hPgorVXBkYXRlIGV4cG9ydHBsdWdpbnMueG1sIHRvIDMuMy4xMDAgYW5kIDMuNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTQ4OCI+MTgxNDg4PC9hPgorW2luZGV4XSBMb3RzIG9mIHVuYnVmZmVyZWQgc2VxdWVudGlhbCByZWFkcyBpbiBEaXNrSW5kZXgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODMxMSI+MTgzMTE8L2E+CithcGk6IElTb3VyY2VSZWZlcmVuY2U6OmdldFNvdXJjZSBjYW4gcmV0dXJuIHVuZG9jdW1lbnRlZCByZXN1bHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk1NjAiPjEyOTU2MDwvYT4KK1tzcGVjXSBRdWVzdGlvbmFibGUgamF2YWRvYyBmb3IgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODIyNiI+MTc4MjI2PC9hPgorQ2xhcmlmeSBzcGVjIGZvciBJSmFyRW50cnlSZXNvdXJjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzIyOSI+MTYzMjI5PC9hPgorW21vZGVsXSBJQWNjZXNzUnVsZSBkb2VzIG5vdCBzYXkgaXQgY2Fubm90IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk1OTAiPjE0OTU5MDwvYT4KK1ttb2RlbF0gYmluZGluZ3MgZm9yIGR1cGxpY2F0ZSBsb2NhbCB2YXJpYWJsZXMgc2hhcmUgc2FtZSBrZXkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUwOTEiPjE5NTA5MTwvYT4KK0luZGV4IGlzIHJlYnVpbHQgb24gZWFjaCBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwODg5Ij4xNzA4ODk8L2E+CitbNS4wXVtjb250ZW50IGFzc2lzdF0gc3RyYW5nZSBsYWJlbCBmb3IgJ2NsYXNzJyBwcm9wb3NhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDk2NSI+MTkwOTY1PC9hPgorW2NvbXBpbGVyXSB1c2VsZXNzIGFzc2lnbm1lbnQgdG8gbG9jYWwgdmFyaWFibGUgcGFyYW1ldGVycyBpbiBTY29wZSBsaW5lIDQzMQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzEyNSI+MTUzMTI1PC9hPgorW2dldHRlciBzZXR0ZXJdIEdldHRlcnMvc2V0dGVycyBmb3IgdmFyaWFibGVzIHN0YXJ0aW5nIHdpdGggbm9uLUxhdGluIGxldHRlciBhcmUgZ2VuZXJhdGVkIGluY29ycmVjdGx5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2NzYwIj4xODY3NjA8L2E+CitUd28gY2FzZXMgb2Ygc3dpdGNoIGluIERlbHRhUHJvY2Vzc29yI2ZpcmUgY291bGQgYmUgbWVyZ2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwOTU0Ij4xNzA5NTQ8L2E+Cit2b2lkIHNob3VsZCBub3QgYmUgcHJvcG9zZWQgaW5zaWRlIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDc2NiI+MTIwNzY2PC9hPgorcHJvYmxlbXMgd2hlbiB1c2luZyBjbGFzc2VzIG9mIHRoZSBzYW1lIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzc0NTIiPjEzNzQ1MjwvYT4KK0F1dG9jb21wbGV0ZSBhZGRzICZxdW90O1ZvaWQmcXVvdDsgaW5zdGVhZCBvZiBkb2luZyBub3RoaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk0NDIwIj4xOTQ0MjA8L2E+CitNaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiBidWlsZCBmYWlscyBkdWUgdG8gb3V0IG9mIHN5bmMgd29ya3NwYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMTM5Ij4xMzIxMzk8L2E+CitbYXNzaXN0XSBEdXBsaWNhdGUgbmFtZXMgd2hpbGUgY29tcGxldGluZyBpbiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5NjMxIj45OTYzMTwvYT4KK1thc3Npc3RdWzUuMF0gVW5uZWNlc3NhcnkgcHJvcG9zYWxzIG9uIGFubm90YXRpb24gY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTAzNyI+MTcxMDM3PC9hPgorW2NvZGVhc3Npc3RdIGlmIDEuNCBvciBoaWdoZXIgY29kZSBhc3Npc3QgYWZ0ZXIgJ2ltcG9ydCcgc2hvdWxkIG5vdCBzdWdnZXN0IHR5cGVzIGZyb20gZGVmYXVsdCBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NDQ2Ij4xMzk0NDY8L2E+CitbYnVpbGQgcGF0aF0gYnVnIGluIHRoZSBFZGl0IExpYnJhcnkgZGlhbG9nIGJveCwgd2hlbiBjaGFuZ2luZyB0aGUgZGVmYXVsdCBKUkUsIGFuZCBzd2l0Y2hpbmcgZnJvbSBhbHRlcm5hdGUgSlJFIHRvIHdvcmtzcGFjZSBkZWZhdWx0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyNDk3Ij4xOTI0OTc8L2E+CitDYW5ub3QgYWx3YXlzIGZpbmQgbWV0aG9kIGRlZmluaXRpb24sIGRlcGVuZGluZyBvbiBjdXJzb3IgcG9zaXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE5NjciPjE1MTk2NzwvYT4KK1sxLjVdW2Fzc2lzdF0gQ29kZSBjb21wbGV0aW9uIHdpdGggZW51bWVyYXRpb25zIGltcGxlbWVudGluZyBhbiBpbnRlcmZhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA2MzIiPjE1MDYzMjwvYT4KK1thc3Npc3RdIENvbnRlbnQgQXNzaXN0IGFuZCBQYXJhbWV0ZXIgSGludHMgc29tZXRpbWVzIGRvbid0IHdvcmsgZm9yIGNvbnN0cnVjdG9yIGNhbGwKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQ0MzUiPjE5NDQzNTwvYT4KK0pEVCBDb3JlIG1hbmlmZXN0IGNvbnRhaW5zIGludmFsaWQgcHJlcmVxZWQgdmVyc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTMxOCI+MTg1MzE4PC9hPgorW2Fzc2lzdF0gTm8gcHJvcG9zYWxzIHdoZW4gY29tcGxldGluZyBpbnNpZGUgYSBtZXRob2QgaW1wb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMDMxIj4xMDIwMzE8L2E+CitDb250ZW50IGFzc2lzdCBwcm9wb3NlcyBzYW1lIHR5cGUgdHdpY2UgYWZ0ZXIgJnF1b3Q7Y2FsbChuZXcgfCZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzA2OSI+MTU3MDY5PC9hPgorW2Fzc2lzdF0gQ29udGVudCBBc3Npc3QgaW50cm9kdWNlcyBjb21waWxlIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5NDM0Ij4xMTk0MzQ8L2E+CitbY29kZSBzZWxlY3RdIENvZGUgc2VsZWN0IHJldHVybnMgZG91YmxlZCBqYXZhIGVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQwMzQiPjE5NDAzNDwvYT4KK1sxLjVdW0NvbXBpbGVyXSBJbmNvbnNpc3RlbmN5IHdpdGggamF2YWM6IHN1YmNsYXNzIGRvZXMgbm90IHByb3Blcmx5IGluaGVyaXQgZ2VuZXJpYyBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUwMzciPjE4NTAzNzwvYT4KK09wdGltaXphdGlvbiBvcHBvcnR1bml0eSBpbiBNZXRob2RWZXJpZmllcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTkyOCI+MTkxOTI4PC9hPgorVXNlIFV0aWwubG9nIGluc3RlYWQgb2YgcHJpbnRTdGFja1RyYWNlIGF0IEFic3RyYWN0SW1hZ2VCdWlsZGVyIzYxMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDE4NSI+MTk0MTg1PC9hPgorW3NlYXJjaF0gZm9yIHBhY2thZ2UgZGVjbGFyYXRpb25zIGZpbmRzIGFsc28gc3VicGFja2FnZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTE5MDgiPjE5MTkwODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBNaXNzaW5nIHN0cmlrZSB0aHJvdWdoIGZvciBkZXByZWNhdGVkIGRlY2xhcmF0aW9uIGZyYWdtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyMjg1Ij4xOTIyODU8L2E+CitbZm9ybWF0dGVyXSBKYXZhIHNvdXJjZSBmb3JtYXR0ZXIgbm90IHdvcmtpbmcgaWYgY2xhc3MgaGFzIGFubm90YXRpb24gb24gc2luZ2xlIGxpbmUgbXVsdGlwbGUgZmllbGRzIGRlY2xhcmF0aW9uLgorCis8aHI+Cis8cD5Gb3IgZWFybGllciBidWlsZCBub3RlcywgYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzNfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIj5idWlsZCBub3RlcyB1cCB0byBSZWxlYXNlIDMuMzwvYT4uPC9wPgorPGJyPgorICA8cD4KKyAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjaz91cmk9cmVmZXJlciI+PGltZworICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLWh0bWw0MDEiCisgICAgICAgIGFsdD0iVmFsaWQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4Ij48L2E+CisgIDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjM1X2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzNV9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5NzIwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzNV9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTAsMCArMSwyMjY2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDx0aXRsZT5KRFQvQ29yZSBSZWxlYXNlIE5vdGVzIDMuNTwvdGl0bGU+CisgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImpkdF9jb3JlX3N0eWxlLmNzcyIgY2hhcnNldD0iaXNvLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI3MiUiIGNsYXNzPSJ0aXRsZTEiPgorICAgICAgPGZvbnQgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMy41IHN0cmVhbTwvYj48L2ZvbnQ+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPjx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+PGZvbnQgc2l6ZT0iLTIiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD48L3RkPjwvdHI+CisgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICA8dHI+CisgIAk8dGQgY2xhc3M9InRpdGxlMyI+CisJICA8Zm9udCBzaXplPSItMSI+CisJICBIZXJlIGFyZSB0aGUgYnVpbGQgbm90ZXMgZm9yIHRoZSBFY2xpcHNlIEpEVC9Db3JlIHBsdWctaW4gcHJvamVjdAorCSAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9pbmRleC5waHAiPjxiPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9iPjwvYT4sCisJICBkZXNjcmliaW5nIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MiIHRhcmdldD1uZXc+YnVnPC9hPiByZXNvbHV0aW9uIGFuZCBzdWJzdGFudGlhbCBjaGFuZ2VzIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlIj48Yj5IRUFEPC9iPjwvYT4gYnJhbmNoLgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gMy41IHBsYW5uaW5nLCBwbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9yMy41L2luZGV4LnBocCNyZWxlYXNlLXBsYW4iPkpEVC9Db3JlIHJlbGVhc2UgcGxhbjwvYT4sCisJICB0aGUgbmV4dCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC9jb3JlL3IzLjUvaW5kZXgucGhwI21pbGVzdG9uZS1wbGFuIj5taWxlc3RvbmUgcGxhbjwvYT4sCisJICB0aGUgb3ZlcmFsbCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvZGV2ZWxvcG1lbnQvZWNsaXBzZV9wcm9qZWN0X3BsYW5fM181Lmh0bWwiPm9mZmljaWFsIHBsYW48L2E+LAorCSAgb3IgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9wbGF0Zm9ybS1yZWxlbmcvYnVpbGRTY2hlZHVsZS5odG1sIj5idWlsZCBzY2hlZHVsZTwvYT4uCisJICBUaGlzIHByZXNlbnQgZG9jdW1lbnQgY292ZXJzIGFsbCBjaGFuZ2VzIHNpbmNlIFJlbGVhc2UgMy40IChhbHNvIHNlZSBhIHN1bW1hcnkgb2YgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9BUElfY2hhbmdlcy5odG1sIj5BUEkgY2hhbmdlczwvYT4pLgorCSAgPGJyPk1haW50ZW5hbmNlIG9mIHByZXZpb3VzIHJlbGVhc2VzIG9mIEpEVC9Db3JlIGlzIHBlcmZvcm1lZCBpbiBwYXJhbGxlbCBicmFuY2hlczoKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzRfbWFpbnRlbmFuY2UiPlIzLjQueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18zX21haW50ZW5hbmNlIj5SMy4zLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfMl9tYWludGVuYW5jZSI+UjMuMi54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzFfbWFpbnRlbmFuY2UiPlIzLjEueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18wX21haW50ZW5hbmNlIj5SMy4wLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjJfMV9tYWludGVuYW5jZSI+UjIuMS54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIyXzBfMSI+UjIuMC54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPUVDTElQU0VfMV8wIj5SMS4wLng8L2E+LgorCSAgPC9mb250PgorCTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGEgbmFtZT0idl85NjMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNVJDMyAtIE1heSAyNywgMjAwOSAtIDMuNSBSQzMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTYzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk2MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorUmV2ZXJ0aW5nIGNoYW5nZSBmb3IgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjgxOCI+MjM2ODE4PC9hPi4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIG5hbWU9InZfOTYyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVSQzMgLSBNYXkgMjYsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTYyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk2MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDE5NCI+MjM0MTk0PC9hPgorUnVuIGNvcHlyaWdodCB0b29sCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3NjY5Ij4yNzc2Njk8L2E+CitJQmluZGluZy5nZXRKYXZhRWxlbWVudCgpIHJldHVybnMgJ251bGwnIHdoZXJlIGl0IHNob3VsZCBub3QKKworPGEgbmFtZT0idl85NjEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNVJDMiAtIE1heSAyMSwgMjAwOSAtIDMuNSBSQzIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTYxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk2MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NzM3MiI+Mjc3MzcyPC9hPgorWzEuNV1bY29tcGlsZXJdIFNpZ25hdHVyZSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgd2l0aCB0YXJnZXQganNyMTQKKworPGEgbmFtZT0idl85NjAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNVJDMiAtIE1heSAyMCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NjAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTYwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczOTkxIj4yNzM5OTE8L2E+CitbYXNzaXN0XSBXcm9uZyByZWxldmFuY2UgZm9yIHNvbWUgcHJvcG9zYWxzIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBleHBlY3RlZCB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2ODkwIj4yNzY4OTA8L2E+CitbY29udGVudCBhc3Npc3RdIHByb3Bvc2VzIG5vdGhpbmcgZm9yIGdlbmVyaWMgdHlwZSB3aXRoIG5vbi10cml2aWFsIGNvbnN0cnVjdG9yCisKKzxhIG5hbWU9InZfOTU5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVSQzEgLSBNYXkgMTQsIDIwMDkgLSAzLjUgUkMxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzk1OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85NTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzU0NzEiPjI3NTQ3MTwvYT4KK0VjbGlwc2UgQ29tcGlsZXIgbmVlZHMgYSBjb21waWxlIGRlcGVuZGVuY3kgdG8gYSBwbHVnLWluLCBidXQgamF2YWMgZG9lcyBub3QgbmVlZCB0aGF0IGRlcGVuZGVuY3kKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzAxOTciPjE3MDE5NzwvYT4KK1ttb2RlbF0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KC4uLCBJQ2xhc3NwYXRoQXR0cmlidXRlW10sIC4uKSBzaG91bGQgY2hlY2sgZm9yIG51bGwKKworPGEgbmFtZT0idl85NTgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNVJDMSAtIE1heSAxMiwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTU4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MzgxIj4yNzUzODE8L2E+CitbMS41XVtjb21waWxlcl0gTWlzc2luZyBpbm5lckNsYXNzIGF0dHJpYnV0ZSBmb3IgaW5uZXIgdHlwZXMgdXNlZCBhcyB0eXBlIGFyZ3VtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTc1MiI+MjU1NzUyPC9hPgorW2phdmFkb2NdW2Fzc2lzdF0gSW5hcHByb3ByaWF0ZSBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgamF2YWRvYyBhdCBjb21waWxhdGlvbiB1bml0IGxldmVsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDY3Ij4yNzU0Njc8L2E+CitCYXRjaCBjb21waWxlciB3cml0ZXMgbG9nIHVzaW5nIGRlZmF1bHQgZW5jb2RpbmcgaW5zdGVhZCBvZiBVVEYtOAorCis8YSBuYW1lPSJ2Xzk1NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41UkMxIC0gTWF5IDcsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTU3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk1NyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MzE1NyI+MjczMTU3PC9hPgorW3BlcmZvcm1hbmNlXSBNYW5pZmVzdEFuYWx5emVyIGlzIGNhdXNpbmcgYSAyeCBwZXJmb3JtYW5jZSBkcm9wIGluIHRoZSB1cGRhdGluZyBvZiBjbGFzc3BhdGggb2YgSmF2YVByb2plY3RzIGluIGNvbXBhcmlzb24gd2l0aCAzLjQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjg4NzkiPjI2ODg3OTwvYT4KK0V4dGVybmFsIGZvbGRlcnMgcHJvamVjdCBub3QgY2xlYW5lZCB1cAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTIxNSI+Mjc1MjE1PC9hPgorb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5LZXlUb1NpZ25hdHVyZSNjb25zdW1lVHlwZSgpIHVzZXMgYSBtZXRob2Qgbm90IGF2YWlsYWJsZSBpbiBKMlNFLTEuNCBFRQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTI0NCI+Mjc1MjQ0PC9hPgorb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRaaXBFbnRyeUJ5dGVDb250ZW50KFppcEVudHJ5LCBaaXBGaWxlKSBzaG91bGQgdXNlIEJ1ZmZlcmVkSW5wdXRTdHJlYW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI2NzkiPjEzMjY3OTwvYT4KK1thc3Npc3RdIENvbXBsZXRpb24gZmFpbHMgd2l0aGluIG5vbi1zdGF0aWMgYW5vbnltb3VzIGlubmVyIGNsYXNzCisKKzxhIG5hbWU9InZfOTU2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVSQzEgLSBNYXkgNiwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTU2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0MTE0Ij4yNzQxMTQ8L2E+CitvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudG9vbC5PcHRpb25zIG11c3QgYmUgdXBkYXRlZCB3aXRoIGxhdGVzdCBjb21waWxlciBvcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NDIyIj4xODU0MjI8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb3JyZWN0bHkgYWxsb3dzIGdlbmVyaWMgdXNlIG9mIHByaXZhdGUgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDkxNyI+Mjc0OTE3PC9hPgorSW5jb3JyZWN0ICZxdW90O2VtcHR5IGJsb2NrJnF1b3Q7IHdhcm5pbmcgdW5kZXJsaW5pbmcgb24gYW5ub3RhdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ1NTciPjI3NDU1NzwvYT4KK0NvbXBsZXRpb25Db250ZXh0IHByb2JsZW0gd2l0aCBhbm5vdGF0aW9uIHZhbHVlIGVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQzMzIiPjI3NDMzMjwvYT4KK2pkdC5jb3JlLm1vZGVsIHRlc3RzIHRha2UgMiBob3VycyB0byBmaW5pc2ggb24gdGhlIG1hYworCis8YSBuYW1lPSJ2Xzk1NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBBcHJpbCAyOSwgMjAwOSAtIDMuNSBNSUxFU1RPTkUgNworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTU1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0Mzk3Ij4yNzQzOTc8L2E+Cit0YWcgcHJvamVjdHMgY2hhbmdlZCBzaW5jZSBJMjAwOTA0MjEtMDkzMCBidWlsZAorCis8YSBuYW1lPSJ2Xzk1NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBBcHJpbCAyOCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTU0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY5OTM0Ij4yNjk5MzQ8L2E+CitbYXB0XSBBUFQtZ2VuZXJhdGVkIGNsYXNzZXMgdGhhdCBjb250YWluIGFubm90YXRpb25zIGNhdXNlcyBOUEUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTk5NTAiPjI1OTk1MDwvYT4KK1VwZGF0ZSBjb3B5cmlnaHQgZm9yIDIwMDkKKworPGEgbmFtZT0idl85NTMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU03IC0gQXByaWwgMjcsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTUzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk1MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjIwNCI+MjcyMjA0PC9hPgorbnVsbCBzaG91bGQgbmV2ZXIgYmUgcGFydCBvZiBhIHR5cGUgaGllcmFyY2h5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwMDMxIj4yNjAwMzE8L2E+CitXcm9uZyB0eXBlIGZvciBjbGFzcyBjb25zdGFudHMgaW4gc3RhY2ttYXAgZnJhbWVzCisgCis8YSBuYW1lPSJ2Xzk1MiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBBcHJpbCAyNywgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTUyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczODYyIj4yNzM4NjI8L2E+CitbMS43XVtjb21waWxlcl0gUmV0dXJuIHR5cGUgc2hvdWxkIGJlIHVzZWQgdG8gZGVjaWRlIG1ldGhvZCBkdXBsaWNhdGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ3MjAiPjg0NzIwPC9hPgorWzEuNV1bYXNzaXN0XSBwcm9wb3NhbCByYW5raW5nIGJ5IHJldHVybiB2YWx1ZSBzaG91bGQgY29uc2lkZXIgYXV0byh1bilib3hpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzI3MTEiPjI3MjcxMTwvYT4KK0V4Y2VwdGlvbnMgaW4gQVNUUmV3cml0ZQorCis8YSBuYW1lPSJ2Xzk1MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBBcHJpbCAyNCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTUxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczMzA4Ij4yNzMzMDg8L2E+CitbcGVyZnNdIFNhdmUgdmVyeSBzbG93IGJlY2F1c2UgRGVsdGFQcm9jZXNzb3IjcmVzb3VyY2VDaGFuZ2VkKC4uKSByZXNvbHZlcyBjbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ4MjMiPjE1NDgyMzwvYT4KK1tnZXR0ZXIgc2V0dGVyXSBHZXR0ZXJzIFNldHRlcnMgZ2VuZXJhdGlvbiBkb2Vzbid0IGZvbGxvdyBuYW1pbmcgY29udmVudGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2Mzc4NiI+MjYzNzg2PC9hPgorTmFtaW5nQ29udmVudGlvbnMjc3VnZ2VzdFZhcmlhYmxlTmFtZXMoLi4pIHNob3VsZCBub3QgbW9kaWZ5IGFsbCBjYXBzIHBhcnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYzNzY5Ij4yNjM3Njk8L2E+CitKYXZhZG9jIGdsaXRjaGVzIGluIEphdmFDb3JlI3NldENvbXBsaWFuY2VPcHRpb25zKFN0cmluZywgTWFwKQorCis8YSBuYW1lPSJ2Xzk1MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBBcHJpbCAyMSwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NTAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTUwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NzcxIj4yNjY3NzE8L2E+CitOYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnQgcmV0dXJucyB2ZXJ5IGluY29ycmVjdCBwYWNrYWdlIGZyYWdtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTEwMiI+MjcxMTAyPC9hPgorSmF2YSBtb2RlbCBjb3JydXB0IGFmdGVyIHN3aXRjaGluZyB0YXJnZXQgcGxhdGZvcm0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA3ODQiPjI3MDc4NDwvYT4KK1twZXJmc10gQmlnIHJlZ3Jlc3Npb24gb24gRnVsbFNvdXJjZVdvcmtzcGFjZU1vZGVsVGVzdHMjdGVzdENsb3NlUHJvamVjdHMoKSB0ZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyNDUwIj4yNzI0NTA8L2E+CitEQkNTMy41OiBDbGFzc3BhdGggcmVzb2x1dGlvbiBmYWlscyB0byBob25vciB0aGUgJ0NsYXNzLVBhdGgnIGhlYWRlciBvZiBKQVIgbWFuaWZlc3QgZmlsZSBpbiBEQkNTCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyNzA2Ij4yNzI3MDY8L2E+CitbTW9kZWxdIEdlbmVyaWNzIGxvc3Qgb24gSUZpZWxkIHdoZW4gY29taW5nIGZyb20gLmNsYXNzIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2ODMyIj4yNDY4MzI8L2E+CitbMS41XVthc3Npc3RdIENhbWVsIGNhc2UgY29tcGxldGlvbiBub3Qgd29ya2luZyB3aXRoIHN0YXRpY2FsbHkgaW1wb3J0ZWQgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzgzMyI+MjY3ODMzPC9hPgorW2phdmFkb2NdIEN1c3RvbSB0YWdzIHNob3VsZCBub3QgYmUgYWxsb3dlZCBmb3IgaW5saW5lIHRhZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzE2ODAiPjI3MTY4MDwvYT4KK1tjb21waWxlcl0gU3RhY2sgb3ZlcmZsb3cgcGFzdGluZyBpbiBKYXZhIGVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTgyNyI+MjUxODI3PC9hPgorW3NlYXJjaF0gU2VhcmNoIGZvciB0eXBlIHJlZmVyZW5jZSB3aXRoIHdpbGRjYXJkcyBmaW5kcyByZWZlcmVuY2VzIGluIHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzEyODQiPjI3MTI4NDwvYT4KK1tzZWFyY2hdIEFJT09CRSBpbiBTdHJpbmdPcGVyYXRpb24uZ2V0Q2FtZWxDYXNlTWF0Y2hpbmdSZWdpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyMTQ4Ij4yNzIxNDg8L2E+CitbYXNzaXN0XSBDb25zdHJ1Y3RvcnMgd2l0aCBhbiBhcnJheSBhcyBwYXJhbWV0ZXIgdHlwZSBhcmUgbm90IHByb3Bvc2VkCisKKzxhIG5hbWU9InZfOTQ5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNyAtIEFwcmlsIDE0LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzk0OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85NDkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzE1NjEiPjI3MTU2MTwvYT4KK0phdmFNb2RlbEV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZyBhbiBhcnJheSBvZiBuZXN0ZWQgYW5ub3RhdGlvbnMKKworPGEgbmFtZT0idl85NDgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU03IC0gQXByaWwgNywgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NDgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTQ4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcxMzAzIj4yNzEzMDM8L2E+CitbMS41XVtjb21waWxlcl0gT3ZlcnJpZGUgYW5kIHBhY2thZ2UgdmlzaWJpbGl0eSBpc3N1ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDM2NyI+MjcwMzY3PC9hPgorW0RPTV0gTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUGFyZW50aGVzaXplZEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTMwMDgiPjI1MzAwODwvYT4KK1thc3Npc3RdIEJvb2xlYW4gZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHByb3Bvc2VkIHdpdGggaGlnaGVyIHJlbGV2ZW5jZSBpbiBpZigpLCB3aGlsZSgpIGV0YworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDk4MyI+MjcwOTgzPC9hPgorW2Zvcm1hdHRlcl0gRW51bSB3aXRoIGZpZWxkIGRlY2xhcmF0aW9ucyBidXQgbm8gY29uc3RhbnRzIGNvbmZ1c2VzIGZvcm1hdHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTg1MSI+MTU5ODUxPC9hPgorWzEuNV0gW2NvbXBpbGVyXSBFY2xpcHNlIGNvbXBpbGVyIGZhaWxzIHRvIHJlcG9ydCB0eXBlIHBhcmFtZXRlciBib3VuZHMgZXJyb3JzIHdoZW4gZ2VuZXJpYyBpbnN0YW5jZSBpcyBhIHR5cGUgYXJndW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA0NDYiPjI3MDQ0NjwvYT4KKyZxdW90O0NvbXB1dGUgbGF1bmNoIGJ1dHRvbiB0b29sdGlwJnF1b3Q7IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwMTQ4Ij4yNzAxNDg8L2E+CitBU1RQYXJzZXIgY2Fubm90IHBhcnNlIEtfQ0xBU1NfQk9EWV9ERUNMQVJBVElPTlMgd2l0aCBzeW50YXggZXJyb3JzCisKKzxhIG5hbWU9InZfOTQ3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNyAtIE1hcmNoIDMxLCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzk0NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85NDciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA0MDkiPjI3MDQwOTwvYT4KK1twZXJmc10gTm8gSkRUL0NvcmUgdGVzdHMgcmVzdWx0cyBpbiBsYXN0IGJhc2VsaW5lIHJ1bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzY3MCI+MjY3NjcwPC9hPgorUHJpdmF0ZSBlbnVtIGNvbnN0YW50IGluY29ycmVjdGx5IG1hcmtlZCBhcyBuZXZlciByZWFkIGxvY2FsbHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjk0OTMiPjI2OTQ5MzwvYT4KK1thc3Npc3RdIEtleXdvcmRzIGFyZSBub3QgcHJvcG9zZWQgaW4gYSBmb3Igc3RhdGVtZW50IHdpdGhvdXQgYmxvY2sKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzAxOTQiPjI3MDE5NDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBKYXZhIGVycm9yIGluIDMuNU02IHRoYXQgd2FzIG5vdCBwcmVzZW50IGluIDMuNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDI1NyI+MjcwMjU3PC9hPgorW3BlcmZzXSBTbWFsbCByZWdyZXNzaW9uIG9uICdKRFQvQ29yZSBwbHVnaW4gaW5pdGlhbGl6YXRpb24nIHRlc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzAxMTMiPjI3MDExMzwvYT4KK1tjb2RlIGFzc2lzdF0gTWlzc2luZyBBTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiBwcm9wb3NhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTk4NSI+MjY5OTg1PC9hPgorRnVsbCBCdWlsZCB0cmlnZ2VyZWQgd2hlbiB1c2luZyBjbGFzcyBmb2xkZXIgb24gY2xhc3NwYXRoIGFuZCBjdXN0b20gYnVpbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzkzNSI+MjA3OTM1PC9hPgorWzEuNV1bY29tcGlsZXJdIGluY29uc2lzdGVuY3kgd2l0aCBqYXZhYyAxLjUmYW1wOzEuNiBpbnZvbHZpbmcgcGFyYW1ldGVyaXplZCBpbnZvY2F0aW9uIG9mIG5vbi1nZW5lcmljIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTk2NCI+MjY5OTY0PC9hPgorW3BlcmZzXSBSZWdyZXNzaW9uIG9uICdTZWFyY2ggYWxsIHR5cGUgbmFtZXMnIHRlc3QKKworPGEgbmFtZT0idl85NDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU03IC0gTWFyY2ggMjQsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTQ2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk0NiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzAzNyI+MjQ3MDM3PC9hPgorW2phdmFkb2NdIGNvbXBpbGVyIHNob3VsZCBpc3N1ZSB3YXJuaW5nIGZvciB7QGluaGVyaXREb2N9IGF0IGlsbGVnYWwgbG9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0MDYiPjI0NDQwNjwvYT4KK1tidWlsZHBhdGhdIEludGVybmFsIGphcnMgcmVmZXJlZCB3aXRoIE9TIHBhdGggYXJlIHNob3duIGFzIG5vbi1KYXZhIHJlc291cmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTQ3NiI+MjY5NDc2PC9hPgordGVzdEluaXRKRFRQbHVnaW4oKSBzZWVtcyB0byBsZWFrIHNldmVyYWwgRGVsdGFQcm9jZXNzb3IgYW5kIEphdmFNb2RlbE1hbmFnZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjkzMzYiPjI2OTMzNjwvYT4KK1twcmVmc10gSmF2YVByb2plY3QgcHJlZmVyZW5jZXMgbGlzdGVuZXJzIGFyZSBub3QgcmVtb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzA2MCI+MjAzMDYwPC9hPgorW2NvZGVhc3Npc3RdIGFzc2VydCBrZXl3b3JkIHNob3VsZCBub3QgYmUgcHJvcG9zZWQgd2hlbiBjb21wbGlhbmNlIGxldmVsIGlzIHNldCB0byAxLjMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTE1MzkiPjI1MTUzOTwvYT4KK1sxLjZdW2NvbXBpbGVyXSBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiBpbmZvIGNhbm5vdCBiZSBudWxsIChTdGFja01hcEZyYW1lLmphdmEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4ODM3Ij4yNjg4Mzc8L2E+CitbMS42XVtjb21waWxlcl0gSW5jb3JyZWN0bHkgcmVwb3J0IGFtYmlndWl0eSBvZiBtZXRob2RzIHdpdGggZ2VuZXJpY3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjUxMDQiPjI2NTEwNDwvYT4KK1JlY29uY2lsZXIgY2Fubm90IGhhbmRsZSBhbm5vdGF0aW9uIHdpdGggcmVmZXJlbmNlIHRvIG1pc3NpbmcgdHlwZQorCis8YSBuYW1lPSJ2Xzk0NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTcgLSBNYXJjaCAxNywgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NDUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTQ1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3Nzg5Ij4yNjc3ODk8L2E+CitlY2xpcHNlLUF1dG9tYXRlZC1UZXN0cy0zLjQuemlwIHByb2R1Y2VzIGNvbXBpbGUgZXJyb3JzIChidWlsZCBwYXRoPykgd2l0aCBJQk0gSkRLCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4ODAyIj4yNjg4MDI8L2E+CitVc2VsZXNzIGNhbGwgdG8gZ2V0U291cmNlKCkgaW4gU291cmNlVHlwZUNvbnZlcnRlcgorCis8YSBuYW1lPSJ2Xzk0NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTYgLSBNYXJjaCAxMCwgMjAwOSAtIDMuNSBNSUxFU1RPTkUgNgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NDQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTQ0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3OTQxIj4yNjc5NDE8L2E+CitbcGVyZnNdIFBvc3NpYmxlIHJlZ3Jlc3Npb24gb24gJ0NvZGUgYXNzaXN0IGluIGV4cHJlc3Npb24nIHRlc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc3NzMiPjI2Nzc3MzwvYT4KK1tvcGVuIHR5cGVdIFVzZSBvZiA/IHJlc3VsdHMgaW4gZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc2NTgiPjI2NzY1ODwvYT4KK1tmb3JtYXR0ZXJdIEphdmFkb2MgY29tbWVudHMgbWF5IGJlIHN0aWxsIGZvcm1hdHRlZCBhcyBibG9jayBjb21tZW50cworCis8YSBuYW1lPSJ2Xzk0MyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTYgLSBNYXJjaCA5LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2Xzk0MworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85NDMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ2NDYiPjEyNDY0NjwvYT4KK0Nvbm5lY3RpbmcgdHlwZSBwYXJhbWV0ZXIgZmFpbHMgZm9yIGxvY2FsIHR5cGVzCisKKzxhIG5hbWU9InZfOTQyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNiAtIE1hcmNoIDcsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTQyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk0MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIHRoZSBmb2xsb3dpbmcgQVBJcyB0byBhbGxvdyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHNvdXJjZSBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBwYWNrYWdlIHRoYXQgaXMgbmVpdGhlciBvbiB0aGUgCisgICAgICAgY2xhc3NwYXRoIG5vciBpbiBhIHdvcmtpbmcgY29weS4KKyAgICAgICA8dWw+CisgICAgICAgPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXIuZmluZFNvdXJjZShTdHJpbmcsIFN0cmluZyk8L2NvZGU+PC9saT4KKyAgICAgICA8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lci5pc1BhY2thZ2UoU3RyaW5nW10pPC9jb2RlPjwvbGk+CisgICAgICAgPC91bD4KKyAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3NTI4Ij5idWcgMjU3NTI4PC9hPiBmb3IgZGV0YWlscy4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzA4OCI+MjY3MDg4PC9hPgorWzEuNV1bY29tcGlsZXJdIE1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGluaGVyaXRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwODQwIj4yNjA4NDA8L2E+CitOYW1pbmdDb252ZW50aW9ucyBjcmVhdGVzIHdyb25nIHBsdXJhbCBmb3IgbmFtZSBlbmRpbmcgaW4gJmx0O3Zvd2VsJmd0O3kKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM0MDYiPjI0MzQwNjwvYT4KK1tjb2RlIGFzc2lzdF0gQ29udGVudCBhc3Npc3QgZ2l2ZXMgJnF1b3Q7YXNzZXJ0aW9uIGZhaWxlZCZxdW90OyBmb3IgaW1wb3J0IEZvb3wuQmFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3MjQxIj4yMzcyNDE8L2E+CitDb250ZW50IGFzc2lzdCBkb2VzIG5vdCBzY2FsZSB3aXRoIGphdmFkb2Mgb24gdHlwZSB3aXRoIG1hbnkgbWVtYmVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NTk2MiI+MjY1OTYyPC9hPgorW2NvbXBpbGVyXSBJbnRlcm5hbCBjb21waWxlciBlcnJvciBvbiB3aGlsZSB3aXRoIHJldHVybiBjbGF1c2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzY1MjAiPjIzNjUyMDwvYT4KK1tzZWFyY2hdIEFJT09CRSBpbiBQYXR0ZXJuTG9jYXRvci51cGRhdGVNYXRjaAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NTEwMyI+MjY1MTAzPC9hPgorTWFuaWZlc3QgQ2xhc3MtUGF0aCBpcyBub3QgcmVhZCBjb3JyZWN0bHkgd2l0aCBFQ0oKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTM5OSI+OTkzOTk8L2E+CitbMS41XVthc3Npc3RdIENvZGUgYXNzaXN0IHByb3Bvc2UgZmluYWwgY2xhc3NlcyBpbiBtZXRob2RzIHR5cGUgcGFyYW1ldGVyIGV4dGVuZHMgY2xhdXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3NTI4Ij4yNTc1Mjg8L2E+CitBbiBBUEkgdG8gaW5jcmVtZW50YWx5IGdlbmVyYXRlIGNvbXBpbGF0aW9uIHVuaXRzIGZvciBiaW5kaW5nIHJlc29sdXRpb24gZW52aXJvbm1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjY1ODIiPjI2NjU4MjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBBYm9ydENvbXBpbGF0aW9uIHdoaWxlIGRlY29kaW5nIHRoZSB0eXBlIHZhcmlhYmxlIG9mIGFuIGFub255bW91cyB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2ODM3Ij4yNjY4Mzc8L2E+CitbbW9kZWxdIFNvdXJjZUZpZWxkLmdldENvbnN0YW50IGRvZXMgbm90IHN1cHBseSBhIHZhbHVlIGlmIHR5cGUgaXMgZnVsbHkgcXVhbGlmaWVkCisKKzxhIG5hbWU9InZfOTQxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNiAtIE1hcmNoIDMsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTQxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12Xzk0MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjQ0MiI+MjUyNDQyPC9hPgorW1NlYXJjaF0gTlBFIGFmdGVyIG1vdmUgZm9sbG93ZWQgYnkgdW5kbworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTcyMiI+MjYxNzIyPC9hPgorW3NlYXJjaF0gTlBFIGFmdGVyIHJlbW92aW5nIGEgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NjQyMSI+MjY2NDIxPC9hPgorWzEuNV1bY29tcGlsZXJdIGNvZGUgY29tcGlsZXMgY29ycmVjdGx5IGluIDMuNC4xIGJ1dCBnaXZlcyBjb21waWxhdGlvbiBlcnJvcnMgaW4gMy41TTUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjAwMTEiPjI2MDAxMTwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdHRpbmcgb2YgaHRtbCBpbiBqYXZhZG9jIGNvbW1lbnRzIGRvZXNuJ3Qgd29yayB3aXRoIHN0eWxlIGF0dHJpYnV0ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTcxMDgiPjIxNzEwODwvYT4KK1tmb3JtYXR0ZXJdIGRlbGV0ZXMgYmxhbmsgbGluZXMgYmV0d2VlbiBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODk2MyI+MTk4OTYzPC9hPgorW2Zvcm1hdHRlcl0gMy4zIENvZGUgRm9ybWF0dGVyIHJlcGVhdGVkbHkgaW5kZW50cyBibG9jayBjb21tZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NTcxIj4yNjU1NzE8L2E+CitBYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBub3QgZGlyZWN0bHkgdXNlZCBpcyBmbGFnZ2VkIGFzIHVudXNlZAorCis8YSBuYW1lPSJ2Xzk0MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTYgLSBGZWJydWFyeSAyNCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85NDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTQwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Rml4ZWQgb2RkIEFQSSBpbiA8Y29kZT5SZWZlcmVuY2VNYXRjaDwvY29kZT48YnI+Cisoc2VlIG1vcmUgZGV0YWlscyBpbiBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4ODc4Ij4yNDg4Nzg8L2E+KS4KKzwvbGk+Cis8L3VsPgorCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY1ODIwIj4yNjU4MjA8L2E+CitVbnVzZWQgbWV0aG9kcyBpbnNpZGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZUFuYWx5emVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMzU2Ij4yMzMzNTY8L2E+Citbc2VhcmNoXSBOUEUgaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU2ltcGxlTG9va3VwVGFibGUuZ2V0KCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjU2MzAiPjI2NTYzMDwvYT4KK1tzZWFyY2hdW3BlcmZzXSBSZWdyZXNzaW9uIGluIHRlc3RTZWFyY2hQYWNrYWdlRGVjbGFyYXRpb25zV29ya3NwYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4ODc4Ij4yNDg4Nzg8L2E+Citbc2VhcmNoXSBPZGQgQVBJIGluIFJlZmVyZW5jZU1hdGNoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2OTMwIj4yMDY5MzA8L2E+CitbMS41XVtjb21waWxlcl0gTWlzbWF0Y2ggYmV0d2VlbiBqYXZhYyBhbmQgRWNsaXBzZSBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NTE0MiI+MjY1MTQyPC9hPgorQ29tcGlsZXIgZmFpbHMgdG8gd2FybiBvbiB1bnVzZWQgY29uc3RydWN0b3JzIG9mIHByaXZhdGUgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDk1MCI+MjY0OTUwPC9hPgorW3NjYW5uZXJdIElTY2FubmVyIGRvZXMgbm90IHJldHVybiB3aGl0ZXNwYWNlIHRva2VuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0ODQzIj4yNjQ4NDM8L2E+CitbMS41XVtjb21waWxlcl0gRWNsaXBzZSBjb21waWxlciBmYWlscyB0byByZWplY3QgaW52YWxpZCBjb2RlIHdpdGggcHJpbWl0aXZlcyBhdXRvYm94ZWQgdG8gZ2VuZXJpY3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjUwNjUiPjI2NTA2NTwvYT4KK1tzZWFyY2hdIGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24gd2hpbGUgcnVubmluZyAmcXVvdDtSZWZhY3Rvci4uLkV4dHJhY3QgQ2xhc3MmcXVvdDsKKworPGEgbmFtZT0idl85MzkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU02IC0gRmVicnVhcnkgMTcsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTM5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkzOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgbmV3IEFQSSBtZXRob2Qgb24gPGNvZGU+U2VhcmNoUGF0dGVybjwvY29kZT4gdG8gcHJvdmlkZSBtYXRjaGluZworcmVnaW9ucyBiZXR3ZWVuIGEgcGF0dGVybiBhbmQgYSBuYW1lIHdoZW4gdGhleSBhcmUgY29tcGFyZWQgdXNpbmcgYSBnaXZlbiBtYXRjaCBydWxlPGJyPgorKHNlZSBtb3JlIGRldGFpbHMgaW4gYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODYwNSI+MjE4NjA1PC9hPikuCis8cHJlPgorLyoqCisgKiBBbnN3ZXJzIGFsbCB0aGUgcmVnaW9ucyBpbiBhIGdpdmVuIG5hbWUgbWF0Y2hpbmcgYSBnaXZlbiBwYXR0ZXJuIHVzaW5nCisgKiBhIHNwZWNpZmllZCBtYXRjaCBydWxlLgorICogCisgKiBFYWNoIG9mIHRoZXNlIHJlZ2lvbnMgaXMgbWFkZSBvZiBpdHMgc3RhcnRpbmcgaW5kZXggYW5kIGl0cyBsZW5ndGggaW4gdGhlIGdpdmVuCisgKiBuYW1lLiBUaGV5IGFyZSBhbGwgY29uY2F0ZW5hdGVkIGluIGEgc2luZ2xlIGFycmF5IG9mIDxjb2RlPmludDwvY29kZT4KKyAqIHdoaWNoIHRoZXJlZm9yZSBhbHdheXMgaGFzIGFuIGV2ZW4gbGVuZ3RoLgorICogCisgKiBBbGwgcmV0dXJuZWQgcmVnaW9ucyBhcmUgZGlzam9pbnRlZCBmcm9tIGVhY2ggb3RoZXIuIFRoYXQgbWVhbnMgdGhhdCB0aGUgZW5kCisgKiBvZiBhIHJlZ2lvbiBpcyBhbHdheXMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgb25lLgorICogRm9yIGV4YW1wbGUsIGlmIHR3byByZWdpb25zIGFyZSByZXR1cm5lZDoKKyAqIDxjb2RlPnsgc3RhcnQxLCBsZW5ndGgxLCBzdGFydDIsIGxlbmd0aDIgfTwvY29kZT4KKyAqIHRoZW4gPGNvZGU+c3RhcnQxK2xlbmd0aDE8L2NvZGU+IHdpbGwgYWx3YXlzIGJlIHNtYWxsZXIgdGhhbgorICogPGNvZGU+c3RhcnQyPC9jb2RlPi4KKyAqIAorICogVGhlIHBvc3NpYmxlIGNvbXBhcmlzb24gcnVsZXMgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIHBhdHRlcm4gYXJlOgorICogICAgIC4ge0BsaW5rICNSX0VYQUNUX01BVENIIGV4YWN0IG1hdGNoaW5nfQorICogICAgIC4ge0BsaW5rICNSX1BSRUZJWF9NQVRDSCBwcmVmaXggbWF0Y2hpbmd9CisgKiAgICAgLiB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSCBwYXR0ZXJuIG1hdGNoaW5nfQorICogICAgIC4ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSCBjYW1lbCBjYXNlIG1hdGNoaW5nfQorICogICAgIC4ge0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0ggY2FtZWwgY2FzZSBtYXRjaGluZyB3aXRoIHNhbWUgcGFydHMgY291bnR9CisgKgorICogRWFjaCBvZiB0aGVzZSBydWxlcyBtYXkgYmUgY29tYmluZWQgd2l0aCB0aGUKKyAqIHtAbGluayAjUl9DQVNFX1NFTlNJVElWRSBjYXNlIHNlbnNpdGl2ZSBmbGFnfSBpZiB0aGUgbWF0Y2ggY29tcGFyaXNvbgorICogc2hvdWxkIHJlc3BlY3QgdGhlIGNhc2UuCisgKgorICogRXhhbXBsZXM6CisgKiAgICAuICAgcGF0dGVybiA9ICJOUEUiCisgKiAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uIC8gTm9QZXJtaXNzaW9uRXhjZXB0aW9uCisgKiAgICAgICAgbWF0Y2hSdWxlID0ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0KKyAqICAgICAgICByZXN1bHQ6ICB7IDAsIDEsIDQsIDEsIDExLCAxIH0gLyB7IDAsIDEsIDIsIDEsIDEyLCAxIH0gCisgKiAgICAgLiAgcGF0dGVybiA9ICJOdVBvRXgiCisgKiAgICAgICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgICAgICAgbWF0Y2hSdWxlID0ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0KKyAqICAgICAgICByZXN1bHQ6ICB7IDAsIDIsIDQsIDIsIDExLCAyIH0KKyAqICAgICAuICBwYXR0ZXJuID0gIklQTDMiCisgKiAgICAgICAgbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiCisgKiAgICAgICAgbWF0Y2hSdWxlID0ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0KKyAqICAgICAgICByZXN1bHQ6ICB7IDAsIDIsIDEyLCAxLCAyMCwgMSB9CisgKiAgICAgLiAgcGF0dGVybiA9ICJIYXNoTUUiCisgKiAgICAgICAgbmFtZSA9ICJIYXNoTWFwRW50cnkiCisgKiAgICAgICAgbWF0Y2hSdWxlID0ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0KKyAqICAgICAgICByZXN1bHQ6ICB7IDAsIDUsIDcsIDEgfQorICogICAgIC4gIHBhdHRlcm4gPSAiTj8/P1BvKkV4P2VwdGlvbiIKKyAqICAgICAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAqICAgICAgICBtYXRjaFJ1bGUgPSB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9CisgKiAgICAgICAgcmVzdWx0OiAgeyAwLCAxLCA0LCAyLCAxMSwgMiwgMTQsIDYgfQorICogICAgIC4gIHBhdHRlcm4gPSAiSGEqTSplbnQqIgorICogICAgICAgIG5hbWUgPSAiSGFzaE1hcEVudHJ5IgorICogICAgICAgIG1hdGNoUnVsZSA9IHtAbGluayAjUl9QQVRURVJOX01BVENIfQorICogICAgICAgIHJlc3VsdDogIHsgMCwgMiwgNCwgMSwgNywgMyB9CisgKiAKKyAqIEBzZWUgI2NhbWVsQ2FzZU1hdGNoKFN0cmluZywgU3RyaW5nLCBib29sZWFuKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQorICogCWNhbWVsIGNhc2UgYmVoYXZpb3IKKyAqIEBzZWUgQ2hhck9wZXJhdGlvbiNtYXRjaChjaGFyW10sIGNoYXJbXSwgYm9vbGVhbikgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKKyAqIAlwYXR0ZXJuIG1hdGNoIGJlaGF2aW9yCisgKgorICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4uIElmIDxjb2RlPm51bGw8L2NvZGU+LAorICogICAgIHRoZW4gYW4gZW1wdHkgcmVnaW9uICg8Y29kZT5uZXcgaW50WzBdPC9jb2RlPikgd2lsbCBiZSByZXR1cm5lZAorICogICAgIHNob3dpbmcgdGhhdCB0aGUgbmFtZSBtYXRjaGVzIHRoZSBwYXR0ZXJuIGJ1dCBubyBjb21tb24KKyAqICAgICBjaGFyYWN0ZXIgaGFzIGJlZW4gZm91bmQuCisgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorICogQHBhcmFtIG1hdGNoUnVsZSB0aGUgcnVsZSB0byBhcHBseSBmb3IgdGhlIGNvbXBhcmlzb24uCisgKiAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGFjY2VwdGVkOgorICogICAgICAgICAuIHtAbGluayAjUl9FWEFDVF9NQVRDSH0KKyAqICAgICAgICAgLiB7QGxpbmsgI1JfUFJFRklYX01BVENIfQorICogICAgICAgICAuIHtAbGluayAjUl9QQVRURVJOX01BVENIfQorICogICAgICAgICAuIHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9CisgKiAgICAgICAgIC4ge0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9CisgKiAKKyAqICAgICBFYWNoIG9mIHRoZXNlIHZhbGlkIHZhbHVlcyBtYXkgYmUgYWxzbyBjb21iaW5lZCB3aXRoCisgKiAgICAgdGhlIHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX0gZmxhZy4KKyAqIAorICogICAgIFNvbWUgZXhhbXBsZXM6CisgKiAgICAgICAgIC4ge0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX06CisgKiAgICAgICAgICAgaWYgYW4gZXhhY3QgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgZXhwZWN0ZWQsCisgKiAgICAgICAgIC4ge0BsaW5rICNSX1BSRUZJWF9NQVRDSH06CisgKiAgICAgICAgICAgaWYgYSBjYXNlIGluc2Vuc2l0aXZlIHByZWZpeCBtYXRjaCBpcyBleHBlY3RlZCwKKyAqICAgICAgICAgLiB7QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfToKKyAqICAgICAgICAgICBpZiBhIGNhc2UgaW5zZW5zaXRpdmUgY2FtZWwgY2FzZSBtYXRjaCBpcyBleHBlY3RlZCwKKyAqICAgICAgICAgLiB7QGxpbmsgI1JfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSH0KKyAqICAgICAgICAgICAgfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9OgorICogICAgICAgICAgIGlmIGEgY2FzZSBzZW5zaXRpdmUgY2FtZWwgY2FzZSB3aXRoIHNhbWUgcGFydHMgY291bnQgbWF0Y2gKKyAqICAgICAgICAgICBpcyBleHBlY3RlZCwKKyAqICAgICAgICAgLiBldGMuCisgKiAKKyAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+aW50PC9jb2RlPiBoYXZpbmcgdHdvIHNsb3RzIHBlciByZXR1cm5lZAorICogICAgIHJlZ2lvbnMgKHRoZSBmaXJzdCBvbmUgaXMgdGhlIHJlZ2lvbiBzdGFydGluZyBpbmRleCBhbmQgdGhlIHNlY29uZCBvbmUKKyAqICAgICBpcyB0aGUgcmVnaW9uIGxlbmd0aCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdAorICogICAgIG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuKS4KKyAqCisgKiAgICAgVGhlIHJldHVybmVkIHJlZ2lvbnMgbWF5IGJlIGVtcHR5ICg8Y29kZT5uZXcgaW50WzBdPC9jb2RlPikgaWYgdGhlCisgKiAgICAgcGF0dGVybiBpcyA8Y29kZT5udWxsPC9jb2RlPiAod2hhdGV2ZXIgdGhlIG1hdGNoIHJ1bGUgaXMpLiBUaGUgcmV0dXJuZWQKKyAqICAgICByZWdpb25zIHdpbGwgYWxzbyBiZSBlbXB0eSBpZiB0aGUgcGF0dGVybiBpcyBvbmx5IG1hZGUgb2YgPGNvZGU+Jz8nPC9jb2RlPgorICogICAgIGFuZC9vciA8Y29kZT4nKic8L2NvZGU+IGNoYXJhY3RlcihzKSAoZS5nLiA8Y29kZT4nKic8L2NvZGU+LAorICogICAgIDxjb2RlPic/Kic8L2NvZGU+LCA8Y29kZT4nPz8/JzwvY29kZT4sIGV0Yy4pIHdoZW4gdXNpbmcgYSBwYXR0ZXJuCisgKiAgICAgbWF0Y2ggcnVsZS4KKyAqIAorICogQHNpbmNlIDMuNQorICovCis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDk5MSI+MjY0OTkxPC9hPgorV3JvbmcgJ3VudXNlZCcgcHJvYmxlbSByZXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzc0MiI+MjM3NzQyPC9hPgorW2phdmFkb2NdIEphdmFkb2MgdGFnIG5hbWUgdmFsaWRhdGlvbiBpcyBpbmNvcnJlY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjQ4NDMiPjI2NDg0MzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIGNvbXBpbGVyIGZhaWxzIHRvIHJlamVjdCBpbnZhbGlkIGNvZGUgd2l0aCBwcmltaXRpdmVzIGF1dG9ib3hlZCB0byBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDg4MSI+MjY0ODgxPC9hPgorWzEuNV1bY29tcGlsZXJdSW5jb3JyZWN0IHVuY2hlY2tlZCBjb252ZXJzaW9uIHdhcm5pbmdzIGZvciByZXR1cm4gdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE5MTIiPjIwMTkxMjwvYT4KK1tjb21waWxlcl0gVW51c2VkIHB1YmxpYyBtZW1iZXJzIG9mIHByaXZhdGUgY2xhc3NlcyBub3QgZmxhZ2dlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDgxNyI+MjY0ODE3PC9hPgorW3NlYXJjaF0gJmx0O2NoYXImZ3Q7ICsgKiByZXR1cm5zICdudWxsJyBmcm9tIFNlYXJjaFBhdHRlcm4uZ2V0TWF0Y2hpbmdSZWdpb25zKFN0cmluZywgU3RyaW5nLCBpbnQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0ODE2Ij4yNjQ4MTY8L2E+Citbc2VhcmNoXSBBSU9PQkUgaW4gU3RyaW5nT3BlcmF0aW9uLmdldFBhdHRlcm5NYXRjaGluZ1JlZ2lvbnMoLi4pIHdpdGggcGF0dGVybiAmcXVvdDs/KiZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDQ1NCI+MjUwNDU0PC9hPgorW3NlYXJjaF0gQ2Fubm90IGZpbmQgbWV0aG9kIHJlZmVyZW5jZXMgYmV0d2VlbiBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODYwNSI+MjE4NjA1PC9hPgorW3NlYXJjaF0gU2VhcmNoUGF0dGVybjogcHJvdmlkZSB3YXkgdG8gZ2V0IHRoZSBtYXRjaGluZyByZWdpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYzNTU4Ij4yNjM1NTg8L2E+CitDYW4ndCBjb21waWxlIHBhY2thZ2UtaW5mby5qYXZhIGZyb20gRmluZEJ1Z3Mgd2l0aCAzLjUgRWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDQ0MyI+MjY0NDQzPC9hPgorW3BhcnNlcl0gQVNUUGFyc2VyLmNyZWF0ZUFTVHMgYW5kIElWYXJpYWJsZUJpbmRpbmcKKworPGEgbmFtZT0idl85MzgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU02IC0gRmVicnVhcnkgMTAsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTM4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkzOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTU5NCI+MjYxNTk0PC9hPgorQWRqdXN0IGNvZGUgdG8gbmV3IFBSRV9SRUZSRVNIIHNlbWFudGljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2Mzg3NyI+MjYzODc3PC9hPgorWzEuNV1bY29tcGlsZXJdIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yIGZsYWdnZWQgd2l0aGluIGVudW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjM2MzMiPjI2MzYzMzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbnZhbGlkIHR5cGUgbWlzbWF0Y2ggZm9yIGFmdGVyIGdlbmVyaWMgbWV0aG9kIGluZmVyZW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjkzMiI+MjYyOTMyPC9hPgorW2Fzc2lzdF0gQ29uc3RydWN0b3IgY29tcGxldGlvbiBtYWtlcyBhcnJheSBhbGxvY2F0aW9uIGRpZmZpY3VsdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MzY1MyI+MjYzNjUzPC9hPgorcGF0Y2ggZm9yIGpkdC5jb3JlLm1vZGVsLnRlc3RzIHRvIGFjY29tbW9kYXRlIGljdSA0LjAuMQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjYyNyI+MjQ2NjI3PC9hPgorW2FzdCByZXdyaXRlXSBXcm9uZyBpbmRlbnRhdGlvbiBmb3Igc3RhdGVtZW50IGluc2VydGVkIGJlZm9yZSBTd2l0Y2hDYXNlCisKKzxhIG5hbWU9InZfOTM3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNiAtIEZlYnJ1YXJ5IDMsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTM3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkzNyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjM5MyI+MjAyMzkzPC9hPgorW2NvbXBpbGVyXSBJbmNvbXBsZXRlIGNvZGUgY292ZXJhZ2Ugb3IgdXNlbGVzcyBzdGF0ZW1lbnQgd2l0aGluIFRocm93U3RhdGVtZW50I3Jlc29sdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjMyMTUiPjI2MzIxNTwvYT4KK1sxLjVdW2NvbXBpbGVyXSAgSTIwMDkwMTI5LTEyMDAgZ2VuZXJhdGVzIHN1ZGRlbmx5IGFuIGdlbmVyaWNzIGNvbXBpbGUgZXJyb3IgdGhhdCAzLjVNNCAgZGlkbnQgZG8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE1MTAiPjI2MTUxMDwvYT4KK1tjb21waWxlcl0gRGVhZGxvY2sgaW4gc3RhdGljIGluaXRpYWxpemVyIG9mIEpEVCBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNTE3Ij4yNjI1MTc8L2E+CitbYXN0IHJld3JpdGVdIFdoaXRlc3BhY2Ugc2V0dGluZ3MgaW4gZm9ybWF0dGVyIGlnbm9yZWQgd2hlbiBhZGRpbmcgYW5ub3RhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDg0OCI+MjYwODQ4PC9hPgorW3BlcmZzXSBSZWdyZXNzaW9uIG9uIEpEVC9Db3JlIHBsdWdpbiBpbml0aWFsaXphdGlvbiBwZXJmb3JtYW5jZSB0ZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3NzE2Ij4yNTc3MTY8L2E+CitbY29tcGlsZXJdIEVycm9uZW91cyBibGFuayBmaWVsZCBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjQwOCI+MjYyNDA4PC9hPgorcmVtb3ZlIGRlcHJlY2F0ZWQgTmFtaW5nQ29udmVudGlvbnMuVktfQ09OU1RBTlRfRklFTEQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjI3MTciPjI2MjcxNzwvYT4KK1dyb25nIGxpbmUgbnVtYmVycyBpbiBjbGFzc2ZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjI1NjgiPjI2MjU2ODwvYT4KK2ltcHJvdmUgSmF2YWRvYyBmb3IgSUNvbXBpbGF0aW9uVW5pdC5hcHBseVRleHRFZGl0KFRleHRFZGl0LCBJUHJvZ3Jlc3NNb25pdG9yKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjM4OSI+MjYyMzg5PC9hPgorSW50ZXJuYWwgY29kZSBtdXN0IG5vdCB1c2UgSUNvbXBpbGF0aW9uVW5pdC5hcHBseVRleHRFZGl0CisKKzxhIG5hbWU9InZfOTM2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNSAtIEphbnVhcnkgMjcsIDIwMDkgLSAzLjUgTUlMRVNUT05FIDUKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTM2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkzNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjMwNCI+MjYyMzA0PC9hPgorWzEuNV1bY29tcGlsZXJdIEVudW0gY29uc3RhbnQgaW4gYW5ub3RhdGlvbiB2YWx1ZTogamF2YWMgdnMgRWNsaXBzZSBkaWZmZXIKKworPGEgbmFtZT0idl85MzUiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU01IC0gSmFudWFyeSAyNSwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MzUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTM1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgQVBJcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZ2VuZXJpYyB0eXBlIGFuZCB0aGUgcmFuayBvZiBhIHdpbGRjYXJkIHR5cGUgYmluZGluZzoKKyAgICAgICA8Y29kZT5JVHlwZUJpbmRpbmcjZ2V0R2VuZXJpY1R5cGVPZldpbGRjYXJkVHlwZSgpPC9jb2RlPiwgPGNvZGU+SVR5cGVCaW5kaW5nI2dldFJhbmsoKTwvY29kZT4sIGFuZAorICAgICAgIDxjb2RlPkJpbmRpbmdLZXkjY3JlYXRlV2lsZGNhcmRUeXBlQmluZGluZ0tleShTdHJpbmcgZ2VuZXJpY1R5cGVLZXksIGNoYXIgYm91bmRLaW5kLCBTdHJpbmcgYm91bmRUeXBlS2V5LCBpbnQgcmFuayk8L2NvZGU+LjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjIwOCI+MjYyMjA4PC9hPgorWzEuNV1bY29tcGlsZXJdSW5jb3JyZWN0IEBPdmVycmlkZSBhbmQgbmFtZSBjbGFzaCBlcnJvcnMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyMjA5Ij4yNjIyMDk8L2E+CitbMS41XVtjb21waWxlcl1JbmNvcnJlY3QgYW1iaWd1b3VzIG1ldGhvZCBjYWxscyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ2MDkiPjIzNDYwOTwvYT4KK1tkb21dIEJpbmRpbmdLZXkjdG9TaWduYXR1cmUoKSBmYWlscyB3aXRoIGtleSBmcm9tIGNyZWF0ZVdpbGNhcmRUeXBlQmluZGluZ0tleSguLikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE5NzMiPjI2MTk3MzwvYT4KK1thc3Npc3RdIENvbnN0cnVjdG9yIGNvbXBsZXRpb24gc2hvdWxkIGJlIGltcHJvdmVkIChidWcgNjkzMCkKKworPGEgbmFtZT0idl85MzQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU01IC0gSmFudWFyeSAyMCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MzQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTM0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgbmV3IEFQSSB0byBwcm9wb3NlIGNvbnN0cnVjdG9yIGNvbXBsZXRpb248YnI+CitXaGVuICJuZXcgQXJyYXlMaXMiIGlzIGNvbXBsZXRlZCBub3cgY29uc3RydWN0b3JzIGFyZSBwcm9wb3NlZCBpbnN0ZWFkIG9mIHR5cGUgcmVmZXJlbmNlcy4KK1RoaXMgbmV3IGNvbXBsZXRpb24ga2luZCBpcyA8Y29kZT5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OPC9jb2RlPiBhbmQgdGhpcyBwcm9wb3NhbCBoYXMgYWx3YXlzIGEgCis8Y29kZT5UWVBFX1JFRjwvY29kZT4gcmVxdWlyZWQgcHJvcG9zYWwgdG8gZGVzY3JpYmUgdGhlIHR5cGUgb2YgdGhlIGNvbnN0cnVjdG9yLgorVGhlIDxjb2RlPkNPTlNUUlVDVE9SX0lOVk9DQVRJT048L2NvZGU+IGhhcyAiKCkiIGFzIGNvbXBsZXRpb24gc3RyaW5nIGFuZCA8Y29kZT5UWVBFX1JFRjwvY29kZT4gaGFzCisiamF2YS51dGlsLkFycmF5TGlzdCIgYXMgY29tcGxldGlvbiBzdHJpbmcuPGJyPgorVGhlcmUgaXMgYWxzbyBhIHNpbWlsYXIgbmV3IEFQSSB0byBjb21wbGV0ZSBhbm9ueW1vdXMgdHlwZSBjb25zdHJ1Y3RvcjogPGNvZGU+QU5PTllNT1VTX0NMQVNTX0NPTlNUUlVDVE9SX0lOVk9DQVRJT048L2NvZGU+PGJyPgorCisKKzxwcmU+CisKKwkvKioKKwkgKiBDb21wbGV0aW9uIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3RydWN0b3IuCisJICogVGhpcyBraW5kIG9mIGNvbXBsZXRpb24gbWlnaHQgb2NjdXIgaW4gYSBjb250ZXh0IGxpa2UKKwkgKiAmbHQ7Y29kZSZndDsibmV3IExpcyImbHQ7L2NvZGUmZ3Q7IGFuZCBjb21wbGV0ZSBpdCB0bworCSAqICZsdDtjb2RlJmd0OyJuZXcgTGlzdCgpOyImbHQ7L2NvZGUmZ3Q7IGlmIExpc3QgaXMgYSBjbGFzcyB0aGF0IGlzIG5vdCBhYnN0cmFjdC4KKwkgKiAmbHQ7cCZndDsKKwkgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkgKiBmb3IgdGhpcyBraW5kIG9mIGNvbXBsZXRpb24gcHJvcG9zYWwgYXQgbGl0dGxlIGV4dHJhIGNvc3Q6CisJICogJmx0O3VsJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldERlY2xhcmF0aW9uU2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHR5cGUgdGhhdCBkZWNsYXJlcyB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXRGbGFncygpfSAtCisJICogdGhlIG1vZGlmaWVycyBmbGFncyBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXROYW1lKCl9IC0KKwkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgcmVmZXJlbmNlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0U2lnbmF0dXJlKCl9IC0KKwkgKiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBvZiB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyByZWZlcmVuY2VkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7L3VsJmd0OworCSAqICZsdDsvcCZndDsKKwkgKiAmbHQ7cCZndDsKKwkgKiBUaGlzIGtpbmQgb2YgcHJvcG9zYWwgY291bGQgcmVxdWlyZSBhIGxvbmcgY29tcHV0YXRpb24sIHNvIHRoZXkgYXJlIGNvbXB1dGVkIG9ubHkgaWYgY29tcGxldGlvbiBvcGVyYXRpb24gaXMgY2FsbGVkIHdpdGggYSB7QGxpbmsgSVByb2dyZXNzTW9uaXRvcn0KKwkgKiAoZS5nLiB7QGxpbmsgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgQ29tcGxldGlvblJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9KS4mbHQ7YnImZ3Q7CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGlzIGFsd2F5cyBpcyBvbmx5IHByb3Bvc2FscyB3aXRoIGEge0BsaW5rICNUWVBFX1JFRn0gcmVxdWlyZWQgcHJvcG9zYWwsIHNvIHRoaXMga2luZCBvZiByZXF1aXJlZCBwcm9wb3NhbCBtdXN0IGJlIGFsbG93ZWQ6CisJICogJmx0O2NvZGUmZ3Q7cmVxdWVzdG9yLnNldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKENPTlNUUlVDVE9SX0lOVk9DQVRJT04sIFRZUEVfUkVGLCB0cnVlKSZsdDsvY29kZSZndDsuCisJICogJmx0Oy9wJmd0OworCSAqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID0gMjY7CisJCisJLyoqCisJICogQ29tcGxldGlvbiBpcyBhIHJlZmVyZW5jZSBvZiBhIGNvbnN0cnVjdG9yIG9mIGFuIGFub255bW91cyBjbGFzcy4KKwkgKiBUaGlzIGtpbmQgb2YgY29tcGxldGlvbiBtaWdodCBvY2N1ciBpbiBhIGNvbnRleHQgbGlrZQorCSAqICZsdDtjb2RlJmd0OyJuZXcgTGlzXjsiJmx0Oy9jb2RlJmd0OyBhbmQgY29tcGxldGUgaXQgdG8KKwkgKiAmbHQ7Y29kZSZndDsibmV3IExpc3QoKSB7fSImbHQ7L2NvZGUmZ3Q7IGlmIExpc3QgaXMgYW4gaW50ZXJmYWNlIG9yIGFic3RyYWN0IGNsYXNzLgorCSAqICZsdDtwJmd0OworCSAqIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorCSAqIGZvciB0aGlzIGtpbmQgb2YgY29tcGxldGlvbiBwcm9wb3NhbCBhdCBsaXR0bGUgZXh0cmEgY29zdDoKKwkgKiAmbHQ7dWwmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKX0gLQorCSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZSBiZWluZyBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXREZWNsYXJhdGlvbktleSgpfSAtCisJICogdGhlIHR5cGUgdW5pcXVlIGtleSBvZiB0aGUgdHlwZSBiZWluZyBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkCisJICogJmx0Oy9saSZndDsKKwkgKiAmbHQ7bGkmZ3Q7e0BsaW5rICNnZXRTaWduYXR1cmUoKX0gLQorCSAqIHRoZSBtZXRob2Qgc2lnbmF0dXJlIG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiAmbHQ7L2xpJmd0OworCSAqICZsdDtsaSZndDt7QGxpbmsgI2dldEtleSgpfSAtCisJICogdGhlIG1ldGhvZCB1bmlxdWUga2V5IG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIHJlZmVyZW5jZWQKKwkgKiBpZiB0aGUgZGVjbGFyaW5nIHR5cGUgaXMgbm90IGFuIGludGVyZmFjZQorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0O2xpJmd0O3tAbGluayAjZ2V0RmxhZ3MoKX0gLQorCSAqIHRoZSBtb2RpZmllcnMgZmxhZ3Mgb2YgdGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgcmVmZXJlbmNlZAorCSAqICZsdDsvbGkmZ3Q7CisJICogJmx0Oy91bCZndDsKKwkgKiAmbHQ7L3AmZ3Q7CisJICogJmx0O3AmZ3Q7CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGNvdWxkIHJlcXVpcmUgYSBsb25nIGNvbXB1dGF0aW9uLCBzbyB0aGV5IGFyZSBjb21wdXRlZCBvbmx5IGlmIGNvbXBsZXRpb24gb3BlcmF0aW9uIGlzIGNhbGxlZCB3aXRoIGEge0BsaW5rIElQcm9ncmVzc01vbml0b3J9CisJICogKGUuZy4ge0BsaW5rIElDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIENvbXBsZXRpb25SZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpfSkmbHQ7YnImZ3Q7CisJICogVGhpcyBraW5kIG9mIHByb3Bvc2FsIGlzIGFsd2F5cyBpcyBvbmx5IHByb3Bvc2FscyB3aXRoIGEge0BsaW5rICNUWVBFX1JFRn0gcmVxdWlyZWQgcHJvcG9zYWwsIHNvIHRoaXMga2luZCBvZiByZXF1aXJlZCBwcm9wb3NhbCBtdXN0IGJlIGFsbG93ZWQ6CisJICogJmx0O2NvZGUmZ3Q7cmVxdWVzdG9yLnNldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKENPTlNUUlVDVE9SX0lOVk9DQVRJT04sIFRZUEVfUkVGLCB0cnVlKSZsdDsvY29kZSZndDsuCisJICogJmx0Oy9wJmd0OworCSAqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICogQHNlZSBDb21wbGV0aW9uUmVxdWVzdG9yI3NldEFsbG93c1JlcXVpcmVkUHJvcG9zYWxzKGludCwgaW50LCBib29sZWFuKQorCSAqIAorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk9OWU1PVVNfQ0xBU1NfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA9IDI3OworPC9wcmU+CitUaGVzZSBuZXcgcHJvcG9zYWxzIGNhbiByZXF1aXJlIGEgbG9uZyBjb21wdXRhdGlvbiBzbyB0aGV5IGFyZSBwcm9wb3NlZCBvbmx5IGlmIGNvZGUgYXNzaXN0IHdhcyBjYWxsZWQgd2l0aCBhIHByb2dyZXNzIG1vbml0b3IuCitUbyBhdm9pZCB0aGF0IHRoZSBjb2RlIGFzc2lzdCBvcGVyYXRpb24gdGFrZXMgdG9vIG11Y2ggdGltZSBhIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+IHdoaWNoIGF1dG9tYXRpY2FsbHkgY2FuY2VsIHRoZSBjb2RlCithc3Npc3Qgb3BlcmF0aW9uIHdoZW4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaXMgcmVhY2hlZCBjb3VsZCBiZSB1c2VkLgorCis8cHJlPgorbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVPVVQgPSA1MDA7IC8vbXMKKyAgICBwcml2YXRlIGxvbmcgZW5kVGltZTsKKyAgICBwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKyAgICAgICAgZkVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuZFRpbWUgJmx0Oz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorICAgIC4uLgorIH07Cis8L3ByZT4KKzwvbGk+Cis8bGk+Rml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTMwIj5idWcgNjkzMDwvYT4gcmVxdWlyZWQgdGhlIGluZGV4IHZlcnNpb24gdG8gYmUgaW5jcmVtZW50ZWQuIAorICAgIEluZGV4ZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2VuZXJhdGVkIHVwb24gc3Vic2VxdWVudCBzZWFyY2ggcXVlcmllcyAoYWNjb3VudGluZyBmb3IgaW5kZXhpbmcgbm90aWZpY2F0aW9uIGluIHNlYXJjaCBwcm9ncmVzcyAKKyAgICBkaWFsb2dzKSBhbmQgdGhlIHNpemUgb2YgdGhlIG5ldyBpbmRleGVzIHdpbGwgYmUgYmlnZ2VyLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNzE3Ij4yNjA3MTc8L2E+CitbYXNzaXN0XSBDb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHByb3Bvc2VkIGV2ZW4gd2hlbiB0aGUgZGVjbGFyaW5nIHR5cGUgaXMgbm90IGltcG9ydGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkzMCI+NjkzMDwvYT4KK1thc3Npc3RdIENvbnN0cnVjdG9yIGNvbXBsZXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjAzMTEiPjIyMDMxMTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBwYWNrYWdlLWluZm8uamF2YSBkb2VzIG5vdCByZWNvZ25pc2UgZHVwbGljYXRlIGFubm90YXRpb25zIGFzIGEgcHJvYmxlbQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTY4NSI+MjU5Njg1PC9hPgorQm9ndXMgYnVpbGQgZXJyb3IgJnF1b3Q7Q2Fubm90IG5lc3QmcXVvdDsgeHl6ICZxdW90O2luc2lkZSBsaWJyYXJ5JnF1b3Q7Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNzk4Ij4yNjA3OTg8L2E+CitbZm9ybWF0dGVyXSBTdHJhbmdlIGJlaGF2aW9yIG9mIG5ldmVyIGpvaW4gbGluZXMKKworPGEgbmFtZT0idl85MzMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU01IC0gSmFudWFyeSAxMywgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MzMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTMzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+SW1wcm92ZWQgZ2VuZXJpYyBtZXRob2QgaW5mZXJlbmNlIHRvIGJldHRlciBtYXRjaCBKTFMgMTUuMTIuMi42LiBUaGUgY29tcGlsZXIgbm93IGluZmVycyBiZXR0ZXIgaW4gcHJlc2VuY2Ugb2YgdW5jaGVja2VkIGNvbnZlcnNpb24gaW4gYXJndW1lbnQgdHlwZXMgKHJhdyB0eXBlcykuIDwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDk0OCI+MjE0OTQ4PC9hPgorSW5jb3JyZWN0IGRlcHJlY2F0aW9uIHdhcm5pbmcgb24gYW5ub3RhdGlvbiBpbnN0YW5jZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjAyNzYiPjI2MDI3NjwvYT4KK1tmb3JtYXR0ZXJdIEluY29uc2lzdGVudCBmb3JtYXR0aW5nIG9mIG9uZS1saW5lIGJsb2NrIGNvbW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk2MDciPjIzOTYwNzwvYT4KK1tmb3JtYXR0ZXJdIEluY29ycmVjdCByZW1vdmFsIG9mIGFzdGVyaXNrICgqKSB3aXRoaW4gYSBibG9jayBjb21tZW50IHdoZW4gZm9ybWF0dGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NDk5OCI+MjU0OTk4PC9hPgorW2Zvcm1hdHRlcl0gd3JvbmcgdHlwZSBjb21tZW50IGZvcm1hdCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4Nzk4Ij4yNTg3OTg8L2E+CitbMS41XVtjb21waWxlcl0gUmV0dXJuIHR5cGUgc2hvdWxkIGJlIGVyYXNlZCBhZnRlciB1bmNoZWNrZWQgY29udmVyc2lvbiBkdXJpbmcgaW5mZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4OTA2Ij4yNTg5MDY8L2E+CitbanNyMjY5XSBQYWNrYWdlIGFubm90YXRpb25zIG5vdCB2aXNpYmxlIHRvIEphdmEgNiBBUFQgcHJvY2Vzc29ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTYzMyI+MjU5NjMzPC9hPgorWzEuNV1bY29tcGlsZXJdIEJvdW5kIG9mIHR5cGUgcGFyYW1ldGVyIG9mIGNsYXNzIGluIG1ldGhvZCBub3QgY2hlY2tlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTc2OCI+MTQ5NzY4PC9hPgorQW5ub3RhdGlvbnMgc2hvdWxkIGJlIGEgY29tcGlsYXRpb24gZGVwZW5kZW5jeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDI1NyI+MjYwMjU3PC9hPgorUmVkdWNlIHNwYWNlIHRha2VuIGJ5IFNvdXJjZVJlZkVsZW1lbnRJbmZvcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTYwNyI+MjU5NjA3PC9hPgorRGVhZGxvY2sgb3BlbmluZyBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cKKworPGEgbmFtZT0idl85MzIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU01IC0gSmFudWFyeSA2LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkzMgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MzIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgxNDUiPjI1ODE0NTwvYT4KK0Z1cCBvZiBidWcgMjUyNTU1LCBKTUUgaXMgdGhyb3duIHdoZW4gcGFja2FnZS1pbmZvLmphdmEgZXhpc3RzIHR3aWNlIGluIHRoZSBzYW1lIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTkxMjkiPjI1OTEyOTwvYT4KK1tjb21waWxlcl0gRnVwIG9mIGJ1ZyAyNTg5NTAsIHdyb25nIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSBmb3IgY2FzY2FkaW5nIG1ldGhvZCBpbnZvY2F0aW9ucworCis8YSBuYW1lPSJ2XzkzMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTUgLSBEZWNlbWJlciAxNiwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MzEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTMxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMTM2Ij4xNzExMzY8L2E+CitbYnVpbGRwYXRoXSBJbGxlZ2FsIHR5cGUgb2YgYXJjaGl2ZSBmb3IgcmVxdWlyZWQgbGlicmFyeSBpcyBhbiBpbmNvcnJlY3QgbWVzc2FnZS4KKworPGEgbmFtZT0idl85MzAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU00IC0gRGVjZW1iZXIgMTAsIDIwMDggLSAzLjUgTUlMRVNUT05FIDQKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTMwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkzMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTAwOCI+MjU1MDA4PC9hPgorW2NvbXBpbGVyXSBBc3NlcnQgc3RhdGVtZW50IGRpc2NyZXBhbmN5IHdpdGggamF2YWMgY2F1c2VkIGJ5IGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgwMzkiPjI1ODAzOTwvYT4KK1sxLjVdW2NvbXBpbGVyXSBNaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UgZm9yICZxdW90O2luc3RhbmNlb2YgTGlzdCZsdDtPYmplY3QmZ3Q7JnF1b3Q7CisKKzxhIG5hbWU9InZfOTI5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNNCAtIERlY2VtYmVyIDgsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTI5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkyOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIHByb3BlcnR5IHRvIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgb3BlbmFibGUgY2FjaGU6ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbW9kZWxjYWNoZS5yYXRpbyIuIEZvciBleGFtcGxlLCBzdGFydGluZyBFY2xpcHNlIGFzIGZvbGxvd3Mgd2lsbCBpbmNyZWFzZSB0aGUKKyAgICAgc2l6ZSBvZiB0aGUgb3BlbmFibGUgY2FjaGUgYnkgNTAlOiAKKyAgICAgPHByZT5lY2xpcHNlLmV4ZSAtdm1BcmdzIC1Eb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW1vZGVsY2FjaGUucmF0aW89MS41PC9wcmU+Cis8L2xpPgorPGxpPgorQXMgdXNlcnMgbWF5IHdhbnQgdG8gaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaW4gY29tbWVudHMsIHRoZSBuZXcgZm9ybWF0dGVyCitwcmVmZXJlbmNlIHRvIHByZXNlcnZlIGxpbmUgYnJlYWtzIGlzIG5vdyBjb250cm9sbGVkIGJ5IHR3byBkaWZmZXJlbnQgb3B0aW9uczoKKzx1bD4KKzxsaT5mb3IgdGhlIGFscmVhZHkgd3JhcHBlZCBjb2RlIGxpbmVzOjxicj4KKzxjb2RlPkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9KT0lOX1dSQVBQRURfTElORVM8L2NvZGU+Cis8cHJlPgorLyoqCisgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBmb3JtYXR0ZXIgY2FuIGpvaW4gd3JhcHBlZCBsaW5lcyBvciBub3QKKyAqIAorICogCQlGb3IgZXhhbXBsZSwgdGhlIHdyYXBwZWQgbGluZXMgb2YgbWV0aG9kIGZvbyByZXR1cm4gc3RhdGVtZW50IGluIGZvbGxvd2luZyB0ZXN0IGNhc2U6CisgKiAJCQljbGFzcyBYIHsKKyAqIAkJCVN0cmluZyBmb28oKSB7CisgKiAJCQlyZXR1cm4gInNlbGVjdCB4ICIKKyAqIAkJCSAgICAgICArICJmcm9tIHkgIgorICogCQkJICAgICAgICsgIndoZXJlIHo9YSI7CisgKiAJCQl9CisgKiAJCQl9CisgKgorICogCQl3aWxsIGJlIHByZXNlcnZlZCBieSB0aGUgZm9ybWF0dGVyIHdoZW4gdGhlIG5ldyBwcmVmZXJlbmNlIGlzIHVzZWQKKyAqIAkJZXZlbiBpZiB0aGUgbWF4aW11bSBsaW5lIHdpZHRoIHdvdWxkIGdpdmUgaXQgZW5vdWdoIHNwYWNlIHRvIGpvaW4gdGhlIGxpbmVzLgorICogCQlIZW5jZSBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dDoKKyAqIAkJCWNsYXNzIFggeworICogCQkJICAgIFN0cmluZyBmb28oKSB7CisgKiAJCQkgICAgICAgIHJldHVybiAic2VsZWN0IHggIgorICogCQkJICAgICAgICAgICAgICAgICsgImZyb20geSAiCisgKiAJCQkgICAgICAgICAgICAgICAgKyAid2hlcmUgej1hIjsKKyAqIAkJCSAgICB9CisgKiAJCQl9CisgKgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzIgorICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQorICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKyAqIAorICogQHNpbmNlIDMuNQorICovCis8L3ByZT4KKzwvbGk+Cis8bGk+Zm9yIHRoZSBsaW5lcyBpbiBjb21tZW50czo8YnI+Cis8Y29kZT5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSk9JTl9MSU5FU19JTl9DT01NRU5UUzwvY29kZT4KKzxwcmU+CisvKioKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGZvcm1hdHRlciBjYW4gam9pbiB0ZXh0IGxpbmVzIGluIGNvbW1lbnRzIG9yIG5vdAorICogCisgKiAJCUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CisgKiAJCQkvKioKKyAqIAkJCSAqIFRoZSBmb28gbWV0aG9kLgorICogCQkJICogZm9vIGlzIGEgc3Vic3RpdHV0ZSBmb3IgYmFyLgorICogCQkJICovCisgKiAJCQlwdWJsaWMgY2xhc3MgWCB7CisgKiAJCQl9CisgKiAKKyAqIAkJd2lsbCBiZSB1bmNoYW5nZWQgYnkgdGhlIGZvcm1hdHRlciB3aGVuIHRoaXMgbmV3IHByZWZlcmVuY2UgaXMgdXNlZCwKKyAqIAkJZXZlbiBpZiB0aGUgbWF4aW11bSBsaW5lIHdpZHRoIHdvdWxkIGdpdmUgaXQgZW5vdWdoIHNwYWNlIHRvIGpvaW4gdGhlIGxpbmVzLgorICoKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHMiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgVFJVRQorICoKKyAqIEBzaW5jZSAzLjUKKyAqLworPC9wcmU+Cis8L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3OTA3Ij4yNTc5MDc8L2E+CitbRm9ybWF0dGVyXSBGT1JNQVRURVJfUFJFU0VSVkVfRVhJU1RJTkdfTElORV9CUkVBS1MgbmVlZHMgY2xhcmlmaWNhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzkwNiI+MjU3OTA2PC9hPgorW0Zvcm1hdHRlcl0gc2hvdWxkIGhhdmUgc2VwYXJhdGUgJ3ByZXNlcnZlIGV4aXN0aW5nIGxpbmUgYnJlYWtzJyBmb3IgY29kZSBhbmQgY29tbWVudCBmb3JtYXR0aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyODE2Ij4yMzI4MTY8L2E+CitbYnVpbGRwYXRoXSBNaXNsZWFkaW5nIHByb2JsZW0gdGV4dCBmb3IgbWlzc2luZyBqYXIgaW4gdXNlciBsaWJyYXJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3ODQ5Ij4yNTc4NDk8L2E+CitbMS41XVtjb21waWxlcl0gSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgdXNpbmcgZ2VuZXJpY3Mgdy8gYWJzdHJhY3QgY2xhc3NlcyAmYW1wOyBpbnRlcmZhY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3ODY5Ij4yNTc4Njk8L2E+CitBZGp1c3QgSmF2YSBtb2RlbCBjYWNoZSBzaXplIHVzaW5nIGEgcHJvcGVydHkKKworPGEgbmFtZT0idl85MjgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU00IC0gRGVjZW1iZXIgNywgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MjgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTI4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitBZGRlZCBhIG5ldyBmb3JtYXR0ZXIgcHJlZmVyZW5jZSB0byBwcmVzZXJ2ZSBleGlzdGluZyBicmVha3MgaW4gYWxyZWFkeSB3cmFwcGVkIGFuZCBjb21tZW50cyBsaW5lcy48YnI+Cis8cD4KK0ZvciBleGFtcGxlLCB0aGUgd3JhcHBlZCBsaW5lcyBvZiBtZXRob2QgZm9vIHJldHVybiBzdGF0ZW1lbnQgaW4gZm9sbG93aW5nIHRlc3QgY2FzZToKKzwvcD4KKzxwcmU+CitjbGFzcyBYIHsKK1N0cmluZyBmb28oKSB7CityZXR1cm4gInNlbGVjdCB4ICIKKyAgICAgICArICJmcm9tIHkgIgorICAgICAgICsgIndoZXJlIHo9YSI7Cit9Cit9Cis8L3ByZT4KK3dpbGwgYmUgcHJlc2VydmVkIGJ5IHRoZSBmb3JtYXR0ZXIgd2hlbiB0aGUgbmV3IHByZWZlcmVuY2UgaXMgdXNlZCwgaGVuY2UgcHJvZHVjZXMKK25vdyB0aGUgZm9sbG93aW5nIG91dHB1dDoKKzxwcmU+CitjbGFzcyBYIHsKKyAgICBTdHJpbmcgZm9vKCkgeworICAgICAgICByZXR1cm4gInNlbGVjdCB4ICIKKyAgICAgICAgICAgICAgICArICJmcm9tIHkgIgorICAgICAgICAgICAgICAgICsgIndoZXJlIHo9YSI7CisgICAgfQorfQorPC9wcmU+CitTaW1pbGFybHksIGZvbGxvd2luZyBjb21tZW50OgorPHByZT4KKy8qKgorICogVGhlIGZvbyBtZXRob2QuCisgKiBmb28gaXMgYSBzdWJzdGl0dXRlIGZvciBiYXIuCisgKi8KK3B1YmxpYyBjbGFzcyBYIHsKK30KKzwvcHJlPgoraXMgbm93IHVuY2hhbmdlZCBieSB0aGUgZm9ybWF0dGVyIHdoZW4gdGhpcyBuZXcgcHJlZmVyZW5jZSBpcyB1c2VkLi4uPGJyPgorPHA+CitUaGlzIGRpYWdub3NpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBvcHRpb246PGJyPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX1BSRVNFUlZFX0VYSVNUSU5HX0xJTkVfQlJFQUtTPC9jb2RlPjo8L3A+Cis8cHJlPgorLyoqCisgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBmb3JtYXR0ZXIgc2hvdWxkIHByZXNlcnZlIGV4aXN0aW5nIGxpbmUgYnJlYWtzIG9yIG5vdAorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHJlc2VydmVfZXhpc3RpbmdfbGluZV9icmVha3MiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgRkFMU0UKKyAqIEBzaW5jZSAzLjUKKyAqLworPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTc0MzQiPjI1NzQzNDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBTaG91bGQgZGV0ZWN0IHR5cGUgbWlzbWF0Y2ggYWZ0ZXIgY2FwdHVyZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzM4NCI+MjU3Mzg0PC9hPgorQUlPT0JFIGR1cmluZyBwcm9ibGVtIHJlcG9ydGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTEzMCI+MjM5MTMwPC9hPgorW2Zvcm1hdHRlcl0gQ29tbWVudCBmb3JtYXR0ZXIgZG9lcyBub3Qga2VlcCBibGFuayBsaW5lcyBhZnRlciBAc2VlIHJlZmVyZW5jZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgwNzQiPjE5ODA3NDwvYT4KK1tmb3JtYXR0ZXJdIHRoZSBjb2RlIGZvcm1hdHRlciBkb2Vzbid0IHJlc3BlY3QgbXkgbmV3IGxpbmVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2Nzk5Ij4yNTY3OTk8L2E+CitbZm9ybWF0dGVyXSBGb3JtYXR0ZXIgd3JvbmdseSBhZGRzIHNwYWNlIHRvIC8vJEZBTEwtVEhST1VHSCQgaXMKKworPGEgbmFtZT0idl85MjciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU00IC0gRGVjZW1iZXIgMiwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MjcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTI3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitJbXByb3ZlZCBkZWFkIGNvZGUgZGV0ZWN0aW9uIGJ5IGhhdmluZyBpdCAob3B0aW9uYWxseSkgdG9sZXJhdGUgdHJpdmlhbCBJRiBzdGF0ZW1lbnQsCitzdWNoIGFzIDxjb2RlPmlmIChERUJVRykgLi4uPC9jb2RlPi4gVGhpcyBleHRyYSBvcHRpb24gaXMgZGVmaW5lZCBieQorPGNvZGU+SmF2YUNvcmUuQ09NUElMRVJfUEJfREVBRF9DT0RFX0lOX1RSSVZJQUxfSUZfU1RBVEVNRU5UPC9jb2RlPi4KKzxwcmU+CisqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIERlYWQgQ29kZSBJbnNpZGUgVHJpdmlhbCBJZiBTdGF0ZW1lbnQuCisqIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHByZXNlbmNlIG9mIGRlYWQgY29kZSBpbnNpZGUgdHJpdmlhbCBJRiBzdGF0ZW1lbnQsIGUuZy4gaWYgKERFQlVHKS4uLgorKiBUaGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0gaXMgY29udHJvbGxlZCB3aXRoIG9wdGlvbiB7QGxpbmsgI0NPTVBJTEVSX1BCX0RFQURfQ09ERX0uCisqIAorKiBPcHRpb24gaWQ6Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGVJblRyaXZpYWxJZlN0YXRlbWVudCIKKyogUG9zc2libGUgdmFsdWVzOnsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKyogRGVmYXVsdDoid2FybmluZyIKKzwvcHJlPgorPC9saT4KKzxsaT5EZWFkIGNvZGUgZGV0ZWN0aW9uIHdhcm5pbmcgYWxzbyBnb3QgZW5hYmxlZCBieSBkZWZhdWx0LgorPHByZT4KKyogQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgRGVhZCBDb2RlLgorKiBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBzb21lIG5vbiBmYXRhbCBkZWFkIGNvZGUgaXMgZGV0ZWN0ZWQuIEZvciBpbnN0YW5jZSwgaWYgKGZhbHNlKSBmb28oKTsKKyogaXMgbm90IHJlcG9ydGVkIGFzIHRydWx5IHVucmVhY2hhYmxlIGNvZGUgYnkgdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbi4gSWYgdGhpcyBkaWFnbm9zdGljIGlzIGVuYWJsZWQsIHRoZW4gdGhlIGludm9jYXRpb24gb2YgZm9vKCkgaXMKKyogZ29pbmcgdG8gYmUgc2lnbmFsZWQgYXMgYmVpbmcgZGVhZCBjb2RlLgorKiBPcHRpb24gaWQ6Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGUiCisqIFBvc3NpYmxlIHZhbHVlczp7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorKiBEZWZhdWx0OiJ3YXJuaW5nIgorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTYzMjkiPjI1NjMyOTwvYT4KK0ltcG9zc2libGUgTlBFIGluIEphdmFNb2RlbE1hbmFnZXIuZ2V0T3B0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1Njg4MiI+MjU2ODgyPC9hPgorW2NvbXBpbGVyXSBFbmFibGUgRGVhZENvZGUgZGV0ZWN0aW9uIGJ5IGRlZmF1bHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU5NzAiPjI1NTk3MDwvYT4KK3Rlc3QgdGVhciBkb3duIGZhaWxlZCBjYXVzaW5nIGNhc2NhZGUgb2YgZmFpbHVyZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDcwOTMiPjIwNzA5MzwvYT4KK1BlcmY6IGFkZGluZyBhIG5ldyB0b3AtbGV2ZWwgcGFja2FnZSBpcyBzbG93IGlmIG1hbnkgc291cmNlIGZpbGVzIGV4aXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyOTQ4Ij4yNTI5NDg8L2E+CitVbm5jZXNzYXJ5IGNvbXBpbGF0aW9uIHdoZW4gYWRkaW5nIHBhY2thZ2VzIHdpdGggYW4gZXhpc3RpbmcgcGF0aCBzZWdtZW50IGF0IHRoZSBiZWdpbm5pbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY3MzUiPjI1NjczNTwvYT4KK01hcmtlciBwcm9wZXJ0eSB2YWx1ZSBpcyB0b28gbG9uZyBmb3IgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgKGphdmEubGFuZy5TdGFja092ZXJmbG93RXJyb3IpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3OTg2Ij4yMjc5ODY8L2E+CitBdm9pZCBkdXBsaWNhdGVkIHN0cmluZ3MgaW4gSmF2YSBtb2RlbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjQ2MyI+MjU2NDYzPC9hPgorW2NvbXBpbGVyXSBTdXBwb3J0IGNvbW1vbiBkZWJ1ZyBwYXR0ZXJuIGluIHVucmVhY2hhYmxlIGNvZGUgZGV0ZWN0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2Njc5Ij4yNTY2Nzk8L2E+CitbcGVyZnNdIFNlYXJjaEFsbFR5cGVOYW1lcyBwZXJmb3JtYW5jZSB0ZXN0cyBhcmUgc2xvd2VyIG9uIGVwbG54MgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODg0NSI+MjI4ODQ1PC9hPgorW2hpZXJhcmNoeV0gVHlwZSBoaWVyYXJjaHkgc2hvdWxkIGluY2x1ZGUgc3VidHlwZXMgaW4gcHJpbWFyeSB3b3JraW5nIGNvcGllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjU3MSI+MjUyNTcxPC9hPgorW2J1aWxkcGF0aF0gRXh0ZXJuYWwgZm9sZGVyIGFwcGVhcnMgZW1wdHkgYWZ0ZXIgd29ya3NwYWNlIG1vdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY0MDQiPjI1NjQwNDwvYT4KK1dyb25nIGhhbmRsZSBpZGVudGlmaWVyIGZvciBleHRlcm5hbCBsaWJyYXJ5IGZvbGRlcgorCis8YSBuYW1lPSJ2XzkyNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTQgLSBOb3ZlbWJlciAyNSwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MjYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTI2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitBZGRlZCBhIG5ldyBjb21waWxlciB3YXJuaW5nIHRvIHNpZ25hbCBwcmVzZW5jZSBvZiBkZWFkIGNvZGUsICBlLmcuIDxjb2RlPmlmIChmYWxzZSkgZGVhZENvZGUoKTsgPC9jb2RlPi4KK1RoaXMgZGlhZ25vc2lzIGlzIGNvbnRyb2xsZWQgYnkgb3B0aW9uOiAKKzxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX0RFQURfQ09ERTwvY29kZT4gYW5kIHByb2R1Y2VzIGEgcHJvYmxlbSBtYXJrZXIgd2hpY2ggSUQgaXMgPGNvZGU+SVByb2JsZW0uRGVhZENvZGU8L2NvZGU+IHByb2JsZW0gSUQuCis8cHJlPgorKiBDb21waWxlciBvcHRpb24gSUQ6IFJlcG9ydGluZyBEZWFkIENvZGUuCisqIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIHNvbWUgbm9uIGZhdGFsIGRlYWQgY29kZSBpcyBkZXRlY3RlZC4gRm9yIGluc3RhbmNlLCBpZiAoZmFsc2UpIGZvbygpOworKiBpcyBub3QgcmVwb3J0ZWQgYXMgdHJ1bHkgdW5yZWFjaGFibGUgY29kZSBieSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLiBJZiB0aGlzIGRpYWdub3N0aWMgaXMgZW5hYmxlZCwgdGhlbiB0aGUgaW52b2NhdGlvbiBvZiBmb28oKSBpcworKiBnb2luZyB0byBiZSBzaWduYWxlZCBhcyBiZWluZyBkZWFkIGNvZGUuCisqIE9wdGlvbiBpZDoib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZSIKKyogUG9zc2libGUgdmFsdWVzOnsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisqIERlZmF1bHQ6Imlnbm9yZSIKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxNTA0Ij4yNTE1MDQ8L2E+CitbaW5kZXhdIFdyb25nIGluZGV4ZXMgbWF5IGJlIHVzZWQgd2hpbGUgcGVyZm9ybWluZyBhIHNlYXJjaCByZXF1ZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDgzOTkiPjQ4Mzk5PC9hPgorW2NvbXBpbGVyXSBFbmhhbmNlIHVucmVhY2hhYmxlIGNvZGUgZGV0ZWN0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0ODI1Ij4yNTQ4MjU8L2E+CitbamF2YWRvY10gY29tcGlsZSBlcnJvciB3aGVuIHJlZmVyZW5jaW5nIG91dGVyIHBhcmFtIGZyb20gaW5uZXIgY2xhc3MgamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjU1NSI+MjUyNTU1PC9hPgorW2phdmFkb2NdIE5QRSBvbiBkdXBsaWNhdGUgcGFja2FnZS1pbmZvCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxNjkwIj4yNTE2OTA8L2E+CitbY29tcGlsZXJdIE5QRSBpZiB0eXBlIGNvbGxpZGVzIHdpdGggYSBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MTM0Ij4yNDkxMzQ8L2E+CitbY29tcGlsZXJdIGVycm9yIG1lc3NhZ2UgKGltcGxlbWVudCBhYnN0cmFjdCBtZXRob2QpIG5vdCBhcyBpbnRlbmRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDE2MiI+MTU0MTYyPC9hPgorWzEuNV1bY29tcGlsZXJdIFVuaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgcXVhbGlmaWVkIGVudW0gY29uc3RhbnRzIGluIHN3aXRjaCBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU5NzQiPjI1NTk3NDwvYT4KK0FidXNpdmUgdXNhZ2Ugb2YgSW52YWxpZElucHV0RXhjZXB0aW9uIGluIHRoZSBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTY5MyI+MjUxNjkzPC9hPgorTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdFhYWE5hbWVzIHNob3VsZCBjYWxsIHN1Z2dlc3RWYXJpYWJsZU5hbWVzKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTUzNDUiPjI1NTM0NTwvYT4KK1Byb2JsZW1zIGluIG5ldyBOYW1pbmdDb252ZW50aW9ucyBBUElzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1NDUyIj4yNTU0NTI8L2E+CitbMS41XVtjb21waWxlcl0gRWNsaXBzZSBhbGxvd3MgZm9yd2FyZCByZWZlcmVuY2UgaW4gZW51bSBjb25zdHJ1Y3RvcgorCis8YSBuYW1lPSJ2XzkyNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTQgLSBOb3ZlbWJlciAxOCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MjUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTI1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1NTAxIj4yNTU1MDE8L2E+CitFbmNvZGluZ1Rlc3RzIGZhaWxpbmcgd2hlbiBydW4gYnkgaXRzZWxmCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MDM1Ij4yNTUwMzU8L2E+CitbY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGUgZXJyb3IgZ2V0cyByZXBvcnRlZCAoTlBFKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDI5NyI+MjUwMjk3PC9hPgorW2NvbXBpbGVyXSBOUEUgaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyLm1pc3NpbmdUeXBlSW5NZXRob2QoUHJvYmxlbVJlcG9ydGVyLmphdmE6NDkyNSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI1NTgiPjIzMjU1ODwvYT4KK1tjb21waWxlcl0gKz0gaXMgbm90IGFsbG93ZWQgYmV0d2VlbiBPYmplY3QgYW5kIFN0cmluZworCis8YSBuYW1lPSJ2XzkyNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTQgLSBOb3ZlbWJlciAxMCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MjQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTI0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyODY4Ij4yNTI4Njg8L2E+CitbYmF0Y2hdW2NvbXBpbGVyXSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5DbGFzc3BhdGhKYXIuZmV0Y2hMaW5rZWRKYXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2MjQyIj4yMzYyNDI8L2E+CitbY29tcGlsZXJdWzEuN10gY29tcGlsZXIgZGlmZmVyZW5jZSB0byBqYXZhYyA3IGludm9sdmluZyBwYXJhbWV0ZXJpemVkIHVzZXMgb2YgcmF3IG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTEyNTYiPjIxMTI1NjwvYT4KK1thc3QgcmV3cml0ZV0gd2hpdGVzcGFjZSBtaXNzaW5nIGJldHdlZW4gcmV0dXJuIGFuZCBleHByZXNzaW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUzODkxIj4yNTM4OTE8L2E+CitJbmNvcnJlY3QgdGFnIGNsb3N1cmUgaW4gSmF2YU1vZGVsIGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIxMjAiPjI1MjEyMDwvYT4KK1sxLjVdW2NvbXBpbGVyXSByYXcgdHlwZSBkaWFnbm9zdGljIG5vdCBjb2hlcmVudCB3aXRoIGphdmFjIG9uZQorCis8YSBuYW1lPSJ2XzkyMyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTQgLSBOb3ZlbWJlciA0LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkyMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MjMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAyMTEiPjI1MDIxMTwvYT4KK1tzZWFyY2hdIE9yZ2FuaXplIEltcG9ydHMgSGFuZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDE4MjEiPjI0MTgyMTwvYT4KK1tjb21waWxlcl0gTXVsdGlwbGUgaW50ZXJmYWNlcyBhbmQgaW5jb21wYXRpYmxlIHJldHVybiB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTI3OSI+MjUxMjc5PC9hPgorWzEuNV1bY29tcGlsZXJdIENvdmFyaWFudCBnZW5lcmljcyBpbnRlcmZhY2VzIGNhdXNlcyBjb21waWxlIGVycm9yCisKKzxhIG5hbWU9InZfOTIyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMyAtIE9jdG9iZXIgMjksIDIwMDggLSAzLjUgTUlMRVNUT05FIDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTIyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkyMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjQ4MSI+MjUyNDgxPC9hPgorW2NvZGUgYXNzaXN0XSBOUEUgaW4gZmluZEFsbFR5cGVzCisKKzxhIG5hbWU9InZfOTIxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMyAtIE9jdG9iZXIgMjgsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTIxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkyMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjI2NCI+MjUyMjY0PC9hPgorSW52YWxpZCBjbGFzc3BhdGggaGVhZGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBsb2dnZWQgaW4gdmVyYm9zZSBtb2RlIG9ubHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIzOTIiPjI1MjM5MjwvYT4KK01pc3NpbmcgamFycyByZWZlcmVuY2VkIGluIHRoZSBDbGFzcy1QYXRoOiBjbGF1c2Ugb2YgYSBNQU5JRkVTVC5NRiBmaWxlIHNob3VsZCBub3QgYmUgcmVwb3J0ZWQgYXMgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3ODQ1Ij4yNDc4NDU8L2E+CitbbWlzY10gRXJyb3JzIGluIGxvZyBmcm9tIGZldGNoaW5nIEphdmFkb2Mgd2hlbiB3b3JraW5nIGRpc2Nvbm5lY3RlZAorCis8YSBuYW1lPSJ2XzkyMCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTMgLSBPY3RvYmVyIDI1LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkyMAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MjAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OYW1pbmdDb252ZW50aW9ucyBoYXMgbm93IGEgbW9yZSBmbGV4aWJsZSBBUEkgdG8gc3VnZ2VzdCB2YXJpYWJsZSBuYW1lOiA8Y29kZT5OYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0VmFyaWFibGVOYW1lcygpPC9jb2RlPi48YnI+CitUaGUgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3VnZ2VzdCBsb2NhbCwgaW5zdGFuY2UgZmllbGQsIHN0YXRpYyBmaWVsZCBhbmQgY29uc3RhbnQgZmllbGQgbmFtZS4KK1RoaXMgbWV0aG9kIHVzZSBhIG5ldyBzcGVjaWZpYyBoZXVyaXN0aWMgdG8gZ2VuZXJhdGUgY29uc3RhbnQgbmFtZSB3aXRoIHVwcGVyIGNhc2UgYW5kIHVuZGVyc2NvcmUgKGUuZy4gPGNvZGU+Q09OU1RBTlRfRklFTERfTkFNRTwvY29kZT4pLgorPHByZT4KK3B1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3VnZ2VzdFZhcmlhYmxlTmFtZXMoCisJCQlpbnQgdmFyaWFibGVLaW5kLAorCQkJaW50IGJhc2VOYW1lS2luZCwKKwkJCVN0cmluZyBiYXNlTmFtZSwKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJCWludCBkaW0sCisJCQlTdHJpbmdbXSBleGNsdWRlZCwKKwkJCWJvb2xlYW4gZXZhbHVhdGVEZWZhdWx0KQorPC9wcmU+Cis8L2xpPgorPGxpPk5hbWluZ0NvbnZlbnRpb25zIGhhcyBub3cgYW4gQVBJIHRvIGNvbXB1dGUgdGhlIG5hbWUgdXNlZCB0byBnZW5lcmF0ZSBhIHZhcmlhYmxlIG5hbWU6IDxjb2RlPk5hbWluZ0NvbnZlbnRpb25zLmdldEJhc2VOYW1lKCk8L2NvZGU+Ljxicj4KKzxwcmU+CitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZSgKKwkJCWludCB2YXJpYWJsZUtpbmQsCisJCQlTdHJpbmcgdmFyaWFibGVOYW1lLAorCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KQorPC9wcmU+Cis8L2xpPgorPGxpPk5ldyBvcHRpb25zIGFyZSBhZGRlZCB0byBzcGVjaWZ5IHRoZSBwcmVmaXhlcyBhbmQgc3VmZml4ZXMgb2YgYSBjb25zdGFudCBmaWVsZDogPGNvZGU+SmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVM8L2NvZGU+IGFuZCA8Y29kZT5KYXZhQ29yZS5DT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUzwvY29kZT4uCis8L2xpPjwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwOTc1Ij4yNTA5NzU8L2E+CitbMS41XVtjb21waWxlcl0gU3RhY2sgb3ZlcmZsb3cgb24gc3RhdGljIGltcG9ydC4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDk3ODUiPjI0OTc4NTwvYT4KK1tqYXZhZG9jXVthc3Npc3RdIEphdmFkb2MgY29udGVudCBhc3Npc3QgYWZ0ZXIgJnF1b3Q7QHNlZSAjJnF1b3Q7IGRvZXMgbm90IHdvcmsgd2l0aCBkZXByZWNhdGVkIG1lbWJlciBiZWZvcmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDk2OTIiPjI0OTY5MjwvYT4KK1RoZSBJbXBvcnRSZXdyaXRlQW5hbHl6ZXIgZG9lcyBub3QgaG9ub3IgYSBmb3JtYXR0ZXIgc2V0dGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTgxNCI+MjUxODE0PC9hPgorWzEuNV1bY29tcGlsZXJdIER1cCBFbnVtI3ZhbHVlT2YoLi4uKSBzaG91bGQga2VlcCB0aGUgc3ludGhldGljIG9uZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODMwOSI+MjQ4MzA5PC9hPgorW21vZGVsXSBJQW5ub3RhdGFibGUjZ2V0QW5ub3RhdGlvbnMoKSBkb2VzIG5vdCB3b3JrIGZvciBzdGFuZGFyZCBhbm5vdGF0aW9ucyBvbiBiaW5hcnkgbWVtYmVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTUxOCI+MjUxNTE4PC9hPgorVG9ucyBvZiBpbnZhbGlkIEFQSSB0b29saW5nIGVycm9ycyB3aGVuIGNoZWNraW5nIG91dCBqZHQuY29yZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTM1NiI+MjUxMzU2PC9hPgorRml4IGZvciBidWcgMTQ2NzY4IGJyZWFrcyBKRFQgUmVmYWN0b3JpbmcgYW5kIGl0cyB0ZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MDI3Ij4yNDkwMjc8L2E+CitOUEUgaW4gRW5naW5lIGlmIHR5cGUgY29sbGlkZXMgd2l0aCBhIHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTk0NiI+ODU5NDY8L2E+CitOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcyguLikgZG9lcyBub3QgY29uc2lkZXIgJ2ZpbmFsJyBtb2RpZmllciBmb3IgY29uc3RhbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzgxMTEiPjM4MTExPC9hPgorW0RDUl0gTWFrZSBOYW1pbmdDb252ZW50aW9ucyBtb3JlIGZsZXhpYmxlCisKKzxhIG5hbWU9InZfOTE5Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMyAtIE9jdG9iZXIgMjEsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTE5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkxOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSBjb21waWxlciBpcyBub3cgYmV0dGVyIHJlc2lsaWVudCB3aXRoIGR1cGxpY2F0ZSBmaWVsZC9tZXRob2QgZGVmaW5pdGlvbnMgYW5kIHdpbGwgYXZvaWQgc2Vjb25kYXJ5IGVycm9ycyAKK2RldGVjdGVkIHdoZW4gc3Vic2VucXVlbnRseSB1c2luZyB0aGUgb2ZmZW5kaW5nIGZpZWxkL21ldGhvZC4KKzwvbGk+PC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTE1MjMiPjI1MTUyMzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBTaG91bGQgc3RpbGwgZmxhZyBFbnVtI3ZhbHVlT2Ygb3ZlcnJpZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDYyNzYiPjI0NjI3NjwvYT4KK05QRSBkdXJpbmcgY29kZSBjb21wbGV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5ODQ0Ij4yNDk4NDQ8L2E+CitJQmluZGluZyNnZXRKYXZhRWxlbWVudCgpIGFsd2F5cyByZXR1cm5zIG51bGwgZm9yIElBbm5vdGF0aW9uQmluZGluZ3MgZGVjbGFyZWQgaW4gYW5ub3RhdGlvbiBvciBlbnVtIHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NzY4Ij4xNDY3Njg8L2E+CitbY29tcGlsZXJdIFNob3VsZCBiZSBtb3JlIHJlc2lsaWVudCB3aXRoIGR1cGxpY2F0ZSBmaWVsZHMvbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTA5MSI+MjUxMDkxPC9hPgorQ292YXJpYW50IHJldHVybiB0eXBlcyBub3QgaG9ub3JlZCBmb3IgY29tYmluZWQgZXh0ZW5zaW9uIGFuZCBpbXBsZW1lbnRhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTA3OSI+MjUxMDc5PC9hPgorR290IGVycm9yIGRpYWxvZyBhZnRlciBzd2l0Y2hpbmcgZGVmYXVsdCBKUkUKKworPGEgbmFtZT0idl85MTgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0zIC0gT2N0b2JlciAxNiwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MTgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTE4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+TmV3IEFQSSBmb3IgdGhlIEFTVFZpc2l0b3IgY2xhc3M6IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yLnByZVZpc2l0MihBU1ROb2RlKTwvY29kZT4uPGJyPgorTmV3IEFQSSB0eXBlOiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9kZUZpbmRlcjwvY29kZT4uPGJyPgorQWxsIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBpbiBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMwMjQiPjUzMDI0PC9hPi48YnI+CitUaGVzZSBuZXcgQVBJcyBhcmUgc3RpbGwgdW5kZXIgZGlzY3Vzc2lvbiBhbmQgYXJlIHJlbGVhc2VkIGZvciBKRFQvVUkgYWRvcHRpb24uPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwOTQ2Ij4yNTA5NDY8L2E+CitCb2d1cyBqYXIgZmlsZSBpcyBhZGRlZCB0byB0aGUgcHJvamVjdCBidWlsZCBwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMDIyIj4yNTAwMjI8L2E+CitKYXZhIE1vZGVsIEV4Y2VwdGlvbjogSmF2YSBNb2RlbCBTdGF0dXMgd2hlbiBnZXR0aW5nIGNvZGUgYXNzaXN0IGluIGRlYnVnIGRldGFpbCBmb3JtYXR0ZXIgZGlhbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMwMjQiPjUzMDI0PC9hPgorW0RPTV0gTW92ZSBOb2RlRmluZGVyIHRvIGEgbm9uLWludGVybmFsIHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA3NTMiPjI1MDc1MzwvYT4KK1tmb3JtYXR0ZXJdIEluc2VydCBzcGFjZSBiZXR3ZWVuIGVtcHR5IGJyYWNlcyBpbiBhcnJheSBpbml0aWFsaXplcnMgaWdub3JlZCB3aXRob3V0ICZxdW90O0tlZXAgZW1wdHkgYXJyYXkgaW5pdGlhbGl6ZXIgb24gb25lIGxpbmUmcXVvdDsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMTkiPjI0ODMxOTwvYT4KK1tjb21waWxlcl1bMS41XSBWYWxpZCBKYXZhIHNvdXJjZSBwcm9kdWNlcyBjbGFzcyBmaWxlIHRoYXQgZG9lc24ndCB2ZXJpZnkgKFZlcmlmeUVycm9yLCBqYXZhYyBjb21waWxlcyBjb3JyZWN0bHkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NTY3Ij4yNDk1Njc8L2E+CitJbmNvcnJlY3QgYmVoYXZpb3Igb2YgVXRpbC5nZXRVbnJlc29sdmVkSmF2YUVsZW1lbnQoLi4uKSBtZXRob2QKKworPGEgbmFtZT0idl85MTciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0zIC0gT2N0b2JlciAxNCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MTcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTE3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+RHVwbGljYXRlIGNsYXNzcGF0aCBlbnRyaWVzIGFyZSBubyBsb25nZXIgcmVwb3J0ZWQgaWYgdGhleSBhcmUgZHVwbGljYXRlIGJlY2F1c2Ugb2YgdGhlIGNsYXNzcGF0aCByZXNvbHV0aW9uCisgICAgICAoZS5nLiBpZiB0d28gY2xhc3NwYXRoIGNvbnRhaW5lcnMgYWRkIHRoZSBzYW1lIGVudHJ5IHRvIHRoZSByZXNvbHZlZCBjbGFzc3BhdGgpLgorICAgICAgIER1cGxpY2F0ZSBjbGFzc3BhdGggZW50cmllcyBhdCB0aGUgcmF3IGNsYXNzcGF0aCBsZXZlbCBhcmUgc3RpbGwgcmVwb3J0ZWQuCisgICAgICAgU2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NTIyNiI+YnVnIDE3NTIyNjwvYT4gZm9yIGRldGFpbHMuCis8L2xpPgorPGxpPgorQWRkZWQgYSBuZXcgY29tcGlsZXIgd2FybmluZyB0byByZXBvcnQgYSBtaXNzaW5nIGhhc2hDb2RlKCkgbWV0aG9kIHdoZW4gb3ZlcnJpZGluZyB0aGUgZXF1YWxzKCkgbWV0aG9kIGZyb20gT2JqZWN0LiAKK1RoaXMgZGlhZ25vc2lzIGlzIGNvbnRyb2xsZWQgYnkgb3B0aW9uOiAKKzxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfSEFTSENPREVfTUVUSE9EPC9jb2RlPiBhbmQgcHJvZHVjZXMgYSBwcm9ibGVtIG1hcmtlciB3aGljaCBJRCBpcworPGNvZGU+SVByb2JsZW0uTWlzc2luZ0hhc2hDb2RlTWV0aG9kPC9jb2RlPiBwcm9ibGVtIElELgorPHByZT4KKyAgQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgTWlzc2luZyBIYXNoQ29kZSBNZXRob2QuCisgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgdHlwZQorICBvdmVycmlkZXMgT2JqZWN0LmVxdWFscyhPYmplY3QpIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBoYXNoQ29kZSgpLgorICBPcHRpb24gaWQ6ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZCIKKyAgUG9zc2libGUgdmFsdWVzOiB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICBEZWZhdWx0OiAiaWdub3JlIgorPC9wcmU+Cis8L2xpPgorPGxpPlRoZSAiQ2xhc3MtUGF0aDoiIGNsYXVzZSBvZiBhIGphciBtYW5pZmVzdCBpcyBub3cgaG9ub3JlZCBpbiB0aGUgSmF2YSBtb2RlbC4gSmFycyByZWZlcmVuY2VkIGJ5ICJDbGFzcy1QYXRoOiIgYXJlIG5vdyBhdXRvbWF0aWNhbGx5CisgICAgICBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aC4gU2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODU3MiI+YnVnIDE5ODU3MjwvYT4gZm9yIGRldGFpbHMuPC9saT4KKzxsaT5Db2RlIFNlbGVjdCBzZWFyY2ggdHlwZXMgb3V0c2lkZSB0aGUgY3VycmVudCBwcm9qZWN0IHNjb3BlIGlmIG5vIHR5cGVzIGFyZSBmb3VuZCBpbiB0aGlzIHNjb3BlPC9saT4KKzxsaT5Db2RlIEFzc2lzdCBvcGVyYXRpb24gY2FuIGJlIGNhbGxlZCB3aXRoIGEgcHJvZ3Jlc3MgbW9uaXRvcjoKKzxwcmU+CitwdWJsaWMgaW50ZXJmYWNlIElDb2RlQXNzaXN0IHsKKwkvKioKKwkgKiBQZXJmb3JtcyBjb2RlIGNvbXBsZXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbiBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yLiBUaGUgJmx0O2NvZGUmZ3Q7b2Zmc2V0Jmx0Oy9jb2RlJmd0OworCSAqIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIsIGFmdGVyIHdoaWNoIGNvZGUgYXNzaXN0IGlzIGRlc2lyZWQuCisJICogQW4gJmx0O2NvZGUmZ3Q7b2Zmc2V0Jmx0Oy9jb2RlJmd0OyBvZiAtMSBpbmRpY2F0ZXMgdG8gY29kZSBhc3Npc3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzCisJICogY29tcGlsYXRpb24gdW5pdC4KKwkgKiBJdCBjb25zaWRlcnMgdHlwZXMgaW4gdGhlIHdvcmtpbmcgY29waWVzIHdpdGggdGhlIGdpdmVuIG93bmVyIGZpcnN0LiBJbiBvdGhlciB3b3JkcywKKwkgKiB0aGUgb3duZXIncyB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogaW4gdGhlIHdvcmtzcGFjZS4KKwkgKiAmbHQ7cCZndDsKKwkgKiBOb3RlIHRoYXQgaWYgYSB3b3JraW5nIGNvcHkgaXMgZW1wdHksIGl0IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCisJICogdW5pdCBoYWQgYmVlbiBkZWxldGVkLgorCSAqICZsdDsvcCZndDsKKwkgKgorCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbgorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yCisJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSBhc3Npc3QgY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOiZsdDt1bCZndDsKKwkgKiAgJmx0O2xpJmd0O1RoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKSZsdDsvbGkmZ3Q7CisJICogICZsdDtsaSZndDsgVGhlIHBvc2l0aW9uIHNwZWNpZmllZCBpcyAmbHQ7IC0xIG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQncworCSAqICAgICAgc291cmNlIGxlbmd0aCAoSU5ERVhfT1VUX09GX0JPVU5EUykKKwkgKiAmbHQ7L3VsJmd0OworCSAqCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgJmx0O2NvZGUmZ3Q7cmVxdWVzdG9yJmx0Oy9jb2RlJmd0OyBpcyAmbHQ7Y29kZSZndDtudWxsJmx0Oy9jb2RlJmd0OworCSAqIEBzaW5jZSAzLjAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjb2RlQ29tcGxldGUoaW50LCBDb21wbGV0aW9uUmVxdWVzdG9yLCBXb3JraW5nQ29weU93bmVyKX0gaW5zdGVhZC4KKwkgKi8KKwl2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBQZXJmb3JtcyBjb2RlIGNvbXBsZXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbiBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yLiBUaGUgJmx0O2NvZGUmZ3Q7b2Zmc2V0Jmx0Oy9jb2RlJmd0OworCSAqIGlzIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIsIGFmdGVyIHdoaWNoIGNvZGUgYXNzaXN0IGlzIGRlc2lyZWQuCisJICogQW4gJmx0O2NvZGUmZ3Q7b2Zmc2V0Jmx0Oy9jb2RlJmd0OyBvZiAtMSBpbmRpY2F0ZXMgdG8gY29kZSBhc3Npc3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzCisJICogY29tcGlsYXRpb24gdW5pdC4KKwkgKiAmbHQ7cCZndDsKKwkgKgorCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbgorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSBhc3Npc3QgY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOiZsdDt1bCZndDsKKwkgKiAgJmx0O2xpJmd0O1RoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKSZsdDsvbGkmZ3Q7CisJICogICZsdDtsaSZndDsgVGhlIHBvc2l0aW9uIHNwZWNpZmllZCBpcyAmbHQ7IC0xIG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQncworCSAqICAgICAgc291cmNlIGxlbmd0aCAoSU5ERVhfT1VUX09GX0JPVU5EUykKKwkgKiAmbHQ7L3VsJmd0OworCSAqCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgJmx0O2NvZGUmZ3Q7cmVxdWVzdG9yJmx0Oy9jb2RlJmd0OyBpcyAmbHQ7Y29kZSZndDtudWxsJmx0Oy9jb2RlJmd0OworCSAqIEBzaW5jZSAzLjAKKyAJICovCisJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Cit9CisKK3B1YmxpYyBpbnRlcmZhY2UgSVR5cGUgeworCS8qKgorCSAqIERvIGNvZGUgY29tcGxldGlvbiBpbnNpZGUgYSBjb2RlIHNuaXBwZXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdHlwZS4KKwkgKgorCSAqIElmIHRoZSB0eXBlIGNhbiBhY2Nlc3MgdG8gaGlzIHNvdXJjZSBjb2RlIGFuZCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIHZhbGlkLAorCSAqIHRoZW4gY29tcGxldGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBzb3VyY2UuIE90aGVyd2lzZSB0aGUgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKKwkgKiBhZ2FpbnN0IHR5cGUgc3RydWN0dXJlIGFuZCBnaXZlbiBsb2NhbHMgdmFyaWFibGVzLgorCSAqCisJICogQHBhcmFtIHNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAorCSAqIEBwYXJhbSBpbnNlcnRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc291cmNlIHdoZXJlIHRoZSBzbmlwcGV0CisJICogaXMgaW5zZXJ0ZWQuIFRoaXMgcG9zaXRpb24gbXVzdCBub3QgYmUgaW4gY29tbWVudHMuCisJICogQSBwb3NzaWJsZSB2YWx1ZSBpcyAtMSwgaWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBrbm93bi4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGhpbiBzbmlwcGV0IHdoZXJlIHRoZSB1c2VyCisJICogaXMgcGVyZm9ybWluZyBjb2RlIGFzc2lzdC4KKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZAorCSAqIHR5cGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU5hbWVzIGFuIGFycmF5IChwb3NzaWJseSBlbXB0eSkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMKKwkgKiB0aGF0IGFyZSB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVNb2RpZmllcnMgYW4gYXJyYXkgKHBvc3NpYmxlIGVtcHR5KSBvZiBtb2RpZmllcnMgZm9yCisJICogbG9jYWwgdmFyaWFibGVzCisJICogQHBhcmFtIGlzU3RhdGljIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2NvcGUgaXMgaW4gYSBzdGF0aWMgY29udGV4dAorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdG9yCisJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHNpbmNlIDMuNQorCSAqLworCXZvaWQgY29kZUNvbXBsZXRlKAorCQljaGFyW10gc25pcHBldCwKKwkJaW50IGluc2VydGlvbiwKKwkJaW50IHBvc2l0aW9uLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsCisJCWludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsCisJCWJvb2xlYW4gaXNTdGF0aWMsCisJCUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBEbyBjb2RlIGNvbXBsZXRpb24gaW5zaWRlIGEgY29kZSBzbmlwcGV0IGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHR5cGUuCisJICogSXQgY29uc2lkZXJzIHR5cGVzIGluIHRoZSB3b3JraW5nIGNvcGllcyB3aXRoIHRoZSBnaXZlbiBvd25lciBmaXJzdC4gSW4gb3RoZXIgd29yZHMsCisJICogdGhlIG93bmVyJ3Mgd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworCSAqIGluIHRoZSB3b3Jrc3BhY2UuCisJICogJmx0O3AmZ3Q7CisJICogTm90ZSB0aGF0IGlmIGEgd29ya2luZyBjb3B5IGlzIGVtcHR5LCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgorCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKiAmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7CisJICogSWYgdGhlIHR5cGUgY2FuIGFjY2VzcyB0byBoaXMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCisJICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAorCSAqIGFnYWluc3QgdHlwZSBzdHJ1Y3R1cmUgYW5kIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCisJICogJmx0Oy9wJmd0OworCSAqCisJICogQHBhcmFtIHNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAorCSAqIEBwYXJhbSBpbnNlcnRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc291cmNlIHdoZXJlIHRoZSBzbmlwcGV0CisJICogaXMgaW5zZXJ0ZWQuIFRoaXMgcG9zaXRpb24gbXVzdCBub3QgYmUgaW4gY29tbWVudHMuCisJICogQSBwb3NzaWJsZSB2YWx1ZSBpcyAtMSwgaWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBrbm93bi4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlcgorCSAqIGlzIHBlcmZvcm1pbmcgY29kZSBhc3Npc3QuCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMgYW4gYXJyYXkgKHBvc3NpYmx5IGVtcHR5KSBvZiBmdWxseSBxdWFsaWZpZWQKKwkgKiB0eXBlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzCisJICogdGhhdCBhcmUgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzY29wZQorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzIGFuIGFycmF5IChwb3NzaWJsZSBlbXB0eSkgb2YgbW9kaWZpZXJzIGZvcgorCSAqIGxvY2FsIHZhcmlhYmxlcworCSAqIEBwYXJhbSBpc1N0YXRpYyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjb3BlIGlzIGluIGEgc3RhdGljIGNvbnRleHQKKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3RvcgorCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwl2b2lkIGNvZGVDb21wbGV0ZSgKKwkJY2hhcltdIHNuaXBwZXQsCisJCWludCBpbnNlcnRpb24sCisJCWludCBwb3NpdGlvbiwKKwkJY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywKKwkJY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLAorCQlpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAorCQlib29sZWFuIGlzU3RhdGljLAorCQlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJV29ya2luZ0NvcHlPd25lciBvd25lciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQorCitwdWJsaWMgaW50ZXJmYWNlIElFdmFsdWF0aW9uQ29udGV4dCB7CisJLyoqCisJICogUGVyZm9ybXMgYSBjb2RlIGNvbXBsZXRpb24gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yLgorCSAqICZsdDtwJmd0OworCSAqIE5vdGUgdGhhdCBjb2RlIGNvbXBsZXRpb24gZG9lcyBub3QgaW52b2x2ZSBldmFsdWF0aW9uLgorCSAqICZsdDtwJmd0OworCSAqCisJICogQHBhcmFtIGNvZGVTbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQgdG8gY29tcGxldGUgaW4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgY29kZSBzbmlwcGV0IHRvIGNvbXBsZXRlIGF0LAorCSAqICAgb3IgLTEgaW5kaWNhdGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzbmlwcGV0CisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29kZSBjb21wbGV0aW9uIHJlcXVlc3RvciBjYXBhYmxlIG9mIGFjY2VwdGluZyBhbGwKKwkgKiAgICBwb3NzaWJsZSB0eXBlcyBvZiBjb21wbGV0aW9ucworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSBjb21wbGV0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiAgJmx0O3VsJmd0OworCSAqCSAgJmx0O2xpJmd0O1RoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaXMgbGVzcyB0aGFuIC0xIG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc25pcHBldCdzCisJICoJICAgIGxlbmd0aCAoSU5ERVhfT1VUX09GX0JPVU5EUykmbHQ7L2xpJmd0OworCSAqICAmbHQ7L3VsJmd0OworCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoCisJCVN0cmluZyBjb2RlU25pcHBldCwKKwkJaW50IHBvc2l0aW9uLAorCQlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUGVyZm9ybXMgYSBjb2RlIGNvbXBsZXRpb24gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yLgorCSAqIEl0IGNvbnNpZGVycyB0eXBlcyBpbiB0aGUgd29ya2luZyBjb3BpZXMgd2l0aCB0aGUgZ2l2ZW4gb3duZXIgZmlyc3QuIEluIG90aGVyIHdvcmRzLAorCSAqIHRoZSBvd25lcidzIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKKwkgKiBpbiB0aGUgd29ya3NwYWNlLgorCSAqICZsdDtwJmd0OworCSAqIE5vdGUgdGhhdCBpZiBhIHdvcmtpbmcgY29weSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KKwkgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuCisJICogJmx0Oy9wJmd0OworCSAqICZsdDtwJmd0OworCSAqIE5vdGUgdGhhdCBjb2RlIGNvbXBsZXRpb24gZG9lcyBub3QgaW52b2x2ZSBldmFsdWF0aW9uLgorCSAqICZsdDtwJmd0OworCSAqCisJICogQHBhcmFtIGNvZGVTbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQgdG8gY29tcGxldGUgaW4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgY29kZSBzbmlwcGV0IHRvIGNvbXBsZXRlIGF0LAorCSAqICAgb3IgLTEgaW5kaWNhdGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzbmlwcGV0CisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29kZSBjb21wbGV0aW9uIHJlcXVlc3RvciBjYXBhYmxlIG9mIGFjY2VwdGluZyBhbGwKKwkgKiAgICBwb3NzaWJsZSB0eXBlcyBvZiBjb21wbGV0aW9ucworCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSBjb21wbGV0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiAgJmx0O3VsJmd0OworCSAqCSAgJmx0O2xpJmd0O1RoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaXMgbGVzcyB0aGFuIC0xIG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc25pcHBldCdzCisJICoJICAgIGxlbmd0aCAoSU5ERVhfT1VUX09GX0JPVU5EUykmbHQ7L2xpJmd0OworCSAqICAmbHQ7L3VsJmd0OworCSAqIEBzaW5jZSAzLjUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoCisJCVN0cmluZyBjb2RlU25pcHBldCwKKwkJaW50IHBvc2l0aW9uLAorCQlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJV29ya2luZ0NvcHlPd25lciBvd25lciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA2ODUiPjI1MDY4NTwvYT4KK1thc3Npc3RdIENvZGUgYXNzaXN0IGNhbiBib3QgYmUgY2FuY2VsZWQgd2hlbiBzZWFyY2ggaW5kZXhlcyBhcmUgbm90IHJlYWR5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMDgzIj4yNTAwODM8L2E+CitbbW9kZWxdIFNlYXJjaCBpbmRleGVzIGFyZSBub3QgY29ycmVjdGx5IHVwZGF0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzUyMjYiPjE3NTIyNjwvYT4KK1tidWlsZHBhdGhdIEJ1aWxkIHBhdGggY29udGFpbnMgZHVwbGljYXRlIGVudHJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3NTEiPjM4NzUxPC9hPgorT3B0aW9uYWxseSBzaG93IGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBlcXVhbHMoKSBpcyBvdmVycmlkZW4gYnV0IGhhc2hDb2RlKCkgaXMgbm90Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5OTMwIj4yNDk5MzA8L2E+CitEZWFkbG9jayB3aXRoIEphdmFNb2RlbE1hbmFnZXIkUGVyUHJvamVjdEluZm8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAzOTgiPjI1MDM5ODwvYT4KK1thc3Npc3RdIEZhdWx0cyBpbiBqYXZhZG9jIG9mIElUeXBlI2NvZGVDb21wbGV0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Nzk0MSI+MjQ3OTQxPC9hPgorW2Fzc2lzdF0gQWRkIHByb2dyZXNzIG1vbml0b3IgdG8gY29kZSBjb21wbGV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzODIwIj4yNDM4MjA8L2E+CitbMS41XVtjb21waWxlcl0gTWV0aG9kIGhhcyBzYW1lIGVyYXN1cmUgYXMgYW4gaW50ZXJmYWNlIG1ldGhvZCBidXQgaXMgbm90IGNvbnNpZGVyZWQgdG8gaW1wbGVtZW50IGl0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyODgwIj4yMzI4ODA8L2E+Citbc2VsZWN0XSBOYXZpZ2F0ZSB0byBjbGFzc2VzIGluIHdvcmtzcGFjZSBldmVuIGlmIG5vdCBvbiBjbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTg1NzIiPjE5ODU3MjwvYT4KK2VjbGlwc2UgZG9lcyBub3QgcmVzcGVjdCBjbGFzcy1wYXRoIG1hbmlmZXN0IG9mIGV4dGVybmFsIGphcnMKKworPGEgbmFtZT0idl85MTYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0zIC0gT2N0b2JlciA3LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkxNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MTYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4KK1RoZSBuZXcgY29tcGlsZXIgd2FybmluZyAoYWRkZWQgZHVyaW5nIDMuNU0xKSB0byBzaWduYWwgYWJzZW5jZSBvZiA8Y29kZT5zeW5jaHJvbml6ZWQ8L2NvZGU+IG1vZGlmaWVyIAord2hlbiBvdmVycmlkaW5nIGEgc3luY2hyb25pemVkIG1ldGhvZCBnb3QgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKzxwcmU+CisgIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgU3luY2hyb25pemVkIE1vZGlmaWVyIE9uIEluaGVyaXRlZCBNZXRob2QuCisgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgbWV0aG9kCisgIG92ZXJyaWRlcyBhIHN5bmNocm9uaXplZCBtZXRob2Qgd2l0aG91dCBoYXZpbmcgYSBzeW5jaHJvbml6ZWQgbW9kaWZpZXIuCisgIE9wdGlvbiBpZDogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kIgorICBQb3NzaWJsZSB2YWx1ZXM6IHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisgIERlZmF1bHQ6ICJpZ25vcmUiCis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTE0MCI+MjQ5MTQwPC9hPgorWzEuNV1bY29tcGlsZXJdIGFzeW1tZXRyaWMgZXJyb3JzIHdpdGggY292YXJpYW50IGluaGVyaXRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NzYyIj4yNDQ3NjI8L2E+CitbMS41XVtjb21waWxlcl0gSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGFmdGVyIGltcG9ydGluZyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTI3Ij4yMjc1Mjc8L2E+CitbMS41XVtjb21waWxlcl0gVXNlbGVzcyBlcnJvciBtZXNzYWdlIGZvciBsb2NhbCBlbnVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTMwIj4yMjc1MzA8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb21wbGV0ZSBlcnJvciBtZXNzYWdlIGZvciBhbm5vdGF0aW9uIGluc2lkZSBhIG1lbWJlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3OTgxIj4yNDc5ODE8L2E+CitzYXZlIG9uIGEgc2luZ2xlIGZpbGUgKGFueSB0eXBlIC0gamF2YSBzb3VyY2UsIHRleHQgZmlsZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NTg0Ij4yNDk1ODQ8L2E+CitDb21waWxlclBhcnRpY2lwYW50IGNvbnN0YW50cyBzaG91bGQgYmUgbWFya2VkIGFzIHN1Y2gKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE5NzciPjE2MTk3NzwvYT4KK1tjb21waWxlcl0gSWRlbnRpY2FsIGJyYW5jaGVzIGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmcjc3ludGhldGljTWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTUzNSI+MjQ5NTM1PC9hPgorW2NvbXBpbGVyXSBDb25zaWRlciBkaXNhYmxpbmcgdGhlIHN5bmNPdmVycmlkZSB3YXJuaW5nL2Vycm9yIGJ5IGRlZmF1bHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDc2NjYiPjI0NzY2NjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBBSU9PQkUgaW5zaWRlIG1pc3NpbmcgdHlwZSByZXBvcnRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDkzMjEiPjI0OTMyMTwvYT4KK0lQYWNrYWdlckZyYWdtZW50Um9vdCNnZXRSYXdDbGFzc3BhdGhFbnRyeSgpIHJldHVybnMgcmVzb2x2ZWQgJnF1b3Q7Li4mcXVvdDsgcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTEwNyI+MjQ5MTA3PC9hPgorW2NvbXBpbGVyXSBJbGxlZ2FsQWNjZXNzRXJyb3IgaW4gcHJlc2VuY2Ugb2Ygc3ludGhldGljIGZpZWxkIGFjY2VzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Nzk1MyI+MjQ3OTUzPC9hPgorWzEuNV1bY29tcGlsZXJdIElsbGVnYWxBY2Nlc3NFcnJvcjogdHJpZWQgdG8gYWNjZXNzIGNsYXNzIHAuSUEgZnJvbSBjbGFzcyBYCisKKzxhIG5hbWU9InZfOTE1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMyAtIFNlcHRlbWJlciAzMCwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MTUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTE1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgIi4uIiBpbiBjbGFzc3BhdGggZm9yIGxpYnJhcnksIHZhcmlhYmxlIGFuZCBjb250YWluZXIgZW50cmllcy4KKwkJU2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3NzMyIj5idWcgNTc3MzI8L2E+IGZvciBkZXRhaWxzLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODY4MCI+MjQ4NjgwPC9hPgorRXJyb3Igd2hlbiBjcmVhdGUgYSBuZXcgZWxlbWVudCAoY2xhc3MsIGludGVyZmFjZSwuLi4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTc3MzIiPjU3NzMyPC9hPgorW2J1aWxkcGF0aF0gcmVsYXRpdmUgYnVpbGQgY2xhc3NwYXRoIGxlYWRpbmcgb3V0c2lkZSBvZiBlY2xpcHNlIHdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzYxMiI+MjQ3NjEyPC9hPgorW2NvbXBpbGVyXSBDb21waWxlciBjb3VsZCBhdm9pZCBhbGxvY2F0aW5nIGZpZWxkIGJpbmRpbmdzIGZvciByZWNlaXZlciB0eXBlIGNoYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Nzc1NyI+MjQ3NzU3PC9hPgorW21vZGVsXSBNb3ZlIGEgY2xhc3MgdG8gcm9vdCBwYWNrYWdlLCBsb3NlIGJsb2NrIGNvbW1lbnQgYXQgdGhlIHRvcAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTQwMCI+MjQxNDAwPC9hPgorW0xpbmtlZFJlc291cmNlc10gUmFuZG9tIGVycm9ycyB3aGVuIGNoYW5naW5nIHByb2plY3Qgc2V0dGluZ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMTMiPjI0ODMxMzwvYT4KK1tET01dIEphdmFkb2MgYnVnIGluIFN0cmluZ0xpdGVyYWwjc2V0TGl0ZXJhbFZhbHVlKFN0cmluZykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMDgiPjI0ODMwODwvYT4KK1R5cG8gaW4gSmF2YWRvYyBvZiBJQmluZGluZyNnZXRBbm5vdGF0aW9ucygpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4MjQzIj4yNDgyNDM8L2E+CitBZGQgYXB0LnBsdWdnYWJsZS5jb3JlIGFzIHgtZnJpZW5kIGZvciBqZHQuY29yZQorCis8YSBuYW1lPSJ2XzkxNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTMgLSBTZXB0ZW1iZXIgMjMsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTE0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkxNCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzgzNSI+MjQ3ODM1PC9hPgorU2VhcmNoUGF0dGVybiBleHRlbmRzIG5vbi1BUEkgdHlwZSBJbnRlcm5hbFNlYXJjaFBhdHRlcm4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU4NTgiPjI0NTg1ODwvYT4KK0NvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIG5vbi1BUEkgdHlwZSBJbnRlcm5hbENvbXBsZXRpb25Qcm9wb3NhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzY4OCI+MjQ3Njg4PC9hPgorU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBub24tQVBJIHR5cGUgSW50ZXJuYWxTZWFyY2hEb2N1bWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTg2MCI+MjQ1ODYwPC9hPgorQnVpbGRDb250ZXh0IGV4dGVuZHMgbm9uLUFQSSB0eXBlIENvbXBpbGF0aW9uUGFydGljaXBhbnRSZXN1bHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDcyOTIiPjI0NzI5MjwvYT4KK1tjb21waWxlcl0gQ29tcGlsZXIgc2hvdWxkIGF2b2lkIGFsbG9jYXRpbmcgbWV0aG9kIGJpbmRpbmdzIGZvciByZWNlaXZlciB0eXBlIGNoYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTgzNSI+MjQ1ODM1PC9hPgorQ29tcGxldGlvbkNvbnRleHQgZXh0ZW5kcyBub24tQVBJIHR5cGUgSW50ZXJuYWxDb21wbGV0aW9uQ29udGV4dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzYxOCI+MjQ3NjE4PC9hPgorKlJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgbm9uLUFQSSB0eXBlIEludGVybmFsUmVmZXJlbmNlTWF0Y2gKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDczMDciPjI0NzMwNzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBBcnJheSBjbG9uZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgZ292ZXJuZWQgYnkgc291cmNlIGxldmVsIGluc3RlYWQgb2YgY29tcGxpYW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODU2MyI+MTI4NTYzPC9hPgorW2NvbXBpbGVyXSBJbm5lciBjbGFzcyBjb21waWxlcyBidXQgSWxsZWdhbEFjY2Vzc0Vycm9yIGlmIHNwbGl0dGVkIHdpdGggdHdvIG91dHB1dCBmb2xkZXJzCisKKzxhIG5hbWU9InZfOTEzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMiAtIFNlcHRlbWJlciAxMywgMjAwOCAtIDMuNSBNSUxFU1RPTkUgMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MTMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTEzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2OTU1Ij4yNDY5NTU8L2E+CitBZGQgQVBJIGNvbXBhdGliaWxpdHkgZmlsdGVyIGZvciBJVHlwZVJvb3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTEwNTQiPjIxMTA1NDwvYT4KK1tqYXZhZG9jXSBAc2VlIHBhY2thZ2UgcmVmZXJlbmNlIHNob3VsZCByYWlzZSBhIHdhcm5pbmcgZXhjZXB0IGZvciB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzY5MiI+MjQzNjkyPC9hPgorW2J1aWxkcGF0aF0gQ2Fubm90IHNldCBBdHRhY2hlZCBTb3VyY2UgZnJvbSBDbGFzcyBGaWxlIEVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzc2NSI+MjA3NzY1PC9hPgorW2phdmFkb2NdIEphdmFkb2Mgd2FybmluZyBvbiBAc2VlIHJlZmVyZW5jZSBjb3VsZCBiZSBpbXByb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzExOCI+MjQ3MTE4PC9hPgorRW5kbGVzcyBsb29wIGluIFNpZ25hdHVyZS5lbmNvZGVRdWFsaWZpZWROYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0MTY0Ij4yNDQxNjQ8L2E+CitbMS41XVtjb21waWxlcl0gTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBlcnJvciB3aGVuIHJlZmVyZW5jaW5nIGEgZ2VuZXJpYyBmaWVsZCB3aXRoIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMTg3Ij4yMzMxODc8L2E+CitbamF2YWRvY10gcGFydGlhbGx5IHF1YWxpZmllZCBpbm5lciB0eXBlcyAgc2hvdWxkIGJlIHdhcm5lZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDYzNyI+MTcwNjM3PC9hPgorW2phdmFkb2NdIGluY29ycmVjdCB3YXJuaW5nIGFib3V0IG1pc3NpbmcgcGFyYW1ldGVyIGphdmFkb2Mgd2hlbiB1c2luZyBtYW55IGxpbmtzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyOTkwIj4xNDI5OTA8L2E+CitbbW9kZWxdIFJlbmFtZSBvcGVyYXRpb24gc2hvdWxkIG5vdCB1c2Ugd29ya3NwYWNlIHJvb3QgcnVsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjcxMiI+MjQ2NzEyPC9hPgorW2phdmFkb2NdIFVuZXhwZWN0ZWQgd2FybmluZyBhYm91dCBtaXNzaW5nIHBhcmFtZXRlciBkb2MgaW4gY2FzZSBvZiBAaW5oZXJpdERvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjY4MiI+MjQ2NjgyPC9hPgorSW5jb25zaXN0ZW50IHBhcnNlci9zY2FubmVyIGVuY29kaW5nIGZvciBjb21tZW50U3RhcnQgcG9zaXRpb24KKworPGEgbmFtZT0idl85MTIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0yIC0gU2VwdGVtYmVyIDksIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTEyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkxMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkludHJvZHVjZWQgYSBtYXJrZXIgY29tbWVudCAoPGNvZGU+JEZBTEwtVEhST1VHSCQ8L2NvZGU+KSBmb3Igc2lsZW5jaW5nIGNvbXBpbGVyIGRpYWdub3NpcyBmb3Igc3dpdGNoIGNhc2UgCitmYWxsaW5nIHRocm91Z2ggbmV4dCBjYXNlLiBUaGlzIGFsbG93cyB0byBkb2N1bWVudCBpbnRlbmRlZCBmYWxsIHRocm91Z2ggc2l0dWF0aW9ucyBpbiB0aGUgY29kZS4KK05vdGU6IFRoZSBtYXJrZXIgY29tbWVudCBjYW4gYWxzbyBiZSBhIGJsb2NrIGNvbW1lbnQsIGkuZS4gPGNvZGU+LyogJEZBTEwtVEhST1VHSCQgKi88L2NvZGU+LgorPGJyPmUuZy4gCis8cHJlPgorICAgIHN3aXRjaCh2YWwpIHsKKyAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICAgIGRvaXQoMCk7CisgICAgICAgICAgICAvLyAkRkFMTC1USFJPVUdIJCAtIGFsc28gZmFsbCBpbnRvIG5leHQgY2FzZQorICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRvaXQoMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTI1NyI+MjQ1MjU3PC9hPgorW2NvbXBpbGVyXSBBbGxvdyB0byBzdXBwcmVzcyBmYWxsLXRocm91Z2ggd2FybmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDAzNCI+MjQwMDM0PC9hPgorW2J1aWxkcGF0aF0gRWNsaXBzZSBpZ25vcmVzIC5jbGFzc3BhdGggZmlsZSBpZiBpdCBpcyBlbmNvZGVkIGluIFVURjggd2l0aCBCT00KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU5NjMiPjI0NTk2MzwvYT4KK2RlcHJlY2F0ZSB1bnVzZWQgSmF2YUNvcmUuQ09NUElMRVJfUEJfQk9PTEVBTl9NRVRIT0RfVEhST1dJTkdfRVhDRVBUSU9OCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3NzcyIj4yMzc3NzI8L2E+CitbaW1wbGVtZW50YXRpb25dIERlYWRsb2NrIGluIEpEVCBjYXVzaW5nIFVJIGZyZWV6ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDExNiI+MTE0MTE2PC9hPgorW2Fzc2lzdF0gbmFtZSBzdWdnZXN0aW9uIGZvciBjb2xsZWN0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjA2NiI+MjQ2MDY2PC9hPgorW2JhdGNoXSBSZWR1bmRhbnQgc3VwZXJpbnRlcmZhY2Ugd2FybmluZyBjYW5ub3QgYmUgYWN0aXZhdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1OTczIj4yNDU5NzM8L2E+CitbY29tcGlsZXJdIFByb2JsZW0gaXJyaXRhbnQgY2Fubm90IGV4Y2VlZCA2NGJpdCBsaW1pdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDg0OSI+MjQ0ODQ5PC9hPgorW2ltcGxlbWVudGF0aW9uXSBNZW1vcnkgbGVhayBpbiBEZWx0YVByb2Nlc3NpbmdTdGF0ZSNleHRlcm5hbFRpbWVTdGFtcHMgPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzY1NyI+MjA3NjU3PC9hPgorW3NlYXJjaF0gRXhjZXB0aW9uIHdoZW4gcmVmYWN0b3JpbmcgbWVtYmVyIHR5cGUgdG8gdG9wLWxldmVsLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzAyMyI+MjQzMDIzPC9hPgorW2NvbnRlbnQgYXNzaXN0XSBSdW50aW1lRXhjZXB0aW9uIHRocm93biBieSBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyCisKKzxhIG5hbWU9InZfOTExIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMiAtIFNlcHRlbWJlciAyLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkxMQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MTEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4KK0FkZGVkIGEgbmV3IGNvbXBpbGVyIHdhcm5pbmcgdG8gc2lnbmFsIGFic2VuY2Ugb2YgPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPiBtb2RpZmllciB3aGVuIG92ZXJyaWRpbmcgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLiAKK1RoaXMgZGlhZ25vc2lzIGlzIGNvbnRyb2xsZWQgYnkgb3B0aW9uOiAKKzxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX01JU1NJTkdfU1lOQ0hST05JWkVEX09OX0lOSEVSSVRFRF9NRVRIT0Q8L2NvZGU+IGFuZCBwcm9kdWNlcyBhIHByb2JsZW0gbWFya2VyIHdoaWNoIElEIGlzCis8Y29kZT5JUHJvYmxlbS5NaXNzaW5nU3luY2hyb25pemVkTW9kaWZpZXJJbkluaGVyaXRlZE1ldGhvZDwvY29kZT4gcHJvYmxlbSBJRDsKK2l0IG1heSBiZSBzdXBwcmVzc2VkIHVzaW5nIDxjb2RlPkBTdXBwcmVzc1dhcm5pbmdzKCJzdXBlciIpPC9jb2RlPi4KKzxwcmU+CisgIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIE1pc3NpbmcgU3luY2hyb25pemVkIE1vZGlmaWVyIE9uIEluaGVyaXRlZCBNZXRob2QuCisgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGEgbWV0aG9kCisgIG92ZXJyaWRlcyBhIHN5bmNocm9uaXplZCBtZXRob2Qgd2l0aG91dCBoYXZpbmcgYSBzeW5jaHJvbml6ZWQgbW9kaWZpZXIuCisgIE9wdGlvbiBpZDogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kIgorICBQb3NzaWJsZSB2YWx1ZXM6IHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisgIERlZmF1bHQ6ICJ3YXJuaW5nIgorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjI5MDAiPjIyMjkwMDwvYT4KK1tKYXZhZG9jXSBNaXNzaW5nIGRlc2NyaXB0aW9uIGlzIHdhcm5lZCBpZiB2YWxpZCBkZXNjcmlwdGlvbiBpcyBvbiBhIG5ldyBsaW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2ODU4Ij4xODY4NTg8L2E+CitJbnRlcm1pdHRlbnQgZmFpbHVyZSBvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5FeGNsdXNpb25QYXR0ZXJuc1Rlc3RzI3Rlc3RDcmVhdGVFeGNsdWRlZFBhY2thZ2UyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3NDUzIj4yMzc0NTM8L2E+CitbZm9ybWF0dGVyXSBTYXZlIGFjdGlvbnMgZmFpbHMgdG8gcmVtb3ZlIGV4Y2VzcyBuZXcgbGluZXMgd2hlbiBzZXQgdG8gJnF1b3Q7Zm9ybWF0IGVkaXRlZCBsaW5lcyZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTgzMCI+MjQ1ODMwPC9hPgorQ2xhc3NwYXRoRW50cnkgaWxsZWdhbGx5IGluc3RhbnRpYXRlcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDIwMjkiPjI0MjAyOTwvYT4KK011bHRpcGxlIHNvdXJjZSBhdHRhY2htZW50IHBhdGhzIGRvbid0IHdvcmsgd2hlbiBzb3VyY2UgYXR0YWNobWVudCBwYXRoIHBvaW50cyB0byBhIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDU4MyI+MjM0NTgzPC9hPgorW2Zvcm1hdHRlcl0gQ29kZSBmb3JtYXR0ZXIgc2hvdWxkIGFkYXB0IGVkaXRzIGluc3RlYWQgb2YgcmVnaW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTU3NiI+MjQ1NTc2PC9hPgorTm8gZXJyb3IgbWVzc2FnZSBmb3IgdXBkYXRpbmcgcmVhZC1vbmx5IC5jbGFzc3BhdGggZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTU2MyI+MjQ1NTYzPC9hPgorbnBlIGluIHJlY29uY2lsZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU1MTgiPjI0NTUxODwvYT4KK0lDb21waWxhdGlvblVuaXQuY3JlYXRlVHlwZSBmYWlsaW5nIHdpdGggdW5leHBlY3RlZCBleGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU0MzUiPjI0NTQzNTwvYT4KK1sxLjVdW2NvbXBpbGVyXSAmcXVvdDtWYWx1ZSBmb3IgYW5ub3RhdGlvbiBhdHRyaWJ1dGUgbXVzdCBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24mcXVvdDsgZXJyb3Igb24gdmFsaWQgY29uc3RhbnQgZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTM0OCI+MjQ1MzQ4PC9hPgorW0RPTV0gQW5ub3RhdGlvbnMgYXJlIHJlY29nbml6ZWQgYnkgQVNUUGFyc2VyIGV2ZW4gaW4gQ09NUElMRVJfU09VUkNFIGlzIHNldCAmbHQ7IDEuNQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTc1MSI+MjQxNzUxPC9hPgorVXNpbmcgYSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciByZXF1aXJlcyB0aGUgdXNlIG9mIHdvcmtzcGFjZSBsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyNDQ4Ij4yNDI0NDg8L2E+CitbMS41XVtjb21waWxlcl0gU3VuJ3MgamF2YWMgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBidXQgamR0IGRvZXMgbm90Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5MDY2Ij4yMzkwNjY8L2E+CitbY29tcGlsZXJdIE92ZXJyaWRpbmcgYSBTeW5jaHJvbml6ZWQgTWV0aG9kIHdpdGggYSBOb24tc3luY2hyb25pemVkIE1ldGhvZAorCis8YSBuYW1lPSJ2XzkxMCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTIgLSBBdWd1c3QgMjYsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTEwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkxMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTA5NiI+MjM5MDk2PC9hPgorSW1wbGVtZW50YXRpb24gb2RkbmVzcyBpbiBUeXBlSGllcmFyY2h5I2dldEFsbFN1cGVyKihJVHlwZSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ1NDkiPjI0NDU0OTwvYT4KK0phdmFDb3JlLmNyZWF0ZShTdHJpbmcgaGFuZGxlSWRlbnRpZmllcikgZmFpbHMgZm9yIGxvY2FsIHZhcmlhYmxlIHdpdGggcGFyYW1ldGVyaXplZCB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxNjg3Ij4yNDE2ODc8L2E+CitbZm9ybWF0dGVyXSBwcm9ibGVtIGZvcm1hdHRpbmcgYmxvY2sgY29tbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDA2ODYiPjI0MDY4NjwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdHRlciBkbyB1bmV4cGVjdGVkIHRoaW5ncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjkzMyI+MjQyOTMzPC9hPgorWzEuNV0gTnVsbFBvaW50ZXJFeGNlcHRpb24gZm9yIEBSYW5nZShtaW49MSwgbWF4PTk5OTk5OTk5OTk5OTk5OTkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxMzQ1Ij4yNDEzNDU8L2E+CitbZm9ybWF0dGVyXSBEaWRuJ3QgRm9ybWF0IEhUTUwgdGFncyBpcyB1bmF2YWlsYWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjY0NiI+MjQyNjQ2PC9hPgorZGVhZGxvY2sgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuRXh0ZXJuYWxGb2xkZXJzTWFuYWdlcgorCis8YSBuYW1lPSJ2XzkwOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTIgLSBBdWd1c3QgMTksIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTA5CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkwOSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDQ3NyI+MjQ0NDc3PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIGZhaWxzIG9uIHNwZWNpYWwgSmF2YSBhcnJheSBjb25zdHJ1Y3QKKworPGEgbmFtZT0idl85MDgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0yIC0gQXVndXN0IDExLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkwOAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MDgiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk4MzMiPjIzOTgzMzwvYT4KK1tjb21waWxlcl0gT2RkIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2UgIklsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBtZXRob2QgLi4uIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzcxNSI+MjQzNzE1PC9hPgorW0RPTV0gUGFyc2VyLmNyZWF0ZUFTVHMoKSB0aHJvd3MgZXhjZXB0aW9uIG9uICdpbGxvZ2ljYWwnIEphdmFEb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM2NTMiPjI0MzY1MzwvYT4KK0FTVFJld3JpdGUgaXMgaW5jb3JyZWN0bHkgZG9jdW1lbnRlZAorCis8YSBuYW1lPSJ2XzkwNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTEgLSBBdWd1c3QgNiwgMjAwOCAtIDMuNSBNSUxFU1RPTkUgMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MDcKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTA3Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyOTYxIj4yNDI5NjE8L2E+IFtET01dIElUeXBlQmluZGluZy5nZXREZWNsYXJlZEZpZWxkcyByZXR1cm5zIGVtcHR5IHJlc3VsdHMgaWYgYW55IGZpZWxkIGhhcyB1bmRlZmluZWQgdHlwZQorCis8YSBuYW1lPSJ2XzkwNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTEgLSBKdWx5IDMxLCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkwNgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MDYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDIyOTIiPjI0MjI5MjwvYT4KK2NhbGwgdG8gY3JlYXRlQVNUKC4uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gcGFyc2VyIHNvdXJjZSBpcyBub3QgY2hhcltdCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4NTAwIj4yMTg1MDA8L2E+CitbZG9tXSBidWcgaW4gSVR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUgZm9yIG1lbWJlciBvZiBsb2NhbCB0eXBlCisKKzxhIG5hbWU9InZfOTA1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMSAtIEp1bHkgMjgsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTA1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkwNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjA5NiI+MjM2MDk2PC9hPgorSW5jb3JyZWN0bHkgYWxsb3cgcmF3IHJldHVybiB0eXBlIGluIG92ZXJyaWRkZW4gbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4MDE0Ij4yMzgwMTQ8L2E+CitbMS41XVtjb21waWxlcl0gTWlzc2luZyAibmFtZSBjbGFzaCIgZXJyb3I/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4ODE3Ij4yMzg4MTc8L2E+CitbMS41XVtjb21waWxlcl0gVW5leHBlY3RlZCBuYW1lY2xhc2ggcmVwb3J0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzc0MTgiPjIzNzQxODwvYT4KK2RlYWRsb2NrIGJldHdlZW4gYXV0by1idWlsZC9yZWZyZXNoIHJpZ2h0IGFmdGVyIHN0YXJ0dXAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDE4NDEiPjI0MTg0MTwvYT4KK1tjb21waWxlcl0gQ29tcGlsYXRpb24gZXJyb3IgJ2luY29tcGF0aWJsZSB0eXBlcycgc2hvdWxkIHVzZSBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTQzOSI+MjM5NDM5PC9hPgorWzEuNV1bY29tcGlsZXJdIEJlaGF2aW9yIGNoYW5nZSBmb3IgYmluZGluZyBmb3IgcGFyYW1ldGVyaXplZCB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2ODIxIj4xMDY4MjE8L2E+CitbYXNzaXN0XSBDb2RlIGFzc2lzdDogRGVwcmVjYXRlZCBlbGVtZW50cyBub3QgbWFya2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5NjM5Ij4yMDk2Mzk8L2E+Citjb2RlU2VsZWN0IGRvZXMgbm90IHJlc29sdmUgY29ycmVjdCBrZXkgZm9yIGltcGxpY2l0IG1ldGhvZCB0eXBlIGFyZ3VtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTExNyI+MjM5MTE3PC9hPgorQVNUIG92ZXJsYXBwaW5nIHNvdXJjZSByYW5nZXMgaW4gcmVjb3ZlcmVkIEFTVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDgzMCI+MjMwODMwPC9hPgorW3NlbGVjdF0gU2VhcmNoIGRvZXNuJ3QgZmluZCBhbm5vdGF0ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gd2l0aCBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTA5MiI+MjI5MDkyPC9hPgorW2JhdGNoIGNvbXBpbGVyXSBlcnJvciByZXBvcnRpbmcgaXMgbm9uLWRldGVybWluaXN0aWMKKworPGEgbmFtZT0idl85MDQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0xIC0gSnVseSAyMSwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MDQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTA0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NjgyIj4xNjk2ODI8L2E+CitJbiBjbGFzcyB0aGF0IGNvbXBpbGVzIGFuZCBydW5zIHdoZW4gY3RybCtzcGFjZSBpcyBwcmVzc2VkIEkgZ2V0ICZxdW90O05vIGNvbXBsZXRpb25zIGF2YWlsYWJsZSZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDgxNSI+MjQwODE1PC9hPgorW0RPTV0gQ0NFIGluIEFTVCNyZXNvbHZlV2VsbEtub3duVHlwZSguLikgIGZvciBqYXZhLmxhbmcuQm9vbGVhbiB3aXRob3V0IHJ0LmphcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTcyNyI+MjM1NzI3PC9hPgorbWlzc3BlbGxpbmcgaW4gc3ludGF4IGVycm9yIG1lc3NhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzYxOTMiPjIzNjE5MzwvYT4KK0RpYWdub3NlUGFyc2VyIGhhcyB1bnJlYWNoYWJsZSBjb2RlCisKKzxhIG5hbWU9InZfOTAzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMSAtIEp1bHkgMTUsIDIwMDgKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfOTAzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12XzkwMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzQ2OSI+MjM3NDY5PC9hPgorW2Fzc2lzdF0gQWJvcnRDb21waWxhdGlvbiBpbiBsb2cgZHVyaW5nIG5vcm1hbCBlZGl0aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjE0Ij4yNDAyMTQ8L2E+CitbY29tcGlsZXJdIGZpbmFsIGJpdCBzaG91bGQgYmUgY2xlYXJlZCBmcm9tIGNsYXNzIGZpbGUgYWNjZXNzIGZsYWcgZm9yIGFub255bW91cyBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDM0OSI+MjQwMzQ5PC9hPgorSW1wcm92ZSBkaXNhc3NlbWJsZXIgb3V0cHV0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjA2Ij4yNDAyMDY8L2E+CitJVHlwZVJvb3Qgc2hvdWxkIGhhdmUgQG5vaW1wbGVtZW50IHRhZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzkzNyI+MjM3OTM3PC9hPgorW2phdmFkb2NdIFdyb25nICZxdW90O0phdmFkb2M6IE1hbGZvcm1lZCBsaW5rIHJlZmVyZW5jZSZxdW90OyBpZiBocmVmIGxhYmVsIGNvbnRhaW5zIC8vCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3OTMxIj4yMzc5MzE8L2E+CitbMS42XVtjb21waWxlcl0gd3Jvbmcgc2lnbmF0dXJlIG9mIFN0cmluZ1tdW10gaW4gY2xhc3MgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTYxMCI+MTAxNjEwPC9hPgorQ29kZSBhc3Npc3Qgbm90IG9mZmVyZWQgd2l0aG91dCB0cmFuc2l0aXZlIGRlcGVuZGVuY3kKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzkyMjkiPjIzOTIyOTwvYT4KK1tjb21waWxlcl0gUmVncmVzc2lvbiBidWcgYWdhaW5zdCBFY2xpcHNlIDMuMzogY2Fubm90IHJlc29sdmUgY29ycmVjdCBpbXBvcnQKKworPGEgbmFtZT0idl85MDIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNU0xIC0gSnVseSA4LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkwMgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MDIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzYzMzYiPjIzNjMzNjwvYT4KK1sxLjZdW2NvbXBpbGVyXSBTdGFjayBtYXAgZ2VuZXJhdGlvbiBlcnJvciB3aXRoIDEwLDAwMC1saW5lIG1ldGhvZCBpbiBKYXZhCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5OTQxIj4yMzk5NDE8L2E+CitbZm9ybWF0dGVyXSBVbmNsb3NlZCBodG1sIHRhZ3MgbWFrZSB0aGUgZm9ybWF0dGVyIHRvIHByb2R1Y2UgaW5jb3JyZWN0IG91dHB1dHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk3MTkiPjIzOTcxOTwvYT4KK1tmb3JtYXR0ZXJdIENvZGUgZm9ybWF0dGVyIGRlc3Ryb3lzIHByZSBmb3JtYXR0ZWQgamF2YWRvYyBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzODkyMyI+MjM4OTIzPC9hPgorWzEuNl1bY29tcGlsZXJdIEludGVybmFsIGNvbXBpbGVyIGVycm9yIGNhdXNlZCBieSBhIGZvciBsb29wIGluIGFuIGluaXRpYWxpemVyIGJsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NzU4Ij4yMzk3NTg8L2E+CitbMS41XVtjb21waWxlcl0gR2VuZXJpYyBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzkzMDUiPjIzOTMwNTwvYT4KK1tjb21waWxlcl0gVmVyaWZ5RXJyb3IgY2F1c2VkIGJ5IGNhc3RpbmcgbG9uZyB0byBsb25nIHRvIGludAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTE5OCI+MjM5MTk4PC9hPgorW2NvbXBpbGVyXSBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiB0aHJvd24gZm9yIHRyaXBsZSBxdW90ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg5MjAiPjIzODkyMDwvYT4KK1tmb3JtYXR0ZXJdIENvZGUgRm9ybWF0dGVyIHJlbW92ZXMgamF2YWRvYyBzdGF0dXMgaWYgQGNhdGVnb3J5IHByZXNlbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg4NTMiPjIzODg1MzwvYT4KK1tmb3JtYXR0ZXJdIENvZGUgRm9ybWF0dGVyIGRvZXMgbm90IHByb3Blcmx5IGZvcm1hdCB2YWxpZCB4aHRtbCAoJmx0O2JyIC8mZ3Q7ICZhbXA7ICZsdDtwIC8mZ3Q7KSBpbiBqYXZhZG9jLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDIxNyI+MTYwMjE3PC9hPgorW2FzdCByZXdyaXRlXSBBU1RSZXdyaXRlI2dldExpc3RSZXdyaXRlIGRvZXMgbm90IGZ1bGxmaWxsIHNwZWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI1NjUiPjIzMjU2NTwvYT4KK1sxLjVdW2NvbXBpbGVyXSB3cm9uZyBhdXRvYm94aW5nIGNvZGUgZ2VuZXJhdGlvbiBsZWFkcyB0byBWZXJpZnlFcnJvciBhdCBydW50aW1lCisKKzxhIG5hbWU9InZfOTAxIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjVNMSAtIEp1bHkgMSwgMjAwOAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl85MDEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfOTAxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyNDc4Ij4yMzI0Nzg8L2E+CitbYnVpbGRwYXRoXSBDbGFzc3BhdGggZmFpbGVkIHRvIGJpbmQgdG8gaW5zdGFsbGVkIEpSRQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzODIxMCI+MjM4MjEwPC9hPgorW2Zvcm1hdHRlcl0gQ29kZUZvcm1hdHRlciB3cmFwcyBsaW5lIGNvbW1lbnRzIHdpdGhvdXQgd2hpdGVzcGFjZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg0ODQiPjIzODQ4NDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIGdlbmVyYXRlcyBiYWQgY29kZSAobWFqb3IgcmVncmVzc2lvbikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzUzNzAiPjIzNTM3MDwvYT4KK0FkZCBwZXJmb3JtYW5jZSB0ZXN0IGZvciBidWcgMjM0NzE4Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1OTA2Ij4xMzU5MDY8L2E+CitDb21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IucmVzb2x2ZUR1cGxpY2F0ZXMgaGFzIGJhZCBwZXJmb3JtYW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTY3OCI+MTY5Njc4PC9hPgorW2hpZXJhcmNoeV0gVHlwZSBIaWVyYXJjaHkgb24gc3RhdGljIG5lc3RlZCBjbGFzcyBpbmNsdWRlcyB1bnJlbGF0ZWQgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTQ4MCI+OTU0ODA8L2E+CitbbW9kZWxdIE1pc3NpbmcgSU5WQUxJRF9TSUJMSU5HIGV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIGEgdHlwZSBpbiBhbiBlbnVtIHR5cGUgdGhhdCBjb250YWlucyBjb25zdGFudHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzUzNjkiPjIzNTM2OTwvYT4KK0RlbHRhUHJvY2Vzc29yLnJlc2V0UHJvamVjdENhY2hlcygpIHNob3VsZCBjbGVhciB0aGUgbGlzdCBvZiBwcm9qZWN0cyB0byByZXNldAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDg0MCI+MTkwODQwPC9hPgorU291cmNlTWFwcGVyI2NvbXB1dGVBbGxSb290UGF0aHMoSVR5cGUpIGZhY3RvcmlzYXRpb24gc3VnZ2VzdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODY2NCI+MTQ4NjY0PC9hPgorW3NwZWNdIElKYXZhTW9kZWwjZ2V0SmF2YVByb2plY3QoU3RyaW5nKSB0aHJvd3MgSUFFIGZvciBpbnZhbGlkIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzExMzAiPjIzMTEzMDwvYT4KK1tzcGVjXSBJQ2xhc3NGaWxlLmdldFBhdGgoKSBub3Qgc3BlY2lmaWVkIGZvciBleHRlcm5hbCBjbGFzcyBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA5NDI1Ij4yMDk0MjU8L2E+Citbc3BlY10gQW1iaWd1b3VzIEphdmFEb2MgaW4gQVNUUGFyc2VyI3NldFVuaXROYW1lIHJlZ2FyZGluZyBzb3VyY2UgZm9sZGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTI3MiI+MjM1MjcyPC9hPgoramF2YWRvYyBvZiBKYXZhQ29yZSNDT01QSUxFUl9QQl9NSVNTSU5HX0pBVkFET0NfVEFHX0RFU0NSSVBUSU9OIG5lZWRzIGltcHJvdmVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1Nzc4Ij4yMzU3Nzg8L2E+CitQb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gY29tcHV0aW5nIHJlc29sdmVkIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDg2NSI+MTU0ODY1PC9hPgorW2hpZXJhcmNoeV0gRm9jdXMgb24gUGFja2FnZSBvbmx5IHNob3dzIGNsYXNzZXMgd2l0aCBtaXNzaW5nIHN1cGVyY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjQ0NSI+MjM2NDQ1PC9hPgorTlBFIGluIGNvbnRlbnQgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3MTIzIj4yMzcxMjM8L2E+Citbc2VhcmNoXSBBbmQvT3JQYXR0ZXJucyBtaXNzIHRvIG92ZXJyaWRlIG9uZSBvdmVybG9hZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNjM1NyI+MjI2MzU3PC9hPgorW2RvbV0gTlBFIGluIE1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSBpZiBzb21lLCBidXQgbm90IGFsbCBwYXJhbWV0ZXJzIGFyZSBhbm5vdGF0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAwODIiPjEyMDA4MjwvYT4KK1NpZ25hdHVyZSBpcyBtaXNzaW5nIGNhcHR1cmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU4ODIiPjIzNTg4MjwvYT4KK1tjb21waWxlcl0gY29uc3RydWN0b3Itc2NvcGVkIGlubmVyIGNsYXNzZXMgdW5hYmxlIHRvIHJlY29nbml6ZSBmaW5hbCBtZW1iZXIgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzgwOTAiPjIzODA5MDwvYT4KK1tmb3JtYXR0ZXJdIE5ldyBsaW5lcyB3cm9uZ2x5IGFkZGVkIHdoaWxlIGZvcm1hdHRpbmcgdG9vIGxvbmcgQHNlZSByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3OTQyIj4yMzc5NDI8L2E+CitbZm9ybWF0dGVyXSBTdHJpbmcgcmVmZXJlbmNlcyBhcmUgcHV0IG9uIG5leHQgbGluZSB3aGVuIG92ZXIgdGhlIG1heCBsaW5lIGxlbmd0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzI1OSI+MjMzMjU5PC9hPgorW2Zvcm1hdHRlcl0gaHRtbCB0YWcgc2hvdWxkIG5vdCBiZSBzcGxpdCBieSBmb3JtYXR0ZXIKKworCis8YSBuYW1lPSJ2XzkwMCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy41TTEgLSBKdW5lIDI0LCAyMDA4Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzkwMAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl85MDAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5JbmNyZW1lbnRlZCBKRFQvQ29yZSBwbHVnLWluIGlkIHRvICIzLjUuMCIsIHNpbmNlIGFkZGVkIG5ldyBBUEkvZmVhdHVyZS4KKzwvbGk+Cis8bGk+QWRkZWQgYSBuZXcgY29tcGlsZXIgd2FybmluZyB0byBkZXRlY3QgY29tcGFyaXNvbnMgYmV0d2VlbiBpZGVudGljYWwgZXhwcmVzc2lvbnMuIFRoaXMgZGlhZ25vc2lzIGlzIGNvbnRyb2xsZWQgYnkgb3B0aW9uOiAKKzxjb2RlPkphdmFDb3JlLkNPTVBJTEVSX1BCX0NPTVBBUklOR19JREVOVElDQUw8L2NvZGU+IGFuZCBwcm9kdWNlcyBhIHByb2JsZW0gbWFya2VyIHdoaWNoIElEIGlzCis8Y29kZT5JUHJvYmxlbS5Db21wYXJpbmdJZGVudGljYWw8L2NvZGU+IHByb2JsZW0gSUQuCis8cHJlPgorQ29tcGlsZXIgb3B0aW9uIElEOiBSZXBvcnRpbmcgQ29tcGFyaXNvbiBvZiBJZGVudGljYWwgRXhwcmVzc2lvbnMuCitXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBpZiBhIGNvbXBhcmlzb24KK2lzIGludm9sdmluZyBpZGVudGljYWwgb3BlcmFuZHMgKGUuZyA8Y29kZT4neCA9PSB4JzwvY29kZT4pLgorICAtIE9wdGlvbiBpZDoib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWwiCisgIC0gUG9zc2libGUgdmFsdWVzOiB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICAtIERlZmF1bHQ6ICJ3YXJuaW5nIgorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQxNzIiPjIzNDE3MjwvYT4KK1sxLjVdW3NlbGVjdF0gbm8gaG92ZXIgaW4gcXVhbGlmaWVkIG5hbWUgd2l0aCBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzU2OCI+MjMzNTY4PC9hPgorVHlwZSBpbiBTZXJ2ZXIgUnVudGltZSBpcyBub3QgcmVzb2x2ZWQgaW4gZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3Mjg3Ij4yMTcyODc8L2E+CitbZG9tXUlWYXJpYWJsZUJpbmRpbmcjZ2V0SmF2YUVsZW1lbnQoKSByZXR1cm4gbnVsbCBmb3IgdmFyaWFibGUgaW5zaWRlIGFuIGluaXRpYWxpemVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1OTIxIj4yMzU5MjE8L2E+CitbMS41XVtjb21waWxlcl0gSW5jb3JyZWN0IGdlbmVyaWMgc2lnbmF0dXJlIGF0dHJpYnV0ZSBjcmVhdGVkIGZvciBpbm5lciBhbm9ueW1vdXMgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDYxOSI+MjM0NjE5PC9hPgorWzEuNV1bY29tcGlsZXJdIE9iamVjdCNnZXRDbGFzcygpIGhhcyB3cm9uZyBleHByZXNzaW9uIHR5cGUgYmluZGluZyB3aXRoIEpSRSBmcm9tIDEuNgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTgxNCI+MTE1ODE0PC9hPgorW2NvbXBpbGVyXSB3YXJuaW5nIG9uIGNvbXBhcmluZyBzYW1lIHRvIHNhbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzUwMDQiPjIzNTAwNDwvYT4KK1tjb21waWxlcl0gTWlzbGVhZGluZyBjb21waWxlciB3YXJuaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyOTQ0Ij4yMzI5NDQ8L2E+CitJTWVtYmVyI2dldEphdmFkb2NSYW5nZSgpIHNob3VsZCBlbmQgd2l0aCAmcXVvdDsqLyZxdW90OworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjY2NSI+MjIyNjY1PC9hPgorRXJyb3Igb3BlbmluZyB3b3JrYmVuY2gKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY3NzIiPjIxNjc3MjwvYT4KK0lKYXZhTW9kZWwjcmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMgZmFpbHMgdG8gcmVmcmVzaCBFeHRlcm5hbEphdmFQcm9qZWN0IGphciBjYWNoZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTkxNyI+MjA1OTE3PC9hPgorSmF2YUNvcmUjY3JlYXRlKFN0cmluZywgV29ya2luZ0NvcHlPd25lcikgc2hvdWxkIGRlYWwgd2l0aCBudWxsIG93bmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM3MDUxIj4yMzcwNTE8L2E+CitbZm9ybWF0dGVyXSBGb3JtYXR0ZXIgaW5zZXJ0IGJsYW5rIGxpbmVzIGFmdGVyIGphdmFkb2MgaWYgamF2YWRvYyBjb250YWlucyBDb21tb25zIEF0dHJpYnV0ZXMgQEAgYW5ub3RhdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzYyMzAiPjIzNjIzMDwvYT4KK1tmb3JtYXR0ZXJdIFNJT09CRSB3aGlsZSBmb3JtYXR0aW5nIGEgY29tcGlsYXRpb24gdW5pdC4KKworCis8aHI+Cis8cD5Gb3IgZWFybGllciBidWlsZCBub3RlcywgYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMzRfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIj5idWlsZCBub3RlcyB1cCB0byBSZWxlYXNlIDMuNDwvYT4uPC9wPgorPGJyPgorICA8cD4KKyAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjaz91cmk9cmVmZXJlciI+PGltZworICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLWh0bWw0MDEiCisgICAgICAgIGFsdD0iVmFsaWQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4Ij48L2E+CisgIDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjM2X2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzNl9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNGVmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IzNl9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTAsMCArMSwyMjgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDx0aXRsZT5KRFQvQ29yZSBSZWxlYXNlIE5vdGVzIDMuNjwvdGl0bGU+CisgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImpkdF9jb3JlX3N0eWxlLmNzcyIgY2hhcnNldD0iaXNvLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI3MiUiIGNsYXNzPSJ0aXRsZTEiPgorICAgICAgPGZvbnQgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMy42IHN0cmVhbTwvYj48L2ZvbnQ+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPjx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjcyJSIgY2xhc3M9InRpdGxlMiI+PGZvbnQgc2l6ZT0iLTIiPkphdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvZm9udD48L3RkPjwvdHI+CisgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICA8dHI+CisgIAk8dGQgY2xhc3M9InRpdGxlMyI+CisJICA8Zm9udCBzaXplPSItMSI+CisJICBIZXJlIGFyZSB0aGUgYnVpbGQgbm90ZXMgZm9yIHRoZSBFY2xpcHNlIEpEVC9Db3JlIHBsdWctaW4gcHJvamVjdAorCSAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9pbmRleC5waHAiPjxiPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9iPjwvYT4sCisJICBkZXNjcmliaW5nIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzIiB0YXJnZXQ9bmV3PmJ1ZzwvYT4gcmVzb2x1dGlvbiBhbmQgc3Vic3RhbnRpYWwgY2hhbmdlcyBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZSI+PGI+SEVBRDwvYj48L2E+IGJyYW5jaC4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIDMuNiBwbGFubmluZywgcGxlYXNlIHJlZmVyIHRvIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamR0L2NvcmUvcjMuNi9pbmRleC5waHAjcmVsZWFzZS1wbGFuIj5KRFQvQ29yZSByZWxlYXNlIHBsYW48L2E+LAorCSAgdGhlIG5leHQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZHQvY29yZS9yMy42L2luZGV4LnBocCNtaWxlc3RvbmUtcGxhbiI+bWlsZXN0b25lIHBsYW48L2E+LAorCSAgdGhlIG92ZXJhbGwgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlL2RldmVsb3BtZW50L2VjbGlwc2VfcHJvamVjdF9wbGFuXzNfNi5odG1sIj5vZmZpY2lhbCBwbGFuPC9hPiwKKwkgIG9yIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UvcGxhdGZvcm0tcmVsZW5nL2J1aWxkU2NoZWR1bGUuaHRtbCI+YnVpbGQgc2NoZWR1bGU8L2E+LgorCSAgVGhpcyBwcmVzZW50IGRvY3VtZW50IGNvdmVycyBhbGwgY2hhbmdlcyBzaW5jZSBSZWxlYXNlIDMuNSAoYWxzbyBzZWUgYSBzdW1tYXJ5IG9mIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvQVBJX2NoYW5nZXMuaHRtbCI+QVBJIGNoYW5nZXM8L2E+KS4KKwkgIDxicj5NYWludGVuYW5jZSBvZiBwcmV2aW91cyByZWxlYXNlcyBvZiBKRFQvQ29yZSBpcyBwZXJmb3JtZWQgaW4gcGFyYWxsZWwgYnJhbmNoZXM6CisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM181X21haW50ZW5hbmNlIj5SMy41Lng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfNF9tYWludGVuYW5jZSI+UjMuNC54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzNfbWFpbnRlbmFuY2UiPlIzLjMueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SM18yX21haW50ZW5hbmNlIj5SMy4yLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjNfMV9tYWludGVuYW5jZSI+UjMuMS54PC9hPiwKKwkJICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPVIzXzBfbWFpbnRlbmFuY2UiPlIzLjAueDwvYT4sCisJCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz1SMl8xX21haW50ZW5hbmNlIj5SMi4xLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9UjJfMF8xIj5SMi4wLng8L2E+LAorCQkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9RUNMSVBTRV8xXzAiPlIxLjAueDwvYT4uCisJICA8L2ZvbnQ+CisJPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YSBuYW1lPSJ2X0E1OCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42IC0gSnVuZSAzLCAyMDEwIC0gMy42LjAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTU4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0E1OCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTU1NjgiPjMxNTU2ODwvYT4KK2ltcHJvdmUgSmF2YWRvYyBvZiBTZWFyY2hQYXR0ZXJuI2NyZWF0ZVBhdHRlcm4oU3RyaW5nLCBpbnQsIGludCwgaW50KQorCis8YSBuYW1lPSJ2X0E1NyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkM0IC0gSnVuZSAzLCAyMDEwIC0gMy42LjAgUkM0Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E1NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5Vc2UgZGVmYXVsdCBkaXNhYmxpbmcvZW5hYmxpbmcgdGFncyBpbiB0aGUgc2FtcGxlcyBvZiB0aGUgSmF2YWRvYyBjb21tZW50cworb2YgdGhlIGZvcm1hdHRlciBjb25zdGFudHMgPGNvZGU+Rk9STUFUVEVSX0RJU0FCTElOR19UQUc8L2NvZGU+IGFuZAorPGNvZGU+Rk9STUFUVEVSX0VOQUJMSU5HX1RBRzwvY29kZT4uPC9saT4KKzxsaT5GaXhlZCBtaW5vciBqYXZhZG9jIGlzc3VlcyBvZiA8Y29kZT5jcmVhdGVTdHJpY3RIaWVyYXJjaHlTY29wZSgpPC9jb2RlPi48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NzA5Ij4zMTQ3MDk8L2E+CitDbGFyaWZ5IC1lbmNvZGluZyAmbHQ7ZW5jb2RpbmcgbmFtZSZndDsgaW4gamR0X2FwaV9jb21waWxlLmh0bQorCis8YSBuYW1lPSJ2X0E1NiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMzIC0gTWF5IDI3LCAyMDEwIC0gMy42LjAgUkMzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E1NgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNTYiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzODkwIj4zMTM4OTA8L2E+CitNaWdyYXRpb24gZ3VpZGUgdG8gMy42IGZvciBjb250YWluZXJzIHdpdGggTUFOSUZFU1QtcmVmZXJyZWQgZW50cmllcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTM5NjUiPjMxMzk2NTwvYT4KK0JyZWFraW5nIGNoYW5nZSBpbiBjbGFzc3BhdGggY29udGFpbmVyIEFQSQorCis8YSBuYW1lPSJ2X0E1NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMzIC0gTWF5IDI1LCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E1NQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNTUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzNzA2Ij4zMTM3MDY8L2E+CitSZXBsYWNlIGllLiB3aXRoIGkuZS4gaW4gamR0LmNvcmUgZG9jdW1lbnRhdGlvbgorCis8YSBuYW1lPSJ2X0E1NCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMyIC0gTWF5IDIwLCAyMDEwIC0gMy42LjAgUkMyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E1NAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNTQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4KK0FkZGVkIGEgbmV3IHByZWZlcmVuY2UgdG8gZm9yY2UgdGhlIGZvcm1hdHRlciB0byB0cnkgdG8ga2VlcCBuZXN0ZWQgZXhwcmVzc2lvbnMgb24gb25lIGxpbmUuCis8cD4KK1RoaXMgbmV3IHByZWZlcmVuY2UgaXMgY29udHJvbGxlZCB3aXRoIHRoZSBvcHRpb246PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX1dSQVBfT1VURVJfRVhQUkVTU0lPTlNfV0hFTl9ORVNURUQ8L2NvZGU+Cis8cHJlPgorLyoqCisgKiBGT1JNQVRURVIgLyBPcHRpb24gdG8gd3JhcCBvdXRlciBleHByZXNzaW9ucyBpbiBuZXN0ZWQgZXhwcmVzc2lvbnMKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgVFJVRQorICoKKyAqIFRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIGZvcm1hdHRlciBiZWhhdmlvciB3aGVuIG5lc3RlZCBtZXRob2QgY2FsbHMgYXJlIGVuY291bnRlcmVkLgorICogU2luY2UgMy42LCB0aGUgZm9ybWF0dGVyIHRyaWVzIHRvIHdyYXAgb3V0ZXJtb3N0IG1ldGhvZCBjYWxscyBmaXJzdCB0byBoYXZlIGEgYmV0dGVyIG91dHB1dC4KKyAqIEZvciBleGFtcGxlLCBsZXQncyBzYXkgd2UgYXJlIHVzaW5nIHRoZSBFY2xpcHNlIGJ1aWx0LWluIHByb2ZpbGUgd2l0aCBhIG1heCBsaW5lIHdpZHRoPTQwK3NwYWNlIGZvciB0YWIgcG9saWN5LgorICogVGhlbiBjb25zaWRlciB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6CisgKgorICogcHVibGljIGNsYXNzIFgwMSB7CisgKiAgICAgdm9pZCB0ZXN0KCkgeworICogICAgICAgICBmb28oYmFyKDEsIDIsIDMsIDQpLCBiYXIoNSwgNiwgNywgOCkpOworICogICAgIH0KKyAqIH0KKyAqCisgKiBXaXRoIHRoaXMgbmV3IHN0cmF0ZWd5LCB0aGUgZm9ybWF0dGVyIHdpbGwgd3JhcCB0aGUgbGluZSBlYXJsaWVyLCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1lc3NhZ2UgY2FsbAorICogZm9yIHRoaXMgZXhhbXBsZSwgYW5kIHRoZW4gaXQgd2lsbCBhbGxvdyB0byBrZWVwIGVhY2ggbmVzdGVkIGNhbGwgb24gYSBzaW5nbGUgbGluZS4KKyAqIEhlbmNlLCB0aGUgb3V0cHV0IHdpbGwgYmU6CisgKgorICogcHVibGljIGNsYXNzIFgwMSB7CisgKiAgICAgdm9pZCB0ZXN0KCkgeworICogICAgICAgICBmb28oYmFyKDEsIDIsIDMsIDQpLAorICogICAgICAgICAgICAgYmFyKDUsIDYsIDcsIDgpKTsKKyAqICAgICB9CisgKiB9CisgKgorICogSW1wb3J0YW50IG5vdGVzOgorICogMS4gVGhpcyBuZXcgYmVoYXZpb3IgaXMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgKGkuZS4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJlZmVyZW5jZSBpcyB7QGxpbmsgI1RSVUV9KS4KKyAqICAgIElmIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlZ2FyZGluZyBwcmV2aW91cyB2ZXJzaW9ucycgZm9ybWF0dGVyIGJlaGF2aW9yIChpLmUuIGJlZm9yZSAzLjYgdmVyc2lvbikgaXMgbmVjZXNzYXJ5LAorICogICAgdGhlbiB0aGUgcHJlZmVyZW5jZSBuZWVkcyB0byBiZSBzZXQgdG8ge0BsaW5rICNGQUxTRX0gdG8gcmV0cmlldmUgdGhlIHByZXZpb3VzIGZvcm1hdHRlciBiZWhhdmlvci4KKyAqIDIuIFRoZSBuZXcgc3RyYXRlZ3kgY3VycmVudGx5IG9ubHkgYXBwbGllcyB0byBuZXN0ZWQgbWV0aG9kIGNhbGxzLCBidXQgbWlnaHQgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgbmVzdGVkIGV4cHJlc3Npb25zIGluIGZ1dHVyZSB2ZXJzaW9ucworICogCisgKiBAc2VlICNUUlVFCisgKiBAc2VlICNGQUxTRQorICogQHNpbmNlIDMuNgorICovCis8L3ByZT4KK1NlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzUyNCI+MzEzNTI0PC9hPiBmb3IgbW9yZSBkZXRhaWxzLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzUyNCI+MzEzNTI0PC9hPgorW2Zvcm1hdHRlcl0gQWRkIHByZWZlcmVuY2UgZm9yIGltcHJvdmVkIGxpbmVzIHdyYXBwaW5nIGluIG5lc3RlZCBtZXRob2QgY2FsbHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTA5Ij4zMTMxMDk8L2E+CitAU3VwcHJlc3NXYXJuaW5ncyBvbiBtdWx0aXBsZSBsb2NhbHMgaXMgbWFya2VkIHVubmVjZXNzYXJ5IGlmIGFueSBsb2NhbCBpcyBuZXZlciB1c2VkCisKKzxhIG5hbWU9InZfQTUzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZSQzEgLSBNYXkgMTIsIDIwMTAgLSAzLjYuMCBSQzEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTUzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0E1MyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTIzMjYiPjMxMjMyNjwvYT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB1c2luZyBvcGVuIHR5cGUgZGlhbG9nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMDE1OSI+MzEwMTU5PC9hPgorSGFuZyBpbiBKYXZhTW9kZWwuZ2V0RXh0ZXJuYWxUYXJnZXQoSmF2YU1vZGVsLmphdmE6MzMzKQorCis8YSBuYW1lPSJ2X0E1MiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMxIC0gTWF5IDExLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E1MgorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNTIiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3ODQ3Ij4xNTc4NDc8L2E+CitOUEUgaW4gV2lsZGNhcmRCaW5kaW5nLmNvbXB1dGVVbmlxdWVLZXkgZHVyaW5nIGNvZGUgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMTg0OSI+MzExODQ5PC9hPgorW3F1aWNrIGZpeF0gQFN1cHByZXNzV2FybmluZ3MgZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCBpbnNpZGUgYSBmb3IgbG9vcAorCis8YSBuYW1lPSJ2X0E1MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMxIC0gTWF5IDgsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTUxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0E1MSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDYxNzAiPjMwNjE3MDwvYT4KK1twZXJmc10gUmVncmVzc2lvbiBmb3IgRnVsbFNvdXJjZVdvcmtzcGFjZVR5cGVIaWVyYXJjaHlUZXN0cyN0ZXN0UGVyZkFsbFR5cGVzKCkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4ODQ0Ij4yOTg4NDQ8L2E+CitbZm9ybWF0dGVyXSBOZXcgbGluZXMgaW4gZW1wdHkgbWV0aG9kIGJvZHkgd3JvbmcgYmVoYXZpb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExODY0Ij4zMTE4NjQ8L2E+CitbZm9ybWF0dGVyXSBOUEUgd2l0aCBlbXB0eSB7QGNvZGUgfQorCis8YSBuYW1lPSJ2X0E1MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42UkMxIC0gTWF5IDYsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTUwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0E1MCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPgorQWRkZWQgYSBuZXcgcHJlZmVyZW5jZSB0byBzd2l0Y2ggb24vb2ZmIHRoZSB1c2FnZSBvZiB0aGUgZGlzYWJsaW5nL2VuYWJsaW5nIHRhZ3Mgb2YgdGhlIGZvcm1hdHRlci4KKzxwPgorVGhpcyBuZXcgcHJlZmVyZW5jZSBpcyBjb250cm9sbGVkIHdpdGggdGhlIG9wdGlvbjo8L3A+Cis8Y29kZT5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfVVNFX09OX09GRl9UQUdTPC9jb2RlPgorPHByZT4KKy8qKgorICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIHVzZSB0aGUgZGlzYWJsaW5nIGFuZCBlbmFibGluZyB0YWdzIGRlZmluZWQgcmVzcGVjdGl2ZWx5IGJ5IHRoZSB7QGxpbmsgI0ZPUk1BVFRFUl9ESVNBQkxJTkdfVEFHfSBhbmQgdGhlIHtAbGluayAjRk9STUFUVEVSX0VOQUJMSU5HX1RBR30gb3B0aW9ucy4KKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncyIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICBUUlVFIC8gRkFMU0UKKyAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBGQUxTRQorICogCisgKiBAc2luY2UgMy42CisgKi8KKzwvcHJlPgorU2VlIGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExNTgyIj4zMTE1ODI8L2E+IGZvciBtb3JlIGRldGFpbHMuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExNjE3Ij4zMTE2MTc8L2E+CitbZm9ybWF0dGVyXSBwcm92aWRlIGRlZmF1bHQgdGFncyB0byBlbmFibGUvZGlzYWJsZSBmb3JtYXR0ZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExNTgyIj4zMTE1ODI8L2E+CitbZm9ybWF0dGVyXSBNYXN0ZXIgc3dpdGNoIHRvIGVuYWJsZS9kaXNhYmxlIG9uL29mZiB0YWdzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzA0MCI+MzA3MDQwPC9hPgorU2VhcmNoIEpvYiB3aXRoIEhpZXJhcmNoeVNjb3BlIG9uIE9iamVjdCBkb2VzIG5vdCBjYW5jZWwKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMjk1Ij4zMDIyOTU8L2E+CitBZnRlciBhc3NvY2lhdGluZyBzb3VyY2UgZm9sZGVyIHdpdGggcnQuamFyIHByb2plY3QgcmVmcmVzaCB0YWtlcyBleGNlZWRpbmdseSBsb25nIHRpbWUuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMTA0OCI+MzExMDQ4PC9hPgorQWJvcnRDb21waWxhdGlvbiBwcm9wYWdhdGVkIGZyb20gQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5wcm9jZXNzKCkKKworPGEgbmFtZT0idl9BNDkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNlJDMSAtIE1heSA0LCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E0OQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNDkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwODExIj4zMTA4MTE8L2E+CitbcGVyZnNdIEJpZyByZWdyZXNzaW9uIG9uIEZ1bGxTb3VyY2VXb3Jrc3BhY2VGb3JtYXR0ZXJUZXN0cyN0ZXN0Rm9ybWF0RGVmYXVsdEJpZ0ZpbGUoKQorCis8YSBuYW1lPSJ2X0E0OCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTcgLSBBcHJpbCAyNSwgMjAxMCAtIDMuNi4wIE03Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E0OAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNDgiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwMzMwIj4zMTAzMzA8L2E+CitBZGQgbXVsdGlwbGUgZW5jb2Rpbmcgc3VwcG9ydCBmb3IgdGhlIGJhdGNoIGNvbXBpbGVyCisKKzxhIG5hbWU9InZfQTQ3Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNNyAtIEFwcmlsIDI1LCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E0NworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNDciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5ODM1Ij4zMDk4MzU8L2E+CitbZm9ybWF0dGVyXSBhZGRzIGJsYW5rIGxpbmVzIG9uIGVhY2ggcnVuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMDIxMyI+MzEwMjEzPC9hPgorQUlPT0JFIGluIEluZGV4U2VsZWN0b3IuaW5pdGlhbGl6ZUluZGV4TG9jYXRpb25zKCkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5OTY2Ij4zMDk5NjY8L2E+CitJVHlwZSNnZXRLZXkoKSBkb2VzIG5vdCB3b3JrIGZvciB1bnJlc29sdmVkIGxvY2FsIElUeXBlcworCis8YSBuYW1lPSJ2X0E0NiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTcgLSBBcHJpbCAyMywgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BNDYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTQ2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5ODkxIj41OTg5MTwvYT4KK1tmb3JtYXR0ZXJdIGltcHJvdmUgbGluZXMgd3JhcHBpbmcgaW4gbmVzdGVkIG1ldGhvZCBjYWxscworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDYxNzIiPjMwNjE3MjwvYT4KK1twZXJmc10gSW52YWxpZCB0ZXN0IGR1cmF0aW9uIGZvciBGdWxsU291cmNlV29ya3NwYWNlVHlwZUhpZXJhcmNoeVRlc3RzI3Rlc3RQZXJTdXBlclR5cGVzKCkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3MDkxIj4yNjcwOTE8L2E+CitbY29udGVudCBhc3Npc3RdIEFmdGVyICdpbXBsZW1lbnRzJyBpbnRlcmZhY2UgbWVtYmVycyBhcmUgbm90IHByb3Bvc2VkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTUzNCI+MjYxNTM0PC9hPgorY29udGVudCBhc3Npc3QgYWZ0ZXIgaW5zdGFuY2VvZiBzaG91bGQgYWxzbyB3b3JrIGFmdGVyICZhbXA7JmFtcDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4OTgwIj4zMDg5ODA8L2E+CitbY29udGVudCBhc3Npc3RdQW4gaW5pdGlhbGl6ZXIgaW5zaWRlIGEgbm9uLWFycmF5IGZpZWxkIGRlY2xhcmF0aW9uIGNvbmZ1c2VzIGNvbnRlbnQgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMDAwMiI+MzEwMDAyPC9hPgorVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lciguLikgc2hvdWxkIHVzZSB3b3Jrc3BhY2UgY29tcGxpYW5jZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE1MjgiPjI5MTUyODwvYT4KK1N5bmNocm9uaXplIHByb2plY3Qgd2FybmluZy9lcnJvciBzZXR0aW5ncyB0byBidWlsZC5wcm9wZXJ0aWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTc4NyI+MzA5Nzg3PC9hPgorRXh0ZW5zaW9uIHBvaW50ICZxdW90O29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVGb3JtYXR0ZXImcXVvdDsgaXMgaWdub3JlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ4MjAiPjI0NDgyMDwvYT4KK0NvbnRlbnQgYXNzaXN0IGFmdGVyICdpbnN0YW5jZW9mJyBzaG91bGQgYWxzbyB3b3JrIGluIGFzc2lnbm1lbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5NzA2Ij4zMDk3MDY8L2E+CitbZm9ybWF0dGVyXSBkb2Vzbid0IHdvcmsgd2hlbiBjb2RlIGhhcyB0aHJlZSBzZW1pY29sb25zIHNpZGUgYnkgc2lkZQorCis8YSBuYW1lPSJ2X0E0NSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTcgLSBBcHJpbCAyMCwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BNDUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTQ1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTAzNyI+MzA1MDM3PC9hPgorbWlzc2luZyBzdG9yeSBmb3IgYXR0cmlidXRlcyBvZiByZWZlcmVuY2VkIEpBUnMgaW4gY2xhc3NwYXRoIGNvbnRhaW5lcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MTE2Ij4zMDUxMTY8L2E+CitbaW5kZXhdIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgaW5kZXhlcyByZXN1bHRzIHRhYmxlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzYzMDYiPjIzNjMwNjwvYT4KK1tjb250ZW50IGFzc2lzdF0gZm9yIG1ldGhvZCBpbnZvY2F0aW9uIGluIHZhcmlhYmxlIGluaXRpYWxpemVyIHNob3VsZCBub3QgZ3Vlc3MgdmFyaWFibGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyODY1Ij4zMDI4NjU8L2E+CitJc3N1ZSB3aXRoICZxdW90O2ltcG9ydCZxdW90OyBhIGNsYXNzIGFuZCAmcXVvdDtpbXBvcnQgc3RhdGljJnF1b3Q7IGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDkwMjIiPjMwOTAyMjwvYT4KK1tJbXBvcnRSZXdyaXRlXSBBZGQgSW1wb3J0IHdyb25nbHkgcmVtb3ZlcyBpbXBvcnQgZm9yIG5lc3RlZCB0eXBlCisKKzxhIG5hbWU9InZfQTQ0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNNyAtIEFwcmlsIDEzLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0E0NAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BNDQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4NzU0Ij4zMDg3NTQ8L2E+CitDb21waWxhdGlvblVuaXQucmV3cml0ZSBtZXNzZXMgdXAgLmNsYXNzLWxpdGVyYWwgaW4gYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGNoYW5naW5nIGNsYXNzIHRvIGludGVyZmFjZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY1MTkiPjMwNjUxOTwvYT4KK0phdmFDb3JlI2dldFJlZmVyZW5jZWRDbGFzc3BhdGhFbnRyaWVzKElDbGFzc3BhdGhFbnRyeSwgSUphdmFQcm9qZWN0KSBzaG91bGQgYWxsb3cgbnVsbCBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODQyOCI+MzA4NDI4PC9hPgorUG9zc2libGUgcHJvYmxlbSB0byBnZXQgY29ycmVjdGlvbnMgd2l0aCBzdXJyb2dhdGUgY2hhcmFjdGVycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDcyOTUiPjMwNzI5NTwvYT4KK1Rhc2sgdGFncyBhbmQgdGFzayBwcmlvcml0aWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODQ3NiI+MzA4NDc2PC9hPgorVGVzdCBDbGFzc3BhdGhUZXN0cyN0ZXN0QnVnMzA4MTUwIGZhaWxzIG9uIGFsbCBwbGF0Zm9ybXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MDQzIj4zMDUwNDM8L2E+CitJbnRlcm5hbCBlcnJvciBkdXJpbmcgY2xhc3NwYXRoIGluaXQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3NDg2Ij4zMDc0ODY8L2E+CitEQkNTMy42OiBGYWlsIHRvIHByb3Bvc2UgRXh0LUIgbGFiZWxzIHdpdGggY29udGVudCBhc3Npc3QgaW4gSmF2YSBFZGl0b3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4MjU2Ij4zMDgyNTY8L2E+CitEaWFnbm9zdGljTGlzdGVuZXIgYWx3YXlzIHN1cHBsaWVzIERpYWdub3N0aWMuZ2V0U291cmNlKCk9PW51bGwKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4MzU2Ij4zMDgzNTY8L2E+Citjb2RlU2VsZWN0KC4uKSBkb2Vzbid0IHdvcmsgZm9yIGxvY2FsIHZhcmlhYmxlIHdpdGggc3Vycm9nYXRlIGluIG5hbWUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4MjQ1Ij4zMDgyNDU8L2E+CitWYWxpZCBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgaW4gMy42Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzg4NSI+MzA3ODg1PC9hPgorRXJyb3IgbWVzc2FnZSBmb3IgaW5zdGFuY2VvZiAmbHQ7cGFyYW1ldGVyaXplZCB0eXBlJmd0OyB3cm9uZyBhcmd1bWVudHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NzA0Ij4yNDk3MDQ8L2E+CitbY29kZSBhc3Npc3RdIGF1dG9jb21wbGV0ZSB3aXRoIGFub255bW91cyBjbGFzc2VzIGRvZXMgc3RvcCB3b3JraW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODE1MCI+MzA4MTUwPC9hPgorSkFSIHdpdGggaW52YWxpZCBDbGFzcy1QYXRoIGVudHJ5IGluIE1BTklGRVNULk1GIGNyYXNoZXMgdGhlIHByb2plY3QKKworPGEgbmFtZT0idl9BNDMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk03IC0gQXByaWwgNiwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BNDMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTQzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjIyMyI+MzA2MjIzPC9hPgorW3NlYXJjaF0gU2VhcmNoaW5nIGZvciBhbm5vdGF0aW9uIHJlZmVyZW5jZXMgcmVwb3J0IGFsbCB0eXBlIHJlZmVyZW5jZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMDg3Ij4yOTIwODc8L2E+Cithbm9ueW1vdXMgY2xhc3MgaW4gYXJyYXkgbWVtYmVyIGluaXRpYWxpemVyIGNvbmZ1c2VzIGNvbnRlbnQgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzMzNyI+MzA3MzM3PC9hPgorW2NvbnRlbnQgYXNzaXN0XSBEZWZhdWx0IGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgcHJvcG9zZWQgZm9yIGFub255bW91cyB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY1NjgiPjMwNjU2ODwvYT4KK1tJbXBvcnRSZXdyaXRlXSBBZGQgSW1wb3J0IGRvZXMgbm90IHdvcmsgZm9yIG5lc3RlZCB0eXBlIHdoZW4gcGFja2FnZSBpcyBvbi1kZW1hbmQgaW1wb3J0ZWQKKworPGEgbmFtZT0idl9BNDIiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk03IC0gTWFyY2ggMzAsIDIwMTAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTQyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0E0MiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDI2MzQiPjIwMjYzNDwvYT4KK1tjb2RlYXNzaXN0XSBtaXNzaW5nIHN1cGVyIHByb3Bvc2FsIGluIHNwZWNpZmljIHNvdXJjZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQzOTQiPjMwNDM5NDwvYT4KK0lKYXZhRWxlbWVudCNnZXRBdHRhY2hlZEphdmFkb2MoSVByb2dyZXNzTW9uaXRvcikgc2hvdWxkIHN1cHBvcnQgcmVmZXJlbmNlZCBlbnRyaWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTEyMiI+MzA1MTIyPC9hPgorRlVQIG9mIDMwMjk0OQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY5MTciPjMwNjkxNzwvYT4KK0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgY29tcGlsYXRpb24gdW5pdCBjb252ZXJzaW9uOgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDYxOTYiPjMwNjE5NjwvYT4KK1tzZWFyY2hdIE5QRSB3aGlsZSBzZWFyY2hpbmcgZm9yIGFubm90YXRpb24gcmVmZXJlbmNlcyBpbiBydC5qYXIgb2YgSlJFIDYuMAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg2NTgiPjI4ODY1ODwvYT4KK1tjb21waWxlcl1bMS41XSBBbm5vdGF0aW9ucyB2aXNpYmlsaXR5IGlzc3VlcworCis8YSBuYW1lPSJ2X0E0MSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTcgLSBNYXJjaCAyMywgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BNDEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTQxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTUxOCI+MzA1NTE4PC9hPgorW2Zvcm1hdHRlcl0gTGluZSBpbnNpZGUgJmx0O3ByZSZndDsgdGFnIGlzIHdyb25nbHkgaW5kZW50ZWQgYnkgb25lIHNwYWNlIHdoZW4gc3RhcnRpbmcganVzdCBhZnRlciB0aGUgc3RhcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTU4MjUiPjI5NTgyNTwvYT4KK1tmb3JtYXR0ZXJdIENvbW1lbnRhcmllcyBhcmUgcnVubmluZyBhd2F5IGFmdGVyIGZvcm1hdHRpbmcgYXJlIHVzZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA2NDc3Ij4zMDY0Nzc8L2E+CitJbmRleGVyKD8pIGZhaWxzIHRvIHJlY29nbmlzZSBlbnVtIGFzIGEgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU4MzAiPjMwNTgzMDwvYT4KK1tmb3JtYXR0ZXJdIGJsb2NrIGNvbW1lbnQgc2hvdWxkIG5vdCBiZSBmb3JtYXR0ZWQgd2hlbiBhIG5vbi1ubHMgdGFnIGlzIG9uIHRoZSBzYW1lIGxpbmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwMDMxIj4zMDAwMzE8L2E+CitUaGUgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgYSB0eXBlIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgcGFja2FnZSBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjA3OCI+MzA2MDc4PC9hPgorTmF2aWdhdGUgdG8gSW5hY2Nlc3NpYmxlIEZpZWxkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTQ3OSI+MjA5NDc5PC9hPgoraW5maW5pdGUgbG9vcCBpbiBCaW5kaW5nS2V5IHdoZW4gc2lnbmF0dXJlcyBhcmUgaW52YWxpZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM1NTgiPjI5MzU1ODwvYT4KK1txdWljayBhc3Npc3RdICZxdW90O0ludmVydCBpZiBzdGF0ZW1lbnQmcXVvdDsgZmFpbHMgd2hlbiBjb21tZW50IGZvbGxvd3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyNDU5Ij4xODI0NTk8L2E+CitbY29tcGlsZXJdIEluY29uc2lzdGVudCBlcnJvciByYW5nZSBmb3IgdW5yZXNvbHZlZCBmaWVsZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTIyMzMiPjE5MjIzMzwvYT4KK1tBU1RdIENvbXBpbGF0aW9uVW5pdC5yZXdyaXRlKCkgcmVtb3ZlcyB3aGl0ZXNwYWNlIGJldHdlZW4gcmV0dXJuIHR5cGUgYW5kIG1ldGhvZCBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjA3MyI+MzA2MDczPC9hPgorQVNUUmV3cml0ZSBKYXZhZG9jIHdyb25nbHkgdGFsa3MgYWJvdXQgZ2V0VGFyZ2V0U291cmNlUmFuZ2VDb21wdXRlcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDUwMDEiPjMwNTAwMTwvYT4KK0V4Y2VwdGlvbiBvY2N1cnJlZCBpbiBsaXN0ZW5lciBvZiBKYXZhIGVsZW1lbnQgY2hhbmdlIG5vdGlmaWNhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU1OTAiPjMwNTU5MDwvYT4KK1JlZHVuZGFudCBudWxsIGNoZWNrIGZhbHNlLXBvc2l0aXZlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTc1NSI+MzA1NzU1PC9hPgorUmVtb3ZlIGRlcHJlY2F0ZWQgQVBJIHRoYXQgaGFzIGJlZW4gYWRkZWQgZm9yIDMuNgorCis8YSBuYW1lPSJ2X0E0MCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTcgLSBNYXJjaCAxNiwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BNDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTQwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTM3MSI+MzA1MzcxPC9hPgorW2Zvcm1hdHRlcl0gVW5leHBlY3RlZCBpbmRlbnRhdGlvbiBvZiBsaW5lIGNvbW1lbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjgxIj4zMDUyODE8L2E+CitbZm9ybWF0dGVyXSBUdXJuaW5nIG9mZiBmb3JtYXR0aW5nIGNoYW5nZXMgY29tbWVudCdzIGZvcm1hdHRpbmcKKworPGEgbmFtZT0idl9BMzkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk02IC0gTWFyY2ggOSwgMjAxMCAtIDMuNi4wIE02Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EzOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMzkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5MDU3Ij4yODkwNTc8L2E+CitKYXZhIENvbnRlbnQgQXNzaXN0IHRha2luZyB0b28gbG9uZworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM4MzAiPjMwMzgzMDwvYT4KKyZxdW90O1ggY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIGZpZWxkJnF1b3Q7IGVycm9uZW91c2x5IHJlcG9ydGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTY1OCI+MjM1NjU4PC9hPgorVmFsaWQgaWRlbnRpZmllciB1bnJlY29nbml6ZWQuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDg0MSI+MzA0ODQxPC9hPgorW3NlYXJjaF0gTlBFIGluIEluZGV4U2VsZWN0b3IuaW5pdGlhbGl6ZUluZGV4TG9jYXRpb25zCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTg2NiI+Mjk1ODY2PC9hPgorRm9ybWFsUGFyYW1ldGVyIGluIEpEVCBET00vQVNUIGRvY3VtZW50YXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0ODE3Ij4zMDQ4MTc8L2E+CitSZXZpZXcgZG9jdW1lbnRhdGlvbiBvZiBBU1RQYXJzZXIgY2xhc3MKKworPGEgbmFtZT0idl9BMzgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk02IC0gTWFyY2ggNSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTM4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitBZGRlZCB0d28gbmV3IHByZWZlcmVuY2VzIHRvIGFsbG93IHRvIGRpc2FibGUgdGhlIGZvcm1hdHRlciBpbiBhIHNlY3Rpb24gb2YgdGhlIGNvZGUuCitUaGVzZSB0d28gcHJlZmVyZW5jZSBkZWZpbmUgcmVzcGVjdGl2ZWx5IHRoZSB0YWcgd2hpY2ggZGlzYWJsZXMgdGhlIGZvcm1hdHRpbmcKK2FuZCB0aGUgdGFnIHdoaWNoIHJlLWVuYWJsZSBpdC4KKzxwPgorVGhlc2UgbmV3IHByZWZlcmVuY2VzIGFyZSBjb250cm9sbGVkIHdpdGggdGhlIG9wdGlvbnM6PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0RJU0FCTElOR19UQUc8L2NvZGU+Cis8Y29kZT5EZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfRU5BQkxJTkdfVEFHPC9jb2RlPgorPHByZT4KKy8qKgorICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGRlZmluZSB0aGUgdGFnIHRvIHB1dCBpbiBhIGNvbW1lbnQgdG8gZGlzYWJsZSB0aGUgZm9ybWF0dGluZy4KKyAqIFNlZSB0aGUge0BsaW5rICNGT1JNQVRURVJfRU5BQkxJTkdfVEFHfSBvcHRpb24gdG8gcmUtZW5hYmxlIGl0LgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZyIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICBTdHJpbmcsIHdpdGggY29uc3RyYWludHMgbWVudGlvbmVkIGJlbG93CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgJnF1b3Q7JnF1b3Q7CisgKiAKKyAqIE5vdGUgdGhhdDoKKyAqIAorICogMS4gVGhlIHRhZyBuYW1lIHdpbGwgYmUgdHJpbW1lZC4gSGVuY2UgaWYgaXQgZG9lcyBjb250YWluIHdoaXRlIHNwYWNlcworICogICAgYXQgdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kLCB0aGV5IHdpbGwgbm90IGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZQorICogICAgc2VhcmNoaW5nIGZvciB0aGUgdGFnIGluIHRoZSBjb21tZW50cworICogMi4gSWYgYSB0YWcgaXMgc3RhcnRpbmcgd2l0aCBhIGxldHRlciBvciBkaWdpdCwgdGhlbiBpdCBjYW5ub3QgYmUgbGVhZGVkIGJ5CisgKiAgICBhbm90aGVyIGxldHRlciBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkCisgKiAgICAoPGI+PGk+IlRvRGlzYWJsZUZvcm1hdHRlciI8L2k+PC9iPiB3aWxsIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgZGlzYWJsaW5nIHRhZworICogICAgPGI+PGk+IkRpc2FibGVGb3JtYXR0ZXIiPC9pPjwvYj4sIGJ1dCA8Yj48aT4iUmU6RGlzYWJsZUZvcm1hdHRlciI8L2k+PC9iPgorICogICAgd2lsbCBiZSBkZXRlY3RlZCBmb3IgZWl0aGVyIHRhZyA8Yj48aT4iRGlzYWJsZUZvcm1hdHRlciI8L2k+PC9iPiBvcgorICogICAgPGI+PGk+IjpEaXNhYmxlRm9ybWF0dGVyIjwvaT48L2I+KS4KKyAqICAgIFJlc3BlY3RpdmVseSwgYSB0YWcgZW5kaW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgY2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgbGV0dGVyCisgKiAgICBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkICg8Yj48aT4iRGlzYWJsZUZvcm1hdHRlcjEiPC9pPjwvYj4gd2lsbCBub3QgYmUKKyAqICAgIHJlY29nbml6ZWQgYXMgYSBkaXNhYmxpbmcgdGFnIDxiPjxpPiJEaXNhYmxlRm9ybWF0dGVyIjwvaT48L2I+LCBidXQKKyAqICAgIDxiPjxpPiJEaXNhYmxlRm9ybWF0dGVyOjEiPC9pPjwvYj4gd2lsbCBiZSBkZXRlY3RlZCBlaXRoZXIgZm9yIHRhZworICogICAgPGI+PGk+IkRpc2FibGVGb3JtYXR0ZXIiPC9pPjwvYj4gb3IgPGI+PGk+IkRpc2FibGVGb3JtYXR0ZXI6IjwvaT48L2I+KQorICogMy4gQXMgc29vbiBhcyB0aGUgZm9ybWF0dGVyIGVuY291bnRlcnMgdGhlIGRlZmluZWQgZGlzYWJsaW5nIHRhZywgaXQgc3RvcHMgdG8KKyAqICAgIGZvcm1hdCB0aGUgY29kZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbW1lbnQgaW5jbHVkaW5nIHRoaXMgdGFnLiBJZiBpdAorICogICAgd2FzIGFscmVhZHkgZGlzYWJsZWQsIHRoZSB0YWcgaGFzIG5vIHNwZWNpYWwgZWZmZWN0LgorICogICAgRm9yIGV4YW1wbGUsIHRoZSBzZWNvbmQgZGVmaW5lZCBlbmFibGluZyB0YWcgJnF1b3Q7PGI+ZGlzYWJsZS1mb3JtYXR0ZXI8L2I+JnF1b3Q7CisgKiAgICBpbiB0aGUgZm9sbG93aW5nIHNuaXBwZXQgaXMgbm90IG5lY2Vzc2FyeSBhcyB0aGUgZm9ybWF0dGVyIHdhcyBhbHJlYWR5IGRpc2FibGVkCisgKiAgICBzaW5jZSB0aGUgZmlyc3Qgb25lOgorICogICAgIGNsYXNzIFggeworICogICAgIC8vIGRpc2FibGUtZm9ybWF0dGVyCisgKiAgICAgdm9pZCBmb28xKCkge30KKyAqICAgICAvLyBkaXNhYmxlLWZvcm1hdHRlcgorICogICAgIHZvaWQgZm9vMigpIHt9CisgKiAgICAgdm9pZCBiYXIxKCkge30KKyAqICAgICB2b2lkIGJhcjIoKSB7fQorICogICAgIH0KKyAqCisgKiA0LiBJZiBubyBlbmFibGluZyB0YWcgaXMgZm91bmQgYnkgdGhlIGZvcm1hdHRlciBhZnRlciB0aGUgZGlzYWJsaW5nIHRhZywgdGhlbgorICogICAgdGhlIGVuZCBvZiB0aGUgc25pcHBldCB3b24ndCBiZSBmb3JtYXR0ZWQuCisgKiAgICBGb3IgZXhhbXBsZSwgd2hlbiBhIGRpc2FibGluZyB0YWcgaXMgcHV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvZGUsIHRoZW4KKyAqICAgIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGZvcm1hdHRlZDoKKyAqICAgICAvLyBkaXNhYmxlLWZvcm1hdHRlcgorICogICAgIGNsYXNzIFggeworICogICAgIHZvaWQgZm9vMSgpIHt9CisgKiAgICAgdm9pZCBmb28yKCkge30KKyAqICAgICB2b2lkIGJhcjEoKSB7fQorICogICAgIHZvaWQgYmFyMigpIHt9CisgKiAgICAgfQorICogCisgKiA1LiBJZiBhIG1peCBvZiBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIHRhZ3MgaXMgZG9uZSBpbiB0aGUgc2FtZSBjb21tZW50LCB0aGVuCisgKiAgICB0aGUgZm9ybWF0dGVyIHdpbGwgb25seSB0YWtlIGludG8gYWNjb3VudCB0aGUgbGFzdCBlbmNvdW50ZXJlZCB0YWcgaW4gdGhlCisgKiAgICBjb21tZW50LgorICogICAgRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgc25pcHBldCwgdGhlIGZvcm1hdHRlciB3aWxsIGJlIGRpc2FibGVkIGFmdGVyCisgKiAgICB0aGUgY29tbWVudDoKKyAqICAgICBjbGFzcyBYIHsKKyAqICAgICAvKgorICogICAgICZuYnNwOyogVGhpcyBpcyBhIGNvbW1lbnQgd2l0aCBhIG1peCBvZiBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIHRhZ3M6CisgKiAgICAgJm5ic3A7KiAgLSA8Yj5kaXNhYmxlLWZvcm1hdHRlcjwvYj4KKyAqICAgICAmbmJzcDsqICAtIDxiPmVuYWJsZS1mb3JtYXR0ZXI8L2I+CisgKiAgICAgJm5ic3A7KiAgLSA8Yj5kaXNhYmxlLWZvcm1hdHRlcjwvYj4KKyAqICAgICAmbmJzcDsqIFRoZSBmb3JtYXR0ZXIgd2lsbCBzdG9wIHRvIGZvcm1hdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBjb21tZW50Li4uCisgKiAgICAgJm5ic3A7Ki8KKyAqICAgICB2b2lkIGZvbygpIHt9CisgKiAgICAgdm9pZCBiYXIoKSB7fQorICogICAgIH0KKyAqIAorICogNi4gVGhlIHRhZyBjYW5ub3QgaW5jbHVkZSBuZXdsaW5lIGNoYXJhY3RlciAoaS5lLiAnXG4nKSBidXQgaXQgY2FuIGhhdmUgd2hpdGUgc3BhY2VzLgorICogICAgRS5nLiAiPGI+Zm9ybWF0OiBvZmY8L2I+IiBpcyBhIHZhbGlkIGRpc2FibGluZyB0YWcKKyAqICAgIEluIHRoZSBmdXR1cmUsIG5ld2xpbmVzIG1heSBiZSB1c2VkIHRvIHN1cHBvcnQgbXVsdGlwbGUgZGlzYWJsaW5nIHRhZ3MuCisgKiAKKyAqIEBzaW5jZSAzLjYKKyAqLworCisvKioKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBkZWZpbmUgdGhlIHRhZyB0byBwdXQgaW4gYSBjb21tZW50IHRvIHJlLWVuYWJsZSB0aGUKKyAqIGZvcm1hdHRpbmcgYWZ0ZXIgaXQgaGFzIGJlZW4gZGlzYWJsZWQgKHNlZSB7QGxpbmsgI0ZPUk1BVFRFUl9ESVNBQkxJTkdfVEFHfSkKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZyIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICBTdHJpbmcsIHdpdGggY29uc3RyYWludHMgbWVudGlvbmVkIGJlbG93CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgJnF1b3Q7JnF1b3Q7CisgKiAKKyAqIE5vdGUgdGhhdDoKKyAqIAorICogMS4gVGhlIHRhZyBuYW1lIHdpbGwgYmUgdHJpbW1lZC4gSGVuY2UgaWYgaXQgZG9lcyBjb250YWluIHdoaXRlIHNwYWNlcworICogICAgYXQgdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kLCB0aGV5IHdpbGwgbm90IGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZQorICogICAgc2VhcmNoaW5nIGZvciB0aGUgdGFnIGluIHRoZSBjb21tZW50cworICogMi4gSWYgYSB0YWcgaXMgc3RhcnRpbmcgd2l0aCBhIGxldHRlciBvciBkaWdpdCwgdGhlbiBpdCBjYW5ub3QgYmUgbGVhZGVkIGJ5CisgKiAgICBhbm90aGVyIGxldHRlciBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkCisgKiAgICAoPGI+IlJlRW5hYmxlRm9ybWF0dGVyIjwvYj4gd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcyBhbiBlbmFibGluZyB0YWcKKyAqICAgIDxiPjxpPiJFbmFibGVGb3JtYXR0ZXIiPC9pPjwvYj4sIGJ1dCA8Yj48aT4iUmU6RW5hYmxlRm9ybWF0dGVyIjwvaT48L2I+CisgKiAgICB3aWxsIGJlIGRldGVjdGVkIGZvciBlaXRoZXIgdGFnIDxiPjxpPiJFbmFibGVGb3JtYXR0ZXIiPC9pPjwvYj4gb3IKKyAqICAgIDxiPjxpPiI6RW5hYmxlRm9ybWF0dGVyIjwvaT48L2I+KS4KKyAqICAgIFJlc3BlY3RpdmVseSwgYSB0YWcgZW5kaW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgY2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgbGV0dGVyCisgKiAgICBvciBkaWdpdCB0byBiZSByZWNvZ25pemVkICg8Yj48aT4iRW5hYmxlRm9ybWF0dGVyMSI8L2k+PC9iPiB3aWxsIG5vdCBiZQorICogICAgcmVjb2duaXplZCBhcyBhbiBlbmFibGluZyB0YWcgPGI+PGk+IkVuYWJsZUZvcm1hdHRlciI8L2k+PC9iPiwgYnV0CisgKiAgICA8Yj48aT4iRW5hYmxlRm9ybWF0dGVyOjEiPC9pPjwvYj4gd2lsbCBiZSBkZXRlY3RlZCBlaXRoZXIgZm9yIHRhZworICogICAgPGI+PGk+IkVuYWJsZUZvcm1hdHRlciI8L2k+PC9iPiBvciA8Yj48aT4iRW5hYmxlRm9ybWF0dGVyOiI8L2k+PC9iPikKKyAqIDMuIEFzIHNvb24gYXMgdGhlIGZvcm1hdHRlciBlbmNvdW50ZXJzIHRoZSBkZWZpbmVkIGVuYWJsaW5nIHRhZywgaXQgcmUtc3RhcnRzCisgKiAgICB0byBmb3JtYXQgdGhlIGNvZGUganVzdCBhZnRlciB0aGUgY29tbWVudCBpbmNsdWRpbmcgdGhpcyB0YWcuIElmIGl0IHdhcyBhbHJlYWR5CisgKiAgICBhY3RpdmUsIGkuZS4gYWxyZWFkeSByZS1lbmFibGVkIG9yIG5ldmVyIGRpc2FibGVkLCB0aGUgdGFnIGhhcyBubyBzcGVjaWFsIGVmZmVjdC4KKyAqICAgIEZvciBleGFtcGxlLCB0aGUgZGVmaW5lZCBlbmFibGluZyB0YWcgJnF1b3Q7PGI+ZW5hYmxlLWZvcm1hdHRlcjwvYj4mcXVvdDsKKyAqICAgIGluIHRoZSBmb2xsb3dpbmcgc25pcHBldCBpcyBub3QgbmVjZXNzYXJ5IGFzIHRoZSBmb3JtYXR0ZXIgaGFzIG5ldmVyIGJlZW4KKyAqICAgIGRpc2FibGVkOgorICogICAgIGNsYXNzIFggeworICogICAgIHZvaWQgZm9vMSgpIHt9CisgKiAgICAgdm9pZCBmb28yKCkge30KKyAqICAgICAvLyBlbmFibGUtZm9ybWF0dGVyCisgKiAgICAgdm9pZCBiYXIxKCkge30KKyAqICAgICB2b2lkIGJhcjIoKSB7fQorICogICAgIH0KKyAqIAorICogICAgT3IsIGluIHRoZSBmb2xsb3dpbmcgb3RoZXIgc25pcHBldCwgdGhlIHNlY29uZCBlbmFibGluZyB0YWcgaXMgbm90IG5lY2Vzc2FyeSBhcworICogICAgdGhlIGZvcm1hdHRpbmcgd2lsbCBoYXZlIGJlZW4gcmUtZW5hYmxlZCBieSB0aGUgZmlyc3Qgb25lOgorICogICAgIGNsYXNzIFggeworICogICAgIC8vIGRpc2FibGUtZm9ybWF0dGVyCisgKiAgICAgdm9pZCBmb28xKCkge30KKyAqICAgICB2b2lkIGZvbzIoKSB7fQorICogICAgIC8vIGVuYWJsZS1mb3JtYXR0ZXIKKyAqICAgICB2b2lkIGJhcjEoKSB7fQorICogICAgIC8vIGVuYWJsZS1mb3JtYXR0ZXIKKyAqICAgICB2b2lkIGJhcjIoKSB7fQorICogICAgIH0KKyAqIAorICogNC4gSWYgYSBtaXggb2YgZGlzYWJsaW5nIGFuZCBlbmFibGluZyB0YWdzIGlzIGRvbmUgaW4gdGhlIHNhbWUgY29tbWVudCwgdGhlbgorICogICAgdGhlIGZvcm1hdHRlciB3aWxsIG9ubHkgdGFrZSBpbnRvIGFjY291bnQgdGhlIGxhc3QgZW5jb3VudGVyZWQgdGFnIGluIHRoZQorICogICAgY29tbWVudC4KKyAqICAgIEZvciBleGFtcGxlLCBpbiB0aGUgZm9sbG93aW5nIHNuaXBwZXQsIHRoZSBmb3JtYXR0ZXIgd2lsbCBiZSByZS1lbmFibGVkIGFmdGVyCisgKiAgICB0aGUgY29tbWVudDoKKyAqICAgICAvLyBkaXNhYmxlLWZvcm1hdHRlcgorICogICAgIGNsYXNzIFggeworICogICAgIC8qCisgKiAgICAgJm5ic3A7KiBUaGlzIGlzIGEgY29tbWVudCB3aXRoIGEgbWl4IG9mIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgdGFnczoKKyAqICAgICAmbmJzcDsqICAtIDxiPmVuYWJsZS1mb3JtYXR0ZXI8L2I+CisgKiAgICAgJm5ic3A7KiAgLSA8Yj5kaXNhYmxlLWZvcm1hdHRlcjwvYj4KKyAqICAgICAmbmJzcDsqICAtIDxiPmVuYWJsZS1mb3JtYXR0ZXI8L2I+CisgKiAgICAgJm5ic3A7KiBUaGUgZm9ybWF0dGVyIHdpbGwgcmVzdGFydCB0byBmb3JtYXQgYWZ0ZXIgdGhpcyBjb21tZW50Li4uCisgKiAgICAgJm5ic3A7Ki8KKyAqICAgICB2b2lkIGZvbygpIHt9CisgKiAgICAgdm9pZCBiYXIoKSB7fQorICogICAgIH0KKyAqIAorICogNS4gVGhlIHRhZyBjYW5ub3QgaW5jbHVkZSBuZXdsaW5lIGNoYXJhY3RlciAoaS5lLiAnXG4nKSBidXQgaXQgY2FuIGhhdmUgd2hpdGUgc3BhY2VzLgorICogICAgRS5nLiAiPGI+Zm9ybWF0OiBvbjwvYj4iIGlzIGEgdmFsaWQgZW5hYmxpbmcgdGFnCisgKiAgICBJbiB0aGUgZnV0dXJlLCBuZXdsaW5lcyBtYXkgYmUgdXNlZCB0byBzdXBwb3J0IG11bHRpcGxlIGVuYWJsaW5nIHRhZ3MuCisgKiAKKyAqIEBzaW5jZSAzLjYKKyAqLworPC9wcmU+Cis8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzbmlwcGV0OjwvcD4KKzxwcmU+CitwdWJsaWMgY2xhc3MgVGVzdCB7CisvKiBkaXNhYmxlLWZvcm1hdHRlciAqLwordm9pZCAgICAgZm9vKCAgICApICAgICAgewkKKwkJCQkvLyAgICAgIHVuZm9ybWF0dGVkICAgICAgIGFyZWEgIAkgIAorfQorLyogZW5hYmxlLWZvcm1hdHRlciAqLwordm9pZCAgICAgYmFyKCAgICApICAgICAgewkKKwkJCQkvLyAgICAgIGZvcm1hdHRlZCAgICAgICBhcmVhICAJICAKK30KK30KKzwvcHJlPgorZm9ybWF0dGVkIHdpdGggZGlzYWJsaW5nIHRhZ3MgPSAmcXVvdDtkaXNhYmxlLWZvcm1hdHRlciZxdW90OyBhbmQgZW5hYmxpbmcgdGFncworPSAmcXVvdDtlbmFibGUtZm9ybWF0dGVyJnF1b3Q7IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorPHByZT4KK3B1YmxpYyBjbGFzcyBUZXN0IHsKKworLyogZGlzYWJsZS1mb3JtYXR0ZXIgKgkKK3ZvaWQgICAgIGZvbyggICAgKSAgICAgIHsKKwkJCQkvLyAgICAgIHVuZm9ybWF0dGVkICAgICAgIGFyZWEgIAkgIAorfQorLyogZW5hYmxlLWZvcm1hdHRlciAqCisJdm9pZCBiYXIoKSB7CisJCS8vIGZvcm1hdHRlZCBhcmVhCisJfQorfQorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA3OSI+MjcwNzk8L2E+IGZvciBtb3JlIGRldGFpbHMuCis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5ODA0Ij4xMjk4MDQ8L2E+CitbZG9tXSBMb2NhbCB2YXJpYWJsZSBiaW5kaW5ncyBmcm9tIEFTVFBhcnNlciNjcmVhdGVBU1RzKC4uLCBTdHJpbmdbXSwgLi4sIC4uKSBoYXZlIG5vIGRlY2xhcmluZyBtZXRob2QKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NzA1Ij4zMDQ3MDU8L2E+CitbZm9ybWF0dGVyXSBVbmV4cGVjdGVkIGluZGVudGF0aW9uIG9mIHdyYXBwZWQgbGluZSBjb21tZW50cyB3aGVuICdOZXZlciBpbmRlbnQgbGluZSBjb21tZW50IG9uIGZpcnN0IGNvbHVtbicgcHJlZmVyZW5jZSBpcyBjaGVja2VkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDY1NiI+MzA0NjU2PC9hPgorU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHVzaW5nIEpEVCBkb20gbWV0aG9kcyB0byBwcm9jZXNzIHNvdXJjZWZpbGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NTA2Ij4zMDQ1MDY8L2E+CitUYXNrIGRlc2NyaXB0aW9ucyBhbHdheXMgaGF2ZSBhIHNwYWNlIGFmdGVyIHRoZSB0YWcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0MDgxIj4zMDQwODE8L2E+CitJSmF2YVByb2plY3QjaXNPbkNsYXNzcGF0aChJSmF2YUVsZW1lbnQpIHJldHVybnMgZmFsc2UgZm9yIHR5cGUgZnJvbSByZWZlcmVuY2VkIEpBUgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQxMjIiPjMwNDEyMjwvYT4KK1R5cGVCaW5kaW5ncy5nZXRBbm5vdGF0aW9ucygpIGJyZWFrcyBpbnRlcmZhY2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NDE2Ij4zMDQ0MTY8L2E+CitWZXJpZnlFcnJvciBhZnRlciBjb21waWxpbmcgd2l0aG91dCBwcmVzZXJ2ZSBhbGwgbG9jYWxzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDUyOSI+MzA0NTI5PC9hPgorW2Zvcm1hdHRlcl0gTlBFIHdoZW4gZWl0aGVyIHRoZSBkaXNhYmxpbmcgb3IgdGhlIGVuYWJsaW5nIHRhZyBpcyBub3QgZGVmaW5lZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA3OSI+MjcwNzk8L2E+CitUYWdzIGZvciBkaXNhYmxpbmcvZW5hYmxpbmcgY29kZSBmb3JtYXR0ZXIgKGZlYXR1cmUpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDMxNiI+MzA0MzE2PC9hPgorTlBFIHdoZW4gamF2YWRvYyBVUkwgaXMgaW52YWxpZAorCis8YSBuYW1lPSJ2X0EzNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTYgLSBNYXJjaCAyLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EzNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMzciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBuZXcgY29uZmlndXJhYmxlIG9wdGlvbiB0byBmaXggYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTU1NTEiPjI5NTU1MTwvYT46PGJyPgorPHByZT4KKy8qKgorICogQ29tcGlsZXIgb3B0aW9uIElEOiBGdXJ0aGVyIERldGVybWluaW5nIHRoZSBFZmZlY3Qgb2YgQFN1cHByZXNzV2FybmluZ3MgaWYgYWxzbworICogQ09NUElMRVJfUEJfU1VQUFJFU1NfV0FSTklOR1MgaXMgZW5hYmxlZC4KKyAqIFdoZW4gZW5hYmxlZCwgdGhlIEBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gY2FuIGFkZGl0aW9uYWxseSBiZSB1c2VkIHRvIHN1cHByZXNzIAorICogb3B0aW9uYWwgY29tcGlsZXIgZGlhZ25vc3RpY3MgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCBhcyBFUlJPUi4KKyAqIFdoZW4gZGlzYWJsZWQsIGFsbCBAU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9ucyBvbmx5IGFmZmVjdHMgd2FybmluZ3MuCisgKgorICogT3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc09wdGlvbmFsRXJyb3JzIgorICogUG9zc2libGUgdmFsdWVzOiB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisgKiBEZWZhdWx0OiAiZGlzYWJsZWQiCisgKiAKKyAqIEBzaW5jZSAzLjYKKyAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1NVUFBSRVNTX09QVElPTkFMX0VSUk9SUyA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc09wdGlvbmFsRXJyb3JzIjsKKzwvcHJlPgorPC9saT4KKzxsaT4KK0FkZGVkIGEgbmV3IGZvcm1hdHRlciBwcmVmZXJlbmNlcyB0byBhbGlnbiBtZXRob2QgZGVjbGFyYXRpb24uCis8cD4KK1RoaXMgbmV3IHByZWZlcmVuY2UgaXMgY29udHJvbGxlZCB3aXRoIHRoZSBvcHRpb246PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfTUVUSE9EX0RFQ0xBUkFUSU9OPC9jb2RlPgorPHByZT4KKy8qKgorICogRk9STUFUVEVSIC8gT3B0aW9uIGZvciBhbGlnbm1lbnQgb2YgbWV0aG9kIGRlY2xhcmF0aW9uCisgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgY3JlYXRlQWxpZ25tZW50VmFsdWUoZmFsc2UsIFdSQVBfTk9fU1BMSVQsIElOREVOVF9ERUZBVUxUKQorICogCisgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKKyAqIEBzaW5jZSAzLjYKKyAqLworPC9wcmU+Cis8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzbmlwcGV0OjwvcD4KKzxwcmU+CitwdWJsaWMgY2xhc3MgVGVzdCB7CitwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIGphdmEubGFuZy5TdHJpbmcgYV9tZXRob2Rfd2hpY2hfaGFzX2FfdmVyeV9sb25nX25hbWUoKSB7CityZXR1cm4gbnVsbDsKK30KK30KKzwvcHJlPgorZm9ybWF0dGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlIGFjdGl2YXRlZCBhcyAnV3JhcCBvbmx5IHdoZW4gbmVjZXNzYXJ5Jywgd2lsbAorcHJvZHVjZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKKzxwcmU+CitwdWJsaWMgY2xhc3MgVGVzdCB7CisJcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBqYXZhLmxhbmcuU3RyaW5nCisJCQlhX21ldGhvZF93aGljaF9oYXNfYV92ZXJ5X2xvbmdfbmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQ3ODkiPjI4NDc4OTwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+Cis8bGk+TmV3IEFQSSB0byBmaXggYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY1OTQiPjI0NjU5NDwvYT4uIFNlZSB0aGUgYnVnIGZvciBkZXRhaWxzLgorPHByZT4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyCisJLyoqCisJICogUmV0dXJucyB0aGUgc2lnbmF0dXJlcyBmb3IgdGhpcyB0eXBlIHBhcmFtZXRlcidzIGJvdW5kcy4gVGhlIHR5cGUgcGFyYW1ldGVyIG1heSBoYXZlIAorCSAqIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiBhIHR5cGUgb3IgYSBtZXRob2QuIFRoZSBzaWduYXR1cmVzIHJlcHJlc2VudCBvbmx5IHRoZSBpbmRpdmlkdWFsIAorCSAqIGJvdW5kcyBhbmQgZG8gbm90IGluY2x1ZGUgdGhlIHR5cGUgdmFyaWFibGUgbmFtZSBvciB0aGUgPGNvZGU+ZXh0ZW5kczwvY29kZT4ga2V5d29yZC4gIAorCSAqIFRoZSBzaWduYXR1cmVzIG1heSBiZSBlaXRoZXIgdW5yZXNvbHZlZCAoZm9yIHNvdXJjZSB0eXBlcykgb3IgcmVzb2x2ZWQgKGZvciBiaW5hcnkgdHlwZXMpLiAKKwkgKiBTZWUge0BsaW5rIFNpZ25hdHVyZX0gZm9yIGRldGFpbHMuCisJICogCisJICogQHJldHVybiB0aGUgc2lnbmF0dXJlcyBmb3IgdGhlIGJvdW5kcyBvZiB0aGlzIGZvcm1hbCB0eXBlIHBhcmFtZXRlcgorCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEBzZWUgU2lnbmF0dXJlCisJICogQHNpbmNlIDMuNgorCSAqLworCVN0cmluZ1tdIGdldEJvdW5kc1NpZ25hdHVyZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworPC9wcmU+Cis8L2xpPgorPGxpPgorQWRkZWQgYSBuZXcgZm9ybWF0dGVyIHByZWZlcmVuY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZvcm1hdHRpbmcgb2YgbGluZQorY29tbWVudHMgdGhhdCBzdGFydCBvbiB0aGUgZmlyc3QgY29sdW1uLjxicj4KK05vdGUgdGhhdCB0aGUgaW5kZW50YXRpb24gb2YgbGluZSBjb21tZW50cyB3aWxsIGFsc28gYmUgZGlzYWJsZWQgd2hlbiBhY3RpdmF0aW5nCit0aGlzIG9wdGlvbiwgYXMgb3RoZXJ3aXNlIHRoZSBmb3JtYXR0ZXIgY291bGQgbm90IHByb2R1Y2Ugc3RhYmxlIG91dHB1dHMuLi4KKzxwPgorVGhlIGRlZmF1bHQgaXMgdG8gZm9ybWF0IHRoZXNlIGNvbW1lbnRzIHRvIGhhdmUgYSBiYWNrd2FyZCBjb21wYXRpYmxlIGJlaGF2aW9yLgorPC9wPjxwPgorVGhpcyBuZXcgcHJlZmVyZW5jZXMgaXMgY29udHJvbGxlZCB3aXRoIHRoZSBvcHRpb25zOjwvcD4KKzxjb2RlPkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9MSU5FX0NPTU1FTlRfU1RBUlRJTkdfT05fRklSU1RfQ09MVU1OPC9jb2RlPgorPHByZT4KKy8qKgorICogRk9STUFUVEVSIC8gT3B0aW9uIHRvIGZvcm1hdCBsaW5lIGNvbW1lbnRzIHRoYXQgc3RhcnQgb24gdGhlIGZpcnN0IGNvbHVtbgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW4iCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBUUlVFLCBGQUxTRSB9CisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgVFJVRQorICogCisgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBlaXRoZXIgdGhlCisgKiB7QGxpbmsgI0ZPUk1BVFRFUl9DT01NRU5UX0ZPUk1BVF9MSU5FX0NPTU1FTlR9IG9wdGlvbiBoYXMgYmVlbiBzZXQgdG8KKyAqIHtAbGluayAjRkFMU0V9IG9yIHRoZSBmb3JtYXR0ZXIgaXMgY3JlYXRlZCB3aXRoIHRoZSBtb2RlCisgKiB7QGxpbmsgVG9vbEZhY3RvcnkjTV9GT1JNQVRfTkVXfS4KKyAqIAorICogQHNlZSAjVFJVRQorICogQHNlZSAjRkFMU0UKKyAqIEBzZWUgVG9vbEZhY3RvcnkjY3JlYXRlQ29kZUZvcm1hdHRlcihNYXAsIGludCkKKyAqIEBzaW5jZSAzLjYKKyAqLworPC9wcmU+Cis8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzbmlwcGV0OjwvcD4KKzxwcmU+CitwdWJsaWMgY2xhc3MgWDAxIHsKKy8vICAgIGludAlhICA9ICAgMTsKKy8vICAgIGludAliICA9ICAgMjsKK30KKzwvcHJlPgord2lsbCBiZSB1bnRvdWNoZWQgYnkgdGhlIGZvcm1hdHRlciBpZiBib3RoIG9wdGlvbnMgYXJlIGFjdGl2YXRlZC4KK1NlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTEzMyI+MjUxMTMzPC9hPiBmb3IgbW9yZSBkZXRhaWxzLgorPC9saT4KKzxsaT5OZXcgQVBJIHRvIGZpeCBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjQzMSI+MjUyNDMxPC9hPi4gU2VlIHRoZSBidWcgZm9yIGRldGFpbHMuCis8cHJlPgorb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5CisJLyoqCisJICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJ5IHRoYXQgaXMgbWFraW5nIGEgcmVmZXJlbmNlIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5LiBGb3IgZW50cnkga2luZHMgCisJICoge0BsaW5rICNDUEVfTElCUkFSWX0sIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGVudHJ5IHRoYXQgaXMgcmVwcmVzZW50aW5nIHRoZSBKQVIgdGhhdCBpbmNsdWRlcyAKKwkgKiA8Y29kZT50aGlzPC9jb2RlPiBpbiB0aGUgTUFOSUZFU1QuTUYgZmlsZSdzIENsYXNzLVBhdGggc2VjdGlvbi4gRm9yIGVudHJ5IGtpbmRzIG90aGVyIHRoYW4gCisJICoge0BsaW5rICNDUEVfTElCUkFSWX0sIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gRm9yIHRob3NlIGVudHJpZXMgdGhhdCBhcmUgb24gdGhlIHJhdyBjbGFzc3BhdGggYWxyZWFkeSwgCisJICogdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogSXQgaXMgcG9zc2libGUgdGhhdCBtdWx0aXBsZSBsaWJyYXJ5IGVudHJpZXMgcmVmZXIgdG8gdGhlIHNhbWUgZW50cnkKKwkgKiB2aWEgdGhlIE1BTklGRVNULk1GIGZpbGUuIEluIHRob3NlIGNhc2VzLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBjbGFzc3BhdGggZW50cnkgCisJICogdGhhdCBhcHBlYXJzIGluIHRoZSByYXcgY2xhc3NwYXRoLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgb3RoZXIgcmVmZXJlbmNpbmcgCisJICogZW50cmllcyBkbyBub3QgcmVsYXRlIHRvIHRoZWlyIHJlZmVyZW5jZWQgZW50cmllcy4gCisJICogU2VlIHtAbGluayBKYXZhQ29yZSNnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnksIElKYXZhUHJvamVjdCl9IGZvciAKKwkgKiBtb3JlIGRldGFpbHMuCisJICogCisJICogQHJldHVybiB0aGUgY2xhc3NwYXRoIGVudHJ5IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhpcyBlbnRyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAJCW5vdCBhcHBsaWNhYmxlLgorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlJQ2xhc3NwYXRoRW50cnkgZ2V0UmVmZXJlbmNpbmdFbnRyeSgpOworCisKK29yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdAorCS8qKgorCSAqIFdvcmtzIHNpbWlsYXIgdG8ge0BsaW5rICNzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKX0gYW5kIAorCSAqIGFkZGl0aW9uYWxseSBhbGxvd3MgcGVyc2lzdGluZyB0aGUgZ2l2ZW4gYXJyYXkgb2YgcmVmZXJlbmNlZCBlbnRyaWVzIGZvciB0aGlzIHByb2plY3QuCisJICogVGhlIHJlZmVyZW5jZWQgZW50cmllcyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcmUgc3RvcmVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUgb2YgdGhpcyAKKwkgKiBwcm9qZWN0LiBGb3IgZGV0YWlscyBvbiByZWZlcmVuY2VkIGVudHJpZXMsIHNlZSAKKwkgKiB7QGxpbmsgSmF2YUNvcmUjZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5LCBJSmF2YVByb2plY3QpfQorCSAqIGFuZCB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I2dldFJlZmVyZW5jaW5nRW50cnkoKX0uCisJICogCisJICogU2luY2UgdGhlIHJlZmVyZW5jZWQgZW50cmllcyBhcmUgc3RvcmVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUsIGNsaWVudHMgY2FuIHN0b3JlIGFkZGl0aW9uYWwgCisJICogaW5mb3JtYXRpb24gdGhhdCBiZWxvbmcgdG8gdGhlc2UgZW50cmllcyBhbmQgcmV0cmlldmUgdGhlbSBhY3Jvc3Mgc2Vzc2lvbnMsIHRob3VnaCB0aGUgcmVmZXJlbmNlZAorCSAqIGVudHJpZXMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHByZXNlbnQgaW4gdGhlIHJhdyBjbGFzc3BhdGguIEJ5IHBhc3NpbmcgYSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIHJlZmVyZW5jZWRFbnRyaWVzLCBjbGllbnRzIGNhbiBjaG9vc2Ugbm90IHRvIG1vZGlmeSB0aGUgYWxyZWFkeSBwZXJzaXN0ZWQgcmVmZXJlbmNlZCBlbnRyaWVzLAorCSAqIHdoaWNoIGlzIGZ1bGx5IGVxdWl2YWxlbnQgdG8ge0BsaW5rICNzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKX0uCisJICogSWYgYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkIGFzIHJlZmVyZW5jZWRFbnRyaWVzLCB0aGUgYWxyZWFkeSBwZXJzaXN0ZWQgcmVmZXJlbmNlZCBlbnRyaWVzLCAKKwkgKiBpZiBhbnksIHdpbGwgYmUgY2xlYXJlZC4gCisJICogCisJICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgb2YgYSByZWZlcmVuY2VkIGVudHJ5IG9yIGlmIGFueSBvZiB0aGUgPGNvZGU+cmVmZXJlbmNlZEVudHJpZXM8L2NvZGU+IAorCSAqIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcmF3IGNsYXNzcGF0aCg8Y29kZT5lbnRyaWVzPC9jb2RlPikgdGhvc2UgcmVmZXJlbmNlZCBlbnRyaWVzIHdpbGwgCisJICogYmUgZXhjbHVkZWQgYW5kIG5vdCBiZSBwZXJzaXN0ZWQuCisJICoKKwkgKiBAcGFyYW0gZW50cmllcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMKKwkgKiBAcGFyYW0gcmVmZXJlbmNlZEVudHJpZXMgdGhlIGxpc3Qgb2YgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcyB0byBiZSBwZXJzaXN0ZWQKKwkgKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiAgCVRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKQorCSAqICAJVGhlIGNsYXNzcGF0aCBpcyBiZWluZyBtb2RpZmllZCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbiAoQ09SRV9FWENFUFRJT04pCisJICogIAlUaGUgY2xhc3NwYXRoIGZhaWxlZCB0aGUgdmFsaWRhdGlvbiBjaGVjayBhcyBkZWZpbmVkIGJ5IHtAbGluayBKYXZhQ29udmVudGlvbnMjdmFsaWRhdGVDbGFzc3BhdGgoSUphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSwgSVBhdGgpfQorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CisJICogQHNlZSAjZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoKQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwl2b2lkIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJQ2xhc3NwYXRoRW50cnlbXSByZWZlcmVuY2VkRW50cmllcywgSVBhdGggb3V0cHV0TG9jYXRpb24sCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgY2xhc3NwYXRoIGVudHJpZXMgc3RvcmVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUgb2YgPGNvZGU+dGhpczwvY29kZT4gCisJICogamF2YSBwcm9qZWN0LiBDbGllbnRzIGNhbiBzdG9yZSB0aGUgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcyB1c2luZyAKKwkgKiB7QGxpbmsgI3NldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSwgSUNsYXNzcGF0aEVudHJ5W10sIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKX0KKwkgKiBJZiB0aGUgY2xpZW50IGhhcyBub3Qgc3RvcmVkIGFueSByZWZlcmVuY2VkIGVudHJpZXMgZm9yIHRoaXMgcHJvamVjdCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCisJICoKKwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcyBzdG9yZWQgZm9yIHRoaXMgamF2YSBwcm9qZWN0IG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKwkgKiAJCQlzdG9yZWQgZWFybGllci4KKwkgKiBAc2luY2UgMy42CisJICovCisJSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVmZXJlbmNlZENsYXNzcGF0aEVudHJpZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCitvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdAorCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290LgorCSAqIEEgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGlzIHNhaWQgdG8gY29ycmVzcG9uZCB0byBhIHJvb3QgaWYgdGhlIHBhdGggb2YgdGhlIHJlc29sdmVkCisJICogZW50cnkgaXMgZXF1YWwgdG8gdGhlIHJvb3QncyBwYXRoLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CisJICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLiAKKwkgKiBAc2luY2UgMy42CisJICovCisJSUNsYXNzcGF0aEVudHJ5IGdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCitvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZQorCS8qKgorCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IAorCSAqIGJ5IGEgZ2l2ZW4gY2xhc3NwYXRoIGVudHJ5LiBGb3IgdGhlIGVudHJ5IGtpbmQge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNDUEVfTElCUkFSWX0sIAorCSAqIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgbGlicmFyaWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBDbGFzcy1QYXRoIHNlY3Rpb24gb2YgCisJICogdGhlIE1BTklGRVNULk1GIGZpbGUuIElmIGEgcmVmZXJlbmNlZCBKQVIgZmlsZSBoYXMgZnVydGhlciByZWZlcmVuY2VzIHRvIG90aGVyIGxpYnJhcnkgCisJICogZW50cmllcywgdGhleSBhcmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5IGFuZCBhZGRlZCB0byB0aGUgbGlzdC4gRm9yIGVudHJ5IGtpbmRzIG90aGVyIAorCSAqIHRoYW4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNDUEVfTElCUkFSWX0sIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCisJICoKKwkgKiBJZiBhIHJlZmVyZW5jZWQgZW50cnkgaGFzIGFscmVhZHkgYmVlbiBzdG9yZWQgCisJICogaW4gdGhlIGdpdmVuIHByb2plY3QncyAuY2xhc3NwYXRoLCB0aGUgc3RvcmVkIGF0dHJpYnV0ZXMgYXJlIHBvcHVsYXRlZCBpbiB0aGUgY29ycmVzcG9uZGluZworCSAqIHJlZmVyZW5jZWQgZW50cnkuIEZvciBtb3JlIGRldGFpbHMgb24gc3RvcmluZyByZWZlcmVuY2VkIGVudHJpZXMgc2VlCisJICogc2VlIHtAbGluayBJSmF2YVByb2plY3Qjc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdLCBJQ2xhc3NwYXRoRW50cnlbXSwgSVBhdGgsIAorCSAqIElQcm9ncmVzc01vbml0b3IpfS4gCisJICogCisJICogQHBhcmFtIGxpYnJhcnlFbnRyeSB0aGUgbGlicmFyeSBlbnRyeSB3aG9zZSByZWZlcmVuY2VkIGVudHJpZXMgYXJlIHNvdWdodCAKKwkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHdoZXJlIHRoZSBwZXJzaXN0ZWQgcmVmZXJlbmNlZCBlbnRyaWVzIHRvIGJlIHJldHJpZXZlZCBmcm9tCisJICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgdGhlIGdpdmVuIGVudHJ5LiAKKwkgKiAJCQlJZiBub3QgYXBwbGljYWJsZSwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KKwkgKiBAc2luY2UgMy42CisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSZWZlcmVuY2VkQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnkgbGlicmFyeUVudHJ5LCBJSmF2YVByb2plY3QgcHJvamVjdCk7CQorPC9wcmU+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNDMxIj4yNTI0MzE8L2E+CitOZXcgQVBJIGlzIG5lZWRlZCB0byBiZXR0ZXIgaWRlbnRpZnkgcmVmZXJlbmNlZCBqYXJzIGluIHRoZSBDbGFzcy1QYXRoOiBlbnRyeQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTExMzMiPjI1MTEzMzwvYT4KK1tmb3JtYXR0ZXJdIEF1dG9tYXRpYyBmb3JtYXR0aW5nIHNpbmdsZSBsaW5lIGNvbW1lbnRzIGlzIGluY29oZXJlbnQgYW1vbmcgdG9vbHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4ODk3Ij4yNDg4OTc8L2E+CitbMS41XVtjb21waWxlcl0gV3Jvbmcgd2FybmluZyAnVGhlIGxvY2FsIHZhcmlhYmxlICd2YXInIGlzIG5ldmVyIHJlYWQnLgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQwMzEiPjMwNDAzMTwvYT4KK1VudXNlZCBAU3VwcHJlc3NXYXJuaW5ncyguLikgbm90IGZsYWdnZWQgd2hlbiBzdXBwcmVzc2VkIHByb2JsZW0gaXMgc2V0IHRvIEVycm9yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTU1MSI+Mjk1NTUxPC9hPgorQWRkIG9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IHByb21vdGUgYWxsIHdhcm5pbmdzIHRvIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM4MTAiPjMwMzgxMDwvYT4KK0NvbXBhY3QgYm9vbGVhbiBmaWVsZHMgb24gRmxvd0NvbnRleHQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxMjI3Ij4yNTEyMjc8L2E+CitbY29tcGlsZXJdIEZ1cCBvZiBidWcgMTE1ODE0LCBjb21wYXJpbmcgZG91YmxlcyBzaG91bGQgbm90IGJlIGZsYWdnZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4Nzk4Ij4yNjg3OTg8L2E+CitbMS41XVtjb21waWxlcl0gRWNsaXBzZSAzLjVNNS82IHByb2R1Y2VzIG5ldyBjb21waWxlciBlcnJvcnMgd2l0aCBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM0NDgiPjMwMzQ0ODwvYT4KK1dyb25nIGNvZGUgZ2VuZXJhdGlvbiBvcHRpbWl6YXRpb24gd2hlbiBhc3NlcnQgY29uZGl0aW9uIGlzIGZhbHNlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzc3NiI+MzAzNzc2PC9hPgorTWVtYmVyIHR5cGVzIGltcG9ydHMgYXJlIHJlbW92ZWQgdG9vIGFnZ3Jlc3NpdmVseQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDI5NDkiPjMwMjk0OTwvYT4KK0phdmFNb2RlbE1hbmFnZXIgaGFuZ3MgYWNjZXNzaW5nIHRoZSBub25DaGFpbmluZ0phcnMgc2V0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjU5NCI+MjQ2NTk0PC9hPgorW21vZGVsXSBBUEkgcmVxdWVzdDogSVR5cGVQYXJhbWV0ZXIjZ2V0Qm91bmRzU2lnbmF0dXJlcygpIG9yICNnZXRTaWduYXR1cmUoKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTM4OTYiPjI1Mzg5NjwvYT4KK1tjb21waWxlcl1bbnVsbF0gd3JvbmcgJnF1b3Q7TnVsbCBjb21wYXJpc29uIGFsd2F5cyB5aWVsZHMgZmFsc2UmcXVvdDsgcHJvYmxlbSBmb3IgYXV0by11bmJveGluZworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQ3ODkiPjI4NDc4OTwvYT4KK1tmb3JtYXR0ZXJdIERvZXMgbm90IGxpbmUtYnJlYWsgbWV0aG9kIGRlY2xhcmF0aW9uIGV4Y2VwdGlvbiB3aXRoIHBhcmFtZXRlcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAzNDgwIj4zMDM0ODA8L2E+CitbMS41XVtjb21waWxlcl0gQ0NFOiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJlZEJsb2NrIGNhbm5vdCBiZSBjYXN0IHRvIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcmVkVHlwZQorCis8YSBuYW1lPSJ2X0EzNiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTYgLSBGZWJydWFyeSAyMywgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTM2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitBZGRlZCBhIG5ldyBmb3JtYXR0ZXIgcHJlZmVyZW5jZXMgdG8gYWxpZ24gYW5ub3RhdGlvbiBhcmd1bWVudHMgKGkuZS4gZWxlbWVudC12YWx1ZSBwYWlycykuCis8cD4KK1RoaXMgbmV3IHByZWZlcmVuY2UgaXMgY29udHJvbGxlZCB3aXRoIHRoZSBvcHRpb246PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0FMSUdOTUVOVF9GT1JfQVJHVU1FTlRTX0lOX0FOTk9UQVRJT048L2NvZGU+Cis8cHJlPgorLyoqCisgKiBGT1JNQVRURVIgLyBPcHRpb24gZm9yIGFsaWdubWVudCBvZiBhcmd1bWVudHMgaW4gYW5ub3RhdGlvbgorICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbiIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB2YWx1ZXMgcmV0dXJuZWQgYnkgPGNvZGU+Y3JlYXRlQWxpZ25tZW50VmFsdWUoYm9vbGVhbiwgaW50LCBpbnQpPC9jb2RlPiBjYWxsCisgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgY3JlYXRlQWxpZ25tZW50VmFsdWUoZmFsc2UsIFdSQVBfTk9fU1BMSVQsIElOREVOVF9ERUZBVUxUKQorICogCisgKiBAc2VlICNjcmVhdGVBbGlnbm1lbnRWYWx1ZShib29sZWFuLCBpbnQsIGludCkKKyAqIEBzaW5jZSAzLjYKKyAqLworPC9wcmU+Cis8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzbmlwcGV0OjwvcD4KKzxwcmU+CitATXlBbm5vdCh2YWx1ZTEgPSAidGhpcyBpcyBhbiBleGFtcGxlIiwgdmFsdWUyID0gIm9mIGFuIGFubm90YXRpb24iLCB2YWx1ZTMgPSAid2l0aCBzZXZlcmFsIGFyZ3VtZW50cyIsIHZhbHVlNCA9ICJ3aGljaCBtYXkgbmVlZCB0byBiZSB3cmFwcGVkIikKK3B1YmxpYyBjbGFzcyBUZXN0IHsKK30KKzwvcHJlPgorZm9ybWF0dGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlIGFjdGl2YXRlZCwgd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0Cit3aGlsZSB1c2luZyB0aGUgPGNvZGU+RWNsaXBzZSBbYnVpbHQtaW5dPC9jb2RlPiBwcm9maWxlOgorPHByZT4KK0BNeUFubm90KHZhbHVlMSA9ICJ0aGlzIGlzIGFuIGV4YW1wbGUiLCB2YWx1ZTIgPSAib2YgYW4gYW5ub3RhdGlvbiIsCisJCXZhbHVlMyA9ICJ3aXRoIHNldmVyYWwgYXJndW1lbnRzIiwKKwkJdmFsdWU0ID0gIndoaWNoIG1heSBuZWVkIHRvIGJlIHdyYXBwZWQiKQorcHVibGljIGNsYXNzIFRlc3QgeworfQorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODIwMzAiPjI4MjAzMDwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+Cis8bGk+SW4gb3JkZXIgdG8gZ2V0IGJpbmRpbmdzIG91dHNpZGUgdGhlIEVjbGlwc2UgZW52aXJvbm1lbnQsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBoYXMgYmVlbiBhZGRlZCBvbiB0aGUgQVNUUGFyc2VyIGNsYXNzLgorPGJyPlNlZSBidWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjM5MSI+MjA2MzkxPC9hPiBmb3IgZGV0YWlscy48YnI+Cis8cHJlPgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcgorCS8qKgorCSAqIFNldCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIG5vIElKYXZhUHJvamVjdCBhcmUgYXZhaWxhYmxlLgorCSAqIAorCSAqIFRoZSB1c2VyIGhhcyB0byBiZSBzdXJlIHRvIGluY2x1ZGUgYWxsIHJlcXVpcmVkIHR5cGVzIG9uIHRoZSBjbGFzc3BhdGhzIGZvciBiaW5hcnkgdHlwZXMKKwkgKiBvciBvbiB0aGUgc291cmNlcGF0aHMgZm9yIHNvdXJjZSB0eXBlcyB0byByZXNvbHZlIHRoZSBnaXZlbiBzb3VyY2UgY29kZS4KKwkgKiBBbGwgY2xhc3NwYXRoIGFuZCBzb3VyY2VwYXRoIGVudHJpZXMgYXJlIGFic29sdXRlIHBhdGhzLgorCSAqIElmIHNvdXJjZXBhdGhzIGNvbnRhaW4gdW5pdHMgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZyAobm90IHRoZSBwbGF0Zm9ybSBlbmNvZGluZyksIHRoZW4gdGhlCisJICogZ2l2ZW4gZW5jb2RpbmdzIG11c3QgYmUgc2V0LiBJZiB0aGUgZ2l2ZW4gZW5jb2RpbmdzIGlzIHNldCwgaXRzIGxlbmd0aCBtdXN0CisJICogbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlcGF0aHMgcGFyYW1ldGVyIG9yIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKwkgKiBJZiBlbmNvZGluZ3MgaXMgbm90IG51bGwsIHRoZSBnaXZlbiBzb3VyY2VwYXRoRW50cmllcyBtdXN0IG5vdCBiZSBudWxsLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyaWVzIHRoZSBnaXZlbiBjbGFzc3BhdGggZW50cmllcyB0byBiZSB1c2VkIHRvIHJlc29sdmUgYmluZGluZ3MKKwkgKiBAcGFyYW0gc291cmNlcGF0aEVudHJpZXMgdGhlIGdpdmVuIHNvdXJjZXBhdGggZW50cmllcyB0byBiZSB1c2VkIHRvIHJlc29sdmUgYmluZGluZ3MKKwkgKiBAcGFyYW0gZW5jb2RpbmdzIHRoZSBlbmNvZGluZ3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlcGF0aCBlbnRyaWVzIG9yIG51bGwgaWYgdGhlIHBsYXRmb3JtIGVuY29kaW5nCisJICogY2FuIGJlIHVzZWQuCisJICogQHBhcmFtIGluY2x1ZGVSdW5uaW5nVk1Cb290Y2xhc3NwYXRoIHRydWUgaWYgdGhlIGJvb3RjbGFzc3BhdGggb2YgdGhlIHJ1bm5pbmcgVk0gbXVzdCBiZSBwcmVwZW5kZWQgdG8gdGhlCisJICogZ2l2ZW4gY2xhc3NwYXRoIGFuZCBmYWxzZSBpZiB0aGUgYm9vdGNsYXNzcGF0aCBvZiB0aGUgcnVubmluZyBWTSBzaG91bGQgYmUgaWdub3JlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gZW5jb2RpbmdzIGlzIG5vdCBlcXVhbHMgdG8gdGhlIHNpemUgb2YgdGhlIGdpdmVuCisJICogc291cmNlcGF0aEVudHJpZXMKKwkgKiBAc2luY2UgMy42CisJICovCisJcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoU3RyaW5nW10gY2xhc3NwYXRoRW50cmllcywgU3RyaW5nW10gc291cmNlcGF0aEVudHJpZXMsIFN0cmluZ1tdIGVuY29kaW5ncywgYm9vbGVhbiBpbmNsdWRlUnVubmluZ1ZNQm9vdGNsYXNzcGF0aCk7CisJCisJLyoqCisJICogQ3JlYXRlcyBBU1RzIGZvciBhIGJhdGNoIG9mIGNvbXBpbGF0aW9uIHVuaXRzLiBXaGVuIGJpbmRpbmdzIGFyZSBiZWluZyByZXNvbHZlZCwgcHJvY2Vzc2luZyBhCisJICogYmF0Y2ggb2YgY29tcGlsYXRpb24gdW5pdHMgaXMgbW9yZSBlZmZpY2llbnQgYmVjYXVzZSBtdWNoIG9mIHRoZSB3b3JrIGludm9sdmVkIGluIHJlc29sdmluZyAKKwkgKiBiaW5kaW5ncyBjYW4gYmUgc2hhcmVkLiAKKwkgKgorCSAqIFdoZW4gYmluZGluZ3MgYXJlIGJlaW5nIHJlc29sdmVkLCBhbGwgY29tcGlsYXRpb24gdW5pdHMgYXJlIHJlc29sdmVkIAorCSAqIHVzaW5nIHRoZSBzYW1lIGVudmlyb25tZW50LCB3aGljaCBtdXN0IGJlIHNldCBiZWZvcmVoYW5kIHdpdGggCisJICoge0BsaW5rICNzZXRFbnZpcm9ubWVudChTdHJpbmdbXSwgU3RyaW5nW10sIFN0cmluZ1tdLCBib29sZWFuKSBzZXRFbnZpcm9ubWVudH0uCisJICogVGhlIGNvbXBpbGF0aW9uIHVuaXRzIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZSBpbiBubyBzcGVjaWZpZWQgb3JkZXIuIAorCSAqIEZvciBlYWNoIG9mIHRoZSBjb21waWxhdGlvbiB1bml0cyBpbiB0dXJuLAorCSAqICAtIHtAbGluayBBU1RQYXJzZXIjY3JlYXRlQVNUKElQcm9ncmVzc01vbml0b3IpIEFTVFBhcnNlci5jcmVhdGVBU1R9IGlzIGNhbGxlZCB0byBwYXJzZSBpdCAKKwkgKiAgICAgICAgICAgYW5kIGNyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgQVNULiBUaGUgY2FsbHMgdG8ge0BsaW5rIEFTVFBhcnNlciNjcmVhdGVBU1QoSVByb2dyZXNzTW9uaXRvcikgQVNUUGFyc2VyLmNyZWF0ZUFTVH0gCisJICogICAgICAgICAgIGFsbCBlbXBsb3kgdGhlIHNhbWUgc2V0dGluZ3MuPC9saT4KKwkgKiAgLSB7QGxpbmsgRmlsZUFTVFJlcXVlc3RvciNhY2NlcHRBU1QoU3RyaW5nLCBDb21waWxhdGlvblVuaXQpIEZpbGVBU1RSZXF1ZXN0b3IuYWNjZXB0QVNUfSBpcyBjYWxsZWQgcGFzc2luZworCSAqICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCBwYXRoIGFuZCB0aGUgY29ycmVzcG9uZGluZyBBU1QgdG8gPGNvZGU+cmVxdWVzdG9yPC9jb2RlPi4gVGhlIGNvbXBpbGF0aW9uIHVuaXQgcGF0aCBpcyB0aGUgc2FtZQorCSAqICAgICAgICAgICBwYXRoIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIGdpdmVuIDxjb2RlPnNvdXJjZUZpbGVQYXRoczwvY29kZT4gcGFyYW1ldGVyLgorCSAqCisJICogTm90ZSBvbmx5IEFTVHMgZnJvbSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdHMgYXJlIHJlcG9ydGVkCisJICogdG8gdGhlIHJlcXVlc3Rvci4gSWYgYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0cyBhcmUgcmVxdWlyZWQgdG8KKwkgKiByZXNvbHZlIHRoZSBvcmlnaW5hbCBvbmVzLCB0aGUgY29ycmVzcG9uZGluZyBBU1RzIGFyZSA8Yj5ub3Q8L2I+CisJICogcmVwb3J0ZWQgdG8gdGhlIHJlcXVlc3Rvci4KKwkgKiAKKwkgKiBOb3RlIGFsc28gdGhlIGZvbGxvd2luZyBwYXJzZXIgcGFyYW1ldGVycyBhcmUgdXNlZCwgcmVnYXJkbGVzcyBvZiB3aGF0CisJICogbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQ6CisJICogIC0gVGhlIHtAbGlua3BsYWluICNzZXRLaW5kKGludCkgcGFyc2VyIGtpbmR9IGlzIDxjb2RlPktfQ09NUElMQVRJT05fVU5JVDwvY29kZT4KKwkgKiAgLSBUaGUge0BsaW5rcGxhaW4gI3NldFNvdXJjZVJhbmdlKGludCxpbnQpIHNvdXJjZSByYW5nZX0gaXMgPGNvZGU+KDAsIC0xKTwvY29kZT4KKwkgKiAgLSBUaGUge0BsaW5rcGxhaW4gI3NldEZvY2FsUG9zaXRpb24oaW50KSBmb2NhbCBwb3NpdGlvbn0gaXMgbm90IHNldAorCSAqCisJICogVGhlIDxjb2RlPmJpbmRpbmdLZXlzPC9jb2RlPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIGJpbmRpbmdzIGtleXMKKwkgKiAoe0BsaW5rIElCaW5kaW5nI2dldEtleSgpfSkgdGhhdCBhcmUgdG8gYmUgbG9va2VkIHVwLiBUaGVzZSBrZXlzIG1heQorCSAqIGJlIGZvciBlbGVtZW50cyBlaXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgdGhlIHNldCBvZiBjb21waWxhdGlvbgorCSAqIHVuaXRzIGJlaW5nIHByb2Nlc3NlZC4gV2hlbiBiaW5kaW5ncyBhcmUgYmVpbmcgcmVzb2x2ZWQsCisJICogdGhlIGtleXMgYW5kIGNvcnJlc3BvbmRpbmcgYmluZGluZ3MgKG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUpIGFyZQorCSAqIHBhc3NlZCB0byB7QGxpbmsgRmlsZUFTVFJlcXVlc3RvciNhY2NlcHRCaW5kaW5nKFN0cmluZywgSUJpbmRpbmcpIEZpbGVBU1RSZXF1ZXN0b3IuYWNjZXB0QmluZGluZ30uIE5vdGUgdGhhdCBiaW5kaW5nIGtleXMKKwkgKiBmb3IgZWxlbWVudHMgb3V0c2lkZSB0aGUgc2V0IG9mIGNvbXBpbGF0aW9uIHVuaXRzIGJlaW5nIHByb2Nlc3NlZCBhcmUgbG9va2VkIHVwCisJICogYWZ0ZXIgYWxsIHtAbGluayBGaWxlQVNUUmVxdWVzdG9yI2FjY2VwdEFTVChTdHJpbmcsIENvbXBpbGF0aW9uVW5pdCkgQVNUUmVxdWVzdG9yLmFjY2VwdEFTVH0KKwkgKiBjYWxsYmFja3MgaGF2ZSBiZWVuIG1hZGUuCisJICogQmluZGluZyBrZXlzIGZvciBlbGVtZW50cyBpbnNpZGUgdGhlIHNldCBvZiBjb21waWxhdGlvbiB1bml0cyBiZWluZyBwcm9jZXNzZWQKKwkgKiBhcmUgbG9va2VkIHVwIGFuZCByZXBvcnRlZCByaWdodCBhZnRlciB0aGUgY29ycmVzcG9uZGluZworCSAqIHtAbGluayBGaWxlQVNUUmVxdWVzdG9yI2FjY2VwdEFTVChTdHJpbmcsIENvbXBpbGF0aW9uVW5pdCkgRmlsZUFTVFJlcXVlc3Rvci5hY2NlcHRBU1R9IGNhbGxiYWNrIGhhcyBiZWVuIG1hZGUuCisJICogTm8ge0BsaW5rIEZpbGVBU1RSZXF1ZXN0b3IjYWNjZXB0QmluZGluZyhTdHJpbmcsIElCaW5kaW5nKSBGaWxlQVNUUmVxdWVzdG9yLmFjY2VwdEJpbmRpbmd9IGNhbGxiYWNrcyBhcmUgbWFkZSB1bmxlc3MKKwkgKiBiaW5kaW5ncyBhcmUgYmVpbmcgcmVzb2x2ZWQuCisJICoKKwkgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCBzZXR0aW5ncyB0byB0aGVpcgorCSAqIGRlZmF1bHQgdmFsdWVzIHNvIHRoZSBvYmplY3QgaXMgcmVhZHkgdG8gYmUgcmV1c2VkLgorCSAqIAorCSAqIFRoZSBnaXZlbiA8Y29kZT5lbmNvZGluZ3M8L2NvZGU+IGFyZSB1c2VkIHRvIHByb3Blcmx5IHBhcnNlIHRoZSBnaXZlbiBzb3VyY2UgdW5pdHMuIElmIHRoZSBwbGF0Zm9ybSBlbmNvZGluZyBpcyBzdWZmaWNpZW50LAorCSAqIHRoZW4gdGhlIGdpdmVuIGVuY29kaW5ncyBjYW4gYmUgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHNvdXJjZUZpbGVQYXRocyB0aGUgY29tcGlsYXRpb24gdW5pdHMgdG8gY3JlYXRlIEFTVHMgZm9yCisJICogQHBhcmFtIGVuY29kaW5ncyB0aGUgZ2l2ZW4gZW5jb2RpbmcgZm9yIHRoZSBzb3VyY2UgdW5pdHMKKwkgKiBAcGFyYW0gYmluZGluZ0tleXMgdGhlIGJpbmRpbmcga2V5cyB0byBjcmVhdGUgYmluZGluZ3MgZm9yCisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgQVNUIHJlcXVlc3RvciB0aGF0IGNvbGxlY3RzIGFic3RyYWN0IHN5bnRheCB0cmVlcyBhbmQgYmluZGluZ3MKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyBhbmQgcmVxdWVzdCBjYW5jZWxsYXRpb24sCisJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNldHRpbmdzIHByb3ZpZGVkCisJICogYXJlIGluc3VmZmljaWVudCwgY29udHJhZGljdG9yeSwgb3Igb3RoZXJ3aXNlIHVuc3VwcG9ydGVkCisJICogQHNpbmNlIDMuNgorCSAqLworCSBwdWJsaWMgdm9pZCBjcmVhdGVBU1RzKFN0cmluZ1tdIHNvdXJjZUZpbGVQYXRocywgU3RyaW5nW10gZW5jb2RpbmdzLCBTdHJpbmdbXSBiaW5kaW5nS2V5cywgRmlsZUFTVFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKzwvcHJlPgorPC9saT4KKzxsaT4KK0FkZGVkIHR3byBuZXcgZm9ybWF0dGVyIHByZWZlcmVuY2VzIHRvIGNvbmRlbnNlIGJsb2NrIGFuZCBqYXZhZG9jIGNvbW1lbnRzLgorPHA+CitUaGVzZSBuZXcgcHJlZmVyZW5jZXMgYXJlIGNvbnRyb2xsZWQgcmVzcGVjdGl2ZWx5IHdpdGggdGhlIG9wdGlvbnM6PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfTkVXX0xJTkVTX0FUX0JMT0NLX0JPVU5EQVJJRVM8L2NvZGU+PGJyPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0NPTU1FTlRfTkVXX0xJTkVTX0FUX0pBVkFET0NfQk9VTkRBUklFUzwvY29kZT4KKzxwcmU+CisvKioKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgYmxvY2sgY29tbWVudHMgd2lsbCBoYXZlIG5ldyBsaW5lcyBhdCBib3VuZGFyaWVzCisgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzIgorICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgVFJVRSwgRkFMU0UgfQorICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIFRSVUUKKyAqIAorICogQHNlZSAjVFJVRQorICogQHNlZSAjRkFMU0UKKyAqIEBzaW5jZSAzLjYKKyAqLworCisvKioKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgamF2YWRvYyBjb21tZW50cyB3aWxsIGhhdmUgbmV3IGxpbmVzIGF0IGJvdW5kYXJpZXMKKyAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcyIKKyAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IFRSVUUsIEZBTFNFIH0KKyAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICBUUlVFCisgKiAKKyAqIEBzZWUgI1RSVUUKKyAqIEBzZWUgI0ZBTFNFCisgKiBAc2luY2UgMy42CisgKi8KKyA8L3ByZT4KKzxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6PC9wPgorPHByZT4KK3B1YmxpYyBjbGFzcyBYIHsKKwkvKgorCSAqIFRoaXMgYmxvY2sgY29tbWVudCBhZnRlciBmb3JtYXR0aW5nIHdpbGwgbm8gbG9uZ2VyIHVzZSBhIG5ldyBsaW5lCisJICogYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWVudC4uLgorCSAqLworCXZvaWQgZm9vKCkgeworCX0KKwkvKioKKwkgKiBUaGlzIGphdmFkb2MgY29tbWVudCBhZnRlciBmb3JtYXR0aW5nIHdpbGwgbm8gbG9uZ2VyIHVzZSBhIG5ldyBsaW5lCisJICogYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWVudC4uLgorCSAqLworCXZvaWQgYmFyKCkgeworCX0KK30KKzwvcHJlPgorZm9ybWF0dGVkIHdpdGggYm90aCB0aGUgb3B0aW9ucyBzZXQgdG8gRkFMU0UsIHdpbGwgcHJvZHVjZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKKzxwcmU+CitwdWJsaWMgY2xhc3MgWCB7CisJLyogVGhpcyBibG9jayBjb21tZW50IGFmdGVyIGZvcm1hdHRpbmcgd2lsbCBubyBsb25nZXIgdXNlIGEgbmV3IGxpbmUgYXQgdGhlCisJICogYmVnaW5uaW5nIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tZW50Li4uICovCisJdm9pZCBmb28oKSB7CisJfQorCisJLyoqIFRoaXMgamF2YWRvYyBjb21tZW50IGFmdGVyIGZvcm1hdHRpbmcgd2lsbCBubyBsb25nZXIgdXNlIGEgbmV3IGxpbmUgYXQKKwkgKiB0aGUgYmVnaW5uaW5nIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tZW50Li4uICovCisJdm9pZCBiYXIoKSB7CisJfQorfQorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzAyMDkiPjI3MDIwOTwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+Cis8bGk+CitUaGUgPGNvZGU+Q29kZUZvcm1hdHRlci5GX0lOQ0xVREVfQ09NTUVOVDwvY29kZT4gZmxhZyBub3cgd29ya3MgZm9yIGFsbCBraW5kCitvZiBzbmlwcGV0IHdoaWxlIHVzaW5nIHRoZSBmb3JtYXR0ZXIuPGJyPgorU2VlIGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2NDA2Ij4yMzY0MDY8L2E+IGZvciBtb3JlIGRldGFpbHMuCis8L2xpPgorPGxpPgorQWRkZWQgYSBuZXcgZm9ybWF0dGVyIHByZWZlcmVuY2VzIHRvIGluc2VydCBhIG5ldyBsaW5lIGFmdGVyIGEgbGFiZWwuCis8cD4KK1RoaXMgbmV3IHByZWZlcmVuY2UgaXMgY29udHJvbGxlZCB3aXRoIHRoZSBvcHRpb246PC9wPgorPGNvZGU+RGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9ORVdfTElORV9BRlRFUl9MQUJFTDwvY29kZT4KKzxwcmU+CisvKioKKyAqIEZPUk1BVFRFUiAvIE9wdGlvbiB0byBpbnNlcnQgYSBuZXcgbGluZSBhZnRlciBhIGxhYmVsCisgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWwiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyBJTlNFUlQsIERPX05PVF9JTlNFUlQgfQorICogICAgIC0gZGVmYXVsdDogICAgICAgICAgIERPX05PVF9JTlNFUlQKKyAqCisgKiBAc2VlIEphdmFDb3JlI0lOU0VSVAorICogQHNlZSBKYXZhQ29yZSNET19OT1RfSU5TRVJUCisgKiBAc2luY2UgMy42CisgKi8KKzwvcHJlPgorPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc25pcHBldDo8L3A+Cis8cHJlPgorcHVibGljIGNsYXNzIFggeworCXZvaWQgZm9vKCkgeworCQlMQUJFTDpmb3IgKGludCBpID0gMDsgaSAmbHQ7IDEwOyBpKyspIHsKKwkJfQorCX0KK30KKzwvcHJlPgorZm9ybWF0dGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlIGFjdGl2YXRlZCwgd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorPHByZT4KK3B1YmxpYyBjbGFzcyBYIHsKKwl2b2lkIGZvbygpIHsKKwkJTEFCRUw6CisJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgMTA7IGkrKykgeworCQl9CisJfQorfQorPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA3NDEiPjE1MDc0MTwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgzNjIiPjI5ODM2MjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDb21waWxlciByZXR1cm5zIGphdmEubGFuZy5PYmplY3QgaW5zdGVhZCBvZiBnZW5lcmljIHR5cGUgVCB3aGVuIGphdmFjIHJldHVybnMgVAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODE2NTUiPjI4MTY1NTwvYT4KK1tmb3JtYXR0ZXJdICZxdW90O05ldmVyIGpvaW4gbGluZXMmcXVvdDsgZG9lcyBub3Qgd29yayBmb3IgYW5ub3RhdGlvbnMuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MjAzMCI+MjgyMDMwPC9hPgorW2Zvcm1hdHRlcl0gSmF2YSBhbm5vdGF0aW9uIGZvcm1hdHRpbmcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwMjA5Ij4yNzAyMDk8L2E+CitbZm9ybWF0XSBDb25kZW5zZWQgYmxvY2sgY29tbWVudCBmb3JtYXR0aW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjQwNiI+MjM2NDA2PC9hPgorW2Zvcm1hdHRlcl0gVGhlIGNvbW1lbnRzIGZsYWdzIHNob3VsZCB3b3JrIGZvciBhbGwga2luZHMgb2Ygc25pcHBldAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQzNjAiPjI5NDM2MDwvYT4KK0R1cGxpY2F0ZSBlbnRyaWVzIGluIENsYXNzcGF0aCBSZXNvbHV0aW9uIHdoZW4gaW1wb3J0aW5nIGRlcGVuZGVuY2llcyBmcm9tIHBhcmVudCBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjM5MSI+MjA2MzkxPC9hPgorW0RPTV0gQmluZGluZyBSZXNvbHV0aW9ucyBmb3IgcHJvamVjdHMgb3V0c2lkZSBvZiBFY2xpcHNlIHdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA0MDkiPjE1MDQwOTwvYT4KK1tjb21waWxlcl0gQVNUIGRvZXMgbm90IGV4cG9zZSBtZXRob2QgYmluZGluZ3MgZm9yIG5vbi12aXNpYmxlIGluaGVyaXRlZCBmaWVsZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIzNTgiPjMwMjM1ODwvYT4KK0NvbXBpbGVyIGZpbmRzIHdyb25nIG1ldGhvZCBmb3IgbWV0aG9kIGludm9jYXRpb24gd2l0aCBnZW5lcmljcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDI5MTkiPjMwMjkxOTwvYT4KK21pc3JlcG9ydGVkIGNhc3QgRXJyb3Igd2hlbiBtaXhpbmcgZ2VuZXJpYyBhbmQgcmF3IGNsYXNzIGluIG5lc3RlZCBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA3NDEiPjE1MDc0MTwvYT4KK1tmb3JtYXR0ZXJdIEFkZCAgb3B0aW9uOiAmcXVvdDthZGQgbmV3IGxpbmUgYWZ0ZXIgbGFiZWwmcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3OTM5Ij4yODc5Mzk8L2E+CitbY29kZSBhc3Npc3RdIFRoZSBpbnN0YW5jZW9mIGFuZCB0aGUgYXV0byBjYXN0IGZlYXR1cmUgc2hvdWxkIGFsc28gd29yayBmb3IgYW4gYXNzaWdubWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDMxMDgiPjMwMzEwODwvYT4KK1tpbXBvcnQgcmV3cml0ZV0gSW1wb3J0UmV3cml0ZSNyZW1vdmVJbXBvcnQoU3RyaW5nKSBkb2VzIG5vdCB3b3JrIHdpdGggc2V0VXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzKHRydWUpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTYxOSI+Mjk1NjE5PC9hPgorVGVzdCBmYWlsdXJlIGNhdXNlZCBieSBhIHRpbWluZyBpc3N1ZSBpbiBNMjAwOTExMTgtMDgwMAorCis8YSBuYW1lPSJ2X0EzNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTYgLSBGZWJydWFyeSAxNiwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzUKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTM1Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+SW4gb3JkZXIgdG8gZml4IGJ1Z3MgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTI1MyI+MjM1MjUzPC9hPiBhbmQKKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQzNTgiPjE5NDM1ODwvYT4sIGEgbmV3IEFQSSB3YXMgYWRkZWQgdG8gcHJlc2VydmUgdGhlIGV4aXN0aW5nIHByZS0zLjYgYmVoYXZpb3IgZm9yIGV4aXN0aW5nIGNsaWVudHM6PGJyPgorPHByZT4KKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgYSBjb250ZXh0IHNob3VsZCBiZSB1c2VkIHRvIHByb3Blcmx5IGZpbHRlciBpbXBsaWNpdCBpbXBvcnRzLgorCSAqCisJICogQnkgZGVmYXVsdCwgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZCB0byBwcmVzZXJ2ZSBwcmUtMy42IGJlaGF2aW9yLgorCSAqCisJICoKKwkgKiBXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIGNvbnRleHQgcGFzc2VkIHRvIHRoZSBhZGRJbXBvcnQqKC4uLikgbWV0aG9kcyBpcyB1c2VkIHRvIGRldGVybWluZQorCSAqIHdoZXRoZXIgYW4gaW1wb3J0IGNhbiBiZSBmaWx0ZXJlZCBiZWNhdXNlIHRoZSB0eXBlIGlzIGltcGxpY2l0bHkgdmlzaWJsZS4gTm90ZSB0aGF0IHRvbyBtYW55IGltcG9ydHMKKwkgKiBtYXkgYmUga2VwdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgYW5kIGFkZEltcG9ydCooLi4uKSBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aG91dCBhIGNvbnRleHQuCisJICoKKwkgKiAKKwkgKiBAcGFyYW0gdXNlQ29udGV4dFRvRmlsdGVySW1wbGljaXRJbXBvcnRzIHRoZSBnaXZlbiBzZXR0aW5nCisJICogCisJICogQHNlZSAjc2V0RmlsdGVySW1wbGljaXRJbXBvcnRzKGJvb2xlYW4pCisJICogQHNpbmNlIDMuNgorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZUNvbnRleHRUb0ZpbHRlckltcGxpY2l0SW1wb3J0cyhib29sZWFuIHVzZUNvbnRleHRUb0ZpbHRlckltcGxpY2l0SW1wb3J0cyk7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDI0NTUiPjMwMjQ1NTwvYT4KK2phdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24gaW4gc2Vjb25kYXJ5IHR5cGVzIHJlbW92YWwKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjc5Ij4xMDIyNzk8L2E+Citbc2VhcmNoXSBtZXRob2QgcmVmZXJlbmNlIHBlcmZvcm1hbmNlIGRlcGVuZHMgb24gbWV0aG9kIG5hbWUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2ODE0Ij4yMzY4MTQ8L2E+CitbanNyMTk5XSBFY2xpcHNlQ29tcGlsZXIjZ2V0VGFzayBkb2VzIG5vdCByZXNwZWN0IGl0cyBjb250cmFjdCB3aGVuIGl0cyBmaXJzdCBhcmd1bWVudCBpcyBudWxsCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjU1MiI+MzAyNTUyPC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGluZyBxdWFsaWZpZWQgaW52b2NhdGlvbnMgY2FuIGJlIGJyb2tlbiB3aGVuIHRoZSBMaW5lIFdyYXBwaW5nIHBvbGljeSBmb3JjZXMgZWxlbWVudCB0byBiZSBvbiBhIG5ldyBsaW5lCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjU4NyI+MzAyNTg3PC9hPgorRW5jb2RpbmcvZGVjb2Rpbmcgb2YgcHJvYmxlbSBhcmd1bWVudHMgaW4gTWFya2VyIGZhaWxzIGlmIGFyZ3VtZW50IGNvbnRhaW5zICMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxNDM4Ij4zMDE0Mzg8L2E+CitFY2xpcHNlIGhhbmdzIHdoZW4gYXR0ZW1wdGluZyB0byByZWZhY3RvciB1c2luZyB0aGUgJnF1b3Q7Y2hhbmdlIG1ldGhvZCBzaWduYXR1cmUmcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwMzgxIj4yNjAzODE8L2E+CitbZm9ybWF0dGVyXSBKYXZhZG9jIGZvcm1hdHRlciBicmVha3Mge0Bjb2RlIC4uLn0gdGFncy4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyNDQ2Ij4zMDI0NDY8L2E+CitbY29tcGlsZXJdIFJlZ3Jlc3Npb24gaW4gaWYgc3RhdGVtZW50IGZsb3cgYW5hbHlzaXMgcmVsYXRlZCB0byBudWxsIGNoZWNrcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQzNTgiPjE5NDM1ODwvYT4KK1tpbXBvcnQgcmV3cml0ZV0gT3JnYW5pemUgSW1wb3J0cyBwcm9kdWNlcyB3cm9uZyBvcmRlciBvZiBpbXBvcnRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTI1MyI+MjM1MjUzPC9hPgorW29yZ2FuaXplIGltcG9ydHNdIE9yZ2FuaXplIGltcG9ydHMgcmVtb3ZlcyBuZWVkZWQgaW1wb3J0IHN0YXRlbWVudC4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMzc5Ij4zMDIzNzk8L2E+Citbc2VhcmNoXSBKYXZhU2VhcmNoVGVzdHMudGVzdFpJUEFyY2hpdmUyKCkgdGVzdCBmYWlsZWQgaW4gSTIwMTAwMjA5LTA4MDAKKworPGEgbmFtZT0idl9BMzQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk02IC0gRmVicnVhcnkgOSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTM0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjEyMyI+MzAyMTIzPC9hPgorW2Zvcm1hdHRlcl0gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIG9jY3VycyB3aGlsZSBmb3JtYXR0aW5nIGEgc291cmNlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmljIGphdmFkb2MgY29tbWVudCAvKiogKioqLworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDAzNzkiPjMwMDM3OTwvYT4KK1tmb3JtYXR0ZXJdIEZ1cCBvZiBidWcgMjg3ODMzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDA1NiI+MjUwMDU2PC9hPgorW2NvbXBpbGVyXVtudWxsXSBBbm90aGVyIGFzc2VydCBhbmQgJnF1b3Q7UmVkdW5kYW50IG51bGwgY2hlY2smcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxNjgzIj4zMDE2ODM8L2E+CitBbm5vdGF0aW9ucyBhcmUgYnJva2VuIHdoZW4gbmF0aXZlIG1ldGhvZHMgYXJlIHByZXNlbnQgaW4gYSBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDA3MzQiPjMwMDczNDwvYT4KK0V4dHJhY3QgdGVtcCBtaXNzZXMgZHVwbGljYXRlIG9jY3VycmVuY2UuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTU2MCI+Mjg5NTYwPC9hPgorRWNsaXBzZSBoYW5ncyBhZnRlciBtb2RpZnlpbmcgdXNlciBsaWJyYXJpZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxNTYyIj4zMDE1NjI8L2E+CitbSlNSMjY5XSBFcnJvciBpbiBFY2xpcHNlRmlsZU1hbmFnZXIuY29sbGVjdEFsbE1hdGNoaW5nRmlsZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4NjM3Ij4yOTg2Mzc8L2E+CitDb3VsZCBub3QgcmV0cmlldmUgZGVjbGFyZWQgbWV0aG9kcyAoTlBFIGluIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZy5yZXNvbHZlKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQwNTciPjI5NDA1NzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBJbXBvcnRzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHkgd2l0aCBnZW5lcmljcyBhbmQgaW5uZXIgaW50ZXJmYWNlcworCis8YSBuYW1lPSJ2X0EzMyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTYgLSBGZWJydWFyeSAyLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EzMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMzMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwMTM2Ij4zMDAxMzY8L2E+CitjbGFzc3BhdGhlbnRyeSBPUFRJT05BTCBhdHRyaWJ1dGUgbm90IGhvbm9yZWQgZm9yIHZhciBlbnRyaWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDcyMyI+MzAwNzIzPC9hPgorRnVwIG9mIGJ1ZyAyMzU3ODMKKworPGEgbmFtZT0idl9BMzJhIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNNSAtIEphbnVhcnkgMjEsIDIwMTAgLSAzLjYuMCBNNQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzJhCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EzMmEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwMTMzIj4zMDAxMzM8L2E+CitbMS41XVtjb21waWxlcl0gTG9jYWwgY2xhc3NlcyBpbnNpZGUgZW51bSBjb25zdGFudHMgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRob3V0IGltcGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwNDQwIj4zMDA0NDA8L2E+CitpY3UgZGVwZW5kZW5jeSBuZWVkcyB0byBiZSB1ZHBhdGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5OTkwMCI+Mjk5OTAwPC9hPgorW251bGxdTWlzc2luZyBwb3RlbnRpYWwgbnVsbCB3YXJuaW5ncyBmb3IgdmFyaWFibGUgb24gdGhlIHJpZ2h0IG9mIGFuIE9SIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzOTE3Ij4yOTM5MTc8L2E+CitJbnZhbGlkICdwb3RlbnRpYWwgbnVsbCBhY2Nlc3MnIHdhcm5pbmcgcmVwb3J0cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIzNzkiPjI1MjM3OTwvYT4KK09yZ2FuaXplIGltcG9ydHMgZGVsZXRlcyBuZWVkZWQgc3RhdGljIGltcG9ydC4KKworPGEgbmFtZT0idl9BMzEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk01IC0gSmFudWFyeSAxOCwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMzEKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTMxIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+TmV3IEFQSSB0byBmaXggYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTU4OTQiPjI5NTg5NDwvYT4uIFNlZSB0aGUgYnVnIGZvciBkZXRhaWxzLgorPHByZT4KKy8qKgorICogUmV0dXJucyBhIEphdmEgc2VhcmNoIHNjb3BlIGxpbWl0ZWQgdG8gdGhlIGhpZXJhcmNoeSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdG8gYSBnaXZlbiBwcm9qZWN0LgorICogVGhlIEphdmEgZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gYSBzZWFyY2ggd2l0aCB0aGlzIHNjb3BlIHdpbGwgYmUgdHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkuCisgKgorICogVW5saWtlIHRoZSBjcmVhdGVIaWVyYXJjaHlTY29wZSBtZXRob2RzLCB0aGlzIG1ldGhvZCBjcmVhdGVzIHN0cmljdAorICogc2NvcGVzIHRoYXQgb25seSBjb250YWluIHR5cGVzIHRoYXQgYWN0dWFsbHkgc3BhbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBmb2N1cworICogdHlwZSwgYnV0IGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9uYWwgZW5jbG9zaW5nIG9yIG1lbWJlciB0eXBlcy4KKyAqCisgKgorICogQnkgZGVmYXVsdCwgaGllcmFyY2h5IHNjb3BlcyBpbmNsdWRlIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IHN1cGVydHlwZXMgYW5kIHN1YnR5cGVzIG9mIHRoZQorICogZm9jdXMgdHlwZS4gVGhpcyBtZXRob2QsIGhvd2V2ZXIsIGFsbG93cyB0byByZXN0cmljdCB0aGUgaGllcmFyY2h5IHRvIHRydWUgc3VidHlwZXMsCisgKiBub3QgaW5jbHVkaW5nIHN1cGVydHlwZXMuIEFsc28gaW5jbHVzaW9uIG9mIHRoZSBmb2N1cyB0eXBlIGl0c2VsZiBpcyBjb250cm9sZWQgYnkgYSBwYXJhbWV0ZXIuIAorICoKKyAqIAorICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdG8gY29uc3RyYWluIHRoZSBzZWFyY2gsIG9yIG51bGwgaWYKKyAqICAgICAgICBzZWFyY2ggc2hvdWxkIGNvbnNpZGVyIGFsbCB0eXBlcyBpbiB0aGUgd29ya3NwYWNlIAorICogQHBhcmFtIHR5cGUgdGhlIGZvY3VzIG9mIHRoZSBoaWVyYXJjaHkgc2NvcGUKKyAqIEBwYXJhbSBvbmx5U3VidHlwZXMgaWYgdHJ1ZSBvbmx5IHN1YnR5cGVzIG9mIHR5cGUgYXJlIGNvbnNpZGVyZWQKKyAqIEBwYXJhbSBpbmNsdWRlRm9jdXNUeXBlIGlmIHRydWUgdGhlIGZvY3VzIHR5cGUgdHlwZSBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNjb3BlLCAKKyAqIAkJICBvdGhlcndpc2UgaXQgaXMgZXhjbHVkZWQKKyAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cywgCisgKiAgICAgICAgb3IgbnVsbCBpZiB0aGUgcHJpbWFyeSB3b3JraW5nIGNvcHkgb3duZXIgc2hvdWxkIGJlIHVzZWQKKyAqIEByZXR1cm4gYSBuZXcgaGllcmFyY2h5IHNjb3BlCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgaGllcmFyY2h5IGNvdWxkIG5vdCBiZSBjb21wdXRlZCBvbiB0aGUgZ2l2ZW4gdHlwZQorICogQHNpbmNlIDMuNgorICovCitwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlU3RyaWN0SGllcmFyY2h5U2NvcGUoSUphdmFQcm9qZWN0IHByb2plY3QsIElUeXBlIHR5cGUsIGJvb2xlYW4gb25seVN1YnR5cGVzLCBib29sZWFuIGluY2x1ZGVGb2N1c1R5cGUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Cis8L3ByZT4KKzwvbGk+Cis8bGk+TmV3IEFQSSBhZGRlZCB0byByZXBvcnQgYSBjb21waWxlciB3YXJuaW5nIHdoZW4gb2JqZWN0IGFsbG9jYXRpb25zIGFyZSB1bnVzZWQ6Cis8cHJlPgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW0uVW51c2VkT2JqZWN0QWxsb2NhdGlvbgorCisvKioKKyAqIENvbXBpbGVyIG9wdGlvbiBJRDogUmVwb3J0aW5nIEFsbG9jYXRpb24gb2YgYW4gVW51c2VkIE9iamVjdC4KKyAqIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGlmIGFuIG9iamVjdCBpcyBhbGxvY2F0ZWQgYnV0IG5ldmVyIHVzZWQsCisgKiBuZWl0aGVyIGJ5IGhvbGRpbmcgYSByZWZlcmVuY2Ugbm9yIGJ5IGludm9raW5nIG9uZSBvZiB0aGUgb2JqZWN0J3MgbWV0aG9kcy4KKyAqCisgKiBPcHRpb24gaWQ6Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkT2JqZWN0QWxsb2NhdGlvbiIKKyAqIFBvc3NpYmxlIHZhbHVlczp7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorICogRGVmYXVsdDoiaWdub3JlIgorICoKKyAqIEBzaW5jZSAzLjYKKyAqIEBjYXRlZ29yeSBDb21waWxlck9wdGlvbklECisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9PQkpFQ1RfQUxMT0NBVElPTiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRPYmplY3RBbGxvY2F0aW9uIjsKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTAwNyI+MjQ1MDA3PC9hPgorW2NvbXBpbGVyXSBTaG91bGQgbm90IGNvbXBsZXRlbHkgaWdub3JlIGFub255bW91cyB0eXBlIHdpdGggbWlzc2luZyBzdXBlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTg5NCI+Mjk1ODk0PC9hPgorW3NlYXJjaF0gU2VhcmNoIHNob3dzIGZvY3VzIHR5cGUgaW1wbGVtZW50YXRpb24gZm9yIG5lc3RlZCB0eXBlcyBldmVuIHRob3VnaCB0aGUgc2NvcGUgaXMgcmVzdHJpY3RlZCB0byBzdWJ0eXBlcy4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2Mzg1Ij4yMzYzODU8L2E+CitbY29tcGlsZXJdIFdhcm4gZm9yIHBvdGVudGlhbCBwcm9ncmFtbWluZyBwcm9ibGVtIGlmIGFuIG9iamVjdCBpcyBjcmVhdGVkIGJ1dCBub3QgdXNlZAorCis8YSBuYW1lPSJ2X0EzMCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTUgLSBKYW51YXJ5IDEyLCAyMDEwCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EzMAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMzAiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5OZXcgQVBJIGFkZGVkIHRvIGV4cG9zZSB0aGUgcmVjb25jaWxlIGZsYWdzIHVzZWQgaW4gdGhlIHJlY29uY2lsZSBjb250ZXh0OgorPHByZT4KKy8qKgorICogUmV0dXJucyB0aGUgcmVjb25jaWxlIGZsYWcgb2YgdGhpcyBjb250ZXh0LiBUaGlzIGZsYWcgaXMgYSBiaXR3aXNlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBkZWZpbmVkCisgKiBpbiBJQ29tcGlsYXRpb25Vbml0LgorICoKKyAqIEByZXR1cm4gdGhlIHJlY29uY2lsZSBmbGFnIG9mIHRoaXMgY29udGV4dAorICogQHNpbmNlIDMuNgorICoKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNFTkFCTEVfQklORElOR1NfUkVDT1ZFUlkKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNFTkFCTEVfU1RBVEVNRU5UU19SRUNPVkVSWQorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I0lHTk9SRV9NRVRIT0RfQk9ESUVTCisgKi8KK3B1YmxpYyBpbnQgZ2V0UmVjb25jaWxlRmxhZ3MoKTsKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzkxNyI+MjQzOTE3PC9hPgorW2NvbXBpbGVyXSBzaG91bGQgbm90IHdhcm4gYWJvdXQgdW51c2VkIGZpZWxkIHdoZW4gbmF0aXZlIG1ldGhvZCBwcmVzZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjM0MyI+Mjk2MzQzPC9hPgorT09NIGVycm9yIGNhdXNlZCBieSBqYXZhIGluZGV4aW5nIHJlZmVyZW5jaW5nIGNsYXNzbG9hZGVyIGZyb20gdGhyZWFkTG9jYWwKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMDAwIj4xMzAwMDA8L2E+CitbQVBJXSBSZWNvbmNpbGVDb250ZXh0IEFQSTogRG9lcyBnZXRBU1QzIHJldHVybiBBU1Qgd2l0aCBiaW5kaW5ncz8KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4MjM4Ij4yOTgyMzg8L2E+CitVbnJlc29sdmVkIGltcG9ydCBpbiBzdXBlcmNsYXNzIGNhdXNlcyAnQ2Fubm90IHJlZHVjZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW5oZXJpdGVkIG1ldGhvZCcgaW4gc3ViY2xhc3MKKworPGEgbmFtZT0idl9BMjlhIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNNSAtIEphbnVhcnkgNSwgMjAxMAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMjlhCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EyOWEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzODYxIj4yOTM4NjE8L2E+CitQcm9ibGVtIHdpdGggcmVmYWN0b3Jpbmcgd2hlbiBleGlzdGluZyBqYXIgd2l0aCBpbnZhbGlkIHBhY2thZ2UgbmFtZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0MTEyIj4yNjQxMTI8L2E+CitbRm9ybWF0dGVyXSBXcmFwIHdoZW4gbmVjZXNzYXJ5IHRvbyBhZ2dyZXNzaXZlIG9uIHNob3J0IHF1YWxpZmllcnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4MjUwIj4yOTgyNTA8L2E+CitbMS42XVtjb21waWxlcl0gTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gaW4gU3RhY2tNYXBGcmFtZS5kdXBsaWNhdGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2OTk4Ij4yOTY5OTg8L2E+CitVbnVzZWQgaW1wb3J0cyBzaG91bGQgbm90IHByZXZlbnQgZXhlY3V0aW9uCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODI0MyI+Mjk4MjQzPC9hPgorW2Zvcm1hdHRlcl0gUmVtb3ZpbmcgZW1wdHkgbGluZXMgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NzU0NiI+Mjk3NTQ2PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGVyIHJlbW92ZXMgYmxhbmsgYWZ0ZXIgQHNlZSBpZiByZWZlcmVuY2UgaXMgd3JhcHBlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU3ODEiPjIzNTc4MTwvYT4KK1tjb21waWxlcl0gZGlmZmVyZW5jZSB0byBqYXZhYyBpbiBkZWZpbml0ZSB1bmFzc2lnbm1lbnQgYW5hbHlzaXMgaW52b2x2aW5nIGFuIGV4Y2VwdGlvbiB3aXRoaW4gYSBjb25zdHJ1Y3RvcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU3ODMiPjIzNTc4MzwvYT4KK1tldmFsXSBDb2RlU25pcHBldFBhcnNlciBhbmQgc29tZSAnQ29kZVNuaXBwZXQqJyBhc3Qgbm9kZSBkb2VzIG5vdCBzZWVtIHVwIHRvIGRhdGUKKworPGEgbmFtZT0idl9BMjgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk01IC0gRGVjZW1iZXIgMTQsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTI4CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EyOCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTY3MTQiPjE5NjcxNDwvYT4KK1tjb21tZW50XSBJbnZhbGlkSW5wdXRFeGNlcHRpb24gcHJldmVudHMgdGhlIEFic3RyYWN0Q29tbWVudE1hcHBlciB0byByZXRyaWV2ZSB0YWcgZWxlbWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc3NTciPjI5Nzc1NzwvYT4KK0Nhbm5vdCBnZXQgYmluZGluZ3MgZm9yIElUeXBlIGNvcnJlc3BvbmRpbmcgdG8gcGFyYW1ldGVyaXplZCBhbm9ueW1vdXMgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU2NDAiPjI1NTY0MDwvYT4KK1tzcGVjXSBNZXRob2RzIFNpZ25hdHVyZS50b0NoYXJBcnJheSguLikgaGF2ZSB1bmNsZWFyIHByZWNvbmRpdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjI4OTgiPjI2Mjg5ODwvYT4KK0J1ZmZlckNoYW5nZWRFdmVudCBtdXN0IG5vdCBoYXZlIEBub2luc3RhbnRpYXRlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTY4MiI+MTgxNjgyPC9hPgorSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lIHNob3VsZCBsaXN0IHZhbGlkIGNvbnN0YW50cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg3ODQiPjEwODc4NDwvYT4KK1NvdXJjZU1hcHBlciBkb2Vzbid0IGZpbmQgbmFtZSByYW5nZSBvZiBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvcnMKKworPGEgbmFtZT0idl9BMjciPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk00IC0gRGVjZW1iZXIgOCwgMjAwOSAtIDMuNi4wIE00Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EyNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMjciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk3MjI1Ij4yOTcyMjU8L2E+CitbZm9ybWF0dGVyXSBJbmRlbnRhdGlvbiBtYXkgYmUgc3RpbGwgd3JvbmcgaW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzIGFmdGVyIGZvcm1hdHRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM2OTciPjI5MzY5NzwvYT4KK0phdmFTZWFyY2hCdWdUZXN0cy50ZXN0QnVnMjg2Mzc5YyBpcyBmYWlsaW5nIHJhbmRvbWx5CisKKzxhIG5hbWU9InZfQTI2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNNCAtIERlY2VtYmVyIDcsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTI2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EyNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTcwNDUiPjI5NzA0NTwvYT4KK1dlaXJkIHRlc3RzIGZhaWx1cmVzIGluIE4yMDA5MTIwNC0yMDAwIGFuZCBOMjAwOTEyMDUtMjAwMCBidWlsZHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzMzAwIj4yOTMzMDA8L2E+CitbZm9ybWF0dGVyXSBUaGUgZm9ybWF0dGVyIGlzIHN0aWxsIHVuc3RhYmxlIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcworCis8YSBuYW1lPSJ2X0EyNSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTQgLSBEZWNlbWJlciA0LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EyNQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMjUiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5NYXRjaCByZXN1bHQgY2FuIG5vdyByZXBvcnQgdGhlIGFjY2VzcyBydWxlcyB0aHJvdWdoIGEgbmV3IEFQSSBhZGRlZCBvbiA8Y29kZT5UeXBlTmFtZU1hdGNoPC9jb2RlPjoKKzxwcmU+CisvKioKKyAqIFJldHVybnMgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIHR5cGUgbmFtZSBtYXRjaAorICoKKyAqIEBzZWUgSUFjY2Vzc1J1bGUKKyAqCisgKiBAcmV0dXJuIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSB0eXBlIG5hbWUgd2hpY2ggbWF5IGJlCisgKiAJCXtAbGluayBJQWNjZXNzUnVsZSNLX0FDQ0VTU0lCTEV9LCB7QGxpbmsgSUFjY2Vzc1J1bGUjS19ESVNDT1VSQUdFRH0KKyAqIAkJb3Ige0BsaW5rIElBY2Nlc3NSdWxlI0tfTk9OX0FDQ0VTU0lCTEV9LgorICogCQlUaGUgZGVmYXVsdCByZXR1cm5lZCB2YWx1ZSBpcyB7QGxpbmsgSUFjY2Vzc1J1bGUjS19BQ0NFU1NJQkxFfS4KKyAqCisgKiBAc2luY2UgMy42CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWNjZXNzaWJpbGl0eSgpOworPC9wcmU+CitTZWUgYnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTYyNzciPjI5NjI3NzwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTYyNzciPjI5NjI3NzwvYT4KK1tzZWFyY2hdIFNlYXJjaEVuZ2luZSNzZWFyY2hBbGxUeXBlTmFtZXMoLi4sIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IsLi4pIHNob3VsZCByZXBvcnQgYWNjZXNzIHJ1bGVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjcwOCI+Mjk2NzA4PC9hPgorW0RPTS9BU1RdIGNsYXJpZnkgc2V0dGVycyB3aGVuIGNyZWF0ZUFTVHMoLi4pIGlzIHVzZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2NjI5Ij4yOTY2Mjk8L2E+CitbcXVpY2sgZml4XSBDYXN0IHF1aWNrIGZpeCBub3Qgb2ZmZXJlZCBmb3IgbWV0aG9kLWxvY2FsIGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1OTQ4Ij4yOTU5NDg8L2E+CitFbGVtZW50SW1wbC5oYXNoQ29kZSB0aHJvd3MgYW4gTlBFCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjY2MCI+Mjk2NjYwPC9hPgorW2NvbXBpbGVyXSBJbmNvcnJlY3QgdW51c2VkIG1ldGhvZCB3YXJuaW5nIGZyb20gY29tcGlsZXIKKworPGEgbmFtZT0idl9BMjQiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk00IC0gRGVjZW1iZXIgMSwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMjQKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTI0Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+TmV3IEFQSSBhZGRlZCB0byBpZ25vcmUgbWV0aG9kIGJvZGllcyBpbnNpZGUgQVNUIHRyZWUuIFRoZSBuZXcgQVBJcyBhcmUgdGFnZ2VkIGFzIDMuNS4yIGFzIHRoaXMgY29kZQord2lsbCBiZSBiYWNrcG9ydGVkIHRvIDMuNS4yOgorPHByZT4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI6CisJLyoqCisJICogUmVxdWVzdHMgYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgd2l0aG91dCBtZXRob2QgYm9kaWVzLiAKKwkgKiAKKwkgKiBXaGVuIGlnbm9yZSBtZXRob2QgYm9kaWVzIGlzIGVuYWJsZWQsIGFsbCBtZXRob2QgYm9kaWVzIGFyZSBkaXNjYXJkZWQuCisJICogVGhpcyBoYXMgbm8gaW1wYWN0IG9uIHRoZSBiaW5kaW5nIHJlc29sdXRpb24uCisJICoKKwkgKiBJZiBhIG1ldGhvZCBjb250YWlucyBsb2NhbCB0eXBlcywgaXRzIG1ldGhvZCBib2R5IHdpbGwgYmUgcmV0YWluZWQuCisJICogVGhpcyBzZXR0aW5ncyBpcyBub3QgdXNlZCBpZiB0aGUga2luZCB1c2VkIGluIHNldEtpbmQoaW50KSBpcyBlaXRoZXIgCisJICogS19FWFBSRVNTSU9OIG9yIEtfU1RBVEVNRU5UUy4KKwkgKiBAc2luY2UgMy41LjIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVNZXRob2RCb2RpZXMoYm9vbGVhbiBlbmFibGVkKTsKKworb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDoKKwkvKioKKwkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSByZWNvbmNpbGUgb3BlcmF0aW9uIGNvdWxkIGlnbm9yZSB0byBwYXJzZSB0aGUgbWV0aG9kIGJvZGllcy4KKwkgKiBAc2VlIEFTVFBhcnNlciNzZXRJZ25vcmVNZXRob2RCb2RpZXMoYm9vbGVhbikKKwkgKiBAc2luY2UgMy41LjIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkVfTUVUSE9EX0JPRElFUyA9IDB4MDg7CisKKzwvcHJlPgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODE3NCI+Mjg4MTc0PC9hPgorW3NlYXJjaF0gTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBzZWFyY2hpbmcgZm9yIHR5cGUgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc2NDMiPjI3NzY0MzwvYT4KK0dlbmVyaWNzIGNvbXBpbGUgZXJyb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4MjExIj4yODgyMTE8L2E+CitBUFQgdXNlcyBhIGxvdCBvZiBtZW1vcnkKKworPGEgbmFtZT0idl9BMjMiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk00IC0gTm92ZW1iZXIgMjQsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTIzCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EyMyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTU2OTgiPjI5NTY5ODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBDbGFzc0Nhc3RFeGNlcHRpb24gaW4gdW5jaGVja2VkIHdhcm5pbmcgcmVwb3J0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTI2MCI+Mjk1MjYwPC9hPgorV3Jvbmcgd2FybmluZ3Mgb24gSmF2YS5Db21waWxlci5FcnJvcnMvV2FybmluZ3MgJnF1b3Q7UmVkdW5kYW50IG51bGwgY2hlY2smcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNzM3Ij4xOTA3Mzc8L2E+CitbY29tcGlsZXJdW251bGxdIG1pc3NpbmcgJ2Nhbm5vdCBiZSBudWxsJyB3YXJuaW5nIHdpdGhpbiBmb3IgbG9vcAorCis8YSBuYW1lPSJ2X0EyMiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTQgLSBOb3ZlbWJlciAxNiwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMjIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTIyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzQyOSI+MTUzNDI5PC9hPgorSlVuaXQ0IGluIEVjbGlwc2UgVGVzdGluZyBGcmFtZXdvcmsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1MjM4Ij4yOTUyMzg8L2E+CitbZm9ybWF0dGVyXSBUaGUgY29tbWVudCBmb3JtYXR0ZXIgYWRkIGFuIHVuZXhwZWN0ZWQgbmV3IGxpbmUgaW4gYmxvY2sgY29tbWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTUxNzUiPjI5NTE3NTwvYT4KK1tmb3JtYXR0ZXJdIE1pc3Npbmcgc3BhY2UgYmVmb3JlIGEgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGluIGEgamF2YWRvYyBjb21tZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NDUyOSI+Mjk0NTI5PC9hPgorVGhlIFNjYW5uZXIgc29tZXRpbWVzIGlnbm9yZXMgdGhlIGdpdmVuIG9mZnNldCBpZiBsYXJnZXIgdGhhbiB0aGUgRU9GLgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQ2NjIiPjI5NDY2MjwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiB3aGlsZSBpbnZva2luZyBxdWljayBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0NDA0Ij4yOTQ0MDQ8L2E+CistdGFyZ2V0IGpzcjE0IGZsYWdzIGVycm9yIG9uIGZvcmVhY2ggb3ZlciBDb2xsZWN0aW9uIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IEl0ZXJhYmxlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5Mzk1NSI+MjkzOTU1PC9hPgordmFsaWQgamF2YWRvYyB1cmwgc2V0IG9uIHVzZXIgbGlicmFyeSwgYnV0IHN0aWxsIHNheXMgbm8gamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM0NDMiPjI5MzQ0MzwvYT4KK0Fib3J0Q29tcGlsYXRpb24gd2hlbiBpbnZva2luZyBjb250ZW50IGFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM3MTEiPjI5MzcxMTwvYT4KK0NsYXJpZnkgSUNvbXBpbGF0aW9uVW5pdCNnZXRPd25lcigpIGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNjE1Ij4yOTM2MTU8L2E+CitlcnJvciBtZXNzYWdlIHNpbmNlIHYzLjYuME0yOiBuYW1lIGNsYXNoIGJ5IG92ZXJyaWRpbmcgZ2VuZXJpYyBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NDYxOCI+Mjk0NjE4PC9hPgorW2Zvcm1hdHRlcl0gVGhlIGZvcm1hdHRlciBmYWlscyB0byBmb3JtYXQgYSBjb21waWxhdGlvbiB1bml0IHdpdGggZGVlcCBuZXN0aW5nIG9mIGh0bWwgdGFncworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMTIiPjI0ODMxMjwvYT4KK1ttb2RlbF0gSU1lbWJlclZhbHVlUGFpciNnZXRWYWx1ZSgpIHNob3VsZCBhbHNvIHdvcmsgZm9yIG5lZ2F0aXZlIG51bWVyYWxzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NDczMSI+Mjk0NzMxPC9hPgorU3BlY2lmeSB2YWx1ZSB0eXBlIG9mIEpBVkFET0NfTE9DQVRJT05fQVRUUklCVVRFX05BTUUKKworPGEgbmFtZT0idl9BMjEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk00IC0gTm92ZW1iZXIgMTAsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTIxCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EyMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQ2MzEiPjI5NDYzMTwvYT4KK1tmb3JtYXR0ZXJdIFRoZSBmb3JtYXR0ZXIgdGFrZXMgdHdvIHBhc3NlcyB0byBmb3JtYXQgYSBjb21tb24gc2VxdWVuY2Ugb2YgaHRtbCB0YWdzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NDUwMCI+Mjk0NTAwPC9hPgorW2Zvcm1hdHRlcl0gTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiB3aGVuIGZvcm1hdHRpbmcgYW4gaW52YWxpZCBzZXF1ZW5jZSBvZiAmbHQ7Y29kZSZndDsgdGFncyBpbiBhIGphdmFkb2MgY29tbWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQ0ODgiPjI5NDQ4ODwvYT4KK0phdmFkb2Mgb2YgSVNvdXJjZVJlZmVyZW5jZSNnZXRTb3VyY2VSYW5nZSgpIHNob3VsZCBsaW5rIHRvIFNvdXJjZVJhbmdlI2lzQXZhaWxhYmxlKC4uKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTkyNjUiPjE5OTI2NTwvYT4KK1tmb3JtYXR0ZXJdIDMuMyBDb2RlIEZvcm1hdHRlciBtaXMtcGxhY2VzIGNvbW1lbnRlZC1vdXQgaW1wb3J0IHN0YXRlbWVudHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxNTQ5Ij4yNDE1NDk8L2E+Citbc3BlY10gSVR5cGUjZ2V0RmllbGRzL0luaXRpYWxpemVycy9NZXRob2RzKCkgc2hvdWxkIGRlZmluZSBvcmRlciBmcm9tIGNsYXNzIGZpbGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1ODA1Ij4yNzU4MDU8L2E+CitjcmVhdGluZyBhIG5vbi1wcmltYXJ5IHdvcmtpbmcgY29weSBjYXVzZXMgdHlwZUhpZXJhcmNoeUNoYW5nZWQgZXZlbnQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyNTEwIj4yOTI1MTA8L2E+CitGVVAgb2YgMjkyMzY0OiBFcnJvciBtZXNzYWdlcyBkb24ndCBpZGVudGlmeSBwYXJ0aWFsIHR5cGVzIHByZWNpc2VseS4KKworPGEgbmFtZT0idl9BMjAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk00IC0gTm92ZW1iZXIgMywgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMjAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTIwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzM4NCI+MjkzMzg0PC9hPgorRWNsaXBzZSBlcnJvbmVvdXNseSByZXBvcnRzIG1ldGhvZCAmcXVvdDtpcyBhbWJpZ3VvdXMgZm9yIHR5cGUmcXVvdDsKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1MDAyIj4yODUwMDI8L2E+CitbY29tcGlsZXJdIHZpc2liaWxpdHkgZXJyb3IgZm9yIHBhY2thZ2UgcHJpdmF0ZSBtZXRob2QKKworPGEgbmFtZT0idl9BMTkiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0zIC0gT2N0b2JlciAyOSwgMjAwOSAtIDMuNk0zCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0ExOQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMTkiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KK1RoaXMgdmVyc2lvbiB3YXMgY3JlYXRlZCB0byB0ZW50YXRpdmVseSBmaXggYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzY5NyI+MjkzNjk3PC9hPgorYnV0IGl0IG9jY3VycyBhZ2FpbiBpbiBzdWJzZXF1ZW50IGJ1aWxkLiBTbywgaXQgaGFzIGJlZW4gcmVvcGVuZWQgYW5kIG1vdmVkIHRvIG5leHQgdmVyc2lvbi4uLgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGEgbmFtZT0idl9BMTgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0zIC0gT2N0b2JlciAyOCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMTgKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTE4Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNDk2Ij4yOTM0OTY8L2E+CitBZGRpbmcgdGhlIHNlcmlhbFZlcnNpb25VSUQgZmllbGQgZG9lc24ndCB3b3JrIHdoZW4gdGFiIHNpemUgaXMgMAorCis8YSBuYW1lPSJ2X0ExNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTMgLSBPY3RvYmVyIDI2LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0ExNworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMTciPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5SZXZlcnRlZCBjaGFuZ2UgZm9yIGJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYzNTY0Ij4yNjM1NjQ8L2E+LjwvbGk+Cis8L3VsPgorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIG5hbWU9InZfQTE2Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMyAtIE9jdG9iZXIgMjUsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTE2CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0ExNiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzI0MCI+MjkzMjQwPC9hPgorW2Zvcm1hdHRlcl0gJ2luc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcicgcHJlZmVyZW5jZSBtYXkgYmUgcmVzZXQgaW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MzU2NCI+MjYzNTY0PC9hPgorQVBJIHRvIGtub3cgd2hlbiBkZWZhdWx0IGNvbXBpbGVyIHByZWZlcmVuY2Ugc2V0dGluZ3MgaGF2ZSBiZWVuIGFsdGVyZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODkzODUiPjI4OTM4NTwvYT4KK0ludmVzdGlnYXRlIGNvbW1lbnQgaW4gcGVyZm9ybWFuY2UgdGVzdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODYzNzkiPjI4NjM3OTwvYT4KK1tzZWFyY2hdIFByb2JsZW0gd2hpbGUgc2VhcmNoaW5nIGNsYXNzCisKKzxhIG5hbWU9InZfQTE1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMyAtIE9jdG9iZXIgMjAsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTE1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0ExNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjM1MCI+MjkyMzUwPC9hPgorWzEuNV1bY29tcGlsZXJdIENvbXBpbGVyIGVycm9yOiBhbWJpZ3VvdXMgbWV0aG9kIHNpbmNlIDMuNS4xIHVzaW5nIGdlbmVyaWNzIGFuZCBpbnRlcmZhY2UgaW5oZXJpdGFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTIzNjQiPjI5MjM2NDwvYT4KK1tpbnRlcm5hbF0gVHlwZSBuYW1lIGluIENhc3RFeHByZXNzaW9uIG5vdCB0cmVhdGVkIGFzIFR5cGUgbmFtZS4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyNDI4Ij4yOTI0Mjg8L2E+CitJbnRlcm5hbCBjb21waWxlciBlcnJvcjogTnVsbFBvaW50ZXJFeGNlcHRpb24gYXQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbi5jaGVja1Vuc2FmZUNhc3QoQ2FzdEV4cHJlc3Npb24uamF2YTozMzMpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTk4NSI+MjkxOTg1PC9hPgorW2NvbXBpbGVyXVtqc3IxNF0gVHJhbnNsYXRpbmcgRW51bSB3aXRoIGpzcjE0IHRhcmdldDogRUNKIGNhdXNlcyBhIHJ1bnRpbWUgZXJyb3Igd2hpbGUgU3VuIGNvbXBpbGVyIHdvcmtzIGZpbmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMjQwIj4yOTIyNDA8L2E+CitDb21waWxlciBlcnJvciBvbiBpbXBsZW1lbnRhdGlvbiBvZiByYXcgc3ViIGludGVyZmFjZQorCis8YSBuYW1lPSJ2X0ExNCI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTMgLSBPY3RvYmVyIDEzLCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0ExNAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMTQiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkxMzkxIj4yOTEzOTE8L2E+Cit1cGRhdGUgdGhlIEJ1bmRsZS1WZXJzaW9uIG9mIHRoZSBKRFQgQ29yZSBCYXRjaCBDb21waWxlciAoZWNqKSBmcm9tIDMuMy4wIHRvIDMuNi4qCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDI4MCI+Mjg0MjgwPC9hPgorWzEuNV1bY29tcGlsZXJdIEVycm9yIG9uIHVzZSBnZW5lcmljIGludGVyZmFjZSBpbiBhYnN0cmFjdCBzdXBlciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODYyMjgiPjI4NjIyODwvYT4KK1sxLjVdW2NvbXBpbGVyXSBHZW5lcmljcyBpbmNvbnNpc3RlbmNpZXMgcG9zc2libGUgcmVncmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY2MDEiPjI4NjYwMTwvYT4KK1tmb3JtYXR0ZXJdIENvZGUgZm9ybWF0dGVyIGZvcm1hdHMgYW5vbnltb3VzIGlubmVyIGNsYXNzZXMgd3JvbmdseSB3aGVuICdOZXZlciBqb2luIGxpbmVzJyBpcyBvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTUxMzkiPjIxNTEzOTwvYT4KK1tzZWFyY2hdIE1vcmUgb3B0aW9ucyBmb3IgSGllcmFyY2h5U2NvcGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkxNDcyIj4yOTE0NzI8L2E+CitbMS41XVtjb21waWxlcl0gQWNjZXNzIHRvIGEgZ2VuZXJpYyBtZXRob2QgaXMgY29tcGlsZWQgaW5jb3JyZWN0bHkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzNTM5Ij4yODM1Mzk8L2E+CitOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0VmFyaWFibGVOYW1lcyBkb2Vzbid0IHdvcmsgaWYgbmFtZSBjb250YWlucyAnXycKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNzg0Ij4yODA3ODQ8L2E+CitbYmF0Y2hdIEFsbG93IGFjY2VzcyByZXN0cmljdGlvbnMgdG8gYmUgcmVwb3J0ZWQgYXMgZXJyb3JzCisKKzxhIG5hbWU9InZfQTEzIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMyAtIE9jdG9iZXIgNiwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMTMKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTEzIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmV2ZXJ0ZWQgZml4IGZvciA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NDc4Ij4xMDY0Nzg8L2E+LjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTEzMjIiPjI5MTMyMjwvYT4KK1Rlc3QgZXJyb3JzIHdoZW4gcnVubmluZyBKRFQgQ29yZSB0ZXN0cyBvbiBXaW5kb3dzIDcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyNzcwIj4yODI3NzA8L2E+CitbY29tcGlsZXJdIERlYWQgY29kZSBkZXRlY3Rpb24gc2hvdWxkIGhhdmUgc3BlY2lmaWMgQFN1cHByZXNzV2FybmluZ3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMDI4Ij4yOTAwMjg8L2E+CitVc2UgSVJlc291cmNlI3NldERlcml2ZWQoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikgaW5zdGVhZCBvZiBJUmVzb3VyY2Ujc2V0RGVyaXZlZChib29sZWFuKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODc2MDciPjI4NzYwNzwvYT4KK1sxLjVdW2NvbXBpbGVyXSBjYXN0IG9mIGlubmVyIG9mIGdlbmVyaWMgZW5jbG9zaW5nIHR5cGUgYXJlIG5vdCByZXBvcnRlZCBhcyB1bnNhZmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4NzQ5Ij4yODg3NDk8L2E+CitSZWR1bmRhbnQgc3VwZXJpbnRlcmZhY2Ugbm90IGZsYWdnZWQgaW5zaWRlIG9uZSBkZWNsYXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTA5MDUiPjI5MDkwNTwvYT4KK1tmb3JtYXR0ZXJdIENlcnRhaW4gZm9ybWF0dGVyIHByZWYgY29uc3RlbGxhdGlvbiBjYXVzZSBlbmRsZXNzIGxvb3AgPT0mZ3Q7IE9PTUUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1MTI0Ij4yODUxMjQ8L2E+CitzZXJpYWxWZXJzaW9uVUlEIHN0aWxsIGNhdXNlcyBlcnJvci93YXJuaW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MDg3NyI+MjkwODc3PC9hPgorW0RPTV0gSWYgdXNpbmcgYSB0YWcgbmFtZWQgJ0BlbnVtJyB0aGUgQVNUUGFyc2VyIGlnbm9yZXMgdGhpcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODE1NzUiPjI4MTU3NTwvYT4KK0VjbGlwc2UgaGFuZ3MgaW4gU291cmNlTWFwcGVyIHdoaWxlIGRvaW5nIGphdmEgcHJvcG9zYWxzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MDQ3MCI+MjkwNDcwPC9hPgorW0pTUjE5OV1bY29tcGlsZXJdIEpEVCBjb21waWxlciBub3QganNyMTk5IGNvbXBhdGlibGUuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MDczMCI+MjkwNzMwPC9hPgorUmV3cml0aW5nIFN3aXRjaFN0YXRlbWVudCB0aHJvd3MgTlBFCisKKzxhIG5hbWU9InZfQTEyIj48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMyAtIFNlcHRlbWJlciAyOSwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMTIKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTEyIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NzY3NiI+Mjg3Njc2PC9hPgorWzEuNV1bY29tcGlsZXJdIFVzZWxlc3MgY2FzdCB3YXJuaW5nIG5vdCBlbWl0ZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwNTYzIj4yOTA1NjM8L2E+CithZGQgc3BlY2lmaWNhdGlvbiBmb3IgZmluZSBncmFpbiBzZWFyY2ggZmxhZ3MKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMzc2Ij4yOTAzNzY8L2E+CitFcnJhbnQgJnF1b3Q7Q29tcGFyaW5nIGlkZW50aWNhbCBleHByZXNzaW9ucyZxdW90OyB3YXJuaW5nIHdpdGggYXNzaWdubWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODc1OTIiPjI4NzU5MjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBXcm9uZyBhbWJpZ3VvdXMgY29tcGlsYXRpb24gZXJyb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMDQ5Ij4yOTAwNDk8L2E+CitSZWNvbmNpbGluZyBhIGNvbXBpbGF0aW9uIHVuaXQgZG9lcyBub3QgcmV0dXJuIGFuIEFTVCB3aXRoIGJpbmRpbmdzIHdoZW4gaXQgc2hvdWxkIChwcm9iYWJseSkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMDM0Ij4yOTAwMzQ8L2E+CitFZmZlY3RzIG9mIEBTdXBwcmVzc1dhcm5pbmdzKCZxdW90O3VuY2hlY2tlZCZxdW90OykgYXJlIGJyb2FkZXIgaW4gRWNsaXBzZSB0aGFuIGluIGphdmFjCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzU2MSI+MjY3NTYxPC9hPgorW2V2YWx1YXRpb25dIExvY2FsRXZhbHVhdGlvbkVuZ2luZSBkb2VzIG5vdCBhY2NlcHQgcHJpbWl0aXZlIHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzE5NCI+MTYzMTk0PC9hPgorWzEuNl0gY29tcGlsZXIgc2hvdWxkIHdhcm4gYWJvdXQgbWlzc2luZyBAT3ZlcnJpZGUgYW5ub3RhdGlvbiBmb3IgaW50ZXJmYWNlIG1ldGhvZAorCis8YSBuYW1lPSJ2X0ExMSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTMgLSBTZXB0ZW1iZXIgMjIsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTExCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0ExMSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODk4OTIiPjI4OTg5MjwvYT4KK1tjb21waWxlcl0gTlBFIGR1cmluZyBiaW5hcnlUeXBlQmluZGluZyBmaWVsZCBpbml0aWFsaXphdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODc4MzMiPjI4NzgzMzwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdHRlciByZW1vdmVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlICogaW4gdGhlICZsdDtwcmUmZ3Q7IHRhZworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg5NDMiPjIzODk0MzwvYT4KK1NvcnRFbGVtZW50c09wZXJhdGlvbiBkb2Vzbid0IHVzZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODYyMSI+Mjg4NjIxPC9hPgorWzEuNV1bY29tcGlsZXJdIENyZWF0aW5nIHR5cGUgaGllcmFyY2h5IGZhaWxlZCB3aGVuIHByZXNzaW5nIEY0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTUzOCI+Mjg5NTM4PC9hPgorWzEuNV1bY29tcGlsZXJdIGNvbXBpbGVyIGZhaWxzIHRvIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IgcHJpdmF0ZSBjb25zdHJ1Y3RvciBpbiBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODk2MzkiPjI4OTYzOTwvYT4KK1Byb2JsZW1zIG9wZW5pbmcgcGVyc3BlY3RpdmUgSmF2YVBlcnNwZWN0aXZlLCBOUEUgb24gSmF2YU1vZGVsTWFuYWdlci5jb250YWluZXJzUmVzZXQoKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODk1MTYiPjI4OTUxNjwvYT4KK0Fubm90YXRpb25zICh2aXNpYmxlIGFuZCBpbnZpc2libGUpIHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2l0aCB0YXJnZXQganNyMTQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5NTc2Ij4yODk1NzY8L2E+CitbMS41XVtjb21waWxlcl0gQ29tcGlsZXIgY2hhbmdlcyAncHJpdmF0ZScgbW9kaWZpZXIgb24gbWV0aG9kcyB3aXRoIGFubm90YXRlZCBwYXJhbWV0ZXIKKworPGEgbmFtZT0idl9BMTAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0yIC0gU2VwdGVtYmVyIDE0LCAyMDA5IC0gMy42TTIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTEwCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0ExMCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODgxNDgiPjI4ODE0ODwvYT4KK1twZXJmc10gQ29tbWVudHMgYXBwbGllZCBmb3IgcGVyZm9ybWFuY2UgdGVzdHMgbWF5IGJlIG9ic29sZXRlCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTI0NyI+Mjg5MjQ3PC9hPgorWzEuNV1bY29tcGlsZXJdRGV0ZWN0aW5nIGR1cGxpY2F0ZSBtZXRob2RzIHNob3VsZCBub3QgY29uc2lkZXIgcmV0dXJuIHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4OTIwIj4yODg5MjA8L2E+CitbY29tcGlsZXJdIE5QRSByZW5hbWluZyBydW4oKSBtZXRob2QKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4Njk4Ij4yODg2OTg8L2E+CitDYW5ub3QgY3JlYXRlIHR5cGUgaGllcmFyY2h5IGZvciBhYnN0cmFjdCB0eXBlcyB3aGVuIHRoZXkgaGF2ZSBpbmxpbmUgZGVzY2VuZGFudHMgYW5kICouY2xhc3MqIGluIHByb2plY3QgbmFtZQorCis8YSBuYW1lPSJ2X0EwOSI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTIgLSBTZXB0ZW1iZXIgMSwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMDkKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTA5Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NzAwOSI+Mjg3MDA5PC9hPgorSW5uZXIgQW5ub3RhdGlvbiBDaGVja3MgYXJlIE1pc3NpbmcKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3NzAxIj4yODc3MDE8L2E+CitbZG9tXSBMZW5ndGggb2YgQXNzaWdubWVudCBzaG91bGQgbm90IGluY2x1ZGUgd2hpdGVzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODUyMzAiPjI4NTIzMDwvYT4KK1twZXJmb3JtYW5jZV0gRHVwbGljYXRlIGJ1ZmZlcnMgY3JlYXRlZCBmb3IgaW50ZXJuYWwgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODYzOTEiPjI4NjM5MTwvYT4KK1tjb21waWxlcl0ganNyMTQgdGFyZ2V0IGJlaGF2aW9yIGNoYW5nZWQgYmV0d2VlbiBFQ0ogMy40LjIgYW5kIEVDSiAzLjUKKworPGEgbmFtZT0idl9BMDgiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0yIC0gQXVndXN0IDI1LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EwOAorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMDgiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3NDYyIj4yODc0NjI8L2E+CitbZm9ybWF0dGVyXSBuZXcgZmFpbHVyZXMgaW4gbGFzdCAyIG5pZ2h0bHkgYnVpbGRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTU2NSI+Mjg1NTY1PC9hPgorW2lubGluZV0gSW5saW5pbmcgY29uc3RhbnQgb3IgbG9jYWwgdmFyaWFibGVzIGNhdXNlcyBleGNlcHRpb25zIHdpdGggdGFiIHdpZHRoIDAKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1Nzk5Ij4yODU3OTk8L2E+CitIYXNodGFibGVPZk9iamVjdCByZWhhc2hlcyBhbmQgZ3Jvd3MgYnVmZmVyIG9uIHJlbW92ZUtleSgpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjkxMiI+Mjg2OTEyPC9hPgorW2Zvcm1hdHRlcl0gTmV2ZXIgam9pbiBsaW5lcyBwcmVmZXJlbmNlcyBtYWtlcyB0aGUgZm9ybWF0dGVyIHVuc3RhYmxlIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY2NjgiPjI4NjY2ODwvYT4KK1tmb3JtYXR0ZXJdICdOZXZlciBKb2luIExpbmVzJyBqb2lucyBsaW5lcyB0aGF0IGFyZSBzcGxpdCBvbiBtZXRob2QgaW52b2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDg2NjEiPjI0ODY2MTwvYT4KK0F4aXMyOiAgTWlzc2luZyByZXF1aXJlZCBsaWJyYXJpZXMgaW4gQXhpcyAyIFdTIENsaWVudCBQcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY5MTgiPjI4NjkxODwvYT4KK1tqYXZhZG9jXSBDb21waWxlciBzaG91bGQgd2FybiB3aGVuIEBzZWUgYW5kIEBsaW5rIHRhZyByZWZlcmVuY2VzIGluIHBhY2thZ2UtaW5mby5qYXZhIGRvbid0IGhhdmUgZnVsbHkgcXVhbGlmaWVkIG5hbWVzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTQ2NiI+Mjg1NDY2PC9hPgorWzMuNSByZWdyZXNzaW9uXSBmYWlscyB0byBidWlsZCBJY2VkVGVhLCB3b3JrcyB3aXRoIDMuNC54Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Njk1NiI+Mjg2OTU2PC9hPgorTlBFIHdoZW4gYXNraW5nIHRvIGV4dGVybmFsaXplIGNvbnN0YW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTYwOSI+MjgxNjA5PC9hPgorW2phdmFkb2NdICZxdW90O0phdmFkb2M6IEludmFsaWQgcmVmZXJlbmNlJnF1b3Q7IHdhcm5pbmcgZm9yIEBsaW5rIHRvIEphdmEgcGFja2FnZQorCis8YSBuYW1lPSJ2X0EwNyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTIgLSBBdWd1c3QgMTgsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTA3CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EwNyI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY4NDAiPjI4Njg0MDwvYT4KK0NsYXNzcGF0aEphciBnZXRQYXRoKCkgc2hvdWxkIHJldHVybiBhIHVuaXF1ZSBwYXRoCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NDczOCI+MjU0NzM4PC9hPgorTlBFIGluIEhpZXJhcmNoeVJlc29sdmVyLnNldEZvY3VzVHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzYyOTQiPjI3NjI5NDwvYT4KK0Vycm9yIGRvZXMgbm90IGdvIGF3YXkgYWZ0ZXIgaXQgaXMgcmVzb2x2ZWQKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg0Nzg1Ij4yODQ3ODU8L2E+CitbMS41XVtjb21waWxlcl0gRWNsaXBzZSBjb21waWxlciBzaG93cyBlcnJvciBvbiBqYXZhYy12YWxpZCBjb25zdHJ1Y3Q6IHZhcmFyZ3MgcGx1cyBvdmVybG9hZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY0MDUiPjI4NjQwNTwvYT4KK0RlZmF1bHQgdmFsdWUgY2hhcmFjdGVyIG9mIGFubm90YXRpb25zIGluIENsYXNzRmlsZUVkaXRvciBhcmUgYmFkbHkgcHJpbnRlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY0MDciPjI4NjQwNzwvYT4KK1tNb2RlbF0gSU1lbWJlclZhbHVlUGFpciBkb24ndCByZXR1cm4gdGhlIHJpZ2h0IHZhbHVlIGZvciBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgYW5ub3RhdGlvbnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1NzAxIj4yODU3MDE8L2E+CitbMS41XVtjb21waWxlcl0gSW50ZXJuYWwgQ29tcGlsZXIgRXJyb3IgLSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKworPGEgbmFtZT0idl9BMDYiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0xIC0gQXVndXN0IDMsIDIwMDkgLSAzLjZNMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMDYKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTA2Ij5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDk0OCI+Mjg0OTQ4PC9hPgorWzEuNl1bY29tcGlsZXJdIEphdmEgYW5ub3RhdGlvbnMgYXJlIGJyb2tlbiBpbiBlZGl0b3Igd2hlbiB1c2VkIG9uIGludGVyZmFjZSBtZXRob2RzCisKKzxhIG5hbWU9InZfQTA1Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMSAtIEp1bHkgMzAsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTA1CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EwNSI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY1MjYiPjI3NjUyNjwvYT4KK1tjb250ZW50IGFzc2lzdF0gRXJyb3IgLSBUeXBlIER1cGxpY2F0ZSBpbnRlcmZhY2UgSXRlcmFibGUgZm9yIHRoZSB0eXBlIFRlc3RDbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTExNzYiPjE5MTE3NjwvYT4KK0phdmFQcm9qZWN0I2dldE9wdGlvbiBvcHRpbWl6YXRpb25zCisKKzxhIG5hbWU9InZfQTA0Ij48L2E+Cis8aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KK0phdmEgZGV2ZWxvcG1lbnQgdG9vbHMgY29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMSAtIEp1bHkgMjgsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTA0CisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EwNCI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE5MDkiPjI2MTkwOTwvYT4KK0NsYXNzRmlsZVJlYWRlci5nZXRNb2RpZmllcnMoKSBhbnN3ZXJzIGZ1bm55IGJpdHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzMjI1Ij4yODMyMjU8L2E+CitbMS42XVtjb21waWxlcl0gY2xhc3NmaWxlIHZlcnN1cyBzb3VyY2UgY29uZm9ybWFuY2UgY2hlY2sgdG9vIHN0cmljdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQ2NzkiPjI4NDY3OTwvYT4KK1tmb3JtYXR0ZXJdIGVtcHR5IHNpbmdsZSBzZW1pIHN0YXRlbWVudCBwcmV2ZW50IGVudW0gZWxlbWVudHMgZm9ybWF0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDQ4MiI+Mjg0NDgyPC9hPgorW2NvbXBpbGVyXSBDb2xsaXNpb24gY2FzZXMgbm90IGRldGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDQzMSI+Mjg0NDMxPC9hPgorRGlmZmVyZW50IGluaGVyaXRlZCB0aHJvd24gZXhjZXB0aW9uIGNsYXVzZXMgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzkxMSI+MTMzOTExPC9hPgordHlwZS5tb3ZlKCkgcmV0dXJucyB1bmNsZWFyIGV4Y2VwdGlvbiAmcXVvdDtpbnZhbGlkIGRlc3RpbmF0aW9uJnF1b3Q7Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDQzNiI+MjcwNDM2PC9hPgorW2Fzc2lzdF0gSW50ZXJmYWNlIHR5cGUgcHJvcG9zZWQgd2hlcmUgb25seSBjbGFzcyBpcyBsZWdhbAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTAzODUiPjIxMDM4NTwvYT4KK1tjb21waWxlcl0gUHJvYmxlbVJlcG9ydGVyI2dldFByb2JsZW1DYXRlZ29yeSBtaXNiZWhhdmVzIHdoZW4gcGFzc2VkIFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSBhcyBzZXZlcml0eSBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyODkxIj4yODI4OTE8L2E+CitbY29tcGlsZXJdICJDb21wYXJpbmcgaWRlbnRpY2FsIGV4cHJlc3Npb25zIiB3YXJuaW5nIHNvbWV0aW1lcyBpbnZhbGlkCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjg2OSI+MjgyODY5PC9hPgorW2NvbXBpbGVyXSBVbm5lY2Vzc2FyeSBjYXN0IHdhcm5pbmcgZm9yIGNhc3QgZnJvbSBjaGFyIHRvIGludAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA0MzciPjI3MDQzNzwvYT4KK1thc3Npc3RdIENvbXBsZXRpb24gcHJvcG9zYWwgbGVhZHMgdG8gY3ljbGUgZGV0ZWN0ZWQgZXJyb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3NDQzIj4yMTc0NDM8L2E+CitEb2N1bWVudGF0aW9uIGZvciBKYXZhQ29yZSNDT1JFX0VOQ09ESU5HIGRvZXMgbm90IG1hdGNoIHRoZSBvYnNlcnZlZCBiZWhhdmlvcgorCis8YSBuYW1lPSJ2X0EwMyI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIGRldmVsb3BtZW50IHRvb2xzIGNvcmU8L2gxPgorRWNsaXBzZSBTREsgMy42TTEgLSBKdWx5IDIxLCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EwMworKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMDMiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzNDY3Ij4yODM0Njc8L2E+CitbZm9ybWF0dGVyXSB3cm9uZyBpbmRlbnRhdGlvbiB3aXRoICdOZXZlciBqb2luIGxpbmVzJyBzZWxlY3RlZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODE3NzYiPjI4MTc3NjwvYT4KK1Nob3VsZCBub3Qgd2FybiBmb3IgY29tcGFyaXNvbiBvZiBpZGVudGljYWwgZXhwcmVzc2lvbiB3aXRoIGZsb2F0IHR5cGUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyNzY4Ij4yODI3Njg8L2E+CitbY29tcGlsZXJdIERlYWQgY29kZSBkZXRlY3Rpb24gc2hvdWxkIGlnbm9yZSB0cml2aWFsIGNhc2UgZm9yIHRlcm5hcnkgaWYgb3BlcmF0b3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzMTMzIj4yODMxMzM8L2E+CitbZm9ybWF0dGVyXSBJQUUgd2hlbiBwYXN0aW5nIGEgc25pcHBldAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODMyOTkiPjI4MzI5OTwvYT4KK0NvbXBsZXRlIFNvdXJjZVJhbmdlIEFQSQorCis8YSBuYW1lPSJ2X0EwMiI+PC9hPgorPGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjZNMSAtIEp1bHkgMTMsIDIwMDkKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfQTAyCisoPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZS8/b25seV93aXRoX3RhZz12X0EwMiI+Y3ZzPC9hPikuCis8aDI+V2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIG5ldyBBUEkgdHlwZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5Tb3VyY2VSYW5nZTwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzEyOTYiPjI3MTI5NjwvYT4KK1thc3Npc3RdIHZvaWQgdHlwZWQgcHJvcG9zYWwgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBpbiBtYW55IGNvbnRleHRzCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTg3MSI+MjgxODcxPC9hPgorW2NvbnRlbnQgYXNzaXN0XSBUaGUgZXh0ZW5zaW9uIHRvb2sgdG9vIGxvbmcgdG8gcmV0dXJuIGZyb20gdGhlICdjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygpJyBvcGVyYXRpb24KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxNTk4Ij4yODE1OTg8L2E+CitbYXNzaXN0XSBQcm9ibGVtcyBkdXJpbmcgY29udGVudCBhc3Npc3QgLSBpZiBwcm9qZWN0IGhhcyBlbXB0eSB6aXAgZmlsZSBpbiBjbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1Mjk0Ij4yMzUyOTQ8L2E+CitbZm9ybWF0dGVyXSBqYXZhZG9jIGZvciBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cyNGT1JNQVRURVJfQUxJR05NRU5UX0ZPUl9BU1NJR05NRU5UIGNpdGVzIGEgbm9uLUFQSSBjb25zdGFudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA0OTciPjI4MDQ5NzwvYT4KK0luY29ycmVjdCBudWxsIHJlc3VsdCBmb3IgSUphdmFQcm9qZWN0LmdldENsYXNzcGF0aEVudHJ5Rm9yKElQYXRoKQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQ3NzciPjIwNDc3NzwvYT4KK0NsYXJpZnkgZG9jdW1lbnRhdGlvbiBmb3IgSVR5cGVIaWVyYXJjaHkgY3JlYXRlZCBvbiBpbnRlcmZhY2UgdHlwZXMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgyNjUiPjg4MjY1PC9hPgorTWFrZSBTb3VyY2VSYW5nZSBBUEkKKworPGEgbmFtZT0idl9BMDEiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0xIC0gSnVseSA3LCAyMDA5Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2X0EwMQorKDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2UuamR0LmNvcmUvP29ubHlfd2l0aF90YWc9dl9BMDEiPmN2czwvYT4pLgorPGgyPldoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwOTY4Ij4yNjA5Njg8L2E+CitEZWFkbG9jayBpbiBVc2VyTGlicmFyeU1hbmFnZXIKKworPGEgbmFtZT0idl9BMDAiPjwvYT4KKzxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorSmF2YSBkZXZlbG9wbWVudCB0b29scyBjb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDMuNk0xIC0gSnVuZSAzMCwgMjAwOQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl9BMDAKKyg8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlLz9vbmx5X3dpdGhfdGFnPXZfQTAwIj5jdnM8L2E+KS4KKzxoMj5XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+TmV3IEFQSSBhZGRlZCB0byBoYW5kbGUgdGhlIG5ldyA8Y29kZT5pbnZva2VkeW5hbWljPC9jb2RlPiBieXRlY29kZToKKzxwcmU+CitvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkJ5dGVDb2RlVmlzaXRvckFkYXB0ZXI6CisJcHVibGljIHZvaWQgX2ludm9rZWR5bmFtaWMoCisJCQlpbnQgcGMsCisJCQlpbnQgaW5kZXgsCisJCQlJQ29uc3RhbnRQb29sRW50cnkgbmFtZUVudHJ5LAorCQkJSUNvbnN0YW50UG9vbEVudHJ5IGRlc2NyaXB0b3JFbnRyeSkgeworCQkvLyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKKwl9Cis8L3ByZT4KKzxwcmU+b3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQnl0ZWNvZGVWaXNpdG9yI19pbnZva2VkeW5hbWljKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnksIElDb25zdGFudFBvb2xFbnRyeSk8L3ByZT4KKzxwcmU+b3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JT3Bjb2RlTW5lbW9uaWNzI0lOVk9LRURZTkFNSUM8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc0NTAiPjI3NzQ1MDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBQcm9ibGVtcyB3aXRoICs9IGFuZCBBdXRvYm94aW5nL1VuYm94aW5nCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjQ5OCI+MjA2NDk4PC9hPgorWzEuN11bY29tcGlsZXJdIFJlbW92ZSBmaXggZm9yIGJ1ZyAyMDY0ODMgb25jZSAxLjcgVk1TIGNhbiBoYW5kbGUgLmNsYXNzIGZpbGVzIHdpdGggdmVyc2lvbiA1MS4wCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTE3NiI+MTkxMTc2PC9hPgorSmF2YVByb2plY3QjZ2V0T3B0aW9uIG9wdGltaXphdGlvbnMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxNzYyIj4yMDE3NjI8L2E+CitDb250ZW50IEFzc2lzdCBoYXMgbm8gcHJvcG9zYWxzIHdpdGggY2VydGFpbiBDVSBzdHJ1Y3R1cmUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxNjgxIj4yODE2ODE8L2E+CitTdGFsZSBjb2RlIGluIENvbXBpbGVyT3B0aW9ucworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzE3OTYiPjIzMTc5NjwvYT4KK1tmb3JtYXR0ZXJdIEB0aHJvd3MgdGFnIGRlc2NyaXB0aW9uIGlzIG5vdCBpbmRlbnRlZCB1c2luZyBAcGFyYW0gcHJlZmVyZW5jZSB3aGVuIHRoZXJlJ3MgYSBzeW50YXggZXJyb3IKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MTQyIj4yNTUxNDI8L2E+Citbc2VsZWN0XSBDb2Rlc2VsZWN0IHNob3VsZCBub3Qgb21pdCBjYXN0Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTI5NSI+MjM1Mjk1PC9hPgorW2Zvcm1hdHRlcl0gamF2YWRvYyBvZiBDb2RlRm9ybWF0dGVyI0ZfSU5DTFVERV9DT01NRU5UUyBuZWVkcyBpbXByb3ZlbWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODAxMzQiPjI4MDEzNDwvYT4KK1sxLjVdW2NvbXBpbGVyXSBSZXF1ZXN0aW5nIEphdmEgQVNUIGZyb20gc2VsZWN0aW9uIGhhcyBlbmNvdW50ZXJlZCBhIHByb2JsZW0KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgxMzE3Ij4yODEzMTc8L2E+Citbc2VhcmNoXSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmc6ICJKYXZhIFNlYXJjaCIuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NjM3MyI+Mjc2MzczPC9hPgorSW5jb3JyZWN0IHJlc291cmNlIGNvbXBhcmlzb24gd2l0aCBJSmF2YVByb2plY3QuaXNPbkNsYXNzcGF0aChJUmVzb3VyY2UpCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTUxOCI+Mjc1NTE4PC9hPgorW2Fzc2lzdF0gQ29udGVudCBhc3Npc3QgZG9lcyBub3QgcHJvdmlkZSBwcm9wb3NhbHMgaWYgaW52b2tlZCByaWdodCBhZnRlciBhIG1ldGhvZCdzIG9wZW5pbmcgYnJhY2UKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwODg4Ij4yODA4ODg8L2E+CitjaGFuZ2UgYSBqYXZhIGZpbGUgaW4gb25lIHBsdWctaW4gd2lsbCBjb21waWxlIGFsbCByZWxhdGVkIHBsdWdpbiBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ0NjYiPjI3NDQ2NjwvYT4KK1thc3Npc3RdIEFzc2VydCBleHByZXNzaW9ucyBzaG91bGQgYmUgcHJvcG9zZWQgd2l0aCBoaWdoIHJlbGV2YW5jZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzczODIiPjI3NzM4MjwvYT4KK05QRSBhbmQgb3RoZXIgZmFpbHVyZXMgaW4gUGFyc2VyCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTMzMCI+Mjc1MzMwPC9hPgorTlBFIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NwYXRoQ2hhbmdlLnJlcXVlc3RJbmRleGluZworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzMzODUiPjI3MzM4NTwvYT4KK1ttb2RlbF0gTlBFIHdoaWxlIGNsb3NpbmcgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODAwNzkiPjI4MDA3OTwvYT4KK05QRSB3aGlsZSBwYXJzaW5nIEtfQ0xBU1NfQk9EWV9ERUNMQVJBVElPTlMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwMDYzIj4yODAwNjM8L2E+CitvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlci5wYXJzZUNsYXNzQm9keURlY2xhcmF0aW9ucyhjaGFyW10sIGludCwgaW50LCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikgc2hvdWxkIHJldHVybiBjb25zaXN0ZW50IHJlc3VsdHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3MDQ2Ij4yNjcwNDY8L2E+CitTb3VyY2VNYXBwZXIgaW5maW5pdGUgbG9vcCBvbiBwcmltaXRpdmUgdHlwZSBpbiBnZW5lcmljCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDkzNCI+MjQwOTM0PC9hPgorQWRkIHN1cHBvcnQgZm9yIHRoZSBpbnZva2VkeW5hbWljIGJ5dGVjb2RlIGludG8gdGhlIGRpc2Fzc2VtYmxlcgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1NTEiPjI2NzU1MTwvYT4KK1tmb3JtYXR0ZXJdIFdyb25nIHNwYWNpbmcgaW4gZGVmYXVsdCBhcnJheSBwYXJhbWV0ZXIgZm9yIGFubm90YXRpb24gdHlwZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc5NjUiPjI3Nzk2NTwvYT4KK1tjb21waWxlcl0gTlBFIGluIGNhbkJlU2VlbkJ5IGR1ZSB0byBpbGxlZ2FsIHByb3RlY3RlZCB0b3BsZXZlbCBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzM5OTAiPjI3Mzk5MDwvYT4KK1tjb21waWxlcl0gRlVQIG9mIDI2OTM4ODogRWNsaXBzZSBhY2NlcHRzIGNvZGUgcmVqZWN0ZWQgYnkgamF2YWMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5MTgzIj4yNzkxODM8L2E+CitbMS42XVtjb21waWxlcl0gSW5jb25zaXN0ZW50IHN0YWNrbWFwIGZyYW1lcyBnZW5lcmF0ZWQgYnkgSkRUIGNhdXNlIFZlcmlmeUVycm9yCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTc3OCI+MjA5Nzc4PC9hPgorW3NlYXJjaF0gVHlwZVJlZmVyZW5jZU1hdGNoI2dldE90aGVyRWxlbWVudHMoKSBmYWlscyBmb3IgbWF0Y2ggaW4gYW5ub3RhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjEwNjUiPjIyMTA2NTwvYT4KK1tzZWFyY2hdIFNlYXJjaCBzdGlsbCBmaW5kcyBvdmVycmlkZGVuIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk4MzYiPjI3OTgzNjwvYT4KK1sxLjVdW2NvbXBpbGVyXSBFY2xpcHNlIGNvbXBpbGVyIHNob3dzIGVycm9yIG9uIGphdmFjLXZhbGlkIGNvbnN0cnVjdDogcmF3IHR5cGVzIG9uIG92ZXJyaWRkZW4gbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA2MTYiPjI4MDYxNjwvYT4KK1tmb3JtYXR0ZXJdIFZhbGlkIDEuNSBjb2RlIGlzIG5vdCBmb3JtYXR0ZWQgaW5zaWRlICZsdDtwcmUmZ3Q7IHRhZworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODAyNTUiPjI4MDI1NTwvYT4KK1tmb3JtYXR0ZXJdIEZvcm1hdCBlZGl0ZWQgbGluZXMgYWRkcyB0d28gbmV3IGxpbmVzIG9uIGVhY2ggc2F2ZQorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODAwNjEiPjI4MDA2MTwvYT4KK1tmb3JtYXR0ZXJdIEFJT09CRSB3aGlsZSBmb3JtYXR0aW5nIGphdmFkb2MgY29tbWVudAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY5MzgiPjI3NjkzODwvYT4KK1JlbW92ZSB1bnJlYWNoYWJsZSByZW1vdmVzIHJlYWNoYWJsZSBsb2dpYyBpbiBjYXNlIHN0YXRlbWVudC4KKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0ODk4Ij4yNzQ4OTg8L2E+CitbcmVjb3ZlcnldIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBBU1ROb2RlI3NldFNvdXJjZVJhbmdlKCkKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3MjA0Ij4yNzcyMDQ8L2E+CitJQUUgaW4gU2hhcmVkQVNUUHJvdmlkZXIgZm9yIGdlbmVyaWMgbG9jYWwgY2xhc3MuCis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njc0MSI+Mjc2NzQxPC9hPgorY29tcGFyaW5nIGlkZW50aWNhbCB2YWx1ZSBkZXRlY3Rpb24gZG9lcyBub3Qgd29yayBmb3IgdGhpcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY3NDAiPjI3Njc0MDwvYT4KK2NvbXBhcmluZyBpZGVudGljYWwgdmFsdWUgZGV0ZWN0aW9uIGRvZXMgbm90IHdvcmsgZm9yIHByaW1pdGl2ZSB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzg3NDUiPjI3ODc0NTwvYT4KK01ldGhvZHMgb3ZlcmxvYWRlZCB3aXRoIHVuYXZhaWxhYmxlIHR5cGVzIHdvcmtlZCBpbiAzLjQgYnV0IGdpdmUgImluZGlyZWN0bHkgcmVmZXJlbmNlZC4uIiBlcnJvciBpbiAzLjUKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4MzA1Ij4yNzgzMDU8L2E+CitbMS41XVtjb21waWxlcl0gSkRUIGFjY2VwdHMgc3VwZXJ0eXBlIHBhcmFtZXRlcml6ZWQgd2l0aCB3aWxkY2FyZAorPGJyPjxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTYzMDgiPjE5NjMwODwvYT4KK1tmb3JtYXR0ZXJdIERvbid0IGVzY2FwZSBlbnRpdHkgd2hlbiBmb3JtYXR0aW5nIGluICZsdDtwcmUmZ3Q7IHRhZ3Mgd2l0aGluIGphdmFkb2MgY29tbWVudHMKKzxicj48YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5MzU5Ij4yNzkzNTk8L2E+CitbZm9ybWF0dGVyXSBGb3JtYXR0ZXIgd2l0aCAnbmV2ZXIgam9pbiBsaW5lcycgcHJvZHVjZXMgZXh0cmEgbGV2ZWwgb2YgaW5kZW50Cis8YnI+PGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MzYxOSI+MjczNjE5PC9hPgorW2Zvcm1hdHRlcl0gRm9ybWF0dGluZyByZXBlYXRzICp9IGluIGphdmFkb2MKKworPGhyPgorPHA+Rm9yIGVhcmxpZXIgYnVpbGQgbm90ZXMsIGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjM1X2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCI+YnVpbGQgbm90ZXMgdXAgdG8gUmVsZWFzZSAzLjU8L2E+LjwvcD4KKzxicj4KKyAgPHA+CisgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPjxpbWcKKyAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC1odG1sNDAxIgorICAgICAgICBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+PC9hPgorICA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3BvcnRpbmdfZ3VpZGUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3BvcnRpbmdfZ3VpZGUuaHRtbAppbmRleCBjMTg5NTlmLi4xMTIxZjc1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9wb3J0aW5nX2d1aWRlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcG9ydGluZ19ndWlkZS5odG1sCkBAIC0xNyw5ICsxNyw5IEBACiA8aDI+UmVxdWlyZWQgY2hhbmdlcyBmb3IgMy4wPC9oMj4KIDxwPk5vbmUuPC9wPgogPGgyPlJlY29tbWVuZGVkIGNoYW5nZXMgZm9yIDMuMDwvaDI+Ci08YiBjbGFzcz0idGl0bGUxIj4KLTxwPltKRFQgb25seV0gSW1wcm92ZWQgc3VwcG9ydCBmb3Igd29ya2luZyBjb3BpZXMgKHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUpPC9wPgotPC9iPgorPHA+PGIgY2xhc3M9InRpdGxlMSI+CitbSkRUIG9ubHldIEltcHJvdmVkIHN1cHBvcnQgZm9yIHdvcmtpbmcgY29waWVzIChwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlKQorPC9iPjwvcD4KIDxwPlRoZSBKYXZhIG1vZGVsIHdvcmtpbmcgY29weSBmYWNpbGl0eSBoYXMgYmVlbiByZXdvcmtlZCBpbiAzLjAgdG8gcHJvdmlkZQogZ3JlYXRseSBpbmNyZWFzZWQgZnVuY3Rpb25hbGl0eS4gUHJpb3IgdG8gMy4wLCB0aGUgSmF2YSBtb2RlbCBhbGxvd2VkIGNyZWF0aW9uCiBvZiBpbmRpdmlkdWFsIHdvcmtpbmcgY29waWVzIG9mIGNvbXBpbGF0aW9uIHVuaXRzLiBDaGFuZ2VzIGNvdWxkIGJlIG1hZGUgdG8gdGhlCkBAIC0zMDYsOSArMzA2LDkgQEAKICAgPC9saT4KIDwvdWw+CiAKLTxiIGNsYXNzPSJ0aXRsZTEiPgotPHA+W0pEVCBvbmx5XSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGFudHMgKHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoKTwvcD4KLTwvYj4KKzxwPjxiIGNsYXNzPSJ0aXRsZTEiPgorW0pEVCBvbmx5XSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGFudHMgKHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoKQorPC9iPjwvcD4KIDxwPkxhbmd1YWdlcyBjbG9zZSB0byBKYXZhIChzdWNoIGFzIEpTUCwgU1FMSiwgSldTLCBldGMuKSBzaG91bGQgYmUgYWJsZSB0byBwYXJ0aWNpcGF0ZSBpbiBKYXZhIHNlYXJjaGluZy4gCiBJbiBwYXJ0aWN1bGFyIGltcGxlbWVudG9ycyBvZiBzdWNoIGxhbmd1YWdlcyBzaG91bGQgYmUgYWJsZSB0bzo8L3A+CiA8dWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4uamFycyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5qYXJzCmluZGV4IGI0N2MxYzguLjVlY2Q4OTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5qYXJzCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5qYXJzCkBAIC0xLDkgKzEsOSBAQAotamR0Y29yZS5qYXI9XAotCWJhdGNoLFwKLQljb2RlYXNzaXN0LFwKLQljb21waWxlcixcCi0JZXZhbCxcCi0JZm9ybWF0dGVyLFwKLQlkb20sXAotCW1vZGVsLCBcCi0Jc2VhcmNoCitqZHRjb3JlLmphcj1cDQorCWJhdGNoLFwNCisJY29kZWFzc2lzdCxcDQorCWNvbXBpbGVyLFwNCisJZXZhbCxcDQorCWZvcm1hdHRlcixcDQorCWRvbSxcDQorCW1vZGVsLCBcDQorCXNlYXJjaA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggOGJiMTkzYy4uYjZiMjlhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi54bWwKaW5kZXggZGRjNTBmOC4uMzc4NDI1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ueG1sCkBAIC0xLDUgKzEsMTYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgQ29udHJpYnV0b3JzOgorICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDwhLS0gSkRUL0NPUkUgUGx1Zy1pbiBNYW5pZmVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTg3LDcgKzE5OCw3IEBACiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSBFeHRlbnNpb246IEphdmEgQ29udGVudCBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KIAk8IS0tIGRlY2xhcmVzIGEgY29udGVudCB0eXBlIGZvciBKYXZhIFByb3BlcnRpZXMgZmlsZXMgLS0+CiAJPGNvbnRlbnQtdHlwZSBpZD0iamF2YVByb3BlcnRpZXMiIG5hbWU9IiVqYXZhUHJvcGVydGllc05hbWUiIAogCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmV4c2QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZXhzZAppbmRleCA1ZDI4MmI1Li5jMjk2YTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZXhzZAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZXhzZApAQCAtMSwxMjQgKzEsMTI0IEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZHQuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIGlkPSJjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIgbmFtZT0iQ2xhc3NwYXRoIENvbnRhaW5lciBJbml0aWFsaXplcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBjdXN0b20gY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplcnMsIAotICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gbGF6aWx5IGJpbmQgY2xhc3NwYXRoIGNvbnRhaW5lcnMgdG8gaW5zdGFuY2VzIG9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgaWRlbnRpZnlpbmcgYWxsIGNvbnRhaW5lcnMgZm9yIHdoaWNoIHRoaXMgaW5pdGlhbGl6ZXIgd2lsbCBiZSBhY3RpdmF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRhaW5lciBpbml0aWFsaXplci4KLSAgICAgICAgIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeGFtcGxlIG9mIGEgZGVjbGFyYXRpb24gb2YgYSAmbHQ7Y29kZSZndDtDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciZsdDsvY29kZSZndDsgZm9yIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBuYW1lZCAmcXVvdDtKREsmcXVvdDs6ICAmbHQ7cHJlJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyJnF1b3Q7Jmd0OyAgICAgICAgICAgIAotICAgJmx0O2NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZD0mcXVvdDtKREsmcXVvdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuTXlJbml0aWFsaXplciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZHQuY29yZSI+DQorPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIGlkPSJjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIgbmFtZT0iQ2xhc3NwYXRoIENvbnRhaW5lciBJbml0aWFsaXplcnMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBjdXN0b20gY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplcnMsIA0KKyAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIGxhemlseSBiaW5kIGNsYXNzcGF0aCBjb250YWluZXJzIHRvIGluc3RhbmNlcyBvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyLg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgaWRlbnRpZnlpbmcgYWxsIGNvbnRhaW5lcnMgZm9yIHdoaWNoIHRoaXMgaW5pdGlhbGl6ZXIgd2lsbCBiZSBhY3RpdmF0ZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBjb250YWluZXIgaW5pdGlhbGl6ZXIuDQorICAgICAgICAgVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBhIHB1YmxpYyBzdWJjbGFzcyBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgMi4wDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIEV4YW1wbGUgb2YgYSBkZWNsYXJhdGlvbiBvZiBhICZsdDtjb2RlJmd0O0NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyJmx0Oy9jb2RlJmd0OyBmb3IgYSBjbGFzc3BhdGggY29udGFpbmVyIG5hbWVkICZxdW90O0pESyZxdW90OzogICZsdDtwcmUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCismbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyJnF1b3Q7Jmd0OyAgICAgICAgICAgIA0KKyAgICZsdDtjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgIGlkPSZxdW90O0pESyZxdW90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuTXlJbml0aWFsaXplciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCit0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KK2hyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCis8L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5leHNkIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuZXhzZAppbmRleCBlYjBiNTU4Li4yNmY5NjdkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5leHNkCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmV4c2QKQEAgLTEsMTQxICsxLDE0MSBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiBpZD0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIgbmFtZT0iQ2xhc3NwYXRoIFZhcmlhYmxlIEluaXRpYWxpemVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGN1c3RvbSBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXJzLCAKLSAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIGxhemlseSBiaW5kIGNsYXNzcGF0aCB2YXJpYWJsZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIGlkZW50aWZ5aW5nIHRoZSB2YXJpYWJsZSBmb3Igd2hpY2ggdGhpcyBpbml0aWFsaXplciB3aWxsIGJlIGFjdGl2YXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgdmFyaWFibGUgaW5pdGlhbGl6ZXIuCi0gICAgICAgICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgcHVibGljIHN1YmNsYXNzIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXByZWNhdGVkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBsYWluaW5nIHRoZSByZWFzb24gd2h5IHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlYWRPbmx5IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBjYW5ub3QgYmUgbW9kaWZpZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4YW1wbGUgb2YgYSBkZWNsYXJhdGlvbiBvZiBhICZsdDtjb2RlJmd0O0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IGZvciBhIGNsYXNzcGF0aCB2YXJpYWJsZSBuYW1lZCAmcXVvdDtGT08mcXVvdDs6ICAmbHQ7cHJlJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7ICAgICAgICAgICAgCi0gICAmbHQ7Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdmFyaWFibGU9JnF1b3Q7Rk9PJnF1b3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkNQVkluaXRpYWxpemVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+Cis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgaWQ9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIG5hbWU9IkNsYXNzcGF0aCBWYXJpYWJsZSBJbml0aWFsaXplcnMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBjdXN0b20gY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycywgDQorICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gbGF6aWx5IGJpbmQgY2xhc3NwYXRoIHZhcmlhYmxlcy4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFyaWFibGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgbmFtZSBpZGVudGlmeWluZyB0aGUgdmFyaWFibGUgZm9yIHdoaWNoIHRoaXMgaW5pdGlhbGl6ZXIgd2lsbCBiZSBhY3RpdmF0ZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyB2YXJpYWJsZSBpbml0aWFsaXplci4NCisgICAgICAgICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgcHVibGljIHN1YmNsYXNzIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4NCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwcmVjYXRlZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwbGFpbmluZyB0aGUgcmVhc29uIHdoeSB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBpcyBkZXByZWNhdGVkDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVhZE9ubHkiIHR5cGU9ImJvb2xlYW4iPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlIGNhbm5vdCBiZSBtb2RpZmllZA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAyLjANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgRXhhbXBsZSBvZiBhIGRlY2xhcmF0aW9uIG9mIGEgJmx0O2NvZGUmZ3Q7Q2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciZsdDsvY29kZSZndDsgZm9yIGEgY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVkICZxdW90O0ZPTyZxdW90OzogICZsdDtwcmUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCismbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7ICAgICAgICAgICAgDQorICAgJmx0O2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICB2YXJpYWJsZT0mcXVvdDtGT08mcXVvdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkNQVkluaXRpYWxpemVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCismbHQ7L2V4dGVuc2lvbiZndDsNCismbHQ7L3ByZSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jb2RlRm9ybWF0dGVyLmV4c2QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY29kZUZvcm1hdHRlci5leHNkCmluZGV4IDRmZTc3ZTYuLjM5NzIyOTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jb2RlRm9ybWF0dGVyLmV4c2QKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NvZGVGb3JtYXR0ZXIuZXhzZApAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQogPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUiPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCiA8YW5ub3RhdGlvbj4NCiAgICAgICA8YXBwSW5mbz4NCiAgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgaWQ9ImNvZGVGb3JtYXR0ZXIiIG5hbWU9IkNvZGUgRm9ybWF0dGVycyIvPg0KQEAgLTExLDYgKzExLDExIEBACiAgICA8L2Fubm90YXRpb24+DQogDQogICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiIC8+DQorICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCiAgICAgICA8Y29tcGxleFR5cGU+DQogICAgICAgICAgPHNlcXVlbmNlPg0KICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29kZUZvcm1hdHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KQEAgLTY4LDQ0ICs3MywyOCBAQAogICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KICAgICAgIDwvYXBwSW5mbz4NCiAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFeGFtcGxlIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O0lDb2RlRm9ybWF0dGVyJmx0Oy9jb2RlJmd0OzogICZsdDtwcmUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciZxdW90OyZndDsgICAgICAgICAgICAKLSAgICZsdDtjb2RlRm9ybWF0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuTXlDb2RlRm9ybWF0dGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSZsdDsvZXh0ZW5zaW9uJmd0OworICAgICAgICAgRXhhbXBsZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtJQ29kZUZvcm1hdHRlciZsdDsvY29kZSZndDs6ICAmbHQ7cHJlJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlRm9ybWF0dGVyJnF1b3Q7Jmd0OyAgICAgICAgICAgIA0KKyAgICZsdDtjb2RlRm9ybWF0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLk15Q29kZUZvcm1hdHRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorJmx0Oy9leHRlbnNpb24mZ3Q7DQogJmx0Oy9wcmUmZ3Q7DQogICAgICAgPC9kb2N1bWVudGF0aW9uPg0KICAgIDwvYW5ub3RhdGlvbj4NCiANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCiANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQogDQogICAgPGFubm90YXRpb24+DQogICAgICAgPGFwcEluZm8+DQogICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCiAgICAgICA8L2FwcEluZm8+DQogICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQogdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCiBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCiAgICA8L2Fubm90YXRpb24+DQogDQogPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NvbXBpbGVyLmR0ZCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jb21waWxlci5kdGQKaW5kZXggM2E5NjlkYy4uN2Q5ODlhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NvbXBpbGVyLmR0ZAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY29tcGlsZXIuZHRkCkBAIC0xLDEzICsxLDE0IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFFTEVNRU5UIGNvbXBpbGVyIChlcnJvciosY29tbWFuZF9saW5lPyxvcHRpb25zPyxjbGFzc3BhdGhzPyxlcnJvciosc291cmNlcyosZXh0cmFfcHJvYmxlbXM/LHN0YXRzPyxleGNlcHRpb24qKT4KKzwhRUxFTUVOVCBjb21waWxlciAoZXJyb3IqLGNvbW1hbmRfbGluZT8sb3B0aW9ucz8sY2xhc3NwYXRocz8sZXJyb3IqLHdhcm5pbmcqLHNvdXJjZXMqLGV4dHJhX3Byb2JsZW1zPyxzdGF0cz8sZXhjZXB0aW9uKik+CiA8IUVMRU1FTlQgY29tbWFuZF9saW5lIChhcmd1bWVudCopPgogPCFFTEVNRU5UIG9wdGlvbnMgKG9wdGlvbiopPgogPCFFTEVNRU5UIGNsYXNzcGF0aHMgKGNsYXNzcGF0aCspPgogPCFFTEVNRU5UIGVycm9yICgjUENEQVRBKT4KKzwhRUxFTUVOVCB3YXJuaW5nICgjUENEQVRBKT4KIDwhRUxFTUVOVCBzb3VyY2VzIChzb3VyY2UrKT4KIDwhRUxFTUVOVCBzb3VyY2UgKHByb2JsZW1zKix0YXNrcyosKGNsYXNzZmlsZSB8IGVycm9yKSopPgogPCFFTEVNRU5UIHByb2JsZW1zIChwcm9ibGVtKyk+Ci08IUVMRU1FTlQgcHJvYmxlbSAobWVzc2FnZSxzb3VyY2VfY29udGV4dCxhcmd1bWVudHMpPgorPCFFTEVNRU5UIHByb2JsZW0gKG1lc3NhZ2Usc291cmNlX2NvbnRleHQsYXJndW1lbnRzPyk+CiA8IUVMRU1FTlQgYXJndW1lbnRzIChhcmd1bWVudCspPgogPCFFTEVNRU5UIHRhc2tzICh0YXNrKyk+CiA8IUVMRU1FTlQgdGFzayAobWVzc2FnZSwgc291cmNlX2NvbnRleHQpPgpAQCAtNjgsNiArNjksNyBAQAogPgogPCFBVFRMSVNUIGNsYXNzZmlsZSBwYXRoIENEQVRBICNSRVFVSVJFRD4KIDwhQVRUTElTVCBlcnJvciBtZXNzYWdlIENEQVRBICNSRVFVSVJFRD4KKzwhQVRUTElTVCB3YXJuaW5nIG1lc3NhZ2UgQ0RBVEEgI1JFUVVJUkVEPgogPCFBVFRMSVNUIHByb2JsZW1fc3VtbWFyeSBwcm9ibGVtcyBDREFUQSAjUkVRVUlSRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzICAgQ0RBVEEgI1JFUVVJUkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzIENEQVRBICNSRVFVSVJFRApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9hbnRhZGFwdGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9hbnRhZGFwdGVyL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjZkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2FudGFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFudC5jb21waWxlci5hZGFwdGVyO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4wCitCdW5kbGUtQ2xhc3NQYXRoOiBib2d1cworQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmFudGFkYXB0ZXIsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLAorIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLAorIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYW50YWRhcHRlci9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYW50YWRhcHRlci9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc0NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9hbnRhZGFwdGVyL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwIEVjbGlwc2VTb3VyY2UgSW5jLiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBFY2xpcHNlU291cmNlIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCitwbHVnaW5OYW1lPUpEVCBFQ0ogQW50IENvbXBpbGVyIEFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYW50YWRhcHRlci9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9hbnRhZGFwdGVyL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYjcxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYW50YWRhcHRlci9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDEwIEVjbGlwc2VTb3VyY2UgSW5jLiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisKKyAgICBDb250cmlidXRvcnM6CisgICAgICBFY2xpcHNlU291cmNlIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKzxwbHVnaW4+Cis8ZXh0ZW5zaW9uIAorCXBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiPgorCTxleHRyYUNsYXNzcGF0aEVudHJ5CisJCWxpYnJhcnk9Ii8iPgorCTwvZXh0cmFDbGFzc3BhdGhFbnRyeT4KKzwvZXh0ZW5zaW9uPiAKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYmluYXJ5L01FVEEtSU5GL01BTklGRVNULk1GCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9iaW5hcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMGM1NDg0OS4uMmZkYTg1NgotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYmluYXJ5L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0xLDE2ICsxLDE4IEBACiBNYW5pZmVzdC1WZXJzaW9uOiAxLjAKIE1haW4tQ2xhc3M6IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluCiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBDb21waWxlciBmb3IgSmF2YQorQnVuZGxlLU5hbWU6IEVjbGlwc2UgQ29tcGlsZXIgZm9yIEphdmEoVE0pCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaAotQnVuZGxlLVZlcnNpb246IDMuMy4wCitCdW5kbGUtVmVyc2lvbjogMy43LjAucXVhbGlmaWVyCiBCdW5kbGUtQ2xhc3NQYXRoOiAuCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamR0LmNvcmUsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmFudGFkYXB0ZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXB0LmRpc3BhdGNoO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwdC5tb2RlbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcHQudXRpbDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKQEAgLTIyLDQgKzI0LDUgQEAKICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5kaWFnbm9zZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZQorIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnRvb2w7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9idWlsZC54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2J1aWxkLnhtbAppbmRleCAyZjBmOWI1Li5kNWM1MmJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2J1aWxkLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2J1aWxkLnhtbApAQCAtMSw0ICsxLDE1IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKIDxwcm9qZWN0IG5hbWU9ImV4cG9ydC1leGVjdXRhYmxlIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLiI+CiAKIAk8cHJvcGVydHkgbmFtZT0ib3V0cHV0IiB2YWx1ZT0iYmluIiAvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9idWlsZF9lY2oueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9idWlsZF9lY2oueG1sCmluZGV4IGNkMzhmNGUuLjIwODA3ZGMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYnVpbGRfZWNqLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2J1aWxkX2Vjai54bWwKQEAgLTEsNCArMSwxNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICBDb250cmlidXRvcnM6CisgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIC0tPgorCiA8cHJvamVjdCBuYW1lPSJleHBvcnQtZXhlY3V0YWJsZSIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4iPgogCiAJPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIzLjEuMCIgLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVjai54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lY2oueG1sCmluZGV4IDMxMzUxZTkuLmVlNTA1ODkgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVjai54bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnQtZWNqLnhtbApAQCAtMSwxMyArMSwyMiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIAorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKIDwhLS0gYnVpbGQgc2NyaXB0IHRvIGNyZWF0ZSBhIGJhdGNoIGNvbXBpbGVyIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUgLS0+CiA8cHJvamVjdCBuYW1lPSJFY2xpcHNlIEJhdGNoIENvbXBpbGVyIiBkZWZhdWx0PSJleHBvcnQtYWxsIiBiYXNlZGlyPSIuLiI+CiAJPHRhcmdldCBuYW1lPSJpbml0Ij4KIAkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiB2YWx1ZT0iLi4vLi4vZWNqLWV4cG9ydCIgLz4KIAkJPHByb3BlcnR5IG5hbWU9ImVjai10ZW1wLWZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vZWNqLXRlbXAtZm9sZGVyIiAvPgogCQk8cHJvcGVydHkgbmFtZT0iZWNqLXRlbXAtc3JjLWZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vZWNqLXRlbXAtc3JjLWZvbGRlciIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KIAkJPG1rZGlyIGRpcj0iJHtlY2otdGVtcC1zcmMtZm9sZGVyfSIgLz4KIAkJPG1rZGlyIGRpcj0iJHtlY2otdGVtcC1mb2xkZXJ9Ii8+CiAJPC90YXJnZXQ+CkBAIC0zMyw3ICs0Miw3IEBACiAJCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUphdmFkb2NQYXJzZXIqLmNsYXNzIi8+CiAJCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyKi5jbGFzcyIvPgogCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+CQkKKwkJPC9jb3B5PgogCTwvdGFyZ2V0PgogCiAJPHRhcmdldCBuYW1lPSJleHRyYWN0LV9qc3IxOTkiIGRlcGVuZHM9ImluaXQiPgpAQCAtNDEsNyArNTAsNyBAQAogCQk8ZWNobyBtZXNzYWdlPSJFeHRyYWN0IC5jbGFzcyBmaWxlIGFuZCBwcm9wZXJ0aWVzIGZvciB0aGUganNyMTk5IiAvPgogCQk8Y29weSB0b2Rpcj0iJHtlY2otdGVtcC1mb2xkZXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiPgogCQkJPGZpbGVzZXQgZGlyPSIke3RhcmdldC5mb2xkZXJ9Ii8+Ci0JCTwvY29weT4JCQorCQk8L2NvcHk+CiAJPC90YXJnZXQ+CiAJCiAJPHRhcmdldCBuYW1lPSJleHRyYWN0LV9qc3IyNjkiIGRlcGVuZHM9ImluaXQiPgpAQCAtNTAsMTEgKzU5LDExIEBACiAJCTxlY2hvIG1lc3NhZ2U9IkV4dHJhY3QgLmNsYXNzIGZpbGUgYW5kIHByb3BlcnRpZXMgZm9yIHRoZSBqc3IyNjkiIC8+CiAJCTxjb3B5IHRvZGlyPSIke2Vjai10ZW1wLWZvbGRlcn0iIGZhaWxvbmVycm9yPSJmYWxzZSI+CiAJCQk8ZmlsZXNldCBkaXI9IiR7dGFyZ2V0LmZvbGRlcn0iLz4KLQkJPC9jb3B5PgkJCisJCTwvY29weT4KIAk8L3RhcmdldD4KIAogCTx0YXJnZXQgbmFtZT0iZXh0cmFjdC1hbnQtYWRhcHRlci1jb21waWxlciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQuZm9sZGVyIiB2YWx1ZT0iYW50YmluIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9hbnRiaW4iLz4KIAkJPGVjaG8gbWVzc2FnZT0iRXh0cmFjdCAuY2xhc3MgZmlsZSBhbmQgcHJvcGVydGllcyBmb3IgdGhlIGFudCBhZGFwdGVyIiAvPgogCQk8bWtkaXIgZGlyPSIke2Vjai10ZW1wLWZvbGRlcn0iLz4KIAkJPGNvcHkgdG9kaXI9IiR7ZWNqLXRlbXAtZm9sZGVyfSI+CkBAIC02NSwyMCArNzQsMzMgQEAKIAk8L3RhcmdldD4KIAogCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIGVjai5qYXIiIC8+Ci0JCTxkZWxldGUgZmlsZT0iJHtkZXN0fS9lY2ouamFyIiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KLQkJPHppcCB6aXBmaWxlPSIke2Rlc3R9L2Vjai5qYXIiPgorCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRMYWJlbCIgdmFsdWU9ImhlYWQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiB2YWx1ZT0iLi4vLi4vZWNqLWV4cG9ydCIgLz4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KKwkJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIGVjai0ke2J1aWxkTGFiZWx9LmphciIgLz4KKwkJPGRlbGV0ZSBmaWxlPSIke2Rlc3R9L2Vjai0ke2J1aWxkTGFiZWx9LmphciIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisJCTxjb3B5IHRvZGlyPSIke2Vjai10ZW1wLWZvbGRlcn0iPgorCQkJPGZpbGVzZXQgZGlyPSJzY3JpcHRzL2JpbmFyeSIgLz4KKwkJPC9jb3B5PgorCQk8cmVwbGFjZSBmaWxlPSIke2Vjai10ZW1wLWZvbGRlcn0vTUVUQS1JTkYvTUFOSUZFU1QuTUYiIHRva2VuPSJxdWFsaWZpZXIiIHZhbHVlPSIke2J1aWxkTGFiZWx9Ii8+CisJCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9lY2otJHtidWlsZExhYmVsfS5qYXIiPgogCQkJPGZpbGVzZXQgZGlyPSIke2Vjai10ZW1wLWZvbGRlcn0iPgogCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoiLz4KIAkJCTwvZmlsZXNldD4KIAkJCTxmaWxlc2V0IGRpcj0ic2NyaXB0cyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+CiAJCQkJPGluY2x1ZGUgbmFtZT0iYWJvdXQuaHRtbCIgLz4KIAkJCTwvZmlsZXNldD4KIAkJPC96aXA+Ci0JCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBlY2pzcmMuemlwIiAvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZGVzdH0vZWNqc3JjLnppcCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0JCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9lY2pzcmMuemlwIj4KKworCisJCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBlY2pzcmMtJHtidWlsZExhYmVsfS5qYXIiIC8+CisJCTxkZWxldGUgZmlsZT0iJHtkZXN0fS9lY2pzcmMtJHtidWlsZExhYmVsfS5qYXIiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgorCQk8Y29weSB0b2Rpcj0iJHtlY2otdGVtcC1zcmMtZm9sZGVyfSI+CisJCQk8ZmlsZXNldCBkaXI9InNjcmlwdHMvc291cmNlIiAvPgorCQk8L2NvcHk+CisJCTxyZXBsYWNlIGZpbGU9IiR7ZWNqLXRlbXAtc3JjLWZvbGRlcn0vTUVUQS1JTkYvTUFOSUZFU1QuTUYiIHRva2VuPSJxdWFsaWZpZXIiIHZhbHVlPSIke2J1aWxkTGFiZWx9Ii8+CisJCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9lY2pzcmMtJHtidWlsZExhYmVsfS5qYXIiPgorCQkJPHppcGZpbGVzZXQgZGlyPSJlY2otdGVtcC1zcmMtZm9sZGVyIiAvPgogCQkJPHppcGZpbGVzZXQgZGlyPSJiYXRjaCIgLz4KIAkJCTx6aXBmaWxlc2V0IGRpcj0iY29tcGlsZXIiIC8+CiAJCQk8emlwZmlsZXNldCBkaXI9ImFudGFkYXB0ZXIiPgpAQCAtODYsMTYgKzEwOCwyMyBAQAogCQkJPC96aXBmaWxlc2V0PgogCQkJPHppcGZpbGVzZXQgZGlyPSJzY3JpcHRzIj4KIAkJCQk8aW5jbHVkZSBuYW1lPSJhYm91dC5odG1sIiAvPgotCQkJCTxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgogCQkJCTxpbmNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIgLz4KIAkJCTwvemlwZmlsZXNldD4KIAkJPC96aXA+CisJCTxhbnRjYWxsIHRhcmdldD0iY2xlYW51cCIvPgogCTwvdGFyZ2V0PgotCQorCiAJPHRhcmdldCBuYW1lPSJleHBvcnRfc3JjX2JpbiI+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZExhYmVsIiB2YWx1ZT0iaGVhZCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc3QiIHZhbHVlPSIuLi8uLi9lY2otZXhwb3J0IiAvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgogCQk8ZWNobyBtZXNzYWdlPSJVUERBVEUgZWNqX2FsbC5qYXIiIC8+CiAJCTxkZWxldGUgZmlsZT0iJHtkZXN0fS9lY2pfYWxsLmphciIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CiAJCTxta2RpciBkaXI9IiR7ZWNqLXRlbXAtc3JjLWZvbGRlcn0vc3JjIiAvPgorCQk8Y29weSB0b2Rpcj0iJHtlY2otdGVtcC1mb2xkZXJ9Ij4KKwkJCTxmaWxlc2V0IGRpcj0ic2NyaXB0cy9iaW5hcnkiIC8+CisJCTwvY29weT4KKwkJPHJlcGxhY2UgZmlsZT0iJHtlY2otdGVtcC1mb2xkZXJ9L01FVEEtSU5GL01BTklGRVNULk1GIiB0b2tlbj0icXVhbGlmaWVyIiB2YWx1ZT0iJHtidWlsZExhYmVsfSIvPgogCiAJCTxjb3B5IHRvZGlyPSIke2Vjai10ZW1wLXNyYy1mb2xkZXJ9L3NyYyI+CiAJCQk8ZmlsZXNldCBkaXI9ImJhdGNoIiAvPgpAQCAtMTEwLDE4ICsxMzksMjAgQEAKIAkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qIi8+CiAJCQkJPGluY2x1ZGUgbmFtZT0iYWJvdXQuaHRtbCIvPgogCQkJPC9maWxlc2V0PgotCQkJPGZpbGVzZXQgZGlyPSIke2Vjai10ZW1wLXNyYy1mb2xkZXJ9Ii8+CisJCQk8ZmlsZXNldCBkaXI9IiR7ZWNqLXRlbXAtc3JjLWZvbGRlcn0iPgorCQkJCTxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+CisJCQk8L2ZpbGVzZXQ+CiAJCQk8ZmlsZXNldCBkaXI9InNjcmlwdHMiPgotCQkJCTxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgogCQkJCTxpbmNsdWRlIG5hbWU9ImFib3V0Lmh0bWwiIC8+CiAJCQk8L2ZpbGVzZXQ+CiAJCTwvemlwPgotCQkKKwogCQk8ZGVsZXRlIGRpcj0iJHtlY2otdGVtcC1zcmMtZm9sZGVyfSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CiAJPC90YXJnZXQ+CiAKIAk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgogCQk8ZGVsZXRlIGRpcj0iJHtlY2otdGVtcC1mb2xkZXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KKwkJPGRlbGV0ZSBkaXI9IiR7ZWNqLXRlbXAtc3JjLWZvbGRlcn0iIGZhaWxvbmVycm9yPSJmYWxzZSIvPgogCTwvdGFyZ2V0PgogCiAJPHRhcmdldCBuYW1lPSJleHBvcnQtYWxsIiBkZXBlbmRzPSJpbml0Ij4KQEAgLTEyOSw4ICsxNjAsOCBAQAogCQk8YW50Y2FsbCB0YXJnZXQ9ImV4dHJhY3QtYW50LWFkYXB0ZXItY29tcGlsZXIiLz4KIAkJPGFudGNhbGwgdGFyZ2V0PSJleHRyYWN0LV9qc3IxOTkiLz4KIAkJPGFudGNhbGwgdGFyZ2V0PSJleHRyYWN0LV9qc3IyNjkiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJleHBvcnQiLz4KIAkJPGFudGNhbGwgdGFyZ2V0PSJleHBvcnRfc3JjX2JpbiIvPgorCQk8YW50Y2FsbCB0YXJnZXQ9ImV4cG9ydCIvPgogCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFudXAiLz4KIAk8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYy54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lamF2YWMueG1sCmluZGV4IDA0YzMxOTAuLjIyZTBjY2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYy54bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnQtZWphdmFjLnhtbApAQCAtMSw0ICsxLDE1IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKIDxwcm9qZWN0IG5hbWU9ImV4cG9ydC1leGVjdXRhYmxlIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi4iPgogCiAJPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIzMk00U00iIC8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lamF2YWMyLnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzIueG1sCmluZGV4IDk0MmM2NzcuLjUyY2U5ZDggMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzIueG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzIueG1sCkBAIC0xLDQgKzEsMTUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgQ29udHJpYnV0b3JzOgorICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKwogPHByb2plY3QgbmFtZT0iZXhwb3J0LWV4ZWN1dGFibGUiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+CiAKIAk8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjMyTTQiIC8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lamF2YWMyX2xpbnV4LnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzJfbGludXgueG1sCmluZGV4IGVkNDQyZGMuLjkxZjkzMWQgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzJfbGludXgueG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhYzJfbGludXgueG1sCkBAIC0xLDQgKzEsMTUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgQ29udHJpYnV0b3JzOgorICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKwogPHByb2plY3QgbmFtZT0iZXhwb3J0LWV4ZWN1dGFibGUiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+CiAKIAk8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjMyTTQiIC8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lamF2YWNfbGludXgueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnQtZWphdmFjX2xpbnV4LnhtbAppbmRleCBiYmIxYTg5Li4zZTJjYmJjIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1lamF2YWNfbGludXgueG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0LWVqYXZhY19saW51eC54bWwKQEAgLTEsNCArMSwxNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICBDb250cmlidXRvcnM6CisgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIC0tPgorCiA8cHJvamVjdCBuYW1lPSJleHBvcnQtZXhlY3V0YWJsZSIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KIAogCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0idjYzMmxpbnV4IiAvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCmluZGV4IGQwYWZhZGEuLjgwYmFkNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKQEAgLTEsMTAyICsxLDM3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogCis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgQ29udHJpYnV0b3JzOgorICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKwogPCEtLSBidWlsZCBzY3JpcHQgdG8gY3JlYXRlIGEgcGx1Z2luIGZyb20gJHtwbHVnaW59IC0tPgotPHByb2plY3QgbmFtZT0iJHtwbHVnaW59IiBkZWZhdWx0PSJleHBvcnQgcGx1Zy1pbiBbXzMuMy4yXSIgYmFzZWRpcj0iLi4iPgotCi08dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMy4zLjJdIj4KKzxwcm9qZWN0IG5hbWU9IiR7cGx1Z2lufSIgZGVmYXVsdD0iZXhwb3J0IHBsdWctaW4gW18zLjcuMV0iIGJhc2VkaXI9Ii4uIj4KKzx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18zLjcuMV0iPgogICAgIDx0c3RhbXAvPgogCTxwcm9wZXJ0eSBuYW1lPSJxdWFsaWZpZXIiIHZhbHVlPSJ6JHtEU1RBTVB9LSR7VFNUQU1QfSIgLz4KIAk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+Ci0JCTxwYXJhbSBuYW1lPSJqZHRfY29yZV92ZXJzaW9uIiB2YWx1ZT0iMy4zLjIiLz4KKwkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjcuMSIvPgogCTwvYW50Y2FsbD4KIDwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMy4zLjIucXVhbGlmaWVyXSAod2l0aCBzb3VyY2VzKSI+Ci0gICAgPHRzdGFtcC8+Ci0JPHByb3BlcnR5IG5hbWU9InF1YWxpZmllciIgdmFsdWU9Inoke0RTVEFNUH0tJHtUU1RBTVB9IiAvPgotCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KLQkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjMuMi4ke3F1YWxpZmllcn0iLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLTx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18zLjMuMi5xdWFsaWZpZXJdIChiaW5hcnkgb25seSkiPgorPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzMuNy4xLnF1YWxpZmllcl0gKGJpbmFyeSBvbmx5KSI+CiAgICAgPHRzdGFtcC8+CiAJPHByb3BlcnR5IG5hbWU9InF1YWxpZmllciIgdmFsdWU9Inoke0RTVEFNUH0tJHtUU1RBTVB9IiAvPgogCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0X2JpbmFyeV9vbmx5Ij4KLQkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjMuMi4ke3F1YWxpZmllcn0iLz4KKwkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjcuMS4ke3F1YWxpZmllcn0iLz4KIAk8L2FudGNhbGw+CiA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18zLjMuMV0iPgotCSAgICA8dHN0YW1wLz4KLQkJPHByb3BlcnR5IG5hbWU9InF1YWxpZmllciIgdmFsdWU9Inoke0RTVEFNUH0tJHtUU1RBTVB9IiAvPgotCQk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+Ci0JCQk8cGFyYW0gbmFtZT0iamR0X2NvcmVfdmVyc2lvbiIgdmFsdWU9IjMuMy4xIi8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzMuMy4wXSI+Cis8dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMy43LjEucXVhbGlmaWVyXSAod2l0aCBzb3VyY2VzKSI+CiAgICAgPHRzdGFtcC8+CiAJPHByb3BlcnR5IG5hbWU9InF1YWxpZmllciIgdmFsdWU9Inoke0RTVEFNUH0tJHtUU1RBTVB9IiAvPgogCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KLQkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjMuMCIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMy4yLjFdIj4KLSAgICA8dHN0YW1wLz4KLQk8cHJvcGVydHkgbmFtZT0icXVhbGlmaWVyIiB2YWx1ZT0ieiR7RFNUQU1QfS0ke1RTVEFNUH0iIC8+Ci0JPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCQk8cGFyYW0gbmFtZT0iamR0X2NvcmVfdmVyc2lvbiIgdmFsdWU9IjMuMi4xIi8+Ci0JPC9hbnRjYWxsPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18zLjIuMF0iPgotICAgIDx0c3RhbXAvPgotCTxwcm9wZXJ0eSBuYW1lPSJxdWFsaWZpZXIiIHZhbHVlPSJ6JHtEU1RBTVB9LSR7VFNUQU1QfSIgLz4KLQk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+Ci0JCTxwYXJhbSBuYW1lPSJqZHRfY29yZV92ZXJzaW9uIiB2YWx1ZT0iMy4yLjAiLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzMuMS4wXSI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCQk8cGFyYW0gbmFtZT0iamR0X2NvcmVfdmVyc2lvbiIgdmFsdWU9IjMuMS4wIi8+Ci0JPC9hbnRjYWxsPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18zLjAuMF0iPgotCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KLQkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIzLjAuMCIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMi4xLjFdIj4KLQk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+Ci0JCTxwYXJhbSBuYW1lPSJqZHRfY29yZV92ZXJzaW9uIiB2YWx1ZT0iMi4xLjEiLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzIuMS4wXSI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCQk8cGFyYW0gbmFtZT0iamR0X2NvcmVfdmVyc2lvbiIgdmFsdWU9IjIuMS4wIi8+Ci0JPC9hbnRjYWxsPgotPC90YXJnZXQ+Ci0KLTx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW18yLjAuMV0iPgotCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KLQkJPHBhcmFtIG5hbWU9ImpkdF9jb3JlX3ZlcnNpb24iIHZhbHVlPSIyLjAuMSIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotCi08dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMi4wLjBdIj4KLQk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+Ci0JCTxwYXJhbSBuYW1lPSJqZHRfY29yZV92ZXJzaW9uIiB2YWx1ZT0iMi4wLjAiLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzEuOS4wXSI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCQk8cGFyYW0gbmFtZT0iamR0X2NvcmVfdmVyc2lvbiIgdmFsdWU9IjEuOS4wIi8+CisJCTxwYXJhbSBuYW1lPSJqZHRfY29yZV92ZXJzaW9uIiB2YWx1ZT0iMy43LjEuJHtxdWFsaWZpZXJ9Ii8+CiAJPC9hbnRjYWxsPgogPC90YXJnZXQ+CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvaWt2bV9zY3JpcHQueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9pa3ZtX3NjcmlwdC54bWwKaW5kZXggYjYwNTk0YS4uOTIyYmIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9pa3ZtX3NjcmlwdC54bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9pa3ZtX3NjcmlwdC54bWwKQEAgLTEsNCArMSwxNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICBDb250cmlidXRvcnM6CisgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIC0tPgorCiA8cHJvamVjdCBuYW1lPSJlY2oiIGRlZmF1bHQ9ImFsbCIgYmFzZWRpcj0iLi4iPgogCTwhLS0gdGFyZ2V0IG5hbWU9ImNoZWNrb3V0Ij4KICAgICAgPGV4ZWMgcHJvZ3JhbT0iY3ZzIiBjb21tYW5kbGluZT0iLXozIC1kOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovaG9tZS9lY2xpcHNlIGNvIG9yZy5lY2xpcHNlLmpkdC5jb3JlIiAvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9vbGRleHBvcnRwbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9vbGRleHBvcnRwbHVnaW4ueG1sCmluZGV4IDE2YTE2NDkuLjc5ZmU2N2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvb2xkZXhwb3J0cGx1Z2luLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL29sZGV4cG9ydHBsdWdpbi54bWwKQEAgLTEsNSArMSwxNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIAorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKIDwhLS0gYnVpbGQgc2NyaXB0IHRvIGNyZWF0ZSBhIHBsdWdpbiBmcm9tICR7cGx1Z2lufSAtLT4KIDxwcm9qZWN0IG5hbWU9IiR7cGx1Z2lufSIgZGVmYXVsdD0iZXhwb3J0IHBsdWctaW4gW18zLjEuMF0iIGJhc2VkaXI9Ii4uIj4KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjM0NGUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw3IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBTb3VyY2Ugb2YgRWNsaXBzZSBDb21waWxlciBmb3IgSmF2YShUTSkKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmJhdGNoLnNvdXJjZQorQnVuZGxlLVZlcnNpb246IDMuNy4wLnF1YWxpZmllcgorQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaDt2ZXJzaW9uPSIzLjcuMC5xdWFsaWZpZXIiO3Jvb3RzOj0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvRmllbGREZWNsYXJhdGlvbk1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0ZpZWxkRGVjbGFyYXRpb25NYXRjaC5qYXZhCmluZGV4IDRiODU1NzUuLjdjMGFmOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvRmllbGREZWNsYXJhdGlvbk1hdGNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9GaWVsZERlY2xhcmF0aW9uTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNCArMTksMTQgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGNsYXNzIEZpZWxkRGVjbGFyYXRpb25NYXRjaCBleHRlbmRzIFNlYXJjaE1hdGNoIHsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgZmllbGQgZGVjbGFyYXRpb24gbWF0Y2guCi0JICogCisJICoKIAkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZmllbGQgZGVjbGFyYXRpb24KIAkgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIEFfQUNDVVJBVEUgb3IgQV9JTkFDQ1VSQVRFCiAJICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvRmllbGRSZWZlcmVuY2VNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9GaWVsZFJlZmVyZW5jZU1hdGNoLmphdmEKaW5kZXggOThhNTZhYS4uNjg2OTJiYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9GaWVsZFJlZmVyZW5jZU1hdGNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9GaWVsZFJlZmVyZW5jZU1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNTMgKzE5LDUzIEBACiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KLXB1YmxpYyBjbGFzcyBGaWVsZFJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggeworcHVibGljIGNsYXNzIEZpZWxkUmVmZXJlbmNlTWF0Y2ggZXh0ZW5kcyBSZWZlcmVuY2VNYXRjaCB7CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFkQWNjZXNzOwotCXByaXZhdGUgYm9vbGVhbiBpc1dyaXRlQWNjZXNzOworcHJpdmF0ZSBib29sZWFuIGlzUmVhZEFjY2VzczsKK3ByaXZhdGUgYm9vbGVhbiBpc1dyaXRlQWNjZXNzOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBmaWVsZCByZWZlcmVuY2UgbWF0Y2guCi0JICogCi0JICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBmaWVsZAotCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gaXNSZWFkQWNjZXNzIHdoZXRoZXIgdGhlIG1hdGNoIHJlcHJlc2VudHMgYSByZWFkIGFjY2VzcwotCSAqIEBwYXJhbSBpc1dyaXRlQWNjZXNzIHdoZXRocmUgdGhlIG1hdGNoIHJlcHJlc2VudHMgYSB3cml0ZSBhY2Nlc3MKLQkgKiBAcGFyYW0gaW5zaWRlRG9jQ29tbWVudCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaCBpcyBpbnNpZGUgYSBkb2MKLQkgKiBjb21tZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudCB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGUgbWF0Y2gKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIEZpZWxkUmVmZXJlbmNlTWF0Y2goSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpc1JlYWRBY2Nlc3MsIGJvb2xlYW4gaXNXcml0ZUFjY2VzcywgYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50LCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKLQkJdGhpcy5pc1JlYWRBY2Nlc3MgPSBpc1JlYWRBY2Nlc3M7Ci0JCXRoaXMuaXNXcml0ZUFjY2VzcyA9IGlzV3JpdGVBY2Nlc3M7Ci0JCXNldEluc2lkZURvY0NvbW1lbnQoaW5zaWRlRG9jQ29tbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIGEgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpZWxkLgotCSAqIE5vdGUgdGhhdCBhIGZpZWxkIHJlZmVyZW5jZSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBhdCBvbmNlIGluIGNhc2Ugb2YgY29tcG91bmQgYXNzaWdubWVudHMgKGUuZy4gaSArPSAwOykKLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBhIHJlYWQgYWNjZXNzIHRvIHRoZSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlYWRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzUmVhZEFjY2VzczsKLQl9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZmllbGQgcmVmZXJlbmNlIG1hdGNoLgorICoKKyAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBpbm5lci1tb3N0IGVuY2xvc2luZyBtZW1iZXIgdGhhdCByZWZlcmVuY2VzCisgKiAJCXRoaXMgZmllbGQKKyAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KKyAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gaXNSZWFkQWNjZXNzIHdoZXRoZXIgdGhlIG1hdGNoIHJlcHJlc2VudHMgYSByZWFkIGFjY2VzcworICogQHBhcmFtIGlzV3JpdGVBY2Nlc3Mgd2hldGhlciB0aGUgbWF0Y2ggcmVwcmVzZW50cyBhIHdyaXRlIGFjY2VzcworICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEKKyAqICAgICAgICAgICAgZG9jIGNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCisgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50CisgKi8KK3B1YmxpYyBGaWVsZFJlZmVyZW5jZU1hdGNoKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBpbnQgYWNjdXJhY3ksIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNSZWFkQWNjZXNzLCBib29sZWFuIGlzV3JpdGVBY2Nlc3MsIGJvb2xlYW4gaW5zaWRlRG9jQ29tbWVudCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElSZXNvdXJjZSByZXNvdXJjZSkgeworCXN1cGVyKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgaW5zaWRlRG9jQ29tbWVudCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKKwl0aGlzLmlzUmVhZEFjY2VzcyA9IGlzUmVhZEFjY2VzczsKKwl0aGlzLmlzV3JpdGVBY2Nlc3MgPSBpc1dyaXRlQWNjZXNzOworfQogCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCByZWZlcmVuY2UgaXMgYSB3cml0ZSBhY2Nlc3MgdG8gdGhlIGZpZWxkLgotCSAqIE5vdGUgdGhhdCBhIGZpZWxkIHJlZmVyZW5jZSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBhdCBvbmNlIGluIGNhc2Ugb2YgY29tcG91bmQgYXNzaWdubWVudHMgKGUuZy4gaSArPSAwOykKLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBhIHdyaXRlIGFjY2VzcyB0byB0aGUgZmllbGQuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXcml0ZUFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNXcml0ZUFjY2VzczsKLQl9Ci0JCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIGEgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpZWxkLgorICogTm90ZSB0aGF0IGEgZmllbGQgcmVmZXJlbmNlIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGF0IG9uY2UgaW4gY2FzZSBvZiBjb21wb3VuZCBhc3NpZ25tZW50cyAoZS5nLiBpICs9IDA7KQorICoKKyAqIEByZXR1cm4gd2hldGhlciB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIGEgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpZWxkLgorICovCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlYWRBY2Nlc3MoKSB7CisJcmV0dXJuIHRoaXMuaXNSZWFkQWNjZXNzOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZmllbGQgcmVmZXJlbmNlIGlzIGEgd3JpdGUgYWNjZXNzIHRvIHRoZSBmaWVsZC4KKyAqIE5vdGUgdGhhdCBhIGZpZWxkIHJlZmVyZW5jZSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBhdCBvbmNlIGluIGNhc2Ugb2YgY29tcG91bmQgYXNzaWdubWVudHMgKGUuZy4gaSArPSAwOykKKyAqCisgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBhIHdyaXRlIGFjY2VzcyB0byB0aGUgZmllbGQuCisgKi8KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzV3JpdGVBY2Nlc3MoKSB7CisJcmV0dXJuIHRoaXMuaXNXcml0ZUFjY2VzczsKK30KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhCmluZGV4IDM5MGQ5ZjkuLjJhNzMxZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsOSArMTcsMTAgQEAKICAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBzZWFyY2ggZW5naW5lLgogICogPC9wPgogICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBkZWNsYXJlcyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgorICogVGhpcyBpbnRlcmZhY2UgZGVjbGFyZXMgY29uc3RhbnRzIG9ubHkuCiAgKiA8L3A+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGludGVyZmFjZSBJSmF2YVNlYXJjaENvbnN0YW50cyB7CiAKQEAgLTI4LDc5ICsyOSwxMDIgQEAKIAkgKiBvZiBtYXRjaCBpbiB1bmtub3duLgogCSAqLwogCWludCBVTktOT1dOID0gLTE7Ci0JCisKIAkvKiBOYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudCAqLwotCQorCiAJLyoqCiAJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSB0eXBlLCB3aGljaCBtYXkgaW5jbHVkZSBjbGFzc2VzLCBpbnRlcmZhY2VzLAogCSAqIGVudW1zLCBhbmQgYW5ub3RhdGlvbiB0eXBlcy4KKwkgKgorCSAqIEBjYXRlZ29yeSBzZWFyY2hGb3IKIAkgKi8KIAlpbnQgVFlQRT0gMDsKIAogCS8qKgogCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGEgbWV0aG9kLgorCSAqCisJICogQGNhdGVnb3J5IHNlYXJjaEZvcgogCSAqLwogCWludCBNRVRIT0Q9IDE7CiAKIAkvKioKIAkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhIHBhY2thZ2UuCisJICoKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IFBBQ0tBR0U9IDI7CiAKIAkvKioKIAkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhIGNvbnN0cnVjdG9yLgorCSAqCisJICogQGNhdGVnb3J5IHNlYXJjaEZvcgogCSAqLwogCWludCBDT05TVFJVQ1RPUj0gMzsKIAogCS8qKgogCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGEgZmllbGQuCisJICoKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IEZJRUxEPSA0OwogCiAJLyoqCi0JICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSBjbGFzcy4gCisJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSBjbGFzcy4KIAkgKiBNb3JlIHNlbGVjdGl2ZSB0aGFuIHVzaW5nIHtAbGluayAjVFlQRX0uCisJICoKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IENMQVNTPSA1OwogCiAJLyoqCiAJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYW4gaW50ZXJmYWNlLgogCSAqIE1vcmUgc2VsZWN0aXZlIHRoYW4gdXNpbmcge0BsaW5rICNUWVBFfS4KKwkgKgorCSAqIEBjYXRlZ29yeSBzZWFyY2hGb3IKIAkgKi8KIAlpbnQgSU5URVJGQUNFPSA2OwogCiAJLyoqCiAJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYW4gZW51bS4KIAkgKiBNb3JlIHNlbGVjdGl2ZSB0aGFuIHVzaW5nIHtAbGluayAjVFlQRX0uCisJICoKIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IHNlYXJjaEZvcgogCSAqLwogCWludCBFTlVNPSA3OwogCiAJLyoqCiAJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYW4gYW5ub3RhdGlvbiB0eXBlLgogCSAqIE1vcmUgc2VsZWN0aXZlIHRoYW4gdXNpbmcge0BsaW5rICNUWVBFfS4KKwkgKgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IEFOTk9UQVRJT05fVFlQRT0gODsKIAogCS8qKgogCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGEgY2xhc3Mgb3IgZW51bSB0eXBlLgogCSAqIE1vcmUgc2VsZWN0aXZlIHRoYW4gdXNpbmcge0BsaW5rICNUWVBFfS4KKwkgKgogCSAqIEBzaW5jZSAzLjEKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IENMQVNTX0FORF9FTlVNPSA5OwogCiAJLyoqCiAJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZS4KIAkgKiBNb3JlIHNlbGVjdGl2ZSB0aGFuIHVzaW5nIHtAbGluayAjVFlQRX0uCisJICoKIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IHNlYXJjaEZvcgogCSAqLwogCWludCBDTEFTU19BTkRfSU5URVJGQUNFPSAxMDsKLQkKKwogCS8qKgogCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGFuIGludGVyZmFjZSBvciBhbm5vdGF0aW9uIHR5cGUuCiAJICogTW9yZSBzZWxlY3RpdmUgdGhhbiB1c2luZyB7QGxpbmsgI1RZUEV9LgogCSAqIEBzaW5jZSAzLjMKKwkgKiBAY2F0ZWdvcnkgc2VhcmNoRm9yCiAJICovCiAJaW50IElOVEVSRkFDRV9BTkRfQU5OT1RBVElPTj0gMTE7CiAKQEAgLTExMCwxNSArMTM0LDE5IEBACiAJICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSBkZWNsYXJhdGlvbi4KIAkgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBvZiB0aGUgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzCiAJICogc28gYXMgdG8gYmV0dGVyIG5hcnJvdyBkb3duIHRoZSBzZWFyY2guCisJICoKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbwogCSAqLwogCWludCBERUNMQVJBVElPTlM9IDA7CiAKIAkvKioKLQkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSBvciBleHRlbmRzIGEgY2xhc3MuIAorCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgdHlwZSB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIG9yIGV4dGVuZHMgYSBjbGFzcy4KIAkgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZWl0aGVyIFRZUEUgb3IgQ0xBU1Mgb3IgSU5URVJGQUNFLCBpdCB3aWxsCiAJICogcmVzcGVjdGl2ZWx5IHNlYXJjaCBmb3IgYW55IHR5cGUgaW1wbGVtZW50aW5nL2V4dGVuZGluZyBhIHR5cGUsCiAJICogb3IgcmF0aGVyIGV4Y2x1c2l2ZWx5IHNlYXJjaCBmb3IgY2xhc3NlcyBpbXBsZW1lbnRpbmcvZXh0ZW5kaW5nIHRoZSB0eXBlLCBvcgogCSAqIGludGVyZmFjZXMgZXh0ZW5kaW5nIHRoZSB0eXBlLgorCSAqCisJICogQGNhdGVnb3J5IGxpbWl0VG8KIAkgKi8KIAlpbnQgSU1QTEVNRU5UT1JTPSAxOwogCkBAIC0xMjgsMTQgKzE1NiwxOCBAQAogCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgogCSAqIFJlZmVyZW5jZXMgY2FuIGNvbnRhaW4gaW1wbGVtZW50ZXJzIHNpbmNlIHRoZXkgYXJlIG1vcmUgZ2VuZXJpYyBraW5kCiAJICogb2YgbWF0Y2hlcy4KKwkgKgorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCiAJICovCiAJaW50IFJFRkVSRU5DRVM9IDI7CiAKIAkvKioKLQkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIGRlY2xhcmF0aW9uLCBhIHJlZmVyZW5jZSwgb3IgYW4gaW1wbGVtZW50ZXIgCisJICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSBkZWNsYXJhdGlvbiwgYSByZWZlcmVuY2UsIG9yIGFuIGltcGxlbWVudGVyCiAJICogb2YgYW4gaW50ZXJmYWNlLgogCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKIAkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KKwkgKgorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCiAJICovCiAJaW50IEFMTF9PQ0NVUlJFTkNFUz0gMzsKIApAQCAtMTQzLDc5ICsxNzUsMzQ3IEBACiAJICogV2hlbiBzZWFyY2hpbmcgZm9yIGZpZWxkIG1hdGNoZXMsIGl0IHdpbGwgZXhjbHVzaXZlbHkgZmluZCByZWFkIGFjY2Vzc2VzLCBhcwogCSAqIG9wcG9zZWQgdG8gd3JpdGUgYWNjZXNzZXMuIE5vdGUgdGhhdCBzb21lIGV4cHJlc3Npb25zIGFyZSBjb25zaWRlcmVkIGJvdGgKIAkgKiBhcyBmaWVsZCByZWFkL3dyaXRlIGFjY2Vzc2VzOiBmb3IgZXhhbXBsZSwgeCsrOyB4Kz0gMTsKLQkgKiAKKwkgKgogCSAqIEBzaW5jZSAyLjAKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbwogCSAqLwogCWludCBSRUFEX0FDQ0VTU0VTID0gNDsKLQkKKwogCS8qKgogCSAqIFdoZW4gc2VhcmNoaW5nIGZvciBmaWVsZCBtYXRjaGVzLCBpdCB3aWxsIGV4Y2x1c2l2ZWx5IGZpbmQgd3JpdGUgYWNjZXNzZXMsIGFzCiAJICogb3Bwb3NlZCB0byByZWFkIGFjY2Vzc2VzLiBOb3RlIHRoYXQgc29tZSBleHByZXNzaW9ucyBhcmUgY29uc2lkZXJlZCBib3RoCiAJICogYXMgZmllbGQgcmVhZC93cml0ZSBhY2Nlc3NlczogZm9yIGV4YW1wbGUsICB4Kys7IHgrPSAxOwotCSAqIAorCSAqCiAJICogQHNpbmNlIDIuMAorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCiAJICovCiAJaW50IFdSSVRFX0FDQ0VTU0VTID0gNTsKIAogCS8qKgogCSAqIElnbm9yZSBkZWNsYXJpbmcgdHlwZSB3aGlsZSBzZWFyY2hpbmcgcmVzdWx0LgogCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2YgbWF0Y2guCisJICoKIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IGxpbWl0VG8KIAkgKi8KIAlpbnQgSUdOT1JFX0RFQ0xBUklOR19UWVBFID0gMHgxMDsKIAogCS8qKgogCSAqIElnbm9yZSByZXR1cm4gdHlwZSB3aGlsZSBzZWFyY2hpbmcgcmVzdWx0LgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2YgbWF0Y2guCisJICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb3RoZXIgbmF0dXJlIG9mIG1hdGNoLgogCSAqIE5vdGUgdGhhdDoKIAkgKiA8dWw+CiAJICogCTxsaT5mb3IgZmllbGRzIHNlYXJjaCwgcGF0dGVybiB3aWxsIGlnbm9yZSBmaWVsZCB0eXBlPC9saT4KIAkgKiAJPGxpPnRoaXMgZmxhZyB3aWxsIGhhdmUgbm8gZWZmZWN0IGZvciB0eXBlcyBzZWFyY2g8L2xpPgogCSAqCTwvdWw+CisJICoKIAkgKiBAc2luY2UgMy4xCisJICogQGNhdGVnb3J5IGxpbWl0VG8KIAkgKi8KIAlpbnQgSUdOT1JFX1JFVFVSTl9UWVBFID0gMHgyMDsKLQkKKworCS8qKgorCSAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIHRoZSB0eXBlIG9mIGEgZmllbGQgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBGSUVMRF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSA9IDB4NDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyB0aGUgdHlwZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKwkgKiByZXR1cm5lZC4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgTE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgPSAweDgwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBtZXRob2QgcGFyYW1ldGVyCisJICogZGVjbGFyYXRpb24uCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBQQVJBTUVURVJfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgPSAweDEwMDsKKworCS8qKgorCSAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgc3VwZXIgdHlwZSBvciBhcyBhIHN1cGVyIGludGVyZmFjZS4KKwkgKiA8cD4KKwkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisJICogcmV0dXJuZWQuCisJICo8L3A+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCisJICovCisJaW50IFNVUEVSVFlQRV9UWVBFX1JFRkVSRU5DRSA9IDB4MjAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYSB0aHJvd3MgY2xhdXNlLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKwkgKiByZXR1cm5lZC4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRSA9IDB4NDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYSBjYXN0IGV4cHJlc3Npb24uCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBDQVNUX1RZUEVfUkVGRVJFTkNFID0gMHg4MDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIGNhdGNoIGhlYWRlci4KKwkgKiA8cD4KKwkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG9ubHkge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2hlcyB3aWxsIGJlCisJICogcmV0dXJuZWQuCisJICo8L3A+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCisJICovCisJaW50IENBVENIX1RZUEVfUkVGRVJFTkNFID0gMHgxMDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24uCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPjxwPgorCSAqCUV4YW1wbGU6CisJICo8cHJlPgorCSAqIHB1YmxpYyBjbGFzcyBUZXN0IHsKKwkgKiAJVGVzdCgpIHt9CisJICogCXN0YXRpYyBUZXN0IGJhcigpICB7CisJICogCQlyZXR1cm4gbmV3IDxpPlRlc3Q8L2k+KCk7CisJICogCX0KKwkgKiB9CisJICo8L3ByZT4KKwkgKiBTZWFyY2hpbmcgcmVmZXJlbmNlcyB0byB0aGUgdHlwZSA8Y29kZT5UZXN0PC9jb2RlPiB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCisJICogYWJvdmUgc25pcHBldCB3aWxsIG1hdGNoIG9ubHkgdGhlIHJlZmVyZW5jZSBpbiBpdGFsaWMuCisJICogPC9wPjxwPgorCSAqIE5vdGUgdGhhdCBhcnJheSBjcmVhdGlvbnMgYXJlIG5vdCByZXR1cm5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZy4KKwkgKiA8L3A+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCisJICovCisJaW50IENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFID0gMHgyMDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSBtZXRob2QgcmV0dXJuIHR5cGUuCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBSRVRVUk5fVFlQRV9SRUZFUkVOQ0UgPSAweDQwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhbiBpbXBvcnQgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBJTVBPUlRfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgPSAweDgwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhbiBhbm5vdGF0aW9uLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKwkgKiByZXR1cm5lZC4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSA9IDB4MTAwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgYXJndW1lbnQgaW4gYSBwYXJhbWV0ZXJpemVkCisJICogdHlwZSBvciBhIHBhcmFtZXRlcml6ZWQgbWV0aG9kLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKwkgKiByZXR1cm5lZC4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSA9IDB4MjAwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgdmFyaWFibGUgYm91bmQuCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBUWVBFX1ZBUklBQkxFX0JPVU5EX1RZUEVfUkVGRVJFTkNFID0gMHg0MDAwMDsKKworCS8qKgorCSAqIFJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgd2lsZGNhcmQgYm91bmQuCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBvbmx5IHtAbGluayBUeXBlUmVmZXJlbmNlTWF0Y2h9IG1hdGNoZXMgd2lsbCBiZQorCSAqIHJldHVybmVkLgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBXSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSA9IDB4ODAwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgb2YgYW4gPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4KKwkgKiBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgb25seSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaGVzIHdpbGwgYmUKKwkgKiByZXR1cm5lZC4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgSU5TVEFOQ0VPRl9UWVBFX1JFRkVSRU5DRSA9IDB4MTAwMDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgc3VwZXIgZmllbGQgYWNjZXNzZXMgb3Igc3VwZXIgbWV0aG9kIGludm9jYXRpb25zIChlLmcuIHVzaW5nIHRoZQorCSAqIDxjb2RlPnN1cGVyPC9jb2RlPiBxdWFsaWZpZXIpLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGtpbmQgb2YgcmV0dXJuZWQgbWF0Y2hlcyB3aWxsIGRlcGVuZCBvbiB0aGUKKwkgKiBzcGVjaWZpZWQgbmF0dXJlIG9mIHRoZSBzZWFyY2hlZCBlbGVtZW50OgorCSAqIDx1bD4KKwkgKiAJPGxpPmZvciB0aGUge0BsaW5rICNGSUVMRH0gbmF0dXJlLCBvbmx5IHtAbGluayBGaWVsZFJlZmVyZW5jZU1hdGNofQorCSAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLDwvbGk+CisJICogCTxsaT5mb3IgdGhlIHtAbGluayAjTUVUSE9EfSBuYXR1cmUsIG9ubHkge0BsaW5rIE1ldGhvZFJlZmVyZW5jZU1hdGNofQorCSAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLjwvbGk+CisJICogPC91bD4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgU1VQRVJfUkVGRVJFTkNFID0gMHgxMDAwMDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgcXVhbGlmaWVkIGZpZWxkIGFjY2Vzc2VzIG9yIHF1YWxpZmllZCBtZXRob2QgaW52b2NhdGlvbnMuCisJICogPHA+CisJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUga2luZCBvZiByZXR1cm5lZCBtYXRjaGVzIHdpbGwgZGVwZW5kIG9uIHRoZQorCSAqIHNwZWNpZmllZCBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnQ6CisJICogPHVsPgorCSAqIAk8bGk+Zm9yIHRoZSB7QGxpbmsgI0ZJRUxEfSBuYXR1cmUsIG9ubHkge0BsaW5rIEZpZWxkUmVmZXJlbmNlTWF0Y2h9CisJICogCQltYXRjaGVzIHdpbGwgYmUgcmV0dXJuZWQsPC9saT4KKwkgKiAJPGxpPmZvciB0aGUge0BsaW5rICNNRVRIT0R9IG5hdHVyZSwgb25seSB7QGxpbmsgTWV0aG9kUmVmZXJlbmNlTWF0Y2h9CisJICogCQltYXRjaGVzIHdpbGwgYmUgcmV0dXJuZWQuPC9saT4KKwkgKiA8L3VsPgorCSAqPC9wPgorCSAqIEBzaW5jZSAzLjQKKwkgKiBAY2F0ZWdvcnkgbGltaXRUbworCSAqLworCWludCBRVUFMSUZJRURfUkVGRVJFTkNFID0gMHgyMDAwMDAwOworCisJLyoqCisJICogUmV0dXJuIG9ubHkgcHJpbWFyeSBmaWVsZCBhY2Nlc3NlcyBvciBwcmltYXJ5IG1ldGhvZCBpbnZvY2F0aW9ucyAoZS5nLiB1c2luZworCSAqIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBxdWFsaWZpZXIpLgorCSAqIDxwPgorCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGtpbmQgb2YgcmV0dXJuZWQgbWF0Y2hlcyB3aWxsIGRlcGVuZCBvbiB0aGUKKwkgKiBzcGVjaWZpZWQgbmF0dXJlIG9mIHRoZSBzZWFyY2hlZCBlbGVtZW50OgorCSAqIDx1bD4KKwkgKiAJPGxpPmZvciB0aGUge0BsaW5rICNGSUVMRH0gbmF0dXJlLCBvbmx5IHtAbGluayBGaWVsZFJlZmVyZW5jZU1hdGNofQorCSAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLDwvbGk+CisJICogCTxsaT5mb3IgdGhlIHtAbGluayAjTUVUSE9EfSBuYXR1cmUsIG9ubHkge0BsaW5rIE1ldGhvZFJlZmVyZW5jZU1hdGNofQorCSAqIAkJbWF0Y2hlcyB3aWxsIGJlIHJldHVybmVkLjwvbGk+CisJICogPC91bD4KKwkgKjwvcD4KKwkgKiBAc2luY2UgMy40CisJICogQGNhdGVnb3J5IGxpbWl0VG8KKwkgKi8KKwlpbnQgVEhJU19SRUZFUkVOQ0UgPSAweDQwMDAwMDA7CisKKwkvKioKKwkgKiBSZXR1cm4gb25seSBmaWVsZCBhY2Nlc3NlcyBvciBtZXRob2QgaW52b2NhdGlvbnMgd2l0aG91dCBhbnkgcXVhbGlmaWNhdGlvbi4KKwkgKiA8cD4KKwkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBraW5kIG9mIHJldHVybmVkIG1hdGNoZXMgd2lsbCBkZXBlbmQgb24gdGhlCisJICogc3BlY2lmaWVkIG5hdHVyZSBvZiB0aGUgc2VhcmNoZWQgZWxlbWVudDoKKwkgKiA8dWw+CisJICogCTxsaT5mb3IgdGhlIHtAbGluayAjRklFTER9IG5hdHVyZSwgb25seSB7QGxpbmsgRmllbGRSZWZlcmVuY2VNYXRjaH0KKwkgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZCw8L2xpPgorCSAqIAk8bGk+Zm9yIHRoZSB7QGxpbmsgI01FVEhPRH0gbmF0dXJlLCBvbmx5IHtAbGluayBNZXRob2RSZWZlcmVuY2VNYXRjaH0KKwkgKiAJCW1hdGNoZXMgd2lsbCBiZSByZXR1cm5lZC48L2xpPgorCSAqIDwvdWw+CisJICo8L3A+CisJICogQHNpbmNlIDMuNAorCSAqIEBjYXRlZ29yeSBsaW1pdFRvCisJICovCisJaW50IElNUExJQ0lUX1RISVNfUkVGRVJFTkNFID0gMHg4MDAwMDAwOworCiAJLyogU3ludGFjdGljIG1hdGNoIG1vZGVzICovCi0JCisKIAkvKioKIAkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyBleGFjdGx5IHRoZSBzZWFyY2ggcmVzdWx0LAogCSAqIHRoYXQgaXMsIHRoZSBzb3VyY2Ugb2YgdGhlIHNlYXJjaCByZXN1bHQgZXF1YWxzIHRoZSBzZWFyY2ggcGF0dGVybi4KKwkgKgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpbnN0ZWFkLgorCSAqIEBjYXRlZ29yeSBtYXRjaFJ1bGUKIAkgKi8KIAlpbnQgRVhBQ1RfTUFUQ0ggPSAwOwogCS8qKgogCSAqIFRoZSBzZWFyY2ggcGF0dGVybiBpcyBhIHByZWZpeCBvZiB0aGUgc2VhcmNoIHJlc3VsdC4KKwkgKgogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaW5zdGVhZC4KKwkgKiBAY2F0ZWdvcnkgbWF0Y2hSdWxlCiAJICovCiAJaW50IFBSRUZJWF9NQVRDSCA9IDE7CiAJLyoqCi0JICogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIG9uZSBvciBtb3JlIHdpbGQgY2FyZHMgKCcqJykgd2hlcmUgYSAKKwkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonKSB3aGVyZSBhCiAJICogd2lsZC1jYXJkIGNhbiByZXBsYWNlIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUEFUVEVSTl9NQVRDSH0gaW5zdGVhZC4KKwkgKiBAY2F0ZWdvcnkgbWF0Y2hSdWxlCiAJICovCiAJaW50IFBBVFRFUk5fTUFUQ0ggPSAyOwogCiAKIAkvKiBDYXNlIHNlbnNpdGl2aXR5ICovCi0JCisKIAkvKioKIAkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5CiAJICogaWYgY2FzZXMgYXJlIHRoZSBzYW1lLgorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBtZXRob2RzIHRoYXQgdGFrZSB0aGUgbWF0Y2hNb2RlCiAJICogICB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGFzIGEgbWF0Y2hSdWxlIGluc3RlYWQuCisJICogQGNhdGVnb3J5IG1hdGNoUnVsZQogCSAqLwogCWJvb2xlYW4gQ0FTRV9TRU5TSVRJVkUgPSB0cnVlOwogCS8qKgogCSAqIFRoZSBzZWFyY2ggcGF0dGVybiBpZ25vcmVzIGNhc2VzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgorCSAqCiAJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBtZXRob2RzIHRoYXQgdGFrZSB0aGUgbWF0Y2hNb2RlCiAJICogICB3aXRob3V0IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGFzIGEgbWF0Y2hSdWxlIGluc3RlYWQuCisJICogQGNhdGVnb3J5IG1hdGNoUnVsZQogCSAqLwogCWJvb2xlYW4gQ0FTRV9JTlNFTlNJVElWRSA9IGZhbHNlOwotCQorCiAKIAkvKiBXYWl0aW5nIHBvbGljaWVzICovCi0JCisKIAkvKioKIAkgKiBUaGUgc2VhcmNoIG9wZXJhdGlvbiBzdGFydHMgaW1tZWRpYXRlbHksIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgaW5kZXhlcgogCSAqIGhhcyBub3QgZmluaXNoZWQgaW5kZXhpbmcgdGhlIHdvcmtzcGFjZS4gUmVzdWx0cyB3aWxsIG1vcmUgbGlrZWx5CkBAIC0yMjgsMTAgKzUyOCwxMCBAQAogCSAqLwogCWludCBDQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSCA9IElKb2IuQ2FuY2VsSWZOb3RSZWFkeTsKIAkvKioKLQkgKiBUaGUgc2VhcmNoIG9wZXJhdGlvbiB3YWl0cyBmb3IgdGhlIHVuZGVybHlpbmcgaW5kZXhlciB0byBmaW5pc2ggaW5kZXhpbmcgCisJICogVGhlIHNlYXJjaCBvcGVyYXRpb24gd2FpdHMgZm9yIHRoZSB1bmRlcmx5aW5nIGluZGV4ZXIgdG8gZmluaXNoIGluZGV4aW5nCiAJICogdGhlIHdvcmtzcGFjZSBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlYXJjaC4KIAkgKi8KIAlpbnQgV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0ggPSBJSm9iLldhaXRVbnRpbFJlYWR5OwotCQotCQorCisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQppbmRleCA2ZDg1MDdmLi5lMDM4ZWM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDEwICsyOCwxMCBAQAogICogY2FzZSBjYW4gb2NjdXIgd2hlbiBhIHByb2JsZW0gcHJldmVudGVkIHRoZSA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IGZyb20gcmVzb2x2aW5nIHRoZSBtYXRjaC4KICAqIDwvcD4KICAqIDxwPgotICogVGhlIG9yZGVyIG9mIHRoZSByZXN1bHRzIGlzIHVuc3BlY2lmaWVkLiBDbGllbnRzIG11c3Qgbm90IHJlbHkgb24gdGhpcyBvcmRlciB0byBkaXNwbGF5IHJlc3VsdHMsIAorICogVGhlIG9yZGVyIG9mIHRoZSByZXN1bHRzIGlzIHVuc3BlY2lmaWVkLiBDbGllbnRzIG11c3Qgbm90IHJlbHkgb24gdGhpcyBvcmRlciB0byBkaXNwbGF5IHJlc3VsdHMsCiAgKiBidXQgdGhleSBzaG91bGQgc29ydCB0aGVzZSByZXN1bHRzIChmb3IgZXhhbXBsZSwgaW4gc3ludGFjdGljYWwgb3JkZXIpLgogICogPHA+Ci0gKiBUaGUgPGNvZGU+SUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I8L2NvZGU+IGlzIGFsc28gdXNlZCB0byBwcm92aWRlIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0aGUgCisgKiBUaGUgPGNvZGU+SUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I8L2NvZGU+IGlzIGFsc28gdXNlZCB0byBwcm92aWRlIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0aGUKICAqIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4uCiAgKiA8L3A+CiAgKiA8cD4KQEAgLTQ1LDcgKzQ1LDcgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewogCS8qKgogCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHNlYXJjaCBwYXR0ZXJuLgotCSAqIAorCSAqCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTZWFyY2hNYXRjaCNBX0FDQ1VSQVRFfSBpbnN0ZWFkLgogCSAqLwogCWludCBFWEFDVF9NQVRDSCA9IDA7CkBAIC01NCwxNCArNTQsMTQgQEAKIAkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBwb3RlbnRpYWxseSBhIG1hdGNoIGZvciB0aGUgc2VhcmNoIHBhdHRlcm4sCiAJICogYnV0IGEgcHJvYmxlbSBwcmV2ZW50ZWQgdGhlIHNlYXJjaCBlbmdpbmUgZnJvbSBiZWluZyBtb3JlIGFjY3VyYXRlCiAJICogKHR5cGljYWxseSBiZWNhdXNlIG9mIHRoZSBjbGFzc3BhdGggd2FzIG5vdCBjb3JyZWN0bHkgc2V0KS4KLQkgKiAKKwkgKgogICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU2VhcmNoTWF0Y2gjQV9JTkFDQ1VSQVRFfSBpbnN0ZWFkLgogCSAqLwogCSBpbnQgUE9URU5USUFMX01BVENIID0gMTsKIAogLyoqCiAgKiBDYWxsZWQgYmVmb3JlIHRoZSBhY3R1YWwgc2VhcmNoIHN0YXJ0cy4KLSAqIAorICoKICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBTZWFyY2hSZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKX0uCiAgKi8KIHB1YmxpYyB2b2lkIGFib3V0VG9TdGFydCgpOwpAQCAtNzEsNyArNzEsNyBAQAogICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBpbiB3aGljaCB0aGUgbWF0Y2ggaGFzIGJlZW4gZm91bmQKICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG1hdGNoLCAtMSBpZiBpdCBpcyB1bmtub3duCiAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIG1hdGNoLCAtMSBpZiBpdCBpcyB1bmtub3duOwotICogIHRoZSBlbmRpbmcgb2Zmc2V0IGlzIGV4Y2x1c2l2ZSwgbWVhbmluZyB0aGF0IHRoZSBhY3R1YWwgcmFuZ2Ugb2YgY2hhcmFjdGVycyAKKyAqICB0aGUgZW5kaW5nIG9mZnNldCBpcyBleGNsdXNpdmUsIG1lYW5pbmcgdGhhdCB0aGUgYWN0dWFsIHJhbmdlIG9mIGNoYXJhY3RlcnMKICAqICBjb3ZlcmVkIGlzIDxjb2RlPltzdGFydCwgZW5kXTwvY29kZT4KICAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBKYXZhIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgY2hhcmFjdGVyIHJhbmdlCiAgKgk8Y29kZT5bc3RhcnQsIGVuZF08L2NvZGU+OyB0aGUgdmFsdWUgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdApAQCAtOTAsNyArOTAsNyBAQAogCXRocm93cyBDb3JlRXhjZXB0aW9uOwogLyoqCiAgKiBDYWxsZWQgd2hlbiB0aGUgc2VhcmNoIGhhcyBlbmRlZC4KLSAqIAorICoKICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBTZWFyY2hSZXF1ZXN0b3IjZW5kUmVwb3J0aW5nKCl9LgogICovCiBwdWJsaWMgdm9pZCBkb25lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCmluZGV4IDdiMjM1NmEuLjcwYTY0OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTUzLDkgKzUzLDkgQEAKICAqCiAgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIGlmIHRoZSByZXNvdXJjZSBpcyBjb250YWluZWQgaW4KICAqIGEgSkFSIGZpbGUsIHRoZSBwYXRoIGlzIGNvbXBvc2VkIG9mIDIgcGF0aHMgc2VwYXJhdGVkCi0gKiBieSA8Y29kZT5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIAorICogYnkgPGNvZGU+SkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SPC9jb2RlPjogdGhlIGZpcnN0IHBhdGggaXMgdGhlIGZ1bGwgT1MgcGF0aAogICogdG8gdGhlIEpBUiAoaWYgaXQgaXMgYW4gZXh0ZXJuYWwgSkFSKSwgb3IgdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSA8Y29kZT5JUGF0aDwvY29kZT4KLSAqIHRvIHRoZSBKQVIgKGlmIGl0IGlzIGFuIGludGVybmFsIEpBUiksIAorICogdG8gdGhlIEpBUiAoaWYgaXQgaXMgYW4gaW50ZXJuYWwgSkFSKSwKICAqIHRoZSBzZWNvbmQgcGF0aCBpcyB0aGUgcGF0aCB0byB0aGUgcmVzb3VyY2UgaW5zaWRlIHRoZSBKQVIuCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGVuY2xvc2VkIGJ5IHRoaXMgc2NvcGUKICAqLwpAQCAtODMsMTQgKzgzLDE0IEBACiAgKiAgICAgICAgRm9yIGV4YW1wbGUsIGQ6XGxpYnNcbXlsaWIuamFyCiAgKiA8L2xpPgogICogPC91bD4KLSAqIAorICoKICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcGF0aHMgdG8gdGhlIGVuY2xvc2luZyBwcm9qZWN0cyBhbmQgSkFSUy4KICAqLwogSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgY29udGFpbnMgYW55IDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgKGVpdGhlcgogICogaW4gZm9sZGVycyBvciB3aXRoaW4gSkFScykuCi0gKiAKKyAqCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBzY29wZSBjb250YWlucyBhbnkgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcwogICogQGRlcHJlY2F0ZWQgVXNlCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZSNjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pfQpAQCAtOTgsOSArOTgsOSBAQAogICovCiBib29sZWFuIGluY2x1ZGVzQmluYXJpZXMoKTsKIC8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocyBkZWZpbmVkIGJ5IAorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocyBkZWZpbmVkIGJ5CiAgKiB0aGUgcHJvamVjdHMgb2YgdGhlIHJlc291cmNlcyBvZiB0aGlzIHNlYXJjaCBzY29wZS4KLSAqIAorICoKICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIGNsYXNzcGF0aHMKICAqIEBkZXByZWNhdGVkIFVzZQogICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKX0KQEAgLTExMCw3ICsxMTAsNyBAQAogLyoqCiAgKiBTZXRzIHdoZXRoZXIgdGhpcyBzY29wZSBjb250YWlucyBhbnkgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyAoZWl0aGVyCiAgKiBpbiBmb2xkZXJzIG9yIHdpdGhpbiBKQVJzKS4KLSAqIAorICoKICAqIEBwYXJhbSBpbmNsdWRlc0JpbmFyaWVzIHdoZXRoZXIgdGhpcyBzY29wZSBjb250YWlucyBhbnkgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcwogICogQGRlcHJlY2F0ZWQgVXNlCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZSNjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pfQpAQCAtMTE4LDkgKzExOCw5IEBACiAgKi8KIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKTsKIC8qKgotICogU2V0cyB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgdGhlIGNsYXNzcGF0aHMgZGVmaW5lZCBieSAKKyAqIFNldHMgd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIHRoZSBjbGFzc3BhdGhzIGRlZmluZWQgYnkKICAqIHRoZSBwcm9qZWN0cyBvZiB0aGUgcmVzb3VyY2VzIG9mIHRoaXMgc2VhcmNoIHNjb3BlLgotICogCisgKgogICogQHBhcmFtIGluY2x1ZGVzQ2xhc3NwYXRocyB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocwogICogQGRlcHJlY2F0ZWQgVXNlCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZSNjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JVHlwZU5hbWVSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVR5cGVOYW1lUmVxdWVzdG9yLmphdmEKaW5kZXggYjQxMGZlMi4uNTZkNWE2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI2LDcgKzI2LDcgQEAKICAqCiAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIGRvdC1zZXBhcmF0ZWQgbmFtZSBvZiB0aGUgcGFja2FnZSBvZiB0aGUgY2xhc3MKICAqIEBwYXJhbSBzaW1wbGVUeXBlTmFtZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGNsYXNzCi0gKiBAcGFyYW0gZW5jbG9zaW5nVHlwZU5hbWVzIGlmIHRoZSBjbGFzcyBpcyBhIG1lbWJlciB0eXBlLCAKKyAqIEBwYXJhbSBlbmNsb3NpbmdUeXBlTmFtZXMgaWYgdGhlIGNsYXNzIGlzIGEgbWVtYmVyIHR5cGUsCiAgKiAgICAgICAgICB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBlbmNsb3NpbmcgdHlwZXMgZnJvbSB0aGUgb3V0ZXItbW9zdCB0byB0aGUKICAqICAgICAgICAgIGRpcmVjdCBwYXJlbnQgb2YgdGhlIGNsYXNzIChmb3IgZXhhbXBsZSwgaWYgdGhlIGNsYXNzIGlzIHgueS5BJEIkQyB0aGVuCiAgKiAgICAgICAgICB0aGUgZW5jbG9zaW5nIHR5cGVzIGFyZSBbQSwgQl0uIFRoaXMgaXMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNsYXNzCkBAIC0zNCw5ICszNCw5IEBACiAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSByZXNvdXJjZSBjb250YWluaW5nIHRoZSBjbGFzcy4gSWYgdGhlIHJlc291cmNlIGlzIGEgLmNsYXNzIGZpbGUKICAqICAgICAgICAgIG9yIGEgc291cmNlIGZpbGUsIHRoaXMgaXMgdGhlIGZ1bGwgcGF0aCBpbiB0aGUgd29ya3NwYWNlIHRvIHRoaXMgcmVzb3VyY2UuIElmIHRoZQogICogICAgICAgICAgcmVzb3VyY2UgaXMgYW4gYXJjaGl2ZSAodGhhdCBpcywgYSAuemlwIG9yIC5qYXIgZmlsZSksIHRoZSBwYXRoIGlzIGNvbXBvc2VkIG9mIDIgcGF0aHMgc2VwYXJhdGVkCi0gKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OiAKLSAqCQkJIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBmdWxsIE9TIHBhdGggdG8gdGhlIGFyY2hpdmUgKGlmIGl0IGlzIGFuIGV4dGVybmFsIGFyY2hpdmUpLCAKLSAqCQkJIG9yIHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgPGNvZGU+SVBhdGg8L2NvZGU+IHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBpbnRlcm5hbCBhcmNoaXZlKSwgCisgKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OgorICoJCQkgdGhlIGZpcnN0IHBhdGggaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gZXh0ZXJuYWwgYXJjaGl2ZSksCisgKgkJCSBvciB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIDxjb2RlPklQYXRoPC9jb2RlPiB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gaW50ZXJuYWwgYXJjaGl2ZSksCiAgKiAJCSB0aGUgc2Vjb25kIHBhdGggaXMgdGhlIHBhdGggdG8gdGhlIHJlc291cmNlIGluc2lkZSB0aGUgYXJjaGl2ZS4KICAqLwogdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCk7CkBAIC00NSw3ICs0NSw3IEBACiAgKgogICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIGludGVyZmFjZQogICogQHBhcmFtIHNpbXBsZVR5cGVOYW1lIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gKiBAcGFyYW0gZW5jbG9zaW5nVHlwZU5hbWVzIGlmIHRoZSBpbnRlcmZhY2UgaXMgYSBtZW1iZXIgdHlwZSwgCisgKiBAcGFyYW0gZW5jbG9zaW5nVHlwZU5hbWVzIGlmIHRoZSBpbnRlcmZhY2UgaXMgYSBtZW1iZXIgdHlwZSwKICAqICAgICAgICAgIHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIGVuY2xvc2luZyB0eXBlcyBmcm9tIHRoZSBvdXRlci1tb3N0IHRvIHRoZQogICogICAgICAgICAgZGlyZWN0IHBhcmVudCBvZiB0aGUgaW50ZXJmYWNlIChmb3IgZXhhbXBsZSwgaWYgdGhlIGludGVyZmFjZSBpcyB4LnkuQSRCJEkgdGhlbgogICogICAgICAgICAgdGhlIGVuY2xvc2luZyB0eXBlcyBhcmUgW0EsIEJdLiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBpbnRlcmZhY2UKQEAgLTUzLDkgKzUzLDkgQEAKICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZS4gSWYgdGhlIHJlc291cmNlIGlzIGEgLmNsYXNzIGZpbGUKICAqICAgICAgICAgIG9yIGEgc291cmNlIGZpbGUsIHRoaXMgaXMgdGhlIGZ1bGwgcGF0aCBpbiB0aGUgd29ya3NwYWNlIHRvIHRoaXMgcmVzb3VyY2UuIElmIHRoZQogICogICAgICAgICAgcmVzb3VyY2UgaXMgYW4gYXJjaGl2ZSAodGhhdCBpcywgYSAuemlwIG9yIC5qYXIgZmlsZSksIHRoZSBwYXRoIGlzIGNvbXBvc2VkIG9mIDIgcGF0aHMgc2VwYXJhdGVkCi0gKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OiAKLSAqCQkJIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBmdWxsIE9TIHBhdGggdG8gdGhlIGFyY2hpdmUgKGlmIGl0IGlzIGFuIGV4dGVybmFsIGFyY2hpdmUpLCAKLSAqCQkJIG9yIHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgPGNvZGU+SVBhdGg8L2NvZGU+IHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBpbnRlcm5hbCBhcmNoaXZlKSwgCisgKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OgorICoJCQkgdGhlIGZpcnN0IHBhdGggaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gZXh0ZXJuYWwgYXJjaGl2ZSksCisgKgkJCSBvciB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIDxjb2RlPklQYXRoPC9jb2RlPiB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gaW50ZXJuYWwgYXJjaGl2ZSksCiAgKiAJCSB0aGUgc2Vjb25kIHBhdGggaXMgdGhlIHBhdGggdG8gdGhlIHJlc291cmNlIGluc2lkZSB0aGUgYXJjaGl2ZS4KICAqICovCiB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbk1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbk1hdGNoLmphdmEKaW5kZXggZjc3N2VhOC4uMTMxNWNmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25NYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNCArMTksMTQgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbk1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggewogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbgogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2YgQV9BQ0NVUkFURSBvciBBX0lOQUNDVVJBVEUKIAkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9Mb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTG9jYWxWYXJpYWJsZVJlZmVyZW5jZU1hdGNoLmphdmEKaW5kZXggMWFjM2ZkYS4uMWYxY2M3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9Mb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0xvY2FsVmFyaWFibGVSZWZlcmVuY2VNYXRjaC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDcgKzE5LDcgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVSZWZlcmVuY2VNYXRjaCBleHRlbmRzIFNlYXJjaE1hdGNoIHsKQEAgLTI5LDcgKzI5LDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgbG9jYWwgdmFyaWFibGUgcmVmZXJlbmNlIG1hdGNoLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBsb2NhbCB2YXJpYWJsZQogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KIAkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgpAQCAtNTEsNyArNTEsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGUgbG9jYWwgdmFyaWFibGUgcmVmZXJlbmNlIGlzIGEgcmVhZCBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlLgogCSAqIE5vdGUgdGhhdCBhIGxvY2FsIHZhcmlhYmxlIHJlZmVyZW5jZSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBhdCBvbmNlIGluIGNhc2Ugb2YgY29tcG91bmQgYXNzaWdubWVudHMgKGUuZy4gaSArPSAwOykKLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbG9jYWwgdmFyaWFibGUgcmVmZXJlbmNlIGlzIGEgcmVhZCBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlLgogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVhZEFjY2VzcygpIHsKQEAgLTYxLDcgKzYxLDcgQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvY2FsIHZhcmlhYmxlIHJlZmVyZW5jZSBpcyBhIHdyaXRlIGFjY2VzcyB0byB0aGUgdmFyaWFibGUuCiAJICogTm90ZSB0aGF0IGEgbG9jYWwgdmFyaWFibGUgcmVmZXJlbmNlIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGF0IG9uY2UgaW4gY2FzZSBvZiBjb21wb3VuZCBhc3NpZ25tZW50cyAoZS5nLiBpICs9IDA7KQotCSAqIAorCSAqCiAJICogQHJldHVybiB3aGV0aGVyIHRoZSBsb2NhbCB2YXJpYWJsZSByZWZlcmVuY2UgaXMgYSB3cml0ZSBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlLgogCSAqLwogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV3JpdGVBY2Nlc3MoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL01ldGhvZERlY2xhcmF0aW9uTWF0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTWV0aG9kRGVjbGFyYXRpb25NYXRjaC5qYXZhCmluZGV4IDZmMjZkODMuLmM2MWY4M2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTWV0aG9kRGVjbGFyYXRpb25NYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTWV0aG9kRGVjbGFyYXRpb25NYXRjaC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDE0ICsxOSwxNCBAQAogICogPHA+CiAgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb25NYXRjaCBleHRlbmRzIFNlYXJjaE1hdGNoIHsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGRlY2xhcmF0aW9uIG1hdGNoLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbgogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2YgQV9BQ0NVUkFURSBvciBBX0lOQUNDVVJBVEUKIAkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9NZXRob2RSZWZlcmVuY2VNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9NZXRob2RSZWZlcmVuY2VNYXRjaC5qYXZhCmluZGV4IDkxN2ZiODcuLmFjYjUzMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvTWV0aG9kUmVmZXJlbmNlTWF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL01ldGhvZFJlZmVyZW5jZU1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMTExICsxOSwxMTAgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggeworcHVibGljIGNsYXNzIE1ldGhvZFJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgUmVmZXJlbmNlTWF0Y2ggewogCXByaXZhdGUgYm9vbGVhbiBjb25zdHJ1Y3RvcjsKIAlwcml2YXRlIGJvb2xlYW4gc3ludGhldGljOwogCXByaXZhdGUgYm9vbGVhbiBzdXBlckludm9jYXRpb247CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCByZWZlcmVuY2UgbWF0Y2guCi0JICogCi0JICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QKLQkgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIHtAbGluayAjQV9BQ0NVUkFURX0gb3Ige0BsaW5rICNBX0lOQUNDVVJBVEV9Ci0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCi0JICogY29tbWVudCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RSZWZlcmVuY2VNYXRjaChJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgaW50IGFjY3VyYWN5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGluc2lkZURvY0NvbW1lbnQsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwotCQlzZXRJbnNpZGVEb2NDb21tZW50KGluc2lkZURvY0NvbW1lbnQpOwotCX0KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgcmVmZXJlbmNlIG1hdGNoLgorICoKKyAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBpbm5lci1tb3N0IGVuY2xvc2luZyBtZW1iZXIgdGhhdCByZWZlcmVuY2VzIHRoaXMgbWV0aG9kCisgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIHtAbGluayAjQV9BQ0NVUkFURX0gb3Ige0BsaW5rICNBX0lOQUNDVVJBVEV9CisgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgorICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgorICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCisgKiAJCWNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCisgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50CisgKi8KK3B1YmxpYyBNZXRob2RSZWZlcmVuY2VNYXRjaChJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgaW50IGFjY3VyYWN5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGluc2lkZURvY0NvbW1lbnQsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwlzdXBlcihlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIGluc2lkZURvY0NvbW1lbnQsIHBhcnRpY2lwYW50LCByZXNvdXJjZSk7Cit9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCByZWZlcmVuY2UgbWF0Y2guCi0JICogCi0JICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QKLQkgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIHtAbGluayAjQV9BQ0NVUkFURX0gb3Ige0BsaW5rICNBX0lOQUNDVVJBVEV9Ci0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGNvbnN0cnVjdG9yIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGEgY29uc3RydWN0b3IKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHBhcmFtIHN5bnRoZXRpYyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaCBhIHN5bnRoZXRpYyBlbGVtZW50Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBpbnNpZGVEb2NDb21tZW50IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGlzIGluc2lkZSBhIGRvYwotCSAqIGNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIE1ldGhvZFJlZmVyZW5jZU1hdGNoKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBpbnQgYWNjdXJhY3ksIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY29uc3RydWN0b3IsIGJvb2xlYW4gc3ludGhldGljLCBib29sZWFuIGluc2lkZURvY0NvbW1lbnQsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcyhlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIGluc2lkZURvY0NvbW1lbnQsIHBhcnRpY2lwYW50LCByZXNvdXJjZSk7Ci0JCXRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKLQkJdGhpcy5zeW50aGV0aWMgPSBzeW50aGV0aWM7Ci0JfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCByZWZlcmVuY2UgbWF0Y2guCisgKgorICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QKKyAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KKyAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gY29uc3RydWN0b3IgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggYSBjb25zdHJ1Y3RvcgorICogCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgKiBAcGFyYW0gc3ludGhldGljIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGEgc3ludGhldGljIGVsZW1lbnQKKyAqIAkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCisgKiBjb21tZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAorICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgTWV0aG9kUmVmZXJlbmNlTWF0Y2goSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBjb25zdHJ1Y3RvciwgYm9vbGVhbiBzeW50aGV0aWMsIGJvb2xlYW4gaW5zaWRlRG9jQ29tbWVudCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRoaXMoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOworCXRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKwl0aGlzLnN5bnRoZXRpYyA9IHN5bnRoZXRpYzsKK30KIAotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIHJlZmVyZW5jZSBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1ldGhvZAotCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gY29uc3RydWN0b3IgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2hlcyBhIGNvbnN0cnVjdG9yCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBzeW50aGV0aWMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2hlcyBhIHN5bnRoZXRpYyBlbGVtZW50Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBzdXBlckludm9jYXRpb24gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2hlcyBhIHN1cGVyLXR5cGUgaW52b2NhdGlvbgotCSAqIGVsZW1lbnQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBpbnNpZGVEb2NDb21tZW50IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGlzIGluc2lkZSBhIGRvYwotCSAqIGNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQKLQkgKiBAc2luY2UgMy4zCi0JICovCi0JcHVibGljIE1ldGhvZFJlZmVyZW5jZU1hdGNoKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBpbnQgYWNjdXJhY3ksIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY29uc3RydWN0b3IsIGJvb2xlYW4gc3ludGhldGljLCBib29sZWFuIHN1cGVySW52b2NhdGlvbiwgYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50LCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBjb25zdHJ1Y3Rvciwgc3ludGhldGljLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwotCQl0aGlzLnN1cGVySW52b2NhdGlvbiA9IHN1cGVySW52b2NhdGlvbjsKLQl9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIHJlZmVyZW5jZSBtYXRjaC4KKyAqCisgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1ldGhvZAorICogQHBhcmFtIGFjY3VyYWN5IG9uZSBvZiB7QGxpbmsgI0FfQUNDVVJBVEV9IG9yIHtAbGluayAjQV9JTkFDQ1VSQVRFfQorICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KKyAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KKyAqIEBwYXJhbSBjb25zdHJ1Y3RvciA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaGVzIGEgY29uc3RydWN0b3IKKyAqIAkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIHN5bnRoZXRpYyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaGVzIGEgc3ludGhldGljIGVsZW1lbnQKKyAqIAkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIHN1cGVySW52b2NhdGlvbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaGVzIGEgc3VwZXItdHlwZSBpbnZvY2F0aW9uCisgKiAJCWVsZW1lbnQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCisgKiAJCWNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCisgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50CisgKiBAc2luY2UgMy4zCisgKi8KK3B1YmxpYyBNZXRob2RSZWZlcmVuY2VNYXRjaChJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgaW50IGFjY3VyYWN5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNvbnN0cnVjdG9yLCBib29sZWFuIHN5bnRoZXRpYywgYm9vbGVhbiBzdXBlckludm9jYXRpb24sIGJvb2xlYW4gaW5zaWRlRG9jQ29tbWVudCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRoaXMoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBjb25zdHJ1Y3Rvciwgc3ludGhldGljLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOworCXRoaXMuc3VwZXJJbnZvY2F0aW9uID0gc3VwZXJJbnZvY2F0aW9uOworfQogCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgb24gYSBjb25zdHJ1Y3Rvci4KLQkgKgotCSAqIEByZXR1cm4gUmV0dXJucyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgb24gYSBjb25zdHJ1Y3RvciBvciBub3QuCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBvbiBhIHN5bnRoZXRpYyBlbGVtZW50LgotCSAqIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBmb3IgY29uc3RydWN0b3IgcmVmZXJlbmNlLiBUaGlzIGhhcHBlbnMgd2hlbiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICogZGVjbGFyYXRpb24gaXMgdXNlZCBvciBpbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgc3ludGhldGljIG9yIG5vdC4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7Ci0JCXJldHVybiB0aGlzLnN5bnRoZXRpYzsKLQl9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIG9uIGEgY29uc3RydWN0b3IuCisgKgorICogQHJldHVybiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBvbiBhIGNvbnN0cnVjdG9yIG9yIG5vdC4KKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKwlyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcjsKK30KIAotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIG9uIGEgbWVzc2FnZSBzZW50IGZyb20gYSB0eXBlCi0JICogd2hpY2ggaXMgYSBzdXBlciB0eXBlIG9mIHRoZSBzZWFyY2hlZCBtZXRob2QgZGVjbGFyaW5nIHR5cGUuCi0JICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBtZXRob2QgY2FsbGVkIGF0IHJ1bi10aW1lIG1heSBvciBtYXkgbm90IGJlCi0JICogdGhlIHNlYXJjaCB0YXJnZXQsIGRlcGVuZGluZyBvbiB0aGUgcnVuLXRpbWUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlZmVyZW5jZSBpcyBvbiBhIG1lc3NhZ2Ugc2VudCBmcm9tCi0JICogYSBzdXBlci10eXBlIG9mIHRoZSBzZWFyY2hlZCBtZXRob2QgZGVjbGFyaW5nIGNsYXNzLCA8Y29kZT5mYWxzZSA8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cGVySW52b2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJJbnZvY2F0aW9uOwotCX0KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgb24gYSBzeW50aGV0aWMgZWxlbWVudC4KKyAqIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBmb3IgY29uc3RydWN0b3IgcmVmZXJlbmNlLiBUaGlzIGhhcHBlbnMgd2hlbiBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiBkZWNsYXJhdGlvbiBpcyB1c2VkIG9yIGltcGxpY2l0IHN1cGVyIGNvbnN0cnVjdG9yIGlzIGNhbGxlZC4KKyAqCisgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBzeW50aGV0aWMgb3Igbm90LgorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKKwlyZXR1cm4gdGhpcy5zeW50aGV0aWM7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgb24gYSBtZXNzYWdlIHNlbnQgZnJvbSBhIHR5cGUKKyAqIHdoaWNoIGlzIGEgc3VwZXIgdHlwZSBvZiB0aGUgc2VhcmNoZWQgbWV0aG9kIGRlY2xhcmluZyB0eXBlLgorICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBtZXRob2QgY2FsbGVkIGF0IHJ1bi10aW1lIG1heSBvciBtYXkgbm90IGJlCisgKiB0aGUgc2VhcmNoIHRhcmdldCwgZGVwZW5kaW5nIG9uIHRoZSBydW4tdGltZSB0eXBlIG9mIHRoZSByZWNlaXZlciBvYmplY3QuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVmZXJlbmNlIGlzIG9uIGEgbWVzc2FnZSBzZW50IGZyb20KKyAqIGEgc3VwZXItdHlwZSBvZiB0aGUgc2VhcmNoZWQgbWV0aG9kIGRlY2xhcmluZyBjbGFzcywgPGNvZGU+ZmFsc2UgPC9jb2RlPiBvdGhlcndpc2UKKyAqIEBzaW5jZSAzLjMKKyAqLworcHVibGljIGJvb2xlYW4gaXNTdXBlckludm9jYXRpb24oKSB7CisJcmV0dXJuIHRoaXMuc3VwZXJJbnZvY2F0aW9uOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9QYWNrYWdlRGVjbGFyYXRpb25NYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9QYWNrYWdlRGVjbGFyYXRpb25NYXRjaC5qYXZhCmluZGV4IGQzMTgyMmMuLjVhZmJjMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvUGFja2FnZURlY2xhcmF0aW9uTWF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1BhY2thZ2VEZWNsYXJhdGlvbk1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMTQgKzE5LDE0IEBACiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQYWNrYWdlRGVjbGFyYXRpb25NYXRjaCBleHRlbmRzIFNlYXJjaE1hdGNoIHsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgcGFja2FnZSBkZWNsYXJhdGlvbiBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uCiAJICogQHBhcmFtIGFjY3VyYWN5IG9uZSBvZiBBX0FDQ1VSQVRFIG9yIEFfSU5BQ0NVUkFURQogCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1BhY2thZ2VSZWZlcmVuY2VNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9QYWNrYWdlUmVmZXJlbmNlTWF0Y2guamF2YQppbmRleCA0MDc5MDgwLi5mNzY4YWE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1BhY2thZ2VSZWZlcmVuY2VNYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvUGFja2FnZVJlZmVyZW5jZU1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksMjUgKzE5LDI0IEBACiAgKiA8cD4KICAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2luY2UgMy4wCiAgKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlUmVmZXJlbmNlTWF0Y2ggZXh0ZW5kcyBTZWFyY2hNYXRjaCB7CitwdWJsaWMgY2xhc3MgUGFja2FnZVJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgUmVmZXJlbmNlTWF0Y2ggewogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwYWNrYWdlIHJlZmVyZW5jZSBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHBhY2thZ2UKLQkgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIHtAbGluayAjQV9BQ0NVUkFURX0gb3Ige0BsaW5rICNBX0lOQUNDVVJBVEV9Ci0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCi0JICogY29tbWVudCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlTWF0Y2goSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50LCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKLQkJc2V0SW5zaWRlRG9jQ29tbWVudChpbnNpZGVEb2NDb21tZW50KTsKLQl9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgcGFja2FnZSByZWZlcmVuY2UgbWF0Y2guCisgKgorICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIGlubmVyLW1vc3QgZW5jbG9zaW5nIG1lbWJlciB0aGF0IHJlZmVyZW5jZXMgdGhpcyBwYWNrYWdlCisgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIHtAbGluayAjQV9BQ0NVUkFURX0gb3Ige0BsaW5rICNBX0lOQUNDVVJBVEV9CisgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgorICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgorICogQHBhcmFtIGluc2lkZURvY0NvbW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCisgKiAJCWNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB0aGF0IGNyZWF0ZWQgdGhlIG1hdGNoCisgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50CisgKi8KK3B1YmxpYyBQYWNrYWdlUmVmZXJlbmNlTWF0Y2goSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50LCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSVJlc291cmNlIHJlc291cmNlKSB7CisJc3VwZXIoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9SZWZlcmVuY2VNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9SZWZlcmVuY2VNYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODUyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1JlZmVyZW5jZU1hdGNoLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBKYXZhIHNlYXJjaCBtYXRjaCB0aGF0IHJlcHJlc2VudHMgYSByZWZlcmVuY2UuCisgKiAKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggeworCisJSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHJlZmVyZW5jZSBtYXRjaC4KKyAqCisgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIGphdmEgZWxlbWVudAorICogQHBhcmFtIGFjY3VyYWN5IG9uZSBvZiB7QGxpbmsgI0FfQUNDVVJBVEV9IG9yIHtAbGluayAjQV9JTkFDQ1VSQVRFfQorICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KKyAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KKyAqIEBwYXJhbSBpbnNpZGVEb2NDb21tZW50IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGlzIGluc2lkZSBhIGRvYworICogCQljb21tZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAorICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAorICovCitwdWJsaWMgUmVmZXJlbmNlTWF0Y2goSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50LCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSVJlc291cmNlIHJlc291cmNlKSB7CisJc3VwZXIoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOworCXNldEluc2lkZURvY0NvbW1lbnQoaW5zaWRlRG9jQ29tbWVudCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbG9jYWwgZWxlbWVudCBvZiB0aGlzIHNlYXJjaCBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAqIEEgbG9jYWwgZWxlbWVudCBpcyB0aGUgaW5uZXItbW9zdCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBhbmQgdGhhdCBpcworICogbm90IHJlYWNoYWJsZSBieSBuYXZpZ2F0aW5nIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHtAbGluayBJSmF2YU1vZGVsfSB1c2luZworICoge0BsaW5rIElQYXJlbnQjZ2V0Q2hpbGRyZW4oKX0uCisgKiA8cD4KKyAqIEtub3duIGVsZW1lbnQgdHlwZXMgZm9yIGxvY2FsIGVsZW1lbnRzIGFyZSB7QGxpbmsgSUphdmFFbGVtZW50I0FOTk9UQVRJT059LAorICoge0BsaW5rIElKYXZhRWxlbWVudCNMT0NBTF9WQVJJQUJMRX0gYW5kIHtAbGluayBJSmF2YUVsZW1lbnQjVFlQRV9QQVJBTUVURVJ9Ljxicj4KKyAqIEhvd2V2ZXIgY2xpZW50cyBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoaXMgc2V0IG9mIGVsZW1lbnQgdHlwZXMgaXMgY2xvc2VkIGFzCisgKiBvdGhlciB0eXBlcyBvZiBlbGVtZW50cyBtYXkgYmUgcmV0dXJuZWQgaW4gdGhlIGZ1dHVyZSwgZS5nLiBpZiBuZXcgdHlwZXMKKyAqIG9mIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiB0aGUgSmF2YSBtb2RlbC4gQ2xpZW50cyBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUKKyAqIHtAbGluayBJSmF2YUVsZW1lbnQjZ2V0UGFyZW50KCkgcGFyZW50fSBjaGFpbiBvZiB0aGlzIGxvY2FsIGVsZW1lbnQgZXZlbnR1YWxseQorICogbGVhZHMgdG8gdGhlIGVsZW1lbnQgZnJvbSB7QGxpbmsgI2dldEVsZW1lbnQoKX0uCisgKiA8L3A+PHA+CisgKiBUaGUgbG9jYWwgZWxlbWVudCBiZWluZyBhbiB7QGxpbmsgSUFubm90YXRpb259IGlzIHRoZSBtb3N0IHVzdWFsIGNhc2UuIEZvciBleGFtcGxlLAorICogPHVsPgorICogCTxsaT5zZWFyY2hpbmcgZm9yIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBtZXRob2QgPGNvZGU+QW5ub3QuY2xhenooKTwvY29kZT4gaW4KKyAqIAkJCTxwcmU+CisgKiAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdCB7CisgKiAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7CisgKiAgICAgICAgICAgICAgICAgICAgICYjMDA2NDtBbm5vdChjbGF6ej1UZXN0LmNsYXNzKSBpbnQgeDsKKyAqICAgICAgICAgICAgICAgICB9CisgKiAgICAgICAgICAgICB9PC9wcmU+CisgKiAJCQl3aWxsIHJldHVybiBvbmUge0BsaW5rIE1ldGhvZFJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAJCQlpcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSAnPGNvZGU+QW5ub3Q8L2NvZGU+Jy48YnI+PGJyPgorICogCTwvbGk+CisgKgkJPGxpPnNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+RGVwcmVjYXRlZDwvY29kZT4gaW4KKyAqCQkJCTxwcmU+CisgKiAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdCB7CisgKiAgICAgICAgICAgICAgICAmIzAwNjQ7RGVwcmVjYXRlZCB2b2lkIG1ldGhvZCgpIHt9CisgKiAgICAgICAgICAgICB9PC9wcmU+CisgKiAJCQl3aWxsIHJldHVybiBvbmUge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2ggd2hvc2UgbG9jYWwgZWxlbWVudAorICogCQkJaXMgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gJzxjb2RlPkRlcHJlY2F0ZWQ8L2NvZGU+Jy48YnI+PGJyPgorICogCTwvbGk+CisgKiAJPGxpPnNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGZpZWxkIDxjb2RlPkNPTlNUPC9jb2RlPiBpbgorICogCQkJPHByZT4KKyAqICAgICAgICAgICAgICAmIzAwNjQ7TnVtKG51bWJlcj0gTnVtLkNPTlNUKQorICogICAgICAgICAgICAgICYjMDA2NDtpbnRlcmZhY2UgTnVtIHsKKyAqICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1Q9IDQyOworICogICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKCk7CisgKiAgICAgICAgICAgICAgfTwvcHJlPgorICogCQkJd2lsbCByZXR1cm4gb25lIHtAbGluayBGaWVsZFJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAJCQlpcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSAnPGNvZGU+TnVtPC9jb2RlPicuPGJyPjxicj4KKyAqIAk8L2xpPgorICogPC91bD4KKyAqIDwvcD48cD4KKyAqIEEgbG9jYWwgZWxlbWVudCBtYXkgYWxzbyBiZSBhIHtAbGluayBJTG9jYWxWYXJpYWJsZX0gd2hvc2UgdHlwZSBpcyB0aGUgcmVmZXJlbmNlZAorICogdHlwZS4gRm9yIGV4YW1wbGUsCisgKiA8dWw+CisgKiAJPGxpPnNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+VGVzdDwvY29kZT4gaW4KKyAqIAkJPHByZT4KKyAqICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgICAgICBUZXN0IGxvY2FsOworICogICAgICAgICAgICAgfQorICogICAgICAgICB9PC9wcmU+CisgKiAJCXdpbGwgcmV0dXJuIG9uZSB7QGxpbmsgVHlwZVJlZmVyZW5jZU1hdGNofSBtYXRjaCB3aG9zZSBsb2NhbCBlbGVtZW50CisgKiAJCWlzIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGV9ICc8Y29kZT5sb2NhbDwvY29kZT4nLjxicj48YnI+CisgKiAJPC9saT4KKyAqIDwvdWw+CisgKiBPciBhIGxvY2FsIGVsZW1lbnQgbWF5IGJlIGFuIHtAbGluayBJVHlwZVBhcmFtZXRlcn0gdGhhdCBleHRlbmRzIHRoZSByZWZlcmVuY2VkCisgKiB0eXBlLiBGb3IgZXhhbXBsZSwKKyAqIDx1bD4KKyAqIAk8bGk+c2VhcmNoaW5nIGZvciB0aGUgcmVmZXJlbmNlcyB0byB0aGUgdHlwZSA8Y29kZT5UZXN0PC9jb2RlPiBpbgorICogCQk8cHJlPgorICogICAgICAgICBwdWJsaWMgY2xhc3MgWCZsdDsgVCBleHRlbmRzIFRlc3QmZ3Q7IHsKKyAqICAgICAgICAgfTwvcHJlPgorICogCQl3aWxsIHJldHVybiBvbmUge0BsaW5rIFR5cGVSZWZlcmVuY2VNYXRjaH0gbWF0Y2ggd2hvc2UgbG9jYWwgZWxlbWVudAorICogCQlpcyB0aGUge0BsaW5rIElUeXBlUGFyYW1ldGVyfSAnPGNvZGU+VDwvY29kZT4nLjxicj48YnI+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEByZXR1cm4gdGhlIGxvY2FsIGVsZW1lbnQgb2YgdGhpcyBzZWFyY2ggbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgKgorICogQHNpbmNlIDMuNAorICovCitmaW5hbCBwdWJsaWMgSUphdmFFbGVtZW50IGdldExvY2FsRWxlbWVudCgpIHsKKwlyZXR1cm4gdGhpcy5sb2NhbEVsZW1lbnQ7Cit9CisKKy8qKgorICogU3RvcmUgdGhlIGxvY2FsIGVsZW1lbnQgaW4gdGhlIG1hdGNoLgorICoKKyAqIEBwYXJhbSBlbGVtZW50IFRoZSBsb2NhbCBlbGVtZW50IHRvIGJlIHN0b3JlZAorICogCisgKiBAc2luY2UgMy41CisgKi8KK2ZpbmFsIHB1YmxpYyB2b2lkIHNldExvY2FsRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXRoaXMubG9jYWxFbGVtZW50ID0gZWxlbWVudDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRG9jdW1lbnQuamF2YQppbmRleCAyODA5MzBiLi4wYzE2ZmU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaERvY3VtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hEb2N1bWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDI1ICsxMCwyOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbnRlcm5hbFNlYXJjaERvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwogCiAvKioKICAqIEEgc2VhcmNoIGRvY3VtZW50IGVuY2Fwc3VsYXRlcyBhIGNvbnRlbnQgdG8gYmUgZWl0aGVyIGluZGV4ZWQgb3Igc2VhcmNoZWQgaW4uCi0gKiBBIHNlYXJjaCBwYXJ0aWNwYW50IGNyZWF0ZXMgYSBzZWFyY2ggZG9jdW1lbnQuCisgKiBBIHNlYXJjaCBwYXJ0aWNpcGFudCBjcmVhdGVzIGEgc2VhcmNoIGRvY3VtZW50LgogICogPHA+CiAgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaERvY3VtZW50IGV4dGVuZHMgSW50ZXJuYWxTZWFyY2hEb2N1bWVudCB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoRG9jdW1lbnQgeworCXByaXZhdGUgSW5kZXggaW5kZXg7CisJcHJpdmF0ZSBTdHJpbmcgY29udGFpbmVyUmVsYXRpdmVQYXRoOworCXByaXZhdGUgU291cmNlRWxlbWVudFBhcnNlciBwYXJzZXI7CiAJcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRQYXRoOwogCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQ7Ci0JCisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBkb2N1bWVudC4gVGhlIGdpdmVuIGRvY3VtZW50IHBhdGggaXMgYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBkb2N1bWVudC4KIAkgKiBNb3N0IG9mIHRoZSB0aW1lIGl0IGlzIGEgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGgsIGJ1dCBpdCBjYW4gYWxzbyBiZSBhIGZpbGUgc3lzdGVtIHBhdGgsIG9yIGEgcGF0aCBpbnNpZGUgYSB6aXAgZmlsZS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkb2N1bWVudFBhdGggdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50LAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlcyB0aGUgc2VhcmNoIGRvY3VtZW50CkBAIC00MiwxNCArNDYsMTUgQEAKIAkgKiBBZGRzIHRoZSBnaXZlbiBpbmRleCBlbnRyeSAoY2F0ZWdvcnkgYW5kIGtleSkgY29taW5nIGZyb20gdGhpcwogCSAqIGRvY3VtZW50IHRvIHRoZSBpbmRleC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbQogCSAqIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCNpbmRleERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggaW5kZXhQYXRoKX0uCi0JICogCisJICoKIAkgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNhdGVnb3J5IG9mIHRoZSBpbmRleCBlbnRyeQogCSAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgaW5kZXggZW50cnkKIAkgKi8KIAlwdWJsaWMgdm9pZCBhZGRJbmRleEVudHJ5KGNoYXJbXSBjYXRlZ29yeSwgY2hhcltdIGtleSkgewotCQlzdXBlci5hZGRJbmRleEVudHJ5KGNhdGVnb3J5LCBrZXkpOworCQlpZiAodGhpcy5pbmRleCAhPSBudWxsKQorCQkJdGhpcy5pbmRleC5hZGRJbmRleEVudHJ5KGNhdGVnb3J5LCBrZXksIGdldENvbnRhaW5lclJlbGF0aXZlUGF0aCgpKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50LgogCSAqIENvbnRlbnRzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBhY3R1YWwgcmVzb3VyY2UgYXQgY29ycmVzcG9uZGluZyBkb2N1bWVudCBwYXRoLApAQCAtNjAsMTAgKzY1LDEwIEBACiAJICogTm90ZTogc29tZSBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIGNhY2hlIHRoZSBjb250ZW50cyBkaXJlY3RseSBvbiB0aGUKIAkgKiBkb2N1bWVudCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uLiBIb3dldmVyLCB0aGlzIGNvdWxkIGluZHVjZSBzY2FsYWJpbGl0eSBpc3N1ZXMgZHVlCiAJICogdG8gdGhlIGZhY3QgdGhhdCBjb2xsZWN0aW9ucyBvZiBkb2N1bWVudHMgYXJlIG1hbmlwdWxhdGVkIHRocm91Z2hvdXQgdGhlIHNlYXJjaAotCSAqIG9wZXJhdGlvbiwgYW5kIGNhY2hlZCBjb250ZW50cyB3b3VsZCB0aGVuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkgdW50aWwgdGhleSBhcmUgCisJICogb3BlcmF0aW9uLCBhbmQgY2FjaGVkIGNvbnRlbnRzIHdvdWxkIHRoZW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeSB1bnRpbCB0aGV5IGFyZQogCSAqIGFsbCByZWxlYXNlZCBhdCBvbmNlIGluIHRoZSBlbmQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyBkb2N1bWVudCwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCkBAIC03OSw1MiArODQsODMgQEAKIAkgKiBOb3RlOiBzb21lIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gY2FjaGUgdGhlIGNvbnRlbnRzIGRpcmVjdGx5IG9uIHRoZQogCSAqIGRvY3VtZW50IGZvciBwZXJmb3JtYW5jZSByZWFzb24uIEhvd2V2ZXIsIHRoaXMgY291bGQgaW5kdWNlIHNjYWxhYmlsaXR5IGlzc3VlcyBkdWUKIAkgKiB0byB0aGUgZmFjdCB0aGF0IGNvbGxlY3Rpb25zIG9mIGRvY3VtZW50cyBhcmUgbWFuaXB1bGF0ZWQgdGhyb3VnaG91dCB0aGUgc2VhcmNoCi0JICogb3BlcmF0aW9uLCBhbmQgY2FjaGVkIGNvbnRlbnRzIHdvdWxkIHRoZW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeSB1bnRpbCB0aGV5IGFyZSAKKwkgKiBvcGVyYXRpb24sIGFuZCBjYWNoZWQgY29udGVudHMgd291bGQgdGhlbiBjb25zdW1lIGxvdHMgb2YgbWVtb3J5IHVudGlsIHRoZXkgYXJlCiAJICogYWxsIHJlbGVhc2VkIGF0IG9uY2UgaW4gdGhlIGVuZC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50LAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgY2hhcltdIGdldENoYXJDb250ZW50cygpOwogCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKCkgeworCQlpZiAodGhpcy5jb250YWluZXJSZWxhdGl2ZVBhdGggPT0gbnVsbCkKKwkJCXRoaXMuY29udGFpbmVyUmVsYXRpdmVQYXRoID0gdGhpcy5pbmRleC5jb250YWluZXJSZWxhdGl2ZVBhdGgoZ2V0UGF0aCgpKTsKKwkJcmV0dXJuIHRoaXMuY29udGFpbmVyUmVsYXRpdmVQYXRoOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIGZvciB0aGlzIGRvY3VtZW50LgogCSAqIDxwPgogCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBmb3IgdGhpcyBkb2N1bWVudCwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCiAJcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFbmNvZGluZygpOwogCiAJLyoqCisJICogQG5vb3ZlcnJpZGUgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlLWltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCisJICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisJICovCisJcHVibGljIFNvdXJjZUVsZW1lbnRQYXJzZXIgZ2V0UGFyc2VyKCkgeworCQlyZXR1cm4gdGhpcy5wYXJzZXI7CisJfQorCQorCS8qKgogCSAqIFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50LgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoaXMgZG9jdW1lbnQKIAkgKi8KIAlwdWJsaWMgZmluYWwgU2VhcmNoUGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKSB7CiAJCXJldHVybiB0aGlzLnBhcnRpY2lwYW50OwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50IHRvIHB1YmxpY2x5IG1lbnRpb24gaW4gaW5kZXgKIAkgKiBvciBzZWFyY2ggcmVzdWx0cy4gVGhpcyBwYXRoIGlzIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnQuCi0JICogTW9zdCBvZiB0aGUgdGltZSBpdCBpcyBhIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLCBidXQgaXQgY2FuIGFsc28gYmUgYSBmaWxlIHN5c3RlbSBwYXRoLCAKKwkgKiBNb3N0IG9mIHRoZSB0aW1lIGl0IGlzIGEgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGgsIGJ1dCBpdCBjYW4gYWxzbyBiZSBhIGZpbGUgc3lzdGVtIHBhdGgsCiAJICogb3IgYSBwYXRoIGluc2lkZSBhIHppcCBmaWxlLgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnQKLQkgKi8JCisJICovCiAJcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXRoKCkgewogCQlyZXR1cm4gdGhpcy5kb2N1bWVudFBhdGg7CiAJfQogCS8qKgogCSAqIFJlbW92ZXMgYWxsIGluZGV4IGVudHJpZXMgZnJvbSB0aGUgaW5kZXggZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIAorCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZyb20KIAkgKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQjaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGluZGV4UGF0aCl9LgogCSAqLwogCXB1YmxpYyB2b2lkIHJlbW92ZUFsbEluZGV4RW50cmllcygpIHsKLQkJc3VwZXIucmVtb3ZlQWxsSW5kZXhFbnRyaWVzKCk7CisJCWlmICh0aGlzLmluZGV4ICE9IG51bGwpCisJCQl0aGlzLmluZGV4LnJlbW92ZShnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoKSk7CisJfQorCQorCS8qKgorCSAqIEBub292ZXJyaWRlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZS1pbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgorCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEluZGV4KEluZGV4IGluZGV4VG9TZXQpIHsKKwkJdGhpcy5pbmRleCA9IGluZGV4VG9TZXQ7CisJfQorCQorCS8qKgorCSAqIEBub292ZXJyaWRlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZS1pbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgorCSAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcnNlcihTb3VyY2VFbGVtZW50UGFyc2VyIHNvdXJjZUVsZW1lbnRQYXJzZXIpIHsKKwkJdGhpcy5wYXJzZXIgPSBzb3VyY2VFbGVtZW50UGFyc2VyOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCmluZGV4IGJiMDY4NWYuLjM3Yjg0MzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBTdGVwaGFuIEhlcnJtYW5uIC0gQ29udHJpYnV0aW9ucyBmb3IgYnVnIDIxNTEzOSBhbmQgYnVnIDI5NTg5NAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKIApAQCAtMjIsMTYgKzIzLDE3IEBACiAgKiBBIHtAbGluayBTZWFyY2hFbmdpbmV9IHNlYXJjaGVzIGZvciBKYXZhIGVsZW1lbnRzIGZvbGxvd2luZyBhIHNlYXJjaCBwYXR0ZXJuLgogICogVGhlIHNlYXJjaCBjYW4gYmUgbGltaXRlZCB0byBhIHNlYXJjaCBzY29wZS4KICAqIDxwPgotICogVmFyaW91cyBzZWFyY2ggcGF0dGVybnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIGZhY3RvcnkgbWV0aG9kcyAKKyAqIFZhcmlvdXMgc2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBmYWN0b3J5IG1ldGhvZHMKICAqIHtAbGluayBTZWFyY2hQYXR0ZXJuI2NyZWF0ZVBhdHRlcm4oU3RyaW5nLCBpbnQsIGludCwgaW50KX0sIHtAbGluayBTZWFyY2hQYXR0ZXJuI2NyZWF0ZVBhdHRlcm4oSUphdmFFbGVtZW50LCBpbnQpfSwKICAqIHtAbGluayBTZWFyY2hQYXR0ZXJuI2NyZWF0ZU9yUGF0dGVybihTZWFyY2hQYXR0ZXJuLCBTZWFyY2hQYXR0ZXJuKX0uCiAgKiA8L3A+Ci0gKiA8cD5Gb3IgZXhhbXBsZSwgb25lIGNhbiBzZWFyY2ggZm9yIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiBhIHR5cGUsIAorICogPHA+Rm9yIGV4YW1wbGUsIG9uZSBjYW4gc2VhcmNoIGZvciByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGluIHRoZSBoaWVyYXJjaHkgb2YgYSB0eXBlLAogICogb3Igb25lIGNhbiBzZWFyY2ggZm9yIHRoZSBkZWNsYXJhdGlvbnMgb2YgdHlwZXMgc3RhcnRpbmcgd2l0aCAiQWJzdHJhY3QiIGluIGEgcHJvamVjdC4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KKyAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZC4KICAqIDwvcD4KKyAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWFyY2hFbmdpbmUgewogCkBAIC05MiwxMyArOTQsMTMgQEAKIAkJfQogCQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3MpIHsKIAkJCWlmIChGbGFncy5pc0ludGVyZmFjZShtb2RpZmllcnMpKSB7Ci0JCQkJbmFtZVJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHBhdGgpOworCQkJCXRoaXMubmFtZVJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHBhdGgpOwogCQkJfSBlbHNlIHsKLQkJCQluYW1lUmVxdWVzdG9yLmFjY2VwdENsYXNzKHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBwYXRoKTsKKwkJCQl0aGlzLm5hbWVSZXF1ZXN0b3IuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHBhdGgpOwogCQkJfQogCQl9CiAJfQotCQkKKwogCS8vIFNlYXJjaCBlbmdpbmUgbm93IHVzZXMgYmFzaWMgZW5naW5lIGZ1bmN0aW9uYWxpdGllcwogCXByaXZhdGUgQmFzaWNTZWFyY2hFbmdpbmUgYmFzaWNFbmdpbmU7CiAKQEAgLTEwOCwxNiArMTEwLDE2IEBACiAJcHVibGljIFNlYXJjaEVuZ2luZSgpIHsKIAkJdGhpcy5iYXNpY0VuZ2luZSA9IG5ldyBCYXNpY1NlYXJjaEVuZ2luZSgpOwogCX0KLQkKKwogCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGVuZ2luZSB3aXRoIGEgbGlzdCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgCisJICogQ3JlYXRlcyBhIG5ldyBzZWFyY2ggZW5naW5lIHdpdGggYSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHRoYXQgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlcgogCSAqIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSBzdWJzZXF1ZW50IHNlYXJjaCBvcGVyYXRpb25zLgogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGVtcHR5IHdvcmtpbmcgY29weSB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgogCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC48L3A+CiAJICogPHA+CiAJICogU2luY2UgMy4wIHRoZSBnaXZlbiB3b3JraW5nIGNvcGllcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBwcmltYXJ5IHdvcmtpbmcgY29waWVzIChpZiBhbnkpLgotCSAqIAorCSAqCiAJICogQHBhcmFtIHdvcmtpbmdDb3BpZXMgdGhlIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdHMKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0xMjUsMTQgKzEyNywxNCBAQAogCQl0aGlzLmJhc2ljRW5naW5lID0gbmV3IEJhc2ljU2VhcmNoRW5naW5lKHdvcmtpbmdDb3BpZXMpOwogCX0KIAkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBlbmdpbmUgd2l0aCBhIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIAorCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGVuZ2luZSB3aXRoIGEgbGlzdCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKIAkgKiB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgc3Vic2VxdWVudCBzZWFyY2ggb3BlcmF0aW9ucy4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgcGFzc2luZyBhbiBlbXB0eSB3b3JraW5nIGNvcHkgd2lsbCBiZSBhcyBpZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KIAkgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuPC9wPgogCSAqIDxwPgogCSAqIFNpbmNlIDMuMCB0aGUgZ2l2ZW4gd29ya2luZyBjb3BpZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcHJpbWFyeSB3b3JraW5nIGNvcGllcyAoaWYgYW55KS4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB3b3JraW5nQ29waWVzIHRoZSB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCiAJICogQHNpbmNlIDIuMAogCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI1NlYXJjaEVuZ2luZShJQ29tcGlsYXRpb25Vbml0W10pfSBpbnN0ZWFkLgpAQCAtMTQzLDEyICsxNDUsMTIgQEAKIAkJU3lzdGVtLmFycmF5Y29weSh3b3JraW5nQ29waWVzLCAwLCB1bml0cywgMCwgbGVuZ3RoKTsKIAkJdGhpcy5iYXNpY0VuZ2luZSA9IG5ldyBCYXNpY1NlYXJjaEVuZ2luZSh1bml0cyk7CiAJfQotCQorCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBzZWFyY2ggZW5naW5lIHdpdGggdGhlIGdpdmVuIHdvcmtpbmcgY29weSBvd25lci4KLQkgKiBUaGUgd29ya2luZyBjb3BpZXMgb3duZWQgYnkgdGhpcyBvd25lciB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIAorCSAqIFRoZSB3b3JraW5nIGNvcGllcyBvd25lZCBieSB0aGlzIG93bmVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKIAkgKiB0aGUgcHJpbWFyeSBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgc3Vic2VxdWVudCBzZWFyY2ggb3BlcmF0aW9ucy4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB3b3JraW5nQ29weU93bmVyIHRoZSBvd25lciBvZiB0aGUgd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cwogCSAqIEBzaW5jZSAzLjAKIAkgKi8KQEAgLTE2OCw3ICsxNzAsNyBAQAogCXB1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVIaWVyYXJjaHlTY29wZShJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEJhc2ljU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBKYXZhIHNlYXJjaCBzY29wZSBsaW1pdGVkIHRvIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGdpdmVuIHR5cGUuCiAJICogV2hlbiB0aGUgaGllcmFyY2h5IGlzIGNvbXB1dGVkLCB0aGUgdHlwZXMgZGVmaW5lZCBpbiB0aGUgd29ya2luZyBjb3BpZXMgb3duZWQKQEAgLTE4Nyw2ICsxODksMzYgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgSmF2YSBzZWFyY2ggc2NvcGUgbGltaXRlZCB0byB0aGUgaGllcmFyY2h5IG9mIHRoZSBnaXZlbiB0eXBlIGFuZCB0byBhIGdpdmVuIHByb2plY3QuCisJICogVGhlIEphdmEgZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gYSBzZWFyY2ggd2l0aCB0aGlzIHNjb3BlIHdpbGwgYmUgdHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkuCisJICogPHA+CisJICogVW5saWtlIHRoZSA8Y29kZT5jcmVhdGVIaWVyYXJjaHlTY29wZTwvY29kZT4gbWV0aG9kcywgdGhpcyBtZXRob2QgY3JlYXRlcyA8ZW0+c3RyaWN0PC9lbT4KKwkgKiBzY29wZXMgdGhhdCBvbmx5IGNvbnRhaW4gdHlwZXMgdGhhdCBhY3R1YWxseSBzcGFuIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGZvY3VzCisJICogdHlwZSwgYnV0IGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9uYWwgZW5jbG9zaW5nIG9yIG1lbWJlciB0eXBlcy4KKwkgKiA8L3A+CisJICogPHA+CisJICogQnkgZGVmYXVsdCwgaGllcmFyY2h5IHNjb3BlcyBpbmNsdWRlIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IHN1cGVydHlwZXMgYW5kIHN1YnR5cGVzIG9mIHRoZQorCSAqIGZvY3VzIHR5cGUuIFRoaXMgbWV0aG9kLCBob3dldmVyLCBhbGxvd3MgdG8gcmVzdHJpY3QgdGhlIGhpZXJhcmNoeSB0byB0cnVlIHN1YnR5cGVzLAorCSAqIGFuZCBleGNsdWRlIHN1cGVydHlwZXMuIEFsc28sIGluY2x1c2lvbiBvZiB0aGUgZm9jdXMgdHlwZSBpdHNlbGYgaXMgY29udHJvbGxlZCBieSBhIHBhcmFtZXRlci4gCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRvIGNvbnN0cmFpbiB0aGUgc2VhcmNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqICAgICAgICBzZWFyY2ggc2hvdWxkIGNvbnNpZGVyIGFsbCB0eXBlcyBpbiB0aGUgd29ya3NwYWNlIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBmb2N1cyBvZiB0aGUgaGllcmFyY2h5IHNjb3BlCisJICogQHBhcmFtIG9ubHlTdWJ0eXBlcyBpZiA8Y29kZT50cnVlPC9jb2RlPiBvbmx5IHN1YnR5cGVzIG9mIDxjb2RlPnR5cGU8L2NvZGU+IGFyZSBjb25zaWRlcmVkCisJICogQHBhcmFtIGluY2x1ZGVGb2N1c1R5cGUgaWYgdHJ1ZSB0aGUgZm9jdXMgdHlwZSA8Y29kZT50eXBlPC9jb2RlPiBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNjb3BlLCAKKwkgKiAJCSAgb3RoZXJ3aXNlIGl0IGlzIGV4Y2x1ZGVkCisJICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzLCAKKwkgKiAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByaW1hcnkgd29ya2luZyBjb3B5IG93bmVyIHNob3VsZCBiZSB1c2VkCisJICogQHJldHVybiBhIG5ldyBoaWVyYXJjaHkgc2NvcGUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgaGllcmFyY2h5IGNvdWxkIG5vdCBiZSBjb21wdXRlZCBvbiB0aGUgZ2l2ZW4gdHlwZQorCSAqIEBzaW5jZSAzLjYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlU3RyaWN0SGllcmFyY2h5U2NvcGUoSUphdmFQcm9qZWN0IHByb2plY3QsIElUeXBlIHR5cGUsIGJvb2xlYW4gb25seVN1YnR5cGVzLCBib29sZWFuIGluY2x1ZGVGb2N1c1R5cGUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gQmFzaWNTZWFyY2hFbmdpbmUuY3JlYXRlU3RyaWN0SGllcmFyY2h5U2NvcGUocHJvamVjdCwgdHlwZSwgb25seVN1YnR5cGVzLCBpbmNsdWRlRm9jdXNUeXBlLCBvd25lcik7CisJfQorCisJLyoqCiAJICogUmV0dXJucyBhIEphdmEgc2VhcmNoIHNjb3BlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHJlc291cmNlcy4KIAkgKiBUaGUgSmF2YSBlbGVtZW50cyByZXN1bHRpbmcgZnJvbSBhIHNlYXJjaCB3aXRoIHRoaXMgc2NvcGUgd2lsbAogCSAqIGhhdmUgdGhlaXIgdW5kZXJseWluZyByZXNvdXJjZSBpbmNsdWRlZCBpbiBvciBlcXVhbHMgdG8gb25lIG9mIHRoZSBnaXZlbgpAQCAtMjEzLDE2ICsyNDUsMTYgQEAKIAkgKiBUaGUgSmF2YSBlbGVtZW50cyByZXN1bHRpbmcgZnJvbSBhIHNlYXJjaCB3aXRoIHRoaXMgc2NvcGUgd2lsbAogCSAqIGJlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBlbGVtZW50cy4KIAkgKiA8cD4KLQkgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElKYXZhUHJvamVjdCwgdGhlbiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXJzLCAKLQkgKiBpdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgaXRzIHJlZmVyZW5jZWQgcHJvamVjdHMgKHdpdGggdGhlaXIgc291cmNlIAotCSAqIGZvbGRlcnMgYW5kIGphcnMsIHJlY3Vyc2l2ZWx5KSB3aWxsIGJlIGluY2x1ZGVkLgotCSAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VGcmFnbWVudFJvb3QsIHRoZW4gb25seSB0aGUgcGFja2FnZSBmcmFnbWVudHMgb2YgCi0JICogdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2lsbCBiZSBpbmNsdWRlZC4KLQkgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElQYWNrYWdlRnJhZ21lbnQsIHRoZW4gb25seSB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2xhc3MgCi0JICogZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzIHdpbGwgTk9UIGJlIAorCSAqIElmIGFuIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0sIHRoZW4gdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVycywKKwkgKiBpdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgaXRzIHJlZmVyZW5jZWQgcHJvamVjdHMgKHdpdGggdGhlaXIgc291cmNlCisJICogZm9sZGVycyBhbmQgamFycywgcmVjdXJzaXZlbHkpIHdpbGwgYmUgaW5jbHVkZWQuPC9wPgorCSAqIDxwPklmIGFuIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fSwgdGhlbiBvbmx5IHRoZSBwYWNrYWdlIGZyYWdtZW50cyBvZgorCSAqIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmUgaW5jbHVkZWQuPC9wPgorCSAqIDxwPklmIGFuIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9LCB0aGVuIG9ubHkgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNsYXNzCisJICogZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzIHdpbGwgTk9UIGJlCiAJICogaW5jbHVkZWQuPC9wPgotCSAqIDxwPgotCSAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cywgdHJ1ZSkuPC9wPgorCSAqCisJICogPHA+SW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZyBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzLCB0cnVlKS48L3A+CiAJICoKIAkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIEphdmEgZWxlbWVudHMgdGhlIHNjb3BlIGlzIGxpbWl0ZWQgdG8KIAkgKiBAcmV0dXJuIGEgbmV3IEphdmEgc2VhcmNoIHNjb3BlCkBAIC0yMzYsMTggKzI2OCwxOCBAQAogCSAqIFJldHVybnMgYSBKYXZhIHNlYXJjaCBzY29wZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnRzLgogCSAqIFRoZSBKYXZhIGVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIGEgc2VhcmNoIHdpdGggdGhpcyBzY29wZSB3aWxsCiAJICogYmUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGVsZW1lbnRzLgotCSAqIAotCSAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSUphdmFQcm9qZWN0LCB0aGVuIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlcnMsIAotCSAqIGl0cyBqYXJzIChleHRlcm5hbCBhbmQgaW50ZXJuYWwpIGFuZCAtIGlmIHNwZWNpZmllZCAtIGl0cyByZWZlcmVuY2VkIHByb2plY3RzIAotCSAqICh3aXRoIHRoZWlyIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC4KLQkgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElQYWNrYWdlRnJhZ21lbnRSb290LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIG9mIAotCSAqIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmUgaW5jbHVkZWQuCi0JICogSWYgYW4gZWxlbWVudCBpcyBhbiBJUGFja2FnZUZyYWdtZW50LCB0aGVuIG9ubHkgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNsYXNzIAotCSAqIGZpbGVzIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCB3aWxsIGJlIGluY2x1ZGVkLiBTdWJwYWNrYWdlcyB3aWxsIE5PVCBiZSAKLQkgKiBpbmNsdWRlZC4KKwkgKgorCSAqIDxwPklmIGFuIGVsZW1lbnQgaXMgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0sIHRoZW4gdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVycywKKwkgKiBpdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgLSBpZiBzcGVjaWZpZWQgLSBpdHMgcmVmZXJlbmNlZCBwcm9qZWN0cworCSAqICh3aXRoIHRoZWlyIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC48L3A+CisJICogPHA+SWYgYW4gZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIG9mCisJICogdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2lsbCBiZSBpbmNsdWRlZC48L3A+CisJICogPHA+SWYgYW4gZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudH0sIHRoZW4gb25seSB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2xhc3MKKwkgKiBmaWxlcyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgd2lsbCBiZSBpbmNsdWRlZC4gU3VicGFja2FnZXMgd2lsbCBOT1QgYmUKKwkgKiBpbmNsdWRlZC48L3A+CiAJICoKIAkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIEphdmEgZWxlbWVudHMgdGhlIHNjb3BlIGlzIGxpbWl0ZWQgdG8KLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cyBhIGZsYWcgaW5kaWNhdGluZyBpZiByZWZlcmVuY2VkIHByb2plY3RzIG11c3QgYmUgCisJICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMgYSBmbGFnIGluZGljYXRpbmcgaWYgcmVmZXJlbmNlZCBwcm9qZWN0cyBtdXN0IGJlCiAJICogCQkJCQkJCQkJIHJlY3Vyc2l2ZWx5IGluY2x1ZGVkCiAJICogQHJldHVybiBhIG5ldyBKYXZhIHNlYXJjaCBzY29wZQogCSAqIEBzaW5jZSAyLjAKQEAgLTI2MCwyMyArMjkyLDI1IEBACiAJICogUmV0dXJucyBhIEphdmEgc2VhcmNoIHNjb3BlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIEphdmEgZWxlbWVudHMuCiAJICogVGhlIEphdmEgZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gYSBzZWFyY2ggd2l0aCB0aGlzIHNjb3BlIHdpbGwKIAkgKiBiZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudHMuCi0JICogCi0JICogSWYgYW4gZWxlbWVudCBpcyBhbiBJSmF2YVByb2plY3QsIHRoZW4gaXQgaW5jbHVkZXM6Ci0JICogLSBpdHMgc291cmNlIGZvbGRlcnMgaWYgSUphdmFTZWFyY2hTY29wZS5TT1VSQ0VTIGlzIHNwZWNpZmllZCwgCi0JICogLSBpdHMgYXBwbGljYXRpb24gbGlicmFyaWVzIChpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgamFycywgY2xhc3MgZm9sZGVycyB0aGF0IGFyZSBvbiB0aGUgcmF3IGNsYXNzcGF0aCwgCisJICoKKwkgKiA8cD5JZiBhbiBlbGVtZW50IGlzIGFuIElKYXZhUHJvamVjdCwgdGhlbiBpdCBpbmNsdWRlczo8L3A+CisJICogPHVsPgorCSAqIDxsaT5pdHMgc291cmNlIGZvbGRlcnMgaWYge0BsaW5rIElKYXZhU2VhcmNoU2NvcGUjU09VUkNFU30gaXMgc3BlY2lmaWVkLDwvbGk+CisJICogPGxpPml0cyBhcHBsaWNhdGlvbiBsaWJyYXJpZXMgKGludGVybmFsIGFuZCBleHRlcm5hbCBqYXJzLCBjbGFzcyBmb2xkZXJzIHRoYXQgYXJlIG9uIHRoZSByYXcgY2xhc3NwYXRoLAogCSAqICAgb3IgdGhlIG9uZXMgdGhhdCBhcmUgY29taW5nIGZyb20gYSBjbGFzc3BhdGggcGF0aCB2YXJpYWJsZSwKIAkgKiAgIG9yIHRoZSBvbmVzIHRoYXQgYXJlIGNvbWluZyBmcm9tIGEgY2xhc3NwYXRoIGNvbnRhaW5lciB3aXRoIHRoZSBLX0FQUExJQ0FUSU9OIGtpbmQpCi0JICogICBpZiBJSmF2YVNlYXJjaFNjb3BlLkFQUExJQ0FUSU9OX0xJQlJBUklFUyBpcyBzcGVjaWZpZWQKLQkgKiAtIGl0cyBzeXN0ZW0gbGlicmFyaWVzIChpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgamFycywgY2xhc3MgZm9sZGVycyB0aGF0IGFyZSBjb21pbmcgZnJvbSBhbiAKLQkgKiAgIElDbGFzc3BhdGhDb250YWluZXIgd2l0aCB0aGUgS19TWVNURU0ga2luZCkgCi0JICogICBpZiBJSmF2YVNlYXJjaFNjb3BlLkFQUExJQ0FUSU9OX0xJQlJBUklFUyBpcyBzcGVjaWZpZWQKLQkgKiAtIGl0cyByZWZlcmVuY2VkIHByb2plY3RzICh3aXRoIHRoZWlyIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgCi0JICogICBpZiBJSmF2YVNlYXJjaFNjb3BlLlJFRkVSRU5DRURfUFJPSkVDVFMgaXMgc3BlY2lmaWVkLgotCSAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VGcmFnbWVudFJvb3QsIHRoZW4gb25seSB0aGUgcGFja2FnZSBmcmFnbWVudHMgb2YgCi0JICogdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2lsbCBiZSBpbmNsdWRlZC4KLQkgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElQYWNrYWdlRnJhZ21lbnQsIHRoZW4gb25seSB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2xhc3MgCi0JICogZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzIHdpbGwgTk9UIGJlIAotCSAqIGluY2x1ZGVkLgorCSAqICAgaWYge0BsaW5rIElKYXZhU2VhcmNoU2NvcGUjQVBQTElDQVRJT05fTElCUkFSSUVTfSBpcyBzcGVjaWZpZWQ8L2xpPgorCSAqIDxsaT5pdHMgc3lzdGVtIGxpYnJhcmllcyAoaW50ZXJuYWwgYW5kIGV4dGVybmFsIGphcnMsIGNsYXNzIGZvbGRlcnMgdGhhdCBhcmUgY29taW5nIGZyb20gYW4KKwkgKiAgIElDbGFzc3BhdGhDb250YWluZXIgd2l0aCB0aGUgS19TWVNURU0ga2luZCkKKwkgKiAgIGlmIHtAbGluayBJSmF2YVNlYXJjaFNjb3BlI1NZU1RFTV9MSUJSQVJJRVN9IGlzIHNwZWNpZmllZDwvbGk+CisJICogPGxpPml0cyByZWZlcmVuY2VkIHByb2plY3RzICh3aXRoIHRoZWlyIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkKKwkgKiAgIGlmIHtAbGluayBJSmF2YVNlYXJjaFNjb3BlI1JFRkVSRU5DRURfUFJPSkVDVFN9IGlzIHNwZWNpZmllZC48L2xpPgorCSAqIDwvdWw+CisJICogPHA+SWYgYW4gZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIG9mCisJICogdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2lsbCBiZSBpbmNsdWRlZC48L3A+CisJICogPHA+SWYgYW4gZWxlbWVudCBpcyBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudH0sIHRoZW4gb25seSB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2xhc3MKKwkgKiBmaWxlcyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgd2lsbCBiZSBpbmNsdWRlZC4gU3VicGFja2FnZXMgd2lsbCBOT1QgYmUKKwkgKiBpbmNsdWRlZC48L3A+CiAJICoKIAkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIEphdmEgZWxlbWVudHMgdGhlIHNjb3BlIGlzIGxpbWl0ZWQgdG8KIAkgKiBAcGFyYW0gaW5jbHVkZU1hc2sgdGhlIGJpdC13aXNlIE9SIG9mIGFsbCBpbmNsdWRlIHR5cGVzIG9mIGludGVyZXN0CkBAIC0yOTAsNyArMzI0LDcgQEAKIAlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBpbnQgaW5jbHVkZU1hc2spIHsKIAkJcmV0dXJuIEJhc2ljU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cywgaW5jbHVkZU1hc2spOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiB0aGF0IGNvbWJpbmVzIHRoZSBnaXZlbiB0d28gcGF0dGVybnMgaW50byBhICJvciIgcGF0dGVybi4KIAkgKiBUaGUgc2VhcmNoIHJlc3VsdCB3aWxsIG1hdGNoIGVpdGhlciB0aGUgbGVmdCBwYXR0ZXJuIG9yIHRoZSByaWdodCBwYXR0ZXJuLgpAQCAtMzA2LDcgKzM0MCw3IEBACiAJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlT3JQYXR0ZXJuKGxlZnQsIHJpZ2h0KTsKIAkJcmV0dXJuIG5ldyBTZWFyY2hQYXR0ZXJuQWRhcHRlcihwYXR0ZXJuKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm5zIGEgc2VhcmNoIHBhdHRlcm4gYmFzZWQgb24gYSBnaXZlbiBzdHJpbmcgcGF0dGVybi4gVGhlIHN0cmluZyBwYXR0ZXJucyBzdXBwb3J0ICcqJyB3aWxkLWNhcmRzLgogCSAqIFRoZSByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBuYXJyb3cgZG93biB0aGUgdHlwZSBvZiBleHBlY3RlZCByZXN1bHRzLgpAQCAtMzYxLDkgKzM5NSw5IEBACiAJCWludCBtYXRjaFJ1bGUgPSBpc0Nhc2VTZW5zaXRpdmUgPyBtYXRjaE1vZGUgfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUgOiBtYXRjaE1vZGU7CiAJCXJldHVybiAgbmV3IFNlYXJjaFBhdHRlcm5BZGFwdGVyKFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihzdHJpbmdQYXR0ZXJuLCBzZWFyY2hGb3IsIGxpbWl0VG8sIG1hdGNoUnVsZSkpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiBiYXNlZCBvbiBhIGdpdmVuIEphdmEgZWxlbWVudC4gCisJICogUmV0dXJucyBhIHNlYXJjaCBwYXR0ZXJuIGJhc2VkIG9uIGEgZ2l2ZW4gSmF2YSBlbGVtZW50LgogCSAqIFRoZSBwYXR0ZXJuIGlzIHVzZWQgdG8gdHJpZ2dlciB0aGUgYXBwcm9wcmlhdGUgc2VhcmNoLCBhbmQgY2FuIGJlIHBhcmFtZXRlcml6ZWQgYXMgZm9sbG93czoKIAkgKgogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBKYXZhIGVsZW1lbnQgdGhlIHNlYXJjaCBwYXR0ZXJuIGlzIGJhc2VkIG9uCkBAIC0zOTAsNyArNDI0LDcgQEAKIAogCS8qKgogCSAqIENyZWF0ZSBhIHR5cGUgbmFtZSBtYXRjaCBvbiBhIGdpdmVuIHR5cGUgd2l0aCBzcGVjaWZpYyBtb2RpZmllcnMuCi0JICogCisJICoKIAkgKiBAcGFyYW0gdHlwZSBUaGUgamF2YSBtb2RlbCBoYW5kbGUgb2YgdGhlIHR5cGUKIAkgKiBAcGFyYW0gbW9kaWZpZXJzIE1vZGlmaWVycyBvZiB0aGUgdHlwZQogCSAqIEByZXR1cm4gQSBub24tbnVsbCBtYXRjaCBvbiB0aGUgZ2l2ZW4gdHlwZS4KQEAgLTQxMCw3ICs0NDQsNyBAQAogCX0KIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGRlZmF1bHQgSmF2YSBzZWFyY2ggcGFydGljaXBhbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgbmV3IGRlZmF1bHQgSmF2YSBzZWFyY2ggcGFydGljaXBhbnQKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC00MjAsMjQgKzQ1NCwyNCBAQAogCiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIHRoZSBKYXZhIGVsZW1lbnQgZGV0ZXJtaW5lZCBieSB0aGUgZ2l2ZW4gc2lnbmF0dXJlLiBUaGUgc2lnbmF0dXJlCi0JICogY2FuIGJlIGluY29tcGxldGUuIEZvciBleGFtcGxlLCBhIGNhbGwgbGlrZSAKKwkgKiBjYW4gYmUgaW5jb21wbGV0ZS4gRm9yIGV4YW1wbGUsIGEgY2FsbCBsaWtlCiAJICogPGNvZGU+c2VhcmNoKHdzLCAicnVuKCkiLCBNRVRIT0QsUkVGRVJFTkNFUywgY29sKTwvY29kZT4KIAkgKiBzZWFyY2hlcyBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG1ldGhvZCA8Y29kZT5ydW48L2NvZGU+LgogCSAqCiAJICogTm90ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIHBhdHRlcm4gd2lsbCBiZSBjYXNlIGluc2Vuc2l0aXZlLiBGb3Igc3BlY2lmeWluZyBjYXNlIHMKIAkgKiBzZW5zaXRpdmUgc2VhcmNoLCB1c2UgPGNvZGU+c2VhcmNoKHdvcmtzcGFjZSwgY3JlYXRlU2VhcmNoUGF0dGVybihwYXR0ZXJuU3RyaW5nLCBzZWFyY2hGb3IsIGxpbWl0VG8sIHRydWUpLCBzY29wZSwgcmVzdWx0Q29sbGVjdG9yKTs8L2NvZGU+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gd29ya3NwYWNlIHRoZSB3b3Jrc3BhY2UKIAkgKiBAcGFyYW0gcGF0dGVyblN0cmluZyB0aGUgcGF0dGVybiB0byBiZSBzZWFyY2hlZCBmb3IKIAkgKiBAcGFyYW0gc2VhcmNoRm9yIGEgaGludCB3aGF0IGtpbmQgb2YgSmF2YSBlbGVtZW50IHRoZSBzdHJpbmcgcGF0dGVybiByZXByZXNlbnRzLgogCSAqICBMb29rIGludG8ge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzfSBmb3IgdmFsaWQgdmFsdWVzCiAJICogQHBhcmFtIGxpbWl0VG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogCSAqCTx1bD4KLQkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjREVDTEFSQVRJT05TfTogc2VhcmNoIAorCSAqCSAgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNERUNMQVJBVElPTlN9OiBzZWFyY2gKIAkgKgkJICBmb3IgZGVjbGFyYXRpb25zIG9ubHkgPC9saT4KLQkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUkVGRVJFTkNFU306IHNlYXJjaCAKKwkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUkVGRVJFTkNFU306IHNlYXJjaAogCSAqCQkgIGZvciBhbGwgcmVmZXJlbmNlcyA8L2xpPgotCSAqCSAgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTExfT0NDVVJSRU5DRVN9OiBzZWFyY2ggCisJICoJICA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FMTF9PQ0NVUlJFTkNFU306IHNlYXJjaAogCSAqCQkgIGZvciBib3RoIGRlY2xhcmF0aW9ucyBhbmQgYWxsIHJlZmVyZW5jZXMgPC9saT4KIAkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSU1QTEVNRU5UT1JTfTogZm9yIHR5cGVzLCB3aWxsIGZpbmQgYWxsIHR5cGVzCiAJICoJCQl3aGljaCBkaXJlY3RseSBpbXBsZW1lbnQvZXh0ZW5kIGEgZ2l2ZW4gaW50ZXJmYWNlLjxicj4KQEAgLTQ0Niw3ICs0ODAsNyBAQAogCSAqCSAgPC9saT4KIAkgKiA8L3VsPgogCSAqIEBwYXJhbSBzY29wZSB0aGUgc2VhcmNoIHJlc3VsdCBoYXMgdG8gYmUgbGltaXRlZCB0byB0aGUgZ2l2ZW4gc2NvcGUKLQkgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQJIAorCSAqIEBwYXJhbSByZXN1bHRDb2xsZWN0b3IgYSBjYWxsYmFjayBvYmplY3QgdG8gd2hpY2ggZWFjaCBtYXRjaCBpcyByZXBvcnRlZAogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CiAJICoJPHVsPgogCSAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQ8L2xpPgpAQCAtNDU5LDEwICs0OTMsMTAgQEAKIAkJCQk/IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENICiAJCQkJOiBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0g7CiAJCQlzZWFyY2goCi0JCQkJU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHBhdHRlcm5TdHJpbmcsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFKSwgCi0JCQkJbmV3IFNlYXJjaFBhcnRpY2lwYW50W10ge2dldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpfSwgCi0JCQkJc2NvcGUsIAotCQkJCW5ldyBSZXN1bHRDb2xsZWN0b3JBZGFwdGVyKHJlc3VsdENvbGxlY3RvciksIAorCQkJCVNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihwYXR0ZXJuU3RyaW5nLCBzZWFyY2hGb3IsIGxpbWl0VG8sIG1hdGNoTW9kZSB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRSksCisJCQkJbmV3IFNlYXJjaFBhcnRpY2lwYW50W10ge2dldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpfSwKKwkJCQlzY29wZSwKKwkJCQluZXcgUmVzdWx0Q29sbGVjdG9yQWRhcHRlcihyZXN1bHRDb2xsZWN0b3IpLAogCQkJCXJlc3VsdENvbGxlY3Rvci5nZXRQcm9ncmVzc01vbml0b3IoKSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pCkBAIC00NzgsMTEgKzUxMiwxMSBAQAogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBKYXZhIGVsZW1lbnQgdG8gYmUgc2VhcmNoZWQgZm9yCiAJICogQHBhcmFtIGxpbWl0VG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogCSAqCTx1bD4KLQkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjREVDTEFSQVRJT05TfTogc2VhcmNoIAorCSAqCSAgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNERUNMQVJBVElPTlN9OiBzZWFyY2gKIAkgKgkJICBmb3IgZGVjbGFyYXRpb25zIG9ubHkgPC9saT4KLQkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUkVGRVJFTkNFU306IHNlYXJjaCAKKwkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUkVGRVJFTkNFU306IHNlYXJjaAogCSAqCQkgIGZvciBhbGwgcmVmZXJlbmNlcyA8L2xpPgotCSAqCSAgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTExfT0NDVVJSRU5DRVN9OiBzZWFyY2ggCisJICoJICA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FMTF9PQ0NVUlJFTkNFU306IHNlYXJjaAogCSAqCQkgIGZvciBib3RoIGRlY2xhcmF0aW9ucyBhbmQgYWxsIHJlZmVyZW5jZXMgPC9saT4KIAkgKgkgIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSU1QTEVNRU5UT1JTfTogZm9yIHR5cGVzLCB3aWxsIGZpbmQgYWxsIHR5cGVzCiAJICoJCQkJd2hpY2ggZGlyZWN0bHkgaW1wbGVtZW50L2V4dGVuZCBhIGdpdmVuIGludGVyZmFjZS48L2xpPgpAQCAtNTE4LDEwICs1NTIsMTAgQEAKIAlwdWJsaWMgdm9pZCBzZWFyY2goSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlzZWFyY2goCi0JCQkJKChTZWFyY2hQYXR0ZXJuQWRhcHRlcilzZWFyY2hQYXR0ZXJuKS5wYXR0ZXJuLCAKLQkJCQluZXcgU2VhcmNoUGFydGljaXBhbnRbXSB7Z2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCl9LCAKLQkJCQlzY29wZSwgCi0JCQkJbmV3IFJlc3VsdENvbGxlY3RvckFkYXB0ZXIocmVzdWx0Q29sbGVjdG9yKSwgCisJCQkJKChTZWFyY2hQYXR0ZXJuQWRhcHRlcilzZWFyY2hQYXR0ZXJuKS5wYXR0ZXJuLAorCQkJCW5ldyBTZWFyY2hQYXJ0aWNpcGFudFtdIHtnZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKX0sCisJCQkJc2NvcGUsCisJCQkJbmV3IFJlc3VsdENvbGxlY3RvckFkYXB0ZXIocmVzdWx0Q29sbGVjdG9yKSwKIAkJCQlyZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKQpAQCAtNTI5LDcgKzU2Myw3IEBACiAJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CiAJfQotCQorCiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIG1hdGNoZXMgb2YgYSBnaXZlbiBzZWFyY2ggcGF0dGVybi4gU2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGhlbHBlcgogCSAqIG1ldGhvZHMgKGZyb20gYSBTdHJpbmcgcGF0dGVybiBvciBhIEphdmEgZWxlbWVudCkgYW5kIGVuY2Fwc3VsYXRlIHRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IGlzCkBAIC01NTMsOCArNTg3LDggQEAKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIHRvcC1sZXZlbCB0eXBlcyBhbmQgbWVtYmVyIHR5cGVzIGluIHRoZSBnaXZlbiBzY29wZS4KIAkgKiBUaGUgc2VhcmNoIGNhbiBiZSBzZWxlY3Rpbmcgc3BlY2lmaWMgdHlwZXMgKGdpdmVuIGEgcGFja2FnZSBleGFjdCBmdWxsIG5hbWUgb3IKLQkgKiBhIHR5cGUgbmFtZSB3aXRoIHNwZWNpZmljIG1hdGNoIG1vZGUpLiAKLQkgKiAKKwkgKiBhIHR5cGUgbmFtZSB3aXRoIHNwZWNpZmljIG1hdGNoIG1vZGUpLgorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VFeGFjdE5hbWUgdGhlIGV4YWN0IHBhY2thZ2UgZnVsbCBuYW1lIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48YnI+CiAJICogCQkJCQlJZiB5b3Ugd2FudCB0byB1c2UgYSBwcmVmaXggb3IgYSB3aWxkLWNhcmRlZCBzdHJpbmcgZm9yIHBhY2thZ2UsIHlvdSBuZWVkIHRvIHVzZQogCSAqIAkJCQkJe0BsaW5rICNzZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdLCBpbnQsIGNoYXJbXSwgaW50LCBpbnQsIElKYXZhU2VhcmNoU2NvcGUsIFR5cGVOYW1lUmVxdWVzdG9yLCBpbnQsIElQcm9ncmVzc01vbml0b3IpfQpAQCAtNTY1LDE1ICs1OTksMjAgQEAKIAkgKgkJCQkJTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFueSB0eXBlIG5hbWUgaXMgYWNjZXB0ZWQuCiAJICogQHBhcmFtIG1hdGNoUnVsZSB0eXBlIG5hbWUgbWF0Y2ggcnVsZSBvbmUgb2YKIAkgKiA8dWw+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzCi0JICoJCQlvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcwotCSAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FNRUxDQVNFX01BVENIfSBpZiB0eXBlIG5hbWUgYXJlIGNhbWVsIGNhc2Ugb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZAorCSAqCQkJdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHRoZSB0eXBlIG5hbWUgaXMgYQorCSAqCQkJY2FtZWwgY2FzZSBvZiB0aGUgc2VhcmNoZWQgdHlwZXMgbmFtZS48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfQorCSAqCQkJaWYgdGhlIHR5cGUgbmFtZSBpcyBhIGNhbWVsIGNhc2Ugd2l0aCBzYW1lIHBhcnQgY291bnQgb2YgdGhlIHNlYXJjaGVkCisJICoJCQl0eXBlcyBuYW1lLjwvbGk+CiAJICogPC91bD4KIAkgKiBjb21iaW5lZCB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9LAotCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsIAorCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsCiAJICogICBvciB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZC4KIAkgKiBAcGFyYW0gc2VhcmNoRm9yIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgc2VhcmNoZWQgZWxlbWVudHMKIAkgKgk8dWw+CkBAIC01ODMsNyArNjIyLDcgQEAKIAkgKgkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTk5PVEFUSU9OX1RZUEV9OiBvbmx5IGxvb2sgZm9yIGFubm90YXRpb24gdHlwZTwvbGk+CiAJICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0VOVU19OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGVudW1lcmF0aW9uczwvbGk+CiAJICoJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0lOVEVSRkFDRX06IG9ubHkgbG9vayBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlczwvbGk+Ci0JICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVFlQRX06IGxvb2sgZm9yIGFsbCB0eXBlcyAoaWUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KKwkgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpLmUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KIAkgKgk8L3VsPgogCSAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgdG8gc2VhcmNoIGluCiAJICogQHBhcmFtIG5hbWVSZXF1ZXN0b3IgdGhlIHJlcXVlc3RvciB0aGF0IGNvbGxlY3RzIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2gKQEAgLTYwNiwyMyArNjQ1LDIzIEBACiAJICogCWluc3RlYWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCWZpbmFsIGNoYXJbXSBwYWNrYWdlRXhhY3ROYW1lLCAKKwkJZmluYWwgY2hhcltdIHBhY2thZ2VFeGFjdE5hbWUsCiAJCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKLQkJZmluYWwgaW50IG1hdGNoUnVsZSwgCi0JCWludCBzZWFyY2hGb3IsIAotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCAKKwkJZmluYWwgaW50IG1hdGNoUnVsZSwKKwkJaW50IHNlYXJjaEZvciwKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKIAkJZmluYWwgVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKIAkJaW50IHdhaXRpbmdQb2xpY3ksCiAJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQorCiAJCXNlYXJjaEFsbFR5cGVOYW1lcyhwYWNrYWdlRXhhY3ROYW1lLCBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsIHR5cGVOYW1lLCBtYXRjaFJ1bGUsIHNlYXJjaEZvciwgc2NvcGUsIG5hbWVSZXF1ZXN0b3IsIHdhaXRpbmdQb2xpY3ksIHByb2dyZXNzTW9uaXRvcik7CiAJfQogCiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAJICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2UgbmFtZSB1c2luZyBzcGVjaWZpYyBtYXRjaCBtb2RlCi0JICogYW5kL29yIGEgdHlwZSBuYW1lIHVzaW5nIGFub3RoZXIgc3BlY2lmaWMgbWF0Y2ggbW9kZSkuIAotCSAqIAorCSAqIGFuZC9vciBhIHR5cGUgbmFtZSB1c2luZyBhbm90aGVyIHNwZWNpZmljIG1hdGNoIG1vZGUpLgorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIHNlYXJjaGVkIHR5cGVzLCBvciBhIHByZWZpeCBmb3IgdGhpcwogCSAqCQkJCQkJcGFja2FnZSwgb3IgYSB3aWxkLWNhcmRlZCBzdHJpbmcgZm9yIHRoaXMgcGFja2FnZS4KIAkgKgkJCQkJCU1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhbnkgcGFja2FnZSBuYW1lIGlzIGFjY2VwdGVkLgpAQCAtNjMyLDI3ICs2NzEsMzcgQEAKIAkgKgkJCQkJTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFueSB0eXBlIG5hbWUgaXMgYWNjZXB0ZWQuCiAJICogQHBhcmFtIHBhY2thZ2VNYXRjaFJ1bGUgb25lIG9mCiAJICogPHVsPgotCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSB0aGUgZnVsbCBuYW1lcwotCSAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSBwcmVmaXhlcyBvZiB0aGUgbmFtZXMKLQkgKgkJCW9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgotCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgY29udGFpbiB3aWxkLWNhcmRzLjwvbGk+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9NQVRDSH0gaWYgdHlwZSBuYW1lIGFyZSBjYW1lbCBjYXNlIG9mIHRoZSBuYW1lcyBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KKwkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUKKwkgKgkJCW5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QUkVGSVhfTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUKKwkgKgkJCW5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcyBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KKwkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUEFUVEVSTl9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQKKwkgKgkJCXR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuPC9saT4KKwkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FNRUxDQVNFX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIGEKKwkgKgkJCWNhbWVsIGNhc2Ugb2YgdGhlIHNlYXJjaGVkIHR5cGVzIHBhY2thZ2UgbmFtZS48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfQorCSAqCQkJaWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBhIGNhbWVsIGNhc2Ugd2l0aCBzYW1lIHBhcnQgY291bnQgb2YgdGhlIHNlYXJjaGVkCisJICoJCQl0eXBlcyBwYWNrYWdlIG5hbWUuPC9saT4KIAkgKiA8L3VsPgogCSAqIGNvbWJpbmVkIHdpdGgge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0sCi0JICogICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwgCisJICogICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwKIAkgKiAgIG9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgogCSAqIEBwYXJhbSB0eXBlTWF0Y2hSdWxlIG9uZSBvZgogCSAqIDx1bD4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBhcmUgdGhlIGZ1bGwgbmFtZXMKLQkgKgkJCW9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgotCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QUkVGSVhfTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzCi0JICoJCQlvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUEFUVEVSTl9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy48L2xpPgotCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHR5cGUgbmFtZSBhcmUgY2FtZWwgY2FzZSBvZiB0aGUgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlCisJICoJCQluYW1lIGFyZSB0aGUgZnVsbCBuYW1lcyBvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KKwkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlCisJICoJCQluYW1lIGFyZSBwcmVmaXhlcyBvZiB0aGUgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kCisJICoJCQl0eXBlIG5hbWUgY29udGFpbiB3aWxkLWNhcmRzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9NQVRDSH0gaWYgdGhlIHR5cGUgbmFtZSBpcyBhCisJICoJCQljYW1lbCBjYXNlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcyBuYW1lLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9CisJICoJCQlpZiB0aGUgdHlwZSBuYW1lIGlzIGEgY2FtZWwgY2FzZSB3aXRoIHNhbWUgcGFydCBjb3VudCBvZiB0aGUgc2VhcmNoZWQKKwkgKgkJCXR5cGVzIG5hbWUuPC9saT4KIAkgKiA8L3VsPgogCSAqIGNvbWJpbmVkIHdpdGgge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0sCi0JICogICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwgCisJICogICBlLmcuIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwKIAkgKiAgIG9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgogCSAqIEBwYXJhbSBzZWFyY2hGb3IgZGV0ZXJtaW5lcyB0aGUgbmF0dXJlIG9mIHRoZSBzZWFyY2hlZCBlbGVtZW50cwogCSAqCTx1bD4KQEAgLTY2Miw3ICs3MTEsNyBAQAogCSAqCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FOTk9UQVRJT05fVFlQRX06IG9ubHkgbG9vayBmb3IgYW5ub3RhdGlvbiB0eXBlPC9saT4KIAkgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTU19BTkRfRU5VTX06IG9ubHkgbG9vayBmb3IgY2xhc3NlcyBhbmQgZW51bWVyYXRpb25zPC9saT4KIAkgKgkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTU19BTkRfSU5URVJGQUNFfTogb25seSBsb29rIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzPC9saT4KLQkgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpZS4gY2xhc3NlcywgaW50ZXJmYWNlcywgZW51bSBhbmQgYW5ub3RhdGlvbiB0eXBlcyk8L2xpPgorCSAqIAk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RZUEV9OiBsb29rIGZvciBhbGwgdHlwZXMgKGkuZS4gY2xhc3NlcywgaW50ZXJmYWNlcywgZW51bSBhbmQgYW5ub3RhdGlvbiB0eXBlcyk8L2xpPgogCSAqCTwvdWw+CiAJICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSB0byBzZWFyY2ggaW4KIAkgKiBAcGFyYW0gbmFtZVJlcXVlc3RvciB0aGUgcmVxdWVzdG9yIHRoYXQgY29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaApAQCAtNjgzLDE4ICs3MzIsMjYgQEAKIAkgKiBAc2luY2UgMy4zCiAJICovCiAJcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAotCQlmaW5hbCBjaGFyW10gcGFja2FnZU5hbWUsIAotCQlmaW5hbCBpbnQgcGFja2FnZU1hdGNoUnVsZSwgCisJCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJZmluYWwgaW50IHBhY2thZ2VNYXRjaFJ1bGUsCiAJCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKLQkJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsIAotCQlpbnQgc2VhcmNoRm9yLCAKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisJCWZpbmFsIGludCB0eXBlTWF0Y2hSdWxlLAorCQlpbnQgc2VhcmNoRm9yLAorCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCQlmaW5hbCBUeXBlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yLAogCQlpbnQgd2FpdGluZ1BvbGljeSwKIAkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJVHlwZU5hbWVSZXF1ZXN0b3JXcmFwcGVyIHJlcXVlc3RvcldyYXBwZXIgPSBuZXcgVHlwZU5hbWVSZXF1ZXN0b3JXcmFwcGVyKG5hbWVSZXF1ZXN0b3IpOwotCQl0aGlzLmJhc2ljRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyhwYWNrYWdlTmFtZSwgcGFja2FnZU1hdGNoUnVsZSwgdHlwZU5hbWUsIHR5cGVNYXRjaFJ1bGUsIHNlYXJjaEZvciwgc2NvcGUsIHJlcXVlc3RvcldyYXBwZXIsIHdhaXRpbmdQb2xpY3ksIHByb2dyZXNzTW9uaXRvcik7CisJCXRoaXMuYmFzaWNFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzKHBhY2thZ2VOYW1lLAorCQkJcGFja2FnZU1hdGNoUnVsZSwKKwkJCXR5cGVOYW1lLAorCQkJdHlwZU1hdGNoUnVsZSwKKwkJCXNlYXJjaEZvciwKKwkJCXNjb3BlLAorCQkJcmVxdWVzdG9yV3JhcHBlciwKKwkJCXdhaXRpbmdQb2xpY3ksCisJCQlwcm9ncmVzc01vbml0b3IpOwogCX0KIAogCS8qKgpAQCAtNzA1LDIxICs3NjIsMjYgQEAKIAkgKiBQcm92aWRlZCB7QGxpbmsgVHlwZU5hbWVNYXRjaFJlcXVlc3Rvcn0gcmVxdWVzdG9yIHdpbGwgY29sbGVjdCB7QGxpbmsgVHlwZU5hbWVNYXRjaH0KIAkgKiBtYXRjaGVzIGZvdW5kIGR1cmluZyB0aGUgc2VhcmNoLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBwYWNrYWdlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcywgb3IgYSBwcmVmaXggZm9yIHRoaXMKIAkgKgkJCQkJCXBhY2thZ2UsIG9yIGEgd2lsZC1jYXJkZWQgc3RyaW5nIGZvciB0aGlzIHBhY2thZ2UuCiAJICoJCQkJCQlNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYW55IHBhY2thZ2UgbmFtZSBpcyBhY2NlcHRlZC4KIAkgKiBAcGFyYW0gcGFja2FnZU1hdGNoUnVsZSBvbmUgb2YKIAkgKiA8dWw+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzCi0JICoJCQlvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcwotCSAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FNRUxDQVNFX01BVENIfSBpZiB0eXBlIG5hbWUgYXJlIGNhbWVsIGNhc2Ugb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZAorCSAqCQkJdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgaXMgYQorCSAqCQkJY2FtZWwgY2FzZSBvZiB0aGUgc2VhcmNoZWQgdHlwZXMgcGFja2FnZSBuYW1lLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9CisJICoJCQlpZiB0aGUgcGFja2FnZSBuYW1lIGlzIGEgY2FtZWwgY2FzZSB3aXRoIHNhbWUgcGFydCBjb3VudCBvZiB0aGUgc2VhcmNoZWQKKwkgKgkJCXR5cGVzIHBhY2thZ2UgbmFtZS48L2xpPgogCSAqIDwvdWw+CiAJICogY29tYmluZWQgd2l0aCB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBU0VfU0VOU0lUSVZFfSwKLQkgKiAgIGUuZy4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBU0VfU0VOU0lUSVZFfSBpZiBhbiBleGFjdCBhbmQgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLCAKKwkgKiAgIGUuZy4ge0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0NBU0VfU0VOU0lUSVZFfSBpZiBhbiBleGFjdCBhbmQgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLAogCSAqICAgb3Ige0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QUkVGSVhfTUFUQ0h9IGlmIGEgcHJlZml4IG5vbiBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQuCiAJICogQHBhcmFtIHR5cGVOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWFyY2hlZCB0eXBlICh0aGUgcXVhbGlmaWNhdGlvbiBpbmNsdWRlCiAJICoJCQkJCXRoZSBlbmNsb3NpbmcgdHlwZXMgaWYgdGhlIHNlYXJjaGVkIHR5cGUgaXMgYSBtZW1iZXIgdHlwZSksIG9yIGEgcHJlZml4CkBAIC03MjcsMTUgKzc4OSwyMCBAQAogCSAqCQkJCQlNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYW55IHR5cGUgbmFtZSBpcyBhY2NlcHRlZC4KIAkgKiBAcGFyYW0gdHlwZU1hdGNoUnVsZSBvbmUgb2YKIAkgKiA8dWw+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHRoZSBmdWxsIG5hbWVzCi0JICoJCQlvZiB0aGUgc2VhcmNoZWQgdHlwZXMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfUFJFRklYX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgYXJlIHByZWZpeGVzIG9mIHRoZSBuYW1lcwotCSAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+Ci0JICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BBVFRFUk5fTUFUQ0h9IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuPC9saT4KLQkgKgkJPGxpPntAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FNRUxDQVNFX01BVENIfSBpZiB0eXBlIG5hbWUgYXJlIGNhbWVsIGNhc2Ugb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9FWEFDVF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgdGhlIGZ1bGwgbmFtZXMgb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisJICoJCTxsaT57QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZQorCSAqCQkJbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZAorCSAqCQkJdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfTUFUQ0h9IGlmIHRoZSB0eXBlIG5hbWUgaXMgYQorCSAqCQkJY2FtZWwgY2FzZSBvZiB0aGUgc2VhcmNoZWQgdHlwZXMgbmFtZS48L2xpPgorCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfQorCSAqCQkJaWYgdGhlIHR5cGUgbmFtZSBpcyBhIGNhbWVsIGNhc2Ugd2l0aCBzYW1lIHBhcnQgY291bnQgb2YgdGhlIHNlYXJjaGVkCisJICoJCQl0eXBlcyBuYW1lLjwvbGk+CiAJICogPC91bD4KIAkgKiBjb21iaW5lZCB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9LAotCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsIAorCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsCiAJICogICBvciB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZC4KIAkgKiBAcGFyYW0gc2VhcmNoRm9yIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgc2VhcmNoZWQgZWxlbWVudHMKIAkgKgk8dWw+CkBAIC03NDUsNyArODEyLDcgQEAKIAkgKgkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTk5PVEFUSU9OX1RZUEV9OiBvbmx5IGxvb2sgZm9yIGFubm90YXRpb24gdHlwZTwvbGk+CiAJICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0VOVU19OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGVudW1lcmF0aW9uczwvbGk+CiAJICoJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0lOVEVSRkFDRX06IG9ubHkgbG9vayBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlczwvbGk+Ci0JICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVFlQRX06IGxvb2sgZm9yIGFsbCB0eXBlcyAoaWUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KKwkgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpLmUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KIAkgKgk8L3VsPgogCSAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgdG8gc2VhcmNoIGluCiAJICogQHBhcmFtIG5hbWVNYXRjaFJlcXVlc3RvciB0aGUge0BsaW5rIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgcmVxdWVzdG9yfSB0aGF0IGNvbGxlY3RzCkBAIC03NjcsMjQgKzgzNCwzMiBAQAogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwgCi0JCWZpbmFsIGludCBwYWNrYWdlTWF0Y2hSdWxlLCAKKwkJZmluYWwgY2hhcltdIHBhY2thZ2VOYW1lLAorCQlmaW5hbCBpbnQgcGFja2FnZU1hdGNoUnVsZSwKIAkJZmluYWwgY2hhcltdIHR5cGVOYW1lLAotCQlmaW5hbCBpbnQgdHlwZU1hdGNoUnVsZSwgCi0JCWludCBzZWFyY2hGb3IsIAotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCAKKwkJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsCisJCWludCBzZWFyY2hGb3IsCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCiAJCWZpbmFsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAogCQlpbnQgd2FpdGluZ1BvbGljeSwKIAkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCisKIAkJVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIgcmVxdWVzdG9yV3JhcHBlciA9IG5ldyBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlcihuYW1lTWF0Y2hSZXF1ZXN0b3IsIHNjb3BlKTsKLQkJdGhpcy5iYXNpY0VuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMocGFja2FnZU5hbWUsIHBhY2thZ2VNYXRjaFJ1bGUsIHR5cGVOYW1lLCB0eXBlTWF0Y2hSdWxlLCBzZWFyY2hGb3IsIHNjb3BlLCByZXF1ZXN0b3JXcmFwcGVyLCB3YWl0aW5nUG9saWN5LCBwcm9ncmVzc01vbml0b3IpOworCQl0aGlzLmJhc2ljRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyhwYWNrYWdlTmFtZSwKKwkJCXBhY2thZ2VNYXRjaFJ1bGUsCisJCQl0eXBlTmFtZSwKKwkJCXR5cGVNYXRjaFJ1bGUsCisJCQlzZWFyY2hGb3IsCisJCQlzY29wZSwKKwkJCXJlcXVlc3RvcldyYXBwZXIsCisJCQl3YWl0aW5nUG9saWN5LAorCQkJcHJvZ3Jlc3NNb25pdG9yKTsKIAl9CiAKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIHRvcC1sZXZlbCB0eXBlcyBhbmQgbWVtYmVyIHR5cGVzIGluIHRoZSBnaXZlbiBzY29wZSBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIHF1YWxpZmljYXRpb25zCiAJICogYW5kIHR5cGUgbmFtZXMgaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkuCi0JICogCisJICoKIAkgKiBAcGFyYW0gcXVhbGlmaWNhdGlvbnMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwYWNrYWdlL2VuY2xvc2luZyB0eXBlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KIAkgKgkJCQkJTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFueSBwYWNrYWdlIG5hbWUgaXMgYWNjZXB0ZWQuCiAJICogQHBhcmFtIHR5cGVOYW1lcyB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KQEAgLTgwOCw5ICs4ODMsOSBAQAogCSAqIEBzaW5jZSAzLjEKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCWZpbmFsIGNoYXJbXVtdIHF1YWxpZmljYXRpb25zLCAKKwkJZmluYWwgY2hhcltdW10gcXVhbGlmaWNhdGlvbnMsCiAJCWZpbmFsIGNoYXJbXVtdIHR5cGVOYW1lcywKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCiAJCWZpbmFsIFR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IsCiAJCWludCB3YWl0aW5nUG9saWN5LAogCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewpAQCAtODM0LDcgKzkwOSw3IEBACiAJICogUHJvdmlkZWQge0BsaW5rIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3J9IHJlcXVlc3RvciB3aWxsIGNvbGxlY3Qge0BsaW5rIFR5cGVOYW1lTWF0Y2h9CiAJICogbWF0Y2hlcyBmb3VuZCBkdXJpbmcgdGhlIHNlYXJjaC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcXVhbGlmaWNhdGlvbnMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwYWNrYWdlL2VuY2xvc2luZyB0eXBlIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KIAkgKgkJCQkJTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGFueSBwYWNrYWdlIG5hbWUgaXMgYWNjZXB0ZWQuCiAJICogQHBhcmFtIHR5cGVOYW1lcyB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KQEAgLTg1OSw5ICs5MzQsOSBAQAogCSAqIEBzaW5jZSAzLjMKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCWZpbmFsIGNoYXJbXVtdIHF1YWxpZmljYXRpb25zLCAKKwkJZmluYWwgY2hhcltdW10gcXVhbGlmaWNhdGlvbnMsCiAJCWZpbmFsIGNoYXJbXVtdIHR5cGVOYW1lcywKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCiAJCWZpbmFsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAogCQlpbnQgd2FpdGluZ1BvbGljeSwKIAkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTg4MSw4ICs5NTYsOCBAQAogCS8qKgogCSAqIFNlYXJjaGVzIGZvciBhbGwgdG9wLWxldmVsIHR5cGVzIGFuZCBtZW1iZXIgdHlwZXMgaW4gdGhlIGdpdmVuIHNjb3BlLgogCSAqIFRoZSBzZWFyY2ggY2FuIGJlIHNlbGVjdGluZyBzcGVjaWZpYyB0eXBlcyAoZ2l2ZW4gYSBwYWNrYWdlIG9yIGEgdHlwZSBuYW1lCi0JICogcHJlZml4IGFuZCBtYXRjaCBtb2RlcykuIAotCSAqIAorCSAqIHByZWZpeCBhbmQgbWF0Y2ggbW9kZXMpLgorCSAqCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIHNlYXJjaGVkIHR5cGVzLCBvciBhIHByZWZpeCBmb3IgdGhpcwogCSAqCQkJCQkJcGFja2FnZSwgb3IgYSB3aWxkLWNhcmRlZCBzdHJpbmcgZm9yIHRoaXMgcGFja2FnZS4KIAkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlYXJjaGVkIHR5cGUgKHRoZSBxdWFsaWZpY2F0aW9uIGluY2x1ZGUKQEAgLTg5Nyw3ICs5NzIsNyBAQAogCSAqCQk8bGk+e0BsaW5rIFNlYXJjaFBhdHRlcm4jUl9QQVRURVJOX01BVENIfSBpZiB0aGUgcGFja2FnZSBuYW1lIGFuZCB0eXBlIG5hbWUgY29udGFpbiB3aWxkLWNhcmRzLjwvbGk+CiAJICogPC91bD4KIAkgKiBjb21iaW5lZCB3aXRoIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9LAotCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsIAorCSAqICAgZS5nLiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VYQUNUX01BVENIfSB8IHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsCiAJICogICBvciB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZC4KIAkgKiBAcGFyYW0gc2VhcmNoRm9yIG9uZSBvZgogCSAqIDx1bD4KQEAgLTkyNSwxNSArMTAwMCwxNSBAQAogCSAqQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2VhcmNoQWxsVHlwZU5hbWVzKGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCwgSUphdmFTZWFyY2hTY29wZSwgVHlwZU5hbWVSZXF1ZXN0b3IsIGludCwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwgCisJCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKIAkJZmluYWwgY2hhcltdIHR5cGVOYW1lLAotCQlmaW5hbCBpbnQgbWF0Y2hSdWxlLCAKLQkJaW50IHNlYXJjaEZvciwgCi0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIAorCQlmaW5hbCBpbnQgbWF0Y2hSdWxlLAorCQlpbnQgc2VhcmNoRm9yLAorCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCQlmaW5hbCBJVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKIAkJaW50IHdhaXRpbmdQb2xpY3ksCiAJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQorCiAJCVR5cGVOYW1lUmVxdWVzdG9yQWRhcHRlciByZXF1ZXN0b3JBZGFwdGVyID0gbmV3IFR5cGVOYW1lUmVxdWVzdG9yQWRhcHRlcihuYW1lUmVxdWVzdG9yKTsKIAkJdGhpcy5iYXNpY0VuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMocGFja2FnZU5hbWUsIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCwgdHlwZU5hbWUsIG1hdGNoUnVsZSwgc2VhcmNoRm9yLCBzY29wZSwgcmVxdWVzdG9yQWRhcHRlciwgd2FpdGluZ1BvbGljeSwgcHJvZ3Jlc3NNb25pdG9yKTsKIAl9CkBAIC05NDEsOCArMTAxNiw4IEBACiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAJICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2Ugb3IgYSB0eXBlIG5hbWUKLQkgKiBwcmVmaXggYW5kIG1hdGNoIG1vZGVzKS4gCi0JICogCisJICogcHJlZml4IGFuZCBtYXRjaCBtb2RlcykuCisJICoKIAkgKiBAcGFyYW0gd29ya3NwYWNlIHRoZSB3b3Jrc3BhY2UgdG8gc2VhcmNoIGluCiAJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIHNlYXJjaGVkIHR5cGVzLCBvciBhIHByZWZpeCBmb3IgdGhpcwogCSAqCQkJCQkJcGFja2FnZSwgb3IgYSB3aWxkLWNhcmRlZCBzdHJpbmcgZm9yIHRoaXMgcGFja2FnZS4KQEAgLTk4NCwzMCArMTA1OSwzMCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKIAkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UsCi0JCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwgCisJCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKIAkJZmluYWwgY2hhcltdIHR5cGVOYW1lLAotCQlmaW5hbCBpbnQgbWF0Y2hNb2RlLCAKKwkJZmluYWwgaW50IG1hdGNoTW9kZSwKIAkJZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsCi0JCWludCBzZWFyY2hGb3IsIAotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCAKKwkJaW50IHNlYXJjaEZvciwKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKIAkJZmluYWwgSVR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IsCiAJCWludCB3YWl0aW5nUG9saWN5LAogCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKKwogCQlzZWFyY2hBbGxUeXBlTmFtZXMoCi0JCQlwYWNrYWdlTmFtZSwgCi0JCQl0eXBlTmFtZSwgCi0JCQlpc0Nhc2VTZW5zaXRpdmUgPyBtYXRjaE1vZGUgfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUgOiBtYXRjaE1vZGUsIAotCQkJc2VhcmNoRm9yLCAKLQkJCXNjb3BlLCAKLQkJCW5hbWVSZXF1ZXN0b3IsIAotCQkJd2FpdGluZ1BvbGljeSwgCisJCQlwYWNrYWdlTmFtZSwKKwkJCXR5cGVOYW1lLAorCQkJaXNDYXNlU2Vuc2l0aXZlID8gbWF0Y2hNb2RlIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFIDogbWF0Y2hNb2RlLAorCQkJc2VhcmNoRm9yLAorCQkJc2NvcGUsCisJCQluYW1lUmVxdWVzdG9yLAorCQkJd2FpdGluZ1BvbGljeSwKIAkJCXByb2dyZXNzTW9uaXRvcik7Ci0JfQkKKwl9CiAKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZmllbGRzIGFjY2Vzc2VkIGluIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQsIGEgc291cmNlIHR5cGUsIG9yIGEgc291cmNlIG1ldGhvZC4KKwkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0IG9yIGEgc291cmNlIHR5cGUvbWV0aG9kL2ZpZWxkLgogCSAqIFJlcG9ydHMgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgogCSAqIDxwPgogCSAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKQEAgLTEwMjcsMTIgKzExMDIsMTIgQEAKIAkgKgkJfQogCSAqIDwvcHJlPgogCSAqIDwvY29kZT4KLQkgKiB0aGVuIHNlYXJjaGluZyBmb3IgZGVjbGFyYXRpb25zIG9mIGFjY2Vzc2VkIGZpZWxkcyBpbiBtZXRob2QgCisJICogdGhlbiBzZWFyY2hpbmcgZm9yIGRlY2xhcmF0aW9ucyBvZiBhY2Nlc3NlZCBmaWVsZHMgaW4gbWV0aG9kCiAJICogPGNvZGU+WC50ZXN0KCk8L2NvZGU+IHdvdWxkIGNvbGxlY3QgdGhlIGZpZWxkcwogCSAqIDxjb2RlPkIudmFsdWU8L2NvZGU+IGFuZCA8Y29kZT5BLmZpZWxkMTwvY29kZT4uCiAJICogPC9wPgogCSAqCi0JICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIG1ldGhvZCwgdHlwZSwgb3IgY29tcGlsYXRpb24gdW5pdCB0byBiZSBzZWFyY2hlZCBpbgorCSAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBmaWVsZCwgbWV0aG9kLCB0eXBlLCBvciBjb21waWxhdGlvbiB1bml0IHRvIGJlIHNlYXJjaGVkIGluCiAJICogQHBhcmFtIHJlcXVlc3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCiAJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgpAQCAtMTA0MCwxMiArMTExNSwxMyBAQAogCSAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdDwvbGk+CiAJICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAJICoJPC91bD4KKwkgKkBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgaGFzIG5vdCB0aGUgcmlnaHQgdHlwZQogCSAqIEBzaW5jZSAzLjAKLQkgKi8JCisJICovCiAJcHVibGljIHZvaWQgc2VhcmNoRGVjbGFyYXRpb25zT2ZBY2Nlc3NlZEZpZWxkcyhJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5iYXNpY0VuZ2luZS5zZWFyY2hEZWNsYXJhdGlvbnNPZkFjY2Vzc2VkRmllbGRzKGVuY2xvc2luZ0VsZW1lbnQsIHJlcXVlc3RvciwgbW9uaXRvcik7CiAJfQotCQorCiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZpZWxkcyBhY2Nlc3NlZCBpbiB0aGUgZ2l2ZW4gZWxlbWVudC4KIAkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0LCBhIHNvdXJjZSB0eXBlLCBvciBhIHNvdXJjZSBtZXRob2QuCkBAIC0xMDY4LDcgKzExNDQsNyBAQAogCSAqCQl9CiAJICogPC9wcmU+CiAJICogPC9jb2RlPgotCSAqIHRoZW4gc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbnMgb2YgYWNjZXNzZWQgZmllbGRzIGluIG1ldGhvZCAKKwkgKiB0aGVuIHNlYXJjaGluZyBmb3IgZGVjbGFyYXRpb25zIG9mIGFjY2Vzc2VkIGZpZWxkcyBpbiBtZXRob2QKIAkgKiA8Y29kZT5YLnRlc3QoKTwvY29kZT4gd291bGQgY29sbGVjdCB0aGUgZmllbGRzCiAJICogPGNvZGU+Qi52YWx1ZTwvY29kZT4gYW5kIDxjb2RlPkEuZmllbGQxPC9jb2RlPi4KIAkgKiA8L3A+CkBAIC0xMDgyLDE1ICsxMTU4LDE1IEBACiAJICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAJICoJPC91bD4KIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICAjc2VhcmNoRGVjbGFyYXRpb25zT2ZBY2Nlc3NlZEZpZWxkcyhJSmF2YUVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQuCi0JICovCQorCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mQWNjZXNzZWRGaWVsZHMoSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybihlbmNsb3NpbmdFbGVtZW50KTsKIAkJdGhpcy5iYXNpY0VuZ2luZS5zZWFyY2hEZWNsYXJhdGlvbnMoZW5jbG9zaW5nRWxlbWVudCwgbmV3IFJlc3VsdENvbGxlY3RvckFkYXB0ZXIocmVzdWx0Q29sbGVjdG9yKSwgcGF0dGVybiwgcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgdHlwZXMgcmVmZXJlbmNlZCBpbiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0LCBhIHNvdXJjZSB0eXBlLCBvciBhIHNvdXJjZSBtZXRob2QuCisJICogVGhlIGVsZW1lbnQgY2FuIGJlIGEgY29tcGlsYXRpb24gdW5pdCBvciBhIHNvdXJjZSB0eXBlL21ldGhvZC9maWVsZC4KIAkgKiBSZXBvcnRzIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgogCSAqIDxwPgogCSAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKQEAgLTExMTUsNyArMTE5MSw3IEBACiAJICogd291bGQgY29sbGVjdCB0aGUgY2xhc3MgPGNvZGU+QjwvY29kZT4gYW5kIHRoZSBpbnRlcmZhY2UgPGNvZGU+STwvY29kZT4uCiAJICogPC9wPgogCSAqCi0JICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIG1ldGhvZCwgdHlwZSwgb3IgY29tcGlsYXRpb24gdW5pdCB0byBiZSBzZWFyY2hlZCBpbgorCSAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBmaWVsZCwgbWV0aG9kLCB0eXBlLCBvciBjb21waWxhdGlvbiB1bml0IHRvIGJlIHNlYXJjaGVkIGluCiAJICogQHBhcmFtIHJlcXVlc3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCiAJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgpAQCAtMTEyMywxMiArMTE5OSwxMyBAQAogCSAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdDwvbGk+CiAJICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAJICoJPC91bD4KKwkgKkBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgaGFzIG5vdCB0aGUgcmlnaHQgdHlwZQogCSAqIEBzaW5jZSAzLjAKLQkgKi8JCisJICovCiAJcHVibGljIHZvaWQgc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXRoaXMuYmFzaWNFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoZW5jbG9zaW5nRWxlbWVudCwgcmVxdWVzdG9yLCBtb25pdG9yKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgdHlwZXMgcmVmZXJlbmNlZCBpbiB0aGUgZ2l2ZW4gZWxlbWVudC4KIAkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0LCBhIHNvdXJjZSB0eXBlLCBvciBhIHNvdXJjZSBtZXRob2QuCkBAIC0xMTY1LDE1ICsxMjQyLDE1IEBACiAJICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAJICoJPC91bD4KIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyhJSmF2YUVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQuCi0JICovCQorCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuKGVuY2xvc2luZ0VsZW1lbnQpOwogCQl0aGlzLmJhc2ljRW5naW5lLnNlYXJjaERlY2xhcmF0aW9ucyhlbmNsb3NpbmdFbGVtZW50LCBuZXcgUmVzdWx0Q29sbGVjdG9yQWRhcHRlcihyZXN1bHRDb2xsZWN0b3IpLCBwYXR0ZXJuLCByZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCX0KLQkKKwogCS8qKgogCSAqIFNlYXJjaGVzIGZvciBhbGwgZGVjbGFyYXRpb25zIG9mIHRoZSBtZXRob2RzIGludm9rZWQgaW4gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlIGVsZW1lbnQgY2FuIGJlIGEgY29tcGlsYXRpb24gdW5pdCwgYSBzb3VyY2UgdHlwZSwgb3IgYSBzb3VyY2UgbWV0aG9kLgorCSAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBzb3VyY2UgdHlwZS9tZXRob2QvZmllbGQuCiAJICogUmVwb3J0cyB0aGUgbWV0aG9kIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgogCSAqIDxwPgogCSAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKQEAgLTExOTYsMTIgKzEyNzMsMTIgQEAKIAkgKgkJfQogCSAqIDwvcHJlPgogCSAqIDwvY29kZT4KLQkgKiB0aGVuIHNlYXJjaGluZyBmb3IgZGVjbGFyYXRpb25zIG9mIHNlbnQgbWVzc2FnZXMgaW4gbWV0aG9kIAorCSAqIHRoZW4gc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbnMgb2Ygc2VudCBtZXNzYWdlcyBpbiBtZXRob2QKIAkgKiA8Y29kZT5YLnRlc3QoKTwvY29kZT4gd291bGQgY29sbGVjdCB0aGUgbWV0aG9kcwogCSAqIDxjb2RlPkEuZm9vKCk8L2NvZGU+LCA8Y29kZT5CLmZvbygpPC9jb2RlPiwgYW5kIDxjb2RlPkEuYmFyKCk8L2NvZGU+LgogCSAqIDwvcD4KIAkgKgotCSAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBtZXRob2QsIHR5cGUsIG9yIGNvbXBpbGF0aW9uIHVuaXQgdG8gYmUgc2VhcmNoZWQgaW4KKwkgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgZmllbGQsIG1ldGhvZCwgdHlwZSBvciBjb21waWxhdGlvbiB1bml0IHRvIGJlIHNlYXJjaGVkIGluCiAJICogQHBhcmFtIHJlcXVlc3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCiAJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgpAQCAtMTIwOSw4ICsxMjg2LDkgQEAKIAkgKgkJPGxpPnRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3Q8L2xpPgogCSAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQ8L2xpPgogCSAqCTwvdWw+CisJICpAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGhhcyBub3QgdGhlIHJpZ2h0IHR5cGUKIAkgKiBAc2luY2UgMy4wCi0JICovCQorCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0aGlzLmJhc2ljRW5naW5lLnNlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKGVuY2xvc2luZ0VsZW1lbnQsIHJlcXVlc3RvciwgbW9uaXRvcik7CiAJfQpAQCAtMTI0MCw3ICsxMzE4LDcgQEAKIAkgKgkJfQogCSAqIDwvcHJlPgogCSAqIDwvY29kZT4KLQkgKiB0aGVuIHNlYXJjaGluZyBmb3IgZGVjbGFyYXRpb25zIG9mIHNlbnQgbWVzc2FnZXMgaW4gbWV0aG9kIAorCSAqIHRoZW4gc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbnMgb2Ygc2VudCBtZXNzYWdlcyBpbiBtZXRob2QKIAkgKiA8Y29kZT5YLnRlc3QoKTwvY29kZT4gd291bGQgY29sbGVjdCB0aGUgbWV0aG9kcwogCSAqIDxjb2RlPkEuZm9vKCk8L2NvZGU+LCA8Y29kZT5CLmZvbygpPC9jb2RlPiwgYW5kIDxjb2RlPkEuYmFyKCk8L2NvZGU+LgogCSAqIDwvcD4KQEAgLTEyNTQsNyArMTMzMiw3IEBACiAJICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAJICoJPC91bD4KIAkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZWFyY2hEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcyhJSmF2YUVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcil9IGluc3RlYWQuCi0JICovCQorCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4oZW5jbG9zaW5nRWxlbWVudCk7CiAJCXRoaXMuYmFzaWNFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zKGVuY2xvc2luZ0VsZW1lbnQsIG5ldyBSZXN1bHRDb2xsZWN0b3JBZGFwdGVyKHJlc3VsdENvbGxlY3RvciksIHBhdHRlcm4sIHJlc3VsdENvbGxlY3Rvci5nZXRQcm9ncmVzc01vbml0b3IoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKaW5kZXggMmQzNGQ3OC4uY2NhYTc3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hNYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw3ICsxNiw3IEBACiAKIC8qKgogICogQSBzZWFyY2ggbWF0Y2ggcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgc2VhcmNoIHF1ZXJ5LgotICogCisgKgogICogU2VhcmNoIG1hdGNoZXMgbWF5IGJlIGFjY3VyYXRlICg8Y29kZT5BX0FDQ1VSQVRFPC9jb2RlPikgb3IgdGhleSBtaWdodCBiZQogICogbWVyZWx5IHBvdGVudGlhbCBtYXRjaGVzICg8Y29kZT5BX0lOQUNDVVJBVEU8L2NvZGU+KS4gVGhlIGxhdHRlciBvY2N1cnMgd2hlbgogICogYSBjb21waWxlLXRpbWUgcHJvYmxlbSBwcmV2ZW50cyB0aGUgc2VhcmNoIGVuZ2luZSBmcm9tIGNvbXBsZXRlbHkgcmVzb2x2aW5nCkBAIC0yNCwxNSArMjQsMTUgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaChTZWFyY2hQYXR0ZXJuLCBTZWFyY2hQYXJ0aWNpcGFudFtdLCBJSmF2YVNlYXJjaFNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQogICogQHNpbmNlIDMuMAogICovCiBwdWJsaWMgY2xhc3MgU2VhcmNoTWF0Y2ggewotCQorCiAJLyoqCiAJICogVGhlIHNlYXJjaCByZXN1bHQgY29ycmVzcG9uZHMgYW4gZXhhY3QgbWF0Y2ggb2YgdGhlIHNlYXJjaCBwYXR0ZXJuLgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0QWNjdXJhY3koKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfQUNDVVJBVEUgPSAwOwpAQCAtNDEsNyArNDEsNyBAQAogCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIHBvdGVudGlhbGx5IGEgbWF0Y2ggZm9yIHRoZSBzZWFyY2ggcGF0dGVybiwKIAkgKiBidXQgdGhlIHNlYXJjaCBlbmdpbmUgaXMgdW5hYmxlIHRvIGZ1bGx5IGNoZWNrIGl0IChmb3IgZXhhbXBsZSwgYmVjYXVzZQogCSAqIHRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIGNvZGUgb3IgdGhlIGNsYXNzcGF0aCBhcmUgbm90IGNvcnJlY3RseSBzZXQpLgotCSAqIAorCSAqCiAJICogQHNlZSAjZ2V0QWNjdXJhY3koKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfSU5BQ0NVUkFURSA9IDE7CkBAIC01MSwxNyArNTEsMTcgQEAKIAlwcml2YXRlIGludCBvZmZzZXQ7CiAKIAlwcml2YXRlIGludCBhY2N1cmFjeTsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50OwkKKwlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50OwogCXByaXZhdGUgSVJlc291cmNlIHJlc291cmNlOwogCiAJcHJpdmF0ZSBib29sZWFuIGluc2lkZURvY0NvbW1lbnQgPSBmYWxzZTsKLQkKKwogCS8vIHN0b3JlIHRoZSBydWxlIHVzZWQgd2hpbGUgcmVwb3J0aW5nIHRoZSBtYXRjaAogCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBTExfR0VORVJJQ19GTEFWT1JTID0gU2VhcmNoUGF0dGVybi5SX0ZVTExfTUFUQ0ggfAogCQkJCQkJCQlTZWFyY2hQYXR0ZXJuLlJfRVFVSVZBTEVOVF9NQVRDSCB8CiAJCQkJCQkJCVNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIOwogCXByaXZhdGUgaW50IHJ1bGUgPSBBTExfR0VORVJJQ19GTEFWT1JTOwotCQorCiAJLy8gc3RvcmUgb3RoZXIgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCiAJcHJpdmF0ZSBib29sZWFuIHJhdyA9IGZhbHNlOwogCXByaXZhdGUgYm9vbGVhbiBpbXBsaWNpdCA9IGZhbHNlOwpAQCAtNzEsNyArNzEsNyBAQAogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCA8Y29kZT5pc0luc2lkZURvY0NvbW1lbnQoKTwvY29kZT4gZGVmYXVsdHMgdG8gZmFsc2UuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBlbmNsb3NlcyBvciBjb3JyZXNwb25kcyB0byB0aGUgbWF0Y2gsCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KQEAgLTgzLDkgKzgzLDkgQEAKIAlwdWJsaWMgU2VhcmNoTWF0Y2goCiAJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKIAkJCWludCBhY2N1cmFjeSwKLQkJCWludCBvZmZzZXQsICAKKwkJCWludCBvZmZzZXQsCiAJCQlpbnQgbGVuZ3RoLAotCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIAorCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsCiAJCQlJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKIAkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGFjY3VyYWN5IG9mIHRoaXMgc2VhcmNoIG1hdGNoLgotCSAqIAorCSAqCiAJICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KIAkgKi8KIAlwdWJsaWMgZmluYWwgaW50IGdldEFjY3VyYWN5KCkgewpAQCAtMTE1LDcgKzExNSw3IEBACiAJICogUmV0dXJucyB0aGUgZWxlbWVudCBvZiB0aGlzIHNlYXJjaCBtYXRjaC4KIAkgKiBJbiBjYXNlIG9mIGEgcmVmZXJlbmNlIG1hdGNoLCB0aGlzIGlzIHRoZSBpbm5lci1tb3N0IGVuY2xvc2luZyBlbGVtZW50IG9mIHRoZSByZWZlcmVuY2UuCiAJICogSW4gY2FzZSBvZiBhIGRlY2xhcmF0aW9uIG1hdGNoLCB0aGlzIGlzIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgb2YgdGhlIHNlYXJjaCBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqLwogCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0RWxlbWVudCgpIHsKQEAgLTEyNCwzNCArMTI0LDM0IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBzZWFyY2ggbWF0Y2guCi0JICogCisJICoKIAkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhpcyBzZWFyY2ggbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KIAkgKi8KIAlwdWJsaWMgZmluYWwgaW50IGdldExlbmd0aCgpIHsKIAkJcmV0dXJuIHRoaXMubGVuZ3RoOwogCX0KLQkKKwogCS8qKgogCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGlzIHNlYXJjaCBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGlzIHNlYXJjaCBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgogCSAqLwogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewogCQlyZXR1cm4gdGhpcy5vZmZzZXQ7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IHdoaWNoIGlzc3VlZCB0aGlzIHNlYXJjaCBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHBhcnRpY2lwYW50IHdoaWNoIGlzc3VlZCB0aGlzIHNlYXJjaCBtYXRjaAogCSAqLwogCXB1YmxpYyBmaW5hbCBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKIAkJcmV0dXJuIHRoaXMucGFydGljaXBhbnQ7CiAJfQotCQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgcmVzb3VyY2UgY29udGFpbmluZyB0aGlzIHNlYXJjaCBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9mIHRoZSBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqLwogCXB1YmxpYyBmaW5hbCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHJ1bGUgdXNlZCB3aGlsZSBjcmVhdGluZyB0aGUgbWF0Y2guCi0JICogCisJICoKIAkgKiBAcmV0dXJuIG9uZSBvZiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0ZVTExfTUFUQ0h9LCB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VRVUlWQUxFTlRfTUFUQ0h9CiAJICogCW9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVJBU1VSRV9NQVRDSH0KIAkgKiBAc2luY2UgMy4xCkBAIC0xNzIsOCArMTcyLDggQEAKIAkvKioKIAkgKiBSZXR1cm5zIHdoZXRoZXIgbWF0Y2ggZWxlbWVudCBpcyBjb21wYXRpYmxlIHdpdGggc2VhcmNoZWQgcGF0dGVybiBvciBub3QuCiAJICogTm90ZSB0aGF0IGVxdWl2YWxlbnQgbWF0Y2hlcyBhcmUgYWxzbyBlcmFzdXJlIG9uZXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXRjaCBlbGVtZW50IGlzIGNvbXBhdGlibGUgCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1hdGNoIGVsZW1lbnQgaXMgY29tcGF0aWJsZQogCSAqIAkJCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICogQHNpbmNlIDMuMQogCSAqLwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJICogUmV0dXJucyB3aGV0aGVyIG1hdGNoIGVsZW1lbnQgb25seSBoYXMgc2FtZSBlcmFzdXJlIHRoYW4gc2VhcmNoZWQgcGF0dGVybiBvciBub3QuCiAJICogTm90ZSB0aGF0IHRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIGJvdGggZ2VuZXJpYyBhbmQgbm9uLWdlbmVyaWMgZWxlbWVudCBhcyBzb29uCiAJICogYXMgdGhlIGFjY3VyYWN5IGlzIGFjY3VyYXRlLgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXRjaCBlbGVtZW50IGhhcyBzYW1lIGVyYXN1cmUKIAkgKiAJCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjEKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciBlbGVtZW50IG1hdGNoZXMgZXhhY3RseSBzZWFyY2hlZCBwYXR0ZXJuIG9yIG5vdC4KIAkgKiBOb3RlIHRoYXQgZXhhY3QgbWF0Y2hlcyBhcmUgYWxzbyBlcmFzdXJlIGFuZCBlcXVpdmFsZW50IG9uZXMuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1hdGNoIGlzIGV4YWN0CiAJICogCQkJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4xCkBAIC0yMDgsMTAgKzIwOCwxMCBAQAogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgaXMgaW1wbGljaXQgb3Igbm90LgotCSAqIAorCSAqCiAJICogTm90ZSB0aGF0IHRoaXMgcGllY2Ugb2YgaW5mb3JtYXRpb24gaXMgY3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQKIAkgKiBmb3IgaW1wbGljaXQgbWVtYmVyIHBhaXIgdmFsdWUgaW4gYW5ub3RhdGlvbi4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtYXRjaCBpcyBhc3NvY2lhdGVkIHRvIGFuIGltcGxpY2l0CiAJICogZWxlbWVudCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjEKQEAgLTIyMiw3ICsyMjIsNyBAQAogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgaXMgYSByYXcgdHlwZS9tZXRob2Qgb3Igbm90LgotCSAqIAorCSAqCiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1hdGNoIGlzIGFzc29jaWF0ZWQgdG8gYSByYXcKIAkgKiB0eXBlIG9yIG1ldGhvZCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQogCSAqIEBzaW5jZSAzLjEKQEAgLTIzNCw3ICsyMzQsNyBAQAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlYXJjaCBtYXRjaCBpcyBpbnNpZGUgYSBkb2MgY29tbWVudCBvZiBhIEphdmEKIAkgKiBzb3VyY2UgZmlsZS4KLQkgKiAKKwkgKgogCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jCiAJICogY29tbWVudCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgYWNjdXJhY3kgb2YgdGhpcyBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KIAkgKi8KIAlwdWJsaWMgZmluYWwgdm9pZCBzZXRBY2N1cmFjeSAoaW50IGFjY3VyYWN5KSB7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAogCS8qKgogCSAqIFNldHMgdGhlIGVsZW1lbnQgb2YgdGhpcyBzZWFyY2ggbWF0Y2guCi0JICogCisJICoKIAkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IGVuY2xvc2VzIG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRjaCwKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKioKIAkgKiBTZXRzIHdoZXRoZXIgdGhpcyBzZWFyY2ggbWF0Y2ggaXMgaW5zaWRlIGEgZG9jIGNvbW1lbnQgb2YgYSBKYXZhCiAJICogc291cmNlIGZpbGUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gaW5zaWRlRG9jIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VhcmNoIG1hdGNoIGlzIGluc2lkZSBhIGRvYwogCSAqIGNvbW1lbnQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkgKiBTZXRzIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBpcyBpbXBsaWNpdCBvciBub3QuCiAJICogVHlwaWNhbGx5LCB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gbWF0Y2ggaXMgb24gYW4gaW1wbGljaXQgY29uc3RydWN0b3IKIAkgKiBvciBhbiBpbXBsaWNpdCBtZW1iZXIgcGFpciB2YWx1ZSBpbiBhbm5vdGF0aW9uLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGltcGxpY2l0IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbWF0Y2ggaXMgYXNzb2NpYXRlZCB0byBhbiBpbXBsaWNpdAogCSAqIGVsZW1lbnQgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4xCkBAIC0yODgsMTYgKzI4OCwxNiBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoaXMgc2VhcmNoIG1hdGNoLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCwgb3IgLTEgaWYgdW5rbm93bgogCSAqLwogCXB1YmxpYyBmaW5hbCB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7CiAJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwogCX0KLQkKKwogCS8qKgogCSAqIFNldHMgdGhlIG9mZnNldCBvZiB0aGlzIHNlYXJjaCBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCiAJICovCiAJcHVibGljIGZpbmFsIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKQEAgLTMwNiw3ICszMDYsNyBAQAogCiAJLyoqCiAJICogU2V0cyB0aGUgcGFydGljaXBhbnQgb2YgdGhpcyBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYXJ0aWNpcGFudCB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIG1hdGNoCiAJICovCiAJcHVibGljIGZpbmFsIHZvaWQgc2V0UGFydGljaXBhbnQgKFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAogCS8qKgogCSAqIFNldHMgdGhlIHJlc291cmNlIG9mIHRoaXMgbWF0Y2guCi0JICogCisJICoKIAkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqLwogCXB1YmxpYyBmaW5hbCB2b2lkIHNldFJlc291cmNlIChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKQEAgLTMyNCw3ICszMjQsNyBAQAogCiAJLyoqCiAJICogU2V0IHRoZSBydWxlIHVzZWQgd2hpbGUgcmVwb3J0aW5nIHRoZSBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBydWxlIG9uZSBvZiB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0ZVTExfTUFUQ0h9LCB7QGxpbmsgU2VhcmNoUGF0dGVybiNSX0VRVUlWQUxFTlRfTUFUQ0h9CiAJICogCW9yIHtAbGluayBTZWFyY2hQYXR0ZXJuI1JfRVJBU1VSRV9NQVRDSH0KIAkgKiBAc2luY2UgMy4xCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogCS8qKgogCSAqIFNldCB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgaXMgYSByYXcgdHlwZS9tZXRob2Qgb3Igbm90LgotCSAqIAorCSAqCiAJICogQHBhcmFtIHJhdyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaCBpcyBhc3NvY2lhdGVkIHRvIGEgcmF3CiAJICogdHlwZSBvciBtZXRob2QgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKiBAc2luY2UgMy4xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhcnRpY2lwYW50LmphdmEKaW5kZXggNmY3ZGJkNi4uNGUzZjZjNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoUGFydGljaXBhbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw4ICsxMSw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CkBAIC0yMyw3ICsyMSw3IEBACiAgKiBtZWNoYW5pc20sIHBlcm1pdHRpbmcgY29tYmluZWQgc2VhcmNoIGFjdGlvbnMgd2hpY2ggd2lsbCBpbnZvbHZlIGFsbCByZXF1aXJlZAogICogcGFydGljaXBhbnRzLgogICogPHA+Ci0gKiBBIHNlYXJjaCBwYXJ0aWNpcGFudCBpcyBpbnZvbHZlZCBpbiB0aGUgaW5kZXhpbmcgcGhhc2UgYW5kIGluIHRoZSBzZWFyY2ggcGhhc2UuIAorICogQSBzZWFyY2ggcGFydGljaXBhbnQgaXMgaW52b2x2ZWQgaW4gdGhlIGluZGV4aW5nIHBoYXNlIGFuZCBpbiB0aGUgc2VhcmNoIHBoYXNlLgogICogVGhlIGluZGV4aW5nIHBoYXNlIGNvbnNpc3RzIGluIHRha2luZyBvbmUgb3IgbW9yZSBzZWFyY2ggZG9jdW1lbnRzLCBwYXJzZSB0aGVtLCBhbmQKICAqIGFkZCBpbmRleCBlbnRyaWVzIGluIGFuIGluZGV4IGNob3NlbiBieSB0aGUgcGFydGljaXBhbnQuIEFuIGluZGV4IGlzIGlkZW50aWZpZWQgYnkgYQogICogcGF0aCBvbiBkaXNrLgpAQCAtMzMsNyArMzEsNyBAQAogICogZmluYWxseSB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IGlzIGFza2VkIHRvIGxvY2F0ZSB0aGUgbWF0Y2hlcyBwcmVjaXNlbHkgaW4gdGhlc2Ugc2VhcmNoIGRvY3VtZW50cy4KICAqIDwvcD4KICAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIER1cmluZyB0aGUgaW5kZXhpbmcgcGhhc2UsIAorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIER1cmluZyB0aGUgaW5kZXhpbmcgcGhhc2UsCiAgKiBhIHN1YmNsYXNzIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1ZXN0cyBpbiBvcmRlcjoKICAqIDx1bD4KICAqIDxsaT57QGxpbmsgI3NjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhTZWFyY2hEb2N1bWVudCwgSVBhdGgpfTwvbGk+CkBAIC00NiwxOCArNDQsMjAgQEAKICAqIDxsaT57QGxpbmsgI2xvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRbXSwgU2VhcmNoUGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSwgU2VhcmNoUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKX08L2xpPgogICogPC91bD4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaFBhcnRpY2lwYW50IHsKIAorCXByaXZhdGUgSVBhdGggbGFzdEluZGV4TG9jYXRpb247CisKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBwYXJ0aWNpcGFudC4KIAkgKi8KIAlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnQoKSB7CiAJCS8vIGRvIG5vdGhpbmcKIAl9Ci0JCisKIAkvKioKIAkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGlzIHBhcnRpY2lwYW50J3MgaGVscCBpcyBuZWVkZWQgaW4gYSBzZWFyY2guCiAJICogPHA+CkBAIC04MywxMCArODMsMTAgQEAKIAkvKioKIAkgKiBSZXR1cm5zIGEgZGlzcGxheWFibGUgbmFtZSBvZiB0aGlzIHNlYXJjaCBwYXJ0aWNpcGFudC4KIAkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlLWltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvCiAJICogZGlzcGxheSBhIG1lYW5pbmdmdWxsIG5hbWUuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHJldHVybiB0aGUgZGlzcGxheWFibGUgbmFtZSBvZiB0aGlzIHNlYXJjaCBwYXJ0aWNpcGFudAogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CkBAIC05OCwxMCArOTgsMTAgQEAKIAkgKiBUaGUgZ2l2ZW4gZG9jdW1lbnQgcGF0aCBpcyBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGRvY3VtZW50LgogCSAqIE1vc3Qgb2YgdGhlIHRpbWUgaXQgaXMgYSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCwgYnV0IGl0IGNhbiBhbHNvIGJlIGEgZmlsZSBzeXN0ZW0gcGF0aCwgb3IgYSBwYXRoIGluc2lkZSBhIHppcCBmaWxlLgogCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBjYW4gZWl0aGVyIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGVpciBvd24gc3ViY2xhc3Mgb2YgCisJICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZWlyIG93biBzdWJjbGFzcyBvZgogCSAqIHtAbGluayBTZWFyY2hEb2N1bWVudH0gb3IgcmV0dXJuIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIHN1Y2ggYSBzdWJjbGFzcy4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoIHRoZSBwYXRoIG9mIHRoZSBkb2N1bWVudC4KIAkgKiBAcmV0dXJuIGEgc2VhcmNoIGRvY3VtZW50CiAJICovCkBAIC0xMDksMTQgKzEwOSwxNCBAQAogCiAJLyoqCiAJICogSW5kZXhlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgaW4gdGhlIGdpdmVuIGluZGV4LiBBIHNlYXJjaCBwYXJ0aWNpcGFudAotCSAqIGFza2VkIHRvIGluZGV4IGEgZG9jdW1lbnQgc2hvdWxkIHBhcnNlIGl0IGFuZCBjYWxsIAorCSAqIGFza2VkIHRvIGluZGV4IGEgZG9jdW1lbnQgc2hvdWxkIHBhcnNlIGl0IGFuZCBjYWxsCiAJICoge0BsaW5rIFNlYXJjaERvY3VtZW50I2FkZEluZGV4RW50cnkoY2hhcltdLCBjaGFyW10pfSBhcyBtYW55IHRpbWVzIGFzCiAJICogbmVlZGVkIHRvIGFkZCBpbmRleCBlbnRyaWVzIHRvIHRoZSBpbmRleC4gSWYgZGVsZWdhdGluZyB0byBhbm90aGVyCiAJICogcGFydGljaXBhbnQsIGl0IHNob3VsZCB1c2UgdGhlIG9yaWdpbmFsIGluZGV4IGxvY2F0aW9uIChhbmQgbm90IHRoZQogCSAqIGRlbGVnYXRlZSdzIG9uZSkuIEluIHRoZSBwYXJ0aWN1bGFyIGNhc2Ugb2YgZGVsZWdhdGluZyB0byB0aGUgZGVmYXVsdAogCSAqIHNlYXJjaCBwYXJ0aWNpcGFudCAoc2VlIHtAbGluayBTZWFyY2hFbmdpbmUjZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCl9KSwKLQkgKiB0aGUgcHJvdmlkZWQgZG9jdW1lbnQncyBwYXRoIG11c3QgYmUgYSBwYXRoIGVuZGluZyB3aXRoIG9uZSBvZiB0aGUgCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlI2dldEphdmFMaWtlRXh0ZW5zaW9ucygpIEphdmEtbGlrZSBleHRlbnNpb25zfSAKKwkgKiB0aGUgcHJvdmlkZWQgZG9jdW1lbnQncyBwYXRoIG11c3QgYmUgYSBwYXRoIGVuZGluZyB3aXRoIG9uZSBvZiB0aGUKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmUjZ2V0SmF2YUxpa2VFeHRlbnNpb25zKCkgSmF2YS1saWtlIGV4dGVuc2lvbnN9CiAJICogb3Igd2l0aCAnLmNsYXNzJy4KIAkgKiA8cD4KIAkgKiBUaGUgZ2l2ZW4gaW5kZXggbG9jYXRpb24gbXVzdCByZXByZXNlbnQgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSB0byBhIGZpbGUgdGhhdApAQCAtMTI1LDcgKzEyNSw3IEBACiAJICogPC9wPjxwPgogCSAqIENsaWVudHMgYXJlIG5vdCBleHBlY3RlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdG8gaW5kZXgKIAkgKiBAcGFyYW0gaW5kZXhMb2NhdGlvbiB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgc3lzdGVtIHRvIHRoZSBpbmRleAogCSAqLwpAQCAtMTM3LDE4ICsxMzcsMTggQEAKIAkgKiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZWFyY2ggZW5naW5lIG9uY2UgaXQgaGFzIHNlYXJjaCBkb2N1bWVudHMKIAkgKiBtYXRjaGluZyB0aGUgZ2l2ZW4gcGF0dGVybiBpbiB0aGUgZ2l2ZW4gc2VhcmNoIHNjb3BlLgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBhIHBhcnRpY2lwYW50IChlLmcuIGEgSlNQIHBhcnRpY2lwYW50KSBjYW4gcHJlLXByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkb2N1bWVudHMsIAotCSAqIGNyZWF0ZSBpdHMgb3duIGRvY3VtZW50cyB3aG9zZSBjb250ZW50cyBhcmUgSmF2YSBjb21waWxhdGlvbiB1bml0cyBhbmQgZGVsZWdhdGUgdGhlIG1hdGNoIGxvY2F0aW9uIAorCSAqIE5vdGUgdGhhdCBhIHBhcnRpY2lwYW50IChlLmcuIGEgSlNQIHBhcnRpY2lwYW50KSBjYW4gcHJlLXByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkb2N1bWVudHMsCisJICogY3JlYXRlIGl0cyBvd24gZG9jdW1lbnRzIHdob3NlIGNvbnRlbnRzIGFyZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCBkZWxlZ2F0ZSB0aGUgbWF0Y2ggbG9jYXRpb24KIAkgKiB0byB0aGUgZGVmYXVsdCBwYXJ0aWNpcGFudCAoc2VlIHtAbGluayBTZWFyY2hFbmdpbmUjZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCl9KS4gUGFzc2luZyBpdHMgb3duCiAJICoge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNwYW50IGNhbiB0aGVuIG1hcCB0aGUgbWF0Y2ggcG9zaXRpb25zIGJhY2sgdG8gdGhlIG9yaWdpbmFsCiAJICogY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kIHJlcG9ydCB0aGVtIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0b3IuCiAJICogPC9wPjxwPgogCSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2hlY2sgdGhlIHByb2dyZXNzIG1vbml0b3IKIAkgKiBmb3IgY2FuY2VsYXRpb24gd2hlbiBpdCBpcyBzYWZlIGFuZCBhcHByb3ByaWF0ZSB0byBkbyBzby4gIFRoZSBjYW5jZWxhdGlvbgotCSAqIHJlcXVlc3Qgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBieSB0aHJvd2luZyAKKwkgKiByZXF1ZXN0IHNob3VsZCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgYnkgdGhyb3dpbmcKIAkgKiA8Y29kZT5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjwvY29kZT4uCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGRvY3VtZW50cyB0aGUgZG9jdW1lbnRzIHRvIGxvY2F0ZSBtYXRjaGVzIGluCiAJICogQHBhcmFtIHBhdHRlcm4gdGhlIHNlYXJjaCBwYXR0ZXJuIHRvIHVzZSB3aGVuIGxvY2F0aW5nIG1hdGNoZXMKIAkgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHRvIGxpbWl0IHRoZSBzZWFyY2ggdG8KQEAgLTE2MCw3ICsxNjAsNyBAQAogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRbXSBkb2N1bWVudHMsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKIAogCS8qKgotCSAqIFJlbW92ZXMgdGhlIGluZGV4IGZvciBhIGdpdmVuIHBhdGguIAorCSAqIFJlbW92ZXMgdGhlIGluZGV4IGZvciBhIGdpdmVuIHBhdGguCiAJICogPHA+CiAJICogVGhlIGdpdmVuIGluZGV4IGxvY2F0aW9uIG11c3QgcmVwcmVzZW50IGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gdG8gYSBmaWxlIHRoYXQKIAkgKiBhbHJlYWR5IGV4aXN0cyBhbmQgbXVzdCBiZSBhbiBpbmRleCBmaWxlLCBvdGhlcndpc2Ugbm90aGluZyB3aWxsIGJlIGRvbmUuCkBAIC0xNjgsMTggKzE2OCwxOCBAQAogCSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGRlbGV0aW5nIGZpbGUgZGlyZWN0bHkKIAkgKiBvdGhlcndpc2UgY2FjaGVkIGluZGV4IHdpbGwgbm90IGJlIHJlbW92ZWQuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIGluZGV4TG9jYXRpb24gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHN5c3RlbSB0byB0aGUgaW5kZXgKIAkgKiBAc2luY2UgMy4yCiAJICovCiAJcHVibGljIHZvaWQgcmVtb3ZlSW5kZXgoSVBhdGggaW5kZXhMb2NhdGlvbil7Ci0JCUluZGV4TWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCUluZGV4TWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKIAkJbWFuYWdlci5yZW1vdmVJbmRleFBhdGgoaW5kZXhMb2NhdGlvbik7CiAJfQogCiAJLyoqCiAJICogU2NoZWR1bGVzIHRoZSBpbmRleGluZyBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQuCi0JICogT25jZSB0aGUgZG9jdW1lbnQgaXMgcmVhZHkgdG8gYmUgaW5kZXhlZCwgCisJICogT25jZSB0aGUgZG9jdW1lbnQgaXMgcmVhZHkgdG8gYmUgaW5kZXhlZCwKIAkgKiB7QGxpbmsgI2luZGV4RG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQsIElQYXRoKSBpbmRleERvY3VtZW50KGRvY3VtZW50LCBpbmRleFBhdGgpfQogCSAqIHdpbGwgYmUgY2FsbGVkIGluIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSBjYWxsZXIncyB0aHJlYWQuCiAJICogPHA+CkBAIC0xOTAsMjQgKzE5MCwyNyBAQAogCSAqIFdoZW4gdGhlIGluZGV4IGlzIG5vIGxvbmdlciBuZWVkZWQsIGNsaWVudHMgc2hvdWxkIHVzZSB7QGxpbmsgI3JlbW92ZUluZGV4KElQYXRoKSB9CiAJICogdG8gZGlzY2FyZCBpdC4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIGluZGV4CiAJICogQHBhcmFtIGluZGV4TG9jYXRpb24gdGhlIGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbSBvZiB0aGUgaW5kZXgKIAkgKi8KIAlwdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZURvY3VtZW50SW5kZXhpbmcoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIElQYXRoIGluZGV4TG9jYXRpb24pIHsKIAkJSVBhdGggZG9jdW1lbnRQYXRoID0gbmV3IFBhdGgoZG9jdW1lbnQuZ2V0UGF0aCgpKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCU9iamVjdCBmaWxlID0gSmF2YU1vZGVsLmdldFRhcmdldChyb290LCBkb2N1bWVudFBhdGgsIHRydWUpOworCQlPYmplY3QgZmlsZSA9IEphdmFNb2RlbC5nZXRUYXJnZXQoZG9jdW1lbnRQYXRoLCB0cnVlKTsKIAkJSVBhdGggY29udGFpbmVyUGF0aCA9IGRvY3VtZW50UGF0aDsKIAkJaWYgKGZpbGUgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKIAkJCWNvbnRhaW5lclBhdGggPSAoKElSZXNvdXJjZSlmaWxlKS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKIAkJfSBlbHNlIGlmIChmaWxlID09IG51bGwpIHsKLQkJCWNvbnRhaW5lclBhdGggPSBkb2N1bWVudFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKGRvY3VtZW50UGF0aC5zZWdtZW50Q291bnQoKS0xKTsKKwkJCWNvbnRhaW5lclBhdGggPSBkb2N1bWVudFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwogCQl9Ci0JCUluZGV4TWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCUluZGV4TWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKIAkJLy8gVE9ETyAoZnJlZGVyaWMpIHNob3VsZCBub3QgaGF2ZSB0byBjcmVhdGUgaW5kZXggbWFudWFsbHksIHNob3VsZCBleHBvc2UgQVBJIHRoYXQgcmVjcmVhdGVzIGluZGV4IGluc3RlYWQKIAkJbWFuYWdlci5lbnN1cmVJbmRleEV4aXN0cyhpbmRleExvY2F0aW9uLCBjb250YWluZXJQYXRoKTsKIAkJbWFuYWdlci5zY2hlZHVsZURvY3VtZW50SW5kZXhpbmcoZG9jdW1lbnQsIGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24sIHRoaXMpOworCQlpZiAoIWluZGV4TG9jYXRpb24uZXF1YWxzKHRoaXMubGFzdEluZGV4TG9jYXRpb24pKSB7CisJCQltYW5hZ2VyLnVwZGF0ZVBhcnRpY2lwYW50KGluZGV4TG9jYXRpb24sIGNvbnRhaW5lclBhdGgpOworCQkJdGhpcy5sYXN0SW5kZXhMb2NhdGlvbiA9IGluZGV4TG9jYXRpb247CisJCX0KIAl9CiAKIAkvKioKQEAgLTIxNSwxMSArMjE4LDExIEBACiAJICogZ2l2ZW4gc2VhcmNoIHF1ZXJ5IGluIHRoZSBnaXZlbiBzY29wZS4gVGhlIHNlYXJjaCBlbmdpbmUgY2FsbHMgdGhpcwogCSAqIG1ldGhvZCBiZWZvcmUgbG9jYXRpbmcgbWF0Y2hlcy4KIAkgKiA8cD4KLQkgKiBBbiBpbmRleCBsb2NhdGlvbiByZXByZXNlbnRzIGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gdG8gYSBmaWxlIHRoYXQgaG9sZHMgaW5kZXggaW5mb3JtYXRpb24uIAorCSAqIEFuIGluZGV4IGxvY2F0aW9uIHJlcHJlc2VudHMgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSB0byBhIGZpbGUgdGhhdCBob2xkcyBpbmRleCBpbmZvcm1hdGlvbi4KIAkgKiA8L3A+PHA+CiAJICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCiAJICogPC9wPgotCSAqIAorCSAqCiAJICogQHBhcmFtIHF1ZXJ5IHRoZSBzZWFyY2ggcGF0dGVybiB0byBjb25zaWRlcgogCSAqIEBwYXJhbSBzY29wZSB0aGUgZ2l2ZW4gc2VhcmNoIHNjb3BlCiAJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBpbmRleCBwYXRocyB0byBjb25zaWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhdHRlcm4uamF2YQppbmRleCAwODMwMmFhLi5jZjk2ZmYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxMyArMTAsMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUnVsZVNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVySGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTG9jYWxWYXJpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5FbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSGllcmFyY2h5U2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkluZGV4UXVlcnlSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guU3RyaW5nT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JSW5kZXhDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLio7CiAKQEAgLTI2LDI0ICszNywyNCBAQAogICogdG8gY3JlYXRlIGEgc2VhcmNoIHBhdHRlcm4uCiAgKiA8cD4KICAqIFNlYXJjaCBwYXR0ZXJucyBhcmUgdXNlZCBkdXJpbmcgdGhlIHNlYXJjaCBwaGFzZSB0byBkZWNvZGUgaW5kZXggZW50cmllcyB0aGF0IHdlcmUgYWRkZWQgZHVyaW5nIHRoZSBpbmRleGluZyBwaGFzZQotICogKHNlZSB7QGxpbmsgU2VhcmNoRG9jdW1lbnQjYWRkSW5kZXhFbnRyeShjaGFyW10sIGNoYXJbXSl9KS4gV2hlbiBhbiBpbmRleCBpcyBxdWVyaWVkLCB0aGUgCisgKiAoc2VlIHtAbGluayBTZWFyY2hEb2N1bWVudCNhZGRJbmRleEVudHJ5KGNoYXJbXSwgY2hhcltdKX0pLiBXaGVuIGFuIGluZGV4IGlzIHF1ZXJpZWQsIHRoZQogICogaW5kZXggY2F0ZWdvcmllcyBhbmQga2V5cyB0byBjb25zaWRlciBhcmUgcmV0cmlldmVkIGZyb20gdGhlIHNlYXJjaCBwYXR0ZXJuIHVzaW5nIHtAbGluayAjZ2V0SW5kZXhDYXRlZ29yaWVzKCl9IGFuZAogICoge0BsaW5rICNnZXRJbmRleEtleSgpfSwgYXMgd2VsbCBhcyB0aGUgbWF0Y2ggcnVsZSAoc2VlIHtAbGluayAjZ2V0TWF0Y2hSdWxlKCl9KS4gQSBibGFuayBwYXR0ZXJuIGlzCiAgKiB0aGVuIGNyZWF0ZWQgKHNlZSB7QGxpbmsgI2dldEJsYW5rUGF0dGVybigpfSkuIFRoaXMgYmxhbmsgcGF0dGVybiBpcyB1c2VkIGFzIGEgcmVjb3JkIGFzIGZvbGxvd3MuCi0gKiBGb3IgZWFjaCBpbmRleCBlbnRyeSBpbiB0aGUgZ2l2ZW4gaW5kZXggY2F0ZWdvcmllcyBhbmQgdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4ga2V5LCB0aGUgYmxhbmsgcGF0dGVybiBpcyBmZWQgdXNpbmcgCisgKiBGb3IgZWFjaCBpbmRleCBlbnRyeSBpbiB0aGUgZ2l2ZW4gaW5kZXggY2F0ZWdvcmllcyBhbmQgdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4ga2V5LCB0aGUgYmxhbmsgcGF0dGVybiBpcyBmZWQgdXNpbmcKICAqIHtAbGluayAjZGVjb2RlSW5kZXhLZXkoY2hhcltdKX0uIFRoZSBvcmlnaW5hbCBwYXR0ZXJuIGlzIHRoZW4gYXNrZWQgaWYgaXQgbWF0Y2hlcyB0aGUgZGVjb2RlZCBrZXkgdXNpbmcKLSAqIHtAbGluayAjbWF0Y2hlc0RlY29kZWRLZXkoU2VhcmNoUGF0dGVybil9LiBJZiBpdCBtYXRjaGVzLCBhIHNlYXJjaCBkb3VtZW50IGlzIGNyZWF0ZWQgZm9yIHRoaXMgaW5kZXggZW50cnkKKyAqIHtAbGluayAjbWF0Y2hlc0RlY29kZWRLZXkoU2VhcmNoUGF0dGVybil9LiBJZiBpdCBtYXRjaGVzLCBhIHNlYXJjaCBkb2N1bWVudCBpcyBjcmVhdGVkIGZvciB0aGlzIGluZGV4IGVudHJ5CiAgKiB1c2luZyB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQjZ2V0RG9jdW1lbnQoU3RyaW5nKX0uCi0gKiAKKyAqCiAgKiA8L3A+PHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gQSBkZWZhdWx0IGJlaGF2aW9yIGlzIHByb3ZpZGVkIGZvciBlYWNoIG9mIHRoZSBtZXRob2RzIGFib3ZlLCB0aGF0Ci0gKiBjbGllbnRzIGNhbiBvdnZlcmlkZSBpZiB0aGV5IHdpc2guCisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1Yi1jbGFzc2VkIGJ5IGNsaWVudHMuIEEgZGVmYXVsdCBiZWhhdmlvciBpcyBwcm92aWRlZCBmb3IgZWFjaCBvZiB0aGUgbWV0aG9kcyBhYm92ZSwgdGhhdAorICogY2xpZW50cyBjYW4gb3ZlcnJpZGUgaWYgdGhleSB3aXNoLgogICogPC9wPgogICogQHNlZSAjY3JlYXRlUGF0dGVybihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGludCkKICAqIEBzZWUgI2NyZWF0ZVBhdHRlcm4oU3RyaW5nLCBpbnQsIGludCwgaW50KQogICogQHNpbmNlIDMuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGF0dGVybiBleHRlbmRzIEludGVybmFsU2VhcmNoUGF0dGVybiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGF0dGVybiB7CiAKIAkvLyBSdWxlcyBmb3IgcGF0dGVybiBtYXRjaGluZzogKGV4YWN0LCBwcmVmaXgsIHBhdHRlcm4pIFsgfCBjYXNlIHNlbnNpdGl2ZV0KIAkvKioKQEAgLTU4LDcgKzY5LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSX1BSRUZJWF9NQVRDSCA9IDB4MDAwMTsKIAogCS8qKgotCSAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBjb250YWlucyBvbmUgb3IgbW9yZSB3aWxkIGNhcmRzICgnKicgb3IgJz8nKS4gCisJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIG9uZSBvciBtb3JlIHdpbGQgY2FyZHMgKCcqJyBvciAnPycpLgogCSAqIEEgJyonIHdpbGQtY2FyZCBjYW4gcmVwbGFjZSAwIG9yIG1vcmUgY2hhcmFjdGVycyBpbiB0aGUgc2VhcmNoIHJlc3VsdC4KIAkgKiBBICc/JyB3aWxkLWNhcmQgcmVwbGFjZXMgZXhhY3RseSAxIGNoYXJhY3RlciBpbiB0aGUgc2VhcmNoIHJlc3VsdC4KIAkgKi8KQEAgLTE0MSw1MSArMTUyLDEwOSBAQAogCiAJLyoqCiAJICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIGEgQ2FtZWwgQ2FzZSBleHByZXNzaW9uLgotCSAqIDxicj4KKwkgKiA8cD4KIAkgKiBFeGFtcGxlczoKIAkgKiA8dWw+Ci0JICogCTxsaT48Y29kZT5OUEU8L2NvZGU+IHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaAotCSAqIAkJPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+IGFuZCA8Y29kZT5OcFBlcm1pc3Npb25FeGNlcHRpb248L2NvZGU+IHR5cGVzLDwvbGk+Ci0JICogCTxsaT48Y29kZT5OdVBvRXg8L2NvZGU+IHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBvbmx5IG1hdGNoCi0JICogCQk8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4gdHlwZS48L2xpPgorCSAqIAk8bGk+J05QRScgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoCisJICogCQknTnVsbFBvaW50ZXJFeGNlcHRpb24nIGFuZCAnTm9QZXJtaXNzaW9uRXhjZXB0aW9uJyB0eXBlcyw8L2xpPgorCSAqIAk8bGk+J051UG9FeCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG9ubHkgbWF0Y2gKKwkgKiAJCSdOdWxsUG9pbnRlckV4Y2VwdGlvbicgdHlwZS48L2xpPgogCSAqIDwvdWw+Ci0JICogQHNlZSBDaGFyT3BlcmF0aW9uI2NhbWVsQ2FzZU1hdGNoKGNoYXJbXSwgY2hhcltdKSBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbgotCSAqIG9mIENhbWVsIENhc2UgbWF0Y2hpbmcuCi0JICo8YnI+Ci0JICogQ2FuIGJlIGNvbWJpbmVkIHRvIHtAbGluayAjUl9QUkVGSVhfTUFUQ0h9IG1hdGNoIHJ1bGUuIEZvciBleGFtcGxlLAotCSAqIHdoZW4gcHJlZml4IG1hdGNoIHJ1bGUgaXMgY29tYmluZWQgd2l0aCBDYW1lbCBDYXNlIG1hdGNoIHJ1bGUsCi0JICogPGNvZGU+Im5QRSI8L2NvZGU+IHBhdHRlcm4gd2lsbCBtYXRjaCA8Y29kZT5uUEV4Y2VwdGlvbjwvY29kZT4uCi0JICo8YnI+Ci0JICogTWF0Y2ggcnVsZSB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0gbWF5IGFsc28gYmUgY29tYmluZWQgYnV0IGJvdGggcnVsZXMKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IGFzIHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KLQkgKiBVc2VkIG1hdGNoIHJ1bGUgZGVwZW5kcyBvbiB3aGV0aGVyIHN0cmluZyBwYXR0ZXJuIGNvbnRhaW5zIHNwZWNpZmljIHBhdHRlcm4gCi0JICogY2hhcmFjdGVycyAoZS5nLiAnKicgb3IgJz8nKSBvciBub3QuIElmIGl0IGRvZXMsIHRoZW4gb25seSBQYXR0ZXJuIG1hdGNoIHJ1bGUKLQkgKiB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSBvbmx5IENhbWVsIENhc2UgbWF0Y2ggd2lsbCBiZSB1c2VkLgotCSAqIEZvciBleGFtcGxlLCB3aXRoIDxjb2RlPiJOUEUiPC9jb2RlPiBzdHJpbmcgcGF0dGVybiwgc2VhcmNoIHdpbGwgb25seSB1c2UKLQkgKiBDYW1lbCBDYXNlIG1hdGNoIHJ1bGUsIGJ1dCB3aXRoIDxjb2RlPk4qUCpFKjwvY29kZT4gc3RyaW5nIHBhdHRlcm4sIGl0IHdpbGwgCi0JICogdXNlIG9ubHkgUGF0dGVybiBtYXRjaCBydWxlLgotCSAqIAorCSAqCisJICogVGhpcyBydWxlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciBtYXRjaCBydWxlLiBJbiBjYXNlCisJICogb2Ygb3RoZXIgbWF0Y2ggcnVsZSBmbGFncyBhcmUgY29tYmluZWQgd2l0aCB0aGlzIG9uZSwgdGhlbiBtYXRjaCBydWxlIHZhbGlkYXRpb24KKwkgKiB3aWxsIHJldHVybiBhIG1vZGlmaWVkIHJ1bGUgaW4gb3JkZXIgdG8gcGVyZm9ybSBhIGJldHRlciBhcHByb3ByaWF0ZSBzZWFyY2ggcmVxdWVzdAorCSAqIChzZWUge0BsaW5rICN2YWxpZGF0ZU1hdGNoUnVsZShTdHJpbmcsIGludCl9IGZvciBtb3JlIGRldGFpbHMpLgorCSAqIDxwPgorCSAqIEBzZWUgI2NhbWVsQ2FzZU1hdGNoKFN0cmluZywgU3RyaW5nKSBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBDYW1lbAorCSAqIAlDYXNlIG1hdGNoaW5nLgorCSAqCiAJICogQHNpbmNlIDMuMgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfQ0FNRUxDQVNFX01BVENIID0gMHgwMDgwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfTUFTSyA9IFJfRVhBQ1RfTUFUQ0ggfCBSX1BSRUZJWF9NQVRDSCB8IFJfUEFUVEVSTl9NQVRDSCB8IFJfUkVHRVhQX01BVENIOworCS8qKgorCSAqIE1hdGNoIHJ1bGU6IFRoZSBzZWFyY2ggcGF0dGVybiBjb250YWlucyBhIENhbWVsIENhc2UgZXhwcmVzc2lvbiB3aXRoCisJICogYSBzdHJpY3QgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcnRzLgorCSAqIDxicj4KKwkgKiBFeGFtcGxlczoKKwkgKiA8dWw+CisJICogCTxsaT4nSE0nIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kICdIdG1sTWFwcGVyJyB0eXBlcywKKwkgKiAJCWJ1dCBub3QgJ0hhc2hNYXBFbnRyeScKKwkgKiAJPC9saT4KKwkgKiAJPGxpPidITWFwJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgc3RpbGwgbWF0Y2ggcHJldmlvdXMgJ0hhc2hNYXAnIGFuZAorCSAqIAkJJ0h0bWxNYXBwZXInIHR5cGVzLCBidXQgbm90ICdIaWdoTWFnbml0dWRlJworCSAqIAk8L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBUaGlzIHJ1bGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGNvbWJpbmVkIHdpdGggYW55IG90aGVyIG1hdGNoIHJ1bGUuIEluIGNhc2UKKwkgKiBvZiBvdGhlciBtYXRjaCBydWxlIGZsYWdzIGFyZSBjb21iaW5lZCB3aXRoIHRoaXMgb25lLCB0aGVuIG1hdGNoIHJ1bGUgdmFsaWRhdGlvbgorCSAqIHdpbGwgcmV0dXJuIGEgbW9kaWZpZWQgcnVsZSBpbiBvcmRlciB0byBwZXJmb3JtIGEgYmV0dGVyIGFwcHJvcHJpYXRlIHNlYXJjaCByZXF1ZXN0CisJICogKHNlZSB7QGxpbmsgI3ZhbGlkYXRlTWF0Y2hSdWxlKFN0cmluZywgaW50KX0gZm9yIG1vcmUgZGV0YWlscykuCisJICogPHA+CisJICogQHNlZSBDaGFyT3BlcmF0aW9uI2NhbWVsQ2FzZU1hdGNoKGNoYXJbXSwgY2hhcltdLCBib29sZWFuKSBmb3IgYSBkZXRhaWxlZAorCSAqIGV4cGxhbmF0aW9uIG9mIENhbWVsIENhc2UgbWF0Y2hpbmcuCisJICo8cD4KKwkgKiBAc2luY2UgMy40CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIID0gMHgwMTAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfTUFTSyA9IFJfRVhBQ1RfTUFUQ0gKKwkJfCBSX1BSRUZJWF9NQVRDSAorCQl8IFJfUEFUVEVSTl9NQVRDSAorCQl8IFJfUkVHRVhQX01BVENICisJCXwgUl9DQU1FTENBU0VfTUFUQ0gKKwkJfCBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g7CiAKIAlwcml2YXRlIGludCBtYXRjaFJ1bGU7CiAKKwkvKioKKwkgKiBUaGUgZm9jdXMgZWxlbWVudCAodXNlZCBmb3IgcmVmZXJlbmNlIHBhdHRlcm5zKQorCSAqIEBub3JlZmVyZW5jZSBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuIAorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZm9jdXM7CisKKwkvKioKKwkgKiBAbm9yZWZlcmVuY2UgVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqLworCXB1YmxpYyBpbnQga2luZDsKKwkKKwkvKioKKwkgKiBAbm9yZWZlcmVuY2UgVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorCSAqLworCXB1YmxpYyBib29sZWFuIG11c3RSZXNvbHZlID0gdHJ1ZTsKKwkKIC8qKgotICogQ3JlYXRlcyBhIHNlYXJjaCBwYXR0ZXJuIHdpdGggdGhlIHJ1bGUgdG8gYXBwbHkgZm9yIG1hdGNoaW5nIGluZGV4IGtleXMuIAorICogQ3JlYXRlcyBhIHNlYXJjaCBwYXR0ZXJuIHdpdGggdGhlIHJ1bGUgdG8gYXBwbHkgZm9yIG1hdGNoaW5nIGluZGV4IGtleXMuCiAgKiBJdCBjYW4gYmUgZXhhY3QgbWF0Y2gsIHByZWZpeCBtYXRjaCwgcGF0dGVybiBtYXRjaCBvciByZWdleHAgbWF0Y2guCiAgKiBSdWxlIGNhbiBhbHNvIGJlIGNvbWJpbmVkIHdpdGggYSBjYXNlIHNlbnNpdGl2aXR5IGZsYWcuCi0gKiAKLSAqIEBwYXJhbSBtYXRjaFJ1bGUgb25lIG9mIHtAbGluayAjUl9FWEFDVF9NQVRDSH0sIHtAbGluayAjUl9QUkVGSVhfTUFUQ0h9LCB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0sCi0gKiAJe0BsaW5rICNSX1JFR0VYUF9NQVRDSH0sIHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9IGNvbWJpbmVkIHdpdGggb25lIG9mIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAJe0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfSwge0BsaW5rICNSX0VSQVNVUkVfTUFUQ0h9IG9yIHtAbGluayAjUl9FUVVJVkFMRU5UX01BVENIfS4KLSAqCQllLmcuIHtAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9IGlmIGFuIGV4YWN0IGFuZCBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQsIAotICoJCXtAbGluayAjUl9QUkVGSVhfTUFUQ0h9IGlmIGEgcHJlZml4IG5vbiBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyByZXF1ZXN0ZWQgb3Ige0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9FUkFTVVJFX01BVENIfQotICoJCWlmIGEgbm9uIGNhc2Ugc2Vuc2l0aXZlIGFuZCBlcmFzdXJlIG1hdGNoIGlzIHJlcXVlc3RlZC48YnI+Ci0gKiAJTm90ZSB0aGF0IHtAbGluayAjUl9FUkFTVVJFX01BVENIfSBvciB7QGxpbmsgI1JfRVFVSVZBTEVOVF9NQVRDSH0gaGF2ZSBubyBlZmZlY3QKLSAqIAlvbiBub24tZ2VuZXJpYyB0eXBlcy9tZXRob2RzIHNlYXJjaC48YnI+CisgKgorICogQHBhcmFtIG1hdGNoUnVsZSBvbmUgb2YgZm9sbG93aW5nIG1hdGNoIHJ1bGUKKyAqIAk8dWw+CisgKiAJCTxsaT57QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9QUkVGSVhfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9QQVRURVJOX01BVENIfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfUkVHRVhQX01BVENIfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSH08L2xpPgorICogCTwvdWw+CisgKiAJd2hpY2ggbWF5IGJlIGFsc28gY29tYmluZWQgd2l0aCBvbmUgb2YgZm9sbG93aW5nIGZsYWc6CisgKiAJPHVsPgorICogCQk8bGk+e0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9PC9saT4KKyAqIAk8L3VsPgorICoJCUZvciBleGFtcGxlLAorICoJCTx1bD4KKyAqCQkJPGxpPntAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9OiBpZiBhbiBleGFjdAorICoJCQkJYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCw8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gaWYgYSBjYXNlIGluc2Vuc2l0aXZlIHByZWZpeCBtYXRjaCBpcyByZXF1ZXN0ZWQ8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9FUkFTVVJFX01BVENIfTogaWYgYSBjYXNlCisgKgkJCQlpbnNlbnNpdGl2ZSBhbmQgZXJhc3VyZSBtYXRjaCBpcyByZXF1ZXN0ZWQuPC9saT4KKyAqCQk8L3VsPgorICogCU5vdGUgdGhhdCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9IGhhcyBubyBlZmZlY3QKKyAqIAlvbiBub24tZ2VuZXJpYyB0eXBlcy9tZXRob2RzIHNlYXJjaC4KKyAqIAk8cD4KICAqIAlOb3RlIGFsc28gdGhhdCBkZWZhdWx0IGJlaGF2aW9yIGZvciBnZW5lcmljIHR5cGVzL21ldGhvZHMgc2VhcmNoIGlzIHRvIGZpbmQgZXhhY3QgbWF0Y2hlcy4KICAqLwogcHVibGljIFNlYXJjaFBhdHRlcm4oaW50IG1hdGNoUnVsZSkgewpAQCAtMTk0LDQ4ICsyNjMsMTE2IEBACiAJaWYgKChtYXRjaFJ1bGUgJiAoUl9FUVVJVkFMRU5UX01BVENIIHwgUl9FUkFTVVJFX01BVENIICkpID09IDApIHsKIAkJdGhpcy5tYXRjaFJ1bGUgfD0gUl9GVUxMX01BVENIOwogCX0KKwkvLyByZXNldCBvdGhlciBpbmNvbXBhdGlibGUgZmxhZ3MKKwlpZiAoKG1hdGNoUnVsZSAmIFJfQ0FNRUxDQVNFX01BVENIKSAhPSAwKSB7CisJCXRoaXMubWF0Y2hSdWxlICY9IH5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g7CisJCXRoaXMubWF0Y2hSdWxlICY9IH5SX1BSRUZJWF9NQVRDSDsKKwl9IGVsc2UgaWYgKChtYXRjaFJ1bGUgJiBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0gpICE9IDApIHsKKwkJdGhpcy5tYXRjaFJ1bGUgJj0gflJfUFJFRklYX01BVENIOworCX0KIH0KLQogLyoqCi0gKiBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSB1c2luZyBDYW1lbENhc2UgcnVsZXMsIG9yIGZhbHNlIG90aGVyd2lzZS4gCi0gKiBDYW1lbENhc2UgbWF0Y2hpbmcgZG9lcyBOT1QgYWNjZXB0IGV4cGxpY2l0IHdpbGQtY2FyZHMgJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuCi0gKiA8YnI+Ci0gKiBDYW1lbENhc2UgZGVub3RlcyB0aGUgY29udmVudGlvbiBvZiB3cml0aW5nIGNvbXBvdW5kIG5hbWVzIHdpdGhvdXQgc3BhY2VzLCBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uCi0gKiBUaGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgYm90aCB1cHBlciBhbmQgbG93ZXIgQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQKLSAqIG9yIG5vdC4gVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYSBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nCi0gKiBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgotICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlciBDYW1lbENhc2UgY29udmVudGlvbiwgd2hlcmVhcyBtZXRob2Qgb3IgZmllbGQKLSAqIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIgQ2FtZWxDYXNlIGNvbnZlbnRpb24uCi0gKiA8YnI+Ci0gKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaCBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0gKiBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdCAnTnVsbFBvaW50ZXJFeENFUFRJT04nCi0gKiBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05vUG9pbnRlckV4Y2VwdGlvbicuCi0gKiA8YnI+PGJyPgorICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCisgKiBAbm9vdmVycmlkZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmUtaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWF0Y2goU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGNvbnRhaW5lclBhdGgsIGNoYXIgc2VwYXJhdG9yLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIEluZGV4UXVlcnlSZXF1ZXN0b3IgcmVxdWVzdG9yLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgeworCWFjY2VwdE1hdGNoKHJlbGF0aXZlUGF0aCwgY29udGFpbmVyUGF0aCwgc2VwYXJhdG9yLCBwYXR0ZXJuLCByZXF1ZXN0b3IsIHBhcnRpY2lwYW50LCBzY29wZSwgbnVsbCk7Cit9CisvKioKKyAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgorICogQG5vb3ZlcnJpZGUgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlLWltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1hdGNoKFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBjb250YWluZXJQYXRoLCBjaGFyIHNlcGFyYXRvciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJbmRleFF1ZXJ5UmVxdWVzdG9yIHJlcXVlc3RvciwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCisJaWYgKHNjb3BlIGluc3RhbmNlb2YgSmF2YVNlYXJjaFNjb3BlKSB7CisJCUphdmFTZWFyY2hTY29wZSBqYXZhU2VhcmNoU2NvcGUgPSAoSmF2YVNlYXJjaFNjb3BlKSBzY29wZTsKKwkJLy8gR2V0IGRvY3VtZW50IHBhdGggYWNjZXNzIHJlc3RyaWN0aW9uIGZyb20gamF2YSBzZWFyY2ggc2NvcGUKKwkJLy8gTm90ZSB0aGF0IHJlcXVlc3RvciBoYXMgdG8gdmVyaWZ5IGlmIG5lZWRlZCB3aGV0aGVyIHRoZSBkb2N1bWVudCB2aW9sYXRlcyB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIG9yIG5vdAorCQlBY2Nlc3NSdWxlU2V0IGFjY2VzcyA9IGphdmFTZWFyY2hTY29wZS5nZXRBY2Nlc3NSdWxlU2V0KHJlbGF0aXZlUGF0aCwgY29udGFpbmVyUGF0aCk7CisJCWlmIChhY2Nlc3MgIT0gSmF2YVNlYXJjaFNjb3BlLk5PVF9FTkNMT1NFRCkgeyAvLyBzY29wZSBlbmNsb3NlcyB0aGUgZG9jdW1lbnQgcGF0aAorCQkJU3RyaW5nQnVmZmVyIGRvY3VtZW50UGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGFpbmVyUGF0aC5sZW5ndGgoKSArIDEgKyByZWxhdGl2ZVBhdGgubGVuZ3RoKCkpOworCQkJZG9jdW1lbnRQYXRoLmFwcGVuZChjb250YWluZXJQYXRoKTsKKwkJCWRvY3VtZW50UGF0aC5hcHBlbmQoc2VwYXJhdG9yKTsKKwkJCWRvY3VtZW50UGF0aC5hcHBlbmQocmVsYXRpdmVQYXRoKTsKKwkJCWlmICghcmVxdWVzdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLnRvU3RyaW5nKCksIHBhdHRlcm4sIHBhcnRpY2lwYW50LCBhY2Nlc3MpKQorCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQl9CisJfSBlbHNlIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGFpbmVyUGF0aC5sZW5ndGgoKSArIDEgKyByZWxhdGl2ZVBhdGgubGVuZ3RoKCkpOworCQlidWZmZXIuYXBwZW5kKGNvbnRhaW5lclBhdGgpOworCQlidWZmZXIuYXBwZW5kKHNlcGFyYXRvcik7CisJCWJ1ZmZlci5hcHBlbmQocmVsYXRpdmVQYXRoKTsKKwkJU3RyaW5nIGRvY3VtZW50UGF0aCA9IGJ1ZmZlci50b1N0cmluZygpOworCQlib29sZWFuIGVuY2xvc2VzID0gKHNjb3BlIGluc3RhbmNlb2YgSGllcmFyY2h5U2NvcGUpID8gKChIaWVyYXJjaHlTY29wZSlzY29wZSkuZW5jbG9zZXMoZG9jdW1lbnRQYXRoLCBtb25pdG9yKQorCQkJCQkJCTogc2NvcGUuZW5jbG9zZXMoZG9jdW1lbnRQYXRoKTsKKwkJaWYgKGVuY2xvc2VzKSAKKwkJCWlmICghcmVxdWVzdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLCBwYXR0ZXJuLCBwYXJ0aWNpcGFudCwgbnVsbCkpCisJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisKKwl9Cit9CisvKioKKyAqIEBub3JlZmVyZW5jZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLiAKKyAqIEBub292ZXJyaWRlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZS1pbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgU2VhcmNoUGF0dGVybiBjdXJyZW50UGF0dGVybigpIHsKKwlyZXR1cm4gdGhpczsKK30KKy8qKgorICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgdXNpbmcgQ2FtZWxDYXNlIHJ1bGVzLCBvcgorICogZmFsc2Ugb3RoZXJ3aXNlLiBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzCisgKiAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KKyAqIDxwPgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhCisgKiBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICogPHA+CisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaGVkIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtYXRjaGluZyBuYW1lcyB0byBoYXZlIG1vcmUgcGFydHMgdGhhbiB0aGUgc3BlY2lmaWVkCisgKiBwYXR0ZXJuIChzZWUge0BsaW5rICNjYW1lbENhc2VNYXRjaChTdHJpbmcsIFN0cmluZywgYm9vbGVhbil9KS48YnI+CisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcsCisgKiAnSGF0TWFwcGVyJyA8Yj5hbmQgYWxzbzwvYj4gJ0hhc2hNYXBFbnRyeScuCisgKiA8cD4KKyAqIDxwcmU+CiAgKiBFeGFtcGxlczoKLSAqIDxvbD4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9ICJOUEUiCi0gKiAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24gLyBOb1Blcm1pc3Npb25FeGNlcHRpb24KLSAqICAgIHJlc3VsdCA9PiB0cnVlCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8bGk+PHByZT4KLSAqICAgIHBhdHRlcm4gPSAiTnVQb0V4IgotICogICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCi0gKiAgICByZXN1bHQgPT4gdHJ1ZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0gIm5wZSIKLSAqICAgIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICogICAgcmVzdWx0ID0+IGZhbHNlCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8L29sPgotICogQHNlZSBDaGFyT3BlcmF0aW9uI2NhbWVsQ2FzZU1hdGNoKGNoYXJbXSwgY2hhcltdKQotICogCUltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGVudGlyZWx5IGNvcGllZCBmcm9tIHRoaXMgbWV0aG9kIGV4Y2VwdCBmb3IgYXJyYXkgbGVuZ3RoZXMKLSAqIAl3aGljaCB3ZXJlIG9idmlvdXNseSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHtAbGluayBTdHJpbmcjbGVuZ3RoKCl9LgotICogCisgKiA8b2w+PGxpPiAgcGF0dGVybiA9ICJOUEUiCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uIC8gTm9QZXJtaXNzaW9uRXhjZXB0aW9uCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJOdVBvRXgiCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJucGUiCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgcmVzdWx0ID0+IGZhbHNlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiSVBMMyIKKyAqICBuYW1lID0gIklQZXJzcGVjdGl2ZUxpc3RlbmVyMyIKKyAqICByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIkhNIgorICogIG5hbWUgPSAiSGFzaE1hcEVudHJ5IgorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiSE1hcCIKKyAqICBuYW1lID0gIkhhdE1hcHBlciIKKyAqICByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8L29sPjwvcHJlPgorICoKKyAqIEBzZWUgI2NhbWVsQ2FzZU1hdGNoKFN0cmluZywgaW50LCBpbnQsIFN0cmluZywgaW50LCBpbnQsIGJvb2xlYW4pIGZvciBhbGdvcml0aG0KKyAqIGltcGxlbWVudGF0aW9uCisgKgogICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KICAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCkBAIC0yNDcsMTgyICszODQsNDY2IEBACiAJaWYgKG5hbWUgPT0gbnVsbCkKIAkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCiAKLQlyZXR1cm4gY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgMCwgcGF0dGVybi5sZW5ndGgoKSwgbmFtZSwgMCwgbmFtZS5sZW5ndGgoKSk7CisJcmV0dXJuIGNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIDAsIHBhdHRlcm4ubGVuZ3RoKCksIG5hbWUsIDAsIG5hbWUubGVuZ3RoKCksIGZhbHNlLypub3QgdGhlIHNhbWUgY291bnQgb2YgcGFydHMqLyk7CiB9CiAKIC8qKgotICogQW5zd2VycyB0cnVlIGlmIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3VicGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSB1c2luZyBDYW1lbENhc2UgcnVsZXMsIG9yIGZhbHNlIG90aGVyd2lzZS4gIAotICogQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzICcqJyBhbmQgJz8nIGFuZCBpcyBpbmhlcmVudGx5IGNhc2Ugc2Vuc2l0aXZlLiAKLSAqIENhbiBtYXRjaCBvbmx5IHN1YnNldCBvZiBuYW1lL3BhdHRlcm4sIGNvbnNpZGVyaW5nIGVuZCBwb3NpdGlvbnMgYXMgbm9uLWluY2x1c2l2ZS4KLSAqIFRoZSBzdWJwYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQgcGF0dGVybkVuZCBwb3NpdGlvbnMuCi0gKiA8YnI+Ci0gKiBDYW1lbENhc2UgZGVub3RlcyB0aGUgY29udmVudGlvbiBvZiB3cml0aW5nIGNvbXBvdW5kIG5hbWVzIHdpdGhvdXQgc3BhY2VzLCBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uCi0gKiBUaGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgYm90aCB1cHBlciBhbmQgbG93ZXIgQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQKLSAqIG9yIG5vdC4gVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYSBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nCi0gKiBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgotICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlciBDYW1lbENhc2UgY29udmVudGlvbiwgd2hlcmVhcyBtZXRob2Qgb3IgZmllbGQKLSAqIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIgQ2FtZWxDYXNlIGNvbnZlbnRpb24uCi0gKiA8YnI+Ci0gKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaCBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0gKiBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdCAnTnVsbFBvaW50ZXJFeENFUFRJT04nCi0gKiBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05vUG9pbnRlckV4Y2VwdGlvbicuCi0gKiA8YnI+PGJyPgorICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgdXNpbmcgQ2FtZWxDYXNlIHJ1bGVzLCBvcgorICogZmFsc2Ugb3RoZXJ3aXNlLiBjaGFyW10gQ2FtZWxDYXNlIG1hdGNoaW5nIGRvZXMgTk9UIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzCisgKiAnKicgYW5kICc/JyBhbmQgaXMgaW5oZXJlbnRseSBjYXNlIHNlbnNpdGl2ZS4KKyAqIDxwPgorICogQ2FtZWxDYXNlIGRlbm90ZXMgdGhlIGNvbnZlbnRpb24gb2Ygd3JpdGluZyBjb21wb3VuZCBuYW1lcyB3aXRob3V0IHNwYWNlcywKKyAqIGFuZCBjYXBpdGFsaXppbmcgZXZlcnkgdGVybS4gVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGJvdGggdXBwZXIgYW5kIGxvd2VyCisgKiBDYW1lbENhc2UsIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjYXBpdGFsaXplZCBvciBub3QuCisgKiBUaGUgbGVhZGluZyBwYXJ0IG9mIGFuIHVwcGVyIENhbWVsQ2FzZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhCisgKiBzZXF1ZW5jZSBvZiBjYXBpdGFscyB3aGljaCBhcmUgYXBwZWFyaW5nIGluIHRoZSBtYXRjaGluZyBuYW1lOyBlLmcuICdOUEUnIHdpbGwKKyAqIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QgJ05ld1BlcmZEYXRhJy4gQSBsb3dlciBDYW1lbENhc2UgcGF0dGVybgorICogdXNlcyBhIGxvd2VyY2FzZSBmaXJzdCBjaGFyYWN0ZXIuIEluIEphdmEsIHR5cGUgbmFtZXMgZm9sbG93IHRoZSB1cHBlcgorICogQ2FtZWxDYXNlIGNvbnZlbnRpb24sIHdoZXJlYXMgbWV0aG9kIG9yIGZpZWxkIG5hbWVzIGZvbGxvdyB0aGUgbG93ZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLgorICogPHA+CisgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgd2hpY2ggd2lsbCBiZSBtYXRjaGVkIGluIGEgY2FzZQorICogc2Vuc2l0aXZlIHdheS4gVGhlc2UgY2hhcmFjdGVycyBtdXN0IGFwcGVhciBpbiBzZXF1ZW5jZSBpbiB0aGUgbmFtZS4KKyAqIEZvciBpbnN0YW5jZSwgJ05QRXhjZXAnIHdpbGwgbWF0Y2ggJ051bGxQb2ludGVyRXhjZXB0aW9uJywgYnV0IG5vdAorICogJ051bGxQb2ludGVyRXhDRVBUSU9OJyBvciAnTnVQb0V4JyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOb1BvaW50ZXJFeGNlcHRpb24nLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBjYW4gYmUgcmVzdHJpY3RlZCB0byBtYXRjaCBvbmx5IHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzLiBXaGVuIHRoaXMKKyAqIHJlc3RyaWN0aW9uIGlzIHNwZWNpZmllZCB0aGUgZ2l2ZW4gcGF0dGVybiBhbmQgdGhlIGdpdmVuIG5hbWUgbXVzdCBoYXZlIDxiPmV4YWN0bHk8L2I+CisgKiB0aGUgc2FtZSBudW1iZXIgb2YgcGFydHMgKGkuZS4gdGhlIHNhbWUgbnVtYmVyIG9mIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKS48YnI+CisgKiBGb3IgaW5zdGFuY2UsICdITScgLCAnSGFNYScgYW5kICAnSE1hcCcgcGF0dGVybnMgd2lsbCBtYXRjaCAnSGFzaE1hcCcgYW5kCisgKiAnSGF0TWFwcGVyJyA8Yj5idXQgbm90PC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIDxwPgorICogPHByZT4KICAqIEV4YW1wbGVzOgotICogPG9sPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0gIk5QRSIKLSAqICAgIHBhdHRlcm5TdGFydCA9IDAKLSAqICAgIHBhdHRlcm5FbmQgPSAzCi0gKiAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAqICAgIG5hbWVTdGFydCA9IDAKLSAqICAgIG5hbWVFbmQgPSAyMAotICogICAgcmVzdWx0ID0+IHRydWUKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9ICJOUEUiCi0gKiAgICBwYXR0ZXJuU3RhcnQgPSAwCi0gKiAgICBwYXR0ZXJuRW5kID0gMwotICogICAgbmFtZSA9IE5vUGVybWlzc2lvbkV4Y2VwdGlvbgotICogICAgbmFtZVN0YXJ0ID0gMAotICogICAgbmFtZUVuZCA9IDIxCi0gKiAgICByZXN1bHQgPT4gdHJ1ZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPGxpPjxwcmU+Ci0gKiAgICBwYXR0ZXJuID0gIk51UG9FeCIKLSAqICAgIHBhdHRlcm5TdGFydCA9IDAKLSAqICAgIHBhdHRlcm5FbmQgPSA2Ci0gKiAgICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAqICAgIG5hbWVTdGFydCA9IDAKLSAqICAgIG5hbWVFbmQgPSAyMAotICogICAgcmVzdWx0ID0+IHRydWUKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9ICJOdVBvRXgiCi0gKiAgICBwYXR0ZXJuU3RhcnQgPSAwCi0gKiAgICBwYXR0ZXJuRW5kID0gNgotICogICAgbmFtZSA9IE5vUGVybWlzc2lvbkV4Y2VwdGlvbgotICogICAgbmFtZVN0YXJ0ID0gMAotICogICAgbmFtZUVuZCA9IDIxCi0gKiAgICByZXN1bHQgPT4gZmFsc2UKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT48cHJlPgotICogICAgcGF0dGVybiA9ICJucGUiCi0gKiAgICBwYXR0ZXJuU3RhcnQgPSAwCi0gKiAgICBwYXR0ZXJuRW5kID0gMwotICogICAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCi0gKiAgICBuYW1lU3RhcnQgPSAwCi0gKiAgICBuYW1lRW5kID0gMjAKLSAqICAgIHJlc3VsdCA9PiBmYWxzZQotICogPC9wcmU+Ci0gKiA8L2xpPgotICogPC9vbD4KLSAqIEBzZWUgQ2hhck9wZXJhdGlvbiNjYW1lbENhc2VNYXRjaChjaGFyW10sIGludCwgaW50LCBjaGFyW10sIGludCwgaW50KQotICogCUltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGVudGlyZWx5IGNvcGllZCBmcm9tIHRoaXMgbWV0aG9kIGV4Y2VwdCBmb3IgYXJyYXkgbGVuZ3RoZXMKLSAqIAl3aGljaCB3ZXJlIG9idmlvdXNseSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHtAbGluayBTdHJpbmcjbGVuZ3RoKCl9IGFuZAotICogCWZvciBhcnJheSBkaXJlY3QgYWNjZXNzIHdoaWNoIHdlcmUgcmVwbGFjZWQgd2l0aCBjYWxscyB0byB7QGxpbmsgU3RyaW5nI2NoYXJBdChpbnQpfS4KLSAqIAorICogPG9sPjxsaT4gIHBhdHRlcm4gPSAiTlBFIgorICogIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbiAvIE5vUGVybWlzc2lvbkV4Y2VwdGlvbgorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTnVQb0V4IgorICogIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAibnBlIgorICogIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICogIHJlc3VsdCA9PiBmYWxzZTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIklQTDMiCisgKiAgbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJITSIKKyAqICBuYW1lID0gIkhhc2hNYXBFbnRyeSIKKyAqICByZXN1bHQgPT4gKHNhbWVQYXJ0Q291bnQgPT0gZmFsc2UpPC9saT4KKyAqIDwvb2w+PC9wcmU+CisgKgorICogQHNlZSAjY2FtZWxDYXNlTWF0Y2goU3RyaW5nLCBpbnQsIGludCwgU3RyaW5nLCBpbnQsIGludCwgYm9vbGVhbikgZm9yIGFsZ29yaXRobQorICogCWltcGxlbWVudGF0aW9uCisgKgorICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KKyAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisgKiBAcGFyYW0gc2FtZVBhcnRDb3VudCBmbGFnIHRlbGxpbmcgd2hldGhlciB0aGUgcGF0dGVybiBhbmQgdGhlIG5hbWUgc2hvdWxkCisgKiAJaGF2ZSB0aGUgc2FtZSBjb3VudCBvZiBwYXJ0cyBvciBub3QuPGJyPgorICogCSZuYnNwOyZuYnNwO0ZvciBleGFtcGxlOgorICogCTx1bD4KKyAqIAkJPGxpPidITScgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIG1hdGNoICdIYXNoTWFwJyBhbmQgJ0h0bWxNYXBwZXInIHR5cGVzLAorICogCQkJCWJ1dCBub3QgJ0hhc2hNYXBFbnRyeSc8L2xpPgorICogCQk8bGk+J0hNYXAnIHR5cGUgc3RyaW5nIHBhdHRlcm4gd2lsbCBzdGlsbCBtYXRjaCBwcmV2aW91cyAnSGFzaE1hcCcgYW5kCisgKiAJCQkJJ0h0bWxNYXBwZXInIHR5cGVzLCBidXQgbm90ICdIaWdoTWFnbml0dWRlJzwvbGk+CisgKiAJPC91bD4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lLCBmYWxzZSBvdGhlcndpc2UKKyAqIEBzaW5jZSAzLjQKKyAqLworcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbWVsQ2FzZU1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBzYW1lUGFydENvdW50KSB7CisJaWYgKHBhdHRlcm4gPT0gbnVsbCkKKwkJcmV0dXJuIHRydWU7IC8vIG51bGwgcGF0dGVybiBpcyBlcXVpdmFsZW50IHRvICcqJworCWlmIChuYW1lID09IG51bGwpCisJCXJldHVybiBmYWxzZTsgLy8gbnVsbCBuYW1lIGNhbm5vdCBtYXRjaAorCisJcmV0dXJuIGNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIDAsIHBhdHRlcm4ubGVuZ3RoKCksIG5hbWUsIDAsIG5hbWUubGVuZ3RoKCksIHNhbWVQYXJ0Q291bnQpOworfQorCisvKioKKyAqIEFuc3dlcnMgdHJ1ZSBpZiBhIHN1Yi1wYXR0ZXJuIG1hdGNoZXMgdGhlIHN1Yi1wYXJ0IG9mIHRoZSBnaXZlbiBuYW1lIHVzaW5nCisgKiBDYW1lbENhc2UgcnVsZXMsIG9yIGZhbHNlIG90aGVyd2lzZS4gIGNoYXJbXSBDYW1lbENhc2UgbWF0Y2hpbmcgZG9lcyBOT1QKKyAqIGFjY2VwdCBleHBsaWNpdCB3aWxkLWNhcmRzICcqJyBhbmQgJz8nIGFuZCBpcyBpbmhlcmVudGx5IGNhc2Ugc2Vuc2l0aXZlLgorICogQ2FuIG1hdGNoIG9ubHkgc3Vic2V0IG9mIG5hbWUvcGF0dGVybiwgY29uc2lkZXJpbmcgZW5kIHBvc2l0aW9ucyBhcyBub24taW5jbHVzaXZlLgorICogVGhlIHN1Yi1wYXR0ZXJuIGlzIGRlZmluZWQgYnkgdGhlIHBhdHRlcm5TdGFydCBhbmQgcGF0dGVybkVuZCBwb3NpdGlvbnMuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBkZW5vdGVzIHRoZSBjb252ZW50aW9uIG9mIHdyaXRpbmcgY29tcG91bmQgbmFtZXMgd2l0aG91dCBzcGFjZXMsCisgKiBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBib3RoIHVwcGVyIGFuZCBsb3dlcgorICogQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQgb3Igbm90LgorICogVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYQorICogc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZyBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsCisgKiBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4KKyAqIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QgY2hhcmFjdGVyLiBJbiBKYXZhLCB0eXBlIG5hbWVzIGZvbGxvdyB0aGUgdXBwZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLCB3aGVyZWFzIG1ldGhvZCBvciBmaWVsZCBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyCisgKiBDYW1lbENhc2UgY29udmVudGlvbi4KKyAqIDxwPgorICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgbWF0Y2hlZCBpbiBhIGNhc2UKKyAqIHNlbnNpdGl2ZSB3YXkuIFRoZXNlIGNoYXJhY3RlcnMgbXVzdCBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuCisgKiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOdWxsUG9pbnRlckV4Q0VQVElPTicgb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90CisgKiAnTm9Qb2ludGVyRXhjZXB0aW9uJy4KKyAqIDxwPgorICogRGlnaXQgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiBUaGV5IGNhbiBiZSB1c2VkIGluIHRoZSBwYXR0ZXJuCisgKiBidXQgYXJlIG5vdCBhbHdheXMgY29uc2lkZXJlZCBhcyBsZWFkaW5nIGNoYXJhY3Rlci4gRm9yIGluc3RhbmNlLCBib3RoCisgKiAnVVRGMTZEU1MnIGFuZCAnVVRGRFNTJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdVVEYxNkRvY3VtZW50U2Nhbm5lclN1cHBvcnQnLgorICogPHA+CisgKiBEaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuIFRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIHBhdHRlcm4KKyAqIGJ1dCBhcmUgbm90IGFsd2F5cyBjb25zaWRlcmVkIGFzIGxlYWRpbmcgY2hhcmFjdGVyLiBGb3IgaW5zdGFuY2UsIGJvdGgKKyAqICdVVEYxNkRTUycgYW5kICdVVEZEU1MnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ1VURjE2RG9jdW1lbnRTY2FubmVyU3VwcG9ydCcuCisgKiA8cD4KKyAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtYXRjaGluZyBuYW1lcyB0byBoYXZlIG1vcmUgcGFydHMgdGhhbiB0aGUgc3BlY2lmaWVkCisgKiBwYXR0ZXJuIChzZWUge0BsaW5rICNjYW1lbENhc2VNYXRjaChTdHJpbmcsIGludCwgaW50LCBTdHJpbmcsIGludCwgaW50LCBib29sZWFuKX0pLjxicj4KKyAqIEZvciBpbnN0YW5jZSwgJ0hNJyAsICdIYU1hJyBhbmQgICdITWFwJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdIYXNoTWFwJywKKyAqICdIYXRNYXBwZXInIDxiPmFuZCBhbHNvPC9iPiAnSGFzaE1hcEVudHJ5Jy4KKyAqIDxwPgorICogPHByZT5FeGFtcGxlczo8b2w+CisgKiA8bGk+ICBwYXR0ZXJuID0gIk5QRSIKKyAqICBwYXR0ZXJuU3RhcnQgPSAwCisgKiAgcGF0dGVybkVuZCA9IDMKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAqICBuYW1lU3RhcnQgPSAwCisgKiAgbmFtZUVuZCA9IDIwCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJOUEUiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSAzCisgKiAgbmFtZSA9IE5vUGVybWlzc2lvbkV4Y2VwdGlvbgorICogIG5hbWVTdGFydCA9IDAKKyAqICBuYW1lRW5kID0gMjEKKyAqICByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIk51UG9FeCIKKyAqICBwYXR0ZXJuU3RhcnQgPSAwCisgKiAgcGF0dGVybkVuZCA9IDYKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAqICBuYW1lU3RhcnQgPSAwCisgKiAgbmFtZUVuZCA9IDIwCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJOdVBvRXgiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSA2CisgKiAgbmFtZSA9IE5vUGVybWlzc2lvbkV4Y2VwdGlvbgorICogIG5hbWVTdGFydCA9IDAKKyAqICBuYW1lRW5kID0gMjEKKyAqICByZXN1bHQgPT4gZmFsc2U8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJucGUiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSAzCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgbmFtZVN0YXJ0ID0gMAorICogIG5hbWVFbmQgPSAyMAorICogIHJlc3VsdCA9PiBmYWxzZTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIklQTDMiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSAzCisgKiAgbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiCisgKiAgbmFtZVN0YXJ0ID0gMAorICogIG5hbWVFbmQgPSAyMQorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiSE0iCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSAyCisgKiAgbmFtZSA9ICJIYXNoTWFwRW50cnkiCisgKiAgbmFtZVN0YXJ0ID0gMAorICogIG5hbWVFbmQgPSAxMgorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiSE1hcCIKKyAqICBwYXR0ZXJuU3RhcnQgPSAwCisgKiAgcGF0dGVybkVuZCA9IDQKKyAqICBuYW1lID0gIkhhdE1hcHBlciIKKyAqICBuYW1lU3RhcnQgPSAwCisgKiAgbmFtZUVuZCA9IDkKKyAqICByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8L29sPjwvcHJlPgorICoKICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCiAgKiBAcGFyYW0gcGF0dGVyblN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgcGF0dGVybiwgaW5jbHVzaXZlCiAgKiBAcGFyYW0gcGF0dGVybkVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBleGNsdXNpdmUKICAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCiAgKiBAcGFyYW0gbmFtZVN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgbmFtZSwgaW5jbHVzaXZlCiAgKiBAcGFyYW0gbmFtZUVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBuYW1lLCBleGNsdXNpdmUKLSAqIEByZXR1cm4gdHJ1ZSBpZiBhIHN1Yi1wYXR0ZXJuIG1hdGNoZXMgdGhlIHN1YnBhcnQgb2YgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorICogQHJldHVybiB0cnVlIGlmIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3ViLXBhcnQgb2YgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQogICogQHNpbmNlIDMuMgogICovCiBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goU3RyaW5nIHBhdHRlcm4sIGludCBwYXR0ZXJuU3RhcnQsIGludCBwYXR0ZXJuRW5kLCBTdHJpbmcgbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKLQlpZiAobmFtZSA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7IC8vIG51bGwgbmFtZSBjYW5ub3QgbWF0Y2gKLQlpZiAocGF0dGVybiA9PSBudWxsKQotCQlyZXR1cm4gdHJ1ZTsgLy8gbnVsbCBwYXR0ZXJuIGlzIGVxdWl2YWxlbnQgdG8gJyonCi0JaWYgKHBhdHRlcm5FbmQgPCAwKSAJcGF0dGVybkVuZCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JaWYgKG5hbWVFbmQgPCAwKSBuYW1lRW5kID0gbmFtZS5sZW5ndGgoKTsKKwlyZXR1cm4gY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgcGF0dGVyblN0YXJ0LCBwYXR0ZXJuRW5kLCBuYW1lLCBuYW1lU3RhcnQsIG5hbWVFbmQsIGZhbHNlLypub3QgdGhlIHNhbWUgY291bnQgb2YgcGFydHMqLyk7Cit9CiAKLQlpZiAocGF0dGVybkVuZCA8PSBwYXR0ZXJuU3RhcnQpIHJldHVybiBuYW1lRW5kIDw9IG5hbWVTdGFydDsKLQlpZiAobmFtZUVuZCA8PSBuYW1lU3RhcnQpIHJldHVybiBmYWxzZTsKLQkvLyBjaGVjayBmaXJzdCBwYXR0ZXJuIGNoYXIKLQlpZiAobmFtZS5jaGFyQXQobmFtZVN0YXJ0KSAhPSBwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuU3RhcnQpKSB7Ci0JCS8vIGZpcnN0IGNoYXIgbXVzdCBzdHJpY3RseSBtYXRjaCAodXBwZXIvbG93ZXIpCi0JCXJldHVybiBmYWxzZTsKKy8qKgorICogQW5zd2VycyB0cnVlIGlmIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3ViLXBhcnQgb2YgdGhlIGdpdmVuIG5hbWUgdXNpbmcKKyAqIENhbWVsQ2FzZSBydWxlcywgb3IgZmFsc2Ugb3RoZXJ3aXNlLiAgY2hhcltdIENhbWVsQ2FzZSBtYXRjaGluZyBkb2VzIE5PVAorICogYWNjZXB0IGV4cGxpY2l0IHdpbGQtY2FyZHMgJyonIGFuZCAnPycgYW5kIGlzIGluaGVyZW50bHkgY2FzZSBzZW5zaXRpdmUuCisgKiBDYW4gbWF0Y2ggb25seSBzdWJzZXQgb2YgbmFtZS9wYXR0ZXJuLCBjb25zaWRlcmluZyBlbmQgcG9zaXRpb25zIGFzCisgKiBub24taW5jbHVzaXZlLiBUaGUgc3ViLXBhdHRlcm4gaXMgZGVmaW5lZCBieSB0aGUgcGF0dGVyblN0YXJ0IGFuZCBwYXR0ZXJuRW5kCisgKiBwb3NpdGlvbnMuCisgKiA8cD4KKyAqIENhbWVsQ2FzZSBkZW5vdGVzIHRoZSBjb252ZW50aW9uIG9mIHdyaXRpbmcgY29tcG91bmQgbmFtZXMgd2l0aG91dCBzcGFjZXMsCisgKiBhbmQgY2FwaXRhbGl6aW5nIGV2ZXJ5IHRlcm0uIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBib3RoIHVwcGVyIGFuZCBsb3dlcgorICogQ2FtZWxDYXNlLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgY2FwaXRhbGl6ZWQgb3Igbm90LgorICogVGhlIGxlYWRpbmcgcGFydCBvZiBhbiB1cHBlciBDYW1lbENhc2UgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4KKyAqIGEgc2VxdWVuY2Ugb2YgY2FwaXRhbHMgd2hpY2ggYXJlIGFwcGVhcmluZyBpbiB0aGUgbWF0Y2hpbmcgbmFtZTsgZS5nLiAnTlBFJyB3aWxsCisgKiBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90ICdOZXdQZXJmRGF0YScuIEEgbG93ZXIgQ2FtZWxDYXNlIHBhdHRlcm4KKyAqIHVzZXMgYSBsb3dlcmNhc2UgZmlyc3QgY2hhcmFjdGVyLiBJbiBKYXZhLCB0eXBlIG5hbWVzIGZvbGxvdyB0aGUgdXBwZXIKKyAqIENhbWVsQ2FzZSBjb252ZW50aW9uLCB3aGVyZWFzIG1ldGhvZCBvciBmaWVsZCBuYW1lcyBmb2xsb3cgdGhlIGxvd2VyCisgKiBDYW1lbENhc2UgY29udmVudGlvbi4KKyAqIDxwPgorICogVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgbWF0Y2hlZCBpbiBhIGNhc2UKKyAqIHNlbnNpdGl2ZSB3YXkuIFRoZXNlIGNoYXJhY3RlcnMgbXVzdCBhcHBlYXIgaW4gc2VxdWVuY2UgaW4gdGhlIG5hbWUuCisgKiBGb3IgaW5zdGFuY2UsICdOUEV4Y2VwJyB3aWxsIG1hdGNoICdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIGJ1dCBub3QKKyAqICdOdWxsUG9pbnRlckV4Q0VQVElPTicgb3IgJ051UG9FeCcgd2lsbCBtYXRjaCAnTnVsbFBvaW50ZXJFeGNlcHRpb24nLCBidXQgbm90CisgKiAnTm9Qb2ludGVyRXhjZXB0aW9uJy4KKyAqIDxwPgorICogRGlnaXQgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiBUaGV5IGNhbiBiZSB1c2VkIGluIHRoZSBwYXR0ZXJuCisgKiBidXQgYXJlIG5vdCBhbHdheXMgY29uc2lkZXJlZCBhcyBsZWFkaW5nIGNoYXJhY3Rlci4gRm9yIGluc3RhbmNlLCBib3RoCisgKiAnVVRGMTZEU1MnIGFuZCAnVVRGRFNTJyBwYXR0ZXJucyB3aWxsIG1hdGNoICdVVEYxNkRvY3VtZW50U2Nhbm5lclN1cHBvcnQnLgorICogPHA+CisgKiBDYW1lbENhc2UgY2FuIGJlIHJlc3RyaWN0ZWQgdG8gbWF0Y2ggb25seSB0aGUgc2FtZSBjb3VudCBvZiBwYXJ0cy4gV2hlbiB0aGlzCisgKiByZXN0cmljdGlvbiBpcyBzcGVjaWZpZWQgdGhlIGdpdmVuIHBhdHRlcm4gYW5kIHRoZSBnaXZlbiBuYW1lIG11c3QgaGF2ZSA8Yj5leGFjdGx5PC9iPgorICogdGhlIHNhbWUgbnVtYmVyIG9mIHBhcnRzIChpLmUuIHRoZSBzYW1lIG51bWJlciBvZiB1cHBlcmNhc2UgY2hhcmFjdGVycykuPGJyPgorICogRm9yIGluc3RhbmNlLCAnSE0nICwgJ0hhTWEnIGFuZCAgJ0hNYXAnIHBhdHRlcm5zIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGFuZAorICogJ0hhdE1hcHBlcicgPGI+YnV0IG5vdDwvYj4gJ0hhc2hNYXBFbnRyeScuCisgKiA8cD4KKyAqIDxwcmU+RXhhbXBsZXM6PG9sPgorICogPGxpPiAgcGF0dGVybiA9ICJOUEUiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSAzCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgbmFtZVN0YXJ0ID0gMAorICogIG5hbWVFbmQgPSAyMAorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTlBFIgorICogIHBhdHRlcm5TdGFydCA9IDAKKyAqICBwYXR0ZXJuRW5kID0gMworICogIG5hbWUgPSBOb1Blcm1pc3Npb25FeGNlcHRpb24KKyAqICBuYW1lU3RhcnQgPSAwCisgKiAgbmFtZUVuZCA9IDIxCisgKiAgcmVzdWx0ID0+IHRydWU8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJOdVBvRXgiCisgKiAgcGF0dGVyblN0YXJ0ID0gMAorICogIHBhdHRlcm5FbmQgPSA2CisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgbmFtZVN0YXJ0ID0gMAorICogIG5hbWVFbmQgPSAyMAorICogIHJlc3VsdCA9PiB0cnVlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTnVQb0V4IgorICogIHBhdHRlcm5TdGFydCA9IDAKKyAqICBwYXR0ZXJuRW5kID0gNgorICogIG5hbWUgPSBOb1Blcm1pc3Npb25FeGNlcHRpb24KKyAqICBuYW1lU3RhcnQgPSAwCisgKiAgbmFtZUVuZCA9IDIxCisgKiAgcmVzdWx0ID0+IGZhbHNlPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAibnBlIgorICogIHBhdHRlcm5TdGFydCA9IDAKKyAqICBwYXR0ZXJuRW5kID0gMworICogIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICogIG5hbWVTdGFydCA9IDAKKyAqICBuYW1lRW5kID0gMjAKKyAqICByZXN1bHQgPT4gZmFsc2U8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJJUEwzIgorICogIHBhdHRlcm5TdGFydCA9IDAKKyAqICBwYXR0ZXJuRW5kID0gMworICogIG5hbWUgPSAiSVBlcnNwZWN0aXZlTGlzdGVuZXIzIgorICogIG5hbWVTdGFydCA9IDAKKyAqICBuYW1lRW5kID0gMjEKKyAqICByZXN1bHQgPT4gdHJ1ZTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIkhNIgorICogIHBhdHRlcm5TdGFydCA9IDAKKyAqICBwYXR0ZXJuRW5kID0gMgorICogIG5hbWUgPSAiSGFzaE1hcEVudHJ5IgorICogIG5hbWVTdGFydCA9IDAKKyAqICBuYW1lRW5kID0gMTIKKyAqICByZXN1bHQgPT4gKHNhbWVQYXJ0Q291bnQgPT0gZmFsc2UpPC9saT4KKyAqIDwvb2w+PC9wcmU+CisgKgorICogQHNlZSBDaGFyT3BlcmF0aW9uI2NhbWVsQ2FzZU1hdGNoKGNoYXJbXSwgaW50LCBpbnQsIGNoYXJbXSwgaW50LCBpbnQsIGJvb2xlYW4pCisgKiAJZnJvbSB3aGljaCBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZW50aXJlbHkgY29waWVkLgorICoKKyAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCisgKiBAcGFyYW0gcGF0dGVyblN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgcGF0dGVybiwgaW5jbHVzaXZlCisgKiBAcGFyYW0gcGF0dGVybkVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBleGNsdXNpdmUKKyAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisgKiBAcGFyYW0gbmFtZVN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgbmFtZSwgaW5jbHVzaXZlCisgKiBAcGFyYW0gbmFtZUVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBuYW1lLCBleGNsdXNpdmUKKyAqIEBwYXJhbSBzYW1lUGFydENvdW50IGZsYWcgdGVsbGluZyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGFuZCB0aGUgbmFtZSBzaG91bGQKKyAqIAloYXZlIHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzIG9yIG5vdC48YnI+CisgKiAJJm5ic3A7Jm5ic3A7Rm9yIGV4YW1wbGU6CisgKiAJPHVsPgorICogCQk8bGk+J0hNJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicgdHlwZXMsCisgKiAJCQkJYnV0IG5vdCAnSGFzaE1hcEVudHJ5JzwvbGk+CisgKiAJCTxsaT4nSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIHN0aWxsIG1hdGNoIHByZXZpb3VzICdIYXNoTWFwJyBhbmQKKyAqIAkJCQknSHRtbE1hcHBlcicgdHlwZXMsIGJ1dCBub3QgJ0hpZ2hNYWduaXR1ZGUnPC9saT4KKyAqIAk8L3VsPgorICogQHJldHVybiB0cnVlIGlmIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3ViLXBhcnQgb2YgdGhlIGdpdmVuIG5hbWUsIGZhbHNlIG90aGVyd2lzZQorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FtZWxDYXNlTWF0Y2goU3RyaW5nIHBhdHRlcm4sIGludCBwYXR0ZXJuU3RhcnQsIGludCBwYXR0ZXJuRW5kLCBTdHJpbmcgbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGJvb2xlYW4gc2FtZVBhcnRDb3VudCkgeworCXJldHVybiBTdHJpbmdPcGVyYXRpb24uZ2V0Q2FtZWxDYXNlTWF0Y2hpbmdSZWdpb25zKHBhdHRlcm4sIHBhdHRlcm5TdGFydCwgcGF0dGVybkVuZCwgbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBzYW1lUGFydENvdW50KSAhPSBudWxsOworfQorCisvKioKKyAqIEFuc3dlcnMgYWxsIHRoZSByZWdpb25zIGluIGEgZ2l2ZW4gbmFtZSBtYXRjaGluZyBhIGdpdmVuIHBhdHRlcm4gdXNpbmcKKyAqIGEgc3BlY2lmaWVkIG1hdGNoIHJ1bGUuCisgKiA8L3A+PHA+CisgKiBFYWNoIG9mIHRoZXNlIHJlZ2lvbnMgaXMgbWFkZSBvZiBpdHMgc3RhcnRpbmcgaW5kZXggYW5kIGl0cyBsZW5ndGggaW4gdGhlIGdpdmVuCisgKiBuYW1lLiBUaGV5IGFyZSBhbGwgY29uY2F0ZW5hdGVkIGluIGEgc2luZ2xlIGFycmF5IG9mIDxjb2RlPmludDwvY29kZT4KKyAqIHdoaWNoIHRoZXJlZm9yZSBhbHdheXMgaGFzIGFuIGV2ZW4gbGVuZ3RoLgorICogPC9wPjxwPgorICogQWxsIHJldHVybmVkIHJlZ2lvbnMgYXJlIGRpc2pvaW50ZWQgZnJvbSBlYWNoIG90aGVyLiBUaGF0IG1lYW5zIHRoYXQgdGhlIGVuZAorICogb2YgYSByZWdpb24gaXMgYWx3YXlzIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIG9uZS48YnI+CisgKiBGb3IgZXhhbXBsZSwgaWYgdHdvIHJlZ2lvbnMgYXJlIHJldHVybmVkOjxicj4KKyAqIDxjb2RlPnsgc3RhcnQxLCBsZW5ndGgxLCBzdGFydDIsIGxlbmd0aDIgfTwvY29kZT48YnI+CisgKiB0aGVuIDxjb2RlPnN0YXJ0MStsZW5ndGgxPC9jb2RlPiB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyIHRoYW4KKyAqIDxjb2RlPnN0YXJ0MjwvY29kZT4uCisgKiA8L3A+PHA+CisgKiBUaGUgcG9zc2libGUgY29tcGFyaXNvbiBydWxlcyBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgcGF0dGVybiBhcmU6CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rICNSX0VYQUNUX01BVENIIGV4YWN0IG1hdGNoaW5nfTwvbGk+CisgKiA8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSCBwcmVmaXggbWF0Y2hpbmd9PC9saT4KKyAqIDxsaT57QGxpbmsgI1JfUEFUVEVSTl9NQVRDSCBwYXR0ZXJuIG1hdGNoaW5nfTwvbGk+CisgKiA8bGk+e0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSCBjYW1lbCBjYXNlIG1hdGNoaW5nfTwvbGk+CisgKiA8bGk+e0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0ggY2FtZWwgY2FzZSBtYXRjaGluZyB3aXRoIHNhbWUgcGFydHMgY291bnR9PC9saT4KKyAqIDwvdWw+CisgKiBFYWNoIG9mIHRoZXNlIHJ1bGVzIG1heSBiZSBjb21iaW5lZCB3aXRoIHRoZQorICoge0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFIGNhc2Ugc2Vuc2l0aXZlIGZsYWd9IGlmIHRoZSBtYXRjaCBjb21wYXJpc29uCisgKiBzaG91bGQgcmVzcGVjdCB0aGUgY2FzZS4KKyAqIDxwcmU+CisgKiBFeGFtcGxlczoKKyAqIDxvbD48bGk+ICBwYXR0ZXJuID0gIk5QRSIKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24gLyBOb1Blcm1pc3Npb25FeGNlcHRpb24KKyAqICBtYXRjaFJ1bGUgPSB7QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfQorICogIHJlc3VsdDogIHsgMCwgMSwgNCwgMSwgMTEsIDEgfSAvIHsgMCwgMSwgMiwgMSwgMTIsIDEgfSA8L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJOdVBvRXgiCisgKiAgbmFtZSA9IE51bGxQb2ludGVyRXhjZXB0aW9uCisgKiAgbWF0Y2hSdWxlID0ge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0KKyAqICByZXN1bHQ6ICB7IDAsIDIsIDQsIDIsIDExLCAyIH08L2xpPgorICogPGxpPiAgcGF0dGVybiA9ICJJUEwzIgorICogIG5hbWUgPSAiSVBlcnNwZWN0aXZlTGlzdGVuZXIzIgorICogIG1hdGNoUnVsZSA9IHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9CisgKiAgcmVzdWx0OiAgeyAwLCAyLCAxMiwgMSwgMjAsIDEgfTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIkhhc2hNRSIKKyAqICBuYW1lID0gIkhhc2hNYXBFbnRyeSIKKyAqICBtYXRjaFJ1bGUgPSB7QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfQorICogIHJlc3VsdDogIHsgMCwgNSwgNywgMSB9PC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTj8/P1BvKkV4P2VwdGlvbiIKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAqICBtYXRjaFJ1bGUgPSB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9CisgKiAgcmVzdWx0OiAgeyAwLCAxLCA0LCAyLCAxMSwgMiwgMTQsIDYgfTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIkhhKk0qZW50KiIKKyAqICBuYW1lID0gIkhhc2hNYXBFbnRyeSIKKyAqICBtYXRjaFJ1bGUgPSB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0KKyAqICByZXN1bHQ6ICB7IDAsIDIsIDQsIDEsIDcsIDMgfTwvbGk+CisgKiA8L29sPjwvcHJlPgorICoKKyAqIEBzZWUgI2NhbWVsQ2FzZU1hdGNoKFN0cmluZywgU3RyaW5nLCBib29sZWFuKSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQorICogCWNhbWVsIGNhc2UgYmVoYXZpb3IKKyAqIEBzZWUgQ2hhck9wZXJhdGlvbiNtYXRjaChjaGFyW10sIGNoYXJbXSwgYm9vbGVhbikgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKKyAqIAlwYXR0ZXJuIG1hdGNoIGJlaGF2aW9yCisgKgorICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4uIElmIDxjb2RlPm51bGw8L2NvZGU+LAorICogICAgIHRoZW4gYW4gZW1wdHkgcmVnaW9uICg8Y29kZT5uZXcgaW50WzBdPC9jb2RlPikgd2lsbCBiZSByZXR1cm5lZAorICogICAgIHNob3dpbmcgdGhhdCB0aGUgbmFtZSBtYXRjaGVzIHRoZSBwYXR0ZXJuIGJ1dCBubyBjb21tb24KKyAqICAgICBjaGFyYWN0ZXIgaGFzIGJlZW4gZm91bmQuCisgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorICogQHBhcmFtIG1hdGNoUnVsZSB0aGUgcnVsZSB0byBhcHBseSBmb3IgdGhlIGNvbXBhcmlzb24uPGJyPgorICogICAgIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhY2NlcHRlZDoKKyAqICAgICA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9PC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayAjUl9QUkVGSVhfTUFUQ0h9PC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayAjUl9QQVRURVJOX01BVENIfTwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfTwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSH08L2xpPgorICogICAgIDwvdWw+CisgKiAgICAgPHA+CisgKiAgICAgRWFjaCBvZiB0aGVzZSB2YWxpZCB2YWx1ZXMgbWF5IGJlIGFsc28gY29tYmluZWQgd2l0aAorICogICAgIHRoZSB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9IGZsYWcuCisgKiAgICAgPC9wPgorICogICAgIFNvbWUgZXhhbXBsZXM6CisgKiAgICAgPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX06CisgKiAgICAgICAgICAgICAgICAgaWYgYW4gZXhhY3QgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgZXhwZWN0ZWQsPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayAjUl9QUkVGSVhfTUFUQ0h9OgorICogICAgICAgICAgICAgICAgIGlmIGEgY2FzZSBpbnNlbnNpdGl2ZSBwcmVmaXggbWF0Y2ggaXMgZXhwZWN0ZWQsPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9OgorICogICAgICAgICAgICAgICAgIGlmIGEgY2FzZSBpbnNlbnNpdGl2ZSBjYW1lbCBjYXNlIG1hdGNoIGlzIGV4cGVjdGVkLDwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSH0KKyAqICAgICAgICAgICAgICAgICB8IHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX06CisgKiAgICAgICAgICAgICAgICAgaWYgYSBjYXNlIHNlbnNpdGl2ZSBjYW1lbCBjYXNlIHdpdGggc2FtZSBwYXJ0cyBjb3VudCBtYXRjaAorICogICAgICAgICAgICAgICAgIGlzIGV4cGVjdGVkLDwvbGk+CisgKiAgICAgICAgIDxsaT5ldGMuPC9saT4KKyAqICAgICA8L3VsPgorICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5pbnQ8L2NvZGU+IGhhdmluZyB0d28gc2xvdHMgcGVyIHJldHVybmVkCisgKiAgICAgcmVnaW9ucyAodGhlIGZpcnN0IG9uZSBpcyB0aGUgcmVnaW9uIHN0YXJ0aW5nIGluZGV4IGFuZCB0aGUgc2Vjb25kIG9uZQorICogICAgIGlzIHRoZSByZWdpb24gbGVuZ3RoIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CisgKiAgICAgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4pLgorICogICAgIDxwPgorICogICAgIFRoZSByZXR1cm5lZCByZWdpb25zIG1heSBiZSBlbXB0eSAoPGNvZGU+bmV3IGludFswXTwvY29kZT4pIGlmIHRoZQorICogICAgIHBhdHRlcm4gaXMgPGNvZGU+bnVsbDwvY29kZT4gKHdoYXRldmVyIHRoZSBtYXRjaCBydWxlIGlzKS4gVGhlIHJldHVybmVkCisgKiAgICAgcmVnaW9ucyB3aWxsIGFsc28gYmUgZW1wdHkgaWYgdGhlIHBhdHRlcm4gaXMgb25seSBtYWRlIG9mIDxjb2RlPic/JzwvY29kZT4KKyAqICAgICBhbmQvb3IgPGNvZGU+JyonPC9jb2RlPiBjaGFyYWN0ZXIocykgKGUuZy4gPGNvZGU+JyonPC9jb2RlPiwKKyAqICAgICA8Y29kZT4nPyonPC9jb2RlPiwgPGNvZGU+Jz8/Pyc8L2NvZGU+LCBldGMuKSB3aGVuIHVzaW5nIGEgcGF0dGVybgorICogICAgIG1hdGNoIHJ1bGUuCisgKiAgICAgPC9wPgorICogCisgKiBAc2luY2UgMy41CisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0TWF0Y2hpbmdSZWdpb25zKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSwgaW50IG1hdGNoUnVsZSkgeworCWlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOworCWZpbmFsIGludCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKKwlpZiAocGF0dGVybiA9PSBudWxsKSB7CisJCXJldHVybiBuZXcgaW50W10geyAwLCBuYW1lTGVuZ3RoIH07CiAJfQotCi0JY2hhciBwYXR0ZXJuQ2hhciwgbmFtZUNoYXI7Ci0JaW50IGlQYXR0ZXJuID0gcGF0dGVyblN0YXJ0OwotCWludCBpTmFtZSA9IG5hbWVTdGFydDsKLQotCS8vIE1haW4gbG9vcCBpcyBvbiBwYXR0ZXJuIGNoYXJhY3RlcnMKLQl3aGlsZSAodHJ1ZSkgewotCi0JCWlQYXR0ZXJuKys7Ci0JCWlOYW1lKys7Ci0KLQkJaWYgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQpIHsKLQkJCS8vIFdlIGhhdmUgZXhoYXVzdGVkIHBhdHRlcm4sIHNvIGl0J3MgYSBtYXRjaAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCl7Ci0JCQkvLyBXZSBoYXZlIGV4aGF1c3RlZCBuYW1lIChhbmQgbm90IHBhdHRlcm4pLCBzbyBpdCdzIG5vdCBhIG1hdGNoIAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gRm9yIGFzIGxvbmcgYXMgd2UncmUgZXhhY3RseSBtYXRjaGluZywgYnJpbmcgaXQgb24gKGV2ZW4gaWYgaXQncyBhIGxvd2VyIGNhc2UgY2hhcmFjdGVyKQotCQlpZiAoKHBhdHRlcm5DaGFyID0gcGF0dGVybi5jaGFyQXQoaVBhdHRlcm4pKSA9PSBuYW1lLmNoYXJBdChpTmFtZSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLy8gSWYgY2hhcmFjdGVycyBhcmUgbm90IGVxdWFscywgdGhlbiBpdCdzIG5vdCBhIG1hdGNoIGlmIHBhdHRlcm5DaGFyIGlzIGxvd2VyY2FzZQotCQlpZiAocGF0dGVybkNoYXIgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7Ci0JCQlpZiAoKFNjYW5uZXJIZWxwZXIuT0JWSU9VU19JREVOVF9DSEFSX05BVFVSRVNbcGF0dGVybkNoYXJdICYgU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUikgPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKKwlmaW5hbCBpbnQgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7CisJYm9vbGVhbiBjb3VudE1hdGNoID0gZmFsc2U7CisJc3dpdGNoIChtYXRjaFJ1bGUpIHsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0g6CisJCQlpZiAocGF0dGVybkxlbmd0aCA9PSBuYW1lTGVuZ3RoICYmIHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworCQkJCXJldHVybiBuZXcgaW50W10geyAwLCBwYXR0ZXJuTGVuZ3RoIH07CiAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHBhdHRlcm5DaGFyKSAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHBhdHRlcm5DaGFyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gcGF0dGVybkNoYXIgaXMgdXBwZXJjYXNlLCBzbyBsZXQncyBmaW5kIHRoZSBuZXh0IHVwcGVyY2FzZSBpbiBuYW1lCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCl7Ci0JICAgICAgICAgICAgLy8JV2UgaGF2ZSBleGhhdXN0ZWQgbmFtZSAoYW5kIG5vdCBwYXR0ZXJuKSwgc28gaXQncyBub3QgYSBtYXRjaAotCQkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRToKKwkJCWlmIChwYXR0ZXJuTGVuZ3RoID09IG5hbWVMZW5ndGggJiYgcGF0dGVybi5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gbmV3IGludFtdIHsgMCwgcGF0dGVybkxlbmd0aCB9OwogCQkJfQotCi0JCQluYW1lQ2hhciA9IG5hbWUuY2hhckF0KGlOYW1lKTsKLQotCQkJaWYgKG5hbWVDaGFyIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgewotCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tuYW1lQ2hhcl0gJiAoU2Nhbm5lckhlbHBlci5DX0xPV0VSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19TUEVDSUFMIHwgU2Nhbm5lckhlbHBlci5DX0RJR0lUKSkgIT0gMCkgewotCQkJCQkvLyBuYW1lQ2hhciBpcyBsb3dlcmNhc2UgICAgCi0JCQkJCWlOYW1lKys7Ci0JCQkJLy8gbmFtZUNoYXIgaXMgdXBwZXJjYXNlLi4uCi0JCQkJfSBlbHNlICBpZiAocGF0dGVybkNoYXIgIT0gbmFtZUNoYXIpIHsKLQkJCQkJLy8uLiBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggcGF0dGVybkNoYXIsIHNvIGl0J3Mgbm90IGEgbWF0Y2gKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vLi4gYW5kIGl0IG1hdGNoZWQgcGF0dGVybkNoYXIuIEJhY2sgdG8gdGhlIGJpZyBsb29wCi0JCQkJCWJyZWFrOworCQkJYnJlYWs7CisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSDoKKwkJCWlmIChwYXR0ZXJuTGVuZ3RoIDw9IG5hbWVMZW5ndGggJiYgbmFtZS5zdWJzdHJpbmcoMCwgcGF0dGVybkxlbmd0aCkuZXF1YWxzSWdub3JlQ2FzZShwYXR0ZXJuKSkgeworCQkJCXJldHVybiBuZXcgaW50W10geyAwLCBwYXR0ZXJuTGVuZ3RoIH07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFOgorCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwYXR0ZXJuKSkgeworCQkJCXJldHVybiBuZXcgaW50W10geyAwLCBwYXR0ZXJuTGVuZ3RoIH07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSDoKKwkJCWNvdW50TWF0Y2ggPSB0cnVlOworCQkJLy8kRkFMTC1USFJPVUdIJAorCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g6CisJCQlpZiAocGF0dGVybkxlbmd0aCA8PSBuYW1lTGVuZ3RoKSB7CisJCQkJaW50W10gcmVnaW9ucyA9IFN0cmluZ09wZXJhdGlvbi5nZXRDYW1lbENhc2VNYXRjaGluZ1JlZ2lvbnMocGF0dGVybiwgMCwgcGF0dGVybkxlbmd0aCwgbmFtZSwgMCwgbmFtZUxlbmd0aCwgY291bnRNYXRjaCk7CisJCQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgcmV0dXJuIHJlZ2lvbnM7CisJCQkJaWYgKG5hbWUuc3Vic3RyaW5nKDAsIHBhdHRlcm5MZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2UocGF0dGVybikpIHsKKwkJCQkJcmV0dXJuIG5ldyBpbnRbXSB7IDAsIHBhdHRlcm5MZW5ndGggfTsKIAkJCQl9CiAJCQl9Ci0JCQllbHNlIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQobmFtZUNoYXIpICYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZUNoYXIpKSB7Ci0JCQkJLy8gbmFtZUNoYXIgaXMgbG93ZXJjYXNlICAgIAotCQkJCWlOYW1lKys7Ci0JCQkvLyBuYW1lQ2hhciBpcyB1cHBlcmNhc2UuLi4KLQkJCX0gZWxzZSAgaWYgKHBhdHRlcm5DaGFyICE9IG5hbWVDaGFyKSB7Ci0JCQkJLy8uLiBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggcGF0dGVybkNoYXIsIHNvIGl0J3Mgbm90IGEgbWF0Y2gKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vLi4gYW5kIGl0IG1hdGNoZWQgcGF0dGVybkNoYXIuIEJhY2sgdG8gdGhlIGJpZyBsb29wCi0JCQkJYnJlYWs7CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRToKKwkJCWNvdW50TWF0Y2ggPSB0cnVlOworCQkJLy8kRkFMTC1USFJPVUdIJAorCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkU6CisJCQlpZiAocGF0dGVybkxlbmd0aCA8PSBuYW1lTGVuZ3RoKSB7CisJCQkJcmV0dXJuIFN0cmluZ09wZXJhdGlvbi5nZXRDYW1lbENhc2VNYXRjaGluZ1JlZ2lvbnMocGF0dGVybiwgMCwgcGF0dGVybkxlbmd0aCwgbmFtZSwgMCwgbmFtZUxlbmd0aCwgY291bnRNYXRjaCk7CiAJCQl9Ci0JCX0KLQkJLy8gQXQgdGhpcyBwb2ludCwgZWl0aGVyIG5hbWUgaGFzIGJlZW4gZXhoYXVzdGVkLCBvciBpdCBpcyBhdCBhbiB1cHBlcmNhc2UgbGV0dGVyLgotCQkvLyBTaW5jZSBwYXR0ZXJuIGlzIGFsc28gYXQgYW4gdXBwZXJjYXNlIGxldHRlcgorCQkJYnJlYWs7CisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0g6CisJCQlyZXR1cm4gU3RyaW5nT3BlcmF0aW9uLmdldFBhdHRlcm5NYXRjaGluZ1JlZ2lvbnMocGF0dGVybiwgMCwgcGF0dGVybkxlbmd0aCwgbmFtZSwgMCwgbmFtZUxlbmd0aCwgZmFsc2UpOworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFOgorCQkJcmV0dXJuIFN0cmluZ09wZXJhdGlvbi5nZXRQYXR0ZXJuTWF0Y2hpbmdSZWdpb25zKHBhdHRlcm4sIDAsIHBhdHRlcm5MZW5ndGgsIG5hbWUsIDAsIG5hbWVMZW5ndGgsIHRydWUpOwogCX0KLX0JCisJcmV0dXJuIG51bGw7Cit9CiAKIC8qKgogICogUmV0dXJucyBhIHNlYXJjaCBwYXR0ZXJuIHRoYXQgY29tYmluZXMgdGhlIGdpdmVuIHR3byBwYXR0ZXJucyBpbnRvIGFuCkBAIC00MzIsMjQgKzg1MywyMiBAQAogICogQHBhcmFtIGxlZnRQYXR0ZXJuIHRoZSBsZWZ0IHBhdHRlcm4KICAqIEBwYXJhbSByaWdodFBhdHRlcm4gdGhlIHJpZ2h0IHBhdHRlcm4KICAqIEByZXR1cm4gYW4gImFuZCIgcGF0dGVybgorICogQGRlcHJlY2F0ZWQgVW5mb3J0dW5hdGVseSwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgeWV0CisgKiAJKHNlZSAiaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjA0NCIgZm9yIG1vcmUgZGV0YWlscykuCisgKiAJVGhpcyBtaWdodCBiZSBkb25lIGluIGEgZnVydGhlciB2ZXJzaW9uLi4uCiAgKi8KIHB1YmxpYyBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVBbmRQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gbGVmdFBhdHRlcm4sIFNlYXJjaFBhdHRlcm4gcmlnaHRQYXR0ZXJuKSB7Ci0JcmV0dXJuIE1hdGNoTG9jYXRvci5jcmVhdGVBbmRQYXR0ZXJuKGxlZnRQYXR0ZXJuLCByaWdodFBhdHRlcm4pOworCXJldHVybiBuZXcgQW5kUGF0dGVybihsZWZ0UGF0dGVybiwgcmlnaHRQYXR0ZXJuKTsKIH0KIAotLyoqCi0gKiBGaWVsZCBwYXR0ZXJuIGFyZSBmb3JtZWQgYnkgW2RlY2xhcmluZ1R5cGUuXW5hbWVbIHR5cGVdCi0gKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuc2VyaWFsVmVyc2lvblVJRCBsb25nCi0gKgkJZmllbGQqCi0gKi8KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlRmllbGRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoUnVsZSkgewotCQotCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlIC8qY29tbWVudCovLCB0cnVlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zLypzb3VyY2VMZXZlbCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7IAorCisJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UgLypjb21tZW50Ki8sIHRydWUgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMvKnNvdXJjZUxldmVsKi8sIG51bGwgLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKIAlzY2FubmVyLnNldFNvdXJjZShwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCkpOwogCWZpbmFsIGludCBJbnNpZGVEZWNsYXJpbmdQYXJ0ID0gMTsKIAlmaW5hbCBpbnQgSW5zaWRlVHlwZSA9IDI7CiAJaW50IGxhc3RUb2tlbiA9IC0xOwotCQorCiAJU3RyaW5nIGRlY2xhcmluZ1R5cGUgPSBudWxsLCBmaWVsZE5hbWUgPSBudWxsOwogCVN0cmluZyB0eXBlID0gbnVsbDsKIAlpbnQgbW9kZSA9IEluc2lkZURlY2xhcmluZ1BhcnQ7CkBAIC00ODUsNyArOTA0LDcgQEAKIAkJCQkJCQlmaWVsZE5hbWUgKz0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5TdHJpbmcoKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkvLyByZWFkIHR5cGUgCisJCQkvLyByZWFkIHR5cGUKIAkJCWNhc2UgSW5zaWRlVHlwZToKIAkJCQlzd2l0Y2ggKHRva2VuKSB7CiAJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lV0hJVEVTUEFDRToKQEAgLTUwOSw3ICs5MjgsNyBAQAogCiAJY2hhcltdIGZpZWxkTmFtZUNoYXJzID0gZmllbGROYW1lLnRvQ2hhckFycmF5KCk7CiAJaWYgKGZpZWxkTmFtZUNoYXJzLmxlbmd0aCA9PSAxICYmIGZpZWxkTmFtZUNoYXJzWzBdID09ICcqJykgZmllbGROYW1lQ2hhcnMgPSBudWxsOwotCQkKKwogCWNoYXJbXSBkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiA9IG51bGwsIGRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lID0gbnVsbDsKIAljaGFyW10gdHlwZVF1YWxpZmljYXRpb24gPSBudWxsLCB0eXBlU2ltcGxlTmFtZSA9IG51bGw7CiAKQEAgLTU0OCw2OSArOTY3LDI2IEBACiAJCQl0eXBlU2ltcGxlTmFtZSA9IG51bGw7CiAJfQogCS8vIENyZWF0ZSBmaWVsZCBwYXR0ZXJuCi0JYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zID0gZmFsc2U7Ci0JYm9vbGVhbiByZWFkQWNjZXNzID0gZmFsc2U7Ci0JYm9vbGVhbiB3cml0ZUFjY2VzcyA9IGZhbHNlOwotCXN3aXRjaCAobGltaXRUbykgewotCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6Ci0JCQlmaW5kRGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgotCQkJcmVhZEFjY2VzcyA9IHRydWU7Ci0JCQl3cml0ZUFjY2VzcyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUFEX0FDQ0VTU0VTIDoKLQkJCXJlYWRBY2Nlc3MgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV1JJVEVfQUNDRVNTRVMgOgotCQkJd3JpdGVBY2Nlc3MgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKLQkJCWZpbmREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJcmVhZEFjY2VzcyA9IHRydWU7Ci0JCQl3cml0ZUFjY2VzcyA9IHRydWU7Ci0JCQlicmVhazsKLQl9CiAJcmV0dXJuIG5ldyBGaWVsZFBhdHRlcm4oCi0JCQlmaW5kRGVjbGFyYXRpb25zLAotCQkJcmVhZEFjY2VzcywKLQkJCXdyaXRlQWNjZXNzLAogCQkJZmllbGROYW1lQ2hhcnMsCiAJCQlkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiwKIAkJCWRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lLAogCQkJdHlwZVF1YWxpZmljYXRpb24sCiAJCQl0eXBlU2ltcGxlTmFtZSwKKwkJCWxpbWl0VG8sCiAJCQltYXRjaFJ1bGUpOwogfQogCi0vKioKLSAqIE1ldGhvZCBwYXR0ZXJuIGFyZSBmb3JtZWQgYnk6PGJyPgotICogCVtkZWNsYXJpbmdUeXBlICcuJ10gWycmbHQ7JyB0eXBlQXJndW1lbnRzICcmZ3Q7J10gc2VsZWN0b3IgWycoJyBwYXJhbWV0ZXJUeXBlcyAnKSddIFtyZXR1cm5UeXBlXQotICoJCTxicj5lLmcuPHVsPgotICoJCQk8bGk+amF2YS5sYW5nLlJ1bm5hYmxlLnJ1bigpIHZvaWQ8L2xpPgotICoJCQk8bGk+bWFpbigqKTwvbGk+Ci0gKgkJCTxsaT4mbHQ7U3RyaW5nJmd0O3RvQXJyYXkoU3RyaW5nW10pPC9saT4KLSAqCQk8L3VsPgotICogQ29uc3RydWN0b3IgcGF0dGVybiBhcmUgZm9ybWVkIGJ5Ojxicj4KLSAqCQlbZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAnLiddIFsnJmx0OycgdHlwZUFyZ3VtZW50cyAnJmd0OyddIHR5cGUgWycoJyBwYXJhbWV0ZXJUeXBlcyAnKSddCi0gKgkJPGJyPmUuZy48dWw+Ci0gKgkJCTxsaT5qYXZhLmxhbmcuT2JqZWN0KCk8L2xpPgotICoJCQk8bGk+TWFpbigqKTwvbGk+Ci0gKgkJCTxsaT4mbHQ7RXhjZXB0aW9uJmd0O1NhbXBsZShFeGNlcHRpb24pPC9saT4KLSAqCQk8L3VsPgotICogVHlwZSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBwYXR0ZXJuIHRoYXQgZm9yIHR5cGUgcGF0dGVybnMKLSAqIEBzZWUgI2NyZWF0ZVR5cGVQYXR0ZXJuKFN0cmluZyxpbnQsaW50LGNoYXIpCi0gKi8KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlTWV0aG9kT3JDb25zdHJ1Y3RvclBhdHRlcm4oU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hSdWxlLCBib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKLQkKLQlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSAvKmNvbW1lbnQqLywgdHJ1ZSAvKndoaXRlc3BhY2UqLywgZmFsc2UgLypubHMqLywgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMy8qc291cmNlTGV2ZWwqLywgbnVsbCAvKnRhc2tUYWdzKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8sIHRydWUvKnRhc2tDYXNlU2Vuc2l0aXZlKi8pOyAKKworCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlIC8qY29tbWVudCovLCB0cnVlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zLypzb3VyY2VMZXZlbCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7CiAJc2Nhbm5lci5zZXRTb3VyY2UocGF0dGVyblN0cmluZy50b0NoYXJBcnJheSgpKTsKIAlmaW5hbCBpbnQgSW5zaWRlU2VsZWN0b3IgPSAxOwogCWZpbmFsIGludCBJbnNpZGVUeXBlQXJndW1lbnRzID0gMjsKIAlmaW5hbCBpbnQgSW5zaWRlUGFyYW1ldGVyID0gMzsKIAlmaW5hbCBpbnQgSW5zaWRlUmV0dXJuVHlwZSA9IDQ7CiAJaW50IGxhc3RUb2tlbiA9IC0xOwotCQorCiAJU3RyaW5nIGRlY2xhcmluZ1R5cGUgPSBudWxsLCBzZWxlY3RvciA9IG51bGwsIHBhcmFtZXRlclR5cGUgPSBudWxsOwogCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbnVsbDsKIAljaGFyW11bXSB0eXBlQXJndW1lbnRzID0gbnVsbDsKQEAgLTYzNCw3ICsxMDEwLDYgQEAKIAkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUzoKIAkJCQkJCQlhcmdDb3VudCsrOwogCQkJCQkJCWlmIChzZWxlY3RvciA9PSBudWxsIHx8IGxhc3RUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1QpIHsKLQkJCQkJCQkJaWYgKHR5cGVBcmd1bWVudHNTdHJpbmcgIT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgc3ludGF4CiAJCQkJCQkJCXR5cGVBcmd1bWVudHNTdHJpbmcgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblN0cmluZygpOwogCQkJCQkJCQltb2RlID0gSW5zaWRlVHlwZUFyZ3VtZW50czsKIAkJCQkJCQkJYnJlYWs7CkBAIC02NDgsNyArMTAyMyw3IEBACiAJCQkJCQkJc2VsZWN0b3IgPSBudWxsOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1Q6Ci0JCQkJCQkJaWYgKHR5cGVBcmd1bWVudHNTdHJpbmcgIT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgc3ludGF4CisJCQkJCQkJaWYgKCFpc0NvbnN0cnVjdG9yICYmIHR5cGVBcmd1bWVudHNTdHJpbmcgIT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgc3ludGF4CiAJCQkJCQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgewogCQkJCQkJCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgc3ludGF4CiAJCQkJCQkJCWRlY2xhcmluZ1R5cGUgPSBzZWxlY3RvcjsKQEAgLTc0NCw3ICsxMTE5LDcgQEAKIAkJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEVTUzoKIAkJCQkJCQlhcmdDb3VudCsrOwogCQkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIHN5bnRheAotCQkJCQkJCS8vIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gYWRkIHRva2VuCisJCQkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggbmV4dCBjYXNlIHRvIGFkZCB0b2tlbgogCQkJCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpCiAJCQkJCQkJCXBhcmFtZXRlclR5cGUgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblN0cmluZygpOwpAQCAtNzgwLDcgKzExNTUsNyBAQAogCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTOgogCQkJCQkJCWFyZ0NvdW50Kys7CiAJCQkJCQkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGludmFsaWQgc3ludGF4Ci0JCQkJCQkJLy8gZmFsbCB0aHJvdWdoIG5leHQgY2FzZSB0byBhZGQgdG9rZW4KKwkJCQkJCQkvLyAkRkFMTC1USFJPVUdIJCAtIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gYWRkIHRva2VuCiAJCQkJCQlkZWZhdWx0OiAvLyBhbGwgb3RoZXIgdG9rZW5zIGFyZSBjb25zaWRlcmVkIGlkZW50aWZpZXJzIChzZWUgYnVnIDIxNzYzIFByb2JsZW0gaW4gSmF2YSBzZWFyY2ggW3NlYXJjaF0pCiAJCQkJCQkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkKIAkJCQkJCQkJcmV0dXJuVHlwZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RyaW5nKCk7CkBAIC04MjksNyArMTIwNCw3IEBACiAJCWlmIChzZWxlY3RvckNoYXJzLmxlbmd0aCA9PSAxICYmIHNlbGVjdG9yQ2hhcnNbMF0gPT0gJyonKQogCQkJc2VsZWN0b3JDaGFycyA9IG51bGw7CiAJfQotCQkKKwogCWNoYXJbXSBkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiA9IG51bGwsIGRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lID0gbnVsbDsKIAljaGFyW10gcmV0dXJuVHlwZVF1YWxpZmljYXRpb24gPSBudWxsLCByZXR1cm5UeXBlU2ltcGxlTmFtZSA9IG51bGw7CiAJY2hhcltdW10gcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zID0gbnVsbCwgcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzID0gbnVsbDsKQEAgLTkwNSw3ICsxMjgwLDcgQEAKIAkJCWlmIChwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXNbaV0ubGVuZ3RoID09IDEgJiYgcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldWzBdID09ICcqJykKIAkJCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXNbaV0gPSBudWxsOwogCQl9Ci0JfQkKKwl9CiAJLy8gZXh0cmFjdCByZXR1cm4gdHlwZSBpbmZvcwogCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKIAkJLy8gZ2V0IHJldHVybiB0eXBlIHBhcnQgYW5kIHNpZ25hdHVyZQpAQCAtOTMwLDcgKzEzMDUsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQkvLyBiZWNhdXNlIG9mIGFuIGltcG9ydAogCQkJCXJldHVyblR5cGVRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoSUluZGV4Q29uc3RhbnRzLk9ORV9TVEFSLCByZXR1cm5UeXBlUXVhbGlmaWNhdGlvbik7Ci0JCQl9CQkJCisJCQl9CiAJCQlyZXR1cm5UeXBlU2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocmV0dXJuVHlwZVBhcnQsIGxhc3REb3RQb3NpdGlvbisxLCByZXR1cm5UeXBlUGFydC5sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuVHlwZVNpbXBsZU5hbWUgPSByZXR1cm5UeXBlUGFydDsKQEAgLTkzOSwzNCArMTMxNCwxOSBAQAogCQkJcmV0dXJuVHlwZVNpbXBsZU5hbWUgPSBudWxsOwogCX0KIAkvLyBDcmVhdGUgbWV0aG9kL2NvbnN0cnVjdG9yIHBhdHRlcm4KLQlib29sZWFuIGZpbmREZWNsYXJhdGlvbnMgPSB0cnVlOwotCWJvb2xlYW4gZmluZFJlZmVyZW5jZXMgPSB0cnVlOwotCXN3aXRjaCAobGltaXRUbykgewotCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6Ci0JCQlmaW5kUmVmZXJlbmNlcyA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUyA6Ci0JCQlmaW5kRGVjbGFyYXRpb25zID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMgOgotCQkJYnJlYWs7Ci0JfQogCWlmIChpc0NvbnN0cnVjdG9yKSB7CiAJCXJldHVybiBuZXcgQ29uc3RydWN0b3JQYXR0ZXJuKAotCQkJCWZpbmREZWNsYXJhdGlvbnMsCi0JCQkJZmluZFJlZmVyZW5jZXMsCi0JCQkJZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUsIAorCQkJCWRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lLAogCQkJCWRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uLAogCQkJCWRlY2xhcmluZ1R5cGVTaWduYXR1cmUsCi0JCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zLCAKKwkJCQlwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnMsCiAJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzLAogCQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzLAogCQkJCXR5cGVBcmd1bWVudHMsCisJCQkJbGltaXRUbywKIAkJCQltYXRjaFJ1bGUpOwogCX0gZWxzZSB7CiAJCXJldHVybiBuZXcgTWV0aG9kUGF0dGVybigKLQkJCQlmaW5kRGVjbGFyYXRpb25zLAotCQkJCWZpbmRSZWZlcmVuY2VzLAogCQkJCXNlbGVjdG9yQ2hhcnMsCiAJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sCiAJCQkJZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUsCkBAIC05NzgsNiArMTMzOCw3IEBACiAJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzLAogCQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzLAogCQkJCXR5cGVBcmd1bWVudHMsCisJCQkJbGltaXRUbywKIAkJCQltYXRjaFJ1bGUpOwogCX0KIH0KQEAgLTEwMTgsNTUgKzEzNzksMTk4IEBACiAgKglFeGFtcGxlczoKICAqCTx1bD4KICAqIAkJPGxpPnNlYXJjaCBmb3IgY2FzZSBpbnNlbnNpdGl2ZSByZWZlcmVuY2VzIHRvIDxjb2RlPk9iamVjdDwvY29kZT46Ci0gKgkJCTxjb2RlPmNyZWF0ZVNlYXJjaFBhdHRlcm4oIk9iamVjdCIsIFRZUEUsIFJFRkVSRU5DRVMsIGZhbHNlKTs8L2NvZGU+PC9saT4KKyAqCQkJPGNvZGU+Y3JlYXRlU2VhcmNoUGF0dGVybigiT2JqZWN0IiwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywgZmFsc2UpOzwvY29kZT48L2xpPgogICogIAk8bGk+c2VhcmNoIGZvciBjYXNlIHNlbnNpdGl2ZSByZWZlcmVuY2VzIHRvIGV4YWN0IDxjb2RlPk9iamVjdCgpPC9jb2RlPiBjb25zdHJ1Y3RvcjoKLSAqCQkJPGNvZGU+Y3JlYXRlU2VhcmNoUGF0dGVybigiamF2YS5sYW5nLk9iamVjdCgpIiwgQ09OU1RSVUNUT1IsIFJFRkVSRU5DRVMsIHRydWUpOzwvY29kZT48L2xpPgorICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuT2JqZWN0KCkiLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DT05TVFJVQ1RPUiwgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywgdHJ1ZSk7PC9jb2RlPjwvbGk+CiAgKiAgCTxsaT5zZWFyY2ggZm9yIGltcGxlbWVudGVycyBvZiA8Y29kZT5qYXZhLmxhbmcuUnVubmFibGU8L2NvZGU+OgotICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuUnVubmFibGUiLCBUWVBFLCBJTVBMRU1FTlRPUlMsIHRydWUpOzwvY29kZT48L2xpPgorICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuUnVubmFibGUiLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMsIHRydWUpOzwvY29kZT48L2xpPgogICogIDwvdWw+CiAgKiBAcGFyYW0gc3RyaW5nUGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgorICogPHVsPgorICogCTxsaT5UeXBlIHBhdHRlcm5zIGhhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6CisgKiAJCTxwPjxiPjxjb2RlPltxdWFsaWZpY2F0aW9uICcuJ110eXBlTmFtZSBbJyZsdDsnIHR5cGVBcmd1bWVudHMgJyZndDsnXTwvY29kZT48L2I+PC9wPgorICoJCQk8cD5FeGFtcGxlczo8L3A+CisgKgkJCTx1bD4KKyAqIAkJCTxsaT48Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPjwvbGk+CisgKgkJCQk8bGk+PGNvZGU+UnVubmFibGU8L2NvZGU+PC9saT4KKyAqCQkJCTxsaT48Y29kZT5MaXN0Jmx0O1N0cmluZyZndDs8L2NvZGU+PC9saT4KKyAqCQkJPC91bD4KKyAqCQkJPHA+CisgKgkJCVR5cGUgYXJndW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdG8gc2VhcmNoIGZvciByZWZlcmVuY2VzIHRvIHBhcmFtZXRlcml6ZWQgdHlwZXMKKyAqIAkJdXNpbmcgZm9sbG93aW5nIHN5bnRheDo8L3A+PHA+CisgKiAJCTxiPjxjb2RlPicmbHQ7JyB7IFsgJz8nIHsnZXh0ZW5kcyd8J3N1cGVyJ30gXSB0eXBlICggJywnIFsgJz8nIHsnZXh0ZW5kcyd8J3N1cGVyJ30gXSB0eXBlICkqIHwgJz8nIH0gJyZndDsnPC9jb2RlPjwvYj4KKyAqIAkJPC9wPjxkaXYgc3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljOyI+CisgKiAJCU5vdGUgdGhhdDoKKyAqIAkJPHVsPgorICogCQkJPGxpPicqJyBpcyBub3QgdmFsaWQgaW5zaWRlIHR5cGUgYXJndW1lbnRzIGRlZmluaXRpb24gJmx0OyZndDs8L2xpPgorICogCQkJPGxpPic/JyBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQgd2hlbiBpdCBpcyBpbnNpZGUgJmx0OyZndDsgKGkuZS4gaXQgbXVzdCBiZSBwdXQgb24gZmlyc3QgcG9zaXRpb24gb2YgdGhlIHR5cGUgYXJndW1lbnQpPC9saT4KKyAqIAkJPC91bD4KKyAqIAkJPC9kaXY+CisgKiAJPC9saT4KKyAqIAk8bGk+TWV0aG9kIHBhdHRlcm5zIGhhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6CisgKiAJCTxwPjxiPjxjb2RlPltkZWNsYXJpbmdUeXBlICcuJ10gWycmbHQ7JyB0eXBlQXJndW1lbnRzICcmZ3Q7J10gbWV0aG9kTmFtZSBbJygnIHBhcmFtZXRlclR5cGVzICcpJ10gW3JldHVyblR5cGVdPC9jb2RlPjwvYj48L3A+CisgKgkJCTxwPlR5cGUgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgc3ludGF4IGFzIGV4cGxhaW5lZCBpbiB0aGUgdHlwZSBwYXR0ZXJucyBzZWN0aW9uLjwvcD4KKyAqCQkJPHA+RXhhbXBsZXM6PC9wPgorICoJCQk8dWw+CisgKgkJCQk8bGk+PGNvZGU+amF2YS5sYW5nLlJ1bm5hYmxlLnJ1bigpIHZvaWQ8L2NvZGU+PC9saT4KKyAqCQkJCTxsaT48Y29kZT5tYWluKCopPC9jb2RlPjwvbGk+CisgKgkJCQk8bGk+PGNvZGU+Jmx0O1N0cmluZyZndDt0b0FycmF5KFN0cmluZ1tdKTwvY29kZT48L2xpPgorICoJCQk8L3VsPgorICoJPC9saT4KKyAqIAk8bGk+Q29uc3RydWN0b3IgcGF0dGVybnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAqCQkJPHA+PGI+PGNvZGU+WycmbHQ7JyB0eXBlQXJndW1lbnRzICcmZ3Q7J10gW2RlY2xhcmluZ1F1YWxpZmljYXRpb24gJy4nXSB0eXBlTmFtZSBbJygnIHBhcmFtZXRlclR5cGVzICcpJ108L2NvZGU+PC9iPjwvcD4KKyAqCQkJPHA+VHlwZSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBzeW50YXggYXMgZXhwbGFpbmVkIGluIHRoZSB0eXBlIHBhdHRlcm5zIHNlY3Rpb24uPC9wPgorICoJCQk8cD48aT5Ob3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIG5hbWUgc2hvdWxkIG5vdCBiZSBlbnRlcmVkIGFzIGl0IGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBuYW1lLjwvaT48L3A+CisgKgkJCTxwPkV4YW1wbGVzOjwvcD4KKyAqCQkJPHVsPgorICoJCQkJPGxpPjxjb2RlPmphdmEubGFuZy5PYmplY3QoKTwvY29kZT48L2xpPgorICoJCQkJPGxpPjxjb2RlPlRlc3QoKik8L2NvZGU+PC9saT4KKyAqCQkJCTxsaT48Y29kZT4mbHQ7RXhjZXB0aW9uJmd0O1NhbXBsZShFeGNlcHRpb24pPC9jb2RlPjwvbGk+CisgKgkJCTwvdWw+CisgKiAJCTxicj4KKyAqIAk8L2xpPgorICogCTxsaT5GaWVsZCBwYXR0ZXJucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICoJCQk8cD48Yj48Y29kZT5bZGVjbGFyaW5nVHlwZSAnLiddIGZpZWxkTmFtZSBbZmllbGRUeXBlXTwvY29kZT48L2I+PC9wPgorICoJCQk8cD5FeGFtcGxlczo8L3A+CisgKgkJCTx1bD4KKyAqCQkJCTxsaT48Y29kZT5qYXZhLmxhbmcuU3RyaW5nLnNlcmlhbFZlcnNpb25VSUQgbG9uZzwvY29kZT48L2xpPgorICoJCQkJPGxpPjxjb2RlPmZpZWxkKjwvY29kZT48L2xpPgorICoJCQk8L3VsPgorICogCTwvbGk+CisgKiAJPGxpPlBhY2thZ2UgcGF0dGVybnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAqCQkJPHA+PGI+PGNvZGU+cGFja2FnZU5hbWVTZWdtZW50IHsnLicgcGFja2FnZU5hbWVTZWdtZW50fTwvY29kZT48L2I+PC9wPgorICoJCQk8cD5FeGFtcGxlczo8L3A+CisgKgkJCTx1bD4KKyAqCQkJCTxsaT48Y29kZT5qYXZhLmxhbmc8L2NvZGU+PC9saT4KKyAqCQkJCTxsaT48Y29kZT5vcmcuZSouamR0LmMqZTwvY29kZT48L2xpPgorICoJCQk8L3VsPgorICogCTwvbGk+CisgKiA8L3VsPgogICogQHBhcmFtIHNlYXJjaEZvciBkZXRlcm1pbmVzIHRoZSBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnRzCiAgKgk8dWw+CiAgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTU306IG9ubHkgbG9vayBmb3IgY2xhc3NlczwvbGk+Ci0gKgkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGludGVyZmFjZXM8L2xpPgorICoJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGludGVyZmFjZXM8L2xpPgogICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjRU5VTX06IG9ubHkgbG9vayBmb3IgZW51bWVyYXRpb248L2xpPgotICoJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQU5OT1RBVElPTl9UWVBFfTogb25seSBsb29rIGZvciBhbm5vdGF0aW9uIHR5cGU8L2xpPgorICoJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTk5PVEFUSU9OX1RZUEV9OiBvbmx5IGxvb2sgZm9yIGFubm90YXRpb24gdHlwZTwvbGk+CiAgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTU19BTkRfRU5VTX06IG9ubHkgbG9vayBmb3IgY2xhc3NlcyBhbmQgZW51bWVyYXRpb25zPC9saT4KLSAqCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NMQVNTX0FORF9JTlRFUkZBQ0V9OiBvbmx5IGxvb2sgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXM8L2xpPgotICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVFlQRX06IGxvb2sgZm9yIGFsbCB0eXBlcyAoaWUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KLSAqCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0ZJRUxEfTogbG9vayBmb3IgZmllbGRzPC9saT4KLSAqCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI01FVEhPRH06IGxvb2sgZm9yIG1ldGhvZHM8L2xpPgotICoJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ09OU1RSVUNUT1J9OiBsb29rIGZvciBjb25zdHJ1Y3RvcnM8L2xpPgotICoJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUEFDS0FHRX06IGxvb2sgZm9yIHBhY2thZ2VzPC9saT4KKyAqCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfQU5EX0lOVEVSRkFDRX06IG9ubHkgbG9vayBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlczwvbGk+CisgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFfTogbG9vayBmb3IgYWxsIHR5cGVzIChpLmUuIGNsYXNzZXMsIGludGVyZmFjZXMsIGVudW0gYW5kIGFubm90YXRpb24gdHlwZXMpPC9saT4KKyAqCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjRklFTER9OiBsb29rIGZvciBmaWVsZHM8L2xpPgorICoJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNNRVRIT0R9OiBsb29rIGZvciBtZXRob2RzPC9saT4KKyAqCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ09OU1RSVUNUT1J9OiBsb29rIGZvciBjb25zdHJ1Y3RvcnM8L2xpPgorICoJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNQQUNLQUdFfTogbG9vayBmb3IgcGFja2FnZXM8L2xpPgogICoJPC91bD4KICAqIEBwYXJhbSBsaW1pdFRvIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgZXhwZWN0ZWQgbWF0Y2hlcwogICoJPHVsPgotICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjREVDTEFSQVRJT05TfTogd2lsbCBzZWFyY2ggZGVjbGFyYXRpb25zIG1hdGNoaW5nCisgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNERUNMQVJBVElPTlMgREVDTEFSQVRJT05TfTogd2lsbCBzZWFyY2ggZGVjbGFyYXRpb25zIG1hdGNoaW5nCiAgKiAJCQl3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIEluIGNhc2UgdGhlIGVsZW1lbnQgaXMgYSBtZXRob2QsIGRlY2xhcmF0aW9ucyBvZiBtYXRjaGluZwotICogCQkJbWV0aG9kcyBpbiBzdWJ0eXBlcyB3aWxsIGFsc28gYmUgZm91bmQsIGFsbG93aW5nIHRvIGZpbmQgZGVjbGFyYXRpb25zIG9mIGFic3RyYWN0IG1ldGhvZHMsIGV0Yy48YnI+Ci0gKiAJCQlOb3RlIHRoYXQgYWRkaXRpb25hbCBmbGFncyB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX0RFQ0xBUklOR19UWVBFfSBhbmQKLSAqIAkJCXtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJR05PUkVfUkVUVVJOX1RZUEV9IGFyZSBpZ25vcmVkIGZvciBzdHJpbmcgcGF0dGVybnMuCisgKiAJCQltZXRob2RzIGluIHN1Yi10eXBlcyB3aWxsIGFsc28gYmUgZm91bmQsIGFsbG93aW5nIHRvIGZpbmQgZGVjbGFyYXRpb25zIG9mIGFic3RyYWN0IG1ldGhvZHMsIGV0Yy48YnI+CisgKiAJCQlOb3RlIHRoYXQgYWRkaXRpb25hbCBmbGFncyB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX0RFQ0xBUklOR19UWVBFIElHTk9SRV9ERUNMQVJJTkdfVFlQRX0gYW5kCisgKiAJCQl7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX1JFVFVSTl9UWVBFIElHTk9SRV9SRVRVUk5fVFlQRX0gYXJlIGlnbm9yZWQgZm9yIHN0cmluZyBwYXR0ZXJucy4KICAqIAkJCVRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgY2xpZW50IG1heSBvbWl0IHRvIGRlZmluZSB0aGVtIGluIHN0cmluZyBwYXR0ZXJuIHRvIGhhdmUgc2FtZSBiZWhhdmlvci4KICAqIAk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1JFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+Ci0gKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTfTogd2lsbCBzZWFyY2ggZm9yIGVpdGhlciBkZWNsYXJhdGlvbnMgb3IKKyAqCQkgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNSRUZFUkVOQ0VTIFJFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+CisgKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTIEFMTF9PQ0NVUlJFTkNFU306IHdpbGwgc2VhcmNoIGZvciBlaXRoZXIgZGVjbGFyYXRpb25zIG9yCiAgKgkJCQlyZWZlcmVuY2VzIGFzIHNwZWNpZmllZCBhYm92ZS4KICAqCQk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUExFTUVOVE9SU306IGZvciB0eXBlcywgd2lsbCBmaW5kIGFsbCB0eXBlcworICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUExFTUVOVE9SUyBJTVBMRU1FTlRPUlN9OiBmb3IgdHlwZXMsIHdpbGwgZmluZCBhbGwgdHlwZXMKICAqCQkJCXdoaWNoIGRpcmVjdGx5IGltcGxlbWVudC9leHRlbmQgYSBnaXZlbiBpbnRlcmZhY2UuCi0gKgkJCQlOb3RlIHRoYXQgdHlwZXMgbWF5IGJlIG9ubHkgY2xhc3NlcyBvciBvbmx5IGludGVyZmFjZXMgaWYge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NMQVNTIH0gb3IKLSAqCQkJCXtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0V9IGlzIHJlc3BlY3RpdmVseSB1c2VkIGluc3RlYWQgb2Yge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RZUEV9LgorICoJCQkJTm90ZSB0aGF0IHR5cGVzIG1heSBiZSBvbmx5IGNsYXNzZXMgb3Igb25seSBpbnRlcmZhY2VzIGlmIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTUyBDTEFTU30gb3IKKyAqCQkJCXtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlRFUkZBQ0UgSU5URVJGQUNFfSBpcyByZXNwZWN0aXZlbHkgdXNlZCBpbnN0ZWFkIG9mIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFIFRZUEV9LgorICoJCTwvbGk+CisgKgkJIDxsaT5BbGwgb3RoZXIgZmluZSBncmFpbiBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgPGI+bGltaXRUbzwvYj4gY2F0ZWdvcnkKKyAqCQkJCW9mIHRoZSB7QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHN9IGFyZSBhbHNvIGFjY2VwdGVkIG5hdHVyZTogCisgKiAJCQk8dGFibGUgYm9yZGVyPTA+CisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0aCBhbGlnbj1sZWZ0PkZpbmUgZ3JhaW4gY29uc3RhbnQKKyAqICAgICAgICAgCQk8dGggYWxpZ249bGVmdD5NZWFuaW5nCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjRklFTERfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgRklFTERfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIHRoZSB0eXBlIG9mIGEgZmllbGQgZGVjbGFyYXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjTE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgTE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIHRoZSB0eXBlIG9mIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUEFSQU1FVEVSX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIFBBUkFNRVRFUl9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBtZXRob2QgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1NVUEVSVFlQRV9UWVBFX1JFRkVSRU5DRSBTVVBFUlRZUEVfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgc3VwZXIgdHlwZSBvciBhcyBhIHN1cGVyIGludGVyZmFjZS4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUSFJPV1NfQ0xBVVNFX1RZUEVfUkVGRVJFTkNFIFRIUk9XU19DTEFVU0VfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGEgdGhyb3dzIGNsYXVzZS4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDQVNUX1RZUEVfUkVGRVJFTkNFIENBU1RfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGEgY2FzdCBleHByZXNzaW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NBVENIX1RZUEVfUkVGRVJFTkNFIENBVENIX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIGNhdGNoIGhlYWRlci4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9UWVBFX1JFRkVSRU5DRSBDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUkVUVVJOX1RZUEVfUkVGRVJFTkNFIFJFVFVSTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSBtZXRob2QgcmV0dXJuIHR5cGUuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSU1QT1JUX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIElNUE9SVF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYW4gaW1wb3J0IGRlY2xhcmF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0FOTk9UQVRJT05fVFlQRV9SRUZFUkVOQ0UgQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYW4gYW5ub3RhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFX0FSR1VNRU5UX1RZUEVfUkVGRVJFTkNFIFRZUEVfQVJHVU1FTlRfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgdHlwZSBhcmd1bWVudCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSBvciBhIHBhcmFtZXRlcml6ZWQgbWV0aG9kLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RZUEVfVkFSSUFCTEVfQk9VTkRfVFlQRV9SRUZFUkVOQ0UgVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSB0eXBlIHZhcmlhYmxlIGJvdW5kLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1dJTERDQVJEX0JPVU5EX1RZUEVfUkVGRVJFTkNFIFdJTERDQVJEX0JPVU5EX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHdpbGRjYXJkIGJvdW5kLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lOU1RBTkNFT0ZfVFlQRV9SRUZFUkVOQ0UgSU5TVEFOQ0VPRl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSB0eXBlIG9mIGFuIDxjb2RlPmluc3RhbmNlb2Y8L2NvZGU+IGV4cHJlc3Npb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjU1VQRVJfUkVGRVJFTkNFIFNVUEVSX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgc3VwZXIgZmllbGQgYWNjZXNzZXMgb3Igc3VwZXIgbWV0aG9kIGludm9jYXRpb25zIChlLmcuIHVzaW5nIHRoZSA8Y29kZT5zdXBlcjwvY29kZT4gcXVhbGlmaWVyKS4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNRVUFMSUZJRURfUkVGRVJFTkNFIFFVQUxJRklFRF9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHF1YWxpZmllZCBmaWVsZCBhY2Nlc3NlcyBvciBxdWFsaWZpZWQgbWV0aG9kIGludm9jYXRpb25zLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RISVNfUkVGRVJFTkNFIFRISVNfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSBwcmltYXJ5IGZpZWxkIGFjY2Vzc2VzIG9yIHByaW1hcnkgbWV0aG9kIGludm9jYXRpb25zIChlLmcuIHVzaW5nIHRoZSA8Y29kZT50aGlzPC9jb2RlPiBxdWFsaWZpZXIpLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUExJQ0lUX1RISVNfUkVGRVJFTkNFIElNUExJQ0lUX1RISVNfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSBmaWVsZCBhY2Nlc3NlcyBvciBtZXRob2QgaW52b2NhdGlvbnMgd2l0aG91dCBhbnkgcXVhbGlmaWNhdGlvbi4KKyAqIAkJCTwvdGFibGU+CiAgKgkJPC9saT4KICAqCTwvdWw+Ci0gKiBAcGFyYW0gbWF0Y2hSdWxlIG9uZSBvZiB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9LCB7QGxpbmsgI1JfUFJFRklYX01BVENIfSwge0BsaW5rICNSX1BBVFRFUk5fTUFUQ0h9LAotICogCXtAbGluayAjUl9SRUdFWFBfTUFUQ0h9LCB7QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfSBjb21iaW5lZCB3aXRoIG9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzOgotICogCXtAbGluayAjUl9DQVNFX1NFTlNJVElWRX0sIHtAbGluayAjUl9FUkFTVVJFX01BVENIfSBvciB7QGxpbmsgI1JfRVFVSVZBTEVOVF9NQVRDSH0uCi0gKgkJZS5nLiB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfSBpZiBhbiBleGFjdCBhbmQgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLCAKLSAqCQl7QGxpbmsgI1JfUFJFRklYX01BVENIfSBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkIG9yIHtAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0KLSAqCQlpZiBhIG5vbiBjYXNlIHNlbnNpdGl2ZSBhbmQgZXJhc3VyZSBtYXRjaCBpcyByZXF1ZXN0ZWQuPGJyPgotICogCU5vdGUgdGhhdCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9IGhhdmUgbm8gZWZmZWN0Ci0gKiAJb24gbm9uLWdlbmVyaWMgdHlwZXMvbWV0aG9kcyBzZWFyY2guPGJyPgotICogCU5vdGUgYWxzbyB0aGF0IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGdlbmVyaWMgdHlwZXMvbWV0aG9kcyBzZWFyY2ggaXMgdG8gZmluZCBleGFjdCBtYXRjaGVzLgorICogQHBhcmFtIG1hdGNoUnVsZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBtYXRjaCBydWxlcworICogCTx1bD4KKyAqIAkJPGxpPntAbGluayAjUl9FWEFDVF9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX1BBVFRFUk5fTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9SRUdFWFBfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfTwvbGk+CisgKiAJPC91bD4KKyAqIAksIHdoaWNoIG1heSBiZSBhbHNvIGNvbWJpbmVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgKiAJPHVsPgorICogCQk8bGk+e0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9PC9saT4KKyAqIAk8L3VsPgorICoJCUZvciBleGFtcGxlLAorICoJCTx1bD4KKyAqCQkJPGxpPntAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9OiBpZiBhbiBleGFjdAorICoJCQkJYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCw8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gaWYgYSBjYXNlIGluc2Vuc2l0aXZlIHByZWZpeCBtYXRjaCBpcyByZXF1ZXN0ZWQ8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9FUkFTVVJFX01BVENIfTogaWYgYSBjYXNlCisgKgkJCQlpbnNlbnNpdGl2ZSBhbmQgZXJhc3VyZSBtYXRjaCBpcyByZXF1ZXN0ZWQuPC9saT4KKyAqCQk8L3VsPgorICogCTxwPk5vdGUgdGhhdCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9IGhhcyBubyBlZmZlY3QKKyAqIAlvbiBub24tZ2VuZXJpYyB0eXBlcy9tZXRob2RzIHNlYXJjaC48L3A+CisgKiAJPHA+CisgKiAJTm90ZSBhbHNvIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGdlbmVyaWMgdHlwZXMvbWV0aG9kcyBzZWFyY2ggaXMgdG8gZmluZCBleGFjdCBtYXRjaGVzLjwvcD4KICAqIEByZXR1cm4gYSBzZWFyY2ggcGF0dGVybiBvbiB0aGUgZ2l2ZW4gc3RyaW5nIHBhdHRlcm4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHJpbmcgcGF0dGVybiBpcyBpbGwtZm9ybWVkCiAgKi8KIHB1YmxpYyBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBzdHJpbmdQYXR0ZXJuLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoUnVsZSkgewpAQCAtMTEwOSwxMSArMTYxMywxMSBAQAogfQogCiAvKioKLSAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiBiYXNlZCBvbiBhIGdpdmVuIEphdmEgZWxlbWVudC4gCisgKiBSZXR1cm5zIGEgc2VhcmNoIHBhdHRlcm4gYmFzZWQgb24gYSBnaXZlbiBKYXZhIGVsZW1lbnQuCiAgKiBUaGUgcGF0dGVybiBpcyB1c2VkIHRvIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIHNlYXJjaC4KICAqIDxicj4KICAqIE5vdGUgdGhhdCBmb3IgZ2VuZXJpYyBzZWFyY2hlcywgdGhlIHJldHVybmVkIHBhdHRlcm4gY29uc2lkZXIge0BsaW5rICNSX0VSQVNVUkVfTUFUQ0h9IG1hdGNoZXMuCi0gKiBJZiBvdGhlciBraW5kIG9mIGdlbmVyaWMgbWF0Y2hlcyAoaWUuIHtAbGluayAjUl9FWEFDVF9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9KQorICogSWYgb3RoZXIga2luZCBvZiBnZW5lcmljIG1hdGNoZXMgKGkuZS4ge0BsaW5rICNSX0VYQUNUX01BVENIfSBvciB7QGxpbmsgI1JfRVFVSVZBTEVOVF9NQVRDSH0pCiAgKiBhcmUgZXhwZWN0ZWQsIHtAbGluayAjY3JlYXRlUGF0dGVybihJSmF2YUVsZW1lbnQsIGludCwgaW50KX0gbWV0aG9kIG5lZWQgdG8gYmUgdXNlZCBpbnN0ZWFkIHdpdGgKICAqIHRoZSBleHBsaWNpdCBtYXRjaCBydWxlIHNwZWNpZmllZC4KICAqIDxicj4KQEAgLTExMjIsMTIgKzE2MjYsMTIgQEAKICAqIEBwYXJhbSBlbGVtZW50IHRoZSBKYXZhIGVsZW1lbnQgdGhlIHNlYXJjaCBwYXR0ZXJuIGlzIGJhc2VkIG9uCiAgKiBAcGFyYW0gbGltaXRUbyBkZXRlcm1pbmVzIHRoZSBuYXR1cmUgb2YgdGhlIGV4cGVjdGVkIG1hdGNoZXMKICAqCTx1bD4KLSAqIAk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0RFQ0xBUkFUSU9OU306IHdpbGwgc2VhcmNoIGRlY2xhcmF0aW9ucyBtYXRjaGluZworICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjREVDTEFSQVRJT05TIERFQ0xBUkFUSU9OU306IHdpbGwgc2VhcmNoIGRlY2xhcmF0aW9ucyBtYXRjaGluZwogICogCQkJd2l0aCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50LiBJbiBjYXNlIHRoZSBlbGVtZW50IGlzIGEgbWV0aG9kLCBkZWNsYXJhdGlvbnMgb2YgbWF0Y2hpbmcKLSAqIAkJCW1ldGhvZHMgaW4gc3VidHlwZXMgd2lsbCBhbHNvIGJlIGZvdW5kLCBhbGxvd2luZyB0byBmaW5kIGRlY2xhcmF0aW9ucyBvZiBhYnN0cmFjdCBtZXRob2RzLCBldGMuCisgKiAJCQltZXRob2RzIGluIHN1Yi10eXBlcyB3aWxsIGFsc28gYmUgZm91bmQsIGFsbG93aW5nIHRvIGZpbmQgZGVjbGFyYXRpb25zIG9mIGFic3RyYWN0IG1ldGhvZHMsIGV0Yy4KICAqCQkJCVNvbWUgYWRkaXRpb25hbCBmbGFncyBtYXkgYmUgc3BlY2lmaWVkIHdoaWxlIHNlYXJjaGluZyBkZWNsYXJhdGlvbjoKICAqCQkJCTx1bD4KLSAqCQkJCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lHTk9SRV9ERUNMQVJJTkdfVFlQRX06IGRlY2xhcmluZyB0eXBlIHdpbGwgYmUgaWdub3JlZAorICoJCQkJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX0RFQ0xBUklOR19UWVBFIElHTk9SRV9ERUNMQVJJTkdfVFlQRX06IGRlY2xhcmluZyB0eXBlIHdpbGwgYmUgaWdub3JlZAogICoJCQkJCQkJZHVyaW5nIHRoZSBzZWFyY2guPGJyPgogICoJCQkJCQkJRm9yIGV4YW1wbGUgdXNpbmcgZm9sbG93aW5nIHRlc3QgY2FzZToKICAqCQkJCQk8cHJlPgpAQCAtMTEzOCw3ICsxNjQyLDcgQEAKICAqCQkJCQkJCXNlYXJjaCBmb3IgPGNvZGU+bWV0aG9kPC9jb2RlPiBkZWNsYXJhdGlvbiB3aXRoIHRoaXMgZmxhZwogICoJCQkJCQkJd2lsbCByZXR1cm4gMiBtYXRjaGVzOiBpbiBBIGFuZCBpbiBDCiAgKgkJCQkJPC9saT4KLSAqCQkJCQk8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lHTk9SRV9SRVRVUk5fVFlQRX06IHJldHVybiB0eXBlIHdpbGwgYmUgaWdub3JlZAorICoJCQkJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX1JFVFVSTl9UWVBFIElHTk9SRV9SRVRVUk5fVFlQRX06IHJldHVybiB0eXBlIHdpbGwgYmUgaWdub3JlZAogICoJCQkJCQkJZHVyaW5nIHRoZSBzZWFyY2guPGJyPgogICoJCQkJCQkJVXNpbmcgc2FtZSBleGFtcGxlLCBzZWFyY2ggZm9yIDxjb2RlPm1ldGhvZDwvY29kZT4gZGVjbGFyYXRpb24gd2l0aCB0aGlzIGZsYWcKICAqCQkJCQkJCXdpbGwgcmV0dXJuIDIgbWF0Y2hlczogaW4gQSBhbmQgaW4gQi4KQEAgLTExNDgsMTIgKzE2NTIsNzQgQEAKICAqCQkJCWR1cmluZyB0aGUgc2VhcmNoLiBUaGVuLCB1c2luZyBzYW1lIGV4YW1wbGUsIHNlYXJjaCBmb3IgPGNvZGU+bWV0aG9kPC9jb2RlPiBkZWNsYXJhdGlvbgogICoJCQkJd2l0aCB0aGVzZSAyIGZsYWdzIHdpbGwgcmV0dXJuIDMgbWF0Y2hlczogaW4gQSwgaW4gQiAgYW5kIGluIEMKICAqIAk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1JFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+Ci0gKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTfTogd2lsbCBzZWFyY2ggZm9yIGVpdGhlciBkZWNsYXJhdGlvbnMgb3IKKyAqCQkgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNSRUZFUkVOQ0VTIFJFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+CisgKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTIEFMTF9PQ0NVUlJFTkNFU306IHdpbGwgc2VhcmNoIGZvciBlaXRoZXIgZGVjbGFyYXRpb25zIG9yCiAgKgkJCQlyZWZlcmVuY2VzIGFzIHNwZWNpZmllZCBhYm92ZS4KICAqCQk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUExFTUVOVE9SU306IGZvciB0eXBlcywgd2lsbCBmaW5kIGFsbCB0eXBlcwotICoJCQkJd2hpY2ggZGlyZWN0bHkgaW1wbGVtZW50L2V4dGVuZCBhIGdpdmVuIGludGVyZmFjZS4KKyAqCQkgPGxpPkFsbCBvdGhlciBmaW5lIGdyYWluIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSA8Yj5saW1pdFRvPC9iPiBjYXRlZ29yeQorICoJCQkJb2YgdGhlIHtAbGluayBJSmF2YVNlYXJjaENvbnN0YW50c30gYXJlIGFsc28gYWNjZXB0ZWQgbmF0dXJlOiAKKyAqIAkJCTx0YWJsZSBib3JkZXI9MD4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRoIGFsaWduPWxlZnQ+RmluZSBncmFpbiBjb25zdGFudAorICogICAgICAgICAJCTx0aCBhbGlnbj1sZWZ0Pk1lYW5pbmcKKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNGSUVMRF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSBGSUVMRF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBmaWVsZCBkZWNsYXJhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNMT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSBMT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgdGhlIHR5cGUgb2YgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNQQVJBTUVURVJfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgUEFSQU1FVEVSX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyB0aGUgdHlwZSBvZiBhIG1ldGhvZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjU1VQRVJUWVBFX1RZUEVfUkVGRVJFTkNFIFNVUEVSVFlQRV9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSBzdXBlciB0eXBlIG9yIGFzIGEgc3VwZXIgaW50ZXJmYWNlLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RIUk9XU19DTEFVU0VfVFlQRV9SRUZFUkVOQ0UgVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYSB0aHJvd3MgY2xhdXNlLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NBU1RfVFlQRV9SRUZFUkVOQ0UgQ0FTVF9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYSBjYXN0IGV4cHJlc3Npb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0FUQ0hfVFlQRV9SRUZFUkVOQ0UgQ0FUQ0hfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGEgY2F0Y2ggaGVhZGVyLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFIENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNSRVRVUk5fVFlQRV9SRUZFUkVOQ0UgUkVUVVJOX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIG1ldGhvZCByZXR1cm4gdHlwZS4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTVBPUlRfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UgSU1QT1JUX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhbiBpbXBvcnQgZGVjbGFyYXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSBBTk5PVEFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhbiBhbm5vdGF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1RZUEVfQVJHVU1FTlRfVFlQRV9SRUZFUkVOQ0UgVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSB0eXBlIGFyZ3VtZW50IGluIGEgcGFyYW1ldGVyaXplZCB0eXBlIG9yIGEgcGFyYW1ldGVyaXplZCBtZXRob2QuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRSBUWVBFX1ZBUklBQkxFX0JPVU5EX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgdmFyaWFibGUgYm91bmQuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0UgV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgd2lsZGNhcmQgYm91bmQuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSU5TVEFOQ0VPRl9UWVBFX1JFRkVSRU5DRSBJTlNUQU5DRU9GX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgb2YgYW4gPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gZXhwcmVzc2lvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNTVVBFUl9SRUZFUkVOQ0UgU1VQRVJfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSBzdXBlciBmaWVsZCBhY2Nlc3NlcyBvciBzdXBlciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4gdXNpbmcgdGhlIDxjb2RlPnN1cGVyPC9jb2RlPiBxdWFsaWZpZXIpLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1FVQUxJRklFRF9SRUZFUkVOQ0UgUVVBTElGSUVEX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgcXVhbGlmaWVkIGZpZWxkIGFjY2Vzc2VzIG9yIHF1YWxpZmllZCBtZXRob2QgaW52b2NhdGlvbnMuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVEhJU19SRUZFUkVOQ0UgVEhJU19SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHByaW1hcnkgZmllbGQgYWNjZXNzZXMgb3IgcHJpbWFyeSBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4gdXNpbmcgdGhlIDxjb2RlPnRoaXM8L2NvZGU+IHF1YWxpZmllcikuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSU1QTElDSVRfVEhJU19SRUZFUkVOQ0UgSU1QTElDSVRfVEhJU19SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IGZpZWxkIGFjY2Vzc2VzIG9yIG1ldGhvZCBpbnZvY2F0aW9ucyB3aXRob3V0IGFueSBxdWFsaWZpY2F0aW9uLgorICogCQkJPC90YWJsZT4KICAqCQk8L2xpPgogICoJPC91bD4KICAqIEByZXR1cm4gYSBzZWFyY2ggcGF0dGVybiBmb3IgYSBKYXZhIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgaWxsLWZvcm1lZApAQCAtMTE2MywxOCArMTcyOSwxOCBAQAogfQogCiAvKioKLSAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiBiYXNlZCBvbiBhIGdpdmVuIEphdmEgZWxlbWVudC4gCisgKiBSZXR1cm5zIGEgc2VhcmNoIHBhdHRlcm4gYmFzZWQgb24gYSBnaXZlbiBKYXZhIGVsZW1lbnQuCiAgKiBUaGUgcGF0dGVybiBpcyB1c2VkIHRvIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIHNlYXJjaCwgYW5kIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGFzIGZvbGxvd3M6CiAgKgogICogQHBhcmFtIGVsZW1lbnQgdGhlIEphdmEgZWxlbWVudCB0aGUgc2VhcmNoIHBhdHRlcm4gaXMgYmFzZWQgb24KICAqIEBwYXJhbSBsaW1pdFRvIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgZXhwZWN0ZWQgbWF0Y2hlcwogICoJPHVsPgotICogCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjREVDTEFSQVRJT05TfTogd2lsbCBzZWFyY2ggZGVjbGFyYXRpb25zIG1hdGNoaW5nCisgKiAJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNERUNMQVJBVElPTlMgREVDTEFSQVRJT05TfTogd2lsbCBzZWFyY2ggZGVjbGFyYXRpb25zIG1hdGNoaW5nCiAgKiAJCQl3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuIEluIGNhc2UgdGhlIGVsZW1lbnQgaXMgYSBtZXRob2QsIGRlY2xhcmF0aW9ucyBvZiBtYXRjaGluZwotICogCQkJbWV0aG9kcyBpbiBzdWJ0eXBlcyB3aWxsIGFsc28gYmUgZm91bmQsIGFsbG93aW5nIHRvIGZpbmQgZGVjbGFyYXRpb25zIG9mIGFic3RyYWN0IG1ldGhvZHMsIGV0Yy4KKyAqIAkJCW1ldGhvZHMgaW4gc3ViLXR5cGVzIHdpbGwgYWxzbyBiZSBmb3VuZCwgYWxsb3dpbmcgdG8gZmluZCBkZWNsYXJhdGlvbnMgb2YgYWJzdHJhY3QgbWV0aG9kcywgZXRjLgogICoJCQkJU29tZSBhZGRpdGlvbmFsIGZsYWdzIG1heSBiZSBzcGVjaWZpZWQgd2hpbGUgc2VhcmNoaW5nIGRlY2xhcmF0aW9uOgogICoJCQkJPHVsPgotICoJCQkJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX0RFQ0xBUklOR19UWVBFfTogZGVjbGFyaW5nIHR5cGUgd2lsbCBiZSBpZ25vcmVkCisgKgkJCQkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJR05PUkVfREVDTEFSSU5HX1RZUEUgSUdOT1JFX0RFQ0xBUklOR19UWVBFfTogZGVjbGFyaW5nIHR5cGUgd2lsbCBiZSBpZ25vcmVkCiAgKgkJCQkJCQlkdXJpbmcgdGhlIHNlYXJjaC48YnI+CiAgKgkJCQkJCQlGb3IgZXhhbXBsZSB1c2luZyBmb2xsb3dpbmcgdGVzdCBjYXNlOgogICoJCQkJCTxwcmU+CkBAIC0xMTg1LDcgKzE3NTEsNyBAQAogICoJCQkJCQkJc2VhcmNoIGZvciA8Y29kZT5tZXRob2Q8L2NvZGU+IGRlY2xhcmF0aW9uIHdpdGggdGhpcyBmbGFnCiAgKgkJCQkJCQl3aWxsIHJldHVybiAyIG1hdGNoZXM6IGluIEEgYW5kIGluIEMKICAqCQkJCQk8L2xpPgotICoJCQkJCTxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjSUdOT1JFX1JFVFVSTl9UWVBFfTogcmV0dXJuIHR5cGUgd2lsbCBiZSBpZ25vcmVkCisgKgkJCQkJPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJR05PUkVfUkVUVVJOX1RZUEUgSUdOT1JFX1JFVFVSTl9UWVBFfTogcmV0dXJuIHR5cGUgd2lsbCBiZSBpZ25vcmVkCiAgKgkJCQkJCQlkdXJpbmcgdGhlIHNlYXJjaC48YnI+CiAgKgkJCQkJCQlVc2luZyBzYW1lIGV4YW1wbGUsIHNlYXJjaCBmb3IgPGNvZGU+bWV0aG9kPC9jb2RlPiBkZWNsYXJhdGlvbiB3aXRoIHRoaXMgZmxhZwogICoJCQkJCQkJd2lsbCByZXR1cm4gMiBtYXRjaGVzOiBpbiBBIGFuZCBpbiBCLgpAQCAtMTE5NSwyMyArMTc2MSwxMDMgQEAKICAqCQkJCWR1cmluZyB0aGUgc2VhcmNoLiBUaGVuLCB1c2luZyBzYW1lIGV4YW1wbGUsIHNlYXJjaCBmb3IgPGNvZGU+bWV0aG9kPC9jb2RlPiBkZWNsYXJhdGlvbgogICoJCQkJd2l0aCB0aGVzZSAyIGZsYWdzIHdpbGwgcmV0dXJuIDMgbWF0Y2hlczogaW4gQSwgaW4gQiAgYW5kIGluIEMKICAqIAk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1JFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+Ci0gKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTfTogd2lsbCBzZWFyY2ggZm9yIGVpdGhlciBkZWNsYXJhdGlvbnMgb3IKKyAqCQkgPGxpPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNSRUZFUkVOQ0VTIFJFRkVSRU5DRVN9OiB3aWxsIHNlYXJjaCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBlbGVtZW50LjwvbGk+CisgKgkJIDxsaT57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQUxMX09DQ1VSUkVOQ0VTIEFMTF9PQ0NVUlJFTkNFU306IHdpbGwgc2VhcmNoIGZvciBlaXRoZXIgZGVjbGFyYXRpb25zIG9yCiAgKgkJCQlyZWZlcmVuY2VzIGFzIHNwZWNpZmllZCBhYm92ZS4KICAqCQk8L2xpPgotICoJCSA8bGk+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUExFTUVOVE9SU306IGZvciB0eXBlcywgd2lsbCBmaW5kIGFsbCB0eXBlcwotICoJCQkJd2hpY2ggZGlyZWN0bHkgaW1wbGVtZW50L2V4dGVuZCBhIGdpdmVuIGludGVyZmFjZS4KLSAqCQk8L2xpPgorICoJCSA8bGk+QWxsIG90aGVyIGZpbmUgZ3JhaW4gY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIDxiPmxpbWl0VG88L2I+IGNhdGVnb3J5CisgKgkJCQlvZiB0aGUge0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzfSBhcmUgYWxzbyBhY2NlcHRlZCBuYXR1cmU6IAorICogCQkJPHRhYmxlIGJvcmRlcj0wPgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGggYWxpZ249bGVmdD5GaW5lIGdyYWluIGNvbnN0YW50CisgKiAgICAgICAgIAkJPHRoIGFsaWduPWxlZnQ+TWVhbmluZworICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0ZJRUxEX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIEZJRUxEX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyB0aGUgdHlwZSBvZiBhIGZpZWxkIGRlY2xhcmF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0xPQ0FMX1ZBUklBQkxFX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIExPQ0FMX1ZBUklBQkxFX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyB0aGUgdHlwZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1BBUkFNRVRFUl9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSBQQVJBTUVURVJfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIHRoZSB0eXBlIG9mIGEgbWV0aG9kIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNTVVBFUlRZUEVfVFlQRV9SRUZFUkVOQ0UgU1VQRVJUWVBFX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHN1cGVyIHR5cGUgb3IgYXMgYSBzdXBlciBpbnRlcmZhY2UuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRSBUSFJPV1NfQ0xBVVNFX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIHRocm93cyBjbGF1c2UuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0FTVF9UWVBFX1JFRkVSRU5DRSBDQVNUX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBpbiBhIGNhc3QgZXhwcmVzc2lvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNDQVRDSF9UWVBFX1JFRkVSRU5DRSBDQVRDSF9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgaW4gYSBjYXRjaCBoZWFkZXIuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fVFlQRV9SRUZFUkVOQ0UgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1JFVFVSTl9UWVBFX1JFRkVSRU5DRSBSRVRVUk5fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgbWV0aG9kIHJldHVybiB0eXBlLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI0lNUE9SVF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSBJTVBPUlRfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGluIGFuIGltcG9ydCBkZWNsYXJhdGlvbi4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNBTk5PVEFUSU9OX1RZUEVfUkVGRVJFTkNFIEFOTk9UQVRJT05fVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGFuIGFubm90YXRpb24uCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSBUWVBFX0FSR1VNRU5UX1RZUEVfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSB0eXBlIHJlZmVyZW5jZXMgdXNlZCBhcyBhIHR5cGUgYXJndW1lbnQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgb3IgYSBwYXJhbWV0ZXJpemVkIG1ldGhvZC4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUWVBFX1ZBUklBQkxFX0JPVU5EX1RZUEVfUkVGRVJFTkNFIFRZUEVfVkFSSUFCTEVfQk9VTkRfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgdHlwZSB2YXJpYWJsZSBib3VuZC4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNXSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSBXSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgdHlwZSByZWZlcmVuY2VzIHVzZWQgYXMgYSB3aWxkY2FyZCBib3VuZC4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTlNUQU5DRU9GX1RZUEVfUkVGRVJFTkNFIElOU1RBTkNFT0ZfVFlQRV9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHR5cGUgcmVmZXJlbmNlcyB1c2VkIGFzIGEgdHlwZSBvZiBhbiA8Y29kZT5pbnN0YW5jZW9mPC9jb2RlPiBleHByZXNzaW9uLgorICogICAgIAkJCTx0cj4KKyAqICAgICAgICAgCQk8dGQ+e0BsaW5rIElKYXZhU2VhcmNoQ29uc3RhbnRzI1NVUEVSX1JFRkVSRU5DRSBTVVBFUl9SRUZFUkVOQ0V9CisgKiAgICAgICAgIAkJPHRkPlJldHVybiBvbmx5IHN1cGVyIGZpZWxkIGFjY2Vzc2VzIG9yIHN1cGVyIG1ldGhvZCBpbnZvY2F0aW9ucyAoZS5nLiB1c2luZyB0aGUgPGNvZGU+c3VwZXI8L2NvZGU+IHF1YWxpZmllcikuCisgKiAgICAgCQkJPHRyPgorICogICAgICAgICAJCTx0ZD57QGxpbmsgSUphdmFTZWFyY2hDb25zdGFudHMjUVVBTElGSUVEX1JFRkVSRU5DRSBRVUFMSUZJRURfUkVGRVJFTkNFfQorICogICAgICAgICAJCTx0ZD5SZXR1cm4gb25seSBxdWFsaWZpZWQgZmllbGQgYWNjZXNzZXMgb3IgcXVhbGlmaWVkIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNUSElTX1JFRkVSRU5DRSBUSElTX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgcHJpbWFyeSBmaWVsZCBhY2Nlc3NlcyBvciBwcmltYXJ5IG1ldGhvZCBpbnZvY2F0aW9ucyAoZS5nLiB1c2luZyB0aGUgPGNvZGU+dGhpczwvY29kZT4gcXVhbGlmaWVyKS4KKyAqICAgICAJCQk8dHI+CisgKiAgICAgICAgIAkJPHRkPntAbGluayBJSmF2YVNlYXJjaENvbnN0YW50cyNJTVBMSUNJVF9USElTX1JFRkVSRU5DRSBJTVBMSUNJVF9USElTX1JFRkVSRU5DRX0KKyAqICAgICAgICAgCQk8dGQ+UmV0dXJuIG9ubHkgZmllbGQgYWNjZXNzZXMgb3IgbWV0aG9kIGludm9jYXRpb25zIHdpdGhvdXQgYW55IHF1YWxpZmljYXRpb24uCisgKiAJCQk8L3RhYmxlPgorICogCTwvbGk+CiAgKgk8L3VsPgotICogQHBhcmFtIG1hdGNoUnVsZSBvbmUgb2Yge0BsaW5rICNSX0VYQUNUX01BVENIfSwge0BsaW5rICNSX1BSRUZJWF9NQVRDSH0sIHtAbGluayAjUl9QQVRURVJOX01BVENIfSwKLSAqIAl7QGxpbmsgI1JfUkVHRVhQX01BVENIfSwge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0gY29tYmluZWQgd2l0aCBvbmUgb2YgZm9sbG93aW5nIHZhbHVlczoKLSAqIAl7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9LCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9LgotICoJCWUuZy4ge0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9DQVNFX1NFTlNJVElWRX0gaWYgYW4gZXhhY3QgYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCwgCi0gKgkJe0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gaWYgYSBwcmVmaXggbm9uIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCBvciB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9IHx7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0KLSAqCQlpZiBhIG5vbiBjYXNlIHNlbnNpdGl2ZSBhbmQgZXJhc3VyZSBtYXRjaCBpcyByZXF1ZXN0ZWQuPGJyPgotICogCU5vdGUgdGhhdCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9IGhhdmUgbm8gZWZmZWN0IG9uIG5vbi1nZW5lcmljIHR5cGVzCi0gKiAJb3IgbWV0aG9kcyBzZWFyY2guPGJyPgotICogCU5vdGUgYWxzbyB0aGF0IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGdlbmVyaWMgdHlwZXMgb3IgbWV0aG9kcyBpcyB0byBmaW5kIGV4YWN0IG1hdGNoZXMuCisgKiBAcGFyYW0gbWF0Y2hSdWxlIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1hdGNoIHJ1bGVzOgorICogCTx1bD4KKyAqIAkJPGxpPntAbGluayAjUl9FWEFDVF9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX1BBVFRFUk5fTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9SRUdFWFBfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9PC9saT4KKyAqIAkJPGxpPntAbGluayAjUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfTwvbGk+CisgKiAJPC91bD4KKyAqIAksIHdoaWNoIG1heSBiZSBhbHNvIGNvbWJpbmVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgKiAJPHVsPgorICogCQk8bGk+e0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfTwvbGk+CisgKiAJCTxsaT57QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH08L2xpPgorICogCQk8bGk+e0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9PC9saT4KKyAqIAk8L3VsPgorICoJCUZvciBleGFtcGxlLAorICoJCTx1bD4KKyAqCQkJPGxpPntAbGluayAjUl9FWEFDVF9NQVRDSH0gfCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9OiBpZiBhbiBleGFjdAorICoJCQkJYW5kIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHJlcXVlc3RlZCw8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gaWYgYSBjYXNlIGluc2Vuc2l0aXZlIHByZWZpeCBtYXRjaCBpcyByZXF1ZXN0ZWQ8L2xpPgorICoJCQk8bGk+e0BsaW5rICNSX0VYQUNUX01BVENIfSB8IHtAbGluayAjUl9FUkFTVVJFX01BVENIfTogaWYgYSBjYXNlCisgKgkJCQlpbnNlbnNpdGl2ZSBhbmQgZXJhc3VyZSBtYXRjaCBpcyByZXF1ZXN0ZWQuPC9saT4KKyAqCQk8L3VsPgorICogCU5vdGUgdGhhdCB7QGxpbmsgI1JfRVJBU1VSRV9NQVRDSH0gb3Ige0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9IGhhcyBubyBlZmZlY3QKKyAqIAlvbiBub24tZ2VuZXJpYyB0eXBlcy9tZXRob2RzIHNlYXJjaC4KKyAqIAk8cD4KKyAqIAlOb3RlIGFsc28gdGhhdCBkZWZhdWx0IGJlaGF2aW9yIGZvciBnZW5lcmljIHR5cGVzL21ldGhvZHMgc2VhcmNoIGlzIHRvIGZpbmQgZXhhY3QgbWF0Y2hlcy4KICAqIEByZXR1cm4gYSBzZWFyY2ggcGF0dGVybiBmb3IgYSBKYXZhIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgaWxsLWZvcm1lZAogICogQHNpbmNlIDMuMQogICovCkBAIC0xMjI1LDExICsxODcxLDE0IEBACiAJCWlnbm9yZURlY2xhcmluZ1R5cGUgPSAobGltaXRUbyAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLklHTk9SRV9ERUNMQVJJTkdfVFlQRSkgIT0gMDsKIAkJaWdub3JlUmV0dXJuVHlwZSA9IChsaW1pdFRvICYgSUphdmFTZWFyY2hDb25zdGFudHMuSUdOT1JFX1JFVFVSTl9UWVBFKSAhPSAwOwogCX0KKwlpZiAoKG1hdGNoUnVsZSA9IHZhbGlkYXRlTWF0Y2hSdWxlKG51bGwsIG1hdGNoUnVsZSkpID09IC0xKSB7CisJCXJldHVybiBudWxsOworCX0KIAljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSA9IG51bGw7CiAJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBudWxsOwogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEIDoKLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpIGVsZW1lbnQ7IAorCQkJSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgZWxlbWVudDsKIAkJCWlmICghaWdub3JlRGVjbGFyaW5nVHlwZSkgewogCQkJCUlUeXBlIGRlY2xhcmluZ0NsYXNzID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpOwogCQkJCWRlY2xhcmluZ1NpbXBsZU5hbWUgPSBkZWNsYXJpbmdDbGFzcy5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CkBAIC0xMjY0LDQwICsxOTEzLDE1IEBACiAJCQkJfQogCQkJfQogCQkJLy8gQ3JlYXRlIGZpZWxkIHBhdHRlcm4KLQkJCWJvb2xlYW4gZmluZERlY2xhcmF0aW9ucyA9IGZhbHNlOwotCQkJYm9vbGVhbiByZWFkQWNjZXNzID0gZmFsc2U7Ci0JCQlib29sZWFuIHdyaXRlQWNjZXNzID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG1hc2tlZExpbWl0VG8pIHsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6Ci0JCQkJCWZpbmREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgotCQkJCQlyZWFkQWNjZXNzID0gdHJ1ZTsKLQkJCQkJd3JpdGVBY2Nlc3MgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFQURfQUNDRVNTRVMgOgotCQkJCQlyZWFkQWNjZXNzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5XUklURV9BQ0NFU1NFUyA6Ci0JCQkJCXdyaXRlQWNjZXNzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMgOgotCQkJCQlmaW5kRGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCQkJcmVhZEFjY2VzcyA9IHRydWU7Ci0JCQkJCXdyaXRlQWNjZXNzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZWFyY2hQYXR0ZXJuID0gCisJCQlzZWFyY2hQYXR0ZXJuID0KIAkJCQluZXcgRmllbGRQYXR0ZXJuKAotCQkJCQlmaW5kRGVjbGFyYXRpb25zLAotCQkJCQlyZWFkQWNjZXNzLAotCQkJCQl3cml0ZUFjY2VzcywKLQkJCQkJbmFtZSwgCi0JCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAotCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKLQkJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQluYW1lLAorCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAorCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLAorCQkJCQl0eXBlUXVhbGlmaWNhdGlvbiwKIAkJCQkJdHlwZVNpbXBsZU5hbWUsCiAJCQkJCXR5cGVTaWduYXR1cmUsCisJCQkJCWxpbWl0VG8sCiAJCQkJCW1hdGNoUnVsZSk7CiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuSU1QT1JUX0RFQ0xBUkFUSU9OIDoKQEAgLTEzMDgsNyArMTkzMiw3IEBACiAJCQlpZiAoaW1wb3J0RGVjbC5pc09uRGVtYW5kKCkpIHsKIAkJCQlzZWFyY2hQYXR0ZXJuID0gY3JlYXRlUGFja2FnZVBhdHRlcm4oZWxlbWVudE5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLCBtYXNrZWRMaW1pdFRvLCBtYXRjaFJ1bGUpOwogCQkJfSBlbHNlIHsKLQkJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJc2VhcmNoUGF0dGVybiA9CiAJCQkJCWNyZWF0ZVR5cGVQYXR0ZXJuKAogCQkJCQkJZWxlbWVudE5hbWUuc3Vic3RyaW5nKGxhc3REb3QrMSkudG9DaGFyQXJyYXkoKSwKIAkJCQkJCWVsZW1lbnROYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KS50b0NoYXJBcnJheSgpLApAQCAtMTMyMSwzNiArMTk0NSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgOgogCQkJTG9jYWxWYXJpYWJsZSBsb2NhbFZhciA9IChMb2NhbFZhcmlhYmxlKSBlbGVtZW50OwotCQkJYm9vbGVhbiBmaW5kVmFyRGVjbGFyYXRpb25zID0gZmFsc2U7Ci0JCQlib29sZWFuIGZpbmRWYXJSZWFkQWNjZXNzID0gZmFsc2U7Ci0JCQlib29sZWFuIGZpbmRWYXJXcml0ZUFjY2VzcyA9IGZhbHNlOwotCQkJc3dpdGNoIChtYXNrZWRMaW1pdFRvKSB7Ci0JCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMgOgotCQkJCQlmaW5kVmFyRGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKLQkJCQkJZmluZFZhclJlYWRBY2Nlc3MgPSB0cnVlOwotCQkJCQlmaW5kVmFyV3JpdGVBY2Nlc3MgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFQURfQUNDRVNTRVMgOgotCQkJCQlmaW5kVmFyUmVhZEFjY2VzcyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV1JJVEVfQUNDRVNTRVMgOgotCQkJCQlmaW5kVmFyV3JpdGVBY2Nlc3MgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6Ci0JCQkJCWZpbmRWYXJEZWNsYXJhdGlvbnMgPSB0cnVlOwotCQkJCQlmaW5kVmFyUmVhZEFjY2VzcyA9IHRydWU7Ci0JCQkJCWZpbmRWYXJXcml0ZUFjY2VzcyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJc2VhcmNoUGF0dGVybiA9IAotCQkJCW5ldyBMb2NhbFZhcmlhYmxlUGF0dGVybigKLQkJCQkJZmluZFZhckRlY2xhcmF0aW9ucywKLQkJCQkJZmluZFZhclJlYWRBY2Nlc3MsCi0JCQkJCWZpbmRWYXJXcml0ZUFjY2VzcywKLQkJCQkJbG9jYWxWYXIsCi0JCQkJCW1hdGNoUnVsZSk7CisJCQlzZWFyY2hQYXR0ZXJuID0gbmV3IExvY2FsVmFyaWFibGVQYXR0ZXJuKGxvY2FsVmFyLCBsaW1pdFRvLCBtYXRjaFJ1bGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOgogCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtID0gKElUeXBlUGFyYW1ldGVyKSBlbGVtZW50OwpAQCAtMTM2NCw3ICsxOTU5LDcgQEAKIAkJCQkJZmluZFBhcmFtRGVjbGFyYXRpb25zID0gZmFsc2U7CiAJCQkJCWJyZWFrOwogCQkJfQotCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJc2VhcmNoUGF0dGVybiA9CiAJCQkJbmV3IFR5cGVQYXJhbWV0ZXJQYXR0ZXJuKAogCQkJCQlmaW5kUGFyYW1EZWNsYXJhdGlvbnMsCiAJCQkJCWZpbmRQYXJhbVJlZmVyZW5jZXMsCkBAIC0xNDM4LDUyICsyMDMzLDM4IEBACiAJCQl9CiAKIAkJCS8vIENyZWF0ZSBtZXRob2QvY29uc3RydWN0b3IgcGF0dGVybgotCQkJYm9vbGVhbiBmaW5kTWV0aG9kRGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCWJvb2xlYW4gZmluZE1ldGhvZFJlZmVyZW5jZXMgPSB0cnVlOwotCQkJc3dpdGNoIChtYXNrZWRMaW1pdFRvKSB7Ci0JCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMgOgotCQkJCQlmaW5kTWV0aG9kUmVmZXJlbmNlcyA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgotCQkJCQlmaW5kTWV0aG9kRGVjbGFyYXRpb25zID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKLQkJCQkJYnJlYWs7Ci0JCQl9CiAJCQlpZiAoaXNDb25zdHJ1Y3RvcikgewogCQkJCXNlYXJjaFBhdHRlcm4gPQogCQkJCQluZXcgQ29uc3RydWN0b3JQYXR0ZXJuKAotCQkJCQkJZmluZE1ldGhvZERlY2xhcmF0aW9ucywKLQkJCQkJCWZpbmRNZXRob2RSZWZlcmVuY2VzLAotCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCi0JCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKLQkJCQkJCXBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwkJCQkJCWRlY2xhcmluZ1NpbXBsZU5hbWUsCisJCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAorCQkJCQkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsCiAJCQkJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcywKIAkJCQkJCXBhcmFtZXRlclNpZ25hdHVyZXMsCiAJCQkJCQltZXRob2QsCisJCQkJCQlsaW1pdFRvLAogCQkJCQkJbWF0Y2hSdWxlKTsKIAkJCX0gZWxzZSB7CiAJCQkJc2VhcmNoUGF0dGVybiA9CiAJCQkJCW5ldyBNZXRob2RQYXR0ZXJuKAotCQkJCQkJZmluZE1ldGhvZERlY2xhcmF0aW9ucywKLQkJCQkJCWZpbmRNZXRob2RSZWZlcmVuY2VzLAotCQkJCQkJc2VsZWN0b3IsIAotCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCi0JCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKLQkJCQkJCXJldHVyblF1YWxpZmljYXRpb24sIAotCQkJCQkJcmV0dXJuU2ltcGxlTmFtZSwgCisJCQkJCQlzZWxlY3RvciwKKwkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sCisJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLAorCQkJCQkJcmV0dXJuUXVhbGlmaWNhdGlvbiwKKwkJCQkJCXJldHVyblNpbXBsZU5hbWUsCiAJCQkJCQlyZXR1cm5TaWduYXR1cmUsCi0JCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywKIAkJCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzLAogCQkJCQkJcGFyYW1ldGVyU2lnbmF0dXJlcywKIAkJCQkJCW1ldGhvZCwKKwkJCQkJCWxpbWl0VG8sCiAJCQkJCQltYXRjaFJ1bGUpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlRZUEUgOgogCQkJSVR5cGUgdHlwZSA9IChJVHlwZSllbGVtZW50OwogCQkJc2VhcmNoUGF0dGVybiA9IAljcmVhdGVUeXBlUGF0dGVybigKLQkJCQkJCXR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpLCAKKwkJCQkJCXR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpLAogCQkJCQkJdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksCiAJCQkJCQlpZ25vcmVEZWNsYXJpbmdUeXBlID8gbnVsbCA6IGVuY2xvc2luZ1R5cGVOYW1lcyh0eXBlKSwKIAkJCQkJCW51bGwsCkBAIC0xNTA1LDY5ICsyMDg2LDY2IEBACiAJc3dpdGNoIChsaW1pdFRvKSB7CiAJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TIDoKIAkJCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKLQkJCQlwYWNrYWdlTmFtZSwgCi0JCQkJZW5jbG9zaW5nVHlwZU5hbWVzLCAKLQkJCQlzaW1wbGVOYW1lLCAKKwkJCQlwYWNrYWdlTmFtZSwKKwkJCQllbmNsb3NpbmdUeXBlTmFtZXMsCisJCQkJc2ltcGxlTmFtZSwKIAkJCQlJSW5kZXhDb25zdGFudHMuVFlQRV9TVUZGSVgsCiAJCQkJbWF0Y2hSdWxlKTsKIAkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKIAkJCWlmICh0eXBlICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2VQYXR0ZXJuKAotCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSwgCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpLAogCQkJCQlzaW1wbGVOYW1lLAogCQkJCQl0eXBlLAogCQkJCQltYXRjaFJ1bGUpOwogCQkJfQogCQkJcmV0dXJuIG5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybigKLQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSwgCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksCiAJCQkJc2ltcGxlTmFtZSwKIAkJCQl0eXBlU2lnbmF0dXJlLAogCQkJCW1hdGNoUnVsZSk7Ci0JCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTIDogCisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTIDoKIAkJCXJldHVybiBuZXcgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybigKLQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSwgCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksCiAJCQkJc2ltcGxlTmFtZSwKIAkJCQlTdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLk9OTFlfU1VQRVJfSU5URVJGQUNFUywKIAkJCQltYXRjaFJ1bGUpOwogCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6CiAJCQlyZXR1cm4gbmV3IE9yUGF0dGVybigKIAkJCQluZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKLQkJCQkJcGFja2FnZU5hbWUsIAotCQkJCQllbmNsb3NpbmdUeXBlTmFtZXMsIAotCQkJCQlzaW1wbGVOYW1lLCAKKwkJCQkJcGFja2FnZU5hbWUsCisJCQkJCWVuY2xvc2luZ1R5cGVOYW1lcywKKwkJCQkJc2ltcGxlTmFtZSwKIAkJCQkJSUluZGV4Q29uc3RhbnRzLlRZUEVfU1VGRklYLAotCQkJCQltYXRjaFJ1bGUpLCAKKwkJCQkJbWF0Y2hSdWxlKSwKIAkJCQkodHlwZSAhPSBudWxsKQogCQkJCQk/IG5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybigKLQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpLCAKKwkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpLAogCQkJCQkJc2ltcGxlTmFtZSwKIAkJCQkJCXR5cGUsCiAJCQkJCQltYXRjaFJ1bGUpCiAJCQkJCTogbmV3IFR5cGVSZWZlcmVuY2VQYXR0ZXJuKAotCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksIAorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksCiAJCQkJCQlzaW1wbGVOYW1lLAogCQkJCQkJdHlwZVNpZ25hdHVyZSwKIAkJCQkJCW1hdGNoUnVsZSkKIAkJCSk7CisJCWRlZmF1bHQ6CisJCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybigKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksCisJCQkJCXNpbXBsZU5hbWUsCisJCQkJCXR5cGUsCisJCQkJCWxpbWl0VG8sCisJCQkJCW1hdGNoUnVsZSk7CisJCQl9CiAJfQogCXJldHVybiBudWxsOwogfQotLyoqCi0gKiBUeXBlIHBhdHRlcm4gYXJlIGZvcm1lZCBieSBbcXVhbGlmaWNhdGlvbiAnLidddHlwZSBbdHlwZUFyZ3VtZW50c10uCi0gKiBlLmcuIGphdmEubGFuZy5PYmplY3QKLSAqCQlSdW5uYWJsZQotICoJCUxpc3QmbHQ7U3RyaW5nJmd0OwotICoKLSAqIEBzaW5jZSAzLjEKLSAqCQlUeXBlIGFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRvIHNlYXJjaCByZWZlcmVuY2VzIHRvIHBhcmFtZXRlcml6ZWQgdHlwZXMuCi0gKiAJYW5kIGxvb2sgYXMgZm9sbG93OiAnJmx0OycgeyBbICc/JyB7J2V4dGVuZHMnfCdzdXBlcid9IF0gdHlwZSAoICcsJyBbICc/JyB7J2V4dGVuZHMnfCdzdXBlcid9IF0gdHlwZSApKiB8ICc/JyB9ICcmZ3Q7JwotICogCVBsZWFzZSBub3RlIHRoYXQ6Ci0gKiAJCS0gJyonIGlzIG5vdCB2YWxpZCBpbnNpZGUgdHlwZSBhcmd1bWVudHMgZGVmaW5pdGlvbiAmbHQ7Jmd0OwotICogCQktICc/JyBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQgd2hlbiBpdCBpcyBpbnNpZGUgJmx0OyZndDsgKGllLiBpdCBtdXN0IGJlIHB1dCBvbiBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgdHlwZSBhcmd1bWVudCkKLSAqLworCiBwcml2YXRlIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVR5cGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoUnVsZSwgY2hhciBpbmRleFN1ZmZpeCkgewotCQotCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlIC8qY29tbWVudCovLCB0cnVlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8zLypzb3VyY2VMZXZlbCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLywgdHJ1ZS8qdGFza0Nhc2VTZW5zaXRpdmUqLyk7IAorCisJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UgLypjb21tZW50Ki8sIHRydWUgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMvKnNvdXJjZUxldmVsKi8sIG51bGwgLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovLCB0cnVlLyp0YXNrQ2FzZVNlbnNpdGl2ZSovKTsKIAlzY2FubmVyLnNldFNvdXJjZShwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCkpOwogCVN0cmluZyB0eXBlID0gbnVsbDsKIAlpbnQgdG9rZW47CkBAIC0xNTg0LDcgKzIxNjIsNyBAQAogCQkJCQlicmVhazsKIAkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1M6CiAJCQkJCWFyZ0NvdW50Kys7Ci0JCQkJCS8vIGZhbGwgdGhyb3VnaCBkZWZhdWx0IGNhc2UgdG8gYWRkIHRva2VuIHRvIHR5cGUKKwkJCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggZGVmYXVsdCBjYXNlIHRvIGFkZCB0b2tlbiB0byB0eXBlCiAJCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCQlpZiAodHlwZSA9PSBudWxsKQogCQkJCQkJdHlwZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RyaW5nKCk7CkBAIC0xNjQ3LDE1ICsyMjI1LDE2IEBACiAJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TIDogLy8gY2Fubm90IHNlYXJjaCBmb3IgZXhwbGljaXQgbWVtYmVyIHR5cGVzCiAJCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4ocXVhbGlmaWNhdGlvbkNoYXJzLCB0eXBlQ2hhcnMsIGluZGV4U3VmZml4LCBtYXRjaFJ1bGUpOwogCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgotCQkJcmV0dXJuIG5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgdHlwZVNpZ25hdHVyZSwgbWF0Y2hSdWxlKTsKLQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMgOiAKKwkJCXJldHVybiBuZXcgVHlwZVJlZmVyZW5jZVBhdHRlcm4ocXVhbGlmaWNhdGlvbkNoYXJzLCB0eXBlQ2hhcnMsIHR5cGVTaWduYXR1cmUsIGluZGV4U3VmZml4LCBtYXRjaFJ1bGUpOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUyA6CiAJCQlyZXR1cm4gbmV3IFN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4ocXVhbGlmaWNhdGlvbkNoYXJzLCB0eXBlQ2hhcnMsIFN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uT05MWV9TVVBFUl9JTlRFUkZBQ0VTLCBpbmRleFN1ZmZpeCwgbWF0Y2hSdWxlKTsKIAkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMgOgogCQkJcmV0dXJuIG5ldyBPclBhdHRlcm4oCiAJCQkJbmV3IFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4ocXVhbGlmaWNhdGlvbkNoYXJzLCB0eXBlQ2hhcnMsIGluZGV4U3VmZml4LCBtYXRjaFJ1bGUpLC8vIGNhbm5vdCBzZWFyY2ggZm9yIGV4cGxpY2l0IG1lbWJlciB0eXBlcwotCQkJCW5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgbWF0Y2hSdWxlKSk7CisJCQkJbmV3IFR5cGVSZWZlcmVuY2VQYXR0ZXJuKHF1YWxpZmljYXRpb25DaGFycywgdHlwZUNoYXJzLCB0eXBlU2lnbmF0dXJlLCBpbmRleFN1ZmZpeCwgbWF0Y2hSdWxlKSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2VQYXR0ZXJuKHF1YWxpZmljYXRpb25DaGFycywgdHlwZUNoYXJzLCB0eXBlU2lnbmF0dXJlLCBsaW1pdFRvLCBpbmRleFN1ZmZpeCwgbWF0Y2hSdWxlKTsKIAl9Ci0JcmV0dXJuIG51bGw7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIGVuY2xvc2luZyB0eXBlIG5hbWVzIG9mIHRoZSBnaXZlbiB0eXBlLgpAQCAtMTY2OSw3ICsyMjQ4LDcgQEAKIAkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKIAkJCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIHJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KAotCQkJCWVuY2xvc2luZ1R5cGVOYW1lcyhkZWNsYXJpbmdUeXBlKSwgCisJCQkJZW5jbG9zaW5nVHlwZU5hbWVzKGRlY2xhcmluZ1R5cGUpLAogCQkJCWRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKIAkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKQEAgLTE2ODIsNyArMjI2MSw3IEBACiAJCQkJbmV3IGNoYXJbXVtdIHtkZWNsYXJpbmdDbGFzcy5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksIElJbmRleENvbnN0YW50cy5PTkVfU1RBUn0pOwogCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgogCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uYXJyYXlDb25jYXQoCi0JCQkJZW5jbG9zaW5nVHlwZU5hbWVzKChJVHlwZSlwYXJlbnQpLCAKKwkJCQllbmNsb3NpbmdUeXBlTmFtZXMoKElUeXBlKXBhcmVudCksCiAJCQkJcGFyZW50LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTE2OTAsMjUgKzIyNjksNTggQEAKIH0KIAogLyoqCi0gKiBEZWNvZGUgdGhlIGdpdmVuIGluZGV4IGtleSBpbiB0aGlzIHBhdHRlcm4uIFRoZSBkZWNvZGVkIGluZGV4IGtleSBpcyB1c2VkIGJ5IAotICoge0BsaW5rICNtYXRjaGVzRGVjb2RlZEtleShTZWFyY2hQYXR0ZXJuKX0gdG8gZmluZCBvdXQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggZW50cnkgCisgKiBEZWNvZGUgdGhlIGdpdmVuIGluZGV4IGtleSBpbiB0aGlzIHBhdHRlcm4uIFRoZSBkZWNvZGVkIGluZGV4IGtleSBpcyB1c2VkIGJ5CisgKiB7QGxpbmsgI21hdGNoZXNEZWNvZGVkS2V5KFNlYXJjaFBhdHRlcm4pfSB0byBmaW5kIG91dCBpZiB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBlbnRyeQogICogc2hvdWxkIGJlIGNvbnNpZGVyZWQuCiAgKiA8cD4KICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkZWNvZGUgYW4gaW5kZXgga2V5LgogICogPC9wPgotICogCisgKgogICogQHBhcmFtIGtleSB0aGUgZ2l2ZW4gaW5kZXgga2V5CiAgKi8KIHB1YmxpYyB2b2lkIGRlY29kZUluZGV4S2V5KGNoYXJbXSBrZXkpIHsKIAkvLyBjYWxsZWQgZnJvbSBmaW5kSW5kZXhNYXRjaGVzKCksIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQogfQogLyoqCisgKiBRdWVyeSBhIGdpdmVuIGluZGV4IGZvciBtYXRjaGluZyBlbnRyaWVzLiBBc3N1bWVzIHRoZSBzZW5kZXIgaGFzIG9wZW5lZCB0aGUgaW5kZXggYW5kIHdpbGwgY2xvc2Ugd2hlbiBmaW5pc2hlZC4KKyAqIAorICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuIAorICogQG5vb3ZlcnJpZGUgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlLWltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCisgKi8KK3B1YmxpYyB2b2lkIGZpbmRJbmRleE1hdGNoZXMoSW5kZXggaW5kZXgsIEluZGV4UXVlcnlSZXF1ZXN0b3IgcmVxdWVzdG9yLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCXRyeSB7CisJCWluZGV4LnN0YXJ0UXVlcnkoKTsKKwkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gY3VycmVudFBhdHRlcm4oKTsKKwkJRW50cnlSZXN1bHRbXSBlbnRyaWVzID0gcGF0dGVybi5xdWVyeUluKGluZGV4KTsKKwkJaWYgKGVudHJpZXMgPT0gbnVsbCkgcmV0dXJuOworCisJCVNlYXJjaFBhdHRlcm4gZGVjb2RlZFJlc3VsdCA9IHBhdHRlcm4uZ2V0QmxhbmtQYXR0ZXJuKCk7CisJCVN0cmluZyBjb250YWluZXJQYXRoID0gaW5kZXguY29udGFpbmVyUGF0aDsKKwkJY2hhciBzZXBhcmF0b3IgPSBpbmRleC5zZXBhcmF0b3I7CisJCWZvciAoaW50IGkgPSAwLCBsID0gZW50cmllcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCisJCQlFbnRyeVJlc3VsdCBlbnRyeSA9IGVudHJpZXNbaV07CisJCQlkZWNvZGVkUmVzdWx0LmRlY29kZUluZGV4S2V5KGVudHJ5LmdldFdvcmQoKSk7CisJCQlpZiAocGF0dGVybi5tYXRjaGVzRGVjb2RlZEtleShkZWNvZGVkUmVzdWx0KSkgeworCQkJCS8vIFRPRE8gKGtlbnQpIHNvbWUgY2xpZW50cyBtYXkgbm90IG5lZWQgdGhlIGRvY3VtZW50IG5hbWVzCisJCQkJU3RyaW5nW10gbmFtZXMgPSBlbnRyeS5nZXREb2N1bWVudE5hbWVzKGluZGV4KTsKKwkJCQlmb3IgKGludCBqID0gMCwgbiA9IG5hbWVzLmxlbmd0aDsgaiA8IG47IGorKykKKwkJCQkJYWNjZXB0TWF0Y2gobmFtZXNbal0sIGNvbnRhaW5lclBhdGgsIHNlcGFyYXRvciwgZGVjb2RlZFJlc3VsdCwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudCwgc2NvcGUsIG1vbml0b3IpOworCQkJfQorCQl9CisJfSBmaW5hbGx5IHsKKwkJaW5kZXguc3RvcFF1ZXJ5KCk7CisJfQorfQorLyoqCiAgKiBSZXR1cm5zIGEgYmxhbmsgcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcmVjb3JkIHRvIGRlY29kZSBhbiBpbmRleCBrZXkuCiAgKiA8cD4KICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IHNlYXJjaCBwYXR0ZXJuIHRoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZAogICogdG8gZGVjb2RlIGluZGV4IGtleXMuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAcmV0dXJuIGEgbmV3IGJsYW5rIHBhdHRlcm4KICAqIEBzZWUgI2RlY29kZUluZGV4S2V5KGNoYXJbXSkKICAqLwpAQCAtMTcyMiw3ICsyMzM0LDcgQEAKICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBuYXJyb3cgZG93biB0aGUKICAqIGluZGV4IHF1ZXJ5LgogICogPC9wPgotICogCisgKgogICogQHJldHVybiBhbiBpbmRleCBrZXkgZnJvbSB0aGlzIHBhdHRlcm4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBpbmRleCBlbnRyaWVzIGFyZSBtYXRjaGVkLgogICovCiBwdWJsaWMgY2hhcltdIGdldEluZGV4S2V5KCkgewpAQCAtMTczNyw3ICsyMzQ5LDcgQEAKICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBuYXJyb3cgZG93biB0aGUKICAqIGluZGV4IHF1ZXJ5LgogICogPC9wPgotICogCisgKgogICogQHJldHVybiBhbiBhcnJheSBvZiBpbmRleCBjYXRlZ29yaWVzCiAgKi8KIHB1YmxpYyBjaGFyW11bXSBnZXRJbmRleENhdGVnb3JpZXMoKSB7CkBAIC0xNzQ2LDIyICsyMzU4LDI4IEBACiAvKioKICAqIFJldHVybnMgdGhlIHJ1bGUgdG8gYXBwbHkgZm9yIG1hdGNoaW5nIGluZGV4IGtleXMuIENhbiBiZSBleGFjdCBtYXRjaCwgcHJlZml4IG1hdGNoLCBwYXR0ZXJuIG1hdGNoIG9yIHJlZ2V4cCBtYXRjaC4KICAqIFJ1bGUgY2FuIGFsc28gYmUgY29tYmluZWQgd2l0aCBhIGNhc2Ugc2Vuc2l0aXZpdHkgZmxhZy4KLSAqIAorICoKICAqIEByZXR1cm4gb25lIG9mIFJfRVhBQ1RfTUFUQ0gsIFJfUFJFRklYX01BVENILCBSX1BBVFRFUk5fTUFUQ0gsIFJfUkVHRVhQX01BVENIIGNvbWJpbmVkIHdpdGggUl9DQVNFX1NFTlNJVElWRSwKLSAqICAgZS5nLiBSX0VYQUNUX01BVENIIHwgUl9DQVNFX1NFTlNJVElWRSBpZiBhbiBleGFjdCBhbmQgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLCAKKyAqICAgZS5nLiBSX0VYQUNUX01BVENIIHwgUl9DQVNFX1NFTlNJVElWRSBpZiBhbiBleGFjdCBhbmQgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLAogICogICBvciBSX1BSRUZJWF9NQVRDSCBpZiBhIHByZWZpeCBub24gY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgcmVxdWVzdGVkLgotICogW1RPRE8gKGZyZWRlcmljKSBJIGhvcGUgUl9FUkFTVVJFX01BVENIIGRvZXNuJ3QgbmVlZCB0byBiZSBvbiB0aGlzIGxpc3QuIEJlY2F1c2UgaXQgd291bGQgYmUgYSBicmVha2luZyBBUEkgY2hhbmdlLl0KLSAqLwkKKyAqLwogcHVibGljIGZpbmFsIGludCBnZXRNYXRjaFJ1bGUoKSB7CiAJcmV0dXJuIHRoaXMubWF0Y2hSdWxlOwogfQogLyoqCisgKiBAbm9yZWZlcmVuY2UgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4gCisgKiBAbm9vdmVycmlkZSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmUtaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0dGVybiAocmVwcmVzZW50aW5nIGEgZGVjb2RlZCBpbmRleCBrZXkpLgogICogPHA+CiAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gbmFycm93IGRvd24gdGhlCiAgKiBpbmRleCBxdWVyeS4KICAqIDwvcD4KLSAqIAorICoKICAqIEBwYXJhbSBkZWNvZGVkUGF0dGVybiBhIHBhdHRlcm4gcmVwcmVzZW50aW5nIGEgZGVjb2RlZCBpbmRleCBrZXkKICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0dGVybgogICovCkBAIC0xNzc1LDcgKzIzOTMsNyBAQAogICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlLWltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGRlZmluZSBob3cKICAqIGEgbmFtZSBtYXRjaGVzIGEgcGF0dGVybi4KICAqIDwvcD4KLSAqIAorICoKICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZXByZXNlbnQgIioiCiAgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQogICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4KQEAgLTE3ODQsMjYgKzI0MDIsMTkgQEAKIAlpZiAocGF0dGVybiA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gbnVsbCBpcyBhcyBpZiBpdCB3YXMgIioiCiAJaWYgKG5hbWUgIT0gbnVsbCkgewogCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9ICh0aGlzLm1hdGNoUnVsZSAmIFJfQ0FTRV9TRU5TSVRJVkUpICE9IDA7Ci0JCWJvb2xlYW4gaXNDYW1lbENhc2UgPSAodGhpcy5tYXRjaFJ1bGUgJiBSX0NBTUVMQ0FTRV9NQVRDSCkgIT0gMDsKIAkJaW50IG1hdGNoTW9kZSA9IHRoaXMubWF0Y2hSdWxlICYgTU9ERV9NQVNLOwogCQlib29sZWFuIGVtcHR5UGF0dGVybiA9IHBhdHRlcm4ubGVuZ3RoID09IDA7Ci0JCWlmIChtYXRjaE1vZGUgPT0gUl9QUkVGSVhfTUFUQ0ggJiYgZW1wdHlQYXR0ZXJuKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGVtcHR5UGF0dGVybiAmJiAodGhpcy5tYXRjaFJ1bGUgJiBSX1BSRUZJWF9NQVRDSCkgIT0gMCkgcmV0dXJuIHRydWU7CiAJCWJvb2xlYW4gc2FtZUxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoID09IG5hbWUubGVuZ3RoOwogCQlib29sZWFuIGNhbkJlUHJlZml4ID0gbmFtZS5sZW5ndGggPj0gcGF0dGVybi5sZW5ndGg7CiAJCWJvb2xlYW4gbWF0Y2hGaXJzdENoYXIgPSAhaXNDYXNlU2Vuc2l0aXZlIHx8IGVtcHR5UGF0dGVybiB8fCAobmFtZS5sZW5ndGggPiAwICYmICBwYXR0ZXJuWzBdID09IG5hbWVbMF0pOwotCQlpZiAoaXNDYW1lbENhc2UgJiYgbWF0Y2hGaXJzdENoYXIgJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChwYXR0ZXJuLCBuYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KIAkJc3dpdGNoIChtYXRjaE1vZGUpIHsKIAkJCWNhc2UgUl9FWEFDVF9NQVRDSCA6Ci0JCQljYXNlIFJfRlVMTF9NQVRDSCA6Ci0JCQkJaWYgKCFpc0NhbWVsQ2FzZSkgewotCQkJCQlpZiAoc2FtZUxlbmd0aCAmJiBtYXRjaEZpcnN0Q2hhcikgewotCQkJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm4sIG5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CisJCQkJaWYgKHNhbWVMZW5ndGggJiYgbWF0Y2hGaXJzdENoYXIpIHsKKwkJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm4sIG5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSk7CiAJCQkJfQotCQkJCS8vIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gbWF0Y2ggYXMgcHJlZml4IGlmIGNhbWVsIGNhc2UgZmFpbGVkCisJCQkJYnJlYWs7CisKIAkJCWNhc2UgUl9QUkVGSVhfTUFUQ0ggOgogCQkJCWlmIChjYW5CZVByZWZpeCAmJiBtYXRjaEZpcnN0Q2hhcikgewogCQkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocGF0dGVybiwgbmFtZSwgaXNDYXNlU2Vuc2l0aXZlKTsKQEAgLTE4MTUsOCArMjQyNiwyMSBAQAogCQkJCQlwYXR0ZXJuID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXR0ZXJuKTsKIAkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuLCBuYW1lLCBpc0Nhc2VTZW5zaXRpdmUpOwogCisJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g6CisJCQkJaWYgKG1hdGNoRmlyc3RDaGFyICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gocGF0dGVybiwgbmFtZSwgZmFsc2UpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkvLyBvbmx5IHRlc3QgY2FzZSBpbnNlbnNpdGl2ZSBhcyBDYW1lbENhc2UgYWxyZWFkeSB2ZXJpZmllZCBwcmVmaXggY2FzZSBzZW5zaXRpdmUKKwkJCQlpZiAoIWlzQ2FzZVNlbnNpdGl2ZSAmJiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhwYXR0ZXJuLCBuYW1lLCBmYWxzZSkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOgorCQkJCXJldHVybiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIG5hbWUsIHRydWUpOworCiAJCQljYXNlIFJfUkVHRVhQX01BVENIIDoKLQkJCQkvLyBUT0RPIChmcmVkZXJpYykgaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAorCQkJCS8vIFRPRE8gaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAogCQkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpAQCAtMTgyNiwzMCArMjQ1MCw0NiBAQAogLyoqCiAgKiBWYWxpZGF0ZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gZ2l2ZW4gc3RyaW5nIHBhdHRlcm4gYW5kIG1hdGNoIHJ1bGUuCiAgKjxicj4KLSAqIE9wdGltaXplZCAoaWUuIHJldHVybmVkIG1hdGNoIHJ1bGUgaXMgbW9kaWZpZWQpIGNvbWJpbmF0aW9ucyBhcmU6Ci0gKiA8dWw+Ci0gKiAJPGxpPntAbGluayAjUl9QQVRURVJOX01BVENIfSB3aXRob3V0IGFueSAnKicgb3IgJz8nIGluIHN0cmluZyBwYXR0ZXJuOgotICogCQlwYXR0ZXJuIG1hdGNoIGJpdCBpcyB1bnNldCwKKyAqIEluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93LCB0aGUgcmV0dXJuZWQgbWF0Y2ggcnVsZSBpcworICogbW9kaWZpZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50IHNlYXJjaCBwYXR0ZXJuOgorICogPG9sPgorICogCTxsaT53aGVuIHRoZSB7QGxpbmsgI1JfUkVHRVhQX01BVENIfSBmbGFnIGlzIHNldCwgdGhlbiA8Yj50aGUgcGF0dGVybiBpcworICogCQlyZWplY3RlZDwvYj4gYXMgdGhpcyBraW5kIG9mIG1hdGNoIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCA8Y29kZT4tMTwvY29kZT4KKyAqIAkJaXMgcmV0dXJuZWQpLgogICogCTwvbGk+Ci0gKiAJPGxpPntAbGluayAjUl9QQVRURVJOX01BVENIfSBhbmQge0BsaW5rICNSX1BSRUZJWF9NQVRDSH0gIGJpdHMgc2ltdWx0YW5lb3VzbHkgc2V0OgotICogCQlwcmVmaXggbWF0Y2ggYml0IGlzIHVuc2V0LAorICogCTxsaT53aGVuIHRoZSBzdHJpbmcgcGF0dGVybiBoYXMgPHU+bm88L3U+IHBhdHRlcm4gY2hhcmFjdGVycyAoZS5nLiAnKicgb3IgJz8nKQorICogCQlhbmQgdGhlIHBhdHRlcm4gbWF0Y2ggZmxhZyBpcyBzZXQgKGkuZS4gdGhlIG1hdGNoIHJ1bGUgaGFzIHRoZSB7QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH0KKyAqIAkJZmxhZyksIHRoZW4gPGI+dGhlIHBhdHRlcm4gbWF0Y2ggZmxhZyBpcyByZXNldDwvYj4uPGJyPgorICogCQlSZXZlcnNlbHksIHdoZW4gdGhlIHN0cmluZyBwYXR0ZXJuIGhhcyBwYXR0ZXJuIGNoYXJhY3RlcnMgYW5kIHRoZSBwYXR0ZXJuCisgKiAJCW1hdGNoIGZsYWcgaXMgPHU+bm90PC91PiBzZXQsIHRoZW4gPGI+dGhlIHBhdHRlcm4gbWF0Y2ggZmxhZyBpcyBzZXQ8L2I+LgogICogCTwvbGk+Ci0gKiAJPGxpPntAbGluayAjUl9QQVRURVJOX01BVENIfSBhbmQge0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH0gIGJpdHMgc2ltdWx0YW5lb3VzbHkgc2V0OgotICogCQljYW1lbCBjYXNlIG1hdGNoIGJpdCBpcyB1bnNldCwKKyAqIAk8bGk+d2hlbiB0aGUge0BsaW5rICNSX1BBVFRFUk5fTUFUQ0h9IGZsYWcgaXMgc2V0IHRoZW4sIDxiPm90aGVyCisgKiAJCXtAbGluayAjUl9QUkVGSVhfTUFUQ0h9LCB7QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfSBvcgorICogCQl7QGxpbmsgI1JfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSH0gZmxhZ3MgYXJlIHJlc2V0PC9iPgorICogCQlpZiB0aGV5IGFyZSB0ZW50YXRpdmVseSBjb21iaW5lZC4KICAqIAk8L2xpPgotICogCTxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfSB3aXRoIGludmFsaWQgY29tYmluYXRpb24gb2YgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVyczoKLSAqIAkJY2FtZWwgY2FzZSBtYXRjaCBiaXQgaXMgdW5zZXQgYW5kIHJlcGxhY2VkIHdpdGggcHJlZml4IG1hdGNoIHBhdHRlcm4sCisgKiAJPGxpPndoZW4gdGhlIHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9IGZsYWcgaXMgc2V0LCB0aGVuIDxiPm90aGVyCisgKiAJCXtAbGluayAjUl9QUkVGSVhfTUFUQ0h9IG9yIHtAbGluayAjUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIfQorICogCQlmbGFncyBhcmUgcmVzZXQ8L2I+IGlmIHRoZXkgYXJlIHRlbnRhdGl2ZWx5IGNvbWJpbmVkLjxicj4KKyAqIAkJUmV2ZXJzZWx5LCBpZiB0aGUgc3RyaW5nIHBhdHRlcm4gY2Fubm90IGJlIGEgY2FtZWwgY2FzZSBwYXR0ZXJuIChpLmUuIGNvbnRhaW5zCisgKiAJCWludmFsaWQgSmF2YSBpZGVudGlmaWVyIGNoYXJhY3RlcnMgb3IgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gdXBwZXJjYXNlCisgKiAJCWNoYXJhY3RlcnMgLSBvbmUgZm9yIG1ldGhvZCBjYW1lbCBjYXNlIHBhdHRlcm5zKSwgdGhlbiA8Yj50aGUgQ2FtZWxDYXNlCisgKiAJCW1hdGNoIGZsYWcgaXMgcmVwbGFjZWQgd2l0aCBhIHByZWZpeCBtYXRjaCBmbGFnPC9iPi4KICAqIAk8L2xpPgotICogCTxsaT57QGxpbmsgI1JfQ0FNRUxDQVNFX01BVENIfSBjb21iaW5lZCB3aXRoIHtAbGluayAjUl9QUkVGSVhfTUFUQ0h9IGFuZCB7QGxpbmsgI1JfQ0FTRV9TRU5TSVRJVkV9Ci0gKiAJCWJpdHMgaXMgcmVkdWNlZCB0byBvbmx5IHtAbGluayAjUl9DQU1FTENBU0VfTUFUQ0h9IGFzIENhbWVsIENhc2Ugc2VhcmNoIGlzIGFscmVhZHkgcHJlZml4IGFuZCBjYXNlIHNlbnNpdGl2ZSwKKyAqIAk8bGk+d2hlbiB0aGUge0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9IGZsYWcgaXMgc2V0LAorICogCQl0aGVuIDxiPih7QGxpbmsgI1JfUFJFRklYX01BVENIfSBmbGFnIGlzIHJlc2V0PC9iPiBpZiBpdCdzIHRlbnRhdGl2ZWx5CisgKiAJCWNvbWJpbmVkLjxicj4KKyAqIAkJUmV2ZXJzZWx5LCBpZiB0aGUgc3RyaW5nIHBhdHRlcm4gY2Fubm90IGJlIGEgY2FtZWwgY2FzZSBwYXR0ZXJuIChpLmUuIGNvbnRhaW5zCisgKiAJCWludmFsaWQgSmF2YSBpZGVudGlmaWVyIGNoYXJhY3RlcnMgb3IgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gdXBwZXJjYXNlCisgKiAJCWNoYXJhY3RlcnMgLSBvbmUgZm9yIG1ldGhvZCBjYW1lbCBjYXNlIHBhdHRlcm5zKSwgdGhlbiA8Yj50aGUgQ2FtZWxDYXNlCisgKiAJCXBhcnQgY291bnQgbWF0Y2ggZmxhZyBpcyByZXNldDwvYj4uCiAgKiAJPC9saT4KLSAqIDwvdWw+Ci0gKjxicj4KLSAqIFJlamVjdGVkIChpZS4gcmV0dXJuZWQgbWF0Y2ggcnVsZSAtMSkgY29tYmluYXRpb25zIGFyZToKLSAqIDx1bD4KLSAqIAk8bGk+e0BsaW5rICNSX1JFR0VYUF9NQVRDSH0gd2l0aCBhbnkgb3RoZXIgbWF0Y2ggbW9kZSBiaXQgc2V0LAotICogCTwvbGk+Ci0gKiA8L3VsPgorICogPC9vbD4KKyAqIDxpPk5vdGU6IHRoZSBydWxlcyBhcmUgdmFsaWRhdGVkIGluIHRoZSBkb2N1bWVudGVkIG9yZGVyLiBGb3IgZXhhbXBsZSwgaXQgbWVhbnMKKyAqIAl0aGF0IGFzIHNvb24gYXMgdGhlIHN0cmluZyBwYXR0ZXJuIGNvbnRhaW5zIG9uZSBwYXR0ZXJuIGNoYXJhY3RlciwgdGhlIHBhdHRlcm4KKyAqIAltYXRjaCBmbGFnIHdpbGwgYmUgc2V0IGFuZCBhbGwgb3RoZXIgbWF0Y2ggZmxhZ3MgcmVzZXQ6IHZhbGlkYXRpb24gb2YgcnVsZSAyKQorICogCWZvbGxvd2VkIGJ5IHJ1bGUgMykuLi48L2k+CisgKjxwPgogICoKICAqIEBwYXJhbSBzdHJpbmdQYXR0ZXJuIFRoZSBzdHJpbmcgcGF0dGVybgogICogQHBhcmFtIG1hdGNoUnVsZSBUaGUgbWF0Y2ggcnVsZQpAQCAtMTg2MCw2MSArMjUwMCw5NiBAQAogCiAJLy8gVmVyaWZ5IFJlZ2V4cCBtYXRjaCBydWxlCiAJaWYgKChtYXRjaFJ1bGUgJiBSX1JFR0VYUF9NQVRDSCkgIT0gMCkgewotCQlpZiAoKG1hdGNoUnVsZSAmIFJfUEFUVEVSTl9NQVRDSCkgIT0gMCB8fCAobWF0Y2hSdWxlICYgUl9QUkVGSVhfTUFUQ0gpICE9IDAgfHwgKG1hdGNoUnVsZSAmIFJfQ0FNRUxDQVNFX01BVENIKSAhPSAwKSB7CisJCWlmICgobWF0Y2hSdWxlICYgUl9QQVRURVJOX01BVENIKSAhPSAwIHx8IChtYXRjaFJ1bGUgJiBSX1BSRUZJWF9NQVRDSCkgIT0gMCB8fAorCQkJKG1hdGNoUnVsZSAmIFJfQ0FNRUxDQVNFX01BVENIKSAhPSAwIHx8IChtYXRjaFJ1bGUgJiBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0gpICE9IDApIHsKKwkJCS8vIHJlZ2V4cCBpcyBub3Qgc3VwcG9ydGVkIHlldAogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCiAJLy8gVmVyaWZ5IFBhdHRlcm4gbWF0Y2ggcnVsZQotCWludCBzdGFySW5kZXggPSBzdHJpbmdQYXR0ZXJuLmluZGV4T2YoJyonKTsKLQlpbnQgcXVlc3Rpb25JbmRleCA9IHN0cmluZ1BhdHRlcm4uaW5kZXhPZignPycpOwotCWlmIChzdGFySW5kZXggPCAwICYmIHF1ZXN0aW9uSW5kZXggPCAwKSB7Ci0JCS8vIHJlc2V0IHBhdHRlcm4gbWF0Y2ggYml0IGlmIGFueQotCQltYXRjaFJ1bGUgJj0gflJfUEFUVEVSTl9NQVRDSDsKLQl9IGVsc2UgewotCQkvLyBmb3JjZSBQYXR0ZXJuIHJ1bGUKLQkJbWF0Y2hSdWxlIHw9IFJfUEFUVEVSTl9NQVRDSDsKKwlpZiAoc3RyaW5nUGF0dGVybiAhPSBudWxsKSB7CisJCWludCBzdGFySW5kZXggPSBzdHJpbmdQYXR0ZXJuLmluZGV4T2YoJyonKTsKKwkJaW50IHF1ZXN0aW9uSW5kZXggPSBzdHJpbmdQYXR0ZXJuLmluZGV4T2YoJz8nKTsKKwkJaWYgKHN0YXJJbmRleCA8IDAgJiYgcXVlc3Rpb25JbmRleCA8IDApIHsKKwkJCS8vIHJlc2V0IHBhdHRlcm4gbWF0Y2ggZmxhZyBpZiBhbnkKKwkJCW1hdGNoUnVsZSAmPSB+Ul9QQVRURVJOX01BVENIOworCQl9IGVsc2UgeworCQkJLy8gZm9yY2UgUGF0dGVybiBydWxlCisJCQltYXRjaFJ1bGUgfD0gUl9QQVRURVJOX01BVENIOworCQl9CiAJfQogCWlmICgobWF0Y2hSdWxlICYgUl9QQVRURVJOX01BVENIKSAhPSAwKSB7Ci0JCS8vIHJlbW92ZSBDYW1lbCBDYXNlIGFuZCBQcmVmaXggbWF0Y2ggYml0cyBpZiBhbnkKKwkJLy8gcmVzZXQgb3RoZXIgaW5jb21wYXRpYmxlIGZsYWdzCiAJCW1hdGNoUnVsZSAmPSB+Ul9DQU1FTENBU0VfTUFUQ0g7CisJCW1hdGNoUnVsZSAmPSB+Ul9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOwogCQltYXRjaFJ1bGUgJj0gflJfUFJFRklYX01BVENIOworCQlyZXR1cm4gbWF0Y2hSdWxlOwogCX0KIAotCS8vIFZlcmlmeSBDYW1lbCBDYXNlIG1hdGNoIHJ1bGUKKwkvLyBWZXJpZnkgQ2FtZWwgQ2FzZQogCWlmICgobWF0Y2hSdWxlICYgUl9DQU1FTENBU0VfTUFUQ0gpICE9IDApIHsKLQkJLy8gVmVyaWZ5IHN0aW5nIHBhdHRlcm4gdmFsaWRpdHkKLQkJaW50IGxlbmd0aCA9IHN0cmluZ1BhdHRlcm4ubGVuZ3RoKCk7Ci0JCWJvb2xlYW4gdmFsaWRDYW1lbENhc2UgPSB0cnVlOwotCQlib29sZWFuIHVwcGVyY2FzZSA9IGZhbHNlOwotCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoICYmIHZhbGlkQ2FtZWxDYXNlOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHJpbmdQYXR0ZXJuLmNoYXJBdChpKTsKLQkJCXZhbGlkQ2FtZWxDYXNlID0gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2gpOwotCQkJLy8gYXQgbGVhc3Qgb25lIHVwcGVyY2FzZSBjaGFyYWN0ZXIgaXMgbmVlZCBpbiBDYW1lbENhc2UgcGF0dGVybgotCQkJLy8gKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNjMxMykKLQkJCWlmICghdXBwZXJjYXNlKSB1cHBlcmNhc2UgPSBTY2FubmVySGVscGVyLmlzVXBwZXJDYXNlKGNoKTsKLQkJfQotCQl2YWxpZENhbWVsQ2FzZSA9IHZhbGlkQ2FtZWxDYXNlICYmIHVwcGVyY2FzZTsKLQkJLy8gVmVyaWZ5IGJpdHMgY29tcGF0aWJpbGl0eQotCQlpZiAodmFsaWRDYW1lbENhc2UpIHsKLQkJCWlmICgobWF0Y2hSdWxlICYgUl9QUkVGSVhfTUFUQ0gpICE9IDApIHsKLQkJCQlpZiAoKG1hdGNoUnVsZSAmIFJfQ0FTRV9TRU5TSVRJVkUpICE9IDApIHsKLQkJCQkJLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIENhbWVsIENhc2UgbWF0Y2ggcnVsZQotCQkJCQltYXRjaFJ1bGUgJj0gflJfUFJFRklYX01BVENIOwotCQkJCQltYXRjaFJ1bGUgJj0gflJfQ0FTRV9TRU5TSVRJVkU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeworCQkvLyByZXNldCBvdGhlciBpbmNvbXBhdGlibGUgZmxhZ3MKKwkJbWF0Y2hSdWxlICY9IH5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g7CisJCW1hdGNoUnVsZSAmPSB+Ul9QUkVGSVhfTUFUQ0g7CisJCS8vIHZhbGlkYXRlIGNhbWVsIGNhc2UgcnVsZSBhbmQgbW9kaWZ5IGl0IGlmIG5vdCB2YWxpZAorCQlib29sZWFuIHZhbGlkQ2FtZWxDYXNlID0gdmFsaWRhdGVDYW1lbENhc2VQYXR0ZXJuKHN0cmluZ1BhdHRlcm4pOworCQlpZiAoIXZhbGlkQ2FtZWxDYXNlKSB7CiAJCQltYXRjaFJ1bGUgJj0gflJfQ0FNRUxDQVNFX01BVENIOwotCQkJaWYgKChtYXRjaFJ1bGUgJiBSX1BSRUZJWF9NQVRDSCkgPT0gMCkgewotCQkJCW1hdGNoUnVsZSB8PSBSX1BSRUZJWF9NQVRDSDsKLQkJCQltYXRjaFJ1bGUgfD0gUl9DQVNFX1NFTlNJVElWRTsKLQkJCX0KKwkJCW1hdGNoUnVsZSB8PSBSX1BSRUZJWF9NQVRDSDsKIAkJfQorCQlyZXR1cm4gbWF0Y2hSdWxlOwogCX0KKworCS8vIFZlcmlmeSBDYW1lbCBDYXNlIHdpdGggc2FtZSBjb3VudCBvZiBwYXJ0cworCWlmICgobWF0Y2hSdWxlICYgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIKSAhPSAwKSB7CisJCS8vIHJlc2V0IG90aGVyIGluY29tcGF0aWJsZSBmbGFncworCQltYXRjaFJ1bGUgJj0gflJfUFJFRklYX01BVENIOworCQkvLyB2YWxpZGF0ZSBjYW1lbCBjYXNlIHJ1bGUgYW5kIG1vZGlmeSBpdCBpZiBub3QgdmFsaWQKKwkJYm9vbGVhbiB2YWxpZENhbWVsQ2FzZSA9IHZhbGlkYXRlQ2FtZWxDYXNlUGF0dGVybihzdHJpbmdQYXR0ZXJuKTsKKwkJaWYgKCF2YWxpZENhbWVsQ2FzZSkgeworCQkJbWF0Y2hSdWxlICY9IH5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g7CisJCX0KKwkJcmV0dXJuIG1hdGNoUnVsZTsKKwl9CisKKwkvLyBSZXR1cm4gdGhlIHZhbGlkYXRlZCBtYXRjaCBydWxlIChtb2RpZmllZCBpZiBuZWNlc3NhcnkpCiAJcmV0dXJuIG1hdGNoUnVsZTsKIH0KIAorLyoKKyAqIFZhbGlkYXRlIHBhdHRlcm4gZm9yIGEgY2FtZWwgY2FzZSBtYXRjaCBydWxlCisgKiBAcmV0dXJuCisgKi8KK3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVDYW1lbENhc2VQYXR0ZXJuKFN0cmluZyBzdHJpbmdQYXR0ZXJuKSB7CisJaWYgKHN0cmluZ1BhdHRlcm4gPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJLy8gdmVyaWZ5IHN0aW5nIHBhdHRlcm4gdmFsaWRpdHkKKwlpbnQgbGVuZ3RoID0gc3RyaW5nUGF0dGVybi5sZW5ndGgoKTsKKwlib29sZWFuIHZhbGlkQ2FtZWxDYXNlID0gdHJ1ZTsKKwlib29sZWFuIGxvd2VyQ2FtZWxDYXNlID0gZmFsc2U7CisJaW50IHVwcGVyY2FzZSA9IDA7CisJZm9yIChpbnQgaT0wOyBpPGxlbmd0aCAmJiB2YWxpZENhbWVsQ2FzZTsgaSsrKSB7CisJCWNoYXIgY2ggPSBzdHJpbmdQYXR0ZXJuLmNoYXJBdChpKTsKKwkJdmFsaWRDYW1lbENhc2UgPSBpPT0wID8gU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2gpIDogU2Nhbm5lckhlbHBlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCk7CisJCS8vIGF0IGxlYXN0IG9uZSB1cHBlcmNhc2UgY2hhcmFjdGVyIGlzIG5lZWQgaW4gQ2FtZWxDYXNlIHBhdHRlcm4KKwkJLy8gKHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNjMxMykKKwkJaWYgKFNjYW5uZXJIZWxwZXIuaXNVcHBlckNhc2UoY2gpKSB1cHBlcmNhc2UrKzsKKwkJaWYgKGk9PTApIGxvd2VyQ2FtZWxDYXNlID0gdXBwZXJjYXNlID09IDA7CisJfQorCWlmICh2YWxpZENhbWVsQ2FzZSkgeworCQl2YWxpZENhbWVsQ2FzZSA9IGxvd2VyQ2FtZWxDYXNlID8gdXBwZXJjYXNlID4gMCA6IHVwcGVyY2FzZSA+IDEgOworCX0KKwlyZXR1cm4gdmFsaWRDYW1lbENhc2U7Cit9CisKKy8qKgorICogQG5vcmVmZXJlbmNlIFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuIAorICogQG5vb3ZlcnJpZGUgVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlLWltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCisgKi8KK3B1YmxpYyBFbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIGluZGV4LnF1ZXJ5KGdldEluZGV4Q2F0ZWdvcmllcygpLCBnZXRJbmRleEtleSgpLCBnZXRNYXRjaFJ1bGUoKSk7Cit9CisKIC8qKgogICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEKaW5kZXggYWU1ODczYy4uMWJkMWYwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaFJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDcgKzEzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIAogLyoqCi0gKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyBmcm9tIGEgc2VhcmNoIGVuZ2luZSBxdWVyeS4gCisgKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyBmcm9tIGEgc2VhcmNoIGVuZ2luZSBxdWVyeS4KICAqIENsaWVudHMgaW1wbGVtZW50IGEgc3ViY2xhc3MgdG8gcGFzcyB0byA8Y29kZT5TZWFyY2hFbmdpbmUuc2VhcmNoPC9jb2RlPgogICogYW5kIGltcGxlbWVudCB0aGUge0BsaW5rICNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9IG1ldGhvZCwgYW5kCiAgKiBwb3NzaWJseSBvdmVycmlkZSBvdGhlciBsaWZlIGN5Y2xlIG1ldGhvZHMuCkBAIC03Miw3ICs3Miw3IEBACiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzCiAJICogbWF5IG92ZXJyaWRlLgogCSAqIDwvcD4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBwYXJ0aWNpcGFudCB0aGUgcGFydGljaXBhbnQgdGhhdCBpcyBzdGFydGluZyB0byBjb250cmlidXRlCiAJICovCiAJcHVibGljIHZvaWQgZW50ZXJQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewpAQCAtODYsNyArODYsNyBAQAogCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcwogCSAqIG1heSBvdmVycmlkZS4KIAkgKiA8L3A+Ci0JICogCisJICoKIAkgKiBAcGFyYW0gcGFydGljaXBhbnQgdGhlIHBhcnRpY2lwYW50IHRoYXQgZmluaXNoZWQgY29udHJpYnV0aW5nCiAJICovCiAJcHVibGljIHZvaWQgZXhpdFBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVEZWNsYXJhdGlvbk1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVEZWNsYXJhdGlvbk1hdGNoLmphdmEKaW5kZXggNmFjNmUyYS4uOTNhYjAwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlRGVjbGFyYXRpb25NYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZURlY2xhcmF0aW9uTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNCArMTksMTQgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjAKICAqLwogcHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbk1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggewogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyB0eXBlIGRlY2xhcmF0aW9uIG1hdGNoLgotCSAqIAorCSAqCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIHR5cGUgZGVjbGFyYXRpb24KIAkgKiBAcGFyYW0gYWNjdXJhY3kgb25lIG9mIEFfQUNDVVJBVEUgb3IgQV9JTkFDQ1VSQVRFCiAJICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoZSBtYXRjaCBzdGFydHMgYXQsIG9yIC0xIGlmIHVua25vd24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZU5hbWVNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlTmFtZU1hdGNoLmphdmEKaW5kZXggY2M2MjMyNy4uOWNhM2EzYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlTmFtZU1hdGNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlTmFtZU1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsMTUgKzEzLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKIAogLyoqCi0gKiBBIG1hdGNoIGNvbGxlY3RlZCB3aGlsZSB7QGxpbmsgU2VhcmNoRW5naW5lIHNlYXJjaGluZ30gZm9yIAorICogQSBtYXRjaCBjb2xsZWN0ZWQgd2hpbGUge0BsaW5rIFNlYXJjaEVuZ2luZSBzZWFyY2hpbmd9IGZvcgogICogYWxsIHR5cGUgbmFtZXMgbWV0aG9kcyB1c2luZyBhIHtAbGluayBUeXBlTmFtZVJlcXVlc3RvciByZXF1ZXN0b3J9LgogICogPHA+CiAgKiBUaGUgdHlwZSBvZiB0aGlzIG1hdGNoIGlzIGF2YWlsYWJsZSBmcm9tIHtAbGluayAjZ2V0VHlwZSgpfS4KICAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBjbGllbnRzLgotICogPC9wPgotICogCisgKgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqCiAgKiBAc2VlIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IKICAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaEFsbFR5cGVOYW1lcyhjaGFyW10sIGludCwgY2hhcltdLCBpbnQsIGludCwgSUphdmFTZWFyY2hTY29wZSwgVHlwZU5hbWVNYXRjaFJlcXVlc3RvciwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKICAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaEFsbFR5cGVOYW1lcyhjaGFyW11bXSwgY2hhcltdW10sIElKYXZhU2VhcmNoU2NvcGUsIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCkBAIC0zMCwxMiArMjksMjYgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlTmFtZU1hdGNoIHsKIAogLyoqCisgKiBSZXR1cm5zIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSB0eXBlIG5hbWUgbWF0Y2gKKyAqCisgKiBAc2VlIElBY2Nlc3NSdWxlCisgKgorICogQHJldHVybiB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgdHlwZSBuYW1lIHdoaWNoIG1heSBiZQorICogCQl7QGxpbmsgSUFjY2Vzc1J1bGUjS19BQ0NFU1NJQkxFfSwge0BsaW5rIElBY2Nlc3NSdWxlI0tfRElTQ09VUkFHRUR9CisgKiAJCW9yIHtAbGluayBJQWNjZXNzUnVsZSNLX05PTl9BQ0NFU1NJQkxFfS4KKyAqIAkJVGhlIGRlZmF1bHQgcmV0dXJuZWQgdmFsdWUgaXMge0BsaW5rIElBY2Nlc3NSdWxlI0tfQUNDRVNTSUJMRX0uCisgKgorICogQHNpbmNlIDMuNgorICovCitwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFjY2Vzc2liaWxpdHkoKTsKKworLyoqCiAgKiBSZXR1cm5zIHRoZSBtYXRjaGVkIHR5cGUncyBmdWxseSBxdWFsaWZpZWQgbmFtZSB1c2luZyAnLicgY2hhcmFjdGVyCiAgKiBhcyBzZXBhcmF0b3IgKGUuZy4gcGFja2FnZSBuYW1lICsgJy4nIGVuY2xvc2luZyB0eXBlIG5hbWVzICsgJy4nIHNpbXBsZSBuYW1lKS4KLSAqIAorICoKICAqIEBzZWUgI2dldFR5cGUoKQogICogQHNlZSBJVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLSAqIAorICoKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbWF0Y2hlZCB0eXBlIGlzIDxjb2RlPiBudWxsPC9jb2RlPgogICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9mIHRoZSB0eXBlCiAgKi8KQEAgLTQ4LDcgKzYxLDcgQEAKICAqIDxwPgogICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZCBhcyBuZWl0aGVyIEphdmEgTW9kZWwgbm9yIGNsYXNzcGF0aAogICogaW5pdGlhbGl6YXRpb24gaXMgZG9uZSB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICogCisgKgogICogQHJldHVybiB0aGUgdHlwZSBtb2RpZmllcnMKICAqLwogcHVibGljIGFic3RyYWN0IGludCBnZXRNb2RpZmllcnMoKTsKQEAgLTU2LDEyICs2OSwxMiBAQAogLyoqCiAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2YgdGhlIHN0b3JlZCB0eXBlLgogICogUGFja2FnZSBmcmFnbWVudCByb290IGNhbm5vdCBiZSBudWxsIGFuZCA8c3Ryb25nPmRvZXM8L3N0cm9uZz4gZXhpc3QuCi0gKiAKKyAqCiAgKiBAc2VlICNnZXRUeXBlKCkKICAqIEBzZWUgSUphdmFFbGVtZW50I2dldEFuY2VzdG9yKGludCkKLSAqIAorICoKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbWF0Y2hlZCB0eXBlIGlzIDxjb2RlPiBudWxsPC9jb2RlPgotICogQHJldHVybiB0aGUgZXhpc3RpbmcgamF2YSBtb2RlbCBwYWNrYWdlIGZyYWdtZW50IHJvb3QgKGllLiBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEByZXR1cm4gdGhlIGV4aXN0aW5nIGphdmEgbW9kZWwgcGFja2FnZSBmcmFnbWVudCByb290IChpLmUuIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgogICogCWFuZCB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byA8Y29kZT5leGlzdHMoKTwvY29kZT4gbWVzc2FnZSkuCiAgKi8KIHB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewpAQCAtNzAsMTAgKzgzLDEwIEBACiAKIC8qKgogICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBzdG9yZWQgdHlwZS4KLSAqIAorICoKICAqIEBzZWUgI2dldFR5cGUoKQogICogQHNlZSBJVHlwZSNnZXRQYWNrYWdlRnJhZ21lbnQoKQotICogCisgKgogICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBtYXRjaGVkIHR5cGUgaXMgPGNvZGU+IG51bGw8L2NvZGU+CiAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUKICAqLwpAQCAtODMsMTAgKzk2LDEwIEBACiAKIC8qKgogICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3RvcmVkIHR5cGUuCi0gKiAKKyAqCiAgKiBAc2VlICNnZXRUeXBlKCkKICAqIEBzZWUgSUphdmFFbGVtZW50I2dldEVsZW1lbnROYW1lKCkKLSAqIAorICoKICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbWF0Y2hlZCB0eXBlIGlzIDxjb2RlPiBudWxsPC9jb2RlPgogICogQHJldHVybiB0aGUgdHlwZSBuYW1lCiAgKi8KQEAgLTEwMCw3ICsxMTMsNyBAQAogICogPHA+CiAgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kIGFzIG5laXRoZXIgSmF2YSBNb2RlbCBub3IgY2xhc3NwYXRoCiAgKiBpbml0aWFsaXphdGlvbnMgYXJlIGRvbmUgd2hpbGUgY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAqIAorICoKICAqIEBzZWUgSVR5cGUKICAqIEByZXR1cm4gdGhlIG5vbi1udWxsIGhhbmRsZSBvbiBtYXRjaGVkIGphdmEgbW9kZWwgdHlwZS4KICAqLwpAQCAtMTA5LDEwICsxMjIsMTAgQEAKIC8qKgogICogTmFtZSBvZiB0aGUgdHlwZSBjb250YWluZXIgdXNpbmcgJy4nIGNoYXJhY3RlcgogICogYXMgc2VwYXJhdG9yIChlLmcuIHBhY2thZ2UgbmFtZSArICcuJyArIGVuY2xvc2luZyB0eXBlIG5hbWVzKS4KLSAqIAorICoKICAqIEBzZWUgI2dldFR5cGUoKQogICogQHNlZSBJTWVtYmVyI2dldERlY2xhcmluZ1R5cGUoKQotICogCisgKgogICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBtYXRjaGVkIHR5cGUgaXMgPGNvZGU+IG51bGw8L2NvZGU+CiAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIHR5cGUgY29udGFpbmVyCiAgKi8KQEAgLTEyOCwxMCArMTQxLDEwIEBACiAvKioKICAqIFJldHVybnMgdGhlIG1hdGNoZWQgdHlwZSdzIHR5cGUgcXVhbGlmaWVkIG5hbWUgdXNpbmcgJy4nIGNoYXJhY3RlcgogICogYXMgc2VwYXJhdG9yIChlLmcuIGVuY2xvc2luZyB0eXBlIG5hbWVzICsgJy4nICsgc2ltcGxlIG5hbWUpLgotICogCisgKgogICogQHNlZSAjZ2V0VHlwZSgpCiAgKiBAc2VlIElUeXBlI2dldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIpCi0gKiAKKyAqCiAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG1hdGNoZWQgdHlwZSBpcyA8Y29kZT4gbnVsbDwvY29kZT4KICAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBvZiB0aGUgdHlwZQogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZU5hbWVNYXRjaFJlcXVlc3Rvci5qYXZhCmluZGV4IDc3NDc1YWYuLjM5MDU5M2UgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZU5hbWVNYXRjaFJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZU5hbWVNYXRjaFJlcXVlc3Rvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDEyICsxNCwxMiBAQAogICogQSA8Y29kZT5UeXBlTmFtZU1hdGNoUmVxdWVzdG9yPC9jb2RlPiBjb2xsZWN0cyBtYXRjaGVzIGZyb20gYSA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXM8L2NvZGU+CiAgKiBxdWVyeSB0byBhIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4uIENsaWVudHMgbXVzdCBzdWJjbGFzcyB0aGlzIGFic3RyYWN0IGNsYXNzIGFuZCBwYXNzIGFuIGluc3RhbmNlIHRvIHRoZQogICoge0BsaW5rIFNlYXJjaEVuZ2luZSNzZWFyY2hBbGxUeXBlTmFtZXMoCi0gKgkJY2hhcltdIHBhY2thZ2VOYW1lLCAKLSAqCQlpbnQgcGFja2FnZU1hdGNoUnVsZSwgCisgKgkJY2hhcltdIHBhY2thZ2VOYW1lLAorICoJCWludCBwYWNrYWdlTWF0Y2hSdWxlLAogICoJCWNoYXJbXSB0eXBlTmFtZSwKLSAqCQlpbnQgdHlwZU1hdGNoUnVsZSwgCi0gKgkJaW50IHNlYXJjaEZvciwgCi0gKgkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisgKgkJaW50IHR5cGVNYXRjaFJ1bGUsCisgKgkJaW50IHNlYXJjaEZvciwKKyAqCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogICoJCVR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgbmFtZU1hdGNoUmVxdWVzdG9yLAogICoJCWludCB3YWl0aW5nUG9saWN5LAogICogCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpfSBtZXRob2QuCkBAIC0zNCw3ICszNCw3IEBACiAgKiA8L3A+CiAgKiBAc2VlIFR5cGVOYW1lTWF0Y2gKICAqIEBzZWUgVHlwZU5hbWVSZXF1ZXN0b3IKLSAqIAorICoKICAqIEBzaW5jZSAzLjMKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVOYW1lTWF0Y2hSZXF1ZXN0b3IgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlTmFtZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlTmFtZVJlcXVlc3Rvci5qYXZhCmluZGV4IDBjNTAxN2EuLjE1OWQ4MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVOYW1lUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjksMTQgKzI5LDE0IEBACiAJICogPC9wPgogCSAqCiAJICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXIgZmxhZ3Mgb2YgdGhlIHR5cGUuIE5vdGUgdGhhdCBmb3Igc291cmNlIHR5cGUsCi0JICoJCXRoZXNlIGZsYWdzIG1heSBzbGlnaHRseSBkaWZmZXIgZnJvbSB0aG9zZXMgZ2V0IGFmdGVyIHJlc29sdXRpb24uCisJICoJCXRoZXNlIGZsYWdzIG1heSBzbGlnaHRseSBkaWZmZXIgZnJvbSB0aG9zZSBnZXQgYWZ0ZXIgcmVzb2x1dGlvbi4KIAkgKgkJRm9yIGV4YW1wbGUgYW4gaW50ZXJmYWNlIGRlZmluZWQgYnkgPGNvZGU+aW50ZXJmYWNlIEEge308L2NvZGU+LAogCSAqCQlhbHRob3VnaCBvYnZpb3VzbHkgcHVibGljLCB3aWxsIGJlIHJldHVybmVkIGZhbHNlIGJ5IDxjb2RlPkZsYWdzLmlzUHVibGljKG1vZGlmaWVycyk8L2NvZGU+Ci0JICoJCWR1ZSB0byB0aGUgZmFjdCB0aGF0IGl0cyBkZWNsYXJhdGlvbiBkb2VzIG5vdCBleHBsaWNpdGVseSBkZWZpbmUgcHVibGljIGZsYWcuCisJICoJCWR1ZSB0byB0aGUgZmFjdCB0aGF0IGl0cyBkZWNsYXJhdGlvbiBkb2VzIG5vdCBleHBsaWNpdGx5IGRlZmluZSBwdWJsaWMgZmxhZy4KIAkgKgkJQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFncwotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZG90LXNlcGFyYXRlZCBuYW1lIG9mIHRoZSBwYWNrYWdlIG9mIHRoZSB0eXBlCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBwYWNrYWdlIG5hbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIChpLmUuIGEgZG90LXNlcGFyYXRlZCBuYW1lKQogCSAqIEBwYXJhbSBzaW1wbGVUeXBlTmFtZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIHR5cGUKLQkgKiBAcGFyYW0gZW5jbG9zaW5nVHlwZU5hbWVzIGlmIHRoZSB0eXBlIGlzIGEgbWVtYmVyIHR5cGUsIAorCSAqIEBwYXJhbSBlbmNsb3NpbmdUeXBlTmFtZXMgaWYgdGhlIHR5cGUgaXMgYSBtZW1iZXIgdHlwZSwKIAkgKiAgICAgICAgICB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBlbmNsb3NpbmcgdHlwZXMgZnJvbSB0aGUgb3V0ZXItbW9zdCB0byB0aGUKIAkgKiAgICAgICAgICBkaXJlY3QgcGFyZW50IG9mIHRoZSB0eXBlIChmb3IgZXhhbXBsZSwgaWYgdGhlIGNsYXNzIGlzIHgueS5BJEIkQyB0aGVuCiAJICogICAgICAgICAgdGhlIGVuY2xvc2luZyB0eXBlcyBhcmUgW0EsIEJdLiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoZSB0eXBlCkBAIC00NCw5ICs0NCw5IEBACiAJICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgdHlwZS4gSWYgdGhlIHJlc291cmNlIGlzIGEgLmNsYXNzIGZpbGUKIAkgKiAgICAgICAgICBvciBhIHNvdXJjZSBmaWxlLCB0aGlzIGlzIHRoZSBmdWxsIHBhdGggaW4gdGhlIHdvcmtzcGFjZSB0byB0aGlzIHJlc291cmNlLiBJZiB0aGUKIAkgKiAgICAgICAgICByZXNvdXJjZSBpcyBhbiBhcmNoaXZlICh0aGF0IGlzLCBhIC56aXAgb3IgLmphciBmaWxlKSwgdGhlIHBhdGggaXMgY29tcG9zZWQgb2YgMiBwYXRocyBzZXBhcmF0ZWQKLQkgKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OiAKLQkgKgkJCSB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBleHRlcm5hbCBhcmNoaXZlKSwgCi0JICoJCQkgb3IgdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSA8Y29kZT5JUGF0aDwvY29kZT4gdG8gdGhlIGFyY2hpdmUgKGlmIGl0IGlzIGFuIGludGVybmFsIGFyY2hpdmUpLCAKKwkgKgkJIAkgYnkgPGNvZGU+SUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OgorCSAqCQkJIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBmdWxsIE9TIHBhdGggdG8gdGhlIGFyY2hpdmUgKGlmIGl0IGlzIGFuIGV4dGVybmFsIGFyY2hpdmUpLAorCSAqCQkJIG9yIHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgPGNvZGU+SVBhdGg8L2NvZGU+IHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBpbnRlcm5hbCBhcmNoaXZlKSwKIAkgKiAJCSB0aGUgc2Vjb25kIHBhdGggaXMgdGhlIHBhdGggdG8gdGhlIHJlc291cmNlIGluc2lkZSB0aGUgYXJjaGl2ZS4KIAkgKi8KIAlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk1hdGNoLmphdmEKaW5kZXggZjIzNWU4Yi4uYjY3NDVjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25NYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSwxNCArMTksMTQgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzaW5jZSAzLjEKICAqLwogcHVibGljIGNsYXNzIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggewogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyB0eXBlIHBhcmFtZXRlciBtYXRjaC4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSBlbGVtZW50IHRoZSB0eXBlIHBhcmFtZXRlcgogCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2YgQV9BQ0NVUkFURSBvciBBX0lOQUNDVVJBVEUKIAkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlUGFyYW1ldGVyUmVmZXJlbmNlTWF0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZVBhcmFtZXRlclJlZmVyZW5jZU1hdGNoLmphdmEKaW5kZXggMDRiM2FhMS4uNWU3NDIxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlUGFyYW1ldGVyUmVmZXJlbmNlTWF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVQYXJhbWV0ZXJSZWZlcmVuY2VNYXRjaC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDE0ICsxOSwxNCBAQAogICogPHA+CiAgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMQogICovCiBwdWJsaWMgY2xhc3MgVHlwZVBhcmFtZXRlclJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggewogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBmaWVsZCByZWZlcmVuY2UgbWF0Y2guCi0JICogCisJICoKIAkgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIGZpZWxkCiAJICogQHBhcmFtIGFjY3VyYWN5IG9uZSBvZiB7QGxpbmsgI0FfQUNDVVJBVEV9IG9yIHtAbGluayAjQV9JTkFDQ1VSQVRFfQogCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVSZWZlcmVuY2VNYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9UeXBlUmVmZXJlbmNlTWF0Y2guamF2YQppbmRleCA2N2NlYjU3Li5lODRlOGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1R5cGVSZWZlcmVuY2VNYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvVHlwZVJlZmVyZW5jZU1hdGNoLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsNyArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiAKIC8qKgogICogQSBKYXZhIHNlYXJjaCBtYXRjaCB0aGF0IHJlcHJlc2VudHMgYSB0eXBlIHJlZmVyZW5jZS4KQEAgLTE5LDc4ICsxOSw5MiBAQAogICogPHA+CiAgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgotICogCisgKgogICogQHNpbmNlIDMuMAogICovCi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZU1hdGNoIGV4dGVuZHMgU2VhcmNoTWF0Y2ggeworcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VNYXRjaCBleHRlbmRzIFJlZmVyZW5jZU1hdGNoIHsKIAotCXByaXZhdGUgSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudDsKIAlwcml2YXRlIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHM7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHR5cGUgcmVmZXJlbmNlIG1hdGNoLgotCSAqIAotCSAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBpbm5lci1tb3N0IGVuY2xvc2luZyBtZW1iZXIgdGhhdCByZWZlcmVuY2VzIHRoaXMgdHlwZQotCSAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhlIG1hdGNoIHN0YXJ0cyBhdCwgb3IgLTEgaWYgdW5rbm93bgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gaW5zaWRlRG9jQ29tbWVudCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaCBpcyBpbnNpZGUgYSBkb2MKLQkgKiBjb21tZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudCB0aGUgc2VhcmNoIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGUgbWF0Y2gKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFR5cGVSZWZlcmVuY2VNYXRjaChJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgaW50IGFjY3VyYWN5LAlpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGluc2lkZURvY0NvbW1lbnQsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIoZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwotCQlzZXRJbnNpZGVEb2NDb21tZW50KGluc2lkZURvY0NvbW1lbnQpOwotCX0KKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0eXBlIHJlZmVyZW5jZSBtYXRjaC4KKyAqCisgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgaW5uZXItbW9zdCBlbmNsb3NpbmcgbWVtYmVyIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHR5cGUKKyAqIEBwYXJhbSBhY2N1cmFjeSBvbmUgb2Yge0BsaW5rICNBX0FDQ1VSQVRFfSBvciB7QGxpbmsgI0FfSU5BQ0NVUkFURX0KKyAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLCBvciAtMSBpZiB1bmtub3duCisgKiBAcGFyYW0gaW5zaWRlRG9jQ29tbWVudCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlYXJjaCBtYXRjaCBpcyBpbnNpZGUgYSBkb2MKKyAqIAkJCQljb21tZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAorICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBvZiB0aGUgZWxlbWVudAorICovCitwdWJsaWMgVHlwZVJlZmVyZW5jZU1hdGNoKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBpbnQgYWNjdXJhY3ksIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5zaWRlRG9jQ29tbWVudCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElSZXNvdXJjZSByZXNvdXJjZSkgeworCXN1cGVyKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgaW5zaWRlRG9jQ29tbWVudCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKK30KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIGVsZW1lbnQgb2YgdGhpcyBzZWFyY2ggbWF0Y2guCi0JICogVGhpcyBtYXkgYmUgYSBsb2NhbCB2YXJpYWJsZSB3aGljaCBkZWNsYXJpbmcgdHlwZSBpcyB0aGUgcmVmZXJlbmNlZCBvbmUKLQkgKiBvciBhIHR5cGUgcGFyYW1ldGVyIHdoaWNoIGV4dGVuZHMgaXQuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgc2VhcmNoIG1hdGNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIG9yIHRoZXJlJ3MKLQkgKiAJbm8gbW9yZSBzcGVjaWZpYyBsb2NhbCBlbGVtZW50IHRoYW4gdGhlIGVsZW1lbnQgaXRzZWxmICh7QGxpbmsgU2VhcmNoTWF0Y2gjZ2V0RWxlbWVudCgpfSkuCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCBJSmF2YUVsZW1lbnQgZ2V0TG9jYWxFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5sb2NhbEVsZW1lbnQ7Ci0JfQorLyoqCisgKiBSZXR1cm5zIG90aGVyIGVsZW1lbnRzIGFsc28gZW5jbG9zaW5nIHRoZSB0eXBlIHJlZmVyZW5jZS4gVGhpcyB0eXBpY2FsbHkgY2FuCisgKiBoYXBwZW4gZm9yIG11bHRpcGxlIGZpZWxkcyBvciBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCisgKjxwPgorICogRm9yIGV4YW1wbGUsCisgKiA8dWw+CisgKiAJPGxpPnNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+VGVzdDwvY29kZT4gaW4KKyAqICAgICAgICAgPHByZT4KKyAqICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgVGVzdCB0ZXN0MSwgdGVzdDIsIHRlc3QzOworICogICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7fQorICogICAgICAgICB9CisgKiAgICAgICAgIDwvcHJlPgorICogCQl3aWxsIHJldHVybiBvbmUgbWF0Y2ggd2hvc2Ugb3RoZXIgZWxlbWVudHMgaXMgYW4gYXJyYXkgb2YgdHdvIGZpZWxkczoKKyAqIAkJe0BsaW5rIElGaWVsZCB0ZXN0Mn0gYW5kIHtAbGluayBJRmllbGQgdGVzdDN9LgorICogCQk8YnI+PGJyPgorICogCTwvbGk+CisgKiAJPGxpPnNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgPGNvZGU+VGVzdDwvY29kZT4gaW4KKyAqIAkJPHByZT4KKyAqICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgU3RyaW5nIHN0cjsKKyAqICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCkgeworICogICAgICAgICAgICAgICAgIFRlc3QgbG9jYWwxLCBsb2NhbDIsIGxvY2FsMzsKKyAqICAgICAgICAgICAgIH0KKyAqICAgICAgICAgfQorICogICAgICAgICA8L3ByZT4KKyAqIAkJd2lsbCByZXR1cm4gb25lIG1hdGNoIHdob3NlIG90aGVyIGVsZW1lbnRzIGlzIGFuIGFycmF5IG9mIHR3byBsb2NhbAorICogCQl2YXJpYWJsZXM6IHtAbGluayBJTG9jYWxWYXJpYWJsZSBsb2NhbDJ9IGFuZCB7QGxpbmsgSUxvY2FsVmFyaWFibGUgbG9jYWwzfS4KKyAqIAkJPGJyPjxicj4KKyAqIAk8L2xpPgorICogCTxsaT5zaW5jZSAzLjYsIHNlYXJjaGluZyBmb3IgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUKKyAqIAkJPGNvZGU+VGVzdDwvY29kZT4gaW4KKyAqIAkJPHByZT4KKyAqICAgICAgICAgcHVibGljIGNsYXNzIFRlc3QgeworICogICAgICAgICAgICAgICAgIHZvaWQgdGVzdEIoaW50IHRlc3RLaW5kKSB7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAmIzA2NDtBbm5vdCBpbnQgdGVzdDEsIHRlc3QyOworICogICAgICAgICAgICAgICAgIH0KKyAqICAgICAgICAgfQorICogICAgICAgICAmIzA2NDtpbnRlcmZhY2UgQW5ub3Qge30KKyAqICAgICAgICAgPC9wcmU+CisgKiAJCXdpbGwgcmV0dXJuIG9uZSBtYXRjaCB3aG9zZSBvdGhlciBlbGVtZW50cyBpcyBhbiBhcnJheSBvZiBvbmUgYW5ub3RhdGlvbjoKKyAqIAkJe0BsaW5rIElBbm5vdGF0aW9uIEFubm90fSB3aGljaCBwYXJlbnQgaXMgdGhlIGxvY2FsIHZhcmlhYmxlCisgKiAJCXtAbGluayBJTG9jYWxWYXJpYWJsZSB0ZXN0Mn0uCisgKiAJPC9saT4KKyAqIDwvdWw+CisgKgorICogQHJldHVybiB0aGUgb3RoZXIgZWxlbWVudHMgb2YgdGhlIHNlYXJjaCBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICogQHNpbmNlIDMuMgorICovCitwdWJsaWMgZmluYWwgSUphdmFFbGVtZW50W10gZ2V0T3RoZXJFbGVtZW50cygpIHsKKwlyZXR1cm4gdGhpcy5vdGhlckVsZW1lbnRzOworfQogCi0JLyoqCi0JICogUmV0dXJucyBvdGhlciBlbmNsb3NpbmcgZWxlbWVudHMgb2YgdGhpcyBzZWFyY2ggbWF0Y2guCi0JICoKLQkgKiBJZiB7QGxpbmsgI2dldExvY2FsRWxlbWVudCgpfSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXNlIG1heSBiZSBvdGhlcgotCSAqIGxvY2FsIGVsZW1lbnRzIHN1Y2ggYXMgYWRkaXRpb25hbCBsb2NhbCB2YXJpYWJsZXMgb2YgYSBtdWx0aXBsZSBsb2NhbAotCSAqIHZhcmlhYmxlcyBkZWNsYXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGVzZSBtYXkgYmUgb3RoZXIgZWxlbWVudHMgc3VjaCBhcwotCSAqIGFkZGl0aW9uYWwgZmllbGRzIG9mIGEgbXVsdGlwbGUgZmllbGRzIGRlY2xhcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG90aGVyIGVsZW1lbnRzIG9mIHRoZSBzZWFyY2ggbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIElKYXZhRWxlbWVudFtdIGdldE90aGVyRWxlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLm90aGVyRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYWwgZWxlbWVudCBvZiB0aGlzIHNlYXJjaCBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxFbGVtZW50IEEgbW9yZSBzcGVjaWZpYyBsb2NhbCBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1hdGNoLAotCSAqIAlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNpbmNlIDMuMgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldExvY2FsRWxlbWVudChJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50KSB7Ci0JCXRoaXMubG9jYWxFbGVtZW50ID0gbG9jYWxFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG90aGVyIGVsZW1lbnRzIG9mIHRoaXMgc2VhcmNoIG1hdGNoLgotCSAqIAotCSAqIEBwYXJhbSBvdGhlckVsZW1lbnRzIHRoZSBvdGhlciBlbGVtZW50cyBvZiB0aGUgbWF0Y2gsCi0JICogCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0T3RoZXJFbGVtZW50cyhJSmF2YUVsZW1lbnRbXSBvdGhlckVsZW1lbnRzKSB7Ci0JCXRoaXMub3RoZXJFbGVtZW50cyA9IG90aGVyRWxlbWVudHM7Ci0JfQorLyoqCisgKiBTZXRzIHRoZSBvdGhlciBlbGVtZW50cyBvZiB0aGlzIHNlYXJjaCBtYXRjaC4KKyAqCisgKiBAc2VlICNnZXRPdGhlckVsZW1lbnRzKCkKKyAqCisgKiBAcGFyYW0gb3RoZXJFbGVtZW50cyB0aGUgb3RoZXIgZWxlbWVudHMgb2YgdGhlIG1hdGNoLAorICogCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqIEBzaW5jZSAzLjIKKyAqLworcHVibGljIGZpbmFsIHZvaWQgc2V0T3RoZXJFbGVtZW50cyhJSmF2YUVsZW1lbnRbXSBvdGhlckVsZW1lbnRzKSB7CisJdGhpcy5vdGhlckVsZW1lbnRzID0gb3RoZXJFbGVtZW50czsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9EaXNrSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9EaXNrSW5kZXguamF2YQppbmRleCBkYTU0Y2VjLi4wNTBhMzU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRGlza0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0Rpc2tJbmRleC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ0LDggKzQ0LDkgQEAKIHByaXZhdGUgYnl0ZVtdIHN0cmVhbUJ1ZmZlcjsKIHByaXZhdGUgaW50IGJ1ZmZlckluZGV4LCBidWZmZXJFbmQ7IC8vIHVzZWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIGZpbGUgaW50byB0aGUgc3RyZWFtQnVmZmVyCiBwcml2YXRlIGludCBzdHJlYW1FbmQ7IC8vIHVzZWQgd2hlbiB3cml0aW5nIGRhdGEgZnJvbSB0aGUgc3RyZWFtQnVmZmVyIHRvIHRoZSBmaWxlCitjaGFyIHNlcGFyYXRvciA9IEluZGV4LkRFRkFVTFRfU0VQQVJBVE9SOwogCi1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkU9ICJJTkRFWCBWRVJTSU9OIDEuMTIxIjsgLy8kTk9OLU5MUy0xJAorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFPSAiSU5ERVggVkVSU0lPTiAxLjEyNiI7IC8vJE5PTi1OTFMtMSQKIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSUdOQVRVUkVfQ0hBUlMgPSBTSUdOQVRVUkUudG9DaGFyQXJyYXkoKTsKIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCkBAIC03Nyw3ICs3OCw3IEBACiAJaW50W10gcmVzdWx0ID0gbmV3IGludFt0aGlzLnNpemVdOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgcmVzdWx0LCAwLCB0aGlzLnNpemUpOwogCXJldHVybiByZXN1bHQ7Ci19CQorfQogfQogCiAKQEAgLTEzMSwyMCArMTMyLDIwIEBACiAJfQogCXJldHVybiByZXN1bHRzOwogfQotcHJpdmF0ZSBIYXNodGFibGVPZk9iamVjdCBhZGRRdWVyeVJlc3VsdChIYXNodGFibGVPZk9iamVjdCByZXN1bHRzLCBjaGFyW10gd29yZCwgSGFzaHRhYmxlT2ZPYmplY3Qgd29yZHNUb0RvY051bWJlcnMsIE1lbW9yeUluZGV4IG1lbW9yeUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworcHJpdmF0ZSBIYXNodGFibGVPZk9iamVjdCBhZGRRdWVyeVJlc3VsdChIYXNodGFibGVPZk9iamVjdCByZXN1bHRzLCBjaGFyW10gd29yZCwgT2JqZWN0IGRvY3MsIE1lbW9yeUluZGV4IG1lbW9yeUluZGV4LCBib29sZWFuIHByZXZSZXN1bHRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCS8vIG11c3Qgc2tpcCBvdmVyIGRvY3VtZW50cyB3aGljaCBoYXZlIGJlZW4gYWRkZWQvY2hhbmdlZC9kZWxldGVkIGluIHRoZSBtZW1vcnkgaW5kZXgKIAlpZiAocmVzdWx0cyA9PSBudWxsKQogCQlyZXN1bHRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEzKTsKLQlFbnRyeVJlc3VsdCByZXN1bHQgPSAoRW50cnlSZXN1bHQpIHJlc3VsdHMuZ2V0KHdvcmQpOworCUVudHJ5UmVzdWx0IHJlc3VsdCA9IHByZXZSZXN1bHRzID8gKEVudHJ5UmVzdWx0KSByZXN1bHRzLmdldCh3b3JkKSA6IG51bGw7CiAJaWYgKG1lbW9yeUluZGV4ID09IG51bGwpIHsKIAkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0cy5wdXQod29yZCwgbmV3IEVudHJ5UmVzdWx0KHdvcmQsIHdvcmRzVG9Eb2NOdW1iZXJzKSk7CisJCQlyZXN1bHRzLnB1dFVuc2FmZWx5KHdvcmQsIG5ldyBFbnRyeVJlc3VsdCh3b3JkLCBkb2NzKSk7CiAJCWVsc2UKLQkJCXJlc3VsdC5hZGREb2N1bWVudFRhYmxlKHdvcmRzVG9Eb2NOdW1iZXJzKTsKKwkJCXJlc3VsdC5hZGREb2N1bWVudFRhYmxlKGRvY3MpOwogCX0gZWxzZSB7CiAJCVNpbXBsZUxvb2t1cFRhYmxlIGRvY3NUb1JlZnMgPSBtZW1vcnlJbmRleC5kb2NzVG9SZWZlcmVuY2VzOwogCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IG5ldyBFbnRyeVJlc3VsdCh3b3JkLCBudWxsKTsKLQkJaW50W10gZG9jTnVtYmVycyA9IHJlYWREb2N1bWVudE51bWJlcnMod29yZHNUb0RvY051bWJlcnMuZ2V0KHdvcmQpKTsKKwkJaW50W10gZG9jTnVtYmVycyA9IHJlYWREb2N1bWVudE51bWJlcnMoZG9jcyk7CiAJCWZvciAoaW50IGkgPSAwLCBsID0gZG9jTnVtYmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCVN0cmluZyBkb2NOYW1lID0gcmVhZERvY3VtZW50TmFtZShkb2NOdW1iZXJzW2ldKTsKIAkJCWlmICghZG9jc1RvUmVmcy5jb250YWluc0tleShkb2NOYW1lKSkKQEAgLTE2MCwxNyArMTYxLDIzIEBACiAJaWYgKHRoaXMuY2F0ZWdvcnlPZmZzZXRzID09IG51bGwpIHJldHVybiBudWxsOyAvLyBmaWxlIGlzIGVtcHR5CiAKIAlIYXNodGFibGVPZk9iamVjdCByZXN1bHRzID0gbnVsbDsgLy8gaW5pdGlhbGl6ZWQgaWYgbmVlZGVkCisJCisJLy8gTm8gbmVlZCB0byBjaGVjayB0aGUgcmVzdWx0cyB0YWJsZSBmb3IgZHVwbGljYWN5IHdoaWxlIHByb2Nlc3NpbmcgdGhlIAorCS8vIGZpcnN0IGNhdGVnb3J5IHRhYmxlIG9yIGlmIHRoZSBmaXJzdCBjYXRlZ29yeSB0YWJsZXMgZG9lc24ndCBoYXZlIGFueSByZXN1bHRzLgorCWJvb2xlYW4gcHJldlJlc3VsdHMgPSBmYWxzZTsKIAlpZiAoa2V5ID09IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBjYXRlZ29yaWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJSGFzaHRhYmxlT2ZPYmplY3Qgd29yZHNUb0RvY051bWJlcnMgPSByZWFkQ2F0ZWdvcnlUYWJsZShjYXRlZ29yaWVzW2ldLCB0cnVlKTsgLy8gY2FjaGUgaWYga2V5IGlzIG51bGwgc2luY2UgaXRzIGEgZGVmaW5pdGUgbWF0Y2gKIAkJCWlmICh3b3Jkc1RvRG9jTnVtYmVycyAhPSBudWxsKSB7CiAJCQkJY2hhcltdW10gd29yZHMgPSB3b3Jkc1RvRG9jTnVtYmVycy5rZXlUYWJsZTsKKwkJCQlPYmplY3RbXSB2YWx1ZXMgPSB3b3Jkc1RvRG9jTnVtYmVycy52YWx1ZVRhYmxlOwogCQkJCWlmIChyZXN1bHRzID09IG51bGwpCiAJCQkJCXJlc3VsdHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3Qod29yZHNUb0RvY051bWJlcnMuZWxlbWVudFNpemUpOwogCQkJCWZvciAoaW50IGogPSAwLCBtID0gd29yZHMubGVuZ3RoOyBqIDwgbTsgaisrKQogCQkJCQlpZiAod29yZHNbal0gIT0gbnVsbCkKLQkJCQkJCXJlc3VsdHMgPSBhZGRRdWVyeVJlc3VsdChyZXN1bHRzLCB3b3Jkc1tqXSwgd29yZHNUb0RvY051bWJlcnMsIG1lbW9yeUluZGV4KTsKKwkJCQkJCXJlc3VsdHMgPSBhZGRRdWVyeVJlc3VsdChyZXN1bHRzLCB3b3Jkc1tqXSwgdmFsdWVzW2pdLCBtZW1vcnlJbmRleCwgcHJldlJlc3VsdHMpOwogCQkJfQorCQkJcHJldlJlc3VsdHMgPSByZXN1bHRzICE9IG51bGw7CiAJCX0KIAkJaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiB0aGlzLmNhY2hlZENodW5rcyA9PSBudWxsKQogCQkJY2FjaGVEb2N1bWVudE5hbWVzKCk7CkBAIC0xNzksOCArMTg2LDEwIEBACiAJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRToKIAkJCQlmb3IgKGludCBpID0gMCwgbCA9IGNhdGVnb3JpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQkJCUhhc2h0YWJsZU9mT2JqZWN0IHdvcmRzVG9Eb2NOdW1iZXJzID0gcmVhZENhdGVnb3J5VGFibGUoY2F0ZWdvcmllc1tpXSwgZmFsc2UpOwotCQkJCQlpZiAod29yZHNUb0RvY051bWJlcnMgIT0gbnVsbCAmJiB3b3Jkc1RvRG9jTnVtYmVycy5jb250YWluc0tleShrZXkpKQotCQkJCQkJcmVzdWx0cyA9IGFkZFF1ZXJ5UmVzdWx0KHJlc3VsdHMsIGtleSwgd29yZHNUb0RvY051bWJlcnMsIG1lbW9yeUluZGV4KTsKKwkJCQkJT2JqZWN0IHZhbHVlOworCQkJCQlpZiAod29yZHNUb0RvY051bWJlcnMgIT0gbnVsbCAmJiAodmFsdWUgPSB3b3Jkc1RvRG9jTnVtYmVycy5nZXQoa2V5KSkgIT0gbnVsbCkKKwkJCQkJCXJlc3VsdHMgPSBhZGRRdWVyeVJlc3VsdChyZXN1bHRzLCBrZXksIHZhbHVlLCBtZW1vcnlJbmRleCwgcHJldlJlc3VsdHMpOworCQkJCQlwcmV2UmVzdWx0cyA9IHJlc3VsdHMgIT0gbnVsbDsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9QUkVGSVhfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkU6CkBAIC0xODgsMTIgKzE5NywxNCBAQAogCQkJCQlIYXNodGFibGVPZk9iamVjdCB3b3Jkc1RvRG9jTnVtYmVycyA9IHJlYWRDYXRlZ29yeVRhYmxlKGNhdGVnb3JpZXNbaV0sIGZhbHNlKTsKIAkJCQkJaWYgKHdvcmRzVG9Eb2NOdW1iZXJzICE9IG51bGwpIHsKIAkJCQkJCWNoYXJbXVtdIHdvcmRzID0gd29yZHNUb0RvY051bWJlcnMua2V5VGFibGU7CisJCQkJCQlPYmplY3RbXSB2YWx1ZXMgPSB3b3Jkc1RvRG9jTnVtYmVycy52YWx1ZVRhYmxlOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSB3b3Jkcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCQkJCQljaGFyW10gd29yZCA9IHdvcmRzW2pdOwogCQkJCQkJCWlmICh3b3JkICE9IG51bGwgJiYga2V5WzBdID09IHdvcmRbMF0gJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoa2V5LCB3b3JkKSkKLQkJCQkJCQkJcmVzdWx0cyA9IGFkZFF1ZXJ5UmVzdWx0KHJlc3VsdHMsIHdvcmQsIHdvcmRzVG9Eb2NOdW1iZXJzLCBtZW1vcnlJbmRleCk7CisJCQkJCQkJCXJlc3VsdHMgPSBhZGRRdWVyeVJlc3VsdChyZXN1bHRzLCB3b3JkLCB2YWx1ZXNbal0sIG1lbW9yeUluZGV4LCBwcmV2UmVzdWx0cyk7CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJcHJldlJlc3VsdHMgPSByZXN1bHRzICE9IG51bGw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKQEAgLTIwMSwxMiArMjEyLDE0IEBACiAJCQkJCUhhc2h0YWJsZU9mT2JqZWN0IHdvcmRzVG9Eb2NOdW1iZXJzID0gcmVhZENhdGVnb3J5VGFibGUoY2F0ZWdvcmllc1tpXSwgZmFsc2UpOwogCQkJCQlpZiAod29yZHNUb0RvY051bWJlcnMgIT0gbnVsbCkgewogCQkJCQkJY2hhcltdW10gd29yZHMgPSB3b3Jkc1RvRG9jTnVtYmVycy5rZXlUYWJsZTsKKwkJCQkJCU9iamVjdFtdIHZhbHVlcyA9IHdvcmRzVG9Eb2NOdW1iZXJzLnZhbHVlVGFibGU7CiAJCQkJCQlmb3IgKGludCBqID0gMCwgbSA9IHdvcmRzLmxlbmd0aDsgaiA8IG07IGorKykgewogCQkJCQkJCWNoYXJbXSB3b3JkID0gd29yZHNbal07CiAJCQkJCQkJaWYgKHdvcmQgIT0gbnVsbCAmJiBJbmRleC5pc01hdGNoKGtleSwgd29yZCwgbWF0Y2hSdWxlKSkKLQkJCQkJCQkJcmVzdWx0cyA9IGFkZFF1ZXJ5UmVzdWx0KHJlc3VsdHMsIHdvcmQsIHdvcmRzVG9Eb2NOdW1iZXJzLCBtZW1vcnlJbmRleCk7CisJCQkJCQkJCXJlc3VsdHMgPSBhZGRRdWVyeVJlc3VsdChyZXN1bHRzLCB3b3JkLCB2YWx1ZXNbal0sIG1lbW9yeUluZGV4LCBwcmV2UmVzdWx0cyk7CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJcHJldlJlc3VsdHMgPSByZXN1bHRzICE9IG51bGw7CiAJCQkJfQogCQl9CiAJfQpAQCAtMjY2LDcgKzI3OSw2IEBACiAKIAkvLyBmaW5kIG91dCBpZiB0aGUgbWVtb3J5IGluZGV4IGhhcyBhbnkgbmV3IG9yIGRlbGV0ZWQgZG9jdW1lbnRzLCBpZiBub3QgdGhlbiB0aGUgbmFtZXMgJiBwb3NpdGlvbnMgYXJlIHRoZSBzYW1lCiAJaW50IG51bURlbGV0ZWREb2NOYW1lcyA9IDA7Ci0JaW50IG51bVJlaW5kZXhlZERvY05hbWVzID0gMDsKIAluZXh0UGF0aCA6IGZvciAoaW50IGkgPSAwLCBsID0gZG9jTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCVN0cmluZyBkb2NOYW1lID0gKFN0cmluZykgZG9jTmFtZXNbaV07CiAJCWlmIChkb2NOYW1lICE9IG51bGwpIHsKQEAgLTI3Nyw3ICsyODksNiBAQAogCQkJCQkJbnVtRGVsZXRlZERvY05hbWVzKys7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlwb3NpdGlvbnNbal0gPSBSRV9JTkRFWEVEOwotCQkJCQkJbnVtUmVpbmRleGVkRG9jTmFtZXMrKzsKIAkJCQkJfQogCQkJCQljb250aW51ZSBuZXh0UGF0aDsKIAkJCQl9CkBAIC0zNDUsNyArMzU2LDcgQEAKIAkJCQlpZiAod29yZCAhPSBudWxsKSB7CiAJCQkJCU9iamVjdCBvID0gd29yZHNUb0RvY3MuZ2V0KHdvcmQpOwogCQkJCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkJCQl3b3Jkc1RvRG9jcy5wdXQod29yZCwgbmV3IGludFtdIHtuZXdQb3NpdGlvbn0pOworCQkJCQkJd29yZHNUb0RvY3MucHV0VW5zYWZlbHkod29yZCwgbmV3IGludFtdIHtuZXdQb3NpdGlvbn0pOwogCQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJbnRMaXN0KSB7CiAJCQkJCQkoKEludExpc3QpIG8pLmFkZChuZXdQb3NpdGlvbik7CiAJCQkJCX0gZWxzZSB7CkBAIC0zNjEsMTcgKzM3MiwyNCBAQAogdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gcmV1c2VFeGlzdGluZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKHRoaXMuaW5kZXhGaWxlLmV4aXN0cygpKSB7CiAJCWlmIChyZXVzZUV4aXN0aW5nRmlsZSkgewotCQkJUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUodGhpcy5pbmRleEZpbGUsICJyIik7IC8vJE5PTi1OTFMtMSQKKwkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoaXMuaW5kZXhGaWxlKTsKKwkJCXRoaXMuc3RyZWFtQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1JFQURfU0laRV07CisJCQl0aGlzLmJ1ZmZlckluZGV4ID0gMDsKKwkJCXRoaXMuYnVmZmVyRW5kID0gc3RyZWFtLnJlYWQodGhpcy5zdHJlYW1CdWZmZXIsIDAsIDEyOCk7CiAJCQl0cnkgewotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBmaWxlLnJlYWRVVEYoKTsKLQkJCQlpZiAoIXNpZ25hdHVyZS5lcXVhbHMoU0lHTkFUVVJFKSkKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmV4Y2VwdGlvbl93cm9uZ0Zvcm1hdCk7IAotCi0JCQkJdGhpcy5oZWFkZXJJbmZvT2Zmc2V0ID0gZmlsZS5yZWFkSW50KCk7Ci0JCQkJaWYgKHRoaXMuaGVhZGVySW5mb09mZnNldCA+IDApIC8vIGZpbGUgaXMgZW1wdHkgaWYgaXRzIG5vdCBzZXQKLQkJCQkJcmVhZEhlYWRlckluZm8oZmlsZSk7CisJCQkJY2hhcltdIHNpZ25hdHVyZSA9IHJlYWRTdHJlYW1DaGFycyhzdHJlYW0pOworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2lnbmF0dXJlLCBTSUdOQVRVUkVfQ0hBUlMpKSB7CisJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5leGNlcHRpb25fd3JvbmdGb3JtYXQpOworCQkJCX0KKwkJCQl0aGlzLmhlYWRlckluZm9PZmZzZXQgPSByZWFkU3RyZWFtSW50KHN0cmVhbSk7CisJCQkJaWYgKHRoaXMuaGVhZGVySW5mb09mZnNldCA+IDApIHsgLy8gZmlsZSBpcyBlbXB0eSBpZiBpdHMgbm90IHNldAorCQkJCQlzdHJlYW0uc2tpcCh0aGlzLmhlYWRlckluZm9PZmZzZXQgLSB0aGlzLmJ1ZmZlckVuZCk7IC8vIGFzc3VtZSB0aGF0IHRoZSBoZWFkZXIgaW5mbyBvZmZzZXQgaXMgb3ZlciBjdXJyZW50IGJ1ZmZlciBlbmQKKwkJCQkJdGhpcy5idWZmZXJJbmRleCA9IDA7CisJCQkJCXRoaXMuYnVmZmVyRW5kID0gc3RyZWFtLnJlYWQodGhpcy5zdHJlYW1CdWZmZXIsIDAsIHRoaXMuc3RyZWFtQnVmZmVyLmxlbmd0aCk7CisJCQkJCXJlYWRIZWFkZXJJbmZvKHN0cmVhbSk7CisJCQkJfQogCQkJfSBmaW5hbGx5IHsKLQkJCQlmaWxlLmNsb3NlKCk7CisJCQkJc3RyZWFtLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm47CiAJCX0KQEAgLTM4MiwxMiArNDAwLDE5IEBACiAJCX0KIAl9CiAJaWYgKHRoaXMuaW5kZXhGaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQlSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0aGlzLmluZGV4RmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQKKwkJRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGlzLmluZGV4RmlsZSwgZmFsc2UpOwogCQl0cnkgewotCQkJZmlsZS53cml0ZVVURihTSUdOQVRVUkUpOwotCQkJZmlsZS53cml0ZUludCgtMSk7IC8vIGZpbGUgaXMgZW1wdHkKKwkJCXRoaXMuc3RyZWFtQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1JFQURfU0laRV07CisJCQl0aGlzLmJ1ZmZlckluZGV4ID0gMDsKKwkJCXdyaXRlU3RyZWFtQ2hhcnMoc3RyZWFtLCBTSUdOQVRVUkVfQ0hBUlMpOworCQkJd3JpdGVTdHJlYW1JbnQoc3RyZWFtLCAtMSk7IC8vIGZpbGUgaXMgZW1wdHkKKwkJCS8vIHdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHN0cmVhbQorCQkJaWYgKHRoaXMuYnVmZmVySW5kZXggPiAwKSB7CisJCQkJc3RyZWFtLndyaXRlKHRoaXMuc3RyZWFtQnVmZmVyLCAwLCB0aGlzLmJ1ZmZlckluZGV4KTsKKwkJCQl0aGlzLmJ1ZmZlckluZGV4ID0gMDsKKwkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCWZpbGUuY2xvc2UoKTsKKwkJCXN0cmVhbS5jbG9zZSgpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKERFQlVHKQpAQCAtNDA5LDYgKzQzNCw3IEBACiAJdGhpcy5jYXRlZ29yeU9mZnNldHMgPSBuZXcgSGFzaHRhYmxlT2ZJbnRWYWx1ZXMoc2l6ZSk7CiAJdGhpcy5jYXRlZ29yeUVuZHMgPSBuZXcgSGFzaHRhYmxlT2ZJbnRWYWx1ZXMoc2l6ZSk7CiAJdGhpcy5jYXRlZ29yeVRhYmxlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdChzaXplKTsKKwl0aGlzLnNlcGFyYXRvciA9IGRpc2tJbmRleC5zZXBhcmF0b3I7CiB9CiBwcml2YXRlIHZvaWQgbWVyZ2VDYXRlZ29yaWVzKERpc2tJbmRleCBvbkRpc2ssIGludFtdIHBvc2l0aW9ucywgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJLy8gYXQgdGhpcyBwb2ludCwgdGhpcy5jYXRlZ29yeVRhYmxlcyBjb250YWlucyB0aGUgbmFtZXMgLT4gd29yZHNUb0RvY3MgYWRkZWQgaW4gY29weVF1ZXJ5UmVzdWx0cygpCkBAIC00NTMsNyArNDc5LDcgQEAKIAogCQkJCU9iamVjdCBvID0gd29yZHNUb0RvY3MuZ2V0KG9sZFdvcmQpOwogCQkJCWlmIChvID09IG51bGwpIHsKLQkJCQkJd29yZHNUb0RvY3MucHV0KG9sZFdvcmQsIG1hcHBlZE51bWJlcnMpOworCQkJCQl3b3Jkc1RvRG9jcy5wdXRVbnNhZmVseShvbGRXb3JkLCBtYXBwZWROdW1iZXJzKTsKIAkJCQl9IGVsc2UgewogCQkJCQlJbnRMaXN0IGxpc3QgPSBudWxsOwogCQkJCQlpZiAobyBpbnN0YW5jZW9mIEludExpc3QpIHsKQEAgLTU1NSw5ICs1ODEsOSBAQAogCQl0aGlzLmJ1ZmZlckluZGV4ID0gMDsKIAkJdGhpcy5idWZmZXJFbmQgPSBzdHJlYW0ucmVhZCh0aGlzLnN0cmVhbUJ1ZmZlciwgMCwgdGhpcy5zdHJlYW1CdWZmZXIubGVuZ3RoKTsKIAkJaW50IGxhc3RJbmRleCA9IHRoaXMubnVtYmVyT2ZDaHVua3MgLSAxOwotCQlTdHJpbmdbXSBkb2NOYW1lcyA9IG5ldyBTdHJpbmdbbGFzdEluZGV4ICogQ0hVTktfU0laRSArIHNpemVPZkxhc3RDaHVua107CisJCVN0cmluZ1tdIGRvY05hbWVzID0gbmV3IFN0cmluZ1tsYXN0SW5kZXggKiBDSFVOS19TSVpFICsgdGhpcy5zaXplT2ZMYXN0Q2h1bmtdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZDaHVua3M7IGkrKykKLQkJCXJlYWRDaHVuayhkb2NOYW1lcywgc3RyZWFtLCBpICogQ0hVTktfU0laRSwgaSA8IGxhc3RJbmRleCA/IENIVU5LX1NJWkUgOiBzaXplT2ZMYXN0Q2h1bmspOworCQkJcmVhZENodW5rKGRvY05hbWVzLCBzdHJlYW0sIGkgKiBDSFVOS19TSVpFLCBpIDwgbGFzdEluZGV4ID8gQ0hVTktfU0laRSA6IHRoaXMuc2l6ZU9mTGFzdENodW5rKTsKIAkJcmV0dXJuIGRvY05hbWVzOwogCX0gZmluYWxseSB7CiAJCXN0cmVhbS5jbG9zZSgpOwpAQCAtNjI1LDkgKzY1MSw5IEBACiAJCQkvLwkJPiAxICYgPCAyNTYgdGhlbiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgPiAxICYgPCAyNTYsIHRoZSBkb2N1bWVudCBhcnJheSBmb2xsb3dzIGltbWVkaWF0ZWx5CiAJCQkvLwkJMjU2IGlmIHRoZSBhcnJheSBzaXplID49IDI1NiBmb2xsb3dlZCBieSBhbm90aGVyIGludCB3aGljaCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBhcnJheSAod3JpdHRlbiBwcmlvciB0byB0aGUgdGFibGUpCiAJCQlpZiAoYXJyYXlPZmZzZXQgPD0gMCkgewotCQkJCWNhdGVnb3J5VGFibGUucHV0KHdvcmQsIG5ldyBpbnRbXSB7LWFycmF5T2Zmc2V0fSk7IC8vIHN0b3JlIDEgZWxlbWVudCBhcnJheSBieSBuZWdhdGluZyBkb2N1bWVudE51bWJlcgorCQkJCWNhdGVnb3J5VGFibGUucHV0VW5zYWZlbHkod29yZCwgbmV3IGludFtdIHstYXJyYXlPZmZzZXR9KTsgLy8gc3RvcmUgMSBlbGVtZW50IGFycmF5IGJ5IG5lZ2F0aW5nIGRvY3VtZW50TnVtYmVyCiAJCQl9IGVsc2UgaWYgKGFycmF5T2Zmc2V0IDwgbGFyZ2VBcnJheVNpemUpIHsKLQkJCQljYXRlZ29yeVRhYmxlLnB1dCh3b3JkLCByZWFkU3RyZWFtRG9jdW1lbnRBcnJheShzdHJlYW0sIGFycmF5T2Zmc2V0KSk7IC8vIHJlYWQgaW4tbGluZWQgYXJyYXkgcHJvdmlkaW5nIHNpemUKKwkJCQljYXRlZ29yeVRhYmxlLnB1dFVuc2FmZWx5KHdvcmQsIHJlYWRTdHJlYW1Eb2N1bWVudEFycmF5KHN0cmVhbSwgYXJyYXlPZmZzZXQpKTsgLy8gcmVhZCBpbi1saW5lZCBhcnJheSBwcm92aWRpbmcgc2l6ZQogCQkJfSBlbHNlIHsKIAkJCQlhcnJheU9mZnNldCA9IHJlYWRTdHJlYW1JbnQoc3RyZWFtKTsgLy8gcmVhZCBhY3R1YWwgb2Zmc2V0CiAJCQkJaWYgKHJlYWREb2NOdW1iZXJzKSB7CkBAIC02MzcsNyArNjYzLDcgQEAKIAkJCQkJCWZpcnN0T2Zmc2V0ID0gYXJyYXlPZmZzZXQ7CiAJCQkJCW1hdGNoaW5nV29yZHNbY291bnQrK10gPSB3b3JkOwogCQkJCX0KLQkJCQljYXRlZ29yeVRhYmxlLnB1dCh3b3JkLCBuZXcgSW50ZWdlcihhcnJheU9mZnNldCkpOyAvLyBvZmZzZXQgdG8gYXJyYXkgaW4gdGhlIGZpbGUKKwkJCQljYXRlZ29yeVRhYmxlLnB1dFVuc2FmZWx5KHdvcmQsIG5ldyBJbnRlZ2VyKGFycmF5T2Zmc2V0KSk7IC8vIG9mZnNldCB0byBhcnJheSBpbiB0aGUgZmlsZQogCQkJfQogCQl9CiAJCXRoaXMuY2F0ZWdvcnlUYWJsZXMucHV0KElOVEVSTkVEX0NBVEVHT1JZX05BTUVTLmdldChjYXRlZ29yeU5hbWUpLCBjYXRlZ29yeVRhYmxlKTsKQEAgLTY3Niw4ICs3MDIsOCBAQAogCWZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCWlmIChzdHJlYW0gIT0gbnVsbCAmJiB0aGlzLmJ1ZmZlckluZGV4ICsgMiA+PSB0aGlzLmJ1ZmZlckVuZCkKIAkJCXJlYWRTdHJlYW1CdWZmZXIoc3RyZWFtKTsKLQkJaW50IHN0YXJ0ID0gc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGOwotCQlpbnQgZW5kID0gc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGOworCQlpbnQgc3RhcnQgPSB0aGlzLnN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdICYgMHhGRjsKKwkJaW50IGVuZCA9IHRoaXMuc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGOwogCQlTdHJpbmcgbmV4dCAgPSBuZXcgU3RyaW5nKHJlYWRTdHJlYW1DaGFycyhzdHJlYW0pKTsKIAkJaWYgKHN0YXJ0ID4gMCkgewogCQkJaWYgKGVuZCA+IDApIHsKQEAgLTc1MCwyOCArNzc2LDI4IEBACiAJCXRoaXMuc3RyZWFtQnVmZmVyID0gbnVsbDsKIAl9CiB9Ci1wcml2YXRlIHZvaWQgcmVhZEhlYWRlckluZm8oUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZpbGUuc2Vlayh0aGlzLmhlYWRlckluZm9PZmZzZXQpOworcHJpdmF0ZSB2b2lkIHJlYWRIZWFkZXJJbmZvKEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvLyBtdXN0IGJlIHNhbWUgb3JkZXIgYXMgd3JpdGVIZWFkZXJJbmZvKCkKLQl0aGlzLm51bWJlck9mQ2h1bmtzID0gZmlsZS5yZWFkSW50KCk7Ci0JdGhpcy5zaXplT2ZMYXN0Q2h1bmsgPSBmaWxlLnJlYWRVbnNpZ25lZEJ5dGUoKTsKLQl0aGlzLmRvY3VtZW50UmVmZXJlbmNlU2l6ZSA9IGZpbGUucmVhZFVuc2lnbmVkQnl0ZSgpOworCXRoaXMubnVtYmVyT2ZDaHVua3MgPSByZWFkU3RyZWFtSW50KHN0cmVhbSk7CisJdGhpcy5zaXplT2ZMYXN0Q2h1bmsgPSB0aGlzLnN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdICYgMHhGRjsKKwl0aGlzLmRvY3VtZW50UmVmZXJlbmNlU2l6ZSA9IHRoaXMuc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGOworCXRoaXMuc2VwYXJhdG9yID0gKGNoYXIpICh0aGlzLnN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdICYgMHhGRik7CiAKIAl0aGlzLmNodW5rT2Zmc2V0cyA9IG5ldyBpbnRbdGhpcy5udW1iZXJPZkNodW5rc107CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mQ2h1bmtzOyBpKyspCi0JCXRoaXMuY2h1bmtPZmZzZXRzW2ldID0gZmlsZS5yZWFkSW50KCk7CisJCXRoaXMuY2h1bmtPZmZzZXRzW2ldID0gcmVhZFN0cmVhbUludChzdHJlYW0pOwogCi0JdGhpcy5zdGFydE9mQ2F0ZWdvcnlUYWJsZXMgPSBmaWxlLnJlYWRJbnQoKTsKKwl0aGlzLnN0YXJ0T2ZDYXRlZ29yeVRhYmxlcyA9IHJlYWRTdHJlYW1JbnQoc3RyZWFtKTsKIAotCWludCBzaXplID0gZmlsZS5yZWFkSW50KCk7CisJaW50IHNpemUgPSByZWFkU3RyZWFtSW50KHN0cmVhbSk7CiAJdGhpcy5jYXRlZ29yeU9mZnNldHMgPSBuZXcgSGFzaHRhYmxlT2ZJbnRWYWx1ZXMoc2l6ZSk7CiAJdGhpcy5jYXRlZ29yeUVuZHMgPSBuZXcgSGFzaHRhYmxlT2ZJbnRWYWx1ZXMoc2l6ZSk7CiAJY2hhcltdIHByZXZpb3VzQ2F0ZWdvcnkgPSBudWxsOwogCWludCBvZmZzZXQgPSAtMTsKIAlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQljaGFyW10gY2F0ZWdvcnlOYW1lID0gSU5URVJORURfQ0FURUdPUllfTkFNRVMuZ2V0KGZpbGUucmVhZFVURigpLnRvQ2hhckFycmF5KCkpOwotCQlvZmZzZXQgPSBmaWxlLnJlYWRJbnQoKTsKKwkJY2hhcltdIGNhdGVnb3J5TmFtZSA9IElOVEVSTkVEX0NBVEVHT1JZX05BTUVTLmdldChyZWFkU3RyZWFtQ2hhcnMoc3RyZWFtKSk7CisJCW9mZnNldCA9IHJlYWRTdHJlYW1JbnQoc3RyZWFtKTsKIAkJdGhpcy5jYXRlZ29yeU9mZnNldHMucHV0KGNhdGVnb3J5TmFtZSwgb2Zmc2V0KTsgLy8gY2FjaGUgb2Zmc2V0IHRvIGNhdGVnb3J5IHRhYmxlCiAJCWlmIChwcmV2aW91c0NhdGVnb3J5ICE9IG51bGwpIHsKIAkJCXRoaXMuY2F0ZWdvcnlFbmRzLnB1dChwcmV2aW91c0NhdGVnb3J5LCBvZmZzZXQpOyAvLyBjYWNoZSBlbmQgb2YgdGhlIGNhdGVnb3J5IHRhYmxlCkBAIC04MTUsMTcgKzg0MSwxNyBAQAogCXRoaXMuYnVmZmVySW5kZXggPSAwOwogfQogLyoqCi0gKiBSZWFkcyBpbiBhIHN0cmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbnB1dCBzdHJlYW0uIFRoZSAKLSAqIHN0cmluZyBoYXMgYmVlbiBlbmNvZGVkIHVzaW5nIGEgbW9kaWZpZWQgVVRGLTggZm9ybWF0LiAKKyAqIFJlYWRzIGluIGEgc3RyaW5nIGZyb20gdGhlIHNwZWNpZmllZCBkYXRhIGlucHV0IHN0cmVhbS4gVGhlCisgKiBzdHJpbmcgaGFzIGJlZW4gZW5jb2RlZCB1c2luZyBhIG1vZGlmaWVkIFVURi04IGZvcm1hdC4KICAqIDxwPgogICogVGhlIGZpcnN0IHR3byBieXRlcyBhcmUgcmVhZCBhcyBhbiB1bnNpZ25lZCBzaG9ydC4KICAqIFRoaXMgdmFsdWUgZ2l2ZXMgdGhlIG51bWJlciBvZiBmb2xsb3dpbmcgYnl0ZXMgdGhhdCBhcmUgaW4gdGhlIGVuY29kZWQgc3RyaW5nLAotICogbm90IHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuIFRoZSBmb2xsb3dpbmcgYnl0ZXMgYXJlIHRoZW4gCi0gKiBpbnRlcnByZXRlZCBhcyBieXRlcyBlbmNvZGluZyBjaGFyYWN0ZXJzIGluIHRoZSBVVEYtOCBmb3JtYXQgCi0gKiBhbmQgYXJlIGNvbnZlcnRlZCBpbnRvIGNoYXJhY3RlcnMuIAorICogbm90IHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuIFRoZSBmb2xsb3dpbmcgYnl0ZXMgYXJlIHRoZW4KKyAqIGludGVycHJldGVkIGFzIGJ5dGVzIGVuY29kaW5nIGNoYXJhY3RlcnMgaW4gdGhlIFVURi04IGZvcm1hdAorICogYW5kIGFyZSBjb252ZXJ0ZWQgaW50byBjaGFyYWN0ZXJzLgogICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgYWxsIHRoZSBieXRlcyBhcmUgcmVhZCwgdGhlIGVuZCBvZiB0aGUgCi0gKiBzdHJlYW0gaXMgZGV0ZWN0ZWQsIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIAorICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGFsbCB0aGUgYnl0ZXMgYXJlIHJlYWQsIHRoZSBlbmQgb2YgdGhlCisgKiBzdHJlYW0gaXMgZGV0ZWN0ZWQsIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgKgogICogQHBhcmFtICAgICAgc3RyZWFtICAgYSBkYXRhIGlucHV0IHN0cmVhbS4KICAqIEByZXR1cm4gICAgIFVURiBkZWNvZGVkIHN0cmluZyBhcyBhIGNoYXIgYXJyYXkKQEAgLTgzOCw3ICs4NjQsNyBAQAogCS8vIHJlYWQgY2hhcnMgYXJyYXkgbGVuZ3RoCiAJaWYgKHN0cmVhbSAhPSBudWxsICYmIHRoaXMuYnVmZmVySW5kZXggKyAyID49IHRoaXMuYnVmZmVyRW5kKQogCQlyZWFkU3RyZWFtQnVmZmVyKHN0cmVhbSk7Ci0JaW50IGxlbmd0aCA9IChzdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSAmIDB4RkYpIDw8IDg7CisJaW50IGxlbmd0aCA9ICh0aGlzLnN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdICYgMHhGRikgPDwgODsKIAlsZW5ndGggKz0gdGhpcy5zdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSAmIDB4RkY7CiAKIAkvLyBmaWxsIHRoZSBjaGFycyBmcm9tIGJ5dGVzIGJ1ZmZlcgpAQCAtOTM4LDEwICs5NjQsMTAgQEAKIAlpZiAodGhpcy5idWZmZXJJbmRleCArIDQgPj0gdGhpcy5idWZmZXJFbmQpIHsKIAkJcmVhZFN0cmVhbUJ1ZmZlcihzdHJlYW0pOwogCX0KLQlpbnQgdmFsID0gKHN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdICYgMHhGRikgPDwgMjQ7Ci0JdmFsICs9IChzdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSAmIDB4RkYpIDw8IDE2OwotCXZhbCArPSAoc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGKSA8PCA4OwotCXJldHVybiB2YWwgKyAoc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGKTsKKwlpbnQgdmFsID0gKHRoaXMuc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGKSA8PCAyNDsKKwl2YWwgKz0gKHRoaXMuc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGKSA8PCAxNjsKKwl2YWwgKz0gKHRoaXMuc3RyZWFtQnVmZmVyW3RoaXMuYnVmZmVySW5kZXgrK10gJiAweEZGKSA8PCA4OworCXJldHVybiB2YWwgKyAodGhpcy5zdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSAmIDB4RkYpOwogfQogcHJpdmF0ZSB2b2lkIHdyaXRlQWxsRG9jdW1lbnROYW1lcyhTdHJpbmdbXSBzb3J0ZWREb2NOYW1lcywgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKHNvcnRlZERvY05hbWVzLmxlbmd0aCA9PSAwKQpAQCAtMTExMCwxMyArMTEzNiwxNCBAQAogfQogcHJpdmF0ZSB2b2lkIHdyaXRlSGVhZGVySW5mbyhGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl3cml0ZVN0cmVhbUludChzdHJlYW0sIHRoaXMubnVtYmVyT2ZDaHVua3MpOwotCWlmICgodGhpcy5idWZmZXJJbmRleCArIDIpID49IEJVRkZFUl9XUklURV9TSVpFKSAgeworCWlmICgodGhpcy5idWZmZXJJbmRleCArIDMpID49IEJVRkZFUl9XUklURV9TSVpFKSAgewogCQlzdHJlYW0ud3JpdGUodGhpcy5zdHJlYW1CdWZmZXIsIDAsIHRoaXMuYnVmZmVySW5kZXgpOwogCQl0aGlzLmJ1ZmZlckluZGV4ID0gMDsKIAl9CiAJdGhpcy5zdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSA9IChieXRlKSB0aGlzLnNpemVPZkxhc3RDaHVuazsKIAl0aGlzLnN0cmVhbUJ1ZmZlclt0aGlzLmJ1ZmZlckluZGV4KytdID0gKGJ5dGUpIHRoaXMuZG9jdW1lbnRSZWZlcmVuY2VTaXplOwotCXRoaXMuc3RyZWFtRW5kICs9IDI7CisJdGhpcy5zdHJlYW1CdWZmZXJbdGhpcy5idWZmZXJJbmRleCsrXSA9IChieXRlKSB0aGlzLnNlcGFyYXRvcjsKKwl0aGlzLnN0cmVhbUVuZCArPSAzOwogCiAJLy8gYXBlbmQgdGhlIGZpbGUgd2l0aCBjaHVuayBvZmZzZXRzCiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mQ2h1bmtzOyBpKyspIHsKQEAgLTExNTQsMTIgKzExODEsMTIgQEAKIAl9CiB9CiAvKioKLSAqIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSB1c2luZyBVVEYtOCAKLSAqIGVuY29kaW5nIGluIGEgbWFjaGluZS1pbmRlcGVuZGVudCBtYW5uZXIuIAorICogV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtIHVzaW5nIFVURi04CisgKiBlbmNvZGluZyBpbiBhIG1hY2hpbmUtaW5kZXBlbmRlbnQgbWFubmVyLgogICogPHA+Ci0gKiBGaXJzdCwgdHdvIGJ5dGVzIG9mIHRoZSBhcnJheSBhcmUgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gCi0gKiBmb2xsb3cuIFRoaXMgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIG91dCwgCi0gKiBub3QgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiBGb2xsb3dpbmcgdGhlIGxlbmd0aCwgZWFjaCBjaGFyYWN0ZXIgCisgKiBGaXJzdCwgdHdvIGJ5dGVzIG9mIHRoZSBhcnJheSBhcmUgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8KKyAqIGZvbGxvdy4gVGhpcyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gb3V0LAorICogbm90IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gRm9sbG93aW5nIHRoZSBsZW5ndGgsIGVhY2ggY2hhcmFjdGVyCiAgKiBvZiB0aGUgc3RyaW5nIGlzIHB1dCBpbiB0aGUgYnl0ZXMgYXJyYXksIGluIHNlcXVlbmNlLCB1c2luZyB0aGUgVVRGLTgKICAqIGVuY29kaW5nIGZvciB0aGUgY2hhcmFjdGVyLgogICogPC9wPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0VudHJ5UmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRW50cnlSZXN1bHQuamF2YQppbmRleCAwMjY0MTgxLi5hZDY1NTEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRW50cnlSZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRW50cnlSZXN1bHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwzMiArMTEsMzEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldDsKIAogcHVibGljIGNsYXNzIEVudHJ5UmVzdWx0IHsKIAogcHJpdmF0ZSBjaGFyW10gd29yZDsKLXByaXZhdGUgSGFzaHRhYmxlT2ZPYmplY3RbXSBkb2N1bWVudFRhYmxlczsKK3ByaXZhdGUgT2JqZWN0W10gZG9jdW1lbnRUYWJsZXM7CiBwcml2YXRlIFNpbXBsZVNldCBkb2N1bWVudE5hbWVzOwogCi1wdWJsaWMgRW50cnlSZXN1bHQoY2hhcltdIHdvcmQsIEhhc2h0YWJsZU9mT2JqZWN0IHRhYmxlKSB7CitwdWJsaWMgRW50cnlSZXN1bHQoY2hhcltdIHdvcmQsIE9iamVjdCB0YWJsZSkgewogCXRoaXMud29yZCA9IHdvcmQ7CiAJaWYgKHRhYmxlICE9IG51bGwpCi0JCXRoaXMuZG9jdW1lbnRUYWJsZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RbXSB7dGFibGV9OworCQl0aGlzLmRvY3VtZW50VGFibGVzID0gbmV3IE9iamVjdFtdIHt0YWJsZX07CiB9CiBwdWJsaWMgdm9pZCBhZGREb2N1bWVudE5hbWUoU3RyaW5nIGRvY3VtZW50TmFtZSkgewogCWlmICh0aGlzLmRvY3VtZW50TmFtZXMgPT0gbnVsbCkKIAkJdGhpcy5kb2N1bWVudE5hbWVzID0gbmV3IFNpbXBsZVNldCgzKTsKIAl0aGlzLmRvY3VtZW50TmFtZXMuYWRkKGRvY3VtZW50TmFtZSk7CiB9Ci1wdWJsaWMgdm9pZCBhZGREb2N1bWVudFRhYmxlKEhhc2h0YWJsZU9mT2JqZWN0IHRhYmxlKSB7CitwdWJsaWMgdm9pZCBhZGREb2N1bWVudFRhYmxlKE9iamVjdCB0YWJsZSkgewogCWlmICh0aGlzLmRvY3VtZW50VGFibGVzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMuZG9jdW1lbnRUYWJsZXMubGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZG9jdW1lbnRUYWJsZXMsIDAsIHRoaXMuZG9jdW1lbnRUYWJsZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5kb2N1bWVudFRhYmxlcywgMCwgdGhpcy5kb2N1bWVudFRhYmxlcyA9IG5ldyBPYmplY3RbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CiAJCXRoaXMuZG9jdW1lbnRUYWJsZXNbbGVuZ3RoXSA9IHRhYmxlOwogCX0gZWxzZSB7Ci0JCXRoaXMuZG9jdW1lbnRUYWJsZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3RbXSB7dGFibGV9OworCQl0aGlzLmRvY3VtZW50VGFibGVzID0gbmV3IE9iamVjdFtdIHt0YWJsZX07CiAJfQogfQogcHVibGljIGNoYXJbXSBnZXRXb3JkKCkgewpAQCAtNDYsNyArNDUsNyBAQAogCWlmICh0aGlzLmRvY3VtZW50VGFibGVzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMuZG9jdW1lbnRUYWJsZXMubGVuZ3RoOwogCQlpZiAobGVuZ3RoID09IDEgJiYgdGhpcy5kb2N1bWVudE5hbWVzID09IG51bGwpIHsgLy8gaGF2ZSBhIHNpbmdsZSB0YWJsZQotCQkJT2JqZWN0IG9mZnNldCA9IHRoaXMuZG9jdW1lbnRUYWJsZXNbMF0uZ2V0KHdvcmQpOworCQkJT2JqZWN0IG9mZnNldCA9IHRoaXMuZG9jdW1lbnRUYWJsZXNbMF07CiAJCQlpbnRbXSBudW1iZXJzID0gaW5kZXguZGlza0luZGV4LnJlYWREb2N1bWVudE51bWJlcnMob2Zmc2V0KTsKIAkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1iZXJzLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMCwgbCA9IG51bWJlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKQpAQCAtNTUsNyArNTQsNyBAQAogCQl9CiAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9mZnNldCA9IHRoaXMuZG9jdW1lbnRUYWJsZXNbaV0uZ2V0KHdvcmQpOworCQkJT2JqZWN0IG9mZnNldCA9IHRoaXMuZG9jdW1lbnRUYWJsZXNbaV07CiAJCQlpbnRbXSBudW1iZXJzID0gaW5kZXguZGlza0luZGV4LnJlYWREb2N1bWVudE51bWJlcnMob2Zmc2V0KTsKIAkJCWZvciAoaW50IGogPSAwLCBrID0gbnVtYmVycy5sZW5ndGg7IGogPCBrOyBqKyspCiAJCQkJYWRkRG9jdW1lbnROYW1lKGluZGV4LmRpc2tJbmRleC5yZWFkRG9jdW1lbnROYW1lKG51bWJlcnNbal0pKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0luZGV4LmphdmEKaW5kZXggNTgyMWFhMi4uM2QzMjYwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0luZGV4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsOSArMjAsOSBAQAogCiAvKioKICAqIEFuIDxjb2RlPkluZGV4PC9jb2RlPiBtYXBzIGRvY3VtZW50IG5hbWVzIHRvIHRoZWlyIHJlZmVyZW5jZWQgd29yZHMgaW4gdmFyaW91cyBjYXRlZ29yaWVzLgotICogCisgKgogICogUXVlcmllcyBjYW4gc2VhcmNoIGEgc2luZ2xlIGNhdGVnb3J5IG9yIHNldmVyYWwgYXQgdGhlIHNhbWUgdGltZS4KLSAqIAorICoKICAqIEluZGV4ZXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgc3RydWN0dXJlcyBhbmQgc2hvdWxkIG9ubHkgYmUgcXVlcmllZC91cGRhdGVkIG9uZSBhdCBhIHRpbWUuCiAgKi8KIApAQCAtMzEsNiArMzEsMTEgQEAKIHB1YmxpYyBTdHJpbmcgY29udGFpbmVyUGF0aDsKIHB1YmxpYyBSZWFkV3JpdGVNb25pdG9yIG1vbml0b3I7CiAKKy8vIFNlcGFyYXRvciB0byB1c2UgYWZ0ZXIgdGhlIGNvbnRhaW5lciBwYXRoCitzdGF0aWMgZmluYWwgY2hhciBERUZBVUxUX1NFUEFSQVRPUiA9ICcvJzsKK3B1YmxpYyBjaGFyIHNlcGFyYXRvciA9IERFRkFVTFRfU0VQQVJBVE9SOworc3RhdGljIGZpbmFsIGNoYXIgSkFSX1NFUEFSQVRPUiA9IElKYXZhU2VhcmNoU2NvcGUuSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SLmNoYXJBdCgwKTsKKwogcHJvdGVjdGVkIERpc2tJbmRleCBkaXNrSW5kZXg7CiBwcm90ZWN0ZWQgTWVtb3J5SW5kZXggbWVtb3J5SW5kZXg7CiAKQEAgLTQzLDcgKzQ4LDggQEAKIAlTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCB8CiAJU2VhcmNoUGF0dGVybi5SX1JFR0VYUF9NQVRDSCB8CiAJU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFIHwKLQlTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOworCVNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0ggfAorCVNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOwogCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXRjaChjaGFyW10gcGF0dGVybiwgY2hhcltdIHdvcmQsIGludCBtYXRjaFJ1bGUpIHsKIAlpZiAocGF0dGVybiA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKQEAgLTUyLDMzICs1OCwzMSBAQAogCWlmIChwYXR0ZXJuTGVuZ3RoID09IDApIHJldHVybiBtYXRjaFJ1bGUgIT0gU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENIOwogCWlmICh3b3JkTGVuZ3RoID09IDApIHJldHVybiAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gpICE9IDAgJiYgcGF0dGVybkxlbmd0aCA9PSAxICYmIHBhdHRlcm5bMF0gPT0gJyonOwogCi0JLy8gRmlyc3QgdGVzdCBjYW1lbCBjYXNlIGlmIG5lY2Vzc2FyeQotCWJvb2xlYW4gaXNDYW1lbENhc2UgPSAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9NQVRDSCkgIT0gMDsKLQlpZiAoaXNDYW1lbENhc2UgJiYgIHBhdHRlcm5bMF0gPT0gd29yZFswXSAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIHdvcmQpKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQogCS8vIG5lZWQgdG8gbWFzayBzb21lIGJpdHMgb2YgcGF0dGVybiBydWxlIChidWcgNzk3OTApCi0JbWF0Y2hSdWxlICY9IH5TZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOwogCXN3aXRjaChtYXRjaFJ1bGUgJiBNQVRDSF9SVUxFX0lOREVYX01BU0spIHsKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0ggOgotCQkJaWYgKCFpc0NhbWVsQ2FzZSkgewotCQkJCXJldHVybiBwYXR0ZXJuTGVuZ3RoID09IHdvcmRMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMocGF0dGVybiwgd29yZCwgZmFsc2UpOwotCQkJfQotCQkJLy8gZmFsbCB0aHJvdWdoIHByZWZpeCBtYXRjaCBpZiBjYW1lbCBjYXNlIGZhaWxlZAorCQkJcmV0dXJuIHBhdHRlcm5MZW5ndGggPT0gd29yZExlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuLCB3b3JkLCBmYWxzZSk7CiAJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSCA6CiAJCQlyZXR1cm4gcGF0dGVybkxlbmd0aCA8PSB3b3JkTGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHBhdHRlcm4sIHdvcmQsIGZhbHNlKTsKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCA6CiAJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuLCB3b3JkLCBmYWxzZSk7Ci0JCWNhc2UgU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFIDoKLQkJCWlmICghaXNDYW1lbENhc2UpIHsKLQkJCQlyZXR1cm4gcGF0dGVyblswXSA9PSB3b3JkWzBdICYmIHBhdHRlcm5MZW5ndGggPT0gd29yZExlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuLCB3b3JkKTsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOgorCQkvLyBzYW1lIHBhcnQgY291bnQgaXMgbm90IGFjdGl2YXRlZCBiZWNhdXNlIGluZGV4IGtleSBtYXkgaGF2ZSB1cHBlcmNhc2UgbGV0dGVycyBhZnRlciB0aGUgdHlwZSBuYW1lCisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChwYXR0ZXJuLCB3b3JkLCBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KLQkJCS8vIGZhbGwgdGhyb3VnaCBwcmVmaXggbWF0Y2ggaWYgY2FtZWwgY2FzZSBmYWlsZWQKKwkJCXJldHVybiBwYXR0ZXJuTGVuZ3RoIDw9IHdvcmRMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocGF0dGVybiwgd29yZCwgZmFsc2UpOworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRSA6CisJCQlyZXR1cm4gcGF0dGVyblswXSA9PSB3b3JkWzBdICYmIHBhdHRlcm5MZW5ndGggPT0gd29yZExlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuLCB3b3JkKTsKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFIDoKIAkJCXJldHVybiBwYXR0ZXJuWzBdID09IHdvcmRbMF0gJiYgcGF0dGVybkxlbmd0aCA8PSB3b3JkTGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHBhdHRlcm4sIHdvcmQpOwogCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFIDoKIAkJCXJldHVybiBDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm4sIHdvcmQsIHRydWUpOworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUgOgorCQkvLyBzYW1lIHBhcnQgY291bnQgaXMgbm90IGFjdGl2YXRlZCBiZWNhdXNlIGluZGV4IGtleSBtYXkgaGF2ZSB1cHBlcmNhc2UgbGV0dGVycyBhZnRlciB0aGUgdHlwZSBuYW1lCisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUgOgorCQkJcmV0dXJuIChwYXR0ZXJuWzBdID09IHdvcmRbMF0gJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChwYXR0ZXJuLCB3b3JkLCBmYWxzZSkpOwogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC05MSw2ICs5NSw3IEBACiAJdGhpcy5tZW1vcnlJbmRleCA9IG5ldyBNZW1vcnlJbmRleCgpOwogCXRoaXMuZGlza0luZGV4ID0gbmV3IERpc2tJbmRleChmaWxlTmFtZSk7CiAJdGhpcy5kaXNrSW5kZXguaW5pdGlhbGl6ZShyZXVzZUV4aXN0aW5nRmlsZSk7CisJaWYgKHJldXNlRXhpc3RpbmdGaWxlKSB0aGlzLnNlcGFyYXRvciA9IHRoaXMuZGlza0luZGV4LnNlcGFyYXRvcjsKIH0KIHB1YmxpYyB2b2lkIGFkZEluZGV4RW50cnkoY2hhcltdIGNhdGVnb3J5LCBjaGFyW10ga2V5LCBTdHJpbmcgY29udGFpbmVyUmVsYXRpdmVQYXRoKSB7CiAJdGhpcy5tZW1vcnlJbmRleC5hZGRJbmRleEVudHJ5KGNhdGVnb3J5LCBrZXksIGNvbnRhaW5lclJlbGF0aXZlUGF0aCk7CkBAIC0xMTYsMTEgKzEyMSwxMSBAQAogICogSWYgdGhlIGtleSBpcyBudWxsIHRoZW4gYWxsIGVudHJpZXMgaW4gc3BlY2lmaWVkIGNhdGVnb3JpZXMgYXJlIHJldHVybmVkLgogICovCiBwdWJsaWMgRW50cnlSZXN1bHRbXSBxdWVyeShjaGFyW11bXSBjYXRlZ29yaWVzLCBjaGFyW10ga2V5LCBpbnQgbWF0Y2hSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmICh0aGlzLm1lbW9yeUluZGV4LnNob3VsZE1lcmdlKCkgJiYgbW9uaXRvci5leGl0UmVhZEVudGVyV3JpdGUoKSkgeworCWlmICh0aGlzLm1lbW9yeUluZGV4LnNob3VsZE1lcmdlKCkgJiYgdGhpcy5tb25pdG9yLmV4aXRSZWFkRW50ZXJXcml0ZSgpKSB7CiAJCXRyeSB7CiAJCQlzYXZlKCk7CiAJCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmV4aXRXcml0ZUVudGVyUmVhZCgpOworCQkJdGhpcy5tb25pdG9yLmV4aXRXcml0ZUVudGVyUmVhZCgpOwogCQl9CiAJfQogCkBAIC0xNjgsMTEgKzE3MywyMiBAQAogcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjb250YWluZXJSZWxhdGl2ZVBhdGgpIHsKIAl0aGlzLm1lbW9yeUluZGV4LnJlbW92ZShjb250YWluZXJSZWxhdGl2ZVBhdGgpOwogfQorLyoqCisgKiBSZXNldCBtZW1vcnkgYW5kIGRpc2sgaW5kZXhlcy4KKyAqIAorICogQHRocm93cyBJT0V4Y2VwdGlvbgorICovCitwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhpcy5tZW1vcnlJbmRleCA9IG5ldyBNZW1vcnlJbmRleCgpOworCXRoaXMuZGlza0luZGV4ID0gbmV3IERpc2tJbmRleCh0aGlzLmRpc2tJbmRleC5pbmRleEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKwl0aGlzLmRpc2tJbmRleC5pbml0aWFsaXplKGZhbHNlLypkbyBub3QgcmV1c2UgdGhlIGluZGV4IGZpbGUqLyk7Cit9CiBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkvLyBtdXN0IG93biB0aGUgd3JpdGUgbG9jayBvZiB0aGUgbW9uaXRvcgogCWlmICghaGFzQ2hhbmdlZCgpKSByZXR1cm47CiAKIAlpbnQgbnVtYmVyT2ZDaGFuZ2VzID0gdGhpcy5tZW1vcnlJbmRleC5kb2NzVG9SZWZlcmVuY2VzLmVsZW1lbnRTaXplOworCXRoaXMuZGlza0luZGV4LnNlcGFyYXRvciA9IHRoaXMuc2VwYXJhdG9yOwogCXRoaXMuZGlza0luZGV4ID0gdGhpcy5kaXNrSW5kZXgubWVyZ2VXaXRoKHRoaXMubWVtb3J5SW5kZXgpOwogCXRoaXMubWVtb3J5SW5kZXggPSBuZXcgTWVtb3J5SW5kZXgoKTsKIAlpZiAobnVtYmVyT2ZDaGFuZ2VzID4gMTAwMCkKQEAgLTE4OSw0ICsyMDUsOCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlyZXR1cm4gIkluZGV4IGZvciAiICsgdGhpcy5jb250YWluZXJQYXRoOyAvLyROT04tTkxTLTEkCiB9CitwdWJsaWMgYm9vbGVhbiBpc0luZGV4Rm9ySmFyKCkKK3sKKwlyZXR1cm4gdGhpcy5zZXBhcmF0b3IgPT0gSkFSX1NFUEFSQVRPUjsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9NZW1vcnlJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L01lbW9yeUluZGV4LmphdmEKaW5kZXggNWMyMjQ3Yi4uMWY4ZDg0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L01lbW9yeUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L01lbW9yeUluZGV4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIyLDYgKzEyMiw2IEBACiAJdGhpcy5kb2NzVG9SZWZlcmVuY2VzLnB1dChkb2N1bWVudE5hbWUsIG51bGwpOwogfQogYm9vbGVhbiBzaG91bGRNZXJnZSgpIHsKLQlyZXR1cm4gdGhpcy5kb2NzVG9SZWZlcmVuY2VzLmVsZW1lbnRTaXplID49IE5VTV9DSEFOR0VTOworCXJldHVybiB0aGlzLmRvY3NUb1JlZmVyZW5jZXMuZWxlbWVudFNpemUgPj0gdGhpcy5OVU1fQ0hBTkdFUzsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQWJzdHJhY3RKYXZhU2VhcmNoU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQWJzdHJhY3RKYXZhU2VhcmNoU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDAxYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdEphdmFTZWFyY2hTY29wZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVNlYXJjaFNjb3BlIGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hTY29wZSB7CisKKy8qKgorICogR2V0IGFjY2VzcyBydWxlIHNldCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gcGF0aC4KKyAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHBhdGggdXNlciB3YW50IHRvIGhhdmUgcmVzdHJpY3Rpb24gYWNjZXNzCisgKiBAcmV0dXJuIFRoZSBhY2Nlc3MgcnVsZSBzZXQgZm9yIGdpdmVuIHBhdGggb3IgbnVsbCBpZiBub25lIGlzIHNldCBmb3IgaXQuCisgKiAJUmV0dXJucyBzcGVjaWZpYyB1bml0IGFjY2VzcyBydWxlIHNldCB3aGVuIHNjb3BlIGRvZXMgbm90IGVuY2xvc2UgdGhlIGdpdmVuIHBhdGguCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBBY2Nlc3NSdWxlU2V0IGdldEFjY2Vzc1J1bGVTZXQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGNvbnRhaW5lclBhdGgpOworCisvKioKKyAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqCisgKiBAcGFyYW0gcmVzb3VyY2VQYXRoU3RyaW5nIHBhdGggb2YgZXhwZWN0ZWQgcGFja2FnZSBmcmFnbWVudCByb290LgorICogQHBhcmFtIGphclNlcGFyYXRvckluZGV4IHRoZSBpbmRleCBvZiB0aGUgamFyIHNlcGFyYXRvciBpbiB0aGUgcmVzb3VyY2UgcGF0aCwgb3IgLTEgaWYgbm9uZQorICogQHBhcmFtIGphclBhdGggdGhlIGFscmVhZHkgZXh0cmFjdGVkIGphciBwYXRoLCBvciBudWxsIGlmIG5vbmUKKyAqIEByZXR1cm4gdGhlIHtAbGluayBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlIGZyYWdtZW50IHJvb3R9IHdoaWNoIHBhdGgKKyAqIAltYXRjaCB0aGUgZ2l2ZW4gb25lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIGZvdW5kLgorICovCithYnN0cmFjdCBwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nLCBpbnQgamFyU2VwYXJhdG9ySW5kZXgsIFN0cmluZyBqYXJQYXRoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQWJzdHJhY3RTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFNjb3BlLmphdmEKaW5kZXggZWRmN2QzZC4uYWZhMDVkYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFNjb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFNjb3BlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzUsNyArMzUsNyBAQAogICogUHJvY2VzcyB0aGUgZ2l2ZW4gZGVsdGEgYW5kIHJlZnJlc2ggaXRzIGludGVybmFsIHN0YXRlIGlmIG5lZWRlZC4KICAqIFJldHVybnMgd2hldGhlciB0aGUgaW50ZXJuYWwgc3RhdGUgd2FzIHJlZnJlc2hlZC4KICAqLwotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKTsKK3B1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IGV2ZW50VHlwZSk7CiAKIC8qKgogICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI3NldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQmFzaWNTZWFyY2hFbmdpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQmFzaWNTZWFyY2hFbmdpbmUuamF2YQppbmRleCA5YmQ4NTFmLi5iYTVjMzhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0Jhc2ljU2VhcmNoRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9CYXNpY1NlYXJjaEVuZ2luZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb25zIGZvciBidWcgMjE1MTM5IGFuZCBidWcgMjk1ODk0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCkBAIC0zNiw3ICszNyw3IEBACiAvKioKICAqIFNlYXJjaCBiYXNpYyBlbmdpbmUuIFB1YmxpYyBzZWFyY2ggZW5naW5lIChzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmV9CiAgKiBmb3IgZGV0YWlsZWQgY29tbWVudCksIG5vdyB1c2VzIGJhc2ljIGVuZ2luZSBmdW5jdGlvbmFsaXRpZXMuCi0gKiBOb3RlIHRoYXQgc2VyY2ggYmFzaWMgZW5naW5lIGRvZXMgbm90IGltcGxlbWVudCBkZXByZWNhdGVkIGZ1bmN0aW9uYWxpdGllcy4uLgorICogTm90ZSB0aGF0IHNlYXJjaCBiYXNpYyBlbmdpbmUgZG9lcyBub3QgaW1wbGVtZW50IGRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0aWVzLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBCYXNpY1NlYXJjaEVuZ2luZSB7CiAKQEAgLTQ1LDIyICs0NiwyMiBAQAogCSAqLwogCXByaXZhdGUgUGFyc2VyIHBhcnNlcjsKIAlwcml2YXRlIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnM7Ci0JCQorCiAJLyoKLQkgKiBBIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCAKKwkgKiBBIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbAogCSAqIGNvbXBpbGF0aW9uIHVuaXRzLgogCSAqLwogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdFtdIHdvcmtpbmdDb3BpZXM7Ci0JCisKIAkvKgotCSAqIEEgd29ya2luZyBjb3B5IG93bmVyIHdob3NlIHdvcmtpbmcgY29waWVzIHdpbGwgdGFrZSBwcmVjZWRlbnQgb3ZlciAKKwkgKiBBIHdvcmtpbmcgY29weSBvd25lciB3aG9zZSB3b3JraW5nIGNvcGllcyB3aWxsIHRha2UgcHJlY2VkZW50IG92ZXIKIAkgKiB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cy4KIAkgKi8KIAlwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lcjsKIAogCS8qKgogCSAqIEZvciB0cmFjaW5nIHB1cnBvc2UuCi0JICovCQorCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWRVJCT1NFID0gZmFsc2U7CiAKIAkvKgpAQCAtNjksNyArNzAsNyBAQAogCXB1YmxpYyBCYXNpY1NlYXJjaEVuZ2luZSgpIHsKIAkJLy8gd2lsbCB1c2Ugd29ya2luZyBjb3BpZXMgb2YgUFJJTUFSWSBvd25lcgogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgU2VhcmNoRW5naW5lI1NlYXJjaEVuZ2luZShJQ29tcGlsYXRpb25Vbml0W10pIGZvciBkZXRhaWxlZCBjb21tZW50LgogCSAqLwpAQCAtOTksNyArMTAwLDcgQEAKIAlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSGllcmFyY2h5U2NvcGUoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjcmVhdGVIaWVyYXJjaHlTY29wZSh0eXBlLCBEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBAc2VlIFNlYXJjaEVuZ2luZSNjcmVhdGVIaWVyYXJjaHlTY29wZShJVHlwZSxXb3JraW5nQ29weU93bmVyKSBmb3IgZGV0YWlsZWQgY29tbWVudC4KIAkgKi8KQEAgLTEwOCw2ICsxMDksMTMgQEAKIAl9CiAKIAkvKioKKwkgKiBAc2VlIFNlYXJjaEVuZ2luZSNjcmVhdGVTdHJpY3RIaWVyYXJjaHlTY29wZShJSmF2YVByb2plY3QsSVR5cGUsYm9vbGVhbixib29sZWFuLFdvcmtpbmdDb3B5T3duZXIpIGZvciBkZXRhaWxlZCBjb21tZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVTdHJpY3RIaWVyYXJjaHlTY29wZShJSmF2YVByb2plY3QgcHJvamVjdCwgSVR5cGUgdHlwZSwgYm9vbGVhbiBvbmx5U3VidHlwZXMsIGJvb2xlYW4gaW5jbHVkZUZvY3VzVHlwZSwgV29ya2luZ0NvcHlPd25lciBvd25lcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgSGllcmFyY2h5U2NvcGUocHJvamVjdCwgdHlwZSwgb3duZXIsIG9ubHlTdWJ0eXBlcywgdHJ1ZSwgaW5jbHVkZUZvY3VzVHlwZSk7CisJfQorCisJLyoqCiAJICogQHNlZSBTZWFyY2hFbmdpbmUjY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSBmb3IgZGV0YWlsZWQgY29tbWVudC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzKSB7CkBAIC0xMjksMTQgKzEzNywyMCBAQAogCSAqIEBzZWUgU2VhcmNoRW5naW5lI2NyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSwgaW50KSBmb3IgZGV0YWlsZWQgY29tbWVudC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBpbnQgaW5jbHVkZU1hc2spIHsKKwkJSGFzaFNldCBwcm9qZWN0c1RvQmVBZGRlZCA9IG5ldyBIYXNoU2V0KDIpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEphdmFQcm9qZWN0KSB7CisJCQkJcHJvamVjdHNUb0JlQWRkZWQuYWRkKGVsZW1lbnQpOworCQkJfQorCQl9CiAJCUphdmFTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBKYXZhU2VhcmNoU2NvcGUoKTsKLQkJSGFzaFNldCB2aXNpdGVkUHJvamVjdHMgPSBuZXcgSGFzaFNldCgyKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwogCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewogCQkJCXRyeSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSmF2YVByb2plY3QpIHsKLQkJCQkJCXNjb3BlLmFkZCgoSmF2YVByb2plY3QpZWxlbWVudCwgaW5jbHVkZU1hc2ssIHZpc2l0ZWRQcm9qZWN0cyk7CisJCQkJCWlmIChwcm9qZWN0c1RvQmVBZGRlZC5jb250YWlucyhlbGVtZW50KSkgeworCQkJCQkJc2NvcGUuYWRkKChKYXZhUHJvamVjdCllbGVtZW50LCBpbmNsdWRlTWFzaywgcHJvamVjdHNUb0JlQWRkZWQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJc2NvcGUuYWRkKGVsZW1lbnQpOwogCQkJCQl9CkBAIC0xNTQsMTQgKzE2OCwxNCBAQAogCXB1YmxpYyBzdGF0aWMgVHlwZU5hbWVNYXRjaCBjcmVhdGVUeXBlTmFtZU1hdGNoKElUeXBlIHR5cGUsIGludCBtb2RpZmllcnMpIHsKIAkJcmV0dXJuIG5ldyBKYXZhU2VhcmNoVHlwZU5hbWVNYXRjaCh0eXBlLCBtb2RpZmllcnMpOwogCX0KLQkKKwogCS8qKgogCSAqIEBzZWUgU2VhcmNoRW5naW5lI2NyZWF0ZVdvcmtzcGFjZVNjb3BlKCkgZm9yIGRldGFpbGVkIGNvbW1lbnQuCiAJICovCiAJcHVibGljIHN0YXRpYyBJSmF2YVNlYXJjaFNjb3BlIGNyZWF0ZVdvcmtzcGFjZVNjb3BlKCkgewogCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0V29ya3NwYWNlU2NvcGUoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyB0byBhIGdpdmVuIHF1ZXJ5LiBTZWFyY2ggcXVlcmllcyBjYW4gYmUgY3JlYXRlZCB1c2luZyBoZWxwZXIKIAkgKiBtZXRob2RzIChmcm9tIGEgU3RyaW5nIHBhdHRlcm4gb3IgYSBKYXZhIGVsZW1lbnQpIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcwpAQCAtMTgxLDE5ICsxOTUsMTkgQEAKIAkJCQlpZiAoVkVSQk9TRSkgVXRpbC52ZXJib3NlKCJObyBwYXJ0aWNpcGFudHMgPT4gZG8gbm90aGluZyEiKTsgLy8kTk9OLU5MUy0xJAogCQkJCXJldHVybjsKIAkJCX0KLQkKKwogCQkJLyogaW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yICovCiAJCQlpbnQgbGVuZ3RoID0gcGFydGljaXBhbnRzLmxlbmd0aDsKIAkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZywgMTAwICogbGVuZ3RoKTsgCi0JCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZywgMTAwICogbGVuZ3RoKTsKKwkJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOwogCQkJcmVxdWVzdG9yLmJlZ2luUmVwb3J0aW5nKCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCisKIAkJCQlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50c1tpXTsKIAkJCQl0cnkgewotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nX2luZGV4aW5nLCBuZXcgU3RyaW5nW10ge3BhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCl9KSk7IAorCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nX2luZGV4aW5nLCBuZXcgU3RyaW5nW10ge3BhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCl9KSk7CiAJCQkJCXBhcnRpY2lwYW50LmJlZ2luU2VhcmNoaW5nKCk7CiAJCQkJCXJlcXVlc3Rvci5lbnRlclBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTsKIAkJCQkJUGF0aENvbGxlY3RvciBwYXRoQ29sbGVjdG9yID0gbmV3IFBhdGhDb2xsZWN0b3IoKTsKQEAgLTIwMiw5ICsyMTYsOSBAQAogCQkJCQkJSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsCiAJCQkJCQltb25pdG9yPT1udWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKIAkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCisKIAkJCQkJLy8gbG9jYXRlIGluZGV4IG1hdGNoZXMgaWYgYW55IChub3RlIHRoYXQgYWxsIHNlYXJjaCBtYXRjaGVzIGNvdWxkIGhhdmUgYmVlbiBpc3N1ZWQgZHVyaW5nIGluZGV4IHF1ZXJ5aW5nKQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nX21hdGNoaW5nLCBuZXcgU3RyaW5nW10ge3BhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCl9KSk7IAorCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuYmluZChNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nX21hdGNoaW5nLCBuZXcgU3RyaW5nW10ge3BhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCl9KSk7CiAJCQkJCVN0cmluZ1tdIGluZGV4TWF0Y2hQYXRocyA9IHBhdGhDb2xsZWN0b3IuZ2V0UGF0aHMoKTsKIAkJCQkJaWYgKGluZGV4TWF0Y2hQYXRocyAhPSBudWxsKSB7CiAJCQkJCQlwYXRoQ29sbGVjdG9yID0gbnVsbDsgLy8gcmVsZWFzZQpAQCAtMjE2LDcgKzIzMCw3IEBACiAJCQkJCQlTZWFyY2hEb2N1bWVudFtdIG1hdGNoZXMgPSBNYXRjaExvY2F0b3IuYWRkV29ya2luZ0NvcGllcyhwYXR0ZXJuLCBpbmRleE1hdGNoZXMsIGdldFdvcmtpbmdDb3BpZXMoKSwgcGFydGljaXBhbnQpOwogCQkJCQkJcGFydGljaXBhbnQubG9jYXRlTWF0Y2hlcyhtYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yPT1udWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKIAkJCQkJfQotCQkJCX0gZmluYWxseSB7CQkKKwkJCQl9IGZpbmFsbHkgewogCQkJCQlyZXF1ZXN0b3IuZXhpdFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTsKIAkJCQkJcGFydGljaXBhbnQuZG9uZVNlYXJjaGluZygpOwogCQkJCX0KQEAgLTIyOSw3ICsyNDMsNyBAQAogCX0KIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGRlZmF1bHQgSmF2YSBzZWFyY2ggcGFydGljaXBhbnQuCi0JICogCisJICoKIAkgKiBAcmV0dXJuIGEgbmV3IGRlZmF1bHQgSmF2YSBzZWFyY2ggcGFydGljaXBhbnQKIAkgKiBAc2luY2UgMy4wCiAJICovCkBAIC0yMzcsNyArMjUxLDYgQEAKIAkJcmV0dXJuIG5ldyBKYXZhU2VhcmNoUGFydGljaXBhbnQoKTsKIAl9CiAKLQogCS8qKgogCSAqIEBwYXJhbSBtYXRjaFJ1bGUKIAkgKi8KQEAgLTI0Niw3ICsyNTksNyBAQAogCQkJcmV0dXJuICJSX0VYQUNUX01BVENIIjsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGk9MTsgaTw9ODsgaSsrKSB7CisJCWZvciAoaW50IGk9MTsgaTw9MTY7IGkrKykgewogCQkJaW50IGJpdCA9IG1hdGNoUnVsZSAmICgxPDwoaS0xKSk7CiAJCQlpZiAoYml0ICE9IDAgJiYgYnVmZmVyLmxlbmd0aCgpPjApIGJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCiAJCQlzd2l0Y2ggKGJpdCkgewpAQCAtMjc0LDYgKzI4Nyw5IEBACiAJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOgogCQkJCQlidWZmZXIuYXBwZW5kKCJSX0NBTUVMQ0FTRV9NQVRDSCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKQEAgLTI4MSw3ICsyOTcsNyBAQAogCiAJLyoqCiAJICogUmV0dXJuIGtpbmQgb2Ygc2VhcmNoIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gdmFsdWUuCi0JICogCisJICoKIAkgKiBAcGFyYW0gc2VhcmNoRm9yCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoRm9yU3RyaW5nKGZpbmFsIGludCBzZWFyY2hGb3IpIHsKQEAgLTM2MSw3ICszNzcsNyBAQAogCQkJY29waWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0V29ya2luZ0NvcGllcyhEZWZhdWx0V29ya2luZ0NvcHlPd25lci5QUklNQVJZLCBmYWxzZS8qZG9uJ3QgYWRkIHByaW1hcnkgV0NzIGEgc2Vjb25kIHRpbWUqLyk7CiAJCX0KIAkJaWYgKGNvcGllcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCisKIAkJLy8gZmlsdGVyIG91dCBwcmltYXJ5IHdvcmtpbmcgY29waWVzIHRoYXQgYXJlIHNhdmVkCiAJCUlDb21waWxhdGlvblVuaXRbXSByZXN1bHQgPSBudWxsOwogCQlpbnQgbGVuZ3RoID0gY29waWVzLmxlbmd0aDsKQEAgLTM4NiwyNiArNDAyLDIxIEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCisKIAkvKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdXNlZCB0byBkbyB0aGUgc2VhcmNoIG9uIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQuCisJICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHRvIHVzZSB0byBkbyB0aGUgc2VhcmNoIG9uIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQuCiAJICovCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0W10gZ2V0V29ya2luZ0NvcGllcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKIAkJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoKElNZW1iZXIpZWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0W10gY29waWVzID0gZ2V0V29ya2luZ0NvcGllcygpOwotCQkJCWludCBsZW5ndGggPSBjb3BpZXMgPT0gbnVsbCA/IDAgOiBjb3BpZXMubGVuZ3RoOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXRbXSBuZXdXb3JraW5nQ29waWVzID0gbmV3IElDb21waWxhdGlvblVuaXRbbGVuZ3RoKzFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvcGllcywgMCwgbmV3V29ya2luZ0NvcGllcywgMCwgbGVuZ3RoKTsKLQkJCQkJbmV3V29ya2luZ0NvcGllc1tsZW5ndGhdID0gY3U7Ci0JCQkJCXJldHVybiBuZXdXb3JraW5nQ29waWVzOwotCQkJCX0gCi0JCQkJcmV0dXJuIG5ldyBJQ29tcGlsYXRpb25Vbml0W10ge2N1fTsKKwkJCQlyZXR1cm4gbmV3IElDb21waWxhdGlvblVuaXRbXSB7IGN1IH07CiAJCQl9CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKKwkJCXJldHVybiBuZXcgSUNvbXBpbGF0aW9uVW5pdFtdIHsgKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQgfTsKIAkJfQotCQlyZXR1cm4gZ2V0V29ya2luZ0NvcGllcygpOworCisJCXJldHVybiBudWxsOwogCX0KIAogCWJvb2xlYW4gbWF0Y2goY2hhciBwYXR0ZXJuVHlwZVN1ZmZpeCwgaW50IG1vZGlmaWVycykgewpAQCAtNDI4LDcgKzQzOSw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCWJvb2xlYW4gbWF0Y2goY2hhciBwYXR0ZXJuVHlwZVN1ZmZpeCwgY2hhcltdIHBhdHRlcm5Qa2csIGNoYXJbXSBwYXR0ZXJuVHlwZU5hbWUsIGludCBtYXRjaFJ1bGUsIGludCB0eXBlS2luZCwgY2hhcltdIHBrZywgY2hhcltdIHR5cGVOYW1lKSB7CisJYm9vbGVhbiBtYXRjaChjaGFyIHBhdHRlcm5UeXBlU3VmZml4LCBjaGFyW10gcGF0dGVyblBrZywgaW50IG1hdGNoUnVsZVBrZywgY2hhcltdIHBhdHRlcm5UeXBlTmFtZSwgaW50IG1hdGNoUnVsZVR5cGUsIGludCB0eXBlS2luZCwgY2hhcltdIHBrZywgY2hhcltdIHR5cGVOYW1lKSB7CiAJCXN3aXRjaChwYXR0ZXJuVHlwZVN1ZmZpeCkgewogCQkJY2FzZSBJSW5kZXhDb25zdGFudHMuQ0xBU1NfU1VGRklYIDoKIAkJCQlpZiAodHlwZUtpbmQgIT0gVHlwZURlY2xhcmF0aW9uLkNMQVNTX0RFQ0wpIHJldHVybiBmYWxzZTsKQEAgLTQ1MywyNyArNDY0LDIyIEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIElJbmRleENvbnN0YW50cy5UWVBFX1NVRkZJWCA6IC8vIG5vdGhpbmcKIAkJfQotCQotCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9IChtYXRjaFJ1bGUgJiBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUpICE9IDA7Ci0JCWlmIChwYXR0ZXJuUGtnICE9IG51bGwgJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5Qa2csIHBrZywgaXNDYXNlU2Vuc2l0aXZlKSkKLQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJYm9vbGVhbiBpc1BrZ0Nhc2VTZW5zaXRpdmUgPSAobWF0Y2hSdWxlUGtnICYgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFKSAhPSAwOworCQlpZiAocGF0dGVyblBrZyAhPSBudWxsICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuUGtnLCBwa2csIGlzUGtnQ2FzZVNlbnNpdGl2ZSkpCisJCQlyZXR1cm4gZmFsc2U7CiAJCQorCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9IChtYXRjaFJ1bGVUeXBlICYgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFKSAhPSAwOwogCQlpZiAocGF0dGVyblR5cGVOYW1lICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaXNDYW1lbENhc2UgPSAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9NQVRDSCkgIT0gMDsKLQkJCWludCBtYXRjaE1vZGUgPSBtYXRjaFJ1bGUgJiBKYXZhU2VhcmNoUGF0dGVybi5NQVRDSF9NT0RFX01BU0s7CisJCQlib29sZWFuIGlzQ2FtZWxDYXNlID0gKG1hdGNoUnVsZVR5cGUgJiAoU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIKSkgIT0gMDsKKwkJCWludCBtYXRjaE1vZGUgPSBtYXRjaFJ1bGVUeXBlICYgSmF2YVNlYXJjaFBhdHRlcm4uTUFUQ0hfTU9ERV9NQVNLOwogCQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUgJiYgIWlzQ2FtZWxDYXNlKSB7CiAJCQkJcGF0dGVyblR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXR0ZXJuVHlwZU5hbWUpOwogCQkJfQogCQkJYm9vbGVhbiBtYXRjaEZpcnN0Q2hhciA9ICFpc0Nhc2VTZW5zaXRpdmUgfHwgcGF0dGVyblR5cGVOYW1lWzBdID09IHR5cGVOYW1lWzBdOwotCQkJaWYgKGlzQ2FtZWxDYXNlICYmIG1hdGNoRmlyc3RDaGFyICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gocGF0dGVyblR5cGVOYW1lLCB0eXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KIAkJCXN3aXRjaChtYXRjaE1vZGUpIHsKIAkJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCA6Ci0JCQkJCWlmICghaXNDYW1lbENhc2UpIHsKLQkJCQkJCXJldHVybiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuVHlwZU5hbWUsIHR5cGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpOwotCQkJCQl9Ci0JCQkJCS8vIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gbWF0Y2ggYXMgcHJlZml4IGlmIGNhbWVsIGNhc2UgZmFpbGVkCisJCQkJCXJldHVybiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuVHlwZU5hbWUsIHR5cGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpOwogCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSCA6CiAJCQkJCXJldHVybiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhwYXR0ZXJuVHlwZU5hbWUsIHR5cGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpOwogCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0ggOgpAQCAtNDgxLDEyICs0ODcsMTkgQEAKIAkJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9SRUdFWFBfTUFUQ0ggOgogCQkJCQkvLyBUT0RPIChmcmVkZXJpYykgaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAogCQkJCQlicmVhazsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g6CisJCQkJCWlmIChtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm5UeXBlTmFtZSwgdHlwZU5hbWUsIGZhbHNlKSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQkJcmV0dXJuICFpc0Nhc2VTZW5zaXRpdmUgJiYgbWF0Y2hGaXJzdENoYXIgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocGF0dGVyblR5cGVOYW1lLCB0eXBlTmFtZSwgZmFsc2UpOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQkJCXJldHVybiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm5UeXBlTmFtZSwgdHlwZU5hbWUsIHRydWUpOwogCQkJfQogCQl9CiAJCXJldHVybiB0cnVlOwotCQotCX0JCi0JCisKKwl9CisKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBwYXR0ZXJuLiBTZWFyY2ggcGF0dGVybnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgaGVscGVyCiAJICogbWV0aG9kcyAoZnJvbSBhIFN0cmluZyBwYXR0ZXJuIG9yIGEgSmF2YSBlbGVtZW50KSBhbmQgZW5jYXBzdWxhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgaXMKQEAgLTUwMSwxMSArNTE0LDM0NyBAQAogCQl9CiAJCWZpbmRNYXRjaGVzKHBhdHRlcm4sIHBhcnRpY2lwYW50cywgc2NvcGUsIHJlcXVlc3RvciwgbW9uaXRvcik7CiAJfQorCQorCXB1YmxpYyB2b2lkIHNlYXJjaEFsbENvbnN0cnVjdG9yRGVjbGFyYXRpb25zKAorCQlmaW5hbCBjaGFyW10gcGFja2FnZU5hbWUsCisJCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKKwkJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCisJCWZpbmFsIElSZXN0cmljdGVkQWNjZXNzQ29uc3RydWN0b3JSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKKwkJaW50IHdhaXRpbmdQb2xpY3ksCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJLy8gVmFsaWRhdGUgbWF0Y2ggcnVsZSBmaXJzdAorCQlmaW5hbCBpbnQgdmFsaWRhdGVkVHlwZU1hdGNoUnVsZSA9IFNlYXJjaFBhdHRlcm4udmFsaWRhdGVNYXRjaFJ1bGUodHlwZU5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nICh0eXBlTmFtZSksIHR5cGVNYXRjaFJ1bGUpOworCQkKKwkJZmluYWwgaW50IHBrZ01hdGNoUnVsZSA9IFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRTsKKwkJZmluYWwgY2hhciBOb1N1ZmZpeCA9IElJbmRleENvbnN0YW50cy5UWVBFX1NVRkZJWDsgLy8gVXNlZCBhcyBUWVBFX1NVRkZJWCBoYXMgbm8gZWZmZWN0IGluIG1ldGhvZCAjbWF0Y2goY2hhciwgY2hhcltdICwgaW50LCBjaGFyW10sIGludCAsIGludCwgY2hhcltdLCBjaGFyW10pCisKKwkJLy8gRGVidWcKKwkJaWYgKFZFUkJPU0UpIHsKKwkJCVV0aWwudmVyYm9zZSgiQmFzaWNTZWFyY2hFbmdpbmUuc2VhcmNoQWxsQ29uc3RydWN0b3JEZWNsYXJhdGlvbnMoY2hhcltdLCBjaGFyW10sIGludCwgSUphdmFTZWFyY2hTY29wZSwgSVJlc3RyaWN0ZWRBY2Nlc3NDb25zdHJ1Y3RvclJlcXVlc3RvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCisJCQlVdGlsLnZlcmJvc2UoIgktIHBhY2thZ2UgbmFtZTogIisocGFja2FnZU5hbWU9PW51bGw/Im51bGwiOm5ldyBTdHJpbmcocGFja2FnZU5hbWUpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJVXRpbC52ZXJib3NlKCIJLSB0eXBlIG5hbWU6ICIrKHR5cGVOYW1lPT1udWxsPyJudWxsIjpuZXcgU3RyaW5nKHR5cGVOYW1lKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCVV0aWwudmVyYm9zZSgiCS0gdHlwZSBtYXRjaCBydWxlOiAiK2dldE1hdGNoUnVsZVN0cmluZyh0eXBlTWF0Y2hSdWxlKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh2YWxpZGF0ZWRUeXBlTWF0Y2hSdWxlICE9IHR5cGVNYXRjaFJ1bGUpIHsKKwkJCQlVdGlsLnZlcmJvc2UoIgktIHZhbGlkYXRlZCB0eXBlIG1hdGNoIHJ1bGU6ICIrZ2V0TWF0Y2hSdWxlU3RyaW5nKHZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJVXRpbC52ZXJib3NlKCIJLSBzY29wZTogIitzY29wZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAodmFsaWRhdGVkVHlwZU1hdGNoUnVsZSA9PSAtMSkgcmV0dXJuOyAvLyBpbnZhbGlkIG1hdGNoIHJ1bGUgPT4gcmV0dXJuIG5vIHJlc3VsdHMKKworCQkvLyBDcmVhdGUgcGF0dGVybgorCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKKwkJZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvblBhdHRlcm4gcGF0dGVybiA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybigKKwkJCQlwYWNrYWdlTmFtZSwKKwkJCQl0eXBlTmFtZSwKKwkJCQl2YWxpZGF0ZWRUeXBlTWF0Y2hSdWxlKTsKKworCQkvLyBHZXQgd29ya2luZyBjb3B5IHBhdGgocykuIFN0b3JlIGluIGEgc2luZ2xlIHN0cmluZyBpbiBjYXNlIG9mIG9ubHkgb25lIHRvIG9wdGltaXplIGNvbXBhcmlzb24gaW4gcmVxdWVzdG9yCisJCWZpbmFsIEhhc2hTZXQgd29ya2luZ0NvcHlQYXRocyA9IG5ldyBIYXNoU2V0KCk7CisJCVN0cmluZyB3b3JraW5nQ29weVBhdGggPSBudWxsOworCQlJQ29tcGlsYXRpb25Vbml0W10gY29waWVzID0gZ2V0V29ya2luZ0NvcGllcygpOworCQlmaW5hbCBpbnQgY29waWVzTGVuZ3RoID0gY29waWVzID09IG51bGwgPyAwIDogY29waWVzLmxlbmd0aDsKKwkJaWYgKGNvcGllcyAhPSBudWxsKSB7CisJCQlpZiAoY29waWVzTGVuZ3RoID09IDEpIHsKKwkJCQl3b3JraW5nQ29weVBhdGggPSBjb3BpZXNbMF0uZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29waWVzTGVuZ3RoOyBpKyspIHsKKwkJCQkJSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IGNvcGllc1tpXTsKKwkJCQkJd29ya2luZ0NvcHlQYXRocy5hZGQod29ya2luZ0NvcHkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmaW5hbCBTdHJpbmcgc2luZ2xlV2tjcFBhdGggPSB3b3JraW5nQ29weVBhdGg7CisKKwkJLy8gSW5kZXggcmVxdWVzdG9yCisJCUluZGV4UXVlcnlSZXF1ZXN0b3Igc2VhcmNoUmVxdWVzdG9yID0gbmV3IEluZGV4UXVlcnlSZXF1ZXN0b3IoKXsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdEluZGV4TWF0Y2goU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGF0dGVybiBpbmRleFJlY29yZCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIEFjY2Vzc1J1bGVTZXQgYWNjZXNzKSB7CisJCQkJLy8gRmlsdGVyIHVuZXhwZWN0ZWQgdHlwZXMKKwkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybiByZWNvcmQgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvblBhdHRlcm4paW5kZXhSZWNvcmQ7CisJCQkJCisJCQkJaWYgKChyZWNvcmQuZXh0cmFGbGFncyAmIEV4dHJhRmxhZ3MuSXNNZW1iZXJUeXBlKSAhPSAwKSB7CisJCQkJCXJldHVybiB0cnVlOyAvLyBmaWx0ZXIgb3V0IG1lbWJlciBjbGFzc2VzCisJCQkJfQorCQkJCWlmICgocmVjb3JkLmV4dHJhRmxhZ3MgJiBFeHRyYUZsYWdzLklzTG9jYWxUeXBlKSAhPSAwKSB7CisJCQkJCXJldHVybiB0cnVlOyAvLyBmaWx0ZXIgb3V0IGxvY2FsIGFuZCBhbm9ueW1vdXMgY2xhc3NlcworCQkJCX0KKwkJCQlzd2l0Y2ggKGNvcGllc0xlbmd0aCkgeworCQkJCQljYXNlIDA6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJaWYgKHNpbmdsZVdrY3BQYXRoLmVxdWFscyhkb2N1bWVudFBhdGgpKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7IC8vIGZpbHRlciBvdXQgKnRoZSogd29ya2luZyBjb3B5CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmICh3b3JraW5nQ29weVBhdGhzLmNvbnRhaW5zKGRvY3VtZW50UGF0aCkpIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gZmlsdGVyIG91dCB3b3JraW5nIGNvcGllcworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gQWNjZXB0IGRvY3VtZW50IHBhdGgKKwkJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3NSZXN0cmljdGlvbiA9IG51bGw7CisJCQkJaWYgKGFjY2VzcyAhPSBudWxsKSB7CisJCQkJCS8vIENvbXB1dGUgZG9jdW1lbnQgcmVsYXRpdmUgcGF0aAorCQkJCQlpbnQgcGtnTGVuZ3RoID0gKHJlY29yZC5kZWNsYXJpbmdQYWNrYWdlTmFtZT09bnVsbCB8fCByZWNvcmQuZGVjbGFyaW5nUGFja2FnZU5hbWUubGVuZ3RoPT0wKSA/IDAgOiByZWNvcmQuZGVjbGFyaW5nUGFja2FnZU5hbWUubGVuZ3RoKzE7CisJCQkJCWludCBuYW1lTGVuZ3RoID0gcmVjb3JkLmRlY2xhcmluZ1NpbXBsZU5hbWU9PW51bGwgPyAwIDogcmVjb3JkLmRlY2xhcmluZ1NpbXBsZU5hbWUubGVuZ3RoOworCQkJCQljaGFyW10gcGF0aCA9IG5ldyBjaGFyW3BrZ0xlbmd0aCtuYW1lTGVuZ3RoXTsKKwkJCQkJaW50IHBvcyA9IDA7CisJCQkJCWlmIChwa2dMZW5ndGggPiAwKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlY29yZC5kZWNsYXJpbmdQYWNrYWdlTmFtZSwgMCwgcGF0aCwgcG9zLCBwa2dMZW5ndGgtMSk7CisJCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UocGF0aCwgJy4nLCAnLycpOworCQkJCQkJcGF0aFtwa2dMZW5ndGgtMV0gPSAnLyc7CisJCQkJCQlwb3MgKz0gcGtnTGVuZ3RoOworCQkJCQl9CisJCQkJCWlmIChuYW1lTGVuZ3RoID4gMCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weShyZWNvcmQuZGVjbGFyaW5nU2ltcGxlTmFtZSwgMCwgcGF0aCwgcG9zLCBuYW1lTGVuZ3RoKTsKKwkJCQkJCXBvcyArPSBuYW1lTGVuZ3RoOworCQkJCQl9CisJCQkJCS8vIFVwZGF0ZSBhY2Nlc3MgcmVzdHJpY3Rpb24gaWYgcGF0aCBpcyBub3QgZW1wdHkKKwkJCQkJaWYgKHBvcyA+IDApIHsKKwkJCQkJCWFjY2Vzc1Jlc3RyaWN0aW9uID0gYWNjZXNzLmdldFZpb2xhdGVkUmVzdHJpY3Rpb24ocGF0aCk7CisJCQkJCX0KKwkJCQl9CisJCQkJbmFtZVJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvcigKKwkJCQkJCXJlY29yZC5tb2RpZmllcnMsCisJCQkJCQlyZWNvcmQuZGVjbGFyaW5nU2ltcGxlTmFtZSwKKwkJCQkJCXJlY29yZC5wYXJhbWV0ZXJDb3VudCwKKwkJCQkJCXJlY29yZC5zaWduYXR1cmUsCisJCQkJCQlyZWNvcmQucGFyYW1ldGVyVHlwZXMsCisJCQkJCQlyZWNvcmQucGFyYW1ldGVyTmFtZXMsCisJCQkJCQlyZWNvcmQuZGVjbGFyaW5nVHlwZU1vZGlmaWVycywKKwkJCQkJCXJlY29yZC5kZWNsYXJpbmdQYWNrYWdlTmFtZSwKKwkJCQkJCXJlY29yZC5leHRyYUZsYWdzLAorCQkJCQkJZG9jdW1lbnRQYXRoLAorCQkJCQkJYWNjZXNzUmVzdHJpY3Rpb24pOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCisJCXRyeSB7CisJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmVuZ2luZV9zZWFyY2hpbmcsIDEwMDApOworCQkJfQorCQkJLy8gYWRkIHR5cGUgbmFtZXMgZnJvbSBpbmRleGVzCisJCQlpbmRleE1hbmFnZXIucGVyZm9ybUNvbmN1cnJlbnRKb2IoCisJCQkJbmV3IFBhdHRlcm5TZWFyY2hKb2IoCisJCQkJCXBhdHRlcm4sCisJCQkJCWdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLCAvLyBKYXZhIHNlYXJjaCBvbmx5CisJCQkJCXNjb3BlLAorCQkJCQlzZWFyY2hSZXF1ZXN0b3IpLAorCQkJCXdhaXRpbmdQb2xpY3ksCisJCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEwMDAtY29waWVzTGVuZ3RoKSk7CisKKwkJCS8vIGFkZCB0eXBlIG5hbWVzIGZyb20gd29ya2luZyBjb3BpZXMKKwkJCWlmIChjb3BpZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29waWVzTGVuZ3RoOyBpKyspIHsKKwkJCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IGNvcGllc1tpXTsKKwkJCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgSGllcmFyY2h5U2NvcGUpIHsKKwkJCQkJCWlmICghKChIaWVyYXJjaHlTY29wZSlzY29wZSkuZW5jbG9zZXMod29ya2luZ0NvcHksIHByb2dyZXNzTW9uaXRvcikpIGNvbnRpbnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKCFzY29wZS5lbmNsb3Nlcyh3b3JraW5nQ29weSkpIGNvbnRpbnVlOworCQkJCQl9CisJCQkJCQorCQkJCQlmaW5hbCBTdHJpbmcgcGF0aCA9IHdvcmtpbmdDb3B5LmdldFBhdGgoKS50b1N0cmluZygpOworCQkJCQlpZiAod29ya2luZ0NvcHkuaXNDb25zaXN0ZW50KCkpIHsKKwkJCQkJCUlQYWNrYWdlRGVjbGFyYXRpb25bXSBwYWNrYWdlRGVjbGFyYXRpb25zID0gd29ya2luZ0NvcHkuZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpOworCQkJCQkJY2hhcltdIHBhY2thZ2VEZWNsYXJhdGlvbiA9IHBhY2thZ2VEZWNsYXJhdGlvbnMubGVuZ3RoID09IDAgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBwYWNrYWdlRGVjbGFyYXRpb25zWzBdLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKKwkJCQkJCUlUeXBlW10gYWxsVHlwZXMgPSB3b3JraW5nQ29weS5nZXRBbGxUeXBlcygpOworCQkJCQkJZm9yIChpbnQgaiA9IDAsIGFsbFR5cGVzTGVuZ3RoID0gYWxsVHlwZXMubGVuZ3RoOyBqIDwgYWxsVHlwZXNMZW5ndGg7IGorKykgeworCQkJCQkJCUlUeXBlIHR5cGUgPSBhbGxUeXBlc1tqXTsKKwkJCQkJCQljaGFyW10gc2ltcGxlTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkJCQkJCWlmIChtYXRjaChOb1N1ZmZpeCwgcGFja2FnZU5hbWUsIHBrZ01hdGNoUnVsZSwgdHlwZU5hbWUsIHZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUsIDAvKm5vIGtpbmQqLywgcGFja2FnZURlY2xhcmF0aW9uLCBzaW1wbGVOYW1lKSAmJiAhdHlwZS5pc01lbWJlcigpKSB7CisJCQkJCQkJCQorCQkJCQkJCQlpbnQgZXh0cmFGbGFncyA9IEV4dHJhRmxhZ3MuZ2V0RXh0cmFGbGFncyh0eXBlKTsKKwkJCQkJCQkJCisJCQkJCQkJCWJvb2xlYW4gaGFzQ29uc3RydWN0b3IgPSBmYWxzZTsKKwkJCQkJCQkJCisJCQkJCQkJCUlNZXRob2RbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7CisJCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbWV0aG9kcy5sZW5ndGg7IGsrKykgeworCQkJCQkJCQkJSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2tdOworCQkJCQkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQkJCQkJCQloYXNDb25zdHJ1Y3RvciA9IHRydWU7CisJCQkJCQkJCQkJCisJCQkJCQkJCQkJU3RyaW5nW10gc3RyaW5nUGFyYW1ldGVyTmFtZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKwkJCQkJCQkJCQlTdHJpbmdbXSBzdHJpbmdQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworCQkJCQkJCQkJCWludCBsZW5ndGggPSBzdHJpbmdQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7CisJCQkJCQkJCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJCQkJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBsZW5ndGg7IGwrKykgeworCQkJCQkJCQkJCQlwYXJhbWV0ZXJOYW1lc1tsXSA9IHN0cmluZ1BhcmFtZXRlck5hbWVzW2xdLnRvQ2hhckFycmF5KCk7CisJCQkJCQkJCQkJCXBhcmFtZXRlclR5cGVzW2xdID0gU2lnbmF0dXJlLnRvQ2hhckFycmF5KFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZShzdHJpbmdQYXJhbWV0ZXJUeXBlc1tsXSkudG9DaGFyQXJyYXkoKSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQorCQkJCQkJCQkJCW5hbWVSZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3IoCisJCQkJCQkJCQkJCQltZXRob2QuZ2V0RmxhZ3MoKSwKKwkJCQkJCQkJCQkJCXNpbXBsZU5hbWUsCisJCQkJCQkJCQkJCQlwYXJhbWV0ZXJOYW1lcy5sZW5ndGgsCisJCQkJCQkJCQkJCQludWxsLC8vIHNpZ25hdHVyZSBpcyBub3QgdXNlZCBmb3Igc291cmNlIHR5cGUKKwkJCQkJCQkJCQkJCXBhcmFtZXRlclR5cGVzLCAKKwkJCQkJCQkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJCQkJCQkJdHlwZS5nZXRGbGFncygpLAorCQkJCQkJCQkJCQkJcGFja2FnZURlY2xhcmF0aW9uLAorCQkJCQkJCQkJCQkJZXh0cmFGbGFncywKKwkJCQkJCQkJCQkJCXBhdGgsCisJCQkJCQkJCQkJCQludWxsKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJaWYgKCFoYXNDb25zdHJ1Y3RvcikgeworCQkJCQkJCQkJbmFtZVJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvcigKKwkJCQkJCQkJCQkJRmxhZ3MuQWNjUHVibGljLAorCQkJCQkJCQkJCQlzaW1wbGVOYW1lLAorCQkJCQkJCQkJCQktMSwKKwkJCQkJCQkJCQkJbnVsbCwgLy8gc2lnbmF0dXJlIGlzIG5vdCB1c2VkIGZvciBzb3VyY2UgdHlwZQorCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIsCisJCQkJCQkJCQkJCXR5cGUuZ2V0RmxhZ3MoKSwKKwkJCQkJCQkJCQkJcGFja2FnZURlY2xhcmF0aW9uLAorCQkJCQkJCQkJCQlleHRyYUZsYWdzLAorCQkJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJCQludWxsKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBhcnNlciBiYXNpY1BhcnNlciA9IGdldFBhcnNlcigpOworCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0KSB3b3JraW5nQ29weTsKKwkJCQkJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uVW5pdFJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh1bml0LCAwLCAwLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IGJhc2ljUGFyc2VyLmRpZXRQYXJzZSh1bml0LCBjb21waWxhdGlvblVuaXRSZXN1bHQpOworCQkJCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgeworCQkJCQkJCWZpbmFsIGNoYXJbXSBwYWNrYWdlRGVjbGFyYXRpb24gPSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlID09IG51bGwgPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZS5nZXRJbXBvcnROYW1lKCksICcuJyk7CisJCQkJCQkJY2xhc3MgQWxsQ29uc3RydWN0b3JEZWNsYXJhdGlvbnNWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CisJCQkJCQkJCXByaXZhdGUgVHlwZURlY2xhcmF0aW9uW10gZGVjbGFyaW5nVHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uWzBdOworCQkJCQkJCQlwcml2YXRlIGludCBkZWNsYXJpbmdUeXBlc1B0ciA9IC0xOworCQkJCQkJCQkKKwkJCQkJCQkJcHJpdmF0ZSB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwkJCQkJCQkJCWlmICghaGFzQ29uc3RydWN0b3IodHlwZURlY2xhcmF0aW9uKSAmJiB0eXBlRGVjbGFyYXRpb24uZW5jbG9zaW5nVHlwZSA9PSBudWxsKSB7CisJCQkJCQkJCQkKKwkJCQkJCQkJCQlpZiAobWF0Y2goTm9TdWZmaXgsIHBhY2thZ2VOYW1lLCBwa2dNYXRjaFJ1bGUsIHR5cGVOYW1lLCB2YWxpZGF0ZWRUeXBlTWF0Y2hSdWxlLCAwLypubyBraW5kKi8sIHBhY2thZ2VEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLm5hbWUpKSB7CisJCQkJCQkJCQkJCW5hbWVSZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3IoCisJCQkJCQkJCQkJCQkJRmxhZ3MuQWNjUHVibGljLAorCQkJCQkJCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCQkJCQkJCS0xLAorCQkJCQkJCQkJCQkJCW51bGwsIC8vIHNpZ25hdHVyZSBpcyBub3QgdXNlZCBmb3Igc291cmNlIHR5cGUKKwkJCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQkJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzLAorCQkJCQkJCQkJCQkJCXBhY2thZ2VEZWNsYXJhdGlvbiwKKwkJCQkJCQkJCQkJCQlFeHRyYUZsYWdzLmdldEV4dHJhRmxhZ3ModHlwZURlY2xhcmF0aW9uKSwKKwkJCQkJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJCQkJCW51bGwpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJdGhpcy5kZWNsYXJpbmdUeXBlc1t0aGlzLmRlY2xhcmluZ1R5cGVzUHRyXSA9IG51bGw7CisJCQkJCQkJCQl0aGlzLmRlY2xhcmluZ1R5cGVzUHRyLS07CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdFNjb3BlIHMpIHsKKwkJCQkJCQkJCWVuZFZpc2l0KHR5cGVEZWNsYXJhdGlvbik7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgcykgeworCQkJCQkJCQkJZW5kVmlzaXQobWVtYmVyVHlwZURlY2xhcmF0aW9uKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJcHJpdmF0ZSBib29sZWFuIGhhc0NvbnN0cnVjdG9yKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwkJCQkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CisJCQkJCQkJCQlpbnQgbGVuZ3RoID0gbWV0aG9kcyA9PSBudWxsID8gMCA6IG1ldGhvZHMubGVuZ3RoOworCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJCQkJCWlmIChtZXRob2RzW2pdLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgeworCQkJCQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyaW5nVHlwZXNbdGhpcy5kZWNsYXJpbmdUeXBlc1B0cl07CisJCQkJCQkJCQlpZiAobWF0Y2goTm9TdWZmaXgsIHBhY2thZ2VOYW1lLCBwa2dNYXRjaFJ1bGUsIHR5cGVOYW1lLCB2YWxpZGF0ZWRUeXBlTWF0Y2hSdWxlLCAwLypubyBraW5kKi8sIHBhY2thZ2VEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLm5hbWUpKSB7CisJCQkJCQkJCQkJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFyZ3VtZW50czsKKwkJCQkJCQkJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKKwkJCQkJCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCQkJCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCQkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IGxlbmd0aDsgbCsrKSB7CisJCQkJCQkJCQkJCUFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzW2xdOworCQkJCQkJCQkJCQlwYXJhbWV0ZXJOYW1lc1tsXSA9IGFyZ3VtZW50Lm5hbWU7CisJCQkJCQkJCQkJCWlmIChhcmd1bWVudC50eXBlIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJCQkJCQkJCQkJcGFyYW1ldGVyVHlwZXNbbF0gPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpYXJndW1lbnQudHlwZSkudG9rZW47CisJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQlwYXJhbWV0ZXJUeXBlc1tsXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCgoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpYXJndW1lbnQudHlwZSkudG9rZW5zLCAnLicpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQorCQkJCQkJCQkJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmcgPSB0eXBlRGVjbGFyYXRpb24uZW5jbG9zaW5nVHlwZTsKKwkJCQkJCQkJCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKwkJCQkJCQkJCQl3aGlsZSAoZW5jbG9zaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJCQkJZW5jbG9zaW5nVHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChuZXcgY2hhcltdW10ge2VuY2xvc2luZy5uYW1lfSwgZW5jbG9zaW5nVHlwZU5hbWVzKTsKKwkJCQkJCQkJCQkJaWYgKChlbmNsb3NpbmcuYml0cyAmIEFTVE5vZGUuSXNNZW1iZXJUeXBlKSAhPSAwKSB7CisJCQkJCQkJCQkJCQllbmNsb3NpbmcgPSBlbmNsb3NpbmcuZW5jbG9zaW5nVHlwZTsKKwkJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJCWVuY2xvc2luZyA9IG51bGw7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCisJCQkJCQkJCQkJbmFtZVJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvcigKKwkJCQkJCQkJCQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24ubW9kaWZpZXJzLAorCQkJCQkJCQkJCQkJdHlwZU5hbWUsCisJCQkJCQkJCQkJCQlwYXJhbWV0ZXJOYW1lcy5sZW5ndGgsCisJCQkJCQkJCQkJCQludWxsLCAvLyBzaWduYXR1cmUgaXMgbm90IHVzZWQgZm9yIHNvdXJjZSB0eXBlCisJCQkJCQkJCQkJCQlwYXJhbWV0ZXJUeXBlcywKKwkJCQkJCQkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJCQkJCQkJdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycywKKwkJCQkJCQkJCQkJCXBhY2thZ2VEZWNsYXJhdGlvbiwKKwkJCQkJCQkJCQkJCUV4dHJhRmxhZ3MuZ2V0RXh0cmFGbGFncyh0eXBlRGVjbGFyYXRpb24pLAorCQkJCQkJCQkJCQkJcGF0aCwKKwkJCQkJCQkJCQkJCW51bGwpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBubyBuZWVkIHRvIGZpbmQgY29uc3RydWN0b3JzIGZyb20gbG9jYWwvYW5vbnltb3VzIHR5cGUKKwkJCQkJCQkJfQorCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwkJCQkJCQkJCXJldHVybiBmYWxzZTsgCisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCXByaXZhdGUgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCQkJCQkJCQlpZih0aGlzLmRlY2xhcmluZ1R5cGVzLmxlbmd0aCA8PSArK3RoaXMuZGVjbGFyaW5nVHlwZXNQdHIpIHsKKwkJCQkJCQkJCQlpbnQgbGVuZ3RoID0gdGhpcy5kZWNsYXJpbmdUeXBlc1B0cjsKKwkJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZGVjbGFyaW5nVHlwZXMsIDAsIHRoaXMuZGVjbGFyaW5nVHlwZXMgPSBuZXcgVHlwZURlY2xhcmF0aW9uW2xlbmd0aCAqIDIgKyAxXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXRoaXMuZGVjbGFyaW5nVHlwZXNbdGhpcy5kZWNsYXJpbmdUeXBlc1B0cl0gPSB0eXBlRGVjbGFyYXRpb247CisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgcykgeworCQkJCQkJCQkJcmV0dXJuIHZpc2l0KHR5cGVEZWNsYXJhdGlvbik7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgcykgeworCQkJCQkJCQkJcmV0dXJuIHZpc2l0KG1lbWJlclR5cGVEZWNsYXJhdGlvbik7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJcGFyc2VkVW5pdC50cmF2ZXJzZShuZXcgQWxsQ29uc3RydWN0b3JEZWNsYXJhdGlvbnNWaXNpdG9yKCksIHBhcnNlZFVuaXQuc2NvcGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQkJaWYgKHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CisJCQl9CisJCX0KKwl9CiAKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIHNlY29uZGFyeSB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAJICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2Ugb3IgYSB0eXBlIG5hbWUKLQkgKiBwcmVmaXggYW5kIG1hdGNoIG1vZGVzKS4gCisJICogcHJlZml4IGFuZCBtYXRjaCBtb2RlcykuCiAJICovCiAJcHVibGljIHZvaWQgc2VhcmNoQWxsU2Vjb25kYXJ5VHlwZU5hbWVzKAogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VGb2xkZXJzLApAQCAtNTMwLDcgKzg3OSw3IEBACiAJCQlVdGlsLnZlcmJvc2UoYnVmZmVyLnRvU3RyaW5nKCkpOwogCQl9CiAKLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOworCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKIAkJZmluYWwgVHlwZURlY2xhcmF0aW9uUGF0dGVybiBwYXR0ZXJuID0gbmV3IFNlY29uZGFyeVR5cGVEZWNsYXJhdGlvblBhdHRlcm4oKTsKIAogCQkvLyBHZXQgd29ya2luZyBjb3B5IHBhdGgocykuIFN0b3JlIGluIGEgc2luZ2xlIHN0cmluZyBpbiBjYXNlIG9mIG9ubHkgb25lIHRvIG9wdGltaXplIGNvbXBhcmlzb24gaW4gcmVxdWVzdG9yCkBAIC02MDcsMTMgKzk1NiwxMyBAQAogCQkvLyBhZGQgdHlwZSBuYW1lcyBmcm9tIGluZGV4ZXMKIAkJdHJ5IHsKIAkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZywgMTAwKTsgCisJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDApOwogCQkJfQogCQkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKAogCQkJCW5ldyBQYXR0ZXJuU2VhcmNoSm9iKAotCQkJCQlwYXR0ZXJuLCAKKwkJCQkJcGF0dGVybiwKIAkJCQkJZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCksIC8vIEphdmEgc2VhcmNoIG9ubHkKLQkJCQkJY3JlYXRlSmF2YVNlYXJjaFNjb3BlKHNvdXJjZUZvbGRlcnMpLCAKKwkJCQkJY3JlYXRlSmF2YVNlYXJjaFNjb3BlKHNvdXJjZUZvbGRlcnMpLAogCQkJCQlzZWFyY2hSZXF1ZXN0b3IpLAogCQkJCXdhaXRGb3JJbmRleGVzCiAJCQkJCT8gSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gKQEAgLTYzMSwzNCArOTgwLDQyIEBACiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAJICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2Ugb3IgYSB0eXBlIG5hbWUKLQkgKiBwcmVmaXggYW5kIG1hdGNoIG1vZGVzKS4gCi0JICogCisJICogcHJlZml4IGFuZCBtYXRjaCBtb2RlcykuCisJICoKIAkgKiBAc2VlIFNlYXJjaEVuZ2luZSNzZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdLCBpbnQsIGNoYXJbXSwgaW50LCBpbnQsIElKYXZhU2VhcmNoU2NvcGUsIFR5cGVOYW1lUmVxdWVzdG9yLCBpbnQsIElQcm9ncmVzc01vbml0b3IpCiAJICogCWZvciBkZXRhaWxlZCBjb21tZW50CiAJICovCiAJcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKAotCQlmaW5hbCBjaGFyW10gcGFja2FnZU5hbWUsIAotCQlmaW5hbCBpbnQgcGFja2FnZU1hdGNoUnVsZSwgCisJCWZpbmFsIGNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJZmluYWwgaW50IHBhY2thZ2VNYXRjaFJ1bGUsCiAJCWZpbmFsIGNoYXJbXSB0eXBlTmFtZSwKLQkJZmluYWwgaW50IHR5cGVNYXRjaFJ1bGUsIAotCQlpbnQgc2VhcmNoRm9yLCAKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisJCWZpbmFsIGludCB0eXBlTWF0Y2hSdWxlLAorCQlpbnQgc2VhcmNoRm9yLAorCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCQlmaW5hbCBJUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKIAkJaW50IHdhaXRpbmdQb2xpY3ksCiAJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwkJLy8gVmFsaWRhdGUgbWF0Y2ggcnVsZSBmaXJzdAorCQlmaW5hbCBpbnQgdmFsaWRhdGVkVHlwZU1hdGNoUnVsZSA9IFNlYXJjaFBhdHRlcm4udmFsaWRhdGVNYXRjaFJ1bGUodHlwZU5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nICh0eXBlTmFtZSksIHR5cGVNYXRjaFJ1bGUpOworCisJCS8vIERlYnVnCiAJCWlmIChWRVJCT1NFKSB7CiAJCQlVdGlsLnZlcmJvc2UoIkJhc2ljU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcyhjaGFyW10sIGNoYXJbXSwgaW50LCBpbnQsIElKYXZhU2VhcmNoU2NvcGUsIElSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3RvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCiAJCQlVdGlsLnZlcmJvc2UoIgktIHBhY2thZ2UgbmFtZTogIisocGFja2FnZU5hbWU9PW51bGw/Im51bGwiOm5ldyBTdHJpbmcocGFja2FnZU5hbWUpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJVXRpbC52ZXJib3NlKCIJLSBtYXRjaCBydWxlOiAiK2dldE1hdGNoUnVsZVN0cmluZyhwYWNrYWdlTWF0Y2hSdWxlKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVV0aWwudmVyYm9zZSgiCS0gcGFja2FnZSBtYXRjaCBydWxlOiAiK2dldE1hdGNoUnVsZVN0cmluZyhwYWNrYWdlTWF0Y2hSdWxlKSk7IC8vJE5PTi1OTFMtMSQKIAkJCVV0aWwudmVyYm9zZSgiCS0gdHlwZSBuYW1lOiAiKyh0eXBlTmFtZT09bnVsbD8ibnVsbCI6bmV3IFN0cmluZyh0eXBlTmFtZSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlVdGlsLnZlcmJvc2UoIgktIG1hdGNoIHJ1bGU6ICIrZ2V0TWF0Y2hSdWxlU3RyaW5nKHR5cGVNYXRjaFJ1bGUpKTsgLy8kTk9OLU5MUy0xJAorCQkJVXRpbC52ZXJib3NlKCIJLSB0eXBlIG1hdGNoIHJ1bGU6ICIrZ2V0TWF0Y2hSdWxlU3RyaW5nKHR5cGVNYXRjaFJ1bGUpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUgIT0gdHlwZU1hdGNoUnVsZSkgeworCQkJCVV0aWwudmVyYm9zZSgiCS0gdmFsaWRhdGVkIHR5cGUgbWF0Y2ggcnVsZTogIitnZXRNYXRjaFJ1bGVTdHJpbmcodmFsaWRhdGVkVHlwZU1hdGNoUnVsZSkpOyAvLyROT04tTkxTLTEkCisJCQl9CiAJCQlVdGlsLnZlcmJvc2UoIgktIHNlYXJjaCBmb3I6ICIrc2VhcmNoRm9yKTsgLy8kTk9OLU5MUy0xJAogCQkJVXRpbC52ZXJib3NlKCIJLSBzY29wZTogIitzY29wZSk7IC8vJE5PTi1OTFMtMSQKIAkJfQorCQlpZiAodmFsaWRhdGVkVHlwZU1hdGNoUnVsZSA9PSAtMSkgcmV0dXJuOyAvLyBpbnZhbGlkIG1hdGNoIHJ1bGUgPT4gcmV0dXJuIG5vIHJlc3VsdHMKIAogCQkvLyBDcmVhdGUgcGF0dGVybgotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOwogCQlmaW5hbCBjaGFyIHR5cGVTdWZmaXg7CiAJCXN3aXRjaChzZWFyY2hGb3IpewogCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyA6CkBAIC02ODIsNyArMTAzOSw3IEBACiAJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFOTk9UQVRJT05fVFlQRSA6CiAJCQkJdHlwZVN1ZmZpeCA9IElJbmRleENvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEVfU1VGRklYOwogCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6IAorCQkJZGVmYXVsdCA6CiAJCQkJdHlwZVN1ZmZpeCA9IElJbmRleENvbnN0YW50cy5UWVBFX1NVRkZJWDsKIAkJCQlicmVhazsKIAkJfQpAQCAtNjkyLDEzICsxMDQ5LDEzIEBACiAJCQkJbnVsbCwKIAkJCQl0eXBlTmFtZSwKIAkJCQl0eXBlU3VmZml4LAotCQkJCXR5cGVNYXRjaFJ1bGUpCisJCQkJdmFsaWRhdGVkVHlwZU1hdGNoUnVsZSkKIAkJCTogbmV3IFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4oCiAJCQkJcGFja2FnZU5hbWUsCiAJCQkJcGFja2FnZU1hdGNoUnVsZSwKIAkJCQl0eXBlTmFtZSwKIAkJCQl0eXBlU3VmZml4LAotCQkJCXR5cGVNYXRjaFJ1bGUpOworCQkJCXZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUpOwogCiAJCS8vIEdldCB3b3JraW5nIGNvcHkgcGF0aChzKS4gU3RvcmUgaW4gYSBzaW5nbGUgc3RyaW5nIGluIGNhc2Ugb2Ygb25seSBvbmUgdG8gb3B0aW1pemUgY29tcGFyaXNvbiBpbiByZXF1ZXN0b3IKIAkJZmluYWwgSGFzaFNldCB3b3JraW5nQ29weVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKQEAgLTczMCw3ICsxMDg3LDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIDE6CiAJCQkJCQlpZiAoc2luZ2xlV2tjcFBhdGguZXF1YWxzKGRvY3VtZW50UGF0aCkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gZmxpdGVyIG91dCAqdGhlKiB3b3JraW5nIGNvcHkKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gZmlsdGVyIG91dCAqdGhlKiB3b3JraW5nIGNvcHkKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQlkZWZhdWx0OgpAQCAtNzY5LDI2ICsxMTI2LDMwIEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCX07Ci0JCisKIAkJdHJ5IHsKIAkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZywgMTAwKTsgCisJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDAwKTsKIAkJCX0KIAkJCS8vIGFkZCB0eXBlIG5hbWVzIGZyb20gaW5kZXhlcwogCQkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKAogCQkJCW5ldyBQYXR0ZXJuU2VhcmNoSm9iKAotCQkJCQlwYXR0ZXJuLCAKKwkJCQkJcGF0dGVybiwKIAkJCQkJZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCksIC8vIEphdmEgc2VhcmNoIG9ubHkKLQkJCQkJc2NvcGUsIAorCQkJCQlzY29wZSwKIAkJCQkJc2VhcmNoUmVxdWVzdG9yKSwKIAkJCQl3YWl0aW5nUG9saWN5LAotCQkJCXByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxMDApKTsJCi0JCQkJCisJCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEwMDAtY29waWVzTGVuZ3RoKSk7CisKIAkJCS8vIGFkZCB0eXBlIG5hbWVzIGZyb20gd29ya2luZyBjb3BpZXMKIAkJCWlmIChjb3BpZXMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29waWVzTGVuZ3RoOyBpKyspIHsKIAkJCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IGNvcGllc1tpXTsKLQkJCQkJaWYgKCFzY29wZS5lbmNsb3Nlcyh3b3JraW5nQ29weSkpIGNvbnRpbnVlOworCQkJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBIaWVyYXJjaHlTY29wZSkgeworCQkJCQkJaWYgKCEoKEhpZXJhcmNoeVNjb3BlKXNjb3BlKS5lbmNsb3Nlcyh3b3JraW5nQ29weSwgcHJvZ3Jlc3NNb25pdG9yKSkgY29udGludWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoIXNjb3BlLmVuY2xvc2VzKHdvcmtpbmdDb3B5KSkgY29udGludWU7CisJCQkJCX0KIAkJCQkJZmluYWwgU3RyaW5nIHBhdGggPSB3b3JraW5nQ29weS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKIAkJCQkJaWYgKHdvcmtpbmdDb3B5LmlzQ29uc2lzdGVudCgpKSB7CiAJCQkJCQlJUGFja2FnZURlY2xhcmF0aW9uW10gcGFja2FnZURlY2xhcmF0aW9ucyA9IHdvcmtpbmdDb3B5LmdldFBhY2thZ2VEZWNsYXJhdGlvbnMoKTsKQEAgLTgxNSw3ICsxMTc2LDcgQEAKIAkJCQkJCQl9IGVsc2UgLyppZiAodHlwZS5pc0ludGVyZmFjZSgpKSovIHsKIAkJCQkJCQkJa2luZCA9IFR5cGVEZWNsYXJhdGlvbi5JTlRFUkZBQ0VfREVDTDsKIAkJCQkJCQl9Ci0JCQkJCQkJaWYgKG1hdGNoKHR5cGVTdWZmaXgsIHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgdHlwZU1hdGNoUnVsZSwga2luZCwgcGFja2FnZURlY2xhcmF0aW9uLCBzaW1wbGVOYW1lKSkgeworCQkJCQkJCWlmIChtYXRjaCh0eXBlU3VmZml4LCBwYWNrYWdlTmFtZSwgcGFja2FnZU1hdGNoUnVsZSwgdHlwZU5hbWUsIHZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUsIGtpbmQsIHBhY2thZ2VEZWNsYXJhdGlvbiwgc2ltcGxlTmFtZSkpIHsKIAkJCQkJCQkJaWYgKG5hbWVSZXF1ZXN0b3IgaW5zdGFuY2VvZiBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlcikgewogCQkJCQkJCQkJKChUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlciluYW1lUmVxdWVzdG9yKS5yZXF1ZXN0b3IuYWNjZXB0VHlwZU5hbWVNYXRjaChuZXcgSmF2YVNlYXJjaFR5cGVOYW1lTWF0Y2godHlwZSwgdHlwZS5nZXRGbGFncygpKSk7CiAJCQkJCQkJCX0gZWxzZSB7CkBAIC04MzUsNyArMTE5Niw3IEBACiAJCQkJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIG5vIGxvY2FsL2Fub255bW91cyB0eXBlCiAJCQkJCQkJCX0KIAkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgY29tcGlsYXRpb25Vbml0U2NvcGUpIHsKLQkJCQkJCQkJCWlmIChtYXRjaCh0eXBlU3VmZml4LCBwYWNrYWdlTmFtZSwgdHlwZU5hbWUsIHR5cGVNYXRjaFJ1bGUsIFR5cGVEZWNsYXJhdGlvbi5raW5kKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpLCBwYWNrYWdlRGVjbGFyYXRpb24sIHR5cGVEZWNsYXJhdGlvbi5uYW1lKSkgeworCQkJCQkJCQkJaWYgKG1hdGNoKHR5cGVTdWZmaXgsIHBhY2thZ2VOYW1lLCBwYWNrYWdlTWF0Y2hSdWxlLCB0eXBlTmFtZSwgdmFsaWRhdGVkVHlwZU1hdGNoUnVsZSwgVHlwZURlY2xhcmF0aW9uLmtpbmQodHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyksIHBhY2thZ2VEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLm5hbWUpKSB7CiAJCQkJCQkJCQkJaWYgKG5hbWVSZXF1ZXN0b3IgaW5zdGFuY2VvZiBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlcikgewogCQkJCQkJCQkJCQlJVHlwZSB0eXBlID0gd29ya2luZ0NvcHkuZ2V0VHlwZShuZXcgU3RyaW5nKHR5cGVOYW1lKSk7CiAJCQkJCQkJCQkJCSgoVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIpbmFtZVJlcXVlc3RvcikucmVxdWVzdG9yLmFjY2VwdFR5cGVOYW1lTWF0Y2gobmV3IEphdmFTZWFyY2hUeXBlTmFtZU1hdGNoKHR5cGUsIHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpKTsKQEAgLTg0Niw4ICsxMjA3LDggQEAKIAkJCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJCQl9CiAJCQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgY2xhc3NTY29wZSkgewotCQkJCQkJCQkJaWYgKG1hdGNoKHR5cGVTdWZmaXgsIHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgdHlwZU1hdGNoUnVsZSwgVHlwZURlY2xhcmF0aW9uLmtpbmQobWVtYmVyVHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyksIHBhY2thZ2VEZWNsYXJhdGlvbiwgbWVtYmVyVHlwZURlY2xhcmF0aW9uLm5hbWUpKSB7Ci0JCQkJCQkJCQkJLy8gY29tcHV0ZSBlbmNsb2lzaW5nIHR5cGUgbmFtZXMKKwkJCQkJCQkJCWlmIChtYXRjaCh0eXBlU3VmZml4LCBwYWNrYWdlTmFtZSwgcGFja2FnZU1hdGNoUnVsZSwgdHlwZU5hbWUsIHZhbGlkYXRlZFR5cGVNYXRjaFJ1bGUsIFR5cGVEZWNsYXJhdGlvbi5raW5kKG1lbWJlclR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMpLCBwYWNrYWdlRGVjbGFyYXRpb24sIG1lbWJlclR5cGVEZWNsYXJhdGlvbi5uYW1lKSkgeworCQkJCQkJCQkJCS8vIGNvbXB1dGUgZW5jbG9zaW5nIHR5cGUgbmFtZXMKIAkJCQkJCQkJCQlUeXBlRGVjbGFyYXRpb24gZW5jbG9zaW5nID0gbWVtYmVyVHlwZURlY2xhcmF0aW9uLmVuY2xvc2luZ1R5cGU7CiAJCQkJCQkJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJCQkJCQkJCQkJd2hpbGUgKGVuY2xvc2luZyAhPSBudWxsKSB7CkBAIC04NzUsOCArMTIzNiwxMiBAQAogCQkJCQkJCXBhcnNlZFVuaXQudHJhdmVyc2UobmV3IEFsbFR5cGVEZWNsYXJhdGlvbnNWaXNpdG9yKCksIHBhcnNlZFVuaXQuc2NvcGUpOwogCQkJCQkJfQogCQkJCQl9CisJCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQkJaWYgKHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJfQogCQkJCX0KLQkJCX0JCisJCQl9CiAJCX0gZmluYWxseSB7CiAJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKIAkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOwpAQCAtODg3LDMwICsxMjUyLDMyIEBACiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCB0b3AtbGV2ZWwgdHlwZXMgYW5kIG1lbWJlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gc2NvcGUgdXNpbmcgIGEgY2FzZSBzZW5zaXRpdmUgZXhhY3QgbWF0Y2gKIAkgKiB3aXRoIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZXMgYW5kIHR5cGUgbmFtZXMuCi0JICogCisJICoKIAkgKiBAc2VlIFNlYXJjaEVuZ2luZSNzZWFyY2hBbGxUeXBlTmFtZXMoY2hhcltdW10sIGNoYXJbXVtdLCBJSmF2YVNlYXJjaFNjb3BlLCBUeXBlTmFtZVJlcXVlc3RvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQogCSAqIAlmb3IgZGV0YWlsZWQgY29tbWVudAogCSAqLwogCXB1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKLQkJZmluYWwgY2hhcltdW10gcXVhbGlmaWNhdGlvbnMsIAorCQlmaW5hbCBjaGFyW11bXSBxdWFsaWZpY2F0aW9ucywKIAkJZmluYWwgY2hhcltdW10gdHlwZU5hbWVzLAotCQlmaW5hbCBpbnQgbWF0Y2hSdWxlLCAKLQkJaW50IHNlYXJjaEZvciwgCi0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIAorCQlmaW5hbCBpbnQgbWF0Y2hSdWxlLAorCQlpbnQgc2VhcmNoRm9yLAorCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCQlmaW5hbCBJUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKIAkJaW50IHdhaXRpbmdQb2xpY3ksCiAJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwkJLy8gRGVidWcKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVV0aWwudmVyYm9zZSgiQmFzaWNTZWFyY2hFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzKGNoYXJbXVtdLCBjaGFyW11bXSwgaW50LCBpbnQsIElKYXZhU2VhcmNoU2NvcGUsIElSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3RvciwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCiAJCQlVdGlsLnZlcmJvc2UoIgktIHBhY2thZ2UgbmFtZTogIisocXVhbGlmaWNhdGlvbnM9PW51bGw/Im51bGwiOm5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHF1YWxpZmljYXRpb25zLCAnLCcpKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCVV0aWwudmVyYm9zZSgiCS0gdHlwZSBuYW1lOiAiKyh0eXBlTmFtZXM9PW51bGw/Im51bGwiOm5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVOYW1lcywgJywnKSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlVdGlsLnZlcmJvc2UoIgktIG1hdGNoIHJ1bGU6ICIrbWF0Y2hSdWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJVXRpbC52ZXJib3NlKCIJLSBtYXRjaCBydWxlOiAiK2dldE1hdGNoUnVsZVN0cmluZyhtYXRjaFJ1bGUpKTsgLy8kTk9OLU5MUy0xJAogCQkJVXRpbC52ZXJib3NlKCIJLSBzZWFyY2ggZm9yOiAiK3NlYXJjaEZvcik7IC8vJE5PTi1OTFMtMSQKIAkJCVV0aWwudmVyYm9zZSgiCS0gc2NvcGU6ICIrc2NvcGUpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOworCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKIAorCQkvLyBDcmVhdGUgcGF0dGVybgogCQlmaW5hbCBjaGFyIHR5cGVTdWZmaXg7CiAJCXN3aXRjaChzZWFyY2hGb3IpewogCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyA6CkBAIC05MzQsNyArMTMwMSw3IEBACiAJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFOTk9UQVRJT05fVFlQRSA6CiAJCQkJdHlwZVN1ZmZpeCA9IElJbmRleENvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEVfU1VGRklYOwogCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6IAorCQkJZGVmYXVsdCA6CiAJCQkJdHlwZVN1ZmZpeCA9IElJbmRleENvbnN0YW50cy5UWVBFX1NVRkZJWDsKIAkJCQlicmVhazsKIAkJfQpAQCAtOTcwLDcgKzEzMzcsNyBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgMToKIAkJCQkJCWlmIChzaW5nbGVXa2NwUGF0aC5lcXVhbHMoZG9jdW1lbnRQYXRoKSkgewotCQkJCQkJCXJldHVybiB0cnVlOyAvLyBmbGl0ZXIgb3V0ICp0aGUqIHdvcmtpbmcgY29weQorCQkJCQkJCXJldHVybiB0cnVlOyAvLyBmaWx0ZXIgb3V0ICp0aGUqIHdvcmtpbmcgY29weQogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CkBAIC0xMDA3LDIxICsxMzc0LDIxIEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCX07Ci0JCisKIAkJdHJ5IHsKIAkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZywgMTAwKTsgCisJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDApOwogCQkJfQogCQkJLy8gYWRkIHR5cGUgbmFtZXMgZnJvbSBpbmRleGVzCiAJCQlpbmRleE1hbmFnZXIucGVyZm9ybUNvbmN1cnJlbnRKb2IoCiAJCQkJbmV3IFBhdHRlcm5TZWFyY2hKb2IoCi0JCQkJCXBhdHRlcm4sIAorCQkJCQlwYXR0ZXJuLAogCQkJCQlnZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKSwgLy8gSmF2YSBzZWFyY2ggb25seQotCQkJCQlzY29wZSwgCisJCQkJCXNjb3BlLAogCQkJCQlzZWFyY2hSZXF1ZXN0b3IpLAogCQkJCXdhaXRpbmdQb2xpY3ksCi0JCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEwMCkpOwkKLQkJCQkKKwkJCQlwcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMTAwKSk7CisKIAkJCS8vIGFkZCB0eXBlIG5hbWVzIGZyb20gd29ya2luZyBjb3BpZXMKIAkJCWlmIChjb3BpZXMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjb3BpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTEwODAsNyArMTQ0Nyw3IEBACiAJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCQkJfQogCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKLQkJCQkJCQkJCS8vIGNvbXB1dGUgZW5jbG9pc2luZyB0eXBlIG5hbWVzCisJCQkJCQkJCQkvLyBjb21wdXRlIGVuY2xvc2luZyB0eXBlIG5hbWVzCiAJCQkJCQkJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHBhY2thZ2VEZWNsYXJhdGlvbjsKIAkJCQkJCQkJCVR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmcgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb24uZW5jbG9zaW5nVHlwZTsKIAkJCQkJCQkJCWNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwpAQCAtMTEwNSwyMCArMTQ3MiwyMCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJfQkKKwkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewogCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnMoSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVV0aWwudmVyYm9zZSgiCS0gamF2YSBlbGVtZW50OiAiK2VuY2xvc2luZ0VsZW1lbnQpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IGNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge2VuY2xvc2luZ0VsZW1lbnR9KTsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZW5jbG9zaW5nRWxlbWVudC5nZXRSZXNvdXJjZSgpOworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEphdmFFbGVtZW50KSBlbmNsb3NpbmdFbGVtZW50KS5yZXNvdXJjZSgpOwogCQlpZiAoZW5jbG9zaW5nRWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKIAkJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpIGVuY2xvc2luZ0VsZW1lbnQ7CiAJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpOwpAQCAtMTE0NCwyMCArMTUxMSwyMCBAQAogCQkJCQkJZ2V0V29ya2luZ0NvcGllcyhlbmNsb3NpbmdFbGVtZW50KSwKIAkJCQkJCXBhcnRpY2lwYW50KTsKIAkJCQkJcGFydGljaXBhbnQubG9jYXRlTWF0Y2hlcygKLQkJCQkJCWRvY3VtZW50cywgCi0JCQkJCQlwYXR0ZXJuLCAKLQkJCQkJCXNjb3BlLCAKLQkJCQkJCXJlcXVlc3RvciwgCisJCQkJCQlkb2N1bWVudHMsCisJCQkJCQlwYXR0ZXJuLAorCQkJCQkJc2NvcGUsCisJCQkJCQlyZXF1ZXN0b3IsCiAJCQkJCQltb25pdG9yKTsKIAkJCQl9IGZpbmFsbHkgewogCQkJCQlyZXF1ZXN0b3IuZW5kUmVwb3J0aW5nKCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzZWFyY2goCi0JCQkJCXBhdHRlcm4sIAotCQkJCQluZXcgU2VhcmNoUGFydGljaXBhbnRbXSB7Z2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCl9LCAKLQkJCQkJc2NvcGUsIAotCQkJCQlyZXF1ZXN0b3IsIAorCQkJCQlwYXR0ZXJuLAorCQkJCQluZXcgU2VhcmNoUGFydGljaXBhbnRbXSB7Z2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCl9LAorCQkJCQlzY29wZSwKKwkJCQkJcmVxdWVzdG9yLAogCQkJCQltb25pdG9yKTsKIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CkBAIC0xMTY5LDQ4ICsxNTM2LDgxIEBACiAKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZmllbGRzIGFjY2Vzc2VkIGluIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQsIGEgc291cmNlIHR5cGUsIG9yIGEgc291cmNlIG1ldGhvZC4KKwkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0IG9yIGEgc291cmNlIHR5cGUvbWV0aG9kL2ZpZWxkLgogCSAqIFJlcG9ydHMgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgogCSAqCiAJICogQHNlZSBTZWFyY2hFbmdpbmUjc2VhcmNoRGVjbGFyYXRpb25zT2ZBY2Nlc3NlZEZpZWxkcyhJSmF2YUVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcikKIAkgKiAJZm9yIGRldGFpbGVkIGNvbW1lbnQKLQkgKi8JCisJICovCiAJcHVibGljIHZvaWQgc2VhcmNoRGVjbGFyYXRpb25zT2ZBY2Nlc3NlZEZpZWxkcyhJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVV0aWwudmVyYm9zZSgiQmFzaWNTZWFyY2hFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zT2ZBY2Nlc3NlZEZpZWxkcyhJSmF2YUVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciwgU2VhcmNoUGF0dGVybiwgSVByb2dyZXNzTW9uaXRvcikiKTsgLy8kTk9OLU5MUy0xJAogCQl9CisJCS8vIERvIG5vdCBhY2NlcHQgb3RoZXIga2luZCBvZiBlbGVtZW50IHR5cGUgdGhhbiB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIHNwZWMKKwkJc3dpdGNoIChlbmNsb3NpbmdFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCQkJLy8gdmFsaWQgZWxlbWVudCB0eXBlCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQogCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybihlbmNsb3NpbmdFbGVtZW50KTsKIAkJc2VhcmNoRGVjbGFyYXRpb25zKGVuY2xvc2luZ0VsZW1lbnQsIHJlcXVlc3RvciwgcGF0dGVybiwgbW9uaXRvcik7CiAJfQotCQorCiAJLyoqCiAJICogU2VhcmNoZXMgZm9yIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIHR5cGVzIHJlZmVyZW5jZWQgaW4gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlIGVsZW1lbnQgY2FuIGJlIGEgY29tcGlsYXRpb24gdW5pdCwgYSBzb3VyY2UgdHlwZSwgb3IgYSBzb3VyY2UgbWV0aG9kLgorCSAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBzb3VyY2UgdHlwZS9tZXRob2QvZmllbGQuCiAJICogUmVwb3J0cyB0aGUgdHlwZSBkZWNsYXJhdGlvbnMgdXNpbmcgdGhlIGdpdmVuIHJlcXVlc3Rvci4KLQkgKiAKKwkgKgogCSAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKElKYXZhRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKQogCSAqIAlmb3IgZGV0YWlsZWQgY29tbWVudAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyhJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVV0aWwudmVyYm9zZSgiQmFzaWNTZWFyY2hFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoSUphdmFFbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IsIFNlYXJjaFBhdHRlcm4sIElQcm9ncmVzc01vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKIAkJfQorCQkvLyBEbyBub3QgYWNjZXB0IG90aGVyIGtpbmQgb2YgZWxlbWVudCB0eXBlIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBzcGVjCisJCXN3aXRjaCAoZW5jbG9zaW5nRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKKwkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKKwkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6CisJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgorCQkJCS8vIHZhbGlkIGVsZW1lbnQgdHlwZQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuKGVuY2xvc2luZ0VsZW1lbnQpOwogCQlzZWFyY2hEZWNsYXJhdGlvbnMoZW5jbG9zaW5nRWxlbWVudCwgcmVxdWVzdG9yLCBwYXR0ZXJuLCBtb25pdG9yKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgbWV0aG9kcyBpbnZva2VkIGluIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQsIGEgc291cmNlIHR5cGUsIG9yIGEgc291cmNlIG1ldGhvZC4KKwkgKiBUaGUgZWxlbWVudCBjYW4gYmUgYSBjb21waWxhdGlvbiB1bml0IG9yIGEgc291cmNlIHR5cGUvbWV0aG9kL2ZpZWxkLgogCSAqIFJlcG9ydHMgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMgdXNpbmcgdGhlIGdpdmVuIHJlcXVlc3Rvci4KLQkgKiAKKwkgKgogCSAqIEBzZWUgU2VhcmNoRW5naW5lI3NlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKElKYXZhRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yKQogCSAqIAlmb3IgZGV0YWlsZWQgY29tbWVudAotCSAqLwkKKwkgKi8KIAlwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcyhJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVV0aWwudmVyYm9zZSgiQmFzaWNTZWFyY2hFbmdpbmUuc2VhcmNoRGVjbGFyYXRpb25zT2ZTZW50TWVzc2FnZXMoSUphdmFFbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IsIFNlYXJjaFBhdHRlcm4sIElQcm9ncmVzc01vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKIAkJfQorCQkvLyBEbyBub3QgYWNjZXB0IG90aGVyIGtpbmQgb2YgZWxlbWVudCB0eXBlIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBzcGVjCisJCXN3aXRjaCAoZW5jbG9zaW5nRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKKwkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKKwkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6CisJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgorCQkJCS8vIHZhbGlkIGVsZW1lbnQgdHlwZQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4oZW5jbG9zaW5nRWxlbWVudCk7CiAJCXNlYXJjaERlY2xhcmF0aW9ucyhlbmNsb3NpbmdFbGVtZW50LCByZXF1ZXN0b3IsIHBhdHRlcm4sIG1vbml0b3IpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YQppbmRleCBjNjVhNDAzLi42MjI0YzViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0hpZXJhcmNoeVNjb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9IaWVyYXJjaHlTY29wZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb25zIGZvciBidWcgMjE1MTM5IGFuZCBidWcgMjk1ODk0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCkBAIC0xNywxMiArMTgsMTAgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU3VmZml4Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5LlR5cGVIaWVyYXJjaHk7CiAKIC8qKgpAQCAtMzMsMTcgKzMyLDIxIEBACiAJcHVibGljIElUeXBlIGZvY3VzVHlwZTsKIAlwcml2YXRlIFN0cmluZyBmb2N1c1BhdGg7CiAJcHJpdmF0ZSBXb3JraW5nQ29weU93bmVyIG93bmVyOwotCQorCiAJcHJpdmF0ZSBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHk7Ci0JcHJpdmF0ZSBJVHlwZVtdIHR5cGVzOwogCXByaXZhdGUgSGFzaFNldCByZXNvdXJjZVBhdGhzOwogCXByaXZhdGUgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnM7CiAKIAlwcm90ZWN0ZWQgSVJlc291cmNlW10gZWxlbWVudHM7CiAJcHJvdGVjdGVkIGludCBlbGVtZW50Q291bnQ7Ci0JCisKIAlwdWJsaWMgYm9vbGVhbiBuZWVkc1JlZnJlc2g7CiAKKwlwcml2YXRlIEhhc2hTZXQgc3ViVHlwZXMgPSBudWxsOyAvLyBudWxsIG1lYW5zOiBkb24ndCBmaWx0ZXIgZm9yIHN1YlR5cGVzCisJcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOyAvLyBudWxsIG1lYW5zOiBkb24ndCBjb25zdHJhaW4gdGhlIHNlYXJjaCB0byBhIHByb2plY3QKKwlwcml2YXRlIGJvb2xlYW4gYWxsb3dNZW1iZXJBbmRFbmNsb3NpbmdUeXBlcyA9IHRydWU7CisJcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVGb2N1c1R5cGUgPSB0cnVlOworCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEFkZHMgdGhlIGdpdmVuIHJlc291cmNlIHRvIHRoaXMgc2VhcmNoIHNjb3BlLgogCSAqLwpAQCAtNTYsMjMgKzU5LDQ2IEBACiAJCQkJMCwKIAkJCQl0aGlzLmVsZW1lbnRDb3VudCk7CiAJCX0KLQkJZWxlbWVudHNbZWxlbWVudENvdW50KytdID0gZWxlbWVudDsKKwkJdGhpcy5lbGVtZW50c1t0aGlzLmVsZW1lbnRDb3VudCsrXSA9IGVsZW1lbnQ7CiAJfQotCQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBoaWVyYXJjaHkgc2NvcGUgZm9yIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwkgKiBAcGFyYW0gcHJvamVjdCAgICAgIGNvbnN0cmFpbiB0aGUgc2VhcmNoIHJlc3VsdCB0byB0aGlzIHByb2plY3QsIAorCSAqICAgICAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc2VhcmNoIHNob3VsZCBjb25zaWRlciBhbGwgdHlwZXMgaW4gdGhlIHdvcmtzcGFjZSAKKwkgKiBAcGFyYW0gdHlwZSAgICAgICAgIHRoZSBmb2N1cyB0eXBlIG9mIHRoZSBoaWVyYXJjaHkKKwkgKiBAcGFyYW0gb3duZXIgCSAgIHRoZSBvd25lciBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzLCAKKwkgKiAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcmltYXJ5IHdvcmtpbmcgY29weSBvd25lciBzaG91bGQgYmUgdXNlZAorCSAqIEBwYXJhbSBvbmx5U3VidHlwZXMgaWYgdHJ1ZSBzZWFyY2ggb25seSBzdWJ0eXBlcyBvZiAndHlwZScKKwkgKiBAcGFyYW0gbm9NZW1iZXJzT3JFbmNsb3NpbmdUeXBlcyBpZiB0cnVlIHRoZSBoaWVyYXJjaHkgaXMgc3RyaWN0LCAKKwkgKiAJCQkJCSAgIGkuZS4sIG5vIGFkZGl0aW9uYWwgbWVtYmVyIHR5cGVzIG9yIGVuY2xvc2luZyB0eXBlcyBvZiB0eXBlcyBzcGFubmluZyB0aGUgaGllcmFyY2h5IGFyZSBpbmNsdWRlZCwKKwkgKiAJCQkJCSAgIG90aGVyd2lzZSBhbGwgbWVtYmVyIGFuZCBlbmNsb3NpbmcgdHlwZXMgb2YgdHlwZXMgaW4gdGhlIGhpZXJhcmNoeSBhcmUgaW5jbHVkZWQuCisJICogQHBhcmFtIGluY2x1ZGVGb2N1c1R5cGUgaWYgdHJ1ZSB0aGUgZm9jdXMgdHlwZSA8Y29kZT50eXBlPC9jb2RlPiBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNjb3BlLCBvdGhlcndpc2UgaXQgaXMgZXhjbHVkZWQKKwkgKi8KKwlwdWJsaWMgSGllcmFyY2h5U2NvcGUoSUphdmFQcm9qZWN0IHByb2plY3QsIElUeXBlIHR5cGUsIFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIGJvb2xlYW4gb25seVN1YnR5cGVzLCBib29sZWFuIG5vTWVtYmVyc09yRW5jbG9zaW5nVHlwZXMsIGJvb2xlYW4gaW5jbHVkZUZvY3VzVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRoaXModHlwZSwgb3duZXIpOworCQl0aGlzLmphdmFQcm9qZWN0ID0gcHJvamVjdDsKKwkJaWYgKG9ubHlTdWJ0eXBlcykgeworCQkJdGhpcy5zdWJUeXBlcyA9IG5ldyBIYXNoU2V0KCk7CisJCX0KKwkJdGhpcy5pbmNsdWRlRm9jdXNUeXBlID0gaW5jbHVkZUZvY3VzVHlwZTsKKwkJdGhpcy5hbGxvd01lbWJlckFuZEVuY2xvc2luZ1R5cGVzID0gIW5vTWVtYmVyc09yRW5jbG9zaW5nVHlwZXM7CisJfQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIENyZWF0ZXMgYSBuZXcgaGllYXJjaHkgc2NvcGUgZm9yIHRoZSBnaXZlbiB0eXBlLgogCSAqLwogCXB1YmxpYyBIaWVyYXJjaHlTY29wZShJVHlwZSB0eXBlLCBXb3JraW5nQ29weU93bmVyIG93bmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5mb2N1c1R5cGUgPSB0eXBlOwogCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQotCQl0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycyA9IHRoaXMuY29tcHV0ZVByb2plY3RzQW5kSmFycyh0eXBlKTsKKworCQl0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycyA9IGNvbXB1dGVQcm9qZWN0c0FuZEphcnModHlwZSk7CiAKIAkJLy8gcmVzb3VyY2UgcGF0aAogCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7CiAJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CiAJCQlJUGF0aCBqYXJQYXRoID0gcm9vdC5nZXRQYXRoKCk7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBqYXJQYXRoLCB0cnVlKTsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGphclBhdGgsIHRydWUpOwogCQkJU3RyaW5nIHppcEZpbGVOYW1lOwogCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7CiAJCQkJLy8gaW50ZXJuYWwgamFyCkBAIC05MSwyMCArMTE3LDMzIEBACiAJCX0gZWxzZSB7CiAJCQl0aGlzLmZvY3VzUGF0aCA9IHR5cGUuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CiAJCX0KLQkJCisKIAkJdGhpcy5uZWVkc1JlZnJlc2ggPSB0cnVlOwotCQkJCisKIAkJLy9kaXNhYmxlZCBmb3Igbm93IGFzIHRoaXMgY291bGQgYmUgZXhwZW5zaXZlCiAJCS8vSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtZW1iZXJTY29wZSh0aGlzKTsKIAl9CiAJcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzb3VyY2VWZWN0b3IoKSB7CiAJCUhhc2hNYXAgcmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKIAkJSGFzaE1hcCBwYXRocyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMudHlwZXMgPSB0aGlzLmhpZXJhcmNoeS5nZXRBbGxUeXBlcygpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVHlwZSB0eXBlID0gdGhpcy50eXBlc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0UmVzb3VyY2UoKTsKKwkJSVR5cGVbXSB0eXBlcyA9IG51bGw7CisJCWlmICh0aGlzLnN1YlR5cGVzICE9IG51bGwpIHsKKwkJCXR5cGVzID0gdGhpcy5oaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXModGhpcy5mb2N1c1R5cGUpOworCQkJaWYgKHRoaXMuaW5jbHVkZUZvY3VzVHlwZSkgeworCQkJCWludCBsZW4gPSB0eXBlcy5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlcywgMCwgdHlwZXM9bmV3IElUeXBlW2xlbisxXSwgMCwgbGVuKTsKKwkJCQl0eXBlc1tsZW5dID0gdGhpcy5mb2N1c1R5cGU7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0eXBlcyA9IHRoaXMuaGllcmFyY2h5LmdldEFsbFR5cGVzKCk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQkJSVR5cGUgdHlwZSA9IHR5cGVzW2ldOworCQkJaWYgKHRoaXMuc3ViVHlwZXMgIT0gbnVsbCkgeworCQkJCS8vIHJlbWVtYmVyIHN1YnR5cGVzIGZvciBsYXRlciB1c2UgaW4gZW5jbG9zZXMoKQorCQkJCXRoaXMuc3ViVHlwZXMuYWRkKHR5cGUpOworCQkJfQorCQkJSVJlc291cmNlIHJlc291cmNlID0gKChKYXZhRWxlbWVudCl0eXBlKS5yZXNvdXJjZSgpOwogCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2VzLmdldChyZXNvdXJjZSkgPT0gbnVsbCkgewogCQkJCXJlc291cmNlcy5wdXQocmVzb3VyY2UsIHJlc291cmNlKTsKIAkJCQlhZGQocmVzb3VyY2UpOwpAQCAtMTE1LDcgKzE1NCw3IEBACiAJCQkJLy8gdHlwZSBpbiBhIGphcgogCQkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHJvb3Q7CiAJCQkJSVBhdGggamFyUGF0aCA9IGphci5nZXRQYXRoKCk7Ci0JCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgamFyUGF0aCwgdHJ1ZSk7CisJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoamFyUGF0aCwgdHJ1ZSk7CiAJCQkJU3RyaW5nIHppcEZpbGVOYW1lOwogCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSkgewogCQkJCQkvLyBpbnRlcm5hbCBqYXIKQEAgLTEzMSw3ICsxNzAsNyBAQAogCQkJCQkJKyBKQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IKIAkJCQkJCSsgdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKQogCQkJCQkJKyBTVUZGSVhfU1RSSU5HX2NsYXNzOwotCQkJCQorCiAJCQkJdGhpcy5yZXNvdXJjZVBhdGhzLmFkZChyZXNvdXJjZVBhdGgpOwogCQkJCXBhdGhzLnB1dChqYXJQYXRoLCB0eXBlKTsKIAkJCX0gZWxzZSB7CkBAIC0xNzQsNyArMjEzLDcgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQkvLyBhZGQgdGhlIGRlcGVuZGVudCBwcm9qZWN0cwotCQkJCQl0aGlzLmNvbXB1dGVEZXBlbmRlbnRzKHByb2plY3QsIHNldCwgdmlzaXRlZCk7CisJCQkJCWNvbXB1dGVEZXBlbmRlbnRzKHByb2plY3QsIHNldCwgdmlzaXRlZCk7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewpAQCAtMTkwLDcgKzIyOSw3IEBACiAJCQkJfQogCQkJfQogCQkJLy8gYWRkIHRoZSBkZXBlbmRlbnQgcHJvamVjdHMKLQkJCXRoaXMuY29tcHV0ZURlcGVuZGVudHMocHJvamVjdCwgc2V0LCBuZXcgSGFzaFNldCgpKTsKKwkJCWNvbXB1dGVEZXBlbmRlbnRzKHByb2plY3QsIHNldCwgbmV3IEhhc2hTZXQoKSk7CiAJCX0KIAkJSVBhdGhbXSByZXN1bHQgPSBuZXcgSVBhdGhbc2V0LnNpemUoKV07CiAJCXNldC50b0FycmF5KHJlc3VsdCk7CkBAIC0yMTEsNyArMjUwLDcgQEAKIAkJCQkJCXNldC5hZGQocGtnRnJhZ21lbnRSb290LmdldFBhdGgoKSk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJdGhpcy5jb21wdXRlRGVwZW5kZW50cyhkZXBlbmRlbnQsIHNldCwgdmlzaXRlZCk7CisJCQkJY29tcHV0ZURlcGVuZGVudHMoZGVwZW5kZW50LCBzZXQsIHZpc2l0ZWQpOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBwcm9qZWN0IGlzIG5vdCBhIGphdmEgcHJvamVjdAogCQkJfQpAQCAtMjIxLDEzICsyNjAsMTYgQEAKIAkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zZXMoU3RyaW5nKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKwkJcmV0dXJuIGVuY2xvc2VzKHJlc291cmNlUGF0aCwgbnVsbCk7CisJfQorCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CiAJCWlmICh0aGlzLmhpZXJhcmNoeSA9PSBudWxsKSB7CiAJCQlpZiAocmVzb3VyY2VQYXRoLmVxdWFscyh0aGlzLmZvY3VzUGF0aCkpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CiAJCQkJCXRyeSB7Ci0JCQkJCQl0aGlzLmluaXRpYWxpemUoKTsKKwkJCQkJCWluaXRpYWxpemUocHJvZ3Jlc3NNb25pdG9yKTsKIAkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJfQpAQCAtMjQwLDcgKzI4Miw3IEBACiAJCX0KIAkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CiAJCQl0cnkgewotCQkJCXRoaXMucmVmcmVzaCgpOworCQkJCXJlZnJlc2gocHJvZ3Jlc3NNb25pdG9yKTsKIAkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CkBAIC0yNTcsMTcgKzI5OSwzMiBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CisJLyoqIAorCSAqIE9wdGlvbmFsbHkgcGVyZm9ybSBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBlbGVtZW50IGhhcyBhbHJlYWR5IHBhc3NlZCBtYXRjaGluZyBiYXNlZCBvbiBpbmRleC9kb2N1bWVudHMuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGVuY2xvc2VkIG9yIGlmIG5vIGZpbmUgZ3JhaW5lZCBjaGVja2luZyAKKwkgKiAgICAgICAgIChyZWdhcmRpbmcgc3VidHlwZXMgYW5kIG1lbWJlcnMpIGlzIHJlcXVlc3RlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzRmluZUdyYWluZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKCh0aGlzLnN1YlR5cGVzID09IG51bGwpICYmIHRoaXMuYWxsb3dNZW1iZXJBbmRFbmNsb3NpbmdUeXBlcykgCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbm8gZmluZSBncmFpbmVkIGNoZWNraW5nIHJlcXVlc3RlZAorCQlyZXR1cm4gZW5jbG9zZXMoZWxlbWVudCwgbnVsbCk7CisJfQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zZXMoSUphdmFFbGVtZW50KQogCSAqLwogCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCXJldHVybiBlbmNsb3NlcyhlbGVtZW50LCBudWxsKTsKKwl9CisJcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CiAJCWlmICh0aGlzLmhpZXJhcmNoeSA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5mb2N1c1R5cGUuZXF1YWxzKGVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlRZUEUpKSkgeworCQkJaWYgKHRoaXMuaW5jbHVkZUZvY3VzVHlwZSAmJiB0aGlzLmZvY3VzVHlwZS5lcXVhbHMoZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuVFlQRSkpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9IGVsc2UgewogCQkJCWlmICh0aGlzLm5lZWRzUmVmcmVzaCkgewogCQkJCQl0cnkgewotCQkJCQkJdGhpcy5pbml0aWFsaXplKCk7CisJCQkJCQlpbml0aWFsaXplKHByb2dyZXNzTW9uaXRvcik7CiAJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KQEAgLTI3NSwxMiArMzMyLDEyIEBACiAJCQkJCS8vIHRoZSBzY29wZSBpcyB1c2VkIG9ubHkgdG8gZmluZCBlbmNsb3NpbmcgcHJvamVjdHMgYW5kIGphcnMKIAkJCQkJLy8gY2xpZW50cyBpcyByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIG91dCBlbGVtZW50cyBub3QgaW4gdGhlIGhpZXJhcmNoeSAoc2VlIFNlYXJjaEVuZ2luZSkKIAkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkJCisJCQkJfQogCQkJfQogCQl9CiAJCWlmICh0aGlzLm5lZWRzUmVmcmVzaCkgewogCQkJdHJ5IHsKLQkJCQl0aGlzLnJlZnJlc2goKTsKKwkJCQlyZWZyZXNoKHByb2dyZXNzTW9uaXRvcik7CiAJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQpAQCAtMjkyLDE3ICszNDksNjQgQEAKIAkJCXR5cGUgPSAoKElNZW1iZXIpIGVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKTsKIAkJfQogCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5mb2N1c1R5cGUuZXF1YWxzKHR5cGUpKQorCQkJCXJldHVybiB0aGlzLmluY2x1ZGVGb2N1c1R5cGU7CisJCQkvLyBwb3RlbnRpYWxseSBhbGxvdyB0cmF2ZWxsaW5nIGluOgorCQkJaWYgKGVuY2xvc2VzVHlwZSh0eXBlLCB0aGlzLmFsbG93TWVtYmVyQW5kRW5jbG9zaW5nVHlwZXMpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlpZiAodGhpcy5hbGxvd01lbWJlckFuZEVuY2xvc2luZ1R5cGVzKSB7CisJCQkJLy8gdHJhdmVsIG91dDogcXVlcmllZCB0eXBlIGlzIGVuY2xvc2VkIGluIHRoaXMgc2NvcGUgaWYgaXRzIChpbmRpcmVjdCkgZGVjbGFyaW5nIHR5cGUgaXM6CisJCQkJSVR5cGUgZW5jbG9zaW5nID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCQkJd2hpbGUgKGVuY2xvc2luZyAhPSBudWxsKSB7CisJCQkJCS8vIGRvbid0IGFsbG93IHRyYXZlbGxpbmcgaW4gYWdhaW46CisJCQkJCWlmIChlbmNsb3Nlc1R5cGUoZW5jbG9zaW5nLCBmYWxzZSkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCWVuY2xvc2luZyA9IGVuY2xvc2luZy5nZXREZWNsYXJpbmdUeXBlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzVHlwZShJVHlwZSB0eXBlLCBib29sZWFuIHJlY3Vyc2UpIHsKKwkJaWYgKHRoaXMuc3ViVHlwZXMgIT0gbnVsbCkgeworCQkJLy8gc2VhcmNoaW5nIHN1YnR5cGVzCisJCQlpZiAodGhpcy5zdWJUeXBlcy5jb250YWlucyh0eXBlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJLy8gYmUgZmxleGlibGU6IGxvb2sgYXQgb3JpZ2luYWwgZWxlbWVudCAoc2VlIGJ1ZyAxNDEwNiBhbmQgYmVsb3cpCisJCQlJVHlwZSBvcmlnaW5hbCA9IHR5cGUuaXNCaW5hcnkoKSA/IG51bGwgOiAoSVR5cGUpdHlwZS5nZXRQcmltYXJ5RWxlbWVudCgpOworCQkJaWYgKG9yaWdpbmFsICE9IHR5cGUgJiYgdGhpcy5zdWJUeXBlcy5jb250YWlucyhvcmlnaW5hbCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWlmICh0aGlzLmhpZXJhcmNoeS5jb250YWlucyh0eXBlKSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfSBlbHNlIHsKIAkJCQkvLyBiZSBmbGV4aWJsZTogbG9vayBhdCBvcmlnaW5hbCBlbGVtZW50IChzZWUgYnVnIDE0MTA2IERlY2xhcmF0aW9ucyBpbiBIaWVyYXJjaHkgZG9lcyBub3QgZmluZCBkZWNsYXJhdGlvbnMgaW4gaGllcmFyY2h5KQogCQkJCUlUeXBlIG9yaWdpbmFsOwotCQkJCWlmICghdHlwZS5pc0JpbmFyeSgpIAorCQkJCWlmICghdHlwZS5pc0JpbmFyeSgpCiAJCQkJCQkmJiAob3JpZ2luYWwgPSAoSVR5cGUpdHlwZS5nZXRQcmltYXJ5RWxlbWVudCgpKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0aGlzLmhpZXJhcmNoeS5jb250YWlucyhvcmlnaW5hbCk7CisJCQkJCWlmICh0aGlzLmhpZXJhcmNoeS5jb250YWlucyhvcmlnaW5hbCkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IAorCQl9CisJCWlmIChyZWN1cnNlKSB7CisJCQkvLyBxdWVyaWVkIHR5cGUgaXMgZW5jbG9zZWQgaW4gdGhpcyBzY29wZSBpZiBvbmUgb2YgaXRzIG1lbWJlcnMgaXM6CisJCQl0cnkgeworCQkJCUlUeXBlW10gbWVtYmVyVHlwZXMgPSB0eXBlLmdldFR5cGVzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZW5jbG9zZXNUeXBlKG1lbWJlclR5cGVzW2ldLCByZWN1cnNlKSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQogCS8qIChub24tSmF2YWRvYykKQEAgLTMxMiw3ICs0MTYsNyBAQAogCXB1YmxpYyBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpIHsKIAkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CiAJCQl0cnkgewotCQkJCXRoaXMucmVmcmVzaCgpOworCQkJCXJlZnJlc2gobnVsbCk7CiAJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJcmV0dXJuIG5ldyBJUGF0aFswXTsKIAkJCX0KQEAgLTMyMCwyNyArNDI0LDM3IEBACiAJCXJldHVybiB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKIAl9CiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpbml0aWFsaXplKG51bGwpOworCX0KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5yZXNvdXJjZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKIAkJdGhpcy5lbGVtZW50cyA9IG5ldyBJUmVzb3VyY2VbNV07CiAJCXRoaXMuZWxlbWVudENvdW50ID0gMDsKIAkJdGhpcy5uZWVkc1JlZnJlc2ggPSBmYWxzZTsKIAkJaWYgKHRoaXMuaGllcmFyY2h5ID09IG51bGwpIHsKLQkJCXRoaXMuaGllcmFyY2h5ID0gdGhpcy5mb2N1c1R5cGUubmV3VHlwZUhpZXJhcmNoeSh0aGlzLm93bmVyLCBudWxsKTsKKwkJCWlmICh0aGlzLmphdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQl0aGlzLmhpZXJhcmNoeSA9IHRoaXMuZm9jdXNUeXBlLm5ld1R5cGVIaWVyYXJjaHkodGhpcy5qYXZhUHJvamVjdCwgdGhpcy5vd25lciwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5oaWVyYXJjaHkgPSB0aGlzLmZvY3VzVHlwZS5uZXdUeXBlSGllcmFyY2h5KHRoaXMub3duZXIsIHByb2dyZXNzTW9uaXRvcik7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0aGlzLmhpZXJhcmNoeS5yZWZyZXNoKG51bGwpOworCQkJdGhpcy5oaWVyYXJjaHkucmVmcmVzaChwcm9ncmVzc01vbml0b3IpOwogCQl9Ci0JCXRoaXMuYnVpbGRSZXNvdXJjZVZlY3RvcigpOworCQlidWlsZFJlc291cmNlVmVjdG9yKCk7CiAJfQogCS8qCiAJICogQHNlZSBBYnN0cmFjdFNlYXJjaFNjb3BlI3Byb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSkKIAkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGludCBldmVudFR5cGUpIHsKIAkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSByZXR1cm47Ci0JCXRoaXMubmVlZHNSZWZyZXNoID0gdGhpcy5oaWVyYXJjaHkgPT0gbnVsbCA/IGZhbHNlIDogKChUeXBlSGllcmFyY2h5KXRoaXMuaGllcmFyY2h5KS5pc0FmZmVjdGVkKGRlbHRhKTsKKwkJdGhpcy5uZWVkc1JlZnJlc2ggPSB0aGlzLmhpZXJhcmNoeSA9PSBudWxsID8gZmFsc2UgOiAoKFR5cGVIaWVyYXJjaHkpdGhpcy5oaWVyYXJjaHkpLmlzQWZmZWN0ZWQoZGVsdGEsIGV2ZW50VHlwZSk7CiAJfQogCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmVmcmVzaChudWxsKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCWlmICh0aGlzLmhpZXJhcmNoeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmluaXRpYWxpemUoKTsKKwkJCWluaXRpYWxpemUocHJvZ3Jlc3NNb25pdG9yKTsKIAkJfQogCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JUmVzdHJpY3RlZEFjY2Vzc0NvbnN0cnVjdG9yUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lSZXN0cmljdGVkQWNjZXNzQ29uc3RydWN0b3JSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQyMDExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JUmVzdHJpY3RlZEFjY2Vzc0NvbnN0cnVjdG9yUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUmVzdHJpY3Rpb247CisKKy8qKgorICogQSA8Y29kZT5JUmVzdHJpY3RlZEFjY2Vzc0NvbnN0cnVjdG9yUmVxdWVzdG9yPC9jb2RlPiBjb2xsZWN0cyBzZWFyY2ggcmVzdWx0cyBmcm9tIGEgPGNvZGU+c2VhcmNoQWxsQ29uc3RydWN0b3JEZWNsYXJhdGlvbnM8L2NvZGU+CisgKiBxdWVyeSB0byBhIDxjb2RlPlNlYXJjaEJhc2ljRW5naW5lPC9jb2RlPiBwcm92aWRpbmcgcmVzdHJpY3RlZCBhY2Nlc3MgaW5mb3JtYXRpb24gb2YgZGVjbGFyaW5nIHR5cGUgd2hlbiBhIGNvbnN0cnVjdG9yIGlzIGFjY2VwdGVkLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElSZXN0cmljdGVkQWNjZXNzQ29uc3RydWN0b3JSZXF1ZXN0b3IgeworCisJcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3IoCisJCQlpbnQgbW9kaWZpZXJzLAorCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAorCQkJaW50IHBhcmFtZXRlckNvdW50LAorCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJCWludCBleHRyYUZsYWdzLAorCQkJU3RyaW5nIHBhdGgsCisJCQlBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3MpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3IuamF2YQppbmRleCBiYTFiMWNhLi5hYTEwNDFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSVJlc3RyaWN0ZWRBY2Nlc3NUeXBlUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3IKICAqLwogcHVibGljIGludGVyZmFjZSBJUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3IgewotCQorCiAJcHVibGljIHZvaWQgYWNjZXB0VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCwgQWNjZXNzUmVzdHJpY3Rpb24gYWNjZXNzKTsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFF1ZXJ5UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4UXVlcnlSZXF1ZXN0b3IuamF2YQppbmRleCBkYWI0NjA2Li41ZTcxNDgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4UXVlcnlSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4UXVlcnlSZXF1ZXN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCw4ICsxOCw4IEBACiAgKiBUT0RPIGFkZCBzcGVjCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmRleFF1ZXJ5UmVxdWVzdG9yIHsKLQkKKwogCS8vIGFuc3dlciBmYWxzZSBpZiByZXF1ZXN0aW5nIGNhbmNlbAogCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdEluZGV4TWF0Y2goU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGF0dGVybiBpbmRleFJlY29yZCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIEFjY2Vzc1J1bGVTZXQgYWNjZXNzKTsKLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQppbmRleCAyNmY4NTA1Li5iM2ZmNjBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwxOCArMTAsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLlJlZmVyZW5jZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5TdGF0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZy5NYXRjaExvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLk1ldGhvZFBhdHRlcm47CkBAIC0zNCwzMCArMzcsMjggQEAKIAlJSmF2YVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlOwogCVNlYXJjaFBhdHRlcm4gcGF0dGVybjsKIAlJUGF0aFtdIGluZGV4TG9jYXRpb25zOyAvLyBjYWNoZSBvZiB0aGUga2V5cyBmb3IgbG9va2luZyBpbmRleCB1cAotCQorCiBwdWJsaWMgSW5kZXhTZWxlY3RvcigKIAkJSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZSwKIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCisKIAl0aGlzLnNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGU7CiAJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIH0KIC8qKgogICogUmV0dXJucyB3aGV0aGVyIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBwcm9qZWN0IG9yIGphciBjYW4gc2VlIHRoZSBnaXZlbiBmb2N1cyAoYW4gSUphdmFQcm9qZWN0IG9yCi0gKiBhIEphclBhY2thZ2VGcmFnbWVudFJvdCkgZWl0aGVyIGJlY2F1c2UgdGhlIGZvY3VzIGlzIHBhcnQgb2YgdGhlIHByb2plY3Qgb3IgdGhlIGphciwgb3IgYmVjYXVzZSBpdCBpcyAKKyAqIGEgSmFyUGFja2FnZUZyYWdtZW50Um90KSBlaXRoZXIgYmVjYXVzZSB0aGUgZm9jdXMgaXMgcGFydCBvZiB0aGUgcHJvamVjdCBvciB0aGUgamFyLCBvciBiZWNhdXNlIGl0IGlzCiAgKiBhY2Nlc3NpYmxlIHRocm91Z2h0IHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoCiAgKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5TZWVGb2N1cyhJSmF2YUVsZW1lbnQgZm9jdXMsIGJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCwgSVBhdGggcHJvamVjdE9ySmFyUGF0aCkgeworcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNlZUZvY3VzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSVBhdGggcHJvamVjdE9ySmFyUGF0aCkgewogCXRyeSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGZvY3VzRW50cmllcyA9IG51bGw7Ci0JCWlmIChpc1BvbHltb3JwaGljU2VhcmNoKSB7Ci0JCQlKYXZhUHJvamVjdCBmb2N1c1Byb2plY3QgPSBmb2N1cyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QgPyAoSmF2YVByb2plY3QpIGZvY3VzLmdldFBhcmVudCgpIDogKEphdmFQcm9qZWN0KSBmb2N1czsKLQkJCWZvY3VzRW50cmllcyA9IGZvY3VzUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aCgpOwotCQl9Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSBmb2N1cy5nZXRKYXZhTW9kZWwoKTsKKwkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwogCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3RPckphclBhdGgsIG1vZGVsKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiBjYW5TZWVGb2N1cyhmb2N1cywgKEphdmFQcm9qZWN0KSBwcm9qZWN0LCBmb2N1c0VudHJpZXMpOworCQlJSmF2YUVsZW1lbnRbXSBmb2N1c2VzID0gZ2V0Rm9jdXNlZEVsZW1lbnRzQW5kVHlwZXMocGF0dGVybiwgcHJvamVjdCwgbnVsbCk7CisJCWlmIChmb2N1c2VzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7CisJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKKwkJCXJldHVybiBjYW5TZWVGb2N1cyhmb2N1c2VzLCAoSmF2YVByb2plY3QpIHByb2plY3QsIG51bGwpOworCQl9CiAKIAkJLy8gcHJvamVjdE9ySmFyUGF0aCBpcyBhIGphcgogCQkvLyBpdCBjYW4gc2VlIHRoZSBmb2N1cyBvbmx5IGlmIGl0IGlzIG9uIHRoZSBjbGFzc3BhdGggb2YgYSBwcm9qZWN0IHRoYXQgY2FuIHNlZSB0aGUgZm9jdXMKQEAgLTY1LDMwICs2NiwyOSBAQAogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYWxsUHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCUphdmFQcm9qZWN0IG90aGVyUHJvamVjdCA9IChKYXZhUHJvamVjdCkgYWxsUHJvamVjdHNbaV07CiAJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBvdGhlclByb2plY3QuZ2V0Q2xhc3NwYXRoRW50cnlGb3IocHJvamVjdE9ySmFyUGF0aCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCAKLQkJCQkJJiYgZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIAotCQkJCQkmJiBjYW5TZWVGb2N1cyhmb2N1cywgb3RoZXJQcm9qZWN0LCBmb2N1c0VudHJpZXMpKQotCQkJCXJldHVybiB0cnVlOworCQkJaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7CisJCQkJaWYgKGNhblNlZUZvY3VzKGZvY3VzZXMsIG90aGVyUHJvamVjdCwgbnVsbCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogfQotcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNlZUZvY3VzKElKYXZhRWxlbWVudCBmb2N1cywgSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdIGZvY3VzRW50cmllc0ZvclBvbHltb3JwaGljU2VhcmNoKSB7Citwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblNlZUZvY3VzKElKYXZhRWxlbWVudFtdIGZvY3VzZXMsIEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW11bXVtdIGZvY3VzUXVhbGlmaWVkTmFtZXMpIHsKKwlpbnQgbGVuZ3RoID0gZm9jdXNlcy5sZW5ndGg7CisJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisJCWlmIChjYW5TZWVGb2N1cyhmb2N1c2VzW2ldLCBqYXZhUHJvamVjdCwgZm9jdXNRdWFsaWZpZWROYW1lcykpIHJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9Citwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblNlZUZvY3VzKElKYXZhRWxlbWVudCBmb2N1cywgSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXVtdW10gZm9jdXNRdWFsaWZpZWROYW1lcykgewogCXRyeSB7Ci0JCWlmIChmb2N1cy5lcXVhbHMoamF2YVByb2plY3QpKQotCQkJcmV0dXJuIHRydWU7CisJCWlmIChmb2N1cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWlmIChmb2N1cy5lcXVhbHMoamF2YVByb2plY3QpKSByZXR1cm4gdHJ1ZTsKIAotCQlpZiAoZm9jdXNFbnRyaWVzRm9yUG9seW1vcnBoaWNTZWFyY2ggIT0gbnVsbCkgewotCQkJLy8gbG9vayBmb3IgcmVmZXJpbmcgcHJvamVjdAotCQkJSVBhdGggcHJvamVjdFBhdGggPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmb2N1c0VudHJpZXNGb3JQb2x5bW9ycGhpY1NlYXJjaC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGZvY3VzRW50cmllc0ZvclBvbHltb3JwaGljU2VhcmNoW2ldOwotCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhwcm9qZWN0UGF0aCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CiAJCWlmIChmb2N1cyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKIAkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBqYXIKIAkJCUlQYXRoIGZvY3VzUGF0aCA9IGZvY3VzLmdldFBhdGgoKTsKQEAgLTEwNSwzNyArMTA1LDEwNyBAQAogCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0RXhwYW5kZWRDbGFzc3BhdGgoKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUICYmIGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoZm9jdXNQYXRoKSkKKwkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhmb2N1c1BhdGgpKSB7CisJCQkJaWYgKGZvY3VzUXVhbGlmaWVkTmFtZXMgIT0gbnVsbCkgeyAvLyBidWlsZGVyIHN0YXRlIGlzIHVzYWJsZSwgaGVuY2UgdXNlIGl0IHRvIHRyeSB0byByZWR1Y2UgcHJvamVjdCB3aGljaCBjYW4gc2VlIHRoZSBmb2N1cy4uLgorCQkJCQlTdGF0ZSBwcm9qZWN0U3RhdGUgPSAoU3RhdGUpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldExhc3RCdWlsdFN0YXRlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgbnVsbCk7CisJCQkJCWlmIChwcm9qZWN0U3RhdGUgIT0gbnVsbCkgeworCQkJCQkJT2JqZWN0W10gdmFsdWVzID0gcHJvamVjdFN0YXRlLmdldFJlZmVyZW5jZXMoKS52YWx1ZVRhYmxlOworCQkJCQkJaW50IHZMZW5ndGggPSB2YWx1ZXMubGVuZ3RoOworCQkJCQkJZm9yIChpbnQgaj0wOyBqPHZMZW5ndGg7IGorKykgIHsKKwkJCQkJCQlpZiAodmFsdWVzW2pdID09IG51bGwpIGNvbnRpbnVlOworCQkJCQkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gcmVmZXJlbmNlcyA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZXNbal07CisJCQkJCQkJaWYgKHJlZmVyZW5jZXMuaW5jbHVkZXMoZm9jdXNRdWFsaWZpZWROYW1lcywgbnVsbCwgbnVsbCkpIHsKKwkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQogCQkJCXJldHVybiB0cnVlOworCQkJfQogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogfQorCisvKgorICogQ3JlYXRlIHRoZSBsaXN0IG9mIGZvY3VzZWQgamFycyBvciBwcm9qZWN0cy4KKyAqLworcHJpdmF0ZSBzdGF0aWMgSUphdmFFbGVtZW50W10gZ2V0Rm9jdXNlZEVsZW1lbnRzQW5kVHlwZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YUVsZW1lbnQgZm9jdXNFbGVtZW50LCBPYmplY3RWZWN0b3Igc3VwZXJUeXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBNZXRob2RQYXR0ZXJuKSB7CisJCS8vIEZvciBtZXRob2QgcGF0dGVybiwgaXQgbmVlZHMgdG8gd2FsayBhbG9uZyB0aGUgZm9jdXMgdHlwZSBzdXBlciBoaWVyYXJjaHkKKwkJLy8gYW5kIGFkZCBqYXJzL3Byb2plY3RzIG9mIGFsbCB0aGUgZW5jb3VudGVyZWQgdHlwZXMuCisJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIHBhdHRlcm4uZm9jdXMuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlRZUEUpOworCQlNZXRob2RQYXR0ZXJuIG1ldGhvZFBhdHRlcm4gPSAoTWV0aG9kUGF0dGVybikgcGF0dGVybjsKKwkJU3RyaW5nIHNlbGVjdG9yID0gbmV3IFN0cmluZyhtZXRob2RQYXR0ZXJuLnNlbGVjdG9yKTsKKwkJaW50IHBhcmFtZXRlckNvdW50ID0gbWV0aG9kUGF0dGVybi5wYXJhbWV0ZXJDb3VudDsKKwkJSVR5cGVIaWVyYXJjaHkgc3VwZXJIaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKKwkJSVR5cGVbXSBhbGxUeXBlcyA9IHN1cGVySGllcmFyY2h5LmdldEFsbFN1cGVydHlwZXModHlwZSk7CisJCWludCBsZW5ndGggPSBhbGxUeXBlcy5sZW5ndGg7CisJCVNpbXBsZVNldCBmb2N1c1NldCA9IG5ldyBTaW1wbGVTZXQobGVuZ3RoKzEpOworCQlpZiAoZm9jdXNFbGVtZW50ICE9IG51bGwpIGZvY3VzU2V0LmFkZChmb2N1c0VsZW1lbnQpOworCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCUlNZXRob2RbXSBtZXRob2RzID0gYWxsVHlwZXNbaV0uZ2V0TWV0aG9kcygpOworCQkJaW50IG1MZW5ndGggPSBtZXRob2RzLmxlbmd0aDsKKwkJCWZvciAoaW50IG09MDsgbTxtTGVuZ3RoOyBtKyspIHsKKwkJCQlpZiAocGFyYW1ldGVyQ291bnQgPT0gbWV0aG9kc1ttXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSAmJiBtZXRob2RzW21dLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHNlbGVjdG9yKSkgeworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBhbGxUeXBlc1tpXS5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKKwkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSByb290LmlzQXJjaGl2ZSgpID8gcm9vdCA6IHJvb3QuZ2V0UGFyZW50KCk7CisJCQkJCWZvY3VzU2V0LmFkZChlbGVtZW50KTsKKwkJCQkJaWYgKHN1cGVyVHlwZXMgIT0gbnVsbCkgc3VwZXJUeXBlcy5hZGQoYWxsVHlwZXNbaV0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gUmVidWlsdCBhIGNvbnRpZ3VvdXMgYXJyYXkKKwkJSUphdmFFbGVtZW50W10gZm9jdXNlcyA9IG5ldyBJSmF2YUVsZW1lbnRbZm9jdXNTZXQuZWxlbWVudFNpemVdOworCQlPYmplY3RbXSB2YWx1ZXMgPSBmb2N1c1NldC52YWx1ZXM7CisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSB2YWx1ZXMubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJCWlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworCQkJCWZvY3VzZXNbY291bnQrK10gPSAoSUphdmFFbGVtZW50KSB2YWx1ZXNbaV07CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvY3VzZXM7CisJfQorCWlmIChmb2N1c0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG5ldyBJSmF2YUVsZW1lbnRbMF07CisJcmV0dXJuIG5ldyBJSmF2YUVsZW1lbnRbXSB7IGZvY3VzRWxlbWVudCB9OworfQorCiAvKgogICogIENvbXB1dGUgdGhlIGxpc3Qgb2YgcGF0aHMgd2hpY2ggYXJlIGtleWluZyBpbmRleCBmaWxlcy4KICAqLwogcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbmRleExvY2F0aW9ucygpIHsKIAlJUGF0aFtdIHByb2plY3RzQW5kSmFycyA9IHRoaXMuc2VhcmNoU2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7Ci0JSW5kZXhNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKKwlJbmRleE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7CiAJU2ltcGxlU2V0IGxvY2F0aW9ucyA9IG5ldyBTaW1wbGVTZXQoKTsKIAlJSmF2YUVsZW1lbnQgZm9jdXMgPSBNYXRjaExvY2F0b3IucHJvamVjdE9ySmFyRm9jdXModGhpcy5wYXR0ZXJuKTsKIAlpZiAoZm9jdXMgPT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzQW5kSmFycy5sZW5ndGg7IGkrKykKLQkJCWxvY2F0aW9ucy5hZGQobWFuYWdlci5jb21wdXRlSW5kZXhMb2NhdGlvbihwcm9qZWN0c0FuZEphcnNbaV0pKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0c0FuZEphcnMubGVuZ3RoOyBpKyspIHsKKwkJCUlQYXRoIHBhdGggPSBwcm9qZWN0c0FuZEphcnNbaV07CisJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLCBmYWxzZS8qZG9uJ3QgY2hlY2sgZXhpc3RlbmNlKi8pOworCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIC8vIGNhc2Ugb2YgYW4gZXh0ZXJuYWwgZm9sZGVyCisJCQkJcGF0aCA9ICgoSUZvbGRlcikgdGFyZ2V0KS5nZXRGdWxsUGF0aCgpOworCQkJbG9jYXRpb25zLmFkZChtYW5hZ2VyLmNvbXB1dGVJbmRleExvY2F0aW9uKHBhdGgpKTsKKwkJfQogCX0gZWxzZSB7CiAJCXRyeSB7CisJCQkvLyBTZWUgd2hldGhlciB0aGUgc3RhdGUgYnVpbGRlciBtaWdodCBiZSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluZGV4IGxvY2F0aW9ucworCQkKIAkJCS8vIGZpbmQgdGhlIHByb2plY3RzIGZyb20gcHJvamVjdHNBbmRKYXJzIHRoYXQgc2VlIHRoZSBmb2N1cyB0aGVuIHdhbGsgdGhvc2UgcHJvamVjdHMgbG9va2luZyBmb3IgdGhlIGphcnMgZnJvbSBwcm9qZWN0c0FuZEphcnMKIAkJCWludCBsZW5ndGggPSBwcm9qZWN0c0FuZEphcnMubGVuZ3RoOwogCQkJSmF2YVByb2plY3RbXSBwcm9qZWN0c0NhblNlZUZvY3VzID0gbmV3IEphdmFQcm9qZWN0W2xlbmd0aF07CiAJCQlTaW1wbGVTZXQgdmlzaXRlZFByb2plY3RzID0gbmV3IFNpbXBsZVNldChsZW5ndGgpOwogCQkJaW50IHByb2plY3RJbmRleCA9IDA7Ci0JCQlTaW1wbGVTZXQgamFyc1RvQ2hlY2sgPSBuZXcgU2ltcGxlU2V0KGxlbmd0aCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBmb2N1c0VudHJpZXMgPSBudWxsOwotCQkJaWYgKHRoaXMucGF0dGVybiBpbnN0YW5jZW9mIE1ldGhvZFBhdHRlcm4pIHsgLy8gc2hvdWxkIGNvbnNpZGVyIHBvbHltb3JwaGljIHNlYXJjaCBmb3IgbWV0aG9kIHBhdHRlcm5zCi0JCQkJSmF2YVByb2plY3QgZm9jdXNQcm9qZWN0ID0gZm9jdXMgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290ID8gKEphdmFQcm9qZWN0KSBmb2N1cy5nZXRQYXJlbnQoKSA6IChKYXZhUHJvamVjdCkgZm9jdXM7Ci0JCQkJZm9jdXNFbnRyaWVzID0gZm9jdXNQcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKCk7CisJCQlTaW1wbGVTZXQgZXh0ZXJuYWxMaWJzVG9DaGVjayA9IG5ldyBTaW1wbGVTZXQobGVuZ3RoKTsKKwkJCU9iamVjdFZlY3RvciBzdXBlclR5cGVzID0gbmV3IE9iamVjdFZlY3RvcigpOworCQkJSUphdmFFbGVtZW50W10gZm9jdXNlcyA9IGdldEZvY3VzZWRFbGVtZW50c0FuZFR5cGVzKHRoaXMucGF0dGVybiwgZm9jdXMsIHN1cGVyVHlwZXMpOworCQkJY2hhcltdW11bXSBmb2N1c1F1YWxpZmllZE5hbWVzID0gbnVsbDsKKwkJCWJvb2xlYW4gaXNBdXRvQnVpbGRpbmcgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpOworCQkJaWYgKGlzQXV0b0J1aWxkaW5nICYmIGZvY3VzIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisJCQkJZm9jdXNRdWFsaWZpZWROYW1lcyA9IGdldFF1YWxpZmllZE5hbWVzKHN1cGVyVHlwZXMpOwogCQkJfQogCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtMTQzLDMxICsyMTMsMzMgQEAKIAkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdChwYXRoLCBtb2RlbCk7CiAJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewogCQkJCQl2aXNpdGVkUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQlpZiAoY2FuU2VlRm9jdXMoZm9jdXMsIHByb2plY3QsIGZvY3VzRW50cmllcykpIHsKKwkJCQkJaWYgKGNhblNlZUZvY3VzKGZvY3VzZXMsIHByb2plY3QsIGZvY3VzUXVhbGlmaWVkTmFtZXMpKSB7CiAJCQkJCQlsb2NhdGlvbnMuYWRkKG1hbmFnZXIuY29tcHV0ZUluZGV4TG9jYXRpb24ocGF0aCkpOwogCQkJCQkJcHJvamVjdHNDYW5TZWVGb2N1c1twcm9qZWN0SW5kZXgrK10gPSBwcm9qZWN0OwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJamFyc1RvQ2hlY2suYWRkKHBhdGgpOworCQkJCQlleHRlcm5hbExpYnNUb0NoZWNrLmFkZChwYXRoKTsKIAkJCQl9CiAJCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RJbmRleCAmJiBqYXJzVG9DaGVjay5lbGVtZW50U2l6ZSA+IDA7IGkrKykgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0SW5kZXggJiYgZXh0ZXJuYWxMaWJzVG9DaGVjay5lbGVtZW50U2l6ZSA+IDA7IGkrKykgewogCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0c0NhblNlZUZvY3VzW2ldLmdldFJlc29sdmVkQ2xhc3NwYXRoKCk7CiAJCQkJZm9yIChpbnQgaiA9IGVudHJpZXMubGVuZ3RoOyAtLWogPj0gMDspIHsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tqXTsKIAkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewogCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCWlmIChqYXJzVG9DaGVjay5pbmNsdWRlcyhwYXRoKSkgewotCQkJCQkJCWxvY2F0aW9ucy5hZGQobWFuYWdlci5jb21wdXRlSW5kZXhMb2NhdGlvbihlbnRyeS5nZXRQYXRoKCkpKTsKLQkJCQkJCQlqYXJzVG9DaGVjay5yZW1vdmUocGF0aCk7CisJCQkJCQlpZiAoZXh0ZXJuYWxMaWJzVG9DaGVjay5yZW1vdmUocGF0aCkgIT0gbnVsbCkgeworCQkJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHBhdGgsIGZhbHNlLypkb24ndCBjaGVjayBleGlzdGVuY2UqLyk7CisJCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIC8vIGNhc2Ugb2YgYW4gZXh0ZXJuYWwgZm9sZGVyCisJCQkJCQkJCXBhdGggPSAoKElGb2xkZXIpIHRhcmdldCkuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJCQlsb2NhdGlvbnMuYWRkKG1hbmFnZXIuY29tcHV0ZUluZGV4TG9jYXRpb24ocGF0aCkpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJLy8gamFyIGZpbGVzIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIHNjb3BlIHdpdGhvdXQgaW5jbHVkaW5nIG9uZSBvZiB0aGUgcHJvamVjdHMgdGhhdCByZWZlcmVuY2VzIHRoZW0sIHNvIHNjYW4gYWxsIHByb2plY3RzIHRoYXQgaGF2ZSBub3QgYmVlbiB2aXNpdGVkCi0JCQlpZiAoamFyc1RvQ2hlY2suZWxlbWVudFNpemUgPiAwKSB7CisJCQlpZiAoZXh0ZXJuYWxMaWJzVG9DaGVjay5lbGVtZW50U2l6ZSA+IDApIHsKIAkJCQlJSmF2YVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwLCBsID0gYWxsUHJvamVjdHMubGVuZ3RoOyBpIDwgbCAmJiBqYXJzVG9DaGVjay5lbGVtZW50U2l6ZSA+IDA7IGkrKykgeworCQkJCWZvciAoaW50IGkgPSAwLCBsID0gYWxsUHJvamVjdHMubGVuZ3RoOyBpIDwgbCAmJiBleHRlcm5hbExpYnNUb0NoZWNrLmVsZW1lbnRTaXplID4gMDsgaSsrKSB7CiAJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGFsbFByb2plY3RzW2ldOwogCQkJCQlpZiAoIXZpc2l0ZWRQcm9qZWN0cy5pbmNsdWRlcyhwcm9qZWN0KSkgewogCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsKQEAgLTE3NSw5ICsyNDcsMTEgQEAKIAkJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwogCQkJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKIAkJCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCQkJaWYgKGphcnNUb0NoZWNrLmluY2x1ZGVzKHBhdGgpKSB7Ci0JCQkJCQkJCQlsb2NhdGlvbnMuYWRkKG1hbmFnZXIuY29tcHV0ZUluZGV4TG9jYXRpb24oZW50cnkuZ2V0UGF0aCgpKSk7Ci0JCQkJCQkJCQlqYXJzVG9DaGVjay5yZW1vdmUocGF0aCk7CisJCQkJCQkJCWlmIChleHRlcm5hbExpYnNUb0NoZWNrLnJlbW92ZShwYXRoKSAhPSBudWxsKSB7CisJCQkJCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLCBmYWxzZS8qZG9uJ3QgY2hlY2sgZXhpc3RlbmNlKi8pOworCQkJCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIC8vIGNhc2Ugb2YgYW4gZXh0ZXJuYWwgZm9sZGVyCisJCQkJCQkJCQkJcGF0aCA9ICgoSUZvbGRlcikgdGFyZ2V0KS5nZXRGdWxsUGF0aCgpOworCQkJCQkJCQkJbG9jYXRpb25zLmFkZChtYW5hZ2VyLmNvbXB1dGVJbmRleExvY2F0aW9uKHBhdGgpKTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTE5Niw5ICsyNzAsMTAgQEAKIAkJaWYgKHZhbHVlc1tpXSAhPSBudWxsKQogCQkJdGhpcy5pbmRleExvY2F0aW9uc1tjb3VudCsrXSA9IChJUGF0aCkgdmFsdWVzW2ldOwogfQorCiBwdWJsaWMgSVBhdGhbXSBnZXRJbmRleExvY2F0aW9ucygpIHsKIAlpZiAodGhpcy5pbmRleExvY2F0aW9ucyA9PSBudWxsKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUluZGV4TG9jYXRpb25zKCk7IAorCQlpbml0aWFsaXplSW5kZXhMb2NhdGlvbnMoKTsKIAl9CiAJcmV0dXJuIHRoaXMuaW5kZXhMb2NhdGlvbnM7CiB9CkBAIC0yMTQsNCArMjg5LDI4IEBACiAJfQogCXJldHVybiBudWxsOwogfQorCitwcml2YXRlIGNoYXJbXVtdW10gZ2V0UXVhbGlmaWVkTmFtZXMoT2JqZWN0VmVjdG9yIHR5cGVzKSB7CisJZmluYWwgaW50IHNpemUgPSB0eXBlcy5zaXplOworCWNoYXJbXVtdW10gZm9jdXNRdWFsaWZpZWROYW1lcyA9IG51bGw7CisJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdGhpcy5wYXR0ZXJuLmZvY3VzOworCWludCBpbmRleCA9IDA7CisJd2hpbGUgKGphdmFFbGVtZW50ICE9IG51bGwgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUm9vdCkpIHsKKwkJamF2YUVsZW1lbnQgPSBqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKKwl9CisJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKKwkJSVR5cGUgcHJpbWFyeVR5cGUgPSAoKElUeXBlUm9vdCkgamF2YUVsZW1lbnQpLmZpbmRQcmltYXJ5VHlwZSgpOworCQlpZiAocHJpbWFyeVR5cGUgIT0gbnVsbCkgeworCQkJZm9jdXNRdWFsaWZpZWROYW1lcyA9IG5ldyBjaGFyW3NpemUrMV1bXVtdOworCQkJZm9jdXNRdWFsaWZpZWROYW1lc1tpbmRleCsrXSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHByaW1hcnlUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCkpOworCQl9IAorCX0KKwlpZiAoZm9jdXNRdWFsaWZpZWROYW1lcyA9PSBudWxsKSB7CisJCWZvY3VzUXVhbGlmaWVkTmFtZXMgPSBuZXcgY2hhcltzaXplXVtdW107CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWZvY3VzUXVhbGlmaWVkTmFtZXNbaW5kZXgrK10gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCAoKElUeXBlKSh0eXBlcy5lbGVtZW50QXQoaSkpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwl9CisJcmV0dXJuIGZvY3VzUXVhbGlmaWVkTmFtZXMubGVuZ3RoID09IDAgPyBudWxsIDogUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5RdWFsaWZpZWROYW1lcyhmb2N1c1F1YWxpZmllZE5hbWVzLCB0cnVlKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudC5qYXZhCmluZGV4IDA1NDU4ZGMuLmY1ZjMzMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywxMSArMjMsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCisKIAlwcml2YXRlIElGaWxlIGZpbGU7CiAJcHJvdGVjdGVkIGJ5dGVbXSBieXRlQ29udGVudHM7CiAJcHJvdGVjdGVkIGNoYXJbXSBjaGFyQ29udGVudHM7Ci0JCisKIAlwdWJsaWMgSmF2YVNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7CiAJCXN1cGVyKGRvY3VtZW50UGF0aCwgcGFydGljaXBhbnQpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmluZGV4IDdjMmE2OWIuLjEzZDY4MjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoUGFydGljaXBhbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywzMiArMTcsMzIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuTWF0Y2hMb2NhdG9yOwogCiAvKioKLSAqIEEgc2VhcmNoIHBhcnRpY2lwYW50IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uIHRvIGEgZ2VuZXJpYyBzZWFyY2ggbWVjaGFuaXNtLCBhbGxvd2luZyB0aHVzIHRvIAorICogQSBzZWFyY2ggcGFydGljaXBhbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBleHRlbnNpb24gdG8gYSBnZW5lcmljIHNlYXJjaCBtZWNoYW5pc20sIGFsbG93aW5nIHRodXMgdG8KICAqIHBlcmZvcm0gY29tYmluZWQgc2VhcmNoIGFjdGlvbnMgd2hpY2ggd2lsbCBpbnZvbHZlIGFsbCByZXF1aXJlZCBwYXJ0aWNpcGFudHMKLSAqIAotICogQSBzZWFyY2ggc2NvcGUgZGVmaW5lcyB3aGljaCBwYXJ0aWNpcGFudHMgYXJlIGludm9sdmVkLiAKLSAqIAorICoKKyAqIEEgc2VhcmNoIHNjb3BlIGRlZmluZXMgd2hpY2ggcGFydGljaXBhbnRzIGFyZSBpbnZvbHZlZC4KKyAqCiAgKiBBIHNlYXJjaCBwYXJ0aWNpcGFudCBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBpbmRleCBmaWxlcywgYW5kIHNlbGVjdGluZyB0aGUgYXBwcm9wcmlhdGUgb25lcyB0byBmZWVkIHRvCiAgKiBpbmRleCBxdWVyaWVzLiBJdCBhbHNvIGNhbiBtYXAgYSBkb2N1bWVudCBwYXRoIHRvIGFuIGFjdHVhbCBkb2N1bWVudCAobm90ZSB0aGF0IGRvY3VtZW50cyBjb3VsZCBsaXZlIG91dHNpZGUKICAqIHRoZSB3b3Jrc3BhY2Ugb3Igbm8gZXhpc3QgeWV0LCBhbmQgdGh1cyBhcmVuJ3QganVzdCByZXNvdXJjZXMpLgogICovCiBwdWJsaWMgY2xhc3MgSmF2YVNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCQotCUluZGV4U2VsZWN0b3IgaW5kZXhTZWxlY3RvcjsKLQkKKworCXByaXZhdGUgVGhyZWFkTG9jYWwgaW5kZXhTZWxlY3RvciA9IG5ldyBUaHJlYWRMb2NhbCgpOworCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2JlZ2luU2VhcmNoaW5nKCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBiZWdpblNlYXJjaGluZygpIHsKIAkJc3VwZXIuYmVnaW5TZWFyY2hpbmcoKTsKLQkJdGhpcy5pbmRleFNlbGVjdG9yID0gbnVsbDsKKwkJdGhpcy5pbmRleFNlbGVjdG9yLnNldChudWxsKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjZG9uZVNlYXJjaGluZygpCiAJICovCiAJcHVibGljIHZvaWQgZG9uZVNlYXJjaGluZygpIHsKLQkJdGhpcy5pbmRleFNlbGVjdG9yID0gbnVsbDsKKwkJdGhpcy5pbmRleFNlbGVjdG9yLnNldChudWxsKTsKIAkJc3VwZXIuZG9uZVNlYXJjaGluZygpOwogCX0KIApAQCAtNTIsNyArNTIsNyBAQAogCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CiAJCXJldHVybiAiSmF2YSI7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjZ2V0RG9jdW1lbnQoU3RyaW5nKQogCSAqLwpAQCAtNzQsMTcgKzc0LDE3IEBACiAJCQluZXcgQmluYXJ5SW5kZXhlcihkb2N1bWVudCkuaW5kZXhEb2N1bWVudCgpOwogCQl9CiAJfQotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgU2VhcmNoUGFydGljaXBhbnQjbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFtdLCBTZWFyY2hQYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IpCiAJICovCiAJcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFtdIGluZGV4TWF0Y2hlcywgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAogCQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlNYXRjaExvY2F0b3IgbWF0Y2hMb2NhdG9yID0gCisKKwkJTWF0Y2hMb2NhdG9yIG1hdGNoTG9jYXRvciA9CiAJCQluZXcgTWF0Y2hMb2NhdG9yKAotCQkJCXBhdHRlcm4sIAotCQkJCXJlcXVlc3RvciwgCisJCQkJcGF0dGVybiwKKwkJCQlyZXF1ZXN0b3IsCiAJCQkJc2NvcGUsCiAJCQkJbW9uaXRvcgogCQkpOwpAQCAtOTIsMjQgKzkyLDE5IEBACiAJCS8qIGVsaW1pbmF0aW5nIGZhbHNlIG1hdGNoZXMgYW5kIGxvY2F0aW5nIHRoZW0gKi8KIAkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJCW1hdGNoTG9jYXRvci5sb2NhdGVNYXRjaGVzKGluZGV4TWF0Y2hlcyk7Ci0JCQotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkKLQkJbWF0Y2hMb2NhdG9yLmxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnModGhpcyk7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I3NlbGVjdEluZGV4ZXMob3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFF1ZXJ5LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoQ29udGV4dCkKIAkgKi8KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKAotCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sCi0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCi0JCWlmICh0aGlzLmluZGV4U2VsZWN0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5pbmRleFNlbGVjdG9yID0gbmV3IEluZGV4U2VsZWN0b3Ioc2NvcGUsIHBhdHRlcm4pOworCXB1YmxpYyBJUGF0aFtdIHNlbGVjdEluZGV4ZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7CisKKwkJSW5kZXhTZWxlY3RvciBzZWxlY3RvciA9IChJbmRleFNlbGVjdG9yKSB0aGlzLmluZGV4U2VsZWN0b3IuZ2V0KCk7CisJCWlmIChzZWxlY3RvciA9PSBudWxsKSB7CisJCQlzZWxlY3RvciA9IG5ldyBJbmRleFNlbGVjdG9yKHNjb3BlLCBwYXR0ZXJuKTsKKwkJCXRoaXMuaW5kZXhTZWxlY3Rvci5zZXQoc2VsZWN0b3IpOwogCQl9Ci0JCXJldHVybiB0aGlzLmluZGV4U2VsZWN0b3IuZ2V0SW5kZXhMb2NhdGlvbnMoKTsKKwkJcmV0dXJuIHNlbGVjdG9yLmdldEluZGV4TG9jYXRpb25zKCk7CiAJfQotCQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoU2NvcGUuamF2YQppbmRleCA4ZDljZGMzLi42MTdkOGM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaFNjb3BlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CkBAIC0zMSwyNCArMzIsMjYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkV4dGVybmFsRm9sZGVyc01hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiAvKioKICAqIEEgSmF2YS1zcGVjaWZpYyBzY29wZSBmb3Igc2VhcmNoaW5nIHJlbGF0aXZlIHRvIG9uZSBvciBtb3JlIGphdmEgZWxlbWVudHMuCiAgKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoU2NvcGUgZXh0ZW5kcyBBYnN0cmFjdFNlYXJjaFNjb3BlIHsKLQkKK3B1YmxpYyBjbGFzcyBKYXZhU2VhcmNoU2NvcGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFTZWFyY2hTY29wZSB7CisKIAlwcml2YXRlIEFycmF5TGlzdCBlbGVtZW50czsKIAotCS8qIFRoZSBwYXRocyBvZiB0aGUgcmVzb3VyY2VzIGluIHRoaXMgc2VhcmNoIHNjb3BlIAotCSAgICAob3IgdGhlIGNsYXNzcGF0aCBlbnRyaWVzJyBwYXRocyBpZiB0aGUgcmVzb3VyY2VzIGFyZSBwcm9qZWN0cykgCisJLyogVGhlIHBhdGhzIG9mIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBzZWFyY2ggc2NvcGUKKwkgICAgKG9yIHRoZSBjbGFzc3BhdGggZW50cmllcycgcGF0aHMgaWYgdGhlIHJlc291cmNlcyBhcmUgcHJvamVjdHMpCiAJKi8KLQlwcml2YXRlIEFycmF5TGlzdCBwcm9qZWN0UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGNvbnRhaW5lciBwYXRocyBwcm9qZWN0cyAKKwlwcml2YXRlIEFycmF5TGlzdCBwcm9qZWN0UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGNvbnRhaW5lciBwYXRocyBwcm9qZWN0cwogCXByaXZhdGUgaW50W10gcHJvamVjdEluZGV4ZXM7IC8vIEluZGV4ZXMgb2YgcHJvamVjdHMgaW4gbGlzdAogCXByaXZhdGUgU3RyaW5nW10gY29udGFpbmVyUGF0aHM7IC8vIHBhdGggdG8gdGhlIGNvbnRhaW5lciAoZS5nLiAvUC9zcmMsIC9QL2xpYi5qYXIsIGM6XHRlbXBcbXlsaWIuamFyKQogCXByaXZhdGUgU3RyaW5nW10gcmVsYXRpdmVQYXRoczsgLy8gcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyIChlLmcuIHgveS9aLmNsYXNzLCB4L3ksIChlbXB0eSkpCkBAIC01Niw5ICs1OSw5IEBACiAJcHJvdGVjdGVkIEFjY2Vzc1J1bGVTZXRbXSBwYXRoUmVzdHJpY3Rpb25zOwogCXByaXZhdGUgaW50IHBhdGhzQ291bnQ7CiAJcHJpdmF0ZSBpbnQgdGhyZXNob2xkOwotCQorCiAJcHJpdmF0ZSBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKLQlwdWJsaWMgZmluYWwgc3RhdGljIEFjY2Vzc1J1bGVTZXQgTk9UX0VOQ0xPU0VEID0gbmV3IEFjY2Vzc1J1bGVTZXQobnVsbCwgbnVsbCk7CisJcHVibGljIGZpbmFsIHN0YXRpYyBBY2Nlc3NSdWxlU2V0IE5PVF9FTkNMT1NFRCA9IG5ldyBBY2Nlc3NSdWxlU2V0KG51bGwsIChieXRlKSAwLCBudWxsKTsKIAogcHVibGljIEphdmFTZWFyY2hTY29wZSgpIHsKIAl0aGlzKDUpOwpAQCAtNjYsMTEgKzY5LDExIEBACiAKIHByaXZhdGUgSmF2YVNlYXJjaFNjb3BlKGludCBzaXplKSB7CiAJaW5pdGlhbGl6ZShzaXplKTsKLQkKKwogCS8vZGlzYWJsZWQgZm9yIG5vdyBhcyB0aGlzIGNvdWxkIGJlIGV4cGVuc2l2ZQogCS8vSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtZW1iZXJTY29wZSh0aGlzKTsKIH0KLQkKKwogcHJpdmF0ZSB2b2lkIGFkZEVuY2xvc2luZ1Byb2plY3RPckphcihJUGF0aCBwYXRoKSB7CiAJaW50IGxlbmd0aCA9IHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzLmxlbmd0aDsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC04NywxMCArOTAsMTAgQEAKIAogLyoqCiAgKiBBZGQgamF2YSBwcm9qZWN0IGFsbCBmcmFnbWVudCByb290cyB0byBjdXJyZW50IGphdmEgc2VhcmNoIHNjb3BlLgotICogQHNlZSAjYWRkKEphdmFQcm9qZWN0LCBJUGF0aCwgaW50LCBIYXNoU2V0LCBJQ2xhc3NwYXRoRW50cnkpCisgKiBAc2VlICNhZGQoSmF2YVByb2plY3QsIElQYXRoLCBpbnQsIEhhc2hTZXQsIEhhc2hTZXQsIElDbGFzc3BhdGhFbnRyeSkKICAqLwotcHVibGljIHZvaWQgYWRkKEphdmFQcm9qZWN0IHByb2plY3QsIGludCBpbmNsdWRlTWFzaywgSGFzaFNldCB2aXNpdGVkUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYWRkKHByb2plY3QsIG51bGwsIGluY2x1ZGVNYXNrLCB2aXNpdGVkUHJvamVjdCwgbnVsbCk7CitwdWJsaWMgdm9pZCBhZGQoSmF2YVByb2plY3QgcHJvamVjdCwgaW50IGluY2x1ZGVNYXNrLCBIYXNoU2V0IHByb2plY3RzVG9CZUFkZGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlhZGQocHJvamVjdCwgbnVsbCwgaW5jbHVkZU1hc2ssIHByb2plY3RzVG9CZUFkZGVkLCBuZXcgSGFzaFNldCgyKSwgbnVsbCk7CiB9CiAvKioKICAqIEFkZCBhIHBhdGggdG8gY3VycmVudCBqYXZhIHNlYXJjaCBzY29wZSBvciBhbGwgcHJvamVjdCBmcmFnbWVudCByb290cyBpZiBudWxsLgpAQCAtOTksMTcgKzEwMiwxOCBAQAogICogQHBhcmFtIGphdmFQcm9qZWN0IFByb2plY3QgdXNlZCB0byBnZXQgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJpZXMKICAqIEBwYXJhbSBwYXRoVG9BZGQgUGF0aCB0byBhZGQgaW4gY2FzZSBvZiBzaW5nbGUgZWxlbWVudCBvciBudWxsIGlmIHVzZXIgd2FudCB0byBhZGQgYWxsIHByb2plY3QgcGFja2FnZSBmcmFnbWVudCByb290cwogICogQHBhcmFtIGluY2x1ZGVNYXNrIE1hc2sgdG8gYXBwbHkgb24gY2xhc3NwYXRoIGVudHJpZXMKLSAqIEBwYXJhbSB2aXNpdGVkUHJvamVjdHMgU2V0IHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbgorICogQHBhcmFtIHByb2plY3RzVG9CZUFkZGVkIFNldCB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24KKyAqIEBwYXJhbSB2aXNpdGVkUHJvamVjdHMgU2V0IHRvIGF2b2lkIGFkZGluZyB0d2ljZSB0aGUgc2FtZSBwcm9qZWN0CiAgKiBAcGFyYW0gcmVmZXJyaW5nRW50cnkgUHJvamVjdCByYXcgZW50cnkgaW4gcmVmZXJyaW5nIHByb2plY3QgY2xhc3NwYXRoCi0gKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBNYXkgaGFwcGVuIHdoaWxlIGdldHRpbmcgamF2YSBtb2RlbCBpbmZvIAorICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gTWF5IGhhcHBlbiB3aGlsZSBnZXR0aW5nIGphdmEgbW9kZWwgaW5mbwogICovCi12b2lkIGFkZChKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVBhdGggcGF0aFRvQWRkLCBpbnQgaW5jbHVkZU1hc2ssIEhhc2hTZXQgdmlzaXRlZFByb2plY3RzLCBJQ2xhc3NwYXRoRW50cnkgcmVmZXJyaW5nRW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewordm9pZCBhZGQoSmF2YVByb2plY3QgamF2YVByb2plY3QsIElQYXRoIHBhdGhUb0FkZCwgaW50IGluY2x1ZGVNYXNrLCBIYXNoU2V0IHByb2plY3RzVG9CZUFkZGVkLCBIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cywgSUNsYXNzcGF0aEVudHJ5IHJlZmVycmluZ0VudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwogCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSB8fCAhdmlzaXRlZFByb2plY3RzLmFkZChwcm9qZWN0KSkgcmV0dXJuOwogCiAJSVBhdGggcHJvamVjdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7CiAJU3RyaW5nIHByb2plY3RQYXRoU3RyaW5nID0gcHJvamVjdFBhdGgudG9TdHJpbmcoKTsKLQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihwcm9qZWN0UGF0aCk7CisJYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHByb2plY3RQYXRoKTsKIAogCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOwogCUlKYXZhTW9kZWwgbW9kZWwgPSBqYXZhUHJvamVjdC5nZXRKYXZhTW9kZWwoKTsKQEAgLTEyMSw3ICsxMjUsOSBAQAogCQlpZiAocmVmZXJyaW5nRW50cnkgIT0gbnVsbCkgewogCQkJLy8gQWRkIG9ubHkgZXhwb3J0ZWQgZW50cmllcy4KIAkJCS8vIFNvdXJjZSBmb2xkZXIgYXJlIGltcGxpY2l0bHkgZXhwb3J0ZWQuCi0JCQlpZiAoIWVudHJ5LmlzRXhwb3J0ZWQoKSAmJiBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgY29udGludWU7CisJCQlpZiAoIWVudHJ5LmlzRXhwb3J0ZWQoKSAmJiBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY3BFbnRyeSA9IGNwRW50cnkuY29tYmluZVdpdGgoKENsYXNzcGF0aEVudHJ5KXJlZmVycmluZ0VudHJ5KTsKIC8vCQkJCWNwRW50cnkgPSAoKENsYXNzcGF0aEVudHJ5KXJlZmVycmluZ0VudHJ5KS5jb21iaW5lV2l0aChjcEVudHJ5KTsKIAkJfQpAQCAtMTM0LDI5ICsxNDAsNDMgQEAKIAkJCQkJcmF3RW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSByb290UGF0aFRvUmF3RW50cmllcy5nZXQoZW50cnkuZ2V0UGF0aCgpKTsKIAkJCQl9CiAJCQkJaWYgKHJhd0VudHJ5ID09IG51bGwpIGJyZWFrOwotCQkJCXN3aXRjaCAocmF3RW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCQlyYXdLaW5kOiBzd2l0Y2ggKHJhd0VudHJ5LmdldEVudHJ5S2luZCgpKSB7CiAJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgogCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6CiAJCQkJCQlpZiAoKGluY2x1ZGVNYXNrICYgQVBQTElDQVRJT05fTElCUkFSSUVTKSAhPSAwKSB7CiAJCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKIAkJCQkJCQlpZiAocGF0aFRvQWRkID09IG51bGwgfHwgcGF0aFRvQWRkLmVxdWFscyhwYXRoKSkgeworCQkJCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLCBmYWxzZS8qZG9uJ3QgY2hlY2sgZXhpc3RlbmNlKi8pOworCQkJCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlcikgLy8gY2FzZSBvZiBhbiBleHRlcm5hbCBmb2xkZXIKKwkJCQkJCQkJCXBhdGggPSAoKElGb2xkZXIpIHRhcmdldCkuZ2V0RnVsbFBhdGgoKTsKIAkJCQkJCQkJU3RyaW5nIHBhdGhUb1N0cmluZyA9IHBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCA/IHBhdGgudG9TdHJpbmcoKSA6IHBhdGgudG9PU1N0cmluZygpOwogCQkJCQkJCQlhZGQocHJvamVjdFBhdGgudG9TdHJpbmcoKSwgIiIsIHBhdGhUb1N0cmluZywgZmFsc2UvKm5vdCBhIHBhY2thZ2UqLywgYWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlhZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocGF0aCk7CisJCQkJCQkJCWFkZEVuY2xvc2luZ1Byb2plY3RPckphcihlbnRyeS5nZXRQYXRoKCkpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgogCQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIocmF3RW50cnkuZ2V0UGF0aCgpLCBqYXZhUHJvamVjdCk7CiAJCQkJCQlpZiAoY29udGFpbmVyID09IG51bGwpIGJyZWFrOwotCQkJCQkJaWYgKChjb250YWluZXIuZ2V0S2luZCgpID09IElDbGFzc3BhdGhDb250YWluZXIuS19BUFBMSUNBVElPTiAmJiAoaW5jbHVkZU1hc2sgJiBBUFBMSUNBVElPTl9MSUJSQVJJRVMpICE9IDApCi0JCQkJCQkJCXx8IChpbmNsdWRlTWFzayAmIFNZU1RFTV9MSUJSQVJJRVMpICE9IDApIHsKLQkJCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQkJCWlmIChwYXRoVG9BZGQgPT0gbnVsbCB8fCBwYXRoVG9BZGQuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXRoVG9TdHJpbmcgPSBwYXRoLmdldERldmljZSgpID09IG51bGwgPyBwYXRoLnRvU3RyaW5nKCkgOiBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCQkJCQkJYWRkKHByb2plY3RQYXRoLnRvU3RyaW5nKCksICIiLCBwYXRoVG9TdHJpbmcsIGZhbHNlLypub3QgYSBwYWNrYWdlKi8sIGFjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHBhdGgpOwotCQkJCQkJCX0KKwkJCQkJCXN3aXRjaCAoY29udGFpbmVyLmdldEtpbmQoKSkgeworCQkJCQkJCWNhc2UgSUNsYXNzcGF0aENvbnRhaW5lci5LX0FQUExJQ0FUSU9OOgorCQkJCQkJCQlpZiAoKGluY2x1ZGVNYXNrICYgQVBQTElDQVRJT05fTElCUkFSSUVTKSA9PSAwKSBicmVhayByYXdLaW5kOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElDbGFzc3BhdGhDb250YWluZXIuS19TWVNURU06CisJCQkJCQkJY2FzZSBJQ2xhc3NwYXRoQ29udGFpbmVyLktfREVGQVVMVF9TWVNURU06CisJCQkJCQkJCWlmICgoaW5jbHVkZU1hc2sgJiBTWVNURU1fTElCUkFSSUVTKSA9PSAwKSBicmVhayByYXdLaW5kOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlicmVhayByYXdLaW5kOworCQkJCQkJfQorCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCWlmIChwYXRoVG9BZGQgPT0gbnVsbCB8fCBwYXRoVG9BZGQuZXF1YWxzKHBhdGgpKSB7CisJCQkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocGF0aCwgZmFsc2UvKmRvbid0IGNoZWNrIGV4aXN0ZW5jZSovKTsKKwkJCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlcikgLy8gY2FzZSBvZiBhbiBleHRlcm5hbCBmb2xkZXIKKwkJCQkJCQkJcGF0aCA9ICgoSUZvbGRlcikgdGFyZ2V0KS5nZXRGdWxsUGF0aCgpOworCQkJCQkJCVN0cmluZyBwYXRoVG9TdHJpbmcgPSBwYXRoLmdldERldmljZSgpID09IG51bGwgPyBwYXRoLnRvU3RyaW5nKCkgOiBwYXRoLnRvT1NTdHJpbmcoKTsKKwkJCQkJCQlhZGQocHJvamVjdFBhdGgudG9TdHJpbmcoKSwgIiIsIHBhdGhUb1N0cmluZywgZmFsc2UvKm5vdCBhIHBhY2thZ2UqLywgYWNjZXNzKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWFkZEVuY2xvc2luZ1Byb2plY3RPckphcihlbnRyeS5nZXRQYXRoKCkpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMTY1LDcgKzE4NSwxMCBAQAogCQkJCWlmICgoaW5jbHVkZU1hc2sgJiBSRUZFUkVOQ0VEX1BST0pFQ1RTKSAhPSAwKSB7CiAJCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CiAJCQkJCWlmIChwYXRoVG9BZGQgPT0gbnVsbCB8fCBwYXRoVG9BZGQuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQlhZGQoKEphdmFQcm9qZWN0KSBtb2RlbC5nZXRKYXZhUHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSksIG51bGwsIGluY2x1ZGVNYXNrLCB2aXNpdGVkUHJvamVjdHMsIGNwRW50cnkpOworCQkJCQkJSmF2YVByb2plY3QgcmVmZXJlbmNlZFByb2plY3QgPSAoSmF2YVByb2plY3QpIG1vZGVsLmdldEphdmFQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSk7CisJCQkJCQlpZiAoIXByb2plY3RzVG9CZUFkZGVkLmNvbnRhaW5zKHJlZmVyZW5jZWRQcm9qZWN0KSkgeyAvLyBkbyBub3QgcmVjdXJzZSBpZiBkZXBlbmRpbmcgcHJvamVjdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHNjb3BlCisJCQkJCQkJYWRkKHJlZmVyZW5jZWRQcm9qZWN0LCBudWxsLCBpbmNsdWRlTWFzaywgcHJvamVjdHNUb0JlQWRkZWQsIHZpc2l0ZWRQcm9qZWN0cywgY3BFbnRyeSk7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0xODgsMjAgKzIxMSwyMSBAQAogcHVibGljIHZvaWQgYWRkKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlJUGF0aCBjb250YWluZXJQYXRoID0gbnVsbDsKIAlTdHJpbmcgY29udGFpbmVyUGF0aFRvU3RyaW5nID0gbnVsbDsKKwlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOwogCWludCBpbmNsdWRlTWFzayA9IFNPVVJDRVMgfCBBUFBMSUNBVElPTl9MSUJSQVJJRVMgfCBTWVNURU1fTElCUkFSSUVTOwogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CiAJCQkvLyBhIHdvcmtzcGFjZSBzb3BlIHNob3VsZCBiZSB1c2VkCi0JCQlicmVhazsgCisJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgotCQkJYWRkKChKYXZhUHJvamVjdCllbGVtZW50LCBudWxsLCBpbmNsdWRlTWFzaywgbmV3IEhhc2hTZXQoMiksIG51bGwpOworCQkJYWRkKChKYXZhUHJvamVjdCllbGVtZW50LCBudWxsLCBpbmNsdWRlTWFzaywgbmV3IEhhc2hTZXQoMiksIG5ldyBIYXNoU2V0KDIpLCBudWxsKTsKIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7Ci0JCQlJUGF0aCByb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQkJcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7CisJCQlJUGF0aCByb290UGF0aCA9IHJvb3QuaW50ZXJuYWxQYXRoKCk7CiAJCQljb250YWluZXJQYXRoID0gcm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgPyByb290LmdldFBhcmVudCgpLmdldFBhdGgoKSA6IHJvb3RQYXRoOwogCQkJY29udGFpbmVyUGF0aFRvU3RyaW5nID0gY29udGFpbmVyUGF0aC5nZXREZXZpY2UoKSA9PSBudWxsID8gY29udGFpbmVyUGF0aC50b1N0cmluZygpIDogY29udGFpbmVyUGF0aC50b09TU3RyaW5nKCk7Ci0JCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcm9vdC5nZXRSZXNvdXJjZSgpOworCQkJSVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IHJvb3QucmVzb3VyY2UoKTsKIAkJCVN0cmluZyBwcm9qZWN0UGF0aCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKIAkJCWlmIChyb290UmVzb3VyY2UgIT0gbnVsbCAmJiByb290UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKIAkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gVXRpbC5yZWxhdGl2ZVBhdGgocm9vdFJlc291cmNlLmdldEZ1bGxQYXRoKCksIGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkpOwpAQCAtMjExLDcgKzIzNSw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCXJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCXJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50LmdldFBhcmVudCgpOwogCQkJcHJvamVjdFBhdGggPSByb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CiAJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewogCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSBVdGlsLmNvbmNhdFdpdGgoKChQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQpLm5hbWVzLCAnLycpOwpAQCAtMjE5LDEwICsyNDMsMTAgQEAKIAkJCQljb250YWluZXJQYXRoVG9TdHJpbmcgPSBjb250YWluZXJQYXRoLmdldERldmljZSgpID09IG51bGwgPyBjb250YWluZXJQYXRoLnRvU3RyaW5nKCkgOiBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKIAkJCQlhZGQocHJvamVjdFBhdGgsIHJlbGF0aXZlUGF0aCwgY29udGFpbmVyUGF0aFRvU3RyaW5nLCB0cnVlLypwYWNrYWdlKi8sIG51bGwpOwogCQkJfSBlbHNlIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gKChKYXZhRWxlbWVudCkgZWxlbWVudCkucmVzb3VyY2UoKTsKIAkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewogCQkJCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCWNvbnRhaW5lclBhdGggPSByb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSA/IHJvb3QuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpIDogcm9vdC5nZXRQYXRoKCk7CisJCQkJCQljb250YWluZXJQYXRoID0gcm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgPyByb290LmdldFBhcmVudCgpLmdldFBhdGgoKSA6IHJvb3QuaW50ZXJuYWxQYXRoKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQkvLyBmb3Igd29ya2luZyBjb3BpZXMsIGdldCByZXNvdXJjZSBjb250YWluZXIgZnVsbCBwYXRoCiAJCQkJCQljb250YWluZXJQYXRoID0gcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKTsKQEAgLTI0MSwyMiArMjY1LDIyIEBACiAJCQkJfQogCQkJCXRoaXMuZWxlbWVudHMuYWRkKGVsZW1lbnQpOwogCQkJfQotCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKKwkJCXJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKIAkJCXByb2plY3RQYXRoID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFBhdGgoKS50b1N0cmluZygpOwogCQkJU3RyaW5nIHJlbGF0aXZlUGF0aDsKIAkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewogCQkJCWNvbnRhaW5lclBhdGggPSByb290LmdldFBhcmVudCgpLmdldFBhdGgoKTsKLQkJCQlyZWxhdGl2ZVBhdGggPSBVdGlsLnJlbGF0aXZlUGF0aChnZXRQYXRoKGVsZW1lbnQsIGZhbHNlLypmdWxsIHBhdGgqLyksIDEvKnJlbW92ZSBwcm9qZWN0IHNlZ21ldCovKTsKKwkJCQlyZWxhdGl2ZVBhdGggPSBVdGlsLnJlbGF0aXZlUGF0aChnZXRQYXRoKGVsZW1lbnQsIGZhbHNlLypmdWxsIHBhdGgqLyksIDEvKnJlbW92ZSBwcm9qZWN0IHNlZ21lbnQqLyk7CiAJCQl9IGVsc2UgewotCQkJCWNvbnRhaW5lclBhdGggPSByb290LmdldFBhdGgoKTsKKwkJCQljb250YWluZXJQYXRoID0gcm9vdC5pbnRlcm5hbFBhdGgoKTsKIAkJCQlyZWxhdGl2ZVBhdGggPSBnZXRQYXRoKGVsZW1lbnQsIHRydWUvKnJlbGF0aXZlIHBhdGgqLykudG9TdHJpbmcoKTsKIAkJCX0KIAkJCWNvbnRhaW5lclBhdGhUb1N0cmluZyA9IGNvbnRhaW5lclBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCA/IGNvbnRhaW5lclBhdGgudG9TdHJpbmcoKSA6IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwogCQkJYWRkKHByb2plY3RQYXRoLCByZWxhdGl2ZVBhdGgsIGNvbnRhaW5lclBhdGhUb1N0cmluZywgZmFsc2UvKm5vdCBhIHBhY2thZ2UqLywgbnVsbCk7CiAJfQotCQotCWlmIChjb250YWluZXJQYXRoICE9IG51bGwpCi0JCWFkZEVuY2xvc2luZ1Byb2plY3RPckphcihjb250YWluZXJQYXRoKTsKKworCWlmIChyb290ICE9IG51bGwpCisJCWFkZEVuY2xvc2luZ1Byb2plY3RPckphcihyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSA/IHJvb3QuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpIDogcm9vdC5nZXRQYXRoKCkpOwogfQogCiAvKioKQEAgLTI5OSwxNSArMzIzLDE1IEBACiAJCXJlaGFzaCgpOwogfQogCi0vKiAKKy8qCiAgKiBFLmcuCi0gKiAKKyAqCiAgKiAxLiAvUC9zcmMvcGtnL1guamF2YQogICogMi4gL1Avc3JjL3BrZwogICogMy4gL1AvbGliLmphcnxvcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnQuY2xhc3MKICAqIDQuIC9ob21lL215bGliLmphcnx4L3kvei9YLmNsYXNzCiAgKiA1LiBjOlx0ZW1wXG15bGliLmphcnx4L3kvWS5jbGFzcwotICogCisgKgogICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2VzKFN0cmluZykKICAqLwogcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgewpAQCAtMzI1LDcgKzM0OSw3IEBACiAvKioKICAqIFJldHVybnMgcGF0aHMgbGlzdCBpbmRleCBvZiBnaXZlbiBwYXRoIG9yIC0xIGlmIG5vdCBmb3VuZC4KICAqIE5PVEU6IFVzZSBpbmRleE9mKFN0cmluZywgU3RyaW5nKSBmb3IgcGF0aCBpbnNpZGUgamFycwotICogCisgKgogICogQHBhcmFtIGZ1bGxQYXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJlc291cmNlLCBlLmcuCiAgKiAgIDEuIC9QL3NyYy9wa2cvWC5qYXZhCiAgKiAgIDIuIC9QL3NyYy9wa2cKQEAgLTM4Miw3ICs0MDYsNyBAQAogcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzKFN0cmluZyBlbmNsb3NpbmdQYXRoLCBTdHJpbmcgcGF0aCwgaW50IGluZGV4KSB7CiAJLy8gbm9ybWFsaXplIGdpdmVuIHBhdGggYXMgaXQgY2FuIGNvbWUgZnJvbSBvdXRzaWRlCiAJcGF0aCA9IG5vcm1hbGl6ZShwYXRoKTsKLQkKKwogCWludCBwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKIAlpbnQgZW5jbG9zaW5nTGVuZ3RoID0gZW5jbG9zaW5nUGF0aC5sZW5ndGgoKTsKIAlpZiAocGF0aExlbmd0aCA8IGVuY2xvc2luZ0xlbmd0aCkgewpAQCAtMzk4LDEwICs0MjIsMTAgQEAKIAkJcmV0dXJuIHBhdGguc3RhcnRzV2l0aChlbmNsb3NpbmdQYXRoKQogCQkJJiYgcGF0aC5jaGFyQXQoZW5jbG9zaW5nTGVuZ3RoKSA9PSAnLyc7CiAJfSBlbHNlIHsKLQkJLy8gaWYgbG9va2luZyBhdCBhIHBhY2thZ2UsIHRoaXMgc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHBhdGggCisJCS8vIGlmIGxvb2tpbmcgYXQgYSBwYWNrYWdlLCB0aGlzIHNjb3BlIGVuY2xvc2VzIHRoZSBnaXZlbiBwYXRoCiAJCS8vIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBmb2xkZXIKIAkJLy8gb3IgaWYgdGhlIGdpdmVuIHBhdGggcGF0aCBpcyB0aGUgZm9sZGVyIHBhdGggKHNlZSBidWcgMTM5MTkgRGVjbGFyYXRpb24gZm9yIHBhY2thZ2Ugbm90IGZvdW5kIGlmIHNjb3BlIGlzIG5vdCBwcm9qZWN0KQotCQlpZiAocGF0aC5zdGFydHNXaXRoKGVuY2xvc2luZ1BhdGgpIAorCQlpZiAocGF0aC5zdGFydHNXaXRoKGVuY2xvc2luZ1BhdGgpCiAJCQkmJiAoKGVuY2xvc2luZ1BhdGgubGVuZ3RoKCkgPT0gcGF0aC5sYXN0SW5kZXhPZignLycpKQogCQkJCXx8IChlbmNsb3NpbmdQYXRoLmxlbmd0aCgpID09IHBhdGgubGVuZ3RoKCkpKSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC01MTUsMTMgKzUzOSwxMyBAQAogLyoKICAqIEBzZWUgQWJzdHJhY3RTZWFyY2hTY29wZSNwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEpCiAgKi8KLXB1YmxpYyB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBpbnQgZXZlbnRUeXBlKSB7CiAJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKIAkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgogCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCUlKYXZhRWxlbWVudERlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJdGhpcy5wcm9jZXNzRGVsdGEoY2hpbGQpOworCQkJCXByb2Nlc3NEZWx0YShjaGlsZCwgZXZlbnRUeXBlKTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ6CkBAIC01MjksMjYgKzU1MywyNCBAQAogCQkJaWYgKHRoaXMuZW5jbG9zZXMoZWxlbWVudCkpIHsKIAkJCQlpZiAodGhpcy5lbGVtZW50cyAhPSBudWxsKSB7CiAJCQkJCXRoaXMuZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gCi0JCQkJSVBhdGggcGF0aCA9IG51bGw7CisJCQkJfQorCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKIAkJCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewogCQkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkJCQlwYXRoID0gKChJSmF2YVByb2plY3QpZWxlbWVudCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7CisJCQkJCQlwYXRoID0gKChJSmF2YVByb2plY3QpZWxlbWVudCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6Ci0JCQkJCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJCQkJcGF0aCA9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0UGF0aCgpOwotCQkJCQkJfQotCQkJCQkJaW50IHRvUmVtb3ZlID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGF0aHNDb3VudDsgaSsrKSB7Ci0JCQkJCQkJaWYgKHRoaXMucmVsYXRpdmVQYXRoc1tpXS5lcXVhbHMocGF0aCkpIHsgLy8gVE9ETyAoamVyb21lKSB0aGlzIGNvbXBhcmVzIFN0cmluZyBhbmQgSVBhdGggIQotCQkJCQkJCQl0b1JlbW92ZSA9IGk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICh0b1JlbW92ZSAhPSAtMSkgewotCQkJCQkJCXRoaXMucmVsYXRpdmVQYXRoc1t0b1JlbW92ZV0gPSBudWxsOwotCQkJCQkJCXJlaGFzaCgpOwotCQkJCQkJfQorCQkJCQkJcGF0aCA9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnBhdGhzQ291bnQ7IGkrKykgeworCQkJCQlpZiAodGhpcy5yZWxhdGl2ZVBhdGhzW2ldLmVxdWFscyhwYXRoKSkgeworCQkJCQkJdGhpcy5yZWxhdGl2ZVBhdGhzW2ldID0gbnVsbDsKKwkJCQkJCXJlaGFzaCgpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKQEAgLTU1Niw0MCArNTc4LDM3IEBACiB9CiAKIC8qKgotICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiByZXNvdXJjZSBwYXRoLgotICogCi0gKiBAcGFyYW0gcmVzb3VyY2VQYXRoU3RyaW5nIHBhdGggb2YgZXhwZWN0ZWQgcGFja2FnZSBmcmFnbWVudCByb290LgotICogQHJldHVybiB0aGUge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2UgZnJhZ21lbnQgcm9vdH0gd2hpY2ggcGF0aAotICogCW1hdGNoIHRoZSBnaXZlbiBvbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3YXMgZm91bmQuCisgKiBAc2VlIEFic3RyYWN0SmF2YVNlYXJjaFNjb3BlI3BhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nLCBpbnQsIFN0cmluZykKICAqLwotcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgeworcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZywgaW50IGphclNlcGFyYXRvckluZGV4LCBTdHJpbmcgamFyUGF0aCkgewogCWludCBpbmRleCA9IC0xOwotCWludCBzZXBhcmF0b3JJbmRleCA9IHJlc291cmNlUGF0aFN0cmluZy5pbmRleE9mKEpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUik7Ci0JYm9vbGVhbiBpc0phckZpbGUgPSBzZXBhcmF0b3JJbmRleCAhPSAtMTsKKwlib29sZWFuIGlzSmFyRmlsZSA9IGphclNlcGFyYXRvckluZGV4ICE9IC0xOwogCWlmIChpc0phckZpbGUpIHsKIAkJLy8gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgamFyIChjYXNlIDMsIDQsIG9yIDUpCi0JCVN0cmluZyBqYXJQYXRoID0gcmVzb3VyY2VQYXRoU3RyaW5nLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSByZXNvdXJjZVBhdGhTdHJpbmcuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4KzEpOworCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzb3VyY2VQYXRoU3RyaW5nLnN1YnN0cmluZyhqYXJTZXBhcmF0b3JJbmRleCsxKTsKIAkJaW5kZXggPSBpbmRleE9mKGphclBhdGgsIHJlbGF0aXZlUGF0aCk7CiAJfSBlbHNlIHsKIAkJLy8gcmVzb3VyY2UgaW4gd29ya3NwYWNlIChjYXNlIDEgb3IgMikKIAkJaW5kZXggPSBpbmRleE9mKHJlc291cmNlUGF0aFN0cmluZyk7CiAJfQogCWlmIChpbmRleCA+PSAwKSB7Ci0JCWludCBpZHggPSBwcm9qZWN0SW5kZXhlc1tpbmRleF07CisJCWludCBpZHggPSB0aGlzLnByb2plY3RJbmRleGVzW2luZGV4XTsKIAkJU3RyaW5nIHByb2plY3RQYXRoID0gaWR4ID09IC0xID8gbnVsbCA6IChTdHJpbmcpIHRoaXMucHJvamVjdFBhdGhzLmdldChpZHgpOwogCQlpZiAocHJvamVjdFBhdGggIT0gbnVsbCkgewogCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPUphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdFBhdGgpKTsKLQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIG5ldyBQYXRoKHRoaXMuY29udGFpbmVyUGF0aHNbaW5kZXhdKycvJyt0aGlzLnJlbGF0aXZlUGF0aHNbaW5kZXhdKSwgZmFsc2UpOwotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgoSVByb2plY3QpIHRhcmdldCk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoKElSZXNvdXJjZSl0YXJnZXQpOwotCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCQl9CiAJCQlpZiAoaXNKYXJGaWxlKSB7Ci0JCQkJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmNvbnRhaW5lclBhdGhzW2luZGV4XSk7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gSmF2YU1vZGVsLmdldFdvcmtzcGFjZVRhcmdldChuZXcgUGF0aChqYXJQYXRoKSk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwpCisJCQkJCXJldHVybiBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UpOworCQkJCXJldHVybiBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyUGF0aCk7CisJCQl9CisJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFdvcmtzcGFjZVRhcmdldChuZXcgUGF0aCh0aGlzLmNvbnRhaW5lclBhdGhzW2luZGV4XSsnLycrdGhpcy5yZWxhdGl2ZVBhdGhzW2luZGV4XSkpOworCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCXJldHVybiBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElQcm9qZWN0KSB0YXJnZXQpOworCQkJCX0KKwkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFNb2RlbE1hbmFnZXIuY3JlYXRlKChJUmVzb3VyY2UpIHRhcmdldCwgcHJvamVjdCk7CisJCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKIAkJCX0KIAkJfQogCX0KQEAgLTYwMCw3ICs2MTksNyBAQAogCUphdmFTZWFyY2hTY29wZSBuZXdTY29wZSA9IG5ldyBKYXZhU2VhcmNoU2NvcGUodGhpcy5wYXRoc0NvdW50ICogMik7CQkvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cwogCW5ld1Njb3BlLnByb2plY3RQYXRocy5lbnN1cmVDYXBhY2l0eSh0aGlzLnByb2plY3RQYXRocy5zaXplKCkpOwogCVN0cmluZyBjdXJyZW50UGF0aDsKLQlmb3IgKGludCBpID0gdGhpcy5yZWxhdGl2ZVBhdGhzLmxlbmd0aDsgLS1pID49IDA7KQorCWZvciAoaW50IGk9MCwgbGVuZ3RoPXRoaXMucmVsYXRpdmVQYXRocy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspCiAJCWlmICgoY3VycmVudFBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aHNbaV0pICE9IG51bGwpIHsKIAkJCWludCBpZHggPSB0aGlzLnByb2plY3RJbmRleGVzW2ldOwogCQkJU3RyaW5nIHByb2plY3RQYXRoID0gaWR4ID09IC0xID8gbnVsbCA6IChTdHJpbmcpdGhpcy5wcm9qZWN0UGF0aHMuZ2V0KGlkeCk7CkBAIC02MzEsMTUgKzY1MCwyOSBAQAogCQkJcmVzdWx0LmFwcGVuZCgiW2VtcHR5IHNjb3BlXSIpOyAvLyROT04tTkxTLTEkCiAJCX0gZWxzZSB7CiAJCQlyZXN1bHQuYXBwZW5kKCJbIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1t0aGlzLnJlbGF0aXZlUGF0aHMubGVuZ3RoXTsKKwkJCWludCBpbmRleCA9IDA7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucmVsYXRpdmVQYXRocy5sZW5ndGg7IGkrKykgewogCQkJCVN0cmluZyBwYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGhzW2ldOwogCQkJCWlmIChwYXRoID09IG51bGwpIGNvbnRpbnVlOwotCQkJCXJlc3VsdC5hcHBlbmQoIlxuXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQodGhpcy5jb250YWluZXJQYXRoc1tpXSk7Ci0JCQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoJy8nKTsKLQkJCQkJcmVzdWx0LmFwcGVuZChwYXRoKTsKKwkJCQlTdHJpbmcgY29udGFpbmVyUGF0aDsKKwkJCQlpZiAoRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5pc0ludGVybmFsUGF0aEZvckV4dGVybmFsRm9sZGVyKG5ldyBQYXRoKHRoaXMuY29udGFpbmVyUGF0aHNbaV0pKSkgeworCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFdvcmtzcGFjZVRhcmdldChuZXcgUGF0aCh0aGlzLmNvbnRhaW5lclBhdGhzW2ldKSk7CisJCQkJCWNvbnRhaW5lclBhdGggPSAoKElGb2xkZXIpIHRhcmdldCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29udGFpbmVyUGF0aCA9IHRoaXMuY29udGFpbmVyUGF0aHNbaV07CiAJCQkJfQorCQkJCWlmIChwYXRoLmxlbmd0aCgpID4gMCkgeworCQkJCQlwYXRoc1tpbmRleCsrXSA9IGNvbnRhaW5lclBhdGggKyAnLycgKyBwYXRoOworCQkJCX0gZWxzZSB7CisJCQkJCXBhdGhzW2luZGV4KytdID0gY29udGFpbmVyUGF0aDsKKwkJCQl9CisJCQl9CisJCQlTeXN0ZW0uYXJyYXljb3B5KHBhdGhzLCAwLCBwYXRocyA9IG5ldyBTdHJpbmdbaW5kZXhdLCAwLCBpbmRleCk7CisJCQlVdGlsLnNvcnQocGF0aHMpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisJCQkJcmVzdWx0LmFwcGVuZCgiXG5cdCIpOyAvLyROT04tTkxTLTEkCisJCQkJcmVzdWx0LmFwcGVuZChwYXRoc1tpXSk7CiAJCQl9CiAJCQlyZXN1bHQuYXBwZW5kKCJcbl0iKTsgLy8kTk9OLU5MUy0xJAogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hUeXBlTmFtZU1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hUeXBlTmFtZU1hdGNoLmphdmEKaW5kZXggNGJkNmRiOC4uMTEwZTBlMSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoVHlwZU5hbWVNYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaFR5cGVOYW1lTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxMyArMTUsMTUgQEAKIAogLyoqCiAgKiBKYXZhIFNlYXJjaCBjb25jcmV0ZSBjbGFzcyBmb3IgYSB0eXBlIG5hbWUgbWF0Y2guCi0gKiAKKyAqCiAgKiBAc2luY2UgMy4zCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoVHlwZU5hbWVNYXRjaCBleHRlbmRzIFR5cGVOYW1lTWF0Y2ggewogCi1wcml2YXRlIElUeXBlIHR5cGU7Ci1wcml2YXRlIGludCBtb2RpZmllcnMgPSAtMTsgLy8gc3RvcmUgbW9kaWZpZXJzIHRvIGF2b2lkIGphdmEgbW9kZWwgcG9wdWxhdGlvbgorCXByaXZhdGUgSVR5cGUgdHlwZTsKKwlwcml2YXRlIGludCBtb2RpZmllcnMgPSAtMTsgLy8gc3RvcmUgbW9kaWZpZXJzIHRvIGF2b2lkIGphdmEgbW9kZWwgcG9wdWxhdGlvbgorCisJcHJpdmF0ZSBpbnQgYWNjZXNzaWJpbGl0eSA9IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRTsKIAogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IEphdmEgU2VhcmNoIHR5cGUgbmFtZSBtYXRjaC4KQEAgLTQ4LDYgKzUwLDEzIEBACiB9CiAKIC8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlR5cGVOYW1lTWF0Y2gjZ2V0QWNjZXNzaWJpbGl0eSgpCisgKi8KK3B1YmxpYyBpbnQgZ2V0QWNjZXNzaWJpbGl0eSgpIHsKKwlyZXR1cm4gdGhpcy5hY2Nlc3NpYmlsaXR5OworfQorCisvKiAobm9uLUphdmFkb2MpCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZU1hdGNoI2dldE1vZGlmaWVycygpCiAgKi8KIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewpAQCAtNzMsOCArODIsMTcgQEAKIH0KIAogLyoqCi0gKiBTZXQgbW9kaWZpZXJzIG9mIHRoZSBtYXRjaGVkIHR5cGUuCisgKiBTZXRzIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBhY2NlcHRlZCBtYXRjaC4KICAqIAorICogQHBhcmFtIGFjY2Vzc2liaWxpdHkgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGN1cnJlbnQgbWF0Y2gKKyAqLworcHVibGljIHZvaWQgc2V0QWNjZXNzaWJpbGl0eShpbnQgYWNjZXNzaWJpbGl0eSkgeworCXRoaXMuYWNjZXNzaWJpbGl0eSA9IGFjY2Vzc2liaWxpdHk7Cit9CisKKy8qKgorICogU2V0IG1vZGlmaWVycyBvZiB0aGUgbWF0Y2hlZCB0eXBlLgorICoKICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycyBvZiB0aGUgbWF0Y2hlZCB0eXBlLgogICovCiBwdWJsaWMgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgewpAQCAtODMsNyArMTAxLDcgQEAKIAogLyoqCiAgKiBTZXQgbWF0Y2hlZCB0eXBlLgotICogCisgKgogICogQHBhcmFtIHR5cGUgdGhlIG1hdGNoZWQgdHlwZS4KICAqLwogcHVibGljIHZvaWQgc2V0VHlwZShJVHlwZSB0eXBlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFXb3Jrc3BhY2VTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhV29ya3NwYWNlU2NvcGUuamF2YQppbmRleCAyY2RjZTZiLi41Mjk4ZGIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFXb3Jrc3BhY2VTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVdvcmtzcGFjZVNjb3BlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMzMgKzEwLDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5BY2Nlc3NSdWxlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkRlbHRhUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkV4dGVybmFsRm9sZGVyc01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogLyoqCiAgKiBBIEphdmEtc3BlY2lmaWMgc2NvcGUgZm9yIHNlYXJjaGluZyB0aGUgZW50aXJlIHdvcmtzcGFjZS4KICAqIFRoZSBzY29wZSBjYW4gYmUgY29uZmlndXJlZCB0byBub3Qgc2VhcmNoIGJpbmFyaWVzLiBCeSBkZWZhdWx0LCBiaW5hcmllcwogICogYXJlIGluY2x1ZGVkLgogICovCi1wdWJsaWMgY2xhc3MgSmF2YVdvcmtzcGFjZVNjb3BlIGV4dGVuZHMgSmF2YVNlYXJjaFNjb3BlIHsKK3B1YmxpYyBjbGFzcyBKYXZhV29ya3NwYWNlU2NvcGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFTZWFyY2hTY29wZSB7CiAKLXByb3RlY3RlZCBib29sZWFuIG5lZWRzSW5pdGlhbGl6ZTsKKwlwcml2YXRlIElQYXRoW10gZW5jbG9zaW5nUGF0aHMgPSBudWxsOworCitwdWJsaWMgSmF2YVdvcmtzcGFjZVNjb3BlKCkgeworCS8vIEFzIG5vdGhpbmcgaXMgc3RvcmVkIGluIHRoZSBKYXZhV29ya3NwYWNlU2NvcGUgbm93LCBubyBpbml0aWFsaXphdGlvbiBpcyBsb25nZXIgbmVlZGVkCit9CiAKIHB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JLyoKLQlpZiAodGhpcy5uZWVkc0luaXRpYWxpemUpIHsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCXJldHVybiBzdXBlci5lbmNsb3NlcyhlbGVtZW50KTsKLQkqLwogCS8qQSB3b3Jrc3BhY2Ugc2NvcGUgZW5jbG9zZXMgYWxsIGphdmEgZWxlbWVudHMgKHRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbmRleCBzZWxlY3RvcgogCSAqIGFuZCB0aHVzIGVuY2xvc2luZ1Byb2plY3RBbmRKYXJzKCkgcmV0dXJucyBpbmRleGVzIG9uIHRoZSBjbGFzc3BhdGggb25seSBhbmQgdGhhdCB0aGVzZQogCSAqIGluZGV4ZXMgYXJlIGNvbnNpc3RlbnQuKQpAQCAtNDUsMTIgKzU0LDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIHB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKLQkvKgotCWlmICh0aGlzLm5lZWRzSW5pdGlhbGl6ZSkgewotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0JcmV0dXJuIHN1cGVyLmVuY2xvc2VzKHJlc291cmNlUGF0aFN0cmluZyk7Ci0JKi8KIAkvKkEgd29ya3NwYWNlIHNjb3BlIGVuY2xvc2VzIGFsbCByZXNvdXJjZXMgKHRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbmRleCBzZWxlY3RvcgogCSAqIGFuZCB0aHVzIGVuY2xvc2luZ1Byb2plY3RBbmRKYXJzKCkgcmV0dXJucyBpbmRleGVzIG9uIHRoZSBjbGFzc3BhdGggb25seSBhbmQgdGhhdCB0aGVzZQogCSAqIGluZGV4ZXMgYXJlIGNvbnNpc3RlbnQuKQpAQCAtNTgsNDUgKzYxLDEwMyBAQAogCSAqLwogCXJldHVybiB0cnVlOwogfQorLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZSNlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKQorICovCiBwdWJsaWMgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKSB7Ci0JaWYgKHRoaXMubmVlZHNJbml0aWFsaXplKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZSg1KTsKKwlJUGF0aFtdIHJlc3VsdCA9IHRoaXMuZW5jbG9zaW5nUGF0aHM7CisJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCXJldHVybiByZXN1bHQ7CiAJfQotCXJldHVybiBzdXBlci5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKKwlsb25nIHN0YXJ0ID0gQmFzaWNTZWFyY2hFbmdpbmUuVkVSQk9TRSA/IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDogLTE7CisJdHJ5IHsKKwkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkJU2V0IHBhdGhzID0gbmV3IEhhc2hTZXQocHJvamVjdHMubGVuZ3RoICogMik7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIHByb2plY3RzW2ldOworCisJCQkvLyBBZGQgcHJvamVjdCBmdWxsIHBhdGgKKwkJCUlQYXRoIHByb2plY3RQYXRoID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7CisJCQlwYXRocy5hZGQocHJvamVjdFBhdGgpOworCisJCQkvLyBBZGQgcHJvamVjdCBsaWJyYXJpZXMgcGF0aHMKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOworCQkJZm9yIChpbnQgaiA9IDAsIGVMZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGVMZW5ndGg7IGorKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07CisJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLCBmYWxzZS8qZG9uJ3QgY2hlY2sgZXhpc3RlbmNlKi8pOworCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlcikgLy8gY2FzZSBvZiBhbiBleHRlcm5hbCBmb2xkZXIKKwkJCQkJCXBhdGggPSAoKElGb2xkZXIpIHRhcmdldCkuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJcGF0aHMuYWRkKGVudHJ5LmdldFBhdGgoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJlc3VsdCA9IG5ldyBJUGF0aFtwYXRocy5zaXplKCldOworCQlwYXRocy50b0FycmF5KHJlc3VsdCk7CisJCXJldHVybiB0aGlzLmVuY2xvc2luZ1BhdGhzID0gcmVzdWx0OworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCVV0aWwubG9nKGUsICJFeGNlcHRpb24gd2hpbGUgY29tcHV0aW5nIHdvcmtzcGFjZSBzY29wZSdzIGVuY2xvc2luZyBwcm9qZWN0cyBhbmQgamFycyIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBuZXcgSVBhdGhbMF07CisJfSBmaW5hbGx5IHsKKwkJaWYgKEJhc2ljU2VhcmNoRW5naW5lLlZFUkJPU0UpIHsKKwkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisJCQlpbnQgbGVuZ3RoID0gcmVzdWx0ID09IG51bGwgPyAwIDogcmVzdWx0Lmxlbmd0aDsKKwkJCVV0aWwudmVyYm9zZSgiSmF2YVdvcmtzcGFjZVNjb3BlLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczogIitsZW5ndGgrIiBwYXRocyBjb21wdXRlZCBpbiAiK3RpbWUrIm1zLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQl9CisJfQogfQorCiBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgcmV0dXJuIG8gaW5zdGFuY2VvZiBKYXZhV29ya3NwYWNlU2NvcGU7CisgIHJldHVybiBvID09IHRoaXM7IC8vIHVzZSB0aGUgc2luZ2xldG9uIHBhdHRlcm4KIH0KKwogcHVibGljIEFjY2Vzc1J1bGVTZXQgZ2V0QWNjZXNzUnVsZVNldChTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgY29udGFpbmVyUGF0aCkgewotCWlmICh0aGlzLnBhdGhSZXN0cmljdGlvbnMgPT0gbnVsbCkgCi0JCXJldHVybiBudWxsOwotCXJldHVybiBzdXBlci5nZXRBY2Nlc3NSdWxlU2V0KHJlbGF0aXZlUGF0aCwgY29udGFpbmVyUGF0aCk7CisJLy8gRG8gbm90IGNvbnNpZGVyIGFjY2VzcyBydWxlcyBvbiB3b3Jrc3BhY2Ugc2NvcGUKKwlyZXR1cm4gbnVsbDsKIH0KKwogcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gSmF2YVdvcmtzcGFjZVNjb3BlLmNsYXNzLmhhc2hDb2RlKCk7CiB9Ci1wdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCBzaXplKSB7Ci0Jc3VwZXIuaW5pdGlhbGl6ZShzaXplKTsKLQl0cnkgewotCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmNsdWRlTWFzayA9IFNPVVJDRVMgfCBBUFBMSUNBVElPTl9MSUJSQVJJRVMgfCBTWVNURU1fTElCUkFSSUVTOwotCQkJYWRkKChKYXZhUHJvamVjdCkgcHJvamVjdHNbaV0sIG51bGwsIGluY2x1ZGVNYXNrLCBuZXcgSGFzaFNldChsZW5ndGgqMiwgMSksIG51bGwpOworCisvKioKKyAqIEBzZWUgQWJzdHJhY3RKYXZhU2VhcmNoU2NvcGUjcGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcsIGludCwgU3RyaW5nKQorICovCitwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nLCBpbnQgamFyU2VwYXJhdG9ySW5kZXgsIFN0cmluZyBqYXJQYXRoKSB7CisJSGFzaE1hcCByb290SW5mb3MgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldERlbHRhU3RhdGUoKS5yb290czsKKwlEZWx0YVByb2Nlc3Nvci5Sb290SW5mbyByb290SW5mbyA9IG51bGw7CisJaWYgKGphclBhdGggIT0gbnVsbCkgeworCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoamFyUGF0aCk7CisJCXJvb3RJbmZvID0gKERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKSByb290SW5mb3MuZ2V0KHBhdGgpOworCX0gZWxzZSB7CisJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpOworCQlpZiAoRXh0ZXJuYWxGb2xkZXJzTWFuYWdlci5pc0ludGVybmFsUGF0aEZvckV4dGVybmFsRm9sZGVyKHBhdGgpKSB7CisJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBKYXZhTW9kZWwuZ2V0V29ya3NwYWNlVGFyZ2V0KHBhdGgudXB0b1NlZ21lbnQoMi8qbGlua2VkIGZvbGRlcnMgZm9yIGV4dGVybmFsIGZvbGRlcnMgYXJlIGFsd2F5cyBvZiBzaXplIDIqLykpOworCQkJaWYgKHJlc291cmNlICE9IG51bGwpCisJCQkJcm9vdEluZm8gPSAoRGVsdGFQcm9jZXNzb3IuUm9vdEluZm8pIHJvb3RJbmZvcy5nZXQocmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7CisJCX0gZWxzZSB7CisJCQlyb290SW5mbyA9IChEZWx0YVByb2Nlc3Nvci5Sb290SW5mbykgcm9vdEluZm9zLmdldChwYXRoKTsKKwkJCXdoaWxlIChyb290SW5mbyA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7CisJCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQkJCXJvb3RJbmZvID0gKERlbHRhUHJvY2Vzc29yLlJvb3RJbmZvKSByb290SW5mb3MuZ2V0KHBhdGgpOworCQkJfQogCQl9Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJLy8gaWdub3JlCiAJfQotCXRoaXMubmVlZHNJbml0aWFsaXplID0gZmFsc2U7CisJaWYgKHJvb3RJbmZvID09IG51bGwpCisJCXJldHVybiBudWxsOworCXJldHVybiByb290SW5mby5nZXRQYWNrYWdlRnJhZ21lbnRSb290KG51bGwvKm5vIHJlc291cmNlIGhpbnQqLyk7CiB9Ci1wdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlpZiAodGhpcy5uZWVkc0luaXRpYWxpemUpIHJldHVybjsKKworcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBpbnQgZXZlbnRUeXBlKSB7CisJaWYgKHRoaXMuZW5jbG9zaW5nUGF0aHMgPT0gbnVsbCkgcmV0dXJuOwogCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CiAJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwogCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQl0aGlzLnByb2Nlc3NEZWx0YShjaGlsZCk7CisJCQkJcHJvY2Vzc0RlbHRhKGNoaWxkLCBldmVudFR5cGUpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKQEAgLTEwNCwxOCArMTY1LDE4IEBACiAJCQlzd2l0Y2ggKGtpbmQpIHsKIAkJCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEOgogCQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRDoKLQkJCQkJdGhpcy5uZWVkc0luaXRpYWxpemUgPSB0cnVlOworCQkJCQl0aGlzLmVuY2xvc2luZ1BhdGhzID0gbnVsbDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgogCQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwogCQkJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDAKIAkJCQkJCQl8fCAoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkgewotCQkJCQkJdGhpcy5uZWVkc0luaXRpYWxpemUgPSB0cnVlOworCQkJCQkJdGhpcy5lbmNsb3NpbmdQYXRocyA9IG51bGw7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQljaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJCUlKYXZhRWxlbWVudERlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCQkJdGhpcy5wcm9jZXNzRGVsdGEoY2hpbGQpOworCQkJCQkJCXByb2Nlc3NEZWx0YShjaGlsZCwgZXZlbnRUeXBlKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQlicmVhazsKQEAgLTEyNiwyMCArMTg3LDM1IEBACiAJCQlzd2l0Y2ggKGtpbmQpIHsKIAkJCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEOgogCQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRDoKLQkJCQkJdGhpcy5uZWVkc0luaXRpYWxpemUgPSB0cnVlOworCQkJCQl0aGlzLmVuY2xvc2luZ1BhdGhzID0gbnVsbDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgogCQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwogCQkJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpID4gMAogCQkJCQkJfHwgKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJCXRoaXMubmVlZHNJbml0aWFsaXplID0gdHJ1ZTsKKwkJCQkJCXRoaXMuZW5jbG9zaW5nUGF0aHMgPSBudWxsOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CiAJfQogfQorCisKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJKYXZhV29ya3NwYWNlU2NvcGUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkphdmFXb3Jrc3BhY2VTY29wZSBvbiAiKTsgLy8kTk9OLU5MUy0xJAorCUlQYXRoW10gcGF0aHMgPSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKKwlpbnQgbGVuZ3RoID0gcGF0aHMgPT0gbnVsbCA/IDAgOiBwYXRocy5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXJlc3VsdC5hcHBlbmQoIltlbXB0eSBzY29wZV0iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXJlc3VsdC5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJcblx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQocGF0aHNbaV0pOworCQl9CisJCXJlc3VsdC5hcHBlbmQoIlxuXSIpOyAvLyROT04tTkxTLTEkCisJfQorCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvUGF0aENvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXRoQ29sbGVjdG9yLmphdmEKaW5kZXggNmU5ZTc3Ny4uMjI2MWRiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXRoQ29sbGVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXRoQ29sbGVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsMTUgKzIxLDE1IEBACiAgKiBDb2xsZWN0cyB0aGUgcmVzb3VyY2UgcGF0aHMgcmVwb3J0ZWQgYnkgYSBjbGllbnQgdG8gdGhpcyBzZWFyY2ggcmVxdWVzdG9yLgogICovCiBwdWJsaWMgY2xhc3MgUGF0aENvbGxlY3RvciBleHRlbmRzIEluZGV4UXVlcnlSZXF1ZXN0b3IgewotCQorCiAJLyogYSBzZXQgb2YgcmVzb3VyY2UgcGF0aHMgKi8KIAlwdWJsaWMgSGFzaFNldCBwYXRocyA9IG5ldyBIYXNoU2V0KDUpOwotCQorCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWVJbmRleFF1ZXJ5UmVxdWVzdG9yI2FjY2VwdEluZGV4TWF0Y2goSW5kZXhSZWNvcmQsIFNlYXJjaFBhcnRpY2lwYW50LCBTZWFyY2hQYXR0ZXJuKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGFjY2VwdEluZGV4TWF0Y2goU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGF0dGVybiBpbmRleFJlY29yZCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIEFjY2Vzc1J1bGVTZXQgYWNjZXNzKSB7Ci0JCXBhdGhzLmFkZChkb2N1bWVudFBhdGgpOworCQl0aGlzLnBhdGhzLmFkZChkb2N1bWVudFBhdGgpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvUGF0dGVyblNlYXJjaEpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEKaW5kZXggYjZkM2M1Yi4uNDU5NzMwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuUmVhZFdyaXRlTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuTWF0Y2hMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLklKb2I7CkBAIC00NCw3ICs0Myw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0JLy8gc2VhcmNoIGpvYiBpcyBjYW5jZWxsZWQgdGhyb3VnaCBwcm9ncmVzcyAKKwkvLyBzZWFyY2ggam9iIGlzIGNhbmNlbGxlZCB0aHJvdWdoIHByb2dyZXNzCiB9CiBwdWJsaWMgdm9pZCBlbnN1cmVSZWFkeVRvUnVuKCkgewogCWlmICghdGhpcy5hcmVJbmRleGVzUmVhZHkpCkBAIC01NCw3ICs1Myw3IEBACiAJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwogCiAJYm9vbGVhbiBpc0NvbXBsZXRlID0gQ09NUExFVEU7Ci0JZXhlY3V0aW9uVGltZSA9IDA7CisJdGhpcy5leGVjdXRpb25UaW1lID0gMDsKIAlJbmRleFtdIGluZGV4ZXMgPSBnZXRJbmRleGVzKHByb2dyZXNzTW9uaXRvcik7CiAJdHJ5IHsKIAkJaW50IG1heCA9IGluZGV4ZXMubGVuZ3RoOwpAQCAtNjgsNyArNjcsNyBAQAogCQkJfQogCQl9CiAJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpCi0JCQlVdGlsLnZlcmJvc2UoIi0+IGV4ZWN1dGlvbiB0aW1lOiAiICsgZXhlY3V0aW9uVGltZSArICJtcyAtICIgKyB0aGlzKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJVXRpbC52ZXJib3NlKCItPiBleGVjdXRpb24gdGltZTogIiArIHRoaXMuZXhlY3V0aW9uVGltZSArICJtcyAtICIgKyB0aGlzKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQlyZXR1cm4gaXNDb21wbGV0ZTsKIAl9IGZpbmFsbHkgewogCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCkBAIC03OSw0MCArNzgsMjMgQEAKIAkvLyBhY3F1aXJlIHRoZSBpbi1tZW1vcnkgaW5kZXhlcyBvbiB0aGUgZmx5CiAJSVBhdGhbXSBpbmRleExvY2F0aW9ucyA9IHRoaXMucGFydGljaXBhbnQuc2VsZWN0SW5kZXhlcyh0aGlzLnBhdHRlcm4sIHRoaXMuc2NvcGUpOwogCWludCBsZW5ndGggPSBpbmRleExvY2F0aW9ucy5sZW5ndGg7Ci0JSW5kZXhbXSBpbmRleGVzID0gbmV3IEluZGV4W2xlbmd0aF07Ci0JaW50IGNvdW50ID0gMDsKLQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCS8vIG1heSB0cmlnZ2VyIHNvbWUgaW5kZXggcmVjcmVhdGlvbiB3b3JrCi0JCUlQYXRoIGluZGV4TG9jYXRpb24gPSBpbmRleExvY2F0aW9uc1tpXTsKLQkJSW5kZXggaW5kZXggPSBpbmRleE1hbmFnZXIuZ2V0SW5kZXgoaW5kZXhMb2NhdGlvbik7Ci0JCWlmIChpbmRleCA9PSBudWxsKSB7Ci0JCQkvLyBvbmx5IG5lZWQgY29udGFpbmVyUGF0aCBpZiB0aGUgaW5kZXggbXVzdCBiZSBidWlsdAotCQkJSVBhdGggY29udGFpbmVyUGF0aCA9IChJUGF0aCkgaW5kZXhNYW5hZ2VyLmluZGV4TG9jYXRpb25zLmtleUZvclZhbHVlKGluZGV4TG9jYXRpb24pOwotCQkJaWYgKGNvbnRhaW5lclBhdGggIT0gbnVsbCkgLy8gc2FuaXR5IGNoZWNrCi0JCQkJaW5kZXggPSBpbmRleE1hbmFnZXIuZ2V0SW5kZXgoY29udGFpbmVyUGF0aCwgaW5kZXhMb2NhdGlvbiwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7Ci0JCX0KLQkJaWYgKGluZGV4ICE9IG51bGwpCi0JCQlpbmRleGVzW2NvdW50KytdID0gaW5kZXg7IC8vIG9ubHkgY29uc2lkZXIgaW5kZXhlcyB3aGljaCBhcmUgcmVhZHkKLQl9Ci0JaWYgKGNvdW50ID09IGxlbmd0aCkgCi0JCXRoaXMuYXJlSW5kZXhlc1JlYWR5ID0gdHJ1ZTsKLQllbHNlCi0JCVN5c3RlbS5hcnJheWNvcHkoaW5kZXhlcywgMCwgaW5kZXhlcz1uZXcgSW5kZXhbY291bnRdLCAwLCBjb3VudCk7CisJSW5kZXhbXSBpbmRleGVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKS5nZXRJbmRleGVzKGluZGV4TG9jYXRpb25zLCBwcm9ncmVzc01vbml0b3IpOworCXRoaXMuYXJlSW5kZXhlc1JlYWR5ID0gaW5kZXhlcy5sZW5ndGggPT0gbGVuZ3RoOwogCXJldHVybiBpbmRleGVzOwotfQkKK30KK3B1YmxpYyBTdHJpbmcgZ2V0Sm9iRmFtaWx5KCkgeworCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorfQogcHVibGljIGJvb2xlYW4gc2VhcmNoKEluZGV4IGluZGV4LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCWlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gQ09NUExFVEU7CiAJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCiAJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gaW5kZXgubW9uaXRvcjsKIAlpZiAobW9uaXRvciA9PSBudWxsKSByZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCiAJdHJ5IHsKIAkJbW9uaXRvci5lbnRlclJlYWQoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gcmVhZAogCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCU1hdGNoTG9jYXRvci5maW5kSW5kZXhNYXRjaGVzKHRoaXMucGF0dGVybiwgaW5kZXgsIHJlcXVlc3RvciwgdGhpcy5wYXJ0aWNpcGFudCwgdGhpcy5zY29wZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJZXhlY3V0aW9uVGltZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworCQlNYXRjaExvY2F0b3IuZmluZEluZGV4TWF0Y2hlcyh0aGlzLnBhdHRlcm4sIGluZGV4LCB0aGlzLnJlcXVlc3RvciwgdGhpcy5wYXJ0aWNpcGFudCwgdGhpcy5zY29wZSwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJdGhpcy5leGVjdXRpb25UaW1lICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CiAJCXJldHVybiBDT01QTEVURTsKIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCWlmIChlIGluc3RhbmNlb2YgamF2YS5pby5FT0ZFeGNlcHRpb24pCkBAIC0xMjMsNiArMTA1LDYgQEAKIAl9CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiAic2VhcmNoaW5nICIgKyBwYXR0ZXJuLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gInNlYXJjaGluZyAiICsgdGhpcy5wYXR0ZXJuLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3RyaW5nT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1N0cmluZ09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjU0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1N0cmluZ09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXJIZWxwZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBzdHJpbmdzIGR1cmluZyBzZWFyY2guCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdPcGVyYXRpb24geworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50W10gRU1QVFlfUkVHSU9OUyA9IG5ldyBpbnRbMF07CisKKy8qKgorICogQW5zd2VycyBhbGwgdGhlIHJlZ2lvbnMgaW4gYSBnaXZlbiBuYW1lIG1hdGNoaW5nIGEgZ2l2ZW4gY2FtZWwgY2FzZSBwYXR0ZXJuLgorICogPC9wPjxwPgorICogRWFjaCBvZiB0aGVzZSByZWdpb25zIGlzIG1hZGUgb2YgaXRzIHN0YXJ0aW5nIGluZGV4IGFuZCBpdHMgbGVuZ3RoIGluIHRoZSBnaXZlbgorICogbmFtZS4gVGhleSBhcmUgYWxsIGNvbmNhdGVuYXRlZCBpbiBhIHNpbmdsZSBhcnJheSBvZiA8Y29kZT5pbnQ8L2NvZGU+CisgKiB3aGljaCB0aGVyZWZvcmUgYWx3YXlzIGhhcyBhbiBldmVuIGxlbmd0aC4KKyAqIDwvcD48cD4KKyAqIE5vdGUgdGhhdCBlYWNoIHJlZ2lvbiBpcyBkaXNqb2ludGVkIGZyb20gdGhlIGZvbGxvd2luZyBvbmUuPGJyPgorICogRS5nLiBpZiB0aGUgcmVnaW9ucyBhcmUgPGNvZGU+eyBzdGFydDEsIGxlbmd0aDEsIHN0YXJ0MiwgbGVuZ3RoMiB9PC9jb2RlPiwKKyAqIHRoZW4gPGNvZGU+c3RhcnQxK2xlbmd0aDE8L2NvZGU+IHdpbGwgYWx3YXlzIGJlIHNtYWxsZXIgdGhhbgorICogPGNvZGU+c3RhcnQyPC9jb2RlPi4KKyAqIDwvcD48cD4KKyAqIDxwcmU+CisgKiBFeGFtcGxlczoKKyAqIDxvbD48bGk+ICBwYXR0ZXJuID0gIk5QRSIKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24gLyBOb1Blcm1pc3Npb25FeGNlcHRpb24KKyAqICByZXN1bHQ6ICB7IDAsIDEsIDQsIDEsIDExLCAxIH0gLyB7IDAsIDEsIDIsIDEsIDEyLCAxIH0gPC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTnVQb0V4IgorICogIG5hbWUgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICogIHJlc3VsdDogIHsgMCwgMiwgNCwgMiwgMTEsIDIgfTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIklQTDMiCisgKiAgbmFtZSA9ICJJUGVyc3BlY3RpdmVMaXN0ZW5lcjMiCisgKiAgcmVzdWx0OiAgeyAwLCAyLCAxMiwgMSwgMjAsIDEgfTwvbGk+CisgKiA8bGk+ICBwYXR0ZXJuID0gIkhhc2hNRSIKKyAqICBuYW1lID0gIkhhc2hNYXBFbnRyeSIKKyAqICByZXN1bHQ6ICB7IDAsIDUsIDcsIDEgfTwvbGk+CisgKiA8L29sPjwvcHJlPgorICo8L3A+CisgKiBAc2VlIENoYXJPcGVyYXRpb24jY2FtZWxDYXNlTWF0Y2goY2hhcltdLCBpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgYm9vbGVhbikKKyAqIAlmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBjYW1lbCBjYXNlIGJlaGF2aW9yCisgKiBAc2VlIENoYXJPcGVyYXRpb24jbWF0Y2goY2hhcltdLCBjaGFyW10sIGJvb2xlYW4pIGZvciBtb3JlIGRldGFpbHMgb24gdGhlCisgKiAJcGF0dGVybiBtYXRjaCBiZWhhdmlvcgorICoKKyAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCisgKiBAcGFyYW0gcGF0dGVyblN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgcGF0dGVybiwgaW5jbHVzaXZlCisgKiBAcGFyYW0gcGF0dGVybkVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBwYXR0ZXJuLCBleGNsdXNpdmUKKyAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisgKiBAcGFyYW0gbmFtZVN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgbmFtZSwgaW5jbHVzaXZlCisgKiBAcGFyYW0gbmFtZUVuZCB0aGUgZW5kIGluZGV4IG9mIHRoZSBuYW1lLCBleGNsdXNpdmUKKyAqIEBwYXJhbSBzYW1lUGFydENvdW50IGZsYWcgdGVsbGluZyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGFuZCB0aGUgbmFtZSBzaG91bGQKKyAqIAloYXZlIHRoZSBzYW1lIGNvdW50IG9mIHBhcnRzIG9yIG5vdC48YnI+CisgKiAJJm5ic3A7Jm5ic3A7Rm9yIGV4YW1wbGU6CisgKiAJPHVsPgorICogCQk8bGk+J0hNJyB0eXBlIHN0cmluZyBwYXR0ZXJuIHdpbGwgbWF0Y2ggJ0hhc2hNYXAnIGFuZCAnSHRtbE1hcHBlcicgdHlwZXMsCisgKiAJCQkJYnV0IG5vdCAnSGFzaE1hcEVudHJ5JzwvbGk+CisgKiAJCTxsaT4nSE1hcCcgdHlwZSBzdHJpbmcgcGF0dGVybiB3aWxsIHN0aWxsIG1hdGNoIHByZXZpb3VzICdIYXNoTWFwJyBhbmQKKyAqIAkJCQknSHRtbE1hcHBlcicgdHlwZXMsIGJ1dCBub3QgJ0hpZ2hNYWduaXR1ZGUnPC9saT4KKyAqIAk8L3VsPgorICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5pbnQ8L2NvZGU+IGhhdmluZyB0d28gc2xvdHMgcGVyIHJldHVybmVkCisgKiAJcmVnaW9ucyAoZmlyc3Qgb25lIGlzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmVnaW9uIGFuZCB0aGUgc2Vjb25kCisgKiAJb25lIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbikuPGJyPgorICogCU5vdGUgdGhhdCBpdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgbWF0Y2gKKyAqIAl0aGUgcGF0dGVybgorICogQHNpbmNlIDMuNQorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldENhbWVsQ2FzZU1hdGNoaW5nUmVnaW9ucyhTdHJpbmcgcGF0dGVybiwgaW50IHBhdHRlcm5TdGFydCwgaW50IHBhdHRlcm5FbmQsIFN0cmluZyBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgYm9vbGVhbiBzYW1lUGFydENvdW50KSB7CisKKwkvKiAhISEhISEhISEhIFdBUk5JTkcgISEhISEhISEhIQorCSAqIFRoZSBhbGdvcml0aG0gdXNlZCBpbiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBmdWxseSBpbnNwaXJlZCBmcm9tCisJICogQ2hhck9wZXJhdGlvbiNjYW1lbENhc2VNYXRjaChjaGFyW10sIGludCwgaW50LCBjaGFyW10sIGludCwgaW50LCBib29sZWFuKS4KKwkgKgorCSAqIFNvLCBpZiBhbnkgY2hhbmdlIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGFsZ29yaXRobSwgZG8gTk9UIGZvcmdldAorCSAqIHRvIGJhY2twb3J0IGl0IGluIHRoZSBDaGFyT3BlcmF0aW9uIG1ldGhvZCEKKwkgKi8KKworCWlmIChuYW1lID09IG51bGwpCisJCXJldHVybiBudWxsOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJaWYgKHBhdHRlcm4gPT0gbnVsbCkgeworCQkvLyBudWxsIHBhdHRlcm4gY2Fubm90IG1hdGNoIGFueSByZWdpb24KKwkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0ODE2CisJCXJldHVybiBFTVBUWV9SRUdJT05TOworCX0KKwlpZiAocGF0dGVybkVuZCA8IDApIAlwYXR0ZXJuRW5kID0gcGF0dGVybi5sZW5ndGgoKTsKKwlpZiAobmFtZUVuZCA8IDApIG5hbWVFbmQgPSBuYW1lLmxlbmd0aCgpOworCisJaWYgKHBhdHRlcm5FbmQgPD0gcGF0dGVyblN0YXJ0KSB7CisJCXJldHVybiBuYW1lRW5kIDw9IG5hbWVTdGFydAorCQkJPyBuZXcgaW50W10geyBwYXR0ZXJuU3RhcnQsIHBhdHRlcm5FbmQtcGF0dGVyblN0YXJ0IH0KKwkJCTogbnVsbDsKKwl9CisJaWYgKG5hbWVFbmQgPD0gbmFtZVN0YXJ0KSByZXR1cm4gbnVsbDsKKwkvLyBjaGVjayBmaXJzdCBwYXR0ZXJuIGNoYXIKKwlpZiAobmFtZS5jaGFyQXQobmFtZVN0YXJ0KSAhPSBwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuU3RhcnQpKSB7CisJCS8vIGZpcnN0IGNoYXIgbXVzdCBzdHJpY3RseSBtYXRjaCAodXBwZXIvbG93ZXIpCisJCXJldHVybiBudWxsOworCX0KKworCWNoYXIgcGF0dGVybkNoYXIsIG5hbWVDaGFyOworCWludCBpUGF0dGVybiA9IHBhdHRlcm5TdGFydDsKKwlpbnQgaU5hbWUgPSBuYW1lU3RhcnQ7CisKKwkvLyBpbml0IHNlZ21lbnRzCisJaW50IHBhcnRzID0gMTsKKwlmb3IgKGludCBpPXBhdHRlcm5TdGFydCsxOyBpPHBhdHRlcm5FbmQ7IGkrKykgeworCQlmaW5hbCBjaGFyIGNoID0gcGF0dGVybi5jaGFyQXQoaSk7CisJCWlmIChjaCA8IFNjYW5uZXJIZWxwZXIuTUFYX09CVklPVVMpIHsKKwkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tjaF0gJiAoU2Nhbm5lckhlbHBlci5DX1VQUEVSX0xFVFRFUiB8IFNjYW5uZXJIZWxwZXIuQ19ESUdJVCkpICE9IDApIHsKKwkJCQlwYXJ0cysrOworCQkJfQorCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCkgJiYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCkgfHwgQ2hhcmFjdGVyLmlzRGlnaXQoY2gpKSkgeworCQkJcGFydHMrKzsKKwkJfQorCX0KKwlpbnRbXSBzZWdtZW50cyA9IG51bGw7CisJaW50IGNvdW50ID0gMDsgLy8gY291bnQKKworCS8vIE1haW4gbG9vcCBpcyBvbiBwYXR0ZXJuIGNoYXJhY3RlcnMKKwlpbnQgc2VnbWVudFN0YXJ0ID0gaU5hbWU7CisJd2hpbGUgKHRydWUpIHsKKwkJaVBhdHRlcm4rKzsKKwkJaU5hbWUrKzsKKworCQlpZiAoaVBhdHRlcm4gPT0gcGF0dGVybkVuZCkgeyAvLyB3ZSBoYXZlIGV4aGF1c3RlZCBwYXR0ZXJuLi4uCisJCQkvLyBpdCdzIGEgbWF0Y2ggaWYgdGhlIG5hbWUgY2FuIGhhdmUgYWRkaXRpb25hbCBwYXJ0cyAoaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycykgb3IgaXMgYWxzbyBleGhhdXN0ZWQKKwkJCWlmICghc2FtZVBhcnRDb3VudCB8fCBpTmFtZSA9PSBuYW1lRW5kKSB7CisJCQkJaWYgKHNlZ21lbnRzID09IG51bGwpIHsKKwkJCQkJc2VnbWVudHMgPSBuZXcgaW50WzJdOworCQkJCX0KKwkJCQlzZWdtZW50c1tjb3VudCsrXSA9IHNlZ21lbnRTdGFydDsKKwkJCQlzZWdtZW50c1tjb3VudCsrXSA9IGlOYW1lIC0gc2VnbWVudFN0YXJ0OworCQkJCWlmIChjb3VudCA8IHNlZ21lbnRzLmxlbmd0aCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBzZWdtZW50cyA9IG5ldyBpbnRbY291bnRdLCAwLCBjb3VudCk7CisJCQkJfQorCQkJCXJldHVybiBzZWdtZW50czsKKwkJCX0KKworCQkJLy8gb3RoZXJ3aXNlIGl0J3MgYSBtYXRjaCBvbmx5IGlmIHRoZSBuYW1lIGhhcyBubyBtb3JlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzCisJCQlpbnQgc2VnbWVudEVuZCA9IGlOYW1lOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlpZiAoaU5hbWUgPT0gbmFtZUVuZCkgeworCQkJCQkvLyB3ZSBoYXZlIGV4aGF1c3RlZCB0aGUgbmFtZSwgc28gaXQncyBhIG1hdGNoCisJCQkJCWlmIChzZWdtZW50cyA9PSBudWxsKSB7CisJCQkJCQlzZWdtZW50cyA9IG5ldyBpbnRbMl07CisJCQkJCX0KKwkJCQkJc2VnbWVudHNbY291bnQrK10gPSBzZWdtZW50U3RhcnQ7CisJCQkJCXNlZ21lbnRzW2NvdW50KytdID0gc2VnbWVudEVuZCAtIHNlZ21lbnRTdGFydDsKKwkJCQkJaWYgKGNvdW50IDwgc2VnbWVudHMubGVuZ3RoKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCAwLCBzZWdtZW50cyA9IG5ldyBpbnRbY291bnRdLCAwLCBjb3VudCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHNlZ21lbnRzOworCQkJCX0KKwkJCQluYW1lQ2hhciA9IG5hbWUuY2hhckF0KGlOYW1lKTsKKwkJCQkvLyB0ZXN0IGlmIHRoZSBuYW1lIGNoYXJhY3RlciBpcyB1cHBlcmNhc2UKKwkJCQlpZiAobmFtZUNoYXIgPCBTY2FubmVySGVscGVyLk1BWF9PQlZJT1VTKSB7CisJCQkJCWlmICgoU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tuYW1lQ2hhcl0gJiBTY2FubmVySGVscGVyLkNfVVBQRVJfTEVUVEVSKSAhPSAwKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVDaGFyKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZUNoYXIpKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlpTmFtZSsrOworCQkJfQorCQl9CisKKwkJaWYgKGlOYW1lID09IG5hbWVFbmQpeworCQkJLy8gV2UgaGF2ZSBleGhhdXN0ZWQgdGhlIG5hbWUgKGFuZCBub3QgdGhlIHBhdHRlcm4pLCBzbyBpdCdzIG5vdCBhIG1hdGNoCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIEZvciBhcyBsb25nIGFzIHdlJ3JlIGV4YWN0bHkgbWF0Y2hpbmcsIGJyaW5nIGl0IG9uIChldmVuIGlmIGl0J3MgYSBsb3dlciBjYXNlIGNoYXJhY3RlcikKKwkJaWYgKChwYXR0ZXJuQ2hhciA9IHBhdHRlcm4uY2hhckF0KGlQYXR0ZXJuKSkgPT0gbmFtZS5jaGFyQXQoaU5hbWUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpbnQgc2VnbWVudEVuZCA9IGlOYW1lOworCisJCS8vIElmIGNoYXJhY3RlcnMgYXJlIG5vdCBlcXVhbHMsIHRoZW4gaXQncyBub3QgYSBtYXRjaCBpZiBwYXR0ZXJuQ2hhciBpcyBsb3dlcmNhc2UKKwkJaWYgKHBhdHRlcm5DaGFyIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgeworCQkJaWYgKChTY2FubmVySGVscGVyLk9CVklPVVNfSURFTlRfQ0hBUl9OQVRVUkVTW3BhdHRlcm5DaGFyXSAmIChTY2FubmVySGVscGVyLkNfVVBQRVJfTEVUVEVSIHwgU2Nhbm5lckhlbHBlci5DX0RJR0lUKSkgPT0gMCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChwYXR0ZXJuQ2hhcikgJiYgIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZShwYXR0ZXJuQ2hhcikgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KHBhdHRlcm5DaGFyKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBwYXR0ZXJuQ2hhciBpcyB1cHBlcmNhc2UsIHNvIGxldCdzIGZpbmQgdGhlIG5leHQgdXBwZXJjYXNlIGluIG5hbWUKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWlmIChpTmFtZSA9PSBuYW1lRW5kKXsKKwkgICAgICAgICAgICAvLwlXZSBoYXZlIGV4aGF1c3RlZCBuYW1lIChhbmQgbm90IHBhdHRlcm4pLCBzbyBpdCdzIG5vdCBhIG1hdGNoCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCW5hbWVDaGFyID0gbmFtZS5jaGFyQXQoaU5hbWUpOworCQkJaWYgKG5hbWVDaGFyIDwgU2Nhbm5lckhlbHBlci5NQVhfT0JWSU9VUykgeworCQkJCWludCBjaGFyTmF0dXJlID0gU2Nhbm5lckhlbHBlci5PQlZJT1VTX0lERU5UX0NIQVJfTkFUVVJFU1tuYW1lQ2hhcl07CisJCQkJaWYgKChjaGFyTmF0dXJlICYgKFNjYW5uZXJIZWxwZXIuQ19MT1dFUl9MRVRURVIgfCBTY2FubmVySGVscGVyLkNfU1BFQ0lBTCkpICE9IDApIHsKKwkJCQkJLy8gbmFtZUNoYXIgaXMgbG93ZXJjYXNlCisJCQkJCWlOYW1lKys7CisJCQkJfSBlbHNlIGlmICgoY2hhck5hdHVyZSAmIFNjYW5uZXJIZWxwZXIuQ19ESUdJVCkgIT0gMCkgeworCQkJCQkvLyBuYW1lQ2hhciBpcyBkaWdpdCA9PiBicmVhayBpZiB0aGUgZGlnaXQgaXMgY3VycmVudCBwYXR0ZXJuIGNoYXJhY3RlciBvdGhlcndpc2UgY29uc3VtZSBpdAorCQkJCQlpZiAocGF0dGVybkNoYXIgPT0gbmFtZUNoYXIpIGJyZWFrOworCQkJCQlpTmFtZSsrOworCQkJCS8vIG5hbWVDaGFyIGlzIHVwcGVyY2FzZS4uLgorCQkJCX0gZWxzZSAgaWYgKHBhdHRlcm5DaGFyICE9IG5hbWVDaGFyKSB7CisJCQkJCS8vLi4gYW5kIGl0IGRvZXMgbm90IG1hdGNoIHBhdHRlcm5DaGFyLCBzbyBpdCdzIG5vdCBhIG1hdGNoCisJCQkJCXJldHVybiBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCS8vLi4gYW5kIGl0IG1hdGNoZWQgcGF0dGVybkNoYXIuIEJhY2sgdG8gdGhlIGJpZyBsb29wCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIFNhbWUgdGVzdHMgZm9yIG5vbi1vYnZpb3VzIGNoYXJhY3RlcnMKKwkJCWVsc2UgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChuYW1lQ2hhcikgJiYgIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZShuYW1lQ2hhcikpIHsKKwkJCQlpTmFtZSsrOworCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChuYW1lQ2hhcikpIHsKKwkJCQlpZiAocGF0dGVybkNoYXIgPT0gbmFtZUNoYXIpIGJyZWFrOworCQkJCWlOYW1lKys7CisJCQl9IGVsc2UgIGlmIChwYXR0ZXJuQ2hhciAhPSBuYW1lQ2hhcikgeworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvLyBBdCB0aGlzIHBvaW50LCBlaXRoZXIgbmFtZSBoYXMgYmVlbiBleGhhdXN0ZWQsIG9yIGl0IGlzIGF0IGFuIHVwcGVyY2FzZSBsZXR0ZXIuCisJCS8vIFNpbmNlIHBhdHRlcm4gaXMgYWxzbyBhdCBhbiB1cHBlcmNhc2UgbGV0dGVyCisJCWlmIChzZWdtZW50cyA9PSBudWxsKSB7CisJCQlzZWdtZW50cyA9IG5ldyBpbnRbcGFydHMqMl07CisJCX0KKwkJc2VnbWVudHNbY291bnQrK10gPSBzZWdtZW50U3RhcnQ7CisJCXNlZ21lbnRzW2NvdW50KytdID0gc2VnbWVudEVuZCAtIHNlZ21lbnRTdGFydDsKKwkJc2VnbWVudFN0YXJ0ID0gaU5hbWU7CisJfQorfQorCisvKioKKyAqIEFuc3dlcnMgYWxsIHRoZSByZWdpb25zIGluIGEgZ2l2ZW4gbmFtZSBtYXRjaGluZyBhIGdpdmVuIDxpPnBhdHRlcm48L2k+CisgKiBwYXR0ZXJuIChlLmcuICJIKk0/PyIpLgorICogPC9wPjxwPgorICogRWFjaCBvZiB0aGVzZSByZWdpb25zIGlzIG1hZGUgb2YgaXRzIHN0YXJ0aW5nIGluZGV4IGFuZCBpdHMgbGVuZ3RoIGluIHRoZSBnaXZlbgorICogbmFtZS4gVGhleSBhcmUgYWxsIGNvbmNhdGVuYXRlZCBpbiBhIHNpbmdsZSBhcnJheSBvZiA8Y29kZT5pbnQ8L2NvZGU+CisgKiB3aGljaCB0aGVyZWZvcmUgYWx3YXlzIGhhcyBhbiBldmVuIGxlbmd0aC4KKyAqIDwvcD48cD4KKyAqIE5vdGUgdGhhdCBlYWNoIHJlZ2lvbiBpcyBkaXNqb2ludGVkIGZyb20gdGhlIGZvbGxvd2luZyBvbmUuPGJyPgorICogRS5nLiBpZiB0aGUgcmVnaW9ucyBhcmUgPGNvZGU+eyBzdGFydDEsIGxlbmd0aDEsIHN0YXJ0MiwgbGVuZ3RoMiB9PC9jb2RlPiwKKyAqIHRoZW4gPGNvZGU+c3RhcnQxK2xlbmd0aDE8L2NvZGU+IHdpbGwgYWx3YXlzIGJlIHNtYWxsZXIgdGhhbgorICogPGNvZGU+c3RhcnQyPC9jb2RlPi4KKyAqIDwvcD48cD4KKyAqIDxwcmU+CisgKiBFeGFtcGxlczoKKyAqIDxvbD4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiTj8/P1BvKkV4P2VwdGlvbiIKKyAqICBuYW1lID0gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAqICByZXN1bHQ6ICB7IDAsIDEsIDQsIDIsIDExLCAyLCAxNCwgNiB9PC9saT4KKyAqIDxsaT4gIHBhdHRlcm4gPSAiSGEqTSplbnQqIgorICogIG5hbWUgPSAiSGFzaE1hcEVudHJ5IgorICogIHJlc3VsdDogIHsgMCwgMiwgNCwgMSwgNywgMyB9PC9saT4KKyAqIDwvb2w+PC9wcmU+CisgKjwvcD4KKyAqIEBzZWUgQ2hhck9wZXJhdGlvbiNtYXRjaChjaGFyW10sIGNoYXJbXSwgYm9vbGVhbikgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKKyAqIAlwYXR0ZXJuIG1hdGNoIGJlaGF2aW9yCisgKgorICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KKyAqIEBwYXJhbSBwYXR0ZXJuU3RhcnQgdGhlIGdpdmVuIHBhdHRlcm4gc3RhcnQKKyAqIEBwYXJhbSBwYXR0ZXJuRW5kIHRoZSBnaXZlbiBwYXR0ZXJuIGVuZAorICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKyAqIEBwYXJhbSBuYW1lU3RhcnQgdGhlIGdpdmVuIG5hbWUgc3RhcnQKKyAqIEBwYXJhbSBuYW1lRW5kIHRoZSBnaXZlbiBuYW1lIGVuZAorICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBmbGFnIHRvIGtub3cgaWYgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQorICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5pbnQ8L2NvZGU+IGhhdmluZyB0d28gc2xvdHMgcGVyIHJldHVybmVkCisgKiAJcmVnaW9ucyAoZmlyc3Qgb25lIGlzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmVnaW9uIGFuZCB0aGUgc2Vjb25kCisgKiAJb25lIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbikuPGJyPgorICogCU5vdGUgdGhhdCBpdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgbWF0Y2gKKyAqIAl0aGUgcGF0dGVybgorICogQHNpbmNlIDMuNQorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldFBhdHRlcm5NYXRjaGluZ1JlZ2lvbnMoCisJU3RyaW5nIHBhdHRlcm4sCisJaW50IHBhdHRlcm5TdGFydCwKKwlpbnQgcGF0dGVybkVuZCwKKwlTdHJpbmcgbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LAorCWludCBuYW1lRW5kLAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwkvKiAhISEhISEhISEhIFdBUk5JTkcgISEhISEhISEhIQorCSAqIFRoZSBhbGdvcml0aG0gdXNlZCBpbiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBmdWxseSBpbnNwaXJlZCBmcm9tCisJICogQ2hhck9wZXJhdGlvbiNtYXRjaChjaGFyW10sIGludCwgaW50LCBjaGFyW10sIGludCwgaW50LCBib29sZWFuKS4KKwkgKgorCSAqIFNvLCBpZiBhbnkgY2hhbmdlIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGFsZ29yaXRobSwgZG8gTk9UIGZvcmdldAorCSAqIHRvIGJhY2twb3J0IGl0IGluIHRoZSBDaGFyT3BlcmF0aW9uIG1ldGhvZCEKKwkgKi8KKworCWlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJaWYgKHBhdHRlcm4gPT0gbnVsbCkgeworCQkvLyBudWxsIHBhdHRlcm4gY2Fubm90IG1hdGNoIGFueSByZWdpb24KKwkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0ODE2CisJCXJldHVybiBFTVBUWV9SRUdJT05TOworCX0KKwlpbnQgaVBhdHRlcm4gPSBwYXR0ZXJuU3RhcnQ7CisJaW50IGlOYW1lID0gbmFtZVN0YXJ0OworCisJLy8gaW5pdCBzZWdtZW50cyBwYXJ0cworCWlmIChwYXR0ZXJuRW5kIDwgMCkKKwkJcGF0dGVybkVuZCA9IHBhdHRlcm4ubGVuZ3RoKCk7CisJaWYgKG5hbWVFbmQgPCAwKQorCQluYW1lRW5kID0gbmFtZS5sZW5ndGgoKTsKKwlpbnQgcXVlc3Rpb25zID0gMDsKKwlpbnQgcGFydHMgPSAwOworCWNoYXIgcHJldmlvdXMgPSAwOworCWZvciAoaW50IGk9cGF0dGVyblN0YXJ0OyBpPHBhdHRlcm5FbmQ7IGkrKykgeworCQljaGFyIGNoID0gcGF0dGVybi5jaGFyQXQoaSk7CisJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJz8nOgorCQkJCXF1ZXN0aW9ucysrOworCQkJCWJyZWFrOworCQkJY2FzZSAnKic6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN3aXRjaCAocHJldmlvdXMpIHsKKwkJCQkJY2FzZSAwIDoKKwkJCQkJY2FzZSAnPyc6CisJCQkJCWNhc2UgJyonOgorCQkJCQkJcGFydHMrKzsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQlwcmV2aW91cyA9IGNoOworCX0KKwlpZiAocGFydHMgPT0gMCkgeworCQlpZiAocXVlc3Rpb25zIDw9IChuYW1lRW5kIC0gbmFtZVN0YXJ0KSkgcmV0dXJuIEVNUFRZX1JFR0lPTlM7CisJCXJldHVybiBudWxsOworCX0KKwlpbnRbXSBzZWdtZW50cyA9IG5ldyBpbnRbcGFydHMqMl07CisKKwkvKiBjaGVjayBmaXJzdCBzZWdtZW50ICovCisJaW50IGNvdW50ID0gMDsKKwlpbnQgc3RhcnQgPSBpTmFtZTsKKwljaGFyIHBhdHRlcm5DaGFyID0gMDsKKwlwcmV2aW91cyA9IDA7CisJd2hpbGUgKChpUGF0dGVybiA8IHBhdHRlcm5FbmQpCisJCSYmIChwYXR0ZXJuQ2hhciA9IHBhdHRlcm4uY2hhckF0KGlQYXR0ZXJuKSkgIT0gJyonKSB7CisJCWlmIChpTmFtZSA9PSBuYW1lRW5kKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChwYXR0ZXJuQ2hhciA9PSAnPycpIHsKKwkJCXN3aXRjaCAocHJldmlvdXMpIHsKKwkJCQljYXNlIDA6CisJCQkJY2FzZSAnPyc6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXNlZ21lbnRzW2NvdW50KytdID0gc3RhcnQ7CisJCQkJCXNlZ21lbnRzW2NvdW50KytdID0gaVBhdHRlcm4tc3RhcnQ7CisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkgeworCQkJCWlmIChwYXR0ZXJuQ2hhciAhPSBuYW1lLmNoYXJBdChpTmFtZSkpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKHBhdHRlcm5DaGFyKSAhPSBTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKG5hbWUuY2hhckF0KGlOYW1lKSkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXN3aXRjaCAocHJldmlvdXMpIHsKKwkJCQljYXNlIDA6CisJCQkJY2FzZSAnPyc6CisJCQkJCXN0YXJ0ID0gaVBhdHRlcm47CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlOYW1lKys7CisJCWlQYXR0ZXJuKys7CisJCXByZXZpb3VzID0gcGF0dGVybkNoYXI7CisJfQorCS8qIGNoZWNrIHNlcXVlbmNlIG9mIHN0YXIrc2VnbWVudCAqLworCWludCBzZWdtZW50U3RhcnQ7CisJaWYgKHBhdHRlcm5DaGFyID09ICcqJykgeworCQlpZiAoaVBhdHRlcm4gPiAwICYmIHByZXZpb3VzICE9ICc/JykgeworCQkJc2VnbWVudHNbY291bnQrK10gPSBzdGFydDsKKwkJCXNlZ21lbnRzW2NvdW50KytdID0gaU5hbWUtc3RhcnQ7CisJCQlzdGFydCA9IGlOYW1lOworCQl9CisJCXNlZ21lbnRTdGFydCA9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcgorCX0gZWxzZSB7CisJCWlmIChpTmFtZSA9PSBuYW1lRW5kKSB7CisJCQlpZiAoY291bnQgPT0gKHBhcnRzKjIpKSByZXR1cm4gc2VnbWVudHM7CisJCQlpbnQgZW5kID0gcGF0dGVybkVuZDsKKwkJCWlmIChwcmV2aW91cyA9PSAnPycpIHsgLy8gbGFzdCBjaGFyIHdhcyBhICc/JyA9PiBwdXJnZSBhbGwgdHJhaWxpbmcgJz8nCisJCQkJd2hpbGUgKHBhdHRlcm4uY2hhckF0KC0tZW5kLTEpID09ICc/JykgeworCQkJCQlpZiAoZW5kID09IHN0YXJ0KSB7CisJCQkJCQlyZXR1cm4gbmV3IGludFtdIHsgcGF0dGVyblN0YXJ0LCBwYXR0ZXJuRW5kLXBhdHRlcm5TdGFydCB9OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG5ldyBpbnRbXSB7IHN0YXJ0LCBlbmQtc3RhcnQgfTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJaW50IHByZWZpeFN0YXJ0ID0gaU5hbWU7CisJaW50IHByZXZpb3VzQ291bnQgPSBjb3VudDsKKwlwcmV2aW91cyA9IHBhdHRlcm5DaGFyOworCWNoYXIgcHJldmlvdXNTZWdtZW50ID0gcGF0dGVybkNoYXI7CisJY2hlY2tTZWdtZW50IDogd2hpbGUgKGlOYW1lIDwgbmFtZUVuZCkgeworCQlpZiAoaVBhdHRlcm4gPT0gcGF0dGVybkVuZCkgeworCQkJaVBhdHRlcm4gPSBzZWdtZW50U3RhcnQ7IC8vIG1pc21hdGNoIC0gcmVzdGFydCBjdXJyZW50IHNlZ21lbnQKKwkJCWlOYW1lID0gKytwcmVmaXhTdGFydDsKKwkJCXByZXZpb3VzID0gcHJldmlvdXNTZWdtZW50OworCQkJY29udGludWUgY2hlY2tTZWdtZW50OworCQl9CisJCS8qIHNlZ21lbnQgaXMgZW5kaW5nICovCisJCWlmICgocGF0dGVybkNoYXIgPSBwYXR0ZXJuLmNoYXJBdChpUGF0dGVybikpID09ICcqJykgeworCQkJc2VnbWVudFN0YXJ0ID0gKytpUGF0dGVybjsgLy8gc2tpcCBzdGFyCisJCQlpZiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5FbmQpIHsKKwkJCQlpZiAoY291bnQgPCAocGFydHMqMikpIHsKKwkJCQkJc2VnbWVudHNbY291bnQrK10gPSBzdGFydDsKKwkJCQkJc2VnbWVudHNbY291bnQrK10gPSBpTmFtZS1zdGFydDsKKwkJCQl9CisJCQkJcmV0dXJuIHNlZ21lbnRzOworCQkJfQorCQkJc3dpdGNoIChwcmV2aW91cykgeworCQkJCWNhc2UgJyonOgorCQkJCWNhc2UgJz8nOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzZWdtZW50c1tjb3VudCsrXSA9IHN0YXJ0OworCQkJCQlzZWdtZW50c1tjb3VudCsrXSA9IGlOYW1lLXN0YXJ0OworCQkJCQlicmVhazsKKwkJCX0KKwkJCXByZWZpeFN0YXJ0ID0gaU5hbWU7CisJCQlzdGFydCA9IHByZWZpeFN0YXJ0OworCQkJcHJldmlvdXMgPSBwYXR0ZXJuQ2hhcjsKKwkJCXByZXZpb3VzU2VnbWVudCA9IHBhdHRlcm5DaGFyOworCQkJY29udGludWUgY2hlY2tTZWdtZW50OworCQl9CisJCS8qIGNoZWNrIGN1cnJlbnQgbmFtZSBjaGFyYWN0ZXIgKi8KKwkJcHJldmlvdXNDb3VudCA9IGNvdW50OworCQlpZiAocGF0dGVybkNoYXIgPT0gJz8nKSB7CisJCQlzd2l0Y2ggKHByZXZpb3VzKSB7CisJCQkJY2FzZSAnKic6CisJCQkJY2FzZSAnPyc6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXNlZ21lbnRzW2NvdW50KytdID0gc3RhcnQ7CisJCQkJCXNlZ21lbnRzW2NvdW50KytdID0gaU5hbWUtc3RhcnQ7CisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYm9vbGVhbiBtaXNtYXRjaDsKKwkJCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCQltaXNtYXRjaCA9IG5hbWUuY2hhckF0KGlOYW1lKSAhPSBwYXR0ZXJuQ2hhcjsKKwkJCX0gZWxzZSB7CisJCQkJbWlzbWF0Y2ggPSBTY2FubmVySGVscGVyLnRvTG93ZXJDYXNlKG5hbWUuY2hhckF0KGlOYW1lKSkgIT0gU2Nhbm5lckhlbHBlci50b0xvd2VyQ2FzZShwYXR0ZXJuQ2hhcik7CisJCQl9CisJCQlpZiAobWlzbWF0Y2gpIHsKKwkJCQlpUGF0dGVybiA9IHNlZ21lbnRTdGFydDsgLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgc2VnbWVudAorCQkJCWlOYW1lID0gKytwcmVmaXhTdGFydDsKKwkJCQlzdGFydCA9IHByZWZpeFN0YXJ0OworCQkJCWNvdW50ID0gcHJldmlvdXNDb3VudDsKKwkJCQlwcmV2aW91cyA9IHByZXZpb3VzU2VnbWVudDsKKwkJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7CisJCQl9CisJCQlzd2l0Y2ggKHByZXZpb3VzKSB7CisJCQkJY2FzZSAnPyc6CisJCQkJCXN0YXJ0ID0gaU5hbWU7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlOYW1lKys7CisJCWlQYXR0ZXJuKys7CisJCXByZXZpb3VzID0gcGF0dGVybkNoYXI7CisJfQorCisJaWYgKChzZWdtZW50U3RhcnQgPT0gcGF0dGVybkVuZCkKKwkJfHwgKGlOYW1lID09IG5hbWVFbmQgJiYgaVBhdHRlcm4gPT0gcGF0dGVybkVuZCkKKwkJfHwgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQgLSAxICYmIHBhdHRlcm4uY2hhckF0KGlQYXR0ZXJuKSA9PSAnKicpKSB7CisJCWlmIChjb3VudCA8IChwYXJ0cyoyKSkgeworCQkJc2VnbWVudHNbY291bnQrK10gPSBzdGFydDsKKwkJCXNlZ21lbnRzW2NvdW50KytdID0gaU5hbWUtc3RhcnQ7CisJCX0KKwkJcmV0dXJuIHNlZ21lbnRzOworCX0KKwlyZXR1cm4gbnVsbDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9TdWJUeXBlU2VhcmNoSm9iLmphdmEKaW5kZXggM2E1NjFkMy4uOGI4YzBlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9TdWJUeXBlU2VhcmNoSm9iLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9TdWJUeXBlU2VhcmNoSm9iLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjgsOSArMjgsMTggQEAKIAkJaWYgKHZhbHVlc1tpXSAhPSBudWxsKQogCQkJKChJbmRleCkgdmFsdWVzW2ldKS5zdG9wUXVlcnkoKTsKIH0KK3B1YmxpYyBJbmRleFtdIGdldEluZGV4ZXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwlpZiAodGhpcy5pbmRleGVzLmVsZW1lbnRTaXplID09IDApIHsKKwkJcmV0dXJuIHN1cGVyLmdldEluZGV4ZXMocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisJdGhpcy5hcmVJbmRleGVzUmVhZHkgPSB0cnVlOyAvLyB1c2Ugc3RvcmVkIGluZGV4ZXMgdW50aWwgdGhlIGpvYidzIGVuZAorCUluZGV4W10gdmFsdWVzID0gbmV3IEluZGV4W3RoaXMuaW5kZXhlcy5lbGVtZW50U2l6ZV07CisJdGhpcy5pbmRleGVzLmFzQXJyYXkodmFsdWVzKTsKKwlyZXR1cm4gdmFsdWVzOworfQogcHVibGljIGJvb2xlYW4gc2VhcmNoKEluZGV4IGluZGV4LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCWlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gQ09NUExFVEU7Ci0JaWYgKGluZGV4ZXMuYWRkSWZOb3RJbmNsdWRlZChpbmRleCkgPT0gaW5kZXgpCisJaWYgKHRoaXMuaW5kZXhlcy5hZGRJZk5vdEluY2x1ZGVkKGluZGV4KSA9PSBpbmRleCkKIAkJaW5kZXguc3RhcnRRdWVyeSgpOwogCXJldHVybiBzdXBlci5zZWFyY2goaW5kZXgsIHByb2dyZXNzTW9uaXRvcik7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1R5cGVOYW1lTWF0Y2hSZXF1ZXN0b3JXcmFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1R5cGVOYW1lTWF0Y2hSZXF1ZXN0b3JXcmFwcGVyLmphdmEKaW5kZXggMjY4NDUzZi4uODFhNzRkYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9UeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVHlwZU5hbWVNYXRjaFJlcXVlc3RvcldyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC03LDIyICs3LDI4IEBACiAgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFN0ZXBoYW4gSGVycm1hbm4gLSBDb250cmlidXRpb24gZm9yIGJ1ZyAyMTUxMzkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZU1hdGNoUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuQWNjZXNzUmVzdHJpY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5IYW5kbGVGYWN0b3J5OwpAQCAtMzEsMjIgKzM3LDIyIEBACiAvKioKICAqIFdyYXBwZXIgdXNlZCB0byBsaW5rIHtAbGluayBJUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3J9IHdpdGgge0BsaW5rIFR5cGVOYW1lUmVxdWVzdG9yfS4KICAqIFRoaXMgd3JhcHBlciBzcGVjaWZpY2FsbHkgYWxsb3dzIHVzYWdlIG9mIGludGVybmFsIG1ldGhvZCB7QGxpbmsgQmFzaWNTZWFyY2hFbmdpbmUjc2VhcmNoQWxsVHlwZU5hbWVzKAotICogCWNoYXJbXSBwYWNrYWdlTmFtZSwgCi0gKiAJaW50IHBhY2thZ2VNYXRjaFJ1bGUsIAorICogCWNoYXJbXSBwYWNrYWdlTmFtZSwKKyAqIAlpbnQgcGFja2FnZU1hdGNoUnVsZSwKICAqIAljaGFyW10gdHlwZU5hbWUsCi0gKiAJaW50IHR5cGVNYXRjaFJ1bGUsIAotICogCWludCBzZWFyY2hGb3IsIAotICogCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCAKKyAqIAlpbnQgdHlwZU1hdGNoUnVsZSwKKyAqIAlpbnQgc2VhcmNoRm9yLAorICogCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogICogCUlSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yLAogICogCWludCB3YWl0aW5nUG9saWN5LAogICogCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIH0uCiAgKiBmcm9tICBBUEkgbWV0aG9kIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lI3NlYXJjaEFsbFR5cGVOYW1lcygKLSAqIAljaGFyW10gcGFja2FnZU5hbWUsIAorICogCWNoYXJbXSBwYWNrYWdlTmFtZSwKICAqIAlpbnQgcGFja2FnZU1hdGNoUnVsZSwKICAqIAljaGFyW10gdHlwZU5hbWUsCi0gKiAJaW50IG1hdGNoUnVsZSwgCi0gKiAJaW50IHNlYXJjaEZvciwgCi0gKiAJb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIAorICogCWludCBtYXRjaFJ1bGUsCisgKiAJaW50IHNlYXJjaEZvciwKKyAqIAlvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZSBzY29wZSwKICAqIAlUeXBlTmFtZVJlcXVlc3RvciBuYW1lUmVxdWVzdG9yLAogICogCWludCB3YWl0aW5nUG9saWN5LAogICogCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIH0uCkBAIC02NiwxMSArNzIsMTMgQEAKIAkgKiBDYWNoZSBwYWNrYWdlIGhhbmRsZXMgdG8gb3B0aW1pemUgbWVtb3J5LgogCSAqLwogCXByaXZhdGUgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0IHBhY2thZ2VIYW5kbGVzOworCXByaXZhdGUgT2JqZWN0IGxhc3RQcm9qZWN0OworCXByaXZhdGUgbG9uZyBjb21wbGlhbmNlVmFsdWU7CiAKIHB1YmxpYyBUeXBlTmFtZU1hdGNoUmVxdWVzdG9yV3JhcHBlcihUeXBlTmFtZU1hdGNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewogCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwogCXRoaXMuc2NvcGUgPSBzY29wZTsKLQlpZiAoIShzY29wZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hTY29wZSkpIHsKKwlpZiAoIShzY29wZSBpbnN0YW5jZW9mIEFic3RyYWN0SmF2YVNlYXJjaFNjb3BlKSkgewogCQl0aGlzLmhhbmRsZUZhY3RvcnkgPSBuZXcgSGFuZGxlRmFjdG9yeSgpOwogCX0KIH0KQEAgLTc5LDYgKzg3LDggQEAKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklSZXN0cmljdGVkQWNjZXNzVHlwZVJlcXVlc3RvciNhY2NlcHRUeXBlKGludCwgY2hhcltdLCBjaGFyW10sIGNoYXJbXVtdLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1Jlc3RyaWN0aW9uKQogICovCiBwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoLCBBY2Nlc3NSZXN0cmljdGlvbiBhY2Nlc3MpIHsKKworCS8vIEdldCB0eXBlCiAJdHJ5IHsKIAkJSVR5cGUgdHlwZSA9IG51bGw7CiAJCWlmICh0aGlzLmhhbmRsZUZhY3RvcnkgIT0gbnVsbCkgewpAQCAtMTA3LDggKzExNywzMCBAQAogCQkJCT8gY3JlYXRlVHlwZUZyb21QYXRoKHBhdGgsIG5ldyBTdHJpbmcoc2ltcGxlVHlwZU5hbWUpLCBlbmNsb3NpbmdUeXBlTmFtZXMpCiAJCQkJOiBjcmVhdGVUeXBlRnJvbUphcihwYXRoLCBzZXBhcmF0b3JJbmRleCk7CiAJCX0KKworCQkvLyBBY2NlcHQgbWF0Y2ggaWYgdGhlIHR5cGUgaGFzIGJlZW4gZm91bmQKIAkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VHlwZU5hbWVNYXRjaChuZXcgSmF2YVNlYXJjaFR5cGVOYW1lTWF0Y2godHlwZSwgbW9kaWZpZXJzKSk7CisJCQkvLyBoaWVyYXJjaHkgc2NvcGVzIHJlcXVpcmUgb25lIG1vcmUgY2hlY2s6CisJCQlpZiAoISh0aGlzLnNjb3BlIGluc3RhbmNlb2YgSGllcmFyY2h5U2NvcGUpIHx8ICgoSGllcmFyY2h5U2NvcGUpdGhpcy5zY29wZSkuZW5jbG9zZXNGaW5lR3JhaW5lZCh0eXBlKSkgeworCisJCQkJLy8gQ3JlYXRlIHRoZSBtYXRjaAorCQkJCWZpbmFsIEphdmFTZWFyY2hUeXBlTmFtZU1hdGNoIG1hdGNoID0gbmV3IEphdmFTZWFyY2hUeXBlTmFtZU1hdGNoKHR5cGUsIG1vZGlmaWVycyk7CisKKwkJCQkvLyBVcGRhdGUgbWF0Y2ggYWNjZXNzaWJpbGl0eQorCQkJCWlmKGFjY2VzcyAhPSBudWxsKSB7CisJCQkJCXN3aXRjaCAoYWNjZXNzLmdldFByb2JsZW1JZCgpKSB7CisJCQkJCQljYXNlIElQcm9ibGVtLkZvcmJpZGRlblJlZmVyZW5jZToKKwkJCQkJCQltYXRjaC5zZXRBY2Nlc3NpYmlsaXR5KElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJUHJvYmxlbS5EaXNjb3VyYWdlZFJlZmVyZW5jZToKKwkJCQkJCQltYXRjaC5zZXRBY2Nlc3NpYmlsaXR5KElBY2Nlc3NSdWxlLktfRElTQ09VUkFHRUQpOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gQWNjZXB0IG1hdGNoCisJCQkJdGhpcy5yZXF1ZXN0b3IuYWNjZXB0VHlwZU5hbWVNYXRjaChtYXRjaCk7CisJCQl9CiAJCX0KIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkvLyBza2lwCkBAIC0xMTcsMTEgKzE0OSwxMSBAQAogcHJpdmF0ZSBJVHlwZSBjcmVhdGVUeXBlRnJvbUphcihTdHJpbmcgcmVzb3VyY2VQYXRoLCBpbnQgc2VwYXJhdG9ySW5kZXgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCS8vIHBhdGggdG8gYSBjbGFzcyBmaWxlIGluc2lkZSBhIGphcgogCS8vIE9wdGltaXphdGlvbjogY2FjaGUgcGFja2FnZSBmcmFnbWVudCByb290IGhhbmRsZSBhbmQgcGFja2FnZSBoYW5kbGVzCi0JaWYgKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPT0gbnVsbCAKKwlpZiAodGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aCA9PSBudWxsCiAJCQl8fCB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoLmxlbmd0aCgpID4gcmVzb3VyY2VQYXRoLmxlbmd0aCgpCiAJCQl8fCAhcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgodGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aCkpIHsKIAkJU3RyaW5nIGphclBhdGg9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoKEphdmFTZWFyY2hTY29wZSl0aGlzLnNjb3BlKS5wYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlUGF0aCk7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9ICgoQWJzdHJhY3RKYXZhU2VhcmNoU2NvcGUpdGhpcy5zY29wZSkucGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZVBhdGgsIHNlcGFyYXRvckluZGV4LCBqYXJQYXRoKTsKIAkJaWYgKHJvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGg9IGphclBhdGg7CiAJCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdD0gcm9vdDsKQEAgLTE0MSwyMiArMTczLDM0IEBACiAJSVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnbWVudD0gKElQYWNrYWdlRnJhZ21lbnQpIHRoaXMucGFja2FnZUhhbmRsZXMuZ2V0KHBrZ05hbWUpOwogCWlmIChwa2dGcmFnbWVudCA9PSBudWxsKSB7CiAJCXBrZ0ZyYWdtZW50PSAoKFBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdCkuZ2V0UGFja2FnZUZyYWdtZW50KHBrZ05hbWUpOworCQkvLyBmaWx0ZXIgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bSBwYWNrYWdlIGZvciBwcm9qZWN0cyBhYm92ZSAxLjUgCisJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MjY0CisJCWlmIChsZW5ndGggPT0gNSAmJiBwa2dOYW1lWzRdLmVxdWFscygiZW51bSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCUlKYXZhUHJvamVjdCBwcm9qID0gKElKYXZhUHJvamVjdClwa2dGcmFnbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKTsKKwkJCWlmICghcHJvai5lcXVhbHModGhpcy5sYXN0UHJvamVjdCkpIHsKKwkJCQlTdHJpbmcgY29tcGxpYW5jZVN0ciA9IHByb2ouZ2V0T3B0aW9uKENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLCB0cnVlKTsKKwkJCQl0aGlzLmNvbXBsaWFuY2VWYWx1ZSA9IENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjb21wbGlhbmNlU3RyKTsKKwkJCQl0aGlzLmxhc3RQcm9qZWN0ID0gcHJvajsKKwkJCX0KKwkJCWlmICh0aGlzLmNvbXBsaWFuY2VWYWx1ZSA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KQorCQkJCXJldHVybiBudWxsOworCQl9IAogCQl0aGlzLnBhY2thZ2VIYW5kbGVzLnB1dChwa2dOYW1lLCBwa2dGcmFnbWVudCk7CiAJfQogCXJldHVybiBwa2dGcmFnbWVudC5nZXRDbGFzc0ZpbGUoc2ltcGxlTmFtZXNbbGVuZ3RoXSkuZ2V0VHlwZSgpOwotfQkKK30KIHByaXZhdGUgSVR5cGUgY3JlYXRlVHlwZUZyb21QYXRoKFN0cmluZyByZXNvdXJjZVBhdGgsIFN0cmluZyBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkvLyBwYXRoIHRvIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQogCS8vIE9wdGltaXphdGlvbjogY2FjaGUgcGFja2FnZSBmcmFnbWVudCByb290IGhhbmRsZSBhbmQgcGFja2FnZSBoYW5kbGVzCiAJaW50IHJvb3RQYXRoTGVuZ3RoID0gLTE7Ci0JaWYgKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPT0gbnVsbCAKLQkJfHwgIShyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoKSAKKwlpZiAodGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aCA9PSBudWxsCisJCXx8ICEocmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgodGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aCkKIAkJCSYmIChyb290UGF0aExlbmd0aCA9IHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGgubGVuZ3RoKCkpID4gMAogCQkJJiYgcmVzb3VyY2VQYXRoLmNoYXJBdChyb290UGF0aExlbmd0aCkgPT0gJy8nKSkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKChKYXZhU2VhcmNoU2NvcGUpdGhpcy5zY29wZSkucGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZVBhdGgpOworCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgKChBYnN0cmFjdEphdmFTZWFyY2hTY29wZSl0aGlzLnNjb3BlKS5wYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlUGF0aCwgLTEvKm5vdCBhIGphciovLCBudWxsLypubyBqYXIgcGF0aCovKTsKIAkJaWYgKHJvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdCA9IHJvb3Q7Ci0JCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPSB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3QuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCXRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPSByb290LmludGVybmFsUGF0aCgpLnRvU3RyaW5nKCk7CiAJCXRoaXMucGFja2FnZUhhbmRsZXMgPSBuZXcgSGFzaHRhYmxlT2ZBcnJheVRvT2JqZWN0KDUpOwogCX0KIAkvLyBjcmVhdGUgaGFuZGxlCkBAIC0xODcsOSArMjMxLDEwIEBACiAJCQl0eXBlID0gdHlwZS5nZXRUeXBlKHNpbXBsZVR5cGVOYW1lKTsKIAkJfQogCQlyZXR1cm4gdHlwZTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUoc2ltcGxlTmFtZSkpewogCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZT0gcGtnRnJhZ21lbnQuZ2V0Q2xhc3NGaWxlKHNpbXBsZU5hbWUpOwogCQlyZXR1cm4gY2xhc3NGaWxlLmdldFR5cGUoKTsKIAl9Ci19CQorCXJldHVybiBudWxsOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9UeXBlTmFtZVJlcXVlc3RvcldyYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVHlwZU5hbWVSZXF1ZXN0b3JXcmFwcGVyLmphdmEKaW5kZXggMzMwMGMwNC4uMzFhNDUyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9UeXBlTmFtZVJlcXVlc3RvcldyYXBwZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1R5cGVOYW1lUmVxdWVzdG9yV3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE2LDIyICsxNiwyMiBAQAogLyoqCiAgKiBXcmFwcGVyIHVzZWQgdG8gbGluayB7QGxpbmsgSVJlc3RyaWN0ZWRBY2Nlc3NUeXBlUmVxdWVzdG9yfSB3aXRoIHtAbGluayBUeXBlTmFtZVJlcXVlc3Rvcn0uCiAgKiBUaGlzIHdyYXBwZXIgc3BlY2lmaWNhbGx5IGFsbG93cyB1c2FnZSBvZiBpbnRlcm5hbCBtZXRob2Qge0BsaW5rIEJhc2ljU2VhcmNoRW5naW5lI3NlYXJjaEFsbFR5cGVOYW1lcygKLSAqIAljaGFyW10gcGFja2FnZU5hbWUsIAotICogCWludCBwYWNrYWdlTWF0Y2hSdWxlLCAKKyAqIAljaGFyW10gcGFja2FnZU5hbWUsCisgKiAJaW50IHBhY2thZ2VNYXRjaFJ1bGUsCiAgKiAJY2hhcltdIHR5cGVOYW1lLAotICogCWludCB0eXBlTWF0Y2hSdWxlLCAKLSAqIAlpbnQgc2VhcmNoRm9yLCAKLSAqIAlvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisgKiAJaW50IHR5cGVNYXRjaFJ1bGUsCisgKiAJaW50IHNlYXJjaEZvciwKKyAqIAlvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZSBzY29wZSwKICAqIAlJUmVzdHJpY3RlZEFjY2Vzc1R5cGVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKICAqIAlpbnQgd2FpdGluZ1BvbGljeSwKICAqIAlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB9LgogICogZnJvbSAgQVBJIG1ldGhvZCB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZSNzZWFyY2hBbGxUeXBlTmFtZXMoCi0gKiAJY2hhcltdIHBhY2thZ2VOYW1lLCAKLSAqIAlpbnQgcGFja2FnZU1hdGNoUnVsZSwgCisgKiAJY2hhcltdIHBhY2thZ2VOYW1lLAorICogCWludCBwYWNrYWdlTWF0Y2hSdWxlLAogICogCWNoYXJbXSB0eXBlTmFtZSwKLSAqIAlpbnQgbWF0Y2hSdWxlLCAKLSAqIAlpbnQgc2VhcmNoRm9yLCAKLSAqIAlvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZSBzY29wZSwgCisgKiAJaW50IG1hdGNoUnVsZSwKKyAqIAlpbnQgc2VhcmNoRm9yLAorICogCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogICogCVR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IsCiAgKiAJaW50IHdhaXRpbmdQb2xpY3ksCiAgKiAJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgfS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWJzdHJhY3RJbmRleGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0Fic3RyYWN0SW5kZXhlci5qYXZhCmluZGV4IDIzNzQzZjQuLjI0MmEzMzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWJzdHJhY3RJbmRleGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BYnN0cmFjdEluZGV4ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yOCwxNiArMjgsMTkgQEAKIAkJYWRkVHlwZURlY2xhcmF0aW9uKG1vZGlmaWVycywgcGFja2FnZU5hbWUsIG5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgc2Vjb25kYXJ5KTsKIAogCQlhZGRJbmRleEVudHJ5KAotCQkJU1VQRVJfUkVGLCAKKwkJCVNVUEVSX1JFRiwKIAkJCVN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uY3JlYXRlSW5kZXhLZXkoCiAJCQkJbW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBudWxsLCBBTk5PVEFUSU9OX1RZUEVfU1VGRklYLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9BTk5PVEFUSU9OLCAnLicpLCBBTk5PVEFUSU9OX1RZUEVfU1VGRklYKSk7Ci0JfQkKKwl9CisJcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY2hhcltdIHR5cGVOYW1lKSB7CisJCWFkZEluZGV4RW50cnkoQU5OT1RBVElPTl9SRUYsIENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodHlwZU5hbWUsICcuJykpOworCX0KIAlwdWJsaWMgdm9pZCBhZGRDbGFzc0RlY2xhcmF0aW9uKAotCQkJaW50IG1vZGlmaWVycywgCisJCQlpbnQgbW9kaWZpZXJzLAogCQkJY2hhcltdIHBhY2thZ2VOYW1lLAotCQkJY2hhcltdIG5hbWUsIAotCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCAKLQkJCWNoYXJbXSBzdXBlcmNsYXNzLCAKKwkJCWNoYXJbXSBuYW1lLAorCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAorCQkJY2hhcltdIHN1cGVyY2xhc3MsCiAJCQljaGFyW11bXSBzdXBlcmludGVyZmFjZXMsCiAJCQljaGFyW11bXSB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcywKIAkJCWJvb2xlYW4gc2Vjb25kYXJ5KSB7CkBAIC00OCw3ICs1MSw3IEBACiAJCQlhZGRUeXBlUmVmZXJlbmNlKHN1cGVyY2xhc3MpOwogCQl9CiAJCWFkZEluZGV4RW50cnkoCi0JCQlTVVBFUl9SRUYsIAorCQkJU1VQRVJfUkVGLAogCQkJU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybi5jcmVhdGVJbmRleEtleSgKIAkJCQltb2RpZmllcnMsIHBhY2thZ2VOYW1lLCBuYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzLCBDTEFTU19TVUZGSVgsIHN1cGVyY2xhc3MsIENMQVNTX1NVRkZJWCkpOwogCQlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwpIHsKQEAgLTY0LDE0ICs2NywzNCBAQAogCX0KIAlwcml2YXRlIGNoYXJbXSBlcmFzdXJlKGNoYXJbXSB0eXBlTmFtZSkgewogCQlpbnQgZ2VuZXJpY1N0YXJ0ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNpZ25hdHVyZS5DX0dFTkVSSUNfU1RBUlQsIHR5cGVOYW1lKTsKLQkJaWYgKGdlbmVyaWNTdGFydCA+IC0xKSAKKwkJaWYgKGdlbmVyaWNTdGFydCA+IC0xKQogCQkJdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVOYW1lLCAwLCBnZW5lcmljU3RhcnQpOwogCQlyZXR1cm4gdHlwZU5hbWU7CiAJfQotCXB1YmxpYyB2b2lkIGFkZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY2hhcltdIHR5cGVOYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKLQkJaW50IGFyZ0NvdW50ID0gcGFyYW1ldGVyVHlwZXMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWFkZEluZGV4RW50cnkoQ09OU1RSVUNUT1JfREVDTCwgQ29uc3RydWN0b3JQYXR0ZXJuLmNyZWF0ZUluZGV4S2V5KENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodHlwZU5hbWUsJy4nKSwgYXJnQ291bnQpKTsKLQkKKwlwdWJsaWMgdm9pZCBhZGRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKAorCQkJY2hhcltdIHR5cGVOYW1lLAorCQkJaW50IGFyZ0NvdW50LAorCQkJY2hhcltdIHNpZ25hdHVyZSwKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCQlpbnQgbW9kaWZpZXJzLAorCQkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQkJaW50IHR5cGVNb2RpZmllcnMsCisJCQljaGFyW11bXSBleGNlcHRpb25UeXBlcywKKwkJCWludCBleHRyYUZsYWdzKSB7CisJCWFkZEluZGV4RW50cnkoCisJCQkJQ09OU1RSVUNUT1JfREVDTCwKKwkJCQlDb25zdHJ1Y3RvclBhdHRlcm4uY3JlYXRlRGVjbGFyYXRpb25JbmRleEtleSgKKwkJCQkJCXR5cGVOYW1lLAorCQkJCQkJYXJnQ291bnQsCisJCQkJCQlzaWduYXR1cmUsCisJCQkJCQlwYXJhbWV0ZXJUeXBlcywKKwkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJbW9kaWZpZXJzLAorCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQl0eXBlTW9kaWZpZXJzLAorCQkJCQkJZXh0cmFGbGFncykpOworCQkKIAkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykKIAkJCQlhZGRUeXBlUmVmZXJlbmNlKHBhcmFtZXRlclR5cGVzW2ldKTsKQEAgLTg4LDExICsxMTEsMTggQEAKIAkJaWYgKGlubmVybW9zdFR5cGVOYW1lICE9IHNpbXBsZVR5cGVOYW1lKQogCQkJYWRkSW5kZXhFbnRyeShDT05TVFJVQ1RPUl9SRUYsIENvbnN0cnVjdG9yUGF0dGVybi5jcmVhdGVJbmRleEtleShpbm5lcm1vc3RUeXBlTmFtZSwgYXJnQ291bnQpKTsKIAl9CisJcHVibGljIHZvaWQgYWRkRGVmYXVsdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oCisJCQljaGFyW10gdHlwZU5hbWUsCisJCQljaGFyW10gcGFja2FnZU5hbWUsCisJCQlpbnQgdHlwZU1vZGlmaWVycywKKwkJCWludCBleHRyYUZsYWdzKSB7CisJCWFkZEluZGV4RW50cnkoQ09OU1RSVUNUT1JfREVDTCwgQ29uc3RydWN0b3JQYXR0ZXJuLmNyZWF0ZURlZmF1bHREZWNsYXJhdGlvbkluZGV4S2V5KENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodHlwZU5hbWUsJy4nKSwgcGFja2FnZU5hbWUsIHR5cGVNb2RpZmllcnMsIGV4dHJhRmxhZ3MpKTsKKwl9CiAJcHVibGljIHZvaWQgYWRkRW51bURlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIG5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHN1cGVyY2xhc3MsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywgYm9vbGVhbiBzZWNvbmRhcnkpIHsKIAkJYWRkVHlwZURlY2xhcmF0aW9uKG1vZGlmaWVycywgcGFja2FnZU5hbWUsIG5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgc2Vjb25kYXJ5KTsKIAogCQlhZGRJbmRleEVudHJ5KAotCQkJU1VQRVJfUkVGLCAKKwkJCVNVUEVSX1JFRiwKIAkJCVN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uY3JlYXRlSW5kZXhLZXkoCiAJCQkJbW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBudWxsLCBFTlVNX1NVRkZJWCwgc3VwZXJjbGFzcywgQ0xBU1NfU1VGRklYKSk7CiAJCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCkgewpAQCAtMTA1LDcgKzEzNSw3IEBACiAJCQkJCQltb2RpZmllcnMsIHBhY2thZ2VOYW1lLCBuYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIG51bGwsIEVOVU1fU1VGRklYLCBzdXBlcmludGVyZmFjZSwgSU5URVJGQUNFX1NVRkZJWCkpOwogCQkJfQogCQl9Ci0JfQkKKwl9CiAJcHVibGljIHZvaWQgYWRkRmllbGREZWNsYXJhdGlvbihjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBmaWVsZE5hbWUpIHsKIAkJYWRkSW5kZXhFbnRyeShGSUVMRF9ERUNMLCBGaWVsZFBhdHRlcm4uY3JlYXRlSW5kZXhLZXkoZmllbGROYW1lKSk7CiAJCWFkZFR5cGVSZWZlcmVuY2UodHlwZU5hbWUpOwpAQCAtMTMzLDcgKzE2Myw3IEBACiAJcHVibGljIHZvaWQgYWRkTWV0aG9kRGVjbGFyYXRpb24oY2hhcltdIG1ldGhvZE5hbWUsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW10gcmV0dXJuVHlwZSwgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKIAkJaW50IGFyZ0NvdW50ID0gcGFyYW1ldGVyVHlwZXMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CiAJCWFkZEluZGV4RW50cnkoTUVUSE9EX0RFQ0wsIE1ldGhvZFBhdHRlcm4uY3JlYXRlSW5kZXhLZXkobWV0aG9kTmFtZSwgYXJnQ291bnQpKTsKLQkKKwogCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKQogCQkJCWFkZFR5cGVSZWZlcmVuY2UocGFyYW1ldGVyVHlwZXNbaV0pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRGb2xkZXJUb0luZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZvbGRlclRvSW5kZXguamF2YQppbmRleCBmMDMzODMyLi5hMjUwZjBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZvbGRlclRvSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZvbGRlclRvSW5kZXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00MCw3ICs0MCw3IEBACiAJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCiAJCWlmICh0aGlzLmlzQ2FuY2VsbGVkIHx8IHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiB0cnVlOwotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvCisJCWlmICghdGhpcy5wcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSByZXR1cm4gdHJ1ZTsgLy8gbm90aGluZyB0byBkbwogCQlJUmVzb3VyY2UgZm9sZGVyID0gdGhpcy5wcm9qZWN0LmdldFBhcmVudCgpLmZpbmRNZW1iZXIodGhpcy5mb2xkZXJQYXRoKTsKIAkJaWYgKGZvbGRlciA9PSBudWxsIHx8IGZvbGRlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvLCBzb3VyY2UgZm9sZGVyIHdhcyByZW1vdmVkCiAKQEAgLTc4LDE0ICs3OCwxNCBAQAogCQkJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKIAkJCQkJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwuaXNKYXZhTGlrZUZpbGVOYW1lKHByb3h5LmdldE5hbWUoKSkpIHsKIAkJCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQlpZiAoIVV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zKSkKKwkJCQkJCQkJCQlpZiAoIVV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgQWRkRm9sZGVyVG9JbmRleC50aGlzLmluY2x1c2lvblBhdHRlcm5zLCBBZGRGb2xkZXJUb0luZGV4LnRoaXMuZXhjbHVzaW9uUGF0dGVybnMpKQogCQkJCQkJCQkJCQlpbmRleE1hbmFnZXIuYWRkU291cmNlKChJRmlsZSlyZXNvdXJjZSwgY29udGFpbmVyLCBwYXJzZXIpOwogCQkJCQkJCQkJfQogCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQkJCQkJaWYgKGV4Y2x1c2lvblBhdHRlcm5zICE9IG51bGwgJiYgaW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgeworCQkJCQkJCQkJaWYgKEFkZEZvbGRlclRvSW5kZXgudGhpcy5leGNsdXNpb25QYXR0ZXJucyAhPSBudWxsICYmIEFkZEZvbGRlclRvSW5kZXgudGhpcy5pbmNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CiAJCQkJCQkJCQkJLy8gaWYgdGhlcmUgYXJlIGluY2x1c2lvbiBwYXR0ZXJucyB0aGVuIHdlIG11c3Qgd2FsayB0aGUgY2hpbGRyZW4KLQkJCQkJCQkJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHByb3h5LnJlcXVlc3RGdWxsUGF0aCgpLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIHRydWUpKSAKKwkJCQkJCQkJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHByb3h5LnJlcXVlc3RGdWxsUGF0aCgpLCBBZGRGb2xkZXJUb0luZGV4LnRoaXMuaW5jbHVzaW9uUGF0dGVybnMsIEFkZEZvbGRlclRvSW5kZXgudGhpcy5leGNsdXNpb25QYXR0ZXJucywgdHJ1ZSkpCiAJCQkJCQkJCQkJICAgIHJldHVybiBmYWxzZTsKIAkJCQkJCQkJCX0KIAkJCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEphckZpbGVUb0luZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEphckZpbGVUb0luZGV4LmphdmEKaW5kZXggNDY2YzVmMi4uMTY4OTA0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRKYXJGaWxlVG9JbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiw5ICsyMiwxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TdWZmaXhDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwpAQCAtMzIsNyArMzgsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOwogCiBjbGFzcyBBZGRKYXJGaWxlVG9JbmRleCBleHRlbmRzIEluZGV4UmVxdWVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEpBUl9TRVBBUkFUT1IgPSBJSmF2YVNlYXJjaFNjb3BlLkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUi5jaGFyQXQoMCk7CiAJSUZpbGUgcmVzb3VyY2U7CisJU2Nhbm5lciBzY2FubmVyOwogCiAJcHVibGljIEFkZEphckZpbGVUb0luZGV4KElGaWxlIHJlc291cmNlLCBJbmRleE1hbmFnZXIgbWFuYWdlcikgewogCQlzdXBlcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBtYW5hZ2VyKTsKQEAgLTg0LDYgKzkzLDcgQEAKIAkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsLnZlcmJvc2UoIi0+IGluZGV4IGZvciAiICsgdGhpcy5jb250YWluZXJQYXRoICsgIiBqdXN0IGdvdCBkZWxldGVkIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCQkJcmV0dXJuIHRydWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCiAJCQl9CisJCQlpbmRleC5zZXBhcmF0b3IgPSBKQVJfU0VQQVJBVE9SOwogCQkJWmlwRmlsZSB6aXAgPSBudWxsOwogCQkJdHJ5IHsKIAkJCQkvLyB0aGlzIHBhdGggd2lsbCBiZSBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBpbiBjYXNlIHRoZSB6aXBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYSBwYXRoIGluIHRoZQpAQCAtOTEsNyArMTAxLDcgQEAKIAkJCQlQYXRoIHppcEZpbGVQYXRoID0gbnVsbDsKIAogCQkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkgewogCQkJCQlVUkkgbG9jYXRpb24gPSB0aGlzLnJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7CiAJCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkKQEAgLTE0OSw3ICsxNTksOCBAQAogCQkJCQkJLy8gaXRlcmF0ZSBlYWNoIGVudHJ5IHRvIGluZGV4IGl0CiAJCQkJCQlaaXBFbnRyeSB6ZSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwogCQkJCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IHplLmdldE5hbWUoKTsKLQkJCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZSh6aXBFbnRyeU5hbWUpKQorCQkJCQkJaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKHppcEVudHJ5TmFtZSkgJiYgaXNWYWxpZFBhY2thZ2VOYW1lRm9yQ2xhc3MoemlwRW50cnlOYW1lKSkKKwkJCQkJCQkJLy8gdGhlIGNsYXNzIGZpbGUgbWF5IG5vdCBiZSB0aGVyZSBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIG5vdCB2YWxpZAogCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KHppcEVudHJ5TmFtZSwgRVhJU1RTKTsKIAkJCQkJfQogCQkJCQlib29sZWFuIG5lZWRUb1JlaW5kZXggPSBpbmRleGVkRmlsZU5hbWVzLmVsZW1lbnRTaXplICE9IG1heDsgLy8gYSBuZXcgZmlsZSB3YXMgYWRkZWQKQEAgLTE3NSwxMiArMTg2LDEyIEBACiAJCQkJLy8gSW5kZXggdGhlIGphciBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgcmVpbmRleCB0aGUgamFyIGluIGNhc2UgdGhlIHByZXZpb3VzIGluZGV4IGZpbGUgaGFzIGJlZW4gY29ycnVwdGVkCiAJCQkJLy8gaW5kZXggYWxyZWFkeSBleGlzdGVkOiByZWNyZWF0ZSBpdCBzbyB0aGF0IHdlIGZvcmdldCBhYm91dCBwcmV2aW91cyBlbnRyaWVzCiAJCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCk7Ci0JCQkJaW5kZXggPSBtYW5hZ2VyLnJlY3JlYXRlSW5kZXgodGhpcy5jb250YWluZXJQYXRoKTsKLQkJCQlpZiAoaW5kZXggPT0gbnVsbCkgeworCQkJCWlmICghdGhpcy5tYW5hZ2VyLnJlc2V0SW5kZXgodGhpcy5jb250YWluZXJQYXRoKSkgewogCQkJCQkvLyBmYWlsZWQgdG8gcmVjcmVhdGUgaW5kZXgsIHNlZSA3MzMzMAotCQkJCQltYW5hZ2VyLnJlbW92ZUluZGV4KHRoaXMuY29udGFpbmVyUGF0aCk7CisJCQkJCXRoaXMubWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmNvbnRhaW5lclBhdGgpOwogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQorCQkJCWluZGV4LnNlcGFyYXRvciA9IEpBUl9TRVBBUkFUT1I7CiAKIAkJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB6aXAuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewogCQkJCQlpZiAodGhpcy5pc0NhbmNlbGxlZCkgewpAQCAtMTkxLDcgKzIwMiwxMCBAQAogCiAJCQkJCS8vIGl0ZXJhdGUgZWFjaCBlbnRyeSB0byBpbmRleCBpdAogCQkJCQlaaXBFbnRyeSB6ZSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUoemUuZ2V0TmFtZSgpKSkgeworCQkJCQlTdHJpbmcgemlwRW50cnlOYW1lID0gemUuZ2V0TmFtZSgpOworCQkJCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUoemlwRW50cnlOYW1lKSAmJiAKKwkJCQkJCQlpc1ZhbGlkUGFja2FnZU5hbWVGb3JDbGFzcyh6aXBFbnRyeU5hbWUpKSB7CisJCQkJCQkvLyBpbmRleCBvbmx5IGNsYXNzZXMgY29taW5nIGZyb20gdmFsaWQgcGFja2FnZXMgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzODYxCiAJCQkJCQlmaW5hbCBieXRlW10gY2xhc3NGaWxlQnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldFppcEVudHJ5Qnl0ZUNvbnRlbnQoemUsIHppcCk7CiAJCQkJCQlKYXZhU2VhcmNoRG9jdW1lbnQgZW50cnlEb2N1bWVudCA9IG5ldyBKYXZhU2VhcmNoRG9jdW1lbnQoemUsIHppcEZpbGVQYXRoLCBjbGFzc0ZpbGVCeXRlcywgcGFydGljaXBhbnQpOwogCQkJCQkJdGhpcy5tYW5hZ2VyLmluZGV4RG9jdW1lbnQoZW50cnlEb2N1bWVudCwgcGFydGljaXBhbnQsIGluZGV4LCB0aGlzLmNvbnRhaW5lclBhdGgpOwpAQCAtMjE1LDExICsyMjksNDAgQEAKIAkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwudmVyYm9zZSgiLT4gZmFpbGVkIHRvIGluZGV4ICIgKyB0aGlzLmNvbnRhaW5lclBhdGggKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQl9Ci0JCQltYW5hZ2VyLnJlbW92ZUluZGV4KHRoaXMuY29udGFpbmVyUGF0aCk7CisJCQl0aGlzLm1hbmFnZXIucmVtb3ZlSW5kZXgodGhpcy5jb250YWluZXJQYXRoKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CisJcHVibGljIFN0cmluZyBnZXRKb2JGYW1pbHkoKSB7CisJCWlmICh0aGlzLnJlc291cmNlICE9IG51bGwpCisJCQlyZXR1cm4gc3VwZXIuZ2V0Sm9iRmFtaWx5KCk7CisJCXJldHVybiB0aGlzLmNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOyAvLyBleHRlcm5hbCBqYXIKKwl9CQorCXByaXZhdGUgIGJvb2xlYW4gaXNWYWxpZFBhY2thZ2VOYW1lRm9yQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgeworCQljaGFyW10gY2xhc3NOYW1lQXJyYXkgPSBjbGFzc05hbWUudG9DaGFyQXJyYXkoKTsKKwkJaWYgKHRoaXMuc2Nhbm5lciA9PSBudWxsKQorCQkJdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UgLyogY29tbWVudCAqLywgdHJ1ZSAvKiB3aGl0ZXNwYWNlICovLCBmYWxzZSAvKiBubHMgKi8sCisJCQkJCUNsYXNzRmlsZUNvbnN0YW50cy5KREsxXzMvKiBzb3VyY2VMZXZlbCAqLywgbnVsbC8qIHRhc2tUYWcgKi8sIG51bGwvKiB0YXNrUHJpb3JpdGllcyAqLywgdHJ1ZSAvKiB0YXNrQ2FzZVNlbnNpdGl2ZSAqLyk7CisJCXRoaXMuc2Nhbm5lci5zZXRTb3VyY2UoY2xhc3NOYW1lQXJyYXkpOyAKKwkJdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uID0gY2xhc3NOYW1lQXJyYXkubGVuZ3RoIC0gU3VmZml4Q29uc3RhbnRzLlNVRkZJWF9DTEFTUy5sZW5ndGg7CisJCXRyeSB7CisJCQlpZiAodGhpcy5zY2FubmVyLnNjYW5JZGVudGlmaWVyKCkgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgeworCQkJCXdoaWxlICh0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPiB0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7CisJCQkJCWlmICh0aGlzLnNjYW5uZXIuZ2V0TmV4dENoYXIoKSAhPSAnLycgfHwgdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uIDw9IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5zY2FubmVyLnNjYW5JZGVudGlmaWVyKCkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJLy8gaW52YWxpZCBjbGFzcyBuYW1lCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KIAlwcm90ZWN0ZWQgSW50ZWdlciB1cGRhdGVkSW5kZXhTdGF0ZSgpIHsKIAkJcmV0dXJuIEluZGV4TWFuYWdlci5SRUJVSUxESU5HX1NUQVRFOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9CaW5hcnlJbmRleGVyLmphdmEKaW5kZXggODQ0ZTc4MC4uZGQ1YzIyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9CaW5hcnlJbmRleGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9CaW5hcnlJbmRleGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsOSArMTAsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkV4dHJhRmxhZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOwpAQCAtNDYsMzMgKzQ4LDQyIEBACiAJcHJpdmF0ZSB2b2lkIGFkZEJpbmFyeVN0YW5kYXJkQW5ub3RhdGlvbnMobG9uZyBhbm5vdGF0aW9uVGFnQml0cykgewogCQlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uVGFyZ2V0TUFTSykgIT0gMCkgewogCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVQ7Ci0JCQlhZGRUeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKKwkJCWFkZEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKIAkJCWFkZEJpbmFyeVRhcmdldEFubm90YXRpb24oYW5ub3RhdGlvblRhZ0JpdHMpOwogCQl9CiAJCWlmICgoYW5ub3RhdGlvblRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSAhPSAwKSB7CiAJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX1JFVEVOVElPTjsKLQkJCWFkZFR5cGVSZWZlcmVuY2UoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGgtMV0pOworCQkJYWRkQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGgtMV0pOwogCQkJYWRkQmluYXJ5UmV0ZW50aW9uQW5ub3RhdGlvbihhbm5vdGF0aW9uVGFnQml0cyk7CiAJCX0KIAkJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkRlcHJlY2F0ZWQpICE9IDApIHsKIAkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0RFUFJFQ0FURUQ7Ci0JCQlhZGRUeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKKwkJCWFkZEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKIAkJfQogCQlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRG9jdW1lbnRlZCkgIT0gMCkgewogCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9ET0NVTUVOVEVEOwotCQkJYWRkVHlwZVJlZmVyZW5jZShjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aC0xXSk7CisJCQlhZGRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aC0xXSk7CiAJCX0KIAkJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkluaGVyaXRlZCkgIT0gMCkgewogCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9JTkhFUklURUQ7Ci0JCQlhZGRUeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKKwkJCWFkZEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKIAkJfQogCQlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uT3ZlcnJpZGUpICE9IDApIHsKIAkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09WRVJSSURFOwotCQkJYWRkVHlwZVJlZmVyZW5jZShjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aC0xXSk7CisJCQlhZGRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aC0xXSk7CiAJCX0KIAkJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblN1cHByZXNzV2FybmluZ3MpICE9IDApIHsKIAkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1M7Ci0JCQlhZGRUeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKKwkJCWFkZEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKTsKKwkJfQorCQlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpICE9IDApIHsKKwkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NBRkVWQVJBUkdTOworCQkJYWRkQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGgtMV0pOworCQl9CisJCWlmICgoYW5ub3RhdGlvblRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Qb2x5bW9ycGhpY1NpZ25hdHVyZSkgIT0gMCkgeworCQkJY2hhcltdW10gY29tcG91bmROYW1lID0KKwkJCQkJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSU5WT0tFX01FVEhPREhBTkRMRV8kX1BPTFlNT1JQSElDU0lHTkFUVVJFOworCQkJYWRkQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGgtMV0pOwogCQl9CiAJfQogCXByaXZhdGUgdm9pZCBhZGRCaW5hcnlUYXJnZXRBbm5vdGF0aW9uKGxvbmcgYml0cykgewpAQCAtMTM1LDE4ICsxNDYsMTYgQEAKIAlwcml2YXRlIHZvaWQgYWRkQmluYXJ5UmV0ZW50aW9uQW5ub3RhdGlvbihsb25nIGJpdHMpIHsKIAkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9SRVRFTlRJT05QT0xJQ1k7CiAJCWFkZFR5cGVSZWZlcmVuY2UoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGgtMV0pOwotCQlpZiAoKGJpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SdW50aW1lUmV0ZW50aW9uKSAhPSAwKSB7CisJCWlmICgoYml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb24pID09IFRhZ0JpdHMuQW5ub3RhdGlvblJ1bnRpbWVSZXRlbnRpb24pIHsKIAkJCWFkZEZpZWxkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuVVBQRVJfUlVOVElNRSk7Ci0JCX0KLQkJZWxzZSBpZiAoKGJpdHMgJiBUYWdCaXRzLkFubm90YXRpb25DbGFzc1JldGVudGlvbikgIT0gMCkgeworCQl9IGVsc2UgaWYgKChiaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uQ2xhc3NSZXRlbnRpb24pICE9IDApIHsKIAkJCWFkZEZpZWxkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuVVBQRVJfQ0xBU1MpOwotCQl9Ci0JCWVsc2UgaWYgKChiaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU291cmNlUmV0ZW50aW9uKSAhPSAwKSB7CisJCX0gZWxzZSBpZiAoKGJpdHMgJiBUYWdCaXRzLkFubm90YXRpb25Tb3VyY2VSZXRlbnRpb24pICE9IDApIHsKIAkJCWFkZEZpZWxkUmVmZXJlbmNlKFR5cGVDb25zdGFudHMuVVBQRVJfU09VUkNFKTsKIAkJfQogCX0KIAlwcml2YXRlIHZvaWQgYWRkQmluYXJ5QW5ub3RhdGlvbihJQmluYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWFkZFR5cGVSZWZlcmVuY2UocmVwbGFjZSgnLycsICcuJywgU2lnbmF0dXJlLnRvQ2hhckFycmF5KGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSkpKTsKKwkJYWRkQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UocmVwbGFjZSgnLycsICcuJywgU2lnbmF0dXJlLnRvQ2hhckFycmF5KGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSkpKTsKIAkJSUJpbmFyeUVsZW1lbnRWYWx1ZVBhaXJbXSB2YWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50VmFsdWVQYWlycygpOwogCQlpZiAodmFsdWVQYWlycyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBqPTAsIHZwTGVuZ3RoPXZhbHVlUGFpcnMubGVuZ3RoOyBqPHZwTGVuZ3RoOyBqKyspIHsKQEAgLTIzNywzMiArMjQ2LDMyIEBACiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKEJZVEUsIGFycmF5RGltKTsKIAkJCQkJcmV0dXJuIEJZVEU7Ci0JCQkJCQorCiAJCQkJY2FzZSAnQyc6CiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKENIQVIsIGFycmF5RGltKTsKIAkJCQkJcmV0dXJuIENIQVI7Ci0JCQkJCQorCiAJCQkJY2FzZSAnRCc6CiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKERPVUJMRSwgYXJyYXlEaW0pOwogCQkJCQlyZXR1cm4gRE9VQkxFOwotCQkJCQkKKwogCQkJCWNhc2UgJ0YnOgogCQkJCQlpZiAoYXJyYXlEaW0gPiAwKQogCQkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShGTE9BVCwgYXJyYXlEaW0pOwogCQkJCQlyZXR1cm4gRkxPQVQ7Ci0JCQkJCQorCiAJCQkJY2FzZSAnSSc6CiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoSU5ULCBhcnJheURpbSk7CiAJCQkJCXJldHVybiBJTlQ7Ci0JCQkJCQorCiAJCQkJY2FzZSAnSic6CiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKExPTkcsIGFycmF5RGltKTsKIAkJCQkJcmV0dXJuIExPTkc7Ci0JCQkJCQorCiAJCQkJY2FzZSAnTCc6CiAJCQkJCWludCBpbmRleE9mU2VtaUNvbG9uID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnbmF0dXJlLCBpKzEpOwogCQkJCQlpZiAoaW5kZXhPZlNlbWlDb2xvbiA9PSAtMSkgdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOwpAQCAtMjcwLDI0ICsyNzksMjQgQEAKIAkJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUocmVwbGFjZSgnLycsJy4nLENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2lnbmF0dXJlLCBpICsgMSwgaW5kZXhPZlNlbWlDb2xvbikpLCBhcnJheURpbSk7CiAJCQkJCX0KIAkJCQkJcmV0dXJuIHJlcGxhY2UoJy8nLCcuJyxDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZ25hdHVyZSwgaSArIDEsIGluZGV4T2ZTZW1pQ29sb24pKTsKLQkJCQkJCisKIAkJCQljYXNlICdTJzoKIAkJCQkJaWYgKGFycmF5RGltID4gMCkKIAkJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoU0hPUlQsIGFycmF5RGltKTsKIAkJCQkJcmV0dXJuIFNIT1JUOwotCQkJCQkKKwogCQkJCWNhc2UgJ1onOgogCQkJCQlpZiAoYXJyYXlEaW0gPiAwKQogCQkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShCT09MRUFOLCBhcnJheURpbSk7CiAJCQkJCXJldHVybiBCT09MRUFOOwotCQkJCQkKKwogCQkJCWNhc2UgJ1YnOgogCQkJCQlyZXR1cm4gVk9JRDsKLQkJCQkJCisKIAkJCQljYXNlICdbJzoKIAkJCQkJYXJyYXlEaW0rKzsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJZGVmYXVsdDoKIAkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOwogCQkJfQpAQCAtMzI0LDcgKzMzMyw3IEBACiAJCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CiAJCQkJCWFycmF5RGltID0gMDsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJY2FzZSAnQyc6CiAJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IENIQVI7CiAJCQkJCWlmIChhcnJheURpbSA+IDApCkBAIC0zNDUsMTQgKzM1NCwxNCBAQAogCQkJCQkJY29udmVydFRvQXJyYXlUeXBlKHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJUeXBlc0NvdW50ZXItMSwgYXJyYXlEaW0pOwogCQkJCQlhcnJheURpbSA9IDA7CiAJCQkJCWJyZWFrOwotCQkJCQkKKwogCQkJCWNhc2UgJ0knOgogCQkJCQlwYXJhbWV0ZXJUeXBlc1twYXJhbWV0ZXJUeXBlc0NvdW50ZXIrK10gPSBJTlQ7CiAJCQkJCWlmIChhcnJheURpbSA+IDApCiAJCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CiAJCQkJCWFycmF5RGltID0gMDsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJY2FzZSAnSic6CiAJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IExPTkc7CiAJCQkJCWlmIChhcnJheURpbSA+IDApCkBAIC0zOTIsNyArNDAxLDcgQEAKIAkJCQljYXNlICdbJzoKIAkJCQkJYXJyYXlEaW0rKzsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJZGVmYXVsdDoKIAkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOwogCQkJfQpAQCAtNDEzLDEyICs0MjIsMTIgQEAKIAkJCQkJaWYgKGFycmF5RGltID4gMCkKIAkJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoQllURSwgYXJyYXlEaW0pOwogCQkJCQlyZXR1cm4gQllURTsKLQkJCQkJCisKIAkJCQljYXNlICdDJzoKIAkJCQkJaWYgKGFycmF5RGltID4gMCkKIAkJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoQ0hBUiwgYXJyYXlEaW0pOwogCQkJCQlyZXR1cm4gQ0hBUjsKLQkJCQkJCisKIAkJCQljYXNlICdEJzoKIAkJCQkJaWYgKGFycmF5RGltID4gMCkKIAkJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoRE9VQkxFLCBhcnJheURpbSk7CkBAIC00NjMsNyArNDcyLDcgQEAKIAkJCQljYXNlICdbJzoKIAkJCQkJYXJyYXlEaW0rKzsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJZGVmYXVsdDoKIAkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOwogCQkJfQpAQCAtNTk3LDcgKzYwNiw3IEBACiAJCQkJCQlicmVhazsgLy8gc2tpcCBvdmVyIGFycmF5IHJlZmVyZW5jZXMKIAkJCQkJbmFtZSA9IHJlcGxhY2UoJy8nLCAnLicsIG5hbWUpOyAvLyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgamF2YS5sYW5nLlN0cmluZwogCQkJCQlhZGRUeXBlUmVmZXJlbmNlKG5hbWUpOwotCQkJCQkKKwogCQkJCQkvLyBhbHNvIGFkZCBhIHNpbXBsZSByZWZlcmVuY2Ugb24gZWFjaCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpY2F0aW9uIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NDEpCiAJCQkJCWNoYXJbXVtdIHF1YWxpZmljYXRpb24gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBuYW1lKTsKIAkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IHF1YWxpZmljYXRpb24ubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKQEAgLTYyMCw3ICs2MjksNyBAQAogCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHJldHVybjsKIAkJCWZpbmFsIFN0cmluZyBwYXRoID0gdGhpcy5kb2N1bWVudC5nZXRQYXRoKCk7CiAJCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjb250ZW50cywgcGF0aCA9PSBudWxsID8gbnVsbCA6IHBhdGgudG9DaGFyQXJyYXkoKSk7Ci0JCisKIAkJCS8vIGZpcnN0IGFkZCB0eXBlIHJlZmVyZW5jZXMKIAkJCWNoYXJbXSBjbGFzc05hbWUgPSByZXBsYWNlKCcvJywgJy4nLCByZWFkZXIuZ2V0TmFtZSgpKTsgLy8gbG9va3MgbGlrZSBqYXZhL2xhbmcvU3RyaW5nCiAJCQkvLyBuZWVkIHRvIGV4dHJhY3QgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdGhlIHNpbXBsZSBuYW1lCkBAIC02NTIsNyArNjYxLDcgQEAKIAkJCQkJCS8vIFNlZSBQUiAxR0lSMzQ1OiBJVFBKQ09SRTpBTEwgLSBJbmRleGVyOiBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbgogCQkJCQkJcmV0dXJuOwogCQkJCQl9Ci0JCQkJCWVuY2xvc2luZ1R5cGVOYW1lID0gbmV3IGNoYXJbbmFtZUxlbmd0aF07IAorCQkJCQllbmNsb3NpbmdUeXBlTmFtZSA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOwogCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZ1bGxFbmNsb3NpbmdOYW1lLCBwYWNrYWdlTmFtZUluZGV4ICsgMSwgZW5jbG9zaW5nVHlwZU5hbWUsIDAsIG5hbWVMZW5ndGgpOwogCQkJCX0KIAkJCX0KQEAgLTY2MywxMCArNjcyLDEwIEBACiAJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKGdlbmVyaWNTaWduYXR1cmUsICcvJywgJy4nKTsKIAkJCQl0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcyA9IFNpZ25hdHVyZS5nZXRUeXBlUGFyYW1ldGVycyhnZW5lcmljU2lnbmF0dXJlKTsKIAkJCX0KLQkJCQorCiAJCQkvLyBlbGltaW5hdGUgaW52YWxpZCBpbm5lcmNsYXNzZXMgKDFHNEtDRjcpCiAJCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQkKKwogCQkJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzID0gcmVwbGFjZSgnLycsICcuJywgcmVhZGVyLmdldEludGVyZmFjZU5hbWVzKCkpOwogCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzID0gZW5jbG9zaW5nVHlwZU5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgY2hhcltdW10ge2VuY2xvc2luZ1R5cGVOYW1lfTsKIAkJCWludCBtb2RpZmllcnMgPSByZWFkZXIuZ2V0TW9kaWZpZXJzKCk7CkBAIC02ODUsNyArNjk0LDcgQEAKIAkJCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTCA6CiAJCQkJCWFkZEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24obW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBmYWxzZSk7CiAJCQkJCWJyZWFrOwotCQkJfQkJCQorCQkJfQogCiAJCQkvLyBMb29rIGZvciByZWZlcmVuY2VzIGluIGNsYXNzIGFubm90YXRpb25zCiAJCQlJQmluYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gcmVhZGVyLmdldEFubm90YXRpb25zKCk7CkBAIC02OTksOSArNzA4LDEyIEBACiAJCQlpZiAodGFnQml0cyAhPSAwKSB7CiAJCQkJYWRkQmluYXJ5U3RhbmRhcmRBbm5vdGF0aW9ucyh0YWdCaXRzKTsKIAkJCX0KKwkJCQorCQkJaW50IGV4dHJhRmxhZ3MgPSBFeHRyYUZsYWdzLmdldEV4dHJhRmxhZ3MocmVhZGVyKTsKIAogCQkJLy8gZmlyc3QgcmVmZXJlbmNlIGFsbCBtZXRob2RzIGRlY2xhcmF0aW9ucyBhbmQgZmllbGQgZGVjbGFyYXRpb25zCiAJCQlNZXRob2RJbmZvW10gbWV0aG9kcyA9IChNZXRob2RJbmZvW10pIHJlYWRlci5nZXRNZXRob2RzKCk7CisJCQlib29sZWFuIG5vQ29uc3RydWN0b3IgPSB0cnVlOwogCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJCU1ldGhvZEluZm8gbWV0aG9kID0gbWV0aG9kc1tpXTsKQEAgLTcxMSw3ICs3MjMsMjYgQEAKIAkJCQkJY2hhcltdIHJldHVyblR5cGUgPSBkZWNvZGVSZXR1cm5UeXBlKGRlc2NyaXB0b3IpOwogCQkJCQljaGFyW11bXSBleGNlcHRpb25UeXBlcyA9IHJlcGxhY2UoJy8nLCAnLicsIG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlTmFtZXMoKSk7CiAJCQkJCWlmIChpc0NvbnN0cnVjdG9yKSB7Ci0JCQkJCQlhZGRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGV4Y2VwdGlvblR5cGVzKTsKKwkJCQkJCW5vQ29uc3RydWN0b3IgPSBmYWxzZTsKKwkJCQkJCWNoYXJbXSBzaWduYXR1cmUgPSBtZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOworCQkJCQkJaWYgKHNpZ25hdHVyZSA9PSBudWxsKSB7CisJCQkJCQkJaWYgKHJlYWRlci5pc05lc3RlZFR5cGUoKSAmJiAoKG1vZGlmaWVycyAmIENsYXNzRmlsZUNvbnN0YW50cy5BY2NTdGF0aWMpID09IDApKSB7CisJCQkJCQkJCXNpZ25hdHVyZSA9IHJlbW92ZUZpcnN0U3ludGhldGljUGFyYW1ldGVyKGRlc2NyaXB0b3IpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXNpZ25hdHVyZSA9IGRlc2NyaXB0b3I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYWRkQ29uc3RydWN0b3JEZWNsYXJhdGlvbigKKwkJCQkJCQkJbmFtZSwKKwkJCQkJCQkJcGFyYW1ldGVyVHlwZXMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgsCisJCQkJCQkJCXNpZ25hdHVyZSwJCisJCQkJCQkJCXBhcmFtZXRlclR5cGVzLAorCQkJCQkJCQltZXRob2QuZ2V0QXJndW1lbnROYW1lcygpLAorCQkJCQkJCQltZXRob2QuZ2V0TW9kaWZpZXJzKCksCisJCQkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJCQltb2RpZmllcnMsCisJCQkJCQkJCWV4Y2VwdGlvblR5cGVzLAorCQkJCQkJCQlleHRyYUZsYWdzKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmICghbWV0aG9kLmlzQ2xpbml0KCkpIHsKIAkJCQkJCQlhZGRNZXRob2REZWNsYXJhdGlvbihtZXRob2QuZ2V0U2VsZWN0b3IoKSwgcGFyYW1ldGVyVHlwZXMsIHJldHVyblR5cGUsIGV4Y2VwdGlvblR5cGVzKTsKQEAgLTcyNSw4ICs3NTYsMTUgQEAKIAkJCQkJCQlhZGRCaW5hcnlBbm5vdGF0aW9uKGFubm90YXRpb24pOwogCQkJCQkJfQogCQkJCQl9CisJCQkJCXRhZ0JpdHMgPSBtZXRob2QuZ2V0VGFnQml0cygpICYgVGFnQml0cy5BbGxTdGFuZGFyZEFubm90YXRpb25zTWFzazsKKwkJCQkJaWYgKHRhZ0JpdHMgIT0gMCkgeworCQkJCQkJYWRkQmluYXJ5U3RhbmRhcmRBbm5vdGF0aW9ucyh0YWdCaXRzKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KKwkJCWlmIChub0NvbnN0cnVjdG9yKSB7CisJCQkJYWRkRGVmYXVsdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBwYWNrYWdlTmFtZSwgbW9kaWZpZXJzLCBleHRyYUZsYWdzKTsKKwkJCX0KIAkJCUZpZWxkSW5mb1tdIGZpZWxkcyA9IChGaWVsZEluZm9bXSkgcmVhZGVyLmdldEZpZWxkcygpOwogCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtNzQyLDYgKzc4MCwxMCBAQAogCQkJCQkJCWFkZEJpbmFyeUFubm90YXRpb24oYW5ub3RhdGlvbik7CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJdGFnQml0cyA9IGZpZWxkLmdldFRhZ0JpdHMoKSAmIFRhZ0JpdHMuQWxsU3RhbmRhcmRBbm5vdGF0aW9uc01hc2s7CisJCQkJCWlmICh0YWdCaXRzICE9IDApIHsKKwkJCQkJCWFkZEJpbmFyeVN0YW5kYXJkQW5ub3RhdGlvbnModGFnQml0cyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQkvLyByZWNvcmQgYWxsIHJlZmVyZW5jZXMgZm91bmQgaW5zaWRlIHRoZSAuY2xhc3MgZmlsZQpAQCAtNzQ5LDEzICs3OTEsMzAgQEAKIAkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCQl0aGlzLmRvY3VtZW50LnJlbW92ZUFsbEluZGV4RW50cmllcygpOwotCQkJVXRpbC5sb2coZSwgIkNsYXNzRm9ybWF0RXhjZXB0aW9uIGluICIgKyB0aGlzLmRvY3VtZW50LmdldFBhdGgoKSArICIuIFBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZSB0byBKRFQvQ29yZSBpbmNsdWRpbmcgdGhlIHByb2JsZW1hdGljIGRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJVXRpbC5sb2coSVN0YXR1cy5XQVJOSU5HLCAiVGhlIEphdmEgaW5kZXhpbmcgY291bGQgbm90IGluZGV4ICIgKyB0aGlzLmRvY3VtZW50LmdldFBhdGgoKSArICIuIFRoaXMgLmNsYXNzIGZpbGUgZG9lc24ndCBmb2xsb3cgdGhlIGNsYXNzIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24uIFBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZSBhZ2FpbnN0IHRoZSAuY2xhc3MgZmlsZSB2ZW5kb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjE1NAogCQkJLy8gbG9nZ2luZyB0aGUgZW50cnkgdGhhdCBjb3VsZCBub3QgYmUgaW5kZXhlZCBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUKIAkJCS8vIHdlIHJlbW92ZSBhbGwgZW50cmllcyByZWxhdGl2ZSB0byB0aGUgYm9nZ3VzIGRvY3VtZW50CiAJCQl0aGlzLmRvY3VtZW50LnJlbW92ZUFsbEluZGV4RW50cmllcygpOwotCQkJVXRpbC5sb2coZSwgIkluZGV4ZXIgY3Jhc2hlZCBvbiBkb2N1bWVudCAiICsgdGhpcy5kb2N1bWVudC5nZXRQYXRoKCkgKyAiLiBQbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUgdG8gSkRUL0NvcmUgaW5jbHVkaW5nIHRoZSBwcm9ibGVtYXRpYyBkb2N1bWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCVV0aWwubG9nKElTdGF0dXMuV0FSTklORywgIlRoZSBKYXZhIGluZGV4aW5nIGNvdWxkIG5vdCBpbmRleCAiICsgdGhpcy5kb2N1bWVudC5nZXRQYXRoKCkgKyAiLiBUaGlzIC5jbGFzcyBmaWxlIGRvZXNuJ3QgZm9sbG93IHRoZSBjbGFzcyBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uLiBQbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUgYWdhaW5zdCB0aGUgLmNsYXNzIGZpbGUgdmVuZG9yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCQorCXByaXZhdGUgY2hhcltdIHJlbW92ZUZpcnN0U3ludGhldGljUGFyYW1ldGVyKGNoYXJbXSBkZXNjcmlwdG9yKSB7CisJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHJldHVybiBudWxsOworCQlpZiAoZGVzY3JpcHRvci5sZW5ndGggPCAzKSByZXR1cm4gZGVzY3JpcHRvcjsKKwkJaWYgKGRlc2NyaXB0b3JbMF0gIT0gJygnKSByZXR1cm4gZGVzY3JpcHRvcjsKKwkJaWYgKGRlc2NyaXB0b3JbMV0gIT0gJyknKSB7CisJCQkvLyByZW1vdmUgdGhlIGZpcnN0IHN5bnRoZXRpYyBwYXJhbWV0ZXIKKwkJCWludCBzdGFydCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuc2NhblR5cGVTaWduYXR1cmUoZGVzY3JpcHRvciwgMSkgKyAxOworCQkJaW50IGxlbmd0aCA9IGRlc2NyaXB0b3IubGVuZ3RoIC0gc3RhcnQ7CisJCQljaGFyW10gc2lnbmF0dXJlID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CisJCQlzaWduYXR1cmVbMF0gPSBkZXNjcmlwdG9yWzBdOworCQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9yLCBzdGFydCwgc2lnbmF0dXJlLCAxLCBsZW5ndGgpOworCQkJcmV0dXJuIHNpZ25hdHVyZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkZXNjcmlwdG9yOwogCQl9CiAJfQogCS8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JSW5kZXhDb25zdGFudHMuamF2YQppbmRleCBlZWIxMDY0Li4wYWU0NTY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYsNiArMTYsNyBAQAogCiAJLyogaW5kZXggZW5jb2RpbmcgKi8KIAljaGFyW10gUkVGPSAicmVmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFOTk9UQVRJT05fUkVGPSAiYW5ub3RhdGlvblJlZiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBNRVRIT0RfUkVGPSAibWV0aG9kUmVmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIENPTlNUUlVDVE9SX1JFRj0gImNvbnN0cnVjdG9yUmVmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJY2hhcltdIFNVUEVSX1JFRiA9ICJzdXBlclJlZiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJApAQCAtMjQsMTAgKzI1LDExIEBACiAJY2hhcltdIENPTlNUUlVDVE9SX0RFQ0w9ICJjb25zdHJ1Y3RvckRlY2wiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAljaGFyW10gRklFTERfREVDTD0gImZpZWxkRGVjbCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCWNoYXJbXSBPQkpFQ1QgPSAiT2JqZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JY2hhcltdW10gQ09VTlRTPSAKKwljaGFyW11bXSBDT1VOVFM9CiAJCW5ldyBjaGFyW11bXSB7IG5ldyBjaGFyW10geycvJywgJzAnfSwgbmV3IGNoYXJbXSB7Jy8nLCAnMSd9LCBuZXcgY2hhcltdIHsnLycsICcyJ30sIG5ldyBjaGFyW10geycvJywgJzMnfSwgbmV3IGNoYXJbXSB7Jy8nLCAnNCd9LAogCQkJbmV3IGNoYXJbXSB7Jy8nLCAnNSd9LCBuZXcgY2hhcltdIHsnLycsICc2J30sIG5ldyBjaGFyW10geycvJywgJzcnfSwgbmV3IGNoYXJbXSB7Jy8nLCAnOCd9LCBuZXcgY2hhcltdIHsnLycsICc5J30KIAl9OworCWNoYXJbXSBERUZBVUxUX0NPTlNUUlVDVE9SID0gbmV3IGNoYXJbXXsnLycsICcjJ307CiAJY2hhciBDTEFTU19TVUZGSVggPSAnQyc7CiAJY2hhciBJTlRFUkZBQ0VfU1VGRklYID0gJ0knOwogCWNoYXIgRU5VTV9TVUZGSVggPSAnRSc7CkBAIC0zNywxNCArMzksMTUgQEAKIAljaGFyIENMQVNTX0FORF9JTlRFUkZBQ0VfU1VGRklYID0gSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTsKIAljaGFyIElOVEVSRkFDRV9BTkRfQU5OT1RBVElPTl9TVUZGSVggPSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0VfQU5EX0FOTk9UQVRJT047CiAJY2hhciBTRVBBUkFUT1I9ICcvJzsKKwljaGFyIFBBUkFNRVRFUl9TRVBBUkFUT1I9ICcsJzsKIAljaGFyIFNFQ09OREFSWV9TVUZGSVggPSAnUyc7CiAKIAljaGFyW10gT05FX1NUQVIgPSBuZXcgY2hhcltdIHsnKid9OwogCWNoYXJbXVtdIE9ORV9TVEFSX0NIQVIgPSBuZXcgY2hhcltdW10ge09ORV9TVEFSfTsKIAogCS8vIHVzZWQgYXMgc3BlY2lhbCBtYXJrZXIgZm9yIGVuY2xvc2luZyB0eXBlIG5hbWUgb2YgbG9jYWwgYW5kIGFub255bW91cyBjbGFzc2VzCi0JY2hhciBaRVJPX0NIQVIgPSAnMCc7IAotCWNoYXJbXSBPTkVfWkVSTyA9IG5ldyBjaGFyW10geyBaRVJPX0NIQVIgfTsgCisJY2hhciBaRVJPX0NIQVIgPSAnMCc7CisJY2hhcltdIE9ORV9aRVJPID0gbmV3IGNoYXJbXSB7IFpFUk9fQ0hBUiB9OwogCWNoYXJbXVtdIE9ORV9aRVJPX0NIQVIgPSBuZXcgY2hhcltdW10ge09ORV9aRVJPfTsKIAogCWludCBQS0dfUkVGX1BBVFRFUk4gPSAweDAwMDE7CkBAIC01OCw0ICs2MSw2IEBACiAJaW50IE9SX1BBVFRFUk4gPSAweDAxMDA7CiAJaW50IExPQ0FMX1ZBUl9QQVRURVJOID0gMHgwMjAwOwogCWludCBUWVBFX1BBUkFNX1BBVFRFUk4gPSAweDA0MDA7CisJaW50IEFORF9QQVRURVJOID0gMHgwODAwOworCWludCBBTk5PVF9SRUZfUEFUVEVSTiA9IDB4MTAwMDsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QWxsUHJvamVjdC5qYXZhCmluZGV4IGE2MTY5ZDEuLjQzMTM2MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEFsbFByb2plY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC01NCw4ICs1NCw4IEBACiAJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCiAJCWlmICh0aGlzLmlzQ2FuY2VsbGVkIHx8IHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiB0cnVlOwotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvCi0JCQorCQlpZiAoIXRoaXMucHJvamVjdC5pc0FjY2Vzc2libGUoKSkgcmV0dXJuIHRydWU7IC8vIG5vdGhpbmcgdG8gZG8KKwogCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBudWxsOwogCQl0cnkgewogCQkJLy8gR2V0IHNvdXJjZSBmb2xkZXIgZW50cmllcy4gTGlicmFyaWVzIGFyZSBkb25lIGFzIGEgc2VwYXJhdGUgam9iCkBAIC05MCwxMiArOTAsMTIgQEAKIAkJCX0KIAkJCWlmIChzb3VyY2VFbnRyaWVzTnVtYmVyICE9IGxlbmd0aCkKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZUVudHJpZXMsIDAsIHNvdXJjZUVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3NvdXJjZUVudHJpZXNOdW1iZXJdLCAwLCBzb3VyY2VFbnRyaWVzTnVtYmVyKTsKLQkKKwogCQkJSW5kZXggaW5kZXggPSB0aGlzLm1hbmFnZXIuZ2V0SW5kZXhGb3JVcGRhdGUodGhpcy5jb250YWluZXJQYXRoLCB0cnVlLCAvKnJldXNlIGluZGV4IGZpbGUqLyB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CiAJCQlpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuIHRydWU7CiAJCQltb25pdG9yID0gaW5kZXgubW9uaXRvcjsKIAkJCWlmIChtb25pdG9yID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAotCQkJCisKIAkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHJlYWQKIAogCQkJU3RyaW5nW10gcGF0aHMgPSBpbmRleC5xdWVyeURvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBzb3VyY2VFbnRyaWVzW2ldOwogCQkJCUlSZXNvdXJjZSBzb3VyY2VGb2xkZXIgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKIAkJCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwpIHsKLQkJCQkJCisKIAkJCQkJLy8gY29sbGVjdCBvdXRwdXQgbG9jYXRpb25zIGlmIHNvdXJjZSBpcyBwcm9qZWN0IChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNDEpCiAJCQkJCWZpbmFsIEhhc2hTZXQgb3V0cHV0cyA9IG5ldyBIYXNoU2V0KCk7CiAJCQkJCWlmIChzb3VyY2VGb2xkZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7CkBAIC0xMzAsMTQgKzEzMCwxNCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWZpbmFsIGJvb2xlYW4gaGFzT3V0cHV0cyA9ICFvdXRwdXRzLmlzRW1wdHkoKTsKLQkJCQkJCisKIAkJCQkJZmluYWwgY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMgPSAoKENsYXNzcGF0aEVudHJ5KSBlbnRyeSkuZnVsbEluY2x1c2lvblBhdHRlcm5DaGFycygpOwogCQkJCQlmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpIGVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CiAJCQkJCWlmIChtYXggPT0gMCkgewogCQkJCQkJc291cmNlRm9sZGVyLmFjY2VwdCgKIAkJCQkJCQluZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewogCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgewotCQkJCQkJCQkJaWYgKGlzQ2FuY2VsbGVkKSByZXR1cm4gZmFsc2U7CisJCQkJCQkJCQlpZiAoSW5kZXhBbGxQcm9qZWN0LnRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKIAkJCQkJCQkJCXN3aXRjaChwcm94eS5nZXRUeXBlKCkpIHsKIAkJCQkJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKIAkJCQkJCQkJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgewpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKIAkJCQkJCQkJCQkJaWYgKGV4Y2x1c2lvblBhdHRlcm5zICE9IG51bGwgJiYgaW5jbHVzaW9uUGF0dGVybnMgPT0gbnVsbCkgewogCQkJCQkJCQkJCQkJLy8gaWYgdGhlcmUgYXJlIGluY2x1c2lvbiBwYXR0ZXJucyB0aGVuIHdlIG11c3Qgd2FsayB0aGUgY2hpbGRyZW4KLQkJCQkJCQkJCQkJCWlmIChVdGlsLmlzRXhjbHVkZWQocHJveHkucmVxdWVzdEZ1bGxQYXRoKCksIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucywgdHJ1ZSkpIAorCQkJCQkJCQkJCQkJaWYgKFV0aWwuaXNFeGNsdWRlZChwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKSwgaW5jbHVzaW9uUGF0dGVybnMsIGV4Y2x1c2lvblBhdHRlcm5zLCB0cnVlKSkKIAkJCQkJCQkJCQkJCSAgICByZXR1cm4gZmFsc2U7CiAJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJaWYgKGhhc091dHB1dHMgJiYgb3V0cHV0cy5jb250YWlucyhwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKSkpCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJCQkJCXNvdXJjZUZvbGRlci5hY2NlcHQoCiAJCQkJCQkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKIAkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQkJCWlmIChpc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJaWYgKEluZGV4QWxsUHJvamVjdC50aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gZmFsc2U7CiAJCQkJCQkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CiAJCQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CiAJCQkJCQkJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWwuaXNKYXZhTGlrZUZpbGVOYW1lKHByb3h5LmdldE5hbWUoKSkpIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQkJCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQkJCQkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoU3RyaW5nID0gVXRpbC5yZWxhdGl2ZVBhdGgoZmlsZS5nZXRGdWxsUGF0aCgpLCAxLypyZW1vdmUgcHJvamVjdCBzZWdtZW50Ki8pOwogCQkJCQkJCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5wdXQocmVsYXRpdmVQYXRoU3RyaW5nLAotCQkJCQkJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMuZ2V0KHJlbGF0aXZlUGF0aFN0cmluZykgPT0gbnVsbCAKKwkJCQkJCQkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLmdldChyZWxhdGl2ZVBhdGhTdHJpbmcpID09IG51bGwKIAkJCQkJCQkJCQkJCQkJCXx8IGluZGV4TGFzdE1vZGlmaWVkIDwgRUZTLmdldFN0b3JlKGxvY2F0aW9uKS5mZXRjaEluZm8oKS5nZXRMYXN0TW9kaWZpZWQoKQogCQkJCQkJCQkJCQkJCQk/IChPYmplY3QpIGZpbGUKIAkJCQkJCQkJCQkJCQkJOiAoT2JqZWN0KSBPSyk7CkBAIC0xOTksNyArMTk5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCQorCiAJCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IHRoaXMubWFuYWdlci5nZXRTb3VyY2VFbGVtZW50UGFyc2VyKGphdmFQcm9qZWN0LCBudWxsLypyZXF1ZXN0b3Igd2lsbCBiZSBzZXQgYnkgaW5kZXhlciovKTsKIAkJCU9iamVjdFtdIG5hbWVzID0gaW5kZXhlZEZpbGVOYW1lcy5rZXlUYWJsZTsKIAkJCU9iamVjdFtdIHZhbHVlcyA9IGluZGV4ZWRGaWxlTmFtZXMudmFsdWVUYWJsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhCaW5hcnlGb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhCaW5hcnlGb2xkZXIuamF2YQppbmRleCAxMmFkNmZkLi43YmI5MGY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QmluYXJ5Rm9sZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEJpbmFyeUZvbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTY0LDExICs2NCwxMSBAQAogCQkJaWYgKHBhdGhzID09IG51bGwpIHsKIAkJCQl0aGlzLmZvbGRlci5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKIAkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHsKLQkJCQkJCWlmIChpc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOworCQkJCQkJaWYgKEluZGV4QmluYXJ5Rm9sZGVyLnRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKIAkJCQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKIAkJCQkJCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0NsYXNzRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgewogCQkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCQkJU3RyaW5nIGNvbnRhaW5lclJlbGF0aXZlUGF0aCA9IFV0aWwucmVsYXRpdmVQYXRoKGZpbGUuZ2V0RnVsbFBhdGgoKSwgY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSk7CisJCQkJCQkJCVN0cmluZyBjb250YWluZXJSZWxhdGl2ZVBhdGggPSBVdGlsLnJlbGF0aXZlUGF0aChmaWxlLmdldEZ1bGxQYXRoKCksIEluZGV4QmluYXJ5Rm9sZGVyLnRoaXMuY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSk7CiAJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KGNvbnRhaW5lclJlbGF0aXZlUGF0aCwgZmlsZSk7CiAJCQkJCQkJfQogCQkJCQkJCXJldHVybiBmYWxzZTsKQEAgLTg0LDE2ICs4NCwxNiBAQAogCQkJCXRoaXMuZm9sZGVyLmFjY2VwdCgKIAkJCQkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKIAkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQkJaWYgKGlzQ2FuY2VsbGVkKSByZXR1cm4gZmFsc2U7CisJCQkJCQkJaWYgKEluZGV4QmluYXJ5Rm9sZGVyLnRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKIAkJCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CiAJCQkJCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQ2xhc3NGaWxlTmFtZShwcm94eS5nZXROYW1lKCkpKSB7CiAJCQkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKIAkJCQkJCQkJCVVSSSBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKTsKIAkJCQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGNvbnRhaW5lclJlbGF0aXZlUGF0aCA9IFV0aWwucmVsYXRpdmVQYXRoKGZpbGUuZ2V0RnVsbFBhdGgoKSwgY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSk7CisJCQkJCQkJCQkJU3RyaW5nIGNvbnRhaW5lclJlbGF0aXZlUGF0aCA9IFV0aWwucmVsYXRpdmVQYXRoKGZpbGUuZ2V0RnVsbFBhdGgoKSwgSW5kZXhCaW5hcnlGb2xkZXIudGhpcy5jb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpKTsKIAkJCQkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChjb250YWluZXJSZWxhdGl2ZVBhdGgsCi0JCQkJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMuZ2V0KGNvbnRhaW5lclJlbGF0aXZlUGF0aCkgPT0gbnVsbCAKLQkJCQkJCQkJCQkJCQl8fCBpbmRleExhc3RNb2RpZmllZCA8IAorCQkJCQkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLmdldChjb250YWluZXJSZWxhdGl2ZVBhdGgpID09IG51bGwKKwkJCQkJCQkJCQkJCQl8fCBpbmRleExhc3RNb2RpZmllZCA8CiAJCQkJCQkJCQkJCQkJRUZTLmdldFN0b3JlKGxvY2F0aW9uKS5mZXRjaEluZm8oKS5nZXRMYXN0TW9kaWZpZWQoKQogCQkJCQkJCQkJCQkJPyAoT2JqZWN0KSBmaWxlCiAJCQkJCQkJCQkJCQk6IChPYmplY3QpIE9LKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4TWFuYWdlci5qYXZhCmluZGV4IDdmZmJhNDQuLmYwOGMyNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhNYW5hZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKQEAgLTQ2LDE5ICs0NywyNyBAQAogCiAJLyogbmVlZCB0byBzYXZlID8gKi8KIAlwcml2YXRlIGJvb2xlYW4gbmVlZFRvU2F2ZSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwogCXByaXZhdGUgSVBhdGggamF2YVBsdWdpbkxvY2F0aW9uID0gbnVsbDsKIAogCS8qIGNhbiBvbmx5IHJlcGxhY2UgYSBjdXJyZW50IHN0YXRlIGlmIGl0cyBsZXNzIHRoYW4gdGhlIG5ldyBvbmUgKi8KIAkvLyBrZXkgPSBpbmRleExvY2F0aW9uIHBhdGgsIHZhbHVlID0gaW5kZXggc3RhdGUgaW50ZWdlcgogCXByaXZhdGUgU2ltcGxlTG9va3VwVGFibGUgaW5kZXhTdGF0ZXMgPSBudWxsOwogCXByaXZhdGUgRmlsZSBzYXZlZEluZGV4TmFtZXNGaWxlID0gbmV3IEZpbGUoZ2V0U2F2ZWRJbmRleGVzRGlyZWN0b3J5KCksICJzYXZlZEluZGV4TmFtZXMudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIEludGVnZXIgU0FWRURfU1RBVEUgPSBuZXcgSW50ZWdlcigwKTsKLQlwdWJsaWMgc3RhdGljIEludGVnZXIgVVBEQVRJTkdfU1RBVEUgPSBuZXcgSW50ZWdlcigxKTsKLQlwdWJsaWMgc3RhdGljIEludGVnZXIgVU5LTk9XTl9TVEFURSA9IG5ldyBJbnRlZ2VyKDIpOwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBSRUJVSUxESU5HX1NUQVRFID0gbmV3IEludGVnZXIoMyk7CisJcHJpdmF0ZSBGaWxlIHBhcnRpY2lwYW50SW5kZXhOYW1lc0ZpbGUgPSBuZXcgRmlsZShnZXRTYXZlZEluZGV4ZXNEaXJlY3RvcnkoKSwgInBhcnRpY2lwYW50c0luZGV4TmFtZXMudHh0Iik7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGJvb2xlYW4gamF2YUxpa2VOYW1lc0NoYW5nZWQgPSB0cnVlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBTQVZFRF9TVEFURSA9IG5ldyBJbnRlZ2VyKDApOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBVUERBVElOR19TVEFURSA9IG5ldyBJbnRlZ2VyKDEpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBVTktOT1dOX1NUQVRFID0gbmV3IEludGVnZXIoMik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQlVJTERJTkdfU1RBVEUgPSBuZXcgSW50ZWdlcigzKTsKKwkKKwkvLyBzZWFyY2ggcGFydGljaXBhbnRzIHdobyByZWdpc3RlciBpbmRleGVzIHdpdGggdGhlIGluZGV4IG1hbmFnZXIKKwlwcml2YXRlIFNpbXBsZUxvb2t1cFRhYmxlIHBhcnRpY2lwYW50c0NvbnRhaW5lcnMgPSBudWxsOworCXByaXZhdGUgYm9vbGVhbiBwYXJ0aWNpcGFudFVwZGF0ZWQgPSBmYWxzZTsKIAotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFib3V0VG9VcGRhdGVJbmRleChJUGF0aCBjb250YWluZXJQYXRoLCBJbnRlZ2VyIG5ld0luZGV4U3RhdGUpIHsKKwkvLyBEZWJ1ZworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFib3V0VG9VcGRhdGVJbmRleChJUGF0aCBjb250YWluZXJQYXRoLCBJbnRlZ2VyIG5ld0luZGV4U3RhdGUpIHsKIAkvLyBuZXdJbmRleFN0YXRlIGlzIGVpdGhlciBVUERBVElOR19TVEFURSBvciBSRUJVSUxESU5HX1NUQVRFCiAJLy8gbXVzdCB0YWcgdGhlIGluZGV4IGFzIGluY29uc2lzdGVudCwgaW4gY2FzZSB3ZSBleGl0IGJlZm9yZSB0aGUgdXBkYXRlIGpvYiBpcyBzdGFydGVkCiAJSVBhdGggaW5kZXhMb2NhdGlvbiA9IGNvbXB1dGVJbmRleExvY2F0aW9uKGNvbnRhaW5lclBhdGgpOwpAQCAtODAsNyArODksNyBAQAogICogTm90ZTogdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGJhY2tncm91bmQKICAqLwogcHVibGljIHZvaWQgYWRkQmluYXJ5KElGaWxlIHJlc291cmNlLCBJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsJCisJaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsKIAlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IFNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKTsKIAlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IHBhcnRpY2lwYW50LmdldERvY3VtZW50KHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CiAJSVBhdGggaW5kZXhMb2NhdGlvbiA9IGNvbXB1dGVJbmRleExvY2F0aW9uKGNvbnRhaW5lclBhdGgpOwpAQCAtOTEsMTAgKzEwMCwxMCBAQAogICogTm90ZTogdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGJhY2tncm91bmQKICAqLwogcHVibGljIHZvaWQgYWRkU291cmNlKElGaWxlIHJlc291cmNlLCBJUGF0aCBjb250YWluZXJQYXRoLCBTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlcikgewotCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsKSByZXR1cm47CQorCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsKSByZXR1cm47CiAJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCk7CiAJU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJ0aWNpcGFudC5nZXREb2N1bWVudChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCSgoSW50ZXJuYWxTZWFyY2hEb2N1bWVudCkgZG9jdW1lbnQpLnBhcnNlciA9IHBhcnNlcjsKKwlkb2N1bWVudC5zZXRQYXJzZXIocGFyc2VyKTsKIAlJUGF0aCBpbmRleExvY2F0aW9uID0gY29tcHV0ZUluZGV4TG9jYXRpb24oY29udGFpbmVyUGF0aCk7CiAJc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRvY3VtZW50LCBjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uLCBwYXJ0aWNpcGFudCk7CiB9CkBAIC0xMjUsMTEgKzEzNCwxMSBAQAogCX0KIAlkZWxldGVJbmRleEZpbGVzKGtub3duUGF0aHMpOwogfQotcHVibGljIElQYXRoIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKK3B1YmxpYyBzeW5jaHJvbml6ZWQgSVBhdGggY29tcHV0ZUluZGV4TG9jYXRpb24oSVBhdGggY29udGFpbmVyUGF0aCkgewogCUlQYXRoIGluZGV4TG9jYXRpb24gPSAoSVBhdGgpIHRoaXMuaW5kZXhMb2NhdGlvbnMuZ2V0KGNvbnRhaW5lclBhdGgpOwogCWlmIChpbmRleExvY2F0aW9uID09IG51bGwpIHsKIAkJU3RyaW5nIHBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKLQkJY2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7CisJCUNSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwogCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7CiAJCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5pbmRleCI7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKFZFUkJPU0UpCkBAIC0xNDEsNiArMTUwLDggQEAKIAlyZXR1cm4gaW5kZXhMb2NhdGlvbjsKIH0KIHB1YmxpYyB2b2lkIGRlbGV0ZUluZGV4RmlsZXMoKSB7CisJaWYgKERFQlVHKQorCQlVdGlsLnZlcmJvc2UoIkRlbGV0aW5nIGluZGV4IGZpbGVzIik7IC8vJE5PTi1OTFMtMSQKIAl0aGlzLnNhdmVkSW5kZXhOYW1lc0ZpbGUuZGVsZXRlKCk7IC8vIGZvcmdldCBzYXZlZCBpbmRleGVzICYgZGVsZXRlIGVhY2ggaW5kZXggZmlsZQogCWRlbGV0ZUluZGV4RmlsZXMobnVsbCk7CiB9CkBAIC0xNTMsNyArMTY0LDcgQEAKIAkJaWYgKHBhdGhzVG9LZWVwICE9IG51bGwgJiYgcGF0aHNUb0tlZXAuaW5jbHVkZXMoZmlsZU5hbWUpKSBjb250aW51ZTsKIAkJU3RyaW5nIHN1ZmZpeCA9ICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCiAJCWlmIChmaWxlTmFtZS5yZWdpb25NYXRjaGVzKHRydWUsIGZpbGVOYW1lLmxlbmd0aCgpIC0gc3VmZml4Lmxlbmd0aCgpLCBzdWZmaXgsIDAsIHN1ZmZpeC5sZW5ndGgoKSkpIHsKLQkJCWlmIChWRVJCT1NFKQorCQkJaWYgKFZFUkJPU0UgfHwgREVCVUcpCiAJCQkJVXRpbC52ZXJib3NlKCJEZWxldGluZyBpbmRleCBmaWxlICIgKyBpbmRleGVzRmlsZXNbaV0pOyAvLyROT04tTkxTLTEkCiAJCQlpbmRleGVzRmlsZXNbaV0uZGVsZXRlKCk7CiAJCX0KQEAgLTE2Miw3ICsxNzMsNyBAQAogLyoKICAqIENyZWF0ZXMgYW4gZW1wdHkgaW5kZXggYXQgdGhlIGdpdmVuIGxvY2F0aW9uLCBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBwYXRoLCBpZiBub25lIGV4aXN0LgogICovCi1wdWJsaWMgdm9pZCBlbnN1cmVJbmRleEV4aXN0cyhJUGF0aCBpbmRleExvY2F0aW9uLCBJUGF0aCBjb250YWluZXJQYXRoKSB7CitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlSW5kZXhFeGlzdHMoSVBhdGggaW5kZXhMb2NhdGlvbiwgSVBhdGggY29udGFpbmVyUGF0aCkgewogCVNpbXBsZUxvb2t1cFRhYmxlIHN0YXRlcyA9IGdldEluZGV4U3RhdGVzKCk7CiAJT2JqZWN0IHN0YXRlID0gc3RhdGVzLmdldChpbmRleExvY2F0aW9uKTsKIAlpZiAoc3RhdGUgPT0gbnVsbCkgewpAQCAtMTc0LDExICsxODUsMTEgQEAKIAkvLyBkaXNhYmxlIHRhc2sgdGFncyB0byBzcGVlZCB1cCBwYXJzaW5nCiAJTWFwIG9wdGlvbnMgPSBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7CiAJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkKKwogCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gbmV3IEluZGV4aW5nUGFyc2VyKAotCQlyZXF1ZXN0b3IsIAorCQlyZXF1ZXN0b3IsCiAJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSksCi0JCW5ldyBDb21waWxlck9wdGlvbnMob3B0aW9ucyksIAorCQluZXcgQ29tcGlsZXJPcHRpb25zKG9wdGlvbnMpLAogCQl0cnVlLCAvLyBpbmRleCBsb2NhbCBkZWNsYXJhdGlvbnMKIAkJdHJ1ZSwgLy8gb3B0aW1pemUgc3RyaW5nIGxpdGVyYWxzCiAJCWZhbHNlKTsgLy8gZG8gbm90IHVzZSBzb3VyY2UgamF2YWRvYyBwYXJzZXIgdG8gc3BlZWQgdXAgcGFyc2luZwpAQCAtMTg3LDE1ICsxOTgsMjQgQEAKIAkvLyBBbHdheXMgY2hlY2sgamF2YWRvYyB3aGlsZSBpbmRleGluZwogCXBhcnNlci5qYXZhZG9jUGFyc2VyLmNoZWNrRG9jQ29tbWVudCA9IHRydWU7CiAJcGFyc2VyLmphdmFkb2NQYXJzZXIucmVwb3J0UHJvYmxlbXMgPSBmYWxzZTsKLQkJCisKIAlyZXR1cm4gcGFyc2VyOwogfQogLyoqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBmb3IgYSBnaXZlbiBpbmRleCBsb2NhdGlvbgorICoKKyAqIEBwYXJhbSBpbmRleExvY2F0aW9uIFRoZSBwYXRoIG9mIHRoZSBpbmRleCBmaWxlCisgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGluZGV4IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAorICovCitwdWJsaWMgc3luY2hyb25pemVkIEluZGV4IGdldEluZGV4KElQYXRoIGluZGV4TG9jYXRpb24pIHsKKwlyZXR1cm4gKEluZGV4KSB0aGlzLmluZGV4ZXMuZ2V0KGluZGV4TG9jYXRpb24pOyAvLyBpcyBudWxsIGlmIHVua25vd24sIGNhbGwgaWYgdGhlIGNvbnRhaW5lclBhdGggbXVzdCBiZSBjb21wdXRlZAorfQorLyoqCiAgKiBSZXR1cm5zIHRoZSBpbmRleCBmb3IgYSBnaXZlbiBwcm9qZWN0LCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CiAgKiAtIGlmIGluZGV4IGlzIGFscmVhZHkgaW4gbWVtb3J5OiBhbnN3ZXJzIHRoaXMgb25lIGJhY2sKICAqIC0gaWYgKHJldXNlRXhpc3RpbmdGaWxlKSB0aGVuIHJlYWQgaXQgYW5kIHJldHVybiB0aGlzIGluZGV4IGFuZCByZWNvcmQgaXQgaW4gbWVtb3J5CiAgKiAtIGlmIChjcmVhdGVJZk1pc3NpbmcpIHRoZW4gY3JlYXRlIGEgbmV3IGVtcHR5IGluZGV4IGFuZCByZWNvcmQgaXQgaW4gbWVtb3J5Ci0gKiAKKyAqCiAgKiBXYXJuaW5nOiBEb2VzIG5vdCBjaGVjayB3aGV0aGVyIGluZGV4IGlzIGNvbnNpc3RlbnQgKG5vdCBiZWluZyB1c2VkKQogICovCiBwdWJsaWMgc3luY2hyb25pemVkIEluZGV4IGdldEluZGV4KElQYXRoIGNvbnRhaW5lclBhdGgsIGJvb2xlYW4gcmV1c2VFeGlzdGluZ0ZpbGUsIGJvb2xlYW4gY3JlYXRlSWZNaXNzaW5nKSB7CkBAIC0yMDcsNyArMjI3LDcgQEAKICAqIC0gaWYgaW5kZXggaXMgYWxyZWFkeSBpbiBtZW1vcnk6IGFuc3dlcnMgdGhpcyBvbmUgYmFjawogICogLSBpZiAocmV1c2VFeGlzdGluZ0ZpbGUpIHRoZW4gcmVhZCBpdCBhbmQgcmV0dXJuIHRoaXMgaW5kZXggYW5kIHJlY29yZCBpdCBpbiBtZW1vcnkKICAqIC0gaWYgKGNyZWF0ZUlmTWlzc2luZykgdGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgaW5kZXggYW5kIHJlY29yZCBpdCBpbiBtZW1vcnkKLSAqIAorICoKICAqIFdhcm5pbmc6IERvZXMgbm90IGNoZWNrIHdoZXRoZXIgaW5kZXggaXMgY29uc2lzdGVudCAobm90IGJlaW5nIHVzZWQpCiAgKi8KIHB1YmxpYyBzeW5jaHJvbml6ZWQgSW5kZXggZ2V0SW5kZXgoSVBhdGggY29udGFpbmVyUGF0aCwgSVBhdGggaW5kZXhMb2NhdGlvbiwgYm9vbGVhbiByZXVzZUV4aXN0aW5nRmlsZSwgYm9vbGVhbiBjcmVhdGVJZk1pc3NpbmcpIHsKQEAgLTI0MCw3ICsyNjAsNyBAQAogCQkJCQkJCVV0aWwudmVyYm9zZSgiLT4gY2Fubm90IHJldXNlIGV4aXN0aW5nIGluZGV4OiAiK2luZGV4TG9jYXRpb25TdHJpbmcrIiBwYXRoOiAiK2NvbnRhaW5lclBhdGhTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCXJlYnVpbGRJbmRleChpbmRleExvY2F0aW9uLCBjb250YWluZXJQYXRoKTsKIAkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IAorCQkJCQl9CiAJCQkJCS8qaW5kZXggPSBudWxsOyovIC8vIHdpbGwgZmFsbCB0aHJ1IHRvIGNyZWF0ZUlmTWlzc2luZyAmIGNyZWF0ZSBhIGVtcHR5IGluZGV4IGZvciB0aGUgcmVidWlsZCBhbGwgam9iIHRvIHBvcHVsYXRlCiAJCQkJfQogCQkJfQpAQCAtMjQ4LDcgKzI2OCw3IEBACiAJCQkJcmVidWlsZEluZGV4KGluZGV4TG9jYXRpb24sIGNvbnRhaW5lclBhdGgpOwogCQkJCXJldHVybiBudWxsOwogCQkJfQotCQl9IAorCQl9CiAJCS8vIGluZGV4IHdhc24ndCBmb3VuZCBvbiBkaXNrLCBjb25zaWRlciBjcmVhdGluZyBhbiBlbXB0eSBuZXcgb25lCiAJCWlmIChjcmVhdGVJZk1pc3NpbmcpIHsKIAkJCXRyeSB7CkBAIC0yNjUsMTEgKzI4NSw3NyBAQAogCQkJfQogCQl9CiAJfQotCS8vU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiA8LS0tLT4gIiArIGluZGV4LmdldEluZGV4RmlsZSgpLmdldE5hbWUoKSk7CQorCS8vU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiA8LS0tLT4gIiArIGluZGV4LmdldEluZGV4RmlsZSgpLmdldE5hbWUoKSk7CiAJcmV0dXJuIGluZGV4OwogfQotcHVibGljIHN5bmNocm9uaXplZCBJbmRleCBnZXRJbmRleChJUGF0aCBpbmRleExvY2F0aW9uKSB7Ci0JcmV0dXJuIChJbmRleCkgdGhpcy5pbmRleGVzLmdldChpbmRleExvY2F0aW9uKTsgLy8gaXMgbnVsbCBpZiB1bmtub3duLCBjYWxsIGlmIHRoZSBjb250YWluZXJQYXRoIG11c3QgYmUgY29tcHV0ZWQKKy8qKgorICogUmV0dXJucyBhbGwgdGhlIGV4aXN0aW5nIGluZGV4ZXMgZm9yIGEgbGlzdCBvZiBpbmRleCBsb2NhdGlvbnMuCisgKiBOb3RlIHRoYXQgdGhpcyBtYXkgdHJpZ2dlciBzb21lIGluZGV4ZXMgcmVjcmVhdGlvbiB3b3JrCisgKgorICogQHBhcmFtIGxvY2F0aW9ucyBUaGUgbGlzdCBvZiBvZiB0aGUgaW5kZXggZmlsZXMgcGF0aAorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBpbmRleGVzIGxpc3QuCisgKi8KK3B1YmxpYyBJbmRleFtdIGdldEluZGV4ZXMoSVBhdGhbXSBsb2NhdGlvbnMsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJLy8gYWNxdWlyZSB0aGUgaW4tbWVtb3J5IGluZGV4ZXMgb24gdGhlIGZseQorCWludCBsZW5ndGggPSBsb2NhdGlvbnMubGVuZ3RoOworCUluZGV4W10gbG9jYXRlZEluZGV4ZXMgPSBuZXcgSW5kZXhbbGVuZ3RoXTsKKwlpbnQgY291bnQgPSAwOworCWlmICh0aGlzLmphdmFMaWtlTmFtZXNDaGFuZ2VkKSB7CisJCXRoaXMuamF2YUxpa2VOYW1lc0NoYW5nZWQgPSBoYXNKYXZhTGlrZU5hbWVzQ2hhbmdlZCgpOworCX0KKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBtYXkgdHJpZ2dlciBzb21lIGluZGV4IHJlY3JlYXRpb24gd29yaworCQlJUGF0aCBpbmRleExvY2F0aW9uID0gbG9jYXRpb25zW2ldOworCQlJbmRleCBpbmRleCA9IGdldEluZGV4KGluZGV4TG9jYXRpb24pOworCQlpZiAoaW5kZXggPT0gbnVsbCkgeworCQkJLy8gb25seSBuZWVkIGNvbnRhaW5lclBhdGggaWYgdGhlIGluZGV4IG11c3QgYmUgYnVpbHQKKwkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSAoSVBhdGgpIHRoaXMuaW5kZXhMb2NhdGlvbnMua2V5Rm9yVmFsdWUoaW5kZXhMb2NhdGlvbik7CisJCQlpZiAoY29udGFpbmVyUGF0aCAhPSBudWxsKSB7Ly8gc2FuaXR5IGNoZWNrCisJCQkJaW5kZXggPSBnZXRJbmRleChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCBmYWxzZSAvKmRvIG5vdCBjcmVhdGUgaWYgbm9uZSovKTsKKwkJCQlpZiAoaW5kZXggIT0gbnVsbCAmJiB0aGlzLmphdmFMaWtlTmFtZXNDaGFuZ2VkICYmICFpbmRleC5pc0luZGV4Rm9ySmFyKCkpIHsKKwkJCQkJLy8gV2hlbiBhIGNoYW5nZSBpbiBqYXZhIGxpa2UgbmFtZXMgZXh0ZW5zaW9uIGhhcyBiZWVuIGRldGVjdGVkLCBhbGwKKwkJCQkJLy8gbm9uIGphciBmaWxlcyBpbmRleGVzIChpLmUuIGNvbnRhaW5pbmcgc291cmNlcykgbmVlZCB0byBiZSByZWJ1aWx0LgorCQkJCQkvLyBzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODYzNzkKKwkJCQkJRmlsZSBpbmRleEZpbGUgPSBpbmRleC5nZXRJbmRleEZpbGUoKTsKKwkJCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgeworCQkJCQkJaWYgKERFQlVHKQorCQkJCQkJCVV0aWwudmVyYm9zZSgiQ2hhbmdlIGluIGphdmFMaWtlTmFtZXMgLSByZW1vdmluZyBpbmRleCBmaWxlIGZvciAiICsgY29udGFpbmVyUGF0aCApOyAvLyROT04tTkxTLTEkCisJCQkJCQlpbmRleEZpbGUuZGVsZXRlKCk7CisJCQkJCX0KKwkJCQkJdGhpcy5pbmRleGVzLnB1dChpbmRleExvY2F0aW9uLCBudWxsKTsKKwkJCQkJcmVidWlsZEluZGV4KGluZGV4TG9jYXRpb24sIGNvbnRhaW5lclBhdGgpOworCQkJCQlpbmRleCA9IG51bGw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWdldEphdmFQbHVnaW5Xb3JraW5nTG9jYXRpb24oKS5pc1ByZWZpeE9mKGluZGV4TG9jYXRpb24pKSB7IC8vIHRoZSBpbmRleCBiZWxvbmdzIHRvIG5vbi1qZHQgc2VhcmNoIHBhcnRpY2lwYW50CisJCQkJCWlmIChpbmRleExvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7IAorCQkJCQkJdHJ5IHsKKwkJCQkJCQlJUGF0aCBjb250YWluZXIgPSBnZXRQYXJ0aWNpcGFudHNDb250YWluZXIoaW5kZXhMb2NhdGlvbik7CisJCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisJCQkJCQkJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4TG9jYXRpb24udG9PU1N0cmluZygpLCBjb250YWluZXIudG9PU1N0cmluZygpLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovKTsKKwkJCQkJCQkJdGhpcy5pbmRleGVzLnB1dChpbmRleExvY2F0aW9uLCBpbmRleCk7CisJCQkJCQkJfQorCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJfQorCQkJCQl9IAorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaW5kZXggIT0gbnVsbCkKKwkJCWxvY2F0ZWRJbmRleGVzW2NvdW50KytdID0gaW5kZXg7IC8vIG9ubHkgY29uc2lkZXIgaW5kZXhlcyB3aGljaCBhcmUgcmVhZHkKKwl9CisJaWYgKHRoaXMuamF2YUxpa2VOYW1lc0NoYW5nZWQpIHsKKwkJd3JpdGVKYXZhTGlrZU5hbWVzRmlsZSgpOworCQl0aGlzLmphdmFMaWtlTmFtZXNDaGFuZ2VkID0gZmFsc2U7CisJfQorCWlmIChjb3VudCA8IGxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KGxvY2F0ZWRJbmRleGVzLCAwLCBsb2NhdGVkSW5kZXhlcz1uZXcgSW5kZXhbY291bnRdLCAwLCBjb3VudCk7CisJfQorCXJldHVybiBsb2NhdGVkSW5kZXhlczsKIH0KIHB1YmxpYyBzeW5jaHJvbml6ZWQgSW5kZXggZ2V0SW5kZXhGb3JVcGRhdGUoSVBhdGggY29udGFpbmVyUGF0aCwgYm9vbGVhbiByZXVzZUV4aXN0aW5nRmlsZSwgYm9vbGVhbiBjcmVhdGVJZk1pc3NpbmcpIHsKIAlJUGF0aCBpbmRleExvY2F0aW9uID0gY29tcHV0ZUluZGV4TG9jYXRpb24oY29udGFpbmVyUGF0aCk7CkBAIC0yOTUsMTAgKzM4MSwyMCBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKKwkJLy8gQWxsIHRoZSBpbmRleCBmaWxlcyBhcmUgZ2V0dGluZyBkZWxldGVkIGFuZCBoZW5jZSB0aGVyZSBpcyBubyBuZWVkIHRvIAorCQkvLyBmdXJ0aGVyIGNoZWNrIGZvciBjaGFuZ2UgaW4gamF2YUxpa2VOYW1lcy4gCisJCXdyaXRlSmF2YUxpa2VOYW1lc0ZpbGUoKTsKKwkJdGhpcy5qYXZhTGlrZU5hbWVzQ2hhbmdlZCA9IGZhbHNlOwogCQlkZWxldGVJbmRleEZpbGVzKCk7CiAJfQogCXJldHVybiB0aGlzLmluZGV4U3RhdGVzOwogfQorcHJpdmF0ZSBJUGF0aCBnZXRQYXJ0aWNpcGFudHNDb250YWluZXIoSVBhdGggaW5kZXhMb2NhdGlvbikgeworCWlmICh0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMgPT0gbnVsbCkgeworCQlyZWFkUGFydGljaXBhbnRzSW5kZXhOYW1lc0ZpbGUoKTsKKwl9CisJcmV0dXJuIChJUGF0aCl0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMuZ2V0KGluZGV4TG9jYXRpb24pOworfQogcHJpdmF0ZSBJUGF0aCBnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkgewogCWlmICh0aGlzLmphdmFQbHVnaW5Mb2NhdGlvbiAhPSBudWxsKSByZXR1cm4gdGhpcy5qYXZhUGx1Z2luTG9jYXRpb247CiAKQEAgLTMwOCwxNyArNDA0LDYwIEBACiBwcml2YXRlIEZpbGUgZ2V0U2F2ZWRJbmRleGVzRGlyZWN0b3J5KCkgewogCXJldHVybiBuZXcgRmlsZShnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKIH0KKy8qCisgKiBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjM3OQorICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIGphdmFMaWtlTmFtZXMgc2luY2UgaXQKKyAqIGhhcyBiZWVuIGxhc3Qgc3RvcmVkLiAKKyAqIFRoZSBqYXZhTGlrZU5hbWVzIHN0b3JlZCBpbiB0aGUgZmlsZSBqYXZhTGlrZU5hbWVzLnR4dCAKKyAqIGlzIGNvbXBhcmVkIHdpdGggdGhlIGN1cnJlbnQgamF2YUxpa2VOYW1lcyBhbmQgaWYgdGhlcmUgaXMgYSBjaGFuZ2UsIHRoaXMgCisgKiBmdW5jdGlvbiByZXR1cm5zIHRydWUuIElmIHRoZSBmaWxlIGphdmFMaWtlTmFtZXMudHh0IGRvZXNuJ3QgZXhpc3QgYW5kIHRoZXJlIAorICogaXMgb25seSBvbmUgamF2YUxpa2VOYW1lICguamF2YSksIHRoZW4gdGhpcyByZXR1cm5zIGZhbHNlIHNvIHRoYXQgbm8tcmVpbmRleGluZyAKKyAqIGhhcHBlbnMuIAorICovCitwcml2YXRlIGJvb2xlYW4gaGFzSmF2YUxpa2VOYW1lc0NoYW5nZWQoKSB7CisJY2hhcltdW10gY3VycmVudE5hbWVzID0gVXRpbC5nZXRKYXZhTGlrZUV4dGVuc2lvbnMoKTsKKwlpbnQgY3VycmVudCA9IGN1cnJlbnROYW1lcy5sZW5ndGg7CisJY2hhcltdW10gcHJldk5hbWVzID0gcmVhZEphdmFMaWtlTmFtZXNGaWxlKCk7CisJaWYgKHByZXZOYW1lcyA9PSBudWxsKSB7CisJCWlmIChWRVJCT1NFICYmIGN1cnJlbnQgIT0gMSkKKwkJCVV0aWwudmVyYm9zZSgiTm8gSmF2YSBsaWtlIG5hbWVzIGZvdW5kIGFuZCB0aGVyZSBpcyBhdGxlYXN0IG9uZSBub24tZGVmYXVsdCBqYXZhTGlrZU5hbWUiLCBTeXN0ZW0uZXJyKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gKGN1cnJlbnQgIT0gMSk7IC8vSWdub3JlIGlmIG9ubHkgamF2YQorCX0KKwlpbnQgcHJldiA9IHByZXZOYW1lcy5sZW5ndGg7CisJaWYgKGN1cnJlbnQgIT0gcHJldikgeworCQlpZiAoVkVSQk9TRSkKKwkJCVV0aWwudmVyYm9zZSgiSmF2YSBsaWtlIG5hbWVzIGhhdmUgY2hhbmdlZCIsIFN5c3RlbS5lcnIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoY3VycmVudCA+IDEpIHsKKwkJLy8gU29ydCB0aGUgY3VycmVudCBqYXZhIGxpa2UgbmFtZXMuIAorCQkvLyBDb3B5IHRoZSBhcnJheSB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIFV0aWwgc3RhdGljIHZhcmlhYmxlCisJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudE5hbWVzLCAwLCBjdXJyZW50TmFtZXMgPSBuZXcgY2hhcltjdXJyZW50XVtdLCAwLCBjdXJyZW50KTsKKwkJVXRpbC5zb3J0KGN1cnJlbnROYW1lcyk7CisJfQorCQorCS8vIFRoZSBKYXZhTGlrZU5hbWVzIHdvdWxkIGhhdmUgYmVlbiBzb3J0ZWQgYmVmb3JlIGdldHRpbmcgc3RvcmVkIGluIHRoZSBmaWxlLAorCS8vIGhlbmNlIGp1c3QgZG8gYSBkaXJlY3QgY29tcGFyZS4KKwlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnQ7IGkrKykgeworCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnROYW1lc1tpXSxwcmV2TmFtZXNbaV0pKSB7CisJCQlpZiAoVkVSQk9TRSkKKwkJCQlVdGlsLnZlcmJvc2UoIkphdmEgbGlrZSBuYW1lcyBoYXZlIGNoYW5nZWQiLCBTeXN0ZW0uZXJyKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQogcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCwgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQsIEluZGV4IGluZGV4LCBJUGF0aCBpbmRleExvY2F0aW9uKSB7CiAJdHJ5IHsKLQkJKChJbnRlcm5hbFNlYXJjaERvY3VtZW50KSBzZWFyY2hEb2N1bWVudCkuaW5kZXggPSBpbmRleDsKKwkJc2VhcmNoRG9jdW1lbnQuc2V0SW5kZXgoaW5kZXgpOwogCQlzZWFyY2hQYXJ0aWNpcGFudC5pbmRleERvY3VtZW50KHNlYXJjaERvY3VtZW50LCBpbmRleExvY2F0aW9uKTsKIAl9IGZpbmFsbHkgewotCQkoKEludGVybmFsU2VhcmNoRG9jdW1lbnQpIHNlYXJjaERvY3VtZW50KS5pbmRleCA9IG51bGw7CisJCXNlYXJjaERvY3VtZW50LnNldEluZGV4KG51bGwpOwogCX0KIH0KIC8qKgogICogVHJpZ2dlciBhZGRpdGlvbiBvZiB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBwcm9qZWN0Ci0gKiBOb3RlOiB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gYmFja2dyb3VuZCAKKyAqIE5vdGU6IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBiYWNrZ3JvdW5kCiAgKi8KIHB1YmxpYyB2b2lkIGluZGV4QWxsKElQcm9qZWN0IHByb2plY3QpIHsKIAlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOwpAQCAtMzI3LDE1ICs0NjYsMTUgQEAKIAkvLyBkZXRlcm1pbmUgdGhlIG5ldyBjaGlsZHJlbgogCXRyeSB7CiAJCUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwotCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgbW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7CQorCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgbW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7CiAJCS8vIG9ubHkgY29uc2lkZXIgaW1tZWRpYXRlIGxpYnJhcmllcyAtIGVhY2ggcHJvamVjdCB3aWxsIGRvIHRoZSBzYW1lCiAJCS8vIE5PVEU6IGZvcmNlIHRvIHJlc29sdmUgQ1AgdmFyaWFibGVzIGJlZm9yZSBjYWxsaW5nIGluZGV4ZXIgLSAxOTMwMywgc28gdGhhdCBpbml0aWFsaXplcnMKIAkJLy8gd2lsbCBiZSBydW4gaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKTsJCisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeT0gZW50cmllc1tpXTsKIAkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpCi0JCQkJdGhpcy5pbmRleExpYnJhcnkoZW50cnkuZ2V0UGF0aCgpLCBwcm9qZWN0KTsKKwkJCQlpbmRleExpYnJhcnkoZW50cnkuZ2V0UGF0aCgpLCBwcm9qZWN0KTsKIAkJfQogCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeyAvLyBjYW5ub3QgcmV0cmlldmUgY2xhc3NwYXRoIGluZm8KIAl9CkBAIC0zNDMsNyArNDgyLDcgQEAKIAkvLyBjaGVjayBpZiB0aGUgc2FtZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZQogCUluZGV4UmVxdWVzdCByZXF1ZXN0ID0gbmV3IEluZGV4QWxsUHJvamVjdChwcm9qZWN0LCB0aGlzKTsKIAlpZiAoIWlzSm9iV2FpdGluZyhyZXF1ZXN0KSkKLQkJdGhpcy5yZXF1ZXN0KHJlcXVlc3QpOworCQlyZXF1ZXN0KHJlcXVlc3QpOwogfQogLyoqCiAgKiBUcmlnZ2VyIGFkZGl0aW9uIG9mIGEgbGlicmFyeSB0byBhbiBpbmRleApAQCAtMzUzLDE2ICs0OTIsMTIgQEAKIAkvLyByZXF1ZXN0aW5nUHJvamVjdCBpcyBubyBsb25nZXIgdXNlZCB0byBjYW5jZWwgam9icyBidXQgbGVhdmUgaXQgaGVyZSBqdXN0IGluIGNhc2UKIAlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOwogCi0JT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgcGF0aCwgdHJ1ZSk7CisJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQocGF0aCwgdHJ1ZSk7CiAJSW5kZXhSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOwogCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSkgewogCQlyZXF1ZXN0ID0gbmV3IEFkZEphckZpbGVUb0luZGV4KChJRmlsZSkgdGFyZ2V0LCB0aGlzKTsKIAl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKLQkJaWYgKCgoRmlsZSkgdGFyZ2V0KS5pc0ZpbGUoKSkgewotCQkJcmVxdWVzdCA9IG5ldyBBZGRKYXJGaWxlVG9JbmRleChwYXRoLCB0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQorCQlyZXF1ZXN0ID0gbmV3IEFkZEphckZpbGVUb0luZGV4KHBhdGgsIHRoaXMpOwogCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewogCQlyZXF1ZXN0ID0gbmV3IEluZGV4QmluYXJ5Rm9sZGVyKChJQ29udGFpbmVyKSB0YXJnZXQsIHRoaXMpOwogCX0gZWxzZSB7CkBAIC0zNzEsNyArNTA2LDcgQEAKIAogCS8vIGNoZWNrIGlmIHRoZSBzYW1lIHJlcXVlc3QgaXMgbm90IGFscmVhZHkgaW4gdGhlIHF1ZXVlCiAJaWYgKCFpc0pvYldhaXRpbmcocmVxdWVzdCkpCi0JCXRoaXMucmVxdWVzdChyZXF1ZXN0KTsKKwkJcmVxdWVzdChyZXF1ZXN0KTsKIH0KIC8qKgogICogSW5kZXggdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBmb2xkZXIuCkBAIC0zODQsNyArNTE5LDcgQEAKIAkJaWYgKGlzSm9iV2FpdGluZyhyZXF1ZXN0KSkgcmV0dXJuOwogCX0KIAotCXRoaXMucmVxdWVzdChuZXcgQWRkRm9sZGVyVG9JbmRleChzb3VyY2VGb2xkZXIsIHByb2plY3QsIGluY2x1c2lvblBhdHRlcm5zLCBleGNsdXNpb25QYXR0ZXJucywgdGhpcykpOworCXJlcXVlc3QobmV3IEFkZEZvbGRlclRvSW5kZXgoc291cmNlRm9sZGVyLCBwcm9qZWN0LCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIHRoaXMpKTsKIH0KIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBqb2JXYXNDYW5jZWxsZWQoSVBhdGggY29udGFpbmVyUGF0aCkgewogCUlQYXRoIGluZGV4TG9jYXRpb24gPSBjb21wdXRlSW5kZXhMb2NhdGlvbihjb250YWluZXJQYXRoKTsKQEAgLTQwMSwyNSArNTM2LDQwIEBACiAgKi8KIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlVG9OZXh0Sm9iKCkgewogCS8vIHJlbWVtYmVyIHRoYXQgb25lIGpvYiB3YXMgZXhlY3V0ZWQsIGFuZCB3ZSB3aWxsIG5lZWQgdG8gc2F2ZSBpbmRleGVzIGF0IHNvbWUgcG9pbnQKLQluZWVkVG9TYXZlID0gdHJ1ZTsKKwl0aGlzLm5lZWRUb1NhdmUgPSB0cnVlOwogCXN1cGVyLm1vdmVUb05leHRKb2IoKTsKIH0KIC8qKgogICogTm8gbW9yZSBqb2IgYXdhaXRpbmcuCiAgKi8KIHByb3RlY3RlZCB2b2lkIG5vdGlmeUlkbGUobG9uZyBpZGxpbmdUaW1lKXsKLQlpZiAoaWRsaW5nVGltZSA+IDEwMDAgJiYgbmVlZFRvU2F2ZSkgc2F2ZUluZGV4ZXMoKTsKKwlpZiAoaWRsaW5nVGltZSA+IDEwMDAgJiYgdGhpcy5uZWVkVG9TYXZlKSBzYXZlSW5kZXhlcygpOwogfQogLyoqCiAgKiBOYW1lIG9mIHRoZSBiYWNrZ3JvdW5kIHByb2Nlc3MKICAqLwogcHVibGljIFN0cmluZyBwcm9jZXNzTmFtZSgpewotCXJldHVybiBNZXNzYWdlcy5wcm9jZXNzX25hbWU7IAorCXJldHVybiBNZXNzYWdlcy5wcm9jZXNzX25hbWU7Cit9Citwcml2YXRlIGNoYXJbXVtdIHJlYWRKYXZhTGlrZU5hbWVzRmlsZSgpIHsKKwl0cnkgeworCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpOwkKKwkJRmlsZSBqYXZhTGlrZU5hbWVzRmlsZSA9IG5ldyBGaWxlKHBhdGhOYW1lLCAiamF2YUxpa2VOYW1lcy50eHQiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoIWphdmFMaWtlTmFtZXNGaWxlLmV4aXN0cygpKQorCQkJcmV0dXJuIG51bGw7CisJCWNoYXJbXSBqYXZhTGlrZU5hbWVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQoamF2YUxpa2VOYW1lc0ZpbGUsIG51bGwpOworCQlpZiAoamF2YUxpa2VOYW1lcy5sZW5ndGggPiAwKSB7CisJCQljaGFyW11bXSBuYW1lcyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignXG4nLCBqYXZhTGlrZU5hbWVzKTsKKwkJCXJldHVybiBuYW1lczsKKwkJfQorCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKwkJaWYgKFZFUkJPU0UpCisJCQlVdGlsLnZlcmJvc2UoIkZhaWxlZCB0byByZWFkIGphdmFMaWtlTmFtZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJfQorCXJldHVybiBudWxsOwogfQogcHJpdmF0ZSB2b2lkIHJlYnVpbGRJbmRleChJUGF0aCBpbmRleExvY2F0aW9uLCBJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JaWYgKHdvcmtzcGFjZSA9PSBudWxsKSByZXR1cm47Ci0JT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlLmdldFJvb3QoKSwgY29udGFpbmVyUGF0aCwgdHJ1ZSk7CisJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoY29udGFpbmVyUGF0aCwgdHJ1ZSk7CiAJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47CiAKIAlpZiAoVkVSQk9TRSkKQEAgLTQ1Nyw3ICs2MDcsNyBAQAogCiAJCWlmIChWRVJCT1NFKQogCQkJVXRpbC52ZXJib3NlKCItPiByZWNyZWF0aW5nIGluZGV4OiAiK2luZGV4TG9jYXRpb24rIiBmb3IgcGF0aDogIitjb250YWluZXJQYXRoU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluZGV4ID0gbmV3IEluZGV4KGluZGV4TG9jYXRpb24udG9PU1N0cmluZygpLCBjb250YWluZXJQYXRoU3RyaW5nLCBmYWxzZSAvKnJldXNlIGluZGV4IGZpbGUqLyk7CisJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4TG9jYXRpb24udG9PU1N0cmluZygpLCBjb250YWluZXJQYXRoU3RyaW5nLCBmYWxzZSAvKmRvIG5vdCByZXVzZSBpbmRleCBmaWxlKi8pOwogCQl0aGlzLmluZGV4ZXMucHV0KGluZGV4TG9jYXRpb24sIGluZGV4KTsKIAkJaW5kZXgubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiBpbmRleDsKQEAgLTQ3OCwxMSArNjI4LDExIEBACiAJcmVxdWVzdChuZXcgUmVtb3ZlRnJvbUluZGV4KGNvbnRhaW5lclJlbGF0aXZlUGF0aCwgaW5kZXhlZENvbnRhaW5lciwgdGhpcykpOwogfQogLyoqCi0gKiBSZW1vdmVzIHRoZSBpbmRleCBmb3IgYSBnaXZlbiBwYXRoLiAKKyAqIFJlbW92ZXMgdGhlIGluZGV4IGZvciBhIGdpdmVuIHBhdGguCiAgKiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIGluZGV4IGRpZCBub3QgZXhpc3QuCiAgKi8KIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVJbmRleChJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JaWYgKFZFUkJPU0UpCisJaWYgKFZFUkJPU0UgfHwgREVCVUcpCiAJCVV0aWwudmVyYm9zZSgicmVtb3ZpbmcgaW5kZXggIiArIGNvbnRhaW5lclBhdGgpOyAvLyROT04tTkxTLTEkCiAJSVBhdGggaW5kZXhMb2NhdGlvbiA9IGNvbXB1dGVJbmRleExvY2F0aW9uKGNvbnRhaW5lclBhdGgpOwogCUluZGV4IGluZGV4ID0gZ2V0SW5kZXgoaW5kZXhMb2NhdGlvbik7CkBAIC00OTMsMTUgKzY0MywyMCBAQAogCX0KIAlpZiAoaW5kZXhGaWxlID09IG51bGwpCiAJCWluZGV4RmlsZSA9IG5ldyBGaWxlKGluZGV4TG9jYXRpb24udG9PU1N0cmluZygpKTsgLy8gaW5kZXggaXMgbm90IGNhY2hlZCB5ZXQsIGJ1dCBzdGlsbCB3YW50IHRvIGRlbGV0ZSB0aGUgZmlsZQotCWlmIChpbmRleEZpbGUuZXhpc3RzKCkpCisJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgeworCQlpZiAoREVCVUcpCisJCQlVdGlsLnZlcmJvc2UoInJlbW92aW5nIGluZGV4IGZpbGUgIiArIGluZGV4RmlsZSk7IC8vJE5PTi1OTFMtMSQKIAkJaW5kZXhGaWxlLmRlbGV0ZSgpOworCX0KIAl0aGlzLmluZGV4ZXMucmVtb3ZlS2V5KGluZGV4TG9jYXRpb24pOwogCXVwZGF0ZUluZGV4U3RhdGUoaW5kZXhMb2NhdGlvbiwgbnVsbCk7CiB9CiAvKioKLSAqIFJlbW92ZXMgYWxsIGluZGV4ZXMgd2hvc2UgcGF0aHMgc3RhcnQgd2l0aCAob3IgYXJlIGVxdWFsIHRvKSB0aGUgZ2l2ZW4gcGF0aC4gCisgKiBSZW1vdmVzIGFsbCBpbmRleGVzIHdob3NlIHBhdGhzIHN0YXJ0IHdpdGggKG9yIGFyZSBlcXVhbCB0bykgdGhlIGdpdmVuIHBhdGguCiAgKi8KIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVJbmRleFBhdGgoSVBhdGggcGF0aCkgeworCWlmIChWRVJCT1NFIHx8IERFQlVHKQorCQlVdGlsLnZlcmJvc2UoInJlbW92aW5nIGluZGV4IHBhdGggIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCiAJT2JqZWN0W10ga2V5VGFibGUgPSB0aGlzLmluZGV4ZXMua2V5VGFibGU7CiAJT2JqZWN0W10gdmFsdWVUYWJsZSA9IHRoaXMuaW5kZXhlcy52YWx1ZVRhYmxlOwogCUlQYXRoW10gbG9jYXRpb25zID0gbnVsbDsKQEAgLTUxOCw4ICs2NzMsMTEgQEAKIAkJCQlsb2NhdGlvbnMgPSBuZXcgSVBhdGhbbWF4XTsKIAkJCWxvY2F0aW9uc1tjb3VudCsrXSA9IGluZGV4TG9jYXRpb247CiAJCQlGaWxlIGluZGV4RmlsZSA9IGluZGV4LmdldEluZGV4RmlsZSgpOwotCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkKKwkJCWlmIChpbmRleEZpbGUuZXhpc3RzKCkpIHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCVV0aWwudmVyYm9zZSgicmVtb3ZpbmcgaW5kZXggZmlsZSAiICsgaW5kZXhGaWxlKTsgLy8kTk9OLU5MUy0xJAogCQkJCWluZGV4RmlsZS5kZWxldGUoKTsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCW1heC0tOwogCQl9CkBAIC01MjgsMTAgKzY4NiwxNCBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCQl0aGlzLmluZGV4ZXMucmVtb3ZlS2V5KGxvY2F0aW9uc1tpXSk7CiAJCXJlbW92ZUluZGV4ZXNTdGF0ZShsb2NhdGlvbnMpOworCQlpZiAodGhpcy5wYXJ0aWNpcGFudHNDb250YWluZXJzICE9IG51bGwgJiYgdGhpcy5wYXJ0aWNpcGFudHNDb250YWluZXJzLmdldChwYXRoLnRvT1NTdHJpbmcoKSkgIT0gbnVsbCkgeworCQkJdGhpcy5wYXJ0aWNpcGFudHNDb250YWluZXJzLnJlbW92ZUtleShwYXRoLnRvT1NTdHJpbmcoKSk7CQorCQkJd3JpdGVQYXJ0aWNpcGFudHNJbmRleE5hbWVzRmlsZSgpOworCQl9CiAJfQogfQogLyoqCi0gKiBSZW1vdmVzIGFsbCBpbmRleGVzIHdob3NlIHBhdGhzIHN0YXJ0IHdpdGggKG9yIGFyZSBlcXVhbCB0bykgdGhlIGdpdmVuIHBhdGguIAorICogUmVtb3ZlcyBhbGwgaW5kZXhlcyB3aG9zZSBwYXRocyBzdGFydCB3aXRoIChvciBhcmUgZXF1YWwgdG8pIHRoZSBnaXZlbiBwYXRoLgogICovCiBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5kZXhGYW1pbHkoSVBhdGggcGF0aCkgewogCS8vIG9ubHkgZmluZHMgY2FjaGVkIGluZGV4IGZpbGVzLi4uIHNodXRkb3duIHJlbW92ZXMgYWxsIG5vbi1jYWNoZWQgaW5kZXggZmlsZXMKQEAgLTU0OCw3ICs3MTAsNyBAQAogCX0KIAlpZiAodG9SZW1vdmUgIT0gbnVsbCkKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRvUmVtb3ZlLnNpemUoKTsgaSA8IGxlbmd0aDsgaSsrKQotCQkJdGhpcy5yZW1vdmVJbmRleCgoSVBhdGgpIHRvUmVtb3ZlLmdldChpKSk7CisJCQlyZW1vdmVJbmRleCgoSVBhdGgpIHRvUmVtb3ZlLmdldChpKSk7CiB9CiAvKioKICAqIFJlbW92ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gc291cmNlIGZvbGRlciBmcm9tIHRoZSBpbmRleC4KQEAgLTU2MSw3ICs3MjMsNyBAQAogCQlpZiAoaXNKb2JXYWl0aW5nKHJlcXVlc3QpKSByZXR1cm47CiAJfQogCi0JdGhpcy5yZXF1ZXN0KG5ldyBSZW1vdmVGb2xkZXJGcm9tSW5kZXgoc291cmNlRm9sZGVyLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIHByb2plY3QsIHRoaXMpKTsKKwlyZXF1ZXN0KG5ldyBSZW1vdmVGb2xkZXJGcm9tSW5kZXgoc291cmNlRm9sZGVyLCBpbmNsdXNpb25QYXR0ZXJucywgZXhjbHVzaW9uUGF0dGVybnMsIHByb2plY3QsIHRoaXMpKTsKIH0KIC8qKgogICogRmx1c2ggY3VycmVudCBzdGF0ZQpAQCAtNTc1LDYgKzczNywzNSBAQAogCXRoaXMuaW5kZXhMb2NhdGlvbnMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoKTsKIAl0aGlzLmphdmFQbHVnaW5Mb2NhdGlvbiA9IG51bGw7CiB9CisvKioKKyAqIFJlc2V0cyB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gcGF0aC4KKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5kZXggd2FzIHJlc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXNldEluZGV4KElQYXRoIGNvbnRhaW5lclBhdGgpIHsKKwkvLyBvbmx5IGNhbGxlZCB0byBvdmVyIHdyaXRlIGFuIGV4aXN0aW5nIGNhY2hlZCBpbmRleC4uLgorCVN0cmluZyBjb250YWluZXJQYXRoU3RyaW5nID0gY29udGFpbmVyUGF0aC5nZXREZXZpY2UoKSA9PSBudWxsID8gY29udGFpbmVyUGF0aC50b1N0cmluZygpIDogY29udGFpbmVyUGF0aC50b09TU3RyaW5nKCk7CisJdHJ5IHsKKwkJLy8gUGF0aCBpcyBhbHJlYWR5IGNhbm9uaWNhbAorCQlJUGF0aCBpbmRleExvY2F0aW9uID0gY29tcHV0ZUluZGV4TG9jYXRpb24oY29udGFpbmVyUGF0aCk7CisJCUluZGV4IGluZGV4ID0gZ2V0SW5kZXgoaW5kZXhMb2NhdGlvbik7CisJCWlmIChWRVJCT1NFKSB7CisJCQlVdGlsLnZlcmJvc2UoIi0+IHJlc2V0aW5nIGluZGV4OiAiK2luZGV4TG9jYXRpb24rIiBmb3IgcGF0aDogIitjb250YWluZXJQYXRoU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJaWYgKGluZGV4ID09IG51bGwpIHsKKwkJCS8vIHRoZSBpbmRleCBkb2VzIG5vdCBleGlzdCwgdHJ5IHRvIHJlY3JlYXRlIGl0CisJCQlyZXR1cm4gcmVjcmVhdGVJbmRleChjb250YWluZXJQYXRoKSAhPSBudWxsOworCQl9CisJCWluZGV4LnJlc2V0KCk7CisJCXJldHVybiB0cnVlOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJLy8gVGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBvc3NpYmxlIHJlYXNvbjogdGhlIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KKwkJaWYgKFZFUkJPU0UpIHsKKwkJCVV0aWwudmVyYm9zZSgiLT4gZmFpbGVkIHRvIHJlc2V0IGluZGV4IGZvciBwYXRoOiAiK2NvbnRhaW5lclBhdGhTdHJpbmcpOyAvLyROT04tTkxTLTEkCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CiBwdWJsaWMgdm9pZCBzYXZlSW5kZXgoSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJLy8gbXVzdCBoYXZlIHBlcm1pc3Npb24gdG8gd3JpdGUgZnJvbSB0aGUgd3JpdGUgbW9uaXRvcgogCWlmIChpbmRleC5oYXNDaGFuZ2VkKCkpIHsKQEAgLTYxOCw3ICs4MDksNyBAQAogCQl0cnkgewogCQkJLy8gdGFrZSByZWFkIGxvY2sgYmVmb3JlIGNoZWNraW5nIGlmIGluZGV4IGhhcyBjaGFuZ2VkCiAJCQkvLyBkb24ndCB0YWtlIHdyaXRlIGxvY2sgeWV0IHNpbmNlIGl0IGNhbiBjYXVzZSBhIGRlYWRsb2NrIChzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNTcxKQotCQkJbW9uaXRvci5lbnRlclJlYWQoKTsgCisJCQltb25pdG9yLmVudGVyUmVhZCgpOwogCQkJaWYgKGluZGV4Lmhhc0NoYW5nZWQoKSkgewogCQkJCWlmIChtb25pdG9yLmV4aXRSZWFkRW50ZXJXcml0ZSgpKSB7CiAJCQkJCXRyeSB7CkBAIC02NDAsMTkgKzgzMSwyMyBAQAogCQkJbW9uaXRvci5leGl0UmVhZCgpOwogCQl9CiAJfQorCWlmICh0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMgIT0gbnVsbCAmJiB0aGlzLnBhcnRpY2lwYW50VXBkYXRlZCkgeworCQl3cml0ZVBhcnRpY2lwYW50c0luZGV4TmFtZXNGaWxlKCk7CisJCXRoaXMucGFydGljaXBhbnRVcGRhdGVkID0gZmFsc2U7CisJfQogCXRoaXMubmVlZFRvU2F2ZSA9ICFhbGxTYXZlZDsKIH0KIHB1YmxpYyB2b2lkIHNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhmaW5hbCBTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCwgSVBhdGggY29udGFpbmVyLCBmaW5hbCBJUGF0aCBpbmRleExvY2F0aW9uLCBmaW5hbCBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCkgewogCXJlcXVlc3QobmV3IEluZGV4UmVxdWVzdChjb250YWluZXIsIHRoaXMpIHsKIAkJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCQkJaWYgKHRoaXMuaXNDYW5jZWxsZWQgfHwgcHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIHRydWU7Ci0JCQkKKwogCQkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCiAJCQlJbmRleCBpbmRleCA9IGdldEluZGV4KHRoaXMuY29udGFpbmVyUGF0aCwgaW5kZXhMb2NhdGlvbiwgdHJ1ZSwgLypyZXVzZSBpbmRleCBmaWxlKi8gdHJ1ZSAvKmNyZWF0ZSBpZiBub25lKi8pOwogCQkJaWYgKGluZGV4ID09IG51bGwpIHJldHVybiB0cnVlOwogCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gaW5kZXgubW9uaXRvcjsKIAkJCWlmIChtb25pdG9yID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAotCQkJCisKIAkJCXRyeSB7CiAJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCiAJCQkJaW5kZXhEb2N1bWVudChzZWFyY2hEb2N1bWVudCwgc2VhcmNoUGFydGljaXBhbnQsIGluZGV4LCBpbmRleExvY2F0aW9uKTsKQEAgLTY4Myw3ICs4NzgsNyBAQAogCiBwcml2YXRlIGNoYXJbXVtdIHJlYWRJbmRleFN0YXRlKFN0cmluZyBkaXJPU1N0cmluZykgewogCXRyeSB7Ci0JCWNoYXJbXSBzYXZlZEluZGV4TmFtZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVDaGFyQ29udGVudChzYXZlZEluZGV4TmFtZXNGaWxlLCBudWxsKTsKKwkJY2hhcltdIHNhdmVkSW5kZXhOYW1lcyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KHRoaXMuc2F2ZWRJbmRleE5hbWVzRmlsZSwgbnVsbCk7CiAJCWlmIChzYXZlZEluZGV4TmFtZXMubGVuZ3RoID4gMCkgewogCQkJY2hhcltdW10gbmFtZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJ1xuJywgc2F2ZWRJbmRleE5hbWVzKTsKIAkJCWlmIChuYW1lcy5sZW5ndGggPiAxKSB7CkBAIC02OTksMTMgKzg5NCwzNSBAQAogCX0KIAlyZXR1cm4gbnVsbDsKIH0KK3ByaXZhdGUgdm9pZCByZWFkUGFydGljaXBhbnRzSW5kZXhOYW1lc0ZpbGUoKSB7CisJU2ltcGxlTG9va3VwVGFibGUgY29udGFpbmVycyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKKwl0cnkgeworCQljaGFyW10gcGFydGljaXBhbnRJbmRleE5hbWVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQodGhpcy5wYXJ0aWNpcGFudEluZGV4TmFtZXNGaWxlLCBudWxsKTsKKwkJaWYgKHBhcnRpY2lwYW50SW5kZXhOYW1lcy5sZW5ndGggPiAwKSB7CisJCQljaGFyW11bXSBuYW1lcyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignXG4nLCBwYXJ0aWNpcGFudEluZGV4TmFtZXMpOworCQkJaWYgKG5hbWVzLmxlbmd0aCA+PSAzKSB7CisJCQkJLy8gRmlyc3QgbGluZSBpcyBEaXNrSW5kZXggc2lnbmF0dXJlICAoc2VlIHdyaXRlUGFydGljaXBhbnRzSW5kZXhOYW1lc0ZpbGUoKSkKKwkJCQlpZiAoRGlza0luZGV4LlNJR05BVFVSRS5lcXVhbHMobmV3IFN0cmluZyhuYW1lc1swXSkpKSB7CQkJCQkKKwkJCQkJZm9yIChpbnQgaSA9IDEsIGwgPSBuYW1lcy5sZW5ndGgtMSA7IGkgPCBsIDsgaSs9MikgeworCQkJCQkJY29udGFpbmVycy5wdXQobmV3IFBhdGgobmV3IFN0cmluZyhuYW1lc1tpXSkpLCBuZXcgUGF0aChuZXcgU3RyaW5nKG5hbWVzW2krMV0pKSk7CisJCQkJCX0KKwkJCQl9CQkJCQorCQkJfQorCQl9CQorCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKwkJaWYgKFZFUkJPU0UpCisJCQlVdGlsLnZlcmJvc2UoIkZhaWxlZCB0byByZWFkIHBhcnRpY2lwYW50IGluZGV4IGZpbGUgbmFtZXMiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwl0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMgPSBjb250YWluZXJzOworCXJldHVybjsKK30KIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5kZXhlc1N0YXRlKElQYXRoW10gbG9jYXRpb25zKSB7CiAJZ2V0SW5kZXhTdGF0ZXMoKTsgLy8gZW5zdXJlIHRoZSBzdGF0ZXMgYXJlIGluaXRpYWxpemVkCiAJaW50IGxlbmd0aCA9IGxvY2F0aW9ucy5sZW5ndGg7CiAJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CiAJCWlmIChsb2NhdGlvbnNbaV0gPT0gbnVsbCkgY29udGludWU7Ci0JCWlmICgoaW5kZXhTdGF0ZXMucmVtb3ZlS2V5KGxvY2F0aW9uc1tpXSkgIT0gbnVsbCkpIHsKKwkJaWYgKCh0aGlzLmluZGV4U3RhdGVzLnJlbW92ZUtleShsb2NhdGlvbnNbaV0pICE9IG51bGwpKSB7CiAJCQljaGFuZ2VkID0gdHJ1ZTsKIAkJCWlmIChWRVJCT1NFKSB7CiAJCQkJVXRpbC52ZXJib3NlKCItPiBpbmRleCBzdGF0ZSB1cGRhdGVkIHRvOiA/IGZvcjogIitsb2NhdGlvbnNbaV0pOyAvLyROT04tTkxTLTEkCkBAIC03MjIsMzQgKzkzOSwxMTIgQEAKIAogCWdldEluZGV4U3RhdGVzKCk7IC8vIGVuc3VyZSB0aGUgc3RhdGVzIGFyZSBpbml0aWFsaXplZAogCWlmIChpbmRleFN0YXRlICE9IG51bGwpIHsKLQkJaWYgKGluZGV4U3RhdGUuZXF1YWxzKGluZGV4U3RhdGVzLmdldChpbmRleExvY2F0aW9uKSkpIHJldHVybjsgLy8gbm90IGNoYW5nZWQKLQkJaW5kZXhTdGF0ZXMucHV0KGluZGV4TG9jYXRpb24sIGluZGV4U3RhdGUpOworCQlpZiAoaW5kZXhTdGF0ZS5lcXVhbHModGhpcy5pbmRleFN0YXRlcy5nZXQoaW5kZXhMb2NhdGlvbikpKSByZXR1cm47IC8vIG5vdCBjaGFuZ2VkCisJCXRoaXMuaW5kZXhTdGF0ZXMucHV0KGluZGV4TG9jYXRpb24sIGluZGV4U3RhdGUpOwogCX0gZWxzZSB7Ci0JCWlmICghaW5kZXhTdGF0ZXMuY29udGFpbnNLZXkoaW5kZXhMb2NhdGlvbikpIHJldHVybjsgLy8gZGlkIG5vdCBleGlzdCBhbnl3YXkKLQkJaW5kZXhTdGF0ZXMucmVtb3ZlS2V5KGluZGV4TG9jYXRpb24pOworCQlpZiAoIXRoaXMuaW5kZXhTdGF0ZXMuY29udGFpbnNLZXkoaW5kZXhMb2NhdGlvbikpIHJldHVybjsgLy8gZGlkIG5vdCBleGlzdCBhbnl3YXkKKwkJdGhpcy5pbmRleFN0YXRlcy5yZW1vdmVLZXkoaW5kZXhMb2NhdGlvbik7CiAJfQogCiAJd3JpdGVTYXZlZEluZGV4TmFtZXNGaWxlKCk7CiAKIAlpZiAoVkVSQk9TRSkgewotCQlTdHJpbmcgc3RhdGUgPSAiPyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4U3RhdGUgPT0gU0FWRURfU1RBVEUpIHN0YXRlID0gIlNBVkVEIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChpbmRleFN0YXRlID09IFVQREFUSU5HX1NUQVRFKSBzdGF0ZSA9ICJVUERBVElORyI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoaW5kZXhTdGF0ZSA9PSBVTktOT1dOX1NUQVRFKSBzdGF0ZSA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChpbmRleFN0YXRlID09IFJFQlVJTERJTkdfU1RBVEUpIHN0YXRlID0gIlJFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCi0JCVV0aWwudmVyYm9zZSgiLT4gaW5kZXggc3RhdGUgdXBkYXRlZCB0bzogIiArIHN0YXRlICsgIiBmb3I6ICIraW5kZXhMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAoaW5kZXhTdGF0ZSA9PSBudWxsKSB7CisJCQlVdGlsLnZlcmJvc2UoIi0+IGluZGV4IHN0YXRlIHJlbW92ZWQgZm9yOiAiK2luZGV4TG9jYXRpb24pOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlTdHJpbmcgc3RhdGUgPSAiPyI7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpbmRleFN0YXRlID09IFNBVkVEX1NUQVRFKSBzdGF0ZSA9ICJTQVZFRCI7IC8vJE5PTi1OTFMtMSQKKwkJCWVsc2UgaWYgKGluZGV4U3RhdGUgPT0gVVBEQVRJTkdfU1RBVEUpIHN0YXRlID0gIlVQREFUSU5HIjsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZSBpZiAoaW5kZXhTdGF0ZSA9PSBVTktOT1dOX1NUQVRFKSBzdGF0ZSA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZSBpZiAoaW5kZXhTdGF0ZSA9PSBSRUJVSUxESU5HX1NUQVRFKSBzdGF0ZSA9ICJSRUJVSUxESU5HIjsgLy8kTk9OLU5MUy0xJAorCQkJVXRpbC52ZXJib3NlKCItPiBpbmRleCBzdGF0ZSB1cGRhdGVkIHRvOiAiICsgc3RhdGUgKyAiIGZvcjogIitpbmRleExvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKK30KK3B1YmxpYyB2b2lkIHVwZGF0ZVBhcnRpY2lwYW50KElQYXRoIGluZGV4TG9jYXRpb24sIElQYXRoIGNvbnRhaW5lclBhdGgpIHsKKwlpZiAodGhpcy5wYXJ0aWNpcGFudHNDb250YWluZXJzID09IG51bGwpIHsKKwkJcmVhZFBhcnRpY2lwYW50c0luZGV4TmFtZXNGaWxlKCk7CisJfSAKKwlpZiAodGhpcy5wYXJ0aWNpcGFudHNDb250YWluZXJzLmdldChpbmRleExvY2F0aW9uKSA9PSBudWxsKSB7CisJCXRoaXMucGFydGljaXBhbnRzQ29udGFpbmVycy5wdXQoaW5kZXhMb2NhdGlvbiwgY29udGFpbmVyUGF0aCk7CisJCXRoaXMucGFydGljaXBhbnRVcGRhdGVkICA9IHRydWU7CisJfQorfQorcHJpdmF0ZSB2b2lkIHdyaXRlSmF2YUxpa2VOYW1lc0ZpbGUoKSB7CisJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKwlTdHJpbmcgcGF0aE5hbWUgPSBnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpOworCXRyeSB7CQkKKwkJY2hhcltdW10gY3VycmVudE5hbWVzID0gVXRpbC5nZXRKYXZhTGlrZUV4dGVuc2lvbnMoKTsKKwkJaW50IGxlbmd0aCA9IGN1cnJlbnROYW1lcy5sZW5ndGg7CisJCWlmIChsZW5ndGggPiAxKSB7CisJCQkvLyBTb3J0IHRoZSBjdXJyZW50IGphdmEgbGlrZSBuYW1lcy4gCisJCQkvLyBDb3B5IHRoZSBhcnJheSB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIFV0aWwgc3RhdGljIHZhcmlhYmxlCisJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnROYW1lcywgMCwgY3VycmVudE5hbWVzPW5ldyBjaGFyW2xlbmd0aF1bXSwgMCwgbGVuZ3RoKTsKKwkJCVV0aWwuc29ydChjdXJyZW50TmFtZXMpOworCQl9CisJCUZpbGUgamF2YUxpa2VOYW1lc0ZpbGUgPSBuZXcgRmlsZShwYXRoTmFtZSwgImphdmFMaWtlTmFtZXMudHh0Iik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGphdmFMaWtlTmFtZXNGaWxlKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoLTE7IGkrKykgeworCQkJd3JpdGVyLndyaXRlKGN1cnJlbnROYW1lc1tpXSk7CisJCQl3cml0ZXIud3JpdGUoJ1xuJyk7CisJCX0KKwkJaWYgKGxlbmd0aCA+IDApIAorCQkJd3JpdGVyLndyaXRlKGN1cnJlbnROYW1lc1tsZW5ndGgtMV0pOworCQkKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisJCWlmIChWRVJCT1NFKQorCQkJVXRpbC52ZXJib3NlKCJGYWlsZWQgdG8gd3JpdGUgamF2YUxpa2VOYW1lcyBmaWxlIiwgU3lzdGVtLmVycik7IC8vJE5PTi1OTFMtMSQKKwl9IGZpbmFsbHkgeworCQlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJd3JpdGVyLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwl9Cit9Citwcml2YXRlIHZvaWQgd3JpdGVQYXJ0aWNpcGFudHNJbmRleE5hbWVzRmlsZSgpIHsKKwlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOworCXRyeSB7CisJCXdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcih0aGlzLnBhcnRpY2lwYW50SW5kZXhOYW1lc0ZpbGUpKTsKKwkJd3JpdGVyLndyaXRlKERpc2tJbmRleC5TSUdOQVRVUkUpOworCQl3cml0ZXIud3JpdGUoJ1xuJyk7CisJCU9iamVjdFtdIGluZGV4RmlsZXMgPSB0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMua2V5VGFibGU7CisJCU9iamVjdFtdIGNvbnRhaW5lcnMgPSB0aGlzLnBhcnRpY2lwYW50c0NvbnRhaW5lcnMudmFsdWVUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBpbmRleEZpbGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJSVBhdGggaW5kZXhGaWxlID0gKElQYXRoKWluZGV4RmlsZXNbaV07CisJCQlpZiAoaW5kZXhGaWxlICE9IG51bGwpIHsKKwkJCQl3cml0ZXIud3JpdGUoaW5kZXhGaWxlLnRvT1NTdHJpbmcoKSk7CisJCQkJd3JpdGVyLndyaXRlKCdcbicpOworCQkJCXdyaXRlci53cml0ZSgoKElQYXRoKWNvbnRhaW5lcnNbaV0pLnRvT1NTdHJpbmcoKSk7CisJCQkJd3JpdGVyLndyaXRlKCdcbicpOworCQkJfQorCQl9CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworCQlpZiAoVkVSQk9TRSkKKwkJCVV0aWwudmVyYm9zZSgiRmFpbGVkIHRvIHdyaXRlIHBhcnRpY2lwYW50IGluZGV4IGZpbGUgbmFtZXMiLCBTeXN0ZW0uZXJyKTsgLy8kTk9OLU5MUy0xJAorCX0gZmluYWxseSB7CisJCWlmICh3cml0ZXIgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl3cml0ZXIuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQogCX0KIH0KIHByaXZhdGUgdm9pZCB3cml0ZVNhdmVkSW5kZXhOYW1lc0ZpbGUoKSB7CiAJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKIAl0cnkgewotCQl3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoc2F2ZWRJbmRleE5hbWVzRmlsZSkpOworCQl3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGhpcy5zYXZlZEluZGV4TmFtZXNGaWxlKSk7CiAJCXdyaXRlci53cml0ZShEaXNrSW5kZXguU0lHTkFUVVJFKTsKIAkJd3JpdGVyLndyaXRlKCcrJyk7CiAJCXdyaXRlci53cml0ZShnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKIAkJd3JpdGVyLndyaXRlKCdcbicpOwotCQlPYmplY3RbXSBrZXlzID0gaW5kZXhTdGF0ZXMua2V5VGFibGU7Ci0JCU9iamVjdFtdIHN0YXRlcyA9IGluZGV4U3RhdGVzLnZhbHVlVGFibGU7CisJCU9iamVjdFtdIGtleXMgPSB0aGlzLmluZGV4U3RhdGVzLmtleVRhYmxlOworCQlPYmplY3RbXSBzdGF0ZXMgPSB0aGlzLmluZGV4U3RhdGVzLnZhbHVlVGFibGU7CiAJCWZvciAoaW50IGkgPSAwLCBsID0gc3RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJSVBhdGgga2V5ID0gKElQYXRoKSBrZXlzW2ldOwogCQkJaWYgKGtleSAhPSBudWxsICYmICFrZXkuaXNFbXB0eSgpICYmIHN0YXRlc1tpXSA9PSBTQVZFRF9TVEFURSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleFJlcXVlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhSZXF1ZXN0LmphdmEKaW5kZXggNTM4YTAzNi4uZDkxOWZlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleFJlcXVlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4UmVxdWVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM2LDYgKzM2LDkgQEAKIAkJLy8gdGFnIHRoZSBpbmRleCBhcyBpbmNvbnNpc3RlbnQKIAkJdGhpcy5tYW5hZ2VyLmFib3V0VG9VcGRhdGVJbmRleCh0aGlzLmNvbnRhaW5lclBhdGgsIHVwZGF0ZWRJbmRleFN0YXRlKCkpOwogCX0KKwlwdWJsaWMgU3RyaW5nIGdldEpvYkZhbWlseSgpIHsKKwkJcmV0dXJuIHRoaXMuY29udGFpbmVyUGF0aC50b1N0cmluZygpOworCX0KIAlwcm90ZWN0ZWQgSW50ZWdlciB1cGRhdGVkSW5kZXhTdGF0ZSgpIHsKIAkJcmV0dXJuIEluZGV4TWFuYWdlci5VUERBVElOR19TVEFURTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4aW5nUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4aW5nUGFyc2VyLmphdmEKaW5kZXggYjk4MTkwYS4uMjUzZmYxYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleGluZ1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhpbmdQYXJzZXIuamF2YQpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMyLDcgKzMyLDcgQEAKIAkJc3VwZXIocmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSwgb3B0aW9ucywgcmVwb3J0TG9jYWxEZWNsYXJhdGlvbnMsCiAJCQkJb3B0aW1pemVTdHJpbmdMaXRlcmFscywgdXNlU291cmNlSmF2YWRvY1BhcnNlcik7CiAJfQotCQorCiAJcHJvdGVjdGVkIEltcG9ydFJlZmVyZW5jZSBuZXdJbXBvcnRSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zLCBsb25nW10gc291cmNlUG9zaXRpb25zLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kKSB7CiAJCUltcG9ydFJlZmVyZW5jZSByZWYgPSB0aGlzLmltcG9ydFJlZmVyZW5jZTsKIAkJcmVmLnRva2VucyA9IHRva2VuczsKQEAgLTQyLDcgKzQyLDcgQEAKIAkJfQogCQlyZWYuc291cmNlRW5kID0gKGludCkgKHNvdXJjZVBvc2l0aW9uc1tzb3VyY2VQb3NpdGlvbnMubGVuZ3RoLTFdICYgMHgwMDAwMDAwMEZGRkZGRkZGKTsKIAkJcmVmLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNvdXJjZVBvc2l0aW9uc1swXSA+Pj4gMzIpOwotCQlyZWYubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCQlyZWYubW9kaWZpZXJzID0gdGhpcy5tb2RpZmllcnM7CiAJCXJldHVybiByZWY7CiAJfQogCkBAIC01Myw3ICs1Myw3IEBACiAJCXJlZi5zb3VyY2VFbmQgPSAoaW50KSBwb3NpdGlvbnM7CiAJCXJldHVybiByZWY7CiAJfQotCQorCiAJcHJvdGVjdGVkIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgbmV3UXVhbGlmaWVkTmFtZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewogCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9IHRoaXMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKIAkJcmVmLnRva2VucyA9IHRva2VuczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW50ZXJuYWxTZWFyY2hEb2N1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbnRlcm5hbFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2NkZTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbnRlcm5hbFNlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlNvdXJjZUVsZW1lbnRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSW5kZXg7Ci0KLS8qKgotICogSW50ZXJuYWwgc2VhcmNoIGRvY3VtZW50IGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbFNlYXJjaERvY3VtZW50IHsKLQlJbmRleCBpbmRleDsKLQlwcml2YXRlIFN0cmluZyBjb250YWluZXJSZWxhdGl2ZVBhdGg7Ci0JU291cmNlRWxlbWVudFBhcnNlciBwYXJzZXI7Ci0JLyoKLQkgKiBIaWRkZW4gYnkgQVBJIFNlYXJjaERvY3VtZW50IHN1YmNsYXNzCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5kZXhFbnRyeShjaGFyW10gY2F0ZWdvcnksIGNoYXJbXSBrZXkpIHsKLQkJaWYgKHRoaXMuaW5kZXggIT0gbnVsbCkKLQkJCWluZGV4LmFkZEluZGV4RW50cnkoY2F0ZWdvcnksIGtleSwgZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKCkpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoKSB7Ci0JCWlmICh0aGlzLmNvbnRhaW5lclJlbGF0aXZlUGF0aCA9PSBudWxsKQotCQkJdGhpcy5jb250YWluZXJSZWxhdGl2ZVBhdGggPSB0aGlzLmluZGV4LmNvbnRhaW5lclJlbGF0aXZlUGF0aChnZXRQYXRoKCkpOwotCQlyZXR1cm4gdGhpcy5jb250YWluZXJSZWxhdGl2ZVBhdGg7Ci0JfQotCS8qCi0JICogSGlkZGVuIGJ5IEFQSSBTZWFyY2hEb2N1bWVudCBzdWJjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbEluZGV4RW50cmllcygpIHsKLQkJaWYgKHRoaXMuaW5kZXggIT0gbnVsbCkKLQkJCWluZGV4LnJlbW92ZShnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoKSk7Ci0JfQotCS8qCi0JICogSGlkZGVuIGJ5IEFQSSBTZWFyY2hEb2N1bWVudCBzdWJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZWFkV3JpdGVNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlYWRXcml0ZU1vbml0b3IuamF2YQppbmRleCA3NTlhNTc1Li4yODI0YWVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlYWRXcml0ZU1vbml0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlYWRXcml0ZU1vbml0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNywzNSArMjcsMzUgQEAKICAqIEJsb2NraW5nIG9ubHkgd2hlbiBhbHJlYWR5IHdyaXRpbmcuCiAgKi8KIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbnRlclJlYWQoKSB7Ci0Jd2hpbGUgKHN0YXR1cyA8IDApIHsKKwl3aGlsZSAodGhpcy5zdGF0dXMgPCAwKSB7CiAJCXRyeSB7CiAJCQl3YWl0KCk7CiAJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogCQkJLy8gaWdub3JlCiAJCX0KIAl9Ci0Jc3RhdHVzKys7CisJdGhpcy5zdGF0dXMrKzsKIH0KIC8qKgogICogT25seSBvbmUgd3JpdGVyIGF0IGEgdGltZSBpcyBhbGxvd2VkIHRvIHBlcmZvcm0KICAqIEJsb2NraW5nIG9ubHkgd2hlbiBhbHJlYWR5IHdyaXRpbmcgb3IgcmVhZGluZy4KICAqLwogcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVudGVyV3JpdGUoKSB7Ci0Jd2hpbGUgKHN0YXR1cyAhPSAwKSB7CisJd2hpbGUgKHRoaXMuc3RhdHVzICE9IDApIHsKIAkJdHJ5IHsKIAkJCXdhaXQoKTsKIAkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAJCQkvLyBpZ25vcmUKIAkJfQogCX0KLQlzdGF0dXMtLTsKKwl0aGlzLnN0YXR1cy0tOwogfQogLyoqCiAgKiBPbmx5IG5vdGlmeSB3YWl0aW5nIHdyaXRlcihzKSBpZiBsYXN0IHJlYWRlcgogICovCiBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZXhpdFJlYWQoKSB7CiAKLQlpZiAoLS1zdGF0dXMgPT0gMCkgbm90aWZ5QWxsKCk7CisJaWYgKC0tdGhpcy5zdGF0dXMgPT0gMCkgbm90aWZ5QWxsKCk7CiB9CiAvKioKICAqIFdoZW4gd3JpdGluZyBpcyBvdmVyLCBhbGwgcmVhZGVycyBhbmQgcG9zc2libGUKQEAgLTYzLDcgKzYzLDcgQEAKICAqLwogcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4aXRXcml0ZSgpIHsKIAotCWlmICgrK3N0YXR1cyA9PSAwKSBub3RpZnlBbGwoKTsKKwlpZiAoKyt0aGlzLnN0YXR1cyA9PSAwKSBub3RpZnlBbGwoKTsKIH0KIC8qKgogICogQXRvbWljIGV4aXRSZWFkL2VudGVyV3JpdGU6IEFsbG93cyB0byBrZWVwIG1vbml0b3IgaW4gYmV0d2VlbgpAQCAtNzIsOSArNzIsOSBAQAogICogUmV0dXJucyBmYWxzZSBpZiBtdWx0aXBsZSByZWFkZXJzIGFyZSBhY2Nlc3NpbmcgdGhlIGluZGV4LgogICovCiBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXhpdFJlYWRFbnRlcldyaXRlKCkgewotCWlmIChzdGF0dXMgIT0gMSkgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGNvbnRpbnVlIGlmIHRoaXMgaXMgdGhlIG9ubHkgcmVhZGVyCisJaWYgKHRoaXMuc3RhdHVzICE9IDEpIHJldHVybiBmYWxzZTsgLy8gb25seSBjb250aW51ZSBpZiB0aGlzIGlzIHRoZSBvbmx5IHJlYWRlcgogCi0Jc3RhdHVzID0gLTE7CisJdGhpcy5zdGF0dXMgPSAtMTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIC8qKgpAQCAtOTEsMTYgKzkxLDE2IEBACiAgKiA8L3ByZT4KICAqLwogcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4aXRXcml0ZUVudGVyUmVhZCgpIHsKLQl0aGlzLmV4aXRXcml0ZSgpOwotCXRoaXMuZW50ZXJSZWFkKCk7CisJZXhpdFdyaXRlKCk7CisJZW50ZXJSZWFkKCk7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7CisJaWYgKHRoaXMuc3RhdHVzID09IDApIHsKIAkJYnVmZmVyLmFwcGVuZCgiTW9uaXRvciBpZGxlICIpOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIGlmIChzdGF0dXMgPCAwKSB7CisJfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA8IDApIHsKIAkJYnVmZmVyLmFwcGVuZCgiTW9uaXRvciB3cml0aW5nICIpOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIGlmIChzdGF0dXMgPiAwKSB7CisJfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA+IDApIHsKIAkJYnVmZmVyLmFwcGVuZCgiTW9uaXRvciByZWFkaW5nICIpOyAvLyROT04tTkxTLTEkCiAJfQogCWJ1ZmZlci5hcHBlbmQoIihzdGF0dXMgPSAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRm9sZGVyRnJvbUluZGV4LmphdmEKaW5kZXggMzJmNWYyZi4uNzA0M2Y2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZvbGRlckZyb21JbmRleC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0LDE0ICsyNCwxMiBAQAogCUlQYXRoIGZvbGRlclBhdGg7CiAJY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnM7CiAJY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnM7Ci0JSVByb2plY3QgcHJvamVjdDsKIAogCXB1YmxpYyBSZW1vdmVGb2xkZXJGcm9tSW5kZXgoSVBhdGggZm9sZGVyUGF0aCwgY2hhcltdW10gaW5jbHVzaW9uUGF0dGVybnMsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zLCBJUHJvamVjdCBwcm9qZWN0LCBJbmRleE1hbmFnZXIgbWFuYWdlcikgewogCQlzdXBlcihwcm9qZWN0LmdldEZ1bGxQYXRoKCksIG1hbmFnZXIpOwogCQl0aGlzLmZvbGRlclBhdGggPSBmb2xkZXJQYXRoOwogCQl0aGlzLmluY2x1c2lvblBhdHRlcm5zID0gaW5jbHVzaW9uUGF0dGVybnM7CiAJCXRoaXMuZXhjbHVzaW9uUGF0dGVybnMgPSBleGNsdXNpb25QYXR0ZXJuczsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAl9CiAJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewogCkBAIC01MSwxMyArNDksMTMgQEAKIAkJCWlmIChwYXRocyAhPSBudWxsKSB7CiAJCQkJaWYgKHRoaXMuZXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCAmJiB0aGlzLmluY2x1c2lvblBhdHRlcm5zID09IG51bGwpIHsKIAkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhdGhzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShwYXRoc1tpXSwgdGhpcy5jb250YWluZXJQYXRoKTsgLy8gd3JpdGUgbG9jayB3aWxsIGJlIGFjcXVpcmVkIGJ5IHRoZSByZW1vdmUgb3BlcmF0aW9uCisJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlKHBhdGhzW2ldLCB0aGlzLmNvbnRhaW5lclBhdGgpOyAvLyB3cml0ZSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkgdGhlIHJlbW92ZSBvcGVyYXRpb24KIAkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXRocy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQkJU3RyaW5nIGRvY3VtZW50UGF0aCA9ICB0aGlzLmNvbnRhaW5lclBhdGgudG9TdHJpbmcoKSArICcvJyArIHBhdGhzW2ldOwogCQkJCQkJaWYgKCFVdGlsLmlzRXhjbHVkZWQobmV3IFBhdGgoZG9jdW1lbnRQYXRoKSwgdGhpcy5pbmNsdXNpb25QYXR0ZXJucywgdGhpcy5leGNsdXNpb25QYXR0ZXJucywgZmFsc2UpKQotCQkJCQkJCW1hbmFnZXIucmVtb3ZlKHBhdGhzW2ldLCB0aGlzLmNvbnRhaW5lclBhdGgpOyAvLyB3cml0ZSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkgdGhlIHJlbW92ZSBvcGVyYXRpb24KKwkJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlKHBhdGhzW2ldLCB0aGlzLmNvbnRhaW5lclBhdGgpOyAvLyB3cml0ZSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkgdGhlIHJlbW92ZSBvcGVyYXRpb24KIAkJCQkJfQogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRnJvbUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZyb21JbmRleC5qYXZhCmluZGV4IDUzYmNkMjIuLjEyM2Y5NzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRnJvbUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMyw3ICszMyw3IEBACiAKIAkJdHJ5IHsKIAkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQotCQkJaW5kZXgucmVtb3ZlKHJlc291cmNlTmFtZSk7CisJCQlpbmRleC5yZW1vdmUodGhpcy5yZXNvdXJjZU5hbWUpOwogCQl9IGZpbmFsbHkgewogCQkJbW9uaXRvci5leGl0V3JpdGUoKTsgLy8gZnJlZSB3cml0ZSBsb2NrCiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKaW5kZXggOTgwYjA1Zi4uYjdjMjU2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzYsNyArMzYsNyBAQAogICogLSBDb25zdHJ1Y3RvcnMuCiAgKi8KIHB1YmxpYyBjbGFzcyBTb3VyY2VJbmRleGVyIGV4dGVuZHMgQWJzdHJhY3RJbmRleGVyIGltcGxlbWVudHMgU3VmZml4Q29uc3RhbnRzIHsKLQkKKwogCXB1YmxpYyBTb3VyY2VJbmRleGVyKFNlYXJjaERvY3VtZW50IGRvY3VtZW50KSB7CiAJCXN1cGVyKGRvY3VtZW50KTsKIAl9CkBAIC00NCwyMCArNDQsMjAgQEAKIAkJLy8gQ3JlYXRlIGEgbmV3IFBhcnNlcgogCQlTb3VyY2VJbmRleGVyUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yKHRoaXMpOwogCQlTdHJpbmcgZG9jdW1lbnRQYXRoID0gdGhpcy5kb2N1bWVudC5nZXRQYXRoKCk7Ci0JCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gKChJbnRlcm5hbFNlYXJjaERvY3VtZW50KSB0aGlzLmRvY3VtZW50KS5wYXJzZXI7CisJCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gdGhpcy5kb2N1bWVudC5nZXRQYXJzZXIoKTsKIAkJaWYgKHBhcnNlciA9PSBudWxsKSB7CiAJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZG9jdW1lbnRQYXRoKTsKIAkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsKIAkJCXBhcnNlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmluZGV4TWFuYWdlci5nZXRTb3VyY2VFbGVtZW50UGFyc2VyKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgcmVxdWVzdG9yKTsKIAkJfSBlbHNlIHsKLQkJCXBhcnNlci5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJCQlwYXJzZXIuc2V0UmVxdWVzdG9yKHJlcXVlc3Rvcik7CiAJCX0KLQkJCisKIAkJLy8gTGF1bmNoIHRoZSBwYXJzZXIKIAkJY2hhcltdIHNvdXJjZSA9IG51bGw7CiAJCWNoYXJbXSBuYW1lID0gbnVsbDsKIAkJdHJ5IHsKLQkJCXNvdXJjZSA9IGRvY3VtZW50LmdldENoYXJDb250ZW50cygpOworCQkJc291cmNlID0gdGhpcy5kb2N1bWVudC5nZXRDaGFyQ29udGVudHMoKTsKIAkJCW5hbWUgPSBkb2N1bWVudFBhdGgudG9DaGFyQXJyYXkoKTsKIAkJfSBjYXRjaChFeGNlcHRpb24gZSl7CiAJCQkvLyBpZ25vcmUKQEAgLTY1LDcgKzY1LDcgQEAKIAkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjb3VsZCBub3QgcmV0cmlldmUgZG9jdW1lbnQgaW5mbyAoZS5nLiByZXNvdXJjZSB3YXMgZGlzY2FyZGVkKQogCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIG5hbWUpOwogCQl0cnkgewotCQkJcGFyc2VyLnBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZS8qZnVsbCBwYXJzZSovKTsKKwkJCXBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXQsIHRydWUvKmZ1bGwgcGFyc2UqLywgbnVsbC8qbm8gcHJvZ3Jlc3MqLyk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CiAJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyUmVxdWVzdG9yLmphdmEKaW5kZXggNTY4ZTkwMi4uNGFkYTU3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyUmVxdWVzdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMTQgKzEyLDE4IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRXh0cmFGbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIEphdmFQYXJzZXJJbmRleGVyLiBXaGVuIHBhcnNpbmcgdGhlIGphdmEgZmlsZSwgdGhlIHJlcXVlc3RvcgotICogcmVjb2duaXNlcyB0aGUgamF2YSBlbGVtZW50cyAobWV0aG9kcywgZmllbGRzLCAuLi4pIGFuZCBhZGQgdGhlbSB0byBhbiBpbmRleC4KKyAqIHJlY29nbml6ZXMgdGhlIGphdmEgZWxlbWVudHMgKG1ldGhvZHMsIGZpZWxkcywgLi4uKSBhbmQgYWRkIHRoZW0gdG8gYW4gaW5kZXguCiAgKi8KIHB1YmxpYyBjbGFzcyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IsIElJbmRleENvbnN0YW50cyB7CiAJU291cmNlSW5kZXhlciBpbmRleGVyOwpAQCAtMjgsMTEgKzMyLDI2IEBACiAJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzID0gbmV3IGNoYXJbNV1bXTsKIAlpbnQgZGVwdGggPSAwOwogCWludCBtZXRob2REZXB0aCA9IDA7Ci0JCisKIHB1YmxpYyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yKFNvdXJjZUluZGV4ZXIgaW5kZXhlcikgewogCXRoaXMuaW5kZXhlciA9IGluZGV4ZXI7CiB9CiAvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0QW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoY2hhcltdW10sIGludCwgaW50KQorICovCitwdWJsaWMgdm9pZCBhY2NlcHRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShjaGFyW11bXSB0eXBlTmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykKKwkJYWNjZXB0VW5rbm93blJlZmVyZW5jZSh0eXBlTmFtZVtpXSwgMCk7CisJYWNjZXB0QW5ub3RhdGlvblR5cGVSZWZlcmVuY2UodHlwZU5hbWVbbGVuZ3RoIC0gMV0sIDApOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEFubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSwgaW50KQorICovCitwdWJsaWMgdm9pZCBhY2NlcHRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikgeworCXRoaXMuaW5kZXhlci5hZGRBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShzaW1wbGVUeXBlTmFtZSk7Cit9CisvKioKICAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoY2hhcltdLCBpbnQsIGludCkKICAqLwogcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoY2hhcltdIHR5cGVOYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbikgewpAQCAtNTUsOSArNzQsOSBAQAogCXRoaXMuaW5kZXhlci5hZGRGaWVsZFJlZmVyZW5jZShmaWVsZE5hbWUpOwogfQogLyoqCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEltcG9ydChpbnQsIGludCwgY2hhcltdW10sIGJvb2xlYW4sIGludCkKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0SW1wb3J0KGludCwgaW50LCBpbnQsIGludCwgY2hhcltdW10sIGJvb2xlYW4sIGludCkKICAqLwotcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXVtdIHRva2VucywgYm9vbGVhbiBvbkRlbWFuZCwgaW50IG1vZGlmaWVycykgeworcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW11bXSB0b2tlbnMsIGJvb2xlYW4gb25EZW1hbmQsIGludCBtb2RpZmllcnMpIHsKIAkvLyBpbXBvcnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHdoaWxlIGNyZWF0aW5nIHRoZSBJbXBvcnRSZWYgbm9kZSAoc2VlIFNvdXJjZUVsZW1lbnRQYXJzZXIjY29tc3VtZSpJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSBtZXRob2RzKQogfQogLyoqCkBAIC03MywxMCArOTIsMTAgQEAKIAl0aGlzLmluZGV4ZXIuYWRkTWV0aG9kUmVmZXJlbmNlKG1ldGhvZE5hbWUsIGFyZ0NvdW50KTsKIH0KIC8qKgotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNhY2NlcHRQYWNrYWdlKGludCwgaW50LCBjaGFyW10pCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdFBhY2thZ2UoSW1wb3J0UmVmZXJlbmNlKQogICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lKSB7Ci0JdGhpcy5wYWNrYWdlTmFtZSA9IG5hbWU7CitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UpIHsKKwl0aGlzLnBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZmVyZW5jZS5nZXRJbXBvcnROYW1lKCksICcuJyk7CiB9CiAvKioKICAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShDYXRlZ29yaXplZFByb2JsZW0pCkBAIC0xMTMsNiArMTMyLDI5IEBACiBwdWJsaWMgdm9pZCBhY2NlcHRVbmtub3duUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBpbnQgc291cmNlUG9zaXRpb24pIHsKIAl0aGlzLmluZGV4ZXIuYWRkTmFtZVJlZmVyZW5jZShuYW1lKTsKIH0KKworcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRDb25zdHJ1Y3RvcklmTmVjZXNzYXJ5KFR5cGVJbmZvIHR5cGVJbmZvKSB7CisJYm9vbGVhbiBoYXNDb25zdHJ1Y3RvciA9IGZhbHNlOworCQorCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0eXBlSW5mby5ub2RlOworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CisJaW50IG1ldGhvZENvdW50ZXIgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ291bnRlcjsgaSsrKSB7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpKSB7CisJCQloYXNDb25zdHJ1Y3RvciA9IHRydWU7CisJCQlicmVhayBkb25lOworCQl9CisJfQorCQorCWlmICghaGFzQ29uc3RydWN0b3IpIHsKKwkJdGhpcy5pbmRleGVyLmFkZERlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKAorCQkJCXR5cGVJbmZvLm5hbWUsCisJCQkJdGhpcy5wYWNrYWdlTmFtZSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSIDogdGhpcy5wYWNrYWdlTmFtZSwKKwkJCQl0eXBlSW5mby5tb2RpZmllcnMsCisJCQkJZ2V0TW9yZUV4dHJhRmxhZ3ModHlwZUluZm8uZXh0cmFGbGFncykpOworCX0KK30KIC8qCiAgKiBSZWJ1aWxkIHRoZSBwcm9wZXIgcXVhbGlmaWNhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc291cmNlIHR5cGU6CiAgKgpAQCAtMTIyLDcgKzE2NCw3IEBACiAgKi8KIHB1YmxpYyBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMoKXsKIAotCWlmIChkZXB0aCA9PSAwKSByZXR1cm4gbnVsbDsKKwlpZiAodGhpcy5kZXB0aCA9PSAwKSByZXR1cm4gbnVsbDsKIAogCWNoYXJbXVtdIHF1YWxpZmljYXRpb24gPSBuZXcgY2hhclt0aGlzLmRlcHRoXVtdOwogCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMsIDAsIHF1YWxpZmljYXRpb24sIDAsIHRoaXMuZGVwdGgpOwpAQCAtMTMzLDEwICsxNzUsMTEgQEAKIAlpZiAodGhpcy5tZXRob2REZXB0aCA+IDApIHsKIAkJdHlwZU5hbWVzID0gT05FX1pFUk9fQ0hBUjsKIAl9IGVsc2UgewotCQl0eXBlTmFtZXMgPSB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcygpOworCQl0eXBlTmFtZXMgPSBlbmNsb3NpbmdUeXBlTmFtZXMoKTsKIAl9Ci0JdGhpcy5pbmRleGVyLmFkZEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24odHlwZUluZm8ubW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgdHlwZUluZm8ubmFtZSwgdHlwZU5hbWVzLCB0eXBlSW5mby5zZWNvbmRhcnkpOwotCXRoaXMucHVzaFR5cGVOYW1lKHR5cGVJbmZvLm5hbWUpOwkKKwl0aGlzLmluZGV4ZXIuYWRkQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbih0eXBlSW5mby5tb2RpZmllcnMsIHRoaXMucGFja2FnZU5hbWUsIHR5cGVJbmZvLm5hbWUsIHR5cGVOYW1lcywgdHlwZUluZm8uc2Vjb25kYXJ5KTsKKwlhZGREZWZhdWx0Q29uc3RydWN0b3JJZk5lY2Vzc2FyeSh0eXBlSW5mbyk7CisJcHVzaFR5cGVOYW1lKHR5cGVJbmZvLm5hbWUpOwogfQogCiBwcml2YXRlIHZvaWQgZW50ZXJDbGFzcyhUeXBlSW5mbyB0eXBlSW5mbykgewpAQCAtMTQ0LDcgKzE4Nyw3IEBACiAJLy8gZWxpbWluYXRlIHBvc3NpYmxlIHF1YWxpZmljYXRpb25zLCBnaXZlbiB0aGV5IG5lZWQgdG8gYmUgZnVsbHkgcmVzb2x2ZWQgYWdhaW4KIAlpZiAodHlwZUluZm8uc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAJCXR5cGVJbmZvLnN1cGVyY2xhc3MgPSBnZXRTaW1wbGVOYW1lKHR5cGVJbmZvLnN1cGVyY2xhc3MpOwotCQkKKwogCQkvLyBhZGQgaW1wbGljaXQgY29uc3RydWN0b3IgcmVmZXJlbmNlIHRvIGRlZmF1bHQgY29uc3RydWN0b3IKIAkJdGhpcy5pbmRleGVyLmFkZENvbnN0cnVjdG9yUmVmZXJlbmNlKHR5cGVJbmZvLnN1cGVyY2xhc3MsIDApOwogCX0KQEAgLTE1OCw3ICsyMDEsNyBAQAogCQkvLyBzZXQgc3BlY2lmaWMgWycwJ10gdmFsdWUgZm9yIGxvY2FsIGFuZCBhbm9ueW1vdXMgdG8gYmUgYWJsZSB0byBmaWx0ZXIgdGhlbQogCQl0eXBlTmFtZXMgPSBPTkVfWkVST19DSEFSOwogCX0gZWxzZSB7Ci0JCXR5cGVOYW1lcyA9IHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzKCk7CisJCXR5cGVOYW1lcyA9IGVuY2xvc2luZ1R5cGVOYW1lcygpOwogCX0KIAljaGFyW11bXSB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcyA9IG51bGw7CiAJaWYgKHR5cGVJbmZvLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKQEAgLTE3MCw3ICsyMTMsOCBAQAogCQl9CiAJfQogCXRoaXMuaW5kZXhlci5hZGRDbGFzc0RlY2xhcmF0aW9uKHR5cGVJbmZvLm1vZGlmaWVycywgdGhpcy5wYWNrYWdlTmFtZSwgdHlwZUluZm8ubmFtZSwgdHlwZU5hbWVzLCB0eXBlSW5mby5zdXBlcmNsYXNzLCB0eXBlSW5mby5zdXBlcmludGVyZmFjZXMsIHR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzLCB0eXBlSW5mby5zZWNvbmRhcnkpOwotCXRoaXMucHVzaFR5cGVOYW1lKHR5cGVJbmZvLm5hbWUpOworCWFkZERlZmF1bHRDb25zdHJ1Y3RvcklmTmVjZXNzYXJ5KHR5cGVJbmZvKTsKKwlwdXNoVHlwZU5hbWUodHlwZUluZm8ubmFtZSk7CiB9CiAvKioKICAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJDb21waWxhdGlvblVuaXQoKQpAQCAtMTc5LDEwICsyMjMsMjEgQEAKIAkvLyBpbXBsZW1lbnRzIGludGVyZmFjZSBtZXRob2QKIH0KIC8qKgotICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckNvbnN0cnVjdG9yKE1ldGhvZEluZm8pCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVyQ29uc3RydWN0b3IoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuTWV0aG9kSW5mbykKICAqLwogcHVibGljIHZvaWQgZW50ZXJDb25zdHJ1Y3RvcihNZXRob2RJbmZvIG1ldGhvZEluZm8pIHsKLQl0aGlzLmluZGV4ZXIuYWRkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihtZXRob2RJbmZvLm5hbWUsIG1ldGhvZEluZm8ucGFyYW1ldGVyVHlwZXMsIG1ldGhvZEluZm8uZXhjZXB0aW9uVHlwZXMpOworCWludCBhcmdDb3VudCA9IG1ldGhvZEluZm8ucGFyYW1ldGVyVHlwZXMgPT0gbnVsbCA/IDAgOiBtZXRob2RJbmZvLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwl0aGlzLmluZGV4ZXIuYWRkQ29uc3RydWN0b3JEZWNsYXJhdGlvbigKKwkJCW1ldGhvZEluZm8ubmFtZSwKKwkJCWFyZ0NvdW50LAorCQkJbnVsbCwKKwkJCW1ldGhvZEluZm8ucGFyYW1ldGVyVHlwZXMsCisJCQltZXRob2RJbmZvLnBhcmFtZXRlck5hbWVzLAorCQkJbWV0aG9kSW5mby5tb2RpZmllcnMsCisJCQltZXRob2RJbmZvLmRlY2xhcmluZ1BhY2thZ2VOYW1lLAorCQkJbWV0aG9kSW5mby5kZWNsYXJpbmdUeXBlTW9kaWZpZXJzLAorCQkJbWV0aG9kSW5mby5leGNlcHRpb25UeXBlcywKKwkJCWdldE1vcmVFeHRyYUZsYWdzKG1ldGhvZEluZm8uZXh0cmFGbGFncykpOwogCXRoaXMubWV0aG9kRGVwdGgrKzsKIH0KIHByaXZhdGUgdm9pZCBlbnRlckVudW0oVHlwZUluZm8gdHlwZUluZm8pIHsKQEAgLTE5MSwxOSArMjQ2LDIwIEBACiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlSW5mby5zdXBlcmludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewogCQkJdHlwZUluZm8uc3VwZXJpbnRlcmZhY2VzW2ldID0gZ2V0U2ltcGxlTmFtZSh0eXBlSW5mby5zdXBlcmludGVyZmFjZXNbaV0pOwogCQl9Ci0JfQkKKwl9CiAJY2hhcltdW10gdHlwZU5hbWVzOwogCWlmICh0aGlzLm1ldGhvZERlcHRoID4gMCkgewogCQl0eXBlTmFtZXMgPSBPTkVfWkVST19DSEFSOwogCX0gZWxzZSB7Ci0JCXR5cGVOYW1lcyA9IHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzKCk7CisJCXR5cGVOYW1lcyA9IGVuY2xvc2luZ1R5cGVOYW1lcygpOwogCX0KIAljaGFyW10gc3VwZXJjbGFzcyA9IHR5cGVJbmZvLnN1cGVyY2xhc3MgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19FTlVNLCAnLicpOiB0eXBlSW5mby5zdXBlcmNsYXNzOwotCXRoaXMuaW5kZXhlci5hZGRFbnVtRGVjbGFyYXRpb24odHlwZUluZm8ubW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgdHlwZUluZm8ubmFtZSwgdHlwZU5hbWVzLCBzdXBlcmNsYXNzLCB0eXBlSW5mby5zdXBlcmludGVyZmFjZXMsIHR5cGVJbmZvLnNlY29uZGFyeSk7Ci0JdGhpcy5wdXNoVHlwZU5hbWUodHlwZUluZm8ubmFtZSk7CQorCXRoaXMuaW5kZXhlci5hZGRFbnVtRGVjbGFyYXRpb24odHlwZUluZm8ubW9kaWZpZXJzLCB0aGlzLnBhY2thZ2VOYW1lLCB0eXBlSW5mby5uYW1lLCB0eXBlTmFtZXMsIHN1cGVyY2xhc3MsIHR5cGVJbmZvLnN1cGVyaW50ZXJmYWNlcywgdHlwZUluZm8uc2Vjb25kYXJ5KTsKKwlhZGREZWZhdWx0Q29uc3RydWN0b3JJZk5lY2Vzc2FyeSh0eXBlSW5mbyk7CisJcHVzaFR5cGVOYW1lKHR5cGVJbmZvLm5hbWUpOwogfQogLyoqCi0gKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVyRmllbGQoRmllbGRJbmZvKQorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckZpZWxkKElTb3VyY2VFbGVtZW50UmVxdWVzdG9yLkZpZWxkSW5mbykKICAqLwogcHVibGljIHZvaWQgZW50ZXJGaWVsZChGaWVsZEluZm8gZmllbGRJbmZvKSB7CiAJdGhpcy5pbmRleGVyLmFkZEZpZWxkRGVjbGFyYXRpb24oZmllbGRJbmZvLnR5cGUsIGZpZWxkSW5mby5uYW1lKTsKQEAgLTIyMSwxMiArMjc3LDEyIEBACiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlSW5mby5zdXBlcmludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewogCQkJdHlwZUluZm8uc3VwZXJpbnRlcmZhY2VzW2ldID0gZ2V0U2ltcGxlTmFtZSh0eXBlSW5mby5zdXBlcmludGVyZmFjZXNbaV0pOwogCQl9Ci0JfQkKKwl9CiAJY2hhcltdW10gdHlwZU5hbWVzOwogCWlmICh0aGlzLm1ldGhvZERlcHRoID4gMCkgewogCQl0eXBlTmFtZXMgPSBPTkVfWkVST19DSEFSOwogCX0gZWxzZSB7Ci0JCXR5cGVOYW1lcyA9IHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzKCk7CisJCXR5cGVOYW1lcyA9IGVuY2xvc2luZ1R5cGVOYW1lcygpOwogCX0KIAljaGFyW11bXSB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcyA9IG51bGw7CiAJaWYgKHR5cGVJbmZvLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKQEAgLTIzNywxOCArMjkzLDE5IEBACiAJCQl0eXBlUGFyYW1ldGVyU2lnbmF0dXJlc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlUGFyYW1ldGVyU2lnbmF0dXJlKHR5cGVQYXJhbWV0ZXJJbmZvLm5hbWUsIHR5cGVQYXJhbWV0ZXJJbmZvLmJvdW5kcyk7CiAJCX0KIAl9Ci0JdGhpcy5pbmRleGVyLmFkZEludGVyZmFjZURlY2xhcmF0aW9uKHR5cGVJbmZvLm1vZGlmaWVycywgcGFja2FnZU5hbWUsIHR5cGVJbmZvLm5hbWUsIHR5cGVOYW1lcywgdHlwZUluZm8uc3VwZXJpbnRlcmZhY2VzLCB0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcywgdHlwZUluZm8uc2Vjb25kYXJ5KTsKLQl0aGlzLnB1c2hUeXBlTmFtZSh0eXBlSW5mby5uYW1lKTsJCisJdGhpcy5pbmRleGVyLmFkZEludGVyZmFjZURlY2xhcmF0aW9uKHR5cGVJbmZvLm1vZGlmaWVycywgdGhpcy5wYWNrYWdlTmFtZSwgdHlwZUluZm8ubmFtZSwgdHlwZU5hbWVzLCB0eXBlSW5mby5zdXBlcmludGVyZmFjZXMsIHR5cGVQYXJhbWV0ZXJTaWduYXR1cmVzLCB0eXBlSW5mby5zZWNvbmRhcnkpOworCWFkZERlZmF1bHRDb25zdHJ1Y3RvcklmTmVjZXNzYXJ5KHR5cGVJbmZvKTsKKwlwdXNoVHlwZU5hbWUodHlwZUluZm8ubmFtZSk7CiB9CiAvKioKLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJNZXRob2QoTWV0aG9kSW5mbykKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJNZXRob2QoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuTWV0aG9kSW5mbykKICAqLwogcHVibGljIHZvaWQgZW50ZXJNZXRob2QoTWV0aG9kSW5mbyBtZXRob2RJbmZvKSB7CiAJdGhpcy5pbmRleGVyLmFkZE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZEluZm8ubmFtZSwgbWV0aG9kSW5mby5wYXJhbWV0ZXJUeXBlcywgbWV0aG9kSW5mby5yZXR1cm5UeXBlLCBtZXRob2RJbmZvLmV4Y2VwdGlvblR5cGVzKTsKIAl0aGlzLm1ldGhvZERlcHRoKys7CiB9CiAvKioKLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJUeXBlKFR5cGVJbmZvKQorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlclR5cGUoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuVHlwZUluZm8pCiAgKi8KIHB1YmxpYyB2b2lkIGVudGVyVHlwZShUeXBlSW5mbyB0eXBlSW5mbykgewogCS8vIFRPRE8gKGplcm9tZSkgbWlnaHQgd2FudCB0byBtZXJnZSB0aGUgNCBtZXRob2RzCkBAIC0yNTYsMTMgKzMxMywxMyBAQAogCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5DTEFTU19ERUNMOgogCQkJZW50ZXJDbGFzcyh0eXBlSW5mbyk7CiAJCQlicmVhazsKLQkJY2FzZSBUeXBlRGVjbGFyYXRpb24uQU5OT1RBVElPTl9UWVBFX0RFQ0w6IAorCQljYXNlIFR5cGVEZWNsYXJhdGlvbi5BTk5PVEFUSU9OX1RZUEVfREVDTDoKIAkJCWVudGVyQW5ub3RhdGlvblR5cGUodHlwZUluZm8pOwogCQkJYnJlYWs7CiAJCWNhc2UgVHlwZURlY2xhcmF0aW9uLklOVEVSRkFDRV9ERUNMOgogCQkJZW50ZXJJbnRlcmZhY2UodHlwZUluZm8pOwogCQkJYnJlYWs7Ci0JCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTDogCisJCWNhc2UgVHlwZURlY2xhcmF0aW9uLkVOVU1fREVDTDoKIAkJCWVudGVyRW51bSh0eXBlSW5mbyk7CiAJCQlicmVhazsKIAl9CkBAIC0yOTMsOSArMzUwLDkgQEAKIAl0aGlzLm1ldGhvZERlcHRoLS07CiB9CiAvKioKLSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdE1ldGhvZChpbnQsIGludCwgaW50KQorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0TWV0aG9kKGludCwgRXhwcmVzc2lvbikKICAqLwotcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIGludCBkZWZhdWx0VmFsdWVTdGFydCwgaW50IGRlZmF1bHRWYWx1ZUVuZCkgeworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CiAJdGhpcy5tZXRob2REZXB0aC0tOwogfQogLyoqCkBAIC0zMzYsMjEgKzM5MywyNyBAQAogCX0KIAlyZXR1cm4gIENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZU5hbWUsIGxhc3REb3QgKyAxLCBsYXN0R2VuZXJpY1N0YXJ0KTsKIH0KK3ByaXZhdGUgaW50IGdldE1vcmVFeHRyYUZsYWdzKGludCBleHRyYUZsYWdzKSB7CisJaWYgKHRoaXMubWV0aG9kRGVwdGggPiAwKSB7CisJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5Jc0xvY2FsVHlwZTsKKwl9CisJcmV0dXJuIGV4dHJhRmxhZ3M7Cit9CiBwdWJsaWMgdm9pZCBwb3BUeXBlTmFtZSgpIHsKLQlpZiAoZGVwdGggPiAwKSB7Ci0JCWVuY2xvc2luZ1R5cGVOYW1lc1stLWRlcHRoXSA9IG51bGw7CisJaWYgKHRoaXMuZGVwdGggPiAwKSB7CisJCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzWy0tdGhpcy5kZXB0aF0gPSBudWxsOwogCX0gZWxzZSBpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CiAJCS8vIGR1bXAgYSB0cmFjZSBzbyBpdCBjYW4gYmUgdHJhY2tlZCBkb3duCiAJCXRyeSB7Ci0JCQllbmNsb3NpbmdUeXBlTmFtZXNbLTFdID0gbnVsbDsKKwkJCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzWy0xXSA9IG51bGw7CiAJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQl9CiAJfQogfQogcHVibGljIHZvaWQgcHVzaFR5cGVOYW1lKGNoYXJbXSB0eXBlTmFtZSkgewotCWlmIChkZXB0aCA9PSBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoKQotCQlTeXN0ZW0uYXJyYXljb3B5KGVuY2xvc2luZ1R5cGVOYW1lcywgMCwgZW5jbG9zaW5nVHlwZU5hbWVzID0gbmV3IGNoYXJbZGVwdGgqMl1bXSwgMCwgZGVwdGgpOwotCWVuY2xvc2luZ1R5cGVOYW1lc1tkZXB0aCsrXSA9IHR5cGVOYW1lOworCWlmICh0aGlzLmRlcHRoID09IHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcywgMCwgdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgPSBuZXcgY2hhclt0aGlzLmRlcHRoKjJdW10sIDAsIHRoaXMuZGVwdGgpOworCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzW3RoaXMuZGVwdGgrK10gPSB0eXBlTmFtZTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kTG9jYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9BbmRMb2NhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNmM3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kTG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKKworcHVibGljIGNsYXNzIEFuZExvY2F0b3IgZXh0ZW5kcyBQYXR0ZXJuTG9jYXRvciB7CisKK2ZpbmFsIFBhdHRlcm5Mb2NhdG9yW10gcGF0dGVybkxvY2F0b3JzOworZmluYWwgaW50W10gbGV2ZWxzOworCitwdWJsaWMgQW5kTG9jYXRvcihBbmRQYXR0ZXJuIHBhdHRlcm4pIHsKKwlzdXBlcihwYXR0ZXJuKTsKKworCVNlYXJjaFBhdHRlcm5bXSBwYXR0ZXJucyA9IHBhdHRlcm4ucGF0dGVybnM7CisJUGF0dGVybkxvY2F0b3JbXSBsb2NhdG9ycyA9IG5ldyBQYXR0ZXJuTG9jYXRvcltwYXR0ZXJucy5sZW5ndGhdOworCXRoaXMubGV2ZWxzID0gbmV3IGludFtwYXR0ZXJucy5sZW5ndGhdOworCWZvciAoaW50IGk9MCwgbD1wYXR0ZXJucy5sZW5ndGg7IGk8bDsgaSsrKSB7CisJCWxvY2F0b3JzW2ldID0gUGF0dGVybkxvY2F0b3IucGF0dGVybkxvY2F0b3IocGF0dGVybnNbaV0pOworCQl0aGlzLmxldmVsc1tpXSA9IElNUE9TU0lCTEVfTUFUQ0g7CisJfQorCXRoaXMucGF0dGVybkxvY2F0b3JzID0gbG9jYXRvcnM7Cit9CitwdWJsaWMgdm9pZCBpbml0aWFsaXplUG9seW1vcnBoaWNTZWFyY2goTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKGxvY2F0b3IpOworCX0KK30KK3B1YmxpYyBpbnQgbWF0Y2goQW5ub3RhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goQVNUTm9kZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goRXhwcmVzc2lvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goRmllbGREZWNsYXJhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goTG9jYWxEZWNsYXJhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goTWV0aG9kRGVjbGFyYXRpb24gbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKKwlpbnQgbGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLnBhdHRlcm5Mb2NhdG9yc1tpXS5tYXRjaChub2RlLCBub2RlU2V0KTsKKwkJaWYgKG5ld0xldmVsID4gbGV2ZWwpIHsKKwkJCWlmIChuZXdMZXZlbCA9PSBBQ0NVUkFURV9NQVRDSCkgcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJbGV2ZWwgPSBuZXdMZXZlbDsKKwkJfQorCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CitwdWJsaWMgaW50IG1hdGNoKE1lbWJlclZhbHVlUGFpciBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goTWVzc2FnZVNlbmQgbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKKwlpbnQgbGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLnBhdHRlcm5Mb2NhdG9yc1tpXS5tYXRjaChub2RlLCBub2RlU2V0KTsKKwkJaWYgKG5ld0xldmVsID4gbGV2ZWwpIHsKKwkJCWlmIChuZXdMZXZlbCA9PSBBQ0NVUkFURV9NQVRDSCkgcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJbGV2ZWwgPSBuZXdMZXZlbDsKKwkJfQorCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CitwdWJsaWMgaW50IG1hdGNoKFJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoKG5vZGUsIG5vZGVTZXQpOworCQlpZiAobmV3TGV2ZWwgPiBsZXZlbCkgeworCQkJaWYgKG5ld0xldmVsID09IEFDQ1VSQVRFX01BVENIKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgbWF0Y2goVHlwZURlY2xhcmF0aW9uIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ubWF0Y2gobm9kZSwgbm9kZVNldCk7CisJCWlmIChuZXdMZXZlbCA+IGxldmVsKSB7CisJCQlpZiAobmV3TGV2ZWwgPT0gQUNDVVJBVEVfTUFUQ0gpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQorcHVibGljIGludCBtYXRjaChUeXBlUGFyYW1ldGVyIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ubWF0Y2gobm9kZSwgbm9kZVNldCk7CisJCWlmIChuZXdMZXZlbCA+IGxldmVsKSB7CisJCQlpZiAobmV3TGV2ZWwgPT0gQUNDVVJBVEVfTUFUQ0gpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQorcHVibGljIGludCBtYXRjaChUeXBlUmVmZXJlbmNlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ubWF0Y2gobm9kZSwgbm9kZVNldCk7CisJCWlmIChuZXdMZXZlbCA+IGxldmVsKSB7CisJCQlpZiAobmV3TGV2ZWwgPT0gQUNDVVJBVEVfTUFUQ0gpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQorcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKKwlpbnQgcmVzdWx0ID0gQUxMX0NPTlRBSU5FUjsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0ICY9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoQ29udGFpbmVyKCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydEltcG9ydFJlZihJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBCaW5kaW5nIGJpbmRpbmcsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJUGF0dGVybkxvY2F0b3Igd2Vha2VzdFBhdHRlcm4gPSBudWxsOworCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLm1hdGNoTGV2ZWwoaW1wb3J0UmVmKTsKKwkJaWYgKG5ld0xldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybjsKKwkJaWYgKHdlYWtlc3RQYXR0ZXJuID09IG51bGwgfHwgbmV3TGV2ZWwgPCBsZXZlbCkgeworCQkJd2Vha2VzdFBhdHRlcm4gPSB0aGlzLnBhdHRlcm5Mb2NhdG9yc1tpXTsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJd2Vha2VzdFBhdHRlcm4ubWF0Y2hSZXBvcnRJbXBvcnRSZWYoaW1wb3J0UmVmLCBiaW5kaW5nLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7Cit9Citwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQsIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlQYXR0ZXJuTG9jYXRvciB3ZWFrZXN0UGF0dGVybiA9IG51bGw7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLnJlZmVyZW5jZVR5cGUoKSA9PSAwKSByZXR1cm47IC8vIGltcG9zc2libGUgbWF0Y2gKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ucmVzb2x2ZUxldmVsKHJlZmVyZW5jZSk7CisJCWlmIChuZXdMZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSByZXR1cm47CisJCWlmICh3ZWFrZXN0UGF0dGVybiA9PSBudWxsIHx8IG5ld0xldmVsIDwgbGV2ZWwpIHsKKwkJCXdlYWtlc3RQYXR0ZXJuID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV07CisJCQlsZXZlbCA9IG5ld0xldmVsOworCQl9CisJfQorCXdlYWtlc3RQYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgbG9jYWxFbGVtZW50LCBvdGhlckVsZW1lbnRzLCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGxvY2F0b3IpOworfQorcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJbWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBudWxsLCBudWxsLCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGxvY2F0b3IpOworfQorcHVibGljIGludCByZXNvbHZlTGV2ZWwoQVNUTm9kZSBub2RlKSB7CisJaW50IGxldmVsID0gQUNDVVJBVEVfTUFUQ0g7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMucGF0dGVybkxvY2F0b3JzW2ldLnJlc29sdmVMZXZlbChub2RlKTsKKwkJaWYgKG5ld0xldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQl0aGlzLmxldmVsc1tpXSA9IG5ld0xldmVsOworCQlpZiAobmV3TGV2ZWwgPCBsZXZlbCkgeworCQkJbGV2ZWwgPSBuZXdMZXZlbDsgLy8gd2FudCB0byBhbnN3ZXIgdGhlIHdlYWtlciBtYXRjaAorCQl9CisJfQorCXJldHVybiBsZXZlbDsKK30KK3B1YmxpYyBpbnQgcmVzb2x2ZUxldmVsKEJpbmRpbmcgYmluZGluZykgeworCWludCBsZXZlbCA9IEFDQ1VSQVRFX01BVENIOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLnBhdHRlcm5Mb2NhdG9yc1tpXS5yZXNvbHZlTGV2ZWwoYmluZGluZyk7CisJCWlmIChuZXdMZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJdGhpcy5sZXZlbHNbaV0gPSBuZXdMZXZlbDsKKwkJaWYgKG5ld0xldmVsIDwgbGV2ZWwpIHsKKwkJCWxldmVsID0gbmV3TGV2ZWw7IC8vIHdhbnQgdG8gYW5zd2VyIHRoZSB3ZWFrZXIgbWF0Y2gKKwkJfQorCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTG9jYXRvciNzZXRGbGF2b3JzKGludCkKKyAqLwordm9pZCBzZXRGbGF2b3JzKGludCBmbGF2b3JzKSB7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3JzW2ldLnNldEZsYXZvcnMoZmxhdm9ycyk7CisJfQorfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kUGF0dGVybi5qYXZhCmluZGV4IDk0NGRhNTcuLjM1ZDAxNDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDc0ICsxMCw2OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU2ltcGxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkluZGV4UXVlcnlSZXF1ZXN0b3I7CitwdWJsaWMgY2xhc3MgQW5kUGF0dGVybiBleHRlbmRzIEludGVyc2VjdGluZ1BhdHRlcm4geworcHJvdGVjdGVkIFNlYXJjaFBhdHRlcm5bXSBwYXR0ZXJuczsKK2ludCBjdXJyZW50OwogCi0vKioKLSAqIFF1ZXJ5IHRoZSBpbmRleCBtdWx0aXBsZSB0aW1lcyBhbmQgZG8gYW4gJ2FuZCcgb24gdGhlIHJlc3VsdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmRQYXR0ZXJuIGV4dGVuZHMgSmF2YVNlYXJjaFBhdHRlcm4geyAvLyBUT0RPIHNob3VsZCByZW5hbWUgSW50ZXJzZWN0aW5nUGF0dGVybiwgYW5kIG1ha2UgQW5kUGF0dGVybiBhIHRydWUgc3ViY2xhc3MKLQkKLXB1YmxpYyBBbmRQYXR0ZXJuKGludCBwYXR0ZXJuS2luZCwgaW50IG1hdGNoUnVsZSkgewotCXN1cGVyKHBhdHRlcm5LaW5kLCBtYXRjaFJ1bGUpOwotfQotcHVibGljIHZvaWQgZmluZEluZGV4TWF0Y2hlcyhJbmRleCBpbmRleCwgSW5kZXhRdWVyeVJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQl0aGlzLnJlc2V0UXVlcnkoKTsKLQlTaW1wbGVTZXQgaW50ZXJzZWN0ZWROYW1lcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaW5kZXguc3RhcnRRdWVyeSgpOwotCQlkbyB7Ci0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSAoKEludGVybmFsU2VhcmNoUGF0dGVybikgdGhpcykuY3VycmVudFBhdHRlcm4oKTsKLQkJCUVudHJ5UmVzdWx0W10gZW50cmllcyA9ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLnF1ZXJ5SW4oaW5kZXgpOwotCQkJaWYgKGVudHJpZXMgPT0gbnVsbCkgcmV0dXJuOwotCi0JCQlTZWFyY2hQYXR0ZXJuIGRlY29kZWRSZXN1bHQgPSBwYXR0ZXJuLmdldEJsYW5rUGF0dGVybigpOwotCQkJU2ltcGxlU2V0IG5ld0ludGVyc2VjdGVkTmFtZXMgPSBuZXcgU2ltcGxlU2V0KDMpOwotCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQotCQkJCUVudHJ5UmVzdWx0IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQlkZWNvZGVkUmVzdWx0LmRlY29kZUluZGV4S2V5KGVudHJ5LmdldFdvcmQoKSk7Ci0JCQkJaWYgKHBhdHRlcm4ubWF0Y2hlc0RlY29kZWRLZXkoZGVjb2RlZFJlc3VsdCkpIHsKLQkJCQkJU3RyaW5nW10gbmFtZXMgPSBlbnRyeS5nZXREb2N1bWVudE5hbWVzKGluZGV4KTsKLQkJCQkJaWYgKGludGVyc2VjdGVkTmFtZXMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGogPCBuOyBqKyspCi0JCQkJCQkJaWYgKGludGVyc2VjdGVkTmFtZXMuaW5jbHVkZXMobmFtZXNbal0pKQotCQkJCQkJCQluZXdJbnRlcnNlY3RlZE5hbWVzLmFkZChuYW1lc1tqXSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMCwgbiA9IG5hbWVzLmxlbmd0aDsgaiA8IG47IGorKykKLQkJCQkJCQluZXdJbnRlcnNlY3RlZE5hbWVzLmFkZChuYW1lc1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdJbnRlcnNlY3RlZE5hbWVzLmVsZW1lbnRTaXplID09IDApIHJldHVybjsKLQkJCWludGVyc2VjdGVkTmFtZXMgPSBuZXdJbnRlcnNlY3RlZE5hbWVzOwotCQl9IHdoaWxlICh0aGlzLmhhc05leHRRdWVyeSgpKTsKLQl9IGZpbmFsbHkgewotCQlpbmRleC5zdG9wUXVlcnkoKTsKK3ByaXZhdGUgc3RhdGljIGludCBjb21iaW5lZE1hdGNoUnVsZShpbnQgbWF0Y2hSdWxlLCBpbnQgbWF0Y2hSdWxlMikgeworCWludCBjb21iaW5lZCA9IG1hdGNoUnVsZSAmIG1hdGNoUnVsZTI7CisJaW50IGNvbXBhdGliaWxpdHkgPSBjb21iaW5lZCAmIE1BVENIX0NPTVBBVElCSUxJVFlfTUFTSzsKKwlpZiAoY29tcGF0aWJpbGl0eSA9PSAwKSB7CisJCWlmICgobWF0Y2hSdWxlICYgTUFUQ0hfQ09NUEFUSUJJTElUWV9NQVNLKSA9PSBSX0ZVTExfTUFUQ0gpIHsKKwkJCWNvbXBhdGliaWxpdHkgPSBtYXRjaFJ1bGUyOworCQl9IGVsc2UgaWYgKChtYXRjaFJ1bGUyICYgTUFUQ0hfQ09NUEFUSUJJTElUWV9NQVNLKSA9PSBSX0ZVTExfTUFUQ0gpIHsKKwkJCWNvbXBhdGliaWxpdHkgPSBtYXRjaFJ1bGU7CisJCX0gZWxzZSB7CisJCQljb21wYXRpYmlsaXR5ID0gTWF0aC5taW4obWF0Y2hSdWxlICYgTUFUQ0hfQ09NUEFUSUJJTElUWV9NQVNLLCBtYXRjaFJ1bGUyICYgTUFUQ0hfQ09NUEFUSUJJTElUWV9NQVNLKTsKKwkJfQogCX0KLQotCVN0cmluZyBjb250YWluZXJQYXRoID0gaW5kZXguY29udGFpbmVyUGF0aDsKLQlPYmplY3RbXSBuYW1lcyA9IGludGVyc2VjdGVkTmFtZXMudmFsdWVzOwotCWZvciAoaW50IGkgPSAwLCBsID0gbmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlpZiAobmFtZXNbaV0gIT0gbnVsbCkKLQkJCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKSB0aGlzKS5hY2NlcHRNYXRjaCgoU3RyaW5nKSBuYW1lc1tpXSwgY29udGFpbmVyUGF0aCwgbnVsbC8qbm8gcGF0dGVybiovLCByZXF1ZXN0b3IsIHBhcnRpY2lwYW50LCBzY29wZSk7IC8vIEFuZFBhdHRlcm5zIGNhbm5vdCBwcm92aWRlIHRoZSBkZWNvZGVkIHJlc3VsdAorCXJldHVybiAoY29tYmluZWQgJiAoUl9FWEFDVF9NQVRDSCB8IFJfUFJFRklYX01BVENIIHwgUl9QQVRURVJOX01BVENIIHwgUl9SRUdFWFBfTUFUQ0gpKQorCQl8IChjb21iaW5lZCAmIFJfQ0FTRV9TRU5TSVRJVkUpCisJCXwgY29tcGF0aWJpbGl0eQorCQl8IChjb21iaW5lZCAmIChSX0NBTUVMQ0FTRV9NQVRDSCB8IFJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSCkpOwogfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgYW5vdGhlciBxdWVyeSBtdXN0IGJlIGRvbmUuCisKK3B1YmxpYyBBbmRQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gbGVmdFBhdHRlcm4sIFNlYXJjaFBhdHRlcm4gcmlnaHRQYXR0ZXJuKSB7CisJc3VwZXIoQU5EX1BBVFRFUk4sIGNvbWJpbmVkTWF0Y2hSdWxlKGxlZnRQYXR0ZXJuLmdldE1hdGNoUnVsZSgpLCByaWdodFBhdHRlcm4uZ2V0TWF0Y2hSdWxlKCkpKTsKKwl0aGlzLm11c3RSZXNvbHZlID0gbGVmdFBhdHRlcm4ubXVzdFJlc29sdmUgfHwgcmlnaHRQYXR0ZXJuLm11c3RSZXNvbHZlOworCisJU2VhcmNoUGF0dGVybltdIGxlZnRQYXR0ZXJucyA9IGxlZnRQYXR0ZXJuIGluc3RhbmNlb2YgQW5kUGF0dGVybiA/ICgoQW5kUGF0dGVybikgbGVmdFBhdHRlcm4pLnBhdHRlcm5zIDogbnVsbDsKKwlTZWFyY2hQYXR0ZXJuW10gcmlnaHRQYXR0ZXJucyA9IHJpZ2h0UGF0dGVybiBpbnN0YW5jZW9mIEFuZFBhdHRlcm4gPyAoKEFuZFBhdHRlcm4pIHJpZ2h0UGF0dGVybikucGF0dGVybnMgOiBudWxsOworCWludCBsZWZ0U2l6ZSA9IGxlZnRQYXR0ZXJucyA9PSBudWxsID8gMSA6IGxlZnRQYXR0ZXJucy5sZW5ndGg7CisJaW50IHJpZ2h0U2l6ZSA9IHJpZ2h0UGF0dGVybnMgPT0gbnVsbCA/IDEgOiByaWdodFBhdHRlcm5zLmxlbmd0aDsKKwl0aGlzLnBhdHRlcm5zID0gbmV3IFNlYXJjaFBhdHRlcm5bbGVmdFNpemUgKyByaWdodFNpemVdOworCisJaWYgKGxlZnRQYXR0ZXJucyA9PSBudWxsKQorCQl0aGlzLnBhdHRlcm5zWzBdID0gbGVmdFBhdHRlcm47CisJZWxzZQorCQlTeXN0ZW0uYXJyYXljb3B5KGxlZnRQYXR0ZXJucywgMCwgdGhpcy5wYXR0ZXJucywgMCwgbGVmdFNpemUpOworCWlmIChyaWdodFBhdHRlcm5zID09IG51bGwpCisJCXRoaXMucGF0dGVybnNbbGVmdFNpemVdID0gcmlnaHRQYXR0ZXJuOworCWVsc2UKKwkJU3lzdGVtLmFycmF5Y29weShyaWdodFBhdHRlcm5zLCAwLCB0aGlzLnBhdHRlcm5zLCBsZWZ0U2l6ZSwgcmlnaHRTaXplKTsKKworCS8vIFN0b3JlIGVyYXN1cmUgbWF0Y2gKKwl0aGlzLm1hdGNoQ29tcGF0aWJpbGl0eSA9IGdldE1hdGNoUnVsZSgpICYgTUFUQ0hfQ09NUEFUSUJJTElUWV9NQVNLOworCisJdGhpcy5jdXJyZW50ID0gMDsKK30KKworLyogKG5vbi1KYXZhZG9jKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuSW50ZXJuYWxTZWFyY2hQYXR0ZXJuI2N1cnJlbnRQYXR0ZXJuKCkKICAqLwotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dFF1ZXJ5KCk7Ci0vKioKLSAqIFJlc2V0cyB0aGUgcXVlcnkgYW5kIHByZXBhcmVzIHRoaXMgcGF0dGVybiB0byBiZSBxdWVyaWVkLgotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZXNldFF1ZXJ5KCk7CitwdWJsaWMgU2VhcmNoUGF0dGVybiBjdXJyZW50UGF0dGVybigpIHsKKwlyZXR1cm4gdGhpcy5wYXR0ZXJuc1t0aGlzLmN1cnJlbnQrK107Cit9CisKK3Byb3RlY3RlZCBib29sZWFuIGhhc05leHRRdWVyeSgpIHsKKwlyZXR1cm4gdGhpcy5jdXJyZW50IDwgKHRoaXMucGF0dGVybnMubGVuZ3RoLTEpOworfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldFF1ZXJ5KCkgeworCXRoaXMuY3VycmVudCA9IDA7Cit9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ2xhc3NGaWxlTWF0Y2hMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NsYXNzRmlsZU1hdGNoTG9jYXRvci5qYXZhCmluZGV4IGM3YmE2N2UuLmI2MTYwNGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ2xhc3NGaWxlTWF0Y2hMb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9DbGFzc0ZpbGVNYXRjaExvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxOCArMTUsNjQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5GaWVsZEluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10Lk1ldGhvZEluZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLklJbmRleENvbnN0YW50czsKIAogcHVibGljIGNsYXNzIENsYXNzRmlsZU1hdGNoTG9jYXRvciBpbXBsZW1lbnRzIElJbmRleENvbnN0YW50cyB7CiAKK3ByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEFSR0VUX0FOTk9UQVRJT05fQklUUyA9CisJVGFnQml0cy5Bbm5vdGF0aW9uRm9yVHlwZSB8CisJVGFnQml0cy5Bbm5vdGF0aW9uRm9yUGFyYW1ldGVyIHwKKwlUYWdCaXRzLkFubm90YXRpb25Gb3JQYWNrYWdlIHwKKwlUYWdCaXRzLkFubm90YXRpb25Gb3JNZXRob2QgfAorCVRhZ0JpdHMuQW5ub3RhdGlvbkZvckxvY2FsVmFyaWFibGUgfAorCVRhZ0JpdHMuQW5ub3RhdGlvbkZvckZpZWxkIHwKKwlUYWdCaXRzLkFubm90YXRpb25Gb3JDb25zdHJ1Y3RvciB8CisJVGFnQml0cy5Bbm5vdGF0aW9uRm9yQW5ub3RhdGlvblR5cGU7Citwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX0FOTk9UQVRJT05fRUxFTUVOVFRZUEUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9FTEVNRU5UVFlQRSwgJy4nKTsKIHB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDbGFzc0ZpbGVGb3JtYXQoY2hhcltdIG5hbWUpIHsKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KG5hbWUsICcvJywgJy4nKTsKIH0KIAorcHJpdmF0ZSAgYm9vbGVhbiBjaGVja0Fubm90YXRpb24oSUJpbmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiwgVHlwZVJlZmVyZW5jZVBhdHRlcm4gcGF0dGVybikgeworCWlmIChjaGVja1R5cGVOYW1lKHBhdHRlcm4uc2ltcGxlTmFtZSwgcGF0dGVybi5xdWFsaWZpY2F0aW9uLCBjb252ZXJ0Q2xhc3NGaWxlRm9ybWF0KFNpZ25hdHVyZS50b0NoYXJBcnJheShhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkpKSwgcGF0dGVybi5pc0Nhc2VTZW5zaXRpdmUsIHBhdHRlcm4uaXNDYW1lbENhc2UpKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlJQmluYXJ5RWxlbWVudFZhbHVlUGFpcltdIHZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnRWYWx1ZVBhaXJzKCk7CisJaWYgKHZhbHVlUGFpcnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBqPTAsIHZwTGVuZ3RoPXZhbHVlUGFpcnMubGVuZ3RoOyBqPHZwTGVuZ3RoOyBqKyspIHsKKwkJCUlCaW5hcnlFbGVtZW50VmFsdWVQYWlyIHZhbHVlUGFpciA9IHZhbHVlUGFpcnNbal07CisJCQlPYmplY3QgcGFpclZhbHVlID0gdmFsdWVQYWlyLmdldFZhbHVlKCk7CisJCQlpZiAocGFpclZhbHVlIGluc3RhbmNlb2YgSUJpbmFyeUFubm90YXRpb24pIHsKKwkJCQlpZiAoY2hlY2tBbm5vdGF0aW9uKChJQmluYXJ5QW5ub3RhdGlvbikgcGFpclZhbHVlLCBwYXR0ZXJuKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJpdmF0ZSBib29sZWFuIGNoZWNrQW5ub3RhdGlvbnMoVHlwZVJlZmVyZW5jZVBhdHRlcm4gcGF0dGVybiwgSUJpbmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgbG9uZyB0YWdCaXRzKSB7CisJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJZm9yIChpbnQgYT0wLCBsZW5ndGg9YW5ub3RhdGlvbnMubGVuZ3RoOyBhPGxlbmd0aDsgYSsrKSB7CisJCQlJQmluYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbYV07CisJCQlpZiAoY2hlY2tBbm5vdGF0aW9uKGFubm90YXRpb24sIHBhdHRlcm4pKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisJaWYgKCh0YWdCaXRzICYgVGFnQml0cy5BbGxTdGFuZGFyZEFubm90YXRpb25zTWFzaykgIT0gMCAmJiBjaGVja1N0YW5kYXJkQW5ub3RhdGlvbnModGFnQml0cywgcGF0dGVybikpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK3ByaXZhdGUgYm9vbGVhbiBjaGVja0Fubm90YXRpb25UeXBlUmVmZXJlbmNlKGNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUsIFR5cGVSZWZlcmVuY2VQYXR0ZXJuIHBhdHRlcm4pIHsKKwlyZXR1cm4gY2hlY2tUeXBlTmFtZShwYXR0ZXJuLnNpbXBsZU5hbWUsIHBhdHRlcm4ucXVhbGlmaWNhdGlvbiwgZnVsbHlRdWFsaWZpZWROYW1lLCBwYXR0ZXJuLmlzQ2FzZVNlbnNpdGl2ZSwgcGF0dGVybi5pc0NhbWVsQ2FzZSk7Cit9CiBwcml2YXRlIGJvb2xlYW4gY2hlY2tEZWNsYXJpbmdUeXBlKElCaW5hcnlUeXBlIGVuY2xvc2luZ0JpbmFyeVR5cGUsIGNoYXJbXSBzaW1wbGVOYW1lLCBjaGFyW10gcXVhbGlmaWNhdGlvbiwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNDYW1lbENhc2UpIHsKIAlpZiAoc2ltcGxlTmFtZSA9PSBudWxsICYmIHF1YWxpZmljYXRpb24gPT0gbnVsbCkgcmV0dXJuIHRydWU7CiAJaWYgKGVuY2xvc2luZ0JpbmFyeVR5cGUgPT0gbnVsbCkgcmV0dXJuIHRydWU7CkBAIC00Myw2ICs4OSw2NSBAQAogCQkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQorcHJpdmF0ZSBib29sZWFuIGNoZWNrU3RhbmRhcmRBbm5vdGF0aW9ucyhsb25nIGFubm90YXRpb25UYWdCaXRzLCBUeXBlUmVmZXJlbmNlUGF0dGVybiBwYXR0ZXJuKSB7CisJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvblRhcmdldE1BU0spICE9IDApIHsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9UQVJHRVQ7CisJCWlmIChjaGVja0Fubm90YXRpb25UeXBlUmVmZXJlbmNlKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHBhdHRlcm4pIHx8CisJCQkoKGFubm90YXRpb25UYWdCaXRzICYgVEFSR0VUX0FOTk9UQVRJT05fQklUUykgIT0gMCAmJiBjaGVja0Fubm90YXRpb25UeXBlUmVmZXJlbmNlKEpBVkFfTEFOR19BTk5PVEFUSU9OX0VMRU1FTlRUWVBFLCBwYXR0ZXJuKSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWlmICgoYW5ub3RhdGlvblRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25SZXRlbnRpb25NQVNLKSAhPSAwKSB7CisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX0FOTk9UQVRJT05fUkVURU5USU9OOworCQlpZiAoY2hlY2tBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpLCBwYXR0ZXJuKSB8fAorCQkJY2hlY2tBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9SRVRFTlRJT05QT0xJQ1ksICcuJyksIHBhdHRlcm4pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uRGVwcmVjYXRlZCkgIT0gMCkgeworCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19ERVBSRUNBVEVEOworCQlpZiAoY2hlY2tBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpLCBwYXR0ZXJuKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkRvY3VtZW50ZWQpICE9IDApIHsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfQU5OT1RBVElPTl9ET0NVTUVOVEVEOworCQlpZiAoY2hlY2tBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpLCBwYXR0ZXJuKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJaWYgKChhbm5vdGF0aW9uVGFnQml0cyAmIFRhZ0JpdHMuQW5ub3RhdGlvbkluaGVyaXRlZCkgIT0gMCkgeworCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19BTk5PVEFUSU9OX0lOSEVSSVRFRDsKKwkJaWYgKGNoZWNrQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKSwgcGF0dGVybikpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWlmICgoYW5ub3RhdGlvblRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25PdmVycmlkZSkgIT0gMCkgeworCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PVkVSUklERTsKKwkJaWYgKGNoZWNrQW5ub3RhdGlvblR5cGVSZWZlcmVuY2UoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKSwgcGF0dGVybikpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWlmICgoYW5ub3RhdGlvblRhZ0JpdHMgJiBUYWdCaXRzLkFubm90YXRpb25TdXBwcmVzc1dhcm5pbmdzKSAhPSAwKSB7CisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1NVUFBSRVNTV0FSTklOR1M7CisJCWlmIChjaGVja0Fubm90YXRpb25UeXBlUmVmZXJlbmNlKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHBhdHRlcm4pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uU2FmZVZhcmFyZ3MpICE9IDApIHsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfU0FGRVZBUkFSR1M7CisJCWlmIChjaGVja0Fubm90YXRpb25UeXBlUmVmZXJlbmNlKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHBhdHRlcm4pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoKGFubm90YXRpb25UYWdCaXRzICYgVGFnQml0cy5Bbm5vdGF0aW9uUG9seW1vcnBoaWNTaWduYXR1cmUpICE9IDApIHsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfSU5WT0tFX01FVEhPREhBTkRMRV8kX1BPTFlNT1JQSElDU0lHTkFUVVJFOworCQlpZiAoY2hlY2tBbm5vdGF0aW9uVHlwZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpLCBwYXR0ZXJuKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQogcHJpdmF0ZSBib29sZWFuIGNoZWNrVHlwZU5hbWUoY2hhcltdIHNpbXBsZU5hbWUsIGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNDYW1lbENhc2UpIHsKIAkvLyBOT1RFOiBpZiBjYXNlIGluc2Vuc2l0aXZlIHRoZW4gc2ltcGxlTmFtZSAmIHF1YWxpZmljYXRpb24gYXJlIGFzc3VtZWQgdG8gYmUgbG93ZXJjYXNlCiAJY2hhcltdIHdpbGRjYXJkUGF0dGVybiA9IFBhdHRlcm5Mb2NhdG9yLnF1YWxpZmllZFBhdHRlcm4oc2ltcGxlTmFtZSwgcXVhbGlmaWNhdGlvbik7CkBAIC01Myw4NiArMTU4LDIyMiBAQAogICogTG9jYXRlIGRlY2xhcmF0aW9uIGluIHRoZSBjdXJyZW50IGNsYXNzIGZpbGUuIFRoaXMgY2xhc3MgZmlsZSBpcyBhbHdheXMgaW4gYSBqYXIuCiAgKi8KIHB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoTWF0Y2hMb2NhdG9yIGxvY2F0b3IsIENsYXNzRmlsZSBjbGFzc0ZpbGUsIElCaW5hcnlUeXBlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkvLyBjaGVjayBjbGFzcyBkZWZpbml0aW9uCiAJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbG9jYXRvci5wYXR0ZXJuOworCisJLy8gY2hlY2sgYW5ub3RhdGlvbnMgcmVmZXJlbmNlcworCW1hdGNoQW5ub3RhdGlvbnMocGF0dGVybiwgbG9jYXRvciwgY2xhc3NGaWxlLCBpbmZvKTsKKworCS8vIGNoZWNrIGNsYXNzIGRlZmluaXRpb24KIAlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSAoQmluYXJ5VHlwZSkgY2xhc3NGaWxlLmdldFR5cGUoKTsKIAlpZiAobWF0Y2hCaW5hcnkocGF0dGVybiwgaW5mbywgbnVsbCkpIHsKIAkJYmluYXJ5VHlwZSA9IG5ldyBSZXNvbHZlZEJpbmFyeVR5cGUoKEphdmFFbGVtZW50KSBiaW5hcnlUeXBlLmdldFBhcmVudCgpLCBiaW5hcnlUeXBlLmdldEVsZW1lbnROYW1lKCksIGJpbmFyeVR5cGUuZ2V0S2V5KCkpOwogCQlsb2NhdG9yLnJlcG9ydEJpbmFyeU1lbWJlckRlY2xhcmF0aW9uKG51bGwsIGJpbmFyeVR5cGUsIG51bGwsIGluZm8sIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUpOworCQlyZXR1cm47CiAJfQogCisJLy8gRGVmaW5lIGFycmF5cyB0byBzdG9yZSBtZXRob2RzL2ZpZWxkcyBmcm9tIGJpbmFyeSB0eXBlIGlmIG5lY2Vzc2FyeQorCUlCaW5hcnlNZXRob2RbXSBiaW5hcnlNZXRob2RzID0gaW5mby5nZXRNZXRob2RzKCk7CisJaW50IGJNZXRob2RzTGVuZ3RoID0gYmluYXJ5TWV0aG9kcyA9PSBudWxsID8gMCA6IGJpbmFyeU1ldGhvZHMubGVuZ3RoOworCUlCaW5hcnlNZXRob2RbXSB1bnJlc29sdmVkTWV0aG9kcyA9IG51bGw7CisJY2hhcltdW10gYmluYXJ5TWV0aG9kU2lnbmF0dXJlcyA9IG51bGw7CisJYm9vbGVhbiBoYXNVbnJlc29sdmVkTWV0aG9kcyA9IGZhbHNlOworCisJLy8gR2V0IGZpZWxkcyBmcm9tIGJpbmFyeSB0eXBlIGluZm8KKwlJQmluYXJ5RmllbGRbXSBiaW5hcnlGaWVsZHMgPSBpbmZvLmdldEZpZWxkcygpOworCWludCBiRmllbGRzTGVuZ3RoID0gYmluYXJ5RmllbGRzID09IG51bGwgPyAwIDogYmluYXJ5RmllbGRzLmxlbmd0aDsKKwlJQmluYXJ5RmllbGRbXSB1bnJlc29sdmVkRmllbGRzID0gbnVsbDsKKwlib29sZWFuIGhhc1VucmVzb2x2ZWRGaWVsZHMgPSBmYWxzZTsKKworCS8vIFJlcG9ydCBhcyBtYW55IGFjY3VyYXRlIG1hdGNoZXMgYXMgcG9zc2libGUKIAlpbnQgYWNjdXJhY3kgPSBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFOwotCWlmICgoKEludGVybmFsU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5tdXN0UmVzb2x2ZSkgewotCQl0cnkgewotCQkJQmluYXJ5VHlwZUJpbmRpbmcgYmluZGluZyA9IGxvY2F0b3IuY2FjaGVCaW5hcnlUeXBlKGJpbmFyeVR5cGUsIGluZm8pOwotCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJCS8vIGZpbHRlciBvdXQgZWxlbWVudCBub3QgaW4gaGllcmFyY2h5IHNjb3BlCi0JCQkJaWYgKCFsb2NhdG9yLnR5cGVJbkhpZXJhcmNoeShiaW5kaW5nKSkgcmV0dXJuOworCWJvb2xlYW4gbXVzdFJlc29sdmUgPSBwYXR0ZXJuLm11c3RSZXNvbHZlOworCWlmIChtdXN0UmVzb2x2ZSkgeworCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gbG9jYXRvci5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSwgaW5mbyk7CisJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCS8vIGZpbHRlciBvdXQgZWxlbWVudCBub3QgaW4gaGllcmFyY2h5IHNjb3BlCisJCQlpZiAoIWxvY2F0b3IudHlwZUluSGllcmFyY2h5KGJpbmRpbmcpKSByZXR1cm47CiAKLQkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGJpbmRpbmcubWV0aG9kcygpOwotCQkJCWZvciAoaW50IGkgPSAwLCBsID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCQlpZiAobG9jYXRvci5wYXR0ZXJuTG9jYXRvci5yZXNvbHZlTGV2ZWwobWV0aG9kKSA9PSBQYXR0ZXJuTG9jYXRvci5BQ0NVUkFURV9NQVRDSCkgewotCQkJCQkJY2hhcltdIG1ldGhvZFNpZ25hdHVyZSA9IG1ldGhvZC5nZW5lcmljU2lnbmF0dXJlKCk7Ci0JCQkJCQlpZiAobWV0aG9kU2lnbmF0dXJlID09IG51bGwpIG1ldGhvZFNpZ25hdHVyZSA9IG1ldGhvZC5zaWduYXR1cmUoKTsKLQkJCQkJCUlNZXRob2QgbWV0aG9kSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRNZXRob2QoCi0JCQkJCQkJbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gYmluZGluZy5jb21wb3VuZE5hbWVbYmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoLTFdIDogbWV0aG9kLnNlbGVjdG9yKSwKLQkJCQkJCQlDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoY29udmVydENsYXNzRmlsZUZvcm1hdChtZXRob2RTaWduYXR1cmUpKSkpOwotCQkJCQkJbG9jYXRvci5yZXBvcnRCaW5hcnlNZW1iZXJEZWNsYXJhdGlvbihudWxsLCBtZXRob2RIYW5kbGUsIG1ldGhvZCwgaW5mbywgU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSk7Ci0JCQkJCX0KKwkJCS8vIFNlYXJjaCBtYXRjaGVzIG9uIHJlc29sdmVkIG1ldGhvZHMKKwkJCU1ldGhvZEJpbmRpbmdbXSBhdmFpbGFibGVNZXRob2RzID0gYmluZGluZy5hdmFpbGFibGVNZXRob2RzKCk7CisJCQlpbnQgYU1ldGhvZHNMZW5ndGggPSBhdmFpbGFibGVNZXRob2RzID09IG51bGwgPyAwIDogYXZhaWxhYmxlTWV0aG9kcy5sZW5ndGg7CisJCQloYXNVbnJlc29sdmVkTWV0aG9kcyA9IGJNZXRob2RzTGVuZ3RoICE9IGFNZXRob2RzTGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTWV0aG9kc0xlbmd0aDsgaSsrKSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBhdmFpbGFibGVNZXRob2RzW2ldOworCQkJCWNoYXJbXSBtZXRob2RTaWduYXR1cmUgPSBtZXRob2QuZ2VuZXJpY1NpZ25hdHVyZSgpOworCQkJCWlmIChtZXRob2RTaWduYXR1cmUgPT0gbnVsbCkgbWV0aG9kU2lnbmF0dXJlID0gbWV0aG9kLnNpZ25hdHVyZSgpOworCisJCQkJLy8gUmVwb3J0IHRoZSBtYXRjaCBpZiBwb3NzaWJsZQorCQkJCWludCBsZXZlbCA9IGxvY2F0b3IucGF0dGVybkxvY2F0b3IucmVzb2x2ZUxldmVsKG1ldGhvZCk7CisJCQkJaWYgKGxldmVsICE9IFBhdHRlcm5Mb2NhdG9yLklNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQkJSU1ldGhvZCBtZXRob2RIYW5kbGUgPSBiaW5hcnlUeXBlLmdldE1ldGhvZCgKKwkJCQkJCW5ldyBTdHJpbmcobWV0aG9kLmlzQ29uc3RydWN0b3IoKSA/IGJpbmRpbmcuY29tcG91bmROYW1lW2JpbmRpbmcuY29tcG91bmROYW1lLmxlbmd0aC0xXSA6IG1ldGhvZC5zZWxlY3RvciksCisJCQkJCQlDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoY29udmVydENsYXNzRmlsZUZvcm1hdChtZXRob2RTaWduYXR1cmUpKSkpOworCQkJCQlhY2N1cmFjeSA9IGxldmVsID09IFBhdHRlcm5Mb2NhdG9yLkFDQ1VSQVRFX01BVENIID8gU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSA6IFNlYXJjaE1hdGNoLkFfSU5BQ0NVUkFURTsKKwkJCQkJbG9jYXRvci5yZXBvcnRCaW5hcnlNZW1iZXJEZWNsYXJhdGlvbihudWxsLCBtZXRob2RIYW5kbGUsIG1ldGhvZCwgaW5mbywgYWNjdXJhY3kpOwogCQkJCX0KIAotCQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IGJpbmRpbmcuZmllbGRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBmaWVsZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCQkJaWYgKGxvY2F0b3IucGF0dGVybkxvY2F0b3IucmVzb2x2ZUxldmVsKGZpZWxkKSA9PSBQYXR0ZXJuTG9jYXRvci5BQ0NVUkFURV9NQVRDSCkgewotCQkJCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkLm5hbWUpKTsKLQkJCQkJCWxvY2F0b3IucmVwb3J0QmluYXJ5TWVtYmVyRGVjbGFyYXRpb24obnVsbCwgZmllbGRIYW5kbGUsIGZpZWxkLCBpbmZvLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFKTsKKwkJCQkvLyBSZW1vdmUgbWV0aG9kIGZyb20gdW5yZXNvbHZlZCBsaXN0CisJCQkJaWYgKGhhc1VucmVzb2x2ZWRNZXRob2RzKSB7CisJCQkJCWlmIChiaW5hcnlNZXRob2RTaWduYXR1cmVzID09IG51bGwpIHsgLy8gU3RvcmUgYmluYXJ5IG1ldGhvZCBzaWduYXR1cmVzIHRvIGF2b2lkIG11bHRpcGxlIGNvbXB1dGF0aW9uCisJCQkJCQliaW5hcnlNZXRob2RTaWduYXR1cmVzID0gbmV3IGNoYXJbYk1ldGhvZHNMZW5ndGhdW107CisJCQkJCQlmb3IgKGludCBqPTA7IGo8Yk1ldGhvZHNMZW5ndGg7IGorKykgeworCQkJCQkJCUlCaW5hcnlNZXRob2QgYmluYXJ5TWV0aG9kID0gYmluYXJ5TWV0aG9kc1tqXTsKKwkJCQkJCQljaGFyW10gc2lnbmF0dXJlID0gYmluYXJ5TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKTsKKwkJCQkJCQlpZiAoc2lnbmF0dXJlID09IG51bGwpIHNpZ25hdHVyZSA9IGJpbmFyeU1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCk7CisJCQkJCQkJYmluYXJ5TWV0aG9kU2lnbmF0dXJlc1tqXSA9IHNpZ25hdHVyZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlmb3IgKGludCBqPTA7IGo8Yk1ldGhvZHNMZW5ndGg7IGorKykgeworCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGJpbmFyeU1ldGhvZHNbal0uZ2V0U2VsZWN0b3IoKSwgbWV0aG9kLnNlbGVjdG9yKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhiaW5hcnlNZXRob2RTaWduYXR1cmVzW2pdLCBtZXRob2RTaWduYXR1cmUpKSB7CisJCQkJCQkJaWYgKHVucmVzb2x2ZWRNZXRob2RzID09IG51bGwpIHsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShiaW5hcnlNZXRob2RzLCAwLCB1bnJlc29sdmVkTWV0aG9kcyA9IG5ldyBJQmluYXJ5TWV0aG9kW2JNZXRob2RzTGVuZ3RoXSwgMCwgYk1ldGhvZHNMZW5ndGgpOworCQkJCQkJCX0KKwkJCQkJCQl1bnJlc29sdmVkTWV0aG9kc1tqXSA9IG51bGw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CisJCQl9CiAKLQkJCQkvLyBubyBuZWVkIHRvIGNoZWNrIGJpbmFyeSBpbmZvIHNpbmNlIHJlc29sdmUgd2FzIHN1Y2Nlc3NmdWwKKwkJCS8vIFNlYXJjaCBtYXRjaGVzIG9uIHJlc29sdmVkIGZpZWxkcworCQkJRmllbGRCaW5kaW5nW10gYXZhaWxhYmxlRmllbGRzID0gYmluZGluZy5hdmFpbGFibGVGaWVsZHMoKTsKKwkJCWludCBhRmllbGRzTGVuZ3RoID0gYXZhaWxhYmxlRmllbGRzID09IG51bGwgPyAwIDogYXZhaWxhYmxlRmllbGRzLmxlbmd0aDsKKwkJCWhhc1VucmVzb2x2ZWRGaWVsZHMgPSBiRmllbGRzTGVuZ3RoICE9IGFGaWVsZHNMZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFGaWVsZHNMZW5ndGg7IGkrKykgeworCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGF2YWlsYWJsZUZpZWxkc1tpXTsKKworCQkJCS8vIFJlcG9ydCB0aGUgbWF0Y2ggaWYgcG9zc2libGUKKwkJCQlpbnQgbGV2ZWwgPSBsb2NhdG9yLnBhdHRlcm5Mb2NhdG9yLnJlc29sdmVMZXZlbChmaWVsZCk7CisJCQkJaWYgKGxldmVsICE9IFBhdHRlcm5Mb2NhdG9yLklNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkLm5hbWUpKTsKKwkJCQkJYWNjdXJhY3kgPSBsZXZlbCA9PSBQYXR0ZXJuTG9jYXRvci5BQ0NVUkFURV9NQVRDSCA/IFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUgOiBTZWFyY2hNYXRjaC5BX0lOQUNDVVJBVEU7CisJCQkJCWxvY2F0b3IucmVwb3J0QmluYXJ5TWVtYmVyRGVjbGFyYXRpb24obnVsbCwgZmllbGRIYW5kbGUsIGZpZWxkLCBpbmZvLCBhY2N1cmFjeSk7CisJCQkJfQorCisJCQkJLy8gUmVtb3ZlIHRoZSBmaWVsZCBmcm9tIHVucmVzb2x2ZWQgbGlzdAorCQkJCWlmIChoYXNVbnJlc29sdmVkRmllbGRzKSB7CisJCQkJCWZvciAoaW50IGo9MDsgajxiRmllbGRzTGVuZ3RoOyBqKyspIHsKKwkJCQkJCWlmICggQ2hhck9wZXJhdGlvbi5lcXVhbHMoYmluYXJ5RmllbGRzW2pdLmdldE5hbWUoKSwgZmllbGQubmFtZSkpIHsKKwkJCQkJCQlpZiAodW5yZXNvbHZlZEZpZWxkcyA9PSBudWxsKSB7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluYXJ5RmllbGRzLCAwLCB1bnJlc29sdmVkRmllbGRzID0gbmV3IElCaW5hcnlGaWVsZFtiRmllbGRzTGVuZ3RoXSwgMCwgYkZpZWxkc0xlbmd0aCk7CisJCQkJCQkJfQorCQkJCQkJCXVucmVzb2x2ZWRGaWVsZHNbal0gPSBudWxsOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBJZiBhbGwgbWV0aG9kcy9maWVsZHMgd2VyZSBhY2N1cmF0ZSB0aGVuIHJldHVybnMgbm93CisJCQlpZiAoIWhhc1VucmVzb2x2ZWRNZXRob2RzICYmICFoYXNVbnJlc29sdmVkRmllbGRzKSB7CiAJCQkJcmV0dXJuOwogCQkJfQotCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWYgY29tcGlsYXRpb24gd2FzIGFib3J0ZWQgaXQgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGNsYXNzIHBhdGgKIAkJfQotCQkvLyByZXBvcnQgYXMgYSBwb3RlbnRpYWwgbWF0Y2ggaWYgYmluYXJ5IGluZm8gbWF0Y2hlcyB0aGUgcGF0dGVybgkJCiAJCWFjY3VyYWN5ID0gU2VhcmNoTWF0Y2guQV9JTkFDQ1VSQVRFOwogCX0KIAotCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gaW5mby5nZXRNZXRob2RzKCk7CisJLy8gUmVwb3J0IGluYWNjdXJhdGUgbWV0aG9kcworCWlmIChtdXN0UmVzb2x2ZSkgYmluYXJ5TWV0aG9kcyA9IHVucmVzb2x2ZWRNZXRob2RzOworCWJNZXRob2RzTGVuZ3RoID0gYmluYXJ5TWV0aG9kcyA9PSBudWxsID8gMCA6IGJpbmFyeU1ldGhvZHMubGVuZ3RoOworCWZvciAoaW50IGk9MDsgaSA8IGJNZXRob2RzTGVuZ3RoOyBpKyspIHsKKwkJSUJpbmFyeU1ldGhvZCBtZXRob2QgPSBiaW5hcnlNZXRob2RzW2ldOworCQlpZiAobWV0aG9kID09IG51bGwpIGNvbnRpbnVlOyAvLyBpbXBvc3NpYmxlIG1hdGNoIG9yIGFscmVhZHkgcmVwb3J0ZWQgYXMgYWNjdXJhdGUKKwkJaWYgKG1hdGNoQmluYXJ5KHBhdHRlcm4sIG1ldGhvZCwgaW5mbykpIHsKKwkJCWNoYXJbXSBuYW1lOworCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NzI3CisJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0aGUgZW5jbG9zaW5nIHR5cGUgbmFtZSBmb3IgdGhlIGNvbnN0cnVjdG9yIG5hbWUKKwkJCQluYW1lID0gaW5mby5nZXRTb3VyY2VOYW1lKCk7CisJCQl9IGVsc2UgeworCQkJCW5hbWUgPSBtZXRob2QuZ2V0U2VsZWN0b3IoKTsKKwkJCX0KKwkJCVN0cmluZyBzZWxlY3RvciA9IG5ldyBTdHJpbmcobmFtZSk7CisJCQljaGFyW10gbWV0aG9kU2lnbmF0dXJlID0gYmluYXJ5TWV0aG9kU2lnbmF0dXJlcyA9PSBudWxsID8gbnVsbCA6IGJpbmFyeU1ldGhvZFNpZ25hdHVyZXNbaV07CisJCQlpZiAobWV0aG9kU2lnbmF0dXJlID09IG51bGwpIHsKKwkJCQltZXRob2RTaWduYXR1cmUgPSBtZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpOworCQkJCWlmIChtZXRob2RTaWduYXR1cmUgPT0gbnVsbCkgbWV0aG9kU2lnbmF0dXJlID0gbWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKTsKKwkJCX0KKwkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKGNvbnZlcnRDbGFzc0ZpbGVGb3JtYXQobWV0aG9kU2lnbmF0dXJlKSkpOworCQkJSU1ldGhvZCBtZXRob2RIYW5kbGUgPSBiaW5hcnlUeXBlLmdldE1ldGhvZChzZWxlY3RvciwgcGFyYW1ldGVyVHlwZXMpOworCQkJbWV0aG9kSGFuZGxlID0gbmV3IFJlc29sdmVkQmluYXJ5TWV0aG9kKGJpbmFyeVR5cGUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kSGFuZGxlLmdldEtleSgpKTsKKwkJCWxvY2F0b3IucmVwb3J0QmluYXJ5TWVtYmVyRGVjbGFyYXRpb24obnVsbCwgbWV0aG9kSGFuZGxlLCBudWxsLCBpbmZvLCBhY2N1cmFjeSk7CisJCX0KKwl9CisKKwkvLyBSZXBvcnQgaW5hY2N1cmF0ZSBmaWVsZHMKKwlpZiAobXVzdFJlc29sdmUpIGJpbmFyeUZpZWxkcyA9ICB1bnJlc29sdmVkRmllbGRzOworCWJGaWVsZHNMZW5ndGggPSBiaW5hcnlGaWVsZHMgPT0gbnVsbCA/IDAgOiBiaW5hcnlGaWVsZHMubGVuZ3RoOworCWZvciAoaW50IGk9MDsgaTxiRmllbGRzTGVuZ3RoOyBpKyspIHsKKwkJSUJpbmFyeUZpZWxkIGZpZWxkID0gYmluYXJ5RmllbGRzW2ldOworCQlpZiAoZmllbGQgPT0gbnVsbCkgY29udGludWU7IC8vIGltcG9zc2libGUgbWF0Y2ggb3IgYWxyZWFkeSByZXBvcnRlZCBhcyBhY2N1cmF0ZQorCQlpZiAobWF0Y2hCaW5hcnkocGF0dGVybiwgZmllbGQsIGluZm8pKSB7CisJCQlTdHJpbmcgZmllbGROYW1lID0gbmV3IFN0cmluZyhmaWVsZC5nZXROYW1lKCkpOworCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOworCQkJZmllbGRIYW5kbGUgPSBuZXcgUmVzb2x2ZWRCaW5hcnlGaWVsZChiaW5hcnlUeXBlLCBmaWVsZE5hbWUsIGZpZWxkSGFuZGxlLmdldEtleSgpKTsKKwkJCWxvY2F0b3IucmVwb3J0QmluYXJ5TWVtYmVyRGVjbGFyYXRpb24obnVsbCwgZmllbGRIYW5kbGUsIG51bGwsIGluZm8sIGFjY3VyYWN5KTsKKwkJfQorCX0KK30KKy8qCisgKiBMb29rIGZvciBhbm5vdGF0aW9ucyByZWZlcmVuY2VzCisgKi8KK3ByaXZhdGUgdm9pZCBtYXRjaEFubm90YXRpb25zKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IsIENsYXNzRmlsZSBjbGFzc0ZpbGUsIElCaW5hcnlUeXBlIGJpbmFyeVR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBPbmx5IHByb2Nlc3MgVHlwZVJlZmVyZW5jZSBwYXR0ZXJucworCXN3aXRjaCAocGF0dGVybi5raW5kKSB7CisJCWNhc2UgVFlQRV9SRUZfUEFUVEVSTjoKKwkJCWJyZWFrOworCQljYXNlIE9SX1BBVFRFUk46CisJCQlTZWFyY2hQYXR0ZXJuW10gcGF0dGVybnMgPSAoKE9yUGF0dGVybikgcGF0dGVybikucGF0dGVybnM7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGF0dGVybnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQltYXRjaEFubm90YXRpb25zKHBhdHRlcm5zW2ldLCBsb2NhdG9yLCBjbGFzc0ZpbGUsIGJpbmFyeVR5cGUpOworCQkJfQorCQkJLy8gJEZBTEwtVEhST1VHSCQgLSBmYWxsIHRocm91Z2ggZGVmYXVsdCB0byByZXR1cm4KKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisJVHlwZVJlZmVyZW5jZVBhdHRlcm4gdHlwZVJlZmVyZW5jZVBhdHRlcm4gID0gKFR5cGVSZWZlcmVuY2VQYXR0ZXJuKSBwYXR0ZXJuOworCisJLy8gTG9vayBmb3IgcmVmZXJlbmNlcyBpbiBjbGFzcyBhbm5vdGF0aW9ucworCUlCaW5hcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBiaW5hcnlUeXBlLmdldEFubm90YXRpb25zKCk7CisJQmluYXJ5VHlwZSBjbGFzc0ZpbGVCaW5hcnlUeXBlID0gKEJpbmFyeVR5cGUpIGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJQmluYXJ5VHlwZUJpbmRpbmcgYmluYXJ5VHlwZUJpbmRpbmcgPSBudWxsOworCWlmIChjaGVja0Fubm90YXRpb25zKHR5cGVSZWZlcmVuY2VQYXR0ZXJuLCBhbm5vdGF0aW9ucywgYmluYXJ5VHlwZS5nZXRUYWdCaXRzKCkpKSB7CisJCWNsYXNzRmlsZUJpbmFyeVR5cGUgPSBuZXcgUmVzb2x2ZWRCaW5hcnlUeXBlKChKYXZhRWxlbWVudCkgY2xhc3NGaWxlQmluYXJ5VHlwZS5nZXRQYXJlbnQoKSwgY2xhc3NGaWxlQmluYXJ5VHlwZS5nZXRFbGVtZW50TmFtZSgpLCBjbGFzc0ZpbGVCaW5hcnlUeXBlLmdldEtleSgpKTsKKwkJVHlwZVJlZmVyZW5jZU1hdGNoIG1hdGNoID0gbmV3IFR5cGVSZWZlcmVuY2VNYXRjaChjbGFzc0ZpbGVCaW5hcnlUeXBlLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCAtMSwgMCwgZmFsc2UsIGxvY2F0b3IuZ2V0UGFydGljaXBhbnQoKSwgbG9jYXRvci5jdXJyZW50UG9zc2libGVNYXRjaC5yZXNvdXJjZSk7CisJCS8vIFRPRE8gMy40IE03IChmcmVkZXJpYykgLSBidWcgMjA5OTk2OiBzZWUgaG93IGNyZWF0ZSB0aGUgYW5ub3RhdGlvbiBoYW5kbGUgZnJvbSB0aGUgYmluYXJ5IGFuZCBwdXQgaXQgaW4gdGhlIGxvY2FsIGVsZW1lbnQKKwkJbWF0Y2guc2V0TG9jYWxFbGVtZW50KG51bGwpOworCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJfQorCisJLy8gTG9vayBmb3IgcmVmZXJlbmNlcyBpbiBtZXRob2RzIGFubm90YXRpb25zCisJTWV0aG9kSW5mb1tdIG1ldGhvZHMgPSAoTWV0aG9kSW5mb1tdKSBiaW5hcnlUeXBlLmdldE1ldGhvZHMoKTsKIAlpZiAobWV0aG9kcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWlmIChtYXRjaEJpbmFyeShwYXR0ZXJuLCBtZXRob2QsIGluZm8pKSB7Ci0JCQkJY2hhcltdIG5hbWU7Ci0JCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJbmFtZSA9IGluZm8uZ2V0TmFtZSgpOwotCQkJCQlpbnQgbGFzdFNsYXNoID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIG5hbWUpOwotCQkJCQlpZiAobGFzdFNsYXNoICE9IC0xKSB7Ci0JCQkJCQluYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCBsYXN0U2xhc2grMSwgbmFtZS5sZW5ndGgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmFtZSA9IG1ldGhvZC5nZXRTZWxlY3RvcigpOwotCQkJCX0KLQkJCQlTdHJpbmcgc2VsZWN0b3IgPSBuZXcgU3RyaW5nKG5hbWUpOwotCQkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gQ2hhck9wZXJhdGlvbi50b1N0cmluZ3MoU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKGNvbnZlcnRDbGFzc0ZpbGVGb3JtYXQobWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKSkpKTsKLQkJCQlJTWV0aG9kIG1ldGhvZEhhbmRsZSA9IGJpbmFyeVR5cGUuZ2V0TWV0aG9kKHNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQkJbWV0aG9kSGFuZGxlID0gbmV3IFJlc29sdmVkQmluYXJ5TWV0aG9kKGJpbmFyeVR5cGUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kSGFuZGxlLmdldEtleSgpKTsKLQkJCQlsb2NhdG9yLnJlcG9ydEJpbmFyeU1lbWJlckRlY2xhcmF0aW9uKG51bGwsIG1ldGhvZEhhbmRsZSwgbnVsbCwgaW5mbywgYWNjdXJhY3kpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJTWV0aG9kSW5mbyBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJaWYgKGNoZWNrQW5ub3RhdGlvbnModHlwZVJlZmVyZW5jZVBhdHRlcm4sIG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpLCBtZXRob2QuZ2V0VGFnQml0cygpKSkgeworCQkJCQliaW5hcnlUeXBlQmluZGluZyA9IGxvY2F0b3IuY2FjaGVCaW5hcnlUeXBlKGNsYXNzRmlsZUJpbmFyeVR5cGUsIGJpbmFyeVR5cGUpOworCQkJCQlJTWV0aG9kIG1ldGhvZEhhbmRsZSA9IGNsYXNzRmlsZUJpbmFyeVR5cGUuZ2V0TWV0aG9kKAorCQkJCQkJbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gYmluYXJ5VHlwZUJpbmRpbmcuY29tcG91bmROYW1lW2JpbmFyeVR5cGVCaW5kaW5nLmNvbXBvdW5kTmFtZS5sZW5ndGgtMV0gOiBtZXRob2QuZ2V0U2VsZWN0b3IoKSksCisJCQkJCQlDaGFyT3BlcmF0aW9uLnRvU3RyaW5ncyhTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoY29udmVydENsYXNzRmlsZUZvcm1hdChtZXRob2QuZ2V0TWV0aG9kRGVzY3JpcHRvcigpKSkpKTsKKwkJCQkJVHlwZVJlZmVyZW5jZU1hdGNoIG1hdGNoID0gbmV3IFR5cGVSZWZlcmVuY2VNYXRjaChtZXRob2RIYW5kbGUsIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUsIC0xLCAwLCBmYWxzZSwgbG9jYXRvci5nZXRQYXJ0aWNpcGFudCgpLCBsb2NhdG9yLmN1cnJlbnRQb3NzaWJsZU1hdGNoLnJlc291cmNlKTsKKwkJCQkJLy8gVE9ETyAzLjQgTTcgKGZyZWRlcmljKSAtIGJ1ZyAyMDk5OTY6IHNlZSBob3cgY3JlYXRlIHRoZSBhbm5vdGF0aW9uIGhhbmRsZSBmcm9tIHRoZSBiaW5hcnkgYW5kIHB1dCBpdCBpbiB0aGUgbG9jYWwgZWxlbWVudAorCQkJCQltYXRjaC5zZXRMb2NhbEVsZW1lbnQobnVsbCk7CisJCQkJCWxvY2F0b3IucmVwb3J0KG1hdGNoKTsKIAkJCX0KIAkJfQogCX0KIAotCUlCaW5hcnlGaWVsZFtdIGZpZWxkcyA9IGluZm8uZ2V0RmllbGRzKCk7CisJLy8gTG9vayBmb3IgcmVmZXJlbmNlcyBpbiBmaWVsZHMgYW5ub3RhdGlvbnMKKwlGaWVsZEluZm9bXSBmaWVsZHMgPSAoRmllbGRJbmZvW10pIGJpbmFyeVR5cGUuZ2V0RmllbGRzKCk7CiAJaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsID0gZmllbGRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQkJSUJpbmFyeUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJaWYgKG1hdGNoQmluYXJ5KHBhdHRlcm4sIGZpZWxkLCBpbmZvKSkgewotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBuZXcgU3RyaW5nKGZpZWxkLmdldE5hbWUoKSk7Ci0JCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOwotCQkJCWZpZWxkSGFuZGxlID0gbmV3IFJlc29sdmVkQmluYXJ5RmllbGQoYmluYXJ5VHlwZSwgZmllbGROYW1lLCBmaWVsZEhhbmRsZS5nZXRLZXkoKSk7Ci0JCQkJbG9jYXRvci5yZXBvcnRCaW5hcnlNZW1iZXJEZWNsYXJhdGlvbihudWxsLCBmaWVsZEhhbmRsZSwgbnVsbCwgaW5mbywgYWNjdXJhY3kpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlGaWVsZEluZm8gZmllbGQgPSBmaWVsZHNbaV07CisJCQlpZiAoY2hlY2tBbm5vdGF0aW9ucyh0eXBlUmVmZXJlbmNlUGF0dGVybiwgZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSwgZmllbGQuZ2V0VGFnQml0cygpKSkgeworCQkJCQlJRmllbGQgZmllbGRIYW5kbGUgPSBjbGFzc0ZpbGVCaW5hcnlUeXBlLmdldEZpZWxkKG5ldyBTdHJpbmcoZmllbGQuZ2V0TmFtZSgpKSk7CisJCQkJCVR5cGVSZWZlcmVuY2VNYXRjaCBtYXRjaCA9IG5ldyBUeXBlUmVmZXJlbmNlTWF0Y2goZmllbGRIYW5kbGUsIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUsIC0xLCAwLCBmYWxzZSwgbG9jYXRvci5nZXRQYXJ0aWNpcGFudCgpLCBsb2NhdG9yLmN1cnJlbnRQb3NzaWJsZU1hdGNoLnJlc291cmNlKTsKKwkJCQkJLy8gVE9ETyAzLjQgTTcgKGZyZWRlcmljKSAtIGJ1ZyAyMDk5OTY6IHNlZSBob3cgY3JlYXRlIHRoZSBhbm5vdGF0aW9uIGhhbmRsZSBmcm9tIHRoZSBiaW5hcnkgYW5kIHB1dCBpdCBpbiB0aGUgbG9jYWwgZWxlbWVudAorCQkJCQltYXRjaC5zZXRMb2NhbEVsZW1lbnQobnVsbCk7CisJCQkJCWxvY2F0b3IucmVwb3J0KG1hdGNoKTsKIAkJCX0KIAkJfQogCX0KQEAgLTE0Miw3ICszODMsNyBAQAogICogRGVmYXVsdCBpcyB0byByZXR1cm4gZmFsc2UuCiAgKi8KIGJvb2xlYW4gbWF0Y2hCaW5hcnkoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBPYmplY3QgYmluYXJ5SW5mbywgSUJpbmFyeVR5cGUgZW5jbG9zaW5nQmluYXJ5VHlwZSkgewotCXN3aXRjaCAoKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pcGF0dGVybikua2luZCkgeworCXN3aXRjaCAocGF0dGVybi5raW5kKSB7CiAJCWNhc2UgQ09OU1RSVUNUT1JfUEFUVEVSTiA6CiAJCQlyZXR1cm4gbWF0Y2hDb25zdHJ1Y3RvcigoQ29uc3RydWN0b3JQYXR0ZXJuKSBwYXR0ZXJuLCBiaW5hcnlJbmZvLCBlbmNsb3NpbmdCaW5hcnlUeXBlKTsKIAkJY2FzZSBGSUVMRF9QQVRURVJOIDoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ2xhc3NwYXRoU291cmNlRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NsYXNzcGF0aFNvdXJjZURpcmVjdG9yeS5qYXZhCmluZGV4IDU3NDFlZTMuLjlmZDM0YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ2xhc3NwYXRoU291cmNlRGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9DbGFzc3BhdGhTb3VyY2VEaXJlY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00MSwxMiArNDEsMTIgQEAKIH0KIAogU2ltcGxlTG9va3VwVGFibGUgZGlyZWN0b3J5VGFibGUoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7Ci0JU2ltcGxlTG9va3VwVGFibGUgZGlyVGFibGUgPSAoU2ltcGxlTG9va3VwVGFibGUpIGRpcmVjdG9yeUNhY2hlLmdldChxdWFsaWZpZWRQYWNrYWdlTmFtZSk7Ci0JaWYgKGRpclRhYmxlID09IG1pc3NpbmdQYWNrYWdlSG9sZGVyKSByZXR1cm4gbnVsbDsgLy8gcGFja2FnZSBleGlzdHMgaW4gYW5vdGhlciBjbGFzc3BhdGggZGlyZWN0b3J5IG9yIGphcgorCVNpbXBsZUxvb2t1cFRhYmxlIGRpclRhYmxlID0gKFNpbXBsZUxvb2t1cFRhYmxlKSB0aGlzLmRpcmVjdG9yeUNhY2hlLmdldChxdWFsaWZpZWRQYWNrYWdlTmFtZSk7CisJaWYgKGRpclRhYmxlID09IHRoaXMubWlzc2luZ1BhY2thZ2VIb2xkZXIpIHJldHVybiBudWxsOyAvLyBwYWNrYWdlIGV4aXN0cyBpbiBhbm90aGVyIGNsYXNzcGF0aCBkaXJlY3Rvcnkgb3IgamFyCiAJaWYgKGRpclRhYmxlICE9IG51bGwpIHJldHVybiBkaXJUYWJsZTsKIAogCXRyeSB7Ci0JCUlSZXNvdXJjZSBjb250YWluZXIgPSBzb3VyY2VGb2xkZXIuZmluZE1lbWJlcihxdWFsaWZpZWRQYWNrYWdlTmFtZSk7IC8vIHRoaXMgaXMgYSBjYXNlLXNlbnNpdGl2ZSBjaGVjaworCQlJUmVzb3VyY2UgY29udGFpbmVyID0gdGhpcy5zb3VyY2VGb2xkZXIuZmluZE1lbWJlcihxdWFsaWZpZWRQYWNrYWdlTmFtZSk7IC8vIHRoaXMgaXMgYSBjYXNlLXNlbnNpdGl2ZSBjaGVjawogCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewogCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgY29udGFpbmVyKS5tZW1iZXJzKCk7CiAJCQlkaXJUYWJsZSA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgpOwpAQCAtNjMsMTMgKzYzLDEzIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIGRpclRhYmxlKTsKKwkJCXRoaXMuZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCBkaXJUYWJsZSk7CiAJCQlyZXR1cm4gZGlyVGFibGU7CiAJCX0KIAl9IGNhdGNoKENvcmVFeGNlcHRpb24gaWdub3JlZCkgewogCQkvLyB0cmVhdCBhcyBpZiBtaXNzaW5nCiAJfQotCWRpcmVjdG9yeUNhY2hlLnB1dChxdWFsaWZpZWRQYWNrYWdlTmFtZSwgbWlzc2luZ1BhY2thZ2VIb2xkZXIpOworCXRoaXMuZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCB0aGlzLm1pc3NpbmdQYWNrYWdlSG9sZGVyKTsKIAlyZXR1cm4gbnVsbDsKIH0KIApAQCAtNzcsOCArNzcsOCBAQAogCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwogCWlmICghKG8gaW5zdGFuY2VvZiBDbGFzc3BhdGhTb3VyY2VEaXJlY3RvcnkpKSByZXR1cm4gZmFsc2U7CiAKLQlyZXR1cm4gc291cmNlRm9sZGVyLmVxdWFscygoKENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSkgbykuc291cmNlRm9sZGVyKTsKLX0gCisJcmV0dXJuIHRoaXMuc291cmNlRm9sZGVyLmVxdWFscygoKENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSkgbykuc291cmNlRm9sZGVyKTsKK30KIAogcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIHNvdXJjZUZpbGVXaXRob3V0RXh0ZW5zaW9uLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRTb3VyY2VGaWxlV2l0aG91dEV4dGVuc2lvbikgewogCVNpbXBsZUxvb2t1cFRhYmxlIGRpclRhYmxlID0gZGlyZWN0b3J5VGFibGUocXVhbGlmaWVkUGFja2FnZU5hbWUpOwpAQCAtOTIsNyArOTIsMTEgQEAKIH0KIAogcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0JcmV0dXJuIHNvdXJjZUZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJcmV0dXJuIHRoaXMuc291cmNlRm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKK30KKworcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gdGhpcy5zb3VyY2VGb2xkZXIgPT0gbnVsbCA/IHN1cGVyLmhhc2hDb2RlKCkgOiB0aGlzLnNvdXJjZUZvbGRlci5oYXNoQ29kZSgpOwogfQogCiBwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CkBAIC0xMDQsNyArMTA4LDcgQEAKIH0KIAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlNvdXJjZSBjbGFzc3BhdGggZGlyZWN0b3J5ICIgKyBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuICJTb3VyY2UgY2xhc3NwYXRoIGRpcmVjdG9yeSAiICsgdGhpcy5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCiB9CiAKIHB1YmxpYyBTdHJpbmcgZGVidWdQYXRoU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTU4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5FeHRyYUZsYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIENvbnN0cnVjdG9yUGF0dGVybiB7CisJcHVibGljIGludCBleHRyYUZsYWdzOworCQorCXB1YmxpYyBpbnQgZGVjbGFyaW5nVHlwZU1vZGlmaWVyczsKKwlwdWJsaWMgY2hhcltdIGRlY2xhcmluZ1BhY2thZ2VOYW1lOworCQorCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBjaGFyW10gc2lnbmF0dXJlOworCXB1YmxpYyBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlczsKKwlwdWJsaWMgY2hhcltdW10gcGFyYW1ldGVyTmFtZXM7CisKK3B1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybihjaGFyW10gZGVjbGFyaW5nUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7CisJdGhpcyhtYXRjaFJ1bGUpOworCXRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9ICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCB0aGlzLmlzQ2FtZWxDYXNlKSA/IGRlY2xhcmluZ1NpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKGRlY2xhcmluZ1NpbXBsZU5hbWUpOworCXRoaXMuZGVjbGFyaW5nUGFja2FnZU5hbWUgPSBkZWNsYXJpbmdQYWNrYWdlTmFtZTsKKwl0aGlzLmZpbmREZWNsYXJhdGlvbnMgPSB0cnVlOworCXRoaXMuZmluZFJlZmVyZW5jZXMgPSBmYWxzZTsKKwl0aGlzLnBhcmFtZXRlckNvdW50ID0gLTE7CisJdGhpcy5tdXN0UmVzb2x2ZSA9IGZhbHNlOworfQorCitDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybihpbnQgbWF0Y2hSdWxlKSB7CisJc3VwZXIobWF0Y2hSdWxlKTsKK30KK3B1YmxpYyB2b2lkIGRlY29kZUluZGV4S2V5KGNoYXJbXSBrZXkpIHsKKwlpbnQgbGFzdCA9IGtleS5sZW5ndGggLSAxOworCWludCBzbGFzaCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIGtleSwgMCk7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShrZXksIDAsIHNsYXNoKTsKKwkKKwlpbnQgc3RhcnQgPSBzbGFzaCArIDE7CisJc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCBrZXksIHN0YXJ0KTsKKwlsYXN0ID0gc2xhc2ggLSAxOworCQorCWJvb2xlYW4gaXNEZWZhdWx0Q29uc3RydWN0b3IgPSBrZXlbbGFzdF0gPT0gJyMnOworCWlmIChpc0RlZmF1bHRDb25zdHJ1Y3RvcikgeworCQl0aGlzLnBhcmFtZXRlckNvdW50ID0gLTE7CisJfSBlbHNlIHsKKwkJdGhpcy5wYXJhbWV0ZXJDb3VudCA9IDA7CisJCWludCBwb3dlciA9IDE7CisJCWZvciAoaW50IGkgPSBsYXN0OyBpID49IHN0YXJ0OyBpLS0pIHsKKwkJCWlmIChpID09IGxhc3QpIHsKKwkJCQl0aGlzLnBhcmFtZXRlckNvdW50ID0ga2V5W2ldIC0gJzAnOworCQkJfSBlbHNlIHsKKwkJCQlwb3dlciAqPSAxMDsKKwkJCQl0aGlzLnBhcmFtZXRlckNvdW50ICs9IHBvd2VyICogKGtleVtpXSAtICcwJyk7CisJCQl9CisJCX0KKwl9CisJCisJc2xhc2ggPSBzbGFzaCArIDM7CisJbGFzdCA9IHNsYXNoIC0gMTsKKwkKKwlpbnQgdHlwZU1vZGlmaWVyc1dpdGhFeHRyYUZsYWdzID0ga2V5W2xhc3QtMV0gKyAoa2V5W2xhc3RdPDwxNik7CisJdGhpcy5kZWNsYXJpbmdUeXBlTW9kaWZpZXJzID0gZGVjb2RlTW9kaWZlcnModHlwZU1vZGlmaWVyc1dpdGhFeHRyYUZsYWdzKTsKKwl0aGlzLmV4dHJhRmxhZ3MgPSBkZWNvZGVFeHRyYUZsYWdzKHR5cGVNb2RpZmllcnNXaXRoRXh0cmFGbGFncyk7CisJCisJLy8gaW5pdGlhbGl6ZSBvcHRpb25hbCBmaWVsZHMKKwl0aGlzLmRlY2xhcmluZ1BhY2thZ2VOYW1lID0gbnVsbDsKKwl0aGlzLm1vZGlmaWVycyA9IDA7CisJdGhpcy5zaWduYXR1cmUgPSBudWxsOworCXRoaXMucGFyYW1ldGVyVHlwZXMgPSBudWxsOworCXRoaXMucGFyYW1ldGVyTmFtZXMgPSBudWxsOworCQorCWJvb2xlYW4gaXNNZW1iZXJUeXBlID0gKHRoaXMuZXh0cmFGbGFncyAmIEV4dHJhRmxhZ3MuSXNNZW1iZXJUeXBlKSAhPSAwOworCQorCWlmICghaXNNZW1iZXJUeXBlKSB7CisJCXN0YXJ0ID0gc2xhc2ggKyAxOworCQlpZiAodGhpcy5wYXJhbWV0ZXJDb3VudCA9PSAtMSkgeworCQkJc2xhc2ggPSBrZXkubGVuZ3RoOworCQkJbGFzdCA9IHNsYXNoIC0gMTsKKwkJfSBlbHNlIHsKKwkJCXNsYXNoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNFUEFSQVRPUiwga2V5LCBzdGFydCk7CisJCX0KKwkJbGFzdCA9IHNsYXNoIC0gMTsKKwkJCisJCXRoaXMuZGVjbGFyaW5nUGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGtleSwgc3RhcnQsIHNsYXNoKTsKKwkJCisJCXN0YXJ0ID0gc2xhc2ggKyAxOworCQlpZiAodGhpcy5wYXJhbWV0ZXJDb3VudCA9PSAwKSB7CisJCQlzbGFzaCA9IHNsYXNoICsgMzsKKwkJCWxhc3QgPSBzbGFzaCAtIDE7CisJCQkKKwkJCXRoaXMubW9kaWZpZXJzID0ga2V5W2xhc3QtMV0gKyAoa2V5W2xhc3RdPDwxNik7CisJCX0gZWxzZSBpZiAodGhpcy5wYXJhbWV0ZXJDb3VudCA+IDApeworCQkJc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCBrZXksIHN0YXJ0KTsKKwkJCWxhc3QgPSBzbGFzaCAtIDE7CisJCQkKKwkJCWJvb2xlYW4gaGFzUGFyYW1ldGVyU3RvcmVkQXNTaWduYXR1cmUgPSAodGhpcy5leHRyYUZsYWdzICYgRXh0cmFGbGFncy5QYXJhbWV0ZXJUeXBlc1N0b3JlZEFzU2lnbmF0dXJlKSAhPSAwOworCQkJaWYgKGhhc1BhcmFtZXRlclN0b3JlZEFzU2lnbmF0dXJlKSB7CisJCQkJdGhpcy5zaWduYXR1cmUgID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShrZXksIHN0YXJ0LCBzbGFzaCk7CisJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMuc2lnbmF0dXJlICwgJ1xcJywgU0VQQVJBVE9SKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5wYXJhbWV0ZXJUeXBlcyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbihQQVJBTUVURVJfU0VQQVJBVE9SLCBrZXksIHN0YXJ0LCBzbGFzaCk7CisJCQl9CisJCQlzdGFydCA9IHNsYXNoICsgMTsKKwkJCXNsYXNoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNFUEFSQVRPUiwga2V5LCBzdGFydCk7CisJCQlsYXN0ID0gc2xhc2ggLSAxOworCQkJCisJCQlpZiAoc2xhc2ggIT0gc3RhcnQpIHsKKwkJCQl0aGlzLnBhcmFtZXRlck5hbWVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKFBBUkFNRVRFUl9TRVBBUkFUT1IsIGtleSwgc3RhcnQsIHNsYXNoKTsKKwkJCX0KKwkJCQorCQkJc2xhc2ggPSBzbGFzaCArIDM7CisJCQlsYXN0ID0gc2xhc2ggLSAxOworCQkJCisJCQl0aGlzLm1vZGlmaWVycyA9IGtleVtsYXN0LTFdICsgKGtleVtsYXN0XTw8MTYpOworCQl9IGVsc2UgeworCQkJdGhpcy5tb2RpZmllcnMgPSBDbGFzc0ZpbGVDb25zdGFudHMuQWNjUHVibGljOworCQl9CisJfQorCQorCXJlbW92ZUludGVybmFsRmxhZ3MoKTsgLy8gcmVtb3ZlIGludGVybmFsIGZsYWdzCit9CisKK3B1YmxpYyBTZWFyY2hQYXR0ZXJuIGdldEJsYW5rUGF0dGVybigpIHsKKwlyZXR1cm4gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuKFJfRVhBQ1RfTUFUQ0ggfCBSX0NBU0VfU0VOU0lUSVZFKTsKK30KK3B1YmxpYyBjaGFyW11bXSBnZXRJbmRleENhdGVnb3JpZXMoKSB7CisJcmV0dXJuIERFQ0xfQ0FURUdPUklFUzsKK30KK3B1YmxpYyBib29sZWFuIG1hdGNoZXNEZWNvZGVkS2V5KFNlYXJjaFBhdHRlcm4gZGVjb2RlZFBhdHRlcm4pIHsKKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybiBwYXR0ZXJuID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuKSBkZWNvZGVkUGF0dGVybjsKKwkKKwkvLyBvbmx5IHRvcCBsZXZlbCB0eXBlcworCWlmICgocGF0dGVybi5leHRyYUZsYWdzICYgRXh0cmFGbGFncy5Jc01lbWJlclR5cGUpICE9IDApIHJldHVybiBmYWxzZTsKKwkKKwkvLyBjaGVjayBwYWNrYWdlIC0gZXhhY3QgbWF0Y2ggb25seQorCWlmICh0aGlzLmRlY2xhcmluZ1BhY2thZ2VOYW1lICE9IG51bGwgJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZGVjbGFyaW5nUGFja2FnZU5hbWUsIHBhdHRlcm4uZGVjbGFyaW5nUGFja2FnZU5hbWUsIHRydWUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gKHRoaXMucGFyYW1ldGVyQ291bnQgPT0gcGF0dGVybi5wYXJhbWV0ZXJDb3VudCB8fCB0aGlzLnBhcmFtZXRlckNvdW50ID09IC0xIHx8IHRoaXMudmFyYXJncykKKwkJJiYgbWF0Y2hlc05hbWUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCBwYXR0ZXJuLmRlY2xhcmluZ1NpbXBsZU5hbWUpOworfQorcHJpdmF0ZSB2b2lkIHJlbW92ZUludGVybmFsRmxhZ3MoKSB7CisJdGhpcy5leHRyYUZsYWdzID0gdGhpcy5leHRyYUZsYWdzICYgfkV4dHJhRmxhZ3MuUGFyYW1ldGVyVHlwZXNTdG9yZWRBc1NpZ25hdHVyZTsgLy8gUGFyYW1ldGVyVHlwZXNTdG9yZWRBc1NpZ25hdHVyZSBpcyBhbiBpbnRlcm5hbCBmbGFncyBvbmx5IHVzZWQgdG8gZGVjb2RlIGtleQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckxvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JMb2NhdG9yLmphdmEKaW5kZXggYTBiZDc2MS4uYmNjMGRkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckxvY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4LDcgKzM4LDcgQEAKIAogCWlmICghbWF0Y2hQYXJhbWV0ZXJzQ291bnQobm9kZSwgKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbm9kZSkuYXJndW1lbnRzKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAKLQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CiB9CiBwdWJsaWMgaW50IG1hdGNoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKIAlpbnQgcmVmZXJlbmNlc0xldmVsID0gdGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzID8gbWF0Y2hMZXZlbEZvclJlZmVyZW5jZXMobm9kZSkgOiBJTVBPU1NJQkxFX01BVENIOwpAQCAtNTgsNyArNTgsNyBAQAogCiAJaWYgKCFtYXRjaFBhcmFtZXRlcnNDb3VudChub2RlLCBhbGxvY2F0aW9uLmFyZ3VtZW50cykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCi0JcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOworCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogfQogcHVibGljIGludCBtYXRjaChGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgewogCWlmICghdGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKQEAgLTczLDcgKzczLDcgQEAKIAogCWlmICghbWF0Y2hQYXJhbWV0ZXJzQ291bnQoZmllbGQsIGFsbG9jYXRpb24uYXJndW1lbnRzKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAKLQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChmaWVsZCwgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOworCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKGZpZWxkLCB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKIH0KIC8vcHVibGljIGludCBtYXRjaChNZXRob2REZWNsYXJhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgLSBTS0lQIElUCiAvKioKQEAgLTgzLDcgKzgzLDcgQEAKIHB1YmxpYyBpbnQgbWF0Y2goTWVzc2FnZVNlbmQgbXNnU2VuZCwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpICB7CiAJaWYgKChtc2dTZW5kLmJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpID09IDApIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCWlmICh0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSA9PSBudWxsIHx8IENoYXJPcGVyYXRpb24uZXF1YWxzKG1zZ1NlbmQuc2VsZWN0b3IsIHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lKSkgewotCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChtc2dTZW5kLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG1zZ1NlbmQsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogCX0KIAlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIH0KQEAgLTkyLDcgKzkyLDcgQEAKIAlpZiAoIXRoaXMucGF0dGVybi5maW5kUmVmZXJlbmNlcykgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAKIAkvLyBuZWVkIHRvIGxvb2sgZm9yIGEgZ2VuZXJhdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKLQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CiB9CiAvL3B1YmxpYyBpbnQgbWF0Y2goVHlwZVJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgLSBTS0lQIElUCiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCAhPSBhcmdzTGVuZ3RoKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIAl9Ci0JcmV0dXJuICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCXJldHVybiB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOwogfQogcHJvdGVjdGVkIGludCBtYXRjaExldmVsRm9yRGVjbGFyYXRpb25zKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IpIHsKIAkvLyBjb25zdHJ1Y3RvciBuYW1lIGlzIHN0b3JlZCBpbiBzZWxlY3RvciBmaWVsZApAQCAtMTY1LDcgKzE2NSw3IEBACiAJCWlmIChjb25zdHJ1Y3Rvci50eXBlUGFyYW1ldGVycyA9PSBudWxsIHx8IGNvbnN0cnVjdG9yLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0aGlzLnBhdHRlcm4uY29uc3RydWN0b3JBcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIAl9CiAKLQlyZXR1cm4gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJcmV0dXJuIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CiB9CiBib29sZWFuIG1hdGNoUGFyYW1ldGVyc0NvdW50KEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbltdIGFyZ3MpIHsKIAlpZiAodGhpcy5wYXR0ZXJuLnBhcmFtZXRlclNpbXBsZU5hbWVzICE9IG51bGwgJiYgKCF0aGlzLnBhdHRlcm4udmFyYXJncyB8fCAoKG5vZGUuYml0cyAmIEFTVE5vZGUuSW5zaWRlSmF2YWRvYykgIT0gMCkpKSB7CkBAIC0xOTEsMTcgKzE5MSwxNyBAQAogCQljb25zdHJ1Y3RvckJpbmRpbmcgPSBhbGxvYy5iaW5kaW5nOwogCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uIHx8IHJlZmVyZW5jZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKIAkJc3VwZXIubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGxvY2F0b3IpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgcmV0dXJuOworCQlpZiAodGhpcy5tYXRjaCAhPSBudWxsKSByZXR1cm47CiAJfQogCiAJLy8gQ3JlYXRlIHNlYXJjaCBtYXRjaAotCW1hdGNoID0gbG9jYXRvci5uZXdNZXRob2RSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIC0xLCAtMSwgdHJ1ZSwgaXNTeW50aGV0aWMsIHJlZmVyZW5jZSk7CisJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCAtMSwgLTEsIHRydWUsIGlzU3ludGhldGljLCByZWZlcmVuY2UpOwogCiAJLy8gTG9vayB0byByZWZpbmUgYWNjdXJhY3kKIAlpZiAoY29uc3RydWN0b3JCaW5kaW5nIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSB7IC8vIHBhcmFtZXRlcml6ZWQgZ2VuZXJpYyBtZXRob2QKIAkJLy8gVXBkYXRlIG1hdGNoIHJlZ2FyZGluZyBjb25zdHJ1Y3RvciB0eXBlIGFyZ3VtZW50cwogCQlQYXJhbWV0ZXJpemVkR2VuZXJpY01ldGhvZEJpbmRpbmcgcGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nKSBjb25zdHJ1Y3RvckJpbmRpbmc7Ci0JCW1hdGNoLnNldFJhdyhwYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5pc1Jhdyk7CisJCXRoaXMubWF0Y2guc2V0UmF3KHBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nLmlzUmF3KTsKIAkJVHlwZUJpbmRpbmdbXSB0eXBlQmluZGluZ3MgPSBwYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy5pc1JhdyA/IG51bGwgOiBwYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZy50eXBlQXJndW1lbnRzOwogCQl1cGRhdGVNYXRjaCh0eXBlQmluZGluZ3MsIGxvY2F0b3IsIHRoaXMucGF0dGVybi5jb25zdHJ1Y3RvckFyZ3VtZW50cywgdGhpcy5wYXR0ZXJuLmhhc0NvbnN0cnVjdG9yUGFyYW1ldGVycygpKTsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJCQkJdXBkYXRlTWF0Y2gocGFyYW1ldGVyaXplZEJpbmRpbmcsIHRoaXMucGF0dGVybi5nZXRUeXBlQXJndW1lbnRzKCksIHRoaXMucGF0dGVybi5oYXNUeXBlUGFyYW1ldGVycygpLCAwLCBsb2NhdG9yKTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4uaGFzVHlwZUFyZ3VtZW50cygpKSB7Ci0JCQltYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKKwkJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJCX0KIAogCQkvLyBVcGRhdGUgbWF0Y2ggcmVnYXJkaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMKQEAgLTIzNSwzNSArMjM1LDM1IEBACiAJCQkJdXBkYXRlTWF0Y2gocGFyYW1ldGVyaXplZEJpbmRpbmcsIHRoaXMucGF0dGVybi5nZXRUeXBlQXJndW1lbnRzKCksIHRoaXMucGF0dGVybi5oYXNUeXBlUGFyYW1ldGVycygpLCAwLCBsb2NhdG9yKTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4uaGFzVHlwZUFyZ3VtZW50cygpKSB7Ci0JCQltYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKKwkJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJCX0KIAogCQkvLyBVcGRhdGUgbWF0Y2ggcmVnYXJkaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMKIAkJLy8gVE9ETyA/IChmcmVkZXJpYykKIAl9IGVsc2UgaWYgKHRoaXMucGF0dGVybi5oYXNDb25zdHJ1Y3RvckFyZ3VtZW50cygpKSB7IC8vIGJpbmRpbmcgaGFzIG5vIHR5cGUgcGFyYW1zLCBjb21wYXRpYmxlIGVyYXN1cmUgaWYgcGF0dGVybiBkb2VzCi0JCW1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOworCQl0aGlzLm1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOwogCX0KIAogCS8vIFNlZSB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byByZXBvcnQgb3Igbm90Ci0JaWYgKG1hdGNoLmdldFJ1bGUoKSA9PSAwKSByZXR1cm47IC8vIGltcG9zc2libGUgbWF0Y2gKLQlib29sZWFuIHJlcG9ydCA9ICh0aGlzLmlzRXJhc3VyZU1hdGNoICYmIG1hdGNoLmlzRXJhc3VyZSgpKSB8fCAodGhpcy5pc0VxdWl2YWxlbnRNYXRjaCAmJiBtYXRjaC5pc0VxdWl2YWxlbnQoKSkgfHwgbWF0Y2guaXNFeGFjdCgpOworCWlmICh0aGlzLm1hdGNoLmdldFJ1bGUoKSA9PSAwKSByZXR1cm47IC8vIGltcG9zc2libGUgbWF0Y2gKKwlib29sZWFuIHJlcG9ydCA9ICh0aGlzLmlzRXJhc3VyZU1hdGNoICYmIHRoaXMubWF0Y2guaXNFcmFzdXJlKCkpIHx8ICh0aGlzLmlzRXF1aXZhbGVudE1hdGNoICYmIHRoaXMubWF0Y2guaXNFcXVpdmFsZW50KCkpIHx8IHRoaXMubWF0Y2guaXNFeGFjdCgpOwogCWlmICghcmVwb3J0KSByZXR1cm47CiAKIAkvLyBSZXBvcnQgbWF0Y2gKIAlpbnQgb2Zmc2V0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OwotCW1hdGNoLnNldE9mZnNldChvZmZzZXQpOwotCW1hdGNoLnNldExlbmd0aChyZWZlcmVuY2Uuc291cmNlRW5kIC0gb2Zmc2V0ICsgMSk7CisJdGhpcy5tYXRjaC5zZXRPZmZzZXQob2Zmc2V0KTsKKwl0aGlzLm1hdGNoLnNldExlbmd0aChyZWZlcmVuY2Uuc291cmNlRW5kIC0gb2Zmc2V0ICsgMSk7CiAJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsgLy8gZW51bSBkZWNsYXJhdGlvbgogCQlGaWVsZERlY2xhcmF0aW9uIGVudW1Db25zdGFudCAgPSAoRmllbGREZWNsYXJhdGlvbikgcmVmZXJlbmNlOwogCQlpZiAoZW51bUNvbnN0YW50LmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLQkJCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVFbnVtQ29uc3RydWN0b3JSZWZlcmVuY2UobWF0Y2gsIGVudW1Db25zdGFudCwgKFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSBlbnVtQ29uc3RhbnQuaW5pdGlhbGl6YXRpb24pOworCQkJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZUVudW1Db25zdHJ1Y3RvclJlZmVyZW5jZSh0aGlzLm1hdGNoLCBlbnVtQ29uc3RhbnQsIChRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgZW51bUNvbnN0YW50LmluaXRpYWxpemF0aW9uKTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJbG9jYXRvci5yZXBvcnQodGhpcy5tYXRjaCk7CiB9CiBwdWJsaWMgU2VhcmNoTWF0Y2ggbmV3RGVjbGFyYXRpb25NYXRjaChBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgYmluZGluZywgaW50IGFjY3VyYWN5LCBpbnQgbGVuZ3RoLCBNYXRjaExvY2F0b3IgbG9jYXRvcikgewotCW1hdGNoID0gbnVsbDsKKwl0aGlzLm1hdGNoID0gbnVsbDsKIAlpbnQgb2Zmc2V0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OwogCWlmICh0aGlzLnBhdHRlcm4uZmluZFJlZmVyZW5jZXMpIHsKIAkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewpAQCAtMjczLDE4ICsyNzMsMTggQEAKIAkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CiAJCQkJCWJvb2xlYW4gc3ludGhldGljID0gbWV0aG9kLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkgJiYgbWV0aG9kLnNvdXJjZVN0YXJ0IDwgdHlwZS5ib2R5U3RhcnQ7Ci0JCQkJCW1hdGNoID0gbG9jYXRvci5uZXdNZXRob2RSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBiaW5kaW5nLCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIG1ldGhvZC5pc0NvbnN0cnVjdG9yKCksIHN5bnRoZXRpYywgbWV0aG9kKTsKKwkJCQkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBtZXRob2QuaXNDb25zdHJ1Y3RvcigpLCBzeW50aGV0aWMsIG1ldGhvZCk7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKIAkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgcmVmZXJlbmNlOwogCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCA9IGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbDsKIAkJCWJvb2xlYW4gc3ludGhldGljID0gY2FsbCAhPSBudWxsICYmIGNhbGwuaXNJbXBsaWNpdFN1cGVyKCk7Ci0JCQltYXRjaCA9IGxvY2F0b3IubmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBjb25zdHJ1Y3Rvci5pc0NvbnN0cnVjdG9yKCksIHN5bnRoZXRpYywgY29uc3RydWN0b3IpOworCQkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBjb25zdHJ1Y3Rvci5pc0NvbnN0cnVjdG9yKCksIHN5bnRoZXRpYywgY29uc3RydWN0b3IpOwogCQl9CiAJfQotCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCXJldHVybiBtYXRjaDsKKwlpZiAodGhpcy5tYXRjaCAhPSBudWxsKSB7CisJCXJldHVybiB0aGlzLm1hdGNoOwogCX0KIAkvLyBzdXBlciBpbXBsZW1lbnRhdGlvbi4uLgogICAgIHJldHVybiBsb2NhdG9yLm5ld0RlY2xhcmF0aW9uTWF0Y2goZWxlbWVudCwgYmluZGluZywgYWNjdXJhY3ksIHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgbGVuZ3RoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yUGF0dGVybi5qYXZhCmluZGV4IGFlMWVkNzguLjExOTIzMTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvclBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNywxNSArMTcsMTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRXh0cmFGbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguRW50cnlSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JQYXR0ZXJuIGV4dGVuZHMgSmF2YVNlYXJjaFBhdHRlcm4gewogCi1wcm90ZWN0ZWQgYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zOwotcHJvdGVjdGVkIGJvb2xlYW4gZmluZFJlZmVyZW5jZXM7Citwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zID0gdHJ1ZTsKK3Byb3RlY3RlZCBib29sZWFuIGZpbmRSZWZlcmVuY2VzID0gdHJ1ZTsKIAogcHVibGljIGNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uOwogcHVibGljIGNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lOwpAQCAtNDUsNiArNDgsMTY1IEBACiBwcm90ZWN0ZWQgc3RhdGljIGNoYXJbXVtdIFJFRl9BTkRfREVDTF9DQVRFR09SSUVTID0geyBDT05TVFJVQ1RPUl9SRUYsIENPTlNUUlVDVE9SX0RFQ0wgfTsKIHByb3RlY3RlZCBzdGF0aWMgY2hhcltdW10gREVDTF9DQVRFR09SSUVTID0geyBDT05TVFJVQ1RPUl9ERUNMIH07CiAKK3B1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJTkVfR1JBSU5fTUFTSyA9CisJSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJfUkVGRVJFTkNFIHwKKwlJSmF2YVNlYXJjaENvbnN0YW50cy5RVUFMSUZJRURfUkVGRVJFTkNFIHwKKwlJSmF2YVNlYXJjaENvbnN0YW50cy5USElTX1JFRkVSRU5DRSB8CisJSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTElDSVRfVEhJU19SRUZFUkVOQ0U7CisKKworLyoqCisgKiBDb25zdHJ1Y3RvciBlbnRyaWVzIGFyZSBlbmNvZGVkIGFzIGRlc2NyaWJlZAorICogCisgKiBCaW5hcnkgY29uc3RydWN0b3IgZm9yIGNsYXNzCisgKiBUeXBlTmFtZSAnLycgQXJpdHkgJy8nIFR5cGVNb2RpZmVycyAnLycgUGFja2FnZU5hbWUgJy8nIFNpZ25hdHVyZSAnLycgUGFyYW1ldGVyTmFtZXNvcHQgJy8nIE1vZGlmaWVycworICogU291cmNlIGNvbnN0cnVjdG9yIGZvciBjbGFzcworICogVHlwZU5hbWUgJy8nIEFyaXR5ICcvJyBUeXBlTW9kaWZlcnMgJy8nIFBhY2thZ2VOYW1lICcvJyBQYXJhbWV0ZXJUeXBlcyAnLycgUGFyYW1ldGVyTmFtZXNvcHQgJy8nIE1vZGlmaWVycworICogQ29uc3RydWN0b3Igd2l0aCAwIGFyaXR5IGZvciBjbGFzcworICogVHlwZU5hbWUgJy8nIDAgJy8nIFR5cGVNb2RpZmVycyAnLycgUGFja2FnZU5hbWUgJy8nIE1vZGlmaWVycworICogQ29uc3RydWN0b3IgZm9yIGVudW0sIGludGVyZmFjZSAoYW5ub3RhdGlvbikgYW5kIGNsYXNzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogVHlwZU5hbWUgJy8nICMgJy8nIFR5cGVNb2RpZmVycyAnLycgUGFja2FnZU5hbWUKKyAqIENvbnN0cnVjdG9yIGZvciBtZW1iZXIgdHlwZQorICogVHlwZU5hbWUgJy8nIEFyaXR5ICcvJyBUeXBlTW9kaWZlcnMKKyAqIAorICogVHlwZU1vZGlmaWVycyBjb250YWlucyBzb21lIGVuY29kZWQgZXh0cmEgaW5mb3JtYXRpb24KKyAqIAkJe0BsaW5rIEV4dHJhRmxhZ3MjSXNNZW1iZXJUeXBlfQorICogCQl7QGxpbmsgRXh0cmFGbGFncyNIYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXN9CisgKiAJCXtAbGluayBFeHRyYUZsYWdzI1BhcmFtZXRlclR5cGVzU3RvcmVkQXNTaWduYXR1cmV9CisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZURlY2xhcmF0aW9uSW5kZXhLZXkoCisJCWNoYXJbXSB0eXBlTmFtZSwKKwkJaW50IGFyZ0NvdW50LAorCQljaGFyW10gc2lnbmF0dXJlLAorCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCWludCBtb2RpZmllcnMsCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJaW50IHR5cGVNb2RpZmllcnMsCisJCWludCBleHRyYUZsYWdzKSB7CisJCisJY2hhcltdIGNvdW50Q2hhcnM7CisJY2hhcltdIHBhcmFtZXRlclR5cGVzQ2hhcnMgPSBudWxsOworCWNoYXJbXSBwYXJhbWV0ZXJOYW1lc0NoYXJzID0gbnVsbDsKKwkKKwlpZiAoYXJnQ291bnQgPCAwKSB7CisJCWNvdW50Q2hhcnMgPSBERUZBVUxUX0NPTlNUUlVDVE9SOworCX0gZWxzZSB7CisJCWNvdW50Q2hhcnMgPSBhcmdDb3VudCA8IDEwCisJCT8gQ09VTlRTW2FyZ0NvdW50XQorCQk6ICgiLyIgKyBTdHJpbmcudmFsdWVPZihhcmdDb3VudCkpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWlmIChhcmdDb3VudCA+IDApIHsKKwkJCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgeworCQkJCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsICYmIHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSBhcmdDb3VudCkgeworCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlRXJhc3VyZXMgPSBuZXcgY2hhclthcmdDb3VudF1bXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJcGFyYW1ldGVyVHlwZUVyYXN1cmVzW2ldID0gZ2V0VHlwZUVyYXN1cmUocGFyYW1ldGVyVHlwZXNbaV0pOworCQkJCQl9CisJCQkJCXBhcmFtZXRlclR5cGVzQ2hhcnMgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFyYW1ldGVyVHlwZUVyYXN1cmVzLCBQQVJBTUVURVJfU0VQQVJBVE9SKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5QYXJhbWV0ZXJUeXBlc1N0b3JlZEFzU2lnbmF0dXJlOworCQkJfQorCQkJCisJCQlpZiAocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJOYW1lcy5sZW5ndGggPT0gYXJnQ291bnQpIHsKKwkJCQlwYXJhbWV0ZXJOYW1lc0NoYXJzID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhcmFtZXRlck5hbWVzLCBQQVJBTUVURVJfU0VQQVJBVE9SKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlib29sZWFuIGlzTWVtYmVyVHlwZSA9IChleHRyYUZsYWdzICYgRXh0cmFGbGFncy5Jc01lbWJlclR5cGUpICE9IDA7CisJCisJaW50IHR5cGVOYW1lTGVuZ3RoID0gdHlwZU5hbWUgPT0gbnVsbCA/IDAgOiB0eXBlTmFtZS5sZW5ndGg7CisJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gcGFja2FnZU5hbWUgPT0gbnVsbCA/IDAgOiBwYWNrYWdlTmFtZS5sZW5ndGg7CisJaW50IGNvdW50Q2hhcnNMZW5ndGggPSBjb3VudENoYXJzLmxlbmd0aDsKKwlpbnQgcGFyYW1ldGVyVHlwZXNMZW5ndGggPSBzaWduYXR1cmUgPT0gbnVsbCA/IChwYXJhbWV0ZXJUeXBlc0NoYXJzID09IG51bGwgPyAwIDogcGFyYW1ldGVyVHlwZXNDaGFycy5sZW5ndGgpOiBzaWduYXR1cmUubGVuZ3RoOworCWludCBwYXJhbWV0ZXJOYW1lc0xlbmd0aCA9IHBhcmFtZXRlck5hbWVzQ2hhcnMgPT0gbnVsbCA/IDAgOiBwYXJhbWV0ZXJOYW1lc0NoYXJzLmxlbmd0aDsKKwkKKwlpbnQgcmVzdWx0TGVuZ3RoID0gdHlwZU5hbWVMZW5ndGggKyBjb3VudENoYXJzTGVuZ3RoICsgMzsgLy8gU0VQQVJBVE9SPTEgKyBUeXBlTW9kaWZlcnM9MgorCWlmICghaXNNZW1iZXJUeXBlKSB7CisJCXJlc3VsdExlbmd0aCArPSBwYWNrYWdlTmFtZUxlbmd0aCArIDE7IC8vIFNFUEFSQVRPUj0xCisJCWlmIChhcmdDb3VudCA+PSAwKSB7CisJCQlyZXN1bHRMZW5ndGggKz0gMzsgLy8gU0VQQVJBVE9SPTEgKyBNb2RpZmllcnM9MgorCQl9CisJCQorCQlpZiAoYXJnQ291bnQgPiAwKSB7CisJCQlyZXN1bHRMZW5ndGggKz0gcGFyYW1ldGVyVHlwZXNMZW5ndGggKyBwYXJhbWV0ZXJOYW1lc0xlbmd0aCArIDI7IC8vU0VQQVJBVE9SPTEgKyBTRVBBUkFUT1I9MQorCQl9CisJfQorCQorCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZXN1bHRMZW5ndGhdOworCQorCWludCBwb3MgPSAwOworCWlmICh0eXBlTmFtZUxlbmd0aCA+IDApIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZSwgMCwgcmVzdWx0LCBwb3MsIHR5cGVOYW1lTGVuZ3RoKTsKKwkJcG9zICs9IHR5cGVOYW1lTGVuZ3RoOworCX0KKwkKKwlpZiAoY291bnRDaGFyc0xlbmd0aCA+IDApIHsKKwkJU3lzdGVtLmFycmF5Y29weShjb3VudENoYXJzLCAwLCByZXN1bHQsIHBvcywgY291bnRDaGFyc0xlbmd0aCk7CisJCXBvcyArPSBjb3VudENoYXJzTGVuZ3RoOworCX0KKwkKKwlpbnQgdHlwZU1vZGlmaWVyc1dpdGhFeHRyYUZsYWdzID0gdHlwZU1vZGlmaWVycyB8IGVuY29kZUV4dHJhRmxhZ3MoZXh0cmFGbGFncyk7CisJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwlyZXN1bHRbcG9zKytdID0gKGNoYXIpIHR5cGVNb2RpZmllcnNXaXRoRXh0cmFGbGFnczsKKwlyZXN1bHRbcG9zKytdID0gKGNoYXIpICh0eXBlTW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3M+PjE2KTsKKwkKKwlpZiAoIWlzTWVtYmVyVHlwZSkgeworCQlyZXN1bHRbcG9zKytdID0gU0VQQVJBVE9SOworCQlpZiAocGFja2FnZU5hbWVMZW5ndGggPiAwKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHBhY2thZ2VOYW1lLCAwLCByZXN1bHQsIHBvcywgcGFja2FnZU5hbWVMZW5ndGgpOworCQkJcG9zICs9IHBhY2thZ2VOYW1lTGVuZ3RoOworCQl9CisJCQorCQlpZiAoYXJnQ291bnQgPT0gMCkgeworCQkJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwkJCXJlc3VsdFtwb3MrK10gPSAoY2hhcikgbW9kaWZpZXJzOworCQkJcmVzdWx0W3BvcysrXSA9IChjaGFyKSAobW9kaWZpZXJzPj4xNik7CisJCX0gZWxzZSBpZiAoYXJnQ291bnQgPiAwKSB7CisJCQlyZXN1bHRbcG9zKytdID0gU0VQQVJBVE9SOworCQkJaWYgKHBhcmFtZXRlclR5cGVzTGVuZ3RoID4gMCkgeworCQkJCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzQ2hhcnMsIDAsIHJlc3VsdCwgcG9zLCBwYXJhbWV0ZXJUeXBlc0xlbmd0aCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShDaGFyT3BlcmF0aW9uLnJlcGxhY2VPbkNvcHkoc2lnbmF0dXJlLCBTRVBBUkFUT1IsICdcXCcpLCAwLCByZXN1bHQsIHBvcywgcGFyYW1ldGVyVHlwZXNMZW5ndGgpOworCQkJCX0KKwkJCQlwb3MgKz0gcGFyYW1ldGVyVHlwZXNMZW5ndGg7CisJCQl9CisJCQkKKwkJCXJlc3VsdFtwb3MrK10gPSBTRVBBUkFUT1I7CisJCQlpZiAocGFyYW1ldGVyTmFtZXNMZW5ndGggPiAwKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJOYW1lc0NoYXJzLCAwLCByZXN1bHQsIHBvcywgcGFyYW1ldGVyTmFtZXNMZW5ndGgpOworCQkJCXBvcyArPSBwYXJhbWV0ZXJOYW1lc0xlbmd0aDsKKwkJCX0KKwkJCQorCQkJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwkJCXJlc3VsdFtwb3MrK10gPSAoY2hhcikgbW9kaWZpZXJzOworCQkJcmVzdWx0W3BvcysrXSA9IChjaGFyKSAobW9kaWZpZXJzPj4xNik7CisJCX0KKwkJCisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVEZWZhdWx0RGVjbGFyYXRpb25JbmRleEtleSgKKwkJY2hhcltdIHR5cGVOYW1lLAorCQljaGFyW10gcGFja2FnZU5hbWUsCisJCWludCB0eXBlTW9kaWZpZXJzLAorCQlpbnQgZXh0cmFGbGFncykgeworCXJldHVybiBjcmVhdGVEZWNsYXJhdGlvbkluZGV4S2V5KAorCQkJdHlwZU5hbWUsCisJCQktMSwgLy8gdXNlZCB0byBpZGVudGlmeSBkZWZhdWx0IGNvbnN0cnVjdG9yCisJCQludWxsLAorCQkJbnVsbCwKKwkJCW51bGwsCisJCQkwLCAvLworCQkJcGFja2FnZU5hbWUsCisJCQl0eXBlTW9kaWZpZXJzLAorCQkJZXh0cmFGbGFncyk7Cit9CisKIC8qKgogICogQ29uc3RydWN0b3IgZW50cmllcyBhcmUgZW5jb2RlZCBhcyBUeXBlTmFtZSAnLycgQXJpdHk6CiAgKiBlLmcuICdYLzAnCkBAIC01NSwyNiArMjE3LDExMCBAQAogCQk6ICgiLyIgKyBTdHJpbmcudmFsdWVPZihhcmdDb3VudCkpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsIGNvdW50Q2hhcnMpOwogfQotCitzdGF0aWMgaW50IGRlY29kZUV4dHJhRmxhZ3MoaW50IG1vZGlmaWVyc1dpdGhFeHRyYUZsYWdzKSB7CisJaW50IGV4dHJhRmxhZ3MgPSAwOworCQorCWlmICgobW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3MgJiBBU1ROb2RlLkJpdDI4KSAhPSAwKSB7CisJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5QYXJhbWV0ZXJUeXBlc1N0b3JlZEFzU2lnbmF0dXJlOworCX0KKwkKKwlpZiAoKG1vZGlmaWVyc1dpdGhFeHRyYUZsYWdzICYgQVNUTm9kZS5CaXQyOSkgIT0gMCkgeworCQlleHRyYUZsYWdzIHw9IEV4dHJhRmxhZ3MuSXNMb2NhbFR5cGU7CisJfQorCQorCWlmICgobW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3MgJiBBU1ROb2RlLkJpdDMwKSAhPSAwKSB7CisJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5Jc01lbWJlclR5cGU7CisJfQorCQorCWlmICgobW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3MgJiBBU1ROb2RlLkJpdDMxKSAhPSAwKSB7CisJCWV4dHJhRmxhZ3MgfD0gRXh0cmFGbGFncy5IYXNOb25Qcml2YXRlU3RhdGljTWVtYmVyVHlwZXM7CisJfQorCQorCXJldHVybiBleHRyYUZsYWdzOworfQorc3RhdGljIGludCBkZWNvZGVNb2RpZmVycyhpbnQgbW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3MpIHsKKwlyZXR1cm4gbW9kaWZpZXJzV2l0aEV4dHJhRmxhZ3MgJiB+KEFTVE5vZGUuQml0MzEgfCBBU1ROb2RlLkJpdDMwIHwgQVNUTm9kZS5CaXQyOSB8IEFTVE5vZGUuQml0MjgpOworfQorcHJpdmF0ZSBzdGF0aWMgaW50IGVuY29kZUV4dHJhRmxhZ3MoaW50IGV4dHJhRmxhZ3MpIHsKKwlpbnQgZW5jb2RlZEV4dHJhRmxhZ3MgPSAwOworCQorCWlmICgoZXh0cmFGbGFncyAmIEV4dHJhRmxhZ3MuUGFyYW1ldGVyVHlwZXNTdG9yZWRBc1NpZ25hdHVyZSkgIT0gMCkgeworCQllbmNvZGVkRXh0cmFGbGFncyB8PSBBU1ROb2RlLkJpdDI4OworCX0KKwkKKwlpZiAoKGV4dHJhRmxhZ3MgJiBFeHRyYUZsYWdzLklzTG9jYWxUeXBlKSAhPSAwKSB7CisJCWVuY29kZWRFeHRyYUZsYWdzIHw9IEFTVE5vZGUuQml0Mjk7CisJfQorCQorCWlmICgoZXh0cmFGbGFncyAmIEV4dHJhRmxhZ3MuSXNNZW1iZXJUeXBlKSAhPSAwKSB7CisJCWVuY29kZWRFeHRyYUZsYWdzIHw9IEFTVE5vZGUuQml0MzA7CisJfQorCWlmICgoZXh0cmFGbGFncyAmIEV4dHJhRmxhZ3MuSGFzTm9uUHJpdmF0ZVN0YXRpY01lbWJlclR5cGVzKSAhPSAwKSB7CisJCWVuY29kZWRFeHRyYUZsYWdzIHw9IEFTVE5vZGUuQml0MzE7CisJfQorCQorCXJldHVybiBlbmNvZGVkRXh0cmFGbGFnczsKK30KK3ByaXZhdGUgc3RhdGljIGNoYXJbXSBnZXRUeXBlRXJhc3VyZShjaGFyW10gdHlwZU5hbWUpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignPCcsIHR5cGVOYW1lKSkgPT0gLTEpIHJldHVybiB0eXBlTmFtZTsKKwkKKwlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCWNoYXJbXSB0eXBlRXJhc3VyZW5hbWUgPSBuZXcgY2hhcltsZW5ndGggLSAyXTsKKwkKKwlTeXN0ZW0uYXJyYXljb3B5KHR5cGVOYW1lLCAwLCB0eXBlRXJhc3VyZW5hbWUsIDAsIGluZGV4KTsKKwkKKwlpbnQgZGVwdGggPSAxOworCWZvciAoaW50IGkgPSBpbmRleCArIDE7IGkgPCBsZW5ndGg7IGkrKykgeworCQlzd2l0Y2ggKHR5cGVOYW1lW2ldKSB7CisJCQljYXNlICc8JzoKKwkJCQlkZXB0aCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnPic6CisJCQkJZGVwdGgtLTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKGRlcHRoID09IDApIHsKKwkJCQkJdHlwZUVyYXN1cmVuYW1lW2luZGV4KytdID0gdHlwZU5hbWVbaV07CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCQorCVN5c3RlbS5hcnJheWNvcHkodHlwZUVyYXN1cmVuYW1lLCAwLCB0eXBlRXJhc3VyZW5hbWUgPSBuZXcgY2hhcltpbmRleF0sIDAsIGluZGV4KTsKKwlyZXR1cm4gdHlwZUVyYXN1cmVuYW1lOworfQogQ29uc3RydWN0b3JQYXR0ZXJuKGludCBtYXRjaFJ1bGUpIHsKIAlzdXBlcihDT05TVFJVQ1RPUl9QQVRURVJOLCBtYXRjaFJ1bGUpOwogfQogcHVibGljIENvbnN0cnVjdG9yUGF0dGVybigKLQlib29sZWFuIGZpbmREZWNsYXJhdGlvbnMsCi0JYm9vbGVhbiBmaW5kUmVmZXJlbmNlcywKIAljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwKIAljaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKIAljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywKIAljaGFyW11bXSBwYXJhbWV0ZXJTaW1wbGVOYW1lcywKKwlpbnQgbGltaXRUbywKIAlpbnQgbWF0Y2hSdWxlKSB7CiAKIAl0aGlzKG1hdGNoUnVsZSk7CiAKLQl0aGlzLmZpbmREZWNsYXJhdGlvbnMgPSBmaW5kRGVjbGFyYXRpb25zOwotCXRoaXMuZmluZFJlZmVyZW5jZXMgPSBmaW5kUmVmZXJlbmNlczsKKwl0aGlzLmZpbmVHcmFpbiA9IGxpbWl0VG8gJiBGSU5FX0dSQUlOX01BU0s7CisgICAgaWYgKHRoaXMuZmluZUdyYWluID09IDApIHsKKwkJc3dpdGNoIChsaW1pdFRvKSB7CisJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQkJdGhpcy5maW5kUmVmZXJlbmNlcyA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKKwkJCQl0aGlzLmZpbmREZWNsYXJhdGlvbnMgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCQlicmVhazsKKwkJfQorICAgIH0gZWxzZSB7CisJCXRoaXMuZmluZERlY2xhcmF0aW9ucyA9IGZhbHNlOworICAgIH0KIAotCXRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7Ci0JdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gKGlzQ2FzZVNlbnNpdGl2ZSgpIHx8IGlzQ2FtZWxDYXNlKCkpID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPyBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdRdWFsaWZpY2F0aW9uKTsKKwl0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgPSAodGhpcy5pc0Nhc2VTZW5zaXRpdmUgfHwgdGhpcy5pc0NhbWVsQ2FzZSkgPyBkZWNsYXJpbmdTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdTaW1wbGVOYW1lKTsKIAlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgIT0gbnVsbCkgewogCQl0aGlzLnBhcmFtZXRlckNvdW50ID0gcGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOwogCQlib29sZWFuIHN5bnRoZXRpYyA9IHRoaXMucGFyYW1ldGVyQ291bnQ+MCAmJiBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoQ2hhck9wZXJhdGlvbi5jb25jYXQocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbMF0sIHBhcmFtZXRlclNpbXBsZU5hbWVzWzBdLCAnLicpLCBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uKTsKQEAgLTg3LDM1ICszMzMsMzIgQEAKIAkJdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucyA9IG5ldyBjaGFyW3RoaXMucGFyYW1ldGVyQ291bnRdW107CiAJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPSBuZXcgY2hhclt0aGlzLnBhcmFtZXRlckNvdW50XVtdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVyQ291bnQ7IGkrKykgewotCQkJdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaStvZmZzZXRdIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpK29mZnNldF0pOwotCQkJdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gcGFyYW1ldGVyU2ltcGxlTmFtZXNbaStvZmZzZXRdIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpK29mZnNldF0pOworCQkJdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaStvZmZzZXRdIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpK29mZnNldF0pOworCQkJdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gcGFyYW1ldGVyU2ltcGxlTmFtZXNbaStvZmZzZXRdIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpK29mZnNldF0pOwogCQl9CiAJfSBlbHNlIHsKIAkJdGhpcy5wYXJhbWV0ZXJDb3VudCA9IC0xOwogCX0KLQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlKCk7CisJdGhpcy5tdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlKCk7CiB9CiAvKgogICogSW5zdGFuY2lhdGUgYSBtZXRob2QgcGF0dGVybiB3aXRoIHNpZ25hdHVyZXMgZm9yIGdlbmVyaWNzIHNlYXJjaAogICovCiBwdWJsaWMgQ29uc3RydWN0b3JQYXR0ZXJuKAotCWJvb2xlYW4gZmluZERlY2xhcmF0aW9ucywKLQlib29sZWFuIGZpbmRSZWZlcmVuY2VzLAotCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwKIAljaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKLQljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsCiAJY2hhcltdW10gcGFyYW1ldGVyU2ltcGxlTmFtZXMsCiAJU3RyaW5nW10gcGFyYW1ldGVyU2lnbmF0dXJlcywKIAlJTWV0aG9kIG1ldGhvZCwKLS8vCWJvb2xlYW4gdmFyYXJncywKKwlpbnQgbGltaXRUbywKIAlpbnQgbWF0Y2hSdWxlKSB7CiAKLQl0aGlzKGZpbmREZWNsYXJhdGlvbnMsCi0JCWZpbmRSZWZlcmVuY2VzLAotCQlkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwl0aGlzKGRlY2xhcmluZ1NpbXBsZU5hbWUsCiAJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sCi0JCXBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsCiAJCXBhcmFtZXRlclNpbXBsZU5hbWVzLAorCQlsaW1pdFRvLAogCQltYXRjaFJ1bGUpOwogCiAJLy8gU2V0IGZsYWdzCkBAIC0xMjcsMTggKzM3MCwxOSBAQAogCiAJLy8gR2V0IHVuaXF1ZSBrZXkgZm9yIHBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3JzCiAJU3RyaW5nIGdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlID0gbnVsbDsKLQlTdHJpbmcga2V5OwotCWlmIChtZXRob2QuaXNSZXNvbHZlZCgpICYmIG5ldyBCaW5kaW5nS2V5KGtleSA9IG1ldGhvZC5nZXRLZXkoKSkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCWdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlID0gVXRpbC5nZXREZWNsYXJpbmdUeXBlU2lnbmF0dXJlKGtleSk7CisJaWYgKG1ldGhvZC5pc1Jlc29sdmVkKCkpIHsKKwkJU3RyaW5nIGtleSA9IG1ldGhvZC5nZXRLZXkoKTsKKwkJQmluZGluZ0tleSBiaW5kaW5nS2V5ID0gbmV3IEJpbmRpbmdLZXkoa2V5KTsKKwkJaWYgKGJpbmRpbmdLZXkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCQlnZW5lcmljRGVjbGFyaW5nVHlwZVNpZ25hdHVyZSA9IFV0aWwuZ2V0RGVjbGFyaW5nVHlwZVNpZ25hdHVyZShrZXkpOworCQkJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmUgYW5kIGFyZ3VtZW50cyBmb3IgZGVjbGFyaW5nIHR5cGUKKwkJCWlmIChnZW5lcmljRGVjbGFyaW5nVHlwZVNpZ25hdHVyZSAhPSBudWxsKSB7CisJCQkJCXRoaXMudHlwZVNpZ25hdHVyZXMgPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZShnZW5lcmljRGVjbGFyaW5nVHlwZVNpZ25hdHVyZSk7CisJCQkJCXNldFR5cGVBcmd1bWVudHMoVXRpbC5nZXRBbGxUeXBlQXJndW1lbnRzKHRoaXMudHlwZVNpZ25hdHVyZXMpKTsKKwkJCX0KKwkJfQogCX0gZWxzZSB7Ci0JCWNvbnN0cnVjdG9yUGFyYW1ldGVycyA9IHRydWU7Ci0JfQotCi0JLy8gU3RvcmUgdHlwZSBzaWduYXR1cmUgYW5kIGFyZ3VtZW50cyBmb3IgZGVjbGFyaW5nIHR5cGUKLQlpZiAoZ2VuZXJpY0RlY2xhcmluZ1R5cGVTaWduYXR1cmUgIT0gbnVsbCkgewotCQl0aGlzLnR5cGVTaWduYXR1cmVzID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUoZ2VuZXJpY0RlY2xhcmluZ1R5cGVTaWduYXR1cmUpOwotCQlzZXRUeXBlQXJndW1lbnRzKFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyh0aGlzLnR5cGVTaWduYXR1cmVzKSk7Ci0JfSBlbHNlIHsKKwkJdGhpcy5jb25zdHJ1Y3RvclBhcmFtZXRlcnMgPSB0cnVlOwogCQlzdG9yZVR5cGVTaWduYXR1cmVzQW5kQXJndW1lbnRzKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwogCX0KIApAQCAtMTQ2LDg1ICszOTAsOTMgQEAKIAlpZiAocGFyYW1ldGVyU2lnbmF0dXJlcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJTaWduYXR1cmVzLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCXBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOwotCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOworCQkJdGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXMgPSBuZXcgY2hhcltsZW5ndGhdW11bXTsKKwkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOwogCQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUocGFyYW1ldGVyU2lnbmF0dXJlc1tpXSk7Ci0JCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHMocGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldKTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlc1tpXSA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKHBhcmFtZXRlclNpZ25hdHVyZXNbaV0pOworCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXNbaV0pOwogCQkJfQogCQl9CiAJfQogCiAJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMgZm9yIG1ldGhvZAotCWNvbnN0cnVjdG9yQXJndW1lbnRzID0gZXh0cmFjdE1ldGhvZEFyZ3VtZW50cyhtZXRob2QpOwotCWlmIChoYXNDb25zdHJ1Y3RvckFyZ3VtZW50cygpKSAgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcykubXVzdFJlc29sdmUgPSB0cnVlOworCXRoaXMuY29uc3RydWN0b3JBcmd1bWVudHMgPSBleHRyYWN0TWV0aG9kQXJndW1lbnRzKG1ldGhvZCk7CisJaWYgKGhhc0NvbnN0cnVjdG9yQXJndW1lbnRzKCkpICB0aGlzLm11c3RSZXNvbHZlID0gdHJ1ZTsKIH0KIC8qCiAgKiBJbnN0YW5jaWF0ZSBhIG1ldGhvZCBwYXR0ZXJuIHdpdGggc2lnbmF0dXJlcyBmb3IgZ2VuZXJpY3Mgc2VhcmNoCiAgKi8KIHB1YmxpYyBDb25zdHJ1Y3RvclBhdHRlcm4oCi0JYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zLAotCWJvb2xlYW4gZmluZFJlZmVyZW5jZXMsCi0JY2hhcltdIGRlY2xhcmluZ1NpbXBsZU5hbWUsCQorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAogCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAogCVN0cmluZyBkZWNsYXJpbmdTaWduYXR1cmUsCi0JY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zLAogCWNoYXJbXVtdIHBhcmFtZXRlclNpbXBsZU5hbWVzLAogCVN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMsCiAJY2hhcltdW10gYXJndW1lbnRzLAorCWludCBsaW1pdFRvLAogCWludCBtYXRjaFJ1bGUpIHsKIAotCXRoaXMoZmluZERlY2xhcmF0aW9ucywKLQkJZmluZFJlZmVyZW5jZXMsCi0JCWRlY2xhcmluZ1NpbXBsZU5hbWUsCQorCXRoaXMoZGVjbGFyaW5nU2ltcGxlTmFtZSwKIAkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKLQkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywKIAkJcGFyYW1ldGVyU2ltcGxlTmFtZXMsCisJCWxpbWl0VG8sCiAJCW1hdGNoUnVsZSk7CiAKIAkvLyBTdG9yZSB0eXBlIHNpZ25hdHVyZSBhbmQgYXJndW1lbnRzIGZvciBkZWNsYXJpbmcgdHlwZQogCWlmIChkZWNsYXJpbmdTaWduYXR1cmUgIT0gbnVsbCkgewotCQl0eXBlU2lnbmF0dXJlcyA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKGRlY2xhcmluZ1NpZ25hdHVyZSk7Ci0JCXNldFR5cGVBcmd1bWVudHMoVXRpbC5nZXRBbGxUeXBlQXJndW1lbnRzKHR5cGVTaWduYXR1cmVzKSk7CisJCXRoaXMudHlwZVNpZ25hdHVyZXMgPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZShkZWNsYXJpbmdTaWduYXR1cmUpOworCQlzZXRUeXBlQXJndW1lbnRzKFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyh0aGlzLnR5cGVTaWduYXR1cmVzKSk7CiAJfQogCiAJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIHR5cGUKIAlpZiAocGFyYW1ldGVyU2lnbmF0dXJlcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJTaWduYXR1cmVzLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCXBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOwotCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOworCQkJdGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXMgPSBuZXcgY2hhcltsZW5ndGhdW11bXTsKKwkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOwogCQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUocGFyYW1ldGVyU2lnbmF0dXJlc1tpXSk7Ci0JCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHMocGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldKTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlc1tpXSA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKHBhcmFtZXRlclNpZ25hdHVyZXNbaV0pOworCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXNbaV0pOwogCQkJfQogCQl9CiAJfQogCiAJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMgZm9yIG1ldGhvZAotCWNvbnN0cnVjdG9yQXJndW1lbnRzID0gYXJndW1lbnRzOworCXRoaXMuY29uc3RydWN0b3JBcmd1bWVudHMgPSBhcmd1bWVudHM7CiAJaWYgKGFyZ3VtZW50cyAgPT0gbnVsbCB8fCBhcmd1bWVudHMubGVuZ3RoID09IDApIHsKIAkJaWYgKGdldFR5cGVBcmd1bWVudHMoKSAhPSBudWxsICYmIGdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAwKSB7Ci0JCQljb25zdHJ1Y3RvckFyZ3VtZW50cyA9IGdldFR5cGVBcmd1bWVudHMoKVswXTsKKwkJCXRoaXMuY29uc3RydWN0b3JBcmd1bWVudHMgPSBnZXRUeXBlQXJndW1lbnRzKClbMF07CiAJCX0KIAl9Ci0JaWYgKGhhc0NvbnN0cnVjdG9yQXJndW1lbnRzKCkpICAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IHRydWU7CisJaWYgKGhhc0NvbnN0cnVjdG9yQXJndW1lbnRzKCkpICB0aGlzLm11c3RSZXNvbHZlID0gdHJ1ZTsKIH0KKwogcHVibGljIHZvaWQgZGVjb2RlSW5kZXhLZXkoY2hhcltdIGtleSkgewogCWludCBsYXN0ID0ga2V5Lmxlbmd0aCAtIDE7Ci0JdGhpcy5wYXJhbWV0ZXJDb3VudCA9IDA7Ci0JdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gbnVsbDsKLQlpbnQgcG93ZXIgPSAxOwotCWZvciAoaW50IGk9bGFzdDsgaT49MDsgaS0tKSB7Ci0JCWlmIChrZXlbaV0gPT0gU0VQQVJBVE9SKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGtleSwgMCwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gbmV3IGNoYXJbaV0sIDAsIGkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gbGFzdCkgewotCQkJdGhpcy5wYXJhbWV0ZXJDb3VudCA9IGtleVtpXSAtICcwJzsKLQkJfSBlbHNlIHsKLQkJCXBvd2VyICo9IDEwOwotCQkJdGhpcy5wYXJhbWV0ZXJDb3VudCArPSBwb3dlciAqIChrZXlbaV0gLSAnMCcpOworCWludCBzbGFzaCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIGtleSwgMCk7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShrZXksIDAsIHNsYXNoKTsKKwkKKwlpbnQgc3RhcnQgPSBzbGFzaCArIDE7CisJc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCBrZXksIHN0YXJ0KTsKKwlpZiAoc2xhc2ggIT0gLTEpIHsKKwkJbGFzdCA9IHNsYXNoIC0gMTsKKwl9CisJCisJYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGtleVtsYXN0XSA9PSAnIyc7CisJaWYgKGlzRGVmYXVsdENvbnN0cnVjdG9yKSB7CisJCXRoaXMucGFyYW1ldGVyQ291bnQgPSAtMTsKKwl9IGVsc2UgeworCQl0aGlzLnBhcmFtZXRlckNvdW50ID0gMDsKKwkJaW50IHBvd2VyID0gMTsKKwkJZm9yIChpbnQgaSA9IGxhc3Q7IGkgPj0gc3RhcnQ7IGktLSkgeworCQkJaWYgKGkgPT0gbGFzdCkgeworCQkJCXRoaXMucGFyYW1ldGVyQ291bnQgPSBrZXlbaV0gLSAnMCc7CisJCQl9IGVsc2UgeworCQkJCXBvd2VyICo9IDEwOworCQkJCXRoaXMucGFyYW1ldGVyQ291bnQgKz0gcG93ZXIgKiAoa2V5W2ldIC0gJzAnKTsKKwkJCX0KIAkJfQogCX0KIH0KQEAgLTIzOSwxNSArNDkxLDE2IEBACiAJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwogfQogYm9vbGVhbiBoYXNDb25zdHJ1Y3RvckFyZ3VtZW50cygpIHsKLQlyZXR1cm4gY29uc3RydWN0b3JBcmd1bWVudHMgIT0gbnVsbCAmJiBjb25zdHJ1Y3RvckFyZ3VtZW50cy5sZW5ndGggPiAwOworCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yQXJndW1lbnRzICE9IG51bGwgJiYgdGhpcy5jb25zdHJ1Y3RvckFyZ3VtZW50cy5sZW5ndGggPiAwOwogfQogYm9vbGVhbiBoYXNDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKSB7Ci0JcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyczsKKwlyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvclBhcmFtZXRlcnM7CiB9CiBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzRGVjb2RlZEtleShTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuKSB7CiAJQ29uc3RydWN0b3JQYXR0ZXJuIHBhdHRlcm4gPSAoQ29uc3RydWN0b3JQYXR0ZXJuKSBkZWNvZGVkUGF0dGVybjsKIAotCXJldHVybiAodGhpcy5wYXJhbWV0ZXJDb3VudCA9PSBwYXR0ZXJuLnBhcmFtZXRlckNvdW50IHx8IHRoaXMucGFyYW1ldGVyQ291bnQgPT0gLTEgfHwgdGhpcy52YXJhcmdzKQorCXJldHVybiBwYXR0ZXJuLnBhcmFtZXRlckNvdW50ICE9IC0xCisJCSYmICh0aGlzLnBhcmFtZXRlckNvdW50ID09IHBhdHRlcm4ucGFyYW1ldGVyQ291bnQgfHwgdGhpcy5wYXJhbWV0ZXJDb3VudCA9PSAtMSB8fCB0aGlzLnZhcmFyZ3MpCiAJCSYmIG1hdGNoZXNOYW1lKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgcGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lKTsKIH0KIHByb3RlY3RlZCBib29sZWFuIG11c3RSZXNvbHZlKCkgewpAQCAtMjU5LDMzICs1MTIsMzggQEAKIAkJCWlmICh0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIHJldHVybiB0cnVlOwogCXJldHVybiB0aGlzLmZpbmRSZWZlcmVuY2VzOyAvLyBuZWVkIHRvIGNoZWNrIHJlc29sdmVkIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxscwogfQotRW50cnlSZXN1bHRbXSBxdWVyeUluKEluZGV4IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworcHVibGljIEVudHJ5UmVzdWx0W10gcXVlcnlJbihJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAljaGFyW10ga2V5ID0gdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lOyAvLyBjYW4gYmUgbnVsbAogCWludCBtYXRjaFJ1bGUgPSBnZXRNYXRjaFJ1bGUoKTsKIAogCXN3aXRjaChnZXRNYXRjaE1vZGUoKSkgewogCQljYXNlIFJfRVhBQ1RfTUFUQ0ggOgotCQkJaWYgKHRoaXMuaXNDYW1lbENhc2UpIGJyZWFrOwotCQkJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyQ291bnQgPj0gMCAmJiAhdGhpcy52YXJhcmdzKQorCQkJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyQ291bnQgPj0gMCAmJiAhdGhpcy52YXJhcmdzKSB7CiAJCQkJa2V5ID0gY3JlYXRlSW5kZXhLZXkodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLnBhcmFtZXRlckNvdW50KTsKLQkJCWVsc2UgeyAvLyBkbyBhIHByZWZpeCBxdWVyeSB3aXRoIHRoZSBkZWNsYXJpbmdTaW1wbGVOYW1lCi0JCQkJbWF0Y2hSdWxlICY9IH5SX0VYQUNUX01BVENIOwotCQkJCW1hdGNoUnVsZSB8PSBSX1BSRUZJWF9NQVRDSDsKIAkJCX0KKwkJCW1hdGNoUnVsZSAmPSB+Ul9FWEFDVF9NQVRDSDsKKwkJCW1hdGNoUnVsZSB8PSBSX1BSRUZJWF9NQVRDSDsKIAkJCWJyZWFrOwogCQljYXNlIFJfUFJFRklYX01BVENIIDoKIAkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIGRlY2xhcmluZ1NpbXBsZU5hbWUKIAkJCWJyZWFrOwogCQljYXNlIFJfUEFUVEVSTl9NQVRDSCA6Ci0JCQlpZiAodGhpcy5wYXJhbWV0ZXJDb3VudCA+PSAwICYmICF0aGlzLnZhcmFyZ3MpCi0JCQkJa2V5ID0gY3JlYXRlSW5kZXhLZXkodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwgPyBPTkVfU1RBUiA6IHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5wYXJhbWV0ZXJDb3VudCk7Ci0JCQllbHNlIGlmICh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCAmJiB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWVbdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLmxlbmd0aCAtIDFdICE9ICcqJykKKwkJCWlmICh0aGlzLnBhcmFtZXRlckNvdW50ID49IDAgJiYgIXRoaXMudmFyYXJncykgeworCQkJCWtleSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNyZWF0ZUluZGV4S2V5KHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9PSBudWxsID8gT05FX1NUQVIgOiB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMucGFyYW1ldGVyQ291bnQpLCBPTkVfU1RBUik7CisJCQl9IGVsc2UgaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsICYmIHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZVt0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUubGVuZ3RoIC0gMV0gIT0gJyonKSB7CiAJCQkJa2V5ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCBPTkVfU1RBUiwgU0VQQVJBVE9SKTsKKwkJCX0gZWxzZSBpZiAoa2V5ICE9IG51bGwpeworCQkJCWtleSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGtleSwgT05FX1NUQVIpOworCQkJfQogCQkJLy8gZWxzZSBkbyBhIHBhdHRlcm4gcXVlcnkgd2l0aCBqdXN0IHRoZSBkZWNsYXJpbmdTaW1wbGVOYW1lCiAJCQlicmVhazsKIAkJY2FzZSBSX1JFR0VYUF9NQVRDSCA6CiAJCQkvLyBUT0RPIChmcmVkZXJpYykgaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAogCQkJYnJlYWs7CisJCWNhc2UgUl9DQU1FTENBU0VfTUFUQ0g6CisJCWNhc2UgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOgorCQkJLy8gZG8gYSBwcmVmaXggcXVlcnkgd2l0aCB0aGUgZGVjbGFyaW5nU2ltcGxlTmFtZQorCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGluZGV4LnF1ZXJ5KGdldEluZGV4Q2F0ZWdvcmllcygpLCBrZXksIG1hdGNoUnVsZSk7IC8vIG1hdGNoIHJ1bGUgaXMgaXJyZWxldmFudCB3aGVuIHRoZSBrZXkgaXMgbnVsbApAQCAtMjk4LDIxICs1NTYsMjEgQEAKIAl9IGVsc2UgewogCQlvdXRwdXQuYXBwZW5kKCJDb25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJfQotCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpCi0JCW91dHB1dC5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7Ci0JaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCi0JCW91dHB1dC5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSk7Ci0JZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKQorCWlmICh0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOworCWlmICh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUpOworCWVsc2UgaWYgKHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKQogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAogCW91dHB1dC5hcHBlbmQoJygnKTsKLQlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgeworCWlmICh0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwpIHsKIAkJb3V0cHV0LmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKIAl9IGVsc2UgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCWlmIChpID4gMCkgb3V0cHV0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIG91dHB1dC5hcHBlbmQocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0pLmFwcGVuZCgnLicpOwotCQkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID09IG51bGwpIG91dHB1dC5hcHBlbmQoJyonKTsgZWxzZSBvdXRwdXQuYXBwZW5kKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsKKwkJCWlmICh0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIG91dHB1dC5hcHBlbmQodGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7CisJCQlpZiAodGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9PSBudWxsKSBvdXRwdXQuYXBwZW5kKCcqJyk7IGVsc2Ugb3V0cHV0LmFwcGVuZCh0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsKIAkJfQogCX0KIAlvdXRwdXQuYXBwZW5kKCcpJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCmluZGV4IDUwMmQxNDEuLmVjYjUyOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDYgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVTZXQ7CiAKIHB1YmxpYyBjbGFzcyBEZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHNQYXR0ZXJuIGV4dGVuZHMgRmllbGRQYXR0ZXJuIHsKQEAgLTE5LDEwICsyMCwxMCBAQAogcHJvdGVjdGVkIFNpbXBsZVNldCBrbm93bkZpZWxkczsKIAogcHVibGljIERlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4oSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQpIHsKLQlzdXBlcihmYWxzZSwgdHJ1ZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgUl9QQVRURVJOX01BVENIKTsKKwlzdXBlcihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLCBSX1BBVFRFUk5fTUFUQ0gpOwogCiAJdGhpcy5lbmNsb3NpbmdFbGVtZW50ID0gZW5jbG9zaW5nRWxlbWVudDsKIAl0aGlzLmtub3duRmllbGRzID0gbmV3IFNpbXBsZVNldCgpOwotCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gdHJ1ZTsKKwl0aGlzLm11c3RSZXNvbHZlID0gdHJ1ZTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuLmphdmEKaW5kZXggYzFiOWYzMC4uZTA3YTRlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTMsNiArMTMsNyBAQAogLy9pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldDsKIAogcHVibGljIGNsYXNzIERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4gZXh0ZW5kcyBNZXRob2RQYXR0ZXJuIHsKQEAgLTIxLDEwICsyMiwxMCBAQAogcHJvdGVjdGVkIFNpbXBsZVNldCBrbm93bk1ldGhvZHM7CiAKIHB1YmxpYyBEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuKElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50KSB7Ci0Jc3VwZXIoZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIFJfUEFUVEVSTl9NQVRDSCk7CisJc3VwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywgUl9QQVRURVJOX01BVENIKTsKIAogCXRoaXMuZW5jbG9zaW5nRWxlbWVudCA9IGVuY2xvc2luZ0VsZW1lbnQ7CiAJdGhpcy5rbm93bk1ldGhvZHMgPSBuZXcgU2ltcGxlU2V0KCk7Ci0JKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcykubXVzdFJlc29sdmUgPSB0cnVlOworCXRoaXMubXVzdFJlc29sdmUgPSB0cnVlOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybi5qYXZhCmluZGV4IGM5YTNlZDguLjE1ZGU4ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjMsNiArMjMsNiBAQAogCiAJdGhpcy5lbmNsb3NpbmdFbGVtZW50ID0gZW5jbG9zaW5nRWxlbWVudDsKIAl0aGlzLmtub3duVHlwZXMgPSBuZXcgU2ltcGxlU2V0KCk7Ci0JKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcykubXVzdFJlc29sdmUgPSB0cnVlOworCXRoaXMubXVzdFJlc29sdmUgPSB0cnVlOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZExvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRMb2NhdG9yLmphdmEKaW5kZXggYTlmYTMzZS4uMjc4ZjA4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZExvY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMwLDYgKzMwLDkgQEAKIAogCXRoaXMuaXNEZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHNQYXR0ZXJuID0gdGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybjsKIH0KK3Byb3RlY3RlZCBpbnQgZmluZUdyYWluKCkgeworCXJldHVybiB0aGlzLnBhdHRlcm4uZmluZUdyYWluOworfQogcHVibGljIGludCBtYXRjaChBU1ROb2RlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJaW50IGRlY2xhcmF0aW9uc0xldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKIAlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSB7CkBAIC00Myw3ICs0Niw3IEBACiAJCQkJRmllbGRQYXR0ZXJuIGZpZWxkUGF0dGVybiA9IChGaWVsZFBhdHRlcm4pIHRoaXMucGF0dGVybjsKIAkJCQljaGFyW10gZGVjbGFyaW5nVHlwZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGZpZWxkUGF0dGVybi5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBmaWVsZFBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgJy4nKTsKIAkJCQlpZiAobWF0Y2hlc05hbWUoZGVjbGFyaW5nVHlwZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKSkpIHsKLQkJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNTcsNyArNjAsNyBAQAogCQkvLyBtdXN0IGJlIGEgd3JpdGUgb25seSBhY2Nlc3Mgd2l0aCBhbiBpbml0aWFsaXplcgogCQlpZiAodGhpcy5wYXR0ZXJuLndyaXRlQWNjZXNzICYmICF0aGlzLnBhdHRlcm4ucmVhZEFjY2VzcyAmJiBub2RlLmluaXRpYWxpemF0aW9uICE9IG51bGwpCiAJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsIG5vZGUubmFtZSkpCi0JCQkJcmVmZXJlbmNlc0xldmVsID0gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJcmVmZXJlbmNlc0xldmVsID0gdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKIAogCWludCBkZWNsYXJhdGlvbnNMZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CiAJaWYgKHRoaXMucGF0dGVybi5maW5kRGVjbGFyYXRpb25zKSB7CkBAIC02Niw3ICs2OSw3IEBACiAJCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5FTlVNX0NPTlNUQU5UIDoKIAkJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsIG5vZGUubmFtZSkpCiAJCQkJCWlmIChtYXRjaGVzVHlwZVJlZmVyZW5jZSgoKEZpZWxkUGF0dGVybil0aGlzLnBhdHRlcm4pLnR5cGVTaW1wbGVOYW1lLCBub2RlLnR5cGUpKQotCQkJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJCQkJCWRlY2xhcmF0aW9uc0xldmVsID0gdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKIAkJCQlicmVhazsKIAkJfQogCX0KQEAgLTc4LDcgKzgxLDcgQEAKIC8vcHVibGljIGludCBtYXRjaChUeXBlUmVmZXJlbmNlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSAtIFNLSVAgSVQKIAogcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKLQlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSB7CisJaWYgKHRoaXMucGF0dGVybi5maW5kUmVmZXJlbmNlcyB8fCB0aGlzLnBhdHRlcm4uZmluZUdyYWluICE9IDApIHsKIAkJLy8gbmVlZCB0byBsb29rIGV2ZXJ5d2hlcmUgdG8gZmluZCBpbiBqYXZhZG9jcyBhbmQgc3RhdGljIGltcG9ydAogCQlyZXR1cm4gQUxMX0NPTlRBSU5FUjsKIAl9CkBAIC0xMjgsMTggKzEzMSwyMSBAQAogcHJvdGVjdGVkIGludCBtYXRjaFJlZmVyZW5jZShSZWZlcmVuY2Ugbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQsIGJvb2xlYW4gd3JpdGVPbmx5QWNjZXNzKSB7CiAJaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgewogCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsICgoRmllbGRSZWZlcmVuY2UpIG5vZGUpLnRva2VuKSkKLQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKKwkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIAl9CiAJcmV0dXJuIHN1cGVyLm1hdGNoUmVmZXJlbmNlKG5vZGUsIG5vZGVTZXQsIHdyaXRlT25seUFjY2Vzcyk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwltYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIG51bGwsIG51bGwsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgbG9jYXRvcik7Cit9Citwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQsIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMsQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWlmICh0aGlzLmlzRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybikgewogCQkvLyBuZWVkIGV4YWN0IG1hdGNoIHRvIGJlIGFibGUgdG8gb3BlbiBvbiB0eXBlIHJlZgogCQlpZiAoYWNjdXJhY3kgIT0gU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSkgcmV0dXJuOwogCiAJCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBmaWVsZCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBlbmNsb3NpbmcgZWxlbWVudAotCQlEZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHNQYXR0ZXJuIGRlY2xQYXR0ZXJuID0gKERlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4pIHRoaXMucGF0dGVybjsgCisJCURlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4gZGVjbFBhdHRlcm4gPSAoRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybikgdGhpcy5wYXR0ZXJuOwogCQl3aGlsZSAoZWxlbWVudCAhPSBudWxsICYmICFkZWNsUGF0dGVybi5lbmNsb3NpbmdFbGVtZW50LmVxdWFscyhlbGVtZW50KSkKIAkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwogCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7CkBAIC0xNjMsMTkgKzE2OSwxOSBAQAogCQlpbnQgbGFzdEluZGV4ID0gaW1wb3J0UmVmLnRva2Vucy5sZW5ndGggLSAxOwogCQlpbnQgc3RhcnQgPSAoaW50KSAoKHBvc2l0aW9uc1tsYXN0SW5kZXhdKSA+Pj4gMzIpOwogCQlpbnQgZW5kID0gKGludCkgcG9zaXRpb25zW2xhc3RJbmRleF07Ci0JCW1hdGNoID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgc3RhcnQsIGVuZC1zdGFydCsxLCBpbXBvcnRSZWYpOwotCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgbG9jYWxFbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIHN0YXJ0LCBlbmQtc3RhcnQrMSwgaW1wb3J0UmVmKTsKKwkJbG9jYXRvci5yZXBvcnQodGhpcy5tYXRjaCk7CiAJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgewogCQlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSA9IChGaWVsZFJlZmVyZW5jZSkgcmVmZXJlbmNlOwogCQlsb25nIHBvc2l0aW9uID0gZmllbGRSZWZlcmVuY2UubmFtZVNvdXJjZVBvc2l0aW9uOwogCQlpbnQgc3RhcnQgPSAoaW50KSAocG9zaXRpb24gPj4+IDMyKTsKIAkJaW50IGVuZCA9IChpbnQpIHBvc2l0aW9uOwotCQltYXRjaCA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIHN0YXJ0LCBlbmQtc3RhcnQrMSwgZmllbGRSZWZlcmVuY2UpOwotCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgbG9jYWxFbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIHN0YXJ0LCBlbmQtc3RhcnQrMSwgZmllbGRSZWZlcmVuY2UpOworCQlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIAl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKIAkJaW50IG9mZnNldCA9IHJlZmVyZW5jZS5zb3VyY2VTdGFydDsKLQkJbWF0Y2ggPSBsb2NhdG9yLm5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBvZmZzZXQsIHJlZmVyZW5jZS5zb3VyY2VFbmQtb2Zmc2V0KzEsIHJlZmVyZW5jZSk7Ci0JCWxvY2F0b3IucmVwb3J0KG1hdGNoKTsKKwkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBsb2NhbEVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgb2Zmc2V0LCByZWZlcmVuY2Uuc291cmNlRW5kLW9mZnNldCsxLCByZWZlcmVuY2UpOworCQlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIAl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKIAkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWZlcmVuY2U7CiAJCWludCBsZW5ndGggPSBxTmFtZVJlZi50b2tlbnMubGVuZ3RoOwpAQCAtMTg3LDE4ICsxOTMsMTggQEAKIAkJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5uYW1lLCBxTmFtZVJlZi50b2tlbnNbaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXSkgJiYgIShuYW1lQmluZGluZyBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nKSkgewogCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IG5hbWVCaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nID8gKEZpZWxkQmluZGluZykgbmFtZUJpbmRpbmcgOiBudWxsOwogCQkJaWYgKGZpZWxkQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJbWF0Y2hlc1tpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmddID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgLTEsIC0xLCByZWZlcmVuY2UpOworCQkJCW1hdGNoZXNbaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXSA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBsb2NhbEVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgLTEsIC0xLCByZWZlcmVuY2UpOwogCQkJfSBlbHNlIHsKIAkJCQlzd2l0Y2ggKG1hdGNoRmllbGQoZmllbGRCaW5kaW5nLCBmYWxzZSkpIHsKIAkJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoKLQkJCQkJCW1hdGNoZXNbaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXSA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSwgLTEsIC0xLCByZWZlcmVuY2UpOworCQkJCQkJbWF0Y2hlc1tpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmddID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGxvY2FsRWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUsIC0xLCAtMSwgcmVmZXJlbmNlKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElOQUNDVVJBVEVfTUFUQ0g6Ci0JCQkJCQltYXRjaCA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgU2VhcmNoTWF0Y2guQV9JTkFDQ1VSQVRFLCAtMSwgLTEsIHJlZmVyZW5jZSk7CisJCQkJCQl0aGlzLm1hdGNoID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGxvY2FsRWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIFNlYXJjaE1hdGNoLkFfSU5BQ0NVUkFURSwgLTEsIC0xLCByZWZlcmVuY2UpOwogCQkJCQkJaWYgKGZpZWxkQmluZGluZy50eXBlICE9IG51bGwgJiYgZmllbGRCaW5kaW5nLnR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpICYmIHRoaXMucGF0dGVybi5oYXNUeXBlQXJndW1lbnRzKCkpIHsKIAkJCQkJCQl1cGRhdGVNYXRjaCgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBmaWVsZEJpbmRpbmcudHlwZSwgdGhpcy5wYXR0ZXJuLmdldFR5cGVBcmd1bWVudHMoKSwgbG9jYXRvcik7CiAJCQkJCQl9Ci0JCQkJCQltYXRjaGVzW2luZGV4T2ZGaXJzdEZpZWxkQmluZGluZ10gPSBtYXRjaDsKKwkJCQkJCW1hdGNoZXNbaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXSA9IHRoaXMubWF0Y2g7CiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0yMTAsMTggKzIxNiwxOCBAQAogCQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5uYW1lLCB0b2tlbikpIHsKIAkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gcU5hbWVSZWYub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gbnVsbCA6IHFOYW1lUmVmLm90aGVyQmluZGluZ3NbaS0oaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nKzEpXTsKIAkJCQlpZiAob3RoZXJCaW5kaW5nID09IG51bGwpIHsKLQkJCQkJbWF0Y2hlc1tpXSA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIC0xLCAtMSwgcmVmZXJlbmNlKTsKKwkJCQkJbWF0Y2hlc1tpXSA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBsb2NhbEVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgLTEsIC0xLCByZWZlcmVuY2UpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXN3aXRjaCAobWF0Y2hGaWVsZChvdGhlckJpbmRpbmcsIGZhbHNlKSkgewogCQkJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoKLQkJCQkJCQltYXRjaGVzW2ldID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCAtMSwgLTEsIHJlZmVyZW5jZSk7CisJCQkJCQkJbWF0Y2hlc1tpXSA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBsb2NhbEVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCAtMSwgLTEsIHJlZmVyZW5jZSk7CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIElOQUNDVVJBVEVfTUFUQ0g6Ci0JCQkJCQkJbWF0Y2ggPSBsb2NhdG9yLm5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIFNlYXJjaE1hdGNoLkFfSU5BQ0NVUkFURSwgLTEsIC0xLCByZWZlcmVuY2UpOworCQkJCQkJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgbG9jYWxFbGVtZW50LCBlbGVtZW50QmluZGluZywgU2VhcmNoTWF0Y2guQV9JTkFDQ1VSQVRFLCAtMSwgLTEsIHJlZmVyZW5jZSk7CiAJCQkJCQkJaWYgKG90aGVyQmluZGluZy50eXBlICE9IG51bGwgJiYgb3RoZXJCaW5kaW5nLnR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpICYmIHRoaXMucGF0dGVybi5oYXNUeXBlQXJndW1lbnRzKCkpIHsKIAkJCQkJCQkJdXBkYXRlTWF0Y2goKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgb3RoZXJCaW5kaW5nLnR5cGUsIHRoaXMucGF0dGVybi5nZXRUeXBlQXJndW1lbnRzKCksIGxvY2F0b3IpOwogCQkJCQkJCX0KLQkJCQkJCQltYXRjaGVzW2ldID0gbWF0Y2g7CisJCQkJCQkJbWF0Y2hlc1tpXSA9IHRoaXMubWF0Y2g7CiAJCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9CkBAIC0yMzksMTUgKzI0NSwxNSBAQAogCS8vIFdlIGNhbiBvbmx5IHJlZmluZSBpZiBsb2NhdG9yIGhhcyBhbiB1bml0IHNjb3BlLgogCWlmIChsb2NhdG9yLnVuaXRTY29wZSA9PSBudWxsKSByZXR1cm47CiAJdXBkYXRlTWF0Y2gocGFyYW1ldGVyaXplZEJpbmRpbmcsIHBhdHRlcm5UeXBlQXJndW1lbnRzLCBmYWxzZSwgMCwgbG9jYXRvcik7Ci0JaWYgKCFtYXRjaC5pc0V4YWN0KCkpIHsKKwlpZiAoIXRoaXMubWF0Y2guaXNFeGFjdCgpKSB7CiAJCS8vIGNhbm5vdCBhY2NlcHQgbmVpdGhlciBlcmFzdXJlIG5vciBjb21wYXRpYmxlIG1hdGNoCi0JCW1hdGNoLnNldFJ1bGUoMCk7CisJCXRoaXMubWF0Y2guc2V0UnVsZSgwKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCByZXBvcnREZWNsYXJhdGlvbihGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBNYXRjaExvY2F0b3IgbG9jYXRvciwgU2ltcGxlU2V0IGtub3duRmllbGRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJLy8gaWdub3JlIGxlbmd0aCBmaWVsZAogCWlmIChmaWVsZEJpbmRpbmcgPT0gQXJyYXlCaW5kaW5nLkFycmF5TGVuZ3RoKSByZXR1cm47Ci0JCisKIAlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwogCUlUeXBlIHR5cGUgPSBsb2NhdG9yLmxvb2t1cFR5cGUoZGVjbGFyaW5nQ2xhc3MpOwogCWlmICh0eXBlID09IG51bGwpIHJldHVybjsgLy8gY2FzZSBvZiBhIHNlY29uZGFyeSB0eXBlCkBAIC0yNzIsMTYgKzI3OCwxNyBAQAogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKIAkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gbnVsbDsKIAkJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gdHlwZURlY2wuZmllbGRzOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWludCBsZW5ndGggPSBmaWVsZERlY2xzID09IG51bGwgPyAwIDogZmllbGREZWNscy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGJpbmRpbmdOYW1lLCBmaWVsZERlY2xzW2ldLm5hbWUpKSB7CiAJCQkJCWZpZWxkRGVjbCA9IGZpZWxkRGVjbHNbaV07CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCX0gCisJCQl9CiAJCQlpZiAoZmllbGREZWNsICE9IG51bGwpIHsKIAkJCQlpbnQgb2Zmc2V0ID0gZmllbGREZWNsLnNvdXJjZVN0YXJ0OwotCQkJCW1hdGNoID0gbmV3IEZpZWxkRGVjbGFyYXRpb25NYXRjaCgoKEphdmFFbGVtZW50KSBmaWVsZCkucmVzb2x2ZWQoZmllbGRCaW5kaW5nKSwgU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSwgb2Zmc2V0LCBmaWVsZERlY2wuc291cmNlRW5kLW9mZnNldCsxLCBsb2NhdG9yLmdldFBhcnRpY2lwYW50KCksIHJlc291cmNlKTsKLQkJCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCQkJdGhpcy5tYXRjaCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uTWF0Y2goKChKYXZhRWxlbWVudCkgZmllbGQpLnJlc29sdmVkKGZpZWxkQmluZGluZyksIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUsIG9mZnNldCwgZmllbGREZWNsLnNvdXJjZUVuZC1vZmZzZXQrMSwgbG9jYXRvci5nZXRQYXJ0aWNpcGFudCgpLCByZXNvdXJjZSk7CisJCQkJbG9jYXRvci5yZXBvcnQodGhpcy5tYXRjaCk7CiAJCQl9CiAJCX0KIAl9CkBAIC0yOTAsNyArMjk3LDcgQEAKIAlyZXR1cm4gSUphdmFFbGVtZW50LkZJRUxEOwogfQogcHVibGljIGludCByZXNvbHZlTGV2ZWwoQVNUTm9kZSBwb3NzaWJsZWxNYXRjaGluZ05vZGUpIHsKLQlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSB7CisJaWYgKHRoaXMucGF0dGVybi5maW5kUmVmZXJlbmNlcyB8fCB0aGlzLnBhdHRlcm4uZmluZUdyYWluICE9IDApIHsKIAkJaWYgKHBvc3NpYmxlbE1hdGNoaW5nTm9kZSBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKQogCQkJcmV0dXJuIG1hdGNoRmllbGQoKChGaWVsZFJlZmVyZW5jZSkgcG9zc2libGVsTWF0Y2hpbmdOb2RlKS5iaW5kaW5nLCB0cnVlKTsKIAkJZWxzZSBpZiAocG9zc2libGVsTWF0Y2hpbmdOb2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkKQEAgLTMyMyw3ICszMzAsNyBAQAogCQkJaW50IGxldmVsID0gbWF0Y2hGaWVsZChmaWVsZEJpbmRpbmcsIGZhbHNlKTsKIAkJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSByZXR1cm4gbGV2ZWw7CiAJCX0KLQl9IAorCX0KIAlpbnQgb3RoZXJNYXggPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlck1heDsgaSsrKSB7CiAJCWNoYXJbXSB0b2tlbiA9IHFOYW1lUmVmLnRva2Vuc1tpICsgcU5hbWVSZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkUGF0dGVybi5qYXZhCmluZGV4IDMwYWUxMDcuLmY3MjBmMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZFBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zNCw0MSArMzQsMzcgQEAKIH0KIAogcHVibGljIEZpZWxkUGF0dGVybigKLQlib29sZWFuIGZpbmREZWNsYXJhdGlvbnMsCi0JYm9vbGVhbiByZWFkQWNjZXNzLAotCWJvb2xlYW4gd3JpdGVBY2Nlc3MsCi0JY2hhcltdIG5hbWUsIAorCWNoYXJbXSBuYW1lLAogCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAotCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKLQljaGFyW10gdHlwZVF1YWxpZmljYXRpb24sIAorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAorCWNoYXJbXSB0eXBlUXVhbGlmaWNhdGlvbiwKIAljaGFyW10gdHlwZVNpbXBsZU5hbWUsCisJaW50IGxpbWl0VG8sCiAJaW50IG1hdGNoUnVsZSkgewogCi0Jc3VwZXIoRklFTERfUEFUVEVSTiwgZmluZERlY2xhcmF0aW9ucywgcmVhZEFjY2Vzcywgd3JpdGVBY2Nlc3MsIG5hbWUsIG1hdGNoUnVsZSk7CisJc3VwZXIoRklFTERfUEFUVEVSTiwgbmFtZSwgbGltaXRUbywgbWF0Y2hSdWxlKTsKIAotCXRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7Ci0JdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyBkZWNsYXJpbmdTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdTaW1wbGVOYW1lKTsKLQl0aGlzLnR5cGVRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyB0eXBlUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UodHlwZVF1YWxpZmljYXRpb24pOwotCXRoaXMudHlwZVNpbXBsZU5hbWUgPSAoaXNDYXNlU2Vuc2l0aXZlKCkgfHwgaXNDYW1lbENhc2UoKSkgID8gdHlwZVNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHR5cGVTaW1wbGVOYW1lKTsKKwl0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA/IGRlY2xhcmluZ1F1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pOworCXRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJdGhpcy50eXBlUXVhbGlmaWNhdGlvbiA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gdHlwZVF1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHR5cGVRdWFsaWZpY2F0aW9uKTsKKwl0aGlzLnR5cGVTaW1wbGVOYW1lID0gKHRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IHRoaXMuaXNDYW1lbENhc2UpID8gdHlwZVNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHR5cGVTaW1wbGVOYW1lKTsKIAotCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gbXVzdFJlc29sdmUoKTsKKwl0aGlzLm11c3RSZXNvbHZlID0gbXVzdFJlc29sdmUoKTsKIH0KIC8qCi0gKiBJbnN0YW5jaWF0ZSBhIGZpZWxkIHBhdHRlcm4gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBnZW5lcmljcyBzZWFyY2gKKyAqIEluc3RhbnRpYXRlIGEgZmllbGQgcGF0dGVybiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGdlbmVyaWMgc2VhcmNoCiAgKi8KIHB1YmxpYyBGaWVsZFBhdHRlcm4oCi0JYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zLAotCWJvb2xlYW4gcmVhZEFjY2VzcywKLQlib29sZWFuIHdyaXRlQWNjZXNzLAotCWNoYXJbXSBuYW1lLCAKKwljaGFyW10gbmFtZSwKIAljaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKLQljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwJCi0JY2hhcltdIHR5cGVRdWFsaWZpY2F0aW9uLCAKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwKKwljaGFyW10gdHlwZVF1YWxpZmljYXRpb24sCiAJY2hhcltdIHR5cGVTaW1wbGVOYW1lLAogCVN0cmluZyB0eXBlU2lnbmF0dXJlLAorCWludCBsaW1pdFRvLAogCWludCBtYXRjaFJ1bGUpIHsKIAotCXRoaXMoZmluZERlY2xhcmF0aW9ucywgcmVhZEFjY2Vzcywgd3JpdGVBY2Nlc3MsIG5hbWUsIGRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ1NpbXBsZU5hbWUsIHR5cGVRdWFsaWZpY2F0aW9uLCB0eXBlU2ltcGxlTmFtZSwgbWF0Y2hSdWxlKTsKKwl0aGlzKG5hbWUsIGRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ1NpbXBsZU5hbWUsIHR5cGVRdWFsaWZpY2F0aW9uLCB0eXBlU2ltcGxlTmFtZSwgbGltaXRUbywgbWF0Y2hSdWxlKTsKIAogCS8vIHN0b3JlIHR5cGUgc2lnbmF0dXJlcyBhbmQgYXJndW1lbnRzCiAJaWYgKHR5cGVTaWduYXR1cmUgIT0gbnVsbCkgewpAQCAtODAsMTMgKzc2LDEzIEBACiAJdGhpcy5uYW1lID0ga2V5OwogfQogcHVibGljIFNlYXJjaFBhdHRlcm4gZ2V0QmxhbmtQYXR0ZXJuKCkgewotCXJldHVybiBuZXcgRmllbGRQYXR0ZXJuKGZhbHNlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIFJfRVhBQ1RfTUFUQ0ggfCBSX0NBU0VfU0VOU0lUSVZFKTsKKwlyZXR1cm4gbmV3IEZpZWxkUGF0dGVybihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBSX0VYQUNUX01BVENIIHwgUl9DQVNFX1NFTlNJVElWRSk7CiB9CiBwdWJsaWMgY2hhcltdIGdldEluZGV4S2V5KCkgewogCXJldHVybiB0aGlzLm5hbWU7CiB9CiBwdWJsaWMgY2hhcltdW10gZ2V0SW5kZXhDYXRlZ29yaWVzKCkgewotCWlmICh0aGlzLmZpbmRSZWZlcmVuY2VzKQorCWlmICh0aGlzLmZpbmRSZWZlcmVuY2VzIHx8IHRoaXMuZmluZUdyYWluICE9IDApCiAJCXJldHVybiB0aGlzLmZpbmREZWNsYXJhdGlvbnMgfHwgdGhpcy53cml0ZUFjY2VzcyA/IFJFRl9BTkRfREVDTF9DQVRFR09SSUVTIDogUkVGX0NBVEVHT1JJRVM7CiAJaWYgKHRoaXMuZmluZERlY2xhcmF0aW9ucykKIAkJcmV0dXJuIERFQ0xfQ0FURUdPUklFUzsKQEAgLTEwOSwyMSArMTA1LDIxIEBACiAJfSBlbHNlIHsKIAkJb3V0cHV0LmFwcGVuZCgiRmllbGRSZWZlcmVuY2VQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAogCX0KLQlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBvdXRwdXQuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOwotCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpIAotCQlvdXRwdXQuYXBwZW5kKGRlY2xhcmluZ1NpbXBsZU5hbWUpLmFwcGVuZCgnLicpOwotCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCgiKi4iKTsgLy8kTk9OLU5MUy0xJAotCWlmIChuYW1lID09IG51bGwpIHsKKwlpZiAodGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIG91dHB1dC5hcHBlbmQodGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uKS5hcHBlbmQoJy4nKTsKKwlpZiAodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpCisJCW91dHB1dC5hcHBlbmQodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lKS5hcHBlbmQoJy4nKTsKKwllbHNlIGlmICh0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCgiKi4iKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAl9IGVsc2UgewotCQlvdXRwdXQuYXBwZW5kKG5hbWUpOworCQlvdXRwdXQuYXBwZW5kKHRoaXMubmFtZSk7CiAJfQotCWlmICh0eXBlUXVhbGlmaWNhdGlvbiAhPSBudWxsKSAKLQkJb3V0cHV0LmFwcGVuZCgiIC0tPiAiKS5hcHBlbmQodHlwZVF1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOyAvLyROT04tTkxTLTEkCi0JZWxzZSBpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCgiIC0tPiAiKTsgLy8kTk9OLU5MUy0xJAotCWlmICh0eXBlU2ltcGxlTmFtZSAhPSBudWxsKSAKLQkJb3V0cHV0LmFwcGVuZCh0eXBlU2ltcGxlTmFtZSk7Ci0JZWxzZSBpZiAodHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCisJaWYgKHRoaXMudHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCgiIC0tPiAiKS5hcHBlbmQodGhpcy50eXBlUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7IC8vJE5PTi1OTFMtMSQKKwllbHNlIGlmICh0aGlzLnR5cGVTaW1wbGVOYW1lICE9IG51bGwpIG91dHB1dC5hcHBlbmQoIiAtLT4gIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAodGhpcy50eXBlU2ltcGxlTmFtZSAhPSBudWxsKQorCQlvdXRwdXQuYXBwZW5kKHRoaXMudHlwZVNpbXBsZU5hbWUpOworCWVsc2UgaWYgKHRoaXMudHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgb3V0cHV0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHN1cGVyLnByaW50KG91dHB1dCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ltcG9ydE1hdGNoTG9jYXRvclBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9JbXBvcnRNYXRjaExvY2F0b3JQYXJzZXIuamF2YQppbmRleCA1YTBlMjczLi4xNzc5YzI1IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ltcG9ydE1hdGNoTG9jYXRvclBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSW1wb3J0TWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMjggKzEwLDQwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKIAogY2xhc3MgSW1wb3J0TWF0Y2hMb2NhdG9yUGFyc2VyIGV4dGVuZHMgTWF0Y2hMb2NhdG9yUGFyc2VyIHsKIAorCWJvb2xlYW4gcmVwb3J0SW1wb3J0TWF0Y2g7CisKIHByb3RlY3RlZCBJbXBvcnRNYXRjaExvY2F0b3JQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHsKIAlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIGxvY2F0b3IpOworCXRoaXMucmVwb3J0SW1wb3J0TWF0Y2ggPSB0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCB8fCAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QT1JUX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFKSAhPSAwOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0ltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgewogCXN1cGVyLmNvbnN1bWVTdGF0aWNJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOwotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMubm9kZVNldCk7CisJaWYgKHRoaXMucmVwb3J0SW1wb3J0TWF0Y2gpIHsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5ub2RlU2V0KTsKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb25OYW1lKCkgewogCXN1cGVyLmNvbnN1bWVTaW5nbGVTdGF0aWNJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsKLQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnJlcG9ydEltcG9ydE1hdGNoKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMubm9kZVNldCk7CisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CiAJc3VwZXIuY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsKLQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnJlcG9ydEltcG9ydE1hdGNoKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMubm9kZVNldCk7CisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKIAlzdXBlci5jb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7Ci0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5ub2RlU2V0KTsKKwlpZiAodGhpcy5yZXBvcnRJbXBvcnRNYXRjaCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9JbnRlcm5hbFNlYXJjaFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSW50ZXJuYWxTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDk3ZDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9JbnRlcm5hbFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC4qOwotCi0vKioKLSAqIEludGVybmFsIHNlYXJjaCBwYXR0ZXJuIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlcm5hbFNlYXJjaFBhdHRlcm4gewotCi0JLyoqCi0JICogIFRoZSBmb2N1cyBlbGVtZW50ICh1c2VkIGZvciByZWZlcmVuY2UgcGF0dGVybnMpCi0JICovCi0JSUphdmFFbGVtZW50IGZvY3VzOwotCi0JaW50IGtpbmQ7Ci0JYm9vbGVhbiBtdXN0UmVzb2x2ZSA9IHRydWU7Ci0JCi0Jdm9pZCBhY2NlcHRNYXRjaChTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgY29udGFpbmVyUGF0aCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJbmRleFF1ZXJ5UmVxdWVzdG9yIHJlcXVlc3RvciwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQotCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBKYXZhU2VhcmNoU2NvcGUpIHsKLQkJCUphdmFTZWFyY2hTY29wZSBqYXZhU2VhcmNoU2NvcGUgPSAoSmF2YVNlYXJjaFNjb3BlKSBzY29wZTsKLQkJCS8vIEdldCBkb2N1bWVudCBwYXRoIGFjY2VzcyByZXN0cmljdGlvbiBmcm9tIGphdmEgc2VhcmNoIHNjb3BlCi0JCQkvLyBOb3RlIHRoYXQgcmVxdWVzdG9yIGhhcyB0byB2ZXJpZnkgaWYgbmVlZGVkIHdoZXRoZXIgdGhlIGRvY3VtZW50IHZpb2xhdGVzIHRoZSBhY2Nlc3MgcmVzdHJpY3Rpb24gb3Igbm90Ci0JCQlBY2Nlc3NSdWxlU2V0IGFjY2VzcyA9IGphdmFTZWFyY2hTY29wZS5nZXRBY2Nlc3NSdWxlU2V0KHJlbGF0aXZlUGF0aCwgY29udGFpbmVyUGF0aCk7Ci0JCQlpZiAoYWNjZXNzICE9IEphdmFTZWFyY2hTY29wZS5OT1RfRU5DTE9TRUQpIHsgLy8gc2NvcGUgZW5jbG9zZXMgdGhlIGRvY3VtZW50IHBhdGgKLQkJCQlTdHJpbmcgZG9jdW1lbnRQYXRoID0gZG9jdW1lbnRQYXRoKGNvbnRhaW5lclBhdGgsIHJlbGF0aXZlUGF0aCk7Ci0JCQkJaWYgKCFyZXF1ZXN0b3IuYWNjZXB0SW5kZXhNYXRjaChkb2N1bWVudFBhdGgsIHBhdHRlcm4sIHBhcnRpY2lwYW50LCBhY2Nlc3MpKSAKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgZG9jdW1lbnRQYXRoID0gZG9jdW1lbnRQYXRoKGNvbnRhaW5lclBhdGgsIHJlbGF0aXZlUGF0aCk7Ci0JCQlpZiAoc2NvcGUuZW5jbG9zZXMoZG9jdW1lbnRQYXRoKSkgCi0JCQkJaWYgKCFyZXF1ZXN0b3IuYWNjZXB0SW5kZXhNYXRjaChkb2N1bWVudFBhdGgsIHBhdHRlcm4sIHBhcnRpY2lwYW50LCBudWxsKSkgCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCi0JCX0KLQl9Ci0JU2VhcmNoUGF0dGVybiBjdXJyZW50UGF0dGVybigpIHsKLQkJcmV0dXJuIChTZWFyY2hQYXR0ZXJuKSB0aGlzOwotCX0KLQlTdHJpbmcgZG9jdW1lbnRQYXRoKFN0cmluZyBjb250YWluZXJQYXRoLCBTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCVN0cmluZyBzZXBhcmF0b3IgPSBVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGNvbnRhaW5lclBhdGgpID8gSUphdmFTZWFyY2hTY29wZS5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IgOiAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGFpbmVyUGF0aC5sZW5ndGgoKSArIHNlcGFyYXRvci5sZW5ndGgoKSArIHJlbGF0aXZlUGF0aC5sZW5ndGgoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGFpbmVyUGF0aCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJYnVmZmVyLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIFF1ZXJ5IGEgZ2l2ZW4gaW5kZXggZm9yIG1hdGNoaW5nIGVudHJpZXMuIEFzc3VtZXMgdGhlIHNlbmRlciBoYXMgb3BlbmVkIHRoZSBpbmRleCBhbmQgd2lsbCBjbG9zZSB3aGVuIGZpbmlzaGVkLgotCSAqLwotCXZvaWQgZmluZEluZGV4TWF0Y2hlcyhJbmRleCBpbmRleCwgSW5kZXhRdWVyeVJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl0cnkgewotCQkJaW5kZXguc3RhcnRRdWVyeSgpOwotCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gY3VycmVudFBhdHRlcm4oKTsKLQkJCUVudHJ5UmVzdWx0W10gZW50cmllcyA9ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLnF1ZXJ5SW4oaW5kZXgpOwotCQkJaWYgKGVudHJpZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJCVNlYXJjaFBhdHRlcm4gZGVjb2RlZFJlc3VsdCA9IHBhdHRlcm4uZ2V0QmxhbmtQYXR0ZXJuKCk7Ci0JCQlTdHJpbmcgY29udGFpbmVyUGF0aCA9IGluZGV4LmNvbnRhaW5lclBhdGg7Ci0JCQlmb3IgKGludCBpID0gMCwgbCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQotCQkJCUVudHJ5UmVzdWx0IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQlkZWNvZGVkUmVzdWx0LmRlY29kZUluZGV4S2V5KGVudHJ5LmdldFdvcmQoKSk7Ci0JCQkJaWYgKHBhdHRlcm4ubWF0Y2hlc0RlY29kZWRLZXkoZGVjb2RlZFJlc3VsdCkpIHsKLQkJCQkJLy8gVE9ETyAoa2VudCkgc29tZSBjbGllbnRzIG1heSBub3QgbmVlZCB0aGUgZG9jdW1lbnQgbmFtZXMKLQkJCQkJU3RyaW5nW10gbmFtZXMgPSBlbnRyeS5nZXREb2N1bWVudE5hbWVzKGluZGV4KTsKLQkJCQkJZm9yIChpbnQgaiA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGogPCBuOyBqKyspCi0JCQkJCQlhY2NlcHRNYXRjaChuYW1lc1tqXSwgY29udGFpbmVyUGF0aCwgZGVjb2RlZFJlc3VsdCwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudCwgc2NvcGUpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWluZGV4LnN0b3BRdWVyeSgpOwotCQl9Ci0JfQotCWJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlFbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IChTZWFyY2hQYXR0ZXJuKSB0aGlzOwotCQlyZXR1cm4gaW5kZXgucXVlcnkocGF0dGVybi5nZXRJbmRleENhdGVnb3JpZXMoKSwgcGF0dGVybi5nZXRJbmRleEtleSgpLCBwYXR0ZXJuLmdldE1hdGNoUnVsZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSW50ZXJzZWN0aW5nUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9JbnRlcnNlY3RpbmdQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZDczZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSW50ZXJzZWN0aW5nUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JbmRleFF1ZXJ5UmVxdWVzdG9yOworCisvKioKKyAqIFF1ZXJ5IHRoZSBpbmRleCBtdWx0aXBsZSB0aW1lcyBhbmQgZG8gYW4gJ2FuZCcgb24gdGhlIHJlc3VsdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlcnNlY3RpbmdQYXR0ZXJuIGV4dGVuZHMgSmF2YVNlYXJjaFBhdHRlcm4geworCitwdWJsaWMgSW50ZXJzZWN0aW5nUGF0dGVybihpbnQgcGF0dGVybktpbmQsIGludCBtYXRjaFJ1bGUpIHsKKwlzdXBlcihwYXR0ZXJuS2luZCwgbWF0Y2hSdWxlKTsKK30KK3B1YmxpYyB2b2lkIGZpbmRJbmRleE1hdGNoZXMoSW5kZXggaW5kZXgsIEluZGV4UXVlcnlSZXF1ZXN0b3IgcmVxdWVzdG9yLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCisJcmVzZXRRdWVyeSgpOworCVNpbXBsZVNldCBpbnRlcnNlY3RlZE5hbWVzID0gbnVsbDsKKwl0cnkgeworCQlpbmRleC5zdGFydFF1ZXJ5KCk7CisJCWRvIHsKKwkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IGN1cnJlbnRQYXR0ZXJuKCk7CisJCQlFbnRyeVJlc3VsdFtdIGVudHJpZXMgPSBwYXR0ZXJuLnF1ZXJ5SW4oaW5kZXgpOworCQkJaWYgKGVudHJpZXMgPT0gbnVsbCkgcmV0dXJuOworCisJCQlTZWFyY2hQYXR0ZXJuIGRlY29kZWRSZXN1bHQgPSBwYXR0ZXJuLmdldEJsYW5rUGF0dGVybigpOworCQkJU2ltcGxlU2V0IG5ld0ludGVyc2VjdGVkTmFtZXMgPSBuZXcgU2ltcGxlU2V0KDMpOworCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCQkJCUVudHJ5UmVzdWx0IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQlkZWNvZGVkUmVzdWx0LmRlY29kZUluZGV4S2V5KGVudHJ5LmdldFdvcmQoKSk7CisJCQkJaWYgKHBhdHRlcm4ubWF0Y2hlc0RlY29kZWRLZXkoZGVjb2RlZFJlc3VsdCkpIHsKKwkJCQkJU3RyaW5nW10gbmFtZXMgPSBlbnRyeS5nZXREb2N1bWVudE5hbWVzKGluZGV4KTsKKwkJCQkJaWYgKGludGVyc2VjdGVkTmFtZXMgIT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaiA9IDAsIG4gPSBuYW1lcy5sZW5ndGg7IGogPCBuOyBqKyspCisJCQkJCQkJaWYgKGludGVyc2VjdGVkTmFtZXMuaW5jbHVkZXMobmFtZXNbal0pKQorCQkJCQkJCQluZXdJbnRlcnNlY3RlZE5hbWVzLmFkZChuYW1lc1tqXSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmb3IgKGludCBqID0gMCwgbiA9IG5hbWVzLmxlbmd0aDsgaiA8IG47IGorKykKKwkJCQkJCQluZXdJbnRlcnNlY3RlZE5hbWVzLmFkZChuYW1lc1tqXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChuZXdJbnRlcnNlY3RlZE5hbWVzLmVsZW1lbnRTaXplID09IDApIHJldHVybjsKKwkJCWludGVyc2VjdGVkTmFtZXMgPSBuZXdJbnRlcnNlY3RlZE5hbWVzOworCQl9IHdoaWxlIChoYXNOZXh0UXVlcnkoKSk7CisJfSBmaW5hbGx5IHsKKwkJaW5kZXguc3RvcFF1ZXJ5KCk7CisJfQorCisJU3RyaW5nIGNvbnRhaW5lclBhdGggPSBpbmRleC5jb250YWluZXJQYXRoOworCWNoYXIgc2VwYXJhdG9yID0gaW5kZXguc2VwYXJhdG9yOworCU9iamVjdFtdIG5hbWVzID0gaW50ZXJzZWN0ZWROYW1lcy52YWx1ZXM7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmIChuYW1lc1tpXSAhPSBudWxsKQorCQkJYWNjZXB0TWF0Y2goKFN0cmluZykgbmFtZXNbaV0sIGNvbnRhaW5lclBhdGgsIHNlcGFyYXRvciwgbnVsbC8qbm8gcGF0dGVybiovLCByZXF1ZXN0b3IsIHBhcnRpY2lwYW50LCBzY29wZSwgcHJvZ3Jlc3NNb25pdG9yKTsgLy8gQW5kUGF0dGVybnMgY2Fubm90IHByb3ZpZGUgdGhlIGRlY29kZWQgcmVzdWx0Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciBhbm90aGVyIHF1ZXJ5IG11c3QgYmUgZG9uZS4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dFF1ZXJ5KCk7CisvKioKKyAqIFJlc2V0cyB0aGUgcXVlcnkgYW5kIHByZXBhcmVzIHRoaXMgcGF0dGVybiB0byBiZSBxdWVyaWVkLgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZXNldFF1ZXJ5KCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0phdmFTZWFyY2hOYW1lRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudC5qYXZhCmluZGV4IGYwM2UzN2UuLjY4NWFkMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTQxLDE0ICs0MSwxNCBAQAogICogQSBuYW1lIGVudmlyb25tZW50IGJhc2VkIG9uIHRoZSBjbGFzc3BhdGggb2YgYSBKYXZhIHByb2plY3QuCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50IGltcGxlbWVudHMgSU5hbWVFbnZpcm9ubWVudCwgU3VmZml4Q29uc3RhbnRzIHsKLQkKKwogCUNsYXNzcGF0aExvY2F0aW9uW10gbG9jYXRpb25zOwotCQorCiAJLyoKIAkgKiBBIG1hcCBmcm9tIHRoZSBmdWxseSBxdWFsaWZpZWQgc2xhc2gtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIG1haW4gdHlwZSAoU3RyaW5nKSB0byB0aGUgd29ya2luZyBjb3B5CiAJICovCiAJSGFzaE1hcCB3b3JraW5nQ29waWVzOwotCQorCiBwdWJsaWMgSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbXSBjb3BpZXMpIHsKIAljb21wdXRlQ2xhc3NwYXRoTG9jYXRpb25zKGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIChKYXZhUHJvamVjdCkgamF2YVByb2plY3QpOwogCXRyeSB7CkBAIC05OCw3ICs5OCw3IEBACiAJCQkJWmlwRmlsZSB6aXBGaWxlID0gbWFuYWdlci5nZXRaaXBGaWxlKHBhdGgpOwogCQkJCWNwTG9jYXRpb25zW2luZGV4KytdID0gbmV3IENsYXNzcGF0aEphcih6aXBGaWxlLCAoKENsYXNzcGF0aEVudHJ5KSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCkpLmdldEFjY2Vzc1J1bGVTZXQoKSk7CiAJCQl9IGVsc2UgewotCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIGZhbHNlKTsKKwkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChwYXRoLCB0cnVlKTsKIAkJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQkJLy8gdGFyZ2V0IGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlcgogCQkJCQkvLyBqdXN0IHJlc2l6ZSBjcExvY2F0aW9ucwpAQCAtMTIwLDkgKzEyMCw5IEBACiB9CiAKIHByaXZhdGUgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSkgewotCVN0cmluZyAKLQkJYmluYXJ5RmlsZU5hbWUgPSBudWxsLCBxQmluYXJ5RmlsZU5hbWUgPSBudWxsLCAKLQkJc291cmNlRmlsZU5hbWUgPSBudWxsLCBxU291cmNlRmlsZU5hbWUgPSBudWxsLCAKKwlTdHJpbmcKKwkJYmluYXJ5RmlsZU5hbWUgPSBudWxsLCBxQmluYXJ5RmlsZU5hbWUgPSBudWxsLAorCQlzb3VyY2VGaWxlTmFtZSA9IG51bGwsIHFTb3VyY2VGaWxlTmFtZSA9IG51bGwsCiAJCXFQYWNrYWdlTmFtZSA9IG51bGw7CiAJTmFtZUVudmlyb25tZW50QW5zd2VyIHN1Z2dlc3RlZEFuc3dlciA9IG51bGw7CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMubG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CkBAIC0xNTksMTAgKzE1OSwxMCBAQAogCQkJCQliaW5hcnlGaWxlTmFtZSA9IHFCaW5hcnlGaWxlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWVTdGFydCk7CiAJCQkJfQogCQkJfQotCQkJYW5zd2VyID0gCisJCQlhbnN3ZXIgPQogCQkJCWxvY2F0aW9uLmZpbmRDbGFzcygKLQkJCQkJYmluYXJ5RmlsZU5hbWUsIAotCQkJCQlxUGFja2FnZU5hbWUsIAorCQkJCQliaW5hcnlGaWxlTmFtZSwKKwkJCQkJcVBhY2thZ2VOYW1lLAogCQkJCQlxQmluYXJ5RmlsZU5hbWUpOwogCQl9CiAJCWlmIChhbnN3ZXIgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9KYXZhU2VhcmNoUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9KYXZhU2VhcmNoUGF0dGVybi5qYXZhCmluZGV4IDliYmE5MDIuLmY1M2UyZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaFBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0phdmFTZWFyY2hQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMTggKzE4LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKIAogCiBwdWJsaWMgY2xhc3MgSmF2YVNlYXJjaFBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuIGltcGxlbWVudHMgSUluZGV4Q29uc3RhbnRzIHsKLQkKKwogCS8qCiAJICogV2hldGhlciB0aGlzIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUuCiAJICovCiAJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmU7Ci0KIAkvKgogCSAqIFdoZXRoZXIgdGhpcyBwYXR0ZXJuIGlzIGNhbWVsIGNhc2UuCiAJICovCkBAIC00Myw2ICs0Myw3IEBACiAJICoJCTxsaT57QGxpbmsgI1JfUEFUVEVSTl9NQVRDSH08L2xpPgogCSAqCQk8bGk+e0BsaW5rICNSX1JFR0VYUF9NQVRDSH08L2xpPgogCSAqCQk8bGk+e0BsaW5rICNSX0NBTUVMQ0FTRV9NQVRDSH08L2xpPgorCSAqCQk8bGk+e0BsaW5rICNSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0h9PC9saT4KIAkgKiA8L3VsPgogCSAqLwogCWludCBtYXRjaE1vZGU7CkBAIC01Myw5ICs1NCwxOSBAQAogCWludCBtYXRjaENvbXBhdGliaWxpdHk7CiAKIAkvKioKKwkgKiBGaW5lIGdyYWluIGxpbWl0YXRpb24KKwkgKi8KKwlwdWJsaWMgaW50IGZpbmVHcmFpbiA9IDA7CisKKwkvKioKIAkgKiBNYXNrIHVzZWQgb24gbWF0Y2ggcnVsZSBmb3IgbWF0Y2ggbW9kZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVRDSF9NT0RFX01BU0sgPSBSX0VYQUNUX01BVENIIHwgUl9QUkVGSVhfTUFUQ0ggfCBSX1BBVFRFUk5fTUFUQ0ggfCBSX1JFR0VYUF9NQVRDSDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVRDSF9NT0RFX01BU0sgPSBSX0VYQUNUX01BVENICisJCXwgUl9QUkVGSVhfTUFUQ0gKKwkJfCBSX1BBVFRFUk5fTUFUQ0gKKwkJfCBSX1JFR0VYUF9NQVRDSAorCQl8IFJfQ0FNRUxDQVNFX01BVENICisJCXwgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOwogCiAJLyoqCiAJICogTWFzayB1c2VkIG9uIG1hdGNoIHJ1bGUgZm9yIGdlbmVyaWMgcmVsZXZhbmNlLgpAQCAtNzAsMzcgKzgxLDEwOCBAQAogCiAJcHJvdGVjdGVkIEphdmFTZWFyY2hQYXR0ZXJuKGludCBwYXR0ZXJuS2luZCwgaW50IG1hdGNoUnVsZSkgewogCQlzdXBlcihtYXRjaFJ1bGUpOwotCQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5raW5kID0gcGF0dGVybktpbmQ7CisJCXRoaXMua2luZCA9IHBhdHRlcm5LaW5kOwogCQkvLyBVc2UgZ2V0TWF0Y2hSdWxlKCkgaW5zdGVhZCBvZiBtYXRjaFJ1bGUgYXMgc3VwZXIgY29uc3RydWN0b3IgbWF5IG1vZGlmeSBpdHMgdmFsdWUKIAkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODEzNzcKIAkJaW50IHJ1bGUgPSBnZXRNYXRjaFJ1bGUoKTsKIAkJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSAocnVsZSAmIFJfQ0FTRV9TRU5TSVRJVkUpICE9IDA7Ci0JCXRoaXMuaXNDYW1lbENhc2UgPSAocnVsZSAmIFJfQ0FNRUxDQVNFX01BVENIKSAhPSAwOworCQl0aGlzLmlzQ2FtZWxDYXNlID0gKHJ1bGUgJiAoUl9DQU1FTENBU0VfTUFUQ0ggfCBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0gpKSAhPSAwOwogCQl0aGlzLm1hdGNoQ29tcGF0aWJpbGl0eSA9IHJ1bGUgJiBNQVRDSF9DT01QQVRJQklMSVRZX01BU0s7CiAJCXRoaXMubWF0Y2hNb2RlID0gcnVsZSAmIE1BVENIX01PREVfTUFTSzsKIAl9Ci0JCisKKwkvKioKKwkgKiBAcGFyYW0gZmluZUdyYWluCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmluZUdyYWluRmxhZ1N0cmluZyhmaW5hbCBpbnQgZmluZUdyYWluKSB7CisJCWlmIChmaW5lR3JhaW4gPT0gMCkgeworCQkJcmV0dXJuICJub25lIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGk9MTsgaTw9MzI7IGkrKykgeworCQkJaW50IGJpdCA9IGZpbmVHcmFpbiAmICgxPDwoaS0xKSk7CisJCQlpZiAoYml0ICE9IDAgJiYgYnVmZmVyLmxlbmd0aCgpPjApIGJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCQlzd2l0Y2ggKGJpdCkgeworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuRklFTERfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIkZJRUxEX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5MT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiTE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlBBUkFNRVRFUl9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiUEFSQU1FVEVSX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5TVVBFUlRZUEVfVFlQRV9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlNVUEVSVFlQRV9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0FTVF9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiQ0FTVF9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0FUQ0hfVFlQRV9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIkNBVENIX1RZUEVfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fVFlQRV9SRUZFUkVOQ0UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFVFVSTl9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiUkVUVVJOX1RZUEVfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBPUlRfREVDTEFSQVRJT05fVFlQRV9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIklNUE9SVF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIldJTERDQVJEX0JPVU5EX1RZUEVfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5TVVBFUl9SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlNVUEVSX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuUVVBTElGSUVEX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiUVVBTElGSUVEX1JFRkVSRU5DRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuVEhJU19SRUZFUkVOQ0U6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlRISVNfUkVGRVJFTkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMSUNJVF9USElTX1JFRkVSRU5DRToKKwkJCQkJYnVmZmVyLmFwcGVuZCgiSU1QTElDSVRfVEhJU19SRUZFUkVOQ0UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCiAJcHVibGljIFNlYXJjaFBhdHRlcm4gZ2V0QmxhbmtQYXR0ZXJuKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlpbnQgZ2V0TWF0Y2hNb2RlKCkgeworCWZpbmFsIGludCBnZXRNYXRjaE1vZGUoKSB7CiAJCXJldHVybiB0aGlzLm1hdGNoTW9kZTsKIAl9CiAKLQlib29sZWFuIGlzQ2FtZWxDYXNlKCkgeworCWZpbmFsIGJvb2xlYW4gaXNDYW1lbENhc2UoKSB7CiAJCXJldHVybiB0aGlzLmlzQ2FtZWxDYXNlOwogCX0KIAotCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlICgpIHsKKwlmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSAoKSB7CiAJCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZTsKIAl9CiAKLQlib29sZWFuIGlzRXJhc3VyZU1hdGNoKCkgeworCWZpbmFsIGJvb2xlYW4gaXNFcmFzdXJlTWF0Y2goKSB7CiAJCXJldHVybiAodGhpcy5tYXRjaENvbXBhdGliaWxpdHkgJiBSX0VSQVNVUkVfTUFUQ0gpICE9IDA7CiAJfQogCi0JYm9vbGVhbiBpc0VxdWl2YWxlbnRNYXRjaCgpIHsKKwlmaW5hbCBib29sZWFuIGlzRXF1aXZhbGVudE1hdGNoKCkgewogCQlyZXR1cm4gKHRoaXMubWF0Y2hDb21wYXRpYmlsaXR5ICYgUl9FUVVJVkFMRU5UX01BVENIKSAhPSAwOwogCX0KIApAQCAtMTA5LDQyICsxOTEsNDIgQEAKIAkgKiBhbmQgdHlwZSBwYXJhbWV0ZXJzIGZvciBub24tZ2VuZXJpYyBvbmVzLgogCSAqLwogCWNoYXJbXVtdIGV4dHJhY3RNZXRob2RBcmd1bWVudHMoSU1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nW10gYXJndW1lbnRzU2lnbmF0dXJlcyA9IG51bGw7Ci0JCUJpbmRpbmdLZXkga2V5OwotCQlpZiAobWV0aG9kLmlzUmVzb2x2ZWQoKSAmJiAoa2V5ID0gbmV3IEJpbmRpbmdLZXkobWV0aG9kLmdldEtleSgpKSkuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7Ci0JCQlhcmd1bWVudHNTaWduYXR1cmVzID0ga2V5LmdldFR5cGVBcmd1bWVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJSVR5cGVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCQkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewotCQkJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQljaGFyW11bXSBhcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW107Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlhcmd1bWVudHNbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKS50b0NoYXJBcnJheSgpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGFyZ3VtZW50czsKKworCQkvLyBVc2UgYmluZCBrZXkgaWYgdGhlIGVsZW1lbnQgaXMgcmVzb2x2ZWQKKwkJaWYgKG1ldGhvZC5pc1Jlc29sdmVkKCkpIHsKKwkJCUJpbmRpbmdLZXkgYmluZGluZ0tleSA9IG5ldyBCaW5kaW5nS2V5KG1ldGhvZC5nZXRLZXkoKSk7CisJCQlpZiAoYmluZGluZ0tleS5pc1BhcmFtZXRlcml6ZWRNZXRob2QoKSkgeworCQkJCVN0cmluZ1tdIGFyZ3VtZW50c1NpZ25hdHVyZXMgPSBiaW5kaW5nS2V5LmdldFR5cGVBcmd1bWVudHMoKTsKKwkJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzU2lnbmF0dXJlcy5sZW5ndGg7CisJCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQkJY2hhcltdW10gbWV0aG9kQXJndW1lbnRzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJCQkJCW1ldGhvZEFyZ3VtZW50c1tpXSA9IGFyZ3VtZW50c1NpZ25hdHVyZXNbaV0udG9DaGFyQXJyYXkoKTsKKwkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXRob2RBcmd1bWVudHNbaV0sIG5ldyBjaGFyW10geyAnJCcsICcvJyB9LCAnLicpOwogCQkJCQl9CisJCQkJCXJldHVybiBtZXRob2RBcmd1bWVudHM7CiAJCQkJfQogCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCi0JCS8vIFBhcmFtZXRlcml6ZWQgbWV0aG9kCi0JCWlmIChhcmd1bWVudHNTaWduYXR1cmVzICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBhcmd1bWVudHNTaWduYXR1cmVzLmxlbmd0aDsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJY2hhcltdW10gbWV0aG9kQXJndW1lbnRzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQkJCQltZXRob2RBcmd1bWVudHNbaV0gPSBhcmd1bWVudHNTaWduYXR1cmVzW2ldLnRvQ2hhckFycmF5KCk7Ci0JCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXRob2RBcmd1bWVudHNbaV0sIG5ldyBjaGFyW10geyAnJCcsICcvJyB9LCAnLicpOworCQkvLyBUcnkgdG8gZ2V0IHRoZSBhcmd1bWVudCB1c2luZyB0aGUgSmF2YU1vZGVsIGluZm8KKwkJdHJ5IHsKKwkJCUlUeXBlUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpOworCQkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQljaGFyW11bXSBhcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQkJCQkJYXJndW1lbnRzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUocGFyYW1ldGVyc1tpXS5nZXRFbGVtZW50TmFtZSgpLCBmYWxzZSkudG9DaGFyQXJyYXkoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gYXJndW1lbnRzOwogCQkJCX0KLQkJCQlyZXR1cm4gbWV0aG9kQXJndW1lbnRzOwogCQkJfQogCQl9CisJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0xNTIsNyArMjM0LDcgQEAKIAkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHR5cGVBcmd1bWVudHMuCiAJICovCiAJZmluYWwgY2hhcltdW11bXSBnZXRUeXBlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdHlwZUFyZ3VtZW50czsKKwkJcmV0dXJuIHRoaXMudHlwZUFyZ3VtZW50czsKIAl9CiAKIAkvKioKQEAgLTE4MSwxMyArMjYzLDEzIEBACiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzVHlwZVBhcmFtZXRlcnMoKSB7CiAJCXJldHVybiAhaGFzU2lnbmF0dXJlcygpICYmIGhhc1R5cGVBcmd1bWVudHMoKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0d28gc3VmZml4ZXMgYXJlIGNvbXBhdGlibGUuCi0JICogCisJICoKIAkgKiBOb3RlIHRoYXQgb2J2aW91cyBjb21wYXRpYmlsaXR5IHZhbHVlcyBhcyBlcXVhbHMgYW5kIHtAbGluayBJSW5kZXhDb25zdGFudHMjVFlQRV9TVUZGSVh9CiAJICogaGFzIHRvIGJlIHRlc3RlZCBieSBjYWxsZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbWV0aG9kIGNhbGwuLi4KLQkgKiAKKwkgKgogCSAqIEBwYXJhbSB0eXBlU3VmZml4CiAJICogQHBhcmFtIHBhdHRlcm5TdWZmaXgKIAkgKiBAcmV0dXJuIHRydWUgaWYgc3VmZml4ZXMgYXJlIGNvbXBhdGlibGUsIGZhbHNlIG90aGVyd2lzZQpAQCAtMjQwLDcgKzMyMiw3IEBACiAJCQkJfQogCQkJCXJldHVybiBmYWxzZTsKIAkJfQotCQkKKwogCQkvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG1hdGNoIHN1ZmZpeGVzCiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTI1MiwzNSArMzM0LDQ0IEBACiAJCQlvdXRwdXQuYXBwZW5kKHRoaXMudHlwZVNpZ25hdHVyZXNbMF0pOwogCQkJb3V0cHV0LmFwcGVuZCgiXCIsICIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJaWYgKHRoaXMuaXNDYW1lbENhc2UpIHsKLQkJCW91dHB1dC5hcHBlbmQoImNhbWVsIGNhc2UgKyAiKTsgLy8kTk9OLU5MUy0xJAotCQl9CiAJCXN3aXRjaChnZXRNYXRjaE1vZGUoKSkgewotCQkJY2FzZSBSX0VYQUNUX01BVENIIDogCi0JCQkJb3V0cHV0LmFwcGVuZCgiZXhhY3QgbWF0Y2gsIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgUl9FWEFDVF9NQVRDSCA6CisJCQkJb3V0cHV0LmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CiAJCQljYXNlIFJfUFJFRklYX01BVENIIDoKLQkJCQlvdXRwdXQuYXBwZW5kKCJwcmVmaXggbWF0Y2gsIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXQuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CiAJCQljYXNlIFJfUEFUVEVSTl9NQVRDSCA6Ci0JCQkJb3V0cHV0LmFwcGVuZCgicGF0dGVybiBtYXRjaCwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dC5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CiAJCQljYXNlIFJfUkVHRVhQX01BVENIIDoKIAkJCQlvdXRwdXQuYXBwZW5kKCJyZWdleHAgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCiAJCQkJYnJlYWs7CisJCQljYXNlIFJfQ0FNRUxDQVNFX01BVENIIDoKKwkJCQlvdXRwdXQuYXBwZW5kKCJjYW1lbCBjYXNlIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQkJb3V0cHV0LmFwcGVuZCgiY2FtZWwgY2FzZSBzYW1lIHBhcnQgY291bnQgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKQotCQkJb3V0cHV0LmFwcGVuZCgiIGNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwkJCW91dHB1dC5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlLCAiKTsgLy8kTk9OLU5MUy0xJAogCQllbHNlCi0JCQlvdXRwdXQuYXBwZW5kKCIgY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJCQlvdXRwdXQuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlLCAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoKHRoaXMubWF0Y2hDb21wYXRpYmlsaXR5ICYgUl9GVUxMX01BVENIKSAhPSAwKSB7CisJCQlvdXRwdXQuYXBwZW5kKCJnZW5lcmljIGZ1bGwgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCX0KIAkJaWYgKCh0aGlzLm1hdGNoQ29tcGF0aWJpbGl0eSAmIFJfRVJBU1VSRV9NQVRDSCkgIT0gMCkgewotCQkJb3V0cHV0LmFwcGVuZCgiLCBlcmFzdXJlIG9ubHkiKTsgLy8kTk9OLU5MUy0xJAorCQkJb3V0cHV0LmFwcGVuZCgiZ2VuZXJpYyBlcmFzdXJlIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCWlmICgodGhpcy5tYXRjaENvbXBhdGliaWxpdHkgJiBSX0VRVUlWQUxFTlRfTUFUQ0gpICE9IDApIHsKLQkJCW91dHB1dC5hcHBlbmQoIiwgZXF1aXZhbGVudCBvcm9ubHkiKTsgLy8kTk9OLU5MUy0xJAorCQkJb3V0cHV0LmFwcGVuZCgiZ2VuZXJpYyBlcXVpdmFsZW50IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CisJCW91dHB1dC5hcHBlbmQoImZpbmUgZ3JhaW46ICIpOyAvLyROT04tTkxTLTEkCisJCW91dHB1dC5hcHBlbmQoZ2V0RmluZUdyYWluRmxhZ1N0cmluZyh0aGlzLmZpbmVHcmFpbikpOwogCQlyZXR1cm4gb3V0cHV0OwogCX0KKwogCS8qKgogCSAqIEBwYXJhbSB0eXBlQXJndW1lbnRzIFRoZSB0eXBlQXJndW1lbnRzIHRvIHNldC4KIAkgKi8KQEAgLTMwMyw0NiArMzk0LDUwIEBACiAJICogYW5kIHR5cGUgcGFyYW1ldGVycyBmb3Igbm9uLWdlbmVyaWMgb25lcwogCSAqLwogCXZvaWQgc3RvcmVUeXBlU2lnbmF0dXJlc0FuZEFyZ3VtZW50cyhJVHlwZSB0eXBlKSB7Ci0JCUJpbmRpbmdLZXkga2V5OwotCQlpZiAodHlwZS5pc1Jlc29sdmVkKCkgJiYgKGtleSA9IG5ldyBCaW5kaW5nS2V5KHR5cGUuZ2V0S2V5KCkpKS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKLQkJCVN0cmluZyBzaWduYXR1cmUgPSBrZXkudG9TaWduYXR1cmUoKTsKLQkJCXRoaXMudHlwZVNpZ25hdHVyZXMgPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZShzaWduYXR1cmUpOwotCQkJc2V0VHlwZUFyZ3VtZW50cyhVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModGhpcy50eXBlU2lnbmF0dXJlcykpOwotCQl9IGVsc2UgewotCQkJLy8gU2NhbiBoaWVyYWNoeSB0byBzdG9yZSB0eXBlIGFyZ3VtZW50cyBhdCBlYWNoIGxldmVsCi0JCQljaGFyW11bXVtdIHR5cGVQYXJhbWV0ZXJzID0gbmV3IGNoYXJbMTBdW11bXTsKLQkJCWludCBwdHIgPSAtMTsKLQkJCWJvb2xlYW4gaGFzUGFyYW1ldGVycyA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gdHlwZTsKLQkJCQlJVHlwZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBudWxsOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotCQkJCQlpZiAoKytwdHIgPiB0eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZVBhcmFtZXRlcnMsIDAsIHR5cGVQYXJhbWV0ZXJzID0gbmV3IGNoYXJbdHlwZVBhcmFtZXRlcnMubGVuZ3RoKzEwXVtdW10sIDAsIHB0cik7Ci0JCQkJCX0KLQkJCQkJSVR5cGUgcGFyZW50VHlwZSA9IChJVHlwZSkgcGFyZW50OwotCQkJCQlwYXJhbWV0ZXJzID0gcGFyZW50VHlwZS5nZXRUeXBlUGFyYW1ldGVycygpOwotCQkJCQlpZiAocGFyYW1ldGVycyAhPW51bGwpIHsKLQkJCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJaGFzUGFyYW1ldGVycyA9IHRydWU7Ci0JCQkJCQkJdHlwZVBhcmFtZXRlcnNbcHRyXSA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKLQkJCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCi0JCQkJCQkJCXR5cGVQYXJhbWV0ZXJzW3B0cl1baV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKS50b0NoYXJBcnJheSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJaWYgKHR5cGUuaXNSZXNvbHZlZCgpKSB7CisJCQlCaW5kaW5nS2V5IGJpbmRpbmdLZXkgPSBuZXcgQmluZGluZ0tleSh0eXBlLmdldEtleSgpKTsKKwkJCWlmIChiaW5kaW5nS2V5LmlzUGFyYW1ldGVyaXplZFR5cGUoKSB8fCBiaW5kaW5nS2V5LmlzUmF3VHlwZSgpKSB7CisJCQkJU3RyaW5nIHNpZ25hdHVyZSA9IGJpbmRpbmdLZXkudG9TaWduYXR1cmUoKTsKKwkJCQl0aGlzLnR5cGVTaWduYXR1cmVzID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUoc2lnbmF0dXJlKTsKKwkJCQlzZXRUeXBlQXJndW1lbnRzKFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyh0aGlzLnR5cGVTaWduYXR1cmVzKSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBTY2FuIGhpZXJhcmNoeSB0byBzdG9yZSB0eXBlIGFyZ3VtZW50cyBhdCBlYWNoIGxldmVsCisJCWNoYXJbXVtdW10gdHlwZVBhcmFtZXRlcnMgPSBuZXcgY2hhclsxMF1bXVtdOworCQlpbnQgcHRyID0gLTE7CisJCWJvb2xlYW4gaGFzUGFyYW1ldGVycyA9IGZhbHNlOworCQl0cnkgeworCQkJSUphdmFFbGVtZW50IHBhcmVudCA9IHR5cGU7CisJCQlJVHlwZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBudWxsOworCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCQkJaWYgKCsrcHRyID4gdHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZVBhcmFtZXRlcnMsIDAsIHR5cGVQYXJhbWV0ZXJzID0gbmV3IGNoYXJbdHlwZVBhcmFtZXRlcnMubGVuZ3RoKzEwXVtdW10sIDAsIHB0cik7CiAJCQkJfQorCQkJCUlUeXBlIHBhcmVudFR5cGUgPSAoSVR5cGUpIHBhcmVudDsKKwkJCQlwYXJhbWV0ZXJzID0gcGFyZW50VHlwZS5nZXRUeXBlUGFyYW1ldGVycygpOworCQkJCWlmIChwYXJhbWV0ZXJzICE9bnVsbCkgeworCQkJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJCQkJCWlmIChsZW5ndGggPiAwKSB7CisJCQkJCQloYXNQYXJhbWV0ZXJzID0gdHJ1ZTsKKwkJCQkJCXR5cGVQYXJhbWV0ZXJzW3B0cl0gPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCisJCQkJCQkJdHlwZVBhcmFtZXRlcnNbcHRyXVtpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKHBhcmFtZXRlcnNbaV0uZ2V0RWxlbWVudE5hbWUoKSwgZmFsc2UpLnRvQ2hhckFycmF5KCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwogCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBTdG9yZSB0eXBlIGFyZ3VtZW50cyBpZiBhbnkKLQkJCWlmIChoYXNQYXJhbWV0ZXJzKSB7Ci0JCQkJaWYgKCsrcHRyIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoKQotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVQYXJhbWV0ZXJzLCAwLCB0eXBlUGFyYW1ldGVycyA9IG5ldyBjaGFyW3B0cl1bXVtdLCAwLCBwdHIpOwotCQkJCXNldFR5cGVBcmd1bWVudHModHlwZVBhcmFtZXRlcnMpOwotCQkJfQorCQl9CisJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBTdG9yZSB0eXBlIGFyZ3VtZW50cyBpZiBhbnkKKwkJaWYgKGhhc1BhcmFtZXRlcnMpIHsKKwkJCWlmICgrK3B0ciA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVQYXJhbWV0ZXJzLCAwLCB0eXBlUGFyYW1ldGVycyA9IG5ldyBjaGFyW3B0cl1bXVtdLCAwLCBwdHIpOworCQkJc2V0VHlwZUFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycyk7CiAJCX0KIAl9CiAJcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTG9jYWxWYXJpYWJsZUxvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTG9jYWxWYXJpYWJsZUxvY2F0b3IuamF2YQppbmRleCA3NDk4NGZjLi5hOTBjODhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0xvY2FsVmFyaWFibGVMb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Mb2NhbFZhcmlhYmxlTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDEzICsyOCwxMyBAQAogCQkvLyBtdXN0IGJlIGEgd3JpdGUgb25seSBhY2Nlc3Mgd2l0aCBhbiBpbml0aWFsaXplcgogCQlpZiAodGhpcy5wYXR0ZXJuLndyaXRlQWNjZXNzICYmICF0aGlzLnBhdHRlcm4ucmVhZEFjY2VzcyAmJiBub2RlLmluaXRpYWxpemF0aW9uICE9IG51bGwpCiAJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsIG5vZGUubmFtZSkpCi0JCQkJcmVmZXJlbmNlc0xldmVsID0gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJcmVmZXJlbmNlc0xldmVsID0gdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKIAogCWludCBkZWNsYXJhdGlvbnNMZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CiAJaWYgKHRoaXMucGF0dGVybi5maW5kRGVjbGFyYXRpb25zKQogCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsIG5vZGUubmFtZSkpCiAJCQlpZiAobm9kZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IGdldExvY2FsVmFyaWFibGUoKS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KQotCQkJCWRlY2xhcmF0aW9uc0xldmVsID0gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOwogCiAJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgcmVmZXJlbmNlc0xldmVsID49IGRlY2xhcmF0aW9uc0xldmVsID8gcmVmZXJlbmNlc0xldmVsIDogZGVjbGFyYXRpb25zTGV2ZWwpOyAvLyB1c2UgdGhlIHN0cm9uZ2VyIG1hdGNoCiB9CkBAIC01NywxMCArNTcsMTMgQEAKIAkJb2Zmc2V0ID0gbG9jYWxWYXJpYWJsZS5uYW1lU3RhcnQ7CiAJCWxlbmd0aCA9IGxvY2FsVmFyaWFibGUubmFtZUVuZC1vZmZzZXQrMTsKIAkJZWxlbWVudCA9IGxvY2FsVmFyaWFibGU7CisJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0RlY2xhcmF0aW9uTWF0Y2goZWxlbWVudCwgbnVsbCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoKTsKKwkJbG9jYXRvci5yZXBvcnQodGhpcy5tYXRjaCk7CisJCXJldHVybjsKIAl9CiAJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCW1hdGNoID0gbG9jYXRvci5uZXdMb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCByZWZlcmVuY2UpOwotCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0xvY2FsVmFyaWFibGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIHJlZmVyZW5jZSk7CisJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCX0KIH0KIHByb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CkBAIC03OSw3ICs4Miw3IEBACiAJcmV0dXJuIElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTsKIH0KIHB1YmxpYyBpbnQgcmVzb2x2ZUxldmVsKEFTVE5vZGUgcG9zc2libGVsTWF0Y2hpbmdOb2RlKSB7Ci0JaWYgKHRoaXMucGF0dGVybi5maW5kUmVmZXJlbmNlcykKKwlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzIHx8IHRoaXMucGF0dGVybi5maW5lR3JhaW4gIT0gMCkKIAkJaWYgKHBvc3NpYmxlbE1hdGNoaW5nTm9kZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpCiAJCQlyZXR1cm4gcmVzb2x2ZUxldmVsKChOYW1lUmVmZXJlbmNlKSBwb3NzaWJsZWxNYXRjaGluZ05vZGUpOwogCWlmIChwb3NzaWJsZWxNYXRjaGluZ05vZGUgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Mb2NhbFZhcmlhYmxlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Mb2NhbFZhcmlhYmxlUGF0dGVybi5qYXZhCmluZGV4IDk4Njk0MTQuLjNiMmIwNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTG9jYWxWYXJpYWJsZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0xvY2FsVmFyaWFibGVQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMTEgKzI0LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZVBhdHRlcm4gZXh0ZW5kcyBWYXJpYWJsZVBhdHRlcm4gewotCQorCiBMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGU7CiAKLXB1YmxpYyBMb2NhbFZhcmlhYmxlUGF0dGVybihib29sZWFuIGZpbmREZWNsYXJhdGlvbnMsIGJvb2xlYW4gcmVhZEFjY2VzcywgYm9vbGVhbiB3cml0ZUFjY2VzcywgTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlLCBpbnQgbWF0Y2hSdWxlKSB7Ci0Jc3VwZXIoTE9DQUxfVkFSX1BBVFRFUk4sIGZpbmREZWNsYXJhdGlvbnMsIHJlYWRBY2Nlc3MsIHdyaXRlQWNjZXNzLCBsb2NhbFZhcmlhYmxlLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwgbWF0Y2hSdWxlKTsKK3B1YmxpYyBMb2NhbFZhcmlhYmxlUGF0dGVybihMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hSdWxlKSB7CisJc3VwZXIoTE9DQUxfVkFSX1BBVFRFUk4sIGxvY2FsVmFyaWFibGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpLCBsaW1pdFRvLCBtYXRjaFJ1bGUpOwogCXRoaXMubG9jYWxWYXJpYWJsZSA9IGxvY2FsVmFyaWFibGU7CiB9CiBwdWJsaWMgdm9pZCBmaW5kSW5kZXhNYXRjaGVzKEluZGV4IGluZGV4LCBJbmRleFF1ZXJ5UmVxdWVzdG9yIHJlcXVlc3RvciwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CkBAIC0zNyw3ICszNyw3IEBACiAJU3RyaW5nIHJlbGF0aXZlUGF0aDsKICAgICBpZiAocm9vdC5pc0FyY2hpdmUoKSkgewogICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKXRoaXMubG9jYWxWYXJpYWJsZS5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuVFlQRSk7Ci0gICAgICAgIHJlbGF0aXZlUGF0aCA9ICh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLycpKS5yZXBsYWNlKCcuJywgJy8nKSArIFN1ZmZpeENvbnN0YW50cy5TVUZGSVhfU1RSSU5HX2NsYXNzOworICAgICAgICByZWxhdGl2ZVBhdGggPSAodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKSkucmVwbGFjZSgnLicsICcvJykgKyBTdWZmaXhDb25zdGFudHMuU1VGRklYX1NUUklOR19jbGFzczsKICAgICAgICAgZG9jdW1lbnRQYXRoID0gcm9vdC5nZXRQYXRoKCkgKyBJSmF2YVNlYXJjaFNjb3BlLkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiArIHJlbGF0aXZlUGF0aDsKICAgICB9IGVsc2UgewogCQlJUGF0aCBwYXRoID0gdGhpcy5sb2NhbFZhcmlhYmxlLmdldFBhdGgoKTsKQEAgLTUxLDExICs1MSwxMSBAQAogCQkvLyBOb3RlIHRoYXQgcmVxdWVzdG9yIGhhcyB0byB2ZXJpZnkgaWYgbmVlZGVkIHdoZXRoZXIgdGhlIGRvY3VtZW50IHZpb2xhdGVzIHRoZSBhY2Nlc3MgcmVzdHJpY3Rpb24gb3Igbm90CiAJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzID0gamF2YVNlYXJjaFNjb3BlLmdldEFjY2Vzc1J1bGVTZXQocmVsYXRpdmVQYXRoLCBpbmRleC5jb250YWluZXJQYXRoKTsKIAkJaWYgKGFjY2VzcyAhPSBKYXZhU2VhcmNoU2NvcGUuTk9UX0VOQ0xPU0VEKSB7IC8vIHNjb3BlIGVuY2xvc2VzIHRoZSBwYXRoCi0JCQlpZiAoIXJlcXVlc3Rvci5hY2NlcHRJbmRleE1hdGNoKGRvY3VtZW50UGF0aCwgdGhpcywgcGFydGljaXBhbnQsIGFjY2VzcykpIAorCQkJaWYgKCFyZXF1ZXN0b3IuYWNjZXB0SW5kZXhNYXRjaChkb2N1bWVudFBhdGgsIHRoaXMsIHBhcnRpY2lwYW50LCBhY2Nlc3MpKQogCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwogCQl9CiAJfSBlbHNlIGlmIChzY29wZS5lbmNsb3Nlcyhkb2N1bWVudFBhdGgpKSB7Ci0JCWlmICghcmVxdWVzdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLCB0aGlzLCBwYXJ0aWNpcGFudCwgbnVsbCkpIAorCQlpZiAoIXJlcXVlc3Rvci5hY2NlcHRJbmRleE1hdGNoKGRvY3VtZW50UGF0aCwgdGhpcywgcGFydGljaXBhbnQsIG51bGwpKQogCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEKaW5kZXggNDE5ZjM2Zi4uOTNmOTg3ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDYgKzIxLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CkBAIC0zNSw3ICszNyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKQEAgLTQ4LDcgKzQ5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZJbnRWYWx1ZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU2ltcGxlTG9va3VwVGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuU2ltcGxlU2V0OwpAQCAtODAsNyArODAsNyBAQAogCiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQVRfT05DRTsKIHN0YXRpYyB7Ci0JbG9uZyBtYXhNZW1vcnkgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5tYXhNZW1vcnkoKTsJCQorCWxvbmcgbWF4TWVtb3J5ID0gUnVudGltZS5nZXRSdW50aW1lKCkubWF4TWVtb3J5KCk7CiAJaW50IHJhdGlvID0gKGludCkgTWF0aC5yb3VuZCgoKGRvdWJsZSkgbWF4TWVtb3J5KSAvICg2NCAqIDB4MTAwMDAwKSk7CiAJc3dpdGNoIChyYXRpbykgewogCQljYXNlIDA6CkBAIC0xNDQsNDYgKzE0NCw3IEBACiAvLyBDYWNoZSBmb3IgbWV0aG9kIGhhbmRsZXMKIEhhc2hTZXQgbWV0aG9kSGFuZGxlczsKIAotLyoqCi0gKiBBbiBhc3QgdmlzaXRvciB0aGF0IHZpc2l0cyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsRGVjbGFyYXRpb25WaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7Ci0JQmluZGluZyBlbmNsb3NpbmdFbGVtZW50QmluZGluZzsKLQlNYXRjaGluZ05vZGVTZXQgbm9kZVNldDsKLQlIYXNodGFibGVPZkludFZhbHVlcyBvY2N1cnJlbmNlc0NvdW50cyA9IG5ldyBIYXNodGFibGVPZkludFZhbHVlcygpOyAvLyBrZXkgPSBjbGFzcyBuYW1lIChjaGFyW10pLCB2YWx1ZSA9IG9jY3VycmVuY2VDb3VudCAoaW50KQotCXB1YmxpYyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvcihJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgQmluZGluZyBlbmNsb3NpbmdFbGVtZW50QmluZGluZywgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKLQkJdGhpcy5lbmNsb3NpbmdFbGVtZW50ID0gZW5jbG9zaW5nRWxlbWVudDsKLQkJdGhpcy5lbmNsb3NpbmdFbGVtZW50QmluZGluZyA9IGVuY2xvc2luZ0VsZW1lbnRCaW5kaW5nOwotCQl0aGlzLm5vZGVTZXQgPSBub2RlU2V0OwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHVudXNlZCkgewotCQl0cnkgewotCQkJY2hhcltdIHNpbXBsZU5hbWU7Ci0JCQlpZiAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsJCQkJCi0JCQkJc2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKLQkJCX0gZWxzZSB7Ci0JCQkJc2ltcGxlTmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5uYW1lOwotCQkJfQotCQkJaW50IG9jY3VycmVuY2VDb3VudCA9IG9jY3VycmVuY2VzQ291bnRzLmdldChzaW1wbGVOYW1lKTsKLQkJCWlmIChvY2N1cnJlbmNlQ291bnQgPT0gSGFzaHRhYmxlT2ZJbnRWYWx1ZXMuTk9fVkFMVUUpIHsKLQkJCQlvY2N1cnJlbmNlQ291bnQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlvY2N1cnJlbmNlQ291bnQgPSBvY2N1cnJlbmNlQ291bnQgKyAxOwotCQkJfQotCQkJb2NjdXJyZW5jZXNDb3VudHMucHV0KHNpbXBsZU5hbWUsIG9jY3VycmVuY2VDb3VudCk7Ci0JCQlpZiAoKHR5cGVEZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5Jc0Fub255bW91c1R5cGUpICE9IDApIHsJCQkJCi0JCQkJcmVwb3J0TWF0Y2hpbmcodHlwZURlY2xhcmF0aW9uLCB0aGlzLmVuY2xvc2luZ0VsZW1lbnQsIC0xLCBub2RlU2V0LCBvY2N1cnJlbmNlQ291bnQpOwotCQkJfSBlbHNlIHsKLQkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkodHlwZURlY2xhcmF0aW9uKTsKLQkJCQlyZXBvcnRNYXRjaGluZyh0eXBlRGVjbGFyYXRpb24sIHRoaXMuZW5jbG9zaW5nRWxlbWVudCwgbGV2ZWwgIT0gbnVsbCA/IGxldmVsLmludFZhbHVlKCkgOiAtMSwgbm9kZVNldCwgb2NjdXJyZW5jZUNvdW50KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgbWVtYmVycyBhcyB0aGlzIHdhcyBkb25lIGR1cmluZyByZXBvcnRNYXRjaGluZyguLi4pCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQorcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNlYXJjaFBhY2thZ2VEZWNsYXJhdGlvbjsKIAogcHVibGljIHN0YXRpYyBjbGFzcyBXb3JraW5nQ29weURvY3VtZW50IGV4dGVuZHMgSmF2YVNlYXJjaERvY3VtZW50IHsKIAlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weTsKQEAgLTE5Niw3ICsxNTcsNyBAQAogCQlyZXR1cm4gIldvcmtpbmdDb3B5RG9jdW1lbnQgZm9yICIgKyBnZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKIAl9CiB9Ci0JCisKIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JhcHBlZENvcmVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MzU0MzI5ODcwMTI2MTIxMjEyTDsgLy8gYmFja3dhcmQgY29tcGF0aWJsZQogCXB1YmxpYyBDb3JlRXhjZXB0aW9uIGNvcmVFeGNlcHRpb247CkBAIC0yMDUsOSArMTY2LDExIEBACiAJfQogfQogCi1wdWJsaWMgc3RhdGljIFNlYXJjaERvY3VtZW50W10gYWRkV29ya2luZ0NvcGllcyhJbnRlcm5hbFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoRG9jdW1lbnRbXSBpbmRleE1hdGNoZXMsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXRbXSBjb3BpZXMsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7CitwdWJsaWMgc3RhdGljIFNlYXJjaERvY3VtZW50W10gYWRkV29ya2luZ0NvcGllcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0W10gY29waWVzLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgeworCWlmIChjb3BpZXMgPT0gbnVsbCkgcmV0dXJuIGluZGV4TWF0Y2hlczsKIAkvLyB3b3JraW5nIGNvcGllcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0JSGFzaE1hcCB3b3JraW5nQ29weURvY3VtZW50cyA9IHdvcmtpbmdDb3BpZXNUaGF0Q2FuU2VlRm9jdXMoY29waWVzLCBwYXR0ZXJuLmZvY3VzLCBwYXR0ZXJuLmlzUG9seW1vcnBoaWNTZWFyY2goKSwgcGFydGljaXBhbnQpOworCUhhc2hNYXAgd29ya2luZ0NvcHlEb2N1bWVudHMgPSB3b3JraW5nQ29waWVzVGhhdENhblNlZUZvY3VzKGNvcGllcywgcGF0dGVybiwgcGFydGljaXBhbnQpOworCWlmICh3b3JraW5nQ29weURvY3VtZW50cy5zaXplKCkgPT0gMCkgcmV0dXJuIGluZGV4TWF0Y2hlczsKIAlTZWFyY2hEb2N1bWVudFtdIG1hdGNoZXMgPSBudWxsOwogCWludCBsZW5ndGggPSBpbmRleE1hdGNoZXMubGVuZ3RoOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTIzNywyNSArMjAwLDIwIEBACiAJcmV0dXJuIG1hdGNoZXM7CiB9CiAKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb2N1cyhJbnRlcm5hbFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFFbGVtZW50IGZvY3VzKSB7CitwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9jdXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YUVsZW1lbnQgZm9jdXMpIHsKIAlwYXR0ZXJuLmZvY3VzID0gZm9jdXM7CiB9CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcGllcyB0aGF0IGNhbiBzZWUgdGhlIGdpdmVuIGZvY3VzLgogICovCi1wcml2YXRlIHN0YXRpYyBIYXNoTWFwIHdvcmtpbmdDb3BpZXNUaGF0Q2FuU2VlRm9jdXMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdFtdIGNvcGllcywgSUphdmFFbGVtZW50IGZvY3VzLCBib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2gsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Citwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHdvcmtpbmdDb3BpZXNUaGF0Q2FuU2VlRm9jdXMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdFtdIGNvcGllcywgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewogCWlmIChjb3BpZXMgPT0gbnVsbCkgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JaWYgKGZvY3VzICE9IG51bGwpIHsKLQkJd2hpbGUgKCEoZm9jdXMgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpICYmICEoZm9jdXMgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSkgewotCQkJZm9jdXMgPSBmb2N1cy5nZXRQYXJlbnQoKTsKLQkJfQotCX0KIAlIYXNoTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CiAJZm9yIChpbnQgaT0wLCBsZW5ndGggPSBjb3BpZXMubGVuZ3RoOyBpPGxlbmd0aDsgaSsrKSB7CiAJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBjb3BpZXNbaV07CiAJCUlQYXRoIHByb2plY3RPckphciA9IE1hdGNoTG9jYXRvci5nZXRQcm9qZWN0T3JKYXIod29ya2luZ0NvcHkpLmdldFBhdGgoKTsKLQkJaWYgKGZvY3VzID09IG51bGwgfHwgSW5kZXhTZWxlY3Rvci5jYW5TZWVGb2N1cyhmb2N1cywgaXNQb2x5bW9ycGhpY1NlYXJjaCwgcHJvamVjdE9ySmFyKSkgeworCQlpZiAocGF0dGVybi5mb2N1cyA9PSBudWxsIHx8IEluZGV4U2VsZWN0b3IuY2FuU2VlRm9jdXMocGF0dGVybiwgcHJvamVjdE9ySmFyKSkgewogCQkJcmVzdWx0LnB1dCgKIAkJCQl3b3JraW5nQ29weS5nZXRQYXRoKCkudG9TdHJpbmcoKSwKIAkJCQluZXcgV29ya2luZ0NvcHlEb2N1bWVudCh3b3JraW5nQ29weSwgcGFydGljaXBhbnQpCkBAIC0yNjYsNyArMjI0LDcgQEAKIH0KIAogcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyKElUeXBlIHR5cGUpIHsKLQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IHR5cGUuZ2V0Q2xhc3NGaWxlKCk7IAorCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdHlwZS5nZXRDbGFzc0ZpbGUoKTsKIAlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAlpZiAoY2xhc3NGaWxlLmlzT3BlbigpKQogCQlyZXR1cm4gKENsYXNzRmlsZVJlYWRlcikgbWFuYWdlci5nZXRJbmZvKHR5cGUpOwpAQCAtMjc1LDcgKzIzMyw3IEBACiAJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGtnLmdldFBhcmVudCgpOwogCXRyeSB7CiAJCWlmICghcm9vdC5pc0FyY2hpdmUoKSkKLQkJCXJldHVybiBVdGlsLm5ld0NsYXNzRmlsZVJlYWRlcih0eXBlLmdldFJlc291cmNlKCkpOworCQkJcmV0dXJuIFV0aWwubmV3Q2xhc3NGaWxlUmVhZGVyKCgoSmF2YUVsZW1lbnQpIHR5cGUpLnJlc291cmNlKCkpOwogCiAJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7CiAJCXRyeSB7CkBAIC0yOTksMjkgKzI1NywxMCBAQAogCXJldHVybiBudWxsOwogfQogCi1wdWJsaWMgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlQW5kUGF0dGVybihmaW5hbCBTZWFyY2hQYXR0ZXJuIGxlZnRQYXR0ZXJuLCBmaW5hbCBTZWFyY2hQYXR0ZXJuIHJpZ2h0UGF0dGVybikgewotCXJldHVybiBuZXcgQW5kUGF0dGVybigwLypubyBraW5kKi8sIDAvKm5vIHJ1bGUqLykgewotCQlTZWFyY2hQYXR0ZXJuIGN1cnJlbnQgPSBsZWZ0UGF0dGVybjsKLQkJcHVibGljIFNlYXJjaFBhdHRlcm4gY3VycmVudFBhdHRlcm4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0JCXByb3RlY3RlZCBib29sZWFuIGhhc05leHRRdWVyeSgpIHsKLQkJCWlmICh0aGlzLmN1cnJlbnQgPT0gbGVmdFBhdHRlcm4pIHsKLQkJCQl0aGlzLmN1cnJlbnQgPSByaWdodFBhdHRlcm47Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7IAotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHJlc2V0UXVlcnkoKSB7Ci0JCQl0aGlzLmN1cnJlbnQgPSBsZWZ0UGF0dGVybjsKLQkJfQotCX07Ci19Ci0KIC8qKgogICogUXVlcnkgYSBnaXZlbiBpbmRleCBmb3IgbWF0Y2hpbmcgZW50cmllcy4gQXNzdW1lcyB0aGUgc2VuZGVyIGhhcyBvcGVuZWQgdGhlIGluZGV4IGFuZCB3aWxsIGNsb3NlIHdoZW4gZmluaXNoZWQuCiAgKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaW5kSW5kZXhNYXRjaGVzKEludGVybmFsU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJbmRleCBpbmRleCwgSW5kZXhRdWVyeVJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CitwdWJsaWMgc3RhdGljIHZvaWQgZmluZEluZGV4TWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIEluZGV4IGluZGV4LCBJbmRleFF1ZXJ5UmVxdWVzdG9yIHJlcXVlc3RvciwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlwYXR0ZXJuLmZpbmRJbmRleE1hdGNoZXMoaW5kZXgsIHJlcXVlc3RvciwgcGFydGljaXBhbnQsIHNjb3BlLCBtb25pdG9yKTsKIH0KIApAQCAtMzMyLDcgKzI3MSw3IEBACiAJcmV0dXJuIGVsZW1lbnQ7CiB9CiAKLXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IHByb2plY3RPckphckZvY3VzKEludGVybmFsU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7CitwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBwcm9qZWN0T3JKYXJGb2N1cyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKIAlyZXR1cm4gcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZm9jdXMgPT0gbnVsbCA/IG51bGwgOiBnZXRQcm9qZWN0T3JKYXIocGF0dGVybi5mb2N1cyk7CiB9CiAKQEAgLTM0MSwxMyArMjgwLDIwIEBACiAJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwKIAlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQorCiAJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAl0aGlzLnBhdHRlcm5Mb2NhdG9yID0gUGF0dGVybkxvY2F0b3IucGF0dGVybkxvY2F0b3IodGhpcy5wYXR0ZXJuKTsKLQl0aGlzLm1hdGNoQ29udGFpbmVyID0gdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaENvbnRhaW5lcigpOworCXRoaXMubWF0Y2hDb250YWluZXIgPSB0aGlzLnBhdHRlcm5Mb2NhdG9yID09IG51bGwgPyAwIDogdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaENvbnRhaW5lcigpOwogCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwogCXRoaXMuc2NvcGUgPSBzY29wZTsKIAl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKKwlpZiAocGF0dGVybiBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4pIHsKKwkJdGhpcy5zZWFyY2hQYWNrYWdlRGVjbGFyYXRpb24gPSB0cnVlOworCX0gZWxzZSBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9yUGF0dGVybikgeworCQl0aGlzLnNlYXJjaFBhY2thZ2VEZWNsYXJhdGlvbiA9ICgoT3JQYXR0ZXJuKXBhdHRlcm4pLmhhc1BhY2thZ2VEZWNsYXJhdGlvbigpOworCX0gZWxzZSB7CisJCXRoaXMuc2VhcmNoUGFja2FnZURlY2xhcmF0aW9uID0gZmFsc2U7CisJfQogfQogLyoqCiAgKiBBZGQgYW4gYWRkaXRpb25hbCBiaW5hcnkgdHlwZQpAQCAtNDA5LDcgKzM1NSw3IEBACiAJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCwgYWNjZXNzUmVzdHJpY3Rpb24pOwogCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOwogCX0KLX0JCit9CiBwcm90ZWN0ZWQgUGFyc2VyIGJhc2ljUGFyc2VyKCkgewogCWlmICh0aGlzLmJhc2ljUGFyc2VyID09IG51bGwpIHsKIAkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9CkBAIC00MzQsNyArMzgwLDcgQEAKIAlpZiAoYmluYXJ5VHlwZSA9PSBudWxsKSB7CiAJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoQ2xhc3NGaWxlKSB0eXBlLmdldENsYXNzRmlsZSgpOwogCQl0cnkgewotCQkJYmluYXJ5VHlwZSA9IGdldEJpbmFyeUluZm8oY2xhc3NGaWxlLCBjbGFzc0ZpbGUuZ2V0UmVzb3VyY2UoKSk7CisJCQliaW5hcnlUeXBlID0gZ2V0QmluYXJ5SW5mbyhjbGFzc0ZpbGUsIGNsYXNzRmlsZS5yZXNvdXJjZSgpKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgewogCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7CkBAIC00NjEsMTMgKzQwNywxMyBAQAogCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gbGFzdERvdCA9PSAtMSA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUiA6IGZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkudG9DaGFyQXJyYXkoKTsKIAljaGFyW10gc2ltcGxlTmFtZSA9IGZvY3VzVHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CiAKLQlTdXBlclR5cGVOYW1lc0NvbGxlY3RvciBzdXBlclR5cGVOYW1lc0NvbGxlY3RvciA9IAorCVN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yIHN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yID0KIAkJbmV3IFN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yKAotCQkJdGhpcy5wYXR0ZXJuLCAKKwkJCXRoaXMucGF0dGVybiwKIAkJCXNpbXBsZU5hbWUsCiAJCQlxdWFsaWZpY2F0aW9uLAogCQkJbmV3IE1hdGNoTG9jYXRvcih0aGlzLnBhdHRlcm4sIHRoaXMucmVxdWVzdG9yLCB0aGlzLnNjb3BlLCB0aGlzLnByb2dyZXNzTW9uaXRvciksIC8vIGNsb25lIE1hdGNoTG9jYXRvciBzbyB0aGF0IGl0IGhhcyBubyBzaWRlIGVmZmVjdAotCQkJZm9jdXNUeXBlLCAKKwkJCWZvY3VzVHlwZSwKIAkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yKTsKIAl0cnkgewogCQl0aGlzLmFsbFN1cGVyVHlwZU5hbWVzID0gc3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IuY29sbGVjdCgpOwpAQCAtNDc3LDcgKzQyMyw3IEBACiAJcmV0dXJuIHRoaXMuYWxsU3VwZXJUeXBlTmFtZXM7CiB9CiAvKioKLSAqIENyZWF0ZXMgYW4gSU1ldGhvZCBmcm9tIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIHR5cGUuIAorICogQ3JlYXRlcyBhbiBJTWV0aG9kIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBhbmQgdHlwZS4KICAqLwogcHJvdGVjdGVkIElKYXZhRWxlbWVudCBjcmVhdGVIYW5kbGUoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIElKYXZhRWxlbWVudCBwYXJlbnQpIHsKIAlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkpIHJldHVybiBwYXJlbnQ7CkBAIC00OTAsMzUgKzQzNiw0OCBAQAogCQkvLyBmYWxsIHRocnUgaWYgaXRzIGEgY29uc3RydWN0b3Igd2l0aCBhIHN5bnRoZXRpYyBhcmd1bWVudC4uLiBmaW5kIGl0IHRoZSBzbG93ZXIgd2F5CiAJCUNsYXNzRmlsZVJlYWRlciByZWFkZXIgPSBjbGFzc0ZpbGVSZWFkZXIodHlwZSk7CiAJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJSUJpbmFyeU1ldGhvZFtdIG1ldGhvZHMgPSByZWFkZXIuZ2V0TWV0aG9kcygpOwotCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJCS8vIGJ1aWxkIGFyZ3VtZW50cyBuYW1lcwotCQkJCWJvb2xlYW4gZmlyc3RJc1N5bnRoZXRpYyA9IGZhbHNlOwotCQkJCWlmIChyZWFkZXIuaXNNZW1iZXIoKSAmJiBtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFGbGFncy5pc1N0YXRpYyhyZWFkZXIuZ2V0TW9kaWZpZXJzKCkpKSB7IC8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDgyNjEKLQkJCQkJZmlyc3RJc1N5bnRoZXRpYyA9IHRydWU7Ci0JCQkJCWFyZ0NvdW50Kys7Ci0JCQkJfQotCQkJCWNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzID0gbmV3IGNoYXJbYXJnQ291bnRdW107Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7Ci0JCQkJCWNoYXJbXSB0eXBlTmFtZSA9IG51bGw7Ci0JCQkJCWlmIChpID09IDAgJiYgZmlyc3RJc1N5bnRoZXRpYykgewotCQkJCQkJdHlwZU5hbWUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOwotCQkJCQl9IGVsc2UgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBhcmd1bWVudHNbZmlyc3RJc1N5bnRoZXRpYyA/IGkgLSAxIDogaV0udHlwZTsKLQkJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYuZ2V0VHlwZU5hbWUoKSwgJy4nKTsKLQkJCQkJCWZvciAoaW50IGsgPSAwLCBkaW0gPSB0eXBlUmVmLmRpbWVuc2lvbnMoKTsgayA8IGRpbTsgaysrKQotCQkJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsIG5ldyBjaGFyW10geydbJywgJ10nfSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKLQkJCQkJCS8vIGludmFsaWQgdHlwZSBuYW1lCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlhcmd1bWVudFR5cGVOYW1lc1tpXSA9IHR5cGVOYW1lOwotCQkJCX0KLQkJCQkKLQkJCQkvLyByZXR1cm4gYmluYXJ5IG1ldGhvZAotCQkJCXJldHVybiBjcmVhdGVCaW5hcnlNZXRob2RIYW5kbGUodHlwZSwgbWV0aG9kLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVOYW1lcyk7CisJCQkvLyBidWlsZCBhcmd1bWVudHMgbmFtZXMKKwkJCWJvb2xlYW4gZmlyc3RJc1N5bnRoZXRpYyA9IGZhbHNlOworCQkJaWYgKHJlYWRlci5pc01lbWJlcigpICYmIG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIUZsYWdzLmlzU3RhdGljKHJlYWRlci5nZXRNb2RpZmllcnMoKSkpIHsgLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00ODI2MQorCQkJCWZpcnN0SXNTeW50aGV0aWMgPSB0cnVlOworCQkJCWFyZ0NvdW50Kys7CiAJCQl9CisJCQljaGFyW11bXSBhcmd1bWVudFR5cGVOYW1lcyA9IG5ldyBjaGFyW2FyZ0NvdW50XVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7CisJCQkJY2hhcltdIHR5cGVOYW1lID0gbnVsbDsKKwkJCQlpZiAoaSA9PSAwICYmIGZpcnN0SXNTeW50aGV0aWMpIHsKKwkJCQkJdHlwZU5hbWUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkJCX0gZWxzZSBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gYXJndW1lbnRzW2ZpcnN0SXNTeW50aGV0aWMgPyBpIC0gMSA6IGldLnR5cGU7CisJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVSZWYuZ2V0VHlwZU5hbWUoKSwgJy4nKTsKKwkJCQkJZm9yIChpbnQgayA9IDAsIGRpbSA9IHR5cGVSZWYuZGltZW5zaW9ucygpOyBrIDwgZGltOyBrKyspCisJCQkJCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHR5cGVOYW1lLCBuZXcgY2hhcltdIHsnWycsICddJ30pOworCQkJCX0KKwkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQkJCQkvLyBpbnZhbGlkIHR5cGUgbmFtZQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJYXJndW1lbnRUeXBlTmFtZXNbaV0gPSB0eXBlTmFtZTsKKwkJCX0KKwkJCS8vIHJldHVybiBiaW5hcnkgbWV0aG9kCisJCQlJTWV0aG9kIGJpbmFyeU1ldGhvZCA9IGNyZWF0ZUJpbmFyeU1ldGhvZEhhbmRsZSh0eXBlLCBtZXRob2Quc2VsZWN0b3IsIGFyZ3VtZW50VHlwZU5hbWVzKTsKKwkJCWlmIChiaW5hcnlNZXRob2QgPT0gbnVsbCkgeworCQkJCS8vIHdoZW4gZmlyc3QgYXR0ZW1wdCBmYWlscywgdHJ5IHdpdGggc2ltaWxhciBtYXRjaGVzIGlmIGFueS4uLgorCQkJCVBvc3NpYmxlTWF0Y2ggc2ltaWxhck1hdGNoID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5nZXRTaW1pbGFyTWF0Y2goKTsKKwkJCQl3aGlsZSAoc2ltaWxhck1hdGNoICE9IG51bGwpIHsKKwkJCQkJdHlwZSA9ICgoQ2xhc3NGaWxlKXNpbWlsYXJNYXRjaC5vcGVuYWJsZSkuZ2V0VHlwZSgpOworCQkJCQliaW5hcnlNZXRob2QgPSBjcmVhdGVCaW5hcnlNZXRob2RIYW5kbGUodHlwZSwgbWV0aG9kLnNlbGVjdG9yLCBhcmd1bWVudFR5cGVOYW1lcyk7CisJCQkJCWlmIChiaW5hcnlNZXRob2QgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGJpbmFyeU1ldGhvZDsKKwkJCQkJfQorCQkJCQlzaW1pbGFyTWF0Y2ggPSBzaW1pbGFyTWF0Y2guZ2V0U2ltaWxhck1hdGNoKCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGJpbmFyeU1ldGhvZDsKKwkJfQorCQlpZiAoQmFzaWNTZWFyY2hFbmdpbmUuVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3QgYWJsZSB0byBjcmVhdGVIYW5kbGUgZm9yIHRoZSBtZXRob2QgIiArIC8vJE5PTi1OTFMtMSQKKwkJCQkJQ2hhck9wZXJhdGlvbi5jaGFyVG9TdHJpbmcobWV0aG9kLnNlbGVjdG9yKSArICIgTWF5IG1pc3Mgc29tZSByZXN1bHRzIik7ICAvLyROT04tTkxTLTEkCiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNTgxLDcgKzU0MCw3IEBACiAJcmV0dXJuIG1ldGhvZEhhbmRsZTsKIH0KIC8qKgotICogQ3JlYXRlcyBhbiBJRmllbGQgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHR5cGUuIAorICogQ3JlYXRlcyBhbiBJRmllbGQgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHR5cGUuCiAgKi8KIHByb3RlY3RlZCBJSmF2YUVsZW1lbnQgY3JlYXRlSGFuZGxlKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgSUphdmFFbGVtZW50IHBhcmVudCkgewogCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIElUeXBlKSkgcmV0dXJuIHBhcmVudDsKQEAgLTU5NywxMCArNTU2LDExIEBACiAJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4Mzc4CiAJCXJldHVybiB0eXBlOwogCX0KLQkvLyBmaW5kIG9jY3VyZW5jZSBjb3VudCBvZiB0aGUgZ2l2ZW4gaW5pdGlhbGl6ZXIgaW4gaXRzIHR5cGUgZGVjbGFyYXRpb24KKwkvLyBmaW5kIG9jY3VycmVuY2UgY291bnQgb2YgdGhlIGdpdmVuIGluaXRpYWxpemVyIGluIGl0cyB0eXBlIGRlY2xhcmF0aW9uCiAJaW50IG9jY3VycmVuY2VDb3VudCA9IDA7CiAJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCWludCBsZW5ndGggPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJaWYgKGZpZWxkc1tpXS5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSKSB7CiAJCQlvY2N1cnJlbmNlQ291bnQrKzsKIAkJCWlmIChmaWVsZHNbaV0uZXF1YWxzKGZpZWxkRGVjbGFyYXRpb24pKSBicmVhazsKQEAgLTYwOSwzNSArNTY5LDg3IEBACiAJcmV0dXJuICgoSVR5cGUpIHBhcmVudCkuZ2V0SW5pdGlhbGl6ZXIob2NjdXJyZW5jZUNvdW50KTsKIH0KIC8qKgotICogQ3JlYXRlIGFuIGhhbmRsZSBmb3IgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJ0aW9uIChtYXkgYmUgYSBsb2NhbCB2YXJpYWJsZSBvciB0eXBlIHBhcmFtZXRlcikuCisgKiBDcmVhdGUgYW4gaGFuZGxlIGZvciBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIChtYXkgYmUgYSBsb2NhbCB2YXJpYWJsZSBvciB0eXBlIHBhcmFtZXRlcikuCiAgKi8KIHByb3RlY3RlZCBJSmF2YUVsZW1lbnQgY3JlYXRlSGFuZGxlKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZURlY2xhcmF0aW9uLCBJSmF2YUVsZW1lbnQgcGFyZW50KSB7CiAJc3dpdGNoICh2YXJpYWJsZURlY2xhcmF0aW9uLmdldEtpbmQoKSkgewogCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5MT0NBTF9WQVJJQUJMRToKLQkJCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZSgoSmF2YUVsZW1lbnQpcGFyZW50LAotCQkJCW5ldyBTdHJpbmcodmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKSwKLQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsCi0JCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCwKLQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAotCQkJCXZhcmlhYmxlRGVjbGFyYXRpb24uc291cmNlRW5kLAotCQkJCW5ldyBTdHJpbmcodmFyaWFibGVEZWNsYXJhdGlvbi50eXBlLnJlc29sdmVkVHlwZS5zaWduYXR1cmUoKSkKLQkJCSk7CisJCQlpZiAodmFyaWFibGVEZWNsYXJhdGlvbi50eXBlLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBMb2NhbFZhcmlhYmxlKChKYXZhRWxlbWVudClwYXJlbnQsCisJCQkJCW5ldyBTdHJpbmcodmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKSwKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kLAorCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwKKwkJCQkJbmV3IFN0cmluZyh2YXJpYWJsZURlY2xhcmF0aW9uLnR5cGUucmVzb2x2ZWRUeXBlLnNpZ25hdHVyZSgpKSwKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucywKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5tb2RpZmllcnMsCisJCQkJCWZhbHNlCisJCQkJKTsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5QQVJBTUVURVI6Ci0JCQlyZXR1cm4gbmV3IExvY2FsVmFyaWFibGUoKEphdmFFbGVtZW50KXBhcmVudCwKLQkJCQluZXcgU3RyaW5nKHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSksCi0JCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAotCQkJCXZhcmlhYmxlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQsCi0JCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKLQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwKLQkJCQluZXcgU3RyaW5nKHZhcmlhYmxlRGVjbGFyYXRpb24udHlwZS5yZXNvbHZlZFR5cGUuc2lnbmF0dXJlKCkpCi0JCQkpOworCQkJaWYgKHZhcmlhYmxlRGVjbGFyYXRpb24udHlwZS5yZXNvbHZlZFR5cGUgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZSgoSmF2YUVsZW1lbnQpcGFyZW50LAorCQkJCQluZXcgU3RyaW5nKHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSksCisJCQkJCXZhcmlhYmxlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQsCisJCQkJCW5ldyBTdHJpbmcodmFyaWFibGVEZWNsYXJhdGlvbi50eXBlLnJlc29sdmVkVHlwZS5zaWduYXR1cmUoKSksCisJCQkJCXZhcmlhYmxlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMsCisJCQkJCXZhcmlhYmxlRGVjbGFyYXRpb24ubW9kaWZpZXJzLAorCQkJCQl0cnVlCisJCQkJKTsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5UWVBFX1BBUkFNRVRFUjoKIAkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVHlwZVBhcmFtZXRlcigoSmF2YUVsZW1lbnQpcGFyZW50LCBuZXcgU3RyaW5nKHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSkpOwogCX0KIAlyZXR1cm4gbnVsbDsKIH0KKy8qKgorICogQ3JlYXRlIGFuIGhhbmRsZSBmb3IgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAobWF5IGJlIGEgbG9jYWwgdmFyaWFibGUgb3IgdHlwZSBwYXJhbWV0ZXIpLgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGNyZWF0ZUhhbmRsZShBbm5vdGF0aW9uIGFubm90YXRpb24sIElBbm5vdGF0YWJsZSBwYXJlbnQpIHsKKwlpZiAocGFyZW50ID09IG51bGwpIHJldHVybiBudWxsOworCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IGFubm90YXRpb24udHlwZTsKKwljaGFyW11bXSB0eXBlTmFtZSA9IHR5cGVSZWYuZ2V0VHlwZU5hbWUoKTsKKwlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcodHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoLTFdKTsKKwl0cnkgeworCQlJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gcGFyZW50LmdldEFubm90YXRpb25zKCk7CisJCWludCBsZW5ndGggPSBhbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGFubm90YXRpb25zLmxlbmd0aDsKKwkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisJCQlpZiAoYW5ub3RhdGlvbnNbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gYW5ub3RhdGlvbnNbaV07CisJCQl9CisJCX0KKwl9CisJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKKwkJLy8gc2tpcAorCX0KKwlyZXR1cm4gbnVsbDsKK30KIC8qCi0gKiBDcmVhdGVzIGhpZXJhcmNoeSByZXNvbHZlciBpZiBuZWVkZWQuIAorICogQ3JlYXRlIGhhbmRsZXMgZm9yIGEgbGlzdCBvZiBmaWVsZHMKKyAqLworcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBjcmVhdGVIYW5kbGVzKEZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMsIFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBJSmF2YUVsZW1lbnQgcGFyZW50KSB7CisJSUphdmFFbGVtZW50W10gb3RoZXJFbGVtZW50cyA9IG51bGw7CisJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCWludCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOworCQlpbnQgc2l6ZSA9IDA7CisJCXdoaWxlIChzaXplPGxlbmd0aCAmJiBmaWVsZHNbc2l6ZV0gIT0gbnVsbCkgeworCQkJc2l6ZSsrOworCQl9CisJCW90aGVyRWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W3NpemVdOworCQlmb3IgKGludCBqPTA7IGo8c2l6ZTsgaisrKSB7CisJCQlvdGhlckVsZW1lbnRzW2pdID0gY3JlYXRlSGFuZGxlKGZpZWxkc1tqXSwgdHlwZSwgcGFyZW50KTsKKwkJfQorCX0KKwlyZXR1cm4gb3RoZXJFbGVtZW50czsKK30KKy8qCisgKiBDcmVhdGVzIGhpZXJhcmNoeSByZXNvbHZlciBpZiBuZWVkZWQuCiAgKiBSZXR1cm5zIHdoZXRoZXIgZm9jdXMgaXMgdmlzaWJsZS4KICAqLwogcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlSGllcmFyY2h5UmVzb2x2ZXIoSVR5cGUgZm9jdXNUeXBlLCBQb3NzaWJsZU1hdGNoW10gcG9zc2libGVNYXRjaGVzKSB7CkBAIC03MDAsNyArNzEyLDcgQEAKIAlyZXR1cm4gY3JlYXRlVHlwZUhhbmRsZShuZXcgU3RyaW5nKHVuaXQuZ2V0TWFpblR5cGVOYW1lKCkpKTsKIH0KIC8qKgotICogQ3JlYXRlcyBhbiBJVHlwZSBmcm9tIHRoZSBnaXZlbiBzaW1wbGUgdG9wIGxldmVsIHR5cGUgbmFtZS4gCisgKiBDcmVhdGVzIGFuIElUeXBlIGZyb20gdGhlIGdpdmVuIHNpbXBsZSB0b3AgbGV2ZWwgdHlwZSBuYW1lLgogICovCiBwcm90ZWN0ZWQgSVR5cGUgY3JlYXRlVHlwZUhhbmRsZShTdHJpbmcgc2ltcGxlVHlwZU5hbWUpIHsKIAlPcGVuYWJsZSBvcGVuYWJsZSA9IHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gub3BlbmFibGU7CkBAIC03MTgsOCArNzMwLDM2IEBACiAJcmV0dXJuIGNsYXNzRmlsZS5nZXRUeXBlKCk7CiB9CiBwcm90ZWN0ZWQgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCXJldHVybiBlbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zY29wZS5lbmNsb3NlcyhlbGVtZW50KTsKKwlpZiAoZWxlbWVudCAhPSBudWxsKSB7CisJCWlmICh0aGlzLnNjb3BlIGluc3RhbmNlb2YgSGllcmFyY2h5U2NvcGUpCisJCQlyZXR1cm4gKChIaWVyYXJjaHlTY29wZSl0aGlzLnNjb3BlKS5lbmNsb3NlcyhlbGVtZW50LCB0aGlzLnByb2dyZXNzTW9uaXRvcik7CisJCWVsc2UgCisJCQlyZXR1cm4gdGhpcy5zY29wZS5lbmNsb3NlcyhlbGVtZW50KTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQorcHJpdmF0ZSBib29sZWFuIGZpbHRlckVudW0oU2VhcmNoTWF0Y2ggbWF0Y2gpIHsKKwkKKwkvLyBmaWx0ZXIgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bSBwYWNrYWdlIGZvciBwcm9qZWN0cyBhYm92ZSAxLjUgCisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzI2NAkKKwlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpbWF0Y2guZ2V0RWxlbWVudCgpOworCVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoUGFja2FnZUZyYWdtZW50KWVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOworCWlmIChwa2cgIT0gbnVsbCkgeworCQkvLyBlbnVtIHdhcyBmb3VuZCBpbiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtIGF0IGluZGV4IDUKKwkJaWYgKHBrZy5uYW1lcy5sZW5ndGggPT0gNSAmJiBwa2cubmFtZXNbNF0uZXF1YWxzKCJlbnVtIikpIHsgIC8vJE5PTi1OTFMtMSQKKwkJCWlmICh0aGlzLm9wdGlvbnMgPT0gbnVsbCkgeworCQkJCUlKYXZhUHJvamVjdCBwcm9qID0gKElKYXZhUHJvamVjdClwa2cuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCk7CisJCQkJU3RyaW5nIGNvbXBsaWFuY2VTdHIgPSBwcm9qLmdldE9wdGlvbihDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgdHJ1ZSk7CisJCQkJaWYgKENvbXBpbGVyT3B0aW9ucy52ZXJzaW9uVG9KZGtMZXZlbChjb21wbGlhbmNlU3RyKSA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81KQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID49IENsYXNzRmlsZUNvbnN0YW50cy5KREsxXzUpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIChub24tSmF2YWRvYykKICAqIFJldHVybiBpbmZvIGFib3V0IGxhc3QgdHlwZSBhcmd1bWVudCBvZiBhIHBhcmFtZXRlcml6ZWQgdHlwZSByZWZlcmVuY2UuCiAgKiBUaGVzZSBpbmZvIGFyZSBtYWRlIG9mIGNvbmNhdGVuYXRpb24gb2YgMiBpbnQgdmFsdWVzIHdoaWNoIGFyZSByZXNwZWN0aXZlbHkKQEAgLTgwNSw3ICs4NDUsNyBAQAogCS8vIHNlZSBidWcgNDcwNzkgZm9yIG1vcmUgZGV0YWlscwogCWludFtdIG9sZExpbmVFbmRzID0gdGhpcy5wYXJzZXIuc2Nhbm5lci5saW5lRW5kczsKIAlpbnQgb2xkTGluZVB0ciA9IHRoaXMucGFyc2VyLnNjYW5uZXIubGluZVB0cjsKLQkKKwogCXRyeSB7CiAJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gdW5pdC5jb21waWxhdGlvblJlc3VsdDsKIAkJdGhpcy5wYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2UoY29tcGlsYXRpb25SZXN1bHQpOwpAQCAtOTIxLDcgKzk2MSw3IEBACiAJCWlmIChyZXN1bHQucHJvYmxlbXNbaV0uZ2V0SUQoKSA9PSBJUHJvYmxlbS5EdXBsaWNhdGVUeXBlcykKIAkJCXJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKLX0JCit9CiAvKioKICAqIENyZWF0ZSBhIG5ldyBwYXJzZXIgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBhcyB3ZWxsIGFzIGEgbG9va3VwIGVudmlyb25tZW50LgogICovCkBAIC05MzIsNyArOTcyLDcgQEAKIAkJdGhpcy5uYW1lRW52aXJvbm1lbnQuY2xlYW51cCgpOwogCiAJU2VhcmNoYWJsZUVudmlyb25tZW50IHNlYXJjaGFibGVFbnZpcm9ubWVudCA9IHByb2plY3QubmV3U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCh0aGlzLndvcmtpbmdDb3BpZXMpOwotCQorCiAJLy8gaWYgb25seSBvbmUgcG9zc2libGUgbWF0Y2gsIGEgZmlsZSBuYW1lIGVudmlyb25tZW50IGNvc3RzIHRvbyBtdWNoLAogCS8vIHNvIHVzZSB0aGUgZXhpc3Rpbmcgc2VhcmNoYWJsZSAgZW52aXJvbm1lbnQgd2hpY2ggd2lsbCBwb3B1bGF0ZSB0aGUgamF2YSBtb2RlbAogCS8vIG9ubHkgZm9yIHRoaXMgcG9zc2libGUgbWF0Y2ggYW5kIGl0cyByZXF1aXJlZCB0eXBlcy4KQEAgLTk0Miw3ICs5ODIsNyBAQAogCiAJLy8gY3JlYXRlIGxvb2t1cCBlbnZpcm9ubWVudAogCU1hcCBtYXAgPSBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7Ci0JbWFwLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiIik7IC8vJE5PTi1OTFMtMSQKKwltYXAucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1RhZ3MsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuRU1QVFlfU1RSSU5HKTsKIAl0aGlzLm9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKG1hcCk7CiAJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9CiAJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCkBAIC05NTIsNyArOTkyLDcgQEAKIAl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0gbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIHRoaXMub3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCB0aGlzLm5hbWVFbnZpcm9ubWVudCk7CiAKIAl0aGlzLnBhcnNlciA9IE1hdGNoTG9jYXRvclBhcnNlci5jcmVhdGVQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCB0aGlzKTsKLQkKKwogCS8vIGJhc2ljIHBhcnNlciBuZWVkcyBhbHNvIHRvIGJlIHJlc2V0IGFzIHByb2plY3Qgb3B0aW9ucyBtYXkgaGF2ZSBjaGFuZ2VkCiAJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzMDcyCiAJdGhpcy5iYXNpY1BhcnNlciA9IG51bGw7CkBAIC05NjgsNyArMTAwOCw3IEBACiAJaW5pdGlhbGl6ZShqYXZhUHJvamVjdCwgbGVuZ3RoKTsKIAogCS8vIGNyZWF0ZSBhbmQgcmVzb2x2ZSBiaW5kaW5nIChlcXVpdmFsZW50IHRvIGJlZ2luQ29tcGlsYXRpb24oKSBpbiBDb21waWxlcikKLQlib29sZWFuIG11c3RSZXNvbHZlUGF0dGVybiA9ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmU7CisJYm9vbGVhbiBtdXN0UmVzb2x2ZVBhdHRlcm4gPSB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmU7CiAJYm9vbGVhbiBtdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlUGF0dGVybjsKIAl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1heUJlR2VuZXJpYyA9IHRoaXMub3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV81OwogCWJvb2xlYW4gYmluZGluZ3NXZXJlQ3JlYXRlZCA9IG11c3RSZXNvbHZlOwpAQCAtMTAwNCw2ICsxMDQ0LDEyIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGZpbmFsbHkgeworCQkJCWlmIChwb3NzaWJsZU1hdGNoLmhhc1NpbWlsYXJNYXRjaCgpKSB7CisJCQkJCS8vIElmIHRoZXJlIGlzIHNpbWlsYXIgbWF0Y2gsIHRoZW4gYWxzbyBwcm9jZXNzIGl0CisJCQkJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTg3MgorCQkJCQlwb3NzaWJsZU1hdGNoZXNbaV0gPSBwb3NzaWJsZU1hdGNoLmdldFNpbWlsYXJNYXRjaCgpOworCQkJCQlpLS07CisJCQkJfQogCQkJCWlmICghcG9zc2libGVNYXRjaC5ub2RlU2V0Lm11c3RSZXNvbHZlKQogCQkJCQlwb3NzaWJsZU1hdGNoLmNsZWFuVXAoKTsKIAkJCX0KQEAgLTEwMjYsNyArMTA3Miw3IEBACiAJaWYgKCFtdXN0UmVzb2x2ZSkgewogCQlyZXR1cm47CiAJfQotCQorCiAJLy8gcG9zc2libGUgbWF0Y2ggcmVzb2x1dGlvbgogCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZk1hdGNoZXM7IGkrKykgewogCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpCkBAIC0xMDgxLDIwICsxMTI3LDI3IEBACiAJdGhpcy5wYXR0ZXJuTG9jYXRvci5jbGVhcigpOwogfQogLyoqCi0gKiBMb2NhdGUgdGhlIG1hdGNoZXMgaW4gdGhlIGdpdmVuIGZpbGVzIGFuZCByZXBvcnQgdGhlbSB1c2luZyB0aGUgc2VhcmNoIHJlcXVlc3Rvci4gCisgKiBMb2NhdGUgdGhlIG1hdGNoZXMgaW4gdGhlIGdpdmVuIGZpbGVzIGFuZCByZXBvcnQgdGhlbSB1c2luZyB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KICAqLwogcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFtdIHNlYXJjaERvY3VtZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmICh0aGlzLnBhdHRlcm5Mb2NhdG9yID09IG51bGwpIHJldHVybjsKIAlpbnQgZG9jc0xlbmd0aCA9IHNlYXJjaERvY3VtZW50cy5sZW5ndGg7CisJaW50IHByb2dyZXNzTGVuZ3RoID0gZG9jc0xlbmd0aDsKIAlpZiAoQmFzaWNTZWFyY2hFbmdpbmUuVkVSQk9TRSkgewogCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW5nIG1hdGNoZXMgaW4gZG9jdW1lbnRzIFsiKTsgLy8kTk9OLU5MUy0xJAogCQlmb3IgKGludCBpID0gMDsgaSA8IGRvY3NMZW5ndGg7IGkrKykKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgc2VhcmNoRG9jdW1lbnRzW2ldKTsgLy8kTk9OLU5MUy0xJAogCQlTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsgLy8kTk9OLU5MUy0xJAogCX0KKwlJSmF2YVByb2plY3RbXSBqYXZhTW9kZWxQcm9qZWN0cyA9IG51bGw7CisJaWYgKHRoaXMuc2VhcmNoUGFja2FnZURlY2xhcmF0aW9uKSB7CisJCWphdmFNb2RlbFByb2plY3RzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CisJCXByb2dyZXNzTGVuZ3RoICs9IGphdmFNb2RlbFByb2plY3RzLmxlbmd0aDsKKwl9CiAKIAkvLyBpbml0IGluZm9zIGZvciBwcm9ncmVzcyBpbmNyZWFzaW5nCi0JaW50IG4gPSBkb2NzTGVuZ3RoPDEwMDAgPyBNYXRoLm1pbihNYXRoLm1heChkb2NzTGVuZ3RoLzIwMCsxLCAyKSw0KSA6IDUgKihkb2NzTGVuZ3RoLzEwMDApOwotCXRoaXMucHJvZ3Jlc3NTdGVwID0gZG9jc0xlbmd0aCA8IG4gPyAxIDogZG9jc0xlbmd0aCAvIG47IC8vIHN0ZXAgc2hvdWxkIG5vdCBiZSAwCisJaW50IG4gPSBwcm9ncmVzc0xlbmd0aDwxMDAwID8gTWF0aC5taW4oTWF0aC5tYXgocHJvZ3Jlc3NMZW5ndGgvMjAwKzEsIDIpLDQpIDogNSAqKHByb2dyZXNzTGVuZ3RoLzEwMDApOworCXRoaXMucHJvZ3Jlc3NTdGVwID0gcHJvZ3Jlc3NMZW5ndGggPCBuID8gMSA6IHByb2dyZXNzTGVuZ3RoIC8gbjsgLy8gc3RlcCBzaG91bGQgbm90IGJlIDAKIAl0aGlzLnByb2dyZXNzV29ya2VkID0gMDsKIAogCS8vIGV4dHJhY3Qgd29ya2luZyBjb3BpZXMKQEAgLTExMTMsNyArMTE2Niw3IEBACiAJdGhpcy5iaW5kaW5ncyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgpOwogCXRyeSB7CiAJCS8vIG9wdGltaXplIGFjY2VzcyB0byB6aXAgZmlsZXMgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb24KLQkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7CisJCW1hbmFnZXIuY2FjaGVaaXBGaWxlcyh0aGlzKTsKIAogCQkvLyBpbml0aWFsaXplIGhhbmRsZSBmYWN0b3J5ICh1c2VkIGFzIGEgY2FjaGUgb2YgaGFuZGxlcyBzbyBhcyB0byBvcHRpbWl6ZSBzcGFjZSkKIAkJaWYgKHRoaXMuaGFuZGxlRmFjdG9yeSA9PSBudWxsKQpAQCAtMTEyMyw3ICsxMTc2LDcgQEAKIAkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgc2VhcmNoRG9jdW1lbnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCi0JCS8vIGluaXRpYWxpemUgcGF0dGVybiBmb3IgcG9seW1vcnBoaWMgc2VhcmNoIChpZS4gbWV0aG9kIHJlZmVyZW5jZSBwYXR0ZXJuKQorCQkvLyBpbml0aWFsaXplIHBhdHRlcm4gZm9yIHBvbHltb3JwaGljIHNlYXJjaCAoaS5lLiBtZXRob2QgcmVmZXJlbmNlIHBhdHRlcm4pCiAJCXRoaXMucGF0dGVybkxvY2F0b3IuaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKHRoaXMpOwogCiAJCUphdmFQcm9qZWN0IHByZXZpb3VzSmF2YVByb2plY3QgPSBudWxsOwpAQCAtMTEzMiw5ICsxMTg1LDEwIEBACiAJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7CiAJCQkJcmV0dXJuICgoU2VhcmNoRG9jdW1lbnQpYSkuZ2V0UGF0aCgpLmNvbXBhcmVUbygoKFNlYXJjaERvY3VtZW50KWIpLmdldFBhdGgoKSk7CiAJCQl9Ci0JCX0pOyAKKwkJfSk7CiAJCWludCBkaXNwbGF5ZWQgPSAwOyAvLyBwcm9ncmVzcyB3b3JrZWQgZGlzcGxheWVkCiAJCVN0cmluZyBwcmV2aW91c1BhdGggPSBudWxsOworCQlTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCA9IG51bGw7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jc0xlbmd0aDsgaSsrKSB7CiAJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKIAkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKQEAgLTExNDIsNiArMTE5Niw5IEBACiAKIAkJCS8vIHNraXAgZHVwbGljYXRlIHBhdGhzCiAJCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCA9IHNlYXJjaERvY3VtZW50c1tpXTsKKwkJCWlmIChzZWFyY2hQYXJ0aWNpcGFudCA9PSBudWxsKSB7CisJCQkJc2VhcmNoUGFydGljaXBhbnQgPSBzZWFyY2hEb2N1bWVudC5nZXRQYXJ0aWNpcGFudCgpOworCQkJfQogCQkJc2VhcmNoRG9jdW1lbnRzW2ldID0gbnVsbDsgLy8gZnJlZSBjdXJyZW50IGRvY3VtZW50CiAJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHNlYXJjaERvY3VtZW50LmdldFBhdGgoKTsKIAkJCWlmIChpID4gMCAmJiBwYXRoU3RyaW5nLmVxdWFscyhwcmV2aW91c1BhdGgpKSB7CkBAIC0xMTc2LDcgKzEyMzMsNyBAQAogCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIG9wZW5hYmxlLmdldEphdmFQcm9qZWN0KCk7CiAJCQlyZXNvdXJjZSA9IHdvcmtpbmdDb3B5ICE9IG51bGwgPyB3b3JraW5nQ29weS5nZXRSZXNvdXJjZSgpIDogb3BlbmFibGUuZ2V0UmVzb3VyY2UoKTsKIAkJCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJCXJlc291cmNlID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOyAvLyBjYXNlIG9mIGEgZmlsZSBpbiBhbiBleHRlcm5hbCBqYXIKKwkJCQlyZXNvdXJjZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsgLy8gY2FzZSBvZiBhIGZpbGUgaW4gYW4gZXh0ZXJuYWwgamFyIG9yIGV4dGVybmFsIGZvbGRlcgogCQkJaWYgKCFqYXZhUHJvamVjdC5lcXVhbHMocHJldmlvdXNKYXZhUHJvamVjdCkpIHsKIAkJCQkvLyBsb2NhdGUgbWF0Y2hlcyBpbiBwcmV2aW91cyBwcm9qZWN0CiAJCQkJaWYgKHByZXZpb3VzSmF2YVByb2plY3QgIT0gbnVsbCkgewpAQCAtMTE5MCw3ICsxMjQ3LDcgQEAKIAkJCQl9CiAJCQkJcHJldmlvdXNKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwogCQkJfQotCQkJbWF0Y2hTZXQuYWRkKG5ldyBQb3NzaWJsZU1hdGNoKHRoaXMsIHJlc291cmNlLCBvcGVuYWJsZSwgc2VhcmNoRG9jdW1lbnQsICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKSB0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlKSk7CisJCQltYXRjaFNldC5hZGQobmV3IFBvc3NpYmxlTWF0Y2godGhpcywgcmVzb3VyY2UsIG9wZW5hYmxlLCBzZWFyY2hEb2N1bWVudCx0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUpKTsKIAkJfQogCiAJCS8vIGxhc3QgcHJvamVjdApAQCAtMTIwMCwzMyArMTI1Nyw0MSBAQAogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3NwYXRoIGluIGxhc3QgcHJvamVjdCAtPiBpZ25vcmUKIAkJCX0KLQkJfSAKKwkJfQorCisJCWlmICh0aGlzLnNlYXJjaFBhY2thZ2VEZWNsYXJhdGlvbikgeworCQkJbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhzZWFyY2hQYXJ0aWNpcGFudCwgamF2YU1vZGVsUHJvamVjdHMpOworCQl9CiAKIAl9IGZpbmFsbHkgewogCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKIAkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKIAkJaWYgKHRoaXMubmFtZUVudmlyb25tZW50ICE9IG51bGwpCiAJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5jbGVhbnVwKCk7Ci0JCW1hbmFnZXIuZmx1c2haaXBGaWxlcygpOworCQltYW5hZ2VyLmZsdXNoWmlwRmlsZXModGhpcyk7CiAJCXRoaXMuYmluZGluZ3MgPSBudWxsOwogCX0KIH0KIC8qKgotICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGlzIGxvY2F0b3IncyBwYXR0ZXJuLiAKKyAqIExvY2F0ZXMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsb2NhdG9yJ3MgcGF0dGVybi4KICAqLwotcHVibGljIHZvaWQgbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnModGhpcy5wYXR0ZXJuLCBwYXJ0aWNpcGFudCk7Citwcm90ZWN0ZWQgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCBJSmF2YVByb2plY3RbXSBwcm9qZWN0cykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnModGhpcy5wYXR0ZXJuLCBwYXJ0aWNpcGFudCwgcHJvamVjdHMpOwogfQogLyoqCi0gKiBMb2NhdGVzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWFyY2ggcGF0dGVybi4gCisgKiBMb2NhdGVzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWFyY2ggcGF0dGVybi4KICAqLwotcHJvdGVjdGVkIHZvaWQgbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKFNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgdGhpcy5wcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCX0KIAlpZiAoc2VhcmNoUGF0dGVybiBpbnN0YW5jZW9mIE9yUGF0dGVybikgewogCQlTZWFyY2hQYXR0ZXJuW10gcGF0dGVybnMgPSAoKE9yUGF0dGVybikgc2VhcmNoUGF0dGVybikucGF0dGVybnM7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXR0ZXJucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWxvY2F0ZVBhY2thZ2VEZWNsYXJhdGlvbnMocGF0dGVybnNbaV0sIHBhcnRpY2lwYW50KTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhdHRlcm5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKHBhdHRlcm5zW2ldLCBwYXJ0aWNpcGFudCwgcHJvamVjdHMpOworCQl9CiAJfSBlbHNlIGlmIChzZWFyY2hQYXR0ZXJuIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybikgewotCQlJSmF2YUVsZW1lbnQgZm9jdXMgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybikgc2VhcmNoUGF0dGVybikuZm9jdXM7CisJCUlKYXZhRWxlbWVudCBmb2N1cyA9IHNlYXJjaFBhdHRlcm4uZm9jdXM7CiAJCWlmIChmb2N1cyAhPSBudWxsKSB7CiAJCQlpZiAoZW5jbG9zZXMoZm9jdXMpKSB7CiAJCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uTWF0Y2goZm9jdXMuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCAtMSwgLTEsIHBhcnRpY2lwYW50LCBmb2N1cy5nZXRSZXNvdXJjZSgpKTsKQEAgLTEyMzgsMTAgKzEzMDMsMTQgQEAKIAkJYm9vbGVhbiBpc1dvcmtzcGFjZVNjb3BlID0gdGhpcy5zY29wZSA9PSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRXb3Jrc3BhY2VTY29wZSgpOwogCQlJUGF0aFtdIHNjb3BlUHJvamVjdHNBbmRKYXJzID0gIGlzV29ya3NwYWNlU2NvcGUgPyBudWxsIDogdGhpcy5zY29wZS5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKIAkJaW50IHNjb3BlTGVuZ3RoID0gaXNXb3Jrc3BhY2VTY29wZSA/IDAgOiBzY29wZVByb2plY3RzQW5kSmFycy5sZW5ndGg7Ci0JCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CiAJCVNpbXBsZVNldCBwYWNrYWdlcyA9IG5ldyBTaW1wbGVTZXQoKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJdGhpcy5wcm9ncmVzc1dvcmtlZCsrOworCQkJCWlmICgodGhpcy5wcm9ncmVzc1dvcmtlZCV0aGlzLnByb2dyZXNzU3RlcCk9PTApIHRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCh0aGlzLnByb2dyZXNzU3RlcCk7CisJCQl9CiAJCQkvLyBWZXJpZnkgdGhhdCBwcm9qZWN0IGJlbG9uZ3MgdG8gdGhlIHNjb3BlCiAJCQlpZiAoIWlzV29ya3NwYWNlU2NvcGUpIHsKIAkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CkBAIC0xMzMwLDkgKzEzOTksOSBAQAogCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKIAkJQmluZGluZyBiaW5kaW5nLAogCQlpbnQgYWNjdXJhY3ksCi0JCWludCBvZmZzZXQsICAKKwkJaW50IG9mZnNldCwKIAkJaW50IGxlbmd0aCkgewotCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZ2V0UGFydGljaXBhbnQoKTsgCisJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOwogCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gucmVzb3VyY2U7CiAJcmV0dXJuIG5ld0RlY2xhcmF0aW9uTWF0Y2goZWxlbWVudCwgYmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwogfQpAQCAtMTM0MSw5ICsxNDEwLDkgQEAKIAkJSUphdmFFbGVtZW50IGVsZW1lbnQsCiAJCUJpbmRpbmcgYmluZGluZywKIAkJaW50IGFjY3VyYWN5LAotCQlpbnQgb2Zmc2V0LCAgCisJCWludCBvZmZzZXQsCiAJCWludCBsZW5ndGgsCi0JCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50LCAKKwkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsCiAJCUlSZXNvdXJjZSByZXNvdXJjZSkgewogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CkBAIC0xMzY1LDUxICsxNDM0LDkwIEBACiAJfQogfQogCi1wdWJsaWMgU2VhcmNoTWF0Y2ggbmV3RmllbGRSZWZlcmVuY2VNYXRjaCgKK3B1YmxpYyBGaWVsZFJlZmVyZW5jZU1hdGNoIG5ld0ZpZWxkUmVmZXJlbmNlTWF0Y2goCiAJCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LAorCQlJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50LAogCQlCaW5kaW5nIGVuY2xvc2luZ0JpbmRpbmcsCiAJCWludCBhY2N1cmFjeSwKLQkJaW50IG9mZnNldCwgIAotCQlpbnQgbGVuZ3RoLAotCQlBU1ROb2RlIHJlZmVyZW5jZSkgeworCQlpbnQgb2Zmc2V0LAorCQlpbnQgbGVuZ3RoLCBBU1ROb2RlIHJlZmVyZW5jZSkgewogCWludCBiaXRzID0gcmVmZXJlbmNlLmJpdHM7Ci0JYm9vbGVhbiBpc0NvdXBvdW5kQXNzaWduZWQgPSAoYml0cyAmIEFTVE5vZGUuSXNDb21wb3VuZEFzc2lnbmVkKSAhPSAwOwotCWJvb2xlYW4gaXNSZWFkQWNjZXNzID0gaXNDb3Vwb3VuZEFzc2lnbmVkIHx8IChiaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpID09IDA7Ci0JYm9vbGVhbiBpc1dyaXRlQWNjZXNzID0gaXNDb3Vwb3VuZEFzc2lnbmVkIHx8IChiaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpICE9IDA7CisJYm9vbGVhbiBpc0NvbXBvdW5kQXNzaWduZWQgPSAoYml0cyAmIEFTVE5vZGUuSXNDb21wb3VuZEFzc2lnbmVkKSAhPSAwOworCWJvb2xlYW4gaXNSZWFkQWNjZXNzID0gaXNDb21wb3VuZEFzc2lnbmVkIHx8IChiaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpID09IDA7CisJYm9vbGVhbiBpc1dyaXRlQWNjZXNzID0gaXNDb21wb3VuZEFzc2lnbmVkIHx8IChiaXRzICYgQVNUTm9kZS5Jc1N0cmljdGx5QXNzaWduZWQpICE9IDA7CisJaWYgKGlzV3JpdGVBY2Nlc3MpIHsKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlyZWZlcmVuY2UpLnRva2VuczsKKwkJCWNoYXJbXSBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXTsKKwkJCWlmICh0aGlzLnBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pIHsKKwkJCQlTZWFyY2hQYXR0ZXJuW10gcGF0dGVybnMgPSAoKE9yUGF0dGVybikgdGhpcy5wYXR0ZXJuKS5wYXR0ZXJuczsKKwkJCQlmb3IgKGludCBpID0gMCwgcExlbmd0aCA9IHBhdHRlcm5zLmxlbmd0aDsgaSA8IHBMZW5ndGg7IGkrKykgeworCQkJCQlpZiAoIXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hlc05hbWUoKChWYXJpYWJsZVBhdHRlcm4pcGF0dGVybnNbaV0pLm5hbWUsIGxhc3RUb2tlbikpIHsKKwkJCSAgICAgICAgCWlzV3JpdGVBY2Nlc3MgPSBmYWxzZTsKKwkJCSAgICAgICAgCWlzUmVhZEFjY2VzcyA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKCF0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoZXNOYW1lKCgoVmFyaWFibGVQYXR0ZXJuKXRoaXMucGF0dGVybikubmFtZSwgbGFzdFRva2VuKSkgeworCSAgICAgICAgCWlzV3JpdGVBY2Nlc3MgPSBmYWxzZTsKKwkgICAgICAgIAlpc1JlYWRBY2Nlc3MgPSB0cnVlOworCQkJfQorICAgICAgICB9CisJfQogCWJvb2xlYW4gaW5zaWRlRG9jQ29tbWVudCA9IChiaXRzICYgQVNUTm9kZS5JbnNpZGVKYXZhZG9jKSAhPSAwOwotCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZ2V0UGFydGljaXBhbnQoKTsgCisJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOwogCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gucmVzb3VyY2U7Ci0JaWYgKGVuY2xvc2luZ0JpbmRpbmcgIT0gbnVsbCkKKwlpZiAoZW5jbG9zaW5nQmluZGluZyAhPSBudWxsKSB7CiAJCWVuY2xvc2luZ0VsZW1lbnQgPSAoKEphdmFFbGVtZW50KSBlbmNsb3NpbmdFbGVtZW50KS5yZXNvbHZlZChlbmNsb3NpbmdCaW5kaW5nKTsKLQlyZXR1cm4gbmV3IEZpZWxkUmVmZXJlbmNlTWF0Y2goZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBpc1JlYWRBY2Nlc3MsIGlzV3JpdGVBY2Nlc3MsIGluc2lkZURvY0NvbW1lbnQsIHBhcnRpY2lwYW50LCByZXNvdXJjZSk7CisJfQorCUZpZWxkUmVmZXJlbmNlTWF0Y2ggbWF0Y2ggPSBuZXcgRmllbGRSZWZlcmVuY2VNYXRjaChlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIGlzUmVhZEFjY2VzcywgaXNXcml0ZUFjY2VzcywgaW5zaWRlRG9jQ29tbWVudCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKKwltYXRjaC5zZXRMb2NhbEVsZW1lbnQobG9jYWxFbGVtZW50KTsKKwlyZXR1cm4gbWF0Y2g7CiB9CiAKIHB1YmxpYyBTZWFyY2hNYXRjaCBuZXdMb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2goCiAJCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LAogCQlpbnQgYWNjdXJhY3ksCi0JCWludCBvZmZzZXQsICAKKwkJaW50IG9mZnNldCwKIAkJaW50IGxlbmd0aCwKIAkJQVNUTm9kZSByZWZlcmVuY2UpIHsKIAlpbnQgYml0cyA9IHJlZmVyZW5jZS5iaXRzOwotCWJvb2xlYW4gaXNDb3Vwb3VuZEFzc2lnbmVkID0gKGJpdHMgJiBBU1ROb2RlLklzQ29tcG91bmRBc3NpZ25lZCkgIT0gMDsKLQlib29sZWFuIGlzUmVhZEFjY2VzcyA9IGlzQ291cG91bmRBc3NpZ25lZCB8fCAoYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwOwotCWJvb2xlYW4gaXNXcml0ZUFjY2VzcyA9IGlzQ291cG91bmRBc3NpZ25lZCB8fCAoYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSAhPSAwOworCWJvb2xlYW4gaXNDb21wb3VuZEFzc2lnbmVkID0gKGJpdHMgJiBBU1ROb2RlLklzQ29tcG91bmRBc3NpZ25lZCkgIT0gMDsKKwlib29sZWFuIGlzUmVhZEFjY2VzcyA9IGlzQ29tcG91bmRBc3NpZ25lZCB8fCAoYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSA9PSAwOworCWJvb2xlYW4gaXNXcml0ZUFjY2VzcyA9IGlzQ29tcG91bmRBc3NpZ25lZCB8fCAoYml0cyAmIEFTVE5vZGUuSXNTdHJpY3RseUFzc2lnbmVkKSAhPSAwOworCWlmIChpc1dyaXRlQWNjZXNzKSB7CisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQljaGFyW11bXSB0b2tlbnMgPSAoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpcmVmZXJlbmNlKS50b2tlbnM7CisJCQljaGFyW10gbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV07CisJCQlpZiAodGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgT3JQYXR0ZXJuKSB7CisJCQkJU2VhcmNoUGF0dGVybltdIHBhdHRlcm5zID0gKChPclBhdHRlcm4pIHRoaXMucGF0dGVybikucGF0dGVybnM7CisJCQkJZm9yIChpbnQgaSA9IDAsIHBMZW5ndGggPSBwYXR0ZXJucy5sZW5ndGg7IGkgPCBwTGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKCF0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoZXNOYW1lKCgoVmFyaWFibGVQYXR0ZXJuKXBhdHRlcm5zW2ldKS5uYW1lLCBsYXN0VG9rZW4pKSB7CisJCQkgICAgICAgIAlpc1dyaXRlQWNjZXNzID0gZmFsc2U7CisJCQkgICAgICAgIAlpc1JlYWRBY2Nlc3MgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICghdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaGVzTmFtZSgoKFZhcmlhYmxlUGF0dGVybil0aGlzLnBhdHRlcm4pLm5hbWUsIGxhc3RUb2tlbikpIHsKKwkgICAgICAgIAlpc1dyaXRlQWNjZXNzID0gZmFsc2U7CisJICAgICAgICAJaXNSZWFkQWNjZXNzID0gdHJ1ZTsKKwkJCX0KKyAgICAgICAgfQorCX0KIAlib29sZWFuIGluc2lkZURvY0NvbW1lbnQgPSAoYml0cyAmIEFTVE5vZGUuSW5zaWRlSmF2YWRvYykgIT0gMDsKLQlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IGdldFBhcnRpY2lwYW50KCk7IAorCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZ2V0UGFydGljaXBhbnQoKTsKIAlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoLnJlc291cmNlOwogCXJldHVybiBuZXcgTG9jYWxWYXJpYWJsZVJlZmVyZW5jZU1hdGNoKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgaXNSZWFkQWNjZXNzLCBpc1dyaXRlQWNjZXNzLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwogfQogCi1wdWJsaWMgU2VhcmNoTWF0Y2ggbmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goCitwdWJsaWMgTWV0aG9kUmVmZXJlbmNlTWF0Y2ggbmV3TWV0aG9kUmVmZXJlbmNlTWF0Y2goCiAJCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LAogCQlCaW5kaW5nIGVuY2xvc2luZ0JpbmRpbmcsCiAJCWludCBhY2N1cmFjeSwKLQkJaW50IG9mZnNldCwgIAorCQlpbnQgb2Zmc2V0LAogCQlpbnQgbGVuZ3RoLAogCQlib29sZWFuIGlzQ29uc3RydWN0b3IsCiAJCWJvb2xlYW4gaXNTeW50aGV0aWMsCiAJCUFTVE5vZGUgcmVmZXJlbmNlKSB7Ci0JU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOyAKKwlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IGdldFBhcnRpY2lwYW50KCk7CiAJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5yZXNvdXJjZTsKIAlib29sZWFuIGluc2lkZURvY0NvbW1lbnQgPSAocmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpICE9IDA7CiAJaWYgKGVuY2xvc2luZ0JpbmRpbmcgIT0gbnVsbCkKQEAgLTE0MTgsMTMgKzE1MjYsMTMgQEAKIAlyZXR1cm4gbmV3IE1ldGhvZFJlZmVyZW5jZU1hdGNoKGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIGxlbmd0aCwgaXNDb25zdHJ1Y3RvciwgaXNTeW50aGV0aWMsIGlzT3ZlcnJpZGRlbiwgaW5zaWRlRG9jQ29tbWVudCwgcGFydGljaXBhbnQsIHJlc291cmNlKTsKIH0KIAotcHVibGljIFNlYXJjaE1hdGNoIG5ld1BhY2thZ2VSZWZlcmVuY2VNYXRjaCgKK3B1YmxpYyBQYWNrYWdlUmVmZXJlbmNlTWF0Y2ggbmV3UGFja2FnZVJlZmVyZW5jZU1hdGNoKAogCQlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwKIAkJaW50IGFjY3VyYWN5LAotCQlpbnQgb2Zmc2V0LCAgCisJCWludCBvZmZzZXQsCiAJCWludCBsZW5ndGgsCiAJCUFTVE5vZGUgcmVmZXJlbmNlKSB7Ci0JU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOyAKKwlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IGdldFBhcnRpY2lwYW50KCk7CiAJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5yZXNvdXJjZTsKIAlib29sZWFuIGluc2lkZURvY0NvbW1lbnQgPSAocmVmZXJlbmNlLmJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpICE9IDA7CiAJcmV0dXJuIG5ldyBQYWNrYWdlUmVmZXJlbmNlTWF0Y2goZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgbGVuZ3RoLCBpbnNpZGVEb2NDb21tZW50LCBwYXJ0aWNpcGFudCwgcmVzb3VyY2UpOwpAQCAtMTQzMywxMiArMTU0MSwxMiBAQAogcHVibGljIFNlYXJjaE1hdGNoIG5ld1R5cGVQYXJhbWV0ZXJSZWZlcmVuY2VNYXRjaCgKIAkJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsCiAJCWludCBhY2N1cmFjeSwKLQkJaW50IG9mZnNldCwgIAorCQlpbnQgb2Zmc2V0LAogCQlpbnQgbGVuZ3RoLAogCQlBU1ROb2RlIHJlZmVyZW5jZSkgewogCWludCBiaXRzID0gcmVmZXJlbmNlLmJpdHM7CiAJYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50ID0gKGJpdHMgJiBBU1ROb2RlLkluc2lkZUphdmFkb2MpICE9IDA7Ci0JU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOyAKKwlTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCA9IGdldFBhcnRpY2lwYW50KCk7CiAJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5yZXNvdXJjZTsKIAlyZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJSZWZlcmVuY2VNYXRjaChlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCBsZW5ndGgsIGluc2lkZURvY0NvbW1lbnQsIHBhcnRpY2lwYW50LCByZXNvdXJjZSk7CiB9CkBAIC0xNDQ3LDEwICsxNTU1LDEwIEBACiAJCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LAogCQlCaW5kaW5nIGVuY2xvc2luZ0JpbmRpbmcsCiAJCWludCBhY2N1cmFjeSwKLQkJaW50IG9mZnNldCwgIAorCQlpbnQgb2Zmc2V0LAogCQlpbnQgbGVuZ3RoLAogCQlBU1ROb2RlIHJlZmVyZW5jZSkgewotCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZ2V0UGFydGljaXBhbnQoKTsgCisJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBnZXRQYXJ0aWNpcGFudCgpOwogCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gucmVzb3VyY2U7CiAJYm9vbGVhbiBpbnNpZGVEb2NDb21tZW50ID0gKHJlZmVyZW5jZS5iaXRzICYgQVNUTm9kZS5JbnNpZGVKYXZhZG9jKSAhPSAwOwogCWlmIChlbmNsb3NpbmdCaW5kaW5nICE9IG51bGwpCkBAIC0xNDk0LDcgKzE2MDIsNyBAQAogCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIG51bGwgLypubyBhY2Nlc3MgcmVzdHJpY3Rpb24qLyk7CiAJCQkJfQogCQkJfQotCQorCiAJCQkvLyBhZGQgdGhlIHBvc3NpYmxlTWF0Y2ggd2l0aCBpdHMgcGFyc2VkVW5pdCB0byBtYXRjaGVzVG9Qcm9jZXNzCiAJCQlwb3NzaWJsZU1hdGNoLnBhcnNlZFVuaXQgPSBwYXJzZWRVbml0OwogCQkJaW50IHNpemUgPSB0aGlzLm1hdGNoZXNUb1Byb2Nlc3MubGVuZ3RoOwpAQCAtMTUxNywxMCArMTYyNSwxNiBAQAogCQlpZiAodW5pdC5pc0VtcHR5KCkpIHsKIAkJCWlmICh0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoLm9wZW5hYmxlIGluc3RhbmNlb2YgQ2xhc3NGaWxlKSB7CiAJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChDbGFzc0ZpbGUpIHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gub3BlbmFibGU7Ci0JCQkJSUJpbmFyeVR5cGUgaW5mbyA9IGdldEJpbmFyeUluZm8oY2xhc3NGaWxlLCB0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoLnJlc291cmNlKTsKKwkJCQlJQmluYXJ5VHlwZSBpbmZvID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlpbmZvID0gZ2V0QmluYXJ5SW5mbyhjbGFzc0ZpbGUsIGNsYXNzRmlsZS5yZXNvdXJjZSgpKTsKKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJLy8gRG8gbm90aGluZworCQkJCX0KIAkJCQlpZiAoaW5mbyAhPSBudWxsKSB7CiAJCQkJCWJvb2xlYW4gbWF5QmVHZW5lcmljID0gdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXlCZUdlbmVyaWM7Ci0JCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF5QmVHZW5lcmljID0gZmFsc2U7IC8vIHRoZXJlJ3Mgbm8gbG9uZ2VyIGdlbmVyaWNzIGluIGNsYXNzIGZpbGVzCisJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF5QmVHZW5lcmljID0gZmFsc2U7IC8vIHRoZXJlJ3Mgbm8gbG9uZ2VyIGdlbmVyaWMgaW4gY2xhc3MgZmlsZXMKIAkJCQkJdHJ5IHsKIAkJCQkJCW5ldyBDbGFzc0ZpbGVNYXRjaExvY2F0b3IoKS5sb2NhdGVNYXRjaGVzKHRoaXMsIGNsYXNzRmlsZSwgaW5mbyk7CiAJCQkJCX0KQEAgLTE1MzYsMTUgKzE2NTAsMTUgQEAKIAkJLy8gTW92ZSBnZXRNZXRob2RCb2RpZXMgdG8gI3BhcnNlQW5kQnVpbGRpbmdzKC4uLikgbWV0aG9kIHRvIGFsbG93IHBvc3NpYmxlIG1hdGNoIHJlc29sdXRpb24gbWFuYWdlbWVudAogCQkvL2dldE1ldGhvZEJvZGllcyh1bml0KTsKIAotCQlib29sZWFuIG11c3RSZXNvbHZlID0gKCgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgfHwgcG9zc2libGVNYXRjaC5ub2RlU2V0Lm11c3RSZXNvbHZlKTsKKwkJYm9vbGVhbiBtdXN0UmVzb2x2ZSA9ICh0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgfHwgcG9zc2libGVNYXRjaC5ub2RlU2V0Lm11c3RSZXNvbHZlKTsKIAkJaWYgKGJpbmRpbmdzV2VyZUNyZWF0ZWQgJiYgbXVzdFJlc29sdmUpIHsKIAkJCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsKIAkJCQlpZiAoQmFzaWNTZWFyY2hFbmdpbmUuVkVSQk9TRSkKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZpbmcgIiArIHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2gub3BlbmFibGUudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCisKIAkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LnVuaXRCZWluZ0NvbXBsZXRlZCA9IHVuaXQ7CiAJCQkJcmVkdWNlUGFyc2VUcmVlKHVuaXQpOwotCQorCiAJCQkJaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkgewogCQkJCQkvLyBmYXVsdCBpbiBmaWVsZHMgJiBtZXRob2RzCiAJCQkJCXVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CkBAIC0xNjAyLDEzICsxNzE2LDI1IEBACiAJLy8gcmVtb3ZlIHN0YXRlbWVudHMgZnJvbSBtZXRob2RzIHRoYXQgaGF2ZSBubyBwb3NzaWJsZSBtYXRjaGluZyBub2RlcwogCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gdW5pdC50eXBlczsKIAlmb3IgKGludCBpID0gMCwgbCA9IHR5cGVzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJcHVyZ2VNZXRob2RTdGF0ZW1lbnRzKHR5cGVzW2ldLCB0cnVlKTsgCisJCXB1cmdlTWV0aG9kU3RhdGVtZW50cyh0eXBlc1tpXSwgdHJ1ZSk7CiB9CiBwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0UGFydGljaXBhbnQoKSB7CiAJcmV0dXJuIHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2guZG9jdW1lbnQuZ2V0UGFydGljaXBhbnQoKTsKIH0KIAogcHJvdGVjdGVkIHZvaWQgcmVwb3J0KFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKG1hdGNoID09IG51bGwpIHsKKwkJaWYgKEJhc2ljU2VhcmNoRW5naW5lLlZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IHJlcG9ydCBhIG51bGwgbWF0Y2ghISEiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGZpbHRlckVudW0obWF0Y2gpKXsKKwkJaWYgKEJhc2ljU2VhcmNoRW5naW5lLlZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVyZWQgcGFja2FnZSB3aXRoIG5hbWUgZW51bSIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuOworCX0KIAlsb25nIHN0YXJ0ID0gLTE7CiAJaWYgKEJhc2ljU2VhcmNoRW5naW5lLlZFUkJPU0UpIHsKIAkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKQEAgLTE2MzIsMjEgKzE3NTgsMjMgQEAKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGl0J3MganVzdCBmb3IgZGVidWcgcHVycG9zZXMuLi4gaWdub3JlIGFsbCBleGNlcHRpb25zIGluIHRoaXMgYXJlYQogCQl9Ci0JCWlmIChtYXRjaCBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2VNYXRjaCkgeworCQlpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWZlcmVuY2VNYXRjaCkgewogCQkJdHJ5IHsKLQkJCQlUeXBlUmVmZXJlbmNlTWF0Y2ggdHlwZVJlZk1hdGNoID0gKFR5cGVSZWZlcmVuY2VNYXRjaCkgbWF0Y2g7Ci0JCQkJSmF2YUVsZW1lbnQgbG9jYWwgPSAoSmF2YUVsZW1lbnQpIHR5cGVSZWZNYXRjaC5nZXRMb2NhbEVsZW1lbnQoKTsKKwkJCQlSZWZlcmVuY2VNYXRjaCByZWZNYXRjaCA9IChSZWZlcmVuY2VNYXRjaCkgbWF0Y2g7CisJCQkJSmF2YUVsZW1lbnQgbG9jYWwgPSAoSmF2YUVsZW1lbnQpIHJlZk1hdGNoLmdldExvY2FsRWxlbWVudCgpOwogCQkJCWlmIChsb2NhbCAhPSBudWxsKSB7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRMb2NhbCBlbGVtZW50OiAiKyBsb2NhbC50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9Ci0JCQkJSUphdmFFbGVtZW50W10gb3RoZXJzID0gdHlwZVJlZk1hdGNoLmdldE90aGVyRWxlbWVudHMoKTsKLQkJCQlpZiAob3RoZXJzICE9IG51bGwpIHsKLQkJCQkJaW50IGxlbmd0aCA9IG90aGVycy5sZW5ndGg7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0T3RoZXIgZWxlbWVudHM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQkJCQkJCUphdmFFbGVtZW50IG90aGVyID0gKEphdmFFbGVtZW50KSBvdGhlcnNbaV07Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LSAiKyBvdGhlci50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAobWF0Y2ggaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlTWF0Y2gpIHsKKwkJCQkJSUphdmFFbGVtZW50W10gb3RoZXJzID0gKChUeXBlUmVmZXJlbmNlTWF0Y2gpIHJlZk1hdGNoKS5nZXRPdGhlckVsZW1lbnRzKCk7CisJCQkJCWlmIChvdGhlcnMgIT0gbnVsbCkgeworCQkJCQkJaW50IGxlbmd0aCA9IG90aGVycy5sZW5ndGg7CisJCQkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRPdGhlciBlbGVtZW50czoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQkJCQkJCQlKYXZhRWxlbWVudCBvdGhlciA9IChKYXZhRWxlbWVudCkgb3RoZXJzW2ldOworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtICIrIG90aGVyLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KQEAgLTE2OTMsMzEgKzE4MjEsMzQgQEAKIHByb3RlY3RlZCB2b2lkIHJlcG9ydEFjY3VyYXRlVHlwZVJlZmVyZW5jZShTZWFyY2hNYXRjaCBtYXRjaCwgQVNUTm9kZSB0eXBlUmVmLCBjaGFyW10gbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWlmIChtYXRjaC5nZXRSdWxlKCkgPT0gMCkgcmV0dXJuOwogCWlmICghZW5jbG9zZXMoKElKYXZhRWxlbWVudCltYXRjaC5nZXRFbGVtZW50KCkpKSByZXR1cm47Ci0JCi0JLy8gQ29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlIAorCiAJaW50IHNvdXJjZVN0YXJ0ID0gdHlwZVJlZi5zb3VyY2VTdGFydDsKIAlpbnQgc291cmNlRW5kID0gdHlwZVJlZi5zb3VyY2VFbmQ7Ci0JU2Nhbm5lciBzY2FubmVyID0gdGhpcy5wYXJzZXIuc2Nhbm5lcjsKLQlzY2FubmVyLnNldFNvdXJjZSh0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoLmdldENvbnRlbnRzKCkpOwotCXNjYW5uZXIucmVzZXRUbyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIAotCWludCB0b2tlbiA9IC0xOwotCWludCBjdXJyZW50UG9zaXRpb247Ci0JZG8gewotCQljdXJyZW50UG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJdHJ5IHsKLQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyICYmIHRoaXMucGF0dGVybi5tYXRjaGVzTmFtZShuYW1lLCBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSkgewotCQkJaW50IGxlbmd0aCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uLWN1cnJlbnRQb3NpdGlvbjsKLQkJCW1hdGNoLnNldE9mZnNldChjdXJyZW50UG9zaXRpb24pOwotCQkJbWF0Y2guc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQlyZXBvcnQobWF0Y2gpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKKwkvLyBDb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UKKwlpZiAobmFtZSAhPSBudWxsKSB7CisJCVNjYW5uZXIgc2Nhbm5lciA9IHRoaXMucGFyc2VyLnNjYW5uZXI7CisJCXNjYW5uZXIuc2V0U291cmNlKHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2guZ2V0Q29udGVudHMoKSk7CisJCXNjYW5uZXIucmVzZXRUbyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKworCQlpbnQgdG9rZW4gPSAtMTsKKwkJaW50IGN1cnJlbnRQb3NpdGlvbjsKKwkJZG8geworCQkJY3VycmVudFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQl0cnkgeworCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciAmJiB0aGlzLnBhdHRlcm4ubWF0Y2hlc05hbWUobmFtZSwgc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkpIHsKKwkJCQlpbnQgbGVuZ3RoID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tY3VycmVudFBvc2l0aW9uOworCQkJCW1hdGNoLnNldE9mZnNldChjdXJyZW50UG9zaXRpb24pOworCQkJCW1hdGNoLnNldExlbmd0aChsZW5ndGgpOworCQkJCXJlcG9ydChtYXRjaCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IHdoaWxlICh0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpOworCX0KIAogCS8vCVJlcG9ydCBtYXRjaAogCW1hdGNoLnNldE9mZnNldChzb3VyY2VTdGFydCk7CkBAIC0xNzM1LDEyICsxODY2LDEyIEBACiAJaWYgKG1hdGNoLmdldFJ1bGUoKSA9PSAwKSByZXR1cm47CiAJaWYgKCFlbmNsb3NlcygoSUphdmFFbGVtZW50KW1hdGNoLmdldEVsZW1lbnQoKSkpIHJldHVybjsKIAotCS8vIElmIHRoZXJlJ3MgdHlwZSBhcmd1bWVudHMsIGxvb2sgZm9yIGVuZCAoaWUuIGNoYXIgJz4nKSBvZiBsYXN0IG9uZS4KKwkvLyBJZiB0aGVyZSdzIHR5cGUgYXJndW1lbnRzLCBsb29rIGZvciBlbmQgKGkuZS4gY2hhciAnPicpIG9mIGxhc3Qgb25lLgogCWludCBzdGFydCA9IG1hdGNoLmdldE9mZnNldCgpOwogCWlmICh0eXBlQXJndW1lbnRzICE9IG51bGwgJiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggPiAwKSB7Ci0JCWJvb2xlYW4gaXNFcmFzdXJlTWF0Y2g9IChwYXR0ZXJuIGluc3RhbmNlb2YgT3JQYXR0ZXJuKSA/ICgoT3JQYXR0ZXJuKXBhdHRlcm4pLmlzRXJhc3VyZU1hdGNoKCkgOiAoKEphdmFTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmlzRXJhc3VyZU1hdGNoKCk7CisJCWJvb2xlYW4gaXNFcmFzdXJlTWF0Y2g9ICh0aGlzLnBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pID8gKChPclBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5pc0VyYXN1cmVNYXRjaCgpIDogKChKYXZhU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLmlzRXJhc3VyZU1hdGNoKCk7CiAJCWlmICghaXNFcmFzdXJlTWF0Y2gpIHsKLQkJCQorCiAJCQkvLyBJbml0aWFsaXplIHNjYW5uZXIKIAkJCVNjYW5uZXIgc2Nhbm5lciA9IHRoaXMucGFyc2VyLnNjYW5uZXI7CiAJCQljaGFyW10gc291cmNlID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5nZXRDb250ZW50cygpOwpAQCAtMTc3NCw3ICsxOTA1LDcgQEAKIAkJCX0KIAkgCX0KIAl9Ci0JCisKIAkvLyBSZXBvcnQgbWF0Y2gKIAltYXRjaC5zZXRPZmZzZXQoc3RhcnQpOwogCW1hdGNoLnNldExlbmd0aChzdGF0ZW1lbnQuc291cmNlRW5kLXN0YXJ0KzEpOwpAQCAtMTc5MSwxNiArMTkyMiwxMiBAQAogCWlmIChtYXRjaC5nZXRSdWxlKCkgPT0gMCkgcmV0dXJuOwogCWlmICghZW5jbG9zZXMoKElKYXZhRWxlbWVudCltYXRjaC5nZXRFbGVtZW50KCkpKSByZXR1cm47CiAKLQkvLyBJZiB0aGVyZSdzIHR5cGUgYXJndW1lbnRzLCBsb29rIGZvciBlbmQgKGllLiBjaGFyICc+Jykgb2YgbGFzdCBvbmUuCisJLy8gSWYgdGhlcmUncyB0eXBlIGFyZ3VtZW50cywgbG9vayBmb3IgZW5kIChpLmUuIGNoYXIgJz4nKSBvZiBsYXN0IG9uZS4KIAlpbnQgZW5kID0gdHlwZVJlZi5zb3VyY2VFbmQ7CiAJaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewotCQkvLyBJbml0aWFsaXplIHNjYW5uZXIKLQkJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5wYXJzZXIuc2Nhbm5lcjsKLQkJY2hhcltdIHNvdXJjZSA9IHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2guZ2V0Q29udGVudHMoKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKIAotCQlib29sZWFuIHNob3VsZE1hdGNoRXJhc3VyZT0gKHBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pID8gKChPclBhdHRlcm4pcGF0dGVybikuaXNFcmFzdXJlTWF0Y2goKSA6ICgoSmF2YVNlYXJjaFBhdHRlcm4pcGF0dGVybikuaXNFcmFzdXJlTWF0Y2goKTsKLQkJYm9vbGVhbiBoYXNTaWduYXR1cmVzID0gKHBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pID8gKChPclBhdHRlcm4pcGF0dGVybikuaGFzU2lnbmF0dXJlcygpIDogKChKYXZhU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5oYXNTaWduYXR1cmVzKCk7CisJCWJvb2xlYW4gc2hvdWxkTWF0Y2hFcmFzdXJlPSAodGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgT3JQYXR0ZXJuKSA/ICgoT3JQYXR0ZXJuKXRoaXMucGF0dGVybikuaXNFcmFzdXJlTWF0Y2goKSA6ICgoSmF2YVNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5pc0VyYXN1cmVNYXRjaCgpOworCQlib29sZWFuIGhhc1NpZ25hdHVyZXMgPSAodGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgT3JQYXR0ZXJuKSA/ICgoT3JQYXR0ZXJuKXRoaXMucGF0dGVybikuaGFzU2lnbmF0dXJlcygpIDogKChKYXZhU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLmhhc1NpZ25hdHVyZXMoKTsKIAkJaWYgKHNob3VsZE1hdGNoRXJhc3VyZSB8fCAhaGFzU2lnbmF0dXJlcykgewogCQkJLy8gaWYgcGF0dGVybiBpcyBlcmFzdXJlIG9ubHksIHRoZW4gc2VsZWN0IHRoZSBlbmQgb2YgdGhlIHJlZmVyZW5jZQogCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlICYmIGluZGV4ID49IDApIHsKQEAgLTE4MTAsNiArMTkzNywxMSBAQAogCQkJCWVuZCA9ICgoQXJyYXlUeXBlUmVmZXJlbmNlKSB0eXBlUmVmKS5vcmlnaW5hbFNvdXJjZUVuZDsKIAkJCX0KIAkJfSAgZWxzZSB7CisJCQkvLyBJbml0aWFsaXplIHNjYW5uZXIKKwkJCVNjYW5uZXIgc2Nhbm5lciA9IHRoaXMucGFyc2VyLnNjYW5uZXI7CisJCQljaGFyW10gc291cmNlID0gdGhpcy5jdXJyZW50UG9zc2libGVNYXRjaC5nZXRDb250ZW50cygpOworCQkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKKwogCQkJLy8gU2V0IHNjYW5uZXIgcG9zaXRpb24gYXQgZW5kIG9mIGxhc3QgdHlwZSBhcmd1bWVudAogCQkJc2Nhbm5lci5yZXNldFRvKGVuZCwgc291cmNlLmxlbmd0aC0xKTsKIAkJCWludCBkZXB0aCA9IDA7CkBAIC0xODIxLDcgKzE5NTMsNyBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCisKIAkJCS8vIE5vdywgc2NhbiB0byBzZWFyY2ggbmV4dCBjbG9zaW5nICc+JwogCQkJd2hpbGUgKGRlcHRoLS0gPiAwKSB7CiAJCQkJd2hpbGUgKCFzY2FubmVyLmF0RW5kKCkpIHsKQEAgLTE4MzMsNyArMTk2NSw3IEBACiAJCQl9CiAJIAl9CiAJfQotCQorCiAJLy8gUmVwb3J0IG1hdGNoCiAJbWF0Y2guc2V0TGVuZ3RoKGVuZC1tYXRjaC5nZXRPZmZzZXQoKSsxKTsKIAlyZXBvcnQobWF0Y2gpOwpAQCAtMTg2Miw3ICsxOTk0LDcgQEAKIAkJCXNvdXJjZUVuZCA9IHF1YWxpZmllZEFsbG9jYXRpb24uYW5vbnltb3VzVHlwZS5zb3VyY2VTdGFydCAtIDE7CiAJCX0KIAl9Ci0JCisKIAkvLyBTY2FuIHRvIGZpbmQgbGFzdCBjbG9zaW5nIHBhcmVudGhlc2lzCiAJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5wYXJzZXIuc2Nhbm5lcjsKIAlzY2FubmVyLnNldFNvdXJjZSh0aGlzLmN1cnJlbnRQb3NzaWJsZU1hdGNoLmdldENvbnRlbnRzKCkpOwpAQCAtMTg5Niw4ICsyMDI4LDggQEAKIAlpbnQgc291cmNlU3RhcnQgPSBxTmFtZVJlZi5zb3VyY2VTdGFydDsKIAlpbnQgc291cmNlRW5kID0gcU5hbWVSZWYuc291cmNlRW5kOwogCWNoYXJbXVtdIHRva2VucyA9IHFOYW1lUmVmLnRva2VuczsKLQkKLQkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UgCisKKwkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UKIAlTY2FubmVyIHNjYW5uZXIgPSB0aGlzLnBhcnNlci5zY2FubmVyOwogCXNjYW5uZXIuc2V0U291cmNlKHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2guZ2V0Q29udGVudHMoKSk7CiAJc2Nhbm5lci5yZXNldFRvKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwpAQCAtMTk4MiwxNiArMjExNCwxOCBAQAogfQogLyoqCiAgKiBWaXNpdCB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCByZXBvcnQgdGhlIG5vZGVzIHRoYXQgbWF0Y2ggZXhhY3RseSB0aGUKLSAqIHNlYXJjaCBwYXR0ZXJuIChpZS4gdGhlIG9uZXMgaW4gdGhlIG1hdGNoaW5nIG5vZGVzIHNldCkKKyAqIHNlYXJjaCBwYXR0ZXJuIChpLmUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCiAgKiBOb3RlIHRoYXQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuCiAgKi8KLXByb3RlY3RlZCB2b2lkIHJlcG9ydE1hdGNoaW5nKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgSUphdmFFbGVtZW50IHBhcmVudCwgaW50IGFjY3VyYWN5LCBib29sZWFuIHR5cGVJbkhpZXJhcmNoeSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKK3Byb3RlY3RlZCB2b2lkIHJlcG9ydE1hdGNoaW5nKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBUeXBlRGVjbGFyYXRpb24gdHlwZSwgSUphdmFFbGVtZW50IHBhcmVudCwgaW50IGFjY3VyYWN5LCBib29sZWFuIHR5cGVJbkhpZXJhcmNoeSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCA9IG51bGw7CisKKwkvLyByZXBvcnQgbWV0aG9kIGRlY2xhcmF0aW9uIGl0c2VsZgogCWlmIChhY2N1cmFjeSA+IC0xKSB7CiAJCWVuY2xvc2luZ0VsZW1lbnQgPSBjcmVhdGVIYW5kbGUobWV0aG9kLCBwYXJlbnQpOwogCQlpZiAoZW5jbG9zaW5nRWxlbWVudCAhPSBudWxsKSB7IC8vIHNraXAgaWYgdW5hYmxlIHRvIGZpbmQgbWV0aG9kCi0JCQkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHNlbGVjdG9yIAotCQkJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CisJCQkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHNlbGVjdG9yCisJCQlTY2FubmVyIHNjYW5uZXIgPSB0aGlzLnBhcnNlci5zY2FubmVyOwogCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9IG1ldGhvZC5zb3VyY2VTdGFydDsKIAkJCXNjYW5uZXIuc2V0U291cmNlKHRoaXMuY3VycmVudFBvc3NpYmxlTWF0Y2guZ2V0Q29udGVudHMoKSk7CiAJCQlzY2FubmVyLnJlc2V0VG8obmFtZVNvdXJjZVN0YXJ0LCBtZXRob2Quc291cmNlRW5kKTsKQEAgLTIwMTksMTQgKzIxNTMsMjkgQEAKIAogCS8vIGhhbmRsZSBub2RlcyBmb3IgdGhlIGxvY2FsIHR5cGUgZmlyc3QKIAlpZiAoKG1ldGhvZC5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDApIHsKLQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkKKwkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgewogCQkJZW5jbG9zaW5nRWxlbWVudCA9IGNyZWF0ZUhhbmRsZShtZXRob2QsIHBhcmVudCk7Ci0JCUxvY2FsRGVjbGFyYXRpb25WaXNpdG9yIGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yID0gbmV3IExvY2FsRGVjbGFyYXRpb25WaXNpdG9yKGVuY2xvc2luZ0VsZW1lbnQsIG1ldGhvZC5iaW5kaW5nLCBub2RlU2V0KTsKKwkJfQorCQkvLyBUcmF2ZXJzZSBtZXRob2QgZGVjbGFyYXRpb24gdG8gcmVwb3J0IG1hdGNoZXMgYm90aCBpbiBsb2NhbCB0eXBlcyBkZWNsYXJhdGlvbgorCQkvLyBhbmQgaW4gbG9jYWwgdmFyaWFibGVzIGRlY2xhcmF0aW9uCisJCUFTVE5vZGVbXSBub2RlcyA9IHR5cGVJbkhpZXJhcmNoeSA/IG5vZGVTZXQubWF0Y2hpbmdOb2RlcyhtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kKSA6IG51bGw7CisJCWJvb2xlYW4gcmVwb3J0ID0gKHRoaXMubWF0Y2hDb250YWluZXIgJiBQYXR0ZXJuTG9jYXRvci5NRVRIT0RfQ09OVEFJTkVSKSAhPSAwICYmIGVuY2xvc2VzKGVuY2xvc2luZ0VsZW1lbnQpOworCQlNZW1iZXJEZWNsYXJhdGlvblZpc2l0b3IgZGVjbGFyYXRpb25WaXNpdG9yID0gbmV3IE1lbWJlckRlY2xhcmF0aW9uVmlzaXRvcihlbmNsb3NpbmdFbGVtZW50LCByZXBvcnQgPyBub2RlcyA6IG51bGwsIG5vZGVTZXQsIHRoaXMpOwogCQl0cnkgewotCQkJbWV0aG9kLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSkgbnVsbCk7CisJCQltZXRob2QudHJhdmVyc2UoZGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSkgbnVsbCk7CiAJCX0gY2F0Y2ggKFdyYXBwZWRDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IGUuY29yZUV4Y2VwdGlvbjsKIAkJfQorCQkvLyBSZXBvcnQgYWxsIG5vZGVzIGFuZCByZW1vdmUgdGhlbQorCQlpZiAobm9kZXMgIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IG5vZGVzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobm9kZXNbaV0pOworCQkJCWlmIChyZXBvcnQgJiYgbGV2ZWwgIT0gbnVsbCkgeworCSAgICAJICAgICAgICB0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGVzW2ldLCBlbmNsb3NpbmdFbGVtZW50LCBkZWNsYXJhdGlvblZpc2l0b3IuZ2V0TG9jYWxFbGVtZW50KGkpLCBkZWNsYXJhdGlvblZpc2l0b3IuZ2V0T3RoZXJFbGVtZW50cyhpKSwgbWV0aG9kLmJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJfQogCX0KIAogCS8vIHJlcG9ydCB0aGUgdHlwZSBwYXJhbWV0ZXJzCkBAIC0yMDM1LDcgKzIxODQsOSBAQAogCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSB7CiAJCQllbmNsb3NpbmdFbGVtZW50ID0gY3JlYXRlSGFuZGxlKG1ldGhvZCwgcGFyZW50KTsKIAkJfQotCQlyZXBvcnRNYXRjaGluZyh0eXBlUGFyYW1ldGVycywgZW5jbG9zaW5nRWxlbWVudCwgcGFyZW50LCBtZXRob2QuYmluZGluZywgbm9kZVNldCk7CisJCWlmIChlbmNsb3NpbmdFbGVtZW50ICE9IG51bGwpIHsKKwkJCXJlcG9ydE1hdGNoaW5nKHR5cGVQYXJhbWV0ZXJzLCBlbmNsb3NpbmdFbGVtZW50LCBwYXJlbnQsIG1ldGhvZC5iaW5kaW5nLCBub2RlU2V0KTsKKwkJfQogCX0KIAogCS8vIHJlcG9ydCBhbm5vdGF0aW9ucwpAQCAtMjA0Myw3ICsyMTk0LDkgQEAKIAkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgewogCQkJZW5jbG9zaW5nRWxlbWVudCA9IGNyZWF0ZUhhbmRsZShtZXRob2QsIHBhcmVudCk7CiAJCX0KLQkJcmVwb3J0TWF0Y2hpbmcobWV0aG9kLmFubm90YXRpb25zLCBlbmNsb3NpbmdFbGVtZW50LCBtZXRob2QuYmluZGluZywgbm9kZVNldCwgdHJ1ZSwgdHJ1ZSk7CisJCWlmIChlbmNsb3NpbmdFbGVtZW50ICE9IG51bGwpIHsKKwkJCXJlcG9ydE1hdGNoaW5nKG1ldGhvZC5hbm5vdGF0aW9ucywgZW5jbG9zaW5nRWxlbWVudCwgbnVsbCwgbWV0aG9kLmJpbmRpbmcsIG5vZGVTZXQsIHRydWUsIHRydWUpOworCQl9CiAJfQogCiAJLy8gcmVmZXJlbmNlcyBpbiB0aGlzIG1ldGhvZApAQCAtMjA1MSwzNiArMjIwNCw2NyBAQAogCQlBU1ROb2RlW10gbm9kZXMgPSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAJCWlmIChub2RlcyAhPSBudWxsKSB7CiAJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBQYXR0ZXJuTG9jYXRvci5NRVRIT0RfQ09OVEFJTkVSKSAhPSAwKSB7Ci0JCQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkKKwkJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSB7CiAJCQkJCWVuY2xvc2luZ0VsZW1lbnQgPSBjcmVhdGVIYW5kbGUobWV0aG9kLCBwYXJlbnQpOworCQkJCX0KIAkJCQlpZiAoZW5jbG9zZXMoZW5jbG9zaW5nRWxlbWVudCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQkJCUFTVE5vZGUgbm9kZSA9IG5vZGVzW2ldOwotCQkJCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KG5vZGUpOwotCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShub2RlLCBlbmNsb3NpbmdFbGVtZW50LCBtZXRob2QuYmluZGluZywgbWV0aG9kLnNjb3BlLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQkJaWYgKHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSkgeworCQkJCQkJLy8gVmlzaXQgb25seSBpZiB0aGUgcGF0dGVybiBtdXN0IHJlc29sdmUKKwkJCQkJCU1lbWJlckRlY2xhcmF0aW9uVmlzaXRvciBkZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTWVtYmVyRGVjbGFyYXRpb25WaXNpdG9yKGVuY2xvc2luZ0VsZW1lbnQsIG5vZGVzLCBub2RlU2V0LCB0aGlzKTsKKwkJCQkJCW1ldGhvZC50cmF2ZXJzZShkZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKSBudWxsKTsKKwkJCQkJCWludCBsZW5ndGggPSBub2Rlcy5sZW5ndGg7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KG5vZGVzW2ldKTsKKwkJCQkJCQlpZiAobGV2ZWwgIT0gbnVsbCkgeyAvLyBlbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlIGhhcyBub3QgYmVlbiBhbHJlYWR5IHJlcG9ydGVkIHdoaWxlIHZpc2l0aW5nCisJCQkJICAgIAkgICAgICAgIHRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uobm9kZXNbaV0sIGVuY2xvc2luZ0VsZW1lbnQsIGRlY2xhcmF0aW9uVmlzaXRvci5nZXRMb2NhbEVsZW1lbnQoaSksIGRlY2xhcmF0aW9uVmlzaXRvci5nZXRPdGhlckVsZW1lbnRzKGkpLCBtZXRob2QuYmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCQkJCQlBU1ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKKwkJCQkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobm9kZSk7CisJCQkJCQkJaWYgKGxldmVsICE9IG51bGwpIHsgLy8gZW5zdXJlIHRoYXQgdGhlIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gYWxyZWFkeSByZXBvcnRlZCB3aGlsZSB2aXNpdGluZworCQkJCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGUsIGVuY2xvc2luZ0VsZW1lbnQsIG51bGwsIG51bGwsIG1ldGhvZC5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQkJCQl9CisJCQkJCQl9CiAJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQkJLy8gUmVtb3ZlIGFsbCByZW1haW5pbmcgbm9kZXMKKwkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQkJbm9kZVNldC5tYXRjaGluZ05vZGVzLnJlbW92ZUtleShub2Rlc1tpXSk7CisJCQl9CiAJCX0KIAl9CiB9CiAvKioKICAqIFJlcG9ydCBtYXRjaGluZyBpbiBhbm5vdGF0aW9ucy4KKyAqIEBwYXJhbSBvdGhlckVsZW1lbnRzIFRPRE8KICAqLwotcHJvdGVjdGVkIHZvaWQgcmVwb3J0TWF0Y2hpbmcoQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgQmluZGluZyBlbGVtZW50QmluZGluZywgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQsIGJvb2xlYW4gbWF0Y2hlZENvbnRhaW5lciwgYm9vbGVhbiBlbmNsb3Nlc0VsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKK3Byb3RlY3RlZCB2b2lkIHJlcG9ydE1hdGNoaW5nKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0LCBib29sZWFuIG1hdGNoZWRDb250YWluZXIsIGJvb2xlYW4gZW5jbG9zZXNFbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJZm9yIChpbnQgaT0wLCBhbD1hbm5vdGF0aW9ucy5sZW5ndGg7IGk8YWw7IGkrKykgewogCQlBbm5vdGF0aW9uIGFubm90YXRpb25UeXBlID0gYW5ub3RhdGlvbnNbaV07CisJCUlKYXZhRWxlbWVudCBsb2NhbEFubm90YXRpb24gPSBudWxsOworCQlJSmF2YUVsZW1lbnRbXSBvdGhlckFubm90YXRpb25zID0gbnVsbDsKKwkJaW50IGxlbmd0aCA9IG90aGVyRWxlbWVudHMgPT0gbnVsbCA/IDAgOiBvdGhlckVsZW1lbnRzLmxlbmd0aDsKKwkJYm9vbGVhbiBoYW5kbGVzQ3JlYXRlZCA9IGZhbHNlOwogCiAJCS8vIExvb2sgZm9yIGFubm90YXRpb24gdHlwZSByZWYKIAkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gYW5ub3RhdGlvblR5cGUudHlwZTsKIAkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KHR5cGVSZWYpOwotCQlpZiAobGV2ZWwgIT0gbnVsbCAmJiBtYXRjaGVkQ29udGFpbmVyKSB7Ci0JCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHR5cGVSZWYsIGVuY2xvc2luZ0VsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJaWYgKGxldmVsICE9IG51bGwgJiYgZW5jbG9zZXNFbGVtZW50ICYmIG1hdGNoZWRDb250YWluZXIpIHsKKwkJCWxvY2FsQW5ub3RhdGlvbiA9IGNyZWF0ZUhhbmRsZShhbm5vdGF0aW9uVHlwZSwgKElBbm5vdGF0YWJsZSkgZW5jbG9zaW5nRWxlbWVudCk7CisJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCW90aGVyQW5ub3RhdGlvbnMgPSBuZXcgSUphdmFFbGVtZW50W2xlbmd0aF07CisJCQkJZm9yIChpbnQgbz0wOyBvPGxlbmd0aDsgbysrKSB7CisJCQkJCW90aGVyQW5ub3RhdGlvbnNbb10gPSBjcmVhdGVIYW5kbGUoYW5ub3RhdGlvblR5cGUsIChJQW5ub3RhdGFibGUpIG90aGVyRWxlbWVudHNbb10pOworCQkJCX0KKwkJCX0KKwkJCWhhbmRsZXNDcmVhdGVkID0gdHJ1ZTsKKwkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2UodHlwZVJlZiwgZW5jbG9zaW5nRWxlbWVudCwgbG9jYWxBbm5vdGF0aW9uLCBvdGhlckFubm90YXRpb25zLCBlbGVtZW50QmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CiAJCX0KLQkJCisKIAkJLy8gTG9vayBmb3IgYXR0cmlidXRlIHJlZgogCQlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb25UeXBlLm1lbWJlclZhbHVlUGFpcnMoKTsKIAkJZm9yIChpbnQgaiA9IDAsIHBsID0gcGFpcnMubGVuZ3RoOyBqIDwgcGw7IGorKykgewpAQCAtMjA4OCwxMCArMjI3MiwyMCBAQAogCQkJbGV2ZWwgPSAoSW50ZWdlcikgbm9kZVNldC5tYXRjaGluZ05vZGVzLnJlbW92ZUtleShwYWlyKTsKIAkJCWlmIChsZXZlbCAhPSBudWxsICYmIGVuY2xvc2VzRWxlbWVudCkgewogCQkJCUFTVE5vZGUgcmVmZXJlbmNlID0gKGFubm90YXRpb25UeXBlIGluc3RhbmNlb2YgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgPyAoQVNUTm9kZSkgYW5ub3RhdGlvblR5cGU6IHBhaXI7Ci0JCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVuY2xvc2luZ0VsZW1lbnQsIHBhaXIuYmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJaWYgKCFoYW5kbGVzQ3JlYXRlZCkgeworCQkJCQlsb2NhbEFubm90YXRpb24gPSBjcmVhdGVIYW5kbGUoYW5ub3RhdGlvblR5cGUsIChJQW5ub3RhdGFibGUpIGVuY2xvc2luZ0VsZW1lbnQpOworCQkJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCQkJb3RoZXJBbm5vdGF0aW9ucyA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoXTsKKwkJCQkJCWZvciAoaW50IG89MDsgbzxsZW5ndGg7IG8rKykgeworCQkJCQkJCW90aGVyQW5ub3RhdGlvbnNbb10gPSBjcmVhdGVIYW5kbGUoYW5ub3RhdGlvblR5cGUsIChJQW5ub3RhdGFibGUpIG90aGVyRWxlbWVudHNbb10pOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWhhbmRsZXNDcmVhdGVkID0gdHJ1ZTsKKwkJCQl9CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVuY2xvc2luZ0VsZW1lbnQsIGxvY2FsQW5ub3RhdGlvbiwgb3RoZXJBbm5vdGF0aW9ucywgcGFpci5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJCX0KIAkJfQotCQkKKwogCQkvLyBMb29rIGZvciByZWZlcmVuY2UgaW5zaWRlIGFubm90YXRpb24KIAkJQVNUTm9kZVtdIG5vZGVzID0gbm9kZVNldC5tYXRjaGluZ05vZGVzKGFubm90YXRpb25UeXBlLnNvdXJjZVN0YXJ0LCBhbm5vdGF0aW9uVHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CiAJCWlmIChub2RlcyAhPSBudWxsKSB7CkBAIC0yMTA0LDcgKzIyOTgsMTcgQEAKIAkJCQkJQVNUTm9kZSBub2RlID0gbm9kZXNbal07CiAJCQkJCWxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobm9kZSk7CiAJCQkJCWlmIChlbmNsb3Nlc0VsZW1lbnQpIHsKLQkJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uobm9kZSwgZW5jbG9zaW5nRWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCQkJaWYgKCFoYW5kbGVzQ3JlYXRlZCkgeworCQkJCQkJCWxvY2FsQW5ub3RhdGlvbiA9IGNyZWF0ZUhhbmRsZShhbm5vdGF0aW9uVHlwZSwgKElBbm5vdGF0YWJsZSkgZW5jbG9zaW5nRWxlbWVudCk7CisJCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQkJCQkJb3RoZXJBbm5vdGF0aW9ucyA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoXTsKKwkJCQkJCQkJZm9yIChpbnQgbz0wOyBvPGxlbmd0aDsgbysrKSB7CisJCQkJCQkJCQlvdGhlckFubm90YXRpb25zW29dID0gY3JlYXRlSGFuZGxlKGFubm90YXRpb25UeXBlLCAoSUFubm90YXRhYmxlKSBvdGhlckVsZW1lbnRzW29dKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQloYW5kbGVzQ3JlYXRlZCA9IHRydWU7CisJCQkJCQl9CisJCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGUsIGVuY2xvc2luZ0VsZW1lbnQsIGxvY2FsQW5ub3RhdGlvbiwgb3RoZXJBbm5vdGF0aW9ucywgZWxlbWVudEJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMjEyNyw2ICsyMzMxLDcgQEAKIAkJU3lzdGVtLm91dC5wcmludCgiCS0gbXVzdCByZXNvbHZlOiAiK211c3RSZXNvbHZlKTsgLy8kTk9OLU5MUy0xJAogCQlTeXN0ZW0ub3V0LnByaW50KCIgKGxvY2F0b3I6ICIrdGhpcy5wYXR0ZXJuTG9jYXRvci5tdXN0UmVzb2x2ZSk7IC8vJE5PTi1OTFMtMSQKIAkJU3lzdGVtLm91dC5wcmludGxuKCIsIG5vZGVTZXQ6ICIrbm9kZVNldC5tdXN0UmVzb2x2ZSsnKScpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiCS0gZmluZSBncmFpbiBmbGFncz0iKyBKYXZhU2VhcmNoUGF0dGVybi5nZXRGaW5lR3JhaW5GbGFnU3RyaW5nKHRoaXMucGF0dGVybkxvY2F0b3IuZmluZUdyYWluKCkpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAlpZiAobXVzdFJlc29sdmUpIHsKIAkJdGhpcy51bml0U2NvcGU9IHVuaXQuc2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKTsKQEAgLTIxNDIsMTEgKzIzNDcsMTIgQEAKIAogCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYgPSAoSW1wb3J0UmVmZXJlbmNlKSBub2RlOwogCQkJCUJpbmRpbmcgYmluZGluZyA9IChpbXBvcnRSZWYuYml0cyAmIEFTVE5vZGUuT25EZW1hbmQpICE9IDAKLQkJCQkJPyB1bml0U2NvcGUuZ2V0SW1wb3J0KENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW1wb3J0UmVmLnRva2VucywgMCwgaW1wb3J0UmVmLnRva2Vucy5sZW5ndGgpLCB0cnVlLCBpbXBvcnRSZWYuaXNTdGF0aWMoKSkKLQkJCQkJOiB1bml0U2NvcGUuZ2V0SW1wb3J0KGltcG9ydFJlZi50b2tlbnMsIGZhbHNlLCBpbXBvcnRSZWYuaXNTdGF0aWMoKSk7CisJCQkJCT8gdGhpcy51bml0U2NvcGUuZ2V0SW1wb3J0KENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW1wb3J0UmVmLnRva2VucywgMCwgaW1wb3J0UmVmLnRva2Vucy5sZW5ndGgpLCB0cnVlLCBpbXBvcnRSZWYuaXNTdGF0aWMoKSkKKwkJCQkJOiB0aGlzLnVuaXRTY29wZS5nZXRJbXBvcnQoaW1wb3J0UmVmLnRva2VucywgZmFsc2UsIGltcG9ydFJlZi5pc1N0YXRpYygpKTsKIAkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoTGV2ZWxBbmRSZXBvcnRJbXBvcnRSZWYoaW1wb3J0UmVmLCBiaW5kaW5nLCB0aGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJbm9kZVNldC5hZGRNYXRjaChub2RlLCB0aGlzLnBhdHRlcm5Mb2NhdG9yLnJlc29sdmVMZXZlbChub2RlKSk7CiAJCQl9Ci0JCQlub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybkxvY2F0b3IucmVzb2x2ZUxldmVsKG5vZGUpKTsKIAkJfQogCQlub2RlU2V0LnBvc3NpYmxlTWF0Y2hpbmdOb2Rlc1NldCA9IG5ldyBTaW1wbGVTZXQoMyk7CiAJCWlmIChCYXNpY1NlYXJjaEVuZ2luZS5WRVJCT1NFKSB7CkBAIC0yMTc2LDggKzIzODIsOSBAQAogCQkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQkJCUFTVE5vZGUgbm9kZSA9IG5vZGVzW2ldOwogCQkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobm9kZSk7Ci0JCQkJCWlmIChlbmNsb3NlcyhlbGVtZW50KSkKLQkJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uobm9kZSwgZWxlbWVudCwgbnVsbC8qbm8gYmluZGluZyovLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQkJaWYgKGVuY2xvc2VzKGVsZW1lbnQpKSB7CisJCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGUsIGVsZW1lbnQsIG51bGwsIG51bGwsIG51bGwvKm5vIGJpbmRpbmcqLywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTIxODgsNyArMjM5NSw3IEBACiAJCWlmIChwa2cgIT0gbnVsbCAmJiBwa2cuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25IYW5kbGUodW5pdCk7CiAJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0TWF0Y2hpbmcocGtnLmFubm90YXRpb25zLCBlbGVtZW50LCBudWxsLCBub2RlU2V0LCB0cnVlLCBlbmNsb3NlcyhlbGVtZW50KSk7CisJCQkJcmVwb3J0TWF0Y2hpbmcocGtnLmFubm90YXRpb25zLCBlbGVtZW50LCBudWxsLCBudWxsLCBub2RlU2V0LCB0cnVlLCBlbmNsb3NlcyhlbGVtZW50KSk7CiAJCQl9CiAJCX0KIApAQCAtMjE5Nyw4ICsyNDA0LDkgQEAKIAkJCWZvciAoaW50IGkgPSAwLCBsID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmID0gaW1wb3J0c1tpXTsKIAkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkoaW1wb3J0UmVmKTsKLQkJCQlpZiAobGV2ZWwgIT0gbnVsbCkKLQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydEltcG9ydFJlZihpbXBvcnRSZWYsIG51bGwvKm5vIGJpbmRpbmcqLywgY3JlYXRlSW1wb3J0SGFuZGxlKGltcG9ydFJlZiksIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCWlmIChsZXZlbCAhPSBudWxsKSB7CisJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRJbXBvcnRSZWYoaW1wb3J0UmVmLCBudWxsIC8qbm8gYmluZGluZyovLCBjcmVhdGVJbXBvcnRIYW5kbGUoaW1wb3J0UmVmKSwgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMjIxMyw3ICsyNDIxLDcgQEAKIAkJCXJlcG9ydE1hdGNoaW5nKHR5cGUsIG51bGwsIGFjY3VyYWN5LCBub2RlU2V0LCAxKTsKIAkJfQogCX0KLQkKKwogCS8vIENsZWFyIGhhbmRsZSBjYWNoZQogCXRoaXMubWV0aG9kSGFuZGxlcyA9IG51bGw7CiAJdGhpcy5iaW5kaW5ncy5yZW1vdmVLZXkodGhpcy5wYXR0ZXJuKTsKQEAgLTIyMjEsNyArMjQyOSw3IEBACiB9CiAvKioKICAqIFZpc2l0IHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCi0gKiBzZWFyY2ggcGF0dGVybiAoaWUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCisgKiBzZWFyY2ggcGF0dGVybiAoaS5lLiB0aGUgb25lcyBpbiB0aGUgbWF0Y2hpbmcgbm9kZXMgc2V0KQogICovCiBwcm90ZWN0ZWQgdm9pZCByZXBvcnRNYXRjaGluZyhGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBGaWVsZERlY2xhcmF0aW9uW10gb3RoZXJGaWVsZHMsIFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBpbnQgYWNjdXJhY3ksIGJvb2xlYW4gdHlwZUluSGllcmFyY2h5LCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50ID0gbnVsbDsKQEAgLTIyNDAsMjIgKzI0NDgsNTAgQEAKIAogCS8vIGhhbmRsZSB0aGUgbm9kZXMgZm9yIHRoZSBsb2NhbCB0eXBlIGZpcnN0CiAJaWYgKChmaWVsZC5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDApIHsKLQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkKKwkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgewogCQkJZW5jbG9zaW5nRWxlbWVudCA9IGNyZWF0ZUhhbmRsZShmaWVsZCwgdHlwZSwgcGFyZW50KTsKLQkJTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IoZW5jbG9zaW5nRWxlbWVudCwgZmllbGQuYmluZGluZywgbm9kZVNldCk7CisJCX0KKwkJLy8gVHJhdmVyc2UgZmllbGQgZGVjbGFyYXRpb24ocykgdG8gcmVwb3J0IG1hdGNoZXMgYm90aCBpbiBsb2NhbCB0eXBlcyBkZWNsYXJhdGlvbgorCQkvLyBhbmQgaW4gbG9jYWwgdmFyaWFibGVzIGRlY2xhcmF0aW9uCisJCWludCBmaWVsZEVuZCA9IGZpZWxkLmVuZFBhcnQyUG9zaXRpb24gPT0gMCA/IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kIDogZmllbGQuZW5kUGFydDJQb3NpdGlvbjsKKwkJQVNUTm9kZVtdIG5vZGVzID0gdHlwZUluSGllcmFyY2h5ID8gbm9kZVNldC5tYXRjaGluZ05vZGVzKGZpZWxkLnNvdXJjZVN0YXJ0LCBmaWVsZEVuZCkgOiBudWxsOworCQlib29sZWFuIHJlcG9ydCA9ICh0aGlzLm1hdGNoQ29udGFpbmVyICYgUGF0dGVybkxvY2F0b3IuRklFTERfQ09OVEFJTkVSKSAhPSAwICYmIGVuY2xvc2VzKGVuY2xvc2luZ0VsZW1lbnQpOworCQlNZW1iZXJEZWNsYXJhdGlvblZpc2l0b3IgZGVjbGFyYXRpb25WaXNpdG9yID0gbmV3IE1lbWJlckRlY2xhcmF0aW9uVmlzaXRvcihlbmNsb3NpbmdFbGVtZW50LCByZXBvcnQgPyBub2RlcyA6IG51bGwsIG5vZGVTZXQsIHRoaXMpOwogCQl0cnkgewotCQkJZmllbGQudHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG51bGwpOworCQkJZmllbGQudHJhdmVyc2UoZGVjbGFyYXRpb25WaXNpdG9yLCAoTWV0aG9kU2NvcGUpIG51bGwpOwogCQl9IGNhdGNoIChXcmFwcGVkQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBlLmNvcmVFeGNlcHRpb247CiAJCX0KKwkJLy8gUmVwb3J0IGFsbCBub2RlcyBhbmQgcmVtb3ZlIHRoZW0KKwkJaWYgKG5vZGVzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSBub2Rlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJQVNUTm9kZSBub2RlID0gbm9kZXNbaV07CisJCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KG5vZGUpOworCQkJCWlmIChyZXBvcnQgJiYgbGV2ZWwgIT0gbnVsbCkgeworCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCQkJLy8gdXNlIGZpZWxkIGRlY2xhcmF0aW9uIHRvIHJlcG9ydCBtYXRjaCAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgxNzQpCisJCQkJCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uID0gKChUeXBlRGVjbGFyYXRpb24pbm9kZSkuYWxsb2NhdGlvbjsKKwkJCQkJCWlmIChhbGxvY2F0aW9uICE9IG51bGwgJiYgYWxsb2NhdGlvbi5lbnVtQ29uc3RhbnQgIT0gbnVsbCkgeworCQkJCQkJCW5vZGUgPSBmaWVsZDsKKwkJCQkJCX0KKwkJCQkJfQorCSAgICAJICAgICAgICB0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGUsIGVuY2xvc2luZ0VsZW1lbnQsIGRlY2xhcmF0aW9uVmlzaXRvci5nZXRMb2NhbEVsZW1lbnQoaSksIGRlY2xhcmF0aW9uVmlzaXRvci5nZXRPdGhlckVsZW1lbnRzKGkpLCBmaWVsZC5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQl9CisJCQl9CisJCX0KIAl9CiAKIAkvLyByZXBvcnQgYW5ub3RhdGlvbnMKKwlJSmF2YUVsZW1lbnRbXSBvdGhlckVsZW1lbnRzID0gbnVsbDsKIAlpZiAoZmllbGQuYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSB7CiAJCQllbmNsb3NpbmdFbGVtZW50ID0gY3JlYXRlSGFuZGxlKGZpZWxkLCB0eXBlLCBwYXJlbnQpOwogCQl9Ci0JCXJlcG9ydE1hdGNoaW5nKGZpZWxkLmFubm90YXRpb25zLCBlbmNsb3NpbmdFbGVtZW50LCBmaWVsZC5iaW5kaW5nLCBub2RlU2V0LCB0cnVlLCB0cnVlKTsKKwkJaWYgKG90aGVyRmllbGRzICE9IG51bGwpIHsKKwkJCW90aGVyRWxlbWVudHMgPSBjcmVhdGVIYW5kbGVzKG90aGVyRmllbGRzLCB0eXBlLCBwYXJlbnQpOworCQl9CisJCXJlcG9ydE1hdGNoaW5nKGZpZWxkLmFubm90YXRpb25zLCBlbmNsb3NpbmdFbGVtZW50LCBvdGhlckVsZW1lbnRzLCBmaWVsZC5iaW5kaW5nLCBub2RlU2V0LCB0cnVlLCB0cnVlKTsKIAl9CiAKIAlpZiAodHlwZUluSGllcmFyY2h5KSB7CkBAIC0yMjczLDE3ICsyNTA5LDggQEAKIAkJCQkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQkJCQkJQVNUTm9kZSBub2RlID0gbm9kZXNbaV07CiAJCQkJCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KG5vZGUpOwotCQkJCQkJCUlKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMgPSBudWxsOwotCQkJCQkJCWlmIChvdGhlckZpZWxkcyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBsZW5ndGggPSBvdGhlckZpZWxkcy5sZW5ndGg7Ci0JCQkJCQkJCWludCBzaXplID0gMDsKLQkJCQkJCQkJd2hpbGUgKHNpemU8bGVuZ3RoICYmIG90aGVyRmllbGRzW3NpemVdICE9IG51bGwpIHsKLQkJCQkJCQkJCXNpemUrKzsKLQkJCQkJCQkJfQotCQkJCQkJCQlvdGhlckVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtzaXplXTsKLQkJCQkJCQkJZm9yIChpbnQgaj0wOyBqPHNpemU7IGorKykgewotCQkJCQkJCQkJb3RoZXJFbGVtZW50c1tqXSA9IGNyZWF0ZUhhbmRsZShvdGhlckZpZWxkc1tqXSwgdHlwZSwgcGFyZW50KTsKLQkJCQkJCQkJfQorCQkJCQkJCWlmIChvdGhlckZpZWxkcyAhPSBudWxsICYmIG90aGVyRWxlbWVudHMgPT0gbnVsbCkgeworCQkJCQkJCQlvdGhlckVsZW1lbnRzID0gY3JlYXRlSGFuZGxlcyhvdGhlckZpZWxkcywgdHlwZSwgcGFyZW50KTsKIAkJCQkJCQl9CiAJCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShub2RlLCBlbmNsb3NpbmdFbGVtZW50LCBudWxsLCBvdGhlckVsZW1lbnRzLCBmaWVsZC5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJCQkJCX0KQEAgLTIyOTcsMzEgKzI1MjQsMzIgQEAKIAkJQVNUTm9kZVtdIG5vZGVzID0gbm9kZVNldC5tYXRjaGluZ05vZGVzKGZpZWxkLnNvdXJjZVN0YXJ0LCBmaWVsZEVuZCk7CiAJCWlmIChub2RlcyAhPSBudWxsKSB7CiAJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBQYXR0ZXJuTG9jYXRvci5GSUVMRF9DT05UQUlORVIpID09IDApIHsKLQkJCQlmb3IgKGludCBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCQlmb3IgKGludCBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJCQlub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KG5vZGVzW2ldKTsKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWlmIChlbmNsb3NpbmdFbGVtZW50ID09IG51bGwpIHsKIAkJCQkJZW5jbG9zaW5nRWxlbWVudCA9IGNyZWF0ZUhhbmRsZShmaWVsZCwgdHlwZSwgcGFyZW50KTsKIAkJCQl9CiAJCQkJaWYgKGVuY2xvc2VzKGVuY2xvc2luZ0VsZW1lbnQpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQkJCU1lbWJlckRlY2xhcmF0aW9uVmlzaXRvciBkZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTWVtYmVyRGVjbGFyYXRpb25WaXNpdG9yKGVuY2xvc2luZ0VsZW1lbnQsIG5vZGVzLCBub2RlU2V0LCB0aGlzKTsKKwkJCQkJZmllbGQudHJhdmVyc2UoZGVjbGFyYXRpb25WaXNpdG9yLCAoTWV0aG9kU2NvcGUpIG51bGwpOworCQkJCQlpbnQgbGVuZ3RoID0gbm9kZXMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCQlBU1ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKIAkJCQkJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcikgbm9kZVNldC5tYXRjaGluZ05vZGVzLnJlbW92ZUtleShub2RlKTsKLQkJCQkJCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJLy8gdXNlIGZpZWxkIGRlY2xhcmF0aW9uIHRvIHJlcG9ydCBtYXRjaCAoc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgxNzQpCi0JCQkJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbiA9ICgoVHlwZURlY2xhcmF0aW9uKW5vZGUpLmFsbG9jYXRpb247Ci0JCQkJCQkJaWYgKGFsbG9jYXRpb24gIT0gbnVsbCAmJiBhbGxvY2F0aW9uLmVudW1Db25zdGFudCAhPSBudWxsKSB7Ci0JCQkJCQkJCW5vZGUgPSBmaWVsZDsKKwkJCQkJCWlmIChsZXZlbCAhPSBudWxsKSB7IC8vIGVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIGFscmVhZHkgcmVwb3J0ZWQgd2hpbGUgdmlzaXRpbmcKKwkJCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCQkJCQkvLyB1c2UgZmllbGQgZGVjbGFyYXRpb24gdG8gcmVwb3J0IG1hdGNoIChzZWUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODE3NCkKKwkJCQkJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbiA9ICgoVHlwZURlY2xhcmF0aW9uKW5vZGUpLmFsbG9jYXRpb247CisJCQkJCQkJCWlmIChhbGxvY2F0aW9uICE9IG51bGwgJiYgYWxsb2NhdGlvbi5lbnVtQ29uc3RhbnQgIT0gbnVsbCkgeworCQkJCQkJCQkJbm9kZSA9IGZpZWxkOworCQkJCQkJCQl9CiAJCQkJCQkJfQorCQkJICAgIAkgICAgICAgIHRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uobm9kZSwgZW5jbG9zaW5nRWxlbWVudCwgZGVjbGFyYXRpb25WaXNpdG9yLmdldExvY2FsRWxlbWVudChpKSwgZGVjbGFyYXRpb25WaXNpdG9yLmdldE90aGVyRWxlbWVudHMoaSksIGZpZWxkLmJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOwogCQkJCQkJfQotCQkJCQkJLy8gU2V0IGJsb2NrIHNjb3BlIGZvciBpbml0aWFsaXplciBpbiBjYXNlIHRoZXJlIHdvdWxkIGhhdmUgb3RoZXIgbG9jYWwgYW5kIG90aGVyIGVsZW1lbnRzIHRvIHJlcG9ydAotCQkJCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gbnVsbDsKLQkJCQkJCWlmIChmaWVsZC5nZXRLaW5kKCkgPT0gQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLklOSVRJQUxJWkVSKSB7Ci0JCQkJCQkJQmxvY2sgYmxvY2sgPSAoKEluaXRpYWxpemVyKWZpZWxkKS5ibG9jazsKLQkJCQkJCQlpZiAoYmxvY2sgIT0gbnVsbCkgYmxvY2tTY29wZSA9IGJsb2NrLnNjb3BlOwotCQkJCQkJfQotCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShub2RlLCBlbmNsb3NpbmdFbGVtZW50LCBmaWVsZC5iaW5kaW5nLCBibG9ja1Njb3BlLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJCQkJfQorCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yMzI5LDcgKzI1NTcsNyBAQAogfQogLyoqCiAgKiBWaXNpdCB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJhdGlvbiBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCi0gKiBzZWFyY2ggcGF0dGVybiAoaWUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCisgKiBzZWFyY2ggcGF0dGVybiAoaS5lLiB0aGUgb25lcyBpbiB0aGUgbWF0Y2hpbmcgbm9kZXMgc2V0KQogICovCiBwcm90ZWN0ZWQgdm9pZCByZXBvcnRNYXRjaGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZSwgSUphdmFFbGVtZW50IHBhcmVudCwgaW50IGFjY3VyYWN5LCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCwgaW50IG9jY3VycmVuY2VDb3VudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCS8vIGNyZWF0ZSB0eXBlIGhhbmRsZQpAQCAtMjM2NSw3ICsyNTkzLDcgQEAKIAogCS8vIHJlcG9ydCBhbm5vdGF0aW9ucwogCWlmICh0eXBlLmFubm90YXRpb25zICE9IG51bGwpIHsKLQkJcmVwb3J0TWF0Y2hpbmcodHlwZS5hbm5vdGF0aW9ucywgZW5jbG9zaW5nRWxlbWVudCwgdHlwZS5iaW5kaW5nLCBub2RlU2V0LCBtYXRjaGVkQ2xhc3NDb250YWluZXIsIGVuY2xvc2VzRWxlbWVudCk7CisJCXJlcG9ydE1hdGNoaW5nKHR5cGUuYW5ub3RhdGlvbnMsIGVuY2xvc2luZ0VsZW1lbnQsIG51bGwsIHR5cGUuYmluZGluZywgbm9kZVNldCwgbWF0Y2hlZENsYXNzQ29udGFpbmVyLCBlbmNsb3Nlc0VsZW1lbnQpOwogCX0KIAogCS8vIHJlcG9ydCByZWZlcmVuY2VzIGluIGphdmFkb2MKQEAgLTIzODAsMjAgKzI2MDgsMjAgQEAKIAkJCQkJQVNUTm9kZSBub2RlID0gbm9kZXNbaV07CiAJCQkJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcikgbm9kZVNldC5tYXRjaGluZ05vZGVzLnJlbW92ZUtleShub2RlKTsKIAkJCQkJaWYgKGVuY2xvc2VzRWxlbWVudCkgewotCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShub2RlLCBlbmNsb3NpbmdFbGVtZW50LCB0eXBlLmJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShub2RlLCBlbmNsb3NpbmdFbGVtZW50LCBudWxsLCBudWxsLCB0eXBlLmJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAJfQotCQorCiAJLy8gc3VwZXIgdHlwZXMKIAlpZiAoKHR5cGUuYml0cyAmIEFTVE5vZGUuSXNBbm9ueW1vdXNUeXBlKSAhPSAwKSB7Ci0JCVR5cGVSZWZlcmVuY2Ugc3VwZXJUeXBlID10eXBlLmFsbG9jYXRpb24udHlwZTsKKwkJVHlwZVJlZmVyZW5jZSBzdXBlclR5cGUgPSB0eXBlLmFsbG9jYXRpb24udHlwZTsKIAkJaWYgKHN1cGVyVHlwZSAhPSBudWxsKSB7CiAJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkoc3VwZXJUeXBlKTsKIAkJCWlmIChsZXZlbCAhPSBudWxsICYmIG1hdGNoZWRDbGFzc0NvbnRhaW5lcikKLQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHN1cGVyVHlwZSwgZW5jbG9zaW5nRWxlbWVudCwgdHlwZS5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHN1cGVyVHlwZSwgZW5jbG9zaW5nRWxlbWVudCwgbnVsbCwgbnVsbCwgdHlwZS5iaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJfQogCX0gZWxzZSB7CiAJCVR5cGVSZWZlcmVuY2Ugc3VwZXJDbGFzcyA9IHR5cGUuc3VwZXJjbGFzczsKQEAgLTI0MTAsNyArMjYzOCw3IEBACiAKIAkvLyBmaWx0ZXIgb3V0IGVsZW1lbnQgbm90IGluIGhpZXJhcmNoeSBzY29wZQogCWJvb2xlYW4gdHlwZUluSGllcmFyY2h5ID0gdHlwZS5iaW5kaW5nID09IG51bGwgfHwgdHlwZUluSGllcmFyY2h5KHR5cGUuYmluZGluZyk7Ci0JbWF0Y2hlZENsYXNzQ29udGFpbmVyID0gbWF0Y2hlZENsYXNzQ29udGFpbmVyICYmIHR5cGVJbkhpZXJhcmNoeTsgCisJbWF0Y2hlZENsYXNzQ29udGFpbmVyID0gbWF0Y2hlZENsYXNzQ29udGFpbmVyICYmIHR5cGVJbkhpZXJhcmNoeTsKIAogCS8vIFZpc2l0IGZpZWxkcwogCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlLmZpZWxkczsKQEAgLTI0NjMsNyArMjY5MSw3IEBACiAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CiAJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobWV0aG9kKTsKIAkJCWludCB2YWx1ZSA9IChsZXZlbCAhPSBudWxsICYmIG1hdGNoZWRDbGFzc0NvbnRhaW5lcikgPyBsZXZlbC5pbnRWYWx1ZSgpIDogLTE7Ci0JCQlyZXBvcnRNYXRjaGluZyh0eXBlLCBtZXRob2QsIGVuY2xvc2luZ0VsZW1lbnQsIHZhbHVlLCB0eXBlSW5IaWVyYXJjaHksIG5vZGVTZXQpOworCQkJcmVwb3J0TWF0Y2hpbmcobWV0aG9kLCB0eXBlLCBlbmNsb3NpbmdFbGVtZW50LCB2YWx1ZSwgdHlwZUluSGllcmFyY2h5LCBub2RlU2V0KTsKIAkJfQogCX0KIApAQCAtMjUwMSwxNCArMjcyOSw2MyBAQAogCQkJCQlJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50ID0gY3JlYXRlSGFuZGxlKHR5cGVQYXJhbWV0ZXIsIGVuY2xvc2luZ0VsZW1lbnQpOwogCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXIudHlwZSwgZW5jbG9zaW5nRWxlbWVudCwgbG9jYWxFbGVtZW50LCBudWxsLCBiaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJCQl9CisJCQkJaWYgKHR5cGVQYXJhbWV0ZXIudHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlIHBhcmFtU1RSID0gKFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlUGFyYW1ldGVyLnR5cGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVNUUi50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCWludCBsZW5ndGggPSBwYXJhbVNUUi50eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgCWZvciAoaW50IGs9MDsgazxsZW5ndGg7IGsrKykgeworCQkJCQkJCVR5cGVSZWZlcmVuY2UgdHlwZUFyZ3VtZW50ID0gcGFyYW1TVFIudHlwZUFyZ3VtZW50c1trXTsKKwkJCQkJCQlsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KHR5cGVBcmd1bWVudCk7CisJCQkJCQkJaWYgKGxldmVsICE9IG51bGwpIHsKKwkJCQkJCQkJSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudCA9IGNyZWF0ZUhhbmRsZSh0eXBlUGFyYW1ldGVyLCBlbmNsb3NpbmdFbGVtZW50KTsKKwkJCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZSh0eXBlQXJndW1lbnQsIGVuY2xvc2luZ0VsZW1lbnQsIGxvY2FsRWxlbWVudCwgbnVsbCwgYmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJCQkJfQorCQkJCQkJCWlmICh0eXBlQXJndW1lbnQgaW5zdGFuY2VvZiBXaWxkY2FyZCkgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHdpbGRjYXJkQm91bmQgPSAoKFdpbGRjYXJkKSB0eXBlQXJndW1lbnQpLmJvdW5kOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRCb3VuZCAhPSBudWxsKSB7CisJCQkJCQkJCQlsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KHdpbGRjYXJkQm91bmQpOworCQkJCQkJCQkJaWYgKGxldmVsICE9IG51bGwpIHsKKwkJCQkJCQkJCQlJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50ID0gY3JlYXRlSGFuZGxlKHR5cGVQYXJhbWV0ZXIsIGVuY2xvc2luZ0VsZW1lbnQpOworCQkJCQkJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uod2lsZGNhcmRCb3VuZCwgZW5jbG9zaW5nRWxlbWVudCwgbG9jYWxFbGVtZW50LCBudWxsLCBiaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKKwkJCQkJCQkJCX0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCX0KIAkJCX0KIAkJCWlmICh0eXBlUGFyYW1ldGVyLmJvdW5kcyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaj0wLCBiPXR5cGVQYXJhbWV0ZXIuYm91bmRzLmxlbmd0aDsgajxiOyBqKyspIHsKLQkJCQkJbGV2ZWwgPSAoSW50ZWdlcikgbm9kZVNldC5tYXRjaGluZ05vZGVzLnJlbW92ZUtleSh0eXBlUGFyYW1ldGVyLmJvdW5kc1tqXSk7CisJCQkJCVR5cGVSZWZlcmVuY2UgdHlwZVBhcmFtZXRlckJvdW5kID0gdHlwZVBhcmFtZXRlci5ib3VuZHNbal07CisJCQkJCWxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkodHlwZVBhcmFtZXRlckJvdW5kKTsKIAkJCQkJaWYgKGxldmVsICE9IG51bGwpIHsKIAkJCQkJCUlKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQgPSBjcmVhdGVIYW5kbGUodHlwZVBhcmFtZXRlciwgZW5jbG9zaW5nRWxlbWVudCk7Ci0JCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHR5cGVQYXJhbWV0ZXIuYm91bmRzW2pdLCBlbmNsb3NpbmdFbGVtZW50LCBsb2NhbEVsZW1lbnQsIG51bGwsIGJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZSh0eXBlUGFyYW1ldGVyQm91bmQsIGVuY2xvc2luZ0VsZW1lbnQsIGxvY2FsRWxlbWVudCwgbnVsbCwgYmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CiAJCQkJCX0KKwkJCQkJaWYgKHR5cGVQYXJhbWV0ZXJCb3VuZCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CisJICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSBwYXJhbVNUUiA9IChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZVBhcmFtZXRlckJvdW5kOworCSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtU1RSLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworCSAgICAgICAgICAgICAgICAgICAgCWludCBsZW5ndGggPSBwYXJhbVNUUi50eXBlQXJndW1lbnRzLmxlbmd0aDsKKwkgICAgICAgICAgICAgICAgICAgIAlmb3IgKGludCBrPTA7IGs8bGVuZ3RoOyBrKyspIHsKKwkJCQkJCQkJVHlwZVJlZmVyZW5jZSB0eXBlQXJndW1lbnQgPSBwYXJhbVNUUi50eXBlQXJndW1lbnRzW2tdOworCQkJCQkJCQlsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KHR5cGVBcmd1bWVudCk7CisJCQkJCQkJCWlmIChsZXZlbCAhPSBudWxsKSB7CisJCQkJCQkJCQlJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50ID0gY3JlYXRlSGFuZGxlKHR5cGVQYXJhbWV0ZXIsIGVuY2xvc2luZ0VsZW1lbnQpOworCQkJCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZSh0eXBlQXJndW1lbnQsIGVuY2xvc2luZ0VsZW1lbnQsIGxvY2FsRWxlbWVudCwgbnVsbCwgYmluZGluZywgbGV2ZWwuaW50VmFsdWUoKSwgdGhpcyk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFdpbGRjYXJkKSB7CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUmVmZXJlbmNlIHdpbGRjYXJkQm91bmQgPSAoKFdpbGRjYXJkKSB0eXBlQXJndW1lbnQpLmJvdW5kOworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkQm91bmQgIT0gbnVsbCkgeworCQkJCQkJCQkJCWxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkod2lsZGNhcmRCb3VuZCk7CisJCQkJCQkJCQkJaWYgKGxldmVsICE9IG51bGwpIHsKKwkJCQkJCQkJCQkJSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudCA9IGNyZWF0ZUhhbmRsZSh0eXBlUGFyYW1ldGVyLCBlbmNsb3NpbmdFbGVtZW50KTsKKwkJCQkJCQkJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZSh3aWxkY2FyZEJvdW5kLCBlbmNsb3NpbmdFbGVtZW50LCBsb2NhbEVsZW1lbnQsIG51bGwsIGJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCQkJCQkJCX0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAgICAgCX0KKwkgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjUyOSwxMyArMjgwNiwxMyBAQAogCQkJCWZvciAoaW50IGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQkJCUFTVE5vZGUgbm9kZSA9IG5vZGVzW2ldOwogCQkJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpIG5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkobm9kZSk7Ci0JCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2hSZXBvcnRSZWZlcmVuY2Uobm9kZSwgZW5jbG9zaW5nRWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoUmVwb3J0UmVmZXJlbmNlKG5vZGUsIGVuY2xvc2luZ0VsZW1lbnQsIG51bGwsIG51bGwsIGVsZW1lbnRCaW5kaW5nLCBsZXZlbC5pbnRWYWx1ZSgpLCB0aGlzKTsKIAkJCQl9CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoZW5jbG9zZXMoZW5jbG9zaW5nRWxlbWVudCkpIHsKIAkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSBub2RlU2V0Lm1hdGNoaW5nTm9kZXMucmVtb3ZlS2V5KHN1cGVyUmVmZXJlbmNlKTsKIAkJaWYgKGxldmVsICE9IG51bGwgJiYgbWF0Y2hlZENsYXNzQ29udGFpbmVyKQotCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShzdXBlclJlZmVyZW5jZSwgZW5jbG9zaW5nRWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOworCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaFJlcG9ydFJlZmVyZW5jZShzdXBlclJlZmVyZW5jZSwgZW5jbG9zaW5nRWxlbWVudCwgbnVsbCwgbnVsbCwgZWxlbWVudEJpbmRpbmcsIGxldmVsLmludFZhbHVlKCksIHRoaXMpOwogCX0KIH0KIHByb3RlY3RlZCBib29sZWFuIHR5cGVJbkhpZXJhcmNoeShSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvclBhcnNlci5qYXZhCmluZGV4IDdjZThjMDYuLmU2MjcyMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3JQYXJzZXIuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgorICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CkBAIC0yMSwxMyArMjIsMTUgQEAKICAqLwogcHVibGljIGNsYXNzIE1hdGNoTG9jYXRvclBhcnNlciBleHRlbmRzIFBhcnNlciB7CiAKLU1hdGNoaW5nTm9kZVNldCBub2RlU2V0OwotUGF0dGVybkxvY2F0b3IgcGF0dGVybkxvY2F0b3I7Ci1wcml2YXRlIEFTVFZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3I7CisJTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQ7CisJUGF0dGVybkxvY2F0b3IgcGF0dGVybkxvY2F0b3I7CisJcHJpdmF0ZSBBU1RWaXNpdG9yIGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yOworCWZpbmFsIGludCBwYXR0ZXJuRmluZUdyYWluOwogCiBwdWJsaWMgc3RhdGljIE1hdGNoTG9jYXRvclBhcnNlciBjcmVhdGVQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHsKLQlpZiAoKGxvY2F0b3IubWF0Y2hDb250YWluZXIgJiBQYXR0ZXJuTG9jYXRvci5DT01QSUxBVElPTl9VTklUX0NPTlRBSU5FUikgIT0gMCkKKwlpZiAoKGxvY2F0b3IubWF0Y2hDb250YWluZXIgJiBQYXR0ZXJuTG9jYXRvci5DT01QSUxBVElPTl9VTklUX0NPTlRBSU5FUikgIT0gMCkgewogCQlyZXR1cm4gbmV3IEltcG9ydE1hdGNoTG9jYXRvclBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIGxvY2F0b3IpOworCX0KIAlyZXR1cm4gbmV3IE1hdGNoTG9jYXRvclBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIGxvY2F0b3IpOwogfQogCkBAIC01MCwzOSArNTMsMzkgQEAKIH0KIHB1YmxpYyBjbGFzcyBNZXRob2RCdXROb0NsYXNzRGVjbGFyYXRpb25WaXNpdG9yIGV4dGVuZHMgTm9DbGFzc05vTWV0aG9kRGVjbGFyYXRpb25WaXNpdG9yIHsKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbG9jYWxUeXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJcGF0dGVybkxvY2F0b3IubWF0Y2gobG9jYWxUeXBlRGVjbGFyYXRpb24sIG5vZGVTZXQpOworCQlNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChsb2NhbFR5cGVEZWNsYXJhdGlvbiwgTWF0Y2hMb2NhdG9yUGFyc2VyLnRoaXMubm9kZVNldCk7CiAJCXJldHVybiB0cnVlOwogCX0KIH0KIHB1YmxpYyBjbGFzcyBDbGFzc0J1dE5vTWV0aG9kRGVjbGFyYXRpb25WaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIG5vZGVTZXQpOworCQlNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5ub2RlU2V0KTsKIAkJcmV0dXJuIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLkhhc0xvY2FsVHlwZSkgIT0gMDsgLy8gY29udGludWUgb25seSBpZiBpdCBoYXMgbG9jYWwgdHlwZQogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIE1ldGhvZFNjb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKGZpZWxkRGVjbGFyYXRpb24sIG5vZGVTZXQpOworCQlNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChmaWVsZERlY2xhcmF0aW9uLCBNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5ub2RlU2V0KTsKIAkJcmV0dXJuIChmaWVsZERlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLkhhc0xvY2FsVHlwZSkgIT0gMDsgLy8gY29udGludWUgb25seSBpZiBpdCBoYXMgbG9jYWwgdHlwZTsKIAl9CiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKGluaXRpYWxpemVyLCBub2RlU2V0KTsKKwkJTWF0Y2hMb2NhdG9yUGFyc2VyLnRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goaW5pdGlhbGl6ZXIsIE1hdGNoTG9jYXRvclBhcnNlci50aGlzLm5vZGVTZXQpOwogCQlyZXR1cm4gKGluaXRpYWxpemVyLmJpdHMgJiBBU1ROb2RlLkhhc0xvY2FsVHlwZSkgIT0gMDsgLy8gY29udGludWUgb25seSBpZiBpdCBoYXMgbG9jYWwgdHlwZQogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgbm9kZVNldCk7CisJCU1hdGNoTG9jYXRvclBhcnNlci50aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgTWF0Y2hMb2NhdG9yUGFyc2VyLnRoaXMubm9kZVNldCk7CiAJCXJldHVybiB0cnVlOwogCX0KIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewotCQlwYXR0ZXJuTG9jYXRvci5tYXRjaChtZXRob2REZWNsYXJhdGlvbiwgbm9kZVNldCk7CisJCU1hdGNoTG9jYXRvclBhcnNlci50aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG1ldGhvZERlY2xhcmF0aW9uLCBNYXRjaExvY2F0b3JQYXJzZXIudGhpcy5ub2RlU2V0KTsKIAkJcmV0dXJuIChtZXRob2REZWNsYXJhdGlvbi5iaXRzICYgQVNUTm9kZS5IYXNMb2NhbFR5cGUpICE9IDA7IC8vIGNvbnRpbnVlIG9ubHkgaWYgaXQgaGFzIGxvY2FsIHR5cGUKIAl9CiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQW5ub3RhdGlvbk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKG1ldGhvZERlY2xhcmF0aW9uLCBub2RlU2V0KTsKKwkJTWF0Y2hMb2NhdG9yUGFyc2VyLnRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobWV0aG9kRGVjbGFyYXRpb24sIE1hdGNoTG9jYXRvclBhcnNlci50aGlzLm5vZGVTZXQpOwogCQlyZXR1cm4gZmFsc2U7IC8vIG5vIGxvY2FsIHR5cGUgZm9yIGFubm90YXRpb24gdHlwZSBtZW1iZXJzCiAJfQogfQogcHVibGljIGNsYXNzIENsYXNzQW5kTWV0aG9kRGVjbGFyYXRpb25WaXNpdG9yIGV4dGVuZHMgQ2xhc3NCdXROb01ldGhvZERlY2xhcmF0aW9uVmlzaXRvciB7CiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIGxvY2FsVHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JCXBhdHRlcm5Mb2NhdG9yLm1hdGNoKGxvY2FsVHlwZURlY2xhcmF0aW9uLCBub2RlU2V0KTsKKwkJTWF0Y2hMb2NhdG9yUGFyc2VyLnRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobG9jYWxUeXBlRGVjbGFyYXRpb24sIE1hdGNoTG9jYXRvclBhcnNlci50aGlzLm5vZGVTZXQpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiB9CkBAIC0xMDAsMTAgKzEwMywxMSBAQAogCQkJPyBuZXcgTWV0aG9kQnV0Tm9DbGFzc0RlY2xhcmF0aW9uVmlzaXRvcigpCiAJCQk6IG5ldyBOb0NsYXNzTm9NZXRob2REZWNsYXJhdGlvblZpc2l0b3IoKTsKIAl9CisJdGhpcy5wYXR0ZXJuRmluZUdyYWluID0gdGhpcy5wYXR0ZXJuTG9jYXRvci5maW5lR3JhaW4oKTsKIH0KIHB1YmxpYyB2b2lkIGNoZWNrQ29tbWVudCgpIHsKIAlzdXBlci5jaGVja0NvbW1lbnQoKTsKLQlpZiAodGhpcy5qYXZhZG9jUGFyc2VyLmNoZWNrRG9jQ29tbWVudCAmJiB0aGlzLmphdmFkb2MgIT0gbnVsbCkgeworCWlmICh0aGlzLmphdmFkb2NQYXJzZXIuY2hlY2tEb2NDb21tZW50ICYmIHRoaXMuamF2YWRvYyAhPSBudWxsICYmIHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwIC8qIHRoZXJlJ3Mgbm8gZmluZSBncmFpbiBjb25jZXJuaW5nIEphdmFkb2MqLykgewogCiAJCS8vIFNlYXJjaCBmb3IgcGF0dGVybiBsb2NhdG9yIG1hdGNoZXMgaW4gamF2YWRvYyBjb21tZW50IHBhcmFtZXRlcnMgQHBhcmFtIHRhZ3MKIAkJSmF2YWRvY1NpbmdsZU5hbWVSZWZlcmVuY2VbXSBwYXJhbVJlZmVyZW5jZXMgPSB0aGlzLmphdmFkb2MucGFyYW1SZWZlcmVuY2VzOwpAQCAtMTc5LDIyICsxODMsMTI0IEBACiAJCX0KIAl9CiB9CisKIHByb3RlY3RlZCB2b2lkIGNsYXNzSW5zdGFuY2VDcmVhdGlvbihib29sZWFuIGFsd2F5c1F1YWxpZmllZCkgewogCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihhbHdheXNRdWFsaWZpZWQpOwotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgdGhpcy5ub2RlU2V0KTsKKwlpZiAodGhpcy5wYXR0ZXJuRmluZUdyYWluID09IDApIHsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCX0gZWxzZSBpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb24gPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goYWxsb2NhdGlvbi50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFkZGl0aW9uYWxCb3VuZCgpIHsKKwlzdXBlci5jb25zdW1lQWRkaXRpb25hbEJvdW5kKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFX1ZBUklBQkxFX0JPVU5EX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IChUeXBlUmVmZXJlbmNlKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVBc3NpZ25tZW50KCkgewogCXN1cGVyLmNvbnN1bWVBc3NpZ25tZW50KCk7Ci0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJfQogfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKSB7CisJc3VwZXIuY29uc3VtZUNhc3RFeHByZXNzaW9uTEwxKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5DQVNUX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGNhc3RFeHByZXNzaW9uLnR5cGUsIHRoaXMubm9kZVNldCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aEdlbmVyaWNzQXJyYXkoKSB7CisJc3VwZXIuY29uc3VtZUNhc3RFeHByZXNzaW9uV2l0aEdlbmVyaWNzQXJyYXkoKTsKKwlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNBU1RfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goY2FzdEV4cHJlc3Npb24udHlwZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoTmFtZUFycmF5KCkgeworCXN1cGVyLmNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhOYW1lQXJyYXkoKTsKKwlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNBU1RfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goY2FzdEV4cHJlc3Npb24udHlwZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoUHJpbWl0aXZlVHlwZSgpIHsKKwlzdXBlci5jb25zdW1lQ2FzdEV4cHJlc3Npb25XaXRoUHJpbWl0aXZlVHlwZSgpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuQ0FTVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChjYXN0RXhwcmVzc2lvbi50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljc0FycmF5KCkgeworCXN1cGVyLmNvbnN1bWVDYXN0RXhwcmVzc2lvbldpdGhRdWFsaWZpZWRHZW5lcmljc0FycmF5KCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5DQVNUX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGNhc3RFeHByZXNzaW9uLnR5cGUsIHRoaXMubm9kZVNldCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhdGNoRm9ybWFsUGFyYW1ldGVyKCkgeworCXN1cGVyLmNvbnN1bWVDYXRjaEZvcm1hbFBhcmFtZXRlcigpOworCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKExvY2FsRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXJFeHRlbmRzKCkgeworCXRoaXMucGF0dGVybkxvY2F0b3Iuc2V0Rmxhdm9ycyhQYXR0ZXJuTG9jYXRvci5TVVBFUlRZUEVfUkVGX0ZMQVZPUik7CisJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJUWVBFX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcywgdGhpcy5ub2RlU2V0KTsKKwl9CisJdGhpcy5wYXR0ZXJuTG9jYXRvci5zZXRGbGF2b3JzKFBhdHRlcm5Mb2NhdG9yLk5PX0ZMQVZPUik7Cit9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkV2l0aFR5cGVBcmd1bWVudHMoKSB7CiAJc3VwZXIuY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpOwotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgdGhpcy5ub2RlU2V0KTsKKwlpZiAodGhpcy5wYXR0ZXJuRmluZUdyYWluID09IDApIHsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCX0gZWxzZSBpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb24gPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goYWxsb2NhdGlvbi50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cygpIHsKIAlzdXBlci5jb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKCk7Ci0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJfSBlbHNlIGlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbiA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbikgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChhbGxvY2F0aW9uLnR5cGUsIHRoaXMubm9kZVNldCk7CisJfQogfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoYm9vbGVhbiBxdWFsaWZpZWQpIHsKKwl0aGlzLnBhdHRlcm5Mb2NhdG9yLnNldEZsYXZvcnMoUGF0dGVybkxvY2F0b3IuU1VQRVJUWVBFX1JFRl9GTEFWT1IpOworCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keShxdWFsaWZpZWQpOworCXRoaXMucGF0dGVybkxvY2F0b3Iuc2V0Rmxhdm9ycyhQYXR0ZXJuTG9jYXRvci5OT19GTEFWT1IpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJWYXJpYWJsZSgpIHsKKwlib29sZWFuIGlzTG9jYWxEZWNsYXJhdGlvbiA9IHRoaXMubmVzdGVkTWV0aG9kW3RoaXMubmVzdGVkVHlwZV0gIT0gMDsKKwlzdXBlci5jb25zdW1lRW50ZXJWYXJpYWJsZSgpOworCWlmIChpc0xvY2FsRGVjbGFyYXRpb24pIHsKKwkJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5MT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uID0gKExvY2FsRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChsb2NhbERlY2xhcmF0aW9uLnR5cGUsIHRoaXMubm9kZVNldCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkZJRUxEX0RFQ0xBUkFUSU9OX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGZpZWxkRGVjbGFyYXRpb24udHlwZSwgdGhpcy5ub2RlU2V0KTsKKwkJfQorCX0KK30KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGludCBmbGFnLCBpbnQgcmVjRmxhZykgewogCXN1cGVyLmNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihmbGFnLCByZWNGbGFnKTsKIAl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOwpAQCAtMjA2LDEwOCArMzEyLDQyNiBAQAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkQWNjZXNzKGJvb2xlYW4gaXNTdXBlckFjY2VzcykgewogCXN1cGVyLmNvbnN1bWVGaWVsZEFjY2Vzcyhpc1N1cGVyQWNjZXNzKTsKIAotCS8vIHRoaXMgaXMgYWx3YXlzIGEgUmVmZXJlbmNlCi0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoUmVmZXJlbmNlKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCWludCBmaW5lR3JhaW4gPSBpc1N1cGVyQWNjZXNzID8gSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJfUkVGRVJFTkNFIDogSUphdmFTZWFyY2hDb25zdGFudHMuVEhJU19SRUZFUkVOQ0U7CisJaWYgKHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwIHx8ICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBmaW5lR3JhaW4pICE9IDApIHsKKwkJLy8gdGhpcyBpcyBhbHdheXMgYSBSZWZlcmVuY2UKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoUmVmZXJlbmNlKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcm1hbFBhcmFtZXRlcihib29sZWFuIGlzVmFyQXJncykgewogCXN1cGVyLmNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoaXNWYXJBcmdzKTsKLQotCS8vIHRoaXMgaXMgYWx3YXlzIGEgTG9jYWxEZWNsYXJhdGlvbgogCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKExvY2FsRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdLCB0aGlzLm5vZGVTZXQpOwogfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24oKSB7CisJc3VwZXIuY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlNUQU5DRU9GX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goZXhwcmVzc2lvbi50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbldpdGhOYW1lKCkgeworCXN1cGVyLmNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbldpdGhOYW1lKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlNUQU5DRU9GX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goZXhwcmVzc2lvbi50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VUeXBlKCkgeworCXRoaXMucGF0dGVybkxvY2F0b3Iuc2V0Rmxhdm9ycyhQYXR0ZXJuTG9jYXRvci5TVVBFUlRZUEVfUkVGX0ZMQVZPUik7CisJc3VwZXIuY29uc3VtZUludGVyZmFjZVR5cGUoKTsKKwlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLlNVUEVSVFlQRV9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSAoVHlwZVJlZmVyZW5jZSkgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKwl9CisJdGhpcy5wYXR0ZXJuTG9jYXRvci5zZXRGbGF2b3JzKFBhdHRlcm5Mb2NhdG9yLk5PX0ZMQVZPUik7Cit9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CiAJc3VwZXIuY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCi0JLy8gdGhpcyBpcyBhbHdheXMgYSBMb2NhbERlY2xhcmF0aW9uCiAJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTG9jYWxEZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0sIHRoaXMubm9kZVNldCk7CiB9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCkgewogCXN1cGVyLmNvbnN1bWVNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JLy8gdGhpcyBpcyBhbHdheXMgYW4gQW5ub3RhdGlvbgotCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07Ci0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChhbm5vdGF0aW9uLCBub2RlU2V0KTsKKwlpZiAodGhpcy5wYXR0ZXJuRmluZUdyYWluID09IDAgfHwgKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFOTk9UQVRJT05fVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goYW5ub3RhdGlvbiwgdGhpcy5ub2RlU2V0KTsKKwl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWVtYmVyVmFsdWVQYWlyKCkgewogCXN1cGVyLmNvbnN1bWVNZW1iZXJWYWx1ZVBhaXIoKTsKLQotCS8vIHRoaXMgaXMgYWx3YXlzIGEgTWVtYmVyVmFsdWVQYWlyCiAJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTWVtYmVyVmFsdWVQYWlyKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSwgdGhpcy5ub2RlU2V0KTsKIH0KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlck5hbWUoYm9vbGVhbiBpc0Fubm90YXRpb25NZXRob2QpIHsKKwlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyTmFtZShpc0Fubm90YXRpb25NZXRob2QpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuUkVUVVJOX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCS8vIHdoZW4gbm8gZmluZSBncmFpbiBmbGFnIGlzIHNldCwgdHlwZSByZWZlcmVuY2UgbWF0Y2ggaXMgZXZhbHVhdGVkIGluIGdldFR5cGVSZWZlcmVuY2UoaW50KSBtZXRob2QKKwkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG1ldGhvZERlY2xhcmF0aW9uLnJldHVyblR5cGUsIHRoaXMubm9kZVNldCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlclJpZ2h0UGFyZW4oKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlclJpZ2h0UGFyZW4oKTsKKwlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLlBBUkFNRVRFUl9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkvLyB3aGVuIG5vIGZpbmUgZ3JhaW4gZmxhZyBpcyBzZXQsIHR5cGUgcmVmZXJlbmNlIG1hdGNoIGlzIGV2YWx1YXRlZCBpbiBnZXRUeXBlUmVmZXJlbmNlKGludCkgbWV0aG9kCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzOworCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBhcmdMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJZm9yIChpbnQgaT0wOyBpPGFyZ0xlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChhcmd1bWVudHNbaV0udHlwZSwgdGhpcy5ub2RlU2V0KTsKKwkJCX0KKwkJfQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlclRocm93c0NsYXVzZSgpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVEhST1dTX0NMQVVTRV9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkvLyB3aGVuIG5vIGZpbmUgZ3JhaW4gZmxhZyBpcyBzZXQsIHR5cGUgcmVmZXJlbmNlIG1hdGNoIGlzIGV2YWx1YXRlZCBpbiBnZXRUeXBlUmVmZXJlbmNlKGludCkgbWV0aG9kCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl07CisJCVR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKKwkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQkJaW50IHRocm93bkxlbmd0aCA9IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaT0wOyBpPHRocm93bkxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0aHJvd25FeGNlcHRpb25zW2ldLCB0aGlzLm5vZGVTZXQpOworCQkJfQorCQl9CisJfQorfQorCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCk7Ci0KLQkvLyB0aGlzIGlzIGFsd2F5cyBhIE1lc3NhZ2VTZW5kCi0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobWVzc2FnZVNlbmQsIHRoaXMubm9kZVNldCk7CisJfSBlbHNlIHsKKwkJaWYgKG1lc3NhZ2VTZW5kLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCQlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExJQ0lUX1RISVNfUkVGRVJFTkNFKSAhPSAwKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChtZXNzYWdlU2VuZCwgdGhpcy5ub2RlU2V0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuUVVBTElGSUVEX1JFRkVSRU5DRSkgIT0gMCkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobWVzc2FnZVNlbmQsIHRoaXMubm9kZVNldCk7CisJCQl9CisJCX0KKwl9CiB9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZVdpdGhUeXBlQXJndW1lbnRzKCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZVdpdGhUeXBlQXJndW1lbnRzKCk7Ci0KLQkvLyB0aGlzIGlzIGFsd2F5cyBhIE1lc3NhZ2VTZW5kCi0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobWVzc2FnZVNlbmQsIHRoaXMubm9kZVNldCk7CisJfSBlbHNlIHsKKwkJaWYgKG1lc3NhZ2VTZW5kLnJlY2VpdmVyLmlzVGhpcygpKSB7CisJCQlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExJQ0lUX1RISVNfUkVGRVJFTkNFKSAhPSAwKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChtZXNzYWdlU2VuZCwgdGhpcy5ub2RlU2V0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuUVVBTElGSUVEX1JFRkVSRU5DRSkgIT0gMCkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobWVzc2FnZVNlbmQsIHRoaXMubm9kZVNldCk7CisJCQl9CisJCX0KKwl9CiB9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpIHsKLQlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsgCi0KLQkvLyB0aGlzIGlzIGFsd2F5cyBhIE1lc3NhZ2VTZW5kCi0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7CisJaWYgKHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwIHx8ICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5USElTX1JFRkVSRU5DRSkgIT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKChNZXNzYWdlU2VuZCkgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgdGhpcy5ub2RlU2V0KTsKKwl9CiB9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeVdpdGhUeXBlQXJndW1lbnRzKCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeVdpdGhUeXBlQXJndW1lbnRzKCk7Ci0KLQkvLyB0aGlzIGlzIGFsd2F5cyBhIE1lc3NhZ2VTZW5kCi0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoTWVzc2FnZVNlbmQpIHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CisJaWYgKHRoaXMucGF0dGVybkZpbmVHcmFpbiA9PSAwIHx8ICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5USElTX1JFRkVSRU5DRSkgIT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKChNZXNzYWdlU2VuZCkgdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSwgdGhpcy5ub2RlU2V0KTsKKwl9CiB9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOwotCi0JLy8gdGhpcyBpcyBhbHdheXMgYSBNZXNzYWdlU2VuZAotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKE1lc3NhZ2VTZW5kKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCB8fCAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJfUkVGRVJFTkNFKSAhPSAwKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKE1lc3NhZ2VTZW5kKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcldpdGhUeXBlQXJndW1lbnRzKCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXJXaXRoVHlwZUFyZ3VtZW50cygpOwotCi0JLy8gdGhpcyBpcyBhbHdheXMgYSBNZXNzYWdlU2VuZAotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKE1lc3NhZ2VTZW5kKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCB8fCAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJfUkVGRVJFTkNFKSAhPSAwKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2goKE1lc3NhZ2VTZW5kKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdLCB0aGlzLm5vZGVTZXQpOworCX0KIH0KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU5vcm1hbEFubm90YXRpb24oKSB7CiAJc3VwZXIuY29uc3VtZU5vcm1hbEFubm90YXRpb24oKTsKLQkvLyB0aGlzIGlzIGFsd2F5cyBhbiBBbm5vdGF0aW9uCi0JQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGFubm90YXRpb24sIG5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCB8fCAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkvLyB0aGlzIGlzIGFsd2F5cyBhbiBBbm5vdGF0aW9uCisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGFubm90YXRpb24sIHRoaXMubm9kZVNldCk7CisJfQogfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lT25seVR5cGVBcmd1bWVudHMoKSB7CisJc3VwZXIuY29uc3VtZU9ubHlUeXBlQXJndW1lbnRzKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFX0FSR1VNRU5UX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCWludCBsZW5ndGggPSB0aGlzLmdlbmVyaWNzTGVuZ3RoU3RhY2tbdGhpcy5nZW5lcmljc0xlbmd0aFB0cl07CisJCWlmIChsZW5ndGggPT0gMSkgeworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQkJaWYgKCEodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KK30KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5KCkgewogCS8vIHBvcCBwYXJlbnRoZXNpcyBwb3NpdGlvbnMgKGFuZCBkb24ndCB1cGRhdGUgZXhwcmVzc2lvbiBwb3NpdGlvbnMKIAkvLyAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzI5KQotCWludFB0ci0tOwotCWludFB0ci0tOworCXRoaXMuaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIH0KIAogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5V2l0aE5hbWUoKSB7Ci0JLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiAKKwkvLyBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gIFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOCiAJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpOwogCS8vIHBvcCBwYXJlbnRoZXNpcyBwb3NpdGlvbnMgKGFuZCBkb24ndCB1cGRhdGUgZXhwcmVzc2lvbiBwb3NpdGlvbnMKIAkvLyAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzI5KQotCWludFB0ci0tOwotCWludFB0ci0tOworCXRoaXMuaW50UHRyLS07CisJdGhpcy5pbnRQdHItLTsKIH0KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSB7CiAJc3VwZXIuY29uc3VtZVNpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkvLyB0aGlzIGlzIGFsd2F5cyBhbiBBbm5vdGF0aW9uCi0JQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKLQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGFubm90YXRpb24sIG5vZGVTZXQpOworCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCB8fCAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuQU5OT1RBVElPTl9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkvLyB0aGlzIGlzIGFsd2F5cyBhbiBBbm5vdGF0aW9uCisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGFubm90YXRpb24sIHRoaXMubm9kZVNldCk7CisJfQogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudCgpIHsKLQlzdXBlci5jb25zdW1lVHlwZUFyZ3VtZW50KCk7Ci0JcGF0dGVybkxvY2F0b3IubWF0Y2goKFR5cGVSZWZlcmVuY2UpZ2VuZXJpY3NTdGFja1tnZW5lcmljc1B0cl0sIG5vZGVTZXQpOworCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50Q2F0Y2goKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudENhdGNoKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5DQVRDSF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQkvLyB3aGVuIG5vIGZpbmUgZ3JhaW4gZmxhZyBpcyBzZXQsIHR5cGUgcmVmZXJlbmNlIG1hdGNoIGlzIGV2YWx1YXRlZCBpbiBnZXRUeXBlUmVmZXJlbmNlKGludCkgbWV0aG9kCisJCUxvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiA9IChMb2NhbERlY2xhcmF0aW9uKSB0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyLTFdOworCQlpZiAobG9jYWxEZWNsYXJhdGlvbi50eXBlIGluc3RhbmNlb2YgVW5pb25UeXBlUmVmZXJlbmNlKSB7CisJCQlUeXBlUmVmZXJlbmNlW10gcmVmcyA9ICgoVW5pb25UeXBlUmVmZXJlbmNlKWxvY2FsRGVjbGFyYXRpb24udHlwZSkudHlwZVJlZmVyZW5jZXM7CisJCQlmb3IgKGludCBpID0gMCwgbGVuICA9IHJlZnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKwkJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHJlZnNbaV0sIHRoaXMubm9kZVNldCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKGxvY2FsRGVjbGFyYXRpb24udHlwZSwgdGhpcy5ub2RlU2V0KTsKKwkJfQorCX0KIH0KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudExpc3QxKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlQXJndW1lbnRMaXN0MSgpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlmb3IgKGludCBpPXRoaXMuZ2VuZXJpY3NQdHItdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdKzE7IGk8PXRoaXMuZ2VuZXJpY3NQdHI7IGkrKykgeworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpdGhpcy5nZW5lcmljc1N0YWNrW2ldOworCQkJaWYgKCEodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudExpc3QyKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlQXJndW1lbnRMaXN0MigpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlmb3IgKGludCBpPXRoaXMuZ2VuZXJpY3NQdHItdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdKzE7IGk8PXRoaXMuZ2VuZXJpY3NQdHI7IGkrKykgeworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpdGhpcy5nZW5lcmljc1N0YWNrW2ldOworCQkJaWYgKCEodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudExpc3QzKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlQXJndW1lbnRMaXN0MygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlmb3IgKGludCBpPXRoaXMuZ2VuZXJpY3NQdHItdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdKzE7IGk8PXRoaXMuZ2VuZXJpY3NQdHI7IGkrKykgeworCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpdGhpcy5nZW5lcmljc1N0YWNrW2ldOworCQkJaWYgKCEodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFdpbGRjYXJkKSkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVJlZmVyZW5jZSwgdGhpcy5ub2RlU2V0KTsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudFJlZmVyZW5jZVR5cGUxKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlQXJndW1lbnRSZWZlcmVuY2VUeXBlMSgpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdOworCQlpZiAobGVuZ3RoID09IDEpIHsKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IChUeXBlUmVmZXJlbmNlKXRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbnVsbDsKKwkJCWlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkgICAgICAgICAgICB0eXBlQXJndW1lbnRzID0gKChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZVJlZmVyZW5jZSkudHlwZUFyZ3VtZW50czsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJICAgICAgICAgICAgVHlwZVJlZmVyZW5jZVtdW10gYWxsVHlwZUFyZ3VtZW50cyA9ICgoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLnR5cGVBcmd1bWVudHM7CisJICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IGFsbFR5cGVBcmd1bWVudHNbYWxsVHlwZUFyZ3VtZW50cy5sZW5ndGgtMV07CisgICAgICAgICAgICB9CisJCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisJICAgICAgICAgICAgZm9yIChpbnQgaT0wLCBsbj10eXBlQXJndW1lbnRzLmxlbmd0aDsgaTxsbjsgaSsrKSB7CisJICAgICAgICAgICAgCWlmICghKHR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBXaWxkY2FyZCkpIHsKKwkJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZUFyZ3VtZW50c1tpXSwgdGhpcy5ub2RlU2V0KTsKKwkgICAgICAgICAgICAJfQorCSAgICAgICAgICAgIH0KKwkJCX0KKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudFJlZmVyZW5jZVR5cGUyKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlQXJndW1lbnRSZWZlcmVuY2VUeXBlMigpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9BUkdVTUVOVF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5nZW5lcmljc0xlbmd0aFN0YWNrW3RoaXMuZ2VuZXJpY3NMZW5ndGhQdHJdOworCQlpZiAobGVuZ3RoID09IDEpIHsKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IChUeXBlUmVmZXJlbmNlKXRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJCVR5cGVSZWZlcmVuY2VbXSB0eXBlQXJndW1lbnRzID0gbnVsbDsKKwkJCWlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkgICAgICAgICAgICB0eXBlQXJndW1lbnRzID0gKChQYXJhbWV0ZXJpemVkU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZVJlZmVyZW5jZSkudHlwZUFyZ3VtZW50czsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVJlZmVyZW5jZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJICAgICAgICAgICAgVHlwZVJlZmVyZW5jZVtdW10gYWxsVHlwZUFyZ3VtZW50cyA9ICgoUGFyYW1ldGVyaXplZFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLnR5cGVBcmd1bWVudHM7CisJICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IGFsbFR5cGVBcmd1bWVudHNbYWxsVHlwZUFyZ3VtZW50cy5sZW5ndGgtMV07CisgICAgICAgICAgICB9CisJCQlpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisJICAgICAgICAgICAgZm9yIChpbnQgaT0wLCBsbj10eXBlQXJndW1lbnRzLmxlbmd0aDsgaTxsbjsgaSsrKSB7CisJICAgICAgICAgICAgCWlmICghKHR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBXaWxkY2FyZCkpIHsKKwkJCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZUFyZ3VtZW50c1tpXSwgdGhpcy5ub2RlU2V0KTsKKwkgICAgICAgICAgICAJfQorCSAgICAgICAgICAgIH0KKwkJCX0KKwkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVBcmd1bWVudHMoKSB7CisJc3VwZXIuY29uc3VtZVR5cGVBcmd1bWVudHMoKTsKKwlpZiAoKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEVfQVJHVU1FTlRfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMuZ2VuZXJpY3NMZW5ndGhTdGFja1t0aGlzLmdlbmVyaWNzTGVuZ3RoUHRyXTsKKwkJaWYgKGxlbmd0aCA9PSAxKSB7CisJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSAoVHlwZVJlZmVyZW5jZSl0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCQlpZiAoISh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgV2lsZGNhcmQpKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0eXBlUmVmZXJlbmNlLCB0aGlzLm5vZGVTZXQpOworICAgICAgICAgICAgfQorCQl9CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZVBhcmFtZXRlcjFXaXRoRXh0ZW5kcygpIHsKKwlzdXBlci5jb25zdW1lVHlwZVBhcmFtZXRlcjFXaXRoRXh0ZW5kcygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHR5cGVQYXJhbWV0ZXIudHlwZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVyMVdpdGhFeHRlbmRzQW5kQm91bmRzKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlUGFyYW1ldGVyMVdpdGhFeHRlbmRzQW5kQm91bmRzKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFX1ZBUklBQkxFX0JPVU5EX1RZUEVfUkVGRVJFTkNFKSAhPSAwKSB7CisJCVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChUeXBlUGFyYW1ldGVyKSB0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl07CisJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2godHlwZVBhcmFtZXRlci50eXBlLCB0aGlzLm5vZGVTZXQpOworCX0KK30KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVQYXJhbWV0ZXJIZWFkZXIoKSB7CiAJc3VwZXIuY29uc3VtZVR5cGVQYXJhbWV0ZXJIZWFkZXIoKTsKLQlwYXR0ZXJuTG9jYXRvci5tYXRjaCgoVHlwZVBhcmFtZXRlcilnZW5lcmljc1N0YWNrW2dlbmVyaWNzUHRyXSwgbm9kZVNldCk7CisJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCgoVHlwZVBhcmFtZXRlcil0aGlzLmdlbmVyaWNzU3RhY2tbdGhpcy5nZW5lcmljc1B0cl0sIHRoaXMubm9kZVNldCk7CiB9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVyV2l0aEV4dGVuZHMoKSB7CisJc3VwZXIuY29uc3VtZVR5cGVQYXJhbWV0ZXJXaXRoRXh0ZW5kcygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHR5cGVQYXJhbWV0ZXIudHlwZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlUGFyYW1ldGVyV2l0aEV4dGVuZHNBbmRCb3VuZHMoKSB7CisJc3VwZXIuY29uc3VtZVR5cGVQYXJhbWV0ZXJXaXRoRXh0ZW5kc0FuZEJvdW5kcygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRV9WQVJJQUJMRV9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoVHlwZVBhcmFtZXRlcikgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHR5cGVQYXJhbWV0ZXIudHlwZSwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oaW50IG9wLCBib29sZWFuIHBvc3QpIHsKIAlzdXBlci5jb25zdW1lVW5hcnlFeHByZXNzaW9uKG9wLCBwb3N0KTsKIAl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0sIHRoaXMubm9kZVNldCk7CiB9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczFFeHRlbmRzKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczFFeHRlbmRzKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5XSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlXaWxkY2FyZCB3aWxkY2FyZCA9IChXaWxkY2FyZCkgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHdpbGRjYXJkLmJvdW5kLCB0aGlzLm5vZGVTZXQpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVdpbGRjYXJkQm91bmRzMVN1cGVyKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczFTdXBlcigpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJV2lsZGNhcmQgd2lsZGNhcmQgPSAoV2lsZGNhcmQpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh3aWxkY2FyZC5ib3VuZCwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczJFeHRlbmRzKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczJFeHRlbmRzKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5XSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlXaWxkY2FyZCB3aWxkY2FyZCA9IChXaWxkY2FyZCkgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHdpbGRjYXJkLmJvdW5kLCB0aGlzLm5vZGVTZXQpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVdpbGRjYXJkQm91bmRzMlN1cGVyKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczJTdXBlcigpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJV2lsZGNhcmQgd2lsZGNhcmQgPSAoV2lsZGNhcmQpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh3aWxkY2FyZC5ib3VuZCwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kczNFeHRlbmRzKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczNFeHRlbmRzKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5XSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlXaWxkY2FyZCB3aWxkY2FyZCA9IChXaWxkY2FyZCkgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHdpbGRjYXJkLmJvdW5kLCB0aGlzLm5vZGVTZXQpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVdpbGRjYXJkQm91bmRzM1N1cGVyKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kczNTdXBlcigpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJV2lsZGNhcmQgd2lsZGNhcmQgPSAoV2lsZGNhcmQpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh3aWxkY2FyZC5ib3VuZCwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kc0V4dGVuZHMoKSB7CisJc3VwZXIuY29uc3VtZVdpbGRjYXJkQm91bmRzRXh0ZW5kcygpOworCWlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuV0lMRENBUkRfQk9VTkRfVFlQRV9SRUZFUkVOQ0UpICE9IDApIHsKKwkJV2lsZGNhcmQgd2lsZGNhcmQgPSAoV2lsZGNhcmQpIHRoaXMuZ2VuZXJpY3NTdGFja1t0aGlzLmdlbmVyaWNzUHRyXTsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh3aWxkY2FyZC5ib3VuZCwgdGhpcy5ub2RlU2V0KTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVXaWxkY2FyZEJvdW5kc1N1cGVyKCkgeworCXN1cGVyLmNvbnN1bWVXaWxkY2FyZEJvdW5kc1N1cGVyKCk7CisJaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5XSUxEQ0FSRF9CT1VORF9UWVBFX1JFRkVSRU5DRSkgIT0gMCkgeworCQlXaWxkY2FyZCB3aWxkY2FyZCA9IChXaWxkY2FyZCkgdGhpcy5nZW5lcmljc1N0YWNrW3RoaXMuZ2VuZXJpY3NQdHJdOworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKHdpbGRjYXJkLmJvdW5kLCB0aGlzLm5vZGVTZXQpOworCX0KK30KKwogcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgY29weURpbXMoVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBpbnQgZGltKSB7CiAJVHlwZVJlZmVyZW5jZSByZXN1bHQgPSBzdXBlci5jb3B5RGltcyh0eXBlUmVmLCBkaW0pOwogCSBpZiAodGhpcy5ub2RlU2V0LnJlbW92ZVBvc3NpYmxlTWF0Y2godHlwZVJlZikgIT0gbnVsbCkKQEAgLTMxOCwxNyArNzQyLDQ1IEBACiB9CiBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKGludCBkaW0pIHsKIAlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBzdXBlci5nZXRUeXBlUmVmZXJlbmNlKGRpbSk7Ci0JdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0eXBlUmVmLCB0aGlzLm5vZGVTZXQpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHR5cGUgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUKKwlpZiAodGhpcy5wYXR0ZXJuRmluZUdyYWluID09IDApIHsKKwkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaCh0eXBlUmVmLCB0aGlzLm5vZGVTZXQpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHR5cGUgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUKKwl9CiAJcmV0dXJuIHR5cGVSZWY7CiB9CiBwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpIHsKIAlOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOwotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobmFtZVJlZiwgdGhpcy5ub2RlU2V0KTsgLy8gTkI6IERvbid0IGNoZWNrIGNvbnRhaW5lciBzaW5jZSB1bnNwZWNpZmllZCByZWZlcmVuY2UgY2FuIGhhcHBlbiBhbnl3aGVyZQorCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG5hbWVSZWYsIHRoaXMubm9kZVNldCk7IC8vIE5COiBEb24ndCBjaGVjayBjb250YWluZXIgc2luY2UgdW5zcGVjaWZpZWQgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUKKwl9IGVsc2UgaWYgKCh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gJiBJSmF2YVNlYXJjaENvbnN0YW50cy5RVUFMSUZJRURfUkVGRVJFTkNFKSAhPSAwKSB7CisJCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChuYW1lUmVmLCB0aGlzLm5vZGVTZXQpOworCQl9CisJfSBlbHNlIGlmICgodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTElDSVRfVEhJU19SRUZFUkVOQ0UpICE9IDApIHsKKwkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG5hbWVSZWYsIHRoaXMubm9kZVNldCk7CisJCX0KKwl9CiAJcmV0dXJuIG5hbWVSZWY7CiB9CiBwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpIHsKIAlOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOwotCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobmFtZVJlZiwgdGhpcy5ub2RlU2V0KTsgLy8gTkI6IERvbid0IGNoZWNrIGNvbnRhaW5lciBzaW5jZSB1bnNwZWNpZmllZCByZWZlcmVuY2UgY2FuIGhhcHBlbiBhbnl3aGVyZQorCWlmICh0aGlzLnBhdHRlcm5GaW5lR3JhaW4gPT0gMCkgeworCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG5hbWVSZWYsIHRoaXMubm9kZVNldCk7IC8vIE5COiBEb24ndCBjaGVjayBjb250YWluZXIgc2luY2UgdW5zcGVjaWZpZWQgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUKKwl9IGVsc2UgeworCQlib29sZWFuIGZsYWdRdWFsaWZpZWRSZWYgPSAodGhpcy5wYXR0ZXJuRmluZUdyYWluICYgSUphdmFTZWFyY2hDb25zdGFudHMuUVVBTElGSUVEX1JFRkVSRU5DRSkgIT0gMDsKKwkJYm9vbGVhbiBmbGFnSW1wbGljaXRUaGlzID0gKHRoaXMucGF0dGVybkZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExJQ0lUX1RISVNfUkVGRVJFTkNFKSAhPSAwOworCQlpZiAoZmxhZ1F1YWxpZmllZFJlZiAmJiBmbGFnSW1wbGljaXRUaGlzKSB7CisJCQl0aGlzLnBhdHRlcm5Mb2NhdG9yLm1hdGNoKG5hbWVSZWYsIHRoaXMubm9kZVNldCk7CisJCX0gZWxzZSBpZiAoZmxhZ1F1YWxpZmllZFJlZikgeworCQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQkJdGhpcy5wYXR0ZXJuTG9jYXRvci5tYXRjaChuYW1lUmVmLCB0aGlzLm5vZGVTZXQpOworCQkJfQorCQl9IGVsc2UgaWYgKGZsYWdJbXBsaWNpdFRoaXMpIHsKKwkJCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJCXRoaXMucGF0dGVybkxvY2F0b3IubWF0Y2gobmFtZVJlZiwgdGhpcy5ub2RlU2V0KTsKKwkJCX0KKwkJfQorCX0KIAlyZXR1cm4gbmFtZVJlZjsKIH0KIC8qKgpAQCAtMzU3LDcgKzgwOSw3IEBACiAJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGRzW2ldOwogCQkJaWYgKGZpZWxkIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpCiAJCQkJdGhpcy5wYXJzZSgoSW5pdGlhbGl6ZXIpIGZpZWxkLCB0eXBlLCB1bml0KTsKLQkJCWZpZWxkLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCBudWxsKTsKKwkJCWZpZWxkLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG51bGwpOwogCQl9CiAJfQogCkBAIC0zNjksMTEgKzgyMSwxMSBAQAogCQkJCWlmIChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewogCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kOwogCQkJCQl0aGlzLnBhcnNlKG1ldGhvZERlY2xhcmF0aW9uLCB1bml0KTsKLQkJCQkJbWV0aG9kRGVjbGFyYXRpb24udHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKSBudWxsKTsKKwkJCQkJbWV0aG9kRGVjbGFyYXRpb24udHJhdmVyc2UodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciwgKENsYXNzU2NvcGUpIG51bGwpOwogCQkJCX0gZWxzZSBpZiAobWV0aG9kIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgewogCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kOwotCQkJCQl0aGlzLnBhcnNlKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIHVuaXQpOwotCQkJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSkgbnVsbCk7CisJCQkJCXRoaXMucGFyc2UoY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgdW5pdCwgZmFsc2UpOworCQkJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKSBudWxsKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKG1ldGhvZC5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpKSB7CiAJCQkJbWV0aG9kLnBhcnNlU3RhdGVtZW50cyh0aGlzLCB1bml0KTsKQEAgLTM4Niw5ICs4MzgsMTAgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgewogCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1tpXTsKIAkJCXRoaXMucGFyc2VCb2RpZXMobWVtYmVyVHlwZSwgdW5pdCk7Ci0JCQltZW1iZXJUeXBlLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSkgbnVsbCk7CisJCQltZW1iZXJUeXBlLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKSBudWxsKTsKIAkJfQogCX0KIH0KKwogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nTm9kZVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ05vZGVTZXQuamF2YQppbmRleCBmODY2YjdhLi4wY2UyNjM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nTm9kZVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hpbmdOb2RlU2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTAsNyArNTAsNyBAQAogCiBwdWJsaWMgTWF0Y2hpbmdOb2RlU2V0KGJvb2xlYW4gbXVzdFJlc29sdmVQYXR0ZXJuKSB7CiAJc3VwZXIoKTsKLQltdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlUGF0dGVybjsKKwl0aGlzLm11c3RSZXNvbHZlID0gbXVzdFJlc29sdmVQYXR0ZXJuOwogfQogCiBwdWJsaWMgaW50IGFkZE1hdGNoKEFTVE5vZGUgbm9kZSwgaW50IG1hdGNoTGV2ZWwpIHsKQEAgLTk4LDcgKzk4LDcgQEAKIH0KIHB1YmxpYyB2b2lkIGFkZFRydXN0ZWRNYXRjaChBU1ROb2RlIG5vZGUsIGJvb2xlYW4gaXNFeGFjdCkgewogCWFkZFRydXN0ZWRNYXRjaChub2RlLCBpc0V4YWN0ID8gRVhBQ1RfTUFUQ0ggOiBQT1RFTlRJQUxfTUFUQ0gpOwotCQorCiB9CiB2b2lkIGFkZFRydXN0ZWRNYXRjaChBU1ROb2RlIG5vZGUsIEludGVnZXIgbGV2ZWwpIHsKIAkvLyByZW1vdmUgZXhpc3Rpbmcgbm9kZSBhdCBzYW1lIHBvc2l0aW9uIGZyb20gc2V0CkBAIC0xMDgsNyArMTA4LDcgQEAKIAlBU1ROb2RlIGV4aXN0aW5nID0gKEFTVE5vZGUpIHRoaXMubWF0Y2hpbmdOb2Rlc0tleXMuZ2V0KGtleSk7CiAJaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcuZ2V0Q2xhc3MoKS5lcXVhbHMobm9kZS5nZXRDbGFzcygpKSkKIAkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZUtleShleGlzdGluZyk7Ci0JCisKIAkvLyBtYXAgbm9kZSB0byBpdHMgYWNjdXJhY3kgbGV2ZWwKIAl0aGlzLm1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIGxldmVsKTsKIAl0aGlzLm1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG5vZGUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZW1iZXJEZWNsYXJhdGlvblZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWVtYmVyRGVjbGFyYXRpb25WaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5NWMwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWVtYmVyRGVjbGFyYXRpb25WaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFTVFZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZkludFZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuTWF0Y2hMb2NhdG9yLldyYXBwZWRDb3JlRXhjZXB0aW9uOworCisvKioKKyAqIFNwZWNpZmljIHZpc2l0b3Igb2YgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9uIHdoaWNoIGNhbiBpZGVudGlmeSBhbmQgc3RvcmUKKyAqIHRoZSBsb2NhbCBhbmQgIG90aGVyIGVsZW1lbnRzIG9mIG9uZSBvciBzZXZlcmFsIG1hdGNoaW5nIG5vZGVzLgorICogPHA+CisgKiBUaGlzIHZpc2l0b3IgY2FuIGFsc28gcGVlayB1cCBsb2NhbCBvciBhbm9ueW1vdXMgdHlwZSBkZWNsYXJhdGlvbiBhbmQgcmVzdGFydAorICogYSBuZXcge0BsaW5rIE1hdGNoTG9jYXRvcn0gdHJhdmVyc2Ugb24gdGhpcyB0eXBlLgorICogPC9wPgorICovCitjbGFzcyBNZW1iZXJEZWNsYXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKKwkvLyBNYXRjaGVzIGluZm9ybWF0aW9uCisJcHJpdmF0ZSBmaW5hbCBNYXRjaExvY2F0b3IgbG9jYXRvcjsKKwlwcml2YXRlIGZpbmFsIElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50OworCXByaXZhdGUgZmluYWwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQ7CisJcHJpdmF0ZSBmaW5hbCBBU1ROb2RlW10gbWF0Y2hpbmdOb2RlczsKKwlwcml2YXRlIGZpbmFsIEFTVE5vZGUgbWF0Y2hpbmdOb2RlOworCisJLy8gTG9jYWwgdHlwZSBzdG9yYWdlCisJSGFzaHRhYmxlT2ZJbnRWYWx1ZXMgb2NjdXJyZW5jZXNDb3VudHMgPSBuZXcgSGFzaHRhYmxlT2ZJbnRWYWx1ZXMoKTsgLy8ga2V5ID0gY2xhc3MgbmFtZSAoY2hhcltdKSwgdmFsdWUgPSBvY2N1cnJlbmNlQ291bnQgKGludCkKKwlpbnQgbm9kZXNDb3VudCA9IDA7CisKKwkvLyBMb2NhbCBhbmQgb3RoZXIgZWxlbWVudHMgc3RvcmFnZQorCXByaXZhdGUgQW5ub3RhdGlvbiBhbm5vdGF0aW9uOworCXByaXZhdGUgTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uOworCUlKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQ7CisJSUphdmFFbGVtZW50W10gbG9jYWxFbGVtZW50cywgb3RoZXJFbGVtZW50czsKKwlJSmF2YUVsZW1lbnRbXVtdIGFsbE90aGVyRWxlbWVudHM7CisJaW50IHB0ciA9IC0xOworCWludFtdIHB0cnM7CisKK3B1YmxpYyBNZW1iZXJEZWNsYXJhdGlvblZpc2l0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIEFTVE5vZGVbXSBub2RlcywgTWF0Y2hpbmdOb2RlU2V0IHNldCwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHsKKwl0aGlzLmVuY2xvc2luZ0VsZW1lbnQgPSBlbGVtZW50OworCXRoaXMubm9kZVNldCA9IHNldDsKKwl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworCWlmIChub2RlcyA9PSBudWxsKSB7CisJCXRoaXMubWF0Y2hpbmdOb2RlID0gbnVsbDsKKwkJdGhpcy5tYXRjaGluZ05vZGVzID0gbnVsbDsKKwl9IGVsc2UgeworCQl0aGlzLm5vZGVzQ291bnQgPSBub2Rlcy5sZW5ndGg7CisJCWlmIChub2Rlcy5sZW5ndGggPT0gMSkgeworCQkJdGhpcy5tYXRjaGluZ05vZGUgPSBub2Rlc1swXTsKKwkJCXRoaXMubWF0Y2hpbmdOb2RlcyA9IG51bGw7CisJCX0gZWxzZSB7CisJCQl0aGlzLm1hdGNoaW5nTm9kZSA9IG51bGw7CisJCQl0aGlzLm1hdGNoaW5nTm9kZXMgPSBub2RlczsKKwkJCXRoaXMubG9jYWxFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbdGhpcy5ub2Rlc0NvdW50XTsKKwkJCXRoaXMucHRycyA9IG5ldyBpbnRbdGhpcy5ub2Rlc0NvdW50XTsKKwkJCXRoaXMuYWxsT3RoZXJFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbdGhpcy5ub2Rlc0NvdW50XVtdOworCQl9CisJfQorfQorcHVibGljIHZvaWQgZW5kVmlzaXQoQXJndW1lbnQgYXJndW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKyAgICB0aGlzLmxvY2FsRGVjbGFyYXRpb24gPSBudWxsOworfQorcHVibGljIHZvaWQgZW5kVmlzaXQoTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworICAgIHRoaXMubG9jYWxEZWNsYXJhdGlvbiA9IG51bGw7Cit9CitwdWJsaWMgdm9pZCBlbmRWaXNpdChNYXJrZXJBbm5vdGF0aW9uIG1hcmtlckFubm90YXRpb24sIEJsb2NrU2NvcGUgdW51c2VkKSB7CisJdGhpcy5hbm5vdGF0aW9uID0gbnVsbDsKK30KK3B1YmxpYyB2b2lkIGVuZFZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiwgQmxvY2tTY29wZSB1bnVzZWQpIHsKKwl0aGlzLmFubm90YXRpb24gPSBudWxsOworfQorcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBCbG9ja1Njb3BlIHVudXNlZCkgeworCXRoaXMuYW5ub3RhdGlvbiA9IG51bGw7Cit9CitJSmF2YUVsZW1lbnQgZ2V0TG9jYWxFbGVtZW50KGludCBpZHgpIHsKKwlpZiAodGhpcy5ub2Rlc0NvdW50ID09IDEpIHsKKwkJcmV0dXJuIHRoaXMubG9jYWxFbGVtZW50OworCX0KKwlpZiAodGhpcy5sb2NhbEVsZW1lbnRzICE9IG51bGwpIHsKKwkJcmV0dXJuIHRoaXMubG9jYWxFbGVtZW50c1tpZHhdOworCX0KKwlyZXR1cm4gbnVsbDsKK30KK0lKYXZhRWxlbWVudFtdIGdldE90aGVyRWxlbWVudHMoaW50IGlkeCkgeworCWlmICh0aGlzLm5vZGVzQ291bnQgPT0gMSkgeworCQlpZiAodGhpcy5vdGhlckVsZW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLm90aGVyRWxlbWVudHMubGVuZ3RoOworCQkJaWYgKHRoaXMucHRyIDwgKGxlbmd0aC0xKSkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdGhlckVsZW1lbnRzLCAwLCB0aGlzLm90aGVyRWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W3RoaXMucHRyKzFdLCAwLCB0aGlzLnB0cisxKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5vdGhlckVsZW1lbnRzOworCX0KKwlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IHRoaXMuYWxsT3RoZXJFbGVtZW50cyA9PSBudWxsID8gbnVsbCA6IHRoaXMuYWxsT3RoZXJFbGVtZW50c1tpZHhdOworCWlmIChlbGVtZW50cyAhPSBudWxsKSB7CisJCWludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CisJCWlmICh0aGlzLnB0cnNbaWR4XSA8IChsZW5ndGgtMSkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIGVsZW1lbnRzID0gdGhpcy5hbGxPdGhlckVsZW1lbnRzW2lkeF0gPSBuZXcgSUphdmFFbGVtZW50W3RoaXMucHRyc1tpZHhdKzFdLCAwLCB0aGlzLnB0cnNbaWR4XSsxKTsKKwkJfQorCX0KKwlyZXR1cm4gZWxlbWVudHM7Cit9Citwcml2YXRlIGludCBtYXRjaE5vZGUoQVNUTm9kZSByZWZlcmVuY2UpIHsKKwlpZiAodGhpcy5tYXRjaGluZ05vZGUgIT0gbnVsbCkgeworCQlpZiAodGhpcy5tYXRjaGluZ05vZGUgPT0gcmVmZXJlbmNlKSByZXR1cm4gMDsKKwl9IGVsc2UgeworCSAgICBpbnQgbGVuZ3RoID0gdGhpcy5tYXRjaGluZ05vZGVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5tYXRjaGluZ05vZGVzW2ldID09IHJlZmVyZW5jZSkgIHsgLy8gPT0gaXMgaW50ZW50aW9uYWwKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisvKgorICogU3RvcmUgdGhlIGhhbmRsZSBmb3IgdGhlIHJlZmVyZW5jZSBvZiB0aGUgZ2l2ZW4gaW5kZXggKGUuZy4gcGVlayBpbiAjbWF0Y2hpbmdOb2RlcworICogb3IgI21hdGNoaW5nTm9kZSkuCisgKiBOb3RlIHRoYXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgbWF0Y2hpbmcgbm9kZSBhbmQgYXNzb2NpYXRlZCBoYW5kbGVzIGFyZQorICogbm90IHN0b3JlZCBpbiBhcnJheSB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgcmVmZXJlbmNlIHRvIGlkZW50aWZ5LgorICovCitwcml2YXRlIHZvaWQgc3RvcmVIYW5kbGUoaW50IGlkeCkgeworCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb24gPT0gbnVsbCkgcmV0dXJuOworCUlKYXZhRWxlbWVudCBoYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSGFuZGxlKHRoaXMubG9jYWxEZWNsYXJhdGlvbiwgdGhpcy5lbmNsb3NpbmdFbGVtZW50KTsKKyAgICBpZiAodGhpcy5ub2Rlc0NvdW50ID09IDEpIHsKKyAgICAJaWYgKHRoaXMubG9jYWxFbGVtZW50ID09IG51bGwpIHsKKyAgICAJCWlmICh0aGlzLmFubm90YXRpb24gPT0gbnVsbCkgeworCQkgICAgCXRoaXMubG9jYWxFbGVtZW50ID0gIGhhbmRsZTsKKyAgICAJCX0gZWxzZSB7CisJCSAgICAJSUphdmFFbGVtZW50IGFubm90SGFuZGxlID0gdGhpcy5sb2NhdG9yLmNyZWF0ZUhhbmRsZSh0aGlzLmFubm90YXRpb24sIChJQW5ub3RhdGFibGUpIGhhbmRsZSk7CisJCSAgICAJaWYgKGFubm90SGFuZGxlID09IG51bGwpIHsKKwkJCSAgICAJYW5ub3RIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSGFuZGxlKHRoaXMuYW5ub3RhdGlvbiwgKElBbm5vdGF0YWJsZSkgdGhpcy5lbmNsb3NpbmdFbGVtZW50KTsKKwkJICAgIAl9CisJCSAgICAJdGhpcy5sb2NhbEVsZW1lbnQgPSBhbm5vdEhhbmRsZSA9PSBudWxsID8gaGFuZGxlIDogYW5ub3RIYW5kbGU7CisgICAgCQl9CisgICAgCX0gZWxzZSB7CisJICAgIAlpZiAoKyt0aGlzLnB0ciA9PSAwKSB7CisJICAgIAkJdGhpcy5vdGhlckVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFsxMF07CisJICAgIAl9IGVsc2UgeworCSAgICAgICAgICAgIGludCBsZW5ndGggPSB0aGlzLm90aGVyRWxlbWVudHMubGVuZ3RoOworCSAgICAgICAgICAgIGlmICh0aGlzLnB0ciA9PSBsZW5ndGgpIHsKKwkgICAgICAgICAgICAJU3lzdGVtLmFycmF5Y29weSh0aGlzLm90aGVyRWxlbWVudHMsIDAsIHRoaXMub3RoZXJFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoKzEwXSwgMCwgbGVuZ3RoKTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCQlpZiAodGhpcy5hbm5vdGF0aW9uID09IG51bGwpIHsKKwkJICAgIAl0aGlzLm90aGVyRWxlbWVudHNbdGhpcy5wdHJdID0gaGFuZGxlOworICAgIAkJfSBlbHNlIHsKKwkJICAgIAlJSmF2YUVsZW1lbnQgYW5ub3RIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSGFuZGxlKHRoaXMuYW5ub3RhdGlvbiwgKElBbm5vdGF0YWJsZSkgaGFuZGxlKTsKKwkJICAgIAlpZiAoYW5ub3RIYW5kbGUgPT0gbnVsbCkgeworCQkJICAgIAlhbm5vdEhhbmRsZSA9IHRoaXMubG9jYXRvci5jcmVhdGVIYW5kbGUodGhpcy5hbm5vdGF0aW9uLCAoSUFubm90YXRhYmxlKSB0aGlzLmVuY2xvc2luZ0VsZW1lbnQpOworCQkgICAgCX0KKwkJICAgIAl0aGlzLm90aGVyRWxlbWVudHNbdGhpcy5wdHJdID0gYW5ub3RIYW5kbGUgPT0gbnVsbCA/IGhhbmRsZSA6IGFubm90SGFuZGxlOworICAgIAkJfQorICAgIAl9CisgICAgfSBlbHNlIHsKKyAgICAJaWYgKHRoaXMubG9jYWxFbGVtZW50c1tpZHhdID09IG51bGwpIHsKKwkgICAgCWlmICh0aGlzLmFubm90YXRpb24gPT0gbnVsbCkgeworCQkgICAgCXRoaXMubG9jYWxFbGVtZW50c1tpZHhdID0gIGhhbmRsZTsKKyAgICAJCX0gZWxzZSB7CisJCSAgICAJSUphdmFFbGVtZW50IGFubm90SGFuZGxlID0gdGhpcy5sb2NhdG9yLmNyZWF0ZUhhbmRsZSh0aGlzLmFubm90YXRpb24sIChJQW5ub3RhdGFibGUpIGhhbmRsZSk7CisJCSAgICAJaWYgKGFubm90SGFuZGxlID09IG51bGwpIHsKKwkJCSAgICAJYW5ub3RIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSGFuZGxlKHRoaXMuYW5ub3RhdGlvbiwgKElBbm5vdGF0YWJsZSkgdGhpcy5lbmNsb3NpbmdFbGVtZW50KTsKKwkJICAgIAl9CisJCSAgICAJdGhpcy5sb2NhbEVsZW1lbnRzW2lkeF0gPSBhbm5vdEhhbmRsZSA9PSBudWxsID8gaGFuZGxlIDogYW5ub3RIYW5kbGU7CisgICAgCQl9CisJCQl0aGlzLnB0cnNbaWR4XSA9IC0xOworCSAgICB9IGVsc2UgeworCSAgICAgICAgaW50IG9QdHIgPSArK3RoaXMucHRyc1tpZHhdOworCSAgICAJaWYgKG9QdHI9PSAwKSB7CisgICAgCQkJdGhpcy5hbGxPdGhlckVsZW1lbnRzW2lkeF0gPSBuZXcgSUphdmFFbGVtZW50WzEwXTsKKyAgICAJCX0gZWxzZSB7CisgICAgICAgICAgICAJaW50IGxlbmd0aCA9IHRoaXMuYWxsT3RoZXJFbGVtZW50c1tpZHhdLmxlbmd0aDsKKwkgICAgICAgICAgICBpZiAob1B0ciA9PSBsZW5ndGgpIHsKKwkgICAgICAgICAgICAJU3lzdGVtLmFycmF5Y29weSh0aGlzLmFsbE90aGVyRWxlbWVudHNbaWR4XSwgMCwgdGhpcy5hbGxPdGhlckVsZW1lbnRzW2lkeF0gPSBuZXcgSUphdmFFbGVtZW50W2xlbmd0aCsxMF0sIDAsIGxlbmd0aCk7CisgICAgICAgIAkgICAgfQorCSAgICAgICAgfQorCSAgICAJaWYgKHRoaXMuYW5ub3RhdGlvbiA9PSBudWxsKSB7CisJIAkJICAgCXRoaXMuYWxsT3RoZXJFbGVtZW50c1tpZHhdW29QdHJdID0gaGFuZGxlOworICAgIAkJfSBlbHNlIHsKKwkJICAgIAlJSmF2YUVsZW1lbnQgYW5ub3RIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSGFuZGxlKHRoaXMuYW5ub3RhdGlvbiwgKElBbm5vdGF0YWJsZSkgaGFuZGxlKTsKKwkJICAgIAlpZiAoYW5ub3RIYW5kbGUgPT0gbnVsbCkgeworCQkJICAgIAlhbm5vdEhhbmRsZSA9IHRoaXMubG9jYXRvci5jcmVhdGVIYW5kbGUodGhpcy5hbm5vdGF0aW9uLCAoSUFubm90YXRhYmxlKSB0aGlzLmVuY2xvc2luZ0VsZW1lbnQpOworCQkgICAgCX0KKwkgCQkgICAJdGhpcy5hbGxPdGhlckVsZW1lbnRzW2lkeF1bb1B0cl0gPSBhbm5vdEhhbmRsZSA9PSBudWxsID8gaGFuZGxlIDogYW5ub3RIYW5kbGU7CisgICAgCQl9CisgICAgCX0KKyAgICB9Cit9CitwdWJsaWMgYm9vbGVhbiB2aXNpdChBcmd1bWVudCBhcmd1bWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworICAgIHRoaXMubG9jYWxEZWNsYXJhdGlvbiA9IGFyZ3VtZW50OworICAgIHJldHVybiB0cnVlOworfQorcHVibGljIGJvb2xlYW4gdmlzaXQoTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworICAgIHRoaXMubG9jYWxEZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOworICAgIHJldHVybiB0cnVlOworfQorcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBtYXJrZXJBbm5vdGF0aW9uLCBCbG9ja1Njb3BlIHVudXNlZCkgeworCXRoaXMuYW5ub3RhdGlvbiA9IG1hcmtlckFubm90YXRpb247CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24sIEJsb2NrU2NvcGUgdW51c2VkKSB7CisJdGhpcy5hbm5vdGF0aW9uID0gbm9ybWFsQW5ub3RhdGlvbjsKKwlyZXR1cm4gdHJ1ZTsKK30KK3B1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgbmFtZVJlZmVyZW5jZSwgQmxvY2tTY29wZSB1bnVzZWQpIHsKKwlpZiAodGhpcy5ub2Rlc0NvdW50ID4gMCl7CisJCWludCBpZHggPSBtYXRjaE5vZGUobmFtZVJlZmVyZW5jZSk7CisJCWlmIChpZHggPj0gMCkgeworCQkJc3RvcmVIYW5kbGUoaWR4KTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgdW51c2VkKSB7CisJaWYgKHRoaXMubm9kZXNDb3VudCA+IDApeworCQlpbnQgaWR4ID0gbWF0Y2hOb2RlKHR5cGVSZWZlcmVuY2UpOworCQlpZiAoaWR4ID49IDApIHsKKwkJCXN0b3JlSGFuZGxlKGlkeCk7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBCbG9ja1Njb3BlIHVudXNlZCkgeworCXRoaXMuYW5ub3RhdGlvbiA9IHNpbmdsZU1lbWJlckFubm90YXRpb247CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVOYW1lUmVmZXJlbmNlIG5hbWVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgdW51c2VkKSB7CisJaWYgKHRoaXMubm9kZXNDb3VudCA+IDApeworCQlpbnQgaWR4ID0gbWF0Y2hOb2RlKG5hbWVSZWZlcmVuY2UpOworCQlpZiAoaWR4ID49IDApIHsKKwkJCXN0b3JlSGFuZGxlKGlkeCk7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHVudXNlZCkgeworCWlmICh0aGlzLm5vZGVzQ291bnQgPiAwKXsKKwkJaW50IGlkeCA9IG1hdGNoTm9kZSh0eXBlUmVmZXJlbmNlKTsKKwkJaWYgKGlkeCA+PSAwKSB7CisJCQlzdG9yZUhhbmRsZShpZHgpOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgdW51c2VkKSB7CisJdHJ5IHsKKwkJY2hhcltdIHNpbXBsZU5hbWU7CisJCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCkgeworCQkJc2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJfSBlbHNlIHsKKwkJCXNpbXBsZU5hbWUgPSB0eXBlRGVjbGFyYXRpb24ubmFtZTsKKwkJfQorCQlpbnQgb2NjdXJyZW5jZUNvdW50ID0gdGhpcy5vY2N1cnJlbmNlc0NvdW50cy5nZXQoc2ltcGxlTmFtZSk7CisJCWlmIChvY2N1cnJlbmNlQ291bnQgPT0gSGFzaHRhYmxlT2ZJbnRWYWx1ZXMuTk9fVkFMVUUpIHsKKwkJCW9jY3VycmVuY2VDb3VudCA9IDE7CisJCX0gZWxzZSB7CisJCQlvY2N1cnJlbmNlQ291bnQgPSBvY2N1cnJlbmNlQ291bnQgKyAxOworCQl9CisJCXRoaXMub2NjdXJyZW5jZXNDb3VudHMucHV0KHNpbXBsZU5hbWUsIG9jY3VycmVuY2VDb3VudCk7CisJCWlmICgodHlwZURlY2xhcmF0aW9uLmJpdHMgJiBBU1ROb2RlLklzQW5vbnltb3VzVHlwZSkgIT0gMCkgeworCQkJdGhpcy5sb2NhdG9yLnJlcG9ydE1hdGNoaW5nKHR5cGVEZWNsYXJhdGlvbiwgdGhpcy5lbmNsb3NpbmdFbGVtZW50LCAtMSwgdGhpcy5ub2RlU2V0LCBvY2N1cnJlbmNlQ291bnQpOworCQl9IGVsc2UgeworCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKSB0aGlzLm5vZGVTZXQubWF0Y2hpbmdOb2Rlcy5yZW1vdmVLZXkodHlwZURlY2xhcmF0aW9uKTsKKwkJCXRoaXMubG9jYXRvci5yZXBvcnRNYXRjaGluZyh0eXBlRGVjbGFyYXRpb24sIHRoaXMuZW5jbG9zaW5nRWxlbWVudCwgbGV2ZWwgIT0gbnVsbCA/IGxldmVsLmludFZhbHVlKCkgOiAtMSwgdGhpcy5ub2RlU2V0LCBvY2N1cnJlbmNlQ291bnQpOworCQl9CisJCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgbWVtYmVycyBhcyB0aGlzIHdhcyBkb25lIGR1cmluZyByZXBvcnRNYXRjaGluZyguLi4pCisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBXcmFwcGVkQ29yZUV4Y2VwdGlvbihlKTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZExvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kTG9jYXRvci5qYXZhCmluZGV4IDM1MmJlODAuLjU1ZTEwY2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5TaW1wbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkJhc2ljU2VhcmNoRW5naW5lOwogCiBwdWJsaWMgY2xhc3MgTWV0aG9kTG9jYXRvciBleHRlbmRzIFBhdHRlcm5Mb2NhdG9yIHsKQEAgLTQ3LDYgKzQ2LDI4IEBACiBwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKIAl0aGlzLm1ldGhvZERlY2xhcmF0aW9uc1dpdGhJbnZhbGlkUGFyYW0gPSBuZXcgSGFzaE1hcCgpOwogfQorcHJvdGVjdGVkIGludCBmaW5lR3JhaW4oKSB7CisJcmV0dXJuIHRoaXMucGF0dGVybi5maW5lR3JhaW47Cit9CisKK3ByaXZhdGUgTWV0aG9kQmluZGluZyBnZXRNZXRob2RCaW5kaW5nKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgY2hhcltdIG1ldGhvZE5hbWUsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcykgeworCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKG1ldGhvZE5hbWUpOworCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbnVsbDsKKwltZXRob2RzTG9vcDogZm9yIChpbnQgaT0wLCBsZW5ndGg9bWV0aG9kcy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHsKKwkJbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJCWlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCA9PSBwYXJhbWV0ZXJzLmxlbmd0aCkgeworCQkJZm9yIChpbnQgaj0wLGw9cGFyYW1ldGVycy5sZW5ndGg7IGo8bDsgaisrKSB7CisJCQkJaWYgKHBhcmFtZXRlcnNbal0uZXJhc3VyZSgpICE9IGFyZ3VtZW50VHlwZXNbal0uZXJhc3VyZSgpKSB7CisJCQkJCWNvbnRpbnVlIG1ldGhvZHNMb29wOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBtZXRob2Q7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisKIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQb2x5bW9ycGhpY1NlYXJjaChNYXRjaExvY2F0b3IgbG9jYXRvcikgewogCWxvbmcgc3RhcnQgPSAwOwogCWlmIChCYXNpY1NlYXJjaEVuZ2luZS5WRVJCT1NFKSB7CkBAIC03MiwxNyArOTMsMTcgQEAKICAqIFJldHVybiB3aGV0aGVyIGEgdHlwZSBuYW1lIGlzIGluIHBhdHRlcm4gYWxsIHN1cGVyIGRlY2xhcmluZyB0eXBlcyBuYW1lcy4KICAqLwogcHJpdmF0ZSBib29sZWFuIGlzVHlwZUluU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMoY2hhcltdW10gdHlwZU5hbWUpIHsKLQlpZiAoYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCWludCBsZW5ndGggPSBhbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lcy5sZW5ndGg7CisJaWYgKHRoaXMuYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCWludCBsZW5ndGggPSB0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzLmxlbmd0aDsKIAlmb3IgKGludCBpPSAwOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhhbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lc1tpXSwgdHlwZU5hbWUpKSB7CisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzW2ldLCB0eXBlTmFtZSkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJfQogCXJldHVybiBmYWxzZTsKIH0KIC8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb2RlIGdlbiB3aWxsIHVzZSBhbiBpbnZva2UgdmlydHVhbCBmb3IgCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvZGUgZ2VuIHdpbGwgdXNlIGFuIGludm9rZSB2aXJ0dWFsIGZvcgogICogdGhpcyBtZXNzYWdlIHNlbmQgb3Igbm90LgogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxJbnZva2UoTWV0aG9kQmluZGluZyBtZXRob2QsIE1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kKSB7CkBAIC05OCw5ICsxMTksOSBAQAogCQkJaWYgKGltcG9ydFJlZi5pc1N0YXRpYygpICYmICgoaW1wb3J0UmVmLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSA9PSAwKSAmJiBtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4uc2VsZWN0b3IsIGltcG9ydFJlZi50b2tlbnNbbGVuZ3RoXSkpIHsKIAkJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBuZXcgY2hhcltsZW5ndGhdW107CiAJCQkJU3lzdGVtLmFycmF5Y29weShpbXBvcnRSZWYudG9rZW5zLCAwLCBjb21wb3VuZE5hbWUsIDAsIGxlbmd0aCk7Ci0JCQkJY2hhcltdIGRlY2xhcmluZ1R5cGUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIHBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgJy4nKTsKKwkJCQljaGFyW10gZGVjbGFyaW5nVHlwZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMucGF0dGVybi5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCB0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgJy4nKTsKIAkJCQlpZiAobWF0Y2hlc05hbWUoZGVjbGFyaW5nVHlwZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKSkpIHsKLQkJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJCQkJZGVjbGFyYXRpb25zTGV2ZWwgPSB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTE1LDkgKzEzNiw5IEBACiAKIAkvLyBWZXJpZnkgbWV0aG9kIG5hbWUKIAlpZiAoIW1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5zZWxlY3Rvciwgbm9kZS5zZWxlY3RvcikpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwotCQorCiAJLy8gVmVyaWZ5IHBhcmFtZXRlcnMgdHlwZXMKLQlib29sZWFuIHJlc29sdmUgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlOworCWJvb2xlYW4gcmVzb2x2ZSA9IHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZTsKIAlpZiAodGhpcy5wYXR0ZXJuLnBhcmFtZXRlclNpbXBsZU5hbWVzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHRoaXMucGF0dGVybi5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CiAJCUFTVE5vZGVbXSBhcmdzID0gbm9kZS5hcmd1bWVudHM7CkBAIC0xMjcsNyArMTQ4LDcgQEAKIAkJCWlmIChhcmdzICE9IG51bGwgJiYgIW1hdGNoZXNUeXBlUmVmZXJlbmNlKHRoaXMucGF0dGVybi5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSwgKChBcmd1bWVudCkgYXJnc1tpXSkudHlwZSkpIHsKIAkJCQkvLyBEbyBub3QgcmV0dXJuIGFzIGltcG9zc2libGUgd2hlbiBzb3VyY2UgbGV2ZWwgaXMgYXQgbGVhc3QgMS41CiAJCQkJaWYgKHRoaXMubWF5QmVHZW5lcmljKSB7Ci0JCQkJCWlmICghKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSkgeworCQkJCQlpZiAoIXRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSkgewogCQkJCQkJLy8gU2V0IHJlc29sdXRpb24gZmxhZyBvbiBub2RlIHNldCBpbiBjYXNlIG9mIHR5cGVzIHdhcyBpbmZlcnJlZCBpbiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZyb20gZ2VuZXJpYyBvbmVzLi4uCiAJCQkJCSAJLy8gKHNlZSAgYnVncyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk5OTAsIDk2NzYxLCA5Njc2MykKIAkJCQkJCW5vZGVTZXQubXVzdFJlc29sdmUgPSB0cnVlOwpAQCAtMTU0LDcgKzE3NSw3IEBACiAKIAlpZiAoIW1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5zZWxlY3Rvciwgbm9kZS5uYW1lKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAKLQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CiB9CiBwdWJsaWMgaW50IG1hdGNoKE1lc3NhZ2VTZW5kIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJaWYgKCF0aGlzLnBhdHRlcm4uZmluZFJlZmVyZW5jZXMpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwpAQCAtMTY3LDcgKzE4OCw3IEBACiAJCWlmIChsZW5ndGggIT0gYXJnc0xlbmd0aCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAJfQogCi0JcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOworCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogfQogLy9wdWJsaWMgaW50IG1hdGNoKFJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgLSBTS0lQIElUCiBwdWJsaWMgaW50IG1hdGNoKEFubm90YXRpb24gbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKQEAgLTE4MSw3ICsyMDIsNyBAQAogCQlwYWlyID0gbm9kZS5tZW1iZXJWYWx1ZVBhaXJzKClbaV07CiAJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4uc2VsZWN0b3IsIHBhaXIubmFtZSkpIHsKIAkJCUFTVE5vZGUgcG9zc2libGVOb2RlID0gKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSA/IChBU1ROb2RlKSBub2RlIDogcGFpcjsKLQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKHBvc3NpYmxlTm9kZSwgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOworCQkJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gocG9zc2libGVOb2RlLCB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKIAkJfQogCX0KIAlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKQEAgLTMxMCwxMCArMzMxLDEzIEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFTVE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCW1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgbnVsbCwgbnVsbCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBsb2NhdG9yKTsKK30KIC8qKgogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuUGF0dGVybkxvY2F0b3IjbWF0Y2hSZXBvcnRSZWZlcmVuY2Uob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BU1ROb2RlLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIEJpbmRpbmcsIGludCwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLk1hdGNoTG9jYXRvcikKICAqLwotcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQsIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAocmVmZXJlbmNlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpID8gKChNZXNzYWdlU2VuZClyZWZlcmVuY2UpLmJpbmRpbmc6ICgoZWxlbWVudEJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSA/IChNZXRob2RCaW5kaW5nKSBlbGVtZW50QmluZGluZyA6IG51bGwpOwogCWlmICh0aGlzLmlzRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybikgewogCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSByZXR1cm47CkBAIC0zMjEsMTYgKzM0NSwxOCBAQAogCQlpZiAoYWNjdXJhY3kgIT0gU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSkgcmV0dXJuOwogCiAJCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBtZXRob2QgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQKLQkJRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybiBkZWNsUGF0dGVybiA9IChEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuKSB0aGlzLnBhdHRlcm47IAorCQlEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuIGRlY2xQYXR0ZXJuID0gKERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4pIHRoaXMucGF0dGVybjsKIAkJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCAmJiAhZGVjbFBhdHRlcm4uZW5jbG9zaW5nRWxlbWVudC5lcXVhbHMoZWxlbWVudCkpCiAJCQllbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKIAkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewogCQkJcmVwb3J0RGVjbGFyYXRpb24obWV0aG9kQmluZGluZywgbG9jYXRvciwgZGVjbFBhdHRlcm4ua25vd25NZXRob2RzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCW1hdGNoID0gbG9jYXRvci5uZXdNZXRob2RSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIC0xLCAtMSwgZmFsc2UgLypub3QgY29uc3RydWN0b3IqLywgZmFsc2UvKm5vdCBzeW50aGV0aWMqLywgcmVmZXJlbmNlKTsKKwkJTWV0aG9kUmVmZXJlbmNlTWF0Y2ggbWV0aG9kUmVmZXJlbmNlTWF0Y2ggPSBsb2NhdG9yLm5ld01ldGhvZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgLTEsIC0xLCBmYWxzZSAvKm5vdCBjb25zdHJ1Y3RvciovLCBmYWxzZS8qbm90IHN5bnRoZXRpYyovLCByZWZlcmVuY2UpOworCQltZXRob2RSZWZlcmVuY2VNYXRjaC5zZXRMb2NhbEVsZW1lbnQobG9jYWxFbGVtZW50KTsKKwkJdGhpcy5tYXRjaCA9IG1ldGhvZFJlZmVyZW5jZU1hdGNoOwogCQlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzICYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7Ci0JCQlJSmF2YUVsZW1lbnQgZm9jdXMgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybikgdGhpcy5wYXR0ZXJuKS5mb2N1czsKKwkJCUlKYXZhRWxlbWVudCBmb2N1cyA9IHRoaXMucGF0dGVybi5mb2N1czsKIAkJCS8vIHZlcmlmeSBjbG9zZXN0IG1hdGNoIGlmIHBhdHRlcm4gd2FzIGJvdW5kCiAJCQkvLyAoc2VlIGJ1ZyA3MDgyNykKIAkJCWlmIChmb2N1cyAhPSBudWxsICYmIGZvY3VzLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewpAQCAtMzQ1LDEzICszNzEsMTMgQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7CiAJCQkJcmVmZXJlbmNlID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKXJlZmVyZW5jZSkubWVtYmVyVmFsdWVQYWlycygpWzBdOwotCQkJCW1hdGNoLnNldEltcGxpY2l0KHRydWUpOworCQkJCXRoaXMubWF0Y2guc2V0SW1wbGljaXQodHJ1ZSk7CiAJCQl9CiAJCQlpbnQgb2Zmc2V0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OwogCQkJaW50IGxlbmd0aCA9ICByZWZlcmVuY2Uuc291cmNlRW5kIC0gb2Zmc2V0ICsgMTsKLQkJCW1hdGNoLnNldE9mZnNldChvZmZzZXQpOwotCQkJbWF0Y2guc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCQl0aGlzLm1hdGNoLnNldE9mZnNldChvZmZzZXQpOworCQkJdGhpcy5tYXRjaC5zZXRMZW5ndGgobGVuZ3RoKTsKKwkJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCQl9CiAJfQogfQpAQCAtMzY0LDcgKzM5MCw3IEBACiAKIAkJLy8gVXBkYXRlIG1hdGNoIHJlZ2FyZGluZyBtZXRob2QgdHlwZSBhcmd1bWVudHMKIAkJUGFyYW1ldGVyaXplZEdlbmVyaWNNZXRob2RCaW5kaW5nIHBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nID0gKFBhcmFtZXRlcml6ZWRHZW5lcmljTWV0aG9kQmluZGluZykgbWV0aG9kQmluZGluZzsKLQkJbWF0Y2guc2V0UmF3KHBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nLmlzUmF3KTsKKwkJdGhpcy5tYXRjaC5zZXRSYXcocGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcuaXNSYXcpOwogCQlUeXBlQmluZGluZ1tdIHR5cGVBcmd1bWVudHMgPSAvKnBhcmFtZXRlcml6ZWRNZXRob2RCaW5kaW5nLmlzUmF3ID8gbnVsbCA6Ki8gcGFyYW1ldGVyaXplZE1ldGhvZEJpbmRpbmcudHlwZUFyZ3VtZW50czsKIAkJdXBkYXRlTWF0Y2godHlwZUFyZ3VtZW50cywgbG9jYXRvciwgdGhpcy5wYXR0ZXJuLm1ldGhvZEFyZ3VtZW50cywgdGhpcy5wYXR0ZXJuLmhhc01ldGhvZFBhcmFtZXRlcnMoKSk7CiAKQEAgLTM3OCw3ICs0MDQsNyBAQAogCQkJCXVwZGF0ZU1hdGNoKHBhcmFtZXRlcml6ZWRCaW5kaW5nLCB0aGlzLnBhdHRlcm4uZ2V0VHlwZUFyZ3VtZW50cygpLCB0aGlzLnBhdHRlcm4uaGFzVHlwZVBhcmFtZXRlcnMoKSwgMCwgbG9jYXRvcik7CiAJCQl9CiAJCX0gZWxzZSBpZiAodGhpcy5wYXR0ZXJuLmhhc1R5cGVBcmd1bWVudHMoKSkgewotCQkJbWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CisJCQl0aGlzLm1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOwogCQl9CiAKIAkJLy8gVXBkYXRlIG1hdGNoIHJlZ2FyZGluZyBtZXRob2QgcGFyYW1ldGVycwpAQCAtMzg4LDggKzQxNCw4IEBACiAJCS8vIFRPRE8gPyAoZnJlZGVyaWMpCiAKIAkJLy8gU3BlY2lhbCBjYXNlIGZvciBlcnJvcnMKLQkJaWYgKG1hdGNoLmdldFJ1bGUoKSAhPSAwICYmIG1lc3NhZ2VTZW5kLnJlc29sdmVkVHlwZSA9PSBudWxsKSB7Ci0JCQltYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKKwkJaWYgKHRoaXMubWF0Y2guZ2V0UnVsZSgpICE9IDAgJiYgbWVzc2FnZVNlbmQucmVzb2x2ZWRUeXBlID09IG51bGwpIHsKKwkJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJCX0KIAl9IGVsc2UgaWYgKG1ldGhvZEJpbmRpbmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkTWV0aG9kQmluZGluZykgewogCQlpc1BhcmFtZXRlcml6ZWQgPSB0cnVlOwpAQCAtMzk5LDcgKzQyNSw3IEBACiAJCQkJdXBkYXRlTWF0Y2gocGFyYW1ldGVyaXplZEJpbmRpbmcsIHRoaXMucGF0dGVybi5nZXRUeXBlQXJndW1lbnRzKCksIHRoaXMucGF0dGVybi5oYXNUeXBlUGFyYW1ldGVycygpLCAwLCBsb2NhdG9yKTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4uaGFzVHlwZUFyZ3VtZW50cygpKSB7Ci0JCQltYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKKwkJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJCX0KIAogCQkvLyBVcGRhdGUgbWF0Y2ggcmVnYXJkaW5nIG1ldGhvZCBwYXJhbWV0ZXJzCkBAIC00MDksMjYgKzQzNSwyNiBAQAogCQkvLyBUT0RPID8gKGZyZWRlcmljKQogCiAJCS8vIFNwZWNpYWwgY2FzZSBmb3IgZXJyb3JzCi0JCWlmIChtYXRjaC5nZXRSdWxlKCkgIT0gMCAmJiBtZXNzYWdlU2VuZC5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgewotCQkJbWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CisJCWlmICh0aGlzLm1hdGNoLmdldFJ1bGUoKSAhPSAwICYmIG1lc3NhZ2VTZW5kLnJlc29sdmVkVHlwZSA9PSBudWxsKSB7CisJCQl0aGlzLm1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOwogCQl9CiAJfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4uaGFzTWV0aG9kQXJndW1lbnRzKCkpIHsgLy8gYmluZGluZyBoYXMgbm8gdHlwZSBwYXJhbXMsIGNvbXBhdGlibGUgZXJhc3VyZSBpZiBwYXR0ZXJuIGRvZXMKLQkJbWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CisJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJfQogCiAJLy8gU2VlIHdoZXRoZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlcG9ydCBvciBub3QKLQlpZiAobWF0Y2guZ2V0UnVsZSgpID09IDApIHJldHVybjsgLy8gaW1wb3NzaWJsZSBtYXRjaAotCWJvb2xlYW4gcmVwb3J0ID0gKHRoaXMuaXNFcmFzdXJlTWF0Y2ggJiYgbWF0Y2guaXNFcmFzdXJlKCkpIHx8ICh0aGlzLmlzRXF1aXZhbGVudE1hdGNoICYmIG1hdGNoLmlzRXF1aXZhbGVudCgpKSB8fCBtYXRjaC5pc0V4YWN0KCk7CisJaWYgKHRoaXMubWF0Y2guZ2V0UnVsZSgpID09IDApIHJldHVybjsgLy8gaW1wb3NzaWJsZSBtYXRjaAorCWJvb2xlYW4gcmVwb3J0ID0gKHRoaXMuaXNFcmFzdXJlTWF0Y2ggJiYgdGhpcy5tYXRjaC5pc0VyYXN1cmUoKSkgfHwgKHRoaXMuaXNFcXVpdmFsZW50TWF0Y2ggJiYgdGhpcy5tYXRjaC5pc0VxdWl2YWxlbnQoKSkgfHwgdGhpcy5tYXRjaC5pc0V4YWN0KCk7CiAJaWYgKCFyZXBvcnQpIHJldHVybjsKIAogCS8vIFJlcG9ydCBtYXRjaAogCWludCBvZmZzZXQgPSAoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMik7Ci0JbWF0Y2guc2V0T2Zmc2V0KG9mZnNldCk7Ci0JbWF0Y2guc2V0TGVuZ3RoKG1lc3NhZ2VTZW5kLnNvdXJjZUVuZCAtIG9mZnNldCArIDEpOworCXRoaXMubWF0Y2guc2V0T2Zmc2V0KG9mZnNldCk7CisJdGhpcy5tYXRjaC5zZXRMZW5ndGgobWVzc2FnZVNlbmQuc291cmNlRW5kIC0gb2Zmc2V0ICsgMSk7CiAJIGlmIChpc1BhcmFtZXRlcml6ZWQgJiYgdGhpcy5wYXR0ZXJuLmhhc01ldGhvZEFyZ3VtZW50cygpKSAgewotCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUGFyYW1ldGVyaXplZE1ldGhvZFJlZmVyZW5jZShtYXRjaCwgbWVzc2FnZVNlbmQsIG1lc3NhZ2VTZW5kLnR5cGVBcmd1bWVudHMpOworCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUGFyYW1ldGVyaXplZE1ldGhvZFJlZmVyZW5jZSh0aGlzLm1hdGNoLCBtZXNzYWdlU2VuZCwgbWVzc2FnZVNlbmQudHlwZUFyZ3VtZW50cyk7CiAJfSBlbHNlIHsKLQkJbG9jYXRvci5yZXBvcnQobWF0Y2gpOworCQlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIAl9CiB9CiAvKgpAQCAtNDkwLDEyICs1MTYsMTEgQEAKIAlJVHlwZSB0eXBlID0gbG9jYXRvci5sb29rdXBUeXBlKGRlY2xhcmluZ0NsYXNzKTsKIAlpZiAodHlwZSA9PSBudWxsKSByZXR1cm47IC8vIGNhc2Ugb2YgYSBzZWNvbmRhcnkgdHlwZQogCi0JY2hhcltdIGJpbmRpbmdTZWxlY3RvciA9IG1ldGhvZEJpbmRpbmcuc2VsZWN0b3I7Ci0JYm9vbGVhbiBpc0JpbmFyeSA9IHR5cGUuaXNCaW5hcnkoKTsKLQlJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gbWV0aG9kQmluZGluZy5vcmlnaW5hbCgpLnBhcmFtZXRlcnM7Ci0JaW50IHBhcmFtZXRlckxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOwotCWlmIChpc0JpbmFyeSkgeworCS8vIFJlcG9ydCBtYXRjaCBmb3IgYmluYXJ5CisJaWYgKHR5cGUuaXNCaW5hcnkoKSkgeworCQlJTWV0aG9kIG1ldGhvZCA9IG51bGw7CisJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZEJpbmRpbmcub3JpZ2luYWwoKS5wYXJhbWV0ZXJzOworCQlpbnQgcGFyYW1ldGVyTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CiAJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IGNoYXJbcGFyYW1ldGVyTGVuZ3RoXVtdOwogCQlmb3IgKGludCBpID0gMDsgaTxwYXJhbWV0ZXJMZW5ndGg7IGkrKykgewogCQkJY2hhcltdIHR5cGVOYW1lID0gcGFyYW1ldGVyc1tpXS5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CkBAIC01MDUsNDggKzUzMCw0MSBAQAogCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSB0eXBlTmFtZTsKIAkJfQogCQltZXRob2QgPSBsb2NhdG9yLmNyZWF0ZUJpbmFyeU1ldGhvZEhhbmRsZSh0eXBlLCBtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfSBlbHNlIHsKLQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpICA8IHBhcmFtZXRlckxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyW10gdHlwZU5hbWUgPSBwYXJhbWV0ZXJzW2ldLnNob3J0UmVhZGFibGVOYW1lKCk7Ci0JCQlpZiAocGFyYW1ldGVyc1tpXS5pc01lbWJlclR5cGUoKSkgewotCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0eXBlTmFtZSwgQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcuJywgdHlwZU5hbWUpKzEsIHR5cGVOYW1lLmxlbmd0aCk7Ci0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBmYWxzZSk7Ci0JCX0KLQkJbWV0aG9kID0gdHlwZS5nZXRNZXRob2QobmV3IFN0cmluZyhiaW5kaW5nU2VsZWN0b3IpLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCWlmIChtZXRob2QgPT0gbnVsbCB8fCBrbm93bk1ldGhvZHMuYWRkSWZOb3RJbmNsdWRlZChtZXRob2QpID09IG51bGwpIHJldHVybjsKLQotCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0UmVzb3VyY2UoKTsKLQlJQmluYXJ5VHlwZSBpbmZvID0gbnVsbDsKLQlpZiAoaXNCaW5hcnkpIHsKKwkJaWYgKG1ldGhvZCA9PSBudWxsIHx8IGtub3duTWV0aG9kcy5hZGRJZk5vdEluY2x1ZGVkKG1ldGhvZCkgPT0gbnVsbCkgcmV0dXJuOworCQorCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFJlc291cmNlKCk7CiAJCWlmIChyZXNvdXJjZSA9PSBudWxsKQogCQkJcmVzb3VyY2UgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlpbmZvID0gbG9jYXRvci5nZXRCaW5hcnlJbmZvKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpdHlwZS5nZXRDbGFzc0ZpbGUoKSwgcmVzb3VyY2UpOworCQlJQmluYXJ5VHlwZSBpbmZvID0gbG9jYXRvci5nZXRCaW5hcnlJbmZvKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpdHlwZS5nZXRDbGFzc0ZpbGUoKSwgcmVzb3VyY2UpOwogCQlsb2NhdG9yLnJlcG9ydEJpbmFyeU1lbWJlckRlY2xhcmF0aW9uKHJlc291cmNlLCBtZXRob2QsIG1ldGhvZEJpbmRpbmcsIGluZm8sIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUpOwotCX0gZWxzZSB7Ci0JCWlmIChkZWNsYXJpbmdDbGFzcyBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykKLQkJCWRlY2xhcmluZ0NsYXNzID0gKChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzKS5nZW5lcmljVHlwZSgpOwotCQlDbGFzc1Njb3BlIHNjb3BlID0gKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MpLnNjb3BlOwotCQlpZiAoc2NvcGUgIT0gbnVsbCkgewotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG51bGw7Ci0JCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbHMgPSB0eXBlRGVjbC5tZXRob2RzOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZERlY2xzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGJpbmRpbmdTZWxlY3RvciwgbWV0aG9kRGVjbHNbaV0uc2VsZWN0b3IpKSB7Ci0JCQkJCW1ldGhvZERlY2wgPSBtZXRob2REZWNsc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSAKLQkJCWlmIChtZXRob2REZWNsICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gbWV0aG9kRGVjbC5zb3VyY2VTdGFydDsKLQkJCQlCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2REZWNsLmJpbmRpbmc7Ci0JCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkKLQkJCQkJbWV0aG9kID0gKElNZXRob2QpICgoSmF2YUVsZW1lbnQpIG1ldGhvZCkucmVzb2x2ZWQoYmluZGluZyk7Ci0JCQkJbWF0Y2ggPSBuZXcgTWV0aG9kRGVjbGFyYXRpb25NYXRjaChtZXRob2QsIFNlYXJjaE1hdGNoLkFfQUNDVVJBVEUsIG9mZnNldCwgbWV0aG9kRGVjbC5zb3VyY2VFbmQtb2Zmc2V0KzEsIGxvY2F0b3IuZ2V0UGFydGljaXBhbnQoKSwgcmVzb3VyY2UpOwotCQkJCWxvY2F0b3IucmVwb3J0KG1hdGNoKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFdoZW4gc291cmNlIGlzIGF2YWlsYWJsZSwgcmVwb3J0IG1hdGNoIGlmIG1ldGhvZCBpcyBmb3VuZCBpbiB0aGUgZGVjbGFyaW5nIHR5cGUKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFJlc291cmNlKCk7CisJaWYgKGRlY2xhcmluZ0NsYXNzIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKQorCQlkZWNsYXJpbmdDbGFzcyA9ICgoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzcykuZ2VuZXJpY1R5cGUoKTsKKwlDbGFzc1Njb3BlIHNjb3BlID0gKChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3MpLnNjb3BlOworCWlmIChzY29wZSAhPSBudWxsKSB7CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IHR5cGVEZWNsLmRlY2xhcmF0aW9uT2YobWV0aG9kQmluZGluZy5vcmlnaW5hbCgpKTsKKwkJaWYgKG1ldGhvZERlY2wgIT0gbnVsbCkgeworCQkJLy8gQ3JlYXRlIG1ldGhvZCBoYW5kbGUgZnJvbSBtZXRob2QgZGVjbGFyYXRpb24KKwkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IFN0cmluZyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yKTsKKwkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbC5hcmd1bWVudHM7CisJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzID09IG51bGwgPyAwIDogYXJndW1lbnRzLmxlbmd0aDsKKwkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyW11bXSB0eXBlTmFtZSA9IGFyZ3VtZW50c1tpXS50eXBlLmdldFBhcmFtZXRlcml6ZWRUeXBlTmFtZSgpOworCQkJCXBhcmFtZXRlclR5cGVzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGVOYW1lLCAnLicpLCBmYWxzZSk7CiAJCQl9CisJCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKKwkJCWlmIChtZXRob2QgPT0gbnVsbCB8fCBrbm93bk1ldGhvZHMuYWRkSWZOb3RJbmNsdWRlZChtZXRob2QpID09IG51bGwpIHJldHVybjsKKworCQkJLy8gQ3JlYXRlIGFuZCByZXBvcnQgY29ycmVzcG9uZGluZyBtYXRjaAorCQkJaW50IG9mZnNldCA9IG1ldGhvZERlY2wuc291cmNlU3RhcnQ7CisJCQl0aGlzLm1hdGNoID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uTWF0Y2gobWV0aG9kLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCBvZmZzZXQsIG1ldGhvZERlY2wuc291cmNlRW5kLW9mZnNldCsxLCBsb2NhdG9yLmdldFBhcnRpY2lwYW50KCksIHJlc291cmNlKTsKKwkJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCQl9CiAJfQogfQpAQCAtNTg4LDE3ICs2MDYsMTYgQEAKIAl9CiAKIAkvLyBkZWNsYXJpbmcgdHlwZQotCWNoYXJbXSBxdWFsaWZpZWRQYXR0ZXJuID0gcXVhbGlmaWVkUGF0dGVybih0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pOwotCWlmIChxdWFsaWZpZWRQYXR0ZXJuID09IG51bGwpIHJldHVybiBtZXRob2RMZXZlbDsgLy8gc2luY2UgYW55IGRlY2xhcmluZyBjbGFzcyB3aWxsIGRvCisJaWYgKHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwgJiYgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gPT0gbnVsbCkgcmV0dXJuIG1ldGhvZExldmVsOyAvLyBzaW5jZSBhbnkgZGVjbGFyaW5nIGNsYXNzIHdpbGwgZG8KIAogCWJvb2xlYW4gc3ViVHlwZSA9ICFtZXRob2QuaXNTdGF0aWMoKSAmJiAhbWV0aG9kLmlzUHJpdmF0ZSgpOwogCWlmIChzdWJUeXBlICYmIHRoaXMucGF0dGVybi5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwgJiYgbWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlICE9IG51bGwpIHsKIAkJc3ViVHlwZSA9IENoYXJPcGVyYXRpb24uY29tcGFyZVdpdGgodGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSA9PSAwOwogCX0KIAlpbnQgZGVjbGFyaW5nTGV2ZWwgPSBzdWJUeXBlCi0JCT8gcmVzb2x2ZUxldmVsQXNTdWJ0eXBlKHF1YWxpZmllZFBhdHRlcm4sIG1ldGhvZC5kZWNsYXJpbmdDbGFzcywgbnVsbCkKLQkJOiByZXNvbHZlTGV2ZWxGb3JUeXBlKHF1YWxpZmllZFBhdHRlcm4sIG1ldGhvZC5kZWNsYXJpbmdDbGFzcyk7Ci0JcmV0dXJuIG1ldGhvZExldmVsID4gZGVjbGFyaW5nTGV2ZWwgPyBkZWNsYXJpbmdMZXZlbCA6IG1ldGhvZExldmVsOyAvLyByZXR1cm4gdGhlIHdlYWtlciBtYXRjaAorCQk/IHJlc29sdmVMZXZlbEFzU3VidHlwZSh0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIG1ldGhvZC5kZWNsYXJpbmdDbGFzcywgbWV0aG9kLnNlbGVjdG9yLCBudWxsKQorCQk6IHJlc29sdmVMZXZlbEZvclR5cGUodGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMucGF0dGVybi5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCXJldHVybiAobWV0aG9kTGV2ZWwgJiBNQVRDSF9MRVZFTF9NQVNLKSA+IChkZWNsYXJpbmdMZXZlbCAmIE1BVENIX0xFVkVMX01BU0spID8gZGVjbGFyaW5nTGV2ZWwgOiBtZXRob2RMZXZlbDsgLy8gcmV0dXJuIHRoZSB3ZWFrZXIgbWF0Y2gKIH0KIHByb3RlY3RlZCBpbnQgcmVzb2x2ZUxldmVsKE1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kKSB7CiAJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXNzYWdlU2VuZC5iaW5kaW5nOwpAQCAtNjEwLDEyICs2MjcsMTIgQEAKIAkJLy8gc2VlIE1lc3NhZ2VTZW5kI3Jlc29sdmVUeXBlKEJsb2NrU2NvcGUpCiAJCS8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzIyCiAJCWludCBhcmdMZW5ndGggPSBtZXNzYWdlU2VuZC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBtZXNzYWdlU2VuZC5hcmd1bWVudHMubGVuZ3RoOwotCQlpZiAocGF0dGVybi5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsIHx8IGFyZ0xlbmd0aCA9PSBwYXR0ZXJuLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aCkgeworCQlpZiAodGhpcy5wYXR0ZXJuLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgfHwgYXJnTGVuZ3RoID09IHRoaXMucGF0dGVybi5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGgpIHsKIAkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOwogCQl9CiAJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCX0KLQkKKwogCWludCBtZXRob2RMZXZlbCA9IG1hdGNoTWV0aG9kKG1ldGhvZCwgZmFsc2UpOwogCWlmIChtZXRob2RMZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7CiAJCWlmIChtZXRob2QgIT0gbWV0aG9kLm9yaWdpbmFsKCkpIG1ldGhvZExldmVsID0gbWF0Y2hNZXRob2QobWV0aG9kLm9yaWdpbmFsKCksIGZhbHNlKTsKQEAgLTYyNCwxMyArNjQxLDEyIEBACiAJfQogCiAJLy8gcmVjZWl2ZXIgdHlwZQotCWNoYXJbXSBxdWFsaWZpZWRQYXR0ZXJuID0gcXVhbGlmaWVkUGF0dGVybih0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pOwotCWlmIChxdWFsaWZpZWRQYXR0ZXJuID09IG51bGwpIHJldHVybiBtZXRob2RMZXZlbDsgLy8gc2luY2UgYW55IGRlY2xhcmluZyBjbGFzcyB3aWxsIGRvCisJaWYgKHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwgJiYgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gPT0gbnVsbCkgcmV0dXJuIG1ldGhvZExldmVsOyAvLyBzaW5jZSBhbnkgZGVjbGFyaW5nIGNsYXNzIHdpbGwgZG8KIAogCWludCBkZWNsYXJpbmdMZXZlbDsKIAlpZiAoaXNWaXJ0dWFsSW52b2tlKG1ldGhvZCwgbWVzc2FnZVNlbmQpICYmIChtZXNzYWdlU2VuZC5hY3R1YWxSZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgewogCQlSZWZlcmVuY2VCaW5kaW5nIG1ldGhvZFJlY2VpdmVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBtZXNzYWdlU2VuZC5hY3R1YWxSZWNlaXZlclR5cGU7Ci0JCWRlY2xhcmluZ0xldmVsID0gcmVzb2x2ZUxldmVsQXNTdWJ0eXBlKHF1YWxpZmllZFBhdHRlcm4sIG1ldGhvZFJlY2VpdmVyVHlwZSwgbWV0aG9kLnBhcmFtZXRlcnMpOworCQlkZWNsYXJpbmdMZXZlbCA9IHJlc29sdmVMZXZlbEFzU3VidHlwZSh0aGlzLnBhdHRlcm4uZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIG1ldGhvZFJlY2VpdmVyVHlwZSwgbWV0aG9kLnNlbGVjdG9yLCBtZXRob2QucGFyYW1ldGVycyk7CiAJCWlmIChkZWNsYXJpbmdMZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7CiAJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzID09IG51bGwgfHwgdGhpcy5hbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lcyA9PSBudWxsKSB7CiAJCQkJZGVjbGFyaW5nTGV2ZWwgPSBJTkFDQ1VSQVRFX01BVENIOwpAQCAtNjQ2LDkgKzY2Miw5IEBACiAJCQlyZXR1cm4gZGVjbGFyaW5nTGV2ZWw7CiAJCX0KIAl9IGVsc2UgewotCQlkZWNsYXJpbmdMZXZlbCA9IHJlc29sdmVMZXZlbEZvclR5cGUocXVhbGlmaWVkUGF0dGVybiwgbWV0aG9kLmRlY2xhcmluZ0NsYXNzKTsKKwkJZGVjbGFyaW5nTGV2ZWwgPSByZXNvbHZlTGV2ZWxGb3JUeXBlKHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLnBhdHRlcm4uZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgbWV0aG9kLmRlY2xhcmluZ0NsYXNzKTsKIAl9Ci0JcmV0dXJuIG1ldGhvZExldmVsID4gZGVjbGFyaW5nTGV2ZWwgPyBkZWNsYXJpbmdMZXZlbCA6IG1ldGhvZExldmVsOyAvLyByZXR1cm4gdGhlIHdlYWtlciBtYXRjaAorCXJldHVybiAobWV0aG9kTGV2ZWwgJiBNQVRDSF9MRVZFTF9NQVNLKSA+IChkZWNsYXJpbmdMZXZlbCAmIE1BVENIX0xFVkVMX01BU0spID8gZGVjbGFyaW5nTGV2ZWwgOiBtZXRob2RMZXZlbDsgLy8gcmV0dXJuIHRoZSB3ZWFrZXIgbWF0Y2gKIH0KIAogLyoqCkBAIC02NTgsMTIgKzY3NCwxMyBAQAogICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIHJlc29sdmUgZmFpbHMKICAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0LgogICovCi1wcm90ZWN0ZWQgaW50IHJlc29sdmVMZXZlbEFzU3VidHlwZShjaGFyW10gcXVhbGlmaWVkUGF0dGVybiwgUmVmZXJlbmNlQmluZGluZyB0eXBlLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKK3Byb3RlY3RlZCBpbnQgcmVzb2x2ZUxldmVsQXNTdWJ0eXBlKGNoYXJbXSBzaW1wbGVQYXR0ZXJuLCBjaGFyW10gcXVhbGlmaWVkUGF0dGVybiwgUmVmZXJlbmNlQmluZGluZyB0eXBlLCBjaGFyW10gbWV0aG9kTmFtZSwgVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzKSB7CiAJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CiAKLQlpbnQgbGV2ZWwgPSByZXNvbHZlTGV2ZWxGb3JUeXBlKHF1YWxpZmllZFBhdHRlcm4sIHR5cGUpOworCWludCBsZXZlbCA9IHJlc29sdmVMZXZlbEZvclR5cGUoc2ltcGxlUGF0dGVybiwgcXVhbGlmaWVkUGF0dGVybiwgdHlwZSk7CiAJaWYgKGxldmVsICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsKLQkJaWYgKCF0eXBlLmlzQWJzdHJhY3QoKSAmJiAhdHlwZS5pc0ludGVyZmFjZSgpKSB7IC8vIGlmIGNvbmNyZXRlIGNsYXNzLCB0aGVuIG1ldGhvZCBpcyBvdmVycmlkZGVuCisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gYXJndW1lbnRUeXBlcyA9PSBudWxsID8gbnVsbCA6IGdldE1ldGhvZEJpbmRpbmcodHlwZSwgbWV0aG9kTmFtZSwgYXJndW1lbnRUeXBlcyk7CisJCWlmICgoKG1ldGhvZCAhPSBudWxsICYmICFtZXRob2QuaXNBYnN0cmFjdCgpKSB8fCAhdHlwZS5pc0Fic3RyYWN0KCkpICYmICF0eXBlLmlzSW50ZXJmYWNlKCkpIHsgLy8gaWYgY29uY3JldGUsIHRoZW4gbWV0aG9kIGlzIG92ZXJyaWRkZW4KIAkJCWxldmVsIHw9IE9WRVJSSURERU5fTUVUSE9EX0ZMQVZPUjsKIAkJfQogCQlyZXR1cm4gbGV2ZWw7CkBAIC02NzEsMzIgKzY4OCwxOSBAQAogCiAJLy8gbWF0Y2hlcyBzdXBlcmNsYXNzCiAJaWYgKCF0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGUuY29tcG91bmROYW1lLCBUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1QpKSB7Ci0JCWxldmVsID0gcmVzb2x2ZUxldmVsQXNTdWJ0eXBlKHF1YWxpZmllZFBhdHRlcm4sIHR5cGUuc3VwZXJjbGFzcygpLCBhcmd1bWVudFR5cGVzKTsKKwkJbGV2ZWwgPSByZXNvbHZlTGV2ZWxBc1N1YnR5cGUoc2ltcGxlUGF0dGVybiwgcXVhbGlmaWVkUGF0dGVybiwgdHlwZS5zdXBlcmNsYXNzKCksIG1ldGhvZE5hbWUsIGFyZ3VtZW50VHlwZXMpOwogCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgewogCQkJaWYgKGFyZ3VtZW50VHlwZXMgIT0gbnVsbCkgewogCQkJCS8vIG5lZWQgdG8gdmVyaWZ5IGlmIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbgotCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKHRoaXMucGF0dGVybi5zZWxlY3Rvcik7Ci0JCQkJZm9yIChpbnQgaT0wLCBsZW5ndGg9bWV0aG9kcy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsKLQkJCQkJaWYgKGFyZ3VtZW50VHlwZXMubGVuZ3RoID09IHBhcmFtZXRlcnMubGVuZ3RoKSB7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gdHJ1ZTsKLQkJCQkJCWZvciAoaW50IGo9MCxsPXBhcmFtZXRlcnMubGVuZ3RoOyBqPGw7IGorKykgewotCQkJCQkJCWlmIChwYXJhbWV0ZXJzW2pdLmVyYXN1cmUoKSAhPSBhcmd1bWVudFR5cGVzW2pdLmVyYXN1cmUoKSkgewotCQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZm91bmQpIHsgLy8gb25lIG1ldGhvZCBtYXRjaCBpbiBoaWVyYXJjaHkKLQkJCQkJCQlpZiAoKGxldmVsICYgT1ZFUlJJRERFTl9NRVRIT0RfRkxBVk9SKSAhPSAwKSB7Ci0JCQkJCQkJCS8vIHRoaXMgbWV0aG9kIGlzIGFscmVhZHkgb3ZlcnJpZGRlbiBvbiBhIHN1cGVyIGNsYXNzLCBjdXJyZW50IG1hdGNoIGlzIGltcG9zc2libGUKLQkJCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghbWV0aG9kLmlzQWJzdHJhY3QoKSAmJiAhdHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQkJCS8vIHN0b3JlIHRoZSBmYWN0IHRoYXQgdGhlIG1ldGhvZCBpcyBvdmVycmlkZGVuCi0JCQkJCQkJCWxldmVsIHw9IE9WRVJSSURERU5fTUVUSE9EX0ZMQVZPUjsKLQkJCQkJCQl9Ci0JCQkJCQl9CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBnZXRNZXRob2RCaW5kaW5nKHR5cGUsIG1ldGhvZE5hbWUsIGFyZ3VtZW50VHlwZXMpOworCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgeyAvLyBvbmUgbWV0aG9kIG1hdGNoIGluIGhpZXJhcmNoeQorCQkJCQlpZiAoKGxldmVsICYgT1ZFUlJJRERFTl9NRVRIT0RfRkxBVk9SKSAhPSAwKSB7CisJCQkJCQkvLyB0aGlzIG1ldGhvZCBpcyBhbHJlYWR5IG92ZXJyaWRkZW4gb24gYSBzdXBlciBjbGFzcywgY3VycmVudCBtYXRjaCBpcyBpbXBvc3NpYmxlCisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJfQorCQkJCQlpZiAoIW1ldGhvZC5pc0Fic3RyYWN0KCkgJiYgIXR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCQkJLy8gc3RvcmUgdGhlIGZhY3QgdGhhdCB0aGUgbWV0aG9kIGlzIG92ZXJyaWRkZW4KKwkJCQkJCWxldmVsIHw9IE9WRVJSSURERU5fTUVUSE9EX0ZMQVZPUjsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTcwOCw3ICs3MTIsNyBAQAogCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsKIAlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJbGV2ZWwgPSByZXNvbHZlTGV2ZWxBc1N1YnR5cGUocXVhbGlmaWVkUGF0dGVybiwgaW50ZXJmYWNlc1tpXSwgbnVsbCk7CisJCWxldmVsID0gcmVzb2x2ZUxldmVsQXNTdWJ0eXBlKHNpbXBsZVBhdHRlcm4sIHF1YWxpZmllZFBhdHRlcm4sIGludGVyZmFjZXNbaV0sIG1ldGhvZE5hbWUsIG51bGwpOwogCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgewogCQkJaWYgKCF0eXBlLmlzQWJzdHJhY3QoKSAmJiAhdHlwZS5pc0ludGVyZmFjZSgpKSB7IC8vIGlmIGNvbmNyZXRlIGNsYXNzLCB0aGVuIG1ldGhvZCBpcyBvdmVycmlkZGVuCiAJCQkJbGV2ZWwgfD0gT1ZFUlJJRERFTl9NRVRIT0RfRkxBVk9SOwpAQCAtNzUyLDcgKzc1Niw3IEBACiAKIAkvLyBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhbiBpbnRlcmZhY2UgdGhlbiBhIGNvbW1vbiBzdXBlciBpbnRlcmZhY2UgbWF5IGJlIGZvdW5kCiAJLy8gaW4gYSBwYXJhbGxlbCBicmFuY2ggb2YgdGhlIHN1cGVyIGhpZXJhcmNoeSwgc28gd2UgbmVlZCB0byB2ZXJpZnkgYWxsIHN1cGVyIGludGVyZmFjZXMuCi0JLy8gSWYgaXQncyBhIGNsYXNzIHRoZW4gdGhlcmUncyBvbmx5IG9uZSBwb3NzaWJsZSBicmFuY2ggZm9yIHRoZSBoaWVyYXJjaHkgYW5kIAorCS8vIElmIGl0J3MgYSBjbGFzcyB0aGVuIHRoZXJlJ3Mgb25seSBvbmUgcG9zc2libGUgYnJhbmNoIGZvciB0aGUgaGllcmFyY2h5IGFuZAogCS8vIHRoaXMgYnJhbmNoIGhhcyBiZWVuIGFscmVhZHkgdmVyaWZpZWQgYnkgdGhlIHRlc3QgYWJvdmUKIAlpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RQYXR0ZXJuLmphdmEKaW5kZXggOTQ3MzM4Ny4uMGNhMDJjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTQgKzE0LDE1IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgTWV0aG9kUGF0dGVybiBleHRlbmRzIEphdmFTZWFyY2hQYXR0ZXJuIHsKIAotcHJvdGVjdGVkIGJvb2xlYW4gZmluZERlY2xhcmF0aW9uczsKLXByb3RlY3RlZCBib29sZWFuIGZpbmRSZWZlcmVuY2VzOworcHJvdGVjdGVkIGJvb2xlYW4gZmluZERlY2xhcmF0aW9ucyA9IHRydWU7Citwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kUmVmZXJlbmNlcyA9IHRydWU7CiAKIHB1YmxpYyBjaGFyW10gc2VsZWN0b3I7CiAKQEAgLTQxLDcgKzQyLDYgQEAKIAogLy8gU2lnbmF0dXJlcyBhbmQgYXJndW1lbnRzIGZvciBnZW5lcmljIHNlYXJjaAogY2hhcltdW10gcmV0dXJuVHlwZVNpZ25hdHVyZXM7Ci1jaGFyW11bXVtdIHJldHVyblR5cGVBcmd1bWVudHM7CiBjaGFyW11bXVtdIHBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlczsKIGNoYXJbXVtdW11bXSBwYXJhbWV0ZXJzVHlwZUFyZ3VtZW50czsKIGJvb2xlYW4gbWV0aG9kUGFyYW1ldGVycyA9IGZhbHNlOwpAQCAtNTEsNiArNTEsMTIgQEAKIHByb3RlY3RlZCBzdGF0aWMgY2hhcltdW10gUkVGX0FORF9ERUNMX0NBVEVHT1JJRVMgPSB7IE1FVEhPRF9SRUYsIE1FVEhPRF9ERUNMIH07CiBwcm90ZWN0ZWQgc3RhdGljIGNoYXJbXVtdIERFQ0xfQ0FURUdPUklFUyA9IHsgTUVUSE9EX0RFQ0wgfTsKIAorcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRklORV9HUkFJTl9NQVNLID0KKwlJSmF2YVNlYXJjaENvbnN0YW50cy5TVVBFUl9SRUZFUkVOQ0UgfAorCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlFVQUxJRklFRF9SRUZFUkVOQ0UgfAorCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRISVNfUkVGRVJFTkNFIHwKKwlJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMSUNJVF9USElTX1JFRkVSRU5DRTsKKwogLyoqCiAgKiBNZXRob2QgZW50cmllcyBhcmUgZW5jb2RlZCBhcyBzZWxlY3RvciAnLycgQXJpdHk6CiAgKiBlLmcuICdmb28vMCcKQEAgLTY2LDcyICs3Miw4MiBAQAogCXN1cGVyKE1FVEhPRF9QQVRURVJOLCBtYXRjaFJ1bGUpOwogfQogcHVibGljIE1ldGhvZFBhdHRlcm4oCi0JYm9vbGVhbiBmaW5kRGVjbGFyYXRpb25zLAotCWJvb2xlYW4gZmluZFJlZmVyZW5jZXMsCi0JY2hhcltdIHNlbGVjdG9yLCAKKwljaGFyW10gc2VsZWN0b3IsCiAJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24sCi0JY2hhcltdIGRlY2xhcmluZ1NpbXBsZU5hbWUsCQotCWNoYXJbXSByZXR1cm5RdWFsaWZpY2F0aW9uLCAKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwKKwljaGFyW10gcmV0dXJuUXVhbGlmaWNhdGlvbiwKIAljaGFyW10gcmV0dXJuU2ltcGxlTmFtZSwKLQljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsCiAJY2hhcltdW10gcGFyYW1ldGVyU2ltcGxlTmFtZXMsCiAJSVR5cGUgZGVjbGFyaW5nVHlwZSwKKwlpbnQgbGltaXRUbywKIAlpbnQgbWF0Y2hSdWxlKSB7CiAKIAl0aGlzKG1hdGNoUnVsZSk7CiAKLQl0aGlzLmZpbmREZWNsYXJhdGlvbnMgPSBmaW5kRGVjbGFyYXRpb25zOwotCXRoaXMuZmluZFJlZmVyZW5jZXMgPSBmaW5kUmVmZXJlbmNlczsKKwl0aGlzLmZpbmVHcmFpbiA9IGxpbWl0VG8gJiBGSU5FX0dSQUlOX01BU0s7CisgICAgaWYgKHRoaXMuZmluZUdyYWluID09IDApIHsKKwkJc3dpdGNoIChsaW1pdFRvICYgMHhGKSB7CisJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQkJdGhpcy5maW5kUmVmZXJlbmNlcyA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKKwkJCQl0aGlzLmZpbmREZWNsYXJhdGlvbnMgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCQlicmVhazsKKwkJfQorICAgIH0gZWxzZSB7CisJCXRoaXMuZmluZERlY2xhcmF0aW9ucyA9IGZhbHNlOworICAgIH0KIAotCXRoaXMuc2VsZWN0b3IgPSAoaXNDYXNlU2Vuc2l0aXZlKCkgfHwgaXNDYW1lbENhc2UoKSkgID8gc2VsZWN0b3IgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNlbGVjdG9yKTsKLQl0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUoKSA/IGRlY2xhcmluZ1F1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pOwotCXRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7Ci0JdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyByZXR1cm5RdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShyZXR1cm5RdWFsaWZpY2F0aW9uKTsKLQl0aGlzLnJldHVyblNpbXBsZU5hbWUgPSBpc0Nhc2VTZW5zaXRpdmUoKSA/IHJldHVyblNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHJldHVyblNpbXBsZU5hbWUpOworCXRoaXMuc2VsZWN0b3IgPSAodGhpcy5pc0Nhc2VTZW5zaXRpdmUgfHwgdGhpcy5pc0NhbWVsQ2FzZSkgPyBzZWxlY3RvciA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc2VsZWN0b3IpOworCXRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPyBkZWNsYXJpbmdTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdTaW1wbGVOYW1lKTsKKwl0aGlzLnJldHVyblF1YWxpZmljYXRpb24gPSB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA/IHJldHVyblF1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHJldHVyblF1YWxpZmljYXRpb24pOworCXRoaXMucmV0dXJuU2ltcGxlTmFtZSA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gcmV0dXJuU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocmV0dXJuU2ltcGxlTmFtZSk7CiAJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzICE9IG51bGwpIHsKIAkJdGhpcy5wYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsKIAkJdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucyA9IG5ldyBjaGFyW3RoaXMucGFyYW1ldGVyQ291bnRdW107CiAJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPSBuZXcgY2hhclt0aGlzLnBhcmFtZXRlckNvdW50XVtdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVyQ291bnQ7IGkrKykgewotCQkJdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldKTsKLQkJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0gPSBpc0Nhc2VTZW5zaXRpdmUoKSA/IHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSk7CisJCQl0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldID0gdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPyBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0pOworCQkJdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gcGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsKIAkJfQogCX0gZWxzZSB7CiAJCXRoaXMucGFyYW1ldGVyQ291bnQgPSAtMTsKIAl9CiAJdGhpcy5kZWNsYXJpbmdUeXBlID0gZGVjbGFyaW5nVHlwZTsKLQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlKCk7CisJdGhpcy5tdXN0UmVzb2x2ZSA9IG11c3RSZXNvbHZlKCk7CiB9CiAvKgogICogSW5zdGFuY2lhdGUgYSBtZXRob2QgcGF0dGVybiB3aXRoIHNpZ25hdHVyZXMgZm9yIGdlbmVyaWNzIHNlYXJjaAogICovCiBwdWJsaWMgTWV0aG9kUGF0dGVybigKLQlib29sZWFuIGZpbmREZWNsYXJhdGlvbnMsCi0JYm9vbGVhbiBmaW5kUmVmZXJlbmNlcywKLQljaGFyW10gc2VsZWN0b3IsIAorCWNoYXJbXSBzZWxlY3RvciwKIAljaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKLQljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwJCi0JY2hhcltdIHJldHVyblF1YWxpZmljYXRpb24sIAorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAorCWNoYXJbXSByZXR1cm5RdWFsaWZpY2F0aW9uLAogCWNoYXJbXSByZXR1cm5TaW1wbGVOYW1lLAogCVN0cmluZyByZXR1cm5TaWduYXR1cmUsCi0JY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zLAogCWNoYXJbXVtdIHBhcmFtZXRlclNpbXBsZU5hbWVzLAogCVN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMsCiAJSU1ldGhvZCBtZXRob2QsCisJaW50IGxpbWl0VG8sCiAJaW50IG1hdGNoUnVsZSkgewogCi0JdGhpcyhmaW5kRGVjbGFyYXRpb25zLAotCQlmaW5kUmVmZXJlbmNlcywKLQkJc2VsZWN0b3IsIAorCXRoaXMoc2VsZWN0b3IsCiAJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sCi0JCWRlY2xhcmluZ1NpbXBsZU5hbWUsCQotCQlyZXR1cm5RdWFsaWZpY2F0aW9uLCAKKwkJZGVjbGFyaW5nU2ltcGxlTmFtZSwKKwkJcmV0dXJuUXVhbGlmaWNhdGlvbiwKIAkJcmV0dXJuU2ltcGxlTmFtZSwKLQkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywKIAkJcGFyYW1ldGVyU2ltcGxlTmFtZXMsCiAJCW1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksCisJCWxpbWl0VG8sCiAJCW1hdGNoUnVsZSk7Ci0JCisKIAkvLyBTZXQgZmxhZ3MKIAl0cnkgewogCQl0aGlzLnZhcmFyZ3MgPSAobWV0aG9kLmdldEZsYWdzKCkgJiBGbGFncy5BY2NWYXJhcmdzKSAhPSAwOwpAQCAtMTQxLDEwNCArMTU3LDEwMCBAQAogCiAJLy8gR2V0IHVuaXF1ZSBrZXkgZm9yIHBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3JzCiAJU3RyaW5nIGdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlID0gbnVsbDsKLS8vCVN0cmluZyBnZW5lcmljU2lnbmF0dXJlID0gbnVsbDsKLQlTdHJpbmcga2V5OwotCWlmIChtZXRob2QuaXNSZXNvbHZlZCgpICYmIChuZXcgQmluZGluZ0tleShrZXkgPSBtZXRob2QuZ2V0S2V5KCkpKS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKLQkJZ2VuZXJpY0RlY2xhcmluZ1R5cGVTaWduYXR1cmUgPSBVdGlsLmdldERlY2xhcmluZ1R5cGVTaWduYXR1cmUoa2V5KTsKKwlpZiAobWV0aG9kLmlzUmVzb2x2ZWQoKSkgeworCQlTdHJpbmcga2V5ID0gbWV0aG9kLmdldEtleSgpOworCQlCaW5kaW5nS2V5IGJpbmRpbmdLZXkgPSBuZXcgQmluZGluZ0tleShrZXkpOworCQlpZiAoYmluZGluZ0tleS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKKwkJCWdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlID0gVXRpbC5nZXREZWNsYXJpbmdUeXBlU2lnbmF0dXJlKGtleSk7CisJCQkvLyBTdG9yZSB0eXBlIHNpZ25hdHVyZSBhbmQgYXJndW1lbnRzIGZvciBkZWNsYXJpbmcgdHlwZQorCQkJaWYgKGdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlICE9IG51bGwpIHsKKwkJCQkJdGhpcy50eXBlU2lnbmF0dXJlcyA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKGdlbmVyaWNEZWNsYXJpbmdUeXBlU2lnbmF0dXJlKTsKKwkJCQkJc2V0VHlwZUFyZ3VtZW50cyhVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModGhpcy50eXBlU2lnbmF0dXJlcykpOworCQkJfQorCQl9CiAJfSBlbHNlIHsKLQkJbWV0aG9kUGFyYW1ldGVycyA9IHRydWU7Ci0JfQotCi0JLy8gU3RvcmUgdHlwZSBzaWduYXR1cmUgYW5kIGFyZ3VtZW50cyBmb3IgZGVjbGFyaW5nIHR5cGUKLQlpZiAoZ2VuZXJpY0RlY2xhcmluZ1R5cGVTaWduYXR1cmUgIT0gbnVsbCkgewotCQl0aGlzLnR5cGVTaWduYXR1cmVzID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUoZ2VuZXJpY0RlY2xhcmluZ1R5cGVTaWduYXR1cmUpOwotCQlzZXRUeXBlQXJndW1lbnRzKFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyh0aGlzLnR5cGVTaWduYXR1cmVzKSk7Ci0JfSBlbHNlIHsKLQkJc3RvcmVUeXBlU2lnbmF0dXJlc0FuZEFyZ3VtZW50cyhkZWNsYXJpbmdUeXBlKTsKKwkJdGhpcy5tZXRob2RQYXJhbWV0ZXJzID0gdHJ1ZTsKKwkJc3RvcmVUeXBlU2lnbmF0dXJlc0FuZEFyZ3VtZW50cyh0aGlzLmRlY2xhcmluZ1R5cGUpOwogCX0KIAogCS8vIFN0b3JlIHR5cGUgc2lnbmF0dXJlcyBhbmQgYXJndW1lbnRzIGZvciByZXR1cm4gdHlwZQogCWlmIChyZXR1cm5TaWduYXR1cmUgIT0gbnVsbCkgewotCQlyZXR1cm5UeXBlU2lnbmF0dXJlcyA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKHJldHVyblNpZ25hdHVyZSk7Ci0JCXJldHVyblR5cGVBcmd1bWVudHMgPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHMocmV0dXJuVHlwZVNpZ25hdHVyZXMpOworCQl0aGlzLnJldHVyblR5cGVTaWduYXR1cmVzID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUocmV0dXJuU2lnbmF0dXJlKTsKIAl9CiAKIAkvLyBTdG9yZSB0eXBlIHNpZ25hdHVyZXMgYW5kIGFyZ3VtZW50cyBmb3IgbWV0aG9kIHBhcmFtZXRlcnMgdHlwZQogCWlmIChwYXJhbWV0ZXJTaWduYXR1cmVzICE9IG51bGwpIHsKIAkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclNpZ25hdHVyZXMubGVuZ3RoOwogCQlpZiAobGVuZ3RoID4gMCkgewotCQkJcGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdW107Ci0JCQlwYXJhbWV0ZXJzVHlwZUFyZ3VtZW50cyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdW107CisJCQl0aGlzLnBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOworCQkJdGhpcy5wYXJhbWV0ZXJzVHlwZUFyZ3VtZW50cyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdW107CiAJCQlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXNbaV0gPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZShwYXJhbWV0ZXJTaWduYXR1cmVzW2ldKTsKLQkJCQlwYXJhbWV0ZXJzVHlwZUFyZ3VtZW50c1tpXSA9IFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyhwYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXNbaV0pOworCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUocGFyYW1ldGVyU2lnbmF0dXJlc1tpXSk7CisJCQkJdGhpcy5wYXJhbWV0ZXJzVHlwZUFyZ3VtZW50c1tpXSA9IFV0aWwuZ2V0QWxsVHlwZUFyZ3VtZW50cyh0aGlzLnBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlc1tpXSk7CiAJCQl9CiAJCX0KIAl9CiAKIAkvLyBTdG9yZSB0eXBlIHNpZ25hdHVyZXMgYW5kIGFyZ3VtZW50cyBmb3IgbWV0aG9kCi0JbWV0aG9kQXJndW1lbnRzID0gZXh0cmFjdE1ldGhvZEFyZ3VtZW50cyhtZXRob2QpOwotCWlmIChoYXNNZXRob2RBcmd1bWVudHMoKSkgICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gdHJ1ZTsKKwl0aGlzLm1ldGhvZEFyZ3VtZW50cyA9IGV4dHJhY3RNZXRob2RBcmd1bWVudHMobWV0aG9kKTsKKwlpZiAoaGFzTWV0aG9kQXJndW1lbnRzKCkpICB0aGlzLm11c3RSZXNvbHZlID0gdHJ1ZTsKIH0KIC8qCiAgKiBJbnN0YW5jaWF0ZSBhIG1ldGhvZCBwYXR0ZXJuIHdpdGggc2lnbmF0dXJlcyBmb3IgZ2VuZXJpY3Mgc2VhcmNoCiAgKi8KIHB1YmxpYyBNZXRob2RQYXR0ZXJuKAotCWJvb2xlYW4gZmluZERlY2xhcmF0aW9ucywKLQlib29sZWFuIGZpbmRSZWZlcmVuY2VzLAotCWNoYXJbXSBzZWxlY3RvciwgCisJY2hhcltdIHNlbGVjdG9yLAogCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAotCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwKIAlTdHJpbmcgZGVjbGFyaW5nU2lnbmF0dXJlLAotCWNoYXJbXSByZXR1cm5RdWFsaWZpY2F0aW9uLCAKKwljaGFyW10gcmV0dXJuUXVhbGlmaWNhdGlvbiwKIAljaGFyW10gcmV0dXJuU2ltcGxlTmFtZSwKIAlTdHJpbmcgcmV0dXJuU2lnbmF0dXJlLAotCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywKIAljaGFyW11bXSBwYXJhbWV0ZXJTaW1wbGVOYW1lcywKIAlTdHJpbmdbXSBwYXJhbWV0ZXJTaWduYXR1cmVzLAogCWNoYXJbXVtdIGFyZ3VtZW50cywKKwlpbnQgbGltaXRUbywKIAlpbnQgbWF0Y2hSdWxlKSB7CiAKLQl0aGlzKGZpbmREZWNsYXJhdGlvbnMsCi0JCWZpbmRSZWZlcmVuY2VzLAotCQlzZWxlY3RvciwgCisJdGhpcyhzZWxlY3RvciwKIAkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKLQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwJCi0JCXJldHVyblF1YWxpZmljYXRpb24sIAorCQlkZWNsYXJpbmdTaW1wbGVOYW1lLAorCQlyZXR1cm5RdWFsaWZpY2F0aW9uLAogCQlyZXR1cm5TaW1wbGVOYW1lLAotCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCXBhcmFtZXRlclF1YWxpZmljYXRpb25zLAogCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcywKIAkJbnVsbCwKKwkJbGltaXRUbywKIAkJbWF0Y2hSdWxlKTsKIAogCS8vIFN0b3JlIHR5cGUgc2lnbmF0dXJlIGFuZCBhcmd1bWVudHMgZm9yIGRlY2xhcmluZyB0eXBlCiAJaWYgKGRlY2xhcmluZ1NpZ25hdHVyZSAhPSBudWxsKSB7Ci0JCXR5cGVTaWduYXR1cmVzID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUoZGVjbGFyaW5nU2lnbmF0dXJlKTsKLQkJc2V0VHlwZUFyZ3VtZW50cyhVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModHlwZVNpZ25hdHVyZXMpKTsKKwkJdGhpcy50eXBlU2lnbmF0dXJlcyA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKGRlY2xhcmluZ1NpZ25hdHVyZSk7CisJCXNldFR5cGVBcmd1bWVudHMoVXRpbC5nZXRBbGxUeXBlQXJndW1lbnRzKHRoaXMudHlwZVNpZ25hdHVyZXMpKTsKIAl9CiAKIAkvLyBTdG9yZSB0eXBlIHNpZ25hdHVyZXMgYW5kIGFyZ3VtZW50cyBmb3IgcmV0dXJuIHR5cGUKIAlpZiAocmV0dXJuU2lnbmF0dXJlICE9IG51bGwpIHsKLQkJcmV0dXJuVHlwZVNpZ25hdHVyZXMgPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZShyZXR1cm5TaWduYXR1cmUpOwotCQlyZXR1cm5UeXBlQXJndW1lbnRzID0gVXRpbC5nZXRBbGxUeXBlQXJndW1lbnRzKHJldHVyblR5cGVTaWduYXR1cmVzKTsKKwkJdGhpcy5yZXR1cm5UeXBlU2lnbmF0dXJlcyA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKHJldHVyblNpZ25hdHVyZSk7CiAJfQogCiAJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIHR5cGUKIAlpZiAocGFyYW1ldGVyU2lnbmF0dXJlcyAhPSBudWxsKSB7CiAJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJTaWduYXR1cmVzLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCXBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlcyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOwotCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOworCQkJdGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXMgPSBuZXcgY2hhcltsZW5ndGhdW11bXTsKKwkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHMgPSBuZXcgY2hhcltsZW5ndGhdW11bXVtdOwogCQkJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldID0gVXRpbC5zcGxpdFR5cGVMZXZlbHNTaWduYXR1cmUocGFyYW1ldGVyU2lnbmF0dXJlc1tpXSk7Ci0JCQkJcGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHMocGFyYW1ldGVyc1R5cGVTaWduYXR1cmVzW2ldKTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNUeXBlU2lnbmF0dXJlc1tpXSA9IFV0aWwuc3BsaXRUeXBlTGV2ZWxzU2lnbmF0dXJlKHBhcmFtZXRlclNpZ25hdHVyZXNbaV0pOworCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVBcmd1bWVudHNbaV0gPSBVdGlsLmdldEFsbFR5cGVBcmd1bWVudHModGhpcy5wYXJhbWV0ZXJzVHlwZVNpZ25hdHVyZXNbaV0pOwogCQkJfQogCQl9CiAJfQogCiAJLy8gU3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMgZm9yIG1ldGhvZAotCW1ldGhvZEFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLQlpZiAoaGFzTWV0aG9kQXJndW1lbnRzKCkpICAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IHRydWU7CisJdGhpcy5tZXRob2RBcmd1bWVudHMgPSBhcmd1bWVudHM7CisJaWYgKGhhc01ldGhvZEFyZ3VtZW50cygpKSAgdGhpcy5tdXN0UmVzb2x2ZSA9IHRydWU7CiB9CiBwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEtleShjaGFyW10ga2V5KSB7CiAJaW50IGxhc3QgPSBrZXkubGVuZ3RoIC0gMTsKQEAgLTI2OSwxMiArMjgxLDEyIEBACiAJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwogfQogYm9vbGVhbiBoYXNNZXRob2RBcmd1bWVudHMoKSB7Ci0JcmV0dXJuIG1ldGhvZEFyZ3VtZW50cyAhPSBudWxsICYmIG1ldGhvZEFyZ3VtZW50cy5sZW5ndGggPiAwOworCXJldHVybiB0aGlzLm1ldGhvZEFyZ3VtZW50cyAhPSBudWxsICYmIHRoaXMubWV0aG9kQXJndW1lbnRzLmxlbmd0aCA+IDA7CiB9CiBib29sZWFuIGhhc01ldGhvZFBhcmFtZXRlcnMoKSB7Ci0JcmV0dXJuIG1ldGhvZFBhcmFtZXRlcnM7CisJcmV0dXJuIHRoaXMubWV0aG9kUGFyYW1ldGVyczsKIH0KLWJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHsKK3B1YmxpYyBib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2goKSB7CiAJcmV0dXJuIHRoaXMuZmluZFJlZmVyZW5jZXM7CiB9CiBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzRGVjb2RlZEtleShTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuKSB7CkBAIC0yODQsMzEgKzI5NiwzMCBAQAogCQkmJiBtYXRjaGVzTmFtZSh0aGlzLnNlbGVjdG9yLCBwYXR0ZXJuLnNlbGVjdG9yKTsKIH0KIC8qKgotICogUmV0dXJucyB3aGV0aGVyIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG1lc3NhZ2Ugc2VuZCBtdXN0IGJlIHJlc29sdmVkIHRvIAorICogUmV0dXJucyB3aGV0aGVyIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG1lc3NhZ2Ugc2VuZCBtdXN0IGJlIHJlc29sdmVkIHRvCiAgKiBmaW5kIG91dCBpZiB0aGlzIG1ldGhvZCBwYXR0ZXJuIG1hdGNoZXMgaXQuCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIG11c3RSZXNvbHZlKCkgewogCS8vIGRlY2xhcmluZyB0eXBlCiAJLy8gSWYgZGVjbGFyaW5nIHR5cGUgaXMgc3BlY2lmaWVkIC0gZXZlbiB3aXRoIHNpbXBsZSBuYW1lIC0gYWx3YXlzIHJlc29sdmVzCi0JaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCB8fCBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIHJldHVybiB0cnVlOworCWlmICh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCB8fCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgcmV0dXJuIHRydWU7CiAKIAkvLyByZXR1cm4gdHlwZQogCS8vIElmIHJldHVybiB0eXBlIGlzIHNwZWNpZmllZCAtIGV2ZW4gd2l0aCBzaW1wbGUgbmFtZSAtIGFsd2F5cyByZXNvbHZlcwotCWlmIChyZXR1cm5TaW1wbGVOYW1lICE9IG51bGwgfHwgcmV0dXJuUXVhbGlmaWNhdGlvbiAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKwlpZiAodGhpcy5yZXR1cm5TaW1wbGVOYW1lICE9IG51bGwgfHwgdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uICE9IG51bGwpIHJldHVybiB0cnVlOwogCiAJLy8gcGFyYW1ldGVyIHR5cGVzCi0JaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzICE9IG51bGwpCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykKLQkJCWlmIChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKwlpZiAodGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyAhPSBudWxsKQorCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykKKwkJCWlmICh0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIHJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KLUVudHJ5UmVzdWx0W10gcXVlcnlJbihJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKK3B1YmxpYyBFbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJY2hhcltdIGtleSA9IHRoaXMuc2VsZWN0b3I7IC8vIGNhbiBiZSBudWxsCiAJaW50IG1hdGNoUnVsZSA9IGdldE1hdGNoUnVsZSgpOwogCiAJc3dpdGNoKGdldE1hdGNoTW9kZSgpKSB7CiAJCWNhc2UgUl9FWEFDVF9NQVRDSCA6Ci0JCQlpZiAodGhpcy5pc0NhbWVsQ2FzZSkgYnJlYWs7CiAJCQlpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyQ291bnQgPj0gMCAmJiAhdGhpcy52YXJhcmdzKQogCQkJCWtleSA9IGNyZWF0ZUluZGV4S2V5KHRoaXMuc2VsZWN0b3IsIHRoaXMucGFyYW1ldGVyQ291bnQpOwogCQkJZWxzZSB7IC8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHNlbGVjdG9yCkBAIC0zMjksNiArMzQwLDEwIEBACiAJCWNhc2UgUl9SRUdFWFBfTUFUQ0ggOgogCQkJLy8gVE9ETyAoZnJlZGVyaWMpIGltcGxlbWVudCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2gKIAkJCWJyZWFrOworCQljYXNlIFJfQ0FNRUxDQVNFX01BVENIOgorCQljYXNlIFJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSDoKKwkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHNlbGVjdG9yCisJCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gaW5kZXgucXVlcnkoZ2V0SW5kZXhDYXRlZ29yaWVzKCksIGtleSwgbWF0Y2hSdWxlKTsgLy8gbWF0Y2ggcnVsZSBpcyBpcnJlbGV2YW50IHdoZW4gdGhlIGtleSBpcyBudWxsCkBAIC0zNDEsMzUgKzM1NiwzNSBAQAogCX0gZWxzZSB7CiAJCW91dHB1dC5hcHBlbmQoIk1ldGhvZFJlZmVyZW5jZVBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJfQotCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpCi0JCW91dHB1dC5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7Ci0JaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCi0JCW91dHB1dC5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSkuYXBwZW5kKCcuJyk7Ci0JZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKQorCWlmICh0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOworCWlmICh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUpLmFwcGVuZCgnLicpOworCWVsc2UgaWYgKHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKQogCQlvdXRwdXQuYXBwZW5kKCIqLiIpOyAvLyROT04tTkxTLTEkCiAKLQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkKLQkJb3V0cHV0LmFwcGVuZChzZWxlY3Rvcik7CisJaWYgKHRoaXMuc2VsZWN0b3IgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnNlbGVjdG9yKTsKIAllbHNlCiAJCW91dHB1dC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAogCW91dHB1dC5hcHBlbmQoJygnKTsKLQlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgeworCWlmICh0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwpIHsKIAkJb3V0cHV0LmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKIAl9IGVsc2UgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCWlmIChpID4gMCkgb3V0cHV0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIG91dHB1dC5hcHBlbmQocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0pLmFwcGVuZCgnLicpOwotCQkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID09IG51bGwpIG91dHB1dC5hcHBlbmQoJyonKTsgZWxzZSBvdXRwdXQuYXBwZW5kKHBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsKKwkJCWlmICh0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldICE9IG51bGwpIG91dHB1dC5hcHBlbmQodGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7CisJCQlpZiAodGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9PSBudWxsKSBvdXRwdXQuYXBwZW5kKCcqJyk7IGVsc2Ugb3V0cHV0LmFwcGVuZCh0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzW2ldKTsKIAkJfQogCX0KIAlvdXRwdXQuYXBwZW5kKCcpJyk7Ci0JaWYgKHJldHVyblF1YWxpZmljYXRpb24gIT0gbnVsbCkgCi0JCW91dHB1dC5hcHBlbmQoIiAtLT4gIikuYXBwZW5kKHJldHVyblF1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOyAvLyROT04tTkxTLTEkCi0JZWxzZSBpZiAocmV0dXJuU2ltcGxlTmFtZSAhPSBudWxsKQorCWlmICh0aGlzLnJldHVyblF1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCgiIC0tPiAiKS5hcHBlbmQodGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uKS5hcHBlbmQoJy4nKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UgaWYgKHRoaXMucmV0dXJuU2ltcGxlTmFtZSAhPSBudWxsKQogCQlvdXRwdXQuYXBwZW5kKCIgLS0+ICIpOyAvLyROT04tTkxTLTEkCi0JaWYgKHJldHVyblNpbXBsZU5hbWUgIT0gbnVsbCkgCi0JCW91dHB1dC5hcHBlbmQocmV0dXJuU2ltcGxlTmFtZSk7Ci0JZWxzZSBpZiAocmV0dXJuUXVhbGlmaWNhdGlvbiAhPSBudWxsKQorCWlmICh0aGlzLnJldHVyblNpbXBsZU5hbWUgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnJldHVyblNpbXBsZU5hbWUpOworCWVsc2UgaWYgKHRoaXMucmV0dXJuUXVhbGlmaWNhdGlvbiAhPSBudWxsKQogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gc3VwZXIucHJpbnQob3V0cHV0KTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL011bHRpVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IDMwNmVmMjguLjkzYzNjOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NdWx0aVR5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMSw3ICsyMSw3IEBACiBwdWJsaWMgY2hhcltdW10gc2ltcGxlTmFtZXM7CiBwdWJsaWMgY2hhcltdW10gcXVhbGlmaWNhdGlvbnM7CiAKLS8vIHNldCB0byBDTEFTU19TVUZGSVggZm9yIG9ubHkgbWF0Y2hpbmcgY2xhc3NlcyAKKy8vIHNldCB0byBDTEFTU19TVUZGSVggZm9yIG9ubHkgbWF0Y2hpbmcgY2xhc3NlcwogLy8gc2V0IHRvIElOVEVSRkFDRV9TVUZGSVggZm9yIG9ubHkgbWF0Y2hpbmcgaW50ZXJmYWNlcwogLy8gc2V0IHRvIEVOVU1fU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGVudW1zCiAvLyBzZXQgdG8gQU5OT1RBVElPTl9UWVBFX1NVRkZJWCBmb3Igb25seSBtYXRjaGluZyBhbm5vdGF0aW9uIHR5cGVzCkBAIC0zOCw3ICszOCw3IEBACiAKIAl0aGlzKG1hdGNoUnVsZSk7CiAKLQlpZiAoaXNDYXNlU2Vuc2l0aXZlKCkgfHwgcXVhbGlmaWNhdGlvbnMgPT0gbnVsbCkgeworCWlmICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCBxdWFsaWZpY2F0aW9ucyA9PSBudWxsKSB7CiAJCXRoaXMucXVhbGlmaWNhdGlvbnMgPSBxdWFsaWZpY2F0aW9uczsKIAl9IGVsc2UgewogCQlpbnQgbGVuZ3RoID0gcXVhbGlmaWNhdGlvbnMubGVuZ3RoOwpAQCAtNDgsNyArNDgsNyBAQAogCX0KIAkvLyBudWxsIHNpbXBsZSBuYW1lcyBhcmUgYWxsb3dlZCAoc2hvdWxkIHJldHVybiBhbGwgbmFtZXMpCiAJaWYgKHNpbXBsZU5hbWVzICE9IG51bGwpIHsKLQkJaWYgKChpc0Nhc2VTZW5zaXRpdmUoKSB8fCBpc0NhbWVsQ2FzZSgpKSApIHsKKwkJaWYgKHRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IHRoaXMuaXNDYW1lbENhc2UpIHsKIAkJCXRoaXMuc2ltcGxlTmFtZXMgPSBzaW1wbGVOYW1lczsKIAkJfSBlbHNlIHsKIAkJCWludCBsZW5ndGggPSBzaW1wbGVOYW1lcy5sZW5ndGg7CkBAIC01OSw3ICs1OSw3IEBACiAJfQogCXRoaXMudHlwZVN1ZmZpeCA9IHR5cGVTdWZmaXg7CiAKLQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IHR5cGVTdWZmaXggIT0gVFlQRV9TVUZGSVg7IC8vIG9ubHkgdXNlZCB0byByZXBvcnQgdHlwZSBkZWNsYXJhdGlvbnMsIG5vdCB0aGVpciBwb3NpdGlvbnMKKwl0aGlzLm11c3RSZXNvbHZlID0gdHlwZVN1ZmZpeCAhPSBUWVBFX1NVRkZJWDsgLy8gb25seSB1c2VkIHRvIHJlcG9ydCB0eXBlIGRlY2xhcmF0aW9ucywgbm90IHRoZWlyIHBvc2l0aW9ucwogfQogTXVsdGlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuKGludCBtYXRjaFJ1bGUpIHsKIAlzdXBlcihUWVBFX0RFQ0xfUEFUVEVSTiwgbWF0Y2hSdWxlKTsKQEAgLTcyLDkgKzcyLDkgQEAKIH0KIHB1YmxpYyBib29sZWFuIG1hdGNoZXNEZWNvZGVkS2V5KFNlYXJjaFBhdHRlcm4gZGVjb2RlZFBhdHRlcm4pIHsKIAlRdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuIHBhdHRlcm4gPSAoUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybikgZGVjb2RlZFBhdHRlcm47Ci0JCisKIAkvLyBjaGVjayB0eXBlIHN1ZmZpeAotCWlmICh0aGlzLnR5cGVTdWZmaXggIT0gcGF0dGVybi50eXBlU3VmZml4ICYmIHR5cGVTdWZmaXggIT0gVFlQRV9TVUZGSVgpIHsKKwlpZiAodGhpcy50eXBlU3VmZml4ICE9IHBhdHRlcm4udHlwZVN1ZmZpeCAmJiB0aGlzLnR5cGVTdWZmaXggIT0gVFlQRV9TVUZGSVgpIHsKIAkJaWYgKCFtYXRjaERpZmZlcmVudFR5cGVTdWZmaXhlcyh0aGlzLnR5cGVTdWZmaXgsIHBhdHRlcm4udHlwZVN1ZmZpeCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCQlicmVhazsKIAlyZXR1cm4gY291bnQgPCBtYXg7CiB9Ci1FbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CitwdWJsaWMgRW50cnlSZXN1bHRbXSBxdWVyeUluKEluZGV4IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmICh0aGlzLnNpbXBsZU5hbWVzID09IG51bGwpIHsKIAkJLy8gaWYgbm8gc2ltcGxlIG5hbWVzIHRoZW4gcmV0dXJuIGFsbCBwb3NzaWJsZSBvbmVzIGZyb20gaW5kZXgKIAkJcmV0dXJuIGluZGV4LnF1ZXJ5KGdldEluZGV4Q2F0ZWdvcmllcygpLCBudWxsLCAtMSk7IC8vIG1hdGNoIHJ1bGUgaXMgaXJyZWxldmFudCB3aGVuIHRoZSBrZXkgaXMgbnVsbApAQCAtMTIyLDEyICsxMjIsMTAgQEAKIAkJCQkvLyBkbyBhIHByZWZpeCBxdWVyeSB3aXRoIHRoZSBzaW1wbGVOYW1lCiAJCQkJYnJlYWs7CiAJCQljYXNlIFJfRVhBQ1RfTUFUQ0ggOgotCQkJCWlmICghdGhpcy5pc0NhbWVsQ2FzZSkgewotCQkJCQkvLyBkbyBhIHByZWZpeCBxdWVyeSB3aXRoIHRoZSBzaW1wbGVOYW1lCi0JCQkJCW1hdGNoUnVsZSAmPSB+Ul9FWEFDVF9NQVRDSDsKLQkJCQkJbWF0Y2hSdWxlIHw9IFJfUFJFRklYX01BVENIOwotCQkJCQlrZXkgPSBDaGFyT3BlcmF0aW9uLmFwcGVuZChrZXksIFNFUEFSQVRPUik7Ci0JCQkJfQorCQkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHNpbXBsZU5hbWUKKwkJCQltYXRjaFJ1bGUgJj0gflJfRVhBQ1RfTUFUQ0g7CisJCQkJbWF0Y2hSdWxlIHw9IFJfUFJFRklYX01BVENIOworCQkJCWtleSA9IENoYXJPcGVyYXRpb24uYXBwZW5kKGtleSwgU0VQQVJBVE9SKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgUl9QQVRURVJOX01BVENIIDoKIAkJCQlpZiAoa2V5W2tleS5sZW5ndGggLSAxXSAhPSAnKicpCkBAIC0xMzYsNiArMTM0LDEwIEBACiAJCQljYXNlIFJfUkVHRVhQX01BVENIIDoKIAkJCQkvLyBUT0RPIChmcmVkZXJpYykgaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAogCQkJCWJyZWFrOworCQkJY2FzZSBSX0NBTUVMQ0FTRV9NQVRDSDoKKwkJCWNhc2UgUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOgorCQkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHNpbXBsZU5hbWUKKwkJCQlicmVhazsKIAkJfQogCiAJCUVudHJ5UmVzdWx0W10gZW50cmllcyA9IGluZGV4LnF1ZXJ5KGdldEluZGV4Q2F0ZWdvcmllcygpLCBrZXksIG1hdGNoUnVsZSk7IC8vIG1hdGNoIHJ1bGUgaXMgaXJyZWxldmFudCB3aGVuIHRoZSBrZXkgaXMgbnVsbApAQCAtMTg1LDIwICsxODcsMjAgQEAKIAkJCW91dHB1dC5hcHBlbmQoIk11bHRpVHlwZURlY2xhcmF0aW9uUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKIAkJCWJyZWFrOwogCX0KLQlpZiAocXVhbGlmaWNhdGlvbnMgIT0gbnVsbCkgeworCWlmICh0aGlzLnF1YWxpZmljYXRpb25zICE9IG51bGwpIHsKIAkJb3V0cHV0LmFwcGVuZCgicXVhbGlmaWNhdGlvbnM6IDwiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHF1YWxpZmljYXRpb25zLmxlbmd0aDsgaSsrKXsKLQkJCW91dHB1dC5hcHBlbmQocXVhbGlmaWNhdGlvbnNbaV0pOwotCQkJaWYgKGkgPCBxdWFsaWZpY2F0aW9ucy5sZW5ndGggLSAxKQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucXVhbGlmaWNhdGlvbnMubGVuZ3RoOyBpKyspeworCQkJb3V0cHV0LmFwcGVuZCh0aGlzLnF1YWxpZmljYXRpb25zW2ldKTsKKwkJCWlmIChpIDwgdGhpcy5xdWFsaWZpY2F0aW9ucy5sZW5ndGggLSAxKQogCQkJCW91dHB1dC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlvdXRwdXQuYXBwZW5kKCI+ICIpOyAvLyROT04tTkxTLTEkCiAJfQotCWlmIChzaW1wbGVOYW1lcyAhPSBudWxsKSB7CisJaWYgKHRoaXMuc2ltcGxlTmFtZXMgIT0gbnVsbCkgewogCQlvdXRwdXQuYXBwZW5kKCJzaW1wbGVOYW1lczogPCIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2ltcGxlTmFtZXMubGVuZ3RoOyBpKyspewotCQkJb3V0cHV0LmFwcGVuZChzaW1wbGVOYW1lc1tpXSk7Ci0JCQlpZiAoaSA8IHNpbXBsZU5hbWVzLmxlbmd0aCAtIDEpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zaW1wbGVOYW1lcy5sZW5ndGg7IGkrKyl7CisJCQlvdXRwdXQuYXBwZW5kKHRoaXMuc2ltcGxlTmFtZXNbaV0pOworCQkJaWYgKGkgPCB0aGlzLnNpbXBsZU5hbWVzLmxlbmd0aCAtIDEpCiAJCQkJb3V0cHV0LmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCW91dHB1dC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PckxvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JMb2NhdG9yLmphdmEKaW5kZXggODY4NTA1NS4uOTg3NmI3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PckxvY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDE1ICsxNSwxOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclZhbHVlUGFpcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CkBAIC00Nyw2ICs1MCwxNyBAQAogCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKIAkJdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKGxvY2F0b3IpOwogfQorcHVibGljIGludCBtYXRjaChBbm5vdGF0aW9uIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ubWF0Y2gobm9kZSwgbm9kZVNldCk7CisJCWlmIChuZXdMZXZlbCA+IGxldmVsKSB7CisJCQlpZiAobmV3TGV2ZWwgPT0gQUNDVVJBVEVfTUFUQ0gpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQogcHVibGljIGludCBtYXRjaChBU1ROb2RlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTExMyw2ICsxMjcsMTcgQEAKIAl9CiAJcmV0dXJuIGxldmVsOwogfQorcHVibGljIGludCBtYXRjaChNZW1iZXJWYWx1ZVBhaXIgbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKKwlpbnQgbGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLnBhdHRlcm5Mb2NhdG9yc1tpXS5tYXRjaChub2RlLCBub2RlU2V0KTsKKwkJaWYgKG5ld0xldmVsID4gbGV2ZWwpIHsKKwkJCWlmIChuZXdMZXZlbCA9PSBBQ0NVUkFURV9NQVRDSCkgcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJbGV2ZWwgPSBuZXdMZXZlbDsKKwkJfQorCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CiBwdWJsaWMgaW50IG1hdGNoKE1lc3NhZ2VTZW5kIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTE0Niw2ICsxNzEsMTcgQEAKIAl9CiAJcmV0dXJuIGxldmVsOwogfQorcHVibGljIGludCBtYXRjaChUeXBlUGFyYW1ldGVyIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CisJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnNbaV0ubWF0Y2gobm9kZSwgbm9kZVNldCk7CisJCWlmIChuZXdMZXZlbCA+IGxldmVsKSB7CisJCQlpZiAobmV3TGV2ZWwgPT0gQUNDVVJBVEVfTUFUQ0gpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCWxldmVsID0gbmV3TGV2ZWw7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQogcHVibGljIGludCBtYXRjaChUeXBlUmVmZXJlbmNlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJaW50IGxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5wYXR0ZXJuTG9jYXRvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTE2NCw3ICsyMDAsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiBwcm90ZWN0ZWQgdm9pZCBtYXRjaExldmVsQW5kUmVwb3J0SW1wb3J0UmVmKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYsIEJpbmRpbmcgYmluZGluZywgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkKKwogCS8vIGZvciBzdGF0aWMgaW1wb3J0LCBiaW5kaW5nIGNhbiBiZSBhIGZpZWxkIGJpbmRpbmcgb3IgYSBtZW1iZXIgdHlwZSBiaW5kaW5nCiAJLy8gdmVyaWZ5IHRoYXQgaW4gdGhpcyBjYXNlIGJpbmRpbmcgaXMgc3RhdGljIGFuZCB1c2UgZGVjbGFyaW5nIGNsYXNzIGZvciBmaWVsZHMKIAlCaW5kaW5nIHJlZkJpbmRpbmcgPSBiaW5kaW5nOwpAQCAtMTgyLDcgKzIxOCw3IEBACiAJCQlpZiAoIW1lbWJlckJpbmRpbmcuaXNTdGF0aWMoKSkgcmV0dXJuOwogCQl9CiAJfQotCQorCiAJLy8gTG9vayBmb3IgY2xvc2VzdCBwYXR0ZXJuCiAJUGF0dGVybkxvY2F0b3IgY2xvc2VzdFBhdHRlcm4gPSBudWxsOwogCWludCBsZXZlbCA9IElNUE9TU0lCTEVfTUFUQ0g7CkBAIC0yMTMsNyArMjQ5LDcgQEAKIAlpZiAoY2xvc2VzdFBhdHRlcm4gIT0gbnVsbCkKIAkJY2xvc2VzdFBhdHRlcm4ubWF0Y2hSZXBvcnRJbXBvcnRSZWYoaW1wb3J0UmVmLCBiaW5kaW5nLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFTVE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudCwgSUphdmFFbGVtZW50W10gb3RoZXJFbGVtZW50cywgQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCVBhdHRlcm5Mb2NhdG9yIGNsb3Nlc3RQYXR0ZXJuID0gbnVsbDsKIAlpbnQgbGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOwogCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5Mb2NhdG9ycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewpAQCAtMjI2LDcgKzI2MiwxMCBAQAogCQl9CiAJfQogCWlmIChjbG9zZXN0UGF0dGVybiAhPSBudWxsKQotCQljbG9zZXN0UGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgbG9jYXRvcik7CisJCWNsb3Nlc3RQYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgbG9jYWxFbGVtZW50LCBvdGhlckVsZW1lbnRzLCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGxvY2F0b3IpOworfQorcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJbWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBudWxsLCBudWxsLCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGxvY2F0b3IpOwogfQogcHVibGljIFNlYXJjaE1hdGNoIG5ld0RlY2xhcmF0aW9uTWF0Y2goQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIGludCBsZW5ndGgsIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB7CiAJUGF0dGVybkxvY2F0b3IgY2xvc2VzdFBhdHRlcm4gPSBudWxsOwpAQCAtMjY4LDQgKzMwNywxMyBAQAogCX0KIAlyZXR1cm4gbGV2ZWw7CiB9CisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTG9jYXRvciNzZXRGbGF2b3JzKGludCkKKyAqLwordm9pZCBzZXRGbGF2b3JzKGludCBmbGF2b3JzKSB7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybkxvY2F0b3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXRoaXMucGF0dGVybkxvY2F0b3JzW2ldLnNldEZsYXZvcnMoZmxhdm9ycyk7CisJfQorfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YQppbmRleCA4MTNmM2Y5Li4wMjg3ODUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsMTEgKzIyLDYgQEAKIAogCXByb3RlY3RlZCBTZWFyY2hQYXR0ZXJuW10gcGF0dGVybnM7CiAKLQkvKgotCSAqIFdoZXRoZXIgdGhpcyBwYXR0ZXJuIGlzIGVyYXN1cmUgbWF0Y2guCi0JICovCi0vLwlib29sZWFuIGlzRXJhc3VyZU1hdGNoOwotCiAJLyoqCiAJICogT25lIG9mIHtAbGluayAjUl9FUkFTVVJFX01BVENIfSwge0BsaW5rICNSX0VRVUlWQUxFTlRfTUFUQ0h9LCB7QGxpbmsgI1JfRlVMTF9NQVRDSH0uCiAJICovCkBAIC0zNCwxNSArMjksMTUgQEAKIAogCXB1YmxpYyBPclBhdHRlcm4oU2VhcmNoUGF0dGVybiBsZWZ0UGF0dGVybiwgU2VhcmNoUGF0dGVybiByaWdodFBhdHRlcm4pIHsKIAkJc3VwZXIoTWF0aC5tYXgobGVmdFBhdHRlcm4uZ2V0TWF0Y2hSdWxlKCksIHJpZ2h0UGF0dGVybi5nZXRNYXRjaFJ1bGUoKSkpOwotCQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5raW5kID0gT1JfUEFUVEVSTjsKLQkJKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcykubXVzdFJlc29sdmUgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybikgbGVmdFBhdHRlcm4pLm11c3RSZXNvbHZlIHx8ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKSByaWdodFBhdHRlcm4pLm11c3RSZXNvbHZlOwotCQorCQl0aGlzLmtpbmQgPSBPUl9QQVRURVJOOworCQl0aGlzLm11c3RSZXNvbHZlID0gbGVmdFBhdHRlcm4ubXVzdFJlc29sdmUgfHwgcmlnaHRQYXR0ZXJuLm11c3RSZXNvbHZlOworCiAJCVNlYXJjaFBhdHRlcm5bXSBsZWZ0UGF0dGVybnMgPSBsZWZ0UGF0dGVybiBpbnN0YW5jZW9mIE9yUGF0dGVybiA/ICgoT3JQYXR0ZXJuKSBsZWZ0UGF0dGVybikucGF0dGVybnMgOiBudWxsOwogCQlTZWFyY2hQYXR0ZXJuW10gcmlnaHRQYXR0ZXJucyA9IHJpZ2h0UGF0dGVybiBpbnN0YW5jZW9mIE9yUGF0dGVybiA/ICgoT3JQYXR0ZXJuKSByaWdodFBhdHRlcm4pLnBhdHRlcm5zIDogbnVsbDsKIAkJaW50IGxlZnRTaXplID0gbGVmdFBhdHRlcm5zID09IG51bGwgPyAxIDogbGVmdFBhdHRlcm5zLmxlbmd0aDsKIAkJaW50IHJpZ2h0U2l6ZSA9IHJpZ2h0UGF0dGVybnMgPT0gbnVsbCA/IDEgOiByaWdodFBhdHRlcm5zLmxlbmd0aDsKIAkJdGhpcy5wYXR0ZXJucyA9IG5ldyBTZWFyY2hQYXR0ZXJuW2xlZnRTaXplICsgcmlnaHRTaXplXTsKLQkKKwogCQlpZiAobGVmdFBhdHRlcm5zID09IG51bGwpCiAJCQl0aGlzLnBhdHRlcm5zWzBdID0gbGVmdFBhdHRlcm47CiAJCWVsc2UKQEAgLTUzLDE3ICs0OCwxNyBAQAogCQkJU3lzdGVtLmFycmF5Y29weShyaWdodFBhdHRlcm5zLCAwLCB0aGlzLnBhdHRlcm5zLCBsZWZ0U2l6ZSwgcmlnaHRTaXplKTsKIAogCQkvLyBTdG9yZSBlcmFzdXJlIG1hdGNoCi0JCW1hdGNoQ29tcGF0aWJpbGl0eSA9IDA7CisJCXRoaXMubWF0Y2hDb21wYXRpYmlsaXR5ID0gMDsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCW1hdGNoQ29tcGF0aWJpbGl0eSB8PSAoKEphdmFTZWFyY2hQYXR0ZXJuKSB0aGlzLnBhdHRlcm5zW2ldKS5tYXRjaENvbXBhdGliaWxpdHk7CisJCQl0aGlzLm1hdGNoQ29tcGF0aWJpbGl0eSB8PSAoKEphdmFTZWFyY2hQYXR0ZXJuKSB0aGlzLnBhdHRlcm5zW2ldKS5tYXRjaENvbXBhdGliaWxpdHk7CiAJCX0KIAl9Ci0Jdm9pZCBmaW5kSW5kZXhNYXRjaGVzKEluZGV4IGluZGV4LCBJbmRleFF1ZXJ5UmVxdWVzdG9yIHJlcXVlc3RvciwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGZpbmRJbmRleE1hdGNoZXMoSW5kZXggaW5kZXgsIEluZGV4UXVlcnlSZXF1ZXN0b3IgcmVxdWVzdG9yLCBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIHBlciBjb25zdHJ1Y3Rpb24sIE9SIHBhdHRlcm4gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgUGF0aENvbGxlY3RvciAod2hpY2ggYWxyZWFkeSBnYXRoZXIgcmVzdWx0cyB1c2luZyBhIHNldCkKIAkJdHJ5IHsKIAkJCWluZGV4LnN0YXJ0UXVlcnkoKTsKIAkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybnNbaV0pLmZpbmRJbmRleE1hdGNoZXMoaW5kZXgsIHJlcXVlc3RvciwgcGFydGljaXBhbnQsIHNjb3BlLCBwcm9ncmVzc01vbml0b3IpOworCQkJCXRoaXMucGF0dGVybnNbaV0uZmluZEluZGV4TWF0Y2hlcyhpbmRleCwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudCwgc2NvcGUsIHByb2dyZXNzTW9uaXRvcik7CiAJCX0gZmluYWxseSB7CiAJCQlpbmRleC5zdG9wUXVlcnkoKTsKIAkJfQpAQCAtNzcsOSArNzIsMjIgQEAKIAkJcmV0dXJuICh0aGlzLm1hdGNoQ29tcGF0aWJpbGl0eSAmIFJfRVJBU1VSRV9NQVRDSCkgIT0gMDsKIAl9CiAKLQlib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2goKSB7CisJcHVibGljIGJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMucGF0dGVybnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlpZiAoKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pIHRoaXMucGF0dGVybnNbaV0pLmlzUG9seW1vcnBoaWNTZWFyY2goKSkgcmV0dXJuIHRydWU7CisJCQlpZiAodGhpcy5wYXR0ZXJuc1tpXS5pc1BvbHltb3JwaGljU2VhcmNoKCkpIHJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXR0ZXJuIGhhcyBvbmUgb3Igc2V2ZXJhbCBwYWNrYWdlIGRlY2xhcmF0aW9uIG9yIG5vdC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25lIGF0IGxlYXN0IG9mIHRoZSBzdG9yZWQgcGF0dGVybiBpcyBhIHBhY2thZ2UgZGVjbGFyYXRpb24KKwkgKiAJcGF0dGVybiAoe0BsaW5rIFBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm59KSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNQYWNrYWdlRGVjbGFyYXRpb24oKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnBhdHRlcm5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5wYXR0ZXJuc1tpXSBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4pIHJldHVybiB0cnVlOworCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggN2RkZWQ4MC4uMTJjNTEwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTMgKzIwLDEzIEBACiAJc3VwZXIoUEtHX0RFQ0xfUEFUVEVSTiwgbWF0Y2hSdWxlKTsKIAl0aGlzLnBrZ05hbWUgPSBwa2dOYW1lOwogfQotRW50cnlSZXN1bHRbXSBxdWVyeUluKEluZGV4IGluZGV4KSB7CitwdWJsaWMgRW50cnlSZXN1bHRbXSBxdWVyeUluKEluZGV4IGluZGV4KSB7CiAJLy8gcGFja2FnZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBpbmRleGVkCiAJcmV0dXJuIG51bGw7CiB9CiBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHByaW50KFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKIAlvdXRwdXQuYXBwZW5kKCJQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuOiA8Iik7IC8vJE5PTi1OTFMtMSQKLQlpZiAodGhpcy5wa2dOYW1lICE9IG51bGwpIAorCWlmICh0aGlzLnBrZ05hbWUgIT0gbnVsbCkKIAkJb3V0cHV0LmFwcGVuZCh0aGlzLnBrZ05hbWUpOwogCWVsc2UKIAkJb3V0cHV0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VMb2NhdG9yLmphdmEKaW5kZXggMmU2ZGFiMC4uZmY4NTQ5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZUxvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlBhY2thZ2VSZWZlcmVuY2VNYXRjaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKQEAgLTMzLDggKzM0LDggQEAKIAkJLy8gcmV0cmlldmUgdGhlIGFjdHVhbCBmaWxlIG5hbWUgZnJvbSB0aGUgZnVsbCBwYXRoIChzb3VyY2VzIGFyZSBnZW5lcmFsbHkgb25seSBjb250YWluaW5nIGl0IGFscmVhZHkpCiAJCWZpbGVOYW1lID0gQ2hhck9wZXJhdGlvbi5yZXBsYWNlT25Db3B5KGZpbGVOYW1lLCAnLycsICdcXCcpOyAvLyBlbnN1cmUgdG8gbm90IGRvIGFueSBzaWRlIGVmZmVjdCBvbiBmaWxlIG5hbWUgKHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MDE2KQogCQlmaWxlTmFtZSA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQoZmlsZU5hbWUsICdcXCcpOwotCQkKLQkJdHJ5IHsgCisKKwkJdHJ5IHsKIAkJCXN3aXRjaCAocGFja2FnZUZyYWdtZW50LmdldEtpbmQoKSkgewogCQkJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgOgogCQkJCQlpZiAoIW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbC5pc0phdmFMaWtlRmlsZU5hbWUoZmlsZU5hbWUpIHx8ICFwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KG5ldyBTdHJpbmcoZmlsZU5hbWUpKS5leGlzdHMoKSkgewpAQCAtNTYsNyArNTcsNyBAQAogCQkJLy8gdW5hYmxlIHRvIGRldGVybWluZSBraW5kOyB0b2xlcmF0ZSB0aGlzIG1hdGNoCiAJCX0KIAl9Ci0JcmV0dXJuIHRydWU7IC8vIGJ5IGRlZmF1bHQsIGRvIG5vdCBlbGltaW5hdGUgCisJcmV0dXJuIHRydWU7IC8vIGJ5IGRlZmF1bHQsIGRvIG5vdCBlbGltaW5hdGUKIH0KIAogcHVibGljIFBhY2thZ2VSZWZlcmVuY2VMb2NhdG9yKFBhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuIHBhdHRlcm4pIHsKQEAgLTY0LDYgKzY1LDkgQEAKIAogCXRoaXMucGF0dGVybiA9IHBhdHRlcm47CiB9CitwdWJsaWMgaW50IG1hdGNoKEFubm90YXRpb24gbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKKwlyZXR1cm4gbWF0Y2gobm9kZS50eXBlLCBub2RlU2V0KTsKK30KIHB1YmxpYyBpbnQgbWF0Y2goQVNUTm9kZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeyAvLyBpbnRlcmVzdGVkIGluIEltcG9ydFJlZmVyZW5jZQogCWlmICghKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIApAQCAtOTUsMzMgKzk5LDQzIEBACiBwcm90ZWN0ZWQgaW50IG1hdGNoTGV2ZWxGb3JUb2tlbnMoY2hhcltdW10gdG9rZW5zKSB7CiAJaWYgKHRoaXMucGF0dGVybi5wa2dOYW1lID09IG51bGwpIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKIAotCWNoYXJbXSBwYWNrYWdlTmFtZSA9IG51bGw7Ci0JaWYgKHRoaXMuaXNDYW1lbENhc2UpIHsKLQkJcGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpOwotCQlpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaCh0aGlzLnBhdHRlcm4ucGtnTmFtZSwgcGFja2FnZU5hbWUpKSB7Ci0JCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7Ci0JCX0KLQl9CiAJc3dpdGNoICh0aGlzLm1hdGNoTW9kZSkgewogCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSDoKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIOgotCQkJaWYgKHBhY2thZ2VOYW1lPT1udWxsKSBwYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJyk7Ci0JCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5wYXR0ZXJuLnBrZ05hbWUsIHBhY2thZ2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLnBhdHRlcm4ucGtnTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CiAJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOwogCQkJfQogCQkJYnJlYWs7CisKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDoKIAkJCWNoYXJbXSBwYXR0ZXJuTmFtZSA9IHRoaXMucGF0dGVybi5wa2dOYW1lW3RoaXMucGF0dGVybi5wa2dOYW1lLmxlbmd0aCAtIDFdID09ICcqJwogCQkJCT8gdGhpcy5wYXR0ZXJuLnBrZ05hbWUKIAkJCQk6IENoYXJPcGVyYXRpb24uY29uY2F0KHRoaXMucGF0dGVybi5wa2dOYW1lLCAiLioiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocGFja2FnZU5hbWU9PW51bGwpIHBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKTsKLQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5OYW1lLCBwYWNrYWdlTmFtZSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuTmFtZSwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CiAJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOwogCQkJfQogCQkJYnJlYWs7CisKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUkVHRVhQX01BVENIIDoKIAkJCS8vIFRPRE8gKGZyZWRlcmljKSBpbXBsZW1lbnQgcmVndWxhciBleHByZXNzaW9uIG1hdGNoCiAJCQlicmVhazsKKworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfTUFUQ0g6CisJCQljaGFyW10gcGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpOworCQkJaWYgKENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godGhpcy5wYXR0ZXJuLnBrZ05hbWUsIHBhY2thZ2VOYW1lLCBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQl9CisJCQkvLyBvbmx5IHRlc3QgY2FzZSBpbnNlbnNpdGl2ZSBhcyBDYW1lbENhc2UgYWxyZWFkeSB2ZXJpZmllZCBwcmVmaXggY2FzZSBzZW5zaXRpdmUKKwkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5wYXR0ZXJuLnBrZ05hbWUsIHBhY2thZ2VOYW1lLCBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9DQU1FTENBU0VfU0FNRV9QQVJUX0NPVU5UX01BVENIOgorCQkJaWYgKENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2godGhpcy5wYXR0ZXJuLnBrZ05hbWUsIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJyksIHRydWUpKSB7CisJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJfQorCQkJYnJlYWs7CiAJfQogCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogfQpAQCAtMTY2LDEyICsxODAsMTUgQEAKIAkJCQlsYXN0ID0gKChQYWNrYWdlQmluZGluZykgYmluZGluZykuY29tcG91bmROYW1lLmxlbmd0aDsKIAkJCWludCBzdGFydCA9IChpbnQpIChwb3NpdGlvbnNbMF0gPj4+IDMyKTsKIAkJCWludCBlbmQgPSAoaW50KSBwb3NpdGlvbnNbbGFzdCAtIDFdOwotCQkJbWF0Y2ggPSBsb2NhdG9yLm5ld1BhY2thZ2VSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBhY2N1cmFjeSwgc3RhcnQsIGVuZC1zdGFydCsxLCBpbXBvcnRSZWYpOwotCQkJbG9jYXRvci5yZXBvcnQobWF0Y2gpOworCQkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3UGFja2FnZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGFjY3VyYWN5LCBzdGFydCwgZW5kLXN0YXJ0KzEsIGltcG9ydFJlZik7CisJCQlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIAkJfQogCX0KIH0KIHByb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFTVE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCW1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgbnVsbCwgbnVsbCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBsb2NhdG9yKTsKK30KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFTVE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IGxvY2FsRWxlbWVudCwgSUphdmFFbGVtZW50W10gb3RoZXJFbGVtZW50cywgQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWxvbmdbXSBwb3NpdGlvbnMgPSBudWxsOwogCWludCBsYXN0ID0gLTE7CiAJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgewpAQCAtMTkzLDcgKzIxMCw3IEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQmluZGluZy5WQVJJQUJMRSA6IC8vPT09PT09PT09PT09dW5ib3VuZCBjYXNlcz09PT09PT09PT09CiAJCQkJY2FzZSBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlZBUklBQkxFIDoKLQkJCQkJQmluZGluZyBiaW5kaW5nID0gcU5hbWVSZWYuYmluZGluZzsgCisJCQkJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7CiAJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsKIAkJCQkJCXR5cGVCaW5kaW5nID0gKFR5cGVCaW5kaW5nKSBiaW5kaW5nOwogCQkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CkBAIC0yMDQsNyArMjIxLDcgQEAKIAkJCQkJCXR5cGVCaW5kaW5nID0gcGJCaW5kaW5nLnNlYXJjaFR5cGU7CiAJCQkJCQlsYXN0ID0gQ2hhck9wZXJhdGlvbi5vY2N1cmVuY2VzT2YoJy4nLCBwYkJpbmRpbmcubmFtZSk7CiAJCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKKwkJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewogCQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxVHlwZVJlZiA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSByZWZlcmVuY2U7CkBAIC0yNDUsOCArMjYyLDEwIEBACiAJaWYgKGxhc3QgPiBwb3NpdGlvbnMubGVuZ3RoKSBsYXN0ID0gcG9zaXRpb25zLmxlbmd0aDsKIAlpbnQgc291cmNlU3RhcnQgPSAoaW50KSAocG9zaXRpb25zWzBdID4+PiAzMik7CiAJaW50IHNvdXJjZUVuZCA9ICgoaW50KSBwb3NpdGlvbnNbbGFzdCAtIDFdKTsKLQltYXRjaCA9IGxvY2F0b3IubmV3UGFja2FnZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGFjY3VyYWN5LCBzb3VyY2VTdGFydCwgc291cmNlRW5kLXNvdXJjZVN0YXJ0KzEsIHJlZmVyZW5jZSk7Ci0JbG9jYXRvci5yZXBvcnQobWF0Y2gpOworCVBhY2thZ2VSZWZlcmVuY2VNYXRjaCBwYWNrYWdlUmVmZXJlbmNlTWF0Y2ggPSBsb2NhdG9yLm5ld1BhY2thZ2VSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBhY2N1cmFjeSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZC1zb3VyY2VTdGFydCsxLCByZWZlcmVuY2UpOworCXBhY2thZ2VSZWZlcmVuY2VNYXRjaC5zZXRMb2NhbEVsZW1lbnQobG9jYWxFbGVtZW50KTsKKwl0aGlzLm1hdGNoID0gcGFja2FnZVJlZmVyZW5jZU1hdGNoOworCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogfQogcHJvdGVjdGVkIGludCByZWZlcmVuY2VUeXBlKCkgewogCXJldHVybiBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDsKQEAgLTI5MywxNSArMzEyLDE0IEBACiAJCX0KIAl9CiAJaWYgKGNvbXBvdW5kTmFtZSAhPSBudWxsICYmIG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5wa2dOYW1lLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpKSkgewotCQlpZiAoKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pIHRoaXMucGF0dGVybikuZm9jdXMgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCWlmICh0aGlzLnBhdHRlcm4uZm9jdXMgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CiAJCQkvLyBjaGVjayB0aGF0IHR5cGUgaXMgbG9jYXRlZCBpbnNpZGUgdGhpcyBpbnN0YW5jZSBvZiBhIHBhY2thZ2UgZnJhZ21lbnQKLQkJCWlmICghaXNEZWNsYXJpbmdQYWNrYWdlRnJhZ21lbnQoKElQYWNrYWdlRnJhZ21lbnQpKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pIHRoaXMucGF0dGVybikuZm9jdXMsIChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpKQorCQkJaWYgKCFpc0RlY2xhcmluZ1BhY2thZ2VGcmFnbWVudCgoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5wYXR0ZXJuLmZvY3VzLCAoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nKSkKIAkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKLQkJfQkJCQkKKwkJfQogCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiAJfQorCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogfQogcHJvdGVjdGVkIGludCByZXNvbHZlTGV2ZWwoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZikgewogCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbDsKQEAgLTMyMyw3ICszNDEsNyBAQAogCQkgKi8KIAkJY2FzZSBCaW5kaW5nLlZBUklBQkxFIDogLy89PT09PT09PT09PT11bmJvdW5kIGNhc2VzPT09PT09PT09PT0KIAkJY2FzZSBCaW5kaW5nLlRZUEUgfCBCaW5kaW5nLlZBUklBQkxFIDoKLQkJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7IAorCQkJQmluZGluZyBiaW5kaW5nID0gcU5hbWVSZWYuYmluZGluZzsKIAkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKIAkJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZykgYmluZGluZzsKIAkJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKQEAgLTMzNiw3ICszNTQsNyBAQAogCQkJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKIAkJCQl0eXBlQmluZGluZyA9IHBiQmluZGluZy5zZWFyY2hUeXBlOwogCQkJfQotCQkJYnJlYWs7CQkJCQkKKwkJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmVzb2x2ZUxldmVsKHR5cGVCaW5kaW5nKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCBlN2EyYTQzLi4zZWNmYzM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDcgKzEzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwogCi1wdWJsaWMgY2xhc3MgUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBBbmRQYXR0ZXJuIHsKK3B1YmxpYyBjbGFzcyBQYWNrYWdlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIEludGVyc2VjdGluZ1BhdHRlcm4gewogCiBwcm90ZWN0ZWQgY2hhcltdIHBrZ05hbWU7CiAKQEAgLTI4LDExICsyOCwxMSBAQAogCWlmIChwa2dOYW1lID09IG51bGwgfHwgcGtnTmFtZS5sZW5ndGggPT0gMCkgewogCQl0aGlzLnBrZ05hbWUgPSBudWxsOwogCQl0aGlzLnNlZ21lbnRzID0gbmV3IGNoYXJbXVtdIHtDaGFyT3BlcmF0aW9uLk5PX0NIQVJ9OwotCQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IGZhbHNlOworCQl0aGlzLm11c3RSZXNvbHZlID0gZmFsc2U7CiAJfSBlbHNlIHsKLQkJdGhpcy5wa2dOYW1lID0gKGlzQ2FzZVNlbnNpdGl2ZSgpIHx8IGlzQ2FtZWxDYXNlKCkpICA/IHBrZ05hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBrZ05hbWUpOworCQl0aGlzLnBrZ05hbWUgPSAodGhpcy5pc0Nhc2VTZW5zaXRpdmUgfHwgdGhpcy5pc0NhbWVsQ2FzZSkgPyBwa2dOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwa2dOYW1lKTsKIAkJdGhpcy5zZWdtZW50cyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHRoaXMucGtnTmFtZSk7Ci0JCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gdHJ1ZTsKKwkJdGhpcy5tdXN0UmVzb2x2ZSA9IHRydWU7CiAJfQogfQogUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4oaW50IG1hdGNoUnVsZSkgewpAQCAtNDcsNyArNDcsNyBAQAogfQogcHVibGljIGNoYXJbXSBnZXRJbmRleEtleSgpIHsKIAkvLyBQYWNrYWdlIHJlZmVyZW5jZSBrZXlzIGFyZSBlbmNvZGVkIGFzICduYW1lJyAod2hlcmUgJ25hbWUnIGlzIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIHBhY2thZ2UgbmFtZSkKLQlpZiAodGhpcy5jdXJyZW50U2VnbWVudCA+PSAwKSAKKwlpZiAodGhpcy5jdXJyZW50U2VnbWVudCA+PSAwKQogCQlyZXR1cm4gdGhpcy5zZWdtZW50c1t0aGlzLmN1cnJlbnRTZWdtZW50XTsKIAlyZXR1cm4gbnVsbDsKIH0KQEAgLTU2LDcgKzU2LDcgQEAKIH0KIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRRdWVyeSgpIHsKIAkvLyBpZiBwYWNrYWdlIGhhcyBhdCBsZWFzdCA0IHNlZ21lbnRzLCBkb24ndCBsb29rIGF0IHRoZSBmaXJzdCAyIHNpbmNlIHRoZXkgYXJlIG1vc3RseQotCS8vIHJlZHVuZGFudCAoZWcuIGluICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJyAnb3JnLmVjbGlwc2UnIGlzIHVzZWQgYWxsIHRoZSB0aW1lKQorCS8vIHJlZHVuZGFudCAoZS5nLiBpbiAnb3JnLmVjbGlwc2UuamR0LmNvcmUuKicgJ29yZy5lY2xpcHNlJyBpcyB1c2VkIGFsbCB0aGUgdGltZSkKIAlyZXR1cm4gLS10aGlzLmN1cnJlbnRTZWdtZW50ID49ICh0aGlzLnNlZ21lbnRzLmxlbmd0aCA+PSA0ID8gMiA6IDApOwogfQogcHVibGljIGJvb2xlYW4gbWF0Y2hlc0RlY29kZWRLZXkoU2VhcmNoUGF0dGVybiBkZWNvZGVkUGF0dGVybikgewpAQCAtNjgsNyArNjgsNyBAQAogfQogcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBwcmludChTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAJb3V0cHV0LmFwcGVuZCgiUGFja2FnZVJlZmVyZW5jZVBhdHRlcm46IDwiKTsgLy8kTk9OLU5MUy0xJAotCWlmICh0aGlzLnBrZ05hbWUgIT0gbnVsbCkgCisJaWYgKHRoaXMucGtnTmFtZSAhPSBudWxsKQogCQlvdXRwdXQuYXBwZW5kKHRoaXMucGtnTmFtZSk7CiAJZWxzZQogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGF0dGVybkxvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGF0dGVybkxvY2F0b3IuamF2YQppbmRleCAwZTEwMDMxLi5hOTkzZDhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5Mb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTG9jYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDcgKzIzLDYgQEAKIC8vIHN0b3JlIHBhdHRlcm4gaW5mbwogcHJvdGVjdGVkIGludCBtYXRjaE1vZGU7CiBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmU7Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc0NhbWVsQ2FzZTsKIHByb3RlY3RlZCBib29sZWFuIGlzRXF1aXZhbGVudE1hdGNoOwogcHJvdGVjdGVkIGJvb2xlYW4gaXNFcmFzdXJlTWF0Y2g7CiBwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0UmVzb2x2ZTsKQEAgLTQwLDcgKzM5LDkgQEAKIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSQVNVUkVfTUFUQ0ggPSA0OwogCiAvLyBQb3NzaWJsZSBydWxlIG1hdGNoIGZsYXZvcnMKK2ludCBmbGF2b3JzID0gMDsKIC8vIHNlZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5ODY2CitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19GTEFWT1IgPSAweDAwMDA7CiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEFDVF9GTEFWT1IgPSAweDAwMTA7CiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfRkxBVk9SID0gMHgwMDIwOwogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFUVEVSTl9GTEFWT1IgPSAweDAwNDA7CkBAIC00OSw2ICs1MCw3IEBACiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUl9JTlZPQ0FUSU9OX0ZMQVZPUiA9IDB4MDIwMDsKIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQl9JTlZPQ0FUSU9OX0ZMQVZPUiA9IDB4MDQwMDsKIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJSSURERU5fTUVUSE9EX0ZMQVZPUiA9IDB4MDgwMDsKK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSVFlQRV9SRUZfRkxBVk9SID0gMHgxMDAwOwogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfTEVWRUxfTUFTSyA9IDB4MEY7CiBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFWT1JTX01BU0sgPSB+TUFUQ0hfTEVWRUxfTUFTSzsKIApAQCAtNjUsNyArNjcsNyBAQAogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NQVNLID0gUkFXX01BU0s7IC8vIG5vIG90aGVyIHZhbHVlcyBmb3IgdGhlIHdoaWxlLi4uCiAKIHB1YmxpYyBzdGF0aWMgUGF0dGVybkxvY2F0b3IgcGF0dGVybkxvY2F0b3IoU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0Jc3dpdGNoICgoKEludGVybmFsU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5raW5kKSB7CisJc3dpdGNoIChwYXR0ZXJuLmtpbmQpIHsKIAkJY2FzZSBJSW5kZXhDb25zdGFudHMuUEtHX1JFRl9QQVRURVJOIDoKIAkJCXJldHVybiBuZXcgUGFja2FnZVJlZmVyZW5jZUxvY2F0b3IoKFBhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuKSBwYXR0ZXJuKTsKIAkJY2FzZSBJSW5kZXhDb25zdGFudHMuUEtHX0RFQ0xfUEFUVEVSTiA6CkBAIC04NCw2ICs4Niw4IEBACiAJCQlyZXR1cm4gbmV3IE1ldGhvZExvY2F0b3IoKE1ldGhvZFBhdHRlcm4pIHBhdHRlcm4pOwogCQljYXNlIElJbmRleENvbnN0YW50cy5PUl9QQVRURVJOIDoKIAkJCXJldHVybiBuZXcgT3JMb2NhdG9yKChPclBhdHRlcm4pIHBhdHRlcm4pOworCQljYXNlIElJbmRleENvbnN0YW50cy5BTkRfUEFUVEVSTiA6CisJCQlyZXR1cm4gbmV3IEFuZExvY2F0b3IoKEFuZFBhdHRlcm4pIHBhdHRlcm4pOwogCQljYXNlIElJbmRleENvbnN0YW50cy5MT0NBTF9WQVJfUEFUVEVSTiA6CiAJCQlyZXR1cm4gbmV3IExvY2FsVmFyaWFibGVMb2NhdG9yKChMb2NhbFZhcmlhYmxlUGF0dGVybikgcGF0dGVybik7CiAJCWNhc2UgSUluZGV4Q29uc3RhbnRzLlRZUEVfUEFSQU1fUEFUVEVSTjoKQEAgLTExNiwxMSArMTIwLDEwIEBACiBwdWJsaWMgUGF0dGVybkxvY2F0b3IoU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7CiAJaW50IG1hdGNoUnVsZSA9IHBhdHRlcm4uZ2V0TWF0Y2hSdWxlKCk7CiAJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFKSAhPSAwOwotCXRoaXMuaXNDYW1lbENhc2UgPSAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9NQVRDSCkgIT0gMDsKIAl0aGlzLmlzRXJhc3VyZU1hdGNoID0gKG1hdGNoUnVsZSAmIFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKSAhPSAwOwogCXRoaXMuaXNFcXVpdmFsZW50TWF0Y2ggPSAobWF0Y2hSdWxlICYgU2VhcmNoUGF0dGVybi5SX0VRVUlWQUxFTlRfTUFUQ0gpICE9IDA7CiAJdGhpcy5tYXRjaE1vZGUgPSBtYXRjaFJ1bGUgJiBKYXZhU2VhcmNoUGF0dGVybi5NQVRDSF9NT0RFX01BU0s7Ci0JdGhpcy5tdXN0UmVzb2x2ZSA9ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLm11c3RSZXNvbHZlOworCXRoaXMubXVzdFJlc29sdmUgPSBwYXR0ZXJuLm11c3RSZXNvbHZlOwogfQogLyoKICAqIENsZWFyIGNhY2hlcwpAQCAtMTY5LDcgKzE3Miw3IEBACiB9CiAvKioKICAqIEluaXRpYWxpemVzIHRoaXMgc2VhcmNoIHBhdHRlcm4gc28gdGhhdCBwb2x5bW9ycGhpYyBzZWFyY2ggY2FuIGJlIHBlcmZvcm1lZC4KLSAqLyAKKyAqLwogcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKE1hdGNoTG9jYXRvciBsb2NhdG9yKSB7CiAJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiB9CkBAIC0yMzgsNiArMjQxLDkgQEAKIAkvLyBvdmVycmlkZSBpZiB0aGUgcGF0dGVybiBjYW4gYmUgbW9yZSBzcGVjaWZpYwogCXJldHVybiBBTExfQ09OVEFJTkVSOwogfQorcHJvdGVjdGVkIGludCBmaW5lR3JhaW4oKSB7CisJcmV0dXJuIDA7Cit9CiAvKioKICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgogICovCkBAIC0yNDksNyArMjU1LDcgQEAKIC8qKgogICogUmV0dXJuIGhvdyB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgogICogQHNlZSAiaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5ODY2IgotICogCisgKgogICogQHBhcmFtIHBhdHRlcm4KICAqIEBwYXJhbSBuYW1lCiAgKiBAcmV0dXJuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CkBAIC0yNjEsNyArMjY3LDcgQEAKICAqIAkJPGxpPntAbGluayAjRVhBQ1RfRkxBVk9SfTogR2l2ZW4gbmFtZSBpcyBlcXVhbHMgdG8gcGF0dGVybjwvbGk+CiAgKiAJCTxsaT57QGxpbmsgI1BSRUZJWF9GTEFWT1J9OiBHaXZlbiBuYW1lIHByZWZpeCBlcXVhbHMgdG8gcGF0dGVybjwvbGk+CiAgKiAJCTxsaT57QGxpbmsgI0NBTUVMQ0FTRV9GTEFWT1J9OiBHaXZlbiBuYW1lIG1hdGNoZXMgcGF0dGVybiBhcyBDYW1lbCBDYXNlPC9saT4KLSAqIAkJPGxpPntAbGluayAjUEFUVEVSTl9GTEFWT1J9OiBHaXZlbiBuYW1lIG1hdGNoZXMgcGF0dGVybiBhcyBQYXR0ZXJuIChpZS4gdXNpbmcgJyonIGFuZCAnPycgY2hhcmFjdGVycyk8L2xpPgorICogCQk8bGk+e0BsaW5rICNQQVRURVJOX0ZMQVZPUn06IEdpdmVuIG5hbWUgbWF0Y2hlcyBwYXR0ZXJuIGFzIFBhdHRlcm4gKGkuZS4gdXNpbmcgJyonIGFuZCAnPycgY2hhcmFjdGVycyk8L2xpPgogICogCQk8L3VsPgogICogCTwvbGk+CiAgKiA8L3VsPgpAQCAtMjgwLDI0ICsyODYsMjEgQEAKIAlib29sZWFuIG1hdGNoRmlyc3RDaGFyID0gIXRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IHBhdHRlcm5bMF0gPT0gbmFtZVswXTsKIAlib29sZWFuIHNhbWVMZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCA9PSBuYW1lLmxlbmd0aDsKIAlib29sZWFuIGNhbkJlUHJlZml4ID0gbmFtZS5sZW5ndGggPj0gcGF0dGVybi5sZW5ndGg7Ci0JaWYgKHRoaXMuaXNDYW1lbENhc2UgJiYgbWF0Y2hGaXJzdENoYXIgJiYgQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChwYXR0ZXJuLCBuYW1lKSkgewotCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7Ci0JfQogCXN3aXRjaCAodGhpcy5tYXRjaE1vZGUpIHsKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0g6Ci0JCQlpZiAoIXRoaXMuaXNDYW1lbENhc2UpIHsKLQkJCQlpZiAoc2FtZUxlbmd0aCAmJiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuLCBuYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKLQkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIIHwgRVhBQ1RfRkxBVk9SOwotCQkJCX0KLQkJCQlicmVhazsKKwkJCWlmIChzYW1lTGVuZ3RoICYmIG1hdGNoRmlyc3RDaGFyICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm4sIG5hbWUsIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSCB8IEVYQUNUX0ZMQVZPUjsKIAkJCX0KLQkJCS8vIGZhbGwgdGhyb3VnaCBuZXh0IGNhc2UgdG8gbWF0Y2ggYXMgcHJlZml4IGlmIGNhbWVsIGNhc2UgZmFpbGVkCisJCQlicmVhazsKKwogCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9QUkVGSVhfTUFUQ0g6CiAJCQlpZiAoY2FuQmVQcmVmaXggJiYgbWF0Y2hGaXJzdENoYXIgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocGF0dGVybiwgbmFtZSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CiAJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOwogCQkJfQogCQkJYnJlYWs7CisKIAkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDoKKwkJCS8vIFRPRE9fUEVSRlMgKGZyZWRlcmljKSBOb3Qgc3VyZSB0aGlzIGxvd2VyY2FzZSBpcyBuZWNlc3NhcnkKIAkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHsKIAkJCQlwYXR0ZXJuID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXR0ZXJuKTsKIAkJCX0KQEAgLTMwNSw5ICszMDgsMjYgQEAKIAkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CiAJCQl9CiAJCQlicmVhazsKKwogCQljYXNlIFNlYXJjaFBhdHRlcm4uUl9SRUdFWFBfTUFUQ0ggOgogCQkJLy8gVE9ETyAoZnJlZGVyaWMpIGltcGxlbWVudCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2gKIAkJCWJyZWFrOworCisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9NQVRDSDoKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIG5hbWUsIGZhbHNlKSkgeworCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsKKwkJCX0KKwkJCS8vIG9ubHkgdGVzdCBjYXNlIGluc2Vuc2l0aXZlIGFzIENhbWVsQ2FzZSBzYW1lIHBhcnQgY291bnQgYWxyZWFkeSB2ZXJpZmllZCBwcmVmaXggY2FzZSBzZW5zaXRpdmUKKwkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocGF0dGVybiwgbmFtZSwgZmFsc2UpKSB7CisJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSDoKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHBhdHRlcm4sIG5hbWUsIHRydWUpKSB7CisJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJfQorCQkJYnJlYWs7CiAJfQogCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogfQpAQCAtMzQ4LDkgKzM2OCw5IEBACiAJaW50IGxldmVsID0gcmVzb2x2ZUxldmVsKGJpbmRpbmcpOwogCWlmIChsZXZlbCA+PSBJTkFDQ1VSQVRFX01BVENIKSB7CiAJCW1hdGNoUmVwb3J0SW1wb3J0UmVmKAotCQkJaW1wb3J0UmVmLCAKLQkJCWJpbmRpbmcsIAotCQkJbG9jYXRvci5jcmVhdGVJbXBvcnRIYW5kbGUoaW1wb3J0UmVmKSwgCisJCQlpbXBvcnRSZWYsCisJCQliaW5kaW5nLAorCQkJbG9jYXRvci5jcmVhdGVJbXBvcnRIYW5kbGUoaW1wb3J0UmVmKSwKIAkJCWxldmVsID09IEFDQ1VSQVRFX01BVENICiAJCQkJPyBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFCiAJCQkJOiBTZWFyY2hNYXRjaC5BX0lOQUNDVVJBVEUsCkBAIC0zNzAsMjggKzM5MCwyOCBAQAogICogUmVwb3J0cyB0aGUgbWF0Y2ggb2YgdGhlIGdpdmVuIHJlZmVyZW5jZS4KICAqLwogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JbWF0Y2ggPSBudWxsOworCXRoaXMubWF0Y2ggPSBudWxsOwogCWludCByZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlVHlwZSgpOwogCWludCBvZmZzZXQgPSByZWZlcmVuY2Uuc291cmNlU3RhcnQ7CiAJc3dpdGNoIChyZWZlcmVuY2VUeXBlKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQltYXRjaCA9IGxvY2F0b3IubmV3UGFja2FnZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIHJlZmVyZW5jZS5zb3VyY2VFbmQtb2Zmc2V0KzEsIHJlZmVyZW5jZSk7CisJCQl0aGlzLm1hdGNoID0gbG9jYXRvci5uZXdQYWNrYWdlUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgcmVmZXJlbmNlLnNvdXJjZUVuZC1vZmZzZXQrMSwgcmVmZXJlbmNlKTsKIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJbWF0Y2ggPSBsb2NhdG9yLm5ld1R5cGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgcmVmZXJlbmNlLnNvdXJjZUVuZC1vZmZzZXQrMSwgcmVmZXJlbmNlKTsKKwkJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld1R5cGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgcmVmZXJlbmNlLnNvdXJjZUVuZC1vZmZzZXQrMSwgcmVmZXJlbmNlKTsKIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLQkJCW1hdGNoID0gbG9jYXRvci5uZXdGaWVsZFJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgb2Zmc2V0LCByZWZlcmVuY2Uuc291cmNlRW5kLW9mZnNldCsxLCByZWZlcmVuY2UpOworCQkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3RmllbGRSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBudWxsLCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIG9mZnNldCwgcmVmZXJlbmNlLnNvdXJjZUVuZC1vZmZzZXQrMSwgcmVmZXJlbmNlKTsKIAkJCWJyZWFrOwogCQljYXNlIElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRToKLQkJCW1hdGNoID0gbG9jYXRvci5uZXdMb2NhbFZhcmlhYmxlUmVmZXJlbmNlTWF0Y2goZWxlbWVudCwgYWNjdXJhY3ksIG9mZnNldCwgcmVmZXJlbmNlLnNvdXJjZUVuZC1vZmZzZXQrMSwgcmVmZXJlbmNlKTsKKwkJCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld0xvY2FsVmFyaWFibGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCByZWZlcmVuY2Uuc291cmNlRW5kLW9mZnNldCsxLCByZWZlcmVuY2UpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOgotCQkJbWF0Y2ggPSBsb2NhdG9yLm5ld1R5cGVQYXJhbWV0ZXJSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBhY2N1cmFjeSwgb2Zmc2V0LCByZWZlcmVuY2Uuc291cmNlRW5kLW9mZnNldCsxLCByZWZlcmVuY2UpOworCQkJdGhpcy5tYXRjaCA9IGxvY2F0b3IubmV3VHlwZVBhcmFtZXRlclJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGFjY3VyYWN5LCBvZmZzZXQsIHJlZmVyZW5jZS5zb3VyY2VFbmQtb2Zmc2V0KzEsIHJlZmVyZW5jZSk7CiAJCQlicmVhazsKIAl9Ci0JaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJbG9jYXRvci5yZXBvcnQobWF0Y2gpOworCWlmICh0aGlzLm1hdGNoICE9IG51bGwpIHsKKwkJbG9jYXRvci5yZXBvcnQodGhpcy5tYXRjaCk7CiAJfQogfQogLyoqCkBAIC00MDAsMTIgKzQyMCw2IEBACiBwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQsIElKYXZhRWxlbWVudFtdIG90aGVyRWxlbWVudHMsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAltYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgbG9jYXRvcik7CiB9Ci0vKioKLSAqIFJlcG9ydHMgdGhlIG1hdGNoIG9mIHRoZSBnaXZlbiByZWZlcmVuY2UuIEFsc28gcHJvdmlkZSBhIHNjb3BlIHRvIGxvb2sgZm9yIHBvdGVudGlhbCBvdGhlciBlbGVtZW50cy4KLSAqLwotcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQVNUTm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBTY29wZSBzY29wZSwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCW1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBsb2NhdG9yKTsKLX0KIHB1YmxpYyBTZWFyY2hNYXRjaCBuZXdEZWNsYXJhdGlvbk1hdGNoKEFTVE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgQmluZGluZyBlbGVtZW50QmluZGluZywgaW50IGFjY3VyYWN5LCBpbnQgbGVuZ3RoLCBNYXRjaExvY2F0b3IgbG9jYXRvcikgewogICAgIHJldHVybiBsb2NhdG9yLm5ld0RlY2xhcmF0aW9uTWF0Y2goZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCByZWZlcmVuY2Uuc291cmNlU3RhcnQsIGxlbmd0aCk7CiB9CkBAIC00MTUsOSArNDI5LDkgQEAKIC8qKgogICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGFzdCBub2RlIG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybi4KICAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0LgotICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybiAoaWUuIAorICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybiAoaS5lLgogICogaXQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZCBidXQgcmVzb2x2aW5nIGZhaWxlZC4pCi0gKiBSZXR1cm5zIEFDQ1VSQVRFX01BVENIIGlmIGl0IG1hdGNoZXMgZXhhY3RseSB0aGlzIHNlYXJjaCBwYXR0ZXJuIChpZS4gCisgKiBSZXR1cm5zIEFDQ1VSQVRFX01BVENIIGlmIGl0IG1hdGNoZXMgZXhhY3RseSB0aGlzIHNlYXJjaCBwYXR0ZXJuIChpLmUuCiAgKiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgb3IgaXQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC4pCiAgKi8KIHB1YmxpYyBpbnQgcmVzb2x2ZUxldmVsKEFTVE5vZGUgcG9zc2libGVNYXRjaGluZ05vZGUpIHsKQEAgLTQyNSw2ICs0MzksMTcgQEAKIAkvLyBuZWVkIHRvIGRvIGluc3RhbmNlIG9mIGNoZWNrcyB0byBmaW5kIG91dCBleGFjdCB0eXBlIG9mIEFTVE5vZGUKIAlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIH0KKy8qKgorICogU2V0IHRoZSBmbGF2b3JzIGZvciB3aGljaCB0aGUgbG9jYXRvciBoYXMgdG8gYmUgZm9jdXNlZCBvbi4KKyAqIElmIG5vdCBzZXQsIHRoZSBsb2NhdG9yIHdpbGwgYWNjZXB0IGFsbCBtYXRjaGVzIHdpdGggb3Igd2l0aG91dCBmbGF2b3JzLgorICogV2hlbiBzZXQsIHRoZSBsb2NhdG9yIHdpbGwgb25seSBhY2NlcHQgbWF0Y2ggaGF2aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZsYXZvcnMuCisgKiAKKyAqIEBwYXJhbSBmbGF2b3JzIEJpdHMgbWFzayBzcGVjaWZ5aW5nIHRoZSBmbGF2b3JzIHRvIGJlIGFjY2VwdGVkIG9yCisgKiAJPGNvZGU+MDwvY29kZT4gdG8gaWdub3JlIHRoZSBmbGF2b3JzIHdoaWxlIGFjY2VwdGluZyBtYXRjaGVzLgorICovCit2b2lkIHNldEZsYXZvcnMoaW50IGZsYXZvcnMpIHsKKwl0aGlzLmZsYXZvcnMgPSBmbGF2b3JzOworfQogLyoKICAqIFVwZGF0ZSBwYXR0ZXJuIGxvY2F0b3IgbWF0Y2ggZm9yIHBhcmFtZXRlcml6ZWQgdG9wIGxldmVsIHR5cGVzLgogICogU2V0IG1hdGNoIHJhdyBmbGFnIGFuZCByZWN1cnNlIHRvIGVuY2xvc2luZyB0eXBlcyBpZiBhbnkuLi4KQEAgLTQ0MywyNSArNDY4LDI4IEBACiAJYm9vbGVhbiBlbmRQYXR0ZXJuID0gcGF0dGVyblR5cGVBcmd1bWVudHM9PW51bGwgID8gdHJ1ZSAgOiBkZXB0aD49cGF0dGVyblR5cGVBcmd1bWVudHMubGVuZ3RoOwogCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzQmluZGluZ3MgPSBwYXJhbWV0ZXJpemVkQmluZGluZy5hcmd1bWVudHM7CiAJYm9vbGVhbiBpc1JhdyA9IHBhcmFtZXRlcml6ZWRCaW5kaW5nLmlzUmF3VHlwZSgpfHwgKGFyZ3VtZW50c0JpbmRpbmdzPT1udWxsICYmIHBhcmFtZXRlcml6ZWRCaW5kaW5nLmdlbmVyaWNUeXBlKCkuaXNHZW5lcmljVHlwZSgpKTsKLQlpZiAoaXNSYXcgJiYgIW1hdGNoLmlzUmF3KCkpIHsKLQkJbWF0Y2guc2V0UmF3KGlzUmF3KTsKKwlpZiAoaXNSYXcgJiYgIXRoaXMubWF0Y2guaXNSYXcoKSkgeworCQl0aGlzLm1hdGNoLnNldFJhdyhpc1Jhdyk7CiAJfQotCQorCiAJLy8gVXBkYXRlIG1hdGNoCiAJaWYgKCFlbmRQYXR0ZXJuICYmIHBhdHRlcm5UeXBlQXJndW1lbnRzICE9IG51bGwpIHsKIAkJLy8gdmVyaWZ5IGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGdlbmVyaWMgdHlwZSBpdHNlbGYKIAkJaWYgKCFpc1JhdyAmJiBwYXR0ZXJuSGFzVHlwZVBhcmFtZXRlcnMgJiYgYXJndW1lbnRzQmluZGluZ3MgIT0gbnVsbCkgewogCQkJYm9vbGVhbiBuZWVkVXBkYXRlID0gZmFsc2U7CiAJCQlUeXBlVmFyaWFibGVCaW5kaW5nW10gdHlwZVZhcmlhYmxlcyA9IHBhcmFtZXRlcml6ZWRCaW5kaW5nLmdlbmVyaWNUeXBlKCkudHlwZVZhcmlhYmxlcygpOwotCQkJZm9yIChpbnQgaT0wLCBsPWFyZ3VtZW50c0JpbmRpbmdzLmxlbmd0aDsgaTxsOyBpKyspIHsKLQkJCQlpZiAoYXJndW1lbnRzQmluZGluZ3NbaV0gIT0gdHlwZVZhcmlhYmxlc1tpXSkgewotCQkJCQluZWVkVXBkYXRlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7CisJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzQmluZGluZ3MubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA9PSB0eXBlVmFyaWFibGVzLmxlbmd0aCkgeworCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQkJCQlpZiAoYXJndW1lbnRzQmluZGluZ3NbaV0gIT0gdHlwZVZhcmlhYmxlc1tpXSkgeworCQkJCQkJbmVlZFVwZGF0ZSA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWlmIChuZWVkVXBkYXRlKSB7CiAJCQkJY2hhcltdW10gcGF0dGVybkFyZ3VtZW50cyA9ICBwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF07Ci0JCQkJdXBkYXRlTWF0Y2goYXJndW1lbnRzQmluZGluZ3MsIGxvY2F0b3IsIHBhdHRlcm5Bcmd1bWVudHMsIHBhdHRlcm5IYXNUeXBlUGFyYW1ldGVycyk7CQorCQkJCXVwZGF0ZU1hdGNoKGFyZ3VtZW50c0JpbmRpbmdzLCBsb2NhdG9yLCBwYXR0ZXJuQXJndW1lbnRzLCBwYXR0ZXJuSGFzVHlwZVBhcmFtZXRlcnMpOwogCQkJfQogCQl9IGVsc2UgewogCQkJY2hhcltdW10gcGF0dGVybkFyZ3VtZW50cyA9ICBwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF07CkBAIC00ODksOCArNTE3LDggQEAKIAlpbnQgdHlwZUFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50c0JpbmRpbmcgPT0gbnVsbCA/IDAgOiBhcmd1bWVudHNCaW5kaW5nLmxlbmd0aDsKIAogCS8vIEluaXRpYWxpemUgbWF0Y2ggcnVsZQotCWludCBtYXRjaFJ1bGUgPSBtYXRjaC5nZXRSdWxlKCk7Ci0JaWYgKG1hdGNoLmlzUmF3KCkpIHsKKwlpbnQgbWF0Y2hSdWxlID0gdGhpcy5tYXRjaC5nZXRSdWxlKCk7CisJaWYgKHRoaXMubWF0Y2guaXNSYXcoKSkgewogCQlpZiAocGF0dGVyblR5cGVBcmdzTGVuZ3RoICE9IDApIHsKIAkJCW1hdGNoUnVsZSAmPSB+U2VhcmNoUGF0dGVybi5SX0ZVTExfTUFUQ0g7CiAJCX0KQEAgLTQ5OCwzNCArNTI2LDM0IEBACiAJaWYgKGhhc1R5cGVQYXJhbWV0ZXJzKSB7CiAJCW1hdGNoUnVsZSA9IFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIOwogCX0KLQkKKwogCS8vIENvbXBhcmUgYXJndW1lbnRzIGxlbmd0aGVzCiAJaWYgKHBhdHRlcm5UeXBlQXJnc0xlbmd0aCA9PSB0eXBlQXJndW1lbnRzTGVuZ3RoKSB7Ci0JCWlmICghbWF0Y2guaXNSYXcoKSAmJiBoYXNUeXBlUGFyYW1ldGVycykgeworCQlpZiAoIXRoaXMubWF0Y2guaXNSYXcoKSAmJiBoYXNUeXBlUGFyYW1ldGVycykgewogCQkJLy8gZ2VuZXJpYyBwYXR0ZXJucyBhcmUgYWx3YXlzIG5vdCBjb21wYXRpYmxlIG1hdGNoCi0JCQltYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKKwkJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocGF0dGVyblR5cGVBcmdzTGVuZ3RoPT0wKSB7Ci0JCQlpZiAoIW1hdGNoLmlzUmF3KCkgfHwgaGFzVHlwZVBhcmFtZXRlcnMpIHsKLQkJCQltYXRjaC5zZXRSdWxlKG1hdGNoUnVsZSAmIH5TZWFyY2hQYXR0ZXJuLlJfRlVMTF9NQVRDSCk7CisJCQlpZiAoIXRoaXMubWF0Y2guaXNSYXcoKSB8fCBoYXNUeXBlUGFyYW1ldGVycykgeworCQkJCXRoaXMubWF0Y2guc2V0UnVsZShtYXRjaFJ1bGUgJiB+U2VhcmNoUGF0dGVybi5SX0ZVTExfTUFUQ0gpOwogCQkJfQogCQl9IGVsc2UgIGlmICh0eXBlQXJndW1lbnRzTGVuZ3RoPT0wKSB7CiAJCQkvLyByYXcgYmluZGluZyBpcyBhbHdheXMgY29tcGF0aWJsZQotCQkJbWF0Y2guc2V0UnVsZShtYXRjaFJ1bGUgJiB+U2VhcmNoUGF0dGVybi5SX0ZVTExfTUFUQ0gpOworCQkJdGhpcy5tYXRjaC5zZXRSdWxlKG1hdGNoUnVsZSAmIH5TZWFyY2hQYXR0ZXJuLlJfRlVMTF9NQVRDSCk7CiAJCX0gZWxzZSB7Ci0JCQltYXRjaC5zZXRSdWxlKDApOyAvLyBpbXBvc3NpYmxlIG1hdGNoCisJCQl0aGlzLm1hdGNoLnNldFJ1bGUoMCk7IC8vIGltcG9zc2libGUgbWF0Y2gKIAkJfQogCQlyZXR1cm47CiAJfQogCWlmIChhcmd1bWVudHNCaW5kaW5nID09IG51bGwgfHwgcGF0dGVybkFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCW1hdGNoLnNldFJ1bGUobWF0Y2hSdWxlKTsKKwkJdGhpcy5tYXRjaC5zZXRSdWxlKG1hdGNoUnVsZSk7CiAJCXJldHVybjsKIAl9CiAKIAkvLyBDb21wYXJlIGJpbmRpbmcgZm9yIGVhY2ggdHlwZSBhcmd1bWVudCBvbmx5IGlmIHBhdHRlcm4gaXMgbm90IGVyYXN1cmUgb25seSBhbmQgYXQgZmlyc3QgbGV2ZWwKLQlpZiAoIWhhc1R5cGVQYXJhbWV0ZXJzICYmICFtYXRjaC5pc1JhdygpICYmIChtYXRjaC5pc0VxdWl2YWxlbnQoKSB8fCBtYXRjaC5pc0V4YWN0KCkpKSB7CisJaWYgKCFoYXNUeXBlUGFyYW1ldGVycyAmJiAhdGhpcy5tYXRjaC5pc1JhdygpICYmICh0aGlzLm1hdGNoLmlzRXF1aXZhbGVudCgpIHx8IHRoaXMubWF0Y2guaXNFeGFjdCgpKSkgewogCQlmb3IgKGludCBpPTA7IGk8dHlwZUFyZ3VtZW50c0xlbmd0aDsgaSsrKSB7CiAJCQkvLyBHZXQgcGFyYW1ldGVyaXplZCB0eXBlIGFyZ3VtZW50IGJpbmRpbmcKIAkJCVR5cGVCaW5kaW5nIGFyZ3VtZW50QmluZGluZyA9IGFyZ3VtZW50c0JpbmRpbmdbaV07CkBAIC01NTMsMTIgKzU4MSwxMyBAQAogCQkJCWNhc2UgU2lnbmF0dXJlLkNfU1VQRVIgOgogCQkJCQlwYXR0ZXJuV2lsZGNhcmRLaW5kID0gV2lsZGNhcmQuU1VQRVI7CiAJCQkJCXBhdHRlcm5UeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocGF0dGVyblR5cGVBcmd1bWVudCwgMSwgcGF0dGVyblR5cGVBcmd1bWVudC5sZW5ndGgpOworCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0IDoKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlwYXR0ZXJuVHlwZU5hbWUgPSBTaWduYXR1cmUudG9DaGFyQXJyYXkocGF0dGVyblR5cGVOYW1lKTsKIAkJCVR5cGVCaW5kaW5nIHBhdHRlcm5CaW5kaW5nID0gbG9jYXRvci5nZXRUeXBlKHBhdHRlcm5UeXBlQXJndW1lbnQsIHBhdHRlcm5UeXBlTmFtZSk7Ci0JCQkKKwogCQkJLy8gSWYgaGF2ZSBubyBiaW5kaW5nIGZvciBwYXR0ZXJuIGFyZywgdGhlbiB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlZmluZSBhY2N1cmFjeQogCQkJaWYgKHBhdHRlcm5CaW5kaW5nID09IG51bGwpIHsKIAkJCQlpZiAoYXJndW1lbnRCaW5kaW5nLmlzV2lsZGNhcmQoKSkgewpAQCAtNTY2LDEzICs1OTUsMTMgQEAKIAkJCQkJaWYgKHdpbGRjYXJkQmluZGluZy5ib3VuZEtpbmQgPT0gV2lsZGNhcmQuVU5CT1VORCkgewogCQkJCQkJbWF0Y2hSdWxlICY9IH5TZWFyY2hQYXR0ZXJuLlJfRlVMTF9NQVRDSDsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCW1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOworCQkJCQkJdGhpcy5tYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQogCQkJCX0KIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCQkKKwogCQkJLy8gVmVyaWZ5IHRoYSBwYXR0ZXJuIGJpbmRpbmcgaXMgY29tcGF0aWJsZSB3aXRoIG1hdGNoIHR5cGUgYXJndW1lbnQgYmluZGluZwogCQkJc3dpdGNoIChwYXR0ZXJuV2lsZGNhcmQpIHsKIAkJCQljYXNlIFNpZ25hdHVyZS5DX1NUQVIgOiAvLyBVTkJPVU5EIHBhdHRlcm4KQEAgLTYwMiw3ICs2MzEsNyBAQAogCQkJCQkJCQljb250aW51ZTsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIGlmIChhcmd1bWVudEJpbmRpbmcuaXNDb21wYXRpYmxlV2l0aChwYXR0ZXJuQmluZGluZykpIHsKLQkJCQkJCS8vIHZhbGlkIHdoZW4gYXJnIGlzIGEgc3ViY2xhc3Mgb2YgcGF0dGVybiAKKwkJCQkJCS8vIHZhbGlkIHdoZW4gYXJnIGlzIGEgc3ViY2xhc3Mgb2YgcGF0dGVybgogCQkJCQkJbWF0Y2hSdWxlICY9IH5TZWFyY2hQYXR0ZXJuLlJfRlVMTF9NQVRDSDsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CkBAIC02NjIsMTUgKzY5MSwxNSBAQAogCQkJCQkJY29udGludWU7CiAJCQkJCWJyZWFrOwogCQkJfQotCQkJCisKIAkJCS8vIEFyZ3VtZW50IGRvZXMgbm90IG1hdGNoID0+IGVyYXN1cmUgbWF0Y2ggd2lsbCBiZSB0aGUgb25seSBwb3NzaWJsZSBvbmUKLQkJCW1hdGNoLnNldFJ1bGUoU2VhcmNoUGF0dGVybi5SX0VSQVNVUkVfTUFUQ0gpOworCQkJdGhpcy5tYXRjaC5zZXRSdWxlKFNlYXJjaFBhdHRlcm4uUl9FUkFTVVJFX01BVENIKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAogCS8vIFNldCBtYXRjaCBydWxlCi0JbWF0Y2guc2V0UnVsZShtYXRjaFJ1bGUpOworCXRoaXMubWF0Y2guc2V0UnVsZShtYXRjaFJ1bGUpOwogfQogLyoqCiAgKiBGaW5kcyBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gYmluZGluZyBtYXRjaGVzIHRoaXMgc2VhcmNoIHBhdHRlcm4uCkBAIC02ODQsMTAgKzcxMywxMCBAQAogCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOwogfQogLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIAorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUgcGF0dGVybgogICogYW5kIHF1YWxpZmljYXRpb24gcGF0dGVybi4KICAqIE5vdGUgdGhhdCBmcm9tIHNpbmNlIDMuMSwgdGhpcyBtZXRob2QgcmVzb2x2ZSB0byBhY2N1cmF0ZSBtZW1iZXIgb3IgbG9jYWwgdHlwZXMKLSAqIGV2ZW4gaWYgdGhleSBhcmUgbm90IGZ1bGx5IHF1YWxpZmllZCAoaWUuIFguTWVtYmVyIGluc3RlYWQgb2YgcC5YLk1lbWJlcikuCisgKiBldmVuIGlmIHRoZXkgYXJlIG5vdCBmdWxseSBxdWFsaWZpZWQgKGkuZS4gWC5NZW1iZXIgaW5zdGVhZCBvZiBwLlguTWVtYmVyKS4KICAqIFJldHVybnMgQUNDVVJBVEVfTUFUQ0ggaWYgaXQgZG9lcy4KICAqIFJldHVybnMgSU5BQ0NVUkFURV9NQVRDSCBpZiByZXNvbHZlIGZhaWxlZC4KICAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0LgpAQCAtNjk2LDcgKzcyNSw3IEBACiAvLwlyZXR1cm4gcmVzb2x2ZUxldmVsRm9yVHlwZShxdWFsaWZpZWRQYXR0ZXJuKHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybiksIHR5cGUpOwogCWNoYXJbXSBxdWFsaWZpZWRQYXR0ZXJuID0gZ2V0UXVhbGlmaWVkUGF0dGVybihzaW1wbGVOYW1lUGF0dGVybiwgcXVhbGlmaWNhdGlvblBhdHRlcm4pOwogCWludCBsZXZlbCA9IHJlc29sdmVMZXZlbEZvclR5cGUocXVhbGlmaWVkUGF0dGVybiwgYmluZGluZyk7Ci0JaWYgKGxldmVsID09IEFDQ1VSQVRFX01BVENIIHx8IGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIGxldmVsOworCWlmIChsZXZlbCA9PSBBQ0NVUkFURV9NQVRDSCB8fCBiaW5kaW5nID09IG51bGwgIHx8ICFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiBsZXZlbDsKIAlUeXBlQmluZGluZyB0eXBlID0gYmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZyA/ICgoQXJyYXlCaW5kaW5nKWJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlIDogYmluZGluZzsKIAljaGFyW10gc291cmNlTmFtZSA9IG51bGw7CiAJaWYgKHR5cGUuaXNNZW1iZXJUeXBlKCkgfHwgdHlwZS5pc0xvY2FsVHlwZSgpKSB7CkBAIC03MDksMjUgKzczOCwzNSBAQAogCQlzb3VyY2VOYW1lID0gIGdldFF1YWxpZmllZFNvdXJjZU5hbWUoYmluZGluZyk7CiAJfQogCWlmIChzb3VyY2VOYW1lID09IG51bGwpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwotCWlmICgodGhpcy5tYXRjaE1vZGUgJiBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIKSAhPSAwKSB7Ci0JCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKLQkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKLQkJfQotCX0KLQlpZiAodGhpcy5pc0NhbWVsQ2FzZSkgewotCQlpZiAoIXRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IChxdWFsaWZpZWRQYXR0ZXJuLmxlbmd0aD4wICYmIHNvdXJjZU5hbWUubGVuZ3RoPjAgJiYgcXVhbGlmaWVkUGF0dGVyblswXSA9PSBzb3VyY2VOYW1lWzBdKSkgewotCQkJaWYgKENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gocXVhbGlmaWVkUGF0dGVybiwgc291cmNlTmFtZSkpIHsKKwlzd2l0Y2ggKHRoaXMubWF0Y2hNb2RlKSB7CisJCWNhc2UgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSDoKKwkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKIAkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CiAJCQl9Ci0JCX0KLQkJaWYgKHRoaXMubWF0Y2hNb2RlID09IFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCkgewotCQkJYm9vbGVhbiBtYXRjaFBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7Ci0JCQlyZXR1cm4gbWF0Y2hQYXR0ZXJuID8gQUNDVVJBVEVfTUFUQ0ggOiBJTVBPU1NJQkxFX01BVENIOwotCQl9CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOgorCQkJaWYgKChxdWFsaWZpZWRQYXR0ZXJuLmxlbmd0aD4wICYmIHNvdXJjZU5hbWUubGVuZ3RoPjAgJiYgcXVhbGlmaWVkUGF0dGVyblswXSA9PSBzb3VyY2VOYW1lWzBdKSkgeworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHF1YWxpZmllZFBhdHRlcm4sIHNvdXJjZU5hbWUsIGZhbHNlKSkgeworCQkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQkJfQorCQkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUgJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocXVhbGlmaWVkUGF0dGVybiwgc291cmNlTmFtZSwgZmFsc2UpKSB7CisJCQkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSDoKKwkJCWlmICgocXVhbGlmaWVkUGF0dGVybi5sZW5ndGg+MCAmJiBzb3VyY2VOYW1lLmxlbmd0aD4wICYmIHF1YWxpZmllZFBhdHRlcm5bMF0gPT0gc291cmNlTmFtZVswXSkpIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0cnVlKSkgeworCQkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQl9CiAJfQotCWJvb2xlYW4gbWF0Y2hQYXR0ZXJuID0gQ2hhck9wZXJhdGlvbi5tYXRjaChxdWFsaWZpZWRQYXR0ZXJuLCBzb3VyY2VOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7Ci0JcmV0dXJuIG1hdGNoUGF0dGVybiA/IEFDQ1VSQVRFX01BVENIIDogSU1QT1NTSUJMRV9NQVRDSDsKLQorCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogfQogCiAvKioKQEAgLTczOCw3ICs3NzcsNyBAQAogICovCiBwcm90ZWN0ZWQgaW50IHJlc29sdmVMZXZlbEZvclR5cGUoY2hhcltdIHF1YWxpZmllZFBhdHRlcm4sIFR5cGVCaW5kaW5nIHR5cGUpIHsKIAlpZiAocXVhbGlmaWVkUGF0dGVybiA9PSBudWxsKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7Ci0JaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5pc1ZhbGlkQmluZGluZygpKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKIAogCS8vIFR5cGUgdmFyaWFibGUgY2Fubm90IGJlIHNwZWNpZmllZCB0aHJvdWdoIHBhdHRlcm4gPT4gdGhpcyBraW5kIG9mIGJpbmRpbmcgY2Fubm90IG1hdGNoIGl0IChzZWUgYnVnIDc5ODAzKQogCWlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKCkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwpAQCAtNzY4LDcgKzgwNyw3IEBACiAJaWYgKHR5cGUgPT0gbnVsbCB8fCBwYXR0ZXJuVHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8IHBhdHRlcm5UeXBlQXJndW1lbnRzLmxlbmd0aCA9PSAwIHx8IGRlcHRoID49IHBhdHRlcm5UeXBlQXJndW1lbnRzLmxlbmd0aCkgewogCQlyZXR1cm4gbGV2ZWw7CiAJfQotCQorCiAJLy8gaWYgcGF0dGVybiBpcyBlcmFzdXJlIG1hdGNoIChzZWUgYnVnIDc5NzkwKSwgY29tbXV0ZSBpbXBvc3NpYmxlIHRvIGVyYXN1cmUKIAlpbnQgaW1wb3NzaWJsZSA9IHRoaXMuaXNFcmFzdXJlTWF0Y2ggPyBFUkFTVVJFX01BVENIIDogSU1QT1NTSUJMRV9NQVRDSDsKIApAQCAtNzkwLDEzNiArODI5LDE0MyBAQAogCQl9CiAJCS8vIFRPRE8gKGZyZWRlcmljKSBkbyB3ZSBuZWVkIHRvIHZlcmlmeSBlYWNoIHBhcmFtZXRlcj8KIAkJcmV0dXJuIGxldmVsOyAvLyB3ZSBjYW4ndCBkbyBiZXR0ZXIKLQl9IGVsc2UgaWYgKHR5cGUuaXNSYXdUeXBlKCkpIHsKLQkJcmV0dXJuIGxldmVsOyAvLyByYXcgdHlwZSBhbHdheXMgbWF0Y2gKLQl9IGVsc2UgewotCQlUeXBlQmluZGluZyBsZWFmVHlwZSA9IHR5cGUubGVhZkNvbXBvbmVudFR5cGUoKTsKLQkJaWYgKCFsZWFmVHlwZS5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpIHsKLQkJCS8vIFN0YW5kYXJkIHR5cGVzIChpZS4gbmVpdGhlciBnZW5lcmljIG5vciBwYXJhbWV0ZXJpemVkIG5vciByYXcgdHlwZXMpCi0JCQkvLyBjYW5ub3QgbWF0Y2ggcGF0dGVybiB3aXRoIHR5cGUgcGFyYW1ldGVycyBvciBhcmd1bWVudHMKLQkJCXJldHVybiAocGF0dGVyblR5cGVBcmd1bWVudHNbZGVwdGhdPT1udWxsIHx8IHBhdHRlcm5UeXBlQXJndW1lbnRzW2RlcHRoXS5sZW5ndGg9PTApID8gbGV2ZWwgOiBJTVBPU1NJQkxFX01BVENIOwotCQl9Ci0JCVBhcmFtZXRlcml6ZWRUeXBlQmluZGluZyBwYXJhbVR5cGVCaW5kaW5nID0gKFBhcmFtZXRlcml6ZWRUeXBlQmluZGluZykgbGVhZlR5cGU7CisJfQogCi0JCS8vIENvbXBhcmUgYXJndW1lbnRzIG9ubHkgaWYgdGhlcmUgb25lcyBvbiBib3RoIHNpZGVzCi0JCWlmIChwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF0gIT0gbnVsbCAmJiBwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF0ubGVuZ3RoID4gMCAmJgotCQkJcGFyYW1UeXBlQmluZGluZy5hcmd1bWVudHMgIT0gbnVsbCAmJiBwYXJhbVR5cGVCaW5kaW5nLmFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisJLy8gcmF3IHR5cGUgYWx3YXlzIG1hdGNoCisJaWYgKHR5cGUuaXNSYXdUeXBlKCkpIHsKKwkJcmV0dXJuIGxldmVsOworCX0KIAotCQkJLy8gdHlwZSBwYXJhbWV0ZXJzIGxlbmd0aCBtdXN0IG1hdGNoIGF0IGxlYXN0IHNwZWNpZmllZCB0eXBlIG5hbWVzIGxlbmd0aAotCQkJaW50IGxlbmd0aCA9IHBhdHRlcm5UeXBlQXJndW1lbnRzW2RlcHRoXS5sZW5ndGg7Ci0JCQlpZiAocGFyYW1UeXBlQmluZGluZy5hcmd1bWVudHMubGVuZ3RoICE9IGxlbmd0aCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Ci0JCi0JCQkvLyB2ZXJpZnkgZWFjaCBwYXR0ZXJuIHR5cGUgcGFyYW1ldGVyCi0JCQluZXh0VHlwZUFyZ3VtZW50OiBmb3IgKGludCBpPSAwOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCQkJY2hhcltdIHBhdHRlcm5UeXBlQXJndW1lbnQgPSBwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF1baV07Ci0JCQkJVHlwZUJpbmRpbmcgYXJnVHlwZUJpbmRpbmcgPSBwYXJhbVR5cGVCaW5kaW5nLmFyZ3VtZW50c1tpXTsKLQkJCQkvLyBnZXQgY29ycmVzcG9uZGluZyBwYXR0ZXJuIHdpbGRjYXJkCi0JCQkJc3dpdGNoIChwYXR0ZXJuVHlwZUFyZ3VtZW50WzBdKSB7Ci0JCQkJCWNhc2UgU2lnbmF0dXJlLkNfU1RBUiA6IC8vIHVuYm91bmQgcGFyYW1ldGVyIGFsd2F5cyBtYXRjaAotCQkJCQljYXNlIFNpZ25hdHVyZS5DX1NVUEVSIDogLy8gbmVlZHMgcGF0dGVybiB0eXBlIHBhcmFtZXRlciBiaW5kaW5nCi0JCQkJCQkvLyBza2lwIHRvIG5leHQgdHlwZSBhcmd1bWVudCBhcyBpdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyCi0JCQkJCQljb250aW51ZSBuZXh0VHlwZUFyZ3VtZW50OwotCQkJCQljYXNlIFNpZ25hdHVyZS5DX0VYVEVORFMgOgotCQkJCQkJLy8gcmVtb3ZlIHdpbGRjYXJkIGZyb20gcGF0dGVyIHR5cGUgYXJndW1lbnQKLQkJCQkJCXBhdHRlcm5UeXBlQXJndW1lbnQgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhdHRlcm5UeXBlQXJndW1lbnQsIDEsIHBhdHRlcm5UeXBlQXJndW1lbnQubGVuZ3RoKTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkvLyBubyB3aWxkY2FyZAotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIGdldCBwYXR0ZXJuIHR5cGUgYXJndW1lbnQgZnJvbSBpdHMgc2lnbmF0dXJlCi0JCQkJcGF0dGVyblR5cGVBcmd1bWVudCA9IFNpZ25hdHVyZS50b0NoYXJBcnJheShwYXR0ZXJuVHlwZUFyZ3VtZW50KTsKLQkJCQlpZiAoIXRoaXMuaXNDYXNlU2Vuc2l0aXZlKSBwYXR0ZXJuVHlwZUFyZ3VtZW50ID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwYXR0ZXJuVHlwZUFyZ3VtZW50KTsKLQkJCQlib29sZWFuIHBhdHRlcm5UeXBlQXJnSGFzQW55Q2hhcnMgPSBDaGFyT3BlcmF0aW9uLmNvbnRhaW5zKG5ldyBjaGFyW10geycqJywgJz8nfSwgcGF0dGVyblR5cGVBcmd1bWVudCk7Ci0JCi0JCQkJLy8gVmVyaWZ5IHRoYXQgbmFtZXMgbWF0Y2guLi4KLQkJCQkvLyAuLi5zcGVjaWFsIGNhc2UgZm9yIHdpbGRjYXJkCi0JCQkJaWYgKGFyZ1R5cGVCaW5kaW5nIGluc3RhbmNlb2YgQ2FwdHVyZUJpbmRpbmcpIHsKLQkJCQkJV2lsZGNhcmRCaW5kaW5nIGNhcHR1cmVkV2lsZGNhcmQgPSAoKENhcHR1cmVCaW5kaW5nKWFyZ1R5cGVCaW5kaW5nKS53aWxkY2FyZDsKLQkJCQkJaWYgKGNhcHR1cmVkV2lsZGNhcmQgIT0gbnVsbCkgYXJnVHlwZUJpbmRpbmcgPSBjYXB0dXJlZFdpbGRjYXJkOwotCQkJCX0KLQkJCQlpZiAoYXJnVHlwZUJpbmRpbmcuaXNXaWxkY2FyZCgpKSB7Ci0JCQkJCVdpbGRjYXJkQmluZGluZyB3aWxkY2FyZEJpbmRpbmcgPSAoV2lsZGNhcmRCaW5kaW5nKSBhcmdUeXBlQmluZGluZzsKLQkJCQkJc3dpdGNoICh3aWxkY2FyZEJpbmRpbmcuYm91bmRLaW5kKSB7Ci0JCQkJCQljYXNlIFdpbGRjYXJkLkVYVEVORFM6Ci0JCQkJCQkJLy8gSW52YWxpZCBpZiB0eXBlIGFyZ3VtZW50IGlzIG5vdCBleGFjdAotCQkJCQkJCWlmIChwYXR0ZXJuVHlwZUFyZ0hhc0FueUNoYXJzKSByZXR1cm4gaW1wb3NzaWJsZTsKLQkJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKLQkJCQkJCQkvLyB0aGVyZSdzIG5vIGJvdW5kIG5hbWUgdG8gbWF0Y2ggPT4gdmFsaWQKLQkJCQkJCQljb250aW51ZSBuZXh0VHlwZUFyZ3VtZW50OwotCQkJCQl9Ci0JCQkJCS8vIExvb2sgaWYgYm91bmQgbmFtZSBtYXRjaCBwYXR0ZXJuIHR5cGUgYXJndW1lbnQKLQkJCQkJUmVmZXJlbmNlQmluZGluZyBib3VuZEJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgd2lsZGNhcmRCaW5kaW5nLmJvdW5kOwotCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuVHlwZUFyZ3VtZW50LCBib3VuZEJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHx8Ci0JCQkJCQlDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5yZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7Ci0JCQkJCQkvLyBmb3VuZCBuYW1lIGluIGhpZXJhcmNoeSA9PiBtYXRjaAotCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKLQkJCQkJfQorCS8vIFN0YW5kYXJkIHR5cGVzIChpLmUuIG5laXRoZXIgZ2VuZXJpYyBub3IgcGFyYW1ldGVyaXplZCBub3IgcmF3IHR5cGVzKQorCS8vIGNhbm5vdCBtYXRjaCBwYXR0ZXJuIHdpdGggdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cworCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gdHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCWlmICghbGVhZlR5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKSB7CisJCXJldHVybiAocGF0dGVyblR5cGVBcmd1bWVudHNbZGVwdGhdPT1udWxsIHx8IHBhdHRlcm5UeXBlQXJndW1lbnRzW2RlcHRoXS5sZW5ndGg9PTApID8gbGV2ZWwgOiBJTVBPU1NJQkxFX01BVENIOworCX0KIAotCQkJCQkvLyBJZiBwYXR0ZXJuIGlzIG5vdCBleGFjdCB0aGVuIG1hdGNoIGZhaWxzCi0JCQkJCWlmIChwYXR0ZXJuVHlwZUFyZ0hhc0FueUNoYXJzKSByZXR1cm4gaW1wb3NzaWJsZTsKLQkJCQkJCQotCQkJCQkvLyBMb29rIGZvciBib3VuZCBuYW1lIGluIHR5cGUgYXJndW1lbnQgc3VwZXJjbGFzc2VzCi0JCQkJCWJvdW5kQmluZGluZyA9IGJvdW5kQmluZGluZy5zdXBlcmNsYXNzKCk7Ci0JCQkJCXdoaWxlIChib3VuZEJpbmRpbmcgIT0gbnVsbCkgewotCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5zaG9ydFJlYWRhYmxlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkgfHwKLQkJCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuVHlwZUFyZ3VtZW50LCBib3VuZEJpbmRpbmcucmVhZGFibGVOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgewotCQkJCQkJCS8vIGZvdW5kIG5hbWUgaW4gaGllcmFyY2h5ID0+IG1hdGNoCi0JCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKLQkJCQkJCX0gZWxzZSBpZiAoYm91bmRCaW5kaW5nLmlzTG9jYWxUeXBlKCkgfHwgYm91bmRCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQkJCQkJLy8gZm9yIGxvY2FsIG9yIG1lbWJlciB0eXBlLCB2ZXJpZnkgYWxzbyBzb3VyY2UgbmFtZSAoYnVnIDgxMDg0KQotCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5zb3VyY2VOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkKLQkJCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKLQkJCQkJCX0KLQkJCQkJCWJvdW5kQmluZGluZyA9IGJvdW5kQmluZGluZy5zdXBlcmNsYXNzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGltcG9zc2libGU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIFNlZSBpZiBuYW1lcyBtYXRjaAotCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5UeXBlQXJndW1lbnQsIGFyZ1R5cGVCaW5kaW5nLnNob3J0UmVhZGFibGVOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSB8fAotCQkJCQlDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5UeXBlQXJndW1lbnQsIGFyZ1R5cGVCaW5kaW5nLnJlYWRhYmxlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkvLyBQYXJhbWV0ZXJpemVkIHR5cGUKKwlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1UeXBlQmluZGluZyA9IChQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcpIGxlYWZUeXBlOworCisJLy8gQ29tcGFyZSBhcmd1bWVudHMgb25seSBpZiB0aGVyZSBvbmVzIG9uIGJvdGggc2lkZXMKKwlpZiAocGF0dGVyblR5cGVBcmd1bWVudHNbZGVwdGhdICE9IG51bGwgJiYgcGF0dGVyblR5cGVBcmd1bWVudHNbZGVwdGhdLmxlbmd0aCA+IDAgJiYKKwkJcGFyYW1UeXBlQmluZGluZy5hcmd1bWVudHMgIT0gbnVsbCAmJiBwYXJhbVR5cGVCaW5kaW5nLmFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisKKwkJLy8gdHlwZSBwYXJhbWV0ZXJzIGxlbmd0aCBtdXN0IG1hdGNoIGF0IGxlYXN0IHNwZWNpZmllZCB0eXBlIG5hbWVzIGxlbmd0aAorCQlpbnQgbGVuZ3RoID0gcGF0dGVyblR5cGVBcmd1bWVudHNbZGVwdGhdLmxlbmd0aDsKKwkJaWYgKHBhcmFtVHlwZUJpbmRpbmcuYXJndW1lbnRzLmxlbmd0aCAhPSBsZW5ndGgpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCisJCS8vIHZlcmlmeSBlYWNoIHBhdHRlcm4gdHlwZSBwYXJhbWV0ZXIKKwkJbmV4dFR5cGVBcmd1bWVudDogZm9yIChpbnQgaT0gMDsgaTxsZW5ndGg7IGkrKykgeworCQkJY2hhcltdIHBhdHRlcm5UeXBlQXJndW1lbnQgPSBwYXR0ZXJuVHlwZUFyZ3VtZW50c1tkZXB0aF1baV07CisJCQlUeXBlQmluZGluZyBhcmdUeXBlQmluZGluZyA9IHBhcmFtVHlwZUJpbmRpbmcuYXJndW1lbnRzW2ldOworCQkJLy8gZ2V0IGNvcnJlc3BvbmRpbmcgcGF0dGVybiB3aWxkY2FyZAorCQkJc3dpdGNoIChwYXR0ZXJuVHlwZUFyZ3VtZW50WzBdKSB7CisJCQkJY2FzZSBTaWduYXR1cmUuQ19TVEFSIDogLy8gdW5ib3VuZCBwYXJhbWV0ZXIgYWx3YXlzIG1hdGNoCisJCQkJY2FzZSBTaWduYXR1cmUuQ19TVVBFUiA6IC8vIG5lZWRzIHBhdHRlcm4gdHlwZSBwYXJhbWV0ZXIgYmluZGluZworCQkJCQkvLyBza2lwIHRvIG5leHQgdHlwZSBhcmd1bWVudCBhcyBpdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyCiAJCQkJCWNvbnRpbnVlIG5leHRUeXBlQXJndW1lbnQ7Ci0JCQkJfSBlbHNlIGlmIChhcmdUeXBlQmluZGluZy5pc0xvY2FsVHlwZSgpIHx8IGFyZ1R5cGVCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQkJCS8vIGZvciBsb2NhbCBvciBtZW1iZXIgdHlwZSwgdmVyaWZ5IGFsc28gc291cmNlIG5hbWUgKGJ1ZyA4MTA4NCkKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVyblR5cGVBcmd1bWVudCwgYXJnVHlwZUJpbmRpbmcuc291cmNlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpCisJCQkJY2FzZSBTaWduYXR1cmUuQ19FWFRFTkRTIDoKKwkJCQkJLy8gcmVtb3ZlIHdpbGRjYXJkIGZyb20gcGF0dGVyIHR5cGUgYXJndW1lbnQKKwkJCQkJcGF0dGVyblR5cGVBcmd1bWVudCA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocGF0dGVyblR5cGVBcmd1bWVudCwgMSwgcGF0dGVyblR5cGVBcmd1bWVudC5sZW5ndGgpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJLy8gbm8gd2lsZGNhcmQKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBnZXQgcGF0dGVybiB0eXBlIGFyZ3VtZW50IGZyb20gaXRzIHNpZ25hdHVyZQorCQkJcGF0dGVyblR5cGVBcmd1bWVudCA9IFNpZ25hdHVyZS50b0NoYXJBcnJheShwYXR0ZXJuVHlwZUFyZ3VtZW50KTsKKwkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHBhdHRlcm5UeXBlQXJndW1lbnQgPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBhdHRlcm5UeXBlQXJndW1lbnQpOworCQkJYm9vbGVhbiBwYXR0ZXJuVHlwZUFyZ0hhc0FueUNoYXJzID0gQ2hhck9wZXJhdGlvbi5jb250YWlucyhuZXcgY2hhcltdIHsnKicsICc/J30sIHBhdHRlcm5UeXBlQXJndW1lbnQpOworCisJCQkvLyBWZXJpZnkgdGhhdCBuYW1lcyBtYXRjaC4uLgorCQkJLy8gLi4uc3BlY2lhbCBjYXNlIGZvciB3aWxkY2FyZAorCQkJaWYgKGFyZ1R5cGVCaW5kaW5nIGluc3RhbmNlb2YgQ2FwdHVyZUJpbmRpbmcpIHsKKwkJCQlXaWxkY2FyZEJpbmRpbmcgY2FwdHVyZWRXaWxkY2FyZCA9ICgoQ2FwdHVyZUJpbmRpbmcpYXJnVHlwZUJpbmRpbmcpLndpbGRjYXJkOworCQkJCWlmIChjYXB0dXJlZFdpbGRjYXJkICE9IG51bGwpIGFyZ1R5cGVCaW5kaW5nID0gY2FwdHVyZWRXaWxkY2FyZDsKKwkJCX0KKwkJCWlmIChhcmdUeXBlQmluZGluZy5pc1dpbGRjYXJkKCkpIHsKKwkJCQlXaWxkY2FyZEJpbmRpbmcgd2lsZGNhcmRCaW5kaW5nID0gKFdpbGRjYXJkQmluZGluZykgYXJnVHlwZUJpbmRpbmc7CisJCQkJc3dpdGNoICh3aWxkY2FyZEJpbmRpbmcuYm91bmRLaW5kKSB7CisJCQkJCWNhc2UgV2lsZGNhcmQuRVhURU5EUzoKKwkJCQkJCS8vIEludmFsaWQgaWYgdHlwZSBhcmd1bWVudCBpcyBub3QgZXhhY3QKKwkJCQkJCWlmIChwYXR0ZXJuVHlwZUFyZ0hhc0FueUNoYXJzKSByZXR1cm4gaW1wb3NzaWJsZTsKIAkJCQkJCWNvbnRpbnVlIG5leHRUeXBlQXJndW1lbnQ7CisJCQkJCWNhc2UgV2lsZGNhcmQuVU5CT1VORDoKKwkJCQkJCS8vIHRoZXJlJ3Mgbm8gYm91bmQgbmFtZSB0byBtYXRjaCA9PiB2YWxpZAorCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKKwkJCQl9CisJCQkJLy8gTG9vayBpZiBib3VuZCBuYW1lIG1hdGNoIHBhdHRlcm4gdHlwZSBhcmd1bWVudAorCQkJCVJlZmVyZW5jZUJpbmRpbmcgYm91bmRCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHdpbGRjYXJkQmluZGluZy5ib3VuZDsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuVHlwZUFyZ3VtZW50LCBib3VuZEJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHx8CisJCQkJCUNoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVyblR5cGVBcmd1bWVudCwgYm91bmRCaW5kaW5nLnJlYWRhYmxlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQkJLy8gZm91bmQgbmFtZSBpbiBoaWVyYXJjaHkgPT4gbWF0Y2gKKwkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKIAkJCQl9CiAKIAkJCQkvLyBJZiBwYXR0ZXJuIGlzIG5vdCBleGFjdCB0aGVuIG1hdGNoIGZhaWxzCiAJCQkJaWYgKHBhdHRlcm5UeXBlQXJnSGFzQW55Q2hhcnMpIHJldHVybiBpbXBvc3NpYmxlOwogCi0JCQkJLy8gU2NhbiBoaWVyYXJjaHkKLQkJCQlUeXBlQmluZGluZyBsZWFmVHlwZUJpbmRpbmcgPSBhcmdUeXBlQmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSgpOwotCQkJCWlmIChsZWFmVHlwZUJpbmRpbmcuaXNCYXNlVHlwZSgpKSByZXR1cm4gaW1wb3NzaWJsZTsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZkJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGxlYWZUeXBlQmluZGluZykuc3VwZXJjbGFzcygpOwotCQkJCXdoaWxlIChyZWZCaW5kaW5nICE9IG51bGwpIHsKLQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIHJlZkJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHx8Ci0JCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuVHlwZUFyZ3VtZW50LCByZWZCaW5kaW5nLnJlYWRhYmxlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQkvLyBMb29rIGZvciBib3VuZCBuYW1lIGluIHR5cGUgYXJndW1lbnQgc3VwZXJjbGFzc2VzCisJCQkJYm91bmRCaW5kaW5nID0gYm91bmRCaW5kaW5nLnN1cGVyY2xhc3MoKTsKKwkJCQl3aGlsZSAoYm91bmRCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5zaG9ydFJlYWRhYmxlTmFtZSgpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkgfHwKKwkJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5yZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CiAJCQkJCQkvLyBmb3VuZCBuYW1lIGluIGhpZXJhcmNoeSA9PiBtYXRjaAogCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKLQkJCQkJfSBlbHNlIGlmIChyZWZCaW5kaW5nLmlzTG9jYWxUeXBlKCkgfHwgcmVmQmluZGluZy5pc01lbWJlclR5cGUoKSkgeworCQkJCQl9IGVsc2UgaWYgKGJvdW5kQmluZGluZy5pc0xvY2FsVHlwZSgpIHx8IGJvdW5kQmluZGluZy5pc01lbWJlclR5cGUoKSkgewogCQkJCQkJLy8gZm9yIGxvY2FsIG9yIG1lbWJlciB0eXBlLCB2ZXJpZnkgYWxzbyBzb3VyY2UgbmFtZSAoYnVnIDgxMDg0KQotCQkJCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVyblR5cGVBcmd1bWVudCwgcmVmQmluZGluZy5zb3VyY2VOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm5UeXBlQXJndW1lbnQsIGJvdW5kQmluZGluZy5zb3VyY2VOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkKIAkJCQkJCQljb250aW51ZSBuZXh0VHlwZUFyZ3VtZW50OwogCQkJCQl9Ci0JCQkJCXJlZkJpbmRpbmcgPSByZWZCaW5kaW5nLnN1cGVyY2xhc3MoKTsKKwkJCQkJYm91bmRCaW5kaW5nID0gYm91bmRCaW5kaW5nLnN1cGVyY2xhc3MoKTsKIAkJCQl9CiAJCQkJcmV0dXJuIGltcG9zc2libGU7CiAJCQl9CisKKwkJCS8vIFNlZSBpZiBuYW1lcyBtYXRjaAorCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVyblR5cGVBcmd1bWVudCwgYXJnVHlwZUJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHx8CisJCQkJQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuVHlwZUFyZ3VtZW50LCBhcmdUeXBlQmluZGluZy5yZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKKwkJCX0gZWxzZSBpZiAoYXJnVHlwZUJpbmRpbmcuaXNMb2NhbFR5cGUoKSB8fCBhcmdUeXBlQmluZGluZy5pc01lbWJlclR5cGUoKSkgeworCQkJCS8vIGZvciBsb2NhbCBvciBtZW1iZXIgdHlwZSwgdmVyaWZ5IGFsc28gc291cmNlIG5hbWUgKGJ1ZyA4MTA4NCkKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuVHlwZUFyZ3VtZW50LCBhcmdUeXBlQmluZGluZy5zb3VyY2VOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkKKwkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKKwkJCX0KKworCQkJLy8gSWYgcGF0dGVybiBpcyBub3QgZXhhY3QgdGhlbiBtYXRjaCBmYWlscworCQkJaWYgKHBhdHRlcm5UeXBlQXJnSGFzQW55Q2hhcnMpIHJldHVybiBpbXBvc3NpYmxlOworCisJCQkvLyBTY2FuIGhpZXJhcmNoeQorCQkJVHlwZUJpbmRpbmcgbGVhZlR5cGVCaW5kaW5nID0gYXJnVHlwZUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKTsKKwkJCWlmIChsZWFmVHlwZUJpbmRpbmcuaXNCYXNlVHlwZSgpKSByZXR1cm4gaW1wb3NzaWJsZTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9ICgoUmVmZXJlbmNlQmluZGluZykgbGVhZlR5cGVCaW5kaW5nKS5zdXBlcmNsYXNzKCk7CisJCQl3aGlsZSAocmVmQmluZGluZyAhPSBudWxsKSB7CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIHJlZkJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHx8CisJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKHBhdHRlcm5UeXBlQXJndW1lbnQsIHJlZkJpbmRpbmcucmVhZGFibGVOYW1lKCksIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCQkvLyBmb3VuZCBuYW1lIGluIGhpZXJhcmNoeSA9PiBtYXRjaAorCQkJCQljb250aW51ZSBuZXh0VHlwZUFyZ3VtZW50OworCQkJCX0gZWxzZSBpZiAocmVmQmluZGluZy5pc0xvY2FsVHlwZSgpIHx8IHJlZkJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCQkJLy8gZm9yIGxvY2FsIG9yIG1lbWJlciB0eXBlLCB2ZXJpZnkgYWxzbyBzb3VyY2UgbmFtZSAoYnVnIDgxMDg0KQorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChwYXR0ZXJuVHlwZUFyZ3VtZW50LCByZWZCaW5kaW5nLnNvdXJjZU5hbWUoKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKQorCQkJCQkJY29udGludWUgbmV4dFR5cGVBcmd1bWVudDsKKwkJCQl9CisJCQkJcmVmQmluZGluZyA9IHJlZkJpbmRpbmcuc3VwZXJjbGFzcygpOworCQkJfQorCQkJcmV0dXJuIGltcG9zc2libGU7CiAJCX0KLQkJCi0JCS8vIFJlY3Vyc2Ugb24gZW5jbG9zaW5nIHR5cGUKLQkJVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHBhcmFtVHlwZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOwotCQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGUuaXNQYXJhbWV0ZXJpemVkVHlwZSgpICYmIGRlcHRoIDwgcGF0dGVyblR5cGVBcmd1bWVudHMubGVuZ3RoICYmIHF1YWxpZmljYXRpb25QYXR0ZXJuICE9IG51bGwpIHsKLQkJCWludCBsYXN0RG90ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHF1YWxpZmljYXRpb25QYXR0ZXJuKTsKLQkJCWNoYXJbXSBlbmNsb3NpbmdRdWFsaWZpY2F0aW9uUGF0dGVybiA9IGxhc3REb3Q9PS0xID8gbnVsbCA6IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWNhdGlvblBhdHRlcm4sIDAsIGxhc3REb3QpOwotCQkJY2hhcltdIGVuY2xvc2luZ1NpbXBsZU5hbWVQYXR0ZXJuID0gbGFzdERvdD09LTEgPyBxdWFsaWZpY2F0aW9uUGF0dGVybiA6IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWNhdGlvblBhdHRlcm4sIGxhc3REb3QrMSwgcXVhbGlmaWNhdGlvblBhdHRlcm4ubGVuZ3RoKTsKLQkJCWludCBlbmNsb3NpbmdMZXZlbCA9IHJlc29sdmVMZXZlbEZvclR5cGUoZW5jbG9zaW5nU2ltcGxlTmFtZVBhdHRlcm4sIGVuY2xvc2luZ1F1YWxpZmljYXRpb25QYXR0ZXJuLCBwYXR0ZXJuVHlwZUFyZ3VtZW50cywgZGVwdGgrMSwgZW5jbG9zaW5nVHlwZSk7Ci0JCQlpZiAoZW5jbG9zaW5nTGV2ZWwgPT0gaW1wb3NzaWJsZSkgcmV0dXJuIGltcG9zc2libGU7Ci0JCQlpZiAoZW5jbG9zaW5nTGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Ci0JCX0KLQkJcmV0dXJuIGxldmVsOwogCX0KKworCS8vIFJlY3Vyc2Ugb24gZW5jbG9zaW5nIHR5cGUKKwlUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gcGFyYW1UeXBlQmluZGluZy5lbmNsb3NpbmdUeXBlKCk7CisJaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSAmJiBkZXB0aCA8IHBhdHRlcm5UeXBlQXJndW1lbnRzLmxlbmd0aCAmJiBxdWFsaWZpY2F0aW9uUGF0dGVybiAhPSBudWxsKSB7CisJCWludCBsYXN0RG90ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHF1YWxpZmljYXRpb25QYXR0ZXJuKTsKKwkJY2hhcltdIGVuY2xvc2luZ1F1YWxpZmljYXRpb25QYXR0ZXJuID0gbGFzdERvdD09LTEgPyBudWxsIDogQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpY2F0aW9uUGF0dGVybiwgMCwgbGFzdERvdCk7CisJCWNoYXJbXSBlbmNsb3NpbmdTaW1wbGVOYW1lUGF0dGVybiA9IGxhc3REb3Q9PS0xID8gcXVhbGlmaWNhdGlvblBhdHRlcm4gOiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHF1YWxpZmljYXRpb25QYXR0ZXJuLCBsYXN0RG90KzEsIHF1YWxpZmljYXRpb25QYXR0ZXJuLmxlbmd0aCk7CisJCWludCBlbmNsb3NpbmdMZXZlbCA9IHJlc29sdmVMZXZlbEZvclR5cGUoZW5jbG9zaW5nU2ltcGxlTmFtZVBhdHRlcm4sIGVuY2xvc2luZ1F1YWxpZmljYXRpb25QYXR0ZXJuLCBwYXR0ZXJuVHlwZUFyZ3VtZW50cywgZGVwdGgrMSwgZW5jbG9zaW5nVHlwZSk7CisJCWlmIChlbmNsb3NpbmdMZXZlbCA9PSBpbXBvc3NpYmxlKSByZXR1cm4gaW1wb3NzaWJsZTsKKwkJaWYgKGVuY2xvc2luZ0xldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0KKwlyZXR1cm4gbGV2ZWw7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CiAJcmV0dXJuICJTZWFyY2hQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Qb3NzaWJsZU1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1Bvc3NpYmxlTWF0Y2guamF2YQppbmRleCAwOTA2ZWQwLi5kYzM0NTBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1Bvc3NpYmxlTWF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1Bvc3NpYmxlTWF0Y2guamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMyw2ICsyMyw3IEBACiBwdWJsaWMgY2xhc3MgUG9zc2libGVNYXRjaCBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXQgewogCiBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19TT1VSQ0VfRklMRV9OQU1FID0gIk5PIFNPVVJDRSBGSUxFIE5BTUUiOyAvLyROT04tTkxTLTEkCitwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBOT19TT1VSQ0VfRklMRSA9IG5ldyBjaGFyWzBdOwogCiBwdWJsaWMgSVJlc291cmNlIHJlc291cmNlOwogcHVibGljIE9wZW5hYmxlIG9wZW5hYmxlOwpAQCAtMzIsNiArMzMsNyBAQAogcHVibGljIFNlYXJjaERvY3VtZW50IGRvY3VtZW50OwogcHJpdmF0ZSBTdHJpbmcgc291cmNlRmlsZU5hbWU7CiBwcml2YXRlIGNoYXJbXSBzb3VyY2U7Citwcml2YXRlIFBvc3NpYmxlTWF0Y2ggc2ltaWxhck1hdGNoOwogCiBwdWJsaWMgUG9zc2libGVNYXRjaChNYXRjaExvY2F0b3IgbG9jYXRvciwgSVJlc291cmNlIHJlc291cmNlLCBPcGVuYWJsZSBvcGVuYWJsZSwgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gbXVzdFJlc29sdmUpIHsKIAl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CkBAIC01OSwxNyArNjEsMjMgQEAKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5jb21wb3VuZE5hbWUsICgoUG9zc2libGVNYXRjaCkgb2JqKS5jb21wb3VuZE5hbWUpOwogfQogcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKLQlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbCkgcmV0dXJuIHRoaXMuc291cmNlOworCWNoYXJbXSBjb250ZW50cyA9ICh0aGlzLnNvdXJjZSA9PSBOT19TT1VSQ0VfRklMRSkgPyBudWxsIDogdGhpcy5zb3VyY2U7CisJaWYgKHRoaXMuc291cmNlID09IG51bGwpIHsKKwkJaWYgKHRoaXMub3BlbmFibGUgaW5zdGFuY2VvZiBDbGFzc0ZpbGUpIHsKKwkJCVN0cmluZyBmaWxlTmFtZSA9IGdldFNvdXJjZUZpbGVOYW1lKCk7CisJCQlpZiAoZmlsZU5hbWUgPT0gTk9fU09VUkNFX0ZJTEVfTkFNRSkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAotCWlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgQ2xhc3NGaWxlKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldFNvdXJjZUZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSA9PSBOT19TT1VSQ0VfRklMRV9OQU1FKSByZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwotCi0JCVNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXIgPSB0aGlzLm9wZW5hYmxlLmdldFNvdXJjZU1hcHBlcigpOwotCQlJVHlwZSB0eXBlID0gKChDbGFzc0ZpbGUpIHRoaXMub3BlbmFibGUpLmdldFR5cGUoKTsKLQkJcmV0dXJuIHRoaXMuc291cmNlID0gc291cmNlTWFwcGVyLmZpbmRTb3VyY2UodHlwZSwgZmlsZU5hbWUpOworCQkJU291cmNlTWFwcGVyIHNvdXJjZU1hcHBlciA9IHRoaXMub3BlbmFibGUuZ2V0U291cmNlTWFwcGVyKCk7CisJCQlpZiAoc291cmNlTWFwcGVyICE9IG51bGwpIHsKKwkJCQlJVHlwZSB0eXBlID0gKChDbGFzc0ZpbGUpIHRoaXMub3BlbmFibGUpLmdldFR5cGUoKTsKKwkJCQljb250ZW50cyA9IHNvdXJjZU1hcHBlci5maW5kU291cmNlKHR5cGUsIGZpbGVOYW1lKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnRlbnRzID0gdGhpcy5kb2N1bWVudC5nZXRDaGFyQ29udGVudHMoKTsKKwkJfQorCQl0aGlzLnNvdXJjZSA9IChjb250ZW50cyA9PSBudWxsKSA/IE5PX1NPVVJDRV9GSUxFIDogY29udGVudHM7CiAJfQotCXJldHVybiB0aGlzLnNvdXJjZSA9IHRoaXMuZG9jdW1lbnQuZ2V0Q2hhckNvbnRlbnRzKCk7CisJcmV0dXJuIGNvbnRlbnRzOwogfQogLyoqCiAgKiBUaGUgZXhhY3Qgb3BlbmFibGUgZmlsZSBuYW1lLiBJbiBwYXJ0aWN1bGFyLCB3aWxsIGJlIHRoZSBvcmlnaW5hdGluZyAuY2xhc3MgZmlsZSBmb3IgYmluYXJ5IG9wZW5hYmxlIHdpdGggYXR0YWNoZWQKQEAgLTExNCw2ICsxMjIsOSBAQAogCX0KIAlyZXR1cm4gbnVsbDsKIH0KK1Bvc3NpYmxlTWF0Y2ggZ2V0U2ltaWxhck1hdGNoKCkgeworCXJldHVybiB0aGlzLnNpbWlsYXJNYXRjaDsKK30KIC8qCiAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgZmlsZSBuYW1lIG9mIHRoZSBjbGFzcyBmaWxlLgogICogUmV0dXJucyBOT19TT1VSQ0VfRklMRV9OQU1FIGlmIG5vdCBmb3VuZC4KQEAgLTEyMSw3ICsxMzIsNyBAQAogcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSB7CiAJaWYgKHRoaXMuc291cmNlRmlsZU5hbWUgIT0gbnVsbCkgcmV0dXJuIHRoaXMuc291cmNlRmlsZU5hbWU7CiAKLQl0aGlzLnNvdXJjZUZpbGVOYW1lID0gTk9fU09VUkNFX0ZJTEVfTkFNRTsgCisJdGhpcy5zb3VyY2VGaWxlTmFtZSA9IE5PX1NPVVJDRV9GSUxFX05BTUU7CiAJaWYgKHRoaXMub3BlbmFibGUuZ2V0U291cmNlTWFwcGVyKCkgIT0gbnVsbCkgewogCQlCaW5hcnlUeXBlIHR5cGUgPSAoQmluYXJ5VHlwZSkgKChDbGFzc0ZpbGUpIHRoaXMub3BlbmFibGUpLmdldFR5cGUoKTsKIAkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IE1hdGNoTG9jYXRvci5jbGFzc0ZpbGVSZWFkZXIodHlwZSk7CkBAIC0xMzEsNyArMTQyLDEwIEBACiAJCX0KIAl9CiAJcmV0dXJuIHRoaXMuc291cmNlRmlsZU5hbWU7Ci19CQorfQorYm9vbGVhbiBoYXNTaW1pbGFyTWF0Y2goKSB7CisJcmV0dXJuIHRoaXMuc2ltaWxhck1hdGNoICE9IG51bGwgJiYgdGhpcy5zb3VyY2UgPT0gTk9fU09VUkNFX0ZJTEU7Cit9CiBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCWlmICh0aGlzLmNvbXBvdW5kTmFtZSA9PSBudWxsKSByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKIApAQCAtMTQwLDYgKzE1NCwxMiBAQAogCQloYXNoQ29kZSArPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHRoaXMuY29tcG91bmROYW1lW2ldKTsKIAlyZXR1cm4gaGFzaENvZGU7CiB9Cit2b2lkIHNldFNpbWlsYXJNYXRjaChQb3NzaWJsZU1hdGNoIHBvc3NpYmxlTWF0Y2gpIHsKKwkvLyBzb3VyY2UgZG9lcyBub3QgbWF0dGVyIG9uIHNpbWlsYXIgbWF0Y2ggYXMgaXQgaXMgcmVhZCBvbgorCS8vIHRoZSBmaXJzdCBzdG9yZWQgcG9zc2libGUgbWF0Y2gKKwlwb3NzaWJsZU1hdGNoLnNvdXJjZSA9IE5PX1NPVVJDRV9GSUxFOworCXRoaXMuc2ltaWxhck1hdGNoID0gcG9zc2libGVNYXRjaDsKK30KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuIHRoaXMub3BlbmFibGUgPT0gbnVsbCA/ICJGYWtlIFBvc3NpYmxlTWF0Y2giIDogdGhpcy5vcGVuYWJsZS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1Bvc3NpYmxlTWF0Y2hTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUG9zc2libGVNYXRjaFNldC5qYXZhCmluZGV4IDM3NzUzYmQuLmRmOGVmNzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUG9zc2libGVNYXRjaFNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUG9zc2libGVNYXRjaFNldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI3LDggKzI3LDE1IEBACiAJSVBhdGggcGF0aCA9IHBvc3NpYmxlTWF0Y2gub3BlbmFibGUuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldFBhdGgoKTsKIAlPYmplY3RWZWN0b3IgcG9zc2libGVNYXRjaGVzID0gKE9iamVjdFZlY3RvcikgdGhpcy5yb290c1RvUG9zc2libGVNYXRjaGVzLmdldChwYXRoKTsKIAlpZiAocG9zc2libGVNYXRjaGVzICE9IG51bGwpIHsKLQkJaWYgKHBvc3NpYmxlTWF0Y2hlcy5jb250YWlucyhwb3NzaWJsZU1hdGNoKSkgcmV0dXJuOwotCX0gZWxzZSB7CisJCVBvc3NpYmxlTWF0Y2ggc3RvcmVkTWF0Y2ggPSAoUG9zc2libGVNYXRjaCkgcG9zc2libGVNYXRjaGVzLmZpbmQocG9zc2libGVNYXRjaCk7CisJCWlmIChzdG9yZWRNYXRjaCAhPSBudWxsKSB7CisJCQl3aGlsZSAoc3RvcmVkTWF0Y2guZ2V0U2ltaWxhck1hdGNoKCkgIT0gbnVsbCkgeworCQkJCXN0b3JlZE1hdGNoID0gc3RvcmVkTWF0Y2guZ2V0U2ltaWxhck1hdGNoKCk7CisJCQl9CisJCQlzdG9yZWRNYXRjaC5zZXRTaW1pbGFyTWF0Y2gocG9zc2libGVNYXRjaCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2V7CiAJCXRoaXMucm9vdHNUb1Bvc3NpYmxlTWF0Y2hlcy5wdXQocGF0aCwgcG9zc2libGVNYXRjaGVzID0gbmV3IE9iamVjdFZlY3RvcigpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9RdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggOTU0N2U3Mi4uNDJmMGU3ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9RdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9RdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsOSArMTIsOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOwogCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIFR5cGVEZWNsYXJhdGlvblBhdHRlcm4gaW1wbGVtZW50cyBJSW5kZXhDb25zdGFudHMgeworcHVibGljIGNsYXNzIFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb25QYXR0ZXJuIHsKIAogcHVibGljIGNoYXJbXSBxdWFsaWZpY2F0aW9uOwogUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybiBwYWNrYWdlUGF0dGVybjsKQEAgLTIzLDExICsyMiwxMSBAQAogcHVibGljIFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4oY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSBzaW1wbGVOYW1lLCBjaGFyIHR5cGVTdWZmaXgsIGludCBtYXRjaFJ1bGUpIHsKIAl0aGlzKG1hdGNoUnVsZSk7CiAKLQl0aGlzLnF1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUoKSA/IHF1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHF1YWxpZmljYXRpb24pOwotCXRoaXMuc2ltcGxlTmFtZSA9IChpc0Nhc2VTZW5zaXRpdmUoKSB8fCBpc0NhbWVsQ2FzZSgpKSAgPyBzaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzaW1wbGVOYW1lKTsKKwl0aGlzLnF1YWxpZmljYXRpb24gPSB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA/IHF1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHF1YWxpZmljYXRpb24pOworCXRoaXMuc2ltcGxlTmFtZSA9ICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCB0aGlzLmlzQ2FtZWxDYXNlKSA/IHNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNpbXBsZU5hbWUpOwogCXRoaXMudHlwZVN1ZmZpeCA9IHR5cGVTdWZmaXg7CiAKLQkoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzKS5tdXN0UmVzb2x2ZSA9IHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsIHx8IHR5cGVTdWZmaXggIT0gVFlQRV9TVUZGSVg7CisJdGhpcy5tdXN0UmVzb2x2ZSA9IHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsIHx8IHR5cGVTdWZmaXggIT0gVFlQRV9TVUZGSVg7CiB9CiBwdWJsaWMgUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybihjaGFyW10gcXVhbGlmaWNhdGlvbiwgaW50IHF1YWxpZmljYXRpb25NYXRjaFJ1bGUsIGNoYXJbXSBzaW1wbGVOYW1lLCBjaGFyIHR5cGVTdWZmaXgsIGludCBtYXRjaFJ1bGUpIHsKIAl0aGlzKHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWUsIHR5cGVTdWZmaXgsIG1hdGNoUnVsZSk7CkBAIC04Miw5ICs4MSw5IEBACiB9CiBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzRGVjb2RlZEtleShTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuKSB7CiAJUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybiBwYXR0ZXJuID0gKFF1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4pIGRlY29kZWRQYXR0ZXJuOwotCQorCiAJLy8gY2hlY2sgdHlwZSBzdWZmaXgKLQlpZiAodGhpcy50eXBlU3VmZml4ICE9IHBhdHRlcm4udHlwZVN1ZmZpeCAmJiB0eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYKSB7CisJaWYgKHRoaXMudHlwZVN1ZmZpeCAhPSBwYXR0ZXJuLnR5cGVTdWZmaXggJiYgdGhpcy50eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYKSB7CiAJCWlmICghbWF0Y2hEaWZmZXJlbnRUeXBlU3VmZml4ZXModGhpcy50eXBlU3VmZml4LCBwYXR0ZXJuLnR5cGVTdWZmaXgpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTEyMSwxMyArMTIwLDEzIEBACiAJCQlvdXRwdXQuYXBwZW5kKCJUeXBlRGVjbGFyYXRpb25QYXR0ZXJuOiBxdWFsaWZpY2F0aW9uPCIpOyAvLyROT04tTkxTLTEkCiAJCQlicmVhazsKIAl9Ci0JaWYgKHRoaXMucXVhbGlmaWNhdGlvbiAhPSBudWxsKSAKKwlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpCiAJCW91dHB1dC5hcHBlbmQodGhpcy5xdWFsaWZpY2F0aW9uKTsKIAllbHNlCiAJCW91dHB1dC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAogCW91dHB1dC5hcHBlbmQoIj4sIHR5cGU8Iik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoc2ltcGxlTmFtZSAhPSBudWxsKSAKLQkJb3V0cHV0LmFwcGVuZChzaW1wbGVOYW1lKTsKKwlpZiAodGhpcy5zaW1wbGVOYW1lICE9IG51bGwpCisJCW91dHB1dC5hcHBlbmQodGhpcy5zaW1wbGVOYW1lKTsKIAllbHNlCiAJCW91dHB1dC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAogCW91dHB1dC5hcHBlbmQoIj4gIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU2Vjb25kYXJ5VHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWNvbmRhcnlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggNWVhYTRkNC4uZjY3MTRhOCAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWNvbmRhcnlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWNvbmRhcnlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JSW5kZXhDb25zdGFudHM7CiAKIHB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUeXBlRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uUGF0dGVybiB7Ci0JCisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VDT05EQVJZX1BBVFRFUk5fS0VZID0gIiovUyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCiBwdWJsaWMgU2Vjb25kYXJ5VHlwZURlY2xhcmF0aW9uUGF0dGVybigpIHsKQEAgLTQwLDggKzQwLDggQEAKIC8qIChub24tSmF2YWRvYykKICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLlR5cGVEZWNsYXJhdGlvblBhdHRlcm4jcXVlcnlJbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleCkKICAqLwotRW50cnlSZXN1bHRbXSBxdWVyeUluKEluZGV4IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworcHVibGljIEVudHJ5UmVzdWx0W10gcXVlcnlJbihJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlyZXR1cm4gaW5kZXgucXVlcnkoQ0FURUdPUklFUywgU0VDT05EQVJZX1BBVFRFUk5fS0VZLCBSX1BBVFRFUk5fTUFUQ0ggfCBSX0NBU0VfU0VOU0lUSVZFKTsKIH0KLQkKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhCmluZGV4IGU4ODk4YTQuLjhlYWU4NzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BU1RWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LkFjY2Vzc1J1bGVTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CkBAIC00NCwxOSArNDUsMTkgQEAKIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgewogCQkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CiAJCQlpZiAoU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5tYXRjaGVzKGJpbmRpbmcpKQotCQkJCVN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLnRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOworCQkJCWNvbGxlY3RTdXBlclR5cGVOYW1lcyhiaW5kaW5nKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlKSB7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24uYmluZGluZzsKIAkJCWlmIChTdXBlclR5cGVOYW1lc0NvbGxlY3Rvci50aGlzLm1hdGNoZXMoYmluZGluZykpCi0JCQkJU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5jb2xsZWN0U3VwZXJUeXBlTmFtZXMoYmluZGluZyk7CisJCQkJY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgewogCQkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nID0gbWVtYmVyVHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CiAJCQlpZiAoU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5tYXRjaGVzKGJpbmRpbmcpKQotCQkJCVN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLnRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOworCQkJCWNvbGxlY3RTdXBlclR5cGVOYW1lcyhiaW5kaW5nKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgTWV0aG9kU2NvcGUgc2NvcGUpIHsKQEAgLTc2LDcgKzc3LDcgQEAKIGNoYXJbXSB0eXBlU2ltcGxlTmFtZTsKIGNoYXJbXSB0eXBlUXVhbGlmaWNhdGlvbjsKIE1hdGNoTG9jYXRvciBsb2NhdG9yOwotSVR5cGUgdHlwZTsgCitJVHlwZSB0eXBlOwogSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7CiBjaGFyW11bXVtdIHJlc3VsdDsKIGludCByZXN1bHRJbmRleDsKQEAgLTg2LDcgKzg3LDcgQEAKIAljaGFyW10gdHlwZVNpbXBsZU5hbWUsCiAJY2hhcltdIHR5cGVRdWFsaWZpY2F0aW9uLAogCU1hdGNoTG9jYXRvciBsb2NhdG9yLAotCUlUeXBlIHR5cGUsIAorCUlUeXBlIHR5cGUsCiAJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKIAogCXRoaXMucGF0dGVybiA9IHBhdHRlcm47CkBAIC0xMTQsNyArMTE1LDcgQEAKIAlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQpIGNvbXBpbGF0aW9uVW5pdDsKIAogCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDEsIDEsIDApOwotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSAKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0KIAkJaXNUb3BMZXZlbE9yTWVtYmVyID8KIAkJCXRoaXMubG9jYXRvci5iYXNpY1BhcnNlcigpLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCkgOgogCQkJdGhpcy5sb2NhdG9yLmJhc2ljUGFyc2VyKCkucGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQpOwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IGJ1aWxkQmluZGluZ3ModW5pdCwgaXNUb3BMZXZlbE9yTWVtYmVyKTsKIAkJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CiAJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IG5ldyBBU1ROb2RlRmluZGVyKHBhcnNlZFVuaXQpLmZpbmRUeXBlKHRoaXMudHlwZSk7Ci0JCQkJCWlmICh0eXBlRGVjbCAhPSBudWxsICYmIHR5cGVEZWNsLmJpbmRpbmcgIT0gbnVsbCkgCisJCQkJCWlmICh0eXBlRGVjbCAhPSBudWxsICYmIHR5cGVEZWNsLmJpbmRpbmcgIT0gbnVsbCkKIAkJCQkJCWNvbGxlY3RTdXBlclR5cGVOYW1lcyh0eXBlRGVjbC5iaW5kaW5nKTsKIAkJCQl9CiAJCQl9CkBAIC0xNjIsMTAgKzE2MywxMCBAQAogCX0KIAogCS8vIENvbGxlY3QgdGhlIHBhdGhzIG9mIHRoZSBjdXMgdGhhdCBkZWNsYXJlIGEgdHlwZSB3aGljaCBtYXRjaGVzIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gKyBkZWNsYXJpbmdTaW1wbGVOYW1lCi0JU3RyaW5nW10gcGF0aHMgPSB0aGlzLmdldFBhdGhzT2ZEZWNsYXJpbmdUeXBlKCk7CisJU3RyaW5nW10gcGF0aHMgPSBnZXRQYXRoc09mRGVjbGFyaW5nVHlwZSgpOwogCWlmIChwYXRocyA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAotCS8vIENyZWF0ZSBiaW5kaW5ncyBmcm9tIHNvdXJjZSB0eXBlcyBhbmQgYmluYXJ5IHR5cGVzIGFuZCBjb2xsZWN0IHN1cGVyIHR5cGUgbmFtZXMgb2YgdGhlIHR5cGUgZGVjbGFyYXRpb24gCisJLy8gQ3JlYXRlIGJpbmRpbmdzIGZyb20gc291cmNlIHR5cGVzIGFuZCBiaW5hcnkgdHlwZXMgYW5kIGNvbGxlY3Qgc3VwZXIgdHlwZSBuYW1lcyBvZiB0aGUgdHlwZSBkZWNsYXJhdGlvbgogCS8vIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGRlY2xhcmluZyB0eXBlCiAJVXRpbC5zb3J0KHBhdGhzKTsgLy8gc29ydCBieSBwcm9qZWN0cwogCUphdmFQcm9qZWN0IHByZXZpb3VzUHJvamVjdCA9IG51bGw7CkBAIC0yMDgsMTYgKzIwOSwxNiBAQAogcHJvdGVjdGVkIHZvaWQgY29sbGVjdFN1cGVyVHlwZU5hbWVzKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZykgewogCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IGJpbmRpbmcuc3VwZXJjbGFzcygpOwogCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKLQkJdGhpcy5hZGRUb1Jlc3VsdChzdXBlcmNsYXNzLmNvbXBvdW5kTmFtZSk7Ci0JCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKHN1cGVyY2xhc3MpOworCQlhZGRUb1Jlc3VsdChzdXBlcmNsYXNzLmNvbXBvdW5kTmFtZSk7CisJCWNvbGxlY3RTdXBlclR5cGVOYW1lcyhzdXBlcmNsYXNzKTsKIAl9CiAKIAlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGJpbmRpbmcuc3VwZXJJbnRlcmZhY2VzKCk7CiAJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKIAkJCVJlZmVyZW5jZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA9IGludGVyZmFjZXNbaV07Ci0JCQl0aGlzLmFkZFRvUmVzdWx0KGludGVyZmFjZUJpbmRpbmcuY29tcG91bmROYW1lKTsKLQkJCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGludGVyZmFjZUJpbmRpbmcpOworCQkJYWRkVG9SZXN1bHQoaW50ZXJmYWNlQmluZGluZy5jb21wb3VuZE5hbWUpOworCQkJY29sbGVjdFN1cGVyVHlwZU5hbWVzKGludGVyZmFjZUJpbmRpbmcpOwogCQl9CiAJfQogfQpAQCAtMjI2LDcgKzIyNyw3IEBACiAKIAlmaW5hbCBQYXRoQ29sbGVjdG9yIHBhdGhDb2xsZWN0b3IgPSBuZXcgUGF0aENvbGxlY3RvcigpOwogCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKTsKLQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7CiAJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gbmV3IFR5cGVEZWNsYXJhdGlvblBhdHRlcm4oCiAJCXRoaXMudHlwZVNpbXBsZU5hbWUgIT0gbnVsbCA/IG51bGwgOiB0aGlzLnR5cGVRdWFsaWZpY2F0aW9uLCAvLyB1c2UgdGhlIHF1YWxpZmljYXRpb24gb25seSBpZiBubyBzaW1wbGUgbmFtZQogCQludWxsLCAvLyBkbyBmaW5kIG1lbWJlciB0eXBlcwpAQCAtMjQwLDE3ICsyNDEsMTcgQEAKIAkJCQlwYXRoQ29sbGVjdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLCBpbmRleFJlY29yZCwgcGFydGljaXBhbnQsIGFjY2Vzcyk7CiAJCQl9CiAJCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JfTsJCQorCQl9CisJfTsKIAogCWluZGV4TWFuYWdlci5wZXJmb3JtQ29uY3VycmVudEpvYigKIAkJbmV3IFBhdHRlcm5TZWFyY2hKb2IoCi0JCQlzZWFyY2hQYXR0ZXJuLCAKKwkJCXNlYXJjaFBhdHRlcm4sCiAJCQluZXcgSmF2YVNlYXJjaFBhcnRpY2lwYW50KCksCi0JCQlzY29wZSwgCisJCQlzY29wZSwKIAkJCXNlYXJjaFJlcXVlc3RvciksCiAJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILAotCQlwcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMTAwKSk7CisJCXRoaXMucHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLnByb2dyZXNzTW9uaXRvciwgMTAwKSk7CiAJcmV0dXJuIHBhdGhDb2xsZWN0b3IuZ2V0UGF0aHMoKTsKIH0KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoY2hhcltdW10gY29tcG91bmROYW1lKSB7CkBAIC0yNzIsNyArMjczLDcgQEAKIAlpbnQgZG9sbGFyID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgc2ltcGxlTmFtZSk7CiAJaWYgKGRvbGxhciA9PSAtMSkgcmV0dXJuIGZhbHNlOwogCWNvbXBvdW5kTmFtZVtsYXN0XSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2ltcGxlTmFtZSwgMCwgZG9sbGFyKTsKLQljb21wb3VuZE5hbWVbbGVuZ3RoXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2ltcGxlTmFtZSwgZG9sbGFyKzEsIHNpbXBsZU5hbWUubGVuZ3RoKTsgCisJY29tcG91bmROYW1lW2xlbmd0aF0gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpbXBsZU5hbWUsIGRvbGxhcisxLCBzaW1wbGVOYW1lLmxlbmd0aCk7CiAJcmV0dXJuIHRoaXMubWF0Y2hlcyhjb21wb3VuZE5hbWUpOwogfQogcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlUmVmZXJlbmNlTG9jYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VMb2NhdG9yLmphdmEKaW5kZXggODU3MzMwYy4uMTE0MzY4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VMb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VMb2NhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzQsOCArMzQsOSBAQAogLy9wdWJsaWMgaW50IG1hdGNoKFJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgLSBTS0lQIElUCiAvL3B1YmxpYyBpbnQgbWF0Y2goVHlwZURlY2xhcmF0aW9uIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSAtIFNLSVAgSVQKIHB1YmxpYyBpbnQgbWF0Y2goVHlwZVJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgeworCWlmICh0aGlzLmZsYXZvcnMgIT0gU1VQRVJUWVBFX1JFRl9GTEFWT1IpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCWlmICh0aGlzLnBhdHRlcm4uc3VwZXJTaW1wbGVOYW1lID09IG51bGwpCi0JCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKKwkJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CiAKIAljaGFyW10gdHlwZVJlZlNpbXBsZU5hbWUgPSBudWxsOwogCWlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgewpAQCAtNDMsOSArNDQsOSBAQAogCX0gZWxzZSB7IC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UKIAkJY2hhcltdW10gdG9rZW5zID0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSBub2RlKS50b2tlbnM7CiAJCXR5cGVSZWZTaW1wbGVOYW1lID0gdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV07Ci0JfQkJCQkKKwl9CiAJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5zdXBlclNpbXBsZU5hbWUsIHR5cGVSZWZTaW1wbGVOYW1lKSkKLQkJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOworCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKIAogCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogfQpAQCAtNzcsOSArNzgsMTQgQEAKIAlpZiAoIShub2RlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCiAJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKFR5cGVSZWZlcmVuY2UpIG5vZGU7Ci0JVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGVSZWYucmVzb2x2ZWRUeXBlOwotCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOwotCXJldHVybiByZXNvbHZlTGV2ZWxGb3JUeXBlKHRoaXMucGF0dGVybi5zdXBlclNpbXBsZU5hbWUsIHRoaXMucGF0dGVybi5zdXBlclF1YWxpZmljYXRpb24sIGJpbmRpbmcpOworCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZVJlZi5yZXNvbHZlZFR5cGU7CisJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKQorCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKSB0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7CisJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpCisJCXR5cGVCaW5kaW5nID0gKChQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmcpLmNsb3Nlc3RNYXRjaCgpOworCisJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgIXR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCXJldHVybiByZXNvbHZlTGV2ZWxGb3JUeXBlKHRoaXMucGF0dGVybi5zdXBlclNpbXBsZU5hbWUsIHRoaXMucGF0dGVybi5zdXBlclF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKIH0KIHB1YmxpYyBpbnQgcmVzb2x2ZUxldmVsKEJpbmRpbmcgYmluZGluZykgewogCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCA5NDgwOTgzLi42ODdlY2NmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiwxMCArMjIsMTAgQEAKIHB1YmxpYyBjaGFyW10gc3VwZXJTaW1wbGVOYW1lOwogcHVibGljIGNoYXIgc3VwZXJDbGFzc09ySW50ZXJmYWNlOwogCi0vLyBzZXQgdG8gQ0xBU1NfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGNsYXNzZXMgCisvLyBzZXQgdG8gQ0xBU1NfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGNsYXNzZXMKIC8vIHNldCB0byBJTlRFUkZBQ0VfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGludGVyZmFjZXMKIC8vIHNldCB0byBUWVBFX1NVRkZJWCBmb3IgbWF0Y2hpbmcgYm90aCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCi1wdWJsaWMgY2hhciB0eXBlU3VmZml4OyAKK3B1YmxpYyBjaGFyIHR5cGVTdWZmaXg7CiBwdWJsaWMgY2hhcltdIHBrZ05hbWU7CiBwdWJsaWMgY2hhcltdIHNpbXBsZU5hbWU7CiBwdWJsaWMgY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lOwpAQCAtODAsNyArODAsNyBAQAogCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChlbmNsb3NpbmdUeXBlTmFtZXMsICckJyk7CiAJaWYgKHN1cGVyUXVhbGlmaWNhdGlvbiAhPSBudWxsICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHN1cGVyUXVhbGlmaWNhdGlvbiwgcGFja2FnZU5hbWUpKQogCQlwYWNrYWdlTmFtZSA9IE9ORV9aRVJPOyAvLyBzYXZlIHNvbWUgc3BhY2UKLQkKKwogCWNoYXJbXSB0eXBlUGFyYW1ldGVycyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlpbnQgdHlwZVBhcmFtZXRlcnNMZW5ndGggPSAwOwogCWlmICh0eXBlUGFyYW1ldGVyU2lnbmF0dXJlcyAhPSBudWxsKSB7CkBAIC0xNTAsOSArMTUwLDkgQEAKIAogCXRoaXMobWF0Y2hSdWxlKTsKIAotCXRoaXMuc3VwZXJRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyBzdXBlclF1YWxpZmljYXRpb24gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHN1cGVyUXVhbGlmaWNhdGlvbik7Ci0JdGhpcy5zdXBlclNpbXBsZU5hbWUgPSAoaXNDYXNlU2Vuc2l0aXZlKCkgfHwgaXNDYW1lbENhc2UoKSkgID8gc3VwZXJTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzdXBlclNpbXBsZU5hbWUpOwotCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gc3VwZXJRdWFsaWZpY2F0aW9uICE9IG51bGw7CisJdGhpcy5zdXBlclF1YWxpZmljYXRpb24gPSB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA/IHN1cGVyUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc3VwZXJRdWFsaWZpY2F0aW9uKTsKKwl0aGlzLnN1cGVyU2ltcGxlTmFtZSA9ICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCB0aGlzLmlzQ2FtZWxDYXNlKSA/IHN1cGVyU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc3VwZXJTaW1wbGVOYW1lKTsKKwl0aGlzLm11c3RSZXNvbHZlID0gc3VwZXJRdWFsaWZpY2F0aW9uICE9IG51bGw7CiAJdGhpcy5zdXBlclJlZktpbmQgPSBzdXBlclJlZktpbmQ7CiB9CiBwdWJsaWMgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybigKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJdGhpcyhzdXBlclF1YWxpZmljYXRpb24sIHN1cGVyU2ltcGxlTmFtZSwgc3VwZXJSZWZLaW5kLCBtYXRjaFJ1bGUpOwogCXRoaXMudHlwZVN1ZmZpeCA9IHR5cGVTdWZmaXg7Ci0JKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcykubXVzdFJlc29sdmUgPSBzdXBlclF1YWxpZmljYXRpb24gIT0gbnVsbCB8fCB0eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYOworCXRoaXMubXVzdFJlc29sdmUgPSBzdXBlclF1YWxpZmljYXRpb24gIT0gbnVsbCB8fCB0eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYOwogfQogU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybihpbnQgbWF0Y2hSdWxlKSB7CiAJc3VwZXIoU1VQRVJfUkVGX1BBVFRFUk4sIG1hdGNoUnVsZSk7CkBAIC0yMzAsMTAgKzIzMCwxMCBAQAogfQogcHVibGljIGJvb2xlYW4gbWF0Y2hlc0RlY29kZWRLZXkoU2VhcmNoUGF0dGVybiBkZWNvZGVkUGF0dGVybikgewogCVN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4gcGF0dGVybiA9IChTdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuKSBkZWNvZGVkUGF0dGVybjsKLQlpZiAodGhpcy5zdXBlclJlZktpbmQgPT0gT05MWV9TVVBFUl9DTEFTU0VTICYmIHBhdHRlcm4uZW5jbG9zaW5nVHlwZU5hbWUgIT0gT05FX1pFUk8vKm5vdCBhbiBhbm9ueW1vdXMqLykgCisJaWYgKHRoaXMuc3VwZXJSZWZLaW5kID09IE9OTFlfU1VQRVJfQ0xBU1NFUyAmJiBwYXR0ZXJuLmVuY2xvc2luZ1R5cGVOYW1lICE9IE9ORV9aRVJPLypub3QgYW4gYW5vbnltb3VzKi8pCiAJCS8vIGNvbnNpZGVyIGVudW1lcmF0aW9ucyBhcyBjbGFzc2VzLCByZWplY3QgaW50ZXJmYWNlcyBhbmQgYW5ub3RhdGlvbnMKLQkJaWYgKHBhdHRlcm4uc3VwZXJDbGFzc09ySW50ZXJmYWNlID09IElOVEVSRkFDRV9TVUZGSVggCi0JCQl8fCBwYXR0ZXJuLnN1cGVyQ2xhc3NPckludGVyZmFjZSA9PSBBTk5PVEFUSU9OX1RZUEVfU1VGRklYKSAKKwkJaWYgKHBhdHRlcm4uc3VwZXJDbGFzc09ySW50ZXJmYWNlID09IElOVEVSRkFDRV9TVUZGSVgKKwkJCXx8IHBhdHRlcm4uc3VwZXJDbGFzc09ySW50ZXJmYWNlID09IEFOTk9UQVRJT05fVFlQRV9TVUZGSVgpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAocGF0dGVybi5zdXBlclF1YWxpZmljYXRpb24gIT0gbnVsbCkKQEAgLTI0MSwxNCArMjQxLDEzIEBACiAKIAlyZXR1cm4gbWF0Y2hlc05hbWUodGhpcy5zdXBlclNpbXBsZU5hbWUsIHBhdHRlcm4uc3VwZXJTaW1wbGVOYW1lKTsKIH0KLUVudHJ5UmVzdWx0W10gcXVlcnlJbihJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKK3B1YmxpYyBFbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJY2hhcltdIGtleSA9IHRoaXMuc3VwZXJTaW1wbGVOYW1lOyAvLyBjYW4gYmUgbnVsbAogCWludCBtYXRjaFJ1bGUgPSBnZXRNYXRjaFJ1bGUoKTsKIAogCS8vIGNhbm5vdCBpbmNsdWRlIHRoZSBzdXBlclF1YWxpZmljYXRpb24gc2luY2UgaXQgbWF5IG5vdCBleGlzdCBpbiB0aGUgaW5kZXgKIAlzd2l0Y2goZ2V0TWF0Y2hNb2RlKCkpIHsKIAkJY2FzZSBSX0VYQUNUX01BVENIIDoKLQkJCWlmICh0aGlzLmlzQ2FtZWxDYXNlKSBicmVhazsKIAkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHN1cGVyU2ltcGxlTmFtZQogCQkJbWF0Y2hSdWxlICY9IH5SX0VYQUNUX01BVENIOwogCQkJbWF0Y2hSdWxlIHw9IFJfUFJFRklYX01BVENIOwpAQCAtMjY0LDYgKzI2MywxMCBAQAogCQljYXNlIFJfUkVHRVhQX01BVENIIDoKIAkJCS8vIFRPRE8gKGZyZWRlcmljKSBpbXBsZW1lbnQgcmVndWxhciBleHByZXNzaW9uIG1hdGNoCiAJCQlicmVhazsKKwkJY2FzZSBSX0NBTUVMQ0FTRV9NQVRDSDoKKwkJY2FzZSBSX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQkvLyBkbyBhIHByZWZpeCBxdWVyeSB3aXRoIHRoZSBzdXBlclNpbXBsZU5hbWUKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiBpbmRleC5xdWVyeShnZXRJbmRleENhdGVnb3JpZXMoKSwga2V5LCBtYXRjaFJ1bGUpOyAvLyBtYXRjaCBydWxlIGlzIGlycmVsZXZhbnQgd2hlbiB0aGUga2V5IGlzIG51bGwKQEAgLTI4MCw4ICsyODMsOCBAQAogCQkJb3V0cHV0LmFwcGVuZCgiU3VwZXJDbGFzc1JlZmVyZW5jZVBhdHRlcm46IDwiKTsgLy8kTk9OLU5MUy0xJAogCQkJYnJlYWs7CiAJfQotCWlmIChzdXBlclNpbXBsZU5hbWUgIT0gbnVsbCkgCi0JCW91dHB1dC5hcHBlbmQoc3VwZXJTaW1wbGVOYW1lKTsKKwlpZiAodGhpcy5zdXBlclNpbXBsZU5hbWUgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnN1cGVyU2ltcGxlTmFtZSk7CiAJZWxzZQogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAlvdXRwdXQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uTG9jYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25Mb2NhdG9yLmphdmEKaW5kZXggM2U3YWY4Yi4uYmRiZDEyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25Mb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25Mb2NhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzMsNyArMzMsNyBAQAogLy9wdWJsaWMgaW50IG1hdGNoKFJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgLSBTS0lQIElUCiBwdWJsaWMgaW50IG1hdGNoKFR5cGVEZWNsYXJhdGlvbiBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgewogCWlmICh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSA9PSBudWxsIHx8IG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5zaW1wbGVOYW1lLCBub2RlLm5hbWUpKQotCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogCiAJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiB9CkBAIC04NSw3ICs4NSw3IEBACiAJfQogfQogLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIAorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUgcGF0dGVybgogICogcXVhbGlmaWNhdGlvbiBwYXR0ZXJuIGFuZCBlbmNsb3NpbmcgdHlwZSBuYW1lIHBhdHRlcm4uCiAgKi8KIHByb3RlY3RlZCBpbnQgcmVzb2x2ZUxldmVsRm9yVHlwZShjaGFyW10gc2ltcGxlTmFtZVBhdHRlcm4sIGNoYXJbXSBxdWFsaWZpY2F0aW9uUGF0dGVybiwgY2hhcltdIGVuY2xvc2luZ05hbWVQYXR0ZXJuLCBUeXBlQmluZGluZyB0eXBlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IDRhZjYzYWUuLmVhODEzZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIzLDEyICsyMywxMiBAQAogcHVibGljIGNoYXJbXSBwa2c7CiBwdWJsaWMgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzOwogCi0vLyBzZXQgdG8gQ0xBU1NfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGNsYXNzZXMgCisvLyBzZXQgdG8gQ0xBU1NfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGNsYXNzZXMKIC8vIHNldCB0byBJTlRFUkZBQ0VfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGludGVyZmFjZXMKIC8vIHNldCB0byBFTlVNX1NVRkZJWCBmb3Igb25seSBtYXRjaGluZyBlbnVtcwogLy8gc2V0IHRvIEFOTk9UQVRJT05fVFlQRV9TVUZGSVggZm9yIG9ubHkgbWF0Y2hpbmcgYW5ub3RhdGlvbiB0eXBlcwogLy8gc2V0IHRvIFRZUEVfU1VGRklYIGZvciBtYXRjaGluZyBib3RoIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKLXB1YmxpYyBjaGFyIHR5cGVTdWZmaXg7IAorcHVibGljIGNoYXIgdHlwZVN1ZmZpeDsKIHB1YmxpYyBpbnQgbW9kaWZpZXJzOwogcHVibGljIGJvb2xlYW4gc2Vjb25kYXJ5ID0gZmFsc2U7CiAKQEAgLTUyLDI1ICs1MiwyNSBAQAogfQogCiBjaGFyW10gYWRkKGNoYXJbXSBuYW1lKSB7Ci0JaW50IGxlbmd0aCA9IG5hbWVzLmxlbmd0aDsKKwlpbnQgbGVuZ3RoID0gdGhpcy5uYW1lcy5sZW5ndGg7CiAJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShuYW1lKSAlIGxlbmd0aDsKIAljaGFyW10gY3VycmVudDsKLQl3aGlsZSAoKGN1cnJlbnQgPSBuYW1lc1tpbmRleF0pICE9IG51bGwpIHsKKwl3aGlsZSAoKGN1cnJlbnQgPSB0aGlzLm5hbWVzW2luZGV4XSkgIT0gbnVsbCkgewogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudCwgbmFtZSkpIHJldHVybiBjdXJyZW50OwogCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIGluZGV4ID0gMDsKIAl9Ci0JbmFtZXNbaW5kZXhdID0gbmFtZTsKKwl0aGlzLm5hbWVzW2luZGV4XSA9IG5hbWU7CiAKIAkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCi0JaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpIHJlaGFzaCgpOworCWlmICgrK3RoaXMuZWxlbWVudFNpemUgPiB0aGlzLnRocmVzaG9sZCkgcmVoYXNoKCk7CiAJcmV0dXJuIG5hbWU7CiB9CiAKIHZvaWQgcmVoYXNoKCkgewotCVBhY2thZ2VOYW1lU2V0IG5ld1NldCA9IG5ldyBQYWNrYWdlTmFtZVNldChlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCVBhY2thZ2VOYW1lU2V0IG5ld1NldCA9IG5ldyBQYWNrYWdlTmFtZVNldCh0aGlzLmVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCiAJY2hhcltdIGN1cnJlbnQ7Ci0JZm9yIChpbnQgaSA9IG5hbWVzLmxlbmd0aDsgLS1pID49IDA7KQotCQlpZiAoKGN1cnJlbnQgPSBuYW1lc1tpXSkgIT0gbnVsbCkKKwlmb3IgKGludCBpID0gdGhpcy5uYW1lcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50ID0gdGhpcy5uYW1lc1tpXSkgIT0gbnVsbCkKIAkJCW5ld1NldC5hZGQoY3VycmVudCk7CiAKIAl0aGlzLm5hbWVzID0gbmV3U2V0Lm5hbWVzOwpAQCAtMTQwLDggKzE0MCw4IEBACiAKIAl0aGlzKG1hdGNoUnVsZSk7CiAKLQl0aGlzLnBrZyA9IGlzQ2FzZVNlbnNpdGl2ZSgpID8gcGtnIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShwa2cpOwotCWlmIChpc0Nhc2VTZW5zaXRpdmUoKSB8fCBlbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCkgeworCXRoaXMucGtnID0gdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPyBwa2cgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBrZyk7CisJaWYgKHRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IGVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsKSB7CiAJCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzID0gZW5jbG9zaW5nVHlwZU5hbWVzOwogCX0gZWxzZSB7CiAJCWludCBsZW5ndGggPSBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoOwpAQCAtMTQ5LDEwICsxNDksMTAgQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKIAkJCXRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzW2ldID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShlbmNsb3NpbmdUeXBlTmFtZXNbaV0pOwogCX0KLQl0aGlzLnNpbXBsZU5hbWUgPSAoaXNDYXNlU2Vuc2l0aXZlKCkgfHwgaXNDYW1lbENhc2UoKSkgID8gc2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc2ltcGxlTmFtZSk7CisJdGhpcy5zaW1wbGVOYW1lID0gKHRoaXMuaXNDYXNlU2Vuc2l0aXZlIHx8IHRoaXMuaXNDYW1lbENhc2UpID8gc2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc2ltcGxlTmFtZSk7CiAJdGhpcy50eXBlU3VmZml4ID0gdHlwZVN1ZmZpeDsKIAotCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gKHRoaXMucGtnICE9IG51bGwgJiYgdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCkgfHwgdHlwZVN1ZmZpeCAhPSBUWVBFX1NVRkZJWDsKKwl0aGlzLm11c3RSZXNvbHZlID0gKHRoaXMucGtnICE9IG51bGwgJiYgdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCkgfHwgdHlwZVN1ZmZpeCAhPSBUWVBFX1NVRkZJWDsKIH0KIFR5cGVEZWNsYXJhdGlvblBhdHRlcm4oaW50IG1hdGNoUnVsZSkgewogCXN1cGVyKFRZUEVfREVDTF9QQVRURVJOLCBtYXRjaFJ1bGUpOwpAQCAtMjI3LDkgKzIyNyw5IEBACiB9CiBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzRGVjb2RlZEtleShTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuKSB7CiAJVHlwZURlY2xhcmF0aW9uUGF0dGVybiBwYXR0ZXJuID0gKFR5cGVEZWNsYXJhdGlvblBhdHRlcm4pIGRlY29kZWRQYXR0ZXJuOwotCQorCiAJLy8gY2hlY2sgdHlwZSBzdWZmaXgKLQlpZiAodGhpcy50eXBlU3VmZml4ICE9IHBhdHRlcm4udHlwZVN1ZmZpeCAmJiB0eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYKSB7CisJaWYgKHRoaXMudHlwZVN1ZmZpeCAhPSBwYXR0ZXJuLnR5cGVTdWZmaXggJiYgdGhpcy50eXBlU3VmZml4ICE9IFRZUEVfU1VGRklYKSB7CiAJCWlmICghbWF0Y2hEaWZmZXJlbnRUeXBlU3VmZml4ZXModGhpcy50eXBlU3VmZml4LCBwYXR0ZXJuLnR5cGVTdWZmaXgpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTI1NSw3ICsyNTUsNyBAQAogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KLUVudHJ5UmVzdWx0W10gcXVlcnlJbihJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKK3B1YmxpYyBFbnRyeVJlc3VsdFtdIHF1ZXJ5SW4oSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJY2hhcltdIGtleSA9IHRoaXMuc2ltcGxlTmFtZTsgLy8gY2FuIGJlIG51bGwKIAlpbnQgbWF0Y2hSdWxlID0gZ2V0TWF0Y2hSdWxlKCk7CiAKQEAgLTI2NCw3ICsyNjQsNiBAQAogCQkJLy8gZG8gYSBwcmVmaXggcXVlcnkgd2l0aCB0aGUgc2ltcGxlTmFtZQogCQkJYnJlYWs7CiAJCWNhc2UgUl9FWEFDVF9NQVRDSCA6Ci0JCQlpZiAodGhpcy5pc0NhbWVsQ2FzZSkgYnJlYWs7CiAJCQltYXRjaFJ1bGUgJj0gflJfRVhBQ1RfTUFUQ0g7CiAJCQlpZiAodGhpcy5zaW1wbGVOYW1lICE9IG51bGwpIHsKIAkJCQltYXRjaFJ1bGUgfD0gUl9QUkVGSVhfTUFUQ0g7CkBAIC0yNzQsNyArMjczLDcgQEAKIAkJCQlicmVhazsgLy8gZG8gYSBwcmVmaXggcXVlcnkgd2l0aCB0aGUgc2ltcGxlTmFtZSBhbmQgcG9zc2libHkgdGhlIHBrZwogCQkJfQogCQkJbWF0Y2hSdWxlIHw9IFJfUEFUVEVSTl9NQVRDSDsKLQkJCS8vIGZhbGwgdGhydSB0byBlbmNvZGUgdGhlIGtleSBhbmQgZG8gYSBwYXR0ZXJuIHF1ZXJ5CisJCQkvLyAkRkFMTC1USFJPVUdIJCAtIGZhbGwgdGhydSB0byBlbmNvZGUgdGhlIGtleSBhbmQgZG8gYSBwYXR0ZXJuIHF1ZXJ5CiAJCWNhc2UgUl9QQVRURVJOX01BVENIIDoKIAkJCWlmICh0aGlzLnBrZyA9PSBudWxsKSB7CiAJCQkJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsKSB7CkBAIC0zMDIsNiArMzAxLDEwIEBACiAJCWNhc2UgUl9SRUdFWFBfTUFUQ0ggOgogCQkJLy8gVE9ETyAoZnJlZGVyaWMpIGltcGxlbWVudCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2gKIAkJCWJyZWFrOworCQljYXNlIFJfQ0FNRUxDQVNFX01BVENIOgorCQljYXNlIFJfQ0FNRUxDQVNFX1NBTUVfUEFSVF9DT1VOVF9NQVRDSDoKKwkJCS8vIGRvIGEgcHJlZml4IHF1ZXJ5IHdpdGggdGhlIHNpbXBsZU5hbWUKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiBpbmRleC5xdWVyeShnZXRJbmRleENhdGVnb3JpZXMoKSwga2V5LCBtYXRjaFJ1bGUpOyAvLyBtYXRjaCBydWxlIGlzIGlycmVsZXZhbnQgd2hlbiB0aGUga2V5IGlzIG51bGwKQEAgLTMzMywyMyArMzM2LDIzIEBACiAJCQlvdXRwdXQuYXBwZW5kKCJUeXBlRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQKIAkJCWJyZWFrOwogCX0KLQlpZiAocGtnICE9IG51bGwpIAotCQlvdXRwdXQuYXBwZW5kKHBrZyk7CisJaWYgKHRoaXMucGtnICE9IG51bGwpCisJCW91dHB1dC5hcHBlbmQodGhpcy5wa2cpOwogCWVsc2UKIAkJb3V0cHV0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCiAJb3V0cHV0LmFwcGVuZCgiPiwgZW5jbG9zaW5nPCIpOyAvLyROT04tTkxTLTEkCi0JaWYgKGVuY2xvc2luZ1R5cGVOYW1lcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aDsgaSsrKXsKLQkJCW91dHB1dC5hcHBlbmQoZW5jbG9zaW5nVHlwZU5hbWVzW2ldKTsKLQkJCWlmIChpIDwgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCAtIDEpCisJaWYgKHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGg7IGkrKyl7CisJCQlvdXRwdXQuYXBwZW5kKHRoaXMuZW5jbG9zaW5nVHlwZU5hbWVzW2ldKTsKKwkJCWlmIChpIDwgdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoIC0gMSkKIAkJCQlvdXRwdXQuYXBwZW5kKCcuJyk7CiAJCX0KIAl9IGVsc2UgewogCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJb3V0cHV0LmFwcGVuZCgiPiwgdHlwZTwiKTsgLy8kTk9OLU5MUy0xJAotCWlmIChzaW1wbGVOYW1lICE9IG51bGwpIAotCQlvdXRwdXQuYXBwZW5kKHNpbXBsZU5hbWUpOworCWlmICh0aGlzLnNpbXBsZU5hbWUgIT0gbnVsbCkKKwkJb3V0cHV0LmFwcGVuZCh0aGlzLnNpbXBsZU5hbWUpOwogCWVsc2UKIAkJb3V0cHV0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCiAJb3V0cHV0LmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVQYXJhbWV0ZXJMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVQYXJhbWV0ZXJMb2NhdG9yLmphdmEKaW5kZXggMmViODViOC4uMDBiMjA2ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUGFyYW1ldGVyTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVBhcmFtZXRlckxvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMSwxMyArMzEsMTMgQEAKIAogCS8qCiAJICogVmVyaWZ5IHdoZXRoZXIgYSB0eXBlIHJlZmVyZW5jZSBtYXRjaGVzIG5hbWUgcGF0dGVybi4KLQkgKiBUeXBlIHBhcmFtZXRlciByZWZlcmVuY2VzIChpZS4gdHlwZSBhcmd1bWVudHMpIGFyZSBjb21waWxlciB0eXBlIHJlZmVyZW5jZSBub2RlcworCSAqIFR5cGUgcGFyYW1ldGVyIHJlZmVyZW5jZXMgKGkuZS4gdHlwZSBhcmd1bWVudHMpIGFyZSBjb21waWxlciB0eXBlIHJlZmVyZW5jZSBub2RlcwogCSAqLwogCXB1YmxpYyBpbnQgbWF0Y2goVHlwZVJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgewotCQlpZiAocGF0dGVybi5maW5kUmVmZXJlbmNlcykgeworCQlpZiAodGhpcy5wYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSB7CiAJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsgLy8gVHlwZSBwYXJhbWV0ZXIgY2Fubm90IGJlIHF1YWxpZmllZAogCQkJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4ubmFtZSwgKChTaW5nbGVUeXBlUmVmZXJlbmNlKSBub2RlKS50b2tlbikpIHsKLQkJCQkJaW50IGxldmVsID0gKChJbnRlcm5hbFNlYXJjaFBhdHRlcm4pdGhpcy5wYXR0ZXJuKS5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJCWludCBsZXZlbCA9IHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CiAJCQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIGxldmVsKTsKIAkJCQl9CiAJCQl9CkBAIC01MCw5ICs1MCw5IEBACiAJICogVmVyaWZ5IHdoZXRoZXIgYSB0eXBlIHBhcmFtZXRlciBtYXRjaGVzIG5hbWUgcGF0dGVybi4KIAkgKi8KIAlwdWJsaWMgaW50IG1hdGNoKFR5cGVQYXJhbWV0ZXIgbm9kZSwgTWF0Y2hpbmdOb2RlU2V0IG5vZGVTZXQpIHsKLQkJaWYgKHBhdHRlcm4uZmluZERlY2xhcmF0aW9ucykgeworCQlpZiAodGhpcy5wYXR0ZXJuLmZpbmREZWNsYXJhdGlvbnMpIHsKIAkJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4ubmFtZSwgbm9kZS5uYW1lKSkgewotCQkJCWludCBsZXZlbCA9ICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJCWludCBsZXZlbCA9IHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CiAJCQkJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgbGV2ZWwpOwogCQkJfQogCQl9CkBAIC02NCw3ICs2NCw3IEBACiAJICogT3RoZXJ3aXNlLCBvbmx5IGNsYXNzIG9yIG1ldGhvZCBjb250YWluZXIgY2FuIGRlY2xhcmUgdHlwZSBwYXJhbWV0ZXJzLgogCSAqLwogCXByb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7Ci0JCWlmIChwYXR0ZXJuLmZpbmRSZWZlcmVuY2VzKSB7CisJCWlmICh0aGlzLnBhdHRlcm4uZmluZFJlZmVyZW5jZXMpIHsKIAkJCXJldHVybiBBTExfQ09OVEFJTkVSOwogCQl9CiAJCXJldHVybiBDTEFTU19DT05UQUlORVIgfCBNRVRIT0RfQ09OVEFJTkVSOwpAQCAtNzksMTkgKzc5LDE5IEBACiAJCWlmICh2YXJpYWJsZSA9PSBudWxsIHx8IHZhcmlhYmxlLmRlY2xhcmluZ0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CiAJCWlmICh2YXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJUmVmZXJlbmNlQmluZGluZyByZWZCaW5kaW5nICA9IChSZWZlcmVuY2VCaW5kaW5nKSB2YXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50OwotCQkJaWYgKG1hdGNoZXNOYW1lKHJlZkJpbmRpbmcuc291cmNlTmFtZSwgcGF0dGVybi5kZWNsYXJpbmdNZW1iZXJOYW1lKSkgeworCQkJaWYgKG1hdGNoZXNOYW1lKHJlZkJpbmRpbmcuc291cmNlTmFtZSwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ01lbWJlck5hbWUpKSB7CiAJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOwogCQkJfQogCQl9IGVsc2UgaWYgKHZhcmlhYmxlLmRlY2xhcmluZ0VsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSB7CiAJCQlNZXRob2RCaW5kaW5nIG1ldGhCaW5kaW5nICA9IChNZXRob2RCaW5kaW5nKSB2YXJpYWJsZS5kZWNsYXJpbmdFbGVtZW50OwotCQkJaWYgKG1hdGNoZXNOYW1lKG1ldGhCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUsIHBhdHRlcm4ubWV0aG9kRGVjbGFyaW5nQ2xhc3NOYW1lKSAmJgotCQkJCShtZXRoQmluZGluZy5pc0NvbnN0cnVjdG9yKCkgfHwgbWF0Y2hlc05hbWUobWV0aEJpbmRpbmcuc2VsZWN0b3IsIHBhdHRlcm4uZGVjbGFyaW5nTWVtYmVyTmFtZSkpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IHBhdHRlcm4ubWV0aG9kQXJndW1lbnRUeXBlcz09bnVsbCA/IDAgOiBwYXR0ZXJuLm1ldGhvZEFyZ3VtZW50VHlwZXMubGVuZ3RoOworCQkJaWYgKG1hdGNoZXNOYW1lKG1ldGhCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUsIHRoaXMucGF0dGVybi5tZXRob2REZWNsYXJpbmdDbGFzc05hbWUpICYmCisJCQkJKG1ldGhCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSB8fCBtYXRjaGVzTmFtZShtZXRoQmluZGluZy5zZWxlY3RvciwgdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ01lbWJlck5hbWUpKSkgeworCQkJCWludCBsZW5ndGggPSB0aGlzLnBhdHRlcm4ubWV0aG9kQXJndW1lbnRUeXBlcz09bnVsbCA/IDAgOiB0aGlzLnBhdHRlcm4ubWV0aG9kQXJndW1lbnRUeXBlcy5sZW5ndGg7CiAJCQkJaWYgKG1ldGhCaW5kaW5nLnBhcmFtZXRlcnMgPT0gbnVsbCkgewogCQkJCQlpZiAobGVuZ3RoID09IDApIHJldHVybiBBQ0NVUkFURV9NQVRDSDsKIAkJCQl9IGVsc2UgaWYgKG1ldGhCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IGxlbmd0aCl7CiAJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKCFtYXRjaGVzTmFtZShtZXRoQmluZGluZy5wYXJhbWV0ZXJzW2ldLnNob3J0UmVhZGFibGVOYW1lKCksIHBhdHRlcm4ubWV0aG9kQXJndW1lbnRUeXBlc1tpXSkpIHsKKwkJCQkJCWlmICghbWF0Y2hlc05hbWUobWV0aEJpbmRpbmcucGFyYW1ldGVyc1tpXS5zaG9ydFJlYWRhYmxlTmFtZSgpLCB0aGlzLnBhdHRlcm4ubWV0aG9kQXJndW1lbnRUeXBlc1tpXSkpIHsKIAkJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTMyLDcgKzEzMiw3IEBACiAJcHVibGljIGludCByZXNvbHZlTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CiAJCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOwogCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwotCQorCiAJCXJldHVybiBtYXRjaFR5cGVQYXJhbWV0ZXIoKFR5cGVWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcsIHRydWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUGFyYW1ldGVyUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUGFyYW1ldGVyUGF0dGVybi5qYXZhCmluZGV4IGJiMDNlNjQuLjA1NzQ5YWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVBhcmFtZXRlclBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVQYXJhbWV0ZXJQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNTksNyArNTksNyBAQAogCQl0aGlzLm5hbWUgPSB0eXBlUGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsgLy8gc3RvcmUgdHlwZSBwYXJhbWV0ZXIgbmFtZQogCQlJTWVtYmVyIG1lbWJlciA9IHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCk7CiAJCXRoaXMuZGVjbGFyaW5nTWVtYmVyTmFtZSA9IG1lbWJlci5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7IC8vIHN0b3JlIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmluZyBtZW1iZXIgbmFtZQotCQkKKwogCQkvLyBGb3IgbWV0aG9kIHR5cGUgcGFyYW1ldGVyLCBzdG9yZSBhbHNvIGRlY2xhcmluZyBjbGFzcyBuYW1lIGFuZCBwYXJhbWV0ZXJzIHR5cGUgbmFtZXMKIAkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIElNZXRob2QpIHsKIAkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIG1lbWJlcjsKQEAgLTgyLDI1ICs4MiwyNSBAQAogCQlTdHJpbmcgcmVsYXRpdmVQYXRoOwogCSAgICBpZiAocm9vdC5pc0FyY2hpdmUoKSkgewogIAkgICAgCUlUeXBlIHR5cGUgPSAoSVR5cGUpIHRoaXMudHlwZVBhcmFtZXRlci5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuVFlQRSk7Ci0gICAgCSAgICByZWxhdGl2ZVBhdGggPSAodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy8nKSkucmVwbGFjZSgnLicsICcvJykgKyBTdWZmaXhDb25zdGFudHMuU1VGRklYX1NUUklOR19jbGFzczsKKyAgICAJICAgIHJlbGF0aXZlUGF0aCA9ICh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpKS5yZXBsYWNlKCcuJywgJy8nKSArIFN1ZmZpeENvbnN0YW50cy5TVUZGSVhfU1RSSU5HX2NsYXNzOwogCSAgICAgICAgZG9jdW1lbnRQYXRoID0gcm9vdC5nZXRQYXRoKCkgKyBJSmF2YVNlYXJjaFNjb3BlLkpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiArIHJlbGF0aXZlUGF0aDsKIAkgICAgfSBlbHNlIHsKIAkJCUlQYXRoIHBhdGggPSB0aGlzLnR5cGVQYXJhbWV0ZXIuZ2V0UGF0aCgpOwogCSAgICAgICAgZG9jdW1lbnRQYXRoID0gcGF0aC50b1N0cmluZygpOwogCQkJcmVsYXRpdmVQYXRoID0gVXRpbC5yZWxhdGl2ZVBhdGgocGF0aCwgMS8qcmVtb3ZlIHByb2plY3Qgc2VnbWVudCovKTsKIAkgICAgfQotCQorCiAJCWlmIChzY29wZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hTY29wZSkgewogCQkJSmF2YVNlYXJjaFNjb3BlIGphdmFTZWFyY2hTY29wZSA9IChKYXZhU2VhcmNoU2NvcGUpIHNjb3BlOwogCQkJLy8gR2V0IGRvY3VtZW50IHBhdGggYWNjZXNzIHJlc3RyaWN0aW9uIGZyb20gamF2YSBzZWFyY2ggc2NvcGUKIAkJCS8vIE5vdGUgdGhhdCByZXF1ZXN0b3IgaGFzIHRvIHZlcmlmeSBpZiBuZWVkZWQgd2hldGhlciB0aGUgZG9jdW1lbnQgdmlvbGF0ZXMgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBvciBub3QKIAkJCUFjY2Vzc1J1bGVTZXQgYWNjZXNzID0gamF2YVNlYXJjaFNjb3BlLmdldEFjY2Vzc1J1bGVTZXQocmVsYXRpdmVQYXRoLCBpbmRleC5jb250YWluZXJQYXRoKTsKIAkJCWlmIChhY2Nlc3MgIT0gSmF2YVNlYXJjaFNjb3BlLk5PVF9FTkNMT1NFRCkgeyAvLyBzY29wZSBlbmNsb3NlcyB0aGUgcGF0aAotCQkJCWlmICghcmVxdWVzdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLCB0aGlzLCBwYXJ0aWNpcGFudCwgYWNjZXNzKSkgCisJCQkJaWYgKCFyZXF1ZXN0b3IuYWNjZXB0SW5kZXhNYXRjaChkb2N1bWVudFBhdGgsIHRoaXMsIHBhcnRpY2lwYW50LCBhY2Nlc3MpKQogCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKIAkJCX0KIAkJfSBlbHNlIGlmIChzY29wZS5lbmNsb3Nlcyhkb2N1bWVudFBhdGgpKSB7Ci0JCQlpZiAoIXJlcXVlc3Rvci5hY2NlcHRJbmRleE1hdGNoKGRvY3VtZW50UGF0aCwgdGhpcywgcGFydGljaXBhbnQsIG51bGwpKSAKKwkJCWlmICghcmVxdWVzdG9yLmFjY2VwdEluZGV4TWF0Y2goZG9jdW1lbnRQYXRoLCB0aGlzLCBwYXJ0aWNpcGFudCwgbnVsbCkpCiAJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJCX0KIAl9CkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCW91dHB1dC5hcHBlbmQoIlR5cGVQYXJhbVJlZmVyZW5jZVBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJb3V0cHV0LmFwcGVuZCh0eXBlUGFyYW1ldGVyLnRvU3RyaW5nKCkpOworCQlvdXRwdXQuYXBwZW5kKHRoaXMudHlwZVBhcmFtZXRlci50b1N0cmluZygpKTsKIAkJcmV0dXJuIHN1cGVyLnByaW50KG91dHB1dCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VMb2NhdG9yLmphdmEKaW5kZXggOWZiYzY0Yy4uMTM3YzljOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUmVmZXJlbmNlTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZUxvY2F0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yNiwxMSArMjYsMTQgQEAKIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlUGF0dGVybiBwYXR0ZXJuOwogcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybjsKIAorcHJpdmF0ZSBmaW5hbCBpbnQgZmluZUdyYWluOworCiBwdWJsaWMgVHlwZVJlZmVyZW5jZUxvY2F0b3IoVHlwZVJlZmVyZW5jZVBhdHRlcm4gcGF0dGVybikgewogCiAJc3VwZXIocGF0dGVybik7CiAKIAl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworCXRoaXMuZmluZUdyYWluID0gcGF0dGVybiA9PSBudWxsID8gMCA6IHBhdHRlcm4uZmluZUdyYWluOwogCXRoaXMuaXNEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybiA9IHRoaXMucGF0dGVybiBpbnN0YW5jZW9mIERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuOwogfQogcHJvdGVjdGVkIElKYXZhRWxlbWVudCBmaW5kRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5KSB7CkBAIC0zOCwxMSArNDEsMTQgQEAKIAlpZiAoYWNjdXJhY3kgIT0gU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSkgcmV0dXJuIG51bGw7CiAKIAkvLyBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgdHlwZSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBlbmNsb3NpbmcgZWxlbWVudAotCURlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuIGRlY2xQYXR0ZXJuID0gKERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuKSB0aGlzLnBhdHRlcm47IAorCURlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuIGRlY2xQYXR0ZXJuID0gKERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuKSB0aGlzLnBhdHRlcm47CiAJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCAmJiAhZGVjbFBhdHRlcm4uZW5jbG9zaW5nRWxlbWVudC5lcXVhbHMoZWxlbWVudCkpCiAJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwogCXJldHVybiBlbGVtZW50OwogfQorcHJvdGVjdGVkIGludCBmaW5lR3JhaW4oKSB7CisJcmV0dXJuIHRoaXMuZmluZUdyYWluOworfQogcHVibGljIGludCBtYXRjaChBbm5vdGF0aW9uIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7CiAJcmV0dXJuIG1hdGNoKG5vZGUudHlwZSwgbm9kZVNldCk7CiB9CkBAIC02MCwxMSArNjYsMTEgQEAKIAlpZiAoIShub2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCiAJaWYgKHRoaXMucGF0dGVybi5zaW1wbGVOYW1lID09IG51bGwpCi0JCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKKwkJcmV0dXJuIG5vZGVTZXQuYWRkTWF0Y2gobm9kZSwgdGhpcy5wYXR0ZXJuLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CiAKIAlpZiAobm9kZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKIAkJaWYgKG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5zaW1wbGVOYW1lLCAoKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG5vZGUpLnRva2VuKSkKLQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIFBPU1NJQkxFX01BVENIKTsgLy8gcmVzb2x1dGlvbiBpcyBuZWVkZWQgdG8gZmluZCBvdXQgaWYgaXQgaXMgYSB0eXBlIHJlZiAKKwkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIFBPU1NJQkxFX01BVENIKTsgLy8gcmVzb2x1dGlvbiBpcyBuZWVkZWQgdG8gZmluZCBvdXQgaWYgaXQgaXMgYSB0eXBlIHJlZgogCX0gZWxzZSB7CiAJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbm9kZSkudG9rZW5zOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdG9rZW5zLmxlbmd0aDsgaSA8IG1heDsgaSsrKQpAQCAtNzcsMTEgKzgzLDExIEBACiAvL3B1YmxpYyBpbnQgbWF0Y2goVHlwZURlY2xhcmF0aW9uIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSAtIFNLSVAgSVQKIHB1YmxpYyBpbnQgbWF0Y2goVHlwZVJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCkgewogCWlmICh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSA9PSBudWxsKQotCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogCiAJaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7CiAJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSwgKChTaW5nbGVUeXBlUmVmZXJlbmNlKSBub2RlKS50b2tlbikpCi0JCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCAoKEludGVybmFsU2VhcmNoUGF0dGVybil0aGlzLnBhdHRlcm4pLm11c3RSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSCk7CisJCQlyZXR1cm4gbm9kZVNldC5hZGRNYXRjaChub2RlLCB0aGlzLnBhdHRlcm4ubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKIAl9IGVsc2UgewogCQljaGFyW11bXSB0b2tlbnMgPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIG5vZGUpLnRva2VuczsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRva2Vucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykKQEAgLTk2LDcgKzEwMiwyMCBAQAogCWlmICh0aGlzLnBhdHRlcm4ucXVhbGlmaWNhdGlvbiA9PSBudWxsKSB7CiAJCWlmICh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSA9PSBudWxsKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CiAJCWNoYXJbXVtdIHRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7Ci0JCWlmIChtYXRjaGVzTmFtZSh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSwgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0pKSByZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCWJvb2xlYW4gb25EZW1hbmQgPSAoaW1wb3J0UmVmLmJpdHMgJiBBU1ROb2RlLk9uRGVtYW5kKSAhPSAwOworCQlmaW5hbCBib29sZWFuIGlzU3RhdGljID0gaW1wb3J0UmVmLmlzU3RhdGljKCk7CisJCWlmICghaXNTdGF0aWMgJiYgb25EZW1hbmQpIHsKKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQl9CisJCWludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUsIHRva2Vuc1tsZW5ndGgtMV0pKSB7CisJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCX0KKwkJaWYgKGlzU3RhdGljICYmICFvbkRlbWFuZCAmJiBsZW5ndGggPiAxKSB7CisJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUsIHRva2Vuc1tsZW5ndGgtMl0pKSB7CisJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJY2hhcltdW10gdG9rZW5zID0gaW1wb3J0UmVmLnRva2VuczsKIAkJY2hhcltdIHF1YWxpZmllZFBhdHRlcm4gPSB0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSA9PSBudWxsCkBAIC0xMTIsOSArMTMxLDYgQEAKIAkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwogCQl9CiAJCWJvb2xlYW4gbWF0Y2hGaXJzdENoYXIgPSAhdGhpcy5pc0Nhc2VTZW5zaXRpdmUgfHwgKHF1YWxpZmllZFBhdHRlcm5bMF0gPT0gcXVhbGlmaWVkVHlwZU5hbWVbMF0pOwotCQlpZiAodGhpcy5pc0NhbWVsQ2FzZSAmJiBtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHF1YWxpZmllZFBhdHRlcm4sIHF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOwotCQl9CiAJCXN3aXRjaCAodGhpcy5tYXRjaE1vZGUpIHsKIAkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENIOgogCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENIOgpAQCAtMTMyLDYgKzE0OCwyMCBAQAogCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfUkVHRVhQX01BVENIIDoKIAkJCQkvLyBUT0RPIChmcmVkZXJpYykgaW1wbGVtZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaAogCQkJCWJyZWFrOworCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlJfQ0FNRUxDQVNFX01BVENIOgorCQkJCWlmIChtYXRjaEZpcnN0Q2hhciAmJiBDaGFyT3BlcmF0aW9uLmNhbWVsQ2FzZU1hdGNoKHF1YWxpZmllZFBhdHRlcm4sIHF1YWxpZmllZFR5cGVOYW1lLCBmYWxzZSkpIHsKKwkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJCX0KKwkJCQkvLyBvbmx5IHRlc3QgY2FzZSBpbnNlbnNpdGl2ZSBhcyBDYW1lbENhc2UgYWxyZWFkeSB2ZXJpZmllZCBwcmVmaXggY2FzZSBzZW5zaXRpdmUKKwkJCQlpZiAoIXRoaXMuaXNDYXNlU2Vuc2l0aXZlICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHF1YWxpZmllZFBhdHRlcm4sIHF1YWxpZmllZFR5cGVOYW1lLCBmYWxzZSkpIHsKKwkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU2VhcmNoUGF0dGVybi5SX0NBTUVMQ0FTRV9TQU1FX1BBUlRfQ09VTlRfTUFUQ0g6CisJCQkJaWYgKG1hdGNoRmlyc3RDaGFyICYmIENoYXJPcGVyYXRpb24uY2FtZWxDYXNlTWF0Y2gocXVhbGlmaWVkUGF0dGVybiwgcXVhbGlmaWVkVHlwZU5hbWUsIHRydWUpKSB7CisJCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CkBAIC0xNjAsOSArMTkwLDkgQEAKIAkJaW50IGxldmVsID0gcmVzb2x2ZUxldmVsKHJlZkJpbmRpbmcpOwogCQlpZiAobGV2ZWwgPj0gSU5BQ0NVUkFURV9NQVRDSCkgewogCQkJbWF0Y2hSZXBvcnRJbXBvcnRSZWYoCi0JCQkJaW1wb3J0UmVmLCAKLQkJCQliaW5kaW5nLCAKLQkJCQlsb2NhdG9yLmNyZWF0ZUltcG9ydEhhbmRsZShpbXBvcnRSZWYpLCAKKwkJCQlpbXBvcnRSZWYsCisJCQkJYmluZGluZywKKwkJCQlsb2NhdG9yLmNyZWF0ZUltcG9ydEhhbmRsZShpbXBvcnRSZWYpLAogCQkJCWxldmVsID09IEFDQ1VSQVRFX01BVENICiAJCQkJCT8gU2VhcmNoTWF0Y2guQV9BQ0NVUkFURQogCQkJCQk6IFNlYXJjaE1hdGNoLkFfSU5BQ0NVUkFURSwKQEAgLTE3NSw3ICsyMDUsNyBAQAogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRJbXBvcnRSZWYoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQmluZGluZyBiaW5kaW5nLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWlmICh0aGlzLmlzRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4pIHsKIAkJaWYgKChlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudCwgYWNjdXJhY3kpKSAhPSBudWxsKSB7Ci0JCQlTaW1wbGVTZXQga25vd25UeXBlcyA9ICgoRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4pIHRoaXMucGF0dGVybikua25vd25UeXBlczsgCisJCQlTaW1wbGVTZXQga25vd25UeXBlcyA9ICgoRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4pIHRoaXMucGF0dGVybikua25vd25UeXBlczsKIAkJCXdoaWxlIChiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKIAkJCQlyZXBvcnREZWNsYXJhdGlvbih0eXBlQmluZGluZywgMSwgbG9jYXRvciwga25vd25UeXBlcyk7CkBAIC0xODksMTkgKzIxOSwyNCBAQAogCWlmICh0aGlzLnBhdHRlcm4uaGFzVHlwZUFyZ3VtZW50cygpICYmICF0aGlzLmlzRXF1aXZhbGVudE1hdGNoICYmIXRoaXMuaXNFcmFzdXJlTWF0Y2gpIHsKIAkJcmV0dXJuOwogCX0KLQkKKworCS8vIFJldHVybiBpZiBmaW5lIGdyYWluIGlzIG9uIGFuZCBkb2VzIG5vdCBjb25jZXJuIGltcG9ydCByZWZlcmVuY2UKKwlpZiAoKHRoaXMucGF0dGVybi5maW5lR3JhaW4gIT0gMCAmJiAodGhpcy5wYXR0ZXJuLmZpbmVHcmFpbiAmIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUE9SVF9ERUNMQVJBVElPTl9UWVBFX1JFRkVSRU5DRSkgPT0gMCkpIHsKKwkJcmV0dXJuOworCX0KKwogCS8vIENyZWF0ZSBzZWFyY2ggbWF0Y2gKLQltYXRjaCA9IGxvY2F0b3IubmV3VHlwZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGJpbmRpbmcsIGFjY3VyYWN5LCBpbXBvcnRSZWYpOworCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld1R5cGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBiaW5kaW5nLCBhY2N1cmFjeSwgaW1wb3J0UmVmKTsKIAogCS8vIHNldCBtYXRjaCByYXcgZmxhZyBhbmQgcnVsZQotCW1hdGNoLnNldFJhdyh0cnVlKTsKKwl0aGlzLm1hdGNoLnNldFJhdyh0cnVlKTsKIAlpZiAodGhpcy5wYXR0ZXJuLmhhc1R5cGVBcmd1bWVudHMoKSkgewogCQkvLyBiaW5kaW5nIGlzIHJhdyA9PiBvbmx5IGNvbXBhdGlibGUgZXJhc3VyZSBpZiBwYXR0ZXJuIGhhcyB0eXBlIGFyZ3VtZW50cwotCQltYXRjaC5zZXRSdWxlKG1hdGNoLmdldFJ1bGUoKSAmICh+U2VhcmNoUGF0dGVybi5SX0ZVTExfTUFUQ0gpKTsKKwkJdGhpcy5tYXRjaC5zZXRSdWxlKHRoaXMubWF0Y2guZ2V0UnVsZSgpICYgKH5TZWFyY2hQYXR0ZXJuLlJfRlVMTF9NQVRDSCkpOwogCX0KLQkKKwogCS8vIFRyeSB0byBmaW5kIGJlc3Qgc2VsZWN0aW9uIGZvciBtYXRjaAotCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOworCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbDsKIAlib29sZWFuIGxhc3RCdXRPbmUgPSBmYWxzZTsKIAlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKIAkJdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKQEAgLTIzNyw5ICsyNzIsOSBAQAogCQkJCQlpbnQgc3RhcnQgPSAoaW50KSAoKHBvc2l0aW9uc1tpbmRleF0pID4+PiAzMik7CiAJCQkJCWludCBlbmQgPSAoaW50KSBwb3NpdGlvbnNbbGFzdEluZGV4XTsKIAkJCQkJLy8gcmVwb3J0IG1hdGNoCi0JCQkJCW1hdGNoLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1hdGNoLnNldExlbmd0aChlbmQtc3RhcnQrMSk7Ci0JCQkJCWxvY2F0b3IucmVwb3J0KG1hdGNoKTsKKwkJCQkJdGhpcy5tYXRjaC5zZXRPZmZzZXQoc3RhcnQpOworCQkJCQl0aGlzLm1hdGNoLnNldExlbmd0aChlbmQtc3RhcnQrMSk7CisJCQkJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCQkJCX0KIAkJCQlyZXR1cm47CiAJCQl9CkBAIC0yNDcsNyArMjgyLDcgQEAKIAkJCXR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOwogCQl9CiAJfQotCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVUeXBlUmVmZXJlbmNlKG1hdGNoLCBpbXBvcnRSZWYsIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lKTsKKwlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlVHlwZVJlZmVyZW5jZSh0aGlzLm1hdGNoLCBpbXBvcnRSZWYsIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lKTsKIH0KIHByb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFycmF5VHlwZVJlZmVyZW5jZSBhcnJheVJlZiwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAlpZiAodGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUgPT0gbnVsbCkgewpAQCAtMjYxLDE2ICsyOTYsMTYgQEAKIAkJCQl0aGlzLm1hdGNoLnNldE9mZnNldChvZmZzZXQpOwogCQkJCXRoaXMubWF0Y2guc2V0TGVuZ3RoKGxlbmd0aCk7CiAJCQl9Ci0JCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCQlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQltYXRjaCA9IGxvY2F0b3IubmV3VHlwZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgYXJyYXlSZWYpOworCXRoaXMubWF0Y2ggPSBsb2NhdG9yLm5ld1R5cGVSZWZlcmVuY2VNYXRjaChlbGVtZW50LCBlbGVtZW50QmluZGluZywgYWNjdXJhY3ksIGFycmF5UmVmKTsKIAlpZiAoYXJyYXlSZWYucmVzb2x2ZWRUeXBlICE9IG51bGwpIHsKIAkJbWF0Y2hSZXBvcnRSZWZlcmVuY2UoYXJyYXlSZWYsIC0xLCBhcnJheVJlZi5yZXNvbHZlZFR5cGUubGVhZkNvbXBvbmVudFR5cGUoKSwgbG9jYXRvcik7CiAJCXJldHVybjsKIAl9Ci0JbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVR5cGVSZWZlcmVuY2UobWF0Y2gsIGFycmF5UmVmLCB0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSk7CisJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVR5cGVSZWZlcmVuY2UodGhpcy5tYXRjaCwgYXJyYXlSZWYsIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lKTsKIH0KIC8qKgogICogUmVwb3J0cyB0aGUgbWF0Y2ggb2YgdGhlIGdpdmVuIHJlZmVyZW5jZS4KQEAgLTI4Nyw3ICszMjIsNyBAQAogCQkJcmVwb3J0RGVjbGFyYXRpb24ocmVmZXJlbmNlLCBlbGVtZW50LCBsb2NhdG9yLCAoKERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuKSB0aGlzLnBhdHRlcm4pLmtub3duVHlwZXMpOwogCQlyZXR1cm47CiAJfQotCQorCiAJLy8gQ3JlYXRlIHNlYXJjaCBtYXRjaAogCVR5cGVSZWZlcmVuY2VNYXRjaCByZWZNYXRjaCA9IGxvY2F0b3IubmV3VHlwZVJlZmVyZW5jZU1hdGNoKGVsZW1lbnQsIGVsZW1lbnRCaW5kaW5nLCBhY2N1cmFjeSwgcmVmZXJlbmNlKTsKIAlyZWZNYXRjaC5zZXRMb2NhbEVsZW1lbnQobG9jYWxFbGVtZW50KTsKQEAgLTMwNyw2NiArMzQyLDkgQEAKIAkJCW1hdGNoUmVwb3J0UmVmZXJlbmNlKChFeHByZXNzaW9uKXJlZmVyZW5jZSwgLTEsIHR5cGVCaW5kaW5nLCBsb2NhdG9yKTsKIAkJCXJldHVybjsKIAkJfQotCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCX0KIH0KLS8qKgotICogUmVwb3J0cyB0aGUgbWF0Y2ggb2YgdGhlIGdpdmVuIHJlZmVyZW5jZS4gQWxzbyBwcm92aWRlIGEgc2NvcGUgdG8gbG9vayBmb3IgcG9zc2libGUgbG9jYWwgYW5kIG90aGVyIGVsZW1lbnRzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBU1ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIFNjb3BlIHNjb3BlLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKHNjb3BlID09IG51bGwgfHwgKHNjb3BlLmtpbmQgIT0gU2NvcGUuQkxPQ0tfU0NPUEUgJiYgc2NvcGUua2luZCAhPSBTY29wZS5NRVRIT0RfU0NPUEUpKSB7Ci0JCW1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZWxlbWVudCwgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBsb2NhdG9yKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBMb29rIGlmIHNvbWUgYmxvY2sgc2NvcGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGluY2x1ZGUgcmVmZXJlbmNlIHN0YXJ0IHBvc2l0aW9uCi0JQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHNjb3BlOwotCUxvY2FsRGVjbGFyYXRpb25bXSBsb2NhbERlY2xhcmF0aW9ucyA9IGJsb2NrU2NvcGUuZmluZExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbnMocmVmZXJlbmNlLnNvdXJjZVN0YXJ0KTsKLQlJSmF2YUVsZW1lbnQgbG9jYWxFbGVtZW50ID0gbnVsbDsKLQlJSmF2YUVsZW1lbnRbXSBvdGhlckVsZW1lbnRzID0gbnVsbDsKLQotCS8vIFNvbWUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gYXJlIG1hdGNoaW5nCi0JaWYgKGxvY2FsRGVjbGFyYXRpb25zICE9IG51bGwpIHsKLQkJaW50IGxlbmd0aCA9IGxvY2FsRGVjbGFyYXRpb25zLmxlbmd0aDsKLQotCQkvLyBTZXQgbG9jYWwgZWxlbWVudCB0byBmaXJzdCBtYXRjaGluZyBsb2NhbCBkZWNsYXJhdGlvbgotCQlpbnQgaWR4ID0gMDsKLQkJZm9yICg7IGlkeDxsZW5ndGg7IGlkeCsrKSB7Ci0JCQlpZiAobG9jYWxEZWNsYXJhdGlvbnNbaWR4XSA9PSBudWxsKSBicmVhazsKLQkJCWlmIChyZWZlcmVuY2Uuc291cmNlU3RhcnQgPT0gbG9jYWxEZWNsYXJhdGlvbnNbaWR4XS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7Ci0JCQkJbG9jYWxFbGVtZW50ID0gbG9jYXRvci5jcmVhdGVIYW5kbGUobG9jYWxEZWNsYXJhdGlvbnNbaWR4XSwgZWxlbWVudCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaWR4PjAgJiYgbG9jYWxEZWNsYXJhdGlvbnNbaWR4XS5zb3VyY2VTdGFydCA+IHJlZmVyZW5jZS5zb3VyY2VTdGFydCkgewotCQkJCWxvY2FsRWxlbWVudCA9IGxvY2F0b3IuY3JlYXRlSGFuZGxlKGxvY2FsRGVjbGFyYXRpb25zW2lkeC0xXSwgZWxlbWVudCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2FsRWxlbWVudCA9PSBudWxsICYmIGlkeCA+IDApIHsKLQkJCWlmIChyZWZlcmVuY2Uuc291cmNlRW5kIDwgbG9jYWxEZWNsYXJhdGlvbnNbaWR4LTFdLmRlY2xhcmF0aW9uRW5kKSB7Ci0JCQkJbG9jYWxFbGVtZW50ID0gbG9jYXRvci5jcmVhdGVIYW5kbGUobG9jYWxEZWNsYXJhdGlvbnNbaWR4LTFdLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gU3RvcmUgb3RoZXIgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIG90aGVyIGVsZW1lbnRzCi0JCWludCBzaXplID0gMDsKLQkJZm9yIChpbnQgaj0xOyBqPGxlbmd0aDsgaisrKSB7Ci0JCQlpZiAobG9jYWxEZWNsYXJhdGlvbnNbal0gPT0gbnVsbCkgYnJlYWs7Ci0JCQlpZiAocmVmZXJlbmNlLnNvdXJjZVN0YXJ0ID09IGxvY2FsRGVjbGFyYXRpb25zW2pdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQpIHsKLQkJCQlpZiAob3RoZXJFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCW90aGVyRWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W2xlbmd0aC1qXTsKLQkJCQl9Ci0JCQkJb3RoZXJFbGVtZW50c1tzaXplKytdID0gbG9jYXRvci5jcmVhdGVIYW5kbGUobG9jYWxEZWNsYXJhdGlvbnNbal0sIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzaXplID4gMCAmJiBzaXplICE9IChsZW5ndGgtMSkpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJFbGVtZW50cywgMCwgb3RoZXJFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbc2l6ZV0sIDAsIHNpemUpOwotCQl9Ci0JfQotCQotCS8vIFJlcG9ydCBtYXRjaCB3aXRoIGxvY2FsIGFuZCBvdGhlciBlbGVtZW50cyBpZiBhbnkKLQltYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIGxvY2FsRWxlbWVudCwgb3RoZXJFbGVtZW50cywgZWxlbWVudEJpbmRpbmcsIGFjY3VyYWN5LCBsb2NhdG9yKTsKLX0KIHByb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYsIElKYXZhRWxlbWVudCBlbGVtZW50LCBCaW5kaW5nIGVsZW1lbnRCaW5kaW5nLCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJQmluZGluZyBiaW5kaW5nID0gcU5hbWVSZWYuYmluZGluZzsKIAlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG51bGw7CkBAIC0zOTAsNyArMzY4LDcgQEAKIAkJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1CaW5kaW5nKSB7CiAJCQkJdHlwZUJpbmRpbmcgPSAoKFByb2JsZW1CaW5kaW5nKSBiaW5kaW5nKS5zZWFyY2hUeXBlOwogCQkJfQotCQkJYnJlYWs7CQkJCQkKKwkJCWJyZWFrOwogCX0KIAlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgewogCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBwYkJpbmRpbmcgPSAoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nOwpAQCAtNDA1LDcgKzM4Myw3IEBACiAKIAkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4KIAlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsgCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKIAkJd2hpbGUgKHJlZkJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCkgewogCQkJaWYgKHJlc29sdmVMZXZlbEZvclR5cGUocmVmQmluZGluZykgPT0gQUNDVVJBVEVfTUFUQ0gpIHsKIAkJCQlpZiAobG9jYXRvci5lbmNsb3NlcyhlbGVtZW50KSkgewpAQCAtNDE4LDggKzM5Niw4IEBACiAJCQkJCWlmIChpbmRleCA8IDApIGluZGV4ID0gMDsKIAkJCQkJaW50IHN0YXJ0ID0gKGludCkgKChwb3NpdGlvbnNbaW5kZXhdKSA+Pj4gMzIpOwogCQkJCQlpbnQgZW5kID0gKGludCkgcG9zaXRpb25zW2xhc3RJbmRleF07Ci0JCQkJCW1hdGNoLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1hdGNoLnNldExlbmd0aChlbmQtc3RhcnQrMSk7CisJCQkJCXRoaXMubWF0Y2guc2V0T2Zmc2V0KHN0YXJ0KTsKKwkJCQkJdGhpcy5tYXRjaC5zZXRMZW5ndGgoZW5kLXN0YXJ0KzEpOwogCiAJCQkJCS8vICBMb29rIGlmIHRoZXJlJ3MgYSBuZWVkIHRvIHNwZWNpYWwgcmVwb3J0IGZvciBwYXJhbWV0ZXJpemVkIHR5cGUKIAkJCQkJbWF0Y2hSZXBvcnRSZWZlcmVuY2UocU5hbWVSZWYsIGxhc3RJbmRleCwgcmVmQmluZGluZywgbG9jYXRvcik7CkBAIC00MzAsNyArNDA4LDcgQEAKIAkJCXJlZkJpbmRpbmcgPSByZWZCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsKIAkJfQogCX0KLQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlVHlwZVJlZmVyZW5jZShtYXRjaCwgcU5hbWVSZWYsIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lKTsKKwlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlVHlwZVJlZmVyZW5jZSh0aGlzLm1hdGNoLCBxTmFtZVJlZiwgdGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUpOwogfQogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxVHlwZVJlZiwgSUphdmFFbGVtZW50IGVsZW1lbnQsIEJpbmRpbmcgZWxlbWVudEJpbmRpbmcsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHFUeXBlUmVmLnJlc29sdmVkVHlwZTsKQEAgLTQ1MCw3ICs0MjgsNyBAQAogCiAJLy8gdHJ5IHRvIG1hdGNoIGFsbCBlbmNsb3NpbmcgdHlwZXMgZm9yIHdoaWNoIHRoZSB0b2tlbiBtYXRjaGVzIGFzIHdlbGwKIAlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7Ci0JCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsgCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKIAkJd2hpbGUgKHJlZkJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCkgewogCQkJaWYgKHJlc29sdmVMZXZlbEZvclR5cGUocmVmQmluZGluZykgIT0gSU1QT1NTSUJMRV9NQVRDSCkgewogCQkJCWlmIChsb2NhdG9yLmVuY2xvc2VzKGVsZW1lbnQpKSB7CkBAIC00NjMsOCArNDQxLDggQEAKIAkJCQkJaWYgKGluZGV4IDwgMCkgaW5kZXggPSAwOwogCQkJCQlpbnQgc3RhcnQgPSAoaW50KSAoKHBvc2l0aW9uc1tpbmRleF0pID4+PiAzMik7CiAJCQkJCWludCBlbmQgPSAoaW50KSBwb3NpdGlvbnNbbGFzdEluZGV4XTsKLQkJCQkJbWF0Y2guc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWF0Y2guc2V0TGVuZ3RoKGVuZC1zdGFydCsxKTsKKwkJCQkJdGhpcy5tYXRjaC5zZXRPZmZzZXQoc3RhcnQpOworCQkJCQl0aGlzLm1hdGNoLnNldExlbmd0aChlbmQtc3RhcnQrMSk7CiAKIAkJCQkJLy8gIExvb2sgaWYgdGhlcmUncyBhIG5lZWQgdG8gc3BlY2lhbCByZXBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZQogCQkJCQltYXRjaFJlcG9ydFJlZmVyZW5jZShxVHlwZVJlZiwgbGFzdEluZGV4LCByZWZCaW5kaW5nLCBsb2NhdG9yKTsKQEAgLTQ3NSw3ICs0NTMsNyBAQAogCQkJcmVmQmluZGluZyA9IHJlZkJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOwogCQl9CiAJfQotCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVUeXBlUmVmZXJlbmNlKG1hdGNoLCBxVHlwZVJlZiwgdGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUpOworCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVUeXBlUmVmZXJlbmNlKHRoaXMubWF0Y2gsIHFUeXBlUmVmLCB0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSk7CiB9CiB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEV4cHJlc3Npb24gZXhwciwgaW50IGxhc3RJbmRleCwgVHlwZUJpbmRpbmcgcmVmQmluZGluZywgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIApAQCAtNDg1LDEwICs0NjMsMTAgQEAKIAkJLy8gVHJ5IHRvIHJlZmluZSBhY2N1cmFjeQogCQlQYXJhbWV0ZXJpemVkVHlwZUJpbmRpbmcgcGFyYW1ldGVyaXplZEJpbmRpbmcgPSAoUGFyYW1ldGVyaXplZFR5cGVCaW5kaW5nKXJlZkJpbmRpbmc7CiAJCXVwZGF0ZU1hdGNoKHBhcmFtZXRlcml6ZWRCaW5kaW5nLCB0aGlzLnBhdHRlcm4uZ2V0VHlwZUFyZ3VtZW50cygpLCB0aGlzLnBhdHRlcm4uaGFzVHlwZVBhcmFtZXRlcnMoKSwgMCwgbG9jYXRvcik7Ci0JCQorCiAJCS8vIFNlZSB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byByZXBvcnQgb3Igbm90Ci0JCWlmIChtYXRjaC5nZXRSdWxlKCkgPT0gMCkgcmV0dXJuOyAvLyBpbXBvc3NpYmxlIG1hdGNoCi0JCWJvb2xlYW4gcmVwb3J0ID0gKHRoaXMuaXNFcmFzdXJlTWF0Y2ggJiYgbWF0Y2guaXNFcmFzdXJlKCkpIHx8ICh0aGlzLmlzRXF1aXZhbGVudE1hdGNoICYmIG1hdGNoLmlzRXF1aXZhbGVudCgpKSB8fCBtYXRjaC5pc0V4YWN0KCk7CisJCWlmICh0aGlzLm1hdGNoLmdldFJ1bGUoKSA9PSAwKSByZXR1cm47IC8vIGltcG9zc2libGUgbWF0Y2gKKwkJYm9vbGVhbiByZXBvcnQgPSAodGhpcy5pc0VyYXN1cmVNYXRjaCAmJiB0aGlzLm1hdGNoLmlzRXJhc3VyZSgpKSB8fCAodGhpcy5pc0VxdWl2YWxlbnRNYXRjaCAmJiB0aGlzLm1hdGNoLmlzRXF1aXZhbGVudCgpKSB8fCB0aGlzLm1hdGNoLmlzRXhhY3QoKTsKIAkJaWYgKCFyZXBvcnQpIHJldHVybjsKIAogCQkvLyBNYWtlIGEgc3BlY2lhbCByZXBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5CkBAIC01MDQsMjMgKzQ4MiwyMyBAQAogCQkJCXR5cGVBcmd1bWVudHMgPSAoKFBhcmFtZXRlcml6ZWRTaW5nbGVUeXBlUmVmZXJlbmNlKSBleHByKS50eXBlQXJndW1lbnRzOwogCQkJfQogCQkJaWYgKHR5cGVSZWYgIT0gbnVsbCkgewotCQkJCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVQYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZShtYXRjaCwgdHlwZVJlZiwgbGFzdEluZGV4LCB0eXBlQXJndW1lbnRzKTsKKwkJCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UodGhpcy5tYXRjaCwgdHlwZVJlZiwgbGFzdEluZGV4LCB0eXBlQXJndW1lbnRzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKHRoaXMucGF0dGVybi5oYXNUeXBlQXJndW1lbnRzKCkpIHsgLy8gYmluZGluZyBoYXMgbm8gdHlwZSBwYXJhbXMsIGNvbXBhdGlibGUgZXJhc3VyZSBpZiBwYXR0ZXJuIGRvZXMKLQkJbWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CisJCXRoaXMubWF0Y2guc2V0UnVsZShTZWFyY2hQYXR0ZXJuLlJfRVJBU1VSRV9NQVRDSCk7CiAJfQogCiAJLy8gUmVwb3J0IG1hdGNoCiAJaWYgKGV4cHIgaW5zdGFuY2VvZiBBcnJheVR5cGVSZWZlcmVuY2UpIHsKLQkJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVR5cGVSZWZlcmVuY2UobWF0Y2gsIGV4cHIsIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lKTsKKwkJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVR5cGVSZWZlcmVuY2UodGhpcy5tYXRjaCwgZXhwciwgdGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUpOwogCQlyZXR1cm47CiAJfQogCWlmIChyZWZCaW5kaW5nLmlzTG9jYWxUeXBlKCkpIHsKIAkJLy8gc2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODI2NzMKLQkJTG9jYWxUeXBlQmluZGluZyBsb2NhbCA9IChMb2NhbFR5cGVCaW5kaW5nKSByZWZCaW5kaW5nOwotCQlJSmF2YUVsZW1lbnQgZm9jdXMgPSAoKEludGVybmFsU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5mb2N1czsKKwkJTG9jYWxUeXBlQmluZGluZyBsb2NhbCA9IChMb2NhbFR5cGVCaW5kaW5nKSByZWZCaW5kaW5nLmVyYXN1cmUoKTsKKwkJSUphdmFFbGVtZW50IGZvY3VzID0gdGhpcy5wYXR0ZXJuLmZvY3VzOwogCQlpZiAoZm9jdXMgIT0gbnVsbCAmJiBsb2NhbC5lbmNsb3NpbmdNZXRob2QgIT0gbnVsbCAmJiBmb2N1cy5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKIAkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGZvY3VzLmdldFBhcmVudCgpOwogCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhsb2NhbC5lbmNsb3NpbmdNZXRob2Quc2VsZWN0b3IsIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpKSB7CkBAIC01MjgsNyArNTA2LDExIEBACiAJCQl9CiAJCX0KIAl9Ci0JbG9jYXRvci5yZXBvcnQobWF0Y2gpOworCWlmICh0aGlzLnBhdHRlcm4uc2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCXRoaXMubWF0Y2guc2V0T2Zmc2V0KGV4cHIuc291cmNlU3RhcnQpOworCQl0aGlzLm1hdGNoLnNldExlbmd0aChleHByLnNvdXJjZUVuZC1leHByLnNvdXJjZVN0YXJ0KzEpOworCX0KKwlsb2NhdG9yLnJlcG9ydCh0aGlzLm1hdGNoKTsKIH0KIHByb3RlY3RlZCBpbnQgcmVmZXJlbmNlVHlwZSgpIHsKIAlyZXR1cm4gSUphdmFFbGVtZW50LlRZUEU7CkBAIC01NzAsMTIgKzU1MiwxMiBAQAogCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZykgKChTaW5nbGVOYW1lUmVmZXJlbmNlKSByZWZlcmVuY2UpLmJpbmRpbmc7CiAJCW1heFR5cGUgPSAxOwogCX0KLQkKKwogCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykKIAkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZykgdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOwogCWlmICh0eXBlQmluZGluZyA9PSBudWxsIHx8IHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgQmFzZVR5cGVCaW5kaW5nKSByZXR1cm47CiAJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKLQkJUmVmZXJlbmNlQmluZGluZyBvcmlnaW5hbCA9ICgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nKS5jbG9zZXN0TWF0Y2goKTsKKwkJVHlwZUJpbmRpbmcgb3JpZ2luYWwgPSB0eXBlQmluZGluZy5jbG9zZXN0TWF0Y2goKTsKIAkJaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybjsgLy8gb3JpZ2luYWwgbWF5IG5vdCBiZSBzZXQgKGJ1ZyA3MTI3OSkKIAkJdHlwZUJpbmRpbmcgPSBvcmlnaW5hbDsKIAl9CkBAIC02MDUsOCArNTg3LDggQEAKIAkJCQlpZiAoc2NvcGUgIT0gbnVsbCkgewogCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0OwogCQkJCQlpbnQgb2Zmc2V0ID0gdHlwZURlY2wuc291cmNlU3RhcnQ7Ci0JCQkJCW1hdGNoID0gbmV3IFR5cGVEZWNsYXJhdGlvbk1hdGNoKCgoSmF2YUVsZW1lbnQpIHR5cGUpLnJlc29sdmVkKHR5cGVCaW5kaW5nKSwgU2VhcmNoTWF0Y2guQV9BQ0NVUkFURSwgb2Zmc2V0LCB0eXBlRGVjbC5zb3VyY2VFbmQtb2Zmc2V0KzEsIGxvY2F0b3IuZ2V0UGFydGljaXBhbnQoKSwgcmVzb3VyY2UpOwotCQkJCQlsb2NhdG9yLnJlcG9ydChtYXRjaCk7CisJCQkJCXRoaXMubWF0Y2ggPSBuZXcgVHlwZURlY2xhcmF0aW9uTWF0Y2goKChKYXZhRWxlbWVudCkgdHlwZSkucmVzb2x2ZWQodHlwZUJpbmRpbmcpLCBTZWFyY2hNYXRjaC5BX0FDQ1VSQVRFLCBvZmZzZXQsIHR5cGVEZWNsLnNvdXJjZUVuZC1vZmZzZXQrMSwgbG9jYXRvci5nZXRQYXJ0aWNpcGFudCgpLCByZXNvdXJjZSk7CisJCQkJCWxvY2F0b3IucmVwb3J0KHRoaXMubWF0Y2gpOwogCQkJCX0KIAkJCX0KIAkJCWtub3duVHlwZXMuYWRkKHR5cGUpOwpAQCAtNjM5LDEzICs2MjEsNiBAQAogCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKQogCQl0eXBlQmluZGluZyA9ICgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nKS5jbG9zZXN0TWF0Y2goKTsKIAotCWlmICgoKEludGVybmFsU2VhcmNoUGF0dGVybikgdGhpcy5wYXR0ZXJuKS5mb2N1cyBpbnN0YW5jZW9mIElUeXBlICYmIHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9ICgoSVR5cGUpICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKSB0aGlzLnBhdHRlcm4pLmZvY3VzKS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJLy8gY2hlY2sgdGhhdCB0eXBlIGlzIGxvY2F0ZWQgaW5zaWRlIHRoaXMgaW5zdGFuY2Ugb2YgYSBwYWNrYWdlIGZyYWdtZW50Ci0JCWlmICghUGFja2FnZVJlZmVyZW5jZUxvY2F0b3IuaXNEZWNsYXJpbmdQYWNrYWdlRnJhZ21lbnQocGtnLCAoUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmcpKQotCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Ci0JfQotCiAJcmV0dXJuIHJlc29sdmVMZXZlbEZvclR5cGVPckVuY2xvc2luZ1R5cGVzKHRoaXMucGF0dGVybi5zaW1wbGVOYW1lLCB0aGlzLnBhdHRlcm4ucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOwogfQogcHJvdGVjdGVkIGludCByZXNvbHZlTGV2ZWwoTmFtZVJlZmVyZW5jZSBuYW1lUmVmKSB7CkBAIC03MTIsMTIgKzY4NywzOSBAQAogICogVGhpcyBpcyBqdXN0IGFuIGhlbHBlciB0byBhdm9pZCBjYWxsIG9mIG1ldGhvZCB3aXRoIGFsbCBwYXJhbWV0ZXJzLi4uCiAgKi8KIHByb3RlY3RlZCBpbnQgcmVzb2x2ZUxldmVsRm9yVHlwZShUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCXJldHVybiByZXNvbHZlTGV2ZWxGb3JUeXBlKAotCQkJdGhpcy5wYXR0ZXJuLnNpbXBsZU5hbWUsCi0JCQl0aGlzLnBhdHRlcm4ucXVhbGlmaWNhdGlvbiwKLQkJCXRoaXMucGF0dGVybi5nZXRUeXBlQXJndW1lbnRzKCksCi0JCQkwLAotCQkJdHlwZUJpbmRpbmcpOworCWlmICh0eXBlQmluZGluZyA9PSBudWxsIHx8ICF0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmICh0aGlzLnBhdHRlcm4udHlwZVN1ZmZpeCAhPSBUWVBFX1NVRkZJWCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJfSBlbHNlIHsKKwkJc3dpdGNoICh0aGlzLnBhdHRlcm4udHlwZVN1ZmZpeCkgeworCQkJY2FzZSBDTEFTU19TVUZGSVg6CisJCQkJaWYgKCF0eXBlQmluZGluZy5pc0NsYXNzKCkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBDTEFTU19BTkRfSU5URVJGQUNFX1NVRkZJWDoKKwkJCQlpZiAoISh0eXBlQmluZGluZy5pc0NsYXNzKCkgfHwgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvblR5cGUoKSkpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0xBU1NfQU5EX0VOVU1fU1VGRklYOgorCQkJCWlmICghKHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSB8fCB0eXBlQmluZGluZy5pc0VudW0oKSkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUkZBQ0VfU1VGRklYOgorCQkJCWlmICghdHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSB8fCB0eXBlQmluZGluZy5pc0Fubm90YXRpb25UeXBlKCkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUkZBQ0VfQU5EX0FOTk9UQVRJT05fU1VGRklYOgorCQkJCWlmICghKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkgfHwgdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOVU1fU1VGRklYOgorCQkJCWlmICghdHlwZUJpbmRpbmcuaXNFbnVtKCkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBBTk5PVEFUSU9OX1RZUEVfU1VGRklYOgorCQkJCWlmICghdHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uVHlwZSgpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFlQRV9TVUZGSVggOiAvLyBub3RoaW5nCisJCX0KKwl9CisJcmV0dXJuIHJlc29sdmVMZXZlbEZvclR5cGUoIHRoaXMucGF0dGVybi5zaW1wbGVOYW1lLAorCQkJCQkJdGhpcy5wYXR0ZXJuLnF1YWxpZmljYXRpb24sCisJCQkJCQl0aGlzLnBhdHRlcm4uZ2V0VHlwZUFyZ3VtZW50cygpLAorCQkJCQkJMCwKKwkJCQkJCXR5cGVCaW5kaW5nKTsKIH0KIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcgb3Igb25lIG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMKQEAgLTczNCw3ICs3MzYsNyBAQAogCQl3aGlsZSAodHlwZSAhPSBudWxsKSB7CiAJCQlpbnQgbGV2ZWwgPSByZXNvbHZlTGV2ZWxGb3JUeXBlKHR5cGUpOwogCQkJaWYgKGxldmVsICE9IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybiBsZXZlbDsKLQkKKwogCQkJdHlwZSA9IHR5cGUuZW5jbG9zaW5nVHlwZSgpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IDMzMTJhNWQuLmU4N2FhNjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTIsMzQgKzEyLDM5IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlV0aWw7CiAKLQlwdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBBbmRQYXR0ZXJuIHsKLQkKK3B1YmxpYyBjbGFzcyBUeXBlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIEludGVyc2VjdGluZ1BhdHRlcm4geworCiAJcHJvdGVjdGVkIGNoYXJbXSBxdWFsaWZpY2F0aW9uOwogCXByb3RlY3RlZCBjaGFyW10gc2ltcGxlTmFtZTsKLQkJCisKIAlwcm90ZWN0ZWQgY2hhcltdIGN1cnJlbnRDYXRlZ29yeTsKLQkKKwogCS8qIE9wdGltaXphdGlvbjogY2FzZSB3aGVyZSBzaW1wbGVOYW1lID09IG51bGwgKi8KIAlwdWJsaWMgaW50IHNlZ21lbnRzU2l6ZTsKIAlwcm90ZWN0ZWQgY2hhcltdW10gc2VnbWVudHM7CiAJcHJvdGVjdGVkIGludCBjdXJyZW50U2VnbWVudDsKIAotCXByb3RlY3RlZCBzdGF0aWMgY2hhcltdW10gQ0FURUdPUklFUyA9IHsgUkVGIH07Ci0JCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdW10KKwkJQ0FURUdPUklFUyA9IHsgUkVGLCBBTk5PVEFUSU9OX1JFRiB9LAorCQlDQVRFR09SSUVTX0FOTk9UX1JFRiA9IHsgQU5OT1RBVElPTl9SRUYgfTsKKwlwcml2YXRlIGNoYXJbXVtdIGNhdGVnb3JpZXM7CisJY2hhciB0eXBlU3VmZml4ID0gVFlQRV9TVUZGSVg7CisKIAlwdWJsaWMgVHlwZVJlZmVyZW5jZVBhdHRlcm4oY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSBzaW1wbGVOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7CiAJCXRoaXMobWF0Y2hSdWxlKTsKLQkKLQkJdGhpcy5xdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyBxdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShxdWFsaWZpY2F0aW9uKTsKLQkJdGhpcy5zaW1wbGVOYW1lID0gKGlzQ2FzZVNlbnNpdGl2ZSgpIHx8IGlzQ2FtZWxDYXNlKCkpICA/IHNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNpbXBsZU5hbWUpOwotCQorCisJCXRoaXMucXVhbGlmaWNhdGlvbiA9IHRoaXMuaXNDYXNlU2Vuc2l0aXZlID8gcXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocXVhbGlmaWNhdGlvbik7CisJCXRoaXMuc2ltcGxlTmFtZSA9ICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCB0aGlzLmlzQ2FtZWxDYXNlKSA/IHNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNpbXBsZU5hbWUpOworCiAJCWlmIChzaW1wbGVOYW1lID09IG51bGwpCiAJCQl0aGlzLnNlZ21lbnRzID0gdGhpcy5xdWFsaWZpY2F0aW9uID09IG51bGwgPyBPTkVfU1RBUl9DSEFSIDogQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdGhpcy5xdWFsaWZpY2F0aW9uKTsKIAkJZWxzZQogCQkJdGhpcy5zZWdtZW50cyA9IG51bGw7Ci0JCQorCiAJCWlmICh0aGlzLnNlZ21lbnRzID09IG51bGwpCiAJCQlpZiAodGhpcy5xdWFsaWZpY2F0aW9uID09IG51bGwpCiAJCQkJdGhpcy5zZWdtZW50c1NpemUgPSAgMDsKQEAgLTQ3LDE0ICs1MiwyOCBAQAogCQkJCXRoaXMuc2VnbWVudHNTaXplID0gIENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcuJywgdGhpcy5xdWFsaWZpY2F0aW9uKSArIDE7CiAJCWVsc2UKIAkJCXRoaXMuc2VnbWVudHNTaXplID0gdGhpcy5zZWdtZW50cy5sZW5ndGg7Ci0JCi0JCSgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMpLm11c3RSZXNvbHZlID0gdHJ1ZTsgLy8gYWx3YXlzIHJlc29sdmUgKGluIGNhc2Ugb2YgYSBzaW1wbGUgbmFtZSByZWZlcmVuY2UgYmVpbmcgYSBwb3RlbnRpYWwgbWF0Y2gpCisKKwkJdGhpcy5tdXN0UmVzb2x2ZSA9IHRydWU7IC8vIGFsd2F5cyByZXNvbHZlIChpbiBjYXNlIG9mIGEgc2ltcGxlIG5hbWUgcmVmZXJlbmNlIGJlaW5nIGEgcG90ZW50aWFsIG1hdGNoKQogCX0KIAkvKgotCSAqIEluc3RhbmNpYXRlIGEgdHlwZSByZWZlcmVuY2UgcGF0dGVybiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGdlbmVyaWNzIHNlYXJjaAorCSAqIEluc3RhbnRpYXRlIGEgdHlwZSByZWZlcmVuY2UgcGF0dGVybiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGdlbmVyaWNzIHNlYXJjaAogCSAqLwogCXB1YmxpYyBUeXBlUmVmZXJlbmNlUGF0dGVybihjaGFyW10gcXVhbGlmaWNhdGlvbiwgY2hhcltdIHNpbXBsZU5hbWUsIFN0cmluZyB0eXBlU2lnbmF0dXJlLCBpbnQgbWF0Y2hSdWxlKSB7CisJCXRoaXMocXVhbGlmaWNhdGlvbiwgc2ltcGxlTmFtZSwgdHlwZVNpZ25hdHVyZSwgMCwgVFlQRV9TVUZGSVgsIG1hdGNoUnVsZSk7CisJfQorCS8qCisJICogSW5zdGFudGlhdGUgYSB0eXBlIHJlZmVyZW5jZSBwYXR0ZXJuIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZ2VuZXJpY3Mgc2VhcmNoIGFuZCBzZWFyY2ggZWxlbWVudHMgbmF0dXJlCisJICovCisJcHVibGljIFR5cGVSZWZlcmVuY2VQYXR0ZXJuKGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gc2ltcGxlTmFtZSwgU3RyaW5nIHR5cGVTaWduYXR1cmUsIGNoYXIgdHlwZVN1ZmZpeCwgaW50IG1hdGNoUnVsZSkgeworCQl0aGlzKHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWUsIHR5cGVTaWduYXR1cmUsIDAsIHR5cGVTdWZmaXgsIG1hdGNoUnVsZSk7CisJfQorCisJLyoKKwkgKiBJbnN0YW5jaWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHBhdHRlcm4gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBnZW5lcmljcyBzZWFyY2gsIHNlYXJjaCBlbGVtZW50cyBuYXR1cmUgYW5kIGZpbmUgZ3JhaW4gaW5mb3JtYXRpb24KKwkgKi8KKwlwdWJsaWMgVHlwZVJlZmVyZW5jZVBhdHRlcm4oY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSBzaW1wbGVOYW1lLCBTdHJpbmcgdHlwZVNpZ25hdHVyZSwgaW50IGxpbWl0VG8sIGNoYXIgdHlwZVN1ZmZpeCwgaW50IG1hdGNoUnVsZSkgewogCQl0aGlzKHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWUsbWF0Y2hSdWxlKTsKKwkJdGhpcy50eXBlU3VmZml4ID0gdHlwZVN1ZmZpeDsKIAkJaWYgKHR5cGVTaWduYXR1cmUgIT0gbnVsbCkgewogCQkJLy8gc3RvcmUgdHlwZSBzaWduYXR1cmVzIGFuZCBhcmd1bWVudHMKIAkJCXRoaXMudHlwZVNpZ25hdHVyZXMgPSBVdGlsLnNwbGl0VHlwZUxldmVsc1NpZ25hdHVyZSh0eXBlU2lnbmF0dXJlKTsKQEAgLTYzLDE2ICs4MiwzMSBAQAogCQkJCXRoaXMuc2VnbWVudHNTaXplID0gZ2V0VHlwZUFyZ3VtZW50cygpLmxlbmd0aCArIENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcvJywgdGhpcy50eXBlU2lnbmF0dXJlc1swXSkgLSAxOwogCQkJfQogCQl9CisJICAgIHRoaXMuZmluZUdyYWluID0gbGltaXRUbyAmIDB4RkZGRkZGRjA7CisJICAgIGlmICh0aGlzLmZpbmVHcmFpbiA9PSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTk5PVEFUSU9OX1RZUEVfUkVGRVJFTkNFKSB7CisJICAgIAl0aGlzLmNhdGVnb3JpZXMgPSBDQVRFR09SSUVTX0FOTk9UX1JFRjsKKwkgICAgfQogCX0KKworCS8qCisJICogSW5zdGFudGlhdGUgYSB0eXBlIHJlZmVyZW5jZSBwYXR0ZXJuIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZ2VuZXJpY3Mgc2VhcmNoCisJICovCisJcHVibGljIFR5cGVSZWZlcmVuY2VQYXR0ZXJuKGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gc2ltcGxlTmFtZSwgSVR5cGUgdHlwZSwgaW50IG1hdGNoUnVsZSkgeworCQl0aGlzKHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWUsIHR5cGUsIDAsIG1hdGNoUnVsZSk7CisJfQorCiAJLyoKIAkgKiBJbnN0YW5jaWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHBhdHRlcm4gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBnZW5lcmljcyBzZWFyY2gKIAkgKi8KLQlwdWJsaWMgVHlwZVJlZmVyZW5jZVBhdHRlcm4oY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSBzaW1wbGVOYW1lLCBJVHlwZSB0eXBlLCBpbnQgbWF0Y2hSdWxlKSB7CisJcHVibGljIFR5cGVSZWZlcmVuY2VQYXR0ZXJuKGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gc2ltcGxlTmFtZSwgSVR5cGUgdHlwZSwgaW50IGxpbWl0VG8sIGludCBtYXRjaFJ1bGUpIHsKIAkJdGhpcyhxdWFsaWZpY2F0aW9uLCBzaW1wbGVOYW1lLG1hdGNoUnVsZSk7CiAJCXN0b3JlVHlwZVNpZ25hdHVyZXNBbmRBcmd1bWVudHModHlwZSk7CisJICAgIHRoaXMuZmluZUdyYWluID0gbGltaXRUbyAmIDB4RkZGRkZGRjA7CiAJfQorCiAJVHlwZVJlZmVyZW5jZVBhdHRlcm4oaW50IG1hdGNoUnVsZSkgewogCQlzdXBlcihUWVBFX1JFRl9QQVRURVJOLCBtYXRjaFJ1bGUpOworCQl0aGlzLmNhdGVnb3JpZXMgPSBDQVRFR09SSUVTOwogCX0KIAlwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEtleShjaGFyW10ga2V5KSB7CiAJCXRoaXMuc2ltcGxlTmFtZSA9IGtleTsKQEAgLTgzLDIxICsxMTcsMjEgQEAKIAlwdWJsaWMgY2hhcltdIGdldEluZGV4S2V5KCkgewogCQlpZiAodGhpcy5zaW1wbGVOYW1lICE9IG51bGwpCiAJCQlyZXR1cm4gdGhpcy5zaW1wbGVOYW1lOwotCQotCQkvLyBPcHRpbWl6YXRpb24sIGVnLiB0eXBlIHJlZmVyZW5jZSBpcyAnb3JnLmVjbGlwc2UuamR0LmNvcmUuKicKLQkJaWYgKHRoaXMuY3VycmVudFNlZ21lbnQgPj0gMCkgCisKKwkJLy8gT3B0aW1pemF0aW9uLCBlLmcuIHR5cGUgcmVmZXJlbmNlIGlzICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJworCQlpZiAodGhpcy5jdXJyZW50U2VnbWVudCA+PSAwKQogCQkJcmV0dXJuIHRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF07CiAJCXJldHVybiBudWxsOwogCX0KIAlwdWJsaWMgY2hhcltdW10gZ2V0SW5kZXhDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gQ0FURUdPUklFUzsKKwkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllczsKIAl9CiAJcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dFF1ZXJ5KCkgewogCQlpZiAodGhpcy5zZWdtZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCi0JCS8vIE9wdGltaXphdGlvbiwgZWcuIHR5cGUgcmVmZXJlbmNlIGlzICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJworCisJCS8vIE9wdGltaXphdGlvbiwgZS5nLiB0eXBlIHJlZmVyZW5jZSBpcyAnb3JnLmVjbGlwc2UuamR0LmNvcmUuKicKIAkJLy8gaWYgcGFja2FnZSBoYXMgYXQgbGVhc3QgNCBzZWdtZW50cywgZG9uJ3QgbG9vayBhdCB0aGUgZmlyc3QgMiBzaW5jZSB0aGV5IGFyZSBtb3N0bHkKLQkJLy8gcmVkdW5kYW50IChlZy4gaW4gJ29yZy5lY2xpcHNlLmpkdC5jb3JlLionICdvcmcuZWNsaXBzZScgaXMgdXNlZCBhbGwgdGhlIHRpbWUpCisJCS8vIHJlZHVuZGFudCAoZS5nLiBpbiAnb3JnLmVjbGlwc2UuamR0LmNvcmUuKicgJ29yZy5lY2xpcHNlJyBpcyB1c2VkIGFsbCB0aGUgdGltZSkKIAkJcmV0dXJuIC0tdGhpcy5jdXJyZW50U2VnbWVudCA+PSAodGhpcy5zZWdtZW50cy5sZW5ndGggPj0gNCA/IDIgOiAwKTsKIAl9CiAKQEAgLTExMSwxNCArMTQ1LDE2IEBACiAJCQl0aGlzLmN1cnJlbnRTZWdtZW50ID0gdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxOwogCX0KIAlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHByaW50KFN0cmluZ0J1ZmZlciBvdXRwdXQpIHsKLQkJb3V0cHV0LmFwcGVuZCgiVHlwZVJlZmVyZW5jZVBhdHRlcm46IHF1YWxpZmljYXRpb248Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgCi0JCQlvdXRwdXQuYXBwZW5kKHF1YWxpZmljYXRpb24pOworCQlTdHJpbmcgcGF0dGVybkNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOworCQlvdXRwdXQuYXBwZW5kKHBhdHRlcm5DbGFzc05hbWUuc3Vic3RyaW5nKHBhdHRlcm5DbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSsxKSk7CisJCW91dHB1dC5hcHBlbmQoIjogcXVhbGlmaWNhdGlvbjwiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpCisJCQlvdXRwdXQuYXBwZW5kKHRoaXMucXVhbGlmaWNhdGlvbik7CiAJCWVsc2UKIAkJCW91dHB1dC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAogCQlvdXRwdXQuYXBwZW5kKCI+LCB0eXBlPCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzaW1wbGVOYW1lICE9IG51bGwpIAotCQkJb3V0cHV0LmFwcGVuZChzaW1wbGVOYW1lKTsKKwkJaWYgKHRoaXMuc2ltcGxlTmFtZSAhPSBudWxsKQorCQkJb3V0cHV0LmFwcGVuZCh0aGlzLnNpbXBsZU5hbWUpOwogCQllbHNlCiAJCQlvdXRwdXQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKIAkJb3V0cHV0LmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1ZhcmlhYmxlTG9jYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9WYXJpYWJsZUxvY2F0b3IuamF2YQppbmRleCA5ODczYzM0Li5iYTJkNzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1ZhcmlhYmxlTG9jYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVmFyaWFibGVMb2NhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzAsMjYgKzMwLDMzIEBACiAJCQlpZiAobGhzIGluc3RhbmNlb2YgUmVmZXJlbmNlKQogCQkJCXJldHVybiBtYXRjaFJlZmVyZW5jZSgoUmVmZXJlbmNlKSBsaHMsIG5vZGVTZXQsIHRydWUpOwogCQl9Ci0JfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4ucmVhZEFjY2VzcykgeworCX0gZWxzZSBpZiAodGhpcy5wYXR0ZXJuLnJlYWRBY2Nlc3MgfHwgdGhpcy5wYXR0ZXJuLmZpbmVHcmFpbiAhPSAwKSB7CiAJCWlmIChub2RlIGluc3RhbmNlb2YgQXNzaWdubWVudCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDb21wb3VuZEFzc2lnbm1lbnQpKSB7CiAJCQkvLyB0aGUgbGhzIG9mIGEgc2ltcGxlIGFzc2lnbm1lbnQgbWF5IGJlIGFkZGVkIGluIG1hdGNoKFJlZmVyZW5jZS4uLikgYmVmb3JlIHdlIHJlYWNoIGhlcmUKIAkJCS8vIGZvciBleGFtcGxlLCB0aGUgZmllbGRSZWYgdG8gJ3RoaXMueCcgaW4gdGhlIHN0YXRlbWVudCB0aGlzLnggPSB4OyBpcyBub3QgY29uc2lkZXJlZCBhIHJlYWRBY2Nlc3MKKwkJCWNoYXJbXSBsYXN0VG9rZW4gPSBudWxsOwogCQkJRXhwcmVzc2lvbiBsaHMgPSAoKEFzc2lnbm1lbnQpIG5vZGUpLmxoczsKLQkJCW5vZGVTZXQucmVtb3ZlUG9zc2libGVNYXRjaChsaHMpOwotCQkJbm9kZVNldC5yZW1vdmVUcnVzdGVkTWF0Y2gobGhzKTsKKwkJCWlmIChsaHMgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQkJY2hhcltdW10gdG9rZW5zID0gKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKWxocykudG9rZW5zOworCQkJCWxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdOworCQkJfQorCQkJaWYgKGxhc3RUb2tlbiA9PSBudWxsIHx8IG1hdGNoZXNOYW1lKHRoaXMucGF0dGVybi5uYW1lLCBsYXN0VG9rZW4pKSB7CisJCQkJbm9kZVNldC5yZW1vdmVQb3NzaWJsZU1hdGNoKGxocyk7CisJCQkJbm9kZVNldC5yZW1vdmVUcnVzdGVkTWF0Y2gobGhzKTsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKIH0KIHB1YmxpYyBpbnQgbWF0Y2goUmVmZXJlbmNlIG5vZGUsIE1hdGNoaW5nTm9kZVNldCBub2RlU2V0KSB7IC8vIGludGVyZXN0ZWQgaW4gTmFtZVJlZmVyZW5jZSAmIGl0cyBzdWJ0eXBlcwotCXJldHVybiB0aGlzLnBhdHRlcm4ucmVhZEFjY2VzcworCXJldHVybiAodGhpcy5wYXR0ZXJuLnJlYWRBY2Nlc3MgfHwgdGhpcy5wYXR0ZXJuLmZpbmVHcmFpbiAhPSAwKQogCQk/IG1hdGNoUmVmZXJlbmNlKG5vZGUsIG5vZGVTZXQsIGZhbHNlKQogCQk6IElNUE9TU0lCTEVfTUFUQ0g7CiB9CiBwcm90ZWN0ZWQgaW50IG1hdGNoUmVmZXJlbmNlKFJlZmVyZW5jZSBub2RlLCBNYXRjaGluZ05vZGVTZXQgbm9kZVNldCwgYm9vbGVhbiB3cml0ZU9ubHlBY2Nlc3MpIHsKIAlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKIAkJaWYgKHRoaXMucGF0dGVybi5uYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsICgoSW50ZXJuYWxTZWFyY2hQYXR0ZXJuKXRoaXMucGF0dGVybikubXVzdFJlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIKTsKKwkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIHRoaXMucGF0dGVybi5tdXN0UmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0gpOwogCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CiAJCQlpZiAobWF0Y2hlc05hbWUodGhpcy5wYXR0ZXJuLm5hbWUsICgoU2luZ2xlTmFtZVJlZmVyZW5jZSkgbm9kZSkudG9rZW4pKQogCQkJCXJldHVybiBub2RlU2V0LmFkZE1hdGNoKG5vZGUsIFBPU1NJQkxFX01BVENIKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVmFyaWFibGVQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1ZhcmlhYmxlUGF0dGVybi5qYXZhCmluZGV4IDViYjgwOTIuLjk3NTZkYzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVmFyaWFibGVQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9WYXJpYWJsZVBhdHRlcm4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwzMiArMTEsNTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJsZVBhdHRlcm4gZXh0ZW5kcyBKYXZhU2VhcmNoUGF0dGVybiB7CiAKLXByb3RlY3RlZCBib29sZWFuIGZpbmREZWNsYXJhdGlvbnM7Ci1wcm90ZWN0ZWQgYm9vbGVhbiBmaW5kUmVmZXJlbmNlczsKLXByb3RlY3RlZCBib29sZWFuIHJlYWRBY2Nlc3M7Ci1wcm90ZWN0ZWQgYm9vbGVhbiB3cml0ZUFjY2VzczsKK3Byb3RlY3RlZCBib29sZWFuIGZpbmREZWNsYXJhdGlvbnMgPSBmYWxzZTsKK3Byb3RlY3RlZCBib29sZWFuIGZpbmRSZWZlcmVuY2VzID0gZmFsc2U7Citwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQWNjZXNzID0gZmFsc2U7Citwcm90ZWN0ZWQgYm9vbGVhbiB3cml0ZUFjY2VzcyA9IGZhbHNlOwogCiBwcm90ZWN0ZWQgY2hhcltdIG5hbWU7CiAKLXB1YmxpYyBWYXJpYWJsZVBhdHRlcm4oaW50IHBhdHRlcm5LaW5kLCBib29sZWFuIGZpbmREZWNsYXJhdGlvbnMsIGJvb2xlYW4gcmVhZEFjY2VzcywgYm9vbGVhbiB3cml0ZUFjY2VzcywgY2hhcltdIG5hbWUsIGludCBtYXRjaFJ1bGUpIHsKK3B1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJTkVfR1JBSU5fTUFTSyA9CisJSUphdmFTZWFyY2hDb25zdGFudHMuU1VQRVJfUkVGRVJFTkNFIHwKKwlJSmF2YVNlYXJjaENvbnN0YW50cy5RVUFMSUZJRURfUkVGRVJFTkNFIHwKKwlJSmF2YVNlYXJjaENvbnN0YW50cy5USElTX1JFRkVSRU5DRSB8CisJSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTElDSVRfVEhJU19SRUZFUkVOQ0U7CisKK3B1YmxpYyBWYXJpYWJsZVBhdHRlcm4oaW50IHBhdHRlcm5LaW5kLCBjaGFyW10gbmFtZSwgaW50IGxpbWl0VG8sIGludCBtYXRjaFJ1bGUpIHsKIAlzdXBlcihwYXR0ZXJuS2luZCwgbWF0Y2hSdWxlKTsKIAotCXRoaXMuZmluZERlY2xhcmF0aW9ucyA9IGZpbmREZWNsYXJhdGlvbnM7IC8vIHNldCB0byBmaW5kIGRlY2xhcmF0aW9ucyAmIGFsbCBvY2N1cmVuY2VzCi0JdGhpcy5yZWFkQWNjZXNzID0gcmVhZEFjY2VzczsgLy8gc2V0IHRvIGZpbmQgYW55IHJlZmVyZW5jZSwgcmVhZCBvbmx5IHJlZmVyZW5jZXMgJiBhbGwgb2NjdXJlbmNlcwotCXRoaXMud3JpdGVBY2Nlc3MgPSB3cml0ZUFjY2VzczsgLy8gc2V0IHRvIGZpbmQgYW55IHJlZmVyZW5jZSwgd3JpdGUgb25seSByZWZlcmVuY2VzICYgYWxsIG9jY3VyZW5jZXMKLQl0aGlzLmZpbmRSZWZlcmVuY2VzID0gcmVhZEFjY2VzcyB8fCB3cml0ZUFjY2VzczsKKyAgICB0aGlzLmZpbmVHcmFpbiA9IGxpbWl0VG8gJiBGSU5FX0dSQUlOX01BU0s7CisgICAgaWYgKHRoaXMuZmluZUdyYWluID09IDApIHsKKwkJc3dpdGNoIChsaW1pdFRvICYgMHhGKSB7CisJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQkJdGhpcy5maW5kRGVjbGFyYXRpb25zID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUyA6CisJCQkJdGhpcy5yZWFkQWNjZXNzID0gdHJ1ZTsKKwkJCQl0aGlzLndyaXRlQWNjZXNzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuUkVBRF9BQ0NFU1NFUyA6CisJCQkJdGhpcy5yZWFkQWNjZXNzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV1JJVEVfQUNDRVNTRVMgOgorCQkJCXRoaXMud3JpdGVBY2Nlc3MgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMgOgorCQkJCXRoaXMuZmluZERlY2xhcmF0aW9ucyA9IHRydWU7CisJCQkJdGhpcy5yZWFkQWNjZXNzID0gdHJ1ZTsKKwkJCQl0aGlzLndyaXRlQWNjZXNzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJfQorCQl0aGlzLmZpbmRSZWZlcmVuY2VzID0gdGhpcy5yZWFkQWNjZXNzIHx8IHRoaXMud3JpdGVBY2Nlc3M7CisgICAgfQogCi0JdGhpcy5uYW1lID0gKGlzQ2FzZVNlbnNpdGl2ZSgpIHx8IGlzQ2FtZWxDYXNlKCkpICA/IG5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKG5hbWUpOworCXRoaXMubmFtZSA9ICh0aGlzLmlzQ2FzZVNlbnNpdGl2ZSB8fCB0aGlzLmlzQ2FtZWxDYXNlKSA/IG5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKG5hbWUpOwogfQogLyoKLSAqIFJldHVybnMgd2hldGhlciBhIG1ldGhvZCBkZWNsYXJhdGlvbiBvciBtZXNzYWdlIHNlbmQgd2lsbCBuZWVkIHRvIGJlIHJlc29sdmVkIHRvIAorICogUmV0dXJucyB3aGV0aGVyIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG1lc3NhZ2Ugc2VuZCB3aWxsIG5lZWQgdG8gYmUgcmVzb2x2ZWQgdG8KICAqIGZpbmQgb3V0IGlmIHRoaXMgbWV0aG9kIHBhdHRlcm4gbWF0Y2hlcyBpdC4KICAqLwogcHJvdGVjdGVkIGJvb2xlYW4gbXVzdFJlc29sdmUoKSB7CiAJLy8gd291bGQgbGlrZSB0byBjaGFuZ2UgdGhpcyBzbyB0aGF0IHdlIG9ubHkgZG8gaXQgaWYgZ2VuZXJpYyByZWZlcmVuY2VzIGFyZSBmb3VuZAotCXJldHVybiB0aGlzLmZpbmRSZWZlcmVuY2VzOyAvLyBhbHdheXMgcmVzb2x2ZSAoaW4gY2FzZSBvZiBhIHNpbXBsZSBuYW1lIHJlZmVyZW5jZSBiZWluZyBhIHBvdGVudGlhbCBtYXRjaCkKLX0JCisJcmV0dXJuIHRoaXMuZmluZFJlZmVyZW5jZXMgfHwgdGhpcy5maW5lR3JhaW4gIT0gMDsgLy8gYWx3YXlzIHJlc29sdmUgKGluIGNhc2Ugb2YgYSBzaW1wbGUgbmFtZSByZWZlcmVuY2UgYmVpbmcgYSBwb3RlbnRpYWwgbWF0Y2gpCit9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSUpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0lKb2IuamF2YQppbmRleCA0MTQ4OTVlLi5kYjQ0NGJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSUpvYi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9JSm9iLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNDAsNCArNDAsOSBAQAogCSAqIEV4ZWN1dGUgdGhlIGN1cnJlbnQgam9iLCBhbnN3ZXIgd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bC4KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpOworCisJLyoqCisJICogUmV0dXJucyB0aGlzIGpvYidzIGZhbWlseQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Sm9iRmFtaWx5KCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQppbmRleCA3MGZlZWUzLi5lMTc3NGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9Kb2JNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTEsOSArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbDsKQEAgLTMwLDE0ICsyNywxNCBAQAogCXByb3RlY3RlZCBUaHJlYWQgcHJvY2Vzc2luZ1RocmVhZDsKIAlwcm90ZWN0ZWQgSm9iIHByb2dyZXNzSm9iOwogCi0JLyogY291bnRlciBpbmRpY2F0aW5nIHdoZXRoZXIgam9iIGV4ZWN1dGlvbiBpcyBlbmFibGVkIG9yIG5vdCwgZGlzYWJsZWQgaWYgPD0gMCAKKwkvKiBjb3VudGVyIGluZGljYXRpbmcgd2hldGhlciBqb2IgZXhlY3V0aW9uIGlzIGVuYWJsZWQgb3Igbm90LCBkaXNhYmxlZCBpZiA8PSAwCiAJICAgIGl0IGNhbm5vdCBnbyBiZXlvbmQgMSAqLwogCXByaXZhdGUgaW50IGVuYWJsZUNvdW50ID0gMTsKIAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWRVJCT1NFID0gZmFsc2U7CiAJLyogZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGl2YXRpb24gaGFzIGNvbXBsZXRlZCAqLwogCXB1YmxpYyBib29sZWFuIGFjdGl2YXRlZCA9IGZhbHNlOwotCQorCiAJcHJpdmF0ZSBpbnQgYXdhaXRpbmdDbGllbnRzID0gMDsKIAogCS8qKgpAQCAtNjIsNyArNTksNyBAQAogCQkJcmV0dXJuIHRoaXMuYXdhaXRpbmdKb2JzW3RoaXMuam9iU3RhcnRdOwogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZSgpIHsKIAkJdGhpcy5lbmFibGVDb3VudC0tOwogCQlpZiAoVkVSQk9TRSkKIAkJCVV0aWwudmVyYm9zZSgiRElTQUJMSU5HIGJhY2tncm91bmQgaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJApAQCAtODAsNyArNzcsNyBAQAogCQkJSUpvYiBjdXJyZW50Sm9iOwogCQkJLy8gY2FuY2VsIGN1cnJlbnQgam9iIGlmIGl0IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGZhbWlseQogCQkJc3luY2hyb25pemVkKHRoaXMpewotCQkJCWN1cnJlbnRKb2IgPSB0aGlzLmN1cnJlbnRKb2IoKTsKKwkJCQljdXJyZW50Sm9iID0gY3VycmVudEpvYigpOwogCQkJCWRpc2FibGUoKTsKIAkJCX0KIAkJCWlmIChjdXJyZW50Sm9iICE9IG51bGwgJiYgKGpvYkZhbWlseSA9PSBudWxsIHx8IGN1cnJlbnRKb2IuYmVsb25nc1RvKGpvYkZhbWlseSkpKSB7CkBAIC0xMjcsNyArMTI0LDcgQEAKIAkJdGhpcy5lbmFibGVDb3VudCsrOwogCQlpZiAoVkVSQk9TRSkKIAkJCVV0aWwudmVyYm9zZSgiRU5BQkxJTkcgIGJhY2tncm91bmQgaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm5vdGlmeUFsbCgpOyAvLyB3YWtlIHVwIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBpZiBpdCBpcyB3YWl0aW5nIChjb250ZXh0IG11c3QgYmUgc3luY2hyb25pemVkKQkJCQorCQlub3RpZnlBbGwoKTsgLy8gd2FrZSB1cCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgaWYgaXQgaXMgd2FpdGluZyAoY29udGV4dCBtdXN0IGJlIHN5bmNocm9uaXplZCkKIAl9CiAJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGlzSm9iV2FpdGluZyhJSm9iIHJlcXVlc3QpIHsKIAkJZm9yIChpbnQgaSA9IHRoaXMuam9iRW5kOyBpID4gdGhpcy5qb2JTdGFydDsgaS0tKSAvLyBkb24ndCBjaGVjayBqb2IgYXQgam9iU3RhcnQsIGFzIGl0IG1heSBoYXZlIGFscmVhZHkgc3RhcnRlZApAQCAtMTU3LDcgKzE1NCw3IEBACiAJfQogCS8qKgogCSAqIFRoaXMgQVBJIGlzIGFsbG93aW5nIHRvIHJ1biBvbmUgam9iIGluIGNvbmN1cnJlbmNlIHdpdGggYmFja2dyb3VuZCBwcm9jZXNzaW5nLgotCSAqIEluZGVlZCBzaW5jZSBvdGhlciBqb2JzIGFyZSBwZXJmb3JtZWQgaW4gYmFja2dyb3VuZCwgcmVzb3VyY2Ugc2hhcmluZyBtaWdodCBiZSAKKwkgKiBJbmRlZWQgc2luY2Ugb3RoZXIgam9icyBhcmUgcGVyZm9ybWVkIGluIGJhY2tncm91bmQsIHJlc291cmNlIHNoYXJpbmcgbWlnaHQgYmUKIAkgKiBhbiBpc3N1ZS5UaGVyZWZvcmUsIHRoaXMgZnVuY3Rpb25hbGl0eSBhbGxvd3MgYSBnaXZlbiBqb2IgdG8gYmUgcnVuIHdpdGhvdXQKIAkgKiBjb2xsaWRpbmcgd2l0aCBiYWNrZ3JvdW5kIG9uZXMuCiAJICogTm90ZTogbXVsdGlwbGUgdGhyZWFkIG1pZ2h0IGF0dGVtcHQgdG8gcGVyZm9ybSBjb25jdXJyZW50IGpvYnMgYXQgdGhlIHNhbWUgdGltZSwKQEAgLTE4Myw3ICsxODAsNyBAQAogCQkJCXByb2dyZXNzLmJlZ2luVGFzaygiIiwgY29uY3VycmVudEpvYldvcmspOyAvLyROT04tTkxTLTEkCiAJCQlpZiAoYXdhaXRpbmdKb2JzQ291bnQoKSA+IDApIHsKIAkJCQlzd2l0Y2ggKHdhaXRpbmdQb2xpY3kpIHsKLQkKKwogCQkJCQljYXNlIElKb2IuRm9yY2VJbW1lZGlhdGUgOgogCQkJCQkJaWYgKFZFUkJPU0UpCiAJCQkJCQkJVXRpbC52ZXJib3NlKCItPiBOT1QgUkVBRFkgLSBmb3JjaW5nIGltbWVkaWF0ZSAtICIgKyBzZWFyY2hKb2IpOy8vJE5PTi1OTFMtMSQKQEAgLTE5NiwxNCArMTkzLDE0IEBACiAJCQkJCQlpZiAoVkVSQk9TRSkKIAkJCQkJCQlVdGlsLnZlcmJvc2UoIkZJTklTSEVEICBjb25jdXJyZW50IGpvYiAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQorCiAJCQkJCWNhc2UgSUpvYi5DYW5jZWxJZk5vdFJlYWR5IDoKIAkJCQkJCWlmIChWRVJCT1NFKQogCQkJCQkJCVV0aWwudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gY2FuY2VsbGluZyAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAoVkVSQk9TRSkKIAkJCQkJCQlVdGlsLnZlcmJvc2UoIkNBTkNFTEVEIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQorCiAJCQkJCWNhc2UgSUpvYi5XYWl0VW50aWxSZWFkeSA6CiAJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzID0gbnVsbDsKIAkJCQkJCXRyeSB7CkBAIC0yMjksNyArMjI2LDggQEAKIAkJCQkJCQkJZmxvYXQgbGFzdFdvcmtlZCA9IDA7CiAJCQkJCQkJCWZsb2F0IHRvdGFsV29ya2VkID0gMDsKIAkJCQkJCQkJd2hpbGUgKChhd2FpdGluZ0pvYnNDb3VudCA9IGF3YWl0aW5nSm9ic0NvdW50KCkpID4gMCkgewotCQkJCQkJCQkJaWYgKHN1YlByb2dyZXNzICE9IG51bGwgJiYgc3ViUHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKQorCQkJCQkJCQkJaWYgKChzdWJQcm9ncmVzcyAhPSBudWxsICYmIHN1YlByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCQkJCQkJfHwgdGhpcy5wcm9jZXNzaW5nVGhyZWFkID09IG51bGwpCiAJCQkJCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJCQkJCQkJCQlJSm9iIGN1cnJlbnRKb2IgPSBjdXJyZW50Sm9iKCk7CiAJCQkJCQkJCQkvLyBjdXJyZW50Sm9iIGNhbiBiZSBudWxsIHdoZW4gam9icyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHF1ZXVlIGJ1dCBqb2IgbWFuYWdlciBpcyBub3QgZW5hYmxlZApAQCAtMjM3LDggKzIzNSw4IEBACiAJCQkJCQkJCQkJaWYgKFZFUkJPU0UpCiAJCQkJCQkJCQkJCVV0aWwudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gd2FpdGluZyB1bnRpbCByZWFkeSAtICIgKyBzZWFyY2hKb2IpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJCQlpZiAoc3ViUHJvZ3Jlc3MgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlzdWJQcm9ncmVzcy5zdWJUYXNrKAotCQkJCQkJCQkJCQkJTWVzc2FnZXMuYmluZChNZXNzYWdlcy5tYW5hZ2VyX2ZpbGVzVG9JbmRleCwgSW50ZWdlci50b1N0cmluZyhhd2FpdGluZ0pvYnNDb3VudCkpKTsKKwkJCQkJCQkJCQkJU3RyaW5nIGluZGV4aW5nID0gTWVzc2FnZXMuYmluZChNZXNzYWdlcy5qb2JtYW5hZ2VyX2ZpbGVzVG9JbmRleCwgY3VycmVudEpvYi5nZXRKb2JGYW1pbHkoKSwgSW50ZWdlci50b1N0cmluZyhhd2FpdGluZ0pvYnNDb3VudCkpOworCQkJCQkJCQkJCQlzdWJQcm9ncmVzcy5zdWJUYXNrKGluZGV4aW5nKTsKIAkJCQkJCQkJCQkJLy8gcmF0aW8gb2YgdGhlIGFtb3VudCBvZiB3b3JrIHJlbGF0aXZlIHRvIHRoZSB0b3RhbCB3b3JrCiAJCQkJCQkJCQkJCWZsb2F0IHJhdGlvID0gYXdhaXRpbmdKb2JzQ291bnQgPCB0b3RhbFdvcmsgPyAxIDogKChmbG9hdCkgdG90YWxXb3JrKSAvIGF3YWl0aW5nSm9ic0NvdW50OwogCQkJCQkJCQkJCQlpZiAobGFzdEpvYnNDb3VudCA+IGF3YWl0aW5nSm9ic0NvdW50KSB7CkBAIC0yODYsNyArMjg0LDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAJcHVibGljIGFic3RyYWN0IFN0cmluZyBwcm9jZXNzTmFtZSgpOwotCQorCiAJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlcXVlc3QoSUpvYiBqb2IpIHsKIAogCQlqb2IuZW5zdXJlUmVhZHlUb1J1bigpOwpAQCAtMjk0LDggKzI5MiwxNSBAQAogCQkvLyBhcHBlbmQgdGhlIGpvYiB0byB0aGUgbGlzdCBvZiBvbmVzIHRvIHByb2Nlc3MgbGF0ZXIgb24KIAkJaW50IHNpemUgPSB0aGlzLmF3YWl0aW5nSm9icy5sZW5ndGg7CiAJCWlmICgrK3RoaXMuam9iRW5kID09IHNpemUpIHsgLy8gd2hlbiBncm93aW5nLCByZWxvY2F0ZSBqb2JzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDAKLQkJCXRoaXMuam9iRW5kIC09IHRoaXMuam9iU3RhcnQ7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXdhaXRpbmdKb2JzLCB0aGlzLmpvYlN0YXJ0LCB0aGlzLmF3YWl0aW5nSm9icyA9IG5ldyBJSm9iW3NpemUgKiAyXSwgMCwgdGhpcy5qb2JFbmQpOworCQkJdGhpcy5qb2JFbmQgLT0gdGhpcy5qb2JTdGFydDsgLy8gam9iRW5kIG5vdyBlcXVhbHMgdGhlIG51bWJlciBvZiBqb2JzCisJCQlpZiAodGhpcy5qb2JFbmQgPCA1MCAmJiB0aGlzLmpvYkVuZCA8IHRoaXMuam9iU3RhcnQpIHsKKwkJCQkvLyBwbGVudHkgb2YgZnJlZSBzcGFjZSBpbiB0aGUgcXVldWUgc28gc2hpZnQgdGhlIHJlbWFpbmluZyBqb2JzIHRvIHRoZSBiZWdpbm5pbmcgaW5zdGVhZCBvZiBncm93aW5nIGl0CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmF3YWl0aW5nSm9icywgdGhpcy5qb2JTdGFydCwgdGhpcy5hd2FpdGluZ0pvYnMsIDAsIHRoaXMuam9iRW5kKTsKKwkJCQlmb3IgKGludCBpID0gdGhpcy5qb2JTdGFydDsgaSA8IHNpemU7IGkrKykKKwkJCQkJdGhpcy5hd2FpdGluZ0pvYnNbaV0gPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYXdhaXRpbmdKb2JzLCB0aGlzLmpvYlN0YXJ0LCB0aGlzLmF3YWl0aW5nSm9icyA9IG5ldyBJSm9iW3NpemUgKiAyXSwgMCwgdGhpcy5qb2JFbmQpOworCQkJfQogCQkJdGhpcy5qb2JTdGFydCA9IDA7CiAJCX0KIAkJdGhpcy5hd2FpdGluZ0pvYnNbdGhpcy5qb2JFbmRdID0gam9iOwpAQCAtMzE2LDEwICszMjEsMTMgQEAKIAkJCWRpc2NhcmRKb2JzKG51bGwpOyAvLyBkaXNjYXJkIGFsbCBqb2JzCiAJCX0gZWxzZSB7CiAJCQkvKiBpbml0aWF0ZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgKi8KLQkJCXRoaXMucHJvY2Vzc2luZ1RocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgdGhpcy5wcm9jZXNzTmFtZSgpKTsKKwkJCXRoaXMucHJvY2Vzc2luZ1RocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgcHJvY2Vzc05hbWUoKSk7CiAJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwogCQkJLy8gbGVzcyBwcmlvcml0YXJ5IGJ5IGRlZmF1bHQsIHByaW9yaXR5IGlzIHJhaXNlZCBpZiBjbGllbnRzIGFyZSBhY3RpdmVseSB3YWl0aW5nIG9uIGl0Ci0JCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFktMSk7IAorCQkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZLTEpOworCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjM0MworCQkJLy8gc2V0IHRoZSBjb250ZXh0IGxvYWRlciB0byBhdm9pZCBsZWFraW5nIHRoZSBjdXJyZW50IGNvbnRleHQgbG9hZGVyCisJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKIAkJCXRoaXMucHJvY2Vzc2luZ1RocmVhZC5zdGFydCgpOwogCQl9CiAJfQpAQCAtMzM2LDE0ICszNDQsMTkgQEAKIAkJCQkJc3VwZXIobmFtZSk7CiAJCQkJfQogCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJaW50IGF3YWl0aW5nSm9ic0NvdW50OwotCQkJCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIChhd2FpdGluZ0pvYnNDb3VudCA9IGF3YWl0aW5nSm9ic0NvdW50KCkpID4gMCkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMubWFuYWdlcl9maWxlc1RvSW5kZXgsIEludGVnZXIudG9TdHJpbmcoYXdhaXRpbmdKb2JzQ291bnQpKSk7IAorCQkJCQlJSm9iIGpvYiA9IGN1cnJlbnRKb2IoKTsKKwkJCQkJd2hpbGUgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiBqb2IgIT0gbnVsbCkgeworCQkJCQkJIFN0cmluZyB0YXNrTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoTWVzc2FnZXMuam9ibWFuYWdlcl9pbmRleGluZykKKwkJCQkJCQkuYXBwZW5kKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuam9ibWFuYWdlcl9maWxlc1RvSW5kZXgsIGpvYi5nZXRKb2JGYW1pbHkoKSwgSW50ZWdlci50b1N0cmluZyhhd2FpdGluZ0pvYnNDb3VudCgpKSkpCisJCQkJCQkJLnRvU3RyaW5nKCk7CisJCQkJCQltb25pdG9yLnN1YlRhc2sodGFza05hbWUpOworCQkJCQkJc2V0TmFtZSh0YXNrTmFtZSk7CiAJCQkJCQl0cnkgewogCQkJCQkJCVRocmVhZC5zbGVlcCg1MDApOwogCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogCQkJCQkJCS8vIGlnbm9yZQogCQkJCQkJfQorCQkJCQkJam9iID0gY3VycmVudEpvYigpOwogCQkJCQl9CiAJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCQkJCX0KQEAgLTM4NCw3ICszOTcsNyBAQAogCQkJCQl0cnkgewogCQkJCQkJdGhpcy5leGVjdXRpbmcgPSB0cnVlOwogCQkJCQkJaWYgKHRoaXMucHJvZ3Jlc3NKb2IgPT0gbnVsbCkgewotCQkJCQkJCXRoaXMucHJvZ3Jlc3NKb2IgPSBuZXcgUHJvZ3Jlc3NKb2IoTWVzc2FnZXMubWFuYWdlcl9pbmRleGluZ0luUHJvZ3Jlc3MpOyAKKwkJCQkJCQl0aGlzLnByb2dyZXNzSm9iID0gbmV3IFByb2dyZXNzSm9iKE1lc3NhZ2VzLmJpbmQoTWVzc2FnZXMuam9ibWFuYWdlcl9pbmRleGluZywgIiIsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJCXRoaXMucHJvZ3Jlc3NKb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwogCQkJCQkJCXRoaXMucHJvZ3Jlc3NKb2Iuc2V0U3lzdGVtKHRydWUpOwogCQkJCQkJCXRoaXMucHJvZ3Jlc3NKb2Iuc2NoZWR1bGUoKTsKQEAgLTQwNiwyMiArNDE5LDIyIEBACiAJCQlpZiAodGhpcy5wcm9jZXNzaW5nVGhyZWFkICE9IG51bGwpIHsgLy8gaWYgbm90IHNodXR0aW5nIGRvd24KIAkJCQkvLyBsb2cgZXhjZXB0aW9uCiAJCQkJVXRpbC5sb2coZSwgIkJhY2tncm91bmQgSW5kZXhlciBDcmFzaCBSZWNvdmVyeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCisKIAkJCQkvLyBrZWVwIGpvYiBtYW5hZ2VyIGFsaXZlCi0JCQkJdGhpcy5kaXNjYXJkSm9icyhudWxsKTsKKwkJCQlkaXNjYXJkSm9icyhudWxsKTsKIAkJCQl0aGlzLnByb2Nlc3NpbmdUaHJlYWQgPSBudWxsOwotCQkJCXRoaXMucmVzZXQoKTsgLy8gdGhpcyB3aWxsIGZvcmsgYSBuZXcgdGhyZWFkIHdpdGggbm8gd2FpdGluZyBqb2JzLCBzb21lIGluZGV4ZXMgd2lsbCBiZSBpbmNvbnNpc3RlbnQKKwkJCQlyZXNldCgpOyAvLyB0aGlzIHdpbGwgZm9yayBhIG5ldyB0aHJlYWQgd2l0aCBubyB3YWl0aW5nIGpvYnMsIHNvbWUgaW5kZXhlcyB3aWxsIGJlIGluY29uc2lzdGVudAogCQkJfQogCQkJdGhyb3cgZTsKIAkJfSBjYXRjaCAoRXJyb3IgZSkgewogCQkJaWYgKHRoaXMucHJvY2Vzc2luZ1RocmVhZCAhPSBudWxsICYmICEoZSBpbnN0YW5jZW9mIFRocmVhZERlYXRoKSkgewogCQkJCS8vIGxvZyBleGNlcHRpb24KIAkJCQlVdGlsLmxvZyhlLCAiQmFja2dyb3VuZCBJbmRleGVyIENyYXNoIFJlY292ZXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKKwogCQkJCS8vIGtlZXAgam9iIG1hbmFnZXIgYWxpdmUKLQkJCQl0aGlzLmRpc2NhcmRKb2JzKG51bGwpOworCQkJCWRpc2NhcmRKb2JzKG51bGwpOwogCQkJCXRoaXMucHJvY2Vzc2luZ1RocmVhZCA9IG51bGw7Ci0JCQkJdGhpcy5yZXNldCgpOyAvLyB0aGlzIHdpbGwgZm9yayBhIG5ldyB0aHJlYWQgd2l0aCBubyB3YWl0aW5nIGpvYnMsIHNvbWUgaW5kZXhlcyB3aWxsIGJlIGluY29uc2lzdGVudAorCQkJCXJlc2V0KCk7IC8vIHRoaXMgd2lsbCBmb3JrIGEgbmV3IHRocmVhZCB3aXRoIG5vIHdhaXRpbmcgam9icywgc29tZSBpbmRleGVzIHdpbGwgYmUgaW5jb25zaXN0ZW50CiAJCQl9CiAJCQl0aHJvdyBlOwogCQl9CkBAIC00NDEsNyArNDU0LDcgQEAKIAkJCWlmICh0aHJlYWQgIT0gbnVsbCkgeyAvLyBzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NTgKIAkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKIAkJCQkJdGhpcy5wcm9jZXNzaW5nVGhyZWFkID0gbnVsbDsgLy8gbWFyayB0aGUgam9iIG1hbmFnZXIgYXMgc2h1dHRpbmcgZG93biBzbyB0aGF0IHRoZSB0aHJlYWQgd2lsbCBzdG9wIGJ5IGl0c2VsZgotCQkJCQl0aGlzLm5vdGlmeUFsbCgpOyAvLyBlbnN1cmUgaXRzIGF3YWtlIHNvIGl0IGNhbiBiZSBzaHV0ZG93bgorCQkJCQlub3RpZnlBbGwoKTsgLy8gZW5zdXJlIGl0cyBhd2FrZSBzbyBpdCBjYW4gYmUgc2h1dGRvd24KIAkJCQl9CiAJCQkJLy8gaW4gY2FzZSBwcm9jZXNzaW5nIHRocmVhZCBpcyBoYW5kbGluZyBhIGpvYgogCQkJCXRocmVhZC5qb2luKCk7CkBAIC00NjQsNSArNDc3LDUgQEAKIAkJCWJ1ZmZlci5hcHBlbmQoaSkuYXBwZW5kKCIgLSBqb2JbIitpKyJdOiAiKS5hcHBlbmQodGhpcy5hd2FpdGluZ0pvYnNbdGhpcy5qb2JTdGFydCtpXSkuYXBwZW5kKCdcbicpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQkKKwl9CiB9Cg==